From 07e17863e7bbf36a0f1c4f60e236e13a66d8fe1b Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 17 May 2020 21:00:02 +0300 Subject: [PATCH 0001/4023] sb-bsd-sockets: unify win32 and unix constants. A lot of stuff is shared. --- ...constants.lisp => constants-addrinfo.lisp} | 3 +- ...ants.lisp => constants-gethostbyname.lisp} | 0 contrib/sb-bsd-sockets/constants-unix.lisp | 44 ++++ contrib/sb-bsd-sockets/constants-win32.lisp | 60 +++++ contrib/sb-bsd-sockets/constants.lisp | 70 +----- contrib/sb-bsd-sockets/sb-bsd-sockets.asd | 67 ++--- contrib/sb-bsd-sockets/sockopt.lisp | 3 +- contrib/sb-bsd-sockets/win32-constants.lisp | 232 ------------------ contrib/sb-bsd-sockets/win32-lib.lisp | 5 +- 9 files changed, 145 insertions(+), 339 deletions(-) rename contrib/sb-bsd-sockets/{addrinfo-constants.lisp => constants-addrinfo.lisp} (98%) rename contrib/sb-bsd-sockets/{gethostbyname-constants.lisp => constants-gethostbyname.lisp} (100%) create mode 100644 contrib/sb-bsd-sockets/constants-unix.lisp create mode 100644 contrib/sb-bsd-sockets/constants-win32.lisp delete mode 100644 contrib/sb-bsd-sockets/win32-constants.lisp diff --git a/contrib/sb-bsd-sockets/addrinfo-constants.lisp b/contrib/sb-bsd-sockets/constants-addrinfo.lisp similarity index 98% rename from contrib/sb-bsd-sockets/addrinfo-constants.lisp rename to contrib/sb-bsd-sockets/constants-addrinfo.lisp index a412f443bd..a78175387d 100644 --- a/contrib/sb-bsd-sockets/addrinfo-constants.lisp +++ b/contrib/sb-bsd-sockets/constants-addrinfo.lisp @@ -58,11 +58,12 @@ (:integer EAI-BADFLAGS "EAI_BADFLAGS") (:integer EAI-NONAME "EAI_NONAME") (:integer EAI-SERVICE "EAI_SERVICE") - #-(or freebsd dragonfly) + #-(or freebsd dragonfly win32) (:integer EAI-ADDRFAMILY "EAI_ADDRFAMILY") (:integer EAI-MEMORY "EAI_MEMORY") (:integer EAI-FAIL "EAI_FAIL") (:integer EAI-AGAIN "EAI_AGAIN") + #-win32 (:integer EAI-SYSTEM "EAI_SYSTEM") (:integer NI-NAMEREQD "NI_NAMEREQD")) diff --git a/contrib/sb-bsd-sockets/gethostbyname-constants.lisp b/contrib/sb-bsd-sockets/constants-gethostbyname.lisp similarity index 100% rename from contrib/sb-bsd-sockets/gethostbyname-constants.lisp rename to contrib/sb-bsd-sockets/constants-gethostbyname.lisp diff --git a/contrib/sb-bsd-sockets/constants-unix.lisp b/contrib/sb-bsd-sockets/constants-unix.lisp new file mode 100644 index 0000000000..ee5de10dbe --- /dev/null +++ b/contrib/sb-bsd-sockets/constants-unix.lisp @@ -0,0 +1,44 @@ +("sys/socket.h" "errno.h" "fcntl.h") + +((:integer af-local + #+(or sunos solaris hpux) "AF_UNIX" + #-(or sunos solaris hpux) "AF_LOCAL" + "Local to host (pipes and file-domain).") + + (:integer ifnamsiz "IFNAMSIZ") + +;; socket shutdown flags + (:integer SHUT_RD "SHUT_RD") + (:integer SHUT_WR "SHUT_WR") + (:integer SHUT_RDWR "SHUT_RDWR") + + (:integer O-NONBLOCK "O_NONBLOCK") + (:integer f-getfl "F_GETFL") + (:integer f-setfl "F_SETFL") + + (:integer msg-trunc "MSG_TRUNC") + (:integer msg-waitall "MSG_WAITALL") + (:integer msg-eor "MSG_EOR") + (:integer msg-dontwait "MSG_DONTWAIT") + #+linux (:integer msg-nosignal "MSG_NOSIGNAL") + #+linux (:integer msg-confirm "MSG_CONFIRM") + #+linux (:integer msg-more "MSG_MORE") + + (:integer EADDRINUSE "EADDRINUSE") + (:integer EAGAIN "EAGAIN") + (:integer EBADF "EBADF") + (:integer ECONNREFUSED "ECONNREFUSED") + (:integer ETIMEDOUT "ETIMEDOUT") + (:integer EINTR "EINTR") + (:integer EINVAL "EINVAL") + (:integer ENOBUFS "ENOBUFS") + (:integer ENOMEM "ENOMEM") + (:integer EOPNOTSUPP "EOPNOTSUPP") + (:integer EPERM "EPERM") + (:integer EPROTONOSUPPORT "EPROTONOSUPPORT") + (:integer ERANGE "ERANGE") + (:integer ESOCKTNOSUPPORT "ESOCKTNOSUPPORT") + (:integer ENETUNREACH "ENETUNREACH") + (:integer ENOTCONN "ENOTCONN") + (:integer EAFNOSUPPORT "EAFNOSUPPORT") + (:integer EINPROGRESS "EINPROGRESS")) diff --git a/contrib/sb-bsd-sockets/constants-win32.lisp b/contrib/sb-bsd-sockets/constants-win32.lisp new file mode 100644 index 0000000000..6a2c925d6d --- /dev/null +++ b/contrib/sb-bsd-sockets/constants-win32.lisp @@ -0,0 +1,60 @@ +;;; -*- Lisp -*- + +;;; This isn't really lisp, but it's definitely a source file. we +;;; name it thus to avoid having to mess with the clc lpn translations + +;;; first, the headers necessary to find definitions of everything +("winsock2.h" "errno.h") + +;;; then the stuff we're looking for +((:function ioctl ("ioctlsocket" int + (socket int) + (cmd int) + (argp (unsigned 32) :in-out))) + + (:function wsa-socket ("WSASocketA" int + (af int) + (type int) + (protocol int) + (lpProtocolInfo (* t)) + (g int) + (flags int))) + + (:structure wsa-data ("struct WSAData" + (integer version "u_int16_t" "wVersion") + (integer high-version "u_int16_t" "wHighVersion") + (c-string description "char" "szDescription") + (c-string system-status "char" "szSystemStatus") + (integer max-sockets "unsigned short" "iMaxSockets") + (integer max-udp-dg "unsigned short" "iMaxUdpDg") + (c-string-pointer vendor-info "char *" "lpVendorInfo"))) + + (:function wsa-startup ("WSAStartup" int + (wVersionRequested (unsigned 16)) + (lpWSAData wsa-data :out))) + + (:function wsa-get-last-error ("WSAGetLastError" int)) + + (:integer FIONBIO "FIONBIO") + + (:integer SHUT_RD "SD_RECEIVE") + (:integer SHUT_WR "SD_SEND") + (:integer SHUT_RDWR "SD_BOTH") + + (:integer EADDRINUSE "WSAEADDRINUSE") + (:integer EAGAIN "WSAEWOULDBLOCK") + (:integer EBADF "WSAEBADF") + (:integer ECONNREFUSED "WSAECONNREFUSED") + (:integer ETIMEDOUT "WSAETIMEDOUT") + (:integer EINTR "WSAEINTR") + (:integer EINVAL "WSAEINVAL") + (:integer ENOBUFS "WSAENOBUFS") + (:integer ENOMEM "WSAENOBUFS") + (:integer EOPNOTSUPP "WSAEOPNOTSUPP") + (:integer EPERM "WSAENETDOWN") + (:integer EPROTONOSUPPORT "WSAEPROTONOSUPPORT") + (:integer ESOCKTNOSUPPORT "WSAESOCKTNOSUPPORT") + (:integer ENETUNREACH "WSAENETUNREACH") + (:integer ENOTCONN "WSAENOTCONN") + (:integer EAFNOSUPPORT "WSAEAFNOSUPPORT") + (:integer EINPROGRESS "WSAEINPROGRESS")) diff --git a/contrib/sb-bsd-sockets/constants.lisp b/contrib/sb-bsd-sockets/constants.lisp index 8fef0fe837..1516e80603 100644 --- a/contrib/sb-bsd-sockets/constants.lisp +++ b/contrib/sb-bsd-sockets/constants.lisp @@ -4,18 +4,15 @@ ;;; name it thus to avoid having to mess with the clc lpn translations ;;; first, the headers necessary to find definitions of everything -("sys/types.h" "sys/socket.h" "sys/stat.h" "unistd.h" "sys/un.h" +#-win32 ("sys/types.h" "sys/socket.h" "sys/stat.h" "unistd.h" "sys/un.h" "netinet/in.h" "netinet/in_systm.h" "netinet/ip.h" "net/if.h" "arpa/inet.h" ; inet_{ntop,pton} - "netdb.h" "errno.h" "netinet/tcp.h" "fcntl.h" ) + "netdb.h" "errno.h" "netinet/tcp.h" "fcntl.h") +#+win32 ("winsock2.h" "errno.h" "ws2tcpip.h") ;;; then the stuff we're looking for ((:integer af-inet "AF_INET" "IP Protocol family") (:integer af-unspec "AF_UNSPEC" "Unspecified") - (:integer af-local - #+(or sunos solaris hpux) "AF_UNIX" - #-(or sunos solaris hpux) "AF_LOCAL" - "Local to host (pipes and file-domain).") (:integer af-inet6 "AF_INET6" "IP version 6") #+linux (:integer af-route "AF_NETLINK" "Alias to emulate 4.4BSD ") @@ -66,48 +63,10 @@ (:integer tcp-nodelay "TCP_NODELAY") #+linux (:integer so-bindtodevice "SO_BINDTODEVICE") - (:integer ifnamsiz "IFNAMSIZ") - -;; socket shutdown flags -(:integer SHUT_RD "SHUT_RD") -(:integer SHUT_WR "SHUT_WR") -(:integer SHUT_RDWR "SHUT_RDWR") - -;; errors - (:integer EADDRINUSE "EADDRINUSE") - (:integer EAGAIN "EAGAIN") - (:integer EBADF "EBADF") - (:integer ECONNREFUSED "ECONNREFUSED") - (:integer ETIMEDOUT "ETIMEDOUT") - (:integer EINTR "EINTR") - (:integer EINVAL "EINVAL") - (:integer ENOBUFS "ENOBUFS") - (:integer ENOMEM "ENOMEM") - (:integer EOPNOTSUPP "EOPNOTSUPP") - (:integer EPERM "EPERM") - (:integer EPROTONOSUPPORT "EPROTONOSUPPORT") - (:integer ERANGE "ERANGE") - (:integer ESOCKTNOSUPPORT "ESOCKTNOSUPPORT") - (:integer ENETUNREACH "ENETUNREACH") - (:integer ENOTCONN "ENOTCONN") - (:integer EAFNOSUPPORT "EAFNOSUPPORT") - (:integer EINPROGRESS "EINPROGRESS") - - (:integer O-NONBLOCK "O_NONBLOCK") - (:integer f-getfl "F_GETFL") - (:integer f-setfl "F_SETFL") (:integer msg-oob "MSG_OOB") (:integer msg-peek "MSG_PEEK") - (:integer msg-trunc "MSG_TRUNC") - (:integer msg-waitall "MSG_WAITALL") - (:integer msg-eor "MSG_EOR") (:integer msg-dontroute "MSG_DONTROUTE") - (:integer msg-dontwait "MSG_DONTWAIT") - #+linux (:integer msg-nosignal "MSG_NOSIGNAL") - #+linux (:integer msg-confirm "MSG_CONFIRM") - #+linux (:integer msg-more "MSG_MORE") - ;; for socket-receive (:type socklen-t "socklen_t") @@ -177,9 +136,11 @@ ((array (unsigned 8)) flowinfo "u_int32_t" "sin6_flowinfo") ((array (unsigned 8)) addr "struct in_addr6" "sin6_addr") ((array (unsigned 8)) scope-id "u_int32_t" "sin6_scope_id"))) + #-win32 (:structure sockaddr-un ("struct sockaddr_un" (integer family "sa_family_t" "sun_family") (c-string path "char" "sun_path"))) + #-win32 (:structure sockaddr-un-abstract ("struct sockaddr_un" (integer family "sa_family_t" "sun_family") ((array (unsigned 8)) path "char" "sun_path"))) @@ -204,14 +165,7 @@ (integer type "int" "h_addrtype") (integer length "int" "h_length") ((* (* (unsigned 8))) addresses "char **" "h_addr_list"))) - (:structure msghdr ("struct msghdr" - (c-string-pointer name "void *" "msg_name") - (integer namelen "socklen_t" "msg_namelen") - ((* t) iov "struct iovec" "msg_iov") - (integer iovlen "size_t" "msg_iovlen") - ((* t) control "void *" "msg_control") - (integer controllen "socklen_t" "msg_controllen") - (integer flags "int" "msg_flags"))) + (:function socket (#-netbsd "socket" #+netbsd "_socket" int (domain int) (type int) @@ -239,7 +193,7 @@ (socket int) (his-addr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? (addrlen socklen-t))) - (:function close ("close" int + (:function close (#-win32 "close" #+win32 "closesocket" int (fd int))) (:function shutdown ("shutdown" int (fd int) (how int))) @@ -250,10 +204,7 @@ (flags int) (sockaddr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? (socklen (* socklen-t)))) - (:function recvmsg ("recvmsg" ssize-t - (socket int) - (msg (* msghdr)) - (flags int))) + (:function send ("send" ssize-t (socket int) (buf (* t)) @@ -266,10 +217,7 @@ (flags int) (sockaddr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? (socklen socklen-t))) - (:function sendmsg ("sendmsg" int - (socket int) - (msg (* msghdr)) - (flags int))) + ;; Socket options diff --git a/contrib/sb-bsd-sockets/sb-bsd-sockets.asd b/contrib/sb-bsd-sockets/sb-bsd-sockets.asd index 1d3e60772c..8cf8a7c0c2 100644 --- a/contrib/sb-bsd-sockets/sb-bsd-sockets.asd +++ b/contrib/sb-bsd-sockets/sb-bsd-sockets.asd @@ -14,50 +14,37 @@ :defsystem-depends-on ("sb-grovel") #+sb-building-contrib :pathname #+sb-building-contrib #p"SYS:CONTRIB;SB-BSD-SOCKETS;" + :serial t :components ((:file "defpackage") + (:file "win32-lib" :if-feature :win32) + (:sb-grovel-constants-file "constants" + :package :sockint) + (:sb-grovel-constants-file "constants-unix" + :if-feature (:not :win32) + :package :sockint) + (:sb-grovel-constants-file "constants-win32" + :if-feature :win32 + :package :sockint) + (:sb-grovel-constants-file "constants-addrinfo" + :if-feature :sb-bsd-sockets-addrinfo + :package :sockint) + (:sb-grovel-constants-file "constants-gethostbyname" + :if-feature (:not :sb-bsd-sockets-addrinfo) + :package :sockint) + (:file "util") + (:file "protocol") + (:file "win32-sockets" :if-feature :win32) + (:file "sockets") + (:file "sockopt") - (:sb-grovel-constants-file "constants" :depends-on ("defpackage") - :if-feature (:not :win32) - :package :sockint) - (:file "win32-lib" :if-feature :win32) - (:sb-grovel-constants-file "win32-constants" :depends-on ("defpackage" "win32-lib") - :if-feature :win32 - :package :sockint) - (:sb-grovel-constants-file "addrinfo-constants" :depends-on ("defpackage") - :if-feature :sb-bsd-sockets-addrinfo - :package :sockint) - (:sb-grovel-constants-file "gethostbyname-constants" :depends-on ("defpackage") - :if-feature (:not :sb-bsd-sockets-addrinfo) - :package :sockint) + (:file "inet") + (:file "inet4") + (:file "inet6" :if-feature (:not :win32)) + (:file "local" :if-feature (:not :win32)) - (:file "util" :depends-on ("defpackage" "constants")) - (:file "protocol" :depends-on ("defpackage")) - - (:file "win32-sockets" :depends-on ("protocol" "win32-constants") - :if-feature :win32) - (:file "sockets" :depends-on ("util" "constants" "protocol" "win32-sockets")) - (:file "sockopt" :depends-on ("util" "sockets")) - - (:file "inet" :depends-on ("protocol" "sockets")) - (:file "inet4" :depends-on ("protocol" "sockets")) - (:file "inet6" :depends-on ("protocol" "sockets") - :if-feature (:not :win32)) - (:file "local" :depends-on ("protocol" "sockets") - :if-feature (:not :win32)) - - (:file "name-service" :depends-on ("protocol" "sockets")) - (:file "misc" :depends-on ("sockets")) - - ;; FIXME at least NEWS and TODO actually exist in the - ;; filesystem. However, their all-uppercase names are translated to - ;; all-lowercase in logical pathname translation. - ;; (:static-file "NEWS") - ;; (:static-file "INSTALL") - ;; (:static-file "README") - ;; (:static-file "index.html") - ;; (:static-file "TODO") - ) + (:file "name-service") + (:file "misc")) :perform (load-op :after (o c) (provide 'sb-bsd-sockets)) :in-order-to ((test-op (test-op "sb-bsd-sockets/tests")))) diff --git a/contrib/sb-bsd-sockets/sockopt.lisp b/contrib/sb-bsd-sockets/sockopt.lisp index a9c1a2736d..f7d54fda41 100644 --- a/contrib/sb-bsd-sockets/sockopt.lisp +++ b/contrib/sb-bsd-sockets/sockopt.lisp @@ -62,8 +62,7 @@ Code for options that not every system has should be conditionalised: (sockint::getsockopt (socket-file-descriptor socket) ,find-level ,number (sb-alien:addr buffer) - #+win32 size - #-win32 (sb-alien:addr size))) + (sb-alien:addr size))) (,mangle-return buffer size)))) `((declare (ignore socket)) (unsupported-socket-option ',lisp-name)))) diff --git a/contrib/sb-bsd-sockets/win32-constants.lisp b/contrib/sb-bsd-sockets/win32-constants.lisp deleted file mode 100644 index 8fcfa1fa8e..0000000000 --- a/contrib/sb-bsd-sockets/win32-constants.lisp +++ /dev/null @@ -1,232 +0,0 @@ -;;; -*- Lisp -*- - -;;; This isn't really lisp, but it's definitely a source file. we -;;; name it thus to avoid having to mess with the clc lpn translations - -;;; first, the headers necessary to find definitions of everything -("winsock2.h" "errno.h") - -;;; then the stuff we're looking for -((:integer af-inet "AF_INET" "IP Protocol family") - (:integer af-unspec "AF_UNSPEC" "Unspecified") - (:integer sock-stream "SOCK_STREAM" - "Sequenced, reliable, connection-based byte streams.") - (:integer sock-dgram "SOCK_DGRAM" - "Connectionless, unreliable datagrams of fixed maximum length.") - (:integer sock-raw "SOCK_RAW" - "Raw protocol interface.") - (:integer sock-rdm "SOCK_RDM" - "Reliably-delivered messages.") - (:integer sock-seqpacket "SOCK_SEQPACKET" - "Sequenced, reliable, connection-based, datagrams of fixed maximum length.") - - (:integer sol-socket "SOL_SOCKET") - - ;; some of these may be linux-specific - (:integer so-debug "SO_DEBUG" - "Enable debugging in underlying protocol modules") - (:integer so-reuseaddr "SO_REUSEADDR" "Enable local address reuse") - (:integer so-type "SO_TYPE") ;get only - (:integer so-error "SO_ERROR") ;get only (also clears) - (:integer so-dontroute "SO_DONTROUTE" - "Bypass routing facilities: instead send direct to appropriate network interface for the network portion of the destination address") - (:integer so-broadcast "SO_BROADCAST" "Request permission to send broadcast datagrams") - (:integer so-sndbuf "SO_SNDBUF") - (:integer so-rcvbuf "SO_RCVBUF") - (:integer so-keepalive "SO_KEEPALIVE" - "Send periodic keepalives: if peer does not respond, we get SIGPIPE") - (:integer so-oobinline "SO_OOBINLINE" - "Put out-of-band data into the normal input queue when received") - (:integer so-linger "SO_LINGER" - "For reliable streams, pause a while on closing when unsent messages are queued") - (:integer so-sndlowat "SO_SNDLOWAT") - (:integer so-rcvlowat "SO_RCVLOWAT") - (:integer so-sndtimeo "SO_SNDTIMEO") - (:integer so-rcvtimeo "SO_RCVTIMEO") - - (:integer tcp-nodelay "TCP_NODELAY") - - (:integer msg-oob "MSG_OOB") - (:integer msg-peek "MSG_PEEK") - (:integer msg-dontroute "MSG_DONTROUTE") - - ;; socket shutdown flags - (:integer SHUT_RD "SD_RECEIVE") - (:integer SHUT_WR "SD_SEND") - (:integer SHUT_RDWR "SD_BOTH") - - ;; errors - (:integer EADDRINUSE "WSAEADDRINUSE") - (:integer EAGAIN "WSAEWOULDBLOCK") - (:integer EBADF "WSAEBADF") - (:integer ECONNREFUSED "WSAECONNREFUSED") - (:integer ETIMEDOUT "WSAETIMEDOUT") - (:integer EINTR "WSAEINTR") - (:integer EINVAL "WSAEINVAL") - (:integer ENOBUFS "WSAENOBUFS") - (:integer ENOMEM "WSAENOBUFS") - (:integer EOPNOTSUPP "WSAEOPNOTSUPP") - (:integer EPERM "WSAENETDOWN") - (:integer EPROTONOSUPPORT "WSAEPROTONOSUPPORT") - (:integer ESOCKTNOSUPPORT "WSAESOCKTNOSUPPORT") - (:integer ENETUNREACH "WSAENETUNREACH") - (:integer ENOTCONN "WSAENOTCONN") - (:integer EAFNOSUPPORT "EAFNOSUPPORT") - (:integer EINPROGRESS "EINPROGRESS") - - (:integer inaddr-any "INADDR_ANY") - (:integer FIONBIO "FIONBIO") - - - ;; for socket-receive - (:type socklen-t "int") - - (:structure in-addr ("struct in_addr" - ((array (unsigned 8)) addr "u_int32_t" "s_addr"))) - - (:structure sockaddr-in ("struct sockaddr_in" - (integer family "sa_family_t" "sin_family") - ;; These two could be in-port-t and - ;; in-addr-t, but then we'd throw away the - ;; convenience (and byte-order agnosticism) - ;; of the old sb-grovel scheme. - ((array (unsigned 8)) port "u_int16_t" "sin_port") - ((array (unsigned 8)) addr "struct in_addr" "sin_addr"))) - - (:structure hostent ("struct hostent" - (c-string-pointer name "char *" "h_name") - ((* c-string) aliases "char **" "h_aliases") - (integer type "int" "h_addrtype") - (integer length "int" "h_length") - ((* (* (unsigned 8))) addresses "char **" "h_addr_list"))) - - (:structure protoent ("struct protoent" - (c-string-pointer name "char *" "p_name") - ((* (* t)) aliases "char **" "p_aliases") - (integer proto "int" "p_proto"))) - - (:function getprotobyname ("getprotobyname" (* protoent) - (name c-string))) - - (:function getprotobynumber ("getprotobynumber" (* protoent) - (proto int))) - - ;; FIXME: We should probably grovel the windows SOCKET type and use it in - ;; these instead of int... - - (:function bind ("bind" int - (sockfd int) - (my-addr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? - (addrlen socklen-t))) - - (:function listen ("listen" int - (socket int) - (backlog int))) - - (:function accept ("accept" int - (socket int) - (my-addr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? - (addrlen int :in-out))) - - (:function getpeername ("getpeername" int - (socket int) - (her-addr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? - (addrlen socklen-t :in-out))) - - (:function getsockname ("getsockname" int - (socket int) - (my-addr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? - (addrlen socklen-t :in-out))) - - (:function connect ("connect" int - (socket int) - (his-addr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? - (addrlen socklen-t))) - - (:function close ("closesocket" int - (fd int))) - - (:function shutdown ("shutdown" int - (socket int) ; KLUDGE: should be SOCKET, not int. - (how int))) - - (:function recvfrom ("recvfrom" int - (socket int) - (buf (* t)) - (len integer) - (flags int) - (sockaddr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? - (socklen (* socklen-t)))) - - (:function recv ("recv" int - (socket int) - (buf (* t)) - (len integer) - (flags integer))) - - (:function send ("send" int - (socket int) - (buf (* t)) - (len int) - (flags int))) - - (:function sendto ("sendto" int - (socket int) - (buf (* t)) - (len int) - (flags int) - (sockaddr (* t)) ; KLUDGE: sockaddr-in or sockaddr-un? - (socklen socklen-t))) - -;;; FIXME should be using getaddrinfo instead? - - (:function setsockopt ("setsockopt" int - (socket int) - (level int) - (optname int) - (optval (* t)) - (optlen int))) ;;; should be socklen-t! - - (:function getsockopt ("getsockopt" int - (socket int) - (level int) - (optname int) - (optval (* t)) - (optlen int :in-out))) ;;; should be socklen-t! - - (:function ioctl ("ioctlsocket" int - (socket int) - (cmd int) - (argp (unsigned 32) :in-out))) - - -;;; Win32 specific cruft - (:function wsa-socket ("WSASocketA" int - (af int) - (type int) - (protocol int) - (lpProtocolInfo (* t)) - (g int) - (flags int))) - - (:structure wsa-data ("struct WSAData" - (integer version "u_int16_t" "wVersion") - (integer high-version "u_int16_t" "wHighVersion") - (c-string description "char" "szDescription") - (c-string system-status "char" "szSystemStatus") - (integer max-sockets "unsigned short" "iMaxSockets") - (integer max-udp-dg "unsigned short" "iMaxUdpDg") - (c-string-pointer vendor-info "char *" "lpVendorInfo"))) - - (:function wsa-startup ("WSAStartup" int - (wVersionRequested (unsigned 16)) - (lpWSAData wsa-data :out))) - - (:function wsa-get-last-error ("WSAGetLastError" int)) - (:integer IPPROTO_IP "IPPROTO_IP") - (:integer IPPROTO_IPV6 "IPPROTO_IPV6") - (:integer IPPROTO_ICMP "IPPROTO_ICMP") - (:integer IPPROTO_IGMP "IPPROTO_IGMP") - (:integer IPPROTO_TCP "IPPROTO_TCP") - (:integer IPPROTO_UDP "IPPROTO_UDP") - (:integer IPPROTO_RAW "IPPROTO_RAW")) diff --git a/contrib/sb-bsd-sockets/win32-lib.lisp b/contrib/sb-bsd-sockets/win32-lib.lisp index 41aedeca36..c5c47563d8 100644 --- a/contrib/sb-bsd-sockets/win32-lib.lisp +++ b/contrib/sb-bsd-sockets/win32-lib.lisp @@ -1,3 +1,2 @@ -(eval-when (:compile-toplevel :load-toplevel :execute) - (sb-alien:load-shared-object "ws2_32.dll") - (sb-alien:load-shared-object "msvcrt.dll")) +(sb-alien:load-shared-object "ws2_32.dll") +(sb-alien:load-shared-object "msvcrt.dll") From 46a28fc485a0059021ace936b035e040546643df Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 17 May 2020 21:19:02 +0300 Subject: [PATCH 0002/4023] sb-bsd-sockets-test: reinstate most of the tests. :ipv4-support needs to be pushed at compile-time. --- contrib/sb-bsd-sockets/tests.lisp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index f24535273b..2bfd2635a5 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -52,12 +52,13 @@ nil)) t) -(when (handler-case (make-instance 'inet-socket - :type :stream - :protocol (get-protocol-by-name "tcp")) - (error nil) - (:no-error (x) x)) - (push :ipv4-support *features*)) +(eval-when (:compile-toplevel :execute) + (when (handler-case (make-instance 'inet-socket + :type :stream + :protocol (get-protocol-by-name "tcp")) + (error nil) + (:no-error (x) x)) + (push :ipv4-support *features*))) #+ipv4-support (deftest make-inet-socket.smoke From 4a385e3b313beb3ef408a18f208cf0a10bfe3ccf Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 17 May 2020 21:24:15 +0300 Subject: [PATCH 0003/4023] sb-bsd-sockets: enable IPv6 on Windows. --- NEWS | 1 + contrib/sb-bsd-sockets/sb-bsd-sockets.asd | 2 +- contrib/sb-bsd-sockets/tests.lisp | 5 ----- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 3bcb1cb6af..95a9923250 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ changes relative to sbcl-2.0.4: * enhancement: CMUCL-style START-BLOCK and END-BLOCK declarations are now supported for block compiling forms at a sub-file granularity. + * enhancement: IPv6 support in sb-bsd-sockets is enabled on Windows. * minor change: *compile-print* now makes it more clear what block compilation is actually doing. The default output is now slightly more verbose as a result. diff --git a/contrib/sb-bsd-sockets/sb-bsd-sockets.asd b/contrib/sb-bsd-sockets/sb-bsd-sockets.asd index 8cf8a7c0c2..2bdaf22d50 100644 --- a/contrib/sb-bsd-sockets/sb-bsd-sockets.asd +++ b/contrib/sb-bsd-sockets/sb-bsd-sockets.asd @@ -40,7 +40,7 @@ (:file "inet") (:file "inet4") - (:file "inet6" :if-feature (:not :win32)) + (:file "inet6") (:file "local" :if-feature (:not :win32)) (:file "name-service") diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index 2bfd2635a5..27ba378707 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -18,13 +18,11 @@ (equalp (make-inet-address "242.1.211.3") #(242 1 211 3)) t) -#-win32 (deftest make-inet6-address.1 (equalp (make-inet6-address "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") #(255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255)) t) -#-win32 (deftest unparse-inet6-address (string= (sb-bsd-sockets::unparse-inet6-address (make-inet6-address "fe80::abcd:1234")) @@ -110,7 +108,6 @@ (:no-error nil)) t) -#-win32 (deftest make-inet6-socket.smoke (handler-case (let ((s (make-instance 'inet6-socket :type :stream :protocol (get-protocol-by-name "tcp")))) @@ -118,7 +115,6 @@ ((or address-family-not-supported protocol-not-supported-error) () t)) t) -#-win32 (deftest make-inet6-socket.keyword (handler-case (let ((s (make-instance 'inet6-socket :type :stream :protocol :tcp))) @@ -154,7 +150,6 @@ (socket-close s2))) t) -#-win32 (deftest inet6-socket-bind (handler-case (let* ((tcp (get-protocol-by-name "tcp")) From 4732e1f0419010dbf1d64a0703538468a9fdcfbc Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 17 May 2020 21:34:57 +0300 Subject: [PATCH 0004/4023] sb-bsd-sockets: speed up a tests. Remove 10 seconds of sleep, use sempahores and wait-for instead. --- contrib/sb-bsd-sockets/tests.lisp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index 27ba378707..52b531e985 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -392,7 +392,8 @@ #+(and ipv4-support sb-thread) (deftest interrupt-io - (let (result) + (let (result + (sem (sb-thread:make-semaphore))) (labels ((client (port) (setf result @@ -407,11 +408,8 @@ (handler-case (prog1 (catch 'stop - (progn - (read-char stream) - (sleep 0.1) - (sleep 0.1) - (sleep 0.1))) + (sb-thread:signal-semaphore sem) + (read-char stream)) (close stream)) (error (c) c)))))) @@ -433,10 +431,11 @@ :buffering :none)) (ok :ok)) (socket-close s) - (sleep 5) + (sb-thread:wait-on-semaphore sem) + (sleep 0.1) (sb-thread:interrupt-thread client (lambda () (throw 'stop ok))) - (sleep 5) + (sb-ext:wait-for (null (sb-thread::thread-interruptions client)) :timeout 3) (setf ok :not-ok) (write-char #\x stream) (close stream) From b7be57e7a2795e623f4eabf3e160fcfdc625c9c3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 17 May 2020 21:36:47 +0300 Subject: [PATCH 0005/4023] Add musl to NEWS. --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 95a9923250..54366c6555 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ changes relative to sbcl-2.0.4: * enhancement: CMUCL-style START-BLOCK and END-BLOCK declarations are now supported for block compiling forms at a sub-file granularity. * enhancement: IPv6 support in sb-bsd-sockets is enabled on Windows. + * enhancement: better musl libc support (Thanks to Eric Timmons). * minor change: *compile-print* now makes it more clear what block compilation is actually doing. The default output is now slightly more verbose as a result. From 50095fd27285e180f4ccdf9325578bcaf4239eb6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 17 May 2020 23:48:27 +0300 Subject: [PATCH 0006/4023] Save all the registers when using tramps to lisp functions. with-registers-preserved was originally designed for calling C functions and left out the callee saved registers. Reported by Eric Timmons. --- src/assembly/x86-64/support.lisp | 6 ++++-- src/assembly/x86-64/tramps.lisp | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/assembly/x86-64/support.lisp b/src/assembly/x86-64/support.lisp index ae8f97619e..61551655d6 100644 --- a/src/assembly/x86-64/support.lisp +++ b/src/assembly/x86-64/support.lisp @@ -49,7 +49,7 @@ (inst ret))) ((:none :full-call-no-return)))) -(defmacro with-registers-preserved ((fpr-size &key except) &body body) +(defmacro with-registers-preserved ((fpr-size &key except (callee-saved t)) &body body) (multiple-value-bind (mnemonic fpr-align getter) (ecase fpr-size (xmm (values 'movaps 16 'sb-x86-64-asm::get-fpr)) @@ -64,7 +64,9 @@ `(inst ,mnemonic (,getter ,regno) (ea ,(* regno fpr-align) rsp-tn)))))) (gpr-save/restore (operation except) (declare (type (member push pop) operation)) - (let ((registers '(rax-tn rcx-tn rdx-tn rsi-tn rdi-tn r8-tn r9-tn r10-tn r11-tn))) + (let ((registers (if callee-saved + '#1=(rax-tn rcx-tn rdx-tn rsi-tn rdi-tn r8-tn r9-tn r10-tn r11-tn) + '(rbx-tn r12-tn r14-tn r15-tn . #1#)))) (when except (setf registers (remove except registers))) ;; Preserve alignment diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index 3ef881c8be..8cd8006c48 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -140,13 +140,15 @@ (inst mov temp-reg-tn (ea (make-fixup "avx2_supported" :foreign-dataref))) (inst test :byte (ea temp-reg-tn) 1) (inst jmp :z call-preserving-xmm-only) - (with-registers-preserved (ymm :except r11-tn) + (with-registers-preserved (ymm :except r11-tn + :callee-saved nil) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg (call-static-fun 'ensure-symbol-hash 1) (inst mov (ea 16 rbp-tn) rdx-tn)) ; result to arg passing loc (inst ret)) call-preserving-xmm-only - (with-registers-preserved (xmm :except r11-tn) + (with-registers-preserved (xmm :except r11-tn + :callee-saved nil) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg (call-static-fun 'ensure-symbol-hash 1) (inst mov (ea 16 rbp-tn) rdx-tn)) ; result to arg passing loc @@ -158,14 +160,16 @@ (inst mov temp-reg-tn (ea (make-fixup "avx2_supported" :foreign-dataref))) (inst test :byte (ea temp-reg-tn) 1) (inst jmp :z call-preserving-xmm-only) - (with-registers-preserved (ymm :except r11-tn) + (with-registers-preserved (ymm :except r11-tn + :callee-saved nil) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg1 (inst mov rdi-tn (ea 24 rbp-tn)) ; arg2 (call-static-fun 'update-object-layout-or-invalid 2) (inst mov (ea 24 rbp-tn) rdx-tn)) ; result to arg passing loc (inst ret 8)) ; remove 1 arg. Caller pops the result call-preserving-xmm-only - (with-registers-preserved (xmm :except r11-tn) + (with-registers-preserved (xmm :except r11-tn + :callee-saved nil) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg1 (inst mov rdi-tn (ea 24 rbp-tn)) ; arg2 (call-static-fun 'update-object-layout-or-invalid 2) From bdd240eac877cd33e65f7a8f5a01685b662c69ff Mon Sep 17 00:00:00 2001 From: Matthew Stickney Date: Sun, 10 Nov 2019 16:08:17 -0500 Subject: [PATCH 0007/4023] Fix fd leak with closefrom(2)-like interface. The current approach has two problems: first, it can leak an fd if a high fd is opened in the parent, and the max-fd limit is lowered before the fds are closed prior to exec. The second problem is that the code has to issue a close call for every possibly-valid fd value, which can introduce significant delays on systems where the max-fd limit is high and close calls are slow (this has been observed in the wild in at least one cloud- based environment). To remedy these problems, we use a closefrom(2)-like interface to close all open fds before execing the child process. On BSD systems that have a real closefrom(2) system call, we use that; for other platforms, if the F_CLOSEM fcntl is available, we use that; otherwise, we attempt to walk the /dev/fd/ and /proc/self/fd/ directories. Since these may not be available (e.g. in a chroot), if all of these fail, we use a fallback implementation. The fallback implementation is nearly the same as the previous code, except that it uses the F_MAXFD fcntl to determine that maximum fd if it's available. This will avoid leaking fds in the child, although it won't address the poor performance of the fallback method. To use this interface, the pipe fd left open in the child process for signalling purposes is duped to the lowest available fd (3), and the closefrom wrapper is then used to close all open fds above that. Setting FD_CLOEXEC on the pipe fd now occurs after the pipe fd is moved, since dup2 does not preserve fd flags. --- src/runtime/run-program.c | 100 +++++++++++++++++++++++++++++----- tests/run-program.impure.lisp | 54 ++++++++++++++++++ 2 files changed, 139 insertions(+), 15 deletions(-) diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 9be922cd10..71d964da56 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -29,6 +29,7 @@ #include #include #include +#include #ifdef LISP_FEATURE_OPENBSD #include @@ -134,6 +135,78 @@ int wait_for_exec(int pid, int channel[2]) { return pid; } +void closefrom_fallback(int lowfd) +{ + int fd, maxfd = -1; +#ifdef F_MAXFD + maxfd = fcntl(0, F_MAXFD); +#endif + +#ifdef SVR4 + if (-1 == maxfd) + maxfd = sysconf(_SC_OPEN_MAX)-1; +#else + if (-1 == maxfd) + maxfd = getdtablesize()-1; +#endif + + for (fd = maxfd; fd >= lowfd; fd--) + close(fd); +} + +int closefrom_fddir(char *dir, int lowfd) +{ + DIR *d; + struct dirent *ent; + int fd; + + /* This may fail if e.g. the program is running in + * a chroot that does not include /proc, or potentially + * on old kernel versions. */ + d = opendir(dir); + if (!d) return -1; + + for (ent = readdir(d); ent; ent = readdir(d)) { + if (DT_LNK != ent->d_type) continue; + + /* atoi will return bogus values for certain inputs, but lowfd will + * prevent us from closing anything we care about. */ + fd = atoi(ent->d_name); + if (fd >= 0 && fd >= lowfd) + close(fd); + } + closedir(d); + return 0; +} + +void closefds_from(int lowfd) +{ + int fds_closed = 0; + +#if defined(LISP_FEATURE_OPENBSD) \ + || defined(LISP_FEATURE_NETBSD) \ + || defined(LISP_FEATURE_DRAGONFLY) + closefrom(lowfd); +#else + +#ifdef F_CLOSEM + if (!fds_closed) + fds_closed = (-1 != fcntl(lowfd, F_CLOSEM)); +#endif + +#ifdef LISP_FEATURE_LINUX + if (!fds_closed) + fds_closed = !closefrom_fddir("/proc/self/fd/", lowfd); +#else + if (!fds_closed) + fds_closed = !closefrom_fddir("/dev/fd/", lowfd); +#endif + + if (!fds_closed) + closefrom_fallback(lowfd); +#endif +} + extern char **environ; int spawn(char *program, char *argv[], int sin, int sout, int serr, int search, char *envp[], char *pty_name, @@ -141,18 +214,12 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr, char *pwd) { pid_t pid; - int fd; sigset_t sset; int failure_code = 2; channel[0] = -1; channel[1] = -1; - if (!pipe(channel)) { - if (-1==fcntl(channel[1], F_SETFD, FD_CLOEXEC)) { - close(channel[1]); - channel[1] = -1; - } - } + pipe(channel); pid = fork(); if (pid) { @@ -193,14 +260,17 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr, if (serr >= 0) dup2(serr, 2); } - /* Close all other fds. */ -#ifdef SVR4 - for (fd = sysconf(_SC_OPEN_MAX)-1; fd >= 3; fd--) - if (fd != channel[1]) close(fd); -#else - for (fd = getdtablesize()-1; fd >= 3; fd--) - if (fd != channel[1]) close(fd); -#endif + /* Close all other fds. First arrange for the pipe fd to be the + * lowest free fd, then close every open fd above that. */ + channel[1] = dup2(channel[1], 3); + closefds_from(4); + + if (-1 != channel[1]) { + if (-1==fcntl(channel[1], F_SETFD, FD_CLOEXEC)) { + close(channel[1]); + channel[1] = -1; + } + } if (pwd && chdir(pwd) < 0) { failure_code = 3; diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index 0617b1c1d3..50dd1617c6 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -441,3 +441,57 @@ :wait t))) (setf stop t) (mapc #'sb-thread:join-thread threads))) + +#-win32 +(progn + (define-alien-type nil + (struct rlimit + (cur unsigned-long) + (max unsigned-long))) + + (define-alien-routine "getrlimit" + int + (resource int) + (limit (* (struct rlimit)))) + + (define-alien-routine "setrlimit" + int + (resource int) + (limit (* (struct rlimit)))) + + (defconstant +rlimit-nofile+ 7) + + (defun get-fd-limit () + (with-alien ((resource (struct rlimit))) + (unless (zerop (getrlimit +rlimit-nofile+ (alien-sap resource))) + (sb-posix:syscall-error 'getrlimit)) + (values (slot resource 'cur) + (slot resource 'max)))) + + (defun set-fd-limit (soft hard) + (with-alien ((limit (struct rlimit))) + (setf (slot limit 'cur) soft + (slot limit 'max) hard) + (unless (zerop (setrlimit +rlimit-nofile+ (alien-sap limit))) + (sb-posix:syscall-error 'setrlimit)) + (values soft hard)))) + +#-win32 +(with-test (:name (run-program :child-fd-leak)) + (multiple-value-bind (soft hard) (get-fd-limit) + (unless (> soft 2) + (error "Cannot perform test with a max-fd limit of less than 2.")) + + ;; Duplicate stdin at the maximum possible fd. + (sb-posix:dup2 0 (1- soft)) + + ;; Now lower the max-fd limit so that the (open) duped fd is above + ;; the limit. + (set-fd-limit (1- soft) hard) + (let* ((fd-path (concatenate 'string "/dev/fd/" (princ-to-string (1- soft)))) + (process (run-program "test" (list "-e" fd-path) :search t))) + ;; If RUN-PROGRAM correctly closed all open file descriptors, + ;; the stdin dup will not exist, otherwise we have an fd leak. + (assert (not (zerop (process-exit-code process))) + () + "File descriptor above the max-fd limit from parent not closed in child process.")))) From 9029eaf4f14f6a13b12e8686868ef908c4668b61 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 18 May 2020 00:23:24 +0300 Subject: [PATCH 0008/4023] Increase a test timeout. --- contrib/sb-bsd-sockets/tests.lisp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index 52b531e985..9a0f818d21 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -428,18 +428,18 @@ (stream (socket-make-stream r :input t :output t - :buffering :none)) - (ok :ok)) + :buffering :none))) (socket-close s) (sb-thread:wait-on-semaphore sem) (sleep 0.1) (sb-thread:interrupt-thread client - (lambda () (throw 'stop ok))) - (sb-ext:wait-for (null (sb-thread::thread-interruptions client)) :timeout 3) - (setf ok :not-ok) + (lambda () (throw 'stop :ok))) + (unless (sb-ext:wait-for (null (sb-thread::thread-interruptions client)) :timeout 5) + (setf result :timeout)) (write-char #\x stream) (close stream) - (socket-close r)))))) + (socket-close r) + (sb-thread:join-thread client :timeout 5)))))) (server)) result) :ok) From b53fef5896b82ff81b791576f84787c5d0011f00 Mon Sep 17 00:00:00 2001 From: Matthew Stickney Date: Sun, 17 May 2020 14:43:23 -0700 Subject: [PATCH 0009/4023] Avoid multiple definition error with GCC 10 on Windows. GCC 10 now compiles with -fno-common by default, which triggers a linker error if a variable is defined in a header and shared in more than one object file to be linked. DEAD_MUTEX is shared, and triggers the error; declare it with extern and move the variable into the pthreads_win32.c file to avoid it. --- src/runtime/pthreads_win32.c | 2 ++ src/runtime/pthreads_win32.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index 6fdad6cdec..ea7dd6666a 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -389,6 +389,8 @@ int pthread_mutexattr_settype(pthread_mutexattr_t* attr,int mutex_type) return 0; } +struct _pthread_mutex_info DEAD_MUTEX; + int pthread_mutex_destroy(pthread_mutex_t *mutex) { if (*mutex != PTHREAD_MUTEX_INITIALIZER) { diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index 09b24abeb8..e124c95c64 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -257,7 +257,7 @@ int futex_wake(volatile intptr_t *lock_word, int n); /* Debugging */ void pthread_np_lose(int trace_depth, const char* fmt, ...); -struct _pthread_mutex_info DEAD_MUTEX; +extern struct _pthread_mutex_info DEAD_MUTEX; static inline void pthread_np_assert_live_mutex(pthread_mutex_t* ptr, const char *action) From b799f5a135ca199a2ea63389b161da6a5746ca3c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 17 May 2020 20:37:02 -0400 Subject: [PATCH 0010/4023] Put without-gcing back in sap-foreign-symbol for darwin and only for darwin. Perhaps this solves the alleged deadlock which I can't reproduce. --- src/code/foreign.lisp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 6a30c9cb5f..d083e99ade 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -111,7 +111,11 @@ if the symbol isn't found." ;; How exactly was this deadlocking? A reductio ad absurdum argument ;; says that every call into a system API could potentially acquire ;; a lock, and therefore every one should inhibit GC. But they don't. - (let ((err (alien-funcall dladdr addr (addr info)))) + ;; Well, there seems to be some evidence that WITHOUT-GCING fixed something + ;; somehow, which I can't explain. It's such a grotesque "fix" that it + ;; should be confined to darwin only. + (let ((err (#+darwin without-gcing + #-darwin progn (alien-funcall dladdr addr (addr info))))) (if (zerop err) nil (slot info 'symbol)))) From 1d0810867abdd8bd020b152265619857cde6d5a8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 17 May 2020 20:50:51 -0400 Subject: [PATCH 0011/4023] Proclaim a type --- src/code/linkage-table.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index 094b1a4806..bfa8d850cf 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -25,6 +25,7 @@ (define-load-time-global *linkage-info* ;; CDR of the cons is the list of undefineds (list (make-hash-table :test 'equal :synchronized t))) +(declaim (type (cons hash-table) *linkage-info*)) (define-alien-variable undefined-alien-address unsigned) From ab483b2f751000c50509dea02960f96155765463 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 17 May 2020 20:54:43 -0400 Subject: [PATCH 0012/4023] Skip recording some pointers in traceroot Any pointer to a leaf object is irrelevant as long as the user's query is not for a path to a leaf object. --- src/runtime/traceroot.c | 83 +++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 20 deletions(-) diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 1bc78e697b..58f880030a 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -63,6 +63,7 @@ struct scan_state { // A hashtable mapping each object to a list of objects pointing to it struct hopscotch_table inverted_heap; struct scratchpad scratchpad; + int keep_leaves; }; static int traceroot_gen_of(lispobj obj) { @@ -115,7 +116,7 @@ static void add_to_layer(lispobj* obj, int wordindex, /// If 'obj' is a simple-fun, return its code component, /// otherwise return obj directly. -static lispobj canonical_obj(lispobj obj) +static inline lispobj canonical_obj(lispobj obj) { if (functionp(obj) && widetag_of(FUNCTION(obj)) == SIMPLE_FUN_WIDETAG) return fun_code_tagged(FUNCTION(obj)); @@ -643,13 +644,18 @@ static lispobj trace1(lispobj object, return path; } -static void record_ptr(lispobj* source, lispobj target, - struct scan_state* ss) +// Add 'source' to the list of objects keyed by 'target' in the inverted heap. +// Note that 'source' has no lowtag, and 'target' does. +// Pointer compression is used: the linked list of source objects +// is built using offsets into the scratchpad rather than absolute addresses. +// Return 1 if and only if 'target' was actually added to the graph. +static boolean record_ptr(lispobj* source, lispobj target, + struct scan_state* ss) { - // Add 'source' to the list of objects keyed by 'target' in the inverted heap. - // Note that 'source' has no lowtag, and 'target' does. - // Pointer compression occurs here as well: the linked list of source objects - // is built using offsets into the scratchpad rather than absolute addresses. + if (!ss->keep_leaves) { // expected case + if (!listp(target) && + leaf_obj_widetag_p(widetag_of(native_pointer(target)))) return 0; + } target = canonical_obj(target); uint32_t* new_cell = (uint32_t*)ss->scratchpad.free; uint32_t* next = new_cell + 2; @@ -660,17 +666,18 @@ static void record_ptr(lispobj* source, lispobj target, uint32_t* valref = hopscotch_get_ref(&ss->inverted_heap, target); new_cell[1] = *valref; *valref = (uint32_t)((char*)new_cell - ss->scratchpad.base); + return 1; } -#define relevant_ptr_p(x) find_page_index(x)>=0||immobile_space_p((lispobj)x) +#define relevant_ptr_p(x) (find_page_index((void*)(x))>=0||immobile_space_p((lispobj)(x))) -#define check_ptr(ptr) { \ - ++n_scanned_words; \ - if (!is_lisp_pointer(ptr)) ++n_immediates; \ - else if (relevant_ptr_p((void*)(ptr))) { \ - ++n_pointers; \ - if (record_ptrs) record_ptr(where,ptr,ss); \ - }} +#define COUNT_POINTER(x) { ++n_scanned_words; \ + if (!is_lisp_pointer(x)) ++n_immediates; \ + else if (relevant_ptr_p(x)) ++n_pointers; } + +#define check_ptr(x) { \ + if (count_only) COUNT_POINTER(x) \ + else if (is_lisp_pointer(x) && relevant_ptr_p(x)) record_ptr(where,x,ss); } static uword_t build_refs(lispobj* where, lispobj* end, struct scan_state* ss) @@ -680,7 +687,7 @@ static uword_t build_refs(lispobj* where, lispobj* end, uword_t n_objects = 0, n_scanned_words = 0, n_immediates = 0, n_pointers = 0; - boolean record_ptrs = ss->record_ptrs; + boolean count_only = !ss->record_ptrs; for ( ; where < end ; where += nwords ) { ++n_objects; lispobj header = *where; @@ -760,9 +767,26 @@ static uword_t build_refs(lispobj* where, lispobj* end, (widetag == RATIO_WIDETAG)) continue; } - for(i=1; irecord_ptrs) { + // Try to eliminate some duplicate edges in the reversed graph. + // This is only a heuristic and will not eliminate all duplicate edges. + // It helps for vectors which get initialized like #(#:FOO #:FOO ...) + // by storing only one backpointer to #:FOO. + // It is not particularly helpful for other objects. + lispobj prev_interesting_ptr = 0; + for(i=1; in_objects += n_objects; ss->n_scanned_words += n_scanned_words; ss->n_immediates += n_immediates; @@ -797,11 +821,13 @@ static void scan_spaces(struct scan_state* ss) #define HASH_FUNCTION HOPSCOTCH_HASH_FUN_MIX -static void compute_heap_inverse(struct hopscotch_table* inverted_heap, +static void compute_heap_inverse(boolean keep_leaves, + struct hopscotch_table* inverted_heap, struct scratchpad* scratchpad) { struct scan_state ss; memset(&ss, 0, sizeof ss); + ss.keep_leaves = keep_leaves; if (heap_trace_verbose) fprintf(stderr, "Pass 1: Counting heap objects...\n"); scan_spaces(&ss); // Guess at the initial size of ~ .5 million objects. @@ -850,6 +876,22 @@ static void compute_heap_inverse(struct hopscotch_table* inverted_heap, #endif }; +/* Return true if the user wants to find a leaf object. + * If not, then we can omit all leaf objects from the inverted heap + * because no leaf object can point to anything */ +static boolean finding_leaf_p(lispobj weak_pointers) +{ + do { + lispobj car = CONS(weak_pointers)->car; + lispobj value = ((struct weak_pointer*)native_pointer(car))->value; + weak_pointers = CONS(weak_pointers)->cdr; + if (is_lisp_pointer(value) + && !listp(value) + && leaf_obj_widetag_p(widetag_of(native_pointer(value)))) return 1; + } while (weak_pointers != NIL); + return 0; // this is the expected (and optimal) case +} + /* Find any shortest path from a thread or tenured object * to each of the specified objects. */ @@ -874,7 +916,8 @@ static int trace_paths(void (*context_scanner)(), fprintf(stderr, " %p%s", (void*)pins[i], ((i%8)==7||i==n_pins-1)?"\n":""); } - compute_heap_inverse(&inverted_heap, &scratchpad); + compute_heap_inverse(finding_leaf_p(weak_pointers), + &inverted_heap, &scratchpad); hopscotch_create(&visited, HASH_FUNCTION, 0, 32, 0); hopscotch_create(&targets, HASH_FUNCTION, 0, 32, 0); i = 0; From 171b21b7719b03e6befb50bf4d130391d9066349 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 18 May 2020 04:01:21 +0300 Subject: [PATCH 0013/4023] Fix run-program on BSDs. /dev/fd doesn't have links there. --- src/runtime/run-program.c | 76 +++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 71d964da56..6d5f94ac4b 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -98,43 +98,6 @@ set_pty(char *pty_name) #endif /* !LISP_FEATURE_OPENBSD */ -int wait_for_exec(int pid, int channel[2]) { - if ((-1 != pid) && (-1 != channel[1])) { - int child_errno = 0; - int bytes = sizeof(int); - int n; - char *p = (char*)&child_errno; - close(channel[1]); - /* Try to read child errno from channel. */ - while ((bytes > 0) && - (n = read(channel[0], p, bytes))) { - if (-1 == n) { - if (EINTR == errno) { - continue; - } else { - break; - } - } else { - bytes -= n; - p += n; - } - } - close(channel[0]); - if (child_errno) { - int status; - waitpid(pid, &status, 0); - /* Our convention to tell Lisp that it was the exec or - chdir that failed, not the fork. */ - /* FIXME: there are other values waitpid(2) can return. */ - if (WIFEXITED(status)) { - pid = -WEXITSTATUS(status); - } - errno = child_errno; - } - } - return pid; -} - void closefrom_fallback(int lowfd) { int fd, maxfd = -1; @@ -167,8 +130,6 @@ int closefrom_fddir(char *dir, int lowfd) if (!d) return -1; for (ent = readdir(d); ent; ent = readdir(d)) { - if (DT_LNK != ent->d_type) continue; - /* atoi will return bogus values for certain inputs, but lowfd will * prevent us from closing anything we care about. */ fd = atoi(ent->d_name); @@ -207,6 +168,43 @@ void closefds_from(int lowfd) #endif } +int wait_for_exec(int pid, int channel[2]) { + if ((-1 != pid) && (-1 != channel[1])) { + int child_errno = 0; + int bytes = sizeof(int); + int n; + char *p = (char*)&child_errno; + close(channel[1]); + /* Try to read child errno from channel. */ + while ((bytes > 0) && + (n = read(channel[0], p, bytes))) { + if (-1 == n) { + if (EINTR == errno) { + continue; + } else { + break; + } + } else { + bytes -= n; + p += n; + } + } + close(channel[0]); + if (child_errno) { + int status; + waitpid(pid, &status, 0); + /* Our convention to tell Lisp that it was the exec or + chdir that failed, not the fork. */ + /* FIXME: there are other values waitpid(2) can return. */ + if (WIFEXITED(status)) { + pid = -WEXITSTATUS(status); + } + errno = child_errno; + } + } + return pid; +} + extern char **environ; int spawn(char *program, char *argv[], int sin, int sout, int serr, int search, char *envp[], char *pty_name, From 3cb452f0488ea7131423f021402512c7833fe1ce Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 18 May 2020 04:18:55 +0300 Subject: [PATCH 0014/4023] Simplify the child-fd-leak test. Just test a single fd or it's hard to make portable. --- tests/run-program.impure.lisp | 61 +++++------------------------------ 1 file changed, 8 insertions(+), 53 deletions(-) diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index 50dd1617c6..0a9e71e8a6 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -442,56 +442,11 @@ (setf stop t) (mapc #'sb-thread:join-thread threads))) -#-win32 -(progn - (define-alien-type nil - (struct rlimit - (cur unsigned-long) - (max unsigned-long))) - - (define-alien-routine "getrlimit" - int - (resource int) - (limit (* (struct rlimit)))) - - (define-alien-routine "setrlimit" - int - (resource int) - (limit (* (struct rlimit)))) - - (defconstant +rlimit-nofile+ 7) - - (defun get-fd-limit () - (with-alien ((resource (struct rlimit))) - (unless (zerop (getrlimit +rlimit-nofile+ (alien-sap resource))) - (sb-posix:syscall-error 'getrlimit)) - (values (slot resource 'cur) - (slot resource 'max)))) - - (defun set-fd-limit (soft hard) - (with-alien ((limit (struct rlimit))) - (setf (slot limit 'cur) soft - (slot limit 'max) hard) - (unless (zerop (setrlimit +rlimit-nofile+ (alien-sap limit))) - (sb-posix:syscall-error 'setrlimit)) - (values soft hard)))) - -#-win32 -(with-test (:name (run-program :child-fd-leak)) - (multiple-value-bind (soft hard) (get-fd-limit) - (unless (> soft 2) - (error "Cannot perform test with a max-fd limit of less than 2.")) - - ;; Duplicate stdin at the maximum possible fd. - (sb-posix:dup2 0 (1- soft)) - - ;; Now lower the max-fd limit so that the (open) duped fd is above - ;; the limit. - (set-fd-limit (1- soft) hard) - (let* ((fd-path (concatenate 'string "/dev/fd/" (princ-to-string (1- soft)))) - (process (run-program "test" (list "-e" fd-path) :search t))) - ;; If RUN-PROGRAM correctly closed all open file descriptors, - ;; the stdin dup will not exist, otherwise we have an fd leak. - (assert (not (zerop (process-exit-code process))) - () - "File descriptor above the max-fd limit from parent not closed in child process.")))) +(with-test (:name (run-program :child-fd-leak) + :skipped-on :win32) + (when (probe-file "/dev/fd") + (with-open-file (stream "/dev/null") + (let* ((fd (sb-sys:fd-stream-fd stream)) + (process (run-program "test" (list "-e" (format nil "/dev/fd/~a" fd)) + :search t))) + (assert (not (zerop (process-exit-code process)))))))) From 578b6ccde9a0307cf357ee30f61e04e2b8dfd942 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 18 May 2020 04:20:46 +0300 Subject: [PATCH 0015/4023] Revert "Put without-gcing back in sap-foreign-symbol for darwin" This reverts commit b799f5a135ca199a2ea63389b161da6a5746ca3c. --- src/code/foreign.lisp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index d083e99ade..6a30c9cb5f 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -111,11 +111,7 @@ if the symbol isn't found." ;; How exactly was this deadlocking? A reductio ad absurdum argument ;; says that every call into a system API could potentially acquire ;; a lock, and therefore every one should inhibit GC. But they don't. - ;; Well, there seems to be some evidence that WITHOUT-GCING fixed something - ;; somehow, which I can't explain. It's such a grotesque "fix" that it - ;; should be confined to darwin only. - (let ((err (#+darwin without-gcing - #-darwin progn (alien-funcall dladdr addr (addr info))))) + (let ((err (alien-funcall dladdr addr (addr info)))) (if (zerop err) nil (slot info 'symbol)))) From f3dc9dfe5f617799d54fddc6d5f874c862bfaa70 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 17 May 2020 22:41:09 -0400 Subject: [PATCH 0016/4023] Optionally use absl::flat_hash_map in traceroot Can speed up heap inversion by 10% depending on the size. Users will have to provide the library and makefile changes on their own (See https://abseil.io/) --- src/runtime/absl_glue.cc | 32 ++++++++++++++++ src/runtime/murmur_hash.c | 13 +------ src/runtime/murmur_hash.h | 20 ++++++++-- src/runtime/traceroot.c | 78 ++++++++++++++++++++++++++++----------- 4 files changed, 107 insertions(+), 36 deletions(-) create mode 100644 src/runtime/absl_glue.cc diff --git a/src/runtime/absl_glue.cc b/src/runtime/absl_glue.cc new file mode 100644 index 0000000000..09813caa82 --- /dev/null +++ b/src/runtime/absl_glue.cc @@ -0,0 +1,32 @@ +#include "absl/container/flat_hash_map.h" +#include "murmur_hash.h" + +typedef unsigned long lispobj; + +struct Hash { + size_t operator() (lispobj k) const { FMIX64(k); return k; } +}; + +typedef absl::flat_hash_map inverted_heap; + +extern "C" { +void* new_absl_hashmap(int size) { + inverted_heap* hashmap = new inverted_heap; + hashmap->reserve(size); + return hashmap; +} +void absl_hashmap_destroy(inverted_heap* hashmap) { + delete hashmap; +} +unsigned absl_hashmap_get(inverted_heap* hashmap, lispobj key) { + return (*hashmap)[key]; +} +unsigned* absl_hashmap_get_ref(inverted_heap* hashmap, lispobj key) { + return &(*hashmap)[key]; +} +int absl_hashmap_size(inverted_heap* hashmap, int* capacity) { + *capacity = (*hashmap).bucket_count(); + return (*hashmap).size(); +} + +} diff --git a/src/runtime/murmur_hash.c b/src/runtime/murmur_hash.c index 23ca405bfe..3340ec6a58 100644 --- a/src/runtime/murmur_hash.c +++ b/src/runtime/murmur_hash.c @@ -22,13 +22,6 @@ #define ROTL32(x, r) ((x) << (r)) | ((x) >> (32 - (r))) -#define FMIX32(h) \ - (h) ^= (h) >> 16; \ - (h) *= 0x85ebca6b; \ - (h) ^= (h) >> 13; \ - (h) *= 0xc2b2ae35; \ - (h) ^= (h) >> 16; - uint32_t gpr_murmur_hash3(const void* key, size_t len, uint32_t seed) { uint32_t h1 = seed; uint32_t k1; @@ -84,11 +77,7 @@ uint32_t murmur3_fmix32(uint32_t k) { } #ifdef LISP_FEATURE_64_BIT uint64_t murmur3_fmix64(uint64_t k) { - k ^= k >> 33; - k *= 0xff51afd7ed558ccdULL; - k ^= k >> 33; - k *= 0xc4ceb9fe1a85ec53ULL; - k ^= k >> 33; + FMIX64(k); return k; } #endif diff --git a/src/runtime/murmur_hash.h b/src/runtime/murmur_hash.h index 7e8401f647..0edfca428c 100644 --- a/src/runtime/murmur_hash.h +++ b/src/runtime/murmur_hash.h @@ -16,8 +16,8 @@ * */ -#ifndef GRPC_CORE_LIB_SUPPORT_MURMUR_HASH_H -#define GRPC_CORE_LIB_SUPPORT_MURMUR_HASH_H +#ifndef _MURMUR_HASH_H_ +#define _MURMUR_HASH_H_ #include #include @@ -29,4 +29,18 @@ uint32_t murmur3_fmix32(uint32_t); uint64_t murmur3_fmix64(uint64_t); #endif -#endif /* GRPC_CORE_LIB_SUPPORT_MURMUR_HASH_H */ +#define FMIX32(h) \ + (h) ^= (h) >> 16; \ + (h) *= 0x85ebca6b; \ + (h) ^= (h) >> 13; \ + (h) *= 0xc2b2ae35; \ + (h) ^= (h) >> 16 + +#define FMIX64(h) \ + (h) ^= (h) >> 33; \ + (h) *= 0xff51afd7ed558ccdULL; \ + (h) ^= (h) >> 33; \ + (h) *= 0xc4ceb9fe1a85ec53ULL; \ + (h) ^= (h) >> 33 + +#endif /* _MURMUR_HASH_H_ */ diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 58f880030a..65733c0ace 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -29,6 +29,25 @@ #include // for getrusage() #endif +#ifndef TRACEROOT_USE_ABSL_HASHMAP +#define TRACEROOT_USE_ABSL_HASHMAP 0 +#endif + +#if TRACEROOT_USE_ABSL_HASHMAP +extern void* new_absl_hashmap(int); +extern void absl_hashmap_destroy(void*); +extern unsigned absl_hashmap_get(void*,lispobj); +extern unsigned* absl_hashmap_get_ref(void*,lispobj); +extern int absl_hashmap_size(void*,int*); +typedef void* inverted_heap_t; +#define inverted_heap_get(graph, key) absl_hashmap_get(graph, key) +#define inverted_heap_get_ref(graph, key) absl_hashmap_get_ref(graph, key) +#else +typedef struct hopscotch_table* inverted_heap_t; +#define inverted_heap_get(graph, key) hopscotch_get(graph, key, 0) +#define inverted_heap_get_ref(graph, key) hopscotch_get_ref(graph, key) +#endif + int heap_trace_verbose = 0; extern generation_index_t gencgc_oldest_gen_to_gc; @@ -60,8 +79,8 @@ struct scan_state { long n_immediates; long n_pointers; int record_ptrs; - // A hashtable mapping each object to a list of objects pointing to it - struct hopscotch_table inverted_heap; + // A hashmap from object to list of objects pointing to it + struct hopscotch_table* inverted_heap; struct scratchpad scratchpad; int keep_leaves; }; @@ -465,7 +484,7 @@ static lispobj make_sap(char* value) static lispobj trace1(lispobj object, struct hopscotch_table* targets, struct hopscotch_table* visited, - struct hopscotch_table* inverted_heap, + inverted_heap_t graph, struct scratchpad* scratchpad, int n_pins, lispobj* pins, void (*context_scanner)(), int criterion) @@ -496,7 +515,7 @@ static lispobj trace1(lispobj object, if (heap_trace_verbose) printf("Next layer: Looking for %d object(s)\n", targets->count); for_each_hopscotch_key(i, target, (*targets)) { - uint32_t list = hopscotch_get(inverted_heap, target, 0); + uint32_t list = inverted_heap_get(graph, target); if (heap_trace_verbose>1) { uint32_t list1 = list; fprintf(stderr, "target=%p srcs=", (void*)target); @@ -663,7 +682,7 @@ static boolean record_ptr(lispobj* source, lispobj target, ss->scratchpad.free = (char*)next; if (ss->scratchpad.free > ss->scratchpad.end) lose("undersized scratchpad"); new_cell[0] = encode_pointer((lispobj)source); - uint32_t* valref = hopscotch_get_ref(&ss->inverted_heap, target); + uint32_t* valref = inverted_heap_get_ref(ss->inverted_heap, target); new_cell[1] = *valref; *valref = (uint32_t)((char*)new_cell - ss->scratchpad.base); return 1; @@ -821,9 +840,8 @@ static void scan_spaces(struct scan_state* ss) #define HASH_FUNCTION HOPSCOTCH_HASH_FUN_MIX -static void compute_heap_inverse(boolean keep_leaves, - struct hopscotch_table* inverted_heap, - struct scratchpad* scratchpad) +static void* compute_heap_inverse(boolean keep_leaves, + struct scratchpad* scratchpad) { struct scan_state ss; memset(&ss, 0, sizeof ss); @@ -836,9 +854,15 @@ static void compute_heap_inverse(boolean keep_leaves, if (heap_trace_verbose) { fprintf(stderr, "Pass 2: Inverting heap. Initial size=%d objects\n", size); } - hopscotch_create(&ss.inverted_heap, HASH_FUNCTION, +#if TRACEROOT_USE_ABSL_HASHMAP + void* inverted_heap = new_absl_hashmap(size); + ss.inverted_heap = inverted_heap; +#else + ss.inverted_heap = malloc(sizeof(struct hopscotch_table)); + hopscotch_create(ss.inverted_heap, HASH_FUNCTION, 4, // XXX: half the word size if 64-bit size /* initial size */, 0 /* default hop range */); +#endif // Add one pointer due to inability to use the first // two words of the scratchpad. uword_t scratchpad_min_size = (1 + ss.n_pointers) * 2 * sizeof (uint32_t); @@ -857,23 +881,30 @@ static void compute_heap_inverse(boolean keep_leaves, #endif ss.record_ptrs = 1; scan_spaces(&ss); - *inverted_heap = ss.inverted_heap; *scratchpad = ss.scratchpad; #if HAVE_GETRUSAGE getrusage(RUSAGE_SELF, &after); // We're done building the necessary structure. Show some memory stats. if (heap_trace_verbose) { + int count; + int capacity; +#if TRACEROOT_USE_ABSL_HASHMAP + count = absl_hashmap_size(ss.inverted_heap, &capacity); +#else + count = ss.inverted_heap->count; + capacity = 1+hopscotch_max_key_index(*ss.inverted_heap); +#endif #define timediff(b,a,field) \ ((a.field.tv_sec-b.field.tv_sec)*1000000+(a.field.tv_usec-b.field.tv_usec)) + float stime = timediff(before, after, ru_stime); + float utime = timediff(before, after, ru_utime); fprintf(stderr, - "Inverted heap: ct=%d, cap=%d, LF=%f ET=%ld+%ld sys+usr\n", - inverted_heap->count, - 1+hopscotch_max_key_index(*inverted_heap), - 100*(float)inverted_heap->count / (1+hopscotch_max_key_index(*inverted_heap)), - timediff(before, after, ru_stime), - timediff(before, after, ru_utime)); + "Inverted heap: ct=%d, cap=%d, LF=%f ET=%f+%f sys+usr=%f\n", + count, capacity, 100*(float)count / (capacity>0?capacity:1), + stime/1000000, utime/1000000, (stime+utime)/1000000); } #endif + return ss.inverted_heap; }; /* Return true if the user wants to find a leaf object. @@ -902,7 +933,7 @@ static int trace_paths(void (*context_scanner)(), int criterion) { int i; - struct hopscotch_table inverted_heap; + void* inverted_heap; struct scratchpad scratchpad; // A hashset of all objects in the reverse reachability graph so far struct hopscotch_table visited; // *Without* lowtag @@ -916,8 +947,8 @@ static int trace_paths(void (*context_scanner)(), fprintf(stderr, " %p%s", (void*)pins[i], ((i%8)==7||i==n_pins-1)?"\n":""); } - compute_heap_inverse(finding_leaf_p(weak_pointers), - &inverted_heap, &scratchpad); + inverted_heap = compute_heap_inverse(finding_leaf_p(weak_pointers), + &scratchpad); hopscotch_create(&visited, HASH_FUNCTION, 0, 32, 0); hopscotch_create(&targets, HASH_FUNCTION, 0, 32, 0); i = 0; @@ -933,7 +964,7 @@ static int trace_paths(void (*context_scanner)(), hopscotch_reset(&targets); lispobj path = trace1(canonical_obj(value), &targets, &visited, - &inverted_heap, &scratchpad, + inverted_heap, &scratchpad, n_pins, pins, context_scanner, criterion); if ((VECTOR(paths)->data[i] = path) != 0) ++n_found; } @@ -941,7 +972,12 @@ static int trace_paths(void (*context_scanner)(), } while (weak_pointers != NIL); ensure_region_closed(&boxed_region, BOXED_PAGE_FLAG); os_invalidate(scratchpad.base, scratchpad.end-scratchpad.base); - hopscotch_destroy(&inverted_heap); +#if TRACEROOT_USE_ABSL_HASHMAP + absl_hashmap_destroy(inverted_heap); +#else + hopscotch_destroy(inverted_heap); + free(inverted_heap); +#endif hopscotch_destroy(&visited); hopscotch_destroy(&targets); return n_found; From fa7643753b22405d8e0ba1e4a04b29f9c4b48b13 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 18 May 2020 10:13:48 -0400 Subject: [PATCH 0017/4023] Compactify traceroot output of lists --- src/code/traceroot.lisp | 90 ++++++++++++++++++++++++------------- tests/traceroot.impure.lisp | 28 ++++++++++++ 2 files changed, 88 insertions(+), 30 deletions(-) diff --git a/src/code/traceroot.lisp b/src/code/traceroot.lisp index e8af618bb2..f5d3b5fcb9 100644 --- a/src/code/traceroot.lisp +++ b/src/code/traceroot.lisp @@ -7,11 +7,12 @@ ;;;; provided with absolutely no warranty. See the COPYING and CREDITS ;;;; files for more information. -(in-package "SB-EXT") +(in-package "SB-IMPL") ;;; Not loaded until warm build. package-data-list only affects symbols ;;; that are visible to genesis. -(export '(search-roots)) +(eval-when (:compile-toplevel :load-toplevel :execute) + (export '(sb-ext::search-roots) 'sb-ext)) (define-alien-variable "gc_object_watcher" unsigned) (define-alien-variable "gc_traceroot_criterion" int) @@ -55,33 +56,58 @@ ;; ;;; The rest of the path is a list of (OBJECT . WORD-INDEX). (defun preprocess-traceroot-results (inputs outputs &aux results) - (dovector (path outputs (nreverse results)) - (let ((target (weak-pointer-value (pop inputs)))) - (when (and target (listp path)) - (setq path (nreverse path)) - (let* ((root (car path)) - (root-kind (car root))) - (if (eq root-kind 0) ; heap object - (rplaca path :static) - (let* ((thread (find-lisp-thread-from-thread-struct - (ash (cadr root) sb-vm:n-fixnum-tag-bits))) - (extra (cddr root)) - (symbol - (unless (eql root-kind 1) - #+sb-thread - (find-symbol-from-tls-index (ash extra sb-vm:n-fixnum-tag-bits)) - #-sb-thread - extra))) - (awhen (and thread (sb-thread:thread-name thread)) - (setq thread it)) ; if nameless, just show as # - (rplaca path (ecase root-kind - (1 ; control stack - (if thread - `(,thread ,extra) - :pinned)) - (2 `(,thread ,symbol nil)) ; binding stack - (3 `(,thread ,symbol t))))))) ; TLS - (push (cons target path) results))))) + (flet ((collapse-lists (input) + (let* ((path (coerce input 'vector)) + (path-length (length path)) + (index (- path-length 2))) + ;; Combine successive CDR operations by scanning right-to-left + ;; for adjacent entries that represent two CDR operations. + ;; Repeat until nothing else can be spliced out. + ;; This entails just 1 linear scan. A left-to-right algorithm + ;; would be less efficient. + (loop + (when (< index 1) + (return (coerce (subseq path 0 path-length) 'list))) + (let* ((this-node (aref path index)) + (this-object (car this-node)) + (successor-index (1+ index)) + (successor-node (aref path successor-index)) + (successor-object (car successor-node))) + (when (and (consp this-object) + (consp successor-object) + (eql (cdr this-node) 1) ; operation is CDR + (>= (cdr successor-node) 1)) ; operation is 1 or more CDRs + (setf (cdr this-node) (1+ (cdr successor-node))) + (replace path path :start1 successor-index :start2 (1+ successor-index)) + (decf path-length)) + (decf index)))))) + (dovector (path outputs (nreverse results)) + (let ((target (weak-pointer-value (pop inputs)))) + (when (and target (listp path)) + (setq path (nreverse path)) + (let* ((root (car path)) + (root-kind (car root))) + (if (eq root-kind 0) ; heap object + (rplaca path :static) + (let* ((thread (find-lisp-thread-from-thread-struct + (ash (cadr root) sb-vm:n-fixnum-tag-bits))) + (extra (cddr root)) + (symbol + (unless (eql root-kind 1) + #+sb-thread + (find-symbol-from-tls-index (ash extra sb-vm:n-fixnum-tag-bits)) + #-sb-thread + extra))) + (awhen (and thread (sb-thread:thread-name thread)) + (setq thread it)) ; if nameless, just show as # + (rplaca path (ecase root-kind + (1 ; control stack + (if thread + `(,thread ,extra) + :pinned)) + (2 `(,thread ,symbol nil)) ; binding stack + (3 `(,thread ,symbol t))))))) ; TLS + (push (cons target (collapse-lists path)) results)))))) (defun print-traceroot-path (path &key (stream *standard-output*) (multiline t)) (destructuring-bind (target root . rest) path @@ -117,7 +143,11 @@ pathname sb-impl::host hash-table) (format stream "~S~%" obj)) (t - (format stream "a ~(~a~)~%" (type-of obj)))))))) + (format stream "a ~(~a~)" (type-of obj)) + (when (consp obj) + (write-string " = " stream) + (write obj :stream stream :level 1 :length 3 :pretty nil)) + (terpri))))))) (t (let ((*print-pretty* nil)) (when (consp root) diff --git a/tests/traceroot.impure.lisp b/tests/traceroot.impure.lisp index e6edcca132..5f9122d86b 100644 --- a/tests/traceroot.impure.lisp +++ b/tests/traceroot.impure.lisp @@ -76,3 +76,31 @@ (with-test (:name (sb-ext:search-roots :stack-direct) :fails-on :sunos) (f0)) + +;;; Employ circumlocution so the file loader doesn't hold on to a string "hi" +(defvar *string-hi* (make-weak-pointer (concatenate 'string "h" "i"))) +(defstruct s1 foo) +(defparameter *top* + `(p q r w x y ,(make-s1 :foo `#((a b c ,(weak-pointer-value *string-hi*) d))) z)) + +;;; Sample output: +;;; Path to "hi": +;;; 6 1000209AB3 [ 1] a package-hashtable +;;; 1 10048F145F [ 29] a (simple-vector 37) +;;; 1 503B403F [ 2] COMMON-LISP-USER::*TOP* +;;; 0 1004B885B7 [ 6] a cons = (P Q R ...) ; = (NTHCDR 6 object) +;;; 0 1004B88617 [ 0] a cons = (# Z) +;;; 0 1004C1AA53 [ 1] a s1 +;;; 0 1004CBB93F [ 2] a (simple-vector 1) +;;; 0 1004D28AE7 [ 3] a cons = (A B C ...) ; = (NTHCDR 3 object) +;;; 0 1004D28B17 [ 0] a cons = ("hi" D) +(with-test (:name :traceroot-collapse-lists) + (let* ((string (with-output-to-string (*standard-output*) + (search-roots *string-hi* :print :verbose))) + (lines (split-string string #\newline))) + (assert + (loop for line in lines + thereis (search "[ 6] a cons = (P Q R ...)" line))) + (assert + (loop for line in lines + thereis (search "[ 3] a cons = (A B C ...)" line))))) From 096fb1f6f16d9cff494e57d84634a7d15757ab4b Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Fri, 3 May 2019 18:48:13 -0700 Subject: [PATCH 0018/4023] Update arm assembly to build with clang. --- src/runtime/arm-assem.S | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/runtime/arm-assem.S b/src/runtime/arm-assem.S index b0b3730761..03f297f5b8 100644 --- a/src/runtime/arm-assem.S +++ b/src/runtime/arm-assem.S @@ -28,7 +28,7 @@ call_into_lisp: @@ All registers other than R0-R3 and R12 are callee-saves. @@ Save R3 to get 8-byte alignemnt. stmfd sp!, {r3-r11, lr} - fstmfdd sp!, {d8-d15} + vstmdb sp!, {d8-d15} @@ Start by finding NIL. ldr reg_NULL, .known_nil @@ -128,7 +128,7 @@ call_into_lisp: blxne reg_OCFP @@ Restore saved registers. - fldmfdd sp!, {d8-d15} + vldmia sp!, {d8-d15} ldmfd sp!, {r3-r11, lr} bx lr .size call_into_lisp, .-call_into_lisp @@ -315,12 +315,12 @@ name: \ stmea r4, {r0-reg_LEXENV, r8} ;\ \ ldr r0, [sp, #4*4] ;\ - fstmfdd sp!, {d0-d7} ;\ + vstmdb sp!, {d0-d7} ;\ \ mov lr, pc ;\ ldr pc,=entry ;\ \ - fldmfdd sp!, {d0-d7} ;\ + vldmia sp!, {d0-d7} ;\ str r0, [sp, #4*4] ;\ ldr r4, STATIC_SYMBOL_VALUE(CONTROL_STACK_POINTER) ;\ ldmea r4, {r0-reg_LEXENV, r8} ;\ From 8b5ab4c3c91cb65bc54ff309d91d37a77755a871 Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Fri, 3 May 2019 18:51:51 -0700 Subject: [PATCH 0019/4023] Add support for arm on openbsd --- src/compiler/arm/insts.lisp | 4 +-- src/compiler/arm/parms.lisp | 10 +++++--- src/compiler/target-disassem.lisp | 4 ++- src/runtime/Config.arm-openbsd | 16 ++++++++++++ src/runtime/arm-assem.S | 2 +- src/runtime/arm-bsd-os.c | 42 +++++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 src/runtime/Config.arm-openbsd diff --git a/src/compiler/arm/insts.lisp b/src/compiler/arm/insts.lisp index b8ed214fce..5b76103b43 100644 --- a/src/compiler/arm/insts.lisp +++ b/src/compiler/arm/insts.lisp @@ -752,10 +752,10 @@ ;;; generation instruction, or breakpoint. (define-instruction debug-trap (segment) (:printer debug-trap ((opcode-32 #+linux #xe7f001f0 - #+netbsd #xe7ffdefe)) + #+(or netbsd openbsd) #xe7ffdefe)) :default :control #'debug-trap-control) (:emitter - (emit-word segment #+linux #xe7f001f0 #+netbsd #xe7ffdefe))) + (emit-word segment #+linux #xe7f001f0 #+(or netbsd openbsd) #xe7ffdefe))) ;;;; Miscellaneous arithmetic instructions diff --git a/src/compiler/arm/parms.lisp b/src/compiler/arm/parms.lisp index 4ea344303d..348b9974f9 100644 --- a/src/compiler/arm/parms.lisp +++ b/src/compiler/arm/parms.lisp @@ -19,7 +19,7 @@ (defconstant +backend-fasl-file-implementation+ :arm) ;; Minumum observed value, not authoritative. -(defconstant +backend-page-bytes+ #+linux 4096 #+netbsd 8192) +(defconstant +backend-page-bytes+ #-netbsd 4096 #+netbsd 8192) ;;; The size in bytes of GENCGC cards, i.e. the granularity at which ;;; writes to old generations are logged. With mprotect-based write @@ -110,7 +110,11 @@ (defconstant linkage-table-space-end #x0b000000)) #+gencgc -(!gencgc-space-setup #x04000000 :dynamic-space-start #x4f000000) +(progn + #+(or linux netbsd) + (!gencgc-space-setup #x04000000 :dynamic-space-start #x4f000000) + #+openbsd + (!gencgc-space-setup #x04000000 :dynamic-space-start #x10000000)) (defconstant linkage-table-growth-direction :down) (defconstant linkage-table-entry-size 16) @@ -120,7 +124,7 @@ (setq *linkage-space-predefined-entries* '(("alloc_tramp" t) ("list_alloc_tramp" t))) -#+(or linux netbsd) +#+(or linux netbsd openbsd) (progn #-gencgc (progn diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index fb3e1ab6ac..1febcfb92f 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -2311,7 +2311,9 @@ (type (member :little-endian :big-endian) byte-order)) (if (or (eq length 1) (and (eq byte-order #+big-endian :big-endian #+little-endian :little-endian) - #-(or arm arm64 ppc ppc64 x86 x86-64) ; unaligned loads are ok for these + ;; unaligned loads are ok for these + #-(or (and arm (not openbsd)) ; openbsd enables alignment faults + arm64 ppc ppc64 x86 x86-64) (not (logtest (1- length) (sap-int (sap+ sap offset)))))) (locally (declare (optimize (safety 0))) ; disregard shadow memory for msan diff --git a/src/runtime/Config.arm-openbsd b/src/runtime/Config.arm-openbsd new file mode 100644 index 0000000000..1c0c75bb5f --- /dev/null +++ b/src/runtime/Config.arm-openbsd @@ -0,0 +1,16 @@ +# -*- makefile -*- for the C-level run-time support for SBCL + +# This software is part of the SBCL system. See the README file for +# more information. +# +# This software is derived from the CMU CL system, which was +# written at Carnegie Mellon University and released into the +# public domain. The software is in the public domain and is +# provided with absolutely no warranty. See the COPYING and CREDITS +# files for more information. + +include Config.arm-bsd +include Config.generic-openbsd + +OS_LIBS += -larm +LINKFLAGS += -Wl,--export-dynamic diff --git a/src/runtime/arm-assem.S b/src/runtime/arm-assem.S index 03f297f5b8..0eb92a1f5c 100644 --- a/src/runtime/arm-assem.S +++ b/src/runtime/arm-assem.S @@ -345,7 +345,7 @@ DEFINE_TRAMPOLINE(list_alloc_tramp, alloc_list) do_pending_interrupt: #if defined(LISP_FEATURE_LINUX) .word 0xe7f001f0 -#elif defined(LISP_FEATURE_NETBSD) +#elif defined(LISP_FEATURE_NETBSD) || defined(LISP_FEATURE_OPENBSD) .word 0xe7ffdefe #endif .byte trap_PendingInterrupt diff --git a/src/runtime/arm-bsd-os.c b/src/runtime/arm-bsd-os.c index b91a9278bd..9444b0e455 100644 --- a/src/runtime/arm-bsd-os.c +++ b/src/runtime/arm-bsd-os.c @@ -60,6 +60,8 @@ int arch_os_thread_cleanup(struct thread *thread) { } #endif +#if defined(LISP_FEATURE_NETBSD) + os_context_register_t * os_context_register_addr(os_context_t *context, int offset) { @@ -71,6 +73,34 @@ os_context_register_addr(os_context_t *context, int offset) return &context->uc_mcontext.__gregs[offset]; } +#elif defined(LISP_FEATURE_OPENBSD) + +os_context_register_t * +os_context_register_addr(os_context_t *context, int offset) +{ + switch (offset) { + case 0: return (os_context_register_t *)(&context->sc_r0); + case 1: return (os_context_register_t *)(&context->sc_r1); + case 2: return (os_context_register_t *)(&context->sc_r2); + case 3: return (os_context_register_t *)(&context->sc_r3); + case 4: return (os_context_register_t *)(&context->sc_r4); + case 5: return (os_context_register_t *)(&context->sc_r5); + case 6: return (os_context_register_t *)(&context->sc_r6); + case 7: return (os_context_register_t *)(&context->sc_r7); + case 8: return (os_context_register_t *)(&context->sc_r8); + case 9: return (os_context_register_t *)(&context->sc_r9); + case 10: return (os_context_register_t *)(&context->sc_r10); + case 11: return (os_context_register_t *)(&context->sc_r11); + case 12: return (os_context_register_t *)(&context->sc_r12); + case reg_NSP: return (os_context_register_t *)(&context->sc_usr_sp); + case reg_LR: return (os_context_register_t *)(&context->sc_usr_lr); + case reg_PC: return (os_context_register_t *)(&context->sc_pc); + } + lose("illegal register number: %d", offset); +} + +#endif + os_context_register_t * os_context_pc_addr(os_context_t *context) { @@ -83,12 +113,24 @@ os_context_lr_addr(os_context_t *context) return os_context_register_addr(context, reg_LR); } +#if defined(LISP_FEATURE_OPENBSD) + +void +os_restore_fp_control(os_context_t *context) +{ + asm ("fmxr fpscr,%0" : : "r" (context->sc_fpscr)); +} + +#else + void os_restore_fp_control(os_context_t *context) { /* FIXME: Implement. */ } +#endif + void os_flush_icache(os_vm_address_t address, os_vm_size_t length) { From 5b993c8fadfc970736e82d4c60fb3a5728b5d2be Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Fri, 3 May 2019 18:53:00 -0700 Subject: [PATCH 0020/4023] Update arm64 assembly to build with clang --- src/runtime/arm64-assem.S | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/runtime/arm64-assem.S b/src/runtime/arm64-assem.S index 07b4db3d03..520d433a35 100644 --- a/src/runtime/arm64-assem.S +++ b/src/runtime/arm64-assem.S @@ -49,7 +49,7 @@ /* the CSP page sits right before the thread */ # define THREAD_SAVED_CSP_OFFSET (-N_WORD_BYTES) #endif - .align + .align 2 .global call_into_lisp .type call_into_lisp, %function call_into_lisp: @@ -174,7 +174,7 @@ no_args: .align 4 .equ .lra, .+OTHER_POINTER_LOWTAG - .dword RETURN_PC_WIDETAG + .xword RETURN_PC_WIDETAG // Correct stack pointer for return processing. csel reg_CSP, reg_OCFP, reg_CSP, eq @@ -220,7 +220,7 @@ no_args: .size call_into_lisp, .-call_into_lisp - .align + .align 2 .global call_into_c .type call_into_c, %function call_into_c: @@ -351,7 +351,7 @@ call_into_c: // FIXME-ARM: The following is random garbage, to make // code/debug-int compile. To get the debugger working, this // needs to be implemented. - .align + .align 2 .global fun_end_breakpoint_guts .type fun_end_breakpoint_guts, %object fun_end_breakpoint_guts: @@ -362,7 +362,7 @@ fun_end_breakpoint_trap: .global fun_end_breakpoint_end fun_end_breakpoint_end: - .align + .align 2 .global do_pending_interrupt .type do_pending_interrupt, %function do_pending_interrupt: From c9516862c27d15f601ba89f8019acc0463077359 Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Wed, 11 Mar 2020 08:33:21 -0700 Subject: [PATCH 0021/4023] Implement funcall1_switching_stack on arm64 --- src/runtime/arm64-assem.S | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/runtime/arm64-assem.S b/src/runtime/arm64-assem.S index 520d433a35..2b456ac8cd 100644 --- a/src/runtime/arm64-assem.S +++ b/src/runtime/arm64-assem.S @@ -1,6 +1,7 @@ #include "globals.h" #include "lispregs.h" #include "sbcl.h" +#include "validate.h" #include "genesis/closure.h" #include "genesis/funcallable-instance.h" @@ -49,6 +50,36 @@ /* the CSP page sits right before the thread */ # define THREAD_SAVED_CSP_OFFSET (-N_WORD_BYTES) #endif + + +#ifdef OS_THREAD_STACK + .align 2 + .global funcall1_switching_stack + .type funcall1_switching_stack, %function +funcall1_switching_stack: + /* The arguments are switched, funcall1_switching_stack(arg, function) + to avoid shuffling registers + */ + /* save FP and LR to old stack */ + stp x29, x30, [sp, #-16]! + mov x29, sp + /* switch to new stack */ + ldr x9, [x0, #THREAD_ALIEN_STACK_START_OFFSET] + add x9, x9, #ALIEN_STACK_SIZE >> 12, lsl #12 +#if ALIEN_STACK_SIZE % 0x1000 != 0 + add x9, x9, #ALIEN_STACK_SIZE & 0xfff +#endif + sub sp, x9, #16 + /* call function */ + blr x1 + /* restore old SP, FP, LR and return */ + add sp, x29, #16 + ldp x29, x30, [x29] + ret + .size funcall1_switching_stack, .-funcall1_switching_stack +#endif + + .align 2 .global call_into_lisp .type call_into_lisp, %function From d2295c4824065634c04c845d9792d423e0bc017f Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Fri, 3 May 2019 18:53:57 -0700 Subject: [PATCH 0022/4023] Add support for arm64 on openbsd --- make-config.sh | 1 + src/compiler/arm64/parms.lisp | 2 +- src/runtime/Config.arm64-bsd | 28 ++++++++ src/runtime/Config.arm64-openbsd | 15 +++++ src/runtime/arm64-bsd-os.c | 111 +++++++++++++++++++++++++++++++ src/runtime/arm64-bsd-os.h | 12 ++++ 6 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 src/runtime/Config.arm64-bsd create mode 100644 src/runtime/Config.arm64-openbsd create mode 100644 src/runtime/arm64-bsd-os.c create mode 100644 src/runtime/arm64-bsd-os.h diff --git a/make-config.sh b/make-config.sh index 1e86051928..d14e3e3c02 100755 --- a/make-config.sh +++ b/make-config.sh @@ -374,6 +374,7 @@ case `uname -m` in parisc*) guessed_sbcl_arch=hppa ;; 9000/800) guessed_sbcl_arch=hppa ;; mips*) guessed_sbcl_arch=mips ;; + arm64) guessed_sbcl_arch=arm64 ;; *arm*) guessed_sbcl_arch=arm ;; aarch64) guessed_sbcl_arch=arm64 ;; riscv32) guessed_sbcl_arch=riscv xlen=32;; diff --git a/src/compiler/arm64/parms.lisp b/src/compiler/arm64/parms.lisp index 0c70da8ffa..20728ae1ce 100644 --- a/src/compiler/arm64/parms.lisp +++ b/src/compiler/arm64/parms.lisp @@ -103,7 +103,7 @@ (defconstant linkage-table-space-start #x0a000000) (defconstant linkage-table-space-end #x0b000000) - #+linux + #+(or linux openbsd) (progn (defparameter dynamic-0-space-start #x4f000000) (defparameter dynamic-0-space-end #x66fff000))) diff --git a/src/runtime/Config.arm64-bsd b/src/runtime/Config.arm64-bsd new file mode 100644 index 0000000000..b6b06b92e0 --- /dev/null +++ b/src/runtime/Config.arm64-bsd @@ -0,0 +1,28 @@ +# -*- makefile -*- for the C-level run-time support for SBCL + +# This software is part of the SBCL system. See the README file for +# more information. +# +# This software is derived from the CMU CL system, which was +# written at Carnegie Mellon University and released into the +# public domain. The software is in the public domain and is +# provided with absolutely no warranty. See the COPYING and CREDITS +# files for more information. + +ASSEM_SRC = arm64-assem.S +ARCH_SRC = arm64-arch.c + +OS_SRC = bsd-os.c arm64-bsd-os.c + +ifdef LISP_FEATURE_GENCGC + GC_SRC = fullcgc.c gencgc.c traceroot.c +else + GC_SRC = cheneygc.c +endif +ifdef LISP_FEATURE_SB_CORE_COMPRESSION + OS_LIBS += -lz +endif + +# Nothing to do for after-grovel-headers. +.PHONY: after-grovel-headers +after-grovel-headers: diff --git a/src/runtime/Config.arm64-openbsd b/src/runtime/Config.arm64-openbsd new file mode 100644 index 0000000000..929d8a627b --- /dev/null +++ b/src/runtime/Config.arm64-openbsd @@ -0,0 +1,15 @@ +# -*- makefile -*- for the C-level run-time support for SBCL + +# This software is part of the SBCL system. See the README file for +# more information. +# +# This software is derived from the CMU CL system, which was +# written at Carnegie Mellon University and released into the +# public domain. The software is in the public domain and is +# provided with absolutely no warranty. See the COPYING and CREDITS +# files for more information. + +include Config.arm64-bsd +include Config.generic-openbsd + +LINKFLAGS += -Wl,--export-dynamic diff --git a/src/runtime/arm64-bsd-os.c b/src/runtime/arm64-bsd-os.c new file mode 100644 index 0000000000..a01dbd4ff3 --- /dev/null +++ b/src/runtime/arm64-bsd-os.c @@ -0,0 +1,111 @@ +/* + * This is the ARM BSD incarnation of arch-dependent OS-dependent + * routines. See also "bsd-os.c". + */ + +/* + * This software is part of the SBCL system. See the README file for + * more information. + * + * This software is derived from the CMU CL system, which was + * written at Carnegie Mellon University and released into the + * public domain. The software is in the public domain and is + * provided with absolutely no warranty. See the COPYING and CREDITS + * files for more information. + */ + +#include +#include +#include +#include "sbcl.h" +#include "./signal.h" +#include "os.h" +#include "arch.h" +#include "globals.h" +#include "interrupt.h" +#include "interr.h" +#include "lispregs.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "validate.h" +size_t os_vm_page_size; + + +int arch_os_thread_init(struct thread *thread) { + stack_t sigstack; +#ifdef LISP_FEATURE_SB_THREAD +#ifdef LISP_FEATURE_GCC_TLS + current_thread = thread; +#else + pthread_setspecific(specials,thread); +#endif +#endif + /* Signal handlers are normally run on the main stack, but we've + * swapped stacks, require that the control stack contain only + * boxed data, and expands upwards while the C stack expands + * downwards. */ + sigstack.ss_sp = calc_altstack_base(thread); + sigstack.ss_flags = 0; + sigstack.ss_size = calc_altstack_size(thread); + if(sigaltstack(&sigstack,0)<0) + lose("Cannot sigaltstack: %s\n",strerror(errno)); + + return 1; /* success */ +} +int arch_os_thread_cleanup(struct thread *thread) { + return 1; /* success */ +} + +#if defined(LISP_FEATURE_OPENBSD) + +os_context_register_t * +os_context_register_addr(os_context_t *context, int regno) +{ + switch (regno) { + case reg_LR: return (&context->sc_lr); + case reg_NSP: return (&context->sc_sp); + default: return (&context->sc_x[regno]); + } +} + +os_context_register_t * +os_context_pc_addr(os_context_t *context) +{ + return (&context->sc_elr); +} + +os_context_register_t * +os_context_float_register_addr(os_context_t *context, int offset) +{ + return NULL; +} + +void +os_restore_fp_control(os_context_t *context) +{ +} + +#endif + +os_context_register_t * +os_context_lr_addr(os_context_t *context) +{ + return os_context_register_addr(context, reg_LR); +} + +void +os_flush_icache(os_vm_address_t address, os_vm_size_t length) +{ + os_vm_address_t end_address + = (os_vm_address_t)(((uintptr_t) address) + length); + __clear_cache(address, end_address); +} diff --git a/src/runtime/arm64-bsd-os.h b/src/runtime/arm64-bsd-os.h new file mode 100644 index 0000000000..f014d81595 --- /dev/null +++ b/src/runtime/arm64-bsd-os.h @@ -0,0 +1,12 @@ +#ifndef _ARM64_BSD_OS_H +#define _ARM64_BSD_OS_H + +typedef long os_context_register_t; + +#include "arch-os-generic.inc" + +unsigned long os_context_fp_control(os_context_t *context); +#define RESTORE_FP_CONTROL_FROM_CONTEXT +void os_restore_fp_control(os_context_t *context); + +#endif /* _ARM64_BSD_OS_H */ From 88659991308eec6772687feb7a4d41bf6ce184f6 Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Thu, 9 Apr 2020 12:50:23 -0700 Subject: [PATCH 0023/4023] Force bytecode compilation in host-2 under ecl to speed things up. --- make-host-2.lisp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/make-host-2.lisp b/make-host-2.lisp index 88f9747742..8ddaef08ce 100644 --- a/make-host-2.lisp +++ b/make-host-2.lisp @@ -14,6 +14,9 @@ ;; Supress function/macro redefinition warnings under clisp. #+clisp (setf custom:*suppress-check-redefinition* t) +;; Avoid natively compiling new code under ecl +#+ecl (ext:install-bytecodes-compiler) + ;;; Run the cross-compiler to produce cold fasl files. (setq sb-c::*track-full-called-fnames* :minimal) ; Change this as desired (setq sb-c::*static-vop-usage-counts* (make-hash-table)) From 4aeee3b8cc0ff67b1eff7b646b386fad9360a713 Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Mon, 18 May 2020 09:13:59 -0700 Subject: [PATCH 0024/4023] Skip RUN-PROGRAM CHILD-FD-LEAK test on OpenBSD. OpenBSD's /dev/fd/ is insufficiently magic, device nodes will exist there even if a descriptor isn't open. --- tests/run-program.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index 0a9e71e8a6..82f4a25441 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -443,7 +443,7 @@ (mapc #'sb-thread:join-thread threads))) (with-test (:name (run-program :child-fd-leak) - :skipped-on :win32) + :skipped-on (or :openbsd :win32)) (when (probe-file "/dev/fd") (with-open-file (stream "/dev/null") (let* ((fd (sb-sys:fd-stream-fd stream)) From 374f44543bb4ce811a9fa391473a03fc0abf1ad7 Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Mon, 18 May 2020 09:18:07 -0700 Subject: [PATCH 0025/4023] Disable the noop dlclose test when RTLD_NOLOAD isn't defined. --- tests/foreign.test.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/foreign.test.sh b/tests/foreign.test.sh index d46d0f3033..1139d91b59 100755 --- a/tests/foreign.test.sh +++ b/tests/foreign.test.sh @@ -150,6 +150,7 @@ cat > $TEST_FILESTEM-noop-dlclose-test.c < int dlclose_is_noop () { +#ifdef RTLD_NOLOAD void * handle = dlopen("./$TEST_FILESTEM-noop-dlclose-test-helper.so", RTLD_NOW | RTLD_GLOBAL); dlclose(handle); @@ -157,6 +158,7 @@ int dlclose_is_noop () { if (handle != NULL) { return 1; } +#endif return 0; } EOF From 0641ae5944beedbb377b90309c5634ca15483e67 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 18 May 2020 14:49:29 -0400 Subject: [PATCH 0026/4023] Bypass ALLOCATE-INSTANCE in obsolete instance trap Calling it does not seem to accord with the AMOP where it says that new slot storage is created, and does not say new "instance". (I don't have the exact wording, and my paper copy is currently inaccessible). None of {ABCL, CLISP, ECL} call ALLOCATE-INSTANCE in the obsolete instance protocol. Other implementations do, so it's seemingly neither wrong nor required to do so; but it's definitely unportable for user code to depend on one way or the other. --- src/pcl/std-class.lisp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index 92267a7453..b378118559 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -1549,16 +1549,9 @@ ((layout-for-pcl-obj-p owrapper) (binding* ((class (wrapper-class* nwrapper)) (oslots (get-slots instance)) - ((nslots nwrapper) - ;; All we need is a new backing store, but I guess we have - ;; to go through ALLOCATE-INSTANCE - is that per AMOP ? - ;; Anyway, let's render the new instance unusable. - (let ((copy (allocate-instance class))) - (if (std-instance-p copy) - (values (shiftf (%std-instance-slots copy) 0) - (%instance-layout copy)) - (values (shiftf (%fsc-instance-slots copy) 0) - (%fun-layout copy))))) + (nwrapper (class-wrapper class)) + (nslots (make-array (layout-length nwrapper) + :initial-element +slot-unbound+)) (added ()) (discarded ()) (plist ()) From 5dc0752d0a38a60271e6b3ea2396b24d5334c4fd Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Mon, 18 May 2020 21:19:31 +0100 Subject: [PATCH 0027/4023] always dump named constants using their name Otherwise we can end up losing object identity even in situations where the programmer is skirting on the valid side of undefined behaviour. --- src/compiler/ir1util.lisp | 14 +++++++++----- tests/dump.impure-cload.lisp | 12 ++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 965c4d76a9..097408158e 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -2509,6 +2509,9 @@ is :ANY, the function name is not checked." #-sb-xc-host (when (and (not faslp) (simple-string-p object)) (logically-readonlyize object nil)) + ;; refer to named structured constants through their name + (when (and faslp (not (sb-fasl:dumpable-layout-p object)) namep) + (maybe-emit-make-load-forms object name)) ;; Has this identical object been seen before? Bail out early if so. (awhen (and ns (gethash object (eq-constants ns))) (return-from find-constant it)) @@ -2522,14 +2525,15 @@ is :ANY, the function name is not checked." ;; by the similarity table (as currently implemented) (or (not (sb-xc:typep object 'instance)) (sb-xc:typep object 'pathname))))) - (when effectively-coalescible + ;; constants referred to by name must retain their identity: + ;; they must not be coalesced with some other similar-enough + ;; constant. + (when (and effectively-coalescible (not namep)) (dolist (candidate (gethash object (similar-constants ns))) (when (similarp (constant-value candidate) object) (return-from find-constant candidate)))) - (when (and faslp (not (sb-fasl:dumpable-layout-p object))) - (if namep - (maybe-emit-make-load-forms object name) - (maybe-emit-make-load-forms object))) + (when (and faslp (not (sb-fasl:dumpable-layout-p object)) (not namep)) + (maybe-emit-make-load-forms object)) (let ((new (make-constant object))) (when ns (setf (gethash object (eq-constants ns)) new) diff --git a/tests/dump.impure-cload.lisp b/tests/dump.impure-cload.lisp index 1521628581..0ea4ea95e4 100644 --- a/tests/dump.impure-cload.lisp +++ b/tests/dump.impure-cload.lisp @@ -460,3 +460,15 @@ (with-test (:name (:cdr-eq-detection :lp1583753)) (constant-folding-cdr-test-fun)) + +(locally + (declare (optimize (debug 2) (safety 3))) + (defconstant +consy-constant+ (if (boundp '+consy-constant+) (symbol-value '+consy-constant+) '(message-id CAOrNaszM=eSufoqA4KFVNq4CUpjSJym-ktQnufQgj7a5g2sHmg@mail.gmail.com))) + (defun test-constant-identity (x) + (list '(message-id CAOrNaszM=eSufoqA4KFVNq4CUpjSJym-ktQnufQgj7a5g2sHmg@mail.gmail.com) + (eq x +consy-constant+)))) + +(with-test (:name (defconstant :reference :identity)) + (let ((z (eval `(test-constant-identity ,(intern "+CONSY-CONSTANT+"))))) + (assert (equal (car z) +consy-constant+)) + (assert (cadr z)))) From 2e4b301d6cd64b6760dfb83c594f319742ec08bf Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 18 May 2020 23:49:59 +0300 Subject: [PATCH 0028/4023] Fix run-program on FreeBSD, Solaris. They have closefrom() and their /dev/fd is not the same as on Darwin. --- src/runtime/run-program.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 6d5f94ac4b..9e2c415c06 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -142,23 +142,18 @@ int closefrom_fddir(char *dir, int lowfd) void closefds_from(int lowfd) { - int fds_closed = 0; - -#if defined(LISP_FEATURE_OPENBSD) \ - || defined(LISP_FEATURE_NETBSD) \ - || defined(LISP_FEATURE_DRAGONFLY) +#if defined(LISP_FEATURE_OPENBSD) || defined(LISP_FEATURE_NETBSD) \ + || defined(LISP_FEATURE_DRAGONFLY) || defined(LISP_FEATURE_FREEBSD) \ + || defined(LISP_FEATURE_SUNOS) closefrom(lowfd); #else - -#ifdef F_CLOSEM - if (!fds_closed) - fds_closed = (-1 != fcntl(lowfd, F_CLOSEM)); -#endif + int fds_closed = 0; #ifdef LISP_FEATURE_LINUX if (!fds_closed) fds_closed = !closefrom_fddir("/proc/self/fd/", lowfd); -#else +#endif +#ifdef LISP_FEATURE_DARWIN if (!fds_closed) fds_closed = !closefrom_fddir("/dev/fd/", lowfd); #endif From ff7afd2cbfc3f24569bab6dd1f3254a7b8039894 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 19 May 2020 04:27:00 +0300 Subject: [PATCH 0029/4023] Remove unused code in run-program.c --- src/runtime/GNUmakefile | 6 ++- src/runtime/run-program.c | 106 +------------------------------------- 2 files changed, 6 insertions(+), 106 deletions(-) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index 0ea096e1c1..d9ad52f82a 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -75,10 +75,14 @@ COMMON_SRC = alloc.c backtrace.c breakpoint.c coalesce.c coreparse.c \ dynbind.c funcall.c gc-common.c globals.c hopscotch.c \ interr.c interrupt.c largefile.c main.c \ monitor.c murmur_hash.c os-common.c parse.c print.c \ - purify.c pthread-futex.c regnames.c run-program.c runtime.c \ + purify.c pthread-futex.c regnames.c runtime.c \ safepoint.c save.c sc-offset.c search.c thread.c time.c \ validate.c var-io.c vars.c wrap.c +ifndef LISP_FEATURE_WIN32 +COMMON_SRC += run-program.c +endif + C_SRC = $(COMMON_SRC) ${ARCH_SRC} ${OS_SRC} ${GC_SRC} SRCS = $(C_SRC) ${ASSEM_SRC} diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 9e2c415c06..bfb31097f9 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -1,5 +1,5 @@ /* - * support for the Lisp function RUN-PROGRAM and friends + * Unix support for the Lisp function RUN-PROGRAM and friends */ /* @@ -14,9 +14,6 @@ */ #include "sbcl.h" - -#ifndef LISP_FEATURE_WIN32 - #include #include #include @@ -301,105 +298,4 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr, } _exit(failure_code); } -#else /* !LISP_FEATURE_WIN32 */ - -# include -# include -# include -# include -# include -# include - -#define READ_HANDLE 0 -#define WRITE_HANDLE 1 - -/* These functions do not attempt to deal with wchar_t variations. */ - -/* Get the value of _environ maintained by MSVCRT */ -char **msvcrt_environ ( void ) { - return ( _environ ); -} - -/* Set up in, out, err pipes and spawn a program, waiting or otherwise. */ -HANDLE spawn ( - const char *program, - const char *const *argv, - int in, - int out, - int err, - int search, - char *envp, - char *ptyname, - int wait, - char *pwd - ) -{ - int stdout_backup, stdin_backup, stderr_backup, wait_mode; - HANDLE hProcess; - HANDLE hReturn; - - /* Duplicate and save the original stdin/out/err handles. */ - stdout_backup = _dup ( _fileno ( stdout ) ); - stdin_backup = _dup ( _fileno ( stdin ) ); - stderr_backup = _dup ( _fileno ( stderr ) ); - - /* If we are not using stdin/out/err - * then duplicate the new pipes to current stdin/out/err handles. - * - * Default std fds are used if in, out or err parameters - * are -1. */ - - hReturn = (HANDLE)-1; - hProcess = (HANDLE)-1; - if ( ( out >= 0 ) && ( out != _fileno ( stdout ) ) ) { - if ( _dup2 ( out, _fileno ( stdout ) ) != 0 ) goto error_exit; - } - if ( ( in >= 0 ) && ( in != _fileno ( stdin ) ) ) { - if ( _dup2 ( in, _fileno ( stdin ) ) != 0 ) goto error_exit_out; - } - if ( ( err >= 0 ) && ( err != _fileno ( stderr ) ) ) { - if ( _dup2 ( err, _fileno ( stderr ) ) != 0 ) goto error_exit_in; - } - - /* Set the wait mode. */ - if ( 0 == wait ) { - wait_mode = P_NOWAIT; - } else { - wait_mode = P_WAIT; - } - - /* Change working directory if supplied. */ - if (pwd) { - if (chdir(pwd) < 0) { - goto error_exit; - } - } - - /* Spawn process given on the command line*/ - if (search) - hProcess = (HANDLE) spawnvp ( wait_mode, program, (char* const* )argv ); - else - hProcess = (HANDLE) spawnv ( wait_mode, program, (char* const* )argv ); - - /* Now that the process is launched, replace the original - * in/out/err handles and close the backups. */ - - if ( _dup2 ( stderr_backup, _fileno ( stderr ) ) != 0 ) goto error_exit; - error_exit_in: - if ( _dup2 ( stdin_backup, _fileno ( stdin ) ) != 0 ) goto error_exit; - error_exit_out: - if ( _dup2 ( stdout_backup, _fileno ( stdout ) ) != 0 ) goto error_exit; - - hReturn = hProcess; - - error_exit: - close ( stdout_backup ); - close ( stdin_backup ); - close ( stderr_backup ); - - return hReturn; - -} - -#endif /* !LISP_FEATURE_WIN32 */ From 3ad0cd7eea8a960fe02d187aa23c5537f401b262 Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Tue, 19 May 2020 08:18:57 -0700 Subject: [PATCH 0030/4023] Disable elfcore.test.sh on non-linux platforms It appears to be testing a linux-only feature and the script contains linuxy makefile bits. --- tests/elfcore.test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index 790d9cb4dc..132056ff35 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -17,7 +17,7 @@ export TEST_BASEDIR=${TMPDIR:-/tmp} . ./subr.sh run_sbcl --noinform < Date: Tue, 19 May 2020 22:07:59 -0400 Subject: [PATCH 0031/4023] Allow code-in-ELF for FreeBSD (probably *BSD) --- src/runtime/coreparse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index cdef9b3925..f6f70b84c0 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -83,7 +83,7 @@ open_binary(char *filename, int mode) return open(filename, mode); } -#if defined(LISP_FEATURE_LINUX) && defined(LISP_FEATURE_IMMOBILE_CODE) +#if defined(LISP_FEATURE_ELF) && defined(LISP_FEATURE_IMMOBILE_CODE) #define ELFCORE 1 #elif !defined(ELFCORE) #define ELFCORE 0 From 923b6af21c4f4370b3e320e0427248827674f4f5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 20 May 2020 17:17:52 -0400 Subject: [PATCH 0032/4023] Restore riscv build. Untested --- src/compiler/riscv/memory.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/riscv/memory.lisp b/src/compiler/riscv/memory.lisp index 3a35625a33..7dedf94394 100644 --- a/src/compiler/riscv/memory.lisp +++ b/src/compiler/riscv/memory.lisp @@ -31,7 +31,7 @@ (define-vop (set-instance-hashed) (:args (object :scs (descriptor-reg))) - (:temporary (:sc non-descriptor-reg) baseptr bit) + (:temporary (:sc non-descriptor-reg) baseptr bit temp) (:generator 5 (inst addi baseptr object (- instance-pointer-lowtag)) (inst li bit (ash 1 stable-hash-required-flag)) From e78f1947957cb5613ebc813d1ae55afcdc59620f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 20 May 2020 17:18:45 -0400 Subject: [PATCH 0033/4023] Improve EQL-HASH * Put SYMBOL-WIDETAG contiguous with the numeric widetags * Add a type proclamation for NUMBER-SXHASH * Change ENSURE-SYMBOL-HASH to SYMBOL-HASH within GETHASH because a symbol that was not yet hashed can't be in the table anyway. This avoids a conditional branch and reduces code size a little. --- src/code/target-hash-table.lisp | 84 +++++++++++++++++--------- src/code/target-sxhash.lisp | 1 + src/cold/shared.lisp | 16 +++-- src/compiler/generic/early-objdef.lisp | 29 ++++----- src/compiler/generic/utils.lisp | 5 ++ src/compiler/generic/vm-fndb.lisp | 1 + src/compiler/meta-vmdef.lisp | 6 +- src/compiler/ppc/cell.lisp | 4 +- src/compiler/ppc64/cell.lisp | 4 ++ src/compiler/sparc/cell.lisp | 4 +- src/compiler/x86-64/cell.lisp | 6 +- src/compiler/x86/cell.lisp | 4 +- 12 files changed, 109 insertions(+), 55 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 5677c1b99b..f90d7fce90 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -132,26 +132,42 @@ (values (pointer-hash key) (sb-vm:is-lisp-pointer (get-lisp-obj-address key)))) -#-sb-fluid (declaim (inline eql-hash)) -(defun eql-hash (key) - (declare (values fixnum (member t nil))) - (if (%other-pointer-subtype-p - key - ;; SYMBOL is listed here so that we can hash symbols address-insensitively. - ;; Given that we're already picking off a bunch of OTHER-POINTER objects - ;; and already calling SXHASH, the overhead is minimal. In fact, with suitably - ;; and rearranged widetags, this would be included in the numeric range. - '#.(list sb-vm:bignum-widetag sb-vm:ratio-widetag sb-vm:double-float-widetag - sb-vm:single-float-widetag - sb-vm:complex-widetag sb-vm:complex-single-float-widetag sb-vm:complex-double-float-widetag - sb-vm:symbol-widetag)) - (values (if (= (%other-pointer-widetag key) sb-vm:symbol-widetag) - (sxhash (truly-the symbol key)) - (number-sxhash key)) - nil) - ;; I don't want to add a case for INSTANCE-WITH-HASH-P here, - ;; but in the EQUAL and EQUAL hash functions, we do that. - (eq-hash key))) +(declaim (inline eql-hash eql-hash-no-memoize)) +(macrolet + ((define-eql-hash (name symbol-hash-fun) + `(defun ,name (key) + (declare (values fixnum (member t nil))) + (if (%other-pointer-subtype-p + key + ;; SYMBOL is listed here so that we can hash symbols address-insensitively. + ;; We have to pick off a bunch of OTHER-POINTER objects anyway, so there + ;; no overhead to extending the widetag range by 1 widetag. + '#.(list sb-vm:bignum-widetag sb-vm:ratio-widetag sb-vm:double-float-widetag + sb-vm:single-float-widetag + sb-vm:complex-widetag sb-vm:complex-single-float-widetag + sb-vm:complex-double-float-widetag + sb-vm:symbol-widetag)) + ;; NON-NULL-SYMBOL-P skips a test for NIL which is sensible, and we're + ;; excluding NIL anyway because it's not an OTHER-POINTER. + ;; To produce the best code for NON-NULL-SYMBOL-P (omitting a lowtag test) + ;; we need to force the compiler to see that KEY is definitely an + ;; OTHER-POINTER (cf OTHER-POINTER-TN-REF-P) because %OTHER-POINTER-SUBTYPE-P + ;; doesn't suffice, though it would be nice if it did. + (values (if (non-null-symbol-p + (truly-the (or (and number (not fixnum) #+64-bit (not single-float)) + (and symbol (not null))) + key)) + (,symbol-hash-fun (truly-the symbol key)) + (number-sxhash (truly-the number key))) + nil) + ;; Consider picking off %INSTANCEP too before using EQ-HASH ? + (eq-hash key))))) + (define-eql-hash eql-hash sxhash) ; via transform + ;; For GETHASH we should never compute a symbol-hash. If it hasn't been + ;; computed, KEY won't be found, and it doesn't matter what the hash is. + ;; This could theoretically avoid clearing the fixnum tag since the symbol + ;; is not n. + (define-eql-hash eql-hash-no-memoize symbol-hash)) #-sb-fluid (declaim (inline equal-hash)) (defun equal-hash (key) @@ -912,16 +928,26 @@ if there is no such entry. Entries can be added using SETF." ;; to keep things simple so that we don't have to pass in the names ;; of local variables to bind. (Being unhygienic on purpose) - (defun ht-hash-setup (std-fn) + (defun ht-hash-setup (std-fn caller) (if std-fn `(((hash0 address-based-p) ;; so many warnings about generic SXHASH - who cares (locally (declare (muffle-conditions compiler-note)) - ,(if (eq std-fn 'equal) - `(if (eq (hash-table-hash-fun table) #'equal-hash) - (equal-hash key) ; inlined - (funcall (hash-table-hash-fun table) key)) - `(,(symbolicate std-fn "-HASH") key)))) + ,(case std-fn + (eql + ;; GETHASH in an EQL table doesn't need to compute and writeback + ;; a hash into a symbol that didn't already have a hash. + ;; So the hash computation is a touch shorter by avoiding that. + `(,(if (eq caller 'gethash) 'eql-hash-no-memoize 'eql-hash) key)) + (equal + ;; EQUAL tables can opt out of using the stable instance hash + ;; to avoid increasing the length of all structures. + ;; There is no exposed interface to this; it's for system use. + `(if (eq (hash-table-hash-fun table) #'equal-hash) + (equal-hash key) ; inlined + (funcall (hash-table-hash-fun table) key))) + (t + `(,(symbolicate std-fn "-HASH") key))))) (hash (prefuzz-hash hash0))) '((hash0 (funcall (hash-table-hash-fun hash-table) key)) (address-based-p nil) @@ -1119,7 +1145,7 @@ nnnn 1_ any linear scan (/= cache 0)) ; don't falsely match the metadata cell (return-from ,name (values (aref kv-vector (1+ cache)) t)))) (with-pinned-objects (key) - (binding* (,@(ht-hash-setup std-fn) + (binding* (,@(ht-hash-setup std-fn 'gethash) (eq-test ,(ht-probing-should-use-eq std-fn))) (declare (fixnum hash0)) (flet ((hash-search (&aux ,@(ht-probe-setup std-fn)) @@ -1467,7 +1493,7 @@ nnnn 1_ any linear scan ;; Granted that the bit might have been 1 at timestamp 't1', ;; but it's best to read it at t1 and not later. (binding* ((initial-epoch (kv-vector-rehash-epoch kv-vector)) - ,@(ht-hash-setup std-fn) + ,@(ht-hash-setup std-fn 'puthash) ,@(ht-probe-setup std-fn) (eq-test ,(ht-probing-should-use-eq std-fn))) (declare (fixnum hash0) (index/2 index)) @@ -1606,7 +1632,7 @@ nnnn 1_ any linear scan ;; See comment in DEFINE-HT-SETTER about why to read initial-epoch ;; as soon as possible after pinning KEY. (binding* ((initial-epoch (kv-vector-rehash-epoch kv-vector)) - ,@(ht-hash-setup std-fn) + ,@(ht-hash-setup std-fn 'remhash) ,@(ht-probe-setup std-fn) (eq-test ,(ht-probing-should-use-eq std-fn))) (declare (fixnum hash0) (index/2 index) (ignore probe-limit)) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 3eefbc1716..af8039886e 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -156,6 +156,7 @@ (defun number-sxhash (x) (declare (optimize (sb-c:verify-arg-count 0) speed)) + (declare (explicit-check)) (labels ((hash-ratio (x) (let ((result 127810327)) (declare (type fixnum result)) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index ce0493d582..9ad48b7052 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -243,6 +243,17 @@ (gc (find-if (lambda (x) (member x '(:cheneygc :gencgc))) target-feature-list)) (arch (target-platform-keyword target-feature-list))) + (when (and (member :x86 target-feature-list) + (member :int4-breakpoints target-feature-list)) + ;; 0xCE is a perfectly good 32-bit instruction, + ;; unlike on x86-64 where it is illegal. It's therefore + ;; confusing to allow this feature in a 32-bit build. + ;; But it's annoying to have a build script that otherwise works + ;; for a native x86/x86-64 build except for needing one change. + ;; Just print something and go on with life. + (setq target-feature-list + (remove :int4-breakpoints target-feature-list)) + (warn "Removed :INT4-BREAKPOINTS from target features")) ;; Putting arch and gc choice first is visually convenient, versus ;; having to parse a random place in the line to figure out the value ;; of a binary choice {cheney vs gencgc} and architecture. @@ -309,11 +320,6 @@ ":IMMOBILE-CODE requires :IMMOBILE-SPACE feature") ("(and immobile-symbols (not immobile-space))" ":IMMOBILE-SYMBOLS requires :IMMOBILE-SPACE feature") - ("(and int4-breakpoints x86)" - ;; 0xCE is a perfectly good 32-bit instruction, - ;; unlike on x86-64 where it is illegal. It's therefore - ;; confusing to allow this feature in a 32-bit build. - ":INT4-BREAKPOINTS are incompatible with x86") ;; There is still hope to make multithreading on DragonFly x86-64 ("(and sb-thread x86 dragonfly)" ":SB-THREAD not supported on selected architecture"))) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 292f8767d4..4ae311ab0e 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -201,27 +201,28 @@ ;; Word bits ; 32 | 64 32 | 64 ;------------------ ; [ all numbers are hex ] - bignum-widetag ; 0A 11 0A 11 - ratio-widetag ; 0E 15 0E 15 - single-float-widetag ; 12 19 12 19 - double-float-widetag ; 16 1D 16 1D - complex-widetag ; 1A 21 1A 21 - complex-single-float-widetag ; 1E 25 1E 25 - complex-double-float-widetag ; 22 29 22 29 + bignum-widetag ; 0A 11 0A 11 \ + ratio-widetag ; 0E 15 0E 15 | + single-float-widetag ; 12 19 12 19 | + double-float-widetag ; 16 1D 16 1D | EQL-hash picks off this + complex-widetag ; 1A 21 1A 21 | range of widetags + complex-single-float-widetag ; 1E 25 1E 25 | + complex-double-float-widetag ; 22 29 22 29 | + ; | + symbol-widetag ; 26 2D 26 2D / - code-header-widetag ; 26 2D 26 2D + code-header-widetag ; 2A 31 2A 31 - simple-fun-widetag ; 2A 31 2A 31 - closure-widetag ; 2E 35 2E 35 - funcallable-instance-widetag ; 32 39 32 39 + simple-fun-widetag ; 2E 35 2E 35 + closure-widetag ; 32 39 32 39 + funcallable-instance-widetag ; 36 3D 36 3D ;; x86[-64] does not have objects with this widetag, #+(or x86 x86-64) unused00-widetag #-(or x86 x86-64) - return-pc-widetag ; 36 3D 36 3D + return-pc-widetag ; 3A 41 3A 41 - value-cell-widetag ; 3A 41 3A 41 - symbol-widetag ; 3E 45 3E 45 + value-cell-widetag ; 3E 45 3E 45 character-widetag ; 42 49 42 49 sap-widetag ; 46 4D 46 4D unbound-marker-widetag ; 4A 51 4A 51 diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index eabf8e6b0f..6b44d944c1 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -207,6 +207,11 @@ instance character)))))) +(defun not-nil-tn-ref-p (tn-ref) + (and (tn-ref-type tn-ref) + (not (types-equal-or-intersect (tn-ref-type tn-ref) + (specifier-type '(eql nil)))))) + (defun length-field-shift (widetag) (if (= widetag instance-widetag) instance-length-shift diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 4215d269d4..39c929a092 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -104,6 +104,7 @@ (values index fixnum) (foldable flushable)) +(defknown sb-impl::number-sxhash (number) hash-code (foldable flushable)) (defknown %sxhash-string (string) hash-code (foldable flushable)) (defknown %sxhash-simple-string (simple-string) hash-code (foldable flushable)) diff --git a/src/compiler/meta-vmdef.lisp b/src/compiler/meta-vmdef.lisp index b8540f2637..a8c705ed0a 100644 --- a/src/compiler/meta-vmdef.lisp +++ b/src/compiler/meta-vmdef.lisp @@ -780,8 +780,10 @@ `(,dummy))) (ignorable ,n-args ,n-results)) ,@(loads) - (assemble () - ,@(vop-parse-body parse)) + ;; RETURN-FROM can exit the ASSEMBLE while continuing on with saves. + (block ,(vop-parse-name parse) + (assemble () + ,@(vop-parse-body parse))) ,@(saves)))))) (defvar *parse-vop-operand-count*) diff --git a/src/compiler/ppc/cell.lisp b/src/compiler/ppc/cell.lisp index b0404c6279..54ca3e82d2 100644 --- a/src/compiler/ppc/cell.lisp +++ b/src/compiler/ppc/cell.lisp @@ -222,13 +222,15 @@ (:args (symbol :scs (descriptor-reg))) (:results (res :scs (any-reg))) (:result-types positive-fixnum) + (:args-var args) (:generator 2 ;; The symbol-hash slot of NIL holds NIL because it is also the ;; car slot, so we have to strip off the two low bits to make sure ;; it is a fixnum. The lowtag selection magic that is required to ;; ensure this is explained in the comment in objdef.lisp (loadw res symbol symbol-hash-slot other-pointer-lowtag) - (inst clrrwi res res n-fixnum-tag-bits))) + (unless (not-nil-tn-ref-p args) + (inst clrrwi res res n-fixnum-tag-bits)))) ;;;; Fdefinition (fdefn) objects. diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index 51e4d1823a..afdaedaf12 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -268,7 +268,11 @@ (:args (symbol :scs (descriptor-reg))) (:results (res :scs (any-reg))) (:result-types positive-fixnum) + (:args-var args) (:generator 4 + (when (not-nil-tn-ref-p args) + (loadw res symbol symbol-hash-slot other-pointer-lowtag) + (return-from symbol-hash)) (inst cmpld symbol null-tn) (inst beq NULL) (loadw res symbol symbol-hash-slot other-pointer-lowtag) diff --git a/src/compiler/sparc/cell.lisp b/src/compiler/sparc/cell.lisp index 4dc3495118..e1a6870c9a 100644 --- a/src/compiler/sparc/cell.lisp +++ b/src/compiler/sparc/cell.lisp @@ -89,13 +89,15 @@ (:args (symbol :scs (descriptor-reg))) (:results (res :scs (any-reg))) (:result-types positive-fixnum) + (:args-var args) (:generator 2 ;; The symbol-hash slot of NIL holds NIL because it is also the ;; cdr slot, so we have to strip off the two low bits to make sure ;; it is a fixnum. The lowtag selection magic that is required to ;; ensure this is explained in the comment in objdef.lisp (loadw res symbol symbol-hash-slot other-pointer-lowtag) - (inst andn res res fixnum-tag-mask))) + (unless (not-nil-tn-ref-p args) + (inst andn res res fixnum-tag-mask)))) ;;; On unithreaded builds these are just copies of the non-global versions. (define-vop (%set-symbol-global-value set)) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 19369c7e8b..86a90c7740 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -358,13 +358,15 @@ (:args (symbol :scs (descriptor-reg))) (:results (res :scs (any-reg))) (:result-types positive-fixnum) + (:args-var args) (:generator 2 + (loadw res symbol symbol-hash-slot other-pointer-lowtag) ;; The symbol-hash slot of NIL holds NIL because it is also the ;; car slot, so we have to zero the fixnum tag bit(s) to make sure ;; it is a fixnum. The lowtag selection magic that is required to ;; ensure this is explained in the comment in objdef.lisp - (loadw res symbol symbol-hash-slot other-pointer-lowtag) - (inst and res (lognot fixnum-tag-mask)))) + (unless (not-nil-tn-ref-p args) + (inst and res (lognot fixnum-tag-mask))))) ;;; Combine SYMBOL-HASH and the lisp fallback code into one vop. (define-vop () diff --git a/src/compiler/x86/cell.lisp b/src/compiler/x86/cell.lisp index 86a56dd5ca..9bd0e5c98b 100644 --- a/src/compiler/x86/cell.lisp +++ b/src/compiler/x86/cell.lisp @@ -234,13 +234,15 @@ (:args (symbol :scs (descriptor-reg))) (:results (res :scs (any-reg))) (:result-types positive-fixnum) + (:args-var args) (:generator 2 ;; The symbol-hash slot of NIL holds NIL because it is also the ;; car slot, so we have to strip off the two low bits to make sure ;; it is a fixnum. The lowtag selection magic that is required to ;; ensure this is explained in the comment in objdef.lisp (loadw res symbol symbol-hash-slot other-pointer-lowtag) - (inst and res (lognot #b11)))) + (unless (not-nil-tn-ref-p args) + (inst and res (lognot #b11))))) ;;;; fdefinition (FDEFN) objects From 4d41b09bf6210c7750f57dd4fbd7df48b47518bd Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 20 May 2020 23:00:59 -0400 Subject: [PATCH 0034/4023] Enable immobile space by default on dragonfly and disable sb-qshow by default. --- make-config.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/make-config.sh b/make-config.sh index d14e3e3c02..bd3b6ad2b7 100755 --- a/make-config.sh +++ b/make-config.sh @@ -572,7 +572,6 @@ case "$sbcl_os" in printf ' :bsd' >> $ltf printf ' :elf' >> $ltf printf ' :dragonfly' >> $ltf - printf ' :sb-qshow' >> $ltf if [ $sbcl_arch = "x86" ]; then printf ' :restore-fs-segment-register-from-tls' >> $ltf fi @@ -692,7 +691,7 @@ elif [ "$sbcl_arch" = "x86-64" ]; then printf ' :unbind-in-unwind :no-continue-unwind' >> $ltf case "$sbcl_os" in - linux | darwin | *bsd) + linux | darwin | *bsd | dragonfly) printf ' :immobile-space :immobile-code :compact-instance-header' >> $ltf esac elif [ "$sbcl_arch" = "mips" ]; then From e80f2b9abd8788f20e17eae5d75a9220b7c58030 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 21 May 2020 00:11:55 -0400 Subject: [PATCH 0035/4023] Fix build for non-SBCL hosts --- src/code/target-hash-table.lisp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index f90d7fce90..9707186f3c 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -133,9 +133,17 @@ (sb-vm:is-lisp-pointer (get-lisp-obj-address key)))) (declaim (inline eql-hash eql-hash-no-memoize)) -(macrolet - ((define-eql-hash (name symbol-hash-fun) - `(defun ,name (key) +#.`(progn ; our usual whacky incantation because of macrolet + inline + ,@(loop + for (name symbol-hash-fun) + in '((eql-hash sxhash) ; via transform + ;; For GETHASH we never compute a symbol-hash. If PUTHASH + ;; (or other) hasn't done it, the lookup will fail anyway. + ;; Also, the backend can at its discretion avoid clearing + ;; the low bits of the hash which is a known fixnum. + (eql-hash-no-memoize symbol-hash)) + collect + `(defun ,name (key) (declare (values fixnum (member t nil))) (if (%other-pointer-subtype-p key @@ -162,12 +170,6 @@ nil) ;; Consider picking off %INSTANCEP too before using EQ-HASH ? (eq-hash key))))) - (define-eql-hash eql-hash sxhash) ; via transform - ;; For GETHASH we should never compute a symbol-hash. If it hasn't been - ;; computed, KEY won't be found, and it doesn't matter what the hash is. - ;; This could theoretically avoid clearing the fixnum tag since the symbol - ;; is not n. - (define-eql-hash eql-hash-no-memoize symbol-hash)) #-sb-fluid (declaim (inline equal-hash)) (defun equal-hash (key) From 4b6804e5447598185990476e8ae1f3852ca3d9e0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 21 May 2020 10:45:06 -0400 Subject: [PATCH 0036/4023] Take DragonFly patches (slightly modified) from John Marino * make-config.sh now uses $sbcl_os = dragonflybsd so that it matches *bsd. The lisp feature is unchanged, still :DRAGONFLY. :restore-fs-segment-register is not needed, as it's 32-bit only. Further, assume :ELF for all BSD derivatives. * After git rev 2454a32d ("Default to UTF-8") there is no use of the langinfo.h header which reduces #ifdeffage in grovel-headers * Drive-by C compiler warning fix on FreeBSD due to pthread_attr_get_np() without a prototype. And OpenBSD still does its own thing. --- make-config.sh | 30 +++++++++--------------------- package-data-list.lisp-expr | 2 +- src/runtime/bsd-os.h | 2 +- src/runtime/thread.c | 4 ++-- tools-for-build/grovel-headers.c | 11 ++--------- 5 files changed, 15 insertions(+), 34 deletions(-) diff --git a/make-config.sh b/make-config.sh index bd3b6ad2b7..aec28691f8 100755 --- a/make-config.sh +++ b/make-config.sh @@ -294,7 +294,7 @@ case `uname` in esac ;; DragonFly) - sbcl_os="dragonfly" + sbcl_os="dragonflybsd" ;; Darwin) sbcl_os="darwin" @@ -424,7 +424,7 @@ then # If --fancy, enable threads on platforms where they can be built. case $sbcl_arch in x86|x86-64|ppc|arm64|riscv) - if [ "$sbcl_os" = "dragonfly" ] + if [ "$sbcl_os" = "dragonflybsd" ] then echo "No threads on this platform." else @@ -513,7 +513,6 @@ case "$sbcl_os" in ;; esac - link_or_copy Config.$sbcl_arch-linux Config link_or_copy $sbcl_arch-linux-os.h target-arch-os.h link_or_copy linux-os.h target-os.h @@ -533,13 +532,12 @@ case "$sbcl_os" in link_or_copy haiku-os.h target-os.h ;; *bsd) - printf ' :unix' >> $ltf - printf ' :bsd' >> $ltf + printf ' :unix :bsd :elf' >> $ltf + # FIXME: can we enable :gcc-tls across all variants? link_or_copy $sbcl_arch-bsd-os.h target-arch-os.h link_or_copy bsd-os.h target-os.h case "$sbcl_os" in *freebsd) - printf ' :elf' >> $ltf printf ' :freebsd' >> $ltf printf ' :gcc-tls' >> $ltf if [ $sbcl_os = "gnu-kfreebsd" ]; then @@ -552,33 +550,23 @@ case "$sbcl_os" in link_or_copy Config.$sbcl_arch-$sbcl_os Config ;; openbsd) - printf ' :elf' >> $ltf printf ' :openbsd' >> $ltf link_or_copy Config.$sbcl_arch-openbsd Config ;; netbsd) printf ' :netbsd' >> $ltf - printf ' :elf' >> $ltf link_or_copy Config.$sbcl_arch-netbsd Config ;; + dragonflybsd) + printf ' :dragonfly' >> $ltf + link_or_copy Config.$sbcl_arch-dragonfly Config + ;; *) echo unsupported BSD variant: `uname` exit 1 ;; esac ;; - dragonfly) - printf ' :unix' >> $ltf - printf ' :bsd' >> $ltf - printf ' :elf' >> $ltf - printf ' :dragonfly' >> $ltf - if [ $sbcl_arch = "x86" ]; then - printf ' :restore-fs-segment-register-from-tls' >> $ltf - fi - link_or_copy $sbcl_arch-bsd-os.h target-arch-os.h - link_or_copy bsd-os.h target-os.h - link_or_copy Config.$sbcl_arch-dragonfly Config - ;; darwin) printf ' :unix' >> $ltf printf ' :mach-o' >> $ltf @@ -691,7 +679,7 @@ elif [ "$sbcl_arch" = "x86-64" ]; then printf ' :unbind-in-unwind :no-continue-unwind' >> $ltf case "$sbcl_os" in - linux | darwin | *bsd | dragonfly) + linux | darwin | *bsd) printf ' :immobile-space :immobile-code :compact-instance-header' >> $ltf esac elif [ "$sbcl_arch" = "mips" ]; then diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 4342f1ada4..27fe46b360 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -3070,7 +3070,7 @@ no guarantees of interface stability." "POLLFD" "POLLIN" "POLLOUT" "POLLHUP" "POLLNVAL" "POLLERR" "FD" "EVENTS" "REVENTS" "FD-ISSET" "FD-SET" "UNIX-FAST-SELECT" - "UNIX-KILL" "CODESET" + "UNIX-KILL" "FD-ZERO" "FD-CLR" "FD-SETSIZE" "UNIX-FAST-GETRUSAGE" "UNIX-KILLPG")) diff --git a/src/runtime/bsd-os.h b/src/runtime/bsd-os.h index 9ffda9509c..0c5526c2cd 100644 --- a/src/runtime/bsd-os.h +++ b/src/runtime/bsd-os.h @@ -22,7 +22,7 @@ #endif typedef caddr_t os_vm_address_t; -#if defined __NetBSD__ || defined __OpenBSD__ +#if defined __NetBSD__ || defined __OpenBSD__ || defined __DragonFly__ typedef size_t os_vm_size_t; #else typedef vm_size_t os_vm_size_t; diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 2ecaeb2452..57220ad1dc 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -50,7 +50,7 @@ #ifdef LISP_FEATURE_SB_THREAD -#ifdef LISP_FEATURE_OPENBSD +#if defined LISP_FEATURE_OPENBSD || defined LISP_FEATURE_FREEBSD || defined LISP_FEATURE_DRAGONFLY #include #endif @@ -548,7 +548,7 @@ attach_os_thread(init_thread_data *scribble) stack_addr = (char*)pthread_get_stackaddr_np(os) - stack_size; #else pthread_attr_t attr; -#ifdef LISP_FEATURE_FREEBSD +#if defined LISP_FEATURE_FREEBSD || defined LISP_FEATURE_DRAGONFLY pthread_attr_get_np(os, &attr); #else int pthread_getattr_np(pthread_t, pthread_attr_t *); diff --git a/tools-for-build/grovel-headers.c b/tools-for-build/grovel-headers.c index e97bf4484a..4502fe2052 100644 --- a/tools-for-build/grovel-headers.c +++ b/tools-for-build/grovel-headers.c @@ -39,13 +39,10 @@ #include #include #include -#ifdef LISP_FEATURE_ANDROID +#if defined __HAIKU__ || defined __DragonFly__ || defined LISP_FEATURE_ANDROID #include #else -# ifndef LISP_FEATURE_HAIKU -# include -# endif - #include + #include #endif #include #include @@ -170,10 +167,6 @@ main(int argc, char __attribute__((unused)) *argv[]) defconstant("pollnval", POLLNVAL); defconstant("pollerr", POLLERR); DEFTYPE("nfds-t", nfds_t); -#ifndef LISP_FEATURE_ANDROID - printf(";;; langinfo\n"); - defconstant("codeset", CODESET); -#endif printf(";;; types, types, types\n"); DEFTYPE("clock-t", clock_t); DEFTYPE("dev-t", dev_t); From 3ecf4d7124d2de3265e260d465237f23131f94aa Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 22 May 2020 03:28:28 +0300 Subject: [PATCH 0037/4023] tests: more --lose-on-corruption --- tests/subr.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/subr.sh b/tests/subr.sh index a38e6ecc06..9ee2999d02 100644 --- a/tests/subr.sh +++ b/tests/subr.sh @@ -61,15 +61,15 @@ set +a run_sbcl () ( set -u if [ $# -gt 0 ]; then - "$SBCL_RUNTIME" --core "$SBCL_CORE" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})" "$@" + "$SBCL_RUNTIME" --lose-on-corruption --core "$SBCL_CORE" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})" "$@" else - "$SBCL_RUNTIME" --core "$SBCL_CORE" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})" + "$SBCL_RUNTIME" --lose-on-corruption --core "$SBCL_CORE" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})" fi ) run_sbcl_with_args () ( set -u - "$SBCL_RUNTIME" --core "$SBCL_CORE" "$@" + "$SBCL_RUNTIME" --lose-on-corruption --core "$SBCL_CORE" "$@" ) run_sbcl_with_core () ( @@ -77,9 +77,9 @@ run_sbcl_with_core () ( core="$1" shift if [ $# -gt 0 ]; then - "$SBCL_RUNTIME" --core "$core" "$@" + "$SBCL_RUNTIME" --lose-on-corruption --core "$core" "$@" else - "$SBCL_RUNTIME" --core "$core" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})" + "$SBCL_RUNTIME" --lose-on-corruption --core "$core" $SBCL_ARGS --eval "(setf sb-ext:*evaluator-mode* :${TEST_SBCL_EVALUATOR_MODE:-compile})" fi ) From 999edc60a4b9d07b90973db193ac06dbfa291d3b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 26 May 2020 10:23:23 -0400 Subject: [PATCH 0038/4023] Respect GC behavior Half the time, scav_instance() reads an extra word (bounded by physical instance length) which is a bug that should be rectified. Doing so will cause this test to fail if left as is. --- tests/raw-slots-interleaved.impure.lisp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/raw-slots-interleaved.impure.lisp b/tests/raw-slots-interleaved.impure.lisp index 09237977fc..2c04bfaf22 100644 --- a/tests/raw-slots-interleaved.impure.lisp +++ b/tests/raw-slots-interleaved.impure.lisp @@ -119,19 +119,20 @@ (with-test (:name :tagged-slot-iterator-macro) ;; on 32-bit, the logical length is 14, which means 15 words (with header), ;; but slot index 14 (word index 15) exists after padding to 16 memory words. + ;; It is allowed to hold a fixnum (or any non-pointer) but naught else. #-64-bit (progn (assert (= (sb-kernel:%instance-length *afoo*) 14)) - (setf (sb-kernel:%instance-ref *afoo* 14) 'magic)) + (setf (sb-kernel:%instance-ref *afoo* 14) #xdead)) ;; on 64-bit, the logical length is 10, which means 11 words (with header), ;; but slot index 10 (word index 11) exists after padding to 12 memory words. #+64-bit (progn (assert (= (sb-kernel:%instance-length *afoo*) 10)) - (setf (sb-kernel:%instance-ref *afoo* 10) 'magic)) + (setf (sb-kernel:%instance-ref *afoo* 10) #xdead)) (let (l) (sb-kernel:do-instance-tagged-slot (i *afoo*) (push `(,i ,(sb-kernel:%instance-ref *afoo* i)) l)) (assert (equalp (nreverse l) - #-64-bit `((3 aaay) (9 bee) (13 cee) (14 magic)) - #+64-bit `((2 aaay) (6 bee) (9 cee) (10 magic)))))) + #-64-bit `((3 aaay) (9 bee) (13 cee) (14 #xdead)) + #+64-bit `((2 aaay) (6 bee) (9 cee) (10 #xdead)))))) (defvar *anotherfoo* (make-foo1)) From bde422d70945219ed0bb0393f0ca9da258015d43 Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Tue, 26 May 2020 21:38:05 -0700 Subject: [PATCH 0039/4023] Mention arm*/openbsd in NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 54366c6555..d1026589b0 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.0.4: + * platform support: + ** experimental support for ARM32 and ARM64 on OpenBSD * enhancement: CMUCL-style START-BLOCK and END-BLOCK declarations are now supported for block compiling forms at a sub-file granularity. * enhancement: IPv6 support in sb-bsd-sockets is enabled on Windows. From 4340486fe5b631936233b7f3c519869a10feca0a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 27 May 2020 02:18:02 -0400 Subject: [PATCH 0040/4023] "Use" the stream var in with-input-from-string --- src/code/ansi-stream.lisp | 1 + tests/stream.pure.lisp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/code/ansi-stream.lisp b/src/code/ansi-stream.lisp index a7ec46be14..4d441716b2 100644 --- a/src/code/ansi-stream.lisp +++ b/src/code/ansi-stream.lisp @@ -221,6 +221,7 @@ (multiple-value-prog1 ,(uwp forms) (setf ,index (- (string-input-stream-index ,var) ,offset)))) `(let ((,var ,ctor)) + (declare (ignorable ,var)) ,@decls ,(uwp forms)))))))) ; easy way diff --git a/tests/stream.pure.lisp b/tests/stream.pure.lisp index 9bfb54282d..081ea20504 100644 --- a/tests/stream.pure.lisp +++ b/tests/stream.pure.lisp @@ -482,6 +482,10 @@ (assert (equal (type-of (get-output-stream-string s)) '(simple-base-string 1)))))) +(with-test (:name :with-input-from-string-nowarn) + (checked-compile '(lambda () + (with-input-from-string (s "muffin"))))) + (with-test (:name :with-input-from-string-declarations) (checked-compile-and-assert () From 75b031363a82f10636cde7d5a0f9017cb065badb Mon Sep 17 00:00:00 2001 From: Joshua Elsasser Date: Thu, 28 May 2020 09:17:55 -0700 Subject: [PATCH 0041/4023] Teach elfcore.test.sh about non-linux OSes and reenable. This adds a new -sbcl-libs flag to tests/run-compiler.sh for adding flags necessary to link the runtime and uses it in elfcore.test.sh. Ideally the makefiles from src/runtime/ would be used to avoid duplication, but this is a simpler and less invasive change. Additionally, don't try to execute an sbcl from /tmp on OpenBSD, RWX mmap() restrictions mean that anywhere outside the source directory is unlikely to work. --- tests/elfcore.test.sh | 52 +++++++++++++++++++++++++------------------ tests/run-compiler.sh | 12 ++++++++++ 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index 132056ff35..d040024184 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -13,11 +13,17 @@ # absolutely no warranty. See the COPYING and CREDITS files for # more information. -export TEST_BASEDIR=${TMPDIR:-/tmp} +. ../find-gnumake.sh +find_gnumake + +# sbcl likely won't run from /tmp on OpenBSD due to RWX mmap() restrictions +if [ "x$SBCL_SOFTWARE_TYPE" != xOpenBSD ]; then + export TEST_BASEDIR=${TMPDIR:-/tmp} +fi . ./subr.sh run_sbcl --noinform < Date: Thu, 28 May 2020 10:10:06 -0700 Subject: [PATCH 0042/4023] Revert "Teach elfcore.test.sh about non-linux OSes and reenable." This moved the position of the flags in the compiler command, which appears to have broken some configurations. This reverts commit 75b031363a82f10636cde7d5a0f9017cb065badb. --- tests/elfcore.test.sh | 52 ++++++++++++++++++------------------------- tests/run-compiler.sh | 12 ---------- 2 files changed, 22 insertions(+), 42 deletions(-) diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index d040024184..132056ff35 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -13,17 +13,11 @@ # absolutely no warranty. See the COPYING and CREDITS files for # more information. -. ../find-gnumake.sh -find_gnumake - -# sbcl likely won't run from /tmp on OpenBSD due to RWX mmap() restrictions -if [ "x$SBCL_SOFTWARE_TYPE" != xOpenBSD ]; then - export TEST_BASEDIR=${TMPDIR:-/tmp} -fi +export TEST_BASEDIR=${TMPDIR:-/tmp} . ./subr.sh run_sbcl --noinform < Date: Thu, 28 May 2020 13:32:26 -0400 Subject: [PATCH 0043/4023] Fix editcore --- tests/elfcore.test.sh | 6 ++++++ tools-for-build/editcore.lisp | 30 ++++++++++++++++++------------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index 132056ff35..5afd2bd925 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -56,6 +56,12 @@ run_sbcl --noinform < Date: Fri, 29 May 2020 03:12:18 +0300 Subject: [PATCH 0044/4023] run-program: don't use readdir(). It's prone to deadlock in malloc(). --- src/runtime/run-program.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index bfb31097f9..5c9735e205 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -146,6 +146,7 @@ void closefds_from(int lowfd) #else int fds_closed = 0; +/* readdir() uses malloc, which is prone to deadlocking #ifdef LISP_FEATURE_LINUX if (!fds_closed) fds_closed = !closefrom_fddir("/proc/self/fd/", lowfd); @@ -154,6 +155,7 @@ void closefds_from(int lowfd) if (!fds_closed) fds_closed = !closefrom_fddir("/dev/fd/", lowfd); #endif +*/ if (!fds_closed) closefrom_fallback(lowfd); From c019e7a74eedda0419d18ccc87818b23781f2514 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 29 May 2020 13:38:07 +0300 Subject: [PATCH 0045/4023] run-program.c: remove fcntl(0, F_MAXFD) On the OSes where it's present this code is not reachable. --- src/runtime/run-program.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 5c9735e205..587dc0ebeb 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -97,17 +97,12 @@ set_pty(char *pty_name) void closefrom_fallback(int lowfd) { - int fd, maxfd = -1; -#ifdef F_MAXFD - maxfd = fcntl(0, F_MAXFD); -#endif + int fd, maxfd; #ifdef SVR4 - if (-1 == maxfd) - maxfd = sysconf(_SC_OPEN_MAX)-1; + maxfd = sysconf(_SC_OPEN_MAX)-1; #else - if (-1 == maxfd) - maxfd = getdtablesize()-1; + maxfd = getdtablesize()-1; #endif for (fd = maxfd; fd >= lowfd; fd--) From 752a195c47032db0a4e30a7993c99de2d8756a72 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 30 May 2020 07:55:57 -0400 Subject: [PATCH 0046/4023] Temporary patch for EQUALP being more crashy I have a proper fix in mind, I think. --- src/compiler/x86-64/type-vops.lisp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 7ca6319d0a..b0c8038995 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -147,9 +147,17 @@ (values :ne :a :b drop-through target) (values :e :na :nb target drop-through)) + ;; FIXME: the first case, by elision of the lowtag test, can cause this + ;; typecase to memory fault if given an unbound marker: + ;; (typecase x + ;; ((or character number list instance function) 1) + ;; ((simple-vector x) 2) (cond ((and value-tn-ref (eq lowtag other-pointer-lowtag) (other-pointer-tn-ref-p value-tn-ref))) ; best case: lowtag is right + ;; This case is theoretically right, but causes a strictly greater number + ;; of ways to elide a lowtag test, hence more likely to memory fault. + #+nil ((and value-tn-ref ;; If HEADERS contains a range, then list pointers have to be ;; disallowed - consider a list whose CAR has a fixnum that From 501a23a20b8eec53b08314ad6e9c4abe03d5324f Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 30 May 2020 15:12:41 +0300 Subject: [PATCH 0047/4023] x86-64-sunos-os.c: remove unnecessary includes. Some are even missing on Solaris. Fixes lp#1881393 --- src/runtime/x86-64-sunos-os.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/runtime/x86-64-sunos-os.c b/src/runtime/x86-64-sunos-os.c index bf710a9a0a..2d42c2ef4a 100644 --- a/src/runtime/x86-64-sunos-os.c +++ b/src/runtime/x86-64-sunos-os.c @@ -9,10 +9,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include -#include -#include #include #include From c3ae90f3a9dead985b0220f3c9ec9ac285ca7381 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Sun, 31 May 2020 10:52:26 +0100 Subject: [PATCH 0048/4023] bind *compiler-error-context* to nil for eval/compile If arbitrary code is somehow triggered while within the compiler, we do not want re-entrant evaluations to use the outer compiler error context for reporting proiblems with an inner compilation. --- src/compiler/target-main.lisp | 7 +++++++ tests/compiler.test.sh | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/compiler/target-main.lisp b/src/compiler/target-main.lisp index 3d07362740..5c14b15bab 100644 --- a/src/compiler/target-main.lisp +++ b/src/compiler/target-main.lisp @@ -74,6 +74,13 @@ ;; controlled by function arguments and lexical variables. (*compile-verbose* nil) (*compile-print* nil) + ;; in some circumstances, we can trigger execution + ;; of user code during optimization, which can + ;; re-enter the compiler through explicit calls to + ;; EVAL or COMPILE. Those inner evaluations + ;; shouldn't attempt to report any compiler problems + ;; using the outer compiler error context. + (*compiler-error-context* nil) (oops nil)) (handler-bind (((satisfies handle-condition-p) #'handle-condition-handler)) (unless source-paths diff --git a/tests/compiler.test.sh b/tests/compiler.test.sh index 5ecc027d16..90e688efae 100644 --- a/tests/compiler.test.sh +++ b/tests/compiler.test.sh @@ -513,5 +513,27 @@ cat > $tmpfilename < $tmpfilename < Date: Sun, 31 May 2020 11:01:00 +0100 Subject: [PATCH 0049/4023] don't use init files for shrinkwrap-sbcl in test --- tests/elfcore.test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index 5afd2bd925..c2e4e7429c 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -33,7 +33,7 @@ set -e # exit on error # Ensure that we're not running a stale shrinkwrap-sbcl (cd $SBCL_PWD/../src/runtime ; rm -f shrinkwrap-sbcl ; make shrinkwrap-sbcl) -$SBCL_PWD/../src/runtime/shrinkwrap-sbcl --disable-debugger --noprint < Date: Sun, 31 May 2020 12:11:40 +0100 Subject: [PATCH 0050/4023] NEWS update for upcoming sbcl-2.0.5 --- NEWS | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index d1026589b0..95e1610f48 100644 --- a/NEWS +++ b/NEWS @@ -3,15 +3,29 @@ changes relative to sbcl-2.0.4: * platform support: ** experimental support for ARM32 and ARM64 on OpenBSD + ** better musl libc support. (lp#1768368, thanks to Eric Timmons) + ** more correct use of futexes on 64-bit Linux. (lp#1876825, reported by + Ilya Perminov) + ** restore building on current Solaris. (lp#1881393, thanks to Shawn + Ellis) * enhancement: CMUCL-style START-BLOCK and END-BLOCK declarations are now supported for block compiling forms at a sub-file granularity. * enhancement: IPv6 support in sb-bsd-sockets is enabled on Windows. - * enhancement: better musl libc support (Thanks to Eric Timmons). * minor change: *compile-print* now makes it more clear what block compilation is actually doing. The default output is now slightly more verbose as a result. + * bug fix: number keys in EQUALP hash tables are correctly hashed. + (lp#1878653, reported by Syll) * bug fix: EQness is better preserved given partial sharing of list contents in the file compiler. (lp#1583753, reported by Denis Budyak) + * bug fix: the peephole pass neglected to preserve jump table labels. + (lp#1876485) + * bug fix: fix compiler crash in block compilation merging of toplevel + lambdas. (lp#1865336, reported by il71) + * bug fix: sb-introspect's function-lambda-arglist is better at extracting + default values of nested macro arguments. (lp#1876194) + * bug fix: RESTART-BIND's body is an implicit progn, and so does not accept + declarations. (lp#1876303, reported by Michal Herda) changes in sbcl-2.0.4 relative to sbcl-2.0.3: * platform support: From 276fcec470af03561a043c930bc7f6ff9d34bec9 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Sun, 31 May 2020 14:15:30 +0100 Subject: [PATCH 0051/4023] one more NEWS item --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 95e1610f48..eac663f9e2 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,8 @@ changes relative to sbcl-2.0.4: default values of nested macro arguments. (lp#1876194) * bug fix: RESTART-BIND's body is an implicit progn, and so does not accept declarations. (lp#1876303, reported by Michal Herda) + * optimization: EQUAL hash tables with keys involving structure-objects will + have fewer systematic collisions. changes in sbcl-2.0.4 relative to sbcl-2.0.3: * platform support: From 0ecdf713cf2d9598835966e99e25bcbe3029d0aa Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Sun, 31 May 2020 14:16:43 +0100 Subject: [PATCH 0052/4023] 2.0.5: will be tagged as "sbcl-2.0.5" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index eac663f9e2..b8c1707859 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.0.4: +changes in sbcl-2.0.5 relative to sbcl-2.0.4: * platform support: ** experimental support for ARM32 and ARM64 on OpenBSD ** better musl libc support. (lp#1768368, thanks to Eric Timmons) From e5d7dec11d4fe588155c6174785e1a32c468d63a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 31 May 2020 12:50:08 -0400 Subject: [PATCH 0053/4023] Move compute-features-affecting-fasl-format later Not needed for computing C headers --- src/code/early-fasl.lisp | 27 --------------------------- src/code/load.lisp | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/code/early-fasl.lisp b/src/code/early-fasl.lisp index 4b54500e6f..5492452384 100644 --- a/src/code/early-fasl.lisp +++ b/src/code/early-fasl.lisp @@ -43,33 +43,6 @@ (append '(:sb-thread :sb-unicode :cheneygc :gencgc :msan :sb-safepoint :sb-safepoint-strictly))) -;;; Return a string representing symbols in *FEATURES-POTENTIALLY-AFFECTING-FASL-FORMAT* -;;; which are present in a particular compilation. -(defun compute-features-affecting-fasl-format () - (let ((list (sort (copy-list (intersection *features-potentially-affecting-fasl-format* - sb-xc:*features*)) - #'string< :key #'symbol-name))) - ;; Stringify the subset of *FEATURES* that affect fasl format. - ;; A list would be the natural representation choice for this, but a string - ;; is convenient for and a requirement for writing to and reading from fasls - ;; at this stage of the loading. WITH-STANDARD-IO-SYNTAX and WRITE-TO-STRING - ;; would work, but this is simple enough to do by hand. - (with-simple-output-to-string (stream) - (let ((delimiter #\()) - (dolist (symbol list) - (write-char delimiter stream) - (write-string (string symbol) stream) - (setq delimiter #\Space))) - (write-char #\) stream)))) - -#-sb-xc-host -(eval-when (:compile-toplevel) - (let ((string (compute-features-affecting-fasl-format))) - (assert (and (> (length string) 2) - (not (find #\newline string)) - (not (find #\# string)) - (not (search ".." string)))))) - ;;; the code for a character which terminates a fasl file header (defconstant +fasl-header-string-stop-char-code+ 255) diff --git a/src/code/load.lisp b/src/code/load.lisp index ad19bcb69c..bb2f248836 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -262,6 +262,33 @@ (when p (file-position stream p))))))) +;;; Return a string representing symbols in *FEATURES-POTENTIALLY-AFFECTING-FASL-FORMAT* +;;; which are present in a particular compilation. +(defun compute-features-affecting-fasl-format () + (let ((list (sort (copy-list (intersection *features-potentially-affecting-fasl-format* + sb-xc:*features*)) + #'string< :key #'symbol-name))) + ;; Stringify the subset of *FEATURES* that affect fasl format. + ;; A list would be the natural representation choice for this, but a string + ;; is convenient for and a requirement for writing to and reading from fasls + ;; at this stage of the loading. WITH-STANDARD-IO-SYNTAX and WRITE-TO-STRING + ;; would work, but this is simple enough to do by hand. + (with-simple-output-to-string (stream) + (let ((delimiter #\()) + (dolist (symbol list) + (write-char delimiter stream) + (write-string (string symbol) stream) + (setq delimiter #\Space))) + (write-char #\) stream)))) + +#-sb-xc-host +(eval-when (:compile-toplevel) + (let ((string (compute-features-affecting-fasl-format))) + (assert (and (> (length string) 2) + (not (find #\newline string)) + (not (find #\# string)) + (not (search ".." string)))))) + ;;;; LOAD-AS-FASL ;;;; ;;;; Note: LOAD-AS-FASL is used not only by LOAD, but also (with From dbeea959e4dbb3ceb6d734eef4331d5c8d348373 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 31 May 2020 12:59:20 -0400 Subject: [PATCH 0054/4023] Begrudgingly disable interpreter for self-build *EVALUATOR-MODE* has been present since 2006, so no problem to use it. But I do not understand how 1000 files are OK in my application, while SBCL's ~300 are not. Probably the compilation unit sizes vastly differ. --- src/cold/compile-cold-sbcl.lisp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cold/compile-cold-sbcl.lisp b/src/cold/compile-cold-sbcl.lisp index 9ff4482b29..4880c1eff2 100644 --- a/src/cold/compile-cold-sbcl.lisp +++ b/src/cold/compile-cold-sbcl.lisp @@ -186,6 +186,10 @@ (get-stems-and-flags 2))) (n 0) (sb-xc:*compile-verbose* nil)) + ;; Workaround memory exhaustion in SB-FASTEVAL. + ;; In SB-EVAL the default evaluator-mode is :compile, + ;; but it also would exhaust memory if interpreting. + #+sbcl (setq host-sb-ext:*evaluator-mode* :compile) (with-math-journal (do-stems-and-flags (stem flags 2) (unless (position :not-target flags) From b934f44cfe04b3d2df9520af164d9e1e98c3158b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 31 May 2020 21:45:31 -0400 Subject: [PATCH 0055/4023] Implement structure EQUALP as type-specific machine code Same idea as already existed, but instead of treating EQUALP-TESTS as a domain-specific language driving the comparator loop, actually compile it, unless policy of the destruct has SPACE = 3. Pristine core size increase by about .7% which I think is worth it. At any rate, I want people to get this by default, not opt in. --- NEWS | 4 + float-math.lisp-expr | 13 +++ package-data-list.lisp-expr | 2 +- src/code/defstruct.lisp | 178 +++++++++++++++++++----------- src/code/early-classoid.lisp | 9 +- src/code/pred.lisp | 58 +++++----- src/code/target-defstruct.lisp | 54 ++++----- src/code/target-hash-table.lisp | 6 + src/code/target-pathname.lisp | 1 + src/compiler/generic/genesis.lisp | 3 - src/compiler/generic/vm-tran.lisp | 2 + src/compiler/srctran.lisp | 2 + tests/defstruct.impure-cload.lisp | 60 ++++++++++ tests/defstruct.impure.lisp | 7 ++ 14 files changed, 267 insertions(+), 132 deletions(-) diff --git a/NEWS b/NEWS index b8c1707859..88c70da438 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,9 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- +changes relative to sbcl-2.0.5: + * enhancement: EQUALP on structure instances uses code specialized + to each structure type, inlining comparison of non-pointer slots. + changes in sbcl-2.0.5 relative to sbcl-2.0.4: * platform support: ** experimental support for ARM32 and ARM64 on OpenBSD diff --git a/float-math.lisp-expr b/float-math.lisp-expr index a1758483ee..9237568ee0 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -525,6 +525,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x3F800000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -801,6 +802,7 @@ (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-139194D8)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-129194D8)) NIL) +(<= (#x0 #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x4E800000)) T) @@ -960,6 +962,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3FFFFFFFFFFFFFFC) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -1577,6 +1580,7 @@ (= (#x0 #.(MAKE-SINGLE-FLOAT #x-139194D8)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-129194D8)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x0)) T) +(= (#x0 #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x5E000000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x5F000000)) NIL) @@ -1612,6 +1616,7 @@ (= (#x1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x1000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x1FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(= (#x3FFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x3FFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x4000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -1649,6 +1654,8 @@ (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x0) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3FFFFFFFFFFFFFFC) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) @@ -1794,6 +1801,7 @@ (= (#x-1 #x1FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x-1 #x7FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x0 #x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(= (#x0 #x3FFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4E800000) #x0) NIL) @@ -1870,7 +1878,9 @@ (= (#.(MAKE-SINGLE-FLOAT #x-129194D8) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) @@ -1978,6 +1988,7 @@ (> (#x0 #.(MAKE-SINGLE-FLOAT #x-21B6F025)) T) (> (#x0 #.(MAKE-SINGLE-FLOAT #x-20B6F025)) T) (> (#x0 #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(> (#x0 #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x4EC00000)) NIL) @@ -2026,6 +2037,7 @@ (> (#x1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x1000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x1FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) T) +(> (#x3FFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (> (#x3FFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x4000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -2133,6 +2145,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x3F333333) #.(MAKE-SINGLE-FLOAT #x3F333333)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F59999A) #.(MAKE-SINGLE-FLOAT #x3F59999A)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F666666) #.(MAKE-SINGLE-FLOAT #x3F666666)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x3F800000) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0)) T) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 27fe46b360..e5aaed4786 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -1863,7 +1863,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries." "IRRATIONAL" "KEY-INFO" "KEY-INFO-NAME" "KEY-INFO-P" "KEY-INFO-TYPE" "LAYOUT-BITMAP" "LAYOUT-CLASSOID-NAME" - "LAYOUT-DEPTHOID" "LAYOUT-EQUALP-TESTS" "LAYOUT-INVALID-ERROR" + "LAYOUT-DEPTHOID" "LAYOUT-EQUALP-IMPL" "LAYOUT-INVALID-ERROR" "LAYOUT-FOR-PCL-OBJ-P" "LAYOUT-SLOT-LIST" "LAYOUT-SLOT-TABLE" #+(or x86-64 x86) "%LEA" diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 7fd7760faf..7fd4fde91e 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -294,7 +294,7 @@ ;;; So FOO-VAL got compiled on demand. ;;; (declaim (inline !expander-for-defstruct)) -(defun !expander-for-defstruct (null-env-p delayp name-and-options +(defun !expander-for-defstruct (null-env-p optimize-speed delayp name-and-options slot-descriptions expanding-into-code-for) (binding* (((name options) @@ -307,7 +307,7 @@ (error "DEFSTRUCT: ~S is not a symbol." name))) (dd (make-defstruct-description null-env-p name)) (*dsd-source-form* nil) - ((classoid inherits) (parse-defstruct dd options slot-descriptions)) + ((inherits comparators) (parse-defstruct dd options slot-descriptions)) (constructor-definitions (mapcar (lambda (ctor) `(sb-c:xdefun ,(car ctor) @@ -333,7 +333,6 @@ `((defmethod print-object ((,x ,name) ,s) (funcall #',fname ,x ,s ,@(if depthp `(*current-level-in-print*))))))))) - (declare (ignore classoid)) ;; Return a list of forms (if (dd-class-p dd) `(,@(when (eq expanding-into-code-for :target) @@ -366,7 +365,10 @@ ,@constructor-definitions ,@print-method ;; Various other operations only make sense on the target SBCL. - (%target-defstruct ',dd)))) ; returns NAME + ;; %TARGET-DEFSTRUCT returns NAME + (%target-defstruct ',dd + ,(if optimize-speed + (gen-custom-equalp dd comparators)))))) ;; Not DD-CLASS-P ;; FIXME: missing package lock checks `((eval-when (:compile-toplevel :load-toplevel :execute) @@ -384,6 +386,31 @@ ',(dd-doc dd)))))) ',name)))) +(defun gen-custom-equalp (dd comparators) + ;; Process the easiest slots first. + ;; TODO: consecutive word-sized slots should try to use instructions + ;; that compare more than one word at a time. + (collect ((group1) (group2) (group3)) + (mapc (lambda (dsd comparator) + (let* ((slot-key (cons dd dsd)) + (x (slot-access-transform :read '(a) slot-key)) + (y (slot-access-transform :read '(b) slot-key))) + (cond ((member comparator '(= char-equal)) + (group1 `(,comparator ,x ,y))) ; bounded amount of testing + ((member comparator '(bit-vector-=)) + ;; unbounded but not recursive. Try EQ first though + (group2 + `((lambda (x y) (or (eq x y) (bit-vector-= x y))) ,x ,y))) + (t + (group3 `(,comparator ,x ,y)))))) ; recursive + (dd-slots dd) + comparators) + ;; use a string for the name since it's not a global function + `(named-lambda ,(format nil "~A-EQUALP" (dd-name dd)) (a b) + (declare (optimize (safety 0)) (type ,(dd-name dd) a b) + (ignorable a b)) ; if zero slots + (and ,@(group1) ,@(group2) ,@(group3))))) + #+sb-xc-host (progn (eval-when (:compile-toplevel :load-toplevel :execute) @@ -392,7 +419,7 @@ "Cause information about a target structure to be built into the cross-compiler." `(progn ,@(!expander-for-defstruct - t nil name-and-options slot-descriptions :host)))) + t nil nil name-and-options slot-descriptions :host)))) (sb-xc:defmacro defstruct (name-and-options &rest slot-descriptions &environment env) @@ -435,10 +462,13 @@ ;; This is about performance, not semantics. Non-toplevel ;; effects happen when they should even if this were to ;; produce the preferred expansion for toplevel. - (delayp (not (or *top-level-form-p* null-env-p)))) + (delayp (not (or *top-level-form-p* null-env-p))) + (optimize-speed + (and (not delayp) (sb-c:policy env (< space 3))))) `(progn ,@(!expander-for-defstruct - null-env-p delayp name-and-options slot-descriptions + null-env-p optimize-speed delayp + name-and-options slot-descriptions :target)))) ;;;; functions to generate code for various parts of DEFSTRUCT definitions @@ -739,7 +769,8 @@ unless :NAMED is also specified."))) classoid :inherits inherits))) (setf (layout-invalid layout) nil (classoid-layout classoid) layout) - classoid)))) + classoid))) + (ancestor-slot-comparator-list)) ;; Type parsing should be done assuming that prototype classoid ;; exists, which fixes a problem when redefining a DEFTYPE which ;; appeared to be a raw slot. e.g. @@ -748,21 +779,39 @@ unless :NAMED is also specified."))) ;; Also make self-referential definitions not signal PARSE-UNKNOWN-TYPE ;; on slots whose :TYPE option allows an instance of itself (when (dd-include dd) - (frob-dd-inclusion-stuff proto-classoid dd option-bits)) + (setq ancestor-slot-comparator-list + (frob-dd-inclusion-stuff proto-classoid dd option-bits))) (when (stringp (car slot-descriptions)) (setf (dd-doc dd) (pop slot-descriptions))) - (dolist (slot-description slot-descriptions) - (parse-1-dsd proto-classoid dd slot-description)) - (values proto-classoid inherits))) + (collect ((comparator-list ancestor-slot-comparator-list)) + (dolist (slot-description slot-descriptions) + (let ((comparator + (nth-value 1 (parse-1-dsd proto-classoid dd slot-description)))) + (comparator-list comparator))) + (values inherits (comparator-list))))) ;;;; stuff to parse slot descriptions +;;; Decide whether TYPE as stored in a structure can be a raw slot. +;;; Return the index of the matching RAW-SLOT-DATA if it should be, NIL if not. +(defun choose-raw-slot-representation (ctype) + ;; If TYPE isn't a subtype of NUMBER, it can't go in a raw slot. + ;; In the negative case (which is most often), doing 1 SUBTYPEP test + ;; beats doing 5 or 6. + (when (and (csubtypep ctype (specifier-type 'number)) + ;; FIXNUMs and smaller go in tagged slots, not raw slots + (not (csubtypep ctype (specifier-type 'fixnum)))) + (dotimes (i (length *raw-slot-data*)) + (let ((data (svref *raw-slot-data* i))) + (when (csubtypep ctype (specifier-type (raw-slot-data-raw-type data))) + (return i)))))) + ;;; Parse a slot description for DEFSTRUCT, add it to the description ;;; and return it. If supplied, INCLUDED-SLOT is used to get the default, ;;; type, and read-only flag for the new slot. (defun parse-1-dsd (proto-classoid defstruct spec &optional included-slot &aux accessor-name (always-boundp t) (safe-p t) - rsd-index index) + ctype rsd-index index) #-sb-xc-host (declare (muffle-conditions style-warning)) (multiple-value-bind (name default default-p type type-p read-only ro-p) (typecase spec @@ -848,6 +897,20 @@ unless :NAMED is also specified."))) (setf type (cond ((not type-p) inherited-type) ((eq inherited-type t) type) (t `(and ,inherited-type ,type))))) + + #+sb-xc-host + ;; Test whether the type can hold NIL. This avoids a bootstrapping + ;; problem involving forward references to undefined types, + ;; because we want never to pass unknown types into CROSS-TYPEP. + ;; But also, don't call SB-XC:TYPEP on a type-specifier because it does + ;; not receive a type-context which specifies the proto-classoid. + (when (and (typep type '(cons (eql or))) (member 'null type)) + (setq ctype *universal-type*)) ; a little white lie + + (unless ctype + (let ((context (make-type-context type proto-classoid nil))) + (setq ctype (specifier-type type context)))) ; Parse once only + (cond (included-slot (cond ((not ro-p) (setq read-only (dsd-read-only included-slot))) @@ -866,8 +929,7 @@ unless :NAMED is also specified."))) (t ;; Compute the index of this DSD. First decide whether the slot is raw. (setf rsd-index (and (eq (dd-type defstruct) 'structure) - (structure-raw-slot-data-index - type proto-classoid))) + (choose-raw-slot-representation ctype))) (let ((n-words (if rsd-index (let ((rsd (svref *raw-slot-data* rsd-index))) @@ -906,37 +968,15 @@ unless :NAMED is also specified."))) (pack-dsd-bits index read-only safe-p always-boundp rsd-index) default))) - #-sb-xc-host - (push (cons dsd spec) *dsd-source-form*) + #-sb-xc-host (push (cons dsd spec) *dsd-source-form*) (setf (dd-slots defstruct) (nconc (dd-slots defstruct) (list dsd))) - dsd))) - -;;; When a value of type TYPE is stored in a structure, should it be -;;; stored in a raw slot? Return the index of the matching RAW-SLOT-DATA -;;; if TYPE should be stored in a raw slot, or NIL if not. -(defun structure-raw-slot-data-index (slot-type proto-classoid) - ;; If TYPE isn't a subtype of NUMBER, it can't go in a raw slot. - ;; In the negative case (which is most often), doing 1 SUBTYPEP test - ;; beats doing 5 or 6. - - ;; First test whether the type can hold NIL. This avoids a bootstrapping - ;; problem involving forward references to undefined types, - ;; because we want never to pass unknown types into CROSS-TYPEP. - ;; But also, don't call SB-XC:TYPEP on a type-specifier because it does - ;; not receive a type-context which specifies the proto-classoid. - #+sb-xc-host - (when (and (typep slot-type '(cons (eql or))) (member 'null slot-type)) - (return-from structure-raw-slot-data-index nil)) - - (let* ((context (make-type-context slot-type proto-classoid nil)) - (ctype (specifier-type slot-type context))) ; Parse once only - (when (and (csubtypep ctype (specifier-type 'number)) - ;; FIXNUMs and smaller go in tagged slots, not raw slots - (not (csubtypep ctype (specifier-type 'fixnum)))) - (dotimes (i (length *raw-slot-data*)) - (let ((data (svref *raw-slot-data* i))) - (when (csubtypep ctype (specifier-type (raw-slot-data-raw-type data))) - (return i))))))) + (let ((comparator + ;; this is enough specialization for now + (cond ((csubtypep ctype (specifier-type 'character)) 'char-equal) + ((csubtypep ctype (specifier-type 'number)) '=) + ((csubtypep ctype (specifier-type 'bit-vector)) 'bit-vector-=) + (t 'equalp)))) + (values dsd comparator))))) (defun typed-structure-info-or-lose (name) (or (info :typed-structure :info name) @@ -994,28 +1034,32 @@ unless :NAMED is also specified."))) (setf (dd-inherited-accessor-alist dd) (dd-inherited-accessor-alist included-structure)) - (dolist (included-slot (dd-slots included-structure)) - (let* ((included-name (dsd-name included-slot)) - (modified (or (find included-name modified-slots - :key (lambda (x) (if (atom x) x (car x))) - :test #'string=) - `(,included-name)))) - ;; We stash away an alist of accessors to parents' slots - ;; that have already been created to avoid conflicts later - ;; so that structures with :INCLUDE and :CONC-NAME (and - ;; other edge cases) can work as specified. - (when (dsd-accessor-name included-slot) - ;; the "oldest" (i.e. highest up the tree of inheritance) - ;; will prevail, so don't push new ones on if they - ;; conflict. - (pushnew (cons (dsd-accessor-name included-slot) - (dsd-index included-slot)) - (dd-inherited-accessor-alist dd) - :test #'eq :key #'car)) - (let ((new-slot (parse-1-dsd proto-classoid dd modified included-slot))) - (when (and (dsd-safe-p included-slot) (not (dsd-safe-p new-slot))) - ;; XXX: notify? - ))))))) + (collect ((comparator-list)) + (dolist (included-slot (dd-slots included-structure) + (comparator-list)) + (let* ((included-name (dsd-name included-slot)) + (modified (or (find included-name modified-slots + :key (lambda (x) (if (atom x) x (car x))) + :test #'string=) + `(,included-name)))) + ;; We stash away an alist of accessors to parents' slots + ;; that have already been created to avoid conflicts later + ;; so that structures with :INCLUDE and :CONC-NAME (and + ;; other edge cases) can work as specified. + (when (dsd-accessor-name included-slot) + ;; the "oldest" (i.e. highest up the tree of inheritance) + ;; will prevail, so don't push new ones on if they + ;; conflict. + (pushnew (cons (dsd-accessor-name included-slot) + (dsd-index included-slot)) + (dd-inherited-accessor-alist dd) + :test #'eq :key #'car)) + (multiple-value-bind (new-slot comparator) + (parse-1-dsd proto-classoid dd modified included-slot) + (comparator-list comparator) + (when (and (dsd-safe-p included-slot) (not (dsd-safe-p new-slot))) + ;; XXX: notify? + )))))))) ;;;; various helper functions for setting up DEFSTRUCTs diff --git a/src/code/early-classoid.lisp b/src/code/early-classoid.lisp index 9995877e8f..dd8583eaf0 100644 --- a/src/code/early-classoid.lisp +++ b/src/code/early-classoid.lisp @@ -191,8 +191,10 @@ (info nil :type (or null defstruct-description)) ;; Map of raw slot indices. (bitmap +layout-all-tagged+ :type layout-bitmap) - ;; Per-slot comparator for implementing EQUALP. - (equalp-tests #() :type simple-vector) + ;; EQUALP comparator for two instances with this layout + ;; Could be the generalized function, or a type-specific one + ;; if the defstruct was compiled in a policy of SPEED 3. + (equalp-impl #'equalp-err :type (sfunction (t t) boolean) :read-only t) ;; If this layout is for an object of metatype STANDARD-CLASS, ;; these are the EFFECTIVE-SLOT-DEFINITION metaobjects. (slot-list nil :type list) @@ -209,6 +211,9 @@ (ancestor_5 0)) (declaim (freeze-type layout)) +(defun equalp-err (a b) + (bug "EQUALP ~S ~S" a b)) + ;;; Applicable only if bit-packed (for 64-bit architectures) (defmacro pack-layout-flags (depthoid length flags) `(logior (ash ,(or depthoid -1) (+ 32 sb-vm:n-fixnum-tag-bits)) diff --git a/src/code/pred.lisp b/src/code/pred.lisp index ed0de81cf5..f270079309 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -387,11 +387,11 @@ length and have identical components. Other arrays must be EQ to be EQUAL." (equal x y))))) ;;; EQUALP comparison of HASH-TABLE values +;;; Can be called only if both X and Y are definitely hash-tables. (defun hash-table-equalp (x y) - (declare (type hash-table x y)) + (declare (type hash-table x y) (explicit-check)) (or (eq x y) - (and (hash-table-p y) - (eql (hash-table-count x) (hash-table-count y)) + (and (eql (hash-table-count x) (hash-table-count y)) (eql (hash-table-test x) (hash-table-test y)) (block comparison-of-entries (maphash (lambda (key x-value) @@ -402,31 +402,25 @@ length and have identical components. Other arrays must be EQ to be EQUAL." x) t)))) -(declaim (inline instance-equalp)) +(macrolet ((slot-ref-equalp () + `(let ((x-el (%instance-ref x i)) + (y-el (%instance-ref y i))) + (or (eq x-el y-el) (equalp x-el y-el))))) (defun instance-equalp (x y) - (let ((layout-x (%instance-layout x))) - (and - (eq layout-x (%instance-layout y)) - (logtest +structure-layout-flag+ (layout-flags layout-x)) - (macrolet ((slot-ref-equalp () - `(let ((x-el (%instance-ref x i)) - (y-el (%instance-ref y i))) - (or (eq x-el y-el) (equalp x-el y-el))))) - (let ((n (%instance-length x))) - (if (eql (layout-bitmap layout-x) sb-kernel:+layout-all-tagged+) - (loop for i downfrom (1- n) to sb-vm:instance-data-start - always (slot-ref-equalp)) - (let ((comparators (layout-equalp-tests layout-x))) - (unless (= (length comparators) (- n sb-vm:instance-data-start)) - (bug "EQUALP got incomplete instance layout")) - ;; See remark at the source code for %TARGET-DEFSTRUCT - ;; explaining how to use the vector of comparators. - (loop for i downfrom (1- n) to sb-vm:instance-data-start - for test = (data-vector-ref - comparators (- i sb-vm:instance-data-start)) - always (cond ((eql test 0) (slot-ref-equalp)) - ((functionp test) (funcall test i x y)) - (t)))))))))) + (declare (optimize (safety 0))) + (loop for i downfrom (1- (%instance-length x)) to sb-vm:instance-data-start + always (slot-ref-equalp))) +(defun instance-equalp* (comparators x y) + (declare (optimize (safety 0)) + (simple-vector comparators) + (type instance x y)) + ;; See remark at the source code for %TARGET-DEFSTRUCT + ;; explaining how to use the vector of comparators. + (loop for i downfrom (1- (%instance-length x)) to sb-vm:instance-data-start + for test = (data-vector-ref comparators (- i sb-vm:instance-data-start)) + always (cond ((eql test 0) (slot-ref-equalp)) + ((functionp test) (funcall test i x y)) + (t))))) ;;; Doesn't work on simple vectors (defun array-equalp (x y) @@ -486,14 +480,12 @@ length and have identical components. Other arrays must be EQ to be EQUAL." (and (consp y) (equalp (car x) (car y)) (equalp (cdr x) (cdr y)))) - ((pathnamep x) - (and (pathnamep y) (pathname= x y))) - ((hash-table-p x) - (and (hash-table-p y) - (hash-table-equalp x y))) ((%instancep x) (and (%instancep y) - (instance-equalp x y))) + (let ((layout (%instance-layout x))) + (and (logtest +structure-layout-flag+ (layout-flags layout)) + (eq (%instance-layout y) layout) + (funcall (layout-equalp-impl layout) x y))))) ((and (simple-vector-p x) (simple-vector-p y)) (let ((len (length x))) (and (= len (length y)) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index d23030bbb4..6ae693f7fd 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -57,7 +57,11 @@ ;;; the part of %DEFSTRUCT which makes sense only on the target SBCL ;;; -(defun %target-defstruct (dd) +(defun assign-equalp-impl (type-name function) + (setf (%instance-ref (find-layout type-name) (get-dsd-index layout equalp-impl)) + function)) + +(defun %target-defstruct (dd equalp) (declare (type defstruct-description dd)) (when (dd-doc dd) @@ -66,35 +70,33 @@ (let* ((classoid (find-classoid (dd-name dd))) (layout (classoid-layout classoid))) - ;; Make a vector of EQUALP slots comparators, indexed by (- word-index data-start). - ;; This has to be assigned to something regardless of whether there are - ;; raw slots just in case someone mutates a layout which had raw - ;; slots into one which does not - although that would probably crash - ;; unless no instances exist or all raw slots miraculously contained - ;; bits which were the equivalent of valid Lisp descriptors. - (setf (layout-equalp-tests layout) - (if (eql (layout-bitmap layout) +layout-all-tagged+) - #() - ;; The initial element of NIL means "do not compare". - ;; Ignored words (comparator = NIL) fall into two categories: - ;; - pseudo-ignored, which get compared by their - ;; predecessor word, as for complex-double-float, - ;; - internal padding words which are truly ignored. - ;; Other words are compared as tagged if the comparator is 0, - ;; or as untagged if the comparator is a type-specific function. - (let ((comparators + (setf (%instance-ref layout (get-dsd-index sb-kernel:layout sb-kernel::equalp-impl)) + (or equalp + (if (eql (layout-bitmap layout) +layout-all-tagged+) + #'sb-impl::instance-equalp + ;; Make a vector of EQUALP slots comparators, indexed by + ;; (- word-index INSTANCE-DATA-START). + ;; The initial element of NIL means "do not compare". + ;; Ignored words (comparator = NIL) fall into two categories: + ;; - pseudo-ignored, which get compared by their + ;; predecessor word, as for complex-double-float, + ;; - internal padding words which are truly ignored. + ;; Other words are compared as tagged if the comparator is 0, + ;; or as untagged if the comparator is a type-specific function. + (let ((comparators ;; If data-start is 1, subtract 1 because we don't need ;; a comparator for the LAYOUT slot. (make-array (- (dd-length dd) sb-vm:instance-data-start) :initial-element nil))) - (dolist (slot (dd-slots dd) comparators) - ;; -1 because LAYOUT (slot index 0) has no comparator stored. - (setf (aref comparators - (- (dsd-index slot) sb-vm:instance-data-start)) - (let ((rsd (dsd-raw-slot-data slot))) - (if (not rsd) - 0 ; means recurse using EQUALP - (raw-slot-data-comparator rsd)))))))) + (dolist (slot (dd-slots dd) comparators) + (setf (aref comparators + (- (dsd-index slot) sb-vm:instance-data-start)) + (let ((rsd (dsd-raw-slot-data slot))) + (if (not rsd) + 0 ; means recurse using EQUALP + (raw-slot-data-comparator rsd))))) + (lambda (a b) + (sb-impl::instance-equalp* comparators a b)))))) (dolist (fun *defstruct-hooks*) (funcall fun classoid))) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 9707186f3c..7ebe28c395 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -1904,6 +1904,12 @@ table itself." (values `(make-hash-table ,@(%hash-table-ctor-args hash-table)) `(%stuff-hash-table ,hash-table ',(%hash-table-alist hash-table)))) +;;; This assignment has to occur some time after the defstruct. +;;; We don't call EQUALP on hash-table, so as late as possible is fine. +;;; It can't go in src/code/pred whose forms execute *before* the defstruct, +;;; so its effect would just get clobbered by the defstruct. +(sb-kernel::assign-equalp-impl 'hash-table #'hash-table-equalp) + #| (defun show-address-sensitivity (&optional tbl) (flet ((show1 (tbl) diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index 7e743c4865..88e459eaf2 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -488,6 +488,7 @@ (or (eq (%pathname-host pathname1) *physical-host*) (compare-component (%pathname-version pathname1) (%pathname-version pathname2)))))) +(sb-kernel::assign-equalp-impl 'pathname #'pathname=) ;;; This is conceptually like (DEFUN-CACHED (%MAKE-PATHNAME ...)) ;;; except that we try hard never to evict entries until SAVE-LISP-AND-DIE. diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a27d8653b6..c4ee913e3e 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1146,9 +1146,6 @@ core and return a descriptor to it." :inherits inherits :info *nil-descriptor* :bitmap bitmap - ;; Nothing in cold-init needs to call EQUALP on a structure with raw slots, - ;; but for type-correctness this slot needs to be a simple-vector. - :equalp-tests *simple-vector-0-descriptor* :slot-list *nil-descriptor*) (awhen (gethash name *layout-deferred-instances*) diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index a8055874cf..7bb0785864 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -505,6 +505,7 @@ (word-logical-not (%vector-raw-bits bit-array index)))))))) (deftransform bit-vector-= ((x y) (simple-bit-vector simple-bit-vector)) + ;; TODO: unroll if length is known and not more than a few words `(and (= (length x) (length y)) (let ((length (length x))) (or (= length 0) @@ -545,6 +546,7 @@ (deftransform count ((item sequence) (bit simple-bit-vector) * :policy (>= speed space)) + ;; TODO: unroll if length is known and not more than a few words `(let ((length (length sequence))) (if (zerop length) 0 diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 946d0ecd9f..caf02f2fee 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -3510,6 +3510,8 @@ '(= x y)) ((both-csubtypep 'hash-table) '(hash-table-equalp x y)) + ;; TODO: two instances of the same type should dispatch + ;; directly to the EQUALP-IMPL function in the layout. ((and (both-csubtypep 'array) ;; At least one array has to be longer than 0 ;; and not adjustable, because #() and "" are equal. diff --git a/tests/defstruct.impure-cload.lisp b/tests/defstruct.impure-cload.lisp index 5a8962d255..c3c81b299c 100644 --- a/tests/defstruct.impure-cload.lisp +++ b/tests/defstruct.impure-cload.lisp @@ -44,3 +44,63 @@ (assert (= (length layouts) 3)) (assert (find (sb-kernel:find-layout 'sb-thread:thread) layouts)))) + +(defstruct (parent) + (bv #* :type bit-vector) + (x 0d0 :type double-float)) +(defstruct (child (:include parent)) + (w 0 :type word)) +(defstruct (child2 (:include parent + (bv #* :type simple-bit-vector)))) + +#| +Timing result: +(defparameter *l1* + (coerce (loop repeat 1000 + for i from 2 + collect (make-child :x (coerce i 'double-float) + :w (1+ i))) + 'vector)) + +(defparameter *l2* (map 'vector 'copy-structure *l1*)) + +(defun test (n) + (loop repeat (The fixnum n) + sum (loop for s1 across *l1* + for s2 across *l2* + count (equalp s1 s2) fixnum) fixnum)) + +* (time (test 1000)) +Old: +Evaluation took: + 0.046 seconds of real time + 127,769,104 processor cycles +New: +Evaluation took: + 0.024 seconds of real time + 66,055,457 processor cycles +|# + +(with-test (:name :custom-equalp) + (assert (equalp (make-child :x -0d0 :w #xf00f :bv #*10101) + (make-child :x +0d0 :w #xf00f :bv #*10101)))) + +(with-test (:name :no-equalp-calls) + (dolist (type '(parent child child2)) + (let* ((equalp-impl + (sb-kernel:layout-equalp-impl (sb-kernel:find-layout type))) + (constants + (ctu:find-code-constants equalp-impl))) + (case type + ((parent child) + (assert (and (sb-int:singleton-p constants) + (eq (car constants) + (sb-kernel::find-fdefn 'sb-int:bit-vector-=))))) + (child2 + ;; FIXME: why does CHILD2-EQUALP reference a boxed constant + ;; equal to MOST-POSITIVE-WORD as a bignum? + ;; Something strange about the bit-vector-= xform on simple-bit-vector. + (assert (or (not constants) + (and (sb-int:singleton-p constants) + (not (typep (car constants) + 'sb-kernel:fdefn)))))))))) diff --git a/tests/defstruct.impure.lisp b/tests/defstruct.impure.lisp index 4ddd68f732..873cb57e23 100644 --- a/tests/defstruct.impure.lisp +++ b/tests/defstruct.impure.lisp @@ -1448,3 +1448,10 @@ redefinition." `(defstruct foo4131 bar bar)) (assert-that "slot name BAR duplicated via included FOO4130" `(defstruct (foo4132 (:include foo4130)) bar)))) + +(test-util:with-test (:name :specialized-equalp) + ;; make sure we didn't mess up PATHNAME and HASH-TABLE + (let ((f (sb-kernel:layout-equalp-impl (sb-kernel:find-layout 'pathname)))) + (assert (eq f #'sb-int:pathname=))) + (let ((f (sb-kernel:layout-equalp-impl (sb-kernel:find-layout 'hash-table)))) + (assert (eq f #'sb-int:hash-table-equalp)))) From 7e41a4b2d3319c6c6f002554ef7a9b316fca9f35 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 31 May 2020 22:40:15 -0400 Subject: [PATCH 0056/4023] Make make-config.sh more data-driven Factor out mandatory features per architecture into "{arch}/features" and share them between normal config and crossbuild test. --- crossbuild-runner/backends/alpha/features | 4 + .../backends/alpha/local-target-features | 2 +- crossbuild-runner/backends/arm/features | 8 ++ .../backends/arm/local-target-features | 2 +- crossbuild-runner/backends/arm64/features | 6 + .../backends/arm64/local-target-features | 2 +- crossbuild-runner/backends/hppa/features | 3 + .../backends/hppa/local-target-features | 2 +- crossbuild-runner/backends/mips/features | 4 + .../backends/mips/local-target-features | 2 +- crossbuild-runner/backends/ppc/features | 3 + .../backends/ppc/local-target-features | 2 +- crossbuild-runner/backends/ppc64/features | 6 + .../backends/ppc64/local-target-features | 2 +- crossbuild-runner/backends/riscv/features | 4 + .../backends/riscv/local-target-features | 2 +- crossbuild-runner/backends/sparc/features | 1 + .../backends/sparc/local-target-features | 2 +- crossbuild-runner/backends/x86-64/features | 18 +++ .../backends/x86-64/local-target-features | 2 +- crossbuild-runner/backends/x86/features | 12 ++ .../backends/x86/local-target-features | 2 +- crossbuild-runner/build-all.sh | 10 ++ float-math.lisp-expr | 10 ++ make-config.sh | 112 ++++-------------- 25 files changed, 123 insertions(+), 100 deletions(-) create mode 100644 crossbuild-runner/backends/alpha/features create mode 100644 crossbuild-runner/backends/arm/features create mode 100644 crossbuild-runner/backends/arm64/features create mode 100644 crossbuild-runner/backends/hppa/features create mode 100644 crossbuild-runner/backends/mips/features create mode 100644 crossbuild-runner/backends/ppc/features create mode 100644 crossbuild-runner/backends/ppc64/features create mode 100644 crossbuild-runner/backends/riscv/features create mode 100644 crossbuild-runner/backends/sparc/features create mode 100644 crossbuild-runner/backends/x86-64/features create mode 100644 crossbuild-runner/backends/x86/features diff --git a/crossbuild-runner/backends/alpha/features b/crossbuild-runner/backends/alpha/features new file mode 100644 index 0000000000..d5b7c1b93b --- /dev/null +++ b/crossbuild-runner/backends/alpha/features @@ -0,0 +1,4 @@ +:64-bit-registers +:cheneygc +:stack-allocatable-closures :stack-allocatable-lists +:stack-allocatable-fixed-objects diff --git a/crossbuild-runner/backends/alpha/local-target-features b/crossbuild-runner/backends/alpha/local-target-features index be10fec468..e2f300c919 100644 --- a/crossbuild-runner/backends/alpha/local-target-features +++ b/crossbuild-runner/backends/alpha/local-target-features @@ -1 +1 @@ -:alpha :unix :elf :linux :cheneygc :64-bit-registers :stack-allocatable-closures :stack-allocatable-lists :stack-allocatable-fixed-objects :little-endian +:cheneygc :64-bit-registers :little-endian diff --git a/crossbuild-runner/backends/arm/features b/crossbuild-runner/backends/arm/features new file mode 100644 index 0000000000..08b39aeec6 --- /dev/null +++ b/crossbuild-runner/backends/arm/features @@ -0,0 +1,8 @@ +:gencgc :alien-callbacks +; As opposed to soft-float or FPA, we support VFP only (and +; possibly VFPv2 and higher only), but we'll leave the obvious +; hooks in for someone to add the support later. +:arm-vfp :arm-vfpv2 +:stack-allocatable-lists :stack-allocatable-fixed-objects +:stack-allocatable-vectors :stack-allocatable-closures +:fp-and-pc-standard-save diff --git a/crossbuild-runner/backends/arm/local-target-features b/crossbuild-runner/backends/arm/local-target-features index a31aadeebd..83d8430266 100644 --- a/crossbuild-runner/backends/arm/local-target-features +++ b/crossbuild-runner/backends/arm/local-target-features @@ -1 +1 @@ -:arm :unix :elf :linux :largefile :gencgc :linkage-table :alien-callbacks :arm-vfp :arm-vfpv2 :stack-allocatable-lists :stack-allocatable-fixed-objects :stack-allocatable-vectors :stack-allocatable-closures :unwind-to-frame-and-call-vop :fp-and-pc-standard-save :little-endian :arm-softfp +:little-endian :gencgc :largefile diff --git a/crossbuild-runner/backends/arm64/features b/crossbuild-runner/backends/arm64/features new file mode 100644 index 0000000000..e4c8848e3d --- /dev/null +++ b/crossbuild-runner/backends/arm64/features @@ -0,0 +1,6 @@ +:64-bit :gencgc :fp-and-pc-standard-save +:alien-callbacks +:stack-allocatable-lists :stack-allocatable-fixed-objects +:stack-allocatable-vectors :stack-allocatable-closures +:unbind-in-unwind +:compare-and-swap-vops :undefined-fun-restarts diff --git a/crossbuild-runner/backends/arm64/local-target-features b/crossbuild-runner/backends/arm64/local-target-features index 944c378ce1..13e051b152 100644 --- a/crossbuild-runner/backends/arm64/local-target-features +++ b/crossbuild-runner/backends/arm64/local-target-features @@ -1 +1 @@ -:arm64 :unix :elf :linux :sb-futex :64-bit :gencgc :linkage-table :fp-and-pc-standard-save :alien-callbacks :stack-allocatable-lists :stack-allocatable-fixed-objects :stack-allocatable-vectors :stack-allocatable-closures :compare-and-swap-vops :little-endian :unbind-in-unwind :sb-thread +:little-endian :sb-thread diff --git a/crossbuild-runner/backends/hppa/features b/crossbuild-runner/backends/hppa/features new file mode 100644 index 0000000000..b41466d151 --- /dev/null +++ b/crossbuild-runner/backends/hppa/features @@ -0,0 +1,3 @@ +:cheneygc +:stack-allocatable-vectors :stack-allocatable-fixed-objects +:stack-allocatable-closures :stack-allocatable-lists diff --git a/crossbuild-runner/backends/hppa/local-target-features b/crossbuild-runner/backends/hppa/local-target-features index 4a5214ff6b..a349ebf366 100644 --- a/crossbuild-runner/backends/hppa/local-target-features +++ b/crossbuild-runner/backends/hppa/local-target-features @@ -1 +1 @@ -:hppa :unix :elf :linux :cheneygc :stack-allocatable-vectors :stack-allocatable-fixed-objects :stack-allocatable-closures :stack-allocatable-lists :big-endian +:cheneygc :big-endian diff --git a/crossbuild-runner/backends/mips/features b/crossbuild-runner/backends/mips/features new file mode 100644 index 0000000000..d4d38f384b --- /dev/null +++ b/crossbuild-runner/backends/mips/features @@ -0,0 +1,4 @@ +:cheneygc +:stack-allocatable-closures :stack-allocatable-vectors +:stack-allocatable-lists :stack-allocatable-fixed-objects +:alien-callbacks diff --git a/crossbuild-runner/backends/mips/local-target-features b/crossbuild-runner/backends/mips/local-target-features index ce6d666726..6803471fe7 100644 --- a/crossbuild-runner/backends/mips/local-target-features +++ b/crossbuild-runner/backends/mips/local-target-features @@ -1 +1 @@ -:mips :unix :elf :linux :largefile :cheneygc :linkage-table :stack-allocatable-closures :stack-allocatable-vectors :stack-allocatable-lists :stack-allocatable-fixed-objects :alien-callbacks :little-endian +:largefile :cheneygc :little-endian diff --git a/crossbuild-runner/backends/ppc/features b/crossbuild-runner/backends/ppc/features new file mode 100644 index 0000000000..502c0f8254 --- /dev/null +++ b/crossbuild-runner/backends/ppc/features @@ -0,0 +1,3 @@ +:gencgc :stack-allocatable-closures :stack-allocatable-vectors +:stack-allocatable-lists :stack-allocatable-fixed-objects +:compare-and-swap-vops :alien-callbacks diff --git a/crossbuild-runner/backends/ppc/local-target-features b/crossbuild-runner/backends/ppc/local-target-features index 21fed4e8b4..e9929965a3 100644 --- a/crossbuild-runner/backends/ppc/local-target-features +++ b/crossbuild-runner/backends/ppc/local-target-features @@ -1 +1 @@ -:ppc :unix :elf :linux :sb-futex :gencgc :stack-allocatable-closures :stack-allocatable-vectors :stack-allocatable-lists :stack-allocatable-fixed-objects :linkage-table :compare-and-swap-vops :alien-callbacks :big-endian :sb-thread +:gencgc :big-endian :sb-thread diff --git a/crossbuild-runner/backends/ppc64/features b/crossbuild-runner/backends/ppc64/features new file mode 100644 index 0000000000..8777f518d7 --- /dev/null +++ b/crossbuild-runner/backends/ppc64/features @@ -0,0 +1,6 @@ +; threads are required because differing versions of the vops for BOUNDP +; and [fast-]symbol-[global-]value and CAS create extra maintenance burden. +:64-bit :untagged-fdefns :sb-thread +:gencgc :stack-allocatable-closures :stack-allocatable-vectors +:stack-allocatable-lists :stack-allocatable-fixed-objects +:compare-and-swap-vops :alien-callbacks diff --git a/crossbuild-runner/backends/ppc64/local-target-features b/crossbuild-runner/backends/ppc64/local-target-features index e20ea4db16..28376cb1d2 100644 --- a/crossbuild-runner/backends/ppc64/local-target-features +++ b/crossbuild-runner/backends/ppc64/local-target-features @@ -1 +1 @@ -:ppc64 :unix :elf :linux :64-bit :gencgc :stack-allocatable-closures :stack-allocatable-vectors :stack-allocatable-lists :stack-allocatable-fixed-objects :linkage-table :compare-and-swap-vops :alien-callbacks :big-endian :sb-thread :sb-futex +:64-bit :gencgc :big-endian :sb-thread diff --git a/crossbuild-runner/backends/riscv/features b/crossbuild-runner/backends/riscv/features new file mode 100644 index 0000000000..cd795a050b --- /dev/null +++ b/crossbuild-runner/backends/riscv/features @@ -0,0 +1,4 @@ +:gencgc +:stack-allocatable-closures :stack-allocatable-vectors +:stack-allocatable-lists :stack-allocatable-fixed-objects +:compare-and-swap-vops :memory-barrier-vops diff --git a/crossbuild-runner/backends/riscv/local-target-features b/crossbuild-runner/backends/riscv/local-target-features index 8b24ca7483..50631f0052 100644 --- a/crossbuild-runner/backends/riscv/local-target-features +++ b/crossbuild-runner/backends/riscv/local-target-features @@ -1 +1 @@ -:riscv :unix :elf :linux :64-bit :gencgc :stack-allocatable-closures :stack-allocatable-vectors :stack-allocatable-lists :stack-allocatable-fixed-objects :linkage-table :little-endian :compare-and-swap-vops :memory-barrier-vops :sb-thread +:64-bit :gencgc :little-endian :sb-thread diff --git a/crossbuild-runner/backends/sparc/features b/crossbuild-runner/backends/sparc/features new file mode 100644 index 0000000000..d3b063d97f --- /dev/null +++ b/crossbuild-runner/backends/sparc/features @@ -0,0 +1 @@ +:stack-allocatable-closures :stack-allocatable-lists diff --git a/crossbuild-runner/backends/sparc/local-target-features b/crossbuild-runner/backends/sparc/local-target-features index 6659798762..311599926c 100644 --- a/crossbuild-runner/backends/sparc/local-target-features +++ b/crossbuild-runner/backends/sparc/local-target-features @@ -1 +1 @@ -:sparc :unix :elf :linux :gencgc :linkage-table :stack-allocatable-closures :stack-allocatable-lists :big-endian +:gencgc :big-endian diff --git a/crossbuild-runner/backends/x86-64/features b/crossbuild-runner/backends/x86-64/features new file mode 100644 index 0000000000..1d6e67041e --- /dev/null +++ b/crossbuild-runner/backends/x86-64/features @@ -0,0 +1,18 @@ +:64-bit +:gencgc +:stack-grows-downward-not-upward +:c-stack-is-control-stack +:compare-and-swap-vops +:unwind-to-frame-and-call-vop +:fp-and-pc-standard-save +:stack-allocatable-closures +:stack-allocatable-vectors +:stack-allocatable-lists +:stack-allocatable-fixed-objects +:alien-callbacks +:cycle-counter +:integer-eql-vop +:undefined-fun-restarts +:call-symbol +:unbind-in-unwind +:no-continue-unwind diff --git a/crossbuild-runner/backends/x86-64/local-target-features b/crossbuild-runner/backends/x86-64/local-target-features index c3fd07ee6d..319547ce3d 100644 --- a/crossbuild-runner/backends/x86-64/local-target-features +++ b/crossbuild-runner/backends/x86-64/local-target-features @@ -1 +1 @@ -:x86-64 :win32 :avx2 :sb-safepoint :sb-thruption :sb-wtimer :sb-safepoint-strictly :sb-futex :64-bit :gencgc :stack-grows-downward-not-upward :c-stack-is-control-stack :linkage-table :compare-and-swap-vops :unwind-to-frame-and-call-vop :fp-and-pc-standard-save :stack-allocatable-closures :stack-allocatable-vectors :stack-allocatable-lists :stack-allocatable-fixed-objects :alien-callbacks :cycle-counter :integer-eql-vop :sb-simd-pack :sb-simd-pack-256 :little-endian :sb-thread :call-symbol :unbind-in-unwind :no-continue-unwind +:win32 :avx2 :sb-safepoint :sb-thruption :sb-wtimer :sb-safepoint-strictly :sb-futex :64-bit :gencgc :sb-simd-pack :sb-simd-pack-256 :little-endian :sb-thread diff --git a/crossbuild-runner/backends/x86/features b/crossbuild-runner/backends/x86/features new file mode 100644 index 0000000000..e68468eba5 --- /dev/null +++ b/crossbuild-runner/backends/x86/features @@ -0,0 +1,12 @@ +:gencgc +:stack-grows-downward-not-upward +:c-stack-is-control-stack +:compare-and-swap-vops +:unwind-to-frame-and-call-vop +:stack-allocatable-closures +:stack-allocatable-vectors +:stack-allocatable-lists +:stack-allocatable-fixed-objects +:alien-callbacks +:cycle-counter +:fp-and-pc-standard-save diff --git a/crossbuild-runner/backends/x86/local-target-features b/crossbuild-runner/backends/x86/local-target-features index 5d451765f2..411d99a31b 100644 --- a/crossbuild-runner/backends/x86/local-target-features +++ b/crossbuild-runner/backends/x86/local-target-features @@ -1 +1 @@ -:sb-thread :x86 :unix :elf :linux :sb-futex :largefile :gencgc :stack-grows-downward-not-upward :c-stack-is-control-stack :compare-and-swap-vops :unwind-to-frame-and-call-vop :stack-allocatable-closures :stack-allocatable-vectors :stack-allocatable-lists :stack-allocatable-fixed-objects :alien-callbacks :cycle-counter :fp-and-pc-standard-save :linkage-table :little-endian +:sb-thread :largefile :gencgc :little-endian diff --git a/crossbuild-runner/build-all.sh b/crossbuild-runner/build-all.sh index 5e41a1f142..a24cb3b4aa 100755 --- a/crossbuild-runner/build-all.sh +++ b/crossbuild-runner/build-all.sh @@ -23,7 +23,17 @@ do # we don't compile. Or else it doesn't matter much which lisp code is compiled. # Assume that dlopen() is provided so that we don't try to read sbcl.nm though. echo '(lambda (features) (union features (list :crossbuild-test :os-provides-dlopen ' > $ltf + echo ":$arch" >> $ltf + # x86-64 is tested as if #+win32 + if [ $arch != "x86-64" ]; then + echo ':unix :linux :elf :sb-futex' >> $ltf + fi + cat crossbuild-runner/backends/$arch/features >> $ltf cat crossbuild-runner/backends/$arch/local-target-features >> $ltf + case "$arch" in + alpha | hppa) ;; + *) echo ':linkage-table' >> $ltf + esac echo ')))' >> $ltf cp -fv crossbuild-runner/backends/$arch/stuff-groveled-from-headers.lisp \ diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 9237568ee0..9b739d2e0d 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -962,6 +962,8 @@ (<= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x1FFFFFFC) T) +(<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #xFFFFFFFFFFFFFFC) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3FFFFFFFFFFFFFFC) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) @@ -1608,10 +1610,12 @@ (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) NIL) (= (#x1 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(= (#x1FFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x1FFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x20000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x3FFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(= (#xFFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#xFFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x1000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -1655,6 +1659,8 @@ (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x0) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x1FFFFFFC) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x3F800000) #xFFFFFFFFFFFFFFC) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3FFFFFFFFFFFFFFC) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -1801,6 +1807,8 @@ (= (#x-1 #x1FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x-1 #x7FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x0 #x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(= (#x0 #x1FFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) +(= (#x0 #xFFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x0 #x3FFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) @@ -2028,11 +2036,13 @@ (> (#x1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x1 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) (> (#x7 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) +(> (#x1FFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (> (#x1FFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x20000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x3FFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#x4189374BC6A7E #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) +(> (#xFFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (> (#xFFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x1000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) diff --git a/make-config.sh b/make-config.sh index aec28691f8..518f332826 100755 --- a/make-config.sh +++ b/make-config.sh @@ -474,9 +474,7 @@ echo //initializing $ltf echo ';;;; This is a machine-generated file.' > $ltf echo ';;;; Please do not edit it by hand.' >> $ltf echo ';;;; See make-config.sh.' >> $ltf -echo "(lambda (features) (set-difference (union features (list$WITH_FEATURES " >> $ltf - -printf ":%s" "$sbcl_arch" >> $ltf +echo "(lambda (features) (set-difference (union features (list :${sbcl_arch}$WITH_FEATURES " >> $ltf echo //setting up OS-dependent information @@ -491,9 +489,7 @@ link_or_copy $sbcl_arch-arch.h target-arch.h link_or_copy $sbcl_arch-lispregs.h target-lispregs.h case "$sbcl_os" in linux) - printf ' :unix' >> $ltf - printf ' :elf' >> $ltf - printf ' :linux' >> $ltf + printf ' :unix :linux :elf' >> $ltf case "$sbcl_arch" in x86 | x86-64 | arm64) printf ' :gcc-tls' >> $ltf @@ -518,15 +514,13 @@ case "$sbcl_os" in link_or_copy linux-os.h target-os.h ;; hpux) - printf ' :unix' >> $ltf - printf ' :elf' >> $ltf - printf ' :hpux' >> $ltf + printf ' :unix :hpux :elf' >> $ltf link_or_copy Config.$sbcl_arch-hpux Config link_or_copy $sbcl_arch-hpux-os.h target-arch-os.h link_or_copy hpux-os.h target-os.h ;; haiku) - printf ' :unix :elf :haiku :int4-breakpoints' >> $ltf + printf ' :unix :haiku :elf :int4-breakpoints' >> $ltf link_or_copy Config.$sbcl_arch-haiku Config link_or_copy $sbcl_arch-haiku-os.h target-arch-os.h link_or_copy haiku-os.h target-os.h @@ -568,10 +562,7 @@ case "$sbcl_os" in esac ;; darwin) - printf ' :unix' >> $ltf - printf ' :mach-o' >> $ltf - printf ' :bsd' >> $ltf - printf ' :darwin' >> $ltf + printf ' :unix :bsd :darwin :mach-o' >> $ltf if [ $sbcl_arch = "x86" ]; then printf ' :mach-exception-handler :restore-fs-segment-register-from-tls' >> $ltf fi @@ -589,9 +580,7 @@ case "$sbcl_os" in link_or_copy Config.$sbcl_arch-darwin Config ;; sunos) - printf ' :unix' >> $ltf - printf ' :elf' >> $ltf - printf ' :sunos' >> $ltf + printf ' :unix :sunos :elf' >> $ltf if [ $sbcl_arch = "x86-64" ]; then printf ' :largefile' >> $ltf fi @@ -650,13 +639,8 @@ cd "$original_dir" # base-target-features.lisp-expr, we add it into local-target-features # if we're building for x86. -- CSR, 2002-02-21 Then we do something # similar with :STACK-GROWS-FOOWARD, too. -- WHN 2002-03-03 -if [ "$sbcl_arch" = "x86" ]; then - printf ' :gencgc :stack-grows-downward-not-upward :c-stack-is-control-stack' >> $ltf - printf ' :compare-and-swap-vops :unwind-to-frame-and-call-vop' >> $ltf - printf ' :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf - printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf - printf ' :alien-callbacks :cycle-counter' >> $ltf - printf ' :fp-and-pc-standard-save' >> $ltf +case "$sbcl_arch" in + x86) if [ "$sbcl_os" = "win32" ]; then # of course it doesn't provide dlopen, but there is # roughly-equivalent magic nevertheless. @@ -666,31 +650,15 @@ if [ "$sbcl_arch" = "x86" ]; then rm -f src/runtime/openbsd-sigcontext.h sh tools-for-build/openbsd-sigcontext.sh > src/runtime/openbsd-sigcontext.h fi -elif [ "$sbcl_arch" = "x86-64" ]; then - printf ' :64-bit :gencgc :stack-grows-downward-not-upward :c-stack-is-control-stack' >> $ltf - printf ' :compare-and-swap-vops :unwind-to-frame-and-call-vop' >> $ltf - printf ' :fp-and-pc-standard-save' >> $ltf - printf ' :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf - printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf - printf ' :alien-callbacks :cycle-counter' >> $ltf - printf ' :integer-eql-vop' >> $ltf - printf ' :sb-simd-pack :sb-simd-pack-256 :avx2' >> $ltf - printf ' :undefined-fun-restarts :call-symbol' >> $ltf - printf ' :unbind-in-unwind :no-continue-unwind' >> $ltf - + ;; + x86-64) + printf ' :sb-simd-pack :sb-simd-pack-256 :avx2' >> $ltf # not mandatory case "$sbcl_os" in linux | darwin | *bsd) printf ' :immobile-space :immobile-code :compact-instance-header' >> $ltf esac -elif [ "$sbcl_arch" = "mips" ]; then - printf ' :cheneygc' >> $ltf - printf ' :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf - printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf - printf ' :alien-callbacks' >> $ltf -elif [ "$sbcl_arch" = "ppc" ]; then - printf ' :gencgc :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf - printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf - printf ' :compare-and-swap-vops :alien-callbacks' >> $ltf + ;; + ppc) if [ "$sbcl_os" = "linux" ]; then # Use a C program to detect which kind of glibc we're building on, # to bandage across the break in source compatibility between @@ -710,18 +678,14 @@ elif [ "$sbcl_arch" = "ppc" ]; then exit 1 fi fi -elif [ "$sbcl_arch" = "ppc64" ]; then - # threads are required because differing versions of the vops for BOUNDP - # and [fast-]symbol-[global-]value and CAS create extra maintenance burden. - printf ' :64-bit :untagged-fdefns :sb-thread' >> $ltf - printf ' :gencgc :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf - printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf - printf ' :compare-and-swap-vops :alien-callbacks' >> $ltf + ;; + ppc64) # there is no glibc bug that requires the 'where-is-mcontext' hack. # (Sufficiently new glibc uses the correct definition, which is the same as # 2.3.1, so define our constant for that) echo '#define GLIBC231_STYLE_UCONTEXT 1' > src/runtime/ppc-linux-mcontext.h -elif [ "$sbcl_arch" = "riscv" ]; then + ;; + riscv) if [ "$xlen" = "64" ]; then printf ' :64-bit' >> $ltf elif [ "$xlen" = "32" ]; then @@ -730,11 +694,8 @@ elif [ "$sbcl_arch" = "riscv" ]; then echo 'Architecture word width unspecified. (Either 32-bit or 64-bit.)' exit 1 fi - printf ' :gencgc' >> $ltf - printf ' :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf - printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf - printf ' :compare-and-swap-vops :memory-barrier-vops' >> $ltf -elif [ "$sbcl_arch" = "sparc" ]; then + ;; + sparc) # Test the compiler in order to see if we are building on Sun # toolchain as opposed to GNU binutils, and write the appropriate # FUNCDEF macro for assembler. No harm in running this on sparc-linux @@ -751,39 +712,11 @@ elif [ "$sbcl_arch" = "sparc" ]; then echo '***' printf ' :cheneygc' >> $ltf fi - printf ' :stack-allocatable-closures :stack-allocatable-lists' >> $ltf -elif [ "$sbcl_arch" = "alpha" ]; then - printf ' :64-bit-registers' >> $ltf - printf ' :cheneygc' >> $ltf - printf ' :stack-allocatable-closures :stack-allocatable-lists' >> $ltf - printf ' :stack-allocatable-fixed-objects' >> $ltf -elif [ "$sbcl_arch" = "hppa" ]; then - printf ' :cheneygc' >> $ltf - printf ' :stack-allocatable-vectors :stack-allocatable-fixed-objects' >> $ltf - printf ' :stack-allocatable-closures :stack-allocatable-lists' >> $ltf -elif [ "$sbcl_arch" = "arm" ]; then - printf ' :gencgc :alien-callbacks' >> $ltf - # As opposed to soft-float or FPA, we support VFP only (and - # possibly VFPv2 and higher only), but we'll leave the obvious - # hooks in for someone to add the support later. - printf ' :arm-vfp :arm-vfpv2' >> $ltf - printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf - printf ' :stack-allocatable-vectors :stack-allocatable-closures' >> $ltf - printf ' :fp-and-pc-standard-save' >> $ltf -elif [ "$sbcl_arch" = "arm64" ]; then - printf ' :64-bit :gencgc :fp-and-pc-standard-save' >> $ltf - printf ' :alien-callbacks' >> $ltf - printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf - printf ' :stack-allocatable-vectors :stack-allocatable-closures' >> $ltf - printf ' :unbind-in-unwind' >> $ltf - printf ' :compare-and-swap-vops :undefined-fun-restarts' >> $ltf -else - # Nothing need be done in this case, but sh syntax wants a placeholder. - echo > /dev/null -fi + ;; +esac # There are only two architectures that don't have linkage tables, -# and they also don't compile for half a dozen other reasons. +# and they also don't run for half a dozen other reasons. case "$sbcl_arch" in alpha | hppa) ;; *) printf ' :linkage-table' >> $ltf @@ -800,6 +733,7 @@ export sbcl_os sbcl_arch sh tools-for-build/grovel-features.sh >> $ltf echo //finishing $ltf +printf " %s" "`cat crossbuild-runner/backends/${sbcl_arch}/features`" >> $ltf echo ")) (list$WITHOUT_FEATURES)))" >> $ltf # FIXME: The version system should probably be redone along these lines: From af34a5894cb1280503e77e2a745d7136ac6d7666 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 00:53:05 -0400 Subject: [PATCH 0057/4023] Substitute dummy stream for stream-error involving dynamic-extent This helps with situations where a signaled condition outlives the dynamic extent of a stream that the condition references, and then the user tries to print the condition. On the other hand, this loses information if the user would have used the condition while still within the stream's extent. It's hard to know what to do. Keeping any more state would just add overhead that dynamic-extent was trying to avoid. --- src/code/ansi-stream.lisp | 4 ++-- src/code/condition.lisp | 33 +++++++++++++++++++++++++++------ src/code/stream.lisp | 31 +++++++++++++++++++++++++++++++ tests/condition.pure.lisp | 13 ++++++++++--- tests/stream.pure.lisp | 8 ++++++++ 5 files changed, 78 insertions(+), 11 deletions(-) diff --git a/src/code/ansi-stream.lisp b/src/code/ansi-stream.lisp index 4d441716b2..65b8372959 100644 --- a/src/code/ansi-stream.lisp +++ b/src/code/ansi-stream.lisp @@ -196,11 +196,11 @@ ;; In light of the second point, we need not close the stream if the object is ;; stack-allocated, because any attempt to access it after the forms exit will surely ;; crash, and there are otherwise no observable effects from closing the stream. - ;; The choice to avoid DX-LET in safe code is strictly unecessary, because it is + ;; The choice to avoid DX-LET in some policies is strictly unecessary, because it is ;; *always* undefined behavior to use the DX object after its extent ends, ;; however it might help expose user code bugs by keeping the stream accessible ;; but closed. - (bind (if (sb-c:policy env (= safety 3)) 'let 'dx-let)) + (bind (if (sb-c:policy env (or (= safety 3) (= debug 3))) 'let 'dx-let)) (ctor `(%init-string-input-stream ,dummy ,string ;; not (OR START 0), because ":START NIL" should err diff --git a/src/code/condition.lisp b/src/code/condition.lisp index 1ca2b719ae..2ec7982242 100644 --- a/src/code/condition.lisp +++ b/src/code/condition.lisp @@ -202,13 +202,34 @@ ;; Interestingly we fail to validate the actual-initargs, ;; allowing any random initarg names. Is this permissible? ;; And why is lazily filling in ASSIGNED-SLOTS beneficial anyway? - (let ((instance (%make-instance (+ sb-vm:instance-data-start - 1 ; ASSIGNED-SLOTS - (length initargs))))) ; rest - (setf (%instance-layout instance) (classoid-layout classoid) + (let* ((layout (classoid-layout classoid)) + (stream-err-p + (let ((stream-err-layout (load-time-value (find-layout 'stream-error)))) + (or (eq layout stream-err-layout) + (find stream-err-layout (layout-inherits layout))))) + (instance (%make-instance (+ sb-vm:instance-data-start + 1 ; ASSIGNED-SLOTS + (length initargs)))) ; rest + (data-index (1+ sb-vm:instance-data-start)) + (arg-index 0)) + (setf (%instance-layout instance) layout (condition-assigned-slots instance) nil) - (do-rest-arg ((val index) initargs) - (setf (%instance-ref instance (+ sb-vm:instance-data-start index 1)) val)) + ;; Replace a dynamic-extent stream with a stub. Doing it in this low-level + ;; allocator is more robust than trying to intercept all conceivable ways + ;; in which to construct an instance of a subtype of STREAM-ERROR + ;; (e.g. through the function READER-EOF-ERROR, SIMPLE-READER-ERROR, etc) + ;; DO-REST-ARG doesn't quite fit the bill for this. + ;; And it's what you might call really poor separation of concerns. + (loop (when (>= arg-index (length initargs)) (return)) + (let ((key (fast-&rest-nth arg-index initargs)) + (val (fast-&rest-nth (1+ arg-index) initargs))) + (setf (%instance-ref instance data-index) key + (%instance-ref instance (1+ data-index)) + (if (and stream-err-p (eq key :stream) (stack-allocated-p val)) + (sb-impl::make-stub-stream val) + val)) + (incf arg-index 2) + (incf data-index 2))) (values instance classoid)) (error 'simple-type-error :datum designator diff --git a/src/code/stream.lisp b/src/code/stream.lisp index d6118c6746..c03f6a8394 100644 --- a/src/code/stream.lisp +++ b/src/code/stream.lisp @@ -2536,4 +2536,35 @@ benefit of the function GET-OUTPUT-STREAM-STRING." (t stream))) +;;; STREAM-ERROR-STREAM is supposed to return a stream even if the +;;; stream has dynamic-extent. While technically a stream, +;;; this object is not actually usable as such - it's only for error reporting. +(defstruct (stub-stream + (:include ansi-stream) + (:constructor %make-stub-stream (direction string))) + direction + string) ; string or nil + +(defun make-stub-stream (underlying-stream) + (multiple-value-bind (direction string) + (etypecase underlying-stream + (string-input-stream + (values :input (string-input-stream-string underlying-stream))) + (string-output-stream + (values :output nil)) + (fill-pointer-output-stream + (values :output (fill-pointer-output-stream-string underlying-stream)))) + (%make-stub-stream direction string))) + +(defmethod print-object ((stub stub-stream) stream) + (print-unreadable-object (stub stream) + (let ((direction (stub-stream-direction stub)) + (string (stub-stream-string stub))) + (format stream "dynamic-extent ~A (unavailable)~@[ ~A ~S~]" + (if (eq direction :input) 'string-input-stream 'string-output-stream) + (if string (if (eq direction :input) "from" "to")) + (if (> (length string) 10) + (concatenate 'string (subseq string 0 8) "...") + string))))) + ;;;; etc. diff --git a/tests/condition.pure.lisp b/tests/condition.pure.lisp index 23e4cc4d0b..009ab77f7d 100644 --- a/tests/condition.pure.lisp +++ b/tests/condition.pure.lisp @@ -288,13 +288,20 @@ ;; should print the stream position information. (with-test (:name (reader-error :stream-error-position-info :open-stream :bug-1264902)) - (assert - (search + (locally + ;; High debug avoids stack-allocating the stream. + ;; It would be fine to stack-allocate it, because the handler-case does not + ;; use the stream outside of its extent, however, because ALLOCATE-CONDITION + ;; doesn't know when you will use the stream, it always replaces a DX stream + ;; with a dummy. The dummy stream would not have position information. + (declare (optimize debug)) + (assert + (search "Line: 1, Column: 22, File-Position: 22" (with-input-from-string (stream "no-such-package::symbol") (handler-case (read stream) - (reader-error (condition) (princ-to-string condition))))))) + (reader-error (condition) (princ-to-string condition)))))))) ;; Printing a READER-ERROR when the underlying stream has been closed ;; should still work, but the stream information will not be printed. diff --git a/tests/stream.pure.lisp b/tests/stream.pure.lisp index 081ea20504..90aa39dbdb 100644 --- a/tests/stream.pure.lisp +++ b/tests/stream.pure.lisp @@ -494,3 +494,11 @@ (declare (optimize safety)) (read-char x))) (("a") #\a))) + +(defun input-from-dynamic-extent-stream () + (handler-case (with-input-from-string (stream "#w") (read stream nil nil)) + (error (condition) + (format nil "~A" condition)))) +(compile 'input-from-dynamic-extent-stream) +(with-test (:name :with-input-from-string-signal-stream-error) + (assert (search "unavailable" (input-from-dynamic-extent-stream)))) From a87fa476791bfaef694ff2613f8d4357be3dc6ea Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 01:24:36 -0400 Subject: [PATCH 0058/4023] Allow %MAKE-INSTANCE on stack with precise GC --- src/compiler/generic/vm-ir2tran.lisp | 6 +++--- tests/reader.pure.lisp | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index 21fec0c61e..3a46f9415b 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -30,10 +30,10 @@ (dd-slots (lvar-value defstruct-description))) #+(and :gencgc :c-stack-is-control-stack) t) -#+(or x86 x86-64) +#+stack-allocatable-fixed-objects (defoptimizer (%make-instance stack-allocate-result) ((n) node dx) - (declare (ignore n dx)) - t) + (declare (ignore n)) + (eq dx 'truly-dynamic-extent)) (defoptimizer ir2-convert-reffer ((object) node block name offset lowtag) (let* ((lvar (node-lvar node)) diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index 74ab507231..8b463cf484 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -360,7 +360,8 @@ ;; - multiple-value-call in WITH-CHAR-MACRO-RESULT ;; - the initial cons cell in READ-LIST (with-test (:name :read-does-not-cons-per-se - :skipped-on (:or :interpreter (:not :x86-64))) + :skipped-on (:or (:not :stack-allocatable-fixed-objects) + :interpreter)) (flet ((test-reading (string) (let ((s (make-string-input-stream string))) (read s) ; once outside the loop, to make A-SYMBOL From 42423483e703f342148a435dbb903bb36dba2b9e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 05:28:26 -0400 Subject: [PATCH 0059/4023] Improve WITH-OUTPUT-TO-STRING * DXify the stream and a small string buffer * Remove the UNWIND-PROTECT and CLOSE * Rename WITH-SIMPLE-OUTPUT-TO-STRING to %WITH-OUTPUT-TO-STRING which is identical in most respects to the standard one except that it does not accept :ELEMENT-TYPE, and, as always, returns a BASE-STRING if possible. * Eliminate GET-OUTPUT-STREAM-STRING consing except for the returned string CL:WITH-OUTPUT-TO-STRING should be used in lieu of %WITH-OUTPUT-TO-STRING if the desired element-type is BASE-CHAR. --- package-data-list.lisp-expr | 2 +- src/code/ansi-stream.lisp | 100 +++++++++ src/code/cross-misc.lisp | 5 + src/code/describe.lisp | 2 +- src/code/early-extensions.lisp | 27 --- src/code/fd-stream.lisp | 2 +- src/code/late-format.lisp | 4 +- src/code/load.lisp | 2 +- src/code/macros.lisp | 35 --- src/code/print.lisp | 4 +- src/code/run-program.lisp | 8 +- src/code/stream.lisp | 371 ++++++++++++++++--------------- src/code/symbol.lisp | 2 +- src/code/target-format.lisp | 10 +- src/code/unix-pathname.lisp | 2 +- src/code/win32-pathname.lisp | 2 +- src/compiler/debug.lisp | 2 +- src/compiler/fndb.lisp | 10 +- src/compiler/pack.lisp | 2 +- src/compiler/seqtran.lisp | 2 +- src/compiler/srctran.lisp | 2 +- src/pcl/documentation.lisp | 2 +- tests/dynamic-extent.impure.lisp | 6 + tests/stream.pure.lisp | 2 +- 24 files changed, 333 insertions(+), 273 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index e5aaed4786..44e5066b07 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2414,7 +2414,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries." "%SET-ROW-MAJOR-AREF" "%SET-FILL-POINTER" "%SET-FDEFINITION" "%SCHARSET" "%RPLACD" "%RPLACA" "%PUT" "%CHARSET" - "WITH-SIMPLE-OUTPUT-TO-STRING")) + "%WITH-OUTPUT-TO-STRING")) #s(sb-cold:package-data :name "SB-THREAD" diff --git a/src/code/ansi-stream.lisp b/src/code/ansi-stream.lisp index 65b8372959..6c0ccb40ba 100644 --- a/src/code/ansi-stream.lisp +++ b/src/code/ansi-stream.lisp @@ -225,3 +225,103 @@ ,@decls ,(uwp forms)))))))) ; easy way +(defstruct (string-output-stream + (:include ansi-stream) + (:constructor nil) + (:copier nil) + (:predicate nil)) + ;; Function to perform a piece of the SOUT operation + ;; Args: (stream buffer string pointer start stop) + (sout-aux nil :type (sfunction (t t t t t t) t) :read-only t) + ;; The string we throw stuff in. + ;; In terms of representation of this buffer, we could do something like + ;; always use UTF-8, or use a custom encoding that has a bit indicating + ;; whether the next bits are base-char or character, and then just the + ;; bits of that character using either 7 bits (filling out 1 byte) + ;; or 21 bits (consuming 3 or 4 bytes total) on a per-character basis. + (buffer nil :type (or simple-base-string simple-character-string)) + ;; Whether any non-base character has been written. + ;; This is :IGNORE for base-char output streams. + (unicode-p :ignore) + ;; Chains of buffers to use + (prev nil :type list) + (next nil :type list) + ;; Index of the next location to use in the current string. + (pointer 0 :type index) + ;; Global location in the stream + (index 0 :type index) + ;; Index cache: when we move backwards we save the greater of this + ;; and index here, so the greater of index and this is always the + ;; end of the stream. + (index-cache 0 :type index) + ;; Pseudo-actual element type. We no longer store the as-requested type. + ;; (If the value is :DEFAULT, we return CHARACTER on inquiry.) + (element-type nil :read-only t + :type (member #+sb-unicode :default + #+sb-unicode character + base-char nil))) +(declaim (freeze-type string-output-stream)) + +(defmacro %allocate-string-ostream () + `(%make-instance ,(dd-length (find-defstruct-description 'string-output-stream)))) +(defmacro with-output-to-string + ((var &optional string &key (element-type ''character)) &body body) + (let ((initial-buffer '#:buf) (dummy '#:stream)) + (if string + ;; "If string is supplied, element-type is ignored". + ;; Why do implementors take this to mean "evaluated and ignored?" + ;; I would have figured it meant expansion-time ignored. + `(dx-let ((,dummy (%make-instance ,(dd-length (find-defstruct-description + 'fill-pointer-output-stream))))) + (let ((,var (truly-the fill-pointer-output-stream + (%init-fill-pointer-output-stream + ,dummy ,string ,element-type)))) + ;; http://www.lispworks.com/documentation/HyperSpec/Body/d_ignore.htm#ignore + ;; "The stream variables established by ... with-output-to-string + ;; are, by definition, always used" + (declare (ignorable ,var)) + ,@body)) + ;; Should we call CONSTANTP and CONSTANT-FORM-VALUE and TYPEXPAND first? + (let ((et (cond ((or (equal element-type ''base-char) + (equal element-type ''standard-char)) + 'base-char) + ((equal element-type ''character) + 'character)))) + ;; This is simpler than trying to arrange transforms that cause + ;; MAKE-STRING-OUTPUT-STREAM to be DXable. While that might be awesome, + ;; this macro exists for a reason. + (if et + `(dx-let ((,dummy (%allocate-string-ostream)) + (,initial-buffer (make-array 31 :element-type ',et))) + (let ((,var (%init-string-output-stream ,dummy ',et ,initial-buffer))) + (declare (ignorable ,var)) + ,@body) + ;; On the architecture that does not support #+stack-allocatable-fixed-objects + ;; (Sparc) we could close the stream, but what's the point of doing that + ;; whem you're expressly prohibited by the standard from using the variable + ;; outside of its extent as specified? Just fix the backend if it bothers you. + ;; And I'm not even considering the obsolete backends. + (get-output-stream-string ,dummy)) + `(dx-let ((,dummy (%allocate-string-ostream))) + (let ((,var (%init-string-output-stream + ,dummy + ;; Transforms on this which avoid type-parsing would not help- + ;; the dxified buffer has to be of that type also. + ;; And I'll bet that most people use a literal :ELEMENT-TYPE + ;; which gets the better code above. + (pick-string-ostream-type ,element-type) + 0))) + (declare (ignorable ,var)) + ,@body) + (get-output-stream-string ,dummy))))))) + +;;; Similar to WITH-OUTPUT-TO-STRING, but produces the most compact result +;;; string possible (BASE or CHARACTER) depending on what was written. +;;; This is not something that the standard macro permits. +(defmacro %with-output-to-string ((var) &body body) + (let ((initial-buffer '#:buf) (dummy '#:stream)) + `(dx-let ((,dummy (%allocate-string-ostream)) + (,initial-buffer (make-array 31 :element-type 'character))) + (let ((,var (%init-string-output-stream ,dummy :default ,initial-buffer))) + ,@body) + (get-output-stream-string ,dummy)))) diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index c5ba3b1d8e..0037e2872a 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -352,3 +352,8 @@ (defmacro %primitive (name arg) (ecase name (print `(format t "~A~%" ,arg)))) + +(defmacro %with-output-to-string ((var) &body body) + ;; Let's suppose that the host lisp knows what it's doing to efficiently + ;; compile the standard macro. Don't try to outdo it. + `(with-output-to-string (,var) ,@body)) diff --git a/src/code/describe.lisp b/src/code/describe.lisp index e423344412..c761ca2461 100644 --- a/src/code/describe.lisp +++ b/src/code/describe.lisp @@ -67,7 +67,7 @@ (limit (truncate (- *print-right-margin* reserve) columns))) (flet ((trunc (&optional end) (let ((line-end (- limit 2))) - (with-simple-output-to-string (s) + (%with-output-to-string (s) (write-string line s :end (if end (min end line-end) line-end)) diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index 135d0d6813..7d700d258f 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -1335,33 +1335,6 @@ NOTE: This interface is experimental and subject to change." (length cache)))) short-name)))))) -;;; Just like WITH-OUTPUT-TO-STRING but doesn't close the stream, -;;; producing more compact code. -(defmacro with-simple-output-to-string - ((var &optional string (element-type :default)) &body body) - ;; Don't need any fancy type-specifier parsing. Uses of this macro - ;; are confined to our own code. So the element-type is literally - ;; either :DEFAULT or BASE-CHAR. - (aver (member element-type '(base-char :default))) - (multiple-value-bind (forms decls) (parse-body body nil) - (if string - `(let ((,var (make-fill-pointer-output-stream ,string))) - ,@decls - ,@forms) - ;; Why not dxify this stream? - `(let ((,var #+sb-xc-host (make-string-output-stream) - #-sb-xc-host - ,(case element-type - ;; Non-unicode doesn't have %MAKE-DEFAULT-STRING-OSTREAM - #+sb-unicode - (:default '(%make-default-string-ostream)) - ;; and this macro is never employed to make streams - ;; that can only return CHARACTER string. - (t '(%make-base-string-ostream))))) - ,@decls - ,@forms - (get-output-stream-string ,var))))) - (in-package "SB-KERNEL") (defun fp-zero-p (x) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index 81e3861e28..42268ef930 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -2626,7 +2626,7 @@ ;; BOUNDP on a known global transforms to the constant T. (aver (not (%boundp '*available-buffers*))) (setf *available-buffers* nil)) - (with-simple-output-to-string (*error-output*) + (%with-output-to-string (*error-output*) (multiple-value-bind (in out err) #-win32 (values 0 1 2) #+win32 (sb-win32::get-std-handles) diff --git a/src/code/late-format.lisp b/src/code/late-format.lisp index f74fc053d4..14e1a706b5 100644 --- a/src/code/late-format.lisp +++ b/src/code/late-format.lisp @@ -1279,7 +1279,7 @@ (block nil ,@(when newline-segment-p `((setf newline-segment - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) ,@(expand-directive-list (pop segments)))) ,(expand-bind-defaults ((extra 0) @@ -1287,7 +1287,7 @@ (directive-params first-semi) `(setf extra-space ,extra line-len ,line-len)))) ,@(mapcar (lambda (segment) - `(push (with-simple-output-to-string (stream) + `(push (%with-output-to-string (stream) ,@(expand-directive-list segment)) segments)) segments)) diff --git a/src/code/load.lisp b/src/code/load.lisp index bb2f248836..14230e478f 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -273,7 +273,7 @@ ;; is convenient for and a requirement for writing to and reading from fasls ;; at this stage of the loading. WITH-STANDARD-IO-SYNTAX and WRITE-TO-STRING ;; would work, but this is simple enough to do by hand. - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) (let ((delimiter #\()) (dolist (symbol list) (write-char delimiter stream) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 7d0b742bb5..42a30ae290 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -1565,41 +1565,6 @@ symbol-case giving up: case=((V U) (F)) (setq ,abortp nil)) (when ,stream (close ,stream :abort ,abortp))))))) - -(sb-xc:defmacro with-output-to-string - ((var &optional string &key (element-type ''character)) - &body forms-decls) - (multiple-value-bind (forms decls) (parse-body forms-decls nil) - (if string - (let ((element-type-var (gensym))) - `(let ((,var (make-fill-pointer-output-stream ,string)) - ;; ELEMENT-TYPE isn't currently used for anything - ;; (see FILL-POINTER-OUTPUT-STREAM FIXME in stream.lisp), - ;; but it still has to be evaluated for side-effects. - (,element-type-var ,element-type)) - (declare (ignore ,element-type-var)) - ,@decls - (unwind-protect - (progn ,@forms) - (close ,var)))) - ;; I don't see why we need the unwind-protect. - ;; CLHS says: "The output string stream to which the variable /var/ - ;; is bound has dynamic extent; its extent ends when the form is exited." - ;; So technically you can't reference the stream after the string - ;; is returned. And since the implication is that we can legally DXify - ;; the stream, what difference does it make whether it's open or closed? - ;; Certainly in code that is compiled in SAFETY < 3 we should - ;; just not bother with the unwind-protect or the close. - `(let ((,var (make-string-output-stream - ;; CHARACTER is the default element-type of - ;; string-ouput-stream, save a few bytes when passing it - ,@(and (not (equal element-type ''character)) - `(:element-type ,element-type))))) - ,@decls - (unwind-protect - (progn ,@forms) - (close ,var)) - (get-output-stream-string ,var))))) ;;;; Iteration macros: diff --git a/src/code/print.lisp b/src/code/print.lisp index f8a9153d49..7ded984d39 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -193,7 +193,7 @@ variable: an unreadable object representing the error is printed instead.") (multiple-value-bind (fun pretty) (and *print-pretty* (pprint-dispatch object)) (if pretty - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) (sb-pretty::with-pretty-stream (stream) (funcall fun stream object))) (let ((buffer-size (approx-chars-in-repr object))) @@ -206,7 +206,7 @@ variable: an unreadable object representing the error is printed instead.") (finite-base-string-output-stream-pointer stream))))))) ;; Could do something for other numeric types, symbols, ... (t - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) (output-object object stream))))) ;;; Estimate the number of chars in the printed representation of OBJECT. diff --git a/src/code/run-program.lisp b/src/code/run-program.lisp index 0667fe50dd..c88a74b530 100644 --- a/src/code/run-program.lisp +++ b/src/code/run-program.lisp @@ -447,14 +447,14 @@ status slot." ;; No dice, try using the old-school method. (dolist (char '(#\p #\q)) (dotimes (digit 16) - (let* ((master-name (with-simple-output-to-string (str nil base-char) + (let* ((master-name (with-output-to-string (str nil :element-type 'base-char) (format str "/dev/pty~C~X" char digit))) (master-fd (sb-unix:unix-open master-name (logior sb-unix:o_rdwr sb-unix:o_noctty) #o666))) (when master-fd - (let* ((slave-name (with-simple-output-to-string (str nil base-char) + (let* ((slave-name (with-output-to-string (str nil :element-type 'base-char) (format str "/dev/tty~C~X" char digit))) (slave-fd (sb-unix:unix-open slave-name (logior sb-unix:o_rdwr @@ -630,7 +630,7 @@ status slot." #+win32 (defun prepare-args (args escape) - (with-simple-output-to-string (str) + (%with-output-to-string (str) (loop for (arg . rest) on args do (cond ((and escape @@ -1286,7 +1286,7 @@ Users Manual for details about the PROCESS structure. (or sb-sys::*software-version* (setf sb-sys::*software-version* (string-trim '(#\newline) - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) (run-program "/bin/uname" ;; "-r" on haiku just prints "1" ;; but "-v" prints some detail. diff --git a/src/code/stream.lisp b/src/code/stream.lisp index c03f6a8394..42535f31d9 100644 --- a/src/code/stream.lisp +++ b/src/code/stream.lisp @@ -1369,151 +1369,146 @@ ;;;; corrupt the heap here, it certainly is possible to end up with ;;;; a string-output-stream whose internal state is messed up. ;;;; -(defconstant +string-output-stream-buffer-initial-size+ 64) +(defun %init-string-output-stream (stream element-type initial-buffer) + (declare (optimize speed (sb-c::verify-arg-count 0))) + (setf (%instance-layout (truly-the instance stream)) #.(find-layout 'string-output-stream)) + #-sb-unicode (when element-type + (setq element-type 'base-char)) + (macrolet ((initforms () + `(setf ,@(mapcan (lambda (dsd) + (list `(%instance-ref stream ,(dsd-index dsd)) + (case (dsd-name dsd) + (sout '#'string-sout) ; global fun + (misc '#'misc) ; local fun + ((element-type unicode-p out sout-aux buffer) + (dsd-name dsd)) + (t (dsd-default dsd))))) + (dd-slots + (find-defstruct-description 'string-output-stream))))) + (cout (elt-type) + `(let ((pointer (string-output-stream-pointer + (truly-the string-output-stream stream))) + (buffer (truly-the (simple-array ,elt-type (*)) + (string-output-stream-buffer stream))) + (index (string-output-stream-index stream))) + (declare (optimize (sb-c::insert-array-bounds-checks 0))) + (when (= pointer (length buffer)) + ;; The usual doubling technique: the new buffer shall hold as many + ;; characters as were already emplaced. + (setf buffer (string-output-stream-new-buffer stream index) + pointer 0)) + (setf (aref (truly-the (simple-array ,elt-type (*)) buffer) pointer) + char + (string-output-stream-pointer stream) (1+ pointer)) + (setf (string-output-stream-index stream) (1+ index)))) + (sout (elt-type) + ;; Only one case cares whether the string contains non-base chars. + ;; base-string source and buffer : OK + ;; base-string source, character-string buffer : OK + ;; character-string source, base-string buf verifies base-char on copy + ;; character-string source + buf needs a pre-scan for Unicode. + `(etypecase src + #+sb-unicode + (simple-character-string + ,@(when (eq elt-type 'character) + ;; When UNICODE-P is NIL, meaning no non-base chars were seen yet + ;; in the input, pre-scan to see whether that still holds. + '((when (and (not (string-output-stream-unicode-p + (truly-the string-output-stream stream))) + (input-contains-unicode)) + (setf (string-output-stream-unicode-p stream) t + ;; no need to keep checking each character + (ansi-stream-out stream) #'character-out)))) + ;; There are transforms for all the necessary REPLACE variations. + (replace (truly-the (simple-array ,elt-type (*)) dst) + (truly-the simple-character-string src) + :start1 start1 :start2 start2 :end2 end2)) + (simple-base-string + (replace (truly-the (simple-array ,elt-type (*)) dst) + (truly-the simple-base-string src) + :start1 start1 :start2 start2 :end2 end2)))) + (input-contains-unicode () + ;; For streams with :DEFAULT element-type (producing the most space-efficient + ;; string that can hold the output), checking whether Unicode characters appear + ;; in the source material is potentially advantageous versus checking the + ;; buffer in GET-OUTPUT-STREAM-STRING, because if all source strings are + ;; BASE-STRING, we needn't check anything. + ;; Bounds check was already performed by ANSI-STREAM-WRITE-STRING + `(let ((s (truly-the simple-character-string src))) + (declare (optimize (sb-c::insert-array-bounds-checks 0))) + (loop for i from start2 below end2 + thereis (>= (char-code (aref s i)) base-char-code-limit))))) + ;; The "wonderful" thing is you never know where type checks have already been done. + ;; Is CHAR a character for sure? I have no idea. And how about the indices in SOUT? + (labels ((base-char-out (stream char) + (cout base-char)) + (character-out (stream char) + (cout character)) + (default-out (stream char) + (when (>= (char-code char) base-char-code-limit) + (setf (string-output-stream-unicode-p stream) t + ;; no need to keep checking each character + (ansi-stream-out stream) #'character-out)) + (cout character)) + (base-string-out (stream dst src start1 start2 end2) + (declare (ignorable stream) (index start1 start2 end2)) + (sout base-char)) + (char-string-out (stream dst src start1 start2 end2) + (declare (ignorable stream) (index start1 start2 end2)) + (sout character)) + (reject (&rest args) + (declare (ignore args)) + (error "Stream can not accept characters")) + (misc (stream operation &optional arg1 arg2) + ;; Intercept the misc handler to reset the Unicode state + ;; (since the char handlers are local functions). + ;; Technically this should be among the actions performed on :CLEAR-OUTPUT, + ;; which would also include *actually* clearing the output. But we don't. + (if (eq operation :reset) + (setf (string-output-stream-unicode-p stream) nil + ;; resume checking for Unicode characters + (ansi-stream-out stream) #'default-out) + (string-out-misc stream operation arg1 arg2)))) + (binding* (((unicode-p out sout-aux) + (case element-type + (base-char (values :ignore #'base-char-out #'base-string-out)) + (character (values t #'character-out #'char-string-out)) + ((nil) (values :ignore #'reject #'reject)) + (t (values nil #'default-out #'char-string-out)))) + (buffer + (cond ((not (eql initial-buffer 0)) initial-buffer) + ((eq element-type 'base-char) + (make-array 63 :element-type 'base-char)) ; 2w + 64b + (t ;; we should remove the trailing #\nul character + ;; for UCS4 strings. There's no reason for it. + (make-array 31 :element-type 'character))))) ; 2w + 128b + (initforms) + (truly-the string-output-stream stream))))) -(defstruct (string-output-stream - (:include ansi-stream - (sout #'string-sout) - (misc #'string-out-misc)) - (:constructor nil) - (:copier nil) - (:predicate nil)) - ;; Function to perform a piece of the SOUT operation - (sout-aux nil :type (sfunction (t t t t t) t) :read-only t) - ;; The string we throw stuff in. - (buffer nil :type (or simple-base-string simple-character-string)) - ;; Whether any non-base character has been written. - ;; BASE-STRING-OUTPUT-STREAM initializes this to :IGNORE - ;; which prevents SOUT from doing unnecessary work. - (unicode-p :ignore) - ;; Chains of buffers to use - (prev nil :type list) - (next nil :type list) - ;; Index of the next location to use in the current string. - (pointer 0 :type index) - ;; Global location in the stream - (index 0 :type index) - ;; Index cache: when we move backwards we save the greater of this - ;; and index here, so the greater of index and this is always the - ;; end of the stream. - (index-cache 0 :type index) - ;; Pseudo-actual element type. We no longer store the as-requested type. - ;; (If the value is :DEFAULT, we return CHARACTER on inquiry.) - (element-type nil :read-only t - :type (member #+sb-unicode :default - #+sb-unicode character - base-char nil))) - -;;; NB: BASE-STRING-OUTPUT-STREAM means a string-output-stream that holds BASE-CHAR. -;;; It is not the "ancestral type" of output streams. That's just STRING-OUTPUT-STREAM. -;;; -;;; This is not the only way to implement a more space-efficient string stream. -;;; One other possibility would be to have only one type of stream that buffers -;;; octets and uses UTF-8 encoding. But depending on how FILE-POSITION is supposed -;;; to work (if it is) for setting the position, using a variable-length encoding -;;; may not be a wise choice. -(defmacro def-string-stream (et kind) - ;; DEFSTRUCTs aren't so happy when buried in a macrolet, - ;; especially if we want to inline the constructor to stack-allocate the thing. - (let ((obj-type (symbolicate kind "-STRING-OSTREAM")) - (buf-type `(simple-array ,et (*))) - (ouch-fun (symbolicate kind "-STRING-OUCH"))) - `(progn - (defstruct (,obj-type - (:include string-output-stream - (buffer (make-string +string-output-stream-buffer-initial-size+ - :element-type ',et) - :type ,buf-type) - (out #',ouch-fun) - (sout-aux #',(symbolicate kind "-STRING-SOUT"))) - ,@(case et - (base-char - ;; BASE-STRING stream can create an output string - ;; of type (VECTOR NIL) - whether we need to or not, - ;; which seems somewhat in dispute - by supplying an - ;; element-type of NIL to the constructor. - `((:constructor %make-base-string-ostream - (&optional (element-type 'base-char))))) - (character - `((:constructor %make-default-string-ostream - (&aux (element-type :default) (unicode-p nil) - (out #'default-string-ouch))) - (:constructor %make-character-string-ostream - (&aux (element-type 'character) (unicode-p t)))))) - ;; Don't want a distinct family of accessors - (:conc-name string-output-stream-) - (:copier nil) - (:predicate nil))) - - (declaim (freeze-type ,obj-type)) - - ;; For CHARACTER stream, we define two OUCH functions, one which checks - ;; per each character whether it is above the range of base-char, - ;; setting UNICODE-P if true, and one which doesn't check. - ;; The checking version is used when the stream element type is :DEFAULT, - ;; which means that we want to try to return a BASE-STRING if possible. - ,@(flet ((define-char-out-fun (name initially) - `(defun ,name (stream char) - (declare (,et char)) - ,@initially - (let ((pointer (string-output-stream-pointer stream)) - (buffer (truly-the ,buf-type - (string-output-stream-buffer stream))) - (index (string-output-stream-index stream))) - (when (= pointer (length buffer)) - (setf buffer (string-output-stream-new-buffer stream index) - pointer 0)) - (setf (aref buffer pointer) char - (string-output-stream-pointer stream) (1+ pointer)) - (setf (string-output-stream-index stream) (1+ index)))))) - - (list - (when (eq et 'character) - (define-char-out-fun - 'default-string-ouch - '((when (>= (char-code char) base-char-code-limit) - (setf (string-output-stream-unicode-p stream) t - ;; no need to keep checking each character - (ansi-stream-out stream) #'character-string-ouch))))) - (define-char-out-fun ouch-fun nil))) - - ;; Define some helper functions for the STRING-SOUT method to handle - ;; all combinations of {base,character} source and destination string. - ;; REPLACE transforms (see src/compiler/seqtran) can handle those 4 cases - ;; efficiently, utilizing a bit-bash copier for same-sized copies, - ;; otherwise an inlined loop. The one case that needs to type-check each - ;; character copied is a Unicode source string into a stream of base-char, - ;; which may signal OBJECT-NOT-BASE-CHAR-ERROR. - (defun ,(symbolicate kind "-STRING-SOUT") (dst src start1 start2 end2) - (declare (index start1 start2 end2) (optimize speed)) - (macrolet ((copy (dst-type src-type) - `(replace (truly-the ,dst-type dst) - (truly-the ,src-type src) - :start1 start1 :start2 start2 :end2 end2))) - (etypecase src - #+sb-unicode (simple-character-string - (copy ,buf-type simple-character-string)) - (simple-base-string (copy ,buf-type simple-base-string)))))))) - -;; Define two stream types and 2 helper functions for copying strings -;; into the stream buffer for purposes of WRITE-STRING. -;; For non-unicode, only define BASE-STRING-OUTPUT-STREAM and 1 helper. -#+sb-unicode (def-string-stream character character) -(def-string-stream base-char base) - -(declaim (freeze-type string-output-stream)) -(defun make-string-output-stream (&key (element-type 'character)) +;;; Constructors used by the transform of MAKE-STRING-OUTPUT-STREAM, +;;; avoiding parsing of the specified element-type at runtime. +(defun %make-base-string-ostream () + (%init-string-output-stream (%allocate-string-ostream) 'base-char 0)) +(defun %make-character-string-ostream () + (%init-string-output-stream (%allocate-string-ostream) 'character 0)) + +(defun pick-string-ostream-type (element-type) + (let ((ctype (specifier-type element-type))) + (cond ((eq ctype *empty-type*) nil) + ((csubtypep ctype (specifier-type 'base-char)) 'base-char) + ((csubtypep ctype (specifier-type 'character)) 'character) + (t (error "~S is not a subtype of CHARACTER" element-type))))) + +(defun make-string-output-stream (&key (element-type 'character et-suppliedp)) "Return an output stream which will accumulate all output given it for the benefit of the function GET-OUTPUT-STREAM-STRING." (declare (explicit-check)) - (let ((ctype (specifier-type element-type))) - (cond ((csubtypep ctype (specifier-type 'base-char)) - (%make-base-string-ostream (if (eq ctype *empty-type*) nil 'base-char))) - #+sb-unicode - ((csubtypep ctype (specifier-type 'character)) - (%make-character-string-ostream)) - (t - (error "~S is not a subtype of CHARACTER" element-type))))) + (%init-string-output-stream + (%allocate-string-ostream) + ;; To be super pedantic, call the PICK routine even if #-sb-unicode + ;; to verify that the specifier is a subtype of character. + (if et-suppliedp (pick-string-ostream-type element-type) 'character) + 0)) ;;; Now that we support base-char string-output streams, it may be possible to eliminate ;;; this, though the other benefit it confers is that the buffer never needs to extend, @@ -1587,29 +1582,11 @@ benefit of the function GET-OUTPUT-STREAM-STRING." (defun string-sout (stream string start end) (declare (explicit-check string) (type index start end)) - (case (%other-pointer-widetag string) - #+sb-unicode - (#.sb-vm:simple-character-string-widetag - ;; For streams with :DEFAULT element-type (producing the most space-efficient - ;; string that can hold the output), checking whether Unicode characters appear - ;; in the source material is potentially advantageous versus checking the - ;; buffer in GET-OUTPUT-STREAM-STRING, because if all source strings are - ;; BASE-STRING, we needn't check anything. - ;; When UNICODE-P is NIL, then we care whether Unicode characters - ;; would be written, changing the flag to T. If non-nil, skip this. - (unless (string-output-stream-unicode-p stream) - ;; Bounds check was already performed by ANSI-STREAM-WRITE-STRING - (locally - (declare (optimize (sb-c::insert-array-bounds-checks 0))) - (let ((s (truly-the simple-character-string string))) - (when (loop for i from start below end - thereis (>= (char-code (aref s i)) base-char-code-limit)) - (setf (string-output-stream-unicode-p stream) t - ;; no need to keep checking each character - (ansi-stream-out stream) #'character-string-ouch)))))) - (#.sb-vm:simple-array-nil-widetag - (return-from string-sout ; fail if the span is nonempty - (if (> end start) (aref string start))))) + (when (typep (truly-the simple-string string) '(simple-array nil (*))) + ;; Such garbage that we have to deal with in all these routines + ;; for b.s. strings. + (return-from string-sout ; fail if the span is nonempty + (if (> end start) (aref string start)))) (let* ((full-length (- end start)) (length full-length) (buffer (string-output-stream-buffer stream)) @@ -1624,11 +1601,16 @@ benefit of the function GET-OUTPUT-STREAM-STRING." :more (when (plusp here) (funcall (string-output-stream-sout-aux stream) - buffer string pointer start stop) + stream buffer string pointer start stop) (setf (string-output-stream-pointer stream) (+ here pointer))) (when (plusp overflow) (setf start stop length (- end start) + ;; BUG: doesn't always enlarge as intended. Consider: + ;; - initial buffer capacity of 63 characters + ;; - WRITE-STRING with 2 characters setting INDEX=2, SPACE=61 + ;; - another WRITE-STRING with 62 characters. 61 copied, 1 overflow. + ;; - then new BUFFER length is (MAX OVERFLOW INDEX) = 2 buffer (string-output-stream-new-buffer stream (max overflow (string-output-stream-index stream))) pointer 0 @@ -1642,6 +1624,7 @@ benefit of the function GET-OUTPUT-STREAM-STRING." (incf (string-output-stream-index stream) full-length))) ;;; Factored out of the -misc method due to size. +;;; This is a steaming pile of horsecrap (lp#1839040) (defun set-string-output-stream-file-position (stream pos) (let* ((index (string-output-stream-index stream)) (end (max index (string-output-stream-index-cache stream)))) @@ -1759,12 +1742,9 @@ benefit of the function GET-OUTPUT-STREAM-STRING." (string-output-stream-next stream) nil) ;; Reset UNICODE-P unless it was :IGNORE or element-type is CHARACTER. - #+sb-unicode (when (and (eq (string-output-stream-element-type stream) :default) (eq (string-output-stream-unicode-p stream) t)) - (setf (string-output-stream-unicode-p stream) nil - ;; resume checking for Unicode characters - (ansi-stream-out stream) #'default-string-ouch)) + (funcall (ansi-stream-misc stream) stream :reset)) ;; There are exactly 3 cases that we have to deal with when copying: ;; CHARACTER-STRING into BASE-STRING (without type-checking per character) @@ -1775,16 +1755,18 @@ benefit of the function GET-OUTPUT-STREAM-STRING." ;; The first case occurs when and only when the element type is :DEFAULT and ;; only base characters were written. The other two cases can be handled ;; using BYTE-BLT with indices multiplied by either 1 or 4. - (flet ((copy (fun) + (flet ((copy (fun extra) (let ((start 0)) ; index into RESULT (declare (index start)) (dolist (buffer prev) - (funcall fun buffer start) + ;; It doesn't look as though we should have to pass RESULT + ;; in to FUN to avoid closure consing, but indeed we do. + (funcall fun result buffer start extra) (incf start (length buffer))) - (funcall fun this start) + (funcall fun result this start extra) (incf start (length this)) (dolist (buffer next) - (funcall fun buffer start) + (funcall fun result buffer start extra) (incf start (length buffer)))))) (if (and (eq (string-output-stream-element-type stream) :default) base-string-p) @@ -1792,24 +1774,28 @@ benefit of the function GET-OUTPUT-STREAM-STRING." ;; PRINx-TO-STRING, (FORMAT NIL ...), and many other constructs. ;; REPLACE will elide the type test per compilation policy ;; which is fine because we've already checked that it'll work. - (copy (lambda (source start) + (copy (lambda (result source start dummy) (declare (optimize speed (sb-c::type-check 0))) + (declare (ignore dummy)) (replace (the simple-base-string result) (the simple-character-string source) - :start1 start))) - (let ((scale (if base-string-p 0 2))) - (with-pinned-objects (result) + :start1 start)) + 0) + (with-pinned-objects (result) ;; BYTE-BLT doesn't know that it could use memcpy rather then memmove, ;; but it nonetheless should be faster than REPLACE. - (copy (lambda (source start) + (copy (lambda (result source start scale) + (declare (index start)) (let* ((length (min (- (length result) start) (length source))) (end (+ start length))) + (declare (index length end)) (with-pinned-objects (source) (%byte-blt (vector-sap source) 0 (vector-sap result) - (truly-the index (ash (the index start) scale)) - (truly-the index (ash (the index end) scale))))))))))) + (truly-the index (ash start scale)) + (truly-the index (ash end scale)))))) + (if base-string-p 0 2))))) result)) (defun finite-base-string-ouch (stream character) @@ -1878,15 +1864,38 @@ benefit of the function GET-OUTPUT-STREAM-STRING." (out #'fill-pointer-ouch) (sout #'fill-pointer-sout) (misc #'fill-pointer-misc)) - (:constructor make-fill-pointer-output-stream (string)) + (:constructor nil) (:copier nil) (:predicate nil)) ;; a string with a fill pointer where we stuff the stuff we write (string (missing-arg) :type string-with-fill-pointer :read-only t)) (declaim (freeze-type fill-pointer-output-stream)) +;;; TODO: specialize on string type? +(defun %init-fill-pointer-output-stream (stream string element-type) + (declare (optimize speed (sb-c::verify-arg-count 0))) + (declare (ignore element-type)) + (unless (and (stringp string) + (array-has-fill-pointer-p string)) + (error "~S is not a string with a fill-pointer" string)) + (setf (%instance-layout (truly-the instance stream)) + #.(find-layout 'fill-pointer-output-stream)) + (macrolet ((initforms () + `(setf ,@(mapcan (lambda (dsd) + (list `(%instance-ref stream ,(dsd-index dsd)) + (case (dsd-name dsd) + (string 'string) + (t (dsd-default dsd))))) + (dd-slots + (find-defstruct-description 'fill-pointer-output-stream)))))) + (initforms) + (truly-the fill-pointer-output-stream stream))) (defun fill-pointer-ouch (stream character) + ;; FIXME: ridiculously inefficient. Can we throw some TRULY-THEs in here? + ;; I think the prohibition against touching the string - implying that you can't + ;; decide to re-displace it - means we should be able to just look at the + ;; underlying vector, at least until we run out of space in it. (let* ((buffer (fill-pointer-output-stream-string stream)) (current (fill-pointer buffer)) (current+1 (1+ current))) diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index a850d9ab47..1d1c1d1e04 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -476,7 +476,7 @@ distinct from the global value. Can also be SETF." (code-char (+ (char-code #\0) r))) s))) (recurse 1 counter))) - (with-simple-output-to-string (s) + (%with-output-to-string (s) (write-string prefix s) (%output-integer-in-base counter 10 s))))) diff --git a/src/code/target-format.lisp b/src/code/target-format.lisp index 7eccbf0b5b..80c488df86 100644 --- a/src/code/target-format.lisp +++ b/src/code/target-format.lisp @@ -50,7 +50,7 @@ f)) (defun unparse-fmt-control (fmt) - (with-simple-output-to-string (s) + (%with-output-to-string (s) (write-char #\" s) (let ((symbols (fmt-control-symbols fmt))) (dolist (piece (tokenize-control-string (fmt-control-string fmt))) @@ -98,10 +98,10 @@ (dynamic-extent format-arguments)) (etypecase destination (null - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) (%format stream control-string format-arguments))) (string - (with-simple-output-to-string (stream destination) + (with-output-to-string (stream destination) (%format stream control-string format-arguments))) ((member t) (%format *standard-output* control-string format-arguments) @@ -1142,7 +1142,7 @@ (len (or (sb-impl::line-length stream) 72))) (directive-params first-semi) (setf newline-string - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) (setf args (interpret-directive-list stream (pop segments) @@ -1151,7 +1151,7 @@ (setf extra-space extra) (setf line-len len))) (dolist (segment segments) - (push (with-simple-output-to-string (stream) + (push (%with-output-to-string (stream) (setf args (interpret-directive-list stream segment orig-args args))) diff --git a/src/code/unix-pathname.lisp b/src/code/unix-pathname.lisp index 6e3846893b..9a11b0b3c7 100644 --- a/src/code/unix-pathname.lisp +++ b/src/code/unix-pathname.lisp @@ -162,7 +162,7 @@ (seperator-after-directory-p (or (pathname-component-present-p (pathname-name pathname)) (not as-file)))) - (with-simple-output-to-string (s) + (%with-output-to-string (s) (when directory (ecase (pop directory) (:absolute diff --git a/src/code/win32-pathname.lisp b/src/code/win32-pathname.lisp index 2517b036d4..ddd399f75f 100644 --- a/src/code/win32-pathname.lisp +++ b/src/code/win32-pathname.lisp @@ -259,7 +259,7 @@ (make-pathname :defaults pathname :directory (substitute :back :up directory)))))) (coerce - (with-simple-output-to-string (s) + (%with-output-to-string (s) (when absolutep (write-string (case device (:unc +unc-file-name-prefix+) diff --git a/src/compiler/debug.lisp b/src/compiler/debug.lisp index 92f05ab5fd..0038c8f028 100644 --- a/src/compiler/debug.lisp +++ b/src/compiler/debug.lisp @@ -1107,7 +1107,7 @@ (multiway-branch-if-eq (princ (vop-codegen-info vop))) (t - (princ (with-simple-output-to-string (stream) + (princ (%with-output-to-string (stream) ;; Current print depth varies based on whether PRINT-VOP ;; is called by DESCRIBE-IR2-COMPONENT or TRACE-INSTRUCTION, ;; so any fixed value of *PRINT-LEVEL* changes its effect diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 00df18673b..c318c8b3cd 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -1250,12 +1250,14 @@ (defknown sb-impl::%init-string-input-stream (instance string &optional index sequence-end) (values sb-impl::string-input-stream index &optional) (flushable)) +(defknown sb-impl::%init-string-output-stream (instance t t) sb-impl::string-output-stream + ;; Not flushable, for two reasons: + ;; - possibly need to verify that the second arg is a type specifier + ;; - if you don't initialize the stream, then GET-OUTPUT-STRING-STREAM will crash + ()) (defknown make-string-output-stream (&key (:element-type type-specifier)) sb-impl::string-output-stream (flushable)) -;; FIXME: sb-impl::string-output-stream as the result type causes a few -;; "CROSS-TYPEP uncertain: CTYPEP T #" -;; warnings which need to be resolved. (defknown get-output-stream-string (stream) simple-string ()) (defknown streamp (t) boolean (movable foldable flushable)) (defknown stream-element-type (stream) type-specifier ; can it return a CLASS? @@ -2045,7 +2047,7 @@ ;;; by wiring in the needed functions instead of dereferencing their fdefns. (defknown (ill-in ill-bin ill-out ill-bout sb-impl::string-inch sb-impl::string-in-misc - sb-impl::string-ouch sb-impl::string-sout sb-impl::string-out-misc + sb-impl::string-sout sb-impl::finite-base-string-ouch sb-impl::finite-base-string-out-misc sb-impl::fill-pointer-ouch sb-impl::fill-pointer-sout sb-impl::fill-pointer-misc diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index d19ad9b527..e4401dee5a 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -323,7 +323,7 @@ (let* ((vop (tn-ref-vop op)) (args (vop-args vop)) (results (vop-results vop)) - (name (with-simple-output-to-string (stream) + (name (%with-output-to-string (stream) (print-tn-guts tn stream))) (2comp (component-info *component-being-compiled*)) temp) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 56c0c3ed51..8c3c5e6e71 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -411,7 +411,7 @@ (csubtypep type (specifier-type 'eq-comparable-type))) (defun specialized-list-seek-function-name (function-name key-functions &optional variant) - (or (find-symbol (with-simple-output-to-string (s) + (or (find-symbol (%with-output-to-string (s) ;; Write "%NAME-FUN1-FUN2-FUN3", etc. Not only is ;; this ever so slightly faster then FORMAT, this ;; way we are also proof against *PRINT-CASE* diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index caf02f2fee..d9b18fb129 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -4531,7 +4531,7 @@ (let ((arg-names (make-gensym-list (length args)))) `(lambda (stream control ,@arg-names) (declare (ignore stream)) - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) (funcall control stream ,@arg-names))))) (defun concatenate-format-p (control args) diff --git a/src/pcl/documentation.lisp b/src/pcl/documentation.lisp index cb66eb2fc5..27a257d92f 100644 --- a/src/pcl/documentation.lisp +++ b/src/pcl/documentation.lisp @@ -168,7 +168,7 @@ (binding* (((state since replacements) (deprecated-thing-p namespace name)) (note (when state - (with-simple-output-to-string (stream) + (%with-output-to-string (stream) (sb-impl::print-deprecation-message namespace name (first since) (second since) replacements stream))))) diff --git a/tests/dynamic-extent.impure.lisp b/tests/dynamic-extent.impure.lisp index 8cf02f6834..98fbee7639 100644 --- a/tests/dynamic-extent.impure.lisp +++ b/tests/dynamic-extent.impure.lisp @@ -1601,3 +1601,9 @@ 0)) :allow-notes nil))) (assert-no-consing (funcall fun)))) + +(with-test (:name :with-output-to-string) + (let ((s (make-array 20000 :fill-pointer 0 :element-type 'character))) + (assert-no-consing + (with-output-to-string (*standard-output* s) + (write-char #\x))))) diff --git a/tests/stream.pure.lisp b/tests/stream.pure.lisp index 90aa39dbdb..a673e70904 100644 --- a/tests/stream.pure.lisp +++ b/tests/stream.pure.lisp @@ -472,7 +472,7 @@ #+sb-unicode (with-test (:name (:default-char-stream-resets)) - (let ((s (sb-impl::%make-default-string-ostream))) + (sb-impl::%with-output-to-string (s) (dotimes (i 2) (write-char (code-char 1000) s) (assert (equal (type-of (get-output-stream-string s)) From 0aa344fe1f32b59af4ae7990d41d07aa00ad1633 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 1 Jun 2020 15:47:47 +0300 Subject: [PATCH 0060/4023] reader.pure/read-does-not-cons-per-se doesn't pass on +32-bit. Due to single-floats. --- tests/reader.pure.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index 8b463cf484..aed2b0ee24 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -361,7 +361,8 @@ ;; - the initial cons cell in READ-LIST (with-test (:name :read-does-not-cons-per-se :skipped-on (:or (:not :stack-allocatable-fixed-objects) - :interpreter)) + :32-bit ;; single-floats + :interpreter)) (flet ((test-reading (string) (let ((s (make-string-input-stream string))) (read s) ; once outside the loop, to make A-SYMBOL From b7c7f34e5cfa2d5bb49c4982531dc0641b15c021 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 1 Jun 2020 15:52:00 +0300 Subject: [PATCH 0061/4023] win32-os.c: remove reimplementations of printf, fprintf. Doesn't fit well -fno-common and isn't a nice thing to do overall. Reported by Jinsong Zhao. --- src/runtime/win32-os.c | 48 ------------------------------------------ 1 file changed, 48 deletions(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 2354bd40de..a92934dc52 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -679,54 +679,6 @@ int os_preinit(char *argv[], char *envp[]) } #endif /* LISP_FEATURE_SB_THREAD */ - -#ifdef LISP_FEATURE_X86_64 -/* Windows has 32-bit 'longs', so printf...%lX (and other %l patterns) doesn't - * work well with address-sized values, like it's done all over the place in - * SBCL. And msvcrt uses I64, not LL, for printing long longs. - * - * I've already had enough search/replace with longs/words/intptr_t for today, - * so I prefer to solve this problem with a format string translator. */ - -/* There is (will be) defines for printf and friends. */ - -static int translating_vfprintf(FILE*stream, const char *fmt, va_list args) -{ - char translated[1024]; - unsigned i=0, delta = 0; - - while (fmt[i-delta] && i Date: Mon, 1 Jun 2020 15:57:27 +0300 Subject: [PATCH 0062/4023] Fix a compile-time type error in %check-bound. Fixes lp#1881198 --- src/compiler/array-tran.lisp | 11 +++++++---- tests/array.pure.lisp | 8 ++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index 4b65a64007..0e11226cc1 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -1426,15 +1426,18 @@ (ref-p array-ref) (ref-p index-ref) (or - (let ((index-leaf (ref-leaf index-ref))) + (let* ((index-leaf (ref-leaf index-ref)) + (index-value (and (constant-p index-leaf) + (constant-value index-leaf))) + (index-value (and (integerp index-value) + index-value))) (loop for constraint in (ref-constraints array-ref) for y = (constraint-y constraint) thereis (and (eq (constraint-kind constraint) 'array-in-bounds-p) - (if (constant-p index-leaf) + (if index-value (and (constant-p y) - (<= (constant-value index-leaf) - (constant-value y))) + (<= index-value (constant-value y))) (eq index-leaf y))))) (loop for constraint in (ref-constraints index-ref) thereis (and (eq (constraint-kind constraint) 'array-in-bounds-p) diff --git a/tests/array.pure.lisp b/tests/array.pure.lisp index 5c7f96bb2a..f09e9ec67c 100644 --- a/tests/array.pure.lisp +++ b/tests/array.pure.lisp @@ -590,3 +590,11 @@ (lambda (x) (make-array 1 :displaced-to (the vector x) :initial-contents '(1)))) :allow-warnings t)))) + +(with-test (:name :check-bound-type-error) + (assert (nth-value 2 + (checked-compile + `(lambda (p) + (unless (svref p 0) + (svref p nil))) + :allow-warnings t)))) From fc414213c6cf285b64abdc0b4e4b75d6c4d556cc Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 1 Jun 2020 16:03:04 +0300 Subject: [PATCH 0063/4023] ansi-test: mark LOGICAL-PATHNAME.ERROR.9 as failing. Due to the dynamic-extent stream in with-output-to-string. --- tests/ansi-tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ansi-tests.sh b/tests/ansi-tests.sh index c975a986b3..f6f740ed69 100755 --- a/tests/ansi-tests.sh +++ b/tests/ansi-tests.sh @@ -40,6 +40,7 @@ cd ansi-test "SUBTYPEP-COMPLEX.8" "SUBTYPEP.CONS.38" "SUBTYPEP.CONS.41" "SUBTYPEP.CONS.43" "SUBTYPEP.EQL.1" "SUBTYPEP.EQL.2" "SUBTYPEP.MEMBER.17" "SUBTYPEP.MEMBER.18" "SXHASH.17" "SXHASH.18" "SXHASH.19" "TYPE-OF.1" "PRINT-STRUCTURE.1" + "LOGICAL-PATHNAME.ERROR.9" #+x86 (list "ACOSH.3" "SQRT.4") #+win32 (list "ASINH.1" "ASINH.2" "ASINH.3" "ASINH.7" "ACOSH.3" "EXP.ERROR.7" "EXPT.ERROR.4" "EXPT.ERROR.5" "EXPT.ERROR.6" "EXPT.ERROR.7" From 3d736c50a76a4d65235310bb48118aade6100223 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 1 Jun 2020 17:20:35 +0300 Subject: [PATCH 0064/4023] There's no 32-bit feature. --- tests/reader.pure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index aed2b0ee24..5ac05e4905 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -361,7 +361,7 @@ ;; - the initial cons cell in READ-LIST (with-test (:name :read-does-not-cons-per-se :skipped-on (:or (:not :stack-allocatable-fixed-objects) - :32-bit ;; single-floats + (not 64-bit) ;; single-floats :interpreter)) (flet ((test-reading (string) (let ((s (make-string-input-stream string))) From 18fc1a3b8f87016afe0868e881df041ca2dc3bde Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 12:26:29 -0400 Subject: [PATCH 0065/4023] Avoid compiler notes if can't stack-allocate strings --- src/code/ansi-stream.lisp | 48 ++++------------------------ src/code/macros.lisp | 35 +++++++++++++++++++++ src/code/stream.lisp | 66 ++++++++++++++++++++------------------- tests/reader.pure.lisp | 3 +- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/code/ansi-stream.lisp b/src/code/ansi-stream.lisp index 6c0ccb40ba..fb0d695d5f 100644 --- a/src/code/ansi-stream.lisp +++ b/src/code/ansi-stream.lisp @@ -264,10 +264,11 @@ (defmacro %allocate-string-ostream () `(%make-instance ,(dd-length (find-defstruct-description 'string-output-stream)))) + (defmacro with-output-to-string ((var &optional string &key (element-type ''character)) &body body) - (let ((initial-buffer '#:buf) (dummy '#:stream)) - (if string + (if string + (let ((dummy '#:stream)) ;; "If string is supplied, element-type is ignored". ;; Why do implementors take this to mean "evaluated and ignored?" ;; I would have figured it meant expansion-time ignored. @@ -280,48 +281,11 @@ ;; "The stream variables established by ... with-output-to-string ;; are, by definition, always used" (declare (ignorable ,var)) - ,@body)) - ;; Should we call CONSTANTP and CONSTANT-FORM-VALUE and TYPEXPAND first? - (let ((et (cond ((or (equal element-type ''base-char) - (equal element-type ''standard-char)) - 'base-char) - ((equal element-type ''character) - 'character)))) - ;; This is simpler than trying to arrange transforms that cause - ;; MAKE-STRING-OUTPUT-STREAM to be DXable. While that might be awesome, - ;; this macro exists for a reason. - (if et - `(dx-let ((,dummy (%allocate-string-ostream)) - (,initial-buffer (make-array 31 :element-type ',et))) - (let ((,var (%init-string-output-stream ,dummy ',et ,initial-buffer))) - (declare (ignorable ,var)) - ,@body) - ;; On the architecture that does not support #+stack-allocatable-fixed-objects - ;; (Sparc) we could close the stream, but what's the point of doing that - ;; whem you're expressly prohibited by the standard from using the variable - ;; outside of its extent as specified? Just fix the backend if it bothers you. - ;; And I'm not even considering the obsolete backends. - (get-output-stream-string ,dummy)) - `(dx-let ((,dummy (%allocate-string-ostream))) - (let ((,var (%init-string-output-stream - ,dummy - ;; Transforms on this which avoid type-parsing would not help- - ;; the dxified buffer has to be of that type also. - ;; And I'll bet that most people use a literal :ELEMENT-TYPE - ;; which gets the better code above. - (pick-string-ostream-type ,element-type) - 0))) - (declare (ignorable ,var)) - ,@body) - (get-output-stream-string ,dummy))))))) + ,@body))) + (expand-with-output-to-string var element-type body nil))) ;;; Similar to WITH-OUTPUT-TO-STRING, but produces the most compact result ;;; string possible (BASE or CHARACTER) depending on what was written. ;;; This is not something that the standard macro permits. (defmacro %with-output-to-string ((var) &body body) - (let ((initial-buffer '#:buf) (dummy '#:stream)) - `(dx-let ((,dummy (%allocate-string-ostream)) - (,initial-buffer (make-array 31 :element-type 'character))) - (let ((,var (%init-string-output-stream ,dummy :default ,initial-buffer))) - ,@body) - (get-output-stream-string ,dummy)))) + (expand-with-output-to-string var ''character body t)) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 42a30ae290..575a693665 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -1774,3 +1774,38 @@ symbol-case giving up: case=((V U) (F)) ;; is cheaper than a branch around a write. (rplacd (truly-the cons ,splice) ,orig))) ,copy)))))) + +(defun expand-with-output-to-string (var element-type body wild-result-type) + ;; This is simpler than trying to arrange transforms that cause + ;; MAKE-STRING-OUTPUT-STREAM to be DXable. While that might be awesome, + ;; this macro exists for a reason. + (let ((initial-buffer '#:buf) + (dummy '#:stream) + (string-let (or #+c-stack-is-control-stack 'dx-let 'let)) + (string-ctor + (if (and (sb-xc:constantp element-type) + (let ((ctype (sb-c::careful-specifier-type + (constant-form-value element-type)))) + (and ctype + (csubtypep ctype (specifier-type 'character))))) + ;; Using MAKE-ARRAY avoids a style-warning if et is 'STANDARD-CHAR: + ;; "The default initial element #\Nul is not a STANDARD-CHAR." + 'make-array ; hooray! it's known be a valid string type + ;; Force a runtime STRINGP check unless futher transforms + ;; deduce a known type. You'll get "could not stack allocate" + ;; perhaps, but that's acceptable. + 'make-string))) + ;; A full call to MAKE-STRING-OUTPUT-STREAM uses a larger initial buffer + ;; if BASE-CHAR but I really don't care to think about that here. + `(,string-let ((,initial-buffer (,string-ctor 31 :element-type ,element-type))) + (dx-let ((,dummy (%allocate-string-ostream))) + (let ((,var (%init-string-output-stream ,dummy ,initial-buffer + ,wild-result-type))) + (declare (ignorable ,var)) + ,@body) + ;; On the architecture that does not support #+stack-allocatable-fixed-objects + ;; (Sparc) we could close the stream, but what's the point of doing that + ;; whem you're expressly prohibited by the standard from using the variable + ;; outside of its extent as specified? Just fix the backend if it bothers you. + ;; And I'm not even considering the obsolete backends. + (get-output-stream-string ,dummy))))) diff --git a/src/code/stream.lisp b/src/code/stream.lisp index 42535f31d9..a872761770 100644 --- a/src/code/stream.lisp +++ b/src/code/stream.lisp @@ -1369,11 +1369,11 @@ ;;;; corrupt the heap here, it certainly is possible to end up with ;;;; a string-output-stream whose internal state is messed up. ;;;; -(defun %init-string-output-stream (stream element-type initial-buffer) +(defun %init-string-output-stream (stream buffer wild-result-type) (declare (optimize speed (sb-c::verify-arg-count 0))) + (declare (string buffer) + (ignorable wild-result-type)) ; if #-sb-unicode (setf (%instance-layout (truly-the instance stream)) #.(find-layout 'string-output-stream)) - #-sb-unicode (when element-type - (setq element-type 'base-char)) (macrolet ((initforms () `(setf ,@(mapcan (lambda (dsd) (list `(%instance-ref stream ,(dsd-index dsd)) @@ -1469,46 +1469,48 @@ ;; resume checking for Unicode characters (ansi-stream-out stream) #'default-out) (string-out-misc stream operation arg1 arg2)))) - (binding* (((unicode-p out sout-aux) - (case element-type - (base-char (values :ignore #'base-char-out #'base-string-out)) - (character (values t #'character-out #'char-string-out)) - ((nil) (values :ignore #'reject #'reject)) - (t (values nil #'default-out #'char-string-out)))) - (buffer - (cond ((not (eql initial-buffer 0)) initial-buffer) - ((eq element-type 'base-char) - (make-array 63 :element-type 'base-char)) ; 2w + 64b - (t ;; we should remove the trailing #\nul character - ;; for UCS4 strings. There's no reason for it. - (make-array 31 :element-type 'character))))) ; 2w + 128b + (multiple-value-bind (element-type unicode-p out sout-aux) + (case (%other-pointer-widetag buffer) + #+sb-unicode + (#.sb-vm:simple-character-string-widetag + (if wild-result-type + (values :default nil #'default-out #'char-string-out) + (values 'character t #'character-out #'char-string-out))) + (#.sb-vm:simple-base-string-widetag + (values 'base-char :ignore #'base-char-out #'base-string-out)) + (t + (values nil :ignore #'reject #'reject))) (initforms) (truly-the string-output-stream stream))))) ;;; Constructors used by the transform of MAKE-STRING-OUTPUT-STREAM, ;;; avoiding parsing of the specified element-type at runtime. (defun %make-base-string-ostream () - (%init-string-output-stream (%allocate-string-ostream) 'base-char 0)) + (%init-string-output-stream (%allocate-string-ostream) + (make-array 63 :element-type 'base-char) ; 2w + 64b + nil)) (defun %make-character-string-ostream () - (%init-string-output-stream (%allocate-string-ostream) 'character 0)) + (%init-string-output-stream (%allocate-string-ostream) + (make-array 31 :element-type 'character) ; 2w + 128b + nil)) -(defun pick-string-ostream-type (element-type) - (let ((ctype (specifier-type element-type))) - (cond ((eq ctype *empty-type*) nil) - ((csubtypep ctype (specifier-type 'base-char)) 'base-char) - ((csubtypep ctype (specifier-type 'character)) 'character) - (t (error "~S is not a subtype of CHARACTER" element-type))))) - -(defun make-string-output-stream (&key (element-type 'character et-suppliedp)) +(defun make-string-output-stream (&key (element-type 'character)) "Return an output stream which will accumulate all output given it for the benefit of the function GET-OUTPUT-STREAM-STRING." (declare (explicit-check)) - (%init-string-output-stream - (%allocate-string-ostream) - ;; To be super pedantic, call the PICK routine even if #-sb-unicode - ;; to verify that the specifier is a subtype of character. - (if et-suppliedp (pick-string-ostream-type element-type) 'character) - 0)) + ;; No point in optimizing for unsupplied ELEMENT-TYPE. + ;; Compiler transforms into %MAKE-CHARACTER-STRING-OSTREAM. + (let ((ctype (specifier-type element-type))) + (cond ((eq ctype *empty-type*) + (%init-string-output-stream (%allocate-string-ostream) + (make-array 0 :element-type nil) + nil)) + ((csubtypep ctype (specifier-type 'base-char)) + (%make-base-string-ostream)) + ((csubtypep ctype (specifier-type 'character)) + (%make-character-string-ostream)) + (t + (error "~S is not a subtype of CHARACTER" element-type))))) ;;; Now that we support base-char string-output streams, it may be possible to eliminate ;;; this, though the other benefit it confers is that the buffer never needs to extend, diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index 5ac05e4905..239cde8e24 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -361,7 +361,6 @@ ;; - the initial cons cell in READ-LIST (with-test (:name :read-does-not-cons-per-se :skipped-on (:or (:not :stack-allocatable-fixed-objects) - (not 64-bit) ;; single-floats :interpreter)) (flet ((test-reading (string) (let ((s (make-string-input-stream string))) @@ -391,7 +390,7 @@ ;; impossible to cons 1 byte per run. ;; If this still fails, it might be due to somebody changing the ;; backend-page-bytes to exceed 32KB. Not sure what to do about that. - (test-reading "4.0s0") + #+64-bit (test-reading "4.0s0") (test-reading "COMMON-LISP-USER::A-SYMBOL") (test-reading "()") (test-reading "#\\-") ; should not copy the token buffer From 273b49c3c655b7bb9fb73adcfaf6cf77136d4f57 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 1 Jun 2020 22:09:26 +0300 Subject: [PATCH 0066/4023] Revert "ansi-test: mark LOGICAL-PATHNAME.ERROR.9 as failing." This reverts commit fc414213c6cf285b64abdc0b4e4b75d6c4d556cc. --- tests/ansi-tests.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/ansi-tests.sh b/tests/ansi-tests.sh index f6f740ed69..c975a986b3 100755 --- a/tests/ansi-tests.sh +++ b/tests/ansi-tests.sh @@ -40,7 +40,6 @@ cd ansi-test "SUBTYPEP-COMPLEX.8" "SUBTYPEP.CONS.38" "SUBTYPEP.CONS.41" "SUBTYPEP.CONS.43" "SUBTYPEP.EQL.1" "SUBTYPEP.EQL.2" "SUBTYPEP.MEMBER.17" "SUBTYPEP.MEMBER.18" "SXHASH.17" "SXHASH.18" "SXHASH.19" "TYPE-OF.1" "PRINT-STRUCTURE.1" - "LOGICAL-PATHNAME.ERROR.9" #+x86 (list "ACOSH.3" "SQRT.4") #+win32 (list "ASINH.1" "ASINH.2" "ASINH.3" "ASINH.7" "ACOSH.3" "EXP.ERROR.7" "EXPT.ERROR.4" "EXPT.ERROR.5" "EXPT.ERROR.6" "EXPT.ERROR.7" From 1f6f9dce99ab778017903a905d57e6403cfb78bb Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 16:38:33 -0400 Subject: [PATCH 0067/4023] Capture the type of type-error-datum if stack-allocated This doesn't do anything with it yet. --- package-data-list.lisp-expr | 1 + src/code/condition.lisp | 135 +++++++++++++++++++++----------- src/code/early-impl.lisp | 6 ++ src/code/target-hash-table.lisp | 6 -- tests/condition.pure.lisp | 9 +++ 5 files changed, 106 insertions(+), 51 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 44e5066b07..fd2f50170f 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2102,6 +2102,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries." "TYPE-SINGLE-VALUE-P" "TYPE-SPECIFIER" "TYPE-UNION" "TYPE/=" "TYPE=" "TYPES-EQUAL-OR-INTERSECT" "TYPE-OR-NIL-IF-UNKNOWN" + "TYPE-ERROR-DATUM-STORED-TYPE" "UNBOUND-SYMBOL-ERROR" "UNBOXED-ARRAY" "UNDEFINED-FUN-ERROR" "UNDEFINED-ALIEN-FUN-ERROR" "UNION-TYPE" "UNION-TYPE-P" diff --git a/src/code/condition.lisp b/src/code/condition.lisp index 2ec7982242..4ae11248a4 100644 --- a/src/code/condition.lisp +++ b/src/code/condition.lisp @@ -178,16 +178,22 @@ ;;;; MAKE-CONDITION +;;; Pre-scan INITARGS to see whether any are stack-allocated. +;;; If not, then life is easy. If any are, then depending on whether the +;;; condition is a TYPE-ERROR, call TYPE-OF on the bad datum, so that +;;; if the condition outlives the extent of the object, and someone tries +;;; to print the condition, we don't crash. +;;; Putting a placeholder in for the datum would work, but seems a bit evil, +;;; since the user might actually want to know what it was. And we shouldn't +;;; assume that the object would definitely escape its dynamic-extent. + (defun allocate-condition (designator &rest initargs) (when (oddp (length initargs)) (error 'simple-error :format-control "odd-length initializer list: ~S." - :format-arguments - (let (list) - ;; avoid direct reference to INITARGS as a list - ;; so that it is not reified unless we reach here. - (do-rest-arg ((arg) initargs) (push arg list)) - (list (nreverse list))))) + ;; Passing the initargs to LIST avoids consing them into + ;; a list except when this error is signaled. + :format-arguments (list (apply #'list initargs)))) ;; I am going to assume that people are not somehow getting to here ;; with a CLASSOID, which is not strictly legal as a designator, ;; but which is accepted because it is actually the desired thing. @@ -198,45 +204,84 @@ (symbol (find-classoid designator nil)) (class (lookup (class-name designator))) (t designator))))) - (if (condition-classoid-p classoid) - ;; Interestingly we fail to validate the actual-initargs, - ;; allowing any random initarg names. Is this permissible? - ;; And why is lazily filling in ASSIGNED-SLOTS beneficial anyway? - (let* ((layout (classoid-layout classoid)) - (stream-err-p - (let ((stream-err-layout (load-time-value (find-layout 'stream-error)))) - (or (eq layout stream-err-layout) - (find stream-err-layout (layout-inherits layout))))) - (instance (%make-instance (+ sb-vm:instance-data-start - 1 ; ASSIGNED-SLOTS - (length initargs)))) ; rest - (data-index (1+ sb-vm:instance-data-start)) - (arg-index 0)) - (setf (%instance-layout instance) layout - (condition-assigned-slots instance) nil) - ;; Replace a dynamic-extent stream with a stub. Doing it in this low-level - ;; allocator is more robust than trying to intercept all conceivable ways - ;; in which to construct an instance of a subtype of STREAM-ERROR - ;; (e.g. through the function READER-EOF-ERROR, SIMPLE-READER-ERROR, etc) - ;; DO-REST-ARG doesn't quite fit the bill for this. - ;; And it's what you might call really poor separation of concerns. - (loop (when (>= arg-index (length initargs)) (return)) - (let ((key (fast-&rest-nth arg-index initargs)) - (val (fast-&rest-nth (1+ arg-index) initargs))) - (setf (%instance-ref instance data-index) key - (%instance-ref instance (1+ data-index)) - (if (and stream-err-p (eq key :stream) (stack-allocated-p val)) - (sb-impl::make-stub-stream val) - val)) - (incf arg-index 2) - (incf data-index 2))) - (values instance classoid)) - (error 'simple-type-error - :datum designator - ;; CONDITION-CLASS isn't a type-specifier. Is this legal? - :expected-type 'condition-class - :format-control "~S does not designate a condition class." - :format-arguments (list designator))))) + (unless (condition-classoid-p classoid) + (error 'simple-type-error + :datum designator + :expected-type 'sb-pcl::condition-class + :format-control "~S does not designate a condition class." + :format-arguments (list designator))) + (flet ((stream-err-p (layout) + (let ((stream-err-layout (load-time-value (find-layout 'stream-error)))) + (or (eq layout stream-err-layout) + (find stream-err-layout (layout-inherits layout))))) + (type-err-p (layout) + (let ((type-err-layout (load-time-value (find-layout 'type-error)))) + (or (eq layout type-err-layout) + (find type-err-layout (layout-inherits layout))))) + ;; avoid full calls to STACK-ALLOCATED-P here + (stackp (x) + (let ((addr (get-lisp-obj-address x))) + (and (sb-vm:is-lisp-pointer addr) + (<= (get-lisp-obj-address sb-vm:*control-stack-start*) addr) + (< addr (get-lisp-obj-address sb-vm:*control-stack-end*)))))) + (let* ((any-dx + (loop for arg-index from 1 below (length initargs) by 2 + thereis (stackp (fast-&rest-nth arg-index initargs)))) + (layout (classoid-layout classoid)) + (extra (if (and any-dx (type-err-p layout)) 2 0)) ; space for secret initarg + (instance (%make-instance (+ sb-vm:instance-data-start + 1 ; ASSIGNED-SLOTS + (length initargs) + extra))) + (data-index (1+ sb-vm:instance-data-start)) + (arg-index 0) + (have-type-error-datum) + (type-error-datum)) + (setf (%instance-layout instance) layout + (condition-assigned-slots instance) nil) + (macrolet ((store-pair (key val) + `(setf (%instance-ref instance data-index) ,key + (%instance-ref instance (1+ data-index)) ,val))) + (cond ((not any-dx) + ;; uncomplicated way + (loop (when (>= arg-index (length initargs)) (return)) + (store-pair (fast-&rest-nth arg-index initargs) + (fast-&rest-nth (1+ arg-index) initargs)) + (incf data-index 2) + (incf arg-index 2))) + (t + (loop (when (>= arg-index (length initargs)) (return)) + (let ((key (fast-&rest-nth arg-index initargs)) + (val (fast-&rest-nth (1+ arg-index) initargs))) + (when (and (eq key :datum) + (not have-type-error-datum) + (type-err-p layout)) + (setq type-error-datum val + have-type-error-datum t)) + (if (and (eq key :stream) (stream-err-p layout) (stackp val)) + (store-pair key (sb-impl::make-stub-stream val)) + (store-pair key val))) + (incf data-index 2) + (incf arg-index 2)) + (when (and have-type-error-datum (/= extra 0)) + ;; We can get into serious trouble here if the + ;; datum is already stack garbage! + (let ((actual-type (type-of type-error-datum))) + (store-pair 'dx-object-type actual-type)))))) + (values instance classoid))))) + +;;; Access the type of type-error-datum if the datum can't be accessed. +;;; Testing the stack pointer when rendering the condition is a heuristic +;;; that might work, but more likely, the erring frame has been exited +;;; and then the stack pointer changed again to make it seems like the +;;; object pointer is valid. I'm not sure what to do, but we can leave +;;; that decision for later. +(defun type-error-datum-stored-type (condition) + (do ((i (- (%instance-length condition) 2) (- i 2))) + ((<= i (1+ sb-vm:instance-data-start)) + (make-unbound-marker)) + (when (eq (%instance-ref condition i) 'dx-object-type) + (return (%instance-ref condition (1+ i)))))) (defun make-condition (type &rest initargs) "Make an instance of a condition object using the specified initargs." diff --git a/src/code/early-impl.lisp b/src/code/early-impl.lisp index 70754f90b0..21d543697e 100644 --- a/src/code/early-impl.lisp +++ b/src/code/early-impl.lisp @@ -71,3 +71,9 @@ an implementation of EVAL that calls the compiler will be used. If set to :INTERPRET, an interpreter will be used.") (declaim (always-bound *evaluator-mode*)) + +(declaim (inline sb-vm:is-lisp-pointer)) +(defun sb-vm:is-lisp-pointer (addr) ; Same as is_lisp_pointer() in C + #-64-bit (oddp addr) + #+ppc64 (= (logand addr #b101) #b100) + #+(and 64-bit (not ppc64)) (not (logtest (logxor addr 3) 3))) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 7ebe28c395..1178d6c3c9 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -115,12 +115,6 @@ (setf (,thread-slot-accessor ,hash-table) nil))) (body-fun))))))) -(declaim (inline sb-vm:is-lisp-pointer)) -(defun sb-vm:is-lisp-pointer (addr) ; Same as is_lisp_pointer() in C - #-64-bit (oddp addr) - #+ppc64 (= (logand addr #b101) #b100) - #+(and 64-bit (not ppc64)) (not (logtest (logxor addr 3) 3))) - #-sb-fluid (declaim (inline eq-hash)) (defun eq-hash (key) (declare (values fixnum (member t nil))) diff --git a/tests/condition.pure.lisp b/tests/condition.pure.lisp index 009ab77f7d..f35db99073 100644 --- a/tests/condition.pure.lisp +++ b/tests/condition.pure.lisp @@ -437,3 +437,12 @@ is not of type (declare (ignore newcond)) (assert (string= (write-to-string error :escape nil) "odd-length initializer list: (:A 1 :B).")))) + +(with-test (:name :type-error-on-dx-object) + (handler-case + (sb-int:dx-let ((a (make-array 3))) + (setf (aref a 0) a) + (print (1+ (aref a 0)))) + (error (e) + (assert (equal (sb-kernel:type-error-datum-stored-type e) + '(simple-vector 3)))))) From 141d30298b6153a908306be71a6a49bd8e87e0e8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 16:56:56 -0400 Subject: [PATCH 0068/4023] Change most uses of is_cons_half() to the opposite: is_header() is_header() is a table lookup with no conditional branching and works in all situations except conservative stack scan. --- src/cold/warm.lisp | 6 ++-- src/compiler/generic/genesis.lisp | 11 ------ src/compiler/generic/late-objdef.lisp | 48 +++++++++++++++++---------- src/runtime/coalesce.c | 14 ++++---- src/runtime/coreparse.c | 9 +++-- src/runtime/fullcgc.c | 34 +++++++++---------- src/runtime/gc-common.c | 10 +++--- src/runtime/gc-internal.h | 2 +- src/runtime/gencgc.c | 42 ++++++++++++----------- src/runtime/immobile-space.c | 9 +++-- src/runtime/monitor.c | 4 +-- src/runtime/runtime.h | 31 +++++++++++------ src/runtime/traceroot.c | 16 ++++----- 13 files changed, 124 insertions(+), 112 deletions(-) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index ee6c64f908..09bb340f9c 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -33,8 +33,10 @@ ;; whatever it is that show would have shown. Comment this out if you need. (when s (set s nil)))) -(assert (zerop (deref (extern-alien "lowtag_for_widetag" (array char 64)) - (ash sb-vm:character-widetag -2)))) +(let ((byte (deref (extern-alien "widetag_lowtag" (array char 256)) + sb-vm:character-widetag))) + (assert (not (logbitp 7 byte))) ; not a headered object + (assert (= (logand byte sb-vm:lowtag-mask) sb-vm:list-pointer-lowtag))) (gc :full t) ;;; Verify that all defstructs except for one were compiled in a null lexical diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index c4ee913e3e..7a956dbeb3 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2968,17 +2968,6 @@ Legal values for OFFSET are -4, -8, -12, ..." (let ((c 'sb-impl::+magic-hash-vector-value+)) (push (list (c-symbol-name c) 9 (symbol-value c) +c-literal-64bit+ nil) constants)) - ;; And still one more - #+64-bit - (let ((c 'sb-vm::immediate-widetags-mask)) - (push (list (c-symbol-name c) - 1 - (logior (ash 1 (ash sb-vm:character-widetag -2)) - (ash 1 (ash sb-vm:single-float-widetag -2)) - (ash 1 (ash sb-vm:unbound-marker-widetag -2))) - "LU" - nil) - constants)) (setf constants (sort constants (lambda (const1 const2) diff --git a/src/compiler/generic/late-objdef.lisp b/src/compiler/generic/late-objdef.lisp index 68d28c031e..84ad49342a 100644 --- a/src/compiler/generic/late-objdef.lisp +++ b/src/compiler/generic/late-objdef.lisp @@ -149,31 +149,43 @@ (ldb (byte 32 0) bits) (ldb (byte 32 32) bits)) (format stream "~%}~%")) - (format stream "extern unsigned char lowtag_for_widetag[64]; + (format stream "extern unsigned char widetag_lowtag[256]; static inline lispobj compute_lispobj(lispobj* base_addr) { - lispobj header = *base_addr; - return make_lispobj(base_addr, - is_cons_half(header) ? LIST_POINTER_LOWTAG : - lowtag_for_widetag[header_widetag(header)>>2]);~%}~%") + return make_lispobj(base_addr, LOWTAG_FOR_WIDETAG(*base_addr & WIDETAG_MASK));~%}~%") (format stream "~%#ifdef WANT_SCAV_TRANS_SIZE_TABLES~%") - (let ((a (make-array 64 :initial-element 0))) + (let ((lowtag-tbl (make-array 256 :initial-element 0))) + ;; Build a table translating from the from low byte of first word of any + ;; heap object to that object's lowtag when pointed to by a tagged pointer. + ;; If the first word is {immediate | pointer} then the object is a cons, + ;; otherwise the object is a headered object. + (dotimes (byte 256) + (when (or (eql 0 (logand byte fixnum-tag-mask)) + (member (logand byte lowtag-mask) + `(,instance-pointer-lowtag + ,list-pointer-lowtag + ,fun-pointer-lowtag + ,other-pointer-lowtag)) + (member byte `(#+64-bit ,single-float-widetag + ,character-widetag + ,unbound-marker-widetag))) + ;; gotta be a CONS + (setf (svref lowtag-tbl byte) list-pointer-lowtag))) (dolist (entry *scav/trans/size*) (destructuring-bind (widetag scav &rest ignore) entry (declare (ignore ignore)) (unless (string= scav "immediate") - (setf (aref a (ash widetag -2)) - (case widetag - (#.instance-widetag instance-pointer-lowtag) - (#.+function-widetags+ fun-pointer-lowtag) - (t other-pointer-lowtag)))))) - (let ((contents (format nil "~{0x~x,~} " (coerce a 'list)))) - (format stream - "unsigned char lowtag_for_widetag[64] = {~{~% ~A~}~%};~%" - ;; write 4 characters per widetag ("0xN,"), 16 per line - (loop for i from 0 by 64 repeat 4 - ;; trailing comma on the last item is OK in C - collect (subseq contents i (+ i 64)))))) + (setf (svref lowtag-tbl widetag) + (+ #x80 (case widetag + (#.instance-widetag instance-pointer-lowtag) + (#.+function-widetags+ fun-pointer-lowtag) + (t other-pointer-lowtag))))))) + (format stream "unsigned char widetag_lowtag[256] = {") + (dotimes (line 16) + (format stream "~%~:{ ~:[0x~2,'0x~;~4d~],~}" + (mapcar (lambda (x) (list (member x `(0 ,sb-vm:list-pointer-lowtag)) x)) + (coerce (subseq lowtag-tbl (* line 16) (* (1+ line) 16)) 'list)))) + (format stream "~%};~%")) (let ((scavtab (make-array 256 :initial-element nil)) (ptrtab (make-list #+ppc64 16 #-ppc64 4)) (transtab (make-array 64 :initial-element nil)) diff --git a/src/runtime/coalesce.c b/src/runtime/coalesce.c index ffe6fbeb7f..11216002a5 100644 --- a/src/runtime/coalesce.c +++ b/src/runtime/coalesce.c @@ -157,13 +157,9 @@ static uword_t coalesce_range(lispobj* where, lispobj* limit, uword_t arg) sword_t nwords, i; for ( ; where < limit ; where = next ) { - lispobj header = *where; - if (is_cons_half(header)) { - coalesce_obj(where+0, ht); - coalesce_obj(where+1, ht); - next = where + 2; - } else { - int widetag = header_widetag(header); + lispobj word = *where; + if (is_header(word)) { + int widetag = header_widetag(word); nwords = sizetab[widetag](where); next = where + nwords; switch (widetag) { @@ -186,6 +182,10 @@ static uword_t coalesce_range(lispobj* where, lispobj* limit, uword_t arg) } for(i=1; in_relocs_abs = adj->n_relocs_rel = 0; for ( ; where < end ; where += nwords ) { - header_word = *where; - if (is_cons_half(header_word)) { + lispobj word = *where; + if (!is_header(word)) { adjust_pointers(where, 2, adj); nwords = 2; continue; } - widetag = header_widetag(header_word); + widetag = header_widetag(word); nwords = sizetab[widetag](where); switch (widetag) { case FUNCALLABLE_INSTANCE_WIDETAG: @@ -575,7 +574,7 @@ static void relocate_space(uword_t start, lispobj* end, struct heap_adjust* adj) && specialized_vector_widetag_p(widetag)) continue; else - lose("Unrecognized heap object: @%p: %"OBJ_FMTX, where, header_word); + lose("Unrecognized heap object: @%p: %"OBJ_FMTX, where, *where); } adjust_pointers(where+1, nwords-1, adj); } diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 2f1ad42df7..45fd593e1d 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -509,27 +509,16 @@ static uword_t sweep(lispobj* where, lispobj* end, uword_t arg) // TODO: consecutive dead objects on same page should be merged. for ( ; where < end ; where += nwords ) { - lispobj header = *where; - if (is_cons_half(header)) { - nwords = 2; - if (!cons_markedp((lispobj)where)) { - if (where[0] | where[1]) { - cons: - gc_dcheck(!immobile_space_p((lispobj)where)); - NOTE_GARBAGE(page_table[find_page_index(where)].gen, - where, 2, zeroed, - where[0] = where[1] = 0); - } - } - } else { - nwords = sizetab[header_widetag(header)](where); + lispobj word = *where; + if (is_header(word)) { + nwords = sizetab[header_widetag(word)](where); lispobj markbit = MARK_BIT; - switch (header_widetag(header)) { + switch (header_widetag(word)) { case BIGNUM_WIDETAG: markbit = BIGNUM_MARK_BIT; break; case FDEFN_WIDETAG : markbit = FDEFN_MARK_BIT; break; } - if (header & markbit) - *where = header ^ markbit; + if (word & markbit) + *where = word ^ markbit; else { // Turn the object into either a (0 . 0) cons // or an unboxed filler depending on size. @@ -549,6 +538,17 @@ static uword_t sweep(lispobj* where, lispobj* end, uword_t arg) }) } } + } else { + nwords = 2; + if (!cons_markedp((lispobj)where)) { + if (where[0] | where[1]) { + cons: + gc_dcheck(!immobile_space_p((lispobj)where)); + NOTE_GARBAGE(page_table[find_page_index(where)].gen, + where, 2, zeroed, + where[0] = where[1] = 0); + } + } } } return 0; diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 5aa00f2222..12c2935dcb 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1706,18 +1706,16 @@ properly_tagged_p_internal(lispobj pointer, lispobj *start_addr) // Given the precondition that the heap is in a valid state, // it may be assumed that one check of is_cons_half() suffices; // we don't need to check the other half. - lispobj header = *start_addr; - if (is_cons_half(header)) + lispobj word = *start_addr; + if (!is_header(word)) return make_lispobj(start_addr, LIST_POINTER_LOWTAG) == pointer; // Because this heap object was not deemed to be a cons, // it must be an object header. Don't need a check except when paranoid. gc_dcheck(other_immediate_lowtag_p(header)); - // The space of potential widetags has 64 elements, not 256, - // because of the constant low 2 bits. - int widetag = header_widetag(header); - int lowtag = lowtag_for_widetag[widetag>>2]; + int widetag = header_widetag(word); + int lowtag = LOWTAG_FOR_WIDETAG(widetag); if (lowtag && make_lispobj(start_addr, lowtag) == pointer) return 1; // instant win diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index 26a33cb930..c0b451573e 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -99,7 +99,7 @@ extern struct weak_pointer *weak_pointer_chain; /* in gc-common.c */ extern sword_t (*sizetab[256])(lispobj *where); #define OBJECT_SIZE(header,where) \ - (is_cons_half(header)?2:sizetab[header_widetag(header)](where)) + (is_header(header)?sizetab[header_widetag(header)](where):CONS_SIZE) lispobj *gc_search_space3(void *pointer, lispobj *start, void *limit); static inline lispobj *gc_search_space(lispobj *start, void *pointer) { diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 6e8768edcf..4a41b4c6f8 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1673,7 +1673,7 @@ static inline boolean plausible_tag_p(lispobj addr) && is_cons_half(CONS(addr)->cdr); unsigned char widetag = widetag_of(native_pointer(addr)); return other_immediate_lowtag_p(widetag) - && lowtag_of(addr) == lowtag_for_widetag[widetag>>2]; + && lowtag_of(addr) == LOWTAG_FOR_WIDETAG(widetag); } #if !GENCGC_IS_PRECISE @@ -1824,13 +1824,16 @@ scavenge_pinned_ranges() int i; lispobj key; for_each_hopscotch_key(i, key, pinned_objects) { - lispobj* obj = native_pointer(key); - lispobj header = *obj; - // Never invoke scavenger on a simple-fun, just code components. - if (is_cons_half(header)) - scavenge(obj, 2); - else if (header_widetag(header) != SIMPLE_FUN_WIDETAG) - scavtab[header_widetag(header)](obj, header); + gc_assert(is_lisp_pointer(key)); + if (listp(key)) // don't need is_header() since we know the lowtag + scavenge((lispobj*)CONS(key), 2); + else { + lispobj* obj = native_pointer(key); + lispobj header = *obj; + int widetag = header_widetag(header); + // Never invoke scavenger on a simple-fun, just code components. + if (widetag != SIMPLE_FUN_WIDETAG) scavtab[widetag](obj, header); + } } } @@ -1897,16 +1900,17 @@ void visit_freed_objects(char __attribute__((unused)) *start, where += OBJECT_SIZE(*fwd_where, fwd_where); } else { // dead object fprintf(stderr, "%p: %"OBJ_FMTX" %"OBJ_FMTX"\n", where, where[0], where[1]); - if (is_cons_half(word)) { + if (is_header(word)) { + // Do something interesting + where += sizetab[header_widetag(word)](where); + } else { /* Can't do much useful with conses because often we can't distinguish * filler from data. visit_freed_objects is called on ranges of pages * without regard to whether each intervening page was completely full. * (This is not usually the way, but freeing of pages is slightly - * imprecise in that regard) */ + * imprecise in that regard). + * And it's probably broken, since we leave detritus on code pages */ where += 2; - } else { - // Do something interesting - where += sizetab[header_widetag(word)](where); } } } @@ -1961,11 +1965,11 @@ wipe_nonpinned_words() lispobj* obj = (lispobj*)pinned_objects.keys[i]; lispobj word = *obj; int widetag = header_widetag(word); - if (is_cons_half(word)) - fprintf(stderr, "%p: (cons)\n", obj); - else + if (is_header(word)) fprintf(stderr, "%p: %d words (%s)\n", obj, (int)sizetab[widetag](obj), widetag_names[widetag>>2]); + else + fprintf(stderr, "%p: (cons)\n", obj); } #endif @@ -2836,8 +2840,7 @@ verify_range(lispobj *where, sword_t nwords, struct verify_state *state) if (!state->vaddr && where > state->object_end && (state->flags & VERIFYING_HEAP_OBJECTS)) { state->object_start = where; - state->widetag = - is_cons_half(*where) ? LIST_POINTER_LOWTAG : widetag_of(where); + state->widetag = is_header(*where) ? widetag_of(where) : LIST_POINTER_LOWTAG; state->tagged_object_start = compute_lispobj(where); state->object_end = where + OBJECT_SIZE(*where, where) - 1; state->object_gen = gen_of((lispobj)where); @@ -2936,8 +2939,7 @@ verify_range(lispobj *where, sword_t nwords, struct verify_state *state) int widetag = header_widetag(thing); if (is_lisp_immediate(thing) || widetag == NO_TLS_VALUE_MARKER_WIDETAG) { /* skip immediates */ - } else if (!(other_immediate_lowtag_p(widetag) - && lowtag_for_widetag[widetag>>2])) { + } else if (!(other_immediate_lowtag_p(widetag) && LOWTAG_FOR_WIDETAG(widetag))) { lose("Unhandled widetag %d at %p", widetag, where); } else if (leaf_obj_widetag_p(widetag)) { count = sizetab[widetag](where); diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 5e7b71f068..7a1821b7e3 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1621,7 +1621,6 @@ static void apply_absolute_fixups(lispobj, struct code*); static void fixup_space(lispobj* where, size_t n_words) { lispobj* end = where + n_words; - lispobj header_word; int widetag; long size; int __attribute__((unused)) static_space_p = ((lispobj)where == STATIC_SPACE_START); @@ -1629,9 +1628,9 @@ static void fixup_space(lispobj* where, size_t n_words) while (where < end) { gc_assert(!forwarding_pointer_p(where)); - header_word = *where; - if (is_cons_half(header_word)) { - adjust_words(where, 2, 0); // A cons. + lispobj header_word = *where; + if (!is_header(header_word)) { + adjust_words(where, 2, 0); // A cons. (It can only be filler?) where += 2; continue; } @@ -1846,7 +1845,7 @@ static void place_fixedobj(lispobj* obj, int size_in_bytes, #endif gc_assert(!*tempspace_addr(new)); // better not clobber some other object memcpy(tempspace_addr(new), obj, size_in_bytes); - set_forwarding_pointer(obj, make_lispobj(new, lowtag_for_widetag[widetag>>2])); + set_forwarding_pointer(obj, make_lispobj(new, LOWTAG_FOR_WIDETAG(widetag))); if (widetag == FUNCALLABLE_INSTANCE_WIDETAG) // fix the self-pointer tempspace_addr(new)[1] = (lispobj)(new + 4*N_WORD_BYTES); *alloc_ptr = new + size_in_bytes; diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index f3b1d55bad..47ee5c3ada 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -199,8 +199,8 @@ dump_cmd(char **ptr) && valid_widetag_p(header_widetag(word))) { printf(" %s", widetag_names[header_widetag(word)>>2]); next_object += sizetab[header_widetag(word)](next_object); - } else if (is_cons_half(word)) { - next_object += 2; + } else if (!is_header(word)) { + next_object += CONS_SIZE; } else { // disable decoder if weirdness observed decode = 0; } diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 9448116fc2..4303f66420 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -420,21 +420,32 @@ other_immediate_lowtag_p(lispobj header) return (lowtag_of(header) & 3) == OTHER_IMMEDIATE_0_LOWTAG; } +// widetag_lowtag encodes in the sign bit whether the byte corresponds +// to a headered object, and in the low bits the lowtag of a tagged pointer +// pointing to this object, be it headered or a cons. +extern unsigned char widetag_lowtag[256]; +#define LOWTAG_FOR_WIDETAG(x) (widetag_lowtag[x] & LOWTAG_MASK) + +// is_header() and is_cons_half() are logical complements when invoked +// on the first word of any lisp object. However, given a word which is +// only *potentially* the first word of a lisp object, they can both be false. +// In ambiguous root detection, is_cons_half() is to be used, as it is the more +// stringent check. The set of valid bit patterns in the low byte of the car +// of a cons is smaller than the set of patterns accepted by !is_header(). +static inline int is_header(lispobj potential_header_word) { + return widetag_lowtag[potential_header_word & WIDETAG_MASK] & 0x80; +} + static inline int is_cons_half(lispobj obj) { - /* A word that satisfies other_immediate_lowtag_p is a headered object - * and can not be half of a cons, except that widetags which satisfy - * other_immediate and are Lisp immediates can be half of a cons */ - return !other_immediate_lowtag_p(obj) + if (fixnump(obj) || is_lisp_pointer(obj)) return 1; + int widetag = header_widetag(obj); + return widetag == CHARACTER_WIDETAG || #if N_WORD_BITS == 64 - || ((uword_t)IMMEDIATE_WIDETAGS_MASK >> (header_widetag(obj) >> 2)) & 1; -#else - /* The above bit-shifting approach is not applicable - * since we can't employ a 64-bit unsigned integer constant. */ - || header_widetag(obj) == CHARACTER_WIDETAG - || header_widetag(obj) == UNBOUND_MARKER_WIDETAG; + widetag == SINGLE_FLOAT_WIDETAG || #endif + widetag == UNBOUND_MARKER_WIDETAG; } /* KLUDGE: As far as I can tell there's no ANSI C way of saying diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 65733c0ace..7af4be168e 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -151,9 +151,9 @@ static int find_ref(lispobj* source, lispobj target) lispobj layout, bitmap; int scan_limit, i; - lispobj header = *source; - if (is_cons_half(header)) { - check_ptr(0, header); + lispobj word = *source; + if (!is_header(word)) { + check_ptr(0, source[0]); check_ptr(1, source[1]); return -1; } @@ -709,14 +709,14 @@ static uword_t build_refs(lispobj* where, lispobj* end, boolean count_only = !ss->record_ptrs; for ( ; where < end ; where += nwords ) { ++n_objects; - lispobj header = *where; - if (is_cons_half(header)) { + lispobj word = *where; + if (!is_header(word)) { nwords = 2; - check_ptr(header); + check_ptr(where[0]); check_ptr(where[1]); continue; } - int widetag = widetag_of(where); + int widetag = header_widetag(word); nwords = scan_limit = sizetab[widetag](where); switch (widetag) { case INSTANCE_WIDETAG: @@ -776,7 +776,7 @@ static uword_t build_refs(lispobj* where, lispobj* end, continue; break; default: - if (!(other_immediate_lowtag_p(widetag) && lowtag_for_widetag[widetag>>2])) + if (!(other_immediate_lowtag_p(widetag) && LOWTAG_FOR_WIDETAG(widetag))) lose("Unknown widetag %x", widetag); // Skip irrelevant objects. if (leaf_obj_widetag_p(widetag) || From e2e0945870457f4d6e449c8fabb1535425fcfadc Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 17:54:12 -0400 Subject: [PATCH 0069/4023] Remove exports from SB-PCL --- contrib/sb-introspect/test-driver.lisp | 2 +- package-data-list.lisp-expr | 94 +------------------------- src/code/class.lisp | 4 +- src/code/describe.lisp | 2 +- tests/clos.impure.lisp | 8 +-- tests/mop.impure.lisp | 4 +- tests/mop.pure.lisp | 6 +- tests/specializer.impure.lisp | 10 +-- tests/type.impure.lisp | 14 ++-- 9 files changed, 26 insertions(+), 118 deletions(-) diff --git a/contrib/sb-introspect/test-driver.lisp b/contrib/sb-introspect/test-driver.lisp index 1a1d3ebff1..3f2e4b81fa 100644 --- a/contrib/sb-introspect/test-driver.lisp +++ b/contrib/sb-introspect/test-driver.lisp @@ -122,7 +122,7 @@ t) (deftest find-source-stuff.4 - (matchp (car (sb-pcl:generic-function-methods #'cl-user::two)) 4) + (matchp (car (sb-mop:generic-function-methods #'cl-user::two)) 4) t) (deftest find-source-stuff.5 diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index fd2f50170f..071c328312 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2687,99 +2687,7 @@ package is deprecated in favour of SB-MOP." "ILLEGAL-CLASS-NAME-ERROR" "CLASS-NOT-FOUND-ERROR" - "SPECIALIZER-NAME-SYNTAX-ERROR") - ;; FIXME: After a little while, these reexports can probably go - ;; away, as they're superseded by the use of SB-MOP as the - ;; publically-accessible package. - :reexport ( ;; CL symbols - "ADD-METHOD" - "ALLOCATE-INSTANCE" - "CLASS-NAME" "COMPUTE-APPLICABLE-METHODS" - "ENSURE-GENERIC-FUNCTION" "MAKE-INSTANCE" - "METHOD-QUALIFIERS" "REMOVE-METHOD" - ;; MOP symbols - "ADD-DEPENDENT" - "ADD-DIRECT-METHOD" - "ADD-DIRECT-SUBCLASS" - "CLASS-DEFAULT-INITARGS" - "CLASS-DIRECT-DEFAULT-INITARGS" - "CLASS-DIRECT-SLOTS" - "CLASS-DIRECT-SUBCLASSES" - "CLASS-DIRECT-SUPERCLASSES" - "CLASS-FINALIZED-P" - "CLASS-PRECEDENCE-LIST" - "CLASS-PROTOTYPE" - "CLASS-SLOTS" - "COMPUTE-APPLICABLE-METHODS-USING-CLASSES" - "COMPUTE-CLASS-PRECEDENCE-LIST" - "COMPUTE-DEFAULT-INITARGS" - "COMPUTE-DISCRIMINATING-FUNCTION" - "COMPUTE-EFFECTIVE-METHOD" - "COMPUTE-EFFECTIVE-SLOT-DEFINITION" - "COMPUTE-SLOTS" - "DIRECT-SLOT-DEFINITION" - "DIRECT-SLOT-DEFINITION-CLASS" - "EFFECTIVE-SLOT-DEFINITION" - "EFFECTIVE-SLOT-DEFINITION-CLASS" - "ENSURE-CLASS" - "ENSURE-CLASS-USING-CLASS" - "ENSURE-GENERIC-FUNCTION-USING-CLASS" - "EQL-SPECIALIZER" - "EQL-SPECIALIZER-OBJECT" - "EXTRACT-LAMBDA-LIST" - "EXTRACT-SPECIALIZER-NAMES" - "FINALIZE-INHERITANCE" - "FIND-METHOD-COMBINATION" - "FORWARD-REFERENCED-CLASS" - "FUNCALLABLE-STANDARD-CLASS" - "FUNCALLABLE-STANDARD-INSTANCE-ACCESS" - "FUNCALLABLE-STANDARD-OBJECT" - "GENERIC-FUNCTION-ARGUMENT-PRECEDENCE-ORDER" - "GENERIC-FUNCTION-DECLARATIONS" - "GENERIC-FUNCTION-LAMBDA-LIST" - "GENERIC-FUNCTION-METHOD-CLASS" - "GENERIC-FUNCTION-METHOD-COMBINATION" - "GENERIC-FUNCTION-METHODS" - "GENERIC-FUNCTION-NAME" - "INTERN-EQL-SPECIALIZER" - "MAKE-METHOD-LAMBDA" - "MAP-DEPENDENTS" - "METHOD-FUNCTION" - "METHOD-GENERIC-FUNCTION" - "METHOD-LAMBDA-LIST" - "METHOD-SPECIALIZERS" - "ACCESSOR-METHOD-SLOT-DEFINITION" - "READER-METHOD-CLASS" - "REMOVE-DEPENDENT" - "REMOVE-DIRECT-METHOD" - "REMOVE-DIRECT-SUBCLASS" - "SET-FUNCALLABLE-INSTANCE-FUNCTION" - "SLOT-BOUNDP-USING-CLASS" - "SLOT-DEFINITION" - "SLOT-DEFINITION-ALLOCATION" - "SLOT-DEFINITION-INITARGS" - "SLOT-DEFINITION-INITFORM" - "SLOT-DEFINITION-INITFUNCTION" - "SLOT-DEFINITION-LOCATION" - "SLOT-DEFINITION-NAME" - "SLOT-DEFINITION-READERS" - "SLOT-DEFINITION-WRITERS" - "SLOT-DEFINITION-TYPE" - "SLOT-MAKUNBOUND-USING-CLASS" - "SLOT-VALUE-USING-CLASS" - "SPECIALIZER" - "SPECIALIZER-DIRECT-GENERIC-FUNCTIONS" - "SPECIALIZER-DIRECT-METHODS" - "STANDARD-ACCESSOR-METHOD" - "STANDARD-DIRECT-SLOT-DEFINITION" - "STANDARD-EFFECTIVE-SLOT-DEFINITION" - "STANDARD-INSTANCE-ACCESS" - "STANDARD-READER-METHOD" - "STANDARD-SLOT-DEFINITION" - "STANDARD-WRITER-METHOD" - "UPDATE-DEPENDENT" - "VALIDATE-SUPERCLASS" - "WRITER-METHOD-CLASS")) + "SPECIALIZER-NAME-SYNTAX-ERROR")) #s(sb-cold:package-data :name "SB-PRETTY" diff --git a/src/code/class.lisp b/src/code/class.lisp index 9b9f0eb83c..81828be5b0 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -671,7 +671,7 @@ between the ~A definition and the ~A definition" (if (typep classoid 'standard-classoid) (let ((class (classoid-pcl-class classoid))) (cond - ((sb-pcl:class-finalized-p class) + ((sb-mop:class-finalized-p class) (sb-pcl::%force-cache-flushes class) t) ((sb-pcl::class-has-a-forward-referenced-superclass-p class) @@ -683,7 +683,7 @@ between the ~A definition and the ~A definition" error-context)) nil) (t - (sb-pcl:finalize-inheritance class) + (sb-mop:finalize-inheritance class) t))) (bug "~@" diff --git a/src/code/describe.lisp b/src/code/describe.lisp index c761ca2461..ce250d2d78 100644 --- a/src/code/describe.lisp +++ b/src/code/describe.lisp @@ -662,7 +662,7 @@ (when methods (format stream "~@:_Method-combination: ~S" (sb-pcl::method-combination-type-name - (sb-pcl:generic-function-method-combination fun))) + (sb-mop:generic-function-method-combination fun))) (cond ((eq :none methods) (format stream "~@:_No methods.")) (t diff --git a/tests/clos.impure.lisp b/tests/clos.impure.lisp index 104d991785..540da02133 100644 --- a/tests/clos.impure.lisp +++ b/tests/clos.impure.lisp @@ -443,7 +443,7 @@ ;; FORWARD-REFERENCED-CLASS CHANGE-CLASS.FORWARD-REFERENCED.3. (defclass change-class.forward-referenced.2 (change-class.forward-referenced.3) ()) -(with-test (:name (change-class sb-pcl:forward-referenced-class)) +(with-test (:name (change-class sb-mop:forward-referenced-class)) (mapc #'change-class-test-case '(;; Changing instances of "ordinary classes" to classes which are @@ -846,16 +846,16 @@ (assert-error (defmethod incompatible-ll-test-1 (x &rest y) y)) ;;; Sneakily using a bit of MOPness to check some consistency (assert (= (length - (sb-pcl:generic-function-methods #'incompatible-ll-test-1)) 1)) + (sb-mop:generic-function-methods #'incompatible-ll-test-1)) 1)) (defmethod incompatible-ll-test-2 (x &key bar) bar) (assert-error (defmethod incompatible-ll-test-2 (x) x)) (defmethod incompatible-ll-test-2 (x &rest y) y) (assert (= (length - (sb-pcl:generic-function-methods #'incompatible-ll-test-2)) 1)) + (sb-mop:generic-function-methods #'incompatible-ll-test-2)) 1)) (defmethod incompatible-ll-test-2 ((x integer) &key bar) bar) (assert (= (length - (sb-pcl:generic-function-methods #'incompatible-ll-test-2)) 2)) + (sb-mop:generic-function-methods #'incompatible-ll-test-2)) 2)) ;;; Per Christophe, this is an illegal method call because of 7.6.5 (handler-bind ((style-warning #'muffle-warning)) diff --git a/tests/mop.impure.lisp b/tests/mop.impure.lisp index e99085729f..7b66f14cf0 100644 --- a/tests/mop.impure.lisp +++ b/tests/mop.impure.lisp @@ -313,7 +313,7 @@ &rest initargs) (declare (ignore initargs)) (let ((dsd-class-name (gensym))) - (sb-pcl:ensure-class + (sb-mop:ensure-class dsd-class-name :metaclass 'auto-accessors-direct-slot-definition-class :direct-superclasses (list (find-class 'standard-direct-slot-definition)) @@ -420,7 +420,7 @@ ;;; detection of multiple class options in defclass, reported by Bruno Haible (defclass option-class (standard-class) ((option :accessor cl-option :initarg :my-option))) -(defmethod sb-pcl:validate-superclass ((c1 option-class) (c2 standard-class)) +(defmethod sb-mop:validate-superclass ((c1 option-class) (c2 standard-class)) t) (multiple-value-bind (result error) (ignore-errors (eval '(defclass option-class-instance () diff --git a/tests/mop.pure.lisp b/tests/mop.pure.lisp index 93173fb3fc..5f0c02155c 100644 --- a/tests/mop.pure.lisp +++ b/tests/mop.pure.lisp @@ -90,7 +90,7 @@ (with-test (:name :bug-936513) ;; This used to fail as ENSURE-GENERIC-FUNCTION wanted a list specifying ;; the method combination, and didn't accept the actual object - (let ((mc (sb-pcl:find-method-combination #'make-instance 'standard nil))) + (let ((mc (sb-mop:find-method-combination #'make-instance 'standard nil))) (ensure-generic-function 'make-instance :method-combination mc)) ;; Let's make sure the list works too... (ensure-generic-function 'make-instance :method-combination '(standard))) @@ -171,10 +171,10 @@ (find slot-name (sb-mop:class-direct-slots kid) :key 'sb-mop:slot-definition-name) (find slot-name (sb-mop:class-direct-slots par) - :key 'sb-pcl:slot-definition-name) + :key 'sb-mop:slot-definition-name) ;; there is only one effective slot of that name (assert (= 1 (count slot-name (sb-mop:class-slots kid) - :key 'sb-pcl:slot-definition-name)))))) + :key 'sb-mop:slot-definition-name)))))) ;; metaclass = structure-class ;; FUN-TYPE inherits CTYPE (check 'sb-kernel:fun-type 'sb-kernel:ctype 'sb-kernel::%bits) diff --git a/tests/specializer.impure.lisp b/tests/specializer.impure.lisp index 06d6f91f14..7dde7e4fc9 100644 --- a/tests/specializer.impure.lisp +++ b/tests/specializer.impure.lisp @@ -24,7 +24,7 @@ ;;; Can be parsed but fails to define a method on ;;; SPECIALIZER-TYPE-SPECIFIER. -(defclass custom-2-impl (sb-pcl:specializer) +(defclass custom-2-impl (sb-mop:specializer) ()) (defmethod sb-pcl:parse-specializer-using-class ((generic-function standard-generic-function) @@ -36,7 +36,7 @@ ;;; Can be parsed and has a suitable method on ;;; SPECIALIZER-TYPE-SPECIFIER. -(defclass custom-3-impl (sb-pcl:specializer) +(defclass custom-3-impl (sb-mop:specializer) ()) (defmethod sb-pcl:parse-specializer-using-class ((generic-function standard-generic-function) @@ -51,7 +51,7 @@ ;;; Test (with-test (:name (sb-pcl:parse-specializer-using-class :smoke)) - (let ((proto-gf (sb-pcl:class-prototype + (let ((proto-gf (sb-mop:class-prototype (find-class 'standard-generic-function)))) (flet ((test (specializer-name expected) (flet ((do-it () @@ -106,9 +106,9 @@ (test `(eql t) (sb-mop:intern-eql-specializer t))))) (with-test (:name (sb-pcl:specializer-type-specifier :smoke)) - (let* ((proto-gf (sb-pcl:class-prototype + (let* ((proto-gf (sb-mop:class-prototype (find-class 'standard-generic-function))) - (proto-method (sb-pcl:class-prototype + (proto-method (sb-mop:class-prototype (find-class 'standard-method)))) (flet ((parse (specializer-specifier) (sb-pcl:parse-specializer-using-class diff --git a/tests/type.impure.lisp b/tests/type.impure.lisp index 5084d170e3..9c2815bcc2 100644 --- a/tests/type.impure.lisp +++ b/tests/type.impure.lisp @@ -348,7 +348,7 @@ (assert (subtypep 'simple-error 'error)) (assert (not (subtypep 'condition 'simple-condition))) (assert (not (subtypep 'error 'simple-error))) - (assert (eq (car (sb-pcl:class-direct-superclasses + (assert (eq (car (sb-mop:class-direct-superclasses (find-class 'simple-condition))) (find-class 'condition))) @@ -360,12 +360,12 @@ sb-int:simple-file-error sb-int:simple-style-warning)))) (assert (null (set-difference - (sb-pcl:class-direct-subclasses (find-class + (sb-mop:class-direct-subclasses (find-class 'simple-condition)) subclasses)))) ;; precedence lists - (assert (equal (sb-pcl:class-precedence-list + (assert (equal (sb-mop:class-precedence-list (find-class 'simple-condition)) (mapcar #'find-class '(simple-condition condition @@ -373,24 +373,24 @@ t)))) (sb-mop:finalize-inheritance (find-class 'fundamental-stream)) ;; stream classes - (assert (equal (sb-pcl:class-direct-superclasses (find-class + (assert (equal (sb-mop:class-direct-superclasses (find-class 'fundamental-stream)) (mapcar #'find-class '(standard-object stream)))) (assert (null (set-difference - (sb-pcl:class-direct-subclasses (find-class + (sb-mop:class-direct-subclasses (find-class 'fundamental-stream)) (mapcar #'find-class '(fundamental-binary-stream fundamental-character-stream fundamental-output-stream fundamental-input-stream))))) - (assert (equal (sb-pcl:class-precedence-list (find-class + (assert (equal (sb-mop:class-precedence-list (find-class 'fundamental-stream)) (mapcar #'find-class '(fundamental-stream standard-object sb-pcl::slot-object stream t)))) - (assert (equal (sb-pcl:class-precedence-list (find-class + (assert (equal (sb-mop:class-precedence-list (find-class 'fundamental-stream)) (mapcar #'find-class '(fundamental-stream standard-object From 1a28c39b250be145df505b54c7456a47dc05a82a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 18:58:31 -0400 Subject: [PATCH 0070/4023] Don't write intermediate artifact from editcore Still useful for development, but speeds it up not to produce. --- tools-for-build/editcore.lisp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index d3c6822fa8..cf170f8eb9 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1690,9 +1690,7 @@ (defun split-core (input-pathname asm-pathname &key enable-pie (verbose nil) - &aux (split-core-pathname - (merge-pathnames (make-pathname :type "core") asm-pathname)) - (elf-core-pathname + &aux (elf-core-pathname (merge-pathnames (make-pathname :name (concatenate 'string (pathname-name asm-pathname) "-core") :type "o") @@ -1709,13 +1707,13 @@ ;; Remove old files (ignore-errors (delete-file asm-pathname)) - (ignore-errors (delete-file split-core-pathname)) (ignore-errors (delete-file elf-core-pathname)) ;; Ensure that all files can be opened (with-open-file (input input-pathname :element-type '(unsigned-byte 8)) (with-open-file (asm-file asm-pathname :direction :output :if-exists :supersede) - (with-open-file (split-core split-core-pathname :direction :output - :element-type '(unsigned-byte 8) :if-exists :supersede) + ;;(with-open-file (split-core split-core-pathname :direction :output + ;; :element-type '(unsigned-byte 8) :if-exists :supersede) + (let ((split-core nil)) (setq core-offset (read-core-header input core-header verbose)) (do-core-header-entry ((id len ptr) core-header) (case id @@ -1766,7 +1764,8 @@ :element-type '(unsigned-byte 8))) (filepos)) ;; Write the new core file - (write-sequence core-header split-core) + (when split-core + (write-sequence core-header split-core)) (dolist (action (reverse copy-actions)) ; nondestructive ;; page index convention assumes absence of core header. ;; i.e. data page 0 is the file page immediately following the core header @@ -1776,7 +1775,8 @@ (format t "File offset ~10x: ~10x bytes~%" offset nbytes)) (setq filepos (+ core-offset offset)) (file-position input filepos) - (copy-bytes input split-core nbytes buffer))) + (when split-core + (copy-bytes input split-core nbytes buffer)))) ;; Trailer (runtime options and magic number) (let ((nbytes (read-sequence buffer input))) ;; expect trailing magic number @@ -1789,13 +1789,15 @@ (format t "Trailer words:(~{~X~^ ~})~%" (loop for i below (floor nbytes n-word-bytes) collect (%vector-raw-bits buffer i)))) - (write-sequence buffer split-core :end nbytes) - (finish-output split-core)) + (when split-core + (write-sequence buffer split-core :end nbytes) + (finish-output split-core))) ;; Sanity test - (aver (= (+ core-offset - (* page-adjust +backend-page-bytes+) - (file-length split-core)) - (file-length input))) + (when split-core + (aver (= (+ core-offset + (* page-adjust +backend-page-bytes+) + (file-length split-core)) + (file-length input)))) ;; Seek back to the PTE pages so they can be copied to the '.o' file (file-position input filepos))) From b4070634d0fbb1a492f602f1d5ebb53eae183628 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 19:25:59 -0400 Subject: [PATCH 0071/4023] Constrain SET-FUNCALLABLE-INSTANCE-FUNCTION arg type Reject interpreted functions, other system-internal funcallable structures --- src/pcl/boot.lisp | 2 +- src/pcl/braid.lisp | 9 ++++----- src/pcl/combin.lisp | 2 +- src/pcl/env.lisp | 4 ++-- src/pcl/low.lisp | 19 +++++++++---------- src/pcl/vector.lisp | 4 ++-- tests/mop.impure.lisp | 8 +------- 7 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index 040d2e9625..f78571e669 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -2365,7 +2365,7 @@ bootstrapping. (let ((fin (allocate-standard-funcallable-instance *sgf-wrapper* name))) (replace (fsc-instance-slots fin) *sgf-slots-init*) (when function - (set-funcallable-instance-function fin function)) + (setf (%funcallable-instance-fun fin) function)) (setf (gdefinition name) fin) (!bootstrap-set-slot 'standard-generic-function fin 'name name) (!bootstrap-set-slot 'standard-generic-function fin diff --git a/src/pcl/braid.lisp b/src/pcl/braid.lisp index 964b9c3ba2..ed8ebd7612 100644 --- a/src/pcl/braid.lisp +++ b/src/pcl/braid.lisp @@ -66,11 +66,10 @@ (%make-standard-funcallable-instance slots hash)))) (setf (%fun-layout f) wrapper) f))))) - (set-funcallable-instance-function - fin - #'(lambda (&rest args) - (declare (ignore args)) - (error 'unset-funcallable-instance-function + (setf (%funcallable-instance-fun fin) + (lambda (&rest args) + (declare (ignore args)) + (error 'unset-funcallable-instance-function :format-control "~@" :format-arguments (list fin)))) diff --git a/src/pcl/combin.lisp b/src/pcl/combin.lisp index 6e990a125c..2f10ad7f04 100644 --- a/src/pcl/combin.lisp +++ b/src/pcl/combin.lisp @@ -195,7 +195,7 @@ (let* ((fmf (fast-method-call-function emf)) (fun (method-function-from-fast-method-call emf)) (mf (%make-method-function fmf))) - (set-funcallable-instance-function mf fun) + (setf (%funcallable-instance-fun mf) fun) (make-instance 'standard-method :specializers nil ; XXX :qualifiers nil diff --git a/src/pcl/env.lisp b/src/pcl/env.lisp index 34caa07e61..8045b329c2 100644 --- a/src/pcl/env.lisp +++ b/src/pcl/env.lisp @@ -185,8 +185,8 @@ (if qualifier (list qualifier)) specializers lambda-list `(:function ,(let ((mf (%make-method-function fmf))) - (sb-mop:set-funcallable-instance-function - mf (method-function-from-fast-function fmf arg-info)) + (setf (%funcallable-instance-fun mf) + (method-function-from-fast-function fmf arg-info)) mf) plist ,arg-info simple-next-method-call t) source-loc)))))) diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index de6df0cf89..d053916890 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -100,17 +100,16 @@ (setf ,drops (random-fixnum) ,drop-pos sb-vm:n-positive-fixnum-bits)))))) -(import 'sb-kernel:funcallable-instance-p) ; why? - (defun set-funcallable-instance-function (fin new-value) - (declare (type function new-value) - ;; KLUDGE: it might be nice to restrict - ;; SB-MOP:SET-FUNCALLABLE-INSTANCE-FUNCTION to operate only - ;; on generalized instances of - ;; SB-MOP:FUNCALLABLE-STANDARD-OBJECT; at present, even - ;; PCL's internal use of SET-FUNCALLABLE-INSTANCE-FUNCTION - ;; doesn't obey this restriction. - (type funcallable-instance fin)) + (declare (type function new-value)) + ;; It's not worth bothering to teach the compiler to efficiently transform + ;; a type declaration involving FUNCALLABLE-STANDARD-OBJECT, not the least + ;; of the problems being that the type isn't known during make-host-2. + (unless (and #+compact-instance-header (functionp fin) + #-compact-instance-header (funcallable-instance-p fin) + (logtest (layout-flags (%fun-layout fin)) + +pcl-object-layout-flag+)) + (error 'type-error :datum fin :expected-type 'funcallable-standard-object)) (setf (%funcallable-instance-fun fin) new-value)) ;;; FIXME: these macros should just go away. It's not clear whether diff --git a/src/pcl/vector.lisp b/src/pcl/vector.lisp index 145aa326c5..d6f2227e97 100644 --- a/src/pcl/vector.lisp +++ b/src/pcl/vector.lisp @@ -767,8 +767,8 @@ ,@inner-decls ,@body-sans-decls)))) (mf (%make-method-function fmf))) - (set-funcallable-instance-function - mf (method-function-from-fast-function fmf ',(getf initargs 'plist))) + (setf (%funcallable-instance-fun mf) + (method-function-from-fast-function fmf ',(getf initargs 'plist))) mf) ',initargs))))) diff --git a/tests/mop.impure.lisp b/tests/mop.impure.lisp index 7b66f14cf0..d86f349f32 100644 --- a/tests/mop.impure.lisp +++ b/tests/mop.impure.lisp @@ -695,13 +695,7 @@ (slot-value o 'instance)))))) (defgeneric definitely-a-funcallable-instance (x)) -(with-test (:name (set-funcallable-instance-function :typechecking) - ;; This is a bit of a problem. SET-FUNCALLABLE-INSTANCE-FUNCTION - ;; accepts any funcallable-instance as its first argument, - ;; not just a generic-function. - ;; But an interpreted function *is* a funcallable-instance - ;; See comment in src/pcl/low about possibly tightening this up. - :fails-on :interpreter) +(with-test (:name (set-funcallable-instance-function :typechecking)) (assert-error (set-funcallable-instance-function (lambda (y) (declare (ignore y)) nil) #'definitely-a-funcallable-instance) From 29e530f3a50ded3068a11ccd62927064394866c6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 19:39:31 -0400 Subject: [PATCH 0072/4023] Tree-shake SB-PCL + SB-MOP harder --- make-target-2-load.lisp | 2 ++ src/pcl/cache.lisp | 1 + src/pcl/ctor.lisp | 1 + tests/clos-cache.impure.lisp | 4 ++-- tests/ctor.impure.lisp | 4 ++-- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index a6dd710032..cd84281277 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -390,6 +390,8 @@ Please check that all strings which were not recognizable to the compiler #.(find-package "SB-ASSEM") #.(find-package "SB-DISASSEM") #.(find-package "SB-IMPL") + #.(find-package "SB-PCL") + #.(find-package "SB-MOP") #.(find-package "SB-PRETTY") #.(find-package "SB-KERNEL")) ;; Assume all and only external symbols must be retained diff --git a/src/pcl/cache.lisp b/src/pcl/cache.lisp index dbb7beba1f..bc51b3c14d 100644 --- a/src/pcl/cache.lisp +++ b/src/pcl/cache.lisp @@ -157,6 +157,7 @@ ;;; Perhaps we can dynamically optimize the mixing by picking bits that work ;;; best for the set of keys in the cache. (declaim (inline compute-cache-index)) +(export 'compute-cache-index) ; for a test (defun compute-cache-index (cache layouts) (macrolet ((fetch-hash (x) `(let ((hash (layout-clos-hash ,x))) diff --git a/src/pcl/ctor.lisp b/src/pcl/ctor.lisp index 3f5df0dd83..0fde315695 100644 --- a/src/pcl/ctor.lisp +++ b/src/pcl/ctor.lisp @@ -242,6 +242,7 @@ (t (bug "Something strange where symbol or class expected.")))) +(export '(+ctor-list-max-size+ +ctor-table-max-size+)) ; for a test ;;; Max number of CTORs kept in an inline list cache. Once this is ;;; exceeded we switch to a table. (defconstant +ctor-list-max-size+ 12) diff --git a/tests/clos-cache.impure.lisp b/tests/clos-cache.impure.lisp index a340e7cb67..44c309ba6d 100644 --- a/tests/clos-cache.impure.lisp +++ b/tests/clos-cache.impure.lisp @@ -35,10 +35,10 @@ (l2 (sb-kernel:find-layout 'cons)) (l3 (sb-kernel:find-layout 'integer)) (cache (sb-pcl::%make-cache :mask -1))) - (let ((safe-answer (sb-pcl::compute-cache-index cache (list l1 l2 l3))) + (let ((safe-answer (sb-pcl:compute-cache-index cache (list l1 l2 l3))) (optimized-answer (optimized-way l1 l2 l3))) (assert (= safe-answer optimized-answer))) - (let ((safe-answer (sb-pcl::compute-cache-index cache (list l1 l3 l2))) + (let ((safe-answer (sb-pcl:compute-cache-index cache (list l1 l3 l2))) (optimized-answer (optimized-way l1 l3 l2))) (assert (= safe-answer optimized-answer)))))) diff --git a/tests/ctor.impure.lisp b/tests/ctor.impure.lisp index 558cbf5e70..4e377a4910 100644 --- a/tests/ctor.impure.lisp +++ b/tests/ctor.impure.lisp @@ -135,7 +135,7 @@ (with-test (:name (make-instance :ctor-inline-cache-resize)) (let* ((f (checked-compile `(lambda (name) (make-instance name)))) - (classes (loop repeat (* 2 sb-pcl::+ctor-table-max-size+) + (classes (loop repeat (* 2 sb-pcl:+ctor-table-max-size+) collect (class-name (eval `(defclass ,(gentemp) () ()))))) (count 0) (caches (find-ctor-caches f)) @@ -146,7 +146,7 @@ (dolist (class classes) (assert (typep (funcall f (if (oddp count) class (find-class class))) class)) (incf count) - (cond ((<= count sb-pcl::+ctor-list-max-size+) + (cond ((<= count sb-pcl:+ctor-list-max-size+) (unless (consp (cdr cache)) (error "oops, wanted list cache, got: ~S" cache)) (unless (= count (length (cdr cache))) From 5230d8bbdae4e028bccaf98fc971321fc1f0336f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 20:19:04 -0400 Subject: [PATCH 0073/4023] DXify the temporary instance in CHANGE-CLASS --- src/compiler/generic/vm-ir2tran.lisp | 4 ++ src/pcl/braid.lisp | 11 +++-- src/pcl/std-class.lisp | 74 ++++++++++++++++++---------- tests/mop.impure.lisp | 27 ++++++++++ 4 files changed, 85 insertions(+), 31 deletions(-) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index 3a46f9415b..10a7ef8dc1 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -31,9 +31,13 @@ #+(and :gencgc :c-stack-is-control-stack) t) #+stack-allocatable-fixed-objects +(progn (defoptimizer (%make-instance stack-allocate-result) ((n) node dx) (declare (ignore n)) (eq dx 'truly-dynamic-extent)) +(defoptimizer (%make-funcallable-instance stack-allocate-result) ((n) node dx) + (declare (ignore n)) + (eq dx 'truly-dynamic-extent))) (defoptimizer ir2-convert-reffer ((object) node block name offset lowtag) (let* ((lvar (node-lvar node)) diff --git a/src/pcl/braid.lisp b/src/pcl/braid.lisp index ed8ebd7612..3008c90ede 100644 --- a/src/pcl/braid.lisp +++ b/src/pcl/braid.lisp @@ -45,6 +45,12 @@ :references '((:amop :generic-function allocate-instance) (:amop :function set-funcallable-instance-function)))) +(defmacro error-no-implementation-function (fin) + `(error 'unset-funcallable-instance-function + :format-control "~@" + :format-arguments (list ,fin))) + (defun allocate-standard-funcallable-instance (wrapper name) (declare (layout wrapper)) (let* ((hash (if name @@ -69,10 +75,7 @@ (setf (%funcallable-instance-fun fin) (lambda (&rest args) (declare (ignore args)) - (error 'unset-funcallable-instance-function - :format-control "~@" - :format-arguments (list fin)))) + (error-no-implementation-function fin))) fin)) (defun classify-slotds (slotds) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index b378118559..924a1dee97 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -1644,20 +1644,20 @@ (error 'obsolete-structure :datum instance))))) -(defun %change-class (instance new-class initargs) - (declare (notinline allocate-instance)) - (binding* ((old-wrapper (layout-of instance)) +(defun %change-class (copy instance new-class initargs) + (binding* ((new-wrapper (class-wrapper (ensure-class-finalized new-class))) + (new-slots (make-array (layout-length new-wrapper) + :initial-element +slot-unbound+)) + (old-wrapper (layout-of instance)) (old-class (wrapper-class* old-wrapper)) - (copy (allocate-instance new-class)) - (new-wrapper (let ((layout (layout-of copy))) - (aver (layout-for-pcl-obj-p layout)) - (aver (= (layout-bitmap old-wrapper) - (layout-bitmap layout))) - layout)) (old-slots (get-slots instance)) - (new-slots (get-slots copy)) (safe (safe-p new-class)) (new-wrapper-slots (layout-slot-list new-wrapper))) + (if (functionp copy) + (setf (%fun-layout copy) new-wrapper + (%fsc-instance-slots copy) new-slots) + (setf (%instance-layout copy) new-wrapper + (%std-instance-slots copy) new-slots)) (flet ((initarg-for-slot-p (slot) (when initargs (dolist (slot-initarg (slot-definition-initargs slot)) @@ -1696,22 +1696,13 @@ ;; All uses of %CHANGE-CLASS are under the world lock, but that doesn't ;; preclude user code operating on the old slots + new layout or v.v. ;; Users need to synchronize their own access when changing class. - (cond ((std-instance-p instance) - (rotatef (%instance-layout instance) (%instance-layout copy)) - (rotatef (%std-instance-slots instance) (%std-instance-slots copy))) - (t + (cond ((functionp instance) (rotatef (%fun-layout instance) (%fun-layout copy)) - (rotatef (%fsc-instance-slots instance) (%fsc-instance-slots copy)))) - + (rotatef (%fsc-instance-slots instance) (%fsc-instance-slots copy))) + (t + (rotatef (%instance-layout instance) (%instance-layout copy)) + (rotatef (%std-instance-slots instance) (%std-instance-slots copy)))) (apply #'update-instance-for-different-class copy instance initargs) - ;; If the user subsequently operates on COPY, crash and burn. As per CLHS: - ;; "The first argument to update-instance-for-different-class, /previous/, - ;; is that copy; it holds the old slot values temporarily. This argument has - ;; dynamic extent within change-class; if it is referenced in any way once - ;; update-instance-for-different-class returns, the results are undefined." - (cond ((std-instance-p copy) (setf (%std-instance-slots copy) 0)) - ((fsc-instance-p copy) (setf (%fsc-instance-slots copy) 0))) - instance)) (defun check-new-class-not-metaobject (new-class) @@ -1727,11 +1718,26 @@ (check-metaobject method) (check-metaobject slot-definition)))) +;;; "The first argument to update-instance-for-different-class, /previous/, +;;; is that copy; it holds the old slot values temporarily. This argument has +;;; dynamic extent within change-class; if it is referenced in any way once +;;; update-instance-for-different-class returns, the results are undefined." +;;; The full ALLOCATE-INSTANCE protocol can not possibly support dynamic-extent +;;; allocation (at least, for SBCL; maybe for others it can). +;;; Calling ALLOCATE-INSTANCE from CHANGE-CLASS doesn't seem to be mandatory. +;;; At least 4 other Lisp implementations I tested don't call it. +(macrolet ((with-temporary-instance ((var) &body body) + `(dx-let ((,var (%make-instance (1+ sb-vm:instance-data-start)))) + (let ((.result. (progn ,@body))) + ;; Crash if the user subsequently operates on VAR. + #-stack-allocatable-fixed-objects (setf (%std-instance-slots ,var) 0) + .result.)))) (defmethod change-class ((instance standard-object) (new-class standard-class) &rest initargs) (with-world-lock () (check-new-class-not-metaobject new-class) - (%change-class instance new-class initargs))) + (with-temporary-instance (temp) + (%change-class temp instance new-class initargs)))) (defmethod change-class ((instance forward-referenced-class) (new-class standard-class) &rest initargs) @@ -1744,7 +1750,8 @@ (:amop :initialization class)))) (when (eq class (find-class 'class)) (return nil))) - (%change-class instance new-class initargs))) + (with-temporary-instance (temp) + (%change-class temp instance new-class initargs))))) (defmethod change-class ((instance t) (new-class forward-referenced-class) &rest initargs) @@ -1754,12 +1761,25 @@ '((:amop :generic-function ensure-class-using-class) (:amop :initialization class)))) +(macrolet ((with-temporary-funinstance ((var) &body body) + `(dx-let ((,var (%make-funcallable-instance + (+ sb-vm:instance-data-start 2)))) + (dx-flet ((signal-error () + (declare (optimize (sb-c::verify-arg-count 0))) + (error-no-implementation-function ,var))) + (setf (%funcallable-instance-fun ,var) #'signal-error) + (let ((.result. (progn ,@body))) + ;; Crash if the user subsequently operates on VAR. + #-stack-allocatable-fixed-objects + (setf (%fsc-instance-slots ,var) 0) + .result.))))) (defmethod change-class ((instance funcallable-standard-object) (new-class funcallable-standard-class) &rest initargs) (with-world-lock () (check-new-class-not-metaobject new-class) - (%change-class instance new-class initargs))) + (with-temporary-funinstance (temp) + (%change-class temp instance new-class initargs))))) (defmethod change-class ((instance standard-object) (new-class funcallable-standard-class) diff --git a/tests/mop.impure.lisp b/tests/mop.impure.lisp index d86f349f32..35e26b689c 100644 --- a/tests/mop.impure.lisp +++ b/tests/mop.impure.lisp @@ -743,3 +743,30 @@ 'change-class-test-2))) (assert (eql (slot-value new 'b) 20)) (assert (not (slot-boundp new 'a))))) + +(defclass chgclass-dx-test-1 () ()) +(defclass chgclass-dx-test-2 () ()) +(defclass chgclass-dx-test-fin-1 (funcallable-standard-object) () + (:metaclass funcallable-standard-class)) +(defclass chgclass-dx-test-fin-2 (funcallable-standard-object + chgclass-dx-test-2) + () + (:metaclass funcallable-standard-class)) +(defvar *uifdc-called*) +(defmethod update-instance-for-different-class :before (old (new chgclass-dx-test-2) + &rest initargs) + (declare (ignore initargs)) + (setq *uifdc-called* t) + (assert (sb-ext:stack-allocated-p old)) + (when (functionp new) + (assert (sb-ext:stack-allocated-p (sb-kernel:%funcallable-instance-fun old))))) +(with-test (:name :change-class-temp-on-stack + :fails-on (:not :stack-allocatable-fixed-objects)) + (let ((i (make-instance 'chgclass-dx-test-1)) + (*uifdc-called* nil)) + (change-class i 'chgclass-dx-test-2) + (assert *uifdc-called*)) + (let ((i (make-instance 'chgclass-dx-test-fin-1)) + (*uifdc-called* nil)) + (change-class i 'chgclass-dx-test-fin-2) + (assert *uifdc-called*))) From 4eba52cdc691f030e17cd2242b2ba5e980a77abf Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 1 Jun 2020 22:55:01 -0400 Subject: [PATCH 0074/4023] Remove :stack-allocatable-{closures,lists} feature indicators Every platform has them, and any new platform had better get them or else. --- base-target-features.lisp-expr | 3 -- crossbuild-runner/backends/alpha/features | 1 - crossbuild-runner/backends/arm/features | 4 +-- crossbuild-runner/backends/arm64/features | 4 +-- crossbuild-runner/backends/hppa/features | 1 - crossbuild-runner/backends/mips/features | 4 +-- crossbuild-runner/backends/ppc/features | 4 +-- crossbuild-runner/backends/ppc64/features | 4 +-- crossbuild-runner/backends/riscv/features | 4 +-- crossbuild-runner/backends/sparc/features | 2 +- crossbuild-runner/backends/x86-64/features | 2 -- crossbuild-runner/backends/x86/features | 2 -- src/compiler/generic/vm-ir2tran.lisp | 1 - src/compiler/ir1tran.lisp | 5 ---- src/compiler/ir1util.lisp | 4 +-- tests/compiler.pure.lisp | 3 +- tests/debug.impure.lisp | 2 +- tests/dynamic-extent.impure.lisp | 35 ++++++++-------------- tests/pprint.impure.lisp | 3 +- 19 files changed, 29 insertions(+), 59 deletions(-) diff --git a/base-target-features.lisp-expr b/base-target-features.lisp-expr index 74b887f66b..0f2b732ccb 100644 --- a/base-target-features.lisp-expr +++ b/base-target-features.lisp-expr @@ -401,9 +401,6 @@ ;; just parameterized by #+X86, but it'd probably be better to ;; use new flags like :CONTROL-STACK-CONTAINS-C-STACK. ;; - ;; :stack-allocatable-closures - ;; The compiler can allocate dynamic-extent closures on stack. - ;; ;; :alien-callbacks ;; Alien callbacks have been implemented for this platform. ;; diff --git a/crossbuild-runner/backends/alpha/features b/crossbuild-runner/backends/alpha/features index d5b7c1b93b..7b46724c63 100644 --- a/crossbuild-runner/backends/alpha/features +++ b/crossbuild-runner/backends/alpha/features @@ -1,4 +1,3 @@ :64-bit-registers :cheneygc -:stack-allocatable-closures :stack-allocatable-lists :stack-allocatable-fixed-objects diff --git a/crossbuild-runner/backends/arm/features b/crossbuild-runner/backends/arm/features index 08b39aeec6..bd50ee8a56 100644 --- a/crossbuild-runner/backends/arm/features +++ b/crossbuild-runner/backends/arm/features @@ -3,6 +3,6 @@ ; possibly VFPv2 and higher only), but we'll leave the obvious ; hooks in for someone to add the support later. :arm-vfp :arm-vfpv2 -:stack-allocatable-lists :stack-allocatable-fixed-objects -:stack-allocatable-vectors :stack-allocatable-closures +:stack-allocatable-fixed-objects +:stack-allocatable-vectors :fp-and-pc-standard-save diff --git a/crossbuild-runner/backends/arm64/features b/crossbuild-runner/backends/arm64/features index e4c8848e3d..f2516fe45c 100644 --- a/crossbuild-runner/backends/arm64/features +++ b/crossbuild-runner/backends/arm64/features @@ -1,6 +1,6 @@ :64-bit :gencgc :fp-and-pc-standard-save :alien-callbacks -:stack-allocatable-lists :stack-allocatable-fixed-objects -:stack-allocatable-vectors :stack-allocatable-closures +:stack-allocatable-fixed-objects +:stack-allocatable-vectors :unbind-in-unwind :compare-and-swap-vops :undefined-fun-restarts diff --git a/crossbuild-runner/backends/hppa/features b/crossbuild-runner/backends/hppa/features index b41466d151..d3dc4c50af 100644 --- a/crossbuild-runner/backends/hppa/features +++ b/crossbuild-runner/backends/hppa/features @@ -1,3 +1,2 @@ :cheneygc :stack-allocatable-vectors :stack-allocatable-fixed-objects -:stack-allocatable-closures :stack-allocatable-lists diff --git a/crossbuild-runner/backends/mips/features b/crossbuild-runner/backends/mips/features index d4d38f384b..00056731f9 100644 --- a/crossbuild-runner/backends/mips/features +++ b/crossbuild-runner/backends/mips/features @@ -1,4 +1,4 @@ :cheneygc -:stack-allocatable-closures :stack-allocatable-vectors -:stack-allocatable-lists :stack-allocatable-fixed-objects +:stack-allocatable-vectors +:stack-allocatable-fixed-objects :alien-callbacks diff --git a/crossbuild-runner/backends/ppc/features b/crossbuild-runner/backends/ppc/features index 502c0f8254..73e0284576 100644 --- a/crossbuild-runner/backends/ppc/features +++ b/crossbuild-runner/backends/ppc/features @@ -1,3 +1,3 @@ -:gencgc :stack-allocatable-closures :stack-allocatable-vectors -:stack-allocatable-lists :stack-allocatable-fixed-objects +:gencgc :stack-allocatable-vectors +:stack-allocatable-fixed-objects :compare-and-swap-vops :alien-callbacks diff --git a/crossbuild-runner/backends/ppc64/features b/crossbuild-runner/backends/ppc64/features index 8777f518d7..d09820a1a6 100644 --- a/crossbuild-runner/backends/ppc64/features +++ b/crossbuild-runner/backends/ppc64/features @@ -1,6 +1,6 @@ ; threads are required because differing versions of the vops for BOUNDP ; and [fast-]symbol-[global-]value and CAS create extra maintenance burden. :64-bit :untagged-fdefns :sb-thread -:gencgc :stack-allocatable-closures :stack-allocatable-vectors -:stack-allocatable-lists :stack-allocatable-fixed-objects +:gencgc :stack-allocatable-vectors +:stack-allocatable-fixed-objects :compare-and-swap-vops :alien-callbacks diff --git a/crossbuild-runner/backends/riscv/features b/crossbuild-runner/backends/riscv/features index cd795a050b..22ed488eb9 100644 --- a/crossbuild-runner/backends/riscv/features +++ b/crossbuild-runner/backends/riscv/features @@ -1,4 +1,4 @@ :gencgc -:stack-allocatable-closures :stack-allocatable-vectors -:stack-allocatable-lists :stack-allocatable-fixed-objects +:stack-allocatable-vectors +:stack-allocatable-fixed-objects :compare-and-swap-vops :memory-barrier-vops diff --git a/crossbuild-runner/backends/sparc/features b/crossbuild-runner/backends/sparc/features index d3b063d97f..8b13789179 100644 --- a/crossbuild-runner/backends/sparc/features +++ b/crossbuild-runner/backends/sparc/features @@ -1 +1 @@ -:stack-allocatable-closures :stack-allocatable-lists + diff --git a/crossbuild-runner/backends/x86-64/features b/crossbuild-runner/backends/x86-64/features index 1d6e67041e..74c4c82e31 100644 --- a/crossbuild-runner/backends/x86-64/features +++ b/crossbuild-runner/backends/x86-64/features @@ -5,9 +5,7 @@ :compare-and-swap-vops :unwind-to-frame-and-call-vop :fp-and-pc-standard-save -:stack-allocatable-closures :stack-allocatable-vectors -:stack-allocatable-lists :stack-allocatable-fixed-objects :alien-callbacks :cycle-counter diff --git a/crossbuild-runner/backends/x86/features b/crossbuild-runner/backends/x86/features index e68468eba5..9b2edfdb44 100644 --- a/crossbuild-runner/backends/x86/features +++ b/crossbuild-runner/backends/x86/features @@ -3,9 +3,7 @@ :c-stack-is-control-stack :compare-and-swap-vops :unwind-to-frame-and-call-vop -:stack-allocatable-closures :stack-allocatable-vectors -:stack-allocatable-lists :stack-allocatable-fixed-objects :alien-callbacks :cycle-counter diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index 10a7ef8dc1..b5ccf83353 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -369,7 +369,6 @@ (annotate-1-value-lvar arg))))) ;;; ...lists -#+stack-allocatable-lists (progn (defoptimizer (list stack-allocate-result) ((&rest args) node dx) (declare (ignore dx)) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index b1a7aaf9d9..51e0040bfd 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1541,12 +1541,7 @@ (etypecase fun (leaf (if bound-fun - #+stack-allocatable-closures (setf (leaf-extent bound-fun) extent) - #-stack-allocatable-closures - (compiler-notify - "Ignoring DYNAMIC-EXTENT declaration on function ~S ~ - (not supported on this platform)." fname) (compiler-notify "Ignoring free DYNAMIC-EXTENT declaration: ~S" name))) (cons diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 097408158e..5634bb528d 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -762,9 +762,7 @@ (declare (ignorable lvar flush)) #+(and sb-xc-host - (not (and stack-allocatable-closures - stack-allocatable-vectors - stack-allocatable-lists + (not (and stack-allocatable-vectors stack-allocatable-fixed-objects))) (return-from note-no-stack-allocation) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index af38d24aed..9644f2e20d 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -5085,8 +5085,7 @@ ;; quantifiers shouldn't cons themselves. (with-test (:name :quantifiers-no-consing :serial t - :skipped-on (or :interpreter - (not :stack-allocatable-closures))) + :skipped-on :interpreter) (let ((constantly-t (lambda (x) x t)) (constantly-nil (lambda (x) x nil)) (list (make-list 1000 :initial-element nil)) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 5a709cd9bb..84156ba2e2 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -168,7 +168,7 @@ (untrace) (assert (>= (count #\Newline (get-output-stream-string s)) 4)))) -(with-test (:name :bug-310175 :fails-on (not :stack-allocatable-lists)) +(with-test (:name :bug-310175) ;; KLUDGE: Not all DX-enabled platforms DX CONS, and the compiler ;; transforms two-arg-LIST* (and one-arg-LIST) to CONS. Therefore, ;; use two-arg-LIST, which should get through to VOP LIST, and thus diff --git a/tests/dynamic-extent.impure.lisp b/tests/dynamic-extent.impure.lisp index 98fbee7639..d615337a8c 100644 --- a/tests/dynamic-extent.impure.lisp +++ b/tests/dynamic-extent.impure.lisp @@ -330,7 +330,7 @@ (defun make-var-length-dx-list (n thunk) (sb-int:dx-let ((s (make-list-container :listy-slot (make-list n)))) (funcall thunk s))) -;; :stack-allocatable-lists is necessary but not sufficient +;; stack-allocatable lists are necessary but not sufficient (with-test (:name (:dx-list :make-list) :skipped-on (not :x86-64)) (assert (null (ctu:find-named-callees #'make-var-length-dx-list))) (assert-no-consing (make-var-length-dx-list @@ -703,12 +703,11 @@ (defvar *a-cons* (cons nil nil)) -(with-test (:name (:no-consing :dx-closures) :skipped-on (not :stack-allocatable-closures)) +(with-test (:name (:no-consing :dx-closures)) (assert-no-consing (dxclosure 42))) (with-test (:name (:no-consing :dx-lists) - :skipped-on (not (and :stack-allocatable-lists - :stack-allocatable-fixed-objects))) + :skipped-on (not :stack-allocatable-fixed-objects)) (assert-no-consing (dxlength 1 2 3)) (assert-no-consing (dxlength t t t t t t)) (assert-no-consing (dxlength)) @@ -725,13 +724,11 @@ (assert-no-consing (list-delete-some-stuff)) (assert-no-consing (multiple-dx-uses))) -(with-test (:name (:no-consing :dx-value-cell) - :skipped-on (not :stack-allocatable-closures)) +(with-test (:name (:no-consing :dx-value-cell)) (assert-no-consing (dx-value-cell 13))) (with-test (:name (:no-consing :dx-fixed-objects) - :skipped-on (not (and :stack-allocatable-fixed-objects - :stack-allocatable-closures))) + :skipped-on (not :stack-allocatable-fixed-objects)) (assert-no-consing (cons-on-stack 42)) (assert-no-consing (make-foo1-on-stack 123)) (assert-no-consing (nested-good 42)) @@ -1017,8 +1014,7 @@ (assert (= 1 (length-and-words-packed-in-same-tn -3)))) (with-test (:name :handler-case-bogus-compiler-note - :skipped-on (not (and :stack-allocatable-fixed-objects - :stack-allocatable-closures))) + :skipped-on (not :stack-allocatable-fixed-objects)) ;; Taken from SWANK, used to signal a bogus stack allocation ;; failure note. (checked-compile @@ -1045,8 +1041,7 @@ (defun barvector (x y z) (make-array 3 :initial-contents (list x y z))) (with-test (:name :dx-compiler-notes - :skipped-on (not (and :stack-allocatable-vectors - :stack-allocatable-closures)) + :skipped-on (not :stack-allocatable-vectors) :fails-on (and)) (flet ((assert-notes (j lambda) (let ((notes (nth 4 (multiple-value-list (checked-compile lambda))))) ; TODO @@ -1099,8 +1094,7 @@ (assert (= sp (sb-c::%primitive sb-c:current-stack-pointer))) (setf sp (sb-c::%primitive sb-c:current-stack-pointer)))))) (with-test (:name :handler-case-eating-stack - :skipped-on (not (and :stack-allocatable-fixed-objects - :stack-allocatable-closures))) + :skipped-on (not :stack-allocatable-fixed-objects)) (assert-no-consing (handler-case-eating-stack))) ;;; A nasty bug where RECHECK-DYNAMIC-EXTENT-LVARS thought something was going @@ -1144,8 +1138,7 @@ :allow-notes 'sb-ext:compiler-note))) (with-test (:name :bug-586105 - :skipped-on (not (and :stack-allocatable-vectors - :stack-allocatable-lists))) + :skipped-on (not :stack-allocatable-vectors)) (flet ((test (x) (let ((vec1 (make-array 1 :initial-contents (list (list x)))) (vec2 (make-array 1 :initial-contents `((,x)))) @@ -1448,14 +1441,12 @@ t)) (assert (and (= i 1) (= j 1)))) -(with-test (:name (:no-consing :auto-dx-closures) - :skipped-on (not :stack-allocatable-closures)) +(with-test (:name (:no-consing :auto-dx-closures)) (assert-no-consing (autodxclosure1 42)) (assert-no-consing (autodxclosure2))) #+gencgc -(with-test (:name (:no-consing :more-auto-dx-closures) - :skipped-on (not :stack-allocatable-closures)) +(with-test (:name (:no-consing :more-auto-dx-closures)) (assert-no-consing (let ((ct 0)) (sb-vm:map-allocated-objects @@ -1475,9 +1466,7 @@ 1) :allow-notes nil)) -(with-test (:name :stack-alloc-p - :skipped-on (or (not :stack-allocatable-lists) - (not :sb-thread))) +(with-test (:name :stack-alloc-p :skipped-on (not :sb-thread)) (let* ((sem1 (sb-thread:make-semaphore)) (sem2 (sb-thread:make-semaphore)) (blah nil) diff --git a/tests/pprint.impure.lisp b/tests/pprint.impure.lisp index e67b139864..5bd729f856 100644 --- a/tests/pprint.impure.lisp +++ b/tests/pprint.impure.lisp @@ -287,8 +287,7 @@ (*print-pretty* t)) (format nil "~@<~S~:>" (make-instance 'frob)))))) -(with-test (:name :pprint-logical-block-code-deletion-node - :skipped-on (not :stack-allocatable-closures)) +(with-test (:name :pprint-logical-block-code-deletion-node) (handler-case (compile nil `(lambda (words &key a b c) From 0f6d4b0d0ee96c372ea385d55f14523a4f161c0f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 2 Jun 2020 11:27:21 -0400 Subject: [PATCH 0075/4023] Use $SHELL to fix some Solaris tests The syntax "export TEST_BASEDIR=thing" does not work with /bin/sh, and the syntax "X=y exec myprog" is valid but does not expose X to the child unless first exported. It's a wonder anyone can run SBCL on Solaris. --- run-sbcl.sh | 1 + tests/parallel-exec.sh | 1 + tests/test-funs.lisp | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/run-sbcl.sh b/run-sbcl.sh index 8c26486a79..3d49066c48 100755 --- a/run-sbcl.sh +++ b/run-sbcl.sh @@ -54,6 +54,7 @@ if [ "$CORE_DEFINED" = "no" ]; then fi if [ -x "$BASE"/src/runtime/sbcl -a -f "$BASE"/output/sbcl.core ]; then + export SBCL_HOME SBCL_HOME="$BASE/obj/sbcl-home" exec "$BASE"/src/runtime/sbcl $ARGUMENTS "$@" else echo "No built SBCL here ($BASE): run 'sh make.sh' first!" diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 9b43ae9e37..1cc1840c76 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -5,6 +5,7 @@ echo ==== Writing logs to $logdir ==== junkdir=${SBCL_PAREXEC_TMP:-/tmp}/junk mkdir -p $junkdir $logdir +export TEST_DIRECTORY SBCL_HOME TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ --noinform --core ../output/sbcl.core --no-userinit --no-sysinit --noprint --disable-debugger << EOF (require :sb-posix) diff --git a/tests/test-funs.lisp b/tests/test-funs.lisp index a7b8ae6e82..b85220ff6b 100644 --- a/tests/test-funs.lisp +++ b/tests/test-funs.lisp @@ -78,7 +78,7 @@ (progn (test-util::setenv "TEST_SBCL_EVALUATOR_MODE" (string-downcase *test-evaluator-mode*)) - (let ((process (sb-ext:run-program "/bin/sh" + (let ((process (sb-ext:run-program (or (posix-getenv "SHELL") "/bin/sh") (list (native-namestring file)) :output *error-output*))) (let ((*failures* nil)) From d3205eb50f6477fe54c4e075a932bf8bee5b4394 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 2 Jun 2020 12:47:21 -0400 Subject: [PATCH 0076/4023] Fix save5 test Now if only we had a way to prohibit warnings in shell tests. --- tests/save5.test.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/save5.test.sh b/tests/save5.test.sh index b643a89e9a..896a0f3ade 100644 --- a/tests/save5.test.sh +++ b/tests/save5.test.sh @@ -10,8 +10,9 @@ run_sbcl < Date: Tue, 2 Jun 2020 13:05:06 -0400 Subject: [PATCH 0077/4023] sparc: Implement stack-allocatable-fixed objects And remove any choice in the matter. There are new test failures as well as new tests passing, but on a net basis this is an improvement, and there's no reason for letting incomplete ports require spewing crap in the source tree. --- crossbuild-runner/backends/alpha/features | 1 - crossbuild-runner/backends/arm/features | 1 - crossbuild-runner/backends/arm64/features | 1 - crossbuild-runner/backends/hppa/features | 2 +- crossbuild-runner/backends/mips/features | 1 - crossbuild-runner/backends/ppc/features | 1 - crossbuild-runner/backends/ppc64/features | 1 - crossbuild-runner/backends/riscv/features | 1 - crossbuild-runner/backends/x86-64/features | 1 - crossbuild-runner/backends/x86/features | 1 - src/code/macros.lisp | 5 ----- src/code/restart.lisp | 1 - src/compiler/generic/vm-ir2tran.lisp | 14 +++++--------- src/compiler/generic/vm-tran.lisp | 1 - src/compiler/ir1util.lisp | 4 +--- src/compiler/sparc/alloc.lisp | 19 +++++++++++++------ src/pcl/std-class.lisp | 11 ++--------- tests/compiler.pure.lisp | 4 +--- tests/dynamic-extent.impure.lisp | 14 +++++--------- tests/mop.impure.lisp | 3 +-- tests/reader.pure.lisp | 4 +--- 21 files changed, 30 insertions(+), 61 deletions(-) diff --git a/crossbuild-runner/backends/alpha/features b/crossbuild-runner/backends/alpha/features index 7b46724c63..e9aeee10d8 100644 --- a/crossbuild-runner/backends/alpha/features +++ b/crossbuild-runner/backends/alpha/features @@ -1,3 +1,2 @@ :64-bit-registers :cheneygc -:stack-allocatable-fixed-objects diff --git a/crossbuild-runner/backends/arm/features b/crossbuild-runner/backends/arm/features index bd50ee8a56..69c3726cc3 100644 --- a/crossbuild-runner/backends/arm/features +++ b/crossbuild-runner/backends/arm/features @@ -3,6 +3,5 @@ ; possibly VFPv2 and higher only), but we'll leave the obvious ; hooks in for someone to add the support later. :arm-vfp :arm-vfpv2 -:stack-allocatable-fixed-objects :stack-allocatable-vectors :fp-and-pc-standard-save diff --git a/crossbuild-runner/backends/arm64/features b/crossbuild-runner/backends/arm64/features index f2516fe45c..11beefd580 100644 --- a/crossbuild-runner/backends/arm64/features +++ b/crossbuild-runner/backends/arm64/features @@ -1,6 +1,5 @@ :64-bit :gencgc :fp-and-pc-standard-save :alien-callbacks -:stack-allocatable-fixed-objects :stack-allocatable-vectors :unbind-in-unwind :compare-and-swap-vops :undefined-fun-restarts diff --git a/crossbuild-runner/backends/hppa/features b/crossbuild-runner/backends/hppa/features index d3dc4c50af..54826d68a6 100644 --- a/crossbuild-runner/backends/hppa/features +++ b/crossbuild-runner/backends/hppa/features @@ -1,2 +1,2 @@ :cheneygc -:stack-allocatable-vectors :stack-allocatable-fixed-objects +:stack-allocatable-vectors diff --git a/crossbuild-runner/backends/mips/features b/crossbuild-runner/backends/mips/features index 00056731f9..786ad58d53 100644 --- a/crossbuild-runner/backends/mips/features +++ b/crossbuild-runner/backends/mips/features @@ -1,4 +1,3 @@ :cheneygc :stack-allocatable-vectors -:stack-allocatable-fixed-objects :alien-callbacks diff --git a/crossbuild-runner/backends/ppc/features b/crossbuild-runner/backends/ppc/features index 73e0284576..6a97cd7708 100644 --- a/crossbuild-runner/backends/ppc/features +++ b/crossbuild-runner/backends/ppc/features @@ -1,3 +1,2 @@ :gencgc :stack-allocatable-vectors -:stack-allocatable-fixed-objects :compare-and-swap-vops :alien-callbacks diff --git a/crossbuild-runner/backends/ppc64/features b/crossbuild-runner/backends/ppc64/features index d09820a1a6..c1f3c1dab8 100644 --- a/crossbuild-runner/backends/ppc64/features +++ b/crossbuild-runner/backends/ppc64/features @@ -2,5 +2,4 @@ ; and [fast-]symbol-[global-]value and CAS create extra maintenance burden. :64-bit :untagged-fdefns :sb-thread :gencgc :stack-allocatable-vectors -:stack-allocatable-fixed-objects :compare-and-swap-vops :alien-callbacks diff --git a/crossbuild-runner/backends/riscv/features b/crossbuild-runner/backends/riscv/features index 22ed488eb9..9e5829db66 100644 --- a/crossbuild-runner/backends/riscv/features +++ b/crossbuild-runner/backends/riscv/features @@ -1,4 +1,3 @@ :gencgc :stack-allocatable-vectors -:stack-allocatable-fixed-objects :compare-and-swap-vops :memory-barrier-vops diff --git a/crossbuild-runner/backends/x86-64/features b/crossbuild-runner/backends/x86-64/features index 74c4c82e31..d9e5f0f482 100644 --- a/crossbuild-runner/backends/x86-64/features +++ b/crossbuild-runner/backends/x86-64/features @@ -6,7 +6,6 @@ :unwind-to-frame-and-call-vop :fp-and-pc-standard-save :stack-allocatable-vectors -:stack-allocatable-fixed-objects :alien-callbacks :cycle-counter :integer-eql-vop diff --git a/crossbuild-runner/backends/x86/features b/crossbuild-runner/backends/x86/features index 9b2edfdb44..9dd11700a5 100644 --- a/crossbuild-runner/backends/x86/features +++ b/crossbuild-runner/backends/x86/features @@ -4,7 +4,6 @@ :compare-and-swap-vops :unwind-to-frame-and-call-vop :stack-allocatable-vectors -:stack-allocatable-fixed-objects :alien-callbacks :cycle-counter :fp-and-pc-standard-save diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 575a693665..344313c0a6 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -1803,9 +1803,4 @@ symbol-case giving up: case=((V U) (F)) ,wild-result-type))) (declare (ignorable ,var)) ,@body) - ;; On the architecture that does not support #+stack-allocatable-fixed-objects - ;; (Sparc) we could close the stream, but what's the point of doing that - ;; whem you're expressly prohibited by the standard from using the variable - ;; outside of its extent as specified? Just fix the backend if it bothers you. - ;; And I'm not even considering the obsolete backends. (get-output-stream-string ,dummy))))) diff --git a/src/code/restart.lisp b/src/code/restart.lisp index 2fb3565758..1fed81ab08 100644 --- a/src/code/restart.lisp +++ b/src/code/restart.lisp @@ -9,7 +9,6 @@ (in-package "SB-KERNEL") -#+stack-allocatable-fixed-objects (declaim (inline make-restart)) ;; to allow DX-allocation (defstruct (restart (:constructor make-restart diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index b5ccf83353..762cc1952d 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -13,7 +13,6 @@ sb-vm:instance-widetag sb-vm:instance-pointer-lowtag nil) -#+stack-allocatable-fixed-objects (defoptimizer (%make-structure-instance stack-allocate-result) ((defstruct-description &rest args) node dx) (declare (ignore args dx)) @@ -30,14 +29,13 @@ (dd-slots (lvar-value defstruct-description))) #+(and :gencgc :c-stack-is-control-stack) t) -#+stack-allocatable-fixed-objects -(progn + (defoptimizer (%make-instance stack-allocate-result) ((n) node dx) (declare (ignore n)) (eq dx 'truly-dynamic-extent)) (defoptimizer (%make-funcallable-instance stack-allocate-result) ((n) node dx) (declare (ignore n)) - (eq dx 'truly-dynamic-extent))) + (eq dx 'truly-dynamic-extent)) (defoptimizer ir2-convert-reffer ((object) node block name offset lowtag) (let* ((lvar (node-lvar node)) @@ -381,14 +379,12 @@ t)) ;;; ...conses -#+stack-allocatable-fixed-objects -(progn - (defoptimizer (cons stack-allocate-result) ((&rest args) node dx) +(defoptimizer (cons stack-allocate-result) ((&rest args) node dx) (declare (ignore args dx)) t) - (defoptimizer (%make-complex stack-allocate-result) ((&rest args) node dx) +(defoptimizer (%make-complex stack-allocate-result) ((&rest args) node dx) (declare (ignore args dx)) - t)) + t) ;;; MAKE-LIST optimizations #+x86-64 diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index 7bb0785864..f483005a0d 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -117,7 +117,6 @@ ;; There are some benefits to using the simple case for a known exact type: ;; - the layout can be wired in which might or might not save 1 instruction ;; depending on whether layouts are in immobile space. - ;; - all backends can do this (subject to stack-allocatable-fixed-objects) ;; - for a small number of slots, copying them is inlined (cond ((not dd) ; it's going to be some subtype of NAME `(%copy-instance (%make-instance (%instance-length instance)) instance)) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 5634bb528d..8ca2d20615 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -761,9 +761,7 @@ ;; It's just a distraction otherwise. (declare (ignorable lvar flush)) - #+(and sb-xc-host - (not (and stack-allocatable-vectors - stack-allocatable-fixed-objects))) + #+(and sb-xc-host (not stack-allocatable-vectors)) (return-from note-no-stack-allocation) (do-uses (use (principal-lvar lvar)) diff --git a/src/compiler/sparc/alloc.lisp b/src/compiler/sparc/alloc.lisp index d31dd93442..b5a18881cf 100644 --- a/src/compiler/sparc/alloc.lisp +++ b/src/compiler/sparc/alloc.lisp @@ -132,15 +132,22 @@ (define-vop (fixed-alloc) (:args) (:info name words type lowtag stack-allocate-p) - (:ignore name stack-allocate-p) + (:ignore name) (:results (result :scs (descriptor-reg))) (:temporary (:scs (non-descriptor-reg)) temp) (:generator 4 - (pseudo-atomic () - (allocation nil (pad-data-block words) lowtag result :temp-tn temp) - (when type - (inst li temp (logior (ash (1- words) (length-field-shift type)) type)) - (storew temp result 0 lowtag))))) + (cond (stack-allocate-p + (allocation nil (pad-data-block words) + lowtag result :stack-p t :temp-tn temp) + (when type + (inst li temp (logior (ash (1- words) (length-field-shift type)) type)) + (storew temp result 0 lowtag))) + (t + (pseudo-atomic () + (allocation nil (pad-data-block words) lowtag result :temp-tn temp) + (when type + (inst li temp (logior (ash (1- words) (length-field-shift type)) type)) + (storew temp result 0 lowtag))))))) (define-vop (var-alloc) (:args (extra :scs (any-reg))) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index 924a1dee97..a32e1d165d 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -1728,10 +1728,7 @@ ;;; At least 4 other Lisp implementations I tested don't call it. (macrolet ((with-temporary-instance ((var) &body body) `(dx-let ((,var (%make-instance (1+ sb-vm:instance-data-start)))) - (let ((.result. (progn ,@body))) - ;; Crash if the user subsequently operates on VAR. - #-stack-allocatable-fixed-objects (setf (%std-instance-slots ,var) 0) - .result.)))) + ,@body))) (defmethod change-class ((instance standard-object) (new-class standard-class) &rest initargs) (with-world-lock () @@ -1768,11 +1765,7 @@ (declare (optimize (sb-c::verify-arg-count 0))) (error-no-implementation-function ,var))) (setf (%funcallable-instance-fun ,var) #'signal-error) - (let ((.result. (progn ,@body))) - ;; Crash if the user subsequently operates on VAR. - #-stack-allocatable-fixed-objects - (setf (%fsc-instance-slots ,var) 0) - .result.))))) + ,@body)))) (defmethod change-class ((instance funcallable-standard-object) (new-class funcallable-standard-class) &rest initargs) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index 9644f2e20d..c5b02728a1 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -5029,9 +5029,7 @@ y))) (((list (string 'list)) (list "LIST")) t))))) -(with-test (:name (compile restart-case optimize speed compiler-note) - ;; Cannot-DX note crashes test driver unless we have this: - :skipped-on (not :stack-allocatable-fixed-objects)) +(with-test (:name (compile restart-case optimize speed compiler-note)) (checked-compile '(lambda () (declare (optimize speed)) (restart-case () (c ())))) diff --git a/tests/dynamic-extent.impure.lisp b/tests/dynamic-extent.impure.lisp index d615337a8c..0ab30d0b72 100644 --- a/tests/dynamic-extent.impure.lisp +++ b/tests/dynamic-extent.impure.lisp @@ -338,7 +338,7 @@ ;;; MAKE-STRUCTURE -;; :stack-allocatable-fixed-objects is necessary but not sufficient +;; stack-allocatable fixed-size objects are necessary but not sufficient (with-test (:name :copy-structure-dx :skipped-on (not (or :x86 :x86-64))) (let ((thing sb-c::*backend-parsed-vops*)) ;; check some preconditions @@ -706,8 +706,7 @@ (with-test (:name (:no-consing :dx-closures)) (assert-no-consing (dxclosure 42))) -(with-test (:name (:no-consing :dx-lists) - :skipped-on (not :stack-allocatable-fixed-objects)) +(with-test (:name (:no-consing :dx-lists)) (assert-no-consing (dxlength 1 2 3)) (assert-no-consing (dxlength t t t t t t)) (assert-no-consing (dxlength)) @@ -727,8 +726,7 @@ (with-test (:name (:no-consing :dx-value-cell)) (assert-no-consing (dx-value-cell 13))) -(with-test (:name (:no-consing :dx-fixed-objects) - :skipped-on (not :stack-allocatable-fixed-objects)) +(with-test (:name (:no-consing :dx-fixed-objects)) (assert-no-consing (cons-on-stack 42)) (assert-no-consing (make-foo1-on-stack 123)) (assert-no-consing (nested-good 42)) @@ -1013,8 +1011,7 @@ (with-test (:name :length-and-words-packed-in-same-tn) (assert (= 1 (length-and-words-packed-in-same-tn -3)))) -(with-test (:name :handler-case-bogus-compiler-note - :skipped-on (not :stack-allocatable-fixed-objects)) +(with-test (:name :handler-case-bogus-compiler-note) ;; Taken from SWANK, used to signal a bogus stack allocation ;; failure note. (checked-compile @@ -1093,8 +1090,7 @@ (if sp (assert (= sp (sb-c::%primitive sb-c:current-stack-pointer))) (setf sp (sb-c::%primitive sb-c:current-stack-pointer)))))) -(with-test (:name :handler-case-eating-stack - :skipped-on (not :stack-allocatable-fixed-objects)) +(with-test (:name :handler-case-eating-stack) (assert-no-consing (handler-case-eating-stack))) ;;; A nasty bug where RECHECK-DYNAMIC-EXTENT-LVARS thought something was going diff --git a/tests/mop.impure.lisp b/tests/mop.impure.lisp index 35e26b689c..52cb004ecb 100644 --- a/tests/mop.impure.lisp +++ b/tests/mop.impure.lisp @@ -760,8 +760,7 @@ (assert (sb-ext:stack-allocated-p old)) (when (functionp new) (assert (sb-ext:stack-allocated-p (sb-kernel:%funcallable-instance-fun old))))) -(with-test (:name :change-class-temp-on-stack - :fails-on (:not :stack-allocatable-fixed-objects)) +(with-test (:name :change-class-temp-on-stack) (let ((i (make-instance 'chgclass-dx-test-1)) (*uifdc-called* nil)) (change-class i 'chgclass-dx-test-2) diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index 239cde8e24..bbaec201ea 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -359,9 +359,7 @@ ;; - calling SUBSEQ for package names ;; - multiple-value-call in WITH-CHAR-MACRO-RESULT ;; - the initial cons cell in READ-LIST -(with-test (:name :read-does-not-cons-per-se - :skipped-on (:or (:not :stack-allocatable-fixed-objects) - :interpreter)) +(with-test (:name :read-does-not-cons-per-se :skipped-on :interpreter) (flet ((test-reading (string) (let ((s (make-string-input-stream string))) (read s) ; once outside the loop, to make A-SYMBOL From 4c06363234df69a40df118a48661377976594448 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 2 Jun 2020 13:22:28 -0400 Subject: [PATCH 0078/4023] Fix parallel-exec for Solaris, fix whitespace --- src/compiler/sparc/alloc.lisp | 12 ++++++------ tests/parallel-exec.sh | 11 ++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/compiler/sparc/alloc.lisp b/src/compiler/sparc/alloc.lisp index b5a18881cf..2cc77287f6 100644 --- a/src/compiler/sparc/alloc.lisp +++ b/src/compiler/sparc/alloc.lisp @@ -137,12 +137,12 @@ (:temporary (:scs (non-descriptor-reg)) temp) (:generator 4 (cond (stack-allocate-p - (allocation nil (pad-data-block words) - lowtag result :stack-p t :temp-tn temp) - (when type - (inst li temp (logior (ash (1- words) (length-field-shift type)) type)) - (storew temp result 0 lowtag))) - (t + (allocation nil (pad-data-block words) + lowtag result :stack-p t :temp-tn temp) + (when type + (inst li temp (logior (ash (1- words) (length-field-shift type)) type)) + (storew temp result 0 lowtag))) + (t (pseudo-atomic () (allocation nil (pad-data-block words) lowtag result :temp-tn temp) (when type diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 1cc1840c76..c41a625d7a 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -74,11 +74,12 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (setq *debug-io* (make-two-way-stream (make-concatenated-stream) *error-output*)) (cond ((string= (pathname-type file) "test") - ;; exec /bin/sh with the test and we'll pick up its exit code - (alien-funcall (extern-alien "execl" (function int c-string c-string - c-string unsigned)) - "/bin/sh" "/bin/sh" - (concatenate 'string file ".sh") 0) + (let ((shell (or (posix-getenv "SHELL") "/bin/sh"))) + ;; exec the shell with the test and we'll pick up its exit code + (alien-funcall (extern-alien "execl" (function int c-string c-string + c-string unsigned)) + shell shell + (concatenate 'string file ".sh") 0)) ;; if exec fails, just exit with a wrong (not 104) status (alien-funcall (extern-alien "_exit" (function (values) int)) 0)) (t From eeb986d25dd93a7b991cd09f0e2632d03327d48b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 2 Jun 2020 15:15:46 -0400 Subject: [PATCH 0079/4023] Remove effectless assertion is_header_word() implies other_immediate_lowtag_p(), therefore after NOT returning from "if (!is_header-word()) ... return" there is no chance that other_immediate_lowtag_p() is false. --- src/runtime/gc-common.c | 8 ++------ src/runtime/runtime.h | 10 ++++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 12c2935dcb..ce4c6e0132 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1704,16 +1704,12 @@ properly_tagged_p_internal(lispobj pointer, lispobj *start_addr) { // If a headerless object, confirm that 'pointer' is a list pointer. // Given the precondition that the heap is in a valid state, - // it may be assumed that one check of is_cons_half() suffices; - // we don't need to check the other half. + // it may be assumed that is_cons_half() is satisfied by both the + // car and cdr. lispobj word = *start_addr; if (!is_header(word)) return make_lispobj(start_addr, LIST_POINTER_LOWTAG) == pointer; - // Because this heap object was not deemed to be a cons, - // it must be an object header. Don't need a check except when paranoid. - gc_dcheck(other_immediate_lowtag_p(header)); - int widetag = header_widetag(word); int lowtag = LOWTAG_FOR_WIDETAG(widetag); if (lowtag && make_lispobj(start_addr, lowtag) == pointer) diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 4303f66420..4e574975dd 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -413,6 +413,16 @@ lispobj symbol_function(lispobj* symbol); #endif typedef int boolean; +// other_immediate_lowtag_p is the least strict of the tests for whether a word +// is potentially an object header, merely checking whether the bits fit the general +// pattern of header widetags without regard for whether some headered object type +// could in fact have those exact low bits. Specifically, this falsely returns 1 +// for UNBOUND_MARKER_WIDETAG, CHARACTER_WIDETAG, and on 64-bit machines, +// SINGLE_FLOAT_WIDETAG; as well as unallocated and unused widetags (e.g. LRA on x86) +// none of which denote the start of a headered object. +// The ambiguous cases are for words would start a cons - the three mentioned above. +// Other cases (NO_TLS_VALUE_MARKER_WIDETAG and other things) do not cause a problem +// in practice because they can't be the first word of a lisp object. static inline boolean other_immediate_lowtag_p(lispobj header) { From 3247cefe3b64cabce1b6dcfa7e789d60e4c203a7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 2 Jun 2020 16:00:43 -0400 Subject: [PATCH 0080/4023] Fix editcore again --- tools-for-build/editcore.lisp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index cf170f8eb9..ed285a002d 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1774,9 +1774,11 @@ (when verbose (format t "File offset ~10x: ~10x bytes~%" offset nbytes)) (setq filepos (+ core-offset offset)) - (file-position input filepos) - (when split-core - (copy-bytes input split-core nbytes buffer)))) + (cond (split-core + (file-position input filepos) + (copy-bytes input split-core nbytes buffer)) + (t + (file-position input (+ filepos nbytes)))))) ;; Trailer (runtime options and magic number) (let ((nbytes (read-sequence buffer input))) ;; expect trailing magic number From 672e7258d2bfc2daba8d2c00bbc5bc7ec4ba606f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 2 Jun 2020 18:36:51 -0400 Subject: [PATCH 0081/4023] Remove extra padding element from simple-character-string There is no convention for UCS-4 strings to be terminated by 4 zero bytes. Unlike with ASCII strings, it doesn't make Lisp more C-compatible. --- src/compiler/generic/vm-array.lisp | 1 - src/runtime/gc-common.c | 7 +++---- tests/array.pure.lisp | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/compiler/generic/vm-array.lisp b/src/compiler/generic/vm-array.lisp index 152cce42f6..2c42708789 100644 --- a/src/compiler/generic/vm-array.lisp +++ b/src/compiler/generic/vm-array.lisp @@ -78,7 +78,6 @@ :complex-typecode #.complex-base-string-widetag) #+sb-unicode (character ,(code-char 0) 32 simple-character-string - :n-pad-elements 1 :complex-typecode #.complex-character-string-widetag) (single-float $0.0f0 32 simple-array-single-float) (double-float $0.0d0 64 simple-array-double-float) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index ce4c6e0132..9a1cafd7ef 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -938,12 +938,11 @@ NWORDS(uword_t x, uword_t n_bits) DEF_SPECIALIZED_VECTOR(vector_nil, 0*length) DEF_SPECIALIZED_VECTOR(vector_bit, NWORDS(length,1)) -/* NOTE: strings contain one more element of data (a terminating '\0' +/* NOTE: base strings contain one more element of data (a terminating '\0' * to help interface with C functions) than indicated by the length slot. - * This is true even for UCS4 strings, despite that C APIs are unlikely - * to have a convention that expects 4 zero bytes. */ + * UCS4 strings do not get a terminator element */ DEF_SPECIALIZED_VECTOR(base_string, NWORDS((length+1), 8)) -DEF_SPECIALIZED_VECTOR(character_string, NWORDS((length+1), 32)) +DEF_SPECIALIZED_VECTOR(character_string, NWORDS(length, 32)) DEF_SCAV_TRANS_SIZE_UB(2) DEF_SCAV_TRANS_SIZE_UB(4) DEF_SCAV_TRANS_SIZE_UB(8) diff --git a/tests/array.pure.lisp b/tests/array.pure.lisp index f09e9ec67c..08dca891d8 100644 --- a/tests/array.pure.lisp +++ b/tests/array.pure.lisp @@ -433,7 +433,7 @@ (checked-compile-and-assert (:optimize '(:safety 0)) `(lambda (x) ;; Strings are null-terminated for C interoperability - (char "abcd" x)) + (char #.(coerce "abcd" 'simple-base-string) x)) ((4) #\Nul))) (with-test (:name (adjust-array :transform)) From 749903eac9bd3cb5aff15f51a85913b36654b6be Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 2 Jun 2020 19:46:06 -0400 Subject: [PATCH 0082/4023] Avoid installing interpreted EQUALP methods --- src/code/target-defstruct.lisp | 7 ++++--- tests/fast-eval.impure.lisp | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 6ae693f7fd..4ce1591743 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -71,9 +71,10 @@ (let* ((classoid (find-classoid (dd-name dd))) (layout (classoid-layout classoid))) (setf (%instance-ref layout (get-dsd-index sb-kernel:layout sb-kernel::equalp-impl)) - (or equalp - (if (eql (layout-bitmap layout) +layout-all-tagged+) - #'sb-impl::instance-equalp + (cond ((compiled-function-p equalp) equalp) + ((eql (layout-bitmap layout) +layout-all-tagged+) + #'sb-impl::instance-equalp) + (t ;; Make a vector of EQUALP slots comparators, indexed by ;; (- word-index INSTANCE-DATA-START). ;; The initial element of NIL means "do not compare". diff --git a/tests/fast-eval.impure.lisp b/tests/fast-eval.impure.lisp index a97ff6ce98..969e5ade76 100644 --- a/tests/fast-eval.impure.lisp +++ b/tests/fast-eval.impure.lisp @@ -299,6 +299,10 @@ 'foo)) (defstruct testme x) +(test-util:with-test (:name :compiled-equalp-method) + (assert (compiled-function-p + (sb-kernel:layout-equalp-impl + (sb-kernel:find-layout 'testme))))) (let ((f #'testme-x)) (let ((source-loc (sb-interpreter:fun-source-location f))) (setf (slot-value source-loc 'sb-c::namestring) "myfile.lisp"))) From 810e425b064e603bf90fe12168f0e7497795925b Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 3 Jun 2020 19:16:09 +0300 Subject: [PATCH 0083/4023] Fix loading very large core files. Should use off_t not int. Reported by Robert P. Goldman. --- src/runtime/os-common.c | 2 +- src/runtime/os.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 506c5c010e..17b8529b0f 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -232,7 +232,7 @@ gc_managed_heap_space_p(lispobj addr) /* Remap a part of an already existing memory mapping from a file, * and/or create a new mapping as need be */ -void* load_core_bytes(int fd, int offset, os_vm_address_t addr, os_vm_size_t len) +void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm_size_t len) { int fail = 0; #ifdef LISP_FEATURE_HPUX diff --git a/src/runtime/os.h b/src/runtime/os.h index 599ea69a1e..998ed70877 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -121,7 +121,7 @@ extern void os_invalidate(os_vm_address_t addr, os_vm_size_t len); /* This maps a file into memory, or calls lose(..) for various * failures. */ extern void* load_core_bytes(int fd, - int offset, + os_vm_offset_t offset, os_vm_address_t addr, os_vm_size_t len); From e27ef4f7058d73f1a17fabfc55b554fbebded7ec Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 3 Jun 2020 19:49:44 +0300 Subject: [PATCH 0084/4023] Fix load_core_bytes on win32 too. --- src/runtime/win32-os.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index a92934dc52..8cb2897a36 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -906,7 +906,7 @@ os_validate_recommit(os_vm_address_t addr, os_vm_size_t len) * thing to maintain). */ -void* load_core_bytes(int fd, int offset, os_vm_address_t addr, os_vm_size_t len) +void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm_size_t len) { os_vm_size_t count; From 9162dcaa9217f23acf99780d511b911b715d4e66 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 3 Jun 2020 13:45:56 -0400 Subject: [PATCH 0085/4023] Make encapsulation work on LOAD and some other things Noticed while trying to debug something that used UIOP:LOAD* --- src/code/cl-specials.lisp | 8 ++++++++ tests/interface.impure.lisp | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/code/cl-specials.lisp b/src/code/cl-specials.lisp index 195a4266f0..4bd65656e2 100644 --- a/src/code/cl-specials.lisp +++ b/src/code/cl-specials.lisp @@ -141,6 +141,14 @@ cl:*compile-file-pathname* cl:*compile-file-truename*)) +;;; Some functions for which we should *never* (or almost never) bind eagerly +;;; to the functional definition. +;;; IR2-CONVERT-GLOBAL-VAR won't use a :KNOWN-FUN constant-tn, but will instead +;;; dereference the fdefinition like for most function calls. +;;; They aren't actually "inlined", but they were bypassing the fdefinition in +;;; situations involving (APPLY ...) which rendered encapsulation impossible. +(declaim (notinline open compile-file load compile)) + ;;;; DEFGLOBAL and DEFINE-LOAD-TIME-GLOBAL ;;;; These have alternate definitions (in cross-misc) which rely on ;;;; the underlying host DEFVAR when building the cross-compiler. diff --git a/tests/interface.impure.lisp b/tests/interface.impure.lisp index 5edb0f09a7..153e796c24 100644 --- a/tests/interface.impure.lisp +++ b/tests/interface.impure.lisp @@ -549,4 +549,15 @@ (with-test (:name :describe-function-not-named-by-designator) (describe (formatter "~&~A~A") (make-broadcast-stream))) ; should not crash +(defun test-intercepted-load (arg) (apply #'load arg (list :foo :bar :allow-other-keys t))) +(compile 'test-intercepted-load) +(sb-int:encapsulate 'load 'interceptor + (compile nil '(lambda (realfun pathname &rest things) + (if (eq pathname :testme) + :yes + (apply realfun pathname things))))) + +(with-test (:name :load-encapsulatable) + (assert (eq (test-intercepted-load :testme) :yes))) + ;;;; success From 8b606d636cc14839af239100c6268f7228c5d99c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 3 Jun 2020 18:48:51 -0400 Subject: [PATCH 0086/4023] sparc: Implement stack-allocated vectors Put in a stub for Alpha. Remove the choice of whether the capability exists. --- crossbuild-runner/backends/arm/features | 1 - crossbuild-runner/backends/arm64/features | 1 - crossbuild-runner/backends/hppa/features | 1 - crossbuild-runner/backends/mips/features | 1 - crossbuild-runner/backends/ppc/features | 2 +- crossbuild-runner/backends/ppc64/features | 2 +- crossbuild-runner/backends/riscv/features | 1 - crossbuild-runner/backends/sparc/features | 1 - crossbuild-runner/backends/x86-64/features | 1 - crossbuild-runner/backends/x86/features | 1 - src/assembly/alpha/array.lisp | 8 +++-- src/assembly/ppc/array.lisp | 3 -- src/assembly/ppc64/array.lisp | 3 -- src/assembly/sparc/array.lisp | 41 ++++++++++++++++++++-- src/compiler/generic/vm-ir2tran.lisp | 13 +++---- src/compiler/hppa/alloc.lisp | 2 -- src/compiler/ir1util.lisp | 3 -- src/compiler/sparc/alloc.lisp | 20 +++++------ src/compiler/sparc/insts.lisp | 2 ++ src/compiler/sparc/macros.lisp | 2 +- tests/dynamic-extent.impure.lisp | 17 ++++----- 21 files changed, 68 insertions(+), 58 deletions(-) diff --git a/crossbuild-runner/backends/arm/features b/crossbuild-runner/backends/arm/features index 69c3726cc3..b3f2c53976 100644 --- a/crossbuild-runner/backends/arm/features +++ b/crossbuild-runner/backends/arm/features @@ -3,5 +3,4 @@ ; possibly VFPv2 and higher only), but we'll leave the obvious ; hooks in for someone to add the support later. :arm-vfp :arm-vfpv2 -:stack-allocatable-vectors :fp-and-pc-standard-save diff --git a/crossbuild-runner/backends/arm64/features b/crossbuild-runner/backends/arm64/features index 11beefd580..fc353293fc 100644 --- a/crossbuild-runner/backends/arm64/features +++ b/crossbuild-runner/backends/arm64/features @@ -1,5 +1,4 @@ :64-bit :gencgc :fp-and-pc-standard-save :alien-callbacks -:stack-allocatable-vectors :unbind-in-unwind :compare-and-swap-vops :undefined-fun-restarts diff --git a/crossbuild-runner/backends/hppa/features b/crossbuild-runner/backends/hppa/features index 54826d68a6..72dc25a144 100644 --- a/crossbuild-runner/backends/hppa/features +++ b/crossbuild-runner/backends/hppa/features @@ -1,2 +1 @@ :cheneygc -:stack-allocatable-vectors diff --git a/crossbuild-runner/backends/mips/features b/crossbuild-runner/backends/mips/features index 786ad58d53..c25c2655bc 100644 --- a/crossbuild-runner/backends/mips/features +++ b/crossbuild-runner/backends/mips/features @@ -1,3 +1,2 @@ :cheneygc -:stack-allocatable-vectors :alien-callbacks diff --git a/crossbuild-runner/backends/ppc/features b/crossbuild-runner/backends/ppc/features index 6a97cd7708..d183b010ff 100644 --- a/crossbuild-runner/backends/ppc/features +++ b/crossbuild-runner/backends/ppc/features @@ -1,2 +1,2 @@ -:gencgc :stack-allocatable-vectors +:gencgc :compare-and-swap-vops :alien-callbacks diff --git a/crossbuild-runner/backends/ppc64/features b/crossbuild-runner/backends/ppc64/features index c1f3c1dab8..bb93dee220 100644 --- a/crossbuild-runner/backends/ppc64/features +++ b/crossbuild-runner/backends/ppc64/features @@ -1,5 +1,5 @@ ; threads are required because differing versions of the vops for BOUNDP ; and [fast-]symbol-[global-]value and CAS create extra maintenance burden. :64-bit :untagged-fdefns :sb-thread -:gencgc :stack-allocatable-vectors +:gencgc :compare-and-swap-vops :alien-callbacks diff --git a/crossbuild-runner/backends/riscv/features b/crossbuild-runner/backends/riscv/features index 9e5829db66..f6d9eb7af0 100644 --- a/crossbuild-runner/backends/riscv/features +++ b/crossbuild-runner/backends/riscv/features @@ -1,3 +1,2 @@ :gencgc -:stack-allocatable-vectors :compare-and-swap-vops :memory-barrier-vops diff --git a/crossbuild-runner/backends/sparc/features b/crossbuild-runner/backends/sparc/features index 8b13789179..e69de29bb2 100644 --- a/crossbuild-runner/backends/sparc/features +++ b/crossbuild-runner/backends/sparc/features @@ -1 +0,0 @@ - diff --git a/crossbuild-runner/backends/x86-64/features b/crossbuild-runner/backends/x86-64/features index d9e5f0f482..417acc1104 100644 --- a/crossbuild-runner/backends/x86-64/features +++ b/crossbuild-runner/backends/x86-64/features @@ -5,7 +5,6 @@ :compare-and-swap-vops :unwind-to-frame-and-call-vop :fp-and-pc-standard-save -:stack-allocatable-vectors :alien-callbacks :cycle-counter :integer-eql-vop diff --git a/crossbuild-runner/backends/x86/features b/crossbuild-runner/backends/x86/features index 9dd11700a5..019bfbdd9e 100644 --- a/crossbuild-runner/backends/x86/features +++ b/crossbuild-runner/backends/x86/features @@ -3,7 +3,6 @@ :c-stack-is-control-stack :compare-and-swap-vops :unwind-to-frame-and-call-vop -:stack-allocatable-vectors :alien-callbacks :cycle-counter :fp-and-pc-standard-save diff --git a/src/assembly/alpha/array.lisp b/src/assembly/alpha/array.lisp index 3f3d80914a..57af29d101 100644 --- a/src/assembly/alpha/array.lisp +++ b/src/assembly/alpha/array.lisp @@ -12,9 +12,9 @@ (in-package "SB-VM") -(define-assembly-routine (allocate-vector +(macrolet ((foo (name) +`(define-assembly-routine (,name (:policy :fast-safe) - (:translate allocate-vector) (:arg-types positive-fixnum positive-fixnum positive-fixnum)) @@ -37,4 +37,6 @@ (inst bis alloc-tn other-pointer-lowtag result) (inst addq alloc-tn words alloc-tn) (storew ndescr result 0 other-pointer-lowtag) - (storew length result vector-length-slot other-pointer-lowtag))) + (storew length result vector-length-slot other-pointer-lowtag))))) + (foo allocate-vector-on-heap) + (foo allocate-vector-on-stack)) ; get crossbuild to pass for what that's worth diff --git a/src/assembly/ppc/array.lisp b/src/assembly/ppc/array.lisp index 77a2e32158..ec6befb0e3 100644 --- a/src/assembly/ppc/array.lisp +++ b/src/assembly/ppc/array.lisp @@ -14,8 +14,6 @@ (define-assembly-routine (allocate-vector-on-heap (:policy :fast-safe) - #-stack-allocatable-vectors - (:translate allocate-vector) (:arg-types positive-fixnum positive-fixnum positive-fixnum)) @@ -51,7 +49,6 @@ ;; (storew zero-tn alloc-tn 0) (move result vector)) -#+stack-allocatable-vectors (define-assembly-routine (allocate-vector-on-stack (:policy :fast-safe) (:arg-types positive-fixnum diff --git a/src/assembly/ppc64/array.lisp b/src/assembly/ppc64/array.lisp index b78262b1c6..31e25677f7 100644 --- a/src/assembly/ppc64/array.lisp +++ b/src/assembly/ppc64/array.lisp @@ -14,8 +14,6 @@ (define-assembly-routine (allocate-vector-on-heap (:policy :fast-safe) - #-stack-allocatable-vectors - (:translate allocate-vector) (:arg-types positive-fixnum positive-fixnum positive-fixnum)) @@ -39,7 +37,6 @@ (storew length vector vector-length-slot other-pointer-lowtag)) (move result vector)) -#+stack-allocatable-vectors (define-assembly-routine (allocate-vector-on-stack (:policy :fast-safe) (:arg-types positive-fixnum diff --git a/src/assembly/sparc/array.lisp b/src/assembly/sparc/array.lisp index 9be9c9f37a..a1026c708b 100644 --- a/src/assembly/sparc/array.lisp +++ b/src/assembly/sparc/array.lisp @@ -11,7 +11,7 @@ (in-package "SB-VM") -(define-assembly-routine (allocate-vector +(define-assembly-routine (allocate-vector-on-heap (:policy :fast-safe) (:translate allocate-vector) (:arg-types positive-fixnum @@ -30,7 +30,7 @@ (inst add ndescr words (* (1+ vector-data-offset) n-word-bytes)) (inst andn ndescr 7) (allocation nil ndescr other-pointer-lowtag vector :temp-tn gc-temp) - (inst srl ndescr type word-shift) + (inst srl ndescr type n-fixnum-tag-bits) (storew ndescr vector 0 other-pointer-lowtag) (storew length vector vector-length-slot other-pointer-lowtag)) ;; This makes sure the zero byte at the end of a string is paged in so @@ -54,3 +54,40 @@ #-gencgc (storew zero-tn alloc-tn 0) (move result vector)) + +(define-assembly-routine (allocate-vector-on-stack + (:policy :fast-safe) + (:translate allocate-vector) + (:arg-types positive-fixnum + positive-fixnum + positive-fixnum)) + ((:arg type any-reg a0-offset) + (:arg length any-reg a1-offset) + (:arg words any-reg a2-offset) + (:res result descriptor-reg a0-offset) + + (:temp ndescr non-descriptor-reg nl0-offset) + (:temp gc-temp non-descriptor-reg nl1-offset) + (:temp vector descriptor-reg a3-offset)) + (pseudo-atomic () + ;; boxed words == unboxed bytes + (inst add ndescr words (* (1+ vector-data-offset) n-word-bytes)) + (inst andn ndescr 7) + (allocation nil ndescr other-pointer-lowtag vector :temp-tn gc-temp + :stack-p t) + ;; We're pseudo-atomic here, so we can do whatever is most convenient + ;; to zeroize the array data. Clear two words at a time upward from VECTOR + ;; until reaching the new CSP-TN value. Don't pre-check for 0 payload words, + ;; just consider the first two words as part of the array data. + (let ((loop (gen-label))) + (inst add ndescr vector (- other-pointer-lowtag)) + (emit-label loop) + (storew zero-tn ndescr 0 0) ; next store is in the branch delay slot + (inst add ndescr ndescr (* n-word-bytes 2)) + (inst cmp ndescr csp-tn) + (inst b :lt loop) + (storew zero-tn ndescr -1 0)) ; -1 because ptr was already bumped + (inst srl ndescr type n-fixnum-tag-bits) + (storew ndescr vector 0 other-pointer-lowtag) + (storew length vector vector-length-slot other-pointer-lowtag)) + (move result vector)) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index 762cc1952d..6dda83a154 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -316,12 +316,10 @@ node block (list value-tn) (node-lvar node)))))))) ;;; Stack allocation optimizers per platform support -#+stack-allocatable-vectors -(progn - (defoptimizer (make-array-header* stack-allocate-result) ((&rest args) node dx) +(defoptimizer (make-array-header* stack-allocate-result) ((&rest args) node dx) args dx t) - (defoptimizer (allocate-vector stack-allocate-result) +(defoptimizer (allocate-vector stack-allocate-result) ((type length words) node dx) (declare (ignorable type) (ignore length)) (and @@ -341,14 +339,13 @@ (specifier-type `(integer 0 ,(- (/ +backend-page-bytes+ sb-vm:n-word-bytes) sb-vm:vector-data-offset))))))) - - (defoptimizer (allocate-vector ltn-annotate) ((type length words) call ltn-policy) +(defoptimizer (allocate-vector ltn-annotate) ((type length words) call ltn-policy) (declare (ignore type length words)) (vectorish-ltn-annotate-helper call ltn-policy 'sb-vm::allocate-vector-on-stack 'sb-vm::allocate-vector-on-heap)) - (defun vectorish-ltn-annotate-helper (call ltn-policy dx-template not-dx-template) +(defun vectorish-ltn-annotate-helper (call ltn-policy dx-template not-dx-template) (let* ((args (basic-combination-args call)) (template-name (if (node-stack-allocate-p call) dx-template @@ -364,7 +361,7 @@ (setf (node-tail-p call) nil) (dolist (arg args) - (annotate-1-value-lvar arg))))) + (annotate-1-value-lvar arg)))) ;;; ...lists (progn diff --git a/src/compiler/hppa/alloc.lisp b/src/compiler/hppa/alloc.lisp index a3c968633f..f8a166c2c6 100644 --- a/src/compiler/hppa/alloc.lisp +++ b/src/compiler/hppa/alloc.lisp @@ -87,8 +87,6 @@ positive-fixnum) (:temporary (:sc non-descriptor-reg) bytes) (:results (result :scs (descriptor-reg) :from :load)) - #-stack-allocatable-vectors - (:translate allocate-vector) (:policy :fast-safe) (:generator 100 (inst addi (+ lowtag-mask diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 8ca2d20615..111b4ec36b 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -761,9 +761,6 @@ ;; It's just a distraction otherwise. (declare (ignorable lvar flush)) - #+(and sb-xc-host (not stack-allocatable-vectors)) - (return-from note-no-stack-allocation) - (do-uses (use (principal-lvar lvar)) (dolist (use (ensure-list (if (cast-p use) (principal-lvar-use (cast-value use)) diff --git a/src/compiler/sparc/alloc.lisp b/src/compiler/sparc/alloc.lisp index 2cc77287f6..0503816b59 100644 --- a/src/compiler/sparc/alloc.lisp +++ b/src/compiler/sparc/alloc.lisp @@ -136,18 +136,14 @@ (:results (result :scs (descriptor-reg))) (:temporary (:scs (non-descriptor-reg)) temp) (:generator 4 - (cond (stack-allocate-p - (allocation nil (pad-data-block words) - lowtag result :stack-p t :temp-tn temp) - (when type - (inst li temp (logior (ash (1- words) (length-field-shift type)) type)) - (storew temp result 0 lowtag))) - (t - (pseudo-atomic () - (allocation nil (pad-data-block words) lowtag result :temp-tn temp) - (when type - (inst li temp (logior (ash (1- words) (length-field-shift type)) type)) - (storew temp result 0 lowtag))))))) + ;; I don't see why fixed allocations need to be pseudo-atomic. + ;; The other precisely GC'd backends have it this way. + (pseudo-atomic () + (allocation nil (pad-data-block words) lowtag result :temp-tn temp + :stack-p stack-allocate-p) + (when type + (inst li temp (logior (ash (1- words) (length-field-shift type)) type)) + (storew temp result 0 lowtag))))) (define-vop (var-alloc) (:args (extra :scs (any-reg))) diff --git a/src/compiler/sparc/insts.lisp b/src/compiler/sparc/insts.lisp index 0de9bd5693..057470f4de 100644 --- a/src/compiler/sparc/insts.lisp +++ b/src/compiler/sparc/insts.lisp @@ -370,6 +370,8 @@ about function addresses and register values.") (data :field (byte 22 0) :reader format-2-unimp-data)) (defconstant-eqx f3-printer + ;; FIXME: args are inverted if eliding display of source1, + ;; and I think totally backwards in any case. '(:name :tab (:unless (:same-as rd) rs1 ", ") (:choose rs2 immed) ", " diff --git a/src/compiler/sparc/macros.lisp b/src/compiler/sparc/macros.lisp index c6c7f7ef5b..c28782d08c 100644 --- a/src/compiler/sparc/macros.lisp +++ b/src/compiler/sparc/macros.lisp @@ -176,7 +176,7 @@ #+nil (inst add ,temp-tn csp-tn sb-vm:lowtag-mask) #+nil (inst andn ,temp-tn sb-vm:lowtag-mask) - ;; Set the result to temp-tn, with appropriate lowtag + ;; Set the result to csp-tn, with appropriate lowtag (inst or result-tn csp-tn lowtag) ;; Allocate the desired space on the stack. diff --git a/tests/dynamic-extent.impure.lisp b/tests/dynamic-extent.impure.lisp index 0ab30d0b72..bc1603a420 100644 --- a/tests/dynamic-extent.impure.lisp +++ b/tests/dynamic-extent.impure.lisp @@ -734,7 +734,7 @@ (assert-no-consing (dx-handler-bind 2)) (assert-no-consing (dx-handler-case 2))) -(with-test (:name (:no-consing :dx-vectors) :skipped-on (not :stack-allocatable-vectors)) +(with-test (:name (:no-consing :dx-vectors)) (assert-no-consing (force-make-array-on-stack 128)) (assert-no-consing (make-array-on-stack-2 5 '(1 2.0 3 4.0 5))) (assert-no-consing (make-array-on-stack-3 9 8 7)) @@ -742,7 +742,7 @@ (assert-no-consing (make-array-on-stack-5)) (assert-no-consing (vector-on-stack :x :y))) -(with-test (:name (:no-consing :dx-arrays) :skipped-on (not :stack-allocatable-vectors)) +(with-test (:name (:no-consing :dx-arrays)) (assert-no-consing (make-3d-fixed-array-on-stack-1)) (assert-no-consing (make-2d-variable-array-on-stack)) (assert-no-consing (make-2d-array-function-initializer 1)) @@ -750,13 +750,11 @@ (assert-no-consing (make-2d-array-function-initializer 3))) (with-test (:name (:no-consing :dx-specialized-arrays) - :skipped-on (not (and :stack-allocatable-vectors - :c-stack-is-control-stack))) + :skipped-on (not :c-stack-is-control-stack)) (assert-no-consing (make-3d-fixed-array-on-stack-2 0 0 1 1))) (with-test (:name (:no-consing :specialized-dx-vectors) - :skipped-on (not (and :stack-allocatable-vectors - :c-stack-is-control-stack))) + :skipped-on (not :c-stack-is-control-stack)) (assert-no-consing (make-array-on-stack-1)) (assert-no-consing (make-array-on-stack-6)) (assert-no-consing (make-array-on-stack-7)) @@ -1038,7 +1036,6 @@ (defun barvector (x y z) (make-array 3 :initial-contents (list x y z))) (with-test (:name :dx-compiler-notes - :skipped-on (not :stack-allocatable-vectors) :fails-on (and)) (flet ((assert-notes (j lambda) (let ((notes (nth 4 (multiple-value-list (checked-compile lambda))))) ; TODO @@ -1108,8 +1105,7 @@ (let ((vec (vec (aref vec 0) (aref vec 1) (aref vec 2)))) (declare (dynamic-extent vec)) (funcall fun vec)))) -(with-test (:name :recheck-nested-dx-bug - :skipped-on (not :stack-allocatable-vectors)) +(with-test (:name :recheck-nested-dx-bug) (assert (funcall (bad-boy (vec 1.0 2.0 3.3)) (lambda (vec) (equalp vec (vec 1.0 2.0 3.3))))) (flet ((foo (x) (declare (ignore x)))) @@ -1133,8 +1129,7 @@ (cons #'bar (lambda () (declare (dynamic-extent #'bar)))))) :allow-notes 'sb-ext:compiler-note))) -(with-test (:name :bug-586105 - :skipped-on (not :stack-allocatable-vectors)) +(with-test (:name :bug-586105) (flet ((test (x) (let ((vec1 (make-array 1 :initial-contents (list (list x)))) (vec2 (make-array 1 :initial-contents `((,x)))) From 1d4de40f9aca6c839d2f35fe50a3855288d30fb3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 4 Jun 2020 09:49:11 -0400 Subject: [PATCH 0087/4023] Print size_t using 'z' printf modifier --- src/runtime/os-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 17b8529b0f..4926e3e2d6 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -262,7 +262,7 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm } #endif if (fail) - lose("load_core_bytes(%d,%x,%lx,%x) failed", fd, offset, (long)addr, (int)len); + lose("load_core_bytes(%d,%zx,%p,%zx) failed", fd, offset, addr, len); return (void*)actual; } From 87284809f850e8a68f7548460e2bbae26418aa02 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 4 Jun 2020 13:12:04 -0400 Subject: [PATCH 0088/4023] Make test pass under parallel-exec RUN-PROGRAM has (APPLY #'OPEN) that now gets encapsulated but wasn't before. --- tests/run-program.impure.lisp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index 82f4a25441..50b2700f25 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -333,6 +333,8 @@ #-win32 (with-test (:name (run-program :if-input-does-not-exist)) (let ((file (pathname (sb-posix:mktemp "rpXXXXXX")))) + (when (boundp 'run-tests::*allowed-inputs*) + (push (namestring file) (symbol-value 'run-tests::*allowed-inputs*))) (assert (null (run-program "/bin/cat" '() :input file))) (assert (null (run-program "/bin/cat" '() :output #.(or *compile-file-truename* *load-truename*) From 021e7257ef0992b4f6695170e6a0ec26031d17c3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 4 Jun 2020 13:19:23 -0400 Subject: [PATCH 0089/4023] Use EQ hash-table instead of EQL for readtables Avoids GETHASH having to decide that EQL is EQ on each lookup --- package-data-list.lisp-expr | 2 +- src/code/pprint.lisp | 3 +-- src/code/reader.lisp | 17 +++++++---------- src/code/readtable.lisp | 4 ++-- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 071c328312..926087db15 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -1261,7 +1261,7 @@ possibly temporarily, because it might be used internally." "POSSIBLY-BASE-STRINGIZE" "POWER-OF-TWO-CEILING" "PRINT-NOT-READABLE-ERROR" - "REPLACE/EQL-HASH-TABLE" + "HASH-TABLE-REPLACE" "RECONS" "SET-CLOSURE-NAME" diff --git a/src/code/pprint.lisp b/src/code/pprint.lisp index 702dcfdaa3..885062c97f 100644 --- a/src/code/pprint.lisp +++ b/src/code/pprint.lisp @@ -807,8 +807,7 @@ line break." (new (make-pprint-dispatch-table (copy-list (pp-dispatch-entries orig)) (pp-dispatch-number-matchable-p orig) (pp-dispatch-only-initial-entries orig)))) - (replace/eql-hash-table (pp-dispatch-cons-entries new) - (pp-dispatch-cons-entries orig)) + (hash-table-replace (pp-dispatch-cons-entries new) (pp-dispatch-cons-entries orig)) new)) (defun pprint-dispatch (object &optional (table *print-pprint-dispatch*)) diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 8b7f36c55a..e41953f26b 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -264,7 +264,7 @@ be interned (returned, respectively) as required. The default is :SYMBOLS." (if (member new-value '(:strings :both)) 'base-char 'character)) new-value) -(defun replace/eql-hash-table (to from &optional (transform #'identity)) +(defun hash-table-replace (to from &optional (transform #'identity)) (maphash (lambda (k v) (setf (gethash k to) (funcall transform v))) from) to) @@ -286,8 +286,7 @@ be interned (returned, respectively) as required. The default is :SYMBOLS." (let ((dtable (%dispatch-macro-char-table entry))) (if dtable (%make-dispatch-macro-char - (cons (awhen (car dtable) - (replace/eql-hash-table (make-hash-table) it)) + (cons (awhen (car dtable) (hash-table-replace (make-hash-table) it)) (copy-seq (cdr dtable)))) entry))) @@ -301,16 +300,14 @@ readtable when not provided." (really-to-readtable (or to-readtable (make-readtable)))) (replace (character-attribute-array really-to-readtable) (character-attribute-array really-from-readtable)) - (replace/eql-hash-table - (clrhash (character-attribute-hash-table really-to-readtable)) - (character-attribute-hash-table really-from-readtable)) + (hash-table-replace (clrhash (character-attribute-hash-table really-to-readtable)) + (character-attribute-hash-table really-from-readtable)) (map-into (character-macro-array really-to-readtable) #'copy-cmt-entry (character-macro-array really-from-readtable)) - (replace/eql-hash-table - (clrhash (character-macro-hash-table really-to-readtable)) - (character-macro-hash-table really-from-readtable) - #'copy-cmt-entry) + (hash-table-replace (clrhash (character-macro-hash-table really-to-readtable)) + (character-macro-hash-table really-from-readtable) + #'copy-cmt-entry) (setf (readtable-case really-to-readtable) (readtable-case really-from-readtable)) (setf (%readtable-string-preference really-to-readtable) diff --git a/src/code/readtable.lisp b/src/code/readtable.lisp index 7c857a49ec..9ab09c50ae 100644 --- a/src/code/readtable.lisp +++ b/src/code/readtable.lisp @@ -71,7 +71,7 @@ types for the Common Lisp expression reader." :initial-element +char-attr-constituent+) :type attribute-table :read-only t) - (character-attribute-hash-table (make-hash-table) + (character-attribute-hash-table (make-hash-table :test 'eq) :type hash-table :read-only t) ;; The CHARACTER-MACRO-TABLE is a vector of BASE-CHAR-CODE-LIMIT @@ -84,7 +84,7 @@ types for the Common Lisp expression reader." (make-array base-char-code-limit :initial-element nil) :type (simple-vector #.base-char-code-limit) :read-only t) - (character-macro-hash-table (make-hash-table) :type hash-table + (character-macro-hash-table (make-hash-table :test 'eq) :type hash-table :read-only t) (%readtable-case 0 :type (mod 4)) ;; Element type to use when reading a string literal with no extended-chars. From 064d997d5a26b0248abdcf11c6663351ac280863 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 5 Jun 2020 16:22:24 -0400 Subject: [PATCH 0090/4023] x86-64: possibly use a 1-byte comparison for EQ to NIL --- src/compiler/x86-64/pred.lisp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/compiler/x86-64/pred.lisp b/src/compiler/x86-64/pred.lisp index 73bcd14ef6..29dfb4ee2b 100644 --- a/src/compiler/x86-64/pred.lisp +++ b/src/compiler/x86-64/pred.lisp @@ -267,11 +267,27 @@ (:conditional :e) (:policy :fast-safe) (:translate eq) + (:args-var x-tn-ref) (:generator 6 (cond ((sc-is y immediate) (let* ((value (encode-value-if-immediate y)) (immediate (plausible-signed-imm32-operand-p value))) + (when (and (null (tn-value y)) (tn-ref-type x-tn-ref)) + ;; if the complement of X's type with respect to type NULL can't + ;; be a cons, then we don't need a 4-byte comparison against NIL. + ;; It suffices to test the low byte. Similar logic could pertain to many + ;; other type tests, e.g. STRINGP on known (OR INSTANCE STRING) + ;; could skip the widetag test. + ;; I'm starting to wonder if it would be better to expose the lowtag/widetag + ;; tests in IR1 as an AND expression so that type inference can remove what's + ;; possible to deduce. The we just need a way to efficiently recombine + ;; the AND back to one vop where we can. "selection DAG, anyone?" + (when (not (types-equal-or-intersect + (type-difference (tn-ref-type x-tn-ref) (specifier-type 'null)) + (specifier-type 'cons))) + (inst cmp :byte x (logand nil-value #xff)) + (return-from if-eq))) (cond ((fixup-p value) ; immobile object (inst cmp x value)) ((and (zerop value) (sc-is x any-reg descriptor-reg)) From 03712709365afdad1c1c0c1d6fdf6ed2a344e4db Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 5 Jun 2020 22:26:16 -0400 Subject: [PATCH 0091/4023] Strength-reduce some typep tests Transform (typep X 'thing) to (not (null X)) whenever X is known to be of type (OR NULL THING) --- src/compiler/typetran.lisp | 76 +++++++++++++++++--------------- tests/x86-64-codegen.impure.lisp | 41 ++++++++++++----- 2 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index baa69a8dc4..2517beae02 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -75,8 +75,31 @@ (defun ir1-transform-type-predicate (object type node) (declare (type lvar object) (type ctype type)) (let ((otype (lvar-type object))) - (flet ((tricky () - (cond ((typep type 'alien-type-type) + (cond ((not (types-equal-or-intersect otype type)) + (return-from ir1-transform-type-predicate nil)) + ((csubtypep otype type) + (return-from ir1-transform-type-predicate t)) + ((eq type *empty-type*) + (return-from ir1-transform-type-predicate nil))) + (let ((intersect (type-intersection2 type otype))) + ;; I guess the theory here is that an intersection type + ;; is never a singleton, because if we could see that it was + ;; a singleton, it wouldn't be an intersection. + (when (and intersect (not (intersection-type-p intersect))) + (multiple-value-bind (constantp value) (type-singleton-p intersect) + (when constantp + (return-from ir1-transform-type-predicate `(eql object ',value))))) + ;; If the object type is known to be (OR NULL ), + ;; it is almost always cheaper to test for not EQ to NIL. + ;; There is one exception: + ;; - FIXNUMP is possibly cheapear than comparison to NIL, or definitely + ;; not worse. For x86, NIL is a 4-byte immediate operand, + ;; for lack of a null-tn register. FIXNUM-TAG-MASK is only 1 byte. + (when (type= otype (type-union (specifier-type 'null) type)) + (let ((difference (type-difference type (specifier-type 'null)))) + (unless (type= difference (specifier-type 'fixnum)) + (return-from ir1-transform-type-predicate `(not (null object)))))) + (cond ((typep type 'alien-type-type) ;; We don't transform alien type tests until here, because ;; once we do that the rest of the type system can no longer ;; reason about them properly -- so we'd miss out on type @@ -86,8 +109,8 @@ ;; If it's a lisp-rep-type, the CTYPE should be one already. (aver (not (compute-lisp-rep-type alien-type))) `(sb-alien::alien-value-typep object ',alien-type))) - #+(vop-translates sb-int:fixnump-instance-ref) - ((and (type= type (specifier-type 'fixnum)) + #+(vop-translates sb-int:fixnump-instance-ref) + ((and (type= type (specifier-type 'fixnum)) (let ((use (lvar-uses object))) (and (combination-p use) (almost-immediately-used-p object use) @@ -97,37 +120,20 @@ (second (combination-args use)))) (member (lvar-fun-name (combination-fun use)) '(car cdr)))))) - ;; This is a disturbing trend, but it's the best way to - ;; combine instructions in the compiler as it is - ;; (as opposed to the compiler as we wish it would be). - (case (lvar-fun-name (combination-fun (lvar-uses object))) - (%instance-ref - (splice-fun-args object '%instance-ref 2) - `(lambda (obj i) (fixnump-instance-ref obj i))) - (car - (splice-fun-args object 'car 1) - `(lambda (obj) (fixnump-car obj))) - (cdr - (splice-fun-args object 'cdr 1) - `(lambda (obj) (fixnump-cdr obj))))) - (t - (give-up-ir1-transform))))) - (cond ((not (types-equal-or-intersect otype type)) - nil) - ((csubtypep otype type) - t) - ((eq type *empty-type*) - nil) - (t - (let ((intersect (type-intersection2 type otype))) - (when (or (not intersect) - (intersection-type-p intersect)) - (tricky)) - (multiple-value-bind (constantp value) - (type-singleton-p intersect) - (if constantp - `(eql object ',value) - (tricky))))))))) + ;; FIXME: vopcombine should be able to combine a load + ;; and a fixnump test withoot special-casing these three. + (case (lvar-fun-name (combination-fun (lvar-uses object))) + (%instance-ref + (splice-fun-args object '%instance-ref 2) + `(lambda (obj i) (fixnump-instance-ref obj i))) + (car + (splice-fun-args object 'car 1) + `(lambda (obj) (fixnump-car obj))) + (cdr + (splice-fun-args object 'cdr 1) + `(lambda (obj) (fixnump-cdr obj))))) + (t + (give-up-ir1-transform)))))) ;;; Flush %TYPEP tests whose result is known at compile time. (deftransform %typep ((object type) * * :node node) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 050a2553fa..8fdf5de318 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -12,6 +12,21 @@ #-x86-64 (sb-ext:exit :code 104) (load "compiler-test-util.lisp") +(defun disassembly-lines (fun) + ;; FIXME: I don't remember what this override of the hook is for. + (sb-int:encapsulate 'sb-disassem::add-debugging-hooks 'test + (lambda (f &rest args) (declare (ignore f args)))) + (prog1 + (mapcar (lambda (x) (string-left-trim " ;" x)) + (cddr + (split-string + (with-output-to-string (s) + (let ((sb-disassem:*disassem-location-column-width* 0) + (*print-pretty* nil)) + (disassemble fun :stream s))) + #\newline))) + (sb-int:unencapsulate 'sb-disassem::add-debugging-hooks 'test))) + (defun disasm (safety expr &optional (remove-epilogue t)) ;; This lambda has a name because if it doesn't, then the name ;; is something stupid like (lambda () in ...) which pretty-prints @@ -21,16 +36,7 @@ (declare (optimize (debug 0) (safety ,safety) (sb-c:verify-arg-count 0))) ,expr)))) - (sb-int:encapsulate 'sb-disassem::add-debugging-hooks 'test - (lambda (f &rest args) (declare (ignore f args)))) - (let ((lines - (split-string - (with-output-to-string (s) - (let ((sb-disassem:*disassem-location-column-width* 0)) - (disassemble fun :stream s))) - #\newline))) - (sb-int:unencapsulate 'sb-disassem::add-debugging-hooks 'test) - (setq lines (cddr lines)) ; remove "Disassembly for" + (let ((lines (disassembly-lines fun))) ;; For human-readability, kill the whitespace (setq lines (mapcar (lambda (x) (string-left-trim " ;" x)) lines)) (when (string= (car (last lines)) "") @@ -718,3 +724,18 @@ sb-vm::(define-vop (cl-user::test) (assert (zerop (sb-kernel:code-n-entries trampoline))) (assert (typep (sb-di::debug-fun-from-pc trampoline 8) 'sb-di::bogus-debug-fun)))) + +(defstruct foo (s 0 :type (or null string))) +(with-test (:name :reduce-stringp-to-not-null) + (let ((f1 (disassembly-lines + '(lambda (x) (if (null (foo-s (truly-the foo x))) 'not 'is)))) + (f2 (disassembly-lines + '(lambda (x) (if (stringp (foo-s (truly-the foo x))) 'is 'not))))) + ;; the comparison of X to NIL should be a single-byte test + (assert (loop for line in f1 + thereis (search (format nil "CMP AL, ~D" + (logand sb-vm:nil-value #xff)) + line))) + ;; the two variations of the test compile to the identical code + (dotimes (i 4) + (assert (string= (nth i f1) (nth i f2)))))) From f59feae2841027807a337d3f3fd0cf919dca22c5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 5 Jun 2020 22:55:34 -0400 Subject: [PATCH 0092/4023] Respect binding of sb-xc:*compile-print* in compile-cold-sbcl --- src/cold/shared.lisp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 9ad48b7052..7b14a573c6 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -592,10 +592,7 @@ retry-compile-file (multiple-value-bind (output-truename warnings-p failure-p) (restart-case - (funcall compile-file src :output-file tmp-obj - ;; if tracing, also show high-level progress - :trace-file trace-file - :print trace-file + (apply compile-file src :output-file tmp-obj :block-compile (and ;; Block compilation was ;; completely broken ;; from the beginning of @@ -609,7 +606,12 @@ (lisp-implementation-version)) '(2 0 2)))) block-compile) - :allow-other-keys t) + :allow-other-keys t + ;; If tracing, also print, but don't specify :PRINT unless specifying + ;; :TRACE-FILE so that whatever the default is for *COMPILE-PRINT* + ;; prevails, insensitively to whether it's the SB-XC: or CL: symbol. + (when trace-file + '(:trace-file t :print t))) (recompile () :report report-recompile-restart (go retry-compile-file))) From 89e7ded1e6ae2c6a7c6691bf856d42ff2c0dd4a9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 7 Jun 2020 00:51:47 +0300 Subject: [PATCH 0093/4023] Reanalyze defined-fun-functional in recognize-known-call. It was previously done by reference-leaf and without it find-initial-dfo doesn't work properly. Reported by Matt Kaufmann. --- src/compiler/ir1opt.lisp | 50 ++++++++++++++++++++------------------ tests/compiler-2.pure.lisp | 18 ++++++++++++++ 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index d559eec07a..6cf2ce8379 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -1304,30 +1304,32 @@ ;; is it for? (with-ir1-environment-from-node call (let ((fun (defined-fun-functional leaf))) - (if (or (not fun) - (and (eq inlinep 'inline) (functional-kind fun)) - ;; Referencing it again will break the invariant - ;; for assignment functions. - (eq (functional-kind fun) :assignment)) - ;; Convert. - (let* ((name (leaf-source-name leaf)) - (*inline-expansions* - (register-inline-expansion leaf call)) - (res (ir1-convert-inline-expansion - name - (defined-fun-inline-expansion leaf) - leaf - inlinep - (info :function :info name)))) - ;; Allow backward references to this function from following - ;; forms. (Reused only if policy matches.) - (push res (defined-fun-functionals leaf)) - (change-ref-leaf ref res) - (unless ir1-converting-not-optimizing-p - (locall-analyze-component *current-component*))) - ;; If we've already converted, change ref to the converted - ;; functional. - (change-ref-leaf ref fun)))) + (cond ((or (not fun) + (and (eq inlinep 'inline) (functional-kind fun)) + ;; Referencing it again will break the invariant + ;; for assignment functions. + (eq (functional-kind fun) :assignment)) + ;; Convert. + (let* ((name (leaf-source-name leaf)) + (*inline-expansions* + (register-inline-expansion leaf call)) + (res (ir1-convert-inline-expansion + name + (defined-fun-inline-expansion leaf) + leaf + inlinep + (info :function :info name)))) + ;; Allow backward references to this function from following + ;; forms. (Reused only if policy matches.) + (push res (defined-fun-functionals leaf)) + (change-ref-leaf ref res) + (unless ir1-converting-not-optimizing-p + (locall-analyze-component *current-component*)))) + (t + ;; If we've already converted, change ref to the converted + ;; functional. + (maybe-reanalyze-functional fun) + (change-ref-leaf ref fun))))) (values (ref-leaf ref) nil)) (t (let ((info (info :function :info (leaf-source-name leaf)))) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 3aa5385818..fdb54e14c0 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -2896,3 +2896,21 @@ (+ (restart-bind nil (go missing-tag)) (progv nil nil o))))))) :allow-failure t)))) + + +(declaim (maybe-inline inline-recursive)) +(defun inline-recursive (x) + (declare (muffle-conditions compiler-note + style-warning)) + (if (zerop x) + x + (inline-recursive (1- x)))) +(declaim (inline inline-recursive)) + +(with-test (:name :reanalyze-functionals-when-inlining) + (checked-compile-and-assert + () + `(lambda (x) + (inline-recursive x) + (inline-recursive x)) + ((5) 0))) From dd546fa8ec4153b616fb1052cedb16260c39d7c1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 7 Jun 2020 00:52:37 +0300 Subject: [PATCH 0094/4023] tests/subr.sh doesn't work on zsh, don't use $SHELL. --- tests/parallel-exec.sh | 2 +- tests/test-funs.lisp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index c41a625d7a..d4c833a4c2 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -74,7 +74,7 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (setq *debug-io* (make-two-way-stream (make-concatenated-stream) *error-output*)) (cond ((string= (pathname-type file) "test") - (let ((shell (or (posix-getenv "SHELL") "/bin/sh"))) + (let ((shell (or #+sunos (posix-getenv "SHELL") "/bin/sh"))) ;; exec the shell with the test and we'll pick up its exit code (alien-funcall (extern-alien "execl" (function int c-string c-string c-string unsigned)) diff --git a/tests/test-funs.lisp b/tests/test-funs.lisp index b85220ff6b..c500c2805b 100644 --- a/tests/test-funs.lisp +++ b/tests/test-funs.lisp @@ -78,7 +78,8 @@ (progn (test-util::setenv "TEST_SBCL_EVALUATOR_MODE" (string-downcase *test-evaluator-mode*)) - (let ((process (sb-ext:run-program (or (posix-getenv "SHELL") "/bin/sh") + (let ((process (sb-ext:run-program (or #+sunos (posix-getenv "SHELL") + "/bin/sh") (list (native-namestring file)) :output *error-output*))) (let ((*failures* nil)) From c92a3e59a809a580b31a6099eab03464c112cf1b Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 7 Jun 2020 03:36:26 +0300 Subject: [PATCH 0095/4023] Address a FIXME. --- src/compiler/ir1opt.lisp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 6cf2ce8379..8a1402bdc1 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -1299,16 +1299,12 @@ ;; For INLINE case local call analysis will copy the expansion later, ;; but for MAYBE-INLINE and NIL cases we only get one copy of the ;; expansion per component. - ;; - ;; FIXME: We also convert in INLINE & FUNCTIONAL-KIND case below. What - ;; is it for? (with-ir1-environment-from-node call (let ((fun (defined-fun-functional leaf))) (cond ((or (not fun) - (and (eq inlinep 'inline) (functional-kind fun)) - ;; Referencing it again will break the invariant - ;; for assignment functions. - (eq (functional-kind fun) :assignment)) + ;; It has already been processed by locall, + ;; inline again. + (functional-kind fun)) ;; Convert. (let* ((name (leaf-source-name leaf)) (*inline-expansions* From 6df9e519b3aba49b2aebe2ac5e19e75b4d04d9f1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 7 Jun 2020 05:59:56 +0300 Subject: [PATCH 0096/4023] Unbreak block-compilation caused problems. It leaves no external entry points, breaking things. --- src/compiler/ir1tran.lisp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 51e0040bfd..cc52b2f2f5 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -552,14 +552,6 @@ (setq trail (cdr trail))))))) ;;;; IR1-CONVERT, macroexpansion and special form dispatching - -#-sb-devel -(declaim (start-block ir1-convert ir1-convert-progn-body - ir1-convert-combination-args reference-leaf - reference-constant - expand-compiler-macro - instrument-coverage)) - (declaim (ftype (sfunction (ctran ctran (or lvar null) t) (values)) ir1-convert)) From 89f45c4f76ab94240a2eb457b9c1e3b22fb7ce7e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 7 Jun 2020 08:57:31 -0400 Subject: [PATCH 0097/4023] Define boxed-region once only Which incidentally fixes address-based-counter-val for sparc which broke after the boxed-region was moved to static space. --- src/code/target-sxhash.lisp | 29 +++++++++++--------------- src/compiler/arm/macros.lisp | 9 ++++---- src/compiler/arm64/macros.lisp | 7 +++---- src/compiler/generic/early-objdef.lisp | 5 +++++ src/compiler/ppc/macros.lisp | 6 +----- src/compiler/riscv/macros.lisp | 6 +++--- src/compiler/riscv/vm.lisp | 3 --- src/compiler/sparc/macros.lisp | 13 +++--------- src/compiler/x86-64/alloc.lisp | 6 ++---- src/compiler/x86/alloc.lisp | 6 ++---- 10 files changed, 35 insertions(+), 55 deletions(-) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index af8039886e..c82bd10e4c 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -24,23 +24,18 @@ ;; The result is guaranteed to be a positive fixnum. (declaim (inline address-based-counter-val)) (defun address-based-counter-val () - #+(and (not sb-thread) cheneygc) - (ash (sap-int (dynamic-space-free-pointer)) (- (1+ sb-vm:word-shift))) - ;; dynamic-space-free-pointer increments only when a page is full. - ;; Using boxed_region directly is finer-grained. - #+(and (not sb-thread) gencgc) - (progn #+(or arm arm64 riscv x86 x86-64 ppc ppc64) ; new way: alloc_region is in static space - (ash (sb-sys:sap-ref-word (sb-sys:int-sap sb-vm:static-space-start) - (* 2 sb-vm:n-word-bytes)) - (- (1+ sb-vm:word-shift))) - #-(or arm arm64 riscv x86 x86-64 ppc ppc64) ; old way: alloc_region is in C data - (ash (extern-alien "gc_alloc_region" unsigned-long) - (- (1+ sb-vm:word-shift)))) - ;; threads imply gencgc. use the per-thread alloc region pointer - #+sb-thread - (ash (sap-int (sb-vm::current-thread-offset-sap - #.sb-vm::thread-alloc-region-slot)) - (- (1+ sb-vm:word-shift)))) + (let ((word + ;; threads imply gencgc. use the per-thread alloc region pointer + #+sb-thread + (sap-int (sb-vm::current-thread-offset-sap #.sb-vm::thread-alloc-region-slot)) + #+(and (not sb-thread) cheneygc) + (sap-int (dynamic-space-free-pointer)) + ;; dynamic-space-free-pointer increments only when a page is full. + ;; Using boxed_region directly is finer-grained. + #+(and (not sb-thread) gencgc) + (sb-sys:sap-ref-word (sb-sys:int-sap sb-vm::boxed-region) 0))) + ;; counter should increase by 1 for each cons cell allocated + (ash word (- (1+ sb-vm:word-shift))))) ;;; Return some bits that are dependent on the next address that will be ;;; allocated, mixed with the previous state (in case addresses get recycled). diff --git a/src/compiler/arm/macros.lisp b/src/compiler/arm/macros.lisp index 6f1a435b45..851bd9d67e 100644 --- a/src/compiler/arm/macros.lisp +++ b/src/compiler/arm/macros.lisp @@ -241,18 +241,17 @@ (store-symbol-value flag-tn *allocation-pointer*)) #+gencgc (t - (let ((boxed-region (- (+ static-space-start (* 2 n-word-bytes)) - nil-value)) + (let ((region-disp (- boxed-region nil-value)) (alloc (gen-label)) (back-from-alloc (gen-label))) - (inst ldr result-tn (@ null-tn boxed-region)) ; free ptr - (inst ldr flag-tn (@ null-tn (+ boxed-region n-word-bytes))) ; end ptr + (inst ldr result-tn (@ null-tn region-disp)) ; free ptr + (inst ldr flag-tn (@ null-tn (+ region-disp n-word-bytes))) ; end ptr (if (integerp size) (composite-immediate-instruction add result-tn result-tn size) (inst add result-tn result-tn size)) (inst cmp result-tn flag-tn) (inst b :hi ALLOC) - (inst str result-tn (@ null-tn boxed-region)) ; free ptr + (inst str result-tn (@ null-tn region-disp)) ; free ptr (if (integerp size) (composite-immediate-instruction sub result-tn result-tn size) diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp index 814d6d4110..fa8861f5b7 100644 --- a/src/compiler/arm64/macros.lisp +++ b/src/compiler/arm64/macros.lisp @@ -224,16 +224,15 @@ (progn ;; load-pair can't base off null-tn because the displacement ;; has to be a multiple of 8 - (load-immediate-word flag-tn static-space-start) - (inst ldp result-tn flag-tn (@ flag-tn (* 2 n-word-bytes)))) + (load-immediate-word flag-tn boxed-region) + (inst ldp result-tn flag-tn (@ flag-tn 0))) #+sb-thread (inst ldp result-tn flag-tn (@ thread-tn (* n-word-bytes thread-alloc-region-slot))) (setf size (add-sub-immediate size)) (inst add result-tn result-tn size) (inst cmp result-tn flag-tn) (inst b :hi ALLOC) - #-sb-thread (inst str result-tn (@ null-tn (- (+ static-space-start (* 2 n-word-bytes)) - nil-value))) + #-sb-thread (inst str result-tn (@ null-tn (- boxed-region nil-value))) #+sb-thread (storew result-tn thread-tn thread-alloc-region-slot) ;; alloc_tramp uses tmp-tn for returning the result, ;; save on a move when possible diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 4ae311ab0e..05f9751662 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -113,6 +113,11 @@ (* 2 n-word-bytes) list-pointer-lowtag)) +;;; BOXED-REGION is address in static space at which a 'struct alloc_region' +;;; is overlaid on a lisp vector with element type WORD. +#-sb-thread +(defconstant boxed-region (+ static-space-start (* 2 n-word-bytes))) + (defconstant-eqx fixnum-lowtags #.(let ((fixtags nil)) (do-external-symbols (sym "SB-VM") diff --git a/src/compiler/ppc/macros.lisp b/src/compiler/ppc/macros.lisp index 2f9548c3a5..8f61800fa2 100644 --- a/src/compiler/ppc/macros.lisp +++ b/src/compiler/ppc/macros.lisp @@ -187,11 +187,7 @@ #+gencgc (binding* ((imm-size (typep size '(unsigned-byte 15))) ((region-base-tn field-offset) - #-sb-thread (values null-tn - (- (+ static-space-start - ;; skip over the array header - (* 2 n-word-bytes)) - nil-value)) + #-sb-thread (values null-tn (- boxed-region nil-value)) #+sb-thread (values thread-base-tn (* thread-alloc-region-slot n-word-bytes)))) diff --git a/src/compiler/riscv/macros.lisp b/src/compiler/riscv/macros.lisp index bb83714fa5..0322e3eaba 100644 --- a/src/compiler/riscv/macros.lisp +++ b/src/compiler/riscv/macros.lisp @@ -639,19 +639,19 @@ and (defun load-alloc-free-pointer (reg) #-sb-thread - (loadw reg null-tn 0 (- boxed-region)) + (loadw reg null-tn 0 (- nil-value boxed-region)) #+sb-thread (loadw reg thread-base-tn thread-alloc-region-slot)) (defun load-alloc-end-addr (reg) #-sb-thread - (loadw reg null-tn 1 (- boxed-region)) + (loadw reg null-tn 1 (- nil-value boxed-region)) #+sb-thread (loadw reg thread-base-tn (+ thread-alloc-region-slot 1))) (defun store-alloc-free-pointer (reg) #-sb-thread - (storew reg null-tn 0 (- boxed-region)) + (storew reg null-tn 0 (- nil-value boxed-region)) #+sb-thread (storew reg thread-base-tn thread-alloc-region-slot)) diff --git a/src/compiler/riscv/vm.lisp b/src/compiler/riscv/vm.lisp index b29cbf4972..41bbaa89c8 100644 --- a/src/compiler/riscv/vm.lisp +++ b/src/compiler/riscv/vm.lisp @@ -269,6 +269,3 @@ (progn (defconstant pseudo-atomic-flag (ash list-pointer-lowtag 0)) (defconstant pseudo-atomic-interrupted-flag (ash list-pointer-lowtag 16))) - -#-sb-thread -(defconstant boxed-region (- (+ static-space-start (* 2 n-word-bytes)) nil-value)) diff --git a/src/compiler/sparc/macros.lisp b/src/compiler/sparc/macros.lisp index c28782d08c..0d8bfe345e 100644 --- a/src/compiler/sparc/macros.lisp +++ b/src/compiler/sparc/macros.lisp @@ -132,13 +132,6 @@ ;;;; Storage allocation: -;;; Define the offset from NULL-TN to the first field in 'struct alloc_region' -;;; located in static space. The structure begin at two words past the start -;;; of the space, because there is a vector header at the exact start. -;;; This displacement is negative because its address is below NIL. -(defconstant boxed-region (- (+ static-space-start (* 2 n-word-bytes)) - nil-value)) - ;;;; Allocation macro ;;;; ;;;; This macro does the appropriate stuff to allocate space. @@ -211,8 +204,8 @@ ;; it. #+gencgc (t - (loadw result-tn null-tn 0 (- boxed-region)) ; free_pointer - (loadw temp-tn null-tn 1 (- boxed-region)) ; end_addr + (loadw result-tn null-tn 0 (- nil-value boxed-region)) ; free_pointer + (loadw temp-tn null-tn 1 (- nil-value boxed-region)) ; end_addr (without-scheduling () (let ((done (gen-label)) @@ -236,7 +229,7 @@ ;; and fold the lowtag addition into the size subtraction. ;; (Possibly not ok for the sprof_alloc_region, ;; but sb-sprof didn't work on sparc prior to this change) - (storew result-tn null-tn 0 (- boxed-region)) + (storew result-tn null-tn 0 (- nil-value boxed-region)) ;; Compute the base pointer and add lowtag. (cond ((integerp size) (inst sub result-tn (- size lowtag))) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index 9282182b76..e2540a5963 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -158,13 +158,11 @@ ;; thread->alloc_region.free_pointer (free-pointer #+sb-thread (thread-slot-ea thread-alloc-region-slot) - #-sb-thread (ea (+ static-space-start - (ash vector-data-offset word-shift)))) + #-sb-thread (ea boxed-region)) ;; thread->alloc_region.end_addr (end-addr #+sb-thread (thread-slot-ea (1+ thread-alloc-region-slot)) - #-sb-thread (ea (+ static-space-start - (ash (1+ vector-data-offset) word-shift))))) + #-sb-thread (ea (+ boxed-region n-word-bytes)))) (cond ((typep size `(integer , large-object-size)) ;; large objects will never be made in a per-thread region diff --git a/src/compiler/x86/alloc.lisp b/src/compiler/x86/alloc.lisp index fa1c5cadac..5e732427a0 100644 --- a/src/compiler/x86/alloc.lisp +++ b/src/compiler/x86/alloc.lisp @@ -81,8 +81,7 @@ scratch-tn) :disp #+sb-thread (* n-word-bytes thread-alloc-region-slot) - #-sb-thread (+ static-space-start - (ash vector-data-offset word-shift)))) + #-sb-thread boxed-region)) (end-addr ;; thread->alloc_region.end_addr (make-ea :dword @@ -90,8 +89,7 @@ scratch-tn) :disp #+sb-thread (* n-word-bytes (1+ thread-alloc-region-slot)) - #-sb-thread (+ static-space-start - (ash (1+ vector-data-offset) word-shift))))) + #-sb-thread (+ boxed-region n-word-bytes)))) (unless (and (tn-p size) (location= alloc-tn size)) (inst mov alloc-tn size)) #+(and sb-thread win32) From a99e89e7678d02f9af4dc5ac87e85b44a5e9e329 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 8 Jun 2020 01:34:00 -0400 Subject: [PATCH 0098/4023] Improve sxhash on non-simple bit-vector * Recognize a few additional cases in the compiler transform, but don't open-code anything. It's enough instructions that avoiding a function call is unlikely to change the performance. * Use simple-bit-vector logic as long as the combined displacement into underlying vector is a multiple of n-word-bits, or for some architectures, a multiple of 8. --- package-data-list.lisp-expr | 4 +- src/code/target-sxhash.lisp | 109 ++++++++++++++++++++++++++++++------ src/compiler/sxhash.lisp | 56 +++++++----------- tests/hash.pure.lisp | 96 +++++++++++++++++++++++++++++-- 4 files changed, 207 insertions(+), 58 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 926087db15..62f8422a9b 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -1695,7 +1695,9 @@ is a good idea, but see SB-SYS re. blurring of boundaries." "%SET-SIGNED-SAP-REF-8" "%SET-STACK-REF" "%SET-SYMBOL-HASH" "%SIN" "%SIN-QUICK" "%SINGLE-FLOAT" - "%SINH" "%SQRT" "%SXHASH-STRING" "%SXHASH-SIMPLE-STRING" + "%SINH" "%SQRT" + "%SXHASH-BIT-VECTOR" "%SXHASH-SIMPLE-BIT-VECTOR" + "%SXHASH-STRING" "%SXHASH-SIMPLE-STRING" #+sb-simd-pack ("%SIMD-PACK-TAG" "%SIMD-PACK-LOW" diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index c82bd10e4c..c51961b14e 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -189,6 +189,96 @@ (clear-info :function :inlinep 'integer-sxhash) +(macrolet ((with-hash ((var seed) &body body) + `(let ((,var (word-mix 410823708 ,seed))) + (declare (type word ,var)) + ,@body)) + (mix-chunk (word) + `(setq result (word-mix ,word result))) + (mix-remaining (word) + ;; N-BITS-REMAINING is between 1 inclusive and N-WORD-BITS exclusive + (let ((mask + #+little-endian ; if all except 1 bit remain, right-shift by 1, etc + `(ash most-positive-word (- n-bits-remaining sb-vm:n-word-bits)) + #+big-endian ; same, except left-shift (modularly) + `(logand most-positive-word + (ash most-positive-word + (- sb-vm:n-word-bits n-bits-remaining))))) + `(setq result (word-mix (logand ,word ,mask) result))))) +(defun %sxhash-simple-bit-vector (x) + (with-hash (result (length (truly-the simple-bit-vector x))) + (multiple-value-bind (n-full-words n-bits-remaining) (floor (length x) sb-vm:n-word-bits) + (dotimes (i n-full-words) (mix-chunk (%vector-raw-bits x i))) + (when (plusp n-bits-remaining) + ;; FIXME: Do we really have to mask off bits of the final word? + ;; I don't think so, given that remaining bits are invariantly zero. + ;; Maybe this has to do with stack-allocated vectors? + ;; Either that, or it anticipates a change wherein we do not always + ;; prezero unboxed vectors unless :INITIAL-ELEMENT was specified. + ;; (i.e. you'd get random bytes, and so the only known good bits/bytes + ;; would appear where you had performed a SETF on them) + (mix-remaining (%vector-raw-bits x n-full-words)))) + (logand result sb-xc:most-positive-fixnum))) +(defun %sxhash-bit-vector (bit-vector) + (with-array-data ((x bit-vector) (start) (end) :check-fill-pointer t) + (multiple-value-bind (start-word start-bit) (floor start sb-vm:n-word-bits) + (cond ((= start-bit 0) ; relevant bits are word-aligned + (multiple-value-bind (end-word n-bits-remaining) (floor end sb-vm:n-word-bits) + (with-hash (result (- end start)) + (do ((i start-word (1+ i))) + ((>= i end-word)) + (mix-chunk (%vector-raw-bits x i))) + (when (plusp n-bits-remaining) + (mix-remaining (%vector-raw-bits x end-word))) + (logand result sb-xc:most-positive-fixnum)))) + #+(or arm64 x86 x86-64) + ((not (logtest start-bit 7)) ; relevant bits are byte-aligned + ;; The case is probably ok on all little-endian CPUs that permit + ;; unaligned loads but I didn't try it on them all. + (with-pinned-objects (x) + (let ((byte-offset (ash start -3)) + (n-bits-remaining (- end start)) + (sap (vector-sap x))) + (with-hash (result (- end start)) + (loop (unless (>= n-bits-remaining sb-vm:n-word-bits) (return)) + #+nil + (format t "~& mixing middle word: [~a]~%" + (nreverse (format nil "~64,'0b" (sap-ref-word sap byte-offset)))) + ;; Since we have at least sb-vm:n-word-bits more to go, + ;; and the non-simple vector fits within its backing vector, + ;; it must be OK to read an entire word from that vector. + (mix-chunk (sap-ref-word sap byte-offset)) + (incf byte-offset sb-vm:n-word-bytes) + (decf n-bits-remaining sb-vm:n-word-bits)) + (when (plusp n-bits-remaining) + ;; Perform exactly one more word-sized load rather than N-BYTES-REMAINING + ;; byte-sized loads + shifts to reconstruct the final word. This load puts + ;; the final relevant byte into the MSB of the loaded word and is + ;; guaranteed neither to overrun nor underrun the backing vector. + ;; It might grab some bytes from the vector-length word as an edge case. + ;; Consider e.g. a non-simple vector of 8 bits with displaced-index-offset 16 + ;; into an underlying vector of 30 bits. + (let* ((n-bytes-remaining (ceiling n-bits-remaining sb-vm:n-byte-bits)) + ;; Compute how many bytes we didn't actually want to read. It could + ;; be 0 if we want all remaining bytes (but presumably not all bits) + (shift-out (- sb-vm:n-word-bytes n-bytes-remaining)) + (word (ash (sap-ref-word + sap + (+ byte-offset n-bytes-remaining (- sb-vm:n-word-bytes))) + (* -8 shift-out)))) + #+nil (format t "~& mixing final word: [~a]~%" + (nreverse (format nil "~64,'0b" word))) + (mix-remaining word))) + (logand result sb-xc:most-positive-fixnum))))) + (t ; not aligned in a way that this can deal with. + ;; Fallback to the simple algorithm using a copy. + ;; Nobody has complained in 17 years, ever since git rev a3ab89c1db when this + ;; was corrected to hash more than 4 bits. Prior to that, the code was plain wrong, + ;; violating constraint 1 in the spec for SXHASH. + ;; If we do manage to improve this not to cons a new vector, the test + ;; in hash.pure.lisp should be made more rigorous as well. + (%sxhash-simple-bit-vector (copy-seq bit-vector)))))))) + ;;; To avoid "note: Return type not fixed values ..." (declaim (ftype (sfunction (t) hash-code) pathname-sxhash)) @@ -241,24 +331,9 @@ (instance-sxhash x))) (array (typecase x - ;; If we could do something smart for widetag-based jump tables, - ;; then we wouldn't have to think so much about whether to test - ;; STRING and BIT-VECTOR inside or outside of the ARRAY stanza. - ;; The code is structured now to narrow down in broad strokes with - ;; the outer typecase, and then refines the type further. - ;; We could equally well move the STRING test into the outer - ;; typecase, but that would impart one more test in front of - ;; all remaining stanzas. (string (%sxhash-string x)) - (simple-bit-vector (sxhash x)) ; through DEFTRANSFORM - (bit-vector - ;; FIXME: It must surely be possible to do better - ;; than this. The problem is that a non-SIMPLE - ;; BIT-VECTOR could be displaced to another, with a - ;; non-zero offset -- so that significantly more - ;; work needs to be done using the %VECTOR-RAW-BITS - ;; approach. This will probably do for now. - (sxhash-recurse (copy-seq x) depthoid)) + (bit-vector (%sxhash-bit-vector x)) + ;; Would it be legal to mix in the widetag? (t (logxor 191020317 (sxhash (array-rank x)))))) ;; general, inefficient case of NUMBER ;; There's a spurious FIXNUMP test here, as we've already picked it off. diff --git a/src/compiler/sxhash.lisp b/src/compiler/sxhash.lisp index ea760e1ac4..6385cb2b47 100644 --- a/src/compiler/sxhash.lisp +++ b/src/compiler/sxhash.lisp @@ -12,13 +12,29 @@ (in-package "SB-C") -;;; Because we unobviously run transforms in the reverse order of definition, -;;; these must be the first transforms defined so that they become the last -;;; transforms attempted, with INTEGER taking precedence over NUMBER. +;;; CAUTION: transforms are selected in the *reverse* order of definition, +;;; so define the most general first, followed by more specific. ;;; I once tried to fix that glitch by using APPEND instead of PUSH into ;;; FUN-INFO-TRANSFORMS, and of course it broke things because we depend on such -;;; stupidity. It would be easily remedied by reversing all definitions whenever +;;; stupidity. It would be remedied by reversing all definitions whenever ;;; it matters but I didn't feel like figuring out all places where it does. + +(deftransform sxhash ((x) (t)) + (let ((type (lvar-type x))) + ;; It is common for structure slots to have a :TYPE resembling (OR STRING NULL), + ;; and also common to create custom hash calculations on structures with such slots. + ;; So it makes sense for the compiler to try to pick off cases where the slot type + ;; has a specialized hash computation via sxhash after picking off NIL. + (or (dolist (case '((simple-string . %sxhash-simple-string) + (string . %sxhash-string) + (simple-bit-vector . %sxhash-simple-bit-vector) + (bit-vector . %sxhash-bit-vector))) + (cond ((csubtypep type (specifier-type (car case))) + (return `(,(cdr case) x))) + ((csubtypep type (specifier-type `(or null ,(car case)))) + (return `(if x (,(cdr case) x) ,(sb-xc:sxhash nil)))))) + (give-up-ir1-transform)))) + (deftransform sxhash ((x) (number)) `(sb-impl::number-sxhash x)) (deftransform sxhash ((x) (integer)) `(sb-impl::integer-sxhash x)) @@ -149,38 +165,6 @@ (deftransform sxhash ((x) (double-float)) '#.+sxhash-double-float-expr+) -;;; SXHASH of SIMPLE-BIT-VECTOR values is defined as a DEFTRANSFORM -;;; because it is endian-dependent. -;;; ("because it is endian-dependent" is not a reason to define -;;; a transform. This is probably better off as an asm routine) -(deftransform sxhash ((x) (simple-bit-vector)) - `(let* ((length (length x)) - (result (word-mix 410823708 length))) - (declare (type unsigned-byte result)) - (multiple-value-bind (n-full-words n-bits-remaining) - (floor length sb-vm:n-word-bits) - (dotimes (i n-full-words) - (setq result (word-mix (%vector-raw-bits x i) result))) - (when (plusp n-bits-remaining) - ;; FIXME: Do we really have to mask off bits of the final word? - ;; I don't think so, given that remaining bits are invariantly zero. - (setq result - (word-mix (logand (ash (1- (ash 1 n-bits-remaining)) - ,(ecase sb-c:*backend-byte-order* - (:little-endian 0) - (:big-endian - '(- sb-vm:n-word-bits n-bits-remaining)))) - (%vector-raw-bits x n-full-words)) - result))) - (logand result sb-xc:most-positive-fixnum)))) - -;;; Some other common SXHASH cases are defined as DEFTRANSFORMs in -;;; order to avoid having to do TYPECASE at runtime. -(deftransform sxhash ((x) (string)) - (cond ((csubtypep (lvar-type x) (specifier-type 'simple-string)) - '(%sxhash-simple-string x)) - (t - '(%sxhash-string x)))) (deftransform sxhash ((x) (symbol)) (cond ((csubtypep (lvar-type x) (specifier-type 'keyword)) ;; All interned symbols have a precomputed hash. diff --git a/tests/hash.pure.lisp b/tests/hash.pure.lisp index 51caf5a447..ee9ea5f968 100644 --- a/tests/hash.pure.lisp +++ b/tests/hash.pure.lisp @@ -47,6 +47,58 @@ ;; GC could occur in here. Just check that 9 out of 10 trials succeed. (assert (>= win 9)))) +(with-test (:name (sxhash :bit-vector-sxhash-mask-to-length)) + (let ((bv (make-array 5 :element-type 'bit)) + (unsafely-set-bit + (compile nil + '(lambda (bv i val) + (declare (optimize (sb-c::insert-array-bounds-checks 0))) + (setf (bit bv i) val))))) + (replace bv '(1 0 1 1 1)) + (let ((hash (sxhash bv))) + ;; touch all bits of the first data word as well as the padding word + (loop for i from 5 below (* 2 sb-vm:n-word-bytes) + do (funcall unsafely-set-bit bv i 1) + (assert (eql (sxhash bv) hash)) + (funcall unsafely-set-bit bv i 0))))) + +(defvar *sbv* (make-array 512 :element-type 'bit)) +(defun sxhash-for-bv-test (test-bv) + (let ((underlying *sbv*) + (expected-hash (sxhash test-bv))) + ;; Currently %SXHASH-BIT-VECTOR can only operate on non-simple vectors + ;; if the displacement on bits aligns to a word boundary, + ;; or possibly on a byte boundary for some CPUs. + ;; Otherwise it just copies the non-simple vector as there's no point + ;; to exercising varying values of displaced-index-offet for that. + (loop for index-offset + from 0 by 8 repeat 25 + do (let ((unsimple-bv (make-array 300 + :element-type 'bit + :displaced-to underlying + :displaced-index-offset index-offset + :fill-pointer (length test-bv)))) + (flet ((check-unreplaced-bits (expect) + ;; make sure REPLACE didn't touch bits outside + ;; the expected range. This is a test of REPLACE + ;; more so than SXHASH, but is needed to establish + ;; that SXHASH of the nonsimple vector isn't + ;; looking at bits that it shouldn't. + (loop for i from 0 below index-offset + do (assert (= (bit underlying i) expect))) + (loop for i from (+ index-offset (length test-bv)) + below (length underlying) + do (assert (= (bit underlying i) expect))))) + (fill underlying 0) + (replace unsimple-bv test-bv) + (check-unreplaced-bits 0) + (assert (eql (sxhash unsimple-bv) expected-hash)) + (fill underlying 1) + (replace unsimple-bv test-bv) + (check-unreplaced-bits 1) + (assert (eql (sxhash unsimple-bv) expected-hash))))) + expected-hash)) + ;;; The value of SXHASH on bit-vectors of length a multiple of the word ;;; size didn't depend on the contents of the last word, specifically ;;; making it a constant for bit-vectors of length equal to the word @@ -63,11 +115,11 @@ (map-into v (lambda () (random 2))))) (randomize-v) - (let ((sxhash (sxhash v)) + (let ((sxhash (sxhash-for-bv-test v)) (random-bits-used 0)) (loop (randomize-v) - (when (/= (sxhash v) sxhash) + (when (/= (sxhash-for-bv-test v) sxhash) (return)) (incf random-bits-used length) (when (>= random-bits-used random-bits-to-use) @@ -91,13 +143,13 @@ repeat sb-vm:n-word-bits do (setf (aref v i) (random 2))))) (randomize-v) - (let ((sxhash (sxhash v))) + (let ((sxhash (sxhash-for-bv-test v))) (dotimes (i (ceiling random-bits-to-use sb-vm:n-word-bits) (error "SXHASH on bit-vectors of length ~a ~ does not depend on the final ~a bits." length sb-vm:n-word-bits)) (randomize-v) - (when (/= (sxhash v) sxhash) + (when (/= (sxhash-for-bv-test v) sxhash) (return))))))))) (with-test (:name :maphash-multiple-evaluation) @@ -308,3 +360,39 @@ (let ((table (make-hash-table :test #'equalp))) (assert (eql (setf (gethash 3d0 table) 1) (gethash 3 table))))) + +(with-test (:name :transform-sxhash-string-and-bv) + (let ((f (compile + nil + '(lambda (x y) + (logxor (ash (sxhash (truly-the (or string null) x)) -3) + (sxhash (truly-the (or bit-vector null) y)))))) + (fdefn1 (sb-kernel::find-fdefn 'sb-kernel:%sxhash-string)) + (fdefn2 (sb-kernel::find-fdefn 'sb-kernel:%sxhash-bit-vector))) + (every (lambda (x) (member x `(,fdefn1 ,fdefn2))) + (ctu:find-code-constants f)))) + +(with-test (:name :sxhash-on-displaced-string + :fails-on :sbcl) + (let* ((adjustable-string + (make-array 100 :element-type 'character :adjustable t)) + (displaced-string + (make-array 50 :element-type 'character :displaced-to adjustable-string + :displaced-index-offset 19))) + (adjust-array adjustable-string 68) + (assert-error (aref displaced-string 0)) ; should not work + ;; This should fail, but instead it computes the hash of a string of + ;; length 0 which is what we turn displaced-string into after adjustable-string + ;; is changed to be too small to hold displaced-string. + ;; As a possible fix, we could distinguish between safe and unsafe code, + ;; never do the sxhash transforms in safe code, and have the full call to + ;; sxhash always check for "obsolete" strings. + ;; I would guess that all sorts of string transforms are similarly + ;; suspect in this edge case. + ;; On the one hand, this is undefined behavior as per CLHS: + ;; "If A is displaced to B, the consequences are unspecified if B is adjusted + ;; in such a way that it no longer has enough elements to satisfy A." + ;; But on the other, we always try to be maximally helpful, + ;; and it's extremely dubious that we're totally silent here. + ;; Also the same issue exists with bit-vectors. + (assert-error (sxhash displaced-string)))) From ab976f48db4ba8d72fb7bc13388bc4fc6e97c0fd Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 9 Jun 2020 22:49:46 -0400 Subject: [PATCH 0099/4023] Improve storage of UCS4 chars in readtables * Combine the syntax attribute and macro function hashtables into one. * Change a couple more make-hash-table calls to use an EQ table. * Unless any Unicode macro character is defined in the current readtable, GETHASH of the syntax attributes becomes almost a no-op. * Alleviate some pressure on getting hash-tables and mutexes working early in cold-init, which facilitates testing other implementation strategies for both of those object types. --- src/code/cold-init.lisp | 3 +- src/code/reader.lisp | 244 ++++++++++++++++++++++----------------- src/code/readtable.lisp | 17 ++- tests/reader.impure.lisp | 2 +- tests/reader.pure.lisp | 2 +- 5 files changed, 147 insertions(+), 121 deletions(-) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index 2fdd0eacf5..de2ec9cec0 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -65,7 +65,7 @@ (/show0 "entering !COLD-INIT") (setf (symbol-function '%failed-aver) #'!cold-failed-aver) - (!cold-init-hash-table-methods) ; needed by MAKE-READTABLE + (!readtable-cold-init) (setq *readtable* (make-readtable) *print-length* 6 *print-level* 3) (setq *error-output* (!make-cold-stderr-stream) @@ -74,6 +74,7 @@ (/show "testing '/SHOW" *print-length* *print-level*) ; show anything (unless (!c-runtime-noinform-p) (write-string "COLD-INIT... ")) + (!cold-init-hash-table-methods) ;; Establish **initial-handler-clusters** (show-and-call sb-kernel::!target-error-cold-init) ;; And now *CURRENT-THREAD* and *HANDLER-CLUSTERS* diff --git a/src/code/reader.lisp b/src/code/reader.lisp index e41953f26b..6f1778ea11 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -20,6 +20,27 @@ (defvar *readtable*) +(defun gethash-return-default (key self default) + (declare (optimize (safety 0)) + (ignore key self)) + default) +(defun !readtable-cold-init () + (macrolet ((nwords () + (dd-length (find-defstruct-description 'hash-table))) + (initforms () + `(setf,@(mapcan (lambda (dsd) + (list `(%instance-ref table ,(dsd-index dsd)) + (case (dsd-name dsd) + (gethash-impl '#'gethash-return-default) + (lock nil) + (t (dsd-default dsd))))) + (dd-slots + (find-defstruct-description 'hash-table)))))) + (let ((table (%make-instance (nwords)))) + (setf (%instance-layout table) #.(find-layout 'hash-table)) + (initforms) + (setq *empty-extended-char-table* table)))) + (setf (documentation '*readtable* 'variable) "Variable bound to current readtable.") @@ -53,35 +74,39 @@ ;;;; macros and functions for character tables -(declaim (ftype (sfunction (character readtable) (unsigned-byte 8)) - get-cat-entry)) -(defun get-cat-entry (char rt) +;;; As efficiently as possible look up the character attributes of CHAR. +;;; If CAST is true then insert an assertion that CHARACTER is actually +;;; a character. This seems to be necessary to ensure that gray stream +;;; methods that should return characters don't return random objects. +(defmacro char-syntax (char syntax-array extension-table &optional cast) + `(truly-the (unsigned-byte 8) + (if (typep ,char 'base-char) + (elt ,syntax-array (char-code ,char)) + (car (truly-the list + (gethash ,(if cast `(the character ,char) char) + ,extension-table + ',`(,+char-attr-constituent+))))))) + +;;; Formerly known as SET-CAT-ENTRY and SET-CMT-ENTRY +(defun assign-char-syntax (readtable char attributes function) + (declare (readtable readtable) + (character char) + (type (unsigned-byte 8) attributes) + (type (or null function fdefn) function)) (if (typep char 'base-char) - (elt (character-attribute-array rt) (char-code char)) - (values (gethash char (character-attribute-hash-table rt) - +char-attr-constituent+)))) - -(defun set-cat-entry (char newvalue &optional (rt *readtable*)) - (declare (character char) (type (unsigned-byte 8) newvalue) (readtable rt)) - (if (typep char 'base-char) - (setf (elt (character-attribute-array rt) (char-code char)) newvalue) - (if (= newvalue +char-attr-constituent+) - ;; Default value for the C-A-HASH-TABLE is +CHAR-ATTR-CONSTITUENT+. - (remhash char (character-attribute-hash-table rt)) - (setf (gethash char (character-attribute-hash-table rt)) newvalue))) - (values)) - -;; Set the character-macro-table entry without coercing NEW-VALUE. -;; As used by set-syntax-from-char it must always process "raw" values. -(defun set-cmt-entry (char new-value &optional (rt *readtable*)) - (declare (character char) - (type (or null function fdefn) new-value) - (type readtable rt)) - (if (typep char 'base-char) - (setf (svref (character-macro-array rt) (char-code char)) new-value) - (if new-value ; never store NILs - (setf (gethash char (character-macro-hash-table rt)) new-value) - (remhash char (character-macro-hash-table rt))))) + (setf (aref (base-char-syntax-array readtable) (char-code char)) attributes + (aref (base-char-macro-array readtable) (char-code char)) function) + (let ((table (extended-char-table readtable))) + (cond ((or function (/= attributes +char-attr-constituent+)) + (when (eq table *empty-extended-char-table*) ; copy-on-write + (setf table (make-hash-table :test 'eq) + (extended-char-table readtable) table)) + (setf (gethash char table) (cons attributes function))) + (t + ;; If the table is *empty-extended-char-table* the item won't be + ;; found, so we're not actuallly altering the empty table. + (remhash char table))))) + nil) ;;; the value actually stored in the character macro table. As per ;;; ANSI #'GET-MACRO-CHARACTER and #'SET-MACRO-CHARACTER, this can @@ -90,17 +115,21 @@ (defun get-raw-cmt-entry (char readtable) (declare (character char) (readtable readtable)) (if (typep char 'base-char) - (svref (character-macro-array readtable) (char-code char)) - (values (gethash char (character-macro-hash-table readtable) nil)))) + (svref (base-char-macro-array readtable) (char-code char)) + ;; extended-char entry if present is a cons of the attributes and function + (cdr (truly-the list (gethash char (extended-char-table readtable)))))) ;; As above but get the entry for SUB-CHAR in a dispatching macro table. + +(defmacro charmacro-dtable-base-chars (dtable) + `(truly-the (simple-vector ,base-char-code-limit) (car ,dtable))) +(defmacro charmacro-dtable-extended-chars (dtable) + `(cdr ,dtable)) (defun get-raw-cmt-dispatch-entry (sub-char sub-table) (declare (character sub-char)) (if (typep sub-char 'base-char) - (svref (truly-the (simple-vector #.base-char-code-limit) - (cdr (truly-the cons sub-table))) - (char-code sub-char)) - (awhen (car sub-table) + (svref (charmacro-dtable-base-chars (truly-the cons sub-table)) (char-code sub-char)) + (awhen (charmacro-dtable-extended-chars sub-table) (gethash sub-char it)))) ;; Coerce THING to a character-macro-table entry @@ -125,8 +154,14 @@ ;;; The character attribute table is a BASE-CHAR-CODE-LIMIT vector ;;; of (unsigned-byte 8) plus a hashtable to handle higher character codes. -(defmacro test-attribute (char whichclass rt) - `(= (get-cat-entry ,char ,rt) ,whichclass)) +(defmacro test-attribute (char whichclass readtable &optional cast) + (let ((temp '#:readtable)) + `(let ((,temp ,readtable)) + (= (char-syntax ,char + (base-char-syntax-array ,temp) + (extended-char-table ,temp) + ,cast) + ,whichclass)))) ;;; predicates for testing character attributes @@ -146,7 +181,7 @@ (defun whitespace[1]p (char) (test-attribute char +char-attr-whitespace+ *standard-readtable*)) (defun whitespace[2]p (char &optional (rt *readtable*)) - (test-attribute char +char-attr-whitespace+ rt)) + (test-attribute char +char-attr-whitespace+ rt t)) (defun constituentp (char rt) (test-attribute char +char-attr-constituent+ rt)) @@ -162,7 +197,8 @@ (defun token-delimiterp (char &optional (rt *readtable*)) ;; depends on actual attribute numbering in readtable.lisp. - (<= (get-cat-entry char rt) +char-attr-terminating-macro+)) + (<= (char-syntax char (base-char-syntax-array rt) (extended-char-table rt)) + +char-attr-terminating-macro+)) ;;;; constituent traits (see ANSI 2.1.4.2) @@ -280,14 +316,16 @@ be interned (returned, respectively) as required. The default is :SYMBOLS." t)) (find-if-in-closure #'consp fun))) -;; If ENTRY is a dispatching macro, copy its dispatch table. -;; Otherwise return it without alteration. +;;; Copy a char-macro-table entry. +;;; If ENTRY is a dispatching macro, copy its dispatch table. +;;; Otherwise return it unchanged, be it NIL or a function or fdefn. (defun copy-cmt-entry (entry) (let ((dtable (%dispatch-macro-char-table entry))) (if dtable (%make-dispatch-macro-char - (cons (awhen (car dtable) (hash-table-replace (make-hash-table) it)) - (copy-seq (cdr dtable)))) + (cons (copy-seq (charmacro-dtable-base-chars dtable)) + (awhen (charmacro-dtable-extended-chars dtable) + (hash-table-replace (make-hash-table :test 'eq) it)))) entry))) (defun copy-readtable (&optional (from-readtable *readtable*) to-readtable) @@ -298,16 +336,24 @@ readtable when not provided." (assert-not-standard-readtable to-readtable 'copy-readtable) (let ((really-from-readtable (or from-readtable *standard-readtable*)) (really-to-readtable (or to-readtable (make-readtable)))) - (replace (character-attribute-array really-to-readtable) - (character-attribute-array really-from-readtable)) - (hash-table-replace (clrhash (character-attribute-hash-table really-to-readtable)) - (character-attribute-hash-table really-from-readtable)) - (map-into (character-macro-array really-to-readtable) + (replace (base-char-syntax-array really-to-readtable) + (base-char-syntax-array really-from-readtable)) + (map-into (base-char-macro-array really-to-readtable) #'copy-cmt-entry - (character-macro-array really-from-readtable)) - (hash-table-replace (clrhash (character-macro-hash-table really-to-readtable)) - (character-macro-hash-table really-from-readtable) - #'copy-cmt-entry) + (base-char-macro-array really-from-readtable)) + (setf (extended-char-table really-to-readtable) + (let ((source-ht (extended-char-table really-from-readtable))) + (if (eq source-ht *empty-extended-char-table*) + source-ht + (let ((copy (make-hash-table :test 'eq))) + (hash-table-replace + copy source-ht + (lambda (x) + (when x + ;; (syntax . macro) in which macro could be + ;; a function with a nested dispatch table. + (cons (car x) (copy-cmt-entry (cdr x)))))) + copy)))) (setf (readtable-case really-to-readtable) (readtable-case really-from-readtable)) (setf (%readtable-string-preference really-to-readtable) @@ -326,10 +372,11 @@ standard Lisp readtable when NIL." ;; TO-READTABLE is a readtable, not a readtable-designator (assert-not-standard-readtable to-readtable 'set-syntax-from-char) (let* ((really-from-readtable (or from-readtable *standard-readtable*)) - (att (get-cat-entry from-char really-from-readtable)) + (att (char-syntax from-char + (base-char-syntax-array really-from-readtable) + (extended-char-table really-from-readtable))) (mac (get-raw-cmt-entry from-char really-from-readtable))) - (set-cat-entry to-char att to-readtable) - (set-cmt-entry to-char (copy-cmt-entry mac) to-readtable)) + (assign-char-syntax to-readtable to-char att (copy-cmt-entry mac))) t) (defun set-macro-character (char function &optional @@ -340,11 +387,11 @@ standard Lisp readtable when NIL." character non-terminating, i.e. embeddable in a symbol name." (let ((designated-readtable (or rt-designator *standard-readtable*))) (assert-not-standard-readtable designated-readtable 'set-macro-character) - (set-cat-entry char (if non-terminatingp - +char-attr-constituent+ - +char-attr-terminating-macro+) - designated-readtable) - (set-cmt-entry char (coerce-to-cmt-entry function) designated-readtable) + (assign-char-syntax + designated-readtable + char + (if non-terminatingp +char-attr-constituent+ +char-attr-terminating-macro+) + (coerce-to-cmt-entry function)) t)) ; (ANSI-specified return value) (defun get-macro-character (char &optional (rt-designator *readtable*)) @@ -385,13 +432,12 @@ standard Lisp readtable when NIL." ;; by catching the error, so I removed it. ;; RT is a readtable, not a readtable-designator, as per CLHS. (unless (get-dispatch-macro-char-table char rt nil) - ;; The dtable is a cons whose whose CAR is initially NIL but upgraded - ;; to a hashtable if required, and whose CDR is a vector indexed by - ;; char-code up to the maximum base-char. - (let ((dtable (cons nil (make-array base-char-code-limit - :initial-element nil)))) - (set-macro-character char (%make-dispatch-macro-char dtable) - non-terminating-p rt))) + ;; Dispatch table is a cons whose whose CAR is a vector indexed by base char code + ;; and CDR is initially NIL, changed to a hashtable if there are extended chars. + (set-macro-character char + (%make-dispatch-macro-char + (list (make-array base-char-code-limit :initial-element nil))) + non-terminating-p rt)) t) (defun set-dispatch-macro-character (disp-char sub-char function @@ -410,12 +456,12 @@ standard Lisp readtable when NIL." ;; (SET-MACRO-CHARACTER #\$ (GET-MACRO-CHARACTER #\#)) will share ;; the dispatch table. Perhaps it should be copy-on-write? (if (typep sub-char 'base-char) - (setf (svref (cdr dtable) (char-code sub-char)) function) - (let ((hashtable (car dtable))) + (setf (svref (charmacro-dtable-base-chars dtable) (char-code sub-char)) function) + (let ((hashtable (charmacro-dtable-extended-chars dtable))) (cond (function ; allocate the hashtable if it wasn't made yet (setf (gethash sub-char - (or hashtable (setf (car dtable) - (make-hash-table)))) + (or hashtable (setf (charmacro-dtable-extended-chars dtable) + (make-hash-table :test 'eq)))) function)) (hashtable ; remove an existing entry (remhash sub-char hashtable))))))) @@ -440,14 +486,10 @@ standard Lisp readtable when NIL." ;; non-white one). It always gets an error on end-of-file. (let* ((stream (in-stream-from-designator stream)) (rt *readtable*) - (attribute-array (character-attribute-array rt)) - (attribute-hash-table (character-attribute-hash-table rt))) + (base (base-char-syntax-array rt)) + (extended (extended-char-table rt))) (macrolet ((done-p () - '(not (eql (if (typep char 'base-char) - (aref attribute-array (char-code char)) - (gethash char attribute-hash-table - +char-attr-constituent+)) - +char-attr-whitespace+)))) + '(neq (char-syntax char base extended) +char-attr-whitespace+))) (if (ansi-stream-p stream) (prepare-for-fast-read-char stream (loop (let ((char (fast-read-char t))) @@ -472,19 +514,16 @@ standard Lisp readtable when NIL." ;; override the boring defaults on characters which need more ;; interesting behavior. (flet ((whitespaceify (char) - (set-cmt-entry char nil) - (set-cat-entry char +char-attr-whitespace+))) + (assign-char-syntax *readtable* char +char-attr-whitespace+ nil))) (whitespaceify (code-char tab-char-code)) (whitespaceify #\Newline) (whitespaceify #\Space) (whitespaceify (code-char form-feed-char-code)) (whitespaceify (code-char return-char-code))) - (set-cat-entry #\\ +char-attr-single-escape+) - (set-cmt-entry #\\ nil) + (assign-char-syntax *readtable* #\\ +char-attr-single-escape+ nil) - (set-cat-entry #\| +char-attr-multiple-escape+) - (set-cmt-entry #\| nil) + (assign-char-syntax *readtable* #\| +char-attr-multiple-escape+ nil) ;; Easy macro-character definitions are in this source file. (set-macro-character #\" #'read-string) @@ -496,15 +535,6 @@ standard Lisp readtable when NIL." (set-macro-character #\; #'read-comment) ;; (The hairier macro-character definitions, for #\# and #\`, are ;; defined elsewhere, in their own source files.) - - ;; all constituents - (do ((ichar 0 (1+ ichar)) - (char)) - ((= ichar base-char-code-limit)) - (setq char (code-char ichar)) - (when (constituentp char *readtable*) - (set-cmt-entry char nil))) - (/show0 "leaving !cold-init-standard-readtable")) ;;;; implementation of the read buffer @@ -1025,12 +1055,8 @@ standard Lisp readtable when NIL." ;;; Return the character class for CHAR. ;;; -;;; FIXME: why aren't these ATT-getting forms using GET-CAT-ENTRY? -;;; Because we've cached the readtable tables? (defmacro char-class (char attarray atthash) - `(let ((att (if (typep (truly-the character ,char) 'base-char) - (aref ,attarray (char-code ,char)) - (gethash ,char ,atthash +char-attr-constituent+)))) + `(let ((att (char-syntax ,char ,attarray ,atthash))) (declare (fixnum att)) (cond ((<= att +char-attr-terminating-macro+) +char-attr-delimiter+) @@ -1043,9 +1069,7 @@ standard Lisp readtable when NIL." ;;; Return the character class for CHAR, which might be part of a ;;; rational number. (defmacro char-class2 (char attarray atthash read-base) - `(let ((att (if (typep (truly-the character ,char) 'base-char) - (aref ,attarray (char-code ,char)) - (gethash ,char ,atthash +char-attr-constituent+)))) + `(let ((att (char-syntax ,char ,attarray ,atthash))) (declare (fixnum att)) (cond ((<= att +char-attr-terminating-macro+) +char-attr-delimiter+) @@ -1062,9 +1086,7 @@ standard Lisp readtable when NIL." ;;; rational or floating number. (Assume that it is a digit if it ;;; could be.) (defmacro char-class3 (char attarray atthash read-base) - `(let ((att (if (typep (truly-the character ,char) 'base-char) - (aref ,attarray (char-code ,char)) - (gethash ,char ,atthash +char-attr-constituent+)))) + `(let ((att (char-syntax ,char ,attarray ,atthash))) (declare (fixnum att)) (cond ((<= att +char-attr-terminating-macro+) +char-attr-delimiter+) @@ -1223,8 +1245,8 @@ extended :: syntax." (return-from read-token nil)) (let* ((rt *readtable*) (base *read-base*) - (attribute-array (character-attribute-array rt)) - (attribute-hash-table (character-attribute-hash-table rt)) + (attribute-array (base-char-syntax-array rt)) + (attribute-hash-table (extended-char-table rt)) (buf *read-buffer*) (package-designator nil) (colons 0) @@ -1937,8 +1959,9 @@ extended :: syntax." (let (alist) (flet ((process (char fn &aux (dtable (%dispatch-macro-char-table fn))) (when dtable - (let ((output (awhen (car dtable) (%hash-table-alist it)))) - (loop for fn across (the simple-vector (cdr dtable)) + (let ((output (awhen (charmacro-dtable-extended-chars dtable) + (%hash-table-alist it)))) + (loop for fn across (the simple-vector (charmacro-dtable-base-chars dtable)) and ch from 0 when fn do (push (cons (code-char ch) fn) output)) (dolist (cell output) ; coerce values to function-designator @@ -1946,9 +1969,12 @@ extended :: syntax." (when hash-table-p ; caller wants hash-tables (setq output (%stuff-hash-table (make-hash-table) output))) (push (cons char output) alist))))) - (loop for fn across (character-macro-array readtable) and ch from 0 + (loop for fn across (base-char-macro-array readtable) and ch from 0 do (process (code-char ch) fn)) - (maphash #'process (character-macro-hash-table readtable))) + (unless (eq (extended-char-table readtable) *empty-extended-char-table*) + ;; very unsafe to maphash over the empty table - it's a stub object + (maphash (lambda (char val) (process char (cdr val))) + (extended-char-table readtable)))) alist)) ;; Stub - should never get called with anything but NIL diff --git a/src/code/readtable.lisp b/src/code/readtable.lisp index 9ab09c50ae..726c92d549 100644 --- a/src/code/readtable.lisp +++ b/src/code/readtable.lisp @@ -45,6 +45,8 @@ ;; Meta: there is no such function as READ-UNQUALIFIED-TOKEN. No biggie. (defconstant +char-attr-delimiter+ 14) ; (a fake for READ-UNQUALIFIED-TOKEN) +(define-load-time-global *empty-extended-char-table* nil) + (sb-xc:defstruct (readtable (:conc-name nil) (:constructor make-readtable ()) (:predicate readtablep) @@ -54,7 +56,7 @@ (:copier nil)) "A READTABLE is a data structure that maps characters into syntax types for the Common Lisp expression reader." - ;; The CHARACTER-ATTRIBUTE-TABLE is a vector of BASE-CHAR-CODE-LIMIT + ;; The BASE-CHAR-SYNTAX-ARRAY is a vector of BASE-CHAR-CODE-LIMIT ;; integers for describing the character type. Conceptually, there ;; are 4 distinct "primary" character attributes: ;; +CHAR-ATTR-WHITESPACE+, +CHAR-ATTR-TERMINATING-MACRO+, @@ -65,27 +67,24 @@ types for the Common Lisp expression reader." ;; In order to make READ-TOKEN fast, all this information is stored ;; in the character attribute table by having different varieties of ;; constituents. - (character-attribute-array + (base-char-syntax-array (make-array base-char-code-limit :element-type '(unsigned-byte 8) :initial-element +char-attr-constituent+) :type attribute-table :read-only t) - (character-attribute-hash-table (make-hash-table :test 'eq) - :type hash-table - :read-only t) - ;; The CHARACTER-MACRO-TABLE is a vector of BASE-CHAR-CODE-LIMIT + ;; The BASE-CHAR-MACRO-TABLE is a vector of BASE-CHAR-CODE-LIMIT ;; functions. One of these functions called with appropriate ;; arguments whenever any non-WHITESPACE character is encountered ;; inside READ-PRESERVING-WHITESPACE. These functions are used to ;; implement user-defined read-macros, system read-macros, and the ;; number-symbol reader. - (character-macro-array + (base-char-macro-array (make-array base-char-code-limit :initial-element nil) :type (simple-vector #.base-char-code-limit) :read-only t) - (character-macro-hash-table (make-hash-table :test 'eq) :type hash-table - :read-only t) + ;; Characters above the BASE-CHAR range + (extended-char-table *empty-extended-char-table* :type hash-table) (%readtable-case 0 :type (mod 4)) ;; Element type to use when reading a string literal with no extended-chars. ;; The system itself prefers base-string, but otherwise it is a contentious diff --git a/tests/reader.impure.lisp b/tests/reader.impure.lisp index cfcd89d5d8..dcc3fa2b70 100644 --- a/tests/reader.impure.lisp +++ b/tests/reader.impure.lisp @@ -254,7 +254,7 @@ (assert (eq x :infinity)) (set-dispatch-macro-character (code-char #x266F) (code-char #x221E) nil) (assert (zerop (hash-table-count - (car (sb-impl::%dispatch-macro-char-table + (cdr (sb-impl::%dispatch-macro-char-table (get-macro-character (code-char #x266F))))))))) (let ((*readtable* (copy-readtable))) diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index bbaec201ea..0975cf1f2a 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -211,7 +211,7 @@ :skipped-on (not :sb-unicode)) (let ((rt (copy-readtable))) (set-macro-character (code-char #x100fa) #'error nil rt) - (assert (plusp (hash-table-count (sb-impl::character-macro-hash-table rt)))) + (assert (plusp (hash-table-count (sb-impl::extended-char-table rt)))) (copy-readtable nil rt) (assert (null (get-macro-character #\UFC rt))))) From 73be88bd5d8f18014a68033736f0274b4d5b9d16 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 10 Jun 2020 13:59:21 +0300 Subject: [PATCH 0100/4023] Restore #-sb-unicode --- src/code/reader.lisp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 6f1778ea11..7c47608536 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -79,13 +79,19 @@ ;;; a character. This seems to be necessary to ensure that gray stream ;;; methods that should return characters don't return random objects. (defmacro char-syntax (char syntax-array extension-table &optional cast) - `(truly-the (unsigned-byte 8) - (if (typep ,char 'base-char) - (elt ,syntax-array (char-code ,char)) - (car (truly-the list - (gethash ,(if cast `(the character ,char) char) - ,extension-table - ',`(,+char-attr-constituent+))))))) + #-sb-unicode (declare (ignore cast)) + `(progn + #-sb-unicode ,extension-table + (truly-the (unsigned-byte 8) + #-sb-unicode + (elt ,syntax-array (char-code ,char)) + #+sb-unicode + (if (typep ,char 'base-char) + (elt ,syntax-array (char-code ,char)) + (car (truly-the list + (gethash ,(if cast `(the character ,char) char) + ,extension-table + ',`(,+char-attr-constituent+)))))))) ;;; Formerly known as SET-CAT-ENTRY and SET-CMT-ENTRY (defun assign-char-syntax (readtable char attributes function) From fcee8b3d905ce2d5f0fa183e397d272530ae2a86 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 10 Jun 2020 12:27:11 -0400 Subject: [PATCH 0101/4023] Simplify ENSURE-GETHASH * Do not allow absence of value. * Remove flawed atomic option. The bug in atomicity was less about semantics (the double-check idiom is mostly fine) and more about a limitation of SBCL's GETHASH: we have an explicit non-guarantee that GETASH won't crash if any table mutator exists. Consider: thread 1 does gethash, misses, acquires lock, gethash, misses, starts its puthash; meanwhile in thread 2: start gethash -> crash, period end of story. So this macro discouraged clear thinking about lock scope. Additionally, it hid a use of a recursive lock which is bad design, and usually avoidable. https://mjtsai.com/blog/2012/03/12/recursive-mutexes-considered-harmful/ --- src/code/primordial-extensions.lisp | 23 +++++++---------------- src/code/target-extensions.lisp | 2 ++ src/pcl/std-class.lisp | 9 ++++++++- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/code/primordial-extensions.lisp b/src/code/primordial-extensions.lisp index 0a27ba859d..75041eb309 100644 --- a/src/code/primordial-extensions.lisp +++ b/src/code/primordial-extensions.lisp @@ -274,23 +274,14 @@ ;;; Otherwise, evaluate DEFAULT, store the resulting value in ;;; HASH-TABLE and return two values: 1) the result of evaluating ;;; DEFAULT 2) NIL. -;;; If ATOMICP is true, perform the lookup and potential update -;;; atomically. -(defmacro ensure-gethash (key hash-table &optional default atomicp) - (check-type atomicp boolean) +(defmacro ensure-gethash (key hash-table default) (with-unique-names (n-key n-hash-table value foundp) - (flet ((probe-and-update (&optional update) - `(multiple-value-bind (,value ,foundp) (gethash ,n-key ,n-hash-table) - (if ,foundp - (values ,value t) - ,(or update - `(values (setf (gethash ,n-key ,n-hash-table) ,default) nil)))))) - `(let ((,n-key ,key) - (,n-hash-table ,hash-table)) - ,(if atomicp - (probe-and-update `(with-locked-system-table (,n-hash-table) - ,(probe-and-update))) - (probe-and-update)))))) + `(let ((,n-key ,key) + (,n-hash-table ,hash-table)) + (multiple-value-bind (,value ,foundp) (gethash ,n-key ,n-hash-table) + (if ,foundp + (values ,value t) + (values (setf (gethash ,n-key ,n-hash-table) ,default) nil)))))) (defvar *!removable-symbols* nil) (push '("SB-INT" check-designator) *!removable-symbols*) diff --git a/src/code/target-extensions.lisp b/src/code/target-extensions.lisp index a6d022249a..ac1d23aa58 100644 --- a/src/code/target-extensions.lisp +++ b/src/code/target-extensions.lisp @@ -184,6 +184,8 @@ unspecified." `(sb-thread:with-recursive-lock ((hash-table-lock ,hash-table)) ,@body)) +;;; This macro is horrible (because WITH-RECURSIVE-SYSTEM-LOCK is). +;;; So PLEASE don't use it, if at all possible. (defmacro with-locked-system-table ((hash-table) &body body) `(sb-thread::with-recursive-system-lock ((hash-table-lock ,hash-table)) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index a32e1d165d..ccd50344d5 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -300,7 +300,14 @@ (let ((table (specializer-method-table self)) (object (specializer-object self))) (if create - (ensure-gethash object table (cons nil nil) t) + (sb-thread::with-system-mutex ((sb-impl::hash-table-lock table)) + (ensure-gethash object table (cons nil nil))) + ;; FIXME: in the CREATE case we're locking, because we might be inserting, + ;; and must ensure mutual exclusion with other writers. Fine, + ;; but SBCL's hash-tables aren't *reader* *safe* with any writer, so + ;; how can we know that this branch is safe? Honestly I have no idea. + ;; I believe that the lock should scope be widened, + ;; surrounding either branch of the IF. (gethash object table)))) (defun map-specializers (function) From efbd8a699d285dbad5dc7868029efc0b53e59acf Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 10 Jun 2020 19:11:58 -0400 Subject: [PATCH 0102/4023] Repair cheneygc support Broken since a00cbdff95 as it turns out. --- src/code/string-hash.lisp | 16 +++++++++++++--- src/compiler/ltv.lisp | 4 ++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/code/string-hash.lisp b/src/code/string-hash.lisp index b3c987ea1e..4e56c901a8 100644 --- a/src/code/string-hash.lisp +++ b/src/code/string-hash.lisp @@ -185,8 +185,7 @@ ;;; an extra right-shift to remove bits that lack any randomness. CACHE-MASK can be ;;; reworked to examine bits other than at the low end. (defun hash-layout-name (name) - (let ((limit (1+ (ash sb-xc:most-positive-fixnum -1))) - (random-state (load-time-value (make-random-state)))) + (let ((limit (1+ (ash sb-xc:most-positive-fixnum -1)))) (declare (notinline random)) (logior (if (typep name '(and symbol (not null))) (flet ((improve-hash (x) @@ -203,5 +202,16 @@ (cond #+sb-xc ((eq package *cl-package*) "COMMON-LISP") ((not package) "uninterned") (t (package-name package))))))) - (random (ash limit -1) random-state)) + ;; This L-T-V form has to remain out of the common path, + ;; or else cheneygc will crash in cold-init. + ;; Cold-init calls HASH-LAYOUT-NAME many times *before* the L-T-V + ;; is actually executed and stuffed in as a constant. + ;; That's harmless - the loader put an unbound marker there, and we don't care. + ;; *HOWEVER* there is an interesting issue that arises if the value-cell + ;; indirection is present (see the IR1 translator for L-T-V and the + ;; conditional code for cheneygc): when can the compiler dereference the + ;; value-cell? If the binding were earlier (before the IF), then the dereference + ;; would happen earlier, and crash, because unbound-marker isn't a pointer. + (let ((random-state (load-time-value (make-random-state)))) + (random (ash limit -1) random-state))) limit))) diff --git a/src/compiler/ltv.lisp b/src/compiler/ltv.lisp index 64f4f4be91..250d32fa4c 100644 --- a/src/compiler/ltv.lisp +++ b/src/compiler/ltv.lisp @@ -89,6 +89,10 @@ guaranteed to never be modified, so it can be put in read-only storage." ;; KLUDGE: purify on cheneygc moves everything in code ;; constants into read-only space, value-cell breaks the ;; chain. + ;; Technically, if FORM returns an INSTANCE which does not have + ;; ":PURE T" in its defstruct, then it will not be put in readonly + ;; space, so we _could_ avoid the indirection cell. But it's not + ;; worth trying to optimize that out for benefit of a crappy GC. (cond #-gencgc ((not read-only-p) `(make-value-cell ,form)) From a2aa5eceb5d46fd3cc088d74905c14b9078b5817 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 10 Jun 2020 19:38:33 -0400 Subject: [PATCH 0103/4023] Mostly remove the compiled-debug-fun hash-table from SB-DI We can poke values into our own objects, so a side table is overkill. Just store the debug fun back into the object to which it pertains. On cheneygc, do what we always did because code may be immutable. Also, delete all the memoized debugger debug funs when saving a core. Incidentally the comment about unbounded table growth was wrong. It was made a weak table 11 years ago in rev 9abfd1a2b2. --- src/code/debug-int.lisp | 53 ++++++++++++++++++++++--------- src/code/save.lisp | 7 +++- src/code/simple-fun.lisp | 9 ++++++ src/code/stubs.lisp | 1 - src/code/target-load.lisp | 4 +-- src/compiler/generic/objdef.lisp | 8 ++++- src/compiler/target-disassem.lisp | 6 ++-- src/compiler/x86-64/cell.lisp | 2 +- src/runtime/backtrace.c | 11 ++++--- src/runtime/immobile-space.c | 2 ++ tools-for-build/editcore.lisp | 5 ++- 11 files changed, 79 insertions(+), 29 deletions(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 67b0a2b6fb..717dbeff69 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -338,24 +338,15 @@ (compiled-frame-escaped obj)))) +(define-load-time-global *debug-funs-mutex* (sb-thread:make-mutex :name "CDF lock")) ;;; This maps SB-C::COMPILED-DEBUG-FUNs to ;;; COMPILED-DEBUG-FUNs, so we can get at cached stuff and not ;;; duplicate COMPILED-DEBUG-FUN structures. +#+cheneygc ; can't write to debuf-info in a purified code object (define-load-time-global *compiled-debug-funs* + ;; The table's lock is redundant - I'm working on removal of the default + ;; assumption of synchronization on all weak tables, but it's unrelated. (make-hash-table :test 'eq :weakness :key)) - -;;; Make a COMPILED-DEBUG-FUN for a SB-C::COMPILER-DEBUG-FUN and its -;;; component. This maps the latter to the former in -;;; *COMPILED-DEBUG-FUNS*. If there already is a COMPILED-DEBUG-FUN, -;;; then this returns it from *COMPILED-DEBUG-FUNS*. -;;; -;;; FIXME: It seems this table can potentially grow without bounds, -;;; and retains roots to functions that might otherwise be collected. -(defun make-compiled-debug-fun (compiler-debug-fun component) - (let ((table *compiled-debug-funs*)) - (with-locked-system-table (table) - (ensure-gethash compiler-debug-fun table - (%make-compiled-debug-fun compiler-debug-fun component))))) ;;;; breakpoints @@ -448,6 +439,36 @@ ;; the :FUN-START breakpoint (if any) used to facilitate ;; function end breakpoints (end-starter nil :type (or null breakpoint))) + +;;; Map a SB-C::COMPILED-DEBUG-FUN to a SB-DI::COMPILED-DEBUG-FUN. +;;; The mapping is memoized into %CODE-DEBUG-INFO of COMPONENT +;;; except on #+cheneygc where that is assumed not to be possible +;;; (even if it is possible), because usually it's not, because +;;; code might reside in readonly space, and it can only have pointers +;;; to static space, not dynamic space. +;;; +;;; BTW, the nomenclature here is utter and total confusion. +;;; The type of the object in the argument named COMPILER-DEBUG-FUN +;;; is SB-C::COMPILED-DEBUG-FUN. +;;; There is no such type as a "COMPILER-DEBUG-FUN", it's just the name +;;; of the slot in the SB-DI:: version of the structure. +(defun make-compiled-debug-fun (compiler-debug-fun component) + (declare (code-component component)) + ;; Technically this could all be lockfree if we had compare-and-swap + ;; on the debug-info slot. Not worth the effort. + (sb-thread::with-system-mutex (*debug-funs-mutex*) + #+gencgc + (let* ((info (ensure-list (sb-vm::%%code-debug-info component))) + (found (assoc compiler-debug-fun (cdr info) :test #'eq))) + (if found + (cdr found) + (let* ((my-debug-fun (%make-compiled-debug-fun compiler-debug-fun component)) + (new-pair (cons compiler-debug-fun my-debug-fun))) + (setf (%code-debug-info component) (list* (car info) new-pair (cdr info))) + my-debug-fun))) + #+cheneygc + (ensure-gethash compiler-debug-fun *compiled-debug-funs* + (%make-compiled-debug-fun compiler-debug-fun component)))) ;;;; CODE-LOCATIONs @@ -1201,8 +1222,8 @@ register." (etypecase info (sb-c::compiled-debug-info (make-compiled-debug-fun (compiled-debug-fun-from-pc info pc escaped) component)) - (cons ; interrupted in an assembler routine - (let ((routine (dohash ((name pc-range) (car info)) + (hash-table ; interrupted in an assembler routine + (let ((routine (dohash ((name pc-range) info) (when (<= (car pc-range) pc (cadr pc-range)) (return name))))) (make-bogus-debug-fun (cond ((not routine) @@ -1437,6 +1458,8 @@ register." (%code-debug-info component)) then next for next = (sb-c::compiled-debug-fun-next fmap-entry) + ;; Is NAME really the right thing to match on given how bogus + ;; it might be? I would think PC range is better. when (and (eq (sb-c::compiled-debug-fun-name fmap-entry) name) (eq (sb-c::compiled-debug-fun-kind fmap-entry) nil)) return fmap-entry diff --git a/src/code/save.lisp b/src/code/save.lisp index b517b0f6ff..936a36113e 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -474,6 +474,7 @@ sufficiently motivated to do lengthy fixes." sb-c:: (defun coalesce-debug-info () + #+cheneygc (clrhash sb-di::*compiled-debug-funs*) (flet ((debug-source= (a b) (and (equal (debug-source-plist a) (debug-source-plist b)) (eql (debug-source-created a) (debug-source-created b))))) @@ -491,6 +492,10 @@ sb-c:: (declare (ignore size)) (case widetag (#.sb-vm:code-header-widetag + (let ((di (sb-vm::%%code-debug-info obj))) + ;; Discard memoized debugger's debug info + (when (and (consp di) (neq obj sb-fasl:*assembler-routines*)) + (setf (%code-debug-info obj) (car di)))) (dotimes (i (sb-kernel:code-n-entries obj)) (let* ((fun (sb-kernel:%code-entry-point obj i)) (arglist (%simple-fun-arglist fun)) @@ -509,7 +514,7 @@ sb-c:: (compiled-debug-info (let ((source (compiled-debug-info-source obj))) (typecase source - (core-debug-source) ; skip + (core-debug-source) ; skip - uh, why? (debug-source (let* ((namestring (debug-source-namestring source)) (canonical-repr diff --git a/src/code/simple-fun.lisp b/src/code/simple-fun.lisp index 7234950bfc..65fcf2b796 100644 --- a/src/code/simple-fun.lisp +++ b/src/code/simple-fun.lisp @@ -374,6 +374,15 @@ ;;;; CODE-COMPONENT +(defun %code-debug-info (code-obj) + ;; Extract the unadulterated debug-info emitted by the compiler. The slot + ;; value might be a cons of that and info stuffed in by the debugger. + (let ((info (sb-vm::%%code-debug-info code-obj))) + (if (and (listp info) (%instancep (car info))) + (car info) + ;; return it unchanged in all other cases + info))) + (defun %code-entry-points (code-obj) ; DO NOT USE IN NEW CODE (%code-entry-point code-obj 0)) diff --git a/src/code/stubs.lisp b/src/code/stubs.lisp index 7e48d50fd2..54c9159634 100644 --- a/src/code/stubs.lisp +++ b/src/code/stubs.lisp @@ -81,7 +81,6 @@ (def value-cell-ref) (def %caller-frame ()) (def %caller-pc ()) - (def %code-debug-info) #+(or x86 x86-64) (def sb-vm::%code-fixups) #+x86-64 (def pointerp) diff --git a/src/code/target-load.lisp b/src/code/target-load.lisp index 90e042a6f5..8648fba1da 100644 --- a/src/code/target-load.lisp +++ b/src/code/target-load.lisp @@ -291,7 +291,7 @@ (declaim (code-component *assembler-routines*)) (defun calc-asm-routine-bounds () - (loop for v being each hash-value of (car (%code-debug-info *assembler-routines*)) + (loop for v being each hash-value of (%code-debug-info *assembler-routines*) minimize (car v) into min maximize (cadr v) into max ;; min/max are inclusive byte ranges, but return the answer @@ -302,7 +302,7 @@ (defvar *!initial-assembler-routines*) (defun get-asm-routine (name &optional indirect &aux (code *assembler-routines*)) - (awhen (the list (gethash (the symbol name) (car (%code-debug-info code)))) + (awhen (the list (gethash (the symbol name) (%code-debug-info code))) (sap-int (sap+ (code-instructions code) (if indirect ;; Return the address containing the routine address diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index f86c6478d2..030f575cdd 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -197,9 +197,15 @@ during backtrace. (boxed-size :type fixnum ; see above figure :ref-known (flushable movable) :ref-trans %code-boxed-size) + ;; This slot usually holds an instance of SB-C::COMPILED-DEBUG-FUN + ;; but the debugger can replace it with a cons of that and something else. + ;; It could also be the symbol :BPT-LRA, or, as a special case + ;; for the assembler code component, a cons holding a hash-table. + ;; (the cons points from read-only to static space, but the hash-table + ;; wants to be in dynamic space) (debug-info :type t :ref-known (flushable) - :ref-trans %code-debug-info + :ref-trans %%code-debug-info :set-known () :set-trans (setf %code-debug-info)) ;; Define this slot if the architecture might ever use fixups. diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index 1febcfb92f..7e930121b5 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -2144,7 +2144,7 @@ (segments (if (eq code-component sb-fasl:*assembler-routines*) (collect ((segs)) - (dohash ((name locs) (car (%code-debug-info code-component))) + (dohash ((name locs) (%code-debug-info code-component)) (destructuring-bind (start end . index) locs (declare (ignore index)) (let ((seg (make-code-segment @@ -2264,7 +2264,7 @@ (setf (gethash (funcall addr-xform address) addr->name) name)) name->addr))) (let ((code sb-fasl:*assembler-routines*)) - (invert (car (%code-debug-info code)) + (invert (%code-debug-info code) (lambda (x) (sap-int (sap+ (code-instructions code) (car x)))))) #-linkage-table (invert *static-foreign-symbols* #'identity)) @@ -2284,7 +2284,7 @@ (values found 0)) (t (let* ((code sb-fasl:*assembler-routines*) - (hashtable (car (%code-debug-info code))) + (hashtable (%code-debug-info code)) (start (sap-int (code-instructions code))) (end (+ start (1- (%code-text-size code))))) (when (<= start address end) ; it has to be an asm routine diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 86a90c7740..be1e4c4cd5 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -764,7 +764,7 @@ (define-full-reffer code-header-ref * 0 other-pointer-lowtag (any-reg descriptor-reg) * code-header-ref) -;; CODE-HEADER-SET of a constant index is never used, so we specifically +;; CODE-HEADER-SET of a constant index is seldom used, so we specifically ;; ask not to get it defined. (It's not impossible to use, it's just not ;; helpful to have - either you want to access CODE-FIXUPS or CODE-DEBUG-INFO, ;; which do things their own way, or you want a variable index.) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 677c46c541..cfc66c6d0a 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -64,14 +64,16 @@ static int decode_locs(lispobj packed_integer, int *offset, int *elsewhere) struct compiled_debug_fun * debug_function_from_pc (struct code* code, void *pc) { - sword_t offset = (char*)pc - code_text_start(code); struct compiled_debug_info *di; - if (!instancep(code->debug_info)) + fprintf(stderr, "MEATBALL %p %p\n", code, pc); + if (instancep(code->debug_info)) + di = (void*)native_pointer(code->debug_info); + else if (listp(code->debug_info) && instancep(CONS(code->debug_info)->car)) + di = (void*)native_pointer(CONS(code->debug_info)->car); + else return NULL; - di = (struct compiled_debug_info *) native_pointer(code->debug_info); - if (!instancep(di->fun_map)) return NULL; @@ -79,6 +81,7 @@ debug_function_from_pc (struct code* code, void *pc) int begin, end, elsewhere_begin, elsewhere_end; if (!decode_locs(df->encoded_locs, &begin, &elsewhere_begin)) return NULL; + sword_t offset = (char*)pc - code_text_start(code); while (df) { struct compiled_debug_fun *next; if (df->next != NIL) { diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 7a1821b7e3..5823525e26 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1862,6 +1862,8 @@ static boolean executable_object_p(lispobj* obj) int widetag = widetag_of(obj); int answer = widetag == FDEFN_WIDETAG || (widetag == CODE_HEADER_WIDETAG && code_header_words((struct code*)obj) >= 3 + /* The debug_info slot of a "simplifying trampoline" contains a pointer + * to the original closure or funcallable instance */ && lowtag_of(((struct code*)obj)->debug_info) == FUN_POINTER_LOWTAG) || widetag == FUNCALLABLE_INSTANCE_WIDETAG; #if !WRITABLE_TEXT_SEGMENT diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index ed285a002d..adfc0f7d70 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1012,7 +1012,10 @@ (end (car (translate (cdr val) spaces)))) (list* (translate (symbol-name name) spaces) start end)) (target-hash-table-alist - (car (translate (%code-debug-info code-component) spaces)) + ;; Can't use %CODE-DEBUG-INFO on a foreign core because + ;; it would dereference the cons not at its current physically mapped + ;; address, but at its logical address. %%CODE-DEBUG-INFO is ok though. + (car (translate (sb-vm::%%code-debug-info code-component) spaces)) spaces)) #'< :key #'cadr))) ;; Possibly a padding word From 4e707b895ffdc9acc78937f3532edf1ba5d712ea Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 10 Jun 2020 22:17:28 -0400 Subject: [PATCH 0104/4023] Use trivial storage representation for *LOGICAL-HOSTS* To make a lockfree & weak pathname lookup table, logical host parsing has to be lockfree. Given how unlikely it is to create more than a handful of logical hosts, and following in the footsteps of another Lisp implementation that uses plain old lists, I think we're more than OK with only a sorted vector. ... and EXTRACT-LOGICAL-HOST-PREFIX was never used, so the moral is that once a decade you should go over your code and rethink your assumptions. ... and remove a leftover piece of junk printf added by mistake. --- src/code/target-pathname.lisp | 49 +++++++++++++++++------------------ src/runtime/backtrace.c | 1 - 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index 88e459eaf2..1dc5019d25 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -37,6 +37,7 @@ (unparse-directory-separator ";") (simplify-namestring #'identity) (customary-case :upper))) + (name-hash 0 :type fixnum) (name "" :type simple-string :read-only t) (translations nil :type list) (canon-transls nil :type list)) @@ -313,10 +314,12 @@ (aver (eq host *physical-host*)) (%make-pathname host device directory name type version))))) -;;; Hash table searching maps a logical pathname's host to its -;;; physical pathname translation. -(define-load-time-global *logical-hosts* - (make-hash-table :test 'equal :synchronized t)) +;;; Vector of logical host objects, each of which contains its translations. +;;; The vector is never mutated- always a new vector is created when adding +;;; translations for a new host. So nothing needs locking. +;;; And the fact that hosts are never deleted keeps things really simple. +(define-load-time-global *logical-hosts* #()) +(declaim (simple-vector *logical-hosts*)) ;;;; patterns @@ -1048,18 +1051,6 @@ a host-structure or string." pn-host device directory file type version) end))))))) -;;; If NAMESTR begins with a colon-terminated, defined, logical host, -;;; then return that host, otherwise return NIL. -(defun extract-logical-host-prefix (namestr start end) - (declare (type simple-string namestr) - (type index start end) - (values (or logical-host null))) - (let ((colon-pos (position #\: namestr :start start :end end))) - (if colon-pos - (values (gethash (nstring-upcase (subseq namestr start colon-pos)) - *logical-hosts*)) - nil))) - (defun parse-namestring (thing &optional host @@ -1573,8 +1564,13 @@ unspecified elements into a completed to-pathname based on the to-wildname." (defun find-logical-host (thing &optional (errorp t)) (etypecase thing (string - (let ((found (gethash (logical-word-or-lose thing) - *logical-hosts*))) + (let* ((name (logical-word-or-lose thing)) + (hash (sxhash name)) + ;; Can do better here: binary search, since we maintain sorted order. + (found (dovector (x *logical-hosts*) + (when (and (eq (logical-host-name-hash x) hash) + (string= (logical-host-name x) name)) + (return x))))) (if (or found (not errorp)) found ;; This is the error signalled from e.g. @@ -1592,13 +1588,16 @@ unspecified elements into a completed to-pathname based on the to-wildname." ;;; Given a logical host name or host, return a logical host, creating ;;; a new one if necessary. -(defun intern-logical-host (thing) - (with-locked-system-table (*logical-hosts*) - (or (find-logical-host thing nil) - (let* ((name (logical-word-or-lose thing)) - (new (make-logical-host :name name))) - (setf (gethash name *logical-hosts*) new) - new)))) +(defun intern-logical-host (thing &aux name host) + (loop + (awhen (find-logical-host thing nil) (return it)) + (unless name + (setq name (logical-word-or-lose thing) + host (make-logical-host :name name :name-hash (sxhash name)))) + (let* ((old *logical-hosts*) + (new (merge 'vector old (list host) #'string< :key #'logical-host-name))) + (when (eq (cas *logical-hosts* old new) old) + (return host))))) ;;;; logical pathname parsing diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index cfc66c6d0a..9b37cb042d 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -66,7 +66,6 @@ debug_function_from_pc (struct code* code, void *pc) { struct compiled_debug_info *di; - fprintf(stderr, "MEATBALL %p %p\n", code, pc); if (instancep(code->debug_info)) di = (void*)native_pointer(code->debug_info); else if (listp(code->debug_info) && instancep(CONS(code->debug_info)->car)) From a6d3051b230834dad59f1eaa04168575ab0a2229 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 11 Jun 2020 15:56:02 -0400 Subject: [PATCH 0105/4023] Rip out unused macro, fix a comment --- src/code/hash-table.lisp | 5 +-- src/code/target-hash-table.lisp | 58 --------------------------------- 2 files changed, 3 insertions(+), 60 deletions(-) diff --git a/src/code/hash-table.lisp b/src/code/hash-table.lisp index 6fecf8bdad..63dd694f73 100644 --- a/src/code/hash-table.lisp +++ b/src/code/hash-table.lisp @@ -52,10 +52,11 @@ ;;; The PAIRS vector has an odd length with the following overhead elements: ;;; -;;; [0] = backpointer to hash-table +;;; [0] = high-water-mark ;;; [1] = rehash-due-to-GC indicator ;;; ... -;;; [length-1] = high-water-mark +;;; [length-1] = auxilliary info depending on kind of table +;;; See KV-VECTOR-AUX-INFO in 'target-hash-table' ;;; HASH-TABLE is implemented as a STRUCTURE-OBJECT. (sb-xc:deftype hash-table-index () '(unsigned-byte 32)) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 1178d6c3c9..3277813314 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -57,64 +57,6 @@ (and (hash-table-weak-p ht) (decode-hash-table-weakness (ash (hash-table-flags ht) -4)))) -;;; Code for detecting concurrent accesses to the same table from -;;; multiple threads. Only compiled in when the :SB-HASH-TABLE-DEBUG -;;; feature is enabled. The main reason for the existence of this code -;;; is to detect thread-unsafe uses of hash-tables in sbcl itself, -;;; where debugging anythign can be impossible after an important -;;; internal hash-table has been corrupted. It's plausible that this -;;; could be useful for some user code too, but the runtime cost is -;;; really too high to enable it by default. -;;; TODO: This macro needs to be repaired or removed. -(defmacro with-concurrent-access-check (hash-table operation &body body) - (declare (ignorable hash-table operation) - (type (member :read :write) operation)) - #-sb-hash-table-debug - `(progn ,@body) - #+sb-hash-table-debug - (let ((thread-slot-accessor (if (eq operation :read) - 'hash-table-reading-thread - 'hash-table-writing-thread))) - (once-only ((hash-table hash-table)) - `(progn - (flet ((body-fun () - ,@body) - (error-fun () - ;; Don't signal more errors for this table. - (setf (hash-table-signal-concurrent-access ,hash-table) nil) - (cerror "Ignore the concurrent access" - "Concurrent access to ~A" ,hash-table))) - (declare (inline body-fun)) - (if (hash-table-signal-concurrent-access ,hash-table) - (unwind-protect - (progn - (unless (and (null (hash-table-writing-thread - ,hash-table)) - ,@(when (eq operation :write) - `((null (hash-table-reading-thread - ,hash-table))))) - (error-fun)) - (setf (,thread-slot-accessor ,hash-table) - sb-thread::*current-thread*) - (body-fun)) - (unless (and ,@(when (eq operation :read) - `((null (hash-table-writing-thread - ,hash-table)))) - ,@(when (eq operation :write) - ;; no readers are allowed while writing - `((null (hash-table-reading-thread - ,hash-table)) - (eq (hash-table-writing-thread - ,hash-table) - sb-thread::*current-thread*)))) - (error-fun)) - (when (eq (,thread-slot-accessor ,hash-table) - sb-thread::*current-thread*) - ;; this is not 100% correct here and may hide - ;; concurrent access in rare circumstances. - (setf (,thread-slot-accessor ,hash-table) nil))) - (body-fun))))))) - #-sb-fluid (declaim (inline eq-hash)) (defun eq-hash (key) (declare (values fixnum (member t nil))) From 557f37be8e2ffec4555662b923c95e90b63c2207 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 11 Jun 2020 16:24:31 -0400 Subject: [PATCH 0106/4023] Prefer nonrecursive mutex to recursive Avoid WITH-LOCKED-SYSTEM-TABLE, basically. Recursive mutex acquisition is often suspicious of a code smell, or at least inadequate thinking about concurrency issues. Unfortunately, SBCL's mutex API seems to encourage not knowing how you're supposed to use any given mutex, unlike APIs like POSIX and in pretty much every other Lisp that specify at creation time whether a mutex is recursive. --- src/pcl/fngen.lisp | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/pcl/fngen.lisp b/src/pcl/fngen.lisp index 51fbde87c1..28e40a23f9 100644 --- a/src/pcl/fngen.lisp +++ b/src/pcl/fngen.lisp @@ -87,26 +87,29 @@ ;;; *FGENS* stores all the function generators we have so far. Each ;;; element is a FGEN structure as implemented below. Don't ever touch this -;;; list by hand, use LOOKUP-FGEN, and ENSURE-FGEN. -(define-load-time-global *fgens* (make-hash-table :test #'equal :synchronized t)) +;;; table by hand, use GET-FUN-GENERATOR and ENSURE-FGEN. +;;; We use explicit locking for properly scoped R/M/W operation without +;;; recursion on the mutex. So the table is not specified as :SYNCHRONIZED. +(define-load-time-global *fgens* (make-hash-table :test #'equal)) (defun ensure-fgen (test gensyms generator generator-lambda system) - (with-locked-system-table (*fgens*) - (let ((old (lookup-fgen test))) - (cond (old - (setf (fgen-generator old) generator) - (unless (fgen-system old) - (setf (fgen-system old) system))) - (t - (setf (gethash test *fgens*) - (make-fgen gensyms generator generator-lambda system))))))) + (let ((table *fgens*)) + (sb-thread::with-system-mutex ((sb-impl::hash-table-lock table)) + (let ((old (gethash test table))) + (cond (old + (setf (fgen-generator old) generator) + (unless (fgen-system old) + (setf (fgen-system old) system))) + (t + (setf (gethash test table) + (make-fgen gensyms generator generator-lambda system)))))))) -(defun lookup-fgen (test) - (gethash test *fgens*)) (defun get-fun-generator (lambda test-converter code-converter) (let* ((test (compute-test lambda test-converter)) - (fgen (lookup-fgen test))) + (table *fgens*) + (fgen (sb-thread::with-system-mutex ((sb-impl::hash-table-lock table)) + (gethash test table)))) (if fgen (fgen-generator fgen) (get-new-fun-generator lambda test code-converter)))) @@ -167,8 +170,8 @@ (defmacro precompile-function-generators (&optional system) (let (collect) - (with-locked-system-table (*fgens*) - (maphash (lambda (test fgen) + ;; In single threaded code, only at system build time, and not used after. + (maphash (lambda (test fgen) (when (or (null (fgen-system fgen)) (eq (fgen-system fgen) system)) (when system @@ -180,5 +183,5 @@ ',(fgen-generator-lambda fgen) ',system) collect))) - *fgens*)) + *fgens*) `(progn ,@collect))) From 10b0aeb2fb8b91f03e443d4463169e76955e3b28 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 11 Jun 2020 17:36:02 -0400 Subject: [PATCH 0107/4023] More of less of WITH-LOCKED-SYSTEM-TABLE This makes a few weak table mutexes nonrecursive which was extra problematic because of the combined outer WITH-LOCKED-... coupled with automatic locking of synchronized tables plus the fact that we essentially ignore the :SYNCHRONIZED option of MAKE-HASH-TABLE when :WEAKNESS is specified, meaning that you can't create an *unsynchronized* weak table. Implicit locking was the behavior from git rev f318d0b165, but that was done as an artifact of the implementation and not a contractual obligation. But as we know, users tend to expect aspects of an API that are observable to stay the same, at least until we loudly tell them otherwise. We don't know if magical threadsafety of weak tables is something users have come to rely on. So even if I could make weak tables multi-reader concurrent without locking (with a lot of effort), we would need to announce that henceforth weak tables behave as any other table that lacks the :synchronized arg or explicitly gives it as NIL. That's an OK thing to do, but more than this change demands. So I employed a hack to workaround the ignoring of the :SYNCHRONIZED option rather than trying to respect it and fix all problems entailed by such fix. --- contrib/sb-introspect/introspect.lisp | 9 +++-- package-data-list.lisp-expr | 1 + src/code/cross-misc.lisp | 9 ++++- src/code/early-extensions.lisp | 2 +- src/code/early-type.lisp | 11 ++---- src/code/final.lisp | 26 ++++++------- src/code/target-hash-table.lisp | 56 +++++++++++++++++++-------- src/pcl/defs.lisp | 6 +-- 8 files changed, 72 insertions(+), 48 deletions(-) diff --git a/contrib/sb-introspect/introspect.lisp b/contrib/sb-introspect/introspect.lisp index 4d13b45162..460b802037 100644 --- a/contrib/sb-introspect/introspect.lisp +++ b/contrib/sb-introspect/introspect.lisp @@ -854,10 +854,11 @@ Experimental: interface subject to change." (add-to-xset part seen) (funcall fun part)))) (when ext - (let ((table sb-pcl::*eql-specializer-table*)) - (multiple-value-bind (value foundp) - (with-locked-system-table (table) (gethash object table)) - (when foundp (call value))))) + (multiple-value-bind (value foundp) + (let ((table sb-pcl::*eql-specializer-table*)) + (with-system-mutex ((sb-impl::hash-table-lock table)) + (gethash object table))) + (when foundp (call value)))) (sb-vm:do-referenced-object (object call) (cons :extend diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 62f8422a9b..0ae8947e9b 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -1058,6 +1058,7 @@ possibly temporarily, because it might be used internally." ;; Like WITH-LOCKED-HASH-TABLE, but disabled interrupts "WITH-LOCKED-SYSTEM-TABLE" + "WITH-SYSTEM-MUTEX" ;; generic set implementation backed by a list that upgrades ;; to a hashtable if a certain size is exceeded. diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index 0037e2872a..e696f74378 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -14,6 +14,12 @@ ;;; Forward declarations +(defun make-system-hash-table (&rest args) + (let ((args (copy-list args))) + (remf args :synchronized) + (remf args :finalizer) + (apply 'make-hash-table args))) + ;;; In correct code, TRULY-THE has only a performance impact and can ;;; be safely degraded to ordinary THE. (defmacro truly-the (type expr) @@ -339,7 +345,8 @@ (defmacro sb-format:tokens (string) string) -(defmacro sb-thread::with-recursive-system-lock ((lock) &body body) +;;; For a use in EARLY-TYPE +(defmacro with-system-mutex ((lock) &body body) (declare (ignore lock)) `(progn ,@body)) diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index 7d700d258f..d229c72066 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -277,7 +277,7 @@ ,result))) `(let ((,n-table ,table)) ,(if locked - `(with-locked-system-table (,n-table) ,iter-form) + `(with-system-mutex ((hash-table-lock ,n-table)) ,iter-form) iter-form)))) ;;; Executes BODY for all entries of PLIST with KEY and VALUE bound to diff --git a/src/code/early-type.lisp b/src/code/early-type.lisp index 1e6209643c..7efa2f623d 100644 --- a/src/code/early-type.lisp +++ b/src/code/early-type.lisp @@ -851,14 +851,9 @@ ;;; sitll signal that an unknown specifier is unknown on each reparse of the same. ;;; But as long as any reference enlivens the relevant CTYPE, we'll return that object. (defglobal **unknown-type-atoms** - ;; I think it's safe to say that if the host is SBCL, we can employ a weak table. - ;; SBCL has had weak tables since Sep 2006 (git rev 1479483c5f). - ;; For other hosts, just use an ordinary hash-table. - ;; This table isn't specified as synchronized because we need to wrap the lock + ;; This table is specified as unsynchronized because we need to wrap the lock ;; around a read/modify/write. GETHASH and PUTHASH can't do that themselves. - ;; Not that it would matter anyway - weak tables are always synchronized. - (let ((weakness #+(or (not sb-xc-host) host-quirks-sbcl) '(:weakness :value))) - (apply #'make-hash-table :test 'eq weakness))) + (sb-impl::make-system-hash-table :test 'eq :weakness :value :synchronized nil)) #-sb-xc-host (progn (declaim (inline class-classoid)) @@ -930,7 +925,7 @@ (setf (type-context-cacheable context) nil) (return (if (atom spec) (let ((table **unknown-type-atoms**)) - (sb-thread::with-recursive-system-lock ((sb-impl::hash-table-lock table)) + (with-system-mutex ((sb-impl::hash-table-lock table)) (or (gethash spec table) (progn #+sb-xc-host (when *compile-print* diff --git a/src/code/final.lisp b/src/code/final.lisp index 2046d46e34..42f3803ffb 100644 --- a/src/code/final.lisp +++ b/src/code/final.lisp @@ -12,14 +12,13 @@ (in-package "SB-IMPL") (defmacro with-finalizer-store ((var) &body body) - `(let ((mutex (hash-table-lock (finalizer-id-map **finalizer-store**)))) - ;; This does not inhibit GC, though the hashtable operations will, - ;; as is (currently) required for tables with non-null weakness. - (sb-thread::with-recursive-system-lock (mutex) - ;; Grab the store again inside the lock in case the array was enlarged - ;; after we referenced the mutex but before we acquired it. - (let ((,var **finalizer-store**)) - ,@body)))) + `(with-system-mutex ((hash-table-lock (finalizer-id-map **finalizer-store**))) + ;; Grab the global var inside the lock in case the array was enlarged + ;; after we referenced the mutex but before we acquired it. + ;; It's OK to reference the FINALIZER-ID-MAP because that is always + ;; in element 1 of the array regardless of what happens to the array. + (let ((,var **finalizer-store**)) + ,@body))) (defmacro finalizer-recycle-bin (store) `(cdr (elt ,store 0))) (defmacro finalizer-id-map (store) `(elt ,store 1)) @@ -27,9 +26,8 @@ (defun make-finalizer-store (array-length) (let* ((v (make-array (the index array-length))) - (ht (make-hash-table :test 'eq :weakness :key))) - (setf (%instance-ref ht (get-dsd-index hash-table flags)) - (logior (hash-table-flags ht) hash-table-finalizer-flag)) + (ht (make-system-hash-table :test 'eq :weakness :key :synchronized nil + :finalizer t))) ;; The recycle bin has a dummy item in front so that the simple-vector ;; is growable without messing up RUN-PENDING-FINALIZERS when it atomically ;; pushes items into the recycle bin - it is unaffected by looking at @@ -308,7 +306,7 @@ Examples: (when (hash-table-culled-values (finalizer-id-map **finalizer-store**)) (cond #+sb-thread ((%instancep *finalizer-thread*) - (sb-thread::with-system-mutex (*finalizer-queue-lock*) + (with-system-mutex (*finalizer-queue-lock*) (sb-thread:condition-notify *finalizer-queue*))) #+sb-thread ((eq *finalizer-thread* t) ; Create a new thread @@ -324,7 +322,7 @@ Examples: (loop (scan-finalizers) ;; Wait for a notification - (sb-thread::with-system-mutex (*finalizer-queue-lock*) + (with-system-mutex (*finalizer-queue-lock*) ;; Don't go to sleep if *FINALIZER-THREAD* became NIL (unless *finalizer-thread* (return)) @@ -367,6 +365,6 @@ Examples: (when (%instancep thread) ;; The finalizer thread will exit when we wake it up ;; and it sees that *FINALIZER-THREAD* is NIL. - (sb-thread::with-system-mutex (*finalizer-queue-lock*) + (with-system-mutex (*finalizer-queue-lock*) (sb-thread:condition-notify *finalizer-queue*)) (sb-thread:join-thread thread)))) ; wait for it diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 3277813314..39c105436d 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -310,6 +310,18 @@ Examples: v)) +;;; I don't want to change peoples' assumptions about what operations are threadsafe +;;; on a weak table that was not created as expressly synchronized, so we continue to +;;; create nearly all weak tables as synchronized. With such tables, lock acquisition +;;; might be recursive, because we also told users that they can use +;;; SB-EXT:WITH-LOCKED-HASH-TABLE even with tables that are self-locking. +;;; This results in a really strange design in which it is exceptionally difficult +;;; to plug in standard POSIX mutexes which do not default to being recursive. +;;; To slightly mitigate the problem of assuming all mutexes should be recursive, +;;; some of the system weak hash-table are frobbed to turn off SYNCHRONIZED. +;;; Maybe I can figure out how to make concurrent weak GETHASH threadsafe, +;;; but I've spent a bit of time on it and it is quite difficult. + (defun make-hash-table (&key (test 'eql) (size #.+min-hash-table-size+) @@ -481,9 +493,7 @@ Examples: rehash-size rehash-threshold kv-vector index-vector next-vector hash-vector (logior (if userfunp hash-table-userfun-flag 0) - ;; FIXME: shouldn't weak tables always return - ;; T from HASH-TABLE-SYNCHRONIZED-P ? - (if synchronized hash-table-synchronized-flag 0) + (if (or weakness synchronized) hash-table-synchronized-flag 0) weakness-bits)))) (declare (type index scaled-size)) ;; The trailing metadata element is either the table itself or the hash-vector @@ -492,6 +502,19 @@ Examples: (setf (kv-vector-table kv-vector) (if weakness table hash-vector)) table))) +(defun make-system-hash-table (&rest args &key (synchronized nil synchronizedp) finalizer + &allow-other-keys) + (setq args (copy-list args)) + (remf args :finalizer) + (let* ((ht (apply #'make-hash-table args)) + (flags (hash-table-flags ht))) + (when (and synchronizedp (not synchronized)) + (setf flags (logandc2 flags hash-table-synchronized-flag))) + (when finalizer + (setf flags (logior flags hash-table-finalizer-flag))) + (setf (%instance-ref ht (get-dsd-index hash-table flags)) flags) + ht)) + ;;; I guess we might have more than one representation of a table, ;;; hence this small wrapper function. But why not for the others? (defun hash-table-count (hash-table) @@ -1169,8 +1192,6 @@ nnnn 1_ any linear scan (macrolet ((return-hit () '(return-from findhash-weak (values probed-val probed-key physical-index predecessor)))) - ;; FIXME: since a weak table is always synchronized, maybe get rid of - ;; this loop-over-epoch noise? (let ((start-epoch sb-kernel::*gc-epoch*) (kv-vector (hash-table-pairs hash-table))) (tagbody @@ -1244,18 +1265,20 @@ nnnn 1_ any linear scan (unless (logtest (hash-table-flags hash-table) hash-table-userfun-flag) address-sensitive-p)) (hash (prefuzz-hash (the fixnum hash0)))) + (dx-flet ((body () + (binding* (((probed-value probed-key physical-index predecessor) + (findhash-weak key hash-table hash address-sensitive-p)) + (kv-vector (hash-table-pairs hash-table))) + (declare (index physical-index)) + ,@body))) ;; It would be ideal if we were consistent about all tables NOT having - ;; synchronization unless created with ":SYNCHRONIZED T". - ;; But removing the implicit synchronization from weak tables looks tricky - ;; and doesn't seem worth spending much time on. - (sb-thread::with-recursive-system-lock ((hash-table-lock hash-table)) - ;; Receive the existing k,v pair to ensure liveness thereof because - ;; otherwise we have no "certificate of existence" of the pair. - (binding* (((probed-value probed-key physical-index predecessor) - (findhash-weak key hash-table hash address-sensitive-p)) - (kv-vector (hash-table-pairs hash-table))) - (declare (index physical-index)) - ,@body))))) + ;; synchronization unless created with ":SYNCHRONIZED T" + ;; but it looks tricky to support concurrent gethash on weak tables, + ;; so we mostly default to locking, except where there is an outer scope + ;; providing mutual exclusion such as WITH-FINALIZER-STORE. + (if (hash-table-synchronized-p hash-table) + (sb-thread::call-with-system-mutex #'body (hash-table-lock hash-table)) + (body)))))) (defun gethash/weak (key hash-table default) (declare (type hash-table hash-table) (optimize speed)) @@ -1753,6 +1776,7 @@ table itself." ;; observe junk, but you can't put good value at higher than the HWM] #+hash-table-simulate (setf (hash-table-%alist hash-table) nil) (when (plusp (kv-vector-high-water-mark (hash-table-pairs hash-table))) + ;; FIXME: why always acquire the lock? (sb-thread::with-recursive-system-lock ((hash-table-lock hash-table)) (let* ((kv-vector (hash-table-pairs hash-table)) (high-water-mark (kv-vector-high-water-mark kv-vector))) diff --git a/src/pcl/defs.lisp b/src/pcl/defs.lisp index aec10d5e16..f1302e1372 100644 --- a/src/pcl/defs.lisp +++ b/src/pcl/defs.lisp @@ -568,14 +568,12 @@ ;; gethash on a live key should get the identical specializer, but since ;; nothing referenced the old specializer, consing a new one is fine. (defglobal *eql-specializer-table* - (make-hash-table :test 'eql :weakness :value)) + (sb-impl::make-system-hash-table :test 'eql :weakness :value :synchronized nil)) (defun intern-eql-specializer (object) ;; Avoid style-warning about compiler-macro being unavailable. (declare (notinline make-instance)) - ;; Need to lock, so that two threads don't get non-EQ specializers - ;; for an EQL object. - (with-locked-system-table (*eql-specializer-table*) + (with-system-mutex ((sb-impl::hash-table-lock *eql-specializer-table*)) (ensure-gethash object *eql-specializer-table* (make-instance 'eql-specializer :object object)))) From 402c264bb367c588510c834f7835cb9c9c40a964 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 11 Jun 2020 18:43:02 -0400 Subject: [PATCH 0108/4023] Fix non-SBCL-hosted build --- src/code/cross-misc.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index e696f74378..919d7c61bb 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -16,6 +16,7 @@ (defun make-system-hash-table (&rest args) (let ((args (copy-list args))) + (remf args :weakness) (remf args :synchronized) (remf args :finalizer) (apply 'make-hash-table args))) From 6c7536b0ac79d78868a0b24c71dd7f1dd7f47765 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 11 Jun 2020 23:30:01 -0400 Subject: [PATCH 0109/4023] Change *effective-method-cache* into a per-method slot --- src/pcl/boot.lisp | 9 ++++++++- src/pcl/defs.lisp | 1 + src/pcl/dfun.lisp | 36 +++++++++++++++--------------------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index f78571e669..609d3b35b6 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -2626,18 +2626,22 @@ bootstrapping. (result (list :early-method + ;; SECOND (getf initargs :function) + ;; THIRD (let ((mf (getf initargs :function))) (aver mf) (and (typep mf '%method-function) (%method-function-fast-function mf))) + ;; FOURTH ;; the parsed specializers. This is used by ;; EARLY-METHOD-SPECIALIZERS to cache the parse. ;; Note that this only comes into play when there is ;; more than one early method on an early gf. parsed + ;; FIFTH ;; A list to which REAL-MAKE-A-METHOD can be applied ;; to make a real method corresponding to this early ;; one. @@ -2647,7 +2651,10 @@ bootstrapping. (when slot-name (list :slot-name slot-name :object-class object-class :method-class-function method-class-function)) - (list 'source source))))) + (list 'source source)) + + ;; SIXTH + (cons nil nil)))) (initialize-method-function initargs result) result)) diff --git a/src/pcl/defs.lisp b/src/pcl/defs.lisp index f1302e1372..4b901f5947 100644 --- a/src/pcl/defs.lisp +++ b/src/pcl/defs.lisp @@ -330,6 +330,7 @@ (lambda-list :initform () :initarg :lambda-list :reader method-lambda-list) (%function :initform nil :initarg :function :reader method-function) (%documentation :initform nil :initarg :documentation) + (%cache :initform nil :accessor method-em-cache) ;; True IFF method is known to have no CALL-NEXT-METHOD in it, or ;; just a plain (CALL-NEXT-METHOD). (simple-next-method-call diff --git a/src/pcl/dfun.lisp b/src/pcl/dfun.lisp index 410f7334aa..e32ca516d1 100644 --- a/src/pcl/dfun.lisp +++ b/src/pcl/dfun.lisp @@ -1601,21 +1601,13 @@ Except see also BREAK-VICIOUS-METACIRCLE. -- CSR, 2003-05-28 root))) nil)) -;;; Not synchronized, as all the uses we have for it are multiple ones -;;; and need WITH-LOCKED-SYSTEM-TABLE in any case. -;;; -;;; FIXME: Is it really more efficient to store this stuff in a global -;;; table instead of having a slot in each method? -;;; -;;; FIXME: This table also seems to contain early methods, which should -;;; presumably be dropped during the bootstrap. -(define-load-time-global *effective-method-cache* (make-hash-table :test 'eq)) - (defun flush-effective-method-cache (generic-function) - (let ((cache *effective-method-cache*)) - (with-locked-system-table (cache) - (dolist (method (generic-function-methods generic-function)) - (remhash method cache))))) + (dolist (method (generic-function-methods generic-function)) + (let ((cache + (if (listp method) (sixth method) (method-em-cache method)))) + (when cache + (rplaca cache nil) + (rplacd cache nil))))) (defun get-secondary-dispatch-function (gf methods types &optional method-alist wrappers) @@ -1637,24 +1629,26 @@ Except see also BREAK-VICIOUS-METACIRCLE. -- CSR, 2003-05-28 (lambda (&rest args) (call-no-applicable-method gf args))) (let* ((key (car methods)) - (ht *effective-method-cache*) - (ht-value (with-locked-system-table (ht) - (ensure-gethash key ht (cons nil nil))))) + (cache + (if (listp key) ; early method + (sixth key) ; See !EARLY-MAKE-A-METHOD + (or (method-em-cache key) + (setf (method-em-cache key) (cons nil nil)))))) (if (and (null (cdr methods)) all-applicable-p ; the most common case (null method-alist-p) wrappers-p (not function-p)) - (or (car ht-value) - (setf (car ht-value) + (or (car cache) + (setf (car cache) (get-secondary-dispatch-function2 gf methods types method-alist-p wrappers-p all-applicable-p all-sorted-p function-p))) (let ((akey (list methods (if all-applicable-p 'all-applicable types) method-alist-p wrappers-p function-p))) - (or (cdr (assoc akey (cdr ht-value) :test #'equal)) + (or (cdr (assoc akey (cdr cache) :test #'equal)) (let ((value (get-secondary-dispatch-function2 gf methods types method-alist-p wrappers-p all-applicable-p all-sorted-p function-p))) - (push (cons akey value) (cdr ht-value)) + (push (cons akey value) (cdr cache)) value))))))) (defun get-secondary-dispatch-function2 (gf methods types method-alist-p From 8c9be87374cdfbf9b46b698f114fba2ca16ea79d Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 12 Jun 2020 00:09:13 -0400 Subject: [PATCH 0110/4023] Remove WITH-LOCKED-SYSTEM-TABLE Technically we should have needed 2 variants of that macro, one each for WITH-SYSTEM-MUTEX versus WITH-RECURSIVE-SYSTEM-LOCK. Instead, just use the proper underlying macro, which in all cases for which we used WITH-LOCKED-SYSTEM-TABLE should actually have been nonrecursive. --- contrib/sb-introspect/introspect.lisp | 2 +- package-data-list.lisp-expr | 3 +-- src/code/class.lisp | 2 +- src/code/cross-misc.lisp | 4 ---- src/code/dyncount.lisp | 2 +- src/code/early-type.lisp | 2 +- src/code/linkage-table.lisp | 4 ++-- src/code/ntrace.lisp | 2 +- src/code/target-extensions.lisp | 7 ------- src/pcl/defs.lisp | 2 +- src/pcl/fngen.lisp | 4 ++-- src/pcl/std-class.lisp | 2 +- 12 files changed, 12 insertions(+), 24 deletions(-) diff --git a/contrib/sb-introspect/introspect.lisp b/contrib/sb-introspect/introspect.lisp index 460b802037..3020253319 100644 --- a/contrib/sb-introspect/introspect.lisp +++ b/contrib/sb-introspect/introspect.lisp @@ -856,7 +856,7 @@ Experimental: interface subject to change." (when ext (multiple-value-bind (value foundp) (let ((table sb-pcl::*eql-specializer-table*)) - (with-system-mutex ((sb-impl::hash-table-lock table)) + (with-system-mutex ((hash-table-lock table)) (gethash object table))) (when foundp (call value)))) (sb-vm:do-referenced-object (object call) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 0ae8947e9b..adc88a2734 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -1056,9 +1056,8 @@ possibly temporarily, because it might be used internally." ;; Stack allocation without any questions asked "TRULY-DYNAMIC-EXTENT" - ;; Like WITH-LOCKED-HASH-TABLE, but disabled interrupts - "WITH-LOCKED-SYSTEM-TABLE" "WITH-SYSTEM-MUTEX" + "HASH-TABLE-LOCK" ;; generic set implementation backed by a list that upgrades ;; to a hashtable if a certain size is exceeded. diff --git a/src/code/class.lisp b/src/code/class.lisp index 81828be5b0..2b714f8c56 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -610,7 +610,7 @@ between the ~A definition and the ~A definition" (defun insured-find-classoid (name predicate constructor) (declare (type function predicate constructor)) (let ((table *forward-referenced-layouts*)) - (with-locked-system-table (table) + (with-system-mutex ((hash-table-lock table)) (let* ((old (find-classoid name nil)) (res (if (and old (funcall predicate old)) old diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index 919d7c61bb..f089d251c8 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -30,10 +30,6 @@ (declare (ignore name)) `#'(lambda ,args ,@body)) -(defmacro with-locked-system-table ((table) &body body) - (declare (ignore table)) - `(progn ,@body)) - (defmacro define-thread-local (&rest rest) `(defvar ,@rest)) (defmacro defglobal (name value &rest doc) diff --git a/src/code/dyncount.lisp b/src/code/dyncount.lisp index 9bfc63ba6e..e97a49bdb8 100644 --- a/src/code/dyncount.lisp +++ b/src/code/dyncount.lisp @@ -35,7 +35,7 @@ comments from CMU CL: "Return a hash-table containing only the entries in Table1 whose key is not also a key in Table2." (declare (type hash-table table1 table2)) (let ((res (make-hash-table-like table1))) - (with-locked-system-table (table2) + (with-system-mutex ((hash-table-lock table2)) (dohash ((k v) table1 :locked t) (unless (nth-value 1 (gethash k table2)) (setf (gethash k res) v)))) diff --git a/src/code/early-type.lisp b/src/code/early-type.lisp index 7efa2f623d..a837089b88 100644 --- a/src/code/early-type.lisp +++ b/src/code/early-type.lisp @@ -925,7 +925,7 @@ (setf (type-context-cacheable context) nil) (return (if (atom spec) (let ((table **unknown-type-atoms**)) - (with-system-mutex ((sb-impl::hash-table-lock table)) + (with-system-mutex ((hash-table-lock table)) (or (gethash spec table) (progn #+sb-xc-host (when *compile-print* diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index bfa8d850cf..6ae3f2326f 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -58,7 +58,7 @@ (let* ((key (if datap (list name) name)) (info *linkage-info*) (ht (car info))) - (or (awhen (with-locked-system-table (ht) + (or (awhen (with-system-mutex ((hash-table-lock ht)) (or (gethash key ht) (let* ((index (hash-table-count ht)) (capacity (floor (- sb-vm:linkage-table-space-end @@ -104,7 +104,7 @@ (unless defined (push key notdef)) (arch-write-linkage-table-entry index real-address (if datap 1 0))))))) - (with-locked-system-table (ht) + (with-system-mutex ((hash-table-lock ht)) (if full-scan ;; Look up everything; this is for image restart or library unload. (dohash ((key index) ht) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 369af95a38..83d1fe21b2 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -584,7 +584,7 @@ the N-th value returned by the function." ((not fun) ;; Someone has FMAKUNBOUND it. (let ((table *traced-funs*)) - (with-locked-system-table (table) + (with-system-mutex ((hash-table-lock table)) (maphash (lambda (fun info) (when (equal function-or-name (trace-info-what info)) (remhash fun table))) diff --git a/src/code/target-extensions.lisp b/src/code/target-extensions.lisp index ac1d23aa58..2e084bfa83 100644 --- a/src/code/target-extensions.lisp +++ b/src/code/target-extensions.lisp @@ -184,13 +184,6 @@ unspecified." `(sb-thread:with-recursive-lock ((hash-table-lock ,hash-table)) ,@body)) -;;; This macro is horrible (because WITH-RECURSIVE-SYSTEM-LOCK is). -;;; So PLEASE don't use it, if at all possible. -(defmacro with-locked-system-table ((hash-table) &body body) - `(sb-thread::with-recursive-system-lock - ((hash-table-lock ,hash-table)) - ,@body)) - (defmacro find-package-restarts ((package-designator &optional reader) &body body) (let ((package `(or ,(if reader diff --git a/src/pcl/defs.lisp b/src/pcl/defs.lisp index 4b901f5947..2f0e495a28 100644 --- a/src/pcl/defs.lisp +++ b/src/pcl/defs.lisp @@ -574,7 +574,7 @@ (defun intern-eql-specializer (object) ;; Avoid style-warning about compiler-macro being unavailable. (declare (notinline make-instance)) - (with-system-mutex ((sb-impl::hash-table-lock *eql-specializer-table*)) + (with-system-mutex ((hash-table-lock *eql-specializer-table*)) (ensure-gethash object *eql-specializer-table* (make-instance 'eql-specializer :object object)))) diff --git a/src/pcl/fngen.lisp b/src/pcl/fngen.lisp index 28e40a23f9..55a0109b47 100644 --- a/src/pcl/fngen.lisp +++ b/src/pcl/fngen.lisp @@ -94,7 +94,7 @@ (defun ensure-fgen (test gensyms generator generator-lambda system) (let ((table *fgens*)) - (sb-thread::with-system-mutex ((sb-impl::hash-table-lock table)) + (sb-thread::with-system-mutex ((hash-table-lock table)) (let ((old (gethash test table))) (cond (old (setf (fgen-generator old) generator) @@ -108,7 +108,7 @@ (defun get-fun-generator (lambda test-converter code-converter) (let* ((test (compute-test lambda test-converter)) (table *fgens*) - (fgen (sb-thread::with-system-mutex ((sb-impl::hash-table-lock table)) + (fgen (sb-thread::with-system-mutex ((hash-table-lock table)) (gethash test table)))) (if fgen (fgen-generator fgen) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index ccd50344d5..f5a3f3e75b 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -300,7 +300,7 @@ (let ((table (specializer-method-table self)) (object (specializer-object self))) (if create - (sb-thread::with-system-mutex ((sb-impl::hash-table-lock table)) + (sb-thread::with-system-mutex ((hash-table-lock table)) (ensure-gethash object table (cons nil nil))) ;; FIXME: in the CREATE case we're locking, because we might be inserting, ;; and must ensure mutual exclusion with other writers. Fine, From 9b0b3b3674a03ece3887ad2c2dc78a7b46383f5f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 12 Jun 2020 14:57:00 -0400 Subject: [PATCH 0111/4023] Change some naming --- src/assembly/x86-64/support.lisp | 11 +++++++---- src/assembly/x86-64/tramps.lisp | 26 +++++++++++--------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/assembly/x86-64/support.lisp b/src/assembly/x86-64/support.lisp index 61551655d6..8386f2fe84 100644 --- a/src/assembly/x86-64/support.lisp +++ b/src/assembly/x86-64/support.lisp @@ -49,7 +49,10 @@ (inst ret))) ((:none :full-call-no-return)))) -(defmacro with-registers-preserved ((fpr-size &key except (callee-saved t)) &body body) +(defmacro with-registers-preserved ((convention fpr-size &key except) &body body) + ;: Convention: + ;; C = save GPRs that C call can change + ;; Lisp = save GPRs that lisp call can change (multiple-value-bind (mnemonic fpr-align getter) (ecase fpr-size (xmm (values 'movaps 16 'sb-x86-64-asm::get-fpr)) @@ -64,9 +67,9 @@ `(inst ,mnemonic (,getter ,regno) (ea ,(* regno fpr-align) rsp-tn)))))) (gpr-save/restore (operation except) (declare (type (member push pop) operation)) - (let ((registers (if callee-saved - '#1=(rax-tn rcx-tn rdx-tn rsi-tn rdi-tn r8-tn r9-tn r10-tn r11-tn) - '(rbx-tn r12-tn r14-tn r15-tn . #1#)))) + (let ((registers (ecase convention + (c '#1=(rax-tn rcx-tn rdx-tn rsi-tn rdi-tn r8-tn r9-tn r10-tn r11-tn)) + (lisp '(rbx-tn r12-tn r14-tn r15-tn . #1#))))) (when except (setf registers (remove except registers))) ;; Preserve alignment diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index 8cd8006c48..b3e87facab 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -15,7 +15,7 @@ (define-assembly-routine (alloc->rnn (:export cons->rnn)) () (inst or :byte (ea 8 rsp-tn) 1) CONS->RNN - (with-registers-preserved (xmm) + (with-registers-preserved (c xmm) (inst mov rdi-tn (ea 16 rbp-tn)) (inst call (make-fixup 'alloc-dispatch :assembly-routine)) (inst mov (ea 16 rbp-tn) rax-tn))) ; result onto stack @@ -24,7 +24,7 @@ (define-assembly-routine (alloc->rnn.avx2 (:export cons->rnn.avx2)) () (inst or :byte (ea 8 rsp-tn) 1) CONS->RNN.AVX2 - (with-registers-preserved (ymm) + (with-registers-preserved (c ymm) (inst mov rdi-tn (ea 16 rbp-tn)) (inst call (make-fixup 'alloc-dispatch :assembly-routine)) (inst mov (ea 16 rbp-tn) rax-tn))) ; result onto stack @@ -32,7 +32,7 @@ (define-assembly-routine (alloc->r11 (:export cons->r11) (:return-style :none)) () (inst or :byte (ea 8 rsp-tn) 1) CONS->R11 - (with-registers-preserved (xmm :except r11-tn) + (with-registers-preserved (c xmm :except r11-tn) (inst mov rdi-tn (ea 16 rbp-tn)) (inst call (make-fixup 'alloc-dispatch :assembly-routine)) (inst mov r11-tn rax-tn)) @@ -42,7 +42,7 @@ (define-assembly-routine (alloc->r11.avx2 (:export cons->r11.avx2) (:return-style :none)) () (inst or :byte (ea 8 rsp-tn) 1) CONS->R11.AVX2 - (with-registers-preserved (ymm :except r11-tn) + (with-registers-preserved (c ymm :except r11-tn) (inst mov rdi-tn (ea 16 rbp-tn)) (inst call (make-fixup 'alloc-dispatch :assembly-routine)) (inst mov r11-tn rax-tn)) @@ -60,7 +60,7 @@ ;;; There's no layout allocator preserving YMM regs because MAKE-LAYOUT entails a full call. #+immobile-space (define-assembly-routine (alloc-layout) () - (with-registers-preserved (xmm :except r11-tn) + (with-registers-preserved (c xmm :except r11-tn) (inst call (make-fixup "alloc_layout" :foreign)) (inst mov r11-tn rax-tn))) @@ -68,12 +68,12 @@ ;;; The C support routine's argument is the return PC. ;;; FIXME: we're missing routines that preserve YMM. I guess nobody cares. (define-assembly-routine (enable-alloc-counter) () - (with-registers-preserved (xmm) + (with-registers-preserved (c xmm) (inst lea rdi-tn (ea 8 rbp-tn)) (pseudo-atomic () (inst call (make-fixup "allocation_tracker_counted" :foreign))))) (define-assembly-routine (enable-sized-alloc-counter) () - (with-registers-preserved (xmm) + (with-registers-preserved (c xmm) (inst lea rdi-tn (ea 8 rbp-tn)) (pseudo-atomic () (inst call (make-fixup "allocation_tracker_sized" :foreign))))) @@ -140,15 +140,13 @@ (inst mov temp-reg-tn (ea (make-fixup "avx2_supported" :foreign-dataref))) (inst test :byte (ea temp-reg-tn) 1) (inst jmp :z call-preserving-xmm-only) - (with-registers-preserved (ymm :except r11-tn - :callee-saved nil) + (with-registers-preserved (lisp ymm :except r11-tn) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg (call-static-fun 'ensure-symbol-hash 1) (inst mov (ea 16 rbp-tn) rdx-tn)) ; result to arg passing loc (inst ret)) call-preserving-xmm-only - (with-registers-preserved (xmm :except r11-tn - :callee-saved nil) + (with-registers-preserved (lisp xmm :except r11-tn) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg (call-static-fun 'ensure-symbol-hash 1) (inst mov (ea 16 rbp-tn) rdx-tn)) ; result to arg passing loc @@ -160,16 +158,14 @@ (inst mov temp-reg-tn (ea (make-fixup "avx2_supported" :foreign-dataref))) (inst test :byte (ea temp-reg-tn) 1) (inst jmp :z call-preserving-xmm-only) - (with-registers-preserved (ymm :except r11-tn - :callee-saved nil) + (with-registers-preserved (lisp ymm :except r11-tn) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg1 (inst mov rdi-tn (ea 24 rbp-tn)) ; arg2 (call-static-fun 'update-object-layout-or-invalid 2) (inst mov (ea 24 rbp-tn) rdx-tn)) ; result to arg passing loc (inst ret 8)) ; remove 1 arg. Caller pops the result call-preserving-xmm-only - (with-registers-preserved (xmm :except r11-tn - :callee-saved nil) + (with-registers-preserved (lisp xmm :except r11-tn) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg1 (inst mov rdi-tn (ea 24 rbp-tn)) ; arg2 (call-static-fun 'update-object-layout-or-invalid 2) From 8292bca31127cbdf6af3efa9a418a03a50cbc1f1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 12 Jun 2020 15:57:56 -0400 Subject: [PATCH 0112/4023] Delay creation of hash-table-lock In many applications less than 1% of all calls to MAKE-HASH-TABLE tables request a synchronized table. COMPILE-FILE makes tens of thousands, and none warrant synchronization. --- src/assembly/x86-64/tramps.lisp | 24 +++++++++++++++++++++--- src/code/hash-table.lisp | 10 +++++++--- src/code/target-hash-table.lisp | 19 +++++++++++++++---- src/compiler/fndb.lisp | 1 + src/compiler/x86-64/cell.lisp | 11 +++++++++++ src/compiler/x86-64/parms.lisp | 1 + 6 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index b3e87facab..05038ac183 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -134,7 +134,7 @@ (loadw rax-tn rax-tn funcallable-instance-function-slot fun-pointer-lowtag) (inst jmp (object-slot-ea rax-tn closure-fun-slot fun-pointer-lowtag))) -(define-assembly-routine (ensure-symbol-hash (:return-style :none)) () +(define-assembly-routine (ensure-symbol-hash (:return-style :raw)) () #+avx2 (progn (inst mov temp-reg-tn (ea (make-fixup "avx2_supported" :foreign-dataref))) @@ -149,8 +149,26 @@ (with-registers-preserved (lisp xmm :except r11-tn) (inst mov rdx-tn (ea 16 rbp-tn)) ; arg (call-static-fun 'ensure-symbol-hash 1) - (inst mov (ea 16 rbp-tn) rdx-tn)) ; result to arg passing loc - (inst ret)) + (inst mov (ea 16 rbp-tn) rdx-tn))) ; result to arg passing loc + +(define-assembly-routine (sb-impl::install-hash-table-lock + (:return-style :raw)) + () + #+avx2 + (progn + (inst mov temp-reg-tn (ea (make-fixup "avx2_supported" :foreign-dataref))) + (inst test :byte (ea temp-reg-tn) 1) + (inst jmp :z call-preserving-xmm-only) + (with-registers-preserved (lisp ymm :except r11-tn) + (inst mov rdx-tn (ea 16 rbp-tn)) ; arg + (call-static-fun 'sb-impl::install-hash-table-lock 1) + (inst mov (ea 16 rbp-tn) rdx-tn)) ; result to arg passing loc + (inst ret)) + call-preserving-xmm-only + (with-registers-preserved (lisp xmm :except r11-tn) + (inst mov rdx-tn (ea 16 rbp-tn)) ; arg + (call-static-fun 'sb-impl::install-hash-table-lock 1) + (inst mov (ea 16 rbp-tn) rdx-tn))) ; result to arg passing loc (define-assembly-routine (invalid-layout-trap (:return-style :none)) () #+avx2 diff --git a/src/code/hash-table.lisp b/src/code/hash-table.lisp index 63dd694f73..838f09637a 100644 --- a/src/code/hash-table.lisp +++ b/src/code/hash-table.lisp @@ -117,9 +117,10 @@ ;; in 'gc-private.h' (flags 0 :type (unsigned-byte 6) :read-only t) ;; Used for locking GETHASH/(SETF GETHASH)/REMHASH - (lock (sb-thread:make-mutex :name "hash-table lock") - #-c-headers-only :type #-c-headers-only sb-thread:mutex - :read-only t) + ;; The lock is always created for synchronized tables, or created just-in-time + ;; with nonsynchronized tables that are guarded by WITH-LOCKED-HASH-TABLE + ;; or an equivalent "system" variant of the locking macro. + (%lock nil #-c-headers-only :type #-c-headers-only (or null sb-thread:mutex)) ;; The 4 standard tests functions don't need these next 2 slots: @@ -186,6 +187,9 @@ #+sb-hash-table-debug (writing-thread nil)) +(sb-xc:defmacro hash-table-lock (table) + `(let ((ht ,table)) (or (hash-table-%lock ht) (install-hash-table-lock ht)))) + ;; Our hash-tables store precomputed hashes to speed rehash and to guard ;; the call of the general comparator. ;; i.e. we take the value from mumble-hash {SXHASH, EQ-HASH, etc} diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 39c105436d..9b4acf7cd2 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -310,6 +310,12 @@ Examples: v)) +(defun install-hash-table-lock (table) + (declare (inline sb-thread:make-mutex)) + (let* ((lock (sb-thread:make-mutex :name "hash-table lock")) + (oldval (cas (hash-table-%lock (truly-the hash-table table)) nil lock))) + (if (eq oldval nil) lock oldval))) + ;;; I don't want to change peoples' assumptions about what operations are threadsafe ;;; on a weak table that was not created as expressly synchronized, so we continue to ;;; create nearly all weak tables as synchronized. With such tables, lock acquisition @@ -500,6 +506,7 @@ Examples: ;; depending on weakness. Non-weak hashing vectors can be GCed without looking ;; at the table. Weak hashing vectors need the table. (setf (kv-vector-table kv-vector) (if weakness table hash-vector)) + (when (or weakness synchronized) (install-hash-table-lock table)) table))) (defun make-system-hash-table (&rest args &key (synchronized nil synchronizedp) finalizer @@ -1277,7 +1284,9 @@ nnnn 1_ any linear scan ;; so we mostly default to locking, except where there is an outer scope ;; providing mutual exclusion such as WITH-FINALIZER-STORE. (if (hash-table-synchronized-p hash-table) - (sb-thread::call-with-system-mutex #'body (hash-table-lock hash-table)) + ;; Use the private slot accessor for the lock because it's known + ;; to have a mutex. + (sb-thread::call-with-system-mutex #'body (hash-table-%lock hash-table)) (body)))))) (defun gethash/weak (key hash-table default) @@ -1347,23 +1356,25 @@ nnnn 1_ any linear scan (equal (,wrapping gethash/equal puthash/equal remhash/equal)) (t (,wrapping gethash/equalp puthash/equalp remhash/equalp)))) (locked-methods (getter setter remover) + ;; Use the private slot accessor, because we know that the mutex + ;; has been constructed. `(values (named-lambda ,(symbolicate getter "/LOCK") (key table default) (declare (optimize speed (sb-c:verify-arg-count 0))) (truly-the (values t t &optional) (sb-thread::with-recursive-system-lock - ((hash-table-lock (truly-the hash-table table))) + ((hash-table-%lock (truly-the hash-table table))) (,getter key table default)))) (named-lambda ,(symbolicate setter "/LOCK") (key table value) (declare (optimize speed (sb-c:verify-arg-count 0))) (truly-the (values t &optional) (sb-thread::with-recursive-system-lock - ((hash-table-lock (truly-the hash-table table))) + ((hash-table-%lock (truly-the hash-table table))) (,setter key table value)))) (named-lambda ,(symbolicate remover "/LOCK") (key table) (declare (optimize speed (sb-c:verify-arg-count 0))) (truly-the (values t &optional) (sb-thread::with-recursive-system-lock - ((hash-table-lock (truly-the hash-table table))) + ((hash-table-%lock (truly-the hash-table table))) (,remover key table)))))) (methods (getter setter remover) `(values #',getter #',setter #',remover))) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index c318c8b3cd..fb94da9b4c 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -1041,6 +1041,7 @@ (defknown hash-table-test (hash-table) symbol (foldable flushable)) (defknown (sxhash psxhash) (t) hash-code (foldable flushable)) (defknown hash-table-equalp (hash-table hash-table) boolean (foldable flushable)) +(defknown sb-impl::install-hash-table-lock (hash-table) sb-thread:mutex ()) ;; To avoid emitting code to test for nil-function-returned (defknown (sb-impl::signal-corrupt-hash-table sb-impl::signal-corrupt-hash-table-bucket) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index be1e4c4cd5..52ba8a4c0b 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -387,6 +387,17 @@ GOOD (inst and res (lognot fixnum-tag-mask)))) ; redundant (but ok) if asm routine used +(define-vop () + (:policy :fast-safe) + (:translate sb-impl::install-hash-table-lock) + (:args (arg :scs (descriptor-reg))) + (:results (res :scs (descriptor-reg))) + (:vop-var vop) + (:generator 5 + (inst push arg) + (invoke-asm-routine 'call 'sb-impl::install-hash-table-lock vop) + (inst pop res))) + (eval-when (:compile-toplevel) ;; assumption: any object can be read 1 word past its base pointer (assert (= sb-vm:symbol-hash-slot 1))) diff --git a/src/compiler/x86-64/parms.lisp b/src/compiler/x86-64/parms.lisp index aaa9012d4c..0a4688f567 100644 --- a/src/compiler/x86-64/parms.lisp +++ b/src/compiler/x86-64/parms.lisp @@ -204,6 +204,7 @@ two-arg-gcd two-arg-lcm ensure-symbol-hash + sb-impl::install-hash-table-lock update-object-layout-or-invalid %coerce-callable-to-fun) #'equalp) From 53ed8098a0272d7ed4a0377765d194e3d623e6d9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 13 Jun 2020 00:25:59 +0300 Subject: [PATCH 0113/4023] Allow saving and loading >2GB cores on win32. Less long and off_t, appropriate [fl]seek and read. --- src/runtime/coreparse.c | 2 +- src/runtime/gc-private.h | 2 +- src/runtime/gencgc.c | 12 ++++++++++-- src/runtime/save.c | 29 +++++++++++++++++++---------- src/runtime/win32-os.c | 17 +++++++++++++---- 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 2b0ecf17ff..f300a86419 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -969,7 +969,7 @@ process_directory(int count, struct ndir_entry *entry, #ifdef LISP_FEATURE_GENCGC extern void gc_load_corefile_ptes(core_entry_elt_t, core_entry_elt_t, - off_t offset, int fd); + os_vm_offset_t offset, int fd); #else #define gc_load_corefile_ptes(dummy1,dummy2,dummy3,dummy4) #endif diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index ea05411fad..b4c82e0bf7 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -46,7 +46,7 @@ extern void *gc_general_alloc(sword_t nbytes,int page_type_flag); #define note_transported_object(old, new) /* do nothing */ static inline lispobj -gc_general_copy_object(lispobj object, long nwords, int page_type_flag) +gc_general_copy_object(lispobj object, size_t nwords, int page_type_flag) { CHECK_COPY_PRECONDITIONS(object, nwords); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 4a41b4c6f8..8875053f3f 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -4555,7 +4555,7 @@ gc_and_save(char *filename, boolean prepend_runtime, /* Read corefile ptes from 'fd' which has already been positioned * and store into the page table */ void gc_load_corefile_ptes(core_entry_elt_t n_ptes, core_entry_elt_t total_bytes, - off_t offset, int fd) + os_vm_offset_t offset, int fd) { compute_layout_of_layout(); gc_assert(ALIGN_UP(n_ptes * sizeof (struct corefile_pte), N_WORD_BYTES) @@ -4565,7 +4565,15 @@ void gc_load_corefile_ptes(core_entry_elt_t n_ptes, core_entry_elt_t total_bytes // consume addresses that would have been taken by a mapped space. gc_allocate_ptes(); - if (lseek(fd, offset, SEEK_SET) != offset) lose("failed seek"); + if ( +#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_64_BIT) + _lseeki64 +#else + lseek +#endif + (fd, offset, SEEK_SET) != offset) + lose("failed seek"); + char data[8192]; // Process an integral number of ptes on each read. // Parentheses around sizeof (type) are necessary to suppress a diff --git a/src/runtime/save.c b/src/runtime/save.c index 54383fd95e..9e04390641 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -77,7 +77,7 @@ write_lispobj(lispobj obj, FILE *file) } static void -write_bytes_to_file(FILE * file, char *addr, long bytes, int compression) +write_bytes_to_file(FILE * file, char *addr, size_t bytes, int compression) { if (compression == COMPRESSION_LEVEL_NONE) { while (bytes > 0) { @@ -145,14 +145,23 @@ write_bytes_to_file(FILE * file, char *addr, long bytes, int compression) } }; +#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_64_BIT) +#define FTELL _ftelli64 +#define FSEEK _fseeki64 +typedef __int64 ftell_type; +#else +#define FTELL ftell +#define FSEEK fseek +typedef long ftell_type; +#endif -static long write_bytes(FILE *file, char *addr, long bytes, +static long write_bytes(FILE *file, char *addr, size_t bytes, os_vm_offset_t file_offset, int compression) { - long here, data; + ftell_type here, data; #ifdef LISP_FEATURE_WIN32 - long count; + size_t count; /* touch every single page in the space to force it to be mapped. */ for (count = 0; count < bytes; count += 0x1000) { volatile int temp = addr[count]; @@ -160,12 +169,12 @@ static long write_bytes(FILE *file, char *addr, long bytes, #endif fflush(file); - here = ftell(file); - fseek(file, 0, SEEK_END); - data = ALIGN_UP(ftell(file), os_vm_page_size); - fseek(file, data, SEEK_SET); + here = FTELL(file); + FSEEK(file, 0, SEEK_END); + data = ALIGN_UP(FTELL(file), os_vm_page_size); + FSEEK(file, data, SEEK_SET); write_bytes_to_file(file, addr, bytes, compression); - fseek(file, here, SEEK_SET); + FSEEK(file, here, SEEK_SET); return ((data - file_offset) / os_vm_page_size) - 1; } @@ -265,7 +274,7 @@ save_to_filehandle(FILE *file, char *filename, lispobj init_function, fflush(stdout); } - os_vm_offset_t core_start_pos = ftell(file); + os_vm_offset_t core_start_pos = FTELL(file); write_lispobj(CORE_MAGIC, file); /* If 'save_runtime_options' is specified then the saved thread stack size diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 8cb2897a36..964386baa9 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -908,16 +908,25 @@ os_validate_recommit(os_vm_address_t addr, os_vm_size_t len) void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm_size_t len) { - os_vm_size_t count; AVER(VirtualAlloc(addr, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE)|| VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE)); - +#ifdef LISP_FEATURE_64_BIT + CRT_AVER_NONNEGATIVE(_lseeki64(fd, offset, SEEK_SET)); +#else CRT_AVER_NONNEGATIVE(lseek(fd, offset, SEEK_SET)); +#endif + size_t count; + + while (len) { + unsigned to_read = len > INT_MAX ? INT_MAX : len; + count = read(fd, addr, to_read); + addr += count; + len -= count; + CRT_AVER(count == to_read); + } - count = read(fd, addr, len); - CRT_AVER( count == len ); return (void*)0; } static DWORD os_protect_modes[8] = { From cc48f5974879838ca74975919ef0dcbc115697de Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 13 Jun 2020 02:42:41 +0300 Subject: [PATCH 0114/4023] Make *empty-extended-char-table* a bit more like a hash-table. For with-hash-table-iterator to do nothing. --- src/code/reader.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 7c47608536..2e8fd9da2d 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -32,6 +32,7 @@ (list `(%instance-ref table ,(dsd-index dsd)) (case (dsd-name dsd) (gethash-impl '#'gethash-return-default) + (pairs (make-array kv-pairs-overhead-slots)) (lock nil) (t (dsd-default dsd))))) (dd-slots From b6137e33f12a40a543d632467ed7a45b908ba2d8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 13 Jun 2020 03:00:53 +0300 Subject: [PATCH 0115/4023] named-readtables compatibility. --- package-data-list.lisp-expr | 3 ++- src/code/reader.lisp | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index adc88a2734..e16bc16811 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -656,7 +656,8 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*." "ANSI-STREAM-READ-CHAR-NO-HANG" "ANSI-STREAM-READ-LINE" "ANSI-STREAM-READ-SEQUENCE" "ANSI-STREAM-PEEK-CHAR" "ANSI-STREAM-UNREAD-CHAR" "ANSI-STREAM-WRITE-SEQUENCE" - "ANSI-STREAM-WRITE-STRING" "DISPATCH-TABLES" + "ANSI-STREAM-WRITE-STRING" + "DISPATCH-TABLES" "CHARACTER-MACRO-HASH-TABLE" "CHARACTER-MACRO-ARRAY" "TOKEN-DELIMITERP" "WHITESPACE[2]P" "WITH-READ-BUFFER" ;; other "%MAKUNBOUND") diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 2e8fd9da2d..2738c65de0 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -1962,6 +1962,7 @@ extended :: syntax." ;; values was a hashtable which got immediately coerced to an alist. ;; In anticipation of perhaps not doing an extra re-shaping, if HASH-TABLE-P ;; is NIL then return nested alists: ((#\# (#\R . #) ...)) +;; FIXME: provide a better interface for iterating over reader macros (defun dispatch-tables (readtable &optional (hash-table-p t)) (let (alist) (flet ((process (char fn &aux (dtable (%dispatch-macro-char-table fn))) @@ -1973,7 +1974,7 @@ extended :: syntax." when fn do (push (cons (code-char ch) fn) output)) (dolist (cell output) ; coerce values to function-designator (rplacd cell (cmt-entry-to-fun-designator (cdr cell)))) - (when hash-table-p ; caller wants hash-tables + (when hash-table-p ; caller wants hash-tables (setq output (%stuff-hash-table (make-hash-table) output))) (push (cons char output) alist))))) (loop for fn across (base-char-macro-array readtable) and ch from 0 @@ -1984,6 +1985,12 @@ extended :: syntax." (extended-char-table readtable)))) alist)) +(declaim (inline character-macro-array character-macro-hash-table)) +(define-deprecated-function :early "2.0.6" character-macro-array base-char-macro-array (readtable) + (base-char-macro-array readtable)) +(define-deprecated-function :early "2.0.6" character-macro-hash-table extended-char-table (readtable) + (extended-char-table readtable)) + ;; Stub - should never get called with anything but NIL ;; and only after all macros have been changed to constituents already. (defun (setf dispatch-tables) (new-alist readtable) From 9de4960e0cb2691c34cad70a6ac2dee683207e58 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 13 Jun 2020 02:01:50 -0400 Subject: [PATCH 0116/4023] Split MAKE-HASH-TABLE into 2 or 3 functions If the call specifies only a :TEST (or nothing) then use a simpler constructor which avoids all the argument handling. Minor improvement to the system-hash-table constructor as well. --- src/code/hash-table.lisp | 25 ++-- src/code/maphash.lisp | 46 ++++++++ src/code/reader.lisp | 2 +- src/code/target-hash-table.lisp | 201 +++++++++++++++++--------------- src/runtime/gc-private.h | 2 +- 5 files changed, 169 insertions(+), 107 deletions(-) diff --git a/src/code/hash-table.lisp b/src/code/hash-table.lisp index 838f09637a..46a67895e3 100644 --- a/src/code/hash-table.lisp +++ b/src/code/hash-table.lisp @@ -61,8 +61,9 @@ ;;; HASH-TABLE is implemented as a STRUCTURE-OBJECT. (sb-xc:deftype hash-table-index () '(unsigned-byte 32)) (sb-xc:defstruct (hash-table (:copier nil) - (:constructor %make-hash-table - (gethash-impl + (:constructor %alloc-hash-table + (flags + gethash-impl puthash-impl remhash-impl clrhash-impl @@ -74,8 +75,7 @@ pairs index-vector next-vector - hash-vector - flags))) + hash-vector))) (gethash-impl #'error :type function :read-only t) (puthash-impl #'error :type function :read-only t) @@ -107,15 +107,17 @@ ;; +MAGIC-HASH-VECTOR-VALUE+ represents address-based hashing on the ;; respective key. (hash-vector nil :type (or null (simple-array hash-table-index (*)))) - ;; flags: WEAKNESS-KIND | WEAKP | FINALIZERSP | USERFUNP | SYNCHRONIZEDP - ;; WEAKNESS-KIND is 2 bits, the rest are 1 bit each + ;; flags: WEAKNESS | KIND | WEAKP | FINALIZERSP | USERFUNP | SYNCHRONIZEDP + ;; WEAKNESS is 2 bits, KIND is 2 bits, the rest are 1 bit each + ;; - WEAKNESS : {K-and-V, K, V, K-or-V}, irrelevant unless WEAKP + ;; - KIND : {EQ, EQL, EQUAL, EQUALP}, irrelevant if USERFUNP ;; - WEAKP : table is weak ;; - FINALIZERSP : table is the global finalizer store - ;; - USERFUNP : table has a user-defined predicate + ;; - USERFUNP : table has a nonstandard hash function ;; - SYCHRONIZEDP : all operations are automatically guarded by a mutex ;; If you change these, be sure to check the definition of hash_table_weakp() ;; in 'gc-private.h' - (flags 0 :type (unsigned-byte 6) :read-only t) + (flags 0 :type (unsigned-byte 8) :read-only t) ;; Used for locking GETHASH/(SETF GETHASH)/REMHASH ;; The lock is always created for synchronized tables, or created just-in-time ;; with nonsynchronized tables that are guarded by WITH-LOCKED-HASH-TABLE @@ -190,6 +192,13 @@ (sb-xc:defmacro hash-table-lock (table) `(let ((ht ,table)) (or (hash-table-%lock ht) (install-hash-table-lock ht)))) +(sb-xc:defmacro pack-ht-flags-weakness (x) `(logior (ash ,x 6) hash-table-weak-flag)) +(sb-xc:defmacro ht-flags-weakness (flags) `(ldb (byte 2 6) ,flags)) +;;; KIND corresponds directly to the HASH-TABLE-TEST for the 4 standard tests, +;;; but is not meaningful with a user-provided test or hash function. +(sb-xc:defmacro pack-ht-flags-kind (x) `(ash ,x 4)) +(sb-xc:defmacro ht-flags-kind (flags) `(ldb (byte 2 4) ,flags)) + ;; Our hash-tables store precomputed hashes to speed rehash and to guard ;; the call of the general comparator. ;; i.e. we take the value from mumble-hash {SXHASH, EQ-HASH, etc} diff --git a/src/code/maphash.lisp b/src/code/maphash.lisp index 9adae7b5d6..18cea7ef76 100644 --- a/src/code/maphash.lisp +++ b/src/code/maphash.lisp @@ -116,3 +116,49 @@ for." #',name)))) (macrolet ((,name () '(funcall ,function))) ,@body)))) + +(define-compiler-macro make-hash-table (&whole form &rest keywords) + (let ((kind + (cond ((not keywords) 1) + ((typep keywords '(cons (eql :test) (cons t null))) + (let* ((arg (cadr keywords)) + (test (when (typep arg '(cons (member function quote) (cons t null))) + (cadr arg)))) + (position test #(eq eql equal equalp))))))) + (if kind + `(make-hash-table-using-defaults ,kind) + form))) + +(defconstant hash-table-weak-flag 8) +(defconstant hash-table-finalizer-flag 4) +(defconstant hash-table-userfun-flag 2) +(defconstant hash-table-synchronized-flag 1) + +;;; Keep in sync with weak_ht_alivep_funs[] in gc-common +(defconstant +ht-weak-key-AND-value+ 0) +(defconstant +ht-weak-key+ 1) +(defconstant +ht-weak-value+ 2) +(defconstant +ht-weak-key-OR-value+ 3) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defconstant +min-hash-table-size+ 14) + (defconstant default-rehash-size $1.5)) + +(defmacro make-system-hash-table (&key test synchronized weakness finalizer) + (multiple-value-bind (kind args) + (cond ((equal test '(quote eq)) (values 0 '('eq #'eq #'eq-hash))) + ((equal test '(quote eql)) (values 1 '('eql #'eql #'eql-hash))) + (t + (bug "Incomplete implementation of MAKE-SYSTEM-HASH-TABLE") + 0)) + `(%make-hash-table + (logior ,(ecase weakness + (:key '(pack-ht-flags-weakness +ht-weak-key+)) + (:value '(pack-ht-flags-weakness +ht-weak-value+))) + (pack-ht-flags-kind ,kind) + ,(if synchronized 'hash-table-synchronized-flag 0) + ,(if finalizer 'hash-table-finalizer-flag 0)) + ,@args + ,+min-hash-table-size+ + default-rehash-size + $1.0))) diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 2738c65de0..44e3572a46 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -111,7 +111,7 @@ (setf (gethash char table) (cons attributes function))) (t ;; If the table is *empty-extended-char-table* the item won't be - ;; found, so we're not actuallly altering the empty table. + ;; found, so we're not actually altering the empty table. (remhash char table))))) nil) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 9b4acf7cd2..aa4b4b3e4b 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -24,11 +24,6 @@ ;;;; swapped out for a new instance with new vectors. Remove array bounds ;;;; checking since all the arrays will be tied together. -(defconstant hash-table-weak-flag 8) -(defconstant hash-table-finalizer-flag 4) -(defconstant hash-table-userfun-flag 2) -(defconstant hash-table-synchronized-flag 1) - ;;; T if and only if table has non-null weakness kind. (declaim (inline hash-table-weak-p)) (defun hash-table-weak-p (ht) @@ -55,7 +50,7 @@ "Return the WEAKNESS of HASH-TABLE which is one of NIL, :KEY, :VALUE, :KEY-AND-VALUE, :KEY-OR-VALUE." (and (hash-table-weak-p ht) - (decode-hash-table-weakness (ash (hash-table-flags ht) -4)))) + (decode-hash-table-weakness (ht-flags-weakness (hash-table-flags ht))))) #-sb-fluid (declaim (inline eq-hash)) (defun eq-hash (key) @@ -269,9 +264,7 @@ Examples: ;;; So we allocate 14 k/v pairs = 28 cells + 3 overhead = 31 cells, ;;; and at maximum load the table will have a load factor of 87.5% (eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant +min-hash-table-size+ 14) - (defconstant kv-pairs-overhead-slots 3) - (defconstant default-rehash-size $1.5)) + (defconstant kv-pairs-overhead-slots 3)) (defconstant +min-hash-table-rehash-threshold+ (float 1/16 $1.0)) ;; The GC will set this to 1 if it moves an address-sensitive key. This used @@ -328,14 +321,13 @@ Examples: ;;; Maybe I can figure out how to make concurrent weak GETHASH threadsafe, ;;; but I've spent a bit of time on it and it is quite difficult. -(defun make-hash-table (&key - (test 'eql) - (size #.+min-hash-table-size+) - (rehash-size #.default-rehash-size) - (rehash-threshold 1) - (hash-function nil hash-function-suppliedp) - (weakness nil) - (synchronized)) +(defun make-hash-table (&key (test 'eql) + (size #.+min-hash-table-size+) + (rehash-size #.default-rehash-size) + (rehash-threshold 1) + (hash-function nil user-hashfun-p) + (weakness nil) + (synchronized)) "Create and return a new hash table. The keywords are as follows: :TEST @@ -397,43 +389,42 @@ Examples: future." (declare (type (or function symbol) test)) (declare (type unsigned-byte size)) - (multiple-value-bind (userfunp test test-fun hash-fun) - (cond ((or (eq test #'eq) (eq test 'eq)) (values nil 'eq #'eq #'eq-hash)) - ((or (eq test #'eql) (eq test 'eql)) (values nil 'eql #'eql #'eql-hash)) + (multiple-value-bind (kind test test-fun hash-fun) + (cond ((or (eq test #'eq) (eq test 'eq)) + (values 0 'eq #'eq #'eq-hash)) + ((or (eq test #'eql) (eq test 'eql)) + (values 1 'eql #'eql #'eql-hash)) ((or (eq test #'equal) (eq test 'equal)) - (cond ((or (eq hash-function #'equal-hash/unstable) - (eq hash-function 'equal-hash/unstable)) - ;; USERFUNP must remain NIL to permit address-based hashing. - ;; Don't want to assign HASH-FUNCTION itself - ;; because that prevents use of the argument's type assertion. - (setq hash-function-suppliedp nil) - (values nil 'equal #'equal #'equal-hash/unstable)) - (t - (values nil 'equal #'equal #'equal-hash)))) + ;; As an unadvertised feature, you can pick whether instances should receive + ;; stable or address-based hashes. A use-case for address-based would be for + ;; in system code so as not to incur memory growth by causing user structures + ;; to accrete a stable hash slot due to key movement by GC. + ;; USERFUNP must remain NIL in that case to permit address-based hashing. + (values 2 'equal #'equal + (let ((instance-addr-hashing + (or (eq hash-function #'equal-hash/unstable) + (eq hash-function 'equal-hash/unstable)))) + (when instance-addr-hashing + (setq user-hashfun-p nil)) + (if instance-addr-hashing #'equal-hash/unstable #'equal-hash)))) ((or (eq test #'equalp) (eq test 'equalp)) - (values nil 'equalp #'equalp #'equalp-hash)) + (values 3 'equalp #'equalp #'equalp-hash)) (t - ;; FIXME: It would be nice to have a compiler-macro - ;; that resolved this at compile time: we could grab - ;; the alist cell in a LOAD-TIME-VALUE, etc. (dolist (info *user-hash-table-tests* (if hash-function (if (functionp test) - (values t (%fun-name test) test nil) - (values t test (%coerce-callable-to-fun test) nil)) - (error "Unknown :TEST for MAKE-HASH-TABLE: ~S" - test))) + (values -1 (%fun-name test) test nil) + (values -1 test (%coerce-callable-to-fun test) nil)) + (error "Unknown :TEST for MAKE-HASH-TABLE: ~S" test))) (destructuring-bind (test-name test-fun hash-fun) info (when (or (eq test test-name) (eq test test-fun)) - (return (values t test-name test-fun hash-fun))))))) - (when (and hash-function-suppliedp hash-function) + (return (values -1 test-name test-fun hash-fun))))))) + (when user-hashfun-p + ;; It is permitted to specify a custom hash function with any of the standard predicates. + ;; This forces use of the generalized table methods. (setf hash-fun (%coerce-callable-to-fun hash-function) - ;; It is permitted to specify your own hash function with one of the - ;; builtin predicates. This forces use of the general predicate. - userfunp t)) - - (binding* - ((size (max +min-hash-table-size+ + kind -1)) + (let* ((size (max +min-hash-table-size+ ;; Our table sizes are capped by the 32-bit integers used as indices ;; into the chains. Prevent our code from failing if the user specified ;; most-positive-fixnum here. (fndb says that size is 'unsigned-byte') @@ -445,7 +436,25 @@ Examples: ;; not 1, to make it easier for the compiler to avoid ;; boxing. (rehash-threshold (max +min-hash-table-rehash-threshold+ - (float rehash-threshold $1.0))) ; always single-float + (float rehash-threshold $1.0)))) ; always single-float + (%make-hash-table + ;; compute flags. The stored KIND bits don't matter for a user-supplied hash + ;; and/or test fun, however we don't want to imply that it is an EQ table + ;; because EQ tables don't get a hash-vector allocated. + (logior (if weakness + (or (loop for i below 4 + when (eq (decode-hash-table-weakness i) weakness) + do (return (pack-ht-flags-weakness i))) + (bug "Unreachable")) + 0) + (pack-ht-flags-kind (logand kind 3)) ; kind -1 becomes 3 + (if (or weakness synchronized) hash-table-synchronized-flag 0) + (if (eql kind -1) hash-table-userfun-flag 0)) + test test-fun hash-fun + size rehash-size rehash-threshold)))) + +(defun %make-hash-table (flags test test-fun hash-fun size rehash-size rehash-threshold) + (binding* ( ;; KLUDGE: The most natural way of expressing the below is ;; (round (/ (float size) rehash-threshold)), and indeed ;; it was expressed like that until 0.7.0. However, @@ -463,7 +472,8 @@ Examples: (index-vector (make-array bucket-count :element-type 'hash-table-index :initial-element 0)) - (kv-vector (new-kv-vector size weakness)) + (weakp (logtest flags hash-table-weak-flag)) + (kv-vector (new-kv-vector size weakp)) ;; Needs to be the half the length of the KV vector to link ;; KV entries - mapped to indices at 2i and 2i+1 - ;; together. @@ -480,47 +490,43 @@ Examples: ;; it would need to know which pointer objects aren't hashed by address. ;; Conversely, we use a hash-vector for an EQ table if it has ;; a user-supplied hash function. - (hash-vector (when (or hash-function (neq test 'eq)) + (hash-vector (when (> (ht-flags-kind flags) 0) (make-array (1+ size) :element-type 'hash-table-index))) - (weakness-bits - (if weakness - (or (loop for i below 4 - when (eq (decode-hash-table-weakness i) weakness) - do (return (logior (ash i 4) hash-table-weak-flag))) - (bug "Unreachable")) - 0)) ((getter setter remover) - (if weakness + (if weakp (values #'gethash/weak #'puthash/weak #'remhash/weak) - (pick-table-methods synchronized userfunp test))) - (table (%make-hash-table - getter setter remover #'clrhash-impl - test test-fun hash-fun - rehash-size rehash-threshold - kv-vector index-vector next-vector hash-vector - (logior (if userfunp hash-table-userfun-flag 0) - (if (or weakness synchronized) hash-table-synchronized-flag 0) - weakness-bits)))) + (pick-table-methods (logtest flags hash-table-synchronized-flag) + (if (logtest flags hash-table-userfun-flag) + -1 + (ht-flags-kind flags))))) + (table + (%alloc-hash-table flags getter setter remover #'clrhash-impl + test test-fun hash-fun + rehash-size rehash-threshold + kv-vector index-vector next-vector hash-vector))) (declare (type index scaled-size)) ;; The trailing metadata element is either the table itself or the hash-vector ;; depending on weakness. Non-weak hashing vectors can be GCed without looking ;; at the table. Weak hashing vectors need the table. - (setf (kv-vector-table kv-vector) (if weakness table hash-vector)) - (when (or weakness synchronized) (install-hash-table-lock table)) - table))) - -(defun make-system-hash-table (&rest args &key (synchronized nil synchronizedp) finalizer - &allow-other-keys) - (setq args (copy-list args)) - (remf args :finalizer) - (let* ((ht (apply #'make-hash-table args)) - (flags (hash-table-flags ht))) - (when (and synchronizedp (not synchronized)) - (setf flags (logandc2 flags hash-table-synchronized-flag))) - (when finalizer - (setf flags (logior flags hash-table-finalizer-flag))) - (setf (%instance-ref ht (get-dsd-index hash-table flags)) flags) - ht)) + (setf (kv-vector-table kv-vector) (if weakp table hash-vector)) + (when (logtest flags hash-table-synchronized-flag) + (install-hash-table-lock table)) + table)) + +;;; a "plain" hash-table has nothing fancy: default size, default growth rate, +;;; not weak, not synchronized, not a user-defined hash fun and/or comparator. +(defun make-hash-table-using-defaults (kind) + (declare ((integer 0 3) kind)) + (let ((test (aref #(eq eql equal equalp) kind))) + (declare (optimize (safety 0))) ; skip FBOUNDP checks + (let ((test-fun (symbol-function test)) + (hash-fun (symbol-function + (aref #(eq-hash eql-hash equal-hash equalp-hash) kind)))) + (%make-hash-table (pack-ht-flags-kind kind) + test test-fun hash-fun + +min-hash-table-size+ + default-rehash-size + $1.0)))) ; rehash threshold ;;; I guess we might have more than one representation of a table, ;;; hence this small wrapper function. But why not for the others? @@ -1348,14 +1354,19 @@ nnnn 1_ any linear scan (t (values default nil))))) -(defun pick-table-methods (synchronized userp test) - (macrolet ((gen-cases (wrapping) - `(case test - (eq (,wrapping gethash/eq puthash/eq remhash/eq)) - (eql (,wrapping gethash/eql puthash/eql remhash/eql)) - (equal (,wrapping gethash/equal puthash/equal remhash/equal)) - (t (,wrapping gethash/equalp puthash/equalp remhash/equalp)))) - (locked-methods (getter setter remover) +(defun pick-table-methods (synchronized kind) + (declare ((integer -1 3) kind)) + ;; test is specified as 0..3 for a standard fun or -1 for userfun + (macrolet ((gen-cases (wrapping) + `(case kind + (-1 (,wrapping gethash/any puthash/any remhash/any)) + (0 (,wrapping gethash/eq puthash/eq remhash/eq)) + (1 (,wrapping gethash/eql puthash/eql remhash/eql)) + (2 (,wrapping gethash/equal puthash/equal remhash/equal)) + (3 (,wrapping gethash/equalp puthash/equalp remhash/equalp)))) + (locked-methods (getter setter remover) + ;; We might want to think about inlining the guts of CALL-WITH-...LOCK + ;; into these methods ;; Use the private slot accessor, because we know that the mutex ;; has been constructed. `(values (named-lambda ,(symbolicate getter "/LOCK") (key table default) @@ -1376,15 +1387,11 @@ nnnn 1_ any linear scan (sb-thread::with-recursive-system-lock ((hash-table-%lock (truly-the hash-table table))) (,remover key table)))))) - (methods (getter setter remover) + (methods (getter setter remover) `(values #',getter #',setter #',remover))) - (if userp - (if synchronized - (locked-methods gethash/any puthash/any remhash/any) - (methods gethash/any puthash/any remhash/any)) - (if synchronized - (gen-cases locked-methods) - (gen-cases methods))))) + (if synchronized + (gen-cases locked-methods) + (gen-cases methods)))) ;;; Three argument version of GETHASH (defun gethash3 (key hash-table default) diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index b4c82e0bf7..dae41694d3 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -250,7 +250,7 @@ static inline boolean layout_bitmap_logbitp(int index, lispobj bitmap) /* Keep in sync with 'target-hash-table.lisp' */ #define hashtable_weakp(ht) (ht->flags & (8<flags >> (4+N_FIXNUM_TAG_BITS)) +#define hashtable_weakness(ht) (ht->flags >> (6+N_FIXNUM_TAG_BITS)) #if defined(LISP_FEATURE_GENCGC) From 3753ef94938933a8a435e70e61d816aa6ef4c1c8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 13 Jun 2020 22:31:07 -0400 Subject: [PATCH 0117/4023] Make 'print' and 'reader' amenable to slam.sh We need not to lose the specialization recorded for global constant arrays. There's no way to know in MAKE-ARRAY that it will be stored in a defconstant, so just force the issue by adding a keyword. It's not pretty, but unless somebody is extremely motivated to attempt the other approach outlined in specializable-array, it'll have to do. We bit the bullet on CL:FLOAT etc, so it might be no more tedious to shadow CL:ARRAY with SB-XC:ARRAY as a structure that carries around one extra piece of information. It won't be fun, and won't have a high payoff - all it would achieve is removal of the new keyword arg from SB-XC:MAKE-ARRAY. --- src/code/print.lisp | 12 ++++++++---- src/code/reader.lisp | 6 ++++-- src/code/specializable-array.lisp | 19 +++++++++++++++---- src/cold/compile-cold-sbcl.lisp | 6 +++++- src/cold/shared.lisp | 8 +------- 5 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/code/print.lisp b/src/code/print.lisp index 7ded984d39..38117df113 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -488,16 +488,19 @@ variable: an unreadable object representing the error is printed instead.") ;;; For each character, the value of the corresponding element is the ;;; lowest base in which that character is a digit. -(defconstant +digit-bases+ +(defconstant-eqx +digit-bases+ #.(let ((a (sb-xc:make-array 128 ; FIXME + :retain-specialization-for-after-xc-core t :element-type '(unsigned-byte 8) :initial-element 36))) (dotimes (i 36 a) (let ((char (digit-char i 36))) - (setf (aref a (sb-xc:char-code char)) i))))) + (setf (aref a (sb-xc:char-code char)) i)))) + #'equalp) -(defconstant +character-attributes+ +(defconstant-eqx +character-attributes+ #.(let ((a (sb-xc:make-array 160 ; FIXME + :retain-specialization-for-after-xc-core t :element-type '(unsigned-byte 16) :initial-element 0))) (flet ((set-bit (char bit) @@ -529,7 +532,8 @@ variable: an unreadable object representing the error is printed instead.") (dotimes (i 160) ; FIXME (when (zerop (aref a i)) (setf (aref a i) funny-attribute)))) - a)) + a) + #'equalp) ;;; A FSM-like thingie that determines whether a symbol is a potential ;;; number or has evil characters in it. diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 44e3572a46..5eeff4f972 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -213,8 +213,9 @@ ;;; properties of characters (as long as they are constituents). ;;; FIXME: this initform is considered too hairy to assign (a constant array, really?) ;;; if changed to DEFCONSTANT-EQX, which makes this file unslammable as-is. Oh well. -(defconstant +constituent-trait-table+ +(defconstant-eqx +constituent-trait-table+ #.(let ((a (sb-xc:make-array base-char-code-limit + :retain-specialization-for-after-xc-core t :element-type '(unsigned-byte 8)))) (fill a +char-attr-constituent+) (flet ((!set-constituent-trait (char trait) @@ -245,7 +246,8 @@ (dolist (c (list backspace-char-code tab-char-code form-feed-char-code return-char-code rubout-char-code)) (!set-constituent-trait (code-char c) +char-attr-invalid+))) - a)) + a) + #'equalp) (declaim (inline get-constituent-trait)) (defun get-constituent-trait (char) diff --git a/src/code/specializable-array.lisp b/src/code/specializable-array.lisp index 1854ceeed8..2cbfd9edb8 100644 --- a/src/code/specializable-array.lisp +++ b/src/code/specializable-array.lisp @@ -52,9 +52,13 @@ ;; Because this is not performance-critical, we can just punt to a function. ;; If no contents given, explicitly 0-fill in case element-type upgrades to T ;; and would get a default of NIL where we would use 0 in our specialization. + +(defvar *array-to-specialization* (make-hash-table :test #'eq)) + (defun sb-xc:make-array (dims &key (element-type 't) (initial-contents nil contentsp) - (initial-element 0)) + (initial-element 0) + (retain-specialization-for-after-xc-core)) ;; ECL fails to compile MAKE-ARRAY when keyword args are not literal keywords. e.g.: ;; (DEFUN TRY (DIMS SELECT VAL) ;; (MAKE-ARRAY DIMS (IF SELECT :INITIAL-CONTENTS :INITIAL-ELEMENT) VAL)) -> @@ -79,15 +83,22 @@ (if contentsp :initial-contents :initial-element) (if contentsp initial-contents initial-element)))) (unless (eq element-type 't) - (setf (gethash array sb-cold::*array-to-specialization*) element-type)) + (setf (gethash array *array-to-specialization*) + (cons element-type retain-specialization-for-after-xc-core))) array)) (defun sb-xc:array-element-type (array) - (cond ((gethash array sb-cold::*array-to-specialization*)) + (cond ((car (gethash array *array-to-specialization*))) ((bit-vector-p array) 'bit) ((stringp array) 'base-char) (t t))) (defun target-specialized-array-p (array) - (gethash array sb-cold::*array-to-specialization*)) + (if (gethash array *array-to-specialization*) t nil)) (deftype sb-xc:simple-vector () '(and cl:simple-vector (not (satisfies target-specialized-array-p)))) + +(defun sb-cold::clear-specialized-array-registry () + (let ((registry *array-to-specialization*)) + (maphash (lambda (key value) + (unless (cdr value) (remhash key registry))) ; cdr = "retain" + registry))) diff --git a/src/cold/compile-cold-sbcl.lisp b/src/cold/compile-cold-sbcl.lisp index 4880c1eff2..d696641b86 100644 --- a/src/cold/compile-cold-sbcl.lisp +++ b/src/cold/compile-cold-sbcl.lisp @@ -195,4 +195,8 @@ (unless (position :not-target flags) (format t "~&[~D/~D] ~A" (incf n) total (stem-remap-target stem)) (target-compile-stem stem flags) - (terpri))))))))) + (terpri) + ;; The specialized array registry has file-wide scope. Hacking that aspect + ;; into the xc build scaffold seemed slightly easier than hacking the + ;; compiler (i.e. making the registry a slot of the fasl-output struct) + (clear-specialized-array-registry))))))))) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 7b14a573c6..43dec40a6f 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -402,18 +402,12 @@ ;; just to avoid that ugly mess. nil)) -;;; The specialized array registry has file-wide scope. Hacking that aspect -;;; into the xc build scaffold seemed slightly easier than hacking the -;;; compiler (i.e. making the registry a slot of the fasl-output struct) -(defvar *array-to-specialization* (make-hash-table :test #'eq)) - (defmacro do-stems-and-flags ((stem flags build-phase) &body body) (let ((stem-and-flags (gensym "STEM-AND-FLAGS"))) `(dolist (,stem-and-flags (get-stems-and-flags ,build-phase)) (let ((,stem (first ,stem-and-flags)) (,flags (rest ,stem-and-flags))) - ,@body - (clrhash *array-to-specialization*))))) + ,@body)))) ;;; Given a STEM, remap the path component "/target/" to a suitable ;;; target directory. From 8517cb99e6b6042e725b7430227a9c98c001fdd4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 13 Jun 2020 23:37:39 -0400 Subject: [PATCH 0118/4023] Fix suboptimal REHASH Rehashing would unconditionally set the flag for address-based hashing on all EQ hash-tables which caused scan_nonweak_kv_vector() to take the slow path. I thought maybe I caused this bug, but nope, it's from the beginning of time. --- src/code/target-hash-table.lisp | 23 +++++++++++++---------- tests/hash-table.impure.lisp | 7 +++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index aa4b4b3e4b..0bb6256ac9 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -60,6 +60,9 @@ ;; the lightest-weight in terms of speed, so I'm letting everything use ;; address-based hashing, unlike the other standard hash-table hash functions ;; which try use the hash slot of certain objects. + ;; Note also that as we add logic into the EQ-HASH function to decide whether + ;; the hash is address-based, we either have to replicate that logic into + ;; rehashing, or else actually call EQ-HASH to decide for us. (values (pointer-hash key) (sb-vm:is-lisp-pointer (get-lisp-obj-address key)))) @@ -673,12 +676,12 @@ multiple threads accessing the same hash-table without locking." ;; Scan backwards so that chains are in ascending index order. (do ((i hwm (1- i))) ((zerop i)) (declare (type index/2 i)) - (with-pair (pair-key pair-val) + (with-pair (key val) ;; It's unclear why we check for key AND value being empty - a half ;; empty cell could only appear mid-insertion, but concurrent ;; insert is forbidden, so how could it happen? ;; i.e. I would think KEY emptiness is an adequate test. - (cond ((and (empty-ht-slot-p pair-key) (empty-ht-slot-p pair-val)) + (cond ((and (empty-ht-slot-p key) (empty-ht-slot-p val)) ;; Slot is empty, push it onto free list. (setf (aref next-vector i) next-free next-free i)) ((/= (aref hash-vector i) +magic-hash-vector-value+) @@ -689,17 +692,16 @@ multiple threads accessing the same hash-table without locking." ;; Precise GC platforms can move any key except the ones which ;; are explicitly pinned. (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) - (push-in-chain (pointer-hash->bucket - (pointer-hash pair-key) mask)))))) + (push-in-chain (pointer-hash->bucket (pointer-hash key) mask)))))) (do ((i hwm (1- i))) ((zerop i)) (declare (type index/2 i)) - (with-pair (pair-key pair-val) - (cond ((and (empty-ht-slot-p pair-key) (empty-ht-slot-p pair-val)) + (with-pair (key val) + (cond ((and (empty-ht-slot-p key) (empty-ht-slot-p val)) (setf (aref next-vector i) next-free next-free i)) (t - (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) - (push-in-chain (pointer-hash->bucket - (pointer-hash pair-key) mask))))))) + (when (sb-vm:is-lisp-pointer (get-lisp-obj-address key)) + (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype)) + (push-in-chain (pointer-hash->bucket (pointer-hash key) mask))))))) ;; This is identical to the calculation of next-free-kv in INSERT-AT. (cond ((/= next-free 0) next-free) ((= hwm (hash-table-pairs-capacity kv-vector)) 0) @@ -764,7 +766,8 @@ multiple threads accessing the same hash-table without locking." (declare (type index/2 i)) (with-pair (pair-key) (unless (empty-ht-slot-p pair-key) - (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) + (when (sb-vm:is-lisp-pointer (get-lisp-obj-address pair-key)) + (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype)) (push-in-chain (pointer-hash->bucket (pointer-hash pair-key) mask)) (when (eq pair-key key) (setq result key-index)))))) diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 79d9a415c1..93fd913d2a 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -74,3 +74,10 @@ ;; but let's not be too sensitive to the exact bin count in use. ;; It's a heck of a lot better than everything in 1 bin. (assert (> bins-used 40))))) + +(with-test (:name :rehash-no-spurious-address-sensitivity) + (let ((h (make-hash-table :test 'eq))) + (dotimes (i 100) + (setf (gethash i h) (- i))) + (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs h)) + sb-vm:vector-hashing-subtype)))) From 9c89b02fcdba39f4c40869996bd9289aa35b3c67 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 14 Jun 2020 00:08:17 -0400 Subject: [PATCH 0119/4023] Remove unusable stub function No vop for it, so it was just an infinite loop --- src/code/pred.lisp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/code/pred.lisp b/src/code/pred.lisp index f270079309..7146aa0d31 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -89,7 +89,6 @@ ;; the type it tests for in the Common Lisp type system, and since it's ;; only used in the implementation of a few specialized things.) (def-type-predicate-wrapper double-float-p) - (def-type-predicate-wrapper extended-char-p) (def-type-predicate-wrapper fdefn-p) (def-type-predicate-wrapper fixnump) (def-type-predicate-wrapper floatp) From 42c50ed982581314123745c2067458cdbfc0c9cb Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 14 Jun 2020 00:09:38 -0400 Subject: [PATCH 0120/4023] Fix aprof --- src/code/aprof.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/aprof.lisp b/src/code/aprof.lisp index ec4f56688f..114cb60aa5 100644 --- a/src/code/aprof.lisp +++ b/src/code/aprof.lisp @@ -456,12 +456,12 @@ ;;; Return a name for PC-OFFS in CODE. PC-OFFSET is relative ;;; to CODE-INSTRUCTIONS. (defun pc-offs-to-fun-name (pc-offs code &aux (di (%code-debug-info code))) - (if (consp di) ; assembler routines + (if (hash-table-p di) ; assembler routines (block nil (maphash (lambda (k v) ; FIXME: OAOO violation, at least twice over (when (<= (car v) pc-offs (cadr v)) (return k))) - (car di))) + di)) (let* ((funmap (sb-c::compiled-debug-info-fun-map di))) (unless (sb-c::compiled-debug-fun-next funmap) (aver (typep funmap 'sb-c::compiled-debug-fun-toplevel)) From 49d996e067e72098a08e4ed4a293dc3f212efb5f Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 14 Jun 2020 21:29:38 +0300 Subject: [PATCH 0121/4023] Don't sort ir2-block-global-tns by tn-number. It doesn't seem that that property is used anywhere, and it's slow when there's a lot of TNs. --- src/compiler/life.lisp | 13 +++---------- src/compiler/vop.lisp | 3 +-- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/compiler/life.lisp b/src/compiler/life.lisp index efe1e98c57..15b5397a20 100644 --- a/src/compiler/life.lisp +++ b/src/compiler/life.lisp @@ -41,16 +41,9 @@ ;;; Do the actual insertion of the conflict NEW into BLOCK's global ;;; conflicts. (defun insert-block-global-conflict (new block) - (let ((global-num (tn-number (global-conflicts-tn new)))) - (do ((prev nil conf) - (conf (ir2-block-global-tns block) - (global-conflicts-next-blockwise conf))) - ((or (null conf) - (> (tn-number (global-conflicts-tn conf)) global-num)) - (if prev - (setf (global-conflicts-next-blockwise prev) new) - (setf (ir2-block-global-tns block) new)) - (setf (global-conflicts-next-blockwise new) conf)))) + ;; This used to keep the TNs sorted by TN-NUMBER, but appears to be + ;; unnecessary. + (shiftf (global-conflicts-next-blockwise new) (ir2-block-global-tns block) new) (values)) ;;; Reset the CURRENT-CONFLICT slot in all packed TNs to point to the diff --git a/src/compiler/vop.lisp b/src/compiler/vop.lisp index 8e643ada81..5eb1f59bdd 100644 --- a/src/compiler/vop.lisp +++ b/src/compiler/vop.lisp @@ -1110,8 +1110,7 @@ (:copier nil)) ;; the IR2-BLOCK that this structure represents the conflicts for (block (missing-arg) :type ir2-block) - ;; thread running through all the GLOBAL-CONFLICTSs for BLOCK. This - ;; thread is sorted by TN number + ;; thread running through all the GLOBAL-CONFLICTSs for BLOCK. (next-blockwise nil :type (or global-conflicts null)) ;; the way that TN is used by BLOCK ;; From 1f527bd0d7ccc3352fc9f5f65af2c627647134d4 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 14 Jun 2020 22:14:53 +0300 Subject: [PATCH 0122/4023] Missing changes. --- src/compiler/debug.lisp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/compiler/debug.lisp b/src/compiler/debug.lisp index 0038c8f028..c3a1554ab3 100644 --- a/src/compiler/debug.lisp +++ b/src/compiler/debug.lisp @@ -759,11 +759,6 @@ (global-conflicts-next-blockwise conf)) (prev nil conf)) ((null conf)) - (when prev - (unless (> (tn-number (global-conflicts-tn conf)) - (tn-number (global-conflicts-tn prev))) - (barf "~S and ~S out of order in ~S" prev conf block))) - (unless (find-in #'global-conflicts-next-tnwise conf (tn-global-conflicts From fedb5a8420c4e63d78c84cede66161cea411de66 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 14 Jun 2020 15:33:03 -0400 Subject: [PATCH 0123/4023] Fix spelling --- contrib/sb-md5/md5.lisp | 2 +- src/code/hash-table.lisp | 2 +- src/code/reader.lisp | 2 +- src/compiler/early-globaldb.lisp | 4 +-- src/compiler/generic/genesis.lisp | 2 +- src/compiler/globaldb.lisp | 4 +-- src/compiler/info-vector.lisp | 50 +++++++++++++++---------------- tests/info.before-xc.lisp | 16 +++++----- tests/info.impure.lisp | 2 +- 9 files changed, 42 insertions(+), 42 deletions(-) diff --git a/contrib/sb-md5/md5.lisp b/contrib/sb-md5/md5.lisp index a737b70e86..c8a0f1c2cd 100644 --- a/contrib/sb-md5/md5.lisp +++ b/contrib/sb-md5/md5.lisp @@ -132,7 +132,7 @@ where a is the intended low-order byte and d the high-order byte." #-lw-int32 `(aref ,vector ,index)) -;;; Section 3.4: Auxilliary functions +;;; Section 3.4: Auxiliary functions (declaim (inline f g h i) (ftype (function (ub32 ub32 ub32) ub32) f g h i)) diff --git a/src/code/hash-table.lisp b/src/code/hash-table.lisp index 46a67895e3..f67e8b43ea 100644 --- a/src/code/hash-table.lisp +++ b/src/code/hash-table.lisp @@ -55,7 +55,7 @@ ;;; [0] = high-water-mark ;;; [1] = rehash-due-to-GC indicator ;;; ... -;;; [length-1] = auxilliary info depending on kind of table +;;; [length-1] = auxiliary info depending on kind of table ;;; See KV-VECTOR-AUX-INFO in 'target-hash-table' ;;; HASH-TABLE is implemented as a STRUCTURE-OBJECT. diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 5eeff4f972..49057e75be 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -565,7 +565,7 @@ standard Lisp readtable when NIL." ;; Counter advanced as characters are placed into 'string' (fill-ptr 0 :type index) ;; Counter advanced as characters are consumed from 'string' on re-scan - ;; by auxilliary functions MAKE-{INTEGER,FLOAT,RATIONAL} etc. + ;; by auxiliary functions MAKE-{INTEGER,FLOAT,RATIONAL} etc. (cursor 0 :type index) ;; A string used only for FIND-PACKAGE calls in package-qualified ;; symbols so that we don't need to call SUBSEQ on the 'string'. diff --git a/src/compiler/early-globaldb.lisp b/src/compiler/early-globaldb.lisp index be964cba4c..30f5dd4b1d 100644 --- a/src/compiler/early-globaldb.lisp +++ b/src/compiler/early-globaldb.lisp @@ -81,7 +81,7 @@ (defconstant +info-metainfo-type-num+ 0) ;; Refer to info-vector.lisp for the meaning of this constant. -(defconstant +no-auxilliary-key+ 0) +(defconstant +no-auxiliary-key+ 0) ;;; Return the globaldb info for SYMBOL. With respect to the state diagram ;;; presented at the definition of SYMBOL-PLIST, if the object in SYMBOL's @@ -122,7 +122,7 @@ (defmacro !get-meta-infos (kind) `(let* ((info-vector (symbol-info-vector ,kind)) (index (if info-vector - (packed-info-value-index info-vector +no-auxilliary-key+ + (packed-info-value-index info-vector +no-auxiliary-key+ +info-metainfo-type-num+)))) (if index (svref info-vector index)))) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 7a956dbeb3..2351dfa9c7 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1947,7 +1947,7 @@ core and return a descriptor to it." (setf (gethash symbol hashtable) (packed-info-insert (gethash symbol hashtable +nil-packed-infos+) - sb-impl::+no-auxilliary-key+ num cold-classoid-cell))) + sb-impl::+no-auxiliary-key+ num cold-classoid-cell))) *classoid-cells*)) hashtable) diff --git a/src/compiler/globaldb.lisp b/src/compiler/globaldb.lisp index bce24dc45d..0af79b02c0 100644 --- a/src/compiler/globaldb.lisp +++ b/src/compiler/globaldb.lisp @@ -186,7 +186,7 @@ (if old ;; if -REMOVE => nil, then update NEW but return OLD (or (setq new (packed-info-remove - old +no-auxilliary-key+ info-numbers)) + old +no-auxiliary-key+ info-numbers)) old)))) (info-puthash *info-environment* name #'clear-hairy))) (not (null new)))) @@ -234,7 +234,7 @@ ;; but constraint propagation isn't informing the compiler here. :simple (values (symbol-info-vector (truly-the symbol key1)) key2) :hairy (values (info-gethash name *info-environment*) - +no-auxilliary-key+))) + +no-auxiliary-key+))) (when vector (let ((index (packed-info-value-index vector aux-key info-number))) (when index diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index 80819f54c0..a276854c61 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -62,7 +62,7 @@ ;;; A "group" comprises all the info for a particular Name, and its list ;;; of types may may span descriptors, though rarely. -;;; An "auxilliary key" is the first element of a 2-list Name. It is interposed +;;; An "auxiliary key" is the first element of a 2-list Name. It is interposed ;;; within the data portion of the vector after the preceding info group. ;;; Descriptors are self-delimiting in that the first field in a group ;;; indicates the number of additional fields in the group. @@ -71,8 +71,8 @@ ;;; ---------------------- ;;; This representation is used transiently during insertion/deletion. ;;; It is a concatenation of plists as a vector, interposing at the splice -;;; points the auxilliary key for the group, except for the root name which -;;; does not store an auxilliary key. +;;; points the auxiliary key for the group, except for the root name which +;;; does not store an auxiliary key. ;;; ;;; Unpacked vector format looks like: ;;; @@ -82,7 +82,7 @@ ;;; ^ ;;; info group for the primary Name, a/k/a "root symbol", starts here ;;; -;;; One can envision that the first info group stores its auxilliary key +;;; One can envision that the first info group stores its auxiliary key ;;; at vector index -1 when thinking about the correctness of algorithms ;;; that process unpacked info-vectors. ;;; See !TEST-PACKIFY-INFOS for examples of each format. @@ -127,7 +127,7 @@ (declare (type index index end n-fields)) (loop ;; 'length' is the number of vector elements in this info group, - ;; including itself but not including its auxilliary key. + ;; including itself but not including its auxiliary key. (let ((length (the index (svref vector index)))) ;; Divide by 2 because we only count one field for the entry, but the ;; input vector had 2 cells per entry. Add 1 because the group's field @@ -258,7 +258,7 @@ (nreverse list))))) ;; Compute the number of elements needed to hold packed VECTOR after unpacking. -;; The unpacked size is the number of auxilliary keys plus the number of entries +;; The unpacked size is the number of auxiliary keys plus the number of entries ;; @ 2 cells per entry, plus the number of length cells which indicate the ;; number of data cells used (including length cells but not aux key cells). ;; Equivalently, it's the number of packed fields times 2 minus 1. @@ -266,7 +266,7 @@ (defun compute-unpackified-info-size (vector) (declare (simple-vector vector)) (!do-packed-info-vector-aux-key (vector) () - ;; off-by-one: the first info group's auxilliary key is imaginary + ;; off-by-one: the first info group's auxiliary key is imaginary (1- (truly-the fixnum (ash total-n-fields 1))))) ;; Convert packed INPUT vector to unpacked. @@ -293,12 +293,12 @@ (return (if output-supplied-p nil output))))))) ; else done ;; Return the index of the 'length' item for an info group having -;; auxilliary-key KEY in unpacked VECTOR bounded by END (exclusive), +;; auxiliary-key KEY in unpacked VECTOR bounded by END (exclusive), ;; or NIL if not found. ;; (defun info-find-aux-key/unpacked (key vector end) (declare (type index end)) - (if (eql key +no-auxilliary-key+) + (if (eql key +no-auxiliary-key+) 0 ; the first group's length (= end) is stored here always (let ((index 0)) (declare (type index index)) @@ -311,7 +311,7 @@ ((eq (svref vector (1- index)) key) (return index))))))) -;; In packed info VECTOR try to find the auxilliary key SYMBOL. +;; In packed info VECTOR try to find the auxiliary key SYMBOL. ;; If found, return indices of its data, info descriptor word, and field. ;; If not found, the first value is NIL and the descriptor indices ;; arbitrarily point to the next available descriptor field. @@ -367,7 +367,7 @@ (declare (simple-vector input) (type info-number info-number)) (let* ((n-extra-elts ;; Test if the aux-key has been seen before or needs to be added. - (if (and (not (eql aux-key +no-auxilliary-key+)) + (if (and (not (eql aux-key +no-auxiliary-key+)) (not (info-find-aux-key/packed input aux-key))) 4 ; need space for [aux-key, length, type-num, value] 2)) ; only space for [type-num, value] @@ -457,7 +457,7 @@ (declaim (maybe-inline packed-info-insert)) (defun packed-info-insert (vector aux-key info-number newval) - (if (and (eql aux-key +no-auxilliary-key+) + (if (and (eql aux-key +no-auxiliary-key+) (info-quickly-insertable-p vector)) (quick-packed-info-insert vector info-number newval) (%packed-info-insert vector aux-key info-number newval))) @@ -470,7 +470,7 @@ (let ((data-idx (length vector)) (descriptor-idx 0) (field-idx 0)) (declare (type index descriptor-idx) (type (mod #.+infos-per-word+) field-idx)) - (unless (eql aux-key +no-auxilliary-key+) + (unless (eql aux-key +no-auxiliary-key+) (multiple-value-setq (data-idx descriptor-idx field-idx) (info-find-aux-key/packed vector aux-key)) (unless data-idx @@ -504,7 +504,7 @@ swath (min n-infos +infos-per-word+)))))) ;; Helper for CLEAR-INFO-VALUES when Name has the efficient form. -;; Given packed info-vector INPUT and auxilliary key KEY2 +;; Given packed info-vector INPUT and auxiliary key KEY2 ;; return a new vector in which TYPE-NUMS are absent. ;; When none of TYPE-NUMs were present to begin with, return NIL. ;; @@ -514,7 +514,7 @@ (defun packed-info-remove (input key2 type-nums) (declare (simple-vector input)) (when (or (eql (length input) (length +nil-packed-infos+)) - (and (not (eql key2 +no-auxilliary-key+)) + (and (not (eql key2 +no-auxiliary-key+)) (not (info-find-aux-key/packed input key2)))) (return-from packed-info-remove nil)) ; do nothing (let* ((end (compute-unpackified-info-size input)) @@ -533,7 +533,7 @@ return probe))) ;; N.B. the early termination checks aren't just optimizations, ;; they're requirements, because otherwise the loop could smash - ;; data that does not belong to this auxilliary key. + ;; data that does not belong to this auxiliary key. (cond ((not i)) ; not found - ignore ;; Squash out 2 cells if deleting an info for primary name, ;; or for secondary name with at least one more entry. @@ -616,7 +616,7 @@ (return)))))) #| -Info packing example. This example has 2 auxilliary-keys: SETF and CAS. +Info packing example. This example has 2 auxiliary-keys: SETF and CAS. (!test-packify-infos '(13 :XYZ 18 "nine" 28 :BAR 7 T) '(SETF 8 NIL 17 :FGX) @@ -630,8 +630,8 @@ Reading from right-to-left, converting each 2-digit octal number to decimal: 4, 13, 18, 28, 7, 2, 8, 17, 3, 6, 2, 47 Which is interpreted as: 4 infos for the root name. type numbers: 13, 18, 28, 7 - 2 infos for SETF auxilliary-key. type numbers: 8, 17 - 3 infos for CAS auxilliary-key. type numbers: 6, 2, 47 + 2 infos for SETF auxiliary-key. type numbers: 8, 17 + 3 infos for CAS auxiliary-key. type numbers: 6, 2, 47 (unpackify-infos (!test-packify-infos ...)) ; same input => #(9 13 :XYZ 18 "nine" 28 :BAR 7 T @@ -677,12 +677,12 @@ This is interpreted as ;; If NAME is "simple", bind KEY2 and KEY1 to the elements ;; in that order, and execute the SIMPLE code, otherwise execute the HAIRY code. ;; If ALLOW-ATOM is T - the default - then NAME can be just a symbol -;; in which case its second component is +NO-AUXILLIARY-KEY+. +;; in which case its second component is +NO-AUXILIARY-KEY+. ;; (defmacro with-globaldb-name ((key1 key2 &optional (allow-atom t)) name &key simple hairy) (with-unique-names (rest) - `(let ((,key1 ,name) (,key2 +NO-AUXILLIARY-KEY+)) + `(let ((,key1 ,name) (,key2 +NO-AUXILIARY-KEY+)) (if (or ,@(if allow-atom `((symbolp ,key1))) (if (listp ,key1) (let ((,rest (cdr ,key1))) @@ -704,7 +704,7 @@ This is interpreted as #+sb-xc-host (defun update-symbol-info (symbol update-fn) ;; Never pass NIL to an update-fn. Pass the minimal info-vector instead, - ;; a vector describing 0 infos and 0 auxilliary keys. + ;; a vector describing 0 infos and 0 auxiliary keys. (let ((newval (funcall update-fn (or (symbol-info-vector symbol) +nil-packed-infos+)))) (when newval @@ -797,7 +797,7 @@ This is interpreted as ;; INFO-PUTHASH supplies NIL for OLD-INFO if NAME was absent. (dx-flet ((hairy-name (old-info) (augment (or old-info +nil-packed-infos+) - +no-auxilliary-key+))) + +no-auxiliary-key+))) (info-puthash *info-environment* name #'hairy-name))))) new-value) @@ -837,7 +837,7 @@ This is interpreted as ;; INFO-PUTHASH supplies NIL for OLD-INFO if NAME was absent. (dx-flet ((hairy-name (old-info) (augment (or old-info +nil-packed-infos+) - +no-auxilliary-key+))) + +no-auxiliary-key+))) (info-puthash *info-environment* name #'hairy-name)))) new-value)) @@ -878,7 +878,7 @@ This is interpreted as ;; INFO-PUTHASH supplies NIL for OLD-INFO if NAME was absent. (dx-flet ((hairy-name (old-info) (or (get-or-set (or old-info +nil-packed-infos+) - +no-auxilliary-key+) + +no-auxiliary-key+) ;; Return OLD-INFO to elide writeback. Unlike for ;; UPDATE-SYMBOL-INFO, NIL is not a no-op marker. old-info))) diff --git a/tests/info.before-xc.lisp b/tests/info.before-xc.lisp index a60fc7622e..dd2925f307 100644 --- a/tests/info.before-xc.lisp +++ b/tests/info.before-xc.lisp @@ -24,29 +24,29 @@ (in-package "SB-IMPL") -(let ((foo-iv (packed-info-insert +nil-packed-infos+ +no-auxilliary-key+ +(let ((foo-iv (packed-info-insert +nil-packed-infos+ +no-auxiliary-key+ 5 "hi 5")) - (bar-iv (packed-info-insert +nil-packed-infos+ +no-auxilliary-key+ + (bar-iv (packed-info-insert +nil-packed-infos+ +no-auxiliary-key+ 6 "hi 6")) (baz-iv (packed-info-insert +nil-packed-infos+ 'mumble 9 :phlebs))) ;; removing nonexistent types returns NIL - (assert (equal nil (packed-info-remove foo-iv +no-auxilliary-key+ + (assert (equal nil (packed-info-remove foo-iv +no-auxiliary-key+ '(4 6 7)))) (assert (equal nil (packed-info-remove baz-iv 'mumble '(4 6 7)))) ;; removing the one info shrinks the vector to nothing ;; and all values of nothing are EQ - (assert (equalp #(0) (packed-info-remove foo-iv +no-auxilliary-key+ '(5)))) - (assert (eq (packed-info-remove foo-iv +no-auxilliary-key+ '(5)) - (packed-info-remove bar-iv +no-auxilliary-key+ '(6)))) - (assert (eq (packed-info-remove foo-iv +no-auxilliary-key+ '(5)) + (assert (equalp #(0) (packed-info-remove foo-iv +no-auxiliary-key+ '(5)))) + (assert (eq (packed-info-remove foo-iv +no-auxiliary-key+ '(5)) + (packed-info-remove bar-iv +no-auxiliary-key+ '(6)))) + (assert (eq (packed-info-remove foo-iv +no-auxiliary-key+ '(5)) (packed-info-remove baz-iv 'mumble '(9))))) ;; Test that the packing invariants are maintained: ;; 1. if an FDEFINITION is present in an info group, it is the *first* info -;; 2. if SETF is an auxilliary key, it is the *first* aux key +;; 2. if SETF is an auxiliary key, it is the *first* aux key (let ((vect +nil-packed-infos+) (s 'foo)) (flet ((iv-put (aux-key number val) diff --git a/tests/info.impure.lisp b/tests/info.impure.lisp index 6f04dd4acc..f2b9bfa2a0 100644 --- a/tests/info.impure.lisp +++ b/tests/info.impure.lisp @@ -178,7 +178,7 @@ (let ((val (format nil "value for ~D" num))) (setq iv1 (quick-packed-info-insert iv1 num val) iv2 (%packed-info-insert ; not PACKED-INFO-INSERT - iv2 +no-auxilliary-key+ num val)) + iv2 +no-auxiliary-key+ num val)) (assert (equalp iv1 iv2)))) ;; the first and only info descriptor should be full (assert (not (info-quickly-insertable-p iv1)))))) From b8021e2035fd749a79287aa31e15e60e263a8adc Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 14 Jun 2020 16:47:54 -0400 Subject: [PATCH 0124/4023] Tighten up get_array_data() Do not let it silently return NIL. --- src/code/target-hash-table.lisp | 18 +++--- src/runtime/gc-common.c | 98 ++++++++++++++------------------- src/runtime/runtime.h | 5 +- 3 files changed, 55 insertions(+), 66 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 0bb6256ac9..2a408ba313 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -286,9 +286,9 @@ Examples: ;; read/modify/write on the header. In C there's sync_or_and_fetch, etc. (defmacro kv-vector-needs-rehash (vector) `(svref ,vector 1)) -;;; The 'table' points to the hash-table if the table is weak, +;;; The 'supplement' points to the hash-table if the table is weak, ;;; or to the hash vector if the table is not weak. -(defmacro kv-vector-table (pairs) `(svref ,pairs (1- (length ,pairs)))) +(defmacro kv-vector-supplement (pairs) `(svref ,pairs (1- (length ,pairs)))) (declaim (inline set-kv-hwm)) ; can't setf data-vector-ref (defun set-kv-hwm (vector hwm) (setf (svref vector 0) hwm)) @@ -299,6 +299,10 @@ Examples: :initial-element +empty-ht-slot+))) (setf (kv-vector-high-water-mark v) 0) (setf (kv-vector-needs-rehash v) 0) + ;; GC will see the vector as a hashing vector as soon as HASHING-SUBTYPE + ;; is set, so it needs to see a valid value in the 'supplement' slot. + ;; Neither 0 nor +empty-ht-slot+ is a valid value. + (setf (kv-vector-supplement v) nil) (set-header-data v (if ,weakp (logior sb-vm:vector-weak-subtype sb-vm:vector-hashing-subtype) @@ -511,7 +515,7 @@ Examples: ;; The trailing metadata element is either the table itself or the hash-vector ;; depending on weakness. Non-weak hashing vectors can be GCed without looking ;; at the table. Weak hashing vectors need the table. - (setf (kv-vector-table kv-vector) (if weakp table hash-vector)) + (setf (kv-vector-supplement kv-vector) (if weakp table hash-vector)) (when (logtest flags hash-table-synchronized-flag) (install-hash-table-lock table)) table)) @@ -820,7 +824,7 @@ multiple threads accessing the same hash-table without locking." ;; Clearing the weakness causes all entries to stay alive. ;; Furthermore, clearing both makes the trailing metadata ignorable. (set-header-data old-kv-vector sb-vm:vector-hashing-subtype) - (setf (kv-vector-table old-kv-vector) 0) + (setf (kv-vector-supplement old-kv-vector) 0) ;; The high-water-mark remains unchanged. ;; Set this before copying pairs, otherwise they would not be seen @@ -835,7 +839,7 @@ multiple threads accessing the same hash-table without locking." ;; but I'd rather the table remain in a consistent state, in case we ;; ever devise a way to allow concurrent reads with a single writer, ;; for example. - (setf (kv-vector-table new-kv-vector) new-hash-vector) + (setf (kv-vector-supplement new-kv-vector) new-hash-vector) ;; Copy the k/v pairs excluding leading and trailing metadata. (replace new-kv-vector old-kv-vector @@ -853,7 +857,7 @@ multiple threads accessing the same hash-table without locking." (setf (hash-table-smashed-cells table) nil) ;; Now that the table points to the right hash-vector ;; we can set the vector's backpointer and turn it weak. - (setf (kv-vector-table new-kv-vector) table) + (setf (kv-vector-supplement new-kv-vector) table) (set-header-bits new-kv-vector sb-vm:vector-weak-subtype)) ;; Zero-fill the old kv-vector. For weak hash-tables this removes the @@ -1802,7 +1806,7 @@ table itself." (let* ((kv-vector (hash-table-pairs hash-table)) (high-water-mark (kv-vector-high-water-mark kv-vector))) (when (hash-table-weak-p hash-table) - (aver (eq (kv-vector-table kv-vector) hash-table))) + (aver (eq (kv-vector-supplement kv-vector) hash-table))) ;; Remove address-sensitivity. (unset-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) ;; Do this only after unsetting the address-sensitive bit, diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 9a1cafd7ef..fb70e743f4 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1092,16 +1092,11 @@ static inline int pointer_survived_gc_yet(lispobj obj) /* Return the beginning of data in ARRAY (skipping the header and the * length) or NULL if it isn't an array of the specified widetag after * all. */ -static inline void * -get_array_data (lispobj array, int widetag, sword_t *length) +static inline void *get_array_data(lispobj array, int widetag) { - if (is_lisp_pointer(array) && widetag_of(native_pointer(array)) == widetag) { - if (length != NULL) - *length = fixnum_value(native_pointer(array)[1]); + if (is_lisp_pointer(array) && widetag_of(native_pointer(array)) == widetag) return &(VECTOR(array)->data[0]); - } else { - return NULL; - } + lose("bad type: %"OBJ_FMTX" should have widetag %d", array, widetag); } extern uword_t gc_private_cons(uword_t, uword_t); @@ -1268,18 +1263,17 @@ static void scan_nonweak_kv_vector(struct vector *kv_vector, void (*scav_entry)( // When growing a weak table, the KV vector is not created as weak initially; // its last element points to the hash-vector as for any strong KV vector. sword_t kv_length = fixnum_value(kv_vector->length); - lispobj table_or_hashes = data[kv_length-1]; + lispobj kv_supplement = data[kv_length-1]; lispobj lhash_vector; - if (instancep(table_or_hashes)) - lhash_vector = ((struct hash_table*)native_pointer(table_or_hashes))->hash_vector; + if (instancep(kv_supplement)) + lhash_vector = ((struct hash_table*)native_pointer(kv_supplement))->hash_vector; else - lhash_vector = table_or_hashes; - sword_t hash_vector_length; - uint32_t *hash_vector = get_array_data(lhash_vector, - SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG, - &hash_vector_length); - if (hash_vector != NULL) - gc_assert(hash_vector_length == kv_length>>1); + lhash_vector = kv_supplement; + uint32_t *hash_vector = 0; + if (lhash_vector != NIL) { + hash_vector = get_array_data(lhash_vector, SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); + gc_assert(2 * fixnum_value(VECTOR(lhash_vector)->length) + 1 == kv_length); + } SCAV_ENTRIES(1, ); } @@ -1287,37 +1281,25 @@ boolean scan_weak_hashtable(struct hash_table *hash_table, int (*predicate)(lispobj,lispobj), void (*scav_entry)(lispobj*)) { - sword_t kv_length; - sword_t length; - sword_t next_vector_length; - sword_t hash_vector_length; - - lispobj *data = get_array_data(hash_table->pairs, - SIMPLE_VECTOR_WIDETAG, &kv_length); + lispobj *data = get_array_data(hash_table->pairs, SIMPLE_VECTOR_WIDETAG); if (data == NULL) lose("invalid kv_vector %"OBJ_FMTX, hash_table->pairs); + sword_t kv_length = fixnum_value(VECTOR(hash_table->pairs)->length); + + uint32_t *hash_vector = 0; + if (hash_table->hash_vector != NIL) { + hash_vector = get_array_data(hash_table->hash_vector, + SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); + gc_assert(VECTOR(hash_table->hash_vector)->length == + VECTOR(hash_table->next_vector)->length); + } - uint32_t *index_vector = get_array_data(hash_table->index_vector, - SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG, - &length); - if (index_vector == NULL) - lose("invalid index_vector %"OBJ_FMTX, hash_table->index_vector); - - if (get_array_data(hash_table->next_vector, - SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG, - &next_vector_length) == NULL) - lose("invalid next_vector %"OBJ_FMTX, hash_table->next_vector); - - uint32_t *hash_vector = get_array_data(hash_table->hash_vector, - SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG, - &hash_vector_length); - if (hash_vector != NULL) - gc_assert(hash_vector_length == next_vector_length); - - /* These lengths could be different as the index_vector can be a - * different length from the others, a larger index_vector could - * help reduce collisions. */ - gc_assert(next_vector_length == kv_length >> 1); + /* next_vector and hash_vector have a 1:1 size relation. + * kv_vector is twice that plus the supplemental cell. + * The index vector length is arbitrary - it can be smaller or larger + * than the maximum number of table entries. */ + gc_assert(2 * fixnum_value(VECTOR(hash_table->next_vector)->length) + 1 + == kv_length); int weakness = hashtable_weakness(hash_table); /* Work through the KV vector. */ @@ -1325,8 +1307,7 @@ boolean scan_weak_hashtable(struct hash_table *hash_table, if (!any_deferred && debug_weak_ht) fprintf(stderr, "will skip rescan of weak ht: %d/%d items\n", - (int)KV_PAIRS_HIGH_WATER_MARK(data), - (int)(next_vector_length - 1)); + (int)KV_PAIRS_HIGH_WATER_MARK(data), (int)(kv_length/2)); return any_deferred; } @@ -1444,6 +1425,8 @@ cull_weak_hash_table_bucket(struct hash_table *hash_table, if (key == empty_symbol && value == empty_symbol) continue; // If the pair doesn't have both halves empty, // then it mustn't have either half empty. + // FIXME: this looks like a potential data race - do we definitely store + // the key and value before inserting into a chain? Probably. gc_assert(key != empty_symbol); gc_assert(value != empty_symbol); if (!alivep_test(key, value)) { @@ -1509,23 +1492,22 @@ cull_weak_hash_table (struct hash_table *hash_table, int (*alivep_test)(lispobj,lispobj), void (*fix_pointers)(lispobj[2])) { - sword_t length = 0; /* prevent warning */ sword_t i; - lispobj *kv_vector = get_array_data(hash_table->pairs, - SIMPLE_VECTOR_WIDETAG, NULL); + lispobj *kv_vector = get_array_data(hash_table->pairs, SIMPLE_VECTOR_WIDETAG); uint32_t *index_vector = get_array_data(hash_table->index_vector, - SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG, - &length); + SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); + sword_t n_buckets = fixnum_value(VECTOR(hash_table->index_vector)->length); uint32_t *next_vector = get_array_data(hash_table->next_vector, - SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG, - NULL); - uint32_t *hash_vector = get_array_data(hash_table->hash_vector, - SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG, NULL); + SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); + uint32_t *hash_vector = 0; + if (hash_table->hash_vector != NIL) + hash_vector = get_array_data(hash_table->hash_vector, + SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); boolean rehash = 0; boolean save_culled_values = (hash_table->flags & MAKE_FIXNUM(4)) != 0; - for (i = 0; i < length; i++) { + for (i = 0; i < n_buckets; i++) { cull_weak_hash_table_bucket(hash_table, i, index_vector[i], kv_vector, next_vector, hash_vector, alivep_test, fix_pointers, diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 4e574975dd..c24dd16972 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -290,8 +290,11 @@ static inline int instancep(lispobj obj) { static inline int functionp(lispobj obj) { return lowtag_of(obj) == FUN_POINTER_LOWTAG; } +static inline int other_pointer_p(lispobj obj) { + return lowtag_of(obj) == OTHER_POINTER_LOWTAG; +} static inline int simple_vector_p(lispobj obj) { - return lowtag_of(obj) == OTHER_POINTER_LOWTAG && + return other_pointer_p(obj) && widetag_of((lispobj*)(obj-OTHER_POINTER_LOWTAG)) == SIMPLE_VECTOR_WIDETAG; } From 0179fc656da71a3d0f984d2ab83f1f05543b4c4e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 14 Jun 2020 21:51:17 -0400 Subject: [PATCH 0125/4023] Remove the hash-vector from EQL hash-tables It's not used in any of the table operations, aside from rehash. (No speed improvement comes from calling #'= to decide to call #'EQL) Having no hash-vector decreases memory consumption by 15%. The savings should outweigh the slight penalty in recalculating hashes due to GC, as well as in GC to detect which keys are address-sensitive. --- src/code/target-hash-table.lisp | 112 ++++++++++++++++++----- src/compiler/generic/pinned-objects.lisp | 11 +++ src/runtime/gc-common.c | 87 ++++++++++++------ src/runtime/gc-private.h | 1 + tests/hash-table.impure.lisp | 65 +++++++++++++ 5 files changed, 224 insertions(+), 52 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 2a408ba313..c436026b41 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -288,6 +288,7 @@ Examples: ;;; The 'supplement' points to the hash-table if the table is weak, ;;; or to the hash vector if the table is not weak. +;;; Other possible values are NIL for an EQ table, or T for an EQL table. (defmacro kv-vector-supplement (pairs) `(svref ,pairs (1- (length ,pairs)))) (declaim (inline set-kv-hwm)) ; can't setf data-vector-ref @@ -316,6 +317,11 @@ Examples: (oldval (cas (hash-table-%lock (truly-the hash-table table)) nil lock))) (if (eq oldval nil) lock oldval))) +(defconstant hash-table-kind-eq 0) +(defconstant hash-table-kind-eql 1) +(defconstant hash-table-kind-equal 2) +(defconstant hash-table-kind-equqlp 3) + ;;; I don't want to change peoples' assumptions about what operations are threadsafe ;;; on a weak table that was not created as expressly synchronized, so we continue to ;;; create nearly all weak tables as synchronized. With such tables, lock acquisition @@ -488,24 +494,16 @@ Examples: ;; an initial element (in case we ever meaningfully distinguish ;; between don't-care and 0-fill) (next-vector (make-array (1+ size) :element-type 'hash-table-index)) + (table-kind (ht-flags-kind flags)) + (userfunp (logtest flags hash-table-userfun-flag)) ;; same here - don't care about initial contents - ;; A simple space optimization is possible for EQL tables: most keys - ;; (notably excepting numbers) are address-based, and the interface functions - ;; don't look at hashes, so there should be no hash-vector stored. - ;; Rehashing would need to recompute hashes of numbers which is easy enough. - ;; For GC to know whether to set the 'rehash' flag after moving a key, - ;; it would need to know which pointer objects aren't hashed by address. - ;; Conversely, we use a hash-vector for an EQ table if it has - ;; a user-supplied hash function. - (hash-vector (when (> (ht-flags-kind flags) 0) + (hash-vector (when (or userfunp (>= table-kind 2)) (make-array (1+ size) :element-type 'hash-table-index))) ((getter setter remover) (if weakp (values #'gethash/weak #'puthash/weak #'remhash/weak) (pick-table-methods (logtest flags hash-table-synchronized-flag) - (if (logtest flags hash-table-userfun-flag) - -1 - (ht-flags-kind flags))))) + (if userfunp -1 table-kind)))) (table (%alloc-hash-table flags getter setter remover #'clrhash-impl test test-fun hash-fun @@ -515,7 +513,12 @@ Examples: ;; The trailing metadata element is either the table itself or the hash-vector ;; depending on weakness. Non-weak hashing vectors can be GCed without looking ;; at the table. Weak hashing vectors need the table. - (setf (kv-vector-supplement kv-vector) (if weakp table hash-vector)) + ;; As a special-case, non-weak tables with EQL hashing put T in this slot. + ;; GC can't get the table kind since it doesn't have access to the table. + (setf (kv-vector-supplement kv-vector) + (if weakp + table + (or hash-vector (= table-kind hash-table-kind-eql)))) (when (logtest flags hash-table-synchronized-flag) (install-hash-table-lock table)) table)) @@ -676,7 +679,8 @@ multiple threads accessing the same hash-table without locking." (type (simple-array hash-table-index (*)) next-vector index-vector) (type (or null (simple-array hash-table-index (*))) hash-vector)) (declare (ignorable table)) - (if hash-vector + (cond + (hash-vector ;; Scan backwards so that chains are in ascending index order. (do ((i hwm (1- i))) ((zerop i)) (declare (type index/2 i)) @@ -696,7 +700,39 @@ multiple threads accessing the same hash-table without locking." ;; Precise GC platforms can move any key except the ones which ;; are explicitly pinned. (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) - (push-in-chain (pointer-hash->bucket (pointer-hash key) mask)))))) + (push-in-chain (pointer-hash->bucket (pointer-hash key) mask))))))) + ((= (ht-flags-kind (hash-table-flags table)) hash-table-kind-eql) + ;; There's a very tricky issue here with using EQL-HASH - you can't just + ;; call it and then decide to set the address-sensitivity bit if the secondary + ;; result is T. Normally we call the hash function with the key pinned, + ;; so we have to do the same here. Consider if we didn't, on a precise GC + ;; architecture given the initial condition that the kv-vector is not + ;; marked as address-sensitive: + ;; - call EQL hash, take PAIR-KEY's address as its hash + ;; - GC observes that vector is not address-sensitive, + ;; moves PAIR-KEY, gives it a new address, does not flag vector + ;; as needing rehash. + ;; - set the vector header as address-sensitive + ;; - push in chain + ;; After that sequence of operations, the item is in the wrong chain, + ;; for its new address, but the need-rehash bit is not set in the vector. + ;; It would work to call EQL-HASH twice per key: once to get the secondary + ;; value, maybe set the vector bit, call it again. But that's not great. + ;; Instead we use a macro that is like WITH-PINNED-OBJECTS, but cheaper + ;; than binding a special variable once per key. + (sb-vm::with-pinned-object-iterator (pin-object) + (do ((i hwm (1- i))) ((zerop i)) + (declare (type index/2 i)) + (with-pair (key val) + (cond ((and (empty-ht-slot-p key) (empty-ht-slot-p val)) + (setf (aref next-vector i) next-free next-free i)) + (t + (pin-object key) + (multiple-value-bind (hash address-based) (eql-hash-no-memoize key) + (when address-based + (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype)) + (push-in-chain (mask-hash (prefuzz-hash hash) mask))))))))) + (t (do ((i hwm (1- i))) ((zerop i)) (declare (type index/2 i)) (with-pair (key val) @@ -705,7 +741,7 @@ multiple threads accessing the same hash-table without locking." (t (when (sb-vm:is-lisp-pointer (get-lisp-obj-address key)) (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype)) - (push-in-chain (pointer-hash->bucket (pointer-hash key) mask))))))) + (push-in-chain (pointer-hash->bucket (pointer-hash key) mask)))))))) ;; This is identical to the calculation of next-free-kv in INSERT-AT. (cond ((/= next-free 0) next-free) ((= hwm (hash-table-pairs-capacity kv-vector)) 0) @@ -751,7 +787,8 @@ multiple threads accessing the same hash-table without locking." (hwm (kv-vector-high-water-mark kv-vector)) (result 0)) (declare (optimize (sb-c::insert-array-bounds-checks 0))) - (if hash-vector + (cond + (hash-vector (do ((i hwm (1- i))) ((zerop i)) (declare (type index/2 i)) (with-pair (pair-key) @@ -764,8 +801,21 @@ multiple threads accessing the same hash-table without locking." (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) (push-in-chain (pointer-hash->bucket (pointer-hash pair-key) mask)))) - (when (eq pair-key key) (setq result key-index))))) - ;; No hash vector + (when (eq pair-key key) (setq result key-index)))))) + ((= (ht-flags-kind (hash-table-flags table)) hash-table-kind-eql) + (sb-vm::with-pinned-object-iterator (pin-object) + (do ((i hwm (1- i))) ((zerop i)) + (declare (type index/2 i)) + (with-pair (pair-key) + (unless (empty-ht-slot-p pair-key) + (pin-object pair-key) + (multiple-value-bind (hash address-based) (eql-hash-no-memoize pair-key) + (when address-based + (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype)) + (push-in-chain (mask-hash (prefuzz-hash hash) mask))) + (when (eq pair-key key) (setq result key-index))))))) + (t + ;; No hash vector and not an EQL table, so it's an EQ table (do ((i hwm (1- i))) ((zerop i)) (declare (type index/2 i)) (with-pair (pair-key) @@ -774,7 +824,7 @@ multiple threads accessing the same hash-table without locking." (set-header-bits kv-vector sb-vm:vector-addr-hashing-subtype)) (push-in-chain (pointer-hash->bucket (pointer-hash pair-key) mask)) - (when (eq pair-key key) (setq result key-index)))))) + (when (eq pair-key key) (setq result key-index))))))) ;; Clear rehash bit and bump the epoch, wrapping around to keep it a fixnum (let ((new-epoch (sb-vm::+-modfx epoch 3))) ;; Setting the new epoch races with GC which might set 'rehash' again. @@ -824,7 +874,7 @@ multiple threads accessing the same hash-table without locking." ;; Clearing the weakness causes all entries to stay alive. ;; Furthermore, clearing both makes the trailing metadata ignorable. (set-header-data old-kv-vector sb-vm:vector-hashing-subtype) - (setf (kv-vector-supplement old-kv-vector) 0) + (setf (kv-vector-supplement old-kv-vector) nil) ;; The high-water-mark remains unchanged. ;; Set this before copying pairs, otherwise they would not be seen @@ -839,7 +889,9 @@ multiple threads accessing the same hash-table without locking." ;; but I'd rather the table remain in a consistent state, in case we ;; ever devise a way to allow concurrent reads with a single writer, ;; for example. - (setf (kv-vector-supplement new-kv-vector) new-hash-vector) + (setf (kv-vector-supplement new-kv-vector) + (or new-hash-vector + (= (ht-flags-kind (hash-table-flags table)) hash-table-kind-eql))) ;; Copy the k/v pairs excluding leading and trailing metadata. (replace new-kv-vector old-kv-vector @@ -1256,13 +1308,23 @@ nnnn 1_ any linear scan ;; Everything in an EQ table is address-based - though this is subject ;; to change, as we could stably hash symbols, because why not - ;; but the hash fun's second value is NIL on immediate objects. - (if (or address-based-p (eq (hash-table-test hash-table) 'eq)) + (cond + ((or address-based-p (eq (hash-table-test hash-table) 'eq)) (do ((next index (aref next-vector next))) ((zerop next) (go miss)) (declare (type index/2 next)) (with-pair () (when (eq key probed-key) (return-hit))) (check-excessive-probes 1) - (setq predecessor next)) + (setq predecessor next))) + ((eq (hash-table-test hash-table) 'eql) + ;; similar to EQ except for the different comparator + (do ((next index (aref next-vector next))) + ((zerop next) (go miss)) + (declare (type index/2 next)) + (with-pair () (when (%eql key probed-key) (return-hit))) + (check-excessive-probes 1) + (setq predecessor next))) + (t ;; For any other test, we assume that it is not safe to pass the ;; unbound marker to the predicate (though EQUAL and EQUALP are ;; probably OK). Also, compare hashes first. @@ -1275,7 +1337,7 @@ nnnn 1_ any linear scan (funcall test-fun key probed-key)) (return-hit))) (check-excessive-probes 1) - (setq predecessor next))))))))) + (setq predecessor next)))))))))) (defmacro with-weak-hash-table-entry (&body body) `(with-pinned-objects (key) diff --git a/src/compiler/generic/pinned-objects.lisp b/src/compiler/generic/pinned-objects.lisp index 66c0347cb7..0e26618f08 100644 --- a/src/compiler/generic/pinned-objects.lisp +++ b/src/compiler/generic/pinned-objects.lisp @@ -50,3 +50,14 @@ garbage collection." `(touch-object ,pin)) pins))))) `(progn ,@body))) + +(defmacro with-pinned-object-iterator ((name) &body body) + #-gencgc + `(macrolet ((,name (arg) (declare (ignore arg)) nil)) ,@body) + #+(and gencgc (not (or x86 x86-64))) + `(dx-let ((.cell. (cons nil *pinned-objects*))) + (let ((*pinned-objects* .cell.)) + (macrolet ((,name (arg) `(rplaca .cell. ,arg))) ,@body))) + #+(and gencgc (or x86 x86-64)) + `(dx-let ((.cell. (cons nil nil))) + (macrolet ((,name (arg) `(rplaca .cell. ,arg))) ,@body))) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index fb70e743f4..868c8a8bd7 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1096,7 +1096,7 @@ static inline void *get_array_data(lispobj array, int widetag) { if (is_lisp_pointer(array) && widetag_of(native_pointer(array)) == widetag) return &(VECTOR(array)->data[0]); - lose("bad type: %"OBJ_FMTX" should have widetag %d", array, widetag); + lose("bad type: %"OBJ_FMTX" should have widetag %x", array, widetag); } extern uword_t gc_private_cons(uword_t, uword_t); @@ -1219,14 +1219,34 @@ void weakobj_init() 32 /* logical bin count */, 0 /* default range */); } +static inline boolean stable_eql_hash_p(lispobj obj) +{ + return lowtag_of(obj) == OTHER_POINTER_LOWTAG + && widetag_of((lispobj*)(obj-OTHER_POINTER_LOWTAG)) <= SYMBOL_WIDETAG; +} + +/* EQUAL and EQUALP tables always have hash vectors, so GC always knows + * for any given key whether it was hashed by address. + * EQ never has a hash vector (except if there is a user-defined hash function) + * but always hashes by the pointer bits (which could be an address or immediate). + * EQL never has a hash vector (same exception), but can hash some objects + * by their contents, not their address. This macro determines for a key whether + * its pointer bits force a rehash. In the case where we would call + * stable_eql_hash_p(), skip the call if 'rehash' is already 1. + */ +#define SHOULD_REHASH(oldkey, newkey, hashvec, hv_index) \ + ((newkey != oldkey) && \ + (!hashvec ? rehash || !eql_hashing || !stable_eql_hash_p(newkey) : \ + hashvec[hv_index] == MAGIC_HASH_VECTOR_VALUE)) + + /* Scavenge the "real" entries in the hash-table kv vector. The vector element * at index 0 bounds the scan. The element at length-1 (the hash table itself) * was scavenged already. * * We can disregard any entry in which both key and value are immediates. * This effectively ignores empty pairs, as well as makes fixnum -> fixnum table - * more efficient. If the bitwise OR of two lispobjs satisfies is_lisp_pointer(), - * then at least one is a pointer. + * more efficient. */ #define SCAV_ENTRIES(entry_alivep, defer) \ boolean __attribute__((unused)) any_deferred = 0; \ @@ -1240,9 +1260,7 @@ void weakobj_init() /* Scavenge the key and value. */ \ scav_entry(&data[2*i]); \ /* mark the table for rehash if address-based key moves */ \ - if (data[2*i] != key && \ - (!hash_vector || hash_vector[i] == MAGIC_HASH_VECTOR_VALUE)) \ - rehash = 1; \ + if (SHOULD_REHASH(key, data[2*i], hashvals, i)) rehash = 1; \ }}} \ /* Though at least partly writable, vector element 1 could be on a write-protected page. */ \ if (rehash) \ @@ -1264,15 +1282,19 @@ static void scan_nonweak_kv_vector(struct vector *kv_vector, void (*scav_entry)( // its last element points to the hash-vector as for any strong KV vector. sword_t kv_length = fixnum_value(kv_vector->length); lispobj kv_supplement = data[kv_length-1]; - lispobj lhash_vector; - if (instancep(kv_supplement)) - lhash_vector = ((struct hash_table*)native_pointer(kv_supplement))->hash_vector; - else - lhash_vector = kv_supplement; - uint32_t *hash_vector = 0; - if (lhash_vector != NIL) { - hash_vector = get_array_data(lhash_vector, SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); - gc_assert(2 * fixnum_value(VECTOR(lhash_vector)->length) + 1 == kv_length); + boolean eql_hashing = 0; // whether this table is an EQL table + if (instancep(kv_supplement)) { + struct hash_table* ht = (struct hash_table*)native_pointer(kv_supplement); + eql_hashing = hashtable_kind(ht) == 1; + kv_supplement = ht->hash_vector; + } else if (kv_supplement == T) { // EQL hashing on a non-weak table + eql_hashing = 1; + kv_supplement = NIL; + } + uint32_t *hashvals = 0; + if (kv_supplement != NIL) { + hashvals = get_array_data(kv_supplement, SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); + gc_assert(2 * fixnum_value(VECTOR(kv_supplement)->length) + 1 == kv_length); } SCAV_ENTRIES(1, ); } @@ -1286,9 +1308,9 @@ boolean scan_weak_hashtable(struct hash_table *hash_table, lose("invalid kv_vector %"OBJ_FMTX, hash_table->pairs); sword_t kv_length = fixnum_value(VECTOR(hash_table->pairs)->length); - uint32_t *hash_vector = 0; + uint32_t *hashvals = 0; if (hash_table->hash_vector != NIL) { - hash_vector = get_array_data(hash_table->hash_vector, + hashvals = get_array_data(hash_table->hash_vector, SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); gc_assert(VECTOR(hash_table->hash_vector)->length == VECTOR(hash_table->next_vector)->length); @@ -1302,6 +1324,7 @@ boolean scan_weak_hashtable(struct hash_table *hash_table, == kv_length); int weakness = hashtable_weakness(hash_table); + boolean eql_hashing = hashtable_kind(hash_table) == 1; /* Work through the KV vector. */ SCAV_ENTRIES(predicate(key, value), add_kv_triggers(&data[2*i], weakness)); if (!any_deferred && debug_weak_ht) @@ -1405,8 +1428,9 @@ scav_vector (lispobj *where, lispobj header) } /* Walk through the chain whose first element is *FIRST and remove - * dead weak entries. */ -static inline void + * dead weak entries. + * Return the new value for 'should rehash' */ +static inline boolean cull_weak_hash_table_bucket(struct hash_table *hash_table, uint32_t bucket, uint32_t index, lispobj *kv_vector, @@ -1414,9 +1438,10 @@ cull_weak_hash_table_bucket(struct hash_table *hash_table, int (*alivep_test)(lispobj,lispobj), void (*fix_pointers)(lispobj[2]), boolean save_culled_values, - boolean *rehash) + boolean rehash) { const lispobj empty_symbol = UNBOUND_MARKER_WIDETAG; + int eql_hashing = hashtable_kind(hash_table) == 1; for ( ; index ; index = next_vector[index] ) { lispobj key = kv_vector[2 * index]; lispobj value = kv_vector[2 * index + 1]; @@ -1479,12 +1504,12 @@ cull_weak_hash_table_bucket(struct hash_table *hash_table, if (fix_pointers) { // Follow FPs as necessary lispobj key = kv_vector[2 * index]; fix_pointers(&kv_vector[2 * index]); - if (kv_vector[2 * index] != key && - (!hash_vector || hash_vector[index] == MAGIC_HASH_VECTOR_VALUE)) - *rehash = 1; + if (SHOULD_REHASH(key, kv_vector[2 * index], hash_vector, index)) + rehash = 1; } } } + return rehash; } static void @@ -1507,11 +1532,19 @@ cull_weak_hash_table (struct hash_table *hash_table, boolean rehash = 0; boolean save_culled_values = (hash_table->flags & MAKE_FIXNUM(4)) != 0; + // I'm slightly confused as to why we can't (or don't) compute the + // 'should rehash' flag while scavenging the weak k/v vector. + // I believe the explanation is this: for weak-key-AND-value tables, the vector + // is never scavenged. It just ends up here after all other scavenging is done. + // We then need to fix the still-live pointers, which entails possibly setting the + // 'rehash' flag. It would not make sense to treat the other 3 flavors of + // weakness any differently. for (i = 0; i < n_buckets; i++) { - cull_weak_hash_table_bucket(hash_table, i, index_vector[i], - kv_vector, next_vector, hash_vector, - alivep_test, fix_pointers, - save_culled_values, &rehash); + if (cull_weak_hash_table_bucket(hash_table, i, index_vector[i], + kv_vector, next_vector, hash_vector, + alivep_test, fix_pointers, + save_culled_values, rehash)) + rehash = 1; } /* If an EQ-based key has moved, mark the hash-table for rehash */ if (rehash) diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index dae41694d3..e05fee5ca4 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -249,6 +249,7 @@ static inline boolean layout_bitmap_logbitp(int index, lispobj bitmap) } /* Keep in sync with 'target-hash-table.lisp' */ +#define hashtable_kind(ht) ((ht->flags >> (4+N_FIXNUM_TAG_BITS)) & 3) #define hashtable_weakp(ht) (ht->flags & (8<flags >> (6+N_FIXNUM_TAG_BITS)) diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 93fd913d2a..10e2d9e7dc 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -81,3 +81,68 @@ (setf (gethash i h) (- i))) (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs h)) sb-vm:vector-hashing-subtype)))) + +;;; EQL tables no longer get a hash vector, so the GC has to decide +;;; for itself whether key movement forces rehash. +;;; Let's make sure that works. +(with-test (:name :address-insensitive-eql-hash) + (let ((tbl (make-hash-table :size 20))) + (dotimes (i 5) + (let ((key (coerce i 'double-float))) + (setf (gethash key tbl) (sb-kernel:get-lisp-obj-address key))) + (let ((key (coerce i '(complex single-float)))) + (setf (gethash key tbl) (sb-kernel:get-lisp-obj-address key))) + (let ((key (make-symbol (make-string (1+ i) :initial-element #\a)))) + (setf (gethash key tbl) (sb-kernel:get-lisp-obj-address key)))) + (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs tbl)) + sb-vm:vector-hashing-subtype)) ; noo address-based key + (let ((foo (cons 0 0))) + (setf (gethash foo tbl) foo) + (remhash foo tbl)) + ;; now we've added an address-based key (but removed it) + (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs tbl)) + (+ sb-vm:vector-addr-hashing-subtype + sb-vm:vector-hashing-subtype))) + (gc) + (let ((n-keys-moved 0)) + (maphash (lambda (key value) + (unless (= value (sb-kernel:get-lisp-obj-address key)) + (incf n-keys-moved))) + tbl) + (assert (plusp n-keys-moved)) + ;; keys were moved, the table is marked as address-based, + ;; but no key that moved forced a rehash + (assert (zerop (sb-impl::kv-vector-needs-rehash + (sb-impl::hash-table-pairs tbl))))) + ;; the vector type is unchanged + (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs tbl)) + (+ sb-vm:vector-addr-hashing-subtype + sb-vm:vector-hashing-subtype))) + (setf (gethash (cons 1 2) tbl) 'one) + (setf (gethash (cons 3 4) tbl) 'two) + (setf (gethash (cons 5 6) tbl) 'three) + (gc) + ;; now some key should have moved and forced a rehash + (assert (not (zerop (sb-impl::kv-vector-needs-rehash + (sb-impl::hash-table-pairs tbl))))) + ;; This next thing is impossible to test without some hacks - + ;; we want to see that the addr-hashing flag can be cleared + ;; if, on rehash, there is currently no address-sensitive key + ;; in the table. + ;; This could happen in the real world, but it's actually very + ;; difficult to construct an example because it requires controlling + ;; the addresses of objects. But the 'rehash' bit had to first get + ;; set, and then any key that could cause the bit to get set + ;; has to be removed, which means we had to have successfully found + ;; and removed address-sensitive keys despite having obsolete hashes. + ;; That could only happen by random chance. + ;; However, by stomping on a few keys, we can simulate it. + (let ((pairs (sb-impl::hash-table-pairs tbl))) + (loop for i from 2 below (length pairs) by 2 + when (consp (aref pairs i)) + do (setf (aref pairs i) i))) ; highly illegal! + ;; try to find an address-sensitive key + (assert (not (gethash '(foo) tbl))) + (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs tbl)) + ;; Table is no longer address-sensitive + sb-vm:vector-hashing-subtype)))) From 86e2ec8e26e06f8e062cd42cd0b5ab500d8f95ac Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 15 Jun 2020 14:50:35 -0400 Subject: [PATCH 0126/4023] Add test --- tests/hash-table.impure.lisp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 10e2d9e7dc..3000c4e72b 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -146,3 +146,29 @@ (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs tbl)) ;; Table is no longer address-sensitive sb-vm:vector-hashing-subtype)))) + +(defun actually-address-sensitive-p (ht) + (let* ((hashfun (sb-impl::hash-table-hash-fun ht)) + (some-actually-address-sensitive-key)) + (maphash (lambda (key value) + (declare (ignore value)) + (multiple-value-bind (hash address-sensitive) + (funcall hashfun key) + (declare (ignore hash)) + (when address-sensitive + (setf some-actually-address-sensitive-key t)))) + ht) + some-actually-address-sensitive-key)) + +;;; Every table in the pristine core that claims to be address-sensitive +;;; should _actually_ contains some address-sensitive key, +;;; unless GC removed all such keys from a weak table. +;;; It is easy to create situations where this is violated in normal user code, +;;; but it requires at least one REMHASH to occur. +(with-test (:name :spurious-address-sensitivity-again) + (dolist (ht (sb-vm::list-allocated-objects :dynamic :test #'hash-table-p)) + (let ((pairs (sb-impl::hash-table-pairs ht))) + (when (logtest sb-vm:vector-addr-hashing-subtype + (sb-kernel:get-header-data pairs)) + (assert (or (actually-address-sensitive-p ht) + (hash-table-weakness ht))))))) From 8318bab3948b833d1981db02ea750c47925c5c72 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 15 Jun 2020 14:51:36 -0400 Subject: [PATCH 0127/4023] Remove VECTOR-NORMAL-SUBTYPE Silly to have a special case in is_vector_subtype() for no bits on. --- package-data-list.lisp-expr | 1 - src/compiler/generic/early-objdef.lisp | 2 +- src/runtime/gc-common.c | 8 ++++++-- src/runtime/gc-internal.h | 5 +---- src/runtime/gencgc.c | 5 ++--- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index e16bc16811..63fd1a7317 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -3280,7 +3280,6 @@ structure representations" "UNWIND-BLOCK-UWP-SLOT" "UNWIND-BLOCK-ENTRY-PC-SLOT" "UNWIND-BLOCK-SIZE" "VALUE-CELL-WIDETAG" "VALUE-CELL-SIZE" "VALUE-CELL-VALUE-SLOT" "VECTOR-DATA-OFFSET" "VECTOR-LENGTH-SLOT" - "VECTOR-NORMAL-SUBTYPE" "VECTOR-WEAK-SUBTYPE" "VECTOR-WEAK-VISITED-SUBTYPE" "VECTOR-HASHING-SUBTYPE" diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 05f9751662..80502e54f2 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -308,7 +308,7 @@ #'equal) ;;; the different vector subtypes, can be ORed together. -(defconstant vector-normal-subtype 0) +;;; N.B.: These are not "types" in the lisp sense. ;; Weak vectors that are NOT hash-table backing vectors use this bit to track ;; whether we've already recorded the vector for deferred scavenging. ;; Hash-tables use an entirely different mechanism. Flag bit used only in C. diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 868c8a8bd7..60e1e40ab6 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1341,8 +1341,12 @@ scav_vector (lispobj *where, lispobj header) sword_t length = fixnum_value(where[1]); /* SB-VM:VECTOR-HASHING-SUBTYPE is set for all hash tables in the - * Lisp HASH-TABLE code to indicate need for special GC support. */ - if (is_vector_subtype(header, VectorNormal)) { + * Lisp HASH-TABLE code to indicate need for special GC support. + * But note that if the vector is a hashing vector that is neither + * weak nor contains any key hashed by its address, then it is basically + * a regular vector, except that GC needs only to look at cells below + * the high-water-mark, plus the SUPPLEMENT slot at the end */ + if (vector_subtype(header) == 0) { // no special indicator bits set normal: scavenge(where + 2, length); goto done; diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index c0b451573e..cbedec9735 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -63,10 +63,7 @@ extern struct weak_pointer *weak_pointer_chain; /* in gc-common.c */ // masking out subtype_VectorWeakVisited. #define vector_subtype(header) (HeaderValue(header) & 7) // Test for presence of a bit in vector's header. -// As a special case, if 'val' is 0, then test for all bits clear. -#define is_vector_subtype(header, val) \ - (subtype_##val ? (HeaderValue(header) & subtype_##val) : \ - !(HeaderValue(header) & 7)) +#define is_vector_subtype(header, val) (HeaderValue(header) & subtype_##val) // Mask out the fullcgc mark bit when asserting header validity #define UNSET_WEAK_VECTOR_VISITED(v) \ diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 8875053f3f..dec12238d6 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2336,13 +2336,12 @@ static inline boolean large_simple_vector_p(page_index_t page) { return 0; lispobj header = *(lispobj *)page_address(page); // For hash-table vectors which are neither weak nor address-sensitive, - // it certainly would be possible to treat the vector as VectorNormal, + // it certainly would be possible to treat the vector as an ordinary vector, // though we'd lose out on the optimization that scans only below the // high-water mark which is in general a good thing. Perhaps if the // ratio of HWM to total size warrants it, we should prefer to use the // large_simple_vector optimization instead. - return header_widetag(header) == SIMPLE_VECTOR_WIDETAG && - is_vector_subtype(header, VectorNormal); + return header_widetag(header) == SIMPLE_VECTOR_WIDETAG && vector_subtype(header) == 0; } /* Attempt to re-protect code from first_page to last_page inclusive. From 28daf5e40419f8fbb8a0bda4757bb66904d5dc5a Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 15 Jun 2020 23:44:00 +0300 Subject: [PATCH 0128/4023] Add :skipped-on :interpreter to some tests. --- tests/condition.pure.lisp | 3 ++- tests/disassem.impure.lisp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/condition.pure.lisp b/tests/condition.pure.lisp index f35db99073..9e4505c9f3 100644 --- a/tests/condition.pure.lisp +++ b/tests/condition.pure.lisp @@ -438,7 +438,8 @@ is not of type (assert (string= (write-to-string error :escape nil) "odd-length initializer list: (:A 1 :B).")))) -(with-test (:name :type-error-on-dx-object) +(with-test (:name :type-error-on-dx-object + :skipped-on :interpreter) (handler-case (sb-int:dx-let ((a (make-array 3))) (setf (aref a 0) a) diff --git a/tests/disassem.impure.lisp b/tests/disassem.impure.lisp index 9eb73b3612..41cb85b78f 100644 --- a/tests/disassem.impure.lisp +++ b/tests/disassem.impure.lisp @@ -41,7 +41,8 @@ ;;; I'm not sure how to implement CLISP-compatibility and ABCL-compatibility ;;; via the standard interface now, so test the nonstandard interface. -(with-test (:name :disassemble-method) +(with-test (:name :disassemble-method + :skipped-on :interpreter) (with-output-to-string (s) (sb-c:dis (defmethod hello ((self cons)) "here i am") s))) From 4583a8ecb76a98da82df486d2635b834d4ce11a2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 15 Jun 2020 17:20:18 -0400 Subject: [PATCH 0129/4023] Skip mutex acquisition in unsynchronized CLRHASH --- src/code/target-hash-table.lisp | 48 +++++++++++++++++---------------- tests/hash-table.impure.lisp | 6 +++++ 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index c436026b41..27427f1e20 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -1863,29 +1863,31 @@ table itself." ;; observe junk, but you can't put good value at higher than the HWM] #+hash-table-simulate (setf (hash-table-%alist hash-table) nil) (when (plusp (kv-vector-high-water-mark (hash-table-pairs hash-table))) - ;; FIXME: why always acquire the lock? - (sb-thread::with-recursive-system-lock ((hash-table-lock hash-table)) - (let* ((kv-vector (hash-table-pairs hash-table)) - (high-water-mark (kv-vector-high-water-mark kv-vector))) - (when (hash-table-weak-p hash-table) - (aver (eq (kv-vector-supplement kv-vector) hash-table))) - ;; Remove address-sensitivity. - (unset-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) - ;; Do this only after unsetting the address-sensitive bit, - ;; otherwise GC might come along and touch this bit again. - (setf (kv-vector-needs-rehash kv-vector) 0) - ;; We always deposit empty makers into k/v pairs that are REMHASHed, - ;; so a count of 0 implies no clearing need be done. - (when (plusp (hash-table-%count hash-table)) - (setf (hash-table-%count hash-table) 0) - ;; Fill all slots with the empty marker. - (fill kv-vector +empty-ht-slot+ :start 2 :end (* (1+ high-water-mark) 2)) - ;; Clear the index-vector. - ;; Don't need to clear the hash-vector or the next-vector. - (fill (hash-table-index-vector hash-table) 0)) - (setf (hash-table-smashed-cells hash-table) nil - (hash-table-next-free-kv hash-table) 1 - (kv-vector-high-water-mark kv-vector) 0)))) + (dx-flet ((clear () + (let* ((kv-vector (hash-table-pairs hash-table)) + (high-water-mark (kv-vector-high-water-mark kv-vector))) + (when (hash-table-weak-p hash-table) + (aver (eq (kv-vector-supplement kv-vector) hash-table))) + ;; Remove address-sensitivity. + (unset-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) + ;; Do this only after unsetting the address-sensitive bit, + ;; otherwise GC might come along and touch this bit again. + (setf (kv-vector-needs-rehash kv-vector) 0) + ;; We always deposit empty markers into k/v pairs that are REMHASHed, + ;; so a count of 0 implies no clearing need be done. + (when (plusp (hash-table-%count hash-table)) + (setf (hash-table-%count hash-table) 0) + ;; Fill all slots with the empty marker. + (fill kv-vector +empty-ht-slot+ :start 2 :end (* (1+ high-water-mark) 2)) + ;; Clear the index-vector. + ;; Don't need to clear the hash-vector or the next-vector. + (fill (hash-table-index-vector hash-table) 0)) + (setf (hash-table-smashed-cells hash-table) nil + (hash-table-next-free-kv hash-table) 1 + (kv-vector-high-water-mark kv-vector) 0)))) + (if (hash-table-synchronized-p hash-table) + (sb-thread::call-with-recursive-system-lock #'clear (hash-table-%lock hash-table)) + (clear)))) hash-table) diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 3000c4e72b..aa4977094a 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -172,3 +172,9 @@ (sb-kernel:get-header-data pairs)) (assert (or (actually-address-sensitive-p ht) (hash-table-weakness ht))))))) + +(with-test (:name :unsynchronized-clrhash-no-lock) + (let ((ht (make-hash-table))) + (setf (gethash 1 ht) 2) + (clrhash ht) + (assert (not (sb-impl::hash-table-%lock ht))))) From 6222e0cff623d7c44229198c4c93f5da3abd33ca Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 15 Jun 2020 23:03:33 -0400 Subject: [PATCH 0130/4023] Remove nearly all address-based hashing from system hash-tables Most of them could be made to use stable hash values. A few remain as possibly hashing by address: - EQL-specializers (depending on what you put in it) - finalizers (obviously) - unknown-type atoms (aren't these symbols ?) - allocation-point fixups (probably doesn't need to be a hash-table) Perhaps it's ironic that an EQL table is cheaper than an EQ table if all keys are symbols. The memory consumption is the same, and the EQL table will never rehash due to object movement. Perhaps we should use SYMBOL-HASH for symbols stored in EQ tables too, so that users can have this benefit without having to know this "One Weird Trick" --- src/code/class.lisp | 15 ++++++++++----- src/code/cross-misc.lisp | 4 ++++ src/code/early-alieneval.lisp | 2 +- src/code/room.lisp | 5 +++++ src/code/target-load.lisp | 2 +- src/code/target-unicode.lisp | 2 +- src/compiler/assem.lisp | 2 +- src/compiler/backend.lisp | 15 +++++++++------ src/compiler/modarith.lisp | 4 ++-- src/interpreter/special-forms.lisp | 4 ++-- tests/hash-table.impure.lisp | 13 ------------- 11 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/code/class.lisp b/src/code/class.lisp index 2b714f8c56..a77e87da76 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -344,11 +344,16 @@ between the ~A definition and the ~A definition" (dovector (super-layout (layout-inherits layout)) (let* ((super (layout-classoid super-layout)) - (subclasses (or (classoid-subclasses super) - (setf (classoid-subclasses super) - (make-hash-table :test 'eq - #-sb-xc-host #-sb-xc-host - :synchronized t))))) + (subclasses + (or (classoid-subclasses super) + (setf (classoid-subclasses super) + #+sb-xc-host (make-hash-table :test 'eq) + ;; Might as well use CTYPE-HASH-VALUE as a + ;; stable hash since we have it. + #-sb-xc-host + (make-hash-table :hash-function #'type-hash-value + :test 'eq + :synchronized t))))) (when (and (eq (classoid-state super) :sealed) (not (gethash classoid subclasses))) (warn "unsealing sealed class ~S in order to subclass it" diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index f089d251c8..2690f4eb3d 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -19,6 +19,10 @@ (remf args :weakness) (remf args :synchronized) (remf args :finalizer) + (let ((hash-fun (getf args :hash-function))) + (when hash-fun + (assert (eq (getf args :test) 'eq)) + (remf args :hash-function))) (apply 'make-hash-table args))) ;;; In correct code, TRULY-THE has only a performance impact and can diff --git a/src/code/early-alieneval.lisp b/src/code/early-alieneval.lisp index d480603884..9f66c24bda 100644 --- a/src/code/early-alieneval.lisp +++ b/src/code/early-alieneval.lisp @@ -9,7 +9,7 @@ (in-package "SB-ALIEN") -(defglobal *alien-type-classes* (make-hash-table :test 'eq)) +(defglobal *alien-type-classes* (make-hash-table)) ; keys are symbols #-sb-xc-host (sb-impl::define-thread-local *saved-fp* nil) diff --git a/src/code/room.lisp b/src/code/room.lisp index aa5947990c..574c8f0a7d 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -1483,6 +1483,11 @@ We could try a few things to mitigate this: (in-package "SB-C") ;;; As soon as practical in warm build it makes sense to add ;;; cold-allocation-point-fixups into the weak hash-table. +;;; FIXME: I suspect that this wants to be just a weak vector +;;; (all code objects that have any allocation profiling compiled in), +;;; and not a hash-table, and that the list of fixups in the component +;;; can be attached to the debug info (in the manner of debug funs). +;;; When this was first implemented, weak-vectors weren't a thing. Maybe? (defvar *!cold-allocation-point-fixups*) (let ((hash-table (make-hash-table :test 'eq))) ;; Group by code component diff --git a/src/code/target-load.lisp b/src/code/target-load.lisp index 8648fba1da..c387b231b4 100644 --- a/src/code/target-load.lisp +++ b/src/code/target-load.lisp @@ -315,7 +315,7 @@ (size (%code-text-size code)) (vector (the simple-vector *!initial-assembler-routines*)) (count (length vector)) - (ht (make-hash-table :test 'eq))) + (ht (make-hash-table))) ; keys are symbols (rplaca (%code-debug-info code) ht) (dotimes (i count) (destructuring-bind (name . offset) (svref vector i) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 4beaec55b4..7644e42c23 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -28,7 +28,7 @@ ',bidi-mirroring-list) (defun !unicode-properties-cold-init () ;; - (let ((hash (make-hash-table :test 'eq)) + (let ((hash (make-hash-table)) ; keys are symbols (list ',(sb-cold:read-from-file "output/misc-properties.lisp-expr"))) (setq **proplist-properties** hash) diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index 5f24191877..c139da432f 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -1402,7 +1402,7 @@ ;;; Map of opcode symbol to function that emits it into the byte stream ;;; (or with the schedulding assembler, into the queue) -(defglobal *inst-encoder* (make-hash-table :test 'eq)) +(defglobal *inst-encoder* (make-hash-table)) ; keys are symbols ;;; Combine INPUTS into one assembly stream and assemble into SEGMENT (defun %assemble (segment section) diff --git a/src/compiler/backend.lisp b/src/compiler/backend.lisp index b636f17870..dc3162e7e0 100644 --- a/src/compiler/backend.lisp +++ b/src/compiler/backend.lisp @@ -46,17 +46,16 @@ (declaim (type simple-vector *backend-sbs*)) ;;; translation from template names to template structures -(defglobal *backend-template-names* (make-hash-table :test 'eq)) +(defglobal *backend-template-names* (make-hash-table)) ; keys are symbols (declaim (type hash-table *backend-template-names*)) ;;; hashtables mapping from SC and SB names to the corresponding structures -(defglobal *backend-sc-names* (make-hash-table :test 'eq)) +(defglobal *backend-sc-names* (make-hash-table)) (declaim (type hash-table *backend-sc-names*)) ;;; translations from primitive type names to the corresponding ;;; primitive-type structure. -(defglobal *backend-primitive-type-names* - (make-hash-table :test 'eq)) +(defglobal *backend-primitive-type-names* (make-hash-table)) ; keys are symbols (declaim (type hash-table *backend-primitive-type-names*)) ;;; This establishes a convenient handle on primitive type unions, or @@ -81,13 +80,17 @@ ;;; a hashtable translating from VOP names to the corresponding VOP-PARSE ;;; structures. This information is only used at meta-compile time. -(defglobal *backend-parsed-vops* (make-hash-table :test 'eq)) +(defglobal *backend-parsed-vops* (make-hash-table)) ; keys are symbols (declaim (type hash-table *backend-parsed-vops*)) +;;; Mapping of predicate name (a symbol) to a type. +;;; This is an EQL table so that it uses symbol-hash. +(defglobal *backend-predicate-types* (make-hash-table)) ;;; mappings between CTYPE structures and the corresponding predicate. ;;; The type->predicate mapping is implemented as an alist because ;;; there is no such thing as a TYPE= hash table. -(defglobal *backend-predicate-types* (make-hash-table :test 'eq)) +;;; (But if we could make all the types use as keys in this table +;;; into interned types, could it become an EQ table perhaps?) (defglobal *backend-type-predicates* nil) (declaim (type hash-table *backend-predicate-types*)) (declaim (type list *backend-type-predicates*)) diff --git a/src/compiler/modarith.lisp b/src/compiler/modarith.lisp index 709c858950..970c014a97 100644 --- a/src/compiler/modarith.lisp +++ b/src/compiler/modarith.lisp @@ -16,12 +16,12 @@ (defstruct (modular-class (:copier nil)) ;; hash: name -> { :GOOD | optimizer | ({modular-fun-info}*)} - (funs (make-hash-table :test 'eq)) + (funs (make-hash-table)) ; keys are symbols ;; hash: modular-variant -> (prototype width) ;; ;; FIXME: Reimplement with generic function names of kind ;; (MODULAR-VERSION prototype width) - (versions (make-hash-table :test 'eq)) + (versions (make-hash-table)) ;; list of increasing widths + signedps (widths nil)) (define-load-time-global *untagged-unsigned-modular-class* (make-modular-class)) diff --git a/src/interpreter/special-forms.lisp b/src/interpreter/special-forms.lisp index d0fb9153a7..e3575198d5 100644 --- a/src/interpreter/special-forms.lisp +++ b/src/interpreter/special-forms.lisp @@ -1206,7 +1206,7 @@ ;; hand-generated lists of useful functions (setq *unary-functions* (sb-impl::%stuff-hash-table - (make-hash-table :test #'eq) + (make-hash-table) ; keys are symbols (macrolet ((def-wrapper (&rest input) (cons 'list @@ -1286,7 +1286,7 @@ (setq *binary-functions* (sb-impl::%stuff-hash-table - (make-hash-table :test #'eq) + (make-hash-table) ; keys are symbols (macrolet ((def-wrapper (&rest input) (cons 'list diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index aa4977094a..8da703fdf9 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -160,19 +160,6 @@ ht) some-actually-address-sensitive-key)) -;;; Every table in the pristine core that claims to be address-sensitive -;;; should _actually_ contains some address-sensitive key, -;;; unless GC removed all such keys from a weak table. -;;; It is easy to create situations where this is violated in normal user code, -;;; but it requires at least one REMHASH to occur. -(with-test (:name :spurious-address-sensitivity-again) - (dolist (ht (sb-vm::list-allocated-objects :dynamic :test #'hash-table-p)) - (let ((pairs (sb-impl::hash-table-pairs ht))) - (when (logtest sb-vm:vector-addr-hashing-subtype - (sb-kernel:get-header-data pairs)) - (assert (or (actually-address-sensitive-p ht) - (hash-table-weakness ht))))))) - (with-test (:name :unsynchronized-clrhash-no-lock) (let ((ht (make-hash-table))) (setf (gethash 1 ht) 2) From 4df84c792dff1ac5eaf596399fc3e4bab16575ab Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 17 Jun 2020 01:18:47 +0300 Subject: [PATCH 0131/4023] Hide uninitialized &optional in XEP type errors. Fixes lp#1883745 --- src/compiler/debug-dump.lisp | 49 +++++++++++++++++++++++++++++++++--- src/compiler/locall.lisp | 15 ++++++++--- tests/backtrace.impure.lisp | 19 ++++++++++++++ 3 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/compiler/debug-dump.lisp b/src/compiler/debug-dump.lisp index 6bc69775b4..ac154ca0bf 100644 --- a/src/compiler/debug-dump.lisp +++ b/src/compiler/debug-dump.lisp @@ -17,7 +17,7 @@ (declaim (type byte-buffer *byte-buffer*)) (defvar *contexts*) (declaim (type (vector t) *contexts*)) - +(defvar *local-call-context*) ;;;; debug blocks @@ -104,6 +104,35 @@ (defun leaf-visible-to-debugger-p (leaf node) (gethash leaf (make-lexenv-var-cache (node-lexenv node)))) +(defun optional-leaf-p (leaf) + (let ((home (lambda-var-home leaf))) + (case (functional-kind home) + (:external + (let ((entry (lambda-entry-fun home))) + (when (optional-dispatch-p entry) + (let ((pos (1- (position leaf (lambda-vars home))))) + (>= pos (optional-dispatch-min-args entry))))))))) + +;;; Type checks of the arguments in an external function happen before +;;; all the &optionals are initialized. PROPAGATE-TO-ARGS marks such +;;; locations with the entry point, which allows to deduce if an +;;; optional is alive at that point. +(defun optional-processed (leaf) + (let ((home (lambda-var-home leaf))) + (case (functional-kind home) + (:external + (let ((entry (lambda-entry-fun home))) + (if (and (optional-dispatch-p entry) + *local-call-context*) + (let ((pos (1- (position leaf (lambda-vars home)))) + (entry-pos (position *local-call-context* + (optional-dispatch-entry-points entry) + :key #'force))) + (not (and entry-pos + (>= pos (+ (optional-dispatch-min-args entry) entry-pos))))) + t))) + (t t)))) + ;;; Given a local conflicts vector and an IR2 block to represent the ;;; set of live TNs, and the VAR-LOCS hash-table representing the ;;; variables dumped, compute a bit-vector representing the set of @@ -126,9 +155,11 @@ '(:environment :debug-environment))) (leaf-visible-to-debugger-p leaf node)) (or (null spilled) - (not (member tn spilled)))) + (not (member tn spilled))) + (optional-processed leaf)) (let ((num (gethash leaf var-locs))) (when num + (setf (sbit res num) 1)))))) res)) @@ -173,6 +204,12 @@ (let* ((byte-buffer *byte-buffer*) (stepping (and (combination-p node) (combination-step-info node))) + (*local-call-context* + (if (local-call-context-p context) + (local-call-context-fun context))) + (context (if (local-call-context-p context) + (local-call-context-var context) + context)) (live (and live (compute-live-vars live node block var-locs vop))) (anything-alive (and live @@ -182,7 +219,10 @@ (path (node-source-path node)) (loc (if (fixnump label) label (label-position label))) - (form-number (source-path-form-number path))) + (form-number (source-path-form-number path)) + (context (if (opaque-box-p context) + (opaque-box-value context) + context))) (vector-push-extend (logior (if context @@ -421,7 +461,8 @@ (not (gethash tn (ir2-component-spilled-tns (component-info *component-being-compiled*)))) (lexenv-contains-lambda fun - (lambda-lexenv (lambda-var-home var)))) + (lambda-lexenv (lambda-var-home var))) + (not (optional-leaf-p var))) ;; not always initialized (setq flags (logior flags compiled-debug-var-environment-live))) (when save-tn (setq flags (logior flags compiled-debug-var-save-loc-p))) diff --git a/src/compiler/locall.lisp b/src/compiler/locall.lisp index 69625e5b2b..82e5b7c128 100644 --- a/src/compiler/locall.lisp +++ b/src/compiler/locall.lisp @@ -21,6 +21,12 @@ (in-package "SB-C") +(defstruct (local-call-context + (:constructor make-local-call-context (fun var)) + (:copier nil)) + (fun nil :read-only t) + (var nil :read-only t)) + ;;; This function propagates information from the variables in the ;;; function FUN to the actual arguments in CALL. This is also called ;;; by the VALUES IR1 optimizer when it sleazily converts MV-BINDs to @@ -36,10 +42,13 @@ (declare (type combination call) (type clambda fun)) (loop with policy = (lexenv-policy (node-lexenv call)) for args on (basic-combination-args call) - and var in (lambda-vars fun) + for var in (lambda-vars fun) + for name = (lambda-var-%source-name var) do (assert-lvar-type (car args) (leaf-type var) policy - (lambda-var-%source-name var)) - do (unless (leaf-refs var) + (if (eq (functional-kind fun) :optional) + (opaquely-quote (make-local-call-context fun name)) + name)) + (unless (leaf-refs var) (flush-dest (car args)) (setf (car args) nil))) (values)) diff --git a/tests/backtrace.impure.lisp b/tests/backtrace.impure.lisp index 31c553e0b0..4ba466a9c1 100644 --- a/tests/backtrace.impure.lisp +++ b/tests/backtrace.impure.lisp @@ -656,3 +656,22 @@ (sb-debug:print-backtrace :count 100 :stream stream)))) (foo 100 (let ((list (list t))) (nconc list list))))))) + +(with-test (:name :uninitialized-optionals) + (let ((fun (checked-compile + `(lambda (l &optional m n) + (declare (fixnum l)) + (values l m n))))) + (checked-compile-and-assert + () + `(lambda (fun &rest args) + (block nil + (handler-bind ((error + (lambda (c) + c + (return (cdar (sb-debug:list-backtrace :count 1)))))) + (apply fun args)))) + ((fun t) (list t *unavailable-argument* *unavailable-argument*) :test #'equalp) + ((fun t 1) (list t 1 *unavailable-argument*) :test #'equalp) + ((fun t 1 2) (list t 1 2) :test #'equalp) + ((fun 1 2 3) (values 1 2 3))))) From 4ad1f6470443fd1337c529096e0d9dca9c613799 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 17 Jun 2020 02:31:14 +0300 Subject: [PATCH 0132/4023] Pacify some build hosts. --- src/compiler/debug-dump.lisp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/compiler/debug-dump.lisp b/src/compiler/debug-dump.lisp index ac154ca0bf..a4e7bb2ded 100644 --- a/src/compiler/debug-dump.lisp +++ b/src/compiler/debug-dump.lisp @@ -110,8 +110,9 @@ (:external (let ((entry (lambda-entry-fun home))) (when (optional-dispatch-p entry) - (let ((pos (1- (position leaf (lambda-vars home))))) - (>= pos (optional-dispatch-min-args entry))))))))) + (let ((pos (position leaf (lambda-vars home)))) + (and pos + (>= (1- pos) (optional-dispatch-min-args entry)))))))))) ;;; Type checks of the arguments in an external function happen before ;;; all the &optionals are initialized. PROPAGATE-TO-ARGS marks such @@ -124,12 +125,13 @@ (let ((entry (lambda-entry-fun home))) (if (and (optional-dispatch-p entry) *local-call-context*) - (let ((pos (1- (position leaf (lambda-vars home)))) + (let ((pos (position leaf (lambda-vars home))) (entry-pos (position *local-call-context* (optional-dispatch-entry-points entry) :key #'force))) - (not (and entry-pos - (>= pos (+ (optional-dispatch-min-args entry) entry-pos))))) + (not (and pos + entry-pos + (>= (1- pos) (+ (optional-dispatch-min-args entry) entry-pos))))) t))) (t t)))) From 5170015821e0f1c6c50ce54349765692f435caed Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 18 Jun 2020 10:56:00 -0400 Subject: [PATCH 0133/4023] Make FINDHASH-WEAK immune to infinite looping When an address-sensitive key is not found, at most one rehash needs to be done, but a spectacularly unlucky scheduling of GC could have caused it to repeatedly rehash. This bug was present prior to the function as it exists in its current form- all variations of GETHASH could loop, because any concurrent reader could mess up all chains for all other readers. In the new algorithm, a rehash-without-growing is always associated with a linear search for the key that triggered rehash. It's no more work to do both at once. For a weak table, this algorithm takes advantage of the fact that we disallow multi-readers (for now anyway) which makes the logic that much simpler. This change also cleans up some leftover mess which is that element 1 of the pairs vector was either known as the "needs-rehash" flag or the "epoch". It is now consistently named the "rehash-stamp" which is orthogonal to the bug fix. --- src/code/target-hash-table.lisp | 261 ++++++++++++++++---------------- tests/hash-table.impure.lisp | 9 +- 2 files changed, 138 insertions(+), 132 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 27427f1e20..fcb6b28f6c 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -284,7 +284,9 @@ Examples: ;; ;; We could do it with a single bit by implementing vops for atomic ;; read/modify/write on the header. In C there's sync_or_and_fetch, etc. -(defmacro kv-vector-needs-rehash (vector) `(svref ,vector 1)) +(defconstant rehash-stamp-elt 1) +(defmacro kv-vector-rehash-stamp (vector) `(truly-the fixnum (svref ,vector 1))) +(defconstant kv-vector-rehashing 2) ;;; The 'supplement' points to the hash-table if the table is weak, ;;; or to the hash vector if the table is not weak. @@ -299,7 +301,7 @@ Examples: `(let ((v (make-array (+ (* 2 ,size) kv-pairs-overhead-slots) :initial-element +empty-ht-slot+))) (setf (kv-vector-high-water-mark v) 0) - (setf (kv-vector-needs-rehash v) 0) + (setf (kv-vector-rehash-stamp v) 0) ;; GC will see the vector as a hashing vector as soon as HASHING-SUBTYPE ;; is set, so it needs to see a valid value in the 'supplement' slot. ;; Neither 0 nor +empty-ht-slot+ is a valid value. @@ -660,6 +662,25 @@ multiple threads accessing the same hash-table without locking." (get-lisp-obj-address (the fixnum y))) most-positive-word)))) +;;; Clear rehash bit and bump the rolling count, wrapping around to keep it a fixnum. +;;; need-to-rehash is indicated by a stamp of #b______01 ; "initial stamp" +;;; which is changed during rehash to #b______10 ; "rehashing stamp" +;;; rolling count --------^^^^^^ (some number of bits) +(defmacro done-rehashing (kv-vector initial-stamp) + `(let ((rehashing-stamp (1+ ,initial-stamp)) + ;; new stamp has the "count" field bumped up by 1, and the low 2 bits are 0. + (new-stamp (sb-vm::+-modfx ,initial-stamp 3))) + ;; Assigning new stamp races with GC which might set the 'rehash' (low) bit again. + ;; At most one more attempt is needed since no other state change can occur - + ;; we don't need to keep trying to achieve a state in which 'rehash' is clear. + (let ((old (cas (svref ,kv-vector rehash-stamp-elt) rehashing-stamp new-stamp))) + (unless (eq old rehashing-stamp) + ;; While rehashing, GC could have set the 0 bit indicating + ;; that the hashes are obsolete yet again. + (aver (eq old (logior rehashing-stamp 1))) + ;; So bump the count field, but leave the least-significant bit on. + (aver (eq old (cas (svref ,kv-vector rehash-stamp-elt) old (logior new-stamp 1)))))))) + (macrolet ((with-pair ((key-var &optional val-var) &body body) `(let* ((key-index (* 2 i)) @@ -774,7 +795,7 @@ multiple threads accessing the same hash-table without locking." ;; Transitioning from #b01 to #b10 clears the 'rehash' bit and sets the ;; rehash-in-progress bit. It also gives this thread exclusive write access ;; to the hashing vectors, since at most one thread can win this CAS. - (when (eq (cas (svref kv-vector 1) epoch rehashing-state) epoch) + (when (eq (cas (svref kv-vector rehash-stamp-elt) epoch rehashing-state) epoch) ;; Remove address-sensitivity, preserving the other flags. (unset-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) ;; Rehash in place. For the duration of the rehash, readers who otherwise @@ -825,14 +846,7 @@ multiple threads accessing the same hash-table without locking." (push-in-chain (pointer-hash->bucket (pointer-hash pair-key) mask)) (when (eq pair-key key) (setq result key-index))))))) - ;; Clear rehash bit and bump the epoch, wrapping around to keep it a fixnum - (let ((new-epoch (sb-vm::+-modfx epoch 3))) - ;; Setting the new epoch races with GC which might set 'rehash' again. - ;; At most 2 attempts are needed since no other state change can occur. - (let ((old (cas (svref kv-vector 1) rehashing-state new-epoch))) - (unless (eq rehashing-state old) - (aver (eq old (logior rehashing-state 1))) ; rehashed, but already obsolete - (aver (eq old (cas (svref kv-vector 1) old (logior new-epoch 1))))))) + (done-rehashing kv-vector epoch) (unless (eql result 0) (setf (hash-table-cache table) result)) result)))) @@ -1130,11 +1144,9 @@ if there is no such entry. Entries can be added using SETF." (defmacro ht-probe-advance (var) `(setq ,var (truly-the index/2 (aref next-vector ,var)))) -(defmacro kv-vector-rehash-epoch (vector) `(truly-the fixnum (svref ,vector 1))) -(defconstant kv-vector-rehashing 2) #| -bottom 2 bits of kv-vector-rehash-epoch: +bottom 2 bits of kv-vector-rehash-stamp: 00 = valid hashes 01 = an address-sensitive key moved @@ -1210,8 +1222,8 @@ nnnn 1_ any linear scan ,(if (eq std-fn 'eql) '(loop (probe) (probe) (check-excessive-probes 2)) '(loop (probe) (check-excessive-probes 1)))))))) - (named-let retry ((initial-epoch (kv-vector-rehash-epoch kv-vector))) - (if (logtest initial-epoch kv-vector-rehashing) + (named-let retry ((initial-stamp (kv-vector-rehash-stamp kv-vector))) + (if (logtest initial-stamp kv-vector-rehashing) (truly-the (values t boolean &optional) (hash-table-lsearch hash-table eq-test key hash default)) (let ((index (hash-search))) @@ -1219,28 +1231,28 @@ nnnn 1_ any linear scan (let ((key-index (* 2 (truly-the index/2 index)))) (setf (hash-table-cache hash-table) key-index) (values (aref kv-vector (1+ key-index)) t)) - (let ((epoch (kv-vector-rehash-epoch kv-vector))) - (cond ((and (evenp initial-epoch) ; valid hashes at start? - (zerop (logandc2 (logxor epoch initial-epoch) 1))) - ;; Provided that the epoch didn't change, the 'rehash' + (let ((stamp (kv-vector-rehash-stamp kv-vector))) + (cond ((and (evenp initial-stamp) ; valid hashes at start? + (zerop (logandc2 (logxor stamp initial-stamp) 1))) + ;; Provided that the stamp didn't change, the 'rehash' ;; bit can be ignored since rehash did not occur. (values default nil)) - ((and (oddp initial-epoch) (= epoch initial-epoch)) - ;; Epoch didn't change, but address-based hashes were + ((and (oddp initial-stamp) (= stamp initial-stamp)) + ;; Stamp didn't change, but address-based hashes were ;; not valid at the start of the lookup. ;; Stably hashed (address-insensitive) keys are ok. (if (not address-based-p) (values default nil) - (let ((key-index (%rehash-and-find hash-table epoch key))) + (let ((key-index (%rehash-and-find hash-table stamp key))) (cond ((eql key-index 0) ; didn't find, again (values default nil)) ((not (fixnump key-index)) ;; conflicted with other thread trying to rehash - (retry (kv-vector-rehash-epoch kv-vector))) + (retry (kv-vector-rehash-stamp kv-vector))) (t (values (aref kv-vector (1+ key-index)) t)))))) - (t ; epoch changed - (retry epoch))))))))))))) + (t ; stamp changed + (retry stamp))))))))))))) ;;;; Weak table variant. @@ -1250,94 +1262,87 @@ nnnn 1_ any linear scan ;;; to change a cell from non-empty to smashed. Therefore if we could leverage a ;;; collector from some other language, it need not understand our weak ;;; hash-table representation in depth. -(macrolet ((with-pair ((&optional (physical-index '(* next 2))) &body body) - ;; Load the {k,v} of a pair. We will check that they're not smashed - ;; before using. Note an extreme subtlety: by loading VAL first, - ;; we decrease the chance of seeing a live key but smashed value. - `(let* ((physical-index (truly-the index ,physical-index)) - (probed-val (svref kv-vector (1+ physical-index))) - (probed-key (svref kv-vector physical-index))) - ,@body))) - (defun findhash-weak (key hash-table hash address-based-p) - (declare (hash-table hash-table) (optimize speed) - (type (unsigned-byte #-64-bit 29 #+64-bit 31) hash)) - (macrolet ((return-hit () - '(return-from findhash-weak - (values probed-val probed-key physical-index predecessor)))) - (let ((start-epoch sb-kernel::*gc-epoch*) - (kv-vector (hash-table-pairs hash-table))) - (tagbody - (go entry) - MISS - (let ((current-epoch sb-kernel::*gc-epoch*)) - (when (eq start-epoch current-epoch) - (return-from findhash-weak (values +empty-ht-slot+ 0 0 0))) - (setq start-epoch current-epoch)) - ENTRY - (when (oddp (truly-the fixnum - (kv-vector-needs-rehash (hash-table-pairs hash-table)))) - (without-interrupts - ;; Remove weakness and address-sensitivity. - (set-header-data kv-vector sb-vm:vector-hashing-subtype) - ;; Clear the need-to-rehash flag. Since there can be no other readers, - ;; we're not publishing bad information (i.e. allegedly valid hashes - ;; when they're in an inconsistent state). If GC sets the flag again, - ;; we'll know that the end state is already obsolete. - ;; In this regard the algorithm is simpler than that of %REHASH-AND-FIND. - (setf (kv-vector-needs-rehash kv-vector) 0) - ;; We don't need to zero-fill the NEXT vector, just the INDEX vector. - ;; Unless a key slot can be reached by a chain starting from the index - ;; vector or the 'next' of a previous chain element, we don't read either - ;; the key or its corresponding 'next'. So we only need to assign a - ;; 'next' at the moment a slot is linked into a chain. - (setf (hash-table-next-free-kv hash-table) - (rehash kv-vector (hash-table-hash-vector hash-table) - (fill (hash-table-index-vector hash-table) 0) - (hash-table-next-vector hash-table) - hash-table)) - ;; Empty cells will have been placed in the ordinary freelist, - ;; so clear the list of GC-smashed cells. - (setf (hash-table-smashed-cells hash-table) nil) - ;; Re-enable weakness - (set-header-bits kv-vector sb-vm:vector-weak-subtype))) - ;; Note that it's OK for a GC + another rehash to - ;; be triggered by another thread after this point, since the - ;; GC epoch check will catch it. - (binding* #.(ht-probe-setup '* '((predecessor nil))) + +;;; TODO: it would be ideal if GETHASH/WEAK could share code with GETHASH/ANY +;;; (the general case of hash-function + predicate). +;;; The difficulty in doing so is that %REHASH-AND-FIND has trouble understanding +;;; how to treat keys that are +empty-ht-slot+ in a weak table - we don't know if +;;; a key was smashed by GC and the cell still exists in a bucket's chain, +;;; versus the cell being in the freelist. So the code diverges in at least that way. +(defun findhash-weak (key hash-table hash address-based-p) + (declare (hash-table hash-table) (optimize speed) + (type (unsigned-byte #-64-bit 29 #+64-bit 31) hash)) + (let* ((kv-vector (hash-table-pairs hash-table)) + (initial-stamp (kv-vector-rehash-stamp kv-vector))) + (flet ((hash-search () + (binding* #.(ht-probe-setup '* '((predecessor nil))) (declare (index/2 index)) - ;; Everything in an EQ table is address-based - though this is subject - ;; to change, as we could stably hash symbols, because why not - - ;; but the hash fun's second value is NIL on immediate objects. - (cond - ((or address-based-p (eq (hash-table-test hash-table) 'eq)) - (do ((next index (aref next-vector next))) - ((zerop next) (go miss)) - (declare (type index/2 next)) - (with-pair () (when (eq key probed-key) (return-hit))) - (check-excessive-probes 1) - (setq predecessor next))) - ((eq (hash-table-test hash-table) 'eql) - ;; similar to EQ except for the different comparator - (do ((next index (aref next-vector next))) - ((zerop next) (go miss)) - (declare (type index/2 next)) - (with-pair () (when (%eql key probed-key) (return-hit))) - (check-excessive-probes 1) - (setq predecessor next))) - (t - ;; For any other test, we assume that it is not safe to pass the - ;; unbound marker to the predicate (though EQUAL and EQUALP are - ;; probably OK). Also, compare hashes first. - (do ((next index (aref next-vector next))) - ((zerop next) (go miss)) - (declare (type index/2 next)) - (with-pair () - (when (and (not (empty-ht-slot-p probed-key)) - (= hash (aref hash-vector next)) - (funcall test-fun key probed-key)) - (return-hit))) - (check-excessive-probes 1) - (setq predecessor next)))))))))) + (macrolet + ((probing-loop (comparison-expr) + `(do ((next index (aref next-vector next))) + ((zerop next) (values +empty-ht-slot+ 0 0 0)) + (declare (type index/2 next)) + (let* ((physical-index (truly-the index (* next 2))) + (probed-val (svref kv-vector (1+ physical-index))) + (probed-key (svref kv-vector physical-index))) + (when ,comparison-expr + (return (values probed-val probed-key physical-index predecessor))) + (check-excessive-probes 1) + (setq predecessor next))))) + (cond + ((or (eq (hash-table-test hash-table) 'eq) address-based-p) + ;; Everything in an EQ table is address-based - though this is subject + ;; to change, as we could stably hash symbols, because why not - + ;; but the hash fun's second value is NIL on immediate objects. + (probing-loop (eq key probed-key))) + ((eq (hash-table-test hash-table) 'eql) + ;; similar to EQ except for the different comparator + (probing-loop (%eql key probed-key))) + (t + ;; For any other test, we assume that it is not safe to pass the + ;; unbound marker to the predicate (though EQUAL and EQUALP are + ;; probably OK). Also, compare hashes first. + (probing-loop (and (not (empty-ht-slot-p probed-key)) + (= hash (aref hash-vector next)) + (funcall test-fun key probed-key))))))))) + ;; Weak tables disallow concurrent GETHASH therefore we can't + ;; be in the midst of fixing up obsolete address-based hashes. + (aver (not (logtest initial-stamp kv-vector-rehashing))) + (multiple-value-bind (probed-val probed-key physical-index predecessor) + (hash-search) + (cond + ((or (neq physical-index 0) ; found + (not address-based-p) ; key was stably hashed + (evenp initial-stamp)) ; not found, but address-based hashes were valid + (values probed-val probed-key physical-index predecessor)) + (t ; invalid hashes at start, and key's hash was address-based + (without-interrupts + ;; set the stamp to rehashing. There should be no concurrent + ;; access, but use CAS to be sure. + (aver (eql (cas (svref kv-vector rehash-stamp-elt) initial-stamp + (1+ initial-stamp)) initial-stamp)) + ;; Remove weakness and address-sensitivity. + (set-header-data kv-vector sb-vm:vector-hashing-subtype) + ;; We don't need to zero-fill the NEXT vector, just the INDEX vector. + ;; Unless a key slot can be reached by a chain starting from the index + ;; vector or the 'next' of a previous chain element, we don't read either + ;; the key or its corresponding 'next'. So we only need to assign a + ;; 'next' at the moment a slot is linked into a chain. + (setf (hash-table-next-free-kv hash-table) + (rehash kv-vector (hash-table-hash-vector hash-table) + (fill (hash-table-index-vector hash-table) 0) + (hash-table-next-vector hash-table) + hash-table)) + ;; Empty cells will have been placed in the ordinary freelist, + ;; so clear the list of GC-smashed cells. + (setf (hash-table-smashed-cells hash-table) nil) + ;; Re-enable weakness + (set-header-bits kv-vector sb-vm:vector-weak-subtype) + (done-rehashing kv-vector initial-stamp)) + ;; One more try gives the definitive answer even if the hashes are + ;; obsolete again. KEY's hash can't have changed, and there + ;; are no concurrent readers to potentially mess up the chains. + (hash-search))))))) (defmacro with-weak-hash-table-entry (&body body) `(with-pinned-objects (key) @@ -1507,7 +1512,7 @@ nnnn 1_ any linear scan (setf (aref next-vector kv-index) (hash-table-next-free-kv hash-table)) kv-index))) -;;; We don't need the looping and checking for GC epoch in PUTHASH +;;; We don't need the looping and checking for GC activiy in PUTHASH ;;; because insertion can not co-occur with any other operation, ;;; unlike GETHASH which we allow to execute in multiple threads. (defmacro define-ht-setter (name std-fn) @@ -1540,7 +1545,7 @@ nnnn 1_ any linear scan ;; until t3, we're forced to conclude that KEY's hash might have been wrong. ;; Granted that the bit might have been 1 at timestamp 't1', ;; but it's best to read it at t1 and not later. - (binding* ((initial-epoch (kv-vector-rehash-epoch kv-vector)) + (binding* ((initial-stamp (kv-vector-rehash-stamp kv-vector)) ,@(ht-hash-setup std-fn 'puthash) ,@(ht-probe-setup std-fn) (eq-test ,(ht-probing-should-use-eq std-fn))) @@ -1569,14 +1574,14 @@ nnnn 1_ any linear scan ;; Only the initial state of the 'rehash' bit is important. ;; If the bit changed from 0 to 1, then KEY's hash was good because ;; it was pinned at the time we observed the rehash status to be 0. - (when (and address-based-p (oddp initial-epoch)) - ;; The current epoch must be the same as initial-epoch, because + (when (and address-based-p (oddp initial-stamp)) + ;; The current stamp must be the same as initial-stamp, because ;; PUTHASH is disallowed concurrently with any other operation, ;; and the 'rehash' bit can't be cleared except by rehashing ;; as part of such operation. - (unless (eq (kv-vector-rehash-epoch kv-vector) initial-epoch) + (unless (eq (kv-vector-rehash-stamp kv-vector) initial-stamp) (signal-corrupt-hash-table hash-table)) - (let ((key-index (%rehash-and-find hash-table initial-epoch key))) + (let ((key-index (%rehash-and-find hash-table initial-stamp key))) ;; If we see NIL here, it means that some other operation is racing ;; to rehash. GETHASH can deal with that scenario, PUTHASH can't. (cond ((eql key-index 0)) ; fallthrough to insert @@ -1677,9 +1682,9 @@ nnnn 1_ any linear scan ;; to do in removing the item from a chain, whereas a miss means we don't know ;; if there is work to do, so effectively there is work to do either way. (with-pinned-objects (key) - ;; See comment in DEFINE-HT-SETTER about why to read initial-epoch + ;; See comment in DEFINE-HT-SETTER about why to read initial-stamp ;; as soon as possible after pinning KEY. - (binding* ((initial-epoch (kv-vector-rehash-epoch kv-vector)) + (binding* ((initial-stamp (kv-vector-rehash-stamp kv-vector)) ,@(ht-hash-setup std-fn 'remhash) ,@(ht-probe-setup std-fn) (eq-test ,(ht-probing-should-use-eq std-fn))) @@ -1711,8 +1716,8 @@ nnnn 1_ any linear scan ;; Only the initial state of the 'rehash' bit is important. ;; If the bit changed from 0 to 1, then KEY's hash was good because ;; it was pinned at the time we observed the rehash status to be 0. - (when (and address-based-p (oddp initial-epoch)) - (remove-from-bucket key bucket hash-table initial-epoch))))))) + (when (and address-based-p (oddp initial-stamp)) + (remove-from-bucket key bucket hash-table initial-stamp))))))) (defun remhash/weak (key hash-table) (declare (type hash-table hash-table) (optimize speed)) @@ -1758,7 +1763,7 @@ nnnn 1_ any linear scan ;; type-error, so don't turn down the safety! (decf (hash-table-%count hash-table)) t) - (remove-from-bucket (key bucket hash-table initial-epoch + (remove-from-bucket (key bucket hash-table initial-stamp &aux (kv-vector (hash-table-pairs hash-table))) ;; Remove KEY from BUCKET which is based on the current address ;; of key after pinning. When the key was not found initially, @@ -1766,13 +1771,13 @@ nnnn 1_ any linear scan ;; did not hold the key, and not that search was done on the wrong ;; bucket. Rehashing will place the key into the expected bucket. ;; - ;; The current epoch must be the same as initial-epoch, because + ;; The current stamp must be the same as initial-stamp, because ;; REMHASH is disallowed concurrently with any other operation, ;; and the 'rehash' bit can't be cleared except by rehashing ;; as part of such operation. - (unless (eq (kv-vector-rehash-epoch kv-vector) initial-epoch) + (unless (eq (kv-vector-rehash-stamp kv-vector) initial-stamp) (signal-corrupt-hash-table hash-table)) - (let ((key-index (%rehash-and-find hash-table initial-epoch key))) + (let ((key-index (%rehash-and-find hash-table initial-stamp key))) ;; If we see NIL here, it means that some other operation is racing ;; to rehash. GETHASH can deal with that scenario, REMHASH can't. (unless (fixnump key-index) @@ -1872,7 +1877,7 @@ table itself." (unset-header-bits kv-vector sb-vm:vector-addr-hashing-subtype) ;; Do this only after unsetting the address-sensitive bit, ;; otherwise GC might come along and touch this bit again. - (setf (kv-vector-needs-rehash kv-vector) 0) + (setf (kv-vector-rehash-stamp kv-vector) 0) ;; We always deposit empty markers into k/v pairs that are REMHASHed, ;; so a count of 0 implies no clearing need be done. (when (plusp (hash-table-%count hash-table)) diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 8da703fdf9..6f7b284750 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -52,9 +52,9 @@ (with-test (:name :gc-while-growing-weak-hash-table) (let ((h (make-hash-table :weakness :key))) (setq *gc-after-rehash-me* h) - (dotimes (i 14) (setf (gethash (list (gensym)) h) i)) + (dotimes (i 50) (setf (gethash (list (gensym)) h) i)) (setf (gethash (cons 1 2) h) 'foolz)) - (assert (= *rehash+gc-count* 1))) + (assert (>= *rehash+gc-count* 10))) (defstruct this x) (defstruct that x) @@ -82,6 +82,7 @@ (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs h)) sb-vm:vector-hashing-subtype)))) +(defmacro kv-vector-needs-rehash (x) `(svref ,x 1)) ;;; EQL tables no longer get a hash vector, so the GC has to decide ;;; for itself whether key movement forces rehash. ;;; Let's make sure that works. @@ -112,7 +113,7 @@ (assert (plusp n-keys-moved)) ;; keys were moved, the table is marked as address-based, ;; but no key that moved forced a rehash - (assert (zerop (sb-impl::kv-vector-needs-rehash + (assert (zerop (kv-vector-needs-rehash (sb-impl::hash-table-pairs tbl))))) ;; the vector type is unchanged (assert (= (sb-kernel:get-header-data (sb-impl::hash-table-pairs tbl)) @@ -123,7 +124,7 @@ (setf (gethash (cons 5 6) tbl) 'three) (gc) ;; now some key should have moved and forced a rehash - (assert (not (zerop (sb-impl::kv-vector-needs-rehash + (assert (not (zerop (kv-vector-needs-rehash (sb-impl::hash-table-pairs tbl))))) ;; This next thing is impossible to test without some hacks - ;; we want to see that the addr-hashing flag can be cleared From 790a82f7b6989100b74c7b9346f9b5adb6647655 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 18 Jun 2020 11:09:47 -0400 Subject: [PATCH 0134/4023] Reduce hash-table size to 7 if unspecified One extra doubling to attain the former initial size of 14 does not affect asymptotic behavior in the least. Using make-host-1 as a measure of "typical" table usage, 10% of all tables never got a single key inserted, 20% got exactly 1 key, and maximum usage of 0 through 7 keys encompassed 75% of all tables. The memory consumption (for 64-bit cpu) of a default table is now 448 bytes: * (sb-aprof:aprof-run #'make-hash-table) % Bytes Count Function ------- ----------- --------- -------- 57.1 256 %MAKE-HASH-TABLE 62.5 160 1 SIMPLE-VECTOR 37.5 96 2 (SIMPLE-ARRAY (UNSIGNED-BYTE 32) (*)) 42.9 192 1 %ALLOC-HASH-TABLE - HASH-TABLE ======= =========== 100.0 448 Prior to git rev b16db3ecdc (the first of many changes that affected hash tables) it was in excess of 1200 bytes. --- src/code/maphash.lisp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/code/maphash.lisp b/src/code/maphash.lisp index 18cea7ef76..89255af986 100644 --- a/src/code/maphash.lisp +++ b/src/code/maphash.lisp @@ -141,7 +141,10 @@ for." (defconstant +ht-weak-key-OR-value+ 3) (eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant +min-hash-table-size+ 14) + ;; Don't raise this number to 8 - if you do it'll increase the memory + ;; consumption of a default MAKE-HASH-TABLE call by 7% just due to + ;; padding slots. This is a "perfect" minimal size. + (defconstant +min-hash-table-size+ 7) (defconstant default-rehash-size $1.5)) (defmacro make-system-hash-table (&key test synchronized weakness finalizer) From 2782c691650a2fb8ff1aabd530eb6815e8b1f93a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 19 Jun 2020 12:44:26 -0400 Subject: [PATCH 0135/4023] Remove constants.h docstring noise There are no relevant docstrings, and even if there were, the host is free to choose to discard them. --- src/compiler/generic/genesis.lisp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 2351dfa9c7..465152fb62 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2902,8 +2902,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (push (list string priority (symbol-value symbol) - suffix - (documentation symbol 'variable)) + suffix) constants)) ;; machinery for old-style CMU CL Lisp-to-C ;; arbitrary renaming, being phased out in favor of @@ -2961,12 +2960,11 @@ Legal values for OFFSET are -4, -8, -12, ..." (push (list (c-symbol-name c) -1 ; invent a new priority (symbol-value c) - "" - nil) + "") constants)) ;; One more symbol that doesn't fit into the code above. (let ((c 'sb-impl::+magic-hash-vector-value+)) - (push (list (c-symbol-name c) 9 (symbol-value c) +c-literal-64bit+ nil) + (push (list (c-symbol-name c) 9 (symbol-value c) +c-literal-64bit+) constants)) (setf constants (sort constants @@ -2978,13 +2976,13 @@ Legal values for OFFSET are -4, -8, -12, ..." (< (second const1) (second const2)))))) (let ((prev-priority (second (car constants)))) (dolist (const constants) - (destructuring-bind (name priority value suffix doc) const + (destructuring-bind (name priority value suffix) const (unless (= prev-priority priority) (terpri) (setf prev-priority priority)) (when (minusp value) (error "stub: negative values unsupported")) - (format t "#define ~A ~A~A /* 0x~X ~@[ -- ~A ~]*/~%" name value suffix value doc)))) + (format t "#define ~A ~A~A /* 0x~X */~%" name value suffix value)))) (terpri)) (format t "#define BACKEND_PAGE_BYTES ~D~%" sb-c:+backend-page-bytes+) From 154f8fbcc109a1d5b65d81dcfb520ab4cfa13aa1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 19 Jun 2020 13:29:52 -0400 Subject: [PATCH 0136/4023] Add constant for the base of user-visible static-space objects Skip over the unboxed array in which 'struct alloc_region' is embedded. I suspect that the array header is not needed now after this. --- src/assembly/x86/alloc.lisp | 2 +- src/code/room.lisp | 5 ++--- src/compiler/generic/genesis.lisp | 7 +++++++ src/runtime/coalesce.c | 2 +- src/runtime/coreparse.c | 6 +++--- src/runtime/fullcgc.c | 2 +- src/runtime/gencgc.c | 6 +++--- src/runtime/immobile-space.c | 7 +++---- src/runtime/os-common.c | 2 +- src/runtime/parse.c | 2 +- src/runtime/search.c | 2 +- src/runtime/traceroot.c | 2 +- 12 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/assembly/x86/alloc.lisp b/src/assembly/x86/alloc.lisp index 85f6686b63..85e3d30719 100644 --- a/src/assembly/x86/alloc.lisp +++ b/src/assembly/x86/alloc.lisp @@ -57,7 +57,7 @@ (make-ea :dword :disp (ash thread-alloc-region-slot 2)) :fs) #-sb-thread (inst sub ,reg - (make-ea :dword :disp (+ 8 static-space-start))))))) + (make-ea :dword :disp boxed-region)))))) (case reg ;; Now that we're using lisp asm code instead of a .S file ;; this could be done more intelligently - the macro can decide diff --git a/src/code/room.lisp b/src/code/room.lisp index 574c8f0a7d..82ef6da9c8 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -603,9 +603,8 @@ We could try a few things to mitigate this: (let ((region-struct #+sb-thread (sap+ (sb-thread::current-thread-sap) (ash thread-alloc-region-slot word-shift)) - ;; If no threads, the region structure is 2 words past the static space start, - ;; embedded in an unboxed array. - #-sb-thread (int-sap (+ static-space-start (* 2 n-word-bytes))))) + ;; If no threads, the alloc_region struct is in static space. + #-sb-thread (int-sap boxed-region))) ;; The 'start_addr' field is at word index 3 of the structure (see gencgc-alloc-region.h). (unless (eql (sap-ref-word region-struct (ash 3 word-shift)) 0) (alien-funcall (extern-alien "gc_close_region" (function void system-area-pointer int)) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 465152fb62..a6f24dfeb4 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2966,6 +2966,13 @@ Legal values for OFFSET are -4, -8, -12, ..." (let ((c 'sb-impl::+magic-hash-vector-value+)) (push (list (c-symbol-name c) 9 (symbol-value c) +c-literal-64bit+) constants)) + ;; I find this entire mechanism to be overengineered, and I'd much prefer + ;; a simple data table constructed via backquote perhaps. + ;; But this (PUSH (LIST ..)) is the worst possible way, obviously. + (push (list "STATIC_SPACE_OBJECTS_START" 7 + (logandc2 sb-vm:nil-value sb-vm:lowtag-mask) + +c-literal-64bit+) + constants) (setf constants (sort constants (lambda (const1 const2) diff --git a/src/runtime/coalesce.c b/src/runtime/coalesce.c index 11216002a5..29f767a19c 100644 --- a/src/runtime/coalesce.c +++ b/src/runtime/coalesce.c @@ -206,7 +206,7 @@ void coalesce_similar_objects() coalesce_range((lispobj*)READ_ONLY_SPACE_START, (lispobj*)READ_ONLY_SPACE_END, arg); - coalesce_range((lispobj*)STATIC_SPACE_START, + coalesce_range((lispobj*)STATIC_SPACE_OBJECTS_START, (lispobj*)STATIC_SPACE_END, arg); #endif diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index f300a86419..8371ae4167 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -596,7 +596,7 @@ static void relocate_heap(struct heap_adjust* adj) (char*)adj->range[i].start + adj->range[i].delta, (char*)adj->range[i].end + adj->range[i].delta); } - relocate_space(STATIC_SPACE_START, static_space_free_pointer, adj); + relocate_space(STATIC_SPACE_OBJECTS_START, static_space_free_pointer, adj); #ifdef LISP_FEATURE_IMMOBILE_SPACE relocate_space(FIXEDOBJ_SPACE_START, fixedobj_free_pointer, adj); #endif @@ -646,7 +646,7 @@ void calc_asm_routine_bounds() if (widetag_of((lispobj*)READ_ONLY_SPACE_START) == CODE_HEADER_WIDETAG) { asm_routines_start = READ_ONLY_SPACE_START; } else { - lispobj *where = (lispobj*)STATIC_SPACE_START; + lispobj *where = (lispobj*)STATIC_SPACE_OBJECTS_START; for (; where < static_space_free_pointer; where += OBJECT_SIZE(*where, where)) if (widetag_of((lispobj*)where) == CODE_HEADER_WIDETAG) { asm_routines_start = (uword_t)where; @@ -1251,7 +1251,7 @@ static void sanity_check_loaded_core(lispobj initial_function) 1<<18, /* initial size */ 0); { - lispobj* where = (lispobj*)STATIC_SPACE_START; + lispobj* where = (lispobj*)STATIC_SPACE_OBJECTS_START; lispobj* end = static_space_free_pointer; while (where 1) { FSHOW((stderr, "/scavenge static space: %d bytes\n", - (uword_t)static_space_free_pointer - STATIC_SPACE_START)); + (uword_t)static_space_free_pointer - STATIC_SPACE_OBJECTS_START)); } - heap_scavenge((lispobj*)STATIC_SPACE_START, static_space_free_pointer); + heap_scavenge((lispobj*)STATIC_SPACE_OBJECTS_START, static_space_free_pointer); /* All generations but the generation being GCed need to be * scavenged. The new_space generation needs special handling as diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 5823525e26..a9d16af1b8 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1516,7 +1516,7 @@ static inline boolean known_space_p(lispobj ptr) return find_page_index((char*)ptr) >= 0 || tempspace_p((char*)ptr) || immobile_space_p(ptr) - || (STATIC_SPACE_START <= ptr && ptr < STATIC_SPACE_END); + || (STATIC_SPACE_OBJECTS_START <= ptr && ptr < STATIC_SPACE_END); } static boolean forwardable_ptr_p(lispobj ptr) { @@ -1623,7 +1623,6 @@ static void fixup_space(lispobj* where, size_t n_words) lispobj* end = where + n_words; int widetag; long size; - int __attribute__((unused)) static_space_p = ((lispobj)where == STATIC_SPACE_START); struct code* code; while (where < end) { @@ -2165,8 +2164,8 @@ static void defrag_immobile_space(boolean verbose) } // Fix Lisp pointers in static, immobile, and dynamic spaces - fixup_space((lispobj*)STATIC_SPACE_START, - static_space_free_pointer - (lispobj*)STATIC_SPACE_START); + fixup_space((lispobj*)STATIC_SPACE_OBJECTS_START, + static_space_free_pointer - (lispobj*)STATIC_SPACE_OBJECTS_START); // Objects in immobile space are physically at 'tempspace', // but logically at their natural address. Perform fixups diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 4926e3e2d6..d7db0e1775 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -212,7 +212,7 @@ boolean gc_managed_heap_space_p(lispobj addr) { if ((READ_ONLY_SPACE_START <= addr && addr < READ_ONLY_SPACE_END) - || (STATIC_SPACE_START <= addr && addr < STATIC_SPACE_END) + || (STATIC_SPACE_OBJECTS_START <= addr && addr < STATIC_SPACE_END) #if defined LISP_FEATURE_GENCGC || (DYNAMIC_SPACE_START <= addr && addr < (DYNAMIC_SPACE_START + dynamic_space_size)) diff --git a/src/runtime/parse.c b/src/runtime/parse.c index 450c264e05..08b0f203df 100644 --- a/src/runtime/parse.c +++ b/src/runtime/parse.c @@ -208,7 +208,7 @@ int parse_addr(char **ptr, boolean safely, char **output) static lispobj lookup_symbol(char *name) { uword_t ranges[][2] = { - { STATIC_SPACE_START, (uword_t)static_space_free_pointer }, + { STATIC_SPACE_OBJECTS_START, (uword_t)static_space_free_pointer }, #ifdef LISP_FEATURE_IMMOBILE_SPACE { FIXEDOBJ_SPACE_START, (uword_t)fixedobj_free_pointer }, #endif diff --git a/src/runtime/search.c b/src/runtime/search.c index 06113ebdca..a7e893e98c 100644 --- a/src/runtime/search.c +++ b/src/runtime/search.c @@ -36,7 +36,7 @@ search_read_only_space(void *pointer) lispobj * search_static_space(void *pointer) { - lispobj *start = (lispobj *)STATIC_SPACE_START; + lispobj *start = (lispobj *)STATIC_SPACE_OBJECTS_START; lispobj *end = static_space_free_pointer; if ((pointer < (void *)start) || (pointer >= (void *)end)) return NULL; diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 7af4be168e..8d99a220f3 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -824,7 +824,7 @@ static uword_t build_refs(lispobj* where, lispobj* end, static void scan_spaces(struct scan_state* ss) { struct scan_state old = *ss; - build_refs((lispobj*)STATIC_SPACE_START, static_space_free_pointer, ss); + build_refs((lispobj*)STATIC_SPACE_OBJECTS_START, static_space_free_pointer, ss); show_tally(old, ss); #ifdef LISP_FEATURE_IMMOBILE_SPACE old = *ss; build_refs((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, ss); From f1a956a6a771f7fc95cd1b9b42448af553306760 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 19 Jun 2020 16:03:41 -0400 Subject: [PATCH 0137/4023] Reinstate lowtag check elision in some type vops The elision logic was fine, but I wanted the resulting assembly code to be as robust as it could be in the face of an "object" that does not have any lisp type, namely the unbound marker. So now it is mostly harmless to try to load a widetag from the unbound marker, because it is almost a heap object but not- it's sort of like NIL but with a whacky lowtag. --- float-math.lisp-expr | 1 + src/code/cold-init.lisp | 6 ++--- src/compiler/generic/early-objdef.lisp | 34 +++++++++++------------- src/compiler/generic/genesis.lisp | 11 ++++---- src/compiler/generic/late-type-vops.lisp | 3 ++- src/compiler/x86-64/alloc.lisp | 6 ----- src/compiler/x86-64/cell.lisp | 17 ++++++++---- src/compiler/x86-64/type-vops.lisp | 18 +++++++------ src/runtime/os-common.c | 2 +- tests/x86-64-codegen.impure.lisp | 23 ++++++++++++++++ tools-for-build/editcore.lisp | 2 +- 11 files changed, 75 insertions(+), 48 deletions(-) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 9b739d2e0d..59088a7afc 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -2907,6 +2907,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x5FEFFFFF #xFFFFFFFF) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) T) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index de2ec9cec0..5cd0f1048f 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -174,12 +174,12 @@ (function (funcall toplevel-thing)) ((cons (eql :load-time-value)) - (setf (svref *!load-time-values* (third toplevel-thing)) - (funcall (second toplevel-thing)))) + (setf (svref *!load-time-values* (third toplevel-thing)) + (funcall (second toplevel-thing)))) ((cons (eql :load-time-value-fixup)) (destructuring-bind (object index value) (cdr toplevel-thing) (aver (typep object 'code-component)) - (aver (eq (code-header-ref object index) (make-unbound-marker))) + (aver (unbound-marker-p (code-header-ref object index))) (setf (code-header-ref object index) (svref *!load-time-values* value)))) ((cons (eql defstruct)) (apply 'sb-kernel::%defstruct (cdr toplevel-thing))) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 80502e54f2..56d772ab2c 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -109,14 +109,17 @@ ;; 8 is the number of words to reserve at the beginning of static space ;; prior to the words of NIL. ;; If you change this, then also change MAKE-NIL-DESCRIPTOR in genesis. - #+(and gencgc (not sb-thread)) (ash 8 word-shift) + #+(and (not x86-64) gencgc (not sb-thread)) (ash 8 word-shift) + #+x86-64 #x100 (* 2 n-word-bytes) list-pointer-lowtag)) ;;; BOXED-REGION is address in static space at which a 'struct alloc_region' ;;; is overlaid on a lisp vector with element type WORD. #-sb-thread -(defconstant boxed-region (+ static-space-start (* 2 n-word-bytes))) +(defconstant boxed-region + (+ static-space-start + (* 2 n-word-bytes))) ; skip the array header (defconstant-eqx fixnum-lowtags #.(let ((fixtags nil)) @@ -196,6 +199,7 @@ ;; SIMPLE-VECTOR means the latter doesn't make it right for SBCL internals. (defconstant widetag-spacing 4) +#+x86-64 (defconstant unbound-marker-widetag 9) (eval-when (:compile-toplevel :load-toplevel :execute) (defenum (;; The first widetag must be greater than SB-VM:LOWTAG-LIMIT ;; otherwise code in generic/early-type-vops will suffer @@ -223,36 +227,30 @@ funcallable-instance-widetag ; 36 3D 36 3D ;; x86[-64] does not have objects with this widetag, - #+(or x86 x86-64) unused00-widetag - #-(or x86 x86-64) - return-pc-widetag ; 3A 41 3A 41 + #-(or x86 x86-64) return-pc-widetag ; 3A 41 3A 41 + #+(or x86 x86-64) lra-widetag-notused value-cell-widetag ; 3E 45 3E 45 character-widetag ; 42 49 42 49 sap-widetag ; 46 4D 46 4D - unbound-marker-widetag ; 4A 51 4A 51 + #-x86-64 unbound-marker-widetag ; 4A 51 4A 51 + #+x86-64 unused00-widetag weak-pointer-widetag ; 4E 55 4E 55 instance-widetag ; 52 59 52 59 fdefn-widetag ; 56 5D 56 5D no-tls-value-marker-widetag ; 5A 61 5A 61 - #-sb-simd-pack - unused01-widetag ; 5E 5E - #+sb-simd-pack - simd-pack-widetag ; 65 65 - #-sb-simd-pack-256 - unused03-widetag ; 62 69 62 69 - #+sb-simd-pack-256 - simd-pack-256-widetag ; 62 69 62 69 + #+sb-simd-pack simd-pack-widetag ; 65 65 + #-sb-simd-pack unused01-widetag ; 5E 5E + #+sb-simd-pack-256 simd-pack-256-widetag ; 62 69 62 69 + #-sb-simd-pack-256 unused03-widetag ; 62 69 62 69 filler-widetag ; 66 6D 66 6D unused04-widetag ; 6A 71 6A 71 unused05-widetag ; 6E 75 6E 75 unused06-widetag ; 72 79 72 79 unused07-widetag ; 76 7D 76 7D - #-64-bit - unused08-widetag ; 7A 7A - #-64-bit - unused09-widetag ; 7E 7E + #-64-bit unused08-widetag ; 7A 7A + #-64-bit unused09-widetag ; 7E 7E simple-array-widetag ; 82 81 82 81 simple-array-unsigned-byte-2-widetag ; 86 85 86 85 diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a6f24dfeb4..a87883ca1a 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1546,13 +1546,14 @@ core and return a descriptor to it." (allocate-vector #-64-bit sb-vm:simple-array-signed-byte-32-widetag #+64-bit sb-vm:simple-array-signed-byte-64-widetag 6 6 *static*) + #+x86-64 (setf (gspace-free-word-index *static*) (/ 256 sb-vm:n-word-bytes)) (let* ((des (allocate-header+object *static* sb-vm:symbol-size 0)) (nil-val (make-descriptor (+ (descriptor-bits des) - (* 2 sb-vm:n-word-bytes) - (- sb-vm:list-pointer-lowtag - ;; ALLOCATE-HEADER+OBJECT always adds in - ;; OTHER-POINTER-LOWTAG, so subtract it. - sb-vm:other-pointer-lowtag)))) + (* 2 sb-vm:n-word-bytes) + (- sb-vm:list-pointer-lowtag + ;; ALLOCATE-HEADER+OBJECT always adds in + ;; OTHER-POINTER-LOWTAG, so subtract it. + sb-vm:other-pointer-lowtag)))) (header (make-other-immediate-descriptor 0 sb-vm:symbol-widetag)) (initial-info (cold-cons nil-val nil-val)) ;; NIL's name is in dynamic space because any extra bytes allocated diff --git a/src/compiler/generic/late-type-vops.lisp b/src/compiler/generic/late-type-vops.lisp index 6b1e559f55..cc7fcd79fb 100644 --- a/src/compiler/generic/late-type-vops.lisp +++ b/src/compiler/generic/late-type-vops.lisp @@ -255,7 +255,8 @@ #+sb-simd-pack-256 (define-type-vop simd-pack-256-p (simd-pack-256-widetag)) -(define-type-vop unbound-marker-p (unbound-marker-widetag)) +#.(when (> unbound-marker-widetag lowtag-mask) + '(define-type-vop unbound-marker-p (unbound-marker-widetag))) ;;; Not type vops, but generic over all backends (macrolet ((def (name lowtag) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index e2540a5963..ac172d2e0e 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -591,12 +591,6 @@ ;;;; automatic allocators for primitive objects -(define-vop (make-unbound-marker) - (:args) - (:results (result :scs (descriptor-reg any-reg))) - (:generator 1 - (inst mov result unbound-marker-widetag))) - (define-vop (make-funcallable-instance-tramp) (:args) (:results (result :scs (any-reg))) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 52ba8a4c0b..b58f522abd 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -95,6 +95,13 @@ ;;;; symbol hacking VOPs +(define-vop (make-unbound-marker) + (:args) + (:results (result :scs (descriptor-reg any-reg))) + (:generator 1 + (inst mov result (logior (+ sb-vm:static-space-start #x100) + unbound-marker-widetag)))) + (define-vop (%set-symbol-global-value) (:args (object :scs (descriptor-reg immediate)) (value :scs (descriptor-reg any-reg immediate))) @@ -128,7 +135,7 @@ (:generator 9 (let ((err-lab (generate-error-code vop 'unbound-symbol-error object))) (loadw value object symbol-value-slot other-pointer-lowtag) - (inst cmp :dword value unbound-marker-widetag) + (inst cmp :byte value unbound-marker-widetag) (inst jmp :e err-lab)))) ;; Return the DISP field to use in an EA relative to thread-base-tn @@ -190,7 +197,7 @@ #-sb-thread (progn (move rax old) ;; is the :LOCK is necessary? (inst cmpxchg (symbol-value-slot-ea symbol) new :lock)) - (inst cmp :dword rax unbound-marker-widetag) + (inst cmp :byte rax unbound-marker-widetag) (inst jmp :e unbound) (move result rax)))) @@ -275,7 +282,7 @@ (when check-boundp (assemble () - (inst cmp :dword value unbound-marker-widetag) + (inst cmp :byte value unbound-marker-widetag) (let* ((immediatep (sc-is symbol immediate)) (staticp (and immediatep (static-symbol-p known-symbol))) (*location-context* (make-restart-location RETRY value))) @@ -331,7 +338,7 @@ (inst mov :dword temp (thread-tls-ea temp)) (inst cmp :dword temp no-tls-value-marker-widetag) (inst cmov :dword :e temp (symbol-value-slot-ea object)) - (inst cmp :dword temp unbound-marker-widetag)))) + (inst cmp :byte temp unbound-marker-widetag)))) ) ; END OF MACROLET @@ -348,7 +355,7 @@ (:args (symbol :scs (descriptor-reg))) (:conditional :ne) (:generator 9 - (inst cmp :dword (object-slot-ea + (inst cmp :byte (object-slot-ea symbol symbol-value-slot other-pointer-lowtag) unbound-marker-widetag)))) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index b0c8038995..a90ca60923 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -147,17 +147,9 @@ (values :ne :a :b drop-through target) (values :e :na :nb target drop-through)) - ;; FIXME: the first case, by elision of the lowtag test, can cause this - ;; typecase to memory fault if given an unbound marker: - ;; (typecase x - ;; ((or character number list instance function) 1) - ;; ((simple-vector x) 2) (cond ((and value-tn-ref (eq lowtag other-pointer-lowtag) (other-pointer-tn-ref-p value-tn-ref))) ; best case: lowtag is right - ;; This case is theoretically right, but causes a strictly greater number - ;; of ways to elide a lowtag test, hence more likely to memory fault. - #+nil ((and value-tn-ref ;; If HEADERS contains a range, then list pointers have to be ;; disallowed - consider a list whose CAR has a fixnum that @@ -397,6 +389,16 @@ (inst jmp (if not-p :a :be) target) (emit-label skip)))) +;;; The generic code (in src/compiler/generic/{early,late}-type-vops) +;;; would do the wrong thing. UNBOUND-MARKER-WIDETAG looks like a lowtag +;;; to that code and so it would mask off 4 bits before testing, +;;; which matches too many values. +(define-vop (unbound-marker-p simple-type-predicate) + (:translate unbound-marker-p) + (:generator 2 + (inst cmp :byte value unbound-marker-widetag) + (inst jmp (if not-p :ne :e) target))) + (define-vop (pointerp) (:args (value :scs (any-reg descriptor-reg) :target temp)) (:temporary (:sc unsigned-reg :from (:argument 0)) temp) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index d7db0e1775..4926e3e2d6 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -212,7 +212,7 @@ boolean gc_managed_heap_space_p(lispobj addr) { if ((READ_ONLY_SPACE_START <= addr && addr < READ_ONLY_SPACE_END) - || (STATIC_SPACE_OBJECTS_START <= addr && addr < STATIC_SPACE_END) + || (STATIC_SPACE_START <= addr && addr < STATIC_SPACE_END) #if defined LISP_FEATURE_GENCGC || (DYNAMIC_SPACE_START <= addr && addr < (DYNAMIC_SPACE_START + dynamic_space_size)) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 8fdf5de318..cf43559725 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -11,6 +11,29 @@ #-x86-64 (sb-ext:exit :code 104) +(with-test (:name :lowtag-test-elision) + ;; This tests a certain behavior that while "undefined" should at least not + ;; be fatal. This is important for things like hash-table :TEST where we might + ;; call (EQUAL x y) with X being an unbound marker indicating an empty cell. + ;; After we started using IR1 type derivation to elide lowtag as a guard condition + ;; in some type tests, it became more likely to dereference an unbound marker + ;; which does not fit anywhere in the lisp type space. + (let ((f (compile nil + '(lambda (x) + (typecase x + ((or character number list sb-kernel:instance function) 1) + ;; After eliminating the preceding cases, the compiler knows + ;; that the only remaining pointer type is OTHER-POINTER, + ;; so it just tries to read the widetag. + ;; If X is the unbound marker, this will read a byte preceding + ;; the start of static space, but it holds a zero. + (simple-vector 2)))))) + (assert (not (funcall f (sb-kernel:make-unbound-marker))))) + (assert (not (equalp (sb-kernel:make-unbound-marker) ""))) + (let ((a (- (sb-kernel:get-lisp-obj-address (sb-kernel:make-unbound-marker)) + sb-vm:other-pointer-lowtag))) + (assert (> a sb-vm:static-space-start)))) + (load "compiler-test-util.lisp") (defun disassembly-lines (fun) ;; FIXME: I don't remember what this override of the hook is for. diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index adfc0f7d70..e261e5f40d 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -78,7 +78,7 @@ (find id (cdr spaces) :key #'space-id)) (defun compute-nil-object (spaces) (let ((space (get-space static-core-space-id spaces))) - (%make-lisp-obj (logior (space-addr space) #x17)))) + (%make-lisp-obj (logior (space-addr space) #x117)))) ;;; Given OBJ which is tagged pointer into the target core, translate it into ;;; the range at which the core is now mapped during execution of this tool, From b723ed952a1ac39621bf022bb1b519e615797c25 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 19 Jun 2020 17:55:28 -0400 Subject: [PATCH 0138/4023] Replace (VOP-INFO-NAME (VOP-INFO x)) with VOP-NAME --- package-data-list.lisp-expr | 2 +- src/compiler/assem.lisp | 2 +- src/compiler/codegen.lisp | 2 +- src/compiler/copyprop.lisp | 12 ++++++------ src/compiler/debug.lisp | 2 +- src/compiler/pack.lisp | 15 ++++++--------- src/compiler/represent.lisp | 3 +-- src/compiler/vop.lisp | 2 +- 8 files changed, 18 insertions(+), 22 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 63fd1a7317..852fdb6bc2 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2654,7 +2654,7 @@ ISBN 0-262-61074-4, with exceptions as noted in the User Manual." "TNS-CONFLICT" "TNS-CONFLICT-GLOBAL-GLOBAL" "TNS-CONFLICT-LOCAL-GLOBAL" "VOP" "VOP-ARGS" "VOP-INFO" "VOP-INFO-ARG-LOAD-SCS" - "VOP-INFO-MOVE-ARGS" "VOP-INFO-NAME" + "VOP-INFO-MOVE-ARGS" "VOP-NAME" "VOP-INFO-RESULT-LOAD-SCS" "VOP-INFO-SAVE-P" "VOP-NODE" "VOP-PARSE-OR-LOSE" "VOP-PARSE-TEMPS" "VOP-PREV" diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index c139da432f..b5d41d6c1e 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -1359,7 +1359,7 @@ (incf n) (binding* ((vop (stmt-vop statement) :exit-if-null)) (unless (eq vop last-vop) - (format stream "## ~A~%" (sb-c::vop-info-name (sb-c::vop-info vop)))) + (format stream "## ~A~%" (sb-c::vop-name vop))) (setq last-vop vop)) (let ((op (stmt-mnemonic statement)) (eol-comment "")) diff --git a/src/compiler/codegen.lisp b/src/compiler/codegen.lisp index 89f3f5f0f3..01a5d70a30 100644 --- a/src/compiler/codegen.lisp +++ b/src/compiler/codegen.lisp @@ -310,7 +310,7 @@ ((null vop)) (let ((gen (vop-info-generator-function (vop-info vop)))) (awhen *static-vop-usage-counts* - (let ((name (vop-info-name (vop-info vop)))) + (let ((name (vop-name vop))) (incf (gethash name it 0)))) (assemble (:code vop) (cond ((not gen) diff --git a/src/compiler/copyprop.lisp b/src/compiler/copyprop.lisp index a824c179a4..c9ae13bb92 100644 --- a/src/compiler/copyprop.lisp +++ b/src/compiler/copyprop.lisp @@ -74,7 +74,7 @@ (not (tn-sc tn)) ; Not wired or restricted. (and writes (null (tn-ref-next writes))) (let ((vop (tn-ref-vop writes))) - (and (eq (vop-info-name (vop-info vop)) 'move) + (and (eq (vop-name vop) 'move) (let ((arg-tn (tn-ref-tn (vop-args vop)))) (and (or (not (tn-sc arg-tn)) (eq (tn-kind arg-tn) :constant)) @@ -86,7 +86,7 @@ ;; performed based on the SC. (and reads (null (tn-ref-next reads)) - (eq (vop-info-name (vop-info (tn-ref-vop reads))) 'move))) + (eq (vop-name (tn-ref-vop reads)) 'move))) (subsetp (primitive-type-scs (tn-primitive-type tn)) (primitive-type-scs @@ -113,7 +113,7 @@ ;; MOVEs can be chained and read in other blocks. This is done ;; not for correctness but for memory usage reduction, so there ;; is no need to follow all the chains, just be conservative. - (when (or (eq (vop-info-name (vop-info vop)) 'move) + (when (or (eq (vop-name vop) 'move) (neq (ir2-block-block (vop-block vop)) block)) (return))))) @@ -128,7 +128,7 @@ (out (make-sset))) (do ((vop (ir2-block-start-vop (block-info block)) (vop-next vop))) ((null vop)) - (unless (and (eq (vop-info-name (vop-info vop)) 'move) + (unless (and (eq (vop-name vop) 'move) (let ((y (tn-ref-tn (vop-results vop)))) (when (tn-is-copy-of y) (unless (reads-within-block-p y block) @@ -141,7 +141,7 @@ (do ((read (tn-reads res-tn) (tn-ref-next read))) ((null read)) (let ((read-vop (tn-ref-vop read))) - (when (eq (vop-info-name (vop-info read-vop)) 'move) + (when (eq (vop-name read-vop) 'move) (let ((y (tn-ref-tn (vop-results read-vop)))) (when (tn-is-copy-of y) (sset-delete y out) @@ -232,7 +232,7 @@ (block-kill block) nil) (do ((vop (ir2-block-start-vop (block-info block)) (vop-next vop))) ((null vop)) - (let ((this-copy (and (eq (vop-info-name (vop-info vop)) 'move) + (let ((this-copy (and (eq (vop-name vop) 'move) (let ((y (tn-ref-tn (vop-results vop)))) (when (tn-is-copy-of y) y))))) ;; Substitute copied TN for copy when we find a reference to a copy. diff --git a/src/compiler/debug.lisp b/src/compiler/debug.lisp index c3a1554ab3..45be311188 100644 --- a/src/compiler/debug.lisp +++ b/src/compiler/debug.lisp @@ -1092,7 +1092,7 @@ ;;; necessary. (defun print-vop (vop) (pprint-logical-block (*standard-output* nil) - (princ (vop-info-name (vop-info vop))) + (princ (vop-name vop)) (princ #\space) (pprint-indent :current 0) (print-operands (vop-args vop)) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index e4401dee5a..a26e0fd0c7 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -340,9 +340,7 @@ ((setq temp (position-in #'tn-ref-across tn (vop-temps vop) :key #'tn-ref-tn)) `("~2D: ~A (temporary ~A)" ,loc ,name - ,(operand-parse-name (elt (vop-parse-temps - (vop-parse-or-lose - (vop-info-name (vop-info vop)))) + ,(operand-parse-name (elt (vop-parse-temps (vop-parse-or-lose (vop-name vop))) temp)))) ((eq (tn-kind tn) :component) `("~2D: ~A (component live)" ,loc ,name)) @@ -391,7 +389,7 @@ time. Recompile.~%Compilation order may be incorrect.~]" (mapcar #'sc-name scs) n arg-p - (vop-info-name (vop-info (tn-ref-vop op))) + (vop-name (tn-ref-vop op)) (unused) (used) incon)))) @@ -471,7 +469,7 @@ (aver (eq (ir2-block-block block) (ir2-block-block (vop-block vop)))) (do ((current last (vop-prev current))) ((null current)) - (when (eq (vop-info-name (vop-info current)) name) + (when (eq (vop-name current) name) (return-from reverse-find-vop current))))) ;;; For TNs that have other than one writer, we save the TN before @@ -522,8 +520,7 @@ (return nil)))) (tn-ref-vop res))) - (unless (eq (vop-info-name (vop-info (tn-ref-vop write))) - 'move-operand) + (unless (eq (vop-name (tn-ref-vop write)) 'move-operand) (when res (return nil)) (setq res write)))) @@ -662,7 +659,7 @@ (do ((vop (ir2-block-last-vop block) (vop-prev vop))) ((null vop)) (let ((info (vop-info vop))) - (case (vop-info-name info) + (case (vop-name vop) (allocate-frame (aver skipping) (setq skipping nil)) @@ -1093,7 +1090,7 @@ (do ((ref refs (tn-ref-next ref))) ((null ref)) (let ((vop (tn-ref-vop ref))) - (if (eq (vop-info-name (vop-info vop)) 'move-operand) + (if (eq (vop-name vop) 'move-operand) (delete-vop vop) (pushnew (vop-block vop) *repack-blocks*)))))) (zot (tn-reads tn)) diff --git a/src/compiler/represent.lisp b/src/compiler/represent.lisp index 5b6194e220..0b0a96dc4c 100644 --- a/src/compiler/represent.lisp +++ b/src/compiler/represent.lisp @@ -577,8 +577,7 @@ pass-tn vop)) (after (cond ((eq how :local-call) - (aver (eq (vop-info-name (vop-info prev)) - 'allocate-frame)) + (aver (eq (vop-name prev) 'allocate-frame)) prev) (prev (vop-next prev)) (t diff --git a/src/compiler/vop.lisp b/src/compiler/vop.lisp index 5eb1f59bdd..0f7d57dc8b 100644 --- a/src/compiler/vop.lisp +++ b/src/compiler/vop.lisp @@ -744,7 +744,7 @@ (defprinter (tn-ref) tn write-p - (vop :test vop :prin1 (vop-info-name (vop-info vop)))) + (vop :test vop :prin1 (vop-name vop))) (declaim (inline vop-name)) (defun vop-name (vop) From 0f922ae93bfe91401b37633acc2abd9bcc15b262 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 19 Jun 2020 22:47:21 -0400 Subject: [PATCH 0139/4023] Fix inlining failure --- src/compiler/vop.lisp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/vop.lisp b/src/compiler/vop.lisp index 0f7d57dc8b..584ef5d071 100644 --- a/src/compiler/vop.lisp +++ b/src/compiler/vop.lisp @@ -732,6 +732,10 @@ (targets nil :type (or null (simple-array (unsigned-byte 16) 1))) (optimizer nil :type (or null function)) move-vop-p) +(declaim (inline vop-name)) +(defun vop-name (vop) + (declare (type vop vop)) + (vop-info-name (vop-info vop))) ;; These printers follow the definition of VOP-INFO because they ;; want to inline VOP-INFO-NAME, and it's less code to move them here @@ -746,10 +750,6 @@ write-p (vop :test vop :prin1 (vop-name vop))) -(declaim (inline vop-name)) -(defun vop-name (vop) - (declare (type vop vop)) - (vop-info-name (vop-info vop))) ;;;; SBs and SCs From 810b47b9d44245e7fc1f9a8f183bc5630c6f4d18 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 19 Jun 2020 23:17:20 -0400 Subject: [PATCH 0140/4023] Fix lp#1881349 --- src/compiler/fndb.lisp | 14 ++++++++++++-- src/compiler/x86-64/alloc.lisp | 3 +-- tests/x86-64-codegen.impure.lisp | 4 ++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index fb94da9b4c..eef34ea36c 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -873,9 +873,19 @@ (defknown list (&rest t) list (movable flushable)) (defknown list* (t &rest t) t (movable flushable)) -(defknown make-list (index &key (:initial-element t)) list +;;; The length constraint on MAKE-LIST is such that: +;;; - not every byte of addressable memory can be used up. +;;; - the number of bytes to allocate should not be a bignum, +;; nor can its native representation be larger than 'sword_t' +;;; So it's half of most-positive-word divided by the cons size, +;;; which is roughly twice as small as array-dimension-limit on 32-bit machines, +;;; or 8x smaller on 64-bit machines. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defconstant make-list-limit + (floor (/ sb-ext:most-positive-word 2) (* 2 sb-vm:n-word-bytes)))) +(defknown make-list ((integer 0 (#.make-list-limit)) &key (:initial-element t)) list (movable flushable)) -(defknown %make-list (index t) list (movable flushable)) +(defknown %make-list ((integer 0 (#.make-list-limit)) t) list (movable flushable)) (defknown sb-impl::|List| (&rest t) list (movable flushable foldable)) (defknown sb-impl::|List*| (t &rest t) t (movable flushable foldable)) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index ac172d2e0e..df14ea655b 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -470,8 +470,7 @@ (ash 1 (1+ (- word-shift n-fixnum-tag-bits))))) ,answer))) (compute-end () - `(let ((size (cond ((or (not (fixnump size)) - (plausible-signed-imm32-operand-p size)) + `(let ((size (cond ((typep size '(or (signed-byte 32) tn)) size) (t (inst mov limit size) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index cf43559725..420a883c6c 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -762,3 +762,7 @@ sb-vm::(define-vop (cl-user::test) ;; the two variations of the test compile to the identical code (dotimes (i 4) (assert (string= (nth i f1) (nth i f2)))))) + +(with-test (:name :make-list-ridiculously-huge) + (checked-compile '(lambda () (make-list 3826305079707827596)) + :allow-warnings t)) From 869fa34ad575fa8dd6939997850daea1b212a0de Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 20 Jun 2020 18:43:01 +0300 Subject: [PATCH 0141/4023] Fix sb-safepoint --- src/compiler/x86-64/macros.lisp | 3 +-- src/compiler/x86/macros.lisp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/x86-64/macros.lisp b/src/compiler/x86-64/macros.lisp index c6ed9502bc..8ae5aba760 100644 --- a/src/compiler/x86-64/macros.lisp +++ b/src/compiler/x86-64/macros.lisp @@ -203,8 +203,7 @@ #+sb-safepoint (defun emit-safepoint () - (inst test :byte rax-tn (ea (- nil-value n-word-bytes other-pointer-lowtag - gc-safepoint-trap-offset)))) + (inst test :byte rax-tn (ea (- static-space-start gc-safepoint-trap-offset)))) (defmacro pseudo-atomic ((&key elide-if) &rest forms) #+sb-safepoint-strictly diff --git a/src/compiler/x86/macros.lisp b/src/compiler/x86/macros.lisp index 1e952dda2b..2b7cc86d00 100644 --- a/src/compiler/x86/macros.lisp +++ b/src/compiler/x86/macros.lisp @@ -201,8 +201,7 @@ #+sb-safepoint (defun emit-safepoint () (inst test eax-tn (make-ea :dword :disp - (- nil-value n-word-bytes other-pointer-lowtag - gc-safepoint-trap-offset)))) + (- static-space-start gc-safepoint-trap-offset)))) (defmacro pseudo-atomic ((&key elide-if) &rest forms) #+sb-safepoint-strictly From ee3a219e4ff8af637a2ca8da4ee1c0747ac4a972 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 20 Jun 2020 18:45:19 +0300 Subject: [PATCH 0142/4023] Disable a test on -64-bit. --- tests/compiler.pure.lisp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index c5b02728a1..936230ed06 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -5771,12 +5771,10 @@ (map a 'list (the vector b) #*)) (('vector #()) #() :test #'equalp))) -(with-test (:name (make-list :large 1)) - (checked-compile `(lambda () - (make-list (expt 2 28) :initial-element 0)))) - -(with-test (:name (make-list :large 2) +(with-test (:name (make-list :large) :skipped-on (not :64-bit)) + (checked-compile `(lambda () + (make-list (expt 2 28) :initial-element 0))) (checked-compile `(lambda () (make-list (expt 2 30) :initial-element 0)))) From ada26495684129987b531c65a94dd2d27ac3d9d4 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 21 Jun 2020 14:43:04 +0300 Subject: [PATCH 0143/4023] Fix *current-thread* initialization in foreign callbacks. Need to use init-thread-local-storage to set up *current-thread* but it also allocates a thread struct, which needs to be done before GCing is enabled. Move init-thread-local-storage under without-gcing in enter-alien-callback. --- src/code/alien-callback.lisp | 7 ++++--- src/code/target-thread.lisp | 5 +---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index 4bc9070e42..316ed59472 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -297,8 +297,9 @@ the alien callback for that function with the given alien type." (defun enter-foreign-callback (index return arguments) (let ((thread (without-gcing ;; Hold off GCing until *current-thread* is set up - (setf *current-thread* - (make-foreign-thread :name "foreign callback"))))) + (let ((thread (make-foreign-thread :name "foreign callback"))) + (init-thread-local-storage thread) + thread)))) (dx-flet ((enter () - (sb-alien::enter-alien-callback index return arguments))) + (sb-alien::enter-alien-callback index return arguments))) (new-lisp-thread-trampoline thread nil #'enter nil)))) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 699d8a6d96..7aa260f644 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1556,10 +1556,6 @@ session." ;;; All threads other than the initial thread start via this function. #+sb-thread (defun new-lisp-thread-trampoline (thread setup-sem real-function arguments) - (init-thread-local-storage thread) - ;; Can't initiate GC before *current-thread* is set, otherwise the - ;; locks grabbed by SUB-GC wouldn't function. - ;; Other threads can GC with impunity. (setf (thread-os-thread thread) (current-thread-os-thread) (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) (thread-primitive-thread thread) (sap-int (current-thread-sap))) @@ -1697,6 +1693,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (setf (sb-vm:floating-point-modes) fp-modes) ;; As it is, this lambda must not cons until we are ;; ready to run GC. Be careful. + (init-thread-local-storage thread) (new-lisp-thread-trampoline thread setup-sem real-function arguments))) ;; Holding mutexes or waiting on sempahores inside WITHOUT-GCING will lock up From 34244296211e5f4cdc8fca4feaf48ec083ceb0d2 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 21 Jun 2020 23:17:14 +0300 Subject: [PATCH 0144/4023] Temporarily reexport sb-mop symbols from sb-pcl. Until there's a way to deprecate exported symbols (in the next release). A lot of stuff still uses sb-pcl and transitioning directly to an error is too quick. It's been there for more than 15 years and can wait an additional couple of months. --- package-data-list.lisp-expr | 94 ++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 852fdb6bc2..c2626877e2 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2690,7 +2690,99 @@ package is deprecated in favour of SB-MOP." "ILLEGAL-CLASS-NAME-ERROR" "CLASS-NOT-FOUND-ERROR" - "SPECIALIZER-NAME-SYNTAX-ERROR")) + "SPECIALIZER-NAME-SYNTAX-ERROR") + ;; FIXME: After a little while, these reexports can probably go + ;; away, as they're superseded by the use of SB-MOP as the + ;; publically-accessible package. + :reexport ( ;; CL symbols + "ADD-METHOD" + "ALLOCATE-INSTANCE" + "CLASS-NAME" "COMPUTE-APPLICABLE-METHODS" + "ENSURE-GENERIC-FUNCTION" "MAKE-INSTANCE" + "METHOD-QUALIFIERS" "REMOVE-METHOD" + ;; MOP symbols + "ADD-DEPENDENT" + "ADD-DIRECT-METHOD" + "ADD-DIRECT-SUBCLASS" + "CLASS-DEFAULT-INITARGS" + "CLASS-DIRECT-DEFAULT-INITARGS" + "CLASS-DIRECT-SLOTS" + "CLASS-DIRECT-SUBCLASSES" + "CLASS-DIRECT-SUPERCLASSES" + "CLASS-FINALIZED-P" + "CLASS-PRECEDENCE-LIST" + "CLASS-PROTOTYPE" + "CLASS-SLOTS" + "COMPUTE-APPLICABLE-METHODS-USING-CLASSES" + "COMPUTE-CLASS-PRECEDENCE-LIST" + "COMPUTE-DEFAULT-INITARGS" + "COMPUTE-DISCRIMINATING-FUNCTION" + "COMPUTE-EFFECTIVE-METHOD" + "COMPUTE-EFFECTIVE-SLOT-DEFINITION" + "COMPUTE-SLOTS" + "DIRECT-SLOT-DEFINITION" + "DIRECT-SLOT-DEFINITION-CLASS" + "EFFECTIVE-SLOT-DEFINITION" + "EFFECTIVE-SLOT-DEFINITION-CLASS" + "ENSURE-CLASS" + "ENSURE-CLASS-USING-CLASS" + "ENSURE-GENERIC-FUNCTION-USING-CLASS" + "EQL-SPECIALIZER" + "EQL-SPECIALIZER-OBJECT" + "EXTRACT-LAMBDA-LIST" + "EXTRACT-SPECIALIZER-NAMES" + "FINALIZE-INHERITANCE" + "FIND-METHOD-COMBINATION" + "FORWARD-REFERENCED-CLASS" + "FUNCALLABLE-STANDARD-CLASS" + "FUNCALLABLE-STANDARD-INSTANCE-ACCESS" + "FUNCALLABLE-STANDARD-OBJECT" + "GENERIC-FUNCTION-ARGUMENT-PRECEDENCE-ORDER" + "GENERIC-FUNCTION-DECLARATIONS" + "GENERIC-FUNCTION-LAMBDA-LIST" + "GENERIC-FUNCTION-METHOD-CLASS" + "GENERIC-FUNCTION-METHOD-COMBINATION" + "GENERIC-FUNCTION-METHODS" + "GENERIC-FUNCTION-NAME" + "INTERN-EQL-SPECIALIZER" + "MAKE-METHOD-LAMBDA" + "MAP-DEPENDENTS" + "METHOD-FUNCTION" + "METHOD-GENERIC-FUNCTION" + "METHOD-LAMBDA-LIST" + "METHOD-SPECIALIZERS" + "ACCESSOR-METHOD-SLOT-DEFINITION" + "READER-METHOD-CLASS" + "REMOVE-DEPENDENT" + "REMOVE-DIRECT-METHOD" + "REMOVE-DIRECT-SUBCLASS" + "SET-FUNCALLABLE-INSTANCE-FUNCTION" + "SLOT-BOUNDP-USING-CLASS" + "SLOT-DEFINITION" + "SLOT-DEFINITION-ALLOCATION" + "SLOT-DEFINITION-INITARGS" + "SLOT-DEFINITION-INITFORM" + "SLOT-DEFINITION-INITFUNCTION" + "SLOT-DEFINITION-LOCATION" + "SLOT-DEFINITION-NAME" + "SLOT-DEFINITION-READERS" + "SLOT-DEFINITION-WRITERS" + "SLOT-DEFINITION-TYPE" + "SLOT-MAKUNBOUND-USING-CLASS" + "SLOT-VALUE-USING-CLASS" + "SPECIALIZER" + "SPECIALIZER-DIRECT-GENERIC-FUNCTIONS" + "SPECIALIZER-DIRECT-METHODS" + "STANDARD-ACCESSOR-METHOD" + "STANDARD-DIRECT-SLOT-DEFINITION" + "STANDARD-EFFECTIVE-SLOT-DEFINITION" + "STANDARD-INSTANCE-ACCESS" + "STANDARD-READER-METHOD" + "STANDARD-SLOT-DEFINITION" + "STANDARD-WRITER-METHOD" + "UPDATE-DEPENDENT" + "VALIDATE-SUPERCLASS" + "WRITER-METHOD-CLASS")) #s(sb-cold:package-data :name "SB-PRETTY" From 30db471f502495fee090927b6372f2f51dc4d539 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 22 Jun 2020 14:55:35 -0400 Subject: [PATCH 0145/4023] ppc64: fix logior and logxor on smallish immediates --- src/compiler/ppc64/arith.lisp | 6 +++--- tests/arith.pure.lisp | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/compiler/ppc64/arith.lisp b/src/compiler/ppc64/arith.lisp index ed1e7224ed..1c33850ea2 100644 --- a/src/compiler/ppc64/arith.lisp +++ b/src/compiler/ppc64/arith.lisp @@ -204,13 +204,13 @@ `(flet ((emit (r x y) (cond ((typep y '(unsigned-byte 16)) (inst ,op r x y)) - ((and (typep (ash y -16) '(unsigned-byte 16)) + ((and (typep (ash y -16) '(unsigned-byte 16)) ; effectively (unsigned-byte 32) ;; logical AND can't be split into two instructions ,@(if (eq translate 'logand) '((zerop (ldb (byte 16 0) y))))) (inst ,shifted-op r x (ash y -16)) (when (ldb-test (byte 16 0) y) - (inst ,op r x (ldb (byte 16 0) y)))) ; not sign-extended - (t + (inst ,op r r (ldb (byte 16 0) y)))) ; not sign-extended + (t ; everything else: just load the constant from memory (inst lr temp-reg-tn y) (inst ,general-op r x temp-reg-tn))))) (define-vop (,(symbolicate 'fast- translate '-c/fixnum=>fixnum) fast-fixnum-logop-c) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index b5a4e80ab1..f1d4184191 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -834,3 +834,23 @@ (declare (type (integer -142 -29) a)) (eql (gcd (setq a -29) a) 1)) ((-33) nil))) + +;;; Test that LOGIOR and LOGXOR on PPC64 can correctly perform the constant 2nd-arg +;;; vop variant on a 32-bit immediate using op + op-shifted instructions. +;;; (Probably we should refactor large parts of the test suite by the CPU +;;; architecture so that you can really see clearly the areas of concern +;;; for each backend, but I'm not about to embark on that now) +(with-test (:name :ppc64-logxor-32-bit-const) + (let ((f (compile nil + '(lambda (x) + (declare (fixnum x)) + ;; The asm code went wrong only if the result was not in the same + ;; register as the source, so make sure that X is live throughout + ;; the test so that each result is in a different register. + (let ((a (logxor x #x9516A7)) + (b (logior x #x2531b4)) + (c (ash x -1))) + (list a b c x)))))) + (let ((result (funcall f 0))) + (assert (equal result + '(#x9516A7 #x2531b4 0 0)))))) From 7c0b715e75e046b6fe737f0feef1cc81efdee480 Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Tue, 23 Jun 2020 17:16:13 +0200 Subject: [PATCH 0146/4023] fix make-c-runtime.sh to work with other hosts. --- make-c-runtime.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/make-c-runtime.sh b/make-c-runtime.sh index 02d4c4aeb9..cd2d7602c7 100755 --- a/make-c-runtime.sh +++ b/make-c-runtime.sh @@ -3,14 +3,11 @@ # Load our build configuration . output/build-config -# This script is supposed to be host-agnostic, but unfortunately in testing -# I have found it to be sensitive to the host in the following ways: -# - using CCL it gets "Error: Incorrect keyword arguments in (:TEST EQ T)." -# - using CLISP it prints "WARNING: cross-compiler type ambiguity" 540 times. -# We could make this use the target SBCL as the new host, -# but that somewhat defeats the purpose. - -time $SBCL_XC_HOST --noinform --no-userinit --no-sysinit --noprint < Error: Class is not yet defined or was undefined: CTYPE +# > While executing: COMPILER-LAYOUT-OR-LOSE, in process listener(1). +time $SBCL_XC_HOST < Date: Tue, 23 Jun 2020 17:38:37 -0400 Subject: [PATCH 0147/4023] Fix make-hash-table with weakness + GC race --- src/code/target-hash-table.lisp | 20 +++++++++++--------- src/runtime/gc-common.c | 2 +- tests/hash-table.impure.lisp | 25 +++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index fcb6b28f6c..7ffdb8abee 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -297,7 +297,11 @@ Examples: (defun set-kv-hwm (vector hwm) (setf (svref vector 0) hwm)) (defsetf kv-vector-high-water-mark set-kv-hwm) -(defmacro new-kv-vector (size weakp) +;;; Make a new key/value vector. Weak tables do not mark the vector as weak +;;; initially, because the vector can't hold a backpointer to the table +;;; since the table hasn't been made yet. (GC asserts that every weak hash-table +;;; storage vector has a table pointer - no exceptions) +(defmacro %alloc-kv-pairs (size) `(let ((v (make-array (+ (* 2 ,size) kv-pairs-overhead-slots) :initial-element +empty-ht-slot+))) (setf (kv-vector-high-water-mark v) 0) @@ -306,11 +310,7 @@ Examples: ;; is set, so it needs to see a valid value in the 'supplement' slot. ;; Neither 0 nor +empty-ht-slot+ is a valid value. (setf (kv-vector-supplement v) nil) - (set-header-data v (if ,weakp - (logior sb-vm:vector-weak-subtype - sb-vm:vector-hashing-subtype) - sb-vm:vector-hashing-subtype)) - + (set-header-data v sb-vm:vector-hashing-subtype) v)) (defun install-hash-table-lock (table) @@ -488,7 +488,7 @@ Examples: :element-type 'hash-table-index :initial-element 0)) (weakp (logtest flags hash-table-weak-flag)) - (kv-vector (new-kv-vector size weakp)) + (kv-vector (%alloc-kv-pairs size)) ;; Needs to be the half the length of the KV vector to link ;; KV entries - mapped to indices at 2i and 2i+1 - ;; together. @@ -521,6 +521,9 @@ Examples: (if weakp table (or hash-vector (= table-kind hash-table-kind-eql)))) + (when weakp + (set-header-data kv-vector (logior sb-vm:vector-hashing-subtype + sb-vm:vector-weak-subtype))) (when (logtest flags hash-table-synchronized-flag) (install-hash-table-lock table)) table)) @@ -631,8 +634,7 @@ multiple threads accessing the same hash-table without locking." (new-index-vector (make-array new-n-buckets :element-type 'hash-table-index :initial-element 0)) - ;; New kv vector is not marked as weak, even for a weak table - (new-kv-vector (new-kv-vector new-size nil)) + (new-kv-vector (%alloc-kv-pairs new-size)) (new-next-vector (make-array (1+ new-size) :element-type 'hash-table-index)) (new-hash-vector (when old-hash-vector diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 60e1e40ab6..0d8833755f 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1358,7 +1358,7 @@ scav_vector (lispobj *where, lispobj header) } lispobj* data = where + 2; - // Verify that the rehash epoch is a fixnum + // Verify that the rehash stamp is a fixnum gc_assert(fixnump(data[1])); /* Scavenge element (length-1), which may be a hash-table structure. */ diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 6f7b284750..8e005cb72b 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -3,6 +3,31 @@ ;;; Keep moving everything that can move during each GC #+gencgc (setf (generation-number-of-gcs-before-promotion 0) 1000000) +;;; Check for GC invariant loss during weak table creation. +;;; This didn't always fail, but might have, and now shouldn't. +(defglobal *number-of-weak-tables* 0) +(defun make-weak-key-table () (make-hash-table :weakness :key)) +(defun something-useless (x) (list x)) +(defun weak-table-allocation-test () + (let ((thread + (sb-thread:make-thread + (lambda () + (loop + (sleep .0001) + (gc) + (sb-thread:barrier (:read)) + (when (> *number-of-weak-tables* 1000) (return))))))) + (loop repeat 1001 do + (something-useless (make-weak-key-table)) + (incf *number-of-weak-tables*) + (sb-thread:barrier (:write))) + (sb-thread:join-thread thread))) +;;; Interpreted code is probably too slow to be useful in this test +(compile 'weak-table-allocation-test) +(weak-table-allocation-test) +(with-test (:name :weak-table-gc-invariant :skipped-on (not :sb-thread)) + (weak-table-allocation-test)) + (defun is-address-sensitive (tbl) (let ((data (sb-kernel:get-header-data (sb-impl::hash-table-pairs tbl)))) (logtest data sb-vm:vector-addr-hashing-subtype))) From 7bebe3387d6a7637b99454d86a38c62b6fde77ae Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 24 Jun 2020 01:17:06 +0300 Subject: [PATCH 0148/4023] Fix -sb-thread. --- tests/hash-table.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 8e005cb72b..6e89800ddf 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -24,7 +24,7 @@ (sb-thread:join-thread thread))) ;;; Interpreted code is probably too slow to be useful in this test (compile 'weak-table-allocation-test) -(weak-table-allocation-test) + (with-test (:name :weak-table-gc-invariant :skipped-on (not :sb-thread)) (weak-table-allocation-test)) From a5d97a3decde842919cd1f025bc2ae5a5c964428 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 24 Jun 2020 15:19:48 -0400 Subject: [PATCH 0149/4023] Prevent set-syntax-from-char from crashing remhash Because the empty extended-char table is not a hash-table. But now it's OK to maphash over. --- src/code/reader.lisp | 12 +++++------- tests/reader.impure.lisp | 7 +++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 49057e75be..8a581baeeb 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -109,9 +109,9 @@ (setf table (make-hash-table :test 'eq) (extended-char-table readtable) table)) (setf (gethash char table) (cons attributes function))) - (t - ;; If the table is *empty-extended-char-table* the item won't be - ;; found, so we're not actually altering the empty table. + ((neq table *empty-extended-char-table*) + ;; can't REMHASH from *empty-extended-char-table* + ;; since it's not a real hash-table. (remhash char table))))) nil) @@ -1981,10 +1981,8 @@ extended :: syntax." (push (cons char output) alist))))) (loop for fn across (base-char-macro-array readtable) and ch from 0 do (process (code-char ch) fn)) - (unless (eq (extended-char-table readtable) *empty-extended-char-table*) - ;; very unsafe to maphash over the empty table - it's a stub object - (maphash (lambda (char val) (process char (cdr val))) - (extended-char-table readtable)))) + (maphash (lambda (char val) (process char (cdr val))) + (extended-char-table readtable))) alist)) (declaim (inline character-macro-array character-macro-hash-table)) diff --git a/tests/reader.impure.lisp b/tests/reader.impure.lisp index dcc3fa2b70..e9f4456eb6 100644 --- a/tests/reader.impure.lisp +++ b/tests/reader.impure.lisp @@ -242,6 +242,10 @@ #+sb-unicode (with-test (:name :unicode-dispatch-macros) + ;; Smoke test: (set-syntax-from-char unicode-char ordinary-constituent-char) + ;; should not fail + (set-syntax-from-char (code-char 300) #\a) + ;; (let ((*readtable* (copy-readtable))) (make-dispatch-macro-character (code-char #x266F)) ; musical sharp (set-dispatch-macro-character @@ -252,6 +256,9 @@ (let ((x (read-from-string (map 'string #'code-char '(#x266F #x221E))))) (assert (eq x :infinity)) + ;; I don't know what this was testing, and it's "noisy". Can we fix that? + ;; I think we used to treat NIL as *removing* the macro function, which is not + ;; a specified action. But neither could NIL ever be a function designator. (set-dispatch-macro-character (code-char #x266F) (code-char #x221E) nil) (assert (zerop (hash-table-count (cdr (sb-impl::%dispatch-macro-char-table From 5bdb2e381f7660c2d44ff314b2273ef42caf8bed Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 25 Jun 2020 18:50:50 -0400 Subject: [PATCH 0150/4023] Fix regression - treat hash-table locks as recursive always We should not have made all weak tables locked as an observable aspect, nor advertised implicit read-safety of weak tables, nor allowed users to (by default at least) wrap any table in WITH-LOCKED-HASH-TABLE. This is, I fear, totally unfixable. https://www.hyrumslaw.com/ --- src/code/target-hash-table.lisp | 2 +- tests/hash-table.impure.lisp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 7ffdb8abee..e910a78a33 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -1368,7 +1368,7 @@ nnnn 1_ any linear scan (if (hash-table-synchronized-p hash-table) ;; Use the private slot accessor for the lock because it's known ;; to have a mutex. - (sb-thread::call-with-system-mutex #'body (hash-table-%lock hash-table)) + (sb-thread::call-with-recursive-system-lock #'body (hash-table-%lock hash-table)) (body)))))) (defun gethash/weak (key hash-table default) diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 6e89800ddf..99857d85d6 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -191,3 +191,14 @@ (setf (gethash 1 ht) 2) (clrhash ht) (assert (not (sb-impl::hash-table-%lock ht))))) + +;;; Prove that our completely assinine API with regard to locking works, +;;; which is to say, if the user explicitly locks an implicitly locked table, +;;; there is no "Recursive lock attempt" error. +;;; In general, we can't discern between a lock that preserves table invariants +;;; at the implementation level, or the user level. But I guess with "system" locks +;;; it's sort of OK because reentrance isn't really possible, and internally +;;; the table considers the lock to be a "system" lock. +(with-test (:name :weak-hash-table-with-explicit-lock) + (let ((h (make-hash-table :weakness :key))) + (with-locked-hash-table (h) (setf (gethash 'foo h) 1)))) From dc39df4d7de31858c401dcacbd5d321b4a844208 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Mon, 29 Jun 2020 13:56:21 +0100 Subject: [PATCH 0151/4023] NEWS for sbcl-2.0.6 --- NEWS | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/NEWS b/NEWS index 88c70da438..51201ce19e 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,27 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.0.5: + * planned incompatible change: the defined symbols in the Metaobject + Protocol, currently accessible from both SB-MOP and SB-PCL packages, will + in a later release be no longer exported from SB-PCL. + * platform support: + ** better support for dynamic-extent on the SPARC architecture. + ** bug fix for loading very large core files. + ** bug fix for logior and logxor on PPC64. * enhancement: EQUALP on structure instances uses code specialized to each structure type, inlining comparison of non-pointer slots. + * enhancement: some standard operators, such as WITH-OUTPUT-TO-STRING and + CHANGE-CLASS, have been adapted to use dynamic-extent temporary objects, + and so cons less garbage on the heap. + * enhancement: read tables are more space- and speed efficient + * bug fix: stream conditions with dynamic-extent streams have the stream + replaced by a stub. (reported by Matt Kaufmann) + * bug fix: garbage collections triggered from foreign callbacks crashed. + (lp#1884403, reported by Andrew Kent) + * bug fix: compiler failure in compiling MAKE-LIST. (lp#1881349) + * bug fix: using the debugger from frames with calls to functions with + unsupplied optional arguments is less likely to cause heap corruption. + (lp#1883745) changes in sbcl-2.0.5 relative to sbcl-2.0.4: * platform support: From 1104c7fd508ec97d97c8f3f82f97e03ac55d7c62 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Mon, 29 Jun 2020 13:56:55 +0100 Subject: [PATCH 0152/4023] 2.0.6: will be tagged as "sbcl-2.0.6" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 51201ce19e..0c035c98d6 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.0.5: +changes in sbcl-2.0.6 relative to sbcl-2.0.5: * planned incompatible change: the defined symbols in the Metaobject Protocol, currently accessible from both SB-MOP and SB-PCL packages, will in a later release be no longer exported from SB-PCL. From 3d70239b0382be45f8935d4ac1c6ac20eeb5c0e8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 29 Jun 2020 18:08:29 -0400 Subject: [PATCH 0153/4023] Accept --load-with-sb-devel as option to slam --- slam.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slam.sh b/slam.sh index dce5422996..f606a8a24b 100644 --- a/slam.sh +++ b/slam.sh @@ -65,8 +65,8 @@ set -e ####################################################################### warm_option="" -if [ "$1" == --load ]; then - warm_option="--load" +if [ "$1" == --load -o "$1" == --load-with-sb-devel ]; then + warm_option="$1" shift fi From 82648a2f7063589043b78b25b7e20bda89c43b1b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 29 Jun 2020 18:15:26 -0400 Subject: [PATCH 0154/4023] Make backtrace in ldb work during GC --- src/runtime/backtrace.c | 30 +++++++++++++++++------------- src/runtime/forwarding-ptr.h | 13 +++++++++++++ src/runtime/immobile-space.c | 7 ------- src/runtime/print.c | 5 +---- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 9b37cb042d..23cea40beb 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -35,6 +35,7 @@ #include "gc.h" #include "code.h" #include "var-io.h" +#include "forwarding-ptr.h" #ifdef LISP_FEATURE_OS_PROVIDES_DLADDR # include @@ -145,6 +146,7 @@ static int string_equal (struct vector *vector, char *string) static void print_entry_name (lispobj name, FILE *f) { + name = follow_maybe_fp(name); if (listp(name)) { putc('(', f); while (name != NIL) { @@ -154,19 +156,20 @@ print_entry_name (lispobj name, FILE *f) return; } print_entry_name(CONS(name)->car, f); - name = CONS(name)->cdr; + name = follow_maybe_fp(CONS(name)->cdr); if (name != NIL) putc(' ', f); } putc(')', f); } else if (lowtag_of(name) == OTHER_POINTER_LOWTAG) { - lispobj *object = native_pointer(name); - if (widetag_of(object) == SYMBOL_WIDETAG) { - struct symbol *symbol = (struct symbol *) object; + struct symbol *symbol = SYMBOL(name); + int widetag = header_widetag(symbol->header); + switch (widetag) { + case SYMBOL_WIDETAG: if (symbol->package != NIL) { struct package *pkg - = (struct package *) native_pointer(symbol->package); - struct vector *pkg_name = VECTOR(pkg->_name); + = (struct package *) native_pointer(follow_maybe_fp(symbol->package)); + struct vector *pkg_name = VECTOR(follow_maybe_fp(pkg->_name)); if (string_equal(pkg_name, "COMMON-LISP")) ; else if (string_equal(pkg_name, "COMMON-LISP-USER")) { @@ -179,17 +182,18 @@ print_entry_name (lispobj name, FILE *f) fputs("::", f); } } - print_string(VECTOR(symbol->name), f); - } else if (widetag_of(object) == SIMPLE_BASE_STRING_WIDETAG + print_string(VECTOR(follow_maybe_fp(symbol->name)), f); + break; + case SIMPLE_BASE_STRING_WIDETAG: #ifdef SIMPLE_CHARACTER_STRING_WIDETAG - || widetag_of(object) == SIMPLE_CHARACTER_STRING_WIDETAG + case SIMPLE_CHARACTER_STRING_WIDETAG: #endif - ) { putc('"', f); - print_string((struct vector*)object, f); + print_string((struct vector*)symbol, f); putc('"', f); - } else { - fprintf(f, "", widetag_of(object)); + break; + default: + fprintf(f, "", widetag); } } else if (fixnump(name)) { fprintf(f, "%d", (int)fixnum_value(name)); diff --git a/src/runtime/forwarding-ptr.h b/src/runtime/forwarding-ptr.h index 81dc54cb05..31b842d10c 100644 --- a/src/runtime/forwarding-ptr.h +++ b/src/runtime/forwarding-ptr.h @@ -59,4 +59,17 @@ set_forwarding_pointer(lispobj *pointer, lispobj newspace_copy) { return newspace_copy; } +/// Chase the pointer in 'word' if it points to a forwarded object. +static inline lispobj follow_maybe_fp(lispobj word) +{ + return (is_lisp_pointer(word) && forwarding_pointer_p(native_pointer(word))) + ? forwarding_pointer_value(native_pointer(word)) : word; +} +/// As above, but 'ptr' MUST be a pointer. +static inline lispobj follow_fp(lispobj ptr) +{ + return forwarding_pointer_p(native_pointer(ptr)) + ? forwarding_pointer_value(native_pointer(ptr)) : ptr; +} + #endif diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index a9d16af1b8..8325a3f134 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1605,13 +1605,6 @@ static struct layout* fix_object_layout(lispobj* obj) return native_layout; } -static lispobj follow_fp(lispobj ptr) -{ - if (forwarding_pointer_p(native_pointer(ptr))) - return forwarding_pointer_value(native_pointer(ptr)); - else - return ptr; -} static void apply_absolute_fixups(lispobj, struct code*); /// It's tricky to try to use the scavtab[] functions for fixing up moved diff --git a/src/runtime/print.c b/src/runtime/print.c index f8994be25b..0b719284b4 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -921,10 +921,7 @@ struct vector * symbol_name(lispobj * sym) sym = native_pointer(forwarding_pointer_value(sym)); if (lowtag_of(((struct symbol*)sym)->name) != OTHER_POINTER_LOWTAG) return NULL; - lispobj * name = native_pointer(((struct symbol*)sym)->name); - if (forwarding_pointer_p(name)) - name = native_pointer(forwarding_pointer_value(name)); - return (struct vector*)name; + return VECTOR(follow_maybe_fp(((struct symbol*)sym)->name)); } struct vector * classoid_name(lispobj * classoid) { From 91f9193ce0d61fcfebde99956bd412884fb23828 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 29 Jun 2020 18:52:55 -0400 Subject: [PATCH 0155/4023] x86-64: Remove remnant of 32-bit code from 64-bit vop CHARACTERP and SINGLE-FLOAT-P never need a temp. (A temp is only needed in 32-bit if the source reg is ESI or EDI) --- src/compiler/generic/late-type-vops.lisp | 6 ++++-- src/compiler/x86-64/type-vops.lisp | 8 ++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/compiler/generic/late-type-vops.lisp b/src/compiler/generic/late-type-vops.lisp index cc7fcd79fb..cb067c40d2 100644 --- a/src/compiler/generic/late-type-vops.lisp +++ b/src/compiler/generic/late-type-vops.lisp @@ -106,7 +106,8 @@ (define-type-vop complex-double-float-p (complex-double-float-widetag)) -(define-type-vop single-float-p (single-float-widetag)) +(define-type-vop single-float-p (single-float-widetag) + #+x86-64 simple-type-predicate) (define-type-vop double-float-p (double-float-widetag)) @@ -133,7 +134,8 @@ *specialized-array-element-type-properties*)))) (def)) ; simple-rank-1-array-*-p -(define-type-vop characterp (character-widetag)) +(define-type-vop characterp (character-widetag) + #+x86-64 simple-type-predicate) (define-type-vop system-area-pointer-p (sap-widetag)) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index a90ca60923..8c36ec56dd 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -88,12 +88,8 @@ (defun %test-immediate (value temp target not-p immediate &optional (drop-through (gen-label))) - ;; Code a single instruction byte test if possible. - (cond ((sc-is value any-reg descriptor-reg) - (inst cmp :byte value immediate)) - (t - (move temp value) ; FIXME - why load? - (inst cmp :byte temp immediate))) + (declare (ignore temp)) + (inst cmp :byte value immediate) (inst jmp (if not-p :ne :e) target) (emit-label drop-through)) From 38cb85c57c1d8dfe50f027b399c755faed4856b3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 29 Jun 2020 21:14:25 -0400 Subject: [PATCH 0156/4023] Define unbound-marker consistently across 64-bit platforms So that the optimization in %test-headers implemented for x86-64 could be implemented for the other platforms if desired. --- src/compiler/generic/early-objdef.lisp | 10 +++++----- src/compiler/generic/early-type-vops.lisp | 10 ++++++++-- src/compiler/generic/genesis.lisp | 2 +- src/compiler/generic/late-type-vops.lisp | 4 ++-- src/compiler/x86-64/type-vops.lisp | 10 ---------- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 56d772ab2c..7790cba82d 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -109,8 +109,8 @@ ;; 8 is the number of words to reserve at the beginning of static space ;; prior to the words of NIL. ;; If you change this, then also change MAKE-NIL-DESCRIPTOR in genesis. - #+(and (not x86-64) gencgc (not sb-thread)) (ash 8 word-shift) - #+x86-64 #x100 + #+(and gencgc (not sb-thread) (not 64-bit)) (ash 8 word-shift) + #+64-bit #x100 (* 2 n-word-bytes) list-pointer-lowtag)) @@ -199,7 +199,7 @@ ;; SIMPLE-VECTOR means the latter doesn't make it right for SBCL internals. (defconstant widetag-spacing 4) -#+x86-64 (defconstant unbound-marker-widetag 9) +#+64-bit (defconstant unbound-marker-widetag 9) (eval-when (:compile-toplevel :load-toplevel :execute) (defenum (;; The first widetag must be greater than SB-VM:LOWTAG-LIMIT ;; otherwise code in generic/early-type-vops will suffer @@ -233,8 +233,8 @@ value-cell-widetag ; 3E 45 3E 45 character-widetag ; 42 49 42 49 sap-widetag ; 46 4D 46 4D - #-x86-64 unbound-marker-widetag ; 4A 51 4A 51 - #+x86-64 unused00-widetag + #-64-bit unbound-marker-widetag ; 4A 51 4A 51 + #+64-bit unused00-widetag weak-pointer-widetag ; 4E 55 4E 55 instance-widetag ; 52 59 52 59 fdefn-widetag ; 56 5D 56 5D diff --git a/src/compiler/generic/early-type-vops.lisp b/src/compiler/generic/early-type-vops.lisp index fcc4cb6b16..df5a494084 100644 --- a/src/compiler/generic/early-type-vops.lisp +++ b/src/compiler/generic/early-type-vops.lisp @@ -81,8 +81,14 @@ (member lowtag type-codes)) '#.(mapcar #'symbol-value fixnum-lowtags)) t)) - (lowtags (remove lowtag-limit type-codes :test #'<)) - (extended (remove lowtag-limit type-codes :test #'>)) + ;; On 64-bit, UNBOUND-MARKER-WIDETAG may be smaller than LOWTAG-LIMIT + ;; but it is not a lowtag. + (lowtags (remove unbound-marker-widetag + (remove lowtag-limit type-codes :test #'<))) + (extended (remove-if (lambda (x) + (and (< x lowtag-limit) + (/= x unbound-marker-widetag))) + type-codes)) (immediates (intersection extended +immediate-types+ :test #'eql)) ;; To collapse the range of widetags comprising real numbers on 64-bit ;; machines, consider SHORT-FLOAT-WIDETAG both a header and immediate. diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a87883ca1a..a2e552f2c2 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1546,7 +1546,7 @@ core and return a descriptor to it." (allocate-vector #-64-bit sb-vm:simple-array-signed-byte-32-widetag #+64-bit sb-vm:simple-array-signed-byte-64-widetag 6 6 *static*) - #+x86-64 (setf (gspace-free-word-index *static*) (/ 256 sb-vm:n-word-bytes)) + #+64-bit (setf (gspace-free-word-index *static*) (/ 256 sb-vm:n-word-bytes)) (let* ((des (allocate-header+object *static* sb-vm:symbol-size 0)) (nil-val (make-descriptor (+ (descriptor-bits des) (* 2 sb-vm:n-word-bytes) diff --git a/src/compiler/generic/late-type-vops.lisp b/src/compiler/generic/late-type-vops.lisp index cb067c40d2..43ba170141 100644 --- a/src/compiler/generic/late-type-vops.lisp +++ b/src/compiler/generic/late-type-vops.lisp @@ -257,8 +257,8 @@ #+sb-simd-pack-256 (define-type-vop simd-pack-256-p (simd-pack-256-widetag)) -#.(when (> unbound-marker-widetag lowtag-mask) - '(define-type-vop unbound-marker-p (unbound-marker-widetag))) +(define-type-vop unbound-marker-p (unbound-marker-widetag) + #+x86-64 simple-type-predicate) ;;; Not type vops, but generic over all backends (macrolet ((def (name lowtag) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 8c36ec56dd..b48f7280e4 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -385,16 +385,6 @@ (inst jmp (if not-p :a :be) target) (emit-label skip)))) -;;; The generic code (in src/compiler/generic/{early,late}-type-vops) -;;; would do the wrong thing. UNBOUND-MARKER-WIDETAG looks like a lowtag -;;; to that code and so it would mask off 4 bits before testing, -;;; which matches too many values. -(define-vop (unbound-marker-p simple-type-predicate) - (:translate unbound-marker-p) - (:generator 2 - (inst cmp :byte value unbound-marker-widetag) - (inst jmp (if not-p :ne :e) target))) - (define-vop (pointerp) (:args (value :scs (any-reg descriptor-reg) :target temp)) (:temporary (:sc unsigned-reg :from (:argument 0)) temp) From f054a145764fa2b6153959c41c20c4e92dc36431 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 29 Jun 2020 21:21:23 -0400 Subject: [PATCH 0157/4023] Avoid writing to code object in make-compiled-debug-fun It causes problems with ELF core, not sure why. Just use a different slot in which to memoize. --- src/code/debug-info.lisp | 4 +++- src/code/debug-int.lisp | 51 +++++++++++++++++++++++----------------- src/code/save.lisp | 6 +++-- src/code/simple-fun.lisp | 16 ++++++++----- 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/src/code/debug-info.lisp b/src/code/debug-info.lisp index 723f629760..7d47e9d9a5 100644 --- a/src/code/debug-info.lisp +++ b/src/code/debug-info.lisp @@ -418,7 +418,9 @@ ;; Location contexts ;; A (simple-array * (*)) or a context if there's only one context. (contexts nil :type t :read-only t) - (tlf-num+offset nil :type integer)) + ;; Packed integers. Also can be a cons of that plus an alist which + ;; maps SB-C::COMPILED-DEBUG-FUN to SB-DI::COMPILED-DEBUG-FUN instances. + (tlf-num+offset nil :type (or integer cons))) ;;; The TLF-NUMBER and CHAR-OFFSET of a compiled-debug-info can each be NIL, ;;; but aren't often. However, to allow that, convert NIL to 0 and non-nil diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 717dbeff69..6bff6d1d78 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -338,14 +338,11 @@ (compiled-frame-escaped obj)))) -(define-load-time-global *debug-funs-mutex* (sb-thread:make-mutex :name "CDF lock")) ;;; This maps SB-C::COMPILED-DEBUG-FUNs to ;;; COMPILED-DEBUG-FUNs, so we can get at cached stuff and not ;;; duplicate COMPILED-DEBUG-FUN structures. -#+cheneygc ; can't write to debuf-info in a purified code object +#+cheneygc ; can't write to debug-info in a purified code object (define-load-time-global *compiled-debug-funs* - ;; The table's lock is redundant - I'm working on removal of the default - ;; assumption of synchronization on all weak tables, but it's unrelated. (make-hash-table :test 'eq :weakness :key)) ;;;; breakpoints @@ -441,11 +438,11 @@ (end-starter nil :type (or null breakpoint))) ;;; Map a SB-C::COMPILED-DEBUG-FUN to a SB-DI::COMPILED-DEBUG-FUN. -;;; The mapping is memoized into %CODE-DEBUG-INFO of COMPONENT +;;; The mapping is memoized into a slot of %CODE-DEBUG-INFO of COMPONENT ;;; except on #+cheneygc where that is assumed not to be possible ;;; (even if it is possible), because usually it's not, because -;;; code might reside in readonly space, and it can only have pointers -;;; to static space, not dynamic space. +;;; code and the debug structures are defined with :PURE T and might reside +;;; in readonly space, which can only have pointers to static space. ;;; ;;; BTW, the nomenclature here is utter and total confusion. ;;; The type of the object in the argument named COMPILER-DEBUG-FUN @@ -454,21 +451,31 @@ ;;; of the slot in the SB-DI:: version of the structure. (defun make-compiled-debug-fun (compiler-debug-fun component) (declare (code-component component)) - ;; Technically this could all be lockfree if we had compare-and-swap - ;; on the debug-info slot. Not worth the effort. - (sb-thread::with-system-mutex (*debug-funs-mutex*) - #+gencgc - (let* ((info (ensure-list (sb-vm::%%code-debug-info component))) - (found (assoc compiler-debug-fun (cdr info) :test #'eq))) - (if found - (cdr found) - (let* ((my-debug-fun (%make-compiled-debug-fun compiler-debug-fun component)) - (new-pair (cons compiler-debug-fun my-debug-fun))) - (setf (%code-debug-info component) (list* (car info) new-pair (cdr info))) - my-debug-fun))) - #+cheneygc - (ensure-gethash compiler-debug-fun *compiled-debug-funs* - (%make-compiled-debug-fun compiler-debug-fun component)))) + #+gencgc + (let ((memo-cell + (let* ((info (sb-vm::%%code-debug-info component)) + (val (sb-c::compiled-debug-info-tlf-num+offset info))) + (if (consp val) + val + (let* ((list (list val)) + (old (cas (sb-c::compiled-debug-info-tlf-num+offset info) val list))) + (if (eq old val) list old)))))) + ;; The CDR of TLF-NUM+OFFSET slot is an alist from compiler -> debugger structure. + (let ((new-df nil) (new-pair nil) (new-alist nil) (alist (cdr memo-cell))) + (loop + ;; This list generally contains 5 items or less. At least, in our tests it does + ;; which I assume is typical. + (awhen (assoc compiler-debug-fun alist :test #'eq) (return (cdr it))) + (if new-alist + (rplacd new-alist alist) + (setq new-df (%make-compiled-debug-fun compiler-debug-fun component) + new-pair (cons compiler-debug-fun new-df) + new-alist (cons new-pair alist))) + (let ((old (cas (cdr memo-cell) alist new-alist))) + (if (eq old alist) (return new-df) (setq alist old)))))) + #+cheneygc + (ensure-gethash compiler-debug-fun *compiled-debug-funs* + (%make-compiled-debug-fun compiler-debug-fun component))) ;;;; CODE-LOCATIONs diff --git a/src/code/save.lisp b/src/code/save.lisp index 936a36113e..063fb6cd53 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -494,8 +494,10 @@ sb-c:: (#.sb-vm:code-header-widetag (let ((di (sb-vm::%%code-debug-info obj))) ;; Discard memoized debugger's debug info - (when (and (consp di) (neq obj sb-fasl:*assembler-routines*)) - (setf (%code-debug-info obj) (car di)))) + (when (typep di 'sb-c::compiled-debug-info) + (let ((thing (sb-c::compiled-debug-info-tlf-num+offset di))) + (when (consp thing) + (setf (sb-c::compiled-debug-info-tlf-num+offset di) (car thing)))))) (dotimes (i (sb-kernel:code-n-entries obj)) (let* ((fun (sb-kernel:%code-entry-point obj i)) (arglist (%simple-fun-arglist fun)) diff --git a/src/code/simple-fun.lisp b/src/code/simple-fun.lisp index 65fcf2b796..2589892b2c 100644 --- a/src/code/simple-fun.lisp +++ b/src/code/simple-fun.lisp @@ -633,8 +633,15 @@ (in-package "SB-C") +;;; Decode the packed TLF-NUM+OFFSET slot, which might have ancillary +;;; data for the debugger pushed in. So if it's a cons, take the CDR. ;;; This is target-only code, so doesn't belong in 'debug-info.lisp' -(flet ((unpack-tlf-num+offset (integer &aux (bytepos 0)) +(flet ((unpack-tlf-num+offset (cdi &aux (tlf-num+offset + (compiled-debug-info-tlf-num+offset cdi)) + (integer (if (consp tlf-num+offset) + (car tlf-num+offset) + tlf-num+offset)) + (bytepos 0)) (flet ((unpack-1 () (let ((shift 0) (acc 0)) (declare (notinline sb-kernel:%ldb)) ; lp#1573398 @@ -650,9 +657,6 @@ (values (if (eql v1 0) nil (1- v1)) (if (eql v2 0) nil (1- v2))))))) (defun compiled-debug-info-tlf-number (cdi) - (nth-value 0 (unpack-tlf-num+offset - (compiled-debug-info-tlf-num+offset cdi)))) - + (nth-value 0 (unpack-tlf-num+offset cdi))) (defun compiled-debug-info-char-offset (cdi) - (nth-value 1 (unpack-tlf-num+offset - (compiled-debug-info-tlf-num+offset cdi))))) + (nth-value 1 (unpack-tlf-num+offset cdi)))) From 1dbad9cb909e64f38df6b52def777c1afc4f1eed Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 30 Jun 2020 10:52:40 -0400 Subject: [PATCH 0158/4023] Remove *ALL-THREADS-LOCK* It's not needed to protect the AVL tree. It was overloaded to not only do that but also prevent creation of new threads which is better done with the make-thread lock; as well as prevent thread exit, for which its use was completely horrible. Since each thread already has a mutex for interruptions, use that for SYMBOL-VALUE-IN-THREAD (and INTERRUPT-THREAD) to ensure that the memory exists (in the former case) or the pthread ID exists (in the latter). There is absolutely no reason to look in the C variable all_threads, unless you're using one of the platforms/configs that I don't understand. --- contrib/sb-posix/interface.lisp | 2 +- contrib/sb-sprof/interface.lisp | 5 +- src/code/target-thread.lisp | 117 +++++++++++++++++++------------- tests/deadlock.impure.lisp | 5 +- 4 files changed, 80 insertions(+), 49 deletions(-) diff --git a/contrib/sb-posix/interface.lisp b/contrib/sb-posix/interface.lisp index 3c94463cbf..30ec1a1b97 100644 --- a/contrib/sb-posix/interface.lisp +++ b/contrib/sb-posix/interface.lisp @@ -344,7 +344,7 @@ not supported." (let () #+sb-thread (sb-impl::finalizer-thread-stop) - (sb-thread::with-all-threads-lock + (sb-thread::with-system-mutex (sb-thread::*make-thread-lock*) (when (let ((avltree sb-thread::*all-threads*)) (or (sb-thread::avlnode-left avltree) (sb-thread::avlnode-right avltree))) diff --git a/contrib/sb-sprof/interface.lisp b/contrib/sb-sprof/interface.lisp index 0040582a98..497cfab607 100644 --- a/contrib/sb-sprof/interface.lisp +++ b/contrib/sb-sprof/interface.lisp @@ -203,7 +203,10 @@ The following keyword args are recognized: (progn (when (eq :all threads) ;; Set the value new threads inherit. - (sb-thread::with-all-threads-lock + ;; This used to acquire the all-threads lock, but I fail to see how + ;; doing so ensured anything at all. Maybe because our locks tend + ;; to act as memory barriers? Anyway, what's the point? + (progn (setf sb-thread::*default-alloc-signal* alloc-signal))) ;; Turn on allocation profiling in existing threads. (dolist (thread (profiled-threads)) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 7aa260f644..0289abf63b 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -163,6 +163,11 @@ arbitrary printable objects, and need not be unique.") (defmethod print-object ((thread thread) stream) (print-unreadable-object (thread stream :type t :identity t) (let* ((cookie (list thread)) + ;; Hmm, state-change, mutex acquisition, and semantic problems + ;; all because of a goddamn print method? What the effing hell? + ;; You literally can't call this method in two threads at once + ;; without lock contention and risk of joining >1 time, + ;; which we don't treat as user error even though it is. (info (if (thread-alive-p thread) :running (multiple-value-list @@ -212,18 +217,11 @@ to terminate this thread cleanly prior to core file saving without signalling an error in that case." (thread-%ephemeral-p thread)) -;; A thread is eligible for gc iff it has finished and there are no -;; more references to it. This structure keeps a reference to -;; all running threads ordered by stack base address. +;; Keep an AVL tree of threads ordered by stack base address. NIL is the empty tree. (sb-ext:define-load-time-global *all-threads* ()) -(sb-ext:define-load-time-global *all-threads-lock* (make-mutex :name "all threads lock")) (defvar *default-alloc-signal* nil) -(defmacro with-all-threads-lock (&body body) - `(with-system-mutex (*all-threads-lock*) - ,@body)) - (defun list-all-threads () "Return a list of the live threads. Note that the return value is potentially stale even before the function returns, as new threads may be @@ -268,7 +266,7 @@ created and old ones may exit at any time." (defun init-initial-thread () (/show0 "Entering INIT-INITIAL-THREAD") ;;; FIXME: is it purposeful or accidental that we recreate some of - ;;; the global mutexes but not *ALL-THREADS-LOCKS* ? + ;;; the global mutexes but not all of them? (setf sb-impl::*exit-lock* (make-mutex :name "Exit Lock") *make-thread-lock* (make-mutex :name "Make-Thread Lock")) (let ((thread (%make-thread :name "main thread" @@ -1318,12 +1316,7 @@ on this semaphore, then N of them is woken up." ;;; *waiting* for the session lock for things like GET-FOREGROUND to ;;; be interruptible. ;;; -;;; Take care: we sometimes need to obtain the session lock while -;;; holding on to *ALL-THREADS-LOCK*, so we must _never_ obtain it -;;; _after_ getting a session lock! (Deadlock risk.) -;;; -;;; FIXME: It would be good to have ordered locks to ensure invariants -;;; like the above. +;;; FIXME: It might be good to have a way to enforce lock ordering invariants (defmacro with-session-lock ((session) &body body) `(with-system-mutex ((session-lock ,session) :allow-with-interrupts t) ,@body)) @@ -1360,19 +1353,30 @@ on this semaphore, then N of them is woken up." `(labels ((,fb-name () ,@forms)) (call-with-new-session (function ,fb-name))))) +(defmacro with-interruptions-lock ((thread) &body body) + `(with-system-mutex ((thread-interruptions-lock ,thread)) + ,@body)) + ;;; Remove thread from its session, if it has one. #+sb-thread -(defun handle-thread-exit (thread control-stack-start) +(defun handle-thread-exit () (/show0 "HANDLING THREAD EXIT") (when *exit-in-process* (%exit)) ;; Lisp-side cleanup - (with-all-threads-lock - (setf (thread-%alive-p thread) nil) - (setf (thread-os-thread thread) sb-ext:most-positive-word) - (setq *all-threads* (avl-delete control-stack-start *all-threads*)) + (let ((thread *current-thread*)) (when *session* - (%delete-thread-from-session thread *session*)))) + (%delete-thread-from-session thread *session*)) + (with-interruptions-lock (thread) + (setf (thread-%alive-p thread) nil) + (setf (thread-os-thread thread) sb-ext:most-positive-word)) + (sb-thread:barrier (:read)) + (let ((old *all-threads*)) + (loop + (let ((new (avl-delete (get-lisp-obj-address sb-vm:*control-stack-start*) + old))) + (when (eq old (setq old (sb-ext:cas *all-threads* old new))) (return))))))) + (defvar sb-ext:*invoke-debugger-hook* nil "This is either NIL or a designator for a function of two arguments, @@ -1564,13 +1568,15 @@ session." (setf sb-vm:*alloc-signal* *default-alloc-signal*) #+linux (setf (thread-os-tid thread) (sb-gettid)) (with-mutex ((thread-result-lock thread)) - (with-all-threads-lock + (let ((old *all-threads*)) + (loop (let ((addr (get-lisp-obj-address sb-vm:*control-stack-start*))) ;; If ADDR exists, then we have a bug in the thread exit handler. ;; The workaround here would be to delete the old thread first, ;; but I'd rather find out about the bug than bury it. - (aver (not (avl-find addr *all-threads*))) - (setq *all-threads* (avl-insert *all-threads* addr thread)))) + (aver (not (avl-find addr old))) + (let ((new (avl-insert old addr thread))) + (when (eq old (setq old (sb-ext:cas *all-threads* old new))) (return)))))) (let ((session *session*) (session-cons (list thread))) (with-session-lock (session) @@ -1624,10 +1630,9 @@ session." (setq *interrupt-pending* nil) #+sb-thruption (setq *thruption-pending* nil) - (handle-thread-exit thread - (get-lisp-obj-address - sb-vm:*control-stack-start*))))))))) - (values)) + (handle-thread-exit)))))))) + ;; this returns to C, so return a single value + 0) (defun make-thread (function &key name arguments) "Create a new thread of NAME that runs FUNCTION with the argument @@ -1766,10 +1771,6 @@ subject to change." :late ("SBCL" "1.2.15") (function destroy-thread :replacement terminate-thread))) -(defmacro with-interruptions-lock ((thread) &body body) - `(with-system-mutex ((thread-interruptions-lock ,thread)) - ,@body)) - ;;; Called from the signal handler. #-(or sb-thruption win32) (defun run-interruption () @@ -1811,6 +1812,7 @@ subject to change." (setf *thruption-pending* t))))) (defun interrupt-thread (thread function) + (declare (ignorable thread)) "Interrupt THREAD and make it run FUNCTION. The interrupt is asynchronous, and can occur anywhere with the exception of @@ -1864,34 +1866,57 @@ the state of a thread: Short version: be careful out there." #+(and (not sb-thread) win32) - #+(and (not sb-thread) win32) - (declare (ignore thread)) (with-interrupt-bindings (with-interrupts (funcall function))) #-(and (not sb-thread) win32) - (let ((os-thread (thread-os-thread thread))) - (cond ((= os-thread (ldb (byte sb-vm:n-word-bits 0) -1)) - (error 'interrupt-thread-error :thread thread)) - (t - (let (invoked) - (with-interruptions-lock (thread) + (macrolet ((enqueue (set-invoked) ;; Append to the end of the interruptions queue. It's ;; O(N), but it does not hurt to slow interruptors down a ;; bit when the queue gets long. - (setf (thread-interruptions thread) + `(setf (thread-interruptions thread) (append (thread-interruptions thread) (list (lambda () - (setf invoked t) + ,@(if set-invoked '((setf invoked t))) (barrier (:memory)) (without-interrupts (allow-with-interrupts - (funcall function)))))))) + (funcall function))))))))) + + ;; POSIX says: + ;; "If an application attempts to use a thread ID whose lifetime has ended, + ;; the behavior is undefined." + ;; We have two ways of handling this, the good way and the shiat way. + ;; The good way is to pthread_kill() while holding the interruptions lock, + ;; which prevents thread exit since a thread needs to briefly acquire + ;; that lock just prior to exit. + + #+(and sb-thread (not sb-safepoint) (not sb-thruption)) ; Good way + (unless (with-interruptions-lock (thread) + (let ((os-thread (thread-os-thread thread))) + (unless (= os-thread sb-ext:most-positive-word) + (enqueue nil) + (alien-funcall (extern-alien "pthread_kill" (function void unsigned int)) + os-thread sb-unix:sigpipe) + t))) + (error 'interrupt-thread-error :thread thread)) + + ;; Shiat way: call to C to acquire the all_threads lock and scan all_threads. + ;; Beyond that there's the question of why INVOKED is ever set/examined. Seems fubar. + ;; I have no friggin idea how sb-thruption is supposed to work. + #-(and sb-thread (not sb-safepoint) (not sb-thruption)) + (let ((os-thread (thread-os-thread thread))) + (cond ((= os-thread (ldb (byte sb-vm:n-word-bits 0) -1)) + (error 'interrupt-thread-error :thread thread)) + (t + (let (invoked) + (with-interruptions-lock (thread) + (enqueue t)) (when (and (minusp (wake-thread os-thread)) ;; The interrupt queue has been processed by ;; some other interrupt. (progn (barrier (:memory)) (not invoked))) - (error 'interrupt-thread-error :thread thread))))))) + (error 'interrupt-thread-error :thread thread)))))))) (defun terminate-thread (thread) "Terminate the thread identified by THREAD, by interrupting it and @@ -1950,7 +1975,7 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (defun %symbol-value-in-thread (symbol thread) ;; Prevent the thread from dying completely while we look for the TLS ;; area... - (with-all-threads-lock + (with-interruptions-lock (thread) (if (thread-alive-p thread) (let ((val (sap-ref-lispobj (int-sap (thread-primitive-thread thread)) (symbol-tls-index symbol)))) @@ -1963,7 +1988,7 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (defun %set-symbol-value-in-thread (symbol thread value) ;; Prevent the thread from dying completely while we look for the TLS ;; area... - (with-all-threads-lock + (with-interruptions-lock (thread) (if (thread-alive-p thread) (let ((offset (symbol-tls-index symbol))) (cond ((zerop offset) diff --git a/tests/deadlock.impure.lisp b/tests/deadlock.impure.lisp index 8bc7d95624..a8206cbcff 100644 --- a/tests/deadlock.impure.lisp +++ b/tests/deadlock.impure.lisp @@ -22,6 +22,9 @@ (sb-thread:join-thread t2)))) (assert (equal '(:ok :ok) res))))) +;;; I would optimistically guess that this test can no longer fail, +;;; even for :win32, since there is no lisp mutex around *all-threads*. +;;; (There is still the C one) (with-test (:name :gc-deadlock :broken-on :win32) (write-line "WARNING: THIS TEST WILL HANG ON FAILURE!") @@ -50,7 +53,7 @@ ;; but the same can happen because of a regular ;; MAKE-THREAD or LIST-ALL-THREADS, and various ;; session functions. - (sb-thread::with-all-threads-lock + (progn (sb-thread::with-session-lock (sb-thread::*session*) (sb-ext:gc)))) :name (format nil "GC-~D" i))) From 68c38676c333d24f0f977d87a43d88bc396dd9da Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 30 Jun 2020 13:09:15 -0400 Subject: [PATCH 0159/4023] Decrease parallel-exec total wall-clock time Move the slowest compiler.pure test out (it was at least 6 sec) and start the slowest tests first via a manually curated list. --- tests/bug-1072739.pure.lisp | 51 +++++++++++++++++++++++++++++++++++ tests/compiler.pure.lisp | 53 ------------------------------------- tests/parallel-exec.sh | 39 +++++++++++++++++++++------ 3 files changed, 82 insertions(+), 61 deletions(-) create mode 100644 tests/bug-1072739.pure.lisp diff --git a/tests/bug-1072739.pure.lisp b/tests/bug-1072739.pure.lisp new file mode 100644 index 0000000000..8baed8686a --- /dev/null +++ b/tests/bug-1072739.pure.lisp @@ -0,0 +1,51 @@ +;; win32 is very specific about the order in which catch blocks +;; must be allocated on the stack +;; +;; This test is extremely slow, so it deserves its own file. +(with-test (:name (compile :bug-1072739) :slow t) + (checked-compile-and-assert (:optimize :safe) + `(lambda () + (STRING= + (LET ((% 23)) + (WITH-OUTPUT-TO-STRING (G13908) + (PRINC + (LET () + (DECLARE (OPTIMIZE (SB-EXT:INHIBIT-WARNINGS 3))) + (HANDLER-CASE + (WITH-OUTPUT-TO-STRING (G13909) (PRINC %A%B% G13909) G13909) + (UNBOUND-VARIABLE NIL + (HANDLER-CASE + (WITH-OUTPUT-TO-STRING (G13914) + (PRINC %A%B% G13914) + (PRINC "" G13914) + G13914) + (UNBOUND-VARIABLE NIL + (HANDLER-CASE + (WITH-OUTPUT-TO-STRING (G13913) + (PRINC %A%B G13913) + (PRINC "%" G13913) + G13913) + (UNBOUND-VARIABLE NIL + (HANDLER-CASE + (WITH-OUTPUT-TO-STRING (G13912) + (PRINC %A% G13912) + (PRINC "b%" G13912) + G13912) + (UNBOUND-VARIABLE NIL + (HANDLER-CASE + (WITH-OUTPUT-TO-STRING (G13911) + (PRINC %A G13911) + (PRINC "%b%" G13911) + G13911) + (UNBOUND-VARIABLE NIL + (HANDLER-CASE + (WITH-OUTPUT-TO-STRING (G13910) + (PRINC % G13910) + (PRINC "a%b%" G13910) + G13910) + (UNBOUND-VARIABLE NIL + (ERROR "Interpolation error in \"%a%b%\" +")))))))))))))) + G13908))) + "23a%b%")) + (() t))) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index 936230ed06..d3a3ebffb7 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -4945,59 +4945,6 @@ (logand (lognand a -6) (* b -502823994))) ((-1491588365 -3745511761) 1084329992))) -;; win32 is very specific about the order in which catch blocks -;; must be allocated on the stack -;; -;; This test is on the critical path. When started as the very first test, -;; it finishes as the last. -(with-test (:name (compile :bug-1072739) :slow t) - (checked-compile-and-assert (:optimize :safe) - `(lambda () - (STRING= - (LET ((% 23)) - (WITH-OUTPUT-TO-STRING (G13908) - (PRINC - (LET () - (DECLARE (OPTIMIZE (SB-EXT:INHIBIT-WARNINGS 3))) - (HANDLER-CASE - (WITH-OUTPUT-TO-STRING (G13909) (PRINC %A%B% G13909) G13909) - (UNBOUND-VARIABLE NIL - (HANDLER-CASE - (WITH-OUTPUT-TO-STRING (G13914) - (PRINC %A%B% G13914) - (PRINC "" G13914) - G13914) - (UNBOUND-VARIABLE NIL - (HANDLER-CASE - (WITH-OUTPUT-TO-STRING (G13913) - (PRINC %A%B G13913) - (PRINC "%" G13913) - G13913) - (UNBOUND-VARIABLE NIL - (HANDLER-CASE - (WITH-OUTPUT-TO-STRING (G13912) - (PRINC %A% G13912) - (PRINC "b%" G13912) - G13912) - (UNBOUND-VARIABLE NIL - (HANDLER-CASE - (WITH-OUTPUT-TO-STRING (G13911) - (PRINC %A G13911) - (PRINC "%b%" G13911) - G13911) - (UNBOUND-VARIABLE NIL - (HANDLER-CASE - (WITH-OUTPUT-TO-STRING (G13910) - (PRINC % G13910) - (PRINC "a%b%" G13910) - G13910) - (UNBOUND-VARIABLE NIL - (ERROR "Interpolation error in \"%a%b%\" -")))))))))))))) - G13908))) - "23a%b%")) - (() t))) - (with-test (:name (compile equal equalp :transforms)) (let* ((s "foo") (bit-vector #*11001100) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index d4c833a4c2..0fe6710e37 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -15,20 +15,41 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (import '(sb-alien:alien-funcall sb-alien:extern-alien sb-alien:int sb-alien:c-string sb-alien:unsigned)) (setq *summarize-test-times* t) +;;; Ordered approximately in descending order by running time +(defvar *slow-tests* '("threads.impure" + "seq.impure" + "threads.pure" + "compiler.pure" + "timer.impure" + "bug-1180102.impure" + "gethash-concurrency.impure" + "arith.pure")) +(defun choose-order (tests) + (sort tests + (lambda (a b) + (let ((posn-a (or (position a *slow-tests* :test #'string=) + most-positive-fixnum)) + (posn-b (or (position b *slow-tests* :test #'string=) + most-positive-fixnum))) + (cond ((< posn-a posn-b) t) + ((> posn-a posn-b) nil) + (t (string< a b))))))) (defun parallel-execute-tests (max-jobs) (format t "Using ~D processes~%" max-jobs) ;; Interleave the order in which all tests are launched rather than ;; starting them in the batches that filtering places them in. - (let ((files (sort (mapcar #'pathname-name + (let ((files (choose-order + (mapcar #'pathname-name (append (pure-load-files) (pure-cload-files) (impure-load-files) (impure-cload-files) - (sh-files))) - #'string<)) + (sh-files))))) (subprocess-count 0) (subprocess-list nil) (aggregate-vop-usage (make-hash-table)) + ;; Start timing only after all the DIRECTORY calls are done (above) + (start-time (get-internal-real-time)) (missing-usage) (losing)) (labels ((wait () @@ -39,15 +60,16 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (decf subprocess-count) (let ((process (assoc pid subprocess-list))) (setq subprocess-list (delete process subprocess-list)) - (let* ((code (ash status -8)) - (filename (cdr process))) + (let ((code (ash status -8)) + (filename (cadr process)) + (et (- (get-internal-real-time) (caddr process)))) (unless (sum-vop-usage (format nil "$logdir/~a.vop-usage" filename) t) (when (or (search ".pure" filename) (search ".impure" filename)) (push filename missing-usage))) (cond ((eq code 104) - (format t "~A: success~%" filename)) + (format t "~A: success (~d msec)~%" filename et)) (t - (format t "~A: status ~D~%" filename code) + (format t "~A: status ~D (~d msec)~%" filename code et) (push filename losing))))))) (sum-vop-usage (input deletep) (with-open-file (f input :if-does-not-exist nil) @@ -98,7 +120,7 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (exit :code (if (unexpected-failures) 1 104))))) (format t "~A: pid ~d~%" file pid) (incf subprocess-count) - (push (cons pid file) subprocess-list))) + (push (list pid file (get-internal-real-time)) subprocess-list))) (loop (if (plusp subprocess-count) (wait) (return))) (dolist (result '("vop-usage.txt" "vop-usage-combined.txt")) @@ -113,6 +135,7 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (format output "~7d ~s~%" (car cell) (cdr cell))))) (sum-vop-usage "../output/warm-vop-usage.txt" nil)) + (format t "~&Total realtime: ~d msec~%" (- (get-internal-real-time) start-time)) (when missing-usage (format t "~&Missing vop-usage:~{ ~a~}~%" missing-usage)) From 9f16dc2b8257c008a8e05fe8e9ad947314529e60 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 30 Jun 2020 13:39:12 -0400 Subject: [PATCH 0160/4023] Disuse kill_safely() and wake_thread() unless (or safepoint thruption) None of the C logic for detecting pthread liveness is necessary. --- src/code/target-thread.lisp | 36 ++++++++++++++++++++++++++++++------ src/runtime/thread.c | 9 +++++++++ tests/signals.impure.lisp | 4 ++++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 0289abf63b..cf2986dd3c 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -354,6 +354,8 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." ;;;; Aliens, low level stuff +#+(or sb-safepoint sb-thruption) +(progn (define-alien-routine "kill_safely" int (os-thread #-alpha unsigned #+alpha unsigned-int) @@ -361,7 +363,7 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (define-alien-routine "wake_thread" int - (os-thread unsigned)) + (os-thread unsigned))) #+sb-thread (progn @@ -1771,6 +1773,27 @@ subject to change." :late ("SBCL" "1.2.15") (function destroy-thread :replacement terminate-thread))) +;;; raise() is defined to send the signal to pthread_self() if multithreaded. +(defmacro raise (signal) + `(alien-funcall (extern-alien "raise" (function int int)) ,signal)) + +;;; A macro, because the OS-THREAD slot holds a WORD which could cause boxing if passed +;;; to a function. +;;; Incidentally, this macro is used in a test, which means that it would have +;;; to be protected from the tree-shaker, which isn't removing it because we don't +;;; seem to remove symbols from SB-THREAD, but we should. +(defmacro pthread-kill (os-thread signal) + (declare (ignorable os-thread)) + ;; If no threads, pthread_kill() won't exist since we didn't link with -lpthread. + ;; And raise() - as we use it - can't fail, so just ignore the result. + ;; (The signal number is always SIGPIPE or SIGINT, and the process is obviously not dead) + #-sb-thread `(raise ,signal) + #+sb-thread + `(unless (= 0 (alien-funcall (extern-alien "pthread_kill" + (function int unsigned int)) + ,os-thread ,signal)) + (error "pthread_kill() failed"))) + ;;; Called from the signal handler. #-(or sb-thruption win32) (defun run-interruption () @@ -1781,7 +1804,9 @@ subject to change." ;; OS's point of view the signal we are in the handler for is no ;; longer pending, so the signal will not be lost. (when (thread-interruptions *current-thread*) - (kill-safely (thread-os-thread *current-thread*) sb-unix:sigpipe)) + (raise sb-unix:sigpipe)) + ;; FIXME: does this really respect the promised ordering of interruptions? + ;; It looks backwards to raise first and run the popped function second. (when interruption (funcall interruption)))) @@ -1890,20 +1915,19 @@ Short version: be careful out there." ;; which prevents thread exit since a thread needs to briefly acquire ;; that lock just prior to exit. - #+(and sb-thread (not sb-safepoint) (not sb-thruption)) ; Good way + #-(or sb-safepoint sb-thruption) ; Good way (unless (with-interruptions-lock (thread) (let ((os-thread (thread-os-thread thread))) (unless (= os-thread sb-ext:most-positive-word) (enqueue nil) - (alien-funcall (extern-alien "pthread_kill" (function void unsigned int)) - os-thread sb-unix:sigpipe) + (pthread-kill os-thread sb-unix:sigpipe) t))) (error 'interrupt-thread-error :thread thread)) ;; Shiat way: call to C to acquire the all_threads lock and scan all_threads. ;; Beyond that there's the question of why INVOKED is ever set/examined. Seems fubar. ;; I have no friggin idea how sb-thruption is supposed to work. - #-(and sb-thread (not sb-safepoint) (not sb-thruption)) + #+(or sb-safepoint sb-thruption) (let ((os-thread (thread-os-thread thread))) (cond ((= os-thread (ldb (byte sb-vm:n-word-bits 0) -1)) (error 'interrupt-thread-error :thread thread)) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 57220ad1dc..4a1b4f047a 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -1067,6 +1067,14 @@ thread_yield() #endif } +// The code is extremely trashy and a good candidate for removal/cleanup +// but I don't understand this feature combination well enough to do so. +// The part of it we need to keep is the GC state interaction, though +// as can plainly be seen from the "good" case of SB-THREAD::INTERRUPT-THREAD +// there is a perfectly fine way of detecting validity of a pthread ID, +// and even the link below to Ulrich Drepper's blog post says exactly what +// to do. So why does this have anything to do with the all_threads_lock??? +#if defined LISP_FEATURE_SB_THRUPTION || defined LISP_FEATURE_SB_SAFEPOINT int wake_thread(os_thread_t os_thread) { @@ -1174,3 +1182,4 @@ kill_safely(os_thread_t os_thread, int signal) #endif } } +#endif diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index 5232538f3f..288e94a247 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -69,9 +69,13 @@ (assert (eq :condition (handler-case (progn + ;; KILL-SAFELY has C code for it only if (OR :SB-SAFEPOINT :SB-THRUPTION), + ;; otherwise we directly call a POSIX function. + #+(or sb-safepoint sb-thruption) (sb-thread::kill-safely (sb-thread::thread-os-thread sb-thread::*current-thread*) sb-unix:sigint) + #-(or sb-safepoint sb-thruption) (sb-thread::raise sb-unix:sigint) #+sb-safepoint-strictly ;; In this case, the signals handler gets invoked ;; indirectly through an INTERRUPT-THREAD. Give it From b8f81b2b64d76e7b02dbf57d902f1cd1b7158d47 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 30 Jun 2020 15:29:43 -0400 Subject: [PATCH 0161/4023] sb-futex: remove recursion check on uncontested lock If the first CAS succeeds, then the owner must have been NIL. --- src/code/target-thread.lisp | 42 ++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index cf2986dd3c..90eba191ef 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -657,26 +657,34 @@ returns NIL each time." (defun %try-mutex (mutex new-owner) (declare (type mutex mutex) (optimize (speed 3))) - (barrier (:read)) - (let ((old (mutex-%owner mutex))) - (when (eq new-owner old) - (error "Recursive lock attempt ~S." mutex)) - #-sb-thread - (when old - (error "Strange deadlock on ~S in an unithreaded build?" mutex)) - #-(and sb-thread sb-futex) - (and (not old) - ;; Don't even bother to try to CAS if it looks bad. - (not (sb-ext:compare-and-swap (mutex-%owner mutex) nil new-owner))) - #+(and sb-thread sb-futex) + #-(and sb-thread sb-futex) + (progn + (barrier (:read)) + (let ((old (mutex-%owner mutex))) + (when (eq new-owner old) + (error "Recursive lock attempt ~S." mutex)) + #-sb-thread + (when old + (error "Strange deadlock on ~S in an unithreaded build?" mutex)) + #-(and sb-thread sb-futex) + (and (not old) + ;; Don't even bother to try to CAS if it looks bad. + (not (sb-ext:compare-and-swap (mutex-%owner mutex) nil new-owner))))) + #+(and sb-thread sb-futex) ;; From the Mutex 2 algorithm from "Futexes are Tricky" by Ulrich Drepper. - (when (eql +lock-free+ (sb-ext:compare-and-swap (mutex-state mutex) + (cond ((eql +lock-free+ (sb-ext:compare-and-swap (mutex-state mutex) +lock-free+ +lock-taken+)) - (let ((prev (sb-ext:compare-and-swap (mutex-%owner mutex) nil new-owner))) - (when prev - (bug "Old owner in free mutex: ~S" prev)) - t)))) + ;; TODO: measure the speed difference of doing an ordinary store here. + ;; CAS is overkill but we would have to forgo the bug detection. + ;; Alternatively, we could use one double-wide CAS. + (let ((prev (sb-ext:compare-and-swap (mutex-%owner mutex) nil + (sb-ext:truly-the thread new-owner)))) + (when prev + (bug "Old owner in free mutex: ~S" prev)) + t)) + ((eq (mutex-%owner mutex) new-owner) + (error "Recursive lock attempt ~S." mutex)))) #+sb-thread (defun %%wait-for-mutex (mutex new-owner to-sec to-usec stop-sec stop-usec) From 884edfb90abbf93194688064eba0b34e376af122 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 30 Jun 2020 17:15:00 -0400 Subject: [PATCH 0162/4023] Shake SB-THREAD harder --- make-target-2-load.lisp | 1 + src/code/target-thread.lisp | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index cd84281277..e2d1b7a4b5 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -393,6 +393,7 @@ Please check that all strings which were not recognizable to the compiler #.(find-package "SB-PCL") #.(find-package "SB-MOP") #.(find-package "SB-PRETTY") + #.(find-package "SB-THREAD") #.(find-package "SB-KERNEL")) ;; Assume all and only external symbols must be retained (eq accessibility :external)) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 90eba191ef..c6de3cd2b2 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -11,6 +11,17 @@ (in-package "SB-THREAD") +;;; symbols to protect from tree-shaker, for some tests +(export '(%thread-local-references + current-thread-sap + get-spinlock + pthread-kill + raise + release-spinlock + spinlock + with-session-lock + with-spinlock)) + ;;; CAS Lock ;;; ;;; Locks don't come any simpler -- or more lightweight than this. While @@ -1787,9 +1798,6 @@ subject to change." ;;; A macro, because the OS-THREAD slot holds a WORD which could cause boxing if passed ;;; to a function. -;;; Incidentally, this macro is used in a test, which means that it would have -;;; to be protected from the tree-shaker, which isn't removing it because we don't -;;; seem to remove symbols from SB-THREAD, but we should. (defmacro pthread-kill (os-thread signal) (declare (ignorable os-thread)) ;; If no threads, pthread_kill() won't exist since we didn't link with -lpthread. From e706632cf3ef7b75023dfa0f5cd8ae479d454d1e Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 1 Jul 2020 03:03:20 +0300 Subject: [PATCH 0163/4023] Disable a test on -sb-thread --- tests/avltree.pure.lisp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/avltree.pure.lisp b/tests/avltree.pure.lisp index aefb7f6919..f37b4e059b 100644 --- a/tests/avltree.pure.lisp +++ b/tests/avltree.pure.lisp @@ -1,4 +1,7 @@ (use-package "SB-INT") + +#-sb-thread (sb-ext:exit :code 104) ;; some of the symbols below disappear + (import 'sb-thread::(avlnode-key avlnode-data avlnode-left avlnode-right avl-insert avl-delete avl-find avl-balance-factor avl-count)) From d93b30f4676b056111b55baef5927df41b68c5cc Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 1 Jul 2020 03:19:39 +0300 Subject: [PATCH 0164/4023] Fix a test with the tree-shaker enabled. --- src/code/target-thread.lisp | 10 ++-------- tests/signals.impure.lisp | 9 ++++++++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index c6de3cd2b2..b3bcd6c076 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -366,15 +366,9 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." ;;;; Aliens, low level stuff #+(or sb-safepoint sb-thruption) -(progn -(define-alien-routine "kill_safely" - int - (os-thread #-alpha unsigned #+alpha unsigned-int) - (signal int)) - (define-alien-routine "wake_thread" - int - (os-thread unsigned))) + int + (os-thread unsigned)) #+sb-thread (progn diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index 288e94a247..7e0332c58b 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -62,6 +62,13 @@ ;; we get EINTR. (loop until returning) (assert (= saved-errno (sb-unix::get-errno))))) + +#+(or sb-safepoint sb-thruption) +(sb-alien:define-alien-routine "kill_safely" + int + (sb-thread::os-thread unsigned) + (signal int)) + ;; It is desirable to support C-c on Windows, but SIGINT ;; is not the mechanism to use on this platform. #-win32 @@ -72,7 +79,7 @@ ;; KILL-SAFELY has C code for it only if (OR :SB-SAFEPOINT :SB-THRUPTION), ;; otherwise we directly call a POSIX function. #+(or sb-safepoint sb-thruption) - (sb-thread::kill-safely + (kill-safely (sb-thread::thread-os-thread sb-thread::*current-thread*) sb-unix:sigint) #-(or sb-safepoint sb-thruption) (sb-thread::raise sb-unix:sigint) From 9de7bf2c01706c30d5a1f9cf5897744fa76ce990 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 1 Jul 2020 05:19:28 +0300 Subject: [PATCH 0165/4023] Can't exit from pure tests. --- tests/avltree.pure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/avltree.pure.lisp b/tests/avltree.pure.lisp index f37b4e059b..34885832e0 100644 --- a/tests/avltree.pure.lisp +++ b/tests/avltree.pure.lisp @@ -1,6 +1,6 @@ (use-package "SB-INT") -#-sb-thread (sb-ext:exit :code 104) ;; some of the symbols below disappear +#-sb-thread (invoke-restart 'run-tests::skip-file) ;; some of the symbols below disappear (import 'sb-thread::(avlnode-key avlnode-data avlnode-left avlnode-right avl-insert avl-delete avl-find From a03ba4bdb7658778cb5fe300639d1d56ed5ec685 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 30 Jun 2020 22:20:13 -0400 Subject: [PATCH 0166/4023] Remove legacy VALUE parameter of CALL-WITH-MUTEX It's been ill-advised to use it ever since about 12 years ago. Git rev 239125681c added the ERROR thing. --- src/code/thread.lisp | 27 ++++++++++++++++----------- src/compiler/fndb.lisp | 5 ++--- src/compiler/srctran.lisp | 18 ++++-------------- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 5dd8c67661..dcb702ee24 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -170,7 +170,7 @@ stale value, use MUTEX-OWNER instead." (barrier (:write))))) (exec))))))) -(defmacro with-mutex ((mutex &key (wait-p t) timeout value) +(defmacro with-mutex ((mutex &key (wait-p t) timeout (value nil valuep)) &body body) "Acquire MUTEX for the dynamic scope of BODY. If WAIT-P is true (the default), and the MUTEX is not immediately available, sleep until it is available. @@ -192,9 +192,20 @@ current thread." (call-with-mutex #'with-mutex-thunk ,mutex - ,value ,wait-p - ,timeout))) + ;; Users should not pass VALUE. If they do, the overhead of validity checking + ;; is at the call site so that normal invocations of CALL-WITH-MUTEX receive + ;; only the useful arguments. + ;; And as is true of so many macros, strict left-to-right evaluation of args + ;; is not promised, but let's try to be consistent with the order in the lambda list. + ;; (i.e. You don't know if the source form was ":value me :wait-p nil") + ,(if valuep + `(prog1 ,timeout + (let ((value ,value)) + (unless (or (null value) (eq *current-thread* value)) + (error "~S called with non-nil :VALUE that isn't the current thread." + 'with-mutex)))) + timeout)))) (defmacro with-recursive-lock ((mutex &key (wait-p t) timeout) &body body) "Acquire MUTEX for the dynamic scope of BODY. @@ -247,12 +258,9 @@ held mutex, WITH-RECURSIVE-LOCK allows recursive lock attempts to succeed." #-sb-thread (progn - (defun call-with-mutex (function mutex value waitp timeout) + (defun call-with-mutex (function mutex waitp timeout) (declare (ignore mutex waitp timeout) (function function)) - (unless (or (null value) (eq *current-thread* value)) - (error "~S called with non-nil :VALUE that isn't the current thread." - 'with-mutex)) (funcall function)) (defun call-with-recursive-lock (function mutex waitp timeout) @@ -267,12 +275,9 @@ held mutex, WITH-RECURSIVE-LOCK allows recursive lock attempts to succeed." #+sb-thread (progn - (defun call-with-mutex (function mutex value waitp timeout) + (defun call-with-mutex (function mutex waitp timeout) (declare (function function)) (declare (dynamic-extent function)) - (unless (or (null value) (eq *current-thread* value)) - (error "~S called with non-nil :VALUE that isn't the current thread." - 'with-mutex)) (let ((got-it nil)) (without-interrupts (unwind-protect diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index eef34ea36c..1066255b2a 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -2090,6 +2090,5 @@ *) #+sb-thread -(defknown sb-thread::call-with-recursive-lock (function t t t) *) -#+sb-thread -(defknown sb-thread::call-with-mutex (function t t t t) *) +(defknown (sb-thread::call-with-mutex sb-thread::call-with-recursive-lock) + (function t t t) *) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index d9b18fb129..b680fa564d 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -4989,7 +4989,8 @@ `(write-string object stream)) #+sb-thread -(defoptimizer (sb-thread::call-with-recursive-lock derive-type) ((function mutex waitp timeout)) +(progn +(defoptimizer (sb-thread::call-with-mutex derive-type) ((function mutex waitp timeout)) (declare (ignore mutex)) (let ((type (lvar-fun-type function))) (when (fun-type-p type) @@ -5002,19 +5003,8 @@ (values-specifier-type '(values null &optional))) (fun-type-returns type)))))) -#+sb-thread -(defoptimizer (sb-thread::call-with-mutex derive-type) ((function mutex value waitp timeout)) - (declare (ignore mutex value)) - (let ((type (lvar-fun-type function))) - (when (fun-type-p type) - (let ((null-p (not (and (constant-lvar-p waitp) - (lvar-value waitp) - (constant-lvar-p timeout) - (null (lvar-value timeout)))))) - (if null-p - (values-type-union (fun-type-returns type) - (values-specifier-type '(values null &optional))) - (fun-type-returns type)))))) +(setf (fun-info-derive-type (fun-info-or-lose 'sb-thread::call-with-recursive-lock)) + (fun-info-derive-type (fun-info-or-lose 'sb-thread::call-with-mutex)))) (deftransform pointerp ((object)) (let ((type (lvar-type object))) From 3b3aeb9987817797d1aa98d7b9137be80b722eff Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 1 Jul 2020 09:34:41 -0400 Subject: [PATCH 0167/4023] Shorten function prologue in CALL-WITH idiom The "user" function called by the builtin function always receives the proper args (typically 0 for a thunk), so avoid the arg-count check in the XEP even though it's not a local call. --- src/code/macros.lisp | 3 --- src/compiler/fndb.lisp | 13 +++++++++ src/compiler/fun-info.lisp | 2 ++ src/compiler/ir1final.lisp | 45 +++++++++++++++++++++++++++++++- src/compiler/ir2tran.lisp | 4 ++- tests/x86-64-codegen.impure.lisp | 13 +++++++++ 6 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 344313c0a6..1e692834df 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -1721,9 +1721,6 @@ symbol-case giving up: case=((V U) (F)) `(sb-c::%proclaim ',spec (sb-c:source-location))) specs))) -;; Avoid unknown return values in emitted code for PRINT-UNREADABLE-OBJECT -(sb-xc:proclaim '(ftype (sfunction (t t t &optional t) null) - %print-unreadable-object)) (sb-xc:defmacro print-unreadable-object ((object stream &key type identity) &body body) "Output OBJECT to STREAM with \"#<\" prefix, \">\" suffix, optionally diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 1066255b2a..d5090a2207 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -2089,6 +2089,19 @@ (t (function-designator () * :no-function-conversion t) &key (:dont-save t)) *) +(defknown (sb-impl::%with-standard-io-syntax + sb-impl::%with-rebound-io-syntax + sb-impl::call-with-sane-io-syntax) + (function) *) +(defknown sb-debug::funcall-with-debug-io-syntax (function &rest t) *) +(defknown sb-impl::%print-unreadable-object (t t t &optional function) null) + #+sb-thread +(progn (defknown (sb-thread::call-with-mutex sb-thread::call-with-recursive-lock) (function t t t) *) +(defknown (sb-thread::call-with-system-mutex + sb-thread::call-with-system-mutex/allow-with-interrupts + sb-thread::call-with-system-mutex/without-gcing + sb-thread::call-with-recursive-system-lock) + (function t) *)) diff --git a/src/compiler/fun-info.lisp b/src/compiler/fun-info.lisp index f63eb04bab..96200555a8 100644 --- a/src/compiler/fun-info.lisp +++ b/src/compiler/fun-info.lisp @@ -87,6 +87,8 @@ ;; as a consistency checking mechanism inside the compiler during IR2 ;; transformation. always-translatable + ;; Function's funarg can safely skip its argument count check. + callee-omit-arg-count-check ;; If a function is called with two arguments and the first one is a ;; constant, then the arguments will be swapped. commutative) diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index 4fc08e018d..ec9ae1be1f 100644 --- a/src/compiler/ir1final.lisp +++ b/src/compiler/ir1final.lisp @@ -194,6 +194,27 @@ (def-two-arg-funs (number number) >= <= /=) +;;; A list of function which always call their functional argument correctly, +;;; meaning that no arg-count-error can occur in the callee +;;; and therefore the callee can skip the check. +(dolist (fun '(sb-thread::call-with-mutex + sb-thread::call-with-recursive-lock + sb-thread::call-with-system-mutex + sb-thread::call-with-system-mutex/allow-with-interrupts + sb-thread::call-with-system-mutex/without-gcing + sb-thread::call-with-recursive-system-lock + ;; wish we had a little more commonality to these names + sb-impl::%with-standard-io-syntax + sb-impl::%with-rebound-io-syntax + sb-debug::funcall-with-debug-io-syntax + sb-impl::call-with-sane-io-syntax + ;; there are others, maybe %with-compilation-unit + sb-impl::%print-unreadable-object + )) + (let ((info (fun-info-or-lose fun))) + (setf (ir1-attributep (fun-info-attributes info) callee-omit-arg-count-check) + t))) + ;;; Convert function designators to functions in calls to known functions ;;; Also convert to TWO-ARG- variants (defun ir1-optimize-functional-arguments (component) @@ -201,6 +222,8 @@ (do-nodes (node nil block) (when (and (combination-p node) (eq (combination-kind node) :known) + ;; XXX: What kind of magic is this that REDUCE has to be excluded? + ;; Comment please! (neq (lvar-fun-name (combination-fun node) t) 'reduce)) (map-callable-arguments (lambda (lvar args results &key no-function-conversion &allow-other-keys) @@ -238,7 +261,27 @@ (change-ref-leaf ref replacement :recklessly t) (setf (node-derived-type cast) (lvar-derived-type (cast-value cast))))))))))))) - node))))) + node) + ;; One more thing: builtin higher-order functions utilized by builtin macros + ;; can impart a policy change to the callee, but it can't (easily) be done + ;; strictly lexically, because the policy would leak downward. + ;; e.g. (WITH-SOME-STUFF () ..) -> + ;; -> (DX-FLET ((THUNK () )) (CALL-WITH-STUFF #'THUNK)) + ;; should not inject (OPTIMIZE (VERIFY-ARG-COUNT 0)) at the top of + ;; because every lambda therein would omit the arg-count check. + (when (ir1-attributep (fun-info-attributes (combination-fun-info node)) + callee-omit-arg-count-check) + (let* ((args (combination-args node)) + (arg (if (eq (lvar-fun-name (combination-fun node) t) + 'sb-impl::%print-unreadable-object) + (fourth args) + (first args))) + (ref (and arg (lvar-uses arg)))) + (when (and (ref-p ref) (lambda-p (ref-leaf ref))) + ;; It seems impolite (un-debuggable too) to alter the lexenv-policy + ;; of functional-lexenv, so annotate this differently. + (setf (getf (functional-plist (ref-leaf ref)) 'verify-arg-count) + nil)))))))) (defun rewrite-full-call (combination) (let ((combination-name (lvar-fun-name (combination-fun combination) t)) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 02617e5c87..b86d06b326 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -1303,7 +1303,9 @@ ;;;; entering functions (defun xep-verify-arg-count (node block fun arg-count-location) - (when (policy fun (plusp verify-arg-count)) + (when (and (policy fun (plusp verify-arg-count)) + ;; this property will be absent in most cases + (getf (functional-plist fun) 'verify-arg-count t)) (let* ((ef (functional-entry-fun fun)) (optional (optional-dispatch-p ef)) (min (and optional diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 420a883c6c..e5bf543faa 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -766,3 +766,16 @@ sb-vm::(define-vop (cl-user::test) (with-test (:name :make-list-ridiculously-huge) (checked-compile '(lambda () (make-list 3826305079707827596)) :allow-warnings t)) + +(with-test (:name :with-foo-macro-elides-arg-count-trap) + (let ((lines + (split-string + (with-output-to-string (s) + (sb-c:dis '(lambda (m) (sb-thread:with-mutex (m) (eval 'f))) s)) + #\newline))) + ;; The outer lambda checks its arg count, but the lambda + ;; passed to call-with-mutex does not. + (assert (= (count-if (lambda (line) + (search "Invalid argument count trap" line)) + lines) + 1)))) From 30dd4d587b11f962b5d605289615951a5ff1052f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 1 Jul 2020 10:53:50 -0400 Subject: [PATCH 0168/4023] Use MUTEX-OWNER, not mutex-value The NEWS of SBCL 1.0.25 (11 years ago) said not to use mutex-value. --- contrib/sb-sprof/record.lisp | 2 +- tests/mutex.impure.lisp | 10 +++++----- tests/threads.impure.lisp | 32 ++++++++++++++++---------------- tests/threads.pure.lisp | 4 ++-- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/contrib/sb-sprof/record.lisp b/contrib/sb-sprof/record.lisp index 09a781e617..b39253faec 100644 --- a/contrib/sb-sprof/record.lisp +++ b/contrib/sb-sprof/record.lisp @@ -341,7 +341,7 @@ EXPERIMENTAL: Interface subject to change." (let ((lock *distribution-lock*)) ;; Don't flood the system with more interrupts if the last ;; set is still being delivered. - (unless (sb-thread:mutex-value lock) + (unless (sb-thread:mutex-owner lock) (sb-thread::with-system-mutex (lock) (dolist (thread (profiled-threads)) ;; This may occasionally fail to deliver the signal, but that diff --git a/tests/mutex.impure.lisp b/tests/mutex.impure.lisp index c825b69a4c..0e687edd05 100644 --- a/tests/mutex.impure.lisp +++ b/tests/mutex.impure.lisp @@ -11,8 +11,8 @@ (dotimes (i 100) (with-mutex (mutex) (sleep .03) - (assert (eql (mutex-value mutex) me))) - (assert (not (eql (mutex-value mutex) me)))) + (assert (eql (mutex-owner mutex) me))) + (assert (not (eql (mutex-owner mutex) me)))) (format t "done ~A~%" *current-thread*)))) (let ((kid1 (make-thread #'run)) (kid2 (make-thread #'run))) @@ -27,12 +27,12 @@ (setf child (test-interrupt (lambda () (with-mutex (lock) - (assert (eql (mutex-value lock) *current-thread*))) - (assert (not (eql (mutex-value lock) *current-thread*))) + (assert (eql (mutex-owner lock) *current-thread*))) + (assert (not (eql (mutex-owner lock) *current-thread*))) (sleep 10)))) ;;hold onto lock for long enough that child can't get it immediately (sleep 5) - (interrupt-thread child (lambda () (format t "l ~A~%" (mutex-value lock)))) + (interrupt-thread child (lambda () (format t "l ~A~%" (mutex-owner lock)))) (format t "parent releasing lock~%")) (process-all-interrupts child) (terminate-thread child) diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index aef3cded10..5d73794953 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -213,23 +213,23 @@ (with-test (:name (:mutex :basics)) (let ((l (make-mutex :name "foo")) (p *current-thread*)) - (assert (eql (mutex-value l) nil) nil "1") + (assert (eql (mutex-owner l) nil) nil "1") (grab-mutex l) - (assert (eql (mutex-value l) p) nil "3") + (assert (eql (mutex-owner l) p) nil "3") (release-mutex l) - (assert (eql (mutex-value l) nil) nil "5"))) + (assert (eql (mutex-owner l) nil) nil "5"))) (with-test (:name (with-recursive-lock :basics)) (labels ((ours-p (value) (eq *current-thread* value))) (let ((l (make-mutex :name "rec"))) - (assert (eql (mutex-value l) nil) nil "1") + (assert (eql (mutex-owner l) nil) nil "1") (with-recursive-lock (l) - (assert (ours-p (mutex-value l)) nil "3") + (assert (ours-p (mutex-owner l)) nil "3") (with-recursive-lock (l) - (assert (ours-p (mutex-value l)) nil "4")) - (assert (ours-p (mutex-value l)) nil "5")) - (assert (eql (mutex-value l) nil) nil "6")))) + (assert (ours-p (mutex-owner l)) nil "4")) + (assert (ours-p (mutex-owner l)) nil "5")) + (assert (eql (mutex-owner l) nil) nil "6")))) (with-test (:name (with-recursive-lock :wait-p)) (let ((m (make-mutex))) @@ -282,19 +282,19 @@ (n 0)) (labels ((in-new-thread () (with-mutex (lock) - (assert (eql (mutex-value lock) *current-thread*)) + (assert (eql (mutex-owner lock) *current-thread*)) (format t "~A got mutex~%" *current-thread*) ;; now drop it and sleep (condition-wait queue lock) ;; after waking we should have the lock again - (assert (eql (mutex-value lock) *current-thread*)) + (assert (eql (mutex-owner lock) *current-thread*)) (assert (eql n 1)) (decf n)))) (make-join-thread #'in-new-thread) (sleep 2) ; give it a chance to start ;; check the lock is free while it's asleep (format t "parent thread ~A~%" *current-thread*) - (assert (eql (mutex-value lock) nil)) + (assert (eql (mutex-owner lock) nil)) (with-mutex (lock) (incf n) (condition-notify queue)) @@ -307,18 +307,18 @@ (eq *current-thread* value)) (in-new-thread () (with-recursive-lock (lock) - (assert (ours-p (mutex-value lock))) - (format t "~A got mutex~%" (mutex-value lock)) + (assert (ours-p (mutex-owner lock))) + (format t "~A got mutex~%" (mutex-owner lock)) ;; now drop it and sleep (condition-wait queue lock) ;; after waking we should have the lock again - (format t "woken, ~A got mutex~%" (mutex-value lock)) - (assert (ours-p (mutex-value lock)))))) + (format t "woken, ~A got mutex~%" (mutex-owner lock)) + (assert (ours-p (mutex-owner lock)))))) (make-join-thread #'in-new-thread) (sleep 2) ; give it a chance to start ;; check the lock is free while it's asleep (format t "parent thread ~A~%" *current-thread*) - (assert (eql (mutex-value lock) nil)) + (assert (eql (mutex-owner lock) nil)) (with-recursive-lock (lock) (condition-notify queue)) (sleep 1)))) diff --git a/tests/threads.pure.lisp b/tests/threads.pure.lisp index b45eeebbad..f8ae24c62a 100644 --- a/tests/threads.pure.lisp +++ b/tests/threads.pure.lisp @@ -29,10 +29,10 @@ ;; Make sure basics are sane on unithreaded ports as well (let ((mutex (make-mutex))) (grab-mutex mutex) - (assert (eq *current-thread* (mutex-value mutex))) + (assert (eq *current-thread* (mutex-owner mutex))) (handler-bind ((warning #'error)) (release-mutex mutex)) - (assert (not (mutex-value mutex))))) + (assert (not (mutex-owner mutex))))) ;;; Terminating a thread that's waiting for the terminal. From 61b36a846982cf7c8d101bed2414c7afce4afa39 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 1 Jul 2020 11:36:18 -0400 Subject: [PATCH 0169/4023] Fix #-sb-thread --- src/compiler/fndb.lisp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index d5090a2207..a61fe8df3f 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -2096,12 +2096,10 @@ (defknown sb-debug::funcall-with-debug-io-syntax (function &rest t) *) (defknown sb-impl::%print-unreadable-object (t t t &optional function) null) -#+sb-thread -(progn (defknown (sb-thread::call-with-mutex sb-thread::call-with-recursive-lock) (function t t t) *) (defknown (sb-thread::call-with-system-mutex sb-thread::call-with-system-mutex/allow-with-interrupts sb-thread::call-with-system-mutex/without-gcing sb-thread::call-with-recursive-system-lock) - (function t) *)) + (function t) *) From f76f49e25729e697df1d95ae3b378866110be142 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 1 Jul 2020 19:47:44 +0300 Subject: [PATCH 0170/4023] ir1final: Ignore missing known functions on -sb-thread. --- src/compiler/ir1final.lisp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index ec9ae1be1f..f64d6ff71c 100644 --- a/src/compiler/ir1final.lisp +++ b/src/compiler/ir1final.lisp @@ -211,9 +211,10 @@ ;; there are others, maybe %with-compilation-unit sb-impl::%print-unreadable-object )) - (let ((info (fun-info-or-lose fun))) - (setf (ir1-attributep (fun-info-attributes info) callee-omit-arg-count-check) - t))) + (let ((info (info :function :info fun))) + (when info + (setf (ir1-attributep (fun-info-attributes info) callee-omit-arg-count-check) + t)))) ;;; Convert function designators to functions in calls to known functions ;;; Also convert to TWO-ARG- variants @@ -222,8 +223,7 @@ (do-nodes (node nil block) (when (and (combination-p node) (eq (combination-kind node) :known) - ;; XXX: What kind of magic is this that REDUCE has to be excluded? - ;; Comment please! + ;; REDUCE can call with zero arguments. (neq (lvar-fun-name (combination-fun node) t) 'reduce)) (map-callable-arguments (lambda (lvar args results &key no-function-conversion &allow-other-keys) From e8a7f0e2903b97a9aebd1b7f2a5b7e1005332ca8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 1 Jul 2020 19:50:44 +0300 Subject: [PATCH 0171/4023] Can #+sb-thread again some defknowns. --- src/compiler/fndb.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index a61fe8df3f..d5090a2207 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -2096,10 +2096,12 @@ (defknown sb-debug::funcall-with-debug-io-syntax (function &rest t) *) (defknown sb-impl::%print-unreadable-object (t t t &optional function) null) +#+sb-thread +(progn (defknown (sb-thread::call-with-mutex sb-thread::call-with-recursive-lock) (function t t t) *) (defknown (sb-thread::call-with-system-mutex sb-thread::call-with-system-mutex/allow-with-interrupts sb-thread::call-with-system-mutex/without-gcing sb-thread::call-with-recursive-system-lock) - (function t) *) + (function t) *)) From aefc50cccf7364f6abbcc43338d133ab710d782f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 1 Jul 2020 12:52:48 -0400 Subject: [PATCH 0172/4023] Enforce safe use of THREAD-OS-THREAD Fix the ultra-bogus code in sb-sprof, which had these flaws if not more: - "WHEN OS-THREAD" was tautologically true because the slot type was changed from (OR INTEGER NULL) to WORD in git rev 7d5dcce3. - "This may occasionally fail to deliver the signal" totally misses the point that an obsolete thread ID can crash, just like any wild pointer can. - Even the comment was wrong: kill_thread_safely() was removed 11 years ago in git rev 85e1967527. Also, change thread-primitive-thread to a SAP since most places want that. --- contrib/sb-sprof/record.lisp | 15 ++---- src/code/target-thread.lisp | 91 +++++++++++++++++++++--------------- src/code/thread.lisp | 4 +- src/code/traceroot.lisp | 4 +- tests/signals.impure.lisp | 11 +++-- 5 files changed, 68 insertions(+), 57 deletions(-) diff --git a/contrib/sb-sprof/record.lisp b/contrib/sb-sprof/record.lisp index b39253faec..76888791f2 100644 --- a/contrib/sb-sprof/record.lisp +++ b/contrib/sb-sprof/record.lisp @@ -312,6 +312,8 @@ EXPERIMENTAL: Interface subject to change." (let ((profiled-threads *profiled-threads*)) (remove *timer-thread* (if (eq :all profiled-threads) + ;; FIXME: inefficient, probably memoize on a best-effort basis: + ;; detect whether the tree has changed, and recompute only if it did. (sb-thread:list-all-threads) profiled-threads)))) @@ -327,11 +329,6 @@ EXPERIMENTAL: Interface subject to change." (defvar *profiler-lock* (sb-thread:make-mutex :name "Statistical Profiler")) (defvar *distribution-lock* (sb-thread:make-mutex :name "Wallclock profiling lock")) - #+sb-thread - (declaim (inline pthread-kill)) - #+sb-thread - (define-alien-routine pthread-kill int (os-thread unsigned-long) (signal int)) - ;;; A random thread will call this in response to either a timer firing, ;;; This in turn will distribute the notice to those threads we are ;;; interested using SIGPROF. @@ -344,12 +341,8 @@ EXPERIMENTAL: Interface subject to change." (unless (sb-thread:mutex-owner lock) (sb-thread::with-system-mutex (lock) (dolist (thread (profiled-threads)) - ;; This may occasionally fail to deliver the signal, but that - ;; seems better then using kill_thread_safely with it's 1 - ;; second backoff. - (let ((os-thread (sb-thread::thread-os-thread thread))) - (when os-thread - (pthread-kill os-thread sb-unix:sigprof))))))) + (sb-thread:with-os-thread (os-thread thread) + (sb-thread::pthread-kill os-thread sb-unix:sigprof)))))) #-sb-thread (unix-kill 0 sb-unix:sigprof)) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index b3bcd6c076..c53d5db0a8 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -19,6 +19,7 @@ raise release-spinlock spinlock + with-os-thread with-session-lock with-spinlock)) @@ -259,13 +260,6 @@ created and old ones may exit at any time." #-sb-thread (int-sap 0)) -(declaim (inline current-thread-os-thread)) -(defun current-thread-os-thread () - #+sb-thread - (sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)) - #-sb-thread - 0) - (sb-ext:define-load-time-global *initial-thread* nil) (sb-ext:define-load-time-global *make-thread-lock* nil) @@ -286,9 +280,8 @@ created and old ones may exit at any time." ;; Run the macro-generated function which writes some values into the TLS, ;; most especially *CURRENT-THREAD*. (init-thread-local-storage thread) - (setf (thread-os-thread thread) (current-thread-os-thread) - (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) - (thread-primitive-thread thread) (sap-int (current-thread-sap)) + (setf (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) + (thread-primitive-thread thread) (current-thread-sap) *initial-thread* thread) (grab-mutex (thread-result-lock thread)) ;; Either *all-threads* is empty or it contains exactly one thread @@ -1384,7 +1377,11 @@ on this semaphore, then N of them is woken up." (%delete-thread-from-session thread *session*)) (with-interruptions-lock (thread) (setf (thread-%alive-p thread) nil) - (setf (thread-os-thread thread) sb-ext:most-positive-word)) + ;; The memory range can exist without a pthread running yet, but the pthread + ;; can't exist without the memory range. By clobbering this SAP here, + ;; it is safe to manipulate the memory and/or the pthread from another thread + ;; that acquires the interruptions lock if the SAP reads as nonzero. + (setf (thread-primitive-thread thread) (int-sap 0))) (sb-thread:barrier (:read)) (let ((old *all-threads*)) (loop @@ -1575,9 +1572,8 @@ session." ;;; All threads other than the initial thread start via this function. #+sb-thread (defun new-lisp-thread-trampoline (thread setup-sem real-function arguments) - (setf (thread-os-thread thread) (current-thread-os-thread) - (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) - (thread-primitive-thread thread) (sap-int (current-thread-sap))) + (setf (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) + (thread-primitive-thread thread) (current-thread-sap)) ;; *ALLOC-SIGNAL* is made thread-local by create_thread_struct() ;; so this assigns into TLS, not the global value. (setf sb-vm:*alloc-signal* *default-alloc-signal*) @@ -1790,7 +1786,7 @@ subject to change." (defmacro raise (signal) `(alien-funcall (extern-alien "raise" (function int int)) ,signal)) -;;; A macro, because the OS-THREAD slot holds a WORD which could cause boxing if passed +;;; A macro, because OS-THREAD is a WORD which could cause boxing if passed ;;; to a function. (defmacro pthread-kill (os-thread signal) (declare (ignorable os-thread)) @@ -1846,6 +1842,24 @@ subject to change." ;; -- DFL (setf *thruption-pending* t))))) +;;; A macro to extract the pthread id out of the thread's C memory +;;; while ensuring that the thread can't exit. +;;; Invokes BODY only if the pthread ID is valid. +(defmacro with-os-thread ((os-thread thread) &body body) + #+sb-thread + `(let ((lisp-thread ,thread)) + (with-interruptions-lock (lisp-thread) + (let ((memory (thread-primitive-thread lisp-thread))) + (when (/= (sap-int memory) 0) + (let ((,os-thread (sap-ref-word memory + (ash sb-vm::thread-os-thread-slot + sb-vm:word-shift)))) + ,@body))))) + #-sb-thread + `(let ((lisp-thread ,thread) (,os-thread 0)) + (declare (ignorable lisp-thread ,os-thread)) + ,@body)) + (defun interrupt-thread (thread function) (declare (ignorable thread)) "Interrupt THREAD and make it run FUNCTION. @@ -1926,20 +1940,22 @@ Short version: be careful out there." ;; that lock just prior to exit. #-(or sb-safepoint sb-thruption) ; Good way - (unless (with-interruptions-lock (thread) - (let ((os-thread (thread-os-thread thread))) - (unless (= os-thread sb-ext:most-positive-word) - (enqueue nil) - (pthread-kill os-thread sb-unix:sigpipe) - t))) + (unless (with-os-thread (os-thread thread) + (enqueue nil) + (pthread-kill os-thread sb-unix:sigpipe) + t) (error 'interrupt-thread-error :thread thread)) ;; Shiat way: call to C to acquire the all_threads lock and scan all_threads. ;; Beyond that there's the question of why INVOKED is ever set/examined. Seems fubar. ;; I have no friggin idea how sb-thruption is supposed to work. #+(or sb-safepoint sb-thruption) - (let ((os-thread (thread-os-thread thread))) - (cond ((= os-thread (ldb (byte sb-vm:n-word-bits 0) -1)) + (let ((os-thread + ;; This causes an extra acquire/release cycle, and potentially conses a bignum + ;; to hold a word. + ;; Anybody who builds with these features should feel free to improve it. + (with-os-thread (os-thread thread) os-thread))) + (cond ((not os-thread) (error 'interrupt-thread-error :thread thread)) (t (let (invoked) @@ -2002,17 +2018,20 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." ;;; with an SBCL developer first, or are doing something that you ;;; should probably discuss with a professional psychiatrist first #+sb-thread -(progn +(macrolet ((with-thread-memory ((var) &body body) + ;; Prevent the thread from dying completely while we look at the TLS + ;; area... + ;; Liveness per se is not important, but rather whether the memory exists. + `(with-interruptions-lock (thread) + (let ((,var (thread-primitive-thread thread))) + ,@body)))) (sb-ext:define-load-time-global sb-vm::*free-tls-index* 0) (defun %symbol-value-in-thread (symbol thread) - ;; Prevent the thread from dying completely while we look for the TLS - ;; area... - (with-interruptions-lock (thread) - (if (thread-alive-p thread) - (let ((val (sap-ref-lispobj (int-sap (thread-primitive-thread thread)) - (symbol-tls-index symbol)))) + (with-thread-memory (sap) + (if (/= (sap-int sap) 0) + (let ((val (sap-ref-lispobj sap (symbol-tls-index symbol)))) (case (get-lisp-obj-address val) (#.sb-vm:no-tls-value-marker-widetag (values nil :no-tls-value)) (#.sb-vm:unbound-marker-widetag (values nil :unbound-in-thread)) @@ -2020,17 +2039,13 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (values nil :thread-dead)))) (defun %set-symbol-value-in-thread (symbol thread value) - ;; Prevent the thread from dying completely while we look for the TLS - ;; area... - (with-interruptions-lock (thread) - (if (thread-alive-p thread) + (with-thread-memory (sap) + (if (/= (sap-int sap) 0) (let ((offset (symbol-tls-index symbol))) (cond ((zerop offset) (values nil :no-tls-value)) (t - (setf (sap-ref-lispobj (int-sap (thread-primitive-thread thread)) - offset) - value) + (setf (sap-ref-lispobj sap offset) value) (values value :ok)))) (values nil :thread-dead)))) @@ -2048,7 +2063,7 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." sb-vm:n-word-bytes) (- index sb-vm:n-word-bytes)) ;; (There's no reason this couldn't work on any thread now.) - (sap (int-sap (thread-primitive-thread *current-thread*))) + (sap (thread-primitive-thread *current-thread*)) (list)) ((< index (ash sb-vm::primitive-thread-object-length sb-vm:word-shift)) list) diff --git a/src/code/thread.lisp b/src/code/thread.lisp index dcb702ee24..154e1f9932 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -33,8 +33,6 @@ in future versions." (name nil :type (or null simple-string)) ; C code could read this (%alive-p nil :type boolean) (%ephemeral-p nil :type boolean :read-only t) - ;; 0 is used on thread-less builds - (os-thread (ldb (byte sb-vm:n-word-bits 0) -1) :type sb-vm:word) ;; Keep a copy of CONTROL-STACK-END from the "primitive" thread (C memory). ;; Reading that memory for any thread except *CURRENT-THREAD* is not safe ;; due to possible unmapping on thread death. Technically this is a fixed amount @@ -42,7 +40,7 @@ in future versions." (stack-end 0 :type sb-vm:word) ;; Points to the SB-VM::THREAD primitive object. ;; Yes, there are three different thread structures. - (primitive-thread 0 :type sb-vm:word) + (primitive-thread (int-sap 0) :type system-area-pointer) (interruptions nil :type list) ;; Gotta have half a dozen or more different ways to identify a thread. #+linux (os-tid 0 :type (unsigned-byte 32)) diff --git a/src/code/traceroot.lisp b/src/code/traceroot.lisp index f5d3b5fcb9..95014f9b3e 100644 --- a/src/code/traceroot.lisp +++ b/src/code/traceroot.lisp @@ -35,10 +35,12 @@ 0) (defun find-lisp-thread-from-thread-struct (addr) + (declare (type sb-ext:word addr)) ;; It is of course possible to do this without consing the list ;; of all threads, but I don't care. + ;; Actually, why doesn't we make it correctly use the AVL tree? (dolist (thread (sb-thread:list-all-threads)) - (when (= (sb-thread::thread-primitive-thread thread) addr) + (when (sap= (sb-thread::thread-primitive-thread thread) (int-sap addr)) (return thread)))) ;;; Convert each path to (TARGET . NODES) diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index 7e0332c58b..50eb48f644 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -68,6 +68,11 @@ int (sb-thread::os-thread unsigned) (signal int)) +(defun current-thread-os-thread () + #+sb-thread + (sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)) + #-sb-thread + 0) ;; It is desirable to support C-c on Windows, but SIGINT ;; is not the mechanism to use on this platform. @@ -78,10 +83,8 @@ (progn ;; KILL-SAFELY has C code for it only if (OR :SB-SAFEPOINT :SB-THRUPTION), ;; otherwise we directly call a POSIX function. - #+(or sb-safepoint sb-thruption) - (kill-safely - (sb-thread::thread-os-thread sb-thread::*current-thread*) - sb-unix:sigint) + #+(or sb-safepoint sb-thruption) (kill-safely (current-thread-os-thread) + sb-unix:sigint) #-(or sb-safepoint sb-thruption) (sb-thread::raise sb-unix:sigint) #+sb-safepoint-strictly ;; In this case, the signals handler gets invoked From f95b4bac7a39c2900f8aad3697a9c68dbdf7eaff Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 1 Jul 2020 13:48:19 -0400 Subject: [PATCH 0173/4023] Fix test --- tests/signals.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index 50eb48f644..eefea7c490 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -70,7 +70,7 @@ (signal int)) (defun current-thread-os-thread () #+sb-thread - (sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)) + (sb-sys:sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)) #-sb-thread 0) From e3a5d10f31b42f638380d62b62fbb0a412cd42c7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 1 Jul 2020 15:04:02 -0400 Subject: [PATCH 0174/4023] Tidy up some make-thread junk * Remove %alive-p, it's redundant information now * De-keywordify %make-thread * Coerce the arguments in make-thread, not run-thread --- src/code/target-thread.lisp | 29 ++++++++++++++--------------- src/code/thread.lisp | 18 ++++++++++++------ src/code/traceroot.lisp | 5 +++-- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index c53d5db0a8..c4800c3506 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -274,8 +274,7 @@ created and old ones may exit at any time." ;;; the global mutexes but not all of them? (setf sb-impl::*exit-lock* (make-mutex :name "Exit Lock") *make-thread-lock* (make-mutex :name "Make-Thread Lock")) - (let ((thread (%make-thread :name "main thread" - :%alive-p t))) + (let ((thread (%make-thread "main thread" nil))) #+linux (setf (thread-os-tid thread) (sb-gettid)) ;; Run the macro-generated function which writes some values into the TLS, ;; most especially *CURRENT-THREAD*. @@ -1376,12 +1375,12 @@ on this semaphore, then N of them is woken up." (when *session* (%delete-thread-from-session thread *session*)) (with-interruptions-lock (thread) - (setf (thread-%alive-p thread) nil) ;; The memory range can exist without a pthread running yet, but the pthread ;; can't exist without the memory range. By clobbering this SAP here, ;; it is safe to manipulate the memory and/or the pthread from another thread ;; that acquires the interruptions lock if the SAP reads as nonzero. - (setf (thread-primitive-thread thread) (int-sap 0))) + ;; Doing this also makes THREAD-ALIVE-P return false hereafter. + (setf (thread-primitive-thread thread) nil)) (sb-thread:barrier (:read)) (let ((old *all-threads*)) (loop @@ -1593,7 +1592,6 @@ session." (with-session-lock (session) (setf (cdr session-cons) (session-threads session) (session-threads session) session-cons))) - (setf (thread-%alive-p thread) t) (when setup-sem (signal-semaphore setup-sem) @@ -1663,16 +1661,18 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (arguments) "Argument passed to ~S, ~S, is an improper list." 'make-thread arguments) - (run-thread (%make-thread :name name) function arguments))) + (run-thread (%make-thread name nil) + (coerce function 'function) + (ensure-list arguments)))) ;;; System-internal use only #+sb-thread (defun make-ephemeral-thread (name function arguments) - (run-thread (%make-thread :name name :%ephemeral-p t) function arguments)) + (run-thread (%make-thread name t) function arguments)) ;;; The purpose of splitting out RUN-THREAD from MAKE-THREAD is that when ;;; starting the finalizer thread, we might be able to do: -;;; (let ((thread (%make-thread :name "finalizer" :%ephemeral-p t))) +;;; (let ((thread (%make-thread "finalizer" t))) ;;; (when (cas *finalizer-thread* nil thread) ;;; (run-thread thread ...) ;;; which is possibly an improvement in two ways: @@ -1697,8 +1697,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." make-waitqueue make-mutex)) (let* ((setup-sem (make-semaphore :name "Thread setup semaphore")) - (real-function (coerce function 'function)) - (arguments (ensure-list arguments)) #+(or win32 darwin) (fp-modes (dpb 0 sb-vm:float-sticky-bits ;; clear accrued bits (sb-vm:floating-point-modes)))) @@ -1711,7 +1709,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; ready to run GC. Be careful. (init-thread-local-storage thread) (new-lisp-thread-trampoline thread setup-sem - real-function arguments))) + function arguments))) ;; Holding mutexes or waiting on sempahores inside WITHOUT-GCING will lock up (aver (not *gc-inhibit*)) ;; Keep INITIAL-FUNCTION in the dynamic extent until the child @@ -1850,7 +1848,7 @@ subject to change." `(let ((lisp-thread ,thread)) (with-interruptions-lock (lisp-thread) (let ((memory (thread-primitive-thread lisp-thread))) - (when (/= (sap-int memory) 0) + (when memory (let ((,os-thread (sap-ref-word memory (ash sb-vm::thread-os-thread-slot sb-vm:word-shift)))) @@ -2030,7 +2028,7 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (defun %symbol-value-in-thread (symbol thread) (with-thread-memory (sap) - (if (/= (sap-int sap) 0) + (if sap (let ((val (sap-ref-lispobj sap (symbol-tls-index symbol)))) (case (get-lisp-obj-address val) (#.sb-vm:no-tls-value-marker-widetag (values nil :no-tls-value)) @@ -2040,7 +2038,7 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (defun %set-symbol-value-in-thread (symbol thread value) (with-thread-memory (sap) - (if (/= (sap-int sap) 0) + (if sap (let ((offset (symbol-tls-index symbol))) (cond ((zerop offset) (values nil :no-tls-value)) @@ -2063,7 +2061,8 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." sb-vm:n-word-bytes) (- index sb-vm:n-word-bytes)) ;; (There's no reason this couldn't work on any thread now.) - (sap (thread-primitive-thread *current-thread*)) + (sap (the system-area-pointer + (thread-primitive-thread *current-thread*))) (list)) ((< index (ash sb-vm::primitive-thread-object-length sb-vm:word-shift)) list) diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 154e1f9932..d76f90c441 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -26,21 +26,27 @@ (name nil :type (or null simple-string)) (%owner nil :type (or null thread))) -(defstruct (thread (:constructor %make-thread (&key name %alive-p %ephemeral-p)) +(defstruct (thread (:constructor %make-thread (name %ephemeral-p)) (:copier nil)) "Thread type. Do not rely on threads being structs as it may change in future versions." (name nil :type (or null simple-string)) ; C code could read this - (%alive-p nil :type boolean) (%ephemeral-p nil :type boolean :read-only t) ;; Keep a copy of CONTROL-STACK-END from the "primitive" thread (C memory). ;; Reading that memory for any thread except *CURRENT-THREAD* is not safe ;; due to possible unmapping on thread death. Technically this is a fixed amount ;; below PRIMITIVE-THREAD, but the exact offset varies by build configuration. (stack-end 0 :type sb-vm:word) - ;; Points to the SB-VM::THREAD primitive object. - ;; Yes, there are three different thread structures. - (primitive-thread (int-sap 0) :type system-area-pointer) + ;; This is one of a few different views of a lisp thread: + ;; 1. the memory space (thread->os_addr in C) + ;; 2. 'struct thread' at some offset into the memory space, coinciding + ;; with the SB-VM::THREAD primitive object + ;; 3. a pthread, which may reside anywhere, possibly the high end of the lisp stack + ;; (above the SP given to your entrypoint), whatever the pthread library chooses. + ;; 4. the THREAD instance (this structure) + ;; This value is NIL if the thread is not considered alive, though the pthread + ;; may be running its termination code (unlinking from all_threads etc) + (primitive-thread nil :type (or null system-area-pointer)) (interruptions nil :type list) ;; Gotta have half a dozen or more different ways to identify a thread. #+linux (os-tid 0 :type (unsigned-byte 32)) @@ -59,7 +65,7 @@ in future versions." "Return T if THREAD is still alive. Note that the return value is potentially stale even before the function returns, as the thread may exit at any time." - (thread-%alive-p thread)) + (not (null (thread-primitive-thread thread)))) (sb-impl::define-thread-local *current-thread* ;; This initform is magical - DEFINE-THREAD-LOCAL stuffs the initial diff --git a/src/code/traceroot.lisp b/src/code/traceroot.lisp index 95014f9b3e..c86d5b3d5f 100644 --- a/src/code/traceroot.lisp +++ b/src/code/traceroot.lisp @@ -40,8 +40,9 @@ ;; of all threads, but I don't care. ;; Actually, why doesn't we make it correctly use the AVL tree? (dolist (thread (sb-thread:list-all-threads)) - (when (sap= (sb-thread::thread-primitive-thread thread) (int-sap addr)) - (return thread)))) + (let ((sap (sb-thread::thread-primitive-thread thread))) + (when (and sap (sap= sap (int-sap addr))) + (return thread))))) ;;; Convert each path to (TARGET . NODES) ;;; where the first node in NODES is one of: From 370f4f7126d12dfd579962b8400542c8670e1a60 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 1 Jul 2020 22:39:32 +0300 Subject: [PATCH 0175/4023] Skip a test. --- tests/x86-64-codegen.impure.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index e5bf543faa..45341378ec 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -767,7 +767,8 @@ sb-vm::(define-vop (cl-user::test) (checked-compile '(lambda () (make-list 3826305079707827596)) :allow-warnings t)) -(with-test (:name :with-foo-macro-elides-arg-count-trap) +(with-test (:name :with-foo-macro-elides-arg-count-trap + :skipped-on (not :sb-thread)) (let ((lines (split-string (with-output-to-string (s) From c7ceb8fc7f133b42ee3cda790bc0930eabeee905 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 1 Jul 2020 21:31:00 -0400 Subject: [PATCH 0176/4023] Trivial rename because "initial_thread_trampoline" always made me think it was the primary stage of the 2-stage C + lisp trampoline for any thread. --- src/runtime/runtime.c | 2 +- src/runtime/thread.c | 7 +++---- src/runtime/thread.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 0aa450d903..8f21874ce6 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -725,7 +725,7 @@ sbcl_main(int argc, char *argv[], char *envp[]) FSHOW((stderr, "/funcalling initial_function=0x%lx\n", (unsigned long)initial_function)); - create_initial_thread(initial_function); + create_main_lisp_thread(initial_function); lose("unexpected return from initial thread in main()"); return 0; } diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 4a1b4f047a..74e1fe8838 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -188,8 +188,7 @@ wait_for_thread_state_change(struct thread *thread, lispobj state) #endif /* sb-safepoint */ #endif /* sb-thread */ -static int -initial_thread_trampoline(struct thread *th) +static int main_thread_trampoline(struct thread *th) { lispobj function; #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) @@ -859,13 +858,13 @@ create_thread_struct(lispobj start_routine) { return th; } -void create_initial_thread(lispobj initial_function) { +void create_main_lisp_thread(lispobj initial_function) { struct thread *th = create_thread_struct(initial_function); #if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) pthread_key_create(&lisp_thread, 0); #endif if(th) { - initial_thread_trampoline(th); /* no return */ + main_thread_trampoline(th); /* no return */ } else lose("can't create initial thread"); } diff --git a/src/runtime/thread.h b/src/runtime/thread.h index bcd852c3ef..dea94f12e9 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -374,7 +374,7 @@ void signal_handler_callback(lispobj, int, void *, void *); #endif -extern void create_initial_thread(lispobj); +extern void create_main_lisp_thread(lispobj); #ifdef LISP_FEATURE_SB_THREAD extern pthread_mutex_t all_threads_lock; From add3a5689115b8a6482c32ba9e2c4efed24f86ce Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 1 Jul 2020 21:36:42 -0400 Subject: [PATCH 0177/4023] Test a different macro --- tests/x86-64-codegen.impure.lisp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 45341378ec..ed866aa4e1 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -767,12 +767,11 @@ sb-vm::(define-vop (cl-user::test) (checked-compile '(lambda () (make-list 3826305079707827596)) :allow-warnings t)) -(with-test (:name :with-foo-macro-elides-arg-count-trap - :skipped-on (not :sb-thread)) +(with-test (:name :with-foo-macro-elides-arg-count-trap) (let ((lines (split-string (with-output-to-string (s) - (sb-c:dis '(lambda (m) (sb-thread:with-mutex (m) (eval 'f))) s)) + (sb-c:dis '(lambda (x) (with-standard-io-syntax (eval x))) s)) #\newline))) ;; The outer lambda checks its arg count, but the lambda ;; passed to call-with-mutex does not. From 8bd38fe7890198e170eb26db7aad2f4b846c4d45 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 2 Jul 2020 16:15:24 +0300 Subject: [PATCH 0178/4023] Deprecate SB-PCL: exports. --- package-data-list.lisp-expr | 94 +-------------------------------- src/code/reader.lisp | 3 ++ src/code/target-extensions.lisp | 17 ++++++ src/pcl/fixup.lisp | 43 +++++++++++++++ 4 files changed, 64 insertions(+), 93 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index c2626877e2..852fdb6bc2 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2690,99 +2690,7 @@ package is deprecated in favour of SB-MOP." "ILLEGAL-CLASS-NAME-ERROR" "CLASS-NOT-FOUND-ERROR" - "SPECIALIZER-NAME-SYNTAX-ERROR") - ;; FIXME: After a little while, these reexports can probably go - ;; away, as they're superseded by the use of SB-MOP as the - ;; publically-accessible package. - :reexport ( ;; CL symbols - "ADD-METHOD" - "ALLOCATE-INSTANCE" - "CLASS-NAME" "COMPUTE-APPLICABLE-METHODS" - "ENSURE-GENERIC-FUNCTION" "MAKE-INSTANCE" - "METHOD-QUALIFIERS" "REMOVE-METHOD" - ;; MOP symbols - "ADD-DEPENDENT" - "ADD-DIRECT-METHOD" - "ADD-DIRECT-SUBCLASS" - "CLASS-DEFAULT-INITARGS" - "CLASS-DIRECT-DEFAULT-INITARGS" - "CLASS-DIRECT-SLOTS" - "CLASS-DIRECT-SUBCLASSES" - "CLASS-DIRECT-SUPERCLASSES" - "CLASS-FINALIZED-P" - "CLASS-PRECEDENCE-LIST" - "CLASS-PROTOTYPE" - "CLASS-SLOTS" - "COMPUTE-APPLICABLE-METHODS-USING-CLASSES" - "COMPUTE-CLASS-PRECEDENCE-LIST" - "COMPUTE-DEFAULT-INITARGS" - "COMPUTE-DISCRIMINATING-FUNCTION" - "COMPUTE-EFFECTIVE-METHOD" - "COMPUTE-EFFECTIVE-SLOT-DEFINITION" - "COMPUTE-SLOTS" - "DIRECT-SLOT-DEFINITION" - "DIRECT-SLOT-DEFINITION-CLASS" - "EFFECTIVE-SLOT-DEFINITION" - "EFFECTIVE-SLOT-DEFINITION-CLASS" - "ENSURE-CLASS" - "ENSURE-CLASS-USING-CLASS" - "ENSURE-GENERIC-FUNCTION-USING-CLASS" - "EQL-SPECIALIZER" - "EQL-SPECIALIZER-OBJECT" - "EXTRACT-LAMBDA-LIST" - "EXTRACT-SPECIALIZER-NAMES" - "FINALIZE-INHERITANCE" - "FIND-METHOD-COMBINATION" - "FORWARD-REFERENCED-CLASS" - "FUNCALLABLE-STANDARD-CLASS" - "FUNCALLABLE-STANDARD-INSTANCE-ACCESS" - "FUNCALLABLE-STANDARD-OBJECT" - "GENERIC-FUNCTION-ARGUMENT-PRECEDENCE-ORDER" - "GENERIC-FUNCTION-DECLARATIONS" - "GENERIC-FUNCTION-LAMBDA-LIST" - "GENERIC-FUNCTION-METHOD-CLASS" - "GENERIC-FUNCTION-METHOD-COMBINATION" - "GENERIC-FUNCTION-METHODS" - "GENERIC-FUNCTION-NAME" - "INTERN-EQL-SPECIALIZER" - "MAKE-METHOD-LAMBDA" - "MAP-DEPENDENTS" - "METHOD-FUNCTION" - "METHOD-GENERIC-FUNCTION" - "METHOD-LAMBDA-LIST" - "METHOD-SPECIALIZERS" - "ACCESSOR-METHOD-SLOT-DEFINITION" - "READER-METHOD-CLASS" - "REMOVE-DEPENDENT" - "REMOVE-DIRECT-METHOD" - "REMOVE-DIRECT-SUBCLASS" - "SET-FUNCALLABLE-INSTANCE-FUNCTION" - "SLOT-BOUNDP-USING-CLASS" - "SLOT-DEFINITION" - "SLOT-DEFINITION-ALLOCATION" - "SLOT-DEFINITION-INITARGS" - "SLOT-DEFINITION-INITFORM" - "SLOT-DEFINITION-INITFUNCTION" - "SLOT-DEFINITION-LOCATION" - "SLOT-DEFINITION-NAME" - "SLOT-DEFINITION-READERS" - "SLOT-DEFINITION-WRITERS" - "SLOT-DEFINITION-TYPE" - "SLOT-MAKUNBOUND-USING-CLASS" - "SLOT-VALUE-USING-CLASS" - "SPECIALIZER" - "SPECIALIZER-DIRECT-GENERIC-FUNCTIONS" - "SPECIALIZER-DIRECT-METHODS" - "STANDARD-ACCESSOR-METHOD" - "STANDARD-DIRECT-SLOT-DEFINITION" - "STANDARD-EFFECTIVE-SLOT-DEFINITION" - "STANDARD-INSTANCE-ACCESS" - "STANDARD-READER-METHOD" - "STANDARD-SLOT-DEFINITION" - "STANDARD-WRITER-METHOD" - "UPDATE-DEPENDENT" - "VALIDATE-SUPERCLASS" - "WRITER-METHOD-CLASS")) + "SPECIALIZER-NAME-SYNTAX-ERROR")) #s(sb-cold:package-data :name "SB-PRETTY" diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 8a581baeeb..d71cf1db0e 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -1594,6 +1594,9 @@ extended :: syntax." (multiple-value-bind (symbol accessibility) (%find-symbol (token-buf-string buf) (token-buf-fill-ptr buf) pkg) (when (eq accessibility :external) (return symbol)) + (when (and accessibility + (check-deprecated-export pkg symbol)) + (return symbol)) (with-simple-restart (continue "Use symbol anyway.") (error 'simple-reader-package-error :package pkg diff --git a/src/code/target-extensions.lisp b/src/code/target-extensions.lisp index 2e084bfa83..7e010303e0 100644 --- a/src/code/target-extensions.lisp +++ b/src/code/target-extensions.lisp @@ -281,3 +281,20 @@ unspecified." `(defvar ,name ,@(when valuep (list value)))) ((:final) `',name)))) + +(define-load-time-global *deprecated-exports* nil) + +(defun deprecate-export (package symbol state version) + (declare (type deprecation-state state) + (type string version) + (type symbol symbol)) + (setf (getf (getf *deprecated-exports* package) symbol) + (cons state version))) + +(defun check-deprecated-export (package symbol) + (let ((state (getf (getf *deprecated-exports* package) symbol))) + (when state + (deprecation-warn (car state) "SBCL" (cdr state) 'symbol + (format nil "~A:~A" (package-name package) symbol) + (list symbol)) + t))) diff --git a/src/pcl/fixup.lisp b/src/pcl/fixup.lisp index 41d510c10e..51d68d08d3 100644 --- a/src/pcl/fixup.lisp +++ b/src/pcl/fixup.lisp @@ -68,3 +68,46 @@ ;;; CLASS-PROTOTYPE for FUNCTION should not use ALLOCATE-INSTANCE. (let ((class (find-class 'function))) (setf (slot-value class 'prototype) #'identity)) + +(dolist (symbol '(add-method allocate-instance class-name compute-applicable-methods + ensure-generic-function make-instance method-qualifiers + remove-method add-dependent add-direct-method add-direct-subclass + class-default-initargs class-direct-default-initargs + class-direct-slots class-direct-subclasses + class-direct-superclasses class-finalized-p class-precedence-list + class-prototype class-slots + compute-applicable-methods-using-classes + compute-class-precedence-list compute-default-initargs + compute-discriminating-function compute-effective-method + compute-effective-slot-definition compute-slots + direct-slot-definition direct-slot-definition-class + effective-slot-definition effective-slot-definition-class + ensure-class ensure-class-using-class + ensure-generic-function-using-class eql-specializer + eql-specializer-object extract-lambda-list + extract-specializer-names finalize-inheritance + find-method-combination forward-referenced-class + funcallable-standard-class funcallable-standard-instance-access + funcallable-standard-object + generic-function-argument-precedence-order + generic-function-declarations generic-function-lambda-list + generic-function-method-class generic-function-method-combination + generic-function-methods generic-function-name + intern-eql-specializer make-method-lambda map-dependents + method-function method-generic-function method-lambda-list + method-specializers accessor-method-slot-definition + reader-method-class remove-dependent remove-direct-method + remove-direct-subclass set-funcallable-instance-function + slot-boundp-using-class slot-definition slot-definition-allocation + slot-definition-initargs slot-definition-initform + slot-definition-initfunction slot-definition-location + slot-definition-name slot-definition-readers + slot-definition-writers slot-definition-type + slot-makunbound-using-class slot-value-using-class specializer + specializer-direct-generic-functions specializer-direct-methods + standard-accessor-method standard-direct-slot-definition + standard-effective-slot-definition standard-instance-access + standard-reader-method standard-slot-definition + standard-writer-method update-dependent validate-superclass + writer-method-class)) + (sb-impl::deprecate-export *package* symbol :early "2.0.7")) From 8085c2aaa8a83a670b47e3ad43c6f6ddf323c0b4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 2 Jul 2020 14:14:07 -0400 Subject: [PATCH 0179/4023] Catch something at compile-time Otherwise, trying to add/remove slots of SB-VM::THREAD can result in random cold-init failure. --- src/compiler/x86-64/nlx.lisp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/compiler/x86-64/nlx.lisp b/src/compiler/x86-64/nlx.lisp index f040c4862c..2c8bf8e607 100644 --- a/src/compiler/x86-64/nlx.lisp +++ b/src/compiler/x86-64/nlx.lisp @@ -38,6 +38,15 @@ ;;; Compute the address of the catch block from its TN, then store into the ;;; block the current Fp, Env, Unwind-Protect, and the entry PC. +#+sb-thread +(progn + ;; MOVAPD instruction faults if not properly aligned + (assert (evenp (/ (info :variable :wired-tls '*binding-stack-pointer*) n-word-bytes))) + (assert (= (- (info :variable :wired-tls '*current-catch-block*) + (info :variable :wired-tls '*binding-stack-pointer*)) + n-word-bytes)) + (assert (= (- unwind-block-current-catch-slot unwind-block-bsp-slot) 1))) + (define-vop (make-unwind-block) (:args (tn)) (:info entry-label) @@ -53,9 +62,7 @@ (inst lea temp (rip-relative-ea entry-label)) (storew temp block unwind-block-entry-pc-slot) #+sb-thread - (let ((bsp #1=(info :variable :wired-tls '*binding-stack-pointer*))) - #.(assert (and (= (- (info :variable :wired-tls '*current-catch-block*) #1#) n-word-bytes) - (= (- unwind-block-current-catch-slot unwind-block-bsp-slot) 1))) + (let ((bsp (info :variable :wired-tls '*binding-stack-pointer*))) (inst movapd xmm-temp (thread-tls-ea bsp)) (inst movupd (ea (* unwind-block-bsp-slot n-word-bytes) block) xmm-temp)) #-sb-thread From cb254701fab8cdd379498a0da805f23cc0d15267 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 2 Jul 2020 18:49:48 -0400 Subject: [PATCH 0180/4023] Remove two more slots from THREAD Kernel TID and stack-end can be obtained from the C thread, with the added benefit of not returning stale data for dead threads. --- NEWS | 4 ++ src/code/debug.lisp | 4 +- src/code/target-thread.lisp | 91 +++++++++++++++++++------------- src/code/thread.lisp | 7 --- src/code/traceroot.lisp | 12 ++--- src/compiler/generic/objdef.lisp | 4 ++ src/runtime/linux-os.c | 2 - src/runtime/thread.c | 11 +++- 8 files changed, 81 insertions(+), 54 deletions(-) diff --git a/NEWS b/NEWS index 0c035c98d6..e56c0a0791 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,9 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- +changes relative to sbcl-2.0.6: + * minor incompatible change: SB-THREAD:THREAD-OS-TID returns NIL for + a thread which has exited. + changes in sbcl-2.0.6 relative to sbcl-2.0.5: * planned incompatible change: the defined symbols in the Metaobject Protocol, currently accessible from both SB-MOP and SB-PCL packages, will diff --git a/src/code/debug.lisp b/src/code/debug.lisp index 57797151d4..2014f86608 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -468,7 +468,9 @@ information." ;; find a stack whose base is nearest and below A. (awhen (sb-thread::avl-find<= a sb-thread::*all-threads*) (let ((thread (sb-thread::avlnode-data it))) - (when (< a (sb-thread::thread-stack-end thread)) + (when (and thread + (sap< (int-sap a) + (sb-thread::thread-primitive-thread thread))) thread)))))))) ;;;; frame printing diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index c4800c3506..4df93a5c25 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -23,6 +23,15 @@ with-session-lock with-spinlock)) +(eval-when (:compile-toplevel :load-toplevel) + #+(and sb-thread sb-futex linux) (pushnew :futex-use-tid sb-xc:*features*)) + +#+futex-use-tid +(defmacro my-kernel-thread-id () + `(sb-ext:truly-the + (unsigned-byte 32) + (sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-kernel-tid-slot)))) + ;;; CAS Lock ;;; ;;; Locks don't come any simpler -- or more lightweight than this. While @@ -263,11 +272,6 @@ created and old ones may exit at any time." (sb-ext:define-load-time-global *initial-thread* nil) (sb-ext:define-load-time-global *make-thread-lock* nil) -(eval-when (:compile-toplevel :load-toplevel) - #+(and sb-thread sb-futex linux) (push :futex-use-tid sb-xc:*features*)) - -#+linux (define-alien-routine "sb_GetTID" (unsigned 32)) - (defun init-initial-thread () (/show0 "Entering INIT-INITIAL-THREAD") ;;; FIXME: is it purposeful or accidental that we recreate some of @@ -275,12 +279,10 @@ created and old ones may exit at any time." (setf sb-impl::*exit-lock* (make-mutex :name "Exit Lock") *make-thread-lock* (make-mutex :name "Make-Thread Lock")) (let ((thread (%make-thread "main thread" nil))) - #+linux (setf (thread-os-tid thread) (sb-gettid)) ;; Run the macro-generated function which writes some values into the TLS, ;; most especially *CURRENT-THREAD*. (init-thread-local-storage thread) - (setf (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) - (thread-primitive-thread thread) (current-thread-sap) + (setf (thread-primitive-thread thread) (current-thread-sap) *initial-thread* thread) (grab-mutex (thread-result-lock thread)) ;; Either *all-threads* is empty or it contains exactly one thread @@ -962,7 +964,7 @@ IF-NOT-OWNER is :FORCE)." (with-pinned-objects (queue ;; No point in pinning ME if not taking the adddress. #-futex-use-tid me) - (setf (waitqueue-token queue) #+futex-use-tid (thread-os-tid me) + (setf (waitqueue-token queue) #+futex-use-tid (my-kernel-thread-id) #-futex-use-tid me) (release-mutex mutex) ;; Now we go to sleep using futex-wait. If anyone else @@ -973,7 +975,7 @@ IF-NOT-OWNER is :FORCE)." (setf status (case (allow-with-interrupts (futex-wait (waitqueue-token-address queue) - #+futex-use-tid (thread-os-tid me) + #+futex-use-tid (my-kernel-thread-id) #-futex-use-tid (get-lisp-obj-address me) ;; our way of saying "no ;; timeout": @@ -1364,30 +1366,32 @@ on this semaphore, then N of them is woken up." `(with-system-mutex ((thread-interruptions-lock ,thread)) ,@body)) -;;; Remove thread from its session, if it has one. +;;; Remove thread from its session, if it has one, and from *all-threads*. +;;; Also clobber the pointer to the primitive thread +;;; which makes THREAD-ALIVE-P return false hereafter. #+sb-thread -(defun handle-thread-exit () - (/show0 "HANDLING THREAD EXIT") - (when *exit-in-process* - (%exit)) - ;; Lisp-side cleanup - (let ((thread *current-thread*)) - (when *session* - (%delete-thread-from-session thread *session*)) - (with-interruptions-lock (thread) - ;; The memory range can exist without a pthread running yet, but the pthread - ;; can't exist without the memory range. By clobbering this SAP here, - ;; it is safe to manipulate the memory and/or the pthread from another thread - ;; that acquires the interruptions lock if the SAP reads as nonzero. - ;; Doing this also makes THREAD-ALIVE-P return false hereafter. - (setf (thread-primitive-thread thread) nil)) - (sb-thread:barrier (:read)) - (let ((old *all-threads*)) - (loop - (let ((new (avl-delete (get-lisp-obj-address sb-vm:*control-stack-start*) - old))) - (when (eq old (setq old (sb-ext:cas *all-threads* old new))) (return))))))) - +(defmacro handle-thread-exit () + '(progn + (/show0 "HANDLING THREAD EXIT") + (when *exit-in-process* + (%exit)) + ;; Lisp-side cleanup + (let ((thread *current-thread*)) + (when *session* + (%delete-thread-from-session thread *session*)) + (with-interruptions-lock (thread) + ;; The memory range can exist without a pthread running yet, but the pthread + ;; can't exist without the memory range. By clobbering this SAP here, + ;; it is safe to manipulate the memory and/or the pthread from another thread + ;; that acquires the interruptions lock if the SAP reads as nonzero. + (setf (thread-primitive-thread thread) nil)) + (sb-thread:barrier (:read)) + (let ((old *all-threads*)) + (loop + (let ((new (avl-delete (get-lisp-obj-address sb-vm:*control-stack-start*) + old))) + (when (eq old (setq old (sb-ext:cas *all-threads* old new))) + (return)))))))) (defvar sb-ext:*invoke-debugger-hook* nil "This is either NIL or a designator for a function of two arguments, @@ -1571,12 +1575,10 @@ session." ;;; All threads other than the initial thread start via this function. #+sb-thread (defun new-lisp-thread-trampoline (thread setup-sem real-function arguments) - (setf (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) - (thread-primitive-thread thread) (current-thread-sap)) + (setf (thread-primitive-thread thread) (current-thread-sap)) ;; *ALLOC-SIGNAL* is made thread-local by create_thread_struct() ;; so this assigns into TLS, not the global value. (setf sb-vm:*alloc-signal* *default-alloc-signal*) - #+linux (setf (thread-os-tid thread) (sb-gettid)) (with-mutex ((thread-result-lock thread)) (let ((old *all-threads*)) (loop @@ -1858,6 +1860,23 @@ subject to change." (declare (ignorable lisp-thread ,os-thread)) ,@body)) +#+linux +(defun thread-os-tid (thread) + (declare (ignorable thread)) + #+sb-thread + (if (eq *current-thread* thread) + (my-kernel-thread-id) + (with-interruptions-lock (thread) + (let ((memory (thread-primitive-thread thread))) + (when memory + (sap-ref-32 memory + (+ (ash sb-vm::thread-os-kernel-tid-slot sb-vm:word-shift) + #+(and 64-bit big-endian) 4)))))) + ;; The man page for gettid() says + ;; "In a single-threaded process, the thread ID is equal to the process ID" + ;; It probably would be fine to return 0 here; nothing internal uses the value. + #-sb-thread (sb-unix:unix-getpid)) + (defun interrupt-thread (thread function) (declare (ignorable thread)) "Interrupt THREAD and make it run FUNCTION. diff --git a/src/code/thread.lisp b/src/code/thread.lisp index d76f90c441..59fe38751c 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -32,11 +32,6 @@ in future versions." (name nil :type (or null simple-string)) ; C code could read this (%ephemeral-p nil :type boolean :read-only t) - ;; Keep a copy of CONTROL-STACK-END from the "primitive" thread (C memory). - ;; Reading that memory for any thread except *CURRENT-THREAD* is not safe - ;; due to possible unmapping on thread death. Technically this is a fixed amount - ;; below PRIMITIVE-THREAD, but the exact offset varies by build configuration. - (stack-end 0 :type sb-vm:word) ;; This is one of a few different views of a lisp thread: ;; 1. the memory space (thread->os_addr in C) ;; 2. 'struct thread' at some offset into the memory space, coinciding @@ -48,8 +43,6 @@ in future versions." ;; may be running its termination code (unlinking from all_threads etc) (primitive-thread nil :type (or null system-area-pointer)) (interruptions nil :type list) - ;; Gotta have half a dozen or more different ways to identify a thread. - #+linux (os-tid 0 :type (unsigned-byte 32)) ;; On succesful execution of the thread's lambda a list of values. (result 0) (interruptions-lock diff --git a/src/code/traceroot.lisp b/src/code/traceroot.lisp index c86d5b3d5f..87de252709 100644 --- a/src/code/traceroot.lisp +++ b/src/code/traceroot.lisp @@ -36,13 +36,11 @@ (defun find-lisp-thread-from-thread-struct (addr) (declare (type sb-ext:word addr)) - ;; It is of course possible to do this without consing the list - ;; of all threads, but I don't care. - ;; Actually, why doesn't we make it correctly use the AVL tree? - (dolist (thread (sb-thread:list-all-threads)) - (let ((sap (sb-thread::thread-primitive-thread thread))) - (when (and sap (sap= sap (int-sap addr))) - (return thread))))) + ;; find a stack whose base is nearest and below A. + (awhen (sb-thread::avl-find<= addr sb-thread::*all-threads*) + (let ((thread (sb-thread::avlnode-data it))) + (when (sap= (int-sap addr) (sb-thread::thread-primitive-thread thread)) + thread)))) ;;; Convert each path to (TARGET . NODES) ;;; where the first node in NODES is one of: diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index 030f575cdd..dea3ce5554 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -480,11 +480,14 @@ during backtrace. ;; tls[0] = NO_TLS_VALUE_MARKER_WIDETAG because a the tls index slot ;; of a symbol is initialized to zero (no-tls-value-marker) + ;; Technically this slot violates our requirement that the size of the thread ;; primitive object be computable by assuming one word per slot. POSIX says ;; "IEEE Std 1003.1-2001/Cor 2-2004, item XBD/TC2/D6/26 is applied, ;; adding pthread_t to the list of types that are not required to be arithmetic ;; types, thus allowing pthread_t to be defined as a structure." + ;; And this slot is badly named, it should be "Pthread" since it's the POSIX + ;; (or emulated POSIX) thread object, not necessarily the OS's thread notion. (os-thread :c-type "os_thread_t") ;; Keep this first bunch of slots from binding-stack-pointer through alloc-region @@ -522,6 +525,7 @@ during backtrace. ;; Kept here so that when the thread dies we can release the whole ;; memory we reserved. (os-address :c-type "void *" :pointer t) + (os-kernel-tid) ; the kernel's thread identifier, 32 bits on linux ;; These aren't accessed (much) from Lisp, so don't really care ;; if it takes a 4-byte displacement. diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 3962217113..946702850a 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -55,8 +55,6 @@ # include #endif -int sb_GetTID() { return syscall(SYS_gettid); } - #ifdef LISP_FEATURE_X86 /* Prototype for personality(2). Done inline here since the header file * for this isn't available on old versions of glibc. */ diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 74e1fe8838..d398e6b60d 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -188,6 +188,13 @@ wait_for_thread_state_change(struct thread *thread, lispobj state) #endif /* sb-safepoint */ #endif /* sb-thread */ +#if __linux__ +// gettid() was added in glibc 2.30 but we support older glibc +static int sb_GetTID() { return syscall(SYS_gettid); } +#else +#define sb_GetTID() 0 +#endif + static int main_thread_trampoline(struct thread *th) { lispobj function; @@ -210,7 +217,8 @@ static int main_thread_trampoline(struct thread *th) th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; if(arch_os_thread_init(th)==0) return 1; link_thread(th); - th->os_thread=thread_self(); + th->os_kernel_tid = sb_GetTID(); + th->os_thread = thread_self(); #ifndef LISP_FEATURE_WIN32 protect_control_stack_hard_guard_page(1, NULL); #endif @@ -469,6 +477,7 @@ undo_init_new_thread(struct thread *th, void* new_thread_trampoline(void* arg) { struct thread *th = (struct thread *)arg; + th->os_kernel_tid = sb_GetTID(); int result; init_thread_data scribble; From 15df0634f23db5d9eba487f6216895c3340bb52e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 2 Jul 2020 19:16:19 -0400 Subject: [PATCH 0181/4023] Remove obsolete comment - we use posix threads --- src/code/target-thread.lisp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 4df93a5c25..e775c3b403 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -366,10 +366,6 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." #+sb-thread (progn - ;; FIXME it would be good to define what a thread id is or isn't - ;; (our current assumption is that it's a fixnum). It so happens - ;; that on Linux it's a pid, but it might not be on posix thread - ;; implementations. (define-alien-routine ("create_thread" %create-thread) unsigned (lisp-fun-address unsigned)) From 770291051f4069380ca0e7bf20f7a4c8a16d1f72 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 2 Jul 2020 21:49:08 -0400 Subject: [PATCH 0182/4023] Put stack-end back in lisp thread struct to fix #+win32 and fix one more naming issue as well. --- src/code/cold-init.lisp | 4 ++-- src/code/debug.lisp | 7 ++++--- src/code/target-thread.lisp | 6 ++++-- src/code/thread.lisp | 6 ++++++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index 5cd0f1048f..f8b61d7926 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -78,7 +78,7 @@ ;; Establish **initial-handler-clusters** (show-and-call sb-kernel::!target-error-cold-init) ;; And now *CURRENT-THREAD* and *HANDLER-CLUSTERS* - (sb-thread::init-initial-thread) + (sb-thread::init-main-thread) ;; Assert that FBOUNDP doesn't choke when its answer is NIL. ;; It was fine if T because in that case the legality of the arg is certain. @@ -337,7 +337,7 @@ process to continue normally." (without-gcing ;; Until *CURRENT-THREAD* has been set, nothing the slightest bit complicated ;; can be called, as pretty much anything can assume that it is set. - (sb-thread::init-initial-thread) + (sb-thread::init-main-thread) ;; Initializing the standard streams calls ALLOC-BUFFER which calls FINALIZE (finalizers-reinit) ;; Initialize streams next, so that any errors can be printed diff --git a/src/code/debug.lisp b/src/code/debug.lisp index 2014f86608..dfa03cc51c 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -468,9 +468,10 @@ information." ;; find a stack whose base is nearest and below A. (awhen (sb-thread::avl-find<= a sb-thread::*all-threads*) (let ((thread (sb-thread::avlnode-data it))) - (when (and thread - (sap< (int-sap a) - (sb-thread::thread-primitive-thread thread))) + (when (and (< a (sb-thread::thread-stack-end thread)) + ;; Make a final check that it's live. + ;; It could die by the time this returns. + (sb-thread::thread-primitive-thread thread)) thread)))))))) ;;;; frame printing diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index e775c3b403..022b892a39 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -272,8 +272,8 @@ created and old ones may exit at any time." (sb-ext:define-load-time-global *initial-thread* nil) (sb-ext:define-load-time-global *make-thread-lock* nil) -(defun init-initial-thread () - (/show0 "Entering INIT-INITIAL-THREAD") +(defun init-main-thread () + (/show0 "Entering INIT-MAIN-THREAD") ;;; FIXME: is it purposeful or accidental that we recreate some of ;;; the global mutexes but not all of them? (setf sb-impl::*exit-lock* (make-mutex :name "Exit Lock") @@ -283,6 +283,7 @@ created and old ones may exit at any time." ;; most especially *CURRENT-THREAD*. (init-thread-local-storage thread) (setf (thread-primitive-thread thread) (current-thread-sap) + (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) *initial-thread* thread) (grab-mutex (thread-result-lock thread)) ;; Either *all-threads* is empty or it contains exactly one thread @@ -1572,6 +1573,7 @@ session." #+sb-thread (defun new-lisp-thread-trampoline (thread setup-sem real-function arguments) (setf (thread-primitive-thread thread) (current-thread-sap)) + (setf (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*)) ;; *ALLOC-SIGNAL* is made thread-local by create_thread_struct() ;; so this assigns into TLS, not the global value. (setf sb-vm:*alloc-signal* *default-alloc-signal*) diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 59fe38751c..45791072a5 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -42,6 +42,12 @@ in future versions." ;; This value is NIL if the thread is not considered alive, though the pthread ;; may be running its termination code (unlinking from all_threads etc) (primitive-thread nil :type (or null system-area-pointer)) + ;; Keep a copy of CONTROL-STACK-END from the "primitive" thread. + ;; Reading that memory for any thread except *CURRENT-THREAD* is not safe + ;; due to possible unmapping on thread death. + ;; Usually this is a fixed amount below PRIMITIVE-THREAD, but the exact offset + ;; varies by build configuration, and if #+win32 it is not related in any way. + (stack-end 0 :type sb-vm:word) (interruptions nil :type list) ;; On succesful execution of the thread's lambda a list of values. (result 0) From 33481406cdbfa49d1a23cc533a257c334c588ec8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 3 Jul 2020 11:40:35 -0400 Subject: [PATCH 0183/4023] Provide more strange #R (etc) examples --- src/code/sharpm.lisp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/code/sharpm.lisp b/src/code/sharpm.lisp index 9be90052cf..0906e838d2 100644 --- a/src/code/sharpm.lisp +++ b/src/code/sharpm.lisp @@ -236,6 +236,9 @@ ;; though the docs say this is undefined behavior, so it's ok, ;; other than it being something we should complain about ;; for portability reasons. + ;; Some other things that shouldn't work: + ;; * (read-from-string "#x a") => 10 + ;; * (read-from-string "#x #+foo a b") => 11 (let ((res (let ((*read-base* radix)) (read stream t nil t)))) (unless (typep res 'rational) From 63d0598e652fa866b07350209dd1a220ef0dc854 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 4 Jul 2020 14:41:10 +0300 Subject: [PATCH 0184/4023] Fix bootstrapping with ECL, Clisp. Fixes lp#1886255 --- src/code/reader.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/code/reader.lisp b/src/code/reader.lisp index d71cf1db0e..00b4df38d5 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -32,7 +32,8 @@ (list `(%instance-ref table ,(dsd-index dsd)) (case (dsd-name dsd) (gethash-impl '#'gethash-return-default) - (pairs (make-array kv-pairs-overhead-slots)) + (pairs (make-array kv-pairs-overhead-slots + :initial-element 0)) (lock nil) (t (dsd-default dsd))))) (dd-slots From e039c52bc3d4f874dcf0e2240ce57dc3821ec5b1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 4 Jul 2020 11:27:55 -0400 Subject: [PATCH 0185/4023] Fix wrong docstring, remove wrong comment * names aren't arbitrary, even back when the comment was added (rev a08efdfc) * every use of WITH-PINNED-OBJECTS is necessary --- src/code/target-thread.lisp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 022b892a39..ca117a647d 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -172,14 +172,9 @@ exited. The offending thread can be accessed using THREAD-ERROR-THREAD.")) (condition) (thread-error-thread condition)) -;;; Of the WITH-PINNED-OBJECTS in this file, not every single one is -;;; necessary because threads are only supported with the conservative -;;; gencgc and numbers on the stack (returned by GET-LISP-OBJ-ADDRESS) -;;; are treated as references. - (setf (documentation 'thread-name 'function) - "Name of the thread. Can be assigned to using SETF. Thread names can be -arbitrary printable objects, and need not be unique.") + "Name of the thread. Can be assigned to using SETF. A thread name must be +a simple-string (not necessarily unique) or NIL.") (defmethod print-object ((thread thread) stream) (print-unreadable-object (thread stream :type t :identity t) From 2b6b20488e7057be4d1927d3bcdf081c414e0219 Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Mon, 6 Jul 2020 15:05:17 +0200 Subject: [PATCH 0186/4023] no warning on not linux. --- src/runtime/thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index d398e6b60d..7984bff5e6 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -188,7 +188,7 @@ wait_for_thread_state_change(struct thread *thread, lispobj state) #endif /* sb-safepoint */ #endif /* sb-thread */ -#if __linux__ +#ifdef __linux__ // gettid() was added in glibc 2.30 but we support older glibc static int sb_GetTID() { return syscall(SYS_gettid); } #else From 16eedfbf90c9f6b387029b4bb1639e2cba7a1674 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 6 Jul 2020 17:01:54 +0300 Subject: [PATCH 0187/4023] add-direct-subclass: do the reverse of remove-direct-subclass. Add the layout to classoid-subclasses, as it may not reach register-layout in time. Fixes lp#1886397 --- src/pcl/std-class.lisp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index f5a3f3e75b..5037fbc4e5 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -174,7 +174,20 @@ (defmethod add-direct-subclass ((class class) (subclass class)) (with-slots (direct-subclasses) class (with-world-lock () - (pushnew subclass direct-subclasses :test #'eq)) + (pushnew subclass direct-subclasses :test #'eq) + (let ((layout (class-wrapper subclass))) + (when layout + (let* ((classoid (layout-classoid layout))) + (dovector (super-layout (layout-inherits layout)) + (let* ((super (layout-classoid super-layout)) + (subclasses (or (classoid-subclasses super) + (or (classoid-subclasses super) + (setf (classoid-subclasses super) + (make-hash-table :hash-function #'type-hash-value + :test 'eq + :synchronized t)))))) + (when subclasses + (setf (gethash classoid subclasses) layout)))))))) subclass)) (defmethod remove-direct-subclass ((class class) (subclass class)) (with-slots (direct-subclasses) class From be587924cb7601651a38779e43f11acb72fb7361 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 6 Jul 2020 17:27:35 +0300 Subject: [PATCH 0188/4023] compile-time warnings for reduce: take initial-value into account. Fixes lp#1885515 --- src/compiler/callable-args.lisp | 12 ++++++++++-- src/compiler/fndb.lisp | 2 +- tests/bad-code.pure.lisp | 34 ++++++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/compiler/callable-args.lisp b/src/compiler/callable-args.lisp index 05464cb661..a1e4a8b344 100644 --- a/src/compiler/callable-args.lisp +++ b/src/compiler/callable-args.lisp @@ -51,7 +51,8 @@ (incf arg-position)) (handle-keys (options) (loop for (key value*) on options by #'cddr - for value = (if (eq key :key) + for value = (if (or (eq key :key) + (eq key :value)) (let ((lvar (getf (nthcdr positional-count lvars) value*))) (and lvar (record-lvar lvar))) @@ -294,9 +295,16 @@ (labels ((%process-arg (spec) (destructuring-bind (nth-arg . options) spec (let* ((arg (nth nth-arg deps)) + (value-nth (getf options :value)) (key-nth (getf options :key)) + (value (and value-nth + (nth value-nth deps))) (key (and key-nth (nth key-nth deps))) - (key-return-type (cond ((not key) + (key-return-type (cond (value-nth + (if (lvar-p value) + (lvar-type value) + *universal-type*)) + ((not key) nil) ((lvar-p key) (multiple-value-bind (type name) (lvar-fun-type key) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index d5090a2207..547be82ce1 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -562,7 +562,7 @@ (defknown (every notany notevery) (function-designator proper-sequence &rest proper-sequence) boolean (foldable unsafely-flushable call)) -(defknown reduce ((function-designator ((nth-arg 1 :sequence t :key :key) +(defknown reduce ((function-designator ((nth-arg 1 :sequence t :key :key :value :initial-value) (nth-arg 1 :sequence t :key :key))) proper-sequence &rest t &key (:from-end t) (:start (inhibit-flushing index 0)) diff --git a/tests/bad-code.pure.lisp b/tests/bad-code.pure.lisp index cb0222e60a..1a7951f586 100644 --- a/tests/bad-code.pure.lisp +++ b/tests/bad-code.pure.lisp @@ -522,7 +522,7 @@ (f))) :allow-style-warnings t)))) -(with-test (:name :inapprorate-declare) +(with-test (:name :inappropriate-declare) (assert (nth-value 5 (checked-compile @@ -538,3 +538,35 @@ (checked-compile `(lambda () (prog1 10 (declare (optimize)))) :allow-failure t)))) + +(with-test (:name :reduce-initial-value) + (assert + (nth-value 2 + (checked-compile + `(lambda () + (reduce (lambda (x y) + (declare (fixnum x)) + (+ x (char-code y))) + "abc")) + :allow-warnings t))) + (assert + (nth-value 2 + (checked-compile + `(lambda () + (reduce (lambda (x y) + (declare (fixnum x)) + (+ x (char-code y))) + "abc" + :initial-value #\a)) + :allow-warnings t))) + (checked-compile-and-assert + () + `(lambda (s) + (declare (string s)) + (reduce (lambda (x y) + (declare (fixnum x)) + (+ x (char-code y))) + s + :initial-value 0)) + (("abc") 294))) + From d6f64d8bea33c248a2924b4bac7b84671cf06a47 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 7 Jul 2020 00:34:00 +0300 Subject: [PATCH 0189/4023] Fix an OPEN restart. Mismatching keyword argument. Fixes lp#1886587 --- src/code/fd-stream.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index 42268ef930..2113c1bb52 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -2358,7 +2358,7 @@ (use-value (value) :report "Try opening a different file." :interactive read-evaluated-form - (list :filename (the pathname-designator value)))))) + (list :new-filename (the pathname-designator value)))))) (defun open (filename &key From 0e1bf60e9b32c7ca92531b2c10393ba6a6efaba7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 6 Jul 2020 21:00:16 -0400 Subject: [PATCH 0190/4023] Fix comments --- src/runtime/interrupt.c | 2 +- src/runtime/thread.c | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index b693cd88a0..72abae60ba 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -253,7 +253,7 @@ maybe_resignal_to_lisp_thread(int signal, os_context_t *context) * low_level_handle_now_handler * low_level_maybe_now_maybe_later * - * This gives us a single point of control (or six) over errno, fp + * This gives us a single point of control (or four) over errno, fp * control word, and fixing up signal context on sparc. * * The SPARC/Linux platform doesn't quite do signals the way we want diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 7984bff5e6..1b5312056f 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -1033,9 +1033,8 @@ void gc_start_the_world() struct thread *p,*th=arch_os_get_current_thread(); int lock_ret; /* if a resumed thread creates a new thread before we're done with - * this loop, the new thread will get consed on the front of - * all_threads, but it won't have been stopped so won't need - * restarting */ + * this loop, the new thread will be suspended waiting to acquire + * the all_threads lock */ FSHOW_SIGNAL((stderr,"/gc_start_the_world:begin\n")); for(p=all_threads;p;p=p->next) { gc_assert(p->os_thread!=0); From 5321680c8b819d563b433ec318e004747d403a5b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 6 Jul 2020 21:00:16 -0400 Subject: [PATCH 0191/4023] Add debugging helper --- src/runtime/gc-common.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 0d8833755f..c82339e779 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1649,6 +1649,30 @@ component_ptr_from_pc(char *pc) return NULL; } +/// Return the name of the simple-fun containing 'pc', +/// and if 'pfun' is non-null then store the base pointer +/// to the function in *pfun. This is an easier-to-use interface than +/// just returning the function, because accessing the name requires +/// knowing the function's index into the entry-point vector. +lispobj simple_fun_name_from_pc(char *pc, lispobj** pfun) +{ + struct code* code = (void*)component_ptr_from_pc(pc); + if (!code) return 0; // not in lisp heap + char *insts = code_text_start(code); + unsigned int* offsets = code_fun_table(code) - 1; + int i; + // Scanning backwards makes the stopping condition easy: + // the first function lower than 'pc' is the right answer. + for (i=code_n_funs(code)-1; i>=0; --i) { + struct simple_fun* fun = (void*)(insts + offsets[-i]); + if ((char*)fun < pc) { + if (pfun) *pfun = (lispobj*)fun; + return code->constants[i*CODE_SLOTS_PER_SIMPLE_FUN]; + } + } + return 0; // oops, how did this happen? +} + /* Scan an area looking for an object which encloses the given pointer. * Return the object start on success, or NULL on failure. */ lispobj * From 112a1020bd8f637c98b45bd0909c833248bd0f14 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 6 Jul 2020 21:00:16 -0400 Subject: [PATCH 0192/4023] Print logdir at top and bottom of output --- tests/parallel-exec.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 0fe6710e37..578f86bfce 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -143,6 +143,7 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (format t "~&Failing files:~%") (dolist (filename losing) (format t "~A~%" filename)) + (format t "==== Logs are in $logdir ====~%") (exit :code 1))))) (parallel-execute-tests $1) EOF From deae2fa4288a21619038c2649edbd266246f58cf Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 6 Jul 2020 21:16:28 -0400 Subject: [PATCH 0193/4023] Avoiding nested interrupt contexts due to finalizers --- src/code/final.lisp | 150 +++++++++++++++++++++++++++++++++++++++-- src/code/gc.lisp | 29 +++++++- src/runtime/interr.c | 26 +++++++ tests/finalize.test.sh | 10 +++ 4 files changed, 210 insertions(+), 5 deletions(-) diff --git a/src/code/final.lisp b/src/code/final.lisp index 42f3803ffb..e1b3206bec 100644 --- a/src/code/final.lisp +++ b/src/code/final.lisp @@ -231,7 +231,10 @@ Examples: object)) ;;; Drain the queue of finalizers and return when empty. -;;; Concurrent invocations of this function are ok. +;;; Concurrent invocations of this function in different threads are ok. +;;; Nested invocations (from a GC forced by a finalizer) are not ok. +;;; See the trace at the bottom of this file. +(defvar *in-a-finalizer* nil) (defun scan-finalizers () ;; This never acquires the finalizer store lock. Code accordingly. (let ((hashtable (finalizer-id-map **finalizer-store**))) @@ -263,7 +266,7 @@ Examples: ;; Now call the function(s) (flet ((call (finalizer) (let ((fun (if (consp finalizer) (car finalizer) finalizer))) - (handler-case (funcall fun) + (handler-case (let ((*in-a-finalizer* t)) (funcall fun)) (error (c) (warn "Error calling finalizer ~S:~% ~S" fun c)))))) (if (simple-vector-p finalizers) @@ -306,8 +309,12 @@ Examples: (when (hash-table-culled-values (finalizer-id-map **finalizer-store**)) (cond #+sb-thread ((%instancep *finalizer-thread*) - (with-system-mutex (*finalizer-queue-lock*) - (sb-thread:condition-notify *finalizer-queue*))) + ;; Do absolutely nothing if in a finalizer. If we are then it's obvious + ;; that we're in the SCAN-FINALIZERS loop, and that the loop will just + ;; go on looping without further provocation. + (unless *in-a-finalizer* + (with-system-mutex (*finalizer-queue-lock*) + (sb-thread:condition-notify *finalizer-queue*)))) #+sb-thread ((eq *finalizer-thread* t) ; Create a new thread (sb-thread::make-ephemeral-thread @@ -368,3 +375,138 @@ Examples: (with-system-mutex (*finalizer-queue-lock*) (sb-thread:condition-notify *finalizer-queue*)) (sb-thread:join-thread thread)))) ; wait for it + +#| +;;; This is a display produced by annotating parts of gc-common.c and +;;; interrupt.c with each thread's output in its own column. +;;; The main thread is on the right. + +;;; This output shows that if the finalizer thread calls a function that +;;; triggers a GC, the interrupt nesting depth can grow without limit. +;;; The finalizer thread does not have to be a memory hog - it just has +;;; to be unlucky enough to be the thread that triggers the collection. +;;; _Any_ thread can bring the GC trigger up to the threshold, +;;; and as long as the finalizer thread is the one to cross the +;;; the threshold, it is tasked with triggering the next scan +;;; of finalizers, but it MUST NOT do so recursively. +;;; +;;; The same thing can happen without using a finalizer thread, +;;; but it's actually easier to understand the output this way. + +Thread 2 Main +-------- -------- +| Enter SB-EXT:GC 0 +| Stopping world +| Stopped world +| SUB-GC calling gc(0) +| set auto_gc_trig=4858833 +| completed GC +| Restarted world +| SB-EXT:GC calling POST-GC +| ENTER run-pending-finalizers +| Enter SB-EXT:GC 0 +| Stopping world +| Stopped world +| SUB-GC calling gc(6) +| set auto_gc_trig=5075473 +| completed GC +| Restarted world +| SB-EXT:GC calling POST-GC +| ENTER run-pending-finalizers +| Trying to start finalizer thread +| starting +| Enter SB-EXT:GC 0 +| Stopping world +| Caught SIGUSR2, pc=52a946bd +| STOP_FOR_GC PA=1 inh=N sigmask=0 +| Caught SIGILL, pc=52a946cc code 0x9 +| evt 1 >handle_pending +| STOP_FOR_GC PA=0 inh=N sigmask=0 +| fake ffcall "stop_for_gc" +| bind(free_ICI, 1) +| Stopped world +| SUB-GC calling gc(6) +| set auto_gc_trig=520eeb3 +| completed GC +| Restarted world +| SB-EXT:GC calling POST-GC +| ENTER run-pending-finalizers +| Notify finalizer thread +| unbind free_ICI -> 0 +| leave STOP_FOR_GC +| evt 1 handle_pending +| ENTER maybe_gc (pc was 52a946ce) +| fake ffcall "maybe_gc" +| bind(free_ICI, 1) +| maybe_gc calling SUB-GC +| Stopping world +| Caught SIGUSR2, pc=7ff010deef47 +| STOP_FOR_GC PA=0 inh=N sigmask=0 +| fake ffcall "stop_for_gc" +| bind(free_ICI, 1) +| Stopped world +| SUB-GC calling gc(0) +| set auto_gc_trig=552b033 +| completed GC +| Restarted world +| maybe_gc calling POST-GC +| ENTER run-pending-finalizers +| unbind free_ICI -> 0 +| leave STOP_FOR_GC +| gc_trig=55d9110, setting PA-int +| Caught SIGILL, pc=52a946cc code 0x9 +| evt 3 >handle_pending +| ENTER maybe_gc (pc was 52a946ce) +| fake ffcall "maybe_gc" +| bind(free_ICI, 2) +| maybe_gc calling SUB-GC +| Stopping world +| Caught SIGUSR2, pc=7ff010deef47 +| STOP_FOR_GC PA=0 inh=N sigmask=0 +| fake ffcall "stop_for_gc" +| bind(free_ICI, 1) +| Stopped world +| SUB-GC calling gc(0) +| set auto_gc_trig=56c0423 +| completed GC +| Restarted world +| maybe_gc calling POST-GC +| ENTER run-pending-finalizers +| unbind free_ICI -> 0 +| leave STOP_FOR_GC +| gc_trig=576e500, setting PA-int +| Caught SIGILL, pc=52a946cc code 0x9 +| evt 4 >handle_pending +| ENTER maybe_gc (pc was 52a946ce) +| fake ffcall "maybe_gc" +| bind(free_ICI, 3) +| maybe_gc calling SUB-GC +| Stopping world +| Caught SIGUSR2, pc=7ff010deef47 +| STOP_FOR_GC PA=0 inh=N sigmask=0 +| fake ffcall "stop_for_gc" +| bind(free_ICI, 1) +| Stopped world +| SUB-GC calling gc(0) +| set auto_gc_trig=59dc213 +| completed GC +| Restarted world +| maybe_gc calling POST-GC +| ENTER run-pending-finalizers +| unbind free_ICI -> 0 +| leave STOP_FOR_GC +| gc_trig=5a8a2f0, setting PA-int +| Caught SIGILL, pc=52a946cc code 0x9 +| evt 5 >handle_pending +| ENTER maybe_gc (pc was 52a946ce) +| fake ffcall "maybe_gc" +| bind(free_ICI, 4) +| maybe_gc calling SUB-GC +| Stopping world +| +;;; This pattern of binding FREE_INTERRUPT_CONTEXT_INDEX to successively +;;; higher values will continue forever until reaching the limit and crashing. +|# diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 7856a17fdd..632c90e62d 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -274,7 +274,34 @@ statistics are appended to it." ;; if there is no finalizer thread and interrupts are disabled. ;; That's my excuse anyway, not having looked more in-depth. (run-pending-finalizers)) - (when *allow-with-interrupts* + ;; Here's one reason that MAX_INTERRUPTS is as high as it is. + ;; If the thread that performed GC runs post-GC hooks which cons enough to + ;; cause another GC while in the hooks, then as soon as interrupts are allowed + ;; again, a GC can be invoked "recursively" - while there is a maybe_gc() on + ;; the C call stack. It's not even true that _this_ thread had to cons a ton - + ;; any thread could have, causing this thread to hit the GC trigger which sets the + ;; P-A interrupted bit which causes the interrupt instruction at the end of a + ;; pseudo-atomic sequence to take a signal hit. So with interrupts eanbled, + ;; we get back into the GC, which calls post-GC, which might cons ... + ;; See the example at the bottom of src/code/final for a clear picture. + ;; + ;; To mitigate that problem, if you have no hooks, we can avoid inducing overflow + ;; of the interrupt contexts. Relegating post-GC actions to their own thread + ;; (as suggested above) would largely solve this - the post-GC action would be to + ;; just "kick" that thread to do its thing. If it doesn't finish in time (by the + ;; time we kick it again), that's its problem, not the GC's problem. + ;; How to solve this without multiple threads if there are post-gc hooks + ;; is an interesting question, but not a question of high merit. + (when (and *allow-with-interrupts* + ;; Continue if any of the following: + ;; - you want a finalizer thread but it hasn't been started + ;; - you don't want a finalizer thread, and we're not already + ;; in SCAN-FINALIZERS + ;; - there are some hooks to run + (or (if sb-impl::*finalizer-thread* + (not threadp) + (not sb-impl::*in-a-finalizer*)) + *after-gc-hooks*)) (sb-thread::without-thread-waiting-for () (with-interrupts (unless threadp diff --git a/src/runtime/interr.c b/src/runtime/interr.c index b10c5e04a0..4ba15e0121 100644 --- a/src/runtime/interr.c +++ b/src/runtime/interr.c @@ -137,6 +137,32 @@ lose(char *fmt, ...) call_lossage_handler(); } +#if 0 +/// thread printf. This was used to produce the 2-column output +/// at the bottom of "src/code/final". The main thread'd os_kernel_tid +/// must be assigned a constant in main_thread_trampoline(). +void tprintf(char *fmt, ...) +{ + va_list ap; + char buf[200]; + char *ptr; + const char spaces[] = " "; + struct thread*th = arch_os_get_current_thread(); + buf[0] = ';'; buf[1] = ' '; + ptr = buf+2; + if (th->os_kernel_tid == 'A') { + strcpy(ptr, spaces); + ptr += (sizeof spaces)-1; + } + va_start(ap, fmt); + int n = vsprintf(ptr, fmt, ap); + va_end(ap); + ptr += n; + *ptr++ = '\n'; + write(2, buf, ptr-buf); +} +#endif + boolean lose_on_corruption_p = 0; void diff --git a/tests/finalize.test.sh b/tests/finalize.test.sh index 03581fa4af..3f71ae5e7c 100755 --- a/tests/finalize.test.sh +++ b/tests/finalize.test.sh @@ -19,10 +19,14 @@ echo //entering finalize.test.sh (declare (ignore _)) nil) +(defglobal *maxdepth* 0) (let ((junk (mapcar (compile nil '(lambda (_) (declare (ignore _)) (let ((x (gensym))) (finalize x (lambda () + (setq *maxdepth* + (max sb-kernel:*free-interrupt-context-index* + *maxdepth*)) ;; cons in finalizer (setf *tmp* (make-list 10000)) (incf *count*))) @@ -41,6 +45,12 @@ echo //entering finalize.test.sh ;; FIXME: turns out, it does fail: (sb-kernel:run-pending-finalizers) +;;; This was failing with something like: +;;; The assertion (<= *MAXDEPTH* 1) failed with *MAXDEPTH* = 29. +;;; but it could actually made much worse by increasing the arguments +;;; to one or both MAKE-LISTs, at the risk of exhausting the heap. +(assert (<= *maxdepth* 1)) + (if (= *count* 10000) (with-open-file (f "finalize-test-passed" :direction :output) (write-line "OK" f)) From faa467819594d7a819a63f169eb99eab7db5e1f6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 7 Jul 2020 00:00:50 -0400 Subject: [PATCH 0194/4023] Allow threads to startup if session lock is held Atomically push into a list of threads that want to participate in the session, and lazily move those into SESSION-THREADS just in time to do anything that affects which thread owns the foreground. --- src/code/target-thread.lisp | 61 +++++++++++++++++++++++++++---------- src/code/thread.lisp | 1 + tests/session.impure.lisp | 17 +++++++++++ 3 files changed, 63 insertions(+), 16 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index ca117a647d..d9c8fa855b 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1303,7 +1303,15 @@ on this semaphore, then N of them is woken up." ;;;; Job control, independent listeners (defstruct (session (:copier nil)) + ;; New threads are atomically pushed into NEW-ENROLLEES without acquiring the + ;; session lock. Any operation on the session that transfers ownership of the + ;; foreground must move the enrollees into THREADS while holding the lock. + (new-enrollees) (lock (make-mutex :name "session lock")) + ;; If we wanted to get fancy, these next 2 lists might become lockfree linked lists + ;; so that it would be possible for threads to exit without acquiring the lock. + ;; It might be tricky (i.e. too much trouble) to figure out how to reimplement + ;; the various operations on a session though. (threads nil) (interactive-threads nil) (interactive-threads-queue (make-waitqueue))) @@ -1320,19 +1328,41 @@ on this semaphore, then N of them is woken up." ;;; FIXME: It might be good to have a way to enforce lock ordering invariants (defmacro with-session-lock ((session) &body body) `(with-system-mutex ((session-lock ,session) :allow-with-interrupts t) + (%enroll-new-threads ,session) ,@body)) -(defun new-session () - (make-session :threads (list *current-thread*) - :interactive-threads (list *current-thread*))) +;;; Move new enrollees into SESSION-THREADS. The session lock must be held. +;;; The reason this can be lazy is that a thread is never an interactive thread +;;; just by joining a session, so it doesn't involve itself with the waitqueue; +;;; it can't cause a thread waiting on the condition to wake. +;;; i.e. even if a newly created thread were required to obtain the lock to insert +;;; itself into the session, it would not and could not have any effect on any other +;;; thread in the session. +(defun %enroll-new-threads (session) + (loop (let ((thread (sb-ext:atomic-pop (session-new-enrollees session)))) + (cond ((not thread) (return)) + ((thread-alive-p thread) + ;; Can it become dead immediately upon insertion into THREADS? + ;; No, because to become dead, it must acquire the session lock. + (push thread (session-threads session))))))) + +(defun new-session (thread) + (make-session :threads (list thread) + :interactive-threads (list thread))) (defun init-job-control () (/show0 "Entering INIT-JOB-CONTROL") - (setf *session* (new-session)) + (setf *session* (new-session *current-thread*)) (/show0 "Exiting INIT-JOB-CONTROL")) (defun %delete-thread-from-session (thread session) (with-session-lock (session) + ;; One of two things about THREAD must be true, either: + ;; - it was transferred from SESSION-NEW-ENROLLEES to SESSION-THREADS + ;; - it was NOT yet transferred from SESSION-NEW-ENROLLEES. + ;; There can't be an "in flight" state of having done the atomic-pop from + ;; SESSION-NEW-ENROLLEES but not the push into THREADS, because anyone manipulating + ;; the THREADS list must be holding the session lock. (let ((was-foreground (eq thread (foreground-thread session)))) (setf (session-threads session) ;; FIXME: I assume these could use DELQ1. @@ -1345,12 +1375,12 @@ on this semaphore, then N of them is woken up." (defun call-with-new-session (fn) (%delete-thread-from-session *current-thread* *session*) - (let ((*session* (new-session))) + (let ((*session* (new-session *current-thread*))) (funcall fn))) (defmacro with-new-session (args &body forms) (declare (ignore args)) ;for extensibility - (with-unique-names (fb-name) + (with-unique-names (fb-name) ; FIXME: what's the significance of "fb-" ? `(labels ((,fb-name () ,@forms)) (call-with-new-session (function ,fb-name))))) @@ -1369,15 +1399,19 @@ on this semaphore, then N of them is woken up." (%exit)) ;; Lisp-side cleanup (let ((thread *current-thread*)) - (when *session* - (%delete-thread-from-session thread *session*)) (with-interruptions-lock (thread) ;; The memory range can exist without a pthread running yet, but the pthread ;; can't exist without the memory range. By clobbering this SAP here, ;; it is safe to manipulate the memory and/or the pthread from another thread ;; that acquires the interruptions lock if the SAP reads as nonzero. - (setf (thread-primitive-thread thread) nil)) - (sb-thread:barrier (:read)) + (setf (thread-primitive-thread thread) nil) + (barrier (:write))) + ;; After making the thread dead, remove from session. If this were done first, + ;; we'd just waste time moving the thread into SESSION-THREADS (if it wasn't there) + ;; only to remove it right away. + (when *session* + (%delete-thread-from-session thread *session*)) + (barrier (:read)) (let ((old *all-threads*)) (loop (let ((new (avl-delete (get-lisp-obj-address sb-vm:*control-stack-start*) @@ -1582,12 +1616,7 @@ session." (aver (not (avl-find addr old))) (let ((new (avl-insert old addr thread))) (when (eq old (setq old (sb-ext:cas *all-threads* old new))) (return)))))) - (let ((session *session*) - (session-cons (list thread))) - (with-session-lock (session) - (setf (cdr session-cons) (session-threads session) - (session-threads session) session-cons))) - + (sb-ext:atomic-push thread (session-new-enrollees *session*)) (when setup-sem (signal-semaphore setup-sem) ;; setup-sem was dx-allocated, set it to NIL so that the diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 45791072a5..9656e0dd7b 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -64,6 +64,7 @@ in future versions." "Return T if THREAD is still alive. Note that the return value is potentially stale even before the function returns, as the thread may exit at any time." + (barrier (:read)) (not (null (thread-primitive-thread thread)))) (sb-impl::define-thread-local *current-thread* diff --git a/tests/session.impure.lisp b/tests/session.impure.lisp index b40152610c..01626cca6f 100644 --- a/tests/session.impure.lisp +++ b/tests/session.impure.lisp @@ -28,6 +28,23 @@ (with-test (:name (:no-session-deadlock)) (make-join-thread (lambda () (sb-ext:gc)))) +(with-test (:name (:make-thread-while-holding-session-lock)) + (let ((thr1 nil) + (thr2 nil) + (sem1 (sb-thread:make-semaphore)) + (sem2 (sb-thread:make-semaphore))) + (sb-thread::with-session-lock (sb-thread::*session*) + (setq thr1 (sb-thread:make-thread + #'sb-thread:signal-semaphore :arguments sem1) + thr2 (sb-thread:make-thread + #'sb-thread:signal-semaphore :arguments sem2)) + ;; This used to hang right here because threads could not make progress + ;; in their lisp-side trampoline. + (sb-thread:wait-on-semaphore sem1) + (sb-thread:wait-on-semaphore sem2)) + (sb-thread:join-thread thr1) + (sb-thread:join-thread thr2))) + (with-test (:name (:debugger-no-hang-on-session-lock-if-interrupted) :broken-on :win32) (sb-debug::enable-debugger) From 086c8f7975fc91c324c23246adb0b3db372d50fa Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 7 Jul 2020 14:33:28 +0300 Subject: [PATCH 0195/4023] Fix -sb-thread. --- src/code/gc.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 632c90e62d..1ea4413116 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -298,7 +298,8 @@ statistics are appended to it." ;; - you don't want a finalizer thread, and we're not already ;; in SCAN-FINALIZERS ;; - there are some hooks to run - (or (if sb-impl::*finalizer-thread* + (or #+sb-thread + (if sb-impl::*finalizer-thread* (not threadp) (not sb-impl::*in-a-finalizer*)) *after-gc-hooks*)) From e3c0ddd7b0c30c6671b4838a5d1befca88ba288a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 7 Jul 2020 10:34:33 -0400 Subject: [PATCH 0196/4023] Fix finalizer.test.sh Don't "help" the GC in the case of #-sb-thread, because giving it help hid the failure of GC to actually run any finalizers at all. Do help it with #+sb-thread, because the thread runs at its own pace. --- src/code/gc.lisp | 22 ++++++++++++----- src/code/thread.lisp | 2 ++ tests/finalize.test.sh | 55 ++++++++++++++++++++++++++++-------------- 3 files changed, 55 insertions(+), 24 deletions(-) diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 1ea4413116..d844c8309d 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -290,18 +290,28 @@ statistics are appended to it." ;; (as suggested above) would largely solve this - the post-GC action would be to ;; just "kick" that thread to do its thing. If it doesn't finish in time (by the ;; time we kick it again), that's its problem, not the GC's problem. - ;; How to solve this without multiple threads if there are post-gc hooks - ;; is an interesting question, but not a question of high merit. + ;; + ;; If we do implement a general post-GC thread, there remains a question of + ;; of what to do with post-GC actions for #-sb-thread that cons too much, + ;; risking recursive invocation of GC. Pretty much don't do that. + ;; (when (and *allow-with-interrupts* ;; Continue if any of the following: ;; - you want a finalizer thread but it hasn't been started ;; - you don't want a finalizer thread, and we're not already ;; in SCAN-FINALIZERS ;; - there are some hooks to run - (or #+sb-thread - (if sb-impl::*finalizer-thread* - (not threadp) - (not sb-impl::*in-a-finalizer*)) + ;; Logically, the finalizer existence test belongs in src/code/final, + ;; but the flaw in that is we're not going to call that code until unmasking + ;; interrupts, which is precisely the thing we need to NOT do if already + ;; in post-GC code of any kind (be it finalizer or other). + (or #+sb-thread (if sb-impl::*finalizer-thread* + (not threadp) + (not sb-impl::*in-a-finalizer*)) + #-sb-thread (and (sb-impl::hash-table-culled-values + (sb-impl::finalizer-id-map + sb-impl::**finalizer-store**)) + (not sb-impl::*in-a-finalizer*)) *after-gc-hooks*)) (sb-thread::without-thread-waiting-for () (with-interrupts diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 9656e0dd7b..fb326d94b9 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -147,6 +147,8 @@ stale value, use MUTEX-OWNER instead." (function with-recursive-spinlock :replacement with-recursive-lock) (function with-spinlock :replacement with-mutex))) +;;; I wish there were a shred of documentation about WHY this needs to exist. +;;; SOMEBODY PLEASE HELP! (defmacro without-thread-waiting-for ((&key already-without-interrupts) &body body) (with-unique-names (thread prev) (let ((without (if already-without-interrupts diff --git a/tests/finalize.test.sh b/tests/finalize.test.sh index 3f71ae5e7c..a2e42bb9c2 100755 --- a/tests/finalize.test.sh +++ b/tests/finalize.test.sh @@ -12,14 +12,21 @@ echo //entering finalize.test.sh # $! is not set correctly when calling run_sbcl, do it directly "$SBCL_RUNTIME" --core "$SBCL_CORE" $SBCL_ARGS < /dev/null & -(defvar *tmp* 0.0) -(defvar *count* 0) +(defvar *tmp* 0.0) ; don't remove - used by the setq below +(defglobal *count* 0) +(declaim (fixnum *count*)) (defun foo (_) (declare (ignore _)) nil) (defglobal *maxdepth* 0) +;; Be gentler on 32-bit platforms +(defglobal *n-finalized-things* #+64-bit 20000 #-64-bit 10000) + +#+sb-thread ; Check that we do want to start a thread, and it hasn't been started. +(assert (eq sb-impl::*finalizer-thread* t)) + (let ((junk (mapcar (compile nil '(lambda (_) (declare (ignore _)) (let ((x (gensym))) @@ -27,31 +34,43 @@ echo //entering finalize.test.sh (setq *maxdepth* (max sb-kernel:*free-interrupt-context-index* *maxdepth*)) - ;; cons in finalizer - (setf *tmp* (make-list 10000)) - (incf *count*))) + ;; cons 640K in the finalizer for #+64-bit, + ;; or 80K for #-64-bit + (setf *tmp* (make-list #+64-bit 40000 + #-64-bit 10000)) + (sb-ext:atomic-incf *count*))) x))) - (make-list 10000)))) + (make-list *n-finalized-things*)))) (setf junk (foo junk)) (foo junk)) +;;(format *error-output* "About to GC~%") (gc :full t) -(gc :full t) -;; Stopping the finalizer thread ensures that queued finalizers execute. -;; [I don't think it's possible for it to stop before draining the queue, -;; but that isn't part of the contract with stopping. If this test fails, -;; try inserting a call to RUN-PENDING-FINALIZERS after this line] -#+sb-thread (sb-impl::finalizer-thread-stop) -;; FIXME: turns out, it does fail: -(sb-kernel:run-pending-finalizers) + +#+sb-thread +(progn + ;; Verify that the thread was started. + (assert (typep sb-impl::*finalizer-thread* 'sb-thread::thread)) + ;; We're asserting on an exact count of finalizers that ran, which is a bit sketchy. + ;; It would mostly be fine to that is within some fudge factor of the expected number, + ;; however, the purpose of this "stress test" is to verify that we don't miss any + ;; any finalizations when under stress. + ;; So to do that, call SCAN-FINALIZERS which actually does the work of helping out + ;; the finalizer thread. RUN-PENDING-FINALIZERS is not enough - it would just kick + ;; the thread and return right away, failing our requirement for being synchronous. + ;; Also, there's no reason to pre- or post-check how may finalizer are pending + ;; right now- it may be all of them, none of them, or anything in between, + ;; depending on what the thread has gotten to so far. + ;; This also shows that it works to run finalization actions in two threads - + ;; the finalizer thread and this. Hence the need for ATOMIC-INCF on *count*. + (sb-impl::scan-finalizers)) ;;; This was failing with something like: -;;; The assertion (<= *MAXDEPTH* 1) failed with *MAXDEPTH* = 29. -;;; but it could actually made much worse by increasing the arguments -;;; to one or both MAKE-LISTs, at the risk of exhausting the heap. +;;; The assertion (<= *MAXDEPTH* 1) failed with *MAXDEPTH* = 232. +;;; The test parameters for 64-bit are quite severe, but should not exhaust the heap. (assert (<= *maxdepth* 1)) -(if (= *count* 10000) +(if (= *count* *n-finalized-things*) (with-open-file (f "finalize-test-passed" :direction :output) (write-line "OK" f)) (with-open-file (f "finalize-test-failed" :direction :output) From f787217c170c40de655739138aee26670c923530 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 7 Jul 2020 19:13:33 +0300 Subject: [PATCH 0197/4023] Try to fix a test with sb-sys:scrub-control-stack. --- tests/finalize.test.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/finalize.test.sh b/tests/finalize.test.sh index a2e42bb9c2..58a3434bba 100755 --- a/tests/finalize.test.sh +++ b/tests/finalize.test.sh @@ -44,6 +44,12 @@ echo //entering finalize.test.sh (setf junk (foo junk)) (foo junk)) +(defun scrubstack () + (sb-int:dx-let ((b (make-array 20))) (eval b)) + (sb-sys:scrub-control-stack)) + +(scrubstack) + ;;(format *error-output* "About to GC~%") (gc :full t) From 9ee18ce2df230003ea28b6a87292d2008fad5003 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 7 Jul 2020 14:11:02 -0400 Subject: [PATCH 0198/4023] Add diagnostics to finalize.test --- tests/finalize.test.sh | 51 +++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/tests/finalize.test.sh b/tests/finalize.test.sh index 58a3434bba..0439913eea 100755 --- a/tests/finalize.test.sh +++ b/tests/finalize.test.sh @@ -27,36 +27,45 @@ echo //entering finalize.test.sh #+sb-thread ; Check that we do want to start a thread, and it hasn't been started. (assert (eq sb-impl::*finalizer-thread* t)) -(let ((junk (mapcar (compile nil '(lambda (_) - (declare (ignore _)) - (let ((x (gensym))) - (finalize x (lambda () - (setq *maxdepth* - (max sb-kernel:*free-interrupt-context-index* - *maxdepth*)) - ;; cons 640K in the finalizer for #+64-bit, - ;; or 80K for #-64-bit - (setf *tmp* (make-list #+64-bit 40000 - #-64-bit 10000)) - (sb-ext:atomic-incf *count*))) - x))) - (make-list *n-finalized-things*)))) - (setf junk (foo junk)) - (foo junk)) +(defun makejunk (_) + (declare (ignore _)) + (let ((x (gensym))) + (finalize x (lambda () + (setq *maxdepth* + (max sb-kernel:*free-interrupt-context-index* + *maxdepth*)) + ;; cons 640K in the finalizer for #+64-bit, + ;; or 80K for #-64-bit + (setf *tmp* (make-list #+64-bit 40000 + #-64-bit 10000)) + (sb-ext:atomic-incf *count*))) + x)) +(compile 'makejunk) (defun scrubstack () (sb-int:dx-let ((b (make-array 20))) (eval b)) (sb-sys:scrub-control-stack)) -(scrubstack) - -;;(format *error-output* "About to GC~%") -(gc :full t) +(dotimes (iter 10) + (let ((junk (mapcar #'makejunk + (make-list (/ *n-finalized-things* 10))))) + (setf junk (foo junk)) + (foo junk)) + (scrubstack) + (gc :full t)) #+sb-thread (progn ;; Verify that the thread was started. - (assert (typep sb-impl::*finalizer-thread* 'sb-thread::thread)) + (unless (typep sb-impl::*finalizer-thread* 'sb-thread::thread) + (with-open-file (*standard-output* "finalize-test-failed" :direction :output) + (format t "No finalizer thread - how can this happen?") + (print sb-impl::**finalizer-store**) + (terpri) + (format t "Culled values:") + (print (sb-impl::hash-table-culled-values (svref sb-impl::**finalizer-store** 1))) + (terpri)) + (sb-ext:quit)) ;; We're asserting on an exact count of finalizers that ran, which is a bit sketchy. ;; It would mostly be fine to that is within some fudge factor of the expected number, ;; however, the purpose of this "stress test" is to verify that we don't miss any From 0c578d16bc72f8079d8fb5b01d112c15cdeebb75 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 7 Jul 2020 18:34:10 -0400 Subject: [PATCH 0199/4023] Take another stab at finalizer test --- tests/finalize.test.sh | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/tests/finalize.test.sh b/tests/finalize.test.sh index 0439913eea..7b4a514ce8 100755 --- a/tests/finalize.test.sh +++ b/tests/finalize.test.sh @@ -46,16 +46,22 @@ echo //entering finalize.test.sh (sb-int:dx-let ((b (make-array 20))) (eval b)) (sb-sys:scrub-control-stack)) -(dotimes (iter 10) - (let ((junk (mapcar #'makejunk - (make-list (/ *n-finalized-things* 10))))) - (setf junk (foo junk)) - (foo junk)) - (scrubstack) - (gc :full t)) +(defun run-consy-thing () + (dotimes (iter 10) + (let ((junk (mapcar #'makejunk + (make-list (/ *n-finalized-things* 10))))) + (setf junk (foo junk)) + (foo junk)) + (scrubstack) + (gc :full t))) + +; no threads - hope for the best with respect to conservative root retention +#-sb-thread (run-consy-thing) #+sb-thread (progn + (sb-thread:join-thread (sb-thread:make-thread #'run-consy-thing)) + (gc :full t) ; one more time to clean everything up ;; Verify that the thread was started. (unless (typep sb-impl::*finalizer-thread* 'sb-thread::thread) (with-open-file (*standard-output* "finalize-test-failed" :direction :output) @@ -85,9 +91,12 @@ echo //entering finalize.test.sh ;;; The test parameters for 64-bit are quite severe, but should not exhaust the heap. (assert (<= *maxdepth* 1)) -(if (= *count* *n-finalized-things*) +(if (or (= *count* *n-finalized-things*) + ;; allow some slop for non-thread because the stack might pin some junk + (and (not (member :sb-thread *features*)) + (>= *count* (- *n-finalized-things* 2)))) (with-open-file (f "finalize-test-passed" :direction :output) - (write-line "OK" f)) + (format f "OK - ran ~d finalizers~%" *count*)) (with-open-file (f "finalize-test-failed" :direction :output) (format f "OOPS: ~A~%" *count*) (sb-kernel:run-pending-finalizers) @@ -102,7 +111,7 @@ WAITED=x echo "Waiting for SBCL to finish stress-testing finalizers" while true; do if [ -f finalize-test-passed ]; then - echo "OK" + cat finalize-test-passed rm finalize-test-passed exit $EXIT_TEST_WIN elif [ -f finalize-test-failed ]; then From d081282c08d15e692089a31132141bdf2526dbaa Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 7 Jul 2020 20:28:22 -0400 Subject: [PATCH 0200/4023] Remove stray arguments --- src/runtime/breakpoint.c | 4 ++-- src/runtime/gc-common.c | 2 +- src/runtime/interrupt.c | 2 +- src/runtime/interrupt.h | 2 +- src/runtime/thread.c | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/runtime/breakpoint.c b/src/runtime/breakpoint.c index eff215d016..08f9702f37 100644 --- a/src/runtime/breakpoint.c +++ b/src/runtime/breakpoint.c @@ -117,7 +117,7 @@ void handle_breakpoint(os_context_t *context) fake_foreign_function_call(context); #ifndef LISP_FEATURE_SB_SAFEPOINT - unblock_gc_signals(0, 0); + unblock_gc_signals(); #endif code = find_code(context); @@ -144,7 +144,7 @@ void *handle_fun_end_breakpoint(os_context_t *context) fake_foreign_function_call(context); #ifndef LISP_FEATURE_SB_SAFEPOINT - unblock_gc_signals(0, 0); + unblock_gc_signals(); #endif code = find_code(context); diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index c82339e779..29a8e34063 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1851,7 +1851,7 @@ maybe_gc(os_context_t *context) */ #if !(defined(LISP_FEATURE_WIN32) || defined(LISP_FEATURE_SB_SAFEPOINT)) check_gc_signals_unblocked_or_lose(os_context_sigmask_addr(context)); - unblock_gc_signals(0, 0); + unblock_gc_signals(); #endif FSHOW((stderr, "/maybe_gc: calling SUB_GC\n")); /* FIXME: Nothing must go wrong during GC else we end up running diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 72abae60ba..29c5192a00 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -171,7 +171,7 @@ static void sigmask_logandc(sigset_t *dest, const sigset_t *source) /* Foreign code may want to start some threads on its own. * Non-targetted, truly asynchronous signals can be delivered to - * basically any thread, but invoking Lisp handlers in such foregign + * basically any thread, but invoking Lisp handlers in such foreign * threads is really bad, so let's resignal it. * * This should at least bring attention to the problem, but it cannot diff --git a/src/runtime/interrupt.h b/src/runtime/interrupt.h index 5407bd4977..88fd370558 100644 --- a/src/runtime/interrupt.h +++ b/src/runtime/interrupt.h @@ -45,7 +45,7 @@ extern void block_deferrable_signals(sigset_t *old); extern void block_blockable_signals(sigset_t *old); extern void unblock_deferrable_signals(sigset_t *where); -extern void unblock_gc_signals(); +extern void unblock_gc_signals(void); extern void maybe_save_gc_mask_and_block_deferrables(sigset_t *sigset); diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 1b5312056f..139a4c360a 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -211,7 +211,7 @@ static int main_thread_trampoline(struct thread *th) #if defined THREADS_USING_GCSIGNAL && \ (defined LISP_FEATURE_PPC || defined LISP_FEATURE_PPC64 || defined LISP_FEATURE_ARM64 || defined LISP_FEATURE_RISCV) /* SIG_STOP_FOR_GC defaults to blocked on PPC? */ - unblock_gc_signals(0,0); + unblock_gc_signals(); #endif function = th->no_tls_value_marker; th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; @@ -533,7 +533,7 @@ attach_os_thread(init_thread_data *scribble) /* new-lisp-thread-trampoline doesn't like when the GC signal is blocked */ /* FIXME: could be done using a single call to pthread_sigmask together with locking the deferrable signals above. */ - unblock_gc_signals(0, 0); + unblock_gc_signals(); #endif #if !defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) From 00e36a6d2b28004187fbcc9801a903177738aef4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 7 Jul 2020 20:30:38 -0400 Subject: [PATCH 0201/4023] Privatize sigaddset_gc() --- src/runtime/interrupt.c | 16 ++++++++-------- src/runtime/interrupt.h | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 29c5192a00..0d5602c6d4 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -372,14 +372,7 @@ sigaddset_deferrable(sigset_t *s) sigaddset(s, SIGWINCH); } -void -sigaddset_blockable(sigset_t *sigset) -{ - sigaddset_deferrable(sigset); - sigaddset_gc(sigset); -} - -void +static void sigaddset_gc(sigset_t __attribute__((unused)) *sigset) { #ifdef THREADS_USING_GCSIGNAL @@ -387,6 +380,13 @@ sigaddset_gc(sigset_t __attribute__((unused)) *sigset) #endif } +void +sigaddset_blockable(sigset_t *sigset) +{ + sigaddset_deferrable(sigset); + sigaddset_gc(sigset); +} + /* initialized in interrupt_init */ sigset_t deferrable_sigset; sigset_t blockable_sigset; diff --git a/src/runtime/interrupt.h b/src/runtime/interrupt.h index 88fd370558..5547c2666c 100644 --- a/src/runtime/interrupt.h +++ b/src/runtime/interrupt.h @@ -22,8 +22,6 @@ extern void get_current_sigmask(sigset_t *sigset); extern void sigaddset_deferrable(sigset_t *s); /* Set all blockable signals into *s. */ extern void sigaddset_blockable(sigset_t *s); -/* Set all gc signals into *s. */ -extern void sigaddset_gc(sigset_t *s); extern sigset_t deferrable_sigset; extern sigset_t blockable_sigset; From 9afd548f9f732510422bc7da963a8b2099b46002 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 7 Jul 2020 22:39:24 -0400 Subject: [PATCH 0202/4023] Employ traceroot in finalizer test on failure --- tests/finalize.test.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/finalize.test.sh b/tests/finalize.test.sh index 7b4a514ce8..07ebd42ca4 100755 --- a/tests/finalize.test.sh +++ b/tests/finalize.test.sh @@ -23,6 +23,7 @@ echo //entering finalize.test.sh (defglobal *maxdepth* 0) ;; Be gentler on 32-bit platforms (defglobal *n-finalized-things* #+64-bit 20000 #-64-bit 10000) +(defglobal *weak-pointers* nil) #+sb-thread ; Check that we do want to start a thread, and it hasn't been started. (assert (eq sb-impl::*finalizer-thread* t)) @@ -30,13 +31,14 @@ echo //entering finalize.test.sh (defun makejunk (_) (declare (ignore _)) (let ((x (gensym))) + (push (make-weak-pointer x) *weak-pointers*) (finalize x (lambda () (setq *maxdepth* (max sb-kernel:*free-interrupt-context-index* *maxdepth*)) - ;; cons 640K in the finalizer for #+64-bit, + ;; cons 320K in the finalizer for #+64-bit, ;; or 80K for #-64-bit - (setf *tmp* (make-list #+64-bit 40000 + (setf *tmp* (make-list #+64-bit 20000 #-64-bit 10000)) (sb-ext:atomic-incf *count*))) x)) @@ -98,9 +100,11 @@ echo //entering finalize.test.sh (with-open-file (f "finalize-test-passed" :direction :output) (format f "OK - ran ~d finalizers~%" *count*)) (with-open-file (f "finalize-test-failed" :direction :output) - (format f "OOPS: ~A~%" *count*) + (format f "OOPS: ~A (threads=~A)~%" *count* (or #+sb-thread "yes" "no")) (sb-kernel:run-pending-finalizers) - (format f "After sb-kernel:run-pending-finalizers: ~A~%" *count*))) + (format f "After sb-kernel:run-pending-finalizers: ~A~%" *count*) + (let ((*standard-output* f)) + (search-roots *weak-pointers* :print :verbose)))) (sb-ext:quit) EOF From fe75dd69ad5d71e9b6de69994c5ee815873c931a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 8 Jul 2020 00:40:44 -0400 Subject: [PATCH 0203/4023] Fix lingering "GC pending" from foreign callback --- src/code/alien-callback.lisp | 15 ++++--- src/code/save.lisp | 1 + src/code/target-thread.lisp | 4 ++ src/code/thread.lisp | 3 +- src/runtime/interr.h | 1 + src/runtime/interrupt.c | 2 +- src/runtime/thread.c | 66 +++++++++++++++++++++++++------ src/runtime/thread.h | 2 +- tests/fcb-threads.c | 40 +++++++++++++++++++ tests/fcb-threads.impure.lisp | 73 +++++++++++++++++++++++++++++++++++ 10 files changed, 187 insertions(+), 20 deletions(-) create mode 100644 tests/fcb-threads.c create mode 100644 tests/fcb-threads.impure.lisp diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index 316ed59472..bf1eb9deea 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -295,11 +295,16 @@ the alien callback for that function with the given alien type." (in-package "SB-THREAD") #+sb-thread (defun enter-foreign-callback (index return arguments) - (let ((thread (without-gcing - ;; Hold off GCing until *current-thread* is set up - (let ((thread (make-foreign-thread :name "foreign callback"))) - (init-thread-local-storage thread) - thread)))) + ;; Deferrable signals are blocked. + ;; STOP_FOR_GC is not blocked, but it can't occur because GC could only send + ;; it after acquiring the all_threads lock, which it can't get because + ;; this thread is holding the lock. + (let ((thread *foreign-thread*)) + (init-thread-local-storage thread) + (setq *foreign-thread* (make-foreign-thread)) ; "Pay it forward" + ;; The all_threads lock acts both as an inhibitor of stop-the-world + ;; and a guard on the preallocated thread instance. + (alien-funcall (extern-alien "release_all_threads_lock" (function void))) (dx-flet ((enter () (sb-alien::enter-alien-callback index return arguments))) (new-lisp-thread-trampoline thread nil #'enter nil)))) diff --git a/src/code/save.lisp b/src/code/save.lisp index 063fb6cd53..413f244cd9 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -73,6 +73,7 @@ '#(sb-impl::*exit-lock* sb-thread::*make-thread-lock* sb-thread::*initial-thread* + sb-thread::*foreign-thread* sb-thread::*all-threads* sb-thread::*session* sb-kernel::*gc-epoch*)) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index d9c8fa855b..90755d9fb4 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -265,6 +265,9 @@ created and old ones may exit at any time." (int-sap 0)) (sb-ext:define-load-time-global *initial-thread* nil) +;;; Always keep one preallocated foreign thread instance so that a non-lisp thread +;;; doesn't need to cons anything prior to release of the all_threads lock. +(sb-ext:define-load-time-global *foreign-thread* (make-foreign-thread)) (sb-ext:define-load-time-global *make-thread-lock* nil) (defun init-main-thread () @@ -280,6 +283,7 @@ created and old ones may exit at any time." (setf (thread-primitive-thread thread) (current-thread-sap) (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) *initial-thread* thread) + (setq *foreign-thread* (make-foreign-thread)) (grab-mutex (thread-result-lock thread)) ;; Either *all-threads* is empty or it contains exactly one thread ;; in case we are in reinit since saving core with multiple diff --git a/src/code/thread.lisp b/src/code/thread.lisp index fb326d94b9..b4d6a13623 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -77,7 +77,8 @@ any time." (defstruct (foreign-thread (:copier nil) - (:include thread) + (:include thread (:name "foreign callback")) + (:constructor make-foreign-thread ()) (:conc-name "THREAD-")) "Type of native threads which are attached to the runtime as Lisp threads temporarily.") diff --git a/src/runtime/interr.h b/src/runtime/interr.h index bb83b7b58f..cf2a58f2f8 100644 --- a/src/runtime/interr.h +++ b/src/runtime/interr.h @@ -17,6 +17,7 @@ extern void lose(char *fmt, ...) __attribute__((format(printf,1,2))) // clang and gcc support this, MSVC doesn't #endif never_returns; +extern void tprintf(char *fmt, ...); extern boolean lose_on_corruption_p; extern void corruption_warning_and_maybe_lose(char *fmt, ...); extern void enable_lossage_handler(void); diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 0d5602c6d4..081cdd483c 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1429,7 +1429,7 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, (lispobj)fixnum_value(thread->state)); } - set_thread_state(thread,STATE_STOPPED); + set_thread_state(thread, STATE_STOPPED, 0); FSHOW_SIGNAL((stderr,"suspended\n")); /* While waiting for gc to finish occupy ourselves with zeroing diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 139a4c360a..c83fd399a8 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -127,11 +127,14 @@ thread_state(struct thread *thread) } void -set_thread_state(struct thread *thread, lispobj state) +set_thread_state(struct thread *thread, lispobj state, + boolean signals_already_blocked) // for foreign thread { int i, waitcount = 0; sigset_t old; - block_blockable_signals(&old); + // If we've already masked the blockable signals we can avoid two syscalls here. + if (!signals_already_blocked) + block_blockable_signals(&old); os_sem_wait(thread->state_sem, "set_thread_state"); if (thread->state != state) { if ((STATE_STOPPED==state) || @@ -151,7 +154,8 @@ set_thread_state(struct thread *thread, lispobj state) thread->state = state; } os_sem_post(thread->state_sem, "set_thread_state"); - thread_sigmask(SIG_SETMASK, &old, NULL); + if (!signals_already_blocked) + thread_sigmask(SIG_SETMASK, &old, NULL); } void @@ -353,7 +357,8 @@ schedule_thread_post_mortem(struct thread *corpse) static void init_new_thread(struct thread *th, init_thread_data __attribute__((unused)) *scribble, - int guardp) + int guardp, + int retain_all_threads_lock) { int lock_ret; @@ -382,8 +387,10 @@ init_new_thread(struct thread *th, lock_ret = pthread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); link_thread(th); - lock_ret = pthread_mutex_unlock(&all_threads_lock); - gc_assert(lock_ret == 0); + if (!retain_all_threads_lock) { + lock_ret = pthread_mutex_unlock(&all_threads_lock); + gc_assert(lock_ret == 0); + } /* Kludge: Changed the order of some steps between the safepoint/ * non-safepoint versions of this code. Can we unify this more? @@ -420,10 +427,14 @@ undo_init_new_thread(struct thread *th, #else /* Block GC */ block_blockable_signals(0); - set_thread_state(th, STATE_DEAD); + /* This state change serves to "acknowledge" any stop-the-world + * signal received while the STOP_FOR_GC signal is blocked */ + set_thread_state(th, STATE_DEAD, 1); /* SIG_STOP_FOR_GC is blocked and GC might be waiting for this - * thread, but since we are already dead it won't wait long. */ + * thread, but since we are either exiting lisp code as a lisp + * thread that is dying, or exiting lisp code to return to + * former status as a C thread, it won't wait long. */ lock_ret = pthread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); @@ -489,7 +500,7 @@ void* new_thread_trampoline(void* arg) lispobj function = th->no_tls_value_marker; th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; - init_new_thread(th, &scribble, 1); + init_new_thread(th, &scribble, 1, 0); result = funcall0(function); undo_init_new_thread(th, &scribble); @@ -570,7 +581,8 @@ attach_os_thread(init_thread_data *scribble) th->control_stack_end = (void *) (((uintptr_t) stack_addr) + stack_size); #endif - init_new_thread(th, scribble, 0); + init_new_thread(th, scribble, 0, 1); + th->os_kernel_tid = sb_GetTID(); uword_t stacksize = (uword_t) th->control_stack_end - (uword_t) th->control_stack_start; @@ -592,6 +604,28 @@ detach_os_thread(init_thread_data *scribble) #else pthread_setspecific(lisp_thread, (void *)0); #endif + + /* We have to clear a STOP_FOR_GC signal if pending. Consider: + * - on entry to undo_init_new_thread, we block all signals + * - simultaneously some other thread decides that it needs to initiate a GC + * - that thread observes that this thread exists in all_threads and sends + * STOP_FOR_GC, so it becomes pending but undeliverable in this thread + * - immediately after blocking signals, we change state to DEAD, + * which allows the GCing thread to ignore this thread + * (it sees the state change criterion as having been satisfied) + * - the GCing thread releases the all_threads lock + * - this thread acquires the lock and removes itself from all_threads, + * and indicates that it is no longer a lisp thread + * - but STOP_FOR_GC is pending because it was in the blocked set. + * Bad things happen unless we clear the pending GC signal. + */ + sigset_t pending; + sigpending(&pending); + if (sigismember(&pending, SIG_STOP_FOR_GC)) { + int sig, rc; + rc = sigwait(&gc_sigset, &sig); + gc_assert(rc == 0 && sig == SIG_STOP_FOR_GC); + } thread_sigmask(SIG_SETMASK, &scribble->oldset, 0); free_thread_struct(th); } @@ -648,6 +682,14 @@ callback_wrapper_trampoline( #endif } } + +// Balance out the mutex_lock in attach_os_thread() +void release_all_threads_lock() +{ + if (pthread_mutex_unlock(&all_threads_lock)) + lose("ENTER-FOREIGN-CALLBACK bug"); +} + #endif /* LISP_FEATURE_SB_THREAD */ /* this is called from any other thread to create the new one, and @@ -987,7 +1029,7 @@ void gc_stop_the_world() FSHOW_SIGNAL((stderr,"/gc_stop_the_world:got create_thread_lock\n")); FSHOW_SIGNAL((stderr,"/gc_stop_the_world:waiting on lock\n")); /* keep threads from starting while the world is stopped. */ - lock_ret = pthread_mutex_lock(&all_threads_lock); \ + lock_ret = pthread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); FSHOW_SIGNAL((stderr,"/gc_stop_the_world:got lock\n")); @@ -1047,7 +1089,7 @@ void gc_start_the_world() } FSHOW_SIGNAL((stderr, "/gc_start_the_world: resuming %lu\n", p->os_thread)); - set_thread_state(p, STATE_RUNNING); + set_thread_state(p, STATE_RUNNING, 0); } } } diff --git a/src/runtime/thread.h b/src/runtime/thread.h index dea94f12e9..80a888e77f 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -29,7 +29,7 @@ #ifdef LISP_FEATURE_SB_THREAD lispobj thread_state(struct thread *thread); -void set_thread_state(struct thread *thread, lispobj state); +void set_thread_state(struct thread *thread, lispobj state, boolean); void wait_for_thread_state_change(struct thread *thread, lispobj state); #ifdef LISP_FEATURE_GCC_TLS diff --git a/tests/fcb-threads.c b/tests/fcb-threads.c new file mode 100644 index 0000000000..1a005eb902 --- /dev/null +++ b/tests/fcb-threads.c @@ -0,0 +1,40 @@ +#include +#include + +struct thread_arg { void * funkyfun; int index; int n_calls; }; + +void* doThatThing(void* void_arg) +{ + struct thread_arg* arg = void_arg; + int (*lispfun)(char*,double) = arg->funkyfun; + int i; + for(i=0; in_calls; ++i) { + lispfun("Hello", arg->index + i); + } + return 0; +} + +int call_thing_from_threads(void* ptr, int n_threads, int n_calls) +{ + struct { + pthread_t pthread_id; + struct thread_arg arg; + void* result; + } threads[50]; + if (n_threads>50) { + fprintf(stderr, "pick a smaller number\n"); + return -1; + } + int i; + for(i=0; i Date: Wed, 8 Jul 2020 02:04:31 -0400 Subject: [PATCH 0204/4023] Speed up foreign-callback entry by 35x or more. 'perf stat' using a modification of the test in 'fcb-threads.impure': Before: 6.171897540 seconds time elapsed 2.059880000 seconds user 11.475194000 seconds sys After: 0.171410396 seconds time elapsed 0.291904000 seconds user 0.307423000 seconds sys --- src/code/gc.lisp | 1 + src/runtime/thread.c | 103 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 90 insertions(+), 14 deletions(-) diff --git a/src/code/gc.lisp b/src/code/gc.lisp index d844c8309d..b834367eeb 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -266,6 +266,7 @@ statistics are appended to it." ;; dying thread, so we still need the guard for that, but not ;; the guard for whether interupts are enabled. (when (sb-thread:thread-alive-p sb-thread:*current-thread*) + #+sb-thread (alien-funcall (extern-alien "empty_thread_recyclebin" (function void))) (let ((threadp #+sb-thread (%instancep sb-impl::*finalizer-thread*))) (when threadp ;; It's OK to frob a condition variable regardless of diff --git a/src/runtime/thread.c b/src/runtime/thread.c index c83fd399a8..d1b74d279a 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -373,10 +373,18 @@ init_new_thread(struct thread *th, } th->os_thread=thread_self(); - if (guardp) + +#define GUARD_CONTROL_STACK 1 +#define GUARD_BINDING_STACK 2 +#define GUARD_ALIEN_STACK 4 + + if (guardp & GUARD_CONTROL_STACK) protect_control_stack_guard_page(1, NULL); - protect_binding_stack_guard_page(1, NULL); - protect_alien_stack_guard_page(1, NULL); + if (guardp & GUARD_BINDING_STACK) + protect_binding_stack_guard_page(1, NULL); + if (guardp & GUARD_ALIEN_STACK) + protect_alien_stack_guard_page(1, NULL); + /* Since GC can only know about this thread from the all_threads * list and we're just adding this thread to it, there is no * danger of deadlocking even with SIG_STOP_FOR_GC blocked (which @@ -500,7 +508,9 @@ void* new_thread_trampoline(void* arg) lispobj function = th->no_tls_value_marker; th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; - init_new_thread(th, &scribble, 1, 0); + init_new_thread(th, &scribble, + GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK, + 0); result = funcall0(function); undo_init_new_thread(th, &scribble); @@ -529,7 +539,48 @@ void* new_thread_trampoline_switch_stack(void* arg) { } #endif -static struct thread *create_thread_struct(lispobj); +static struct thread *create_thread_struct(void*,lispobj); + +static struct thread* recyclebin_threads; +static pthread_mutex_t recyclebin_lock = PTHREAD_MUTEX_INITIALIZER; +static struct thread* get_recyclebin_item() +{ + struct thread* result = 0; + int rc = pthread_mutex_lock(&recyclebin_lock); + gc_assert(!rc); + if (recyclebin_threads) { + result = recyclebin_threads; + recyclebin_threads = result->next; + } + pthread_mutex_unlock(&recyclebin_lock); + return result ? result->os_address : 0; +} +static void put_recyclebin_item(struct thread* th) +{ + int rc = pthread_mutex_lock(&recyclebin_lock); + gc_assert(!rc); + th->next = recyclebin_threads; + recyclebin_threads = th; + pthread_mutex_unlock(&recyclebin_lock); +} +void empty_thread_recyclebin() +{ + if (!recyclebin_threads) return; + sigset_t old; + block_deferrable_signals(&old); + int rc = pthread_mutex_trylock(&recyclebin_lock); + if (!rc) { // no big deal if already locked (recursive GC?) + struct thread* this = recyclebin_threads; + while (this) { + struct thread* next = this->next; + free_thread_struct(this); + this = next; + } + recyclebin_threads = 0; + pthread_mutex_unlock(&recyclebin_lock); + } + thread_sigmask(SIG_SETMASK, &old, 0); +} void attach_os_thread(init_thread_data *scribble) @@ -537,8 +588,10 @@ attach_os_thread(init_thread_data *scribble) os_thread_t os = pthread_self(); odxprint(misc, "attach_os_thread: attaching to %p", os); - struct thread *th = create_thread_struct(NO_TLS_VALUE_MARKER_WIDETAG); block_deferrable_signals(&scribble->oldset); + void* recycled_memory = get_recyclebin_item(); + struct thread *th = create_thread_struct(recycled_memory, + NO_TLS_VALUE_MARKER_WIDETAG); #ifndef LISP_FEATURE_SB_SAFEPOINT /* new-lisp-thread-trampoline doesn't like when the GC signal is blocked */ @@ -581,7 +634,11 @@ attach_os_thread(init_thread_data *scribble) th->control_stack_end = (void *) (((uintptr_t) stack_addr) + stack_size); #endif - init_new_thread(th, scribble, 0, 1); + init_new_thread(th, scribble, + /* recycled memory already had mprotect() done, + * so avoid 2 syscalls when possible */ + recycled_memory ? 0 : GUARD_BINDING_STACK|GUARD_ALIEN_STACK, + 1); th->os_kernel_tid = sb_GetTID(); uword_t stacksize @@ -626,8 +683,8 @@ detach_os_thread(init_thread_data *scribble) rc = sigwait(&gc_sigset, &sig); gc_assert(rc == 0 && sig == SIG_STOP_FOR_GC); } + put_recyclebin_item(th); thread_sigmask(SIG_SETMASK, &scribble->oldset, 0); - free_thread_struct(th); } #if defined(LISP_FEATURE_X86_64) && !defined(LISP_FEATURE_WIN32) @@ -736,7 +793,7 @@ void release_all_threads_lock() */ static struct thread * -create_thread_struct(lispobj start_routine) { +create_thread_struct(void* spaces, lispobj start_routine) { #if defined(LISP_FEATURE_SB_THREAD) || defined(LISP_FEATURE_WIN32) unsigned int i; #endif @@ -749,9 +806,18 @@ create_thread_struct(lispobj start_routine) { * on the alignment passed from os_validate, since that might * assume the current (e.g. 4k) pagesize, while we calculate with * the biggest (e.g. 64k) pagesize allowed by the ABI. */ - void *spaces = os_validate(MOVABLE|IS_THREAD_STRUCT, NULL, THREAD_STRUCT_SIZE); - if(!spaces) - return NULL; + boolean zeroize_stack_top = 0; + if (spaces) { + // If reusing memory from a previously exited thread, start by removing + // some old junk from the stack. This is imperfect since we only clear a little + // at the top, but doing so enables diagnosing some garbage-retention issues + // using a fine-toothed comb. It would not be possible at all to diagnose + // if any newly started thread could refer a dead thread's heap objects. + zeroize_stack_top = 1; + } else { + spaces = os_validate(MOVABLE|IS_THREAD_STRUCT, NULL, THREAD_STRUCT_SIZE); + if (!spaces) return NULL; + } /* Aligning up is safe as THREAD_STRUCT_SIZE has * THREAD_ALIGNMENT_BYTES padding. */ char *aligned_spaces = PTR_ALIGN_UP(spaces, THREAD_ALIGNMENT_BYTES); @@ -792,6 +858,15 @@ create_thread_struct(lispobj start_routine) { th->binding_stack_start= (lispobj*)((char*)th->control_stack_start+thread_control_stack_size); th->control_stack_end = th->binding_stack_start; + + // This is a little wasteful of cycles to pre-zero the pthread overhead (which in glibc + // resides at the highest stack addresses) comprising about 5kb, below which is the lisp + // stack. We don't need to zeroize above the lisp stack end, but we don't know exactly + // where that will be. Zeroizing more than necessary is conservative, and helps ensure + // that garbage retention from reused stacks does not pose a huge problem. + if (zeroize_stack_top) + memset((char*)th->control_stack_end - 16384, 0, 16384); + th->control_stack_guard_page_protected = T; th->alien_stack_start= (lispobj*)((char*)th->binding_stack_start+BINDING_STACK_SIZE); @@ -910,7 +985,7 @@ create_thread_struct(lispobj start_routine) { } void create_main_lisp_thread(lispobj initial_function) { - struct thread *th = create_thread_struct(initial_function); + struct thread *th = create_thread_struct(0, initial_function); #if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) pthread_key_create(&lisp_thread, 0); #endif @@ -996,7 +1071,7 @@ os_thread_t create_thread(lispobj start_routine) { * linking it to all_threads can be left to the thread itself * without fear of gc lossage. 'start_routine' violates this * assumption and must stay pinned until the child starts up. */ - th = create_thread_struct(start_routine); + th = create_thread_struct(0, start_routine); if (th && !create_os_thread(th, &kid_tid)) { free_thread_struct(th); kid_tid = 0; From cdc5a0820c0275da133a32a61e671f6c25e7a470 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 8 Jul 2020 14:37:34 +0300 Subject: [PATCH 0205/4023] Fix win32. --- src/runtime/thread.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index d1b74d279a..39da3e80f4 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -676,6 +676,7 @@ detach_os_thread(init_thread_data *scribble) * - but STOP_FOR_GC is pending because it was in the blocked set. * Bad things happen unless we clear the pending GC signal. */ +#ifndef LISP_FEATURE_SB_SAFEPOINT sigset_t pending; sigpending(&pending); if (sigismember(&pending, SIG_STOP_FOR_GC)) { @@ -683,6 +684,7 @@ detach_os_thread(init_thread_data *scribble) rc = sigwait(&gc_sigset, &sig); gc_assert(rc == 0 && sig == SIG_STOP_FOR_GC); } +#endif put_recyclebin_item(th); thread_sigmask(SIG_SETMASK, &scribble->oldset, 0); } From 8112e9d738b8d1536afb275306828b5f00053b89 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 8 Jul 2020 15:33:19 +0300 Subject: [PATCH 0206/4023] #+linux sb-thread::thread-os-tid --- tests/fcb-threads.impure.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index ee2661bfcf..ee1a91c0fb 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -30,9 +30,9 @@ (unless cell (let* ((thr sb-thread:*current-thread*) (string - (format nil "~s from ~s (TID ~d Pthread ~x)~%" + (format nil "~s from ~s (~@[TID ~d~] Pthread ~x)~%" arg1 thr - (sb-thread::thread-os-tid thr) + (or #+linux (sb-thread::thread-os-tid thr)) (sb-thread::thread-primitive-thread thr)))) (sb-sys:with-pinned-objects (string) (sb-unix:unix-write 1 (sb-sys:vector-sap string) 0 (length string))) From dc77affeea95085ccb360d488a5faa2344b7b931 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 8 Jul 2020 17:40:11 +0300 Subject: [PATCH 0207/4023] Fix split-let with unused variables. Fixes lp#1886825 --- src/compiler/ir1opt.lisp | 20 ++++++++++++-------- tests/compiler-2.pure.lisp | 19 ++++++++++++++++++- tests/fcb-threads.impure.lisp | 2 +- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 8a1402bdc1..6987e9722f 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -803,13 +803,17 @@ (call (and ref (node-lvar ref) (lvar-dest (node-lvar ref)))) - (vars (lambda-vars original-lambda))) + (all-vars (lambda-vars original-lambda))) (when (and call - (eq var (car (last vars))) - (notany #'lambda-var-specvar vars)) + (eq var (car (last all-vars))) + (notany #'lambda-var-specvar all-vars)) (or (= (count-if #'identity (combination-args call)) 1) (with-ir1-environment-from-node call - (let* ((penultimate (lvar-uses (car (last (combination-args call) 2)))) + (let* ((all-args (combination-args call)) + (penultimate-arg (find-if #'identity all-args + :from-end t + :end (1- (length all-args)))) + (penultimate (lvar-uses penultimate-arg)) (penultimate (if (consp penultimate) (car penultimate) penultimate)) @@ -820,7 +824,7 @@ :pred (block-pred next-block) :succ (list next-block))) (bind (make-bind)) - (vars (butlast vars)) + (vars (butlast all-vars)) (lambda (make-lambda :vars vars :kind :let :bind bind @@ -828,11 +832,11 @@ :%source-name 'split :%debug-name `(split ,(lambda-%debug-name original-lambda)))) (ref (make-ref lambda)) - (args (butlast (combination-args call)))) + (args (butlast all-args))) (push lambda (lambda-lets (lambda-home original-lambda))) (push ref (lambda-refs lambda)) - (setf (combination-args call) (last (combination-args call))) - (setf (lambda-vars original-lambda) (last (lambda-vars original-lambda)) + (setf (combination-args call) (last all-args)) + (setf (lambda-vars original-lambda) (last all-vars) (lambda-tail-set lambda) (make-tail-set :funs (list lambda))) (setf (bind-lambda bind) lambda) (loop for var in vars diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index fdb54e14c0..e60afd72bd 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -2913,4 +2913,21 @@ `(lambda (x) (inline-recursive x) (inline-recursive x)) - ((5) 0))) + ((5) 0))) + +(with-test (:name :split-let-unused-vars) + (checked-compile-and-assert + () + `(lambda (x y) + (let ((a + (if x y)) + (b) + (c + (if y + x))) + (declare (ignore b)) + (if c (if a a c)))) + ((t t) t) + ((t nil) nil) + ((nil t) nil) + ((nil nil) nil))) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index ee1a91c0fb..0fc9bad0ca 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -11,7 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-(and sb-thread (not win32)) (sb-ext:exit :code 104) +#+(or (not sb-thread) win32 sb-safepoint) (sb-ext:exit :code 104) (with-scratch-file (solib "so") (sb-ext:run-program "/bin/sh" From c49d60e73914be45cd177f8e57fb9499ee4e4465 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 8 Jul 2020 11:57:43 -0400 Subject: [PATCH 0208/4023] Make fcb-threads test pass for #+sb-safepoint --- src/code/alien-callback.lisp | 27 +++++++++++++++++---------- src/code/target-thread.lisp | 6 +++--- src/runtime/thread.c | 12 +++++++++++- tests/fcb-threads.impure.lisp | 2 +- 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index bf1eb9deea..7094cc349c 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -295,16 +295,23 @@ the alien callback for that function with the given alien type." (in-package "SB-THREAD") #+sb-thread (defun enter-foreign-callback (index return arguments) - ;; Deferrable signals are blocked. - ;; STOP_FOR_GC is not blocked, but it can't occur because GC could only send - ;; it after acquiring the all_threads lock, which it can't get because - ;; this thread is holding the lock. - (let ((thread *foreign-thread*)) - (init-thread-local-storage thread) - (setq *foreign-thread* (make-foreign-thread)) ; "Pay it forward" - ;; The all_threads lock acts both as an inhibitor of stop-the-world - ;; and a guard on the preallocated thread instance. - (alien-funcall (extern-alien "release_all_threads_lock" (function void))) + (let ((thread + #+sb-safepoint ; cons a FOREIGN-THREAD + (without-gcing (init-thread-local-storage (make-foreign-thread))) + + ;; Deferrable signals are blocked. STOP_FOR_GC is not blocked but can't + ;; occur because GC could only send it after acquiring the all_threads lock, + ;; which it can't get because this thread owns it for the moment. + #-sb-safepoint ; use the preallocated FOREIGN-THREAD + (let ((thread (init-thread-local-storage *foreign-thread*))) + ;; GC would be ok to happen now, but it can't yet because of the + ;; all_threads_lock acting both as a guard on the preallocated thread + ;; and the stop-the-world inhibitor. + ;; There's no point in splitting that into two locks. + (setq *foreign-thread* (make-foreign-thread)) ; "Pay it forward" + (alien-funcall (extern-alien "release_all_threads_lock" + (function void))) + thread))) (dx-flet ((enter () (sb-alien::enter-alien-callback index return arguments))) (new-lisp-thread-trampoline thread nil #'enter nil)))) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 90755d9fb4..6d2989146f 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -267,7 +267,7 @@ created and old ones may exit at any time." (sb-ext:define-load-time-global *initial-thread* nil) ;;; Always keep one preallocated foreign thread instance so that a non-lisp thread ;;; doesn't need to cons anything prior to release of the all_threads lock. -(sb-ext:define-load-time-global *foreign-thread* (make-foreign-thread)) +(sb-ext:define-load-time-global *foreign-thread* nil) (sb-ext:define-load-time-global *make-thread-lock* nil) (defun init-main-thread () @@ -283,7 +283,7 @@ created and old ones may exit at any time." (setf (thread-primitive-thread thread) (current-thread-sap) (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) *initial-thread* thread) - (setq *foreign-thread* (make-foreign-thread)) + #-sb-safepoint (setq *foreign-thread* (make-foreign-thread)) (grab-mutex (thread-result-lock thread)) ;; Either *all-threads* is empty or it contains exactly one thread ;; in case we are in reinit since saving core with multiple @@ -2221,7 +2221,7 @@ mechanism for inter-thread communication." append `((sap-ref-lispobj sap ,index) ,form))) (setf *current-thread* thread)))) (expand))) - nil) + thread) (eval-when (:compile-toplevel) ;; Inform genesis of the index <-> symbol mapping made by DEFINE-THREAD-LOCAL diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 39da3e80f4..469f9cf89e 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -421,6 +421,7 @@ undo_init_new_thread(struct thread *th, * non-safepoint versions of this code. Can we unify this more? */ #ifdef LISP_FEATURE_SB_SAFEPOINT + block_blockable_signals(0); ensure_region_closed(&th->alloc_region, BOXED_PAGE_FLAG); #if defined(LISP_FEATURE_SB_SAFEPOINT_STRICTLY) && !defined(LISP_FEATURE_WIN32) @@ -432,7 +433,9 @@ undo_init_new_thread(struct thread *th, unlink_thread(th); lock_ret = pthread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); + #else + /* Block GC */ block_blockable_signals(0); /* This state change serves to "acknowledge" any stop-the-world @@ -453,6 +456,7 @@ undo_init_new_thread(struct thread *th, unlink_thread(th); pthread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); + #endif arch_os_thread_cleanup(th); @@ -634,11 +638,17 @@ attach_os_thread(init_thread_data *scribble) th->control_stack_end = (void *) (((uintptr_t) stack_addr) + stack_size); #endif +#ifdef LISP_FEATURE_SB_SAFEPOINT + const int retain_lock = 0; +#else + const int retain_lock = 1; +#endif init_new_thread(th, scribble, /* recycled memory already had mprotect() done, * so avoid 2 syscalls when possible */ recycled_memory ? 0 : GUARD_BINDING_STACK|GUARD_ALIEN_STACK, - 1); + retain_lock); + th->os_kernel_tid = sb_GetTID(); uword_t stacksize diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 0fc9bad0ca..de6e3906a8 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -11,7 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#+(or (not sb-thread) win32 sb-safepoint) (sb-ext:exit :code 104) +#+(or (not sb-thread) win32) (sb-ext:exit :code 104) (with-scratch-file (solib "so") (sb-ext:run-program "/bin/sh" From 67fe1b8fd67c9b40972c5abc603b81fb3ed779c1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 8 Jul 2020 20:56:33 +0300 Subject: [PATCH 0209/4023] github: bump dynamic-space-size when building on windows. --- .github/workflows/windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index f57d241c88..d6e03d1721 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -17,7 +17,7 @@ jobs: env: SBCL_HOME: "/c/Program Files/Steel Bank Common Lisp/1.4.14" run: | - bash ./make.sh --xc-host='sbcl --dynamic-space-size 500MB --lose-on-corruption --disable-ldb --disable-debugger' + bash ./make.sh --xc-host='sbcl --lose-on-corruption --disable-ldb --disable-debugger' - name: make installer run: | bash ./make-windows-installer.sh From e2789126bff30f8df30b0d2e9fcd6763c9b5d79e Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 8 Jul 2020 21:26:46 +0300 Subject: [PATCH 0210/4023] Fix vzeroupper, vzeroall encoding. Reported by Shubhamkar Ayare --- src/compiler/x86-64/avx2-insts.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/x86-64/avx2-insts.lisp b/src/compiler/x86-64/avx2-insts.lisp index 0a050acb32..21789ee02e 100644 --- a/src/compiler/x86-64/avx2-insts.lisp +++ b/src/compiler/x86-64/avx2-insts.lisp @@ -895,13 +895,13 @@ (define-instruction vzeroupper (segment) (:printer vex2-op ((op #x77) (l 0) (r 1) (pp 0))) (:emitter - (emit-two-byte-vex segment 0 #b1111 0 nil) + (emit-two-byte-vex segment 0 0 0 nil) (emit-byte segment #x77))) (define-instruction vzeroall (segment) (:printer vex2-op ((op #x77) (l 1) (r 1) (pp 0))) (:emitter - (emit-two-byte-vex segment 0 #b1111 1 nil) + (emit-two-byte-vex segment 0 0 1 nil) (emit-byte segment #x77))) (macrolet ((def (name opcode &optional l (mem-size :qword)) From e802114ba645a3cb8dfa233ae67ac82a18dcefc0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 8 Jul 2020 16:00:43 -0400 Subject: [PATCH 0211/4023] Apply a mixed bag of small fixes The only unusual one is that if gc_assert() -> ((void)0) due to NDEBUG, the expression "int rc = pthread_mutex_lock()" can get a warning about an unused variable, but writing it on two lines doesn't. --- src/code/target-thread.lisp | 1 + src/runtime/thread.c | 8 +++++--- tests/fcb-threads.c | 3 ++- tests/fcb-threads.impure.lisp | 16 +++++++++++----- tests/run-program.impure.lisp | 4 +++- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 6d2989146f..3454a2a759 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -380,6 +380,7 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." #+sb-futex (progn + (export 'futex-wake) ; for naughty users only (declaim (inline futex-wait %futex-wait futex-wake)) (define-alien-routine ("futex_wait" %futex-wait) int diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 469f9cf89e..e32b441b6e 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -550,7 +550,8 @@ static pthread_mutex_t recyclebin_lock = PTHREAD_MUTEX_INITIALIZER; static struct thread* get_recyclebin_item() { struct thread* result = 0; - int rc = pthread_mutex_lock(&recyclebin_lock); + int rc; + rc = pthread_mutex_lock(&recyclebin_lock); gc_assert(!rc); if (recyclebin_threads) { result = recyclebin_threads; @@ -561,7 +562,8 @@ static struct thread* get_recyclebin_item() } static void put_recyclebin_item(struct thread* th) { - int rc = pthread_mutex_lock(&recyclebin_lock); + int rc; + rc = pthread_mutex_lock(&recyclebin_lock); gc_assert(!rc); th->next = recyclebin_threads; recyclebin_threads = th; @@ -665,7 +667,7 @@ detach_os_thread(init_thread_data *scribble) undo_init_new_thread(th, scribble); - odxprint(misc, "deattach_os_thread: detached"); + odxprint(misc, "detach_os_thread: detached"); #ifdef LISP_FEATURE_GCC_TLS is_lisp_thread = 0; #else diff --git a/tests/fcb-threads.c b/tests/fcb-threads.c index 1a005eb902..b930a40d11 100644 --- a/tests/fcb-threads.c +++ b/tests/fcb-threads.c @@ -34,7 +34,8 @@ int call_thing_from_threads(void* ptr, int n_threads, int n_calls) } for(i=0; i Date: Wed, 8 Jul 2020 18:07:41 -0400 Subject: [PATCH 0212/4023] Rewrite finalizer test --- tests/finalize.impure.lisp | 112 ++++++++++++++++++++++++++++++ tests/finalize.test.sh | 136 ------------------------------------- 2 files changed, 112 insertions(+), 136 deletions(-) create mode 100644 tests/finalize.impure.lisp delete mode 100755 tests/finalize.test.sh diff --git a/tests/finalize.impure.lisp b/tests/finalize.impure.lisp new file mode 100644 index 0000000000..cf43d5d5c4 --- /dev/null +++ b/tests/finalize.impure.lisp @@ -0,0 +1,112 @@ +#+interpreter (sb-ext:exit :code 104) + +(defvar *tmp* 0.0) ; don't remove - used by the setq below +(defglobal *count* 0) +(declaim (fixnum *count*)) + +(defun foo (_) + (declare (ignore _)) + nil) + +(defglobal *maxdepth* 0) +;; Be gentler on 32-bit platforms +(defglobal *n-finalized-things* #+64-bit 20000 #-64-bit 10000) +(defglobal *weak-pointers* nil) + +#+sb-thread ; Check that we do want to start a thread, and it hasn't been started. +(assert (eq sb-impl::*finalizer-thread* t)) + +(defun makejunk (_) + (declare (ignore _)) + (let ((x (gensym))) + (push (make-weak-pointer x) *weak-pointers*) + (finalize x (lambda () + (setq *maxdepth* + (max sb-kernel:*free-interrupt-context-index* + *maxdepth*)) + ;; cons 320K in the finalizer for #+64-bit, + ;; or 80K for #-64-bit + (setf *tmp* (make-list #+64-bit 20000 + #-64-bit 10000)) + (sb-ext:atomic-incf *count*))) + x)) +(compile 'makejunk) + +(defun scrubstack () + (sb-int:dx-let ((b (make-array 20))) (eval b)) + (sb-sys:scrub-control-stack)) + +(defun run-consy-thing () + (dotimes (iter 10) + (let ((junk (mapcar #'makejunk + (make-list (/ *n-finalized-things* 10))))) + (setf junk (foo junk)) + (foo junk)) + (scrubstack) + (gc :full t))) + +; no threads - hope for the best with respect to conservative root retention +#-sb-thread (run-consy-thing) + +#+sb-thread +(progn + (sb-thread:join-thread (sb-thread:make-thread #'run-consy-thing)) + (gc :full t)) ; one more time to clean everything up + +;;; Verify that the thread was started. +#+sb-thread +(with-test (:name :finalizer-thread-started) + (assert (typep sb-impl::*finalizer-thread* 'sb-thread::thread)) + ;; We're going to assert on an approximate count of finalizers that ran, + ;; which is a bit sketchy. + ;; So call SCAN-FINALIZERS which actually does the work of helping out + ;; the finalizer thread. RUN-PENDING-FINALIZERS is not enough - it would just kick + ;; the thread and return right away, failing our requirement for being synchronous. + ;; Also, there's no reason to pre- or post-check how may finalizer are pending + ;; right now- it may be all of them, none of them, or anything in between, + ;; depending on what the thread has gotten to so far. + ;; This also shows that it works to run finalization actions in two threads - + ;; the finalizer thread and this. Hence the need for ATOMIC-INCF on *count*. + (sb-impl::scan-finalizers) + + ;; Make sure the thread is done. + ;; This JOIN-THREADs it, so we know it's not executing. + (sb-impl::finalizer-thread-stop)) + +;;; This was failing with something like: +;;; The assertion (<= *MAXDEPTH* 1) failed with *MAXDEPTH* = 232. +;;; The test parameters for 64-bit are quite severe, but should not exhaust the heap. +(with-test (:name :finalizers-dont-nest-garbage-collections) + (assert (<= *maxdepth* 1))) + +;;; Regardless of anything else, check representational invariants. +;;; - each ID in the id-recycle-list is not a value in the hash-table +;;; - each value in the hash-table is not in the id-recycle-list +(with-test (:name :finalizer-id-uniqueness) + (let* ((hash-table (elt sb-impl::**finalizer-store** 1)) + (used-ids (loop for v being each hash-value of hash-table + collect v)) + (available-ids (cdr (elt sb-impl::**finalizer-store** 0)))) + (assert (null (intersection used-ids available-ids))))) + +(with-test (:name :finalizers-ran) + ;; expect that 97% of the finalizers ran + (assert (>= *count* (* *n-finalized-things* 97/100))) + (unless (= *count* *n-finalized-things*) + ;; show how the junk was reachable + (search-roots *weak-pointers* :print :verbose))) + +;;; For finalizers that didn't run (if any), we had better find +;;; that the object still exists in *weak-pointers*. +;;; Conversely, for each intact weak pointer, there had better be +;;; a finalizer for that object. +(with-test (:name :finalizer-state) + (setq *weak-pointers* + (delete-if (lambda (x) (null (weak-pointer-value x))) + *weak-pointers*)) + (let ((hash-table (elt sb-impl::**finalizer-store** 1))) + (loop for k being each hash-key of hash-table + when (and (symbolp k) (not (symbol-package k))) + do (assert (find k *weak-pointers* :key #'weak-pointer-value))) + (dolist (wp *weak-pointers*) + (assert (gethash (weak-pointer-value wp) hash-table))))) diff --git a/tests/finalize.test.sh b/tests/finalize.test.sh deleted file mode 100755 index 07ebd42ca4..0000000000 --- a/tests/finalize.test.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/bin/sh -# -# This test is as convoluted as it is to avoid having failing tests -# hang the test-suite, as the typical failure mode used to be SBCL -# hanging uninterruptible in GC. - -. ./subr.sh - -use_test_subdirectory - -echo //entering finalize.test.sh - -# $! is not set correctly when calling run_sbcl, do it directly -"$SBCL_RUNTIME" --core "$SBCL_CORE" $SBCL_ARGS < /dev/null & -(defvar *tmp* 0.0) ; don't remove - used by the setq below -(defglobal *count* 0) -(declaim (fixnum *count*)) - -(defun foo (_) - (declare (ignore _)) - nil) - -(defglobal *maxdepth* 0) -;; Be gentler on 32-bit platforms -(defglobal *n-finalized-things* #+64-bit 20000 #-64-bit 10000) -(defglobal *weak-pointers* nil) - -#+sb-thread ; Check that we do want to start a thread, and it hasn't been started. -(assert (eq sb-impl::*finalizer-thread* t)) - -(defun makejunk (_) - (declare (ignore _)) - (let ((x (gensym))) - (push (make-weak-pointer x) *weak-pointers*) - (finalize x (lambda () - (setq *maxdepth* - (max sb-kernel:*free-interrupt-context-index* - *maxdepth*)) - ;; cons 320K in the finalizer for #+64-bit, - ;; or 80K for #-64-bit - (setf *tmp* (make-list #+64-bit 20000 - #-64-bit 10000)) - (sb-ext:atomic-incf *count*))) - x)) -(compile 'makejunk) - -(defun scrubstack () - (sb-int:dx-let ((b (make-array 20))) (eval b)) - (sb-sys:scrub-control-stack)) - -(defun run-consy-thing () - (dotimes (iter 10) - (let ((junk (mapcar #'makejunk - (make-list (/ *n-finalized-things* 10))))) - (setf junk (foo junk)) - (foo junk)) - (scrubstack) - (gc :full t))) - -; no threads - hope for the best with respect to conservative root retention -#-sb-thread (run-consy-thing) - -#+sb-thread -(progn - (sb-thread:join-thread (sb-thread:make-thread #'run-consy-thing)) - (gc :full t) ; one more time to clean everything up - ;; Verify that the thread was started. - (unless (typep sb-impl::*finalizer-thread* 'sb-thread::thread) - (with-open-file (*standard-output* "finalize-test-failed" :direction :output) - (format t "No finalizer thread - how can this happen?") - (print sb-impl::**finalizer-store**) - (terpri) - (format t "Culled values:") - (print (sb-impl::hash-table-culled-values (svref sb-impl::**finalizer-store** 1))) - (terpri)) - (sb-ext:quit)) - ;; We're asserting on an exact count of finalizers that ran, which is a bit sketchy. - ;; It would mostly be fine to that is within some fudge factor of the expected number, - ;; however, the purpose of this "stress test" is to verify that we don't miss any - ;; any finalizations when under stress. - ;; So to do that, call SCAN-FINALIZERS which actually does the work of helping out - ;; the finalizer thread. RUN-PENDING-FINALIZERS is not enough - it would just kick - ;; the thread and return right away, failing our requirement for being synchronous. - ;; Also, there's no reason to pre- or post-check how may finalizer are pending - ;; right now- it may be all of them, none of them, or anything in between, - ;; depending on what the thread has gotten to so far. - ;; This also shows that it works to run finalization actions in two threads - - ;; the finalizer thread and this. Hence the need for ATOMIC-INCF on *count*. - (sb-impl::scan-finalizers)) - -;;; This was failing with something like: -;;; The assertion (<= *MAXDEPTH* 1) failed with *MAXDEPTH* = 232. -;;; The test parameters for 64-bit are quite severe, but should not exhaust the heap. -(assert (<= *maxdepth* 1)) - -(if (or (= *count* *n-finalized-things*) - ;; allow some slop for non-thread because the stack might pin some junk - (and (not (member :sb-thread *features*)) - (>= *count* (- *n-finalized-things* 2)))) - (with-open-file (f "finalize-test-passed" :direction :output) - (format f "OK - ran ~d finalizers~%" *count*)) - (with-open-file (f "finalize-test-failed" :direction :output) - (format f "OOPS: ~A (threads=~A)~%" *count* (or #+sb-thread "yes" "no")) - (sb-kernel:run-pending-finalizers) - (format f "After sb-kernel:run-pending-finalizers: ~A~%" *count*) - (let ((*standard-output* f)) - (search-roots *weak-pointers* :print :verbose)))) - -(sb-ext:quit) -EOF - -SBCL_PID=$! -WAITED=x - -echo "Waiting for SBCL to finish stress-testing finalizers" -while true; do - if [ -f finalize-test-passed ]; then - cat finalize-test-passed - rm finalize-test-passed - exit $EXIT_TEST_WIN - elif [ -f finalize-test-failed ]; then - wait - cat finalize-test-failed - rm finalize-test-failed - exit $EXIT_LOSE - fi - sleep 1 - WAITED="x$WAITED" - if [ $WAITED = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ]; then - echo - echo "timeout, killing SBCL" - kill -9 $SBCL_PID - exit $EXIT_LOSE # Failure, SBCL probably hanging in GC - fi -done - From 040ab470a908d4862bba3b1adbc415b37db69dc4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 8 Jul 2020 18:10:48 -0400 Subject: [PATCH 0213/4023] Amend test manifest --- tests/input-manifest.lisp-expr | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index b1c3584d91..58920b5523 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -37,6 +37,7 @@ ("debug.impure.lisp" "tests/bug-414.lisp") ("defstruct.impure-cload.lisp" "tests/block-compile-defstruct-test.lisp") ("elfcore.test.sh" "src/runtime/shrinkwrap-sbcl") + ("fcb-threads.impure.lisp" "tests/fcb-threads.so") ("init.test.sh" "contrib/sb-introspect.fasl" "tests/custom-sysinit.lisp" From 49c80eac32944d9e461073ce74ef92aa184a7e55 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 9 Jul 2020 06:24:39 -0400 Subject: [PATCH 0214/4023] Make print-object on thread less evil Getting a join-thread error trying to print a thread to debug it, really? --- src/code/target-thread.lisp | 46 +++++++++++++++---------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 3454a2a759..459245bef2 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -178,35 +178,27 @@ a simple-string (not necessarily unique) or NIL.") (defmethod print-object ((thread thread) stream) (print-unreadable-object (thread stream :type t :identity t) - (let* ((cookie (list thread)) - ;; Hmm, state-change, mutex acquisition, and semantic problems - ;; all because of a goddamn print method? What the effing hell? - ;; You literally can't call this method in two threads at once - ;; without lock contention and risk of joining >1 time, - ;; which we don't treat as user error even though it is. - (info (if (thread-alive-p thread) - :running - (multiple-value-list - (join-thread thread :default cookie)))) - (state (if (eq :running info) - (let* ((thing (progn - (barrier (:read)) - (thread-waiting-for thread)))) - (typecase thing - (cons - (list "waiting on:" (cdr thing) - "timeout: " (car thing))) - (null - (list info)) - (t - (list "waiting on:" thing)))) - (if (eq cookie (car info)) - (list :aborted) - :finished))) - (values (when (eq :finished state) - info)) + (let* ((values (cond ((thread-alive-p thread) :running) + ;; don't call JOIN-THREAD, just read the result if ALIVE-P is NIL + ((listp (thread-result thread)) (thread-result thread)) + (t :aborted))) + (state (cond ((eq values :running) + (let* ((thing (progn + (barrier (:read)) + (thread-waiting-for thread)))) + (typecase thing + (null '(:running)) + (cons + (list "waiting on:" (cdr thing) + "timeout: " (car thing))) + (t + (list "waiting on:" thing))))) + ((eq values :aborted) '(:aborted)) + (t :finished))) (*print-level* 4)) (format stream + ;; if not finished, show the STATE as a list. + ;; if finished, show the VALUES. "~@[~S ~]~:[~{~I~A~^~2I~_ ~}~_~;~A~:[ no values~; values: ~:*~{~S~^, ~}~]~]" (thread-name thread) (eq :finished state) From 0aa603888690fdfd87b5a4a950596a44c57e20d8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 9 Jul 2020 06:42:25 -0400 Subject: [PATCH 0215/4023] Prevent JOIN-THREAD on foreign threads When the thread returns from lisp back to C, we say that it has finished which may or may not be true. And the result is NIL no matter what. So not only can't you get the value, there's no way to ensure that the pthread completed using our API in which THREAD-JOIN does not directly entail a pthread_join() on the underlying thread. --- src/code/alien-callback.lisp | 5 ++--- src/code/target-thread.lisp | 22 +++++++++++------- src/code/thread.lisp | 4 ++-- tests/fcb-threads.impure.lisp | 42 +++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index 7094cc349c..481618f315 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -312,6 +312,5 @@ the alien callback for that function with the given alien type." (alien-funcall (extern-alien "release_all_threads_lock" (function void))) thread))) - (dx-flet ((enter () - (sb-alien::enter-alien-callback index return arguments))) - (new-lisp-thread-trampoline thread nil #'enter nil)))) + (dx-let ((args (list index return arguments))) + (new-lisp-thread-trampoline thread nil #'sb-alien::enter-alien-callback args)))) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 459245bef2..29e265f09f 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -147,6 +147,10 @@ offending thread using THREAD-ERROR-THREAD.")) (format s "Joining thread timed out: thread ~A ~ did not exit in time." (thread-error-thread c))) + (:foreign + (format s "Joining thread failed: thread ~A ~ + is not a lisp thread." + (thread-error-thread c))) (:self-join (format s "In thread ~A, attempt to join the current ~ thread." @@ -1603,8 +1607,7 @@ session." ;; *ALLOC-SIGNAL* is made thread-local by create_thread_struct() ;; so this assigns into TLS, not the global value. (setf sb-vm:*alloc-signal* *default-alloc-signal*) - (with-mutex ((thread-result-lock thread)) - (let ((old *all-threads*)) + (let ((old *all-threads*)) (loop (let ((addr (get-lisp-obj-address sb-vm:*control-stack-start*))) ;; If ADDR exists, then we have a bug in the thread exit handler. @@ -1613,8 +1616,8 @@ session." (aver (not (avl-find addr old))) (let ((new (avl-insert old addr thread))) (when (eq old (setq old (sb-ext:cas *all-threads* old new))) (return)))))) - (sb-ext:atomic-push thread (session-new-enrollees *session*)) - (when setup-sem + (sb-ext:atomic-push thread (session-new-enrollees *session*)) + (when setup-sem (signal-semaphore setup-sem) ;; setup-sem was dx-allocated, set it to NIL so that the ;; backtrace doesn't get confused @@ -1623,7 +1626,7 @@ session." ;; Using handling-end-of-the-world would be a bit tricky ;; due to other catches and interrupts, so we essentially ;; re-implement it here. Once and only once more. - (catch 'sb-impl::toplevel-catcher + (catch 'sb-impl::toplevel-catcher (catch 'sb-impl::%end-of-the-world (catch '%abort-thread (restart-bind ((abort @@ -1660,7 +1663,7 @@ session." (setq *interrupt-pending* nil) #+sb-thruption (setq *thruption-pending* nil) - (handle-thread-exit)))))))) + (handle-thread-exit))))))) ;; this returns to C, so return a single value 0) @@ -1729,8 +1732,9 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; As it is, this lambda must not cons until we are ;; ready to run GC. Be careful. (init-thread-local-storage thread) - (new-lisp-thread-trampoline thread setup-sem - function arguments))) + (with-mutex ((thread-result-lock thread)) + (new-lisp-thread-trampoline thread setup-sem + function arguments)))) ;; Holding mutexes or waiting on sempahores inside WITHOUT-GCING will lock up (aver (not *gc-inhibit*)) ;; Keep INITIAL-FUNCTION in the dynamic extent until the child @@ -1773,6 +1777,8 @@ subject to change." (let ((lock (thread-result-lock thread)) (got-it nil) (problem :timeout)) + (unless lock + (error 'join-thread-error :thread thread :problem :foreign)) (without-interrupts (unwind-protect (cond diff --git a/src/code/thread.lisp b/src/code/thread.lisp index b4d6a13623..432ceec274 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -56,7 +56,7 @@ in future versions." :type mutex :read-only t) (result-lock (make-mutex :name "thread result lock") - :type mutex :read-only t) + :type (or null mutex) :read-only t) waiting-for) (declaim (inline thread-alive-p)) @@ -77,7 +77,7 @@ any time." (defstruct (foreign-thread (:copier nil) - (:include thread (:name "foreign callback")) + (:include thread (result-lock nil) (name "callback")) (:constructor make-foreign-thread ()) (:conc-name "THREAD-")) "Type of native threads which are attached to the runtime as Lisp threads diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 9db99af9b5..b4d2f39b3c 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -40,6 +40,10 @@ arg1 thr (or #+linux (sb-thread::thread-os-tid thr)) (sb-thread::thread-primitive-thread thr)))) + ;; This WRITE kind of has to stay here for timing purposes - + ;; With it, we get >100 GCs, without it only 3 or 4, + ;; and the intent of the test is to exercise GC and foreign + ;; calbacks together, which was formerly bug prone. (sb-sys:with-pinned-objects (string) (sb-unix:unix-write 1 (sb-sys:vector-sap string) 0 (length string))) (setq cell (cons thr (1- (floor arg2)))) @@ -77,3 +81,41 @@ (f 2 5 40) ;; one trial, 10 threads, 10 calls (f 1 10 10)) + +;;; Check that you get an error trying to join a foreign thread +(defglobal *my-foreign-thread* nil) +(sb-alien::define-alien-callback tryjointhis int () + (setq *my-foreign-thread* sb-thread:*current-thread*) + (dotimes (i 10) + (write-char #\.) (force-output) + (sleep .01)) + 0) + +(defun tryjoiner () + (setq *my-foreign-thread* nil) + (sb-int:dx-let ((pthread (make-array 1 :element-type 'sb-vm:word))) + (alien-funcall + (extern-alien "pthread_create" + (function int system-area-pointer unsigned + system-area-pointer unsigned)) + (sb-sys:vector-sap pthread) 0 (alien-sap tryjointhis) 0) + (format t "Alien pthread is ~x~%" (aref pthread 0)) + (let (found) + (loop + (setq found *my-foreign-thread*) + (when found (return)) + (sleep .05)) + (format t "Got ~s~%" found) + (let ((result (handler-case (sb-thread:join-thread found) + (sb-thread:join-thread-error () 'ok)))) + (when (eq result 'ok) + ;; actually join it to avoid resource leak + (alien-funcall + (extern-alien "pthread_join" (function int unsigned unsigned)) + (aref pthread 0) + 0)) + (format t "Pthread joined ~s~%" found) + result)))) + +(with-test (:name :try-join-foreign-thread) + (assert (eq (tryjoiner) 'ok))) From a34ca976a71a3f80e3e522df60a32d4e49702294 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 9 Jul 2020 08:18:44 -0400 Subject: [PATCH 0216/4023] Unbangify --- src/code/early-source-location.lisp | 2 +- src/code/globals.lisp | 2 +- src/compiler/generic/genesis.lisp | 6 +++--- src/compiler/generic/parms.lisp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/code/early-source-location.lisp b/src/code/early-source-location.lisp index b0581401bf..f74b7543f4 100644 --- a/src/code/early-source-location.lisp +++ b/src/code/early-source-location.lisp @@ -39,7 +39,7 @@ #-sb-xc-host (eval-when (:compile-toplevel :load-toplevel :execute) - (dolist (entry '#.sb-vm::!per-thread-c-interface-symbols) + (dolist (entry '#.sb-vm::per-thread-c-interface-symbols) (let ((symbol (if (consp entry) (car entry) entry))) (declare (notinline info (setf info))) ;; CURRENT-{CATCH/UWP}-BLOCK are thread slots, diff --git a/src/code/globals.lisp b/src/code/globals.lisp index 843f4ab2a7..9d3678dcd9 100644 --- a/src/code/globals.lisp +++ b/src/code/globals.lisp @@ -73,7 +73,7 @@ (find (car (ensure-list x)) (sb-vm:primitive-object-slots thread-struct) :key #'sb-vm:slot-special)) - sb-vm::!per-thread-c-interface-symbols))) + sb-vm::per-thread-c-interface-symbols))) (tls-slot (+ n-fixed (length (cdr list))))) (nconc list (list (list symbol initform))) (setf (info :variable :wired-tls symbol) (ash tls-slot sb-vm:word-shift)) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a2e552f2c2..5288deefdf 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1623,7 +1623,7 @@ core and return a descriptor to it." ;; Assign TLS indices of C interface symbols #+sb-thread (progn - (dolist (binding sb-vm::!per-thread-c-interface-symbols) + (dolist (binding sb-vm::per-thread-c-interface-symbols) (ensure-symbol-tls-index (car (ensure-list binding)))) ;; Assign other known TLS indices (dolist (pair tls-init) @@ -3214,7 +3214,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (format t "~%#endif /* __ASSEMBLER__ */~2%"))) (defun write-thread-init (stream) - (dolist (binding sb-vm::!per-thread-c-interface-symbols) + (dolist (binding sb-vm::per-thread-c-interface-symbols) (format stream "INITIALIZE_TLS(~A, ~A);~%" (c-symbol-name (if (listp binding) (car binding) binding) "*") (if (listp binding) (second binding))))) @@ -3233,7 +3233,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (+ sb-vm:nil-value (if symbol (sb-vm:static-symbol-offset symbol) 0))))) #+sb-thread - (dolist (binding sb-vm::!per-thread-c-interface-symbols) + (dolist (binding sb-vm::per-thread-c-interface-symbols) (let* ((symbol (car (ensure-list binding))) (c-symbol (c-symbol-name symbol "*"))) (unless (member symbol sb-vm::+common-static-symbols+) diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 43f86ea500..53b76c2ec2 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -159,7 +159,7 @@ ;;; - static for efficiency of access but need not be ;;; On #+sb-thread builds, these are not static, because access to them ;;; is via the TLS, not the symbol. -(defconstant-eqx !per-thread-c-interface-symbols +(defconstant-eqx per-thread-c-interface-symbols `((*free-interrupt-context-index* 0) (sb-sys:*allow-with-interrupts* t) (sb-sys:*interrupts-enabled* t) @@ -184,7 +184,7 @@ ;; These symbols are accessed from C only through TLS, ;; never the symbol-value slot #-sb-thread ,@(mapcar (lambda (x) (car (ensure-list x))) - !per-thread-c-interface-symbols) + per-thread-c-interface-symbols) ;; NLX variables are thread slots on x86-64 and RISC-V. A static sym is needed ;; for arm64, ppc, and x86 because we haven't implemented TLS index fixups, ;; so must lookup the TLS index given the symbol. From 917d2495faa2c24285c12c31b74f1fd29a32202c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 9 Jul 2020 08:30:35 -0400 Subject: [PATCH 0217/4023] Move alloc-signal out of early-impl Nothing in the base core reads it, just sb-sprof does. --- src/code/early-impl.lisp | 2 +- src/code/globals.lisp | 2 +- src/code/target-thread.lisp | 12 ++++++++---- src/compiler/generic/parms.lisp | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/code/early-impl.lisp b/src/code/early-impl.lisp index 21d543697e..ae62d06e18 100644 --- a/src/code/early-impl.lisp +++ b/src/code/early-impl.lisp @@ -36,7 +36,7 @@ sb-vm::*binding-stack-pointer* sb-pcl::*cache-miss-values-stack* sb-pcl::*dfun-miss-gfs-on-stack*)) -(defvar sb-vm:*alloc-signal*) ; initialized by create_thread_struct() + ;;; This is a slot of 'struct thread' if multithreaded, ;;; and the symbol-global-value should never be used. ;;; (And in any case it is not really a special var) diff --git a/src/code/globals.lisp b/src/code/globals.lisp index 9d3678dcd9..4576ef02bf 100644 --- a/src/code/globals.lisp +++ b/src/code/globals.lisp @@ -19,7 +19,7 @@ ;;; to running into any errors, or else you've got twice the trouble. ;;; ;;; There are other thread-locals which are used by C code, and those are all -;;; defined in !PER-THREAD-C-INTERFACE-SYMBOLS. Those other symbols must have +;;; defined in PER-THREAD-C-INTERFACE-SYMBOLS. Those other symbols must have ;;; initial values of either a fixnum or a static symbol (typically T or NIL). ;;; ;;; In contrast, DEFINE-THREAD-LOCAL allows more-or-less an arbitrary form, diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 29e265f09f..d6ad200826 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -229,10 +229,15 @@ to terminate this thread cleanly prior to core file saving without signalling an error in that case." (thread-%ephemeral-p thread)) -;; Keep an AVL tree of threads ordered by stack base address. NIL is the empty tree. +;;; Keep an AVL tree of threads ordered by stack base address. NIL is the empty tree. (sb-ext:define-load-time-global *all-threads* ()) (defvar *default-alloc-signal* nil) +;;; *ALLOC-SIGNAL* is in PER-THREAD-C-INTERFACE-SYMBOLS. Hence it doesn't require +;;; the aspect of DEFINE-THREAD-LOCAL that ensures a nonzero TLS index. +;;; (In fact you must not use DEFINE-THREAD-LOCAL, because it's incompatible +;;; with the numbering assigned to the C interface symbols) +(defvar sb-vm:*alloc-signal*) (defun list-all-threads () "Return a list of the live threads. Note that the return value is @@ -1604,9 +1609,6 @@ session." (defun new-lisp-thread-trampoline (thread setup-sem real-function arguments) (setf (thread-primitive-thread thread) (current-thread-sap)) (setf (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*)) - ;; *ALLOC-SIGNAL* is made thread-local by create_thread_struct() - ;; so this assigns into TLS, not the global value. - (setf sb-vm:*alloc-signal* *default-alloc-signal*) (let ((old *all-threads*)) (loop (let ((addr (get-lisp-obj-address sb-vm:*control-stack-start*))) @@ -2220,6 +2222,8 @@ mechanism for inter-thread communication." append `((sap-ref-lispobj sap ,index) ,form))) (setf *current-thread* thread)))) (expand))) + ;; This is made thread-local by "src/runtime/genesis/thread-init.inc" + (setf sb-vm:*alloc-signal* *default-alloc-signal*) thread) (eval-when (:compile-toplevel) diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 53b76c2ec2..fb8f00a2dc 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -152,7 +152,7 @@ sb-unix::signal-handler-callback) #'equal) -;;; (potentially) static symbols that C code must be able to assign to, +;;; (potentially) static symbols that C code must be able to set/get ;;; as contrasted with static for other reasons such as: ;;; - garbage collections roots (namely NIL) ;;; - other symbols that Lisp codegen must hardwire (T) From 025ceb92282072322d3b24b3798d34e0990115eb Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 9 Jul 2020 11:54:47 -0400 Subject: [PATCH 0218/4023] Improve a test --- tests/save-deinit.impure.lisp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/tests/save-deinit.impure.lisp b/tests/save-deinit.impure.lisp index 16b007372f..ab0eeac06a 100644 --- a/tests/save-deinit.impure.lisp +++ b/tests/save-deinit.impure.lisp @@ -20,15 +20,19 @@ #-sb-thread (exit :code 104) +;;; The test needs to purposely inject a small delay into new lisp thread creation +;;; so it wraps an encapsulation on some piece of primordial thread code. +;;; It formerly did that on the new thread trampoline, which is not the best place, +;;; because I don't want to cons a &REST arg nor know the exact signature in this test. +;;; Encapsulating INIT-THREAD-LOCAL-STORAGE works, but we have to make sure that +;;; *DEADLINE* has been initialized before calling SLEEP. +(defglobal *started-threads* nil) (sb-int:encapsulate - 'sb-thread::new-lisp-thread-trampoline + 'sb-thread::init-thread-local-storage 'finalizer-bug - (lambda (f thread semaphore userfun args) - (funcall f thread semaphore - (lambda (&rest args) - (sleep .1) - (apply userfun args)) - args))) + (compile nil '(lambda (f me) + (push me *started-threads*) + (prog1 (funcall f me) (sleep .05))))) (finalize (cons 1 'foo) (lambda () (format t "~&finalizer1~%"))) @@ -47,3 +51,9 @@ (sb-impl::deinit) (sb-impl::restore-fd-streams) (sb-impl::reinit)) + +;;; I think this test would be better as a shell test, +;;; so that we actually call SAVE-LISP-AND-DIE to see that it works. +;;; Why oh why didn't I do that??? +(assert (= 1 (length (sb-thread:list-all-threads)))) ; there's 1 now +(assert *started-threads*) ; but there was more than 1 From 313ac42ab8ec0f36bdf5f1a8074c95f3168e99c6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 9 Jul 2020 23:29:08 +0300 Subject: [PATCH 0219/4023] finalize.impure: cons less on sb-safepoint. It's prone to heap exhaustion. --- tests/finalize.impure.lisp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/finalize.impure.lisp b/tests/finalize.impure.lisp index cf43d5d5c4..9760175d37 100644 --- a/tests/finalize.impure.lisp +++ b/tests/finalize.impure.lisp @@ -10,7 +10,7 @@ (defglobal *maxdepth* 0) ;; Be gentler on 32-bit platforms -(defglobal *n-finalized-things* #+64-bit 20000 #-64-bit 10000) +(defglobal *n-finalized-things* (or #+(and 64-bit (not sb-safepoint)) 20000 10000)) (defglobal *weak-pointers* nil) #+sb-thread ; Check that we do want to start a thread, and it hasn't been started. @@ -26,8 +26,7 @@ *maxdepth*)) ;; cons 320K in the finalizer for #+64-bit, ;; or 80K for #-64-bit - (setf *tmp* (make-list #+64-bit 20000 - #-64-bit 10000)) + (setf *tmp* (make-list *n-finalized-things*)) (sb-ext:atomic-incf *count*))) x)) (compile 'makejunk) From e9beae11fc3ae1ecd356d46b3fa5c2578e3a1bb9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 10 Jul 2020 09:46:29 -0400 Subject: [PATCH 0220/4023] Write a C header for SB-THREAD:THREAD ... named 'thread-instance.h' to distinguish from 'thread.h'. Gets rid of a few extremely cryptic uses of "(lispobj*)(th+1)" to find the base of the scavengeable TLS range, and also tidies up traceroot. The headers should should probably be 'vm-thread.h' and 'sb-thread.h' but I leaned toward touching less, not more. --- build-order.lisp-expr | 1 + make-target-2-load.lisp | 8 ++- src/code/debug.lisp | 2 +- src/code/target-thread.lisp | 113 +++++++++++++++--------------- src/code/thread-structs.lisp | 78 +++++++++++++++++++++ src/code/thread.lisp | 77 ++------------------ src/code/traceroot.lisp | 9 ++- src/cold/slam.lisp | 2 +- src/compiler/generic/genesis.lisp | 7 +- src/compiler/generic/objdef.lisp | 7 +- src/runtime/gencgc.c | 12 ++-- src/runtime/thread.c | 1 + src/runtime/traceroot.c | 42 ++++------- tests/fcb-threads.impure.lisp | 2 +- tests/threads.impure.lisp | 10 +++ 15 files changed, 193 insertions(+), 178 deletions(-) create mode 100644 src/code/thread-structs.lisp diff --git a/build-order.lisp-expr b/build-order.lisp-expr index 695ce478cc..c1f3c653d8 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -226,6 +226,7 @@ ("src/code/share-vm" :not-host) + ("src/code/thread-structs" :block-compile) ; some defstructs for genesis ("src/code/thread" :not-host :block-compile) ; provides *CURRENT-THREAD* for target-signal ("src/code/target-signal-common" :not-host) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index e2d1b7a4b5..a0fa290320 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -393,10 +393,16 @@ Please check that all strings which were not recognizable to the compiler #.(find-package "SB-PCL") #.(find-package "SB-MOP") #.(find-package "SB-PRETTY") - #.(find-package "SB-THREAD") #.(find-package "SB-KERNEL")) ;; Assume all and only external symbols must be retained (eq accessibility :external)) + (#.(find-package "SB-THREAD") + (or (eq accessibility :external) + ;; for some reason a recent change caused the tree-shaker to drop MAKE-SPINLOCK + ;; which makes sense. I'm not sure what was rooting the symbol. + ;; However the :spinlock-api test in threads.impure asserts that spinlock symbols + ;; exist despite being internal symbols. + (sb-int:info :function :deprecated symbol))) (#.(find-package "SB-FASL") ;; Retain +BACKEND-FASL-FILE-IMPLEMENTATION+ and +FASL-FILE-VERSION+ ;; (and anything else otherwise reachable) diff --git a/src/code/debug.lisp b/src/code/debug.lisp index dfa03cc51c..9f3c4ab1c7 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -471,7 +471,7 @@ information." (when (and (< a (sb-thread::thread-stack-end thread)) ;; Make a final check that it's live. ;; It could die by the time this returns. - (sb-thread::thread-primitive-thread thread)) + (sb-thread:thread-alive-p thread)) thread)))))))) ;;;; frame printing diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index d6ad200826..d6955232fa 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -281,7 +281,7 @@ created and old ones may exit at any time." ;; Run the macro-generated function which writes some values into the TLS, ;; most especially *CURRENT-THREAD*. (init-thread-local-storage thread) - (setf (thread-primitive-thread thread) (current-thread-sap) + (setf (thread-primitive-thread thread) (sap-int (current-thread-sap)) (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) *initial-thread* thread) #-sb-safepoint (setq *foreign-thread* (make-foreign-thread)) @@ -1410,7 +1410,7 @@ on this semaphore, then N of them is woken up." ;; can't exist without the memory range. By clobbering this SAP here, ;; it is safe to manipulate the memory and/or the pthread from another thread ;; that acquires the interruptions lock if the SAP reads as nonzero. - (setf (thread-primitive-thread thread) nil) + (setf (thread-primitive-thread thread) 0) (barrier (:write))) ;; After making the thread dead, remove from session. If this were done first, ;; we'd just waste time moving the thread into SESSION-THREADS (if it wasn't there) @@ -1607,7 +1607,7 @@ session." ;;; All threads other than the initial thread start via this function. #+sb-thread (defun new-lisp-thread-trampoline (thread setup-sem real-function arguments) - (setf (thread-primitive-thread thread) (current-thread-sap)) + (setf (thread-primitive-thread thread) (sap-int (current-thread-sap))) (setf (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*)) (let ((old *all-threads*)) (loop @@ -1869,19 +1869,23 @@ subject to change." ;; -- DFL (setf *thruption-pending* t))))) +(defmacro with-c-thread ((c-thread thread) &body body) + `(with-interruptions-lock (,thread) + (let ((,c-thread (thread-primitive-thread ,thread))) + ,@body))) + ;;; A macro to extract the pthread id out of the thread's C memory ;;; while ensuring that the thread can't exit. ;;; Invokes BODY only if the pthread ID is valid. (defmacro with-os-thread ((os-thread thread) &body body) #+sb-thread `(let ((lisp-thread ,thread)) - (with-interruptions-lock (lisp-thread) - (let ((memory (thread-primitive-thread lisp-thread))) - (when memory - (let ((,os-thread (sap-ref-word memory - (ash sb-vm::thread-os-thread-slot - sb-vm:word-shift)))) - ,@body))))) + (with-c-thread (c-thread lisp-thread) + (unless (= c-thread 0) + (let ((,os-thread (sap-ref-word (int-sap c-thread) + (ash sb-vm::thread-os-thread-slot + sb-vm:word-shift)))) + ,@body)))) #-sb-thread `(let ((lisp-thread ,thread) (,os-thread 0)) (declare (ignorable lisp-thread ,os-thread)) @@ -1893,12 +1897,11 @@ subject to change." #+sb-thread (if (eq *current-thread* thread) (my-kernel-thread-id) - (with-interruptions-lock (thread) - (let ((memory (thread-primitive-thread thread))) - (when memory - (sap-ref-32 memory - (+ (ash sb-vm::thread-os-kernel-tid-slot sb-vm:word-shift) - #+(and 64-bit big-endian) 4)))))) + (with-c-thread (c-thread thread) + (unless (= c-thread 0) + (sap-ref-32 (int-sap c-thread) + (+ (ash sb-vm::thread-os-kernel-tid-slot sb-vm:word-shift) + #+(and 64-bit big-endian) 4))))) ;; The man page for gettid() says ;; "In a single-threaded process, the thread ID is equal to the process ID" ;; It probably would be fine to return 0 here; nothing internal uses the value. @@ -2062,20 +2065,13 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." ;;; with an SBCL developer first, or are doing something that you ;;; should probably discuss with a professional psychiatrist first #+sb-thread -(macrolet ((with-thread-memory ((var) &body body) - ;; Prevent the thread from dying completely while we look at the TLS - ;; area... - ;; Liveness per se is not important, but rather whether the memory exists. - `(with-interruptions-lock (thread) - (let ((,var (thread-primitive-thread thread))) - ,@body)))) - +(progn (sb-ext:define-load-time-global sb-vm::*free-tls-index* 0) (defun %symbol-value-in-thread (symbol thread) - (with-thread-memory (sap) - (if sap - (let ((val (sap-ref-lispobj sap (symbol-tls-index symbol)))) + (with-c-thread (c-thread thread) + (if (/= c-thread 0) + (let ((val (sap-ref-lispobj (int-sap c-thread) (symbol-tls-index symbol)))) (case (get-lisp-obj-address val) (#.sb-vm:no-tls-value-marker-widetag (values nil :no-tls-value)) (#.sb-vm:unbound-marker-widetag (values nil :unbound-in-thread)) @@ -2083,13 +2079,13 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (values nil :thread-dead)))) (defun %set-symbol-value-in-thread (symbol thread value) - (with-thread-memory (sap) - (if sap + (with-c-thread (c-thread thread) + (if (/= c-thread 0) (let ((offset (symbol-tls-index symbol))) (cond ((zerop offset) (values nil :no-tls-value)) (t - (setf (sap-ref-lispobj sap offset) value) + (setf (sap-ref-lispobj (int-sap c-thread) offset) value) (values value :ok)))) (values nil :thread-dead)))) @@ -2106,9 +2102,8 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." sb-vm:n-fixnum-tag-bits) sb-vm:n-word-bytes) (- index sb-vm:n-word-bytes)) - ;; (There's no reason this couldn't work on any thread now.) - (sap (the system-area-pointer - (thread-primitive-thread *current-thread*))) + ;; (There's almost no reason this couldn't work on any thread.) + (sap (current-thread-sap)) (list)) ((< index (ash sb-vm::primitive-thread-object-length sb-vm:word-shift)) list) @@ -2209,19 +2204,24 @@ mechanism for inter-thread communication." (if (unbound-marker-p *current-thread*) (macrolet ((expand () `(setf ,@(apply #'append (cdr *thread-local-specials*))))) - (expand)) - (setf *current-thread* thread)) + (expand))) ;; See %SET-SYMBOL-VALUE-IN-THREAD for comparison's sake #+sb-thread (let ((sap (current-thread-sap))) (macrolet ((expand () + ;; As for uni-thread, *current-thread* is always-boundp, + ;; but the C part of tls-init makes it zero initially + ;; (in violation of the type). Check for that. `(if (= (sap-ref-word sap ,(info :variable :wired-tls '*current-thread*)) - sb-vm:no-tls-value-marker-widetag) + 0) (setf ,@(loop for (var form) in (cdr *thread-local-specials*) for index = (info :variable :wired-tls var) - append `((sap-ref-lispobj sap ,index) ,form))) - (setf *current-thread* thread)))) + append `((sap-ref-lispobj sap ,index) ,form)))))) (expand))) + ;; Straightforwardly assign *current-thread* because it's never the NO-TLS-VALUE marker. + ;; I wonder how to to prevent user code from doing this, but it isn't a new problem per se. + ;; Perhaps this should be symbol-macro with a vop behind it and no setf expander. + (setf *current-thread* thread) ;; This is made thread-local by "src/runtime/genesis/thread-init.inc" (setf sb-vm:*alloc-signal* *default-alloc-signal*) thread) @@ -2269,29 +2269,28 @@ mechanism for inter-thread communication." (cond ((= word sb-vm:no-tls-value-marker-widetag) :no-tls-value) ((= word sb-vm:unbound-marker-widetag) :unbound) (t (sap-ref-lispobj sap offset))))) - (show (tlsindex val &optional thread-slot-p) - (if thread-slot-p - (format t " ~3d ~30a : #x~x~%" - (ash tlsindex (- sb-vm:word-shift)) - (aref names (ash tlsindex (- sb-vm:word-shift))) - val) - (let ((*print-right-margin* 128) - (*print-lines* 4)) - (format t " ~3d ~30a : ~s~%" - (ash tlsindex (- sb-vm:word-shift)) - ;; FIND-SYMBOL-FROM-TLS-INDEX uses MAP-ALLOCATED-OBJECTS - ;; which is not defined during cross-compilation. - (funcall 'sb-ext::find-symbol-from-tls-index tlsindex) - val))))) + (show (tlsindex val) + (let ((*print-right-margin* 128) + (*print-lines* 4)) + (format t " ~3d ~30a : ~s~%" + (ash tlsindex (- sb-vm:word-shift)) + ;; FIND-SYMBOL-FROM-TLS-INDEX uses MAP-ALLOCATED-OBJECTS + ;; which is not defined during cross-compilation. + (funcall 'sb-impl::find-symbol-from-tls-index tlsindex) + val)))) (format t "~&TLS: (base=~x)~%" (sap-int sap)) (loop for tlsindex from sb-vm:n-word-bytes below (ash sb-vm::*free-tls-index* sb-vm:n-fixnum-tag-bits) by sb-vm:n-word-bytes - do (if (< tlsindex (ash thread-obj-len sb-vm:word-shift)) - (show tlsindex (sap-ref-word sap tlsindex) t) - (let ((val (safely-read sap tlsindex))) - (unless (eq val :no-tls-value) - (show tlsindex val))))) + do (let ((thread-slot-name + (if (< tlsindex (ash thread-obj-len sb-vm:word-shift)) + (aref names (ash tlsindex (- sb-vm:word-shift)))))) + (if (and thread-slot-name (neq thread-slot-name 'sb-vm::lisp-thread)) + (format t " ~3d ~30a : #x~x~%" (ash tlsindex (- sb-vm:word-shift)) + thread-slot-name (sap-ref-word sap tlsindex)) + (let ((val (safely-read sap tlsindex))) + (unless (eq val :no-tls-value) + (show tlsindex val)))))) (let ((from (descriptor-sap sb-vm:*binding-stack-start*)) (to (binding-stack-pointer-sap))) (format t "~%Binding stack: (depth ~d)~%" diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp new file mode 100644 index 0000000000..bf69e2e767 --- /dev/null +++ b/src/code/thread-structs.lisp @@ -0,0 +1,78 @@ +;;;; support for threads needed at cross-compile time + +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. + +(in-package "SB-THREAD") + +;;; N.B.: If you alter this definition, then you need to verify that FOP-FUNCALL +;;; in genesis can properly emulate MAKE-MUTEX for the altered structure, +;;; or even better, make sure that genesis can emulate any constructor, +;;; provided that it is sufficiently trivial. +(sb-xc:defstruct (mutex (:constructor make-mutex (&key name)) + (:copier nil)) + "Mutex type." + ;; C code could (but doesn't currently) access the name + #+(and sb-thread sb-futex) + (state 0 :type fixnum) + ;; If adding slots between STATE and NAME, please see futex_name() in linux_os.c + ;; which attempts to divine a string from a futex word address. + (name nil :type (or null simple-string)) + (%owner nil :type (or null thread))) + +(sb-xc:defstruct (thread (:constructor %make-thread (name %ephemeral-p)) + (:copier nil)) + "Thread type. Do not rely on threads being structs as it may change +in future versions." + (name nil :type (or null simple-string)) ; C code could read this + (%ephemeral-p nil :type boolean :read-only t) + ;; This is one of a few different views of a lisp thread: + ;; 1. the memory space (thread->os_addr in C) + ;; 2. 'struct thread' at some offset into the memory space, coinciding + ;; with the SB-VM::THREAD primitive object + ;; 3. a pthread, which may reside anywhere, possibly the high end of the lisp stack + ;; (above the SP given to your entrypoint), whatever the pthread library chooses. + ;; 4. the THREAD instance (this structure) + ;; This value is 0 if the thread is not considered alive, though the pthread + ;; may be running its termination code (unlinking from all_threads etc) + (primitive-thread 0 :type sb-vm:word) + ;; Keep a copy of CONTROL-STACK-END from the "primitive" thread. + ;; Reading that memory for any thread except *CURRENT-THREAD* is not safe + ;; due to possible unmapping on thread death. + ;; Usually this is a fixed amount below PRIMITIVE-THREAD, but the exact offset + ;; varies by build configuration, and if #+win32 it is not related in any way. + (stack-end 0 :type sb-vm:word) + (interruptions nil :type list) + ;; On succesful execution of the thread's lambda a list of values. + (result 0) + (interruptions-lock + (make-mutex :name "thread interruptions lock") + :type mutex :read-only t) + (result-lock + (make-mutex :name "thread result lock") + :type (or null mutex) :read-only t) + waiting-for) + +(sb-xc:defstruct (foreign-thread + (:copier nil) + (:include thread (result-lock nil) (name "callback")) + (:constructor make-foreign-thread ()) + (:conc-name "THREAD-")) + "Type of native threads which are attached to the runtime as Lisp threads +temporarily.") + +#+(and sb-safepoint-strictly (not win32)) +(sb-xc:defstruct (signal-handling-thread + (:copier nil) + (:include foreign-thread) + (:conc-name "THREAD-")) + "Asynchronous signal handling thread." + (signal-number nil :type integer)) + +#-sb-xc-host (declaim (sb-ext:freeze-type mutex thread)) diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 432ceec274..16e7f2e8e3 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -11,88 +11,21 @@ (in-package "SB-THREAD") -;;; N.B.: If you alter this definition, then you need to verify that FOP-FUNCALL -;;; in genesis can properly emulate MAKE-MUTEX for the altered structure, -;;; or even better, make sure that genesis can emulate any constructor, -;;; provided that it is sufficiently trivial. -(defstruct (mutex (:constructor make-mutex (&key name)) - (:copier nil)) - "Mutex type." - ;; C code could (but doesn't currently) access the name - #+(and sb-thread sb-futex) - (state 0 :type fixnum) - ;; If adding slots between STATE and NAME, please see futex_name() in linux_os.c - ;; which attempts to divine a string from a futex word address. - (name nil :type (or null simple-string)) - (%owner nil :type (or null thread))) - -(defstruct (thread (:constructor %make-thread (name %ephemeral-p)) - (:copier nil)) - "Thread type. Do not rely on threads being structs as it may change -in future versions." - (name nil :type (or null simple-string)) ; C code could read this - (%ephemeral-p nil :type boolean :read-only t) - ;; This is one of a few different views of a lisp thread: - ;; 1. the memory space (thread->os_addr in C) - ;; 2. 'struct thread' at some offset into the memory space, coinciding - ;; with the SB-VM::THREAD primitive object - ;; 3. a pthread, which may reside anywhere, possibly the high end of the lisp stack - ;; (above the SP given to your entrypoint), whatever the pthread library chooses. - ;; 4. the THREAD instance (this structure) - ;; This value is NIL if the thread is not considered alive, though the pthread - ;; may be running its termination code (unlinking from all_threads etc) - (primitive-thread nil :type (or null system-area-pointer)) - ;; Keep a copy of CONTROL-STACK-END from the "primitive" thread. - ;; Reading that memory for any thread except *CURRENT-THREAD* is not safe - ;; due to possible unmapping on thread death. - ;; Usually this is a fixed amount below PRIMITIVE-THREAD, but the exact offset - ;; varies by build configuration, and if #+win32 it is not related in any way. - (stack-end 0 :type sb-vm:word) - (interruptions nil :type list) - ;; On succesful execution of the thread's lambda a list of values. - (result 0) - (interruptions-lock - (make-mutex :name "thread interruptions lock") - :type mutex :read-only t) - (result-lock - (make-mutex :name "thread result lock") - :type (or null mutex) :read-only t) - waiting-for) - (declaim (inline thread-alive-p)) (defun thread-alive-p (thread) "Return T if THREAD is still alive. Note that the return value is potentially stale even before the function returns, as the thread may exit at any time." + (declare (ignorable thread)) (barrier (:read)) - (not (null (thread-primitive-thread thread)))) + #+sb-thread (/= (thread-primitive-thread thread) 0) + #-sb-thread t) -(sb-impl::define-thread-local *current-thread* - ;; This initform is magical - DEFINE-THREAD-LOCAL stuffs the initial - ;; value form into a SETQ in INIT-THREAD-LOCAL-STORAGE, and the name - ;; of its first and only argument is THREAD. - thread +(defvar *current-thread*) +(setf (documentation '*current-thread* 'variable) "Bound in each thread to the thread itself.") (declaim (type thread *current-thread*)) -(defstruct (foreign-thread - (:copier nil) - (:include thread (result-lock nil) (name "callback")) - (:constructor make-foreign-thread ()) - (:conc-name "THREAD-")) - "Type of native threads which are attached to the runtime as Lisp threads -temporarily.") - -#+(and sb-safepoint-strictly (not win32)) -(defstruct (signal-handling-thread - (:copier nil) - (:include foreign-thread) - (:conc-name "THREAD-")) - "Asynchronous signal handling thread." - (signal-number nil :type integer)) - -(declaim (sb-ext:freeze-type mutex thread)) - (defun mutex-value (mutex) "Current owner of the mutex, NIL if the mutex is free. May return a stale value, use MUTEX-OWNER instead." diff --git a/src/code/traceroot.lisp b/src/code/traceroot.lisp index 87de252709..67cf4bba19 100644 --- a/src/code/traceroot.lisp +++ b/src/code/traceroot.lisp @@ -34,13 +34,12 @@ :all)) 0) +;;; Given ADDR which is a pointer to a 'struct thread' +;;; return the corresponding lisp thread. (defun find-lisp-thread-from-thread-struct (addr) (declare (type sb-ext:word addr)) - ;; find a stack whose base is nearest and below A. - (awhen (sb-thread::avl-find<= addr sb-thread::*all-threads*) - (let ((thread (sb-thread::avlnode-data it))) - (when (sap= (int-sap addr) (sb-thread::thread-primitive-thread thread)) - thread)))) + (sap-ref-lispobj (int-sap addr) + (ash sb-vm::thread-lisp-thread-slot sb-vm:word-shift))) ;;; Convert each path to (TARGET . NODES) ;;; where the first node in NODES is one of: diff --git a/src/cold/slam.lisp b/src/cold/slam.lisp index 344f48e7fc..0b2abe8c50 100644 --- a/src/cold/slam.lisp +++ b/src/cold/slam.lisp @@ -76,7 +76,7 @@ (target-compile-stem stem flags))))) (when (and (eq (car sb-thread::*thread-local-specials*) :not-final) - (not (equal (cdr sb-thread::*thread-local-specials*) + (not (equal (cdr sb-thread::*thread-local-specials*) *original-thread-local-specials*))) (sb-int:style-warn "Detected modified thread-local-specials. Slam may not have recompiled everything as required.")) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 5288deefdf..bd5c890ec0 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3184,10 +3184,10 @@ Legal values for OFFSET are -4, -8, -12, ..." (string-upcase c-name) (sb-vm:primitive-object-length obj))) (format t "~%#endif /* __ASSEMBLER__ */~2%")) -(defun write-structure-object (dd *standard-output*) +(defun write-structure-object (dd *standard-output* &optional structname) (flet ((cstring (designator) (c-name (string-downcase designator)))) (format t "#ifndef __ASSEMBLER__~2%") - (format t "struct ~A {~%" (cstring (dd-name dd))) + (format t "struct ~A {~%" (or structname (cstring (dd-name dd)))) (format t " lispobj header; // = word_0_~%") ;; "self layout" slots are named '_layout' instead of 'layout' so that ;; classoid's expressly declared layout isn't renamed as a special-case. @@ -3863,6 +3863,9 @@ III. initially undefined function references (alphabetically): sb-c::compiled-debug-info sb-c::compiled-debug-fun)) (out-to (string-downcase class) (write-structure-object (layout-info (find-layout class)) stream))) + (out-to "thread-instance" + (write-structure-object (layout-info (find-layout 'sb-thread::thread)) + stream "thread_instance")) (with-open-file (stream (format nil "~A/thread-init.inc" c-header-dir-name) :direction :output :if-exists :supersede) (write-boilerplate stream) ; no inclusion guard, it's not a ".h" file diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index dea3ce5554..ca45f86719 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -474,7 +474,7 @@ during backtrace. ;;; in c-land. However, we need sight of so many parts of it from Lisp that ;;; it makes sense to define it here anyway, so that the GENESIS machinery ;;; can take care of maintaining Lisp and C versions. -(define-primitive-object (thread :size primitive-thread-object-length) +#.`(define-primitive-object (thread :size primitive-thread-object-length) ;; no_tls_value_marker is borrowed very briefly at thread startup to ;; pass the address of the start routine into new_thread_trampoline. ;; tls[0] = NO_TLS_VALUE_MARKER_WIDETAG because a the tls index slot @@ -587,7 +587,10 @@ during backtrace. ;; If we need the header slots, but they can't precede this structure ;; for technical reasons having to do with no writable memory being there, ;; then stuff them at the end, for lack of any place better. - . #.*thread-trailer-slots*) + ,@*thread-trailer-slots* + ;; The *current-thread* MUST be the last slot in the C thread structure. + ;; It it the only slot that needs to be noticed by the garbage collector. + (lisp-thread :pointer t :special sb-thread:*current-thread*)) (defconstant code-header-size-shift #+64-bit 32 #-64-bit n-widetag-bits) (declaim (inline code-object-size code-header-words %code-code-size)) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 650dfc6237..c7947d8950 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3096,7 +3096,7 @@ void verify_heap(uword_t flags) (lispobj*)get_binding_stack_pointer(th), flags ^ VERIFYING_HEAP_OBJECTS); #ifdef LISP_FEATURE_SB_THREAD - verify_space((lispobj)(th+1), + verify_space((lispobj)&th->lisp_thread, (lispobj*)(SymbolValue(FREE_TLS_INDEX,0) + (char*)th), flags ^ VERIFYING_HEAP_OBJECTS); #endif @@ -3577,13 +3577,13 @@ garbage_collect_generation(generation_index_t generation, int raise) compacting_p() ? 0 : gc_mark_obj); #ifdef LISP_FEATURE_SB_THREAD /* do the tls as well */ - sword_t len; - len=(SymbolValue(FREE_TLS_INDEX,0) >> WORD_SHIFT) - - (sizeof (struct thread))/(sizeof (lispobj)); + lispobj* from = &th->lisp_thread; + lispobj* to = (lispobj*)(SymbolValue(FREE_TLS_INDEX,0) + (char*)th); + sword_t nwords = to - from; if (compacting_p()) - scavenge((lispobj *) (th+1), len); + scavenge(from, nwords); else - gc_mark_range((lispobj *) (th+1), len); + gc_mark_range(from, nwords); #endif } } diff --git a/src/runtime/thread.c b/src/runtime/thread.c index e32b441b6e..dd9c2ef2ea 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -849,6 +849,7 @@ create_thread_struct(void* spaces, lispobj start_routine) { lispobj* tls = (lispobj*)th; for(i = 0; i < (unsigned int)(dynamic_values_bytes/N_WORD_BYTES); i++) tls[i] = NO_TLS_VALUE_MARKER_WIDETAG; + th->lisp_thread = 0; // force it to be always-thread-local, of course th->tls_size = dynamic_values_bytes; #endif uword_t* __attribute__((__unused__)) constants = (uword_t*)th; diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 8d99a220f3..697732cc0e 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -18,6 +18,7 @@ #include "search.h" #include "genesis/avlnode.h" #include "genesis/sap.h" +#include "genesis/thread-instance.h" #include #include @@ -275,6 +276,7 @@ deduce_thread(void (*context_scanner)(), uword_t pointer, char** pc) /* KNOWN BUG: stack reference to pinned large object or immobile object * won't be found in pins hashtable */ +/* Also: should take 'struct lisp_thread**' instead of 'struct thread**' */ static lispobj examine_threads(struct hopscotch_table* targets, void (*context_scanner)(), int n_pins, lispobj* pins, @@ -290,7 +292,7 @@ static lispobj examine_threads(struct hopscotch_table* targets, #ifdef LISP_FEATURE_SB_THREAD // Examine thread-local storage *root_kind = TLS; - where = (lispobj*)(th+1); + where = &th->lisp_thread; end = (lispobj*)((char*)th + SymbolValue(FREE_TLS_INDEX,0)); for( ; where < end ; ++where) if (interestingp(*where, targets)) { @@ -1054,37 +1056,17 @@ int prove_liveness(lispobj objects, int criterion) return gc_prove_liveness(0, objects, gc_n_stack_pins, pinned_objects.keys, criterion); } -// These are slot offsets in (DEFSTRUCT THREAD), -// not the C structure defined in genesis/thread.h -#define LISP_THREAD_NAME_SLOT INSTANCE_DATA_START+0 -#define LISP_THREAD_OS_THREAD_SLOT INSTANCE_DATA_START+3 - -/* Perform exhaustive search on *ALL-THREADS* looking for a specific thread. - * Efficiency is not a concern. - */ -static struct instance* find_thread(os_thread_t os_thread, lispobj tree) -{ - if (tree == NIL) return 0; - struct avlnode* node = (struct avlnode*)native_pointer(tree); - struct instance* lisp_thread = (struct instance*)native_pointer(node->data); - if ((os_thread_t)lisp_thread->slots[LISP_THREAD_OS_THREAD_SLOT] == os_thread) - return lisp_thread; - if ((lisp_thread = find_thread(os_thread, node->left)) != NULL) - return lisp_thread; - if ((lisp_thread = find_thread(os_thread, node->right)) != NULL) - return lisp_thread; - return 0; -} - +/// Given a pthread identifier, return the lisp thread's string name. +/// Caveat emptor: This doesn't acquire the all_threads_lock. +/// Ironically perhaps, 'traceroot' no longer uses this, but it's nice to have. struct vector* lisp_thread_name(os_thread_t os_thread) { - static unsigned int hint; - lispobj* sym = find_symbol("*ALL-THREADS*", find_package("SB-THREAD"), &hint); - if (sym) { - struct instance* lisp_thread = - find_thread(os_thread, ((struct symbol*)sym)->value); - if (lisp_thread) - return VECTOR(lisp_thread->slots[LISP_THREAD_NAME_SLOT]); + struct thread* th; + for_each_thread (th) { + if (pthread_equal(os_thread, th->os_thread)) { + struct thread_instance *lispthread = (void*)native_pointer(th->lisp_thread); + return VECTOR(lispthread->name); + } } return 0; } diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index b4d2f39b3c..bbe08a282a 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -36,7 +36,7 @@ (unless cell (let* ((thr sb-thread:*current-thread*) (string - (format nil "~s from ~s (~@[TID ~d~] Pthread ~x)~%" + (format nil "~s from ~s (~@[TID ~d~] C-thread ~x)~%" arg1 thr (or #+linux (sb-thread::thread-os-tid thr)) (sb-thread::thread-primitive-thread thr)))) diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 5d73794953..6495bf6caa 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -74,6 +74,16 @@ #-sb-thread (sb-ext:exit :code 104) +(with-test (:name :thread-name-from-pthread) + (let* ((pthread (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)) + (string-data-sap + (alien-funcall (extern-alien "lisp_thread_name" + (function system-area-pointer system-area-pointer)) + pthread))) + (assert (sap= (sb-sys:sap+ (vector-sap (sb-thread:thread-name sb-thread:*current-thread*)) + (* -2 sb-vm:n-word-bytes)) + string-data-sap)))) + ;;;; Now the real tests... (with-test (:name (with-mutex :timeout)) From 81b4052c8c92b822158418f7a3dc04d713e35807 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 10 Jul 2020 12:02:12 -0400 Subject: [PATCH 0221/4023] Add some trivial low-level helpers --- src/code/debug.lisp | 11 +++++++++++ src/runtime/print.c | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/src/code/debug.lisp b/src/code/debug.lisp index 9f3c4ab1c7..e0d2f973ae 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -1936,3 +1936,14 @@ forms that explicitly control this kind of evaluation.") (if (listen-skip-whitespace *debug-io*) (read *debug-io*) default)) + +#+(and sb-devel x86-64) +(defun show-catch-tags () + (declare (notinline format)) + (let ((sap (descriptor-sap sb-vm:*current-catch-block*))) + (loop + (let ((tag (sap-ref-lispobj sap (ash sb-vm:catch-block-tag-slot 3))) + (link (sap-ref-sap sap (ash sb-vm:catch-block-previous-catch-slot 3)))) + (format t "~S ~A~%" tag link) + (setq sap link) + (if (= (sap-int sap) 0) (return)))))) diff --git a/src/runtime/print.c b/src/runtime/print.c index 0b719284b4..c45f6ad339 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -647,6 +647,14 @@ static void print_fun_or_otherptr(lispobj obj) print_slots(symbol_slots, count & 0xFF, ptr); if (symbol_function(ptr-1) != NIL) print_obj("fun: ", symbol_function(ptr-1)); +#ifdef LISP_FEATURE_SB_THREAD + int tlsindex = tls_index_of((struct symbol*)(ptr-1)); + struct thread*th = arch_os_get_current_thread(); + if (th != 0 && tlsindex != 0) { + lispobj v = *(lispobj*)(tlsindex + (char*)th); + print_obj("tlsval: ", v); + } +#endif break; #if N_WORD_BITS == 32 From 75b26403166de000910f429074f4d738dc0f7709 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 10 Jul 2020 18:48:55 -0400 Subject: [PATCH 0222/4023] Fix some issues for clang UBSan (https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html) - Technically you can't add any value except 0 to a null pointer. So don't set free_pointer to 0, but instead some small positive number (which may be technnically unportable, but it works). - Wraparound on unsigned arithmetic is undefined, but signed is not. --- src/runtime/gc-common.c | 4 ++-- src/runtime/gencgc-internal.h | 7 ++++++- src/runtime/gencgc.c | 8 ++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 29a8e34063..7ac06cb2b0 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -313,7 +313,7 @@ trans_code(struct code *code) set_forwarding_pointer((lispobj *)code, l_new_code); struct code *new_code = (struct code *) native_pointer(l_new_code); - uword_t displacement = l_new_code - l_code; + sword_t displacement = l_new_code - l_code; #if defined LISP_FEATURE_PPC || defined LISP_FEATURE_PPC64 || \ defined LISP_FEATURE_X86 || defined LISP_FEATURE_X86_64 @@ -836,7 +836,7 @@ scav_fdefn(lispobj *where, lispobj __attribute__((unused)) object) lispobj obj = fdefn_callee_lispobj(fdefn); lispobj new = obj; scavenge(&new, 1); - if (new != obj) fdefn->raw_addr += (new - obj); + if (new != obj) fdefn->raw_addr += (sword_t)(new - obj); // Payload length is not computed from the header return FDEFN_SIZE; } diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 65780ae57c..6a44494fc5 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -161,9 +161,14 @@ static inline void ensure_region_closed(struct alloc_region *alloc_region, static inline void gc_set_region_empty(struct alloc_region *region) { + /* Free-pointer has to be not equal to 0 because it's undefined behavior + * to add any value whatsoever to the null pointer. + * Annoying, isn't it. http://c-faq.com/null/machexamp.html */ + region->free_pointer = region->end_addr = (void*)0x1000; + /* Start 0 is the indicator of closed-ness. */ + region->start_addr = 0; /* last_page is not reset. It can be used as a hint where to resume * allocating after closing and re-opening the region */ - region->start_addr = region->free_pointer = region->end_addr = 0; } static inline void gc_init_region(struct alloc_region *region) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index c7947d8950..d23013dc33 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -844,12 +844,12 @@ set_alloc_start_page(int page_type_flag, int large, page_index_t page) #include "private-cons.inc" static inline boolean region_closed_p(struct alloc_region* region) { - return !region->end_addr; + return !region->start_addr; } #define ASSERT_REGIONS_CLOSED() \ - gc_assert(!((uintptr_t)boxed_region.end_addr \ - |(uintptr_t)unboxed_region.end_addr \ - |(uintptr_t)code_region.end_addr)) + gc_assert(!((uintptr_t)boxed_region.start_addr \ + |(uintptr_t)unboxed_region.start_addr \ + |(uintptr_t)code_region.start_addr)) /* Find a new region with room for at least the given number of bytes. * From 01802fc10a362f3500ff91366ad832d9a12a2da5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 11 Jul 2020 02:25:14 +0300 Subject: [PATCH 0223/4023] Fix 32-bit. --- src/runtime/thread.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 80a888e77f..88ec014cae 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -108,7 +108,7 @@ tls_index_of(struct symbol *symbol) // untagged pointer #endif } #else -# define tls_index_of(x) (x->tls_index) +# define tls_index_of(x) (x)->tls_index #endif # define per_thread_value(sym,th) *(lispobj*)(tls_index_of(sym) + (char*)th) #endif From a2ebbb29cdf595208abdb88bec31f0a43f23d21b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 10 Jul 2020 22:24:51 -0400 Subject: [PATCH 0224/4023] Remove os-provides-putwc and backtrace's use of putwc It took me half a day to find out why stderr could stop working entirely while fd 2 itself was fine. Thanks to rongut @ google the answer is hidden within https://man7.org/linux/man-pages/man3/fwide.3.html - "Once a stream has an orientation, it cannot be changed and persists until the stream is closed." ("orientation" means "element width") Using the wrong function can bork the stream so it appears inoperative. Since I don't think the right thing is to change *all* fprintf calls to fwprintf etc etc to accomodate widechar, the solution is to completely avoid using the widechar-oriented functions. --- .gitignore | 2 - make-target-2-load.lisp | 3 +- src/runtime/backtrace.c | 61 ++++++++---------------- src/runtime/immobile-space.c | 12 +---- src/runtime/lispstring.h | 35 ++++++++++++++ tools-for-build/grovel-features.sh | 2 - tools-for-build/os-provides-putwc-test.c | 11 ----- 7 files changed, 56 insertions(+), 70 deletions(-) create mode 100644 src/runtime/lispstring.h delete mode 100644 tools-for-build/os-provides-putwc-test.c diff --git a/.gitignore b/.gitignore index 158add5d2b..2ea1e42635 100644 --- a/.gitignore +++ b/.gitignore @@ -45,8 +45,6 @@ tools-for-build/determine-endianness.exe tools-for-build/grovel-headers tools-for-build/grovel-headers.exe tools-for-build/mmap-rwx -tools-for-build/os-provides-putwc-test -tools-for-build/os-provides-putwc-test.exe tools-for-build/where-is-mcontext contrib/*/test-passed contrib/*/test-output diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index a0fa290320..e761d3de3c 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -24,8 +24,7 @@ ;; "LISP_FEATURE_" on the corresponding #define is unfortunate. :GCC-TLS :RESTORE-FS-SEGMENT-REGISTER-FROM-TLS ; only for 'src/runtime/thread.h' - :OS-PROVIDES-BLKSIZE-T ; only for 'src/runtime/wrap.h' - :OS-PROVIDES-PUTWC)) ; only for 'src/runtime/backtrace.c' + :OS-PROVIDES-BLKSIZE-T)) ; only for 'src/runtime/wrap.h' (public-features (cons sb-impl::!sbcl-architecture diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 23cea40beb..f82acd0b7a 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -36,25 +36,12 @@ #include "code.h" #include "var-io.h" #include "forwarding-ptr.h" +#include "lispstring.h" #ifdef LISP_FEATURE_OS_PROVIDES_DLADDR # include #endif -static void -sbcl_putwc(wchar_t c, FILE *file) -{ -#ifdef LISP_FEATURE_OS_PROVIDES_PUTWC - putwc(c, file); -#else - if (c < 256) { - fputc(c, file); - } else { - fputc('?', file); - } -#endif -} - static int decode_locs(lispobj packed_integer, int *offset, int *elsewhere) { struct varint_unpacker unpacker; @@ -106,34 +93,24 @@ debug_function_from_pc (struct code* code, void *pc) static void print_string (struct vector *vector, FILE *f) { - int tag = widetag_of(&vector->header); - -#define doit(TYPE) \ - do { \ - int i; \ - int n = fixnum_value(vector->length); \ - TYPE *data = (TYPE *) vector->data; \ - for (i = 0; i < n; i++) { \ - wchar_t c = (wchar_t) data[i]; \ - if (c == '\\' || c == '"') \ - putc('\\', f); \ - sbcl_putwc(c, f); \ - } \ - } while (0) - - switch (tag) { - case SIMPLE_BASE_STRING_WIDETAG: - doit(unsigned char); - break; -#ifdef SIMPLE_CHARACTER_STRING_WIDETAG - case SIMPLE_CHARACTER_STRING_WIDETAG: - doit(unsigned int); - break; -#endif - default: - fprintf(f, "", tag); - } -#undef doit + if (!string_widetag_p(widetag_of(&vector->header))) { + fprintf(f, "", widetag_of(&vector->header)); + return; + } + int i; + int n = fixnum_value(vector->length); + for (i = 0; i < n; i++) { + unsigned int c = schar(vector, i); + if (c > 0xFFFF) fprintf(f,"\\U%08x", c); + // without knowing whether the terminal can accept + // character codes 128 through 255, it's conservative + // to just output unicode escapes. + else if (c > 0x7F) fprintf(f,"\\u%04x", c); + else { + if (c == '\\' || c == '"') putc('\\', f); + putc(c, f); + } + } } static int string_equal (struct vector *vector, char *string) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 8325a3f134..03ea79d46c 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -58,6 +58,7 @@ #include "immobile-space.h" #include "unaligned.h" #include "code.h" +#include "lispstring.h" #include #include @@ -1727,17 +1728,6 @@ static lispobj* get_load_address(lispobj* old) } #if DEFRAGMENT_FIXEDOBJ_SUBSPACE -// This does not accept (SIMPLE-ARRAY NIL (*)) -// (You'd have a pretty bad time trying making a symbol like that) -static int schar(struct vector* string, int index) -{ -#ifdef LISP_FEATURE_SB_UNICODE - if (widetag_of(&string->header) == SIMPLE_CHARACTER_STRING_WIDETAG) - return ((int*)string->data)[index]; -#endif - return ((char*)string->data)[index]; -} - #include "genesis/package.h" #define N_SYMBOL_KINDS 5 diff --git a/src/runtime/lispstring.h b/src/runtime/lispstring.h new file mode 100644 index 0000000000..6ed9422a28 --- /dev/null +++ b/src/runtime/lispstring.h @@ -0,0 +1,35 @@ +/* + * This software is part of the SBCL system. See the README file for + * more information. + * + * This software is derived from the CMU CL system, which was + * written at Carnegie Mellon University and released into the + * public domain. The software is in the public domain and is + * provided with absolutely no warranty. See the COPYING and CREDITS + * files for more information. + */ + +#ifndef _LISPSTRING_H_ +#define _LISPSTRING_H_ + +static inline boolean string_widetag_p(int widetag) +{ + // element type of NIL can just go to hell + return widetag == SIMPLE_BASE_STRING_WIDETAG +#ifdef SIMPLE_CHARACTER_STRING_WIDETAG + || widetag == SIMPLE_CHARACTER_STRING_WIDETAG +#endif + ; +} + +// This does not accept (SIMPLE-ARRAY NIL (*)) +// (You'd have a pretty bad time trying making a symbol like that) +static inline unsigned int schar(struct vector* string, int index) +{ + if (widetag_of(&string->header) == SIMPLE_BASE_STRING_WIDETAG) + return ((char*)string->data)[index]; + else + return ((unsigned int*)string->data)[index]; +} + +#endif diff --git a/tools-for-build/grovel-features.sh b/tools-for-build/grovel-features.sh index baf6778037..7410fc0cb3 100644 --- a/tools-for-build/grovel-features.sh +++ b/tools-for-build/grovel-features.sh @@ -23,8 +23,6 @@ featurep os-provides-dlopen featurep os-provides-dladdr -featurep os-provides-putwc - featurep os-provides-blksize-t featurep os-provides-suseconds-t diff --git a/tools-for-build/os-provides-putwc-test.c b/tools-for-build/os-provides-putwc-test.c deleted file mode 100644 index 676f135865..0000000000 --- a/tools-for-build/os-provides-putwc-test.c +++ /dev/null @@ -1,11 +0,0 @@ -/* test to build and run so that we know if we have putwc */ - -#include -#include - -int main () -{ - wchar_t a = 'a'; - putwc(a, stdout); - return 104; -} From 703f4b9f2516c7901eaff9d7f7c11fd1b12801bb Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 10 Jul 2020 22:34:08 -0400 Subject: [PATCH 0225/4023] Unbreak make-c-runtime.sh --- build-order.lisp-expr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-order.lisp-expr b/build-order.lisp-expr index c1f3c653d8..829c1ede71 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -226,7 +226,7 @@ ("src/code/share-vm" :not-host) - ("src/code/thread-structs" :block-compile) ; some defstructs for genesis + ("src/code/thread-structs" :c-headers :block-compile) ; some defstructs for genesis ("src/code/thread" :not-host :block-compile) ; provides *CURRENT-THREAD* for target-signal ("src/code/target-signal-common" :not-host) From 64170c561884ab333554232bfd8cc74464d2dc26 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 10 Jul 2020 22:42:43 -0400 Subject: [PATCH 0226/4023] Accept UCS4 strings in debug_print And delete the alpha kludge --- src/runtime/backtrace.c | 7 +++++++ src/runtime/interr.c | 23 ----------------------- src/runtime/interr.h | 2 -- 3 files changed, 7 insertions(+), 25 deletions(-) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index f82acd0b7a..95900824fb 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -113,6 +113,13 @@ print_string (struct vector *vector, FILE *f) } } +lispobj debug_print(lispobj string) +{ + print_string(VECTOR(string), stderr); + putc('\n', stderr); + return 0; +} + static int string_equal (struct vector *vector, char *string) { if (widetag_of(&vector->header) != SIMPLE_BASE_STRING_WIDETAG) diff --git a/src/runtime/interr.c b/src/runtime/interr.c index 4ba15e0121..d34bb4d75d 100644 --- a/src/runtime/interr.c +++ b/src/runtime/interr.c @@ -345,26 +345,3 @@ describe_internal_error(os_context_t *context) } } } - -/* utility routines used by miscellaneous pieces of code */ - -lispobj debug_print(lispobj string) -{ - /* This is a kludge. It's not actually safe - in general - to use - %primitive print on the alpha, because it skips half of the - number stack setup that should usually be done on a function - call, so the called routine (i.e. this one) ends up being able - to overwrite local variables in the caller. Rather than fix - this everywhere that %primitive print is used (it's only a - debugging aid anyway) we just guarantee our safety by putting - an unused buffer on the stack before doing anything else - here */ - char untouched[32]; - if (header_widetag(VECTOR(string)->header) != SIMPLE_BASE_STRING_WIDETAG) - fprintf(stderr, "debug_print: can't display string\n"); - else - fprintf(stderr, "%s\n", (char *)(VECTOR(string)->data)); - /* shut GCC up about not using this, because that's the point.. */ - (void)untouched; - return NIL; -} diff --git a/src/runtime/interr.h b/src/runtime/interr.h index cf2a58f2f8..6dcd378054 100644 --- a/src/runtime/interr.h +++ b/src/runtime/interr.h @@ -25,8 +25,6 @@ extern void disable_lossage_handler(void); extern void describe_internal_error(os_context_t *context); extern void skip_internal_error (os_context_t *context); -extern lispobj debug_print(lispobj string); - /* Portably printf()ing a pthread_t is tricky. It has to be printed * as opaque bytes by taking &id and sizeof id. * As the man page says: From 4f03c0074d4c13e1fde04f451dee423aeb10f31a Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 11 Jul 2020 16:12:58 +0300 Subject: [PATCH 0227/4023] sb-rotate-byte: catch macroexpand errors. Fixes lp#1887164 --- contrib/sb-rotate-byte/compiler.lisp | 29 +++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/contrib/sb-rotate-byte/compiler.lisp b/contrib/sb-rotate-byte/compiler.lisp index e0dda24ae0..041c03c731 100644 --- a/contrib/sb-rotate-byte/compiler.lisp +++ b/contrib/sb-rotate-byte/compiler.lisp @@ -18,21 +18,24 @@ (macrolet (;; see src/compiler/srctran.lisp (with-byte-specifier ((size-var pos-var spec) &body body) - (once-only ((spec `(macroexpand ,spec)) + (once-only ((spec `(handler-case (macroexpand ,spec) + (error () + (return (values nil t))))) (temp '(gensym))) - `(if (and (consp ,spec) - (eq (car ,spec) 'byte) - (= (length ,spec) 3)) - (let ((,size-var (second ,spec)) - (,pos-var (third ,spec))) - ,@body) - (let ((,size-var `(byte-size ,,temp)) - (,pos-var `(byte-position ,,temp))) - `(let ((,,temp ,,spec)) - ,,@body)))))) + `(if (and (consp ,spec) + (eq (car ,spec) 'byte) + (= (length ,spec) 3)) + (let ((,size-var (second ,spec)) + (,pos-var (third ,spec))) + ,@body) + (let ((,size-var `(byte-size ,,temp)) + (,pos-var `(byte-position ,,temp))) + `(let ((,,temp ,,spec)) + ,,@body)))))) (define-source-transform rotate-byte (count spec num) - (with-byte-specifier (size pos spec) - `(%rotate-byte ,count ,size ,pos ,num)))) + (block nil + (with-byte-specifier (size pos spec) + `(%rotate-byte ,count ,size ,pos ,num))))) (defoptimizer (%rotate-byte derive-type) ((count size posn num)) ;; FIXME: this looks fairly unwieldy. I'm sure it can be made From 5befcfbb6ffa89fa2cdfb00414346f9b200a62c7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 11 Jul 2020 09:35:31 -0400 Subject: [PATCH 0228/4023] Consider SAPs to be immediate values in fasl files --- src/code/fop.lisp | 4 ++++ src/compiler/dump.lisp | 12 +++++++----- src/compiler/fopcompile.lisp | 1 + tests/dump.impure-cload.lisp | 14 ++++++++++++++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/code/fop.lisp b/src/code/fop.lisp index 365fe560a0..1ce6750717 100644 --- a/src/code/fop.lisp +++ b/src/code/fop.lisp @@ -317,6 +317,10 @@ (define-fop 36 (fop-integer ((:operands n-bytes))) (number-to-core (load-s-integer n-bytes (fasl-input-stream)))) +(define-fop 33 :not-host (fop-word-pointer) + (with-fast-read-byte ((unsigned-byte 8) (fasl-input-stream)) + (int-sap (fast-read-u-integer #.sb-vm:n-word-bytes)))) + (define-fop 34 (fop-word-integer) (with-fast-read-byte ((unsigned-byte 8) (fasl-input-stream)) (number-to-core (fast-read-s-integer #.sb-vm:n-word-bytes)))) diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index b5b2864776..6131a40b16 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -409,7 +409,12 @@ (dump-fop 'fop-truth file) (dump-non-immediate-object x file))) ((fixnump x) (dump-integer x file)) - ((characterp x) (dump-character x file)) + ((characterp x) + (dump-fop 'fop-character file (sb-xc:char-code x))) + #-sb-xc-host + ((system-area-pointer-p x) + (dump-fop 'fop-word-pointer file) + (dump-integer-as-n-bytes (sap-int x) sb-vm:n-word-bytes file)) (t (dump-non-immediate-object x file)))) @@ -809,10 +814,7 @@ (ceiling (* length bits-per-length) sb-vm:n-byte-bits) #+sb-xc-host bits-per-length)))) -;;; Dump characters and string-ish things. - -(defun dump-character (char file) - (dump-fop 'fop-character file (sb-xc:char-code char))) +;;; Dump string-ish things. ;;; Dump a SIMPLE-STRING. (defun dump-chars (s fasl-output base-string-p) diff --git a/src/compiler/fopcompile.lisp b/src/compiler/fopcompile.lisp index 9cd16e9daf..993ab94231 100644 --- a/src/compiler/fopcompile.lisp +++ b/src/compiler/fopcompile.lisp @@ -258,6 +258,7 @@ (defun dumpable-leaflike-p (obj) (or (sb-xc:typep obj '(or symbol number character unboxed-array debug-name-marker + system-area-pointer #+sb-simd-pack simd-pack #+sb-simd-pack-256 simd-pack-256)) ;; The cross-compiler wants to dump CTYPE instances as leaves, diff --git a/tests/dump.impure-cload.lisp b/tests/dump.impure-cload.lisp index 0ea4ea95e4..0c228592e7 100644 --- a/tests/dump.impure-cload.lisp +++ b/tests/dump.impure-cload.lisp @@ -472,3 +472,17 @@ (let ((z (eval `(test-constant-identity ,(intern "+CONSY-CONSTANT+"))))) (assert (equal (car z) +consy-constant+)) (assert (cadr z)))) + +(macrolet ((expand () + `(progn + ,@(loop for i from 0 below sb-vm:n-word-bits + collect + `(sb-int:defconstant-eqx ,(intern (format nil "MYSAP~d" i)) + ,(sb-sys:int-sap (ash 1 i)) + #'sb-sys:sap=))))) + (expand)) +(with-test (:name :dump-sap) + (dotimes (i sb-vm:n-word-bits) + (let ((s (intern (format nil "MYSAP~d" i)))) + (assert (= (sb-sys:sap-int (symbol-value s)) + (ash 1 i)))))) From 3d14937c427f9e74d65a4c35907f7aef4a1ac325 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 12 Jul 2020 12:06:35 -0400 Subject: [PATCH 0229/4023] Fix recently introduced pathname regressions - SXHASH on a pathname would potentially incorporate the SXHASH of any PATTERN subcomponent. It was a "harmless bug" when all patterns hashed to a constant, but not harmless when patterns got assigned address-based hashes. - Git rev b934f44c failed to assign the layout of LOGICAL-PATHNAME a customized EQUALP method which could result in wrong EQUALP results. --- src/code/pathname.lisp | 26 ++- src/code/save.lisp | 2 +- src/code/target-pathname.lisp | 319 ++++++++++++++++++---------------- tests/pathnames.impure.lisp | 26 +++ 4 files changed, 205 insertions(+), 168 deletions(-) diff --git a/src/code/pathname.lisp b/src/code/pathname.lisp index 49b15ae9c2..3049ff96b0 100644 --- a/src/code/pathname.lisp +++ b/src/code/pathname.lisp @@ -36,8 +36,10 @@ ;;; A PATTERN is a list of entries and wildcards used for pattern ;;; matches of translations. -(sb-xc:defstruct (pattern (:constructor make-pattern (pieces)) (:copier nil)) - (pieces nil :type list)) +(sb-xc:defstruct (pattern (:constructor %make-pattern (hash pieces)) + (:copier nil)) + (hash 0 :type fixnum :read-only t) + (pieces nil :type list :read-only t)) ;;;; PATHNAME structures @@ -48,24 +50,20 @@ (sb-xc:defstruct (pathname (:conc-name %pathname-) (:copier nil) - (:constructor %%make-pathname - (host device directory name type version - &aux (dir-hash (pathname-dir-hash directory)) - (stem-hash (mix (sxhash name) (sxhash type))))) + (:constructor allocate-pathname + (host device hashed-dir name type version)) (:predicate pathnamep)) (namestring nil) ; computed on demand - ;; support for pathname interning and hashing. - ;; Host and device might be reducible to small integers if we keep tables (vectors) - ;; of the values seen. - ;; We might even be able to pack DIR-HASH, STEM-HASH, and HOST, DEVICE into one slot. - (dir-hash nil :type hash-code :read-only t) - (stem-hash nil :type hash-code :read-only t) ; name hash and type hash mixed ;; the host (at present either a UNIX or logical host) + ;; Host and device could be reduced to small integers and packed in one slot + ;; by keeping tables of the observed values. (host nil :type (or host null) :read-only t) ;; the name of a logical or physical device holding files (device nil :type (or simple-string pathname-component-tokens) :read-only t) - ;; a list of strings that are the component subdirectory components - (directory nil :type list :read-only t) + ;; an interned list of strings headed by :ABSOLUTE or :RELATIVE + ;; comprising the path, or NIL. + ;; if the list is non-NIL, the CAR is a numerical hash code. + (hashed-dir nil :type list :read-only t) ;; the filename (name nil :type (or simple-string pattern pathname-component-tokens) :read-only t) ;; the type extension of the file diff --git a/src/code/save.lisp b/src/code/save.lisp index 413f244cd9..a38ef5ca34 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -337,7 +337,7 @@ sufficiently motivated to do lengthy fixes." (float-deinit) (profile-deinit) (foreign-deinit) - (fill *pathnames* nil) + (clrhash *pathnames*) ;; Clean up the simulated weak list of covered code components. (rplacd sb-c:*code-coverage-info* (delete-if-not #'weak-pointer-value (cdr sb-c:*code-coverage-info*))) diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index 1dc5019d25..fa4bcf6fdf 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -61,12 +61,9 @@ ;;; Logical pathnames are a subclass of PATHNAME. Their class ;;; relations are mimicked using structures for efficiency. (defstruct (logical-pathname (:conc-name %logical-pathname-) - (:include pathname) - (:copier nil) - (:constructor %make-logical-pathname - (host device directory name type version - &aux (dir-hash (pathname-dir-hash directory)) - (stem-hash (mix (sxhash name) (sxhash type))))))) + (:include pathname) + (:constructor nil) + (:copier nil))) ;;; FIXME: this, and many other FREEZE-TYPEs don't actually do anything. ;;; Unobvious order of execution of TLFs in cold-init is one potential problem, @@ -86,6 +83,19 @@ (deftype absent-pathname-component () '(member nil :unspecific)) +(defun make-pattern (pieces) + ;; Ensure that the hash will meet the SXASH persistence requirement: + ;; "2. For any two objects, x and y, both of which are ... pathnames ... and which are similar, + ;; (sxhash x) and (sxhash y) yield the same mathematical value even if x and y exist in + ;; different Lisp images of the same implementation." + ;; Specifically, hashes that depend on object identity (address) are impermissible. + (dolist (piece pieces) + (aver (typep piece '(or string symbol (cons (eql :character-set) string))))) + (%make-pattern (sxhash pieces) pieces)) + +(declaim (inline %pathname-directory)) +(defun %pathname-directory (pathname) (cdr (%pathname-hashed-dir pathname))) + (declaim (inline pathname-component-present-p)) (defun pathname-component-present-p (component) (not (typep component 'absent-pathname-component))) @@ -239,36 +249,13 @@ ;;; *DEFAULT-PATHNAME-DEFAULTS* before *DEFAULT-PATHNAME-DEFAULTS* is ;;; initialized (at which time we can't safely call e.g. #'PATHNAME). (defun make-trivial-default-pathname () - (%%make-pathname *physical-host* nil nil nil nil :newest)) + (allocate-pathname *physical-host* nil nil nil nil :newest)) ;;; pathname methods -;;; SXHASH does a really poor job on pathname directory, especially if in your -;;; environment, the directories of interest are all many levels down from the -;;; filesystem root- every directory in your work space might hash to the same -;;; value under SXHASH. Mixing in all pieces of the directory path solves that. -(defun pathname-dir-hash (directory) - ;; FIXME: all instances of PATTERN hash to the same thing. - ;; We should probably hash the pattern pieces. (Same for stem-hash) - (let ((hash (sxhash (car directory)))) - (dolist (piece (cdr directory) hash) - (mixf hash (sxhash piece))))) -;;; Pathname hashing used to be nested inside SXHASH so that it could utilize -;;; the depth cutoff to avoid performing unbounded work. We don't need that any more, -;;; as the parts of the pathname that invoke SXHASH (host, device, version) are atoms -;;; and hence they entail bounded computation. (defun pathname-sxhash (x) (declare (pathname x)) - ;; Pathnames are EQUAL if all the components are EQUAL, so - ;; we hash all of the components of a pathname together. - (let ((hash (sxhash (pathname-host x)))) - (mixf hash (sxhash (pathname-device x))) - (mixf hash (logxor (%pathname-dir-hash x) - (%pathname-stem-hash x))) - ;; Hash :NEWEST the same as NIL because EQUAL for - ;; pathnames assumes that :newest and nil are equal. - (let ((version (%pathname-version x))) - (mixf hash (sxhash (if (eq version :newest) nil version)))))) + (pathname-key-hash x)) (defmethod print-object ((pathname pathname) stream) (let ((namestring (handler-case (namestring pathname) @@ -293,26 +280,88 @@ (defmethod make-load-form ((pathname pathname) &optional environment) (make-load-form-saving-slots pathname :environment environment)) +;;; Use an unsynchronized weak hash table with explicit locking to "try" +;;; to intern pathnames. "Try" because there are several factors that preclude +;;; ensuring uniqueness: +;;; - pathname is a STRUCTURE-OBJECT, so users might call COPY-STRUCTURE. +;;; We can make that fail by inventing a subtype of instance that is not +;;; a STRUCTURE-OBJECT. Whatever that metatype is could be useful for +;;; PATTERN (parts of the pathname) as well as THREAD, MUTEX, HASH-TABLE +;;; and maybe some other things that yield strange semantics if copied. +;;; - the load form methods use MAKE-LOAD-FORM-SAVING-SLOTS thereby +;;; bypassing the interning operation. That seems totally fixable. +;;; +;;; Additionally, it would be nice if this table would act to reduce +;;; EQUAL to EQ on pathnames by ensuring that we never intern two distinct +;;; pathnames that are EQUAL. +;;; That would require performing some canonicalization immediately which may +;;; or may not pose a problem for fixing https://bugs.launchpad.net/sbcl/+bug/1834266 +;;; which is to say, if hosts can actually be :UNSPECIFIC, then the version +;;; collapsing that is done here would not be done. I don't know if it's that simple. +;;; If it isn't that simple, then the answer is that hash function and comparator +;;; function used for the *PATHNAMES* table needs to be more fine-grained than +;;; the hash value that SXHASH returns for a pathname. +;;; +;;; The spec is actually extremely underspecified in regard to the meaning of +;;; "pathnames that are equal should be functionally equivalent." +;;; The simple test: +;;; (equal (make-pathname :name "a" :version nil) (make-pathname :name "a" :version :newest)) +;;; shows that EQUAL is inconsistent in terms of what "functionally equivalent" means: +;;; SBCL, ABCL, and CCL => T +;;; CLISP and ECL => NIL +;;; Also, on case-sensitive-case-preserving filesystems it's not possible +;;; to know which pathnames are equivalent without asking the filesystem. +;;; +;;; This table uses %MAKE-HASH-TABLE, not MAKE-HASH-TABLE, because the latter +;;; always creates a synchronized table if :WEAKNESS is specified. +;;; But to correctly use the "put-if-absent" operation, the locking must occur +;;; *around* the get and put operations. It makes no sense to lock the table around +;;; individual operations, hence the unsynchronized table. + +(define-load-time-global *pathnames* + (let ((h (%make-hash-table (logior (pack-ht-flags-weakness +ht-weak-value+) + (pack-ht-flags-kind 3) + hash-table-userfun-flag) + 'pathname-key= + #'pathname-key= + #'pathname-key-hash + 10 + default-rehash-size + $1.0))) + (install-hash-table-lock h) + h)) ;;; A pathname is logical if the host component is a logical host. ;;; This constructor is used to make an instance of the correct type ;;; from parsed arguments. -(defun %make-maybe-logical-pathname (host device directory name type version) +(defun intern-pathname (host device directory name type version) ;; We canonicalize logical pathname components to uppercase. ANSI ;; doesn't strictly require this, leaving it up to the implementor; ;; but the arguments given in the X3J13 cleanup issue ;; PATHNAME-LOGICAL:ADD seem compelling: we should canonicalize the ;; case, and uppercase is the ordinary way to do that. (flet ((upcase-maybe (x) (typecase x (string (logical-word-or-lose x)) (t x)))) - (if (typep host 'logical-host) - (%make-logical-pathname host - :unspecific - (mapcar #'upcase-maybe directory) - (upcase-maybe name) - (upcase-maybe type) - version) - (progn - (aver (eq host *physical-host*)) - (%make-pathname host device directory name type version))))) + (when (typep host 'logical-host) + (setq device :unspecific + directory (mapcar #'upcase-maybe directory) + name (upcase-maybe name) + type (upcase-maybe type)))) + (let ((table *pathnames*)) + (declare (inline allocate-pathname)) ; for DXability + (with-system-mutex ((hash-table-%lock table)) + (dx-let ((key (allocate-pathname + host + device + (when directory + (ensure-gethash directory table + (cons (pathname-key-hash directory) directory))) + name + type + version))) + (or (gethash key table) + (let ((key (copy-structure key))) + (when (typep host 'logical-host) + (setf (%instance-layout key) #.(find-layout 'logical-pathname))) + (setf (gethash key table) key))))))) ;;; Vector of logical host objects, each of which contains its translations. ;;; The vector is never mutated- always a new vector is created when adding @@ -463,6 +512,9 @@ (and (simple-string-p that) (string= this that))) (pattern + ;; PATTERN instances should probably become interned objects + ;; so that we can use EQ on them. But that currently has the same + ;; problem as PATHAME= has - the cache can be bypassed. (and (pattern-p that) (pattern= this that))) (cons @@ -472,106 +524,67 @@ ;;;; pathname functions -(defun pathname= (pathname1 pathname2) - (declare (type pathname pathname1) - (type pathname pathname2)) - (or (eq pathname1 pathname2) - (and (eq (%pathname-host pathname1) - (%pathname-host pathname2)) - (= (%pathname-dir-hash pathname1) (%pathname-dir-hash pathname2)) - (= (%pathname-stem-hash pathname1) (%pathname-stem-hash pathname2)) - (compare-component (%pathname-device pathname1) - (%pathname-device pathname2)) - (compare-component (%pathname-directory pathname1) - (%pathname-directory pathname2)) - (compare-component (%pathname-name pathname1) - (%pathname-name pathname2)) - (compare-component (%pathname-type pathname1) - (%pathname-type pathname2)) - (or (eq (%pathname-host pathname1) *physical-host*) - (compare-component (%pathname-version pathname1) - (%pathname-version pathname2)))))) -(sb-kernel::assign-equalp-impl 'pathname #'pathname=) +(macrolet ((compare-most-components () + `(and (eq (%pathname-host a) (%pathname-host b)) ; Interned + ;; Unless the pathname cache can be made 100% reliable, + ;; strength-reducing EQUAL to EQ is inadmissible here. + ;; To fix that, MAKE-LOAD-FORM methods need not to bypass + ;; INTERN-PATHNAME. + (let ((dir-a (%pathname-hashed-dir a)) + (dir-b (%pathname-hashed-dir b))) + (or (eq dir-a dir-b) + (compare-component (cdr dir-a) (cdr dir-b)))) + (compare-component (%pathname-device a) (%pathname-device b)) + (compare-component (%pathname-name a) (%pathname-name b)) + (compare-component (%pathname-type a) (%pathname-type b))))) + +;;; PATHNAME-KEY= can receive two different subsets of keys: +;;; - non-nil LIST is the directory part of a pathname +;;; - entire PATHNAME +(defun pathname-key= (a b) + (etypecase a + (list (and (listp b) (compare-component a b))) + (pathname (and (pathnamep b) + (compare-most-components) + (eql (pathname-version a) (pathname-version b)))))) + +(defun pathname= (a b) + (declare (type pathname a b)) + (or (eq a b) + (and (compare-most-components) + (or (eq (%pathname-host a) *physical-host*) + (compare-component (pathname-version a) + (pathname-version b))))))) -;;; This is conceptually like (DEFUN-CACHED (%MAKE-PATHNAME ...)) -;;; except that we try hard never to evict entries until SAVE-LISP-AND-DIE. -;;; Entries can still be kicked out randomly though. -;;; A two-level lookup is used- it works better than mixing all -;;; pathname components into a hash key. -(define-load-time-global *pathnames* (make-array 211 :initial-element nil)) -(define-load-time-global *pathnames-lock* (sb-thread:make-mutex :name "Pathnames")) - -(defun %make-pathname (host device directory name type version) - (if (or device (neq host *physical-host*)) - (%%make-pathname host device directory name type version) - (let* ((table *pathnames*) - (index (rem (pathname-dir-hash directory) (length table))) - (dir-holder - ;; Candidates is a list of ((dir . contents) ...) - (loop named outer - with candidates = (svref table index) and new = nil - do - (let ((n-candidates 0)) - (dolist (candidate candidates) - (incf n-candidates) - (when (compare-component (car candidate) directory) - (return-from outer candidate))) - (unless new - (setq new (cons directory (make-array 3 :initial-element nil)))) - (cond ((< n-candidates 10) - (let* ((cell (cons new candidates)) - (actual-old (cas (svref table index) candidates cell))) - (when (eq actual-old candidates) - (return-from outer new)) - (setq candidates actual-old))) - (t - ;; Clobber this cache entry, losing all directories in it. - ;; Hopefully this doesn't happen often. - #+nil (format t "~&*** Pathname cache overflow: ~D ~S~%" - index (mapcar 'car candidates)) - (setf (svref table index) (list new)) - (return-from outer new))))))) - (flet ((matchp (stem-hash candidates) - (let ((n-candidates 0)) - (dolist (pathname candidates (values nil n-candidates)) - (when (and (= (%pathname-stem-hash pathname) stem-hash) - (compare-component (%pathname-version pathname) version) - (compare-component (%pathname-name pathname) name) - (compare-component (%pathname-type pathname) type)) - (return (values pathname 0))) - (incf n-candidates))))) - ;; We have tests asserting that the distinction between :NEWEST - ;; and NIL is preserved, though there is no effective difference. - (binding* ((stem-hash (mix (sxhash name) (sxhash type))) - (vector (the simple-vector (cdr dir-holder))) - (index (rem stem-hash (length vector))) - (candidates (svref vector index)) - ((found n-candidates) (matchp stem-hash candidates))) - (when found - (return-from %make-pathname found)) - ;; Optimistically assuming that the pathname won't be found - ;; on the double-check, allocate it now - (let ((pathname (%%make-pathname *physical-host* nil (car dir-holder) - name type version))) - (sb-thread::with-system-mutex (*pathnames-lock*) - (when (>= n-candidates 10) - ;; Rehash into a larger vector - (let* ((old-len (length vector)) - (new-len (+ old-len 4)) - (new-vector (make-array new-len :initial-element nil))) - (dovector (list vector) - (dolist (p list) - (push p (svref new-vector (rem (%pathname-stem-hash p) - new-len))))) - (rplacd dir-holder new-vector) - (setq vector new-vector - index (rem stem-hash new-len) - candidates (svref vector index)))) - (let ((found (matchp stem-hash candidates))) - (if found - (setq pathname found) - (push pathname (svref vector index))))) - pathname)))))) +(sb-kernel::assign-equalp-impl 'pathname #'pathname=) +(sb-kernel::assign-equalp-impl 'logical-pathname #'pathname=) + +;;; A pathname key is a key to an entry in *PATHNAMES*, either a pathname +;;; or a pathname-directory. +(defun pathname-key-hash (x) + (flet ((hash-piece (piece) + (etypecase piece + (string (sxhash piece)) ; transformed + (symbol (sxhash piece)) ; transformed + (pattern (pattern-hash piece)) + ((cons (eql :home) (cons string null)) + (sxhash (second piece)))))) + (etypecase x + (pathname + (let* ((host (%pathname-host x)) + ;; NAME-HASH is based on SXHASH of a string + (hash (if (typep host 'logical-host) (logical-host-name-hash host) 0))) + (mixf hash (hash-piece (%pathname-device x))) ; surely stringlike, right? + (awhen (%pathname-hashed-dir x) (mixf hash (car it))) + (mixf hash (hash-piece (%pathname-name x))) + (mixf hash (hash-piece (%pathname-type x))) + ;; EQUAL might ignore the version, and it doesn't provide many bits + ;; of randomness, so don't bother with it. + hash)) + (list ;; a directory + (let ((hash 0)) + (dolist (piece x hash) + (mixf hash (hash-piece piece)))))))) ;;; Convert PATHNAME-DESIGNATOR (a pathname, or string, or ;;; stream), into a pathname in PATHNAME. @@ -771,7 +784,7 @@ the operating system native pathname conventions." (if diddle-case (diddle-case default) default))))) - (%make-maybe-logical-pathname + (intern-pathname (or pathname-host default-host) ;; The device of ~/ shouldn't be merged, because the ;; expansion may have a different device @@ -906,7 +919,7 @@ a host-structure or string." diddle-defaults)) (t nil)))) - (%make-maybe-logical-pathname + (intern-pathname host (pick device devp %pathname-device) ; forced to :UNSPECIFIC when logical dir @@ -1047,8 +1060,7 @@ a host-structure or string." does not match the explicit HOST argument, ~S." :format-arguments (list new-host host))) (let ((pn-host (or new-host host (pathname-host defaults)))) - (values (%make-maybe-logical-pathname - pn-host device directory file type version) + (values (intern-pathname pn-host device directory file type version) end))))))) (defun parse-namestring (thing @@ -1126,8 +1138,7 @@ a host-structure or string." does not match the explicit HOST argument, ~S." :format-arguments (list new-host host))) (let ((pn-host (or new-host host (pathname-host defaults)))) - (values (%make-pathname - pn-host device directory file type version) + (values (intern-pathname pn-host device directory file type version) end))))))) (defun parse-native-namestring (thing @@ -1491,7 +1502,7 @@ unspecified elements into a completed to-pathname based on the to-wildname." (if (eq result :error) (error "~S doesn't match ~S." source from) result)))) - (%make-maybe-logical-pathname + (intern-pathname (or to-host source-host) (frob %pathname-device) (frob %pathname-directory translate-directories) @@ -1749,7 +1760,7 @@ unspecified elements into a completed to-pathname based on the to-wildname." ;;; We can't initialize this yet because not all host methods are ;;; loaded yet. -(defvar *logical-pathname-defaults*) +(define-load-time-global *logical-pathname-defaults* nil) (defun logical-namestring-p (x) (and (stringp x) @@ -1943,10 +1954,12 @@ unspecified elements into a completed to-pathname based on the to-wildname." (translate-logical-pathname possibly-logical-pathname) possibly-logical-pathname)) -(defvar *logical-pathname-defaults* - (%make-logical-pathname - (make-logical-host :name (logical-word-or-lose "BOGUS")) - :unspecific nil nil nil nil)) +(setq *logical-pathname-defaults* + (let ((pn (allocate-pathname + (make-logical-host :name (logical-word-or-lose "BOGUS")) + :unspecific nil nil nil nil))) + (setf (%instance-layout pn) #.(find-layout 'logical-pathname)) + pn)) (defun load-logical-pathname-translations (host) "Reads logical pathname translations from SYS:SITE;HOST.TRANSLATIONS.NEWEST, diff --git a/tests/pathnames.impure.lisp b/tests/pathnames.impure.lisp index 09c62dddbc..4938199269 100644 --- a/tests/pathnames.impure.lisp +++ b/tests/pathnames.impure.lisp @@ -879,3 +879,29 @@ :displaced-to string :displaced-index-offset 1))) (assert (equal (parse-namestring disp) #p"SYS:ABC.LISP")))) + +;;; LOGICAL-PATHAME was missing the specialized pathname comparator +;;; function in SB_KERNEL::LAYOUT-EQUALP-IMPL +(with-test (:name :logical-pathname-equalp-method) + (let ((s "#p\"sys:contrib/f[1-9].txt\"")) + (let ((a (read-from-string s))) + ;; result shouldn't depend on the pathnames being EQ + (clrhash sb-impl::*pathnames*) + (let ((b (read-from-string s))) + (assert (not (eq a b))) + (equalp a b))))) + +;;; After the change which added address-based hashing to all INSTANCE types, +;;; someone forgot to ensure that address-based hashes were not used on +;;; PATTERN instances which can comprise the subcomponents of a pathname. +;;; So make sure the hash is based on the string contents of the pattern. +;;; Read pathnames from strings to guarantee that some magic effect of reading +;;; pathnames doesn't coalesce them. To be especially certain, clear the +;;; SB-IMPL::*PATHNAMES* table between the read-from-string calls. +(with-test (:name :wild-pathnames-string-based-hash) + (let ((string "#p\"file[0-9].txt\"")) + (let ((a (read-from-string string))) + (clrhash (clrhash sb-impl::*pathnames*)) + (let ((b (read-from-string string))) + (assert (not (eq a b))) + (assert (eql (sxhash a) (sxhash b))))))) From ce2b216ac886bfe77d627e4faca959462386a8b6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 12 Jul 2020 14:27:19 -0400 Subject: [PATCH 0230/4023] Combine all pathname make-load-form methods into one And make INTERN-PATHNAME the only way to allocate a pathname. --- src/code/pathname.lisp | 2 +- src/code/save.lisp | 3 +++ src/code/target-pathname.lisp | 49 ++++++++++++++++++----------------- src/pcl/env.lisp | 5 ---- 4 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/code/pathname.lisp b/src/code/pathname.lisp index 3049ff96b0..e7d82a0a85 100644 --- a/src/code/pathname.lisp +++ b/src/code/pathname.lisp @@ -50,7 +50,7 @@ (sb-xc:defstruct (pathname (:conc-name %pathname-) (:copier nil) - (:constructor allocate-pathname + (:constructor !allocate-pathname (host device hashed-dir name type version)) (:predicate pathnamep)) (namestring nil) ; computed on demand diff --git a/src/code/save.lisp b/src/code/save.lisp index a38ef5ca34..dfaea22345 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -337,6 +337,9 @@ sufficiently motivated to do lengthy fixes." (float-deinit) (profile-deinit) (foreign-deinit) + ;; To have any hope of making pathname interning actually work, + ;; this CLRHASH would need to be removed. But removing it causes excess + ;; garbage retention because weakness doesn't work. It's a catch-22. (clrhash *pathnames*) ;; Clean up the simulated weak list of covered code components. (rplacd sb-c:*code-coverage-info* diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index fa4bcf6fdf..8cf1be0917 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -73,11 +73,6 @@ ;;; because later on we define either UNIX-HOST or WIN32-HOST. #-sb-fluid (declaim (freeze-type pathname logical-host)) -(defmethod make-load-form ((logical-host logical-host) &optional env) - (declare (ignore env)) - (values `(find-logical-host ',(logical-host-name logical-host)) - nil)) - ;;; Utility functions (deftype absent-pathname-component () @@ -249,7 +244,7 @@ ;;; *DEFAULT-PATHNAME-DEFAULTS* before *DEFAULT-PATHNAME-DEFAULTS* is ;;; initialized (at which time we can't safely call e.g. #'PATHNAME). (defun make-trivial-default-pathname () - (allocate-pathname *physical-host* nil nil nil nil :newest)) + (intern-pathname *physical-host* nil nil nil nil :newest)) ;;; pathname methods @@ -276,9 +271,6 @@ (%pathname-name pathname) (%pathname-type pathname) (%pathname-version pathname)))))) - -(defmethod make-load-form ((pathname pathname) &optional environment) - (make-load-form-saving-slots pathname :environment environment)) ;;; Use an unsynchronized weak hash table with explicit locking to "try" ;;; to intern pathnames. "Try" because there are several factors that preclude @@ -346,9 +338,9 @@ name (upcase-maybe name) type (upcase-maybe type)))) (let ((table *pathnames*)) - (declare (inline allocate-pathname)) ; for DXability + (declare (inline !allocate-pathname)) ; for DXability (with-system-mutex ((hash-table-%lock table)) - (dx-let ((key (allocate-pathname + (dx-let ((key (!allocate-pathname host device (when directory @@ -372,9 +364,6 @@ ;;;; patterns -(defmethod make-load-form ((pattern pattern) &optional environment) - (make-load-form-saving-slots pattern :environment environment)) - (defmethod print-object ((pattern pattern) stream) (print-unreadable-object (pattern stream :type t) (if *print-pretty* @@ -1758,9 +1747,8 @@ unspecified elements into a completed to-pathname based on the to-wildname." (parse-host (logical-chunkify namestr start end))) (values host :unspecific (directory) name type version)))) -;;; We can't initialize this yet because not all host methods are -;;; loaded yet. -(define-load-time-global *logical-pathname-defaults* nil) +(define-load-time-global *logical-pathname-defaults* + (intern-pathname (make-logical-host :name "") :unspecific nil nil nil nil)) (defun logical-namestring-p (x) (and (stringp x) @@ -1954,13 +1942,6 @@ unspecified elements into a completed to-pathname based on the to-wildname." (translate-logical-pathname possibly-logical-pathname) possibly-logical-pathname)) -(setq *logical-pathname-defaults* - (let ((pn (allocate-pathname - (make-logical-host :name (logical-word-or-lose "BOGUS")) - :unspecific nil nil nil nil))) - (setf (%instance-layout pn) #.(find-layout 'logical-pathname)) - pn)) - (defun load-logical-pathname-translations (host) "Reads logical pathname translations from SYS:SITE;HOST.TRANSLATIONS.NEWEST, with HOST replaced by the supplied parameter. Returns T on success. @@ -2037,3 +2018,23 @@ existing translations for \"SYS:SRC;\", \"SYS:CONTRIB;\", and ("SYS:CONTRIB;**;*.*.*" ,(physical-target "contrib")) ("SYS:OUTPUT;**;*.*.*" ,(physical-target "output")) ,@current-translations))))) + +(defmethod make-load-form ((pn pathname) &optional env) + (declare (ignore env)) + (labels ((reconstruct (component) + (if (and (listp component) (some #'pattern-p component)) + (cons 'list (mapcar #'patternify component)) + `',component)) + (patternify (subcomponent) + (if (pattern-p subcomponent) + `(make-pattern ',(pattern-pieces subcomponent)) + `',subcomponent))) + (values `(intern-pathname + ,(if (typep pn 'logical-pathname) + `(find-logical-host ',(logical-host-name (%pathname-host pn))) + '*physical-host*) + ,(reconstruct (%pathname-device pn)) + ,(reconstruct (%pathname-directory pn)) + ,(reconstruct (%pathname-name pn)) + ,(reconstruct (%pathname-type pn)) + ,(reconstruct (%pathname-version pn)))))) diff --git a/src/pcl/env.lisp b/src/pcl/env.lisp index 8045b329c2..41cb39b828 100644 --- a/src/pcl/env.lisp +++ b/src/pcl/env.lisp @@ -223,11 +223,6 @@ (define-default-make-load-form-method standard-object) (define-default-make-load-form-method condition)) -sb-impl:: -(defmethod make-load-form ((host (eql *physical-host*)) &optional env) - (declare (ignore env)) - '*physical-host*) - ;;; I guess if the user defines other kinds of EQL specializers, she would ;;; need to implement this? And how is she supposed to know that? (defmethod eql-specializer-to-ctype ((specializer eql-specializer)) From e5140ae7f2b6dc97eb33d90e256a988a0201bcd8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 13 Jul 2020 02:07:59 +0300 Subject: [PATCH 0231/4023] Warn about destructively modifying macro arguments. At compile-time. --- contrib/sb-grovel/foreign-glue.lisp | 2 +- src/code/condition.lisp | 8 ++++++++ src/code/early-extensions.lisp | 4 +++- src/compiler/ir1tran.lisp | 17 +++++++++++++++++ src/compiler/ir1util.lisp | 9 +++++++++ src/compiler/node.lisp | 12 +++++++++++- src/compiler/parse-lambda-list.lisp | 9 ++++++--- 7 files changed, 55 insertions(+), 6 deletions(-) diff --git a/contrib/sb-grovel/foreign-glue.lisp b/contrib/sb-grovel/foreign-glue.lisp index b09023c444..43bf43fe14 100644 --- a/contrib/sb-grovel/foreign-glue.lisp +++ b/contrib/sb-grovel/foreign-glue.lisp @@ -356,7 +356,7 @@ deeply nested structures." (defmacro define-c-struct (name size &rest elements) (multiple-value-bind (struct-elements accessors) (let* ((root (make-instance 'struct :name name :children nil :offset 0))) - (loop for e in (sort elements #'< :key #'fourth) + (loop for e in (sort (copy-list elements) #'< :key #'fourth) do (insert-element root (apply 'mk-val e)) finally (return root)) (setf (children root) diff --git a/src/code/condition.lisp b/src/code/condition.lisp index 4ae11248a4..4a01ba26d4 100644 --- a/src/code/condition.lisp +++ b/src/code/condition.lisp @@ -966,6 +966,14 @@ (:default-initargs :references '((:ansi-cl :special-operator quote) (:ansi-cl :section (3 2 2 3))))) +(define-condition macro-arg-modified (constant-modified) + ((variable :initform nil :initarg :variable :reader macro-arg-modified-variable)) + (:report (lambda (c s) + (format s "~@" + (constant-modified-fun-name c) + (macro-arg-modified-variable c)))) + (:default-initargs :references nil)) + (define-condition package-at-variance (reference-condition simple-warning) () (:default-initargs :references '((:ansi-cl :macro defpackage) diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index d229c72066..6c2e41e191 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -1216,7 +1216,9 @@ NOTE: This interface is experimental and subject to change." ((or (listp id) ; must be a type-specifier (memq id '(special ignorable ignore dynamic-extent - truly-dynamic-extent)) + truly-dynamic-extent + sb-c::constant-value + sb-c::no-constraints)) (info :type :kind id)) (cdr decl)))))) (partition (spec) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index cc52b2f2f5..b7d9bbfcf0 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -649,6 +649,11 @@ (maybe-reanalyze-functional leaf)) leaf)) (ref (make-ref leaf name))) + (when (and result + (lambda-var-p leaf) + (lambda-var-constant leaf)) + (push (make-lvar-lambda-var-annotation :lambda-var leaf) + (lvar-annotations result))) (push ref (leaf-refs leaf)) (when (and (functional-p leaf) (functional-ignore leaf)) @@ -1359,6 +1364,15 @@ (t (setf (lambda-var-no-constraints var) t)))))) +(defun process-constant-decl (spec vars) + (dolist (name (rest spec)) + (let ((var (find-in-bindings vars name))) + (cond + ((not var) + (warn "No ~s variable" name)) + (t + (setf (lambda-var-constant var) t)))))) + ;;; Return a DEFINED-FUN which copies a GLOBAL-VAR but for its INLINEP ;;; (and TYPE if notinline), plus type-restrictions from the lexenv. (defun make-new-inlinep (var inlinep local-type) @@ -1612,6 +1626,9 @@ (no-constraints (process-no-constraints-decl spec vars) res) + (constant-value + (process-constant-decl spec vars) + res) ;; We may want to detect LAMBDA-LIST and VALUES decls here, ;; and report them as "Misplaced" rather than "Unrecognized". (t diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 111b4ec36b..0e7f265b74 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -3204,6 +3204,15 @@ is :ANY, the function name is not checked." (values :calls constants))))))))) (defun process-lvar-modified-annotation (lvar annotation) + (loop for annot in (lvar-annotations lvar) + when (lvar-lambda-var-annotation-p annot) + do (let ((lambda-var (lvar-lambda-var-annotation-lambda-var annot))) + (when (and (lambda-var-constant lambda-var) + (not (lambda-var-sets lambda-var))) + (warn 'sb-kernel::macro-arg-modified + :fun-name (lvar-modified-annotation-caller annotation) + :variable (lambda-var-original-name lambda-var)) + (return-from process-lvar-modified-annotation)))) (multiple-value-bind (type values) (lvar-constants lvar) (labels ((modifiable-p (value) (or (consp value) diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index 03433f4ecd..c01333f6de 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -138,6 +138,11 @@ (:include lvar-type-annotation) (:copier nil))) +(defstruct (lvar-lambda-var-annotation + (:include lvar-annotation) + (:copier nil)) + lambda-var) + (defmethod print-object ((x lvar) stream) (print-unreadable-object (x stream :type t :identity t) (when (boundp '*compilation*) @@ -1286,7 +1291,9 @@ ;; attributes must be set for the value-cell object to be created. explicit-value-cell ;; Do not propagate constraints for this var - no-constraints) + no-constraints + ;; Does it hold a constant that should't be destructively modified + constant) (defstruct (lambda-var (:include basic-var) (:copier nil)) (flags (lambda-var-attributes) @@ -1341,6 +1348,9 @@ `(lambda-var-attributep (lambda-var-flags ,var) explicit-value-cell)) (defmacro lambda-var-no-constraints (var) `(lambda-var-attributep (lambda-var-flags ,var) no-constraints)) +(defmacro lambda-var-constant (var) + `(lambda-var-attributep (lambda-var-flags ,var) constant)) + ;;;; basic node types diff --git a/src/compiler/parse-lambda-list.lisp b/src/compiler/parse-lambda-list.lisp index 47ab8fb7f4..db619e587a 100644 --- a/src/compiler/parse-lambda-list.lisp +++ b/src/compiler/parse-lambda-list.lisp @@ -1151,7 +1151,8 @@ (loop for (declare . declarations) in decls collect (list* declare (remove 'lambda-list declarations :key #'car))) - decls))))) + decls)))) + (variables (ds-lambda-list-variables parse nil))) ;; Signal a style warning for duplicate names, but disregard &AUX variables ;; because most folks agree that (LET* ((X (F)) (X (G X))) ..) makes sense ;; - some would even say that it is idiomatic - and &AUX bindings are just @@ -1163,7 +1164,7 @@ (when (memq (car tail) (cdr tail)) (style-warn-once lambda-list "variable ~S occurs more than once" (car tail)))) - (append whole env (ds-lambda-list-variables parse nil))) + (append whole env variables)) ;; Maybe kill docstring, but only under the cross-compiler. #+(and (not sb-doc) sb-xc-host) (setq docstring nil) ;; Note that we *NEVER* declare macro lambdas as a toplevel named lambda. @@ -1190,7 +1191,9 @@ `(:special-form . ,name) `(:macro ,name . ,kind))) '(destructuring-bind)) - ,new-ll (,accessor ,ll-whole) + ,new-ll (,accessor ,ll-whole) + #-sb-xc-host + (declare (constant-value ,@variables)) ,@decls ,@(if wrap-block `((block ,(fun-name-block-name name) ,@forms)) From 583919416c1faeb55c1e342abee9b2eb2a860d81 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 13 Jul 2020 00:20:49 -0400 Subject: [PATCH 0232/4023] Extend parallel-exec.sh capability "parallel-exec.sh --runs_per_test N -j M file1 file2 ..." will run specified files N times each using M processes to try to reproduce a test flake. --- tests/parallel-exec.sh | 101 +++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 35 deletions(-) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 578f86bfce..9acdd52b64 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -7,7 +7,9 @@ mkdir -p $junkdir $logdir export TEST_DIRECTORY SBCL_HOME TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ - --noinform --core ../output/sbcl.core --no-userinit --no-sysinit --noprint --disable-debugger << EOF + --noinform --core ../output/sbcl.core \ + --no-userinit --no-sysinit --noprint --disable-debugger $* << EOF +(pop *posix-argv*) (require :sb-posix) (let ((*evaluator-mode* :compile)) (with-compilation-unit () (load"run-tests"))) @@ -34,18 +36,11 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (cond ((< posn-a posn-b) t) ((> posn-a posn-b) nil) (t (string< a b))))))) -(defun parallel-execute-tests (max-jobs) +(defun parallel-execute-tests (files max-jobs vop-summary-stats-p) (format t "Using ~D processes~%" max-jobs) ;; Interleave the order in which all tests are launched rather than ;; starting them in the batches that filtering places them in. - (let ((files (choose-order - (mapcar #'pathname-name - (append (pure-load-files) - (pure-cload-files) - (impure-load-files) - (impure-cload-files) - (sh-files))))) - (subprocess-count 0) + (let ((subprocess-count 0) (subprocess-list nil) (aggregate-vop-usage (make-hash-table)) ;; Start timing only after all the DIRECTORY calls are done (above) @@ -63,9 +58,10 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (let ((code (ash status -8)) (filename (cadr process)) (et (- (get-internal-real-time) (caddr process)))) - (unless (sum-vop-usage (format nil "$logdir/~a.vop-usage" filename) t) - (when (or (search ".pure" filename) (search ".impure" filename)) - (push filename missing-usage))) + (when vop-summary-stats-p + (unless (sum-vop-usage (format nil "$logdir/~a.vop-usage" filename) t) + (when (or (search ".pure" filename) (search ".impure" filename)) + (push filename missing-usage)))) (cond ((eq code 104) (format t "~A: success (~d msec)~%" filename et)) (t @@ -87,11 +83,13 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (wait)) (let ((pid (sb-posix:fork))) (when (zerop pid) - (with-open-file (stream (format nil "$logdir/~a" file) + ;; FILE is (filename . test-iteration) + (with-open-file (stream (format nil "$logdir/~a~@[-~d~]" (car file) (cdr file)) :direction :output :if-exists :supersede) (alien-funcall (extern-alien "dup2" (function int int int)) (sb-sys:fd-stream-fd stream) 1) (alien-funcall (extern-alien "dup2" (function int int int)) 1 2)) + (setq file (car file)) ;; Send this to the log file, not the terminal (setq *debug-io* (make-two-way-stream (make-concatenated-stream) *error-output*)) @@ -110,30 +108,32 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (pure-runner (list (concatenate 'string file ".lisp")) (if (search "-cload" file) 'cload-test 'load-test) (make-broadcast-stream))) - (with-open-file (output (format nil "$logdir/~a.vop-usage" file) - :direction :output) - ;; There's an impure test that screws with the default pprint dispatch - ;; table such that integers don't print normally (and can't be parsed). - (let ((*print-pretty* nil)) - (sb-int:dohash ((name count) sb-c::*static-vop-usage-counts*) - (format output "~7d ~s~%" count name)))) + (when vop-summary-stats-p + (with-open-file (output (format nil "$logdir/~a.vop-usage" file) + :direction :output) + ;; There's an impure test that screws with the default pprint dispatch + ;; table such that integers don't print normally (and can't be parsed). + (let ((*print-pretty* nil)) + (sb-int:dohash ((name count) sb-c::*static-vop-usage-counts*) + (format output "~7d ~s~%" count name))))) (exit :code (if (unexpected-failures) 1 104))))) - (format t "~A: pid ~d~%" file pid) + (format t "~A: pid ~d~@[ (trial ~d)~]~%" (car file) pid (cdr file)) (incf subprocess-count) - (push (list pid file (get-internal-real-time)) subprocess-list))) + (push (list pid (car file) (get-internal-real-time)) subprocess-list))) (loop (if (plusp subprocess-count) (wait) (return))) - (dolist (result '("vop-usage.txt" "vop-usage-combined.txt")) - (let (list) - (sb-int:dohash ((name vop) sb-c::*backend-template-names*) - (declare (ignore vop)) - (push (cons (gethash name aggregate-vop-usage 0) name) list)) - (with-open-file (output (format nil "$logdir/~a" result) - :direction :output - :if-exists :supersede) - (dolist (cell (sort list #'> :key #'car)) - (format output "~7d ~s~%" (car cell) (cdr cell))))) - (sum-vop-usage "../output/warm-vop-usage.txt" nil)) + (when vop-summary-stats-p + (dolist (result '("vop-usage.txt" "vop-usage-combined.txt")) + (let (list) + (sb-int:dohash ((name vop) sb-c::*backend-template-names*) + (declare (ignore vop)) + (push (cons (gethash name aggregate-vop-usage 0) name) list)) + (with-open-file (output (format nil "$logdir/~a" result) + :direction :output + :if-exists :supersede) + (dolist (cell (sort list #'> :key #'car)) + (format output "~7d ~s~%" (car cell) (cdr cell))))) + (sum-vop-usage "../output/warm-vop-usage.txt" nil))) (format t "~&Total realtime: ~d msec~%" (- (get-internal-real-time) start-time)) (when missing-usage @@ -145,5 +145,36 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (format t "~A~%" filename)) (format t "==== Logs are in $logdir ====~%") (exit :code 1))))) -(parallel-execute-tests $1) +(if (= (length *posix-argv*) 1) + ;; short form - all files, argument N is the number of parallel tasks + (let ((jobs (parse-integer (car *posix-argv*)))) + (parallel-execute-tests + (mapcar #'list + (choose-order + (mapcar #'pathname-name + (append (pure-load-files) + (pure-cload-files) + (impure-load-files) + (impure-cload-files) + (sh-files))))) + jobs + t)) + ;; long form + (let ((jobs 4) + (runs-per-test 1) + (argv *posix-argv*)) + (loop (cond ((string= (car argv) "-j") + (setq jobs (parse-integer (cadr argv)) + argv (cddr argv))) + ((string= (car argv) "--runs_per_test") + (setq runs-per-test (parse-integer (cadr argv)) + argv (cddr argv))) + (t + (return)))) + (parallel-execute-tests + (loop for trial-number from 1 to runs-per-test + nconc (mapcar (lambda (file) (cons file trial-number)) + argv)) + jobs + nil))) EOF From 207c47ba239bb04bc43537f0a7961a87d22e6592 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 13 Jul 2020 06:13:39 -0400 Subject: [PATCH 0233/4023] Consolidate thread setup * Delete redundant 'is_lisp_thread' boolean. Either 'current_thread' has a nonzero value or it doesn't. * Don't assign 'current_thread' in every {arch}-{os} file. * Get rid of main_thread_trampoline(). create_main_thread() is enough layers of abstraction. Don't use th->no_tls_value_marker to pass main start function. --- src/runtime/arm64-bsd-os.c | 7 --- src/runtime/arm64-linux-os.c | 7 --- src/runtime/globals.c | 8 --- src/runtime/globals.h | 4 -- src/runtime/riscv-linux-os.c | 3 - src/runtime/thread.c | 105 +++++++++++++--------------------- src/runtime/thread.h | 17 +++--- src/runtime/x86-64-bsd-os.c | 8 --- src/runtime/x86-64-linux-os.c | 7 --- src/runtime/x86-64-sunos-os.c | 8 --- src/runtime/x86-bsd-os.c | 7 --- src/runtime/x86-linux-os.c | 5 -- 12 files changed, 47 insertions(+), 139 deletions(-) diff --git a/src/runtime/arm64-bsd-os.c b/src/runtime/arm64-bsd-os.c index a01dbd4ff3..479ad18a5e 100644 --- a/src/runtime/arm64-bsd-os.c +++ b/src/runtime/arm64-bsd-os.c @@ -42,13 +42,6 @@ size_t os_vm_page_size; int arch_os_thread_init(struct thread *thread) { stack_t sigstack; -#ifdef LISP_FEATURE_SB_THREAD -#ifdef LISP_FEATURE_GCC_TLS - current_thread = thread; -#else - pthread_setspecific(specials,thread); -#endif -#endif /* Signal handlers are normally run on the main stack, but we've * swapped stacks, require that the control stack contain only * boxed data, and expands upwards while the C stack expands diff --git a/src/runtime/arm64-linux-os.c b/src/runtime/arm64-linux-os.c index eb111a55ed..d063a98f40 100644 --- a/src/runtime/arm64-linux-os.c +++ b/src/runtime/arm64-linux-os.c @@ -39,13 +39,6 @@ int arch_os_thread_init(struct thread *thread) { stack_t sigstack; -#ifdef LISP_FEATURE_SB_THREAD -#ifdef LISP_FEATURE_GCC_TLS - current_thread = thread; -#else - pthread_setspecific(specials,thread); -#endif -#endif /* Signal handlers are normally run on the main stack, but we've * swapped stacks, require that the control stack contain only * boxed data, and expands upwards while the C stack expands diff --git a/src/runtime/globals.c b/src/runtime/globals.c index 652b524885..25bdc3ae9c 100644 --- a/src/runtime/globals.c +++ b/src/runtime/globals.c @@ -82,10 +82,6 @@ lispobj *current_auto_gc_trigger; lispobj *current_dynamic_space; #endif -#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) -pthread_key_t specials=0; -#endif - void globals_init(void) { /* Space, stack, and free pointer vars are initialized by @@ -111,8 +107,4 @@ void globals_init(void) foreign_function_call_active = 1; #endif #endif - -#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) - pthread_key_create(&specials,0); -#endif } diff --git a/src/runtime/globals.h b/src/runtime/globals.h index 9009df007b..329ceb7adf 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -63,10 +63,6 @@ extern lispobj alloc_profile_data; // Lisp SIMPLE-VECTOR #endif extern char **ENVIRON; -#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) -extern pthread_key_t specials; -#endif - #if !defined(LISP_FEATURE_SB_THREAD) extern lispobj *current_control_stack_pointer; #endif diff --git a/src/runtime/riscv-linux-os.c b/src/runtime/riscv-linux-os.c index 6dee254067..3c93dea5f9 100644 --- a/src/runtime/riscv-linux-os.c +++ b/src/runtime/riscv-linux-os.c @@ -41,9 +41,6 @@ int arch_os_thread_init(struct thread *thread) { -#ifdef LISP_FEATURE_SB_THREAD - pthread_setspecific(specials,thread); -#endif return 1; /* success */ } diff --git a/src/runtime/thread.c b/src/runtime/thread.c index dd9c2ef2ea..994f3d95e0 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -76,9 +76,8 @@ static pthread_mutex_t create_thread_lock = PTHREAD_MUTEX_INITIALIZER; #ifdef LISP_FEATURE_GCC_TLS __thread struct thread *current_thread; -__thread int is_lisp_thread; #else -pthread_key_t lisp_thread = 0; +pthread_key_t specials = 0; #endif #endif @@ -199,17 +198,22 @@ static int sb_GetTID() { return syscall(SYS_gettid); } #define sb_GetTID() 0 #endif -static int main_thread_trampoline(struct thread *th) -{ - lispobj function; +static struct thread *alloc_thread_struct(void*,lispobj); + +void create_main_lisp_thread(lispobj function) { + struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER_WIDETAG); + if(!th || arch_os_thread_init(th)==0) lose("can't create initial thread"); +#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) + pthread_key_create(&specials, 0); +#endif #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) lispobj *args = NULL; #endif #ifdef LISP_FEATURE_SB_THREAD # ifdef LISP_FEATURE_GCC_TLS - is_lisp_thread = 1; + current_thread = th; # else - pthread_setspecific(lisp_thread, (void *)1); + pthread_setspecific(specials, th); # endif #endif #if defined THREADS_USING_GCSIGNAL && \ @@ -217,9 +221,6 @@ static int main_thread_trampoline(struct thread *th) /* SIG_STOP_FOR_GC defaults to blocked on PPC? */ unblock_gc_signals(); #endif - function = th->no_tls_value_marker; - th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; - if(arch_os_thread_init(th)==0) return 1; link_thread(th); th->os_kernel_tid = sb_GetTID(); th->os_thread = thread_self(); @@ -242,9 +243,9 @@ static int main_thread_trampoline(struct thread *th) * call_into_lisp_first_time will put the new stack in the middle * of the current stack */ #if !defined(LISP_FEATURE_WIN32) && (defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64)) - return call_into_lisp_first_time(function,args,0); + call_into_lisp_first_time(function,args,0); #else - return funcall0(function); + funcall0(function); #endif } @@ -363,17 +364,15 @@ init_new_thread(struct thread *th, int lock_ret; #ifdef LISP_FEATURE_GCC_TLS - is_lisp_thread = 1; + current_thread = th; #else - pthread_setspecific(lisp_thread, (void *)1); + pthread_setspecific(specials, th); #endif if(arch_os_thread_init(th)==0) { /* FIXME: handle error */ lose("arch_os_thread_init failed"); } - th->os_thread=thread_self(); - #define GUARD_CONTROL_STACK 1 #define GUARD_BINDING_STACK 2 #define GUARD_ALIEN_STACK 4 @@ -543,8 +542,6 @@ void* new_thread_trampoline_switch_stack(void* arg) { } #endif -static struct thread *create_thread_struct(void*,lispobj); - static struct thread* recyclebin_threads; static pthread_mutex_t recyclebin_lock = PTHREAD_MUTEX_INITIALIZER; static struct thread* get_recyclebin_item() @@ -591,13 +588,10 @@ void empty_thread_recyclebin() void attach_os_thread(init_thread_data *scribble) { - os_thread_t os = pthread_self(); - odxprint(misc, "attach_os_thread: attaching to %p", os); - block_deferrable_signals(&scribble->oldset); void* recycled_memory = get_recyclebin_item(); - struct thread *th = create_thread_struct(recycled_memory, - NO_TLS_VALUE_MARKER_WIDETAG); + struct thread *th = alloc_thread_struct(recycled_memory, + NO_TLS_VALUE_MARKER_WIDETAG); #ifndef LISP_FEATURE_SB_SAFEPOINT /* new-lisp-thread-trampoline doesn't like when the GC signal is blocked */ @@ -606,36 +600,38 @@ attach_os_thread(init_thread_data *scribble) unblock_gc_signals(); #endif + th->os_kernel_tid = sb_GetTID(); + th->os_thread = pthread_self(); + #if !defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) /* On windows, arch_os_thread_init will take care of finding the * stack. */ void *stack_addr; size_t stack_size; -#ifdef LISP_FEATURE_OPENBSD +# ifdef LISP_FEATURE_OPENBSD stack_t stack; pthread_stackseg_np(os, &stack); stack_size = stack.ss_size; stack_addr = (void*)((size_t)stack.ss_sp - stack_size); -#elif defined LISP_FEATURE_SUNOS - stack_t stack; - thr_stksegment(&stack); - stack_size = stack.ss_size; - stack_addr = (void*)((size_t)stack.ss_sp - stack_size); -#elif defined(LISP_FEATURE_DARWIN) +# elif defined LISP_FEATURE_SUNOS + stack_t stack; + thr_stksegment(&stack); + stack_size = stack.ss_size; + stack_addr = (void*)((size_t)stack.ss_sp - stack_size); +# elif defined(LISP_FEATURE_DARWIN) stack_size = pthread_get_stacksize_np(os); stack_addr = (char*)pthread_get_stackaddr_np(os) - stack_size; -#else +# else pthread_attr_t attr; -#if defined LISP_FEATURE_FREEBSD || defined LISP_FEATURE_DRAGONFLY - pthread_attr_get_np(os, &attr); -#else +# if defined LISP_FEATURE_FREEBSD || defined LISP_FEATURE_DRAGONFLY + pthread_attr_get_np(th->os_thread, &attr); +# else int pthread_getattr_np(pthread_t, pthread_attr_t *); - pthread_getattr_np(os, &attr); -#endif + pthread_getattr_np(th->os_thread, &attr); +# endif pthread_attr_getstack(&attr, &stack_addr, &stack_size); pthread_attr_destroy(&attr); -#endif - +# endif th->control_stack_start = stack_addr; th->control_stack_end = (void *) (((uintptr_t) stack_addr) + stack_size); #endif @@ -650,13 +646,6 @@ attach_os_thread(init_thread_data *scribble) * so avoid 2 syscalls when possible */ recycled_memory ? 0 : GUARD_BINDING_STACK|GUARD_ALIEN_STACK, retain_lock); - - th->os_kernel_tid = sb_GetTID(); - - uword_t stacksize - = (uword_t) th->control_stack_end - (uword_t) th->control_stack_start; - odxprint(misc, "attach_os_thread: attached %p as %p (0x%lx bytes stack)", - os, th, (long) stacksize); } void @@ -667,13 +656,6 @@ detach_os_thread(init_thread_data *scribble) undo_init_new_thread(th, scribble); - odxprint(misc, "detach_os_thread: detached"); -#ifdef LISP_FEATURE_GCC_TLS - is_lisp_thread = 0; -#else - pthread_setspecific(lisp_thread, (void *)0); -#endif - /* We have to clear a STOP_FOR_GC signal if pending. Consider: * - on entry to undo_init_new_thread, we block all signals * - simultaneously some other thread decides that it needs to initiate a GC @@ -807,7 +789,7 @@ void release_all_threads_lock() */ static struct thread * -create_thread_struct(void* spaces, lispobj start_routine) { +alloc_thread_struct(void* spaces, lispobj start_routine) { #if defined(LISP_FEATURE_SB_THREAD) || defined(LISP_FEATURE_WIN32) unsigned int i; #endif @@ -999,16 +981,6 @@ create_thread_struct(void* spaces, lispobj start_routine) { return th; } -void create_main_lisp_thread(lispobj initial_function) { - struct thread *th = create_thread_struct(0, initial_function); -#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) - pthread_key_create(&lisp_thread, 0); -#endif - if(th) { - main_thread_trampoline(th); /* no return */ - } else lose("can't create initial thread"); -} - #ifdef LISP_FEATURE_SB_THREAD #ifndef __USE_XOPEN2K @@ -1042,7 +1014,7 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) if ( #ifdef OS_THREAD_STACK pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) || - (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline_switch_stack, th)) + (retcode = pthread_create(&th->os_thread, &attr, new_thread_trampoline_switch_stack, th)) #else # ifdef LISP_FEATURE_WIN32 @@ -1058,11 +1030,12 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) pthread_attr_setguardsize(&attr, 0) || # endif - (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline, th)) + (retcode = pthread_create(&th->os_thread, &attr, new_thread_trampoline, th)) #endif ) { perror("create_os_thread"); } else { + *kid_tid = th->os_thread; success = 1; } retcode = pthread_mutex_unlock(&create_thread_lock); @@ -1086,7 +1059,7 @@ os_thread_t create_thread(lispobj start_routine) { * linking it to all_threads can be left to the thread itself * without fear of gc lossage. 'start_routine' violates this * assumption and must stay pinned until the child starts up. */ - th = create_thread_struct(0, start_routine); + th = alloc_thread_struct(0, start_routine); if (th && !create_os_thread(th, &kid_tid)) { free_thread_struct(th); kid_tid = 0; diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 88ec014cae..a4277ed826 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -31,12 +31,6 @@ lispobj thread_state(struct thread *thread); void set_thread_state(struct thread *thread, lispobj state, boolean); void wait_for_thread_state_change(struct thread *thread, lispobj state); - -#ifdef LISP_FEATURE_GCC_TLS -extern __thread int is_lisp_thread; -#else -extern pthread_key_t lisp_thread; -#endif #endif #if defined(LISP_FEATURE_SB_SAFEPOINT) @@ -191,8 +185,13 @@ static inline lispobj FdefnFun(lispobj fdefn) # endif #endif -#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_GCC_TLS) +#ifdef LISP_FEATURE_SB_THREAD +// FIXME: these names should be consistent with one another +# ifdef LISP_FEATURE_GCC_TLS extern __thread struct thread *current_thread; +# else +extern pthread_key_t specials; +#endif #endif #ifndef LISP_FEATURE_SB_SAFEPOINT @@ -293,9 +292,9 @@ static inline struct thread *arch_os_get_current_thread(void) inline static int lisp_thread_p(os_context_t __attribute__((unused)) *context) { #ifdef LISP_FEATURE_SB_THREAD # ifdef LISP_FEATURE_GCC_TLS - return is_lisp_thread; + return current_thread != 0; # else - return pthread_getspecific(lisp_thread) != NULL; + return pthread_getspecific(specials) != NULL; # endif #elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) char *csp = (char *)*os_context_sp_addr(context); diff --git a/src/runtime/x86-64-bsd-os.c b/src/runtime/x86-64-bsd-os.c index 844e74c864..1c6c3b6f41 100644 --- a/src/runtime/x86-64-bsd-os.c +++ b/src/runtime/x86-64-bsd-os.c @@ -149,14 +149,6 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length) } int arch_os_thread_init(struct thread *thread) { -#ifdef LISP_FEATURE_SB_THREAD -#ifdef LISP_FEATURE_GCC_TLS - current_thread = thread; -#else - pthread_setspecific(specials,thread); -#endif -#endif - #ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER mach_lisp_thread_init(thread); #elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) diff --git a/src/runtime/x86-64-linux-os.c b/src/runtime/x86-64-linux-os.c index 782f7d6f96..e55ebe21b0 100644 --- a/src/runtime/x86-64-linux-os.c +++ b/src/runtime/x86-64-linux-os.c @@ -52,13 +52,6 @@ int arch_os_thread_init(struct thread *thread) { stack_t sigstack; -#ifdef LISP_FEATURE_SB_THREAD -#ifdef LISP_FEATURE_GCC_TLS - current_thread = thread; -#else - pthread_setspecific(specials,thread); -#endif -#endif #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK /* Signal handlers are run on the control stack, so if it is exhausted * we had better use an alternate stack for whatever signal tells us diff --git a/src/runtime/x86-64-sunos-os.c b/src/runtime/x86-64-sunos-os.c index 2d42c2ef4a..909fbb3fa1 100644 --- a/src/runtime/x86-64-sunos-os.c +++ b/src/runtime/x86-64-sunos-os.c @@ -22,14 +22,6 @@ int arch_os_thread_init(struct thread *thread) { -#ifdef LISP_FEATURE_SB_THREAD -#ifdef LISP_FEATURE_GCC_TLS - current_thread = thread; -#else - pthread_setspecific(specials,thread); -#endif -#endif - #if defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) /* Signal handlers are run on the control stack, so if it is exhausted * we had better use an alternate stack for whatever signal tells us diff --git a/src/runtime/x86-bsd-os.c b/src/runtime/x86-bsd-os.c index 2c39acd17f..6b56102ec4 100644 --- a/src/runtime/x86-bsd-os.c +++ b/src/runtime/x86-bsd-os.c @@ -196,14 +196,7 @@ int arch_os_thread_init(struct thread *thread) { FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n)); thread->tls_cookie=n; arch_os_load_ldt(thread); - -#ifdef LISP_FEATURE_GCC_TLS - current_thread = thread; -#else - pthread_setspecific(specials,thread); #endif -#endif - #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK stack_t sigstack; diff --git a/src/runtime/x86-linux-os.c b/src/runtime/x86-linux-os.c index dd66b97346..047249b3c7 100644 --- a/src/runtime/x86-linux-os.c +++ b/src/runtime/x86-linux-os.c @@ -74,11 +74,6 @@ int arch_os_thread_init(struct thread *thread) { ((entry_number << 3) + 3)); if(entry_number < 0) return 0; -#ifdef LISP_FEATURE_GCC_TLS - current_thread = thread; -#else - pthread_setspecific(specials,thread); -#endif #endif #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK From 0aed94effa11516559719ee15cfed1a5f394ba20 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 13 Jul 2020 06:23:36 -0400 Subject: [PATCH 0234/4023] Remove file extensions --- tests/parallel-exec.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 9acdd52b64..70eea870da 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -171,9 +171,15 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ argv (cddr argv))) (t (return)))) + (setq argv + (mapcar (lambda (file) + (probe-file file) ; for effect + (pathname-name file)) argv)) (parallel-execute-tests (loop for trial-number from 1 to runs-per-test - nconc (mapcar (lambda (file) (cons file trial-number)) + nconc (mapcar (lambda (file) + (cons file + (when (> runs-per-test 1) trial-number))) argv)) jobs nil))) From 798d48846bdac4052fd77748339608ee9310a9dd Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 13 Jul 2020 14:52:22 +0300 Subject: [PATCH 0235/4023] Fix darwin, openbsd. --- src/runtime/thread.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 994f3d95e0..7631f8372a 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -610,7 +610,7 @@ attach_os_thread(init_thread_data *scribble) size_t stack_size; # ifdef LISP_FEATURE_OPENBSD stack_t stack; - pthread_stackseg_np(os, &stack); + pthread_stackseg_np(th->os_thread, &stack); stack_size = stack.ss_size; stack_addr = (void*)((size_t)stack.ss_sp - stack_size); # elif defined LISP_FEATURE_SUNOS @@ -619,8 +619,8 @@ attach_os_thread(init_thread_data *scribble) stack_size = stack.ss_size; stack_addr = (void*)((size_t)stack.ss_sp - stack_size); # elif defined(LISP_FEATURE_DARWIN) - stack_size = pthread_get_stacksize_np(os); - stack_addr = (char*)pthread_get_stackaddr_np(os) - stack_size; + stack_size = pthread_get_stacksize_np(th->os_thread); + stack_addr = (char*)pthread_get_stackaddr_np(th->os_thread) - stack_size; # else pthread_attr_t attr; # if defined LISP_FEATURE_FREEBSD || defined LISP_FEATURE_DRAGONFLY From f90b4c996fef6869d56f20371e3a74b4558bdb69 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 13 Jul 2020 16:38:34 +0300 Subject: [PATCH 0236/4023] Fix OS_THREAD_STACK. Can't pass the thread to pthread_create as it may be freed by the time pthread_create is done. Have to initialize in init_new_thread. --- src/runtime/thread.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 7631f8372a..e9041a2232 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -373,6 +373,8 @@ init_new_thread(struct thread *th, lose("arch_os_thread_init failed"); } + th->os_thread=thread_self(); + #define GUARD_CONTROL_STACK 1 #define GUARD_BINDING_STACK 2 #define GUARD_ALIEN_STACK 4 @@ -1014,7 +1016,7 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) if ( #ifdef OS_THREAD_STACK pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) || - (retcode = pthread_create(&th->os_thread, &attr, new_thread_trampoline_switch_stack, th)) + (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline_switch_stack, th)) #else # ifdef LISP_FEATURE_WIN32 @@ -1030,12 +1032,11 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) pthread_attr_setguardsize(&attr, 0) || # endif - (retcode = pthread_create(&th->os_thread, &attr, new_thread_trampoline, th)) + (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline, th)) #endif ) { perror("create_os_thread"); } else { - *kid_tid = th->os_thread; success = 1; } retcode = pthread_mutex_unlock(&create_thread_lock); From e77ad2a355f08f8ef5a5ea2ce778d2a5ce53fd37 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 13 Jul 2020 10:21:02 -0400 Subject: [PATCH 0237/4023] Remove :HOST mode from SB-COLD::FEATURE-IN-LIST-P --- make-host-1.lisp | 3 +-- make-host-2.lisp | 9 +++------ src/cold/shebang.lisp | 16 +++++----------- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/make-host-1.lisp b/make-host-1.lisp index c56848fa43..7c141e8ed8 100644 --- a/make-host-1.lisp +++ b/make-host-1.lisp @@ -49,8 +49,7 @@ ;; that are known to build cleanly. (sb-int:simple-style-warning (lambda (c &aux (fc (simple-condition-format-control c))) - (when (and (feature-in-list-p '(:or :x86 :x86-64 :arm64) - :target) + (when (and (featurep '(:or :x86 :x86-64 :arm64)) in-summary (stringp fc) (search "undefined" fc)) diff --git a/make-host-2.lisp b/make-host-2.lisp index 8ddaef08ce..e96cfdd609 100644 --- a/make-host-2.lisp +++ b/make-host-2.lisp @@ -31,9 +31,7 @@ ;; Enforce absence of unexpected forward-references to warm loaded code. ;; Looking into a hidden detail of this compiler seems fair game. (when (and sb-c::*undefined-warnings* - (feature-in-list-p - '(:or :x86 :x86-64 :arm64) ; until all the rest are clean - :target)) + (featurep '(:or :x86 :x86-64 :arm64))) ; until all the rest are clean (setf fail t) (dolist (warning sb-c::*undefined-warnings*) (case (sb-c::undefined-warning-kind warning) @@ -42,7 +40,7 @@ (:function (setf functions t)))))) ;; Exit the compilation unit so that the summary is printed. Then complain. ;; win32 is not clean - (when (and fail (not (feature-in-list-p :win32 :target))) + (when (and fail (not (featurep :win32))) (cerror "Proceed anyway" "Undefined ~:[~;variables~] ~:[~;types~]~ ~:[~;functions (incomplete SB-COLD::*UNDEFINED-FUN-WHITELIST*?)~]" @@ -103,8 +101,7 @@ ;; As each platform's build becomes warning-free, ;; it should be added to the list here to prevent regresssions. (when (and likely-suspicious - (feature-in-list-p '(:and (:or :x86 :x86-64) (:or :linux :darwin)) - :target)) + (featurep '(:and (:or :x86 :x86-64) (:or :linux :darwin)))) (warn "Expected zero inlinining failures")))) ;; After cross-compiling, show me a list of types that checkgen diff --git a/src/cold/shebang.lisp b/src/cold/shebang.lisp index bf379ed73c..37f1be5c2d 100644 --- a/src/cold/shebang.lisp +++ b/src/cold/shebang.lisp @@ -88,25 +88,19 @@ ;;; We should never call this with a selector of :HOST any more, ;;; but I'm keeping it in case of emergency. -(defun feature-in-list-p (feature selector - &aux (list (ecase selector - (:host cl:*features*) - (:target sb-xc:*features*)))) +(defun featurep (feature &aux (list sb-xc:*features*)) (etypecase feature (symbol - (if (and (string= feature "SBCL") (eq selector :target)) + (if (string= feature "SBCL") (error "Testing SBCL as a target feature is obviously bogus") (member feature list :test #'eq))) - (cons (flet ((subfeature-in-list-p (subfeature) - (feature-in-list-p subfeature selector))) + (cons (flet ((subfeature-in-list-p (subfeature) (featurep subfeature))) (ecase (first feature) (:or (some #'subfeature-in-list-p (rest feature))) (:and (every #'subfeature-in-list-p (rest feature))) (:not (destructuring-bind (subexpr) (cdr feature) (not (subfeature-in-list-p subexpr)))) ((:vop-named :vop-translates) - (when (eq selector :host) - (error "Invalid host feature test: ~S" feature)) (destructuring-bind (subexpr) (cdr feature) (case (first feature) (:vop-named @@ -115,7 +109,7 @@ (:vop-translates (recording-feature-eval feature (any-vop-translates-p subexpr))))))))))) -(compile 'feature-in-list-p) +(compile 'featurep) (defun read-targ-feature-expr (stream sub-character infix-parameter) (when infix-parameter @@ -123,7 +117,7 @@ (if (char= (if (let* ((*package* (find-package "KEYWORD")) (*read-suppress* nil) (feature (read stream t nil t))) - (feature-in-list-p feature :target)) + (featurep feature)) #\+ #\-) sub-character) (read stream t nil t) From 66e3b5271928fb0dde455e6f18e10dc2c88dda84 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 13 Jul 2020 17:32:50 -0400 Subject: [PATCH 0238/4023] Add a developer feature to backtrace all threads on a signal You have provide your own CFLAGS to compile as such. --- src/compiler/generic/genesis.lisp | 2 +- src/runtime/Config.x86-64-linux | 4 + src/runtime/backtrace.c | 118 ++++++++++++++++++++++++++++++ src/runtime/linux-os.c | 13 ++++ 4 files changed, 136 insertions(+), 1 deletion(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index bd5c890ec0..6750a25df5 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3859,7 +3859,7 @@ III. initially undefined function references (alphabetically): (format stream "~&#include \"~A.h\"~%" (string-downcase (sb-vm:primitive-object-name obj)))))) (dolist (class '(classoid defstruct-description hash-table layout package - sb-thread::avlnode + sb-thread::avlnode sb-thread::mutex sb-c::compiled-debug-info sb-c::compiled-debug-fun)) (out-to (string-downcase class) (write-structure-object (layout-info (find-layout class)) stream))) diff --git a/src/runtime/Config.x86-64-linux b/src/runtime/Config.x86-64-linux index 904631c688..5b242bf0a2 100644 --- a/src/runtime/Config.x86-64-linux +++ b/src/runtime/Config.x86-64-linux @@ -42,6 +42,10 @@ ifdef LISP_FEATURE_SB_CORE_COMPRESSION OS_LIBS += -lz endif +ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE + OS_LIBS += -lunwind +endif + CFLAGS += -Wunused-parameter -fno-omit-frame-pointer -momit-leaf-frame-pointer DISABLE_PIE=no diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 95900824fb..8015100c85 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -588,3 +588,121 @@ lisp_backtrace(int nframes) } } #endif + +// Find the simple_fun that contains 'pc' in 'code' +int simple_fun_index_from_pc(struct code* code, char *pc) +{ + char *instruction_area = code_text_start(code); + unsigned int* offsets = code_fun_table(code) - 1; + int index; + for (index = code_n_funs(code) - 1; index >= 0; --index) { + char *base = instruction_area + offsets[-index]; + if (pc >= base) return index; + } + return -1; +} + +static boolean print_lisp_fun_name(char* pc) +{ + struct code* code; + int fi; + lispobj fn; + if (gc_managed_addr_p((uword_t)pc) && + (code = (void*)component_ptr_from_pc(pc)) != 0 && + (fi = simple_fun_index_from_pc(code, pc)) >= 0 && + is_lisp_pointer(fn = code->constants[fi*CODE_SLOTS_PER_SIMPLE_FUN])) { + fprintf(stderr, " %p [", pc); + print_entry_name(fn, stderr); + fprintf(stderr, "]\n"); + return 1; + } + return 0; +} + +#ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE +#define UNW_LOCAL_ONLY +#include +#include "genesis/thread-instance.h" +#include "genesis/mutex.h" +static int backtrace_completion_pipe[2] = {-1,-1}; +void libunwind_backtrace(struct thread *th, os_context_t *context) +{ + char procname[100]; + fprintf(stderr, "Lisp thread @ %p, tid %d", th, (int)th->os_kernel_tid); + struct thread_instance* lispthread = (void*)native_pointer(th->lisp_thread); + if (lispthread->name != NIL) { + fprintf(stderr, " (\""); + print_string(VECTOR(lispthread->name), stderr); + fprintf(stderr, "\")"); + } + putc('\n', stderr); + if (lispthread->waiting_for != NIL) { + fprintf(stderr, "waiting for %p", (void*)lispthread->waiting_for); + if (instancep(lispthread->waiting_for)) { + // THREAD-WAITING-FOR can be a mutex or a waitqueue (if not a cons). + // Accessing it as if it's a mutex works because both a waitqueue + // and a mutex have a name at the same slot offset (if #+sb-futex). + // So to reiterate the comment from linux-os.c - + // "Use this only if you know what you're doing" + struct mutex* lispmutex = (void*)native_pointer(lispthread->waiting_for); + if (lispmutex->name != NIL) { + fprintf(stderr, " (MUTEX:\""); + print_string(VECTOR(lispmutex->name), stderr); + fprintf(stderr, "\")"); + } + } + putc('\n', stderr); + } + unw_cursor_t cursor; + // "unw_init_local() is thread-safe as well as safe to use from a signal handler." + // "unw_get_proc_name() is thread-safe. If cursor cp is in the local address-space, + // this routine is also safe to use from a signal handler." + unw_init_local(&cursor, context); + do { + uword_t offset; + char *pc; + unw_get_reg(&cursor, UNW_X86_64_RIP, (uword_t*)&pc); + if (print_lisp_fun_name(pc)) { + // printed + } else if (!unw_get_proc_name(&cursor, procname, sizeof procname, &offset)) { + fprintf(stderr, " %p [%s]\n", pc, procname); + } else { + fprintf(stderr, " %p ?\n", pc); + } + } while (unw_step(&cursor)); +} +void backtrace_lisp_threads(int __attribute__((unused)) signal, + siginfo_t __attribute__((unused)) *info, + os_context_t *context) +{ + if (backtrace_completion_pipe[1] >= 0) { + libunwind_backtrace(current_thread, context); + write(backtrace_completion_pipe[1], context /* any random byte */, 1); + return; + } + struct thread *th; + int nthreads = 0; + for_each_thread(th) { ++nthreads; } + fprintf(stderr, "Caught backtrace-all signal in tid %d, %d threads\n", + (int)arch_os_get_current_thread()->os_kernel_tid, nthreads); + // Would be nice if we could forcibly stop all the other threads, + // but pthread_mutex_trylock is not safe to use in a signal handler. + if (nthreads > 1) { + pipe(backtrace_completion_pipe); + } + for_each_thread(th) { + if (th == arch_os_get_current_thread()) + libunwind_backtrace(th, context); + else { + char junk; + pthread_kill(th->os_thread, SIGXCPU); + read(backtrace_completion_pipe[0], &junk, 1); + } + } + if (nthreads > 1) { + close(backtrace_completion_pipe[1]); + close(backtrace_completion_pipe[0]); + backtrace_completion_pipe[0] = backtrace_completion_pipe[1] = -1; + } +} +#endif diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 946702850a..70cdc1e4f1 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -337,6 +337,19 @@ os_install_interrupt_handlers(void) sig_stop_for_gc_handler); # endif #endif + +#ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE + // Use this only if you know what you're doing + void backtrace_lisp_threads(int, siginfo_t*, os_context_t*); + fprintf(stderr, "SIGXCPU (%d), will backtrace in all threads\n", SIGXCPU); + sigdelset(&deferrable_sigset, SIGXCPU); + sigdelset(&blockable_sigset, SIGXCPU); + undoably_install_low_level_interrupt_handler(SIGXCPU, backtrace_lisp_threads); + sigset_t ss; + sigemptyset(&ss); + sigaddset(&ss, SIGXCPU); + pthread_sigmask(SIG_UNBLOCK, &ss, 0); +#endif } char *os_get_runtime_executable_path() From 993e3de39399d6fd40ff6dc5625ebb81107e9076 Mon Sep 17 00:00:00 2001 From: Jan Moringen Date: Tue, 14 Jul 2020 09:59:23 +0200 Subject: [PATCH 0239/4023] Handle components that are PATTERNs in MAKE-LOAD-FORM PATHNAME method Components can be PATTERN instances in addition to lists of PATTERNs and non-PATTERNs. --- src/code/target-pathname.lisp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index 8cf1be0917..9dffe3b8d0 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -2022,9 +2022,11 @@ existing translations for \"SYS:SRC;\", \"SYS:CONTRIB;\", and (defmethod make-load-form ((pn pathname) &optional env) (declare (ignore env)) (labels ((reconstruct (component) - (if (and (listp component) (some #'pattern-p component)) - (cons 'list (mapcar #'patternify component)) - `',component)) + (cond ((pattern-p component) + (patternify component)) + ((and (listp component) (some #'pattern-p component)) + (cons 'list (mapcar #'patternify component))) + (t`',component))) (patternify (subcomponent) (if (pattern-p subcomponent) `(make-pattern ',(pattern-pieces subcomponent)) From f2ae99fab3e5685975e6d7a4653ad895882ff394 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 14 Jul 2020 14:50:01 +0300 Subject: [PATCH 0240/4023] Disable finalize.impure on sb-safepoint. It tends to just hang. --- tests/finalize.impure.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/finalize.impure.lisp b/tests/finalize.impure.lisp index 9760175d37..7a9fe47ae3 100644 --- a/tests/finalize.impure.lisp +++ b/tests/finalize.impure.lisp @@ -1,4 +1,5 @@ #+interpreter (sb-ext:exit :code 104) +#+sb-safepoint (sb-ext:exit :code 104) ; tends to hang (defvar *tmp* 0.0) ; don't remove - used by the setq below (defglobal *count* 0) From 03064da059eed38cf811127ed8ec6ad2a0a12918 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 14 Jul 2020 08:45:36 -0400 Subject: [PATCH 0241/4023] Fix C warning --- src/runtime/backtrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 8015100c85..947f8b1ccc 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -602,7 +602,7 @@ int simple_fun_index_from_pc(struct code* code, char *pc) return -1; } -static boolean print_lisp_fun_name(char* pc) +static boolean __attribute__((unused)) print_lisp_fun_name(char* pc) { struct code* code; int fi; From a5c377b55777d8bf1d338b04dd79d0a694b54863 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 14 Jul 2020 11:33:10 -0400 Subject: [PATCH 0242/4023] Remove some stray uses of pthread_setspecific * Tested on ppc64 and ppc32 on linux * Possibly fixes x86 on darwin and sunos (not testable by me) * No idea what this does for win32 --- make-config.sh | 2 +- src/runtime/ppc-bsd-os.c | 7 ------- src/runtime/ppc-linux-os.c | 4 ---- src/runtime/ppc64-assem.S | 27 ++++----------------------- src/runtime/x86-64-win32-os.c | 2 +- src/runtime/x86-darwin-os.c | 2 -- src/runtime/x86-sunos-os.c | 2 -- 7 files changed, 6 insertions(+), 40 deletions(-) diff --git a/make-config.sh b/make-config.sh index 518f332826..03326503ce 100755 --- a/make-config.sh +++ b/make-config.sh @@ -491,7 +491,7 @@ case "$sbcl_os" in linux) printf ' :unix :linux :elf' >> $ltf case "$sbcl_arch" in - x86 | x86-64 | arm64) + arm64 | ppc64 | x86 | x86-64) printf ' :gcc-tls' >> $ltf esac diff --git a/src/runtime/ppc-bsd-os.c b/src/runtime/ppc-bsd-os.c index f1d03c12a6..600f854648 100644 --- a/src/runtime/ppc-bsd-os.c +++ b/src/runtime/ppc-bsd-os.c @@ -77,7 +77,6 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length) } int arch_os_thread_init(struct thread *thread) { - #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK stack_t sigstack; @@ -89,15 +88,9 @@ int arch_os_thread_init(struct thread *thread) { sigstack.ss_size = calc_altstack_size(thread); sigaltstack(&sigstack,0); #endif - -#if defined(LISP_FEATURE_SB_THREAD) - pthread_setspecific(specials,thread); -#endif - return 1; /* success */ } int arch_os_thread_cleanup(struct thread *thread) { - return 1; /* success */ } diff --git a/src/runtime/ppc-linux-os.c b/src/runtime/ppc-linux-os.c index 01aeb8ba37..1d26cc36e0 100644 --- a/src/runtime/ppc-linux-os.c +++ b/src/runtime/ppc-linux-os.c @@ -40,10 +40,6 @@ #include "ppc-linux-mcontext.h" int arch_os_thread_init(struct thread *thread) { -#if defined(LISP_FEATURE_SB_THREAD) - pthread_setspecific(specials,thread); -#endif - /* For some reason, PPC Linux appears to default to not generating * floating point exceptions. PR_SET_FPEXC is a PPC-specific * option new in kernel 2.4.21 and 2.5.32 that allows us to diff --git a/src/runtime/ppc64-assem.S b/src/runtime/ppc64-assem.S index 7c29e9cb75..f0ae8a2c8e 100644 --- a/src/runtime/ppc64-assem.S +++ b/src/runtime/ppc64-assem.S @@ -148,9 +148,6 @@ indirect_ptr(dynamic_space_free_pointer) indirect_ptr(foreign_function_call_active) #endif indirect_ptr(all_threads) -#if defined(LISP_FEATURE_SB_THREAD) -indirect_ptr(specials) -#endif .text @@ -163,26 +160,10 @@ indirect_ptr(specials) C_FULL_PROLOG /* NL0 - function, NL1 - frame pointer, NL2 - nargs. */ #ifdef LISP_FEATURE_SB_THREAD - /* We need to obtain a pointer to our TLS block before we do - * anything else. For this, we call pthread_getspecific(). - * We've preserved all of the callee-saves registers, so we - * can use them to stash our arguments temporarily while we - * make the call. */ - mr reg_A0, reg_NL0 - mr reg_A1, reg_NL1 - mr reg_A2, reg_NL2 - - /* Call out to obtain our TLS block. */ - load(reg_NL0,specials) - bl pthread_getspecific - nop - - mr reg_THREAD, reg_NL0 - - /* Restore our original parameters. */ - mr reg_NL2, reg_A2 - mr reg_NL1, reg_A1 - mr reg_NL0, reg_A0 + // Copy ABI TLS value of current_thread into lisp thread base + addis reg_THREAD,13,current_thread@tprel@ha + addi reg_THREAD,reg_THREAD,current_thread@tprel@l + ld reg_THREAD,0(reg_THREAD) #endif /* Initialize tagged registers */ li reg_ZERO,0 diff --git a/src/runtime/x86-64-win32-os.c b/src/runtime/x86-64-win32-os.c index 46b9727a29..49b9dd9349 100644 --- a/src/runtime/x86-64-win32-os.c +++ b/src/runtime/x86-64-win32-os.c @@ -76,7 +76,7 @@ int arch_os_thread_init(struct thread *thread) #ifdef LISP_FEATURE_SB_THREAD - pthread_setspecific(specials,thread); + pthread_setspecific(specials,thread); // FIXME: remove this line? #endif return 1; } diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index da56868218..1154a5140c 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -81,8 +81,6 @@ int arch_os_thread_init(struct thread *thread) { FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n)); thread->tls_cookie=n; arch_os_load_ldt(thread); - - pthread_setspecific(specials,thread); #endif #ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER mach_lisp_thread_init(thread); diff --git a/src/runtime/x86-sunos-os.c b/src/runtime/x86-sunos-os.c index 69eaac0dc5..a37bd89aba 100644 --- a/src/runtime/x86-sunos-os.c +++ b/src/runtime/x86-sunos-os.c @@ -101,8 +101,6 @@ int arch_os_thread_init(struct thread *thread) { __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel)); thread->tls_cookie = sel; - pthread_setspecific(specials,thread); - #endif #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK From 0a4f91f06c601cfa70dfd6044517357b98f503ad Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 14 Jul 2020 23:31:56 +0300 Subject: [PATCH 0243/4023] Skip a test on :interpreter. Something to do with sb-alien not liking to be interpreted. --- tests/fcb-threads.impure.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index bbe08a282a..8d740305b3 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -76,7 +76,8 @@ (sb-thread:barrier (:write)) (sb-thread:join-thread thr)))) -(with-test (:name :call-me-from-many-threads-and-gc) +(with-test (:name :call-me-from-many-threads-and-gc + :skipped-on :interpreter) ;; two trials, 5 threads, 40 calls each (f 2 5 40) ;; one trial, 10 threads, 10 calls From 8aff346ff3e23d1a3adeffac3b86500e8d85b8a4 Mon Sep 17 00:00:00 2001 From: Jan Moringen Date: Wed, 15 Jul 2020 00:10:44 +0200 Subject: [PATCH 0244/4023] Restore proper reports for some file-related errors File errors other than FILE-{EXISTS,DOES-NOT-EXIST} used to include the decoded errno string in their reports, but commit 161c265a broke that behavior. This change restores the reports. --- src/code/condition.lisp | 33 +++++++++++++++++++++++++++++---- src/code/fd-stream.lisp | 37 ++++++++++++++++++------------------- src/code/filesys.lisp | 18 ++++++++---------- 3 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/code/condition.lisp b/src/code/condition.lisp index 4a01ba26d4..d0717dce97 100644 --- a/src/code/condition.lisp +++ b/src/code/condition.lisp @@ -1931,7 +1931,15 @@ the restart does not exist.")) (program-error-message condition))))) (define-condition simple-control-error (simple-condition control-error) ()) -(define-condition simple-file-error (simple-condition file-error) ()) + +(define-condition simple-file-error (simple-condition file-error) + ((message :initarg :message :reader simple-file-error-message :initform nil)) + (:report + (lambda (condition stream) + (format stream "~@<~?~@[: ~2I~_~A~]~@:>" + (simple-condition-format-control condition) + (simple-condition-format-arguments condition) + (simple-file-error-message condition))))) (defun %file-error (pathname &optional datum &rest arguments) (typecase datum @@ -1940,9 +1948,26 @@ the restart does not exist.")) :format-arguments arguments)) (t (apply #'error datum :pathname pathname arguments)))) -(define-condition file-exists (simple-file-error) ()) -(define-condition file-does-not-exist (simple-file-error) ()) -(define-condition delete-file-error (simple-file-error) ()) +(define-condition file-exists (simple-file-error) () + (:report + (lambda (condition stream) + (format stream "~@" + (file-error-pathname condition) + (simple-file-error-message condition))))) + +(define-condition file-does-not-exist (simple-file-error) () + (:report + (lambda (condition stream) + (format stream "~@" + (file-error-pathname condition) + (simple-file-error-message condition))))) + +(define-condition delete-file-error (simple-file-error) () + (:report + (lambda (condition stream) + (format stream "~@" + (file-error-pathname condition) + (simple-file-error-message condition))))) (define-condition simple-stream-error (simple-condition stream-error) ()) (define-condition simple-parse-error (simple-condition parse-error) ()) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index 2113c1bb52..e2e954467b 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -462,16 +462,16 @@ (defun file-perror (pathname errno &optional datum &rest arguments) (declare (optimize allow-non-returning-tail-call)) - (multiple-value-bind (condition-type arguments) - (typecase datum - (format-control - (values 'simple-file-error - (list :format-control "~@<~?~@[: ~2I~_~A~]~:>" - :format-arguments (list datum arguments - (when errno (strerror errno)))))) - (t - (values datum arguments))) - (apply #'error condition-type :pathname pathname arguments))) + (let ((message (when errno (strerror errno)))) + (multiple-value-bind (condition-type arguments) + (typecase datum + (format-control + (values 'simple-file-error (list :format-control datum + :format-arguments arguments))) + (t + (values datum arguments))) + (apply #'error condition-type :pathname pathname :message message + arguments)))) (defun c-string-encoding-error (external-format code) (declare (optimize allow-non-returning-tail-call)) @@ -2312,10 +2312,8 @@ "~@" namestring original)))) (defun %open-error (pathname errno if-exists if-does-not-exist) - (flet ((signal-it (&optional (condition 'simple-file-error)) - (file-perror pathname errno condition - :format-control "Error opening ~S" - :format-arguments (list pathname)))) + (flet ((signal-it (&rest arguments) + (apply #'file-perror pathname errno arguments))) (restart-case (case errno (#-win32 #.sb-unix:enoent @@ -2351,7 +2349,7 @@ :report "Reopen with :if-exists :append" '(:new-if-exists :append))))) (t - (signal-it))) + (signal-it "Error opening ~S" pathname))) (continue () :report "Retry opening." '()) @@ -2486,15 +2484,16 @@ (when (and output (= (logand orig-mode #o170000) #o40000)) (file-perror - pathname - "can't open ~A for output: is a directory" pathname)) + pathname nil + "Can't open ~S for output: is a directory" + pathname)) (setf mode (logand orig-mode #o777)) t) ((eql err/dev sb-unix:enoent) nil) (t - (file-perror - namestring err/dev "can't find ~S" namestring))))))) + (file-perror namestring err/dev + "Can't find ~S" namestring))))))) (unless (and exists (rename-the-old-one namestring original)) (setf original nil) diff --git a/src/code/filesys.lisp b/src/code/filesys.lisp index 692b4609ae..5902b3e549 100644 --- a/src/code/filesys.lisp +++ b/src/code/filesys.lisp @@ -360,13 +360,13 @@ :as-directory (eq :directory kind)))) (errorp (file-perror filename (sb-win32:get-last-error) - "Failed to find the ~a of ~A" query-for filename))))) + "Failed to find the ~A of ~S" query-for filename))))) (:write-date (cond ((sb-win32::native-file-write-date filename)) (errorp (file-perror filename (sb-win32:get-last-error) - "Failed to find the ~a of ~A" query-for filename))))))) + "Failed to find the ~A of ~S" query-for filename))))))) #-win32 (defun %query-file-system (pathname query-for errorp) @@ -404,7 +404,7 @@ (realpath (parse realpath :as-directory t)) (errorp - (file-perror filename errno "couldn't resolve ~A"))))) + (file-perror filename errno "Couldn't resolve ~S" filename))))) (resolve-problematic-symlink (filename errno realpath-failed) ;; SBCL has for many years had a policy that a pathname ;; that names an existing, dangling or self-referential @@ -442,7 +442,8 @@ ;; The file doesn't exist; maybe error. (errorp (file-perror - pathname errno "Failed to find the ~A of ~A" query-for pathname)))))) + pathname errno + "Failed to find the ~A of ~A" query-for pathname)))))) (binding* ((filename (native-namestring pathname :as-file t)) ((existsp errno nil mode nil uid nil nil nil nil mtime) (sb-unix:unix-stat filename))) @@ -543,9 +544,7 @@ per standard Unix unlink() behaviour." (values nil (sb-win32:get-last-error))) (unless res (with-simple-restart (continue "Return T") - (file-perror namestring err 'delete-file-error - :format-control "Couldn't delete ~A" - :format-arguments (list namestring)))))) + (file-perror namestring err 'delete-file-error))))) t) (defun directorize-pathname (pathname) @@ -619,9 +618,8 @@ exist or if is a file or a symbolic link." (get-errno)) (if res dir - (file-perror - namestring errno - "Could not delete directory ~A" namestring)))))) + (file-perror namestring errno + "Could not delete directory ~S" namestring)))))) (let ((physical (directorize-pathname (physicalize-pathname (merge-pathnames From 05ad4180b1de7284d6840df9235072168bf75e12 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 00:22:42 -0400 Subject: [PATCH 0245/4023] Unpessimize SB-C::FIND-CONSTANT some more Don't gethash on symbols and fixnums in the EQUAL hash table --- src/compiler/ir1util.lisp | 51 ++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 0e7f265b74..00f60eb827 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -2458,8 +2458,24 @@ is :ANY, the function name is not checked." ;; 1. layouts go in the hash-table so that a code component references ;; any given layout at most once ;; 2. STANDARD-OBJECT layouts use MAKE-LOAD-FORM + ;; + ;; Note also, that in this code COALESCE-P has two meanings: + ;; (1) _could_ you look up in the hash-table some object + ;; which *contains* certain types. + ;; (2) _should_ you look up ... + ;; Suppose you have a a cons of a string and an instance: + ;; ("foo" . #) + ;; and another similar cons to that which has a STRING= string + ;; (same type), and an EQ instance. You _may_ look up that cons + ;; in the similarity table. But if the key to the table is just the + ;; #, while you _may_ look it up, you SHOULD NOT look it up, + ;; because if it was not EQ to something, then it is not EQUAL either. + ;; Due to how our EQUAL hash-tables behave on INSTANCE types, + ;; you don't want to side-effect the instance by causing it to grow + ;; a stable hash slot. Of course, in the case of the cons holding + ;; an instance, it will cause the side-effect on the instance. (let ((faslp (producing-fasl-file)) - (ns (if (boundp '*ir1-namespace*) *ir1-namespace*))) + (namespace (if (boundp '*ir1-namespace*) *ir1-namespace*))) (labels ((core-coalesce-p (x) (sb-xc:typep x '(or symbol number character instance))) (cons-coalesce-p (x) @@ -2481,6 +2497,12 @@ is :ANY, the function name is not checked." (descend x))))) (atom-colesce-p (x) (or (core-coalesce-p x) + ;; Honestly I don't see why this list is so restrictive. + ;; e.g. What's the harm in deciding that any array + ;; may be a subpart of a coalescible object? + ;; It seems quite bogus to presume that the similarity + ;; relation would do the wrong thing and that we have to guard + ;; against potential wrongdoing. (typep x '(or bit-vector string)))) (file-coalesce-p (x) ;; CLHS 3.2.4.2.2: We are also allowed to coalesce various @@ -2506,32 +2528,39 @@ is :ANY, the function name is not checked." (when (and faslp (not (sb-fasl:dumpable-layout-p object)) namep) (maybe-emit-make-load-forms object name)) ;; Has this identical object been seen before? Bail out early if so. - (awhen (and ns (gethash object (eq-constants ns))) + (awhen (and namespace (gethash object (eq-constants namespace))) (return-from find-constant it)) - (let* ((coalescep (and ns + (let* ((coalescep (and namespace (if faslp (file-coalesce-p object) (core-coalesce-p object)))) (effectively-coalescible + ;; See comment at top about why NOT to look up some things. + ;; "effectively coalescible" means "would attempting to coalesce + ;; this object have any effect beyond merely using the EQ table?" + ;; This has to avoid being sensitive to the cross-compiler host. + ;; For example, the number #.(ash 1 32) is probably not an immediate + ;; value on any 32-bit lisp. It would extremely fortuitous to find + ;; it in the EQ table, but if it isn't there, we _should_ look in + ;; the similar table. In the target lisp, if on a 64-bit build, + ;; then EQUAL/similar is as good as EQ for that key. (and coalescep - ;; No instance subtype except a pathname can be coalesced - ;; by the similarity table (as currently implemented) - (or (not (sb-xc:typep object 'instance)) - (sb-xc:typep object 'pathname))))) + (not (sb-xc:typep object '(or symbol instance + #-sb-xc-host fixnum)))))) ;; constants referred to by name must retain their identity: ;; they must not be coalesced with some other similar-enough ;; constant. (when (and effectively-coalescible (not namep)) - (dolist (candidate (gethash object (similar-constants ns))) + (dolist (candidate (gethash object (similar-constants namespace))) (when (similarp (constant-value candidate) object) (return-from find-constant candidate)))) (when (and faslp (not (sb-fasl:dumpable-layout-p object)) (not namep)) (maybe-emit-make-load-forms object)) (let ((new (make-constant object))) - (when ns - (setf (gethash object (eq-constants ns)) new) + (when namespace + (setf (gethash object (eq-constants namespace)) new) (when effectively-coalescible - (push new (gethash object (similar-constants ns))))) + (push new (gethash object (similar-constants namespace))))) new))))) ;;; Return true if X and Y are lvars whose only use is a From ccb10a2f93d961ce4ad792e32861e98c5a7b643b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 00:24:32 -0400 Subject: [PATCH 0246/4023] Ignore *break-on-signals* in CL snapshot diff --- src/cold/snapshot.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cold/snapshot.lisp b/src/cold/snapshot.lisp index 1670f377ee..53e942ffcf 100644 --- a/src/cold/snapshot.lisp +++ b/src/cold/snapshot.lisp @@ -108,6 +108,7 @@ / // /// + ++ +++ - + *break-on-signals* *gensym-counter* ;; These are bound when compiling and/or loading: *package* From 77a528d1fba5418a27262dde55a07f9ebebe9ca9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 01:57:01 -0400 Subject: [PATCH 0247/4023] Be more specific about allowed undefined classoids --- src/code/warm-error.lisp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/code/warm-error.lisp b/src/code/warm-error.lisp index 84aa610437..be25aca870 100644 --- a/src/code/warm-error.lisp +++ b/src/code/warm-error.lisp @@ -25,7 +25,11 @@ (setf (sb-int:info :function :type s) parsed))))) ;; One good kludge deserves another. ;; This is OK only because it's the very first file compiled in warm build. - (assert (<= (length sb-c::*undefined-warnings*) 2)) + (let ((disallowed-undefineds + (remove-if (lambda (x) (member x '(class sb-pcl::condition-class))) + (mapcar #'sb-c::undefined-warning-name + sb-c::*undefined-warnings*)))) + (assert (not disallowed-undefineds))) (setf sb-c::*undefined-warnings* nil)) ;;; Moved from 'cold-error' to this file because of (at least) these reasons: From 5deb99b2d222d0fdf8aa32fcd4e076ec417647a3 Mon Sep 17 00:00:00 2001 From: Jan Moringen Date: Wed, 15 Jul 2020 09:31:46 +0200 Subject: [PATCH 0248/4023] Improve documentation strings of some list-related functions --- src/code/list.lisp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/code/list.lisp b/src/code/list.lisp index a3a6e9c606..9e86a39710 100644 --- a/src/code/list.lisp +++ b/src/code/list.lisp @@ -175,7 +175,7 @@ (endp object)) (defun list-length (list) - "Return the length of the given List, or Nil if the List is circular." + "Return the length of LIST, or NIL if LIST is circular." (do ((n 0 (+ n 2)) (y list (cddr y)) (z list (cdr z))) @@ -351,7 +351,7 @@ form)) (defun list (&rest args) - "Return constructs and returns a list of its arguments." + "Construct and return a list containing the objects ARGS." args) ;;; LIST* is done the same as LIST, except that the last cons is made @@ -380,7 +380,7 @@ result))))) (defun make-list (size &key initial-element) - "Constructs a list with size elements each set to value" + "Construct and return a list with SIZE elements each set to INITIAL-ELEMENT." (declare (explicit-check)) (%make-list size initial-element)) ;;; This entry point is to be preferred, irrespective of @@ -393,7 +393,7 @@ (declare (type index count)))) (defun append (&rest lists) - "Construct a new list by concatenating the list arguments" + "Construct and return a list by concatenating LISTS." (let* ((result (list nil)) (tail result) (index 0) From 883eb555f71a298c6337016f2e63a2bf7762c324 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 03:51:17 -0400 Subject: [PATCH 0249/4023] Fix bug in PRIMITIVE-TYPE-AUX No lvar should have a type capable of holding conses expressed as the builtin classoid named CONS. It should instead be a CONS-TYPE which is not a classoid. This function could definitely use some fuzz-based unit testing - it's too easy to get lost in the maze of metaobjects. --- src/compiler/generic/primtype.lisp | 4 ++-- tests/type.before-xc.lisp | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/compiler/generic/primtype.lisp b/src/compiler/generic/primtype.lisp index d9464e959d..c2a388743c 100644 --- a/src/compiler/generic/primtype.lisp +++ b/src/compiler/generic/primtype.lisp @@ -406,6 +406,8 @@ (exactly simd-pack-256-single)) ((member 'double-float eltypes) (exactly simd-pack-256-double))))) + (cons-type + (part-of list)) (built-in-classoid (case (classoid-name type) #+sb-simd-pack @@ -417,8 +419,6 @@ (exactly simd-pack-256-int)) ((complex function system-area-pointer weak-pointer) (values (primitive-type-or-lose (classoid-name type)) t)) - (cons-type - (part-of list)) (t (any)))) (fun-designator-type diff --git a/tests/type.before-xc.lisp b/tests/type.before-xc.lisp index 444ff57252..fff1606cd7 100644 --- a/tests/type.before-xc.lisp +++ b/tests/type.before-xc.lisp @@ -420,3 +420,12 @@ ;;; Unparse a union of (up to) 4 things depending on :sb-unicode as 2 things. (assert (equal (type-specifier (specifier-type '(or string null))) '(or string null))) + +(multiple-value-bind (result exactp) + (sb-vm::primitive-type (specifier-type 'list)) + (assert (and (eq result (sb-vm::primitive-type-or-lose 'list)) + exactp))) +(multiple-value-bind (result exactp) + (sb-vm::primitive-type (specifier-type 'cons)) + (assert (and (eq result (sb-vm::primitive-type-or-lose 'list)) + (not exactp)))) From ed1b0b80949ea325bcce5ad6c9940fc063e060cd Mon Sep 17 00:00:00 2001 From: Jan Moringen Date: Wed, 15 Jul 2020 09:59:30 +0200 Subject: [PATCH 0250/4023] tests: Use WITH-TEST in reader.pure.lisp --- tests/reader.pure.lisp | 413 +++++++++++++++++++++-------------------- 1 file changed, 208 insertions(+), 205 deletions(-) diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index 0975cf1f2a..c834714920 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -11,203 +11,206 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -(assert (equal (symbol-name '#:|fd\sA|) "fdsA")) - -;;; Prior to sbcl-0.7.2.10, SBCL disobeyed the ANSI requirements on -;;; returning NIL for unset dispatch-macro-character functions. (bug -;;; 151, fixed by Alexey Dejenka sbcl-devel "bug 151" 2002-04-12) -(assert (not (get-dispatch-macro-character #\# #\{))) -(assert (not (get-dispatch-macro-character #\# #\0))) -;;; And we might as well test that we don't have any cross-compilation -;;; shebang residues left... -(assert (not (get-dispatch-macro-character #\# #\!))) -;;; Also test that all the illegal sharp macro characters are -;;; recognized as being illegal. -(loop for char in '(#\Backspace #\Tab #\Newline #\Linefeed - #\Page #\Return #\Space #\) #\<) - do (assert (get-dispatch-macro-character #\# char))) - -(assert (not (ignore-errors (get-dispatch-macro-character #\! #\0) - t))) - -;;; In sbcl-0.7.3, GET-MACRO-CHARACTER and SET-MACRO-CHARACTER didn't -;;; use NIL to represent the no-macro-attached-to-this-character case -;;; as ANSI says they should. (This problem is parallel to the -;;; GET-DISPATCH-MACRO misbehavior fixed in sbcl-0.7.2.10, but -;;; was fixed a little later.) -(dolist (customizable-char - ;; According to ANSI "2.1.4 Character Syntax Types", these - ;; characters are reserved for the programmer. - '(#\? #\! #\[ #\] #\{ #\})) - ;; So they should have no macro-characterness. - (multiple-value-bind (macro-fun non-terminating-p) - (get-macro-character customizable-char) - (assert (null macro-fun)) - ;; Also, in a bit of ANSI weirdness, NON-TERMINATING-P can be - ;; true only when MACRO-FUN is true. (When the character - ;; is not a macro character, it can be embedded in a token, - ;; so it'd be more logical for NON-TERMINATING-P to be T in - ;; this case; but ANSI says it's NIL in this case. - (assert (null non-terminating-p)))) - -;;; rudimentary test of SET-SYNTAX-FROM-CHAR, just to verify that it -;;; wasn't totally broken by the GET-MACRO-CHARACTER/SET-MACRO-CHARACTER -;;; fixes in 0.7.3.16 -(assert (= 123579 (read-from-string "123579"))) -(let ((*readtable* (copy-readtable))) - (set-syntax-from-char #\7 #\;) - (assert (= 1235 (read-from-string "123579")))) +(with-test (:name (:reader symbol :escape)) + (assert (equal (symbol-name '#:|fd\sA|) "fdsA"))) + +(with-test (:name (get-dispatch-macro-character :return-value)) + ;; Prior to sbcl-0.7.2.10, SBCL disobeyed the ANSI requirements on + ;; returning NIL for unset dispatch-macro-character functions. (bug + ;; 151, fixed by Alexey Dejenka sbcl-devel "bug 151" 2002-04-12) + (assert (not (get-dispatch-macro-character #\# #\{))) + (assert (not (get-dispatch-macro-character #\# #\0))) + ;; And we might as well test that we don't have any cross-compilation + ;; shebang residues left... + (assert (not (get-dispatch-macro-character #\# #\!))) + ;; Also test that all the illegal sharp macro characters are + ;; recognized as being illegal. + (loop for char in '(#\Backspace #\Tab #\Newline #\Linefeed + #\Page #\Return #\Space #\) #\<) + do (assert (get-dispatch-macro-character #\# char))) + + (assert-error (get-dispatch-macro-character #\! #\0))) + +(with-test (:name (get-macro-character :return-value)) + ;; In sbcl-0.7.3, GET-MACRO-CHARACTER and SET-MACRO-CHARACTER didn't + ;; use NIL to represent the no-macro-attached-to-this-character case + ;; as ANSI says they should. (This problem is parallel to the + ;; GET-DISPATCH-MACRO misbehavior fixed in sbcl-0.7.2.10, but was + ;; fixed a little later.) + (dolist (customizable-char + ;; According to ANSI "2.1.4 Character Syntax Types", these + ;; characters are reserved for the programmer. + '(#\? #\! #\[ #\] #\{ #\})) + ;; So they should have no macro-characterness. + (multiple-value-bind (macro-fun non-terminating-p) + (get-macro-character customizable-char) + (assert (null macro-fun)) + ;; Also, in a bit of ANSI weirdness, NON-TERMINATING-P can be + ;; true only when MACRO-FUN is true. (When the character is not + ;; a macro character, it can be embedded in a token, so it'd be + ;; more logical for NON-TERMINATING-P to be T in this case; but + ;; ANSI says it's NIL in this case. + (assert (null non-terminating-p))))) + +(with-test (:name (set-syntax-from-char :smoke)) + ;; rudimentary test of SET-SYNTAX-FROM-CHAR, just to verify that it + ;; wasn't totally broken by the GET-MACRO-CHARACTER/SET-MACRO-CHARACTER + ;; fixes in 0.7.3.16 + (assert (= 123579 (read-from-string "123579"))) + (let ((*readtable* (copy-readtable))) + (set-syntax-from-char #\7 #\;) + (assert (= 1235 (read-from-string "123579"))))) ;;; PARSE-INTEGER must signal an error of type PARSE-ERROR if it is ;;; unable to parse an integer and :JUNK-ALLOWED is NIL. -(macrolet ((assert-parse-error (form) - `(multiple-value-bind (val cond) - (ignore-errors ,form) - (assert (null val)) - (assert (typep cond 'parse-error))))) - (assert-parse-error (parse-integer " ")) - (assert-parse-error (parse-integer "12 a")) - (assert-parse-error (parse-integer "12a")) - (assert-parse-error (parse-integer "a")) - (assert (= (parse-integer "12") 12)) - (assert (= (parse-integer " 12 ") 12)) - (assert (= (parse-integer " 12asdb" :junk-allowed t) 12))) +(with-test (:name (parse-integer :smoke)) + (macrolet ((assert-parse-error (form) + `(assert-error ,form parse-error))) + (assert-parse-error (parse-integer " ")) + (assert-parse-error (parse-integer "12 a")) + (assert-parse-error (parse-integer "12a")) + (assert-parse-error (parse-integer "a")) + (assert (= (parse-integer "12") 12)) + (assert (= (parse-integer " 12 ") 12)) + (assert (= (parse-integer " 12asdb" :junk-allowed t) 12)))) ;;; #A notation enforces that once one 0 dimension has been found, all ;;; subsequent ones are also 0. -(assert (equal (array-dimensions (read-from-string "#3A()")) - '(0 0 0))) -(assert (equal (array-dimensions (read-from-string "#3A(())")) - '(1 0 0))) -(assert (equal (array-dimensions (read-from-string "#3A((() ()))")) - '(1 2 0))) +(with-test (:name (:sharpsign-a-reader-macro :initial-elements)) + (assert (equal (array-dimensions (read-from-string "#3A()")) + '(0 0 0))) + (assert (equal (array-dimensions (read-from-string "#3A(())")) + '(1 0 0))) + (assert (equal (array-dimensions (read-from-string "#3A((() ()))")) + '(1 2 0)))) ;;; Bug reported by Nikodemus Siivola on sbcl-devel 2003-07-21: ;;; package misconfiguration -(assert (eq - (handler-case (with-input-from-string (s "cl:") (read s)) - (end-of-file (c) - (declare (ignore c)) - 'good)) - 'good)) +(with-test (:name (with-input-from-string :package-misconfiguration)) + (assert-error (with-input-from-string (s "cl:") (read s)) end-of-file)) ;;; Bugs found by Paul Dietz -(assert (equal (multiple-value-list - (parse-integer " 123 ")) - '(123 12))) - -(let* ((base "xxx 123 yyy") - (intermediate (make-array 8 :element-type (array-element-type base) - :displaced-to base - :displaced-index-offset 2)) - (string (make-array 6 :element-type (array-element-type base) - :displaced-to intermediate - :displaced-index-offset 1))) +(with-test (:name (parse-integer 1)) (assert (equal (multiple-value-list - (parse-integer string)) - '(123 6)))) - -(let ((*read-base* *read-base*)) - (dolist (float-string '(".9" ".9e9" ".9e+9" ".9e-9" - "-.9" "-.9e9" "-.9e+9" "-.9e-9" - "+.9" "+.9e9" "+.9e+9" "+.9e-9" - "0.9" "0.9e9" "0.9e+9" "0.9e-9" - "9.09" "9.09e9" "9.09e+9" "9.09e-9" - #|"9e9" could be integer|# "9e+9" "9e-9")) - (loop for i from 2 to 36 - do (setq *read-base* i) - do (assert (typep (read-from-string float-string) - *read-default-float-format*)) - do (assert (typep - (read-from-string (substitute #\E #\e float-string)) - *read-default-float-format*)) - if (position #\e float-string) - do (assert (typep - (read-from-string (substitute #\s #\e float-string)) - 'short-float)) - and do (assert (typep - (read-from-string (substitute #\S #\e float-string)) - 'short-float)) - and do (assert (typep - (read-from-string (substitute #\f #\e float-string)) - 'single-float)) - and do (assert (typep - (read-from-string (substitute #\F #\e float-string)) - 'single-float)) - and do (assert (typep - (read-from-string (substitute #\d #\e float-string)) - 'double-float)) - and do (assert (typep - (read-from-string (substitute #\D #\e float-string)) - 'double-float)) - and do (assert (typep - (read-from-string (substitute #\l #\e float-string)) - 'long-float)) - and do (assert (typep - (read-from-string (substitute #\L #\e float-string)) - 'long-float))))) - -(let ((*read-base* *read-base*)) - (dolist (integer-string '("1." "2." "3." "4." "5." "6." "7." "8." "9." "0.")) - (loop for i from 2 to 36 - do (setq *read-base* i) - do (assert (typep (read-from-string integer-string) 'integer))))) - -(let ((*read-base* *read-base*)) - (dolist (symbol-string '("A." "a." "Z." "z." - - "+.9eA" "+.9ea" - - "0.A" "0.a" "0.Z" "0.z" - - #|"9eA" "9ea"|# "9e+A" "9e+a" "9e-A" "9e-a" - #|"Ae9" "ae9"|# "Ae+9" "ae+9" "Ae-9" "ae-9" - - "ee+9" "Ee+9" "eE+9" "EE+9" - "ee-9" "Ee-9" "eE-9" "EE-9" - - "A.0" "A.0e10" "a.0" "a.0e10" - - "1e1e+9")) - (loop for i from 2 to 36 - do (setq *read-base* i) - do (assert (typep (read-from-string symbol-string) 'symbol))))) - -(let ((standard-chars " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + (parse-integer " 123 ")) + '(123 12)))) + +(with-test (:name (parse-integer 2)) + (let* ((base "xxx 123 yyy") + (intermediate (make-array 8 :element-type (array-element-type base) + :displaced-to base + :displaced-index-offset 2)) + (string (make-array 6 :element-type (array-element-type base) + :displaced-to intermediate + :displaced-index-offset 1))) + (assert (equal (multiple-value-list + (parse-integer string)) + '(123 6))))) + +(with-test (:name (*read-base* 1)) + (let ((*read-base* *read-base*)) + (dolist (float-string '(".9" ".9e9" ".9e+9" ".9e-9" + "-.9" "-.9e9" "-.9e+9" "-.9e-9" + "+.9" "+.9e9" "+.9e+9" "+.9e-9" + "0.9" "0.9e9" "0.9e+9" "0.9e-9" + "9.09" "9.09e9" "9.09e+9" "9.09e-9" + #|"9e9" could be integer|# "9e+9" "9e-9")) + (loop for i from 2 to 36 + do (setq *read-base* i) + do (assert (typep (read-from-string float-string) + *read-default-float-format*)) + do (assert (typep + (read-from-string (substitute #\E #\e float-string)) + *read-default-float-format*)) + if (position #\e float-string) + do (assert (typep + (read-from-string (substitute #\s #\e float-string)) + 'short-float)) + and do (assert (typep + (read-from-string (substitute #\S #\e float-string)) + 'short-float)) + and do (assert (typep + (read-from-string (substitute #\f #\e float-string)) + 'single-float)) + and do (assert (typep + (read-from-string (substitute #\F #\e float-string)) + 'single-float)) + and do (assert (typep + (read-from-string (substitute #\d #\e float-string)) + 'double-float)) + and do (assert (typep + (read-from-string (substitute #\D #\e float-string)) + 'double-float)) + and do (assert (typep + (read-from-string (substitute #\l #\e float-string)) + 'long-float)) + and do (assert (typep + (read-from-string (substitute #\L #\e float-string)) + 'long-float)))))) + +(with-test (:name (*read-base* 2)) + (let ((*read-base* *read-base*)) + (dolist (integer-string '("1." "2." "3." "4." "5." "6." "7." "8." "9." "0.")) + (loop for i from 2 to 36 + do (setq *read-base* i) + do (assert (typep (read-from-string integer-string) 'integer)))))) + +(with-test (:name (*read-base* 3)) + (let ((*read-base* *read-base*)) + (dolist (symbol-string '("A." "a." "Z." "z." + + "+.9eA" "+.9ea" + + "0.A" "0.a" "0.Z" "0.z" + + #|"9eA" "9ea"|# "9e+A" "9e+a" "9e-A" "9e-a" + #|"Ae9" "ae9"|# "Ae+9" "ae+9" "Ae-9" "ae-9" + + "ee+9" "Ee+9" "eE+9" "EE+9" + "ee-9" "Ee-9" "eE-9" "EE-9" + + "A.0" "A.0e10" "a.0" "a.0e10" + + "1e1e+9")) + (loop for i from 2 to 36 + do (setq *read-base* i) + do (assert (typep (read-from-string symbol-string) 'symbol)))))) + +(with-test (:name (readtable :specified-macro-characters)) + (let ((standard-chars " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ") - (standard-terminating-macro-chars "\"'(),;`") - (standard-nonterminating-macro-chars "#")) - (flet ((frob (char) - (multiple-value-bind (fun non-terminating-p) - (get-macro-character char) - (cond - ((find char standard-terminating-macro-chars) - (unless (and fun (not non-terminating-p)) - (list char))) - ((find char standard-nonterminating-macro-chars) - (unless (and fun non-terminating-p) - (list char))) - (t (unless (and (not fun) (not non-terminating-p)) - (list char))))))) - (let ((*readtable* (copy-readtable nil))) - (assert (null (loop for c across standard-chars append (frob c))))))) - -(let ((standard-chars " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + (standard-terminating-macro-chars "\"'(),;`") + (standard-nonterminating-macro-chars "#")) + (flet ((frob (char) + (multiple-value-bind (fun non-terminating-p) + (get-macro-character char) + (cond ((find char standard-terminating-macro-chars) + (unless (and fun (not non-terminating-p)) + (list char))) + ((find char standard-nonterminating-macro-chars) + (unless (and fun non-terminating-p) + (list char))) + (t (unless (and (not fun) (not non-terminating-p)) + (list char))))))) + (let ((*readtable* (copy-readtable nil))) + (assert (null (loop for c across standard-chars append (frob c)))))))) + +(with-test (:name (readtable :specified-dispatch-macro-characters)) + (let ((standard-chars " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ") - (undefined-chars "!\"$%&,;>?@[]^_`~{}/dDeEfFgGhHiIjJkKlLmMnNqQtTuUvVwWyYzZ")) - (flet ((frob (char) - (let ((fun (get-dispatch-macro-character #\# char))) - (cond - ((find char undefined-chars) - (when fun (list char))) - ((digit-char-p char 10) - (when fun (list char))) - (t - (unless fun (list char))))))) - (let ((*readtable* (copy-readtable nil))) - (assert (null (loop for c across standard-chars append (frob c))))))) - -(with-test (:name :copy-readtable-with-unicode-macro + (undefined-chars "!\"$%&,;>?@[]^_`~{}/dDeEfFgGhHiIjJkKlLmMnNqQtTuUvVwWyYzZ")) + (flet ((frob (char) + (let ((fun (get-dispatch-macro-character #\# char))) + (cond ((find char undefined-chars) + (when fun (list char))) + ((digit-char-p char 10) + (when fun (list char))) + (t + (unless fun (list char))))))) + (let ((*readtable* (copy-readtable nil))) + (assert (null (loop for c across standard-chars append (frob c)))))))) + +(with-test (:name (copy-readtable :with-unicode-macro) :skipped-on (not :sb-unicode)) (let ((rt (copy-readtable))) (set-macro-character (code-char #x100fa) #'error nil rt) @@ -217,7 +220,7 @@ ;;; All these must return a primary value of NIL when *read-suppress* is T ;;; Reported by Bruno Haible on cmucl-imp 2004-10-25. -(with-test (:name :read-suppress-char-macros) +(with-test (:name (*read-suppress* :char-macros)) (let ((*read-suppress* t)) (assert (null (read-from-string "(1 2 3)"))) (assert (null (with-input-from-string (s "abc xyz)") @@ -235,7 +238,7 @@ ;;; System code that asks whether %READ-PRESERVING-WHITESPACE hit EOF ;;; mistook NIL as an object returned normally for NIL the default eof mark. -(with-test (:name :read-preserving-whitespace-file-position) +(with-test (:name (read-preserving-whitespace file-position)) (multiple-value-bind (obj pos1) (read-from-string "NIL A") (declare (ignore obj)) (multiple-value-bind (obj pos2) (read-from-string "NNN A") @@ -272,23 +275,22 @@ ;;; EOF-ERROR-P defaults to true. Reported by Bruno Haible on ;;; cmucl-imp 2004-10-18. -(multiple-value-bind (res err) (ignore-errors (read-from-string "")) - (assert (not res)) - (assert (typep err 'end-of-file))) - -(assert (equal '((0 . "A") (1 . "B")) - (coerce (read-from-string "#((0 . \"A\") (1 . \"B\"))") - 'list))) +(with-test (:name (read-from-string :eof-error)) + (assert-error (read-from-string "") end-of-file) + (assert (equal '((0 . "A") (1 . "B")) + (coerce (read-from-string "#((0 . \"A\") (1 . \"B\"))") + 'list)))) ;;; parse-integer uses whitespace[1] not whitespace[2] as its ;;; definition of whitespace to skip. -(let ((*readtable* (copy-readtable))) - (set-syntax-from-char #\7 #\Space) - (assert (= 710 (parse-integer "710")))) +(with-test (:name (parse-integer :whitespace-handling)) + (let ((*readtable* (copy-readtable))) + (set-syntax-from-char #\7 #\Space) + (assert (= 710 (parse-integer "710")))) -(let ((*readtable* (copy-readtable))) - (set-syntax-from-char #\7 #\Space) - (assert (string= (format nil "~7D" 1) " 1"))) + (let ((*readtable* (copy-readtable))) + (set-syntax-from-char #\7 #\Space) + (assert (string= (format nil "~7D" 1) " 1")))) (with-test (:name :report-reader-error) ;; Apparently this wants to test the printing of the error string @@ -302,12 +304,13 @@ ;;; The GET-MACRO-CHARACTER in SBCL <= "1.0.34.2" bogusly computed its ;;; second return value relative to *READTABLE* rather than the passed ;;; readtable. -(let* ((*readtable* (copy-readtable nil))) - (set-syntax-from-char #\" #\A) - (multiple-value-bind (reader-fn non-terminating-p) - (get-macro-character #\" (copy-readtable nil)) - (declare (ignore reader-fn)) - (assert (not non-terminating-p)))) +(with-test (:name (get-macro-character :argument)) + (let* ((*readtable* (copy-readtable nil))) + (set-syntax-from-char #\" #\A) + (multiple-value-bind (reader-fn non-terminating-p) + (get-macro-character #\" (copy-readtable nil)) + (declare (ignore reader-fn)) + (assert (not non-terminating-p))))) (with-test (:name :bug-309093) (assert (eq :error @@ -316,7 +319,7 @@ (reader-error () :error))))) -(with-test (:name :set-syntax-from-char-dispatch-macro-char) +(with-test (:name (set-syntax-from-char :dispatch-macro-char)) (let ((rt (copy-readtable))) (make-dispatch-macro-character #\! nil rt) (set-dispatch-macro-character #\! #\! (constantly 'bang^2) rt) From d6ca2c01f5be7329137f7a8ff4e622befafd93ca Mon Sep 17 00:00:00 2001 From: Jan Moringen Date: Wed, 15 Jul 2020 10:24:27 +0200 Subject: [PATCH 0251/4023] Fix circularity handling in non-recursive READ-DELIMITED-LIST The problem is demonstrated by (let* ((stream (make-string-input-stream "#1=(nil) #1#)") (result (read-delimited-list #\) stream))) (assert (eq (first result) (second result)))) which, before this change, signaled an error because *SHARP-EQUAL* was unbound. --- src/code/reader.lisp | 3 ++- tests/reader.pure.lisp | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 00b4df38d5..643476e4a2 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -915,7 +915,8 @@ standard Lisp readtable when NIL." (read-list-item input-stream)))) (if recursive-p (%read-delimited-list) - (with-read-buffer () (%read-delimited-list)))))) ; end MACROLET + (let ((*sharp-equal* nil)) + (with-read-buffer () (%read-delimited-list))))))) ; end MACROLET (defun read-after-dot (stream firstchar collectp) ;; FIRSTCHAR is non-whitespace! diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index c834714920..81fe98e54e 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -281,6 +281,11 @@ (coerce (read-from-string "#((0 . \"A\") (1 . \"B\"))") 'list)))) +(with-test (:name (read-delimited-list :non-recursive :circularity)) + (let* ((stream (make-string-input-stream "#1=(nil) #1#)")) + (result (read-delimited-list #\) stream))) + (assert (eq (first result) (second result))))) + ;;; parse-integer uses whitespace[1] not whitespace[2] as its ;;; definition of whitespace to skip. (with-test (:name (parse-integer :whitespace-handling)) From 5825ea31c42bf0b78c5e8f1561c138145eb2a067 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 15 Jul 2020 16:08:46 +0300 Subject: [PATCH 0252/4023] make-array: signal INITIAL-ELEMENT-MISMATCH-STYLE-WARNING at ct. Not just a style-warning. --- package-data-list.lisp-expr | 1 + src/code/condition.lisp | 4 ++++ src/compiler/array-tran.lisp | 18 ++++++++++-------- src/compiler/seqtran.lisp | 13 +++++++------ 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 852fdb6bc2..5d007ff6f6 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -1310,6 +1310,7 @@ possibly temporarily, because it might be used internally." "PACKAGE-AT-VARIANCE" "PACKAGE-AT-VARIANCE-ERROR" "ARRAY-INITIAL-ELEMENT-MISMATCH" + "INITIAL-ELEMENT-MISMATCH-STYLE-WARNING" "TYPE-WARNING" "TYPE-STYLE-WARNING" "SLOT-INITFORM-TYPE-STYLE-WARNING" "LOCAL-ARGUMENT-MISMATCH" diff --git a/src/code/condition.lisp b/src/code/condition.lisp index d0717dce97..ac52cedec0 100644 --- a/src/code/condition.lisp +++ b/src/code/condition.lisp @@ -1005,6 +1005,10 @@ :references '((:ansi-cl :function make-array) (:ansi-cl :function sb-xc:upgraded-array-element-type)))) +(define-condition initial-element-mismatch-style-warning + (array-initial-element-mismatch simple-style-warning) + ()) + (define-condition type-warning (reference-condition simple-warning) () (:default-initargs :references '((:sbcl :node "Handling of Types")))) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index 0e11226cc1..bc352796a5 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -874,9 +874,10 @@ ;; didn't realize this. (cond (initial-element - (compiler-warn "~S ~S is not a ~S" - :initial-element default-initial-element - elt-spec)) + (compiler-warn 'array-initial-element-mismatch + :format-control "~S ~S is not a ~S" + :format-arguments + (list :initial-element default-initial-element elt-spec))) ;; For the default initial element, only warn if ;; any array elements are initialized using it. ((and (not (eql c-length 0)) @@ -884,9 +885,9 @@ ;; then fill-array means it was supplied initial-contents (not (lvar-matches-calls (combination-lvar call) '(make-array-header* fill-array)))) - (compiler-style-warn "The default initial element ~S is not a ~S." - default-initial-element - elt-spec)))) + (compiler-style-warn 'initial-element-mismatch-style-warning + :format-control "The default initial element ~S is not a ~S." + :format-arguments (list default-initial-element elt-spec))))) (let ((lambda-list `(length ,@(eliminate-keywords)))) `(lambda ,lambda-list (declare (ignorable ,@lambda-list)) @@ -995,8 +996,9 @@ ((not (ctypep value eltype-type)) ;; this case will not cause an error at runtime, but ;; it's still worth STYLE-WARNing about. - (compiler-style-warn "~S is not a ~S." - value eltype))))) + (compiler-style-warn 'initial-element-mismatch-style-warning + :format-control "~S is not a ~S." + :format-arguments (list value eltype)))))) `(let ((array ,creation-form)) (multiple-value-bind (vector) (%data-vector-and-index array 0) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 8c3c5e6e71..5bb9e9b3f7 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1252,8 +1252,9 @@ ;; As with MAKE-ARRAY, this is merely undefined ;; behavior, not an error. (compiler-style-warn - "The default initial element ~S is not a ~S." - default-initial-element elt-type)))) + 'initial-element-mismatch-style-warning + :format-control "The default initial element ~S is not a ~S." + :format-arguments (list default-initial-element elt-type))))) ;; In would be possible in some cases, ;; like :INITIAL-ELEMENT (IF X #\x #\y) in a call ;; to MAKE-SEQUENCE '(VECTOR (MEMBER #\A #\B)) @@ -1263,10 +1264,10 @@ (not (ctypep (lvar-value initial-element) elt-ctype))) ;; MAKE-ARRAY considers this a warning, not an error. - (compiler-warn "~S ~S is not a ~S" - :initial-element - (lvar-value initial-element) - elt-type))))) + (compiler-warn 'array-initial-element-mismatch + :format-control "~S ~S is not a ~S" + :format-arguments + (list :initial-element (lvar-value initial-element) elt-type)))))) (give-up-ir1-transform))))))) (deftransform subseq ((seq start &optional end) From 85a679f4855b5b4160c476f77d35f5e046ca6029 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 15 Jul 2020 16:13:43 +0300 Subject: [PATCH 0253/4023] Muffle array-initial-element-mismatch in MAP. As the resulting sequence is going to be initialized properly. Reported by Phoebe Goldman. --- src/compiler/seqtran.lisp | 8 +++++--- tests/map-tests.impure.lisp | 6 ++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 5bb9e9b3f7..6d47a44208 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -288,9 +288,11 @@ (let* ((all-seqs (cons seq seqs)) (seq-args (make-gensym-list (length all-seqs)))) `(lambda (result-type fun ,@seq-args) - (map-into (make-sequence result-type - (min ,@(loop for arg in seq-args - collect `(length ,arg)))) + (map-into (locally + (declare (muffle-conditions array-initial-element-mismatch)) + (make-sequence result-type + (min ,@(loop for arg in seq-args + collect `(length ,arg))))) fun ,@seq-args)))) (t (let* ((all-seqs (cons seq seqs)) diff --git a/tests/map-tests.impure.lisp b/tests/map-tests.impure.lisp index 23cd776cb7..0bb073d4ac 100644 --- a/tests/map-tests.impure.lisp +++ b/tests/map-tests.impure.lisp @@ -223,3 +223,9 @@ (test 'mapcar (list #'list '(1 2 3) '(4 5 6) '(7 8 9)) '((1 4 7) (2 5 8) (3 6 9))) (test 'mapcan (list #'identity '(1)) 1))) + +(with-test (:name (map :initial-element-style-warnin)) + (checked-compile-and-assert + () + `(lambda (x) + (map '(vector hash-table) #'identity x)))) From a0486023be74d61c09ebf9e551909cdfc6f8ba94 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 15 Jul 2020 16:47:01 +0300 Subject: [PATCH 0254/4023] Missing change. --- src/compiler/seqtran.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 6d47a44208..cfe7440da3 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -289,6 +289,7 @@ (seq-args (make-gensym-list (length all-seqs)))) `(lambda (result-type fun ,@seq-args) (map-into (locally + #-sb-xc-host (declare (muffle-conditions array-initial-element-mismatch)) (make-sequence result-type (min ,@(loop for arg in seq-args From 269ac9c33fc9b0d2611fc5cc83019017c072e18e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 12:16:45 -0400 Subject: [PATCH 0255/4023] Improve commentary --- src/code/early-defmethod.lisp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/code/early-defmethod.lisp b/src/code/early-defmethod.lisp index 32edb78d56..635af3ff59 100644 --- a/src/code/early-defmethod.lisp +++ b/src/code/early-defmethod.lisp @@ -11,6 +11,14 @@ ;;;; Rudimentary DEFMETHOD +;;; This stub ensures that: +;;; - Argument specializations are stored in a way that permits an extremely simple +;;; single-dispatch implementation with correct behavior of MAKE-LOAD-FORM and +;;; PRINT-OBJECT. Subject to not needing method combination or CALL-NEXT-METHOD, +;;; exactly one primary method is chosen respecting class precedence order. +;;; - The simple methods can be installed later by the full CLOS implementation. +;;; They play nice by using the same call signature for the "fast function" + (sb-xc:defmacro defmethod (&whole form name lambda-list &rest body &aux qualifier) (when (member name '((setf documentation) documentation) :test 'equal) @@ -46,14 +54,17 @@ (declare (ignore .pv. .next-method-call.) (ignorable ,(car unspecialized-ll))) ,@decls - ;; Fail at compile-time if any transformational magic needs to happen. + ;; Fail at compile-time if any fancy slot access would happen, if compiled + ;; by the eventual implementation. + ;; (SETF SLOT-VALUE) is not a legal macro name, so transform it as a + ;; an ignorable function that uses a legal macro name. (macrolet ,(mapcar (lambda (f) `(,f (&rest args) (declare (ignore args)) (error "can't use ~A in trivial method" ',f))) '(slot-boundp slot-value %set-slot-value call-next-method)) (flet (((setf slot-value) (&rest args) `(%set-slot-value ,@args))) - (declare (inline (setf slot-value))) + (declare (inline (setf slot-value)) (ignorable #'(setf slot-value))) (block ,name ,@forms)))) ;; Why is SOURCE-LOC needed? Lambdas should know their location. (sb-c:source-location)))) From 4dacc771ac9aefc65469d8337e96b4c93662f116 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 13:17:34 -0400 Subject: [PATCH 0256/4023] Try to clarify classoid intersection logic some No functional change. --- src/code/late-type.lisp | 52 ++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/src/code/late-type.lisp b/src/code/late-type.lisp index 07dd939cb6..0919e80e9a 100644 --- a/src/code/late-type.lisp +++ b/src/code/late-type.lisp @@ -1412,6 +1412,31 @@ ;; named type in disguise, TYPE2 is not a superset of TYPE1. (values nil t)))) +;;; Return T if members of this classoid certainly have INSTANCE-POINTER-LOWTAG. +;;; Logically it is the near opposite of CLASSOID-NON-INSTANCE-P, but not quite. +;;; CTYPEs which are not represented as a classoid return NIL for both predicates +;;; as do PCL types which may be either funcallable or non-funcallable. +;;; +;;; But some of that generality seems wrong. I don't think it would be allowed +;;; to have (as merely an example) an EQL-SPECIALIZER which is funcallable, +;;; having FUN-POINTER-LOWTAG instead of INSTANCE-POINTER-LOWTAG). Yet we think +;;; it could happen, because the parse of the type (AND EQL-SPECIALIZER INSTANCE) +;;; yields # +;;; versus simplifying down to EQL-SPECIALIZER. +#| (loop for c being each hash-key of (classoid-subclasses (find-classoid 't)) + do (let ((not-i (classoid-non-instance-p c)) + (i (classoid-definitely-instancep c))) + (unless (eq (not not-i) i) (format t "~S -> ~A and ~A~%" c not-i i)))) |# +(defun classoid-definitely-instancep (x) + (or (structure-classoid-p x) + (condition-classoid-p x))) +(eval-when (:compile-toplevel :execute) + (pushnew 'classoid-definitely-instancep sb-vm::*backend-cross-foldable-predicates*)) + +(defun classoid-is-or-inherits (sub super) + (or (classoid-inherits-from sub super) + (eq sub (find-classoid super)))) + (define-type-method (named :complex-subtypep-arg2) (type1 type2) (aver (not (eq type2 *wild-type*))) ; * isn't really a type. (cond ((eq type2 *universal-type*) @@ -1432,17 +1457,13 @@ ((and (eq type2 *extended-sequence-type*) (classoid-p type1)) (values (if (classoid-inherits-from type1 'sequence) t nil) t)) ((and (eq type2 *instance-type*) (classoid-p type1)) - (cond - ((classoid-non-instance-p type1) - (values nil t)) - ((classoid-inherits-from type1 'function) - (values nil t)) - ((eq type1 (find-classoid 'function)) - (values nil t)) - ((or (structure-classoid-p type1) - (condition-classoid-p type1)) - (values t t)) - (t (values nil nil)))) + (cond ((or (classoid-non-instance-p type1) + (classoid-is-or-inherits type1 'function)) + (values nil t)) + ((classoid-definitely-instancep type1) + (values t t)) + (t + (values nil nil)))) ((and (eq type2 *funcallable-instance-type*) (classoid-p type1)) (if (and (not (classoid-non-instance-p type1)) (classoid-inherits-from type1 'function)) @@ -1479,22 +1500,21 @@ (cond ((eq type2 *extended-sequence-type*) (typecase type1 - ((or structure-classoid condition-classoid) *empty-type*) + ((satisfies classoid-definitely-instancep) *empty-type*) ; dubious! (classoid (cond ((classoid-non-instance-p type1) *empty-type*) ((classoid-inherits-from type1 'sequence) type1))) (t (empty-unless-hairy type1)))) ((eq type2 *instance-type*) (typecase type1 - ((or structure-classoid condition-classoid) type1) + ((satisfies classoid-definitely-instancep) type1) (classoid (when (or (classoid-non-instance-p type1) - (eq type1 (find-classoid 'function)) - (classoid-inherits-from type1 'function)) + (classoid-is-or-inherits type1 'function)) *empty-type*)) (t (empty-unless-hairy type1)))) ((eq type2 *funcallable-instance-type*) (typecase type1 - ((or structure-classoid condition-classoid) *empty-type*) + ((satisfies classoid-definitely-instancep) *empty-type*) (classoid (cond ((classoid-non-instance-p type1) *empty-type*) From 816d286a88211a07a1f2833c35301c2a6756ee98 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 14:04:26 -0400 Subject: [PATCH 0257/4023] Change direct superclass of PATHNAME to T to enforce that users don't call COPY-STRUCTURE or MAKE-INSTANCE. Also serves as proof-of-concept for hiding the details of other system-internal objects such as thread and mutex, and has a nice effect of removing knowlege of the pathname slots and their types from make-host-1. --- NEWS | 1 + build-order.lisp-expr | 4 +-- src/code/class.lisp | 16 ++++++++-- src/code/cross-type.lisp | 3 +- src/code/defstruct.lisp | 50 +++++++++++++++++++----------- src/code/describe.lisp | 9 ++++++ src/code/inspect.lisp | 5 +++ src/code/late-type.lisp | 5 ++- src/code/pathname.lisp | 37 ++++++++++++---------- src/code/target-pathname.lisp | 48 ++++++++++------------------ src/compiler/generic/genesis.lisp | 41 +++++++++++++++++------- src/compiler/generic/primtype.lisp | 2 ++ src/compiler/typetran.lisp | 1 + 13 files changed, 138 insertions(+), 84 deletions(-) diff --git a/NEWS b/NEWS index e56c0a0791..608e0a8b62 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ changes relative to sbcl-2.0.6: * minor incompatible change: SB-THREAD:THREAD-OS-TID returns NIL for a thread which has exited. + * minor incompatible change: PATHNAME is no longer a STRUCTURE-OBJECT changes in sbcl-2.0.6 relative to sbcl-2.0.5: * planned incompatible change: the defined symbols in the Metaobject diff --git a/build-order.lisp-expr b/build-order.lisp-expr index 829c1ede71..0ac6f33a9a 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -418,7 +418,7 @@ ("src/code/random") ("src/code/hash-table" :c-headers) ("src/code/readtable") - ("src/code/pathname") + ("src/code/pathname" :not-host) ("src/code/host-pprint") ; defines QUEUED-OP needed by 'pprint' ("src/compiler/fndb") @@ -449,7 +449,6 @@ ("src/compiler/target-dump" :not-host) ; needs stuff from compiler/dump.lisp ("src/compiler/ir1report") ; for COMPILER-ERROR-CONTEXT - ("src/code/target-pathname" :not-host) ; needs "code/pathname" ("src/compiler/main") ; needs DEFSTRUCT FASL-OUTPUT from dump.lisp ("src/compiler/xref") ("src/compiler/target-main" :not-host) @@ -623,6 +622,7 @@ ("src/code/print" :not-host) ("src/code/target-stream" :not-host) ; needs WHITESPACEP from "code/reader" + ("src/code/target-pathname" :not-host) #-win32 ("src/code/unix-pathname" :not-host) #+win32 diff --git a/src/code/class.lisp b/src/code/class.lisp index a77e87da76..d2e150c72a 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -613,7 +613,8 @@ between the ~A definition and the ~A definition" ;;; Again, this should be compiler-only, but easier to make this ;;; thread-safe. (defun insured-find-classoid (name predicate constructor) - (declare (type function predicate constructor)) + (declare (type function predicate) + (type (or function symbol) constructor)) (let ((table *forward-referenced-layouts*)) (with-system-mutex ((hash-table-lock table)) (let* ((old (find-classoid name nil)) @@ -1055,6 +1056,16 @@ between the ~A definition and the ~A definition" :inherits (symbol list sequence) :direct-superclasses (symbol list) :prototype-form 'nil) + + ;; KLUDGE: the length must match the subsequent defstruct. + (pathname :depth 1 + :length ,(+ 7 sb-vm:instance-data-start) + :prototype-form (make-pathname)) + (logical-pathname :depth 2 + :length ,(+ 7 sb-vm:instance-data-start) + :prototype-form (make-pathname :host "SYS") + :inherits (pathname)) + ;; These last few are strange. STREAM has only T as an ancestor, ;; so you'd think it would be at depth 1. FILE- and STRING-STREAM ;; each have STREAM and T as ancestors, so you'd think they'd be at depth @@ -1110,6 +1121,7 @@ between the ~A definition and the ~A definition" codes state depth + (length 0) prototype-form (hierarchical-p t) ; might be modified below (direct-superclasses (if inherits @@ -1160,7 +1172,7 @@ between the ~A definition and the ~A definition" (find-and-init-or-check-layout name depthoid 0 ; flags - 0 ; length + length +layout-all-tagged+ inherits-vector) :invalidate nil))))) diff --git a/src/code/cross-type.lisp b/src/code/cross-type.lisp index 949ce00d38..d5b5c07423 100644 --- a/src/code/cross-type.lisp +++ b/src/code/cross-type.lisp @@ -150,7 +150,7 @@ ;; probably not a function. What about FMT-CONTROL instances? (values nil t))) ((system-area-pointer stream fdefn weak-pointer file-stream - code-component lra) + code-component lra pathname logical-pathname) (values nil t))) (cond ((eq name 'pathname) (values (pathnamep obj) t)) @@ -226,6 +226,7 @@ ;; subtypes of structure-object in make-host-1. '(hash-table lexenv sb-c::abstract-lexenv condition restart + pathname sb-impl::host sb-impl::pattern synonym-stream ;; why on earth is LABEL needed here? sb-assem:label)))) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 7fd4fde91e..d237ea7d73 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -466,10 +466,9 @@ (optimize-speed (and (not delayp) (sb-c:policy env (< space 3))))) `(progn - ,@(!expander-for-defstruct - null-env-p optimize-speed delayp - name-and-options slot-descriptions - :target)))) + ,@(!expander-for-defstruct null-env-p optimize-speed delayp + name-and-options slot-descriptions + :target)))) ;;;; functions to generate code for various parts of DEFSTRUCT definitions @@ -771,6 +770,9 @@ unless :NAMED is also specified."))) (classoid-layout classoid) layout) classoid))) (ancestor-slot-comparator-list)) + #+sb-xc-host + (when (member (dd-name dd) '(pathname logical-pathname)) + (setf (dd-alternate-metaclass dd) '(t built-in-classoid nil))) ;; Type parsing should be done assuming that prototype classoid ;; exists, which fixes a problem when redefining a DEFTYPE which ;; appeared to be a raw slot. e.g. @@ -1095,6 +1097,8 @@ unless :NAMED is also specified."))) (layout-inherits super) (vector super (classoid-layout (find-classoid 'string-stream))))) + (pathname (vector (find-layout 't))) + (logical-pathname (vector (find-layout 't) (find-layout 'pathname))) (t (concatenate 'simple-vector (layout-inherits super) (vector super)))))) @@ -1120,7 +1124,10 @@ unless :NAMED is also specified."))) (unless (dsd-read-only slot) (fmakunbound `(setf ,(dsd-accessor-name slot))))))) (setq layout (classoid-layout classoid)))) - (setf (find-classoid (dd-name dd)) classoid) + ;; Don't want to (setf find-classoid) on a a built-in-classoid + (unless (and (built-in-classoid-p classoid) + (eq (find-classoid (dd-name dd) nil) classoid)) + (setf (find-classoid (dd-name dd)) classoid)) (when source-location (setf (classoid-source-location classoid) source-location)))) @@ -1301,7 +1308,10 @@ unless :NAMED is also specified."))) (t (unless (eq (classoid-layout classoid) layout) (register-layout layout :invalidate nil)) - (setf (find-classoid (dd-name dd)) classoid))) + ;; Don't want to (setf find-classoid) on a a built-in-classoid + (unless (and (built-in-classoid-p classoid) + (eq (find-classoid (dd-name dd) nil) classoid)) + (setf (find-classoid (dd-name dd)) classoid)))) ;; At this point the class should be set up in the INFO database. ;; But the logic that enforces this is a little tangled and @@ -1317,8 +1327,8 @@ unless :NAMED is also specified."))) (dolist (ctor (dd-constructors dd)) (setf (info :function :source-transform (car ctor)) info)))) -;;; Do (COMPILE LOAD EVAL)-time actions for the normal (not -;;; ALTERNATE-LAYOUT) DEFSTRUCT described by DD. +;;; Do (COMPILE LOAD EVAL)-time actions for the structure described by DD +;;; which may be a "normal" defstruct or an alternate-metaclass struct. ;;; This includes generation of a style-warning about previously compiled ;;; calls to the accessors and/or predicate that weren't inlined. (defun %compiler-defstruct (dd inherits) @@ -1544,12 +1554,15 @@ or they must be declared locally notinline at each call site.~@:>" (t (values 'structure-classoid 'make-structure-classoid))) (insured-find-classoid (dd-name info) - (if (eq class 'structure-classoid) - (lambda (x) - (sb-xc:typep x 'structure-classoid)) - (lambda (x) - (sb-xc:typep x (classoid-name (find-classoid class))))) - (fdefinition constructor))) + (case class + (structure-classoid #'structure-classoid-p) + ;; The final fallthrough case would recurse infinitely + ;; on BUILT-IN-CLASSOID if TYPEP were allowed to parse + ;; its argument, so don't let it. + (built-in-classoid #'built-in-classoid-p) + (t (lambda (x) + (sb-xc:typep x (classoid-name (find-classoid class)))))) + constructor)) (setf (classoid-direct-superclasses classoid) (case (dd-name info) ((ansi-stream @@ -2002,9 +2015,8 @@ or they must be declared locally notinline at each call site.~@:>" ;; We do *not* fill in the COPIER-NAME and PREDICATE-NAME ;; because alternate-metaclass structures can not have either. (case dd-type - ;; We don't support inheritance of alternate metaclass stuff, - ;; and it's not a general-purpose facility, so sanity check our - ;; own code. + ;; We don't fully support inheritance of alternate metaclass stuff, + ;; so sanity check our own code. (structure (aver (eq superclass-name 't))) (funcallable-structure @@ -2033,7 +2045,7 @@ or they must be declared locally notinline at each call site.~@:>" (metaclass-constructor (missing-arg)) (dd-type (missing-arg))) - (declare (type (and list (not null)) slot-names)) + (declare (type list slot-names)) (declare (type (and symbol (not null)) superclass-name metaclass-name @@ -2063,6 +2075,8 @@ or they must be declared locally notinline at each call site.~@:>" `(progn (eval-when (:compile-toplevel :load-toplevel :execute) (%compiler-defstruct ',dd ',(!inherits-for-structure dd)) + (when (eq (info :type :kind ',class-name) :defined) + (setf (info :type :kind ',class-name) :instance)) ,@(when (eq metaclass-name 'static-classoid) `((declaim (freeze-type ,class-name))))) ,@(accessor-definitions dd) diff --git a/src/code/describe.lisp b/src/code/describe.lisp index ce250d2d78..d601a901b8 100644 --- a/src/code/describe.lisp +++ b/src/code/describe.lisp @@ -247,6 +247,15 @@ (print-standard-describe-header object stream) (describe-instance object stream)) +(defmethod describe-object ((object pathname) stream) + (print-standard-describe-header object stream) + (loop for name across #(host device directory name type version) + for i from (get-dsd-index pathname host) + do (awhen (%instance-ref object i) + (format stream "~% ~10A = ~A" name + (prin1-to-line (if (eq name 'directory) (car it) it))))) + (terpri stream)) + (defmethod describe-object ((object character) stream) (print-standard-describe-header object stream) (format stream "~%Char-code: ~S~%Char-name: ~A" diff --git a/src/code/inspect.lisp b/src/code/inspect.lisp index f91c04796a..1974061a11 100644 --- a/src/code/inspect.lisp +++ b/src/code/inspect.lisp @@ -178,6 +178,11 @@ evaluated expressions. t (inspected-structure-elements object))) +(defmethod inspected-parts ((object pathname)) + (values (format nil "The object is a ~S.~%" (type-of object)) + t + (inspected-structure-elements object))) + (defun inspected-standard-object-elements (object) (let ((reversed-elements nil) (class-slots (sb-pcl::class-slots (class-of object)))) diff --git a/src/code/late-type.lisp b/src/code/late-type.lisp index 0919e80e9a..d26fc527e6 100644 --- a/src/code/late-type.lisp +++ b/src/code/late-type.lisp @@ -1429,7 +1429,10 @@ (unless (eq (not not-i) i) (format t "~S -> ~A and ~A~%" c not-i i)))) |# (defun classoid-definitely-instancep (x) (or (structure-classoid-p x) - (condition-classoid-p x))) + (condition-classoid-p x) + ;; PATHNAMEs are INSTANCEs based on the lowtag criterion + (or (eq x (specifier-type 'logical-pathname)) + (eq x (specifier-type 'pathname))))) (eval-when (:compile-toplevel :execute) (pushnew 'classoid-definitely-instancep sb-vm::*backend-cross-foldable-predicates*)) diff --git a/src/code/pathname.lisp b/src/code/pathname.lisp index e7d82a0a85..f740430556 100644 --- a/src/code/pathname.lisp +++ b/src/code/pathname.lisp @@ -16,12 +16,11 @@ ;;; The HOST structure holds the functions that both parse the ;;; pathname information into structure slot entries, and after ;;; translation the inverse (unparse) functions. -(sb-xc:defstruct (host (:constructor nil) - (:copier nil) - (:print-object - (lambda (host stream) - (print-unreadable-object - (host stream :type t :identity t))))) +(defstruct (host (:constructor nil) + (:copier nil) + (:print-object + (lambda (host stream) + (print-unreadable-object (host stream :type t :identity t))))) (parse (missing-arg) :type function :read-only t) (parse-native (missing-arg) :type function :read-only t) (unparse (missing-arg) :type function :read-only t) @@ -36,8 +35,8 @@ ;;; A PATTERN is a list of entries and wildcards used for pattern ;;; matches of translations. -(sb-xc:defstruct (pattern (:constructor %make-pattern (hash pieces)) - (:copier nil)) +(defstruct (pattern (:constructor %make-pattern (hash pieces)) + (:copier nil)) (hash 0 :type fixnum :read-only t) (pieces nil :type list :read-only t)) @@ -45,14 +44,16 @@ ;;; the various magic tokens that are allowed to appear in pretty much ;;; all pathname components -(sb-xc:deftype pathname-component-tokens () +(deftype pathname-component-tokens () '(member nil :unspecific :wild :unc)) -(sb-xc:defstruct (pathname (:conc-name %pathname-) - (:copier nil) - (:constructor !allocate-pathname - (host device hashed-dir name type version)) - (:predicate pathnamep)) +;;; This definition relies on compiler magic to turn the metclass +;;; into BUILT-IN-CLASSOID. Same for LOGICAL-PATHNAME. +(defstruct (pathname (:conc-name %pathname-) + (:copier nil) + (:constructor !allocate-pathname + (host device dir+hash name type version)) + (:predicate pathnamep)) (namestring nil) ; computed on demand ;; the host (at present either a UNIX or logical host) ;; Host and device could be reduced to small integers and packed in one slot @@ -62,8 +63,8 @@ (device nil :type (or simple-string pathname-component-tokens) :read-only t) ;; an interned list of strings headed by :ABSOLUTE or :RELATIVE ;; comprising the path, or NIL. - ;; if the list is non-NIL, the CAR is a numerical hash code. - (hashed-dir nil :type list :read-only t) + ;; if the list is non-NIL, it's a cons of the list and a numeric hash. + (dir+hash nil :type list :read-only t) ;; the filename (name nil :type (or simple-string pattern pathname-component-tokens) :read-only t) ;; the type extension of the file @@ -73,3 +74,7 @@ (version nil :type (or integer pathname-component-tokens (member :newest)) :read-only t)) +(setf (layout-info (find-layout 'logical-pathname)) + (find-defstruct-description 'pathname)) +(declaim (inline logical-pathname-p)) +(defun logical-pathname-p (x) (typep x 'logical-pathname)) diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index 9dffe3b8d0..6938cb0d79 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -58,20 +58,8 @@ ;;; ;;; Physical pathnames include all these slots and a device slot. -;;; Logical pathnames are a subclass of PATHNAME. Their class -;;; relations are mimicked using structures for efficiency. -(defstruct (logical-pathname (:conc-name %logical-pathname-) - (:include pathname) - (:constructor nil) - (:copier nil))) - -;;; FIXME: this, and many other FREEZE-TYPEs don't actually do anything. -;;; Unobvious order of execution of TLFs in cold-init is one potential problem, -;;; but there could be other issues as well, like maybe we're unsealing classes -;;; because the FREEZE-TYPE was wrong to begin with. (So why no warnings then?) -;;; This declamation also freezes LOGICAL-PATHNAME, but we can't freeze HOST -;;; because later on we define either UNIX-HOST or WIN32-HOST. -#-sb-fluid (declaim (freeze-type pathname logical-host)) +;;; We can't freeze HOST because later on we define either UNIX-HOST or WIN32-HOST. +#-sb-fluid (declaim (freeze-type logical-host)) ;;; Utility functions @@ -89,7 +77,7 @@ (%make-pattern (sxhash pieces) pieces)) (declaim (inline %pathname-directory)) -(defun %pathname-directory (pathname) (cdr (%pathname-hashed-dir pathname))) +(defun %pathname-directory (pathname) (car (%pathname-dir+hash pathname))) (declaim (inline pathname-component-present-p)) (defun pathname-component-present-p (component) @@ -340,17 +328,14 @@ (let ((table *pathnames*)) (declare (inline !allocate-pathname)) ; for DXability (with-system-mutex ((hash-table-%lock table)) - (dx-let ((key (!allocate-pathname - host - device - (when directory - (ensure-gethash directory table - (cons (pathname-key-hash directory) directory))) - name - type - version))) + (let* ((dir+hash (when directory + (ensure-gethash + directory table + (cons directory (pathname-key-hash directory))))) + (key (!allocate-pathname host device dir+hash name type version))) + (declare (truly-dynamic-extent key)) (or (gethash key table) - (let ((key (copy-structure key))) + (let ((key (!allocate-pathname host device dir+hash name type version))) (when (typep host 'logical-host) (setf (%instance-layout key) #.(find-layout 'logical-pathname))) (setf (gethash key table) key))))))) @@ -519,10 +504,10 @@ ;; strength-reducing EQUAL to EQ is inadmissible here. ;; To fix that, MAKE-LOAD-FORM methods need not to bypass ;; INTERN-PATHNAME. - (let ((dir-a (%pathname-hashed-dir a)) - (dir-b (%pathname-hashed-dir b))) + (let ((dir-a (%pathname-dir+hash a)) + (dir-b (%pathname-dir+hash b))) (or (eq dir-a dir-b) - (compare-component (cdr dir-a) (cdr dir-b)))) + (compare-component (car dir-a) (car dir-b)))) (compare-component (%pathname-device a) (%pathname-device b)) (compare-component (%pathname-name a) (%pathname-name b)) (compare-component (%pathname-type a) (%pathname-type b))))) @@ -564,7 +549,7 @@ ;; NAME-HASH is based on SXHASH of a string (hash (if (typep host 'logical-host) (logical-host-name-hash host) 0))) (mixf hash (hash-piece (%pathname-device x))) ; surely stringlike, right? - (awhen (%pathname-hashed-dir x) (mixf hash (car it))) + (awhen (%pathname-dir+hash x) (mixf hash (cdr it))) (mixf hash (hash-piece (%pathname-name x))) (mixf hash (hash-piece (%pathname-type x))) ;; EQUAL might ignore the version, and it doesn't provide many bits @@ -2022,11 +2007,10 @@ existing translations for \"SYS:SRC;\", \"SYS:CONTRIB;\", and (defmethod make-load-form ((pn pathname) &optional env) (declare (ignore env)) (labels ((reconstruct (component) - (cond ((pattern-p component) - (patternify component)) + (cond ((pattern-p component) (patternify component)) ((and (listp component) (some #'pattern-p component)) (cons 'list (mapcar #'patternify component))) - (t`',component))) + (t `',component))) (patternify (subcomponent) (if (pattern-p subcomponent) `(make-pattern ',(pattern-pieces subcomponent)) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 6750a25df5..572080c907 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1195,6 +1195,7 @@ core and return a descriptor to it." :test #'type= :key #'car))) (cond (predicate (cdr predicate)) ((eq type-name 'stream) 'streamp) + ((eq type-name 'pathname) 'pathnamep) ((eq type-name 't) 'constantly-t) (t (error "No predicate for builtin: ~S" type-name)))))) (null @@ -1213,6 +1214,7 @@ core and return a descriptor to it." (let* ((cell (cold-find-classoid-cell (classoid-name obj) :create t)) (cold-classoid (read-slot cell (find-layout 'sb-kernel::classoid-cell) :classoid))) + (aver (not (sb-kernel::undefined-classoid-p obj))) (unless (cold-null cold-classoid) (return-from ctype-to-core cold-classoid))) ;; CTYPEs can't be TYPE=-hashed, but specifiers can be EQUAL-hashed. @@ -1938,18 +1940,33 @@ core and return a descriptor to it." (push stuff (cdr gf)))) (defun attach-classoid-cells-to-symbols (hashtable) - (let ((num (sb-c::meta-info-number (sb-c::meta-info :type :classoid-cell))) - (layout (cold-layout-descriptor - (gethash 'sb-kernel::classoid-cell *cold-layouts*)))) - (when (plusp (hash-table-count *classoid-cells*)) - (aver layout)) - ;; Iteration order is immaterial. The symbols will get sorted later. - (maphash (lambda (symbol cold-classoid-cell) - (setf (gethash symbol hashtable) - (packed-info-insert - (gethash symbol hashtable +nil-packed-infos+) - sb-impl::+no-auxiliary-key+ num cold-classoid-cell))) - *classoid-cells*)) + (when (plusp (hash-table-count *classoid-cells*)) + (aver (cold-layout-descriptor + (gethash 'sb-kernel::classoid-cell *cold-layouts*))) + (let ((type-classoid-cell-info + (sb-c::meta-info-number (sb-c::meta-info :type :classoid-cell))) + (type-kind-info + (sb-c::meta-info-number (sb-c::meta-info :type :kind)))) + ;; Iteration order is immaterial. The symbols will get sorted later. + (maphash (lambda (symbol cold-classoid-cell) + (let ((packed-info + (packed-info-insert + (gethash symbol hashtable +nil-packed-infos+) + sb-impl::+no-auxiliary-key+ + type-classoid-cell-info cold-classoid-cell))) + ;; an instance classoid won't be returned from %PARSE-TYPE + ;; unless the :KIND is set, but we can't set the kind + ;; to :INSTANCE unless the classoid is present in the cell. + (when (and (eq (info :type :kind symbol) :instance) + (not (cold-null (read-slot cold-classoid-cell + 'sb-kernel::classoid-cell + :classoid)))) + (setf packed-info + (packed-info-insert + packed-info sb-impl::+no-auxiliary-key+ + type-kind-info (cold-intern :instance)))) + (setf (gethash symbol hashtable) packed-info))) + *classoid-cells*))) hashtable) ;; Create pointer from SYMBOL and/or (SETF SYMBOL) to respective fdefinition diff --git a/src/compiler/generic/primtype.lisp b/src/compiler/generic/primtype.lisp index c2a388743c..a13980c411 100644 --- a/src/compiler/generic/primtype.lisp +++ b/src/compiler/generic/primtype.lisp @@ -419,6 +419,8 @@ (exactly simd-pack-256-int)) ((complex function system-area-pointer weak-pointer) (values (primitive-type-or-lose (classoid-name type)) t)) + ((pathname logical-pathname) + (part-of instance)) (t (any)))) (fun-designator-type diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 2517beae02..863ee55ad2 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -848,6 +848,7 @@ (values '(function-with-layout-p object) '(%fun-layout object))) ((or (csubtypep classoid (specifier-type 'instance)) + (eq classoid (specifier-type 'logical-pathname)) ;; CONDITION can't be a funcallable-instance (csubtypep classoid (specifier-type 'condition))) (values '(%instancep object) From 43f785b6ccf30b35d51c36f79107f97f0b0110a1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 17:47:45 -0400 Subject: [PATCH 0258/4023] Remove use of TRUENAME (via PROBE-FILE) from OPEN This could possibly cause behavior change if options involving renaming are supplied for a file that had symlinks in the path to it. But in plain usage, opening any path other than exactly as requested violates the principle of least surprise. Hence if the new and old behaviors differ, the new is correct. --- NEWS | 4 +++- src/code/fd-stream.lisp | 27 +++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/NEWS b/NEWS index 608e0a8b62..5a0cef7a4a 100644 --- a/NEWS +++ b/NEWS @@ -3,7 +3,9 @@ changes relative to sbcl-2.0.6: * minor incompatible change: SB-THREAD:THREAD-OS-TID returns NIL for a thread which has exited. - * minor incompatible change: PATHNAME is no longer a STRUCTURE-OBJECT + * minor incompatible change: OPEN no longer calls TRUENAME implicitly + on a string filespec prior to issuing an open() system call. + * minor incompatible change: PATHNAME is no longer a STRUCTURE-OBJECT. changes in sbcl-2.0.6 relative to sbcl-2.0.5: * planned incompatible change: the defined symbols in the Metaobject diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index e2e954467b..e3c35a18cc 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -2394,16 +2394,17 @@ (declare (type index mask)) (let* (;; PATHNAME is the pathname we associate with the stream. (pathname (merge-pathnames filename)) - (physical (physicalize-pathname pathname)) - (truename (probe-file physical)) - ;; NAMESTRING is the native namestring we open the file with. - (namestring (cond (truename - (native-namestring truename :as-file t)) - ((or (not input) - (and input (eq if-does-not-exist :create)) - (and (eq direction :io) - (not if-does-not-exist-given))) - (native-namestring physical :as-file t))))) + (physical (native-namestring (physicalize-pathname pathname) :as-file t)) + ;; One call to access() is reasonable. 40 calls to lstat() is not. + ;; So DO NOT CALL TRUENAME HERE. + (existsp (sb-unix:unix-access physical sb-unix:f_ok)) + ;; Leave NAMESTRING as NIL if nonexistent and not creating a file. + (namestring (when (or existsp + (or (not input) + (and input (eq if-does-not-exist :create)) + (and (eq direction :io) + (not if-does-not-exist-given)))) + physical))) ;; Process if-exists argument if we are doing any output. (cond (output (unless if-exists-given @@ -2433,9 +2434,7 @@ nil) (t :create)))) - (cond ((and if-exists-given - truename - (eq if-exists :new-version)) + (cond ((and existsp if-exists-given (eq if-exists :new-version)) (sb-kernel::%file-error pathname "OPEN :IF-EXISTS :NEW-VERSION is not supported ~ when a new version must be created.")) @@ -2452,7 +2451,7 @@ pathname "OPEN :IF-DOES-NOT-EXIST ~s ~ :IF-EXISTS ~s will always signal an error." if-does-not-exist if-exists)) - (truename + (existsp (if if-exists (sb-kernel::%file-error pathname 'file-exists) (return))) From 198f1d02a614d48a952152f9b42f4173cf5dcb2c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 15 Jul 2020 19:28:16 -0400 Subject: [PATCH 0259/4023] Fix slot-exists-p on the new builtin classoids --- src/code/pathname.lisp | 6 ++++-- src/compiler/generic/genesis.lisp | 4 ++-- tests/clos.pure.lisp | 30 ++++++++++++++++++++---------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/code/pathname.lisp b/src/code/pathname.lisp index f740430556..96d5968622 100644 --- a/src/code/pathname.lisp +++ b/src/code/pathname.lisp @@ -74,7 +74,9 @@ (version nil :type (or integer pathname-component-tokens (member :newest)) :read-only t)) -(setf (layout-info (find-layout 'logical-pathname)) - (find-defstruct-description 'pathname)) +(let ((to (find-layout 'logical-pathname)) + (from (find-layout 'pathname))) + (setf (layout-info to) (layout-info from) + (layout-slot-table to) (layout-slot-table from))) (declaim (inline logical-pathname-p)) (defun logical-pathname-p (x) (typep x 'logical-pathname)) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 572080c907..99a6f100d0 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1152,8 +1152,8 @@ core and return a descriptor to it." (dolist (instance it (remhash name *layout-deferred-instances*)) (set-instance-layout instance result))) - (when (member name '(null list symbol)) - ;; Assign an empty slot-table. Why this is done only for three + (when (member name '(null list symbol pathname)) + ;; Assign an empty slot-table. Why this is done only for four ;; classoids is ... too complicated to explain here in a few words, ;; but revision 18c239205d9349abc017b07e7894a710835c5205 broke it. ;; Keep this in sync with MAKE-SLOT-TABLE in pcl/slots-boot. diff --git a/tests/clos.pure.lisp b/tests/clos.pure.lisp index a9bf897d83..56b6564e60 100644 --- a/tests/clos.pure.lisp +++ b/tests/clos.pure.lisp @@ -82,16 +82,26 @@ (setf (slot-value x z) (slot-value y z))) :allow-notes nil)) -(with-test (:name :slot-table-of-symbol-works) - (assert (eq :win - ;; the error that I want is about a missing slot, - ;; not a missing method, so don't let the compiler turn - ;; this into (funcall #'(SLOT-ACCESSOR :GLOBAL A READER)...) - (handler-case (eval '(slot-value 'a 'a)) - (simple-condition (c) - (and (search "slot ~S is missing" - (simple-condition-format-control c)) - :win)))))) +(defun assert-no-such-slot (obj slot-name) + (dolist (method '(slot-value slot-boundp)) + (assert (eq :win + ;; the error that I want is about a missing slot, + ;; not a missing method, so don't let the compiler turn + ;; this into (funcall #'(SLOT-ACCESSOR :GLOBAL A READER)...) + (handler-case (eval `(,method ',obj ',slot-name)) + (simple-condition (c) + (and (search "slot ~S is missing" + (simple-condition-format-control c)) + :win)))))) + ;; and of course SLOT-EXISTS-P should just return NIL + (assert (not (slot-exists-p obj slot-name)))) + +(with-test (:name :slot-table-of-builtin-classoids) + (assert-no-such-slot 'some-symbol 'some-slot) + (assert-no-such-slot #P"foo" 'some-slot) + (let ((lpn #p"sys:contrib;")) + (assert (typep lpn 'logical-pathname)) + (assert-no-such-slot lpn 'some-slot))) (with-test (:name :funcallable-instance-sxhash) (assert From 6069d4eef41e751fd6d05d573e60ec724b8ce1ff Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 16 Jul 2020 10:34:16 -0400 Subject: [PATCH 0260/4023] Fix "unused result" warning --- src/runtime/run-program.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 587dc0ebeb..bb0c22b036 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -206,7 +206,8 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr, channel[0] = -1; channel[1] = -1; - pipe(channel); + // Surely we can do better than to lose() + if (pipe(channel)) lose("can't run-program"); pid = fork(); if (pid) { From 10bd11f1344a44f82ed824f94aeafc0abff34aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= Date: Thu, 16 Jul 2020 10:34:54 +0100 Subject: [PATCH 0261/4023] win32: make pipes larger When SB-EXT:RUN-PROGRAM is asked to return streams for stdin and/or stdout on Windows, it creates pipes with a very small 256-byte buffer. The smaller the buffer, the easier it becomes to enter deadlock, particularly because FORCE-OUTPUT blocks when flushing the stream buffer onto the pipe. An example of how things might go wrong: (let* ((process (sb-ext:run-program "program" nil :input :stream :output :stream :wait nil)) (stdin (sb-ext:process-input process))) ;; ;; program writes out a startup banner larger than 256 bytes and blocks ;; (write-line "" stdin) (force-output stdin)) ; blocks writing to the pipe, leading to deadlock On the one hand, this might be considered a feature, an early warning of sorts, that forces users to set up a more robust scheme such as reading and writing from different threads. On the other hand, why should Windows be the sole beneficiary of such a feature? This patch changes SB-WIN32::WINDOWS-PIPE to use the system's default pipe size, usually 4 KB. --- src/code/win32.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/win32.lisp b/src/code/win32.lisp index 05cc9c2e17..63c3a7c06e 100644 --- a/src/code/win32.lisp +++ b/src/code/win32.lisp @@ -889,7 +889,7 @@ absense." (defun windows-pipe () (multiple-value-bind (created read-handle write-handle) - (create-pipe nil 256) + (create-pipe nil 0) (if created (values read-handle write-handle) (win32-error 'create-pipe)))) From ad9fa52a6228e69194cd252130ec4381f0d9bc75 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 16 Jul 2020 11:54:32 -0400 Subject: [PATCH 0262/4023] Workaround mmap() interceptors --- make-config.sh | 4 +++ make-target-2-load.lisp | 2 +- src/runtime/hopscotch.c | 57 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/make-config.sh b/make-config.sh index 03326503ce..c548921ba1 100755 --- a/make-config.sh +++ b/make-config.sh @@ -494,6 +494,10 @@ case "$sbcl_os" in arm64 | ppc64 | x86 | x86-64) printf ' :gcc-tls' >> $ltf esac + case "$sbcl_arch" in + arm | arm64 | ppc | ppc64 | x86 | x86-64) + printf ' :use-sys-mmap' >> $ltf + esac # If you add other platforms here, don't forget to edit # src/runtime/Config.foo-linux too. diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index e761d3de3c..01aa54acae 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -22,7 +22,7 @@ :OS-PROVIDES-POLL ;; The final batch of symbols is strictly for C. The prefix of ;; "LISP_FEATURE_" on the corresponding #define is unfortunate. - :GCC-TLS + :GCC-TLS :USE-SYS-MMAP :RESTORE-FS-SEGMENT-REGISTER-FROM-TLS ; only for 'src/runtime/thread.h' :OS-PROVIDES-BLKSIZE-T)) ; only for 'src/runtime/wrap.h' (public-features diff --git a/src/runtime/hopscotch.c b/src/runtime/hopscotch.c index 9e27c268a6..ad6b398704 100644 --- a/src/runtime/hopscotch.c +++ b/src/runtime/hopscotch.c @@ -17,13 +17,56 @@ */ #include "os.h" -#include "gc-internal.h" // for os_allocate() +#include "gc-internal.h" // for sizetab[] and os_allocate() #include "hopscotch.h" #include #include #include "genesis/vector.h" #include "murmur_hash.h" +#ifdef LISP_FEATURE_USE_SYS_MMAP +/// +/// ********************************** +/// * GC MUST NOT ACQUIRE ANY LOCKS * +/// ********************************** +/// +/// It's normally fine to use the mmap() system call to obtain memory for the +/// hopscotch tables, unless your C runtime intercepts mmap() and causes it +/// to sometimes (or always?) need a spinlock. That lock may be owned already, +/// so GC will patiently wait forever; meanwhile the lock owner is also +/// waiting forever on GC to finish. +/// So bypass the C library routine and call the OS directly +/// in case of a non-signal-safe interceptor such as +/// https://chromium.googlesource.com/chromium/src/third_party/tcmalloc/chromium/+/refs/heads/master/src/malloc_hook_mmap_linux.h#146 +/// +static inline void* sys_mmap(void* addr, size_t length, int prot, int flags, + int fd, off_t offset) { + // "linux-os.h" brings in , others may need something different. + // mmap2 allows large file access with 32-bit off_t. We don't care about that, + // but _usually_ only one or the other of the syscalls exists depending on, + // various factors. Basing it on word size will pick the right one. +#ifdef LISP_FEATURE_64_BIT + void* result = (void*)syscall(SYS_mmap, addr, length, prot, flags, fd, offset); +#else + void* result = (void*)syscall(SYS_mmap2, addr, length, prot, flags, fd, offset); +#endif + if (result == MAP_FAILED) lose("mmap failed in GC"); + return result; +} +static inline int sys_munmap(void* addr, size_t length) { + return syscall(__NR_munmap, addr, length); +} +#define hopscotch_allocate(nbytes) \ + sys_mmap(0, nbytes, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0) +#define hopscotch_deallocate(addr,length) sys_munmap(addr, length) + +#else + +#define hopscotch_allocate(nbytes) os_allocate(nbytes) +#define hopscotch_deallocate(addr,length) os_deallocate(addr, length) + +#endif + typedef struct hopscotch_table* tableptr; void hopscotch_integrity_check(tableptr,char*,int); @@ -123,7 +166,7 @@ void hopscotch_init() // Called once on runtime startup, from gc_init(). // Prefill the cache with 2 entries, each the size of a kernel page. int n_bytes_per_slice = getpagesize(); int n_bytes_total = N_CACHED_ALLOCS * n_bytes_per_slice; - char* mem = os_allocate(n_bytes_total); + char* mem = hopscotch_allocate(n_bytes_total); gc_assert(mem); cached_alloc[0] = mem + ALLOCATION_OVERHEAD; cached_alloc[1] = cached_alloc[0] + n_bytes_per_slice; @@ -158,7 +201,7 @@ static char* cached_allocate(os_vm_size_t nbytes) // not a multiple of the mmap granularity, which we'll assume is 4K. // (It doesn't actually matter.) nbytes = ALIGN_UP(nbytes, hh_allocation_granularity); - char* result = os_allocate(nbytes); + char* result = hopscotch_allocate(nbytes); gc_assert(result); result += ALLOCATION_OVERHEAD; usable_size(result) = nbytes - ALLOCATION_OVERHEAD; @@ -185,15 +228,15 @@ static void cached_deallocate(char* mem, uword_t zero_fill_length) int cached_size1 = usable_size(cached_alloc[1]); if (!(this_size > cached_size0 || this_size > cached_size1)) { // mem is not strictly larger than either cached block. Release it. - os_deallocate(mem - ALLOCATION_OVERHEAD, - usable_size(mem) + ALLOCATION_OVERHEAD); + hopscotch_deallocate(mem - ALLOCATION_OVERHEAD, + usable_size(mem) + ALLOCATION_OVERHEAD); return; } // Evict and replace the smaller of the two cache entries. if (cached_size1 < cached_size0) line = 1; - os_deallocate(cached_alloc[line] - ALLOCATION_OVERHEAD, - usable_size(cached_alloc[line]) + ALLOCATION_OVERHEAD); + hopscotch_deallocate(cached_alloc[line] - ALLOCATION_OVERHEAD, + usable_size(cached_alloc[line]) + ALLOCATION_OVERHEAD); } memset(mem, 0, zero_fill_length); cached_alloc[line] = mem; From 56ee0d72ab231c8c602b65aa69a7523f3cfa4dde Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 17 Jul 2020 14:01:03 -0400 Subject: [PATCH 0263/4023] Fix another warning I traded an "unused result" on pipe() for an "undeclared function". Nice. --- src/runtime/run-program.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index bb0c22b036..3c4b15d3bb 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -27,6 +27,7 @@ #include #include #include +#include "interr.h" // for lose() #ifdef LISP_FEATURE_OPENBSD #include From 83b5dd9ee0f5def5f214eea92c174ca166b684f6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 17 Jul 2020 14:46:46 -0400 Subject: [PATCH 0264/4023] Set warm build compilation policy Moving a file from make-host-2 to warm should not make it emit worse code --- src/cold/warm.lisp | 18 +++++++++++++++--- src/pcl/fixup.lisp | 6 ++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 09bb340f9c..fe8fbbd338 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -145,9 +145,21 @@ retry-compile-file (multiple-value-bind (output-truename warnings-p failure-p) (ecase (if (boundp '*compile-files-p*) *compile-files-p* t) - ((t) (let ((sb-c::*source-namestring* fullname)) - (ensure-directories-exist output) - (compile-file stem :output-file output))) + ((t) + (let ((sb-c::*source-namestring* fullname) + (sb-ext:*derive-function-types* + ;; BUG: deriving a strange (wrong?) function type in this + (unless (string= stem "src/pcl/fixup") + t))) + (ensure-directories-exist output) + ;; Like PROCLAIM-TARGET-OPTIMIZATION in 'compile-cold-sbcl' + ;; We should probably stash a copy of the POLICY instance from + ;; make-host-2 in a global var and apply it here. + (proclaim '(optimize + (safety 2) (speed 2) + (sb-c:insert-step-conditions 0) + (sb-c:alien-funcall-saves-fp-and-pc #+x86 3 #-x86 0))) + (compile-file stem :output-file output))) ((nil) output)) (cond ((not output-truename) (error "COMPILE-FILE of ~S failed." stem)) diff --git a/src/pcl/fixup.lisp b/src/pcl/fixup.lisp index 51d68d08d3..ad8fe1396e 100644 --- a/src/pcl/fixup.lisp +++ b/src/pcl/fixup.lisp @@ -66,6 +66,12 @@ (setq **boot-state** 'complete) ;;; CLASS-PROTOTYPE for FUNCTION should not use ALLOCATE-INSTANCE. +;;; +;;; FIXME: this causes an error +;;; "A function with declared result type NIL returned: +;;; (SLOT-ACCESSOR :GLOBAL PROTOTYPE WRITER)" +;;; if SB-EXT:*DERIVE-FUNCTION-TYPES* is T. +;;; (let ((class (find-class 'function))) (setf (slot-value class 'prototype) #'identity)) From 39bd4d1d2c92dd39c870e5bb8fe79bf250431d3a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 17 Jul 2020 15:11:04 -0400 Subject: [PATCH 0265/4023] Unbreak everything in PCL Yeah, shoulda tested that change to compilation policy --- src/cold/warm.lisp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index fe8fbbd338..37759e7905 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -148,8 +148,7 @@ ((t) (let ((sb-c::*source-namestring* fullname) (sb-ext:*derive-function-types* - ;; BUG: deriving a strange (wrong?) function type in this - (unless (string= stem "src/pcl/fixup") + (unless (search "/pcl/" stem) t))) (ensure-directories-exist output) ;; Like PROCLAIM-TARGET-OPTIMIZATION in 'compile-cold-sbcl' From e20da1c218c35c0e3e5971c817a18955a55ec4c1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 17 Jul 2020 15:12:40 -0400 Subject: [PATCH 0266/4023] Rewrite MAP-OBJECTS-IN-RANGE, again Neither more nor less efficient, but less OAOO-violating. See also https://sourceforge.net/p/sbcl/sbcl/ci/a6a03ecc1540 --- make-target-2-load.lisp | 1 + src/code/room.lisp | 190 +++++++++++++++------------------- src/runtime/gc-common.c | 5 + tests/bit-vector.impure.lisp | 9 +- tools-for-build/editcore.lisp | 6 +- 5 files changed, 96 insertions(+), 115 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index 01aa54acae..ce5d55e218 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -377,6 +377,7 @@ Please check that all strings which were not recognizable to the compiler sb-vm::thread-profile-data-slot sb-vm::thread-alloc-region-slot sb-vm::primitive-object-size + sb-vm::reconstitute-object ;; need this for defining a vop which ;; tests the x86-64 allocation profiler sb-vm::pseudo-atomic diff --git a/src/code/room.lisp b/src/code/room.lisp index 82ef6da9c8..fe04425349 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -61,6 +61,9 @@ ;; not that this is expected to work concurrently with gc. (make-room-info (ash most-positive-word (- (1+ n-widetag-bits))) 'bignum :other)) + (setf (svref infos filler-widetag) + (make-room-info (ash most-positive-word (- (1+ n-widetag-bits))) + 'filler :other)) (setf (svref infos closure-widetag) (make-room-info short-header-max-words 'closure :closure)) @@ -169,13 +172,6 @@ (multiple-value-bind (start end) (%space-bounds space) (ash (- end start) n-fixnum-tag-bits)))) -;;; Round SIZE (in bytes) up to the next dualword boundary. A dualword -;;; is eight bytes on platforms with 32-bit word size and 16 bytes on -;;; platforms with 64-bit word size. -#-sb-fluid (declaim (inline round-to-dualword)) -(defun round-to-dualword (size) - (logand (the word (+ size lowtag-mask)) (lognot lowtag-mask))) - (defun instance-length (instance) ; excluding header, not aligned to even ;; Add 1 if expressed length PLUS header (total number of words) would be ;; an even number, and the hash state bits indicate hashed-and-moved. @@ -192,25 +188,6 @@ (ash header-word (- hash-slot-present-flag)) 1)))) -;;; Return the vector OBJ, its WIDETAG, and the number of octets -;;; required for its storage (including padding and alignment). -(defun reconstitute-vector (obj saetp) - (declare (type (simple-array * (*)) obj) - (type specialized-array-element-type-properties saetp)) - (let* ((length (+ (length obj) - (saetp-n-pad-elements saetp))) - (n-bits (saetp-n-bits saetp)) - (alignment-pad (floor 7 n-bits)) - (n-data-octets (if (>= n-bits 8) - (* length (ash n-bits -3)) - (ash (* (+ length alignment-pad) - n-bits) - -3)))) - (values obj - (saetp-typecode saetp) - (round-to-dualword (+ (* vector-data-offset n-word-bytes) - n-data-octets))))) - ;;; * If symbols are 7 words incl header, as they are on 32-bit w/threads, ;;; then the part of NIL that manifests as symbol slots consumes 6 words ;;; (less the header) because NIL's symbol widetag precedes it by 1 word. @@ -222,6 +199,15 @@ ;;; So either way, NIL's alignment padding makes it come out to 8 words in total. (defconstant sizeof-nil-in-words (+ 2 (sb-int:align-up (1- sb-vm:symbol-size) 2))) +;;; It's unclear to me whether reinventing sizetab[] in lisp is strictly +;;; an improvement over doing the obvious: +;;; (WITH-PINNED-OBJECTS (object) (alien-funcall "ext_lispboj_size" ...)) +;;; It certainly doesn't feel that it's better, but it has significantly less overhead +;;; at least on cheneygc if not also on the precise gencgc platforms. +;;; But see WITH-PINNED-OBJECT-ITERATOR in 'target-hash-table' which offers +;;; a way to mitigate the need to bind/unbind a special var when doing a massive +;;; numbers of WITH-PINNED-OBJECT operations. +;;; FIXME: export this from SB-EXT (defun primitive-object-size (object) "Return number of bytes of heap or stack directly consumed by OBJECT" (if (is-lisp-pointer (get-lisp-obj-address object)) @@ -247,8 +233,19 @@ (+ array-dimensions-offset (array-rank object))) ((simple-array-nil-p object) 2) (t - (return-from primitive-object-size - (nth-value 2 (reconstitute-vector object room-info))))) + (let* ((length (+ (length object) + (saetp-n-pad-elements room-info))) + (n-bits (saetp-n-bits room-info)) + (alignment-pad (floor 7 n-bits)) + ;; This math confuses me. So there's a self-test + ;; against the C code which is known good. + (n-data-octets (if (>= n-bits 8) + (* length (ash n-bits -3)) + (ash (* (+ length alignment-pad) + n-bits) + -3)))) + (+ (ceiling n-data-octets n-word-bytes) ; N data words + vector-data-offset)))) ;; Other things (symbol, value-cell, etc) ;; don't have a sizer, so use GET-HEADER-DATA (1+ (logand (get-header-data object) @@ -256,67 +253,22 @@ (* (align-up words 2) n-word-bytes)) 0)) -;;; Given the address (untagged, aligned, and interpreted as a FIXNUM) -;;; of a lisp object, return the object, its "type code" (either -;;; LIST-POINTER-LOWTAG or a header widetag), and the number of octets -;;; required for its storage (including padding and alignment). Note -;;; that this function is designed to NOT CONS, even if called -;;; out-of-line. -;;; FIXME: size calculation should be via PRIMITIVE-OBJECT-SIZE, not reinvented +(defmacro widetag@baseptr (sap) + #+big-endian `(sap-ref-8 ,sap ,(1- n-word-bytes)) + #+little-endian `(sap-ref-8 ,sap 0)) + +(defmacro lispobj@baseptr (sap widetag) + `(%make-lisp-obj + (logior (sap-int ,sap) + (logand (deref (extern-alien "widetag_lowtag" (array char 256)) ,widetag) + lowtag-mask)))) + +;;; This uses the funny fixnum representation of ADDRESS. I'd like to change this +;;; to take a SAP but god forbid people are using it? +;;; DO NOT USE THIS! It is soon to be removed (defun reconstitute-object (address) - (let* ((object-sap (int-sap (get-lisp-obj-address address))) - (header (sap-ref-word object-sap 0)) - (widetag (logand header widetag-mask)) - (header-value (ash header (- n-widetag-bits))) - (info (svref *room-info* widetag))) - (macrolet - ((boxed-size (header-value) - `(round-to-dualword (ash (1+ ,header-value) word-shift))) - (tagged-object (tag) - `(%make-lisp-obj (logior ,tag (get-lisp-obj-address address))))) - (cond - ;; Pick off arrays, as they're the only plausible cause for - ;; a non-nil, non-ROOM-INFO object as INFO. - ((specialized-array-element-type-properties-p info) - (reconstitute-vector (tagged-object other-pointer-lowtag) info)) - ((= widetag filler-widetag) - (values nil filler-widetag (boxed-size header-value))) - ((null info) - (error "Unrecognized widetag #x~2,'0X in reconstitute-object" - widetag)) - - (t - (case (room-info-kind info) - (:list - (values (tagged-object list-pointer-lowtag) - list-pointer-lowtag - (* 2 n-word-bytes))) - - (:instance - (let ((instance (tagged-object instance-pointer-lowtag))) - (values instance - widetag - (boxed-size (instance-length instance))))) - - (:closure ; also funcallable-instance - (values (tagged-object fun-pointer-lowtag) - widetag - (boxed-size (logand header-value short-header-max-words)))) - - (:code - (let ((c (tagged-object other-pointer-lowtag))) - (values c - code-header-widetag - (code-object-size c)))) - - (:fdefn - (values (tagged-object other-pointer-lowtag) widetag - (* fdefn-size n-word-bytes))) - - (:other - (values (tagged-object other-pointer-lowtag) - widetag - (boxed-size (logand header-value (room-info-mask info))))))))))) + (let ((sap (descriptor-sap address))) + (lispobj@baseptr sap (widetag@baseptr sap)))) ;;; Iterate over all the objects in the contiguous block of memory ;;; with the low address at START and the high address just before @@ -327,26 +279,47 @@ (defun map-objects-in-range (fun start end &optional (strict-bound t)) (declare (type function fun)) (declare (dynamic-extent fun)) - (named-let iter ((start start)) - (cond - ((< (get-lisp-obj-address start) (get-lisp-obj-address end)) - (multiple-value-bind (obj typecode size) (reconstitute-object start) - ;; SIZE is almost surely a fixnum. Non-fixnum would mean at least - ;; a 512MB object if 32-bit words, and is inconceivable if 64-bit. - (aver (not (logtest (the word size) lowtag-mask))) + (let ((start (descriptor-sap start)) + (end (descriptor-sap end))) + (loop + (if (sap>= start end) (return)) + (binding* ((widetag (widetag@baseptr start)) + (obj (lispobj@baseptr start widetag)) + ((typecode size) + ;; PRIMITIVE-OBJECT-SIZE works on conses, but they're exceptions already + ;; because of absence of a widetag, so may as well not call the sizer. + (if (listp obj) + (values list-pointer-lowtag (* 2 n-word-bytes)) + (values widetag (primitive-object-size obj))))) + ;; SIZE is surely a fixnum. Non-fixnum would imply at least + ;; a 512MB object if 32-bit words, and is inconceivable if 64-bit. + ;; But check to be sure. + (aver (not (logtest (the fixnum size) lowtag-mask))) (unless (= typecode filler-widetag) (funcall fun obj typecode size)) - ;; This special little dance is to add a number of octets - ;; (and it had best be a number evenly divisible by our - ;; allocation granularity) to an unboxed, aligned address - ;; masquerading as a fixnum. Without consing. - (iter (%make-lisp-obj - (mask-field (byte #.n-word-bits 0) - (+ (get-lisp-obj-address start) - size)))))) - (strict-bound + (setq start (sap+ start size)))) + (when strict-bound ;; If START is not eq to END, then we have blown past our endpoint. - (aver (eq start end)))))) + (aver (sap= start end))))) + +;;; Test the sizing function ASAP, because if it's broken, then MAP-ALLOCATED-OBJECTS +;;; is too, and then creating the initial core will crash because of the various heap +;;; traversals performed in SAVE-LISP-AND-DIE. Don't delay a crash. +(dovector (saetp *specialized-array-element-type-properties*) + (let ((length 0) (et (saetp-specifier saetp))) + (loop (let* ((array (make-array length :element-type et)) + (size-from-lisp (primitive-object-size array)) + (size-from-c + (with-pinned-objects (array) + (alien-funcall (extern-alien "ext_lispobj_size" (function unsigned unsigned)) + (logandc2 (get-lisp-obj-address array) lowtag-mask))))) + (unless (= size-from-lisp size-from-c) + (bug "size calculation mismatch on ~S" array)) + ;; Stop after enough trials to hit all the edge case + (when (or (>= size-from-lisp (* 8 sb-vm:n-word-bytes)) + (and (eq et nil) (>= length 4))) ; always 2 words + (return)) + (incf length))))) ;;; Access to the GENCGC page table for better precision in ;;; MAP-ALLOCATED-OBJECTS @@ -1309,9 +1282,10 @@ We could try a few things to mitigate this: (let ((where (+ dynamic-space-start (* page-num gencgc-card-bytes))) (seen-filler nil)) (loop - (multiple-value-bind (obj type size) - (reconstitute-object (ash where (- n-fixnum-tag-bits))) - (when (= type code-header-widetag) + (let* ((obj (let ((sap (int-sap where))) + (lispobj@baseptr sap (widetag@baseptr sap)))) + (size (primitive-object-size obj))) + (when (code-component-p obj) (incf n-code-bytes size)) (when (if (and (consp obj) (eq (car obj) 0) (eq (cdr obj) 0)) (if seen-filler diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 7ac06cb2b0..ce09549597 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -2381,3 +2381,8 @@ void gc_heapsort_uwords(heap array, int length) sift_down(array, 0, end); } } + +/// External function for calling from Lisp. +page_index_t ext_lispobj_size(lispobj *addr) { + return OBJECT_SIZE(*addr,addr) * N_WORD_BYTES; +} diff --git a/tests/bit-vector.impure.lisp b/tests/bit-vector.impure.lisp index c64cfd440c..ce894f1daf 100644 --- a/tests/bit-vector.impure.lisp +++ b/tests/bit-vector.impure.lisp @@ -126,12 +126,13 @@ (setf (sb-sys:sap-ref-word addr 0) sb-vm:simple-bit-vector-widetag) (setf (sb-sys:sap-ref-word addr sb-vm:n-word-bytes) (ash n-bits sb-vm:n-fixnum-tag-bits)) - (multiple-value-bind (object widetag size) - (sb-vm::reconstitute-object (sb-c::mask-signed-field + (let* ((object + (sb-vm::reconstitute-object + (sb-c::mask-signed-field sb-vm:n-fixnum-bits (ash (sb-sys:sap-int addr) - (- sb-vm:n-fixnum-tag-bits)))) - (declare (ignore widetag)) + (- sb-vm:n-fixnum-tag-bits))))) + (size (sb-vm::primitive-object-size object))) (assert (simple-bit-vector-p object)) (assert (= size n-bytes)) (assert (not (sb-kernel:%bit-position/1 object nil 0 n-bits))) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index e261e5f40d..8785ec1c7a 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -403,9 +403,9 @@ (physaddr start)) (loop (when (>= physaddr end) (return)) - (multiple-value-bind (obj tag size) - (reconstitute-object (ash physaddr (- n-fixnum-tag-bits))) - (when (and (= tag symbol-widetag) + (let* ((obj (reconstitute-object (ash physaddr (- n-fixnum-tag-bits)))) + (size (sb-vm::primitive-object-size obj))) + (when (and (symbolp obj) (string= symbol-name (translate (symbol-name obj) spaces)) (%instancep (symbol-package obj)) (string= package-name From fcaea4fd710abd1ee4939eacf98f2f90b46d9ab7 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Sat, 18 Jul 2020 16:32:41 +0100 Subject: [PATCH 0267/4023] replace -whitelist with -allowlist Affects only a single variable, only defined and used in the cross-compiler. --- make-host-2.lisp | 2 +- make-target-2-load.lisp | 2 +- src/code/cross-misc.lisp | 5 +++-- src/cold/set-up-cold-packages.lisp | 6 +++--- src/compiler/ir1report.lisp | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/make-host-2.lisp b/make-host-2.lisp index e96cfdd609..060d048d44 100644 --- a/make-host-2.lisp +++ b/make-host-2.lisp @@ -43,7 +43,7 @@ (when (and fail (not (featurep :win32))) (cerror "Proceed anyway" "Undefined ~:[~;variables~] ~:[~;types~]~ - ~:[~;functions (incomplete SB-COLD::*UNDEFINED-FUN-WHITELIST*?)~]" + ~:[~;functions (incomplete SB-COLD::*UNDEFINED-FUN-ALLOWLIST*?)~]" variables types functions))) #-clisp ; DO-ALL-SYMBOLS seems to kill CLISP at random diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index ce5d55e218..9d5fe4e9f3 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -35,7 +35,7 @@ :FREEBSD :GNU-KFREEBSD :OPENBSD :NETBSD :DRAGONFLY :HAIKU :HPUX :MACH-O :ELF ; obj file format: pick zero or one ;; I would argue that this should not be exposed, - ;; but I would also anticipate blowblack from removing it. + ;; but I would also anticipate blowback from removing it. :CHENEYGC :GENCGC ; GC: pick one and only one ;; Can't use s-l-a-d :compression safely without it :SB-CORE-COMPRESSION diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index 2690f4eb3d..c98d20b711 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -238,8 +238,9 @@ ;;; For macro lambdas that are processed by the host (declaim (declaration top-level-form)) -;;; The opposite of the whitelist - if certain full calls are seen, it is probably -;;; the result of a missed transform and/or misconfiguration. +;;; The opposite of *undefined-fun-allowlist* - if certain full calls +;;; are seen, it is probably the result of a missed transform and/or +;;; misconfiguration. (defparameter *full-calls-to-warn-about* '(;mask-signed-field ;; Too many to fix )) diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index d776cd19c3..3e7511d025 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -469,8 +469,8 @@ (reexport x)) (assert (= (length done) (length package-data-list))))))) -(export '*undefined-fun-whitelist*) -(defvar *undefined-fun-whitelist* (make-hash-table :test 'equal)) +(export '*undefined-fun-allowlist*) +(defvar *undefined-fun-allowlist* (make-hash-table :test 'equal)) (let ((list (with-open-file (data (prepend-genfile-path "package-data-list.lisp-expr")) ;; There's no need to use the precautionary READ-FROM-FILE function @@ -478,7 +478,7 @@ (create-target-packages (let ((*readtable* *xc-readtable*)) (read data))) (let ((*readtable* *xc-readtable*)) (read data))))) (dolist (name (apply #'append list)) - (setf (gethash name *undefined-fun-whitelist*) t))) + (setf (gethash name *undefined-fun-allowlist*) t))) (defvar *asm-package-use-list* '("SB-ASSEM" "SB-DISASSEM" diff --git a/src/compiler/ir1report.lisp b/src/compiler/ir1report.lisp index 0e1794b9f0..004a9236e4 100644 --- a/src/compiler/ir1report.lisp +++ b/src/compiler/ir1report.lisp @@ -578,10 +578,10 @@ has written, having proved that it is unreachable.")) ;;; the compiler, hence the BOUNDP check. (defun note-undefined-reference (name kind) #+sb-xc-host - ;; Whitelist functions are looked up prior to UNCROSS, + ;; Allowlist functions are looked up prior to UNCROSS, ;; so that we can distinguish CL:SOMEFUN from SB-XC:SOMEFUN. (when (and (eq kind :function) - (gethash name sb-cold:*undefined-fun-whitelist*)) + (gethash name sb-cold:*undefined-fun-allowlist*)) (return-from note-undefined-reference (values))) (setq name (uncross name)) (unless (and From 6546f9a981e6096df71f8bc7ed69b96ea786eba5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 19 Jul 2020 01:29:12 -0400 Subject: [PATCH 0268/4023] Add some timing and other diagnostics to deadlock.impure After removal of the session lock on thread startup (git rev. faa46781) and the all-threads lock (in lisp, not C - git rev. 1dbad9cb) it tests nothing like what it originally meant to. But it is nonetheless is interesting code because with suitable modifications (mainly increasing the number of threads) it can be made to hit "interrupt nesting depth exceeded" and/or mmap failure. --- tests/deadlock.impure.lisp | 178 +++++++++++++++++++++++++++++++++++-- 1 file changed, 171 insertions(+), 7 deletions(-) diff --git a/tests/deadlock.impure.lisp b/tests/deadlock.impure.lisp index a8206cbcff..694c92386a 100644 --- a/tests/deadlock.impure.lisp +++ b/tests/deadlock.impure.lisp @@ -22,42 +22,206 @@ (sb-thread:join-thread t2)))) (assert (equal '(:ok :ok) res))))) +(defun clock-gettime () + (sb-int:dx-let ((a (make-array 2 :element-type 'sb-ext:word))) + (alien-funcall (extern-alien "clock_gettime" (function void int system-area-pointer)) + 0 (sb-sys:vector-sap a)) + (values (aref a 0) (aref a 1)))) + +(defun seconds-since (start_sec start_nsec) + (sb-int:dx-let ((a (make-array 2 :element-type 'sb-ext:word))) + (alien-funcall (extern-alien "clock_gettime" (function void int system-area-pointer)) + 0 (sb-sys:vector-sap a)) + (+ (/ (coerce (- (aref a 1) start_nsec) 'double-float) 1000000000) + (- (aref a 0) start_sec)))) + +(defglobal *max-avl-tree-total* 0) +(defglobal *max-avl-tree-born* 0) +(defglobal *max-avl-tree-running* 0) +(defglobal *max-avl-tree-died* 0) + +(defun avl-maptree (fun tree) + (sb-int:named-let recurse ((node tree)) + (when node + (funcall fun node) + (recurse (sb-thread::avlnode-left node)) + (recurse (sb-thread::avlnode-right node))))) + +(defun thread-count (&optional (tree sb-thread::*all-threads*)) + (let ((born 0) + (running 0) + (died 0)) + (setq running (sb-thread::avl-count tree)) + (let ((total (+ born running died))) + (macrolet ((max-into (global mine) + `(let ((old ,global)) + (loop + (when (<= ,mine old) (return)) + (let ((actual (cas ,global old ,mine))) + (if (>= actual old) (return)) (setq old actual)))))) + (max-into *max-avl-tree-total* total) + (max-into *max-avl-tree-born* born) + (max-into *max-avl-tree-running* running) + (max-into *max-avl-tree-died* died)) + (list total born running died)))) + ;;; I would optimistically guess that this test can no longer fail, ;;; even for :win32, since there is no lisp mutex around *all-threads*. ;;; (There is still the C one) +;;; +;;; With the sesion lock acquisition as part of thread startup, +;;; but with a patch that allows the thread creator to run while +;;; the child is waiting, all this test managed to do was create thousands +;;; of threads all blocked on the *SESSION-LOCK*, because MAKE-THREAD could +;;; return the created thread did anything at all. +;;; The way that happens is as follows: +;;; thread 0: grab session lock, initiate GC +;;; ... return from GC but not release session lock yet +;;; thread 1: start sleeping +;;; thread 2: try to grab session lock, enter a wait +;;; thread 3: start sleeping +;;; thread 4: try to grab session lock, enter a wait +;;; thread 5: start sleeping +;;; ... +;;; So the number of threads running simultaneously depends entirely on when +;;; the even numbered threads get CPU time to release the session lock. +;;; +;;; That said, I was curious why this test complete _so_ much slowly +;;; with faster thread start, and more quickly with slower thread start. +;;; Enabling the :deadlock-test-timing feature shows: +;;; +;;; Maxima attained: 2923 1 2923 2916 current=(2923 0 1 2922) +;;; ---- ---- +;;; tree node count ^ ^ nunber of threads in "run" state +;;; +;;; The answer is obvious: the time spent in each GC is proportional to +;;; the number of threads, and with faster thread start, we can actually +;;; achieve *nearly* 3000 threads running at the same time. +;;; With each thread allocating slightly over 4MiB of memory, that's +;;; about 12GiB of additional memory for the OS to manage which has +;;; a 2nd-order effect on our runtime as well. +;;; Contrast this with the "old way" where we were essentially +;;; firing off two threads at a time and letting them finish +;;; before getting to the next two. + +;; (pushnew :deadlock-test-timing *features*) + +(defglobal *message-in-counter* 0) +(defglobal *message-out-counter* 0) +(declaim (fixnum *message-in-counter* *message-out-counter*)) +(defparameter *huge-n-threads* 3000) +(defglobal *messages* (make-array (* 2 *huge-n-threads*))) +(declaim (simple-vector *messages*)) + +(defun show-queued-messages () + (loop while (< *message-out-counter* *message-in-counter*) + do (let ((args (aref *messages* *message-out-counter*))) + ;; If a store did not get into the array yet, bail out + ;; and hope it shows up by the next time we're here. + (when (eql args 0) + (return-from show-queued-messages)) + (apply #'format t (concatenate 'string "~4d " (car args)) (cdr args)) + (terpri)) + (incf *message-out-counter*))) + +;;; Atomically log a message for output by the main thread (to avoid interleaving) +(defun message (control &rest args) + (let* ((data (cons control args)) + (index (atomic-incf *message-in-counter*))) + (setf (aref *messages* index) data))) + +;;; This encounters the "backing off for retry" error if attempting +;;; to start too many threads. +(defparameter *max-runnable-threads* #+x86-64 100 #-x86-64 5) (with-test (:name :gc-deadlock :broken-on :win32) - (write-line "WARNING: THIS TEST WILL HANG ON FAILURE!") + #+nil (write-line "WARNING: THIS TEST WILL HANG ON FAILURE!") ;; Prior to 0.9.16.46 thread exit potentially deadlocked the ;; GC due to *all-threads-lock* and session lock. On earlier ;; versions and at least on one specific box this test is good enough ;; to catch that typically well before the 1500th iteration. (loop with i = 0 - with n = 3000 + with n = *huge-n-threads* + with running = nil while (< i n) do + (show-queued-messages) (incf i) + #-deadlock-test-timing (when (zerop (mod i 100)) (write-char #\.) (force-output)) + (when (> (length running) *max-runnable-threads*) + (let ((last (car (last running)))) + (sb-thread:join-thread last) + (setq running (nbutlast running)))) (handler-case + (push (if (oddp i) (make-join-thread - (lambda () - (sleep (random 0.001))) + (lambda (i &aux (rand (random 0.001))) + (declare (ignorable i)) + #-deadlock-test-timing + (sleep rand) + #+deadlock-test-timing + (multiple-value-bind (t0_sec t0_nsec) (clock-gettime) + (message "Sleep ~f, threads=~d" i rand (thread-count)) + (sleep rand) + (message "Done (~f sec)" i (seconds-since t0_sec t0_nsec)))) + :arguments i :name (format nil "SLEEP-~D" i)) (make-join-thread - (lambda () + (lambda (i) + (declare (ignorable i)) ;; KLUDGE: what we are doing here is explicit, ;; but the same can happen because of a regular ;; MAKE-THREAD or LIST-ALL-THREADS, and various ;; session functions. + #-deadlock-test-timing (progn (sb-thread::with-session-lock (sb-thread::*session*) - (sb-ext:gc)))) + (sb-ext:gc))) + #+deadlock-test-timing + (sb-int:binding* (((t0_sec t0_nsec) (clock-gettime)) + ((t1_sec t1_nsec wait-time) (values nil nil nil))) + (message "GC, threads=~d" i (thread-count)) + (sb-thread::with-session-lock (sb-thread::*session*) + (setq wait-time (seconds-since t0_sec t0_nsec)) + (multiple-value-setq (t1_sec t1_nsec) (clock-gettime)) + (sb-ext:gc)) + (let ((gc-time (seconds-since t1_sec t1_nsec))) + (message "GC Done (~f wait + ~f gc)~A" + i wait-time gc-time + (if (> gc-time .5) "***" ""))))) + :arguments i :name (format nil "GC-~D" i))) + running) (error (e) + ;; Not sure why this needs to back off - at most it was running 2 threads. (format t "~%error creating thread ~D: ~A -- backing off for retry~%" i e) (sleep 0.1) - (incf i))))) + (incf i)))) + #+deadlock-test-timing + (progn + (format t "~&Main thread: draining messages~%") (force-output) + (loop while (< (cas *message-out-counter* 0 0) (length *messages*)) + do (show-queued-messages) + (sleep .05)) + (format t "Maxima attained: ~d ~d ~d ~d current=~d~%" + *max-avl-tree-total* + *max-avl-tree-born* + *max-avl-tree-running* + *max-avl-tree-died* + (thread-count)) + (sb-thread:make-thread #'list :name "list") + (format t "After another make-thread: current=~d~%" (thread-count)) + (let (gc-times) + (sb-int:dovector (x *messages*) + (when (string= (first x) "GC Done" :end1 7) + (push (fourth x) gc-times))) + (let ((min (reduce #'min gc-times)) + (max (reduce #'max gc-times)) + (sum (reduce #'+ gc-times))) + (format t "~&GC time: min=~f max=~f avg=~f sum=~f~%" + min max (/ sum (length gc-times)) sum))))) From d7e72fa55c3df0927945bf706057d2d2af41386e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 19 Jul 2020 14:37:14 -0400 Subject: [PATCH 0269/4023] Add comment about something to investigate --- src/runtime/thread.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index e9041a2232..98436f7b0c 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -486,6 +486,13 @@ undo_init_new_thread(struct thread *th, /* Undo the association of the current pthread to its `struct thread', * such that we can call arch_os_get_current_thread() later in this * thread and cleanly get back NULL. */ + /* FIXME: this seems to be prone to causing lossage of signals because + * until setting current_thread to NULL, lisp_thread_p() returns 1, + * so maybe_resignal_to_lisp_thread() would consider this thread ok to + * receive a signal if delivered to a non-lisp thread. But then we just + * block everything and disappear. It's essentially the same problem as + * the GC pending signal that has to be explicitly discarded, which is + * the right disposition of that signal, but not signals in general */ #ifdef LISP_FEATURE_GCC_TLS current_thread = NULL; #else From 44cd253b523c0e34e305b510aed7b2909889b62e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 19 Jul 2020 17:11:03 -0400 Subject: [PATCH 0270/4023] Use pthread_equal only if linking with -lpthread How was this not failing at link time without pthreads? I don't know --- src/runtime/traceroot.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 697732cc0e..c7b5a5c5ed 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -1056,6 +1056,7 @@ int prove_liveness(lispobj objects, int criterion) return gc_prove_liveness(0, objects, gc_n_stack_pins, pinned_objects.keys, criterion); } +#ifdef LISP_FEATURE_SB_THREAD /// Given a pthread identifier, return the lisp thread's string name. /// Caveat emptor: This doesn't acquire the all_threads_lock. /// Ironically perhaps, 'traceroot' no longer uses this, but it's nice to have. @@ -1070,3 +1071,4 @@ struct vector* lisp_thread_name(os_thread_t os_thread) } return 0; } +#endif From a73025f04f41276f214ff454a3f1c6b78accaa42 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 20 Jul 2020 01:47:07 +0300 Subject: [PATCH 0271/4023] rotate-byte: don't pass (unsigned-byte 0) to specifier-type. Fixes lp#1888152 --- contrib/sb-rotate-byte/compiler.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/sb-rotate-byte/compiler.lisp b/contrib/sb-rotate-byte/compiler.lisp index 041c03c731..c2f67dbe90 100644 --- a/contrib/sb-rotate-byte/compiler.lisp +++ b/contrib/sb-rotate-byte/compiler.lisp @@ -45,7 +45,7 @@ (if (numeric-type-p size) (let ((size-high (numeric-type-high size)) (num-type (sb-c::lvar-type num))) - (if (and size-high + (if (and (typep size-high '(integer 1)) num-type (<= size-high sb-vm:n-word-bits) (csubtypep num-type From 9aea6f18f5de4fc29b5686c90a44516f624238dc Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 20 Jul 2020 15:21:09 -0400 Subject: [PATCH 0272/4023] Put back the THREAD-OS-THREAD slot We'll need it the lisp thread structure after a change which removes the thread setup semaphore. If the new thread hasn't executed enough of the C code to assign pthread_self() into th->os_thread, then INTERRUPT-THREAD will crash. It doesn't make any difference as things stand right now though. --- src/code/target-thread.lisp | 22 +++++++++++++--------- src/code/thread-structs.lisp | 24 ++++++++++++++++++++++++ tests/signals.impure.lisp | 6 ++---- tests/threads.impure.lisp | 4 ++-- 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index d6955232fa..e8e5516c9c 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -271,6 +271,13 @@ created and old ones may exit at any time." (sb-ext:define-load-time-global *foreign-thread* nil) (sb-ext:define-load-time-global *make-thread-lock* nil) +;;; Copy some slots from the C 'struct thread' into the SB-THREAD:THREAD. +(defmacro copy-primitive-thread-fields (this) + `(setf (thread-primitive-thread ,this) (sap-int (current-thread-sap)) + (thread-stack-end ,this) (get-lisp-obj-address sb-vm:*control-stack-end*) + (thread-os-thread ,this) + (sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)))) + (defun init-main-thread () (/show0 "Entering INIT-MAIN-THREAD") ;;; FIXME: is it purposeful or accidental that we recreate some of @@ -278,12 +285,11 @@ created and old ones may exit at any time." (setf sb-impl::*exit-lock* (make-mutex :name "Exit Lock") *make-thread-lock* (make-mutex :name "Make-Thread Lock")) (let ((thread (%make-thread "main thread" nil))) + (copy-primitive-thread-fields thread) ;; Run the macro-generated function which writes some values into the TLS, ;; most especially *CURRENT-THREAD*. (init-thread-local-storage thread) - (setf (thread-primitive-thread thread) (sap-int (current-thread-sap)) - (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*) - *initial-thread* thread) + (setf *initial-thread* thread) #-sb-safepoint (setq *foreign-thread* (make-foreign-thread)) (grab-mutex (thread-result-lock thread)) ;; Either *all-threads* is empty or it contains exactly one thread @@ -1607,8 +1613,7 @@ session." ;;; All threads other than the initial thread start via this function. #+sb-thread (defun new-lisp-thread-trampoline (thread setup-sem real-function arguments) - (setf (thread-primitive-thread thread) (sap-int (current-thread-sap))) - (setf (thread-stack-end thread) (get-lisp-obj-address sb-vm:*control-stack-end*)) + (copy-primitive-thread-fields thread) (let ((old *all-threads*)) (loop (let ((addr (get-lisp-obj-address sb-vm:*control-stack-start*))) @@ -1745,7 +1750,8 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; INITIAL-FUNCTION to another thread. ;; (Does WITHOUT-INTERRUPTS really matter now that it's DXed?) (with-system-mutex (*make-thread-lock*) - (if (zerop (%create-thread (get-lisp-obj-address #'start-routine))) + (if (zerop (setf (thread-os-thread thread) + (%create-thread (get-lisp-obj-address #'start-routine)))) (setf thread nil) (wait-on-semaphore setup-sem))))) (or thread (error "Could not create a new thread."))) @@ -1882,9 +1888,7 @@ subject to change." `(let ((lisp-thread ,thread)) (with-c-thread (c-thread lisp-thread) (unless (= c-thread 0) - (let ((,os-thread (sap-ref-word (int-sap c-thread) - (ash sb-vm::thread-os-thread-slot - sb-vm:word-shift)))) + (let ((,os-thread (thread-os-thread lisp-thread))) ,@body)))) #-sb-thread `(let ((lisp-thread ,thread) (,os-thread 0)) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index bf69e2e767..a1f0d81d68 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -42,6 +42,30 @@ in future versions." ;; This value is 0 if the thread is not considered alive, though the pthread ;; may be running its termination code (unlinking from all_threads etc) (primitive-thread 0 :type sb-vm:word) + ;; This is a redundant copy of the pthread identifier from the primitive thread. + ;; It's needed in the SB-THREAD:THREAD as well because there are valid reasons to + ;; manipulate the new thread before it has assigned 'th->os_thread = pthread_self()'. + ;; While we always have access to the C struct thread from Lisp, apparently the C + ;; code can't pass "&th->os_thread" as the first argument to pthread_create() for the + ;; incredible reason that the word might be written *after* the memory pointed at + ;; by 'th' has already been freed. Such action might seem to violate: + ;; "Before returning, a successful call to pthread_create() stores the ID of the + ;; new thread in the buffer pointed to by thread" + ;; (https://man7.org/linux/man-pages/man3/pthread_create.3.html) + ;; but that's not exactly what POSIX says, which is only: + ;; "Upon successful completion, pthread_create() stores the ID of the created thread + ;; in the location referenced by thread." + ;; (https://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_create.html) + ;; so there seems to be some leeway, and linux + glibc provides more of a guarantee. + ;; Technically we should have only one authoritative source of the pthread identifier, + ;; but it's not too critical, it's just annoying that there are two sources of + ;; the same value. + ;; The slot is somewhat poorly named (for consistency with C) because though it may + ;; correspond to an OS thread, it could be the case that the threading model has + ;; user-visible threads that do not map directly to OSs threads (or LWPs). + ;; Any use of THREAD-OS-THREAD from lisp should take care to ensure validity of + ;; the thread id by holding the INTERRUPTIONS-LOCK. + (os-thread 0 :type sb-vm:word) ;; Keep a copy of CONTROL-STACK-END from the "primitive" thread. ;; Reading that memory for any thread except *CURRENT-THREAD* is not safe ;; due to possible unmapping on thread death. diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index eefea7c490..ef94274520 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -69,10 +69,8 @@ (sb-thread::os-thread unsigned) (signal int)) (defun current-thread-os-thread () - #+sb-thread - (sb-sys:sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)) - #-sb-thread - 0) + #+sb-thread (sb-thread::thread-os-thread sb-thread:*current-thread*) + #-sb-thread 0) ;; It is desirable to support C-c on Windows, but SIGINT ;; is not the mechanism to use on this platform. diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 6495bf6caa..dd0acd2c6e 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -75,10 +75,10 @@ #-sb-thread (sb-ext:exit :code 104) (with-test (:name :thread-name-from-pthread) - (let* ((pthread (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)) + (let* ((pthread (sb-thread::thread-os-thread sb-thread:*current-thread*)) (string-data-sap (alien-funcall (extern-alien "lisp_thread_name" - (function system-area-pointer system-area-pointer)) + (function system-area-pointer unsigned)) pthread))) (assert (sap= (sb-sys:sap+ (vector-sap (sb-thread:thread-name sb-thread:*current-thread*)) (* -2 sb-vm:n-word-bytes)) From 7ad82cbd7fcc086f36f6fd28c1c6093f40a04d35 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 20 Jul 2020 16:23:14 -0400 Subject: [PATCH 0273/4023] Fix style-warnings --- tests/elfcore.test.sh | 12 ++++++++++++ tools-for-build/editcore.lisp | 5 ++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index c2e4e7429c..2c803aa719 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -33,6 +33,18 @@ set -e # exit on error # Ensure that we're not running a stale shrinkwrap-sbcl (cd $SBCL_PWD/../src/runtime ; rm -f shrinkwrap-sbcl ; make shrinkwrap-sbcl) +# Prevent style-warnings in the editcore script, but don't assume that it +# can be compiled in the first place unless actually doing the ELFcore tests. +run_sbcl --noinform < Date: Mon, 20 Jul 2020 17:20:31 -0400 Subject: [PATCH 0274/4023] Tighten up documentation --- NEWS | 1 + src/code/target-hash-table.lisp | 6 ++++-- tests/hash.impure.lisp | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 5a0cef7a4a..fdb7ab9b59 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ changes relative to sbcl-2.0.6: * minor incompatible change: OPEN no longer calls TRUENAME implicitly on a string filespec prior to issuing an open() system call. * minor incompatible change: PATHNAME is no longer a STRUCTURE-OBJECT. + * documentation: HASH-FUNCTION is a function designator (lp#1888028) changes in sbcl-2.0.6 relative to sbcl-2.0.5: * planned incompatible change: the defined symbols in the Metaobject diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index e910a78a33..8fb8240a96 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -322,7 +322,7 @@ Examples: (defconstant hash-table-kind-eq 0) (defconstant hash-table-kind-eql 1) (defconstant hash-table-kind-equal 2) -(defconstant hash-table-kind-equqlp 3) +(defconstant hash-table-kind-equalp 3) ;;; I don't want to change peoples' assumptions about what operations are threadsafe ;;; on a weak table that was not created as expressly synchronized, so we continue to @@ -366,12 +366,14 @@ Examples: approaches 0. Density 1 means an average of one entry per bucket. :HASH-FUNCTION - If NIL (the default), a hash function based on the TEST argument is used, + If unsupplied, a hash function based on the TEST argument is used, which then must be one of the standardized hash table test functions, or one for which a default hash function has been defined using SB-EXT:DEFINE-HASH-TABLE-TEST. If HASH-FUNCTION is specified, the TEST argument can be any two argument predicate consistent with it. The HASH-FUNCTION is expected to return a non-negative fixnum hash code. + If TEST is neither standard nor defined by DEFINE-HASH-TABLE-TEST, + then the HASH-FUNCTION must be specified. :WEAKNESS When :WEAKNESS is not NIL, garbage collection may remove entries from the diff --git a/tests/hash.impure.lisp b/tests/hash.impure.lisp index 12331093e9..0526229d9f 100644 --- a/tests/hash.impure.lisp +++ b/tests/hash.impure.lisp @@ -524,4 +524,28 @@ (assert (= empty (psxhash (make-rslotty :cdf #c(0d0 -0d0))))) (assert (= empty (psxhash (make-rslotty :cdf #c(-0d0 0d0))))))) +(defun my= (a b) (= a b)) +(defun fixnum-hash (x) (sxhash (the fixnum x))) +(defun fixnum-hash-worse (x) (logand (sxhash (the fixnum x)) 7)) +(define-hash-table-test my= fixnum-hash) + +(with-test (:name :hash-fun-is-function-designator) + ;; Users shouldn't write this baroque expression to make an EQL table. + (assert-error (make-hash-table :hash-function nil)) + ;; nor this + (assert-error (make-hash-table :test #'eql :hash-function nil)) + ;; :TEST, if unknown, does not imply a hash function + ;; even when it looks like it could. + (assert-error (make-hash-table :test #'=)) + ;; and of course this doesn't work either because the preceding doesn't + (assert-error (make-hash-table :test #'= :hash-function nil)) + ;; Try user functions + (let ((h (make-hash-table :test 'my=))) + (assert (eq (sb-impl::hash-table-hash-fun h) #'fixnum-hash))) + (let ((h (make-hash-table :test 'my= :hash-function 'fixnum-hash-worse))) + (assert (eq (sb-impl::hash-table-hash-fun h) #'fixnum-hash-worse))) + (let ((h (make-hash-table :test 'my= :hash-function #'fixnum-hash-worse))) + (assert (eq (sb-impl::hash-table-hash-fun h) #'fixnum-hash-worse))) + (assert-error (make-hash-table :test 'my= :hash-function nil))) ; no good + ;;; success From 7cff9473416959c505656f10cc8f4a58cfafb625 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 20 Jul 2020 19:21:11 -0400 Subject: [PATCH 0275/4023] fast-eval: slam compiled structure accessors in --- src/interpreter/sexpr.lisp | 8 +++++++- tests/fast-eval.impure.lisp | 13 +++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/interpreter/sexpr.lisp b/src/interpreter/sexpr.lisp index 6946841f38..1b74a4fd06 100644 --- a/src/interpreter/sexpr.lisp +++ b/src/interpreter/sexpr.lisp @@ -1185,7 +1185,13 @@ Test case. ;; so the conservative thing is to plug in NILs, not bogus values ;; from whatever file (if any) is currently being loaded. (setf (sb-c::compiled-debug-info-tlf-num+offset cdi) 0) - (setf (symbol-function fname) compiled-fun))))) + ;; Skirt a package lock by avoiding (SETF SYMBOL-FUNCTION) + ;; *technically* this should be a compare-and-swap to ensure that the + ;; original lambda expression is as expected. To do that, we need + ;; to get to the point where fdefns do not store "both" representations + ;; of one function pointer, because we can't assume that multi-word CAS + ;; is a thing. Or use a mutex (horrible). + (setf (fdefn-fun (find-fdefn fname)) compiled-fun))))) (when (fluid-def-p fname) ;; Return a handler that calls FNAME very carefully diff --git a/tests/fast-eval.impure.lisp b/tests/fast-eval.impure.lisp index 969e5ade76..cb9ebde051 100644 --- a/tests/fast-eval.impure.lisp +++ b/tests/fast-eval.impure.lisp @@ -325,3 +325,16 @@ (assert (nth-value 1 (function-lambda-expression (sb-int:info :type :expander 'thingz)))) ;; and make sure the expander actually works (assert (typep "hey" '(thingz 3)))) + +(defpackage fancypkg (:use "CL" "SB-EXT") (:export make-mystruct mystruct-x)) +(in-package fancypkg) +(defstruct mystruct (x 3) y) +(in-package "CL-USER") +(lock-package "FANCYPKG") + +(defun f () + (fancypkg:mystruct-x (fancypkg:make-mystruct))) +(test-util:with-test (:name :jit-compiled-struct-accessor-locked-pkg) + (assert (eql (f) 3)) + (assert (not (compiled-function-p #'f))) + (assert (compiled-function-p #'fancypkg:mystruct-x))) From 0dfedfcfeac04c81255f1df07ecaa71277957d0b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 20 Jul 2020 20:35:42 -0400 Subject: [PATCH 0276/4023] Allow building with #+(and linux (not sb-futex)) Don't know why you'd want to, but it works. --- src/code/target-thread.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index e8e5516c9c..bc5caf4aeb 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -26,7 +26,7 @@ (eval-when (:compile-toplevel :load-toplevel) #+(and sb-thread sb-futex linux) (pushnew :futex-use-tid sb-xc:*features*)) -#+futex-use-tid +#+linux (defmacro my-kernel-thread-id () `(sb-ext:truly-the (unsigned-byte 32) From 88b98e2d20e0f7f85d2b26ee90dc1c775004d84d Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 20 Jul 2020 21:42:35 -0400 Subject: [PATCH 0277/4023] Speed up MAKE-THREAD for x86[-64] on linux * Remove the create_thread_lock and thread setup semaphore. The start function is handed off in a GC-safe way and the creating thread is allowed to continue as soon as pthread_create() returns. * Retain the memory from up to 2 exited threads for reuse by new threads. This is not shared with the FOREIGN-THREAD memory pool, but perhaps could be. While this adds more conditionalization to both C and Lisp, it should be adaptable to OS_THREAD_STACK so that ultimately we can have only one way of performing post-mortem freeing instead of three. Benchmarks show about 6x to 7x faster lisp thread creation. Incidentally this fixes lp#1595699. --- contrib/sb-posix/interface.lisp | 6 + doc/internals-notes/make-thread-bench | 143 +++++++++ src/code/alien-callback.lisp | 13 +- src/code/avltree.lisp | 12 + src/code/final.lisp | 2 + src/code/target-signal.lisp | 2 +- src/code/target-thread.lisp | 408 ++++++++++++++++++++++---- src/code/thread-structs.lisp | 8 + src/cold/shared.lisp | 8 + src/compiler/generic/parms.lisp | 2 +- src/runtime/gencgc.c | 34 +++ src/runtime/thread.c | 69 ++++- src/runtime/thread.h | 1 + tests/deadlock.impure.lisp | 9 +- tests/make-thread.impure.lisp | 130 ++++++++ tools-for-build/grovel-headers.c | 4 + 16 files changed, 787 insertions(+), 64 deletions(-) create mode 100644 doc/internals-notes/make-thread-bench create mode 100644 tests/make-thread.impure.lisp diff --git a/contrib/sb-posix/interface.lisp b/contrib/sb-posix/interface.lisp index 30ec1a1b97..608eb2ba8c 100644 --- a/contrib/sb-posix/interface.lisp +++ b/contrib/sb-posix/interface.lisp @@ -344,7 +344,13 @@ not supported." (let () #+sb-thread (sb-impl::finalizer-thread-stop) + ;; Acquiring sb-thread::*make-thread-lock* prevents creation + ;; of new threads. (sb-thread::with-system-mutex (sb-thread::*make-thread-lock*) + ;; Dead threads aren't pruned from *ALL-THREADS* until the Pthread join. + ;; Do that now so that the forked process has only the main thread + ;; in *ALL-THREADS* and nothing in *JOINABLE-THREADS*. + #+pauseless-threadstart (sb-thread::join-pthread-joinables #'identity) (when (let ((avltree sb-thread::*all-threads*)) (or (sb-thread::avlnode-left avltree) (sb-thread::avlnode-right avltree))) diff --git a/doc/internals-notes/make-thread-bench b/doc/internals-notes/make-thread-bench new file mode 100644 index 0000000000..3620050c93 --- /dev/null +++ b/doc/internals-notes/make-thread-bench @@ -0,0 +1,143 @@ +(defglobal *counter* 0) +(declaim (fixnum *counter*)) + +;; how many threads to make, not all at once, of course +(defparameter howmany-threads 20000) + +(defun thread-lambda () + (atomic-incf *counter*)) + +(defun test1 (&optional (n howmany-threads)) + (setq *counter* 0) + (dotimes (i n) + (sb-thread:join-thread (sb-thread:make-thread #'thread-lambda))) + (assert (= *counter* n))) + +(defun test2 (&optional (n howmany-threads)) + (setq *counter* 0) + (let (prev-thread) + (dotimes (i n) + ;; while starting the new thread, join the previously made. + (let ((new-thread (sb-thread:make-thread #'thread-lambda))) + (when prev-thread + (sb-thread:join-thread prev-thread)) + (setq prev-thread new-thread))) + (sb-thread:join-thread prev-thread)) + (assert (= *counter* n))) + +(defun test3 (&optional (n howmany-threads)) + (setq *counter* 0) + ;; try making 10 at a time and waiting for those 10 before making more + (dotimes (i (/ n 10)) + (let ((threads)) + (dotimes (i 10) + (push (sb-thread:make-thread #'thread-lambda) threads)) + (dolist (thread threads) + (sb-thread:join-thread thread)))) + (assert (= *counter* n))) + +Without :pauseless-threadstart +------------------------------- + +$ perf stat ... --eval '(test1)' --quit + 6,435.72 msec task-clock:u # 1.103 CPUs utilized + 0 context-switches:u # 0.000 K/sec + 0 cpu-migrations:u # 0.000 K/sec + 219,735 page-faults:u # 0.034 M/sec + 1,484,016,696 cycles:u # 0.231 GHz + 17,008,247,359 stalled-cycles-frontend:u # 1146.10% frontend cycles idle + 525,232,002 instructions:u # 0.35 insn per cycle + # 32.38 stalled cycles per insn + 145,098,224 branches:u # 22.546 M/sec + 4,045,481 branch-misses:u # 2.79% of all branches + + 5.834005191 seconds time elapsed + 0.684522000 seconds user + 6.391622000 seconds sys + +$ perf stat ... --eval '(test2)' --quit + 6,383.26 msec task-clock:u # 1.182 CPUs utilized + 0 context-switches:u # 0.000 K/sec + 0 cpu-migrations:u # 0.000 K/sec + 220,625 page-faults:u # 0.035 M/sec + 1,435,852,231 cycles:u # 0.225 GHz + 16,839,228,290 stalled-cycles-frontend:u # 1172.77% frontend cycles idle + 524,776,029 instructions:u # 0.37 insn per cycle + # 32.09 stalled cycles per insn + 144,951,979 branches:u # 22.708 M/sec + 4,018,908 branch-misses:u # 2.77% of all branches + + 5.401308431 seconds time elapsed + 0.773771000 seconds user + 6.235207000 seconds sys + +$ perf stat ... --eval '(test3)' --quit + 7,813.04 msec task-clock:u # 1.133 CPUs utilized + 0 context-switches:u # 0.000 K/sec + 0 cpu-migrations:u # 0.000 K/sec + 131,699 page-faults:u # 0.017 M/sec + 1,477,424,012 cycles:u # 0.189 GHz + 20,769,787,623 stalled-cycles-frontend:u # 1405.81% frontend cycles idle + 525,748,318 instructions:u # 0.36 insn per cycle + # 39.51 stalled cycles per insn + 145,134,345 branches:u # 18.576 M/sec + 4,412,369 branch-misses:u # 3.04% of all branches + + 6.894458409 seconds time elapsed + 0.641120000 seconds user + 7.864134000 seconds sys + +Conclusion: approximately 300 microseconds to start a thread + +With :pauseless-threadstart +---------------------------- + +$ perf stat ... --eval '(test1)' --quit + 1,541.91 msec task-clock:u # 1.068 CPUs utilized + 0 context-switches:u # 0.000 K/sec + 0 cpu-migrations:u # 0.000 K/sec + 633 page-faults:u # 0.411 K/sec + 801,317,853 cycles:u # 0.520 GHz + 3,751,130,586 stalled-cycles-frontend:u # 468.12% frontend cycles idle + 352,170,311 instructions:u # 0.44 insn per cycle + # 10.65 stalled cycles per insn + 81,884,155 branches:u # 53.106 M/sec + 1,334,916 branch-misses:u # 1.63% of all branches + + 1.443664147 seconds time elapsed + 0.425407000 seconds user + 1.471034000 seconds sys + +$ perf stat ... --eval '(test2)' --quit + 1,249.01 msec task-clock:u # 1.550 CPUs utilized + 0 context-switches:u # 0.000 K/sec + 0 cpu-migrations:u # 0.000 K/sec + 573 page-faults:u # 0.459 K/sec + 668,480,325 cycles:u # 0.535 GHz + 3,086,418,550 stalled-cycles-frontend:u # 461.71% frontend cycles idle + 376,966,208 instructions:u # 0.56 insn per cycle + # 8.19 stalled cycles per insn + 95,790,671 branches:u # 76.694 M/sec + 918,120 branch-misses:u # 0.96% of all branches + + 0.805563424 seconds time elapsed + 0.325539000 seconds user + 1.162641000 seconds sys + +$ perf stat ... --eval '(test3)' --quit + 1,308.09 msec task-clock:u # 1.455 CPUs utilized + 0 context-switches:u # 0.000 K/sec + 0 cpu-migrations:u # 0.000 K/sec + 4,838 page-faults:u # 0.004 M/sec + 660,514,151 cycles:u # 0.505 GHz + 3,230,465,234 stalled-cycles-frontend:u # 489.08% frontend cycles idle + 364,307,811 instructions:u # 0.55 insn per cycle + # 8.87 stalled cycles per insn + 92,966,084 branches:u # 71.070 M/sec + 730,714 branch-misses:u # 0.79% of all branches + + 0.899161220 seconds time elapsed + 0.339090000 seconds user + 1.227741000 seconds sys + +Conclusion: 40 to 100 microseconds to start a thread diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index 481618f315..6369ac6da8 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -312,5 +312,16 @@ the alien callback for that function with the given alien type." (alien-funcall (extern-alien "release_all_threads_lock" (function void))) thread))) + #+pauseless-threadstart + (dx-let ((startup-info (vector nil ; trampoline is n/a + nil ; cell in *STARTING-THREADS* is n/a + #'sb-alien::enter-alien-callback + (list index return arguments) + nil nil))) ; sigmask + fpu state bits + (copy-primitive-thread-fields thread) + (setf (thread-startup-info thread) startup-info) + (update-all-threads (get-lisp-obj-address sb-vm:*control-stack-start*) thread) + (run)) + #-pauseless-threadstart (dx-let ((args (list index return arguments))) - (new-lisp-thread-trampoline thread nil #'sb-alien::enter-alien-callback args)))) + (run thread nil #'sb-alien::enter-alien-callback args)))) diff --git a/src/code/avltree.lisp b/src/code/avltree.lisp index 174a6393c3..7ca38f0a33 100644 --- a/src/code/avltree.lisp +++ b/src/code/avltree.lisp @@ -153,6 +153,7 @@ (t tree))) result))) +(export 'avltree-list) (defun avltree-list (tree &optional (transducer #'avlnode-data)) (let (result) (named-let recurse ((node tree)) @@ -162,6 +163,17 @@ (recurse (avlnode-right node)))) result)) +(defun avltree-filter (predicate tree) + (let (result) + (named-let recurse ((node tree)) + (when node + (let ((value (funcall predicate node))) + (when value + (push value result))) + (recurse (avlnode-left node)) + (recurse (avlnode-right node)))) + result)) + (defmethod print-object ((self avlnode) stream) (write-string "# node1 -> node2 -> node3. +;;; After reading *JOINABLE-THREADS* we want to CAS it to node2. +;;; If, after reading the variable, all of node1, node2, and node3 are popped +;;; by another thread, and then node1 is reused, and made to point to node4, +;;; then the new state is: *JOINABLE-THREADS* -> node1 -> node4 +;;; which looks like CAS(*joinable-threads*, node1, node2) should succeed, +;;; but it should not. The LL/SC model would detect that, but CAS can not. +;;; +;;; A thread is pushed into *JOINABLE-THREADS* while still using its lisp stack. +;;; This is fine, because the C code will perform a join, which will effectively +;;; wait until the lisp thread is off its stack. It won't have to wait long, +;;; because pushing into *JOINABLE-THREADS* is the last thing to happen in lisp. +;;; In theory we could support some mode of keeping the memory while joining +;;; the pthread, but we currently do not. +(sb-ext:define-load-time-global *joinable-threads* nil) +(declaim (list *joinable-threads*)) ; list of threads + +;;; Helper for SB-POSIX:FORK so that the child starts with no joinable threads. +;;; It might work to just set *JOINABLE-THREADS* to NIL in the child, but it's better to prune +;;; the *ALL-THREADS* tree as well. Must be called with the *MAKE-THREAD-LOCK* held +;;; or interrupts inhibited or both. +;;; Heuristic decides when to stop trying to free. Passing in #'IDENTITY means that +;;; all joinables should be processed. Passing in #'CDR or #'CDDR returns early if there +;;; are not at least 1 or 2 threads respectively that could be joined. +(export 'join-pthread-joinables) +(defun join-pthread-joinables (heuristic) + (loop (unless (funcall heuristic *joinable-threads*) (return)) + (let ((item (sb-ext:atomic-pop *joinable-threads*))) + (if item (primitive-join item t) (return))))) + +;;; Allocate lisp thread memory, attempting first to join any exited +;;; threads, freeing their memory. Possibly reuse the memory from one of +;;; the exited threads, +;;; Why do it this way instead of having JOIN-THREAD just defer to pthread_join() ? +;;; Because the interface would be less lispy. e.g. what happens if you don't join +;;; a thread - do you leak the memory?; That's bad. GC doesn't clean up threads. +;;; It could if we used finalizers, but finalizers have an additional problem: +;;; if the user does call JOIN-THREAD then the finalizer should do nothing. +;;; But there's no "atomic pthread_join + cancel-finalization", short of blocking +;;; signals around the join perhaps. +;;; One more thing- it's illegal to pthread_join() a thread more than once, +;;; but we allow JOIN-THREAD more than one. I think that's a bug. +;;; Ours has the meaning of "get result if done, otherwise wait" +;;; which is not the same as deallocation of the thread's OS resources. +(defun allocate-thread-memory () + (let ((reuse (let ((corpse (sb-ext:atomic-pop *joinable-threads*))) + (when corpse (primitive-join corpse nil))))) + ;; If there is more than 1 more joinable, join all but 1. + ;; Two threads could both find > 1 thread to join, and both do + ;; a join, leaving 0 to join. That's ok. + (join-pthread-joinables #'cdr) + (let ((thread-sap (alien-funcall (extern-alien "alloc_thread_struct" + (function system-area-pointer + system-area-pointer unsigned)) + (or reuse (int-sap 0)) + sb-vm:no-tls-value-marker-widetag))) + (when (and (not reuse) (/= (sap-int thread-sap) 0)) + ;; these would have been done already if reusing the memory + ;; of a completed thread. + (macrolet ((prot (fun) + `(alien-funcall (extern-alien ,fun (function void int + system-area-pointer)) + 1 thread-sap))) + (prot "protect_control_stack_guard_page") + (prot "protect_binding_stack_guard_page") + (prot "protect_alien_stack_guard_page"))) + (unless (= (sap-int thread-sap) 0) thread-sap)))) + +(defun pthread-sigmask (how new old) + (alien-funcall (extern-alien "pthread_sigmask" + (function void int system-area-pointer system-area-pointer)) + how + (cond ((system-area-pointer-p new) new) + (new (vector-sap new)) + (t (int-sap 0))) + (if old (vector-sap old) (int-sap 0)))) + +(defmacro thread-trampoline-defining-macro (&body body) ; NEW WAY + `(defun run () + (macrolet ((apply-real-function () + '(apply (svref (thread-startup-info *current-thread*) 2) + (prog1 (svref (thread-startup-info *current-thread*) 3) + (setf (thread-startup-info *current-thread*) 0))))) + (flet ((unmask-signals () + (let ((mask (svref (thread-startup-info *current-thread*) 4))) + (if mask + ;; If the original mask (at thread creation time) was provided, + ;; then restore exactly that mask. + (with-pinned-objects (mask) + (pthread-sigmask sb-unix::SIG_SETMASK mask nil)) + ;; Otherwise just do the usual thing + (sb-unix::unblock-deferrable-signals))))) + ;; notinline keeps array off the call stack by getting it out of the curent frame + (declare (notinline unmask-signals)) + + (sb-ext:atomic-push *current-thread* (session-new-enrollees *session*)) + + ;; Signals other than stop-for-GC are masked. The WITH/WITHOUT noise is + ;; pure cargo-cultism. I have no idea how or why any of it works, but it's + ;; basically the body of CALL-WITH-MUTEX, minus the actual GRAB-MUTEX which + ;; has been done by the creating thread on behalf of the created thread, + ;; unless the current thread is a FOREIGN-THREAD. + (without-interrupts + (unwind-protect (with-local-interrupts ,@body) + (let ((mutex (thread-result-lock *current-thread*))) + (when mutex (release-mutex mutex))))))))) +) ; end PROGN + +#-pauseless-threadstart +(defmacro thread-trampoline-defining-macro (&body body) ; OLD WAY + `(defun run (thread setup-sem function arguments) + (macrolet ((unmask-signals () '(sb-unix::unblock-deferrable-signals)) + (apply-real-function () '(apply function arguments))) + (copy-primitive-thread-fields thread) + (update-all-threads (get-lisp-obj-address sb-vm:*control-stack-start*) thread) + (sb-ext:atomic-push thread (session-new-enrollees *session*)) + (when setup-sem + (signal-semaphore setup-sem) + ;; setup-sem was dx-allocated, set it to NIL so that the + ;; backtrace doesn't get confused + (setf setup-sem nil)) + ,@body))) + ;;; All threads other than the initial thread start via this function. #+sb-thread -(defun new-lisp-thread-trampoline (thread setup-sem real-function arguments) - (copy-primitive-thread-fields thread) - (let ((old *all-threads*)) - (loop - (let ((addr (get-lisp-obj-address sb-vm:*control-stack-start*))) - ;; If ADDR exists, then we have a bug in the thread exit handler. - ;; The workaround here would be to delete the old thread first, - ;; but I'd rather find out about the bug than bury it. - (aver (not (avl-find addr old))) - (let ((new (avl-insert old addr thread))) - (when (eq old (setq old (sb-ext:cas *all-threads* old new))) (return)))))) - (sb-ext:atomic-push thread (session-new-enrollees *session*)) - (when setup-sem - (signal-semaphore setup-sem) - ;; setup-sem was dx-allocated, set it to NIL so that the - ;; backtrace doesn't get confused - (setf setup-sem nil)) - +(thread-trampoline-defining-macro ;; Using handling-end-of-the-world would be a bit tricky ;; due to other catches and interrupts, so we essentially ;; re-implement it here. Once and only once more. @@ -1646,19 +1848,18 @@ session." (without-interrupts (unwind-protect (with-local-interrupts - (sb-unix::unblock-deferrable-signals) - (setf (thread-result thread) - (prog1 - (multiple-value-list + (unmask-signals) + (let ((list + (multiple-value-list (unwind-protect (catch '%return-from-thread (sb-c::inspect-unwinding - (apply real-function arguments) + (apply-real-function) #'sb-di::catch-runaway-unwind)) (when *exit-in-process* - (sb-impl::call-exit-hooks)))) - #+sb-safepoint - (sb-kernel::gc-safepoint)))) + (sb-impl::call-exit-hooks)))))) + #+sb-safepoint (sb-kernel::gc-safepoint) + (setf (thread-result *current-thread*) list))) ;; we're going down, can't handle interrupts ;; sanely anymore. gc remains enabled. (block-deferrable-signals) @@ -1692,20 +1893,20 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (arguments) "Argument passed to ~S, ~S, is an improper list." 'make-thread arguments) - (run-thread (%make-thread name nil) - (coerce function 'function) - (ensure-list arguments)))) + (start-thread (%make-thread name nil) + (coerce function 'function) + (ensure-list arguments)))) ;;; System-internal use only #+sb-thread (defun make-ephemeral-thread (name function arguments) - (run-thread (%make-thread name t) function arguments)) + (start-thread (%make-thread name t) function arguments)) -;;; The purpose of splitting out RUN-THREAD from MAKE-THREAD is that when +;;; The purpose of splitting out START-THREAD from MAKE-THREAD is that when ;;; starting the finalizer thread, we might be able to do: ;;; (let ((thread (%make-thread "finalizer" t))) ;;; (when (cas *finalizer-thread* nil thread) -;;; (run-thread thread ...) +;;; (start-thread thread ...) ;;; which is possibly an improvement in two ways: ;;; (1) it ensures that there is no hidden state in the transition diagram @@ -1714,7 +1915,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;;; thread object published or not - and no "maybe starting" state. ;;; (2) imagine two threads, each of which actually GC'd - so the 'gc_happened' ;;; flag in gc-common.c is T for both - and each wants to start the finalizer. -;;; They both get all the way into NEW-LISP-THREAD-TRAMPOLINE, only for one +;;; They both get all the way into RUN only for one ;;; to lose the CAS on *FINALIZER-THREAD*. It's a lot of overhead to start ;;; a thread that does nothing and then exits. ;;; @@ -1722,8 +1923,102 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;;; get FINALIZER-THREAD-STOP _not_ to attempt to join a thread that has not ;;; yet sprung into being as an OS-level thread. -#+sb-thread -(defun run-thread (thread function arguments) +;;; This is the faster variant of RUN-THREAD that does not wait for the new +;;; thread to start executing before returning. +;;; Also the create_thread_lock is not used in C. +#+pauseless-threadstart +(defun start-thread (thread function arguments) + (let* ((trampoline + (lambda (arg) + ;; If an error occurs prior to getting the thread into a consistent lisp state, + ;; there's no chance of debugging anything anyway. + (declare (optimize (safety 0))) + (let ((new-thread + (%make-lisp-obj (logior (get-lisp-obj-address arg) + sb-vm:instance-pointer-lowtag)))) + ;; Now that this thread is known to GC, NEW-THREAD is either implicitly + ;; pinned (on conservative gc) or movable. It can hance be deleted from + ;; *STARTING-THREADS* list which occurs lazily on the next MAKE-THREAD. + ;; To avoid unnecessary GC work meanwhile, smash the cell in *STARTING-THREADS* + ;; that points to NEW-THREAD. That cell is pointed to by the startup-info. + (rplaca (svref (thread-startup-info new-thread) 1) 0) + (init-thread-local-storage new-thread) ; assign *CURRENT-THREAD* + ;; Expose this thread in *ALL-THREADS*. + ;; Why not set this before calling pthread_create() ? If it fails there should + ;; be no transient effect on the list of all threads. But it's indeterminate + ;; whether the creating or created thread will make progress first, + ;; so they both do this assignment. + (sb-ext:cas (thread-%visible new-thread) 0 1)) + (run))) + (saved-sigmask (make-array (* sb-unix::sizeof-sigset_t sb-vm:n-byte-bits) + :element-type 'bit :initial-element 0)) + (created)) + (declare (truly-dynamic-extent saved-sigmask)) + ;; Block deferrables to ensure that the new thread is unaffected by signals + ;; before the various interrupt-related special vars are set up. + (with-pinned-objects (saved-sigmask) + (pthread-sigmask sb-unix::SIG_BLOCK (foreign-symbol-sap "deferrable_sigset" t) + saved-sigmask)) + (binding* ((thread-sap (allocate-thread-memory) :EXIT-IF-NULL) + (stack-base + (sap-ref-word thread-sap + (ash sb-vm::thread-control-stack-start-slot sb-vm:word-shift))) + (sigmask + (if (position 1 saved-sigmask) ; if there are any signals masked + (copy-seq saved-sigmask) ; heap-allocate to pass to the new thread + nil)) ; otherwise, don't pass the saved mask + (cell (list thread)) + (startup-info + (vector trampoline cell function arguments sigmask + #+darwin ; pass fp modes, clearing the accrued exception bits + (dpb 0 sb-vm:float-sticky-bits (sb-vm:floating-point-modes)) + #-darwin 0))) ; otherwise, don't need to do that + (setf (thread-primitive-thread thread) (sap-int thread-sap) + (thread-startup-info thread) startup-info) + ;; Grant ownership of THREAD's result lock to it now so that a THREAD-JOIN + ;; right away can't prevent the kid from acquiring its own result lock. + ;; (N.B.: Giving away mutex ownership is not something the public API allows) + (let ((m (thread-result-lock thread))) + #+sb-futex (setf (mutex-state m) 1) + (setf (mutex-%owner m) thread)) + ;; Add new thread to *ALL-THREADS* now so that if the creator asserts + ;; something about "all" threads, it can find the new thread. + ;; But there is a slight ploy involved: the thread does not appear in + ;; (LIST-ALL-THREADS) until a POSIX thread is successfully started. + (setf (thread-%visible thread) 0) + (update-all-threads stack-base thread) + ;; Absence of the startup semaphore notwithstanding, creation is synchronized + ;; so that we can prevent new threads from starting, typically in SB-POSIX:FORK + ;; or SAVE-LISP-AND-DIE. + ;; The locks also guards access to *STARTING-THREADS* - a lockfree list wouldn't + ;; improve concurrency, as long as creation is synchronized anyway. + (with-system-mutex (*make-thread-lock*) + ;; Consing THREAD into *STARTING-THREADS* pins it as well as some elements + ;; of startup-info. Consequently those objects can be safely manipulated + ;; from C before inserting the thread into 'all_threads'. + ;; Assuming that new threads are scheduled by the OS as fast as we can create + ;; them, there should usually be only one item to delete from *STARTING-THREADS*. + (let ((old (delete 0 *starting-threads*))) + (setf *starting-threads* (rplacd cell old)) + (setq created (pthread-create thread stack-base)) + (cond (created ; Still holding the MAKE-THREAD-LOCK, expose thread in (LIST-ALL-THREADS). + ;; On CPUs where CAS can spuriously fail, this probably needs to loop and retry. + ;; It's ok if the thread changed 0 -> {1 | -1}, then failure here is correct. + (sb-ext:cas (thread-%visible thread) 0 1)) + (t ; unlikely. Out of memory perhaps? + (setq *starting-threads* old))))) + (unless created ; Remove side-effects of trying to create + (delete-from-all-threads stack-base) + (free-thread-struct thread-sap))) + (with-pinned-objects (saved-sigmask) + (pthread-sigmask sb-unix::SIG_SETMASK saved-sigmask nil)) + (if created thread (error "Could not create new OS thread.")))) + +#+(and sb-thread (not pauseless-threadstart)) +(progn +(define-alien-routine ("create_thread" %create-thread) + unsigned (lisp-fun-address unsigned)) +(defun start-thread (thread function arguments) (declare (inline make-semaphore make-waitqueue make-mutex)) @@ -1740,8 +2035,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; ready to run GC. Be careful. (init-thread-local-storage thread) (with-mutex ((thread-result-lock thread)) - (new-lisp-thread-trampoline thread setup-sem - function arguments)))) + (run thread setup-sem function arguments)))) ;; Holding mutexes or waiting on sempahores inside WITHOUT-GCING will lock up (aver (not *gc-inhibit*)) ;; Keep INITIAL-FUNCTION in the dynamic extent until the child @@ -1755,6 +2049,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (setf thread nil) (wait-on-semaphore setup-sem))))) (or thread (error "Could not create a new thread."))) +) ; end PROGN (defun join-thread (thread &key (default nil defaultp) timeout) "Suspend current thread until THREAD exits. Return the result values @@ -1782,6 +2077,15 @@ subject to change." (when (eq thread *current-thread*) (error 'join-thread-error :thread thread :problem :self-join)) + #+pauseless-threadstart + (when (cddr *joinable-threads*) ; if strictly > 2 are joinable, + ;; release C structures of previously exited threads. We could pthread_join() + ;; all joinables while retaining the memory for a few, but I didn't want to + ;; deal separately with the memory and the pthread - it's both or none. + ;; And the pthread overhead is negligible in comparison to the 4MB + ;; allocation that we make per thread. + (without-interrupts (join-pthread-joinables #'cddr))) + (let ((lock (thread-result-lock thread)) (got-it nil) (problem :timeout)) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index a1f0d81d68..cec36bdec2 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -72,6 +72,14 @@ in future versions." ;; Usually this is a fixed amount below PRIMITIVE-THREAD, but the exact offset ;; varies by build configuration, and if #+win32 it is not related in any way. (stack-end 0 :type sb-vm:word) + ;; At the beginning of the thread's life, this is a vector of data required + ;; to start the user code. At the end, is it pointer to the 'struct thread' + ;; so that it can be either freed or reused. + (startup-info 0 :type (or fixnum (simple-vector 6))) + ;; Whether this thread should be returned in LIST-ALL-THREADS. + ;; This is almost-but-not-quite the same as what formerly + ;; might have been known as the %ALIVE-P flag. + (%visible 1 :type fixnum) (interruptions nil :type list) ;; On succesful execution of the thread's lambda a list of values. (result 0) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 43dec40a6f..9eda7ce12d 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -243,6 +243,12 @@ (gc (find-if (lambda (x) (member x '(:cheneygc :gencgc))) target-feature-list)) (arch (target-platform-keyword target-feature-list))) + (let ((*readtable* *xc-readtable*) + (sb-xc:*features* target-feature-list)) + (when (featurep '(:and :linux (:or :x86 :x86-64) :sb-thread + (:not (:or :sb-safepoint :sb-thruption)))) + (format t "~&Adding :PAUSELESS-THREADSTART feature~%") + (push :pauseless-threadstart target-feature-list))) (when (and (member :x86 target-feature-list) (member :int4-breakpoints target-feature-list)) ;; 0xCE is a perfectly good 32-bit instruction, @@ -287,6 +293,8 @@ (let ((feature-compatibility-tests '(("(and sb-thread (not gencgc))" ":SB-THREAD requires :GENCGC") + ("(and pauseless-threadstart (not sb-thread))" + ":PAUSELESS-THREADSTART requires :SB-THREAD") ("(and sb-thread (not (or riscv ppc ppc64 x86 x86-64 arm64)))" ":SB-THREAD not supported on selected architecture") ("(and gencgc cheneygc)" diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index fb8f00a2dc..b1eda168d4 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -208,7 +208,7 @@ #-sb-thread *stepping* ;; threading support - #+sb-thread *free-tls-index* + #+sb-thread ,@'(sb-thread::*starting-threads* *free-tls-index*) ;; dynamic runtime linking support #+linkage-table +required-foreign-symbols+ diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index d23013dc33..58a37c4a36 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3514,6 +3514,40 @@ garbage_collect_generation(generation_index_t generation, int raise) } #endif + // Thread creation optionally no longer synchronizes the creating and + // created thread. When synchronized, the parent thread is responsible + // for pinning the start function for handoff to the created thread. + // When not synchronized, The startup parameters are pinned via this list + // which will always be NIL if the feature is not enabled. +#ifdef STARTING_THREADS + lispobj pin_list = SYMBOL(STARTING_THREADS)->value; + for ( ; pin_list != NIL ; pin_list = CONS(pin_list)->cdr ) { + lispobj lispthread = CONS(pin_list)->car; + // It would be tempting to say that only the SB-THREAD:THREAD instance + // requires pinning - because right after we access it to extract the + // primitive thread, we link into all_threads - but it may be that the code + // emitted by the C compiler in new_thread_trampoline computes untagged pointers + // when accessing the vector and the start function, so those would not be + // seen as valid lisp pointers by the implicit pinning logic. + // And the precisely GC'd platforms would not pin anything from C code. + // The tests in 'threads.impure.lisp' are good at detecting omissions here. + if (lispthread) { + gc_assert(instancep(lispthread)); + pin_exact_root(lispthread); + lispobj info = ((struct thread_instance*) + (lispthread-INSTANCE_POINTER_LOWTAG))->startup_info; + if (info) { + gc_assert(simple_vector_p(info)); + gc_assert(VECTOR(info)->length >= make_fixnum(1)); + lispobj fun = VECTOR(info)->data[0]; + gc_assert(functionp(fun)); + pin_exact_root(info); + pin_exact_root(fun); + } + } + } +#endif + if (gencgc_verbose > 1) show_pinnedobj_count(); diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 98436f7b0c..02219143b7 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -61,7 +61,7 @@ #if defined(LISP_FEATURE_WIN32) || defined(OS_THREAD_STACK) # define IMMEDIATE_POST_MORTEM #else -static struct thread *postmortem_thread; +static __attribute__((unused)) struct thread *postmortem_thread; #endif #endif @@ -72,7 +72,7 @@ struct thread *all_threads; #ifdef LISP_FEATURE_SB_THREAD pthread_mutex_t all_threads_lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t create_thread_lock = PTHREAD_MUTEX_INITIALIZER; +static __attribute__((unused)) pthread_mutex_t create_thread_lock = PTHREAD_MUTEX_INITIALIZER; #ifdef LISP_FEATURE_GCC_TLS __thread struct thread *current_thread; @@ -198,11 +198,20 @@ static int sb_GetTID() { return syscall(SYS_gettid); } #define sb_GetTID() 0 #endif -static struct thread *alloc_thread_struct(void*,lispobj); +// Only a single 'attributes' object is used if #+pauseless-threadstart. +// This is ok because creation is synchronized by *MAKE-THREAD-LOCK*. +#ifdef LISP_FEATURE_SB_THREAD +pthread_attr_t new_lisp_thread_attr; +#define init_shared_attr_object() (pthread_attr_init(&new_lisp_thread_attr)==0) +#else +#define init_shared_attr_object() (1) +#endif +struct thread *alloc_thread_struct(void*,lispobj); void create_main_lisp_thread(lispobj function) { struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER_WIDETAG); - if(!th || arch_os_thread_init(th)==0) lose("can't create initial thread"); + if (!th || arch_os_thread_init(th)==0 || !init_shared_attr_object()) + lose("can't create initial thread"); #if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) pthread_key_create(&specials, 0); #endif @@ -260,7 +269,7 @@ void create_main_lisp_thread(lispobj function) { * not anymore, now that we properly call pthread_attr_destroy before * freeing the stack. */ -static void free_thread_struct(struct thread *th) +void free_thread_struct(struct thread *th) { #if defined(LISP_FEATURE_WIN32) os_invalidate_free((os_vm_address_t) th->os_address, THREAD_STRUCT_SIZE); @@ -282,7 +291,7 @@ schedule_thread_post_mortem(struct thread *corpse) free_thread_struct(corpse); } -# else +# elif !defined LISP_FEATURE_PAUSELESS_THREADSTART static void perform_thread_post_mortem(struct thread *post_mortem) @@ -507,6 +516,37 @@ undo_init_new_thread(struct thread *th, */ void* new_thread_trampoline(void* arg) { +#ifdef LISP_FEATURE_PAUSELESS_THREADSTART + + // 'arg' is an untagged pointer to an instance of SB-THREAD:THREAD + // which is currently pinned via *STARTING-THREADS* + // In that structure, the STARTUP-INFO slot holds a simple-vector + // which is pinned, and element 0 of the vector is also pinned. + struct thread_instance *lispthread = arg; + struct thread* th = (void*)lispthread->primitive_thread; // Pinned + struct vector* startup_info = VECTOR(lispthread->startup_info); // Pinned + gc_assert(header_widetag(startup_info->header) == SIMPLE_VECTOR_WIDETAG); + lispobj startfun = startup_info->data[0]; // Pinned + gc_assert(functionp(startfun)); + // Nothing at a higher address than &arg needs to be scanned for ambiguous roots. + // For x86 + linux this optimization skips over about 800 words in the stack scan, + // and for x86-64 it skip about 550 words as observed via: + // fprintf(stderr, "%d non-lisp stack words\n", + // (int)((lispobj*)th->control_stack_end - (lispobj*)&arg)); + th->control_stack_end = (lispobj*)&arg; + lispthread->stack_end = (lispobj)th->control_stack_end; + th->os_kernel_tid = sb_GetTID(); + init_new_thread(th, 0, 0, 0); + // Passing the untagged pointer ensures 2 things: + // - that the pinning mechanism works as designed, and not just by accident. + // - that the initial stack does not contain a lisp pointer after it is not needed. + // (a regression test asserts that not even a THREAD instance is on the stack) + long result = funcall1(startfun, (lispobj)lispthread); + // Close the GC region and unlink from all_threads + undo_init_new_thread(th, 0); + +#else // !PAUSELESS_THREADSTART + struct thread *th = (struct thread *)arg; th->os_kernel_tid = sb_GetTID(); int result; @@ -528,6 +568,7 @@ void* new_thread_trampoline(void* arg) #ifndef OS_THREAD_STACK schedule_thread_post_mortem(th); +#endif #endif FSHOW((stderr,"/exiting thread %p\n", thread_self())); @@ -797,7 +838,7 @@ void release_all_threads_lock() * On sb-safepoint builds one page before the thread base is used for the foreign calls safepoint. */ -static struct thread * +struct thread * alloc_thread_struct(void* spaces, lispobj start_routine) { #if defined(LISP_FEATURE_SB_THREAD) || defined(LISP_FEATURE_WIN32) unsigned int i; @@ -997,6 +1038,8 @@ extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, size_t __stacksize); #endif +#ifndef LISP_FEATURE_PAUSELESS_THREADSTART + /* Call pthread_create() and return 1 for success, 0 for failure */ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) { @@ -1075,6 +1118,8 @@ os_thread_t create_thread(lispobj start_routine) { return kid_tid; } +#endif + /* stopping the world is a two-stage process. From this thread we signal * all the others with SIG_STOP_FOR_GC. The handler for this signal does * the usual pseudo-atomic checks (we don't want to stop a thread while @@ -1092,12 +1137,19 @@ void gc_stop_the_world() { struct thread *p,*th=arch_os_get_current_thread(); int status, lock_ret; + // There is no create_thread lock if pauseless start is enabled. + // And wouldn't the right fix for FreeBSD be to inhibit the stop-for-GC signal + // rather than acquire a lock? And why exactly there a deadlock ? + // That we don't endeavor to find these things out leads to never-ending + // accretion of dubious code that we'll not know when to remove. +#ifndef LISP_FEATURE_PAUSELESS_THREADSTART /* KLUDGE: Stopping the thread during pthread_create() causes deadlock * on FreeBSD. */ FSHOW_SIGNAL((stderr,"/gc_stop_the_world:waiting on create_thread_lock\n")); lock_ret = pthread_mutex_lock(&create_thread_lock); gc_assert(lock_ret == 0); FSHOW_SIGNAL((stderr,"/gc_stop_the_world:got create_thread_lock\n")); +#endif FSHOW_SIGNAL((stderr,"/gc_stop_the_world:waiting on lock\n")); /* keep threads from starting while the world is stopped. */ lock_ret = pthread_mutex_lock(&all_threads_lock); @@ -1167,9 +1219,10 @@ void gc_start_the_world() lock_ret = pthread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); +#ifndef LISP_FEATURE_PAUSELESS_THREADSTART lock_ret = pthread_mutex_unlock(&create_thread_lock); gc_assert(lock_ret == 0); - +#endif FSHOW_SIGNAL((stderr,"/gc_start_the_world:end\n")); } diff --git a/src/runtime/thread.h b/src/runtime/thread.h index a4277ed826..972c00b7f4 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -18,6 +18,7 @@ #include "genesis/static-symbols.h" #include "genesis/thread.h" +#include "genesis/thread-instance.h" #include "genesis/fdefn.h" #include "genesis/vector.h" #include "interrupt.h" diff --git a/tests/deadlock.impure.lisp b/tests/deadlock.impure.lisp index 694c92386a..9423287177 100644 --- a/tests/deadlock.impure.lisp +++ b/tests/deadlock.impure.lisp @@ -51,7 +51,14 @@ (let ((born 0) (running 0) (died 0)) - (setq running (sb-thread::avl-count tree)) + #-pauseless-thread-start (setq running (sb-thread::avl-count tree)) + #+pauseless-thread-start + (sb-int:dx-flet ((mapfun (node) + (ecase (sb-thread::thread-%visible (sb-thread::avlnode-data node)) + (0 (incf born)) ; "can't happen" ? + (1 (incf running)) + (-1 (incf died))))) + (avl-maptree #'mapfun tree)) (let ((total (+ born running died))) (macrolet ((max-into (global mine) `(let ((old ,global)) diff --git a/tests/make-thread.impure.lisp b/tests/make-thread.impure.lisp new file mode 100644 index 0000000000..8f0a8cfcc7 --- /dev/null +++ b/tests/make-thread.impure.lisp @@ -0,0 +1,130 @@ +(in-package "SB-THREAD") + +;;; Test out-of-memory (or something) that goes wrong in pthread_create +#+pauseless-threadstart ; no SB-THREAD::PTHREAD-CREATE symbol if not +(test-util:with-test (:name :failed-thread-creation) + (let ((encapsulation + (compile nil + '(lambda (realfun thread stack-base) + (if (string= (sb-thread:thread-name thread) "finalizer") + (funcall realfun thread stack-base) + nil)))) + (success)) + (assert (null sb-thread::*starting-threads*)) + (unwind-protect + (progn (sb-int:encapsulate 'sb-thread::pthread-create 'test encapsulation) + (handler-case (sb-thread:make-thread #'list :name "thisfails") + (error (e) + (setq success (string= (write-to-string e) + "Could not create new OS thread."))))) + (sb-int:unencapsulate 'sb-thread::pthread-create 'test)) + (assert (equal sb-thread::*starting-threads* nil)) + (assert (equal (sb-thread::avltree-list sb-thread::*all-threads*) + (list sb-thread::*initial-thread*))))) + +(defun actually-get-stack-roots (current-sp + &key allwords (print t) + &aux (current-sp (descriptor-sap current-sp)) + (roots)) + (declare (type (member nil t :everything) allwords)) + (without-gcing + (let* ((stack-low (get-lisp-obj-address sb-vm:*control-stack-start*)) + (stack-high (get-lisp-obj-address sb-vm:*control-stack-end*)) + (nwords (ash (- stack-high (sap-int current-sp)) (- sb-vm:word-shift))) + (array (make-array nwords :element-type 'sb-ext:word))) + (when print + (format t "SP=end-~dw (range = ~x..~x)~%" nwords stack-low stack-high)) + (alien-funcall (extern-alien "memcpy" (function void system-area-pointer + system-area-pointer unsigned)) + (vector-sap array) current-sp (* nwords sb-vm:n-word-bytes)) + (loop for i downfrom (1- nwords) to 0 by 1 do + (let ((word (aref array i))) + (when (or (/= word sb-vm:nil-value) allwords) + (let ((baseptr (alien-funcall (extern-alien "search_all_gc_spaces" (function unsigned unsigned)) + word))) + (cond ((/= baseptr 0) ; an object reference + (let ((obj (sb-vm::reconstitute-object (%make-lisp-obj baseptr)))) + (when (and (code-component-p obj) + (= (logand word sb-vm:lowtag-mask) sb-vm:fun-pointer-lowtag)) + (dotimes (i (code-n-entries obj)) + (when (= (get-lisp-obj-address (%code-entry-point obj i)) word) + (return (setq obj (%code-entry-point obj i)))))) + ;; interior pointers to objects that contain instructions are OK, + ;; otherwise only correctly tagged pointers. + (when (or (typep obj '(or fdefn code-component funcallable-instance)) + (= (get-lisp-obj-address obj) word)) + (push obj roots) + (when print + (format t "~x = sp[~5d] = ~16x (~A) " + (sap-int (sap+ current-sp (ash i sb-vm:word-shift))) + i + word + (or (generation-of obj) #\S)) ; S is for static + (let ((*print-pretty* nil)) + (cond ((consp obj) (format t "a cons")) + #+sb-fasteval + ((typep obj 'sb-interpreter::sexpr) (format t "a sexpr")) + ((arrayp obj) (format t "a ~s" (type-of obj))) + ((and (code-component-p obj) + (>= word (sap-int (code-instructions obj)))) + (format t "PC in ~a" obj)) + (t (format t "~a" obj)))) + (terpri))))) + ((and print + (or (eq allwords :everything) (and allwords (/= word 0)))) + (format t "~x = sp[~5d] = ~16x~%" + (sap-int (sap+ current-sp (ash i sb-vm:word-shift))) + i word))))))))) + (if print + (format t "~D roots~%" (length roots)) + roots)) +(defun get-stack-roots (&rest rest) + (apply #'actually-get-stack-roots (%make-lisp-obj (sap-int (current-sp))) rest)) + +(defstruct big-structure x) +(defstruct other-big-structure x) +(defun make-a-closure (arg options) + (lambda (&optional (z 0) y) + (declare (ignore y)) + (test-util:opaque-identity + (format nil "Ahoy-hoy! ~d~%" (+ (big-structure-x arg) z))) + (apply #'get-stack-roots options))) +(defun tryit (&rest options) + (join-thread + (make-thread (make-a-closure (make-big-structure :x 0) options) + :arguments (list 1 (make-other-big-structure))))) + +(defun make-a-closure-nontail (arg) + (lambda (&optional (z 0) y) + (declare (ignore y)) + (get-stack-roots) + (test-util:opaque-identity + (format nil "Ahoy-hoy! ~d~%" (+ (big-structure-x arg) z))) + 1)) +(defun tryit-nontail () + (join-thread + (make-thread (make-a-closure-nontail (make-big-structure :x 0)) + :arguments (list 1 (make-other-big-structure))))) + +;;; Test that reusing memory from an exited thread does not point to junk. +;;; In fact, assert something stronger: there are no young objects +;;; between the current SP and end of stack. +(test-util:with-test (:name :expected-gc-roots + :skipped-on (or :interpreter (not :pauseless-threadstart))) + (let ((list (tryit :print nil))) + ;; should be not many things pointed to by the stack + (assert (< (length list) #+x86 35 ; more junk, I don't know why + #+x86-64 30)) ; less junk, I don't know why + ;; Either no objects are in GC generation 0, or all are, depending on + ;; whether CORE_PAGE_GENERATION has been set to 0 for testing. + (let ((n-objects-in-g0 (count 0 list :key #'sb-kernel:generation-of))) + (assert (or (= n-objects-in-g0 0) + (= n-objects-in-g0 (length list))))))) + +;; lp#1595699 +(test-util:with-test (:name :start-thread-in-without-gcing + :skipped-on (not :pauseless-threadstart)) + (assert (eq (sb-thread:join-thread + (sb-sys:without-gcing + (sb-thread:make-thread (lambda () 'hi)))) + 'hi))) diff --git a/tools-for-build/grovel-headers.c b/tools-for-build/grovel-headers.c index 4502fe2052..ebf0bcf17d 100644 --- a/tools-for-build/grovel-headers.c +++ b/tools-for-build/grovel-headers.c @@ -262,6 +262,10 @@ main(int argc, char __attribute__((unused)) *argv[]) printf("\n"); printf(";;; signals\n"); + defconstant("sizeof-sigset_t", sizeof (sigset_t)); + defconstant("sig_block", SIG_BLOCK); + defconstant("sig_unblock", SIG_UNBLOCK); + defconstant("sig_setmask", SIG_SETMASK); defsignal("sigalrm", SIGALRM); defsignal("sigbus", SIGBUS); defsignal("sigchld", SIGCHLD); From bfffac928ab4f159e52872d9b9f851929f0cef66 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 21 Jul 2020 19:08:26 -0400 Subject: [PATCH 0278/4023] Remove *joinable-threads* when saving a core --- src/code/final.lisp | 3 +++ src/code/save.lisp | 20 ++++++++++++++------ src/code/target-thread.lisp | 2 ++ src/runtime/thread.c | 3 +++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/code/final.lisp b/src/code/final.lisp index cf4929d8cf..0273ee03bb 100644 --- a/src/code/final.lisp +++ b/src/code/final.lisp @@ -359,6 +359,9 @@ Examples: ;; If it was NIL, it is latched at that state, so we can ignore it. (when (null thread) (return-from finalizer-thread-stop)) + ;; If user calls SAVE-LISP-AND-DIE or SB-POSIX:FORK in a finalizer... + (when (eq sb-thread:*current-thread* *finalizer-thread*) + (error "Can't stop finalizer thread from inside finalizer thread")) (let ((oldval (cas *finalizer-thread* thread nil))) ;; If GC had started the thread, and it got to its main body only after ;; we observed *FINALIZER-THREAD* = T, then we could see a transition diff --git a/src/code/save.lisp b/src/code/save.lisp index dfaea22345..64be7ac6c5 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -301,12 +301,15 @@ sufficiently motivated to do lengthy fixes." (call-hooks "save" *save-hooks*) #+sb-wtimer (itimer-emulation-deinit) + ;; FIXME: this logic should probably be surrounded by the *MAKE-THREAD-LOCK* + ;; but introducing potential new sources of deadlock requires due diligence. #+sb-thread (progn ;; Terminate finalizer thread now, especially given that the thread runs ;; user-supplied code that might not even work in later steps of deinit. ;; See also the comment at definition of THREAD-EPHEMERAL-P. (finalizer-thread-stop) + #+pauseless-threadstart (sb-thread::join-pthread-joinables #'identity) (let ((threads (sb-thread:list-all-threads))) (when (cdr threads) ;; Despite calling FINALIZER-THREAD-STOP, an unlucky thread schedule @@ -327,12 +330,17 @@ sufficiently motivated to do lengthy fixes." (sb-thread:join-thread finalizer))) ;; Regardless of what happened above, grab the all-threads list again. (setq threads (sb-thread:list-all-threads))) - (when (cdr threads) - (let* ((interactive (sb-thread::interactive-threads)) - (other (set-difference threads interactive))) - (error 'save-with-multiple-threads-error - :interactive-threads interactive - :other-threads other))))) + (let ((starting + (setq sb-thread::*starting-threads* ; ordinarily pruned in MAKE-THREAD + (delete 0 sb-thread::*starting-threads*))) + (joinable sb-thread::*joinable-threads*)) + (when (or (cdr threads) starting joinable) + (let* ((interactive (sb-thread::interactive-threads)) + (other (union (set-difference threads interactive) + (union starting joinable)))) + (error 'save-with-multiple-threads-error + :interactive-threads interactive + :other-threads other)))))) (tune-image-for-dump) (float-deinit) (profile-deinit) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 689f09ac75..4c931697e7 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1978,6 +1978,8 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; Grant ownership of THREAD's result lock to it now so that a THREAD-JOIN ;; right away can't prevent the kid from acquiring its own result lock. ;; (N.B.: Giving away mutex ownership is not something the public API allows) + ;; FIXME: this could be done more cleanly by a condition var to avoid reliance + ;; on the nonstandard operation of assigning ownership. (let ((m (thread-result-lock thread))) #+sb-futex (setf (mutex-state m) 1) (setf (mutex-%owner m) thread)) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 02219143b7..89cde8296c 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -459,6 +459,9 @@ undo_init_new_thread(struct thread *th, lock_ret = pthread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); + /* FIXME: this nests the free_pages_lock inside the all_threads_lock. + * There's no reason for that, so closing of regions should be done + * sooner to eliminate an ordering constraint. */ ensure_region_closed(&th->alloc_region, BOXED_PAGE_FLAG); #if defined(LISP_FEATURE_SB_SAFEPOINT_STRICTLY) && !defined(LISP_FEATURE_WIN32) ensure_region_closed(&th->sprof_alloc_region, BOXED_PAGE_FLAG); From 1277eba8c817178e8901e5a13674d09dd47a53ff Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 21 Jul 2020 22:31:46 -0400 Subject: [PATCH 0279/4023] Fix sb-safepoint and non-x86 --- src/code/target-thread.lisp | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 4c931697e7..49f61f626b 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -388,6 +388,27 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (sb-ext:define-load-time-global *starting-threads* nil) (declaim (list *starting-threads*)) ; list of threads +;;; *JOINABLE-THREADS* is a list of THREAD instances used only if #+pauseless-threadstart +;;; I had attempted to construct the list using the thread's memory to create cons +;;; cells but that turned out to be flawed- the cells must be freshly heap-allocated, +;;; because ATOMIC-POP is vulnerable to the A/B/A problem if cells are reused. +;;; Example: initial state: *JOINABLE-THREADS* -> node1 -> node2 -> node3. +;;; After reading *JOINABLE-THREADS* we want to CAS it to node2. +;;; If, after reading the variable, all of node1, node2, and node3 are popped +;;; by another thread, and then node1 is reused, and made to point to node4, +;;; then the new state is: *JOINABLE-THREADS* -> node1 -> node4 +;;; which looks like CAS(*joinable-threads*, node1, node2) should succeed, +;;; but it should not. The LL/SC model would detect that, but CAS can not. +;;; +;;; A thread is pushed into *JOINABLE-THREADS* while still using its lisp stack. +;;; This is fine, because the C code will perform a join, which will effectively +;;; wait until the lisp thread is off its stack. It won't have to wait long, +;;; because pushing into *JOINABLE-THREADS* is the last thing to happen in lisp. +;;; In theory we could support some mode of keeping the memory while joining +;;; the pthread, but we currently do not. +(sb-ext:define-load-time-global *joinable-threads* nil) +(declaim (list *joinable-threads*)) ; list of threads + #+(or sb-safepoint sb-thruption) (define-alien-routine "wake_thread" int @@ -1702,27 +1723,6 @@ session." (t ; Return the originally mapped address (sap-ref-sap c-thread (ash sb-vm::thread-os-address-slot sb-vm:word-shift)))))) -;;; *JOINABLE-THREADS* is a list of THREAD instances used only if #+pauseless-threadstart -;;; I had attempted to construct the list using the thread's memory to create cons -;;; cells but that turned out to be flawed- the cells must be freshly heap-allocated, -;;; because ATOMIC-POP is vulnerable to the A/B/A problem if cells are reused. -;;; Example: initial state: *JOINABLE-THREADS* -> node1 -> node2 -> node3. -;;; After reading *JOINABLE-THREADS* we want to CAS it to node2. -;;; If, after reading the variable, all of node1, node2, and node3 are popped -;;; by another thread, and then node1 is reused, and made to point to node4, -;;; then the new state is: *JOINABLE-THREADS* -> node1 -> node4 -;;; which looks like CAS(*joinable-threads*, node1, node2) should succeed, -;;; but it should not. The LL/SC model would detect that, but CAS can not. -;;; -;;; A thread is pushed into *JOINABLE-THREADS* while still using its lisp stack. -;;; This is fine, because the C code will perform a join, which will effectively -;;; wait until the lisp thread is off its stack. It won't have to wait long, -;;; because pushing into *JOINABLE-THREADS* is the last thing to happen in lisp. -;;; In theory we could support some mode of keeping the memory while joining -;;; the pthread, but we currently do not. -(sb-ext:define-load-time-global *joinable-threads* nil) -(declaim (list *joinable-threads*)) ; list of threads - ;;; Helper for SB-POSIX:FORK so that the child starts with no joinable threads. ;;; It might work to just set *JOINABLE-THREADS* to NIL in the child, but it's better to prune ;;; the *ALL-THREADS* tree as well. Must be called with the *MAKE-THREAD-LOCK* held From 717a92f059528dca0836e7d2a64c0f010222f8de Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 22 Jul 2020 08:30:40 -0400 Subject: [PATCH 0280/4023] Fix flaky test I was unable to elicit a failure, but I think this avoids it --- tests/make-thread.impure.lisp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/make-thread.impure.lisp b/tests/make-thread.impure.lisp index 8f0a8cfcc7..6206513947 100644 --- a/tests/make-thread.impure.lisp +++ b/tests/make-thread.impure.lisp @@ -90,9 +90,12 @@ (format nil "Ahoy-hoy! ~d~%" (+ (big-structure-x arg) z))) (apply #'get-stack-roots options))) (defun tryit (&rest options) - (join-thread - (make-thread (make-a-closure (make-big-structure :x 0) options) - :arguments (list 1 (make-other-big-structure))))) + (let ((thread + (make-thread (make-a-closure (make-big-structure :x 0) options) + :arguments (list 1 (make-other-big-structure))))) + ;; Sometimes the THREAD instance shows up in the list of objects + ;; on the stack, sometimes it doesn't. This is annoying, but work around it. + (remove thread (join-thread thread)))) (defun make-a-closure-nontail (arg) (lambda (&optional (z 0) y) From b6618894b17474cea10765f1e152277b09bf1e4d Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 22 Jul 2020 11:54:04 -0400 Subject: [PATCH 0281/4023] Attempt to fix save-deinit.impure.lisp --- src/code/final.lisp | 17 ++++++++++++++ src/code/save.lisp | 45 ++++++++++++++++++++----------------- src/code/target-thread.lisp | 43 ++++++++++++++++++----------------- 3 files changed, 64 insertions(+), 41 deletions(-) diff --git a/src/code/final.lisp b/src/code/final.lisp index 0273ee03bb..5df166257f 100644 --- a/src/code/final.lisp +++ b/src/code/final.lisp @@ -349,6 +349,23 @@ Examples: ;;; Make no attempt to drain the queue of pending finalizers. ;;; (When called from EXIT, the user must invoke a final GC if there is ;;; an expectation that GC-based things run. Similarly when saving a core) +;;; There's a data race involved during SAVE-LISP-AND-DIE (or SB-POSIX:FORK) +;;; because *FINALIZER-THREAD* is assigned by that thread itself which means that +;;; it has to run before we can detect that it exists. +;;; There are few remedies involving some combination of these steps: +;;; - Assign a THREAD instance into *finalizer-thread* before it shows +;;; up in *ALL-THREADS*. If *FINALIZER-THREAD* has a value but is not in +;;; *ALL-THREADS*, then it may be blocked on the mutex. Can we terminate it? +;;; - During save, acquire the *MAKE-THREAD-LOCK* to get a consistent view of +;;; which threads are starting and running. +;;; - the :pauseless-threadstart code adds new threads to *ALL-THREADS* +;;; before starting the posix thread. We could look there. +;;; The important thing is to avoid thinking that there is a thread running +;;; when it doesn't have a posix thread ID yet. +;;; - Does acquiring the *MAKE-THREAD-LOCK* before assigning *FINALIZER-THREAD* +;;; help anything? Perhaps. +;;; But first I'd like to entirely eliminate the non-pauseless-threadstart code +;;; so that we don't have to reason about two totally different solutions. (defun finalizer-thread-stop () #+sb-thread (let ((thread *finalizer-thread*)) diff --git a/src/code/save.lisp b/src/code/save.lisp index 64be7ac6c5..b34869f666 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -73,6 +73,10 @@ '#(sb-impl::*exit-lock* sb-thread::*make-thread-lock* sb-thread::*initial-thread* + ;; Saving *JOINABLE-THREADS* could cause catastophic failure on restart. + ;; SAVE-LISP-AND-DIE should have cleaned up, but there's a timing problem + ;; with the finalizer thread, and I'm loathe to put in a SLEEP delay. + sb-thread::*joinable-threads* sb-thread::*foreign-thread* sb-thread::*all-threads* sb-thread::*session* @@ -311,7 +315,6 @@ sufficiently motivated to do lengthy fixes." (finalizer-thread-stop) #+pauseless-threadstart (sb-thread::join-pthread-joinables #'identity) (let ((threads (sb-thread:list-all-threads))) - (when (cdr threads) ;; Despite calling FINALIZER-THREAD-STOP, an unlucky thread schedule ;; courtesy of the OS might notionally start the finalizer thread but not ;; run it until now. Suppose it barely got to its lisp trampoline, @@ -322,25 +325,27 @@ sufficiently motivated to do lengthy fixes." ;; A newly started finalizer thread can do nothing but exit immediately ;; whenever *FINALIZER-THREAD* is NIL so we don't actually care ;; what that thread is doing at this point. - (let ((finalizer (find-if (lambda (x) - (and (sb-thread::thread-%ephemeral-p x) - (string= (sb-thread:thread-name x) "finalizer"))) - threads))) - (when finalizer - (sb-thread:join-thread finalizer))) - ;; Regardless of what happened above, grab the all-threads list again. - (setq threads (sb-thread:list-all-threads))) - (let ((starting - (setq sb-thread::*starting-threads* ; ordinarily pruned in MAKE-THREAD - (delete 0 sb-thread::*starting-threads*))) - (joinable sb-thread::*joinable-threads*)) - (when (or (cdr threads) starting joinable) - (let* ((interactive (sb-thread::interactive-threads)) - (other (union (set-difference threads interactive) - (union starting joinable)))) - (error 'save-with-multiple-threads-error - :interactive-threads interactive - :other-threads other)))))) + (flet ((system-thread-p (thread) + (and (sb-thread::thread-%ephemeral-p thread) + (string= (sb-thread:thread-name thread) "finalizer")))) + (when (cdr threads) + (let ((finalizer (find-if #'system-thread-p threads))) + (when finalizer + (sb-thread:join-thread finalizer))) + ;; Regardless of what happened above, grab the all-threads list again. + (setq threads (sb-thread:list-all-threads))) + (let ((starting + (setq sb-thread::*starting-threads* ; ordinarily pruned in MAKE-THREAD + (delete 0 sb-thread::*starting-threads*))) + (joinable + (remove-if #'system-thread-p sb-thread::*joinable-threads*))) + (when (or (cdr threads) starting joinable) + (let* ((interactive (sb-thread::interactive-threads)) + (other (union (set-difference threads interactive) + (union starting joinable)))) + (error 'save-with-multiple-threads-error + :interactive-threads interactive + :other-threads other))))))) (tune-image-for-dump) (float-deinit) (profile-deinit) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 49f61f626b..4cff6d3e93 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -287,6 +287,27 @@ created and old ones may exit at any time." (sb-ext:define-load-time-global *foreign-thread* nil) (sb-ext:define-load-time-global *make-thread-lock* nil) +;;; *JOINABLE-THREADS* is a list of THREAD instances used only if #+pauseless-threadstart +;;; I had attempted to construct the list using the thread's memory to create cons +;;; cells but that turned out to be flawed- the cells must be freshly heap-allocated, +;;; because ATOMIC-POP is vulnerable to the A/B/A problem if cells are reused. +;;; Example: initial state: *JOINABLE-THREADS* -> node1 -> node2 -> node3. +;;; After reading *JOINABLE-THREADS* we want to CAS it to node2. +;;; If, after reading the variable, all of node1, node2, and node3 are popped +;;; by another thread, and then node1 is reused, and made to point to node4, +;;; then the new state is: *JOINABLE-THREADS* -> node1 -> node4 +;;; which looks like CAS(*joinable-threads*, node1, node2) should succeed, +;;; but it should not. The LL/SC model would detect that, but CAS can not. +;;; +;;; A thread is pushed into *JOINABLE-THREADS* while still using its lisp stack. +;;; This is fine, because the C code will perform a join, which will effectively +;;; wait until the lisp thread is off its stack. It won't have to wait long, +;;; because pushing into *JOINABLE-THREADS* is the last thing to happen in lisp. +;;; In theory we could support some mode of keeping the memory while joining +;;; the pthread, but we currently do not. +(sb-ext:define-load-time-global *joinable-threads* nil) +(declaim (list *joinable-threads*)) ; list of threads + ;;; Copy some slots from the C 'struct thread' into the SB-THREAD:THREAD. (defmacro copy-primitive-thread-fields (this) `(setf (thread-primitive-thread ,this) (sap-int (current-thread-sap)) @@ -306,6 +327,7 @@ created and old ones may exit at any time." ;; most especially *CURRENT-THREAD*. (init-thread-local-storage thread) (setf *initial-thread* thread) + (setf *joinable-threads* nil) #-sb-safepoint (setq *foreign-thread* (make-foreign-thread)) (grab-mutex (thread-result-lock thread)) ;; Either *all-threads* is empty or it contains exactly one thread @@ -388,27 +410,6 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (sb-ext:define-load-time-global *starting-threads* nil) (declaim (list *starting-threads*)) ; list of threads -;;; *JOINABLE-THREADS* is a list of THREAD instances used only if #+pauseless-threadstart -;;; I had attempted to construct the list using the thread's memory to create cons -;;; cells but that turned out to be flawed- the cells must be freshly heap-allocated, -;;; because ATOMIC-POP is vulnerable to the A/B/A problem if cells are reused. -;;; Example: initial state: *JOINABLE-THREADS* -> node1 -> node2 -> node3. -;;; After reading *JOINABLE-THREADS* we want to CAS it to node2. -;;; If, after reading the variable, all of node1, node2, and node3 are popped -;;; by another thread, and then node1 is reused, and made to point to node4, -;;; then the new state is: *JOINABLE-THREADS* -> node1 -> node4 -;;; which looks like CAS(*joinable-threads*, node1, node2) should succeed, -;;; but it should not. The LL/SC model would detect that, but CAS can not. -;;; -;;; A thread is pushed into *JOINABLE-THREADS* while still using its lisp stack. -;;; This is fine, because the C code will perform a join, which will effectively -;;; wait until the lisp thread is off its stack. It won't have to wait long, -;;; because pushing into *JOINABLE-THREADS* is the last thing to happen in lisp. -;;; In theory we could support some mode of keeping the memory while joining -;;; the pthread, but we currently do not. -(sb-ext:define-load-time-global *joinable-threads* nil) -(declaim (list *joinable-threads*)) ; list of threads - #+(or sb-safepoint sb-thruption) (define-alien-routine "wake_thread" int From dfb14b5602bd013d1a1460ccde8e5c8db3f616dd Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 22 Jul 2020 21:10:43 -0400 Subject: [PATCH 0282/4023] Add a fudge factor --- tests/make-thread.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/make-thread.impure.lisp b/tests/make-thread.impure.lisp index 6206513947..67c5a6f1cf 100644 --- a/tests/make-thread.impure.lisp +++ b/tests/make-thread.impure.lisp @@ -116,7 +116,7 @@ :skipped-on (or :interpreter (not :pauseless-threadstart))) (let ((list (tryit :print nil))) ;; should be not many things pointed to by the stack - (assert (< (length list) #+x86 35 ; more junk, I don't know why + (assert (< (length list) #+x86 38 ; more junk, I don't know why #+x86-64 30)) ; less junk, I don't know why ;; Either no objects are in GC generation 0, or all are, depending on ;; whether CORE_PAGE_GENERATION has been set to 0 for testing. From b69e10e0dbbd8505864ed4929f95d78c9b4005d6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 23 Jul 2020 10:19:01 -0400 Subject: [PATCH 0283/4023] Add a few news items --- NEWS | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/NEWS b/NEWS index fdb7ab9b59..600e8562ca 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,21 @@ changes relative to sbcl-2.0.6: on a string filespec prior to issuing an open() system call. * minor incompatible change: PATHNAME is no longer a STRUCTURE-OBJECT. * documentation: HASH-FUNCTION is a function designator (lp#1888028) + * bug fix: eliminated a potential garbage-collector deadlock + when linking with TCMalloc. + * bug fix: foreign threads (those not made by SB-THREAD:MAKE-THREAD) + can not crash with a "GC_PENDING, but why?" error when returning + back from Lisp into the foreign caller. + * bug fix: sb-fasteval crashed trying to install a JIT-compiled + DEFSTRUCT accessor in a locked package. + * bug fix: removed misuse of putwc() which caused stdio streams + to drop characters. + * bug fix: the "maximum interrupt nesting depth exceeded" error + generated in the C runtime is significantly less likely to occur. + * bug fix: sb-sprof should no longer segfault from calling pthread_kill() + on a nonexistent thread. + * optimization: PPC64 on linux uses the __thread annotation on C variables + in preference to pthread_setspecific() and pthread_getspecific(). changes in sbcl-2.0.6 relative to sbcl-2.0.5: * planned incompatible change: the defined symbols in the Metaobject From 82104813080422e440f1655c0d3c8807371ae83a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 24 Jul 2020 10:12:03 -0400 Subject: [PATCH 0284/4023] Prezero foreign lisp thread stacks if precise GC Also needed before enabling the MAKE-THREAD speedup on precise GC. --- src/runtime/thread.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 89cde8296c..a1b73d2ca1 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -531,13 +531,21 @@ void* new_thread_trampoline(void* arg) gc_assert(header_widetag(startup_info->header) == SIMPLE_VECTOR_WIDETAG); lispobj startfun = startup_info->data[0]; // Pinned gc_assert(functionp(startfun)); + // The lisp thread instance stores the stack end for one purpose only, for + // SB-EXT:STACK-ALLOCATED-P to quickly check whether an object is on _any_ + // thread's stack using only the all-threads tree and not acquiring a lock + // on the primitive thread. This is the exactly-calculated end. + lispthread->stack_end = (lispobj)th->control_stack_end; +#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK + // ... but GC can benefit from knowing that the _effective_ end of + // the ambiguous root range is not as high as the accessible end. // Nothing at a higher address than &arg needs to be scanned for ambiguous roots. // For x86 + linux this optimization skips over about 800 words in the stack scan, // and for x86-64 it skip about 550 words as observed via: // fprintf(stderr, "%d non-lisp stack words\n", // (int)((lispobj*)th->control_stack_end - (lispobj*)&arg)); th->control_stack_end = (lispobj*)&arg; - lispthread->stack_end = (lispobj)th->control_stack_end; +#endif th->os_kernel_tid = sb_GetTID(); init_new_thread(th, 0, 0, 0); // Passing the untagged pointer ensures 2 things: @@ -855,14 +863,14 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { * on the alignment passed from os_validate, since that might * assume the current (e.g. 4k) pagesize, while we calculate with * the biggest (e.g. 64k) pagesize allowed by the ABI. */ - boolean zeroize_stack_top = 0; + boolean zeroize_stack = 0; if (spaces) { // If reusing memory from a previously exited thread, start by removing // some old junk from the stack. This is imperfect since we only clear a little // at the top, but doing so enables diagnosing some garbage-retention issues // using a fine-toothed comb. It would not be possible at all to diagnose // if any newly started thread could refer a dead thread's heap objects. - zeroize_stack_top = 1; + zeroize_stack = 1; } else { spaces = os_validate(MOVABLE|IS_THREAD_STRUCT, NULL, THREAD_STRUCT_SIZE); if (!spaces) return NULL; @@ -909,13 +917,31 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { (lispobj*)((char*)th->control_stack_start+thread_control_stack_size); th->control_stack_end = th->binding_stack_start; - // This is a little wasteful of cycles to pre-zero the pthread overhead (which in glibc - // resides at the highest stack addresses) comprising about 5kb, below which is the lisp - // stack. We don't need to zeroize above the lisp stack end, but we don't know exactly - // where that will be. Zeroizing more than necessary is conservative, and helps ensure - // that garbage retention from reused stacks does not pose a huge problem. - if (zeroize_stack_top) + if (zeroize_stack) { +#if GENCGC_IS_PRECISE + /* Clear the entire control stack. Without this I was able to induce a GC failure + * in a test which hammered on thread creation for hours. The control stack is + * scavenged before the heap, so a stale word could point to the start (or middle) + * of an object using a bad lowtag, for whatever object formerly was there. + * Then a wrong transport function would be called and (if it worked at all) would + * place a wrongly tagged FP into a word that might not be the base of an object. + * Assume for simplicity (as is true) that stacks grow upward if GENCGC_IS_PRECISE. + * This could just call scrub_thread_control_stack but the comment there says that + * it's a lame algorithm and only mostly right - it stops after (1<<12) words + * and checks if the next is nonzero, looping again if it isn't. + * There's no reason not to be exactly right here instead of probably right */ + memset((char*)th->control_stack_start, 0, + // take off 2 pages because of the soft and hard guard pages + thread_control_stack_size - 2*os_vm_page_size); +#else + /* This is a little wasteful of cycles to pre-zero the pthread overhead (which in glibc + * resides at the highest stack addresses) comprising about 5kb, below which is the lisp + * stack. We don't need to zeroize above the lisp stack end, but we don't know exactly + * where that will be. Zeroizing more than necessary is conservative, and helps ensure + * that garbage retention from reused stacks does not pose a huge problem. */ memset((char*)th->control_stack_end - 16384, 0, 16384); +#endif + } th->control_stack_guard_page_protected = T; th->alien_stack_start= From f56b0461b2a59344e97805e7acb8cdc30e6a1af5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 24 Jul 2020 20:42:49 +0300 Subject: [PATCH 0285/4023] Fix arm64 -sb-thread. Load/store offset encoding. --- src/compiler/arm64/macros.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp index fa8861f5b7..3996db30cf 100644 --- a/src/compiler/arm64/macros.lisp +++ b/src/compiler/arm64/macros.lisp @@ -232,7 +232,7 @@ (inst add result-tn result-tn size) (inst cmp result-tn flag-tn) (inst b :hi ALLOC) - #-sb-thread (inst str result-tn (@ null-tn (- boxed-region nil-value))) + #-sb-thread (inst str result-tn (@ null-tn (load-store-offset (- boxed-region nil-value)))) #+sb-thread (storew result-tn thread-tn thread-alloc-region-slot) ;; alloc_tramp uses tmp-tn for returning the result, ;; save on a move when possible From 97667ccb7a978865edce199001f796442c65a8e9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 25 Jul 2020 17:01:33 -0400 Subject: [PATCH 0286/4023] Fix false positives from ASan and be less terse in comments --- src/runtime/thread.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index a1b73d2ca1..2792dc735a 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -526,17 +526,17 @@ void* new_thread_trampoline(void* arg) // In that structure, the STARTUP-INFO slot holds a simple-vector // which is pinned, and element 0 of the vector is also pinned. struct thread_instance *lispthread = arg; - struct thread* th = (void*)lispthread->primitive_thread; // Pinned - struct vector* startup_info = VECTOR(lispthread->startup_info); // Pinned + struct thread* th = (void*)lispthread->primitive_thread; // 'lispthread' is pinned + struct vector* startup_info = VECTOR(lispthread->startup_info); gc_assert(header_widetag(startup_info->header) == SIMPLE_VECTOR_WIDETAG); - lispobj startfun = startup_info->data[0]; // Pinned + lispobj startfun = startup_info->data[0]; // 'startup_info' is pinned gc_assert(functionp(startfun)); // The lisp thread instance stores the stack end for one purpose only, for // SB-EXT:STACK-ALLOCATED-P to quickly check whether an object is on _any_ // thread's stack using only the all-threads tree and not acquiring a lock // on the primitive thread. This is the exactly-calculated end. lispthread->stack_end = (lispobj)th->control_stack_end; -#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK +#if defined LISP_FEATURE_C_STACK_IS_CONTROL_STACK && !defined ADDRESS_SANITIZER // ... but GC can benefit from knowing that the _effective_ end of // the ambiguous root range is not as high as the accessible end. // Nothing at a higher address than &arg needs to be scanned for ambiguous roots. @@ -544,6 +544,15 @@ void* new_thread_trampoline(void* arg) // and for x86-64 it skip about 550 words as observed via: // fprintf(stderr, "%d non-lisp stack words\n", // (int)((lispobj*)th->control_stack_end - (lispobj*)&arg)); + // I'm not sure why ADDRESS_SANITIZER doesn't allow this optimization. + // Both of these assertions failed for me with the sanitizer enabled: + // gc_assert(th->control_stack_start <= (lispobj*)&arg + // && (lispobj*)&arg <= th->control_stack_end); + // gc_assert(th->control_stack_start <= (lispobj*)&startup_info + // && (lispobj*)&startup_info <= th->control_stack_end); + // It must subvert the "&" and "*" operators in a way that only it understands, + // while the stack pointer register is unperturbed. + // So why is it OK to take '&raise' in gencgc for the current thread? th->control_stack_end = (lispobj*)&arg; #endif th->os_kernel_tid = sb_GetTID(); @@ -552,7 +561,7 @@ void* new_thread_trampoline(void* arg) // - that the pinning mechanism works as designed, and not just by accident. // - that the initial stack does not contain a lisp pointer after it is not needed. // (a regression test asserts that not even a THREAD instance is on the stack) - long result = funcall1(startfun, (lispobj)lispthread); + long result = funcall1(startfun, (lispobj)lispthread); // both pinned // Close the GC region and unlink from all_threads undo_init_new_thread(th, 0); From 702c76f87fc766b2a21d59d3d430d98745a975a2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 29 Jul 2020 10:22:05 -0400 Subject: [PATCH 0287/4023] Disable :pauseless-threadstart for this release due to more frequent failures in stress tests which are mostly believed to be attributable to problems in the test. I anticipate that this will be re-enabled for the August release cycle pending ongoing investigation. --- src/cold/shared.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 9eda7ce12d..645be88a14 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -243,11 +243,11 @@ (gc (find-if (lambda (x) (member x '(:cheneygc :gencgc))) target-feature-list)) (arch (target-platform-keyword target-feature-list))) + #+nil (let ((*readtable* *xc-readtable*) (sb-xc:*features* target-feature-list)) (when (featurep '(:and :linux (:or :x86 :x86-64) :sb-thread (:not (:or :sb-safepoint :sb-thruption)))) - (format t "~&Adding :PAUSELESS-THREADSTART feature~%") (push :pauseless-threadstart target-feature-list))) (when (and (member :x86 target-feature-list) (member :int4-breakpoints target-feature-list)) From be2a3c20562d99a4aafd70a42f0ef3a2d46ca38d Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 30 Jul 2020 20:26:54 +0100 Subject: [PATCH 0288/4023] a few comment changes --- src/assembly/arm/assem-rtns.lisp | 4 ++-- src/code/defstruct.lisp | 2 +- src/code/symbol.lisp | 2 +- src/compiler/x86/parms.lisp | 2 +- src/pcl/boot.lisp | 2 +- tests/gc.impure.lisp | 13 +++++++------ tests/threads.impure.lisp | 4 ++-- 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/assembly/arm/assem-rtns.lisp b/src/assembly/arm/assem-rtns.lisp index 92e28b1a7d..5e803bf73c 100644 --- a/src/assembly/arm/assem-rtns.lisp +++ b/src/assembly/arm/assem-rtns.lisp @@ -35,7 +35,7 @@ ;; We don't need to copy stack values at this point, so default any ;; unsupplied values that should be in arg-passing registers. First - ;; piece of black magic: A computed jump. + ;; piece of deep magic: A computed jump. (inst add pc-tn pc-tn nvals) ;; Eat a word of padding for the computed jump. (inst word 0) @@ -47,7 +47,7 @@ (inst mov r2 null-tn) ;; We've defaulted any unsupplied parameters, but now we need to - ;; load the supplied parameters. Second piece of black magic: A + ;; load the supplied parameters. Second piece of deep magic: A ;; hairier computed jump. (inst rsb count nvals (fixnumize 2)) (inst add pc-tn pc-tn count) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index d237ea7d73..cdc0291a57 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -907,7 +907,7 @@ unless :NAMED is also specified."))) ;; But also, don't call SB-XC:TYPEP on a type-specifier because it does ;; not receive a type-context which specifies the proto-classoid. (when (and (typep type '(cons (eql or))) (member 'null type)) - (setq ctype *universal-type*)) ; a little white lie + (setq ctype *universal-type*)) ; a harmless lie (unless ctype (let ((context (make-type-context type proto-classoid nil))) diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index 1d1c1d1e04..b70c544079 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -207,7 +207,7 @@ distinct from the global value. Can also be SETF." #+(vop-translates cl:symbol-plist) (symbol-plist symbol) #-(vop-translates cl:symbol-plist) - (let ((list (car (truly-the list (symbol-info symbol))))) ; a white lie + (let ((list (car (truly-the list (symbol-info symbol))))) ; a harmless lie ;; Just ensure the result is not a fixnum, and we're done. (if (fixnump list) nil list))) diff --git a/src/compiler/x86/parms.lisp b/src/compiler/x86/parms.lisp index 70a268ff39..d8f2709161 100644 --- a/src/compiler/x86/parms.lisp +++ b/src/compiler/x86/parms.lisp @@ -128,7 +128,7 @@ ;;; where to put the different spaces ;;; -;;; Note: Mostly these values are black magic, inherited from CMU CL +;;; Note: Mostly these values are magic, inherited from CMU CL ;;; without any documentation. However, there were a few explanatory ;;; comments in the CMU CL sources: ;;; * On Linux, diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index 609d3b35b6..e1a56d6c2d 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -756,7 +756,7 @@ bootstrapping. ;; perhaps because of the way that STRUCTURE-OBJECT inherits ;; both from SLOT-OBJECT and from SB-KERNEL:INSTANCE. In an ;; effort to sweep such problems under the rug, we exclude these - ;; problem cases by blacklisting them here. -- WHN 2001-01-19 + ;; problem cases here. -- WHN 2001-01-19 ((eq specializer 'slot-object) (declare-type nil)) diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index 85cc98010e..d4b50e2e19 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -219,12 +219,13 @@ :skipped-on :cheneygc) ;; The interpreters (both sb-eval and sb-fasteval) special-case ;; WITH-PINNED-OBJECTS as a "special form", because the x86oid - ;; version of WITH-PINNED-OBJECTS uses black magic that isn't - ;; supportable outside of the compiler. The non-x86oid versions of - ;; WITH-PINNED-OBJECTS don't use black magic, but are overridden - ;; anyway. But the special-case logic was, historically broken, and - ;; this affects all gencgc targets (cheneygc isn't affected because - ;; cheneygc WITH-PINNED-OBJECTS devolves to WITHOUT-GC>ING). + ;; version of WITH-PINNED-OBJECTS uses special functionality that + ;; isn't supportable outside of the compiler. The non-x86oid + ;; versions of WITH-PINNED-OBJECTS don't use this special + ;; functionality, but are overridden anyway. But the special-case + ;; logic was, historically broken, and this affects all gencgc + ;; targets (cheneygc isn't affected because cheneygc + ;; WITH-PINNED-OBJECTS devolves to WITHOUT-GCING). ;; ;; Our basic approach is to allocate some kind of object and stuff ;; it where it doesn't need to be on the control stack. We then pin diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index dd0acd2c6e..76ba01376f 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -12,7 +12,7 @@ ;;;; more information. -;;;; WHITE-BOX TESTS +;;;; STRUCTURAL TESTS (shadowing-import 'assertoid:assert-error) (use-package "SB-THREAD") @@ -888,7 +888,7 @@ collect (make-thread #'subtypep-hash-cache-test))) (terpri)) -;;;; BLACK BOX TESTS +;;;; FUNCTIONAL TESTS (with-test (:name (:parallel defclass)) (write-line "WARNING, WILL HANG ON FAILURE!") From 2c0e40bad01374c4b0e1d8bd227ac550ee7023ee Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 30 Jul 2020 20:27:14 +0100 Subject: [PATCH 0289/4023] update NEWS for sbcl-2.0.7 some more --- NEWS | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 600e8562ca..36d93cb463 100644 --- a/NEWS +++ b/NEWS @@ -6,7 +6,8 @@ changes relative to sbcl-2.0.6: * minor incompatible change: OPEN no longer calls TRUENAME implicitly on a string filespec prior to issuing an open() system call. * minor incompatible change: PATHNAME is no longer a STRUCTURE-OBJECT. - * documentation: HASH-FUNCTION is a function designator (lp#1888028) + * documentation: HASH-FUNCTION is a function designator. (lp#1888028, + reported by Jacek Zlydach) * bug fix: eliminated a potential garbage-collector deadlock when linking with TCMalloc. * bug fix: foreign threads (those not made by SB-THREAD:MAKE-THREAD) @@ -20,6 +21,17 @@ changes relative to sbcl-2.0.6: generated in the C runtime is significantly less likely to occur. * bug fix: sb-sprof should no longer segfault from calling pthread_kill() on a nonexistent thread. + * bug fix: a portability issue arising from various build hosts + (lp#1886255, reported by Pierre Neidhart) + * bug fix: spurious compiler warnings from REDUCE with :INITIAL-VALUE. + (lp#1885515, reported by Michael South) + * bug fix: an inconsistency between class hierarchies and the type system + under some circumstances involving redefinition. (lp#1886397, reported by + Atilla Lendvai) + * bug fix: the USE-VALUE restart for OPEN on non-existent files is more + likely to function as expected. (lp#1886587) + * bug fix: various invalid inputs to ROTATE-BYTE no longer cause compiler + errors. (lp#1887164, lp#1888152) * optimization: PPC64 on linux uses the __thread annotation on C variables in preference to pthread_setspecific() and pthread_getspecific(). From b4cc6abdaf335cd891996e57b7e12ab328e21461 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 30 Jul 2020 20:29:55 +0100 Subject: [PATCH 0290/4023] 2.0.7: will be tagged as "sbcl-2.0.7" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 36d93cb463..19fdc55960 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.0.6: +changes in sbcl-2.0.7 relative to sbcl-2.0.6: * minor incompatible change: SB-THREAD:THREAD-OS-TID returns NIL for a thread which has exited. * minor incompatible change: OPEN no longer calls TRUENAME implicitly From ca786555e1db5b40048d03f5f97c9806090f70ce Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Wed, 22 Jul 2020 14:39:55 +0200 Subject: [PATCH 0291/4023] remove some host gensyms leaked into fasl output. --- src/code/macros.lisp | 12 ++++++------ src/compiler/typetran.lisp | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 1e692834df..adc6718427 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -346,7 +346,7 @@ evaluated as a PROGN." (prog-expansion-from-let varlist body-decls 'let*))) (sb-xc:defmacro prog1 (result &body body) - (let ((n-result (gensym))) + (let ((n-result (sb-xc:gensym))) `(let ((,n-result ,result)) (progn ,@body @@ -386,7 +386,7 @@ evaluated as a PROGN." ;; Preserve non-toplevelness of the form! (let ((car (car forms))) (if nested car `(the t ,car)))) (t - (let ((n-result (gensym))) + (let ((n-result (sb-xc:gensym))) `(let ((,n-result ,(first forms))) (if ,n-result ,n-result @@ -574,7 +574,7 @@ invoked. In that case it will store into PLACE and start over." (setf ,place (check-type-error ',place ,place ',type ,@(and type-string `(,type-string))))) - (let ((value (gensym))) + (let ((value (sb-xc:gensym))) `(do ((,value ,place ,place)) ((typep ,value ',type)) (setf ,place @@ -1555,7 +1555,7 @@ symbol-case giving up: case=((V U) (F)) (sb-xc:defmacro with-open-file ((stream filespec &rest options) &body body) (multiple-value-bind (forms decls) (parse-body body nil) - (let ((abortp (gensym))) + (let ((abortp (sb-xc:gensym))) `(let ((,stream (open ,filespec ,@options)) (,abortp t)) ,@decls @@ -1658,8 +1658,8 @@ symbol-case giving up: case=((V U) (F)) ;; since we don't want to use IGNORABLE on what might be a special ;; var. (binding* (((forms decls) (parse-body body nil)) - (n-list (gensym "N-LIST")) - (start (gensym "START")) + (n-list (sb-xc:gensym "N-LIST")) + (start (sb-xc:gensym "START")) ((clist members clist-ok) (with-current-source-form (list) (cond diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 863ee55ad2..b4d079d491 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -609,7 +609,7 @@ `(base-char-p ,object)) ((= (cdar pairs) (1- sb-xc:char-code-limit)) `(characterp ,object)))) - (let ((n-code (gensym "CODE"))) + (let ((n-code (sb-xc:gensym "CODE"))) `(and (characterp ,object) (let ((,n-code (sb-xc:char-code ,object))) (or @@ -621,7 +621,7 @@ (defun source-transform-simd-pack-typep (object type) (if (type= type (specifier-type 'simd-pack)) `(simd-pack-p ,object) - (let ((n-tag (gensym "TAG"))) + (let ((n-tag (sb-xc:gensym "TAG"))) `(and (simd-pack-p ,object) (let ((,n-tag (%simd-pack-tag ,object))) @@ -634,7 +634,7 @@ (defun source-transform-simd-pack-256-typep (object type) (if (type= type (specifier-type 'simd-pack-256)) `(simd-pack-256-p ,object) - (let ((n-tag (gensym "TAG"))) + (let ((n-tag (sb-xc:gensym "TAG"))) `(and (simd-pack-256-p ,object) (let ((,n-tag (%simd-pack-256-tag ,object))) @@ -1059,7 +1059,7 @@ (defun source-transform-typep (object type) (when (typep type 'type-specifier) (check-deprecated-type type)) - (let ((name (gensym "OBJECT"))) + (let ((name (sb-xc:gensym "OBJECT"))) (multiple-value-bind (transform error) (%source-transform-typep name type) (if error From 94b8388178aa7b607666c006b57680dd079e3255 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 1 Aug 2020 03:46:00 +0300 Subject: [PATCH 0292/4023] Always define WITH_GC_AT_SAFEPOINTS_ONLY, fewer #ifdefs --- src/runtime/interrupt.c | 6 ++---- src/runtime/thread.c | 5 +---- src/runtime/thread.h | 2 ++ src/runtime/win32-os.c | 5 ----- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 081cdd483c..8237747473 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1179,17 +1179,15 @@ interrupt_handle_now(int signal, siginfo_t *info, os_context_t *context) * be available; should we copy it or was nobody using it anyway?) * then we should convert this to return-elsewhere */ -#ifndef LISP_FEATURE_SB_SAFEPOINT +#if !defined(LISP_FEATURE_SB_SAFEPOINT) && defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) /* Leave deferrable signals blocked, the handler itself will * allow signals again when it sees fit. */ -#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK /* handler.lisp will hide from the GC, will be enabled in the handler itself. * Not a problem for the conservative GC. */ unblock_gc_signals(); #endif -#else + WITH_GC_AT_SAFEPOINTS_ONLY() -#endif { // the block is needed for WITH_GC_AT_SAFEPOINTS_ONLY() to work DX_ALLOC_SAP(context_sap, context); DX_ALLOC_SAP(info_sap, info); diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 2792dc735a..81e5132a52 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -779,9 +779,8 @@ callback_wrapper_trampoline( if (!th) { /* callback invoked in non-lisp thread */ init_thread_data scribble; attach_os_thread(&scribble); -#ifdef LISP_FEATURE_SB_SAFEPOINT + WITH_GC_AT_SAFEPOINTS_ONLY() -#endif { funcall3(StaticSymbolFunction(ENTER_FOREIGN_CALLBACK), arg0,arg1,arg2); } @@ -794,9 +793,7 @@ callback_wrapper_trampoline( th->carried_base_pointer = (os_context_register_t) *(((void**)arg2)-1); #endif -#ifdef LISP_FEATURE_SB_SAFEPOINT WITH_GC_AT_SAFEPOINTS_ONLY() -#endif { #if defined(LISP_FEATURE_X86_64) && !defined(LISP_FEATURE_WIN32) funcall_alien_callback(arg1, arg2, arg0, th); diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 972c00b7f4..3523faa9a5 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -374,6 +374,8 @@ void signal_handler_callback(lispobj, int, void *, void *); #endif +#define WITH_GC_AT_SAFEPOINTS_ONLY() + extern void create_main_lisp_thread(lispobj); #ifdef LISP_FEATURE_SB_THREAD diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 964386baa9..454df81522 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -60,11 +60,6 @@ #include "thread.h" #include "align.h" -#ifndef LISP_FEATURE_SB_THREAD -/* dummy definition to reduce ifdef clutter */ -#define WITH_GC_AT_SAFEPOINTS_ONLY() if (0) ; else -#endif - #include "gc.h" #include "gencgc-internal.h" #include From 88b78955789537f17228ba5d24bb5aaab9c6928d Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 1 Aug 2020 03:50:19 +0300 Subject: [PATCH 0293/4023] Don't include utsname.h socket.h everywhere. --- src/runtime/arm-bsd-os.c | 3 --- src/runtime/arm-linux-os.c | 2 -- src/runtime/arm64-bsd-os.c | 2 -- src/runtime/arm64-linux-os.c | 2 -- src/runtime/linux-os.c | 2 -- src/runtime/ppc-linux-os.c | 2 -- src/runtime/riscv-linux-os.c | 2 -- src/runtime/sparc-bsd-os.c | 2 -- src/runtime/sparc-linux-os.c | 2 -- src/runtime/sparc-sunos-os.c | 2 -- src/runtime/sunos-os.c | 1 - src/runtime/x86-64-linux-os.c | 2 -- src/runtime/x86-linux-os.c | 2 -- src/runtime/x86-sunos-os.c | 2 -- 14 files changed, 28 deletions(-) diff --git a/src/runtime/arm-bsd-os.c b/src/runtime/arm-bsd-os.c index 9444b0e455..c2deb419f9 100644 --- a/src/runtime/arm-bsd-os.c +++ b/src/runtime/arm-bsd-os.c @@ -25,9 +25,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include -#include #include #include diff --git a/src/runtime/arm-linux-os.c b/src/runtime/arm-linux-os.c index 1baffa5d48..9ed989b5ec 100644 --- a/src/runtime/arm-linux-os.c +++ b/src/runtime/arm-linux-os.c @@ -25,8 +25,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/arm64-bsd-os.c b/src/runtime/arm64-bsd-os.c index 479ad18a5e..1b027853ea 100644 --- a/src/runtime/arm64-bsd-os.c +++ b/src/runtime/arm64-bsd-os.c @@ -25,8 +25,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/arm64-linux-os.c b/src/runtime/arm64-linux-os.c index d063a98f40..f16c707418 100644 --- a/src/runtime/arm64-linux-os.c +++ b/src/runtime/arm64-linux-os.c @@ -25,8 +25,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 70cdc1e4f1..4db91810fd 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -35,8 +35,6 @@ #include "genesis/static-symbols.h" #include "genesis/fdefn.h" -#include -#include #include #include diff --git a/src/runtime/ppc-linux-os.c b/src/runtime/ppc-linux-os.c index 1d26cc36e0..74109c93cd 100644 --- a/src/runtime/ppc-linux-os.c +++ b/src/runtime/ppc-linux-os.c @@ -26,8 +26,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/riscv-linux-os.c b/src/runtime/riscv-linux-os.c index 3c93dea5f9..ce61657387 100644 --- a/src/runtime/riscv-linux-os.c +++ b/src/runtime/riscv-linux-os.c @@ -26,8 +26,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/sparc-bsd-os.c b/src/runtime/sparc-bsd-os.c index 3d21d9f803..834fe16644 100644 --- a/src/runtime/sparc-bsd-os.c +++ b/src/runtime/sparc-bsd-os.c @@ -25,8 +25,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/sparc-linux-os.c b/src/runtime/sparc-linux-os.c index 3b8d41ebd4..d33f65d7a8 100644 --- a/src/runtime/sparc-linux-os.c +++ b/src/runtime/sparc-linux-os.c @@ -25,8 +25,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/sparc-sunos-os.c b/src/runtime/sparc-sunos-os.c index fc76ee7931..1c5d095960 100644 --- a/src/runtime/sparc-sunos-os.c +++ b/src/runtime/sparc-sunos-os.c @@ -25,8 +25,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c index 09d3ab3b03..688e6471ff 100644 --- a/src/runtime/sunos-os.c +++ b/src/runtime/sunos-os.c @@ -6,7 +6,6 @@ #include #include #include -#include #include "sbcl.h" #include "os.h" diff --git a/src/runtime/x86-64-linux-os.c b/src/runtime/x86-64-linux-os.c index e55ebe21b0..1cc89b672c 100644 --- a/src/runtime/x86-64-linux-os.c +++ b/src/runtime/x86-64-linux-os.c @@ -34,8 +34,6 @@ #include "interr.h" #include "lispregs.h" #include "sbcl.h" -#include -#include #include #include diff --git a/src/runtime/x86-linux-os.c b/src/runtime/x86-linux-os.c index 047249b3c7..01a4f8fa7e 100644 --- a/src/runtime/x86-linux-os.c +++ b/src/runtime/x86-linux-os.c @@ -30,8 +30,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include diff --git a/src/runtime/x86-sunos-os.c b/src/runtime/x86-sunos-os.c index a37bd89aba..ba6cc1ee37 100644 --- a/src/runtime/x86-sunos-os.c +++ b/src/runtime/x86-sunos-os.c @@ -9,8 +9,6 @@ #include "interrupt.h" #include "interr.h" #include "lispregs.h" -#include -#include #include #include From 87491b496111281f255532d330b45057433e69f3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 1 Aug 2020 19:01:59 +0300 Subject: [PATCH 0294/4023] Fix back-propagate-one-dx-lvar around cycles with no dx-lvars. Need to ignore such blocks. Fixes lp#1889393 --- src/compiler/stack.lisp | 3 ++- tests/dynamic-extent.impure.lisp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/compiler/stack.lisp b/src/compiler/stack.lisp index 43216c39e3..03de33c0ad 100644 --- a/src/compiler/stack.lisp +++ b/src/compiler/stack.lisp @@ -148,7 +148,8 @@ t) ((eq (block-flag current-block) flag) t) - ((eq (block-flag current-block) cycle)) + ((eq (block-flag current-block) cycle) + nil) ;; Don't go back past START-BLOCK. ((not (eq current-block start-block)) (setf (block-flag current-block) cycle) diff --git a/tests/dynamic-extent.impure.lisp b/tests/dynamic-extent.impure.lisp index bc1603a420..f13d1f791a 100644 --- a/tests/dynamic-extent.impure.lisp +++ b/tests/dynamic-extent.impure.lisp @@ -1587,3 +1587,15 @@ (assert-no-consing (with-output-to-string (*standard-output* s) (write-char #\x))))) + +(with-test (:name :cycles-without-dx-lvars) + (checked-compile-and-assert + () + `(lambda (f x z) + (let ((l (if x + (loop while z) + (list (list 1))))) + (declare (dynamic-extent l)) + (funcall f l))) + (((lambda (l) (equal l '((1)))) nil nil) t) + (((lambda (l) (equal l nil)) t nil) t))) From 9122ba575277a68114150daa7a7d6c92abf5ed9b Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 1 Aug 2020 19:03:04 +0300 Subject: [PATCH 0295/4023] More opaquely-quote. --- src/compiler/stack.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/stack.lisp b/src/compiler/stack.lisp index 03de33c0ad..800748b2b0 100644 --- a/src/compiler/stack.lisp +++ b/src/compiler/stack.lisp @@ -438,7 +438,7 @@ for lvar in after-stack unless (memq lvar before-stack) do (cleanup-code - `(%dummy-dx-alloc ',lvar ',previous-lvar))))) + `(%dummy-dx-alloc ,(opaquely-quote lvar) ,(opaquely-quote previous-lvar)))))) (let* ((end-stack (ir2-block-end-stack (block-info block1))) (start-stack (ir2-block-start-stack (block-info block2))) (pruned-start-stack (ordered-list-intersection From 6541db7843a810a6af5f73c4968923bda4ede512 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 1 Aug 2020 19:22:50 +0300 Subject: [PATCH 0296/4023] Fix COUNT type derivation. Ignore unknown dimension array types in sequence-lvar-dimensions. Fixes lp#1889391 --- src/compiler/knownfun.lisp | 9 ++++----- tests/compiler-2.pure.lisp | 7 +++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index a87cd33d46..dc6bdc7bcd 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -427,12 +427,11 @@ (process-dim (array-type-dimensions type)))) (t (return '*)))) (process-dim (dim) - (let ((length (car dim))) - (if (and (singleton-p dim) - (integerp length)) + (if (typep dim '(cons integer null)) + (let ((length (car dim))) (setf max (max max length) - min (min min length)) - (return '*))))) + min (min min length))) + (return '*)))) ;; If type derivation were able to notice that non-simple arrays can ;; be mutated (changing the type), we could safely use LVAR-TYPE on ;; any vector type. But it doesn't notice. diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index e60afd72bd..769efb5205 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -2931,3 +2931,10 @@ ((t nil) nil) ((nil t) nil) ((nil nil) nil))) + +(with-test (:name :sequence-lvar-dimensions-on-arrays) + (checked-compile-and-assert + () + `(lambda (x a) + (count a (make-string x :initial-element a))) + ((10 #\a) 10))) From bf07def12cc4a0644b3fd626eebe0d364b0a43e8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 1 Aug 2020 19:28:07 +0300 Subject: [PATCH 0297/4023] Fix VECTOR-LENGTH transform. Don't fail on *-dimensioned arrays. Fixes lp#1888919 --- src/compiler/array-tran.lisp | 9 ++++----- tests/compiler-2.pure.lisp | 6 ++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index bc352796a5..2b929b4652 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -1359,12 +1359,11 @@ ;;; compile-time constant. (deftransform vector-length ((vector)) (let* ((vtype (lvar-type vector)) - (dim (first (array-type-dimensions-or-give-up vtype)))) - (when (eq dim '*) + (dim (array-type-dimensions-or-give-up vtype))) + (when (or (not (typep dim '(cons integer))) + (conservative-array-type-complexp vtype)) (give-up-ir1-transform)) - (when (conservative-array-type-complexp vtype) - (give-up-ir1-transform)) - dim)) + (first dim))) (defoptimizer (vector-length derive-type) ((vector)) (let ((array-type (lvar-conservative-type vector)) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 769efb5205..33eb5ca19b 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -2938,3 +2938,9 @@ `(lambda (x a) (count a (make-string x :initial-element a))) ((10 #\a) 10))) + +(with-test (:name :length-transform-on-arrays) + (checked-compile-and-assert + () + `(lambda () (length (make-sequence '(string *) 10 :initial-element #\a))) + (() 10))) From fc5dfc64faa2308a0d501e3c33bf34804c141dd1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 1 Aug 2020 19:58:29 +0300 Subject: [PATCH 0298/4023] Ignore types when in constant-fold-call-p. constant-lvar-p punts on type mismatches due to bad interactions with other transforms, but constant folding doesn't mind bad or unknown types. Without that some constant calls may find their way into VOPs, which do not like when all arguments are constant. Fixes lp#1888384 --- src/compiler/ir1opt.lisp | 17 ++++++++++++++--- tests/compiler-2.pure.lisp | 8 +++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 6987e9722f..71488104bc 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -38,6 +38,17 @@ ;; check for EQL types and singleton numeric types (values (type-singleton-p type)))))) +(defun constant-lvar-ignore-types-p (thing) + (declare (type (or lvar null) thing)) + (and (lvar-p thing) + (let* ((type (lvar-type thing)) + (principal-lvar (principal-lvar thing)) + (principal-use (lvar-uses principal-lvar))) + (or (and (ref-p principal-use) + (constant-p (ref-leaf principal-use))) + ;; check for EQL types and singleton numeric types + (values (type-singleton-p type)))))) + ;;; Are all the uses constant? (defun constant-lvar-uses-p (thing) (declare (type (or lvar null) thing)) @@ -1684,11 +1695,11 @@ (declare (ignore type lvars)) (unless (if (eql (car annotation) 'function-designator) (let ((fun (or (lvar-fun-name arg t) - (and (constant-lvar-p arg) + (and (constant-lvar-ignore-types-p arg) (lvar-value arg))))) (and fun (constant-fold-arg-p fun))) - (constant-lvar-p arg)) + (constant-lvar-ignore-types-p arg)) (return-from constant-fold-call-p))) combination info @@ -1696,7 +1707,7 @@ (return-from constant-fold-call-p))) t) (t - (every #'constant-lvar-p args))))) + (every #'constant-lvar-ignore-types-p args))))) ;;; Replace a call to a foldable function of constant arguments with ;;; the result of evaluating the form. If there is an error during the diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 33eb5ca19b..962fd16fc5 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -2943,4 +2943,10 @@ (checked-compile-and-assert () `(lambda () (length (make-sequence '(string *) 10 :initial-element #\a))) - (() 10))) + (() 10))) + +(with-test (:name :constant-fold-unknown-types) + (checked-compile-and-assert + (:allow-style-warnings t) + `(lambda () + (oddp (the (or a b) -1))))) From 72c783a2ffa31f264c2b13d816a8673fcb0e8633 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 1 Aug 2020 20:01:50 +0300 Subject: [PATCH 0299/4023] Protect find/position transforms against improper lists. Fixes lp#1887316 --- src/compiler/seqtran.lisp | 2 ++ tests/bad-code.pure.lisp | 28 ++++++++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index cfe7440da3..9868696636 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -2192,6 +2192,8 @@ key test test-not) (t (or list vector) &rest t)) (when (and (constant-lvar-p sequence) + (or (proper-sequence-p (lvar-value sequence)) + (give-up-ir1-transform)) (zerop (length (lvar-value sequence)))) (if (and test test-not) ;; even though one kwd arg could legit be NIL, it's not interesting. diff --git a/tests/bad-code.pure.lisp b/tests/bad-code.pure.lisp index 1a7951f586..15f1dd4809 100644 --- a/tests/bad-code.pure.lisp +++ b/tests/bad-code.pure.lisp @@ -430,19 +430,27 @@ (search '(a . b) x)) :allow-warnings t)))) +(with-test (:name :improper-list.3) + (assert (nth-value 1 + (checked-compile + '(lambda () + (let ((x '(1 2 . 3))) + (position c x))) + :allow-warnings t)))) + (with-test (:name :call-nil) (checked-compile-and-assert - () - `(lambda () - (funcall nil)) - (() (condition 'undefined-function))) + () + `(lambda () + (funcall nil)) + (() (condition 'undefined-function))) (checked-compile-and-assert - () - `(lambda (x) - (if x - 10 - (funcall x))) - ((nil) (condition 'undefined-function)))) + () + `(lambda (x) + (if x + 10 + (funcall x))) + ((nil) (condition 'undefined-function)))) (with-test (:name (:valid-callable-argument :toplevel-xep)) (assert (nth-value 2 (checked-compile `(lambda (l) (find-if (lambda ()) l)) From 0b857644bdc47a804a269a82fdd39adb4a0313fe Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Sat, 1 Aug 2020 21:49:54 +0100 Subject: [PATCH 0300/4023] fix a NEWS spelling error --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 19fdc55960..ca42e3c827 100644 --- a/NEWS +++ b/NEWS @@ -22,7 +22,7 @@ changes in sbcl-2.0.7 relative to sbcl-2.0.6: * bug fix: sb-sprof should no longer segfault from calling pthread_kill() on a nonexistent thread. * bug fix: a portability issue arising from various build hosts - (lp#1886255, reported by Pierre Neidhart) + (lp#1886255, reported by Pierre Neidhardt) * bug fix: spurious compiler warnings from REDUCE with :INITIAL-VALUE. (lp#1885515, reported by Michael South) * bug fix: an inconsistency between class hierarchies and the type system From 21a778b481f9b9041f71953fbdc84bd3c39a8fa6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 3 Aug 2020 15:20:28 -0400 Subject: [PATCH 0301/4023] Name some things --- src/code/target-package.lisp | 3 +++ src/code/target-thread.lisp | 2 +- src/compiler/globaldb.lisp | 5 ++++- tests/test-util.lisp | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index aea38c64a6..f5de6b740f 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -1855,6 +1855,9 @@ PACKAGE." (cons (make-info-hashtable :comparator #'pkg-name= :hash-function #'sxhash) 1)) + (setf (sb-thread:mutex-name (info-env-mutex *package-names*)) "package names" + (sb-thread:mutex-name (info-env-mutex (car *package-nickname-ids*))) + "package nicknames") (with-package-names (names) (dolist (spec *!initial-symbols*) (let ((pkg (car spec)) (symbols (cdr spec))) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 4cff6d3e93..a3d6373aec 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1367,7 +1367,7 @@ on this semaphore, then N of them is woken up." ;; the various operations on a session though. (threads nil) (interactive-threads nil) - (interactive-threads-queue (make-waitqueue))) + (interactive-threads-queue (make-waitqueue :name "session"))) (declaim (sb-ext:freeze-type session)) (defvar *session* nil) diff --git a/src/compiler/globaldb.lisp b/src/compiler/globaldb.lisp index 0af79b02c0..5846a09d37 100644 --- a/src/compiler/globaldb.lisp +++ b/src/compiler/globaldb.lisp @@ -198,7 +198,10 @@ ;; from keyword-pair to object is deferred until cold-init. (dovector (x (the simple-vector *info-types*)) (when x (!register-meta-info x))) - #-sb-xc-host (setq *info-environment* (make-info-hashtable))) + #-sb-xc-host + (let ((h (make-info-hashtable))) + (setf (sb-thread:mutex-name (info-env-mutex h)) "globaldb") + (setq *info-environment* h))) ;;;; GET-INFO-VALUE diff --git a/tests/test-util.lisp b/tests/test-util.lisp index c39ddf36c3..3aa913474d 100644 --- a/tests/test-util.lisp +++ b/tests/test-util.lisp @@ -192,7 +192,7 @@ ;;; Like RUN-TEST but do not perform any of the automated thread management. ;;; Since multiple threads are executing tests, there is no reason to kill ;;; unrecognized threads. -(sb-ext:define-load-time-global *output-mutex* (sb-thread:make-mutex)) +(sb-ext:define-load-time-global *output-mutex* (sb-thread:make-mutex :name "run-tests output")) (defun run-test-concurrently (test-spec) (destructuring-bind (test-body . name) test-spec (sb-thread:with-mutex (*output-mutex*) From de5163a73314a7fc413a5bd56500757f910bed08 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 3 Aug 2020 16:19:06 -0400 Subject: [PATCH 0302/4023] Reduce a test's flakiness a thousandfold It still makes assumptions that the specified timeouts cause threads to proceed in lockstep, but the failure rate is much more tolerable. --- src/runtime/linux-os.c | 99 ++++++++++++++++++ tests/deadline.impure.lisp | 207 +++++++++++++++++++++++++++++++++++++ tests/threads.impure.lisp | 64 ------------ 3 files changed, 306 insertions(+), 64 deletions(-) diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 4db91810fd..490b996de1 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -67,6 +67,93 @@ int personality (unsigned long); #include #include +#ifdef MUTEX_EVENTRECORDING +#include "genesis/mutex.h" +#define MAXEVENTS 200 +static struct { + struct thread* th; + struct timespec ts; + char *label; + char *mutex_name; + sword_t timeout; +} events[MAXEVENTS]; +static int record_mutex_events; +static int eventcount; + +void lisp_mutex_event(char *string) { + if (record_mutex_events) { + int id = __sync_fetch_and_add(&eventcount, 1); + if (id >= MAXEVENTS) lose("event buffer overflow"); + clock_gettime(CLOCK_REALTIME, &events[id].ts); + events[id].th = current_thread; + events[id].label = string; + events[id].mutex_name = 0; + events[id].timeout = -1; + } +} +void lisp_mutex_event1(char *string, char *string2) { + if (record_mutex_events) { + int id = __sync_fetch_and_add(&eventcount, 1); + if (id >= MAXEVENTS) lose("event buffer overflow"); + clock_gettime(CLOCK_REALTIME, &events[id].ts); + events[id].th = current_thread; + events[id].label = string; + events[id].mutex_name = string2; + events[id].timeout = -1; + } +} +void lisp_mutex_event2(char *string, char *string2, uword_t usec) { + if (record_mutex_events) { + int id = __sync_fetch_and_add(&eventcount, 1); + if (id >= MAXEVENTS) lose("event buffer overflow"); + clock_gettime(CLOCK_REALTIME, &events[id].ts); + events[id].th = current_thread; + events[id].label = string; + events[id].mutex_name = string2; + events[id].timeout = usec; + } +} +void lisp_mutex_start_eventrecording() { + eventcount = 0; + record_mutex_events = 1; +} +void lisp_mutex_done_eventrecording() { + record_mutex_events = 0; + int i; + fprintf(stderr, "event log:\n"); + struct timespec basetime = events[0].ts; + for(i=0; ilisp_thread); + struct timespec rel_time = events[i].ts; + rel_time.tv_sec -= basetime.tv_sec; + rel_time.tv_nsec -= basetime.tv_nsec; + if (rel_time.tv_nsec<0) rel_time.tv_nsec += 1000 * 1000 * 1000, rel_time.tv_sec--; + lispobj threadname = ti->name; + if (events[i].timeout >= 0) // must also have mutex_name in this case + fprintf(stderr, "[%d.%09ld] %s: %s '%s' timeout %ld\n", + (int)rel_time.tv_sec, rel_time.tv_nsec, + (char*)VECTOR(threadname)->data, + events[i].label, events[i].mutex_name, events[i].timeout); + else if (events[i].mutex_name) + fprintf(stderr, "[%d.%09ld] %s: %s '%s'\n", + (int)rel_time.tv_sec, rel_time.tv_nsec, + (char*)VECTOR(threadname)->data, + events[i].label, events[i].mutex_name); + else + fprintf(stderr, "[%d.%09ld] %s: %s\n", + (int)rel_time.tv_sec, rel_time.tv_nsec, + (char*)VECTOR(threadname)->data, + events[i].label); + } + fprintf(stderr, "-----\n"); +} +#else +#define lisp_mutex_event(x) +#define lisp_mutex_event1(x,y) +#define lisp_mutex_event2(x,y,z) +#endif + /* values taken from the kernel's linux/futex.h. This header file doesn't exist in userspace, which is our excuse for not grovelling them automatically */ @@ -136,14 +223,21 @@ futex_wait(int *lock_word, int oldval, long sec, unsigned long usec) struct timespec timeout; int t; +#ifdef MUTEX_EVENTRECORDING + struct mutex* m = (void*)((char*)lock_word - offsetof(struct mutex,state)); + char *name = m->name != NIL ? (char*)VECTOR(m->name)->data : "(unnamed)"; +#endif if (sec<0) { + lisp_mutex_event1("start futex wait", name); t = sys_futex(lock_word, futex_wait_op(), oldval, 0); } else { timeout.tv_sec = sec; timeout.tv_nsec = usec * 1000; + lisp_mutex_event2("start futex timedwait", name, usec); t = sys_futex(lock_word, futex_wait_op(), oldval, &timeout); } + lisp_mutex_event1("back from sys_futex", name); if (t==0) return 0; else if (errno==ETIMEDOUT) @@ -158,6 +252,11 @@ futex_wait(int *lock_word, int oldval, long sec, unsigned long usec) int futex_wake(int *lock_word, int n) { +#ifdef MUTEX_EVENTRECORDING + struct mutex* m = (void*)((char*)lock_word - offsetof(struct mutex,state)); + char *name = m->name != NIL ? (char*)VECTOR(m->name)->data : "(unnamed)"; + lisp_mutex_event1("waking futex", name); +#endif return sys_futex(lock_word, futex_wake_op(),n,0); } #endif diff --git a/tests/deadline.impure.lisp b/tests/deadline.impure.lisp index d03506d487..1294b81a23 100644 --- a/tests/deadline.impure.lisp +++ b/tests/deadline.impure.lisp @@ -190,3 +190,210 @@ (sb-sys:cancel-deadline condition)))) (sb-sys:with-deadline (:seconds .1) (sleep 1))) sb-sys:deadline-timeout)) + +(defmacro timestamp (string &optional mutex) + (declare (ignorable string mutex)) + #+nil + `(let ((s ,string)) + (sb-sys:with-pinned-objects (s) + ,(if mutex + `(alien-funcall (extern-alien "lisp_mutex_event1" (function void system-area-pointer system-area-pointer)) + (sb-sys:vector-sap s) + (sb-sys:vector-sap (or (mutex-name ,mutex) "unnamed"))) + `(alien-funcall (extern-alien "lisp_mutex_event" (function void system-area-pointer)) + (sb-sys:vector-sap s)))))) + +;;; I observed (at least) four different ways this next test can flake: +;;; +;;; 1. one of the first CONDITION-WAITs at the initial deadline can be spuriously woken. +;;; This is easy to see: +;;; Thread A Thread B +;;; -------- -------- +;;; mutex.acquire +;;; cv.wait +;;; set wakeup token +;;; mutex.release +;;; mutex.acquire +;;; cv.wait +;;; set wakeup token +;;; mutex.release +;;; sys_futex +;;; sys_futex +;;; (* no waiting - "wrong" token *) +;;; So this causes the (:UNKNOWN :UNKNOWN) result for one thread, +;;; because it never enters its deadline handler and because the customary +;;; ("obligatory" one might say) loop around condition-wait is absent. +;;; This is so common that it is no longer considered a failure. +;;; +;;; 2. one of the threads could be scheduled entirely before the other- +;;; that is, it runs from start to finish before the other thread does anything. +;;; This causes them both to conclude they acquired the mutex, +;;; though the deadline handlers were completely nonoverlapping. +;;; +;;; 3. one of the calls to SYS_futex with a timeout can wait significantly more than +;;; requested. This essentially reduces to case 2 but in a more convoluted way, +;;; which I've somewhat mitigated this by scaling up the timeouts so that we're +;;; not skating at the edge of the granularity the system is willing to give you. +;;; This mode of flakiness is likely to happen on a cloud compute environment. +;;; +;;; 4. the deadline handler can be invoked twice in one thread because +;;; - I don't know why. +;;; +;;; Here's an example with MUTEX_EVENTRECORDING #defined that was +;;; considered a "failure": +;;; [0.000000000] main thread: try-mutex: acquired 'Make-Thread Lock' +;;; [0.000038478] main thread: released 'Make-Thread Lock' +;;; [0.000053675] main thread: try-mutex: acquired 'Make-Thread Lock' +;;; [0.000068255] main thread: released 'Make-Thread Lock' +;;; [0.000069415] main thread: try-mutex: acquired 'gate sem mutex' +;;; [0.000069781] main thread: released 'gate sem mutex' +;;; [0.000071536] main thread: start futex wait 'thread result lock' +;;; [0.000094761] B: try-mutex: acquired 'gate sem mutex' +;;; [0.000095494] B: released 'gate sem mutex' +;;; [0.000096646] B: deadline established +;;; [0.000097026] B: try-mutex: acquired 'testmut' +;;; [0.000097931] B: released 'testmut' +;;; [0.000098251] B: start futex timedwait 'testcv' timeout 300000 +;;; [0.300161614] B: back from sys_futex 'testcv' +;;; [0.300163763] B: try-mutex: acquired 'testmut' +;;; [0.300172833] B: enter deadline handler +;;; [0.300173184] B: start sleep +;;; [0.601937423] A: try-mutex: acquired 'gate sem mutex' +;;; [0.601940795] A: released 'gate sem mutex' +;;; [0.601945635] A: deadline established +;;; [0.601952083] A: start futex timedwait 'testmut' timeout 300000 +;;; [0.900264670] B: end sleep +;;; [0.900266124] B: waking futex 'testcv' +;;; [0.900280645] B: waking futex 'testmut' +;;; [0.900285623] B: released 'testmut' +;;; [0.900290563] B: try-mutex: acquired 'thread interruptions lock' +;;; [0.900290777] B: released 'thread interruptions lock' +;;; [0.900292127] B: try-mutex: acquired 'session lock' +;;; [0.900293214] B: released 'session lock' +;;; [0.900293703] B: released 'thread result lock' +;;; [0.900294381] A: back from sys_futex 'testmut' +;;; [0.900296267] A: %wait-for-mutex: acquired 'testmut' +;;; [0.900299208] A: waking futex 'testmut' +;;; [0.900300544] A: released 'testmut' +;;; [0.900301101] A: start futex timedwait 'testcv' timeout 1000 +;;; [0.901358710] A: back from sys_futex 'testcv' +;;; [0.901359680] A: try-mutex: acquired 'testmut' +;;; [0.901369935] A: enter deadline handler +;;; [0.901370203] A: start sleep +;;; [1.501418757] A: end sleep +;;; [1.501419570] A: waking futex 'testcv' +;;; [1.501456896] A: released 'testmut' +;;; [1.501460896] A: try-mutex: acquired 'thread interruptions lock' +;;; [1.501461171] A: released 'thread interruptions lock' +;;; [1.501462039] A: try-mutex: acquired 'session lock' +;;; [1.501463001] A: released 'session lock' +;;; [1.501463544] A: waking futex 'thread result lock' +;;; [1.501465881] A: released 'thread result lock' +;;; [1.501474477] main thread: back from sys_futex 'thread result lock' +;;; [1.501476447] main thread: %wait-for-mutex: acquired 'thread result lock' +;;; [1.501477283] main thread: waking futex 'thread result lock' +;;; [1.501478429] main thread: released 'thread result lock' +;;; [1.501479467] main thread: try-mutex: acquired 'thread result lock' +;;; [1.501479600] main thread: released 'thread result lock' +;;; +;;; Basically I give up trying to fix this test any more. +(defun signal-dealine-check-interrupt-enablement () + (let ((mutex (sb-thread:make-mutex :name "testmut")) + (waitq (sb-thread:make-waitqueue :name "testcv")) + (A-holds? :unknown) + (B-holds? :unknown) + (A-interrupts-enabled? :unknown) + (B-interrupts-enabled? :unknown) + (gate (sb-thread:make-semaphore :name "testsem")) + (initial-deadline .3) + (sleep-amount .6) + (A) + (B)) + ;; The gate semaphore is just a half-assed attempt to trigger both worker threads + ;; to start running their bodies at the exact same time. If they don't do that, + ;; then it's entirely possible that one thread gets run start to finish before + ;; the other thread does anything at all. So obviously the test will fail. + (setf (sb-kernel:%instance-ref gate 0) "gate sem") ; FIXME: we claim that NAME is SETFable + (let ((m (sb-thread::semaphore-mutex gate))) + (setf (sb-thread:mutex-name m) "gate sem mutex")) + (let ((cv (sb-thread::semaphore-queue gate))) + (setf (sb-thread:waitqueue-name cv) "gate sem cv")) + #+nil (alien-funcall (extern-alien "lisp_mutex_start_eventrecording" (function void))) + (setq A (sb-thread:make-thread + (lambda () + (sb-thread:wait-on-semaphore gate) + (handler-bind + ((sb-sys:deadline-timeout + (lambda (c) + (timestamp "enter deadline handler") + ;; We came here through the call to DECODE-TIMEOUT + ;; in CONDITION-WAIT; hence both here are supposed + ;; to evaluate to T. + (setq A-holds? (sb-thread:holding-mutex-p mutex)) + (setq A-interrupts-enabled? + sb-sys:*interrupts-enabled*) + (timestamp "start sleep") + (sleep sleep-amount) + (timestamp "end sleep") + (sb-thread:condition-broadcast waitq) + (sb-sys:defer-deadline 10.0 c) + (timestamp "leave deadline handler")))) + (sb-sys:with-deadline (:seconds initial-deadline) + (timestamp "deadline established") + (sb-thread:with-mutex (mutex) + (sb-thread:condition-wait waitq mutex))))) + :name "A")) + (setq B (sb-thread:make-thread + (lambda () + (sb-thread:wait-on-semaphore gate) + (handler-bind + ((sb-sys:deadline-timeout + (lambda (c) + (timestamp "enter deadline handler") + ;; We came here through the call to DECODE-TIMEOUT + ;; in CONDITION-WAIT (contended case of + ;; reaquiring the mutex) - so the former will + ;; be NIL, but interrupts should still be enabled. + (setq B-holds? (sb-thread:holding-mutex-p mutex)) + (setq B-interrupts-enabled? + sb-sys:*interrupts-enabled*) + (timestamp "start sleep") + (sleep sleep-amount) + (timestamp "end sleep") + (sb-thread:condition-broadcast waitq) + (sb-sys:defer-deadline 10.0 c) + (timestamp "leave deadline handler")))) + (sb-sys:with-deadline (:seconds initial-deadline) + (timestamp "deadline established") + (sb-thread:with-mutex (mutex) + (sb-thread:condition-wait waitq mutex))))) + :name "B")) + (sb-thread:signal-semaphore gate 3) + (sb-thread:join-thread A) + (sb-thread:join-thread B) + #+nil (alien-funcall (extern-alien "lisp_mutex_done_eventrecording" (function void))) + (let ((A-result (list A-holds? A-interrupts-enabled?)) + (B-result (list B-holds? B-interrupts-enabled?))) + ;; We also check some subtle behaviour w.r.t. whether a deadline + ;; handler in CONDITION-WAIT got the mutex, or not. This is most + ;; probably very internal behaviour (so user should not depend + ;; on it) -- I added the testing here just to manifest current + ;; behaviour. + (cond ((equal A-result '(t t)) + (or (equal B-result '(nil t)) + (equal B-result '(:unknown :unknown)) + (error "thread B result: ~s" B-result))) + ((equal B-result '(t t)) + (or (equal A-result '(nil t)) + (equal A-result '(:unknown :unknown)) + (error "thread A result: ~s" A-result))) + (t + (error "Failure: fell through with A: ~S, B: ~S" + A-result + B-result)))))) + +;;; Test from git rev 5e55f426de8fa579a0d6cfbfb3ac5433d530d3c9 formerly in threads.impure +(test-util:with-test (:name (:deadline :interrupts-enabled) :skipped-on (:not :sb-thread)) + ;; I cranked this up to 1000 (and ran it on lots of machines) to get examples of failure, + ;; but that's more than a reasonable amount of time to spend in the test. + (loop repeat 2 do (signal-dealine-check-interrupt-enablement))) diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 76ba01376f..80128239df 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -777,70 +777,6 @@ (mapc #'join-thread threads) (assert (not deadline-handler-run-twice?)))) -(with-test (:name (condition-wait :signal-deadline-with-interrupts-enabled)) - (let ((mutex (make-mutex)) - (waitq (make-waitqueue)) - (A-holds? :unknown) - (B-holds? :unknown) - (A-interrupts-enabled? :unknown) - (B-interrupts-enabled? :unknown) - (A) - (B)) - ;; W.L.O.G., we assume that A is executed first... - (setq A (make-thread - (lambda () - (handler-bind - ((sb-sys:deadline-timeout - (lambda (c) - ;; We came here through the call to DECODE-TIMEOUT - ;; in CONDITION-WAIT; hence both here are supposed - ;; to evaluate to T. - (setq A-holds? (holding-mutex-p mutex)) - (setq A-interrupts-enabled? - sb-sys:*interrupts-enabled*) - (sleep 0.2) - (condition-broadcast waitq) - (sb-sys:defer-deadline 10.0 c)))) - (sb-sys:with-deadline (:seconds 0.1) - (with-mutex (mutex) - (condition-wait waitq mutex))))) - :name "A")) - (setq B (make-thread - (lambda () - (thread-yield) - (handler-bind - ((sb-sys:deadline-timeout - (lambda (c) - ;; We came here through the call to DECODE-TIMEOUT - ;; in CONDITION-WAIT (contended case of - ;; reaquiring the mutex) - so the former will - ;; be NIL, but interrupts should still be enabled. - (setq B-holds? (holding-mutex-p mutex)) - (setq B-interrupts-enabled? - sb-sys:*interrupts-enabled*) - (sleep 0.2) - (condition-broadcast waitq) - (sb-sys:defer-deadline 10.0 c)))) - (sb-sys:with-deadline (:seconds 0.1) - (with-mutex (mutex) - (condition-wait waitq mutex))))) - :name "B")) - (join-thread A) - (join-thread B) - (let ((A-result (list A-holds? A-interrupts-enabled?)) - (B-result (list B-holds? B-interrupts-enabled?))) - ;; We also check some subtle behaviour w.r.t. whether a deadline - ;; handler in CONDITION-WAIT got the mutex, or not. This is most - ;; probably very internal behaviour (so user should not depend - ;; on it) -- I added the testing here just to manifest current - ;; behaviour. - (cond ((equal A-result '(t t)) (assert (equal B-result '(nil t)))) - ((equal B-result '(t t)) (assert (equal A-result '(nil t)))) - (t - (error "Failure: fell through wit A: ~S, B: ~S" - A-result - B-result)))))) - (with-test (:name (:mutex :finalization)) (let ((a nil)) (dotimes (i 500000) From 0397803967328a5ab279fa5f2f86c622a1c51a03 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 3 Aug 2020 17:52:15 -0400 Subject: [PATCH 0303/4023] Unbreak test for #-compact-instance-header --- tests/deadline.impure.lisp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/deadline.impure.lisp b/tests/deadline.impure.lisp index 1294b81a23..e797d9123c 100644 --- a/tests/deadline.impure.lisp +++ b/tests/deadline.impure.lisp @@ -313,7 +313,6 @@ ;; to start running their bodies at the exact same time. If they don't do that, ;; then it's entirely possible that one thread gets run start to finish before ;; the other thread does anything at all. So obviously the test will fail. - (setf (sb-kernel:%instance-ref gate 0) "gate sem") ; FIXME: we claim that NAME is SETFable (let ((m (sb-thread::semaphore-mutex gate))) (setf (sb-thread:mutex-name m) "gate sem mutex")) (let ((cv (sb-thread::semaphore-queue gate))) From 85af6a0d925c134f877de0c87dc47f121edff6d1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 3 Aug 2020 18:18:00 -0400 Subject: [PATCH 0304/4023] Remove semaphore-name slot Just use the name slot in the mutex (and waitqueue) --- src/code/target-thread.lisp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index a3d6373aec..a76a36948c 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1185,24 +1185,30 @@ must be held by this thread during this call." ;;;; Semaphores (defstruct (semaphore (:copier nil) - (:constructor make-semaphore - (&key name ((:count %count) 0)))) + (:constructor %make-semaphore (%count mutex queue))) "Semaphore type. The fact that a SEMAPHORE is a STRUCTURE-OBJECT should be considered an implementation detail, and may change in the future." - (name nil :type (or null string) :read-only t) + ;; We have two NAME slots to play with - no need for another in this object. (%count 0 :type (integer 0)) (waitcount 0 :type sb-vm:word) - (mutex (make-mutex :name "semaphore lock") :read-only t - :type mutex) - (queue (make-waitqueue) :read-only t - :type waitqueue)) + (mutex nil :read-only t :type mutex) + (queue nil :read-only t :type waitqueue)) (declaim (sb-ext:freeze-type semaphore)) -(setf (documentation 'semaphore-name 'function) - "The name of the semaphore INSTANCE. Setfable." - (documentation 'make-semaphore 'function) - "Create a semaphore with the supplied COUNT and NAME.") +(defun make-semaphore (&key name (count 0)) + "Create a semaphore with the supplied COUNT and NAME." + (declare (inline make-mutex make-waitqueue)) + (%make-semaphore count + (make-mutex :name name) + (make-waitqueue :name name))) + +(defun semaphore-name (semaphore) + "The name of the semaphore INSTANCE. Setfable." + (waitqueue-name (semaphore-queue semaphore))) + +(defun (setf semaphore-name) (newval semaphore) + (setf (waitqueue-name (semaphore-queue semaphore)) newval)) (defstruct (semaphore-notification (:constructor make-semaphore-notification ()) (:copier nil)) @@ -2022,9 +2028,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (define-alien-routine ("create_thread" %create-thread) unsigned (lisp-fun-address unsigned)) (defun start-thread (thread function arguments) - (declare (inline make-semaphore - make-waitqueue - make-mutex)) (let* ((setup-sem (make-semaphore :name "Thread setup semaphore")) #+(or win32 darwin) (fp-modes (dpb 0 sb-vm:float-sticky-bits ;; clear accrued bits From 4a453191746e0dfc8a8fab3ae71087c0010d0cc1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 3 Aug 2020 21:12:20 -0400 Subject: [PATCH 0305/4023] Optionally skip %EXIT-OTHER-THREADS in exit For eons, some local tests have been randomly locking up while flushing logs after claiming that "all tests ran" and having notified the test runner of status. This never bothered me enough to look into it. But now, because :PAUSELESS-THREADSTART exacerbated the problem sufficiently to warrant examination, I found the bug - SB-EXT:EXIT calls INTERRUPT-THREAD. Who'd have thought a builtin function might do something so ill-advised? I can't see how this hasn't caused complaints. One guess is that users realize that EXIT does this, and ensured that all their background threads were completely idle either before calling EXIT, or in *EXIT-HOOKS*. Essentially the fix is to not interrupt, and to let them finish. So, set SB-EXT:*FORCIBLY-TERMINATE-THREADS-ON-EXIT* to NIL (opposite of the default) to get proper behavior. Otherwise, get the status quo behavior. https://knowyourmeme.com/memes/kanye-interrupts-imma-let-you-finish --- package-data-list.lisp-expr | 1 + src/code/target-thread.lisp | 4 +- src/code/thread.lisp | 2 + src/code/toplevel.lisp | 135 +++++++++++++++++++++++++++++++++- tests/fcb-threads.c | 36 +++++++++ tests/fcb-threads.impure.lisp | 47 ++++++++++++ 6 files changed, 223 insertions(+), 2 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 5d007ff6f6..399ce2f838 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -736,6 +736,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*." ;; Hooks into init & save sequences "*INIT-HOOKS*" "*SAVE-HOOKS*" "*EXIT-HOOKS*" + "*FORCIBLY-TERMINATE-THREADS-ON-EXIT*" ;; Controlling exiting other threads. "*EXIT-TIMEOUT*" diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index a76a36948c..cc50d7fd8d 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -285,7 +285,6 @@ created and old ones may exit at any time." ;;; Always keep one preallocated foreign thread instance so that a non-lisp thread ;;; doesn't need to cons anything prior to release of the all_threads lock. (sb-ext:define-load-time-global *foreign-thread* nil) -(sb-ext:define-load-time-global *make-thread-lock* nil) ;;; *JOINABLE-THREADS* is a list of THREAD instances used only if #+pauseless-threadstart ;;; I had attempted to construct the list using the thread's memory to create cons @@ -1552,6 +1551,8 @@ on this semaphore, then N of them is woken up." ;; Need to defer till others have joined, because when main ;; thread exits, we're gone. Can't use TERMINATE-THREAD -- would ;; get the exit code wrong. + ;; This isn't a problem if *forcibly-terminate-threads-on-exit* is NIL - + ;; the thread that calls EXIT provides the exit code. It's that simple. (when main (handler-case (interrupt-thread @@ -1566,6 +1567,7 @@ on this semaphore, then N of them is woken up." ;; to calling OS-EXIT. (join-thread main :default t :timeout (time-left))))))) +;;; Pretty much don't use this. It has the same problems as %EXIT-OTHER-THREADS. (defun terminate-session () "Kill all threads in session except for this one. Does nothing if current thread is not the foreground thread." diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 16e7f2e8e3..0291c809b4 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -254,3 +254,5 @@ held mutex, WITH-RECURSIVE-LOCK allows recursive lock attempts to succeed." (funcall function)) (when got-it (release-mutex lock))))))) + +(sb-ext:define-load-time-global *make-thread-lock* nil) diff --git a/src/code/toplevel.lisp b/src/code/toplevel.lisp index 15d9f1a583..198311ed79 100644 --- a/src/code/toplevel.lisp +++ b/src/code/toplevel.lisp @@ -77,6 +77,71 @@ means to wait indefinitely.") (handler-bind ((serious-condition *exit-error-handler*)) (call-hooks "exit" *exit-hooks* :on-error :warn))) +;;; TERMINATE-THREAD as it exists is basically unsuitable for anything other than +;;; interactive use, because it uses INTERRUPT-THREAD to unwind through user code. +;;; It is only slightly ok to call INTERRUPT-THREAD on a thread when you know +;;; exactly what it is doing. But even if you know what it's doing, you don't know +;;; when, so even if it's your code, it might be calling an alien destructor. +;;; It says right in the docstring of INTERRUPT-THREAD not to call it, +;;; and then what do we do? We go full steam ahead and call it. +;;; https://www.dictionary.com/e/slang/i-cant-even/ +;;; +;;; The full story here is that some users seem to think that EXIT is responsible +;;; for stopping any threads. There was a not-insignificant amount of discussion +;;; in https://groups.google.com/g/sbcl-devel/c/6Xj_d1dM1k0/m/G9OPAbOueDsJ +;;; But the mechanism employed for %EXIT-OTHER-THREADS is TERMINATE-THREAD, +;;; and that's just horrible. No matter how well the SBCL code is constructed, +;;; this approach can cause lockup. +;;; +;;; The *EXIT-HOOKS* are fine, but we can't assume that users call JOIN-THREAD in +;;; the exit hooks - they might ask threads to stop by assigning a global polled +;;; flag or by CONDITION-BROADCAST. They may do nothing. It's arbitrary. +;;; So maybe the threads are stopping "peacefully" and would finish on their own +;;; and we {could,should} just call JOIN-THREAD on them. But there's no way to know. +;;; Instead we just abort random threads with INTERRUPT-THREAD. +;;; Some of those threads that we forcibly terminate might have already been +;;; halfway through cleanly unwinding, which very possibly (or even likely) +;;; involves calling free() to release resources. When we interrupt a thread +;;; in the midst of its voluntary call to free(), no matter how clever free() is, +;;; we can presume that it will acquire a global lock. +;;; +;;; And there you have it - some dead thread owned a global lock that can't become +;;; available because we just punched that thread in the guts and killed it. +;;; Hence *all* threads (including non-Lisp) are permanently stuck waiting on +;;; a lock that is not owned by any running thread. +;;; +;;; I tried to remedy this by having the SIGPIPE signal handler silently discard +;;; a signal if interrupted at a non-Lisp program counter, but that presumes the +;;; call stack is never Lisp -> C -> Lisp, which first of all means that the handler +;;; needs to be entirely in C (if called from TERMINATE-THREAD) and secondly requires +;;; TERMINATE-THREAD to keep trying to send a signal if it thinks the signal was dropped. +;;; And you can't figure out whether a signal got purposely discard because then you'd +;;; need to wait an arbitrary amount of time to decide whether it might have been. +;;; Or invent a synchronized technique to see whether the asynchronous mechanism worked. +;;; +;;; So then the solution occurred to me: +;;; --> just don't terminate threads by force. Problem solved. <-- +;;; +;;; Therefore, if you want EXIT to be as near to the C exit() call as possible, +;;; after doing the lisp exit hooks, just set this global flag to NIL. +;;; Or leave it as T if you're fine with the old lockup-prone behavior. +;;; +;;; And if you think it's up to the Lisp environment to try to make threads stop +;;; by hook or by crook as a precondition to calling OS-EXIT (with which I disagree), +;;; the right solution is possibly modeled on pthread_cancel() which has specified +;;; cancelation points (system and C library calls) which check for cancelation, +;;; perform whatever cleanups were pushed by pthread_cleanup_push() and then stop. +;;; +;;; P.S. To see that #+sb-thruption is no magic fix - suppose you have a stack +;;; with Lisp -> C -> -> Lisp where C acquired a resource and the currently +;;; top-of-stack Lisp function took a safepoint trap. It would be fine if all it +;;; wanted to do was GC, but is not safe in general. +;;; Hence #+sb-thruption paints a dangerously attractive veneer over an unsafe +;;; concept, making it more subtly bad instead of very obviously bad. +;;; +;;; So this is a bad default. Bad bad bad. But it's backward-compatible. +(define-load-time-global *forcibly-terminate-threads-on-exit* t) + (defun %exit () ;; If anything goes wrong, we will exit immediately and forcibly. (handler-bind ((serious-condition *exit-error-handler*)) @@ -89,7 +154,11 @@ means to wait indefinitely.") (unwind-protect (progn (flush-standard-output-streams) - (sb-thread::%exit-other-threads) + (if *forcibly-terminate-threads-on-exit* + (sb-thread::%exit-other-threads) + (with-deadline (:seconds nil :override t) + (sb-impl::finalizer-thread-stop) + (sb-thread:grab-mutex sb-thread::*make-thread-lock*))) (setf ok t)) (os-exit code :abort (not ok))))))) @@ -652,3 +721,67 @@ that provides the REPL for the system. Assumes that *STANDARD-INPUT* and ;;; a convenient way to get into the assembly-level debugger (defun %halt () (%primitive sb-c:halt)) + + +;;;; Examples of why NEVER NEVER NEVER to call TERMINATE-THREAD in production. + +#| +Example 1. Stuck somewhere in free() and in JOIN-THREAD. +[stuck at https://github.com/google/tcmalloc/blob/master/tcmalloc/cpu_cache.cc#L204] + Thread "A": + 0x98e697c [AbslInternalSpinLockDelay] + 0x9898287 [tcmalloc::CPUCache::UpdateCapacity(int, unsigned long, unsigned long, bool, tcmalloc::CPUCache::ObjectClass*, unsigned long*)] + 0x9898b38 [tcmalloc::CPUCache::Overflow(void*, unsigned long, int)] + 0x9891f39 [(anonymous namespace)::do_free_no_hooks(void*)] + 0x988cea1 [MallocBlock::ProcessFreeQueue(MallocBlock*, unsigned long, int)] + 0x26f490a [CFFI::FOREIGN-ARRAY-FREE] + Thread "main thread": + 0x9877f23 [futex_wait] + 0x32f32c8 [(FLET SB-UNIX::BODY :IN SB-THREAD::FUTEX-WAIT)] + 0x32f301f [SB-THREAD::%%WAIT-FOR-MUTEX] + 0x2f97f5d [SB-THREAD::%WAIT-FOR-MUTEX] + 0x2f287be [SB-THREAD::JOIN-THREAD] + +Example 2. Stuck somewhere else in free() and in JOIN-THREAD. + Thread "A": + 0x7f657d1a7cb9 [syscall] + 0x98e697c [AbslInternalSpinLockDelay] + 0x995e9e7 [absl::base_internal::SpinLock::SlowLock()] + 0x988d63b [MallocBlock::CheckAndClear(int)] + 0x9a8511f [__libc_free] + 0x26f490a [CFFI::FOREIGN-ARRAY-FREE] + Thread "main thread": + 0x9877f23 [futex_wait] + 0x32f32c8 [(FLET SB-UNIX::BODY :IN SB-THREAD::FUTEX-WAIT)] + 0x32f301f [SB-THREAD::%%WAIT-FOR-MUTEX] + 0x2f97f5d [SB-THREAD::%WAIT-FOR-MUTEX] + 0x2f287be [SB-THREAD::JOIN-THREAD] + +Example 3. main thread stuck in a C library exit handler: + 0x98e697c [AbslInternalSpinLockDelay] + 0x995e9e7 [absl::base_internal::SpinLock::SlowLock()] + 0x98a43cf [tcmalloc::HugePageAwareAllocator::LockAndAlloc(unsigned long, bool*)] + 0x98a423f [tcmalloc::HugePageAwareAllocator::New(unsigned long)] + 0x9896ee8 [tcmalloc::CentralFreeList::Populate()] + 0x9896c69 [tcmalloc::CentralFreeList::RemoveRange(void**, int)] + 0x9897e74 [tcmalloc::CPUCache::Refill(int, unsigned long)] + 0x989221b [tcmalloc::dbg_do_malloc(unsigned long, unsigned long*)] + 0x9a85045 [__libc_malloc] + 0x7f25a8ad5772 [__run_exit_handlers] + 0x7f25a8ad57c5 [exit] + 0x2fa99a3 [SB-SYS::OS-EXIT] + +Example 4. main thread stuck in a different C library exit handler: + 0x992ecfe [absl::synchronization_internal::Waiter::Wait(absl::synchronization_internal::KernelTimeout)] + 0x98e6865 [AbslInternalPerThreadSemWait] + 0x992fd4d [absl::Mutex::Block(absl::base_internal::PerThreadSynch*)] + 0x99324a0 [absl::Mutex::LockSlowLoop(absl::SynchWaitParams*, int)] + 0x9930b0e [absl::Mutex::LockSlow(absl::MuHowS const*, absl::Condition const*, int)] + 0x9930346 [absl::Mutex::Lock()] + 0x97ca6c0 [thread::local::internal::Var::~Var()] + 0x7fcf3fde0772 [__run_exit_handlers] + 0x7fcf3fde07c5 [exit] + 0x2fa99a3 [SB-SYS::OS-EXIT] + +There are plenty more where those came from. +|# diff --git a/tests/fcb-threads.c b/tests/fcb-threads.c index b930a40d11..f8d53d42be 100644 --- a/tests/fcb-threads.c +++ b/tests/fcb-threads.c @@ -39,3 +39,39 @@ int call_thing_from_threads(void* ptr, int n_threads, int n_calls) } return 0; } + +/// The code following is for the no-lockup-on-exit test, unrelated to the above + +#include +#include +#include + +static pthread_mutex_t some_global_lock = PTHREAD_MUTEX_INITIALIZER; + +void acquire_a_global_lock() { + pthread_mutex_lock(&some_global_lock); +} +void release_a_global_lock() { + pthread_mutex_unlock(&some_global_lock); +} +static void alarmclock_expired(int sig) +{ + char msg[] = "timed out\n"; + write(2, msg, sizeof msg-1); + _exit(1); +} + +/// Exit with failure if we can't exit within a set time. +void prepare_exit_test(int seconds) +{ + struct sigaction sa; + sa.sa_handler = alarmclock_expired; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sigaction(SIGALRM, &sa, 0); + struct itimerval it; + it.it_value.tv_sec = seconds; + it.it_value.tv_usec = 0; + it.it_interval.tv_sec = it.it_interval.tv_usec = 0; + setitimer(ITIMER_REAL, &it, 0); +} diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 8d740305b3..8201b36a3d 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -120,3 +120,50 @@ (with-test (:name :try-join-foreign-thread) (assert (eq (tryjoiner) 'ok))) + +;;; Final test: EXIT does not lock up due to (simulated) C++ destructors +;;; or free() or most anything else involved in stopping the main thread. +;;; The point of the test is to mock a Lisp thread that uses foreign code +;;; that uses malloc and free or equivalent from C++. +;;; The behavior being tested is the effect of SB-THREAD:ABORT-THREAD on +;;; a thread that happened to be just at that moment in the foreign code. +;;; We can't - or don't need to - exactly replicate the behavior +;;; of doing a lot of memory allocation. All we need to demonstrate is +;;; that we won't interrupt a malloc() or free(). +(defglobal *should-i-keep-going* t) +(defun mess-around-with-foreign-calls () + ;; In reality the thread would not permanently own the lock, but this is the + ;; simplest way to simulate the random occurrence that it does own the lock + ;; exactly when terminated. + ;; So make it own the lock forever unless politely (i.e. not forcibly) terminated. + (alien-funcall (extern-alien "acquire_a_global_lock" (function void))) + (loop (sb-thread:barrier (:read)) + (unless *should-i-keep-going* (return)) + (sleep .75)) + (format *error-output* "~&Worker thread politely exiting~%") + (alien-funcall (extern-alien "release_a_global_lock" (function void)))) + +(sb-thread:make-thread #'mess-around-with-foreign-calls) + +(push (compile nil + '(lambda () + (format t "~&Invoked exit hook~%") + (setq *should-i-keep-going* nil))) + *exit-hooks*) + +;;; The actual code under test involved C++ destructors that are +;;; interposed between our call to OS-EXIT and the OS call per se. +;;; Acquiring a globally shared mutex in OS-EXIT simulates that. +(sb-int:encapsulate + 'sb-sys:os-exit + 'simulate-c++-destructors + (lambda (realfun code &key abort) + (format t "~&Enter OS-EXIT ~s ~s~%" code abort) + (alien-funcall (extern-alien "acquire_a_global_lock" (function void))) + (alien-funcall (extern-alien "release_a_global_lock" (function void))) + (funcall realfun code :abort abort))) + +;;; Give ourselves 3 seconds to exit. +(alien-funcall (extern-alien "prepare_exit_test" (function void int)) 3) +(setq sb-ext:*forcibly-terminate-threads-on-exit* nil) +(exit :code 104) From 7f5e99e2663301b6673764b48dfd345b26f658ee Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 4 Aug 2020 00:00:12 -0400 Subject: [PATCH 0306/4023] Less confusing low-level error messages Don't say "tid" for pthread ID. On linux, use the actual tid though. --- src/runtime/interr.c | 5 +---- src/runtime/interrupt.c | 8 ++++---- src/runtime/thread.c | 2 +- src/runtime/thread.h | 12 ++++++++++++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/runtime/interr.c b/src/runtime/interr.c index d34bb4d75d..ed4d587ef7 100644 --- a/src/runtime/interr.c +++ b/src/runtime/interr.c @@ -99,10 +99,7 @@ void disable_lossage_handler(void) static void print_message(char *fmt, va_list ap) { - fprintf(stderr, " in SBCL pid %d",getpid()); -#if defined(LISP_FEATURE_SB_THREAD) - fprintf(stderr, "(tid %p)", (void*)thread_self()); -#endif + fprintf(stderr, " in SBCL pid %d" THREAD_ID_LABEL, getpid(), THREAD_ID_VALUE); if (fmt) { fprintf(stderr, ":\n"); vfprintf(stderr, fmt, ap); diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 8237747473..5b772316a4 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -2117,15 +2117,15 @@ lisp_memory_fault_error(os_context_t *context, os_vm_address_t addr) unsigned int offset = code ? pc - (char*)code : 0; if (offset) corruption_warning_and_maybe_lose( - "Memory fault at %p (pc=%p [code %p+0x%X ID 0x%x], fp=%p, sp=%p) tid %#lx", + "Memory fault at %p (pc=%p [code %p+0x%X ID 0x%x], fp=%p, sp=%p)" THREAD_ID_LABEL, addr, pc, code, offset, code_serialno(code), os_context_frame_pointer(context), - *os_context_sp_addr(context), thread_self()); // = 0 if -sb-thread + *os_context_sp_addr(context), THREAD_ID_VALUE); else corruption_warning_and_maybe_lose( - "Memory fault at %p (pc=%p, fp=%p, sp=%p) tid %#lx", + "Memory fault at %p (pc=%p, fp=%p, sp=%p)" THREAD_ID_LABEL, addr, pc, os_context_frame_pointer(context), - *os_context_sp_addr(context), thread_self()); // = 0 if -sb-thread + *os_context_sp_addr(context), THREAD_ID_VALUE); #else corruption_warning_and_maybe_lose("Memory fault at %p (pc=%p)", addr, *os_context_pc_addr(context)); diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 81e5132a52..4074a0d513 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -193,7 +193,7 @@ wait_for_thread_state_change(struct thread *thread, lispobj state) #ifdef __linux__ // gettid() was added in glibc 2.30 but we support older glibc -static int sb_GetTID() { return syscall(SYS_gettid); } +int sb_GetTID() { return syscall(SYS_gettid); } #else #define sb_GetTID() 0 #endif diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 3523faa9a5..b6152439ac 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -382,4 +382,16 @@ extern void create_main_lisp_thread(lispobj); extern pthread_mutex_t all_threads_lock; #endif +#ifndef LISP_FEATURE_SB_THREAD +# define THREAD_ID_LABEL "" +# define THREAD_ID_VALUE 0 +#elif defined __linux__ +extern int sb_GetTID(); +# define THREAD_ID_LABEL " tid %d" +# define THREAD_ID_VALUE (sb_GetTID()) +#else +# define THREAD_ID_LABEL " pthread %p" +# define THREAD_ID_VALUE ((void*)thread_self()) +#endif + #endif /* _INCLUDE_THREAD_H_ */ From 191c943145a7dd9dde5096f26e2d62644c8f66ff Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 4 Aug 2020 11:28:25 -0400 Subject: [PATCH 0307/4023] Avoid per-file changes in SB-XC:*FEATURES* Too confusing with the various compilation modes --- src/code/target-thread.lisp | 3 --- src/cold/shared.lisp | 2 ++ src/cold/shebang.lisp | 6 ++++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index cc50d7fd8d..86715cbf03 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -23,9 +23,6 @@ with-session-lock with-spinlock)) -(eval-when (:compile-toplevel :load-toplevel) - #+(and sb-thread sb-futex linux) (pushnew :futex-use-tid sb-xc:*features*)) - #+linux (defmacro my-kernel-thread-id () `(sb-ext:truly-the diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 645be88a14..6dc3444551 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -243,6 +243,8 @@ (gc (find-if (lambda (x) (member x '(:cheneygc :gencgc))) target-feature-list)) (arch (target-platform-keyword target-feature-list))) + (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) + (pushnew :futex-use-tid target-feature-list)) #+nil (let ((*readtable* *xc-readtable*) (sb-xc:*features* target-feature-list)) diff --git a/src/cold/shebang.lisp b/src/cold/shebang.lisp index 37f1be5c2d..4731db6a57 100644 --- a/src/cold/shebang.lisp +++ b/src/cold/shebang.lisp @@ -88,13 +88,15 @@ ;;; We should never call this with a selector of :HOST any more, ;;; but I'm keeping it in case of emergency. -(defun featurep (feature &aux (list sb-xc:*features*)) +;;; SB-XC:*FEATURES* might not be bound yet when computing derived features. +(defun featurep (feature &optional (list sb-xc:*features*)) (etypecase feature (symbol (if (string= feature "SBCL") (error "Testing SBCL as a target feature is obviously bogus") (member feature list :test #'eq))) - (cons (flet ((subfeature-in-list-p (subfeature) (featurep subfeature))) + (cons (flet ((subfeature-in-list-p (subfeature) + (featurep subfeature list))) (ecase (first feature) (:or (some #'subfeature-in-list-p (rest feature))) (:and (every #'subfeature-in-list-p (rest feature))) From 8d87a9a36391c2c7027af69a935ad1b8a11aebf8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 4 Aug 2020 12:03:22 -0400 Subject: [PATCH 0308/4023] Delete some symbols from internal-features --- make-target-2-load.lisp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index 9d5fe4e9f3..822f834528 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -9,12 +9,24 @@ ;;; Remove symbols from CL:*FEATURES* that should not be exposed to users. (export 'sb-impl::+internal-features+ 'sb-impl) (let* ((non-target-features + ;; + ;; FIXME: I suspect that this list should be changed to its inverse- + ;; features that _SHOULD_ go into SB-IMPL:+INTERNAL-FEATURES+ and + ;; comments about the reasoning behind each, rather than features to + ;; discard and reasons they're not needed. The default assumption should be + ;; to drop any build-time feature that lacks a rationale to preserve it. + ;; '(;; :SB-AFTER-XC-CORE is essentially an option flag to make-host-2 :SB-AFTER-XC-CORE ;; CONS-PROFILING sets the initial compiler policy which persists ;; into the default baseline policy. It has no relevance post-build ;; in as much as policy can be changed later arbitrarily. :CONS-PROFILING + ;; Used by nothing after compiling 'target-thread' + :SB-FUTEX :FUTEX-USE-TID + ;; These affect the BREAK instruction emitter, but the C code is able + ;; to handle anything, and post-build we don't care which it is. + :UD2-BREAKPOINTS :INT4-BREAKPOINTS ;; Uses of OS-PROVIDES-DLOPEN and -DLADDR are confined to src/code/foreign.lisp :OS-PROVIDES-DLOPEN :OS-PROVIDES-DLADDR ;; more-or-less confined to serve-event, except for a test which now From 01b544892ad6258508a0ddf13a3d81d3a7bc7d93 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 4 Aug 2020 12:21:45 -0400 Subject: [PATCH 0309/4023] Simplify JOIN-THREAD Use a semaphore, not a mutex. It would have been slightly less overhead as a condition variable, but it is easier to have WAIT-ON-SEMAPHORE deal with the :TIMEOUT arg. Its %CONDITION-WAIT knows to loop and shorten the time. --- src/code/target-thread.lisp | 142 +++++++++++------------------------ src/code/thread-structs.lisp | 51 +++++++++++-- 2 files changed, 88 insertions(+), 105 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 86715cbf03..1017e56ee7 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -317,7 +317,8 @@ created and old ones may exit at any time." ;;; the global mutexes but not all of them? (setf sb-impl::*exit-lock* (make-mutex :name "Exit Lock") *make-thread-lock* (make-mutex :name "Make-Thread Lock")) - (let ((thread (%make-thread "main thread" nil))) + (let* ((name "main thread") + (thread (%make-thread name nil (make-semaphore :name name)))) (copy-primitive-thread-fields thread) ;; Run the macro-generated function which writes some values into the TLS, ;; most especially *CURRENT-THREAD*. @@ -325,7 +326,6 @@ created and old ones may exit at any time." (setf *initial-thread* thread) (setf *joinable-threads* nil) #-sb-safepoint (setq *foreign-thread* (make-foreign-thread)) - (grab-mutex (thread-result-lock thread)) ;; Either *all-threads* is empty or it contains exactly one thread ;; in case we are in reinit since saving core with multiple ;; threads doesn't work. @@ -494,32 +494,6 @@ HOLDING-MUTEX-P." (sb-ext:define-load-time-global **deadlock-lock** nil) -#+(or (not sb-thread) sb-futex) -(defstruct (waitqueue (:copier nil) (:constructor make-waitqueue (&key name))) - "Waitqueue type." - #+(and sb-thread sb-futex) - (token 0 - ;; actually 32-bits, but it needs to be a raw slot and we don't have - ;; 32-bit raw slots on 64-bit machines. - #+futex-use-tid :type #+futex-use-tid sb-ext:word) - ;; If adding slots between TOKEN and NAME, please see futex_name() in linux_os.c - ;; which attempts to divine a string from a futex word address. - (name nil :type (or null string))) - -#+(and sb-thread (not sb-futex)) -(defstruct (waitqueue (:copier nil) (:constructor make-waitqueue (&key name))) - "Waitqueue type." - (name nil :type (or null string)) - ;; For WITH-CAS-LOCK: because CONDITION-WAIT must be able to call - ;; %WAITQUEUE-WAKEUP without re-aquiring the mutex, we need a separate - ;; lock. In most cases this should be uncontested thanks to the mutex -- - ;; the only case where that might not be true is when CONDITION-WAIT - ;; unwinds and %WAITQUEUE-DROP is called. - %owner - %head - %tail) -(declaim (sb-ext:freeze-type waitqueue)) - ;;; Signals an error if owner of LOCK is waiting on a lock whose release ;;; depends on the current thread. Does not detect deadlocks from sempahores. (defun check-deadlock () @@ -1180,18 +1154,6 @@ must be held by this thread during this call." ;;;; Semaphores -(defstruct (semaphore (:copier nil) - (:constructor %make-semaphore (%count mutex queue))) - "Semaphore type. The fact that a SEMAPHORE is a STRUCTURE-OBJECT -should be considered an implementation detail, and may change in the -future." - ;; We have two NAME slots to play with - no need for another in this object. - (%count 0 :type (integer 0)) - (waitcount 0 :type sb-vm:word) - (mutex nil :read-only t :type mutex) - (queue nil :read-only t :type waitqueue)) -(declaim (sb-ext:freeze-type semaphore)) - (defun make-semaphore (&key name (count 0)) "Create a semaphore with the supplied COUNT and NAME." (declare (inline make-mutex make-waitqueue)) @@ -1454,23 +1416,30 @@ on this semaphore, then N of them is woken up." (when *exit-in-process* (%exit)) ;; Lisp-side cleanup - (let ((thread *current-thread*)) + (let* ((thread *current-thread*) + (sem (thread-semaphore thread))) ;; This AVER failed when I messed up deletion from *STARTING-THREADS*. ;; That in turn caused a failure in GC because a fixnum is not a legal value ;; for the startup info when observed by GC. #+pauseless-threadstart (aver (not (memq thread *starting-threads*))) - ;; Stash the primitive thread SAP for reuse, but clobber the slot. - ;; This makes ALIVE-P return NIL. + ;; Stash the primitive thread SAP for reuse, but clobber the PRIMITIVE-THREAD + ;; slot which makes ALIVE-P return NIL. + ;; A minor TODO: can this lock acquire/release be moved to where we actually + ;; unmap the memory an do a pthread_join()? I would think so, because until then, + ;; there is no real harm in reading the memory. In this state the pthread library + ;; will usually return ESRCH if you try to use the pthread id - it's a valid + ;; pointer, but it knows that it has no underlying OS thread. (with-interruptions-lock (thread) - (when (thread-result-lock thread) ; ordinary lisp thread, not FOREIGN-THREAD + (when sem ; ordinary lisp thread, not FOREIGN-THREAD (setf (thread-startup-info thread) ; use the "funny fixnum" representation (%make-lisp-obj (thread-primitive-thread thread)))) - ;; The memory range can exist without a pthread running yet, but the pthread - ;; can't exist without the memory range. By clobbering this SAP here, - ;; it is safe to manipulate the memory and/or the pthread from another thread - ;; that acquires the interruptions lock if the SAP reads as nonzero. (setf (thread-primitive-thread thread) 0) (barrier (:write))) + (when sem + (setf (thread-semaphore thread) nil) ; nobody needs to wait on it now + ;; We could increment by most-positive-fixnum, but that might just encourage + ;; bad usage (more than one attempted joiner) + (signal-semaphore sem)) ;; After making the thread dead, remove from session. If this were done first, ;; we'd just waste time moving the thread into SESSION-THREADS (if it wasn't there) ;; only to remove it right away. @@ -1478,7 +1447,7 @@ on this semaphore, then N of them is woken up." (%delete-thread-from-session thread)) (cond #+pauseless-threadstart ; If possible, logically remove from *ALL-THREADS* - ((thread-result-lock thread) + (sem ;; Tree pruning is the responsibility of thread creators, not dying threads. ;; Creators have to manipulate the tree anyway, and they need access to the old ;; structure to grab the memory. @@ -1810,14 +1779,8 @@ session." (sb-ext:atomic-push *current-thread* (session-new-enrollees *session*)) ;; Signals other than stop-for-GC are masked. The WITH/WITHOUT noise is - ;; pure cargo-cultism. I have no idea how or why any of it works, but it's - ;; basically the body of CALL-WITH-MUTEX, minus the actual GRAB-MUTEX which - ;; has been done by the creating thread on behalf of the created thread, - ;; unless the current thread is a FOREIGN-THREAD. - (without-interrupts - (unwind-protect (with-local-interrupts ,@body) - (let ((mutex (thread-result-lock *current-thread*))) - (when mutex (release-mutex mutex))))))))) + ;; pure cargo-cultism. + (without-interrupts (with-local-interrupts ,@body)))))) ) ; end PROGN #-pauseless-threadstart @@ -1899,18 +1862,19 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (arguments) "Argument passed to ~S, ~S, is an improper list." 'make-thread arguments) - (start-thread (%make-thread name nil) + (start-thread (%make-thread name nil (make-semaphore :name name)) (coerce function 'function) (ensure-list arguments)))) ;;; System-internal use only #+sb-thread (defun make-ephemeral-thread (name function arguments) - (start-thread (%make-thread name t) function arguments)) + (start-thread (%make-thread name t (make-semaphore :name name)) + function arguments)) ;;; The purpose of splitting out START-THREAD from MAKE-THREAD is that when ;;; starting the finalizer thread, we might be able to do: -;;; (let ((thread (%make-thread "finalizer" t))) +;;; (let ((thread (%make-thread "finalizer" t ...))) ;;; (when (cas *finalizer-thread* nil thread) ;;; (start-thread thread ...) ;;; which is possibly an improvement in two ways: @@ -1981,14 +1945,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." #-darwin 0))) ; otherwise, don't need to do that (setf (thread-primitive-thread thread) (sap-int thread-sap) (thread-startup-info thread) startup-info) - ;; Grant ownership of THREAD's result lock to it now so that a THREAD-JOIN - ;; right away can't prevent the kid from acquiring its own result lock. - ;; (N.B.: Giving away mutex ownership is not something the public API allows) - ;; FIXME: this could be done more cleanly by a condition var to avoid reliance - ;; on the nonstandard operation of assigning ownership. - (let ((m (thread-result-lock thread))) - #+sb-futex (setf (mutex-state m) 1) - (setf (mutex-%owner m) thread)) ;; Add new thread to *ALL-THREADS* now so that if the creator asserts ;; something about "all" threads, it can find the new thread. ;; But there is a slight ploy involved: the thread does not appear in @@ -2039,8 +1995,12 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; As it is, this lambda must not cons until we are ;; ready to run GC. Be careful. (init-thread-local-storage thread) - (with-mutex ((thread-result-lock thread)) - (run thread setup-sem function arguments)))) + ;; I literally don't know what these WITH/WITHOUT wrappings are for, + ;; but tests fail when removed. + ;; It's the body of CALL-WITH-MUTEX omitting the grab and release. + (without-interrupts + (with-local-interrupts + (run thread setup-sem function arguments))))) ;; Holding mutexes or waiting on sempahores inside WITHOUT-GCING will lock up (aver (not *gc-inhibit*)) ;; Keep INITIAL-FUNCTION in the dynamic extent until the child @@ -2077,41 +2037,29 @@ Trying to join the main thread causes JOIN-THREAD to block until TIMEOUT occurs or the process exits: when the main thread exits, the entire process exits. +Consequences of trying to join a given target thread from multiple +threads are undefined. + NOTE: Return convention in case of a timeout is experimental and subject to change." (when (eq thread *current-thread*) (error 'join-thread-error :thread thread :problem :self-join)) + ;; First, free up the pthread resources of any thread(s), not necessarily + ;; one we're tryinng to join. #+pauseless-threadstart (when (cddr *joinable-threads*) ; if strictly > 2 are joinable, - ;; release C structures of previously exited threads. We could pthread_join() - ;; all joinables while retaining the memory for a few, but I didn't want to - ;; deal separately with the memory and the pthread - it's both or none. - ;; And the pthread overhead is negligible in comparison to the 4MB - ;; allocation that we make per thread. (without-interrupts (join-pthread-joinables #'cddr))) - - (let ((lock (thread-result-lock thread)) - (got-it nil) - (problem :timeout)) - (unless lock - (error 'join-thread-error :thread thread :problem :foreign)) - (without-interrupts - (unwind-protect - (cond - ((not (setf got-it - (allow-with-interrupts - ;; Don't use the timeout if the thread is - ;; not alive anymore. - (grab-mutex lock :timeout (and (thread-alive-p thread) - timeout)))))) - ((listp (thread-result thread)) - (return-from join-thread - (values-list (thread-result thread)))) - (t - (setf problem :abort))) - (when got-it - (release-mutex lock)))) + ;; No result semaphore indicates that there's nothing to wait for- + ;; the thread is either a foreign-thread, or finished running. + (let ((problem + (acond ((thread-semaphore thread) + (if (wait-on-semaphore it :timeout timeout) nil :timeout)) + ((typep thread 'foreign-thread) :foreign)))) + (unless problem + (if (listp (thread-result thread)) + (return-from join-thread (values-list (thread-result thread))) + (setq problem :abort))) (if defaultp (values default problem) (error 'join-thread-error :thread thread :problem problem)))) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index cec36bdec2..217e294b9e 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -26,7 +26,44 @@ (name nil :type (or null simple-string)) (%owner nil :type (or null thread))) -(sb-xc:defstruct (thread (:constructor %make-thread (name %ephemeral-p)) +#+(or (not sb-thread) sb-futex) +(sb-xc:defstruct (waitqueue (:copier nil) (:constructor make-waitqueue (&key name))) + "Waitqueue type." + #+(and sb-thread sb-futex) + (token 0 + ;; actually 32-bits, but it needs to be a raw slot and we don't have + ;; 32-bit raw slots on 64-bit machines. + #+futex-use-tid :type #+futex-use-tid sb-ext:word) + ;; If adding slots between TOKEN and NAME, please see futex_name() in linux_os.c + ;; which attempts to divine a string from a futex word address. + (name nil :type (or null string))) + +#+(and sb-thread (not sb-futex)) +(sb-xc:defstruct (waitqueue (:copier nil) (:constructor make-waitqueue (&key name))) + "Waitqueue type." + (name nil :type (or null string)) + ;; For WITH-CAS-LOCK: because CONDITION-WAIT must be able to call + ;; %WAITQUEUE-WAKEUP without re-aquiring the mutex, we need a separate + ;; lock. In most cases this should be uncontested thanks to the mutex -- + ;; the only case where that might not be true is when CONDITION-WAIT + ;; unwinds and %WAITQUEUE-DROP is called. + %owner + %head + %tail) + +(sb-xc:defstruct (semaphore (:copier nil) + (:constructor %make-semaphore (%count mutex queue))) + "Semaphore type. The fact that a SEMAPHORE is a STRUCTURE-OBJECT +should be considered an implementation detail, and may change in the +future." + (%count 0 :type (integer 0)) + (waitcount 0 :type sb-vm:word) + (mutex nil :read-only t :type mutex) + (queue nil :read-only t :type waitqueue)) + +(declaim (sb-ext:freeze-type waitqueue semaphore)) + +(sb-xc:defstruct (thread (:constructor %make-thread (name %ephemeral-p semaphore)) (:copier nil)) "Thread type. Do not rely on threads being structs as it may change in future versions." @@ -81,19 +118,17 @@ in future versions." ;; might have been known as the %ALIVE-P flag. (%visible 1 :type fixnum) (interruptions nil :type list) - ;; On succesful execution of the thread's lambda a list of values. - (result 0) (interruptions-lock (make-mutex :name "thread interruptions lock") :type mutex :read-only t) - (result-lock - (make-mutex :name "thread result lock") - :type (or null mutex) :read-only t) + ;; On succesful execution of the thread's lambda, a list of values. + (result 0) + (semaphore nil :type (or null semaphore)) waiting-for) (sb-xc:defstruct (foreign-thread (:copier nil) - (:include thread (result-lock nil) (name "callback")) + (:include thread (name "callback")) (:constructor make-foreign-thread ()) (:conc-name "THREAD-")) "Type of native threads which are attached to the runtime as Lisp threads @@ -107,4 +142,4 @@ temporarily.") "Asynchronous signal handling thread." (signal-number nil :type integer)) -#-sb-xc-host (declaim (sb-ext:freeze-type mutex thread)) +(declaim (sb-ext:freeze-type mutex thread)) From 288b6056bde02348f2e0ca1c454c1992f8d9c69a Mon Sep 17 00:00:00 2001 From: Matthew Stickney Date: Thu, 28 Jun 2018 22:22:37 -0400 Subject: [PATCH 0310/4023] Fix EOF detection in WAIT-UNTIL-FD-USABLE. With sockets, EOF is not properly detected because WSAIoctl with FIONREAD does not report input on EOF (there are no bytes to read, after all). This is fixed by replacing WSAIoctl with select(), which is able to detect EOF and report "input" available for a subsequent read. Waiting on a named pipe has a related problem, where PeekNamedPipe reports EOF as an error, but SB-WIN32:HANDLE-LISTEN does not distinguish between EOF and a regular read error, and the listen falls through into the socket code. This produces a functionally identical result, because errors are treated as input-available, so the resulting not-a-socket error causes HANDLE-LISTEN to correctly return T. This is surprising, and ties a pipe listen to the socket code, so instead we now explicitly check for EOF in the pipe code instead of falling through. This also adds a test that checks 1) that SB-SYS:WAIT-FOR-INPUT doesn't hang, and 2) that LISTEN correctly returns NIL after waiting on a closed socket, as that was an issue while fixing the previous code. A test for a wait on a named pipe is also added, to ensure there's not regression there. --- contrib/sb-bsd-sockets/tests.lisp | 28 ++++++++++++++++++++++++++++ src/code/fd-stream.lisp | 5 +---- src/code/win32.lisp | 8 +++++--- src/runtime/win32-os.c | 31 ++++++++++++++++++++++--------- tests/stream.impure.lisp | 8 ++++++++ 5 files changed, 64 insertions(+), 16 deletions(-) diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index 9a0f818d21..dddf3169ac 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -350,6 +350,34 @@ (network-unreachable-error () 'network-unreachable)) t) +#+(and ipv4-support sb-thread) +(deftest sockopt-close-wait-listen-eof + (let ((listen-sock (make-instance 'inet-socket :type :stream :protocol :tcp)) + (client-sock (make-instance 'inet-socket :type :stream :protocol :tcp)) + server-sock + port) + (unwind-protect + (progn + (socket-bind listen-sock #(127 0 0 1) 0) + (setf port (nth-value 1 (socket-name listen-sock))) + (socket-listen listen-sock 1) + + (let ((client-connect-thread + (sb-thread:make-thread + (lambda () + (socket-connect client-sock #(127 0 0 1) port) + (socket-close client-sock))))) + (setf server-sock (socket-accept listen-sock))) + + ;; Wait for input. This should return when we get EOF + ;; from the client. It should /not/ hang. + (sb-sys:wait-until-fd-usable (socket-file-descriptor server-sock) :input) + (listen (socket-make-stream server-sock :input t))) + (socket-close listen-sock) + (socket-close client-sock) + (and server-sock (socket-close server-sock)))) + nil) + #+ipv4-support (deftest socket-open-p-true.1 (socket-open-p (make-instance 'inet-socket :type :stream :protocol :tcp)) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index e3c35a18cc..54ea51560d 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -964,7 +964,7 @@ ;;; further assurance than "may" versus "will definitely not". (defun sysread-may-block-p (stream) #+win32 - ;; This answers T at EOF on win32, I think. + ;; This answers T at EOF on win32. (not (sb-win32:handle-listen (fd-stream-fd stream))) #-win32 (not (sb-unix:unix-simple-poll (fd-stream-fd stream) :input 0))) @@ -1950,9 +1950,6 @@ (let ((ibuf (fd-stream-ibuf fd-stream))) (or (not (eql (buffer-head ibuf) (buffer-tail ibuf))) (fd-stream-listen fd-stream) - #+win32 - (sb-win32:handle-listen (fd-stream-fd fd-stream)) - #-win32 ;; If the read can block, LISTEN will certainly return NIL. (if (sysread-may-block-p fd-stream) nil diff --git a/src/code/win32.lisp b/src/code/win32.lisp index 63c3a7c06e..64a79388bd 100644 --- a/src/code/win32.lisp +++ b/src/code/win32.lisp @@ -146,9 +146,11 @@ handle)) (t (with-alien ((avail dword)) - - (unless (zerop (peek-named-pipe handle nil 0 nil (addr avail) nil)) - (return-from handle-listen (plusp avail)))) + (let* ((res (peek-named-pipe handle nil 0 nil (addr avail) nil)) + (code (get-last-error))) + (cond + ((not (zerop res)) (return-from handle-listen (plusp avail))) + ((= code error-broken-pipe) (return-from handle-listen t))))) (let ((res (socket-input-available handle))) (unless (zerop res) (return-from handle-listen (= res 1)))) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 454df81522..f85f8ba582 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -1514,19 +1514,32 @@ char *dirname(char *path) int socket_input_available(HANDLE socket) { - unsigned long count = 0, count_size = 0; + int count = 0; int wsaErrno = GetLastError(); - int err = WSAIoctl((SOCKET)socket, FIONREAD, NULL, 0, - &count, sizeof(count), &count_size, NULL, NULL); + TIMEVAL timeout = {0, 0}; + fd_set readfds, errfds; - int ret; + FD_ZERO(&readfds); + FD_ZERO(&errfds); + FD_SET(socket, &readfds); + FD_SET(socket, &errfds); - if (err == 0) { - ret = (count > 0) ? 1 : 2; - } else - ret = 0; + count = select(0, &readfds, NULL, &errfds, &timeout); SetLastError(wsaErrno); - return ret; + + if (count == SOCKET_ERROR) + /* This is an error in select() itself, not with the socket. */ + return 0; + else if (count == 0) + return 2; + /* True if there is data, or the socket has been closed (i.e. a read + * would retrieve an EOF error) */ + else if (FD_ISSET(socket, &readfds)) + return 1; + else + /* This is an error in the socket. The count was positive, and + * it wasn't in the read set, so it must be in the error set. */ + return 0; } #ifdef LISP_FEATURE_SB_THREAD diff --git a/tests/stream.impure.lisp b/tests/stream.impure.lisp index 17ca18201d..4ab990a3c3 100644 --- a/tests/stream.impure.lisp +++ b/tests/stream.impure.lisp @@ -853,4 +853,12 @@ (sb-impl::ansi-stream-read-string-from-frc-buffer string s 0 nil))) (assert (= endpos 0))))) +(with-test (:name :named-pipe-wait-eof) + (let* ((process (run-program "cat" '() :search t + :wait nil :input nil :output :stream)) + (out (process-output process))) + (sb-sys:wait-until-fd-usable (sb-sys:fd-stream-fd out) :input) + (assert (null (read-byte (process-output process) nil nil))) + (process-close process))) + ;;; success From d1482470755c02885d2c76c588283f3e867311c9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 4 Aug 2020 17:50:04 -0400 Subject: [PATCH 0311/4023] Delay signaling thread result semaphore until after removing from *all-threads*. --- src/code/target-thread.lisp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 1017e56ee7..03d0d3173f 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1435,11 +1435,6 @@ on this semaphore, then N of them is woken up." (%make-lisp-obj (thread-primitive-thread thread)))) (setf (thread-primitive-thread thread) 0) (barrier (:write))) - (when sem - (setf (thread-semaphore thread) nil) ; nobody needs to wait on it now - ;; We could increment by most-positive-fixnum, but that might just encourage - ;; bad usage (more than one attempted joiner) - (signal-semaphore sem)) ;; After making the thread dead, remove from session. If this were done first, ;; we'd just waste time moving the thread into SESSION-THREADS (if it wasn't there) ;; only to remove it right away. @@ -1460,7 +1455,12 @@ on this semaphore, then N of them is woken up." ;; the memory allocation/deallocation is handled in C. ;; I would like to combine the recycle bin for foreign and lisp threads though. (delete-from-all-threads - (get-lisp-obj-address sb-vm:*control-stack-start*))))))) + (get-lisp-obj-address sb-vm:*control-stack-start*)))) + (when sem + (setf (thread-semaphore thread) nil) ; nobody needs to wait on it now + ;; We could increment by most-positive-fixnum, but that might just encourage + ;; bad usage (more than one attempted joiner) + (signal-semaphore sem))))) ;;; The "funny fixnum" address format would do no good - AVL-FIND and AVL-DELETE ;;; expect normal happy lisp integers, even if a bignum. From 9e1b544c2d5322d05401e88fe802b3b991db116a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 4 Aug 2020 22:55:18 -0400 Subject: [PATCH 0312/4023] Fix backtrace for #+cheneygc --- src/runtime/backtrace.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 947f8b1ccc..87614d43a8 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -35,6 +35,7 @@ #include "gc.h" #include "code.h" #include "var-io.h" +#include "gc-internal.h" #include "forwarding-ptr.h" #include "lispstring.h" From 674e2816a5f74aeedcacfe9345accad548e22030 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 5 Aug 2020 18:50:26 +0300 Subject: [PATCH 0313/4023] Correctly define no-op WITH_GC_AT_SAFEPOINTS_ONLY. Don't redefine the one on +sb-safepoint --- src/runtime/thread.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/thread.h b/src/runtime/thread.h index b6152439ac..6e1c4d17f5 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -372,9 +372,9 @@ void detach_os_thread(init_thread_data *); void signal_handler_callback(lispobj, int, void *, void *); # endif -#endif - +#else #define WITH_GC_AT_SAFEPOINTS_ONLY() +#endif extern void create_main_lisp_thread(lispobj); From 8631101ac179a0e4ac2e50ebf9a261126280db02 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 12:04:01 -0400 Subject: [PATCH 0314/4023] Rectify trifling annoyance save-lisp-and-die as the outmost backtrace frame is disconcerting. --- src/code/save.lisp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/code/save.lisp b/src/code/save.lisp index b34869f666..7d6036db0e 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -82,6 +82,18 @@ sb-thread::*session* sb-kernel::*gc-epoch*)) +(defun start-lisp (toplevel) + (named-lambda start-lisp () + (handling-end-of-the-world + (reinit) + ;; REINIT can not discern between a restarted image and a + ;; failure to save. It doesn't make a lot of sense to start + ;; a finalizer thread in the failed case, so we set the flag + ;; here, not in REINIT which would do it for both cases. + #+sb-thread (setq *finalizer-thread* t) + #+hpux (%primitive sb-vm::setup-return-from-lisp-stub) + (funcall toplevel)))) + (defun save-lisp-and-die (core-file-name &key (toplevel #'toplevel-init) (executable nil) @@ -209,20 +221,11 @@ sufficiently motivated to do lengthy fixes." (return-from save-lisp-and-die)))) (when (eql t compression) (setf compression -1)) - (labels ((restart-lisp () - (handling-end-of-the-world - (reinit) - ;; REINIT can not discern between a restarted image and a - ;; failure to save. It doesn't make a lot of sense to start - ;; a finalizer thread in the failed case, so we set the flag - ;; here, not in REINIT which would do it for both cases. - #+sb-thread (setq *finalizer-thread* t) - #+hpux (%primitive sb-vm::setup-return-from-lisp-stub) - (funcall toplevel))) - (foreign-bool (value) - (if value 1 0))) + (flet ((foreign-bool (value) + (if value 1 0))) (let ((name (native-namestring (physicalize-pathname core-file-name) - :as-file t))) + :as-file t)) + (startfun (start-lisp toplevel))) (deinit) ;; FIXME: Would it be possible to unmix the PURIFY logic from this ;; function, and just do a GC :FULL T here? (Then if the user wanted @@ -242,8 +245,8 @@ sufficiently motivated to do lengthy fixes." sb-disassem::*disassem-inst-space* nil) ;; Save the restart function. Logically a passed argument, but can't be, ;; as it would require pinning around the whole save operation. - (with-pinned-objects (#'restart-lisp) - (setf lisp-init-function (get-lisp-obj-address #'restart-lisp))) + (with-pinned-objects (startfun) + (setf lisp-init-function (get-lisp-obj-address startfun))) ;; Do a destructive non-conservative GC, and then save a core. ;; A normal GC will leave huge amounts of storage unreclaimed ;; (over 50% on x86). This needs to be done by a single function @@ -265,7 +268,7 @@ sufficiently motivated to do lengthy fixes." (if purify (purify :root-structures root-structures) (gc)) (without-gcing (save name - (get-lisp-obj-address #'restart-lisp) + (get-lisp-obj-address startfun) (foreign-bool executable) (foreign-bool save-runtime-options) (foreign-bool compression) From 53f76826cfbd12c2c77e8726d2edca4811533456 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 12:13:38 -0400 Subject: [PATCH 0315/4023] Fix EQUALP on pathnmames --- src/code/pred.lisp | 3 ++- tests/pathnames.impure.lisp | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/code/pred.lisp b/src/code/pred.lisp index 7146aa0d31..f6da6e4d57 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -482,7 +482,8 @@ length and have identical components. Other arrays must be EQ to be EQUAL." ((%instancep x) (and (%instancep y) (let ((layout (%instance-layout x))) - (and (logtest +structure-layout-flag+ (layout-flags layout)) + (and (logtest (logior +structure-layout-flag+ +pathname-layout-flag+) + (layout-flags layout)) (eq (%instance-layout y) layout) (funcall (layout-equalp-impl layout) x y))))) ((and (simple-vector-p x) (simple-vector-p y)) diff --git a/tests/pathnames.impure.lisp b/tests/pathnames.impure.lisp index 4938199269..f97cd69a94 100644 --- a/tests/pathnames.impure.lisp +++ b/tests/pathnames.impure.lisp @@ -883,6 +883,8 @@ ;;; LOGICAL-PATHAME was missing the specialized pathname comparator ;;; function in SB_KERNEL::LAYOUT-EQUALP-IMPL (with-test (:name :logical-pathname-equalp-method) + ;; PATHNAME is not a structure-object but uses the instance EQUALP case. + (assert (equalp (make-pathname) (make-pathname :version :newest))) (let ((s "#p\"sys:contrib/f[1-9].txt\"")) (let ((a (read-from-string s))) ;; result shouldn't depend on the pathnames being EQ From eb9c3b6223815bb98cfb62939839a1ded53191fd Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 12:19:44 -0400 Subject: [PATCH 0316/4023] Fix C warning with #-sb-thread --- src/runtime/thread.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 6e1c4d17f5..abed9463ff 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -383,8 +383,10 @@ extern pthread_mutex_t all_threads_lock; #endif #ifndef LISP_FEATURE_SB_THREAD -# define THREAD_ID_LABEL "" -# define THREAD_ID_VALUE 0 +// Put in an empty conversion to avoid warning at the point of use: +// "warning: too many arguments for format [-Wformat-extra-args]" +# define THREAD_ID_LABEL "%s" +# define THREAD_ID_VALUE "" #elif defined __linux__ extern int sb_GetTID(); # define THREAD_ID_LABEL " tid %d" From 533542ca421f5871fbdd84935c5c8abf9aed0a51 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 12:40:11 -0400 Subject: [PATCH 0317/4023] Improve libunwind backtrace feature * Support #-sb-thread * Support x86 --- src/runtime/Config.x86-linux | 3 +++ src/runtime/backtrace.c | 28 +++++++++++++++++----------- src/runtime/linux-os.c | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/runtime/Config.x86-linux b/src/runtime/Config.x86-linux index 67a758eb6f..6a8f836143 100644 --- a/src/runtime/Config.x86-linux +++ b/src/runtime/Config.x86-linux @@ -43,6 +43,9 @@ endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION OS_LIBS += -lz endif +ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE + OS_LIBS += -lunwind +endif ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME LIBSBCL = sbcl.o USE_LIBSBCL = sbcl.o diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 87614d43a8..220d22df54 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -606,16 +606,15 @@ int simple_fun_index_from_pc(struct code* code, char *pc) static boolean __attribute__((unused)) print_lisp_fun_name(char* pc) { struct code* code; - int fi; - lispobj fn; if (gc_managed_addr_p((uword_t)pc) && - (code = (void*)component_ptr_from_pc(pc)) != 0 && - (fi = simple_fun_index_from_pc(code, pc)) >= 0 && - is_lisp_pointer(fn = code->constants[fi*CODE_SLOTS_PER_SIMPLE_FUN])) { - fprintf(stderr, " %p [", pc); - print_entry_name(fn, stderr); - fprintf(stderr, "]\n"); - return 1; + (code = (void*)component_ptr_from_pc(pc)) != 0) { + struct compiled_debug_fun* df = debug_function_from_pc(code, pc); + if (df) { + fprintf(stderr, " %p [", pc); + print_entry_name(df->name, stderr); + fprintf(stderr, "]\n"); + return 1; + } } return 0; } @@ -625,11 +624,13 @@ static boolean __attribute__((unused)) print_lisp_fun_name(char* pc) #include #include "genesis/thread-instance.h" #include "genesis/mutex.h" -static int backtrace_completion_pipe[2] = {-1,-1}; +static __attribute__((unused))int backtrace_completion_pipe[2] = {-1,-1}; void libunwind_backtrace(struct thread *th, os_context_t *context) { char procname[100]; fprintf(stderr, "Lisp thread @ %p, tid %d", th, (int)th->os_kernel_tid); +#ifdef LISP_FEATURE_SB_THREAD + // the TLS area is not used if #-sb-thread. And if so, it must be "main thred" struct thread_instance* lispthread = (void*)native_pointer(th->lisp_thread); if (lispthread->name != NIL) { fprintf(stderr, " (\""); @@ -654,6 +655,7 @@ void libunwind_backtrace(struct thread *th, os_context_t *context) } putc('\n', stderr); } +#endif unw_cursor_t cursor; // "unw_init_local() is thread-safe as well as safe to use from a signal handler." // "unw_get_proc_name() is thread-safe. If cursor cp is in the local address-space, @@ -662,7 +664,7 @@ void libunwind_backtrace(struct thread *th, os_context_t *context) do { uword_t offset; char *pc; - unw_get_reg(&cursor, UNW_X86_64_RIP, (uword_t*)&pc); + unw_get_reg(&cursor, UNW_TDEP_IP, (uword_t*)&pc); if (print_lisp_fun_name(pc)) { // printed } else if (!unw_get_proc_name(&cursor, procname, sizeof procname, &offset)) { @@ -676,6 +678,7 @@ void backtrace_lisp_threads(int __attribute__((unused)) signal, siginfo_t __attribute__((unused)) *info, os_context_t *context) { +#ifdef LISP_FEATURE_SB_THREAD if (backtrace_completion_pipe[1] >= 0) { libunwind_backtrace(current_thread, context); write(backtrace_completion_pipe[1], context /* any random byte */, 1); @@ -705,5 +708,8 @@ void backtrace_lisp_threads(int __attribute__((unused)) signal, close(backtrace_completion_pipe[0]); backtrace_completion_pipe[0] = backtrace_completion_pipe[1] = -1; } +#else + libunwind_backtrace(arch_os_get_current_thread(), context); +#endif } #endif diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 490b996de1..d9ceebd2d3 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -445,7 +445,7 @@ os_install_interrupt_handlers(void) sigset_t ss; sigemptyset(&ss); sigaddset(&ss, SIGXCPU); - pthread_sigmask(SIG_UNBLOCK, &ss, 0); + thread_sigmask(SIG_UNBLOCK, &ss, 0); #endif } From a8d0a3dd5ccdabff03303b514eb6b9a6c0c95863 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 5 Aug 2020 20:10:17 +0300 Subject: [PATCH 0318/4023] Make sure the equalp pathname test actually fails. Otherwise it's just converted to pathname= at compile-time. --- tests/pathnames.impure.lisp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/pathnames.impure.lisp b/tests/pathnames.impure.lisp index f97cd69a94..87e7ab5d28 100644 --- a/tests/pathnames.impure.lisp +++ b/tests/pathnames.impure.lisp @@ -884,7 +884,11 @@ ;;; function in SB_KERNEL::LAYOUT-EQUALP-IMPL (with-test (:name :logical-pathname-equalp-method) ;; PATHNAME is not a structure-object but uses the instance EQUALP case. - (assert (equalp (make-pathname) (make-pathname :version :newest))) + (checked-compile-and-assert + () + `(lambda (x y) + (equalp x y)) + (((make-pathname) (make-pathname :version :newest)) t)) (let ((s "#p\"sys:contrib/f[1-9].txt\"")) (let ((a (read-from-string s))) ;; result shouldn't depend on the pathnames being EQ From 73b79365883fb408773a0b5b19e44681c276e217 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 13:15:23 -0400 Subject: [PATCH 0319/4023] Reactivate :PAUSELESS-THREADSTART where available --- src/cold/shared.lisp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 6dc3444551..43241ff79d 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -245,12 +245,10 @@ (arch (target-platform-keyword target-feature-list))) (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) (pushnew :futex-use-tid target-feature-list)) - #+nil - (let ((*readtable* *xc-readtable*) - (sb-xc:*features* target-feature-list)) - (when (featurep '(:and :linux (:or :x86 :x86-64) :sb-thread - (:not (:or :sb-safepoint :sb-thruption)))) - (push :pauseless-threadstart target-feature-list))) + (when (featurep '(:and :linux (:or :x86 :x86-64) :sb-thread + (:not (:or :sb-safepoint :sb-thruption))) + target-feature-list) + (push :pauseless-threadstart target-feature-list)) (when (and (member :x86 target-feature-list) (member :int4-breakpoints target-feature-list)) ;; 0xCE is a perfectly good 32-bit instruction, From 75d749401b894117ef76344ef2389617f01d5859 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 14:30:51 -0400 Subject: [PATCH 0320/4023] Deal with weird shells /bin/sh on some GCC farm machines is a symlink to 'dash', and 'dash' has a strange (wrong?) behavior of starting a process that has a child that you don't know about. It does this when using "exec" and "<<" together. Then the input provider (the one writing the text of the here-document) is a child of SBCL. This may not be POSIX-compliant, but what do I know. --- tests/parallel-exec.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 70eea870da..480b037c84 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -54,6 +54,9 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (multiple-value-bind (pid status) (sb-posix:wait) (decf subprocess-count) (let ((process (assoc pid subprocess-list))) + (unless process + (warn "Whoa! Process ~D is an unexpected child" pid) + (return-from wait (wait))) (setq subprocess-list (delete process subprocess-list)) (let ((code (ash status -8)) (filename (cadr process)) From 9a884c1945861faae9688c804ed7ddc24d98d757 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 6 Aug 2020 02:13:35 +0300 Subject: [PATCH 0321/4023] Delay reporting constant folding errors. As the may be in dead code. --- src/compiler/ir1opt.lisp | 50 +------ src/compiler/ir1util.lisp | 32 ++--- src/compiler/ltn.lisp | 7 + src/compiler/node.lisp | 2 +- tests/compiler-2.pure.lisp | 10 ++ tests/timer.impure.lisp | 288 +------------------------------------ 6 files changed, 34 insertions(+), 355 deletions(-) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 71488104bc..5bae27a541 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -1731,53 +1731,11 @@ (resolve-key-args args type) args))) (args (mapcar #'value lvar-args))) - (multiple-value-bind (values win) - (careful-call fun-name - args - call - ;; Note: CMU CL had COMPILER-WARN here, and that - ;; seems more natural, but it's probably not. - ;; - ;; It's especially not while bug 173 exists: - ;; Expressions like - ;; (COND (END - ;; (UNLESS (OR UNSAFE? (<= END SIZE))) - ;; ...)) - ;; can cause constant-folding TYPE-ERRORs (in - ;; #'<=) when END can be proved to be NIL, even - ;; though the code is perfectly legal and safe - ;; because a NIL value of END means that the - ;; #'<= will never be executed. - ;; - ;; Moreover, even without bug 173, - ;; quite-possibly-valid code like - ;; (COND ((NONINLINED-PREDICATE END) - ;; (UNLESS (<= END SIZE)) - ;; ...)) - ;; (where NONINLINED-PREDICATE is something the - ;; compiler can't do at compile time, but which - ;; turns out to make the #'<= expression - ;; unreachable when END=NIL) could cause errors - ;; when the compiler tries to constant-fold (<= - ;; END SIZE). - ;; - ;; So, with or without bug 173, it'd be - ;; unnecessarily evil to do a full - ;; COMPILER-WARNING (and thus return FAILURE-P=T - ;; from COMPILE-FILE) for legal code, so we we - ;; use a wimpier COMPILE-STYLE-WARNING instead. - #-sb-xc-host #'compiler-style-warn - ;; On the other hand, for code we control, we - ;; should be able to work around any bug - ;; 173-related problems, and in particular we - ;; want to be alerted to calls to our own - ;; functions which aren't being folded away; a - ;; COMPILER-WARNING is butch enough to stop the - ;; SBCL build itself in its tracks. - #+sb-xc-host #'compiler-warn - "constant folding") + (multiple-value-bind (values win) (careful-call fun-name args) (cond ((not win) - (setf (combination-kind call) :error)) + (setf (combination-kind call) :error + (combination-info call) + (list #'compiler-style-warn "Lisp error during consant folding:~%~A" values))) ((and (proper-list-of-length-p values 1)) (replace-combination-with-constant (first values) call)) (t (let ((dummies (make-gensym-list (length args)))) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 00f60eb827..c5188c39b0 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -2824,28 +2824,18 @@ is :ANY, the function name is not checked." ;;; Apply a function to some arguments, returning a list of the values ;;; resulting of the evaluation. If an error is signalled during the -;;; application, then we produce a warning message using WARN-FUN and -;;; return NIL as our second value to indicate this. NODE is used as -;;; the error context for any error message, and CONTEXT is a string -;;; that is spliced into the warning. -(declaim (ftype (sfunction ((or symbol function) list node function string) - (values list boolean)) +;;; application, then return the condition and NIL as the +;;; second value. +(declaim (ftype (sfunction ((or symbol function) list) + (values t boolean)) careful-call)) -(defun careful-call (function args node warn-fun context) - (declare (ignorable node warn-fun context)) - ;; When cross-compiling, being "careful" is the wrong thing - our code should - ;; not allowed malformed or out-of-order definitions to proceed as if all is well. - #+sb-xc-host - (values (multiple-value-list (apply function args)) t) - #-sb-xc-host - (values - (multiple-value-list - (handler-case (apply function args) - (error (condition) - (let ((*compiler-error-context* node)) - (funcall warn-fun "Lisp error during ~A:~%~A" context condition) - (return-from careful-call (values nil nil)))))) - t)) +(defun careful-call (function args) + (handler-case (values (multiple-value-list (apply function args)) t) + ;; When cross-compiling, being "careful" is the wrong thing - our code should + ;; not allowed malformed or out-of-order definitions to proceed as if all is well. + #-sb-xc-host + (error (condition) + (values condition nil)))) ;;; Variations of SPECIFIER-TYPE for parsing possibly wrong ;;; specifiers. diff --git a/src/compiler/ltn.lisp b/src/compiler/ltn.lisp index ea6c6d05b8..a0d9bafb9c 100644 --- a/src/compiler/ltn.lisp +++ b/src/compiler/ltn.lisp @@ -198,6 +198,11 @@ (setf (node-tail-p call) nil)))) (values)) +(defun signal-delayed-combination-condition (call) + (let ((*compiler-error-context* call) + (delayed (combination-info call))) + (apply #'funcall delayed))) + ;;; We set the kind to :FULL or :FUNNY, depending on whether there is ;;; an IR2-CONVERT method. If a funny function, then we inhibit tail ;;; recursion normally, since the IR2 convert method is going to want @@ -225,6 +230,8 @@ (setf (node-tail-p call) nil)) (t (when (eq kind :error) + (when (basic-combination-info call) + (signal-delayed-combination-condition call)) (setf (basic-combination-kind call) :full)) (setf (basic-combination-info call) :full) (rewrite-full-call call)))) diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index c01333f6de..d8a6b03196 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -1448,7 +1448,7 @@ ;; Untrusted type we have asserted for this combination. (type-validated-for-leaf nil) ;; some kind of information attached to this node by the back end - ;; or by CHECK-IMPORTANT-RESULT + ;; or by CHECK-IMPORTANT-RESULT, or by anything else that may need to. (info nil) (step-info nil) ;; A plist of inline expansions diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 962fd16fc5..8874dd6cb7 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -2950,3 +2950,13 @@ (:allow-style-warnings t) `(lambda () (oddp (the (or a b) -1))))) + +(with-test (:name :dead-code-no-constant-fold-errors) + (assert + (typep (nth-value 4 + (checked-compile + `(lambda (z) + (when (and (eq z 0) + (not (eq z 0))) + (/ 10 0))))) + '(cons sb-ext:code-deletion-note null)))) diff --git a/tests/timer.impure.lisp b/tests/timer.impure.lisp index 8583f6d9bb..0dbab1d341 100644 --- a/tests/timer.impure.lisp +++ b/tests/timer.impure.lisp @@ -9,282 +9,6 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#+interpreter (sb-ext:exit :code 104) - -(with-test (:name :heap) - (let* ((size 1000) - (heap (make-array size :adjustable t :fill-pointer 0)) - (unsorted (loop for i below size collect (random size))) - (sorted (sort (copy-list unsorted) #'>=)) - heap-sorted) - (map nil #'(lambda (val) (sb-impl::heap-insert heap val)) unsorted) - (setf heap-sorted (loop for i below size - collect (sb-impl::heap-extract-maximum heap))) - (unless (equal sorted heap-sorted) - (error "Heap sort failure ~S" heap-sorted)))) - -(sb-alien:define-alien-routine "check_deferrables_blocked_or_lose" - void - (where sb-alien:unsigned-long)) -(sb-alien:define-alien-routine "check_deferrables_unblocked_or_lose" - void - (where sb-alien:unsigned-long)) - -(defun make-limited-timer (fn n &rest args) - (let (timer) - (setq timer - (apply #'sb-ext:make-timer - (lambda () - (sb-sys:without-interrupts - (decf n) - (cond ((minusp n) - (warn "Unscheduling timer ~A ~ - upon reaching run limit. System too slow?" - timer) - (sb-ext:unschedule-timer timer)) - (t - (sb-sys:allow-with-interrupts - (funcall fn)))))) - args)))) - -(defun make-and-schedule-and-wait (fn time) - (let ((finishedp nil)) - (sb-ext:schedule-timer (sb-ext:make-timer - (lambda () - (sb-sys:without-interrupts - (unwind-protect - (sb-sys:allow-with-interrupts - (funcall fn)) - (setq finishedp t))))) - time) - (loop until finishedp))) - -(with-test (:name (:timer :deferrables-blocked) :skipped-on :win32) - (make-and-schedule-and-wait (lambda () - (check-deferrables-blocked-or-lose 0)) - (random 0.1)) - (check-deferrables-unblocked-or-lose 0)) - -(with-test (:name (:timer :deferrables-unblocked) :skipped-on :win32) - (make-and-schedule-and-wait (lambda () - (sb-sys:with-interrupts - (check-deferrables-unblocked-or-lose 0))) - (random 0.1)) - (check-deferrables-unblocked-or-lose 0)) - -(with-test (:name (:timer :deferrables-unblocked :unwind) :skipped-on :win32) - (catch 'xxx - (make-and-schedule-and-wait (lambda () - (check-deferrables-blocked-or-lose 0) - (throw 'xxx nil)) - (random 0.1)) - (sleep 1)) - (check-deferrables-unblocked-or-lose 0)) - -(defmacro raises-timeout-p (&body body) - `(handler-case (progn (progn ,@body) nil) - (sb-ext:timeout () t))) - -(with-test (:name (:timer :relative) - :fails-on (and :sparc :linux) - :skipped-on :win32) - (let* ((has-run-p nil) - (timer (make-timer (lambda () (setq has-run-p t)) - :name "simple timer"))) - (schedule-timer timer 0.5) - (sleep 0.2) - (assert (not has-run-p)) - (sleep 0.5) - (assert has-run-p) - (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) - -(with-test (:name (:timer :absolute) - :fails-on (and :sparc :linux) - :skipped-on :win32) - (let* ((has-run-p nil) - (timer (make-timer (lambda () (setq has-run-p t)) - :name "simple timer"))) - (schedule-timer timer (+ 1/2 (get-universal-time)) :absolute-p t) - (sleep 0.2) - (assert (not has-run-p)) - (sleep 0.5) - (assert has-run-p) - (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) - -(with-test (:name (:timer :other-thread) :skipped-on (not :sb-thread)) - (let* ((sem (sb-thread:make-semaphore)) - (thread (sb-thread:make-thread (lambda () (sb-thread:wait-on-semaphore sem)))) - (timer (make-timer (lambda () - (assert (eq thread sb-thread:*current-thread*))) - :thread thread))) - (schedule-timer timer 0.1) - (sb-thread:signal-semaphore sem) - (assert (sb-thread:join-thread thread)))) - -(with-test (:name (:timer :new-thread) :skipped-on (not :sb-thread)) - (let* ((original-thread sb-thread:*current-thread*) - (timer (make-timer - (lambda () - (assert (not (eq original-thread - sb-thread:*current-thread*)))) - :thread t))) - (schedule-timer timer 0.1))) - -(with-test (:name (:timer :repeat-and-unschedule) - :fails-on (and :sparc :linux) - :skipped-on :win32) - (let* ((run-count 0) - timer) - (setq timer - (make-timer (lambda () - (when (= 5 (incf run-count)) - (unschedule-timer timer))))) - (schedule-timer timer 0 :repeat-interval 0.2) - (assert (timer-scheduled-p timer :delta 0.3)) - (sleep 1.3) - (assert (= 5 run-count)) - (assert (not (timer-scheduled-p timer))) - (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) - -(with-test (:name (:timer :reschedule) :skipped-on :win32) - (let* ((has-run-p nil) - (timer (make-timer (lambda () - (setq has-run-p t))))) - (schedule-timer timer 0.2) - (schedule-timer timer 0.3) - (sleep 0.5) - (assert has-run-p) - (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) - -(with-test (:name (:timer :stress) :skipped-on :win32) - (let ((time (1+ (get-universal-time)))) - (loop repeat 200 do - (schedule-timer (make-timer (lambda ())) time :absolute-p t)) - (sleep 2) - (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) - -(with-test (:name (:timer :stress2) :skipped-on :win32) - (let ((time (1+ (get-universal-time))) - (n 0)) - (loop for time-n from time upto (+ 1/10 time) by (/ 1/10 200) - do (schedule-timer (make-timer (lambda ())) time-n :absolute-p t) - (incf n)) - (sleep 2) - (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) - -(with-test (:name (:with-timeout :timeout) :skipped-on :win32) - (assert (raises-timeout-p - (sb-ext:with-timeout 0.2 - (sleep 1))))) - -(with-test (:name (:with-timeout :fall-through) :skipped-on :win32) - (assert (not (raises-timeout-p - (sb-ext:with-timeout 0.3 - (sleep 0.1)))))) - -(with-test (:name (:with-timeout :nested-timeout-smaller) :skipped-on :win32) - (assert(raises-timeout-p - (sb-ext:with-timeout 10 - (sb-ext:with-timeout 0.5 - (sleep 2)))))) - -(with-test (:name (:with-timeout :nested-timeout-bigger) :skipped-on :win32) - (assert(raises-timeout-p - (sb-ext:with-timeout 0.5 - (sb-ext:with-timeout 2 - (sleep 2)))))) - -(with-test (:name (:with-timeout :many-at-the-same-time) - :skipped-on (not :sb-thread) - :broken-on :win32) - (let ((ok t)) - (let ((threads (loop repeat 10 collect - (sb-thread:make-thread - (lambda () - (handler-case - (sb-ext:with-timeout 0.5 - (sleep 5) - (setf ok nil) - (format t "~%not ok~%")) - (timeout ()))))))) - (assert (not (raises-timeout-p - (sb-ext:with-timeout 20 - (mapc #'sb-thread:join-thread threads))))) - (assert ok)))) - -;;; FIXME: Since timeouts do not work on Windows this would loop -;;; forever. -(with-test (:name (:hash-cache :interrupt) :skipped-on :win32) - (let* ((type1 (random-type 500)) - (type2 (random-type 500)) - (wanted (subtypep type1 type2))) - (dotimes (i 100) - (block foo - (sb-ext:schedule-timer (sb-ext:make-timer - (lambda () - (assert (eq wanted (subtypep type1 type2))) - (return-from foo))) - 0.05) - (loop - (assert (eq wanted (subtypep type1 type2)))))))) - -;;; Used to hang occasionally at least on x86. Two bugs caused it: -;;; running out of stack (due to repeating timers being rescheduled -;;; before they ran) and dying threads were open interrupts. -(with-test (:name (:timer :parallel-unschedule) - :skipped-on (not :sb-thread) - :broken-on (or :ppc :win32)) - (let ((timer (sb-ext:make-timer (lambda () 42) :name "parallel schedulers")) - (other nil)) - (flet ((flop () - (sleep (random 0.01)) - (loop repeat 10000 - do (sb-ext:unschedule-timer timer)))) - (sb-sys:with-deadline (:seconds 30) - (loop repeat 5 - do (mapcar #'sb-thread:join-thread - (loop for i from 1 upto 10 - collect (let* ((thread (sb-thread:make-thread #'flop - :name (format nil "scheduler ~A" i))) - (ticker (make-limited-timer (lambda () 13) - 1000 - :thread (or other thread) - :name (format nil "ticker ~A" i)))) - (setf other thread) - (sb-ext:schedule-timer ticker 0 :repeat-interval 0.00001) - thread))))) - (sb-ext:unschedule-timer timer)))) - -;;;; FIXME: OS X 10.4 doesn't like these being at all, and gives us a SIGSEGV -;;;; instead of using the Mach expection system! 10.5 on the other tends to -;;;; lose() here with interrupt already pending. :/ -;;;; -;;;; Used to have problems in genereal, see comment on (:TIMER -;;;; :PARALLEL-UNSCHEDULE). -(with-test (:name (:timer :schedule-stress) - :broken-on :win32) - (flet ((test () - (let* ((slow-timers - (loop for i from 1 upto 1 - collect (make-limited-timer - (lambda () 13) - 1000 - :name (format nil "slow ~A" i)))) - (fast-timer (make-limited-timer (lambda () 42) 1000 - :name "fast"))) - (sb-ext:schedule-timer fast-timer 0.0001 :repeat-interval 0.0001) - (dolist (timer slow-timers) - (sb-ext:schedule-timer timer (random 0.1) - :repeat-interval (random 0.1))) - (dolist (timer slow-timers) - (sb-ext:unschedule-timer timer)) - (sb-ext:unschedule-timer fast-timer)))) - #+sb-thread - (mapcar #'sb-thread:join-thread - (loop repeat 10 collect (sb-thread:make-thread #'test))) - #-sb-thread - (loop repeat 10 do (test)))) - (with-test (:name (:timer :threaded-stress) :skipped-on (not :sb-thread) :broken-on :x86 @@ -318,14 +42,4 @@ ;; A timer with a repeat interval can be configured to "catch up" in ;; case of missed calls. -(with-test (:name (:timer :catch-up)) - (flet ((test (&rest args) - (let ((timer (make-timer (lambda ())))) - (apply #'schedule-timer timer .01 args) - (unschedule-timer timer)))) - ;; :CATCH-UP does not make sense without :REPEAT-INTERVAL. - (assert-error (test :catch-up nil)) - (assert-error (test :catch-up t)) - ;; These combinations are allowed. - (test :repeat-interval .01 :catch-up nil) - (test :repeat-interval .01 :catch-up t))) + From 16ed0bcebe4c1e37f0ace128d19d0ea1ba2150a3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 6 Aug 2020 02:20:09 +0300 Subject: [PATCH 0322/4023] Restore a test file. --- tests/timer.impure.lisp | 288 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 287 insertions(+), 1 deletion(-) diff --git a/tests/timer.impure.lisp b/tests/timer.impure.lisp index 0dbab1d341..8583f6d9bb 100644 --- a/tests/timer.impure.lisp +++ b/tests/timer.impure.lisp @@ -9,6 +9,282 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. +#+interpreter (sb-ext:exit :code 104) + +(with-test (:name :heap) + (let* ((size 1000) + (heap (make-array size :adjustable t :fill-pointer 0)) + (unsorted (loop for i below size collect (random size))) + (sorted (sort (copy-list unsorted) #'>=)) + heap-sorted) + (map nil #'(lambda (val) (sb-impl::heap-insert heap val)) unsorted) + (setf heap-sorted (loop for i below size + collect (sb-impl::heap-extract-maximum heap))) + (unless (equal sorted heap-sorted) + (error "Heap sort failure ~S" heap-sorted)))) + +(sb-alien:define-alien-routine "check_deferrables_blocked_or_lose" + void + (where sb-alien:unsigned-long)) +(sb-alien:define-alien-routine "check_deferrables_unblocked_or_lose" + void + (where sb-alien:unsigned-long)) + +(defun make-limited-timer (fn n &rest args) + (let (timer) + (setq timer + (apply #'sb-ext:make-timer + (lambda () + (sb-sys:without-interrupts + (decf n) + (cond ((minusp n) + (warn "Unscheduling timer ~A ~ + upon reaching run limit. System too slow?" + timer) + (sb-ext:unschedule-timer timer)) + (t + (sb-sys:allow-with-interrupts + (funcall fn)))))) + args)))) + +(defun make-and-schedule-and-wait (fn time) + (let ((finishedp nil)) + (sb-ext:schedule-timer (sb-ext:make-timer + (lambda () + (sb-sys:without-interrupts + (unwind-protect + (sb-sys:allow-with-interrupts + (funcall fn)) + (setq finishedp t))))) + time) + (loop until finishedp))) + +(with-test (:name (:timer :deferrables-blocked) :skipped-on :win32) + (make-and-schedule-and-wait (lambda () + (check-deferrables-blocked-or-lose 0)) + (random 0.1)) + (check-deferrables-unblocked-or-lose 0)) + +(with-test (:name (:timer :deferrables-unblocked) :skipped-on :win32) + (make-and-schedule-and-wait (lambda () + (sb-sys:with-interrupts + (check-deferrables-unblocked-or-lose 0))) + (random 0.1)) + (check-deferrables-unblocked-or-lose 0)) + +(with-test (:name (:timer :deferrables-unblocked :unwind) :skipped-on :win32) + (catch 'xxx + (make-and-schedule-and-wait (lambda () + (check-deferrables-blocked-or-lose 0) + (throw 'xxx nil)) + (random 0.1)) + (sleep 1)) + (check-deferrables-unblocked-or-lose 0)) + +(defmacro raises-timeout-p (&body body) + `(handler-case (progn (progn ,@body) nil) + (sb-ext:timeout () t))) + +(with-test (:name (:timer :relative) + :fails-on (and :sparc :linux) + :skipped-on :win32) + (let* ((has-run-p nil) + (timer (make-timer (lambda () (setq has-run-p t)) + :name "simple timer"))) + (schedule-timer timer 0.5) + (sleep 0.2) + (assert (not has-run-p)) + (sleep 0.5) + (assert has-run-p) + (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) + +(with-test (:name (:timer :absolute) + :fails-on (and :sparc :linux) + :skipped-on :win32) + (let* ((has-run-p nil) + (timer (make-timer (lambda () (setq has-run-p t)) + :name "simple timer"))) + (schedule-timer timer (+ 1/2 (get-universal-time)) :absolute-p t) + (sleep 0.2) + (assert (not has-run-p)) + (sleep 0.5) + (assert has-run-p) + (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) + +(with-test (:name (:timer :other-thread) :skipped-on (not :sb-thread)) + (let* ((sem (sb-thread:make-semaphore)) + (thread (sb-thread:make-thread (lambda () (sb-thread:wait-on-semaphore sem)))) + (timer (make-timer (lambda () + (assert (eq thread sb-thread:*current-thread*))) + :thread thread))) + (schedule-timer timer 0.1) + (sb-thread:signal-semaphore sem) + (assert (sb-thread:join-thread thread)))) + +(with-test (:name (:timer :new-thread) :skipped-on (not :sb-thread)) + (let* ((original-thread sb-thread:*current-thread*) + (timer (make-timer + (lambda () + (assert (not (eq original-thread + sb-thread:*current-thread*)))) + :thread t))) + (schedule-timer timer 0.1))) + +(with-test (:name (:timer :repeat-and-unschedule) + :fails-on (and :sparc :linux) + :skipped-on :win32) + (let* ((run-count 0) + timer) + (setq timer + (make-timer (lambda () + (when (= 5 (incf run-count)) + (unschedule-timer timer))))) + (schedule-timer timer 0 :repeat-interval 0.2) + (assert (timer-scheduled-p timer :delta 0.3)) + (sleep 1.3) + (assert (= 5 run-count)) + (assert (not (timer-scheduled-p timer))) + (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) + +(with-test (:name (:timer :reschedule) :skipped-on :win32) + (let* ((has-run-p nil) + (timer (make-timer (lambda () + (setq has-run-p t))))) + (schedule-timer timer 0.2) + (schedule-timer timer 0.3) + (sleep 0.5) + (assert has-run-p) + (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) + +(with-test (:name (:timer :stress) :skipped-on :win32) + (let ((time (1+ (get-universal-time)))) + (loop repeat 200 do + (schedule-timer (make-timer (lambda ())) time :absolute-p t)) + (sleep 2) + (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) + +(with-test (:name (:timer :stress2) :skipped-on :win32) + (let ((time (1+ (get-universal-time))) + (n 0)) + (loop for time-n from time upto (+ 1/10 time) by (/ 1/10 200) + do (schedule-timer (make-timer (lambda ())) time-n :absolute-p t) + (incf n)) + (sleep 2) + (assert (zerop (length (sb-impl::%pqueue-contents sb-impl::*schedule*)))))) + +(with-test (:name (:with-timeout :timeout) :skipped-on :win32) + (assert (raises-timeout-p + (sb-ext:with-timeout 0.2 + (sleep 1))))) + +(with-test (:name (:with-timeout :fall-through) :skipped-on :win32) + (assert (not (raises-timeout-p + (sb-ext:with-timeout 0.3 + (sleep 0.1)))))) + +(with-test (:name (:with-timeout :nested-timeout-smaller) :skipped-on :win32) + (assert(raises-timeout-p + (sb-ext:with-timeout 10 + (sb-ext:with-timeout 0.5 + (sleep 2)))))) + +(with-test (:name (:with-timeout :nested-timeout-bigger) :skipped-on :win32) + (assert(raises-timeout-p + (sb-ext:with-timeout 0.5 + (sb-ext:with-timeout 2 + (sleep 2)))))) + +(with-test (:name (:with-timeout :many-at-the-same-time) + :skipped-on (not :sb-thread) + :broken-on :win32) + (let ((ok t)) + (let ((threads (loop repeat 10 collect + (sb-thread:make-thread + (lambda () + (handler-case + (sb-ext:with-timeout 0.5 + (sleep 5) + (setf ok nil) + (format t "~%not ok~%")) + (timeout ()))))))) + (assert (not (raises-timeout-p + (sb-ext:with-timeout 20 + (mapc #'sb-thread:join-thread threads))))) + (assert ok)))) + +;;; FIXME: Since timeouts do not work on Windows this would loop +;;; forever. +(with-test (:name (:hash-cache :interrupt) :skipped-on :win32) + (let* ((type1 (random-type 500)) + (type2 (random-type 500)) + (wanted (subtypep type1 type2))) + (dotimes (i 100) + (block foo + (sb-ext:schedule-timer (sb-ext:make-timer + (lambda () + (assert (eq wanted (subtypep type1 type2))) + (return-from foo))) + 0.05) + (loop + (assert (eq wanted (subtypep type1 type2)))))))) + +;;; Used to hang occasionally at least on x86. Two bugs caused it: +;;; running out of stack (due to repeating timers being rescheduled +;;; before they ran) and dying threads were open interrupts. +(with-test (:name (:timer :parallel-unschedule) + :skipped-on (not :sb-thread) + :broken-on (or :ppc :win32)) + (let ((timer (sb-ext:make-timer (lambda () 42) :name "parallel schedulers")) + (other nil)) + (flet ((flop () + (sleep (random 0.01)) + (loop repeat 10000 + do (sb-ext:unschedule-timer timer)))) + (sb-sys:with-deadline (:seconds 30) + (loop repeat 5 + do (mapcar #'sb-thread:join-thread + (loop for i from 1 upto 10 + collect (let* ((thread (sb-thread:make-thread #'flop + :name (format nil "scheduler ~A" i))) + (ticker (make-limited-timer (lambda () 13) + 1000 + :thread (or other thread) + :name (format nil "ticker ~A" i)))) + (setf other thread) + (sb-ext:schedule-timer ticker 0 :repeat-interval 0.00001) + thread))))) + (sb-ext:unschedule-timer timer)))) + +;;;; FIXME: OS X 10.4 doesn't like these being at all, and gives us a SIGSEGV +;;;; instead of using the Mach expection system! 10.5 on the other tends to +;;;; lose() here with interrupt already pending. :/ +;;;; +;;;; Used to have problems in genereal, see comment on (:TIMER +;;;; :PARALLEL-UNSCHEDULE). +(with-test (:name (:timer :schedule-stress) + :broken-on :win32) + (flet ((test () + (let* ((slow-timers + (loop for i from 1 upto 1 + collect (make-limited-timer + (lambda () 13) + 1000 + :name (format nil "slow ~A" i)))) + (fast-timer (make-limited-timer (lambda () 42) 1000 + :name "fast"))) + (sb-ext:schedule-timer fast-timer 0.0001 :repeat-interval 0.0001) + (dolist (timer slow-timers) + (sb-ext:schedule-timer timer (random 0.1) + :repeat-interval (random 0.1))) + (dolist (timer slow-timers) + (sb-ext:unschedule-timer timer)) + (sb-ext:unschedule-timer fast-timer)))) + #+sb-thread + (mapcar #'sb-thread:join-thread + (loop repeat 10 collect (sb-thread:make-thread #'test))) + #-sb-thread + (loop repeat 10 do (test)))) + (with-test (:name (:timer :threaded-stress) :skipped-on (not :sb-thread) :broken-on :x86 @@ -42,4 +318,14 @@ ;; A timer with a repeat interval can be configured to "catch up" in ;; case of missed calls. - +(with-test (:name (:timer :catch-up)) + (flet ((test (&rest args) + (let ((timer (make-timer (lambda ())))) + (apply #'schedule-timer timer .01 args) + (unschedule-timer timer)))) + ;; :CATCH-UP does not make sense without :REPEAT-INTERVAL. + (assert-error (test :catch-up nil)) + (assert-error (test :catch-up t)) + ;; These combinations are allowed. + (test :repeat-interval .01 :catch-up nil) + (test :repeat-interval .01 :catch-up t))) From 9ba5caf3b009db8a2c57c10bb4d52b47d5058183 Mon Sep 17 00:00:00 2001 From: Robert Swindells Date: Wed, 29 Jul 2020 13:23:24 +0100 Subject: [PATCH 0323/4023] Add support for NetBSD/aarch64. --- make-config.sh | 5 +++ src/compiler/arm64/parms.lisp | 3 +- src/runtime/Config.arm64-netbsd | 21 ++++++++++ src/runtime/arm64-bsd-os.c | 70 +++++++++++++++++++++++++++++++-- 4 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 src/runtime/Config.arm64-netbsd diff --git a/make-config.sh b/make-config.sh index c548921ba1..2c07bf7934 100755 --- a/make-config.sh +++ b/make-config.sh @@ -397,6 +397,11 @@ if [ "$sbcl_os" = "darwin" ] && [ "`/usr/sbin/sysctl -n hw.optional.x86_64`" = " guessed_sbcl_arch=x86-64 fi +# Under NetBSD, uname -m returns "evbarm" even if CPU is arm64. +if [ "$sbcl_os" = "netbsd" ] && [ `uname -p` = "aarch64" ]; then + guessed_sbcl_arch=arm64 +fi + echo //setting up CPU-architecture-dependent information if test -n "$SBCL_ARCH" then diff --git a/src/compiler/arm64/parms.lisp b/src/compiler/arm64/parms.lisp index 20728ae1ce..86c7802e2b 100644 --- a/src/compiler/arm64/parms.lisp +++ b/src/compiler/arm64/parms.lisp @@ -109,7 +109,8 @@ (defparameter dynamic-0-space-end #x66fff000))) #+gencgc -(!gencgc-space-setup #xF0000000 :dynamic-space-start #x1000000000) +(!gencgc-space-setup #+(or linux openbsd) #xF0000000 #+netbsd #x2F0000000 + :dynamic-space-start #x1000000000) (defconstant linkage-table-growth-direction :up) (defconstant linkage-table-entry-size 16) diff --git a/src/runtime/Config.arm64-netbsd b/src/runtime/Config.arm64-netbsd new file mode 100644 index 0000000000..93470e33fc --- /dev/null +++ b/src/runtime/Config.arm64-netbsd @@ -0,0 +1,21 @@ +# -*- makefile -*- for the C-level run-time support for SBCL + +# This software is part of the SBCL system. See the README file for +# more information. +# +# This software is derived from the CMU CL system, which was +# written at Carnegie Mellon University and released into the +# public domain. The software is in the public domain and is +# provided with absolutely no warranty. See the COPYING and CREDITS +# files for more information. + +include Config.arm64-bsd + +OS_LIBS = -lutil + +ifdef LISP_FEATURE_SB_THREAD + OS_LIBS += -lpthread -lrt +endif + +LINKFLAGS += -export-dynamic +LDFLAGS += -export-dynamic diff --git a/src/runtime/arm64-bsd-os.c b/src/runtime/arm64-bsd-os.c index 1b027853ea..30139ccbef 100644 --- a/src/runtime/arm64-bsd-os.c +++ b/src/runtime/arm64-bsd-os.c @@ -37,6 +37,7 @@ #include "validate.h" size_t os_vm_page_size; +#if defined(LISP_FEATURE_OPENBSD) int arch_os_thread_init(struct thread *thread) { stack_t sigstack; @@ -56,7 +57,6 @@ int arch_os_thread_cleanup(struct thread *thread) { return 1; /* success */ } -#if defined(LISP_FEATURE_OPENBSD) os_context_register_t * os_context_register_addr(os_context_t *context, int regno) @@ -85,8 +85,6 @@ os_restore_fp_control(os_context_t *context) { } -#endif - os_context_register_t * os_context_lr_addr(os_context_t *context) { @@ -100,3 +98,69 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length) = (os_vm_address_t)(((uintptr_t) address) + length); __clear_cache(address, end_address); } + +#elif defined(LISP_FEATURE_NETBSD) + +int arch_os_thread_init(struct thread *thread) { + stack_t sigstack; +#ifdef LISP_FEATURE_SB_THREAD +#ifdef LISP_FEATURE_GCC_TLS + current_thread = thread; +#else + pthread_setspecific(specials,thread); +#endif +#endif + /* Signal handlers are normally run on the main stack, but we've + * swapped stacks, require that the control stack contain only + * boxed data, and expands upwards while the C stack expands + * downwards. */ + sigstack.ss_sp = calc_altstack_base(thread); + sigstack.ss_flags = 0; + sigstack.ss_size = calc_altstack_size(thread); + if(sigaltstack(&sigstack,0)<0) + lose("Cannot sigaltstack: %s\n",strerror(errno)); + + return 1; /* success */ +} +int arch_os_thread_cleanup(struct thread *thread) { + return 1; /* success */ +} + +os_context_register_t * +os_context_register_addr(os_context_t *context, int offset) +{ + return (os_context_register_t *)&(context->uc_mcontext.__gregs[offset]); +} + +os_context_register_t * +os_context_pc_addr(os_context_t *context) +{ + return os_context_register_addr(context, 32); +} + +os_context_register_t * +os_context_lr_addr(os_context_t *context) +{ + return os_context_register_addr(context, reg_LR); +} + +void +os_restore_fp_control(os_context_t *context) +{ + /* FIXME: Implement. */ +} + +os_context_register_t * +os_context_float_register_addr(os_context_t *context, int offset) +{ + return (os_context_register_t*) + &context->uc_mcontext.__fregs.__qregs[offset]; +} + +void +os_flush_icache(os_vm_address_t address, os_vm_size_t length) +{ + __builtin___clear_cache(address, address + length); +} + +#endif From 0496e53a5d6a392aae2febb4dc94cbbbf96e7a5c Mon Sep 17 00:00:00 2001 From: Robert Swindells Date: Wed, 29 Jul 2020 13:24:16 +0100 Subject: [PATCH 0324/4023] Use longer *minimum-sleep* time on NetBSD as well. --- contrib/sb-concurrency/tests/test-frlock.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/sb-concurrency/tests/test-frlock.lisp b/contrib/sb-concurrency/tests/test-frlock.lisp index f9dc3ffbf3..471d34fc64 100644 --- a/contrib/sb-concurrency/tests/test-frlock.lisp +++ b/contrib/sb-concurrency/tests/test-frlock.lisp @@ -19,8 +19,8 @@ ;; XXX something like clock_getres(CLOCK_REALTIME, ...) would be better (defvar *minimum-sleep* - #+(or openbsd sunos) 0.01 - #-(or openbsd sunos) 0.0001) + #+(or openbsd netbsd sunos) 0.01 + #-(or openbsd netbsd sunos) 0.0001) (defun test-frlocks (&key (reader-count (min (* 12 *cpus*) 200)) (read-count 1000000) From aa6437fd95bfa2ccdd9b0aec39914908a12ff125 Mon Sep 17 00:00:00 2001 From: Robert Swindells Date: Thu, 30 Jul 2020 01:16:46 +0100 Subject: [PATCH 0325/4023] Zero out the frame pointer so that backtrace stops at the correct place. --- src/runtime/thread.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 4074a0d513..04c9b59690 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -1034,6 +1034,7 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { #endif #ifndef LISP_FEATURE_C_STACK_IS_CONTROL_STACK access_control_stack_pointer(th)=th->control_stack_start; + access_control_frame_pointer(th)=0; #endif th->interrupt_data->pending_handler = 0; From 10bfc6a78976393e014d189fbd5fdd6383187f38 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 22:13:52 -0400 Subject: [PATCH 0326/4023] Number the failing runs if using --runs_per_test --- tests/parallel-exec.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 480b037c84..b00edbfd80 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -53,14 +53,15 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ #+nil (format t "Runner is waiting on: ~S~%" subprocess-list) (multiple-value-bind (pid status) (sb-posix:wait) (decf subprocess-count) - (let ((process (assoc pid subprocess-list))) + (let ((process (assoc pid subprocess-list)) + (code (ash status -8)) + (et)) (unless process (warn "Whoa! Process ~D is an unexpected child" pid) (return-from wait (wait))) (setq subprocess-list (delete process subprocess-list)) - (let ((code (ash status -8)) - (filename (cadr process)) - (et (- (get-internal-real-time) (caddr process)))) + (destructuring-bind ((filename . iteration) start-time) (cdr process) + (setq et (- (get-internal-real-time) start-time)) (when vop-summary-stats-p (unless (sum-vop-usage (format nil "$logdir/~a.vop-usage" filename) t) (when (or (search ".pure" filename) (search ".impure" filename)) @@ -68,8 +69,9 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (cond ((eq code 104) (format t "~A: success (~d msec)~%" filename et)) (t - (format t "~A: status ~D (~d msec)~%" filename code et) - (push filename losing))))))) + (format t "~A~@[[~d]~]: status ~D (~d msec)~%" + filename iteration code et) + (push (list filename iteration pid) losing))))))) (sum-vop-usage (input deletep) (with-open-file (f input :if-does-not-exist nil) ;; No vop coverage file from shell script tests or any test @@ -122,7 +124,7 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (exit :code (if (unexpected-failures) 1 104))))) (format t "~A: pid ~d~@[ (trial ~d)~]~%" (car file) pid (cdr file)) (incf subprocess-count) - (push (list pid (car file) (get-internal-real-time)) subprocess-list))) + (push (list pid file (get-internal-real-time)) subprocess-list))) (loop (if (plusp subprocess-count) (wait) (return))) (when vop-summary-stats-p From 84cc010ccf034e6e35ed58d1f6665a1427577462 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 22:34:40 -0400 Subject: [PATCH 0327/4023] Rename undo_init_new_thread -> unregister_thread --- src/runtime/thread.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 04c9b59690..822c8d843e 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -422,8 +422,8 @@ init_new_thread(struct thread *th, } static void -undo_init_new_thread(struct thread *th, - init_thread_data __attribute__((unused)) *scribble) +unregister_thread(struct thread *th, + init_thread_data __attribute__((unused)) *scribble) { int lock_ret; @@ -498,13 +498,12 @@ undo_init_new_thread(struct thread *th, /* Undo the association of the current pthread to its `struct thread', * such that we can call arch_os_get_current_thread() later in this * thread and cleanly get back NULL. */ - /* FIXME: this seems to be prone to causing lossage of signals because - * until setting current_thread to NULL, lisp_thread_p() returns 1, - * so maybe_resignal_to_lisp_thread() would consider this thread ok to - * receive a signal if delivered to a non-lisp thread. But then we just - * block everything and disappear. It's essentially the same problem as - * the GC pending signal that has to be explicitly discarded, which is - * the right disposition of that signal, but not signals in general */ + /* FIXME: what if, after we blocked signals, someone uses INTERRUPT-THREAD + * on this thread? It's no longer a lisp thread; I suspect the signal + * will be redirected to a lisp thread. + * Can anything else go wrong with other signals? Nothing else should + * direct signals specifically to this thread. Per-process signals are ok + * because the kernel picks a thread in which a signal isn't blocked */ #ifdef LISP_FEATURE_GCC_TLS current_thread = NULL; #else @@ -563,7 +562,7 @@ void* new_thread_trampoline(void* arg) // (a regression test asserts that not even a THREAD instance is on the stack) long result = funcall1(startfun, (lispobj)lispthread); // both pinned // Close the GC region and unlink from all_threads - undo_init_new_thread(th, 0); + unregister_thread(th, 0); #else // !PAUSELESS_THREADSTART @@ -584,7 +583,7 @@ void* new_thread_trampoline(void* arg) GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK, 0); result = funcall0(function); - undo_init_new_thread(th, &scribble); + unregister_thread(th, &scribble); #ifndef OS_THREAD_STACK schedule_thread_post_mortem(th); @@ -724,10 +723,10 @@ detach_os_thread(init_thread_data *scribble) struct thread *th = arch_os_get_current_thread(); odxprint(misc, "detach_os_thread: detaching"); - undo_init_new_thread(th, scribble); + unregister_thread(th, scribble); /* We have to clear a STOP_FOR_GC signal if pending. Consider: - * - on entry to undo_init_new_thread, we block all signals + * - on entry to unregister_thread, we block all signals * - simultaneously some other thread decides that it needs to initiate a GC * - that thread observes that this thread exists in all_threads and sends * STOP_FOR_GC, so it becomes pending but undeliverable in this thread From af5797bff1e75e360906de3949dd645b4a392fd3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 22:39:06 -0400 Subject: [PATCH 0328/4023] Get rid of "maybe" resignal to lisp thread because a predicate with side-effects is iffy at best, but more so naming it "maybe" is quite ambiguous as to whether it did or didn't. --- src/runtime/interrupt.c | 61 ++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 5b772316a4..162bf08824 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -180,48 +180,35 @@ static void sigmask_logandc(sigset_t *dest, const sigset_t *source) #ifndef LISP_FEATURE_WIN32 static void -add_handled_signals(sigset_t *sigset) +resignal_to_lisp_thread(int signal, os_context_t *context) { + if (!sigismember(&deferrable_sigset,signal)) { + corruption_warning_and_maybe_lose +#ifdef LISP_FEATURE_SB_THREAD + ("Received signal %d @ %lx in non-lisp"THREAD_ID_LABEL", resignaling to a lisp thread.", + signal, *os_context_pc_addr(context), THREAD_ID_VALUE); +#else + ("Received signal %d in non-lisp thread, resignaling to a lisp thread.", signal); +#endif + } + sigset_t sigset; + sigemptyset(&sigset); int i; for(i = 1; i < NSIG; i++) { if (!(ARE_SAME_HANDLER(interrupt_low_level_handlers[i], SIG_DFL)) || !(ARE_SAME_HANDLER(interrupt_handlers[i].c, SIG_DFL))) { - sigaddset(sigset, i); + sigaddset(&sigset, i); } } + thread_sigmask(SIG_BLOCK, &sigset, 0); + // This arranges for every handled signal to be blocked on return from this + // handler invocation, presumably because that avoids further detours through + // this thread's handler for signals that we don't want it to handle. + sigmask_logior(os_context_sigmask_addr(context), &sigset); + kill(getpid(), signal); } #endif -static boolean -maybe_resignal_to_lisp_thread(int signal, os_context_t *context) -{ -#ifndef LISP_FEATURE_WIN32 - if (!lisp_thread_p(context)) { - if (!(sigismember(&deferrable_sigset,signal))) { - corruption_warning_and_maybe_lose -#ifdef LISP_FEATURE_SB_THREAD - ("Received signal %d in non-lisp thread %lu, resignalling to a lisp thread.", - signal, pthread_self()); -#else - ("Received signal %d in non-lisp thread, resignalling to a lisp thread.", - signal); -#endif - } - sigset_t sigset; - sigemptyset(&sigset); - add_handled_signals(&sigset); - thread_sigmask(SIG_BLOCK, &sigset, 0); - // This arranges for every handled signal to be blocked on return from this - // handler invocation, presumably because that avoids further detours through - // this thread's handler for signals that we don't want it to handle. - sigmask_logior(os_context_sigmask_addr(context), &sigset); - kill(getpid(), signal); - return 1; - } else -#endif - return 0; -} - #if INSTALL_SIG_MEMORY_FAULT_HANDLER && defined(THREAD_SANITIZER) /* Under TSAN, any delivered signal blocks all other signals regardless of the * 'sa_mask' given to sigaction(). This is courtesy of an interceptor - @@ -261,16 +248,20 @@ maybe_resignal_to_lisp_thread(int signal, os_context_t *context) * kernel properly, so we fix it up ourselves in the * arch_os_get_context(..) function. -- CSR, 2002-07-23 */ +#ifdef LISP_FEATURE_WIN32 +# define should_handle_in_this_thread(c) (1) +#else +# define should_handle_in_this_thread(c) lisp_thread_p(c) +#endif #define SAVE_ERRNO(signal,context,void_context) \ { \ int _saved_errno = errno; \ UNBLOCK_SIGSEGV(); \ RESTORE_FP_CONTROL_WORD(context,void_context); \ - if (!maybe_resignal_to_lisp_thread(signal, context)) \ - { + if (should_handle_in_this_thread(context)) { #define RESTORE_ERRNO \ - } \ + } else resignal_to_lisp_thread(signal,void_context); \ errno = _saved_errno; \ } From 2f5c82afe0f91fb32f5b8fc552c794df8dae912b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 23:12:08 -0400 Subject: [PATCH 0329/4023] Enable pauseless-threadstart for other linux platforms --- src/code/target-thread.lisp | 22 ++++++++++----- src/cold/shared.lisp | 3 +-- src/runtime/thread.c | 20 +++++++++----- tests/make-thread.impure.lisp | 51 ++++++++++++++++++++++------------- 4 files changed, 62 insertions(+), 34 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 03d0d3173f..5cc79d0d3d 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1658,13 +1658,23 @@ session." #+pauseless-threadstart ; new way (progn ;;; Return T if the thread was created -(defun pthread-create (thread stack-base) +(defun pthread-create (thread thread-sap) (aver (memq thread *starting-threads*)) (let ((attr (foreign-symbol-sap "new_lisp_thread_attr" t))) - (and (= 0 (alien-funcall - (extern-alien "pthread_attr_setstack" - (function int system-area-pointer unsigned unsigned)) - attr stack-base (extern-alien "thread_control_stack_size" unsigned))) + (and (multiple-value-bind (c-stack-base c-stack-size) + #+c-stack-is-control-stack + (values (sap-ref-sap thread-sap (ash sb-vm::thread-control-stack-start-slot + sb-vm:word-shift)) + (extern-alien "thread_control_stack_size" unsigned)) + #-c-stack-is-control-stack + (values (sap-ref-sap thread-sap (ash sb-vm::thread-alien-stack-start-slot + sb-vm:word-shift)) + (extern-alien "thread_alien_stack_size" unsigned)) + (= 0 (alien-funcall + (extern-alien "pthread_attr_setstack" + (function int system-area-pointer system-area-pointer + unsigned)) + attr c-stack-base c-stack-size))) (with-pinned-objects (thread) (= 0 (alien-funcall (extern-alien "pthread_create" @@ -1964,7 +1974,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; them, there should usually be only one item to delete from *STARTING-THREADS*. (let ((old (delete 0 *starting-threads*))) (setf *starting-threads* (rplacd cell old)) - (setq created (pthread-create thread stack-base)) + (setq created (pthread-create thread thread-sap)) (cond (created ; Still holding the MAKE-THREAD-LOCK, expose thread in (LIST-ALL-THREADS). ;; On CPUs where CAS can spuriously fail, this probably needs to loop and retry. ;; It's ok if the thread changed 0 -> {1 | -1}, then failure here is correct. diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 43241ff79d..197678416a 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -245,8 +245,7 @@ (arch (target-platform-keyword target-feature-list))) (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) (pushnew :futex-use-tid target-feature-list)) - (when (featurep '(:and :linux (:or :x86 :x86-64) :sb-thread - (:not (:or :sb-safepoint :sb-thruption))) + (when (featurep '(:and :linux :sb-thread (:not :sb-safepoint)) target-feature-list) (push :pauseless-threadstart target-feature-list)) (when (and (member :x86 target-feature-list) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 822c8d843e..171dc74be8 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -67,6 +67,8 @@ static __attribute__((unused)) struct thread *postmortem_thread; #endif int dynamic_values_bytes = 4096 * sizeof(lispobj); // same for all threads +// exposed to lisp for pthread_create if not C_STACK_IS_CONTROL_STACK +os_vm_size_t thread_alien_stack_size = ALIEN_STACK_SIZE; struct thread *all_threads; #ifdef LISP_FEATURE_SB_THREAD @@ -530,14 +532,8 @@ void* new_thread_trampoline(void* arg) gc_assert(header_widetag(startup_info->header) == SIMPLE_VECTOR_WIDETAG); lispobj startfun = startup_info->data[0]; // 'startup_info' is pinned gc_assert(functionp(startfun)); - // The lisp thread instance stores the stack end for one purpose only, for - // SB-EXT:STACK-ALLOCATED-P to quickly check whether an object is on _any_ - // thread's stack using only the all-threads tree and not acquiring a lock - // on the primitive thread. This is the exactly-calculated end. - lispthread->stack_end = (lispobj)th->control_stack_end; #if defined LISP_FEATURE_C_STACK_IS_CONTROL_STACK && !defined ADDRESS_SANITIZER - // ... but GC can benefit from knowing that the _effective_ end of - // the ambiguous root range is not as high as the accessible end. + // GC can benefit from knowing the _effective_ end of the ambiguous root range. // Nothing at a higher address than &arg needs to be scanned for ambiguous roots. // For x86 + linux this optimization skips over about 800 words in the stack scan, // and for x86-64 it skip about 550 words as observed via: @@ -556,6 +552,16 @@ void* new_thread_trampoline(void* arg) #endif th->os_kernel_tid = sb_GetTID(); init_new_thread(th, 0, 0, 0); + // The lisp thread instance stores the stack end for one purpose only, for + // SB-EXT:STACK-ALLOCATED-P to quickly check whether an object is on some + // thread's stack by looking only the all-threads tree and not acquiring a lock + // on any primitive thread. + // Storing through a pointer to lisp memory has to wait until linking to all_threads, + // lest the WP fault handler think this isn't a lisp thread. Consider a creating + // thread that made a THREAD instance which (on a precise GC architecture) gets + // moved to a protectable page. There's a window in which it could happen just + // after making the instance and before pushing it into *STARTING-THREADS*. + lispthread->stack_end = (lispobj)th->control_stack_end; // Passing the untagged pointer ensures 2 things: // - that the pinning mechanism works as designed, and not just by accident. // - that the initial stack does not contain a lisp pointer after it is not needed. diff --git a/tests/make-thread.impure.lisp b/tests/make-thread.impure.lisp index 67c5a6f1cf..a94db1db84 100644 --- a/tests/make-thread.impure.lisp +++ b/tests/make-thread.impure.lisp @@ -28,15 +28,21 @@ (roots)) (declare (type (member nil t :everything) allwords)) (without-gcing - (let* ((stack-low (get-lisp-obj-address sb-vm:*control-stack-start*)) - (stack-high (get-lisp-obj-address sb-vm:*control-stack-end*)) - (nwords (ash (- stack-high (sap-int current-sp)) (- sb-vm:word-shift))) - (array (make-array nwords :element-type 'sb-ext:word))) + (binding* ((stack-low (get-lisp-obj-address sb-vm:*control-stack-start*)) + (stack-high (get-lisp-obj-address sb-vm:*control-stack-end*)) + ((nwords copy-from direction base) + #+c-stack-is-control-stack ; growth direction is always down + (values (ash (- stack-high (sap-int current-sp)) (- sb-vm:word-shift)) + current-sp #\- "sp") + #-c-stack-is-control-stack ; growth direction is always up + (values (ash (- (sap-int current-sp) stack-low) (- sb-vm:word-shift)) + (int-sap stack-low) #\+ "base")) + (array (make-array nwords :element-type 'sb-ext:word))) (when print - (format t "SP=end-~dw (range = ~x..~x)~%" nwords stack-low stack-high)) + (format t "SP=~a~dw (range = ~x..~x)~%" direction nwords stack-low stack-high)) (alien-funcall (extern-alien "memcpy" (function void system-area-pointer system-area-pointer unsigned)) - (vector-sap array) current-sp (* nwords sb-vm:n-word-bytes)) + (vector-sap array) copy-from (* nwords sb-vm:n-word-bytes)) (loop for i downfrom (1- nwords) to 0 by 1 do (let ((word (aref array i))) (when (or (/= word sb-vm:nil-value) allwords) @@ -44,27 +50,33 @@ word))) (cond ((/= baseptr 0) ; an object reference (let ((obj (sb-vm::reconstitute-object (%make-lisp-obj baseptr)))) - (when (and (code-component-p obj) - (= (logand word sb-vm:lowtag-mask) sb-vm:fun-pointer-lowtag)) - (dotimes (i (code-n-entries obj)) - (when (= (get-lisp-obj-address (%code-entry-point obj i)) word) - (return (setq obj (%code-entry-point obj i)))))) + (when (code-component-p obj) + (cond + #+c-stack-is-control-stack + ((= (logand word sb-vm:lowtag-mask) sb-vm:fun-pointer-lowtag) + (dotimes (i (code-n-entries obj)) + (when (= (get-lisp-obj-address (%code-entry-point obj i)) word) + (return (setq obj (%code-entry-point obj i)))))) + #-c-stack-is-control-stack ; i.e. does this backend have LRAs + ((= (logand (sap-ref-word (int-sap (logandc2 word sb-vm:lowtag-mask)) 0) + sb-vm:widetag-mask) sb-vm:return-pc-widetag) + (setq obj (%make-lisp-obj word))))) ;; interior pointers to objects that contain instructions are OK, ;; otherwise only correctly tagged pointers. (when (or (typep obj '(or fdefn code-component funcallable-instance)) (= (get-lisp-obj-address obj) word)) (push obj roots) (when print - (format t "~x = sp[~5d] = ~16x (~A) " - (sap-int (sap+ current-sp (ash i sb-vm:word-shift))) - i - word + (format t "~x = ~a[~5d] = ~16x (~A) " + (sap-int (sap+ copy-from (ash i sb-vm:word-shift))) + base i word (or (generation-of obj) #\S)) ; S is for static (let ((*print-pretty* nil)) (cond ((consp obj) (format t "a cons")) #+sb-fasteval ((typep obj 'sb-interpreter::sexpr) (format t "a sexpr")) ((arrayp obj) (format t "a ~s" (type-of obj))) + #+c-stack-is-control-stack ((and (code-component-p obj) (>= word (sap-int (code-instructions obj)))) (format t "PC in ~a" obj)) @@ -72,9 +84,9 @@ (terpri))))) ((and print (or (eq allwords :everything) (and allwords (/= word 0)))) - (format t "~x = sp[~5d] = ~16x~%" - (sap-int (sap+ current-sp (ash i sb-vm:word-shift))) - i word))))))))) + (format t "~x = ~a[~5d] = ~16x~%" + (sap-int (sap+ copy-from (ash i sb-vm:word-shift))) + base i word))))))))) (if print (format t "~D roots~%" (length roots)) roots)) @@ -117,7 +129,8 @@ (let ((list (tryit :print nil))) ;; should be not many things pointed to by the stack (assert (< (length list) #+x86 38 ; more junk, I don't know why - #+x86-64 30)) ; less junk, I don't know why + #+x86-64 30 ; less junk, I don't know why + #-(or x86 x86-64) 44)) ; even more junk ;; Either no objects are in GC generation 0, or all are, depending on ;; whether CORE_PAGE_GENERATION has been set to 0 for testing. (let ((n-objects-in-g0 (count 0 list :key #'sb-kernel:generation-of))) From 7b535526714005b2edc1b3b1f06a3fbd0b6e4f5a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 5 Aug 2020 23:29:07 -0400 Subject: [PATCH 0330/4023] Make maybe_defer_handler static and give it a better name. --- src/code/sysmacs.lisp | 2 +- src/runtime/interrupt.c | 25 ++++++++++++------------- src/runtime/interrupt.h | 3 --- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/code/sysmacs.lisp b/src/code/sysmacs.lisp index 7fa4735634..930ef7897f 100644 --- a/src/code/sysmacs.lisp +++ b/src/code/sysmacs.lisp @@ -63,7 +63,7 @@ maintained." (*interrupts-enabled* nil) (*gc-inhibit* t)) (,without-gcing-body)) - ;; This is not racy becuase maybe_defer_handler + ;; This is not racy because can_hande_now() ;; defers signals if *GC-INHIBIT* is NIL but there ;; is a pending gc or stop-for-gc. (when (or *interrupt-pending* diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 162bf08824..815d47d2aa 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1233,9 +1233,9 @@ run_deferred_handler(struct interrupt_data *data, os_context_t *context) } #ifndef LISP_FEATURE_WIN32 -boolean -maybe_defer_handler(void *handler, struct interrupt_data *data, - int signal, siginfo_t *info, os_context_t *context) +static boolean +can_handle_now(void *handler, struct interrupt_data *data, + int signal, siginfo_t *info, os_context_t *context) { struct thread *thread=arch_os_get_current_thread(); @@ -1246,7 +1246,7 @@ maybe_defer_handler(void *handler, struct interrupt_data *data, if (thread->interrupt_data->pending_handler) lose("there is a pending handler already (PA)"); if (data->gc_blocked_deferrables) - lose("maybe_defer_handler: gc_blocked_deferrables true"); + lose("can_handle_now: gc_blocked_deferrables true"); /* If interrupts are disabled then INTERRUPT_PENDING is set and * not PSEDUO_ATOMIC_INTERRUPTED. This is important for a pseudo @@ -1259,33 +1259,33 @@ maybe_defer_handler(void *handler, struct interrupt_data *data, if ((read_TLS(INTERRUPTS_ENABLED,thread) == NIL) || in_leaving_without_gcing_race_p(thread)) { FSHOW_SIGNAL((stderr, - "/maybe_defer_handler(%p,%d): deferred (RACE=%d)\n", + "/can_handle_now(%p,%d): deferred (RACE=%d)\n", handler,signal, in_leaving_without_gcing_race_p(thread))); store_signal_data_for_later(data,handler,signal,info,context); write_TLS(INTERRUPT_PENDING, T,thread); check_interrupt_context_or_lose(context); - return 1; + return 0; } /* a slightly confusing test. arch_pseudo_atomic_atomic() doesn't * actually use its argument for anything on x86, so this branch * may succeed even when context is null (gencgc alloc()) */ if (arch_pseudo_atomic_atomic(context)) { FSHOW_SIGNAL((stderr, - "/maybe_defer_handler(%p,%d): deferred(PA)\n", + "/can_handle_now(%p,%d): deferred(PA)\n", handler,signal)); store_signal_data_for_later(data,handler,signal,info,context); arch_set_pseudo_atomic_interrupted(context); check_interrupt_context_or_lose(context); - return 1; + return 0; } check_interrupt_context_or_lose(context); FSHOW_SIGNAL((stderr, - "/maybe_defer_handler(%p,%d): not deferred\n", + "/can_handle_now(%p,%d): not deferred\n", handler,signal)); - return 0; + return 1; } static void @@ -1324,7 +1324,7 @@ maybe_now_maybe_later(int signal, siginfo_t *info, void *void_context) SAVE_ERRNO(signal,context,void_context); struct thread *thread = arch_os_get_current_thread(); struct interrupt_data *data = thread->interrupt_data; - if(!maybe_defer_handler(interrupt_handle_now,data,signal,info,context)) + if (can_handle_now(interrupt_handle_now, data, signal, info, context)) interrupt_handle_now(signal, info, context); RESTORE_ERRNO; } @@ -1346,8 +1346,7 @@ low_level_maybe_now_maybe_later(int signal, siginfo_t *info, void *void_context) struct thread *thread = arch_os_get_current_thread(); struct interrupt_data *data = thread->interrupt_data; - if(!maybe_defer_handler(low_level_interrupt_handle_now,data, - signal,info,context)) + if (can_handle_now(low_level_interrupt_handle_now, data, signal, info, context)) low_level_interrupt_handle_now(signal, info, context); RESTORE_ERRNO; } diff --git a/src/runtime/interrupt.h b/src/runtime/interrupt.h index 5547c2666c..a2ddaf5441 100644 --- a/src/runtime/interrupt.h +++ b/src/runtime/interrupt.h @@ -115,9 +115,6 @@ extern void interrupt_handle_now(int, siginfo_t*, os_context_t*); extern void interrupt_handle_pending(os_context_t*); extern void interrupt_internal_error(os_context_t*, boolean continuable); extern boolean handle_guard_page_triggered(os_context_t *,os_vm_address_t); -extern boolean maybe_defer_handler(void *handler, struct interrupt_data *data, - int signal, siginfo_t *info, - os_context_t *context); #ifdef DO_PENDING_INTERRUPT #define do_pending_interrupt ((void(*)(void))SYMBOL(DO_PENDING_INTERRUPT)->value) From dff890e34c09403ac1cc3efbafa4318a481042fa Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 6 Aug 2020 16:51:47 +0300 Subject: [PATCH 0331/4023] Typo. Thanks to Curtis Dunham. --- src/compiler/ir1opt.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 5bae27a541..895f5bf5fd 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -1735,7 +1735,7 @@ (cond ((not win) (setf (combination-kind call) :error (combination-info call) - (list #'compiler-style-warn "Lisp error during consant folding:~%~A" values))) + (list #'compiler-style-warn "Lisp error during constant folding:~%~A" values))) ((and (proper-list-of-length-p values 1)) (replace-combination-with-constant (first values) call)) (t (let ((dummies (make-gensym-list (length args)))) From c91f60fcbe4f971e14eb4d9c066d639a517b633f Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 6 Aug 2020 16:58:36 +0300 Subject: [PATCH 0332/4023] Update crossbuild-runner/backends/arm64/stuff-groveled-from-headers.lisp --- .../backends/arm64/stuff-groveled-from-headers.lisp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/crossbuild-runner/backends/arm64/stuff-groveled-from-headers.lisp b/crossbuild-runner/backends/arm64/stuff-groveled-from-headers.lisp index 11a332448c..91d468d685 100644 --- a/crossbuild-runner/backends/arm64/stuff-groveled-from-headers.lisp +++ b/crossbuild-runner/backends/arm64/stuff-groveled-from-headers.lisp @@ -19,8 +19,6 @@ (defconstant pollnval 32) ; #x20 (defconstant pollerr 8) ; #x8 (define-alien-type nfds-t (unsigned 64)) -;;; langinfo -(defconstant codeset 14) ; #xe ;;; types, types, types (define-alien-type clock-t (signed 64)) (define-alien-type dev-t (unsigned 64)) @@ -30,6 +28,7 @@ (define-alien-type nlink-t (unsigned 32)) (define-alien-type off-t (signed 64)) (define-alien-type size-t (unsigned 64)) +(define-alien-type ssize-t (signed 64)) (define-alien-type time-t (signed 64)) (define-alien-type suseconds-t (signed 64)) (define-alien-type uid-t (unsigned 32)) @@ -79,11 +78,13 @@ (defconstant eio 5) ; #x5 (defconstant eexist 17) ; #x11 (defconstant eloop 40) ; #x28 -(defconstant espipe 29) ; #x1d (defconstant epipe 32) ; #x20 +(defconstant espipe 29) ; #x1d (defconstant ewouldblock 11) ; #xb +(defconstant sc-nprocessors-onln 84) ; #x54 ;;; for waitpid() in run-program.lisp +(defconstant wcontinued 8) ; #x8 (defconstant wnohang 1) ; #x1 (defconstant wuntraced 2) ; #x2 @@ -91,6 +92,10 @@ (defconstant tiocgpgrp 21519) ; #x540f ;;; signals +(defconstant sizeof-sigset_t 128) ; #x80 +(defconstant sig_block 0) ; #x0 +(defconstant sig_unblock 1) ; #x1 +(defconstant sig_setmask 2) ; #x2 (defconstant sigalrm 14) ; #xe (defconstant sigbus 7) ; #x7 (defconstant sigchld 17) ; #x11 From 426808f14db4ed629f0e8d45144d91cf21dbd1ff Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 6 Aug 2020 10:50:17 -0400 Subject: [PATCH 0333/4023] Remove extraneous variable --- src/runtime/thread.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 171dc74be8..d8f743111a 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -906,16 +906,18 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { th->lisp_thread = 0; // force it to be always-thread-local, of course th->tls_size = dynamic_values_bytes; #endif - uword_t* __attribute__((__unused__)) constants = (uword_t*)th; #if defined LISP_FEATURE_X86_64 && defined LISP_FEATURE_LINUX - constants[THREAD_MSAN_XOR_CONSTANT_SLOT] = 0x500000000000; + tls[THREAD_MSAN_XOR_CONSTANT_SLOT] = 0x500000000000; +#endif +#ifdef LAYOUT_OF_FUNCTION + tls[THREAD_FUNCTION_LAYOUT_SLOT] = LAYOUT_OF_FUNCTION << 32; #endif #ifdef LISP_FEATURE_GENCGC #ifdef THREAD_VARYOBJ_CARD_MARKS_SLOT extern unsigned int* varyobj_page_touched_bits; - constants[THREAD_VARYOBJ_SPACE_ADDR_SLOT] = VARYOBJ_SPACE_START; - constants[THREAD_VARYOBJ_CARD_COUNT_SLOT] = varyobj_space_size / IMMOBILE_CARD_BYTES; - constants[THREAD_VARYOBJ_CARD_MARKS_SLOT] = (lispobj)varyobj_page_touched_bits; + tls[THREAD_VARYOBJ_SPACE_ADDR_SLOT] = VARYOBJ_SPACE_START; + tls[THREAD_VARYOBJ_CARD_COUNT_SLOT] = varyobj_space_size / IMMOBILE_CARD_BYTES; + tls[THREAD_VARYOBJ_CARD_MARKS_SLOT] = (lispobj)varyobj_page_touched_bits; #endif th->dynspace_addr = DYNAMIC_SPACE_START; th->dynspace_card_count = page_table_pages; @@ -960,9 +962,6 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { set_binding_stack_pointer(th,th->binding_stack_start); th->this=th; th->os_thread=0; -#if defined(LAYOUT_OF_FUNCTION) && defined(LISP_FEATURE_SB_THREAD) - constants[THREAD_FUNCTION_LAYOUT_SLOT] = LAYOUT_OF_FUNCTION << 32; -#endif // Once allocated, the allocation profiling buffer sticks around. // If present and enabled, assign into the new thread. th->profile_data = (uword_t*)(alloc_profiling ? alloc_profile_buffer : 0); From 89c8ea292f560e2190b14100daa2e9a2db807920 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 6 Aug 2020 19:44:52 +0300 Subject: [PATCH 0334/4023] Fix -sb-thread --- src/runtime/thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index d8f743111a..9cea6f9859 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -898,9 +898,9 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { // Refer to the ASCII art in the block comment above struct thread *th = (void*)(csp_page + THREAD_CSP_PAGE_SIZE); + lispobj* tls = (lispobj*)th; #ifdef LISP_FEATURE_SB_THREAD - lispobj* tls = (lispobj*)th; for(i = 0; i < (unsigned int)(dynamic_values_bytes/N_WORD_BYTES); i++) tls[i] = NO_TLS_VALUE_MARKER_WIDETAG; th->lisp_thread = 0; // force it to be always-thread-local, of course From 3301daac86db8fb1eeb938cae35cd3515257b3ea Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 6 Aug 2020 15:19:28 -0400 Subject: [PATCH 0335/4023] Simplify INIT-THREAD-LOCAL-STORAGE Supply a boolean to indicate why it is being called. --- src/code/cold-init.lisp | 6 +++-- src/code/save.lisp | 12 +++------- src/code/target-thread.lisp | 42 +++++++++-------------------------- tests/save-deinit.impure.lisp | 2 +- 4 files changed, 18 insertions(+), 44 deletions(-) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index f8b61d7926..937c34efbc 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -332,12 +332,14 @@ process to continue normally." (sb-thread::init-job-control) (sb-thread::get-foreground)) -(defun reinit () +(defun reinit (total) ;; WITHOUT-GCING implies WITHOUT-INTERRUPTS. (without-gcing ;; Until *CURRENT-THREAD* has been set, nothing the slightest bit complicated ;; can be called, as pretty much anything can assume that it is set. - (sb-thread::init-main-thread) + (when total ; newly started process, and not a failed save attempt + (sb-thread::init-main-thread) + #+sb-thread (setq *finalizer-thread* t)) ;; Initializing the standard streams calls ALLOC-BUFFER which calls FINALIZE (finalizers-reinit) ;; Initialize streams next, so that any errors can be printed diff --git a/src/code/save.lisp b/src/code/save.lisp index 7d6036db0e..2d1b3ee72c 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -66,8 +66,7 @@ ;;; This variable is accessed by C code when saving. Export it to survive tree-shaker. ;;; The symbols in this set are clobbered just in time to avoid saving them to the core -;;; but not so early that we kill the running image. (Though in fact if SAVE-ERROR -;;; and hence REINIT is reached, we reassign them all anyway) +;;; but not so early that we kill the running image. (export 'sb-kernel::*save-lisp-clobbered-globals* 'sb-kernel) (define-load-time-global sb-kernel::*save-lisp-clobbered-globals* '#(sb-impl::*exit-lock* @@ -85,12 +84,7 @@ (defun start-lisp (toplevel) (named-lambda start-lisp () (handling-end-of-the-world - (reinit) - ;; REINIT can not discern between a restarted image and a - ;; failure to save. It doesn't make a lot of sense to start - ;; a finalizer thread in the failed case, so we set the flag - ;; here, not in REINIT which would do it for both cases. - #+sb-thread (setq *finalizer-thread* t) + (reinit t) #+hpux (%primitive sb-vm::setup-return-from-lisp-stub) (funcall toplevel)))) @@ -279,7 +273,7 @@ sufficiently motivated to do lengthy fixes." ;; Something went very wrong -- reinitialize to have a prayer ;; of being able to report the error. (restore-fd-streams) - (reinit) + (reinit nil) (error 'save-error))) (defun tune-image-for-dump () diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 5cc79d0d3d..2c588715a5 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -311,10 +311,10 @@ created and old ones may exit at any time." (thread-os-thread ,this) (sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)))) +;;; Not uncoincidentally, the variables assigned here are also +;;; listed in SB-KERNEL::*SAVE-LISP-CLOBBERED-GLOBALS* (defun init-main-thread () (/show0 "Entering INIT-MAIN-THREAD") - ;;; FIXME: is it purposeful or accidental that we recreate some of - ;;; the global mutexes but not all of them? (setf sb-impl::*exit-lock* (make-mutex :name "Exit Lock") *make-thread-lock* (make-mutex :name "Make-Thread Lock")) (let* ((name "main thread") @@ -326,9 +326,6 @@ created and old ones may exit at any time." (setf *initial-thread* thread) (setf *joinable-threads* nil) #-sb-safepoint (setq *foreign-thread* (make-foreign-thread)) - ;; Either *all-threads* is empty or it contains exactly one thread - ;; in case we are in reinit since saving core with multiple - ;; threads doesn't work. (setq *all-threads* (avl-insert nil (get-lisp-obj-address sb-vm:*control-stack-start*) thread)))) @@ -2449,45 +2446,26 @@ mechanism for inter-thread communication." ;;; Here's the problem: Some of the backends implement those semantics as dictated ;;; by globaldb - assigning into TLS even if the current TLS value is NO_TLS_VALUE; ;;; while others do not make use of that information, and will therefore assign into -;;; the global value if the TLS value is NO_TLS_VALUE. +;;; the symbol-global-value if the TLS value is NO_TLS_VALUE. ;;; This can not be "corrected" by genesis - there is no TLS when genesis executes. -;;; The only way to do this reliably is to compute the address of the thread-local -;;; storage slot, and use (SETF SAP-REF-LISPOBJ) +;;; The only way to do this uniformly for all the platforms is to compute the address +;;; of the thread-local storage slot, and use (SETF SAP-REF-LISPOBJ) on that. ;;; (Nor is #+(vop-translates ensure-symbol-tls-index) a reliable indicator that the ;;; SET vop will assign into a thread-local symbol that currently has no TLS value.) - -;;; Note also that this is called by REINIT, which _should_ reinitialize -;;; the *CURRENT-THREAD* but should _NOT_ reinitialize anything else. -;;; That's actually kind of weird, but it's necessary to ensure that *RESTART-CLUSTERS* -;;; does not get clobbered if there were any restarts available. -;;; There's a SAVE-LISP-AND-DIE test which asserts that you can resume -;;; from a failed save. -;;; It might behoove us to pass in a flag as to whether this is coming from REINIT, -;;; but INIT-INITIAL-THREAD doesn't know either. We'd have to plumb a new flag -;;; down all the way from SAVE. (defun init-thread-local-storage (thread) ;; In addition to wanting the expressly unsafe variant of SYMBOL-VALUE, any error ;; signaled such as invalid-arg-count would just go totally wrong at this point. (declare (optimize (safety 0))) #-sb-thread - ;; *CURRENT-THREAD* is known always bound, so BOUNDP would be T - ;; We need to see whether it's really boundp. - (if (unbound-marker-p *current-thread*) - (macrolet ((expand () - `(setf ,@(apply #'append (cdr *thread-local-specials*))))) - (expand))) + (macrolet ((expand () `(setf ,@(apply #'append (cdr *thread-local-specials*))))) + (expand)) ;; See %SET-SYMBOL-VALUE-IN-THREAD for comparison's sake #+sb-thread (let ((sap (current-thread-sap))) (macrolet ((expand () - ;; As for uni-thread, *current-thread* is always-boundp, - ;; but the C part of tls-init makes it zero initially - ;; (in violation of the type). Check for that. - `(if (= (sap-ref-word sap ,(info :variable :wired-tls '*current-thread*)) - 0) - (setf ,@(loop for (var form) in (cdr *thread-local-specials*) - for index = (info :variable :wired-tls var) - append `((sap-ref-lispobj sap ,index) ,form)))))) + `(setf ,@(loop for (var form) in (cdr *thread-local-specials*) + for index = (info :variable :wired-tls var) + append `((sap-ref-lispobj sap ,index) ,form))))) (expand))) ;; Straightforwardly assign *current-thread* because it's never the NO-TLS-VALUE marker. ;; I wonder how to to prevent user code from doing this, but it isn't a new problem per se. diff --git a/tests/save-deinit.impure.lisp b/tests/save-deinit.impure.lisp index ab0eeac06a..47373cab4d 100644 --- a/tests/save-deinit.impure.lisp +++ b/tests/save-deinit.impure.lisp @@ -50,7 +50,7 @@ (let (sb-impl::*streams-closed-by-slad*) (sb-impl::deinit) (sb-impl::restore-fd-streams) - (sb-impl::reinit)) + (sb-impl::reinit nil)) ;;; I think this test would be better as a shell test, ;;; so that we actually call SAVE-LISP-AND-DIE to see that it works. From b8ae45d4b88ce6856e36419417a23b631e9948f4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 6 Aug 2020 15:58:08 -0400 Subject: [PATCH 0336/4023] Rename *EXIT-IN-PROCESS* -> *EXIT-IN-PROGRESS* To quote https://writingexplained.org/in-process-vs-in-progress-difference "'in progress' has been the preferred version ... for nearly 200 years". In addition, "process" has an overloaded connotation - like maybe this variable served to distinguish thread vs process exit. Does it? If it does, then I really don't get it. Was it purposeful double entendre? Yikes. --- package-data-list.lisp-expr | 2 +- src/code/cold-init.lisp | 4 ++-- src/code/target-thread.lisp | 8 ++++---- src/code/toplevel.lisp | 10 +++++----- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 399ce2f838..facd2dcf35 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2764,7 +2764,7 @@ SB-KERNEL) have been undone, but probably more remain." "%PRIMITIVE" "%STANDARD-CHAR-P" "*EXIT-ERROR-HANDLER*" - "*EXIT-IN-PROCESS*" + "*EXIT-IN-PROGRESS*" "*ALLOW-WITH-INTERRUPTS*" "*INTERRUPTS-ENABLED*" "*INTERRUPT-PENDING*" diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index 937c34efbc..09539fa6fd 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -316,12 +316,12 @@ Consequences are unspecified if serious conditions occur during EXIT excepting errors from *EXIT-HOOKS*, which cause warnings and stop execution of the hook that signaled, but otherwise allow the exit process to continue normally." - (if (or abort *exit-in-process*) + (if (or abort *exit-in-progress*) (os-exit (or code 1) :abort t) (let ((code (or code 0))) (with-deadline (:seconds nil :override t) (sb-thread:grab-mutex *exit-lock*)) - (setf *exit-in-process* code + (setf *exit-in-progress* code *exit-timeout* timeout) (throw '%end-of-the-world t))) (critically-unreachable "After trying to die in EXIT.")) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 2c588715a5..9ef2bc56d3 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1410,7 +1410,7 @@ on this semaphore, then N of them is woken up." (defmacro handle-thread-exit () '(progn (/show0 "HANDLING THREAD EXIT") - (when *exit-in-process* + (when *exit-in-progress* (%exit)) ;; Lisp-side cleanup (let* ((thread *current-thread*) @@ -1489,7 +1489,7 @@ on this semaphore, then N of them is woken up." (sb-impl::finalizer-thread-stop) (grab-mutex *make-thread-lock*) (let ((timeout sb-ext:*exit-timeout*) - (code *exit-in-process*) + (code *exit-in-progress*) (current *current-thread*) (joinees nil) (main nil)) @@ -1521,7 +1521,7 @@ on this semaphore, then N of them is woken up." (interrupt-thread main (lambda () - (setf *exit-in-process* (list code)) + (setf *exit-in-progress* (list code)) (throw 'sb-impl::%end-of-the-world t))) (interrupt-thread-error ())) ;; Normally this never finishes, as once the main-thread unwinds we @@ -1832,7 +1832,7 @@ session." (sb-c::inspect-unwinding (apply-real-function) #'sb-di::catch-runaway-unwind)) - (when *exit-in-process* + (when *exit-in-progress* (sb-impl::call-exit-hooks)))))) #+sb-safepoint (sb-kernel::gc-safepoint) (setf (thread-result *current-thread*) list))) diff --git a/src/code/toplevel.lisp b/src/code/toplevel.lisp index 198311ed79..5cefa8ae3e 100644 --- a/src/code/toplevel.lisp +++ b/src/code/toplevel.lisp @@ -58,7 +58,7 @@ been specified on the command-line.") (%exit))))) (define-load-time-global *exit-lock* nil) -(define-thread-local *exit-in-process* nil) +(define-thread-local *exit-in-progress* nil) (declaim (type (or null real) *exit-timeout*)) (defvar *exit-timeout* 60 "Default amount of seconds, if any, EXIT should wait for other @@ -67,13 +67,13 @@ means to wait indefinitely.") (defun os-exit-handler (condition) (declare (ignore condition)) - (os-exit *exit-in-process* :abort t)) + (os-exit *exit-in-progress* :abort t)) (defvar *exit-error-handler* #'os-exit-handler) (defun call-exit-hooks () - (unless *exit-in-process* - (setf *exit-in-process* 0)) + (unless *exit-in-progress* + (setf *exit-in-progress* 0)) (handler-bind ((serious-condition *exit-error-handler*)) (call-hooks "exit" *exit-hooks* :on-error :warn))) @@ -146,7 +146,7 @@ means to wait indefinitely.") ;; If anything goes wrong, we will exit immediately and forcibly. (handler-bind ((serious-condition *exit-error-handler*)) (let ((ok nil) - (code *exit-in-process*)) + (code *exit-in-progress*)) (if (consp code) ;; Another thread called EXIT, and passed the buck to us -- only ;; final call left to do. From 9ed5f6dedec8ba75e1e1ffece72fac3a0babf7d1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 6 Aug 2020 16:52:41 -0400 Subject: [PATCH 0337/4023] Give linux threads an OS-visible name --- src/code/target-thread.lisp | 26 ++++++++++++++++++-------- tests/run-tests.lisp | 2 +- tests/threads.pure.lisp | 19 +++++++++++++++++++ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 9ef2bc56d3..1eed473b2a 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1808,6 +1808,16 @@ session." ;;; All threads other than the initial thread start via this function. #+sb-thread (thread-trampoline-defining-macro + #+linux (let ((name (thread-name *current-thread*))) + ;; "The thread name is a meaningful C language string, whose length is + ;; restricted to 16 characters, including the terminating null byte ('\0'). + ;; The pthread_setname_np() function can fail with the following error: + ;; ERANGE The length of the string ... exceeds the allowed limit." + (when (and (typep name 'simple-base-string) (<= (length name) 15)) + (alien-funcall (extern-alien "pthread_setname_np" + (function int unsigned system-area-pointer)) + (thread-os-thread *current-thread*) + (vector-sap name)))) ;; Using handling-end-of-the-world would be a bit tricky ;; due to other catches and interrupts, so we essentially ;; re-implement it here. Once and only once more. @@ -1864,14 +1874,14 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." #-sb-thread (declare (ignore function name arguments)) #-sb-thread (error "Not supported in unithread builds.") #+sb-thread - (progn (assert (or (atom arguments) - (null (cdr (last arguments)))) - (arguments) - "Argument passed to ~S, ~S, is an improper list." - 'make-thread arguments) - (start-thread (%make-thread name nil (make-semaphore :name name)) - (coerce function 'function) - (ensure-list arguments)))) + (let ((name (when name (possibly-base-stringize name)))) + (assert (or (atom arguments) (null (cdr (last arguments)))) + (arguments) + "Argument passed to ~S, ~S, is an improper list." + 'make-thread arguments) + (start-thread (%make-thread name nil (make-semaphore :name name)) + (coerce function 'function) + (ensure-list arguments)))) ;;; System-internal use only #+sb-thread diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index 05dc7ed041..3f12693ca7 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -162,8 +162,8 @@ (= (mismatch string "/dev/") 5) ; dev/null and dev/random (= (mismatch string "/tmp/") 5) (= (mismatch string "/var/tmp/") 9) + (= (mismatch string "/proc/self") 10) (eql (search "/private/var/folders/" string) 0) - (string= string "/proc/self/maps") (string= string "exists") (member (stem-of filename) '("compiler-test-util.lisp" "a.txt" "b.lisp" diff --git a/tests/threads.pure.lisp b/tests/threads.pure.lisp index f8ae24c62a..2c60d3b85e 100644 --- a/tests/threads.pure.lisp +++ b/tests/threads.pure.lisp @@ -577,3 +577,22 @@ (with-test (:name (abort-thread :main-thread)) (assert (main-thread-p)) (assert-error (abort-thread) thread-error)) + +;;; The OSes vary in how pthread_setname works. +;;; According to https://stackoverflow.com/questions/2369738/how-to-set-the-name-of-a-thread-in-linux-pthreads +;;; // NetBSD: name + arg work like printf(name, arg) +;;; int pthread_setname_np(pthread_t thread, const char *name, void *arg); +;;; // FreeBSD & OpenBSD: function name is slightly different, and has no return value +;;; void pthread_set_name_np(pthread_t tid, const char *name); +;;; // Mac OS X: must be set from within the thread (can't specify thread ID) +;;; int pthread_setname_np(const char*); +;;; Only Linux is implemented for now. +(with-test (:name :os-thread-name :skipped-on (:not :linux)) + (let ((thr + (make-thread + (lambda () + (with-open-file (stream (format nil "/proc/self/task/~d/comm" + (thread-os-tid *current-thread*))) + (read-line stream))) + :name "testme"))) + (assert (string= (join-thread thr) "testme")))) From 1edd657495cade585c8423056477acb34059eb6d Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 7 Aug 2020 02:13:35 +0300 Subject: [PATCH 0338/4023] Guard a test with +sb-thread. --- tests/threads.pure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/threads.pure.lisp b/tests/threads.pure.lisp index 2c60d3b85e..feb27df8c8 100644 --- a/tests/threads.pure.lisp +++ b/tests/threads.pure.lisp @@ -587,7 +587,7 @@ ;;; // Mac OS X: must be set from within the thread (can't specify thread ID) ;;; int pthread_setname_np(const char*); ;;; Only Linux is implemented for now. -(with-test (:name :os-thread-name :skipped-on (:not :linux)) +(with-test (:name :os-thread-name :skipped-on (:not (and :linux :sb-thread))) (let ((thr (make-thread (lambda () From 6f82f1a2772ae755b7ea8447ba442251737a5bf6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 7 Aug 2020 02:25:02 +0300 Subject: [PATCH 0339/4023] Add a couple of :fails-on --- tests/hash.pure.lisp | 3 ++- tests/make-thread.impure.lisp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/hash.pure.lisp b/tests/hash.pure.lisp index ee9ea5f968..639e0d62f8 100644 --- a/tests/hash.pure.lisp +++ b/tests/hash.pure.lisp @@ -261,7 +261,8 @@ ;;; which has two different freelists - one of cells that REMHASH has made available ;;; and one of cells that GC has marked as empty. Since we no longer inhibit GC ;;; during table operations, we need to give GC a list of its own to manipulate. -(with-test (:name (hash-table :gc-smashed-cell-list)) +(with-test (:name (hash-table :gc-smashed-cell-list) + :fails-on (and :sb-safepoint :x86 (not :win32))) (flet ((f () (dotimes (i 20000) (setf (gethash i *tbl*) (- i))) (setf (gethash (cons 1 2) *tbl*) 'foolz) diff --git a/tests/make-thread.impure.lisp b/tests/make-thread.impure.lisp index a94db1db84..2da6e960e3 100644 --- a/tests/make-thread.impure.lisp +++ b/tests/make-thread.impure.lisp @@ -125,7 +125,8 @@ ;;; In fact, assert something stronger: there are no young objects ;;; between the current SP and end of stack. (test-util:with-test (:name :expected-gc-roots - :skipped-on (or :interpreter (not :pauseless-threadstart))) + :skipped-on (or :interpreter (not :pauseless-threadstart)) + :fails-on (and :x86 :sb-fasteval)) (let ((list (tryit :print nil))) ;; should be not many things pointed to by the stack (assert (< (length list) #+x86 38 ; more junk, I don't know why From 480970fe77a72f078082ace05f10362689b253c6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 7 Aug 2020 10:28:31 -0400 Subject: [PATCH 0340/4023] Add libunwind support for *bsd --- src/runtime/Config.x86-64-bsd | 3 +++ src/runtime/bsd-os.c | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/runtime/Config.x86-64-bsd b/src/runtime/Config.x86-64-bsd index 88f47b4ce2..3fefff4f01 100644 --- a/src/runtime/Config.x86-64-bsd +++ b/src/runtime/Config.x86-64-bsd @@ -18,6 +18,9 @@ OS_LIBS = # -ldl ifdef LISP_FEATURE_SB_CORE_COMPRESSION OS_LIBS += -lz endif +ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE + OS_LIBS += -lunwind +endif CFLAGS += -fno-omit-frame-pointer LINKFLAGS += -Wl,--export-dynamic diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index a041f8e8af..172c31ca9e 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -301,6 +301,20 @@ os_install_interrupt_handlers(void) sig_stop_for_gc_handler); # endif #endif + +#ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE + // Use this only if you know what you're doing + void backtrace_lisp_threads(int, siginfo_t*, os_context_t*); + fprintf(stderr, "SIGXCPU (%d), will backtrace in all threads\n", SIGXCPU); + sigdelset(&deferrable_sigset, SIGXCPU); + sigdelset(&blockable_sigset, SIGXCPU); + undoably_install_low_level_interrupt_handler(SIGXCPU, backtrace_lisp_threads); + sigset_t ss; + sigemptyset(&ss); + sigaddset(&ss, SIGXCPU); + thread_sigmask(SIG_UNBLOCK, &ss, 0); +#endif + SHOW("leaving os_install_interrupt_handlers()"); } From 6b85717b12e8128d0994007f9396f7944a9f4695 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 7 Aug 2020 10:30:24 -0400 Subject: [PATCH 0341/4023] Adjust/fix/disable tests for FreeBSD * The malloc-deadlock test needed a tweak (at least on QEMU) due to horifically bad scheduling decisions in the guest OS. Ymmv. * Floating-point mode bits need to be explicitly preserved in make-thread * fcb-threads test does not pass --- src/code/target-thread.lisp | 5 ++++- tests/fcb-threads.impure.lisp | 6 +++++- tests/run-program.impure.lisp | 15 ++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 1eed473b2a..de7add6c45 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1773,6 +1773,9 @@ session." (setf (thread-startup-info *current-thread*) 0))))) (flet ((unmask-signals () (let ((mask (svref (thread-startup-info *current-thread*) 4))) + #+(or win32 darwin freebsd) + (setf (sb-vm:floating-point-modes) + (setf (thread-startup-info *current-thread*) 5)) (if mask ;; If the original mask (at thread creation time) was provided, ;; then restore exactly that mask. @@ -2001,7 +2004,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." unsigned (lisp-fun-address unsigned)) (defun start-thread (thread function arguments) (let* ((setup-sem (make-semaphore :name "Thread setup semaphore")) - #+(or win32 darwin) + #+(or win32 darwin freebsd) (fp-modes (dpb 0 sb-vm:float-sticky-bits ;; clear accrued bits (sb-vm:floating-point-modes)))) (declare (dynamic-extent setup-sem)) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 8201b36a3d..5425e71f43 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -11,7 +11,11 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#+(or (not sb-thread) win32) (sb-ext:exit :code 104) +;;; This reliably fails with two crashes (both in the same run) on FreeBSD: +;;; - garbage_collect: no SP known for thread 0x802bea000 (OS 34367133952) +;;; - failed AVER: (NOT (SB-THREAD::AVL-FIND ADDR SB-THREAD::OLD)) + +#+(or (not sb-thread) win32 freebsd) (sb-ext:exit :code 104) (if (probe-file "fcb-threads.so") ;; Assume the test automator built this for us diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index cdd5e1745d..b62145049d 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -419,11 +419,24 @@ :broken-on :sb-safepoint :skipped-on (or (not :sb-thread) :win32)) (let* (stop + (delay-between-gc + (or #+freebsd + (let* ((p (run-program "sysctl" '("hw.model") :search t :output :stream)) + (output (process-output p)) + (result (read-line output))) + (close output) + ;; With the default delay of 0 using FreeBSD on QEMU this test never + ;; finished because the RUN-PROGRAM thread would never get scheduled + ;; after its first entry into the loop. + ;; It wasn't hung, it just wasn't getting CPU time. For me anyway. + (when (search "QEMU" result) + .00000001)) ; 10 nanoseconds + 0)) (threads (list* (sb-thread:make-thread (lambda () (loop until stop do - (sleep 0) + (sleep delay-between-gc) (gc :full t)))) (loop repeat 3 collect From 6aee5b0e7d4088f423551cd9bdeb40a29ec3638c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 7 Aug 2020 10:39:05 -0400 Subject: [PATCH 0342/4023] Use WITH-PINNED-OBJECTS as required --- src/code/target-thread.lisp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index de7add6c45..06d2fe1a57 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1817,10 +1817,11 @@ session." ;; The pthread_setname_np() function can fail with the following error: ;; ERANGE The length of the string ... exceeds the allowed limit." (when (and (typep name 'simple-base-string) (<= (length name) 15)) - (alien-funcall (extern-alien "pthread_setname_np" - (function int unsigned system-area-pointer)) - (thread-os-thread *current-thread*) - (vector-sap name)))) + (with-pinned-objects (name) + (alien-funcall (extern-alien "pthread_setname_np" + (function int unsigned system-area-pointer)) + (thread-os-thread *current-thread*) + (vector-sap name))))) ;; Using handling-end-of-the-world would be a bit tricky ;; due to other catches and interrupts, so we essentially ;; re-implement it here. Once and only once more. From c7590d3d7e73a4da203b71493a9cb353d8280f1c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 7 Aug 2020 10:55:51 -0400 Subject: [PATCH 0343/4023] Expose :OS-THREAD-STACK feature to lisp So that :PAUSELESS-THREADSTART can be more widely enabled. No functional change yet. --- make-target-2-load.lisp | 4 ++-- src/cold/shared.lisp | 2 ++ src/runtime/Config.generic-openbsd | 2 +- src/runtime/Config.x86-64-darwin | 2 +- src/runtime/Config.x86-darwin | 2 +- src/runtime/arm64-assem.S | 2 +- src/runtime/ppc-assem.S | 2 +- src/runtime/thread.c | 8 ++++---- src/runtime/x86-64-assem.S | 2 +- src/runtime/x86-assem.S | 2 +- 10 files changed, 15 insertions(+), 13 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index 822f834528..bffdb09986 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -22,8 +22,8 @@ ;; into the default baseline policy. It has no relevance post-build ;; in as much as policy can be changed later arbitrarily. :CONS-PROFILING - ;; Used by nothing after compiling 'target-thread' - :SB-FUTEX :FUTEX-USE-TID + ;; Used by nothing after compiling 'target-thread.lisp' or 'thread.c' + :SB-FUTEX :FUTEX-USE-TID :OS-THREAD-STACK ;; These affect the BREAK instruction emitter, but the C code is able ;; to handle anything, and post-build we don't care which it is. :UD2-BREAKPOINTS :INT4-BREAKPOINTS diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 197678416a..7d3eed2410 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -248,6 +248,8 @@ (when (featurep '(:and :linux :sb-thread (:not :sb-safepoint)) target-feature-list) (push :pauseless-threadstart target-feature-list)) + (when (featurep '(:or :darwin :openbsd) target-feature-list) + (push :os-thread-stack target-feature-list)) (when (and (member :x86 target-feature-list) (member :int4-breakpoints target-feature-list)) ;; 0xCE is a perfectly good 32-bit instruction, diff --git a/src/runtime/Config.generic-openbsd b/src/runtime/Config.generic-openbsd index 4ffb6ea7a5..6936223e5d 100644 --- a/src/runtime/Config.generic-openbsd +++ b/src/runtime/Config.generic-openbsd @@ -13,7 +13,7 @@ LINKFLAGS += -Wl,-z,wxneeded OS_LIBS += -lutil ifdef LISP_FEATURE_SB_THREAD -CFLAGS += -pthread -DOS_THREAD_STACK +CFLAGS += -pthread OS_LIBS += -pthread endif diff --git a/src/runtime/Config.x86-64-darwin b/src/runtime/Config.x86-64-darwin index 027d0dfb84..6e6775c7c9 100644 --- a/src/runtime/Config.x86-64-darwin +++ b/src/runtime/Config.x86-64-darwin @@ -9,7 +9,7 @@ # provided with absolutely no warranty. See the COPYING and CREDITS # files for more information. -CFLAGS += -g -Wall -O2 -fdollars-in-identifiers -DOS_THREAD_STACK +CFLAGS += -g -Wall -O2 -fdollars-in-identifiers ifdef SBCL_MACOSX_VERSION_MIN CFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN) diff --git a/src/runtime/Config.x86-darwin b/src/runtime/Config.x86-darwin index 1fb6c53c45..868b20ee66 100644 --- a/src/runtime/Config.x86-darwin +++ b/src/runtime/Config.x86-darwin @@ -9,7 +9,7 @@ # provided with absolutely no warranty. See the COPYING and CREDITS # files for more information. -CFLAGS += -arch i386 -g -Wall -O2 -fdollars-in-identifiers -fno-omit-frame-pointer -DOS_THREAD_STACK +CFLAGS += -arch i386 -g -Wall -O2 -fdollars-in-identifiers -fno-omit-frame-pointer LINKFLAGS += -arch i386 ifdef SBCL_MACOSX_VERSION_MIN diff --git a/src/runtime/arm64-assem.S b/src/runtime/arm64-assem.S index 2b456ac8cd..1763568523 100644 --- a/src/runtime/arm64-assem.S +++ b/src/runtime/arm64-assem.S @@ -52,7 +52,7 @@ #endif -#ifdef OS_THREAD_STACK +#ifdef LISP_FEATURE_OS_THREAD_STACK .align 2 .global funcall1_switching_stack .type funcall1_switching_stack, %function diff --git a/src/runtime/ppc-assem.S b/src/runtime/ppc-assem.S index 1190bb59f3..c05b7f1161 100644 --- a/src/runtime/ppc-assem.S +++ b/src/runtime/ppc-assem.S @@ -289,7 +289,7 @@ x: #endif .text -#ifdef OS_THREAD_STACK +#ifdef LISP_FEATURE_OS_THREAD_STACK GFUNCDEF(funcall1_switching_stack) /* The arguments are switched, funcall1_switching_stack(arg, function) to avoid shuffling registers diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 9cea6f9859..21f318c606 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -58,7 +58,7 @@ #include #endif -#if defined(LISP_FEATURE_WIN32) || defined(OS_THREAD_STACK) +#if defined(LISP_FEATURE_WIN32) || defined(LISP_FEATURE_OS_THREAD_STACK) # define IMMEDIATE_POST_MORTEM #else static __attribute__((unused)) struct thread *postmortem_thread; @@ -591,7 +591,7 @@ void* new_thread_trampoline(void* arg) result = funcall0(function); unregister_thread(th, &scribble); -#ifndef OS_THREAD_STACK +#ifndef LISP_FEATURE_OS_THREAD_STACK schedule_thread_post_mortem(th); #endif #endif @@ -600,7 +600,7 @@ void* new_thread_trampoline(void* arg) return (void*)(uintptr_t)result; } -#ifdef OS_THREAD_STACK +#ifdef LISP_FEATURE_OS_THREAD_STACK extern void* funcall1_switching_stack(void*, void *(*fun)(void *)) # ifdef LISP_FEATURE_X86_64 __attribute__((sysv_abi)) @@ -1104,7 +1104,7 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) /* call_into_lisp_first_time switches the stack for the initial * thread. For the others, we use this. */ if ( -#ifdef OS_THREAD_STACK +#ifdef LISP_FEATURE_OS_THREAD_STACK pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) || (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline_switch_stack, th)) #else diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index 5bf3177e61..9c74602d92 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -92,7 +92,7 @@ #define THREAD_BASE_REG %r13 -#ifdef OS_THREAD_STACK +#ifdef LISP_FEATURE_OS_THREAD_STACK .text .globl GNAME(funcall1_switching_stack) TYPE(GNAME(funcall1_switching_stack)) diff --git a/src/runtime/x86-assem.S b/src/runtime/x86-assem.S index 084352caa7..aad426d70e 100644 --- a/src/runtime/x86-assem.S +++ b/src/runtime/x86-assem.S @@ -322,7 +322,7 @@ Lfp_rtn_value: SIZE(GNAME(call_into_c)) -#ifdef OS_THREAD_STACK +#ifdef LISP_FEATURE_OS_THREAD_STACK .text .globl GNAME(funcall1_switching_stack) TYPE(GNAME(funcall1_switching_stack)) From a42e0af597edbab52875f600377cc492c33d27bb Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 7 Aug 2020 11:35:44 -0400 Subject: [PATCH 0344/4023] Make :pauseless-threadstart equivalent to not :sb-safepoint Tested on macOS for compatibility with :OS-THREAD-STACK. It's unknown whether this can be made to work with safepoints, but some more C code cleanups remain to be done either way. --- NEWS | 3 ++ src/code/target-thread.lisp | 66 ++++++++++++++++++++------------ src/cold/shared.lisp | 3 +- src/runtime/thread.c | 56 +++++++++------------------ tools-for-build/grovel-headers.c | 16 ++++++-- 5 files changed, 77 insertions(+), 67 deletions(-) diff --git a/NEWS b/NEWS index ca42e3c827..bfd378e654 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,8 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- +changes relative to sbcl-2.0.7: + * optimization: SB-THREAD:MAKE-THREAD is faster on most platforms. + changes in sbcl-2.0.7 relative to sbcl-2.0.6: * minor incompatible change: SB-THREAD:THREAD-OS-TID returns NIL for a thread which has exited. diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 06d2fe1a57..2aa788dff5 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1657,30 +1657,40 @@ session." ;;; Return T if the thread was created (defun pthread-create (thread thread-sap) (aver (memq thread *starting-threads*)) - (let ((attr (foreign-symbol-sap "new_lisp_thread_attr" t))) - (and (multiple-value-bind (c-stack-base c-stack-size) - #+c-stack-is-control-stack - (values (sap-ref-sap thread-sap (ash sb-vm::thread-control-stack-start-slot - sb-vm:word-shift)) - (extern-alien "thread_control_stack_size" unsigned)) - #-c-stack-is-control-stack - (values (sap-ref-sap thread-sap (ash sb-vm::thread-alien-stack-start-slot - sb-vm:word-shift)) - (extern-alien "thread_alien_stack_size" unsigned)) - (= 0 (alien-funcall - (extern-alien "pthread_attr_setstack" - (function int system-area-pointer system-area-pointer - unsigned)) - attr c-stack-base c-stack-size))) + (let ((attr (foreign-symbol-sap "new_lisp_thread_attr" t)) + (c-tramp + (foreign-symbol-sap #+os-thread-stack "new_thread_trampoline_switch_stack" + #-os-thread-stack "new_thread_trampoline"))) + (and (= 0 #+os-thread-stack + (alien-funcall (extern-alien "pthread_attr_setstacksize" + (function int system-area-pointer unsigned)) + attr sb-unix::pthread-min-stack) + #-os-thread-stack + (with-alien ((setstack (function int system-area-pointer system-area-pointer + unsigned) :extern "pthread_attr_setstack")) + #+c-stack-is-control-stack + (alien-funcall setstack attr + (sap-ref-sap thread-sap (ash sb-vm::thread-control-stack-start-slot + sb-vm:word-shift)) + (extern-alien "thread_control_stack_size" unsigned)) + #-c-stack-is-control-stack + (alien-funcall setstack attr + (sap-ref-sap thread-sap (ash sb-vm::thread-alien-stack-start-slot + sb-vm:word-shift)) + (extern-alien "thread_alien_stack_size" unsigned)))) + ;; From "Workaround a problem ... on NetBSD" (git rev af8c4a2933) + ;; If I had to guess, it wrongly assumed existence of memory outside of + ;; the exactly provided stack bounds. + #+netbsd + (= 0 (with-alien ((setguard (function int system-area-pointer unsigned) + :extern "pthread_attr_setguardsize")) + (alien-funcall setguard attr 0))) (with-pinned-objects (thread) (= 0 (alien-funcall (extern-alien "pthread_create" (function int system-area-pointer system-area-pointer - system-area-pointer unsigned)) - (struct-slot-sap thread thread os-thread) - attr - (foreign-symbol-sap "new_thread_trampoline") - (logandc2 (get-lisp-obj-address thread) sb-vm:lowtag-mask))))))) + system-area-pointer system-area-pointer)) + (struct-slot-sap thread thread os-thread) attr c-tramp thread-sap)))))) (defmacro free-thread-struct (memory) `(alien-funcall (extern-alien "free_thread_struct" (function void system-area-pointer)) @@ -1773,9 +1783,6 @@ session." (setf (thread-startup-info *current-thread*) 0))))) (flet ((unmask-signals () (let ((mask (svref (thread-startup-info *current-thread*) 4))) - #+(or win32 darwin freebsd) - (setf (sb-vm:floating-point-modes) - (setf (thread-startup-info *current-thread*) 5)) (if mask ;; If the original mask (at thread creation time) was provided, ;; then restore exactly that mask. @@ -1939,7 +1946,12 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; be no transient effect on the list of all threads. But it's indeterminate ;; whether the creating or created thread will make progress first, ;; so they both do this assignment. - (sb-ext:cas (thread-%visible new-thread) 0 1)) + (setf (thread-%visible new-thread) 1) + ;; Foreign threads don't pass the saved FP modes, so the modes have to be + ;; restored here and not in RUN. + #+(or win32 darwin freebsd) + (setf (sb-vm:floating-point-modes) + (svref (thread-startup-info *current-thread*) 5))) (run))) (saved-sigmask (make-array (* sb-unix::sizeof-sigset_t sb-vm:n-byte-bits) :element-type 'bit :initial-element 0)) @@ -1985,6 +1997,12 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; them, there should usually be only one item to delete from *STARTING-THREADS*. (let ((old (delete 0 *starting-threads*))) (setf *starting-threads* (rplacd cell old)) + (barrier (:write)) + ;; Assign the thread's *CURRENT-THREAD*. This is GC-safe because + ;; the thread instance is pinned via *STARTING-THREADS*. + (setf (sap-ref-lispobj thread-sap (ash sb-vm::thread-lisp-thread-slot + sb-vm:word-shift)) + thread) (setq created (pthread-create thread thread-sap)) (cond (created ; Still holding the MAKE-THREAD-LOCK, expose thread in (LIST-ALL-THREADS). ;; On CPUs where CAS can spuriously fail, this probably needs to loop and retry. diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 7d3eed2410..97a861c4e1 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -245,8 +245,7 @@ (arch (target-platform-keyword target-feature-list))) (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) (pushnew :futex-use-tid target-feature-list)) - (when (featurep '(:and :linux :sb-thread (:not :sb-safepoint)) - target-feature-list) + (when (featurep '(:and :sb-thread (:not :sb-safepoint)) target-feature-list) (push :pauseless-threadstart target-feature-list)) (when (featurep '(:or :darwin :openbsd) target-feature-list) (push :os-thread-stack target-feature-list)) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 21f318c606..73a0076585 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -286,7 +286,7 @@ void free_thread_struct(struct thread *th) * If this feature is set, we are running on a stack managed by the OS, * and no fancy delays are required for anything. Just do it. */ -static void +static void __attribute__((__unused__)) schedule_thread_post_mortem(struct thread *corpse) { pthread_detach(pthread_self()); @@ -521,33 +521,34 @@ unregister_thread(struct thread *th, void* new_thread_trampoline(void* arg) { #ifdef LISP_FEATURE_PAUSELESS_THREADSTART - - // 'arg' is an untagged pointer to an instance of SB-THREAD:THREAD - // which is currently pinned via *STARTING-THREADS* - // In that structure, the STARTUP-INFO slot holds a simple-vector - // which is pinned, and element 0 of the vector is also pinned. - struct thread_instance *lispthread = arg; - struct thread* th = (void*)lispthread->primitive_thread; // 'lispthread' is pinned - struct vector* startup_info = VECTOR(lispthread->startup_info); + struct thread* th = arg; + // 'th->lisp_thread' remains valid despite not being in all_threads + // due to the pinning via *STARTING-THREADS*. + struct thread_instance *lispthread = (void*)native_pointer(th->lisp_thread); + struct vector* startup_info = VECTOR(lispthread->startup_info); // 'lispthread' is pinned gc_assert(header_widetag(startup_info->header) == SIMPLE_VECTOR_WIDETAG); lispobj startfun = startup_info->data[0]; // 'startup_info' is pinned gc_assert(functionp(startfun)); -#if defined LISP_FEATURE_C_STACK_IS_CONTROL_STACK && !defined ADDRESS_SANITIZER // GC can benefit from knowing the _effective_ end of the ambiguous root range. // Nothing at a higher address than &arg needs to be scanned for ambiguous roots. // For x86 + linux this optimization skips over about 800 words in the stack scan, // and for x86-64 it skip about 550 words as observed via: // fprintf(stderr, "%d non-lisp stack words\n", // (int)((lispobj*)th->control_stack_end - (lispobj*)&arg)); - // I'm not sure why ADDRESS_SANITIZER doesn't allow this optimization. - // Both of these assertions failed for me with the sanitizer enabled: + // ADDRESS_SANITIZER doesn't allow this optimization. + // Both of these assertions fail with the sanitizer enabled: // gc_assert(th->control_stack_start <= (lispobj*)&arg // && (lispobj*)&arg <= th->control_stack_end); // gc_assert(th->control_stack_start <= (lispobj*)&startup_info // && (lispobj*)&startup_info <= th->control_stack_end); - // It must subvert the "&" and "*" operators in a way that only it understands, + // It seems to subvert the "&" and "*" operators in a way that only it understands, // while the stack pointer register is unperturbed. - // So why is it OK to take '&raise' in gencgc for the current thread? + // (gencgc takes '&raise' for the current thread, but it disables the sanitizers) + // Additionally, if we've switched stacks (because OS_THREAD_STACK is defined) + // then '&arg' seems not to be ok either. I'm not sure why, because the change + // of stack was already done. FIXME: find out what's going on there. +#if defined LISP_FEATURE_C_STACK_IS_CONTROL_STACK && !defined ADDRESS_SANITIZER \ + && !defined LISP_FEATURE_OS_THREAD_STACK th->control_stack_end = (lispobj*)&arg; #endif th->os_kernel_tid = sb_GetTID(); @@ -608,12 +609,7 @@ extern void* funcall1_switching_stack(void*, void *(*fun)(void *)) ; void* new_thread_trampoline_switch_stack(void* arg) { - struct thread *th = (struct thread *)arg; - void* ret = funcall1_switching_stack(arg, new_thread_trampoline); - - schedule_thread_post_mortem(th); - return ret; - + return funcall1_switching_stack(arg, new_thread_trampoline); } #endif @@ -1177,21 +1173,9 @@ void gc_stop_the_world() { struct thread *p,*th=arch_os_get_current_thread(); int status, lock_ret; - // There is no create_thread lock if pauseless start is enabled. - // And wouldn't the right fix for FreeBSD be to inhibit the stop-for-GC signal - // rather than acquire a lock? And why exactly there a deadlock ? - // That we don't endeavor to find these things out leads to never-ending - // accretion of dubious code that we'll not know when to remove. -#ifndef LISP_FEATURE_PAUSELESS_THREADSTART - /* KLUDGE: Stopping the thread during pthread_create() causes deadlock - * on FreeBSD. */ - FSHOW_SIGNAL((stderr,"/gc_stop_the_world:waiting on create_thread_lock\n")); - lock_ret = pthread_mutex_lock(&create_thread_lock); - gc_assert(lock_ret == 0); - FSHOW_SIGNAL((stderr,"/gc_stop_the_world:got create_thread_lock\n")); -#endif FSHOW_SIGNAL((stderr,"/gc_stop_the_world:waiting on lock\n")); - /* keep threads from starting while the world is stopped. */ + + /* Keep threads from registering with GC while the world is stopped. */ lock_ret = pthread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); @@ -1259,10 +1243,6 @@ void gc_start_the_world() lock_ret = pthread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); -#ifndef LISP_FEATURE_PAUSELESS_THREADSTART - lock_ret = pthread_mutex_unlock(&create_thread_lock); - gc_assert(lock_ret == 0); -#endif FSHOW_SIGNAL((stderr,"/gc_start_the_world:end\n")); } diff --git a/tools-for-build/grovel-headers.c b/tools-for-build/grovel-headers.c index ebf0bcf17d..f1abe29e6a 100644 --- a/tools-for-build/grovel-headers.c +++ b/tools-for-build/grovel-headers.c @@ -64,8 +64,13 @@ #include #endif -#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD) - #include "pthreads_win32.h" +#ifdef LISP_FEATURE_SB_THREAD +# ifdef LISP_FEATURE_WIN32 +# include "pthreads_win32.h" +# elif defined LISP_FEATURE_OS_THREAD_STACK +# include // PTHREAD_STACK_MIN is possibly in here +# include // instead of in here +# endif #endif #include "wrap.h" @@ -154,7 +159,12 @@ main(int argc, char __attribute__((unused)) *argv[]) defconstant ("rtld-now", RTLD_NOW); defconstant ("rtld-global", RTLD_GLOBAL); - printf("(in-package \"SB-UNIX\")\n\n"); + printf("\n(in-package \"SB-UNIX\")\n\n"); + +#if defined LISP_FEATURE_OS_THREAD_STACK + defconstant("pthread-min-stack", PTHREAD_STACK_MIN); + printf("\n"); +#endif printf(";;; select()\n"); defconstant("fd-setsize", FD_SETSIZE); From 3551525baafb646476d36e22cea25ee48bcf573e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 7 Aug 2020 23:49:21 -0400 Subject: [PATCH 0345/4023] De-flake some tests for :pauseless-threadstart feature --- tests/test-util.lisp | 20 +++++++++++++++++++- tests/threads.impure.lisp | 16 +++++++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/tests/test-util.lisp b/tests/test-util.lisp index 3aa913474d..d78a610281 100644 --- a/tests/test-util.lisp +++ b/tests/test-util.lisp @@ -120,7 +120,25 @@ (sb-ext:wait-for (null (sb-thread::thread-interruptions thread)))) (defun test-interrupt (function-to-interrupt &optional quit-p) - (let ((child (make-kill-thread function-to-interrupt))) + ;; Tests of interrupting a newly created thread can fail if the creator runs + ;; so quickly that it bypasses execution of the created thread. So the creator + ;; needs to wait, to have a facsimile of the situation prior to implementation + ;; of the so-called pauseless thread start feature. + ;; Wouldn't you know, it's just reintroducing a startup semaphore. + ;; And interruption tests are even more likely to fail with sb-thruption + ;; because sb-thruption is flawed: it presumes that there is enough synchronization + ;; between sender/receiver that checking the INVOKED variable (shared via a closure) + ;; makes any sense at all, which it doesn't. (In addition, it supposes that merely + ;; by polling at safepoints, interrupts somehow become safe, which is not true + ;; in general - it is only true of the GC "interrupt" delivered by the kernel + ;; when the safepoint page trap is hit.) + ;; Noneless, this tries to be robust enough to pass. + (let* ((sem (sb-thread:make-semaphore)) + (child (make-kill-thread + (lambda () + (sb-thread:signal-semaphore sem) + (funcall function-to-interrupt))))) + (sb-thread:wait-on-semaphore sem) (format t "interrupting child ~A~%" child) (sb-thread:interrupt-thread child (lambda () diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 80128239df..c7523057a2 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -626,11 +626,17 @@ (with-test (:name :all-threads-have-abort-restart :broken-on :win32) - (loop repeat 100 do - (let ((thread (make-kill-thread (lambda () (sleep 100000000))))) - (interrupt-thread thread (lambda () - (assert (find-restart 'abort)))) - (process-all-interrupts thread)))) + ;; This test can fail with without the extra semaphore. + ;; See also TEST-INTERRUPT in test-util for further explanation. + (let* ((sem (make-semaphore)) + (thread (make-kill-thread + (lambda () + (signal-semaphore sem) + (sleep 100000000))))) + (wait-on-semaphore sem) + (interrupt-thread thread (lambda () + (assert (find-restart 'abort)))) + (process-all-interrupts thread))) (sb-ext:gc :full t) From 5479a4cbf5a5db5de18a66e94c9590834449222b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 8 Aug 2020 00:12:14 -0400 Subject: [PATCH 0346/4023] Enable :pauseless-threadstart universally All the dead code in target-thread.lisp will be removed in a separate change, unless this change breaks the win32 build in which case it'll be reverted. --- src/code/target-thread.lisp | 9 +- src/cold/shared.lisp | 3 +- src/runtime/thread.c | 241 +++--------------------------------- 3 files changed, 22 insertions(+), 231 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 2aa788dff5..9cafe97bd8 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1661,11 +1661,13 @@ session." (c-tramp (foreign-symbol-sap #+os-thread-stack "new_thread_trampoline_switch_stack" #-os-thread-stack "new_thread_trampoline"))) - (and (= 0 #+os-thread-stack + (and (= 0 #+(or win32 os-thread-stack) (alien-funcall (extern-alien "pthread_attr_setstacksize" (function int system-area-pointer unsigned)) - attr sb-unix::pthread-min-stack) - #-os-thread-stack + attr + #+win32 (extern-alien "thread_control_stack_size" unsigned) + #-win32 sb-unix::pthread-min-stack) + #-(or win32 os-thread-stack) (with-alien ((setstack (function int system-area-pointer system-area-pointer unsigned) :extern "pthread_attr_setstack")) #+c-stack-is-control-stack @@ -1923,7 +1925,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;;; This is the faster variant of RUN-THREAD that does not wait for the new ;;; thread to start executing before returning. -;;; Also the create_thread_lock is not used in C. #+pauseless-threadstart (defun start-thread (thread function arguments) (let* ((trampoline diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 97a861c4e1..bd9a30d02c 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -245,8 +245,7 @@ (arch (target-platform-keyword target-feature-list))) (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) (pushnew :futex-use-tid target-feature-list)) - (when (featurep '(:and :sb-thread (:not :sb-safepoint)) target-feature-list) - (push :pauseless-threadstart target-feature-list)) + (push :pauseless-threadstart target-feature-list) ; Pending removal. (when (featurep '(:or :darwin :openbsd) target-feature-list) (push :os-thread-stack target-feature-list)) (when (and (member :x86 target-feature-list) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 73a0076585..bfe242ad6c 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -58,12 +58,6 @@ #include #endif -#if defined(LISP_FEATURE_WIN32) || defined(LISP_FEATURE_OS_THREAD_STACK) -# define IMMEDIATE_POST_MORTEM -#else -static __attribute__((unused)) struct thread *postmortem_thread; -#endif - #endif int dynamic_values_bytes = 4096 * sizeof(lispobj); // same for all threads @@ -74,8 +68,6 @@ struct thread *all_threads; #ifdef LISP_FEATURE_SB_THREAD pthread_mutex_t all_threads_lock = PTHREAD_MUTEX_INITIALIZER; -static __attribute__((unused)) pthread_mutex_t create_thread_lock = PTHREAD_MUTEX_INITIALIZER; - #ifdef LISP_FEATURE_GCC_TLS __thread struct thread *current_thread; #else @@ -262,15 +254,6 @@ void create_main_lisp_thread(lispobj function) { #ifdef LISP_FEATURE_SB_THREAD -/* THREAD POST MORTEM CLEANUP - * - * Memory allocated for the thread stacks cannot be reclaimed while - * the thread is still alive, so we need a mechanism for post mortem - * cleanups. FIXME: We actually have two, for historical reasons as - * the saying goes. Do we really need two? Nikodemus guesses that - * not anymore, now that we properly call pthread_attr_destroy before - * freeing the stack. */ - void free_thread_struct(struct thread *th) { #if defined(LISP_FEATURE_WIN32) @@ -280,91 +263,6 @@ void free_thread_struct(struct thread *th) #endif } -# if defined(IMMEDIATE_POST_MORTEM) - -/* - * If this feature is set, we are running on a stack managed by the OS, - * and no fancy delays are required for anything. Just do it. - */ -static void __attribute__((__unused__)) -schedule_thread_post_mortem(struct thread *corpse) -{ - pthread_detach(pthread_self()); - free_thread_struct(corpse); -} - -# elif !defined LISP_FEATURE_PAUSELESS_THREADSTART - -static void -perform_thread_post_mortem(struct thread *post_mortem) -{ - gc_assert(post_mortem); - /* The thread may exit before pthread_create() has finished - initialization and it may write into already unmapped - memory. This lock doesn't actually need to protect - anything, just to make sure that at least one call to - pthread_create() has finished. - - Possible improvements: stash the address of the thread - struct for which a pthread is being created and don't lock - here if it's not the one being terminated. */ - int result = pthread_mutex_lock(&create_thread_lock); - gc_assert(result == 0); - result = pthread_mutex_unlock(&create_thread_lock); - gc_assert(result == 0); - - if ((result = pthread_join(post_mortem->os_thread, NULL))) { - lose("Error calling pthread_join in perform_thread_post_mortem:\n%s", - strerror(result)); - } - free_thread_struct(post_mortem); -} - -static inline struct thread* -fifo_buffer_shift(struct thread** dest, struct thread* value) -{ -#ifdef __ATOMIC_SEQ_CST - return __atomic_exchange_n(dest, value, __ATOMIC_SEQ_CST); -#elif defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) - /* I'd like to remove this case but I don't know whether MSVC has - * either of __atomic_exchange_n() or __sync_val_compare_and_swap() */ - lispobj old_value; - asm volatile - ("lock xchg %0,(%1)" - : "=r" (old_value) - : "r" (dest), "0" (value) - : "memory"); - return old_value; -#else - // We don't want a compare-and-swap, but if that's all we have, - // then build an atomic exchange out of compare-and-swap - lispobj old = *dest; - while (1) { - lispobj actual = __sync_val_compare_and_swap(dest, old, value); - if (actual == old) - return old; - old = actual; - } -#endif -} - -static void -schedule_thread_post_mortem(struct thread *corpse) -{ - gc_assert(corpse); - // This strange little mechanism is a FIFO buffer of capacity 1. - // By stuffing one new thing in and reading the old one out, we ensure - // that at least one pthread_create() has completed by this point. - // In particular, the thread we're post-morteming must have completed - // because thread creation is completely serialized (which is - // somewhat unfortunate). - struct thread* previous = fifo_buffer_shift(&postmortem_thread, corpse); - if (previous) // any random thread which pre-deceased me - perform_thread_post_mortem(previous); -} - -# endif /* !IMMEDIATE_POST_MORTEM */ - /* Note: scribble must be stack-allocated */ static void init_new_thread(struct thread *th, @@ -520,7 +418,17 @@ unregister_thread(struct thread *th, */ void* new_thread_trampoline(void* arg) { -#ifdef LISP_FEATURE_PAUSELESS_THREADSTART +#ifdef LISP_FEATURE_SB_SAFEPOINT + init_thread_data scribble; + // This "scribble" thing is really quite pointless because the original sigset_t + // was passed in the thread's startup info (unless no signals at all were blocked). + // And when terminating, why does anyone care what the signal mask was??? + // Well, there's a big "however": '&scribble' is no mere pass-by-reference arg- + // it is actually used as an approximation of the C stack pointer. +#define SCRIBBLE &scribble +#else +#define SCRIBBLE 0 +#endif struct thread* th = arg; // 'th->lisp_thread' remains valid despite not being in all_threads // due to the pinning via *STARTING-THREADS*. @@ -552,7 +460,7 @@ void* new_thread_trampoline(void* arg) th->control_stack_end = (lispobj*)&arg; #endif th->os_kernel_tid = sb_GetTID(); - init_new_thread(th, 0, 0, 0); + init_new_thread(th, SCRIBBLE, 0, 0); // The lisp thread instance stores the stack end for one purpose only, for // SB-EXT:STACK-ALLOCATED-P to quickly check whether an object is on some // thread's stack by looking only the all-threads tree and not acquiring a lock @@ -569,36 +477,8 @@ void* new_thread_trampoline(void* arg) // (a regression test asserts that not even a THREAD instance is on the stack) long result = funcall1(startfun, (lispobj)lispthread); // both pinned // Close the GC region and unlink from all_threads - unregister_thread(th, 0); - -#else // !PAUSELESS_THREADSTART - - struct thread *th = (struct thread *)arg; - th->os_kernel_tid = sb_GetTID(); - int result; - init_thread_data scribble; - - FSHOW((stderr,"/creating thread %p\n", thread_self())); - check_deferrables_blocked_or_lose(0); -#ifndef LISP_FEATURE_SB_SAFEPOINT - check_gc_signals_unblocked_or_lose(0); -#endif - - lispobj function = th->no_tls_value_marker; - th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; - init_new_thread(th, &scribble, - GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK, - 0); - result = funcall0(function); - unregister_thread(th, &scribble); - -#ifndef LISP_FEATURE_OS_THREAD_STACK - schedule_thread_post_mortem(th); -#endif -#endif - - FSHOW((stderr,"/exiting thread %p\n", thread_self())); - return (void*)(uintptr_t)result; + unregister_thread(th, SCRIBBLE); + return (void*)result; } #ifdef LISP_FEATURE_OS_THREAD_STACK @@ -1067,94 +947,7 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { return th; } -#ifdef LISP_FEATURE_SB_THREAD - -#ifndef __USE_XOPEN2K -extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, - size_t __stacksize); -#endif - -#ifndef LISP_FEATURE_PAUSELESS_THREADSTART - -/* Call pthread_create() and return 1 for success, 0 for failure */ -boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) -{ - /* The new thread inherits the restrictive signal mask set here, - * and enables signals again when it is set up properly. */ - sigset_t oldset; - int retcode = 0; - boolean success = 0; - - /* Blocking deferrable signals is enough, no need to block - * SIG_STOP_FOR_GC because the child process is not linked onto - * all_threads until it's ready. */ - block_deferrable_signals(&oldset); - - pthread_attr_t attr; - if (pthread_attr_init(&attr) == 0) { - - /* See perform_thread_post_mortem for at least one reason why this lock is necessary */ - retcode = pthread_mutex_lock(&create_thread_lock); - gc_assert(retcode == 0); - - /* call_into_lisp_first_time switches the stack for the initial - * thread. For the others, we use this. */ - if ( -#ifdef LISP_FEATURE_OS_THREAD_STACK - pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) || - (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline_switch_stack, th)) -#else - -# ifdef LISP_FEATURE_WIN32 - pthread_attr_setstacksize(&attr, thread_control_stack_size) || -# elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) - pthread_attr_setstack(&attr, th->control_stack_start, thread_control_stack_size) || -# else - pthread_attr_setstack(&attr, th->alien_stack_start, ALIEN_STACK_SIZE) || -# endif -# ifdef LISP_FEATURE_NETBSD - /* Even though the manpage says pthread_attr_setstack - would override the guard page, it's no longer true. */ - pthread_attr_setguardsize(&attr, 0) || -# endif - - (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline, th)) -#endif - ) { - perror("create_os_thread"); - } else { - success = 1; - } - retcode = pthread_mutex_unlock(&create_thread_lock); - gc_assert(retcode == 0); - pthread_attr_destroy(&attr); - } - - thread_sigmask(SIG_SETMASK,&oldset,0); - return success; -} - -os_thread_t create_thread(lispobj start_routine) { - struct thread *th, *thread = arch_os_get_current_thread(); - os_thread_t kid_tid = 0; - - /* Must defend against async unwinds. */ - if (read_TLS(INTERRUPTS_ENABLED, thread) != NIL) - lose("create_thread is not safe when interrupts are enabled."); - - /* Assuming that a fresh thread struct has no lisp objects in it, - * linking it to all_threads can be left to the thread itself - * without fear of gc lossage. 'start_routine' violates this - * assumption and must stay pinned until the child starts up. */ - th = alloc_thread_struct(0, start_routine); - if (th && !create_os_thread(th, &kid_tid)) { - free_thread_struct(th); - kid_tid = 0; - } - return kid_tid; -} - -#endif +#if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_SB_SAFEPOINT /* stopping the world is a two-stage process. From this thread we signal * all the others with SIG_STOP_FOR_GC. The handler for this signal does @@ -1164,7 +957,6 @@ os_thread_t create_thread(lispobj start_routine) { /* * (With SB-SAFEPOINT, see the definitions in safepoint.c instead.) */ -#ifndef LISP_FEATURE_SB_SAFEPOINT /* To avoid deadlocks when gc stops the world all clients of each * mutex must enable or disable SIG_STOP_FOR_GC for the duration of @@ -1247,8 +1039,7 @@ void gc_start_the_world() FSHOW_SIGNAL((stderr,"/gc_start_the_world:end\n")); } -#endif /* !LISP_FEATURE_SB_SAFEPOINT */ -#endif /* !LISP_FEATURE_SB_THREAD */ +#endif // thread + not safepoint int thread_yield() From 6590893021260649588997b80c3c56d32ebbfb73 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 8 Aug 2020 17:26:36 +0300 Subject: [PATCH 0347/4023] Add some constants to grovel-headers-win32.h --- src/cold/shared.lisp | 3 ++- tools-for-build/grovel-headers-win32.h | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index bd9a30d02c..9284a461e4 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -245,7 +245,8 @@ (arch (target-platform-keyword target-feature-list))) (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) (pushnew :futex-use-tid target-feature-list)) - (push :pauseless-threadstart target-feature-list) ; Pending removal. + (when (featurep :sb-thread) + (push :pauseless-threadstart target-feature-list)) ; Pending removal. (when (featurep '(:or :darwin :openbsd) target-feature-list) (push :os-thread-stack target-feature-list)) (when (and (member :x86 target-feature-list) diff --git a/tools-for-build/grovel-headers-win32.h b/tools-for-build/grovel-headers-win32.h index 6f9a08fdcf..42befd3751 100644 --- a/tools-for-build/grovel-headers-win32.h +++ b/tools-for-build/grovel-headers-win32.h @@ -222,4 +222,9 @@ defconstant("fd-setsize", 1024); printf("\n"); + defconstant("sizeof-sigset_t", sizeof (sigset_t)); + defconstant("sig_block", SIG_BLOCK); + defconstant("sig_unblock", SIG_UNBLOCK); + defconstant("sig_setmask", SIG_SETMASK); + } From 3e83c24f22e31b91fe6e2e82690643f0df37433f Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 8 Aug 2020 17:32:06 +0300 Subject: [PATCH 0348/4023] Don't push :pauseless-threadstart if no :sb-thread --- src/cold/shared.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 9284a461e4..53d4fc6310 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -245,8 +245,8 @@ (arch (target-platform-keyword target-feature-list))) (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) (pushnew :futex-use-tid target-feature-list)) - (when (featurep :sb-thread) - (push :pauseless-threadstart target-feature-list)) ; Pending removal. + (when (featurep :sb-thread target-feature-list) + (push :pauseless-threadstart target-feature-list)) ; Pending removal. (when (featurep '(:or :darwin :openbsd) target-feature-list) (push :os-thread-stack target-feature-list)) (when (and (member :x86 target-feature-list) From a6e4cf53c3ecec7d592e7324cbd12a828fd83a36 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 8 Aug 2020 18:45:11 +0300 Subject: [PATCH 0349/4023] No pthread_sigmask on win32. --- src/code/target-thread.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 9cafe97bd8..ff4e57bd22 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1769,7 +1769,8 @@ session." (unless (= (sap-int thread-sap) 0) thread-sap)))) (defun pthread-sigmask (how new old) - (alien-funcall (extern-alien "pthread_sigmask" + (alien-funcall (extern-alien #-win32 "pthread_sigmask" + #+win32 "_sbcl_pthread_sigmask" (function void int system-area-pointer system-area-pointer)) how (cond ((system-area-pointer-p new) new) From 081be93f166801f8d5a18a1d088b5b781da08868 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 8 Aug 2020 14:51:32 -0400 Subject: [PATCH 0350/4023] win32: Don't try to determine stack end in thread trampoline --- src/runtime/thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index bfe242ad6c..c15530af59 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -456,7 +456,7 @@ void* new_thread_trampoline(void* arg) // then '&arg' seems not to be ok either. I'm not sure why, because the change // of stack was already done. FIXME: find out what's going on there. #if defined LISP_FEATURE_C_STACK_IS_CONTROL_STACK && !defined ADDRESS_SANITIZER \ - && !defined LISP_FEATURE_OS_THREAD_STACK + && !defined LISP_FEATURE_OS_THREAD_STACK && !defined LISP_FEATURE_WIN32 th->control_stack_end = (lispobj*)&arg; #endif th->os_kernel_tid = sb_GetTID(); From 717dffcbb807f5befa433f4acb02a1cf1a14a3f3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 8 Aug 2020 14:54:00 -0400 Subject: [PATCH 0351/4023] Remove some hand-written assembly code --- src/runtime/x86-64-assem.S | 10 ---------- src/runtime/x86-64-linux-os.c | 4 ++-- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index 9c74602d92..53a1cab7d4 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -25,9 +25,6 @@ #include "genesis/fdefn.h" #include "genesis/static-symbols.h" #include "genesis/thread.h" -#ifdef MEMORY_SANITIZER -#include "genesis/symbol.h" -#endif #include "genesis/ratio.h" #include "genesis/complex.h" @@ -127,13 +124,6 @@ GNAME(call_into_lisp_first_time): GNAME(lspmain): # so much easier to type 'b lspmain' in gdb push %rbp # Save old frame pointer. mov %rsp,%rbp # Establish new frame. -#ifdef MEMORY_SANITIZER // Presumes GCC_TLS and SB_THREAD - movq GNAME(current_thread)@GOTTPOFF(%rip), %r8 // Clobberable - movq %fs:(%r8), %r8 - movq %fs:0, %rax - leaq __msan_param_tls@TPOFF(%rax), %rax - movq %rax, THREAD_MSAN_PARAM_TLS_OFFSET(%r8) -#endif LOAD_PIC_VAR(all_threads, %rax) mov THREAD_CONTROL_STACK_END_OFFSET(%rax) ,%rsp jmp Lstack diff --git a/src/runtime/x86-64-linux-os.c b/src/runtime/x86-64-linux-os.c index 1cc89b672c..f4ff2506be 100644 --- a/src/runtime/x86-64-linux-os.c +++ b/src/runtime/x86-64-linux-os.c @@ -62,8 +62,8 @@ int arch_os_thread_init(struct thread *thread) { } #endif #ifdef MEMORY_SANITIZER - asm("movq %%fs:0, %0\n\tleaq __msan_param_tls@TPOFF(%0), %0" - : "=r" (thread->msan_param_tls)); + extern __thread unsigned long __msan_param_tls[]; + thread->msan_param_tls = (uword_t)&__msan_param_tls[0]; #endif return 1; } From 783dd45c113baddceadce28d698ee2322652cd60 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 9 Aug 2020 00:36:03 +0300 Subject: [PATCH 0352/4023] Halfway working :os-thread-stack on win32. --- src/code/target-thread.lisp | 2 +- src/runtime/thread.c | 13 +++++------- src/runtime/x86-64-assem.S | 22 ++++++++++++++++++-- src/runtime/x86-64-win32-os.c | 39 +---------------------------------- 4 files changed, 27 insertions(+), 49 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index ff4e57bd22..9205d80935 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1770,7 +1770,7 @@ session." (defun pthread-sigmask (how new old) (alien-funcall (extern-alien #-win32 "pthread_sigmask" - #+win32 "_sbcl_pthread_sigmask" + #+win32 "_sbcl_pthread_sigmask" (function void int system-area-pointer system-area-pointer)) how (cond ((system-area-pointer-p new) new) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index c15530af59..850bdb44a3 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -245,7 +245,8 @@ void create_main_lisp_thread(lispobj function) { /* WIN32 has a special stack arrangement, calling * call_into_lisp_first_time will put the new stack in the middle * of the current stack */ -#if !defined(LISP_FEATURE_WIN32) && (defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64)) +#if !(defined(LISP_FEATURE_WIN32) && !defined(OS_THREAD_STACK)) \ + && (defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64)) call_into_lisp_first_time(function,args,0); #else funcall0(function); @@ -482,14 +483,10 @@ void* new_thread_trampoline(void* arg) } #ifdef LISP_FEATURE_OS_THREAD_STACK -extern void* funcall1_switching_stack(void*, void *(*fun)(void *)) -# ifdef LISP_FEATURE_X86_64 - __attribute__((sysv_abi)) -# endif - ; +extern void* funcall1_switching_stack(void*, void *(*fun)(void *)); -void* new_thread_trampoline_switch_stack(void* arg) { - return funcall1_switching_stack(arg, new_thread_trampoline); +void* new_thread_trampoline_switch_stack(void* th) { + return funcall1_switching_stack(th, new_thread_trampoline); } #endif diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index 53a1cab7d4..b597eed9bc 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -89,6 +89,16 @@ #define THREAD_BASE_REG %r13 +#ifdef LISP_FEATURE_WIN32 +#define CARG1 %rcx +#define CARG2 %rdx +#define CARG3 %r8 +#else +#define CARG1 %rdi +#define CARG2 %rsi +#define CARG3 %rdx +#endif + #ifdef LISP_FEATURE_OS_THREAD_STACK .text .globl GNAME(funcall1_switching_stack) @@ -101,8 +111,16 @@ GNAME(funcall1_switching_stack): push %rbp mov %rsp,%rbp - mov THREAD_CONTROL_STACK_END_OFFSET(%rdi),%rsp - call *%rsi + mov THREAD_CONTROL_STACK_END_OFFSET(CARG1),%rsp + +#ifdef LISP_FEATURE_WIN32 + /* _chkstk() is called at some unknown points and is + expecting that + */ + mov THREAD_CONTROL_STACK_START_OFFSET(CARG1), %rax + movq %rax, %gs:16 +#endif + call *CARG2 mov %rbp, %rsp pop %rbp diff --git a/src/runtime/x86-64-win32-os.c b/src/runtime/x86-64-win32-os.c index 49b9dd9349..17e7971184 100644 --- a/src/runtime/x86-64-win32-os.c +++ b/src/runtime/x86-64-win32-os.c @@ -40,44 +40,7 @@ #include "validate.h" -int arch_os_thread_init(struct thread *thread) -{ - - void *cur_stack_end; - MEMORY_BASIC_INFORMATION stack_memory; - - asm volatile ("mov %%gs:8,%0": "=r" (cur_stack_end)); - - /* Can't pull stack start from fs:4 or fs:8 or whatever, - * because that's only what currently has memory behind - * it from being used, so do a quick VirtualQuery() and - * grab the AllocationBase. -AB 2006/11/25 - */ - - if (!VirtualQuery(&stack_memory, &stack_memory, sizeof(stack_memory))) { - fprintf(stderr, "VirtualQuery: 0x%lx.\n", GetLastError()); - lose("Could not query stack memory information."); - } - - thread->control_stack_start = stack_memory.AllocationBase; - thread->control_stack_end = cur_stack_end; - -#ifndef LISP_FEATURE_SB_THREAD - /* - * Theoretically, threaded SBCL binds directly against - * the thread structure for these values. We don't do - * threads yet, but we'll probably do the same. We do - * need to reset these, though, because they were - * initialized based on the wrong stack space. - */ - SetSymbolValue(CONTROL_STACK_START,(lispobj)thread->control_stack_start,thread); - SetSymbolValue(CONTROL_STACK_END,(lispobj)thread->control_stack_end,thread); -#endif - - -#ifdef LISP_FEATURE_SB_THREAD - pthread_setspecific(specials,thread); // FIXME: remove this line? -#endif +int arch_os_thread_init(struct thread *thread) { return 1; } From f49d7e0d683a91b6a76ad0ea0b60c49d6f6005eb Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 9 Aug 2020 02:58:34 +0300 Subject: [PATCH 0353/4023] Disable :pauseless-threadstart on :sb-safepoint. --- src/code/target-thread.lisp | 9 +- src/cold/shared.lisp | 4 +- src/runtime/pthreads_win32.h | 2 + src/runtime/thread.c | 241 +++++++++++++++++++++++++++++++--- src/runtime/x86-64-win32-os.c | 37 +++++- 5 files changed, 269 insertions(+), 24 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 9205d80935..a66f9ae2e2 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1661,13 +1661,11 @@ session." (c-tramp (foreign-symbol-sap #+os-thread-stack "new_thread_trampoline_switch_stack" #-os-thread-stack "new_thread_trampoline"))) - (and (= 0 #+(or win32 os-thread-stack) + (and (= 0 #+os-thread-stack (alien-funcall (extern-alien "pthread_attr_setstacksize" (function int system-area-pointer unsigned)) - attr - #+win32 (extern-alien "thread_control_stack_size" unsigned) - #-win32 sb-unix::pthread-min-stack) - #-(or win32 os-thread-stack) + attr sb-unix::pthread-min-stack) + #-os-thread-stack (with-alien ((setstack (function int system-area-pointer system-area-pointer unsigned) :extern "pthread_attr_setstack")) #+c-stack-is-control-stack @@ -1926,6 +1924,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;;; This is the faster variant of RUN-THREAD that does not wait for the new ;;; thread to start executing before returning. +;;; Also the create_thread_lock is not used in C. #+pauseless-threadstart (defun start-thread (thread function arguments) (let* ((trampoline diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 53d4fc6310..97a861c4e1 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -245,8 +245,8 @@ (arch (target-platform-keyword target-feature-list))) (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) (pushnew :futex-use-tid target-feature-list)) - (when (featurep :sb-thread target-feature-list) - (push :pauseless-threadstart target-feature-list)) ; Pending removal. + (when (featurep '(:and :sb-thread (:not :sb-safepoint)) target-feature-list) + (push :pauseless-threadstart target-feature-list)) (when (featurep '(:or :darwin :openbsd) target-feature-list) (push :os-thread-stack target-feature-list)) (when (and (member :x86 target-feature-list) diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index e124c95c64..e8f11fc07a 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -55,6 +55,8 @@ typedef int sigset_t; #define PTHREAD_DESTRUCTOR_ITERATIONS 4 +#define PTHREAD_STACK_MIN 0 + void pthreads_win32_init(); /* 1 - Thread */ diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 850bdb44a3..555682b3f9 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -58,6 +58,12 @@ #include #endif +#if defined(LISP_FEATURE_WIN32) || defined(LISP_FEATURE_OS_THREAD_STACK) +# define IMMEDIATE_POST_MORTEM +#else +static __attribute__((unused)) struct thread *postmortem_thread; +#endif + #endif int dynamic_values_bytes = 4096 * sizeof(lispobj); // same for all threads @@ -68,6 +74,8 @@ struct thread *all_threads; #ifdef LISP_FEATURE_SB_THREAD pthread_mutex_t all_threads_lock = PTHREAD_MUTEX_INITIALIZER; +static __attribute__((unused)) pthread_mutex_t create_thread_lock = PTHREAD_MUTEX_INITIALIZER; + #ifdef LISP_FEATURE_GCC_TLS __thread struct thread *current_thread; #else @@ -255,6 +263,15 @@ void create_main_lisp_thread(lispobj function) { #ifdef LISP_FEATURE_SB_THREAD +/* THREAD POST MORTEM CLEANUP + * + * Memory allocated for the thread stacks cannot be reclaimed while + * the thread is still alive, so we need a mechanism for post mortem + * cleanups. FIXME: We actually have two, for historical reasons as + * the saying goes. Do we really need two? Nikodemus guesses that + * not anymore, now that we properly call pthread_attr_destroy before + * freeing the stack. */ + void free_thread_struct(struct thread *th) { #if defined(LISP_FEATURE_WIN32) @@ -264,6 +281,91 @@ void free_thread_struct(struct thread *th) #endif } +# if defined(IMMEDIATE_POST_MORTEM) + +/* + * If this feature is set, we are running on a stack managed by the OS, + * and no fancy delays are required for anything. Just do it. + */ +static void __attribute__((__unused__)) +schedule_thread_post_mortem(struct thread *corpse) +{ + pthread_detach(pthread_self()); + free_thread_struct(corpse); +} + +# elif !defined LISP_FEATURE_PAUSELESS_THREADSTART + +static void +perform_thread_post_mortem(struct thread *post_mortem) +{ + gc_assert(post_mortem); + /* The thread may exit before pthread_create() has finished + initialization and it may write into already unmapped + memory. This lock doesn't actually need to protect + anything, just to make sure that at least one call to + pthread_create() has finished. + + Possible improvements: stash the address of the thread + struct for which a pthread is being created and don't lock + here if it's not the one being terminated. */ + int result = pthread_mutex_lock(&create_thread_lock); + gc_assert(result == 0); + result = pthread_mutex_unlock(&create_thread_lock); + gc_assert(result == 0); + + if ((result = pthread_join(post_mortem->os_thread, NULL))) { + lose("Error calling pthread_join in perform_thread_post_mortem:\n%s", + strerror(result)); + } + free_thread_struct(post_mortem); +} + +static inline struct thread* +fifo_buffer_shift(struct thread** dest, struct thread* value) +{ +#ifdef __ATOMIC_SEQ_CST + return __atomic_exchange_n(dest, value, __ATOMIC_SEQ_CST); +#elif defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) + /* I'd like to remove this case but I don't know whether MSVC has + * either of __atomic_exchange_n() or __sync_val_compare_and_swap() */ + lispobj old_value; + asm volatile + ("lock xchg %0,(%1)" + : "=r" (old_value) + : "r" (dest), "0" (value) + : "memory"); + return old_value; +#else + // We don't want a compare-and-swap, but if that's all we have, + // then build an atomic exchange out of compare-and-swap + lispobj old = *dest; + while (1) { + lispobj actual = __sync_val_compare_and_swap(dest, old, value); + if (actual == old) + return old; + old = actual; + } +#endif +} + +static void +schedule_thread_post_mortem(struct thread *corpse) +{ + gc_assert(corpse); + // This strange little mechanism is a FIFO buffer of capacity 1. + // By stuffing one new thing in and reading the old one out, we ensure + // that at least one pthread_create() has completed by this point. + // In particular, the thread we're post-morteming must have completed + // because thread creation is completely serialized (which is + // somewhat unfortunate). + struct thread* previous = fifo_buffer_shift(&postmortem_thread, corpse); + if (previous) // any random thread which pre-deceased me + perform_thread_post_mortem(previous); +} + +# endif /* !IMMEDIATE_POST_MORTEM */ + /* Note: scribble must be stack-allocated */ static void init_new_thread(struct thread *th, @@ -419,17 +521,7 @@ unregister_thread(struct thread *th, */ void* new_thread_trampoline(void* arg) { -#ifdef LISP_FEATURE_SB_SAFEPOINT - init_thread_data scribble; - // This "scribble" thing is really quite pointless because the original sigset_t - // was passed in the thread's startup info (unless no signals at all were blocked). - // And when terminating, why does anyone care what the signal mask was??? - // Well, there's a big "however": '&scribble' is no mere pass-by-reference arg- - // it is actually used as an approximation of the C stack pointer. -#define SCRIBBLE &scribble -#else -#define SCRIBBLE 0 -#endif +#ifdef LISP_FEATURE_PAUSELESS_THREADSTART struct thread* th = arg; // 'th->lisp_thread' remains valid despite not being in all_threads // due to the pinning via *STARTING-THREADS*. @@ -461,7 +553,7 @@ void* new_thread_trampoline(void* arg) th->control_stack_end = (lispobj*)&arg; #endif th->os_kernel_tid = sb_GetTID(); - init_new_thread(th, SCRIBBLE, 0, 0); + init_new_thread(th, 0, 0, 0); // The lisp thread instance stores the stack end for one purpose only, for // SB-EXT:STACK-ALLOCATED-P to quickly check whether an object is on some // thread's stack by looking only the all-threads tree and not acquiring a lock @@ -478,8 +570,36 @@ void* new_thread_trampoline(void* arg) // (a regression test asserts that not even a THREAD instance is on the stack) long result = funcall1(startfun, (lispobj)lispthread); // both pinned // Close the GC region and unlink from all_threads - unregister_thread(th, SCRIBBLE); - return (void*)result; + unregister_thread(th, 0); + +#else // !PAUSELESS_THREADSTART + + struct thread *th = (struct thread *)arg; + th->os_kernel_tid = sb_GetTID(); + int result; + init_thread_data scribble; + + FSHOW((stderr,"/creating thread %p\n", thread_self())); + check_deferrables_blocked_or_lose(0); +#ifndef LISP_FEATURE_SB_SAFEPOINT + check_gc_signals_unblocked_or_lose(0); +#endif + + lispobj function = th->no_tls_value_marker; + th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; + init_new_thread(th, &scribble, + GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK, + 0); + result = funcall0(function); + unregister_thread(th, &scribble); + +#ifndef LISP_FEATURE_OS_THREAD_STACK + schedule_thread_post_mortem(th); +#endif +#endif + + FSHOW((stderr,"/exiting thread %p\n", thread_self())); + return (void*)(uintptr_t)result; } #ifdef LISP_FEATURE_OS_THREAD_STACK @@ -944,7 +1064,94 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { return th; } -#if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_SB_SAFEPOINT +#ifdef LISP_FEATURE_SB_THREAD + +#ifndef __USE_XOPEN2K +extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, + size_t __stacksize); +#endif + +#ifndef LISP_FEATURE_PAUSELESS_THREADSTART + +/* Call pthread_create() and return 1 for success, 0 for failure */ +boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) +{ + /* The new thread inherits the restrictive signal mask set here, + * and enables signals again when it is set up properly. */ + sigset_t oldset; + int retcode = 0; + boolean success = 0; + + /* Blocking deferrable signals is enough, no need to block + * SIG_STOP_FOR_GC because the child process is not linked onto + * all_threads until it's ready. */ + block_deferrable_signals(&oldset); + + pthread_attr_t attr; + if (pthread_attr_init(&attr) == 0) { + + /* See perform_thread_post_mortem for at least one reason why this lock is necessary */ + retcode = pthread_mutex_lock(&create_thread_lock); + gc_assert(retcode == 0); + + /* call_into_lisp_first_time switches the stack for the initial + * thread. For the others, we use this. */ + if ( +#ifdef LISP_FEATURE_OS_THREAD_STACK + pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) || + (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline_switch_stack, th)) +#else + +# ifdef LISP_FEATURE_WIN32 + pthread_attr_setstacksize(&attr, thread_control_stack_size) || +# elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) + pthread_attr_setstack(&attr, th->control_stack_start, thread_control_stack_size) || +# else + pthread_attr_setstack(&attr, th->alien_stack_start, ALIEN_STACK_SIZE) || +# endif +# ifdef LISP_FEATURE_NETBSD + /* Even though the manpage says pthread_attr_setstack + would override the guard page, it's no longer true. */ + pthread_attr_setguardsize(&attr, 0) || +# endif + + (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline, th)) +#endif + ) { + perror("create_os_thread"); + } else { + success = 1; + } + retcode = pthread_mutex_unlock(&create_thread_lock); + gc_assert(retcode == 0); + pthread_attr_destroy(&attr); + } + + thread_sigmask(SIG_SETMASK,&oldset,0); + return success; +} + +os_thread_t create_thread(lispobj start_routine) { + struct thread *th, *thread = arch_os_get_current_thread(); + os_thread_t kid_tid = 0; + + /* Must defend against async unwinds. */ + if (read_TLS(INTERRUPTS_ENABLED, thread) != NIL) + lose("create_thread is not safe when interrupts are enabled."); + + /* Assuming that a fresh thread struct has no lisp objects in it, + * linking it to all_threads can be left to the thread itself + * without fear of gc lossage. 'start_routine' violates this + * assumption and must stay pinned until the child starts up. */ + th = alloc_thread_struct(0, start_routine); + if (th && !create_os_thread(th, &kid_tid)) { + free_thread_struct(th); + kid_tid = 0; + } + return kid_tid; +} + +#endif /* stopping the world is a two-stage process. From this thread we signal * all the others with SIG_STOP_FOR_GC. The handler for this signal does @@ -954,6 +1161,7 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { /* * (With SB-SAFEPOINT, see the definitions in safepoint.c instead.) */ +#ifndef LISP_FEATURE_SB_SAFEPOINT /* To avoid deadlocks when gc stops the world all clients of each * mutex must enable or disable SIG_STOP_FOR_GC for the duration of @@ -1036,7 +1244,8 @@ void gc_start_the_world() FSHOW_SIGNAL((stderr,"/gc_start_the_world:end\n")); } -#endif // thread + not safepoint +#endif /* !LISP_FEATURE_SB_SAFEPOINT */ +#endif /* !LISP_FEATURE_SB_THREAD */ int thread_yield() diff --git a/src/runtime/x86-64-win32-os.c b/src/runtime/x86-64-win32-os.c index 17e7971184..96c5f2e6eb 100644 --- a/src/runtime/x86-64-win32-os.c +++ b/src/runtime/x86-64-win32-os.c @@ -40,7 +40,42 @@ #include "validate.h" -int arch_os_thread_init(struct thread *thread) { +int arch_os_thread_init(struct thread *thread) +{ +#ifndef LISP_FEATURE_OS_THREAD_STACK + void *cur_stack_end; + MEMORY_BASIC_INFORMATION stack_memory; + + asm volatile ("mov %%gs:8,%0": "=r" (cur_stack_end)); + + /* Can't pull stack start from fs:4 or fs:8 or whatever, + * because that's only what currently has memory behind + * it from being used, so do a quick VirtualQuery() and + * grab the AllocationBase. -AB 2006/11/25 + */ + + if (!VirtualQuery(&stack_memory, &stack_memory, sizeof(stack_memory))) { + fprintf(stderr, "VirtualQuery: 0x%lx.\n", GetLastError()); + lose("Could not query stack memory information."); + } + + thread->control_stack_start = stack_memory.AllocationBase; + thread->control_stack_end = cur_stack_end; + +#ifndef LISP_FEATURE_SB_THREAD + /* + * Theoretically, threaded SBCL binds directly against + * the thread structure for these values. We don't do + * threads yet, but we'll probably do the same. We do + * need to reset these, though, because they were + * initialized based on the wrong stack space. + */ + SetSymbolValue(CONTROL_STACK_START,(lispobj)thread->control_stack_start,thread); + SetSymbolValue(CONTROL_STACK_END,(lispobj)thread->control_stack_end,thread); +#endif + + +#endif return 1; } From d3f2469424cc40d0248a3cffa52ce6344e3a4104 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 9 Aug 2020 14:56:51 +0300 Subject: [PATCH 0354/4023] Don't push :os-thread-stack on -sb-thread. Reported by Alfred M. Szmidt --- src/cold/shared.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 97a861c4e1..12c66c3856 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -247,7 +247,7 @@ (pushnew :futex-use-tid target-feature-list)) (when (featurep '(:and :sb-thread (:not :sb-safepoint)) target-feature-list) (push :pauseless-threadstart target-feature-list)) - (when (featurep '(:or :darwin :openbsd) target-feature-list) + (when (featurep '(:and :sb-thread (:or :darwin :openbsd)) target-feature-list) (push :os-thread-stack target-feature-list)) (when (and (member :x86 target-feature-list) (member :int4-breakpoints target-feature-list)) From d95ab8135d3f9f256fda13969e674d86a81f57ed Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 9 Aug 2020 21:29:42 +0300 Subject: [PATCH 0355/4023] Inline float-infinity-p in two-arg-=<> --- build-order.lisp-expr | 4 +- src/code/number-dispatch.lisp | 227 +++++++++++++++++++++++++++++ src/code/numbers.lisp | 262 +++------------------------------- 3 files changed, 253 insertions(+), 240 deletions(-) create mode 100644 src/code/number-dispatch.lisp diff --git a/build-order.lisp-expr b/build-order.lisp-expr index 0ac6f33a9a..a36c124a91 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -231,9 +231,11 @@ ("src/code/target-signal-common" :not-host) ("src/code/bignum" :not-host) + ("src/code/number-dispatch" :not-host) + ("src/code/float" :not-host) ("src/code/numbers" :not-host) ("src/code/float-trap" :not-host) - ("src/code/float" :not-host) + ("src/code/irrat" :not-host) ("src/code/misc" :c-headers) diff --git a/src/code/number-dispatch.lisp b/src/code/number-dispatch.lisp new file mode 100644 index 0000000000..97990dc012 --- /dev/null +++ b/src/code/number-dispatch.lisp @@ -0,0 +1,227 @@ +;;;; This file contains the the NUMBER-DISPATCH macro + +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. + +(in-package "SB-KERNEL") + +(eval-when (:compile-toplevel :load-toplevel :execute) + +;;; Grovel an individual case to NUMBER-DISPATCH, augmenting RESULT +;;; with the type dispatches and bodies. Result is a tree built of +;;; alists representing the dispatching off each arg (in order). The +;;; leaf is the body to be executed in that case. + (defun parse-number-dispatch (vars result types var-types body) + ;; Shouldn't be necessary, but avoids a warning in certain lisps that + ;; seem to like to warn about self-calls in :COMPILE-TOPLEVEL situation. + (named-let parse-number-dispatch ((vars vars) (result result) (types types) + (var-types var-types) (body body)) + (cond ((null vars) + (unless (null types) (error "More types than vars.")) + (when (cdr result) + (error "Duplicate case: ~S." body)) + (setf (cdr result) + (sublis var-types body :test #'equal))) + ((null types) + (error "More vars than types.")) + (t + (flet ((frob (var type) + (parse-number-dispatch + (rest vars) + (or (assoc type (cdr result) :test #'equal) + (car (setf (cdr result) + (acons type nil (cdr result))))) + (rest types) + (acons `(dispatch-type ,var) type var-types) + body))) + (let ((type (first types)) + (var (first vars))) + (if (and (consp type) (eq (first type) 'foreach)) + (dolist (type (rest type)) + (frob var type)) + (frob var type)))))))) + +;;; our guess for the preferred order in which to do type tests +;;; (cheaper and/or more probable first.) + (defconstant-eqx +type-test-ordering+ + '(fixnum single-float double-float integer #+long-float long-float + sb-vm:signed-word word bignum + complex ratio) + #'equal) + +;;; Should TYPE1 be tested before TYPE2? + (defun type-test-order (type1 type2) + (let ((o1 (position type1 +type-test-ordering+)) + (o2 (position type2 +type-test-ordering+))) + (cond ((not o1) nil) + ((not o2) t) + (t + (< o1 o2))))) + +;;; Return an ETYPECASE form that does the type dispatch, ordering the +;;; cases for efficiency. +;;; Check for some simple to detect problematic cases where the caller +;;; used types that are not disjoint and where this may lead to +;;; unexpected behaviour of the generated form, for example making +;;; a clause unreachable, and throw an error if such a case is found. +;;; An example: +;;; (number-dispatch ((var1 integer) (var2 float)) +;;; ((fixnum single-float) a) +;;; ((integer float) b)) +;;; Even though the types are not reordered here, the generated form, +;;; basically +;;; (etypecase var1 +;;; (fixnum (etypecase var2 +;;; (single-float a))) +;;; (integer (etypecase var2 +;;; (float b)))) +;;; would fail at runtime if given var1 fixnum and var2 double-float, +;;; even though the second clause matches this signature. To catch +;;; this earlier than runtime we throw an error already here. + (defun generate-number-dispatch (vars error-tags cases) + ;; Shouldn't be necessary, but avoids a warning in certain lisps that + ;; seem to like to warn about self-calls in :COMPILE-TOPLEVEL situation. + (named-let generate-number-dispatch ((vars vars) (error-tags error-tags) (cases cases)) + (if vars + (let ((var (first vars)) + (cases (sort cases #'type-test-order :key #'car))) + (flet ((error-if-sub-or-supertype (type1 type2) + (when (or (sb-xc:subtypep type1 type2) + (sb-xc:subtypep type2 type1)) + (error "Types not disjoint: ~S ~S." type1 type2))) + (error-if-supertype (type1 type2) + (when (sb-xc:subtypep type2 type1) + (error "Type ~S ordered before subtype ~S." + type1 type2))) + (test-type-pairs (fun) + ;; Apply FUN to all (ordered) pairs of types from the + ;; cases. + (mapl (lambda (cases) + (when (cdr cases) + (let ((type1 (caar cases))) + (dolist (case (cdr cases)) + (funcall fun type1 (car case)))))) + cases))) + ;; For the last variable throw an error if a type is followed + ;; by a subtype, for all other variables additionally if a + ;; type is followed by a supertype. + (test-type-pairs (if (cdr vars) + #'error-if-sub-or-supertype + #'error-if-supertype))) + `((typecase ,var + ,@(mapcar (lambda (case) + `(,(first case) + ,@(generate-number-dispatch (rest vars) + (rest error-tags) + (cdr case)))) + cases) + (t (go ,(first error-tags)))))) + cases))) + + ) ; EVAL-WHEN + +;;; This is a vaguely case-like macro that does number cross-product +;;; dispatches. The Vars are the variables we are dispatching off of. +;;; The Type paired with each Var is used in the error message when no +;;; case matches. Each case specifies a Type for each var, and is +;;; executed when that signature holds. A type may be a list +;;; (FOREACH Each-Type*), causing that case to be repeatedly +;;; instantiated for every Each-Type. In the body of each case, any +;;; list of the form (DISPATCH-TYPE Var-Name) is substituted with the +;;; type of that var in that instance of the case. +;;; +;;; [Though it says "_any_ list", it's still an example of how not to perform +;;; incomplete lexical analysis within a macro imho. Let's say that the body +;;; code passes a lambda that happens name its args DISPATCH-TYPE and X. +;;; What happens? +;;; (macroexpand-1 '(number-dispatch ((x number)) +;;; ((float) (f x (lambda (dispatch-type x) (wat)))))) +;;; -> [stuff elided] +;;; (TYPECASE X (FLOAT (F X (LAMBDA FLOAT (WAT)))) +;;; +;;; So the NUMBER-DISPATCH macro indeed substituted for *any* appearance +;;; just like it says. I wonder if we could define DISPATCH-TYPE as macrolet +;;; that expands to the type for the current branch, so that it _must_ +;;; be in a for-evaluation position; but maybe I'm missing something?] +;;; +;;; As an alternate to a case spec, there may be a form whose CAR is a +;;; symbol. In this case, we apply the CAR of the form to the CDR and +;;; treat the result of the call as a list of cases. This process is +;;; not applied recursively. +;;; +;;; Be careful when using non-disjoint types in different cases for the +;;; same variable. Some uses will behave as intended, others not, as the +;;; variables are dispatched off sequentially and clauses are reordered +;;; for efficiency. Some, but not all, problematic cases are detected +;;; and lead to a compile time error; see GENERATE-NUMBER-DISPATCH above +;;; for an example. +(defmacro number-dispatch (var-specs &body cases) + (let ((res (list nil)) + (vars (mapcar #'car var-specs)) + (block (gensym))) + (dolist (case cases) + (if (symbolp (first case)) + (let ((cases (apply (symbol-function (first case)) (rest case)))) + (dolist (case cases) + (parse-number-dispatch vars res (first case) nil (rest case)))) + (parse-number-dispatch vars res (first case) nil (rest case)))) + + (collect ((errors) + (error-tags)) + (dolist (spec var-specs) + (let ((var (first spec)) + (type (second spec)) + (tag (gensym))) + (error-tags tag) + (errors tag) + (errors + (sb-c::internal-type-error-call var type)))) + + `(block ,block + (tagbody + (return-from ,block + ,@(generate-number-dispatch vars (error-tags) + (cdr res))) + ,@(errors)))))) + +;;;; binary operation dispatching utilities + +(eval-when (:compile-toplevel :execute) + +;;; Return NUMBER-DISPATCH forms for rational X float. +(defun float-contagion (op x y &optional (rat-types '(fixnum bignum ratio))) + `(((single-float single-float) (,op ,x ,y)) + (((foreach ,@rat-types) + (foreach single-float double-float #+long-float long-float)) + (,op (coerce ,x '(dispatch-type ,y)) ,y)) + (((foreach single-float double-float #+long-float long-float) + (foreach ,@rat-types)) + (,op ,x (coerce ,y '(dispatch-type ,x)))) + #+long-float + (((foreach single-float double-float long-float) long-float) + (,op (coerce ,x 'long-float) ,y)) + #+long-float + ((long-float (foreach single-float double-float)) + (,op ,x (coerce ,y 'long-float))) + (((foreach single-float double-float) double-float) + (,op (coerce ,x 'double-float) ,y)) + ((double-float single-float) + (,op ,x (coerce ,y 'double-float))))) + +;;; Return NUMBER-DISPATCH forms for bignum X fixnum. +(defun bignum-cross-fixnum (fix-op big-op) + `(((fixnum fixnum) (,fix-op x y)) + ((fixnum bignum) + (,big-op (make-small-bignum x) y)) + ((bignum fixnum) + (,big-op x (make-small-bignum y))) + ((bignum bignum) + (,big-op x y)))) + +) ; EVAL-WHEN diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index a43ae08b7e..707b4d679a 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -10,224 +10,6 @@ ;;;; files for more information. (in-package "SB-KERNEL") - -;;;; the NUMBER-DISPATCH macro - -(eval-when (:compile-toplevel :load-toplevel :execute) - -;;; Grovel an individual case to NUMBER-DISPATCH, augmenting RESULT -;;; with the type dispatches and bodies. Result is a tree built of -;;; alists representing the dispatching off each arg (in order). The -;;; leaf is the body to be executed in that case. -(defun parse-number-dispatch (vars result types var-types body) - ;; Shouldn't be necessary, but avoids a warning in certain lisps that - ;; seem to like to warn about self-calls in :COMPILE-TOPLEVEL situation. - (named-let parse-number-dispatch ((vars vars) (result result) (types types) - (var-types var-types) (body body)) - (cond ((null vars) - (unless (null types) (error "More types than vars.")) - (when (cdr result) - (error "Duplicate case: ~S." body)) - (setf (cdr result) - (sublis var-types body :test #'equal))) - ((null types) - (error "More vars than types.")) - (t - (flet ((frob (var type) - (parse-number-dispatch - (rest vars) - (or (assoc type (cdr result) :test #'equal) - (car (setf (cdr result) - (acons type nil (cdr result))))) - (rest types) - (acons `(dispatch-type ,var) type var-types) - body))) - (let ((type (first types)) - (var (first vars))) - (if (and (consp type) (eq (first type) 'foreach)) - (dolist (type (rest type)) - (frob var type)) - (frob var type)))))))) - -;;; our guess for the preferred order in which to do type tests -;;; (cheaper and/or more probable first.) -(defconstant-eqx +type-test-ordering+ - '(fixnum single-float double-float integer #+long-float long-float - sb-vm:signed-word word bignum - complex ratio) - #'equal) - -;;; Should TYPE1 be tested before TYPE2? -(defun type-test-order (type1 type2) - (let ((o1 (position type1 +type-test-ordering+)) - (o2 (position type2 +type-test-ordering+))) - (cond ((not o1) nil) - ((not o2) t) - (t - (< o1 o2))))) - -;;; Return an ETYPECASE form that does the type dispatch, ordering the -;;; cases for efficiency. -;;; Check for some simple to detect problematic cases where the caller -;;; used types that are not disjoint and where this may lead to -;;; unexpected behaviour of the generated form, for example making -;;; a clause unreachable, and throw an error if such a case is found. -;;; An example: -;;; (number-dispatch ((var1 integer) (var2 float)) -;;; ((fixnum single-float) a) -;;; ((integer float) b)) -;;; Even though the types are not reordered here, the generated form, -;;; basically -;;; (etypecase var1 -;;; (fixnum (etypecase var2 -;;; (single-float a))) -;;; (integer (etypecase var2 -;;; (float b)))) -;;; would fail at runtime if given var1 fixnum and var2 double-float, -;;; even though the second clause matches this signature. To catch -;;; this earlier than runtime we throw an error already here. -(defun generate-number-dispatch (vars error-tags cases) - ;; Shouldn't be necessary, but avoids a warning in certain lisps that - ;; seem to like to warn about self-calls in :COMPILE-TOPLEVEL situation. - (named-let generate-number-dispatch ((vars vars) (error-tags error-tags) (cases cases)) - (if vars - (let ((var (first vars)) - (cases (sort cases #'type-test-order :key #'car))) - (flet ((error-if-sub-or-supertype (type1 type2) - (when (or (sb-xc:subtypep type1 type2) - (sb-xc:subtypep type2 type1)) - (error "Types not disjoint: ~S ~S." type1 type2))) - (error-if-supertype (type1 type2) - (when (sb-xc:subtypep type2 type1) - (error "Type ~S ordered before subtype ~S." - type1 type2))) - (test-type-pairs (fun) - ;; Apply FUN to all (ordered) pairs of types from the - ;; cases. - (mapl (lambda (cases) - (when (cdr cases) - (let ((type1 (caar cases))) - (dolist (case (cdr cases)) - (funcall fun type1 (car case)))))) - cases))) - ;; For the last variable throw an error if a type is followed - ;; by a subtype, for all other variables additionally if a - ;; type is followed by a supertype. - (test-type-pairs (if (cdr vars) - #'error-if-sub-or-supertype - #'error-if-supertype))) - `((typecase ,var - ,@(mapcar (lambda (case) - `(,(first case) - ,@(generate-number-dispatch (rest vars) - (rest error-tags) - (cdr case)))) - cases) - (t (go ,(first error-tags)))))) - cases))) - -) ; EVAL-WHEN - -;;; This is a vaguely case-like macro that does number cross-product -;;; dispatches. The Vars are the variables we are dispatching off of. -;;; The Type paired with each Var is used in the error message when no -;;; case matches. Each case specifies a Type for each var, and is -;;; executed when that signature holds. A type may be a list -;;; (FOREACH Each-Type*), causing that case to be repeatedly -;;; instantiated for every Each-Type. In the body of each case, any -;;; list of the form (DISPATCH-TYPE Var-Name) is substituted with the -;;; type of that var in that instance of the case. -;;; -;;; [Though it says "_any_ list", it's still an example of how not to perform -;;; incomplete lexical analysis within a macro imho. Let's say that the body -;;; code passes a lambda that happens name its args DISPATCH-TYPE and X. -;;; What happens? -;;; (macroexpand-1 '(number-dispatch ((x number)) -;;; ((float) (f x (lambda (dispatch-type x) (wat)))))) -;;; -> [stuff elided] -;;; (TYPECASE X (FLOAT (F X (LAMBDA FLOAT (WAT)))) -;;; -;;; So the NUMBER-DISPATCH macro indeed substituted for *any* appearance -;;; just like it says. I wonder if we could define DISPATCH-TYPE as macrolet -;;; that expands to the type for the current branch, so that it _must_ -;;; be in a for-evaluation position; but maybe I'm missing something?] -;;; -;;; As an alternate to a case spec, there may be a form whose CAR is a -;;; symbol. In this case, we apply the CAR of the form to the CDR and -;;; treat the result of the call as a list of cases. This process is -;;; not applied recursively. -;;; -;;; Be careful when using non-disjoint types in different cases for the -;;; same variable. Some uses will behave as intended, others not, as the -;;; variables are dispatched off sequentially and clauses are reordered -;;; for efficiency. Some, but not all, problematic cases are detected -;;; and lead to a compile time error; see GENERATE-NUMBER-DISPATCH above -;;; for an example. -(defmacro number-dispatch (var-specs &body cases) - (let ((res (list nil)) - (vars (mapcar #'car var-specs)) - (block (gensym))) - (dolist (case cases) - (if (symbolp (first case)) - (let ((cases (apply (symbol-function (first case)) (rest case)))) - (dolist (case cases) - (parse-number-dispatch vars res (first case) nil (rest case)))) - (parse-number-dispatch vars res (first case) nil (rest case)))) - - (collect ((errors) - (error-tags)) - (dolist (spec var-specs) - (let ((var (first spec)) - (type (second spec)) - (tag (gensym))) - (error-tags tag) - (errors tag) - (errors - (sb-c::internal-type-error-call var type)))) - - `(block ,block - (tagbody - (return-from ,block - ,@(generate-number-dispatch vars (error-tags) - (cdr res))) - ,@(errors)))))) - -;;;; binary operation dispatching utilities - -(eval-when (:compile-toplevel :execute) - -;;; Return NUMBER-DISPATCH forms for rational X float. -(defun float-contagion (op x y &optional (rat-types '(fixnum bignum ratio))) - `(((single-float single-float) (,op ,x ,y)) - (((foreach ,@rat-types) - (foreach single-float double-float #+long-float long-float)) - (,op (coerce ,x '(dispatch-type ,y)) ,y)) - (((foreach single-float double-float #+long-float long-float) - (foreach ,@rat-types)) - (,op ,x (coerce ,y '(dispatch-type ,x)))) - #+long-float - (((foreach single-float double-float long-float) long-float) - (,op (coerce ,x 'long-float) ,y)) - #+long-float - ((long-float (foreach single-float double-float)) - (,op ,x (coerce ,y 'long-float))) - (((foreach single-float double-float) double-float) - (,op (coerce ,x 'double-float) ,y)) - ((double-float single-float) - (,op ,x (coerce ,y 'double-float))))) - -;;; Return NUMBER-DISPATCH forms for bignum X fixnum. -(defun bignum-cross-fixnum (fix-op big-op) - `(((fixnum fixnum) (,fix-op x y)) - ((fixnum bignum) - (,big-op (make-small-bignum x) y)) - ((bignum fixnum) - (,big-op x (make-small-bignum y))) - ((bignum bignum) - (,big-op x y)))) - -) ; EVAL-WHEN - ;;;; canonicalization utilities ;;; If IMAGPART is 0, return REALPART, otherwise make a complex. This is @@ -794,7 +576,7 @@ the first." ((>= ,integer 0) (< (float quot ,float) ,float)))))))))) -(eval-when (:compile-toplevel :execute) +(eval-when (:compile-toplevel :load-toplevel :execute) ;;; The INFINITE-X-FINITE-Y and INFINITE-Y-FINITE-X args tell us how ;;; to handle the case when X or Y is a floating-point infinity and ;;; the other arg is a rational. (Section 12.1.4.1 of the ANSI spec @@ -836,7 +618,7 @@ the first." (if (float-infinity-p x) ,infinite-x-finite-y (,op (rational x) y)))) - (((foreach bignum fixnum ratio) float) + (((foreach bignum ratio) float) (if (float-infinity-p y) ,infinite-y-finite-x (,op x (rational y)))))) @@ -845,26 +627,27 @@ the first." (macrolet ((def-two-arg- (name op ratio-arg1 ratio-arg2 &rest cases) `(defun ,name (x y) + (declare (inline float-infinity-p)) (number-dispatch ((x real) (y real)) - (basic-compare - ,op - :infinite-x-finite-y - (,op x (coerce 0 '(dispatch-type x))) - :infinite-y-finite-x - (,op (coerce 0 '(dispatch-type y)) y)) - (((foreach fixnum bignum) ratio) - (,op x (,ratio-arg2 (numerator y) - (denominator y)))) - ((ratio integer) - (,op (,ratio-arg1 (numerator x) - (denominator x)) - y)) - ((ratio ratio) - (,op (* (numerator (truly-the ratio x)) - (denominator (truly-the ratio y))) - (* (numerator (truly-the ratio y)) - (denominator (truly-the ratio x))))) - ,@cases)))) + (basic-compare + ,op + :infinite-x-finite-y + (,op x (coerce 0 '(dispatch-type x))) + :infinite-y-finite-x + (,op (coerce 0 '(dispatch-type y)) y)) + (((foreach fixnum bignum) ratio) + (,op x (,ratio-arg2 (numerator y) + (denominator y)))) + ((ratio integer) + (,op (,ratio-arg1 (numerator x) + (denominator x)) + y)) + ((ratio ratio) + (,op (* (numerator (truly-the ratio x)) + (denominator (truly-the ratio y))) + (* (numerator (truly-the ratio y)) + (denominator (truly-the ratio x))))) + ,@cases)))) (def-two-arg- two-arg-< < floor ceiling ((fixnum bignum) (bignum-plus-p y)) @@ -881,6 +664,7 @@ the first." (plusp (bignum-compare x y))))) (defun two-arg-= (x y) + (declare (inline float-infinity-p)) (number-dispatch ((x number) (y number)) (basic-compare = ;; An infinite value is never equal to a finite value. From 920f5a5babb10d3edd17793e9f59885a14174e1f Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 9 Aug 2020 21:49:21 +0300 Subject: [PATCH 0356/4023] Rearrange files for inlining. --- build-order.lisp-expr | 3 +- src/code/float-inf-nan.lisp | 120 ++++++++++++++++++++++++++++++++++++ src/code/float.lisp | 104 ------------------------------- 3 files changed, 122 insertions(+), 105 deletions(-) create mode 100644 src/code/float-inf-nan.lisp diff --git a/build-order.lisp-expr b/build-order.lisp-expr index a36c124a91..8ef3518d48 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -232,9 +232,10 @@ ("src/code/bignum" :not-host) ("src/code/number-dispatch" :not-host) - ("src/code/float" :not-host) + ("src/code/float-inf-nan" :not-host) ("src/code/numbers" :not-host) ("src/code/float-trap" :not-host) + ("src/code/float" :not-host) ("src/code/irrat" :not-host) diff --git a/src/code/float-inf-nan.lisp b/src/code/float-inf-nan.lisp new file mode 100644 index 0000000000..1fca7137c9 --- /dev/null +++ b/src/code/float-inf-nan.lisp @@ -0,0 +1,120 @@ +;;;; This file contains the definitions of float-specific number +;;;; support (other than irrational stuff, which is in irrat.) There is +;;;; code in here that assumes there are only two float formats: IEEE +;;;; single and double. (LONG-FLOAT support has been added, but bugs +;;;; may still remain due to old code which assumes this dichotomy.) + +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. + +(in-package "SB-KERNEL") + +#-sb-fluid +(declaim (maybe-inline float-denormalized-p float-infinity-p float-nan-p + float-trapping-nan-p)) + +(defun float-denormalized-p (x) + "Return true if the float X is denormalized." + (number-dispatch ((x float)) + ((single-float) + (and (zerop (ldb sb-vm:single-float-exponent-byte (single-float-bits x))) + (not (zerop x)))) + ((double-float) + (and (zerop (ldb sb-vm:double-float-exponent-byte + (double-float-high-bits x))) + (not (zerop x)))) + #+(and long-float x86) + ((long-float) + (and (zerop (ldb sb-vm:long-float-exponent-byte (long-float-exp-bits x))) + (not (zerop x)))))) + +(defmacro define-float-inf-or-nan-test + (name doc single double #+(and long-float x86) long) + `(defun ,name (x) ,doc + (number-dispatch ((x float)) + ((single-float) + (let ((bits (single-float-bits x))) + (and (> (ldb sb-vm:single-float-exponent-byte bits) + sb-vm:single-float-normal-exponent-max) + ,single))) + ((double-float) + #+64-bit + ;; With 64-bit words, all the FOO-float-byte constants need to be reworked + ;; to refer to a byte position in the whole word. I think we can reasonably + ;; get away with writing the well-known values here. + (let ((bits (double-float-bits x))) + (and (> (ldb (byte 11 52) bits) sb-vm:double-float-normal-exponent-max) + ,double)) + #-64-bit + (let ((hi (double-float-high-bits x)) + (lo (double-float-low-bits x))) + (declare (ignorable lo)) + (and (> (ldb sb-vm:double-float-exponent-byte hi) + sb-vm:double-float-normal-exponent-max) + ,double))) + #+(and long-float x86) + ((long-float) + (let ((exp (long-float-exp-bits x)) + (hi (long-float-high-bits x)) + (lo (long-float-low-bits x))) + (declare (ignorable lo)) + (and (> (ldb sb-vm:long-float-exponent-byte exp) + sb-vm:long-float-normal-exponent-max) + ,long)))))) + +;; Infinities and NANs have the maximum exponent +(define-float-inf-or-nan-test float-infinity-or-nan-p nil + t t #+(and long-float x86) t) + +;; Infinity has 0 for the significand +(define-float-inf-or-nan-test float-infinity-p + "Return true if the float X is an infinity (+ or -)." + (zerop (ldb sb-vm:single-float-significand-byte bits)) + + #+64-bit (zerop (ldb (byte 52 0) bits)) + #-64-bit (zerop (logior (ldb sb-vm:double-float-significand-byte hi) lo)) + + #+(and long-float x86) + (and (zerop (ldb sb-vm:long-float-significand-byte hi)) + (zerop lo))) + +;; NaNs have nonzero for the significand +(define-float-inf-or-nan-test float-nan-p + "Return true if the float X is a NaN (Not a Number)." + (not (zerop (ldb sb-vm:single-float-significand-byte bits))) + + #+64-bit (not (zerop (ldb (byte 52 0) bits))) + #-64-bit (not (zerop (logior (ldb sb-vm:double-float-significand-byte hi) lo))) + + #+(and long-float x86) + (or (not (zerop (ldb sb-vm:long-float-significand-byte hi))) + (not (zerop lo)))) + +(define-float-inf-or-nan-test float-trapping-nan-p + "Return true if the float X is a trapping NaN (Not a Number)." + ;; HPPA (and apparently MIPS) have trapping NaNs (SNaNs) with the + ;; trapping-nan-bit SET. PPC, SPARC, Alpha, and x86 (and presumably + ;; x86-64, ARM, and ARM64) have trapping NaNs (SNaNs) with the + ;; trapping-nan-bit CLEAR. Note that the given implementation + ;; considers infinities to be FLOAT-TRAPPING-NAN-P on most + ;; architectures. + + ;; SINGLE-FLOAT + #+(or mips hppa) (logbitp 22 bits) + #-(or mips hppa) (not (logbitp 22 bits)) + + ;; DOUBLE-FLOAT + #+(or mips hppa) (logbitp 19 hi) + #+(and (not (or mips hppa)) 64-bit) (not (logbitp 51 bits)) + #+(and (not (or mips hppa)) (not 64-bit)) (not (logbitp 19 hi)) + + ;; LONG-FLOAT (this code is dead anyway) + #+(and long-float x86) + (zerop (logand (ldb sb-vm:long-float-significand-byte hi) + (ash 1 30)))) diff --git a/src/code/float.lisp b/src/code/float.lisp index a6cffd81ae..10baf49a8a 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -17,110 +17,6 @@ ;;;; float predicates and environment query -#-sb-fluid -(declaim (maybe-inline float-denormalized-p float-infinity-p float-nan-p - float-trapping-nan-p)) - -(defun float-denormalized-p (x) - "Return true if the float X is denormalized." - (number-dispatch ((x float)) - ((single-float) - (and (zerop (ldb sb-vm:single-float-exponent-byte (single-float-bits x))) - (not (zerop x)))) - ((double-float) - (and (zerop (ldb sb-vm:double-float-exponent-byte - (double-float-high-bits x))) - (not (zerop x)))) - #+(and long-float x86) - ((long-float) - (and (zerop (ldb sb-vm:long-float-exponent-byte (long-float-exp-bits x))) - (not (zerop x)))))) - -(defmacro define-float-inf-or-nan-test - (name doc single double #+(and long-float x86) long) - `(defun ,name (x) ,doc - (number-dispatch ((x float)) - ((single-float) - (let ((bits (single-float-bits x))) - (and (> (ldb sb-vm:single-float-exponent-byte bits) - sb-vm:single-float-normal-exponent-max) - ,single))) - ((double-float) - #+64-bit - ;; With 64-bit words, all the FOO-float-byte constants need to be reworked - ;; to refer to a byte position in the whole word. I think we can reasonably - ;; get away with writing the well-known values here. - (let ((bits (double-float-bits x))) - (and (> (ldb (byte 11 52) bits) sb-vm:double-float-normal-exponent-max) - ,double)) - #-64-bit - (let ((hi (double-float-high-bits x)) - (lo (double-float-low-bits x))) - (declare (ignorable lo)) - (and (> (ldb sb-vm:double-float-exponent-byte hi) - sb-vm:double-float-normal-exponent-max) - ,double))) - #+(and long-float x86) - ((long-float) - (let ((exp (long-float-exp-bits x)) - (hi (long-float-high-bits x)) - (lo (long-float-low-bits x))) - (declare (ignorable lo)) - (and (> (ldb sb-vm:long-float-exponent-byte exp) - sb-vm:long-float-normal-exponent-max) - ,long)))))) - -;; Infinities and NANs have the maximum exponent -(define-float-inf-or-nan-test float-infinity-or-nan-p nil - t t #+(and long-float x86) t) - -;; Infinity has 0 for the significand -(define-float-inf-or-nan-test float-infinity-p - "Return true if the float X is an infinity (+ or -)." - (zerop (ldb sb-vm:single-float-significand-byte bits)) - - #+64-bit (zerop (ldb (byte 52 0) bits)) - #-64-bit (zerop (logior (ldb sb-vm:double-float-significand-byte hi) lo)) - - #+(and long-float x86) - (and (zerop (ldb sb-vm:long-float-significand-byte hi)) - (zerop lo))) - -;; NaNs have nonzero for the significand -(define-float-inf-or-nan-test float-nan-p - "Return true if the float X is a NaN (Not a Number)." - (not (zerop (ldb sb-vm:single-float-significand-byte bits))) - - #+64-bit (not (zerop (ldb (byte 52 0) bits))) - #-64-bit (not (zerop (logior (ldb sb-vm:double-float-significand-byte hi) lo))) - - #+(and long-float x86) - (or (not (zerop (ldb sb-vm:long-float-significand-byte hi))) - (not (zerop lo)))) - -(define-float-inf-or-nan-test float-trapping-nan-p - "Return true if the float X is a trapping NaN (Not a Number)." - ;; HPPA (and apparently MIPS) have trapping NaNs (SNaNs) with the - ;; trapping-nan-bit SET. PPC, SPARC, Alpha, and x86 (and presumably - ;; x86-64, ARM, and ARM64) have trapping NaNs (SNaNs) with the - ;; trapping-nan-bit CLEAR. Note that the given implementation - ;; considers infinities to be FLOAT-TRAPPING-NAN-P on most - ;; architectures. - - ;; SINGLE-FLOAT - #+(or mips hppa) (logbitp 22 bits) - #-(or mips hppa) (not (logbitp 22 bits)) - - ;; DOUBLE-FLOAT - #+(or mips hppa) (logbitp 19 hi) - #+(and (not (or mips hppa)) 64-bit) (not (logbitp 51 bits)) - #+(and (not (or mips hppa)) (not 64-bit)) (not (logbitp 19 hi)) - - ;; LONG-FLOAT (this code is dead anyway) - #+(and long-float x86) - (zerop (logand (ldb sb-vm:long-float-significand-byte hi) - (ash 1 30)))) - ;;; If denormalized, use a subfunction from INTEGER-DECODE-FLOAT to find the ;;; actual exponent (and hence how denormalized it is), otherwise we just ;;; return the number of digits or 0. From 53daf015f0b64941f26cc86368587119b6000f9d Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 9 Aug 2020 21:51:26 +0300 Subject: [PATCH 0357/4023] Optimize (< ratio float). Since a float is a kind of a ratio no need to create a RATIO just to take its numerator/denominator later. --- src/code/numbers.lisp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index 707b4d679a..797067bb24 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -602,7 +602,6 @@ the first." (,op x (coerce 0 '(dispatch-type x))) (if (float-infinity-p x) ,infinite-x-finite-y - ;; Likewise (make-fixnum-float-comparer ,(case op (> '<) (< '>) @@ -612,7 +611,31 @@ the first." (,op (coerce x 'double-float) y)) ((double-float single-float) (,op x (coerce y 'double-float))) - (((foreach single-float double-float #+long-float long-float) rational) + (((foreach single-float double-float #+long-float long-float) ratio) + (if (float-infinity-p x) + ,infinite-x-finite-y + ;; Avoid converting the float into a rational, since it + ;; will be taken apart later anyway. + (multiple-value-bind (bits exp) (integer-decode-float x) + (if (eql bits 0) + (,op 0 y) + (let ((int (if (minusp x) (- bits) bits))) + (if (minusp exp) + (,op (* int (denominator y)) + (* (numerator y) (ash 1 (- exp)))) + (,op (ash int exp) y))))))) + ((ratio (foreach single-float double-float)) + (if (float-infinity-p y) + ,infinite-y-finite-x + (multiple-value-bind (bits exp) (integer-decode-float y) + (if (eql bits 0) + (,op x 0) + (let ((int (if (minusp y) (- bits) bits))) + (if (minusp exp) + (,op (* (numerator x) (ash 1 (- exp))) + (* int (denominator x))) + (,op x (ash int exp)))))))) + (((foreach single-float double-float #+long-float long-float) bignum) (if (eql y 0) (,op x (coerce 0 '(dispatch-type x))) (if (float-infinity-p x) From a75b12a10d7f08c0cc0eb7209e403d82d93b3748 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 9 Aug 2020 22:18:41 +0300 Subject: [PATCH 0358/4023] Remove a redundant number-dispatch case. --- src/code/numbers.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index 797067bb24..b6c6fefb50 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -641,7 +641,7 @@ the first." (if (float-infinity-p x) ,infinite-x-finite-y (,op (rational x) y)))) - (((foreach bignum ratio) float) + ((bignum float) (if (float-infinity-p y) ,infinite-y-finite-x (,op x (rational y)))))) From 93886596f1791c5ef29fe86bbe3a11fe3af194c6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 9 Aug 2020 20:24:31 -0400 Subject: [PATCH 0359/4023] Implement some more BBtree functions --- src/code/avltree.lisp | 16 ++++++++++-- src/code/redblack.lisp | 11 ++++++++ tests/avltree.pure.lisp | 56 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/src/code/avltree.lisp b/src/code/avltree.lisp index 7ca38f0a33..c332a3c82d 100644 --- a/src/code/avltree.lisp +++ b/src/code/avltree.lisp @@ -143,6 +143,7 @@ ((< key node-key) (find-in (avlnode-left tree))) (t tree)))))) +;;; Find a node with key less than or equal to KEY and as near it as possible. (defun avl-find<= (key root) (declare (sb-vm:word key)) (named-let find-in ((tree root) (result nil)) @@ -153,7 +154,18 @@ (t tree))) result))) -(export 'avltree-list) +;;; Find a node with key greater than or equal to KEY and as near it as possible. +(defun avl-find>= (key root) + (declare (sb-vm:word key)) + (named-let find-in ((tree root) (result nil)) + (if tree + (let ((node-key (avlnode-key tree))) + (cond ((> key node-key) (find-in (avlnode-right tree) result)) + ((< key node-key) (find-in (avlnode-left tree) tree)) + (t tree))) + result))) + +(export '(avltree-list avl-find>= avl-find<=)) (defun avltree-list (tree &optional (transducer #'avlnode-data)) (let (result) (named-let recurse ((node tree)) @@ -175,7 +187,7 @@ result)) (defmethod print-object ((self avlnode) stream) - (write-string "#= (key tree) + (named-let recurse ((node tree) (best nil)) + (cond ((null node) best) + ((< key (node-key node)) (recurse (left node) node)) + ((< (node-key node) key) (recurse (right node) best)) + (t node)))) + +(export '(find>= find<=)) diff --git a/tests/avltree.pure.lisp b/tests/avltree.pure.lisp index 34885832e0..bd60df591e 100644 --- a/tests/avltree.pure.lisp +++ b/tests/avltree.pure.lisp @@ -3,6 +3,7 @@ #-sb-thread (invoke-restart 'run-tests::skip-file) ;; some of the symbols below disappear (import 'sb-thread::(avlnode-key avlnode-data avlnode-left avlnode-right + avl-find<= avl-find>= avl-insert avl-delete avl-find avl-balance-factor avl-count)) @@ -98,3 +99,58 @@ node [shape=record];~%") (test-util:with-test (:name :avltree-random-tester) (random-operations 10 10 nil) (random-operations 10 200 nil)) + +;; TOD: perform this test on the red-black trees as well. +(defun test-find-inexact (n-nodes n-iterations) + (let (integers) + ;; Generate N random integers + (dotimes (i n-nodes) + (loop + (let ((val (random 1000))) + (unless (member val integers) + (push val integers) + (return))))) + (setq integers (coerce integers 'vector)) + (dotimes (i n-iterations) + ;; Try many different shuffles of the insertion order because each + ;; potentially yields a different tree. + (test-util:shuffle integers) + ;; Convert a tree + (let ((tree nil)) + (dotimes (i (length integers)) + (setq tree (avl-insert tree (svref integers i) (svref integers i)))) + (setq integers (sort integers #'<)) + (dotimes (i (length integers)) + (let ((this (svref integers i)) + (pred (if (> i 0) (svref integers (1- i)))) + (succ (if (< i (1- (length integers))) (svref integers (1+ i))))) + ;; THIS should be found exactly + (let ((answer (avl-find<= this tree))) + (assert (eql (avlnode-key answer) this))) + (let ((answer (avl-find>= this tree))) + (assert (eql (avlnode-key answer) this))) + ;; find this node by a smaller key using FIND>= + (unless (eql pred (1- this)) + (assert (eql (avlnode-key (avl-find>= (1- this) tree)) this))) + ;; find this node by a larger key using FIND<= + (unless (eql succ (1+ this)) + (assert (eql (avlnode-key (avl-find<= (1+ this) tree)) this))) + ;; check the boundary case of FIND<= and/or find the predecessor + (let ((answer (avl-find<= (1- this) tree))) + (if pred + (assert (eql (avlnode-key answer) pred)) + (assert (not answer)))) + ;; check the boundary case of FIND>= and/or find the successor + (let ((answer (avl-find>= (1+ this) tree))) + (if succ + (assert (eql (avlnode-key answer) succ)) + (assert (not answer)))))))))) + +(test-util:with-test (:name :find-inexact) + (loop for n-nodes from 1 to 20 + do (test-find-inexact n-nodes + (case n-nodes + (1 1) + (2 4) + (3 10) + (t 100))))) From 5d49acca776901ae2b2e3cd5f3d49e40d0d9b6ce Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 9 Aug 2020 22:05:43 -0400 Subject: [PATCH 0360/4023] Improve and fix BBtree tests Don't use 0 as a key --- tests/avltree.pure.lisp | 58 +++---------------------------- tests/bbtree-test-util.lisp | 62 ++++++++++++++++++++++++++++++++++ tests/input-manifest.lisp-expr | 2 ++ tests/redblack.pure.lisp | 8 +++++ 4 files changed, 77 insertions(+), 53 deletions(-) create mode 100644 tests/bbtree-test-util.lisp diff --git a/tests/avltree.pure.lisp b/tests/avltree.pure.lisp index bd60df591e..d75d81f143 100644 --- a/tests/avltree.pure.lisp +++ b/tests/avltree.pure.lisp @@ -1,3 +1,4 @@ +(load "bbtree-test-util.lisp") (use-package "SB-INT") #-sb-thread (invoke-restart 'run-tests::skip-file) ;; some of the symbols below disappear @@ -100,57 +101,8 @@ node [shape=record];~%") (random-operations 10 10 nil) (random-operations 10 200 nil)) -;; TOD: perform this test on the red-black trees as well. -(defun test-find-inexact (n-nodes n-iterations) - (let (integers) - ;; Generate N random integers - (dotimes (i n-nodes) - (loop - (let ((val (random 1000))) - (unless (member val integers) - (push val integers) - (return))))) - (setq integers (coerce integers 'vector)) - (dotimes (i n-iterations) - ;; Try many different shuffles of the insertion order because each - ;; potentially yields a different tree. - (test-util:shuffle integers) - ;; Convert a tree - (let ((tree nil)) - (dotimes (i (length integers)) - (setq tree (avl-insert tree (svref integers i) (svref integers i)))) - (setq integers (sort integers #'<)) - (dotimes (i (length integers)) - (let ((this (svref integers i)) - (pred (if (> i 0) (svref integers (1- i)))) - (succ (if (< i (1- (length integers))) (svref integers (1+ i))))) - ;; THIS should be found exactly - (let ((answer (avl-find<= this tree))) - (assert (eql (avlnode-key answer) this))) - (let ((answer (avl-find>= this tree))) - (assert (eql (avlnode-key answer) this))) - ;; find this node by a smaller key using FIND>= - (unless (eql pred (1- this)) - (assert (eql (avlnode-key (avl-find>= (1- this) tree)) this))) - ;; find this node by a larger key using FIND<= - (unless (eql succ (1+ this)) - (assert (eql (avlnode-key (avl-find<= (1+ this) tree)) this))) - ;; check the boundary case of FIND<= and/or find the predecessor - (let ((answer (avl-find<= (1- this) tree))) - (if pred - (assert (eql (avlnode-key answer) pred)) - (assert (not answer)))) - ;; check the boundary case of FIND>= and/or find the successor - (let ((answer (avl-find>= (1+ this) tree))) - (if succ - (assert (eql (avlnode-key answer) succ)) - (assert (not answer)))))))))) +(defun test-avlfind-inexact (n-nodes n-iterations) + (bbtree-test:test-find-inexact-macro avl-insert avl-find<= avl-find>= avlnode-key)) -(test-util:with-test (:name :find-inexact) - (loop for n-nodes from 1 to 20 - do (test-find-inexact n-nodes - (case n-nodes - (1 1) - (2 4) - (3 10) - (t 100))))) +(test-util:with-test (:name :avl-find-inexact) + (bbtree-test:exercise-find-inexact 'test-avlfind-inexact)) diff --git a/tests/bbtree-test-util.lisp b/tests/bbtree-test-util.lisp new file mode 100644 index 0000000000..2c60e8fce3 --- /dev/null +++ b/tests/bbtree-test-util.lisp @@ -0,0 +1,62 @@ + +(defpackage "BBTREE-TEST" + (:use :cl) + (:export #:test-find-inexact-macro + #:exercise-find-inexact)) + +;;;; Tests of two different kinds of balanced binary trees + +(defmacro bbtree-test:test-find-inexact-macro (insertion-fun find<=-fun find>=-fun node-key) + `(let (integers) + ;; Generate N random integers + (dotimes (i n-nodes) + (loop + (let ((val (+ 5 (random 1000)))) + (unless (member val integers) + (push val integers) + (return))))) + (setq integers (coerce integers 'vector)) + (dotimes (i n-iterations) + ;; Try many different shuffles of the insertion order because each + ;; potentially yields a different tree. + (test-util:shuffle integers) + ;; Convert a tree + (let ((tree nil)) + (dotimes (i (length integers)) + (setq tree (,insertion-fun tree (svref integers i) (svref integers i)))) + (setq integers (sort integers #'<)) + (dotimes (i (length integers)) + (let ((this (svref integers i)) + (pred (if (> i 0) (svref integers (1- i)))) + (succ (if (< i (1- (length integers))) (svref integers (1+ i))))) + ;; THIS should be found exactly + (let ((answer (,find<=-fun this tree))) + (assert (eql (,node-key answer) this))) + (let ((answer (,find>=-fun this tree))) + (assert (eql (,node-key answer) this))) + ;; find this node by a smaller key using FIND>= + (unless (eql pred (1- this)) + (assert (eql (,node-key (,find>=-fun (1- this) tree)) this))) + ;; find this node by a larger key using FIND<= + (unless (eql succ (1+ this)) + (assert (eql (,node-key (,find<=-fun (1+ this) tree)) this))) + ;; check the boundary case of FIND<= and/or find the predecessor + (let ((answer (,find<=-fun (1- this) tree))) + (if pred + (assert (eql (,node-key answer) pred)) + (assert (not answer)))) + ;; check the boundary case of FIND>= and/or find the successor + (let ((answer (,find>=-fun (1+ this) tree))) + (if succ + (assert (eql (,node-key answer) succ)) + (assert (not answer)))))))))) + +(defun bbtree-test:exercise-find-inexact (fun) + (loop for n-nodes from 1 to 20 + do (funcall fun n-nodes + (case n-nodes + (1 1) + (2 4) + (3 10) + (t 100))))) + diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 58920b5523..86dda2b09e 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -1,6 +1,7 @@ (("aprof.impure.lisp" "src/code/aprof.lisp" "src/code/shaketree.lisp") + ("avltree.pure.lisp" "bbtree-test-util.lisp") ("bit-vector.impure.lisp" "contrib/sb-posix.fasl") ("case.pure.lisp" "tests/case-test.lisp") ("chill.test.sh" @@ -53,6 +54,7 @@ ("octets.pure.lisp" "tests/data/compile-file-pos.lisp" "tests/data/compile-file-pos-utf16be.lisp") + ("redblack.pure.lisp" "bbtree-test-util.lisp") ("run-program.impure.lisp" "contrib/sb-posix.fasl") ("signals.impure.lisp" "contrib/sb-posix.fasl") ("stream.impure.lisp" "contrib/sb-posix.fasl") diff --git a/tests/redblack.pure.lisp b/tests/redblack.pure.lisp index 11a979f2b1..f5a4f2c1d6 100644 --- a/tests/redblack.pure.lisp +++ b/tests/redblack.pure.lisp @@ -6,6 +6,7 @@ color-of left right node-key node-value data find= find<=)) +(load "bbtree-test-util.lisp") (defun verify-invariants (root print) (unless root @@ -211,3 +212,10 @@ (dotimes (i n-items) (setq tree (redblack:insert tree i i))) tree) + +(defun test-rb-find-inexact (n-nodes n-iterations) + (bbtree-test:test-find-inexact-macro redblack:insert + find<= redblack:find>= node-key)) + +(test-util:with-test (:name :rb-find-inexact) + (bbtree-test:exercise-find-inexact 'test-rb-find-inexact)) From d6f1a1fd1fe99d6c2f931cff08d4216a6e12beca Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 9 Aug 2020 22:19:45 -0400 Subject: [PATCH 0361/4023] Show more in a lose() message --- src/runtime/safepoint.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 639be3ffc7..8515c1498d 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -630,7 +630,8 @@ assert_on_stack(struct thread *th, void *esp) if (on_altstack_p(th, esp)) lose("thread %p: esp on altstack: %p", th, esp); #endif - lose("thread %p: bogus esp: %p", th, esp); + lose("thread %p: bogus esp: %p (range=%p..%p)", th, esp, + th->control_stack_start, th->control_stack_end); } // returns 0 if skipped, 1 otherwise From be2694b7e1b74f7752c9993ba215a8024b88bdf7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 9 Aug 2020 22:22:53 -0400 Subject: [PATCH 0362/4023] Key *all-threads* by primitive thread address, not stack base This should allow enabling :pauseless-threadstart for win32 but this change does not do that yet. --- float-math.lisp-expr | 2 ++ src/code/alien-callback.lisp | 2 +- src/code/debug.lisp | 21 ++++++++------ src/code/target-thread.lisp | 53 ++++++++++++++++++++---------------- src/code/thread-structs.lisp | 9 +++--- src/cold/shared.lisp | 2 ++ tests/threads.impure.lisp | 4 ++- 7 files changed, 56 insertions(+), 37 deletions(-) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 59088a7afc..d6490ef799 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -2278,6 +2278,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) @@ -2732,6 +2733,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index 6369ac6da8..bbfca867f9 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -320,7 +320,7 @@ the alien callback for that function with the given alien type." nil nil))) ; sigmask + fpu state bits (copy-primitive-thread-fields thread) (setf (thread-startup-info thread) startup-info) - (update-all-threads (get-lisp-obj-address sb-vm:*control-stack-start*) thread) + (update-all-threads (thread-primitive-thread thread) thread) (run)) #-pauseless-threadstart (dx-let ((args (list index return arguments))) diff --git a/src/code/debug.lisp b/src/code/debug.lisp index e0d2f973ae..69223a3393 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -465,14 +465,19 @@ information." (< a (get-lisp-obj-address sb-vm:*control-stack-end*))) sb-thread:*current-thread*) (all-threads - ;; find a stack whose base is nearest and below A. - (awhen (sb-thread::avl-find<= a sb-thread::*all-threads*) - (let ((thread (sb-thread::avlnode-data it))) - (when (and (< a (sb-thread::thread-stack-end thread)) - ;; Make a final check that it's live. - ;; It could die by the time this returns. - (sb-thread:thread-alive-p thread)) - thread)))))))) + (macrolet ((in-stack-range-p () + `(and (>= a (sb-thread::thread-control-stack-start thread)) + (< a (sb-thread::thread-control-stack-end thread))))) + #+win32 ; exhaustive search + (dolist (thread (sb-thread:list-all-threads)) ; conses, but I don't care + (when (sb-thread::in-stack-range-p) + (return thread))) + #-win32 + ;; find a stack whose primitive-thread is nearest and above A. + (awhen (sb-thread::avl-find>= a sb-thread::*all-threads*) + (let ((thread (sb-thread::avlnode-data it))) + (when (in-stack-range-p) + thread))))))))) ;;;; frame printing diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index a66f9ae2e2..ab3c924122 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -229,8 +229,8 @@ an error in that case." ;;; Keep an AVL tree of threads ordered by stack base address. NIL is the empty tree. (sb-ext:define-load-time-global *all-threads* ()) ;;; Ensure that THREAD is in *ALL-THREADS*. -(defmacro update-all-threads (stack-base thread) - `(let ((addr ,stack-base)) +(defmacro update-all-threads (key thread) + `(let ((addr ,key)) (barrier (:read)) (let ((old *all-threads*)) (loop @@ -307,9 +307,11 @@ created and old ones may exit at any time." ;;; Copy some slots from the C 'struct thread' into the SB-THREAD:THREAD. (defmacro copy-primitive-thread-fields (this) `(setf (thread-primitive-thread ,this) (sap-int (current-thread-sap)) - (thread-stack-end ,this) (get-lisp-obj-address sb-vm:*control-stack-end*) (thread-os-thread ,this) (sap-int (sb-vm::current-thread-offset-sap sb-vm::thread-os-thread-slot)))) +(defmacro set-thread-control-stack-slots (this) + `(setf (thread-control-stack-start ,this) (get-lisp-obj-address sb-vm:*control-stack-start*) + (thread-control-stack-end ,this) (get-lisp-obj-address sb-vm:*control-stack-end*))) ;;; Not uncoincidentally, the variables assigned here are also ;;; listed in SB-KERNEL::*SAVE-LISP-CLOBBERED-GLOBALS* @@ -320,6 +322,7 @@ created and old ones may exit at any time." (let* ((name "main thread") (thread (%make-thread name nil (make-semaphore :name name)))) (copy-primitive-thread-fields thread) + (set-thread-control-stack-slots thread) ;; Run the macro-generated function which writes some values into the TLS, ;; most especially *CURRENT-THREAD*. (init-thread-local-storage thread) @@ -327,7 +330,9 @@ created and old ones may exit at any time." (setf *joinable-threads* nil) #-sb-safepoint (setq *foreign-thread* (make-foreign-thread)) (setq *all-threads* - (avl-insert nil (get-lisp-obj-address sb-vm:*control-stack-start*) thread)))) + (avl-insert nil + (sb-thread::thread-primitive-thread sb-thread:*current-thread*) + thread)))) (defun main-thread () "Returns the main thread of the process." @@ -1414,6 +1419,8 @@ on this semaphore, then N of them is woken up." (%exit)) ;; Lisp-side cleanup (let* ((thread *current-thread*) + ;; use the "funny fixnum" representation + (c-thread (%make-lisp-obj (thread-primitive-thread thread))) (sem (thread-semaphore thread))) ;; This AVER failed when I messed up deletion from *STARTING-THREADS*. ;; That in turn caused a failure in GC because a fixnum is not a legal value @@ -1428,8 +1435,7 @@ on this semaphore, then N of them is woken up." ;; pointer, but it knows that it has no underlying OS thread. (with-interruptions-lock (thread) (when sem ; ordinary lisp thread, not FOREIGN-THREAD - (setf (thread-startup-info thread) ; use the "funny fixnum" representation - (%make-lisp-obj (thread-primitive-thread thread)))) + (setf (thread-startup-info thread) c-thread)) (setf (thread-primitive-thread thread) 0) (barrier (:write))) ;; After making the thread dead, remove from session. If this were done first, @@ -1451,8 +1457,7 @@ on this semaphore, then N of them is woken up." ;; With #+pauseless-threadstart, this occurs for FOREIGN-THREAD because ;; the memory allocation/deallocation is handled in C. ;; I would like to combine the recycle bin for foreign and lisp threads though. - (delete-from-all-threads - (get-lisp-obj-address sb-vm:*control-stack-start*)))) + (delete-from-all-threads (get-lisp-obj-address c-thread)))) (when sem (setf (thread-semaphore thread) nil) ; nobody needs to wait on it now ;; We could increment by most-positive-fixnum, but that might just encourage @@ -1462,6 +1467,7 @@ on this semaphore, then N of them is woken up." ;;; The "funny fixnum" address format would do no good - AVL-FIND and AVL-DELETE ;;; expect normal happy lisp integers, even if a bignum. (defun delete-from-all-threads (addr) + (declare (type sb-vm:word addr)) (barrier (:read)) (let ((old *all-threads*)) (loop @@ -1702,8 +1708,7 @@ session." (let ((c-thread (descriptor-sap (thread-startup-info thread)))) (setf (thread-startup-info thread) 0) ;; Clean up *ALL-THREADS* - (delete-from-all-threads - (sap-ref-word c-thread (ash sb-vm::thread-control-stack-start-slot sb-vm:word-shift))) + (delete-from-all-threads (sap-int c-thread)) ;; Free the pthread resources (let ((posix-thread (thread-os-thread thread))) (alien-funcall (extern-alien "pthread_join" (function int unsigned unsigned)) @@ -1793,9 +1798,6 @@ session." (sb-unix::unblock-deferrable-signals))))) ;; notinline keeps array off the call stack by getting it out of the curent frame (declare (notinline unmask-signals)) - - (sb-ext:atomic-push *current-thread* (session-new-enrollees *session*)) - ;; Signals other than stop-for-GC are masked. The WITH/WITHOUT noise is ;; pure cargo-cultism. (without-interrupts (with-local-interrupts ,@body)))))) @@ -1807,7 +1809,7 @@ session." (macrolet ((unmask-signals () '(sb-unix::unblock-deferrable-signals)) (apply-real-function () '(apply function arguments))) (copy-primitive-thread-fields thread) - (update-all-threads (get-lisp-obj-address sb-vm:*control-stack-start*) thread) + (update-all-threads (thread-primitive-thread thread) thread) (sb-ext:atomic-push thread (session-new-enrollees *session*)) (when setup-sem (signal-semaphore setup-sem) @@ -1819,6 +1821,7 @@ session." ;;; All threads other than the initial thread start via this function. #+sb-thread (thread-trampoline-defining-macro + (set-thread-control-stack-slots *current-thread*) #+linux (let ((name (thread-name *current-thread*))) ;; "The thread name is a meaningful C language string, whose length is ;; restricted to 16 characters, including the terminating null byte ('\0'). @@ -1964,9 +1967,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (pthread-sigmask sb-unix::SIG_BLOCK (foreign-symbol-sap "deferrable_sigset" t) saved-sigmask)) (binding* ((thread-sap (allocate-thread-memory) :EXIT-IF-NULL) - (stack-base - (sap-ref-word thread-sap - (ash sb-vm::thread-control-stack-start-slot sb-vm:word-shift))) (sigmask (if (position 1 saved-sigmask) ; if there are any signals masked (copy-seq saved-sigmask) ; heap-allocate to pass to the new thread @@ -1974,9 +1974,9 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (cell (list thread)) (startup-info (vector trampoline cell function arguments sigmask - #+darwin ; pass fp modes, clearing the accrued exception bits - (dpb 0 sb-vm:float-sticky-bits (sb-vm:floating-point-modes)) - #-darwin 0))) ; otherwise, don't need to do that + ;; pass fp modes if neccessary, clearing the accrued exception bits + (+ #+(or win32 darwin freebsd) + (dpb 0 sb-vm:float-sticky-bits (sb-vm:floating-point-modes)))))) (setf (thread-primitive-thread thread) (sap-int thread-sap) (thread-startup-info thread) startup-info) ;; Add new thread to *ALL-THREADS* now so that if the creator asserts @@ -1984,7 +1984,9 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; But there is a slight ploy involved: the thread does not appear in ;; (LIST-ALL-THREADS) until a POSIX thread is successfully started. (setf (thread-%visible thread) 0) - (update-all-threads stack-base thread) + (update-all-threads (sap-int thread-sap) thread) + (when *session* + (sb-ext:atomic-push thread (session-new-enrollees *session*))) ;; Absence of the startup semaphore notwithstanding, creation is synchronized ;; so that we can prevent new threads from starting, typically in SB-POSIX:FORK ;; or SAVE-LISP-AND-DIE. @@ -2005,14 +2007,19 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." sb-vm:word-shift)) thread) (setq created (pthread-create thread thread-sap)) - (cond (created ; Still holding the MAKE-THREAD-LOCK, expose thread in (LIST-ALL-THREADS). + (cond (created + ;; Still holding the MAKE-THREAD-LOCK, expose the thread in *all-threads*. + ;; In this manner, anyone who acquires the MAKE-THREAD-LOCK can be sure that + ;; (list-all-threads) enumerates every running thread. ;; On CPUs where CAS can spuriously fail, this probably needs to loop and retry. ;; It's ok if the thread changed 0 -> {1 | -1}, then failure here is correct. (sb-ext:cas (thread-%visible thread) 0 1)) (t ; unlikely. Out of memory perhaps? (setq *starting-threads* old))))) (unless created ; Remove side-effects of trying to create - (delete-from-all-threads stack-base) + (delete-from-all-threads (sap-int thread-sap)) + (when *session* + (%delete-thread-from-session thread)) (free-thread-struct thread-sap))) (with-pinned-objects (saved-sigmask) (pthread-sigmask sb-unix::SIG_SETMASK saved-sigmask nil)) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index 217e294b9e..7d589f905a 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -103,12 +103,13 @@ in future versions." ;; Any use of THREAD-OS-THREAD from lisp should take care to ensure validity of ;; the thread id by holding the INTERRUPTIONS-LOCK. (os-thread 0 :type sb-vm:word) - ;; Keep a copy of CONTROL-STACK-END from the "primitive" thread. - ;; Reading that memory for any thread except *CURRENT-THREAD* is not safe - ;; due to possible unmapping on thread death. + ;; Keep a copy of the stack range for use in SB-EXT:STACK-ALLOCATED-P so that + ;; we don't have to read it from the primitive thread which is unsafe for any + ;; thread other than the current thread. ;; Usually this is a fixed amount below PRIMITIVE-THREAD, but the exact offset ;; varies by build configuration, and if #+win32 it is not related in any way. - (stack-end 0 :type sb-vm:word) + (control-stack-start 0 :type sb-vm:word) + (control-stack-end 0 :type sb-vm:word) ;; At the beginning of the thread's life, this is a vector of data required ;; to start the user code. At the end, is it pointer to the 'struct thread' ;; so that it can be either freed or reused. diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 12c66c3856..a9dedffa06 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -309,6 +309,8 @@ ":SB-SAFEPOINT not supported on selected architecture") ("(and sb-safepoint-strictly (not sb-safepoint))" ":SB-SAFEPOINT-STRICTLY requires :SB-SAFEPOINT") + ("(and os-thread-stack sb-safepoint)" + ":OS-THREAD-STACK and :SB-SAFEPOINT are incompatible") ("(not (or elf mach-o win32))" "No execute object file format feature defined") ("(and cons-profiling (not sb-thread))" ":CONS-PROFILING requires :SB-THREAD") diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index c7523057a2..e82d501e6e 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -150,8 +150,10 @@ (let ((old-threads (list-all-threads)) (thread (make-thread (lambda () + ;; I honestly have no idea what this is testing. + ;; It seems to be nothing more than an implementation change detector test. (assert (sb-thread::avl-find - (sb-kernel:get-lisp-obj-address sb-vm:*control-stack-start*) + (sb-thread::thread-primitive-thread sb-thread:*current-thread*) sb-thread::*all-threads*)) (sleep 2)))) (new-threads (list-all-threads))) From 49ac21480259d11139003e271a35973b92cd4d67 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 10 Aug 2020 00:02:04 -0400 Subject: [PATCH 0363/4023] Fix typo - wrong package --- src/code/debug.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/debug.lisp b/src/code/debug.lisp index 69223a3393..1276764ad7 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -470,7 +470,7 @@ information." (< a (sb-thread::thread-control-stack-end thread))))) #+win32 ; exhaustive search (dolist (thread (sb-thread:list-all-threads)) ; conses, but I don't care - (when (sb-thread::in-stack-range-p) + (when (in-stack-range-p) (return thread))) #-win32 ;; find a stack whose primitive-thread is nearest and above A. From a1b146fa0362b028d8fc619a9d4afc5d8ad5f5c2 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 10 Aug 2020 16:46:31 +0300 Subject: [PATCH 0364/4023] Fix build. --- src/runtime/thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 555682b3f9..cf5999a221 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -563,7 +563,7 @@ void* new_thread_trampoline(void* arg) // thread that made a THREAD instance which (on a precise GC architecture) gets // moved to a protectable page. There's a window in which it could happen just // after making the instance and before pushing it into *STARTING-THREADS*. - lispthread->stack_end = (lispobj)th->control_stack_end; + lispthread->control_stack_end = (lispobj)th->control_stack_end; // Passing the untagged pointer ensures 2 things: // - that the pinning mechanism works as designed, and not just by accident. // - that the initial stack does not contain a lisp pointer after it is not needed. From 7113151db3b6ed213747d647e091845014993f18 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 10 Aug 2020 10:09:28 -0400 Subject: [PATCH 0365/4023] Remove assignment It's done in lisp --- src/runtime/thread.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index cf5999a221..37cbf198e0 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -554,16 +554,6 @@ void* new_thread_trampoline(void* arg) #endif th->os_kernel_tid = sb_GetTID(); init_new_thread(th, 0, 0, 0); - // The lisp thread instance stores the stack end for one purpose only, for - // SB-EXT:STACK-ALLOCATED-P to quickly check whether an object is on some - // thread's stack by looking only the all-threads tree and not acquiring a lock - // on any primitive thread. - // Storing through a pointer to lisp memory has to wait until linking to all_threads, - // lest the WP fault handler think this isn't a lisp thread. Consider a creating - // thread that made a THREAD instance which (on a precise GC architecture) gets - // moved to a protectable page. There's a window in which it could happen just - // after making the instance and before pushing it into *STARTING-THREADS*. - lispthread->control_stack_end = (lispobj)th->control_stack_end; // Passing the untagged pointer ensures 2 things: // - that the pinning mechanism works as designed, and not just by accident. // - that the initial stack does not contain a lisp pointer after it is not needed. From 1282f7d90af07a3416294116c785fb3bb1ae50ff Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 10 Aug 2020 19:42:38 +0300 Subject: [PATCH 0366/4023] A test succeeds now. --- tests/make-thread.impure.lisp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/make-thread.impure.lisp b/tests/make-thread.impure.lisp index 2da6e960e3..a94db1db84 100644 --- a/tests/make-thread.impure.lisp +++ b/tests/make-thread.impure.lisp @@ -125,8 +125,7 @@ ;;; In fact, assert something stronger: there are no young objects ;;; between the current SP and end of stack. (test-util:with-test (:name :expected-gc-roots - :skipped-on (or :interpreter (not :pauseless-threadstart)) - :fails-on (and :x86 :sb-fasteval)) + :skipped-on (or :interpreter (not :pauseless-threadstart))) (let ((list (tryit :print nil))) ;; should be not many things pointed to by the stack (assert (< (length list) #+x86 38 ; more junk, I don't know why From 012afaea91319fed5be051ad98e62c7c75dbbee2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 10 Aug 2020 15:03:03 -0400 Subject: [PATCH 0367/4023] Adjust crossbuild "local" features * PPC64 and x86-64 already have :64-bit in the base features * Remove :sb-futex for x86-64 since it's trying to be like :win32 --- crossbuild-runner/backends/ppc64/local-target-features | 2 +- crossbuild-runner/backends/x86-64/local-target-features | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crossbuild-runner/backends/ppc64/local-target-features b/crossbuild-runner/backends/ppc64/local-target-features index 28376cb1d2..e9929965a3 100644 --- a/crossbuild-runner/backends/ppc64/local-target-features +++ b/crossbuild-runner/backends/ppc64/local-target-features @@ -1 +1 @@ -:64-bit :gencgc :big-endian :sb-thread +:gencgc :big-endian :sb-thread diff --git a/crossbuild-runner/backends/x86-64/local-target-features b/crossbuild-runner/backends/x86-64/local-target-features index 319547ce3d..555f23d05b 100644 --- a/crossbuild-runner/backends/x86-64/local-target-features +++ b/crossbuild-runner/backends/x86-64/local-target-features @@ -1 +1 @@ -:win32 :avx2 :sb-safepoint :sb-thruption :sb-wtimer :sb-safepoint-strictly :sb-futex :64-bit :gencgc :sb-simd-pack :sb-simd-pack-256 :little-endian :sb-thread +:win32 :avx2 :sb-safepoint :sb-thruption :sb-wtimer :sb-safepoint-strictly :gencgc :sb-simd-pack :sb-simd-pack-256 :little-endian :sb-thread From 00d8c93fb49b9ed310c56f10f34b007af5c71cee Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 10 Aug 2020 15:32:54 -0400 Subject: [PATCH 0368/4023] Fix test of inline constants The feature indicator was removed in ba4f5b2e18. --- tests/compiler.impure.lisp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index f4ef232fe0..2cdfe689d8 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -2260,6 +2260,8 @@ ;;; check that non-trivial constants are EQ across different files: this is ;;; not something ANSI either guarantees or requires, but we want to do it ;;; anyways. +(when (find-symbol "SORT-INLINE-CONSTANTS" "SB-VM") + (push :inline-constants *features*)) (defconstant +share-me-1+ #-inline-constants 123.456d0 #+inline-constants nil) (defconstant +share-me-2+ "a string to share") (defconstant +share-me-3+ (vector 1 2 3)) From 512191f5932080c21b642031887ce8c94330a7a9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 11 Aug 2020 17:23:34 +0300 Subject: [PATCH 0369/4023] Faster RATIONAL when the result is a RATIO. A float is a ratio where the denominator is a power of two, which means there's no need to use GCD or division to reduce the fractions. It just needs to find the first set bit in the numerator and shift accordingly. --- NEWS | 1 + src/code/float.lisp | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index bfd378e654..e7a3c6c8db 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ changes relative to sbcl-2.0.7: * optimization: SB-THREAD:MAKE-THREAD is faster on most platforms. + * optimization: faster RATIONAL when the result is a RATIO. changes in sbcl-2.0.7 relative to sbcl-2.0.6: * minor incompatible change: SB-THREAD:THREAD-OS-TID returns NIL for diff --git a/src/code/float.lisp b/src/code/float.lisp index 10baf49a8a..fccbf98f00 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -774,6 +774,15 @@ (((foreach single-float double-float #+long-float long-float)) (%unary-ftruncate number)))) +(declaim (inline first-bit-set)) +(defun first-bit-set (x) + (declare (word x)) + #+x86-64 + (truly-the (values (mod #.sb-vm:n-word-bits) &optional) + (%primitive sb-vm::unsigned-word-find-first-bit x)) + #-x86-64 + (1- (integer-length (logand x (- x))))) + (defun rational (x) "RATIONAL produces a rational number for any real numeric argument. This is more efficient than RATIONALIZE, but it assumes that floating-point is @@ -786,7 +795,19 @@ 0 (let ((int (if (minusp x) (- bits) bits))) (if (minusp exp) - (integer-/-integer int (ash 1 (- exp))) + ;; Instead of division (which also involves GCD) + ;; find the first set bit of the numerator and shift accordingly, + ;; as the denominator is a power of two. + (let* ((pexp (- exp)) + (set (first-bit-set bits)) + (shifted (ash int (- set)))) + (if (> pexp set) + (%make-ratio shifted + (let ((shift (- pexp set))) + (if (< shift sb-vm:n-fixnum-bits) + (ash 1 shift) + (bignum-ashift-left-fixnum 1 shift)))) + (ash int exp))) (ash int exp)))))) ((rational) x))) From 3661abbcbd1a1db14d006a1288e1be014e5f4ccd Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 11 Aug 2020 17:56:33 +0300 Subject: [PATCH 0370/4023] Fix 32-bit. --- src/code/float.lisp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index fccbf98f00..7165f880c9 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -776,10 +776,9 @@ (declaim (inline first-bit-set)) (defun first-bit-set (x) - (declare (word x)) #+x86-64 (truly-the (values (mod #.sb-vm:n-word-bits) &optional) - (%primitive sb-vm::unsigned-word-find-first-bit x)) + (%primitive sb-vm::unsigned-word-find-first-bit (the word x))) #-x86-64 (1- (integer-length (logand x (- x))))) From d9ba405064500b4a677679c31bf83c39c6fe0647 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 11 Aug 2020 13:51:11 -0400 Subject: [PATCH 0371/4023] Fix accidental fallthrough Traceroot had an issue with a classoid named by a symbol whose print name was not a base-string, but only if 'heap_trace_verbose' was enabled. sxhash_simple_string() in C is unused so the bug there was only theoretical. --- src/runtime/Config.x86-64-linux | 2 +- src/runtime/coreparse.c | 1 + src/runtime/hopscotch.c | 1 + src/runtime/traceroot.c | 4 ++-- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/runtime/Config.x86-64-linux b/src/runtime/Config.x86-64-linux index 5b242bf0a2..a9dc7f0087 100644 --- a/src/runtime/Config.x86-64-linux +++ b/src/runtime/Config.x86-64-linux @@ -46,7 +46,7 @@ ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE OS_LIBS += -lunwind endif -CFLAGS += -Wunused-parameter -fno-omit-frame-pointer -momit-leaf-frame-pointer +CFLAGS += -Wunused-parameter -Wimplicit-fallthrough -fno-omit-frame-pointer -momit-leaf-frame-pointer DISABLE_PIE=no ifdef LISP_FEATURE_IMMOBILE_SPACE diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 8371ae4167..04cd8a51dd 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -417,6 +417,7 @@ static void relocate_space(uword_t start, lispobj* end, struct heap_adjust* adj) // - Otherwise, the word might point to a relocated range, // either the instance itself, or a trampoline in immobile space. adjust_word_at(where+1, adj); + /* FALLTHROUGH */ case INSTANCE_WIDETAG: layout = (widetag == FUNCALLABLE_INSTANCE_WIDETAG) ? funinstance_layout(where) : instance_layout(where); diff --git a/src/runtime/hopscotch.c b/src/runtime/hopscotch.c index ad6b398704..90c3459b67 100644 --- a/src/runtime/hopscotch.c +++ b/src/runtime/hopscotch.c @@ -301,6 +301,7 @@ uword_t sxhash_simple_string(struct vector* string) #ifdef SIMPLE_CHARACTER_STRING_WIDETAG case SIMPLE_CHARACTER_STRING_WIDETAG: for(i=0;i Date: Tue, 11 Aug 2020 22:35:01 +0300 Subject: [PATCH 0372/4023] Optimize float-bignum comparisons on +64-bit. Need to compare directly only a small portion of the bignum, the rest can be done with bignum-lower-bits-zero-p, sign checks. --- NEWS | 1 + src/code/float.lisp | 63 +++++++++++++++++++++++++++++++++++++++++++ src/code/numbers.lisp | 23 +++++++++++----- 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index e7a3c6c8db..704947a231 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ changes relative to sbcl-2.0.7: * optimization: SB-THREAD:MAKE-THREAD is faster on most platforms. * optimization: faster RATIONAL when the result is a RATIO. + * optimization: improved cross-type comparisons (float/ratio/bignum). changes in sbcl-2.0.7 relative to sbcl-2.0.6: * minor incompatible change: SB-THREAD:THREAD-OS-TID returns NIL for diff --git a/src/code/float.lisp b/src/code/float.lisp index 7165f880c9..cd924b802e 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -810,6 +810,69 @@ (ash int exp)))))) ((rational) x))) +#+64-bit +(defun float-bignum-= (float bignum) + (declare (optimize speed)) + (number-dispatch ((float)) + (((foreach single-float double-float)) + (multiple-value-bind (bits exp) (integer-decode-float float) + (if (or (eql bits 0) + (minusp exp)) + nil + (let ((int (if (minusp float) (- bits) bits))) + (and (= (truly-the bignum-length (bignum-integer-length bignum)) + (+ (integer-length bits) exp)) + (sb-bignum::bignum-lower-bits-zero-p bignum exp) + (= int + (truly-the fixnum + (sb-bignum::ldb-bignum=>fixnum sb-vm:n-fixnum-bits exp bignum)))))))))) + +#+64-bit +(defun float-bignum-< (float bignum) + (declare (optimize speed)) + (number-dispatch ((float)) + (((foreach single-float double-float)) + (multiple-value-bind (bits exp) (integer-decode-float float) + (if (or (eql bits 0) + (minusp exp)) + (bignum-plus-p bignum) + (let ((int (if (minusp float) (- bits) bits)) + (length-diff (- (truly-the bignum-length (bignum-integer-length bignum)) + (+ (integer-length bits) exp)))) + (cond + ((plusp length-diff) (bignum-plus-p bignum)) + ((minusp length-diff) (minusp float)) + (t + (let ((diff (- (truly-the fixnum + (sb-bignum::ldb-bignum=>fixnum sb-vm:n-fixnum-bits exp bignum)) + int))) + (cond ((plusp diff) t) + ((minusp diff) nil) + (t + (not (sb-bignum::bignum-lower-bits-zero-p bignum exp))))))))))))) + +#+64-bit +(defun float-bignum-> (float bignum) + (declare (optimize speed)) + (number-dispatch ((float)) + (((foreach single-float double-float)) + (multiple-value-bind (bits exp) (integer-decode-float float) + (if (or (eql bits 0) + (minusp exp)) + (not (bignum-plus-p bignum)) + (let ((int (if (minusp float) (- bits) bits)) + (length-diff (- (truly-the bignum-length (bignum-integer-length bignum)) + (+ (integer-length bits) exp)))) + (cond + ((plusp length-diff) (not (bignum-plus-p bignum))) + ((minusp length-diff) (not (minusp float))) + (t + (let ((diff (- (truly-the fixnum + (sb-bignum::ldb-bignum=>fixnum sb-vm:n-fixnum-bits exp bignum)) + int))) + (cond ((plusp diff) nil) + ((minusp diff) t))))))))))) + ;;; This algorithm for RATIONALIZE, due to Bruno Haible, is included ;;; with permission. ;;; diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index b6c6fefb50..ee103130a8 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -635,15 +635,26 @@ the first." (,op (* (numerator x) (ash 1 (- exp))) (* int (denominator x))) (,op x (ash int exp)))))))) - (((foreach single-float double-float #+long-float long-float) bignum) - (if (eql y 0) - (,op x (coerce 0 '(dispatch-type x))) - (if (float-infinity-p x) - ,infinite-x-finite-y - (,op (rational x) y)))) + (((foreach single-float double-float) bignum) + (if (float-infinity-p x) + ,infinite-x-finite-y + #+64-bit + (,(case op + (> 'float-bignum->) + (< 'float-bignum-<) + (= 'float-bignum-=)) + x y) + #-64-bit + (,op (rational x) y))) ((bignum float) (if (float-infinity-p y) ,infinite-y-finite-x + #+64-bit + (,(case op + (> 'float-bignum-<) + (< 'float-bignum->) + (= 'float-bignum-=)) + y x) (,op x (rational y)))))) ) ; EVAL-WHEN From 5d567f7771697fd92c1cb7fefa89022d5b4fdfa8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 11 Aug 2020 23:01:00 +0300 Subject: [PATCH 0373/4023] Missing conditional. --- src/code/numbers.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index ee103130a8..4520515d18 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -655,6 +655,7 @@ the first." (< 'float-bignum->) (= 'float-bignum-=)) y x) + #-64-bit (,op x (rational y)))))) ) ; EVAL-WHEN From a03133f4c391d646c55e78a14195281d6589d768 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 11 Aug 2020 23:38:21 +0300 Subject: [PATCH 0374/4023] Fix inlining. --- src/code/bignum-random.lisp | 18 ------------------ src/code/bignum.lisp | 20 +++++++++++++++++++- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/code/bignum-random.lisp b/src/code/bignum-random.lisp index 0d95e717b3..374618afba 100644 --- a/src/code/bignum-random.lisp +++ b/src/code/bignum-random.lisp @@ -14,24 +14,6 @@ (in-package "SB-BIGNUM") -;;; Return T if the least significant N-BITS bits of BIGNUM are all -;;; zero, else NIL. If the integer-length of BIGNUM is less than N-BITS, -;;; the result is NIL, too. -(declaim (inline bignum-lower-bits-zero-p)) -(defun bignum-lower-bits-zero-p (bignum n-bits) - (declare (type bignum bignum) - (type bit-index n-bits)) - (multiple-value-bind (n-full-digits n-bits-partial-digit) - (floor n-bits digit-size) - (declare (type bignum-length n-full-digits)) - (when (> (%bignum-length bignum) n-full-digits) - (dotimes (index n-full-digits) - (declare (type bignum-index index)) - (unless (zerop (%bignum-ref bignum index)) - (return-from bignum-lower-bits-zero-p nil))) - (zerop (logand (1- (ash 1 n-bits-partial-digit)) - (%bignum-ref bignum n-full-digits)))))) - ;;; Return a nonnegative integer of DIGIT-SIZE many pseudo random bits. (declaim (inline random-bignum-digit)) (defun random-bignum-digit (state) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index 6b08a000c0..065b2ba552 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -1452,7 +1452,7 @@ ;; This could be used by way of a transform, though for now it's specifically ;; a helper for %LDB in the limited case that it recognizes as non-consing. (defun ldb-bignum=>fixnum (byte-size byte-pos bignum) - (declare (type (integer 0 #.sb-vm:n-positive-fixnum-bits) byte-size) + (declare (type (integer 0 #.sb-vm:n-fixnum-bits) byte-size) (type bit-index byte-pos)) (multiple-value-bind (word-index bit-index) (floor byte-pos digit-size) (let ((n-digits (%bignum-length bignum))) @@ -1956,3 +1956,21 @@ (clear-info :function :inlining-data s) (clear-info :function :inlinep s) (clear-info :source-location :declaration s)) + +;;; Return T if the least significant N-BITS bits of BIGNUM are all +;;; zero, else NIL. If the integer-length of BIGNUM is less than N-BITS, +;;; the result is NIL, too. +(declaim (inline bignum-lower-bits-zero-p)) +(defun bignum-lower-bits-zero-p (bignum n-bits) + (declare (type bignum bignum) + (type bit-index n-bits)) + (multiple-value-bind (n-full-digits n-bits-partial-digit) + (floor n-bits digit-size) + (declare (type bignum-length n-full-digits)) + (when (> (%bignum-length bignum) n-full-digits) + (dotimes (index n-full-digits) + (declare (type bignum-index index)) + (unless (zerop (%bignum-ref bignum index)) + (return-from bignum-lower-bits-zero-p nil))) + (zerop (logand (1- (ash 1 n-bits-partial-digit)) + (%bignum-ref bignum n-full-digits)))))) From d1f1f12cecbf7720400929b955d53af632dd11a5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 12 Aug 2020 00:23:03 +0300 Subject: [PATCH 0375/4023] Fix float-bignum->< Replace ldb-bignum=>fixnum with last-bignum-part=>fixnum which returns a signed fixnum. --- src/code/bignum.lisp | 33 ++++++++++++++++++++++++++++++++- src/code/float.lisp | 6 +++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index 065b2ba552..4470aa34a5 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -1452,7 +1452,7 @@ ;; This could be used by way of a transform, though for now it's specifically ;; a helper for %LDB in the limited case that it recognizes as non-consing. (defun ldb-bignum=>fixnum (byte-size byte-pos bignum) - (declare (type (integer 0 #.sb-vm:n-fixnum-bits) byte-size) + (declare (type (integer 0 #.sb-vm:n-positive-fixnum-bits) byte-size) (type bit-index byte-pos)) (multiple-value-bind (word-index bit-index) (floor byte-pos digit-size) (let ((n-digits (%bignum-length bignum))) @@ -1480,6 +1480,37 @@ (%sign-digit bignum n-digits))))) (ldb (byte low-part-size bit-index) ; low part (%bignum-ref bignum word-index))))))))) + +;;; Basically shift the bignum right by byte-pos, but assumes it's +;;; right at the end of the bignum. +(defun last-bignum-part=>fixnum (byte-pos bignum) + (declare (type bit-index byte-pos) + (bignum bignum) + (optimize speed)) + (let ((n-digits (%bignum-length bignum))) + (multiple-value-bind (word-index bit-index) (floor byte-pos digit-size) + (cond ((<= (+ bit-index sb-vm:n-fixnum-bits) digit-size) ; contained in one word + (sb-c::mask-signed-field sb-vm:n-fixnum-bits + (ash (%bignum-ref bignum word-index) (- bit-index)))) + (t + ;; At least one bit is obtained from each of two words, + ;; and not more than two words. + (let* ((low-part-size + (truly-the (integer 1 #.(1- sb-vm:n-positive-fixnum-bits)) + (- digit-size bit-index))) + (high-part-size + (truly-the (integer 1 #.(1- sb-vm:n-positive-fixnum-bits)) + (- sb-vm:n-fixnum-bits low-part-size)))) + (logior + (let ((word-index (1+ word-index))) + (sb-c::mask-signed-field sb-vm:n-fixnum-bits + (if (< word-index n-digits) ; next word exists + (ash (%bignum-ref bignum word-index) low-part-size) + (truly-the word + (mask-field (byte high-part-size low-part-size) + (%sign-digit bignum n-digits)))))) + (ldb (byte low-part-size bit-index) + (%bignum-ref bignum word-index))))))))) ;;;; TRUNCATE diff --git a/src/code/float.lisp b/src/code/float.lisp index cd924b802e..12dba358bb 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -825,7 +825,7 @@ (sb-bignum::bignum-lower-bits-zero-p bignum exp) (= int (truly-the fixnum - (sb-bignum::ldb-bignum=>fixnum sb-vm:n-fixnum-bits exp bignum)))))))))) + (sb-bignum::last-bignum-part=>fixnum exp bignum)))))))))) #+64-bit (defun float-bignum-< (float bignum) @@ -844,7 +844,7 @@ ((minusp length-diff) (minusp float)) (t (let ((diff (- (truly-the fixnum - (sb-bignum::ldb-bignum=>fixnum sb-vm:n-fixnum-bits exp bignum)) + (sb-bignum::last-bignum-part=>fixnum exp bignum)) int))) (cond ((plusp diff) t) ((minusp diff) nil) @@ -868,7 +868,7 @@ ((minusp length-diff) (not (minusp float))) (t (let ((diff (- (truly-the fixnum - (sb-bignum::ldb-bignum=>fixnum sb-vm:n-fixnum-bits exp bignum)) + (sb-bignum::last-bignum-part=>fixnum exp bignum)) int))) (cond ((plusp diff) nil) ((minusp diff) t))))))))))) From 328908a79eea9101452de07a127428eca9152090 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 12 Aug 2020 01:03:20 +0300 Subject: [PATCH 0376/4023] basic-compare: (* x (ash 1 c)) => (ash x c) --- src/code/numbers.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index 4520515d18..e37ea0b6cc 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -622,7 +622,7 @@ the first." (let ((int (if (minusp x) (- bits) bits))) (if (minusp exp) (,op (* int (denominator y)) - (* (numerator y) (ash 1 (- exp)))) + (ash (numerator y) (- exp))) (,op (ash int exp) y))))))) ((ratio (foreach single-float double-float)) (if (float-infinity-p y) @@ -632,7 +632,7 @@ the first." (,op x 0) (let ((int (if (minusp y) (- bits) bits))) (if (minusp exp) - (,op (* (numerator x) (ash 1 (- exp))) + (,op (ash (numerator x) (- exp)) (* int (denominator x))) (,op x (ash int exp)))))))) (((foreach single-float double-float) bignum) From 99657111ded0dac030fba71a3078990fed806b57 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 11 Aug 2020 23:33:30 -0400 Subject: [PATCH 0377/4023] win32: Fix some C compiler warnings --- src/runtime/hopscotch.c | 8 ++++++++ src/runtime/monitor.c | 17 ++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/runtime/hopscotch.c b/src/runtime/hopscotch.c index 90c3459b67..5b42195e95 100644 --- a/src/runtime/hopscotch.c +++ b/src/runtime/hopscotch.c @@ -21,6 +21,14 @@ #include "hopscotch.h" #include #include +#ifdef LISP_FEATURE_WIN32 +/* I don't know where ffs() is prototyped */ +extern int ffs(int); +#else +/* https://www.freebsd.org/cgi/man.cgi?query=fls&sektion=3&manpath=FreeBSD+7.1-RELEASE + says strings.h */ +#include +#endif #include "genesis/vector.h" #include "murmur_hash.h" diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 47ee5c3ada..0e47753ffc 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -492,18 +492,17 @@ catchers_cmd(char __attribute__((unused)) **ptr) printf("There are no active catchers!\n"); else { while (catch != NULL) { - printf("0x%08lX:\n\tuwp: 0x%08lX\n\tfp: 0x%08lX\n\t" - "code: 0x%08lX\n\tentry: 0x%08lX\n\ttag: ", - (long unsigned)catch, - (long unsigned)(catch->uwp), - (long unsigned)(catch->cfp), + printf("%p:\n\tuwp : %p\n\tfp : %p\n\t" + "code : %p\n\tentry: %p\n\ttag: ", + catch, + catch->uwp, + catch->cfp, #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) - (long unsigned)component_ptr_from_pc((void*)catch->entry_pc) - + OTHER_POINTER_LOWTAG, + component_ptr_from_pc((void*)catch->entry_pc), #else - (long unsigned)(catch->code), + catch->code, #endif - (long unsigned)(catch->entry_pc)); + (void*)(catch->entry_pc)); brief_print((lispobj)catch->tag); catch = catch->previous_catch; } From f34c0992c4b05e806a42d91343210f38a1e4f491 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 00:12:52 -0400 Subject: [PATCH 0378/4023] Implement fcb-threads test for win32 This change cranks up the number of GCs which causes it to flake on macOS. All indications are that there's an OS bug - if it is observed that the GC signal is pending in detach_os_thread(), the call to sigwait() sometimes does not clear the signal. Usually it works. I can't discern a pattern. --- tests/fcb-threads.c | 63 +++++++++++++++++++++++++++++++---- tests/fcb-threads.impure.lisp | 46 +++++++++++++++++-------- 2 files changed, 90 insertions(+), 19 deletions(-) diff --git a/tests/fcb-threads.c b/tests/fcb-threads.c index f8d53d42be..713d9d12ed 100644 --- a/tests/fcb-threads.c +++ b/tests/fcb-threads.c @@ -1,25 +1,56 @@ -#include +/* In as much as this file simulates "foreign" code, + * we don't include "sbcl.h" and we use the native thread API + * for the platform */ + +#ifdef _WIN32 +# include +# include +# include // for WaitForSingleObject +#else +# include +#endif #include +#include struct thread_arg { void * funkyfun; int index; int n_calls; }; +char *salutations[8] = { + "Hello", "Hi there!", "Hey", "Hi!", "Ahoy there", "What's up!", "Hola", + "That's a winner" +}; +int sharedvar; + +#ifdef _WIN32 +long unsigned int doThatThing(void* void_arg) +#else void* doThatThing(void* void_arg) +#endif { struct thread_arg* arg = void_arg; + int thread_result = 0xC0FEFE; int (*lispfun)(char*,double) = arg->funkyfun; int i; + // fprintf(stderr, "enter doThatThing %p\n", void_arg); fflush(stderr); for(i=0; in_calls; ++i) { - lispfun("Hello", arg->index + i); + int index = __sync_fetch_and_add(&sharedvar,1); + char *salutation = salutations[index % 8]; + int answer = lispfun(salutation, arg->index + i); + if (answer != (arg->index + i) * strlen(salutation)) thread_result = 0; } - return 0; + return thread_result; } int call_thing_from_threads(void* ptr, int n_threads, int n_calls) { struct { +#ifdef _WIN32 + HANDLE handle; + DWORD result; +#else pthread_t pthread_id; - struct thread_arg arg; void* result; +#endif + struct thread_arg arg; } threads[50]; if (n_threads>50) { fprintf(stderr, "pick a smaller number\n"); @@ -30,18 +61,37 @@ int call_thing_from_threads(void* ptr, int n_threads, int n_calls) threads[i].arg.funkyfun = ptr; threads[i].arg.index = i + 1; threads[i].arg.n_calls = n_calls; +#ifdef _WIN32 + threads[i].handle = CreateThread(NULL, 0, doThatThing, &threads[i].arg, 0, NULL); +#else pthread_create(&threads[i].pthread_id, 0, doThatThing, &threads[i].arg); +#endif } + int all_ok = 1; for(i=0; i #include #include @@ -75,3 +125,4 @@ void prepare_exit_test(int seconds) it.it_interval.tv_sec = it.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &it, 0); } +#endif diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 5425e71f43..bb21ccd763 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -15,8 +15,16 @@ ;;; - garbage_collect: no SP known for thread 0x802bea000 (OS 34367133952) ;;; - failed AVER: (NOT (SB-THREAD::AVL-FIND ADDR SB-THREAD::OLD)) -#+(or (not sb-thread) win32 freebsd) (sb-ext:exit :code 104) +#+(or (not sb-thread) freebsd) (sb-ext:exit :code 104) +#+win32 +(with-scratch-file (solib "dll") + (sb-ext:run-program "gcc" + `("-shared" "-o" ,solib "fcb-threads.c") + :search t) + (sb-alien:load-shared-object solib)) + +#-win32 (if (probe-file "fcb-threads.so") ;; Assume the test automator built this for us (load-shared-object (truename "fcb-threads.so")) @@ -35,26 +43,33 @@ (defglobal *seen-threads* nil) +;;; A variable commissioned by the department of needless and unnecessary redundancy department +(defglobal *print-greetings-and-salutations* (or #+linux t)) + (sb-alien::define-alien-callback testcb int ((arg1 c-string) (arg2 double)) - (let ((cell (assoc sb-thread:*current-thread* *seen-threads*))) + (let ((cell (assoc sb-thread:*current-thread* *seen-threads*)) + (result (floor (* (length arg1) arg2)))) (unless cell (let* ((thr sb-thread:*current-thread*) (string - (format nil "~s from ~s (~@[TID ~d~] C-thread ~x)~%" - arg1 thr + (format nil "~s,~f from [~@[TID ~d ~]C-thread ~x] ~s => ~x~%" + arg1 arg2 (or #+linux (sb-thread::thread-os-tid thr)) - (sb-thread::thread-primitive-thread thr)))) + (sb-thread::thread-primitive-thread thr) + thr result))) ;; This WRITE kind of has to stay here for timing purposes - ;; With it, we get >100 GCs, without it only 3 or 4, ;; and the intent of the test is to exercise GC and foreign ;; calbacks together, which was formerly bug prone. - (sb-sys:with-pinned-objects (string) - (sb-unix:unix-write 1 (sb-sys:vector-sap string) 0 (length string))) + (when *print-greetings-and-salutations* + #+win32 (progn (write-string string) (force-output)) + #-win32 (sb-sys:with-pinned-objects (string) ; avoid interleaved output this way + (sb-unix:unix-write 1 (sb-sys:vector-sap string) 0 (length string)))) (setq cell (cons thr (1- (floor arg2)))) (atomic-push cell *seen-threads*))) (assert (eql (coerce (incf (cdr cell)) 'double-float) - arg2))) - 0) + arg2)) + result)) (defglobal *keepon* t) (defglobal *n-gcs* 0) @@ -67,14 +82,15 @@ (loop (gc) (incf *n-gcs*) - (sleep .001) + (sleep .0001) (sb-thread:barrier (:read)) (if (not *keepon*) (return))))))) (dotimes (i n-trials) (setq *keepon* t) - (alien-funcall (extern-alien "call_thing_from_threads" - (function int system-area-pointer int int)) - (alien-sap testcb) n-threads n-calls) + (with-alien ((testfun (function int system-area-pointer int int) + :extern "call_thing_from_threads")) + (assert (eql (alien-funcall testfun (alien-sap testcb) n-threads n-calls) + 1))) (format t "GC'd ~d times~%" *n-gcs*) (setq *keepon* nil) (sb-thread:barrier (:write)) @@ -87,6 +103,10 @@ ;; one trial, 10 threads, 10 calls (f 1 10 10)) +;;; The rest of the tests can't run because one wants to use pthread_create +;;; and the other wants to use sigaction. +#+win32 (exit :code 104) + ;;; Check that you get an error trying to join a foreign thread (defglobal *my-foreign-thread* nil) (sb-alien::define-alien-callback tryjointhis int () From 8fc915b4a440eccb11be96a2f4a69c16348a2b9e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 01:24:20 -0400 Subject: [PATCH 0379/4023] Fix 64-bit windows bug Only the 32-bit code claims TLS index 63 for its own. The code in os_preinit is conditionalized out for 32-bit. So it would be pretty spectacularly bad to calls TlsFree at lisp thread exit if index 63 were claimed by a library. --- src/runtime/thread.c | 2 ++ src/runtime/win32-os.h | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 37cbf198e0..d42eff0577 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -495,7 +495,9 @@ unregister_thread(struct thread *th, sizeof(th->private_events.events[0])); ++i) { CloseHandle(th->private_events.events[i]); } +#ifndef LISP_FEATURE_64_BIT TlsSetValue(OUR_TLS_INDEX,NULL); +#endif #endif /* Undo the association of the current pthread to its `struct thread', diff --git a/src/runtime/win32-os.h b/src/runtime/win32-os.h index 9662bcc36b..7a1d99270f 100644 --- a/src/runtime/win32-os.h +++ b/src/runtime/win32-os.h @@ -60,7 +60,15 @@ extern int os_number_of_processors; extern int win32_open_for_mmap(const char* file); extern FILE* win32_fopen_runtime(); +// 64-bit uses whatever TLS index the kernels gives us which we store in +// 'thread_self_tls_index' to hold our thread-local value of the pointer +// to struct thread. +// 32-bit uses a quasi-arbitrary fixed TLS index that we try to claim on startup. +// of the process. And we *also* redundantly allocate 'thread_self_tls_index' +// as a different index holding the same pointer. +#ifndef LISP_FEATURE_64_BIT #define OUR_TLS_INDEX 63 +#endif #define SIG_MEMORY_FAULT SIGSEGV #define SIG_STOP_FOR_GC (SIGRTMIN+1) From 1b6e1a257ec9acad81dd0d51ee0677fe1836ff22 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 01:34:25 -0400 Subject: [PATCH 0380/4023] win32: fix and/or muffle some more C warnings --- src/runtime/Config.x86-64-win32 | 2 +- src/runtime/interr.h | 4 ++-- src/runtime/interrupt.c | 6 ++++-- src/runtime/os-common.c | 2 +- src/runtime/x86-64-arch.c | 10 ++++++---- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/runtime/Config.x86-64-win32 b/src/runtime/Config.x86-64-win32 index a189f366be..f8e2c6caf5 100644 --- a/src/runtime/Config.x86-64-win32 +++ b/src/runtime/Config.x86-64-win32 @@ -52,7 +52,7 @@ else endif CFLAGS = -g -W -Wall \ - -Wno-unused-function \ + -Wno-unused-function -Wno-unused-parameter -Wno-cast-function-type \ -fno-omit-frame-pointer \ -O5 -m64 -DWINVER=0x0501 \ -D__W32API_USE_DLLIMPORT__ diff --git a/src/runtime/interr.h b/src/runtime/interr.h index 6dcd378054..e443eab115 100644 --- a/src/runtime/interr.h +++ b/src/runtime/interr.h @@ -40,7 +40,7 @@ extern void skip_internal_error (os_context_t *context); * We assume that it can be cast to 'long' which is a total KLUDGE */ #define UNKNOWN_STACK_POINTER_ERROR(function_name, thread) \ - lose(function_name": no SP known for thread %p (OS %ld)", \ - thread, (long)thread->os_thread); + lose(function_name": no SP known for thread %p (pthread %p)", \ + thread, (void*)thread->os_thread); #endif diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 815d47d2aa..4948c8b6cb 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -178,7 +178,9 @@ static void sigmask_logandc(sigset_t *dest, const sigset_t *source) * work for SIGSEGV and similar. It is good enough for timers, and * maybe all deferrables. */ -#ifndef LISP_FEATURE_WIN32 +#ifdef LISP_FEATURE_WIN32 +#define resignal_to_lisp_thread(dummy1,dummy2) {} +#else static void resignal_to_lisp_thread(int signal, os_context_t *context) { @@ -2061,7 +2063,7 @@ void interrupt_init(void) { #if !defined(LISP_FEATURE_WIN32) || defined(LISP_FEATURE_SB_THREAD) - int i; + int __attribute__((unused)) i; SHOW("entering interrupt_init()"); sigemptyset(&deferrable_sigset); sigemptyset(&blockable_sigset); diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 4926e3e2d6..966010b74c 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -190,7 +190,7 @@ void os_link_runtime() if (entry_index == 0) { #ifdef LISP_FEATURE_WIN32 - os_validate_recommit(LINKAGE_TABLE_SPACE_START, os_vm_page_size); + os_validate_recommit((void*)LINKAGE_TABLE_SPACE_START, os_vm_page_size); #endif } if (result) { diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 139273cc54..495a21f024 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -694,9 +694,10 @@ allocation_tracker_counted(uword_t* sp) unsigned int index = claim_index(1); if (index == 0) index = 2; // reserved overflow counter for fixed-size alloc + uword_t disp = index * 8; // rewrite call into: LOCK INC QWORD PTR, [R11+n] ; opcode = 0xFF / 0 uword_t new_inst = - 0xF0 | (0x49 << 8) | (0xFF << 16) | (0x83L << 24) | ((index*8L) << 32); + 0xF0 | (0x49 << 8) | (0xFF << 16) | (0x83L << 24) | (disp << 32); // Ensure atomicity of the write. A plain store would probably do, // but since this is self-modifying code, the most stringent memory // order is prudent. @@ -728,14 +729,15 @@ allocation_tracker_sized(uword_t* sp) } // rewrite call into: // LOCK INC QWORD PTR, [R11+n] ; opcode = 0xFF / 0 + uword_t disp = index * 8; uword_t new_inst1 = - 0xF0 | (0x49 << 8) | (0xFF << 16) | (0x83L << 24) | ((index * 8L) << 32); + 0xF0 | (0x49 << 8) | (0xFF << 16) | (0x83L << 24) | (disp << 32); // LOCK ADD [R11+n], Rxx ; opcode = 0x01 prefix = 0x49 | ((prefix & 1) << 2); // 'b' bit becomes 'r' bit modrm = 0x83 | (modrm & (7<<3)); // copy 'reg' into new modrm byte + disp = (1 + index) * 8; uword_t new_inst2 = - 0xF0 | (prefix << 8) | (0x01 << 16) | ((long)modrm << 24) - | (((1 + index) * 8L) << 32); + 0xF0 | (prefix << 8) | (0x01 << 16) | ((long)modrm << 24) | (disp << 32); // Overwrite the second instruction first, because as soon as the CALL // opcode is changed, fallthrough to the next instruction occurs. if (!__sync_bool_compare_and_swap(pc+1, word_after_pc, new_inst2) || From 27baab4e3eab31006dc1de4a07bc6330e8964ea6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 02:08:48 -0400 Subject: [PATCH 0381/4023] win32: remove pthread_initialized flag --- src/runtime/pthreads_win32.c | 6 +----- src/runtime/runtime.c | 3 --- src/runtime/win32-os.c | 4 +--- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index ea7dd6666a..166cba59c8 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -919,20 +919,16 @@ void pthread_unlock_structures() pthread_mutex_unlock(&mutex_init_lock); } -static int pthread_initialized = 0; - static pthread_cond_t futex_pseudo_cond; void pthreads_win32_init() { - if (!pthread_initialized) { + thread_self_tls_index = TlsAlloc(); pthread_mutex_init(&mutex_init_lock, NULL); pthread_np_notice_thread(); pthread_key_create(&cv_event_key,cv_event_destroy); pthread_cond_init(&futex_pseudo_cond, NULL); - pthread_initialized = 1; - } } static diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 8f21874ce6..d051d72bad 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -447,9 +447,6 @@ sbcl_main(int argc, char *argv[], char *envp[]) memsize_options.present_in_core = 0; boolean have_hardwired_spaces = os_preinit(argv, envp); -#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD) - pthreads_win32_init(); -#endif interrupt_init(); block_blockable_signals(0); diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index f85f8ba582..92b70ef94e 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -642,6 +642,7 @@ void* os_dlsym_default(char* name) int os_preinit(char *argv[], char *envp[]) { + pthreads_win32_init(); #ifdef LISP_FEATURE_X86 DWORD slots[TLS_MINIMUM_AVAILABLE]; DWORD key; @@ -666,9 +667,6 @@ int os_preinit(char *argv[], char *envp[]) lose("TLS slot assertion failed: slot 63 is unavailable " "(last TlsAlloc() returned %u)",key); } -#else - (void) argv; /* unused */ - (void) envp; /* unused */ #endif return 0; } From 674e10e4e94f16869207b1b12ae3902d82562661 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 02:28:49 -0400 Subject: [PATCH 0382/4023] Fix ommission --- src/runtime/pthreads_win32.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index 166cba59c8..0678dd8261 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -962,14 +962,12 @@ int pthread_np_notice_thread() DUPLICATE_SAME_ACCESS); tls_impersonate(pth); - if (pthread_initialized) { - RegisterWaitForSingleObject(&pth->wait_handle, + RegisterWaitForSingleObject(&pth->wait_handle, pth->handle, pthreads_win32_unnotice, pth, INFINITE, WT_EXECUTEONLYONCE); - } return 1; } else { return 0; From 2747b6a57af769058b399f118ab6a6d4bdf1fcfe Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 04:18:55 -0400 Subject: [PATCH 0383/4023] Decrease test noise --- tests/threads.impure.lisp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index e82d501e6e..41924c074a 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -845,22 +845,23 @@ ;; cheating, and might be hiding the underlying bug that the test is ;; exposing. Let's review this later. (let* ((run t) + (output nil) (d1 (sb-thread:make-thread (lambda () (loop while run do (defclass test-1 () ((a :initform :new-a))) - (write-char #\1) + (when output (write-char #\1)) #-win32 (force-output))) :name "d1")) (d2 (sb-thread:make-thread (lambda () (loop while run do (defclass test-2 () ((b :initform :new-b))) - (write-char #\2) + (when output (write-char #\2)) #-win32 (force-output))) :name "d2")) (d3 (sb-thread:make-thread (lambda () (loop while run do (defclass test-3 (test-1 test-2) ((c :initform :new-c))) - (write-char #\3) + (when output (write-char #\3)) #-win32 (force-output))) :name "d3")) (i (sb-thread:make-thread (lambda () @@ -869,7 +870,7 @@ (assert (member (slot-value i 'a) '(:orig-a :new-a))) (assert (member (slot-value i 'b) '(:orig-b :new-b))) (assert (member (slot-value i 'c) '(:orig-c :new-c)))) - (write-char #\i) + (when output (write-char #\i)) #-win32 (force-output))) :name "i"))) (format t "~%sleeping!~%") @@ -878,7 +879,7 @@ (setf run nil) (mapc (lambda (th) (sb-thread:join-thread th) - (format t "~%joined ~S~%" (sb-thread:thread-name th))) + (format t "~&joined ~S~%" (sb-thread:thread-name th))) (list d1 d2 d3 i)) (force-output))) From 2863ac0e4e7304c77172f1060f373422e837d264 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 04:20:03 -0400 Subject: [PATCH 0384/4023] win32: remove emulation of pthread_[sg]etspecific --- src/runtime/pthreads_win32.c | 96 +++--------------------------------- src/runtime/pthreads_win32.h | 25 ++-------- src/runtime/thread.c | 45 ++++++++++------- src/runtime/thread.h | 8 ++- src/runtime/x86-64-assem.S | 3 ++ 5 files changed, 45 insertions(+), 132 deletions(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index 0678dd8261..d4247dc352 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -123,13 +123,8 @@ typedef unsigned char boolean; /* TLS management internals */ -static DWORD thread_self_tls_index; +DWORD thread_self_tls_index; -static void (*tls_destructors[PTHREAD_KEYS_MAX])(void*); -static boolean tls_used[PTHREAD_KEYS_MAX]; -static pthread_key_t tls_max_used_key; -static pthread_mutex_t thread_key_lock = PTHREAD_MUTEX_INITIALIZER; -static void tls_call_destructors(); static pthread_t tls_impersonate(pthread_t other) { pthread_t old = pthread_self(); TlsSetValue(thread_self_tls_index,other); @@ -191,7 +186,7 @@ DWORD WINAPI Thread_Function(LPVOID param) pthread_mutex_unlock(&self->lock); pthread_mutex_destroy(&self->lock); pthread_cond_destroy(&self->cond); - tls_call_destructors(); + if (self->cv_event) CloseHandle(self->cv_event); CloseHandle(self->handle); @@ -273,76 +268,6 @@ int pthread_join(pthread_t thread, void **retval) return 0; } -/* We manage our own TSD instead of relying on system TLS for anything - other than pthread identity itself. Reasons: (1) Windows NT TLS - slots are expensive, (2) pthread identity migration requires only - one TLS slot assignment, instead of massive copying. */ -int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)) -{ - pthread_key_t index; - boolean success = 0; - pthread_mutex_lock(&thread_key_lock); - for (index = 0; index < PTHREAD_KEYS_MAX; ++index) { - if (!tls_used[index]) { - if (tls_max_used_keyspecifics[key]; -} - -/* Internal function calling destructors for current pthread */ -static void tls_call_destructors() -{ - pthread_key_t key; - int i; - int called; - - for (i = 0; icv_event; if (!event) { event = CreateEvent(NULL, FALSE, FALSE, NULL); - pthread_setspecific(cv_event_key, event); + self->cv_event = event; } else { /* ResetEvent(event); used to be here. Let's try without. It's safe in pthread_cond_wait: if WaitForSingleObjectEx ever @@ -927,7 +844,6 @@ void pthreads_win32_init() thread_self_tls_index = TlsAlloc(); pthread_mutex_init(&mutex_init_lock, NULL); pthread_np_notice_thread(); - pthread_key_create(&cv_event_key,cv_event_destroy); pthread_cond_init(&futex_pseudo_cond, NULL); } @@ -937,7 +853,7 @@ VOID CALLBACK pthreads_win32_unnotice(void* parameter, BOOLEAN timerOrWait) pthread_t pth = parameter; pthread_t self = tls_impersonate(pth); - tls_call_destructors(); + if (self->cv_event) CloseHandle(self->cv_event); CloseHandle(pth->handle); UnregisterWait(pth->wait_handle); diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index e8f11fc07a..ad375a6016 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -89,8 +89,7 @@ pthread_t pthread_self(void) __attribute__((__const__)); pthread_t pthread_self(void); #endif -typedef DWORD pthread_key_t; -int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)); +extern DWORD thread_self_tls_index; #define SIG_BLOCK 1 #define SIG_UNBLOCK 2 @@ -192,6 +191,7 @@ typedef struct pthread_thread { pthread_fn start_routine; void* arg; HANDLE handle; + struct thread *vm_thread; pthread_cond_t *waiting_cond; void *futex_wakeup; sigset_t blocked_signal_set; @@ -210,16 +210,9 @@ typedef struct pthread_thread { /* Thread TEB base (mostly informative/debugging) */ void* teb; - /* Pthread TLS, detached from windows system TLS */ - void *specifics[PTHREAD_KEYS_MAX]; + HANDLE cv_event; } pthread_thread; -static inline int pthread_setspecific(pthread_key_t key, const void *value) -{ - pthread_self()->specifics[key] = (void*)value; - return 0; -} - typedef struct { int bogus; } siginfo_t; @@ -301,18 +294,6 @@ static inline int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t * return 0; } -/* Make speed-critical TLS access inline. - - We don't check key range or validity here: (1) pthread spec is - explicit about undefined behavior for bogus keys, (2) - setspecific/getspecific should be as fast as possible. */ -#define pthread_getspecific pthread_getspecific_np_inline - -static inline void *pthread_getspecific_np_inline(pthread_key_t key) -{ - return pthread_self()->specifics[key]; -} - #ifdef PTHREAD_DEBUG_OUTPUT #define pthread_mutex_lock(mutex) \ pthread_mutex_lock_annotate_np(mutex, __FILE__, __LINE__ ) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index d42eff0577..845fbdb807 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -78,7 +78,7 @@ static __attribute__((unused)) pthread_mutex_t create_thread_lock = PTHREAD_MUTE #ifdef LISP_FEATURE_GCC_TLS __thread struct thread *current_thread; -#else +#elif !defined LISP_FEATURE_WIN32 pthread_key_t specials = 0; #endif #endif @@ -210,23 +210,38 @@ pthread_attr_t new_lisp_thread_attr; #endif struct thread *alloc_thread_struct(void*,lispobj); +#ifndef LISP_FEATURE_SB_THREAD +# define ASSIGN_CURRENT_THREAD(dummy) +#elif defined LISP_FEATURE_GCC_TLS +# define ASSIGN_CURRENT_THREAD(x) current_thread = x +#elif !defined LISP_FEATURE_WIN32 +# define ASSIGN_CURRENT_THREAD(x) pthread_setspecific(specials, x) +#elif defined LISP_FEATURE_64_BIT +# define ASSIGN_CURRENT_THREAD(x) \ + ((struct pthread_thread*)TlsGetValue(thread_self_tls_index))->vm_thread = x +#elif defined LISP_FEATURE_WIN32 +# define ASSIGN_CURRENT_THREAD(x) TlsSetValue(OUR_TLS_INDEX, x) +#endif + +#ifdef LISP_FEATURE_WIN32 +// Need a function callable from assembly code. The inline one won't do. +// This is basically pthread_getspecific without an argument. +void* get_current_vm_thread() { + return arch_os_get_current_thread(); +} +#endif + void create_main_lisp_thread(lispobj function) { struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER_WIDETAG); if (!th || arch_os_thread_init(th)==0 || !init_shared_attr_object()) lose("can't create initial thread"); -#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_GCC_TLS) +#if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_GCC_TLS && !defined LISP_FEATURE_WIN32 pthread_key_create(&specials, 0); #endif #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) lispobj *args = NULL; #endif -#ifdef LISP_FEATURE_SB_THREAD -# ifdef LISP_FEATURE_GCC_TLS - current_thread = th; -# else - pthread_setspecific(specials, th); -# endif -#endif + ASSIGN_CURRENT_THREAD(th); #if defined THREADS_USING_GCSIGNAL && \ (defined LISP_FEATURE_PPC || defined LISP_FEATURE_PPC64 || defined LISP_FEATURE_ARM64 || defined LISP_FEATURE_RISCV) /* SIG_STOP_FOR_GC defaults to blocked on PPC? */ @@ -375,11 +390,7 @@ init_new_thread(struct thread *th, { int lock_ret; -#ifdef LISP_FEATURE_GCC_TLS - current_thread = th; -#else - pthread_setspecific(specials, th); -#endif + ASSIGN_CURRENT_THREAD(th); if(arch_os_thread_init(th)==0) { /* FIXME: handle error */ lose("arch_os_thread_init failed"); @@ -509,11 +520,7 @@ unregister_thread(struct thread *th, * Can anything else go wrong with other signals? Nothing else should * direct signals specifically to this thread. Per-process signals are ok * because the kernel picks a thread in which a signal isn't blocked */ -#ifdef LISP_FEATURE_GCC_TLS - current_thread = NULL; -#else - pthread_setspecific(specials, NULL); -#endif + ASSIGN_CURRENT_THREAD(NULL); } /* this is the first thing that runs in the child (which is why the diff --git a/src/runtime/thread.h b/src/runtime/thread.h index abed9463ff..a1494d4e32 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -190,7 +190,7 @@ static inline lispobj FdefnFun(lispobj fdefn) // FIXME: these names should be consistent with one another # ifdef LISP_FEATURE_GCC_TLS extern __thread struct thread *current_thread; -# else +# elif !defined LISP_FEATURE_WIN32 extern pthread_key_t specials; #endif #endif @@ -258,6 +258,10 @@ static inline struct thread *arch_os_get_current_thread(void) __asm__ volatile ("movl %%fs:0xE10+(4*63), %0" : "=r"(me) :); return me; +#elif defined LISP_FEATURE_WIN32 + struct pthread_thread* pthread = TlsGetValue(thread_self_tls_index); + return pthread ? pthread->vm_thread : 0; + #else # if defined(LISP_FEATURE_X86) @@ -294,6 +298,8 @@ inline static int lisp_thread_p(os_context_t __attribute__((unused)) *context) { #ifdef LISP_FEATURE_SB_THREAD # ifdef LISP_FEATURE_GCC_TLS return current_thread != 0; +# elif defined LISP_FEATURE_WIN32 + return TlsGetValue(thread_self_tls_index) != 0; # else return pthread_getspecific(specials) != NULL; # endif diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index b597eed9bc..94103a7cdd 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -188,6 +188,9 @@ Lstack: #ifdef LISP_FEATURE_GCC_TLS movq GNAME(current_thread)@GOTTPOFF(%rip), THREAD_BASE_REG movq %fs:(THREAD_BASE_REG), THREAD_BASE_REG +#elif defined LISP_FEATURE_WIN32 + call PIC_CALL(GNAME(get_current_vm_thread)) + mov %rax, THREAD_BASE_REG #else LOAD_PIC_VAR(specials, %rdi) call PIC_CALL(GNAME(pthread_getspecific)) From e0fa58d06ea5368fd1f920dcab2ffa493c132f85 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 04:53:45 -0400 Subject: [PATCH 0385/4023] win32: remove pthread attributes --- src/runtime/pthreads_win32.c | 31 +++---------------------------- src/runtime/pthreads_win32.h | 11 ++--------- src/runtime/thread.c | 7 ++++++- 3 files changed, 11 insertions(+), 38 deletions(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index d4247dc352..479661f63c 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -94,31 +94,6 @@ static void freelist_return(struct freelist *fl, void*data) pthread_mutex_unlock(&fl->lock); } -int pthread_attr_init(pthread_attr_t *attr) -{ - attr->stack_size = 0; - return 0; -} - -int pthread_attr_destroy(pthread_attr_t *attr) -{ - return 0; -} - -int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize) -{ - fprintf(stderr, "pthread_attr_setstack called\n"); - ExitProcess(1); - return 0; -} - -int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize) -{ - attr->stack_size = stacksize; - return 0; -} - - typedef unsigned char boolean; /* TLS management internals */ @@ -209,7 +184,7 @@ int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact) return 0; } -int pthread_create(pthread_t *thread, const pthread_attr_t *attr, +int pthread_create(pthread_t *thread, void *dummy, void *(*start_routine) (void *), void *arg) { pthread_t pth = (pthread_t)calloc(sizeof(pthread_thread),1); @@ -217,8 +192,8 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr, int i; HANDLE createdThread = NULL; - - createdThread = CreateThread(NULL, attr ? attr->stack_size : 0, + extern size_t thread_control_stack_size; + createdThread = CreateThread(NULL, thread_control_stack_size, Thread_Function, pth, CREATE_SUSPENDED, NULL); if (!createdThread) return 1; pth->handle = createdThread; diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index ad375a6016..e508769fbd 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -63,21 +63,14 @@ void pthreads_win32_init(); typedef struct pthread_thread* pthread_t; -typedef struct pthread_attr_t { - unsigned int stack_size; -} pthread_attr_t; - -int pthread_attr_init(pthread_attr_t *attr); -int pthread_attr_destroy(pthread_attr_t *attr); -int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize); -int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); +typedef int pthread_attr_t; /* arbitrary */ typedef void (*pthread_cleanup_fn)(void* arg); #define pthread_cleanup_push(fn, arg) { pthread_cleanup_fn __pthread_fn = fn; void *__pthread_arg = arg; #define pthread_cleanup_pop(execute) if (execute) __pthread_fn(__pthread_arg); } -int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); +int pthread_create(pthread_t *thread, void *attr, void *(*start_routine) (void *), void *arg); int pthread_equal(pthread_t thread1, pthread_t thread2); int pthread_detach(pthread_t thread); int pthread_join(pthread_t thread, void **retval); diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 845fbdb807..9a58d3cdf2 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -1065,10 +1065,15 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { #ifdef LISP_FEATURE_SB_THREAD +#ifdef LISP_FEATURE_WIN32 +#define pthread_attr_init(dummy) (0) +#define pthread_attr_destroy(dummy) +#else #ifndef __USE_XOPEN2K extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, size_t __stacksize); #endif +#endif #ifndef LISP_FEATURE_PAUSELESS_THREADSTART @@ -1102,7 +1107,7 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) #else # ifdef LISP_FEATURE_WIN32 - pthread_attr_setstacksize(&attr, thread_control_stack_size) || + /* do nothing */ # elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) pthread_attr_setstack(&attr, th->control_stack_start, thread_control_stack_size) || # else From b0d5460df1cf284de962fd5fac17f5721915fcba Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 05:31:06 -0400 Subject: [PATCH 0386/4023] win32: remove unused variables --- src/runtime/pthreads_win32.c | 8 ++------ src/runtime/thread.c | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index 479661f63c..325cedf8c0 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -147,7 +147,7 @@ DWORD WINAPI Thread_Function(LPVOID param) self->teb = NtCurrentTeb(); - pthread_t prev = tls_impersonate(self); + tls_impersonate(self); void* arg = self->arg; pthread_fn fn = self->start_routine; @@ -189,7 +189,6 @@ int pthread_create(pthread_t *thread, void *dummy, { pthread_t pth = (pthread_t)calloc(sizeof(pthread_thread),1); pthread_t self = pthread_self(); - int i; HANDLE createdThread = NULL; extern size_t thread_control_stack_size; @@ -895,7 +894,6 @@ int sigismember(const sigset_t *set, int signum) } int sigpending(sigset_t *set) { - int i; *set = InterlockedCompareExchange((volatile LONG*)&pthread_self()->pending_signal_set, 0, 0); return 0; @@ -914,7 +912,7 @@ futex_wait(volatile intptr_t *lock_word, intptr_t oldval, long sec, unsigned lon DWORD msec = sec<0 ? INFINITE : (sec*1000 + usec/1000); DWORD wfso; int result; - sigset_t pendset, blocked; + sigset_t pendset; int maybeINTR; int info = sec<0 ? WAKEUP_WAITING_NOTIMEOUT: WAKEUP_WAITING_TIMEOUT; @@ -961,7 +959,6 @@ int futex_wake(volatile intptr_t *lock_word, int n) { pthread_cond_t *cv = &futex_pseudo_cond; - int result = 0; struct thread_wakeup *w, *prev; HANDLE postponed[128]; int npostponed = 0,i; @@ -972,7 +969,6 @@ futex_wake(volatile intptr_t *lock_word, int n) for (w = cv->first_wakeup, prev = NULL; w && n;) { if (w->uaddr == lock_word) { HANDLE event = w->event; - int oldinfo = w->info; w->info = WAKEUP_HAPPENED; if (cv->last_wakeup == w) cv->last_wakeup = prev; diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 9a58d3cdf2..2cada853c4 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -202,7 +202,7 @@ int sb_GetTID() { return syscall(SYS_gettid); } // Only a single 'attributes' object is used if #+pauseless-threadstart. // This is ok because creation is synchronized by *MAKE-THREAD-LOCK*. -#ifdef LISP_FEATURE_SB_THREAD +#if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_WIN32 pthread_attr_t new_lisp_thread_attr; #define init_shared_attr_object() (pthread_attr_init(&new_lisp_thread_attr)==0) #else From f00290d13ff07bb5b7a311f9ddbb6f0c8f81c6c2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 06:10:31 -0400 Subject: [PATCH 0387/4023] win32: remove more thread-related garbage Don't model the run state or implement join or detach. SB-THREAD:JOIN-THREAD is its own thing using a Lisp semaphore, not pthread_join(), and OS threads are freed automatically when the last handle is closed, so that's easy. And this fixes a memory leak. There was no free() to match the calloc() of 'struct pthread_thread', The only free() call pertained to foreign threads there were "noticed" and then "unnoticed". --- src/runtime/pthreads_win32.c | 64 +++++------------------------------- src/runtime/pthreads_win32.h | 12 ------- src/runtime/thread.c | 17 +++++++--- 3 files changed, 21 insertions(+), 72 deletions(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index 325cedf8c0..da6ac99baa 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -129,20 +129,12 @@ pthread_t pthread_self() return (pthread_t)TlsGetValue(thread_self_tls_index); } -const char * state_to_str(pthread_thread_state state) -{ - switch (state) { - case pthread_state_running: return "running"; - case pthread_state_finished: return "finished"; - case pthread_state_joined: return "joined"; - default: return "unknown"; - } -} - /* Thread function for [pthread_create]d threads. */ DWORD WINAPI Thread_Function(LPVOID param) { + extern void free_thread_struct(struct thread *); + pthread_t self = (pthread_t) param; self->teb = NtCurrentTeb(); @@ -150,21 +142,14 @@ DWORD WINAPI Thread_Function(LPVOID param) tls_impersonate(self); void* arg = self->arg; pthread_fn fn = self->start_routine; - - self->retval = fn(arg); - pthread_mutex_lock(&self->lock); - self->state = pthread_state_finished; - pthread_cond_broadcast(&self->cond); - while (!self->detached && self->state != pthread_state_joined) { - pthread_cond_wait(&self->cond, &self->lock); - } - pthread_mutex_unlock(&self->lock); - pthread_mutex_destroy(&self->lock); - pthread_cond_destroy(&self->cond); + void * vm_thread = fn(arg); + // self->vm_thread was set to null (turning this into a non-lisp thread), + // but the thread function returned the address of the memory to free. + free_thread_struct(vm_thread); if (self->cv_event) CloseHandle(self->cv_event); - - CloseHandle(self->handle); - + HANDLE h = self->handle; + free(self); + CloseHandle(h); return 0; } @@ -204,10 +189,6 @@ int pthread_create(pthread_t *thread, void *dummy, } else { sigemptyset(&pth->blocked_signal_set); } - pth->state = pthread_state_running; - pthread_mutex_init(&pth->lock, NULL); - pthread_cond_init(&pth->cond, NULL); - pth->detached = 0; if (thread) *thread = pth; ResumeThread(createdThread); return 0; @@ -218,30 +199,6 @@ int pthread_equal(pthread_t thread1, pthread_t thread2) return thread1 == thread2; } -int pthread_detach(pthread_t thread) -{ - int retval = 0; - pthread_mutex_lock(&thread->lock); - thread->detached = 1; - pthread_cond_broadcast(&thread->cond); - pthread_mutex_unlock(&thread->lock); - return retval; -} - -int pthread_join(pthread_t thread, void **retval) -{ - pthread_mutex_lock(&thread->lock); - while (thread->state != pthread_state_finished) { - pthread_cond_wait(&thread->cond, &thread->lock); - } - thread->state = pthread_state_joined; - pthread_cond_broadcast(&thread->cond); - if (retval) - *retval = thread->retval; - pthread_mutex_unlock(&thread->lock); - return 0; -} - /* TODO call signal handlers */ int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset) { @@ -833,7 +790,6 @@ VOID CALLBACK pthreads_win32_unnotice(void* parameter, BOOLEAN timerOrWait) UnregisterWait(pth->wait_handle); tls_impersonate(self); - pthread_mutex_destroy(&pth->lock); free(pth); } @@ -842,8 +798,6 @@ int pthread_np_notice_thread() if (!pthread_self()) { pthread_t pth = (pthread_t)calloc(sizeof(pthread_thread),1); pth->teb = NtCurrentTeb(); - pthread_mutex_init(&pth->lock,NULL); - pth->state = pthread_state_running; sigemptyset(&pth->blocked_signal_set); diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index e508769fbd..8fb9a549c4 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -174,12 +174,6 @@ void pthread_unlock_structures(); typedef void *(*pthread_fn)(void*); -typedef enum { - pthread_state_running, - pthread_state_finished, - pthread_state_joined -} pthread_thread_state; - typedef struct pthread_thread { pthread_fn start_routine; void* arg; @@ -189,12 +183,6 @@ typedef struct pthread_thread { void *futex_wakeup; sigset_t blocked_signal_set; volatile sigset_t pending_signal_set; - void * retval; - - pthread_mutex_t lock; - pthread_cond_t cond; - int detached; - pthread_thread_state state; /* For noticed foreign threads, wait_handle contains a result of RegisterWaitForSingleObject. */ diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 2cada853c4..f54ced4907 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -567,7 +567,7 @@ void* new_thread_trampoline(void* arg) // - that the pinning mechanism works as designed, and not just by accident. // - that the initial stack does not contain a lisp pointer after it is not needed. // (a regression test asserts that not even a THREAD instance is on the stack) - long result = funcall1(startfun, (lispobj)lispthread); // both pinned + funcall1(startfun, (lispobj)lispthread); // both pinned // Close the GC region and unlink from all_threads unregister_thread(th, 0); @@ -575,7 +575,6 @@ void* new_thread_trampoline(void* arg) struct thread *th = (struct thread *)arg; th->os_kernel_tid = sb_GetTID(); - int result; init_thread_data scribble; FSHOW((stderr,"/creating thread %p\n", thread_self())); @@ -589,16 +588,24 @@ void* new_thread_trampoline(void* arg) init_new_thread(th, &scribble, GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK, 0); - result = funcall0(function); + funcall0(function); unregister_thread(th, &scribble); -#ifndef LISP_FEATURE_OS_THREAD_STACK + // OS_THREAD_STACK means we start on the OS-provided stack + // but switch to our chosen stack. + // win32 doesn't do that - it stays on the OS-provided stack + // and all cleanup is automatic +#if !defined LISP_FEATURE_OS_THREAD_STACK && !defined LISP_FEATURE_WIN32 schedule_thread_post_mortem(th); #endif #endif FSHOW((stderr,"/exiting thread %p\n", thread_self())); - return (void*)(uintptr_t)result; +#ifdef LISP_FEATURE_WIN32 + return arg; +#else + return 0; // keep people honest - result is unused +#endif } #ifdef LISP_FEATURE_OS_THREAD_STACK From 4701e5270f3155ba2b08d45364e55094e9d6907a Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 12 Aug 2020 15:50:53 +0300 Subject: [PATCH 0388/4023] Tests: change some :fails-on/skipped-on --- tests/fcb-threads.impure.lisp | 2 +- tests/stream.pure.lisp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index bb21ccd763..586fe2a524 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -97,7 +97,7 @@ (sb-thread:join-thread thr)))) (with-test (:name :call-me-from-many-threads-and-gc - :skipped-on :interpreter) + :skipped-on (or :interpreter :win32)) ;; two trials, 5 threads, 40 calls each (f 2 5 40) ;; one trial, 10 threads, 10 calls diff --git a/tests/stream.pure.lisp b/tests/stream.pure.lisp index a673e70904..202f73e9c9 100644 --- a/tests/stream.pure.lisp +++ b/tests/stream.pure.lisp @@ -372,7 +372,7 @@ ;;; immediately be completely filled for normal files, and that the ;;; buffer-fill routine is responsible for figuring out when we've ;;; reached EOF. -(with-test (:name (stream :listen-vs-select) :fails-on :win32) +(with-test (:name (stream :listen-vs-select)) (let ((listen-testfile-name (scratch-file-name)) ;; If non-NIL, size (in bytes) of the file that will exercise ;; the LISTEN problem. From 81054bcc887905a00a5575089a52cac6133953cf Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 12:13:55 -0400 Subject: [PATCH 0389/4023] Split fcb-threads test file into two --- tests/exit-hang.impure.lisp | 63 +++++++++++++++++++++++++++++++++++ tests/fcb-threads.impure.lisp | 49 +-------------------------- 2 files changed, 64 insertions(+), 48 deletions(-) create mode 100644 tests/exit-hang.impure.lisp diff --git a/tests/exit-hang.impure.lisp b/tests/exit-hang.impure.lisp new file mode 100644 index 0000000000..74bd2893f5 --- /dev/null +++ b/tests/exit-hang.impure.lisp @@ -0,0 +1,63 @@ +#+(or (not sb-thread) win32) (sb-ext:exit :code 104) + +;;; This uses the same C source file as fcb-threads. +;;; This is OK in the parallel test runner because WITH-SCRATCH-FILE +;;; includes the PID in the temp file name. +(if (probe-file "fcb-threads.so") + ;; Assume the test automator built this for us + (load-shared-object (truename "fcb-threads.so")) + ;; Otherwise, write into /tmp so that we never fail to rebuild + ;; the '.so' if it gets changed, and assume that it's OK to + ;; delete a mapped file (which it is for *nix). + (with-scratch-file (solib "so") + (sb-ext:run-program "/bin/sh" + `("run-compiler.sh" "-sbcl-pic" "-sbcl-shared" + "-o" ,solib "fcb-threads.c")) + (sb-alien:load-shared-object solib))) + +;;; Final test: EXIT does not lock up due to (simulated) C++ destructors +;;; or free() or most anything else involved in stopping the main thread. +;;; The point of the test is to mock a Lisp thread that uses foreign code +;;; that uses malloc and free or equivalent from C++. +;;; The behavior being tested is the effect of SB-THREAD:ABORT-THREAD on +;;; a thread that happened to be just at that moment in the foreign code. +;;; We can't - or don't need to - exactly replicate the behavior +;;; of doing a lot of memory allocation. All we need to demonstrate is +;;; that we won't interrupt a malloc() or free(). +(defglobal *should-i-keep-going* t) +(defun mess-around-with-foreign-calls () + ;; In reality the thread would not permanently own the lock, but this is the + ;; simplest way to simulate the random occurrence that it does own the lock + ;; exactly when terminated. + ;; So make it own the lock forever unless politely (i.e. not forcibly) terminated. + (alien-funcall (extern-alien "acquire_a_global_lock" (function void))) + (loop (sb-thread:barrier (:read)) + (unless *should-i-keep-going* (return)) + (sleep .75)) + (format *error-output* "~&Worker thread politely exiting~%") + (alien-funcall (extern-alien "release_a_global_lock" (function void)))) + +(sb-thread:make-thread #'mess-around-with-foreign-calls) + +(push (compile nil + '(lambda () + (format t "~&Invoked exit hook~%") + (setq *should-i-keep-going* nil))) + *exit-hooks*) + +;;; The actual code under test involved C++ destructors that are +;;; interposed between our call to OS-EXIT and the OS call per se. +;;; Acquiring a globally shared mutex in OS-EXIT simulates that. +(sb-int:encapsulate + 'sb-sys:os-exit + 'simulate-c++-destructors + (lambda (realfun code &key abort) + (format t "~&Enter OS-EXIT ~s ~s~%" code abort) + (alien-funcall (extern-alien "acquire_a_global_lock" (function void))) + (alien-funcall (extern-alien "release_a_global_lock" (function void))) + (funcall realfun code :abort abort))) + +;;; Give ourselves 3 seconds to exit. +(alien-funcall (extern-alien "prepare_exit_test" (function void int)) 3) +(setq sb-ext:*forcibly-terminate-threads-on-exit* nil) +(exit :code 104) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 586fe2a524..80d94e8e81 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -103,8 +103,7 @@ ;; one trial, 10 threads, 10 calls (f 1 10 10)) -;;; The rest of the tests can't run because one wants to use pthread_create -;;; and the other wants to use sigaction. +;;; The next test hasn't been made to run on windows, but should. #+win32 (exit :code 104) ;;; Check that you get an error trying to join a foreign thread @@ -145,49 +144,3 @@ (with-test (:name :try-join-foreign-thread) (assert (eq (tryjoiner) 'ok))) -;;; Final test: EXIT does not lock up due to (simulated) C++ destructors -;;; or free() or most anything else involved in stopping the main thread. -;;; The point of the test is to mock a Lisp thread that uses foreign code -;;; that uses malloc and free or equivalent from C++. -;;; The behavior being tested is the effect of SB-THREAD:ABORT-THREAD on -;;; a thread that happened to be just at that moment in the foreign code. -;;; We can't - or don't need to - exactly replicate the behavior -;;; of doing a lot of memory allocation. All we need to demonstrate is -;;; that we won't interrupt a malloc() or free(). -(defglobal *should-i-keep-going* t) -(defun mess-around-with-foreign-calls () - ;; In reality the thread would not permanently own the lock, but this is the - ;; simplest way to simulate the random occurrence that it does own the lock - ;; exactly when terminated. - ;; So make it own the lock forever unless politely (i.e. not forcibly) terminated. - (alien-funcall (extern-alien "acquire_a_global_lock" (function void))) - (loop (sb-thread:barrier (:read)) - (unless *should-i-keep-going* (return)) - (sleep .75)) - (format *error-output* "~&Worker thread politely exiting~%") - (alien-funcall (extern-alien "release_a_global_lock" (function void)))) - -(sb-thread:make-thread #'mess-around-with-foreign-calls) - -(push (compile nil - '(lambda () - (format t "~&Invoked exit hook~%") - (setq *should-i-keep-going* nil))) - *exit-hooks*) - -;;; The actual code under test involved C++ destructors that are -;;; interposed between our call to OS-EXIT and the OS call per se. -;;; Acquiring a globally shared mutex in OS-EXIT simulates that. -(sb-int:encapsulate - 'sb-sys:os-exit - 'simulate-c++-destructors - (lambda (realfun code &key abort) - (format t "~&Enter OS-EXIT ~s ~s~%" code abort) - (alien-funcall (extern-alien "acquire_a_global_lock" (function void))) - (alien-funcall (extern-alien "release_a_global_lock" (function void))) - (funcall realfun code :abort abort))) - -;;; Give ourselves 3 seconds to exit. -(alien-funcall (extern-alien "prepare_exit_test" (function void int)) 3) -(setq sb-ext:*forcibly-terminate-threads-on-exit* nil) -(exit :code 104) From ee00b7ccffb335279a233d6612e151275bb2faa9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 12 Aug 2020 12:26:22 -0400 Subject: [PATCH 0390/4023] Sort of work around Darwin problem in fcb-threads Try both sigwait() and sigsuspend(), the latter of which delivers the signal. So based on a new thread-local hack flag, the signal is ignored. Now the test usually prints a note that it applied that workaround, but instead it might hang. I have a feeling that the OS issue is that the signal becomes unpending by magic before the sigsuspend(). Also add a less stressful "smoke test" that runs without a background GCing thread. This test worked for me on win32 as well. --- src/runtime/interrupt.c | 13 +++++++++++++ src/runtime/thread.c | 18 ++++++++++++++++++ tests/fcb-threads.impure.lisp | 32 +++++++++++++++++++++++--------- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 4948c8b6cb..edd9a4600a 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -178,12 +178,25 @@ static void sigmask_logandc(sigset_t *dest, const sigset_t *source) * work for SIGSEGV and similar. It is good enough for timers, and * maybe all deferrables. */ +#ifdef LISP_FEATURE_DARWIN +pthread_key_t sigwait_bug_mitigation; +int sigwait_bug_mitigation_count; +#endif + #ifdef LISP_FEATURE_WIN32 #define resignal_to_lisp_thread(dummy1,dummy2) {} #else static void resignal_to_lisp_thread(int signal, os_context_t *context) { +#ifdef LISP_FEATURE_DARWIN + if (signal == SIG_STOP_FOR_GC && pthread_getspecific(sigwait_bug_mitigation)) { + // fprintf(stderr, "ignored a STOP_FOR_GC signal\n"); + __sync_fetch_and_add(&sigwait_bug_mitigation_count, 1); + pthread_setspecific(sigwait_bug_mitigation, 0); + return; + } +#endif if (!sigismember(&deferrable_sigset,signal)) { corruption_warning_and_maybe_lose #ifdef LISP_FEATURE_SB_THREAD diff --git a/src/runtime/thread.c b/src/runtime/thread.c index f54ced4907..e3e23bd765 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -231,6 +231,10 @@ void* get_current_vm_thread() { } #endif +#ifdef LISP_FEATURE_DARWIN + extern pthread_key_t sigwait_bug_mitigation; +#endif + void create_main_lisp_thread(lispobj function) { struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER_WIDETAG); if (!th || arch_os_thread_init(th)==0 || !init_shared_attr_object()) @@ -238,6 +242,9 @@ void create_main_lisp_thread(lispobj function) { #if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_GCC_TLS && !defined LISP_FEATURE_WIN32 pthread_key_create(&specials, 0); #endif +#ifdef LISP_FEATURE_DARWIN + pthread_key_create(&sigwait_bug_mitigation, 0); +#endif #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) lispobj *args = NULL; #endif @@ -751,6 +758,17 @@ detach_os_thread(init_thread_data *scribble) int sig, rc; rc = sigwait(&gc_sigset, &sig); gc_assert(rc == 0 && sig == SIG_STOP_FOR_GC); +#ifdef LISP_FEATURE_DARWIN + sigpending(&pending); + if (sigismember(&pending, SIG_STOP_FOR_GC)) { + // fprintf(stderr, "Trying sigwait bug mitigation\n"); + pthread_setspecific(sigwait_bug_mitigation, (void*)1); + sigfillset(&pending); + sigdelset(&pending, SIG_STOP_FOR_GC); + sigsuspend(&pending); + // fprintf(stderr, "Back from sigsuspend\n"); + } +#endif } #endif put_recyclebin_item(th); diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 80d94e8e81..f8d9ef3604 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -74,34 +74,48 @@ (defglobal *keepon* t) (defglobal *n-gcs* 0) -(defun f (n-trials n-threads n-calls) +(defun f (n-trials n-threads n-calls enable-gcing) (setq *n-gcs* 0) (let ((thr - (sb-thread:make-thread - (lambda() - (loop + (when enable-gcing + (sb-thread:make-thread + (lambda() + (loop (gc) (incf *n-gcs*) (sleep .0001) (sb-thread:barrier (:read)) - (if (not *keepon*) (return))))))) + (if (not *keepon*) (return)))))))) (dotimes (i n-trials) (setq *keepon* t) (with-alien ((testfun (function int system-area-pointer int int) :extern "call_thing_from_threads")) (assert (eql (alien-funcall testfun (alien-sap testcb) n-threads n-calls) 1))) - (format t "GC'd ~d times~%" *n-gcs*) (setq *keepon* nil) (sb-thread:barrier (:write)) - (sb-thread:join-thread thr)))) + #+darwin + (with-alien ((count int :extern "sigwait_bug_mitigation_count")) + (when (plusp count) + (format t "Bug mitigation strategy applied ~D time~:P~%" count) + (setf count 0))) + (when thr + (sb-thread:join-thread thr) + (format t "GC'd ~d times~%" *n-gcs*))))) + +(with-test (:name :call-me-from-1-thread-no-gc + :skipped-on (or :interpreter)) + ;; smoke test and no GCing + (setq *print-greetings-and-salutations* t) + (f 1 1 1 nil) + (setq *print-greetings-and-salutations* nil)) (with-test (:name :call-me-from-many-threads-and-gc :skipped-on (or :interpreter :win32)) ;; two trials, 5 threads, 40 calls each - (f 2 5 40) + (f 2 5 40 t) ;; one trial, 10 threads, 10 calls - (f 1 10 10)) + (f 1 10 10 t)) ;;; The next test hasn't been made to run on windows, but should. #+win32 (exit :code 104) From 37c8ebc9c0e8aaf60f39a2eb923a3fa73eea9f5a Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 13 Aug 2020 22:59:40 +0300 Subject: [PATCH 0391/4023] Fix pthreads_win32_unnotice. --- src/runtime/pthreads_win32.c | 14 +++++--------- tests/fcb-threads.impure.lisp | 2 +- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index da6ac99baa..e5a0c413a4 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -100,10 +100,8 @@ typedef unsigned char boolean; DWORD thread_self_tls_index; -static pthread_t tls_impersonate(pthread_t other) { - pthread_t old = pthread_self(); - TlsSetValue(thread_self_tls_index,other); - return old; +void set_thread_self(pthread_t thread) { + TlsSetValue(thread_self_tls_index, thread); } /* Thread identity, as much as pthreads are concerned, is determined @@ -139,7 +137,7 @@ DWORD WINAPI Thread_Function(LPVOID param) self->teb = NtCurrentTeb(); - tls_impersonate(self); + set_thread_self(self); void* arg = self->arg; pthread_fn fn = self->start_routine; void * vm_thread = fn(arg); @@ -782,14 +780,12 @@ static VOID CALLBACK pthreads_win32_unnotice(void* parameter, BOOLEAN timerOrWait) { pthread_t pth = parameter; - pthread_t self = tls_impersonate(pth); - if (self->cv_event) CloseHandle(self->cv_event); + if (pth->cv_event) CloseHandle(pth->cv_event); CloseHandle(pth->handle); UnregisterWait(pth->wait_handle); - tls_impersonate(self); free(pth); } @@ -804,7 +800,7 @@ int pthread_np_notice_thread() DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &pth->handle, 0, TRUE, DUPLICATE_SAME_ACCESS); - tls_impersonate(pth); + set_thread_self(pth); RegisterWaitForSingleObject(&pth->wait_handle, pth->handle, diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index f8d9ef3604..5971b971b8 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -111,7 +111,7 @@ (setq *print-greetings-and-salutations* nil)) (with-test (:name :call-me-from-many-threads-and-gc - :skipped-on (or :interpreter :win32)) + :skipped-on :interpreter) ;; two trials, 5 threads, 40 calls each (f 2 5 40 t) ;; one trial, 10 threads, 10 calls From 1ef7ce9a821f46799efaa083193d88b09376c2d6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 14 Aug 2020 00:14:21 +0300 Subject: [PATCH 0392/4023] Enable a test on win32. --- tests/external-format.impure.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/external-format.impure.lisp b/tests/external-format.impure.lisp index d422b4000d..32904fb247 100644 --- a/tests/external-format.impure.lisp +++ b/tests/external-format.impure.lisp @@ -1014,7 +1014,7 @@ (with-open-file (s *test-path* :external-format :utf-32be) (assert (string= " ???? " (read-line s)))))) -(with-test (:name :invalid-external-format :fails-on :win32) +(with-test (:name :invalid-external-format) (labels ((test-error (e) (assert (typep e 'error)) (unless (equal "Undefined external-format: :BAD-FORMAT" @@ -1023,7 +1023,7 @@ (test (direction) (test-error (handler-case - (open "/dev/null" :direction direction :external-format :bad-format + (open #-win32 "/dev/null" #+win32 "nul" :direction direction :external-format :bad-format :if-exists :overwrite) (error (e) e))))) (test :input) From 2207b2e0cc9d781cc857651be9996d8a1befe2d1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 13 Aug 2020 17:30:47 -0400 Subject: [PATCH 0393/4023] Improve fcb-threads test - Fix (and show) C compiler warnings - Make it still more stressful --- tests/fcb-threads.c | 3 ++- tests/fcb-threads.impure.lisp | 22 ++++++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/tests/fcb-threads.c b/tests/fcb-threads.c index 713d9d12ed..56777bd171 100644 --- a/tests/fcb-threads.c +++ b/tests/fcb-threads.c @@ -11,6 +11,7 @@ #endif #include #include +#include struct thread_arg { void * funkyfun; int index; int n_calls; }; @@ -37,7 +38,7 @@ void* doThatThing(void* void_arg) int answer = lispfun(salutation, arg->index + i); if (answer != (arg->index + i) * strlen(salutation)) thread_result = 0; } - return thread_result; + return (void*)(uintptr_t)thread_result; } int call_thing_from_threads(void* ptr, int n_threads, int n_calls) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 5971b971b8..14a1a679a6 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -34,7 +34,8 @@ (with-scratch-file (solib "so") (sb-ext:run-program "/bin/sh" `("run-compiler.sh" "-sbcl-pic" "-sbcl-shared" - "-o" ,solib "fcb-threads.c")) + "-o" ,solib "fcb-threads.c") + :output t :error :output) (sb-alien:load-shared-object solib))) (defglobal *counter* 0) @@ -75,8 +76,9 @@ (defglobal *n-gcs* 0) (defun f (n-trials n-threads n-calls enable-gcing) - (setq *n-gcs* 0) - (let ((thr + (dotimes (trialno n-trials) + (setq *n-gcs* 0) + (let ((gc-thr (when enable-gcing (sb-thread:make-thread (lambda() @@ -86,7 +88,6 @@ (sleep .0001) (sb-thread:barrier (:read)) (if (not *keepon*) (return)))))))) - (dotimes (i n-trials) (setq *keepon* t) (with-alien ((testfun (function int system-area-pointer int int) :extern "call_thing_from_threads")) @@ -99,9 +100,9 @@ (when (plusp count) (format t "Bug mitigation strategy applied ~D time~:P~%" count) (setf count 0))) - (when thr - (sb-thread:join-thread thr) - (format t "GC'd ~d times~%" *n-gcs*))))) + (when gc-thr + (sb-thread:join-thread gc-thr) + (format t "Trial ~d: GC'd ~d times~%" (1+ trialno) *n-gcs*))))) (with-test (:name :call-me-from-1-thread-no-gc :skipped-on (or :interpreter)) @@ -115,7 +116,12 @@ ;; two trials, 5 threads, 40 calls each (f 2 5 40 t) ;; one trial, 10 threads, 10 calls - (f 1 10 10 t)) + (f 1 10 10 t) + ;; Crank the number of trials up if you're trying to investigate + ;; flakes in this test. The larger number of calls is usually + ;; what gets it to fail. + ;; 5 trials, 5 threads, 200 calls each + (f 5 5 200 t)) ;;; The next test hasn't been made to run on windows, but should. #+win32 (exit :code 104) From b6649fbab61e19eaab80255926a4d976609dd851 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 14 Aug 2020 02:27:37 +0300 Subject: [PATCH 0394/4023] fcb-threads.impure is still prone to crashing on 32-bit windows. --- tests/fcb-threads.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 14a1a679a6..e265370677 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -112,7 +112,7 @@ (setq *print-greetings-and-salutations* nil)) (with-test (:name :call-me-from-many-threads-and-gc - :skipped-on :interpreter) + :skipped-on (or :interpreter (and :x86 :win32))) ;; two trials, 5 threads, 40 calls each (f 2 5 40 t) ;; one trial, 10 threads, 10 calls From 7acaddc21ea24df270b1d7e62f6d48c1dd3b30ea Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 14 Aug 2020 01:07:39 -0400 Subject: [PATCH 0395/4023] win32: remove pthread_create() shim It's especially horrible to redefine that, considering that MinGW provides the pthread APIs now. So we're just getting a half-assed implementation and relying on symbol precedence at link time. Same for all the mutex and condvar APIs. --- src/code/target-thread.lisp | 14 ++-- src/runtime/pthreads_win32.c | 47 -------------- src/runtime/pthreads_win32.h | 8 --- src/runtime/thread.c | 121 +++++++++++++++++++++-------------- src/runtime/win32-os.c | 5 +- 5 files changed, 84 insertions(+), 111 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index ab3c924122..3572a6d64b 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -2026,9 +2026,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (if created thread (error "Could not create new OS thread.")))) #+(and sb-thread (not pauseless-threadstart)) -(progn -(define-alien-routine ("create_thread" %create-thread) - unsigned (lisp-fun-address unsigned)) (defun start-thread (thread function arguments) (let* ((setup-sem (make-semaphore :name "Thread setup semaphore")) #+(or win32 darwin freebsd) @@ -2056,12 +2053,13 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; INITIAL-FUNCTION to another thread. ;; (Does WITHOUT-INTERRUPTS really matter now that it's DXed?) (with-system-mutex (*make-thread-lock*) - (if (zerop (setf (thread-os-thread thread) - (%create-thread (get-lisp-obj-address #'start-routine)))) - (setf thread nil) - (wait-on-semaphore setup-sem))))) + (with-alien ((create-thread (function unsigned unsigned) + :extern "create_thread")) + (if (eql (alien-funcall create-thread (get-lisp-obj-address #'start-routine)) + 0) + (setq thread nil) + (wait-on-semaphore setup-sem)))))) (or thread (error "Could not create a new thread."))) -) ; end PROGN (defun join-thread (thread &key (default nil defaultp) timeout) "Suspend current thread until THREAD exits. Return the result values diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index e5a0c413a4..eea45392e8 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -129,28 +129,6 @@ pthread_t pthread_self() /* Thread function for [pthread_create]d threads. */ -DWORD WINAPI Thread_Function(LPVOID param) -{ - extern void free_thread_struct(struct thread *); - - pthread_t self = (pthread_t) param; - - self->teb = NtCurrentTeb(); - - set_thread_self(self); - void* arg = self->arg; - pthread_fn fn = self->start_routine; - void * vm_thread = fn(arg); - // self->vm_thread was set to null (turning this into a non-lisp thread), - // but the thread function returned the address of the memory to free. - free_thread_struct(vm_thread); - if (self->cv_event) CloseHandle(self->cv_event); - HANDLE h = self->handle; - free(self); - CloseHandle(h); - return 0; -} - /* Signals */ struct sigaction signal_handlers[NSIG]; @@ -167,31 +145,6 @@ int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact) return 0; } -int pthread_create(pthread_t *thread, void *dummy, - void *(*start_routine) (void *), void *arg) -{ - pthread_t pth = (pthread_t)calloc(sizeof(pthread_thread),1); - pthread_t self = pthread_self(); - HANDLE createdThread = NULL; - - extern size_t thread_control_stack_size; - createdThread = CreateThread(NULL, thread_control_stack_size, - Thread_Function, pth, CREATE_SUSPENDED, NULL); - if (!createdThread) return 1; - pth->handle = createdThread; - - pth->start_routine = start_routine; - pth->arg = arg; - if (self) { - pth->blocked_signal_set = self->blocked_signal_set; - } else { - sigemptyset(&pth->blocked_signal_set); - } - if (thread) *thread = pth; - ResumeThread(createdThread); - return 0; -} - int pthread_equal(pthread_t thread1, pthread_t thread2) { return thread1 == thread2; diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index 8fb9a549c4..abea6067c1 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -67,13 +67,7 @@ typedef int pthread_attr_t; /* arbitrary */ typedef void (*pthread_cleanup_fn)(void* arg); -#define pthread_cleanup_push(fn, arg) { pthread_cleanup_fn __pthread_fn = fn; void *__pthread_arg = arg; -#define pthread_cleanup_pop(execute) if (execute) __pthread_fn(__pthread_arg); } - -int pthread_create(pthread_t *thread, void *attr, void *(*start_routine) (void *), void *arg); int pthread_equal(pthread_t thread1, pthread_t thread2); -int pthread_detach(pthread_t thread); -int pthread_join(pthread_t thread, void **retval); int pthread_kill(pthread_t thread, int signum); #ifndef PTHREAD_INTERNALS @@ -175,8 +169,6 @@ void pthread_unlock_structures(); typedef void *(*pthread_fn)(void*); typedef struct pthread_thread { - pthread_fn start_routine; - void* arg; HANDLE handle; struct thread *vm_thread; pthread_cond_t *waiting_cond; diff --git a/src/runtime/thread.c b/src/runtime/thread.c index e3e23bd765..03ff6ade7d 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -193,7 +193,9 @@ wait_for_thread_state_change(struct thread *thread, lispobj state) #endif /* sb-safepoint */ #endif /* sb-thread */ -#ifdef __linux__ +#ifdef LISP_FEATURE_WIN32 +#define sb_GetTID() GetCurrentThreadId() +#elif defined __linux__ // gettid() was added in glibc 2.30 but we support older glibc int sb_GetTID() { return syscall(SYS_gettid); } #else @@ -219,7 +221,7 @@ struct thread *alloc_thread_struct(void*,lispobj); #elif defined LISP_FEATURE_64_BIT # define ASSIGN_CURRENT_THREAD(x) \ ((struct pthread_thread*)TlsGetValue(thread_self_tls_index))->vm_thread = x -#elif defined LISP_FEATURE_WIN32 +#else # define ASSIGN_CURRENT_THREAD(x) TlsSetValue(OUR_TLS_INDEX, x) #endif @@ -303,7 +305,7 @@ void free_thread_struct(struct thread *th) #endif } -# if defined(IMMEDIATE_POST_MORTEM) +# if !defined LISP_FEATURE_WIN32 && defined IMMEDIATE_POST_MORTEM /* * If this feature is set, we are running on a stack managed by the OS, @@ -316,7 +318,7 @@ schedule_thread_post_mortem(struct thread *corpse) free_thread_struct(corpse); } -# elif !defined LISP_FEATURE_PAUSELESS_THREADSTART +# elif !defined LISP_FEATURE_WIN32 && !defined LISP_FEATURE_PAUSELESS_THREADSTART static void perform_thread_post_mortem(struct thread *post_mortem) @@ -530,15 +532,38 @@ unregister_thread(struct thread *th, ASSIGN_CURRENT_THREAD(NULL); } +#ifdef LISP_FEATURE_WIN32 +#define THREAD_TRAMPOLINE_PROLOGUE \ + extern void set_thread_self(pthread_t thread); \ + pthread_t self = (pthread_t) arg; \ + self->teb = NtCurrentTeb(); \ + set_thread_self(self); \ + struct thread* th = self->vm_thread +#define THREAD_TRAMPOLINE_EPILOGUE \ + if (self->cv_event) CloseHandle(self->cv_event); \ + free_thread_struct(th); \ + HANDLE h = self->handle; \ + free(self); \ + CloseHandle(h) +#else +#define THREAD_TRAMPOLINE_PROLOGUE \ + struct thread* th = arg +#define THREAD_TRAMPOLINE_EPILOGUE +#endif + /* this is the first thing that runs in the child (which is why the * silly calling convention). Basically it calls the user's requested * lisp function after doing arch_os_thread_init and whatever other * bookkeeping needs to be done */ +#ifdef LISP_FEATURE_WIN32 +DWORD WINAPI new_thread_trampoline(LPVOID arg) +#else void* new_thread_trampoline(void* arg) +#endif { + THREAD_TRAMPOLINE_PROLOGUE; #ifdef LISP_FEATURE_PAUSELESS_THREADSTART - struct thread* th = arg; // 'th->lisp_thread' remains valid despite not being in all_threads // due to the pinning via *STARTING-THREADS*. struct thread_instance *lispthread = (void*)native_pointer(th->lisp_thread); @@ -580,7 +605,6 @@ void* new_thread_trampoline(void* arg) #else // !PAUSELESS_THREADSTART - struct thread *th = (struct thread *)arg; th->os_kernel_tid = sb_GetTID(); init_thread_data scribble; @@ -606,13 +630,8 @@ void* new_thread_trampoline(void* arg) schedule_thread_post_mortem(th); #endif #endif - - FSHOW((stderr,"/exiting thread %p\n", thread_self())); -#ifdef LISP_FEATURE_WIN32 - return arg; -#else - return 0; // keep people honest - result is unused -#endif + THREAD_TRAMPOLINE_EPILOGUE; + return 0; } #ifdef LISP_FEATURE_OS_THREAD_STACK @@ -1090,33 +1109,61 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { #ifdef LISP_FEATURE_SB_THREAD -#ifdef LISP_FEATURE_WIN32 -#define pthread_attr_init(dummy) (0) -#define pthread_attr_destroy(dummy) -#else #ifndef __USE_XOPEN2K extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, size_t __stacksize); #endif -#endif #ifndef LISP_FEATURE_PAUSELESS_THREADSTART -/* Call pthread_create() and return 1 for success, 0 for failure */ -boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) +/* Allocate a thread structure, call pthread_create() or CreateThread(), + * and return 1 for success, 0 for failure */ +uword_t create_thread(lispobj start_routine) { + struct thread *th, *thread = arch_os_get_current_thread(); + + /* Must defend against async unwinds. */ + if (read_TLS(INTERRUPTS_ENABLED, thread) != NIL) + lose("create_thread is not safe when interrupts are enabled."); + + /* Assuming that a fresh thread struct has no lisp objects in it, + * linking it to all_threads can be left to the thread itself + * without fear of gc lossage. 'start_routine' violates this + * assumption and must stay pinned until the child starts up. */ + th = alloc_thread_struct(0, start_routine); + if (!th) return 0; + /* The new thread inherits the restrictive signal mask set here, * and enables signals again when it is set up properly. */ sigset_t oldset; - int retcode = 0; boolean success = 0; /* Blocking deferrable signals is enough, no need to block * SIG_STOP_FOR_GC because the child process is not linked onto * all_threads until it's ready. */ block_deferrable_signals(&oldset); - +#ifdef LISP_FEATURE_WIN32 + DWORD tid; + pthread_t pth = (pthread_t)calloc(sizeof(pthread_thread),1); + // Theoretically you should tell the new thread a signal mask to restore + // after it finishes any uninterruptable setup code, but the way this worked + // on windows is that we passed the mask of blocked signals in the parent + // *after* blocking deferrables. It's immaterial what mask is passed + // because the thread will unblock all deferrables, + // and we don't really have posix signals anyway. + pth->blocked_signal_set = deferrable_sigset; + pth->vm_thread = th; + pth->handle = CreateThread(NULL, thread_control_stack_size, + new_thread_trampoline, pth, 0, &tid); + success = pth->handle != NULL; + if (success) + th->os_thread = pth, th->os_kernel_tid = tid; + else + free(pth); +#else + int retcode = 0; pthread_attr_t attr; + pthread_t kid_tid; if (pthread_attr_init(&attr) == 0) { /* See perform_thread_post_mortem for at least one reason why this lock is necessary */ @@ -1128,12 +1175,10 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) if ( #ifdef LISP_FEATURE_OS_THREAD_STACK pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) || - (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline_switch_stack, th)) + (retcode = pthread_create(&kid_tid, &attr, new_thread_trampoline_switch_stack, th)) #else -# ifdef LISP_FEATURE_WIN32 - /* do nothing */ -# elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) +#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK pthread_attr_setstack(&attr, th->control_stack_start, thread_control_stack_size) || # else pthread_attr_setstack(&attr, th->alien_stack_start, ALIEN_STACK_SIZE) || @@ -1144,7 +1189,7 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) pthread_attr_setguardsize(&attr, 0) || # endif - (retcode = pthread_create(kid_tid, &attr, new_thread_trampoline, th)) + (retcode = pthread_create(&kid_tid, &attr, new_thread_trampoline, th)) #endif ) { perror("create_os_thread"); @@ -1156,30 +1201,12 @@ boolean create_os_thread(struct thread *th,os_thread_t *kid_tid) pthread_attr_destroy(&attr); } +#endif thread_sigmask(SIG_SETMASK,&oldset,0); + if (!success) free_thread_struct(th); return success; } -os_thread_t create_thread(lispobj start_routine) { - struct thread *th, *thread = arch_os_get_current_thread(); - os_thread_t kid_tid = 0; - - /* Must defend against async unwinds. */ - if (read_TLS(INTERRUPTS_ENABLED, thread) != NIL) - lose("create_thread is not safe when interrupts are enabled."); - - /* Assuming that a fresh thread struct has no lisp objects in it, - * linking it to all_threads can be left to the thread itself - * without fear of gc lossage. 'start_routine' violates this - * assumption and must stay pinned until the child starts up. */ - th = alloc_thread_struct(0, start_routine); - if (th && !create_os_thread(th, &kid_tid)) { - free_thread_struct(th); - kid_tid = 0; - } - return kid_tid; -} - #endif /* stopping the world is a two-stage process. From this thread we signal diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 92b70ef94e..ab35ae81d7 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -1712,7 +1712,10 @@ tty_maybe_initialize_unlocked(HANDLE handle) } pthread_cond_init(&ttyinput.cond_has_data,NULL); pthread_cond_init(&ttyinput.cond_has_client,NULL); - pthread_create(&ttyinput.thread,NULL,tty_read_line_server,NULL); + ttyinput.thread = CreateThread(NULL, + 0, // stack size = default + tty_read_line_server, 0, + 0, 0); ttyinput.initialized = 1; } return 1; From e21ac44bdd949c6130d03f73351d3eb40276d509 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 14 Aug 2020 16:44:30 -0400 Subject: [PATCH 0396/4023] x86: Use selected trap instruction --- src/runtime/x86-assem.S | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/runtime/x86-assem.S b/src/runtime/x86-assem.S index aad426d70e..ecb4db4d75 100644 --- a/src/runtime/x86-assem.S +++ b/src/runtime/x86-assem.S @@ -165,7 +165,11 @@ /* the CSP page sits right before the thread */ #define THREAD_SAVED_CSP_OFFSET (-N_WORD_BYTES) +#ifdef LISP_FEATURE_UD2_BREAKPOINTS +#define TRAP ud2 +#else #define TRAP int3 +#endif .text .globl GNAME(all_threads) From bd30cebe00220a436f08631d5c15efae322c7816 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 14 Aug 2020 18:51:39 -0400 Subject: [PATCH 0397/4023] Enhance traceroot --- src/code/traceroot.lisp | 26 ++++++++++++++------------ src/runtime/traceroot.c | 29 ++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/code/traceroot.lisp b/src/code/traceroot.lisp index 67cf4bba19..c4fc23c3b4 100644 --- a/src/code/traceroot.lisp +++ b/src/code/traceroot.lisp @@ -34,13 +34,6 @@ :all)) 0) -;;; Given ADDR which is a pointer to a 'struct thread' -;;; return the corresponding lisp thread. -(defun find-lisp-thread-from-thread-struct (addr) - (declare (type sb-ext:word addr)) - (sap-ref-lispobj (int-sap addr) - (ash sb-vm::thread-lisp-thread-slot sb-vm:word-shift))) - ;;; Convert each path to (TARGET . NODES) ;;; where the first node in NODES is one of: ;;; @@ -89,8 +82,9 @@ (root-kind (car root))) (if (eq root-kind 0) ; heap object (rplaca path :static) - (let* ((thread (find-lisp-thread-from-thread-struct - (ash (cadr root) sb-vm:n-fixnum-tag-bits))) + (let* ((thread (sap-ref-lispobj + (sb-int:descriptor-sap (cadr root)) + (ash sb-vm::thread-lisp-thread-slot sb-vm:word-shift))) (extra (cddr root)) (symbol (unless (eql root-kind 1) @@ -171,9 +165,11 @@ &key (:criterion (member :oldest :pseudo-static :static)) (:gc t) + (:ignore list) (:print (or boolean (eql :verbose))))) search-roots)) -(defun search-roots (weak-pointers &key (criterion :oldest) (gc nil) (print t)) +(defun search-roots (weak-pointers &key (criterion :oldest) (gc nil) + (ignore nil) (print t)) "Find roots keeping the targets of WEAK-POINTERS alive. WEAK-POINTERS must be a single SB-EXT:WEAK-POINTER or a list of those, @@ -208,6 +204,10 @@ to be considered. Possible values are: To find a root of an image-backed object, you want to stop only at a truly :STATIC object. +IGNORE is a list of objects to treat as if nonexistent in the heap. +It can often be useful for finding a path to an interned symbol other than +through its package by specifying the package as an ignored object. + PRINT controls whether discovered paths should be returned or printed. Possible values are @@ -252,7 +252,9 @@ printed. Possible values are Experimental: subject to change without prior notice." (let* ((input (ensure-list weak-pointers)) (output (make-array (length input))) - (param (cons input (cons :result output))) + (param (vector input + (if ignore (coerce ignore 'simple-vector) 0) + (cons :result output))) (criterion-value (ecase criterion (:oldest 0) (:pseudo-static 1) @@ -270,7 +272,7 @@ Experimental: subject to change without prior notice." (extern-alien "prove_liveness" (function int unsigned int)) (sb-kernel:get-lisp-obj-address param) criterion-value)))) - (case (cadr param) + (case (car (elt param 2)) (-1 (error "Input is not a proper list of weak pointers."))) (let ((paths (preprocess-traceroot-results input output))) (cond (print diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 6b66b3181e..bcd7dd62de 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -83,6 +83,7 @@ struct scan_state { // A hashmap from object to list of objects pointing to it struct hopscotch_table* inverted_heap; struct scratchpad scratchpad; + lispobj ignored_objects; int keep_leaves; }; @@ -700,6 +701,16 @@ static boolean record_ptr(lispobj* source, lispobj target, if (count_only) COUNT_POINTER(x) \ else if (is_lisp_pointer(x) && relevant_ptr_p(x)) record_ptr(where,x,ss); } +static boolean ignorep(lispobj* base_ptr, + lispobj ignored_objects) +{ + int i; + for (i = fixnum_value(VECTOR(ignored_objects)->length)-1; i >= 0; --i) + if (native_pointer(VECTOR(ignored_objects)->data[i]) == base_ptr) + return 1; + return 0; +} + static uword_t build_refs(lispobj* where, lispobj* end, struct scan_state* ss) { @@ -710,6 +721,10 @@ static uword_t build_refs(lispobj* where, lispobj* end, boolean count_only = !ss->record_ptrs; for ( ; where < end ; where += nwords ) { + if (ss->ignored_objects && ignorep(where, ss->ignored_objects)) { + nwords = OBJECT_SIZE(*where, where); + continue; + } ++n_objects; lispobj word = *where; if (!is_header(word)) { @@ -843,10 +858,12 @@ static void scan_spaces(struct scan_state* ss) #define HASH_FUNCTION HOPSCOTCH_HASH_FUN_MIX static void* compute_heap_inverse(boolean keep_leaves, + lispobj ignored_objects, struct scratchpad* scratchpad) { struct scan_state ss; memset(&ss, 0, sizeof ss); + ss.ignored_objects = ignored_objects; ss.keep_leaves = keep_leaves; if (heap_trace_verbose) fprintf(stderr, "Pass 1: Counting heap objects...\n"); scan_spaces(&ss); @@ -931,6 +948,7 @@ static boolean finding_leaf_p(lispobj weak_pointers) static int trace_paths(void (*context_scanner)(), lispobj weak_pointers, // list of inputs lispobj paths, // vector of outputs + lispobj ignore, // vector of ignored objects int n_pins, lispobj* pins, int criterion) { @@ -950,7 +968,7 @@ static int trace_paths(void (*context_scanner)(), ((i%8)==7||i==n_pins-1)?"\n":""); } inverted_heap = compute_heap_inverse(finding_leaf_p(weak_pointers), - &scratchpad); + ignore, &scratchpad); hopscotch_create(&visited, HASH_FUNCTION, 0, 32, 0); hopscotch_create(&targets, HASH_FUNCTION, 0, 32, 0); i = 0; @@ -993,9 +1011,10 @@ int gc_prove_liveness(void(*context_scanner)(), int criterion) { int n_watched = 0, n_live = 0, n_bad = 0, n_imm = 0, n_paths = 0; - lispobj input = CONS(objects)->car, - output = CONS(objects)->cdr, - paths = CONS(output)->cdr; + lispobj input = VECTOR(objects)->data[0], + ignore = VECTOR(objects)->data[1], + output = VECTOR(objects)->data[2], + paths = CONS(output)->cdr; lispobj list; for (list = input ; list != NIL && listp(list) ; list = CONS(list)->cdr) { ++n_watched; @@ -1040,7 +1059,7 @@ int gc_prove_liveness(void(*context_scanner)(), pins[i] = compute_lispobj((lispobj*)pins[i]); } } - n_paths = trace_paths(context_scanner, input, paths, + n_paths = trace_paths(context_scanner, input, paths, ignore, n_pins, (lispobj*)pins, criterion); CONS(output)->car = make_fixnum(n_paths); return n_paths; From 960a8cf14a4a803a81527546131d094dd6d9bd59 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 14 Aug 2020 21:30:41 -0400 Subject: [PATCH 0398/4023] Remove inadvertent duplicate test This was moved to its own file (hash-cache.impure) in git rev eb1370a4c1 --- tests/timer.impure.lisp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/tests/timer.impure.lisp b/tests/timer.impure.lisp index 8583f6d9bb..21519c6a2e 100644 --- a/tests/timer.impure.lisp +++ b/tests/timer.impure.lisp @@ -212,22 +212,6 @@ (mapc #'sb-thread:join-thread threads))))) (assert ok)))) -;;; FIXME: Since timeouts do not work on Windows this would loop -;;; forever. -(with-test (:name (:hash-cache :interrupt) :skipped-on :win32) - (let* ((type1 (random-type 500)) - (type2 (random-type 500)) - (wanted (subtypep type1 type2))) - (dotimes (i 100) - (block foo - (sb-ext:schedule-timer (sb-ext:make-timer - (lambda () - (assert (eq wanted (subtypep type1 type2))) - (return-from foo))) - 0.05) - (loop - (assert (eq wanted (subtypep type1 type2)))))))) - ;;; Used to hang occasionally at least on x86. Two bugs caused it: ;;; running out of stack (due to repeating timers being rescheduled ;;; before they ran) and dying threads were open interrupts. From 1bce7b7cf86947688f1de2fc73af924bd29661b5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 14 Aug 2020 21:50:21 -0400 Subject: [PATCH 0399/4023] Allow :sb-safepoint build on macOS * there are no POSIX realtime signals * a bunch of tests hang This fixes lp#1382811 though nobody should use safepoints on macOS considering how badly they work. --- src/cold/shared.lisp | 2 -- src/runtime/interrupt.c | 2 +- src/runtime/thread.c | 15 +++++++++++++-- tests/hash-cache.impure.lisp | 3 ++- tests/interface.pure.lisp | 3 ++- tests/signals.impure.lisp | 3 ++- tests/stream.impure.lisp | 3 ++- tests/timer.impure.lisp | 17 ++++++++++++++--- 8 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index a9dedffa06..12c66c3856 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -309,8 +309,6 @@ ":SB-SAFEPOINT not supported on selected architecture") ("(and sb-safepoint-strictly (not sb-safepoint))" ":SB-SAFEPOINT-STRICTLY requires :SB-SAFEPOINT") - ("(and os-thread-stack sb-safepoint)" - ":OS-THREAD-STACK and :SB-SAFEPOINT are incompatible") ("(not (or elf mach-o win32))" "No execute object file format feature defined") ("(and cons-profiling (not sb-thread))" ":CONS-PROFILING requires :SB-THREAD") diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index edd9a4600a..47d7d5c568 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1972,7 +1972,7 @@ undoably_install_low_level_interrupt_handler (int signal, #if defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) if(signal==SIG_MEMORY_FAULT) { sa.sa_flags |= SA_ONSTACK; -# ifdef LISP_FEATURE_SB_SAFEPOINT +# if defined LISP_FEATURE_SB_SAFEPOINT && !defined LISP_FEATURE_DARWIN sigaddset(&sa.sa_mask, SIGRTMIN); sigaddset(&sa.sa_mask, SIGRTMIN+1); # endif diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 03ff6ade7d..32e805b06e 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -564,6 +564,17 @@ void* new_thread_trampoline(void* arg) { THREAD_TRAMPOLINE_PROLOGUE; #ifdef LISP_FEATURE_PAUSELESS_THREADSTART +#ifdef LISP_FEATURE_SB_SAFEPOINT + init_thread_data scribble; + // This "scribble" thing is really quite pointless because the original sigset_t + // was passed in the thread's startup info (unless no signals at all were blocked). + // And when terminating, why does anyone care what the signal mask was??? + // Well, there's a big "however": '&scribble' is no mere pass-by-reference arg- + // it is actually used as an approximation of the C stack pointer. +#define SCRIBBLE &scribble +#else +#define SCRIBBLE 0 +#endif // 'th->lisp_thread' remains valid despite not being in all_threads // due to the pinning via *STARTING-THREADS*. struct thread_instance *lispthread = (void*)native_pointer(th->lisp_thread); @@ -594,14 +605,14 @@ void* new_thread_trampoline(void* arg) th->control_stack_end = (lispobj*)&arg; #endif th->os_kernel_tid = sb_GetTID(); - init_new_thread(th, 0, 0, 0); + init_new_thread(th, SCRIBBLE, 0, 0); // Passing the untagged pointer ensures 2 things: // - that the pinning mechanism works as designed, and not just by accident. // - that the initial stack does not contain a lisp pointer after it is not needed. // (a regression test asserts that not even a THREAD instance is on the stack) funcall1(startfun, (lispobj)lispthread); // both pinned // Close the GC region and unlink from all_threads - unregister_thread(th, 0); + unregister_thread(th, SCRIBBLE); #else // !PAUSELESS_THREADSTART diff --git a/tests/hash-cache.impure.lisp b/tests/hash-cache.impure.lisp index ec76c150fc..70911483b6 100644 --- a/tests/hash-cache.impure.lisp +++ b/tests/hash-cache.impure.lisp @@ -1,6 +1,7 @@ ;;; FIXME: Since timeouts do not work on Windows this would loop ;;; forever. -(with-test (:name (:hash-cache :interrupt) :skipped-on :win32) +(with-test (:name (:hash-cache :interrupt) + :skipped-on (or :win32 (:and :darwin :sb-safepoint))) (let* ((type1 (random-type 500)) (type2 (random-type 500)) (wanted (subtypep type1 type2))) diff --git a/tests/interface.pure.lisp b/tests/interface.pure.lisp index cd2d77825f..dba38a8239 100644 --- a/tests/interface.pure.lisp +++ b/tests/interface.pure.lisp @@ -108,7 +108,8 @@ :timeout))))) ;;; SLEEP should work with large integers as well -(with-test (:name (sleep :pretty-much-forever)) +(with-test (:name (sleep :pretty-much-forever) + :skipped-on (:and :darwin :sb-safepoint)) ; hangs (assert (eq :timeout (handler-case (sb-ext:with-timeout 1 diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index ef94274520..ba0df22312 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -45,7 +45,8 @@ ;; (namely SLEEP) to produce known-good arguments, and ;; even if we wanted to check argument validity, ;; integration with `errno' is not to be expected. - :skipped-on :win32) + ;; And this hangs on darwin + safepoint. + :skipped-on (or :win32 (:and :darwin :sb-safepoint))) (let* (saved-errno (returning nil) (timer (make-timer (lambda () diff --git a/tests/stream.impure.lisp b/tests/stream.impure.lisp index 4ab990a3c3..a0bd31e189 100644 --- a/tests/stream.impure.lisp +++ b/tests/stream.impure.lisp @@ -670,7 +670,8 @@ (assert (< (- (get-universal-time) time) 2))))) #-win32 -(with-test (:name (open :interrupt) :skipped-on :win32) +(with-test (:name (open :interrupt) + :skipped-on (or :win32 (:and :darwin :sb-safepoint))) (let ((to 0)) (with-scratch-file (fifo) ;; Make a FIFO diff --git a/tests/timer.impure.lisp b/tests/timer.impure.lisp index 21519c6a2e..9decd72895 100644 --- a/tests/timer.impure.lisp +++ b/tests/timer.impure.lisp @@ -59,20 +59,31 @@ time) (loop until finishedp))) -(with-test (:name (:timer :deferrables-blocked) :skipped-on :win32) +;;; This test has to be skipped darwin + thruption because if those features +;;; are present, then sb-wtimer should be too, but it can't be, because the +;;; code in 'darwin-os.c' says: +;;; # error Completely untested. Go ahead! Remove this line, try your luck! +;;; and of course it doesn't work. +;;; But win32 has wtimer so the skipped test is more than just +;;; (:and :sb-thruption (:not :sb-wtimer)) because that wouldn't +;;; explain why win32 doesn't pass. +(with-test (:name (:timer :deferrables-blocked) + :skipped-on (or :win32 (:and :darwin :sb-safepoint))) (make-and-schedule-and-wait (lambda () (check-deferrables-blocked-or-lose 0)) (random 0.1)) (check-deferrables-unblocked-or-lose 0)) -(with-test (:name (:timer :deferrables-unblocked) :skipped-on :win32) +(with-test (:name (:timer :deferrables-unblocked) + :skipped-on (or :win32 (:and :darwin :sb-safepoint))) (make-and-schedule-and-wait (lambda () (sb-sys:with-interrupts (check-deferrables-unblocked-or-lose 0))) (random 0.1)) (check-deferrables-unblocked-or-lose 0)) -(with-test (:name (:timer :deferrables-unblocked :unwind) :skipped-on :win32) +(with-test (:name (:timer :deferrables-unblocked :unwind) + :skipped-on (or :win32 (:and :darwin :sb-safepoint))) (catch 'xxx (make-and-schedule-and-wait (lambda () (check-deferrables-blocked-or-lose 0) From 120f9be3be5c1758fe2fc0cf98b4a6154f9f9051 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 14 Aug 2020 22:55:28 -0400 Subject: [PATCH 0400/4023] Enable pauseless threadstart + safepoint unless win32 It's now looking like the futex emulation in pthreads_win32 has problems. --- src/cold/shared.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 12c66c3856..b78dcc65c5 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -245,7 +245,7 @@ (arch (target-platform-keyword target-feature-list))) (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) (pushnew :futex-use-tid target-feature-list)) - (when (featurep '(:and :sb-thread (:not :sb-safepoint)) target-feature-list) + (when (featurep '(:and :sb-thread (:not :win32)) target-feature-list) (push :pauseless-threadstart target-feature-list)) (when (featurep '(:and :sb-thread (:or :darwin :openbsd)) target-feature-list) (push :os-thread-stack target-feature-list)) From fcc29a0b4d0f5afb8f4fcff40709cec1b171e589 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 15 Aug 2020 12:04:43 -0400 Subject: [PATCH 0401/4023] Don't reduce th->control_stack_end --- src/runtime/thread.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 32e805b06e..f5cca0e656 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -601,7 +601,7 @@ void* new_thread_trampoline(void* arg) // then '&arg' seems not to be ok either. I'm not sure why, because the change // of stack was already done. FIXME: find out what's going on there. #if defined LISP_FEATURE_C_STACK_IS_CONTROL_STACK && !defined ADDRESS_SANITIZER \ - && !defined LISP_FEATURE_OS_THREAD_STACK && !defined LISP_FEATURE_WIN32 + && !defined LISP_FEATURE_OS_THREAD_STACK && !defined LISP_FEATURE_SB_SAFEPOINT th->control_stack_end = (lispobj*)&arg; #endif th->os_kernel_tid = sb_GetTID(); @@ -1017,6 +1017,9 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { # ifdef LISP_FEATURE_WIN32 th->carried_base_pointer = 0; # endif + // FIXME: this looks extremely bogus if the threads run on an OS-provided stack. + // Wouldn't it make more sense to set it to 0 and leave it to init_new_thread + // to set the value? (where would the main thread get it from?) th->csp_around_foreign_call = (lispobj *)th - 1; #endif From ab409e605c93019a8943916bd9cc35cabab89c64 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 16 Aug 2020 12:17:07 -0400 Subject: [PATCH 0402/4023] Remove bogus comment, use pre-exiting idiom Git rev 495f7dfb9c assumed that all uses of GET-LISP-OBJ-ADDRESS are suspect, but that's not true if the purpose is to convert a fixnum descriptor into a SAP (which has a convenience function) --- src/code/alien-callback.lisp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index bbfca867f9..a0912022bd 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -110,11 +110,8 @@ ENTER-ALIEN-CALLBACK pulls the corresponding trampoline out and calls it.") ;; bother anyone about that sad fact (declare (muffle-conditions compiler-note) (optimize speed)) - ;; FIXME: the saps are not gc safe - (let ((args-sap (int-sap - (sb-kernel:get-lisp-obj-address args-pointer))) - (res-sap (int-sap - (sb-kernel:get-lisp-obj-address result-pointer)))) + (let ((args-sap (descriptor-sap args-pointer)) + (res-sap (descriptor-sap result-pointer))) (declare (ignorable args-sap res-sap)) (with-alien ,(loop From ea1e5067fa84443cfbdc39dc011e0f681872574b Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 16 Aug 2020 16:30:00 -0400 Subject: [PATCH 0403/4023] Accept null context in libunwind_backtrace --- src/runtime/backtrace.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 220d22df54..2583970ec3 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -660,7 +660,13 @@ void libunwind_backtrace(struct thread *th, os_context_t *context) // "unw_init_local() is thread-safe as well as safe to use from a signal handler." // "unw_get_proc_name() is thread-safe. If cursor cp is in the local address-space, // this routine is also safe to use from a signal handler." - unw_init_local(&cursor, context); + if (context) { + unw_init_local(&cursor, context); + } else { + unw_context_t here; + unw_getcontext(&here); + unw_init_local(&cursor, &here); + } do { uword_t offset; char *pc; From bac97fa8b604e0bd5e68b7f2bda68bc5bc3d1531 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 17 Aug 2020 01:44:45 +0300 Subject: [PATCH 0404/4023] timer.impure: Increase a timeout --- tests/timer.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/timer.impure.lisp b/tests/timer.impure.lisp index 9decd72895..818eb19a6b 100644 --- a/tests/timer.impure.lisp +++ b/tests/timer.impure.lisp @@ -309,7 +309,7 @@ (dolist (thread threads) (sched thread))) (loop for thread in threads - do (sb-thread:join-thread thread :timeout 20)))))) + do (sb-thread:join-thread thread :timeout 40)))))) ;; A timer with a repeat interval can be configured to "catch up" in ;; case of missed calls. From e19febc02ca56d37d95bec6ed753d1de756afeea Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 16 Aug 2020 18:45:38 -0400 Subject: [PATCH 0405/4023] Remove unused C code --- src/runtime/thread.c | 158 +------------------------------------------ 1 file changed, 2 insertions(+), 156 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index f5cca0e656..78ee284ccc 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -58,14 +58,6 @@ #include #endif -#if defined(LISP_FEATURE_WIN32) || defined(LISP_FEATURE_OS_THREAD_STACK) -# define IMMEDIATE_POST_MORTEM -#else -static __attribute__((unused)) struct thread *postmortem_thread; -#endif - -#endif - int dynamic_values_bytes = 4096 * sizeof(lispobj); // same for all threads // exposed to lisp for pthread_create if not C_STACK_IS_CONTROL_STACK os_vm_size_t thread_alien_stack_size = ALIEN_STACK_SIZE; @@ -287,15 +279,6 @@ void create_main_lisp_thread(lispobj function) { #ifdef LISP_FEATURE_SB_THREAD -/* THREAD POST MORTEM CLEANUP - * - * Memory allocated for the thread stacks cannot be reclaimed while - * the thread is still alive, so we need a mechanism for post mortem - * cleanups. FIXME: We actually have two, for historical reasons as - * the saying goes. Do we really need two? Nikodemus guesses that - * not anymore, now that we properly call pthread_attr_destroy before - * freeing the stack. */ - void free_thread_struct(struct thread *th) { #if defined(LISP_FEATURE_WIN32) @@ -305,91 +288,6 @@ void free_thread_struct(struct thread *th) #endif } -# if !defined LISP_FEATURE_WIN32 && defined IMMEDIATE_POST_MORTEM - -/* - * If this feature is set, we are running on a stack managed by the OS, - * and no fancy delays are required for anything. Just do it. - */ -static void __attribute__((__unused__)) -schedule_thread_post_mortem(struct thread *corpse) -{ - pthread_detach(pthread_self()); - free_thread_struct(corpse); -} - -# elif !defined LISP_FEATURE_WIN32 && !defined LISP_FEATURE_PAUSELESS_THREADSTART - -static void -perform_thread_post_mortem(struct thread *post_mortem) -{ - gc_assert(post_mortem); - /* The thread may exit before pthread_create() has finished - initialization and it may write into already unmapped - memory. This lock doesn't actually need to protect - anything, just to make sure that at least one call to - pthread_create() has finished. - - Possible improvements: stash the address of the thread - struct for which a pthread is being created and don't lock - here if it's not the one being terminated. */ - int result = pthread_mutex_lock(&create_thread_lock); - gc_assert(result == 0); - result = pthread_mutex_unlock(&create_thread_lock); - gc_assert(result == 0); - - if ((result = pthread_join(post_mortem->os_thread, NULL))) { - lose("Error calling pthread_join in perform_thread_post_mortem:\n%s", - strerror(result)); - } - free_thread_struct(post_mortem); -} - -static inline struct thread* -fifo_buffer_shift(struct thread** dest, struct thread* value) -{ -#ifdef __ATOMIC_SEQ_CST - return __atomic_exchange_n(dest, value, __ATOMIC_SEQ_CST); -#elif defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) - /* I'd like to remove this case but I don't know whether MSVC has - * either of __atomic_exchange_n() or __sync_val_compare_and_swap() */ - lispobj old_value; - asm volatile - ("lock xchg %0,(%1)" - : "=r" (old_value) - : "r" (dest), "0" (value) - : "memory"); - return old_value; -#else - // We don't want a compare-and-swap, but if that's all we have, - // then build an atomic exchange out of compare-and-swap - lispobj old = *dest; - while (1) { - lispobj actual = __sync_val_compare_and_swap(dest, old, value); - if (actual == old) - return old; - old = actual; - } -#endif -} - -static void -schedule_thread_post_mortem(struct thread *corpse) -{ - gc_assert(corpse); - // This strange little mechanism is a FIFO buffer of capacity 1. - // By stuffing one new thing in and reading the old one out, we ensure - // that at least one pthread_create() has completed by this point. - // In particular, the thread we're post-morteming must have completed - // because thread creation is completely serialized (which is - // somewhat unfortunate). - struct thread* previous = fifo_buffer_shift(&postmortem_thread, corpse); - if (previous) // any random thread which pre-deceased me - perform_thread_post_mortem(previous); -} - -# endif /* !IMMEDIATE_POST_MORTEM */ - /* Note: scribble must be stack-allocated */ static void init_new_thread(struct thread *th, @@ -1121,16 +1019,8 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { return th; } -#ifdef LISP_FEATURE_SB_THREAD - -#ifndef __USE_XOPEN2K -extern int pthread_attr_setstack (pthread_attr_t *__attr, void *__stackaddr, - size_t __stacksize); -#endif - -#ifndef LISP_FEATURE_PAUSELESS_THREADSTART - -/* Allocate a thread structure, call pthread_create() or CreateThread(), +#ifdef LISP_FEATURE_WIN32 +/* Allocate a thread structure, call CreateThread(), * and return 1 for success, 0 for failure */ uword_t create_thread(lispobj start_routine) { @@ -1156,7 +1046,6 @@ uword_t create_thread(lispobj start_routine) * SIG_STOP_FOR_GC because the child process is not linked onto * all_threads until it's ready. */ block_deferrable_signals(&oldset); -#ifdef LISP_FEATURE_WIN32 DWORD tid; pthread_t pth = (pthread_t)calloc(sizeof(pthread_thread),1); // Theoretically you should tell the new thread a signal mask to restore @@ -1174,53 +1063,10 @@ uword_t create_thread(lispobj start_routine) th->os_thread = pth, th->os_kernel_tid = tid; else free(pth); -#else - int retcode = 0; - pthread_attr_t attr; - pthread_t kid_tid; - if (pthread_attr_init(&attr) == 0) { - - /* See perform_thread_post_mortem for at least one reason why this lock is necessary */ - retcode = pthread_mutex_lock(&create_thread_lock); - gc_assert(retcode == 0); - - /* call_into_lisp_first_time switches the stack for the initial - * thread. For the others, we use this. */ - if ( -#ifdef LISP_FEATURE_OS_THREAD_STACK - pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) || - (retcode = pthread_create(&kid_tid, &attr, new_thread_trampoline_switch_stack, th)) -#else - -#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK - pthread_attr_setstack(&attr, th->control_stack_start, thread_control_stack_size) || -# else - pthread_attr_setstack(&attr, th->alien_stack_start, ALIEN_STACK_SIZE) || -# endif -# ifdef LISP_FEATURE_NETBSD - /* Even though the manpage says pthread_attr_setstack - would override the guard page, it's no longer true. */ - pthread_attr_setguardsize(&attr, 0) || -# endif - - (retcode = pthread_create(&kid_tid, &attr, new_thread_trampoline, th)) -#endif - ) { - perror("create_os_thread"); - } else { - success = 1; - } - retcode = pthread_mutex_unlock(&create_thread_lock); - gc_assert(retcode == 0); - pthread_attr_destroy(&attr); - } - -#endif thread_sigmask(SIG_SETMASK,&oldset,0); if (!success) free_thread_struct(th); return success; } - #endif /* stopping the world is a two-stage process. From this thread we signal From 5b6d15abbcea658ede599466ca84fa2c30615b8d Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 16 Aug 2020 23:43:33 -0400 Subject: [PATCH 0406/4023] Get rid of sigint_init() Contrary to the comment, I can't see any reason to call it from lisp. In fact I can't see any reason for calling it at all. --- src/runtime/monitor.c | 16 ++++++++++++---- src/runtime/runtime.c | 21 --------------------- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 0e47753ffc..136b8e7fa5 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -510,13 +510,21 @@ catchers_cmd(char __attribute__((unused)) **ptr) return 0; } +/* SIGINT handler that invokes the monitor (for when Lisp isn't up to it) */ +static void +sigint_handler(int __attribute__((unused)) signal, + siginfo_t __attribute__((unused)) *info, + os_context_t *context) +{ + lose("\nSIGINT hit at 0x%08lX", + (unsigned long) *os_context_pc_addr(context)); +} + static int grab_sigs_cmd(char __attribute__((unused)) **ptr) { - extern void sigint_init(void); - - printf("Grabbing signals.\n"); - sigint_init(); + printf("Grabbing SIGINT.\n"); + install_handler(SIGINT, sigint_handler, 0, 1); return 0; } diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index d051d72bad..4b406e646f 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -73,27 +73,6 @@ extern void *return_from_lisp_stub; #include "genesis/closure.h" #include "genesis/simple-fun.h" #endif - - -/* SIGINT handler that invokes the monitor (for when Lisp isn't up to it) */ -static void -sigint_handler(int __attribute__((unused)) signal, - siginfo_t __attribute__((unused)) *info, - os_context_t *context) -{ - lose("\nSIGINT hit at 0x%08lX", - (unsigned long) *os_context_pc_addr(context)); -} - -/* (This is not static, because we want to be able to call it from - * Lisp land.) */ -void -sigint_init(void) -{ - SHOW("entering sigint_init()"); - install_handler(SIGINT, sigint_handler, 0, 1); - SHOW("leaving sigint_init()"); -} /* * helper functions for dealing with command line args From 5df305ad28aada106762da1035b3316ff97d872f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 16 Aug 2020 23:52:30 -0400 Subject: [PATCH 0407/4023] Remove DEFAULT-INTERRUPT and IGNORE-INTERRUPT --- package-data-list.lisp-expr | 2 -- src/code/target-signal.lisp | 11 +---------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index facd2dcf35..6435c799a1 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -2791,7 +2791,6 @@ SB-KERNEL) have been undone, but probably more remain." "DEALLOCATE-SYSTEM-MEMORY" "DECODE-TIMEOUT" "DECODE-INTERNAL-TIME" - "DEFAULT-INTERRUPT" "DEFER-DEADLINE" "DYNAMIC-FOREIGN-SYMBOLS-P" "DLOPEN-OR-LOSE" @@ -2807,7 +2806,6 @@ SB-KERNEL) have been undone, but probably more remain." "FOREIGN-SYMBOL-ADDRESS" "FOREIGN-SYMBOL-DATAREF-SAP" "GET-MACHINE-VERSION" "GET-PAGE-SIZE" "GET-SYSTEM-INFO" - "IGNORE-INTERRUPT" "IN-INTERRUPTION" "INTERACTIVE-INTERRUPT" "INT-SAP" diff --git a/src/code/target-signal.lisp b/src/code/target-signal.lisp index a1d745d3f1..539a0fc1cc 100644 --- a/src/code/target-signal.lisp +++ b/src/code/target-signal.lisp @@ -67,6 +67,7 @@ ;;; point instructions, certain system calls), hopefully ruling out the ;;; possibility that we would trigger it during allocation. +;;; FIXME: terrible name. doesn't actually "enable" in the sense of unmasking. (defun enable-interrupt (signal handler &key synchronous) (declare (type (or function fixnum (member :default :ignore)) handler)) (/show0 "enable-interrupt") @@ -99,16 +100,7 @@ ;; instead of what was supplied before as HANDLER. We can only hope that ;; users don't pass the result of ENABLE-INTERRUPT as the argument to ;; another call, as that would create a chain of closures. - ;; I wonder if the fact that we at some point decided that we need - ;; to allow signal nesting to about 1024 levels deep had anything - ;; to do with this bug? (the (or function fixnum) (aref ohandler 0))))))))) - -(defun default-interrupt (signal) - (enable-interrupt signal :default)) - -(defun ignore-interrupt (signal) - (enable-interrupt signal :ignore)) ;;;; Support for signal handlers which aren't. ;;;; @@ -241,7 +233,6 @@ #-sb-thruption (enable-interrupt sigpipe #'sigpipe-handler) (enable-interrupt sigchld #'sigchld-handler) - #+hpux (ignore-interrupt sigxcpu) #-sb-safepoint (unblock-gc-signals) (unblock-deferrable-signals) (values)) From 046674bfdc2f2b18cb3090829a1b7ef28a89d342 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 17 Aug 2020 00:48:53 -0400 Subject: [PATCH 0408/4023] Allow disabling signal-based GC card protection Simplifies gdb debugging when hunting down "actual" SIGSEGV --- src/runtime/os.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/runtime/os.h b/src/runtime/os.h index 998ed70877..e8c181f82a 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -31,10 +31,10 @@ #define ENABLE_PAGE_PROTECTION 1 #endif -#ifdef LISP_FEATURE_CHENEYGC +#if defined LISP_FEATURE_CHENEYGC || defined LISP_FEATURE_SB_SAFEPOINT +// safepoint traps always require a signal handler #define INSTALL_SIG_MEMORY_FAULT_HANDLER 1 -#endif -#ifdef LISP_FEATURE_GENCGC +#elif defined LISP_FEATURE_GENCGC #define INSTALL_SIG_MEMORY_FAULT_HANDLER ENABLE_PAGE_PROTECTION #endif From b397e8d68a6ba34915ecb4d93f9f82ba7b32dcec Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 17 Aug 2020 00:55:16 -0400 Subject: [PATCH 0409/4023] Don't take &REST arg in lisp signal handlers interrupt_handle_now uses funcall3, so take exactly 3 args. While we're at it, improve signal-cold-init-or-reinit by frobbing the signal mask fewer times. --- src/code/target-signal.lisp | 67 ++++++++++++++++++++++++------------- src/runtime/interrupt.c | 11 ------ 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/code/target-signal.lisp b/src/code/target-signal.lisp index 539a0fc1cc..f8f8176b2f 100644 --- a/src/code/target-signal.lisp +++ b/src/code/target-signal.lisp @@ -44,14 +44,36 @@ nil)) -;;;; C routines that actually do all the work of establishing signal handlers -(define-alien-routine ("install_handler" install-handler) +;;;; This is merely a thin veneer on sigaction() for signal handled by lisp. +;;;; Handlers that stay in C are installed in a slightly different way. +(define-alien-routine ("install_handler" %sigaction) unsigned-long (signal int) (handler unsigned-long) (ohandler unsigned-long) (synchronous boolean)) +;;; Block signals while installing a signal handler. This is probably overly +;;; paranoid, and we only need to block the signal being affected and the GC signal; +;;; the former so there is no ambiguity as to which handler is invoked if that +;;; signal arrives while changing the handler; the latter so that returning a lisp +;;; function pointer from C is GC-safe (in case the only reference to a lisp function +;;; is in the interrupt_handlers array) though even that seems unnecessary now +;;; at least with conservative GC. +;;; This is probably ok with #+sb-safepoint only on conservative GC. +;;; Maye it should use WITHOUT-GCING in that case? +(defmacro with-blockables-masked (&body body) + `(with-alien ((old (array char #.sb-unix::sizeof-sigset_t))) + #+sb-thread + (with-pinned-objects (old) + (let ((sap (sb-alien:alien-sap old))) + (alien-funcall (extern-alien "block_blockable_signals" + (function void system-area-pointer)) + sap) + (prog1 (progn ,@body) + #+sb-thread + (sb-thread::pthread-sigmask sb-unix::SIG_SETMASK sap nil)))))) + ;;;; interface to enabling and disabling signal handlers ;;; Note on the SYNCHRONOUS argument: On builds without pseudo-atomic, @@ -70,20 +92,21 @@ ;;; FIXME: terrible name. doesn't actually "enable" in the sense of unmasking. (defun enable-interrupt (signal handler &key synchronous) (declare (type (or function fixnum (member :default :ignore)) handler)) - (/show0 "enable-interrupt") - (flet ((run-handler (&rest args) - (declare (truly-dynamic-extent args)) + (with-blockables-masked (%install-handler signal handler synchronous))) + +(defun %install-handler (signal handler synchronous) + (flet ((run-handler (signo info-sap context-sap) #-(or c-stack-is-control-stack sb-safepoint) ;; able to do that in interrupt_handle_now() (unblock-gc-signals) (in-interruption () - (apply handler args)))) + (funcall handler signo info-sap context-sap)))) (dx-let ((ohandler (make-array 1 :initial-element nil))) ;; Pin OHANDLER in case the backend heap-allocates it (with-pinned-objects (#'run-handler ohandler) ;; 0 and 1 probably coincide with SIG_DFL and SIG_IGN, but those ;; constants are opaque. We use our own explicit translation ;; of them in the C install_handler() argument and return convention. - (let ((result (install-handler + (let ((result (%sigaction signal (case handler (:default 0) @@ -216,24 +239,22 @@ (defun sb-kernel:signal-cold-init-or-reinit () "Enable all the default signals that Lisp knows how to deal with." - (enable-interrupt sigint #'sigint-handler) - (enable-interrupt sigterm #'sigterm-handler) - (enable-interrupt sigill #'sigill-handler :synchronous t) - #-(or linux android haiku) - (enable-interrupt sigemt #'sigemt-handler) - (enable-interrupt sigfpe #'sb-vm:sigfpe-handler :synchronous t) - (if (/= (extern-alien "install_sig_memory_fault_handler" int) 0) - (enable-interrupt sigbus #'sigbus-handler :synchronous t) - (write-string ";;;; SIGBUS handler not installed + (with-blockables-masked + (%install-handler sigint #'sigint-handler nil) + (%install-handler sigterm #'sigterm-handler nil) + (%install-handler sigill #'sigill-handler t) + #-(or linux android haiku) (%install-handler sigemt #'sigemt-handler nil) + (%install-handler sigfpe #'sb-vm:sigfpe-handler t) + (if (/= (extern-alien "install_sig_memory_fault_handler" int) 0) + (%install-handler sigbus #'sigbus-handler t) + (write-string ";;;; SIGBUS handler not installed " sb-sys:*stderr*)) - #-(or linux android) - (enable-interrupt sigsys #'sigsys-handler :synchronous t) - #-sb-wtimer - (enable-interrupt sigalrm #'sigalrm-handler) - #-sb-thruption - (enable-interrupt sigpipe #'sigpipe-handler) - (enable-interrupt sigchld #'sigchld-handler) + #-(or linux android) (%install-handler sigsys #'sigsys-handler t) + #-sb-wtimer (%install-handler sigalrm #'sigalrm-handler nil) + #-sb-thruption (%install-handler sigpipe #'sigpipe-handler nil) + (%install-handler sigchld #'sigchld-handler nil)) #-sb-safepoint (unblock-gc-signals) + ;; I don't see why deferrables would have ben blocked. This is essentially a no-op. (unblock-deferrable-signals) (values)) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 47d7d5c568..f9d4db22a9 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1993,14 +1993,7 @@ install_handler(int signal, void handler(int, siginfo_t*, os_context_t*), { #ifndef LISP_FEATURE_WIN32 struct sigaction sa; - sigset_t old; - FSHOW((stderr, "/entering POSIX install_handler(%d, ..)\n", signal)); - - block_blockable_signals(&old); - - FSHOW((stderr, "/interrupt_low_level_handlers[signal]=%p\n", - interrupt_low_level_handlers[signal])); if (interrupt_low_level_handlers[signal]==0) { if (handler == 0) sa.sa_sigaction = (void (*)(int, siginfo_t*, void*))SIG_DFL; @@ -2045,10 +2038,6 @@ install_handler(int signal, void handler(int, siginfo_t*, os_context_t*), interrupt_handlers[signal].c = handler; - thread_sigmask(SIG_SETMASK, &old, 0); - - FSHOW((stderr, "/leaving POSIX install_handler(%d, ..)\n", signal)); - // After the thread's signal mask is restored to the mask in 'old', // it is not possible to GC-safely refer to a Lisp function from C code, // which is to say, naively utilizing "return obj;" would be wrong. From aec620bb6473b356695f706db24c6d1cb4cee1e1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 17 Aug 2020 01:05:50 -0400 Subject: [PATCH 0410/4023] Fix C warning --- src/runtime/win32-os.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index ab35ae81d7..0c1af9bb29 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -1665,7 +1665,7 @@ struct { boolean in_progress; } ttyinput = {.lock = PTHREAD_MUTEX_INITIALIZER}; -static void* +static unsigned long tty_read_line_server() { pthread_mutex_lock(&ttyinput.lock); From 8ca1c276a0123af4170e75bcc2cbdc9921cb94ff Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 17 Aug 2020 15:59:46 +0300 Subject: [PATCH 0411/4023] Restore -sb-thread --- src/code/target-signal.lisp | 6 ++++-- src/runtime/thread.c | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/code/target-signal.lisp b/src/code/target-signal.lisp index f8f8176b2f..a02f2b1977 100644 --- a/src/code/target-signal.lisp +++ b/src/code/target-signal.lisp @@ -63,15 +63,17 @@ ;;; This is probably ok with #+sb-safepoint only on conservative GC. ;;; Maye it should use WITHOUT-GCING in that case? (defmacro with-blockables-masked (&body body) + #-sb-thread + (progn + ,@body) + #+sb-thread `(with-alien ((old (array char #.sb-unix::sizeof-sigset_t))) - #+sb-thread (with-pinned-objects (old) (let ((sap (sb-alien:alien-sap old))) (alien-funcall (extern-alien "block_blockable_signals" (function void system-area-pointer)) sap) (prog1 (progn ,@body) - #+sb-thread (sb-thread::pthread-sigmask sb-unix::SIG_SETMASK sap nil)))))) ;;;; interface to enabling and disabling signal handlers diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 78ee284ccc..4143651bfd 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -57,6 +57,7 @@ #ifdef LISP_FEATURE_SUNOS #include #endif +#endif int dynamic_values_bytes = 4096 * sizeof(lispobj); // same for all threads // exposed to lisp for pthread_create if not C_STACK_IS_CONTROL_STACK @@ -1018,7 +1019,7 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { th->stepping = 0; return th; } - +#ifdef LISP_FEATURE_SB_THREAD #ifdef LISP_FEATURE_WIN32 /* Allocate a thread structure, call CreateThread(), * and return 1 for success, 0 for failure */ From 90893842fb4263663836bc423c4681fd51f27aaf Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 17 Aug 2020 18:02:20 +0300 Subject: [PATCH 0412/4023] Typo. --- src/code/target-signal.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/target-signal.lisp b/src/code/target-signal.lisp index a02f2b1977..1c5e618c86 100644 --- a/src/code/target-signal.lisp +++ b/src/code/target-signal.lisp @@ -64,8 +64,8 @@ ;;; Maye it should use WITHOUT-GCING in that case? (defmacro with-blockables-masked (&body body) #-sb-thread - (progn - ,@body) + `(progn + ,@body) #+sb-thread `(with-alien ((old (array char #.sb-unix::sizeof-sigset_t))) (with-pinned-objects (old) From 04296434b1d5c97c7808b17e8756f66dd18ed096 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 17 Aug 2020 13:52:33 -0400 Subject: [PATCH 0413/4023] Simplify install_handler() and related code * Don't allow installing a C function as the handler. The only use was for ldb's catch-signals which did not need to be done that way. * The return value from ENABLE-INTERRUPT was basically useless (or at least, was not used), so just return NIL. * Having done those things, there is no need to block signals in ENABLE-INTERRUPT as long as careful attention is given to the order of the sigaction() call and storing the lisp function. --- src/code/target-signal.lisp | 96 +++++++++------------------- src/runtime/cheneygc.c | 3 +- src/runtime/gencgc.c | 23 ++----- src/runtime/interrupt.c | 124 +++++++++++------------------------- src/runtime/interrupt.h | 12 +--- src/runtime/monitor.c | 18 ++++-- src/runtime/purify.c | 4 +- 7 files changed, 89 insertions(+), 191 deletions(-) diff --git a/src/code/target-signal.lisp b/src/code/target-signal.lisp index 1c5e618c86..83e71756e5 100644 --- a/src/code/target-signal.lisp +++ b/src/code/target-signal.lisp @@ -44,38 +44,6 @@ nil)) -;;;; This is merely a thin veneer on sigaction() for signal handled by lisp. -;;;; Handlers that stay in C are installed in a slightly different way. -(define-alien-routine ("install_handler" %sigaction) - unsigned-long - (signal int) - (handler unsigned-long) - (ohandler unsigned-long) - (synchronous boolean)) - -;;; Block signals while installing a signal handler. This is probably overly -;;; paranoid, and we only need to block the signal being affected and the GC signal; -;;; the former so there is no ambiguity as to which handler is invoked if that -;;; signal arrives while changing the handler; the latter so that returning a lisp -;;; function pointer from C is GC-safe (in case the only reference to a lisp function -;;; is in the interrupt_handlers array) though even that seems unnecessary now -;;; at least with conservative GC. -;;; This is probably ok with #+sb-safepoint only on conservative GC. -;;; Maye it should use WITHOUT-GCING in that case? -(defmacro with-blockables-masked (&body body) - #-sb-thread - `(progn - ,@body) - #+sb-thread - `(with-alien ((old (array char #.sb-unix::sizeof-sigset_t))) - (with-pinned-objects (old) - (let ((sap (sb-alien:alien-sap old))) - (alien-funcall (extern-alien "block_blockable_signals" - (function void system-area-pointer)) - sap) - (prog1 (progn ,@body) - (sb-thread::pthread-sigmask sb-unix::SIG_SETMASK sap nil)))))) - ;;;; interface to enabling and disabling signal handlers ;;; Note on the SYNCHRONOUS argument: On builds without pseudo-atomic, @@ -93,8 +61,16 @@ ;;; FIXME: terrible name. doesn't actually "enable" in the sense of unmasking. (defun enable-interrupt (signal handler &key synchronous) - (declare (type (or function fixnum (member :default :ignore)) handler)) - (with-blockables-masked (%install-handler signal handler synchronous))) + (declare (type (or function (member :default :ignore)) handler)) + (%install-handler signal handler synchronous) + ;; This used to return the previously installed handler, if any. + ;; It no longer does, but the old handler can be obtained via SAP-REF-LISPOBJ + ;; on 'lisp_sig_handlers'. The reason for not returning it is that the value was + ;; always a closure, and there's no easy/portable way to ask what function was + ;; really meant. And you can't use that closure to reinstall the old thing + ;; because it would install a new closure on the old closure which, though + ;; feasible, is definitely not what was intended. + nil) (defun %install-handler (signal handler synchronous) (flet ((run-handler (signo info-sap context-sap) @@ -102,30 +78,19 @@ (unblock-gc-signals) (in-interruption () (funcall handler signo info-sap context-sap)))) - (dx-let ((ohandler (make-array 1 :initial-element nil))) - ;; Pin OHANDLER in case the backend heap-allocates it - (with-pinned-objects (#'run-handler ohandler) - ;; 0 and 1 probably coincide with SIG_DFL and SIG_IGN, but those - ;; constants are opaque. We use our own explicit translation - ;; of them in the C install_handler() argument and return convention. - (let ((result (%sigaction + (with-pinned-objects (#'run-handler) + ;; 0 and 1 probably coincide with SIG_DFL and SIG_IGN, but those + ;; constants are opaque. We use our own explicit translation + ;; of them in the C install_handler() argument convention. + (with-alien ((%sigaction (function void int unsigned int) :extern "install_handler")) + (alien-funcall %sigaction signal (case handler (:default 0) (:ignore 1) (t (sb-kernel:get-lisp-obj-address #'run-handler))) - ;; VECTOR-SAP does not work on SIMPLE-VECTOR - (sb-kernel:get-lisp-obj-address ohandler) - synchronous))) - (cond ((= result 0) :default) - ((= result 1) :ignore) - (t - ;; The value in OHANDLER, if a lisp function, is not the right thing to - ;; return, but we do it anyway. It's always the RUN-HANDLER closure - ;; instead of what was supplied before as HANDLER. We can only hope that - ;; users don't pass the result of ENABLE-INTERRUPT as the argument to - ;; another call, as that would create a chain of closures. - (the (or function fixnum) (aref ohandler 0))))))))) + (if synchronous 1 0))))) + nil) ;;;; Support for signal handlers which aren't. ;;;; @@ -241,20 +206,19 @@ (defun sb-kernel:signal-cold-init-or-reinit () "Enable all the default signals that Lisp knows how to deal with." - (with-blockables-masked - (%install-handler sigint #'sigint-handler nil) - (%install-handler sigterm #'sigterm-handler nil) - (%install-handler sigill #'sigill-handler t) - #-(or linux android haiku) (%install-handler sigemt #'sigemt-handler nil) - (%install-handler sigfpe #'sb-vm:sigfpe-handler t) - (if (/= (extern-alien "install_sig_memory_fault_handler" int) 0) - (%install-handler sigbus #'sigbus-handler t) - (write-string ";;;; SIGBUS handler not installed + (%install-handler sigint #'sigint-handler nil) + (%install-handler sigterm #'sigterm-handler nil) + (%install-handler sigill #'sigill-handler t) + #-(or linux android haiku) (%install-handler sigemt #'sigemt-handler nil) + (%install-handler sigfpe #'sb-vm:sigfpe-handler t) + (if (/= (extern-alien "install_sig_memory_fault_handler" int) 0) + (%install-handler sigbus #'sigbus-handler t) + (write-string ";;;; SIGBUS handler not installed " sb-sys:*stderr*)) - #-(or linux android) (%install-handler sigsys #'sigsys-handler t) - #-sb-wtimer (%install-handler sigalrm #'sigalrm-handler nil) - #-sb-thruption (%install-handler sigpipe #'sigpipe-handler nil) - (%install-handler sigchld #'sigchld-handler nil)) + #-(or linux android) (%install-handler sigsys #'sigsys-handler t) + #-sb-wtimer (%install-handler sigalrm #'sigalrm-handler nil) + #-sb-thruption (%install-handler sigpipe #'sigpipe-handler nil) + (%install-handler sigchld #'sigchld-handler nil) #-sb-safepoint (unblock-gc-signals) ;; I don't see why deferrables would have ben blocked. This is essentially a no-op. (unblock-deferrable-signals) diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index 85af1b9377..dcb439db9d 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -153,8 +153,7 @@ collect_garbage(generation_index_t ignore) printf("Scavenging interrupt handlers (%d bytes) ...\n", (int)sizeof(interrupt_handlers)); #endif - scavenge((lispobj *) interrupt_handlers, - sizeof(interrupt_handlers) / sizeof(lispobj)); + scavenge(lisp_sig_handlers, NSIG); #ifdef PRINTNOISE printf("Scavenging the control stack ...\n"); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 58a37c4a36..c1c984808f 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3587,21 +3587,9 @@ garbage_collect_generation(generation_index_t generation, int raise) } #endif - /* Scavenge the Lisp functions of the interrupt handlers, taking - * care to avoid SIG_DFL and SIG_IGN. */ - for (i = 0; i < NSIG; i++) { - union interrupt_handler handler = interrupt_handlers[i]; - if (!ARE_SAME_HANDLER(handler.c, SIG_IGN) && - !ARE_SAME_HANDLER(handler.c, SIG_DFL) && - // BUG: if a C function pointer can be misaligned such that it - // looks to satisfy functionp() then we do the wrong thing. - is_lisp_pointer(handler.lisp)) { - if (compacting_p()) - scavenge((lispobj *)(interrupt_handlers + i), 1); - else - gc_mark_obj(handler.lisp); - } - } + /* Scavenge the Lisp functions of the interrupt handlers */ + scavenge(lisp_sig_handlers, NSIG); + /* Scavenge the binding stacks. */ { struct thread *th; @@ -4471,10 +4459,7 @@ gc_and_save(char *filename, boolean prepend_runtime, { int i; for (i=0; idata[0] = (functionp(obj)||fixnump(obj)) ? obj : NIL; - - interrupt_handlers[signal].c = handler; - - // After the thread's signal mask is restored to the mask in 'old', - // it is not possible to GC-safely refer to a Lisp function from C code, - // which is to say, naively utilizing "return obj;" would be wrong. - return result; -#else - /* Probably-wrong Win32 hack */ - return 0; #endif } @@ -2078,13 +2034,7 @@ interrupt_init(void) #ifndef LISP_FEATURE_WIN32 /* Set up high level handler information. */ for (i = 0; i < NSIG; i++) { - interrupt_handlers[i].c = - /* (The cast here blasts away the distinction between - * SA_SIGACTION-style three-argument handlers and - * signal(..)-style one-argument handlers, which is OK - * because it works to call the 1-argument form where the - * 3-argument form is expected.) */ - (void (*)(int, siginfo_t*, os_context_t*))SIG_DFL; + lisp_sig_handlers[i] = NIL; } undoably_install_low_level_interrupt_handler(SIGABRT, sigabrt_handler); #endif diff --git a/src/runtime/interrupt.h b/src/runtime/interrupt.h index a2ddaf5441..2185ec73f5 100644 --- a/src/runtime/interrupt.h +++ b/src/runtime/interrupt.h @@ -72,12 +72,7 @@ extern void maybe_save_gc_mask_and_block_deferrables(sigset_t *sigset); * * -- NS 2007-01-29 */ -union interrupt_handler { - lispobj lisp; - void (*c)(int, siginfo_t*, os_context_t*); -}; - -extern union interrupt_handler interrupt_handlers[NSIG]; +extern lispobj lisp_sig_handlers[NSIG]; struct interrupt_data { /* signal information for pending signal. pending_signal=0 when there @@ -130,10 +125,7 @@ typedef void (*interrupt_handler_t)(int, siginfo_t *, os_context_t *); extern void undoably_install_low_level_interrupt_handler ( int signal, interrupt_handler_t handler); -extern uword_t install_handler(int signal, - interrupt_handler_t handler, - lispobj ohandler, - int synchronous); +extern void install_handler(int signal, lispobj handler, int synchronous); /* The void* casting here avoids having to mess with the various types * of function argument lists possible for signal handlers: diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 136b8e7fa5..8133ad03ea 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -514,17 +514,27 @@ catchers_cmd(char __attribute__((unused)) **ptr) static void sigint_handler(int __attribute__((unused)) signal, siginfo_t __attribute__((unused)) *info, - os_context_t *context) + void *context) { - lose("\nSIGINT hit at 0x%08lX", - (unsigned long) *os_context_pc_addr(context)); + extern void ldb_monitor(); + fprintf(stderr, "\nSIGINT hit at %p\n", (void*)*os_context_pc_addr(context)); + ldb_monitor(); + fprintf(stderr, "Returning to lisp (if you're lucky).\n"); } static int grab_sigs_cmd(char __attribute__((unused)) **ptr) { +#ifdef LISP_FEATURE_WIN32 + fprintf(stderr, "sorry no can do\n"); fflush(stderr); +#else printf("Grabbing SIGINT.\n"); - install_handler(SIGINT, sigint_handler, 0, 1); + struct sigaction sa; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = sigint_handler; + sigaction(SIGINT, &sa, 0); +#endif return 0; } diff --git a/src/runtime/purify.c b/src/runtime/purify.c index 3188e00d9b..b4701a5336 100644 --- a/src/runtime/purify.c +++ b/src/runtime/purify.c @@ -667,9 +667,7 @@ purify(lispobj static_roots, lispobj read_only_roots) printf(" handlers"); fflush(stdout); #endif - pscav((lispobj *) interrupt_handlers, - sizeof(interrupt_handlers) / sizeof(lispobj), - 0); + pscav(lisp_sig_handlers, NSIG, 0); #ifdef PRINTNOISE printf(" stack"); From 20e3ece30c8f50e1368d1536afe948fffdf09f1a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 17 Aug 2020 15:08:06 -0400 Subject: [PATCH 0414/4023] Trivial rename undoably_install_low_level_interrupt_handler -> ll_install_handler. I've never understood how it was "undoable" if it didn't return the old value. --- src/runtime/alpha-arch.c | 2 +- src/runtime/arm-bsd-os.c | 2 +- src/runtime/arm-linux-os.c | 2 +- src/runtime/arm64-arch.c | 4 ++-- src/runtime/bsd-os.c | 15 ++++++--------- src/runtime/haiku-os.c | 5 ++--- src/runtime/hppa-arch.c | 12 ++++++------ src/runtime/hpux-os.c | 3 +-- src/runtime/interrupt.c | 6 +++--- src/runtime/interrupt.h | 4 +--- src/runtime/linux-os.c | 10 ++++------ src/runtime/mips-arch.c | 2 +- src/runtime/ppc-arch.c | 4 ++-- src/runtime/riscv-arch.c | 2 +- src/runtime/sparc-arch.c | 2 +- src/runtime/sunos-os.c | 8 +++----- src/runtime/x86-64-arch.c | 6 +++--- src/runtime/x86-arch.c | 4 ++-- 18 files changed, 41 insertions(+), 52 deletions(-) diff --git a/src/runtime/alpha-arch.c b/src/runtime/alpha-arch.c index 7002d20f41..a5979b8991 100644 --- a/src/runtime/alpha-arch.c +++ b/src/runtime/alpha-arch.c @@ -365,5 +365,5 @@ arch_set_fp_control(unsigned long fp) void arch_install_interrupt_handlers() { - undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); + ll_install_handler(SIGTRAP, sigtrap_handler); } diff --git a/src/runtime/arm-bsd-os.c b/src/runtime/arm-bsd-os.c index c2deb419f9..154bc971bc 100644 --- a/src/runtime/arm-bsd-os.c +++ b/src/runtime/arm-bsd-os.c @@ -154,5 +154,5 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context) void arch_install_interrupt_handlers() { - undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); + ll_install_handler(SIGTRAP, sigtrap_handler); } diff --git a/src/runtime/arm-linux-os.c b/src/runtime/arm-linux-os.c index 9ed989b5ec..2b4139056d 100644 --- a/src/runtime/arm-linux-os.c +++ b/src/runtime/arm-linux-os.c @@ -120,5 +120,5 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context) void arch_install_interrupt_handlers() { - undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); + ll_install_handler(SIGTRAP, sigtrap_handler); } diff --git a/src/runtime/arm64-arch.c b/src/runtime/arm64-arch.c index c68b98ff0b..2262d177b4 100644 --- a/src/runtime/arm64-arch.c +++ b/src/runtime/arm64-arch.c @@ -136,8 +136,8 @@ sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context) { void arch_install_interrupt_handlers() { - undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); - undoably_install_low_level_interrupt_handler(SIGILL, sigill_handler); + ll_install_handler(SIGTRAP, sigtrap_handler); + ll_install_handler(SIGILL, sigill_handler); } diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 172c31ca9e..8567fcfbea 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -280,10 +280,9 @@ os_install_interrupt_handlers(void) SHOW("os_install_interrupt_handlers()/bsd-os/defined(GENCGC)"); if (INSTALL_SIG_MEMORY_FAULT_HANDLER) { #if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) - undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, - mach_error_memory_fault_handler); + ll_install_handler(SIG_MEMORY_FAULT, mach_error_memory_fault_handler); #else - undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, + ll_install_handler(SIG_MEMORY_FAULT, #if defined(LISP_FEATURE_FREEBSD) && !defined(__GLIBC__) (__siginfohandler_t *) #endif @@ -294,11 +293,10 @@ os_install_interrupt_handlers(void) #ifdef LISP_FEATURE_SB_THREAD # ifdef LISP_FEATURE_SB_SAFEPOINT # ifdef LISP_FEATURE_SB_THRUPTION - undoably_install_low_level_interrupt_handler(SIGPIPE, thruption_handler); + ll_install_handler(SIGPIPE, thruption_handler); # endif # else - undoably_install_low_level_interrupt_handler(SIG_STOP_FOR_GC, - sig_stop_for_gc_handler); + ll_install_handler(SIG_STOP_FOR_GC, sig_stop_for_gc_handler); # endif #endif @@ -308,7 +306,7 @@ os_install_interrupt_handlers(void) fprintf(stderr, "SIGXCPU (%d), will backtrace in all threads\n", SIGXCPU); sigdelset(&deferrable_sigset, SIGXCPU); sigdelset(&blockable_sigset, SIGXCPU); - undoably_install_low_level_interrupt_handler(SIGXCPU, backtrace_lisp_threads); + ll_install_handler(SIGXCPU, backtrace_lisp_threads); sigset_t ss; sigemptyset(&ss); sigaddset(&ss, SIGXCPU); @@ -335,8 +333,7 @@ void os_install_interrupt_handlers(void) { SHOW("os_install_interrupt_handlers()/bsd-os/!defined(GENCGC)"); - undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, - sigsegv_handler); + ll_install_handler(SIG_MEMORY_FAULT, sigsegv_handler); } #endif /* defined GENCGC */ diff --git a/src/runtime/haiku-os.c b/src/runtime/haiku-os.c index 812749537b..241bdccf26 100644 --- a/src/runtime/haiku-os.c +++ b/src/runtime/haiku-os.c @@ -79,10 +79,9 @@ sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) void os_install_interrupt_handlers(void) { - undoably_install_low_level_interrupt_handler(SIGSEGV, sigsegv_handler); + ll_install_handler(SIGSEGV, sigsegv_handler); #ifdef LISP_FEATURE_SB_THREAD - undoably_install_low_level_interrupt_handler(SIG_STOP_FOR_GC, - sig_stop_for_gc_handler); + ll_install_handler(SIG_STOP_FOR_GC, sig_stop_for_gc_handler); #endif } diff --git a/src/runtime/hppa-arch.c b/src/runtime/hppa-arch.c index ea68aedf18..bc8ba7b38c 100644 --- a/src/runtime/hppa-arch.c +++ b/src/runtime/hppa-arch.c @@ -357,13 +357,13 @@ ignore_handler(int signal, siginfo_t *siginfo, os_context_t *context) * bypass the lisp interrupt handlers */ void arch_install_interrupt_handlers(void) { - undoably_install_low_level_interrupt_handler(SIGTRAP,sigtrap_handler); - undoably_install_low_level_interrupt_handler(SIGILL,sigill_handler); - undoably_install_low_level_interrupt_handler(SIGFPE,sigfpe_handler); + ll_install_handler(SIGTRAP,sigtrap_handler); + ll_install_handler(SIGILL,sigill_handler); + ll_install_handler(SIGFPE,sigfpe_handler); /* FIXME: beyond 2.4.19-pa4 this shouldn't be necessary. */ - undoably_install_low_level_interrupt_handler(SIGBUS,sigbus_handler); + ll_install_handler(SIGBUS,sigbus_handler); #ifdef LISP_FEATURE_HPUX - undoably_install_low_level_interrupt_handler(SIGXCPU,ignore_handler); - undoably_install_low_level_interrupt_handler(SIGXFSZ,ignore_handler); + ll_install_handler(SIGXCPU,ignore_handler); + ll_install_handler(SIGXFSZ,ignore_handler); #endif } diff --git a/src/runtime/hpux-os.c b/src/runtime/hpux-os.c index 155276ae23..8f1ab8151f 100644 --- a/src/runtime/hpux-os.c +++ b/src/runtime/hpux-os.c @@ -91,8 +91,7 @@ sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) void os_install_interrupt_handlers(void) { - undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, - sigsegv_handler); + ll_install_handler(SIG_MEMORY_FAULT, sigsegv_handler); } char *os_get_runtime_executable_path() diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 8d1193b20d..3aa8284e0d 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1812,7 +1812,7 @@ extern void restore_sbcl_signals () { for (signal = 0; signal < NSIG; signal++) { interrupt_handler_t handler = interrupt_low_level_handlers[signal]; if (handler) { - undoably_install_low_level_interrupt_handler(signal, handler); + ll_install_handler(signal, handler); } } } @@ -1912,7 +1912,7 @@ low_level_handle_now_handler(int signal, siginfo_t *info, void *void_context) } void -undoably_install_low_level_interrupt_handler (int signal, +ll_install_handler (int signal, interrupt_handler_t handler) { struct sigaction sa; @@ -2036,7 +2036,7 @@ interrupt_init(void) for (i = 0; i < NSIG; i++) { lisp_sig_handlers[i] = NIL; } - undoably_install_low_level_interrupt_handler(SIGABRT, sigabrt_handler); + ll_install_handler(SIGABRT, sigabrt_handler); #endif SHOW("returning from interrupt_init()"); } diff --git a/src/runtime/interrupt.h b/src/runtime/interrupt.h index 2185ec73f5..0c3844f33b 100644 --- a/src/runtime/interrupt.h +++ b/src/runtime/interrupt.h @@ -122,9 +122,7 @@ extern void do_pending_interrupt(void); extern void sig_stop_for_gc_handler(int, siginfo_t*, os_context_t*); #endif typedef void (*interrupt_handler_t)(int, siginfo_t *, os_context_t *); -extern void undoably_install_low_level_interrupt_handler ( - int signal, - interrupt_handler_t handler); +extern void ll_install_handler(int signal, interrupt_handler_t handler); extern void install_handler(int signal, lispobj handler, int synchronous); /* The void* casting here avoids having to mess with the various types diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index d9ceebd2d3..2c2a052095 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -418,8 +418,7 @@ void os_install_interrupt_handlers(void) { if (INSTALL_SIG_MEMORY_FAULT_HANDLER) { - undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, - sigsegv_handler); + ll_install_handler(SIG_MEMORY_FAULT, sigsegv_handler); } /* OAOOM c.f. sunos-os.c. @@ -427,11 +426,10 @@ os_install_interrupt_handlers(void) #ifdef LISP_FEATURE_SB_THREAD # ifdef LISP_FEATURE_SB_SAFEPOINT # ifdef LISP_FEATURE_SB_THRUPTION - undoably_install_low_level_interrupt_handler(SIGPIPE, thruption_handler); + ll_install_handler(SIGPIPE, thruption_handler); # endif # else - undoably_install_low_level_interrupt_handler(SIG_STOP_FOR_GC, - sig_stop_for_gc_handler); + ll_install_handler(SIG_STOP_FOR_GC, sig_stop_for_gc_handler); # endif #endif @@ -441,7 +439,7 @@ os_install_interrupt_handlers(void) fprintf(stderr, "SIGXCPU (%d), will backtrace in all threads\n", SIGXCPU); sigdelset(&deferrable_sigset, SIGXCPU); sigdelset(&blockable_sigset, SIGXCPU); - undoably_install_low_level_interrupt_handler(SIGXCPU, backtrace_lisp_threads); + ll_install_handler(SIGXCPU, backtrace_lisp_threads); sigset_t ss; sigemptyset(&ss); sigaddset(&ss, SIGXCPU); diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index 200f7632ab..71983aeff2 100644 --- a/src/runtime/mips-arch.c +++ b/src/runtime/mips-arch.c @@ -425,7 +425,7 @@ arch_set_fp_control(unsigned int fp) void arch_install_interrupt_handlers(void) { - undoably_install_low_level_interrupt_handler(SIGTRAP,sigtrap_handler); + ll_install_handler(SIGTRAP,sigtrap_handler); } // Calls into C are mediated by the handwritten call_into_c routine diff --git a/src/runtime/ppc-arch.c b/src/runtime/ppc-arch.c index 92e1512075..dc0d3358c6 100644 --- a/src/runtime/ppc-arch.c +++ b/src/runtime/ppc-arch.c @@ -656,8 +656,8 @@ sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context) void arch_install_interrupt_handlers() { - undoably_install_low_level_interrupt_handler(SIGILL, sigtrap_handler); - undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); + ll_install_handler(SIGILL, sigtrap_handler); + ll_install_handler(SIGTRAP, sigtrap_handler); } void diff --git a/src/runtime/riscv-arch.c b/src/runtime/riscv-arch.c index f7bd5755f6..2c1523ce03 100644 --- a/src/runtime/riscv-arch.c +++ b/src/runtime/riscv-arch.c @@ -140,7 +140,7 @@ sigtrap_handler(int signal, siginfo_t *info, os_context_t *context) void arch_install_interrupt_handlers(void) { - undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); + ll_install_handler(SIGTRAP, sigtrap_handler); } /* Linkage table */ diff --git a/src/runtime/sparc-arch.c b/src/runtime/sparc-arch.c index 417c6285b8..83fe037e16 100644 --- a/src/runtime/sparc-arch.c +++ b/src/runtime/sparc-arch.c @@ -339,7 +339,7 @@ static void sigill_handler(int signal, siginfo_t *siginfo, void arch_install_interrupt_handlers() { - undoably_install_low_level_interrupt_handler(SIGILL, sigill_handler); + ll_install_handler(SIGILL, sigill_handler); } diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c index 688e6471ff..ea2dd06497 100644 --- a/src/runtime/sunos-os.c +++ b/src/runtime/sunos-os.c @@ -110,19 +110,17 @@ sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) void os_install_interrupt_handlers() { - undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT, - sigsegv_handler); + ll_install_handler(SIG_MEMORY_FAULT, sigsegv_handler); /* OAOOM c.f. linux-os.c. * Should we have a reusable function gc_install_interrupt_handlers? */ #ifdef LISP_FEATURE_SB_THREAD # ifdef LISP_FEATURE_SB_SAFEPOINT # ifdef LISP_FEATURE_SB_THRUPTION - undoably_install_low_level_interrupt_handler(SIGPIPE, thruption_handler); + ll_install_handler(SIGPIPE, thruption_handler); # endif # else - undoably_install_low_level_interrupt_handler(SIG_STOP_FOR_GC, - sig_stop_for_gc_handler); + ll_install_handler(SIG_STOP_FOR_GC, sig_stop_for_gc_handler); # endif #endif } diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 495a21f024..5f2fbf1db1 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -478,12 +478,12 @@ arch_install_interrupt_handlers() * CL way, I hope there will at least be a comment to explain * why.. -- WHN 2001-06-07 */ #if !defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) && !defined(LISP_FEATURE_WIN32) - undoably_install_low_level_interrupt_handler(SIGILL , sigill_handler); - undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); + ll_install_handler(SIGILL , sigill_handler); + ll_install_handler(SIGTRAP, sigtrap_handler); #endif #if defined(X86_64_SIGFPE_FIXUP) && !defined(LISP_FEATURE_WIN32) - undoably_install_low_level_interrupt_handler(SIGFPE, sigfpe_handler); + ll_install_handler(SIGFPE, sigfpe_handler); #endif SHOW("returning from arch_install_interrupt_handlers()"); diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index fc2674be98..3ee7faa17a 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -319,8 +319,8 @@ arch_install_interrupt_handlers() * CL way, I hope there will at least be a comment to explain * why.. -- WHN 2001-06-07 */ #if !defined(LISP_FEATURE_WIN32) && !defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) - undoably_install_low_level_interrupt_handler(SIGILL , sigill_handler); - undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler); + ll_install_handler(SIGILL , sigill_handler); + ll_install_handler(SIGTRAP, sigtrap_handler); #endif SHOW("returning from arch_install_interrupt_handlers()"); } From 772484834107312d6cd2abcb2a2aa4d2654696cb Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 17 Aug 2020 18:27:22 -0400 Subject: [PATCH 0415/4023] Remove HPUX support This does not delete all conditionals for #+/-hpux, just most of them. Anything in the HPPA-specific files is untouched, since those will be deleted in their entirety at some point so there was no reason to go over them culling out pieces. e.g. no changes were made in "src/runtime/hppa-assem.S" The criterion used was that if an otherwise machine-independent file had special cases for the now-unsupported OS, they were removed for reduced overall maintenance burden. #codehealth --- base-target-features.lisp-expr | 1 - build-order.lisp-expr | 1 - .../constants-gethostbyname.lisp | 6 +- contrib/sb-bsd-sockets/constants-unix.lisp | 4 +- contrib/sb-posix/posix-tests.lisp | 7 +- make-config.sh | 9 -- make-target-2-load.lisp | 2 +- src/code/cold-init.lisp | 2 - src/code/early-impl.lisp | 1 - src/code/foreign-load.lisp | 5 +- src/code/hpux-os.lisp | 34 ------ src/code/run-program.lisp | 2 +- src/code/save.lisp | 1 - src/code/unix.lisp | 6 +- src/compiler/generic/parms.lisp | 2 - src/runtime/Config.hppa-hpux | 40 ------- src/runtime/cheneygc.c | 8 +- src/runtime/hppa-hpux-os.c | 90 -------------- src/runtime/hppa-hpux-os.h | 14 --- src/runtime/hpux-os.c | 112 ------------------ src/runtime/hpux-os.h | 18 --- src/runtime/interrupt.c | 2 - src/runtime/os-common.c | 12 +- src/runtime/purify.c | 3 - src/runtime/run-program.c | 4 +- src/runtime/runtime.c | 12 -- src/runtime/time.c | 5 - tools-for-build/grovel-headers.c | 4 - tools-for-build/ldso-stubs.lisp | 1 - 29 files changed, 19 insertions(+), 389 deletions(-) delete mode 100644 src/code/hpux-os.lisp delete mode 100644 src/runtime/Config.hppa-hpux delete mode 100644 src/runtime/hppa-hpux-os.c delete mode 100644 src/runtime/hppa-hpux-os.h delete mode 100644 src/runtime/hpux-os.c delete mode 100644 src/runtime/hpux-os.h diff --git a/base-target-features.lisp-expr b/base-target-features.lisp-expr index 0f2b732ccb..fa73f67c0f 100644 --- a/base-target-features.lisp-expr +++ b/base-target-features.lisp-expr @@ -422,6 +422,5 @@ ;; :darwin = We're intended to run under Darwin (including MacOS X). ;; :sunos = We're intended to run under Solaris user environment ;; with the SunOS kernel. - ;; :hpux = We're intended to run under HP-UX 11.11 or later ;; :win32 = We're intended to under some version of Microsoft Windows. ) diff --git a/build-order.lisp-expr b/build-order.lisp-expr index 8ef3518d48..92fd44ec23 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -218,7 +218,6 @@ #+android ("src/code/android-os" :not-host) #+sunos ("src/code/sunos-os" :not-host) - #+hpux ("src/code/hpux-os" :not-host) #+bsd ("src/code/bsd-os" :not-host) #+linux ("src/code/linux-os" :not-host) #+haiku ("src/code/haiku-os" :not-host) diff --git a/contrib/sb-bsd-sockets/constants-gethostbyname.lisp b/contrib/sb-bsd-sockets/constants-gethostbyname.lisp index 923bbcf853..7dfe424240 100644 --- a/contrib/sb-bsd-sockets/constants-gethostbyname.lisp +++ b/contrib/sb-bsd-sockets/constants-gethostbyname.lisp @@ -7,12 +7,12 @@ (addr (* t)) (len int) (af int))) - (:integer NETDB-INTERNAL #+hpux "h_NETDB_INTERNAL" #-hpux "NETDB_INTERNAL" "See errno.") - (:integer NETDB-SUCCESS #+hpux "h_NETDB_SUCCESS" #-hpux "NETDB_SUCCESS" "No problem.") + (:integer NETDB-INTERNAL "NETDB_INTERNAL" "See errno.") + (:integer NETDB-SUCCESS "NETDB_SUCCESS" "No problem.") (:integer HOST-NOT-FOUND "HOST_NOT_FOUND" "Authoritative Answer Host not found.") (:integer TRY-AGAIN "TRY_AGAIN" "Non-Authoritative Host not found, or SERVERFAIL.") (:integer NO-RECOVERY "NO_RECOVERY" "Non recoverable errors, FORMERR, REFUSED, NOTIMP.") (:integer NO-DATA "NO_DATA" "Valid name, no data record of requested type.") (:integer NO-ADDRESS "NO_ADDRESS" "No address, look for MX record.") - #-(or hpux sunos) + #-sunos (:function h-strerror ("hstrerror" c-string (errno int)))) diff --git a/contrib/sb-bsd-sockets/constants-unix.lisp b/contrib/sb-bsd-sockets/constants-unix.lisp index ee5de10dbe..148f660f83 100644 --- a/contrib/sb-bsd-sockets/constants-unix.lisp +++ b/contrib/sb-bsd-sockets/constants-unix.lisp @@ -1,8 +1,8 @@ ("sys/socket.h" "errno.h" "fcntl.h") ((:integer af-local - #+(or sunos solaris hpux) "AF_UNIX" - #-(or sunos solaris hpux) "AF_LOCAL" + #+(or sunos solaris) "AF_UNIX" + #-(or sunos solaris) "AF_LOCAL" "Local to host (pipes and file-domain).") (:integer ifnamsiz "IFNAMSIZ") diff --git a/contrib/sb-posix/posix-tests.lisp b/contrib/sb-posix/posix-tests.lisp index 450def9a40..d066f8d0f1 100644 --- a/contrib/sb-posix/posix-tests.lisp +++ b/contrib/sb-posix/posix-tests.lisp @@ -423,7 +423,6 @@ (ignore-errors (sb-posix:unlink name)))) nil) -#-hpux ; fix: cant handle c-vargs (deftest open.error.1 (handler-case (sb-posix:open *test-directory* sb-posix::o-wronly) (sb-posix:syscall-error (c) @@ -442,7 +441,7 @@ sb-posix::o-nonblock)) t) -#-(or hpux win32 netbsd) ; fix: cant handle c-vargs +#-(or win32 netbsd) ; fix: cant handle c-vargs (deftest fcntl.flock.1 (locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) (let ((flock (make-instance 'sb-posix:flock @@ -697,7 +696,6 @@ ;; Same thing, but with a very long link target (which doesn't have ;; to exist). This tests the array adjustment in the wrapper, ;; provided that the target's length is long enough. - #-hpux ; arg2 to readlink is 80, and arg0 is larger than that (deftest readlink.2 (let ((target-pathname (make-pathname :name (make-string 255 :initial-element #\a) @@ -836,9 +834,8 @@ (delete-file temp)))) t "mkstemp-1") -;#-(or win32 sunos hpux) ;;;; mkdtemp is unimplemented on at least Solaris 10 -#-(or win32 hpux sunos) +#-(or win32 sunos) ;;; But it is implemented on OpenSolaris 2008.11 (deftest mkdtemp.1 (let ((pathname diff --git a/make-config.sh b/make-config.sh index 2c07bf7934..857ad9026a 100755 --- a/make-config.sh +++ b/make-config.sh @@ -305,9 +305,6 @@ case `uname` in CYGWIN* | WindowsNT | MINGW* | MSYS*) sbcl_os="win32" ;; - HP-UX) - sbcl_os="hpux" - ;; Haiku) sbcl_os="haiku" ;; @@ -522,12 +519,6 @@ case "$sbcl_os" in link_or_copy $sbcl_arch-linux-os.h target-arch-os.h link_or_copy linux-os.h target-os.h ;; - hpux) - printf ' :unix :hpux :elf' >> $ltf - link_or_copy Config.$sbcl_arch-hpux Config - link_or_copy $sbcl_arch-hpux-os.h target-arch-os.h - link_or_copy hpux-os.h target-os.h - ;; haiku) printf ' :unix :haiku :elf :int4-breakpoints' >> $ltf link_or_copy Config.$sbcl_arch-haiku Config diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index bffdb09986..e994748a2b 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -44,7 +44,7 @@ :64-BIT ; choice of word size. 32-bit if absent :BIG-ENDIAN :LITTLE-ENDIAN ; endianness: pick one and only one :BSD :UNIX :LINUX :WIN32 :DARWIN :SUNOS :ANDROID ; OS: pick one or more - :FREEBSD :GNU-KFREEBSD :OPENBSD :NETBSD :DRAGONFLY :HAIKU :HPUX + :FREEBSD :GNU-KFREEBSD :OPENBSD :NETBSD :DRAGONFLY :HAIKU :MACH-O :ELF ; obj file format: pick zero or one ;; I would argue that this should not be exposed, ;; but I would also anticipate blowback from removing it. diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index 09539fa6fd..5692f4feac 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -258,8 +258,6 @@ (logically-readonlyize (sb-c::sc-move-vops sc)) (logically-readonlyize (sb-c::sc-move-costs sc)))) - ; hppa heap is segmented, lisp and c uses a stub to call eachother - #+hpux (%primitive sb-vm::setup-return-from-lisp-stub) ;; The system is finally ready for GC. (/show0 "enabling GC") (setq *gc-inhibit* nil) diff --git a/src/code/early-impl.lisp b/src/code/early-impl.lisp index ae62d06e18..14b0e4706a 100644 --- a/src/code/early-impl.lisp +++ b/src/code/early-impl.lisp @@ -23,7 +23,6 @@ sb-vm:*control-stack-start* sb-vm:*control-stack-end* sb-vm:*binding-stack-start* - #+(or hpux) sb-vm::*c-lra* *allow-with-interrupts* sb-unix::*unblock-deferrables-on-enabling-interrupts-p* *interrupts-enabled* diff --git a/src/code/foreign-load.lisp b/src/code/foreign-load.lisp index 040922087a..f66f2262ae 100644 --- a/src/code/foreign-load.lisp +++ b/src/code/foreign-load.lisp @@ -116,7 +116,7 @@ Experimental." :key #'shared-object-pathname :test #'equal))) (when old - #-hpux (dlclose-or-lose old) + (dlclose-or-lose old) (setf *shared-objects* (remove old *shared-objects*)) #+linkage-table (update-linkage-table t) @@ -168,11 +168,10 @@ Experimental." (defun close-shared-objects () (let (saved) (dolist (obj (reverse *shared-objects*)) - #-hpux (dlclose-or-lose obj) + (dlclose-or-lose obj) (unless (shared-object-dont-save obj) (push obj saved))) (setf *shared-objects* saved)) - #-hpux (dlclose-or-lose)) ;;; This table is unsynchronized, but the only platforms that use it diff --git a/src/code/hpux-os.lisp b/src/code/hpux-os.lisp deleted file mode 100644 index 379d3d004e..0000000000 --- a/src/code/hpux-os.lisp +++ /dev/null @@ -1,34 +0,0 @@ -;;;; OS interface functions for SBCL under HPUX - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-SYS") - -;;; Check that target machine features are set up consistently with -;;; this file. -#-hpux (error "missing :HPUX feature") - -(defun software-type () - "Return a string describing the supporting software." - (values "HPUX")) - -;;; Return system time, user time and number of page faults. -(defun get-system-info () - (multiple-value-bind - (err? utime stime maxrss ixrss idrss isrss minflt majflt) - (sb-unix:unix-getrusage sb-unix:rusage_self) - (declare (ignore maxrss ixrss idrss isrss minflt)) - (unless err? ; FIXME: nonmnemonic (reversed) name for ERR? - (error "Unix system call getrusage failed: ~A." (strerror utime))) - (values utime stime majflt))) - -;;; support for CL:MACHINE-VERSION defined OAOO elsewhere -(defun get-machine-version () - nil) diff --git a/src/code/run-program.lisp b/src/code/run-program.lisp index c88a74b530..f9e6720b14 100644 --- a/src/code/run-program.lisp +++ b/src/code/run-program.lisp @@ -1279,7 +1279,7 @@ Users Manual for details about the PROCESS structure. (t (fail "invalid option: ~S" object)))))) -#+(or linux sunos hpux haiku) +#+(or linux sunos haiku) (defun software-version () "Return a string describing version of the supporting software, or NIL if not available." diff --git a/src/code/save.lisp b/src/code/save.lisp index 2d1b3ee72c..ccdcc07ef9 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -85,7 +85,6 @@ (named-lambda start-lisp () (handling-end-of-the-world (reinit t) - #+hpux (%primitive sb-vm::setup-return-from-lisp-stub) (funcall toplevel)))) (defun save-lisp-and-die (core-file-name &key diff --git a/src/code/unix.lisp b/src/code/unix.lisp index 88ebcc74fa..1df5c33407 100644 --- a/src/code/unix.lisp +++ b/src/code/unix.lisp @@ -387,17 +387,17 @@ corresponds to NAME, or NIL if there is none." ;; ;; Signal an error at compile-time, since it's needed for the ;; runtime to start up - #-(or android linux openbsd freebsd netbsd sunos darwin hpux dragonfly haiku) + #-(or android linux openbsd freebsd netbsd sunos darwin dragonfly haiku) #.(error "POSIX-GETCWD is not implemented.") (or - #+(or linux openbsd freebsd netbsd sunos darwin hpux dragonfly haiku) + #+(or linux openbsd freebsd netbsd sunos darwin dragonfly haiku) (newcharstar-string (alien-funcall (extern-alien "getcwd" (function (* char) (* char) size-t)) nil #+(or linux openbsd freebsd netbsd darwin dragonfly haiku) 0 - #+(or sunos hpux) 1025)) + #+(or sunos) 1025)) #+android (with-alien ((ptr (array char #.path-max))) ;; Older bionic versions do not have the above feature. diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index b1eda168d4..69e9a822cd 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -198,8 +198,6 @@ #+immobile-space *immobile-freelist* ; not per-thread (yet...) - #+hpux *c-lra* - ;; stack pointers #-sb-thread *binding-stack-start* ; a thread slot if #+sb-thread #-sb-thread *control-stack-start* ; ditto diff --git a/src/runtime/Config.hppa-hpux b/src/runtime/Config.hppa-hpux deleted file mode 100644 index 5b597a7df1..0000000000 --- a/src/runtime/Config.hppa-hpux +++ /dev/null @@ -1,40 +0,0 @@ -# -*- makefile -*- for the C-level run-time support for SBCL - -# This software is part of the SBCL system. See the README file for -# more information. -# -# This software is derived from the CMU CL system, which was -# written at Carnegie Mellon University and released into the -# public domain. The software is in the public domain and is -# provided with absolutely no warranty. See the COPYING and CREDITS -# files for more information. - -LINKFLAGS += -v -# avoid native tools -NM = /usr/local/bin/nm -CC = /usr/local/bin/gcc - -ASSEM_SRC = hppa-assem.S ldso-stubs.S -ARCH_SRC = hppa-arch.c -OS_SRC = hpux-os.c hppa-hpux-os.c - -OS_LIBS = - -CFLAGS += -D_POSIX_SOURCE -D_HPUX_SOURCE - -ifdef LISP_FEATURE_LARGEFILE - CFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -endif - -ifdef LISP_FEATURE_SB_THREAD - OS_LIBS += -lpthread -endif -ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz -endif - -GC_SRC = cheneygc.c - -# Nothing to do for after-grovel-headers. -.PHONY: after-grovel-headers -after-grovel-headers: diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index dcb439db9d..a47140d15c 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -200,10 +200,6 @@ collect_garbage(generation_index_t ignore) /* Maybe FIXME: it's possible that we could significantly reduce * RSS by zeroing the from_space or madvise(MADV_DONTNEED) or * similar os-dependent tricks here */ -#ifdef LISP_FEATURE_HPUX - /* hpux cant handle unmapping areas that are not 100% mapped */ - clear_auto_gc_trigger(); -#endif os_zero((os_vm_address_t) from_space, (os_vm_size_t) dynamic_space_size); @@ -393,7 +389,7 @@ void set_auto_gc_trigger(os_vm_size_t dynamic_usage) uword_t end = (uword_t)addr + length - 1; if (((uword_t)addr >= DYNAMIC_0_SPACE_START && end < semispace_0_end) || ((uword_t)addr >= DYNAMIC_1_SPACE_START && end < semispace_1_end)) { -#if defined(SUNOS) || defined(SOLARIS) || defined(LISP_FEATURE_HPUX) +#if defined(SUNOS) || defined(SOLARIS) os_invalidate(addr, length); #else os_protect(addr, length, 0); @@ -416,7 +412,7 @@ void clear_auto_gc_trigger(void) addr = (os_vm_address_t)current_auto_gc_trigger; length = dynamic_space_size + (os_vm_address_t)current_dynamic_space - addr; -#if defined(SUNOS) || defined(SOLARIS) || defined(LISP_FEATURE_HPUX) +#if defined(SUNOS) || defined(SOLARIS) /* don't want to force whole space into swapping mode... */ os_validate(NOT_MOVABLE, addr, length); #else diff --git a/src/runtime/hppa-hpux-os.c b/src/runtime/hppa-hpux-os.c deleted file mode 100644 index 9225da22e9..0000000000 --- a/src/runtime/hppa-hpux-os.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This is the HPPA HPUX incarnation of arch-dependent OS-dependent - * routines. See also "hppa-os.c". - */ - -/* - * This software is part of the SBCL system. See the README file for - * more information. - * - * This software is derived from the CMU CL system, which was - * written at Carnegie Mellon University and released into the - * public domain. The software is in the public domain and is - * provided with absolutely no warranty. See the COPYING and CREDITS - * files for more information. - */ - -#include -#include -#include -#include "sbcl.h" -#include "./signal.h" -#include "os.h" -#include "arch.h" -#include "globals.h" -#include "interrupt.h" -#include "interr.h" -#include "lispregs.h" -#include -#include - -#include -#include -#include -#include -#include - -#include "validate.h" - -#ifdef LISP_FEATURE_SB_THREAD -#error "Define threading support functions" -#else -int arch_os_thread_init(struct thread *thread) { - return 1; /* success */ -} -int arch_os_thread_cleanup(struct thread *thread) { - return 1; /* success */ -} -#endif - -/* for hpux read /usr/include/machine/save_state.h - * os_context_register_addr() may not be used - * to modify registers without setting a state-flag too */ -os_context_register_t * -os_context_register_addr(os_context_t *context, int offset) -{ - return (os_context_register_t *) - ((unsigned int)(&((ucontext_t *) context)->uc_mcontext.ss_wide.ss_64)) + (offset * 2) + 1; -} - -os_context_register_t * -os_context_pc_addr(os_context_t *context) -{ - /* Why do I get all the silly ports? -- CSR, 2002-08-11 */ - return ((unsigned int) &((ucontext_t *) context)->uc_mcontext.ss_wide.ss_64.ss_pcoq_head + 4); -} - -os_context_register_t * -os_context_npc_addr(os_context_t *context) -{ - return ((unsigned int) &((ucontext_t *) context)->uc_mcontext.ss_wide.ss_64.ss_pcoq_tail + 4); -} - -sigset_t * -os_context_sigmask_addr(os_context_t *context) -{ - return &(((ucontext_t *)context)->uc_subcontext.__uc_sigmask); -} - -void -os_restore_fp_control(os_context_t *context) -{ - /* FIXME: Probably do something. */ -} - -void -os_flush_icache(os_vm_address_t address, os_vm_size_t length) -{ - /* FIXME: Maybe this is OK. */ - sanctify_for_execution(address,length); -} diff --git a/src/runtime/hppa-hpux-os.h b/src/runtime/hppa-hpux-os.h deleted file mode 100644 index d2d1584ca8..0000000000 --- a/src/runtime/hppa-hpux-os.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _HPPA_HPUX_OS_H -#define _HPPA_HPUX_OS_H - -typedef struct ucontext_t os_context_t; -typedef unsigned long os_context_register_t; - -#include "arch-os-generic.inc" - -unsigned long os_context_fp_control(os_context_t *context); -void os_restore_fp_control(os_context_t *context); - -#define REGISTER_ACCESS(context,offset) ((os_context_register_t *) ((unsigned int)(&((ucontext_t *) context)->uc_mcontext.ss_wide.ss_64)) + (offset * 2) + 1) - -#endif /* _HPPA_HPUX_OS_H */ diff --git a/src/runtime/hpux-os.c b/src/runtime/hpux-os.c deleted file mode 100644 index 8f1ab8151f..0000000000 --- a/src/runtime/hpux-os.c +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "sbcl.h" -#include "os.h" -#include "arch.h" -#include "interr.h" -#include "interrupt.h" -#include "globals.h" -#include "validate.h" -#include "target-arch-os.h" - -#ifdef LISP_FEATURE_GENCGC -#error gencgc not ported to hpux -#endif - -#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK -#error C_STACK_IS_CONTROL_STACK isnt supported -#endif - -void -os_init(char *argv[], char *envp[]) -{ -} - -os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len) -{ - int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL; - attributes &= ~IS_GUARD_PAGE; - os_vm_address_t actual; - int flags = MAP_PRIVATE | MAP_ANONYMOUS; - if (addr) flags |= MAP_FIXED; - - actual = mmap(addr, len, protection, flags, -1, 0); - - if (actual == MAP_FAILED) { - perror("mmap"); - lose("os_validate(): mmap() failure"); - } - - if (addr && (addr!=actual)) { - fprintf(stderr, "mmap: wanted %lu bytes at %p, actually mapped at %p\n", - (unsigned long) len, addr, actual); - return 0; - } - - return actual; -} - -void -os_invalidate(os_vm_address_t addr, os_vm_size_t len) -{ - if (munmap(addr,len) == -1) { - perror("munmap"); - lose("os_invalidate(): mmap() failure"); - } -} - -void -os_protect(os_vm_address_t addr, os_vm_size_t len, os_vm_prot_t prot) -{ - if (mprotect(addr, len, prot) == -1) { - perror("mprotect"); - } -} - -/* - * any OS-dependent special low-level handling for signals - */ - -static void -sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) -{ - os_vm_address_t addr = arch_get_bad_addr(signal, info, context); - - if (!cheneygc_handle_wp_violation(context, addr)) - if (!handle_guard_page_triggered(context, addr)) - lisp_memory_fault_error(context, addr); - *((os_context_register_t *) &((ucontext_t *) context)->uc_mcontext.ss_flags) - |= SS_MODIFIEDWIDE; -} - -void -os_install_interrupt_handlers(void) -{ - ll_install_handler(SIG_MEMORY_FAULT, sigsegv_handler); -} - -char *os_get_runtime_executable_path() -{ - return NULL; -} - -/* when inside call_into_lisp, we will first jump to the stub - * and then the stub will jump into the lisp function. Then - * the lisp function will return to the stub function and - * the stub will return to the call_into_lisp function. - */ -void *return_from_lisp_stub; -void -setup_return_from_lisp_stub (void *addr) -{ - return_from_lisp_stub = addr; -} diff --git a/src/runtime/hpux-os.h b/src/runtime/hpux-os.h deleted file mode 100644 index bc4d404d13..0000000000 --- a/src/runtime/hpux-os.h +++ /dev/null @@ -1,18 +0,0 @@ -#include /* warnings in os-common */ -#include -#include -#include /* recognize signal_t */ -#include "target-arch-os.h" -#include "target-arch.h" - -typedef caddr_t os_vm_address_t; -typedef size_t os_vm_size_t; -typedef off_t os_vm_offset_t; -typedef int os_vm_prot_t; - -#define OS_VM_PROT_READ PROT_READ -#define OS_VM_PROT_WRITE PROT_WRITE -#define OS_VM_PROT_EXECUTE PROT_EXEC - -#define SIG_MEMORY_FAULT SIGSEGV - diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 3aa8284e0d..ebafdde926 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -369,10 +369,8 @@ sigaddset_deferrable(sigset_t *s) #else sigaddset(s, SIGPOLL); #endif -#ifndef LISP_FEATURE_HPUX sigaddset(s, SIGXCPU); sigaddset(s, SIGXFSZ); -#endif sigaddset(s, SIGVTALRM); sigaddset(s, SIGPROF); sigaddset(s, SIGWINCH); diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 966010b74c..88e03d3182 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -46,8 +46,7 @@ int install_sig_memory_fault_handler = INSTALL_SIG_MEMORY_FAULT_HANDLER; /* Except for os_zero, these routines are only called by Lisp code. * These routines may also be replaced by os-dependent versions - * instead. See hpux-os.c for some useful restrictions on actual - * usage. */ + * instead. */ #ifdef LISP_FEATURE_CHENEYGC void @@ -235,14 +234,6 @@ gc_managed_heap_space_p(lispobj addr) void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm_size_t len) { int fail = 0; -#ifdef LISP_FEATURE_HPUX - // Revision afcfb8b5da said that mmap() didn't work on HPUX, changing to use read() instead. - // Strangely it also read 4K at a time into a buffer and used memcpy to transfer the buffer. - // I don't see why, and given the lack of explanation, I've simplified to 1 read. - fail = lseek(fd, offset, SEEK_SET) == (off_t)-1 || read(fd, addr, len) != (ssize_t)len; - // This looks bogus but harmlesss, so I'm leaving it. - os_flush_icache(addr, len); -#else os_vm_address_t actual; actual = mmap(addr, len, // If mapping to a random address, then the assumption is @@ -260,7 +251,6 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm } else if (addr && (addr != actual)) { fail = 1; } -#endif if (fail) lose("load_core_bytes(%d,%zx,%p,%zx) failed", fd, offset, addr, len); return (void*)actual; diff --git a/src/runtime/purify.c b/src/runtime/purify.c index b4701a5336..fd3a0ba09f 100644 --- a/src/runtime/purify.c +++ b/src/runtime/purify.c @@ -733,9 +733,6 @@ purify(lispobj static_roots, lispobj read_only_roots) printf(" cleanup"); fflush(stdout); #endif -#ifdef LISP_FEATURE_HPUX - clear_auto_gc_trigger(); /* restore mmap as it was given by os */ -#endif os_zero((os_vm_address_t) current_dynamic_space, dynamic_space_size); diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 3c4b15d3bb..6c5a254d80 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -77,7 +77,7 @@ set_pty(char *pty_name) { int fd; -#if !defined(LISP_FEATURE_HPUX) && !defined(SVR4) && !defined(__HAIKU__) +#if !defined(SVR4) && !defined(__HAIKU__) fd = open("/dev/tty", O_RDWR, 0); if (fd >= 0) { ioctl(fd, TIOCNOTTY, 0); @@ -220,7 +220,7 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr, * share stdin with our parent. In the latter case we claim * control of the terminal. */ if (sin >= 0) { -#if defined(LISP_FEATURE_HPUX) || defined(LISP_FEATURE_OPENBSD) +#ifdef LISP_FEATURE_OPENBSD setsid(); #elif defined(LISP_FEATURE_DARWIN) setpgid(0, getpid()); diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 4b406e646f..8c78450738 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -68,11 +68,6 @@ static char libpath[] = "../lib/sbcl"; char *sbcl_runtime_home; char *sbcl_runtime; -#ifdef LISP_FEATURE_HPUX -extern void *return_from_lisp_stub; -#include "genesis/closure.h" -#include "genesis/simple-fun.h" -#endif /* * helper functions for dealing with command line args @@ -677,13 +672,6 @@ sbcl_main(int argc, char *argv[], char *envp[]) * since it was too soon earlier to handle write faults. */ write_protect_immobile_space(); #endif -#ifdef LISP_FEATURE_HPUX - // FIXME: obvious bitrot here. 23 isn't the offset to anything. - /* -1 = CLOSURE_FUN_OFFSET, 23 = SIMPLE_FUN_CODE_OFFSET, we are - * not in __ASSEMBLER__ so we cant reach them. */ - return_from_lisp_stub = (void *) ((char *)*((unsigned long *) - ((char *)initial_function + -1)) + 23); -#endif arch_install_interrupt_handlers(); #ifndef LISP_FEATURE_WIN32 diff --git a/src/runtime/time.c b/src/runtime/time.c index 0ae34c98e2..c40f9ea8ba 100644 --- a/src/runtime/time.c +++ b/src/runtime/time.c @@ -18,11 +18,6 @@ #include "sbcl.h" #include "runtime.h" -#ifdef LISP_FEATURE_HPUX -struct tm *gmtime_r(const time_t *timer, struct tm *result); -struct tm *localtime_r(const time_t *timer, struct tm *result); -#endif - int get_timezone(time_t when, boolean *dst) { struct tm ltm, gtm; diff --git a/tools-for-build/grovel-headers.c b/tools-for-build/grovel-headers.c index f1abe29e6a..b32f2ec67a 100644 --- a/tools-for-build/grovel-headers.c +++ b/tools-for-build/grovel-headers.c @@ -55,10 +55,6 @@ #include #include -#ifdef LISP_FEATURE_HPUX -#include /* for TIOCGPGRP */ -#endif - #ifdef LISP_FEATURE_BSD #include #include diff --git a/tools-for-build/ldso-stubs.lisp b/tools-for-build/ldso-stubs.lisp index 0cc0562e69..cf66330df1 100644 --- a/tools-for-build/ldso-stubs.lisp +++ b/tools-for-build/ldso-stubs.lisp @@ -154,7 +154,6 @@ ldso_stub__ ## fct: ; \\ "tanh" "truncate" "ttyname" - #-hpux "tzname" "unlink" "utimes" "waitpid" From 6d357fd7e47a76f86dc48a047e24680b73642e45 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 17 Aug 2020 18:53:54 -0400 Subject: [PATCH 0416/4023] Deduplicate identical code --- src/runtime/bsd-os.c | 13 ------------- src/runtime/interrupt.c | 8 ++++++++ src/runtime/linux-os.c | 13 ------------- 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 8567fcfbea..01ce02fb3b 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -300,19 +300,6 @@ os_install_interrupt_handlers(void) # endif #endif -#ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE - // Use this only if you know what you're doing - void backtrace_lisp_threads(int, siginfo_t*, os_context_t*); - fprintf(stderr, "SIGXCPU (%d), will backtrace in all threads\n", SIGXCPU); - sigdelset(&deferrable_sigset, SIGXCPU); - sigdelset(&blockable_sigset, SIGXCPU); - ll_install_handler(SIGXCPU, backtrace_lisp_threads); - sigset_t ss; - sigemptyset(&ss); - sigaddset(&ss, SIGXCPU); - thread_sigmask(SIG_UNBLOCK, &ss, 0); -#endif - SHOW("leaving os_install_interrupt_handlers()"); } diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index ebafdde926..c16d8c42ca 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -369,7 +369,9 @@ sigaddset_deferrable(sigset_t *s) #else sigaddset(s, SIGPOLL); #endif +#ifndef LISP_FEATURE_LIBUNWIND_BACKTRACE sigaddset(s, SIGXCPU); +#endif sigaddset(s, SIGXFSZ); sigaddset(s, SIGVTALRM); sigaddset(s, SIGPROF); @@ -2029,6 +2031,12 @@ interrupt_init(void) sigaddset_gc(&gc_sigset); #endif +#ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE + // Use this only if you know what you're doing + void backtrace_lisp_threads(int, siginfo_t*, os_context_t*); + ll_install_handler(SIGXCPU, backtrace_lisp_threads); +#endif + #ifndef LISP_FEATURE_WIN32 /* Set up high level handler information. */ for (i = 0; i < NSIG; i++) { diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 2c2a052095..c7986c7398 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -432,19 +432,6 @@ os_install_interrupt_handlers(void) ll_install_handler(SIG_STOP_FOR_GC, sig_stop_for_gc_handler); # endif #endif - -#ifdef LISP_FEATURE_LIBUNWIND_BACKTRACE - // Use this only if you know what you're doing - void backtrace_lisp_threads(int, siginfo_t*, os_context_t*); - fprintf(stderr, "SIGXCPU (%d), will backtrace in all threads\n", SIGXCPU); - sigdelset(&deferrable_sigset, SIGXCPU); - sigdelset(&blockable_sigset, SIGXCPU); - ll_install_handler(SIGXCPU, backtrace_lisp_threads); - sigset_t ss; - sigemptyset(&ss); - sigaddset(&ss, SIGXCPU); - thread_sigmask(SIG_UNBLOCK, &ss, 0); -#endif } char *os_get_runtime_executable_path() From c23307f479928ba828ddbf0dc58f260ac2a3b7b8 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 30 May 2020 00:49:27 -0700 Subject: [PATCH 0417/4023] pcl: Remove unreachable code. --- src/pcl/boot.lisp | 1 - src/pcl/wrapper.lisp | 9 +++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index e1a56d6c2d..c68f74967f 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -2016,7 +2016,6 @@ bootstrapping. (define-load-time-global *sgf-wrapper* (!boot-make-wrapper (!early-class-size 'standard-generic-function) 'standard-generic-function - nil #+immobile-code +machine-code-embedding-fsc-instance-bitmap+)) (define-load-time-global *sgf-slots-init* diff --git a/src/pcl/wrapper.lisp b/src/pcl/wrapper.lisp index 6ab0d6d6a0..1535eb552d 100644 --- a/src/pcl/wrapper.lisp +++ b/src/pcl/wrapper.lisp @@ -31,21 +31,18 @@ ;;; This is called in BRAID when we are making wrappers for classes ;;; whose slots are not initialized yet, and which may be built-in -;;; classes. We pass in the class name in addition to the class. -(defun !boot-make-wrapper (length name &optional class (bitmap -1)) +;;; classes. +(defun !boot-make-wrapper (length name &optional (bitmap -1)) (let ((found (find-classoid name nil))) (cond (found - (unless (classoid-pcl-class found) - (setf (classoid-pcl-class found) class)) - (aver (eq (classoid-pcl-class found) class)) (let ((layout (classoid-layout found))) (aver layout) layout)) (t (set-layout-valid (make-layout (hash-layout-name name) - (make-standard-classoid :name name :pcl-class class) + (make-standard-classoid :name name) :length length :flags +pcl-object-layout-flag+ :bitmap bitmap)))))) From 670ae06c9abd817ebeba096b28e94789e4255b75 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 30 May 2020 01:19:40 -0700 Subject: [PATCH 0418/4023] pcl: Remove wrapper-class* Nothing seems to break. --- src/pcl/braid.lisp | 2 +- src/pcl/slots.lisp | 16 ++++++++-------- src/pcl/std-class.lisp | 4 ++-- src/pcl/vector.lisp | 2 +- src/pcl/wrapper.lisp | 21 ++------------------- 5 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/pcl/braid.lisp b/src/pcl/braid.lisp index 3008c90ede..6e1b55e2fe 100644 --- a/src/pcl/braid.lisp +++ b/src/pcl/braid.lisp @@ -567,7 +567,7 @@ (defun class-of (x) (declare (explicit-check)) - (wrapper-class* (layout-of x))) + (wrapper-class (layout-of x))) (defun eval-form (form) (lambda () (eval form))) diff --git a/src/pcl/slots.lisp b/src/pcl/slots.lisp index 5e996206dc..a2abad3781 100644 --- a/src/pcl/slots.lisp +++ b/src/pcl/slots.lisp @@ -95,7 +95,7 @@ (return-from slot-value (if cell (funcall (slot-info-reader (cdr cell)) object) - (values (slot-missing (wrapper-class* wrapper) object + (values (slot-missing (wrapper-class wrapper) object slot-name 'slot-value))))) ;; this next test means CONSP, but the transform that weakens ;; CONSP to LISTP isn't working here for some reason. @@ -104,14 +104,14 @@ (t (bug "Bogus slot cell in SLOT-VALUE: ~S" cell))))) (if (unbound-marker-p value) - (slot-unbound (wrapper-class* wrapper) object slot-name) + (slot-unbound (wrapper-class wrapper) object slot-name) value))) (defun set-slot-value (object slot-name new-value) (let* ((wrapper (valid-wrapper-of object)) (cell (or (find-slot-cell wrapper slot-name) (return-from set-slot-value - (progn (slot-missing (wrapper-class* wrapper) + (progn (slot-missing (wrapper-class wrapper) object slot-name 'setf new-value) new-value)))) (location (car cell)) @@ -143,7 +143,7 @@ (let* ((wrapper (valid-wrapper-of object)) (cell (or (find-slot-cell wrapper slot-name) (return-from slot-value - (values (slot-missing (wrapper-class* wrapper) object slot-name + (values (slot-missing (wrapper-class wrapper) object slot-name 'cas (list old-value new-value)))))) (location (car cell)) (info (cdr cell)) @@ -163,7 +163,7 @@ (t (bug "Bogus slot-cell in (CAS SLOT-VALUE): ~S" cell))))) (if (and (unbound-marker-p old) (neq old old-value)) - (slot-unbound (wrapper-class* wrapper) object slot-name) + (slot-unbound (wrapper-class wrapper) object slot-name) old)))) (defun slot-boundp (object slot-name) @@ -179,7 +179,7 @@ (return-from slot-boundp (if cell (funcall (slot-info-boundp (cdr cell)) object) - (and (slot-missing (wrapper-class* wrapper) object + (and (slot-missing (wrapper-class wrapper) object slot-name 'slot-boundp) t)))) ((listp location) ; forcibly transform CONSP to LISTP @@ -199,10 +199,10 @@ +slot-unbound+))) ((not location) (if cell - (let ((class (wrapper-class* wrapper))) + (let ((class (wrapper-class wrapper))) (slot-makunbound-using-class class object (find-slot-definition class slot-name))) - (slot-missing (wrapper-class* wrapper) object slot-name + (slot-missing (wrapper-class wrapper) object slot-name 'slot-makunbound))) ((listp location) ; forcibly transform CONSP to LISTP (setf (cdr location) +slot-unbound+)) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index 5037fbc4e5..964d63beb3 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -1567,7 +1567,7 @@ (defun %obsolete-instance-trap (owrapper nwrapper instance) (cond ((layout-for-pcl-obj-p owrapper) - (binding* ((class (wrapper-class* nwrapper)) + (binding* ((class (wrapper-class nwrapper)) (oslots (get-slots instance)) (nwrapper (class-wrapper class)) (nslots (make-array (layout-length nwrapper) @@ -1669,7 +1669,7 @@ (new-slots (make-array (layout-length new-wrapper) :initial-element +slot-unbound+)) (old-wrapper (layout-of instance)) - (old-class (wrapper-class* old-wrapper)) + (old-class (wrapper-class old-wrapper)) (old-slots (get-slots instance)) (safe (safe-p new-class)) (new-wrapper-slots (layout-slot-list new-wrapper))) diff --git a/src/pcl/vector.lisp b/src/pcl/vector.lisp index d6f2227e97..a0d7cf0706 100644 --- a/src/pcl/vector.lisp +++ b/src/pcl/vector.lisp @@ -97,7 +97,7 @@ (when slot-names (let* ((wrapper (pop wrappers)) (std-p (layout-for-pcl-obj-p wrapper)) - (class (wrapper-class* wrapper))) + (class (wrapper-class wrapper))) (dolist (slot-name slot-names) (destructuring-bind (location . info) (or (find-slot-cell wrapper slot-name) diff --git a/src/pcl/wrapper.lisp b/src/pcl/wrapper.lisp index 1535eb552d..6a1f8f4e1a 100644 --- a/src/pcl/wrapper.lisp +++ b/src/pcl/wrapper.lisp @@ -83,23 +83,6 @@ (aver layout) layout)))) -(declaim (inline wrapper-class*)) -(defun wrapper-class* (wrapper) - (or (wrapper-class wrapper) - ;; FIXME: this branch seems unreachable. - ;; It would be nice to eliminate WRAPPER-CLASS* if we can show that it - ;; is only a holdover from an earlier way of bootstrapping that resulted - ;; in the temporary absence of a PCL-CLASS for some non-standard-class. - ;; Certainly no test gets here [changing it to (BUG "got here") worked]. - ;; Note however that - ;; (CLASSOID-PCL-CLASS (FIND-CLASSOID 'STANDARD-INSTANCE)) => NIL - ;; which can be resolved by just ensuring one time that it has a CLASS. - ;; And nothing else seems to be problematic. - (let ((classoid (layout-classoid wrapper))) - (ensure-non-standard-class - (classoid-name classoid) - classoid)))) - ;;; The wrapper cache machinery provides general mechanism for ;;; trapping on the next access to any instance of a given class. This ;;; mechanism is used to implement the updating of instances when the @@ -239,7 +222,7 @@ ;; previous call to REGISTER-LAYOUT for a superclass of ;; INSTANCE's class. See also the comment above ;; FORCE-CACHE-FLUSHES. Paul Dietz has test cases for this. - (let ((class (wrapper-class* owrapper))) + (let ((class (wrapper-class owrapper))) (%force-cache-flushes class) ;; KLUDGE: avoid an infinite recursion, it's still better to ;; bail out with an error for server softwares. see FIXME above. @@ -385,7 +368,7 @@ (setf (cdr dfun-wrappers-tail) new-dfun-wrappers-tail) (setf dfun-wrappers-tail new-dfun-wrappers-tail)))) ,@(when wrappers - `((setq class (wrapper-class* wrapper)) + `((setq class (wrapper-class wrapper)) (setq type `(class-eq ,class))))) ,@(when wrappers `((push wrapper wrappers-rev) From dd407e3c31be12e0eb669c66b8e01aacea2e291a Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Thu, 23 Jul 2020 20:08:04 -0700 Subject: [PATCH 0419/4023] Ensure unqualified standard library constants refer to target values. Rather than complaining when someone uses a host constant by accident, make this mistake almost impossible by having unqualified constant references always do the right thing. --- src/code/array.lisp | 2 +- src/code/bignum-random.lisp | 4 +- src/code/bignum.lisp | 4 +- src/code/bit-bash.lisp | 2 +- src/code/cas.lisp | 4 +- src/code/class.lisp | 4 +- src/code/cross-float.lisp | 24 ++-- src/code/deadline.lisp | 6 +- src/code/debug-int.lisp | 2 +- src/code/debug.lisp | 2 +- src/code/deftypes-for-target.lisp | 8 +- src/code/dyncount.lisp | 2 +- src/code/early-array.lisp | 6 +- src/code/early-cl.lisp | 32 +++--- src/code/early-constants.lisp | 2 +- src/code/early-extensions.lisp | 6 +- src/code/early-float.lisp | 86 +++++++------- src/code/early-time.lisp | 2 +- src/code/early-type.lisp | 32 +++--- src/code/external-formats/enc-basic.lisp | 4 +- src/code/external-formats/enc-ucs.lisp | 8 +- src/code/fd-stream.lisp | 2 +- src/code/float.lisp | 12 +- src/code/fop.lisp | 2 +- src/code/irrat.lisp | 26 ++--- src/code/late-extensions.lisp | 2 +- src/code/late-format.lisp | 8 +- src/code/late-type.lisp | 40 +++---- src/code/loop.lisp | 2 +- src/code/macros.lisp | 8 +- src/code/maphash.lisp | 2 +- src/code/numbers.lisp | 8 +- src/code/pred.lisp | 4 +- src/code/quantifiers.lisp | 2 +- src/code/seq.lisp | 6 +- src/code/string-hash.lisp | 14 +-- src/code/symbol.lisp | 2 +- src/code/target-char.lisp | 2 +- src/code/target-defstruct.lisp | 2 +- src/code/target-extensions.lisp | 4 +- src/code/target-package.lisp | 2 +- src/code/target-random.lisp | 2 +- src/code/target-sxhash.lisp | 14 +-- src/code/target-thread.lisp | 12 +- src/code/target-unicode.lisp | 2 +- src/code/timer.lisp | 6 +- src/code/toplevel.lisp | 8 +- src/code/unix.lisp | 8 +- src/code/win32.lisp | 2 +- src/cold/set-up-cold-packages.lisp | 137 ++++++++++++----------- src/compiler/alpha/move.lisp | 4 +- src/compiler/alpha/vm.lisp | 2 +- src/compiler/arm/move.lisp | 4 +- src/compiler/arm/vm.lisp | 2 +- src/compiler/arm64/move.lisp | 4 +- src/compiler/arm64/vm.lisp | 2 +- src/compiler/array-tran.lisp | 2 +- src/compiler/ctype.lisp | 8 +- src/compiler/debug-dump.lisp | 2 +- src/compiler/early-c.lisp | 6 +- src/compiler/early-globaldb.lisp | 2 +- src/compiler/float-tran.lisp | 40 +++---- src/compiler/fndb.lisp | 14 +-- src/compiler/generic/early-vm.lisp | 16 +-- src/compiler/generic/genesis.lisp | 6 +- src/compiler/generic/interr.lisp | 2 +- src/compiler/generic/primtype.lisp | 14 +-- src/compiler/generic/vm-fndb.lisp | 12 +- src/compiler/generic/vm-tran.lisp | 2 +- src/compiler/generic/vm-type.lisp | 6 +- src/compiler/hppa/move.lisp | 4 +- src/compiler/hppa/vm.lisp | 2 +- src/compiler/info-vector.lisp | 2 +- src/compiler/integer-tran.lisp | 2 +- src/compiler/ir1opt.lisp | 2 +- src/compiler/ir1tran.lisp | 5 - src/compiler/ir2tran.lisp | 2 +- src/compiler/knownfun.lisp | 2 +- src/compiler/main.lisp | 4 +- src/compiler/mips/move.lisp | 4 +- src/compiler/mips/vm.lisp | 2 +- src/compiler/modarith.lisp | 2 +- src/compiler/pack.lisp | 2 +- src/compiler/parse-lambda-list.lisp | 2 +- src/compiler/ppc/move.lisp | 4 +- src/compiler/ppc/vm.lisp | 2 +- src/compiler/ppc64/move.lisp | 4 +- src/compiler/ppc64/vm.lisp | 2 +- src/compiler/represent.lisp | 10 +- src/compiler/riscv/move.lisp | 4 +- src/compiler/riscv/vm.lisp | 2 +- src/compiler/seqtran.lisp | 6 +- src/compiler/sparc/move.lisp | 4 +- src/compiler/sparc/vm.lisp | 2 +- src/compiler/srctran.lisp | 68 +++++------ src/compiler/sset.lisp | 2 +- src/compiler/sxhash.lisp | 14 +-- src/compiler/typetran.lisp | 2 +- src/compiler/x86-64/float.lisp | 2 +- src/compiler/x86-64/memory.lisp | 4 +- src/compiler/x86-64/move.lisp | 8 +- src/compiler/x86-64/type-vops.lisp | 2 +- src/compiler/x86-64/vm.lisp | 2 +- src/compiler/x86/move.lisp | 4 +- src/compiler/x86/type-vops.lisp | 8 +- src/compiler/x86/vm.lisp | 2 +- tests/vm.before-xc.lisp | 8 +- 107 files changed, 468 insertions(+), 468 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index faf6dfb674..bdc848ed44 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -1192,7 +1192,7 @@ of specialized arrays is supported." (let* ((old-length (length vector)) (min-extension (or min-extension (min old-length - (- sb-xc:array-dimension-limit old-length)))) + (- array-dimension-limit old-length)))) (new-length (the index (+ old-length (max 1 min-extension)))) (fill-pointer (1+ old-length))) diff --git a/src/code/bignum-random.lisp b/src/code/bignum-random.lisp index 374618afba..f352f0e4c5 100644 --- a/src/code/bignum-random.lisp +++ b/src/code/bignum-random.lisp @@ -38,7 +38,7 @@ (declaim (inline concatenate-random-bignum)) (defun concatenate-random-bignum (random-chunk bit-count state) (declare (type bignum-element-type random-chunk) - (type (integer 0 #.sb-xc:most-positive-fixnum) bit-count) + (type (integer 0 #.most-positive-fixnum) bit-count) (type random-state state)) (let* ((n-total-bits (+ 1 n-random-chunk-bits bit-count)) ; sign bit (length (ceiling n-total-bits digit-size)) @@ -115,7 +115,7 @@ ;;; generate and compare the complete random number and risk to reject ;;; it. (defun %random-bignum (arg state) - (declare (type (integer #.(1+ sb-xc:most-positive-fixnum)) arg) + (declare (type (integer #.(1+ most-positive-fixnum)) arg) (type random-state state) (inline bignum-lower-bits-zero-p)) (let ((n-bits (bignum-integer-length arg))) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index 4470aa34a5..e11714695d 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -635,7 +635,7 @@ n2 n1 d2 d1)) (values n2 (if (>= d2 (expt 2 (1- digit-size))) - (lognot (logand sb-xc:most-positive-fixnum (lognot d2))) + (lognot (logand most-positive-fixnum (lognot d2))) (logand lower-ones-digit d2))))) @@ -1974,7 +1974,7 @@ (declare (type index i)) (let ((xi (%bignum-ref x i))) (mixf result - (logand sb-xc:most-positive-fixnum + (logand most-positive-fixnum (logxor xi (ash xi -7)))))) result)) diff --git a/src/code/bit-bash.lisp b/src/code/bit-bash.lisp index 9f403a790b..560d7fe8ee 100644 --- a/src/code/bit-bash.lisp +++ b/src/code/bit-bash.lisp @@ -160,7 +160,7 @@ (defmacro !define-byte-bashers (bitsize) (let* ((bytes-per-word (/ n-word-bits bitsize)) (byte-offset `(integer 0 (,bytes-per-word))) - (word-offset `(integer 0 ,(ceiling sb-xc:array-dimension-limit bytes-per-word))) + (word-offset `(integer 0 ,(ceiling array-dimension-limit bytes-per-word))) (fix-sap-and-offset-name (intern (format nil "FIX-SAP-AND-OFFSET-UB~D" bitsize))) (constant-bash-name (intern (format nil "CONSTANT-UB~D-BASH" bitsize) (find-package "SB-KERNEL"))) (array-fill-name (intern (format nil "UB~D-BASH-FILL" bitsize) (find-package "SB-KERNEL"))) diff --git a/src/code/cas.lisp b/src/code/cas.lisp index 655f34ff2e..c8333162af 100644 --- a/src/code/cas.lisp +++ b/src/code/cas.lisp @@ -380,7 +380,7 @@ DIFF defaults to 1. EXPERIMENTAL: Interface subject to change." sb-vm:n-word-bits most-positive-word - sb-xc:most-positive-fixnum sb-xc:most-negative-fixnum) + most-positive-fixnum most-negative-fixnum) (expand-atomic-frob 'atomic-incf place diff env)) (defmacro atomic-decf (&environment env place &optional (diff 1)) @@ -409,5 +409,5 @@ DIFF defaults to 1. EXPERIMENTAL: Interface subject to change." sb-vm:n-word-bits most-positive-word - sb-xc:most-negative-fixnum sb-xc:most-positive-fixnum) + most-negative-fixnum most-positive-fixnum) (expand-atomic-frob 'atomic-decf place diff env)) diff --git a/src/code/class.lisp b/src/code/class.lisp index d2e150c72a..833192c36e 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -950,7 +950,7 @@ between the ~A definition and the ~A definition" (integer :translation integer :inherits (rational real number) :prototype-form 0) (fixnum - :translation (integer ,sb-xc:most-negative-fixnum ,sb-xc:most-positive-fixnum) + :translation (integer ,most-negative-fixnum ,most-positive-fixnum) :inherits (integer rational real number) :codes ,(mapcar #'symbol-value sb-vm::fixnum-lowtags) :prototype-form 42) @@ -958,7 +958,7 @@ between the ~A definition and the ~A definition" :translation (and integer (not fixnum)) :inherits (integer rational real number) :codes (,sb-vm:bignum-widetag) - :prototype-form ,(1+ sb-xc:most-positive-fixnum)) + :prototype-form ,(1+ most-positive-fixnum)) (array :translation array :codes (,sb-vm:complex-array-widetag) :hierarchical-p nil diff --git a/src/code/cross-float.lisp b/src/code/cross-float.lisp index 2b04191f4c..dcb593142d 100644 --- a/src/code/cross-float.lisp +++ b/src/code/cross-float.lisp @@ -185,7 +185,7 @@ (exp-marker (if (and marker-pos (char-not-equal (char string marker-pos) #\E)) (char-upcase (char string marker-pos)) - (ecase *read-default-float-format* + (ecase cl:*read-default-float-format* ((cl:single-float cl:short-float) #\F) ((cl:double-float cl:long-float) #\D)))) (significand (if marker-pos (subseq string 0 marker-pos) string)) @@ -714,28 +714,28 @@ ;;; These use "#." so that they are dumped as literals rather than having to ;;; call read-from-string at load-time (and failing) due to the reader intercept. ;; #define __FLT_MAX__ 3.40282347e+38F -(defconstant sb-xc:most-positive-single-float +(defconstant most-positive-single-float #.(make-flonum (read-from-string "+3.40282347F38") 'single-float)) -(defconstant sb-xc:most-negative-single-float +(defconstant most-negative-single-float #.(make-flonum (read-from-string "-3.40282347F38") 'single-float)) ;; #define __DBL_MAX__ 1.7976931348623157e+308 -(defconstant sb-xc:most-positive-double-float +(defconstant most-positive-double-float #.(make-flonum (read-from-string "+1.7976931348623157D308") 'double-float)) -(defconstant sb-xc:most-negative-double-float +(defconstant most-negative-double-float #.(make-flonum (read-from-string "-1.7976931348623157D308") 'double-float)) ;;; PI is needed in order to build the cross-compiler mainly so that vm-fndb ;;; can define bounds on irrational functions. -(defconstant sb-xc:pi +(defconstant pi #.(make-flonum (read-from-string "3.14159265358979323846264338327950288419716939937511L0") 'double-float)) (eval-when (:compile-toplevel :execute) (setq sb-cold::*choke-on-host-irrationals* t)) ;;; These two constants are used in 'late-type' -(defconstant sb-xc:most-positive-long-float sb-xc:most-positive-double-float) -(defconstant sb-xc:most-negative-long-float sb-xc:most-negative-double-float) +(defconstant most-positive-long-float most-positive-double-float) +(defconstant most-negative-long-float most-negative-double-float) (defun substitute-minus-zero (list) (substitute $0.0d0 @@ -851,11 +851,11 @@ (if (and (eq (flonum-format a) (flonum-format c)) (or (eq (flonum-format b) (flonum-format a)) (eq (flonum-format b) 'single-float))) - (cond ((and (eql a sb-xc:most-negative-single-float) - (eql c sb-xc:most-positive-single-float)) + (cond ((and (eql a most-negative-single-float) + (eql c most-positive-single-float)) (not (float-infinity-p b))) - ((and (eql a sb-xc:most-negative-double-float) - (eql c sb-xc:most-positive-double-float)) + ((and (eql a most-negative-double-float) + (eql c most-positive-double-float)) (not (float-infinity-p b))) (t (error "Unhandled"))) diff --git a/src/code/deadline.lisp b/src/code/deadline.lisp index d5111c0624..b8019d902c 100644 --- a/src/code/deadline.lisp +++ b/src/code/deadline.lisp @@ -32,7 +32,7 @@ (declaim (inline seconds-to-internal-time)) (defun seconds-to-internal-time (seconds) (the internal-time - (values (truncate (* seconds sb-xc:internal-time-units-per-second))))) + (values (truncate (* seconds internal-time-units-per-second))))) (eval-when (:compile-toplevel :load-toplevel :execute) ; for "#." (defconstant safe-internal-seconds-limit @@ -46,7 +46,7 @@ ;; #. is needed to make the value constant per se as opposed to ;; constant by decree, otherwise genesis runs into a problem. #.(floor (ash 1 (1- sb-kernel::internal-time-bits)) - sb-xc:internal-time-units-per-second))) + internal-time-units-per-second))) (declaim (inline seconds-to-maybe-internal-time)) (defun seconds-to-maybe-internal-time (seconds) @@ -115,7 +115,7 @@ Experimental." "Returns internal time value TIME decoded into seconds and microseconds." (declare (type internal-time time)) (multiple-value-bind (sec frac) - (truncate time sb-xc:internal-time-units-per-second) + (truncate time internal-time-units-per-second) (values sec (* frac sb-unix::micro-seconds-per-internal-time-unit)))) (defun signal-timeout (datum &rest arguments) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 6bff6d1d78..490a8caf7d 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -1905,7 +1905,7 @@ register." prev-name) (t (geti)))) ;; Keep the condition in sync with DUMP-1-VAR - (large-fixnums (>= (integer-length sb-xc:most-positive-fixnum) 62)) + (large-fixnums (>= (integer-length most-positive-fixnum) 62)) (sc+offset (if deleted 0 (if large-fixnums (ldb (byte 27 8) flags) (geti)))) (save-sc+offset (and save diff --git a/src/code/debug.lisp b/src/code/debug.lisp index 1276764ad7..3ef93ae52f 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -1644,7 +1644,7 @@ forms that explicitly control this kind of evaluation.") (show-restarts *debug-restarts* *debug-io*)) (!def-debug-command "BACKTRACE" () - (print-backtrace :count (read-if-available sb-xc:most-positive-fixnum))) + (print-backtrace :count (read-if-available most-positive-fixnum))) (!def-debug-command "PRINT" () (print-frame-call *current-frame* *debug-io*)) diff --git a/src/code/deftypes-for-target.lisp b/src/code/deftypes-for-target.lisp index 9ad4de6906..376fdd76ab 100644 --- a/src/code/deftypes-for-target.lisp +++ b/src/code/deftypes-for-target.lisp @@ -169,9 +169,9 @@ '(or list symbol classoid class)) ;;; array rank, total size... -(sb-xc:deftype array-rank () `(integer 0 (,sb-xc:array-rank-limit))) +(sb-xc:deftype array-rank () `(integer 0 (,array-rank-limit))) (sb-xc:deftype array-total-size () - `(integer 0 (,sb-xc:array-total-size-limit))) + `(integer 0 (,array-total-size-limit))) ;;; The range returned by SXHASH and PSXHASH ;;; Do not confuse this type with the type that EQ-HASH and related hash @@ -179,7 +179,7 @@ ;;; precludes us from using the entire fixnum range. Doing so avoids ;;; an extra AND operation, which is pretty much effectless in as much as ;;; the hash code is masked down to a much smaller value anyway. -(sb-xc:deftype hash-code () `(integer 0 ,sb-xc:most-positive-fixnum)) +(sb-xc:deftype hash-code () `(integer 0 ,most-positive-fixnum)) ;;; something legal in an evaluated context ;;; FIXME: could probably go away @@ -208,7 +208,7 @@ '(or float (complex float))) ;;; character components -(sb-xc:deftype char-code () `(integer 0 (,sb-xc:char-code-limit))) +(sb-xc:deftype char-code () `(integer 0 (,char-code-limit))) ;;; a consed sequence result. If a vector, is a simple array. (sb-xc:deftype consed-sequence () diff --git a/src/code/dyncount.lisp b/src/code/dyncount.lisp index e97a49bdb8..8a8d5c063a 100644 --- a/src/code/dyncount.lisp +++ b/src/code/dyncount.lisp @@ -389,7 +389,7 @@ comments from CMU CL: (defun entry-report (entries cut-off compensated compare total-cost) (let ((counter (if (and cut-off (> (length entries) cut-off)) cut-off - sb-xc:most-positive-fixnum))) + most-positive-fixnum))) (dolist (entry entries) (let* ((cost (vop-stats-cost entry)) (name (vop-stats-name entry)) diff --git a/src/code/early-array.lisp b/src/code/early-array.lisp index f7f2fce265..83127b89e0 100644 --- a/src/code/early-array.lisp +++ b/src/code/early-array.lisp @@ -9,12 +9,12 @@ (in-package "SB-IMPL") -(defconstant sb-xc:array-rank-limit 65529 +(defconstant array-rank-limit 65529 "the exclusive upper bound on the rank of an array") ;;; - 2 to leave space for the array header -(defconstant sb-xc:array-dimension-limit (- sb-xc:most-positive-fixnum 2) +(defconstant array-dimension-limit (- most-positive-fixnum 2) "the exclusive upper bound on any given dimension of an array") -(defconstant sb-xc:array-total-size-limit (- sb-xc:most-positive-fixnum 2) +(defconstant array-total-size-limit (- most-positive-fixnum 2) "the exclusive upper bound on the total number of elements in an array") diff --git a/src/code/early-cl.lisp b/src/code/early-cl.lisp index 038fe63bf7..2d1a0d8ff2 100644 --- a/src/code/early-cl.lisp +++ b/src/code/early-cl.lisp @@ -26,51 +26,51 @@ ;;; the value of an argument. Presently, legal selector values are [0..15]. ;;; BOOLE is open coded for calls with any of the constants declared below. -(defconstant sb-xc:boole-clr 0 +(defconstant boole-clr 0 "Boole function op, makes BOOLE return 0.") -(defconstant sb-xc:boole-set 1 +(defconstant boole-set 1 "Boole function op, makes BOOLE return -1.") -(defconstant sb-xc:boole-1 2 +(defconstant boole-1 2 "Boole function op, makes BOOLE return integer1.") -(defconstant sb-xc:boole-2 3 +(defconstant boole-2 3 "Boole function op, makes BOOLE return integer2.") -(defconstant sb-xc:boole-c1 4 +(defconstant boole-c1 4 "Boole function op, makes BOOLE return complement of integer1.") -(defconstant sb-xc:boole-c2 5 +(defconstant boole-c2 5 "Boole function op, makes BOOLE return complement of integer2.") -(defconstant sb-xc:boole-and 6 +(defconstant boole-and 6 "Boole function op, makes BOOLE return logand of integer1 and integer2.") -(defconstant sb-xc:boole-ior 7 +(defconstant boole-ior 7 "Boole function op, makes BOOLE return logior of integer1 and integer2.") -(defconstant sb-xc:boole-xor 8 +(defconstant boole-xor 8 "Boole function op, makes BOOLE return logxor of integer1 and integer2.") -(defconstant sb-xc:boole-eqv 9 +(defconstant boole-eqv 9 "Boole function op, makes BOOLE return logeqv of integer1 and integer2.") -(defconstant sb-xc:boole-nand 10 +(defconstant boole-nand 10 "Boole function op, makes BOOLE return log nand of integer1 and integer2.") -(defconstant sb-xc:boole-nor 11 +(defconstant boole-nor 11 "Boole function op, makes BOOLE return lognor of integer1 and integer2.") -(defconstant sb-xc:boole-andc1 12 +(defconstant boole-andc1 12 "Boole function op, makes BOOLE return logandc1 of integer1 and integer2.") -(defconstant sb-xc:boole-andc2 13 +(defconstant boole-andc2 13 "Boole function op, makes BOOLE return logandc2 of integer1 and integer2.") -(defconstant sb-xc:boole-orc1 14 +(defconstant boole-orc1 14 "Boole function op, makes BOOLE return logorc1 of integer1 and integer2.") -(defconstant sb-xc:boole-orc2 15 +(defconstant boole-orc2 15 "Boole function op, makes BOOLE return logorc2 of integer1 and integer2.") diff --git a/src/code/early-constants.lisp b/src/code/early-constants.lisp index c0b9f79441..f94afe9511 100644 --- a/src/code/early-constants.lisp +++ b/src/code/early-constants.lisp @@ -9,7 +9,7 @@ (in-package "SB-IMPL") -(defconstant-eqx sb-xc:lambda-list-keywords +(defconstant-eqx lambda-list-keywords '(&allow-other-keys &aux &body diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index 6c2e41e191..d5cbc482e0 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -16,7 +16,7 @@ ;;; A number that can represent an index into a vector, including ;;; one-past-the-end (deftype array-range () - `(integer 0 ,sb-xc:array-dimension-limit)) + `(integer 0 ,array-dimension-limit)) ;;; a type used for indexing into sequences, and for related ;;; quantities like lengths of lists and other sequences. @@ -35,13 +35,13 @@ ;;; MOST-POSITIVE-FIXNUM lets the system know it can increment a value ;;; of type INDEX without having to worry about using a bignum to ;;; represent the result. -(def!type index () `(integer 0 (,sb-xc:array-dimension-limit))) +(def!type index () `(integer 0 (,array-dimension-limit))) ;;; like INDEX, but augmented with -1 (useful when using the index ;;; to count downwards to 0, e.g. LOOP FOR I FROM N DOWNTO 0, with ;;; an implementation which terminates the loop by testing for the ;;; index leaving the loop range) -(def!type index-or-minus-1 () `(integer -1 (,sb-xc:array-dimension-limit))) +(def!type index-or-minus-1 () `(integer -1 (,array-dimension-limit))) ;;; The smallest power of two that is equal to or greater than X. (declaim (inline power-of-two-ceiling)) diff --git a/src/code/early-float.lisp b/src/code/early-float.lisp index d2a6bf64a3..c067409927 100644 --- a/src/code/early-float.lisp +++ b/src/code/early-float.lisp @@ -49,58 +49,58 @@ ) ; EVAL-WHEN ;;;; float parameters -(defconstant sb-xc:most-positive-single-float #.sb-xc:most-positive-single-float) -(defconstant sb-xc:most-negative-single-float #.sb-xc:most-negative-single-float) -(defconstant sb-xc:most-positive-double-float #.sb-xc:most-positive-double-float) -(defconstant sb-xc:most-negative-double-float #.sb-xc:most-negative-double-float) -(defconstant sb-xc:pi #.sb-xc:pi) +(defconstant most-positive-single-float #.most-positive-single-float) +(defconstant most-negative-single-float #.most-negative-single-float) +(defconstant most-positive-double-float #.most-positive-double-float) +(defconstant most-negative-double-float #.most-negative-double-float) +(defconstant pi #.pi) -(defconstant sb-xc:least-positive-single-float (single-from-bits 0 0 1)) -(defconstant sb-xc:least-positive-short-float (single-from-bits 0 0 1)) -(defconstant sb-xc:least-negative-single-float (single-from-bits 1 0 1)) -(defconstant sb-xc:least-negative-short-float (single-from-bits 1 0 1)) -(defconstant sb-xc:least-positive-double-float (double-from-bits 0 0 1)) +(defconstant least-positive-single-float (single-from-bits 0 0 1)) +(defconstant least-positive-short-float (single-from-bits 0 0 1)) +(defconstant least-negative-single-float (single-from-bits 1 0 1)) +(defconstant least-negative-short-float (single-from-bits 1 0 1)) +(defconstant least-positive-double-float (double-from-bits 0 0 1)) #-long-float -(defconstant sb-xc:least-positive-long-float (double-from-bits 0 0 1)) +(defconstant least-positive-long-float (double-from-bits 0 0 1)) #+(and long-float x86) -(defconstant sb-xc:least-positive-long-float (long-from-bits 0 0 1)) -(defconstant sb-xc:least-negative-double-float (double-from-bits 1 0 1)) +(defconstant least-positive-long-float (long-from-bits 0 0 1)) +(defconstant least-negative-double-float (double-from-bits 1 0 1)) #-long-float -(defconstant sb-xc:least-negative-long-float (double-from-bits 1 0 1)) +(defconstant least-negative-long-float (double-from-bits 1 0 1)) #+(and long-float x86) -(defconstant sb-xc:least-negative-long-float (long-from-bits 1 0 1)) +(defconstant least-negative-long-float (long-from-bits 1 0 1)) -(defconstant sb-xc:least-positive-normalized-single-float +(defconstant least-positive-normalized-single-float (single-from-bits 0 sb-vm:single-float-normal-exponent-min 0)) -(defconstant sb-xc:least-positive-normalized-short-float - sb-xc:least-positive-normalized-single-float) -(defconstant sb-xc:least-negative-normalized-single-float +(defconstant least-positive-normalized-short-float + least-positive-normalized-single-float) +(defconstant least-negative-normalized-single-float (single-from-bits 1 sb-vm:single-float-normal-exponent-min 0)) -(defconstant sb-xc:least-negative-normalized-short-float - sb-xc:least-negative-normalized-single-float) -(defconstant sb-xc:least-positive-normalized-double-float +(defconstant least-negative-normalized-short-float + least-negative-normalized-single-float) +(defconstant least-positive-normalized-double-float (double-from-bits 0 sb-vm:double-float-normal-exponent-min 0)) #-long-float -(defconstant sb-xc:least-positive-normalized-long-float - sb-xc:least-positive-normalized-double-float) +(defconstant least-positive-normalized-long-float + least-positive-normalized-double-float) #+(and long-float x86) -(defconstant sb-xc:least-positive-normalized-long-float +(defconstant least-positive-normalized-long-float (long-from-bits 0 sb-vm:long-float-normal-exponent-min (ash sb-vm:long-float-hidden-bit 32))) -(defconstant sb-xc:least-negative-normalized-double-float +(defconstant least-negative-normalized-double-float (double-from-bits 1 sb-vm:double-float-normal-exponent-min 0)) #-long-float -(defconstant sb-xc:least-negative-normalized-long-float - sb-xc:least-negative-normalized-double-float) +(defconstant least-negative-normalized-long-float + least-negative-normalized-double-float) #+(and long-float x86) -(defconstant sb-xc:least-negative-normalized-long-float +(defconstant least-negative-normalized-long-float (long-from-bits 1 sb-vm:long-float-normal-exponent-min (ash sb-vm:long-float-hidden-bit 32))) -(defconstant sb-xc:most-positive-short-float sb-xc:most-positive-single-float) -(defconstant sb-xc:most-negative-short-float sb-xc:most-negative-single-float) -(defconstant sb-xc:most-positive-long-float sb-xc:most-positive-double-float) -(defconstant sb-xc:most-negative-long-float sb-xc:most-negative-double-float) +(defconstant most-positive-short-float most-positive-single-float) +(defconstant most-negative-short-float most-negative-single-float) +(defconstant most-positive-long-float most-positive-double-float) +(defconstant most-negative-long-float most-negative-double-float) (defconstant single-float-positive-infinity #.(sb-impl::make-flonum :+infinity 'single-float)) (defconstant single-float-negative-infinity #.(sb-impl::make-flonum :-infinity 'single-float)) @@ -124,28 +124,28 @@ (long-from-bits 1 (1+ sb-vm:long-float-normal-exponent-max) (ash sb-vm:long-float-hidden-bit 32))) -(defconstant sb-xc:single-float-epsilon +(defconstant single-float-epsilon (single-from-bits 0 (- sb-vm:single-float-bias (1- sb-vm:single-float-digits)) 1)) -(defconstant sb-xc:short-float-epsilon sb-xc:single-float-epsilon) -(defconstant sb-xc:single-float-negative-epsilon +(defconstant short-float-epsilon single-float-epsilon) +(defconstant single-float-negative-epsilon (single-from-bits 0 (- sb-vm:single-float-bias sb-vm:single-float-digits) 1)) -(defconstant sb-xc:short-float-negative-epsilon sb-xc:single-float-negative-epsilon) -(defconstant sb-xc:double-float-epsilon +(defconstant short-float-negative-epsilon single-float-negative-epsilon) +(defconstant double-float-epsilon (double-from-bits 0 (- sb-vm:double-float-bias (1- sb-vm:double-float-digits)) 1)) #-long-float -(defconstant sb-xc:long-float-epsilon sb-xc:double-float-epsilon) +(defconstant long-float-epsilon double-float-epsilon) #+(and long-float x86) -(defconstant sb-xc:long-float-epsilon +(defconstant long-float-epsilon (long-from-bits 0 (- sb-vm:long-float-bias (1- sb-vm:long-float-digits)) (+ 1 (ash sb-vm:long-float-hidden-bit 32)))) -(defconstant sb-xc:double-float-negative-epsilon +(defconstant double-float-negative-epsilon (double-from-bits 0 (- sb-vm:double-float-bias sb-vm:double-float-digits) 1)) #-long-float -(defconstant sb-xc:long-float-negative-epsilon sb-xc:double-float-negative-epsilon) +(defconstant long-float-negative-epsilon double-float-negative-epsilon) #+(and long-float x86) -(defconstant sb-xc:long-float-negative-epsilon +(defconstant long-float-negative-epsilon (long-from-bits 0 (- sb-vm:long-float-bias sb-vm:long-float-digits) (+ 1 (ash sb-vm:long-float-hidden-bit 32)))) diff --git a/src/code/early-time.lisp b/src/code/early-time.lisp index b58d939870..6f4e145a8f 100644 --- a/src/code/early-time.lisp +++ b/src/code/early-time.lisp @@ -12,6 +12,6 @@ (in-package "SB-IMPL") -(defconstant sb-xc:internal-time-units-per-second 1000 +(defconstant internal-time-units-per-second 1000 "The number of internal time units that fit into a second. See GET-INTERNAL-REAL-TIME and GET-INTERNAL-RUN-TIME.") diff --git a/src/code/early-type.lisp b/src/code/early-type.lisp index a837089b88..c401da7f2a 100644 --- a/src/code/early-type.lisp +++ b/src/code/early-type.lisp @@ -314,13 +314,13 @@ (rational (rational thing)) ((float single-float) (cond #-sb-xc-host - ((<= sb-xc:most-negative-single-float thing sb-xc:most-positive-single-float) + ((<= most-negative-single-float thing most-positive-single-float) (coerce thing 'single-float)) (t (return-from coerce-numeric-bound)))) (double-float (cond #-sb-xc-host - ((<= sb-xc:most-negative-double-float thing sb-xc:most-positive-double-float) + ((<= most-negative-double-float thing most-positive-double-float) (coerce thing 'double-float)) (t (return-from coerce-numeric-bound))))))) @@ -428,14 +428,14 @@ :enumerable (if (and ,low ,high) t nil)) (integer ,(or low '*) ,(or high '*))))) (cond ((neq complexp :real) nil) - ((and (eql low 0) (eql high (1- sb-xc:array-dimension-limit))) - (int-type 0 #.(1- sb-xc:array-dimension-limit))) ; INDEX type + ((and (eql low 0) (eql high (1- array-dimension-limit))) + (int-type 0 #.(1- array-dimension-limit))) ; INDEX type ((null high) (cond ((not low) (int-type nil nil)) ((eql low 0) (int-type 0 nil)) - ((eql low (1+ sb-xc:most-positive-fixnum)) + ((eql low (1+ most-positive-fixnum)) ;; positive bignum - (int-type #.(1+ sb-xc:most-positive-fixnum) nil)))) + (int-type #.(1+ most-positive-fixnum) nil)))) ((or (eql high most-positive-word) ;; is (1+ high) a power-of-2 ? (and (typep high 'word) (zerop (logand (1+ high) high)))) @@ -445,9 +445,9 @@ ((and (< high most-positive-word) (eql low (lognot high))) (svref (literal-ctype-vector *interned-signed-byte-types*) (integer-length (truly-the word high)))))) - ((and (not low) (eql high (1- sb-xc:most-negative-fixnum))) + ((and (not low) (eql high (1- most-negative-fixnum))) ;; negative bignum - (int-type nil #.(1- sb-xc:most-negative-fixnum)))))) + (int-type nil #.(1- most-negative-fixnum)))))) (rational (cond ((and (eq complexp :real) (bounds-unbounded-p low high)) (literal-ctype (interned-numeric-type nil :class 'rational) @@ -497,10 +497,10 @@ (setf pairs (cdr pairs))) else do (return nil)) (cond - ((>= low sb-xc:char-code-limit)) + ((>= low char-code-limit)) ((< high 0)) (t (push (cons (max 0 low) - (min high (1- sb-xc:char-code-limit))) + (min high (1- char-code-limit))) result)))))))) (unless pairs (return-from make-character-set-type *empty-type*)) @@ -514,14 +514,14 @@ (let* ((pair (car pairs)) (low (car pair)) (high (cdr pair))) - (cond ((eql high (1- sb-xc:char-code-limit)) + (cond ((eql high (1- char-code-limit)) (cond ((eql low 0) - (range 0 #.(1- sb-xc:char-code-limit) + (range 0 #.(1- char-code-limit) (sb-vm::saetp-index-or-lose 'character))) #+sb-unicode ((eql low base-char-code-limit) (range #.base-char-code-limit - #.(1- sb-xc:char-code-limit))))) + #.(1- char-code-limit))))) #+sb-unicode ((and (eql low 0) (eql high (1- base-char-code-limit))) (range 0 #.(1- base-char-code-limit) @@ -576,15 +576,15 @@ ;; FIXNUM is its own thing, why? See comment in vm-array ;; saying to "See the comment in PRIMITIVE-TYPE-AUX" ((eql fixnum) ; One good kludge deserves another. - (integer-range sb-xc:most-negative-fixnum - sb-xc:most-positive-fixnum)) + (integer-range most-negative-fixnum + most-positive-fixnum)) ((member single-float double-float) (make-numeric-type :class 'float :format x :complexp :real)) ((cons (eql complex)) (make-numeric-type :class 'float :format (cadr x) :complexp :complex)) ((eql character) - (make-character-set-type `((0 . ,(1- sb-xc:char-code-limit))))) + (make-character-set-type `((0 . ,(1- char-code-limit))))) #+sb-unicode ((eql base-char) (make-character-set-type `((0 . ,(1- base-char-code-limit))))) diff --git a/src/code/external-formats/enc-basic.lisp b/src/code/external-formats/enc-basic.lisp index 737f6e6a6d..2648cb53b6 100644 --- a/src/code/external-formats/enc-basic.lisp +++ b/src/code/external-formats/enc-basic.lisp @@ -118,7 +118,7 @@ (declaim (inline char-len-as-utf8)) (defun char-len-as-utf8 (code) (declare (optimize speed (safety 0)) - (type (integer 0 (#.sb-xc:char-code-limit)) code)) + (type (integer 0 (#.char-code-limit)) code)) (cond ((< code 0) (bug "can't happen")) ((< code #x80) 1) ((< code #x800) 2) @@ -218,7 +218,7 @@ `(progn ;;(declaim (inline ,name)) (let ((lexically-max - (string->utf8 (string (code-char ,(1- sb-xc:char-code-limit))) + (string->utf8 (string (code-char ,(1- char-code-limit))) 0 1 0))) (declare (type (simple-array (unsigned-byte 8) (#+sb-unicode 4 #-sb-unicode 2)) lexically-max)) (defun ,name (array pos end) diff --git a/src/code/external-formats/enc-ucs.lisp b/src/code/external-formats/enc-ucs.lisp index de9d0e7bd0..91496aeacf 100644 --- a/src/code/external-formats/enc-ucs.lisp +++ b/src/code/external-formats/enc-ucs.lisp @@ -347,7 +347,7 @@ (dpb (cref 3) (byte 8 24) (dpb (cref 2) (byte 8 16) (dpb (cref 1) (byte 8 8) (cref 0)))))))) - (if (< code sb-xc:char-code-limit) + (if (< code char-code-limit) (code-char code) (decoding-error array pos (+ pos bytes) :ucs-4le 'octet-decoding-error pos)))) @@ -366,7 +366,7 @@ (dpb (cref 0) (byte 8 24) (dpb (cref 1) (byte 8 16) (dpb (cref 2) (byte 8 8) (cref 3)))))))) - (if (< code sb-xc:char-code-limit) + (if (< code char-code-limit) (code-char code) (decoding-error array pos (+ pos bytes) :ucs-4be 'octet-decoding-error pos))))))) @@ -424,7 +424,7 @@ (setf (sap-ref-32le sap tail) bits) 4 (let ((code (sap-ref-32le sap head))) - (if (< code sb-xc:char-code-limit) + (if (< code char-code-limit) (code-char code) (return-from decode-break-reason 4))) ucs-4le->string-aref @@ -436,7 +436,7 @@ (setf (sap-ref-32be sap tail) bits) 4 (let ((code (sap-ref-32be sap head))) - (if (< code sb-xc:char-code-limit) + (if (< code char-code-limit) (code-char code) (return-from decode-break-reason 4))) ucs-4be->string-aref diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index 54ea51560d..cab40552d1 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -1606,7 +1606,7 @@ (let* ((stream ,name) (size 0) (head 0) (byte 0) (char nil) (decode-break-reason nil) - (length (dotimes (count (1- sb-xc:array-dimension-limit) count) + (length (dotimes (count (1- array-dimension-limit) count) (setf decode-break-reason (block decode-break-reason (setf byte (sap-ref-8 sap head) diff --git a/src/code/float.lisp b/src/code/float.lisp index 12dba358bb..454ffd5fcd 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -712,8 +712,8 @@ ((integer) number) ((ratio) (values (truncate (numerator number) (denominator number)))) (((foreach single-float double-float #+long-float long-float)) - (if (and (<= (float sb-xc:most-negative-fixnum number) number) - (< number (float sb-xc:most-positive-fixnum number))) + (if (and (<= (float most-negative-fixnum number) number) + (< number (float most-positive-fixnum number))) (truly-the fixnum (%unary-truncate number)) (multiple-value-bind (bits exp) (integer-decode-float number) (let ((res (ash bits exp))) @@ -724,8 +724,8 @@ ;;; Specialized versions for floats. (macrolet ((def (type name) `(defun ,name (number) - (if (and (<= ,(coerce sb-xc:most-negative-fixnum type) number) - (< number ,(coerce sb-xc:most-positive-fixnum type))) + (if (and (<= ,(coerce most-negative-fixnum type) number) + (< number ,(coerce most-positive-fixnum type))) (truly-the fixnum (,name number)) ;; General -- slow -- case. (multiple-value-bind (bits exp) (integer-decode-float number) @@ -749,9 +749,9 @@ ((integer) number) ((ratio) (values (round (numerator number) (denominator number)))) (((foreach single-float double-float #+long-float long-float)) - (if (< (float sb-xc:most-negative-fixnum number) + (if (< (float most-negative-fixnum number) number - (float sb-xc:most-positive-fixnum number)) + (float most-positive-fixnum number)) (truly-the fixnum (%unary-round number)) (multiple-value-bind (bits exp) (integer-decode-float number) (let* ((shifted (ash bits exp)) diff --git a/src/code/fop.lisp b/src/code/fop.lisp index 1ce6750717..61880bec44 100644 --- a/src/code/fop.lisp +++ b/src/code/fop.lisp @@ -127,7 +127,7 @@ (flet ((read-varint () (loop for shift :of-type (integer 0 28) from 0 by 7 ; position in integer for octet = (fast-read-byte) - for accum :of-type (mod #.sb-xc:char-code-limit) + for accum :of-type (mod #.char-code-limit) = (logand octet #x7F) then (logior (ash (logand octet #x7F) shift) accum) unless (logbitp 7 octet) return accum))) diff --git a/src/code/irrat.lisp b/src/code/irrat.lisp index 9213fb35e1..272b6e94ad 100644 --- a/src/code/irrat.lisp +++ b/src/code/irrat.lisp @@ -253,7 +253,7 @@ (when (< x-hi 0) (cond ((and (= x-ihi #x3ff00000) (zerop yisint)) ;; (-1)**non-int - (let ((y*pi (* y sb-xc:pi))) + (let ((y*pi (* y pi))) (declare (double-float y*pi)) (return-from real-expt (complex @@ -276,7 +276,7 @@ (2 ; even (coerce pow rtype)) (t ; non-integer - (let ((y*pi (* y sb-xc:pi))) + (let ((y*pi (* y pi))) (declare (double-float y*pi)) (complex (coerce (* pow (%cos y*pi)) @@ -375,11 +375,11 @@ (number-dispatch ((number number)) (((foreach fixnum bignum)) (if (minusp number) - (complex (log (- number)) (coerce sb-xc:pi 'single-float)) + (complex (log (- number)) (coerce pi 'single-float)) (coerce (/ (log2 number) (log (exp $1.0d0) $2.0d0)) 'single-float))) ((ratio) (if (minusp number) - (complex (log (- number)) (coerce sb-xc:pi 'single-float)) + (complex (log (- number)) (coerce pi 'single-float)) (let ((numerator (numerator number)) (denominator (denominator number))) (if (= (integer-length numerator) @@ -394,7 +394,7 @@ ;; Since this doesn't seem to be an implementation issue ;; I (pw) take the Kahan result. (if (= (float-sign-bit number) 1) ; MINUSP - (complex (log (- number)) (coerce sb-xc:pi '(dispatch-type number))) + (complex (log (- number)) (coerce pi '(dispatch-type number))) (coerce (%log (coerce number 'double-float)) '(dispatch-type number)))) ((complex) @@ -449,15 +449,15 @@ (number-dispatch ((number number)) ((rational) (if (minusp number) - (coerce sb-xc:pi 'single-float) + (coerce pi 'single-float) $0.0f0)) ((single-float) (if (minusp (float-sign number)) - (coerce sb-xc:pi 'single-float) + (coerce pi 'single-float) $0.0f0)) ((double-float) (if (minusp (float-sign number)) - (coerce sb-xc:pi 'double-float) + (coerce pi 'double-float) $0.0d0)) (handle-complex (atan (imagpart number) (realpart number))))) @@ -548,8 +548,8 @@ (if (zerop y) (if (= (float-sign-bit x) 0) ; PLUSP y - (float-sign y sb-xc:pi)) - (float-sign y (sb-xc:/ sb-xc:pi 2))) + (float-sign y pi)) + (float-sign y (sb-xc:/ pi 2))) (%atan2 y x)))) (number-dispatch ((y real) (x real)) ((double-float @@ -909,9 +909,9 @@ (declare (muffle-conditions compiler-note)) (declare (type (or rational complex) z)) (let* (;; constants - (theta (sb-xc:/ (sb-xc:sqrt sb-xc:most-positive-double-float) $4.0d0)) - (rho (sb-xc:/ $4.0d0 (sb-xc:sqrt sb-xc:most-positive-double-float))) - (half-pi (sb-xc:/ sb-xc:pi $2.0d0)) + (theta (sb-xc:/ (sb-xc:sqrt most-positive-double-float) $4.0d0)) + (rho (sb-xc:/ $4.0d0 (sb-xc:sqrt most-positive-double-float))) + (half-pi (sb-xc:/ pi $2.0d0)) (rp (float (realpart z) $1.0d0)) (beta (float-sign rp $1.0d0)) (x (* beta rp)) diff --git a/src/code/late-extensions.lisp b/src/code/late-extensions.lisp index 54a98114ee..764188b287 100644 --- a/src/code/late-extensions.lisp +++ b/src/code/late-extensions.lisp @@ -58,7 +58,7 @@ "Read the content of STREAM into a buffer in order to count lines and columns." (unless (and old-position position - (< position sb-xc:array-dimension-limit)) + (< position array-dimension-limit)) (return-from read-content)) (let ((content (make-string position :element-type (stream-element-type stream)))) diff --git a/src/code/late-format.lisp b/src/code/late-format.lisp index 14e1a706b5..61cf86e5f8 100644 --- a/src/code/late-format.lisp +++ b/src/code/late-format.lisp @@ -1436,7 +1436,7 @@ ((not (directive-colonp close)) (values 0 0 directives)) ((directive-atsignp justification) - (values 0 sb-xc:call-arguments-limit directives)) + (values 0 call-arguments-limit directives)) ;; FIXME: here we could assert that the ;; corresponding argument was a list. (t (values 1 1 remaining)))))) @@ -1472,7 +1472,7 @@ ;; a format control (either a function or a string). (if (directive-atsignp iteration) (values (if (zerop posn) 1 0) - sb-xc:call-arguments-limit + call-arguments-limit remaining) ;; FIXME: the argument corresponding to this ;; directive must be a list. @@ -1483,7 +1483,7 @@ (loop (let ((directive (pop directives))) (when (null directive) - (return (values min (min max sb-xc:call-arguments-limit)))) + (return (values min (min max call-arguments-limit)))) (when (format-directive-p directive) (incf-both (count :arg (directive-params directive) :key #'cdr)) @@ -1508,7 +1508,7 @@ (cond ((directive-atsignp directive) (incf min) - (setq max sb-xc:call-arguments-limit)) + (setq max call-arguments-limit)) (t (incf-both 2)))) (t (throw 'give-up-format-string-walk nil)))))))))) (catch 'give-up-format-string-walk diff --git a/src/code/late-type.lisp b/src/code/late-type.lisp index d26fc527e6..f78316b901 100644 --- a/src/code/late-type.lisp +++ b/src/code/late-type.lisp @@ -581,11 +581,11 @@ (etypecase type (named-type (ecase (named-type-name type) - ((t *) sb-xc:call-arguments-limit) + ((t *) call-arguments-limit) ((nil) 0))) (values-type (if (values-type-rest type) - sb-xc:call-arguments-limit + call-arguments-limit (+ (length (values-type-optional type)) (length (values-type-required type))))))) @@ -1908,8 +1908,8 @@ `(unsigned-byte ,high-length)) (t `(mod ,(1+ high))))) - ((and (= low sb-xc:most-negative-fixnum) - (= high sb-xc:most-positive-fixnum)) + ((and (= low most-negative-fixnum) + (= high most-positive-fixnum)) 'fixnum) ((and (= low (lognot high)) (= high-count high-length) @@ -2299,8 +2299,8 @@ used for a COMPLEX component.~:@>" (if (listp bound) (list coerced) coerced)))) (defun inner-coerce-real-bound (bound type upperp) - (let ((nl sb-xc:most-negative-long-float) - (pl sb-xc:most-positive-long-float)) + (let ((nl most-negative-long-float) + (pl most-positive-long-float)) (let ((nbound (if (listp bound) (car bound) bound))) (ecase type (rational @@ -2320,10 +2320,10 @@ used for a COMPLEX component.~:@>" (make-bound (coerce nbound 'long-float))))))))) (defun inner-coerce-float-bound (bound type upperp) - (let ((nd sb-xc:most-negative-double-float) - (pd sb-xc:most-positive-double-float) - (ns sb-xc:most-negative-single-float) - (ps sb-xc:most-positive-single-float)) + (let ((nd most-negative-double-float) + (pd most-positive-double-float) + (ns most-negative-single-float) + (ps most-positive-single-float)) (let ((nbound (if (listp bound) (car bound) bound))) (ecase type (single-float @@ -2444,11 +2444,11 @@ used for a COMPLEX component.~:@>" (let ((res (cond ((and format (subtypep format 'double-float)) - (if (sb-xc:<= sb-xc:most-negative-double-float cx sb-xc:most-positive-double-float) + (if (sb-xc:<= most-negative-double-float cx most-positive-double-float) (coerce cx format) nil)) (t - (if (sb-xc:<= sb-xc:most-negative-single-float cx sb-xc:most-positive-single-float) + (if (sb-xc:<= most-negative-single-float cx most-positive-single-float) ;; FIXME: bug #389 (coerce cx (or format 'single-float)) nil))))) @@ -2920,17 +2920,17 @@ used for a COMPLEX component.~:@>" (integer (when (minusp dims) (error "Arrays can't have a negative number of dimensions: ~S" dims)) - (when (>= dims sb-xc:array-rank-limit) + (when (>= dims array-rank-limit) (error "array type with too many dimensions: ~S" dims)) (make-list dims :initial-element '*)) (list - (when (>= (length dims) sb-xc:array-rank-limit) + (when (>= (length dims) array-rank-limit) (error "array type with too many dimensions: ~S" dims)) (dolist (dim dims) (unless (eq dim '*) (unless (and (integerp dim) (>= dim 0) - (< dim sb-xc:array-dimension-limit)) + (< dim array-dimension-limit)) (error "bad dimension in array type: ~S" dim)))) dims) (t @@ -3646,19 +3646,19 @@ used for a COMPLEX component.~:@>" ;;;; CHARACTER-SET types (def-type-translator character-set - (&optional (pairs `((0 . ,(1- sb-xc:char-code-limit))))) + (&optional (pairs `((0 . ,(1- char-code-limit))))) (make-character-set-type pairs)) (define-type-method (character-set :negate) (type) (let ((pairs (character-set-type-pairs type))) (if (and (= (length pairs) 1) (= (caar pairs) 0) - (= (cdar pairs) (1- sb-xc:char-code-limit))) + (= (cdar pairs) (1- char-code-limit))) (make-negation-type type) (let ((not-character (make-negation-type (make-character-set-type - `((0 . ,(1- sb-xc:char-code-limit))))))) + `((0 . ,(1- char-code-limit))))))) (type-union not-character (make-character-set-type @@ -3669,9 +3669,9 @@ used for a COMPLEX component.~:@>" (high1 (cdar tail) (cdar tail)) (low2 (caadr tail) (caadr tail))) ((null (cdr tail)) - (when (< (cdar tail) (1- sb-xc:char-code-limit)) + (when (< (cdar tail) (1- char-code-limit)) (push (cons (1+ (cdar tail)) - (1- sb-xc:char-code-limit)) + (1- char-code-limit)) not-pairs)) (nreverse not-pairs)) (push (cons (1+ high1) (1- low2)) not-pairs))))))))) diff --git a/src/code/loop.lisp b/src/code/loop.lisp index 91669c4dfc..7006fd7e82 100644 --- a/src/code/loop.lisp +++ b/src/code/loop.lisp @@ -177,7 +177,7 @@ constructed. (declaim (sb-ext:freeze-type loop-minimax)) (defconstant-eqx +loop-minimax-type-infinities-alist+ - '((fixnum sb-xc:most-positive-fixnum sb-xc:most-negative-fixnum) + '((fixnum most-positive-fixnum most-negative-fixnum) (single-float sb-ext:single-float-positive-infinity sb-ext:single-float-negative-infinity) (double-float sb-ext:double-float-positive-infinity sb-ext:double-float-negative-infinity)) #'equal) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index adc6718427..257951ea3f 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -824,8 +824,8 @@ symbol-case giving up: case=((V U) (F)) (flet ((try-one-byte () (let ((best-answer nil) ;; "best" means smallest - (best-max-bin-count sb-xc:most-positive-fixnum) ; sentinel value - (best-average sb-xc:most-positive-fixnum)) + (best-max-bin-count most-positive-fixnum) ; sentinel value + (best-average most-positive-fixnum)) (loop named try for nbits from smallest-nbits to largest-nbits do (let ((bin-counts (make-array (ash 1 nbits) :initial-element 0))) @@ -834,8 +834,8 @@ symbol-case giving up: case=((V U) (F)) finally (return-from try (values best-max-bin-count best-answer))))) (try-two-bytes () (let ((best-answer nil) - (best-max-bin-count sb-xc:most-positive-fixnum) - (best-average sb-xc:most-positive-fixnum)) + (best-max-bin-count most-positive-fixnum) + (best-average most-positive-fixnum)) (loop named try for nbits from smallest-nbits to largest-nbits do (let ((bin-counts (make-array (ash 1 nbits) :initial-element 0))) diff --git a/src/code/maphash.lisp b/src/code/maphash.lisp index 89255af986..bc3f2fa5f3 100644 --- a/src/code/maphash.lisp +++ b/src/code/maphash.lisp @@ -22,7 +22,7 @@ ;;; like INDEX, but only up to half the maximum. Used by hash-table ;;; code that does plenty to (aref v (* 2 i)) and (aref v (1+ (* 2 i))). -(deftype index/2 () `(integer 0 (,(floor sb-xc:array-dimension-limit 2)))) +(deftype index/2 () `(integer 0 (,(floor array-dimension-limit 2)))) ;;; The high water mark is an element of the pairs vector, and not ;;; a slot in the table. diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index e37ea0b6cc..4ad011bb91 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -795,8 +795,8 @@ and the number of 0 bits if INTEGER is negative." (fixnum (logcount #-x86-64 (truly-the (integer 0 - #.(max sb-xc:most-positive-fixnum - (lognot sb-xc:most-negative-fixnum))) + #.(max most-positive-fixnum + (lognot most-negative-fixnum))) (if (minusp (truly-the fixnum integer)) (lognot (truly-the fixnum integer)) integer)) @@ -1057,7 +1057,7 @@ and the number of 0 bits if INTEGER is negative." (setq v (- temp))) (setq temp (- u v)) (when (zerop temp) - (return (the (integer 0 #.(1+ sb-xc:most-positive-fixnum)) (ash u k))))))) + (return (the (integer 0 #.(1+ most-positive-fixnum)) (ash u k))))))) (declare (type (mod #.sb-vm:n-word-bits) k) (type sb-vm:signed-word u v))))) @@ -1197,7 +1197,7 @@ and the number of 0 bits if INTEGER is negative." (significant-half (ash ,arg (- (ash fourth-size 1)))) (significant-half-isqrt (if-fixnum-p-truly-the - (integer 1 #.(isqrt sb-xc:most-positive-fixnum)) + (integer 1 #.(isqrt most-positive-fixnum)) (,recurse significant-half))) (zeroth-iteration (ash significant-half-isqrt fourth-size))) diff --git a/src/code/pred.lisp b/src/code/pred.lisp index f6da6e4d57..9233ea4e09 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -215,10 +215,10 @@ (cond ((<= 0 object 1) 'bit) ((< object 0) 'fixnum) - (t `(integer 0 ,sb-xc:most-positive-fixnum)))) + (t `(integer 0 ,most-positive-fixnum)))) (integer (if (>= object 0) - `(integer ,(1+ sb-xc:most-positive-fixnum)) + `(integer ,(1+ most-positive-fixnum)) 'bignum)) (character (typecase object diff --git a/src/code/quantifiers.lisp b/src/code/quantifiers.lisp index 85f442d30d..f571d805f9 100644 --- a/src/code/quantifiers.lisp +++ b/src/code/quantifiers.lisp @@ -15,7 +15,7 @@ ;;; arbitrary sequence arguments, both in the full call case and in ;;; the open code case. (flet ((expand (pred sequences test found-result unfound-result) - (unless (proper-list-of-length-p sequences 1 sb-xc:call-arguments-limit) + (unless (proper-list-of-length-p sequences 1 call-arguments-limit) (return-from expand (values nil t))) ; give up (binding* ((elements (make-gensym-list (length sequences))) ((bind-fun call-it) (funarg-bind/call-forms pred elements)) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index f06e2066cc..72cb29ce0d 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -32,12 +32,12 @@ `((count nil nil (etypecase count - (null (1- sb-xc:most-positive-fixnum)) + (null (1- most-positive-fixnum)) (fixnum (max 0 count)) (integer (if (minusp count) 0 - (1- sb-xc:most-positive-fixnum)))) - (mod #.sb-xc:most-positive-fixnum)) + (1- most-positive-fixnum)))) + (mod #.most-positive-fixnum)) ;; Entries for {start,end}{,1,2} ,@(mapcan (lambda (names) (destructuring-bind (start end length sequence) names diff --git a/src/code/string-hash.lisp b/src/code/string-hash.lisp index 4e56c901a8..5a55231445 100644 --- a/src/code/string-hash.lisp +++ b/src/code/string-hash.lisp @@ -53,7 +53,7 @@ (set-result (+ result (ash result 3))) (set-result (logxor result (ash result -11))) (set-result (logxor result (ash result 15))) - (logand result sb-xc:most-positive-fixnum)))) + (logand result most-positive-fixnum)))) ;;; test: ;;; (let ((ht (make-hash-table :test 'equal))) ;;; (do-all-symbols (symbol) @@ -122,10 +122,10 @@ ;; search starting from 2^60*pi. The multiplication should be ;; efficient no matter what the platform thanks to modular ;; arithmetic. - (let* ((mul (logand 3622009729038463111 sb-xc:most-positive-fixnum)) - (xor (logand 608948948376289905 sb-xc:most-positive-fixnum)) - (xy (logand (+ (* x mul) y) sb-xc:most-positive-fixnum))) - (logand (logxor xor xy (ash xy -5)) sb-xc:most-positive-fixnum))) + (let* ((mul (logand 3622009729038463111 most-positive-fixnum)) + (xor (logand 608948948376289905 most-positive-fixnum)) + (xy (logand (+ (* x mul) y) most-positive-fixnum))) + (logand (logxor xor xy (ash xy -5)) most-positive-fixnum))) ;;; Same as above, but don't mask computations to n-positive-fixnum-bits. (declaim (inline word-mix)) @@ -185,14 +185,14 @@ ;;; an extra right-shift to remove bits that lack any randomness. CACHE-MASK can be ;;; reworked to examine bits other than at the low end. (defun hash-layout-name (name) - (let ((limit (1+ (ash sb-xc:most-positive-fixnum -1)))) + (let ((limit (1+ (ash most-positive-fixnum -1)))) (declare (notinline random)) (logior (if (typep name '(and symbol (not null))) (flet ((improve-hash (x) (#+64-bit murmur3-fmix64 #-64-bit murmur3-fmix32 x))) (mix (logand (improve-hash (sb-impl::%sxhash-simple-string (symbol-name name))) - sb-xc:most-positive-fixnum) + most-positive-fixnum) (let ((package (sb-xc:symbol-package name))) (sb-impl::%sxhash-simple-string ;; Must specifically look for CL package when cross-compiling diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index b70c544079..f5a92cfd5e 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -88,7 +88,7 @@ distinct from the global value. Can also be SETF." (return-from compute-symbol-hash (sxhash nil))) ;; And make a symbol's hash not the same as (sxhash name) in general. (let ((sxhash (logxor (%sxhash-simple-substring string 0 length) - sb-xc:most-positive-fixnum))) + most-positive-fixnum))) ;; The low 32 bits of the word in memory should have at least a 1 bit somewhere. ;; If not, OR in a constant value. (if (ldb-test (byte (- 32 sb-vm:n-fixnum-tag-bits) 0) sxhash) diff --git a/src/code/target-char.lisp b/src/code/target-char.lisp index 4f254a219a..59abf01916 100644 --- a/src/code/target-char.lisp +++ b/src/code/target-char.lisp @@ -19,7 +19,7 @@ digit-char-p)) (deftype char-code () - `(integer 0 (,sb-xc:char-code-limit))) + `(integer 0 (,char-code-limit))) (define-load-time-global **unicode-character-name-huffman-tree** ()) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 4ce1591743..826547f1a4 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -199,7 +199,7 @@ (write name :stream stream) (do ((index 0 (1+ index)) (limit (or (and (not *print-readably*) *print-length*) - sb-xc:most-positive-fixnum)) + most-positive-fixnum)) (remaining-slots (dd-slots dd) (cdr remaining-slots))) ((or (null remaining-slots) (>= index limit)) (write-string (if remaining-slots " ...)" ")") stream)) diff --git a/src/code/target-extensions.lisp b/src/code/target-extensions.lisp index 7e010303e0..077de6b85c 100644 --- a/src/code/target-extensions.lisp +++ b/src/code/target-extensions.lisp @@ -148,8 +148,8 @@ these hooks.") `(let* ((,size ,initial-size) (,string (make-array ,size :element-type ',element-type)) (,pointer 0)) - (declare (type (integer 0 ,sb-xc:array-dimension-limit) ,size) - (type (integer 0 ,(1- sb-xc:array-dimension-limit)) ,pointer) + (declare (type (integer 0 ,array-dimension-limit) ,size) + (type (integer 0 ,(1- array-dimension-limit)) ,pointer) (type (simple-array ,element-type (*)) ,string)) (flet ((push-char (char) (declare (optimize (sb-c::insert-array-bounds-checks 0))) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index f5de6b740f..1d647d0048 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -211,7 +211,7 @@ (ash (ldb (byte pkgnick-index-bits 0) token) 1)))))) ;;; This would have to be bumped ~ 2*most-positive-fixnum times to overflow. -(define-load-time-global *package-names-cookie* sb-xc:most-negative-fixnum) +(define-load-time-global *package-names-cookie* most-negative-fixnum) (declaim (fixnum *package-names-cookie*)) (defmacro with-package-names ((table-var &key) &body body) diff --git a/src/code/target-random.lisp b/src/code/target-random.lisp index 4988bd049e..cb33a2b5fd 100644 --- a/src/code/target-random.lisp +++ b/src/code/target-random.lisp @@ -392,7 +392,7 @@ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ;;; the multiplier and one to bring the result into the correct range). #-sb-fluid (declaim (inline %random-fixnum)) (defun %random-fixnum (arg state) - (declare (type (integer 1 #.sb-xc:most-positive-fixnum) arg) + (declare (type (integer 1 #.most-positive-fixnum) arg) (type random-state state)) (if (= arg 1) 0 diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index c51961b14e..512a8afd1a 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -111,7 +111,7 @@ (get-lisp-obj-address instance)))) ;; perturb the address (logand (#+64-bit murmur3-fmix64 #-64-bit murmur3-fmix32 addr) - sb-xc:most-positive-fixnum))) + most-positive-fixnum))) (declaim (inline instance-sxhash)) (defun instance-sxhash (instance) @@ -442,7 +442,7 @@ ;; Access as unsigned. +X and -X hash differently because ;; of 2's complement, so disregarding the sign bit is fine. (mixf result (logand (%raw-instance-ref/word key i) - sb-xc:most-positive-fixnum))) + most-positive-fixnum))) (,(1+index-of 'single-float) ,(mix-float '(%raw-instance-ref/single key i) $0f0)) (,(1+index-of 'double-float) @@ -524,8 +524,8 @@ ;; it didn't.) (sxhash val))) (macrolet ((hash-float (type key) - (let ((lo (coerce sb-xc:most-negative-fixnum type)) - (hi (coerce sb-xc:most-positive-fixnum type))) + (let ((lo (coerce most-negative-fixnum type)) + (hi (coerce most-positive-fixnum type))) `(let ((key ,key)) (cond ( ;; This clause allows FIXNUM-sized integer ;; values to be handled without consing. @@ -563,9 +563,9 @@ (double-float (hash-float double-float key)) #+long-float (long-float (error "LONG-FLOAT not currently supported"))))) - (rational (if (and (<= sb-xc:most-negative-double-float + (rational (if (and (<= most-negative-double-float key - sb-xc:most-positive-double-float) + most-positive-double-float) (= (coerce key 'double-float) key)) (sxhash-double-float (coerce key 'double-float)) (sxhash key))) @@ -596,7 +596,7 @@ (declare (fixnum depthoid)) (cond ((atom x) (sxhash x)) ((zerop depthoid) - #.(logand sb-xc:most-positive-fixnum #36Rglobaldbsxhashoid)) + #.(logand most-positive-fixnum #36Rglobaldbsxhashoid)) (t (mix (recurse (car x) (1- depthoid)) (recurse (cdr x) (1- depthoid))))))) (traverse 0 name 10)))) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 3572a6d64b..559441f2d2 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -597,9 +597,9 @@ HOLDING-MUTEX-P." (loop with max-ticks = (max 100000 (min (* 2 try-ticks) (expt 10 7))) for scale of-type fixnum = 1 - then (let ((x (logand sb-xc:most-positive-fixnum (* 2 scale)))) + then (let ((x (logand most-positive-fixnum (* 2 scale)))) (if (> scale x) - sb-xc:most-positive-fixnum + most-positive-fixnum x)) do (try) (let* ((now (get-tick)) @@ -661,13 +661,13 @@ returns NIL each time." (,deadline (when ,sec (+ (get-internal-real-time) - (round (* ,seconds sb-xc:internal-time-units-per-second)))))) + (round (* ,seconds internal-time-units-per-second)))))) (flet ((,name () (when ,deadline (let ((,time-left (- ,deadline (get-internal-real-time)))) (if (plusp ,time-left) (* (coerce ,time-left 'single-float) - (sb-xc:/ $1.0f0 sb-xc:internal-time-units-per-second)) + (sb-xc:/ $1.0f0 internal-time-units-per-second)) 0))))) ,@body)))) @@ -1151,7 +1151,7 @@ must be held by this thread during this call." ;; On a 64-bit platform truncating M-P-F to an int ;; results in -1, which wakes up only one thread. (ldb (byte 29 0) - sb-xc:most-positive-fixnum))) + most-positive-fixnum))) ;;;; Semaphores @@ -2404,7 +2404,7 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." ;; (raw value) manifesting in Lisp as a fixnum. ;; The sign bit of sb-vm::*free-tls-index* is a semaphore, ;; except on PPC where it isn't, but masking is fine in any case. - (do ((index (- (ash (logand sb-vm::*free-tls-index* sb-xc:most-positive-fixnum) + (do ((index (- (ash (logand sb-vm::*free-tls-index* most-positive-fixnum) sb-vm:n-fixnum-tag-bits) sb-vm:n-word-bytes) (- index sb-vm:n-word-bytes)) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 7644e42c23..1dba0c5f61 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -41,7 +41,7 @@ #+sb-unicode :size #+sb-unicode (length data)))) (loop for (source . target) in data when (and #-sb-unicode - (< source sb-xc:char-code-limit)) + (< source char-code-limit)) do (flet ((minimize (x) (case (length x) (1 diff --git a/src/code/timer.lisp b/src/code/timer.lisp index dd324598e2..d02c8112d7 100644 --- a/src/code/timer.lisp +++ b/src/code/timer.lisp @@ -205,7 +205,7 @@ from now. For timers with a repeat interval it returns true." ;;; real time conversion (defun delta->real (delta) - (floor (* delta sb-xc:internal-time-units-per-second))) + (floor (* delta internal-time-units-per-second))) ;;; Public interface @@ -403,8 +403,8 @@ triggers." (let ((min-nsec 100000)) (if (minusp time) (values 0 min-nsec) - (multiple-value-bind (s u) (floor time sb-xc:internal-time-units-per-second) - (setf u (floor (* (/ u sb-xc:internal-time-units-per-second) + (multiple-value-bind (s u) (floor time internal-time-units-per-second) + (setf u (floor (* (/ u internal-time-units-per-second) #.(expt 10 9)))) (if (and (= 0 s) (< u min-nsec)) ;; 0 0 means "shut down the timer" for setitimer diff --git a/src/code/toplevel.lisp b/src/code/toplevel.lisp index 5cefa8ae3e..c69778e882 100644 --- a/src/code/toplevel.lisp +++ b/src/code/toplevel.lisp @@ -188,9 +188,9 @@ means to wait indefinitely.") $1f9))))))) (declare (inline split-float)) (typecase seconds - ((single-float $0f0 #.(float sb-xc:most-positive-fixnum $1f0)) + ((single-float $0f0 #.(float most-positive-fixnum $1f0)) (split-float)) - ((double-float $0d0 #.(float sb-xc:most-positive-fixnum $1d0)) + ((double-float $0d0 #.(float most-positive-fixnum $1d0)) (split-float)) (ratio (split-ratio-for-sleep seconds)) @@ -250,11 +250,11 @@ any non-negative real number." ;; use the largest representable value in that case. (timeout (or (seconds-to-maybe-internal-time seconds) (* safe-internal-seconds-limit - sb-xc:internal-time-units-per-second)))) + internal-time-units-per-second)))) (labels ((sleep-for-a-bit (remaining) (multiple-value-bind (timeout-sec timeout-usec stop-sec stop-usec deadlinep) - (decode-timeout (/ remaining sb-xc:internal-time-units-per-second)) + (decode-timeout (/ remaining internal-time-units-per-second)) (declare (ignore stop-sec stop-usec)) ;; Sleep until either the timeout or the deadline ;; expires. diff --git a/src/code/unix.lisp b/src/code/unix.lisp index 1df5c33407..405f2bd21e 100644 --- a/src/code/unix.lisp +++ b/src/code/unix.lisp @@ -32,7 +32,7 @@ (defun c-strings->string-list (c-strings) (declare (type (alien (* c-string)) c-strings)) (let ((reversed-result nil)) - (dotimes (i sb-xc:most-positive-fixnum (error "argh! can't happen")) + (dotimes (i most-positive-fixnum (error "argh! can't happen")) (declare (type index i)) (let ((c-string (deref c-strings i))) (if c-string @@ -42,7 +42,7 @@ ;;;; Lisp types used by syscalls (deftype unix-pathname () 'simple-string) -(deftype unix-fd () `(integer 0 ,sb-xc:most-positive-fixnum)) +(deftype unix-fd () `(integer 0 ,most-positive-fixnum)) (deftype unix-file-mode () '(unsigned-byte 32)) (deftype unix-pid () '(unsigned-byte 32)) @@ -1044,7 +1044,7 @@ avoiding atexit(3) hooks, etc. Otherwise exit(2) is called." ;;; removed by hand. (defconstant micro-seconds-per-internal-time-unit - (/ 1000000 sb-xc:internal-time-units-per-second)) + (/ 1000000 internal-time-units-per-second)) ;;; UNIX specific code, that has been cleanly separated from the ;;; Windows build. @@ -1133,7 +1133,7 @@ the UNIX epoch (January 1st 1970.)" ;; to sometimes return 1000000 exactly.) (type fixnum utime-usec stime-usec)) (let ((result (+ (* (+ utime-sec stime-sec) - sb-xc:internal-time-units-per-second) + internal-time-units-per-second) (floor (+ utime-usec stime-usec (floor micro-seconds-per-internal-time-unit 2)) diff --git a/src/code/win32.lisp b/src/code/win32.lisp index 64a79388bd..085122044b 100644 --- a/src/code/win32.lisp +++ b/src/code/win32.lisp @@ -345,7 +345,7 @@ ;;;; Process time information (defconstant 100ns-per-internal-time-unit - (/ 10000000 sb-xc:internal-time-units-per-second)) + (/ 10000000 internal-time-units-per-second)) ;; FILETIME ;; The FILETIME structure is a 64-bit value representing the number of diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 3e7511d025..73afca46a0 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -201,7 +201,75 @@ ;; "BYTE" "BYTE-POSITION" "BYTE-SIZE" "DPB" "LDB" "LDB-TEST" - "DEPOSIT-FIELD" "MASK-FIELD")) + "DEPOSIT-FIELD" "MASK-FIELD" + ;; + ;; the constants (except for T and NIL which have + ;; a specially hacked correspondence between + ;; cross-compilation host Lisp and target Lisp) + + ;; We include these here since there is no reason to reference + ;; host constants. + "ARRAY-DIMENSION-LIMIT" + "ARRAY-RANK-LIMIT" + "ARRAY-TOTAL-SIZE-LIMIT" + "BOOLE-1" + "BOOLE-2" + "BOOLE-AND" + "BOOLE-ANDC1" + "BOOLE-ANDC2" + "BOOLE-C1" + "BOOLE-C2" + "BOOLE-CLR" + "BOOLE-EQV" + "BOOLE-IOR" + "BOOLE-NAND" + "BOOLE-NOR" + "BOOLE-ORC1" + "BOOLE-ORC2" + "BOOLE-SET" + "BOOLE-XOR" + "CALL-ARGUMENTS-LIMIT" + "CHAR-CODE-LIMIT" + "DOUBLE-FLOAT-EPSILON" + "DOUBLE-FLOAT-NEGATIVE-EPSILON" + "INTERNAL-TIME-UNITS-PER-SECOND" + "LAMBDA-LIST-KEYWORDS" + "LAMBDA-PARAMETERS-LIMIT" + "LEAST-NEGATIVE-DOUBLE-FLOAT" + "LEAST-NEGATIVE-LONG-FLOAT" + "LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT" + "LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT" + "LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT" + "LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT" + "LEAST-NEGATIVE-SHORT-FLOAT" + "LEAST-NEGATIVE-SINGLE-FLOAT" + "LEAST-POSITIVE-DOUBLE-FLOAT" + "LEAST-POSITIVE-LONG-FLOAT" + "LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT" + "LEAST-POSITIVE-NORMALIZED-LONG-FLOAT" + "LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT" + "LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT" + "LEAST-POSITIVE-SHORT-FLOAT" + "LEAST-POSITIVE-SINGLE-FLOAT" + "LONG-FLOAT-EPSILON" + "LONG-FLOAT-NEGATIVE-EPSILON" + "MOST-NEGATIVE-DOUBLE-FLOAT" + "MOST-NEGATIVE-FIXNUM" + "MOST-NEGATIVE-LONG-FLOAT" + "MOST-NEGATIVE-SHORT-FLOAT" + "MOST-NEGATIVE-SINGLE-FLOAT" + "MOST-POSITIVE-DOUBLE-FLOAT" + "MOST-POSITIVE-FIXNUM" + "MOST-POSITIVE-LONG-FLOAT" + "MOST-POSITIVE-SHORT-FLOAT" + "MOST-POSITIVE-SINGLE-FLOAT" + "MULTIPLE-VALUES-LIMIT" + "PI" + "SHORT-FLOAT-EPSILON" + "SHORT-FLOAT-NEGATIVE-EPSILON" + "SINGLE-FLOAT-EPSILON" + "SINGLE-FLOAT-NEGATIVE-EPSILON" + )) ;;; A symbol in the "dual personality" list refers to the symbol in CL unless ;;; package-prefixed with SB-XC:. The main reason for not putting these @@ -253,70 +321,7 @@ (let ((package-name "SB-XC")) (dolist (name (append (append *undefineds* *dual-personality-math-symbols*))) (export (intern name package-name) package-name)) - (dolist (name '(;; the constants (except for T and NIL which have - ;; a specially hacked correspondence between - ;; cross-compilation host Lisp and target Lisp) - "ARRAY-DIMENSION-LIMIT" - "ARRAY-RANK-LIMIT" - "ARRAY-TOTAL-SIZE-LIMIT" - "BOOLE-1" - "BOOLE-2" - "BOOLE-AND" - "BOOLE-ANDC1" - "BOOLE-ANDC2" - "BOOLE-C1" - "BOOLE-C2" - "BOOLE-CLR" - "BOOLE-EQV" - "BOOLE-IOR" - "BOOLE-NAND" - "BOOLE-NOR" - "BOOLE-ORC1" - "BOOLE-ORC2" - "BOOLE-SET" - "BOOLE-XOR" - "CALL-ARGUMENTS-LIMIT" - "CHAR-CODE-LIMIT" - "DOUBLE-FLOAT-EPSILON" - "DOUBLE-FLOAT-NEGATIVE-EPSILON" - "INTERNAL-TIME-UNITS-PER-SECOND" - "LAMBDA-LIST-KEYWORDS" - "LAMBDA-PARAMETERS-LIMIT" - "LEAST-NEGATIVE-DOUBLE-FLOAT" - "LEAST-NEGATIVE-LONG-FLOAT" - "LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT" - "LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT" - "LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT" - "LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT" - "LEAST-NEGATIVE-SHORT-FLOAT" - "LEAST-NEGATIVE-SINGLE-FLOAT" - "LEAST-POSITIVE-DOUBLE-FLOAT" - "LEAST-POSITIVE-LONG-FLOAT" - "LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT" - "LEAST-POSITIVE-NORMALIZED-LONG-FLOAT" - "LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT" - "LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT" - "LEAST-POSITIVE-SHORT-FLOAT" - "LEAST-POSITIVE-SINGLE-FLOAT" - "LONG-FLOAT-EPSILON" - "LONG-FLOAT-NEGATIVE-EPSILON" - "MOST-NEGATIVE-DOUBLE-FLOAT" - "MOST-NEGATIVE-FIXNUM" - "MOST-NEGATIVE-LONG-FLOAT" - "MOST-NEGATIVE-SHORT-FLOAT" - "MOST-NEGATIVE-SINGLE-FLOAT" - "MOST-POSITIVE-DOUBLE-FLOAT" - "MOST-POSITIVE-FIXNUM" - "MOST-POSITIVE-LONG-FLOAT" - "MOST-POSITIVE-SHORT-FLOAT" - "MOST-POSITIVE-SINGLE-FLOAT" - "MULTIPLE-VALUES-LIMIT" - "PI" - "SHORT-FLOAT-EPSILON" - "SHORT-FLOAT-NEGATIVE-EPSILON" - "SINGLE-FLOAT-EPSILON" - "SINGLE-FLOAT-NEGATIVE-EPSILON" - "*READ-DEFAULT-FLOAT-FORMAT*" + (dolist (name '("*READ-DEFAULT-FLOAT-FORMAT*" "ARRAY-ELEMENT-TYPE" "CHAR-CODE" @@ -359,7 +364,7 @@ ;;; Build a new package that exports a not-necessarily-strict subset of ;;; what the host CL exports. This deals with hosts that have too many -;;; symbols exported froM CL. +;;; symbols exported from CL. (let ((cl-model-package (make-package "XC-STRICT-CL" :use nil))) (flet ((new-external (x package &aux (s (intern x package))) (export s package) diff --git a/src/compiler/alpha/move.lisp b/src/compiler/alpha/move.lisp index f54b15faf2..8beff7bba6 100644 --- a/src/compiler/alpha/move.lisp +++ b/src/compiler/alpha/move.lisp @@ -233,7 +233,7 @@ (inst beq temp done) (inst not temp temp) (inst beq temp done) - (load-constant vop (emit-constant (1+ sb-xc:most-positive-fixnum)) + (load-constant vop (emit-constant (1+ most-positive-fixnum)) y) DONE)) @@ -244,7 +244,7 @@ (inst beq temp done) (inst not temp temp) (inst beq temp done) - (load-constant vop (emit-constant (1- sb-xc:most-negative-fixnum)) + (load-constant vop (emit-constant (1- most-negative-fixnum)) y) DONE)) diff --git a/src/compiler/alpha/vm.lisp b/src/compiler/alpha/vm.lisp index 36b8af3343..a41ee8eb39 100644 --- a/src/compiler/alpha/vm.lisp +++ b/src/compiler/alpha/vm.lisp @@ -268,7 +268,7 @@ zero-sc-number) (null null-sc-number) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol diff --git a/src/compiler/arm/move.lisp b/src/compiler/arm/move.lisp index 7bc0a60dbb..c938b5b9ee 100644 --- a/src/compiler/arm/move.lisp +++ b/src/compiler/arm/move.lisp @@ -237,7 +237,7 @@ (inst adds temp x x) (inst adds :vc y temp temp) (inst b :vc DONE) - (load-constant vop (emit-constant (1+ sb-xc:most-positive-fixnum)) + (load-constant vop (emit-constant (1+ most-positive-fixnum)) y) DONE)) @@ -246,7 +246,7 @@ (inst adds temp x x) (inst adds :vc y temp temp) (inst b :vc DONE) - (load-constant vop (emit-constant (1- sb-xc:most-negative-fixnum)) + (load-constant vop (emit-constant (1- most-negative-fixnum)) y) DONE)) diff --git a/src/compiler/arm/vm.lisp b/src/compiler/arm/vm.lisp index f8de20212d..d24bec6bf0 100644 --- a/src/compiler/arm/vm.lisp +++ b/src/compiler/arm/vm.lisp @@ -229,7 +229,7 @@ (typecase value (null null-sc-number) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol diff --git a/src/compiler/arm64/move.lisp b/src/compiler/arm64/move.lisp index 34f65e13b2..75d25513bc 100644 --- a/src/compiler/arm64/move.lisp +++ b/src/compiler/arm64/move.lisp @@ -408,7 +408,7 @@ (:generator 4 (inst adds y x x) (inst b :vc DONE) - (load-constant vop (emit-constant (1+ sb-xc:most-positive-fixnum)) + (load-constant vop (emit-constant (1+ most-positive-fixnum)) y) DONE)) @@ -416,7 +416,7 @@ (:generator 4 (inst adds y x x) (inst b :vc DONE) - (load-constant vop (emit-constant (1- sb-xc:most-negative-fixnum)) + (load-constant vop (emit-constant (1- most-negative-fixnum)) y) DONE)) diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp index 5bb0ccb6d6..612f4af13a 100644 --- a/src/compiler/arm64/vm.lisp +++ b/src/compiler/arm64/vm.lisp @@ -248,7 +248,7 @@ (typecase value (null (values descriptor-reg-sc-number null-offset)) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index 2b929b4652..a08026bd33 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -435,7 +435,7 @@ (unless (and (typep form '(cons (member list vector))) (do ((items (cdr form)) (length 0 (1+ length)) - (fun (let ((axis (the (mod #.sb-xc:array-rank-limit) (1+ axis)))) + (fun (let ((axis (the (mod #.array-rank-limit) (1+ axis)))) (if (= axis rank) (lambda (item) (push item output)) (lambda (item) (recurse item axis)))))) diff --git a/src/compiler/ctype.lisp b/src/compiler/ctype.lisp index 17ac8bfc80..dfab9fa241 100644 --- a/src/compiler/ctype.lisp +++ b/src/compiler/ctype.lisp @@ -392,10 +392,10 @@ and no value was provided for it." name)))))))))) (defstruct (approximate-fun-type (:copier nil)) ;; the smallest and largest numbers of arguments that this function ;; has been called with. - (min-args sb-xc:call-arguments-limit - :type (integer 0 #.sb-xc:call-arguments-limit)) + (min-args call-arguments-limit + :type (integer 0 #.call-arguments-limit)) (max-args 0 - :type (integer 0 #.sb-xc:call-arguments-limit)) + :type (integer 0 #.call-arguments-limit)) ;; a list of lists of the all the types that have been used in each ;; argument position (types () :type list) @@ -413,7 +413,7 @@ and no value was provided for it." name)))))))))) ;; The position at which this keyword appeared. 0 if it appeared as the ;; first argument, etc. (position (missing-arg) - :type (integer 0 #.sb-xc:call-arguments-limit)) + :type (integer 0 #.call-arguments-limit)) ;; a list of all the argument types that have been used with this keyword (types nil :type list) ;; true if this keyword has appeared only in calls with an obvious diff --git a/src/compiler/debug-dump.lisp b/src/compiler/debug-dump.lisp index a4e7bb2ded..664b8fb1b8 100644 --- a/src/compiler/debug-dump.lisp +++ b/src/compiler/debug-dump.lisp @@ -450,7 +450,7 @@ (neq (lambda-physenv fun) (lambda-physenv (lambda-var-home var))))) ;; Keep this condition in sync with PARSE-COMPILED-DEBUG-VARS - (large-fixnums (>= (integer-length sb-xc:most-positive-fixnum) 62)) + (large-fixnums (>= (integer-length most-positive-fixnum) 62)) more) (declare (type index flags)) (when minimal diff --git a/src/compiler/early-c.lisp b/src/compiler/early-c.lisp index 6988900b54..3a7a95e4dd 100644 --- a/src/compiler/early-c.lisp +++ b/src/compiler/early-c.lisp @@ -26,14 +26,14 @@ (declaim (freeze-type opaque-box)) ;;; ANSI limits on compilation -(defconstant sb-xc:call-arguments-limit sb-xc:most-positive-fixnum +(defconstant call-arguments-limit most-positive-fixnum "The exclusive upper bound on the number of arguments which may be passed to a function, including &REST args.") -(defconstant sb-xc:lambda-parameters-limit sb-xc:most-positive-fixnum +(defconstant lambda-parameters-limit most-positive-fixnum "The exclusive upper bound on the number of parameters which may be specified in a given lambda list. This is actually the limit on required and &OPTIONAL parameters. With &KEY and &AUX you can get more.") -(defconstant sb-xc:multiple-values-limit sb-xc:most-positive-fixnum +(defconstant multiple-values-limit most-positive-fixnum "The exclusive upper bound on the number of multiple VALUES that you can return.") diff --git a/src/compiler/early-globaldb.lisp b/src/compiler/early-globaldb.lisp index 30f5dd4b1d..9baa608800 100644 --- a/src/compiler/early-globaldb.lisp +++ b/src/compiler/early-globaldb.lisp @@ -21,7 +21,7 @@ ((or (atom result) (not (eq (car result) 'values))) `(values ,result &optional)) - ((intersection (cdr result) sb-xc:lambda-list-keywords) + ((intersection (cdr result) lambda-list-keywords) result) (t `(values ,@(cdr result) &optional))))) `(function ,args ,result))) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 4bd2ed5b25..0d2ca5cd60 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -305,9 +305,9 @@ (type-error () nil))))))) (frob %single-float single-float - sb-xc:most-negative-single-float sb-xc:most-positive-single-float) + most-negative-single-float most-positive-single-float) (frob %double-float double-float - sb-xc:most-negative-double-float sb-xc:most-positive-double-float)) + most-negative-double-float most-positive-double-float)) ;;;; float contagion @@ -548,7 +548,7 @@ (deftransform phase ((x) ((float)) float) '(if (minusp (float-sign x)) - (float sb-xc:pi x) + (float pi x) (float 0 x))) ;;; The number is of type REAL. @@ -733,10 +733,10 @@ ;; These functions are only defined for part of the real line. The ;; condition selects the desired part of the line. - (frob asin $-1d0 $1d0 (sb-xc:- (sb-xc:/ sb-xc:pi 2)) (sb-xc:/ sb-xc:pi 2)) + (frob asin $-1d0 $1d0 (sb-xc:- (sb-xc:/ pi 2)) (sb-xc:/ pi 2)) ;; Acos is monotonic decreasing, so we need to swap the function ;; values at the lower and upper bounds of the input domain. - (frob acos $-1d0 $1d0 0 sb-xc:pi :increasingp nil) + (frob acos $-1d0 $1d0 0 pi :increasingp nil) (frob acosh $1d0 nil nil nil) (frob atanh $-1d0 $1d0 -1 1) ;; Kahan says that (sqrt -0.0) is -0.0, so use a specifier that @@ -1009,7 +1009,7 @@ (one-arg-derive-type x #'log-derive-type-aux-1 #'log))) (defun atan-derive-type-aux-1 (y) - (elfun-derive-type-simple y #'atan nil nil (sb-xc:- (sb-xc:/ sb-xc:pi 2)) (sb-xc:/ sb-xc:pi 2))) + (elfun-derive-type-simple y #'atan nil nil (sb-xc:- (sb-xc:/ pi 2)) (sb-xc:/ pi 2))) (defun atan-derive-type-aux-2 (y x same-arg) (declare (ignore same-arg)) @@ -1026,8 +1026,8 @@ (make-numeric-type :class 'float :format format :complexp :real - :low (coerce (sb-xc:- sb-xc:pi) bound-format) - :high (coerce sb-xc:pi bound-format)))) + :low (coerce (sb-xc:- pi) bound-format) + :high (coerce pi bound-format)))) (t ;; The result is a float or a complex number (float-or-complex-float-type result-type))))) @@ -1067,8 +1067,8 @@ (make-numeric-type :class 'float :format format :complexp :real - :low (coerce sb-xc:pi bound-type) - :high (coerce sb-xc:pi bound-type))) + :low (coerce pi bound-type) + :high (coerce pi bound-type))) (t ;; We can't tell. The result is 0 or pi. Use a union ;; type for this. @@ -1081,16 +1081,16 @@ (make-numeric-type :class 'float :format format :complexp :real - :low (coerce sb-xc:pi bound-type) - :high (coerce sb-xc:pi bound-type)))))) + :low (coerce pi bound-type) + :high (coerce pi bound-type)))))) (t ;; We have a complex number. The answer is the range -pi ;; to pi. (-pi is included because we have -0.) (make-numeric-type :class 'float :format format :complexp :real - :low (coerce (sb-xc:- sb-xc:pi) bound-type) - :high (coerce sb-xc:pi bound-type)))))) + :low (coerce (sb-xc:- pi) bound-type) + :high (coerce pi bound-type)))))) (defoptimizer (phase derive-type) ((num)) (one-arg-derive-type num #'phase-derive-type-aux #'phase)) @@ -1395,7 +1395,7 @@ ;; Derive the bounds if the arg is in [-pi/2, pi/2]. (trig-derive-type-aux arg - (specifier-type `(float ,(sb-xc:- (sb-xc:/ sb-xc:pi 2)) ,(sb-xc:/ sb-xc:pi 2))) + (specifier-type `(float ,(sb-xc:- (sb-xc:/ pi 2)) ,(sb-xc:/ pi 2))) #'sin -1 1)) #'sin)) @@ -1406,7 +1406,7 @@ (lambda (arg) ;; Derive the bounds if the arg is in [0, pi]. (trig-derive-type-aux arg - (specifier-type `(float $0d0 ,sb-xc:pi)) + (specifier-type `(float $0d0 ,pi)) #'cos -1 1 nil)) @@ -1418,8 +1418,8 @@ (lambda (arg) ;; Derive the bounds if the arg is in [-pi/2, pi/2]. (trig-derive-type-aux arg - (specifier-type `(float ,(sb-xc:- (sb-xc:/ sb-xc:pi 2)) - ,(sb-xc:/ sb-xc:pi 2))) + (specifier-type `(float ,(sb-xc:- (sb-xc:/ pi 2)) + ,(sb-xc:/ pi 2))) #'tan nil nil)) #'tan)) @@ -1585,8 +1585,8 @@ ;;; For 32-bit big-endian machines, the bit patterns were those of subnormals. ;;; So thank goodness for that - it allowed detection of the problem. (defun test-ctype-involving-double-float () - (specifier-type '(double-float #.sb-xc:pi))) -(assert (sb-xc:= (numeric-type-low (test-ctype-involving-double-float)) sb-xc:pi)) + (specifier-type '(double-float #.pi))) +(assert (sb-xc:= (numeric-type-low (test-ctype-involving-double-float)) pi)) ;;; Dummy functions to test that complex number are dumped correctly in genesis. (defun try-folding-complex-single () diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 547be82ce1..9cbabb605b 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -279,7 +279,7 @@ (defknown gcd (&rest integer) unsigned-byte (movable foldable flushable)) -(defknown sb-kernel::fixnum-gcd (fixnum fixnum) (integer 0 #.(1+ sb-xc:most-positive-fixnum)) +(defknown sb-kernel::fixnum-gcd (fixnum fixnum) (integer 0 #.(1+ most-positive-fixnum)) (movable foldable flushable)) (defknown lcm (&rest integer) unsigned-byte @@ -726,7 +726,7 @@ (:end (inhibit-flushing sequence-end nil)) (:from-end t) (:key (function-designator ((nth-arg 1 :sequence t))))) - (or (mod #.(1- sb-xc:array-dimension-limit)) null) + (or (mod #.(1- array-dimension-limit)) null) (foldable flushable call)) (defknown (position-if position-if-not) @@ -735,21 +735,21 @@ (:start (inhibit-flushing index 0)) (:end (inhibit-flushing sequence-end nil)) (:key (function-designator ((nth-arg 1 :sequence t))))) - (or (mod #.(1- sb-xc:array-dimension-limit)) null) + (or (mod #.(1- array-dimension-limit)) null) (foldable flushable call)) (defknown (%bit-position/0 %bit-position/1) (simple-bit-vector t index index) - (or (mod #.(1- sb-xc:array-dimension-limit)) null) + (or (mod #.(1- array-dimension-limit)) null) (foldable flushable)) (defknown (%bit-pos-fwd/0 %bit-pos-fwd/1 %bit-pos-rev/0 %bit-pos-rev/1) (simple-bit-vector index index) - (or (mod #.(1- sb-xc:array-dimension-limit)) null) + (or (mod #.(1- array-dimension-limit)) null) (foldable flushable)) (defknown %bit-position (t simple-bit-vector t index index) - (or (mod #.(1- sb-xc:array-dimension-limit)) null) + (or (mod #.(1- array-dimension-limit)) null) (foldable flushable)) (defknown (%bit-pos-fwd %bit-pos-rev) (t simple-bit-vector index index) - (or (mod #.(1- sb-xc:array-dimension-limit)) null) + (or (mod #.(1- array-dimension-limit)) null) (foldable flushable)) (defknown count diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index 79927abad2..8f8222179b 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -61,10 +61,10 @@ ;;; a mask to extract the type from a data block header word (defconstant widetag-mask (1- (ash 1 n-widetag-bits))) -(defconstant sb-xc:most-positive-fixnum +(defconstant most-positive-fixnum (1- (ash 1 n-positive-fixnum-bits)) "the fixnum closest in value to positive infinity") -(defconstant sb-xc:most-negative-fixnum +(defconstant most-negative-fixnum (ash -1 n-positive-fixnum-bits) "the fixnum closest in value to negative infinity") @@ -76,7 +76,7 @@ ;; leaving one bit for a GC mark bit. (ldb (byte (- n-word-bits n-widetag-bits 1) 0) -1)) -(defconstant sb-xc:char-code-limit #-sb-unicode 256 #+sb-unicode #x110000 +(defconstant char-code-limit #-sb-unicode 256 #+sb-unicode #x110000 "the upper exclusive bound on values produced by CHAR-CODE") (defconstant base-char-code-limit #-sb-unicode 256 #+sb-unicode 128) @@ -94,13 +94,13 @@ (defconstant sb-kernel::internal-time-bits 61) (defconstant most-positive-exactly-single-float-fixnum - (min (expt 2 single-float-digits) sb-xc:most-positive-fixnum)) + (min (expt 2 single-float-digits) most-positive-fixnum)) (defconstant most-negative-exactly-single-float-fixnum - (max (- (expt 2 single-float-digits)) sb-xc:most-negative-fixnum)) + (max (- (expt 2 single-float-digits)) most-negative-fixnum)) (defconstant most-positive-exactly-double-float-fixnum - (min (expt 2 double-float-digits) sb-xc:most-positive-fixnum)) + (min (expt 2 double-float-digits) most-positive-fixnum)) (defconstant most-negative-exactly-double-float-fixnum - (max (- (expt 2 double-float-digits)) sb-xc:most-negative-fixnum)) + (max (- (expt 2 double-float-digits)) most-negative-fixnum)) ;;;; Point where continuous area starting at dynamic-space-start bumps into ;;;; next space. Computed for genesis/constants.h, not used in Lisp. @@ -141,7 +141,7 @@ #+sb-xc-host (defun fixnump (x) (and (integerp x) - (<= sb-xc:most-negative-fixnum x sb-xc:most-positive-fixnum))) + (<= most-negative-fixnum x most-positive-fixnum))) ;;; Helper macro for defining FIXUP-CODE-OBJECT so that its body ;;; can be the same between the host and target. diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 99a6f100d0..671b9f5ace 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1002,10 +1002,10 @@ core and return a descriptor to it." (etypecase host-val (number ;; This case is intended to handle - ;; (DEFCONSTANT SB-XC:LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT - ;; SB-XC:LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT) ; etc + ;; (DEFCONSTANT LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT + ;; LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT) ; etc ;; Several uses of MOST-POSITIVE-FIXNUM come through here as well - ;; due to (DEFCONSTANT SB-XC:mumble-LIMIT sb-xc:most-positive-fixnum). + ;; due to (DEFCONSTANT mumble-LIMIT most-positive-fixnum). ;; That seems weird but doesn't seem to be a problem. ;; (i.e. why don't we just dump the fixnum?) (number-to-core host-val)) diff --git a/src/compiler/generic/interr.lisp b/src/compiler/generic/interr.lisp index 24be59b11f..0886f94cc1 100644 --- a/src/compiler/generic/interr.lisp +++ b/src/compiler/generic/interr.lisp @@ -57,7 +57,7 @@ `(simple-array ,(sb-vm:saetp-specifier saetp) (*))))) (remove t sb-vm:*specialized-array-element-type-properties* :key 'sb-vm:saetp-specifier)))) - `(((integer 0 ,sb-xc:array-dimension-limit) + `(((integer 0 ,array-dimension-limit) object-not-array-dimension) ;; Union of all unboxed array specializations, ;; for type-checking the argument to VECTOR-SAP diff --git a/src/compiler/generic/primtype.lisp b/src/compiler/generic/primtype.lisp index a13980c411..4fd405e085 100644 --- a/src/compiler/generic/primtype.lisp +++ b/src/compiler/generic/primtype.lisp @@ -234,7 +234,7 @@ (integer (cond ((and hi lo) (dolist (spec - `((positive-fixnum 0 ,sb-xc:most-positive-fixnum) + `((positive-fixnum 0 ,most-positive-fixnum) ,@(ecase n-machine-word-bits (32 `((unsigned-byte-31 @@ -246,8 +246,8 @@ 0 ,(1- (ash 1 63))) (unsigned-byte-64 0 ,(1- (ash 1 64)))))) - (fixnum ,sb-xc:most-negative-fixnum - ,sb-xc:most-positive-fixnum) + (fixnum ,most-negative-fixnum + ,most-positive-fixnum) ,(ecase n-machine-word-bits (32 `(signed-byte-32 ,(ash -1 31) @@ -255,8 +255,8 @@ (64 `(signed-byte-64 ,(ash -1 63) ,(1- (ash 1 63)))))) - (if (or (< hi sb-xc:most-negative-fixnum) - (> lo sb-xc:most-positive-fixnum)) + (if (or (< hi most-negative-fixnum) + (> lo most-positive-fixnum)) (part-of bignum) (part-of integer))) (let ((type (car spec)) @@ -266,8 +266,8 @@ (return (values (primitive-type-or-lose type) (and (= lo min) (= hi max)))))))) - ((or (and hi (< hi sb-xc:most-negative-fixnum)) - (and lo (> lo sb-xc:most-positive-fixnum))) + ((or (and hi (< hi most-negative-fixnum)) + (and lo (> lo most-positive-fixnum))) (part-of bignum)) (t (part-of integer)))) diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 39c929a092..600e0e4a97 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -282,7 +282,7 @@ (flushable movable)) ;;; Allocate an array header with type code TYPE and rank RANK. -(defknown make-array-header ((unsigned-byte 8) (mod #.sb-xc:array-rank-limit)) array +(defknown make-array-header ((unsigned-byte 8) (mod #.array-rank-limit)) array (flushable movable)) (defknown make-array-header* (&rest t) array (flushable movable)) @@ -616,12 +616,12 @@ (defknown (%asin %atan) (double-float) - (double-float #.(coerce (sb-xc:- (sb-xc:/ sb-xc:pi 2)) 'double-float) - #.(coerce (sb-xc:/ sb-xc:pi 2) 'double-float)) + (double-float #.(coerce (sb-xc:- (sb-xc:/ pi 2)) 'double-float) + #.(coerce (sb-xc:/ pi 2) 'double-float)) (movable foldable flushable)) (defknown (%acos) - (double-float) (double-float $0.0d0 #.(coerce sb-xc:pi 'double-float)) + (double-float) (double-float $0.0d0 #.(coerce pi 'double-float)) (movable foldable flushable)) (defknown (%cosh) @@ -646,8 +646,8 @@ (defknown (%atan2) (double-float double-float) - (double-float #.(coerce (sb-xc:- sb-xc:pi) 'double-float) - #.(coerce sb-xc:pi 'double-float)) + (double-float #.(coerce (sb-xc:- pi) 'double-float) + #.(coerce pi 'double-float)) (movable foldable flushable)) (defknown (%scalb) diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index f483005a0d..352cecc4eb 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -384,7 +384,7 @@ ,(if (and (integer-type-p index-type) (numeric-type-low index-type)) `(integer ,(numeric-type-low index-type) - (,sb-xc:array-dimension-limit)) + (,array-dimension-limit)) `index)))))) (deftransform %data-vector-and-index ((%array %index) diff --git a/src/compiler/generic/vm-type.lisp b/src/compiler/generic/vm-type.lisp index 154392ae14..2333731b3c 100644 --- a/src/compiler/generic/vm-type.lisp +++ b/src/compiler/generic/vm-type.lisp @@ -56,7 +56,7 @@ (sb-xc:deftype internal-time () `(unsigned-byte ,internal-time-bits)) (defconstant internal-seconds-limit - (floor (ash 1 internal-time-bits) sb-xc:internal-time-units-per-second)) + (floor (ash 1 internal-time-bits) internal-time-units-per-second)) (sb-xc:deftype internal-seconds () `(integer 0 ,internal-seconds-limit)) (sb-xc:deftype bignum-element-type () 'sb-vm:word) @@ -283,8 +283,8 @@ (let (widetags remainder) ;; A little optimization for (OR BIGNUM other). Without this, there would ;; be a two-sided GENERIC-{<,>} test plus whatever test(s) "other" entails. - (let ((neg-bignum (specifier-type `(integer * (,sb-xc:most-negative-fixnum)))) - (pos-bignum (specifier-type `(integer (,sb-xc:most-positive-fixnum) *)))) + (let ((neg-bignum (specifier-type `(integer * (,most-negative-fixnum)))) + (pos-bignum (specifier-type `(integer (,most-positive-fixnum) *)))) (when (and (member neg-bignum types :test #'type=) (member pos-bignum types :test #'type=)) (push sb-vm:bignum-widetag widetags) diff --git a/src/compiler/hppa/move.lisp b/src/compiler/hppa/move.lisp index ff2c85dc21..1d6cdb68b7 100644 --- a/src/compiler/hppa/move.lisp +++ b/src/compiler/hppa/move.lisp @@ -212,7 +212,7 @@ ;; the bignum-construction, doing the shift in the delay slot. (inst comb := temp zero-tn done) (inst sll x n-fixnum-tag-bits y) - (load-constant vop (emit-constant (1+ sb-xc:most-positive-fixnum)) + (load-constant vop (emit-constant (1+ most-positive-fixnum)) y) DONE)) @@ -226,7 +226,7 @@ ;; the bignum-construction, doing the shift in the delay slot. (inst comb := temp zero-tn done) (inst sll x n-fixnum-tag-bits y) - (load-constant vop (emit-constant (1- sb-xc:most-negative-fixnum)) + (load-constant vop (emit-constant (1- most-negative-fixnum)) y) DONE)) diff --git a/src/compiler/hppa/vm.lisp b/src/compiler/hppa/vm.lisp index 096f4ad7b7..68cec6a35c 100644 --- a/src/compiler/hppa/vm.lisp +++ b/src/compiler/hppa/vm.lisp @@ -298,7 +298,7 @@ zero-sc-number) (null null-sc-number) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) #-sb-xc-host system-area-pointer ; no object can be a SAP in the host character) immediate-sc-number) diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index a276854c61..cd74030a3c 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -150,7 +150,7 @@ (defmacro make-info-descriptor (val shift) (if (> sb-vm:n-fixnum-bits 30) `(ash ,val ,shift) - `(logior (if (logbitp (- 29 ,shift) ,val) sb-xc:most-negative-fixnum 0) + `(logior (if (logbitp (- 29 ,shift) ,val) most-negative-fixnum 0) (ash ,val ,shift)))) ;; Convert unpacked vector to packed vector. diff --git a/src/compiler/integer-tran.lisp b/src/compiler/integer-tran.lisp index b51641b92d..dacb1a45a0 100644 --- a/src/compiler/integer-tran.lisp +++ b/src/compiler/integer-tran.lisp @@ -21,7 +21,7 @@ (if (numeric-type-p type) (let ((limit-high (numeric-type-high (lvar-type limit)))) (aver limit-high) - (if (<= limit-high (1+ sb-xc:most-positive-fixnum)) + (if (<= limit-high (1+ most-positive-fixnum)) '(%inclusive-random-fixnum (1- limit) (or state *random-state*)) '(%inclusive-random-integer (1- limit) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 895f5bf5fd..c35b6d6e2a 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -1059,7 +1059,7 @@ (let ((original-lambda-list (second original-lambda))) ;; KISS - the closure that you're passing can have 0 or more ;; mandatory args and nothing else. - (unless (intersection original-lambda-list sb-xc:lambda-list-keywords) + (unless (intersection original-lambda-list lambda-list-keywords) (push `(,tempname ,original-lambda-list (%funcall ,(nth arg-spec received-args) ,@original-lambda-list)) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index b7d9bbfcf0..69a6e53e3f 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -305,11 +305,6 @@ (type (type-specifier (info :variable :type name)))) `(macro . (the ,type ,expansion)))) (:constant - #+sb-xc-host ; check that we never reference host constants - (unless (member name '(nil t)) ; other than these 2 - (when (eq (find-symbol (string name) "XC-STRICT-CL") - name) - (error "Using a constant from the host ~s" name))) (find-constant (symbol-value name) name)) (t (make-global-var :kind kind diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index b86d06b326..9fdaa2ec0a 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -590,7 +590,7 @@ (lvar-value bound)) ((and (integer-type-p bound-type) (nth-value 1 (integer-type-numeric-bounds bound-type)))) - (sb-xc:array-dimension-limit)))))) + (array-dimension-limit)))))) (index-type (lvar-type index))) (when (eq (type-intersection bound-type index-type) *empty-type*) diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index dc6bdc7bcd..99dd63bfe4 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -413,7 +413,7 @@ (and (proper-sequence-p value) (let ((length (length value))) (values length length)))) - (let ((max 0) (min sb-xc:array-total-size-limit)) + (let ((max 0) (min array-total-size-limit)) (block nil (labels ((max-dim (type) ;; This can deal with just enough hair to handle type STRING, diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 3ba0ddae34..ec69755b5b 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1692,8 +1692,8 @@ necessary, since type inference may take arbitrarily long to converge.") (defun elapsed-time-to-string (internal-time-delta) (multiple-value-bind (tsec remainder) - (truncate internal-time-delta sb-xc:internal-time-units-per-second) - (let ((ms (truncate remainder (/ sb-xc:internal-time-units-per-second 1000)))) + (truncate internal-time-delta internal-time-units-per-second) + (let ((ms (truncate remainder (/ internal-time-units-per-second 1000)))) (multiple-value-bind (tmin sec) (truncate tsec 60) (multiple-value-bind (thr min) (truncate tmin 60) (format nil "~D:~2,'0D:~2,'0D.~3,'0D" thr min sec ms)))))) diff --git a/src/compiler/mips/move.lisp b/src/compiler/mips/move.lisp index 6d5f6a2ce3..a452bd3c94 100644 --- a/src/compiler/mips/move.lisp +++ b/src/compiler/mips/move.lisp @@ -208,7 +208,7 @@ (inst beq temp done) (inst sll y x n-fixnum-tag-bits) - (load-constant vop (emit-constant (1+ sb-xc:most-positive-fixnum)) + (load-constant vop (emit-constant (1+ most-positive-fixnum)) y) (inst b done) (inst nop) @@ -225,7 +225,7 @@ (inst beq temp done) (inst sll y x n-fixnum-tag-bits) - (load-constant vop (emit-constant (1- sb-xc:most-negative-fixnum)) + (load-constant vop (emit-constant (1- most-negative-fixnum)) y) (inst b done) (inst nop) diff --git a/src/compiler/mips/vm.lisp b/src/compiler/mips/vm.lisp index f7de334b29..911b7b4a86 100644 --- a/src/compiler/mips/vm.lisp +++ b/src/compiler/mips/vm.lisp @@ -291,7 +291,7 @@ (if (static-symbol-p value) immediate-sc-number nil)) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) #-sb-xc-host ; There is no such object type in the host diff --git a/src/compiler/modarith.lisp b/src/compiler/modarith.lisp index 970c014a97..0f17a1f1bd 100644 --- a/src/compiler/modarith.lisp +++ b/src/compiler/modarith.lisp @@ -96,7 +96,7 @@ (check-type kind (member :untagged :tagged)) (when lambda-list-p (dolist (arg lambda-list) - (when (member arg sb-xc:lambda-list-keywords) + (when (member arg lambda-list-keywords) (error "Lambda list keyword ~S is not supported for modular ~ function lambda lists." arg)))))) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index a26e0fd0c7..13c2aac0ab 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -1582,7 +1582,7 @@ (walk-tn-refs (tn-reads tn)) (walk-tn-refs (tn-writes tn)) (if (eql path t) - sb-xc:most-positive-fixnum + most-positive-fixnum (length path))))) (declaim (type (member :iterative :greedy :adaptive) diff --git a/src/compiler/parse-lambda-list.lisp b/src/compiler/parse-lambda-list.lisp index db619e587a..4cb41763bf 100644 --- a/src/compiler/parse-lambda-list.lisp +++ b/src/compiler/parse-lambda-list.lisp @@ -119,7 +119,7 @@ (char= (char name 0) #\&))))) (check-suspicious (kind form) (and (probably-ll-keyword-p form) - (member form sb-xc:lambda-list-keywords) + (member form lambda-list-keywords) (report-suspicious kind form))) (report-suspicious (kind what) (style-warn-once list "suspicious ~A ~S in lambda list: ~S." diff --git a/src/compiler/ppc/move.lisp b/src/compiler/ppc/move.lisp index c85270e0cf..a98493a9bd 100644 --- a/src/compiler/ppc/move.lisp +++ b/src/compiler/ppc/move.lisp @@ -203,7 +203,7 @@ (inst addo. temp temp temp) ; set CR0 SO if any top three bits differ (inst slwi y x n-fixnum-tag-bits) ; assume fixnum (tagged ok, maybe lost some high bits) (inst bns done) - (load-constant vop (emit-constant (1+ sb-xc:most-positive-fixnum)) + (load-constant vop (emit-constant (1+ most-positive-fixnum)) y) DONE)) @@ -215,7 +215,7 @@ (inst addo. temp temp temp) ; set CR0 SO if any top three bits differ (inst slwi y x n-fixnum-tag-bits) ; assume fixnum (tagged ok, maybe lost some high bits) (inst bns done) - (load-constant vop (emit-constant (1- sb-xc:most-negative-fixnum)) + (load-constant vop (emit-constant (1- most-negative-fixnum)) y) DONE)) diff --git a/src/compiler/ppc/vm.lisp b/src/compiler/ppc/vm.lisp index 4bccc28ca2..c284f93dfd 100644 --- a/src/compiler/ppc/vm.lisp +++ b/src/compiler/ppc/vm.lisp @@ -263,7 +263,7 @@ zero-sc-number) (null null-sc-number) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol diff --git a/src/compiler/ppc64/move.lisp b/src/compiler/ppc64/move.lisp index 60df566ae5..347d961425 100644 --- a/src/compiler/ppc64/move.lisp +++ b/src/compiler/ppc64/move.lisp @@ -208,7 +208,7 @@ (2 '((inst addo x arg arg) (inst addo. y x x))) (3 '((inst addo x arg arg) (inst addo x x x) (inst addo. y x x)))) (inst bns done) ; branch if no summary overflow - (load-constant vop (emit-constant (1+ sb-xc:most-positive-fixnum)) y) + (load-constant vop (emit-constant (1+ most-positive-fixnum)) y) DONE)))) (define-move-from-fixnum+1)) @@ -221,7 +221,7 @@ (2 '((inst addo x arg arg) (inst addo. y x x))) (3 '((inst addo x arg arg) (inst addo x x x) (inst addo. y x x)))) (inst bns done) ; branch if no summary overflow - (load-constant vop (emit-constant (1- sb-xc:most-negative-fixnum)) y) + (load-constant vop (emit-constant (1- most-negative-fixnum)) y) DONE)))) (define-move-from-fixnum-1)) diff --git a/src/compiler/ppc64/vm.lisp b/src/compiler/ppc64/vm.lisp index 8fd7f5e8f2..338a4dd861 100644 --- a/src/compiler/ppc64/vm.lisp +++ b/src/compiler/ppc64/vm.lisp @@ -251,7 +251,7 @@ (typecase value (null null-sc-number) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol diff --git a/src/compiler/represent.lisp b/src/compiler/represent.lisp index 0b0a96dc4c..1ba4efe112 100644 --- a/src/compiler/represent.lisp +++ b/src/compiler/represent.lisp @@ -295,7 +295,7 @@ t) - (let ((min sb-xc:most-positive-fixnum) + (let ((min most-positive-fixnum) (min-scn nil) (unique nil)) (dolist (scn scs) @@ -594,12 +594,12 @@ (cond ((not type) nil) ((csubtypep type - (specifier-type `(integer ,sb-xc:most-negative-fixnum - ,(1+ sb-xc:most-positive-fixnum)))) + (specifier-type `(integer ,most-negative-fixnum + ,(1+ most-positive-fixnum)))) (template-or-lose 'sb-vm::move-from-fixnum+1)) ((csubtypep type - (specifier-type `(integer ,(1- sb-xc:most-negative-fixnum) - ,sb-xc:most-positive-fixnum))) + (specifier-type `(integer ,(1- most-negative-fixnum) + ,most-positive-fixnum))) (template-or-lose 'sb-vm::move-from-fixnum-1)))))) (defun coerce-from-constant (x-tn-ref y) diff --git a/src/compiler/riscv/move.lisp b/src/compiler/riscv/move.lisp index 42ff08b813..a6c4870182 100644 --- a/src/compiler/riscv/move.lisp +++ b/src/compiler/riscv/move.lisp @@ -232,10 +232,10 @@ DONE)) (define-vop (move-from-fixnum+1 move-from-fixnum+/-1) - (:variant (1+ sb-xc:most-positive-fixnum))) + (:variant (1+ most-positive-fixnum))) (define-vop (move-from-fixnum-1 move-from-fixnum+/-1) - (:variant (1- sb-xc:most-negative-fixnum))) + (:variant (1- most-negative-fixnum))) ;;; Check for fixnum, and possibly allocate one or two word bignum ;;; result. Use a worst-case cost to make sure people know they may diff --git a/src/compiler/riscv/vm.lisp b/src/compiler/riscv/vm.lisp index 41bbaa89c8..65b9c25222 100644 --- a/src/compiler/riscv/vm.lisp +++ b/src/compiler/riscv/vm.lisp @@ -206,7 +206,7 @@ (typecase value (null (values descriptor-reg-sc-number null-offset)) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 9868696636..828d8dae43 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1186,7 +1186,7 @@ (j (+ ,dst-offset ,length) (1- j))) ((<= i ,src-offset)) (declare (optimize (insert-array-bounds-checks 0)) - (type (integer 0 #.sb-xc:array-dimension-limit) j i)) + (type (integer 0 #.array-dimension-limit) j i)) (setf (aref ,dst (1- j)) (aref ,src (1- i)))))) ;;; MAKE-SEQUENCE, SUBSEQ, COPY-SEQ @@ -1461,7 +1461,7 @@ (and (constant-lvar-p from-end) (not (lvar-value from-end))))) (min-result (or constant-start2 0)) - (max-result (or constant-end2 (1- sb-xc:array-dimension-limit))) + (max-result (or constant-end2 (1- array-dimension-limit))) (max2 (sequence-lvar-dimensions sequence2)) (max-result (if (integerp max2) (min max-result max2) @@ -1497,7 +1497,7 @@ (constant-end (and (constant-lvar-p end) (lvar-value end))) (min-result (or constant-start 0)) - (max-result (or constant-end (1- sb-xc:array-dimension-limit))) + (max-result (or constant-end (1- array-dimension-limit))) (max (sequence-lvar-dimensions sequence)) (max-result (if (integerp max) (min max-result max) diff --git a/src/compiler/sparc/move.lisp b/src/compiler/sparc/move.lisp index 381343d005..b07185a7ca 100644 --- a/src/compiler/sparc/move.lisp +++ b/src/compiler/sparc/move.lisp @@ -241,7 +241,7 @@ (inst b :eq done) (inst sll y x n-fixnum-tag-bits) - (load-constant vop (emit-constant (1+ sb-xc:most-positive-fixnum)) + (load-constant vop (emit-constant (1+ most-positive-fixnum)) y) (inst b done) (inst nop) @@ -259,7 +259,7 @@ (inst b :eq done) (inst sll y x n-fixnum-tag-bits) - (load-constant vop (emit-constant (1- sb-xc:most-negative-fixnum)) + (load-constant vop (emit-constant (1- most-negative-fixnum)) y) (inst b done) (inst nop) diff --git a/src/compiler/sparc/vm.lisp b/src/compiler/sparc/vm.lisp index 41559c6ceb..a001685832 100644 --- a/src/compiler/sparc/vm.lisp +++ b/src/compiler/sparc/vm.lisp @@ -294,7 +294,7 @@ zero-sc-number) (null null-sc-number) - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index b680fa564d..d451a73c67 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -158,7 +158,7 @@ ;; Something fishy here- If THE is removed, OPERAND-RESTRICTION-OK ;; returns NIL because type inference on MAKE-LIST never happens. ;; But the fndb entry for %MAKE-LIST is right, so I'm slightly bewildered. - `(%make-list (the (integer 0 (,(1- sb-xc:array-dimension-limit))) ,length) + `(%make-list (the (integer 0 (,(1- array-dimension-limit))) ,length) ,(second rest)) (values nil t))) ; give up @@ -472,7 +472,7 @@ (defun safe-double-coercion-p (x) (or (typep x 'double-float) - (sb-xc:<= sb-xc:most-negative-double-float x sb-xc:most-positive-double-float))) + (sb-xc:<= most-negative-double-float x most-positive-double-float))) (defun safe-single-coercion-p (x) (or (typep x 'single-float) @@ -506,7 +506,7 @@ #+x86 (not (typep x `(or (integer * (,most-negative-exactly-single-float-fixnum)) (integer (,most-positive-exactly-single-float-fixnum) *)))) - (sb-xc:<= sb-xc:most-negative-single-float x sb-xc:most-positive-single-float)))) + (sb-xc:<= most-negative-single-float x most-positive-single-float)))) ;;; Apply a binary operator OP to two bounds X and Y. The result is ;;; NIL if either is NIL. Otherwise bound is computed and the result @@ -587,11 +587,11 @@ xbound (list xbound)))) ((sb-xc:subtypep type 'double-float) - (if (sb-xc:<= sb-xc:most-negative-double-float val sb-xc:most-positive-double-float) + (if (sb-xc:<= most-negative-double-float val most-positive-double-float) (coerce val type))) ((or (sb-xc:subtypep type 'single-float) (sb-xc:subtypep type 'float)) ;; coerce to float returns a single-float - (if (sb-xc:<= sb-xc:most-negative-single-float val sb-xc:most-positive-single-float) + (if (sb-xc:<= most-negative-single-float val most-positive-single-float) (coerce val type))) (t (coerce val type)))) @@ -604,16 +604,16 @@ (list xbound))) (cond ((sb-xc:subtypep type 'double-float) - (if (sb-xc:<= sb-xc:most-negative-double-float val sb-xc:most-positive-double-float) + (if (sb-xc:<= most-negative-double-float val most-positive-double-float) (coerce val type) - (if (sb-xc:< val sb-xc:most-negative-double-float) - sb-xc:most-negative-double-float sb-xc:most-positive-double-float))) + (if (sb-xc:< val most-negative-double-float) + most-negative-double-float most-positive-double-float))) ((or (sb-xc:subtypep type 'single-float) (sb-xc:subtypep type 'float)) ;; coerce to float returns a single-float - (if (sb-xc:<= sb-xc:most-negative-single-float val sb-xc:most-positive-single-float) + (if (sb-xc:<= most-negative-single-float val most-positive-single-float) (coerce val type) - (if (sb-xc:< val sb-xc:most-negative-single-float) - sb-xc:most-negative-single-float sb-xc:most-positive-single-float))) + (if (sb-xc:< val most-negative-single-float) + most-negative-single-float most-positive-single-float))) (t (coerce val type)))))) ;;; Convert a numeric-type object to an interval object. @@ -1483,14 +1483,14 @@ (flet ((ash-outer (n s) (when (and (fixnump s) (<= s 64) - (> s sb-xc:most-negative-fixnum)) + (> s most-negative-fixnum)) (ash n s))) ;; KLUDGE: The bare 64's here should be related to ;; symbolic machine word size values somehow. (ash-inner (n s) (if (and (fixnump s) - (> s sb-xc:most-negative-fixnum)) + (> s most-negative-fixnum)) (ash n (min s 64)) (if (minusp n) -1 0)))) (or (and (csubtypep n-type (specifier-type 'integer)) @@ -2300,7 +2300,7 @@ `(mod ,base-char-code-limit))) (t (specifier-type - `(mod ,sb-xc:char-code-limit)))))) + `(mod ,char-code-limit)))))) (defoptimizer (code-char derive-type) ((code)) (let ((type (lvar-type code))) @@ -2690,22 +2690,22 @@ (give-up-ir1-transform "BOOLE code is not a constant.")) (let ((control (lvar-value op))) (case control - (#.sb-xc:boole-clr 0) - (#.sb-xc:boole-set -1) - (#.sb-xc:boole-1 'x) - (#.sb-xc:boole-2 'y) - (#.sb-xc:boole-c1 '(lognot x)) - (#.sb-xc:boole-c2 '(lognot y)) - (#.sb-xc:boole-and '(logand x y)) - (#.sb-xc:boole-ior '(logior x y)) - (#.sb-xc:boole-xor '(logxor x y)) - (#.sb-xc:boole-eqv '(logeqv x y)) - (#.sb-xc:boole-nand '(lognand x y)) - (#.sb-xc:boole-nor '(lognor x y)) - (#.sb-xc:boole-andc1 '(logandc1 x y)) - (#.sb-xc:boole-andc2 '(logandc2 x y)) - (#.sb-xc:boole-orc1 '(logorc1 x y)) - (#.sb-xc:boole-orc2 '(logorc2 x y)) + (#.boole-clr 0) + (#.boole-set -1) + (#.boole-1 'x) + (#.boole-2 'y) + (#.boole-c1 '(lognot x)) + (#.boole-c2 '(lognot y)) + (#.boole-and '(logand x y)) + (#.boole-ior '(logior x y)) + (#.boole-xor '(logxor x y)) + (#.boole-eqv '(logeqv x y)) + (#.boole-nand '(lognand x y)) + (#.boole-nor '(lognor x y)) + (#.boole-andc1 '(logandc1 x y)) + (#.boole-andc2 '(logandc2 x y)) + (#.boole-orc1 '(logorc1 x y)) + (#.boole-orc2 '(logorc2 x y)) (t (abort-ir1-transform "~S is an illegal control arg to BOOLE." control))))) @@ -4011,7 +4011,7 @@ ((and (typep (abs low) `(integer 0 ,(min (expt 2 32) - sb-xc:most-positive-fixnum))) + most-positive-fixnum))) ;; Get some extra points (positive-primep (abs low))) (pushnew (abs low) primes))) @@ -4091,7 +4091,7 @@ (case (let ((name (lvar-fun-name (combination-fun thing)))) (or (modular-version-info name :untagged nil) name)) ((+ -) - (let ((min sb-xc:most-positive-fixnum) + (let ((min most-positive-fixnum) (itype (specifier-type 'integer))) (dolist (arg (combination-args thing) min) (if (csubtypep (lvar-type arg) itype) @@ -4118,7 +4118,7 @@ 0))) (integer (if (zerop thing) - sb-xc:most-positive-fixnum + most-positive-fixnum (do ((result 0 (1+ result)) (num thing (ash num -1))) ((logbitp 0 num) result)))) @@ -4792,7 +4792,7 @@ (start-1 (1- ,',start)) (current-heap-size (- ,',end ,',start)) (keyfun ,keyfun)) - (declare (type (integer -1 #.(1- sb-xc:most-positive-fixnum)) + (declare (type (integer -1 #.(1- most-positive-fixnum)) start-1)) (declare (type index current-heap-size)) (declare (type function keyfun)) diff --git a/src/compiler/sset.lisp b/src/compiler/sset.lisp index e9a6261552..92a35bc247 100644 --- a/src/compiler/sset.lisp +++ b/src/compiler/sset.lisp @@ -75,7 +75,7 @@ (set-result (+ result (ash result -9))) (set-result (logxor result (ash result -5))) (set-result (+ result (ash result -2))) - (logand sb-xc:most-positive-fixnum result)))) + (logand most-positive-fixnum result)))) ;;; Secondary hash (for double hash probing). Needs to return an odd ;;; number. diff --git a/src/compiler/sxhash.lisp b/src/compiler/sxhash.lisp index 6385cb2b47..fa6fad0221 100644 --- a/src/compiler/sxhash.lisp +++ b/src/compiler/sxhash.lisp @@ -127,7 +127,7 @@ `(let ((bits (logand (single-float-bits x) ,(1- (ash 1 32))))) (logxor 66194023 (sxhash (the sb-xc:fixnum - (logand sb-xc:most-positive-fixnum + (logand most-positive-fixnum (logxor bits (ash bits -7)))))))) (deftransform sxhash ((x) (single-float)) '#.+sxhash-single-float-expr+) @@ -138,16 +138,16 @@ (hilo (logxor hi lo))) (logxor 475038542 (sxhash (the fixnum - (logand sb-xc:most-positive-fixnum + (logand most-positive-fixnum (logxor hilo (ash hilo -7)))))))) ;;; SXHASH of FIXNUM values is defined as a DEFTRANSFORM because it's so ;;; simple. (defglobal +sxhash-fixnum-expr+ - (let ((c (logand 1193941380939624010 sb-xc:most-positive-fixnum))) + (let ((c (logand 1193941380939624010 most-positive-fixnum))) ;; shift by -1 to get sign bit into hash - `(logand (logxor (ash x 4) (ash x -1) ,c) sb-xc:most-positive-fixnum))) + `(logand (logxor (ash x 4) (ash x -1) ,c) most-positive-fixnum))) (deftransform sxhash ((x) (fixnum)) '#.+sxhash-fixnum-expr+) ;;; Treat double-float essentially the same as a fixnum if words are 64 bits. @@ -155,13 +155,13 @@ (defglobal +sxhash-double-float-expr+ ;; logical negation of magic constant ensures that 0.0d0 hashes to something ;; other than what the fixnum 0 hashes to (as tested in hash.impure.lisp) - (let ((c (logandc1 1193941380939624010 sb-xc:most-positive-fixnum))) + (let ((c (logandc1 1193941380939624010 most-positive-fixnum))) `(let ((x (double-float-bits x))) ;; ensure we mix the sign bit into the hash (logand (logxor (ash x 4) (ash x (- (1+ sb-vm:n-fixnum-tag-bits))) ,c) - sb-xc:most-positive-fixnum)))) + most-positive-fixnum)))) (deftransform sxhash ((x) (double-float)) '#.+sxhash-double-float-expr+) @@ -211,7 +211,7 @@ (t ;; (STRING X) could be a non-simple string, it's OK. (let ((hash (logxor (sb-impl::%sxhash-simple-string (string x)) - sb-xc:most-positive-fixnum))) + most-positive-fixnum))) (aver (ldb-test (byte (- 32 sb-vm:n-fixnum-tag-bits) 0) hash)) hash)))) (sb-xc:fixnum #.+sxhash-fixnum-expr+) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index b4d079d491..c51345e378 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -607,7 +607,7 @@ #+(and sb-unicode (or x86-64 arm64)) ((= (cdar pairs) (1- base-char-code-limit)) `(base-char-p ,object)) - ((= (cdar pairs) (1- sb-xc:char-code-limit)) + ((= (cdar pairs) (1- char-code-limit)) `(characterp ,object)))) (let ((n-code (sb-xc:gensym "CODE"))) `(and (characterp ,object) diff --git a/src/compiler/x86-64/float.lisp b/src/compiler/x86-64/float.lisp index 6ef604eb6c..fb2e4e368d 100644 --- a/src/compiler/x86-64/float.lisp +++ b/src/compiler/x86-64/float.lisp @@ -112,7 +112,7 @@ (inst movsd (ea-for-df-stack y) x)) (eval-when (:compile-toplevel :execute) - (setf *read-default-float-format* 'cl:single-float)) + (setf cl:*read-default-float-format* 'cl:single-float)) ;;;; complex float move functions diff --git a/src/compiler/x86-64/memory.lisp b/src/compiler/x86-64/memory.lisp index 3ac8742262..8ea10c9b84 100644 --- a/src/compiler/x86-64/memory.lisp +++ b/src/compiler/x86-64/memory.lisp @@ -103,7 +103,7 @@ (sc-case value (immediate (let ((k (tn-value value))) - (inst mov result (fixnumize (if (= k sb-xc:most-negative-fixnum) k (- k)))))) + (inst mov result (fixnumize (if (= k most-negative-fixnum) k (- k)))))) (t (move result value) (inst neg result))) @@ -149,7 +149,7 @@ (const (if (sc-is delta immediate) (fixnumize ,(if (eq inherit 'cell-xsub) `(let ((x (tn-value delta))) - (if (= x sb-xc:most-negative-fixnum) + (if (= x most-negative-fixnum) x (- x))) `(tn-value delta))))) (retry (gen-label))) diff --git a/src/compiler/x86-64/move.lisp b/src/compiler/x86-64/move.lisp index 78a34a1684..9f48fca18f 100644 --- a/src/compiler/x86-64/move.lisp +++ b/src/compiler/x86-64/move.lisp @@ -299,13 +299,13 @@ (cond ((= n-fixnum-tag-bits 1) (move y x) (inst shl y 1) - (inst cmov :o y (emit-constant (1+ sb-xc:most-positive-fixnum)))) + (inst cmov :o y (emit-constant (1+ most-positive-fixnum)))) (t ;; not worth optimizing into SHL. The processor doesn't set OF for ;; for shift count > 1 so we'd have to detect overflow differently. (inst imul y x (ash 1 n-fixnum-tag-bits)) (inst jmp :no DONE) - (move y (emit-constant (1+ sb-xc:most-positive-fixnum))))) + (move y (emit-constant (1+ most-positive-fixnum))))) DONE)) (define-vop (move-from-fixnum-1 move-from-fixnum+1) @@ -313,13 +313,13 @@ (cond ((= n-fixnum-tag-bits 1) (move y x) (inst shl y 1) - (inst cmov :o y (emit-constant (1- sb-xc:most-negative-fixnum)))) + (inst cmov :o y (emit-constant (1- most-negative-fixnum)))) (t ;; not worth optimizing into SHL. The processor doesn't set OF for ;; for shift count > 1 so we'd have to detect overflow differently. (inst imul y x (ash 1 n-fixnum-tag-bits)) (inst jmp :no DONE) - (move y (emit-constant (1- sb-xc:most-negative-fixnum))))) + (move y (emit-constant (1- most-negative-fixnum))))) DONE)) ;;; Convert an untagged unsigned word to a lispobj -- fixnum or bignum diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index b48f7280e4..bacdd00eb8 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -243,7 +243,7 @@ ;; a <= x <= a + 2^n - 1 ;; is equivalent to unsigned ;; ((x-a) >> n) = 0 - (inst mov temp #.(- sb-xc:most-negative-fixnum)) + (inst mov temp #.(- most-negative-fixnum)) (inst add temp value) (inst shr temp n-fixnum-bits))) diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index f85d03de27..04eefaab7a 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -401,7 +401,7 @@ ;;; the appropriate SC number, otherwise return NIL. (defun immediate-constant-sc (value) (typecase value - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol ; Symbols in static and immobile space are immediate diff --git a/src/compiler/x86/move.lisp b/src/compiler/x86/move.lisp index d36bb2e1a7..fbfa17d12c 100644 --- a/src/compiler/x86/move.lisp +++ b/src/compiler/x86/move.lisp @@ -222,14 +222,14 @@ (:generator 4 (inst imul y x (ash 1 n-fixnum-tag-bits)) (inst jmp :no done) - (inst mov y (emit-constant (1+ sb-xc:most-positive-fixnum))) + (inst mov y (emit-constant (1+ most-positive-fixnum))) done)) (define-vop (move-from-fixnum-1 move-from-fixnum+1) (:generator 4 (inst imul y x (ash 1 n-fixnum-tag-bits)) (inst jmp :no done) - (inst mov y (emit-constant (1- sb-xc:most-negative-fixnum))) + (inst mov y (emit-constant (1- most-negative-fixnum))) done)) ;;; Convert an untagged unsigned word to a lispobj -- fixnum or bignum diff --git a/src/compiler/x86/type-vops.lisp b/src/compiler/x86/type-vops.lisp index 01dcdcf9b4..59c3ebc2af 100644 --- a/src/compiler/x86/type-vops.lisp +++ b/src/compiler/x86/type-vops.lisp @@ -179,7 +179,7 @@ ;; We could encode this with :Z and SHR, analogously to the signed-byte-32 ;; case below -- as we do on x86-64 -- but that costs us an extra ;; register. Compromises... - (inst cmp value #.sb-xc:most-positive-fixnum))) + (inst cmp value #.most-positive-fixnum))) (define-vop (fixnump/signed-byte-32 type-predicate) (:args (value :scs (signed-reg))) @@ -194,9 +194,9 @@ ;; is equivalent to unsigned ;; ((x-a) >> n) = 0 (inst mov eax-tn value) - (inst sub eax-tn #.sb-xc:most-negative-fixnum) - (inst shr eax-tn #.(integer-length (- sb-xc:most-positive-fixnum - sb-xc:most-negative-fixnum))))) + (inst sub eax-tn #.most-negative-fixnum) + (inst shr eax-tn #.(integer-length (- most-positive-fixnum + most-negative-fixnum))))) ;;; A (SIGNED-BYTE 32) can be represented with either fixnum or a bignum with ;;; exactly one digit. diff --git a/src/compiler/x86/vm.lisp b/src/compiler/x86/vm.lisp index 25bf339a5b..e8dcb7bddb 100644 --- a/src/compiler/x86/vm.lisp +++ b/src/compiler/x86/vm.lisp @@ -347,7 +347,7 @@ ;;; the appropriate SC number, otherwise return NIL. (defun immediate-constant-sc (value) (typecase value - ((or (integer #.sb-xc:most-negative-fixnum #.sb-xc:most-positive-fixnum) + ((or (integer #.most-negative-fixnum #.most-positive-fixnum) character) immediate-sc-number) (symbol diff --git a/tests/vm.before-xc.lisp b/tests/vm.before-xc.lisp index f7300bc1e3..1a903da37c 100644 --- a/tests/vm.before-xc.lisp +++ b/tests/vm.before-xc.lisp @@ -25,10 +25,10 @@ (not (immediate-constant-sc x))))) ;; target fixnums can be dealt with as immediates; target bignums ;; can not. - (yes #.sb-xc:most-positive-fixnum) - (yes #.sb-xc:most-negative-fixnum) - (no #.(1+ sb-xc:most-positive-fixnum)) - (no #.(1- sb-xc:most-negative-fixnum))) + (yes #.most-positive-fixnum) + (yes #.most-negative-fixnum) + (no #.(1+ most-positive-fixnum)) + (no #.(1- most-negative-fixnum))) ;; Assert that DO-PACKED-TNS has unsurprising behavior if the body RETURNs. ;; This isn't a test in the problem domain of CL - it's of an internal macro, From e09b2148a23a8b6c0c8421c7cd0c578aa70891f7 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Thu, 23 Jul 2020 23:29:28 -0700 Subject: [PATCH 0420/4023] Less SB-XC: noise. --- build-order.lisp-expr | 2 +- src/assembly/assemfile.lisp | 2 +- src/code/cas.lisp | 8 ++-- src/code/cold-init-helper-macros.lisp | 2 +- src/code/condition.lisp | 6 +-- src/code/cross-byte.lisp | 6 +-- src/code/cross-misc.lisp | 2 +- src/code/debug-var-io.lisp | 4 +- src/code/defbangstruct.lisp | 4 +- src/code/defmacro.lisp | 8 ++-- src/code/defsetfs.lisp | 12 +++--- src/code/defstruct.lisp | 8 ++-- src/code/destructuring-bind.lisp | 4 +- src/code/early-extensions.lisp | 2 +- src/code/early-type.lisp | 4 +- src/code/last-file.lisp | 2 +- src/code/late-type.lisp | 2 +- src/code/list.lisp | 2 +- src/code/loop.lisp | 8 ++-- src/code/macroexpand.lisp | 10 ++--- src/code/macros.lisp | 14 +++---- src/code/misc.lisp | 6 +-- src/code/number-dispatch.lisp | 6 +-- src/code/numbers.lisp | 1 + src/code/primordial-extensions.lisp | 4 +- src/code/print.lisp | 2 +- src/code/reader.lisp | 4 +- src/code/setf.lisp | 28 ++++++------- src/code/source-location.lisp | 2 +- src/code/target-char.lisp | 2 +- src/code/target-unicode.lisp | 4 +- src/cold/set-up-cold-packages.lisp | 46 ++++++++++----------- src/cold/shared.lisp | 6 +-- src/cold/warm.lisp | 2 +- src/compiler/array-tran.lisp | 28 ++++++------- src/compiler/ctype.lisp | 4 +- src/compiler/debug-dump.lisp | 12 +++--- src/compiler/deftype.lisp | 2 +- src/compiler/dump.lisp | 10 ++--- src/compiler/early-c.lisp | 7 ---- src/compiler/early-constantp.lisp | 4 +- src/compiler/early-globaldb.lisp | 4 +- src/compiler/fndb.lisp | 2 +- src/compiler/generic/genesis.lisp | 4 +- src/compiler/generic/vm-type.lisp | 4 +- src/compiler/info-functions.lisp | 12 +++--- src/compiler/ir1-translators.lisp | 8 ++-- src/compiler/ir1report.lisp | 2 +- src/compiler/ir1tran-lambda.lisp | 6 +-- src/compiler/ir1tran.lisp | 10 ++--- src/compiler/ir2tran.lisp | 4 +- src/compiler/macros.lisp | 4 +- src/compiler/main.lisp | 58 +++++++++++++-------------- src/compiler/meta-vmdef.lisp | 2 +- src/compiler/parse-lambda-list.lisp | 6 +-- src/compiler/srctran.lisp | 8 ++-- src/compiler/sxhash.lisp | 2 +- src/compiler/target-main.lisp | 2 +- src/compiler/x86-64/insts.lisp | 22 +++++----- src/compiler/xref.lisp | 2 +- tests/info.before-xc.lisp | 2 +- 61 files changed, 225 insertions(+), 231 deletions(-) diff --git a/build-order.lisp-expr b/build-order.lisp-expr index 92fd44ec23..1440e53ef4 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -391,7 +391,7 @@ ("src/code/class-init" :c-headers) - ;; The DEFSTRUCT machinery needs SB-XC:SUBTYPEP, defined in + ;; The DEFSTRUCT machinery needs SUBTYPEP, defined in ;; "code/late-type", and SB-XC:TYPEP, defined in "code/cross-type", ;; and SPECIALIZE-ARRAY-TYPE, defined in "compiler/generic/vm-type", ;; and SB-XC:PROCLAIM, defined in "src/compiler/proclaim" diff --git a/src/assembly/assemfile.lisp b/src/assembly/assemfile.lisp index 713d8e1fc5..b1478fd283 100644 --- a/src/assembly/assemfile.lisp +++ b/src/assembly/assemfile.lisp @@ -157,7 +157,7 @@ (emit-alignment sb-vm:n-lowtag-bits ;; EMIT-LONG-NOP does not exist for (not x86-64) #+x86-64 :long-nop)) - (when *compile-print* + (when cl:*compile-print* (format *error-output* "~S assembled~%" ',name))))) (defun arg-or-res-spec (reg) diff --git a/src/code/cas.lisp b/src/code/cas.lisp index c8333162af..bba4b91368 100644 --- a/src/code/cas.lisp +++ b/src/code/cas.lisp @@ -85,7 +85,7 @@ EXPERIMENTAL: Interface subject to change." ;; to use %MACROEXPAND[-1] so as not to lose the "truly-the"-ness ;; 2. if both a CAS expander and a macro exist, the CAS expander ;; should be preferred before macroexpanding (just like SETF does) - (let ((expanded (sb-xc:macroexpand place environment))) + (let ((expanded (macroexpand place environment))) (flet ((invalid-place () (error "Invalid place to CAS: ~S -> ~S" place expanded))) (unless (consp expanded) @@ -114,7 +114,7 @@ EXPERIMENTAL: Interface subject to change." (vals nil) (args nil)) (dolist (x (reverse (cdr expanded))) - (cond ((sb-xc:constantp x environment) + (cond ((constantp x environment) (push x args)) (t (let ((tmp (gensymify x))) @@ -232,7 +232,7 @@ been defined. (See SB-EXT:CAS for more information.) (define-cas-expander symbol-value (name &environment env) (multiple-value-bind (tmp val cname) - (if (sb-xc:constantp name env) + (if (constantp name env) (values nil nil (constant-form-value name env)) (values (gensymify name) name nil)) (let ((symbol (or tmp `',cname))) @@ -265,7 +265,7 @@ been defined. (See SB-EXT:CAS for more information.) (eval-when (:compile-toplevel :load-toplevel :execute) (defun expand-atomic-frob (name specified-place diff env - &aux (place (sb-xc:macroexpand specified-place env))) + &aux (place (macroexpand specified-place env))) (declare (type (member atomic-incf atomic-decf) name)) (flet ((invalid-place () (error "Invalid first argument to ~S: ~S" name specified-place)) diff --git a/src/code/cold-init-helper-macros.lisp b/src/code/cold-init-helper-macros.lisp index 0dfb60c7a6..46dea37b4e 100644 --- a/src/code/cold-init-helper-macros.lisp +++ b/src/code/cold-init-helper-macros.lisp @@ -75,7 +75,7 @@ (case method ((nil) ; default (values '(cl:make-load-form-saving-slots obj :environment env) - '(sb-xc:make-load-form-saving-slots obj :environment env))) + '(make-load-form-saving-slots obj :environment env))) (t (assert (not (member :host usable-by))) (values nil `(funcall ,method obj env)))) diff --git a/src/code/condition.lisp b/src/code/condition.lisp index ac52cedec0..da282e79f1 100644 --- a/src/code/condition.lisp +++ b/src/code/condition.lisp @@ -1003,7 +1003,7 @@ () (:default-initargs :references '((:ansi-cl :function make-array) - (:ansi-cl :function sb-xc:upgraded-array-element-type)))) + (:ansi-cl :function upgraded-array-element-type)))) (define-condition initial-element-mismatch-style-warning (array-initial-element-mismatch simple-style-warning) @@ -1236,7 +1236,7 @@ SB-EXT:PACKAGE-LOCKED-ERROR-SYMBOL.")) "An attempt to access an array of element-type ~ NIL was made. Congratulations!"))) (:default-initargs - :references '((:ansi-cl :function sb-xc:upgraded-array-element-type) + :references '((:ansi-cl :function upgraded-array-element-type) (:ansi-cl :section (15 1 2 1)) (:ansi-cl :section (15 1 2 2))))) @@ -1367,7 +1367,7 @@ longer than permitted by the deadline.")) () (:default-initargs :format-control - #.(sb-xc:macroexpand-1 ; stuff in a literal # + #.(macroexpand-1 ; stuff in a literal # '(sb-format:tokens "Symbol ~/sb-ext:print-symbol-with-prefix/ cannot ~ be both the name of a type and the name of a declaration")) :references '((:ansi-cl :section (3 8 21))))) diff --git a/src/code/cross-byte.lisp b/src/code/cross-byte.lisp index 1cea9823c2..391d88ebe3 100644 --- a/src/code/cross-byte.lisp +++ b/src/code/cross-byte.lisp @@ -55,7 +55,7 @@ (declaim (ftype function bug)) (define-setf-expander sb-xc:ldb (cross-byte int &environment env) (multiple-value-bind (temps vals stores store-form access-form) - (get-setf-expansion int env) + (cl:get-setf-expansion int env) (when (cdr stores) (bug "SETF SB-XC:LDB too hairy!")) (let ((btemp (gensym)) @@ -69,8 +69,8 @@ `(cl:ldb (uncross-byte ,btemp) ,access-form))))) (define-setf-expander sb-xc:mask-field (cross-byte int &environment env) - (multiple-value-bind (temps vals stores store-form access-form) - (get-setf-expansion int env) + (multiple-value-bind (temps vals stores store-form access-form) + (cl:get-setf-expansion int env) (when (cdr stores) (bug "SETF SB-XC:MASK-FIELD too hairy!")) (let ((btemp (gensym)) diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index c98d20b711..b84cb64432 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -336,7 +336,7 @@ (destructuring-bind (symbol value) (matchp '((quote ?) ? . :ignore) (cdr form)) `(progn (defconstant ,symbol ,value) (sb-c::%defconstant ',symbol ,symbol nil)))) - (sb-xc:defconstant ; we see this maro as well. The host expansion will not do, + (defconstant ; we see this macro as well. The host expansion will not do, ;; because it calls our %defconstant which does not assign the symbol a value. ;; It might be possible to change that now that we don't use CL: symbols. (destructuring-bind (symbol value) (cdr form) diff --git a/src/code/debug-var-io.lisp b/src/code/debug-var-io.lisp index ede135e025..6aa30d12e5 100644 --- a/src/code/debug-var-io.lisp +++ b/src/code/debug-var-io.lisp @@ -210,7 +210,7 @@ lz-compress)) (defun lz-compress (input) (if (> (length input) +max-lz-size+) - (sb-xc:coerce input '(simple-array (unsigned-byte 8) (*))) + (coerce input '(simple-array (unsigned-byte 8) (*))) (let* ((length (length input)) (output (make-array length :element-type '(unsigned-byte 8) @@ -270,7 +270,7 @@ (mask-signed-field 8 (the (unsigned-byte 8) x))) input) #+sb-xc-host - (sb-xc:coerce output '(simple-array (unsigned-byte 8) (*))) + (coerce output '(simple-array (unsigned-byte 8) (*))) #-sb-xc-host (%shrink-vector (%array-data output) (fill-pointer output))))) #+(or) diff --git a/src/code/defbangstruct.lisp b/src/code/defbangstruct.lisp index ebfb15e596..0f966edea3 100644 --- a/src/code/defbangstruct.lisp +++ b/src/code/defbangstruct.lisp @@ -53,7 +53,7 @@ `(progn (sb-xc:defstruct ,@args) ,@(when supertype - `((aver (subtypep ',supertype 'structure!object)))) + `((aver (cl:subtypep ',supertype 'structure!object)))) (defstruct (,name ,@(unless supertype '((:include structure!object))) ,@(remove :pure options :key #'car)) @@ -69,7 +69,7 @@ (defmacro sb-xc:defstruct (&rest args) `(push (make-delayed-defstruct ',args) *delayed-defstructs*)) ;;; But instead it's this. No eval-when needed, since we LOAD this file. -(setf (macro-function 'sb-xc:defstruct) +(setf (cl:macro-function 'sb-xc:defstruct) (lambda (form environment) (declare (ignore environment)) `(push (make-delayed-defstruct ',(cdr form)) *delayed-defstructs*))) diff --git a/src/code/defmacro.lisp b/src/code/defmacro.lisp index dc73794e92..e4c84b678d 100644 --- a/src/code/defmacro.lisp +++ b/src/code/defmacro.lisp @@ -62,13 +62,13 @@ ;; and comparing it with the new one. (warn 'redefinition-with-defmacro :name name :new-function definition :new-location source-location)) - (setf (sb-xc:macro-function name) definition))) + (setf (macro-function name) definition))) name) #+sb-xc-host -(let ((real-expander (macro-function 'sb-xc:defmacro))) +(let ((real-expander (cl:macro-function 'sb-xc:defmacro))) ;; Inform the cross-compiler how to expand SB-XC:DEFMACRO (= DEFMACRO). - (setf (sb-xc:macro-function 'sb-xc:defmacro) + (setf (macro-function 'sb-xc:defmacro) (lambda (form env) (declare (ignore env)) ;; Since SB-KERNEL:LEXENV isn't compatible with the host, @@ -77,5 +77,5 @@ (funcall real-expander form nil))) ;; Building the cross-compiler should skip the compile-time-too ;; processing SB-XC:DEFMACRO. - (setf (macro-function 'sb-xc:defmacro) + (setf (cl:macro-function 'sb-xc:defmacro) (lambda (form env) `(let () ,(funcall real-expander form env))))) diff --git a/src/code/defsetfs.lisp b/src/code/defsetfs.lisp index 1fab144388..97fdfaaafb 100644 --- a/src/code/defsetfs.lisp +++ b/src/code/defsetfs.lisp @@ -199,14 +199,14 @@ ;; it. In particular, this must fail: (SETF (GET 'SYM 'IND (ERROR "Foo")) 3). (defsetf get (symbol indicator &optional default &environment e) (newval) - (let ((constp (sb-xc:constantp default e))) + (let ((constp (constantp default e))) ;; always reference default's temp var to "use" it `(%put ,symbol ,indicator ,(if constp newval `(progn ,default ,newval))))) ;; A possible optimization for read/modify/write of GETHASH ;; would be to predetermine the vector element where the key/value pair goes. (defsetf gethash (key hashtable &optional default &environment e) (newval) - (let ((constp (sb-xc:constantp default e))) + (let ((constp (constantp default e))) ;; always reference default's temp var to "use" it `(%puthash ,key ,hashtable ,(if constp newval `(progn ,default ,newval))))) @@ -215,7 +215,7 @@ (define-setf-expander the (&whole form type place &environment env) (binding* ((op (car form)) ((temps subforms store-vars setter getter) - (sb-xc:get-setf-expansion place env))) + (get-setf-expansion place env))) (values temps subforms store-vars `(multiple-value-bind ,store-vars (,op ,type (values ,@store-vars)) ,setter) @@ -223,7 +223,7 @@ (define-setf-expander getf (place prop &optional default &environment env) (binding* (((place-tempvars place-tempvals stores set get) - (sb-xc:get-setf-expansion place env)) + (get-setf-expansion place env)) ((call-tempvars call-tempvals call-args bitmask) (collect-setf-temps (list prop default) env '(indicator default))) (newval (gensym "NEW"))) @@ -245,7 +245,7 @@ (let (all-dummies all-vals newvals setters getters) (dolist (place places) (multiple-value-bind (dummies vals newval setter getter) - (sb-xc:get-setf-expansion place env) + (get-setf-expansion place env) ;; ANSI 5.1.2.3 explains this logic quite precisely. -- ;; CSR, 2004-06-29 (setq all-dummies (append all-dummies dummies (cdr newval)) @@ -307,7 +307,7 @@ place with bits from the low-order end of the new value." (collect-setf-temps (list spec) env '(bytespec)))) (byte (if (cdr byte-args) (cons 'byte byte-args) (car byte-args))) ((place-tempvars place-tempvals stores setter getter) - (sb-xc:get-setf-expansion place env)) + (get-setf-expansion place env)) (newval (sb-xc:gensym "NEW")) (new-int `(,store-fun ,(if (eq load-fun 'logbitp) `(if ,newval 1 0) newval) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index cdc0291a57..bfb250496e 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -926,7 +926,7 @@ unless :NAMED is also specified."))) index (dsd-index included-slot)) (when (and safe-p (not (equal type (dsd-type included-slot))) - (not (sb-xc:subtypep (dsd-type included-slot) type))) + (not (subtypep (dsd-type included-slot) type))) (setf safe-p nil))) (t ;; Compute the index of this DSD. First decide whether the slot is raw. @@ -1414,7 +1414,7 @@ or they must be declared locally notinline at each call site.~@:>" (dolist (name (intersection onames nnames)) (let ((os (find name oslots :key #'dsd-name :test #'string=)) (ns (find name nslots :key #'dsd-name :test #'string=))) - (unless (sb-xc:subtypep (dsd-type ns) (dsd-type os)) + (unless (subtypep (dsd-type ns) (dsd-type os)) (retyped name)) (unless (and (= (dsd-index os) (dsd-index ns)) (eq (dsd-raw-type os) (dsd-raw-type ns))) @@ -2194,8 +2194,8 @@ or they must be declared locally notinline at each call site.~@:>" ;;; * (defmethod make-load-form ((x S) &optional e) (m-l-f-s-s x :slot-names '(a))) ;;; After these definitions, a dumped S will have 0 in slot B. ;;; -(defun sb-xc:make-load-form-saving-slots (object &key (slot-names nil slot-names-p) - environment) +(defun make-load-form-saving-slots (object &key (slot-names nil slot-names-p) + environment) (declare (ignore environment)) (flet ((quote-p (thing) (not (self-evaluating-p thing)))) (declare (inline quote-p)) diff --git a/src/code/destructuring-bind.lisp b/src/code/destructuring-bind.lisp index a762b80a63..7b28345b1e 100644 --- a/src/code/destructuring-bind.lisp +++ b/src/code/destructuring-bind.lisp @@ -43,11 +43,11 @@ tree structure resulting from the evaluation of EXPRESSION." ;; So install our expander even if it produces suboptimal code for the host. (defmacro named-ds-bind (&whole form &rest args) (declare (ignore args)) - (funcall (sb-xc:macro-function 'named-ds-bind) form nil)) + (funcall (macro-function 'named-ds-bind) form nil)) ;; A similar problem in reverse: SB-XC:DEFMACRO's expansion uses NAMED-DS-BIND ;; which expands to BINDING* (from "early-extensions") that hand-written code ;; also wants to use. So expand it in the target by using the host's expander ;; until it gets seen again during make-host-2. - (setf (sb-xc:macro-function 'binding*) + (setf (macro-function 'binding*) (lambda (form env) (declare (ignore env)) (cl:macroexpand-1 form nil)))) diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index d5cbc482e0..9dba64fed9 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -1126,7 +1126,7 @@ NOTE: This interface is experimental and subject to change." ((or symbol cons) (%check-deprecated-type type-specifier)) (class - (let ((name (class-name type-specifier))) + (let ((name (cl:class-name type-specifier))) (when (and name (symbolp name) (eq type-specifier (find-class name nil))) (%check-deprecated-type name)))))) diff --git a/src/code/early-type.lisp b/src/code/early-type.lisp index c401da7f2a..ee1149a2ce 100644 --- a/src/code/early-type.lisp +++ b/src/code/early-type.lisp @@ -928,7 +928,7 @@ (with-system-mutex ((hash-table-lock table)) (or (gethash spec table) (progn #+sb-xc-host - (when *compile-print* + (when cl:*compile-print* (format t "~&; NEW UNKNOWN-TYPE ~S~%" spec)) (setf (gethash spec table) (make-unknown-type :specifier spec)))))) @@ -1130,7 +1130,7 @@ expansion happened." ;;; #+sb-xc-host (labels ((xform (type-spec env parser) - (if (not (sb-xc:constantp type-spec env)) + (if (not (constantp type-spec env)) (values nil t) (let* ((expr (constant-form-value type-spec env)) (parse (funcall parser expr))) diff --git a/src/code/last-file.lisp b/src/code/last-file.lisp index f4a3e4b20c..3beb4ac343 100644 --- a/src/code/last-file.lisp +++ b/src/code/last-file.lisp @@ -29,7 +29,7 @@ (defun check-compile-time-sxhashes () (loop for (object . hash) across sb-c::*sxhash-crosscheck* unless (= (sxhash object) hash) - do (error "SB-XC:SXHASH computed wrong answer for ~S. Got ~x should be ~x" + do (error "SXHASH computed wrong answer for ~S. Got ~x should be ~x" object hash (sxhash object)))) (check-compile-time-sxhashes) diff --git a/src/code/late-type.lisp b/src/code/late-type.lisp index f78316b901..dffd22e7c8 100644 --- a/src/code/late-type.lisp +++ b/src/code/late-type.lisp @@ -975,7 +975,7 @@ ;;; type specifiers (or their expansions) are EQUAL." ;;; i.e. though it is not longer technically a MUST, it suggests that EQUAL is ;;; in fact a valid implementation, at least where it computes T. -(defun sb-xc:subtypep (type1 type2 &optional environment) +(defun subtypep (type1 type2 &optional environment) "Return two values indicating the relationship between type1 and type2. If values are T and T, type1 definitely is a subtype of type2. If values are NIL and T, type1 definitely is not a subtype of type2. diff --git a/src/code/list.lisp b/src/code/list.lisp index 9e86a39710..157eee20c3 100644 --- a/src/code/list.lisp +++ b/src/code/list.lisp @@ -343,7 +343,7 @@ (lastn-macro unsigned-byte))))))) (define-compiler-macro last (&whole form list &optional (n 1) &environment env) - (if (sb-xc:constantp n env) + (if (constantp n env) (case (constant-form-value n env) (0 `(%last0 ,list)) (1 `(%last1 ,list)) diff --git a/src/code/loop.lisp b/src/code/loop.lisp index 7006fd7e82..df7ff59f0c 100644 --- a/src/code/loop.lisp +++ b/src/code/loop.lisp @@ -185,7 +185,7 @@ constructed. (defun make-loop-minimax (answer-variable type) (let ((infinity-data (cdr (assoc type +loop-minimax-type-infinities-alist+ - :test #'sb-xc:subtypep)))) + :test #'subtypep)))) (make-loop-minimax-internal :answer-variable answer-variable :type type @@ -521,7 +521,7 @@ code to be loaded. ;;;; code analysis stuff (defun loop-constant-fold-if-possible (form &optional expected-type) - (let* ((constantp (sb-xc:constantp form)) + (let* ((constantp (constantp form)) (value (and constantp (constant-form-value form)))) (when (and constantp expected-type) (unless (sb-xc:typep value expected-type) @@ -576,7 +576,7 @@ code to be loaded. &optional (default-type required-type)) (if (null specified-type) default-type - (multiple-value-bind (a b) (sb-xc:subtypep specified-type required-type) + (multiple-value-bind (a b) (subtypep specified-type required-type) (cond ((not b) (loop-warn "LOOP couldn't verify that ~S is a subtype of the required type ~S." specified-type required-type)) @@ -958,7 +958,7 @@ code to be loaded. desetq &aux (loop *loop*)) (cond ((or (null name) (null dtype) (eq dtype t)) nil) ((symbolp name) - (unless (or (sb-xc:subtypep t dtype) + (unless (or (subtypep t dtype) (and (eq (sb-xc:symbol-package name) *cl-package*) (eq :special (info :variable :kind name)))) (let ((dtype `(type ,(if initialization diff --git a/src/code/macroexpand.lisp b/src/code/macroexpand.lisp index 228cfc5b45..fa0b85c127 100644 --- a/src/code/macroexpand.lisp +++ b/src/code/macroexpand.lisp @@ -13,7 +13,7 @@ ;;;; syntactic environment access -(defun sb-xc:special-operator-p (symbol) +(defun special-operator-p (symbol) "If the symbol globally names a special form, return T, otherwise NIL." (declare (symbol symbol)) (eq (info :function :kind symbol) :special-form)) @@ -105,7 +105,7 @@ (values form nil)))) ((and (listp form) (let ((fn (car form))) - (and (symbolp fn) (sb-xc:macro-function fn env)))) + (and (symbolp fn) (macro-function fn env)))) (perform-expansion it)) (t (values form nil))))) @@ -117,7 +117,7 @@ environment." (labels ((frob (form expanded) (multiple-value-bind (new-form newly-expanded-p) - (sb-xc:macroexpand-1 form env) + (macroexpand-1 form env) (if newly-expanded-p (frob new-form t) (values new-form expanded))))) @@ -127,8 +127,8 @@ (defun %macroexpand-1 (form &optional env) (if (or (atom form) (let ((op (car form))) - (not (and (symbolp op) (sb-xc:special-operator-p op))))) - (sb-xc:macroexpand-1 form env) + (not (and (symbolp op) (special-operator-p op))))) + (macroexpand-1 form env) (values form nil))) ;;; Like MACROEXPAND, but takes care not to expand special forms. diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 257951ea3f..e5728e8d75 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -440,7 +440,7 @@ evaluated as a PROGN." ;; form will take longer than can be described as adequate, as the ;; optional dispatch mechanism for the M-V-B gets increasingly ;; hairy. - (let ((val (and (sb-xc:constantp n env) (constant-form-value n env)))) + (let ((val (and (constantp n env) (constant-form-value n env)))) (if (and (integerp val) (<= 0 val (or #+(or x86-64 arm64 riscv) ;; better DEFAULT-UNKNOWN-VALUES 1000 10))) ; Arbitrary limit. @@ -491,13 +491,13 @@ evaluated as a PROGN." (let* ((func (if (listp test-form) (car test-form))) (new-test (if (and (typep func '(and symbol (not null))) - (not (sb-xc:macro-function func env)) - (not (sb-xc:special-operator-p func)) + (not (macro-function func env)) + (not (special-operator-p func)) (proper-list-p (cdr test-form))) ;; TEST-FORM is a function call. We do not attempt this ;; if TEST-FORM is a macro invocation or special form. `(,func ,@(mapcar (lambda (place) - (if (sb-xc:constantp place env) + (if (constantp place env) place (with-unique-names (temp) (bindings `(,temp ,place)) @@ -636,7 +636,7 @@ invoked. In that case it will store into PLACE and start over." (sb-c::warn-if-compiler-macro-dependency-problem name) ;; FIXME: warn about incompatible lambda list with ;; respect to parent function? - (setf (sb-xc:compiler-macro-function name) definition) + (setf (compiler-macro-function name) definition) name)) ;;;; CASE, TYPECASE, and friends @@ -1663,7 +1663,7 @@ symbol-case giving up: case=((V U) (F)) ((clist members clist-ok) (with-current-source-form (list) (cond - ((sb-xc:constantp list env) + ((constantp list env) (binding* ((value (constant-form-value list env)) ((all dot) (list-members value :max-length 20))) (when (eql dot t) @@ -1674,7 +1674,7 @@ symbol-case giving up: case=((V U) (F)) (values value nil nil) (values value all t)))) ((and (consp list) (eq 'list (car list)) - (every (lambda (arg) (sb-xc:constantp arg env)) (cdr list))) + (every (lambda (arg) (constantp arg env)) (cdr list))) (let ((values (mapcar (lambda (arg) (constant-form-value arg env)) (cdr list)))) (values values values t))) (t diff --git a/src/code/misc.lisp b/src/code/misc.lisp index 3410737eae..58aea7e61d 100644 --- a/src/code/misc.lisp +++ b/src/code/misc.lisp @@ -12,11 +12,11 @@ (in-package "SB-IMPL") -(defun sb-xc:lisp-implementation-type () +(defun lisp-implementation-type () "SBCL") -(defun sb-xc:lisp-implementation-version () +(defun lisp-implementation-version () ;; Read the version file once and once only #+sb-xc-host #.(sb-cold:read-from-file "version.lisp-expr") - #-sb-xc-host #.(sb-xc:lisp-implementation-version)) + #-sb-xc-host #.(lisp-implementation-version)) diff --git a/src/code/number-dispatch.lisp b/src/code/number-dispatch.lisp index 97990dc012..18d0f7cd19 100644 --- a/src/code/number-dispatch.lisp +++ b/src/code/number-dispatch.lisp @@ -92,11 +92,11 @@ (let ((var (first vars)) (cases (sort cases #'type-test-order :key #'car))) (flet ((error-if-sub-or-supertype (type1 type2) - (when (or (sb-xc:subtypep type1 type2) - (sb-xc:subtypep type2 type1)) + (when (or (subtypep type1 type2) + (subtypep type2 type1)) (error "Types not disjoint: ~S ~S." type1 type2))) (error-if-supertype (type1 type2) - (when (sb-xc:subtypep type2 type1) + (when (subtypep type2 type1) (error "Type ~S ordered before subtype ~S." type1 type2))) (test-type-pairs (fun) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index 4ad011bb91..24331f7095 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -10,6 +10,7 @@ ;;;; files for more information. (in-package "SB-KERNEL") + ;;;; canonicalization utilities ;;; If IMAGPART is 0, return REALPART, otherwise make a complex. This is diff --git a/src/code/primordial-extensions.lisp b/src/code/primordial-extensions.lisp index 75041eb309..63ac0299b9 100644 --- a/src/code/primordial-extensions.lisp +++ b/src/code/primordial-extensions.lisp @@ -329,10 +329,10 @@ #-sb-xc-host (eval-when (:compile-toplevel) (sb-xc:defmacro defconstant-eqx (symbol expr eqx &optional doc) - (let ((constp (sb-xc:constantp expr))) + (let ((constp (constantp expr))) `(progn (eval-when (:compile-toplevel) - (sb-xc:defconstant ,symbol (%defconstant-eqx-value ',symbol ,expr ,eqx)) + (defconstant ,symbol (%defconstant-eqx-value ',symbol ,expr ,eqx)) ,@(unless constp `((push ',symbol sb-c::*!const-value-deferred*)))) (eval-when (:load-toplevel) diff --git a/src/code/print.lisp b/src/code/print.lisp index 38117df113..4a31c7b68e 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -218,7 +218,7 @@ variable: an unreadable object representing the error is printed instead.") ;; This is exact for bases which are exactly a power-of-2, or an overestimate ;; otherwise, as mandated by the finite output stream. (let ((bits-per-char - (aref #.(sb-xc:coerce + (aref #.(coerce ;; base 2 or base 3 = 1 bit per character ;; base 4 .. base 7 = 2 bits per character ;; base 8 .. base 15 = 3 bits per character, etc diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 643476e4a2..314af77e98 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -1683,8 +1683,8 @@ extended :: syntax." (inline token-buf-getchar)) ; makes for smaller code (let* ((fixnum-max-digits (macrolet ((maxdigits () - (sb-xc:coerce (integer-reader-safe-digits) - '(vector (unsigned-byte 8))))) + (coerce (integer-reader-safe-digits) + '(vector (unsigned-byte 8))))) (aref (maxdigits) (- base 2)))) (base-power (macrolet ((base-powers () diff --git a/src/code/setf.lisp b/src/code/setf.lisp index 614d909f42..3f6bd8093e 100644 --- a/src/code/setf.lisp +++ b/src/code/setf.lisp @@ -46,8 +46,8 @@ ;;; of value forms, a list of the single store-value form, a storing function, ;;; and an accessing function. (declaim (ftype (function (t &optional lexenv-designator)) - sb-xc:get-setf-expansion)) -(defun sb-xc:get-setf-expansion (form &optional environment) + get-setf-expansion)) +(defun get-setf-expansion (form &optional environment) "Return five values needed by the SETF machinery: a list of temporary variables, a list of values with which to fill them, a list of temporaries for the new values, the setting function, and the accessing function." @@ -68,7 +68,7 @@ (multiple-value-bind (expansion expanded) ;; Previously this called %MACROEXPAND, but the two operations ;; are equivalent on atoms, so do the one that is "less". - (sb-xc:macroexpand-1 form environment) + (macroexpand-1 form environment) (if expanded (retry expansion) (let ((vals (newvals 1))) @@ -186,7 +186,7 @@ :setf (list (cadr place) value-form) it))))) (multiple-value-bind (temps vals newval setter) - (sb-xc:get-setf-expansion place env) + (get-setf-expansion place env) (car (gen-let* (mapcar #'list temps vals) (gen-mv-bind newval value-form (forms-list setter))))))) @@ -202,7 +202,7 @@ (collect ((let*-bindings) (mv-bindings) (setters) (getters)) (dolist (arg (butlast args)) (multiple-value-bind (temps subforms store-vars setter getter) - (sb-xc:get-setf-expansion arg env) + (get-setf-expansion arg env) (let*-bindings (mapcar #'list temps subforms)) (mv-bindings store-vars) (setters setter) @@ -239,7 +239,7 @@ (when (and (not (symbolp place)) (eq operator 'psetq)) (%program-error "Place ~S in PSETQ is not a SYMBOL" place)) (multiple-value-bind (temps vals stores setter) - (sb-xc:get-setf-expansion place env) + (get-setf-expansion place env) (let*-bindings (mapcar #'list temps vals)) (mv-bindings (cons stores value-form)) (setters setter)))) @@ -276,7 +276,7 @@ (collect ((let*-bindings) (mv-bindings) (setters) (getters)) (dolist (arg args) (multiple-value-bind (temps subforms store-vars setter getter) - (sb-xc:get-setf-expansion arg env) + (get-setf-expansion arg env) (let*-bindings (mapcar #'list temps subforms)) (mv-bindings store-vars) (setters setter) @@ -321,7 +321,7 @@ (if (symbolp (setq place (macroexpand-for-setf place env))) `(prog1 (car ,place) (setq ,place (cdr ,place))) (multiple-value-bind (temps vals stores setter getter) - (sb-xc:get-setf-expansion place env) + (get-setf-expansion place env) (let ((list (copy-symbol 'list)) (ret (copy-symbol 'car))) `(let* (,@(mapcar #'list temps vals) @@ -338,7 +338,7 @@ remove the property specified by the indicator. Returns T if such a property was present, NIL if not." (multiple-value-bind (temps vals newval setter getter) - (sb-xc:get-setf-expansion place env) + (get-setf-expansion place env) (let* ((flag (make-symbol "FLAG")) (body `(multiple-value-bind (,(car newval) ,flag) ;; See ANSI 5.1.3 for why we do out-of-order evaluation @@ -380,7 +380,7 @@ (if (symbolp (setq place (macroexpand-for-setf place env))) `(setq ,place (,operator ,delta ,place)) (multiple-value-bind (dummies vals newval setter getter) - (sb-xc:get-setf-expansion place env) + (get-setf-expansion place env) `(let* (,@(mapcar #'list dummies vals) (,(car newval) (,operator ,delta ,getter)) ,@(cdr newval)) @@ -519,7 +519,7 @@ (let ((mask 0) (bit 1)) (dolist (form sexprs (values (temp-vars) (temp-vals) (call-arguments) mask)) - (call-arguments (if (sb-xc:constantp form environment) + (call-arguments (if (constantp form environment) (progn (next-name-hint) form) ; Skip one hint. (let ((temp (nice-tempname form))) (setq mask (logior mask bit)) @@ -541,7 +541,7 @@ (binding* (((before-temps before-vals before-args) (collect-setf-temps before-arg-forms environment name-hints)) ((place-temps place-subforms stores setter getter) - (sb-xc:get-setf-expansion place environment)) + (get-setf-expansion place environment)) ((after-temps after-vals after-args) (if after-args-bindp (collect-setf-temps after-arg-forms environment name-hints) @@ -558,7 +558,7 @@ (every (lambda (x) (or (member x place-temps) (eq x newval-temp) - (sb-xc:constantp x environment))) + (constantp x environment))) (cdr setter))))) (setq newval-binding nil setter (substitute compute newval-temp setter))) @@ -582,7 +582,7 @@ ;; Perhaps it would be more elegant to keep the docstring attached ;; to the expander function, as for CAS? (make-macro-lambda `(setf-expander ,access-fn) lambda-list body - 'sb-xc:define-setf-expander access-fn + 'define-setf-expander access-fn :doc-string-allowed :external) ;; Maybe kill docstring, but only under the cross-compiler. #+(and (not sb-doc) sb-xc-host) (setq doc nil) diff --git a/src/code/source-location.lisp b/src/code/source-location.lisp index 87b97c096f..fddcf0fe8b 100644 --- a/src/code/source-location.lisp +++ b/src/code/source-location.lisp @@ -84,7 +84,7 @@ (or *source-namestring* (when source-info (make-file-info-namestring - *compile-file-pathname* + cl:*compile-file-pathname* (get-toplevelish-file-info source-info))))) tlf-number form-number) diff --git a/src/code/target-char.lisp b/src/code/target-char.lisp index 59abf01916..7908c972a9 100644 --- a/src/code/target-char.lisp +++ b/src/code/target-char.lisp @@ -42,7 +42,7 @@ (macrolet ((frob () (flet ((coerce-it (array) - (sb-xc:coerce array '(simple-array (unsigned-byte 8) 1))) + (coerce array '(simple-array (unsigned-byte 8) 1))) (file (name type) (let ((dir (sb-cold:prepend-genfile-path "output/"))) (make-pathname :directory (pathname-directory (merge-pathnames dir)) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 1dba0c5f61..781026e269 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -214,7 +214,7 @@ If CHARACTER does not have a known block, returns :NO-BLOCK" (let* ((code (char-code character)) (block-index (ordered-ranges-position code - #.(sb-xc:coerce (sb-cold:read-from-file "output/block-ranges.lisp-expr") + #.(coerce (sb-cold:read-from-file "output/block-ranges.lisp-expr") '(vector (unsigned-byte 32)))))) (if block-index (aref #.(sb-cold:read-from-file "output/block-names.lisp-expr") block-index) @@ -347,7 +347,7 @@ disappears when accents are placed on top of it. and NIL otherwise" (eval-when (:compile-toplevel) (sb-xc:defmacro coerce-to-ordered-ranges (array) - (sb-xc:coerce array '(vector (unsigned-byte 32))))) + (coerce array '(vector (unsigned-byte 32))))) (defun default-ignorable-p (character) "Returns T if CHARACTER is a Default_Ignorable_Code_Point" diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 73afca46a0..04d1c19b63 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -269,6 +269,27 @@ "SHORT-FLOAT-NEGATIVE-EPSILON" "SINGLE-FLOAT-EPSILON" "SINGLE-FLOAT-NEGATIVE-EPSILON" + + ;; The cross-compiler itself shouldn't really need to use the host + ;; versions of these in target code except in exceptional cases. + "COMPILE-FILE" + "COMPILE-FILE-PATHNAME" + "*COMPILE-FILE-PATHNAME*" + "*COMPILE-FILE-TRUENAME*" + "*COMPILE-PRINT*" + "*COMPILE-VERBOSE*" + "COMPILER-MACRO-FUNCTION" + "CONSTANTP" + "GET-SETF-EXPANSION" + "LISP-IMPLEMENTATION-TYPE" "LISP-IMPLEMENTATION-VERSION" + "MACRO-FUNCTION" + "MACROEXPAND" "MACROEXPAND-1" "*MACROEXPAND-HOOK*" + "MAKE-LOAD-FORM-SAVING-SLOTS" + "SPECIAL-OPERATOR-P" + "SUBTYPEP" + "UPGRADED-ARRAY-ELEMENT-TYPE" + "UPGRADED-COMPLEX-PART-TYPE" + "WITH-COMPILATION-UNIT" )) ;;; A symbol in the "dual personality" list refers to the symbol in CL unless @@ -322,38 +343,17 @@ (dolist (name (append (append *undefineds* *dual-personality-math-symbols*))) (export (intern name package-name) package-name)) (dolist (name '("*READ-DEFAULT-FLOAT-FORMAT*" - "ARRAY-ELEMENT-TYPE" "CHAR-CODE" "CODE-CHAR" - "COMPILE-FILE" - "COMPILE-FILE-PATHNAME" - "*COMPILE-FILE-PATHNAME*" - "*COMPILE-FILE-TRUENAME*" - "*COMPILE-PRINT*" - "*COMPILE-VERBOSE*" - "COMPILER-MACRO-FUNCTION" - "CONSTANTP" - "DEFCONSTANT" - "DEFINE-MODIFY-MACRO" - "DEFINE-SETF-EXPANDER" - "DEFMACRO" "DEFSETF" "DEFSTRUCT" "DEFTYPE" + "DEFMACRO" "DEFSTRUCT" "DEFTYPE" "GENSYM" "*GENSYM-COUNTER*" - "GET-SETF-EXPANSION" - "LISP-IMPLEMENTATION-TYPE" "LISP-IMPLEMENTATION-VERSION" - "MACRO-FUNCTION" - "MACROEXPAND" "MACROEXPAND-1" "*MACROEXPAND-HOOK*" "MAKE-ARRAY" "MAKE-LOAD-FORM" - "MAKE-LOAD-FORM-SAVING-SLOTS" "PROCLAIM" "SIMPLE-VECTOR" - "SPECIAL-OPERATOR-P" - "SUBTYPEP" "TYPE-OF" "TYPEP" - "UPGRADED-ARRAY-ELEMENT-TYPE" - "UPGRADED-COMPLEX-PART-TYPE" - "WITH-COMPILATION-UNIT")) + )) (export (intern name package-name) package-name))) (defun count-symbols (pkg) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index b78dcc65c5..7f78bdb76c 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -197,10 +197,10 @@ (unuse-package ext "CL-USER"))) #+cmu -(setq *compile-print* nil) ; too much noise, can't see the actual warnings +(setq cl:*compile-print* nil) ; too much noise, can't see the actual warnings #+sbcl (progn - (setq *compile-print* nil) + (setq cl:*compile-print* nil) (load "src/cold/muffler.lisp") ;; Let's just say we never care to see these. (declaim (sb-ext:muffle-conditions @@ -546,7 +546,7 @@ (ignore-failure-p (find :ignore-failure-p flags))) (declare (type function compile-file)) - (ensure-directories-exist obj :verbose *compile-print*) ; host's value + (ensure-directories-exist obj :verbose cl:*compile-print*) ; host's value ;; We're about to set about building a new object file. First, we ;; delete any preexisting object file in order to avoid confusing diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 37759e7905..56efbed6d0 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -191,7 +191,7 @@ (error "LOAD of ~S failed." output-truename)) (sb-int:/show "done loading" output-truename)))))))) - (let ((*compile-print* nil)) + (let ((cl:*compile-print* nil)) (dolist (group sources) (handler-bind ((#+x86-64 warning #-x86-64 simple-warning (lambda (c) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index a08026bd33..1a927156bc 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -312,7 +312,7 @@ (lvar-value element-type)))) (cond ((or (null ctype) (contains-unknown-type-p ctype)) '*) - (t (sb-xc:upgraded-array-element-type + (t (upgraded-array-element-type (lvar-value element-type)))))) (t '*)) @@ -405,7 +405,7 @@ ;; optimizing `#(#(foo bar) #(,x ,y)) we convert the whole expression ;; into (VECTOR 'FOO 'BAR X Y), whereas in the unidimensional case ;; it never makes sense to turn #(FOO BAR) into (VECTOR 'FOO 'BAR). - (when (or (and (= rank 1) (sb-xc:constantp initial-contents env)) + (when (or (and (= rank 1) (constantp initial-contents env)) ;; If you inhibit inlining these - game over. (fun-lexically-notinline-p 'vector env) (fun-lexically-notinline-p 'list env) @@ -413,12 +413,12 @@ (return-from rewrite-initial-contents (values nil nil))) (let ((dimensions (make-array rank :initial-element nil)) (output)) - (named-let recurse ((form (handler-case (sb-xc:macroexpand initial-contents env) + (named-let recurse ((form (handler-case (macroexpand initial-contents env) (error () (return-from rewrite-initial-contents)))) (axis 0)) (flet ((make-list-ctor (tail &optional (prefix nil prefixp) &aux val) - (when (and (sb-xc:constantp tail) + (when (and (constantp tail) (or (proper-list-p (setq val (constant-form-value tail env))) (and (vectorp val) (not prefixp)))) (setq form @@ -458,16 +458,16 @@ ;; If the unaltered INITIAL-CONTENTS were constant, then the flattened ;; form must be too. Turning it back to a self-evaluating object ;; is essential to avoid compile-time blow-up on huge vectors. - (if (sb-xc:constantp initial-contents env) + (if (constantp initial-contents env) (map 'vector (lambda (x) (constant-form-value x env)) output) (let ((f (if (singleton-p output) 'list 'vector))) `(locally (declare (notinline ,f)) (,f ,@(mapcar (lambda (x) (cond ((and (symbolp x) (not (nth-value - 1 (sb-xc:macroexpand-1 x env)))) + 1 (macroexpand-1 x env)))) x) - ((sb-xc:constantp x env) + ((constantp x env) `',(constant-form-value x env)) (t `(locally (declare (inline ,f)) ,x)))) @@ -484,13 +484,13 @@ ;;; in this path, mainly due to complications in picking the right widetag. (define-source-transform make-array (dims-form &rest rest &environment env &aux dims dims-constp) - (cond ((and (sb-xc:constantp dims-form env) + (cond ((and (constantp dims-form env) (proper-list-p (setq dims (constant-form-value dims-form env))) (not (singleton-p dims)) (every (lambda (x) (typep x 'index)) dims)) (setq dims-constp t)) ((and (cond ((typep (setq dims (handler-case - (sb-xc:macroexpand dims-form env) + (macroexpand dims-form env) (error () (return-from make-array (values nil t))))) '(cons (eql list))) @@ -499,7 +499,7 @@ ;; `(,X 2 1) -> (LIST* X '(2 1)) for example ((typep dims '(cons (eql list*) cons)) (let ((last (car (last dims)))) - (when (sb-xc:constantp last env) + (when (constantp last env) (let ((lastval (constant-form-value last env))) (when (listp lastval) (setq dims (append (butlast (cdr dims)) lastval)) @@ -507,7 +507,7 @@ (proper-list-p dims) (not (singleton-p dims))) ;; If you spell '(2 2) as (LIST 2 2), it is constant for purposes of MAKE-ARRAY. - (when (every (lambda (x) (sb-xc:constantp x env)) dims) + (when (every (lambda (x) (constantp x env)) dims) (let ((values (mapcar (lambda (x) (constant-form-value x env)) dims))) (when (every (lambda (x) (typep x 'index)) values) (setq dims values dims-constp t))))) @@ -539,7 +539,7 @@ (case k (:element-type (unless (eq et unsupplied) (return nil)) - (setq et (car v) et-constp (sb-xc:constantp et env))) + (setq et (car v) et-constp (constantp et env))) (:initial-element (when (or contents element) (return nil)) (setq element v)) @@ -608,7 +608,7 @@ `(fill-array ,(car contents) ,alloc-form))))))) (define-source-transform coerce (x type &environment env) - (if (and (sb-xc:constantp type env) + (if (and (constantp type env) (proper-list-p x) (memq (car x) '(sb-impl::|List| list sb-impl::|Vector| vector))) @@ -1077,7 +1077,7 @@ 'simple-array) ,(cond ((null element-type) t) (element-type-ctype - (sb-xc:upgraded-array-element-type + (upgraded-array-element-type (lvar-value element-type))) (t '*)) ,(make-list rank :initial-element '*)))) diff --git a/src/compiler/ctype.lisp b/src/compiler/ctype.lisp index dfab9fa241..ca5dc7baf2 100644 --- a/src/compiler/ctype.lisp +++ b/src/compiler/ctype.lisp @@ -207,7 +207,7 @@ (dsd-default slot)))) ;; Return T if value-form definitely does not satisfy ;; the type-check for DSD. Return NIL if we can't decide. - (when (if (sb-xc:constantp initform) + (when (if (constantp initform) (not (sb-xc:typep (constant-form-value initform) (dsd-type slot))) ;; Find uses of nil-returning functions as defaults, @@ -714,7 +714,7 @@ and no value was provided for it." name)))))))))) ((lambda-var-arg-info arg) (let* ((info (lambda-var-arg-info arg)) (default (arg-info-default info)) - (def-type (when (sb-xc:constantp default) + (def-type (when (constantp default) (ctype-of (constant-form-value default))))) (ecase (arg-info-kind info) (:keyword diff --git a/src/compiler/debug-dump.lisp b/src/compiler/debug-dump.lisp index 664b8fb1b8..86ca93392d 100644 --- a/src/compiler/debug-dump.lisp +++ b/src/compiler/debug-dump.lisp @@ -407,12 +407,12 @@ (if (zerop length) #() (logically-readonlyize - (sb-xc:coerce seq - `(simple-array - ,(smallest-element-type (max max-positive - (1- max-negative)) - (plusp max-negative)) - 1))))))) + (coerce seq + `(simple-array + ,(smallest-element-type (max max-positive + (1- max-negative)) + (plusp max-negative)) + 1))))))) (defun compact-vector (sequence) (cond ((and (= (length sequence) 1) diff --git a/src/compiler/deftype.lisp b/src/compiler/deftype.lisp index cd71f226c8..965a4d62c7 100644 --- a/src/compiler/deftype.lisp +++ b/src/compiler/deftype.lisp @@ -41,7 +41,7 @@ (let ((expr `(progn ,@forms))) ;; While CONSTANTP works early, %MACROEXPAND does not, ;; so we can't pass ENV because it'd try to macroexpand. - (if (sb-xc:constantp expr) expr))) + (if (constantp expr) expr))) #-sb-xc-host (check-deprecated-type (constant-form-value it)) (values `(constant-type-expander ',name ,it) doc diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 6131a40b16..172c675964 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -272,8 +272,8 @@ compiled from ~S~% ~ using ~A version ~A~%" where - (sb-xc:lisp-implementation-type) - (sb-xc:lisp-implementation-version)))) + (lisp-implementation-type) + (lisp-implementation-version)))) stream) (dump-byte +fasl-header-string-stop-char-code+ res) ;; Finish the header by outputting fasl file implementation, @@ -729,9 +729,9 @@ ;;; tables. (defun dump-vector (x file) (let ((simple-version (if (array-header-p x) - (sb-xc:coerce x `(simple-array - ,(array-element-type x) - (*))) + (coerce x `(simple-array + ,(array-element-type x) + (*))) x))) (typecase simple-version ;; On the host, take all strings to be simple-base-string. diff --git a/src/compiler/early-c.lisp b/src/compiler/early-c.lisp index 3a7a95e4dd..1b7f254db4 100644 --- a/src/compiler/early-c.lisp +++ b/src/compiler/early-c.lisp @@ -37,14 +37,7 @@ "The exclusive upper bound on the number of multiple VALUES that you can return.") -;;;; cross-compiler-only versions of CL special variables, so that we -;;;; don't have weird interactions with the host compiler -(defvar sb-xc:*compile-file-pathname*) -(defvar sb-xc:*compile-file-truename*) -(defvar sb-xc:*compile-print*) -(defvar sb-xc:*compile-verbose*) - ;;;; miscellaneous types used both in the cross-compiler and on the target ;;;; FIXME: The INDEX and LAYOUT-DEPTHOID definitions probably belong diff --git a/src/compiler/early-constantp.lisp b/src/compiler/early-constantp.lisp index 408fd2414e..1444a4d532 100644 --- a/src/compiler/early-constantp.lisp +++ b/src/compiler/early-constantp.lisp @@ -15,8 +15,8 @@ (defstruct (abstract-lexenv (:constructor nil) (:copier nil) (:predicate nil))) -#-sb-fluid (declaim (inline sb-xc:constantp)) -(defun sb-xc:constantp (form &optional (environment nil envp)) +#-sb-fluid (declaim (inline constantp)) +(defun constantp (form &optional (environment nil envp)) "True of any FORM that has a constant value: self-evaluating objects, keywords, defined constants, quote forms. Additionally the constant-foldability of some function calls and special forms is recognized. diff --git a/src/compiler/early-globaldb.lisp b/src/compiler/early-globaldb.lisp index 9baa608800..13450a1f32 100644 --- a/src/compiler/early-globaldb.lisp +++ b/src/compiler/early-globaldb.lisp @@ -313,8 +313,8 @@ "Automagically generated boolean attribute setter. See !DEF-BOOLEAN-ATTRIBUTE." (multiple-value-bind (temps values stores setter getter) - (#+sb-xc-host get-setf-expansion - #-sb-xc-host sb-xc:get-setf-expansion place env) + (#+sb-xc-host cl:get-setf-expansion + #-sb-xc-host get-setf-expansion place env) (when (cdr stores) (error "multiple store variables for ~S" place)) (let ((newval (sb-xc:gensym)) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 9cbabb605b..9a2350e505 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -37,7 +37,7 @@ (foldable flushable)) ;;; These can be affected by type definitions, so they're not FOLDABLE. -(defknown (sb-xc:upgraded-complex-part-type sb-xc:upgraded-array-element-type) +(defknown (upgraded-complex-part-type upgraded-array-element-type) (type-specifier &optional lexenv-designator) (or list symbol) (unsafely-flushable)) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 671b9f5ace..a4b40ba9fd 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2913,7 +2913,7 @@ Legal values for OFFSET are -4, -8, -12, ..." ;; in the target Lisp but are propagated to C. "SB-COREFILE")) (do-external-symbols (symbol (find-package package-name)) - (when (constantp symbol) + (when (cl:constantp symbol) (let ((name (symbol-name symbol))) (labels ( ;; shared machinery (record (string priority suffix) @@ -3114,7 +3114,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (subseq name 0 (- (length name) (length strip)))))) (list-sorted-tags (tail) (loop for symbol being the external-symbols of "SB-VM" - when (and (constantp symbol) + when (and (cl:constantp symbol) (tailwise-equal (string symbol) tail)) collect symbol into tags finally (return (sort tags #'< :key #'symbol-value)))) diff --git a/src/compiler/generic/vm-type.lisp b/src/compiler/generic/vm-type.lisp index 2333731b3c..b2f7ccc3b1 100644 --- a/src/compiler/generic/vm-type.lisp +++ b/src/compiler/generic/vm-type.lisp @@ -106,7 +106,7 @@ (when (csubtypep eltype stype) (return stype))))) -(defun sb-xc:upgraded-array-element-type (spec &optional environment) +(defun upgraded-array-element-type (spec &optional environment) "Return the element type that will actually be used to implement an array with the specifier :ELEMENT-TYPE Spec." (declare (type lexenv-designator environment) (ignore environment)) @@ -119,7 +119,7 @@ (t (type-specifier (%upgraded-array-element-type type)))))) -(defun sb-xc:upgraded-complex-part-type (spec &optional environment) +(defun upgraded-complex-part-type (spec &optional environment) "Return the element type of the most specialized COMPLEX number type that can hold parts of type SPEC." (declare (type lexenv-designator environment) (ignore environment)) diff --git a/src/compiler/info-functions.lisp b/src/compiler/info-functions.lisp index 1c04d7cc42..e59d1c69bd 100644 --- a/src/compiler/info-functions.lisp +++ b/src/compiler/info-functions.lisp @@ -177,7 +177,7 @@ ;;;; ANSI Common Lisp functions which are defined in terms of the info ;;;; database -(defun sb-xc:macro-function (symbol &optional env) +(defun macro-function (symbol &optional env) "If SYMBOL names a macro in ENV, returns the expansion function, else returns NIL. If ENV is unspecified or NIL, use the global environment only." @@ -188,15 +188,15 @@ only." (multiple-value-bind (kind def) (sb-interpreter:find-lexical-fun env symbol) (when def - (return-from sb-xc:macro-function (when (eq kind :macro) def))))) + (return-from macro-function (when (eq kind :macro) def))))) (lexenv (let ((def (cdr (assoc symbol (lexenv-funs env))))) (when def - (return-from sb-xc:macro-function + (return-from macro-function (when (typep def '(cons (eql macro))) (cdr def))))))) (values (info :function :macro-function symbol))) -(defun (setf sb-xc:macro-function) (function symbol &optional environment) +(defun (setf macro-function) (function symbol &optional environment) (declare (symbol symbol) (type function function)) (when environment ;; Note: Technically there could be an ENV optional argument to SETF @@ -215,7 +215,7 @@ only." #-sb-xc-host (install-guard-function symbol `(:macro ,symbol))) function) -(defun sb-xc:compiler-macro-function (name &optional env) +(defun compiler-macro-function (name &optional env) "If NAME names a compiler-macro in ENV, return the expansion function, else return NIL. Can be set with SETF when ENV is NIL." (legal-fun-name-or-type-error name) @@ -234,7 +234,7 @@ return NIL. Can be set with SETF when ENV is NIL." (values (info :function :compiler-macro-function name)))) ;;; FIXME: we don't generate redefinition warnings for these. -(defun (setf sb-xc:compiler-macro-function) (function name &optional env) +(defun (setf compiler-macro-function) (function name &optional env) (declare (type (or symbol list) name) (type (or function null) function)) (when env diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 8a81999741..e78475419d 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -536,8 +536,8 @@ Return VALUE without evaluating it." (lexenv-blocks *lexenv*) :from-end t)) *source-namestring* (awhen (case *name-context-file-path-selector* - (pathname (or sb-xc:*compile-file-pathname* *load-pathname*)) - (truename (or sb-xc:*compile-file-truename* *load-truename*))) + (pathname (or *compile-file-pathname* *load-pathname*)) + (truename (or *compile-file-truename* *load-truename*))) (namestring it))))) (when context (list :in context)))) @@ -614,7 +614,7 @@ be a lambda expression." (reference-leaf start next result leaf))) (defun constant-global-fun-name (thing) - (let ((constantp (sb-xc:constantp thing))) + (let ((constantp (constantp thing))) (when constantp (let ((name (constant-form-value thing))) (when (legal-fun-name-p name) @@ -974,7 +974,7 @@ other." (values-subtypep (make-single-value-type (leaf-type value)) type)) (and (not (fun-designator-type-p type)) - (sb-xc:constantp value) + (constantp value) (or (not (values-type-p type)) (values-type-may-be-single-value-p type)) (ctypep (constant-form-value value) diff --git a/src/compiler/ir1report.lisp b/src/compiler/ir1report.lisp index 004a9236e4..f13af245ff 100644 --- a/src/compiler/ir1report.lisp +++ b/src/compiler/ir1report.lisp @@ -640,7 +640,7 @@ has written, having proved that it is unreachable.")) ;; The current approach is reliable, at a cost of ~3 words per function. ;; (defun warn-if-compiler-macro-dependency-problem (name) - (unless (sb-xc:compiler-macro-function name) + (unless (compiler-macro-function name) (let ((status (car (info :function :emitted-full-calls name)))) ; TODO use emitted-full-call-count? (when (and (integerp status) (oddp status)) ;; Show the total number of calls, because otherwise the warning diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 3636c75dd2..88dbf59297 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -304,7 +304,7 @@ (fun (collect ((default-bindings) (default-vals)) (dolist (default defaults) - (if (sb-xc:constantp default) + (if (constantp default) (default-vals default) (let ((var (sb-xc:gensym))) (default-bindings `(,var ,default)) @@ -358,7 +358,7 @@ (default (arg-info-default info)) (supplied-p (arg-info-supplied-p info)) (force (or force - (not (sb-xc:constantp (arg-info-default info))))) + (not (constantp (arg-info-default info))))) (ep (if supplied-p (ir1-convert-hairy-args res @@ -636,7 +636,7 @@ (dolist (key keys) (let* ((info (lambda-var-arg-info key)) (default (arg-info-default info)) - (hairy-default (not (sb-xc:constantp default))) + (hairy-default (not (constantp default))) (supplied-p (arg-info-supplied-p info)) ;; was: (format nil "~A-DEFAULTING-TEMP" (leaf-source-name key)) (n-val (make-symbol ".DEFAULTING-TEMP.")) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 69a6e53e3f..ee13cefe30 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -721,17 +721,17 @@ (flet ((legal-cm-name-p (name) (and (legal-fun-name-p name) (or (not (symbolp name)) - (not (sb-xc:macro-function name *lexenv*)))))) + (not (macro-function name *lexenv*)))))) (if (eq opname 'funcall) (let ((fun-form (cadr form))) (cond ((and (consp fun-form) (eq 'function (car fun-form)) (not (cddr fun-form))) (let ((real-fun (cadr fun-form))) (if (legal-cm-name-p real-fun) - (values (sb-xc:compiler-macro-function real-fun *lexenv*) + (values (compiler-macro-function real-fun *lexenv*) real-fun) (values nil nil)))) - ((sb-xc:constantp fun-form *lexenv*) + ((constantp fun-form *lexenv*) (let ((fun (constant-form-value fun-form *lexenv*))) (if (legal-cm-name-p fun) ;; CLHS tells us that local functions must shadow @@ -743,12 +743,12 @@ ;; a list (function name)", that means that ;; (funcall 'name) that gets here doesn't fit the ;; definition. - (values (sb-xc:compiler-macro-function fun nil) fun) + (values (compiler-macro-function fun nil) fun) (values nil nil)))) (t (values nil nil)))) (if (legal-fun-name-p opname) - (values (sb-xc:compiler-macro-function opname *lexenv*) opname) + (values (compiler-macro-function opname *lexenv*) opname) (values nil nil))))) ;;; If FORM has a usable compiler macro, use it; otherwise return FORM itself. diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 9fdaa2ec0a..6c42d25a91 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -1245,8 +1245,8 @@ (warn-if-inline-failed/call fname (node-lexenv node) cell)) (case *track-full-called-fnames* (:detailed - (when (boundp 'sb-xc:*compile-file-pathname*) - (pushnew sb-xc:*compile-file-pathname* (cdr cell) + (when (boundp '*compile-file-pathname*) + (pushnew *compile-file-pathname* (cdr cell) :test #'equal))) (:very-detailed (pushnew (component-name *component-being-compiled*) diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index 2b3577dfd2..f85eea7e54 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -783,7 +783,7 @@ (defmacro deletef-in (next place item &environment env) (multiple-value-bind (temps vals stores store access) - (#+sb-xc sb-xc:get-setf-expansion #-sb-xc get-setf-expansion place env) + (#-sb-xc-host get-setf-expansion #+sb-xc-host cl:get-setf-expansion place env) (when (cdr stores) (error "multiple store variables for ~S" place)) (let ((n-item (gensym)) @@ -809,7 +809,7 @@ ;;; (defmacro push-in (next item place &environment env) (multiple-value-bind (temps vals stores store access) - (#+sb-xc sb-xc:get-setf-expansion #-sb-xc get-setf-expansion place env) + (#-sb-xc-host get-setf-expansion #+sb-xc-host cl:get-setf-expansion place env) (when (cdr stores) (error "multiple store variables for ~S" place)) `(let (,@(mapcar #'list temps vals) diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index ec69755b5b..b618f03809 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -29,25 +29,25 @@ ;;; FIXME: should probably have no value outside the compiler. (defvar *top-level-form-noted* nil) -(defvar sb-xc:*compile-verbose* t +(defvar *compile-verbose* t "The default for the :VERBOSE argument to COMPILE-FILE.") -(defvar sb-xc:*compile-print* t +(defvar *compile-print* t "The default for the :PRINT argument to COMPILE-FILE.") (defvar *compile-progress* nil "When this is true, the compiler prints to *STANDARD-OUTPUT* progress information about the phases of compilation of each function. (This is useful mainly in large block compilations.)") -(defvar sb-xc:*compile-file-pathname* nil +(defvar *compile-file-pathname* nil "The defaulted pathname of the file currently being compiled, or NIL if not compiling.") -(defvar sb-xc:*compile-file-truename* nil +(defvar *compile-file-truename* nil "The TRUENAME of the file currently being compiled, or NIL if not compiling.") (declaim (type (or pathname null) - sb-xc:*compile-file-pathname* - sb-xc:*compile-file-truename*)) + *compile-file-pathname* + *compile-file-truename*)) ;;; the SOURCE-INFO structure for the current compilation. This is ;;; null globally to indicate that we aren't currently in any @@ -87,7 +87,7 @@ ;;;; WITH-COMPILATION-UNIT and WITH-COMPILATION-VALUES -(defmacro sb-xc:with-compilation-unit (options &body body) +(defmacro with-compilation-unit (options &body body) "Affects compilations that take place within its dynamic extent. It is intended to be eg. wrapped around the compilation of all files in the same system. @@ -701,7 +701,7 @@ necessary, since type inference may take arbitrarily long to converge.") (aver (eql (node-component (lambda-bind lambda)) component))) (let* ((*component-being-compiled* component)) - (when (and sb-xc:*compile-print* (block-compile *compilation*)) + (when (and *compile-print* (block-compile *compilation*)) (with-compiler-io-syntax (compiler-mumble "~&; compiling ~A" (component-name component)))) @@ -869,8 +869,8 @@ necessary, since type inference may take arbitrarily long to converge.") (let* ((file-info (source-info-file-info info)) (name (file-info-name file-info)) (external-format (file-info-external-format file-info))) - (setf sb-xc:*compile-file-truename* name - sb-xc:*compile-file-pathname* (file-info-untruename file-info) + (setf *compile-file-truename* name + *compile-file-pathname* (file-info-untruename file-info) (source-info-stream info) (let ((stream (open name @@ -1232,7 +1232,7 @@ necessary, since type inference may take arbitrarily long to converge.") result)))))) (defun note-top-level-form (form &optional finalp) - (when sb-xc:*compile-print* + (when *compile-print* (cond ((not *top-level-form-noted*) (let ((*print-length* 2) (*print-level* 2) @@ -1241,7 +1241,7 @@ necessary, since type inference may take arbitrarily long to converge.") (compiler-mumble "~&; processing ~S" form))) form) ((and finalp - (eq :top-level-forms sb-xc:*compile-print*) + (eq :top-level-forms *compile-print*) (neq form *top-level-form-noted*)) (let ((*print-length* 1) (*print-level* 1) @@ -1401,7 +1401,7 @@ necessary, since type inference may take arbitrarily long to converge.") ;; +SLOT-UNBOUND+ is not a constant, ;; but is trivially dumpable. (or (eql x 'sb-pcl:+slot-unbound+) - (sb-xc:constantp x))) + (constantp x))) value-forms)) (dolist (form value-forms) (unless (eq form 'sb-pcl:+slot-unbound+) @@ -1595,8 +1595,8 @@ necessary, since type inference may take arbitrarily long to converge.") (declare (type source-info info)) (let ((*package* (sane-package)) (*readtable* *readtable*) - (sb-xc:*compile-file-pathname* nil) ; set by GET-SOURCE-STREAM - (sb-xc:*compile-file-truename* nil) ; " + (*compile-file-pathname* nil) ; set by GET-SOURCE-STREAM + (*compile-file-truename* nil) ; " (*policy* *policy*) (*macro-policy* *macro-policy*) @@ -1630,7 +1630,7 @@ necessary, since type inference may take arbitrarily long to converge.") (handler-case (handler-bind (((satisfies handle-condition-p) #'handle-condition-handler)) (with-compilation-values - (sb-xc:with-compilation-unit () + (with-compilation-unit () (with-world-lock () (setf (sb-fasl::fasl-output-source-info *compile-object*) (debug-source-for-info info)) @@ -1650,7 +1650,7 @@ necessary, since type inference may take arbitrarily long to converge.") ;; Dump the code coverage records into the fasl. (with-source-paths (fopcompile `(record-code-coverage - ',(namestring sb-xc:*compile-file-pathname*) + ',(namestring *compile-file-pathname*) ',(let (list) (maphash (lambda (k v) (declare (ignore k)) @@ -1728,7 +1728,7 @@ necessary, since type inference may take arbitrarily long to converge.") ;;; Open some files and call SUB-COMPILE-FILE. If something unwinds ;;; out of the compile, then abort the writing of the output file, so ;;; that we don't overwrite it with known garbage. -(defun sb-xc:compile-file +(defun compile-file (input-file &key @@ -1737,8 +1737,8 @@ necessary, since type inference may take arbitrarily long to converge.") ;; FIXME: ANSI doesn't seem to say anything about ;; *COMPILE-VERBOSE* and *COMPILE-PRINT* being rebound by this ;; function.. - ((:verbose sb-xc:*compile-verbose*) sb-xc:*compile-verbose*) - ((:print sb-xc:*compile-print*) sb-xc:*compile-print*) + ((:verbose *compile-verbose*) *compile-verbose*) + ((:print *compile-print*) *compile-print*) ((:progress *compile-progress*) *compile-progress*) (external-format :default) @@ -1810,7 +1810,7 @@ returning its filename. (progn (when output-file (setq output-file-name - (sb-xc:compile-file-pathname input-file + (compile-file-pathname input-file :output-file output-file)) (setq fasl-output (open-fasl-output output-file-name @@ -1832,7 +1832,7 @@ returning its filename. (fasl-output-stream fasl-output))) :if-exists :supersede :direction :output)))) - (when sb-xc:*compile-verbose* + (when *compile-verbose* (print-compile-start-note source-info)) (let ((*compile-object* fasl-output)) @@ -1845,15 +1845,15 @@ returning its filename. (close-fasl-output fasl-output abort-p) (setq output-file-name (pathname (fasl-output-stream fasl-output))) - (when (and (not abort-p) sb-xc:*compile-verbose*) + (when (and (not abort-p) *compile-verbose*) (compiler-mumble "~2&; wrote ~A~%" (namestring output-file-name)))) (when cfasl-output (close-fasl-output cfasl-output abort-p) - (when (and (not abort-p) sb-xc:*compile-verbose*) + (when (and (not abort-p) *compile-verbose*) (compiler-mumble "; wrote ~A~%" (namestring coutput-file-name)))) - (when sb-xc:*compile-verbose* + (when *compile-verbose* (print-compile-end-note source-info (not abort-p))) ;; Don't nuke stdout if you use :trace-file *standard-output* @@ -1893,10 +1893,10 @@ returning its filename. ;;; at the level of e.g. whether it returns logical pathname or a ;;; physical pathname. Patches to make it more correct are welcome. ;;; -- WHN 2000-12-09 -(defun sb-xc:compile-file-pathname (input-file - &key - (output-file nil output-file-p) - &allow-other-keys) +(defun compile-file-pathname (input-file + &key + (output-file nil output-file-p) + &allow-other-keys) "Return a pathname describing what file COMPILE-FILE would write to given these arguments." (if output-file-p diff --git a/src/compiler/meta-vmdef.lisp b/src/compiler/meta-vmdef.lisp index a8c705ed0a..aff917d085 100644 --- a/src/compiler/meta-vmdef.lisp +++ b/src/compiler/meta-vmdef.lisp @@ -607,7 +607,7 @@ :num-results ,num-results :ref-ordering ,ordering ,@(when (targets) - `(:targets ,(sb-xc:coerce (targets) `(vector ,te-type))))))))) + `(:targets ,(coerce (targets) `(vector ,te-type))))))))) (defun make-emit-function-and-friends (parse) `(:temps ,(compute-temporaries-description parse) diff --git a/src/compiler/parse-lambda-list.lisp b/src/compiler/parse-lambda-list.lisp index 4cb41763bf..261483e285 100644 --- a/src/compiler/parse-lambda-list.lisp +++ b/src/compiler/parse-lambda-list.lisp @@ -17,7 +17,7 @@ ;; Return a bitmask representing the LIST of lambda list keywords. (defmacro lambda-list-keyword-mask (list) - (if (constantp list) + (if (cl:constantp list) ;; When invoked with a quoted constant, some flexibility ;; is allowed, in that the input may be a single symbol. (let ((val (#+sb-xc constant-form-value #-sb-xc eval list))) @@ -413,7 +413,7 @@ (when (and (not silent) (vectorp parse)) ; is destructuring (let ((default (and (cdr arg-specifier) ; have an explicit default (cadr arg-specifier)))) - (when (and (constantp default) + (when (and (cl:constantp default) (not (ds-lambda-list-match-p (#+sb-xc constant-form-value #-sb-xc eval default) @@ -1056,7 +1056,7 @@ (pop plist) (unless (or (keywordp key) (and (symbolp key) - (constantp key) + (cl:constantp key) (eq key (symbol-value key)))) (signal 'compiler-macro-keyword-problem :argument key)))) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index d451a73c67..eddb034848 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -586,10 +586,10 @@ (if (coercion-loses-precision-p (car val) type) xbound (list xbound)))) - ((sb-xc:subtypep type 'double-float) + ((subtypep type 'double-float) (if (sb-xc:<= most-negative-double-float val most-positive-double-float) (coerce val type))) - ((or (sb-xc:subtypep type 'single-float) (sb-xc:subtypep type 'float)) + ((or (subtypep type 'single-float) (subtypep type 'float)) ;; coerce to float returns a single-float (if (sb-xc:<= most-negative-single-float val most-positive-single-float) (coerce val type))) @@ -603,12 +603,12 @@ xbound (list xbound))) (cond - ((sb-xc:subtypep type 'double-float) + ((subtypep type 'double-float) (if (sb-xc:<= most-negative-double-float val most-positive-double-float) (coerce val type) (if (sb-xc:< val most-negative-double-float) most-negative-double-float most-positive-double-float))) - ((or (sb-xc:subtypep type 'single-float) (sb-xc:subtypep type 'float)) + ((or (subtypep type 'single-float) (subtypep type 'float)) ;; coerce to float returns a single-float (if (sb-xc:<= most-negative-single-float val most-positive-single-float) (coerce val type) diff --git a/src/compiler/sxhash.lisp b/src/compiler/sxhash.lisp index fa6fad0221..024da9ae4d 100644 --- a/src/compiler/sxhash.lisp +++ b/src/compiler/sxhash.lisp @@ -196,7 +196,7 @@ * :important nil) `(symbol-hash* object 'non-null-symbol-p)) ; etc -;;; To define SB-XC:SXHASH compatibly without repeating the logic in the transforms +;;; To define SXHASH compatibly without repeating the logic in the transforms ;;; that define the numeric cases, we do some monkey business involving #. to paste ;;; in the expressions that the transforms would return. #+sb-xc-host diff --git a/src/compiler/target-main.lisp b/src/compiler/target-main.lisp index 5c14b15bab..c7a09fc3fc 100644 --- a/src/compiler/target-main.lisp +++ b/src/compiler/target-main.lisp @@ -26,7 +26,7 @@ (defun compile-in-lexenv (form *lexenv* name source-info tlf ephemeral errorp) (let ((source-paths (when source-info *source-paths*))) (with-compilation-values - (sb-xc:with-compilation-unit () + (with-compilation-unit () ;; FIXME: These bindings were copied from SUB-COMPILE-FILE with ;; few changes. Once things are stable, the shared bindings ;; probably be merged back together into some shared utility diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index 7e38b88fd9..e299f5af21 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -2469,17 +2469,17 @@ (declare (type sb-assem:segment segment) (type index amount)) ;; Pack all instructions into one byte vector to save space. - (let* ((bytes #.(sb-xc:coerce - #(#x90 - #x66 #x90 - #x0f #x1f #x00 - #x0f #x1f #x40 #x00 - #x0f #x1f #x44 #x00 #x00 - #x66 #x0f #x1f #x44 #x00 #x00 - #x0f #x1f #x80 #x00 #x00 #x00 #x00 - #x0f #x1f #x84 #x00 #x00 #x00 #x00 #x00 - #x66 #x0f #x1f #x84 #x00 #x00 #x00 #x00 #x00) - '(vector (unsigned-byte 8)))) + (let* ((bytes #.(coerce + #(#x90 + #x66 #x90 + #x0f #x1f #x00 + #x0f #x1f #x40 #x00 + #x0f #x1f #x44 #x00 #x00 + #x66 #x0f #x1f #x44 #x00 #x00 + #x0f #x1f #x80 #x00 #x00 #x00 #x00 + #x0f #x1f #x84 #x00 #x00 #x00 #x00 #x00 + #x66 #x0f #x1f #x84 #x00 #x00 #x00 #x00 #x00) + '(vector (unsigned-byte 8)))) (max-length (isqrt (* 2 (length bytes))))) (loop (let* ((count (min amount max-length)) diff --git a/src/compiler/xref.lisp b/src/compiler/xref.lisp index 6f0f0b9ee5..9686d803a3 100644 --- a/src/compiler/xref.lisp +++ b/src/compiler/xref.lisp @@ -299,7 +299,7 @@ do (dolist (number numbers) (write-var-integer (funcall encoder index number) vector)))) (setf (aref result 0) - (sb-xc:coerce vector '(simple-array (unsigned-byte 8) 1)))) + (coerce vector '(simple-array (unsigned-byte 8) 1)))) ;; RESULT is adjustable. Make it simple. (coerce result 'simple-vector))) diff --git a/tests/info.before-xc.lisp b/tests/info.before-xc.lisp index dd2925f307..ed5db009f2 100644 --- a/tests/info.before-xc.lisp +++ b/tests/info.before-xc.lisp @@ -19,7 +19,7 @@ ;;; It's possible in general for a constant to have the value NIL, but ;;; not for vector-data-offset, which must be a number: -(assert (constantp 'sb-vm:vector-data-offset)) +(assert (cl:constantp 'sb-vm:vector-data-offset)) (assert (integerp (symbol-value 'sb-vm:vector-data-offset))) (in-package "SB-IMPL") From 6c8a3a291f57461410cc04401fd859c79d2a13ad Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 25 Jul 2020 12:00:35 -0700 Subject: [PATCH 0421/4023] Do not qualify *GENSYM-COUNTER* in target code. The host's value is never needed anyway. --- src/code/error.lisp | 2 +- src/code/setf.lisp | 2 +- src/cold/set-up-cold-packages.lisp | 3 ++- src/compiler/main.lisp | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/code/error.lisp b/src/code/error.lisp index ca86ae7599..e8258f66ff 100644 --- a/src/code/error.lisp +++ b/src/code/error.lisp @@ -182,7 +182,7 @@ ;; Should be (THE (FUNCTION-DESIGNATOR (CONDITION))) ;; but the cast kills DX allocation. `(lambda (c) (funcall ,handler c))))) - (name (let ((sb-xc:*gensym-counter* + (name (let ((*gensym-counter* (length (cluster-entries)))) (sb-xc:gensym "H")))) (local-functions `(,name ,@(rest lexpr))) diff --git a/src/code/setf.lisp b/src/code/setf.lisp index 3f6bd8093e..f815ecd006 100644 --- a/src/code/setf.lisp +++ b/src/code/setf.lisp @@ -53,7 +53,7 @@ for the new values, the setting function, and the accessing function." (named-let retry ((form form)) (labels ((newvals (count) - (let ((sb-xc:*gensym-counter* 1)) + (let ((*gensym-counter* 1)) (make-gensym-list count "NEW"))) ;; Produce the expansion of a SETF form that calls either ;; #'(SETF name) or an inverse given by short form DEFSETF. diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 04d1c19b63..0c2e1d54d5 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -281,6 +281,7 @@ "COMPILER-MACRO-FUNCTION" "CONSTANTP" "GET-SETF-EXPANSION" + "*GENSYM-COUNTER*" "LISP-IMPLEMENTATION-TYPE" "LISP-IMPLEMENTATION-VERSION" "MACRO-FUNCTION" "MACROEXPAND" "MACROEXPAND-1" "*MACROEXPAND-HOOK*" @@ -347,7 +348,7 @@ "CHAR-CODE" "CODE-CHAR" "DEFMACRO" "DEFSTRUCT" "DEFTYPE" - "GENSYM" "*GENSYM-COUNTER*" + "GENSYM" "MAKE-ARRAY" "MAKE-LOAD-FORM" "PROCLAIM" diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index b618f03809..a7b5b3eb4e 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1623,7 +1623,7 @@ necessary, since type inference may take arbitrarily long to converge.") (declare (ignore error)) (return-from sub-compile-file (values t t t)))) (*current-path* nil) - (sb-xc:*gensym-counter* 0) + (*gensym-counter* 0) (sb-impl::*eval-source-info* nil) (sb-impl::*eval-tlf-index* nil) (sb-impl::*eval-source-context* nil)) @@ -1639,7 +1639,7 @@ necessary, since type inference may take arbitrarily long to converge.") 'input-error-in-compile-file) (with-source-paths (find-source-paths form current-index) - (let ((sb-xc:*gensym-counter* 0)) + (let ((*gensym-counter* 0)) (process-toplevel-form form `(original-source-start 0 ,current-index) nil)))) (let ((*source-info* info)) From f3c876e256f533565c509a0c819db1ec7ae89518 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 25 Jul 2020 20:41:02 -0700 Subject: [PATCH 0422/4023] Simplify destructuring-bind bootstrapping. --- build-order.lisp-expr | 2 -- src/code/defmacro.lisp | 12 +++++++ src/code/destructuring-bind.lisp | 53 ----------------------------- src/code/macros.lisp | 12 +++++++ src/compiler/parse-lambda-list.lisp | 15 ++++++++ 5 files changed, 39 insertions(+), 55 deletions(-) delete mode 100644 src/code/destructuring-bind.lisp diff --git a/build-order.lisp-expr b/build-order.lisp-expr index 1440e53ef4..7a70610a06 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -299,8 +299,6 @@ ("src/compiler/vmdef" :c-headers) ("src/code/defmacro" :c-headers) - ("src/code/destructuring-bind" :c-headers) - ;; for e.g. !DEF-PRIMITIVE-TYPE, needed by primtype.lisp, and ;; DEFINE-STORAGE-CLASS, needed by target/vm.lisp ("src/compiler/meta-vmdef" :c-headers) diff --git a/src/code/defmacro.lisp b/src/code/defmacro.lisp index e4c84b678d..80d6310a75 100644 --- a/src/code/defmacro.lisp +++ b/src/code/defmacro.lisp @@ -79,3 +79,15 @@ ;; processing SB-XC:DEFMACRO. (setf (cl:macro-function 'sb-xc:defmacro) (lambda (form env) `(let () ,(funcall real-expander form env))))) + +#+sb-xc-host +(progn + (setf (macro-function 'named-ds-bind) + (lambda (form env) (declare (ignore env)) (cl:macroexpand-1 form nil))) + + ;; SB-XC:DEFMACRO's expansion uses NAMED-DS-BIND which expands to + ;; BINDING* (from "early-extensions") that hand-written code also + ;; wants to use. So expand it in the target by using the host's + ;; expander until it gets seen again during make-host-2. + (setf (macro-function 'binding*) + (lambda (form env) (declare (ignore env)) (cl:macroexpand-1 form nil)))) diff --git a/src/code/destructuring-bind.lisp b/src/code/destructuring-bind.lisp deleted file mode 100644 index 7b28345b1e..0000000000 --- a/src/code/destructuring-bind.lisp +++ /dev/null @@ -1,53 +0,0 @@ -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-IMPL") - -(macrolet (#+sb-xc-host ; Bootstrap NAMED-DS-BIND - (named-ds-bind (name lambda-list expression &body body) - (declare (ignore name)) - `(cl:destructuring-bind ,lambda-list ,expression ,@body))) - - (sb-xc:defmacro destructuring-bind (lambda-list expression &body body - &environment env) - (declare (ignore env)) ; could be policy-sensitive (but isn't) - "Bind the variables in LAMBDA-LIST to the corresponding values in the -tree structure resulting from the evaluation of EXPRESSION." - `(binding* ,(sb-c::expand-ds-bind lambda-list expression t nil) - ,@body)) - - (let () - ;; This is a variant of destructuring-bind that provides the name - ;; of the containing construct in generated error messages. - ;; There is a cyclic dependence between it and DEFMACRO. - (sb-xc:defmacro named-ds-bind (name lambda-list expression &body body - &environment env) - (declare (ignore env)) ; could be policy-sensitive (but isn't) - `(binding* ,(sb-c::expand-ds-bind lambda-list expression t nil name - (and (eq (car name) :macro) - (eq (cddr name) 'deftype) - ''*)) - ,@body)))) - -#+sb-xc-host -(progn - ;; The expander for NAMED-DS-BIND in the host could almost always be - ;; the above MACROLET, but that would fail to use the default of '* for - ;; optional args of SB-XC:DEFTYPE that lack an overriding default. - ;; So install our expander even if it produces suboptimal code for the host. - (defmacro named-ds-bind (&whole form &rest args) - (declare (ignore args)) - (funcall (macro-function 'named-ds-bind) form nil)) - - ;; A similar problem in reverse: SB-XC:DEFMACRO's expansion uses NAMED-DS-BIND - ;; which expands to BINDING* (from "early-extensions") that hand-written code - ;; also wants to use. So expand it in the target by using the host's expander - ;; until it gets seen again during make-host-2. - (setf (macro-function 'binding*) - (lambda (form env) (declare (ignore env)) (cl:macroexpand-1 form nil)))) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index e5728e8d75..1eba9fc122 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -10,6 +10,18 @@ ;;;; files for more information. (in-package "SB-IMPL") + + +;;;; Destructing-bind + +(sb-xc:defmacro destructuring-bind (lambda-list expression &body body + &environment env) + (declare (ignore env)) ; could be policy-sensitive (but isn't) + "Bind the variables in LAMBDA-LIST to the corresponding values in the +tree structure resulting from the evaluation of EXPRESSION." + `(binding* ,(sb-c::expand-ds-bind lambda-list expression t nil) + ,@body)) + ;;;; DEFUN diff --git a/src/compiler/parse-lambda-list.lisp b/src/compiler/parse-lambda-list.lisp index 261483e285..fefea333b1 100644 --- a/src/compiler/parse-lambda-list.lisp +++ b/src/compiler/parse-lambda-list.lisp @@ -1276,3 +1276,18 @@ (unless allow-special (lose "special variable")))) (values name kind)))) + +;; This is a variant of destructuring-bind that provides the name +;; of the containing construct in generated error messages. +(macrolet (#+sb-xc-host ; Bootstrap NAMED-DS-BIND + (named-ds-bind (name lambda-list expression &body body) + (declare (ignore name)) + `(cl:destructuring-bind ,lambda-list ,expression ,@body))) + (defmacro named-ds-bind (name lambda-list expression &body body + &environment env) + (declare (ignore env)) ; could be policy-sensitive (but isn't) + `(binding* ,(sb-c::expand-ds-bind lambda-list expression t nil name + (and (eq (car name) :macro) + (eq (cddr name) 'deftype) + ''*)) + ,@body))) From e49938c0ce729719ad62c7a0f7cfc534504ae42e Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 25 Jul 2020 20:59:06 -0700 Subject: [PATCH 0423/4023] Combine host-alieneval and early-alieneval. Because 3 variations of alieneval is overkill. Also pick off a few unnecessary eval-whens in the process. Move a struct to where it belongs and move a target macro into a target-only file. --- build-order.lisp-expr | 9 +- .../{host-alieneval.lisp => alieneval.lisp} | 447 +++++++++++------- src/code/early-alieneval.lisp | 153 ------ src/code/target-alieneval.lisp | 38 +- src/compiler/early-c.lisp | 12 - 5 files changed, 325 insertions(+), 334 deletions(-) rename src/code/{host-alieneval.lisp => alieneval.lisp} (84%) delete mode 100644 src/code/early-alieneval.lisp diff --git a/build-order.lisp-expr b/build-order.lisp-expr index 7a70610a06..ad380c9d4b 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -173,7 +173,7 @@ ("src/code/string-hash" :c-headers) ("src/code/primordial-type" :c-headers) ("src/code/early-classoid" :c-headers) - ("src/code/early-alieneval" :c-headers) ; for funs and vars needed at build and run time + ("src/code/alieneval" :c-headers) ("src/code/target-error" :not-host) ;; "src/code/toplevel.lisp" is the first to need this. It's generated @@ -357,11 +357,6 @@ ("src/compiler/generic/primtype" :c-headers) - ;; for DEFSTRUCT ALIEN-TYPE, needed by host-type.lisp - ("src/code/host-alieneval") - - ;; can't be done until definition of e.g. DEFINE-ALIEN-TYPE-CLASS in - ;; host-alieneval.lisp ("src/code/host-c-call") ;; SB-XC:DEFTYPE is needed in order to compile late-type @@ -419,7 +414,7 @@ ("src/code/hash-table" :c-headers) ("src/code/readtable") ("src/code/pathname" :not-host) - ("src/code/host-pprint") ; defines QUEUED-OP needed by 'pprint' + ("src/code/host-pprint") ("src/compiler/fndb") ("src/compiler/generic/vm-fndb") diff --git a/src/code/host-alieneval.lisp b/src/code/alieneval.lisp similarity index 84% rename from src/code/host-alieneval.lisp rename to src/code/alieneval.lisp index e64469211a..2af3df4b8f 100644 --- a/src/code/host-alieneval.lisp +++ b/src/code/alieneval.lisp @@ -1,5 +1,5 @@ -;;;; the part of the Alien implementation which is needed at -;;;; cross-compilation time +;;;; This file contains parts of the Alien implementation that +;;;; are not part of the compiler. ;;;; This software is part of the SBCL system. See the README file for ;;;; more information. @@ -12,7 +12,10 @@ (in-package "SB-ALIEN") -(/show0 "host-alieneval.lisp 15") +#-sb-xc-host (sb-impl::define-thread-local *saved-fp* nil) + +(defvar *default-c-string-external-format* nil) + ;;;; utility functions @@ -27,9 +30,74 @@ ((> bits 8) 16) ((> bits 1) 8) (t 1))) + ;;;; ALIEN-TYPE-INFO stuff +(eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute) + +(defstruct (alien-type-class (:copier nil)) + (name nil :type symbol) + (defstruct-name nil :type symbol) + (include nil :type (or null alien-type-class)) + (unparse nil :type (or null function)) + (type= nil :type (or null function)) + (lisp-rep nil :type (or null function)) + (alien-rep nil :type (or null function)) + (extract-gen nil :type (or null function)) + (deposit-gen nil :type (or null function)) + (naturalize-gen nil :type (or null function)) + (deport-gen nil :type (or null function)) + (deport-alloc-gen nil :type (or null function)) + (deport-pin-p nil :type (or null function)) + ;; Cast? + (arg-tn nil :type (or null function)) + (result-tn nil :type (or null function)) + (subtypep nil :type (or null function))) + +(defmethod print-object ((type-class alien-type-class) stream) + (print-unreadable-object (type-class stream :type t) + (prin1 (alien-type-class-name type-class) stream))) + +(defglobal *alien-type-classes* (make-hash-table :test 'eq)) ; keys are symbols + +(defun alien-type-class-or-lose (name) + (or (gethash name *alien-type-classes*) + (error "no alien type class ~S" name))) + +(defun create-alien-type-class-if-necessary (name defstruct-name include) + (let ((old (gethash name *alien-type-classes*)) + (include (and include (alien-type-class-or-lose include)))) + (if old + (setf (alien-type-class-include old) include) + (setf (gethash name *alien-type-classes*) + (make-alien-type-class :name name + :defstruct-name defstruct-name + :include include))))) + +(defconstant-eqx +method-slot-alist+ + '((:unparse . alien-type-class-unparse) + (:type= . alien-type-class-type=) + (:subtypep . alien-type-class-subtypep) + (:lisp-rep . alien-type-class-lisp-rep) + (:alien-rep . alien-type-class-alien-rep) + (:extract-gen . alien-type-class-extract-gen) + (:deposit-gen . alien-type-class-deposit-gen) + (:naturalize-gen . alien-type-class-naturalize-gen) + (:deport-gen . alien-type-class-deport-gen) + (:deport-alloc-gen . alien-type-class-deport-alloc-gen) + (:deport-pin-p . alien-type-class-deport-pin-p) + ;; cast? + (:arg-tn . alien-type-class-arg-tn) + (:result-tn . alien-type-class-result-tn)) + #'equal) + +(defun method-slot (method) + (cdr (or (assoc method +method-slot-alist+) + (error "no method ~S" method)))) + +) ; EVAL-WHEN + ;;; We define a keyword "BOA" constructor so that we can reference the ;;; slot names in init forms. (defmacro define-alien-type-class ((name &key include include-args) &rest slots) @@ -79,9 +147,43 @@ ,@body) (setf (,(method-slot method) (alien-type-class-or-lose ',class)) #',defun-name)))) + +(defmacro invoke-alien-type-method (method type &rest args) + (let ((slot (method-slot method))) + (once-only ((type type)) + `(funcall (do ((class (alien-type-class-or-lose (alien-type-class ,type)) + (alien-type-class-include class))) + ((null class) + (error "method ~S not defined for ~S" + ',method (alien-type-class ,type))) + (let ((fn (,slot class))) + (when fn + (return fn)))) + ,type ,@args)))) + + +;;;; the root alien type + +(eval-when (:compile-toplevel :load-toplevel :execute) + (create-alien-type-class-if-necessary 'root 'alien-type nil)) + +(defmethod print-object ((type alien-type) stream) + (print-unreadable-object (type stream :type t) + (sb-impl:print-type-specifier stream (unparse-alien-type type)))) + ;;;; type parsing and unparsing +(defvar *new-auxiliary-types* nil) + +;;; Process stuff in a new scope. +(defmacro with-auxiliary-alien-types (env &body body) + ``(symbol-macrolet ((&auxiliary-type-definitions& + ,(append *new-auxiliary-types* + (auxiliary-type-definitions ,env)))) + ,(let ((*new-auxiliary-types* nil)) + ,@body))) + ;;; CMU CL used COMPILER-LET to bind *AUXILIARY-TYPE-DEFINITIONS*, and ;;; COMPILER-LET is no longer supported by ANSI or SBCL. Instead, we ;;; follow the suggestion in CLTL2 of using SYMBOL-MACROLET to achieve @@ -152,6 +254,11 @@ (when (info :alien-type kind name) (error "attempt to shadow definition of ~A ~S" kind name))))) +;;; the list of record types that have already been unparsed. This is +;;; used to keep from outputting the slots again if the same structure +;;; shows up twice. +(defvar *record-types-already-unparsed*) + (defun unparse-alien-type (type) "Convert the alien-type structure TYPE back into a list specification of the type." @@ -164,133 +271,77 @@ ;;; *RECORD-TYPES-ALREADY-UNPARSED*. (defun %unparse-alien-type (type) (invoke-alien-type-method :unparse type)) + ;;;; alien type defining stuff -(eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute) - (defun %define-alien-type-translator (name translator) - (setf (info :alien-type :kind name) :primitive) - (setf (info :alien-type :translator name) translator) - (clear-info :alien-type :definition name) - name)) - -(eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute) - (defun %def-auxiliary-alien-types (types source-location) - (dolist (info types) - ;; Clear up the type we're about to define from the toplevel - ;; *new-auxiliary-types* (local scopes take care of themselves). - ;; Unless this is done we never actually get back the full type - ;; from INFO, since the *new-auxiliary-types* have precendence. - (setf *new-auxiliary-types* - (remove info *new-auxiliary-types* - :test (lambda (a b) - (and (eq (first a) (first b)) - (eq (second a) (second b)))))) - (destructuring-bind (kind name defn) info - (let ((old (info :alien-type kind name))) - (unless (or (null old) (alien-type-= old defn)) - (warn "redefining ~A ~S to be:~% ~S,~%was:~% ~S" - kind name defn old))) - (setf (info :alien-type kind name) defn - (info :source-location :alien-type name) source-location)))) - - (defun %define-alien-type (name new source-location) - (ecase (info :alien-type :kind name) - (:primitive - (error "~/sb-impl:print-type-specifier/ is a built-in alien type." - name)) - (:defined - (let ((old (info :alien-type :definition name))) - (unless (or (null old) (alien-type-= new old)) - (warn "redefining ~S to be:~% ~ +(defmacro define-alien-type-translator (name lambda-list &body body) + (let ((defun-name (symbolicate "ALIEN-" name "-TYPE-TRANSLATOR")) + (macro-lambda + (make-macro-lambda nil lambda-list body + 'define-alien-type-translator name))) + `(progn + (defun ,defun-name ,(second macro-lambda) ,@(cddr macro-lambda)) + (%define-alien-type-translator ',name #',defun-name)))) + +(defun %define-alien-type-translator (name translator) + (setf (info :alien-type :kind name) :primitive) + (setf (info :alien-type :translator name) translator) + (clear-info :alien-type :definition name) + name) + +(defmacro define-alien-type (name type &environment env) + "Define the alien type NAME to be equivalent to TYPE. Name may be NIL for + STRUCT and UNION types, in which case the name is taken from the type + specifier." + (with-auxiliary-alien-types env + (let ((alien-type (parse-alien-type type env))) + `(eval-when (:compile-toplevel :load-toplevel :execute) + ,@(when *new-auxiliary-types* + `((%def-auxiliary-alien-types ',*new-auxiliary-types* + (sb-c:source-location)))) + ,@(when name + `((%define-alien-type ',name ',alien-type (sb-c:source-location)))))))) + +(defun %def-auxiliary-alien-types (types source-location) + (dolist (info types) + ;; Clear up the type we're about to define from the toplevel + ;; *new-auxiliary-types* (local scopes take care of themselves). + ;; Unless this is done we never actually get back the full type + ;; from INFO, since the *new-auxiliary-types* have precendence. + (setf *new-auxiliary-types* + (remove info *new-auxiliary-types* + :test (lambda (a b) + (and (eq (first a) (first b)) + (eq (second a) (second b)))))) + (destructuring-bind (kind name defn) info + (let ((old (info :alien-type kind name))) + (unless (or (null old) (alien-type-= old defn)) + (warn "redefining ~A ~S to be:~% ~S,~%was:~% ~S" + kind name defn old))) + (setf (info :alien-type kind name) defn + (info :source-location :alien-type name) source-location)))) + +(defun %define-alien-type (name new source-location) + (ecase (info :alien-type :kind name) + (:primitive + (error "~/sb-impl:print-type-specifier/ is a built-in alien type." + name)) + (:defined + (let ((old (info :alien-type :definition name))) + (unless (or (null old) (alien-type-= new old)) + (warn "redefining ~S to be:~% ~ ~/sb-impl:print-type-specifier/,~%was~% ~ ~/sb-impl:print-type-specifier/" - name - (unparse-alien-type new) - (unparse-alien-type old))))) - (:unknown)) - (setf (info :alien-type :definition name) new) - (setf (info :alien-type :kind name) :defined) - (setf (info :source-location :alien-type name) source-location) - name)) - -;;;; the root alien type - -(eval-when (:compile-toplevel :load-toplevel :execute) - (create-alien-type-class-if-necessary 'root 'alien-type nil)) - -(defmethod print-object ((type alien-type) stream) - (print-unreadable-object (type stream :type t) - (sb-impl:print-type-specifier stream (unparse-alien-type type)))) - -;;;; the SAP type - -(define-alien-type-class (system-area-pointer)) - -(define-alien-type-translator system-area-pointer () - (make-alien-system-area-pointer-type - :bits sb-vm:n-machine-word-bits)) - -(define-alien-type-method (system-area-pointer :unparse) (type) - (declare (ignore type)) - 'system-area-pointer) - -(define-alien-type-method (system-area-pointer :lisp-rep) (type) - (declare (ignore type)) - 'system-area-pointer) - -(define-alien-type-method (system-area-pointer :alien-rep) (type context) - (declare (ignore type context)) - 'system-area-pointer) - -(define-alien-type-method (system-area-pointer :naturalize-gen) (type alien) - (declare (ignore type)) - alien) - -(define-alien-type-method (system-area-pointer :deport-gen) (type object) - (declare (ignore type)) - (/noshow "doing alien type method SYSTEM-AREA-POINTER :DEPORT-GEN" object) - object) - -(define-alien-type-method (system-area-pointer :extract-gen) (type sap offset) - (declare (ignore type)) - `(sap-ref-sap ,sap (/ ,offset sb-vm:n-byte-bits))) - -;;;; the ALIEN-VALUE type - -(define-alien-type-class (alien-value :include system-area-pointer)) - -(define-alien-type-method (alien-value :lisp-rep) (type) - (declare (ignore type)) - nil) - -(define-alien-type-method (alien-value :naturalize-gen) (type alien) - `(%sap-alien ,alien ',type)) - -(define-alien-type-method (alien-value :deport-gen) (type value) - (declare (ignore type)) - (/noshow "doing alien type method ALIEN-VALUE :DEPORT-GEN" value) - `(alien-sap ,value)) - -;;; HEAP-ALIEN-INFO -- defstruct. -;;; -(defmethod print-object ((info heap-alien-info) stream) - (print-unreadable-object (info stream :type t) - (format stream "~S ~S~@[ (data)~]" - (heap-alien-info-alien-name info) - (unparse-alien-type (heap-alien-info-type info)) - (heap-alien-info-datap info)))) - -;;; The form to evaluate to produce the SAP pointing to where in the heap -;;; it is. -(defun heap-alien-info-sap-form (info) - `(foreign-symbol-sap ,(heap-alien-info-alien-name info) - ,(heap-alien-info-datap info))) + name + (unparse-alien-type new) + (unparse-alien-type old))))) + (:unknown)) + (setf (info :alien-type :definition name) new) + (setf (info :alien-type :kind name) :defined) + (setf (info :source-location :alien-type name) source-location) + name) -#-sb-xc-host ; No FOREIGN-SYMBOL-SAP -(defun heap-alien-info-sap (info) - (foreign-symbol-sap (heap-alien-info-alien-name info) - (heap-alien-info-datap info))) ;;;; Interfaces to the different methods @@ -368,6 +419,7 @@ ;;; details. (defun compute-alien-rep-type (type &optional (context :normal)) (invoke-alien-type-method :alien-rep type context)) + ;;;; default methods @@ -705,6 +757,57 @@ (declare (ignore type)) `(sap-ref-double ,sap (/ ,offset sb-vm:n-byte-bits))) + +;;;; the SAP type + +(define-alien-type-class (system-area-pointer)) + +(define-alien-type-translator system-area-pointer () + (make-alien-system-area-pointer-type + :bits sb-vm:n-machine-word-bits)) + +(define-alien-type-method (system-area-pointer :unparse) (type) + (declare (ignore type)) + 'system-area-pointer) + +(define-alien-type-method (system-area-pointer :lisp-rep) (type) + (declare (ignore type)) + 'system-area-pointer) + +(define-alien-type-method (system-area-pointer :alien-rep) (type context) + (declare (ignore type context)) + 'system-area-pointer) + +(define-alien-type-method (system-area-pointer :naturalize-gen) (type alien) + (declare (ignore type)) + alien) + +(define-alien-type-method (system-area-pointer :deport-gen) (type object) + (declare (ignore type)) + (/noshow "doing alien type method SYSTEM-AREA-POINTER :DEPORT-GEN" object) + object) + +(define-alien-type-method (system-area-pointer :extract-gen) (type sap offset) + (declare (ignore type)) + `(sap-ref-sap ,sap (/ ,offset sb-vm:n-byte-bits))) + + +;;;; the ALIEN-VALUE type + +(define-alien-type-class (alien-value :include system-area-pointer)) + +(define-alien-type-method (alien-value :lisp-rep) (type) + (declare (ignore type)) + nil) + +(define-alien-type-method (alien-value :naturalize-gen) (type alien) + `(%sap-alien ,alien ',type)) + +(define-alien-type-method (alien-value :deport-gen) (type value) + (declare (ignore type)) + (/noshow "doing alien type method ALIEN-VALUE :DEPORT-GEN" value) + `(alien-sap ,value)) + ;;;; the POINTER type @@ -989,9 +1092,19 @@ (or (memq type2 types) (match-fields types))) (let ((*alien-type-matches* (make-hash-table :test #'eq))) (match-fields)))))) + ;;;; the FUNCTION and VALUES alien types +;;; not documented in CMU CL:-( +;;; +;;; reverse engineering observations: +;;; * seems to be set when translating return values +;;; * seems to enable the translation of (VALUES), which is the +;;; Lisp idiom for C's return type "void" (which is likely +;;; why it's set when when translating return values) +(defvar *values-type-okay* nil) + ;;; Calling-convention spec, typically one of predefined keywords. ;;; Add or remove as needed for target platform. It makes sense to ;;; support :cdecl everywhere. @@ -1094,9 +1207,37 @@ (every #'alien-type-= (alien-values-type-values type1) (alien-values-type-values type2)))) + -;;;; a structure definition needed both in the target and in the -;;;; cross-compilation host +;;;; alien variables + +;;; Information describing a heap-allocated alien. +(def!struct (heap-alien-info (:copier nil)) + ;; The type of this alien. + (type (missing-arg) :type alien-type) + ;; Its name. + (alien-name (missing-arg) :type simple-string) + ;; Data or code? + (datap (missing-arg) :type boolean)) +(!set-load-form-method heap-alien-info (:xc :target)) + +(defmethod print-object ((info heap-alien-info) stream) + (print-unreadable-object (info stream :type t) + (format stream "~S ~S~@[ (data)~]" + (heap-alien-info-alien-name info) + (unparse-alien-type (heap-alien-info-type info)) + (heap-alien-info-datap info)))) + +;;; The form to evaluate to produce the SAP pointing to where in the heap +;;; it is. +(defun heap-alien-info-sap-form (info) + `(foreign-symbol-sap ,(heap-alien-info-alien-name info) + ,(heap-alien-info-datap info))) + +#-sb-xc-host ; No FOREIGN-SYMBOL-SAP +(defun heap-alien-info-sap (info) + (foreign-symbol-sap (heap-alien-info-alien-name info) + (heap-alien-info-datap info))) ;;; information about local aliens. The WITH-ALIEN macro builds one of ;;; these structures and LOCAL-ALIEN and friends communicate @@ -1120,40 +1261,6 @@ "~:[~;(forced to stack) ~]~S" (local-alien-info-force-to-memory-p info) (unparse-alien-type (local-alien-info-type info))))) - -;;;; the ADDR macro - -(sb-xc:defmacro addr (expr &environment env) - "Return an Alien pointer to the data addressed by Expr, which must be a call - to SLOT or DEREF, or a reference to an Alien variable." - (let ((form (%macroexpand expr env))) - (or (typecase form - (cons - (case (car form) - (slot - (cons '%slot-addr (cdr form))) - (deref - (cons '%deref-addr (cdr form))) - (%heap-alien - (cons '%heap-alien-addr (cdr form))) - (local-alien - (let ((info (let ((info-arg (second form))) - (and (consp info-arg) - (eq (car info-arg) 'quote) - (second info-arg))))) - (unless (local-alien-info-p info) - (error "Something is wrong, LOCAL-ALIEN-INFO not found: ~S" - form)) - (setf (local-alien-info-force-to-memory-p info) t)) - (cons '%local-alien-addr (cdr form))))) - (symbol - (let ((kind (info :variable :kind form))) - (when (eq kind :alien) - `(%heap-alien-addr ',(info :variable :alien-info form)))))) - (error "~S is not a valid L-value." form)))) - -(push '("SB-ALIEN" define-alien-type-class define-alien-type-method) - *!removable-symbols*) (in-package "SB-IMPL") @@ -1170,6 +1277,8 @@ (or (gethash extern table) (gethash (concatenate 'base-string "ldso_stub__" extern) table))))) +(in-package "SB-ALIEN") + ;;; *STATIC-FOREIGN-SYMBOLS* are static as opposed to "dynamic" (not ;;; as opposed to C's "extern"). The table contains symbols known at ;;; the time that the program was built, but not symbols defined in @@ -1179,4 +1288,20 @@ (declaim (type hash-table *static-foreign-symbols*)) (defvar *static-foreign-symbols* (make-hash-table :test 'equal))) -(/show0 "host-alieneval.lisp end of file") +#+sb-xc +(defmacro maybe-with-pinned-objects (variables types &body body) + (declare (ignorable variables types)) + (let ((pin-variables + ;; Only pin things on GENCGC, since on CHENEYGC it'd imply + ;; disabling the GC. Which is something we don't want to do + ;; every time we're calling to C. + #+gencgc + (loop for variable in variables + for type in types + when (invoke-alien-type-method :deport-pin-p type) + collect variable))) + (if pin-variables + `(with-pinned-objects ,pin-variables + ,@body) + `(progn + ,@body)))) diff --git a/src/code/early-alieneval.lisp b/src/code/early-alieneval.lisp deleted file mode 100644 index 9f66c24bda..0000000000 --- a/src/code/early-alieneval.lisp +++ /dev/null @@ -1,153 +0,0 @@ -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-ALIEN") - -(defglobal *alien-type-classes* (make-hash-table)) ; keys are symbols - -#-sb-xc-host (sb-impl::define-thread-local *saved-fp* nil) - -(defvar *new-auxiliary-types* nil) - -;;; the list of record types that have already been unparsed. This is -;;; used to keep from outputting the slots again if the same structure -;;; shows up twice. -(defvar *record-types-already-unparsed*) - -;;; not documented in CMU CL:-( -;;; -;;; reverse engineering observations: -;;; * seems to be set when translating return values -;;; * seems to enable the translation of (VALUES), which is the -;;; Lisp idiom for C's return type "void" (which is likely -;;; why it's set when when translating return values) -(defvar *values-type-okay* nil) - -(defvar *default-c-string-external-format* nil) - -(defmacro define-alien-type-translator (name lambda-list &body body) - (let ((defun-name (symbolicate "ALIEN-" name "-TYPE-TRANSLATOR")) - (macro-lambda - (make-macro-lambda nil lambda-list body - 'define-alien-type-translator name))) - `(progn - (eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute) - (defun ,defun-name ,(second macro-lambda) ,@(cddr macro-lambda))) - (eval-when (:compile-toplevel :load-toplevel :execute) - (%define-alien-type-translator ',name #',defun-name))))) - -;;; Process stuff in a new scope. -(defmacro with-auxiliary-alien-types (env &body body) - ``(symbol-macrolet ((&auxiliary-type-definitions& - ,(append *new-auxiliary-types* - (auxiliary-type-definitions ,env)))) - ,(let ((*new-auxiliary-types* nil)) - ,@body))) - -(defmacro define-alien-type (name type &environment env) - "Define the alien type NAME to be equivalent to TYPE. Name may be NIL for - STRUCT and UNION types, in which case the name is taken from the type - specifier." - (with-auxiliary-alien-types env - (let ((alien-type (parse-alien-type type env))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - ,@(when *new-auxiliary-types* - `((%def-auxiliary-alien-types ',*new-auxiliary-types* - (sb-c:source-location)))) - ,@(when name - `((%define-alien-type ',name ',alien-type (sb-c:source-location)))))))) - -(defstruct (alien-type-class (:copier nil)) - (name nil :type symbol) - (defstruct-name nil :type symbol) - (include nil :type (or null alien-type-class)) - (unparse nil :type (or null function)) - (type= nil :type (or null function)) - (lisp-rep nil :type (or null function)) - (alien-rep nil :type (or null function)) - (extract-gen nil :type (or null function)) - (deposit-gen nil :type (or null function)) - (naturalize-gen nil :type (or null function)) - (deport-gen nil :type (or null function)) - (deport-alloc-gen nil :type (or null function)) - (deport-pin-p nil :type (or null function)) - ;; Cast? - (arg-tn nil :type (or null function)) - (result-tn nil :type (or null function)) - (subtypep nil :type (or null function))) - -(defmethod print-object ((type-class alien-type-class) stream) - (print-unreadable-object (type-class stream :type t) - (prin1 (alien-type-class-name type-class) stream))) - -(defun alien-type-class-or-lose (name) - (or (gethash name *alien-type-classes*) - (error "no alien type class ~S" name))) - -(defun create-alien-type-class-if-necessary (name defstruct-name include) - (let ((old (gethash name *alien-type-classes*)) - (include (and include (alien-type-class-or-lose include)))) - (if old - (setf (alien-type-class-include old) include) - (setf (gethash name *alien-type-classes*) - (make-alien-type-class :name name - :defstruct-name defstruct-name - :include include))))) - -(defconstant-eqx +method-slot-alist+ - '((:unparse . alien-type-class-unparse) - (:type= . alien-type-class-type=) - (:subtypep . alien-type-class-subtypep) - (:lisp-rep . alien-type-class-lisp-rep) - (:alien-rep . alien-type-class-alien-rep) - (:extract-gen . alien-type-class-extract-gen) - (:deposit-gen . alien-type-class-deposit-gen) - (:naturalize-gen . alien-type-class-naturalize-gen) - (:deport-gen . alien-type-class-deport-gen) - (:deport-alloc-gen . alien-type-class-deport-alloc-gen) - (:deport-pin-p . alien-type-class-deport-pin-p) - ;; cast? - (:arg-tn . alien-type-class-arg-tn) - (:result-tn . alien-type-class-result-tn)) - #'equal) - -(defun method-slot (method) - (cdr (or (assoc method +method-slot-alist+) - (error "no method ~S" method)))) - -(defmacro invoke-alien-type-method (method type &rest args) - (let ((slot (method-slot method))) - (once-only ((type type)) - `(funcall (do ((class (alien-type-class-or-lose (alien-type-class ,type)) - (alien-type-class-include class))) - ((null class) - (error "method ~S not defined for ~S" - ',method (alien-type-class ,type))) - (let ((fn (,slot class))) - (when fn - (return fn)))) - ,type ,@args)))) - -#+sb-xc -(defmacro maybe-with-pinned-objects (variables types &body body) - (declare (ignorable variables types)) - (let ((pin-variables - ;; Only pin things on GENCGC, since on CHENEYGC it'd imply - ;; disabling the GC. Which is something we don't want to do - ;; every time we're calling to C. - #+gencgc - (loop for variable in variables - for type in types - when (invoke-alien-type-method :deport-pin-p type) - collect variable))) - (if pin-variables - `(with-pinned-objects ,pin-variables - ,@body) - `(progn - ,@body)))) diff --git a/src/code/target-alieneval.lisp b/src/code/target-alieneval.lisp index 1e1a07a1bc..172d8fcbd4 100644 --- a/src/code/target-alieneval.lisp +++ b/src/code/target-alieneval.lisp @@ -1,4 +1,4 @@ -;;;; This file contains parts of the ALIEN implementation that +;;;; This file contains parts of the Alien implementation that ;;;; are not part of the compiler. ;;;; This software is part of the SBCL system. See the README file for @@ -570,6 +570,42 @@ null byte." (unless (local-alien-info-force-to-memory-p info) (error "~S isn't forced to memory. Something went wrong." alien)) alien) + + +;;;; the ADDR macro + +(defmacro addr (expr &environment env) + "Return an Alien pointer to the data addressed by Expr, which must be a call + to SLOT or DEREF, or a reference to an Alien variable." + (let ((form (%macroexpand expr env))) + (or (typecase form + (cons + (case (car form) + (slot + (cons '%slot-addr (cdr form))) + (deref + (cons '%deref-addr (cdr form))) + (%heap-alien + (cons '%heap-alien-addr (cdr form))) + (local-alien + (let ((info (let ((info-arg (second form))) + (and (consp info-arg) + (eq (car info-arg) 'quote) + (second info-arg))))) + (unless (local-alien-info-p info) + (error "Something is wrong, LOCAL-ALIEN-INFO not found: ~S" + form)) + (setf (local-alien-info-force-to-memory-p info) t)) + (cons '%local-alien-addr (cdr form))))) + (symbol + (let ((kind (info :variable :kind form))) + (when (eq kind :alien) + `(%heap-alien-addr ',(info :variable :alien-info form)))))) + (error "~S is not a valid L-value." form)))) + +(push '("SB-ALIEN" define-alien-type-class define-alien-type-method) + *!removable-symbols*) + ;;;; the CAST macro diff --git a/src/compiler/early-c.lisp b/src/compiler/early-c.lisp index 1b7f254db4..d63c98eb98 100644 --- a/src/compiler/early-c.lisp +++ b/src/compiler/early-c.lisp @@ -401,18 +401,6 @@ the stack without triggering overflow protection.") (sb-impl::define-thread-local *compilation*) (declaim (type compilation *compilation*)) -(in-package "SB-ALIEN") - -;;; Information describing a heap-allocated alien. -(def!struct (heap-alien-info (:copier nil)) - ;; The type of this alien. - (type (missing-arg) :type alien-type) - ;; Its name. - (alien-name (missing-arg) :type simple-string) - ;; Data or code? - (datap (missing-arg) :type boolean)) -(!set-load-form-method heap-alien-info (:xc :target)) - ;; from 'llvm/projects/compiler-rt/lib/msan/msan.h': ;; "#define MEM_TO_SHADOW(mem) (((uptr)(mem)) ^ 0x500000000000ULL)" #+linux ; shadow space differs by OS From 57f2b9a89e31de4f5246d27565976d5906b112ac Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sun, 26 Jul 2020 19:12:38 -0700 Subject: [PATCH 0424/4023] Explicity package qualify use of host CLOS. --- src/code/class.lisp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/class.lisp b/src/code/class.lisp index 833192c36e..07437f6973 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -529,12 +529,12 @@ between the ~A definition and the ~A definition" ;; modulo potential differences with respect to ;; conditions). #+sb-xc-host - (let ((old (class-of old-value)) - (new (class-of new-value))) + (let ((old (cl:class-of old-value)) + (new (cl:class-of new-value))) (unless (eq old new) (bug "Trying to change the metaclass of ~S from ~S to ~S in the ~ cross-compiler." - name (class-name old) (class-name new)))) + name (cl:class-name old) (cl:class-name new)))) #-sb-xc-host (let ((old (classoid-of old-value)) (new (classoid-of new-value))) From f3413d044473b176b49dc7414a590b443d235735 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Fri, 31 Jul 2020 17:10:50 -0700 Subject: [PATCH 0425/4023] Remove all explicit #-sb-fluid declamations. Intercept DECLAIM to accomplish the same thing instead on the host, and make inline declarations effectless on the target. (I'm assuming that target performance with inline declaration for user code is not a priority for people who use #+sb-fluid.) --- src/code/array.lisp | 1 - src/code/bignum.lisp | 8 ++++---- src/code/bit-bash.lisp | 4 ++-- src/code/cross-early.lisp | 13 +++++++++++++ src/code/debug-int.lisp | 4 ++-- src/code/defstruct.lisp | 2 +- src/code/dyncount.lisp | 2 +- src/code/early-classoid.lisp | 2 +- src/code/early-raw-slots.lisp | 2 +- src/code/float-inf-nan.lisp | 1 - src/code/float.lisp | 9 ++++----- src/code/gc.lisp | 2 -- src/code/late-type.lisp | 2 +- src/code/load.lisp | 2 +- src/code/numbers.lisp | 8 ++++---- src/code/pprint.lisp | 2 +- src/code/pred.lisp | 2 +- src/code/reader.lisp | 10 ++++------ src/code/restart.lisp | 2 +- src/code/setf-funs.lisp | 2 +- src/code/stream.lisp | 24 ++++++++++++------------ src/code/target-alieneval.lisp | 6 +++--- src/code/target-char.lisp | 1 - src/code/target-hash-table.lisp | 4 ++-- src/code/target-pathname.lisp | 2 +- src/code/target-random.lisp | 8 ++++---- src/code/target-signal.lisp | 4 ++-- src/code/target-stream.lisp | 2 +- src/code/type-class.lisp | 6 +++--- src/code/uncross.lisp | 2 +- src/code/weak.lisp | 2 +- src/code/win32.lisp | 1 - src/code/xset.lisp | 2 +- src/cold/set-up-cold-packages.lisp | 8 ++++++++ src/compiler/bit-util.lisp | 1 - src/compiler/constraint.lisp | 2 +- src/compiler/debug-dump.lisp | 2 +- src/compiler/disassem.lisp | 3 +-- src/compiler/early-constantp.lisp | 4 ++-- src/compiler/early-globaldb.lisp | 2 +- src/compiler/early-lexenv.lisp | 2 +- src/compiler/float-tran.lisp | 2 +- src/compiler/ir1tran.lisp | 4 ++-- src/compiler/ir1util.lisp | 4 ++-- src/compiler/ltn.lisp | 2 +- src/compiler/macros.lisp | 2 +- src/compiler/node.lisp | 11 +++++------ src/compiler/pack.lisp | 2 +- src/compiler/proclaim.lisp | 3 ++- src/compiler/represent.lisp | 2 +- src/compiler/target-disassem.lisp | 4 ++-- src/compiler/vmdef.lisp | 2 +- src/pcl/boot.lisp | 8 ++++---- src/pcl/defs.lisp | 2 +- src/pcl/dfun.lisp | 2 +- 55 files changed, 114 insertions(+), 104 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index bdc848ed44..0725706c4a 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -11,7 +11,6 @@ (in-package "SB-VM") -#-sb-fluid (declaim (inline adjustable-array-p array-displacement)) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index e11714695d..a0b67cf292 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -138,7 +138,7 @@ (declare (type bignum-element-type digit)) (not (logbitp (1- digit-size) digit))) -#-sb-fluid (declaim (inline %bignum-0-or-plusp)) +(declaim (inline %bignum-0-or-plusp)) (defun %bignum-0-or-plusp (bignum len) (declare (type bignum bignum) (type bignum-length len)) @@ -248,7 +248,7 @@ ;;; is suitable for infinite sign extension to complete additions, ;;; subtractions, negations, etc. This cannot return a -1 represented as ;;; a negative fixnum since it would then have to low zeros. -#-sb-fluid (declaim (inline %sign-digit)) +(declaim (inline %sign-digit)) (defun %sign-digit (bignum len) (declare (type bignum bignum) (type bignum-length len)) @@ -646,7 +646,7 @@ ;;; Allocate a single word bignum that holds fixnum. This is useful when ;;; we are trying to mix fixnum and bignum operands. -#-sb-fluid (declaim (inline make-small-bignum)) +(declaim (inline make-small-bignum)) (defun make-small-bignum (fixnum) (let ((res (%allocate-bignum 1))) (setf (%bignum-ref res 0) (%fixnum-to-digit fixnum)) @@ -1912,7 +1912,7 @@ ;;; incoming data, such as in-place shifting. This is basically the same as ;;; the first form in %NORMALIZE-BIGNUM, but we return the length of the buffer ;;; instead of shrinking the bignum. -#-sb-fluid (declaim (maybe-inline %normalize-bignum-buffer)) +(declaim (maybe-inline %normalize-bignum-buffer)) (defun %normalize-bignum-buffer (result len) (declare (type bignum result) (type bignum-length len)) diff --git a/src/code/bit-bash.lisp b/src/code/bit-bash.lisp index 560d7fe8ee..965fb66823 100644 --- a/src/code/bit-bash.lisp +++ b/src/code/bit-bash.lisp @@ -76,7 +76,7 @@ (:little-endian (ash (ldb (byte (- n-word-bits count) 0) number) count))))))) -#-sb-fluid (declaim (inline start-mask end-mask)) +(declaim (inline start-mask end-mask)) ;;; Produce a mask that contains 1's for the COUNT "start" bits and ;;; 0's for the remaining "end" bits. Only the lower 5 bits of COUNT @@ -94,7 +94,7 @@ (declare (fixnum count)) (shift-towards-end most-positive-word (- count))) -#-sb-fluid (declaim (inline word-sap-ref %set-word-sap-ref)) +(declaim (inline word-sap-ref %set-word-sap-ref)) (defun word-sap-ref (sap offset) (declare (type system-area-pointer sap) (type index offset) diff --git a/src/code/cross-early.lisp b/src/code/cross-early.lisp index ce95ad14cc..2b083e5bad 100644 --- a/src/code/cross-early.lisp +++ b/src/code/cross-early.lisp @@ -11,6 +11,19 @@ (in-package "SB-IMPL") +(defmacro sb-xc:declaim (&rest declaration-specifiers) + #+(or sb-devel sb-fluid) + (setq declaration-specifiers + (remove-if (lambda (declaration-specifier) + (member (first declaration-specifier) + '(#+sb-fluid inline + #+sb-fluid maybe-inline + #+sb-fluid sb-ext:freeze-type + #+sb-devel start-block + #+sb-devel end-block))) + declaration-specifiers)) + `(cl:declaim ,@declaration-specifiers)) + ;;; The STRUCTURE!OBJECT abstract class is the base of the hierarchy ;;; of objects that need to be identifiable as SBCL system objects ;;; in the host Lisp. This type does not exist in the target. diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 490a8caf7d..694860f6a2 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -516,7 +516,7 @@ ;;; address, whereas the one in C is an index into code->constants. (defconstant real-lra-slot sb-vm:code-constants-offset) -#-sb-fluid (declaim (inline control-stack-pointer-valid-p)) +(declaim (inline control-stack-pointer-valid-p)) (defun control-stack-pointer-valid-p (x &optional (aligned t)) (declare (type system-area-pointer x)) (let* (#-stack-grows-downward-not-upward @@ -643,7 +643,7 @@ ;;; address. ;;; ;;; XXX Could be a little smarter. -#-sb-fluid (declaim (inline ra-pointer-valid-p)) +(declaim (inline ra-pointer-valid-p)) (defun ra-pointer-valid-p (ra) (declare (type system-area-pointer ra)) (and diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index bfb250496e..23b46b4dff 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -140,7 +140,7 @@ ;; and we don't have structures whose slot indices run into the thousands. (bits 0 :type fixnum :read-only t) (default nil :read-only t)) ; default value expression -#-sb-fluid (declaim (freeze-type defstruct-slot-description)) +(declaim (freeze-type defstruct-slot-description)) (eval-when (:compile-toplevel) ;; Ensure that rsd-index is representable in 3 bits. (Can easily be changed) diff --git a/src/code/dyncount.lisp b/src/code/dyncount.lisp index 8a8d5c063a..6d986236a8 100644 --- a/src/code/dyncount.lisp +++ b/src/code/dyncount.lisp @@ -109,7 +109,7 @@ comments from CMU CL: (setf (vop-stats-cost res) cost) res)) -#-sb-fluid (declaim (freeze-type dyncount-info vop-stats)) +(declaim (freeze-type dyncount-info vop-stats)) ;;; Add the Info into the cumulative result on the VOP name plist. We use ;;; plists so that we will touch minimal system code outside of this file diff --git a/src/code/early-classoid.lisp b/src/code/early-classoid.lisp index dd8583eaf0..e669290b6b 100644 --- a/src/code/early-classoid.lisp +++ b/src/code/early-classoid.lisp @@ -82,7 +82,7 @@ ;; PURIFY). ;; This is only meaningful if DD-CLASS-P = T. (pure nil :type (member t nil))) -#-sb-fluid (declaim (freeze-type defstruct-description)) +(declaim (freeze-type defstruct-description)) (!set-load-form-method defstruct-description (:host :xc :target)) ;;;; basic LAYOUT stuff diff --git a/src/code/early-raw-slots.lisp b/src/code/early-raw-slots.lisp index 1295e1ba23..25907c2293 100644 --- a/src/code/early-raw-slots.lisp +++ b/src/code/early-raw-slots.lisp @@ -74,7 +74,7 @@ (defun raw-slot-data-accessor-name (rsd) (%simple-fun-name (raw-slot-data-accessor-fun rsd)))) -#-sb-fluid (declaim (freeze-type raw-slot-data)) +(declaim (freeze-type raw-slot-data)) ;; Simulate DEFINE-LOAD-TIME-GLOBAL - always bound in the image ;; but not eval'd in the compiler. diff --git a/src/code/float-inf-nan.lisp b/src/code/float-inf-nan.lisp index 1fca7137c9..169b2085b7 100644 --- a/src/code/float-inf-nan.lisp +++ b/src/code/float-inf-nan.lisp @@ -15,7 +15,6 @@ (in-package "SB-KERNEL") -#-sb-fluid (declaim (maybe-inline float-denormalized-p float-infinity-p float-nan-p float-trapping-nan-p)) diff --git a/src/code/float.lisp b/src/code/float.lisp index 454ffd5fcd..e7f6d45e05 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -20,7 +20,7 @@ ;;; If denormalized, use a subfunction from INTEGER-DECODE-FLOAT to find the ;;; actual exponent (and hence how denormalized it is), otherwise we just ;;; return the number of digits or 0. -#-sb-fluid (declaim (maybe-inline float-precision)) +(declaim (maybe-inline float-precision)) (defun float-precision (f) "Return a non-negative number of significant digits in its float argument. Will be less than FLOAT-DIGITS if denormalized or zero." @@ -85,7 +85,7 @@ #+long-float (long-float sb-vm:long-float-digits))) -#-sb-fluid (declaim (inline float-digits float-radix)) +(declaim (inline float-digits float-radix)) (defun float-digits (f) (declare (explicit-check)) @@ -105,7 +105,6 @@ (defconstant-eqx float-decoding-error "Can't decode NaN or infinity: ~S." #'string=) -#-sb-fluid (declaim (maybe-inline integer-decode-single-float integer-decode-double-float)) @@ -291,7 +290,7 @@ ((long-float) (integer-decode-long-float x)))) -#-sb-fluid (declaim (maybe-inline decode-single-float decode-double-float)) +(declaim (maybe-inline decode-single-float decode-double-float)) ;;; Handle the denormalized case of DECODE-SINGLE-FLOAT. We call ;;; INTEGER-DECODE-SINGLE-DENORM and then make the result into a float. @@ -413,7 +412,7 @@ ;;;; SCALE-FLOAT -#-sb-fluid (declaim (maybe-inline scale-single-float scale-double-float)) +(declaim (maybe-inline scale-single-float scale-double-float)) ;;; Handle float scaling where the X is denormalized or the result is ;;; denormalized or underflows to 0. diff --git a/src/code/gc.lisp b/src/code/gc.lisp index b834367eeb..e40f4f3699 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -15,7 +15,6 @@ #+gencgc (define-alien-variable ("DYNAMIC_SPACE_START" sb-vm:dynamic-space-start) os-vm-size-t) -#-sb-fluid (declaim (inline current-dynamic-space-start)) (defun current-dynamic-space-start () #+gencgc sb-vm:dynamic-space-start @@ -27,7 +26,6 @@ (defun dynamic-space-free-pointer () (extern-alien "dynamic_space_free_pointer" system-area-pointer))) -#-sb-fluid (declaim (inline dynamic-usage)) #+gencgc (defun dynamic-usage () diff --git a/src/code/late-type.lisp b/src/code/late-type.lisp index dffd22e7c8..15dfe8aa2e 100644 --- a/src/code/late-type.lisp +++ b/src/code/late-type.lisp @@ -603,7 +603,7 @@ ;;; Return the type of the first value indicated by TYPE. This is used ;;; by people who don't want to have to deal with VALUES types. -#-sb-fluid (declaim (freeze-type values-type)) +(declaim (freeze-type values-type)) ; (inline single-value-type)) (defun single-value-type (type) (declare (type ctype type)) diff --git a/src/code/load.lisp b/src/code/load.lisp index 14230e478f..5908e53d23 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -43,7 +43,7 @@ ;;;; utilities for reading from fasl files -#-sb-fluid (declaim (inline read-byte)) +(declaim (inline read-byte)) ;;; This expands into code to read an N-byte unsigned integer using ;;; FAST-READ-BYTE. diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index 24331f7095..e15664f2c2 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -16,7 +16,7 @@ ;;; If IMAGPART is 0, return REALPART, otherwise make a complex. This is ;;; used when we know that REALPART and IMAGPART are the same type, but ;;; rational canonicalization might still need to be done. -#-sb-fluid (declaim (inline canonical-complex)) +(declaim (inline canonical-complex)) (defun canonical-complex (realpart imagpart) (if (eql imagpart 0) realpart @@ -36,7 +36,7 @@ ;;; Given a numerator and denominator with the GCD already divided ;;; out, make a canonical rational. We make the denominator positive, ;;; and check whether it is 1. -#-sb-fluid (declaim (inline build-ratio)) +(declaim (inline build-ratio)) (defun build-ratio (num den) (multiple-value-bind (num den) (if (minusp den) @@ -51,7 +51,7 @@ (t (%make-ratio num den))))) ;;; Truncate X and Y, but bum the case where Y is 1. -#-sb-fluid (declaim (inline maybe-truncate)) +(declaim (inline maybe-truncate)) (defun maybe-truncate (x y) (if (eql y 1) x @@ -418,7 +418,7 @@ ;;; ROUND and FROUND are not declared inline since they seem too ;;; obscure and too big to inline-expand by default. Also, this gives ;;; the compiler a chance to pick off the unary float case. -#-sb-fluid (declaim (inline fceiling ffloor ftruncate)) +(declaim (inline fceiling ffloor ftruncate)) (defun ftruncate (number &optional (divisor 1)) "Same as TRUNCATE, but returns first value as a float." (declare (explicit-check)) diff --git a/src/code/pprint.lisp b/src/code/pprint.lisp index 885062c97f..18b09d9e56 100644 --- a/src/code/pprint.lisp +++ b/src/code/pprint.lisp @@ -31,7 +31,7 @@ (declaim (freeze-type newline) (end-block)) -#-sb-fluid (declaim (inline index-posn posn-index posn-column)) +(declaim (inline index-posn posn-index posn-column)) (defun index-posn (index stream) (declare (type index index) (type pretty-stream stream) (values posn)) diff --git a/src/code/pred.lisp b/src/code/pred.lisp index 9233ea4e09..fef56d9120 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -13,7 +13,7 @@ ;;;; miscellaneous non-primitive predicates -#-sb-fluid (declaim (inline streamp)) +(declaim (inline streamp)) (defun streamp (stream) (typep stream 'stream)) diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 314af77e98..4afa029d39 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -173,12 +173,10 @@ ;;; predicates for testing character attributes -#-sb-fluid -(progn - (declaim (inline whitespace[1]p whitespace[2]p)) - (declaim (inline constituentp terminating-macrop)) - (declaim (inline single-escape-p multiple-escape-p)) - (declaim (inline token-delimiterp))) +(declaim (inline whitespace[1]p whitespace[2]p)) +(declaim (inline constituentp terminating-macrop)) +(declaim (inline single-escape-p multiple-escape-p)) +(declaim (inline token-delimiterp)) ;;; the [1] and [2] here refer to ANSI glossary entries for ;;; "whitespace". diff --git a/src/code/restart.lisp b/src/code/restart.lisp index 1fed81ab08..c6298e910b 100644 --- a/src/code/restart.lisp +++ b/src/code/restart.lisp @@ -31,7 +31,7 @@ ;; extent. (associated-conditions '() :type list)) -#-sb-fluid (declaim (freeze-type restart)) +(declaim (freeze-type restart)) (defmacro with-condition-restarts (condition-form restarts-form &body body) diff --git a/src/code/setf-funs.lisp b/src/code/setf-funs.lisp index 35ece7f5ac..206e7340bb 100644 --- a/src/code/setf-funs.lisp +++ b/src/code/setf-funs.lisp @@ -57,7 +57,7 @@ (let ((type (type-specifier (global-ftype sym)))) (aver (consp type)) (list - #-sb-fluid `(declaim (inline (setf ,sym))) + `(declaim (inline (setf ,sym))) (compute-one-setter sym type)))) (sort (res) #'string<))))) diff --git a/src/code/stream.lisp b/src/code/stream.lisp index a872761770..d8b0bd04c7 100644 --- a/src/code/stream.lisp +++ b/src/code/stream.lisp @@ -206,7 +206,7 @@ (ef-char-size (get-external-format external-format))) ;;; Call the MISC method with the :FILE-POSITION operation. -#-sb-fluid (declaim (inline ansi-stream-file-position)) +(declaim (inline ansi-stream-file-position)) (defun ansi-stream-file-position (stream position) (declare (type stream stream)) (declare (type (or index (alien sb-unix:unix-offset) (member nil :start :end)) @@ -334,7 +334,7 @@ (progn (done-with-fast-read-char) (eof-or-lose stream eof-error-p (values eof-value t)))))))) -#-sb-fluid (declaim (inline ansi-stream-read-line)) +(declaim (inline ansi-stream-read-line)) (defun ansi-stream-read-line (stream eof-error-p eof-value recursive-p) (declare (ignore recursive-p)) (if (ansi-stream-cin-buffer stream) @@ -385,9 +385,9 @@ ;;; We proclaim them INLINE here, then proclaim them NOTINLINE later on, ;;; so, except in this file, they are not inline by default, but they can be. -#-sb-fluid (declaim (inline read-char unread-char read-byte listen)) +(declaim (inline read-char unread-char read-byte listen)) -#-sb-fluid (declaim (inline ansi-stream-read-char)) +(declaim (inline ansi-stream-read-char)) (defun ansi-stream-read-char (stream eof-error-p eof-value recursive-p) (declare (ignore recursive-p)) (prepare-for-fast-read-char stream @@ -409,7 +409,7 @@ (eof-or-lose stream eof-error-p eof-value) (the character char)))))) -#-sb-fluid (declaim (inline ansi-stream-unread-char)) +(declaim (inline ansi-stream-unread-char)) (defun ansi-stream-unread-char (character stream) (let ((index (1- (ansi-stream-in-index stream))) (buffer (ansi-stream-cin-buffer stream))) @@ -435,7 +435,7 @@ (stream-unread-char stream character))) nil) -#-sb-fluid (declaim (inline ansi-stream-listen)) +(declaim (inline ansi-stream-listen)) (defun ansi-stream-listen (stream) (or (/= (the fixnum (ansi-stream-in-index stream)) +ansi-stream-in-buffer-length+) @@ -453,7 +453,7 @@ ;; Fall through to Gray streams FUNDAMENTAL-STREAM case. (stream-listen stream)))) -#-sb-fluid (declaim (inline ansi-stream-read-char-no-hang)) +(declaim (inline ansi-stream-read-char-no-hang)) (defun ansi-stream-read-char-no-hang (stream eof-error-p eof-value recursive-p) (if (funcall (ansi-stream-misc stream) stream :listen) ;; On T or :EOF get READ-CHAR to do the work. @@ -475,7 +475,7 @@ (eof-or-lose stream eof-error-p eof-value) (the (or character null) char)))))) -#-sb-fluid (declaim (inline ansi-stream-clear-input)) +(declaim (inline ansi-stream-clear-input)) (defun ansi-stream-clear-input (stream) (setf (ansi-stream-in-index stream) +ansi-stream-in-buffer-length+) (funcall (ansi-stream-misc stream) stream :clear-input)) @@ -489,7 +489,7 @@ (stream-clear-input stream))) nil) -#-sb-fluid (declaim (inline ansi-stream-read-byte)) +(declaim (inline ansi-stream-read-byte)) (defun ansi-stream-read-byte (stream eof-error-p eof-value recursive-p) ;; Why the "recursive-p" parameter? a-s-r-b is funcall'ed from ;; a-s-read-sequence and needs a lambda list that's congruent with @@ -518,7 +518,7 @@ ;;; some cases, but it wasn't being used in SBCL, so it was dropped. ;;; If we ever need it, it could be added later as a new variant N-BIN ;;; method (perhaps N-BIN-ASAP?) or something. -#-sb-fluid (declaim (inline read-n-bytes)) +(declaim (inline read-n-bytes)) (defun read-n-bytes (stream buffer start numbytes &optional (eof-error-p t)) (if (ansi-stream-p stream) (ansi-stream-read-n-bytes stream buffer start numbytes eof-error-p) @@ -681,7 +681,7 @@ (with-out-stream stream (ansi-stream-out #\newline) (stream-terpri)) nil) -#-sb-fluid (declaim (inline ansi-stream-fresh-line)) +(declaim (inline ansi-stream-fresh-line)) (defun ansi-stream-fresh-line (stream) (unless (eql (charpos stream) 0) (funcall (ansi-stream-out stream) stream #\newline) @@ -695,7 +695,7 @@ ;; must be Gray streams FUNDAMENTAL-STREAM (stream-fresh-line stream)))) -#-sb-fluid (declaim (inline ansi-stream-write-string)) +(declaim (inline ansi-stream-write-string)) (defun ansi-stream-write-string (string stream start end) (with-array-data ((data string) (offset-start start) (offset-end end) diff --git a/src/code/target-alieneval.lisp b/src/code/target-alieneval.lisp index 172d8fcbd4..2dd50ecf9d 100644 --- a/src/code/target-alieneval.lisp +++ b/src/code/target-alieneval.lisp @@ -198,7 +198,7 @@ This is SETFable." :sap (sap-int (alien-value-sap value)) :type (unparse-alien-type (alien-value-type value))))) -#-sb-fluid (declaim (inline null-alien)) +(declaim (inline null-alien)) (defun null-alien (x) "Return true if X (which must be an ALIEN pointer) is null, false otherwise." (zerop (sap-int (alien-sap x)))) @@ -296,7 +296,7 @@ Examples: ;;; Allocate a block of memory at least BYTES bytes long and return a ;;; system area pointer to it. -#-sb-fluid (declaim (inline %make-alien)) +(declaim (inline %make-alien)) (defun %make-alien (bytes) (declare (type index bytes) (optimize (sb-c:alien-funcall-saves-fp-and-pc 0))) @@ -320,7 +320,7 @@ Examples: (let ((*saved-fp* (sb-c::current-fp-fixnum))) (funcall fn))) -#-sb-fluid (declaim (inline free-alien)) +(declaim (inline free-alien)) (defun free-alien (alien) "Dispose of the storage pointed to by ALIEN. The ALIEN must have been allocated by MAKE-ALIEN, MAKE-ALIEN-STRING or malloc(3)." diff --git a/src/code/target-char.lisp b/src/code/target-char.lisp index 7908c972a9..4a21979956 100644 --- a/src/code/target-char.lisp +++ b/src/code/target-char.lisp @@ -12,7 +12,6 @@ (in-package "SB-IMPL") ;;; We compile some trivial character operations via inline expansion. -#-sb-fluid (declaim (inline standard-char-p graphic-char-p alpha-char-p alphanumericp)) (declaim (maybe-inline upper-case-p lower-case-p both-case-p diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 8fb8240a96..fe148cf071 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -52,7 +52,7 @@ (and (hash-table-weak-p ht) (decode-hash-table-weakness (ht-flags-weakness (hash-table-flags ht))))) -#-sb-fluid (declaim (inline eq-hash)) +(declaim (inline eq-hash)) (defun eq-hash (key) (declare (values fixnum (member t nil))) ;; I think it would be ok to pick off SYMBOL here and use its hash slot @@ -105,7 +105,7 @@ ;; Consider picking off %INSTANCEP too before using EQ-HASH ? (eq-hash key))))) -#-sb-fluid (declaim (inline equal-hash)) +(declaim (inline equal-hash)) (defun equal-hash (key) (declare (values fixnum (member t nil))) (typecase key diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index 6938cb0d79..a04f254f2e 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -59,7 +59,7 @@ ;;; Physical pathnames include all these slots and a device slot. ;;; We can't freeze HOST because later on we define either UNIX-HOST or WIN32-HOST. -#-sb-fluid (declaim (freeze-type logical-host)) +(declaim (freeze-type logical-host)) ;;; Utility functions diff --git a/src/code/target-random.lisp b/src/code/target-random.lisp index cb33a2b5fd..406e70d878 100644 --- a/src/code/target-random.lisp +++ b/src/code/target-random.lisp @@ -279,7 +279,7 @@ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html (declaim (start-block random %random-single-float %random-double-float random-chunk big-random-chunk)) -#-sb-fluid (declaim (inline random-chunk)) +(declaim (inline random-chunk)) #-x86 (defun random-chunk (state) (declare (type random-state state)) @@ -308,7 +308,7 @@ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html (declare (type random-state state)) (sb-vm::random-mt19937 (random-state-state state))) -#-sb-fluid (declaim (inline big-random-chunk)) +(declaim (inline big-random-chunk)) (defun big-random-chunk (state) (declare (type random-state state)) (logior (ash (random-chunk state) 32) @@ -318,7 +318,7 @@ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ;;; float between 0.0 and 1.0 by clobbering the significand of 1.0 ;;; with random bits, then subtracting 1.0. This hides the fact that ;;; we have a hidden bit. -#-sb-fluid (declaim (inline %random-single-float %random-double-float)) +(declaim (inline %random-single-float %random-double-float)) (declaim (ftype (function ((single-float ($0f0)) random-state) (single-float $0f0)) %random-single-float)) @@ -390,7 +390,7 @@ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ;;; as the speed gains due to needing fewer loop iterations are by far ;;; outweighted by the cost of the two divisions required (one to find ;;; the multiplier and one to bring the result into the correct range). -#-sb-fluid (declaim (inline %random-fixnum)) +(declaim (inline %random-fixnum)) (defun %random-fixnum (arg state) (declare (type (integer 1 #.most-positive-fixnum) arg) (type random-state state)) diff --git a/src/code/target-signal.lisp b/src/code/target-signal.lisp index 83e71756e5..5ba07d10f2 100644 --- a/src/code/target-signal.lisp +++ b/src/code/target-signal.lisp @@ -15,14 +15,14 @@ ;;; Send the signal SIGNAL to the process with process id PID. SIGNAL ;;; should be a valid signal number -#-sb-fluid (declaim (inline unix-kill)) +(declaim (inline unix-kill)) (define-alien-routine ("kill" unix-kill) int (pid int) (signal int)) ;;; Send the signal SIGNAL to the all the process in process group ;;; PGRP. SIGNAL should be a valid signal number -#-sb-fluid (declaim (inline unix-killpg)) +(declaim (inline unix-killpg)) (define-alien-routine ("killpg" unix-killpg) int (pgrp int) (signal int)) diff --git a/src/code/target-stream.lisp b/src/code/target-stream.lisp index ded4ced1d2..c6def6bc7f 100644 --- a/src/code/target-stream.lisp +++ b/src/code/target-stream.lisp @@ -68,7 +68,7 @@ ;;; unread-char, read-byte, listen here that was removed because these ;;; functions are redefined when simple-streams are loaded. -#-sb-fluid (declaim (inline ansi-stream-peek-char)) +(declaim (inline ansi-stream-peek-char)) (defun ansi-stream-peek-char (peek-type stream eof-error-p eof-value recursive-p) (cond ((typep stream 'echo-stream) diff --git a/src/code/type-class.lisp b/src/code/type-class.lisp index fad80a7b04..7227e90077 100644 --- a/src/code/type-class.lisp +++ b/src/code/type-class.lisp @@ -209,7 +209,7 @@ (coerce :type (or symbol null)) |# ) -#-sb-fluid (declaim (freeze-type type-class)) +(declaim (freeze-type type-class)) (defun type-class-or-lose (name) (or (find name *type-classes* :key #'type-class-name) @@ -552,13 +552,13 @@ ;;; FIXME: This was a macro in CMU CL, and is now an INLINE function. Is ;;; it important for it to be INLINE, or could be become an ordinary ;;; function without significant loss? -- WHN 19990413 -#-sb-fluid (declaim (inline type-cache-hash)) +(declaim (inline type-cache-hash)) (declaim (ftype (function (ctype ctype) (signed-byte #.sb-vm:n-fixnum-bits)) type-cache-hash)) (defun type-cache-hash (type1 type2) (logxor (ash (type-hash-value type1) -3) (type-hash-value type2))) -#-sb-fluid (declaim (inline type-list-cache-hash)) +(declaim (inline type-list-cache-hash)) (declaim (ftype (function (list) (signed-byte #.sb-vm:n-fixnum-bits)) type-list-cache-hash)) (defun type-list-cache-hash (types) diff --git a/src/code/uncross.lisp b/src/code/uncross.lisp index 1c067b3c0b..2138235fb1 100644 --- a/src/code/uncross.lisp +++ b/src/code/uncross.lisp @@ -19,7 +19,7 @@ ;;; In the target system's compiler, uncrossing is just identity. #-sb-xc-host (progn - #-sb-fluid (declaim (inline uncross)) + (declaim (inline uncross)) (defun uncross (x) x)) ;;; In the cross-compiler, uncrossing is slightly less trivial. diff --git a/src/code/weak.lisp b/src/code/weak.lisp index a30f8d51e6..be1370fb5f 100644 --- a/src/code/weak.lisp +++ b/src/code/weak.lisp @@ -15,7 +15,7 @@ "Allocate and return a weak pointer which points to OBJECT." (make-weak-pointer object)) -#-sb-fluid (declaim (inline weak-pointer-value)) +(declaim (inline weak-pointer-value)) (defun weak-pointer-value (weak-pointer) "If WEAK-POINTER is valid, return the value of WEAK-POINTER and T. If the referent of WEAK-POINTER has been garbage collected, diff --git a/src/code/win32.lisp b/src/code/win32.lisp index 085122044b..1405b9c877 100644 --- a/src/code/win32.lisp +++ b/src/code/win32.lisp @@ -429,7 +429,6 @@ (defconstant +filetime-unit+ 10000000) (defconstant +common-lisp-epoch-filetime-seconds+ 9435484800) -#-sb-fluid (declaim (inline get-time-of-day)) (defun get-time-of-day () "Return the number of seconds and microseconds since the beginning of the diff --git a/src/code/xset.lisp b/src/code/xset.lisp index 99de7b4928..80c851e455 100644 --- a/src/code/xset.lisp +++ b/src/code/xset.lisp @@ -135,6 +135,6 @@ xset1)) t)) -#-sb-fluid (declaim (inline xset-empty-p)) +(declaim (inline xset-empty-p)) (defun xset-empty-p (xset) (not (xset-data xset))) diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 0c2e1d54d5..1aeed0d2c2 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -291,6 +291,10 @@ "UPGRADED-ARRAY-ELEMENT-TYPE" "UPGRADED-COMPLEX-PART-TYPE" "WITH-COMPILATION-UNIT" + + ;; For debugging purposes, we want to be able to intercept inline + ;; and block compilation declamations in the host. + "DECLAIM" )) ;;; A symbol in the "dual personality" list refers to the symbol in CL unless @@ -354,6 +358,10 @@ "PROCLAIM" "SIMPLE-VECTOR" "TYPE-OF" "TYPEP" + + "DEFCLASS" + "DEFGENERIC" + "DEFMETHOD" )) (export (intern name package-name) package-name))) diff --git a/src/compiler/bit-util.lisp b/src/compiler/bit-util.lisp index 9a25b30fbd..7424eb918b 100644 --- a/src/compiler/bit-util.lisp +++ b/src/compiler/bit-util.lisp @@ -12,7 +12,6 @@ (in-package "SB-C") -#-sb-fluid (declaim (inline clear-bit-vector set-bit-vector bit-vector-replace bit-vector-copy)) diff --git a/src/compiler/constraint.lisp b/src/compiler/constraint.lisp index 0e598a3c62..aaee8ae0fe 100644 --- a/src/compiler/constraint.lisp +++ b/src/compiler/constraint.lisp @@ -547,7 +547,7 @@ ;;; If REF is to a LAMBDA-VAR with CONSTRAINTs (i.e. we can do flow ;;; analysis on it), then return the LAMBDA-VAR, otherwise NIL. -#-sb-fluid (declaim (inline ok-ref-lambda-var)) +(declaim (inline ok-ref-lambda-var)) (defun ok-ref-lambda-var (ref) (declare (type ref ref)) (let ((leaf (ref-leaf ref))) diff --git a/src/compiler/debug-dump.lisp b/src/compiler/debug-dump.lisp index 86ca93392d..5d60def448 100644 --- a/src/compiler/debug-dump.lisp +++ b/src/compiler/debug-dump.lisp @@ -77,7 +77,7 @@ (- posn (segment-header-skew segment)))))) (values)) -#-sb-fluid (declaim (inline ir2-block-physenv)) +(declaim (inline ir2-block-physenv)) (defun ir2-block-physenv (2block) (declare (type ir2-block 2block)) (block-physenv (ir2-block-block 2block))) diff --git a/src/compiler/disassem.lisp b/src/compiler/disassem.lisp index 638621259b..b7cd6f351d 100644 --- a/src/compiler/disassem.lisp +++ b/src/compiler/disassem.lisp @@ -67,7 +67,6 @@ ;;;; KLUDGE: It's not clear that using bit-vectors would be any more efficient. ;;;; Perhaps the abstraction could go away. -- WHN 19991124 -#-sb-fluid (declaim (inline dchunk-or dchunk-and dchunk-clear dchunk-not dchunk-make-mask dchunk-make-field dchunk-extract @@ -559,7 +558,7 @@ `((lookup-label ,(maybe-listify numeric-forms))) numeric-forms))))) -#-sb-fluid (declaim (inline bytes-to-bits)) +(declaim (inline bytes-to-bits)) (defun bytes-to-bits (bytes) (declare (type disassem-length bytes)) diff --git a/src/compiler/early-constantp.lisp b/src/compiler/early-constantp.lisp index 1444a4d532..aed9999f04 100644 --- a/src/compiler/early-constantp.lisp +++ b/src/compiler/early-constantp.lisp @@ -15,7 +15,7 @@ (defstruct (abstract-lexenv (:constructor nil) (:copier nil) (:predicate nil))) -#-sb-fluid (declaim (inline constantp)) +(declaim (inline constantp)) (defun constantp (form &optional (environment nil envp)) "True of any FORM that has a constant value: self-evaluating objects, keywords, defined constants, quote forms. Additionally the @@ -23,7 +23,7 @@ constant-foldability of some function calls and special forms is recognized. If ENVIRONMENT is provided, the FORM is first macroexpanded in it." (%constantp form environment envp)) -#-sb-fluid (declaim (inline constant-form-value)) +(declaim (inline constant-form-value)) (defun constant-form-value (form &optional (environment nil envp)) "Returns the value of the constant FORM in ENVIRONMENT. Behaviour is undefined unless CONSTANTP has been first used to determine the diff --git a/src/compiler/early-globaldb.lisp b/src/compiler/early-globaldb.lisp index 13450a1f32..09e5c4b957 100644 --- a/src/compiler/early-globaldb.lisp +++ b/src/compiler/early-globaldb.lisp @@ -349,6 +349,6 @@ `(the attributes (logand ,@(mapcar (lambda (x) `(the attributes ,x)) attributes)))) (declaim (ftype (function (attributes attributes) boolean) attributes=)) -#-sb-fluid (declaim (inline attributes=)) +(declaim (inline attributes=)) (defun attributes= (attr1 attr2) (eql attr1 attr2)) diff --git a/src/compiler/early-lexenv.lisp b/src/compiler/early-lexenv.lisp index 14cfdee61c..13c030dd74 100644 --- a/src/compiler/early-lexenv.lisp +++ b/src/compiler/early-lexenv.lisp @@ -69,7 +69,7 @@ ;;; The LEXENV represents the lexical environment used for IR1 conversion. ;;; (This is also what shows up as an ENVIRONMENT value in macroexpansion.) -#-sb-fluid (declaim (inline internal-make-lexenv)) ; only called in one place +(declaim (inline internal-make-lexenv)) ; only called in one place (defstruct (lexenv (:include abstract-lexenv) (:print-function diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 0d2ca5cd60..b625d719b9 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -225,7 +225,7 @@ ;;; Given a number X, create a form suitable as a bound for an ;;; interval. Make the bound open if OPEN-P is T. NIL remains NIL. ;;; FIXME: as this is a constructor, shouldn't it be named MAKE-BOUND? -#-sb-fluid (declaim (inline set-bound)) +(declaim (inline set-bound)) (defun set-bound (x open-p) (if (and x open-p) (list x) x)) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index ee13cefe30..be1ce16a2a 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -389,7 +389,7 @@ ;;; determine what is evaluated next. If the ctran has no block, then ;;; we make it be in the block that the node is in. If the ctran heads ;;; its block, we end our block and link it to that block. -#-sb-fluid (declaim (inline use-ctran)) +(declaim (inline use-ctran)) (defun use-ctran (node ctran) (declare (type node node) (type ctran ctran)) (if (eq (ctran-kind ctran) :unused) @@ -451,7 +451,7 @@ (setf (lvar-uses lvar) (list node (lvar-uses lvar))))) (reoptimize-lvar lvar))) -#-sb-fluid(declaim (inline use-continuation)) +(declaim (inline use-continuation)) (defun use-continuation (node ctran lvar) (use-ctran node ctran) (use-lvar node lvar)) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index c5188c39b0..98e001ca59 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -622,7 +622,7 @@ (defun node-physenv (node) (lambda-physenv (node-home-lambda node))) -#-sb-fluid (declaim (inline node-stack-allocate-p)) +(declaim (inline node-stack-allocate-p)) (defun node-stack-allocate-p (node) (awhen (node-lvar node) (lvar-dynamic-extent it))) @@ -1112,7 +1112,7 @@ (defun cast-single-value-p (cast) (not (values-type-p (cast-asserted-type cast)))) -#-sb-fluid (declaim (inline lvar-single-value-p)) +(declaim (inline lvar-single-value-p)) (defun lvar-single-value-p (lvar) (or (not lvar) (%lvar-single-value-p lvar))) (defun %lvar-single-value-p (lvar) diff --git a/src/compiler/ltn.lisp b/src/compiler/ltn.lisp index a0d9bafb9c..1933c24cfe 100644 --- a/src/compiler/ltn.lisp +++ b/src/compiler/ltn.lisp @@ -95,7 +95,7 @@ (link-blocks node-block next-block))) ;;; an annotated lvar's primitive-type -#-sb-fluid (declaim (inline lvar-ptype)) +(declaim (inline lvar-ptype)) (defun lvar-ptype (lvar) (declare (type lvar lvar)) (ir2-lvar-primitive-type (lvar-info lvar))) diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index f85eea7e54..91dc283c95 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -747,7 +747,7 @@ ;;;; functions on directly-linked lists (linked through specialized ;;;; NEXT operations) -#-sb-fluid (declaim (inline find-in position-in)) +(declaim (inline find-in position-in)) ;;; Find ELEMENT in a null-terminated LIST linked by the accessor ;;; function NEXT. KEY and TEST are the same as for generic sequence functions. diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index d8a6b03196..a8ba50f6d0 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -148,16 +148,16 @@ (when (boundp '*compilation*) (format stream "~D" (cont-num x))))) -#-sb-fluid (declaim (inline lvar-has-single-use-p)) +(declaim (inline lvar-has-single-use-p)) (defun lvar-has-single-use-p (lvar) (typep (lvar-uses lvar) '(not list))) ;;; Return the unique node, delivering a value to LVAR. -#-sb-fluid (declaim (inline lvar-use)) +(declaim (inline lvar-use)) (defun lvar-use (lvar) (the (not list) (lvar-uses lvar))) -#-sb-fluid (declaim (inline lvar-derived-type)) +(declaim (inline lvar-derived-type)) (defun lvar-derived-type (lvar) (declare (type lvar lvar)) (or (lvar-%derived-type lvar) @@ -216,7 +216,7 @@ ;; can null out this slot. (tail-p nil :type boolean)) -#-sb-fluid (declaim (inline node-block)) +(declaim (inline node-block)) (defun node-block (node) (ctran-block (node-prev node))) @@ -239,7 +239,7 @@ ;; the value is unused. (lvar nil :type (or lvar null))) -#-sb-fluid (declaim (inline node-dest)) +(declaim (inline node-dest)) (defun node-dest (node) (awhen (node-lvar node) (lvar-dest it))) @@ -1637,6 +1637,5 @@ ;;;; Freeze some structure types to speed type testing. -#-sb-fluid (declaim (freeze-type node lexenv ctran lvar cblock component cleanup physenv tail-set nlx-info leaf)) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index 13c2aac0ab..88bd83e28d 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -1200,7 +1200,7 @@ ;;; the restriction, we pack a Load-TN and load the operand into it. ;;; If a load-tn has already been allocated, we can assume that the ;;; restriction is satisfied. -#-sb-fluid (declaim (inline check-operand-restrictions)) +(declaim (inline check-operand-restrictions)) (defun check-operand-restrictions (scs ops) (declare (list scs) (type (or tn-ref null) ops)) diff --git a/src/compiler/proclaim.lisp b/src/compiler/proclaim.lisp index 1614a6fbf4..db1d46470c 100644 --- a/src/compiler/proclaim.lisp +++ b/src/compiler/proclaim.lisp @@ -339,6 +339,7 @@ (ftype #'proclaim-ftype)) ctype type :declared))) (push raw-form *queued-proclaims*))) + #-sb-fluid (freeze-type (map-args #'process-freeze-type-declaration)) ((start-block end-block) @@ -371,7 +372,7 @@ ((disable-package-locks enable-package-locks) (setq *disabled-package-locks* (process-package-lock-decl form *disabled-package-locks*))) - ((inline notinline maybe-inline) + ((#-sb-fluid inline notinline #-sb-fluid maybe-inline) (map-args #'process-inline-declaration kind)) (deprecated (destructuring-bind (state since &rest things) args diff --git a/src/compiler/represent.lisp b/src/compiler/represent.lisp index 1ba4efe112..1ea6f1f105 100644 --- a/src/compiler/represent.lisp +++ b/src/compiler/represent.lisp @@ -737,7 +737,7 @@ ;;; If TN is in a number stack SC, make all the right annotations. ;;; Note that this should be called after TN has been referenced, ;;; since it must iterate over the referencing environments. -#-sb-fluid (declaim (inline note-if-number-stack)) +(declaim (inline note-if-number-stack)) (defun note-if-number-stack (tn 2comp restricted) (declare (type tn tn) (type ir2-component 2comp)) (when (if restricted diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index 7e930121b5..eb2773a824 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -106,7 +106,7 @@ ;;;; choosing an instruction -#-sb-fluid (declaim (inline inst-matches-p choose-inst-specialization)) +(declaim (inline inst-matches-p choose-inst-specialization)) ;;; Return non-NIL if all constant-bits in INST match CHUNK. (defun inst-matches-p (inst chunk) @@ -288,7 +288,7 @@ ;;; LRA layout (dual word aligned): ;;; header-word -#-sb-fluid (declaim (inline words-to-bytes)) +(declaim (inline words-to-bytes)) (eval-when (:compile-toplevel :load-toplevel :execute) ;;; Convert a word-offset NUM to a byte-offset. diff --git a/src/compiler/vmdef.lisp b/src/compiler/vmdef.lisp index 27979596a3..ed00fd455c 100644 --- a/src/compiler/vmdef.lisp +++ b/src/compiler/vmdef.lisp @@ -196,7 +196,7 @@ ;;; Return a function type specifier describing TEMPLATE's type computed ;;; from the operand type restrictions. -#-sb-fluid (declaim (inline template-conditional-p)) +(declaim (inline template-conditional-p)) (defun template-conditional-p (template) (declare (type template template)) (let ((rtypes (template-result-types template))) diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index c68f74967f..0360a72e4a 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -1335,7 +1335,7 @@ bootstrapping. (defstruct (constant-method-call (:copier nil) (:include method-call)) value) -#-sb-fluid (declaim (sb-ext:freeze-type method-call)) +(declaim (sb-ext:freeze-type method-call)) (defmacro invoke-method-call1 (function args cm-args) `(let ((.function. ,function) @@ -1361,7 +1361,7 @@ bootstrapping. (:copier nil) (:include fast-method-call)) value) -#-sb-fluid (declaim (sb-ext:freeze-type fast-method-call)) +(declaim (sb-ext:freeze-type fast-method-call)) ;; The two variants of INVOKE-FAST-METHOD-CALL differ in how REST-ARGs ;; are handled. The first one will get REST-ARG as a single list (as @@ -1403,7 +1403,7 @@ bootstrapping. (defstruct (fast-instance-boundp (:copier nil)) (index 0 :type fixnum)) -#-sb-fluid (declaim (sb-ext:freeze-type fast-instance-boundp)) +(declaim (sb-ext:freeze-type fast-instance-boundp)) (eval-when (:compile-toplevel :load-toplevel :execute) (defvar *allow-emf-call-tracing-p* nil) @@ -2075,7 +2075,7 @@ bootstrapping. (gf-info-c-a-m-emf-std-p t) gf-info-fast-mf-p) -#-sb-fluid (declaim (sb-ext:freeze-type arg-info)) +(declaim (sb-ext:freeze-type arg-info)) (defun arg-info-valid-p (arg-info) (not (null (arg-info-number-optional arg-info)))) diff --git a/src/pcl/defs.lisp b/src/pcl/defs.lisp index 2f0e495a28..21b1d89bc0 100644 --- a/src/pcl/defs.lisp +++ b/src/pcl/defs.lisp @@ -38,7 +38,7 @@ has already been partially loaded. This may not work, you may~%~ need to get a fresh lisp (reboot) and then load PCL.")) -#-sb-fluid (declaim (inline gdefinition)) +(declaim (inline gdefinition)) (defun gdefinition (spec) ;; This is null layer right now, but once FDEFINITION stops bypasssing ;; fwrappers/encapsulations we can do that here. diff --git a/src/pcl/dfun.lisp b/src/pcl/dfun.lisp index e32ca516d1..2a6bfc2b7c 100644 --- a/src/pcl/dfun.lisp +++ b/src/pcl/dfun.lisp @@ -373,7 +373,7 @@ Except see also BREAK-VICIOUS-METACIRCLE. -- CSR, 2003-05-28 (lambda (new arg) (accessor-miss gf new arg dfun-info))))) -#-sb-fluid (declaim (sb-ext:freeze-type dfun-info)) +(declaim (sb-ext:freeze-type dfun-info)) (defun make-one-class-accessor-dfun (gf type wrapper index) (let ((emit (ecase type From ef62b58f31f3793b1f10f1db68c7bcbe553b32ab Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Fri, 31 Jul 2020 17:43:50 -0700 Subject: [PATCH 0426/4023] Remove some more explicit sb-xc: --- src/code/load.lisp | 2 +- src/compiler/dump.lisp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 5908e53d23..7b1b5c2253 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -349,7 +349,7 @@ (sbcl-version (if (<= fasl-version 76) "1.0.11.18" (string-from-stream))) - (expected-version (sb-xc:lisp-implementation-version))) + (expected-version (lisp-implementation-version))) (push fasl-version results) (unless (string= expected-version sbcl-version) (restart-case diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 172c675964..81451c1df5 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -289,7 +289,7 @@ (dump-byte (char-code (aref string i)) res)))) (dump-counted-string (symbol-name +backend-fasl-file-implementation+)) (dump-word +fasl-file-version+ res) - (dump-counted-string (sb-xc:lisp-implementation-version)) + (dump-counted-string (lisp-implementation-version)) (dump-counted-string (compute-features-affecting-fasl-format))) res))) From 7492ec61bd7db6da9f9cbb56cebf7f80a198c883 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Fri, 14 Aug 2020 12:26:49 -0700 Subject: [PATCH 0427/4023] sb-xc:symbol-package: Lift restriction on XC-STRICT-CL Allows symbols in XC-STRICT-CL to be backed by packages other than CL when cold-interning "host" CL symbols during genesis. Fixes build on clisp. --- src/code/cross-misc.lisp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index b84cb64432..b5332bd428 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -198,10 +198,16 @@ ;;; host CL package. This works around situations where the host has *more* ;;; symbols exported from CL than should be. (defun sb-xc:symbol-package (symbol) - (let ((p (cl:symbol-package symbol))) + (let ((p (cl:symbol-package symbol)) + (name (string symbol))) (if (and p - (or (eq (find-symbol (string symbol) "XC-STRICT-CL") symbol) - (eq (find-symbol (string symbol) "SB-XC") symbol))) + (or (eq (find-symbol name "XC-STRICT-CL") symbol) + (eq (find-symbol name "SB-XC") symbol) + ;; OK if the name of a symbol in the host CL package + ;; is found in XC-STRICT-CL, even if the symbols + ;; differ. + (and (find-symbol name "XC-STRICT-CL") + (eq (find-symbol name "CL") symbol)))) *cl-package* p))) From 1e7d2bc413d07d23fc88bb5ecfcfe8a60a642d30 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 18 Aug 2020 20:31:48 -0400 Subject: [PATCH 0428/4023] Fix race with GC in new_thread_trampoline thread->control_stack_end must be strictly above any value that SP could have for the few instructions surrounding funcall1(). In the x86-64 call convention, 'arg' is not necessarily above all the local vars, because it is passed in a register and stored wherever the compiler wants. Adding 1 word ensures that the value is high enough to prevent the "no SP known for thread" error. I considered using __builtin_frame_address, but the more I thought about it, the more I concluded that the current approach is valid. --- src/runtime/thread.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 4143651bfd..11550da0aa 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -496,12 +496,14 @@ void* new_thread_trampoline(void* arg) // It seems to subvert the "&" and "*" operators in a way that only it understands, // while the stack pointer register is unperturbed. // (gencgc takes '&raise' for the current thread, but it disables the sanitizers) - // Additionally, if we've switched stacks (because OS_THREAD_STACK is defined) - // then '&arg' seems not to be ok either. I'm not sure why, because the change - // of stack was already done. FIXME: find out what's going on there. + // + // A stop-for-GC signal that hits after init_new_thread() releases the all_threads lock + // and returns control here needs to see in the interrupt context a stack pointer + // strictly below the computed th->control_stack_end. So make sure the value we pick + // is strictly above any value of SP that the interrupt context could have. #if defined LISP_FEATURE_C_STACK_IS_CONTROL_STACK && !defined ADDRESS_SANITIZER \ - && !defined LISP_FEATURE_OS_THREAD_STACK && !defined LISP_FEATURE_SB_SAFEPOINT - th->control_stack_end = (lispobj*)&arg; + && !defined LISP_FEATURE_SB_SAFEPOINT + th->control_stack_end = (lispobj*)&arg + 1; #endif th->os_kernel_tid = sb_GetTID(); init_new_thread(th, SCRIBBLE, 0, 0); From e9b006d87844b71ccaefcd7967d6fe970c9cd1ab Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 18 Aug 2020 20:44:38 -0400 Subject: [PATCH 0429/4023] Fix test manifest --- tests/input-manifest.lisp-expr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 86dda2b09e..cad3d609da 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -1,7 +1,7 @@ (("aprof.impure.lisp" "src/code/aprof.lisp" "src/code/shaketree.lisp") - ("avltree.pure.lisp" "bbtree-test-util.lisp") + ("avltree.pure.lisp" "tests/bbtree-test-util.lisp") ("bit-vector.impure.lisp" "contrib/sb-posix.fasl") ("case.pure.lisp" "tests/case-test.lisp") ("chill.test.sh" @@ -54,7 +54,7 @@ ("octets.pure.lisp" "tests/data/compile-file-pos.lisp" "tests/data/compile-file-pos-utf16be.lisp") - ("redblack.pure.lisp" "bbtree-test-util.lisp") + ("redblack.pure.lisp" "tests/bbtree-test-util.lisp") ("run-program.impure.lisp" "contrib/sb-posix.fasl") ("signals.impure.lisp" "contrib/sb-posix.fasl") ("stream.impure.lisp" "contrib/sb-posix.fasl") From e7188eb9a2197dea14e875bb53618ee5d383c535 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 20 Aug 2020 11:57:55 -0400 Subject: [PATCH 0430/4023] Re-allow concurrent JOIN-THREAD of 1 target thread Discussion w/xof concluded that while this might not be particurly good to allow in the API, it's easy enough to, and the consequence of disallowing it is bad: we don't know whether users do this, and we can't present a reasonable error at runtime (:concurrent-join-thead?) since the manifestation was to hang. So even if it was purely an accident of implementation that it worked, it is better to preserve that; however, the docstring suggests not doing something which your C library can't, and gives us leeway for altering the behavior. Add another missing (unrelated) test manifest entry as well. --- src/code/target-thread.lisp | 50 ++++++++++++++++++++++++++-------- src/code/thread-structs.lisp | 7 +++++ tests/exit-hang.impure.lisp | 14 ++++++++++ tests/input-manifest.lisp-expr | 4 +++ 4 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 559441f2d2..4362b46dd6 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1460,9 +1460,22 @@ on this semaphore, then N of them is woken up." (delete-from-all-threads (get-lisp-obj-address c-thread)))) (when sem (setf (thread-semaphore thread) nil) ; nobody needs to wait on it now - ;; We could increment by most-positive-fixnum, but that might just encourage - ;; bad usage (more than one attempted joiner) - (signal-semaphore sem))))) + ;; + ;; We go out of our way to support something pthreads don't: + ;; "The results of multiple simultaneous calls to pthread_join() + ;; specifying the same target thread are undefined." + ;; - https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html + ;; and for std::thread + ;; "No synchronization is performed on *this itself. Concurrently calling join() + ;; on the same thread object from multiple threads constitutes a data race + ;; that results in undefined behavior." + ;; - https://en.cppreference.com/w/cpp/thread/thread/join + ;; That's because (among other reasons), pthread_join deallocates memory. + ;; But in so far as our join does not equate to resource freeing, and our exit flag is + ;; our own kind of semaphore, we simply signal it using an arbitrarily huge count. + ;; See the comment in 'thread-structs.lisp' about why this isn't CONDITION-BROADCAST + ;; on a condition var. (Good luck trying to make this many threads) + (signal-semaphore sem 1000000))))) ;;; The "funny fixnum" address format would do no good - AVL-FIND and AVL-DELETE ;;; expect normal happy lisp integers, even if a bignum. @@ -2082,8 +2095,10 @@ Trying to join the main thread causes JOIN-THREAD to block until TIMEOUT occurs or the process exits: when the main thread exits, the entire process exits. -Consequences of trying to join a given target thread from multiple -threads are undefined. +Users should not rely on the ability to join a chosen THREAD from more +than one other thread simultaneously. Future changes to JOIN-THREAD may +directly call the underlying thread library, and not all threading +implementations consider such usage to be well-defined. NOTE: Return convention in case of a timeout is experimental and subject to change." @@ -2097,14 +2112,27 @@ subject to change." (without-interrupts (join-pthread-joinables #'cddr))) ;; No result semaphore indicates that there's nothing to wait for- ;; the thread is either a foreign-thread, or finished running. - (let ((problem - (acond ((thread-semaphore thread) - (if (wait-on-semaphore it :timeout timeout) nil :timeout)) + (let* ((semaphore (thread-semaphore thread)) + (problem + (cond (semaphore + (if (wait-on-semaphore semaphore :timeout timeout) nil :timeout)) ((typep thread 'foreign-thread) :foreign)))) (unless problem - (if (listp (thread-result thread)) - (return-from join-thread (values-list (thread-result thread))) - (setq problem :abort))) + (cond ((listp (thread-result thread)) + ;; Implementation note, were this to become a native pthread semaphore- + ;; we would need a sem_post() here to support concurrent join of THREAD + ;; from N>1 other threads, because the hypothetical sem_post() in HANDLE-THREAD-EXIT + ;; will only bump the count up by 1, and so at most 1 waiter would execute. + ;; [Alternatively - still hypothetically - HANDLE-THREAD-EXIT could sem_post() + ;; as many times as there are currently running threads, which seems iffy] + ;; And though it's potentially poor style to wait on a chosen thread from N>1 other + ;; threads, it happens, and users might rely on it, though POSIX specifically + ;; precludes that in the spec of pthread_join() which this isn't exactly. + ;; Also for what it's worth, the win32 WaitOnSingleObject and GetExitCodeThread + ;; APIs have no such prohibition as long as the object handle remains valid. + (return-from join-thread (values-list (thread-result thread)))) + (t + (setq problem :abort)))) (if defaultp (values default problem) (error 'join-thread-error :thread thread :problem problem)))) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index 7d589f905a..2d749787d1 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -124,6 +124,13 @@ in future versions." :type mutex :read-only t) ;; On succesful execution of the thread's lambda, a list of values. (result 0) + ;; The completion condition _could_ be manifested as a condition var, but a difficulty + ;; in doing so is that condition vars can always experience a spurious wakeup. + ;; Dealing with timeouts becomes troublesome then. But we can utilize the fact that + ;; WAIT-ON-SEMPAHORE implements a timeout, though as its comment says, the timeout + ;; doesn't account for re-acquiring the internal mutex if that takes nontrivial time, + ;; which it shouldn't since it guards very little work. + ;; At any rate, the semaphore abstraction is never subject to spurious wakeup. (semaphore nil :type (or null semaphore)) waiting-for) diff --git a/tests/exit-hang.impure.lisp b/tests/exit-hang.impure.lisp index 74bd2893f5..b1ec24284d 100644 --- a/tests/exit-hang.impure.lisp +++ b/tests/exit-hang.impure.lisp @@ -1,5 +1,19 @@ #+(or (not sb-thread) win32) (sb-ext:exit :code 104) +;;; Not an exactly an "exit hang" test, but there was a different hang +;;; regarding concurrent JOIN-THREAD on 1 thread. +;;; Even though POSIX threads would consider this to be undefined behavior with +;;; its thread abstraction, it's not undefined behavior in SBCL (for now) +;;; though I do think it's slightly suspicious to depend on this. +(with-test (:name :concurrent-join-thread) + (let* ((other-guy (sb-thread:make-thread #'sleep :arguments .2 :name "sleepyhead")) + (joiners + (loop repeat 4 + collect (sb-thread:make-thread #'sb-thread:join-thread + :arguments other-guy)))) + ;; The joiners should all return + (mapc 'sb-thread:join-thread joiners))) + ;;; This uses the same C source file as fcb-threads. ;;; This is OK in the parallel test runner because WITH-SCRATCH-FILE ;;; includes the PID in the temp file name. diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index cad3d609da..18414a8fb2 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -1,3 +1,6 @@ +;;; This comment might make sourceforge stop thinking that the file +;;; is binary its diff view. +;;; Or not. (("aprof.impure.lisp" "src/code/aprof.lisp" "src/code/shaketree.lisp") @@ -38,6 +41,7 @@ ("debug.impure.lisp" "tests/bug-414.lisp") ("defstruct.impure-cload.lisp" "tests/block-compile-defstruct-test.lisp") ("elfcore.test.sh" "src/runtime/shrinkwrap-sbcl") + ("exit-hang.impure.lisp" "tests/fcb-threads.so") ("fcb-threads.impure.lisp" "tests/fcb-threads.so") ("init.test.sh" "contrib/sb-introspect.fasl" From 9efa6bb39f5c3c005f1aeae3832ff468c3037254 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 20 Aug 2020 19:50:24 -0400 Subject: [PATCH 0431/4023] Add comment about holding it wrong I discovered this usage error when trying to see whether pthread mutexes perform better than SBCL mutexes (which they do). It's not a usage error now, but would/could be, depending. --- contrib/sb-concurrency/tests/test-gate.lisp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/contrib/sb-concurrency/tests/test-gate.lisp b/contrib/sb-concurrency/tests/test-gate.lisp index 5c78884ad3..80b3aa7a20 100644 --- a/contrib/sb-concurrency/tests/test-gate.lisp +++ b/contrib/sb-concurrency/tests/test-gate.lisp @@ -36,6 +36,23 @@ :arguments i))) (int-gate (make-gate))) (sleep 1) + ;; Considering that OPEN-GATE = CONDITION-BROADCAST, this action of INTERRUPT-THREAD + ;; with an (OPEN-GATE) call would be expressly forbidden if condition vars were + ;; implemented by native (pthread) primitives. Generally speaking the pthread intrinsics + ;; provide better mutex fairness, and I very much doubt we could use our condition + ;; vars with pthread mutexes. + ;; + ;; Debian docs say: "ASYNC-SIGNAL SAFETY + ;; The condition functions are not async-signal safe, and should not be called from a + ;; signal handler. In particular, calling pthread_cond_signal or pthread_cond_broadcast + ;; from a signal handler may deadlock the calling thread." + ;; https://manpages.debian.org/testing/glibc-doc/pthread_cond_broadcast.3.en.html + ;; + ;; OpenGroup calls out cond_signal but does not say cond_broadcast isn't safe. + ;; I suspect that it means that they both are not safe since they share a doc page: + ;; "It is not safe to use the pthread_cond_signal() function in a signal handler + ;; that is invoked asynchronously." + ;; https://pubs.opengroup.org/onlinepubs/007904975/functions/pthread_cond_broadcast.html (interrupt-thread (car threads) (lambda () (unwind-protect (when (gate-open-p gate) From 9c34c3ae9cb02979e2f86da228ae618dd3598184 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 21 Aug 2020 17:51:04 -0400 Subject: [PATCH 0432/4023] Move fallthrough comment where it works to stifle warning --- src/runtime/immobile-space.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 03ea79d46c..1da2e5261d 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1686,9 +1686,8 @@ static void fixup_space(lispobj* where, size_t n_words) if (needs_rehash) KV_PAIRS_REHASH(data) |= make_fixnum(1); break; - } else { - // FALLTHROUGH_INTENDED } + // INTENTIONAL FALLTHROUGH // All the other array header widetags. case SIMPLE_ARRAY_WIDETAG: #ifdef COMPLEX_CHARACTER_STRING_WIDETAG From 4c4aee57f0b496dfe268db275e5392d129f0a7a3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 21 Aug 2020 17:53:44 -0400 Subject: [PATCH 0433/4023] Remove :FUTEX-USE-TID feature * If :SB-FUTEX is supported, the OS always has some kind of 4-byte thread id. * Move the determination of :SB-FUTEX to src/cold/shared, and add it only if :SB-THREAD is also present, simplifying tests elsewhere. --- make-config.sh | 9 +-------- src/code/target-thread.lisp | 31 ++++++++++++------------------- src/code/thread-structs.lisp | 12 ++++-------- src/cold/shared.lisp | 4 ++-- src/runtime/thread.c | 15 +++++++++++---- 5 files changed, 30 insertions(+), 41 deletions(-) diff --git a/make-config.sh b/make-config.sh index 857ad9026a..5caab92476 100755 --- a/make-config.sh +++ b/make-config.sh @@ -504,15 +504,9 @@ case "$sbcl_os" in # If you add other platforms here, don't forget to edit # src/runtime/Config.foo-linux too. case "$sbcl_arch" in - mips | arm) + mips | arm | x86 | x86-64) printf ' :largefile' >> $ltf ;; - x86 | x86-64) - printf ' :sb-futex :largefile' >> $ltf - ;; - ppc | ppc64 | arm64 | riscv) - printf ' :sb-futex' >> $ltf - ;; esac link_or_copy Config.$sbcl_arch-linux Config @@ -594,7 +588,6 @@ case "$sbcl_os" in # Optional features -- We enable them by default, but the build # ought to work perfectly without them: # - printf ' :sb-futex' >> $ltf printf ' :sb-qshow' >> $ltf # # Required features -- Some of these used to be optional, but diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 4362b46dd6..01ab962c2a 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -23,7 +23,7 @@ with-session-lock with-spinlock)) -#+linux +#+(or linux win32) (defmacro my-kernel-thread-id () `(sb-ext:truly-the (unsigned-byte 32) @@ -469,7 +469,7 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (setf (documentation 'make-mutex 'function) "Create a mutex." (documentation 'mutex-name 'function) "The name of the mutex. Setfable.") -#+(and sb-thread sb-futex) +#+sb-futex (progn (locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) ;; """ (Futexes are 32 bits in size on all platforms, including 64-bit systems.) """ @@ -673,7 +673,7 @@ returns NIL each time." (defun %try-mutex (mutex new-owner) (declare (type mutex mutex) (optimize (speed 3))) - #-(and sb-thread sb-futex) + #-sb-futex (progn (barrier (:read)) (let ((old (mutex-%owner mutex))) @@ -686,7 +686,7 @@ returns NIL each time." (and (not old) ;; Don't even bother to try to CAS if it looks bad. (not (sb-ext:compare-and-swap (mutex-%owner mutex) nil new-owner))))) - #+(and sb-thread sb-futex) + #+sb-futex ;; From the Mutex 2 algorithm from "Futexes are Tricky" by Ulrich Drepper. (cond ((eql +lock-free+ (sb-ext:compare-and-swap (mutex-state mutex) +lock-free+ @@ -706,8 +706,7 @@ returns NIL each time." (defun %%wait-for-mutex (mutex new-owner to-sec to-usec stop-sec stop-usec) (declare (type mutex mutex) (optimize (speed 3))) (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) - #-sb-futex - (declare (ignore to-sec to-usec)) + (declare (ignorable to-sec to-usec)) #-sb-futex (flet ((cas () (loop repeat 100 @@ -862,7 +861,7 @@ IF-NOT-OWNER is :FORCE)." ;; FIXME: Is a :memory barrier too strong here? Can we use a :write ;; barrier instead? (barrier (:memory))) - #+(and sb-thread sb-futex) + #+sb-futex (when old-owner ;; FIXME: once ATOMIC-INCF supports struct slots with word sized ;; unsigned-byte type this can be used: @@ -938,7 +937,7 @@ IF-NOT-OWNER is :FORCE)." (setf (documentation 'waitqueue-name 'function) "The name of the waitqueue. Setfable." (documentation 'make-waitqueue 'function) "Create a waitqueue.") -#+(and sb-thread sb-futex) +#+sb-futex (locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) (define-structure-slot-addressor waitqueue-token-address :structure waitqueue @@ -978,11 +977,8 @@ IF-NOT-OWNER is :FORCE)." (%%wait-for #'wakeup stop-sec stop-usec))) :timeout))) #+sb-futex - (with-pinned-objects (queue - ;; No point in pinning ME if not taking the adddress. - #-futex-use-tid me) - (setf (waitqueue-token queue) #+futex-use-tid (my-kernel-thread-id) - #-futex-use-tid me) + (with-pinned-objects (queue) + (setf (waitqueue-token queue) (my-kernel-thread-id)) (release-mutex mutex) ;; Now we go to sleep using futex-wait. If anyone else ;; manages to grab MUTEX and call CONDITION-NOTIFY during @@ -992,8 +988,7 @@ IF-NOT-OWNER is :FORCE)." (setf status (case (allow-with-interrupts (futex-wait (waitqueue-token-address queue) - #+futex-use-tid (my-kernel-thread-id) - #-futex-use-tid (get-lisp-obj-address me) + (my-kernel-thread-id) ;; our way of saying "no ;; timeout": (or to-sec -1) @@ -1127,15 +1122,13 @@ must be held by this thread during this call." (progn ;; No problem if >1 thread notifies during the comment in condition-wait: ;; as long as the value in queue-data isn't the waiting thread's id, it - ;; matters not what it is -- using the queue object itself is handy. - ;; But "handy" is not right (lp#1876825) if pointers are 64 bits, - ;; so then just use 0 which can not correspond to any thread. + ;; matters not what it is. We rely on kernel thread ID being nonzero. ;; ;; XXX we should do something to ensure that the result of this setf ;; is visible to all CPUs. ;; ;; ^-- surely futex_wake() involves a memory barrier? - (setf (waitqueue-token queue) #+futex-use-tid 0 #-futex-use-tid queue) + (setf (waitqueue-token queue) 0) (with-pinned-objects (queue) (futex-wake (waitqueue-token-address queue) n)) nil))) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index 2d749787d1..9989ccd5d0 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -18,9 +18,7 @@ (sb-xc:defstruct (mutex (:constructor make-mutex (&key name)) (:copier nil)) "Mutex type." - ;; C code could (but doesn't currently) access the name - #+(and sb-thread sb-futex) - (state 0 :type fixnum) + #+sb-futex (state 0 :type fixnum) ;; If adding slots between STATE and NAME, please see futex_name() in linux_os.c ;; which attempts to divine a string from a futex word address. (name nil :type (or null simple-string)) @@ -29,11 +27,9 @@ #+(or (not sb-thread) sb-futex) (sb-xc:defstruct (waitqueue (:copier nil) (:constructor make-waitqueue (&key name))) "Waitqueue type." - #+(and sb-thread sb-futex) - (token 0 - ;; actually 32-bits, but it needs to be a raw slot and we don't have - ;; 32-bit raw slots on 64-bit machines. - #+futex-use-tid :type #+futex-use-tid sb-ext:word) + ;; futex words are actually 32-bits, but it needs to be a raw slot and we don't have + ;; 32-bit raw slots on 64-bit machines. + #+sb-futex (token 0 :type sb-ext:word) ;; If adding slots between TOKEN and NAME, please see futex_name() in linux_os.c ;; which attempts to divine a string from a futex word address. (name nil :type (or null string))) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 7f78bdb76c..26485ea55d 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -243,8 +243,8 @@ (gc (find-if (lambda (x) (member x '(:cheneygc :gencgc))) target-feature-list)) (arch (target-platform-keyword target-feature-list))) - (when (featurep '(:and :sb-thread :sb-futex :linux) target-feature-list) - (pushnew :futex-use-tid target-feature-list)) + (when (featurep '(:and :sb-thread (:or :linux :win32)) target-feature-list) + (pushnew :sb-futex target-feature-list)) (when (featurep '(:and :sb-thread (:not :win32)) target-feature-list) (push :pauseless-threadstart target-feature-list)) (when (featurep '(:and :sb-thread (:or :darwin :openbsd)) target-feature-list) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 11550da0aa..e5b024f039 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -195,6 +195,13 @@ int sb_GetTID() { return syscall(SYS_gettid); } #define sb_GetTID() 0 #endif +static int get_nonzero_tid() +{ + int tid = sb_GetTID(); + gc_dcheck(tid != 0); + return tid; +} + // Only a single 'attributes' object is used if #+pauseless-threadstart. // This is ok because creation is synchronized by *MAKE-THREAD-LOCK*. #if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_WIN32 @@ -250,7 +257,7 @@ void create_main_lisp_thread(lispobj function) { unblock_gc_signals(); #endif link_thread(th); - th->os_kernel_tid = sb_GetTID(); + th->os_kernel_tid = get_nonzero_tid(); th->os_thread = thread_self(); #ifndef LISP_FEATURE_WIN32 protect_control_stack_hard_guard_page(1, NULL); @@ -505,7 +512,7 @@ void* new_thread_trampoline(void* arg) && !defined LISP_FEATURE_SB_SAFEPOINT th->control_stack_end = (lispobj*)&arg + 1; #endif - th->os_kernel_tid = sb_GetTID(); + th->os_kernel_tid = get_nonzero_tid(); init_new_thread(th, SCRIBBLE, 0, 0); // Passing the untagged pointer ensures 2 things: // - that the pinning mechanism works as designed, and not just by accident. @@ -517,7 +524,7 @@ void* new_thread_trampoline(void* arg) #else // !PAUSELESS_THREADSTART - th->os_kernel_tid = sb_GetTID(); + th->os_kernel_tid = get_nonzero_tid(); init_thread_data scribble; FSHOW((stderr,"/creating thread %p\n", thread_self())); @@ -612,7 +619,7 @@ attach_os_thread(init_thread_data *scribble) unblock_gc_signals(); #endif - th->os_kernel_tid = sb_GetTID(); + th->os_kernel_tid = get_nonzero_tid(); th->os_thread = pthread_self(); #if !defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) From e4918451391f303733824aa4289ea1c5c907897a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 21 Aug 2020 20:36:41 -0400 Subject: [PATCH 0434/4023] Use HOLDING-MUTEX-P in lieu of mutex-owner --- src/code/target-thread.lisp | 20 +++++--------------- src/code/thread.lisp | 24 +++++++++++++++++------- src/pcl/boot.lisp | 3 +-- src/pcl/wrapper.lisp | 3 +-- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 01ab962c2a..f1ddd32280 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -206,16 +206,15 @@ a simple-string (not necessarily unique) or NIL.") state values)))) -(defun print-lock (lock name owner stream) - (let ((*print-circle* t)) - (print-unreadable-object (lock stream :type t :identity (not name)) +(defmethod print-object ((mutex mutex) stream) + (let ((name (mutex-name mutex)) + (owner (mutex-owner mutex)) + (*print-circle* t)) + (print-unreadable-object (mutex stream :type t :identity (not name)) (if owner (format stream "~@[~S ~]~2I~_owner: ~S" name owner) (format stream "~@[~S ~](free)" name))))) -(defmethod print-object ((mutex mutex) stream) - (print-lock mutex (mutex-name mutex) (mutex-owner mutex) stream)) - ;; NB: ephemeral threads must terminate strictly before the test of NTHREADS>1 ;; in DEINIT, i.e. this is not a promise that the thread will terminate ;; just-in-time for the final call out to save, but rather by an earlier time. @@ -485,15 +484,6 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (defconstant +lock-taken+ 1) (defconstant +lock-contested+ 2)) -(defun mutex-owner (mutex) - "Current owner of the mutex, NIL if the mutex is free. Naturally, -this is racy by design (another thread may acquire the mutex after -this function returns), it is intended for informative purposes. For -testing whether the current thread is holding a mutex see -HOLDING-MUTEX-P." - ;; Make sure to get the current value. - (sb-ext:compare-and-swap (mutex-%owner mutex) nil nil)) - (sb-ext:define-load-time-global **deadlock-lock** nil) ;;; Signals an error if owner of LOCK is waiting on a lock whose release diff --git a/src/code/thread.lisp b/src/code/thread.lisp index 0291c809b4..41070e5b78 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -31,12 +31,23 @@ any time." stale value, use MUTEX-OWNER instead." (mutex-%owner mutex)) +(declaim (inline holding-mutex-p)) (defun holding-mutex-p (mutex) "Test whether the current thread is holding MUTEX." ;; This is about the only use for which a stale value of owner is ;; sufficient. (eq sb-thread:*current-thread* (mutex-%owner mutex))) +(declaim (inline mutex-owner)) +(defun mutex-owner (mutex) + "Current owner of the mutex, NIL if the mutex is free. Naturally, +this is racy by design (another thread may acquire the mutex after +this function returns), it is intended for informative purposes. For +testing whether the current thread is holding a mutex see +HOLDING-MUTEX-P." + ;; Make sure to get the current value. + (sb-ext:compare-and-swap (mutex-%owner mutex) nil nil)) + (defsetf mutex-value set-mutex-value) (declaim (sb-ext:deprecated :final ("SBCL" "1.2.15") #'set-mutex-value)) @@ -231,13 +242,13 @@ held mutex, WITH-RECURSIVE-LOCK allows recursive lock attempts to succeed." (defun call-with-recursive-lock (function mutex waitp timeout) (declare (function function)) (declare (dynamic-extent function)) - (let ((inner-lock-p (eq (mutex-%owner mutex) *current-thread*)) + (let ((had-it (holding-mutex-p mutex)) (got-it nil)) (without-interrupts (unwind-protect - (when (or inner-lock-p (setf got-it (allow-with-interrupts - (grab-mutex mutex :waitp waitp - :timeout timeout)))) + (when (or had-it + (setf got-it (allow-with-interrupts + (grab-mutex mutex :waitp waitp :timeout timeout)))) (with-local-interrupts (funcall function))) (when got-it (release-mutex mutex)))))) @@ -246,11 +257,10 @@ held mutex, WITH-RECURSIVE-LOCK allows recursive lock attempts to succeed." (declare (function function)) (declare (dynamic-extent function)) (without-interrupts - (let ((inner-lock-p (eq *current-thread* (mutex-owner lock))) + (let ((had-it (holding-mutex-p lock)) (got-it nil)) (unwind-protect - (when (or inner-lock-p - (setf got-it (grab-mutex lock))) + (when (or had-it (setf got-it (grab-mutex lock))) (funcall function)) (when got-it (release-mutex lock))))))) diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index 0360a72e4a..6842b06985 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -2403,8 +2403,7 @@ bootstrapping. (cond ((eq **boot-state** 'complete) ;; Check that we are under the lock. - #+sb-thread - (aver (eq sb-thread:*current-thread* (sb-thread:mutex-owner (gf-lock gf)))) + #+sb-thread (aver (sb-thread:holding-mutex-p (gf-lock gf))) (setf (safe-gf-dfun-state gf) new-state)) (t (setf (clos-slots-ref (get-slots gf) +sgf-dfun-state-index+) diff --git a/src/pcl/wrapper.lisp b/src/pcl/wrapper.lisp index 6a1f8f4e1a..9a3d9e280d 100644 --- a/src/pcl/wrapper.lisp +++ b/src/pcl/wrapper.lisp @@ -156,8 +156,7 @@ ;;; but also pretty much not correct. (defun %invalidate-wrapper (owrapper state nwrapper) (aver (member state '(:flush :obsolete))) - #+sb-thread (aver (eq (sb-thread:mutex-owner sb-c::**world-lock**) - sb-thread:*current-thread*)) + #+sb-thread (aver (sb-thread:holding-mutex-p sb-c::**world-lock**)) (let ((classoid (layout-classoid nwrapper)) (new-previous ()) (new-state (cons state nwrapper))) From 3829777024ab800ddaf20051ad69ac921e03ae8e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 23 Aug 2020 12:01:51 -0400 Subject: [PATCH 0435/4023] sb-futex: Fix %%WAIT-FOR-MUTEX A bug lay dormant for 9 years because its behavior was externally the same as correct behavior. Prior to git rev d6f9676ae9 the code was right, but that change removed a needed assignment of OLD, potentially causing any mutex to degenerate into an overcomplicated spinlock by failing every futex_wait. --- src/code/target-thread.lisp | 113 +++++++++++----------------- src/code/thread-structs.lisp | 2 +- tests/futex-wait.test.sh | 140 +++++++++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 69 deletions(-) create mode 100755 tests/futex-wait.test.sh diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index f1ddd32280..c5bc2a819e 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -477,12 +477,7 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (define-structure-slot-addressor mutex-state-address :structure mutex :slot state - :byte-offset (+ #+(and 64-bit big-endian) 4))) - ;; Important: current code assumes these are fixnums or other - ;; lisp objects that don't need pinning. - (defconstant +lock-free+ 0) - (defconstant +lock-taken+ 1) - (defconstant +lock-contested+ 2)) + :byte-offset (+ #+(and 64-bit big-endian) 4)))) (sb-ext:define-load-time-global **deadlock-lock** nil) @@ -678,17 +673,9 @@ returns NIL each time." (not (sb-ext:compare-and-swap (mutex-%owner mutex) nil new-owner))))) #+sb-futex ;; From the Mutex 2 algorithm from "Futexes are Tricky" by Ulrich Drepper. - (cond ((eql +lock-free+ (sb-ext:compare-and-swap (mutex-state mutex) - +lock-free+ - +lock-taken+)) - ;; TODO: measure the speed difference of doing an ordinary store here. - ;; CAS is overkill but we would have to forgo the bug detection. - ;; Alternatively, we could use one double-wide CAS. - (let ((prev (sb-ext:compare-and-swap (mutex-%owner mutex) nil - (sb-ext:truly-the thread new-owner)))) - (when prev - (bug "Old owner in free mutex: ~S" prev)) - t)) + (cond ((= (sb-ext:cas (mutex-state mutex) 0 1) 0) + (setf (mutex-%owner mutex) (sb-ext:truly-the thread new-owner)) + t) ; GRAB-MUTEX wants %TRY-MUTEX to return boolean, not generalized boolean ((eq (mutex-%owner mutex) new-owner) (error "Recursive lock attempt ~S." mutex)))) @@ -716,42 +703,42 @@ returns NIL each time." #+sb-futex ;; This is a fairly direct translation of the Mutex 2 algorithm from ;; "Futexes are Tricky" by Ulrich Drepper. - (flet ((maybe (old) - (when (eql +lock-free+ old) - (let ((prev (sb-ext:compare-and-swap (mutex-%owner mutex) - nil new-owner))) - (when prev - (bug "Old owner in free mutex: ~S" prev)) - (return-from %%wait-for-mutex t))))) - (prog ((old (sb-ext:compare-and-swap (mutex-state mutex) - +lock-free+ +lock-taken+))) - ;; Got it right off the bat? - (maybe old) - :retry - ;; Mark it as contested, and sleep. (Exception: it was just released.) - (when (or (eql +lock-contested+ old) - (not (eql +lock-free+ - (sb-ext:compare-and-swap - (mutex-state mutex) +lock-taken+ +lock-contested+)))) - (when (eql 1 (with-pinned-objects (mutex) - (futex-wait (mutex-state-address mutex) - (get-lisp-obj-address +lock-contested+) - (or to-sec -1) - (or to-usec 0)))) - ;; -1 = EWOULDBLOCK, possibly spurious wakeup - ;; 0 = normal wakeup - ;; 1 = ETIMEDOUT ***DONE*** - ;; 2 = EINTR, a spurious wakeup - (return-from %%wait-for-mutex nil))) - ;; Try to get it, still marking it as contested. - (maybe - (sb-ext:compare-and-swap (mutex-state mutex) +lock-free+ +lock-contested+)) - ;; Update timeout if necessary. - (when stop-sec - (setf (values to-sec to-usec) - (sb-impl::relative-decoded-times stop-sec stop-usec))) - ;; Spin. - (go :retry)))) + ;; + ;; void lock () { + ;; int c; + ;; if ((c = cmpxchg(val, 0, 1)) != 0) + ;; do { + ;; if (c == 2 || cmpxchg(val, 1, 2) != 0) + ;; futex_wait(&val, 2); + ;; } while ((c = cmpxchg(val, 0, 2)) != 0); + ;; } + ;; + (symbol-macrolet ((val (mutex-state mutex))) + (let ((c (sb-ext:cas val 0 1))) ; available -> taken + (unless (= c 0) ; Got it right off the bat? + (if (not stop-sec) + (loop ; untimed + ;; Mark it as contested, and sleep, unless it is now in state 0. + (when (or (eql c 2) (/= 0 (sb-ext:cas val 1 2))) + (with-pinned-objects (mutex) + (futex-wait (mutex-state-address mutex) 2 -1 0))) + ;; Try to get it, still marking it as contested. + (when (= 0 (setq c (sb-ext:cas val 0 2))) (return))) ; win + (loop ; same as above but check for timeout + (when (or (eql c 2) (/= 0 (sb-ext:cas val 1 2))) + (if (eql 1 (with-pinned-objects (mutex) + (futex-wait (mutex-state-address mutex) 2 to-sec to-usec))) + ;; -1 = EWOULDBLOCK, possibly spurious wakeup + ;; 0 = normal wakeup + ;; 1 = ETIMEDOUT ***DONE*** + ;; 2 = EINTR, a spurious wakeup + (return-from %%wait-for-mutex nil))) + (when (= 0 (setq c (sb-ext:cas val 0 2))) (return)) ; win + ;; Update timeout + (setf (values to-sec to-usec) + (sb-impl::relative-decoded-times stop-sec stop-usec)))))) + (setf (mutex-%owner mutex) new-owner) + t)) #+sb-thread (defun %wait-for-mutex (mutex self timeout to-sec to-usec stop-sec stop-usec deadlinep) @@ -853,21 +840,11 @@ IF-NOT-OWNER is :FORCE)." (barrier (:memory))) #+sb-futex (when old-owner - ;; FIXME: once ATOMIC-INCF supports struct slots with word sized - ;; unsigned-byte type this can be used: - ;; - ;; (let ((old (sb-ext:atomic-incf (mutex-state mutex) -1))) - ;; (unless (eql old +lock-free+) - ;; (setf (mutex-state mutex) +lock-free+) - ;; (with-pinned-objects (mutex) - ;; (futex-wake (mutex-state-address mutex) 1)))) - (let ((old (sb-ext:compare-and-swap (mutex-state mutex) - +lock-taken+ +lock-free+))) - (when (eql old +lock-contested+) - (sb-ext:compare-and-swap (mutex-state mutex) - +lock-contested+ +lock-free+) - (with-pinned-objects (mutex) - (futex-wake (mutex-state-address mutex) 1)))) + (unless (eql (sb-ext:atomic-decf (mutex-state mutex) 1) 1) + (setf (mutex-state mutex) 0) + (sb-thread:barrier (:write)) ; paranoid ? + (with-pinned-objects (mutex) + (futex-wake (mutex-state-address mutex) 1))) nil))) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index 9989ccd5d0..2669ff2ea3 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -18,7 +18,7 @@ (sb-xc:defstruct (mutex (:constructor make-mutex (&key name)) (:copier nil)) "Mutex type." - #+sb-futex (state 0 :type fixnum) + #+sb-futex (state 0 :type sb-vm:word) ;; If adding slots between STATE and NAME, please see futex_name() in linux_os.c ;; which attempts to divine a string from a futex word address. (name nil :type (or null simple-string)) diff --git a/tests/futex-wait.test.sh b/tests/futex-wait.test.sh new file mode 100755 index 0000000000..75b701f7c7 --- /dev/null +++ b/tests/futex-wait.test.sh @@ -0,0 +1,140 @@ +#!/bin/sh + +. ./subr.sh + +set -e + +run_sbcl --noinform <1500 calls to futex_wait due to the bug +echo N was $n +exit 0 + +# SBCL had a bug in %%WAIT-FOR-MUTEX. This is an examination of why one should not +# endeavor to make the slightest alteration to researched and published code, +# potentially even so far as eschewing gratuitious abtractions such as introduction +# of symbolic constants that if anything make it difficult to compare against +# the reference algorithm. +# +# value of C as-is STATE value +# from top of PROG after futex-wait outcome +# ================ ================ ======= +# +# 1 1 same as reference algorithm +# after wait: cmpxchg(val,0,2) fails +# reference algorithm assigns C := 1 here. SBCL did not assign, +# but the value of C is that anyway. +# at retry : cmpxchg(val,1,2) suceeds +# +# ---------------------------------------------------------------------------- +# +# 2 1 extra futex_wait/wake cycles +# after wait: cmpxchg(val,0,2) fails +# reference algorithm assigns C := 1 here +# SBCL incorrectly omits the next cmpxchg, which was needed. +# at retry : cmpxchg(val,1,2) succeeds ; SBCL omits by mistake +# +# by omitting a required cmpxchg, the state is perceived as 2 when it isn't. +# futex_wait() returns EWOULDBLOCK. This cycle continues forever +# until the mutex is released. +# +# ---------------------------------------------------------------------------- +# +# 1 2 one extra cmpxchg +# after wait: cmpxchg(val,0,2) fails +# reference algorithm assigns C := 2 here but SBCL algorithm did not, +# therefore the reference algorithm does not attempt next cmpxchg. +# at retry : cmpxchg(val,1,2) fails ; this cmpxchg is not needed. +# +# ---------------------------------------------------------------------------- +# +# 2 2 +# after wait: cmpxchg(val,0,2) fails +# reference algorithm assigns C := 2 here. SBCL did not assign, +# but the value of C is that anyway. +# From c010b61dbb5658eeb88f06b99279f3bd9b9fd1cc Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 23 Aug 2020 21:33:09 +0300 Subject: [PATCH 0436/4023] Fix a test. --- tests/futex-wait.test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/futex-wait.test.sh b/tests/futex-wait.test.sh index 75b701f7c7..996adeb3c1 100755 --- a/tests/futex-wait.test.sh +++ b/tests/futex-wait.test.sh @@ -2,8 +2,6 @@ . ./subr.sh -set -e - run_sbcl --noinform < Date: Sun, 23 Aug 2020 16:13:42 -0400 Subject: [PATCH 0437/4023] Add missing vops (Forgot the backends were so inconsistent) --- src/code/cas.lisp | 4 +--- src/compiler/arm64/cell.lisp | 10 ++++++++++ src/compiler/generic/vm-fndb.lisp | 2 +- src/compiler/ppc/cell.lisp | 9 +++++++++ src/compiler/ppc64/cell.lisp | 9 +++++++++ 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/code/cas.lisp b/src/code/cas.lisp index bba4b91368..728c2f1328 100644 --- a/src/code/cas.lisp +++ b/src/code/cas.lisp @@ -18,11 +18,9 @@ (casser (case (dsd-raw-type slotd) ((t) '%instance-cas) - #+(or x86 x86-64 riscv) ((word) '%raw-instance-cas/word) - #+riscv ((signed-word) '%raw-instance-cas/signed-word)))) - (unless casser + (unless (gethash casser sb-c::*backend-parsed-vops*) (error "Cannot use COMPARE-AND-SWAP with structure accessor ~ for a typed slot: ~S" place)) diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 99ac038c28..52b4d78990 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -466,6 +466,16 @@ (:translate %instance-cas) (:variant instance-slots-offset instance-pointer-lowtag) (:arg-types instance tagged-num * *)) +(define-vop (%raw-instance-cas/word %instance-cas) + (:args (object) + (index) + (old-value :scs (unsigned-reg)) + (new-value :scs (unsigned-reg))) + (:arg-types * tagged-num unsigned-num unsigned-num) + (:results (result :scs (unsigned-reg) :from :load)) + (:result-types unsigned-num) + (:translate %raw-instance-cas/word)) + ;;;; Code object frobbing. diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 600e0e4a97..0df99b9f8c 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -219,7 +219,7 @@ (defknown %layout-invalid-error (t layout) nil) (defknown update-object-layout-or-invalid (t layout) layout) -#+(or x86 x86-64 riscv) +#+(or arm64 ppc ppc64 riscv x86 x86-64) (defknown %raw-instance-cas/word (instance index sb-vm:word sb-vm:word) sb-vm:word ()) #+riscv diff --git a/src/compiler/ppc/cell.lisp b/src/compiler/ppc/cell.lisp index 54ca3e82d2..86b1bcee95 100644 --- a/src/compiler/ppc/cell.lisp +++ b/src/compiler/ppc/cell.lisp @@ -449,6 +449,15 @@ (:translate %instance-cas) (:variant instance-slots-offset instance-pointer-lowtag) (:arg-types instance tagged-num * *)) +(define-vop (%raw-instance-cas/word %instance-cas) + (:args (object) + (index) + (old-value :scs (unsigned-reg)) + (new-value :scs (unsigned-reg))) + (:arg-types * tagged-num unsigned-num unsigned-num) + (:results (result :scs (unsigned-reg) :from :load)) + (:result-types unsigned-num) + (:translate %raw-instance-cas/word)) ;;;; Code object frobbing. diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index afdaedaf12..48fa1876de 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -549,6 +549,15 @@ (:translate %instance-cas) (:variant instance-slots-offset instance-pointer-lowtag) (:arg-types instance tagged-num * *)) +(define-vop (%raw-instance-cas/word %instance-cas) + (:args (object) + (index) + (old-value :scs (unsigned-reg)) + (new-value :scs (unsigned-reg))) + (:arg-types * tagged-num unsigned-num unsigned-num) + (:results (result :scs (unsigned-reg) :from :load)) + (:result-types unsigned-num) + (:translate %raw-instance-cas/word)) ;;;; Code object frobbing. From cfaaaac88bad32b0bb714b1273713218b509107e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 23 Aug 2020 17:16:48 -0400 Subject: [PATCH 0438/4023] Restore brute-force tests of raw instance cas I tried moving *backend-parsed-vops* to early-c and moving that before 'cas' in compilation order, which failed without some other rearrangement, and then it really started to get out of control, so ... this. --- src/code/cas.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/code/cas.lisp b/src/code/cas.lisp index 728c2f1328..f94f504efa 100644 --- a/src/code/cas.lisp +++ b/src/code/cas.lisp @@ -18,9 +18,11 @@ (casser (case (dsd-raw-type slotd) ((t) '%instance-cas) + #+(or arm64 ppc ppc64 riscv x86 x86-64) ((word) '%raw-instance-cas/word) + #+riscv ((signed-word) '%raw-instance-cas/signed-word)))) - (unless (gethash casser sb-c::*backend-parsed-vops*) + (unless casser (error "Cannot use COMPARE-AND-SWAP with structure accessor ~ for a typed slot: ~S" place)) From 38a29886fa067aedd3aa5a0aa43a6bb65c1acd1a Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 23 Aug 2020 19:52:12 -0400 Subject: [PATCH 0439/4023] Adjust crossbuild-runner configurations --- .../backends/x86/stuff-groveled-from-headers.lisp | 4 ++++ crossbuild-runner/build-all.sh | 2 +- src/cold/shared.lisp | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/crossbuild-runner/backends/x86/stuff-groveled-from-headers.lisp b/crossbuild-runner/backends/x86/stuff-groveled-from-headers.lisp index a8684747fb..13953d7f4d 100644 --- a/crossbuild-runner/backends/x86/stuff-groveled-from-headers.lisp +++ b/crossbuild-runner/backends/x86/stuff-groveled-from-headers.lisp @@ -92,6 +92,10 @@ (defconstant tiocgpgrp 21519) ; #x540f ;;; signals +(defconstant sizeof-sigset_t 128) ; #x80 +(defconstant sig_block 0) ; #x0 +(defconstant sig_unblock 1) ; #x1 +(defconstant sig_setmask 2) ; #x2 (defconstant sigalrm 14) ; #xe (defconstant sigbus 7) ; #x7 (defconstant sigchld 17) ; #x11 diff --git a/crossbuild-runner/build-all.sh b/crossbuild-runner/build-all.sh index a24cb3b4aa..b9b65b3d16 100755 --- a/crossbuild-runner/build-all.sh +++ b/crossbuild-runner/build-all.sh @@ -26,7 +26,7 @@ do echo ":$arch" >> $ltf # x86-64 is tested as if #+win32 if [ $arch != "x86-64" ]; then - echo ':unix :linux :elf :sb-futex' >> $ltf + echo ':unix :linux :elf' >> $ltf fi cat crossbuild-runner/backends/$arch/features >> $ltf cat crossbuild-runner/backends/$arch/local-target-features >> $ltf diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 26485ea55d..789a5165a5 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -328,6 +328,8 @@ ":IMMOBILE-CODE requires :IMMOBILE-SPACE feature") ("(and immobile-symbols (not immobile-space))" ":IMMOBILE-SYMBOLS requires :IMMOBILE-SPACE feature") + ("(and sb-futex (not sb-thread))" + "Can't enable SB-FUTEX on platforms lacking thread support") ;; There is still hope to make multithreading on DragonFly x86-64 ("(and sb-thread x86 dragonfly)" ":SB-THREAD not supported on selected architecture"))) From 147914b8829f849e9da756aa98ae6344401c94b6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 24 Aug 2020 12:10:55 -0400 Subject: [PATCH 0440/4023] Delete unused var --- src/code/target-thread.lisp | 1 - src/runtime/thread.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index c5bc2a819e..57ea5e15fb 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1900,7 +1900,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;;; This is the faster variant of RUN-THREAD that does not wait for the new ;;; thread to start executing before returning. -;;; Also the create_thread_lock is not used in C. #+pauseless-threadstart (defun start-thread (thread function arguments) (let* ((trampoline diff --git a/src/runtime/thread.c b/src/runtime/thread.c index e5b024f039..dab704d0db 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -67,8 +67,6 @@ struct thread *all_threads; #ifdef LISP_FEATURE_SB_THREAD pthread_mutex_t all_threads_lock = PTHREAD_MUTEX_INITIALIZER; -static __attribute__((unused)) pthread_mutex_t create_thread_lock = PTHREAD_MUTEX_INITIALIZER; - #ifdef LISP_FEATURE_GCC_TLS __thread struct thread *current_thread; #elif !defined LISP_FEATURE_WIN32 From d134c68b7f34c994c91b671e99ed62ed972fef1d Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 24 Aug 2020 14:05:15 -0400 Subject: [PATCH 0441/4023] Remove QSHOW_SIGNAL_SAFE I'm trying to whittle down all the competing debug print variants. Most uses of odxprint - the affected function - are for safepoint.c yet the comment says "On Windows, this setting has no effect." --- src/runtime/print.c | 4 ---- src/runtime/runtime.h | 20 -------------------- 2 files changed, 24 deletions(-) diff --git a/src/runtime/print.c b/src/runtime/print.c index c45f6ad339..3ef953007d 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -152,8 +152,6 @@ vodxprint_fun(const char *fmt, va_list args) #endif int original_errno = errno; - QSHOW_BLOCK; - char buf[1024]; int n = 0; @@ -184,8 +182,6 @@ vodxprint_fun(const char *fmt, va_list args) fflush(stderr); #endif - QSHOW_UNBLOCK; - #ifdef LISP_FEATURE_WIN32 SetLastError(lastError); #endif diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index c24dd16972..d0ed33e3d6 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -80,13 +80,6 @@ void gc_state_unlock(); * you are a developer and want to affect FSHOW behaviour. */ -/* Block blockable interrupts for each SHOW, if not 0. - * (On Windows, this setting has no effect.) - * - * In principle, this is a "configuration option", but I am not aware of - * any reason why or when it would be advantageous to disable it. */ -#define QSHOW_SIGNAL_SAFE 1 - /* Enable extra-verbose low-level debugging output for signals? (You * probably don't want this unless you're trying to debug very early * cold boot on a new machine, or one where you've just messed up @@ -165,19 +158,6 @@ extern int gencgc_verbose; void dyndebug_init(void); -#if QSHOW_SIGNAL_SAFE == 1 && !defined(LISP_FEATURE_WIN32) - -extern sigset_t blockable_sigset; - -#define QSHOW_BLOCK \ - sigset_t oldset; \ - thread_sigmask(SIG_BLOCK, &blockable_sigset, &oldset) -#define QSHOW_UNBLOCK thread_sigmask(SIG_SETMASK,&oldset,0) -#else -#define QSHOW_BLOCK -#define QSHOW_UNBLOCK -#endif - /* The following macros duplicate the expansion of odxprint, because the * extra level of parentheses around `args' prevents us from * implementing FSHOW in terms of odxprint directly. (They also differ From 39b36cc87bff789aea7c6b02e1c94feb58bb6f8c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 24 Aug 2020 14:25:16 -0400 Subject: [PATCH 0442/4023] Remove "#define POINTERSIZE" for assembly code It was wrong for all 64-bit platforms except x86-64. I don't know what assembler required a size in bytes for the ".extern" directive, but none of the currently supported ones do. --- src/runtime/globals.h | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/runtime/globals.h b/src/runtime/globals.h index 329ceb7adf..5a434003e0 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -114,68 +114,58 @@ extern void globals_init(void); #else /* __ASSEMBLER__ */ # ifdef LISP_FEATURE_MIPS -# ifdef __linux__ -# define EXTERN(name,bytes) .globl name -# else -# define EXTERN(name,bytes) .extern name bytes -# endif +# define EXTERN(name) .globl name # endif /**/ # ifdef LISP_FEATURE_SPARC # ifdef SVR4 -# define EXTERN(name,bytes) .global name +# define EXTERN(name) .global name # else -# define EXTERN(name,bytes) .global _ ## name +# define EXTERN(name) .global _ ## name # endif # endif /**/ # ifdef LISP_FEATURE_ALPHA # ifdef __linux__ -# define EXTERN(name,bytes) .globl name +# define EXTERN(name) .globl name # endif # endif /**/ # if defined(LISP_FEATURE_PPC) || defined(LISP_FEATURE_PPC64) # ifdef LISP_FEATURE_DARWIN -# define EXTERN(name,bytes) .globl _ ## name +# define EXTERN(name) .globl _ ## name # else -# define EXTERN(name,bytes) .globl name +# define EXTERN(name) .globl name # endif # endif /**/ # if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) -# define EXTERN(name,bytes) .global name +# define EXTERN(name) .global name # endif /**/ # if defined(LISP_FEATURE_ARM) || defined(LISP_FEATURE_ARM64) -# define EXTERN(name,bytes) .global name -# endif - -# if defined(LISP_FEATURE_ALPHA) || defined(LISP_FEATURE_X86_64) -# define POINTERSIZE 8 -# else -# define POINTERSIZE 4 +# define EXTERN(name) .global name # endif # if defined(LISP_FEATURE_RISCV) -# define EXTERN(name,bytes) .globl name +# define EXTERN(name) .globl name # endif #ifndef LISP_FEATURE_SB_THREAD -EXTERN(foreign_function_call_active, 4) +EXTERN(foreign_function_call_active) #endif #if !defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) -EXTERN(current_control_stack_pointer, POINTERSIZE) +EXTERN(current_control_stack_pointer) #endif -EXTERN(current_control_frame_pointer, POINTERSIZE) +EXTERN(current_control_frame_pointer) # if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64) -EXTERN(current_binding_stack_pointer, POINTERSIZE) +EXTERN(current_binding_stack_pointer) # endif // don't want an undefined C symbol for this in 'nm' output, it's confusing # if defined LISP_FEATURE_CHENEYGC && \ !(defined LISP_FEATURE_ARM || defined LISP_FEATURE_ARM64 || defined LISP_FEATURE_RISCV) -EXTERN(dynamic_space_free_pointer, POINTERSIZE) +EXTERN(dynamic_space_free_pointer) # endif #endif /* __ASSEMBLER__ */ From 59a3a1c9a10d1ffe8c85f3577de3b2a9d0c1f1bd Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 24 Aug 2020 14:43:57 -0400 Subject: [PATCH 0443/4023] Fix SAP_WIDETAG case Unsigned long truncate on win32. "%p" works everywhere. --- src/runtime/print.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/runtime/print.c b/src/runtime/print.c index 3ef953007d..e7da54a976 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -778,11 +778,7 @@ static void print_fun_or_otherptr(lispobj obj) case SAP_WIDETAG: NEWLINE_OR_RETURN; -#ifndef LISP_FEATURE_ALPHA - printf("0x%08lx", (unsigned long) *ptr); -#else - printf("0x%016lx", *(lispobj*)(ptr+1)); -#endif + printf("%p", (void*)*ptr); break; case WEAK_POINTER_WIDETAG: From 16b55d78d1847acc31a7ae3032a348be26d076fe Mon Sep 17 00:00:00 2001 From: Jan Moringen Date: Mon, 24 Aug 2020 18:57:57 +0200 Subject: [PATCH 0444/4023] pcl: Invert condition for predefined initfunctions in MAKE-INITFUNCTION 189c1c47 introduced compile-time type checking of initforms against declared slot types. The intention for MAKE-INITFUNCTION was to only use predefined initfunctions for NIL, T and 0 if typechecking was unnecessary, indicated by TYPE being T. However, MAKE-INITFUNCTION behaved in the opposite way before this change. --- src/pcl/defclass.lisp | 6 +++--- tests/clos.pure.lisp | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/pcl/defclass.lisp b/src/pcl/defclass.lisp index d870a46ee0..2d549d53c0 100644 --- a/src/pcl/defclass.lisp +++ b/src/pcl/defclass.lisp @@ -293,15 +293,15 @@ source-form) (cond ((and (or (eq initform t) (equal initform ''t)) - (neq type t)) + (eq type t)) '(function constantly-t)) ((and (or (eq initform nil) (equal initform ''nil)) - (neq type t)) + (eq type t)) '(function constantly-nil)) ((and (or (eql initform 0) (equal initform ''0)) - (neq type t)) + (eq type t)) '(function constantly-0)) (t (let* ((initform (if (eq type t) diff --git a/tests/clos.pure.lisp b/tests/clos.pure.lisp index 56b6564e60..43e916db85 100644 --- a/tests/clos.pure.lisp +++ b/tests/clos.pure.lisp @@ -39,6 +39,18 @@ (declare (ignore value)) (assert (not format-err))))) +(with-test (:name (defclass :initform type-error)) + (mapc (lambda (form) + (assert (nth-value 1 (checked-compile + `(lambda () ,form) :allow-warnings t)))) + '(;; Special-cased initforms + (defclass foo () ((%bar :type integer :initform t))) + (defclass foo () ((%bar :type integer :initform nil))) + (defclass foo () ((%bar :type boolean :initform 0))) + ;; Ordinary initforms + (defclass foo () ((%bar :type integer :initform (lisp-implementation-version)))) + (defclass foo () ((%bar :type boolean :initform (random 2))))))) + ;;; another not (user-)observable behaviour: make sure that ;;; sb-pcl::map-all-classes calls its function on each class once and ;;; exactly once. From 6ea003570acd91cc7fcb48b798df016cfefeacf4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 24 Aug 2020 16:20:01 -0400 Subject: [PATCH 0445/4023] Update random bits of text In searching for strings to remove along with the Alpha backend, I found obsolete references to what is and isn't supported: * The man page implied that SBCL runs on PPC-based Macs, but lacking any recent positive evidence, it's not worth making that claim. * base-target-features said that gencgc doesn't work on Sparc and PPC, but it does; similarly in make-config.sh. * efficiency.texinfo failed to mention 3 of the 64-bit platforms in the description of modular arithmetic functions. * SIGTRAP is used on CPUs other than Alpha, so generalize the comment. * Omit mention of Alpha in a few places so I don't have to make trivial edits again. (The text is fine with or without it) --- base-target-features.lisp-expr | 6 ------ doc/manual/efficiency.texinfo | 4 ++-- doc/sbcl.1 | 2 +- make-config.sh | 8 -------- src/code/final.lisp | 2 +- src/code/float-inf-nan.lisp | 2 +- src/runtime/interrupt.c | 4 ++-- 7 files changed, 7 insertions(+), 21 deletions(-) diff --git a/base-target-features.lisp-expr b/base-target-features.lisp-expr index fa73f67c0f..2fc413c107 100644 --- a/base-target-features.lisp-expr +++ b/base-target-features.lisp-expr @@ -51,12 +51,6 @@ ;; our dialect :sbcl - ;; Douglas Thomas Crosher's conservative generational GC (the only one - ;; we currently support for X86). - ;; :gencgc used to be here; CSR moved it into - ;; local-target-features.lisp-expr via make-config.sh, as alpha, - ;; sparc and ppc ports don't currently support it. -- CSR, 2002-02-21 - ;; ;; features present in this particular build ;; diff --git a/doc/manual/efficiency.texinfo b/doc/manual/efficiency.texinfo index db69d049f6..812babf0fe 100644 --- a/doc/manual/efficiency.texinfo +++ b/doc/manual/efficiency.texinfo @@ -262,8 +262,8 @@ with versions cutting results to 32 bits, and because terminals As of SBCL 0.8.5 ``good'' functions are @code{+}, @code{-}; @code{logand}, @code{logior}, @code{logxor}, @code{lognot} and their combinations; and @code{ash} with the positive second -argument. ``Good'' widths are 32 on HPPA, MIPS, PPC, Sparc and x86 and -64 on Alpha. While it is possible to support smaller widths as well, +argument. ``Good'' widths are 32 on 32-bit CPUs and 64 on 64-bit CPUs. +While it is possible to support smaller widths as well, currently this is not implemented. @node Global and Always-Bound variables diff --git a/doc/sbcl.1 b/doc/sbcl.1 index b1f9982cf3..0a79d70289 100644 --- a/doc/sbcl.1 +++ b/doc/sbcl.1 @@ -298,7 +298,7 @@ For more information about the compiler, see the user manual. .SH SYSTEM REQUIREMENTS SBCL currently runs on X86 (Linux, FreeBSD, OpenBSD, and NetBSD), -X86-64 (Linux), Alpha (Linux, Tru64), PPC (Linux, Darwin/MacOS X), +X86-64 (Linux), PPC (Linux), SPARC (Linux and Solaris 2.x), and MIPS (Linux). For information on other ongoing and possible ports, see the sbcl\-devel mailing list, and/or the web site. diff --git a/make-config.sh b/make-config.sh index 5caab92476..aa22a78174 100755 --- a/make-config.sh +++ b/make-config.sh @@ -624,14 +624,6 @@ cd "$original_dir" # (define-feature :c-stack-grows-downwards-not-upwards (features) # (member :x86 features)) -# KLUDGE: currently the x86 only works with the generational garbage -# collector (indicated by the presence of :GENCGC in *FEATURES*) and -# alpha, sparc and ppc with the stop'n'copy collector (indicated by -# the absence of :GENCGC in *FEATURES*). This isn't a great -# separation, but for now, rather than have :GENCGC in -# base-target-features.lisp-expr, we add it into local-target-features -# if we're building for x86. -- CSR, 2002-02-21 Then we do something -# similar with :STACK-GROWS-FOOWARD, too. -- WHN 2002-03-03 case "$sbcl_arch" in x86) if [ "$sbcl_os" = "win32" ]; then diff --git a/src/code/final.lisp b/src/code/final.lisp index 5df166257f..3678df4378 100644 --- a/src/code/final.lisp +++ b/src/code/final.lisp @@ -255,7 +255,7 @@ Examples: ;; so always load the vector again before dereferencing. (store **finalizer-store**) ;; I don't think we need a barrier; this has a data dependency - ;; on (CAR CELL) and STORE. (Alpha with threads, anyone?) + ;; on (CAR CELL) and STORE. (finalizers (svref store id))) ; [1] load (setf (svref store id) 0) ; [2] store ;; The ID can be reused right away. Link it into the recycle list, diff --git a/src/code/float-inf-nan.lisp b/src/code/float-inf-nan.lisp index 169b2085b7..ba68b5248a 100644 --- a/src/code/float-inf-nan.lisp +++ b/src/code/float-inf-nan.lisp @@ -98,7 +98,7 @@ (define-float-inf-or-nan-test float-trapping-nan-p "Return true if the float X is a trapping NaN (Not a Number)." ;; HPPA (and apparently MIPS) have trapping NaNs (SNaNs) with the - ;; trapping-nan-bit SET. PPC, SPARC, Alpha, and x86 (and presumably + ;; trapping-nan-bit SET. PPC, SPARC, and x86 (and presumably ;; x86-64, ARM, and ARM64) have trapping NaNs (SNaNs) with the ;; trapping-nan-bit CLEAR. Note that the given implementation ;; considers infinities to be FLOAT-TRAPPING-NAN-P on most diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index c16d8c42ca..5ef95e8224 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -33,10 +33,10 @@ * the value from interrupt_low_level_handlers[..], instead of the * ordinary interrupt_handle_now(..) or interrupt_handle_later(..). * - * o the SIGTRAP (Linux/Alpha) which Lisp code uses to handle breakpoints, + * o the SIGTRAP which Lisp code may uses to handle breakpoints, * pseudo-atomic sections, and some classes of error (e.g. "function * not defined"). This never goes anywhere near the Lisp handlers at all. - * See runtime/alpha-arch.c and code/signal.lisp + * See src/code/signal.lisp * * - WHN 20000728, dan 20010128 */ From 2c30813a8cc6c828437c863c35fc53c76f1161ad Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 26 Aug 2020 11:37:18 -0400 Subject: [PATCH 0446/4023] Use tempdir --- tests/futex-wait.test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/futex-wait.test.sh b/tests/futex-wait.test.sh index 996adeb3c1..e278ae9ebc 100755 --- a/tests/futex-wait.test.sh +++ b/tests/futex-wait.test.sh @@ -14,7 +14,7 @@ fi set -e -tracelog=$TEST_FILESTEM.out +tracelog=${TMPDIR:-/tmp}/$TEST_FILESTEM.out strace -f -e futex -e signal=\!sigsegv -o $tracelog \ $SBCL_RUNTIME --core "$SBCL_CORE" $SBCL_ARGS < Date: Fri, 28 Aug 2020 19:40:25 -0400 Subject: [PATCH 0447/4023] Unbreak #+sb-show, yet again --- src/cold/warm.lisp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 56efbed6d0..b16c7f8084 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -201,7 +201,16 @@ (search "undefined variable" (write-to-string c :escape nil))) (cerror "Finish warm compile ignoring the problem" c))))) - (with-compilation-unit () (do-srcs group))))))) + (with-compilation-unit () + (do-srcs group) + ;; I do not know why #+sb-show gets several "undefined-type CLASS" warnings + ;; that #-sb-show doesn't. And CLASS is a reserved name not defined as yet, + ;; so we have to pretend that didn't happen, otherwise the warning about + ;; not being able to define CLASS as a type name breaks the build. + #+sb-show + (setq sb-c::*undefined-warnings* + (delete 'class sb-c::*undefined-warnings* + :key #'sb-c::undefined-warning-name)))))))) (when (hash-table-p sb-c::*static-vop-usage-counts*) (with-open-file (output "output/warm-vop-usage.txt" From 2b4d786684d211a02c77424f116251e144f58ead Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Mon, 31 Aug 2020 11:52:56 +0100 Subject: [PATCH 0448/4023] Revert "pcl: Invert condition for predefined initfunctions in MAKE-INITFUNCTION" This change will mostly like return in the next development cycle, but it breaks compilation of a little too much, too late in this cycle for comfort. This reverts commit 16b55d78d1847acc31a7ae3032a348be26d076fe. --- src/pcl/defclass.lisp | 6 +++--- tests/clos.pure.lisp | 12 ------------ 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/pcl/defclass.lisp b/src/pcl/defclass.lisp index 2d549d53c0..d870a46ee0 100644 --- a/src/pcl/defclass.lisp +++ b/src/pcl/defclass.lisp @@ -293,15 +293,15 @@ source-form) (cond ((and (or (eq initform t) (equal initform ''t)) - (eq type t)) + (neq type t)) '(function constantly-t)) ((and (or (eq initform nil) (equal initform ''nil)) - (eq type t)) + (neq type t)) '(function constantly-nil)) ((and (or (eql initform 0) (equal initform ''0)) - (eq type t)) + (neq type t)) '(function constantly-0)) (t (let* ((initform (if (eq type t) diff --git a/tests/clos.pure.lisp b/tests/clos.pure.lisp index 43e916db85..56b6564e60 100644 --- a/tests/clos.pure.lisp +++ b/tests/clos.pure.lisp @@ -39,18 +39,6 @@ (declare (ignore value)) (assert (not format-err))))) -(with-test (:name (defclass :initform type-error)) - (mapc (lambda (form) - (assert (nth-value 1 (checked-compile - `(lambda () ,form) :allow-warnings t)))) - '(;; Special-cased initforms - (defclass foo () ((%bar :type integer :initform t))) - (defclass foo () ((%bar :type integer :initform nil))) - (defclass foo () ((%bar :type boolean :initform 0))) - ;; Ordinary initforms - (defclass foo () ((%bar :type integer :initform (lisp-implementation-version)))) - (defclass foo () ((%bar :type boolean :initform (random 2))))))) - ;;; another not (user-)observable behaviour: make sure that ;;; sb-pcl::map-all-classes calls its function on each class once and ;;; exactly once. From 8c1fc15c1d68f9ddcd769e577afd4816b811ecc0 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Mon, 31 Aug 2020 12:08:24 +0100 Subject: [PATCH 0449/4023] NEWS for sbcl-2.0.8 --- NEWS | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/NEWS b/NEWS index 704947a231..74d2ef325e 100644 --- a/NEWS +++ b/NEWS @@ -1,9 +1,23 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.0.7: + * platform support: + ** added support for NetBSD/ARM64; + ** threads on Linux now have OS-visible names; + ** removed unnecessary emulation of pthread functions on Windows; + ** work around a sigwait() bug on Mac OS X; + ** allow safepoint build on Mac OS X, though it probably doesn't + work very well (reported by Chris Wagner, lp#1382811) + ** removed stub support for HPUX. * optimization: SB-THREAD:MAKE-THREAD is faster on most platforms. * optimization: faster RATIONAL when the result is a RATIO. * optimization: improved cross-type comparisons (float/ratio/bignum). + * bug fix: EQUALP on pathnames was wrong + * bug fixes: fix compiler issues in: + ** COUNT (lp#1889391) + ** VECTOR-LENGTH (lp#1888919) + ** constant-folding (lp#1888384) + ** FIND and POSITION (lp#1887316) changes in sbcl-2.0.7 relative to sbcl-2.0.6: * minor incompatible change: SB-THREAD:THREAD-OS-TID returns NIL for From 646e0f0d2c10b9fc397bc1d2e665dcbbf76012b4 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Mon, 31 Aug 2020 12:26:13 +0100 Subject: [PATCH 0450/4023] 2.0.8: will be tagged as "sbcl-2.0.8" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 74d2ef325e..1dc91779c6 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.0.7: +changes in sbcl-2.0.8 relative to sbcl-2.0.7: * platform support: ** added support for NetBSD/ARM64; ** threads on Linux now have OS-visible names; From 987da0e4f947d7db750203bc8f8c83213423623f Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 31 Aug 2020 19:09:02 +0300 Subject: [PATCH 0451/4023] Move sb-pcl deprecation to the next stage. --- src/pcl/fixup.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pcl/fixup.lisp b/src/pcl/fixup.lisp index ad8fe1396e..13f1c57481 100644 --- a/src/pcl/fixup.lisp +++ b/src/pcl/fixup.lisp @@ -116,4 +116,4 @@ standard-reader-method standard-slot-definition standard-writer-method update-dependent validate-superclass writer-method-class)) - (sb-impl::deprecate-export *package* symbol :early "2.0.7")) + (sb-impl::deprecate-export *package* symbol :late "2.0.7")) From e45974099a33b584182c0eebb1e9fd29146ddd8e Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Mon, 31 Aug 2020 17:38:50 +0100 Subject: [PATCH 0452/4023] pcl: Invert condition for predefined initfunctions in MAKE-INITFUNCTION 189c1c47 introduced compile-time type checking of initforms against declared slot types. The intention for MAKE-INITFUNCTION was to only use predefined initfunctions for NIL, T and 0 if typechecking was unnecessary, indicated by TYPE being T. However, MAKE-INITFUNCTION behaved in the opposite way before this change. This reverts commit 2b4d786684d211a02c77424f116251e144f58ead. --- src/pcl/defclass.lisp | 6 +++--- tests/clos.pure.lisp | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/pcl/defclass.lisp b/src/pcl/defclass.lisp index d870a46ee0..2d549d53c0 100644 --- a/src/pcl/defclass.lisp +++ b/src/pcl/defclass.lisp @@ -293,15 +293,15 @@ source-form) (cond ((and (or (eq initform t) (equal initform ''t)) - (neq type t)) + (eq type t)) '(function constantly-t)) ((and (or (eq initform nil) (equal initform ''nil)) - (neq type t)) + (eq type t)) '(function constantly-nil)) ((and (or (eql initform 0) (equal initform ''0)) - (neq type t)) + (eq type t)) '(function constantly-0)) (t (let* ((initform (if (eq type t) diff --git a/tests/clos.pure.lisp b/tests/clos.pure.lisp index 56b6564e60..43e916db85 100644 --- a/tests/clos.pure.lisp +++ b/tests/clos.pure.lisp @@ -39,6 +39,18 @@ (declare (ignore value)) (assert (not format-err))))) +(with-test (:name (defclass :initform type-error)) + (mapc (lambda (form) + (assert (nth-value 1 (checked-compile + `(lambda () ,form) :allow-warnings t)))) + '(;; Special-cased initforms + (defclass foo () ((%bar :type integer :initform t))) + (defclass foo () ((%bar :type integer :initform nil))) + (defclass foo () ((%bar :type boolean :initform 0))) + ;; Ordinary initforms + (defclass foo () ((%bar :type integer :initform (lisp-implementation-version)))) + (defclass foo () ((%bar :type boolean :initform (random 2))))))) + ;;; another not (user-)observable behaviour: make sure that ;;; sb-pcl::map-all-classes calls its function on each class once and ;;; exactly once. From a2c14b1a18f5b50624e2865e533a945db3d3baa0 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Mon, 31 Aug 2020 17:41:14 +0100 Subject: [PATCH 0453/4023] NEWS item for enhanced initform checks --- NEWS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS b/NEWS index 1dc91779c6..7311d69193 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,10 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- +changes relative to sbcl-2.0.8: + * minor incompatible change: the compiler signals a warning at + compile-time when an initform of T, NIL or 0 does not match a + STANDARD-CLASS slot's declared type. + changes in sbcl-2.0.8 relative to sbcl-2.0.7: * platform support: ** added support for NetBSD/ARM64; From 914231fdb51245c3f980282eb5b3270d86efc3ac Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 31 Aug 2020 13:14:23 -0400 Subject: [PATCH 0454/4023] Remove Alpha, part 1 of 2 Edit out conditionalized bits from machine-independent files. --- NEWS | 1 + base-target-features.lisp-expr | 2 -- build-order.lisp-expr | 1 - crossbuild-runner/build-all.sh | 4 ++-- make-config.sh | 7 +++--- make-host-1.lisp | 3 +-- src/assembly/assemfile.lisp | 8 +++---- src/code/alieneval.lisp | 8 +++---- src/code/bit-bash.lisp | 10 +-------- src/code/debug-int.lisp | 20 +++-------------- src/code/float-trap.lisp | 8 +++---- src/code/foreign.lisp | 2 +- src/code/simple-fun.lisp | 2 +- src/cold/shared.lisp | 2 +- src/cold/shebang.lisp | 2 +- src/compiler/generic/objdef.lisp | 18 +++++++-------- src/compiler/generic/vm-fndb.lisp | 2 +- src/compiler/generic/vm-macs.lisp | 17 ++------------ src/compiler/ir2tran.lisp | 2 +- src/runtime/backtrace.c | 16 -------------- src/runtime/core.h | 4 ---- src/runtime/coreparse.c | 6 ----- src/runtime/globals.h | 6 ----- src/runtime/interrupt.c | 2 +- src/runtime/linux-mman.c | 27 ----------------------- src/runtime/linux-os.c | 16 -------------- src/runtime/monitor.c | 8 ------- src/runtime/print.c | 12 +--------- src/runtime/runtime.c | 6 ----- src/runtime/runtime.h | 16 +------------- tests/alien.impure.lisp | 3 +-- tests/compiler.impure.lisp | 2 +- tests/compiler.pure.lisp | 2 +- tests/foreign-stack-alignment.impure.lisp | 1 - tools-for-build/ldso-stubs.lisp | 12 ---------- 35 files changed, 46 insertions(+), 212 deletions(-) diff --git a/NEWS b/NEWS index 7311d69193..bc43d4b676 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.0.8: + * incompatible change: DEC Alpha support has been removed. * minor incompatible change: the compiler signals a warning at compile-time when an initform of T, NIL or 0 does not match a STANDARD-CLASS slot's declared type. diff --git a/base-target-features.lisp-expr b/base-target-features.lisp-expr index 2fc413c107..a5a9ea1adf 100644 --- a/base-target-features.lisp-expr +++ b/base-target-features.lisp-expr @@ -352,8 +352,6 @@ ;; any Intel 386 or better, or compatibles like the AMD K6 or K7 ;; :x86-64 ;; any x86-64 CPU running in 64-bit mode - ;; :alpha - ;; DEC/Compaq Alpha CPU ;; :sparc ;; any Sun UltraSPARC (possibly also non-Ultras -- currently untested) ;; :ppc diff --git a/build-order.lisp-expr b/build-order.lisp-expr index ad380c9d4b..f4b052414d 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -317,7 +317,6 @@ #+x86-64("src/code/x86-64-vm" :not-host) #+(or ppc ppc64) ("src/code/ppc-vm") - #+alpha ("src/code/alpha-vm") #+mips ("src/code/mips-vm") #+arm ("src/code/arm-vm") #+arm64 ("src/code/arm64-vm") diff --git a/crossbuild-runner/build-all.sh b/crossbuild-runner/build-all.sh index b9b65b3d16..be0e70617d 100755 --- a/crossbuild-runner/build-all.sh +++ b/crossbuild-runner/build-all.sh @@ -9,7 +9,7 @@ set -e # or a host machine on which to run its native compiler. if [ -z "$*" ]; then - targets="alpha arm arm64 hppa mips ppc ppc64 riscv sparc x86 x86-64" + targets="arm arm64 hppa mips ppc ppc64 riscv sparc x86 x86-64" else targets="$@" fi @@ -31,7 +31,7 @@ do cat crossbuild-runner/backends/$arch/features >> $ltf cat crossbuild-runner/backends/$arch/local-target-features >> $ltf case "$arch" in - alpha | hppa) ;; + hppa) ;; *) echo ':linkage-table' >> $ltf esac echo ')))' >> $ltf diff --git a/make-config.sh b/make-config.sh index aa22a78174..5132bbcb37 100755 --- a/make-config.sh +++ b/make-config.sh @@ -360,7 +360,6 @@ case `uname -m` in i86pc) guessed_sbcl_arch=x86 ;; *x86_64) guessed_sbcl_arch=x86-64 ;; amd64) guessed_sbcl_arch=x86-64 ;; - [Aa]lpha) guessed_sbcl_arch=alpha ;; sparc*) guessed_sbcl_arch=sparc ;; sun*) guessed_sbcl_arch=sparc ;; *ppc) guessed_sbcl_arch=ppc ;; @@ -700,10 +699,10 @@ case "$sbcl_arch" in ;; esac -# There are only two architectures that don't have linkage tables, -# and they also don't run for half a dozen other reasons. +# There is only one architecture that doesn't have :linkage-table +# and also doesn't run for half a dozen other reasons. case "$sbcl_arch" in - alpha | hppa) ;; + hppa) ;; *) printf ' :linkage-table' >> $ltf esac diff --git a/make-host-1.lisp b/make-host-1.lisp index 7c141e8ed8..290b590111 100644 --- a/make-host-1.lisp +++ b/make-host-1.lisp @@ -14,8 +14,7 @@ ;; because we generate it using Lisp code, and we don't presume the target ;; to have a lisp implementation. So we generate it on the host by knowing ;; something about which Config files depend on ldso-stubs. - (when (or (member :alpha sb-xc:*features*) - (member :hppa sb-xc:*features*)) + (when (member :hppa sb-xc:*features*) (let ((*readtable* *xc-readtable*)) (load "tools-for-build/ldso-stubs.lisp"))) (setf *host-obj-prefix* "obj/from-host/") diff --git a/src/assembly/assemfile.lisp b/src/assembly/assemfile.lisp index b1478fd283..322bf10b82 100644 --- a/src/assembly/assemfile.lisp +++ b/src/assembly/assemfile.lisp @@ -226,15 +226,15 @@ :key #'car) (:generator ,cost ,@(mapcar (lambda (arg) - #+(or hppa alpha) `(move ,(reg-spec-name arg) + #+(or hppa) `(move ,(reg-spec-name arg) ,(reg-spec-temp arg)) - #-(or hppa alpha) `(move ,(reg-spec-temp arg) + #-(or hppa) `(move ,(reg-spec-temp arg) ,(reg-spec-name arg))) args) ,@call-sequence ,@(mapcar (lambda (res) - #+(or hppa alpha) `(move ,(reg-spec-temp res) + #+(or hppa) `(move ,(reg-spec-temp res) ,(reg-spec-name res)) - #-(or hppa alpha) `(move ,(reg-spec-name res) + #-(or hppa) `(move ,(reg-spec-name res) ,(reg-spec-temp res))) results)))))) diff --git a/src/code/alieneval.lisp b/src/code/alieneval.lisp index 2af3df4b8f..b457b3cab6 100644 --- a/src/code/alieneval.lisp +++ b/src/code/alieneval.lisp @@ -516,18 +516,18 @@ ;; of return values and override the naturalize method to perform ;; the sign extension (in compiler/target/c-call.lisp). (ecase context - ((:normal #-(or alpha x86 x86-64) :result) + ((:normal #-(or x86 x86-64) :result) (list (if (alien-integer-type-signed type) 'signed-byte 'unsigned-byte) (alien-integer-type-bits type))) - #+(or alpha x86 x86-64) + #+(or x86 x86-64) (:result (list (if (alien-integer-type-signed type) 'signed-byte 'unsigned-byte) (max (alien-integer-type-bits type) sb-vm:n-machine-word-bits))))) ;;; As per the comment in the :ALIEN-REP method above, this is defined -;;; elsewhere for alpha and x86oids. -#-(or alpha x86 x86-64) +;;; elsewhere for x86oids. +#-(or x86 x86-64) (define-alien-type-method (integer :naturalize-gen) (type alien) (declare (ignore type)) alien) diff --git a/src/code/bit-bash.lisp b/src/code/bit-bash.lisp index 965fb66823..90e9392cfd 100644 --- a/src/code/bit-bash.lisp +++ b/src/code/bit-bash.lisp @@ -138,15 +138,7 @@ (values system-area-pointer index)) (let ((address (sap-int sap)) (word-mask (1- (ash 1 word-shift)))) - (values (int-sap #-alpha (word-logical-andc2 address word-mask) - ;; KLUDGE: WORD-LOGICAL-ANDC2 is defined in - ;; terms of n-word-bits. On all systems - ;; where n-word-bits is not equal to - ;; n-machine-word-bits we have to do this - ;; another way. At this time, these - ;; systems are alphas, though there was - ;; some talk about an x86-64 build option. - #+alpha (ash (ash address (- word-shift)) word-shift)) + (values (int-sap (word-logical-andc2 address word-mask)) (+ ,(ecase bitsize ((1 2 4) `(* (logand address word-mask) (/ n-byte-bits ,bitsize))) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 694860f6a2..2ef411f209 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -959,10 +959,7 @@ ;; the C safepoint page (/ sb-c:+backend-page-bytes+ n-word-bytes))) (context-pointer - ;; The Alpha code is quite possibly wrong; I have no idea. - (sb-vm::current-thread-offset-sap - #-alpha n - #+alpha (* 2 n)))) + (sb-vm::current-thread-offset-sap n))) (sb-alien:sap-alien context-pointer (* os-context-t)))) ;;; With :LINKAGE-TABLE symbols which come from the runtime go through @@ -2386,13 +2383,8 @@ register." (int-sap (sb-vm:context-register escaped sb-vm::nfp-offset)) - #-alpha (sap-ref-sap fp (* nfp-save-offset - sb-vm:n-word-bytes)) - #+alpha - (sb-vm::make-number-stack-pointer - (sap-ref-32 fp (* nfp-save-offset - sb-vm:n-word-bytes)))))) + sb-vm:n-word-bytes))))) ,@body)) (number-stack-offset (&optional (offset 0)) #+(or x86 x86-64) @@ -2567,15 +2559,9 @@ register." (int-sap (sb-vm:context-register escaped sb-vm::nfp-offset)) - #-alpha (sap-ref-sap fp (* nfp-save-offset - sb-vm:n-word-bytes)) - #+alpha - (sb-vm::make-number-stack-pointer - (sap-ref-32 fp - (* nfp-save-offset - sb-vm:n-word-bytes)))))) + sb-vm:n-word-bytes))))) ,@body)) (number-stack-offset (&optional (offset 0)) #+(or x86 x86-64) diff --git a/src/code/float-trap.lisp b/src/code/float-trap.lisp index 8c111f67d2..720cef1a81 100644 --- a/src/code/float-trap.lisp +++ b/src/code/float-trap.lisp @@ -48,10 +48,10 @@ names))) ) ; EVAL-WHEN -;;; interpreter stubs for floating point modes get/setters for the -;;; alpha have been removed to alpha-vm.lisp, as they are implemented -;;; in C rather than as VOPs. Likewise for x86-64 and mips. -#-(or alpha x86-64 mips) +;;; interpreter stubs for floating point modes get/setters for +;;; some architectures have been removed, as they are implemented +;;; in C rather than as VOPs. +#-(or x86-64 mips) (progn (defun floating-point-modes () (floating-point-modes)) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 6a30c9cb5f..ade1a69a6a 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -70,7 +70,7 @@ if the symbol isn't found." ;;; Cleanups before saving a core (defun foreign-deinit () - #+(and os-provides-dlopen (not linkage-table)) ; at most HPPA and Alpha now + #+(and os-provides-dlopen (not linkage-table)) ; at most HPPA (when (dynamic-foreign-symbols-p) (warn "~@ (length arch) 1) (error "More than one architecture selected"))) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index ca45f86719..fb98b2e233 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -48,7 +48,7 @@ (define-primitive-object (bignum :lowtag other-pointer-lowtag :widetag bignum-widetag :alloc-trans sb-bignum:%allocate-bignum) - (digits :rest-p t :c-type #-alpha "sword_t" #+alpha "u32")) + (digits :rest-p t :c-type "sword_t")) (define-primitive-object (ratio :type ratio :lowtag other-pointer-lowtag @@ -140,7 +140,7 @@ ;; VECTOR -- see SHRINK-VECTOR. (length :ref-trans sb-c::vector-length :type index) - (data :rest-p t :c-type #-alpha "uword_t" #+alpha "u32")) + (data :rest-p t :c-type "uword_t")) #| Code header representation: @@ -235,7 +235,7 @@ during backtrace. ;; pertain to undefined functions, FINs, and closures. ;; - all others store a native pointer to the function entry address ;; or closure tramp - (raw-addr :c-type #-alpha "char *" #+alpha "u32")) + (raw-addr :c-type "char *")) ;;; a simple function (as opposed to hairier things like closures ;;; which are also subtypes of Common Lisp's FUNCTION type) @@ -316,7 +316,7 @@ during backtrace. :alloc-trans make-weak-pointer) (value :ref-trans %weak-pointer-value :ref-known (flushable) :init :arg) - (next :c-type #-alpha "struct weak_pointer *" #+alpha "u32")) + (next :c-type "struct weak_pointer *")) ;;;; other non-heap data blocks @@ -325,8 +325,8 @@ during backtrace. symbol) ;; on sb-thread, this is actually a tls-index (define-primitive-object (unwind-block) - (uwp :c-type #-alpha "struct unwind_block *" #+alpha "u32") - (cfp :c-type #-alpha "lispobj *" #+alpha "u32") + (uwp :c-type "struct unwind_block *") + (cfp :c-type "lispobj *") #-(or x86 x86-64) code entry-pc #+(and win32 x86) next-seh-frame @@ -337,8 +337,8 @@ during backtrace. #+unbind-in-unwind current-catch) (define-primitive-object (catch-block) - (uwp :c-type #-alpha "struct unwind_block *" #+alpha "u32") - (cfp :c-type #-alpha "lispobj *" #+alpha "u32") + (uwp :c-type "struct unwind_block *") + (cfp :c-type "lispobj *") #-(or x86 x86-64) code entry-pc #+(and win32 x86) next-seh-frame @@ -346,7 +346,7 @@ during backtrace. #+(and unbind-in-unwind (not c-stack-is-control-stack)) nfp #+(and unbind-in-unwind (not c-stack-is-control-stack)) nsp #+unbind-in-unwind bsp - (previous-catch :c-type #-alpha "struct catch_block *" #+alpha "u32") + (previous-catch :c-type "struct catch_block *") tag) ;;;; symbols diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 0df99b9f8c..c877fad8a7 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -535,7 +535,7 @@ ;;; Extract a 4-byte element relative to the end of CODE-OBJ. ;;; The index should be strictly negative and a multiple of 4. (defknown code-trailer-ref (code-component fixnum) (unsigned-byte 32) - (flushable #-(or sparc alpha hppa ppc64) always-translatable)) + (flushable #-(or sparc hppa ppc64) always-translatable)) (defknown fun-subtype (function) (member . #.sb-vm::+function-widetags+) (flushable)) diff --git a/src/compiler/generic/vm-macs.lisp b/src/compiler/generic/vm-macs.lisp index 685dfa1e94..23516f4940 100644 --- a/src/compiler/generic/vm-macs.lisp +++ b/src/compiler/generic/vm-macs.lisp @@ -88,20 +88,7 @@ pointer &allow-other-keys) (if (atom spec) (list spec) spec) - #-alpha (declare (ignorable pointer)) - #+alpha - (when pointer - ;; Pointer values on ALPHA are 64 bits wide, and - ;; double-word aligned. We may also wish to have such a - ;; mode for other 64-bit hardware outside of any defined - ;; 32-on-64 ABI (which would presumably have 32-bit - ;; pointers in the first place, obviating the alignment - ;; and size requirements). - (unless rest-p - (setf length 2)) - (when (oddp offset) - (incf offset))) (slots `(make-slot ',slot-name ,rest-p ,offset ',special ',(remove-keywords options '(:rest-p :length)))) (let ((offset-sym (symbolicate name "-" slot-name @@ -194,8 +181,8 @@ (deftype sc-offset () `(integer 0 (,sc-offset-limit))) (defconstant finite-sc-offset-limit - #-(or sparc alpha hppa) 32 - #+(or sparc alpha hppa) 64) + #-(or sparc hppa) 32 + #+(or sparc hppa) 64) (defconstant finite-sc-offset-bits (integer-length (1- finite-sc-offset-limit))) (deftype finite-sc-offset () `(integer 0 (,finite-sc-offset-limit))) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 6c42d25a91..7fe12a2629 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -1352,7 +1352,7 @@ ;; not all backends have been updated yet. On backends ;; that have not been updated, we still need to use ;; XEP-SETUP-SP here. - #+(or alpha hppa mips sparc) + #+(or hppa mips sparc) (vop xep-setup-sp node block) (vop copy-more-arg node block (optional-dispatch-max-args ef) #+x86-64 verified)) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 2583970ec3..ffaadc041e 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -208,28 +208,16 @@ print_entry_points (struct code *code, FILE *f) * better not change. */ struct call_frame { -#ifndef LISP_FEATURE_ALPHA struct call_frame *old_cont; -#else - u32 old_cont; -#endif lispobj saved_lra; lispobj code; lispobj other_state[5]; }; struct call_info { -#ifndef LISP_FEATURE_ALPHA struct call_frame *frame; -#else - u32 frame; -#endif int interrupted; -#ifndef LISP_FEATURE_ALPHA struct code *code; -#else - u32 code; -#endif lispobj lra; int pc; /* Note: this is the trace file offset, not the actual pc. */ }; @@ -312,11 +300,7 @@ call_info_from_context(struct call_info *info, os_context_t *context) } if (info->code != NULL) info->pc = pc - (uword_t) info->code - -#ifndef LISP_FEATURE_ALPHA (HEADER_LENGTH(info->code->header) * sizeof(lispobj)); -#else - (HEADER_LENGTH(((struct code *)info->code)->header) * sizeof(lispobj)); -#endif else info->pc = 0; } diff --git a/src/runtime/core.h b/src/runtime/core.h index 6e06524183..5a87fd26d7 100644 --- a/src/runtime/core.h +++ b/src/runtime/core.h @@ -15,11 +15,7 @@ #include "sbcl.h" #include "runtime.h" -#ifdef LISP_FEATURE_ALPHA -typedef u32 core_entry_elt_t; -#else typedef sword_t core_entry_elt_t; -#endif struct ndir_entry { core_entry_elt_t identifier; diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 04cd8a51dd..1d98e40ba4 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -864,13 +864,7 @@ process_directory(int count, struct ndir_entry *entry, DYNAMIC_0_SPACE_START = addr = semispace_0_start; current_dynamic_space = (lispobj*)addr; // Request that much again now -#ifdef LISP_FEATURE_ALPHA /* meaning: is this a 32-on-64 SBCL implementation */ - uword_t addr1 = (uword_t)os_validate(MOVABLE_LOW, 0, request); - extern os_set_cheneygc_spaces(uword_t,uword_t); - os_set_cheneygc_spaces(addr, addr1); -#else uword_t addr1 = (uword_t)os_allocate(request); -#endif uword_t semispace_1_start = ALIGN_UP(addr1, BACKEND_PAGE_BYTES); uword_t semispace_1_end = ALIGN_DOWN(addr1 + request, BACKEND_PAGE_BYTES); diff --git a/src/runtime/globals.h b/src/runtime/globals.h index 5a434003e0..64a41c3440 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -125,12 +125,6 @@ extern void globals_init(void); # endif # endif /**/ -# ifdef LISP_FEATURE_ALPHA -# ifdef __linux__ -# define EXTERN(name) .globl name -# endif -# endif -/**/ # if defined(LISP_FEATURE_PPC) || defined(LISP_FEATURE_PPC64) # ifdef LISP_FEATURE_DARWIN # define EXTERN(name) .globl _ ## name diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 5ef95e8224..4e9adf8291 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -800,7 +800,7 @@ fake_foreign_function_call(os_context_t *context) (*os_context_register_addr(context, reg_ALLOC)); /* fprintf(stderr,"dynamic_space_free_pointer: %p\n", */ /* dynamic_space_free_pointer); */ -#if defined(LISP_FEATURE_ALPHA) || defined(LISP_FEATURE_MIPS) +#if defined(LISP_FEATURE_MIPS) if ((sword_t)dynamic_space_free_pointer & 1) { lose("dead in fake_foreign_function_call, context = %x", context); } diff --git a/src/runtime/linux-mman.c b/src/runtime/linux-mman.c index 5b35124a0c..b4a9d524bc 100644 --- a/src/runtime/linux-mman.c +++ b/src/runtime/linux-mman.c @@ -8,22 +8,6 @@ #include "os.h" #include "interr.h" -#ifdef LISP_FEATURE_ALPHA -/* The Alpha is a 64 bit CPU. SBCL is a 32 bit application. Due to all - * the places that assume we can get a pointer into a fixnum with no - * information loss, we have to make sure it allocates all its ram in the - * 0-2Gb region. */ - -static void * under_2gb_free_pointer; -os_set_cheneygc_spaces(uword_t space0_start, uword_t space1_start) -{ - uword_t max; - max = (space1_start > space0_start) ? space1_start : space0_start; - under_2gb_free_pointer = max + dynamic_space_size; -} - -#endif - os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len) { @@ -32,11 +16,6 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len) int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE; os_vm_address_t actual; -#ifdef LISP_FEATURE_ALPHA - if (!addr) { - addr=under_2gb_free_pointer; - } -#endif #ifdef MAP_32BIT if (attributes & ALLOCATE_LOW) flags |= MAP_32BIT; @@ -62,12 +41,6 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len) return 0; } -#ifdef LISP_FEATURE_ALPHA - - len=(len+(os_vm_page_size-1))&(~(os_vm_page_size-1)); - under_2gb_free_pointer+=len; -#endif - return actual; } diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index c7986c7398..3a1067dca5 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -385,22 +385,6 @@ sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) { os_vm_address_t addr = arch_get_bad_addr(signal, info, context); -#ifdef LISP_FEATURE_ALPHA - /* Alpha stuff: This is the end of a pseudo-atomic section during - which a signal was received. We must deal with the pending - interrupt (see also interrupt.c, ../code/interrupt.lisp) - - (how we got here: when interrupting, we set bit 63 in reg_ALLOC. - At the end of the atomic section we tried to write to reg_ALLOC, - got a SIGSEGV (there's nothing mapped there) so ended up here. */ - if (addr != NULL && - *os_context_register_addr(context, reg_ALLOC) & (1L<<63)) { - *os_context_register_addr(context, reg_ALLOC) -= (1L<<63); - interrupt_handle_pending(context); - return; - } -#endif - #ifdef LISP_FEATURE_SB_SAFEPOINT if (!handle_safepoint_violation(context, addr)) #endif diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 8133ad03ea..919f03abd9 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -151,17 +151,9 @@ dump_cmd(char **ptr) lispobj* next_object = decode ? (lispobj*)addr : 0; while (count-- > 0) { -#ifndef LISP_FEATURE_ALPHA printf("%p: ", (os_vm_address_t) addr); -#else - printf("0x%08X: ", (u32) addr); -#endif if (force || gc_managed_addr_p((lispobj)addr)) { -#ifndef LISP_FEATURE_ALPHA unsigned long *lptr = (unsigned long *)addr; -#else - u32 *lptr = (u32 *)addr; -#endif unsigned char *cptr = (unsigned char *)addr; #if N_WORD_BYTES == 8 diff --git a/src/runtime/print.c b/src/runtime/print.c index e7da54a976..db5e178b68 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -289,12 +289,7 @@ static void print_unknown(lispobj obj) printf("unknown object: %p", (void *)obj); } -/* Except for Alpha, we define sword_t as intptr_t, and 32-bit Darwin - * defines intptr_t as long, so the printf conversion is "ld", not "d". - * Alpha (32-on-64) defines sword_t as s32, so we need just "d". */ -#ifdef LISP_FEATURE_ALPHA -# define OBJ_FMTd "d" -#elif defined(PRIdPTR) +#ifdef PRIdPTR # define OBJ_FMTd PRIdPTR #else # error "Your inttypes.h is lame" @@ -587,13 +582,8 @@ lispobj symbol_function(lispobj* symbol) static void print_fun_or_otherptr(lispobj obj) { -#ifndef LISP_FEATURE_ALPHA lispobj *ptr; unsigned long header; -#else - u32 *ptr; - u32 header; -#endif int count, type, index; char buffer[16]; diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 8c78450738..b21a257181 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -590,12 +590,6 @@ sbcl_main(int argc, char *argv[], char *envp[]) print_environment(argc, argv); } dyndebug_init(); -#ifdef LISP_FEATURE_ALPHA // When we remove Alpha, this #if can go away - /* KLUDGE: os_vm_page_size is set by os_init(), and on some - * systems (e.g. Alpha) arch_init() needs need os_vm_page_size, so - * it must follow os_init(). -- WHN 2000-01-26 */ - arch_init(); -#endif // FIXME: if the 'have' flag is 0 and you've disabled disabling of ASLR // then we haven't done an exec(), nor unmapped the mappings that were obtained // already obtained (if any) so it is unhelpful to try again here. diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index d0ed33e3d6..034b8ad381 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -212,27 +212,13 @@ typedef pthread_t os_thread_t; typedef pid_t os_thread_t; #endif -#ifndef LISP_FEATURE_ALPHA typedef uintptr_t uword_t; typedef intptr_t sword_t; -#else -/* The alpha32 port uses non-intptr-sized words */ -typedef u32 uword_t; -typedef s32 sword_t; -#endif -/* FIXME: we do things this way because of the alpha32 port. once - alpha64 has arrived, all this nastiness can go away */ -#if 64 == N_WORD_BITS +/* FIXME: remove LOW_WORD macro */ #define LOW_WORD(c) ((uintptr_t)c) #define OBJ_FMTX PRIxPTR typedef uintptr_t lispobj; -#else -#define OBJ_FMTX "x" -#define LOW_WORD(c) ((long)(c) & 0xFFFFFFFFL) -/* fake it on alpha32 */ -typedef unsigned int lispobj; -#endif static inline int lowtag_of(lispobj obj) diff --git a/tests/alien.impure.lisp b/tests/alien.impure.lisp index ff8c86789e..afdcb76615 100644 --- a/tests/alien.impure.lisp +++ b/tests/alien.impure.lisp @@ -375,8 +375,7 @@ ;;; Skip for MSAN. Instead of returning 0, the intercepted malloc is configured ;;; to cause process termination by default on failure to allocate memory. (with-test (:name :malloc-failure - :skipped-on :msan - :fails-on :alpha) ;; Alpha has address space to burn + :skipped-on :msan) (assert (eq :enomem (handler-case (loop repeat 128 diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index 2cdfe689d8..f0b34d8b78 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -955,7 +955,7 @@ ;;;; MUFFLE-CONDITIONS test (corresponds to the test in the manual) ; FIXME: make a better test! -(with-test (:name muffle-conditions :skipped-on (or :alpha :ppc64 :x86-64)) +(with-test (:name muffle-conditions :skipped-on (or :ppc64 :x86-64)) (multiple-value-bind (fun failure-p warnings style-warnings notes) (checked-compile '(lambda (x) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index d3a3ebffb7..70d4b32fb8 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -4988,7 +4988,7 @@ x)))) (with-test (:name (compile :copy-more-arg) - :fails-on (or :alpha :hppa :mips :sparc)) + :fails-on (or :hppa :mips :sparc)) ;; copy-more-arg might not copy in the right direction ;; when there are more fixed args than stack frame slots, ;; and thus end up splatting a single argument everywhere. diff --git a/tests/foreign-stack-alignment.impure.lisp b/tests/foreign-stack-alignment.impure.lisp index a4b89a210d..02a94fd8c7 100644 --- a/tests/foreign-stack-alignment.impure.lisp +++ b/tests/foreign-stack-alignment.impure.lisp @@ -36,7 +36,6 @@ #+(and ppc (not darwin)) 8 #+(or arm64 x86 x86-64 riscv ppc64) 16 #+sparc 8 - #+alpha 16 #+hppa 64 (error "Unknown platform"))) diff --git a/tools-for-build/ldso-stubs.lisp b/tools-for-build/ldso-stubs.lisp index cf66330df1..f4e14f41ca 100644 --- a/tools-for-build/ldso-stubs.lisp +++ b/tools-for-build/ldso-stubs.lisp @@ -46,15 +46,6 @@ #endif #include \"sbcl.h\"" -#+(and linux alpha) " -#define LDSO_STUBIFY(fct) \\ -.globl ldso_stub__ ## fct ; \\ - .type ldso_stub__ ## fct,@function ; \\ -ldso_stub__ ## fct: ; \\ - jmp fct ; \\ -.L ## fct ## e1: ; \\ - .size ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;" - #+hppa " .level 2.0 .text" @@ -174,9 +165,6 @@ ldso_stub__ ## fct: ; \\ "log" "log10" "sqrt") - #+alpha - '("ieee_get_fp_control" - "ieee_set_fp_control") ;; FIXME: After 1.0 this should be made ;; #-linkage-table, as we only need these stubs if ;; we don't have linkage-table. Done this way now to From bb3bf6b8e2f01c328979e437874ebbe32f000055 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 31 Aug 2020 15:35:11 -0400 Subject: [PATCH 0455/4023] Remove Alpha, part 2 of 2. Delete all the architecture-specific files in one fell swoop. --- crossbuild-runner/backends/alpha/features | 2 - .../backends/alpha/local-target-features | 1 - .../alpha/stuff-groveled-from-headers.lisp | 145 -- src/assembly/alpha/alloc.lisp | 17 - src/assembly/alpha/arith.lisp | 418 ------ src/assembly/alpha/array.lisp | 42 - src/assembly/alpha/assem-rtns.lisp | 229 ---- src/assembly/alpha/support.lisp | 69 - src/assembly/alpha/tramps.lisp | 80 -- src/code/alpha-vm.lisp | 120 -- src/compiler/alpha/alloc.lisp | 182 --- src/compiler/alpha/arith.lisp | 823 ----------- src/compiler/alpha/array.lisp | 534 -------- src/compiler/alpha/c-call.lisp | 199 --- src/compiler/alpha/call.lisp | 1214 ----------------- src/compiler/alpha/cell.lisp | 632 --------- src/compiler/alpha/char.lisp | 155 --- src/compiler/alpha/debug.lisp | 118 -- src/compiler/alpha/float.lisp | 865 ------------ src/compiler/alpha/insts.lisp | 693 ---------- src/compiler/alpha/macros.lisp | 488 ------- src/compiler/alpha/memory.lisp | 30 - src/compiler/alpha/move.lisp | 317 ----- src/compiler/alpha/nlx.lisp | 261 ---- src/compiler/alpha/parms.lisp | 190 --- src/compiler/alpha/pred.lisp | 55 - src/compiler/alpha/sap.lisp | 355 ----- src/compiler/alpha/show.lisp | 34 - src/compiler/alpha/subprim.lisp | 49 - src/compiler/alpha/system.lisp | 208 --- src/compiler/alpha/target-insts.lisp | 38 - src/compiler/alpha/type-vops.lisp | 189 --- src/compiler/alpha/values.lisp | 156 --- src/compiler/alpha/vm.lisp | 347 ----- src/runtime/Config.alpha-linux | 30 - src/runtime/alpha-arch.c | 369 ----- src/runtime/alpha-arch.h | 6 - src/runtime/alpha-assem.S | 300 ---- src/runtime/alpha-linux-os.c | 103 -- src/runtime/alpha-linux-os.h | 11 - src/runtime/alpha-lispregs.h | 58 - src/runtime/ld-script.alpha-linux | 163 --- 42 files changed, 10295 deletions(-) delete mode 100644 crossbuild-runner/backends/alpha/features delete mode 100644 crossbuild-runner/backends/alpha/local-target-features delete mode 100644 crossbuild-runner/backends/alpha/stuff-groveled-from-headers.lisp delete mode 100644 src/assembly/alpha/alloc.lisp delete mode 100644 src/assembly/alpha/arith.lisp delete mode 100644 src/assembly/alpha/array.lisp delete mode 100644 src/assembly/alpha/assem-rtns.lisp delete mode 100644 src/assembly/alpha/support.lisp delete mode 100644 src/assembly/alpha/tramps.lisp delete mode 100644 src/code/alpha-vm.lisp delete mode 100644 src/compiler/alpha/alloc.lisp delete mode 100644 src/compiler/alpha/arith.lisp delete mode 100644 src/compiler/alpha/array.lisp delete mode 100644 src/compiler/alpha/c-call.lisp delete mode 100644 src/compiler/alpha/call.lisp delete mode 100644 src/compiler/alpha/cell.lisp delete mode 100644 src/compiler/alpha/char.lisp delete mode 100644 src/compiler/alpha/debug.lisp delete mode 100644 src/compiler/alpha/float.lisp delete mode 100644 src/compiler/alpha/insts.lisp delete mode 100644 src/compiler/alpha/macros.lisp delete mode 100644 src/compiler/alpha/memory.lisp delete mode 100644 src/compiler/alpha/move.lisp delete mode 100644 src/compiler/alpha/nlx.lisp delete mode 100644 src/compiler/alpha/parms.lisp delete mode 100644 src/compiler/alpha/pred.lisp delete mode 100644 src/compiler/alpha/sap.lisp delete mode 100644 src/compiler/alpha/show.lisp delete mode 100644 src/compiler/alpha/subprim.lisp delete mode 100644 src/compiler/alpha/system.lisp delete mode 100644 src/compiler/alpha/target-insts.lisp delete mode 100644 src/compiler/alpha/type-vops.lisp delete mode 100644 src/compiler/alpha/values.lisp delete mode 100644 src/compiler/alpha/vm.lisp delete mode 100644 src/runtime/Config.alpha-linux delete mode 100644 src/runtime/alpha-arch.c delete mode 100644 src/runtime/alpha-arch.h delete mode 100644 src/runtime/alpha-assem.S delete mode 100644 src/runtime/alpha-linux-os.c delete mode 100644 src/runtime/alpha-linux-os.h delete mode 100644 src/runtime/alpha-lispregs.h delete mode 100644 src/runtime/ld-script.alpha-linux diff --git a/crossbuild-runner/backends/alpha/features b/crossbuild-runner/backends/alpha/features deleted file mode 100644 index e9aeee10d8..0000000000 --- a/crossbuild-runner/backends/alpha/features +++ /dev/null @@ -1,2 +0,0 @@ -:64-bit-registers -:cheneygc diff --git a/crossbuild-runner/backends/alpha/local-target-features b/crossbuild-runner/backends/alpha/local-target-features deleted file mode 100644 index e2f300c919..0000000000 --- a/crossbuild-runner/backends/alpha/local-target-features +++ /dev/null @@ -1 +0,0 @@ -:cheneygc :64-bit-registers :little-endian diff --git a/crossbuild-runner/backends/alpha/stuff-groveled-from-headers.lisp b/crossbuild-runner/backends/alpha/stuff-groveled-from-headers.lisp deleted file mode 100644 index a9b090bf21..0000000000 --- a/crossbuild-runner/backends/alpha/stuff-groveled-from-headers.lisp +++ /dev/null @@ -1,145 +0,0 @@ -;;;; This is an automatically generated file, please do not hand-edit it. -;;;; See the program "grovel-headers.c". - -(in-package "SB-ALIEN") - -;;;flags for dlopen() -(defconstant rtld-lazy 1) ; #x1 -(defconstant rtld-now 2) ; #x2 -(defconstant rtld-global 256) ; #x100 -(in-package "SB-UNIX") - -;;; select() -(defconstant fd-setsize 1024) ; #x400 -;;; poll() -(defconstant pollin 1) ; #x1 -(defconstant pollout 4) ; #x4 -(defconstant pollpri 2) ; #x2 -(defconstant pollhup 16) ; #x10 -(defconstant pollnval 32) ; #x20 -(defconstant pollerr 8) ; #x8 -(define-alien-type nfds-t (unsigned 64)) -;;; langinfo -(defconstant codeset 14) ; #xe -;;; types, types, types -(define-alien-type clock-t (signed 64)) -(define-alien-type dev-t (unsigned 64)) -(define-alien-type gid-t (unsigned 32)) -(define-alien-type ino-t (unsigned 32)) -(define-alien-type mode-t (unsigned 32)) -(define-alien-type nlink-t (unsigned 32)) -(define-alien-type off-t (signed 64)) -(define-alien-type size-t (unsigned 64)) -(define-alien-type time-t (signed 64)) -(define-alien-type suseconds-t (signed 64)) -(define-alien-type uid-t (unsigned 32)) -;; Types in src/runtime/wrap.h. See that file for explantion. -;; Don't use these types for anything other than the stat wrapper. -(define-alien-type wst-ino-t (unsigned 32)) -(define-alien-type wst-dev-t (unsigned 32)) -(define-alien-type wst-off-t (unsigned 32)) -(define-alien-type wst-blksize-t (unsigned 64)) -(define-alien-type wst-blkcnt-t (unsigned 64)) -(define-alien-type wst-nlink-t (unsigned 32)) -(define-alien-type wst-uid-t (unsigned 32)) -(define-alien-type wst-gid-t (unsigned 32)) - -;;; fcntl.h (or unistd.h on OpenBSD and NetBSD) -(defconstant r_ok 4) ; #x4 -(defconstant w_ok 2) ; #x2 -(defconstant x_ok 1) ; #x1 -(defconstant f_ok 0) ; #x0 - -;;; fcntlbits.h -(defconstant o_rdonly 0) ; #x0 -(defconstant o_wronly 1) ; #x1 -(defconstant o_rdwr 2) ; #x2 -(defconstant o_accmode 3) ; #x3 -(defconstant o_creat 512) ; #x200 -(defconstant o_excl 2048) ; #x800 -(defconstant o_noctty 4096) ; #x1000 -(defconstant o_trunc 1024) ; #x400 -(defconstant o_append 8) ; #x8 -;;; -(defconstant s-ifmt 61440) ; #xf000 -(defconstant s-ififo 4096) ; #x1000 -(defconstant s-ifchr 8192) ; #x2000 -(defconstant s-ifdir 16384) ; #x4000 -(defconstant s-ifblk 24576) ; #x6000 -(defconstant s-ifreg 32768) ; #x8000 - -(defconstant s-iflnk 40960) ; #xa000 -(defconstant s-ifsock 49152) ; #xc000 - -;;; error numbers -(defconstant ebadf 9) ; #x9 -(defconstant enoent 2) ; #x2 -(defconstant eintr 4) ; #x4 -(defconstant eagain 35) ; #x23 -(defconstant eio 5) ; #x5 -(defconstant eexist 17) ; #x11 -(defconstant eloop 62) ; #x3e -(defconstant espipe 29) ; #x1d -(defconstant epipe 32) ; #x20 -(defconstant ewouldblock 35) ; #x23 - -;;; for waitpid() in run-program.lisp -(defconstant wnohang 1) ; #x1 -(defconstant wuntraced 2) ; #x2 - -;;; various ioctl(2) flags -(defconstant tiocgpgrp 1074033783) ; #x40047477 - -;;; signals -(defconstant sigalrm 14) ; #xe -(defconstant sigbus 10) ; #xa -(defconstant sigchld 20) ; #x14 -(defconstant sigcont 19) ; #x13 -(defconstant sigemt 7) ; #x7 -(defconstant sigfpe 8) ; #x8 -(defconstant sighup 1) ; #x1 -(defconstant sigill 4) ; #x4 -(defconstant sigint 2) ; #x2 -(defconstant sigio 23) ; #x17 -(defconstant sigkill 9) ; #x9 -(defconstant sigpipe 13) ; #xd -(defconstant sigprof 27) ; #x1b -(defconstant sigquit 3) ; #x3 -(defconstant sigsegv 11) ; #xb -(defconstant sigstop 17) ; #x11 -(defconstant sigsys 12) ; #xc -(defconstant sigterm 15) ; #xf -(defconstant sigtrap 5) ; #x5 -(defconstant sigtstp 18) ; #x12 -(defconstant sigttin 21) ; #x15 -(defconstant sigttou 22) ; #x16 -(defconstant sigurg 16) ; #x10 -(defconstant sigusr1 30) ; #x1e -(defconstant sigusr2 31) ; #x1f -(defconstant sigvtalrm 26) ; #x1a -(defconstant sigwinch 28) ; #x1c -(defconstant sigxcpu 24) ; #x18 -(defconstant sigxfsz 25) ; #x19 -(defconstant fpe-intovf 2) ; #x2 -(defconstant fpe-intdiv 1) ; #x1 -(defconstant fpe-fltdiv 3) ; #x3 -(defconstant fpe-fltovf 4) ; #x4 -(defconstant fpe-fltund 5) ; #x5 -(defconstant fpe-fltres 6) ; #x6 -(defconstant fpe-fltinv 7) ; #x7 -(defconstant fpe-fltsub 8) ; #x8 - -;;; structures -(define-alien-type nil - (struct timeval - (tv-sec (signed 64)) - (tv-usec (signed 64)))) -(define-alien-type nil - (struct timespec - (tv-sec (signed 64)) - (tv-nsec (signed 64)))) - -(in-package "SB-KERNEL") - -;;; Our runtime types -(define-alien-type os-vm-size-t (unsigned 64)) diff --git a/src/assembly/alpha/alloc.lisp b/src/assembly/alpha/alloc.lisp deleted file mode 100644 index 0c1b0282f3..0000000000 --- a/src/assembly/alpha/alloc.lisp +++ /dev/null @@ -1,17 +0,0 @@ -;;;; stuff to handle allocation of stuff we don't want to do inline - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;; (Given that the pseudo-atomic sequence is so short, there is -;;; nothing that qualifies. But we want to keep the file around -;;; in case we decide to add something later.) - diff --git a/src/assembly/alpha/arith.lisp b/src/assembly/alpha/arith.lisp deleted file mode 100644 index 79047761b8..0000000000 --- a/src/assembly/alpha/arith.lisp +++ /dev/null @@ -1,418 +0,0 @@ -;;;; stuff to handle simple cases for generic arithmetic - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(define-assembly-routine (generic-+ - (:cost 10) - (:return-style :full-call) - (:translate +) - (:policy :safe) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res (descriptor-reg any-reg) a0-offset) - - (:temp temp non-descriptor-reg nl0-offset) - (:temp temp2 non-descriptor-reg nl1-offset) - (:temp temp3 non-descriptor-reg nl2-offset) - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - (inst and x 3 temp) - (inst bne temp DO-STATIC-FUN) - (inst and y 3 temp) - (inst bne temp DO-STATIC-FUN) - (inst addq x y res) - - ; Check whether we need a bignum. - (inst sra res 31 temp) - (inst beq temp DONE) - (inst not temp temp) - (inst beq temp DONE) - (inst sra res 2 temp3) - - ; from move-from-signed - (inst li 2 temp2) - (inst sra temp3 31 temp) - (inst cmoveq temp 1 temp2) - (inst not temp temp) - (inst cmoveq temp 1 temp2) - (inst sll temp2 n-widetag-bits temp2) - (inst bis temp2 bignum-widetag temp2) - - (pseudo-atomic (:extra (pad-data-block (+ bignum-digits-offset 3))) - (inst bis alloc-tn other-pointer-lowtag res) - (storew temp2 res 0 other-pointer-lowtag) - (storew temp3 res bignum-digits-offset other-pointer-lowtag) - (inst srl temp3 32 temp) - (storew temp res (1+ bignum-digits-offset) other-pointer-lowtag)) - DONE - (lisp-return lra lip :offset 2) - - DO-STATIC-FUN - (inst ldl lip (static-fun-offset 'two-arg-+) null-tn) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst move csp-tn cfp-tn) - (inst jmp zero-tn lip)) - - -(define-assembly-routine (generic-- - (:cost 10) - (:return-style :full-call) - (:translate -) - (:policy :safe) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res (descriptor-reg any-reg) a0-offset) - - (:temp temp non-descriptor-reg nl0-offset) - (:temp temp2 non-descriptor-reg nl1-offset) - (:temp temp3 non-descriptor-reg nl2-offset) - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - (inst and x 3 temp) - (inst bne temp DO-STATIC-FUN) - (inst and y 3 temp) - (inst bne temp DO-STATIC-FUN) - (inst subq x y res) - - ; Check whether we need a bignum. - (inst sra res 31 temp) - (inst beq temp DONE) - (inst not temp temp) - (inst beq temp DONE) - (inst sra res 2 temp3) - - ; from move-from-signed - (inst li 2 temp2) - (inst sra temp3 31 temp) - (inst cmoveq temp 1 temp2) - (inst not temp temp) - (inst cmoveq temp 1 temp2) - (inst sll temp2 n-widetag-bits temp2) - (inst bis temp2 bignum-widetag temp2) - - (pseudo-atomic (:extra (pad-data-block (+ bignum-digits-offset 3))) - (inst bis alloc-tn other-pointer-lowtag res) - (storew temp2 res 0 other-pointer-lowtag) - (storew temp3 res bignum-digits-offset other-pointer-lowtag) - (inst srl temp3 32 temp) - (storew temp res (1+ bignum-digits-offset) other-pointer-lowtag)) - DONE - (lisp-return lra lip :offset 2) - - DO-STATIC-FUN - (inst ldl lip (static-fun-offset 'two-arg--) null-tn) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst move csp-tn cfp-tn) - (inst jmp zero-tn lip)) - - -(define-assembly-routine (generic-* - (:cost 25) - (:return-style :full-call) - (:translate *) - (:policy :safe) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res (descriptor-reg any-reg) a0-offset) - - (:temp temp non-descriptor-reg nl0-offset) - (:temp lo non-descriptor-reg nl1-offset) - (:temp hi non-descriptor-reg nl2-offset) - (:temp temp2 non-descriptor-reg nl3-offset) - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - ;; If either arg is not a fixnum, call the static function. - (inst and x 3 temp) - (inst bne temp DO-STATIC-FUN) - (inst and y 3 temp) - (inst bne temp DO-STATIC-FUN) - - ;; Remove the tag from one arg so that the result will have the - ;; correct fixnum tag. - (inst sra x 2 temp) - (inst mulq temp y lo) - (inst sra lo 32 hi) - (inst sll lo 32 res) - (inst sra res 32 res) - ;; Check to see if the result will fit in a fixnum. (I.e. the high - ;; word is just 32 copies of the sign bit of the low word). - (inst sra res 31 temp) - (inst xor hi temp temp) - (inst beq temp DONE) - ;; Shift the double word hi:res down two bits into hi:low to get rid - ;; of the fixnum tag. - (inst sra lo 2 lo) - (inst sra lo 32 hi) - - ;; Do we need one word or two? Assume two. - (inst li (logior (ash 2 n-widetag-bits) bignum-widetag) temp2) - (inst sra lo 31 temp) - (inst xor temp hi temp) - (inst bne temp two-words) - - ;; Only need one word, fix the header. - (inst li (logior (ash 1 n-widetag-bits) bignum-widetag) temp2) - ;; Allocate one word. - (pseudo-atomic (:extra (pad-data-block (1+ bignum-digits-offset))) - (inst bis alloc-tn other-pointer-lowtag res) - (storew temp2 res 0 other-pointer-lowtag)) - ;; Store one word - (storew lo res bignum-digits-offset other-pointer-lowtag) - ;; Out of here - (lisp-return lra lip :offset 2) - - TWO-WORDS - ;; Allocate two words. - (pseudo-atomic (:extra (pad-data-block (+ 2 bignum-digits-offset))) - (inst bis alloc-tn other-pointer-lowtag res) - (storew temp2 res 0 other-pointer-lowtag)) - ;; Store two words. - (storew lo res bignum-digits-offset other-pointer-lowtag) - (storew hi res (1+ bignum-digits-offset) other-pointer-lowtag) - ;; out of here - (lisp-return lra lip :offset 2) - - DO-STATIC-FUN - (inst ldl lip (static-fun-offset 'two-arg-*) null-tn) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst move csp-tn cfp-tn) - (inst jmp zero-tn lip) - - DONE) - - -;;;; division - -(define-assembly-routine (signed-truncate - (:note "(signed-byte 64) truncate") - (:cost 60) - (:policy :fast-safe) - (:translate truncate) - (:arg-types signed-num signed-num) - (:result-types signed-num signed-num)) - - ((:arg dividend signed-reg nl0-offset) - (:arg divisor signed-reg nl1-offset) - - (:res quo signed-reg nl2-offset) - (:res rem signed-reg nl3-offset) - - (:temp quo-sign signed-reg nl5-offset) - (:temp rem-sign signed-reg nargs-offset) - (:temp temp1 non-descriptor-reg nl4-offset)) - - (let ((error (generate-error-code nil 'division-by-zero-error - dividend divisor))) - (inst beq divisor error)) - - (inst xor dividend divisor quo-sign) - (inst move dividend rem-sign) - (let ((label (gen-label))) - (inst bge dividend label) - (inst subq zero-tn dividend dividend) - (emit-label label)) - (let ((label (gen-label))) - (inst bge divisor label) - (inst subq zero-tn divisor divisor) - (emit-label label)) - (inst move zero-tn rem) - (inst move zero-tn quo) - - (dotimes (i 64) - (inst srl dividend 63 temp1) - (inst sll rem 1 rem) - (inst bis temp1 rem rem) - (inst cmple divisor rem temp1) - (inst sll quo 1 quo) - (inst bis temp1 quo quo) - (inst sll dividend 1 dividend) - (inst subq temp1 1 temp1) - (inst zap divisor temp1 temp1) - (inst subq rem temp1 rem)) - - (let ((label (gen-label))) - ;; If the quo-sign is negative, we need to negate quo. - (inst bge quo-sign label) - (inst subq zero-tn quo quo) - (emit-label label)) - (let ((label (gen-label))) - ;; If the rem-sign is negative, we need to negate rem. - (inst bge rem-sign label) - (inst subq zero-tn rem rem) - (emit-label label))) - - -;;;; comparison routines - -(macrolet - ((define-cond-assem-rtn (name translate static-fn cmp not-p) - `(define-assembly-routine (,name - (:cost 10) - (:return-style :full-call) - (:policy :safe) - (:translate ,translate) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res descriptor-reg a0-offset) - - (:temp temp non-descriptor-reg nl0-offset) - (:temp lip interior-reg lip-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - (inst and x 3 temp) - (inst bne temp DO-STATIC-FN) - (inst and y 3 temp) - (inst beq temp DO-COMPARE) - - DO-STATIC-FN - (inst ldl lip (static-fun-offset ',static-fn) null-tn) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst move csp-tn cfp-tn) - (inst jmp zero-tn lip) - - DO-COMPARE - ,cmp - (inst move null-tn res) - (inst ,(if not-p 'bne 'beq) temp done) - (load-symbol res t) - DONE))) - - (define-cond-assem-rtn generic-< < two-arg-< (inst cmplt x y temp) nil) - (define-cond-assem-rtn generic-> > two-arg-> (inst cmplt y x temp) nil)) - - -(define-assembly-routine (generic-eql - (:cost 10) - (:return-style :full-call) - (:policy :safe) - (:translate eql) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res descriptor-reg a0-offset) - - (:temp temp non-descriptor-reg nl0-offset) - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - (inst cmpeq x y temp) - (inst bne temp RETURN-T) - (inst and x 3 temp) - (inst beq temp RETURN-NIL) - (inst and y 3 temp) - (inst bne temp DO-STATIC-FN) - - RETURN-NIL - (inst move null-tn res) - (lisp-return lra lip :offset 2) - - DO-STATIC-FN - (inst ldl lip (static-fun-offset 'eql) null-tn) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst move csp-tn cfp-tn) - (inst jmp zero-tn lip) - - RETURN-T - (load-symbol res t)) - -(define-assembly-routine (generic-= - (:cost 10) - (:return-style :full-call) - (:policy :safe) - (:translate =) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res descriptor-reg a0-offset) - - (:temp temp non-descriptor-reg nl0-offset) - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - (inst and x 3 temp) - (inst bne temp DO-STATIC-FN) - (inst and y 3 temp) - (inst bne temp DO-STATIC-FN) - (inst cmpeq x y temp) - (inst bne temp RETURN-T) - - (inst move null-tn res) - (lisp-return lra lip :offset 2) - - DO-STATIC-FN - (inst ldl lip (static-fun-offset 'two-arg-=) null-tn) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst move csp-tn cfp-tn) - (inst jmp zero-tn lip) - - RETURN-T - (load-symbol res t)) - -(define-assembly-routine (generic-/= - (:cost 10) - (:return-style :full-call) - (:policy :safe) - (:translate /=) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res descriptor-reg a0-offset) - - (:temp temp non-descriptor-reg nl0-offset) - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - (inst and x 3 temp) - (inst bne temp DO-STATIC-FN) - (inst and y 3 temp) - (inst bne temp DO-STATIC-FN) - (inst cmpeq x y temp) - (inst bne temp RETURN-NIL) - - (load-symbol res t) - (lisp-return lra lip :offset 2) - - DO-STATIC-FN - (inst ldl lip (static-fun-offset 'two-arg-/=) null-tn) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst move csp-tn cfp-tn) - (inst jmp zero-tn lip) - - RETURN-NIL - (inst move null-tn res)) diff --git a/src/assembly/alpha/array.lisp b/src/assembly/alpha/array.lisp deleted file mode 100644 index 57af29d101..0000000000 --- a/src/assembly/alpha/array.lisp +++ /dev/null @@ -1,42 +0,0 @@ -;;;; support routines for arrays and vectors - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - - -(macrolet ((foo (name) -`(define-assembly-routine (,name - (:policy :fast-safe) - (:arg-types positive-fixnum - positive-fixnum - positive-fixnum)) - ((:arg type any-reg a0-offset) - (:arg length any-reg a1-offset) - (:arg words any-reg a2-offset) - (:res result descriptor-reg a0-offset) - - (:temp ndescr non-descriptor-reg nl0-offset)) - ;; This is kinda sleezy, changing words like this. But we can because - ;; the vop thinks it is temporary. - (inst addq words (+ (1- (ash 1 n-lowtag-bits)) - (* vector-data-offset n-word-bytes)) - words) - (inst li (lognot lowtag-mask) ndescr) - (inst and words ndescr words) - (inst srl type word-shift ndescr) - - (pseudo-atomic () - (inst bis alloc-tn other-pointer-lowtag result) - (inst addq alloc-tn words alloc-tn) - (storew ndescr result 0 other-pointer-lowtag) - (storew length result vector-length-slot other-pointer-lowtag))))) - (foo allocate-vector-on-heap) - (foo allocate-vector-on-stack)) ; get crossbuild to pass for what that's worth diff --git a/src/assembly/alpha/assem-rtns.lisp b/src/assembly/alpha/assem-rtns.lisp deleted file mode 100644 index f1548ea68d..0000000000 --- a/src/assembly/alpha/assem-rtns.lisp +++ /dev/null @@ -1,229 +0,0 @@ -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; Return-multiple with other than one value - -#+sb-assembling ;; We don't want a vop for this one. -(define-assembly-routine - (return-multiple - (:return-style :none)) - - ;; These four are really arguments. - ((:temp nvals any-reg nargs-offset) - (:temp vals any-reg nl0-offset) - (:temp ocfp any-reg nl1-offset) - (:temp lra descriptor-reg lra-offset) - - ;; These are just needed to facilitate the transfer - (:temp lip interior-reg lip-offset) - (:temp count any-reg nl2-offset) - (:temp dst any-reg nl4-offset) - (:temp temp descriptor-reg l0-offset) - - ;; These are needed so we can get at the register args. - (:temp a0 descriptor-reg a0-offset) - (:temp a1 descriptor-reg a1-offset) - (:temp a2 descriptor-reg a2-offset) - (:temp a3 descriptor-reg a3-offset) - (:temp a4 descriptor-reg a4-offset) - (:temp a5 descriptor-reg a5-offset)) - - ;; Note, because of the way the RETURN-MULTIPLE VOP is written, we - ;; can assume that we are never called with NVALS == 1 and that A0 - ;; has already been loaded. - (inst ble nvals default-a0-and-on) - (inst ldl a1 (* 1 n-word-bytes) vals) - (inst subq nvals (fixnumize 2) count) - (inst ble count default-a2-and-on) - (inst ldl a2 (* 2 n-word-bytes) vals) - (inst subq nvals (fixnumize 3) count) - (inst ble count default-a3-and-on) - (inst ldl a3 (* 3 n-word-bytes) vals) - (inst subq nvals (fixnumize 4) count) - (inst ble count default-a4-and-on) - (inst ldl a4 (* 4 n-word-bytes) vals) - (inst subq nvals (fixnumize 5) count) - (inst ble count default-a5-and-on) - (inst ldl a5 (* 5 n-word-bytes) vals) - (inst subq nvals (fixnumize 6) count) - (inst ble count done) - - ;; Copy the remaining args to the top of the stack. - (inst addq vals (* 6 n-word-bytes) vals) - (inst addq cfp-tn (* 6 n-word-bytes) dst) - - LOOP - (inst ldl temp 0 vals) - (inst addq vals n-word-bytes vals) - (inst stl temp 0 dst) - (inst subq count (fixnumize 1) count) - (inst addq dst n-word-bytes dst) - (inst bne count loop) - - (inst br zero-tn done) - - DEFAULT-A0-AND-ON - (inst move null-tn a0) - (inst move null-tn a1) - DEFAULT-A2-AND-ON - (inst move null-tn a2) - DEFAULT-A3-AND-ON - (inst move null-tn a3) - DEFAULT-A4-AND-ON - (inst move null-tn a4) - DEFAULT-A5-AND-ON - (inst move null-tn a5) - DONE - - ;; Clear the stack. - (move cfp-tn ocfp-tn) - (move ocfp cfp-tn) - (inst addq ocfp-tn nvals csp-tn) - - ;; Return. - (lisp-return lra lip)) - -;;;; tail-call-variable - -#+sb-assembling ;; no vop for this one either -(define-assembly-routine - (tail-call-variable - (:return-style :none)) - - ;; These are really args. - ((:temp args any-reg nl0-offset) - (:temp lexenv descriptor-reg lexenv-offset) - - ;; We need to compute this - (:temp nargs any-reg nargs-offset) - - ;; These are needed by the blitting code. - (:temp src any-reg nl1-offset) - (:temp dst any-reg nl2-offset) - (:temp count any-reg cfunc-offset) - (:temp temp descriptor-reg l0-offset) - - ;; Needed for the jump - (:temp lip interior-reg lip-offset) - - ;; These are needed so we can get at the register args. - (:temp a0 descriptor-reg a0-offset) - (:temp a1 descriptor-reg a1-offset) - (:temp a2 descriptor-reg a2-offset) - (:temp a3 descriptor-reg a3-offset) - (:temp a4 descriptor-reg a4-offset) - (:temp a5 descriptor-reg a5-offset)) - - - ;; Calculate NARGS (as a fixnum) - (inst subq csp-tn args nargs) - - ;; Load the argument regs (must do this now, 'cause the blt might - ;; trash these locations) - (inst ldl a0 (* 0 n-word-bytes) args) - (inst ldl a1 (* 1 n-word-bytes) args) - (inst ldl a2 (* 2 n-word-bytes) args) - (inst ldl a3 (* 3 n-word-bytes) args) - (inst ldl a4 (* 4 n-word-bytes) args) - (inst ldl a5 (* 5 n-word-bytes) args) - - ;; Calc SRC, DST, and COUNT - (inst subq nargs (fixnumize register-arg-count) count) - (inst addq args (* n-word-bytes register-arg-count) src) - (inst ble count done) - (inst addq cfp-tn (* n-word-bytes register-arg-count) dst) - - LOOP - ;; Copy one arg. - (inst ldl temp 0 src) - (inst addq src n-word-bytes src) - (inst stl temp 0 dst) - (inst subq count (fixnumize 1) count) - (inst addq dst n-word-bytes dst) - (inst bgt count loop) - - DONE - ;; We are done. Do the jump. - (progn - (loadw temp lexenv closure-fun-slot fun-pointer-lowtag) - (lisp-jump temp lip))) - - -;;;; non-local exit noise - -(define-assembly-routine - (unwind - (:translate %unwind) - (:policy :fast-safe)) - ((:arg block (any-reg descriptor-reg) a0-offset) - (:arg start (any-reg descriptor-reg) ocfp-offset) - (:arg count (any-reg descriptor-reg) nargs-offset) - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp cur-uwp any-reg nl0-offset) - (:temp next-uwp any-reg nl1-offset) - (:temp target-uwp any-reg nl2-offset) - (:temp temp1 non-descriptor-reg nl3-offset)) - (declare (ignore start count)) - - (load-symbol-value cur-uwp *current-unwind-protect-block*) - (let ((error (generate-error-code nil 'invalid-unwind-error))) - (inst beq block error)) - - (loadw target-uwp block unwind-block-uwp-slot) - (inst cmpeq cur-uwp target-uwp temp1) - (inst beq temp1 do-uwp) - - (move block cur-uwp) - - do-exit - - (loadw cfp-tn cur-uwp unwind-block-cfp-slot) - (loadw code-tn cur-uwp unwind-block-code-slot) - (progn - (loadw lra cur-uwp unwind-block-entry-pc-slot) - (lisp-return lra lip :frob-code nil)) - - do-uwp - - (loadw next-uwp cur-uwp unwind-block-uwp-slot) - (store-symbol-value next-uwp *current-unwind-protect-block*) - (inst br zero-tn do-exit)) - -(define-assembly-routine - throw - ((:arg target descriptor-reg a0-offset) - (:arg start any-reg ocfp-offset) - (:arg count any-reg nargs-offset) - (:temp catch any-reg a1-offset) - (:temp tag descriptor-reg a2-offset) - (:temp temp1 non-descriptor-reg nl0-offset)) - - (progn start count) ; We just need them in the registers. - - (load-symbol-value catch *current-catch-block*) - - loop - - (let ((error (generate-error-code nil 'unseen-throw-tag-error target))) - (inst beq catch error)) - - (loadw tag catch catch-block-tag-slot) - (inst cmpeq tag target temp1) - (inst bne temp1 exit) - (loadw catch catch catch-block-previous-catch-slot) - (inst br zero-tn loop) - - exit - - (move catch target) - (inst li (make-fixup 'unwind :assembly-routine) temp1) - (inst jmp zero-tn temp1 (make-fixup 'unwind :assembly-routine))) diff --git a/src/assembly/alpha/support.lisp b/src/assembly/alpha/support.lisp deleted file mode 100644 index e1025f9e99..0000000000 --- a/src/assembly/alpha/support.lisp +++ /dev/null @@ -1,69 +0,0 @@ -;;;; the machine-specific support routines needed by the file assembler - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(defun generate-call-sequence (name style vop options) - (declare (ignore options)) - (ecase style - ((:raw :none) - (values - `((inst li (make-fixup ',name :assembly-routine) temp) - (inst jsr lip-tn temp)) - '((:temporary (:sc non-descriptor-reg) temp)) - nil)) - (:full-call - (let ((temp (make-symbol "TEMP")) - (nfp-save (make-symbol "NFP-SAVE")) - (lra (make-symbol "LRA"))) - (values - `((let ((lra-label (gen-label)) - (cur-nfp (current-nfp-tn ,vop))) - (when cur-nfp - (store-stack-tn ,nfp-save cur-nfp)) - (inst compute-lra-from-code ,lra code-tn lra-label ,temp) - (note-next-instruction ,vop :call-site) - ; here - (inst li (make-fixup ',name :assembly-routine) temp1) - (inst jsr lip-tn temp1 (make-fixup ',name :assembly-routine)) - (emit-return-pc lra-label) - (note-this-location ,vop :single-value-return) - (without-scheduling () - (move ocfp-tn csp-tn) - (inst nop)) - (inst compute-code-from-lra code-tn code-tn - lra-label ,temp) - (when cur-nfp - (maybe-load-stack-nfp-tn cur-nfp ,nfp-save temp1)))) - `((:temporary (:scs (non-descriptor-reg) :from (:eval 0) :to (:eval 1)) - ,temp) - (:temporary (:sc descriptor-reg :offset lra-offset - :from (:eval 0) :to (:eval 1)) - ,lra) - (:temporary (:scs (control-stack) :offset nfp-save-offset) - ,nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp1) - (:save-p t))))))) - -(defun generate-return-sequence (style) - (ecase style - (:raw - `((inst ret zero-tn lip-tn))) - (:full-call - `((lisp-return (make-random-tn :kind :normal - :sc (sc-or-lose - 'descriptor-reg) - :offset lra-offset) - lip-tn :offset 2))) - (:none))) - -(defun return-machine-address (scp) - (context-register scp lip-offset)) diff --git a/src/assembly/alpha/tramps.lisp b/src/assembly/alpha/tramps.lisp deleted file mode 100644 index fb925b43e3..0000000000 --- a/src/assembly/alpha/tramps.lisp +++ /dev/null @@ -1,80 +0,0 @@ -;;;; Undefined-function and closure trampoline definitions - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. - -(in-package "SB-VM") - -(define-assembly-routine - (xundefined-tramp (:return-style :none) - (:align n-lowtag-bits) - (:export undefined-tramp - (undefined-tramp-tagged - (+ xundefined-tramp - fun-pointer-lowtag)))) - ((:temp fdefn-tn descriptor-reg fdefn-offset) - (:temp nl0-tn non-descriptor-reg nl0-offset) - (:temp ocfp-tn non-descriptor-reg ocfp-offset) - (:temp lra-tn descriptor-reg lra-offset)) - (inst lword simple-fun-widetag) ;; header - (inst lword (make-fixup 'undefined-tramp-tagged - :assembly-routine)) ;; self - (dotimes (i (- simple-fun-insts-offset 2)) - (inst lword nil-value)) - - ;; If we are called with stack arguments (or in a tail-call - ;; scenario), we end up with an allocated stack frame, but the frame - ;; link information is uninitialized. Fix things by allocating and - ;; initializing our stack frame "properly". - - UNDEFINED-TRAMP - (inst lda code-tn - (- fun-pointer-lowtag - (ash simple-fun-insts-offset word-shift)) - lip-tn) - - (inst cmpule nargs-tn (fixnumize register-arg-count) nl0-tn) - (inst beq nl0-tn NO-STACK-ARGS) - (inst addq cfp-tn (fixnumize register-arg-count) csp-tn) - (inst br zero-tn FINISH-FRAME-SETUP) - - NO-STACK-ARGS - (inst addq cfp-tn nargs-tn csp-tn) - - FINISH-FRAME-SETUP - (storew ocfp-tn cfp-tn ocfp-save-offset) - (storew lra-tn cfp-tn lra-save-offset) - (error-call nil 'undefined-fun-error fdefn-tn)) - -(define-assembly-routine - (closure-tramp (:return-style :none) - (:align n-lowtag-bits)) - ((:temp fdefn-tn descriptor-reg fdefn-offset) - (:temp lexenv-tn descriptor-reg lexenv-offset)) - (loadw lexenv-tn fdefn-tn fdefn-fun-slot other-pointer-lowtag) - (loadw code-tn lexenv-tn closure-fun-slot fun-pointer-lowtag) - (inst lda lip-tn (- (ash simple-fun-insts-offset word-shift) - fun-pointer-lowtag) - code-tn) - (inst jsr zero-tn lip-tn 1)) - -(define-assembly-routine - (xfuncallable-instance-tramp (:return-style :none) - (:align n-lowtag-bits) - (:export (funcallable-instance-tramp - (+ xfuncallable-instance-tramp - fun-pointer-lowtag)))) - ((:temp code-tn descriptor-reg code-offset) - (:temp lexenv-tn descriptor-reg lexenv-offset)) - (inst lword simple-fun-widetag) - (inst lword (make-fixup 'funcallable-instance-tramp - :assembly-routine)) - (dotimes (i (- simple-fun-insts-offset 2)) - (inst lword nil-value)) - - (loadw lexenv-tn lexenv-tn funcallable-instance-function-slot fun-pointer-lowtag) - (loadw code-tn lexenv-tn closure-fun-slot fun-pointer-lowtag) - (inst lda lip-tn (- (ash simple-fun-insts-offset word-shift) - fun-pointer-lowtag) - code-tn) - (inst jsr zero-tn lip-tn 1)) diff --git a/src/code/alpha-vm.lisp b/src/code/alpha-vm.lisp deleted file mode 100644 index a98ac73ed0..0000000000 --- a/src/code/alpha-vm.lisp +++ /dev/null @@ -1,120 +0,0 @@ -;;;; Alpha-specific implementation stuff - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -#-sb-xc-host -(defun machine-type () - "Return a string describing the type of the local machine." - "Alpha") - -(defconstant-eqx +fixup-kinds+ - #(:jmp-hint :bits-63-48 :bits-47-32 :ldah :lda :absolute32) - #'equalp) -(!with-bigvec-or-sap -(defun fixup-code-object (code offset value kind flavor) - (declare (ignore flavor)) - (unless (zerop (rem offset sb-assem:+inst-alignment-bytes+)) - (error "Unaligned instruction? offset=#x~X." offset)) - (let ((sap (code-instructions code))) - (ecase kind - (:jmp-hint - (aver (zerop (ldb (byte 2 0) value))) - #+nil - (setf (sap-ref-16 sap offset) - (logior (sap-ref-16 sap offset) - (ldb (byte 14 0) (ash value -2))))) - (:bits-63-48 - (let* ((value (if (logbitp 15 value) (+ value (ash 1 16)) value)) - (value (if (logbitp 31 value) (+ value (ash 1 32)) value)) - (value (if (logbitp 47 value) (+ value (ash 1 48)) value))) - (setf (sap-ref-8 sap offset) (ldb (byte 8 48) value)) - (setf (sap-ref-8 sap (1+ offset)) (ldb (byte 8 56) value)))) - (:bits-47-32 - (let* ((value (if (logbitp 15 value) (+ value (ash 1 16)) value)) - (value (if (logbitp 31 value) (+ value (ash 1 32)) value))) - (setf (sap-ref-8 sap offset) (ldb (byte 8 32) value)) - (setf (sap-ref-8 sap (1+ offset)) (ldb (byte 8 40) value)))) - (:ldah - (let ((value (if (logbitp 15 value) (+ value (ash 1 16)) value))) - (setf (sap-ref-8 sap offset) (ldb (byte 8 16) value)) - (setf (sap-ref-8 sap (1+ offset)) (ldb (byte 8 24) value)))) - (:lda - (setf (sap-ref-8 sap offset) (ldb (byte 8 0) value)) - (setf (sap-ref-8 sap (1+ offset)) (ldb (byte 8 8) value))) - (:absolute32 - (setf (sap-ref-32 sap offset) value)))) - nil)) - -;;;; "sigcontext" access functions, cut & pasted from x86-vm.lisp then -;;;; hacked for types. -;;;; -;;;; KLUDGE: The alpha has 64-bit registers, so these potentially -;;;; return 64 bit numbers (which means bignums ... ew) We think that -;;;; 99 times of 100 (i.e. unless something is badly wrong) we'll get -;;;; answers that fit in 32 bits anyway. Which probably won't help us -;;;; stop passing bignums around as the compiler can't prove they fit -;;;; in 32 bits. But maybe the stuff it does on x86 to unbox 32-bit -;;;; constants happens magically for 64-bit constants here. Just -;;;; maybe. -- Dan Barlow, ca. 2001-05-05 -;;;; -;;;; See also x86-vm for commentary on signed vs unsigned. - -#-sb-xc-host (progn -;;; This is like CONTEXT-REGISTER, but returns the value of a float -;;; register. FORMAT is the type of float to return. - -;;; FIXME: Whether COERCE actually knows how to make a float out of a -;;; long is another question. This stuff still needs testing. -(define-alien-routine ("os_context_float_register_addr" - context-float-register-addr) - (* long) - (context (* os-context-t)) - (index int)) -(defun context-float-register (context index format) - (declare (type (alien (* os-context-t)) context)) - (coerce (deref (context-float-register-addr context index)) format)) -(defun %set-context-float-register (context index format new) - (declare (type (alien (* os-context-t)) context)) - (setf (deref (context-float-register-addr context index)) - (coerce new format))) - -;;; This sets the software fp_control word, which is not the same -;;; thing as the hardware fpcr. We have to do this so that OS FPU -;;; completion works properly - -;;; Note that this means we can't set rounding modes; we'd have to do -;;; that separately. That said, almost everybody seems to agree that -;;; changing the rounding mode is rarely a good idea, because it upsets -;;; libm functions. So adding that is not a priority. Sorry. -;;; -dan 2001.02.06 - -(define-alien-routine - ("arch_get_fp_control" floating-point-modes) (unsigned 64)) - -(define-alien-routine - ("arch_set_fp_control" %floating-point-modes-setter) void (fp (unsigned 64))) - -(defun (setf floating-point-modes) (val) (%floating-point-modes-setter val)) - -;;; Given a signal context, return the floating point modes word in -;;; the same format as returned by FLOATING-POINT-MODES. -(define-alien-routine ("os_context_fp_control" context-floating-point-modes) - (unsigned 64) (context (* os-context-t))) - - -(defun internal-error-args (context) - (declare (type (alien (* os-context-t)) context)) - (let* ((pc (context-pc context)) - (trap-number (sap-ref-8 pc 3))) - (declare (type system-area-pointer pc)) - (sb-kernel::decode-internal-error-args (sap+ pc 4) trap-number))) -) ; end PROGN diff --git a/src/compiler/alpha/alloc.lisp b/src/compiler/alpha/alloc.lisp deleted file mode 100644 index 408b475592..0000000000 --- a/src/compiler/alpha/alloc.lisp +++ /dev/null @@ -1,182 +0,0 @@ -;;;; allocation VOPs for the Alpha port - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; LIST and LIST* -(define-vop (list-or-list*) - (:args (things :more t)) - (:temporary (:scs (descriptor-reg)) ptr) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (descriptor-reg) :to (:result 0) :target result) - res) - (:info num) - (:results (result :scs (descriptor-reg))) - (:variant-vars star) - (:policy :safe) - (:node-var node) - (:generator 0 - (cond ((zerop num) - (move null-tn result)) - ((and star (= num 1)) - (move (tn-ref-tn things) result)) - (t - (macrolet - ((store-car (tn list &optional (slot cons-car-slot)) - `(let ((reg - (sc-case ,tn - ((any-reg descriptor-reg) ,tn) - (zero zero-tn) - (null null-tn) - (control-stack - (load-stack-tn temp ,tn) - temp)))) - (storew reg ,list ,slot list-pointer-lowtag)))) - (let* ((dx-p (node-stack-allocate-p node)) - (cons-cells (if star (1- num) num)) - (space (* (pad-data-block cons-size) cons-cells))) - (pseudo-atomic (:extra (if dx-p 0 space)) - (cond (dx-p - (align-csp res) - (inst bis csp-tn list-pointer-lowtag res) - (inst lda csp-tn space csp-tn)) - (t - (inst bis alloc-tn list-pointer-lowtag res))) - (move res ptr) - (dotimes (i (1- cons-cells)) - (store-car (tn-ref-tn things) ptr) - (setf things (tn-ref-across things)) - (inst lda ptr (pad-data-block cons-size) ptr) - (storew ptr ptr - (- cons-cdr-slot cons-size) - list-pointer-lowtag)) - (store-car (tn-ref-tn things) ptr) - (cond (star - (setf things (tn-ref-across things)) - (store-car (tn-ref-tn things) ptr cons-cdr-slot)) - (t - (storew null-tn ptr - cons-cdr-slot list-pointer-lowtag))) - (aver (null (tn-ref-across things))) - (move res result)))))))) - -(define-vop (list list-or-list*) - (:variant nil)) - -(define-vop (list* list-or-list*) - (:variant t)) - -;;;; special purpose inline allocators - -(define-vop (make-fdefn) - (:policy :fast-safe) - (:translate make-fdefn) - (:args (name :scs (descriptor-reg) :to :eval)) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (result :scs (descriptor-reg) :from :argument)) - (:generator 37 - (with-fixed-allocation (result temp fdefn-widetag fdefn-size) - (storew name result fdefn-name-slot other-pointer-lowtag) - (storew null-tn result fdefn-fun-slot other-pointer-lowtag) - (inst li (make-fixup 'undefined-tramp :assembly-routine) temp) - (storew temp result fdefn-raw-addr-slot other-pointer-lowtag)))) - -(define-vop (make-closure) - (:args (function :to :save :scs (descriptor-reg))) - (:info label length stack-allocate-p) - (:ignore label) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (result :scs (descriptor-reg))) - (:generator 10 - (let* ((size (+ length closure-info-offset)) - (alloc-size (pad-data-block size))) - (inst li - (logior (ash (1- size) n-widetag-bits) closure-widetag) - temp) - (pseudo-atomic (:extra (if stack-allocate-p 0 alloc-size)) - (cond (stack-allocate-p - (align-csp result) - (inst bis csp-tn fun-pointer-lowtag result) - (inst lda csp-tn alloc-size csp-tn)) - (t - (inst bis alloc-tn fun-pointer-lowtag result))) - (storew temp result 0 fun-pointer-lowtag) - (storew function result closure-fun-slot fun-pointer-lowtag))))) - -;;; The compiler likes to be able to directly make value cells. -(define-vop (make-value-cell) - (:args (value :to :save :scs (descriptor-reg any-reg null zero))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:info stack-allocate-p) - (:ignore stack-allocate-p) - (:results (result :scs (descriptor-reg))) - (:generator 10 - (with-fixed-allocation - (result temp value-cell-widetag value-cell-size) - (storew value result value-cell-value-slot other-pointer-lowtag)))) - -;;;; automatic allocators for primitive objects - -(define-vop (make-unbound-marker) - (:args) - (:results (result :scs (descriptor-reg any-reg))) - (:generator 1 - (inst li unbound-marker-widetag result))) - -(define-vop (make-funcallable-instance-tramp) - (:args) - (:results (result :scs (any-reg))) - (:generator 1 - (inst li (make-fixup 'funcallable-instance-tramp :assembly-routine) result))) - -(define-vop (fixed-alloc) - (:args) - (:info name words type lowtag stack-allocate-p) - (:ignore name) - (:results (result :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 4 - (pseudo-atomic (:extra (if stack-allocate-p - 0 - (pad-data-block words))) - (cond (stack-allocate-p - (align-csp result) - (inst bis csp-tn lowtag result) - (inst addq csp-tn (pad-data-block words) csp-tn)) - (t - (inst bis alloc-tn lowtag result))) - (when type - (inst li (logior (ash (1- words) (length-field-shift type)) type) temp) - (storew temp result 0 lowtag))))) - -(define-vop (var-alloc) - (:args (extra :scs (any-reg))) - (:arg-types positive-fixnum) - (:info name words type lowtag stack-allocate-p) - (:ignore name stack-allocate-p) - (:results (result :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) header) - (:temporary (:scs (non-descriptor-reg)) bytes) - (:generator 6 - (inst lda bytes (* (1+ words) n-word-bytes) extra) - (inst sll bytes (- (length-field-shift type) 2) header) - ;; The specified EXTRA value is the exact value placed in the header - ;; as the word count when allocating code. - (cond ((= type code-header-widetag) - (inst lda header type header)) - (t - (inst lda header (+ (ash -2 (length-field-shift type)) type) header) - (inst srl bytes n-lowtag-bits bytes) - (inst sll bytes n-lowtag-bits bytes))) - (pseudo-atomic () - (inst bis alloc-tn lowtag result) - (storew header result 0 lowtag) - (inst addq alloc-tn bytes alloc-tn)))) diff --git a/src/compiler/alpha/arith.lisp b/src/compiler/alpha/arith.lisp deleted file mode 100644 index 31adf157fb..0000000000 --- a/src/compiler/alpha/arith.lisp +++ /dev/null @@ -1,823 +0,0 @@ -;;;; the VM definition arithmetic VOPs for the Alpha - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; unary operations - -(define-vop (fixnum-unop) - (:args (x :scs (any-reg))) - (:results (res :scs (any-reg))) - (:note "inline fixnum arithmetic") - (:arg-types tagged-num) - (:result-types tagged-num) - (:policy :fast-safe)) - -(define-vop (signed-unop) - (:args (x :scs (signed-reg))) - (:results (res :scs (signed-reg))) - (:note "inline (signed-byte 64) arithmetic") - (:arg-types signed-num) - (:result-types signed-num) - (:policy :fast-safe)) - -(define-vop (fast-negate/fixnum fixnum-unop) - (:translate %negate) - (:generator 1 - (inst subq zero-tn x res))) - -(define-vop (fast-negate/signed signed-unop) - (:translate %negate) - (:generator 2 - (inst subq zero-tn x res))) - -(define-vop (fast-lognot/fixnum fixnum-unop) - (:translate lognot) - (:generator 1 - (inst eqv x fixnum-tag-mask res))) - -(define-vop (fast-lognot/signed signed-unop) - (:translate lognot) - (:generator 2 - (inst not x res))) - -;;;; binary fixnum operations - -;;; Assume that any constant operand is the second arg... - -(define-vop (fast-fixnum-binop) - (:args (x :target r :scs (any-reg)) - (y :target r :scs (any-reg))) - (:arg-types tagged-num tagged-num) - (:results (r :scs (any-reg))) - (:result-types tagged-num) - (:note "inline fixnum arithmetic") - (:policy :fast-safe)) - -(define-vop (fast-unsigned-binop) - (:args (x :target r :scs (unsigned-reg)) - (y :target r :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num) - (:results (r :scs (unsigned-reg))) - (:result-types unsigned-num) - (:note "inline (unsigned-byte 64) arithmetic") - (:policy :fast-safe)) - -(define-vop (fast-signed-binop) - (:args (x :target r :scs (signed-reg)) - (y :target r :scs (signed-reg))) - (:arg-types signed-num signed-num) - (:results (r :scs (signed-reg))) - (:result-types signed-num) - (:note "inline (signed-byte 64) arithmetic") - (:policy :fast-safe)) - -(define-vop (fast-fixnum-c-binop fast-fixnum-binop) - (:args (x :target r :scs (any-reg))) - (:info y) - (:arg-types tagged-num (:constant integer))) - -(define-vop (fast-signed-c-binop fast-signed-binop) - (:args (x :target r :scs (signed-reg))) - (:info y) - (:arg-types signed-num (:constant integer))) - -(define-vop (fast-unsigned-c-binop fast-unsigned-binop) - (:args (x :target r :scs (unsigned-reg))) - (:info y) - (:arg-types unsigned-num (:constant integer))) - -(defmacro define-binop (translate cost untagged-cost op - tagged-type untagged-type - &optional arg-swap restore-fixnum-mask) - `(progn - (define-vop (,(symbolicate "FAST-" translate "/FIXNUM=>FIXNUM") - fast-fixnum-binop) - ,@(when restore-fixnum-mask - `((:temporary (:sc non-descriptor-reg) temp))) - (:args (x ,@(unless restore-fixnum-mask `(:target r)) :scs (any-reg)) - (y ,@(unless restore-fixnum-mask `(:target r)) :scs (any-reg))) - (:translate ,translate) - (:generator ,(1+ cost) - ,(if arg-swap - `(inst ,op y x ,(if restore-fixnum-mask 'temp 'r)) - `(inst ,op x y ,(if restore-fixnum-mask 'temp 'r))) - ,@(when restore-fixnum-mask - `((inst bic temp #.(ash lowtag-mask -1) r))))) - (define-vop (,(symbolicate "FAST-" translate "/SIGNED=>SIGNED") - fast-signed-binop) - (:args (x :target r :scs (signed-reg)) - (y :target r :scs (signed-reg))) - (:translate ,translate) - (:generator ,(1+ untagged-cost) - ,(if arg-swap - `(inst ,op y x r) - `(inst ,op x y r)))) - (define-vop (,(symbolicate "FAST-" translate "/UNSIGNED=>UNSIGNED") - fast-unsigned-binop) - (:args (x :target r :scs (unsigned-reg)) - (y :target r :scs (unsigned-reg))) - (:translate ,translate) - (:generator ,(1+ untagged-cost) - ,(if arg-swap - `(inst ,op y x r) - `(inst ,op x y r)))) - ,@(when (and tagged-type (not arg-swap)) - `((define-vop (,(symbolicate "FAST-" translate "-C/FIXNUM=>FIXNUM") - fast-fixnum-c-binop) - (:args (x ,@(unless restore-fixnum-mask `(:target r)) - :scs (any-reg))) - (:arg-types tagged-num (:constant ,tagged-type)) - ,@(when restore-fixnum-mask - `((:temporary (:sc non-descriptor-reg) temp))) - (:translate ,translate) - (:generator ,cost - (inst ,op x (fixnumize y) ,(if restore-fixnum-mask 'temp 'r)) - ,@(when restore-fixnum-mask - `((inst bic temp #.(ash lowtag-mask -1) r))))))) - ,@(when (and untagged-type (not arg-swap)) - `((define-vop (,(symbolicate "FAST-" translate "-C/SIGNED=>SIGNED") - fast-signed-c-binop) - (:arg-types signed-num (:constant ,untagged-type)) - (:translate ,translate) - (:generator ,untagged-cost - (inst ,op x y r))) - (define-vop (,(symbolicate "FAST-" translate - "-C/UNSIGNED=>UNSIGNED") - fast-unsigned-c-binop) - (:arg-types unsigned-num (:constant ,untagged-type)) - (:translate ,translate) - (:generator ,untagged-cost - (inst ,op x y r))))))) - -(define-binop + 1 5 addq (unsigned-byte 6) (unsigned-byte 8)) -(define-binop - 1 5 subq (unsigned-byte 6) (unsigned-byte 8)) -(define-binop logand 1 3 and (unsigned-byte 6) (unsigned-byte 8)) -(define-binop logandc1 1 3 bic (unsigned-byte 6) (unsigned-byte 8) t) -(define-binop logandc2 1 3 bic (unsigned-byte 6) (unsigned-byte 8)) -(define-binop logior 1 3 bis (unsigned-byte 6) (unsigned-byte 8)) -(define-binop logorc1 1 3 ornot (unsigned-byte 6) (unsigned-byte 8) t t) -(define-binop logorc2 1 3 ornot (unsigned-byte 6) (unsigned-byte 8) nil t) -(define-binop logxor 1 3 xor (unsigned-byte 6) (unsigned-byte 8)) -(define-binop logeqv 1 3 eqv (unsigned-byte 6) (unsigned-byte 8) nil t) - -;;; special cases for LOGAND where we can use a mask operation -(define-vop (fast-logand-c-mask/unsigned=>unsigned fast-unsigned-c-binop) - (:translate logand) - (:arg-types unsigned-num - (:constant (or (integer #xffffffff #xffffffff) - (integer #xffffffff00000000 #xffffffff00000000)))) - (:generator 1 - (ecase y - (#xffffffff (inst mskll x 4 r)) - (#xffffffff00000000 (inst mskll x 0 r))))) - -;;;; shifting - -(define-vop (fast-ash/unsigned=>unsigned) - (:note "inline ASH") - (:args (number :scs (unsigned-reg) :to :save) - (amount :scs (signed-reg))) - (:arg-types unsigned-num signed-num) - (:results (result :scs (unsigned-reg))) - (:result-types unsigned-num) - (:translate ash) - (:policy :fast-safe) - (:temporary (:sc non-descriptor-reg) ndesc) - (:temporary (:sc non-descriptor-reg) temp) - (:generator 3 - (inst bge amount positive) - (inst subq zero-tn amount ndesc) - (inst cmplt ndesc 64 temp) - (inst srl number ndesc result) - ;; FIXME: this looks like a candidate for a conditional move -- - ;; CSR, 2003-09-10 - (inst bne temp done) - (move zero-tn result) - (inst br zero-tn done) - - POSITIVE - (inst sll number amount result) - - DONE)) - -(define-vop (fast-ash/signed=>signed) - (:note "inline ASH") - (:args (number :scs (signed-reg) :to :save) - (amount :scs (signed-reg))) - (:arg-types signed-num signed-num) - (:results (result :scs (signed-reg))) - (:result-types signed-num) - (:translate ash) - (:policy :fast-safe) - (:temporary (:sc non-descriptor-reg) ndesc) - (:temporary (:sc non-descriptor-reg) temp) - (:generator 3 - (inst bge amount positive) - (inst subq zero-tn amount ndesc) - (inst cmplt ndesc 63 temp) - (inst sra number ndesc result) - (inst bne temp done) - (inst sra number 63 result) - (inst br zero-tn done) - - POSITIVE - (inst sll number amount result) - - DONE)) - -(define-vop (fast-ash-c/signed=>signed) - (:policy :fast-safe) - (:translate ash) - (:note nil) - (:args (number :scs (signed-reg))) - (:info count) - (:arg-types signed-num (:constant integer)) - (:results (result :scs (signed-reg))) - (:result-types signed-num) - (:generator 1 - (cond - ((< count 0) (inst sra number (min 63 (- count)) result)) - ((> count 0) (inst sll number (min 63 count) result)) - (t (bug "identity ASH not transformed away"))))) - -(define-vop (fast-ash-c/unsigned=>unsigned) - (:policy :fast-safe) - (:translate ash) - (:note nil) - (:args (number :scs (unsigned-reg))) - (:info count) - (:arg-types unsigned-num (:constant integer)) - (:results (result :scs (unsigned-reg))) - (:result-types unsigned-num) - (:generator 1 - (cond - ((< count -63) (move zero-tn result)) - ((< count 0) (inst sra number (- count) result)) - ((> count 0) (inst sll number (min 63 count) result)) - (t (bug "identity ASH not transformed away"))))) - -(macrolet ((def (name sc-type type result-type cost) - `(define-vop (,name) - (:note "inline ASH") - (:translate ash) - (:args (number :scs (,sc-type)) - (amount :scs (signed-reg unsigned-reg immediate))) - (:arg-types ,type positive-fixnum) - (:results (result :scs (,result-type))) - (:result-types ,type) - (:policy :fast-safe) - (:generator ,cost - (sc-case amount - ((signed-reg unsigned-reg) - (inst sll number amount result)) - (immediate - (let ((amount (tn-value amount))) - (aver (> amount 0)) - (inst sll number amount result)))))))) - (def fast-ash-left/fixnum=>fixnum any-reg tagged-num any-reg 2) - (def fast-ash-left/signed=>signed signed-reg signed-num signed-reg 3) - (def fast-ash-left/unsigned=>unsigned unsigned-reg unsigned-num unsigned-reg 3)) - -(define-vop (signed-byte-64-len) - (:translate integer-length) - (:note "inline (signed-byte 64) integer-length") - (:policy :fast-safe) - (:args (arg :scs (signed-reg) :to (:argument 1))) - (:arg-types signed-num) - (:results (res :scs (any-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) shift) - (:generator 30 - (inst not arg shift) - (inst cmovge arg arg shift) - (inst subq zero-tn (fixnumize 1) res) - (inst sll shift 1 shift) - LOOP - (inst addq res (fixnumize 1) res) - (inst srl shift 1 shift) - (inst bne shift loop))) - -(define-vop (unsigned-byte-64-count) - (:translate logcount) - (:note "inline (unsigned-byte 64) logcount") - (:policy :fast-safe) - (:args (arg :scs (unsigned-reg))) - (:arg-types unsigned-num) - (:results (res :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:guard (member :cix *backend-subfeatures*)) - (:generator 1 - (inst ctpop zero-tn arg res))) - -(define-vop (unsigned-byte-64-count) - (:translate logcount) - (:note "inline (unsigned-byte 64) logcount") - (:policy :fast-safe) - (:args (arg :scs (unsigned-reg) :target num)) - (:arg-types unsigned-num) - (:results (res :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0) :to (:result 0) - :target res) num) - (:temporary (:scs (non-descriptor-reg)) mask temp) - (:generator 60 - ;; FIXME: now this looks expensive, what with these 64bit loads. - ;; Maybe a loop and count would be faster? -- CSR, 2003-09-10 - (inst li #x5555555555555555 mask) - (inst srl arg 1 temp) - (inst and arg mask num) - (inst and temp mask temp) - (inst addq num temp num) - (inst li #x3333333333333333 mask) - (inst srl num 2 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst addq num temp num) - (inst li #x0f0f0f0f0f0f0f0f mask) - (inst srl num 4 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst addq num temp num) - (inst li #x00ff00ff00ff00ff mask) - (inst srl num 8 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst addq num temp num) - (inst li #x0000ffff0000ffff mask) - (inst srl num 16 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst addq num temp num) - (inst li #x00000000ffffffff mask) - (inst srl num 32 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst addq num temp res))) - -;;;; multiplying - -(define-vop (fast-*/fixnum=>fixnum fast-fixnum-binop) - (:temporary (:scs (non-descriptor-reg)) temp) - (:translate *) - (:generator 4 - (inst sra y n-fixnum-tag-bits temp) - (inst mulq x temp r))) - -(define-vop (fast-*/signed=>signed fast-signed-binop) - (:translate *) - (:generator 3 - (inst mulq x y r))) - -(define-vop (fast-*/unsigned=>unsigned fast-unsigned-binop) - (:translate *) - (:generator 3 - (inst mulq x y r))) - -;;;; Modular functions: -(define-modular-fun lognot-mod64 (x) lognot :untagged nil 64) -(define-vop (lognot-mod64/unsigned=>unsigned) - (:translate lognot-mod64) - (:args (x :scs (unsigned-reg))) - (:arg-types unsigned-num) - (:results (res :scs (unsigned-reg))) - (:result-types unsigned-num) - (:policy :fast-safe) - (:generator 1 - (inst not x res))) - -(define-vop (fast-ash-left-mod64-c/unsigned=>unsigned - fast-ash-c/unsigned=>unsigned) - (:translate ash-left-mod64)) -(define-vop (fast-ash-left-mod64/unsigned=>unsigned - fast-ash-left/unsigned=>unsigned)) -(deftransform ash-left-mod64 ((integer count) - ((unsigned-byte 64) (unsigned-byte 6))) - (when (sb-c::constant-lvar-p count) - (sb-c::give-up-ir1-transform)) - '(%primitive fast-ash-left-mod64/unsigned=>unsigned integer count)) - -(macrolet - ((define-modular-backend (fun &optional constantp) - (let ((mfun-name (symbolicate fun '-mod64)) - (modvop (symbolicate 'fast- fun '-mod64/unsigned=>unsigned)) - (modcvop (symbolicate 'fast- fun '-mod64-c/unsigned=>unsigned)) - (vop (symbolicate 'fast- fun '/unsigned=>unsigned)) - (cvop (symbolicate 'fast- fun '-c/unsigned=>unsigned))) - `(progn - (define-modular-fun ,mfun-name (x y) ,fun :untagged nil 64) - (define-vop (,modvop ,vop) - (:translate ,mfun-name)) - ,@(when constantp - `((define-vop (,modcvop ,cvop) - (:translate ,mfun-name)))))))) - (define-modular-backend + t) - (define-modular-backend - t) - (define-modular-backend logeqv t) - (define-modular-backend logandc1) - (define-modular-backend logandc2 t) - (define-modular-backend logorc1) - (define-modular-backend logorc2 t)) - -(define-source-transform lognand (x y) - `(lognot (logand ,x ,y))) -(define-source-transform lognor (x y) - `(lognot (logior ,x ,y))) - -;;;; binary conditional VOPs - -(define-vop (fast-conditional) - (:conditional) - (:info target not-p) - (:temporary (:scs (non-descriptor-reg)) temp) - (:policy :fast-safe)) - -(define-vop (fast-conditional/fixnum fast-conditional) - (:args (x :scs (any-reg)) - (y :scs (any-reg))) - (:arg-types tagged-num tagged-num) - (:note "inline fixnum comparison")) - -(define-vop (fast-conditional-c/fixnum fast-conditional/fixnum) - (:args (x :scs (any-reg))) - (:arg-types tagged-num (:constant (unsigned-byte-with-a-bite-out 6 4))) - (:info target not-p y)) - -(define-vop (fast-conditional/signed fast-conditional) - (:args (x :scs (signed-reg)) - (y :scs (signed-reg))) - (:arg-types signed-num signed-num) - (:note "inline (signed-byte 64) comparison")) - -(define-vop (fast-conditional-c/signed fast-conditional/signed) - (:args (x :scs (signed-reg))) - (:arg-types signed-num (:constant (unsigned-byte-with-a-bite-out 8 1))) - (:info target not-p y)) - -(define-vop (fast-conditional/unsigned fast-conditional) - (:args (x :scs (unsigned-reg)) - (y :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num) - (:note "inline (unsigned-byte 64) comparison")) - -(define-vop (fast-conditional-c/unsigned fast-conditional/unsigned) - (:args (x :scs (unsigned-reg))) - (:arg-types unsigned-num (:constant (unsigned-byte-with-a-bite-out 8 1))) - (:info target not-p y)) - - -(defmacro define-conditional-vop (translate &rest generator) - `(progn - ,@(mapcar (lambda (suffix cost signed) - (unless (and (member suffix '(/fixnum -c/fixnum)) - (eq translate 'eql)) - `(define-vop (,(intern (format nil "~:@(FAST-IF-~A~A~)" - translate suffix)) - ,(intern - (format nil "~:@(FAST-CONDITIONAL~A~)" - suffix))) - (:translate ,translate) - (:generator ,cost - (let* ((signed ,signed) - (-c/fixnum ,(eq suffix '-c/fixnum)) - (y (if -c/fixnum (fixnumize y) y))) - ,@generator))))) - '(/fixnum -c/fixnum /signed -c/signed /unsigned -c/unsigned) - '(3 2 5 4 5 4) - '(t t t t nil nil)))) - -(define-conditional-vop < - (cond ((and signed (eql y 0)) - (if not-p - (inst bge x target) - (inst blt x target))) - (t - (if signed - (inst cmplt x y temp) - (inst cmpult x y temp)) - (if not-p - (inst beq temp target) - (inst bne temp target))))) - -(define-conditional-vop > - (cond ((and signed (eql y 0)) - (if not-p - (inst ble x target) - (inst bgt x target))) - ((integerp y) - (let ((y (+ y (if -c/fixnum (fixnumize 1) 1)))) - (if signed - (inst cmplt x y temp) - (inst cmpult x y temp)) - (if not-p - (inst bne temp target) - (inst beq temp target)))) - (t - (if signed - (inst cmplt y x temp) - (inst cmpult y x temp)) - (if not-p - (inst beq temp target) - (inst bne temp target))))) - -;;; EQL/FIXNUM is funny because the first arg can be of any type, not -;;; just a known fixnum. - -(define-conditional-vop eql - (declare (ignore signed)) - (when (integerp y) - (inst li y temp) - (setf y temp)) - (inst cmpeq x y temp) - (if not-p - (inst beq temp target) - (inst bne temp target))) - -;;; These versions specify a fixnum restriction on their first arg. We -;;; have also generic-eql/fixnum VOPs which are the same, but have no -;;; restriction on the first arg and a higher cost. The reason for -;;; doing this is to prevent fixnum specific operations from being -;;; used on word integers, spuriously consing the argument. -(define-vop (fast-eql/fixnum fast-conditional) - (:args (x :scs (any-reg)) - (y :scs (any-reg))) - (:arg-types tagged-num tagged-num) - (:note "inline fixnum comparison") - (:translate eql) - (:generator 3 - (cond ((equal y zero-tn) - (if not-p - (inst bne x target) - (inst beq x target))) - (t - (inst cmpeq x y temp) - (if not-p - (inst beq temp target) - (inst bne temp target)))))) - -;;; -(define-vop (generic-eql/fixnum fast-eql/fixnum) - (:args (x :scs (any-reg descriptor-reg)) - (y :scs (any-reg))) - (:arg-types * tagged-num) - (:variant-cost 7)) - -(define-vop (fast-eql-c/fixnum fast-conditional/fixnum) - (:args (x :scs (any-reg))) - (:arg-types tagged-num (:constant (signed-byte 6))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:info target not-p y) - (:translate eql) - (:generator 2 - (let ((y (cond ((eql y 0) zero-tn) - (t - (inst li (fixnumize y) temp) - temp)))) - (inst cmpeq x y temp) - (if not-p - (inst beq temp target) - (inst bne temp target))))) -;;; -(define-vop (generic-eql-c/fixnum fast-eql-c/fixnum) - (:args (x :scs (any-reg descriptor-reg))) - (:arg-types * (:constant (signed-byte 6))) - (:variant-cost 6)) - - -;;;; 32-bit logical operations - -(define-vop (shift-towards-someplace) - (:policy :fast-safe) - (:args (num :scs (unsigned-reg)) - (amount :scs (signed-reg))) - (:arg-types unsigned-num tagged-num) - (:results (r :scs (unsigned-reg))) - (:result-types unsigned-num)) - -(define-vop (shift-towards-start shift-towards-someplace) - (:translate shift-towards-start) - (:note "SHIFT-TOWARDS-START") - (:temporary (:sc non-descriptor-reg) temp) - (:generator 1 - (inst and amount #x1f temp) - (inst srl num temp r))) - -(define-vop (shift-towards-end shift-towards-someplace) - (:translate shift-towards-end) - (:note "SHIFT-TOWARDS-END") - (:temporary (:sc non-descriptor-reg) temp) - (:generator 1 - (inst and amount #x1f temp) - (inst sll num temp r))) - -;;;; bignum stuff - -(define-vop (bignum-length get-header-data) - (:translate sb-bignum:%bignum-length) - (:policy :fast-safe)) - -(define-vop (bignum-set-length set-header-data) - (:translate sb-bignum:%bignum-set-length) - (:policy :fast-safe)) - -(define-full-reffer bignum-ref * bignum-digits-offset other-pointer-lowtag - (unsigned-reg) unsigned-num sb-bignum:%bignum-ref) - -(define-full-setter bignum-set * bignum-digits-offset other-pointer-lowtag - (unsigned-reg) unsigned-num sb-bignum:%bignum-set #+gengc nil) - -(define-vop (digit-0-or-plus) - (:translate sb-bignum:%digit-0-or-plusp) - (:policy :fast-safe) - (:args (digit :scs (unsigned-reg))) - (:arg-types unsigned-num) - (:temporary (:sc non-descriptor-reg) temp) - (:conditional) - (:info target not-p) - (:generator 2 - (inst sll digit 32 temp) - (if not-p - (inst blt temp target) - (inst bge temp target)))) - -(define-vop (add-w/carry) - (:translate sb-bignum:%add-with-carry) - (:policy :fast-safe) - (:args (a :scs (unsigned-reg)) - (b :scs (unsigned-reg)) - (c :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num positive-fixnum) - (:results (result :scs (unsigned-reg) :from :load) - (carry :scs (unsigned-reg) :from :eval)) - (:result-types unsigned-num positive-fixnum) - (:generator 5 - (inst addq a b result) - (inst addq result c result) - (inst sra result 32 carry) - (inst mskll result 4 result))) - -(define-vop (sub-w/borrow) - (:translate sb-bignum:%subtract-with-borrow) - (:policy :fast-safe) - (:args (a :scs (unsigned-reg)) - (b :scs (unsigned-reg)) - (c :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num positive-fixnum) - (:results (result :scs (unsigned-reg) :from :load) - (borrow :scs (unsigned-reg) :from :eval)) - (:result-types unsigned-num positive-fixnum) - (:generator 4 - (inst xor c 1 result) - (inst subq a result result) - (inst subq result b result) - (inst srl result 63 borrow) - (inst xor borrow 1 borrow) - (inst mskll result 4 result))) - -(define-vop (bignum-mult-and-add-3-arg) - (:translate sb-bignum:%multiply-and-add) - (:policy :fast-safe) - (:args (x :scs (unsigned-reg)) - (y :scs (unsigned-reg)) - (carry-in :scs (unsigned-reg) :to :save)) - (:arg-types unsigned-num unsigned-num unsigned-num) - (:results (hi :scs (unsigned-reg)) - (lo :scs (unsigned-reg))) - (:result-types unsigned-num unsigned-num) - (:generator 6 - (inst mulq x y lo) - (inst addq lo carry-in lo) - (inst srl lo 32 hi) - (inst mskll lo 4 lo))) - - -(define-vop (bignum-mult-and-add-4-arg) - (:translate sb-bignum:%multiply-and-add) - (:policy :fast-safe) - (:args (x :scs (unsigned-reg)) - (y :scs (unsigned-reg)) - (prev :scs (unsigned-reg)) - (carry-in :scs (unsigned-reg) :to :save)) - (:arg-types unsigned-num unsigned-num unsigned-num unsigned-num) - (:results (hi :scs (unsigned-reg)) - (lo :scs (unsigned-reg))) - (:result-types unsigned-num unsigned-num) - (:generator 9 - (inst mulq x y lo) - (inst addq lo prev lo) - (inst addq lo carry-in lo) - (inst srl lo 32 hi) - (inst mskll lo 4 lo))) - -(define-vop (bignum-mult) - (:translate sb-bignum:%multiply) - (:policy :fast-safe) - (:args (x :scs (unsigned-reg)) - (y :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num) - (:results (hi :scs (unsigned-reg)) - (lo :scs (unsigned-reg))) - (:result-types unsigned-num unsigned-num) - (:generator 3 - (inst mulq x y lo) - (inst srl lo 32 hi) - (inst mskll lo 4 lo))) - -(define-vop (bignum-lognot) - (:translate sb-bignum:%lognot) - (:policy :fast-safe) - (:args (x :scs (unsigned-reg))) - (:arg-types unsigned-num) - (:results (r :scs (unsigned-reg))) - (:result-types unsigned-num) - (:generator 1 - (inst not x r) - (inst mskll r 4 r))) - -(define-vop (fixnum-to-digit) - (:translate sb-bignum:%fixnum-to-digit) - (:policy :fast-safe) - (:args (fixnum :scs (any-reg))) - (:arg-types tagged-num) - (:results (digit :scs (unsigned-reg))) - (:result-types unsigned-num) - (:generator 1 - (inst sra fixnum n-fixnum-tag-bits digit))) - -(define-vop (bignum-floor) - (:translate sb-bignum:%bigfloor) - (:policy :fast-safe) - (:args (num-high :scs (unsigned-reg)) - (num-low :scs (unsigned-reg)) - (denom-arg :scs (unsigned-reg) :target denom)) - (:arg-types unsigned-num unsigned-num unsigned-num) - (:temporary (:scs (unsigned-reg) :from (:argument 2)) denom) - (:temporary (:scs (unsigned-reg) :from (:eval 0)) temp) - (:results (quo :scs (unsigned-reg) :from (:eval 0)) - (rem :scs (unsigned-reg) :from (:argument 0))) - (:result-types unsigned-num unsigned-num) - (:generator 325 ; number of inst assuming targeting works. - (inst sll num-high 32 rem) - (inst bis rem num-low rem) - (inst sll denom-arg 32 denom) - (inst cmpule denom rem quo) - (inst beq quo shift1) - (inst subq rem denom rem) - SHIFT1 - (dotimes (i 32) - (let ((shift2 (gen-label))) - (inst srl denom 1 denom) - (inst cmpule denom rem temp) - (inst sll quo 1 quo) - (inst beq temp shift2) - (inst subq rem denom rem) - (inst bis quo 1 quo) - (emit-label shift2))))) - -(define-vop (signify-digit) - (:translate sb-bignum:%fixnum-digit-with-correct-sign) - (:policy :fast-safe) - (:args (digit :scs (unsigned-reg) :target res)) - (:arg-types unsigned-num) - (:results (res :scs (any-reg signed-reg))) - (:result-types signed-num) - (:generator 2 - (sc-case res - (any-reg - (inst sll digit 34 res) - (inst sra res 32 res)) - (signed-reg - (inst sll digit 32 res) - (inst sra res 32 res))))) - - -(define-vop (digit-ashr) - (:translate sb-bignum:%ashr) - (:policy :fast-safe) - (:args (digit :scs (unsigned-reg)) - (count :scs (unsigned-reg))) - (:arg-types unsigned-num positive-fixnum) - (:results (result :scs (unsigned-reg) :from (:argument 0))) - (:result-types unsigned-num) - (:generator 1 - (inst sll digit 32 result) - (inst sra result count result) - (inst srl result 32 result))) - -(define-vop (digit-lshr digit-ashr) - (:translate sb-bignum:%digit-logical-shift-right) - (:generator 1 - (inst srl digit count result))) - -(define-vop (digit-ashl digit-ashr) - (:translate sb-bignum:%ashl) - (:generator 1 - (inst sll digit count result))) diff --git a/src/compiler/alpha/array.lisp b/src/compiler/alpha/array.lisp deleted file mode 100644 index 99239ca8e4..0000000000 --- a/src/compiler/alpha/array.lisp +++ /dev/null @@ -1,534 +0,0 @@ -;;;; the Alpha definitions for array operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; allocator for the array header -(define-vop (make-array-header) - (:policy :fast-safe) - (:translate make-array-header) - (:args (type :scs (any-reg)) - (rank :scs (any-reg))) - (:arg-types positive-fixnum positive-fixnum) - (:temporary (:scs (any-reg)) bytes) - (:temporary (:scs (non-descriptor-reg)) header) - (:results (result :scs (descriptor-reg))) - (:generator 13 - (inst addq rank (+ (* array-dimensions-offset n-word-bytes) - lowtag-mask) - bytes) - (inst li (lognot lowtag-mask) header) - (inst and bytes header bytes) - (inst addq rank (fixnumize (1- array-dimensions-offset)) header) - (inst sll header n-widetag-bits header) - (inst bis header type header) - (inst srl header n-fixnum-tag-bits header) - (pseudo-atomic () - (inst bis alloc-tn other-pointer-lowtag result) - (storew header result 0 other-pointer-lowtag) - (inst addq alloc-tn bytes alloc-tn)))) - -;;;; additional accessors and setters for the array header -(define-full-reffer %array-dimension * - array-dimensions-offset other-pointer-lowtag - (any-reg) positive-fixnum %array-dimension) - -(define-full-setter %set-array-dimension * - array-dimensions-offset other-pointer-lowtag - (any-reg) positive-fixnum %set-array-dimension #+gengc nil) - -(define-vop (array-rank-vop) - (:translate %array-rank) - (:policy :fast-safe) - (:args (x :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (res :scs (any-reg descriptor-reg))) - (:generator 6 - (loadw temp x 0 other-pointer-lowtag) - (inst sra temp n-widetag-bits temp) - (inst subq temp (1- array-dimensions-offset) temp) - (inst sll temp n-fixnum-tag-bits res))) - -;;;; bounds checking routine -(define-vop (check-bound) - (:translate %check-bound) - (:policy :fast-safe) - (:args (array :scs (descriptor-reg)) - (bound :scs (any-reg descriptor-reg)) - (index :scs (any-reg descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:vop-var vop) - (:save-p :compute-only) - (:generator 5 - (let ((error (generate-error-code vop 'invalid-array-index-error - array bound index))) - (%test-fixnum index temp error t) - (inst cmpult index bound temp) - (inst beq temp error)))) - -;;;; accessors/setters - -;;; Variants built on top of word-index-ref, etc. I.e. those vectors -;;; whose elements are represented in integer registers and are built -;;; out of 8, 16, or 32 bit elements. -(macrolet ((def-full-data-vector-frobs (type element-type &rest scs) - `(progn - (define-full-reffer ,(symbolicate "DATA-VECTOR-REF/" type) - ,type - vector-data-offset other-pointer-lowtag - ,(remove-if (lambda (x) (member x '(null zero))) scs) - ,element-type - data-vector-ref) - (define-full-setter ,(symbolicate "DATA-VECTOR-SET/" type) - ,type - vector-data-offset other-pointer-lowtag ,scs ,element-type - data-vector-set #+gengc ,(if (member 'descriptor-reg scs) - t - nil)))) - - (def-partial-data-vector-frobs - (type element-type size signed &rest scs) - `(progn - (define-partial-reffer ,(symbolicate "DATA-VECTOR-REF/" type) - ,type - ,size ,signed vector-data-offset other-pointer-lowtag ,scs - ,element-type data-vector-ref) - (define-partial-setter ,(symbolicate "DATA-VECTOR-SET/" type) - ,type - ,size vector-data-offset other-pointer-lowtag ,scs - ,element-type data-vector-set))) - (def-small-data-vector-frobs (type bits) - (let* ((elements-per-word (floor n-word-bits bits)) - (bit-shift (1- (integer-length elements-per-word)))) - `(progn - (define-vop (,(symbolicate 'data-vector-ref/ type)) - (:note "inline array access") - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (unsigned-reg))) - (:arg-types ,type positive-fixnum) - (:results (value :scs (any-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (interior-reg)) lip) - (:temporary (:scs (non-descriptor-reg) :to (:result 0)) - temp result) - (:generator 20 - (inst srl index ,bit-shift temp) - (inst sll temp n-fixnum-tag-bits temp) - (inst addq object temp lip) - (inst ldl result - (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag) - lip) - (inst and index ,(1- elements-per-word) temp) - ,@(unless (= bits 1) - `((inst sll temp - ,(1- (integer-length bits)) temp))) - (inst srl result temp result) - (inst and result ,(1- (ash 1 bits)) result) - (inst sll result n-fixnum-tag-bits value))) - (define-vop (,(symbolicate 'data-vector-ref-c/ type)) - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:arg-types ,type - (:constant - (integer 0 - ,(1- (* (1+ (- (floor (+ #x7fff - other-pointer-lowtag) - n-word-bytes) - vector-data-offset)) - elements-per-word))))) - (:info index) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 15 - (multiple-value-bind (word extra) - (floor index ,elements-per-word) - (loadw result object (+ word - vector-data-offset) - other-pointer-lowtag) - (unless (zerop extra) - (inst srl result (* extra ,bits) result)) - (unless (= extra ,(1- elements-per-word)) - (inst and result ,(1- (ash 1 bits)) - result))))) - (define-vop (,(symbolicate 'data-vector-set/ type)) - (:note "inline array store") - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (unsigned-reg) :target shift) - (value :scs (unsigned-reg zero immediate) - :target result)) - (:arg-types ,type positive-fixnum positive-fixnum) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (interior-reg)) lip) - (:temporary (:scs (non-descriptor-reg)) temp old) - (:temporary (:scs (non-descriptor-reg) - :from (:argument 1)) shift) - (:generator 25 - (inst srl index ,bit-shift temp) - (inst sll temp n-fixnum-tag-bits temp) - (inst addq object temp lip) - (inst ldl old - (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag) - lip) - (inst and index ,(1- elements-per-word) shift) - ,@(unless (= bits 1) - `((inst sll shift ,(1- (integer-length - bits)) - shift))) - (unless (and (sc-is value immediate) - (= (tn-value value) - ,(1- (ash 1 bits)))) - (inst li ,(1- (ash 1 bits)) temp) - (inst sll temp shift temp) - (inst not temp temp) - (inst and old temp old)) - (unless (sc-is value zero) - (sc-case value - (immediate - (inst li - (logand (tn-value value) - ,(1- (ash 1 bits))) - temp)) - (unsigned-reg - (inst and value - ,(1- (ash 1 bits)) - temp))) - (inst sll temp shift temp) - (inst bis old temp old)) - (inst stl old - (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag) - lip) - (sc-case value - (immediate - (inst li (tn-value value) result)) - (zero - (move zero-tn result)) - (unsigned-reg - (move value result))))) - (define-vop (,(symbolicate 'data-vector-set-c/ type)) - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (value :scs (unsigned-reg zero immediate) - :target result)) - (:arg-types ,type - (:constant - (integer 0 - ,(1- (* (1+ (- (floor (+ #x7fff - other-pointer-lowtag) - n-word-bytes) - vector-data-offset)) - elements-per-word)))) - positive-fixnum) - (:info index) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (non-descriptor-reg)) temp old) - (:generator 20 - (multiple-value-bind (word extra) - (floor index ,elements-per-word) - (inst ldl old - (- (* (+ word vector-data-offset) - n-word-bytes) - other-pointer-lowtag) - object) - (unless (and (sc-is value immediate) - (= (tn-value value) - ,(1- (ash 1 bits)))) - (cond #+#.(cl:if - (cl:= sb-vm:n-word-bits sb-vm:n-machine-word-bits) - '(and) '(or)) - ((= extra ,(1- elements-per-word)) - (inst sll old ,bits old) - (inst srl old ,bits old)) - (t - (inst li - (lognot (ash ,(1- (ash 1 - bits)) - (* extra ,bits))) - temp) - (inst and old temp old)))) - (sc-case value - (zero) - (immediate - (let ((value - (ash (logand (tn-value - value) - ,(1- (ash 1 - bits))) - (* extra - ,bits)))) - (cond ((< value #x100) - (inst bis old value old)) - (t - (inst li value temp) - (inst bis old temp old))))) - (unsigned-reg - (inst sll value (* extra ,bits) - temp) - (inst bis old temp old))) - (inst stl old - (- (* (+ word vector-data-offset) - n-word-bytes) - other-pointer-lowtag) - object) - (sc-case value - (immediate - (inst li (tn-value value) result)) - (zero - (move zero-tn result)) - (unsigned-reg - (move value result)))))))))) - (def-full-data-vector-frobs simple-vector * - descriptor-reg any-reg null zero) - - (def-partial-data-vector-frobs simple-base-string character :byte nil - character-reg) - #+sb-unicode ; FIXME: what about when a word is 64 bits? - (def-full-data-vector-frobs simple-character-string character character-reg) - - (def-partial-data-vector-frobs simple-array-unsigned-byte-7 positive-fixnum - :byte nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-8 positive-fixnum - :byte nil unsigned-reg signed-reg) - - (def-partial-data-vector-frobs simple-array-unsigned-byte-15 positive-fixnum - :short nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-16 positive-fixnum - :short nil unsigned-reg signed-reg) - - (def-full-data-vector-frobs simple-array-unsigned-byte-31 unsigned-num - unsigned-reg) - (def-full-data-vector-frobs simple-array-unsigned-byte-32 unsigned-num - unsigned-reg) - - (def-partial-data-vector-frobs simple-array-signed-byte-8 tagged-num - :byte t signed-reg) - - (def-partial-data-vector-frobs simple-array-signed-byte-16 tagged-num - :short t signed-reg) - - (def-full-data-vector-frobs simple-array-unsigned-fixnum positive-fixnum - any-reg) - (def-full-data-vector-frobs simple-array-fixnum tagged-num any-reg) - - (def-full-data-vector-frobs simple-array-signed-byte-32 signed-num - signed-reg) - - ;; Integer vectors whos elements are smaller than a byte. I.e. bit, - ;; 2-bit, and 4-bit vectors. - (def-small-data-vector-frobs simple-bit-vector 1) - (def-small-data-vector-frobs simple-array-unsigned-byte-2 2) - (def-small-data-vector-frobs simple-array-unsigned-byte-4 4)) - -;;; and the float variants.. - -(define-vop (data-vector-ref/simple-array-single-float) - (:note "inline array access") - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types simple-array-single-float positive-fixnum) - (:results (value :scs (single-reg))) - (:result-types single-float) - (:temporary (:scs (interior-reg)) lip) - (:generator 20 - (inst addq object index lip) - (inst lds value - (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag) - lip))) - -(define-vop (data-vector-set/simple-array-single-float) - (:note "inline array store") - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (single-reg) :target result)) - (:arg-types simple-array-single-float positive-fixnum single-float) - (:results (result :scs (single-reg))) - (:result-types single-float) - (:temporary (:scs (interior-reg)) lip) - (:generator 20 - (inst addq object index lip) - (inst sts value - (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag) - lip) - (unless (location= result value) - (inst fmove value result)))) - -(define-vop (data-vector-ref/simple-array-double-float) - (:note "inline array access") - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types simple-array-double-float positive-fixnum) - (:results (value :scs (double-reg))) - (:result-types double-float) - (:temporary (:scs (interior-reg)) lip) - (:generator 20 - (inst addq object index lip) - (inst addq lip index lip) - (inst ldt value - (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag) - lip))) - -(define-vop (data-vector-set/simple-array-double-float) - (:note "inline array store") - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (double-reg) :target result)) - (:arg-types simple-array-double-float positive-fixnum double-float) - (:results (result :scs (double-reg))) - (:result-types double-float) - (:temporary (:scs (interior-reg)) lip) - (:generator 20 - (inst addq object index lip) - (inst addq lip index lip) - (inst stt value - (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag) lip) - (unless (location= result value) - (inst fmove value result)))) - -;;; complex float arrays - -(define-vop (data-vector-ref/simple-array-complex-single-float) - (:note "inline array access") - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types simple-array-complex-single-float positive-fixnum) - (:results (value :scs (complex-single-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types complex-single-float) - (:generator 5 - (let ((real-tn (complex-single-reg-real-tn value))) - (inst addq object index lip) - (inst addq lip index lip) - (inst lds real-tn - (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - lip)) - (let ((imag-tn (complex-single-reg-imag-tn value))) - (inst lds imag-tn - (- (* (1+ vector-data-offset) n-word-bytes) other-pointer-lowtag) - lip)))) - -(define-vop (data-vector-set/simple-array-complex-single-float) - (:note "inline array store") - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (complex-single-reg) :target result)) - (:arg-types simple-array-complex-single-float positive-fixnum - complex-single-float) - (:results (result :scs (complex-single-reg))) - (:result-types complex-single-float) - (:temporary (:scs (interior-reg)) lip) - (:generator 5 - (let ((value-real (complex-single-reg-real-tn value)) - (result-real (complex-single-reg-real-tn result))) - (inst addq object index lip) - (inst addq lip index lip) - (inst sts value-real - (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - lip) - (unless (location= result-real value-real) - (inst fmove value-real result-real))) - (let ((value-imag (complex-single-reg-imag-tn value)) - (result-imag (complex-single-reg-imag-tn result))) - (inst sts value-imag - (- (* (1+ vector-data-offset) n-word-bytes) other-pointer-lowtag) - lip) - (unless (location= result-imag value-imag) - (inst fmove value-imag result-imag))))) - -(define-vop (data-vector-ref/simple-array-complex-double-float) - (:note "inline array access") - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types simple-array-complex-double-float positive-fixnum) - (:results (value :scs (complex-double-reg))) - (:result-types complex-double-float) - (:temporary (:scs (interior-reg)) lip) - (:generator 7 - (let ((real-tn (complex-double-reg-real-tn value))) - (inst addq object index lip) - (inst addq lip index lip) - (inst addq lip index lip) - (inst addq lip index lip) - (inst ldt real-tn - (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - lip)) - (let ((imag-tn (complex-double-reg-imag-tn value))) - (inst ldt imag-tn - (- (* (+ vector-data-offset 2) n-word-bytes) other-pointer-lowtag) - lip)))) - -(define-vop (data-vector-set/simple-array-complex-double-float) - (:note "inline array store") - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (complex-double-reg) :target result)) - (:arg-types simple-array-complex-double-float positive-fixnum - complex-double-float) - (:results (result :scs (complex-double-reg))) - (:result-types complex-double-float) - (:temporary (:scs (interior-reg)) lip) - (:generator 20 - (let ((value-real (complex-double-reg-real-tn value)) - (result-real (complex-double-reg-real-tn result))) - (inst addq object index lip) - (inst addq lip index lip) - (inst addq lip index lip) - (inst addq lip index lip) - (inst stt value-real - (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - lip) - (unless (location= result-real value-real) - (inst fmove value-real result-real))) - (let ((value-imag (complex-double-reg-imag-tn value)) - (result-imag (complex-double-reg-imag-tn result))) - (inst stt value-imag - (- (* (+ vector-data-offset 2) n-word-bytes) other-pointer-lowtag) - lip) - (unless (location= result-imag value-imag) - (inst fmove value-imag result-imag))))) - - -;;; These vops are useful for accessing the bits of a vector irrespective of -;;; what type of vector it is. -;;; -(define-full-reffer vector-raw-bits * vector-data-offset other-pointer-lowtag - (unsigned-reg) unsigned-num %vector-raw-bits) -(define-full-setter set-vector-raw-bits * vector-data-offset other-pointer-lowtag - (unsigned-reg) unsigned-num %set-vector-raw-bits) diff --git a/src/compiler/alpha/c-call.lisp b/src/compiler/alpha/c-call.lisp deleted file mode 100644 index 907af7d48d..0000000000 --- a/src/compiler/alpha/c-call.lisp +++ /dev/null @@ -1,199 +0,0 @@ -;;;; VOPs and other machine-specific support routines for call-out to C - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(defstruct arg-state - (stack-frame-size 0)) - -(define-alien-type-method (integer :arg-tn) (type state) - (let ((stack-frame-size (arg-state-stack-frame-size state))) - (setf (arg-state-stack-frame-size state) (1+ stack-frame-size)) - (multiple-value-bind - (ptype reg-sc stack-sc) - (if (alien-integer-type-signed type) - (values 'signed-byte-64 signed-reg-sc-number signed-stack-sc-number) - (values 'unsigned-byte-64 unsigned-reg-sc-number unsigned-stack-sc-number)) - (if (< stack-frame-size 4) - (make-wired-tn* ptype reg-sc (+ stack-frame-size nl0-offset)) - (make-wired-tn* ptype stack-sc (* 2 (- stack-frame-size 4))))))) - -(define-alien-type-method (system-area-pointer :arg-tn) (type state) - (declare (ignore type)) - (let ((stack-frame-size (arg-state-stack-frame-size state))) - (setf (arg-state-stack-frame-size state) (1+ stack-frame-size)) - (if (< stack-frame-size 4) - (make-wired-tn* 'system-area-pointer sap-reg-sc-number - (+ stack-frame-size nl0-offset)) - (make-wired-tn* 'system-area-pointer sap-stack-sc-number - (* 2 (- stack-frame-size 4)))))) - -(define-alien-type-method (double-float :arg-tn) (type state) - (declare (ignore type)) - (let ((stack-frame-size (arg-state-stack-frame-size state))) - (setf (arg-state-stack-frame-size state) (1+ stack-frame-size)) - (if (< stack-frame-size 6) - (make-wired-tn* 'double-float double-reg-sc-number - (+ stack-frame-size nl0-offset)) - (make-wired-tn* 'double-float double-stack-sc-number - (* 2 (- stack-frame-size 4)))))) - -(define-alien-type-method (single-float :arg-tn) (type state) - (declare (ignore type)) - (let ((stack-frame-size (arg-state-stack-frame-size state))) - (setf (arg-state-stack-frame-size state) (1+ stack-frame-size)) - (if (< stack-frame-size 6) - (make-wired-tn* 'single-float single-reg-sc-number - (+ stack-frame-size nl0-offset)) - (make-wired-tn* 'single-float single-stack-sc-number - (* 2 (- stack-frame-size 4)))))) - -(define-alien-type-method (integer :result-tn) (type state) - (declare (ignore state)) - (multiple-value-bind - (ptype reg-sc) - (if (alien-integer-type-signed type) - (values 'signed-byte-64 signed-reg-sc-number) - (values 'unsigned-byte-64 unsigned-reg-sc-number)) - (make-wired-tn* ptype reg-sc lip-offset))) - -(define-alien-type-method (integer :naturalize-gen) (type alien) - (if (<= (alien-type-bits type) 32) - (if (alien-integer-type-signed type) - `(sign-extend ,alien ,(alien-type-bits type)) - `(logand ,alien ,(1- (ash 1 (alien-type-bits type))))) - alien)) - -(define-alien-type-method (system-area-pointer :result-tn) (type state) - (declare (ignore type state)) - (make-wired-tn* 'system-area-pointer sap-reg-sc-number lip-offset)) - -(define-alien-type-method (double-float :result-tn) (type state) - (declare (ignore type state)) - (make-wired-tn* 'double-float double-reg-sc-number lip-offset)) - -(define-alien-type-method (single-float :result-tn) (type state) - (declare (ignore type state)) - (make-wired-tn* 'single-float single-reg-sc-number lip-offset)) - -(define-alien-type-method (values :result-tn) (type state) - (let ((values (alien-values-type-values type))) - (when (cdr values) - (error "Too many result values from c-call.")) - (when values - (invoke-alien-type-method :result-tn (car values) state)))) - -(defun make-call-out-tns (type) - (let ((arg-state (make-arg-state))) - (collect ((arg-tns)) - (dolist (arg-type (alien-fun-type-arg-types type)) - (arg-tns (invoke-alien-type-method :arg-tn arg-type arg-state))) - (values (make-wired-tn* 'positive-fixnum any-reg-sc-number nsp-offset) - (* (max (- (logandc2 (1+ (arg-state-stack-frame-size arg-state)) 1) 4) 2) - n-word-bytes - #.(floor n-machine-word-bits n-word-bits)) - (arg-tns) - (invoke-alien-type-method :result-tn - (alien-fun-type-result-type type) - nil))))) - -(defknown sign-extend ((signed-byte 64) t) fixnum - (foldable flushable movable)) - -(define-vop (sign-extend) - (:translate sign-extend) - (:policy :fast-safe) - (:args (val :scs (signed-reg) :target res)) - (:arg-types signed-num (:constant fixnum)) - (:info size) - (:results (res :scs (signed-reg))) - (:result-types fixnum) - (:generator 1 - (ecase size - (8 - ;;(inst sextb val res) ;; Under what circumstances can we use this? - (inst sll val 56 res) - (inst sra res 56 res)) - (16 - ;;(inst sextw val res) ;; Under what circumstances can we use this? - (inst sll val 48 res) - (inst sra res 48 res)) - (32 - (inst sll val 32 res) - (inst sra res 32 res))))) - -#-sb-xc-host -(defun sign-extend (x size) - (declare (type (signed-byte 64) x)) - (ecase size - (8 (sign-extend x size)) - (16 (sign-extend x size)) - (32 (sign-extend x size)))) - -(define-vop (foreign-symbol-sap) - (:translate foreign-symbol-sap) - (:policy :fast-safe) - (:args) - (:arg-types (:constant simple-string)) - (:info foreign-symbol) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 2 - (inst li (make-fixup foreign-symbol :foreign) res))) - -(define-vop (call-out) - (:args (function :scs (sap-reg) :target cfunc) - (args :more t)) - (:results (results :more t)) - (:ignore args results) - (:save-p t) - (:temporary (:sc any-reg :offset cfunc-offset - :from (:argument 0) :to (:result 0)) cfunc) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp) - (:vop-var vop) - (:generator 0 - (let ((cur-nfp (sb-c:current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (move function cfunc) - (inst li (make-fixup "call_into_c" :foreign) temp) - (inst jsr lip-tn temp (make-fixup "call_into_c" :foreign)) - (when cur-nfp - (maybe-load-stack-nfp-tn cur-nfp nfp-save temp))))) - -(define-vop (alloc-number-stack-space) - (:info amount) - (:results (result :scs (sap-reg any-reg))) - (:result-types system-area-pointer) - (:temporary (:scs (unsigned-reg) :to (:result 0)) temp) - (:generator 0 - (unless (zerop amount) - (let ((delta (logandc2 (+ amount 7) 7))) - (cond ((< delta (ash 1 15)) - (inst lda nsp-tn (- delta) nsp-tn)) - (t - (inst li delta temp) - (inst subq nsp-tn temp nsp-tn))))) - (move nsp-tn result))) - -(define-vop (dealloc-number-stack-space) - (:info amount) - (:policy :fast-safe) - (:temporary (:scs (unsigned-reg) :to (:result 0)) temp) - (:generator 0 - (unless (zerop amount) - (let ((delta (logandc2 (+ amount 7) 7))) - (cond ((< delta (ash 1 15)) - (inst lda nsp-tn delta nsp-tn)) - (t - (inst li delta temp) - (inst addq nsp-tn temp nsp-tn))))))) diff --git a/src/compiler/alpha/call.lisp b/src/compiler/alpha/call.lisp deleted file mode 100644 index 969e6171c4..0000000000 --- a/src/compiler/alpha/call.lisp +++ /dev/null @@ -1,1214 +0,0 @@ -;;;; the VM definition of function call for the Alpha - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(defconstant arg-count-sc (make-sc+offset immediate-arg-scn nargs-offset)) -(defconstant closure-sc (make-sc+offset descriptor-reg-sc-number lexenv-offset)) - -;;; Make a passing location TN for a local call return PC. If standard -;;; is true, then use the standard (full call) location, otherwise use -;;; any legal location. Even in the non-standard case, this may be -;;; restricted by a desire to use a subroutine call instruction. -(defun make-return-pc-passing-location (standard) - (if standard - (make-wired-tn *backend-t-primitive-type* descriptor-reg-sc-number lra-offset) - (make-restricted-tn *backend-t-primitive-type* descriptor-reg-sc-number))) - -;;; This is similar to MAKE-RETURN-PC-PASSING-LOCATION, but makes a -;;; location to pass OLD-FP in. This is (obviously) wired in the -;;; standard convention, but is totally unrestricted in non-standard -;;; conventions, since we can always fetch it off of the stack using -;;; the arg pointer. -(defun make-old-fp-passing-location () - (make-wired-tn *fixnum-primitive-type* immediate-arg-scn ocfp-offset)) - -(defconstant old-fp-passing-offset - (make-sc+offset descriptor-reg-sc-number ocfp-offset)) - -;;; These functions make the TNs used to hold Old-FP and Return-PC -;;; within the current function. We treat these specially so that the -;;; debugger can find them at a known location. -(defun make-old-fp-save-location (env) - (specify-save-tn - (physenv-debug-live-tn (make-normal-tn *fixnum-primitive-type*) env) - (make-wired-tn *fixnum-primitive-type* - control-stack-arg-scn - ocfp-save-offset))) -(defun make-return-pc-save-location (env) - (let ((ptype *backend-t-primitive-type*)) - (specify-save-tn - (physenv-debug-live-tn (make-normal-tn ptype) env) - (make-wired-tn ptype control-stack-arg-scn lra-save-offset)))) - -;;; Make a TN for the standard argument count passing location. We -;;; only need to make the standard location, since a count is never -;;; passed when we are using non-standard conventions. -(defun make-arg-count-location () - (make-wired-tn *fixnum-primitive-type* immediate-arg-scn nargs-offset)) - -;;;; frame hackery - -;;; Return the number of bytes needed for the current non-descriptor -;;; stack frame. Non-descriptor stack frames must be multiples of 16 -;;; bytes to preserve alien stack alignment. -(defun bytes-needed-for-non-descriptor-stack-frame () - (* (logandc2 (+ 3 (sb-allocated-size 'non-descriptor-stack)) 3) - n-word-bytes)) - -;;; This is used for setting up the Old-FP in local call. -(define-vop (current-fp) - (:results (val :scs (any-reg))) - (:generator 1 - (move cfp-tn val))) - -;;; This is used for computing the caller's NFP for use in -;;; known-values return. It only works assuming there is no variable -;;; size stuff on the nstack. -(define-vop (compute-old-nfp) - (:results (val :scs (any-reg))) - (:vop-var vop) - (:generator 1 - (let ((nfp (current-nfp-tn vop))) - (when nfp - (inst lda val (bytes-needed-for-non-descriptor-stack-frame) nfp))))) - -;;; Accessing a slot from an earlier stack frame is definite hackery. -(define-vop (ancestor-frame-ref) - (:args (frame-pointer :scs (descriptor-reg)) - (variable-home-tn :load-if nil)) - (:results (value :scs (descriptor-reg any-reg))) - (:policy :fast-safe) - (:generator 4 - (aver (sc-is variable-home-tn control-stack)) - (loadw value frame-pointer (tn-offset variable-home-tn)))) -(define-vop (ancestor-frame-set) - (:args (frame-pointer :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg))) - (:results (variable-home-tn :load-if nil)) - (:policy :fast-safe) - (:generator 4 - (aver (sc-is variable-home-tn control-stack)) - (storew value frame-pointer (tn-offset variable-home-tn)))) - -(define-vop (xep-allocate-frame) - (:info start-lab) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 1 - ;; Make sure the function is aligned, and drop a label pointing to - ;; this function header. - (emit-alignment n-lowtag-bits) - (emit-label start-lab) - ;; Allocate function header. - (inst simple-fun-header-word) - (inst .skip (* (1- simple-fun-insts-offset) n-word-bytes)) - ;; The start of the actual code. - ;; Compute CODE from the address of this entry point. - (let ((entry-point (gen-label))) - (emit-label entry-point) - (inst compute-code-from-lip code-tn lip-tn entry-point temp) - ;; ### We should also save it on the stack so that the garbage - ;; collector won't forget about us if we call anyone else. - ))) - -(define-vop (xep-setup-sp) - (:vop-var vop) - (:generator 1 - (inst lda - csp-tn - (* n-word-bytes (sb-allocated-size 'control-stack)) - cfp-tn) - (let ((nfp (current-nfp-tn vop))) - (when nfp - (inst lda nsp-tn (- (bytes-needed-for-non-descriptor-stack-frame)) nsp-tn) - (move nsp-tn nfp))))) - -(define-vop (allocate-frame) - (:results (res :scs (any-reg)) - (nfp :scs (any-reg))) - (:info callee) - (:generator 2 - (move csp-tn res) - (inst lda - csp-tn - (* n-word-bytes (sb-allocated-size 'control-stack)) - csp-tn) - (when (ir2-physenv-number-stack-p callee) - (inst lda nsp-tn (- (bytes-needed-for-non-descriptor-stack-frame)) nsp-tn) - (move nsp-tn nfp)))) - -;;; Allocate a partial frame for passing stack arguments in a full -;;; call. NARGS is the number of arguments passed. If no stack -;;; arguments are passed, then we don't have to do anything. -(define-vop (allocate-full-call-frame) - (:info nargs) - (:results (res :scs (any-reg))) - (:generator 2 - (when (> nargs register-arg-count) - (move csp-tn res) - (inst lda csp-tn (* nargs n-word-bytes) csp-tn)))) - -;;; Emit code needed at the return-point from an unknown-values call -;;; for a fixed number of values. Values is the head of the TN-REF -;;; list for the locations that the values are to be received into. -;;; Nvals is the number of values that are to be received (should -;;; equal the length of Values). -;;; -;;; Move-Temp is a Descriptor-Reg TN used as a temporary. -;;; -;;; This code exploits the fact that in the unknown-values convention, -;;; a single value return returns at the return PC + 8, whereas a -;;; return of other than one value returns directly at the return PC. -;;; -;;; If 0 or 1 values are expected, then we just emit an instruction to -;;; reset the SP (which will only be executed when other than 1 value -;;; is returned.) -;;; -;;; In the general case, we have to do three things: -;;; -- Default unsupplied register values. This need only be done when a -;;; single value is returned, since register values are defaulted by the -;;; called in the non-single case. -;;; -- Default unsupplied stack values. This needs to be done whenever there -;;; are stack values. -;;; -- Reset SP. This must be done whenever other than 1 value is returned, -;;; regardless of the number of values desired. -;;; -;;; The general-case code looks like this: -#| - b regs-defaulted ; Skip if MVs - nop - - move a1 null-tn ; Default register values - ... - loadi nargs 1 ; Force defaulting of stack values - move ocfp csp ; Set up args for SP resetting - -regs-defaulted - subu temp nargs register-arg-count - - bltz temp default-value-7 ; jump to default code - addu temp temp -1 - loadw move-temp ocfp-tn 6 ; Move value to correct location. - store-stack-tn val4-tn move-temp - - bltz temp default-value-8 - addu temp temp -1 - loadw move-temp ocfp-tn 7 - store-stack-tn val5-tn move-temp - - ... - -defaulting-done - move sp ocfp ; Reset SP. - - - -default-value-7 - store-stack-tn val4-tn null-tn ; Nil out 7'th value. (first on stack) - -default-value-8 - store-stack-tn val5-tn null-tn ; Nil out 8'th value. - - ... - - br defaulting-done - nop -|# -(defun default-unknown-values (vop values nvals move-temp temp lra-label) - (declare (type (or tn-ref null) values) - (type unsigned-byte nvals) (type tn move-temp temp)) - (if (<= nvals 1) - (progn - ;; Note that this is a single-value return point. This is - ;; actually the multiple-value entry point for a single - ;; desired value, but the code location has to be here, or the - ;; debugger backtrace gets confused. - (without-scheduling () - (note-this-location vop :single-value-return) - (move ocfp-tn csp-tn) - (inst nop)) - (when lra-label - (inst compute-code-from-lra code-tn code-tn lra-label temp))) - (let ((regs-defaulted (gen-label)) - (defaulting-done (gen-label)) - (default-stack-vals (gen-label))) - (without-scheduling () - ;; Note that this is an unknown-values return point. - (note-this-location vop :unknown-return) - ;; If there are no stack results, clear the stack now. - (if (> nvals register-arg-count) - (inst subq nargs-tn (fixnumize register-arg-count) temp) - (move ocfp-tn csp-tn)) - ;; Branch off to the MV case. - (inst br zero-tn regs-defaulted)) - - ;; Do the single value case. - (do ((i 1 (1+ i)) - (val (tn-ref-across values) (tn-ref-across val))) - ((= i (min nvals register-arg-count))) - (move null-tn (tn-ref-tn val))) - (when (> nvals register-arg-count) - (move csp-tn ocfp-tn) - (inst br zero-tn default-stack-vals)) - - (emit-label regs-defaulted) - - (when (> nvals register-arg-count) - ;; If there are stack results, we have to default them - ;; and clear the stack. - (collect ((defaults)) - (do ((i register-arg-count (1+ i)) - (val (do ((i 0 (1+ i)) - (val values (tn-ref-across val))) - ((= i register-arg-count) val)) - (tn-ref-across val))) - ((null val)) - - (let ((default-lab (gen-label)) - (tn (tn-ref-tn val))) - (defaults (cons default-lab tn)) - - (inst ble temp default-lab) - (inst ldl move-temp (* i n-word-bytes) ocfp-tn) - (inst subq temp (fixnumize 1) temp) - (store-stack-tn tn move-temp))) - - (emit-label defaulting-done) - (move ocfp-tn csp-tn) - - (let ((defaults (defaults))) - (aver defaults) - (assemble (:elsewhere) - (emit-label default-stack-vals) - (do ((remaining defaults (cdr remaining))) - ((null remaining)) - (let ((def (car remaining))) - (emit-label (car def)) - (store-stack-tn (cdr def) null-tn))) - (inst br zero-tn defaulting-done))))) - - (when lra-label - (inst compute-code-from-lra code-tn code-tn lra-label temp)))) - (values)) - -;;;; unknown values receiving - -;;; Emit code needed at the return point for an unknown-values call -;;; for an arbitrary number of values. -;;; -;;; We do the single and non-single cases with no shared code: there -;;; doesn't seem to be any potential overlap, and receiving a single -;;; value is more important efficiency-wise. -;;; -;;; When there is a single value, we just push it on the stack, -;;; returning the old SP and 1. -;;; -;;; When there is a variable number of values, we move all of the -;;; argument registers onto the stack, and return Args and Nargs. -;;; -;;; Args and Nargs are TNs wired to the named locations. We must -;;; explicitly allocate these TNs, since their lifetimes overlap with -;;; the results Start and Count (also, it's nice to be able to target -;;; them). -(defun receive-unknown-values (args nargs start count lra-label temp) - (declare (type tn args nargs start count temp)) - (let ((variable-values (gen-label)) - (done (gen-label))) - (without-scheduling () - (inst br zero-tn variable-values) - (inst nop)) - - (when lra-label - (inst compute-code-from-lra code-tn code-tn lra-label temp)) - (inst addq csp-tn 4 csp-tn) - (storew (first *register-arg-tns*) csp-tn -1) - (inst subq csp-tn 4 start) - (inst li (fixnumize 1) count) - - (emit-label done) - - (assemble (:elsewhere) - (emit-label variable-values) - (when lra-label - (inst compute-code-from-lra code-tn code-tn lra-label temp)) - (do ((arg *register-arg-tns* (rest arg)) - (i 0 (1+ i))) - ((null arg)) - (storew (first arg) args i)) - (move args start) - (move nargs count) - (inst br zero-tn done))) - (values)) - -;;; a VOP that can be inherited by unknown values receivers. The main -;;; thing this handles is allocation of the result temporaries. -(define-vop (unknown-values-receiver) - (:results - (start :scs (any-reg)) - (count :scs (any-reg))) - (:temporary (:sc descriptor-reg :offset ocfp-offset - :from :eval :to (:result 0)) - values-start) - (:temporary (:sc any-reg :offset nargs-offset - :from :eval :to (:result 1)) - nvals) - (:temporary (:scs (non-descriptor-reg)) temp)) - -;;; This hook by the codegen lets us insert code before fall-thru entry points, -;;; local-call entry points, and tail-call entry points. The default does -;;; nothing. -(defun emit-block-header (start-label trampoline-label fall-thru-p alignp) - (declare (ignore fall-thru-p alignp)) - (when trampoline-label - (emit-label trampoline-label)) - (emit-label start-label)) - - -;;;; local call with unknown values convention return - -;;; Non-TR local call for a fixed number of values passed according to the -;;; unknown values convention. -;;; -;;; Args are the argument passing locations, which are specified only to -;;; terminate their lifetimes in the caller. -;;; -;;; Values are the return value locations (wired to the standard passing -;;; locations). -;;; -;;; Save is the save info, which we can ignore since saving has been -;;; done. Return-PC is the TN that the return PC should be passed in. -;;; Target is a continuation pointing to the start of the called -;;; function. Nvals is the number of values received. -;;; -;;; Note: we can't use normal load-tn allocation for the fixed args, -;;; since all registers may be tied up by the more operand. Instead, -;;; we use MAYBE-LOAD-STACK-TN. -(define-vop (call-local) - (:args (fp) - (nfp) - (args :more t)) - (:results (values :more t)) - (:save-p t) - (:move-args :local-call) - (:info arg-locs callee target nvals) - (:vop-var vop) - (:temporary (:scs (descriptor-reg) :from :eval) move-temp) - (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:sc any-reg :offset ocfp-offset :from :eval) ocfp) - (:ignore arg-locs args ocfp) - (:generator 5 - (let ((label (gen-label)) - (cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (let ((callee-nfp (callee-nfp-tn callee))) - (maybe-load-stack-nfp-tn callee-nfp nfp temp)) - (maybe-load-stack-tn cfp-tn fp) - (inst compute-lra-from-code - (callee-return-pc-tn callee) code-tn label temp) - (note-this-location vop :call-site) - (inst br zero-tn target) - (emit-return-pc label) - (default-unknown-values vop values nvals move-temp temp label) - (maybe-load-stack-nfp-tn cur-nfp nfp-save temp)))) - - -;;; Non-TR local call for a variable number of return values passed -;;; according to the unknown values convention. The results are the -;;; start of the values glob and the number of values received. -;;; -;;; Note: we can't use normal load-tn allocation for the fixed args, -;;; since all registers may be tied up by the more operand. Instead, -;;; we use MAYBE-LOAD-STACK-TN. -(define-vop (multiple-call-local unknown-values-receiver) - (:args (fp) - (nfp) - (args :more t)) - (:save-p t) - (:move-args :local-call) - (:info save callee target) - (:ignore args save) - (:vop-var vop) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 20 - (let ((label (gen-label)) - (cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (let ((callee-nfp (callee-nfp-tn callee))) - (maybe-load-stack-nfp-tn callee-nfp nfp temp)) - (maybe-load-stack-tn cfp-tn fp) - (inst compute-lra-from-code - (callee-return-pc-tn callee) code-tn label temp) - (note-this-location vop :call-site) - (inst bsr zero-tn target) - (emit-return-pc label) - (note-this-location vop :unknown-return) - (receive-unknown-values values-start nvals start count label temp) - (maybe-load-stack-nfp-tn cur-nfp nfp-save temp)))) - - -;;;; local call with known values return - -;;; Non-TR local call with known return locations. Known-value return -;;; works just like argument passing in local call. -;;; -;;; Note: we can't use normal load-tn allocation for the fixed args, since all -;;; registers may be tied up by the more operand. Instead, we use -;;; MAYBE-LOAD-STACK-TN. -(define-vop (known-call-local) - (:args (fp) - (nfp) - (args :more t)) - (:results (res :more t)) - (:move-args :local-call) - (:save-p t) - (:info save callee target) - (:ignore args res save) - (:vop-var vop) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 5 - (let ((label (gen-label)) - (cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (let ((callee-nfp (callee-nfp-tn callee))) - (maybe-load-stack-nfp-tn callee-nfp nfp temp)) - (maybe-load-stack-tn cfp-tn fp) - (inst compute-lra-from-code - (callee-return-pc-tn callee) code-tn label temp) - (note-this-location vop :call-site) - (inst bsr zero-tn target) - (emit-return-pc label) - (note-this-location vop :known-return) - (maybe-load-stack-nfp-tn cur-nfp nfp-save temp)))) - -;;; Return from known values call. We receive the return locations as -;;; arguments to terminate their lifetimes in the returning function. -;;; We restore FP and CSP and jump to the Return-PC. -;;; -;;; Note: we can't use normal load-tn allocation for the fixed args, -;;; since all registers may be tied up by the more operand. Instead, -;;; we use MAYBE-LOAD-STACK-TN. -(define-vop (known-return) - (:args (ocfp :target ocfp-temp) - (return-pc :target return-pc-temp) - (vals :more t)) - (:temporary (:sc any-reg :from (:argument 0)) ocfp-temp) - (:temporary (:sc any-reg :from (:argument 1)) - return-pc-temp) - (:temporary (:scs (interior-reg)) lip) - (:move-args :known-return) - (:info val-locs) - (:ignore val-locs vals) - (:vop-var vop) - (:generator 6 - (maybe-load-stack-tn ocfp-temp ocfp) - (maybe-load-stack-tn return-pc-temp return-pc) - (move cfp-tn csp-tn) - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (inst lda nsp-tn (bytes-needed-for-non-descriptor-stack-frame) - cur-nfp))) - (inst subq return-pc-temp (- other-pointer-lowtag n-word-bytes) lip) - (move ocfp-temp cfp-tn) - (inst ret zero-tn lip 1))) - -;;;; full call: -;;;; -;;;; There is something of a cross-product effect with full calls. -;;;; Different versions are used depending on whether we know the -;;;; number of arguments or the name of the called function, and -;;;; whether we want fixed values, unknown values, or a tail call. -;;;; -;;;; In full call, the arguments are passed creating a partial frame on -;;;; the stack top and storing stack arguments into that frame. On -;;;; entry to the callee, this partial frame is pointed to by FP. If -;;;; there are no stack arguments, we don't bother allocating a partial -;;;; frame, and instead set FP to SP just before the call. - -;;; This macro helps in the definition of full call VOPs by avoiding -;;; code replication in defining the cross-product VOPs. -;;; -;;; Name is the name of the VOP to define. -;;; -;;; Named is true if the first argument is a symbol whose global -;;; function definition is to be called. -;;; -;;; Return is either :FIXED, :UNKNOWN or :TAIL: -;;; -- If :FIXED, then the call is for a fixed number of values, returned -;;; in the standard passing locations (passed as result operands). -;;; -- If :UNKNOWN, then the result values are pushed on the stack, and -;;; the result values are specified by the Start and Count as in the -;;; unknown-values continuation representation. -;;; -- If :TAIL, then do a tail-recursive call. No values are returned. -;;; The Ocfp and Return-PC are passed as the second and third arguments. -;;; -;;; In non-tail calls, the pointer to the stack arguments is passed as -;;; the last fixed argument. If Variable is false, then the passing -;;; locations are passed as a more arg. Variable is true if there are -;;; a variable number of arguments passed on the stack. Variable -;;; cannot be specified with :TAIL return. TR variable argument call -;;; is implemented separately. -;;; -;;; In tail call with fixed arguments, the passing locations are -;;; passed as a more arg, but there is no new-FP, since the arguments -;;; have been set up in the current frame. -(defmacro define-full-call (name named return variable) - (aver (not (and variable (eq return :tail)))) - `(define-vop (,name - ,@(when (eq return :unknown) - '(unknown-values-receiver))) - (:args - ,@(unless (eq return :tail) - '((new-fp :scs (any-reg) :to :eval))) - ,@(case named - ((nil) - '((arg-fun :target lexenv))) - (:direct) - (t - '((name :target name-pass)))) - - ,@(when (eq return :tail) - '((ocfp :target ocfp-pass) - (return-pc :target return-pc-pass))) - - ,@(unless variable '((args :more t :scs (descriptor-reg))))) - - ,@(when (eq return :fixed) - '((:results (values :more t)))) - - (:save-p ,(if (eq return :tail) :compute-only t)) - - ,@(unless (or (eq return :tail) variable) - '((:move-args :full-call))) - - (:vop-var vop) - (:info ,@(unless (or variable (eq return :tail)) '(arg-locs)) - ,@(unless variable '(nargs)) - ,@(when (eq named :direct) '(fun)) - ,@(when (eq return :fixed) '(nvals)) - step-instrumenting) - - (:ignore #+gengc ,@(unless (eq return :tail) '(return-pc-pass)) - ,@(unless (or variable (eq return :tail)) '(arg-locs)) - ,@(unless variable '(args)) - ;; Step instrumentation for full calls not implemented yet. - ;; See the PPC backend for an example. - step-instrumenting) - - (:temporary (:sc descriptor-reg - :offset ocfp-offset - :from (:argument 1) - ,@(unless (eq return :fixed) - '(:to :eval))) - ocfp-pass) - - (:temporary (:sc descriptor-reg - :offset #-gengc lra-offset #+gengc ra-offset - :from (:argument ,(if (eq return :tail) 2 1)) - :to :eval) - return-pc-pass) - - ,@(case named - ((t) - `((:temporary (:sc descriptor-reg :offset fdefn-offset - :from (:argument ,(if (eq return :tail) 0 1)) - :to :eval) - name-pass))) - ((nil) - `((:temporary (:sc descriptor-reg :offset lexenv-offset - :from (:argument ,(if (eq return :tail) 0 1)) - :to :eval) - lexenv) - #-gengc - (:temporary (:scs (descriptor-reg) :from (:argument 0) :to :eval) - function)))) - - (:temporary (:sc any-reg :offset nargs-offset :to :eval) - nargs-pass) - - ,@(when variable - (mapcar (lambda (name offset) - `(:temporary (:sc descriptor-reg - :offset ,offset - :to :eval) - ,name)) - register-arg-names *register-arg-offsets*)) - ,@(when (eq return :fixed) - '((:temporary (:scs (descriptor-reg) :from :eval) move-temp))) - - ,@(unless (eq return :tail) - '((:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save))) - - (:temporary (:sc interior-reg :offset lip-offset) entry-point) - - (:generator ,(+ (if named 5 0) - (if variable 19 1) - (if (eq return :tail) 0 10) - 15 - (if (eq return :unknown) 25 0)) - (let* ((cur-nfp (current-nfp-tn vop)) - ,@(unless (eq return :tail) - '((lra-label (gen-label)))) - (filler - (remove nil - (list :load-nargs - ,@(if (eq return :tail) - '((unless (location= ocfp ocfp-pass) - :load-ocfp) - (unless (location= return-pc - return-pc-pass) - :load-return-pc) - (when cur-nfp - :frob-nfp)) - '(#-gengc - :comp-lra - (when cur-nfp - :frob-nfp) - :save-fp - :load-fp)))))) - (flet ((do-next-filler () - (let* ((next (pop filler)) - (what (if (consp next) (car next) next))) - (ecase what - (:load-nargs - ,@(if variable - `((inst subq csp-tn new-fp nargs-pass) - ,@(let ((index -1)) - (mapcar (lambda (name) - `(inst ldl ,name - ,(ash (incf index) - word-shift) - new-fp)) - register-arg-names))) - '((inst li (fixnumize nargs) nargs-pass)))) - ,@(if (eq return :tail) - '((:load-ocfp - (sc-case ocfp - (any-reg - (inst move ocfp ocfp-pass)) - (control-stack - (inst ldl ocfp-pass - (ash (tn-offset ocfp) - word-shift) - cfp-tn)))) - (:load-return-pc - (sc-case return-pc - (#-gengc descriptor-reg #+gengc any-reg - (inst move return-pc return-pc-pass)) - (control-stack - (inst ldl return-pc-pass - (ash (tn-offset return-pc) - word-shift) - cfp-tn)))) - (:frob-nfp - (inst lda nsp-tn - (bytes-needed-for-non-descriptor-stack-frame) - cur-nfp))) - `(#-gengc - (:comp-lra - (inst compute-lra-from-code - return-pc-pass code-tn lra-label temp)) - (:frob-nfp - (store-stack-tn nfp-save cur-nfp)) - (:save-fp - (inst move cfp-tn ocfp-pass)) - (:load-fp - ,(if variable - '(move new-fp cfp-tn) - '(if (> nargs register-arg-count) - (move new-fp cfp-tn) - (move csp-tn cfp-tn)))))) - ((nil)))))) - ,@(case named - ((t) - `((sc-case name - (descriptor-reg (move name name-pass)) - (control-stack - (inst ldl name-pass - (tn-byte-offset name) cfp-tn) - (do-next-filler)) - (constant - (inst ldl name-pass - (- (tn-byte-offset name) - other-pointer-lowtag) code-tn) - (do-next-filler))) - (inst ldl entry-point - (- (ash fdefn-raw-addr-slot word-shift) - other-pointer-lowtag) name-pass) - (do-next-filler))) - ((nil) - `((sc-case arg-fun - (descriptor-reg (move arg-fun lexenv)) - (control-stack - (inst ldl lexenv - (tn-byte-offset arg-fun) cfp-tn) - (do-next-filler)) - (constant - (inst ldl lexenv - (- (tn-byte-offset arg-fun) - other-pointer-lowtag) code-tn) - (do-next-filler))) - #-gengc - (inst ldl function - (- (ash closure-fun-slot word-shift) - fun-pointer-lowtag) lexenv) - #-gengc - (do-next-filler) - #-gengc - (inst addq function - (- (ash simple-fun-insts-offset word-shift) - fun-pointer-lowtag) entry-point) - #+gengc - (inst ldl entry-point - (- (ash closure-entry-point-slot word-shift) - fun-pointer-lowtag) lexenv) - #+gengc - (do-next-filler))) - (:direct - `((inst ldl entry-point (static-fun-offset fun) null-tn)))) - (loop - (if (cdr filler) - (do-next-filler) - (return))) - - (note-this-location vop :call-site) - (do-next-filler) - (inst jsr zero-tn entry-point)) - - ,@(ecase return - (:fixed - '((emit-return-pc lra-label) - (default-unknown-values vop values nvals - move-temp temp lra-label) - (maybe-load-stack-nfp-tn cur-nfp nfp-save temp))) - (:unknown - '((emit-return-pc lra-label) - (note-this-location vop :unknown-return) - (receive-unknown-values values-start nvals start count - lra-label temp) - (maybe-load-stack-nfp-tn cur-nfp nfp-save temp))) - (:tail)))))) - -(define-full-call call nil :fixed nil) -(define-full-call call-named t :fixed nil) -(define-full-call static-call-named :direct :fixed nil) -(define-full-call multiple-call nil :unknown nil) -(define-full-call multiple-call-named t :unknown nil) -(define-full-call static-multiple-call-named :direct :unknown nil) -(define-full-call tail-call nil :tail nil) -(define-full-call tail-call-named t :tail nil) -(define-full-call static-tail-call-named :direct :tail nil) - -(define-full-call call-variable nil :fixed t) -(define-full-call multiple-call-variable nil :unknown t) - -;;; This is defined separately, since it needs special code that blits -;;; the arguments down. -(define-vop (tail-call-variable) - (:args - (args-arg :scs (any-reg) :target args) - (function-arg :scs (descriptor-reg) :target lexenv) - (ocfp-arg :scs (any-reg) :target ocfp) - (lra-arg :scs (#-gengc descriptor-reg #+gengc any-reg) :target lra)) - - (:temporary (:sc any-reg :offset nl0-offset :from (:argument 0)) args) - (:temporary (:sc any-reg :offset lexenv-offset :from (:argument 1)) lexenv) - (:temporary (:sc any-reg :offset ocfp-offset :from (:argument 2)) ocfp) - (:temporary (:sc any-reg :offset #-gengc lra-offset #+gengc ra-offset - :from (:argument 3)) lra) - (:temporary (:scs (non-descriptor-reg)) temp) - - (:vop-var vop) - - (:generator 75 - - ;; Move these into the passing locations if they are not already there. - (move args-arg args) - (move function-arg lexenv) - (move ocfp-arg ocfp) - (move lra-arg lra) - - ;; Clear the number stack if anything is there. - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (inst lda nsp-tn (bytes-needed-for-non-descriptor-stack-frame) - cur-nfp))) - - ;; And jump to the assembly-routine that does the bliting. - (inst li (make-fixup 'tail-call-variable :assembly-routine) temp) - (inst jmp zero-tn temp))) - -;;;; unknown values return - -;;; Return a single value using the unknown-values convention. -(define-vop (return-single) - (:args (ocfp :scs (any-reg)) - #-gengc (return-pc :scs (descriptor-reg)) - #+gengc (return-pc :scs (any-reg) :target ra) - (value)) - (:ignore value) - #-gengc (:temporary (:scs (interior-reg)) lip) - #+gengc (:temporary (:sc any-reg :offset ra-offset :from (:argument 1)) ra) - #+gengc (:temporary (:scs (any-reg) :from (:argument 1)) temp) - (:vop-var vop) - (:generator 6 - ;; Clear the number stack. - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (inst lda nsp-tn (bytes-needed-for-non-descriptor-stack-frame) - cur-nfp))) - ;; Clear the control stack, and restore the frame pointer. - (move cfp-tn csp-tn) - (move ocfp cfp-tn) - ;; Out of here. - #-gengc (lisp-return return-pc lip :offset 2) - #+gengc - (progn - (inst addq return-pc (* 2 n-word-bytes) temp) - (unless (location= ra return-pc) - (inst move ra return-pc)) - (inst ret zero-tn temp 1)))) - -;;; Do unknown-values return of a fixed number of values. The Values -;;; are required to be set up in the standard passing locations. Nvals -;;; is the number of values returned. -;;; -;;; If returning a single value, then deallocate the current frame, -;;; restore FP and jump to the single-value entry at Return-PC + 8. -;;; -;;; If returning other than one value, then load the number of values -;;; returned, NIL out unsupplied values registers, restore FP and -;;; return at Return-PC. When there are stack values, we must -;;; initialize the argument pointer to point to the beginning of the -;;; values block (which is the beginning of the current frame.) -(define-vop (return) - (:args (ocfp :scs (any-reg)) - (return-pc :scs (#-gengc descriptor-reg #+gengc any-reg) - :to (:eval 1) - #+gengc :target #+gengc ra) - (values :more t)) - (:ignore values) - (:info nvals) - (:temporary (:sc descriptor-reg :offset a0-offset :from (:eval 0)) a0) - (:temporary (:sc descriptor-reg :offset a1-offset :from (:eval 0)) a1) - (:temporary (:sc descriptor-reg :offset a2-offset :from (:eval 0)) a2) - (:temporary (:sc descriptor-reg :offset a3-offset :from (:eval 0)) a3) - (:temporary (:sc descriptor-reg :offset a4-offset :from (:eval 0)) a4) - (:temporary (:sc descriptor-reg :offset a5-offset :from (:eval 0)) a5) - (:temporary (:sc any-reg :offset nargs-offset) nargs) - (:temporary (:sc any-reg :offset ocfp-offset) val-ptr) - #-gengc (:temporary (:scs (interior-reg)) lip) - #+gengc (:temporary (:sc any-reg :offset ra-offset :from (:eval 1)) ra) - (:vop-var vop) - (:generator 6 - ;; Clear the number stack. - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (inst lda nsp-tn (bytes-needed-for-non-descriptor-stack-frame) - cur-nfp))) - ;; Establish the values pointer and values count. - (move cfp-tn val-ptr) - (inst li (fixnumize nvals) nargs) - ;; restore the frame pointer and clear as much of the control - ;; stack as possible. - (move ocfp cfp-tn) - ;; ADDQ only accepts immediates of type (UNSIGNED-BYTE 8). Here, - ;; instead of adding (* NVALS N-WORD-BYTES), we use NARGS that - ;; we've carefully set up, but protect ourselves by averring that - ;; FIXNUMIZEation and multiplication by N-WORD-BYTES is the same. - (aver (= (* nvals n-word-bytes) (fixnumize nvals))) - (inst addq val-ptr nargs csp-tn) - ;; pre-default any argument register that need it. - (when (< nvals register-arg-count) - (dolist (reg (subseq (list a0 a1 a2 a3 a4 a5) nvals)) - (move null-tn reg))) - ;; And away we go. - (lisp-return return-pc lip))) - -;;; Do unknown-values return of an arbitrary number of values (passed -;;; on the stack.) We check for the common case of a single return -;;; value, and do that inline using the normal single value return -;;; convention. Otherwise, we branch off to code that calls an -;;; assembly-routine. -(define-vop (return-multiple) - (:args (ocfp-arg :scs (any-reg) :target ocfp) - #-gengc (lra-arg :scs (descriptor-reg) :target lra) - #+gengc (return-pc :scs (any-reg) :target ra) - (vals-arg :scs (any-reg) :target vals) - (nvals-arg :scs (any-reg) :target nvals)) - - (:temporary (:sc any-reg :offset nl1-offset :from (:argument 0)) ocfp) - #-gengc - (:temporary (:sc descriptor-reg :offset lra-offset :from (:argument 1)) lra) - #+gengc - (:temporary (:sc any-reg :offset ra-offset :from (:argument 1)) ra) - (:temporary (:sc any-reg :offset nl0-offset :from (:argument 2)) vals) - (:temporary (:sc any-reg :offset nargs-offset :from (:argument 3)) nvals) - (:temporary (:sc descriptor-reg :offset a0-offset) a0) - (:temporary (:scs (non-descriptor-reg)) temp) - #-gengc (:temporary (:scs (interior-reg)) lip) - #+gengc (:temporary (:scs (any-reg) :from (:argument 0)) temp) - - (:vop-var vop) - - (:generator 13 - (let ((not-single (gen-label))) - ;; Clear the number stack. - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (inst lda nsp-tn (bytes-needed-for-non-descriptor-stack-frame) - cur-nfp))) - - ;; Check for the single case. - (inst li (fixnumize 1) a0) - (inst cmpeq nvals-arg a0 temp) - (inst ldl a0 0 vals-arg) - (inst beq temp not-single) - - ;; Return with one value. - (move cfp-tn csp-tn) - (move ocfp-arg cfp-tn) - (lisp-return lra-arg lip :offset 2) - - ;; Nope, not the single case. - (emit-label not-single) - (move ocfp-arg ocfp) - (move lra-arg lra) - (move vals-arg vals) - (move nvals-arg nvals) - (inst li (make-fixup 'return-multiple :assembly-routine) temp) - (inst jmp zero-tn temp)))) - -;;;; XEP hackery - -;;; Get the lexical environment from its passing location. -(define-vop (setup-closure-environment) - (:temporary (:sc descriptor-reg :offset lexenv-offset :target closure - :to (:result 0)) - lexenv) - (:results (closure :scs (descriptor-reg))) - (:info label) - (:ignore label) - (:generator 6 - ;; Get result. - (move lexenv closure))) - -;;; Copy a &MORE arg from the argument area to the end of the current -;;; frame. FIXED is the number of non-&MORE arguments. -(define-vop (copy-more-arg) - (:temporary (:sc any-reg :offset nl0-offset) result) - (:temporary (:sc any-reg :offset nl1-offset) count) - (:temporary (:sc any-reg :offset nl2-offset) src) - (:temporary (:sc any-reg :offset nl4-offset) dst) - (:temporary (:sc descriptor-reg :offset l0-offset) temp) - (:info fixed) - (:generator 20 - (let ((loop (gen-label)) - (do-regs (gen-label)) - (done (gen-label))) - (when (< fixed register-arg-count) - ;; Save a pointer to the results so we can fill in register - ;; args. We don't need this if there are more fixed args than - ;; reg args. - (move csp-tn result)) - ;; Allocate the space on the stack. - (cond ((zerop fixed) - (inst addq csp-tn nargs-tn csp-tn) - (inst beq nargs-tn done)) - (t - (inst subq nargs-tn (fixnumize fixed) count) - (inst ble count done) - (inst addq csp-tn count csp-tn))) - (when (< fixed register-arg-count) - ;; We must stop when we run out of stack args, not when we run - ;; out of &MORE args. - (inst subq nargs-tn (fixnumize register-arg-count) count)) - ;; Initialize dst to be end of stack. - (move csp-tn dst) - ;; Everything of interest in registers. - (inst ble count do-regs) - ;; Initialize SRC to be end of args. - (inst addq cfp-tn nargs-tn src) - - (emit-label loop) - ;; *--dst = *--src, --count - (inst subq src n-word-bytes src) - (inst subq count (fixnumize 1) count) - (loadw temp src) - (inst subq dst n-word-bytes dst) - (storew temp dst) - (inst bgt count loop) - - (emit-label do-regs) - (when (< fixed register-arg-count) - ;; Now we have to deposit any more args that showed up in - ;; registers. We know there is at least one &MORE arg, - ;; otherwise we would have branched to DONE up at the top. - (inst subq nargs-tn (fixnumize (1+ fixed)) count) - (do ((i fixed (1+ i))) - ((>= i register-arg-count)) - ;; Store it relative to the pointer saved at the start. - (storew (nth i *register-arg-tns*) result (- i fixed)) - ;; Is this the last one? - (inst beq count done) - ;; Decrement count. - (inst subq count (fixnumize 1) count))) - (emit-label done)))) - -;;; &MORE args are stored consecutively on the stack, starting -;;; immediately at the context pointer. The context pointer is not -;;; typed, so the lowtag is 0. - -(define-vop (more-arg) - (:translate %more-arg) - (:policy :fast-safe) - (:args (context :scs (descriptor-reg)) (index :scs (any-reg))) - (:arg-types * tagged-num) - (:temporary (:scs (any-reg)) temp) - (:results (value :scs (descriptor-reg any-reg))) - (:result-types *) - (:generator 5 - (inst addq context index temp) - (inst ldl value 0 temp))) -(define-vop (more-arg-c) - (:translate %more-arg) - (:policy :fast-safe) - (:args (context :scs (descriptor-reg))) - (:info index) - (:arg-types * (:constant (load/store-index 8 0 0))) - (:results (value :scs (descriptor-reg any-reg))) - (:result-types *) - (:generator 4 - (inst ldl value (* index n-word-bytes) context))) - -;;; Turn &MORE arg (context, count) into a list. -(define-vop () - (:args (context-arg :target context :scs (descriptor-reg)) - (count-arg :target count :scs (any-reg))) - (:arg-types * tagged-num) - (:temporary (:scs (any-reg) :from (:argument 0)) context) - (:temporary (:scs (any-reg) :from (:argument 1)) count) - (:temporary (:scs (descriptor-reg) :from :eval) temp dst) - (:results (result :scs (descriptor-reg))) - (:translate %listify-rest-args) - (:policy :safe) - (:node-var node) - (:generator 20 - (let* ((enter (gen-label)) - (loop (gen-label)) - (done (gen-label)) - (dx-p (node-stack-allocate-p node)) - (alloc-area-tn (if dx-p csp-tn alloc-tn))) - (move context-arg context) - (move count-arg count) - ;; Check to see if there are any arguments. - (move null-tn result) - (inst beq count done) - - ;; We need to do this atomically. - (pseudo-atomic () - ;; align CSP - (when dx-p (align-csp temp)) - ;; Allocate a cons (2 words) for each item. - (inst bis alloc-area-tn list-pointer-lowtag result) - (move result dst) - (inst sll count 1 temp) - (inst addq alloc-area-tn temp alloc-area-tn) - (inst br zero-tn enter) - - ;; Store the current cons in the cdr of the previous cons. - (emit-label loop) - (inst addq dst (* 2 n-word-bytes) dst) - (storew dst dst -1 list-pointer-lowtag) - - (emit-label enter) - ;; Grab one value. - (loadw temp context) - (inst addq context n-word-bytes context) - - ;; Store the value in the car (in delay slot) - (storew temp dst 0 list-pointer-lowtag) - - ;; Decrement count, and if != zero, go back for more. - (inst subq count (fixnumize 1) count) - (inst bne count loop) - - ;; NIL out the last cons. - (storew null-tn dst 1 list-pointer-lowtag)) - (emit-label done)))) - -;;; Return the location and size of the &MORE arg glob created by -;;; COPY-MORE-ARG. Supplied is the total number of arguments supplied -;;; (originally passed in NARGS.) Fixed is the number of non-&rest -;;; arguments. -;;; -;;; We must duplicate some of the work done by COPY-MORE-ARG, since at -;;; that time the environment is in a pretty brain-damaged state, -;;; preventing this info from being returned as values. What we do is -;;; compute supplied - fixed, and return a pointer that many words -;;; below the current stack top. -(define-vop () - (:policy :fast-safe) - (:translate sb-c::%more-arg-context) - (:args (supplied :scs (any-reg))) - (:arg-types tagged-num (:constant fixnum)) - (:info fixed) - (:results (context :scs (descriptor-reg)) - (count :scs (any-reg))) - (:result-types t tagged-num) - (:note "more-arg-context") - (:generator 5 - (inst subq supplied (fixnumize fixed) count) - (inst subq csp-tn count context))) - -(define-vop (verify-arg-count) - (:policy :fast-safe) - (:args (nargs :scs (any-reg))) - (:arg-types positive-fixnum (:constant t) (:constant t)) - (:info min max) - (:temporary (:scs (unsigned-reg)) temp) - (:vop-var vop) - (:save-p :compute-only) - (:generator 3 - (let ((err-lab - (generate-error-code vop 'invalid-arg-count-error nargs))) - (cond ((not min) - (cond ((zerop max) - (inst bne nargs err-lab)) - (t - (inst subq nargs (fixnumize max) temp) - (inst bne temp err-lab)))) - (max - (when (plusp min) - (inst li (fixnumize min) temp) - (inst cmpult nargs temp temp) - (inst bne temp err-lab)) - (inst li (fixnumize max) temp) - (inst cmpult temp nargs temp) - (inst bne temp err-lab)) - ((plusp min) - (inst li (fixnumize min) temp) - (inst cmpult nargs temp temp) - (inst bne temp err-lab)))))) - -;;; Single-stepping -(define-vop (step-instrument-before-vop) - (:policy :fast-safe) - (:vop-var vop) - (:generator 3 - ;; Stub! See the PPC backend for an example. - (note-this-location vop :internal-error))) diff --git a/src/compiler/alpha/cell.lisp b/src/compiler/alpha/cell.lisp deleted file mode 100644 index 998aa7c8bf..0000000000 --- a/src/compiler/alpha/cell.lisp +++ /dev/null @@ -1,632 +0,0 @@ -;;;; the VM definition of various primitive memory access VOPs for the -;;;; Alpha - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; data object ref/set stuff - -(define-vop (slot) - (:args (object :scs (descriptor-reg))) - (:info name offset lowtag) - (:ignore name) - (:results (result :scs (descriptor-reg any-reg))) - (:generator 1 - (loadw result object offset lowtag))) - -(define-vop (set-slot) - (:args (object :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg null zero))) - (:info name offset lowtag #+gengc remember) - (:ignore name) - (:results) - (:generator 1 - #+gengc - (if remember - (storew-and-remember-slot value object offset lowtag) - (storew value object offset lowtag)) - #-gengc - (storew value object offset lowtag))) - -(define-vop (init-slot set-slot) - (:info name dx-p offset lowtag) - (:ignore name dx-p)) - -;;;; symbol hacking VOPs - -;;; The compiler likes to be able to directly SET symbols. -(define-vop (set cell-set) - (:variant symbol-value-slot other-pointer-lowtag)) - -;;; Do a cell ref with an error check for being unbound. -(define-vop (checked-cell-ref) - (:args (object :scs (descriptor-reg) :target obj-temp)) - (:results (value :scs (descriptor-reg any-reg))) - (:policy :fast-safe) - (:vop-var vop) - (:save-p :compute-only) - (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp)) - -;;; With SYMBOL-VALUE, we check that the value isn't the trap object. -;;; So SYMBOL-VALUE of NIL is NIL. -(define-vop (symbol-value checked-cell-ref) - (:translate symeval) - (:generator 9 - (move object obj-temp) - (loadw value obj-temp symbol-value-slot other-pointer-lowtag) - (let ((err-lab (generate-error-code vop 'unbound-symbol-error obj-temp))) - (inst xor value unbound-marker-widetag temp) - (inst beq temp err-lab)))) - -;;; like CHECKED-CELL-REF, only we are a predicate to see if the cell -;;; is bound -(define-vop (boundp-frob) - (:args (object :scs (descriptor-reg))) - (:conditional) - (:info target not-p) - (:policy :fast-safe) - (:temporary (:scs (descriptor-reg)) value) - (:temporary (:scs (non-descriptor-reg)) temp)) - -(define-vop (boundp boundp-frob) - (:translate boundp) - (:generator 9 - (loadw value object symbol-value-slot other-pointer-lowtag) - (inst xor value unbound-marker-widetag temp) - (if not-p - (inst beq temp target) - (inst bne temp target)))) - -(define-vop (fast-symbol-value cell-ref) - (:variant symbol-value-slot other-pointer-lowtag) - (:policy :fast) - (:translate symeval)) - -(define-vop (symbol-hash) - (:policy :fast-safe) - (:translate symbol-hash) - (:args (symbol :scs (descriptor-reg))) - (:results (res :scs (any-reg))) - (:result-types positive-fixnum) - (:generator 2 - ;; The symbol-hash slot of NIL holds NIL because it is also the - ;; cdr slot, so we have to strip off the two low bits to make sure - ;; it is a fixnum. The lowtag selection magic that is required to - ;; ensure this is explained in the comment in objdef.lisp - (loadw res symbol symbol-hash-slot other-pointer-lowtag) - (inst bic res #.(ash lowtag-mask -1) res))) - -;;; On unithreaded builds these are just copies of the non-global versions. -(define-vop (%set-symbol-global-value set)) -(define-vop (symbol-global-value symbol-value) - (:translate sym-global-val)) -(define-vop (fast-symbol-global-value fast-symbol-value) - (:translate sym-global-val)) - -;;;; fdefinition (FDEFN) objects - -(define-vop (fdefn-fun cell-ref) - (:variant fdefn-fun-slot other-pointer-lowtag)) - -(define-vop (safe-fdefn-fun) - (:translate safe-fdefn-fun) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg) :target obj-temp)) - (:results (value :scs (descriptor-reg any-reg))) - (:vop-var vop) - (:save-p :compute-only) - (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 10 - (move object obj-temp) - (loadw value obj-temp fdefn-fun-slot other-pointer-lowtag) - (let ((err-lab (generate-error-code vop 'undefined-fun-error obj-temp))) - (inst cmpeq value null-tn temp) - (inst bne temp err-lab)))) - -(define-vop (set-fdefn-fun) - (:policy :fast-safe) - (:translate (setf fdefn-fun)) - (:args (function :scs (descriptor-reg) :target result) - (fdefn :scs (descriptor-reg))) - (:temporary (:scs (interior-reg)) lip) - (:temporary (:scs (non-descriptor-reg)) type) - (:results (result :scs (descriptor-reg))) - (:generator 38 - (let ((normal-fn (gen-label))) - (load-type type function (- fun-pointer-lowtag)) - (inst xor type simple-fun-widetag type) - (inst addq function - (- (ash simple-fun-insts-offset word-shift) fun-pointer-lowtag) - lip) - (inst beq type normal-fn) - (inst li (make-fixup 'closure-tramp :assembly-routine) lip) - (emit-label normal-fn) - (storew lip fdefn fdefn-raw-addr-slot other-pointer-lowtag) - (storew function fdefn fdefn-fun-slot other-pointer-lowtag) - (move function result)))) - - -(define-vop (fdefn-makunbound) - (:policy :fast-safe) - (:translate fdefn-makunbound) - (:args (fdefn :scs (descriptor-reg) :target result)) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (result :scs (descriptor-reg))) - (:generator 38 - (storew null-tn fdefn fdefn-fun-slot other-pointer-lowtag) - (inst li (make-fixup 'undefined-tramp :assembly-routine) temp) - (move fdefn result) - (storew temp fdefn fdefn-raw-addr-slot other-pointer-lowtag))) - -;;;; binding and Unbinding - -;;; Establish VAL as a binding for SYMBOL. Save the old value and the -;;; symbol on the binding stack and stuff the new value into the symbol. -;;; -;;; See the "Chapter 9: Specials" of the SBCL Internals Manual. - -(define-vop (dynbind) - (:args (val :scs (any-reg descriptor-reg)) - (symbol :scs (descriptor-reg))) - (:temporary (:scs (descriptor-reg)) temp) - (:generator 5 - (loadw temp symbol symbol-value-slot other-pointer-lowtag) - (inst addq bsp-tn (* 2 n-word-bytes) bsp-tn) - (storew temp bsp-tn (- binding-value-slot binding-size)) - (storew symbol bsp-tn (- binding-symbol-slot binding-size)) - (#+gengc storew-and-remember-slot #-gengc storew - val symbol symbol-value-slot other-pointer-lowtag))) - - -(define-vop (unbind) - (:temporary (:scs (descriptor-reg)) symbol value) - (:generator 0 - (loadw symbol bsp-tn (- binding-symbol-slot binding-size)) - (loadw value bsp-tn (- binding-value-slot binding-size)) - (#+gengc storew-and-remember-slot #-gengc storew - value symbol symbol-value-slot other-pointer-lowtag) - (storew zero-tn bsp-tn (- binding-symbol-slot binding-size)) - (storew zero-tn bsp-tn (- binding-value-slot binding-size)) - (inst subq bsp-tn (* 2 n-word-bytes) bsp-tn))) - - -(define-vop (unbind-to-here) - (:args (arg :scs (descriptor-reg any-reg) :target where)) - (:temporary (:scs (any-reg) :from (:argument 0)) where) - (:temporary (:scs (descriptor-reg)) symbol value) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 0 - (let ((loop (gen-label)) - (skip (gen-label)) - (done (gen-label))) - (move arg where) - (inst cmpeq where bsp-tn temp) - (inst bne temp done) - - (emit-label loop) - (loadw symbol bsp-tn (- binding-symbol-slot binding-size)) - (loadw value bsp-tn (- binding-value-slot binding-size)) - (inst beq symbol skip) - (#+gengc storew-and-remember-slot #-gengc storew - value symbol symbol-value-slot other-pointer-lowtag) - (storew zero-tn bsp-tn (- binding-symbol-slot binding-size)) - - (emit-label skip) - (storew zero-tn bsp-tn (- binding-value-slot binding-size)) - (inst subq bsp-tn (* 2 n-word-bytes) bsp-tn) - (inst cmpeq where bsp-tn temp) - (inst beq temp loop) - - (emit-label done)))) - -;;;; closure indexing - -(define-full-reffer closure-index-ref * - closure-info-offset fun-pointer-lowtag - (descriptor-reg any-reg) * %closure-index-ref) - -(define-full-setter set-funcallable-instance-info * - funcallable-instance-info-offset fun-pointer-lowtag - (descriptor-reg any-reg null zero) * %set-funcallable-instance-info) - -(define-full-reffer funcallable-instance-info * - funcallable-instance-info-offset fun-pointer-lowtag - (descriptor-reg any-reg) * %funcallable-instance-info) - -(define-vop (closure-ref) - (:args (object :scs (descriptor-reg))) - (:results (value :scs (descriptor-reg any-reg))) - (:info offset) - (:generator 4 - (loadw value object (+ closure-info-offset offset) fun-pointer-lowtag))) - -(define-vop (closure-init) - (:args (object :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg))) - (:info offset) - (:generator 4 - (storew value object (+ closure-info-offset offset) fun-pointer-lowtag))) - -(define-vop (closure-init-from-fp) - (:args (object :scs (descriptor-reg))) - (:info offset) - (:generator 4 - (storew cfp-tn object (+ closure-info-offset offset) fun-pointer-lowtag))) - -;;;; value cell hackery - -(define-vop (value-cell-ref cell-ref) - (:variant value-cell-value-slot other-pointer-lowtag)) - -(define-vop (value-cell-set cell-set) - (:variant value-cell-value-slot other-pointer-lowtag)) - -;;;; instance hackery - -(define-vop () - (:policy :fast-safe) - (:translate %instance-length) - (:args (struct :scs (descriptor-reg))) - (:results (res :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 4 - (loadw res struct 0 instance-pointer-lowtag) - (inst srl res instance-length-shift res))) - -(define-full-reffer instance-index-ref * instance-slots-offset - instance-pointer-lowtag (descriptor-reg any-reg) * %instance-ref) - -(define-full-setter instance-index-set * instance-slots-offset - instance-pointer-lowtag (descriptor-reg any-reg null zero) * %instance-set) - -;;;; code object frobbing - -(define-full-reffer code-header-ref * 0 other-pointer-lowtag - (descriptor-reg any-reg) * code-header-ref) - -(define-full-setter code-header-set * 0 other-pointer-lowtag - (descriptor-reg any-reg null zero) * code-header-set) - -;;;; mutator accessing - -#+gengc -(progn - -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; SBCL has never had GENGC. Now that we have Alpha support, it - ;; would probably be nice to restore GENGC support so that the Alpha - ;; doesn't have to crawl along with stop'n'copy. When we do, the CMU - ;; CL code below will need updating to the SBCL way of looking at - ;; things, e.g. at least using "SB-KERNEL" or "SB-KERNEL" instead of - ;; :KERNEL. -- WHN 2001-05-08 - (error "This code is stale as of sbcl-0.6.12.")) - -(define-vop (mutator-ub32-ref) - (:policy :fast-safe) - (:args) - (:results (res :scs (unsigned-reg))) - (:result-types unsigned-num) - (:variant-vars slot) - (:generator 2 - (loadw res mutator-tn slot))) - -(define-vop (mutator-descriptor-ref mutator-ub32-ref) - (:results (res :scs (any-reg descriptor-reg))) - (:result-types *)) - -(define-vop (mutator-sap-ref mutator-ub32-ref) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer)) - - -(define-vop (mutator-ub32-set) - (:policy :fast-safe) - (:args (arg :scs (unsigned-reg) :target res)) - (:arg-types unsigned-num) - (:results (res :scs (unsigned-reg))) - (:result-types unsigned-num) - (:variant-vars slot) - (:generator 2 - (storew arg mutator-tn slot) - (move res arg))) - -(define-vop (mutator-descriptor-set mutator-ub32-set) - (:args (arg :scs (any-reg descriptor-reg null zero) :target res)) - (:arg-types *) - (:results (res :scs (any-reg descriptor-reg))) - (:result-types *)) - -(define-vop (mutator-sap-set mutator-ub32-set) - (:args (arg :scs (sap-reg) :target res)) - (:arg-types system-area-pointer) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer)) - - -(macrolet ((define-mutator-accessors (slot type writable) - (let ((ref (symbolicate "MUTATOR-" slot "-REF")) - (set (and writable (symbolicate "MUTATOR-" slot "-SET"))) - (offset (symbolicate "MUTATOR-" slot "-SLOT")) - (fn - (let ((*package* (find-package :kernel))) - (symbolicate "MUTATOR-" slot)))) - (multiple-value-bind - (lisp-type ref-vop set-vop) - (ecase type - (:des - (values t - 'mutator-descriptor-ref - 'mutator-descriptor-set)) - (:ub32 - (values '(unsigned-byte 32) - 'mutator-ub32-ref - 'mutator-ub32-set)) - (:sap - (values 'system-area-pointer - 'mutator-sap-ref - 'mutator-sap-set))) - `(progn - (export ',fn :kernel) - (defknown ,fn () ,lisp-type (flushable)) - (define-vop (,ref ,ref-vop) - (:translate ,fn) - (:variant ,offset)) - ,@(when writable - `((defknown ((setf ,fn)) (,lisp-type) ,lisp-type - ()) - (define-vop (,set ,set-vop) - (:translate (setf ,fn)) - (:variant ,offset))))))))) - (define-mutator-accessors thread :des t) - (define-mutator-accessors suspends-disabled-count :ub32 t) - (define-mutator-accessors suspend-pending :ub32 t) - (define-mutator-accessors control-stack-base :sap nil) - (define-mutator-accessors control-stack-end :sap nil) - (define-mutator-accessors current-unwind-protect :sap nil) - (define-mutator-accessors current-catch-block :sap nil) - (define-mutator-accessors binding-stack-base :sap nil) - (define-mutator-accessors binding-stack-end :sap nil) - (define-mutator-accessors number-stack-base :sap nil) - (define-mutator-accessors number-stack-end :sap nil) - (define-mutator-accessors nursery-start :sap nil) - (define-mutator-accessors nursery-end :sap nil) - (define-mutator-accessors storebuf-start :sap nil) - (define-mutator-accessors storebuf-end :sap nil) - (define-mutator-accessors words-consed :ub32 nil)) - -); #+gengc progn - - - -;;;; raw instance slot accessors - -(macrolet ((def (signedp sc result-type) - `(progn - (define-vop () - (:translate ,(symbolicate "%RAW-INSTANCE-REF/" signedp "WORD")) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types * positive-fixnum) - (:results (value :scs (,sc))) - (:temporary (:scs (interior-reg)) lip) - (:result-types ,result-type) - (:generator 5 - (inst addq object index lip) - (inst ldl - value - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip) - (inst mskll value 4 value))) - - (define-vop (raw-instance-set/word) - (:translate ,(symbolicate "%RAW-INSTANCE-SET/" signedp "WORD")) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (,sc))) - (:arg-types * positive-fixnum ,result-type) - (:results (result :scs (,sc))) - (:temporary (:scs (interior-reg)) lip) - (:result-types ,result-type) - (:generator 5 - (inst addq object index lip) - (inst stl - value - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip) - (move value result)))))) - (def "" unsigned-reg unsigned-num) - (def "SIGNED-" signed-reg signed-num)) - -(define-vop (raw-instance-ref/single) - (:translate %raw-instance-ref/single) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types * positive-fixnum) - (:results (value :scs (single-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types single-float) - (:generator 5 - (inst addq object index lip) - (inst lds - value - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip))) - -(define-vop (raw-instance-set/single) - (:translate %raw-instance-set/single) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (single-reg))) - (:arg-types * positive-fixnum single-float) - (:results (result :scs (single-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types single-float) - (:generator 5 - (inst addq object index lip) - (inst sts - value - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip) - (unless (location= result value) - (inst fmove value result)))) - -(define-vop (raw-instance-ref/double) - (:translate %raw-instance-ref/double) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types * positive-fixnum) - (:results (value :scs (double-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types double-float) - (:generator 5 - (inst addq object index lip) - (inst ldt - value - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip))) - -(define-vop (raw-instance-set/double) - (:translate %raw-instance-set/double) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (double-reg))) - (:arg-types * positive-fixnum double-float) - (:results (result :scs (double-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types double-float) - (:generator 5 - (inst addq object index lip) - (inst stt - value - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip) - (unless (location= result value) - (inst fmove value result)))) - -(define-vop (raw-instance-ref/complex-single) - (:translate %raw-instance-ref/complex-single) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types * positive-fixnum) - (:results (value :scs (complex-single-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types complex-single-float) - (:generator 5 - (inst addq object index lip) - (inst lds - (complex-double-reg-real-tn value) - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip) - (inst lds - (complex-double-reg-imag-tn value) - (- (* (1+ instance-slots-offset) n-word-bytes) - instance-pointer-lowtag) - lip))) - -(define-vop (raw-instance-set/complex-single) - (:translate %raw-instance-set/complex-single) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (complex-single-reg))) - (:arg-types * positive-fixnum complex-single-float) - (:results (result :scs (complex-single-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types complex-single-float) - (:generator 5 - (inst addq object index lip) - (let ((value-real (complex-single-reg-real-tn value)) - (result-real (complex-single-reg-real-tn result))) - (inst sts - value-real - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip) - (unless (location= result-real value-real) - (inst fmove value-real result-real))) - (let ((value-imag (complex-single-reg-imag-tn value)) - (result-imag (complex-single-reg-imag-tn result))) - (inst sts - value-imag - (- (* (1+ instance-slots-offset) n-word-bytes) - instance-pointer-lowtag) - lip) - (unless (location= result-imag value-imag) - (inst fmove value-imag result-imag))))) - -(define-vop (raw-instance-ref/complex-double) - (:translate %raw-instance-ref/complex-double) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types * positive-fixnum) - (:results (value :scs (complex-double-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types complex-double-float) - (:generator 5 - (inst addq object index lip) - (inst ldt - (complex-double-reg-real-tn value) - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip) - (inst ldt - (complex-double-reg-imag-tn value) - (- (* (+ instance-slots-offset 2) n-word-bytes) - instance-pointer-lowtag) - lip))) - -(define-vop (raw-instance-set/complex-double) - (:translate %raw-instance-set/complex-double) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (complex-double-reg))) - (:arg-types * positive-fixnum complex-double-float) - (:results (result :scs (complex-double-reg))) - (:temporary (:scs (interior-reg)) lip) - (:result-types complex-double-float) - (:generator 5 - (inst addq object index lip) - (let ((value-real (complex-double-reg-real-tn value)) - (result-real (complex-double-reg-real-tn result))) - (inst stt - value-real - (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) - lip) - (unless (location= result-real value-real) - (inst fmove value-real result-real))) - (let ((value-imag (complex-double-reg-imag-tn value)) - (result-imag (complex-double-reg-imag-tn result))) - (inst stt - value-imag - (- (* (+ instance-slots-offset 2) n-word-bytes) - instance-pointer-lowtag) - lip) - (unless (location= result-imag value-imag) - (inst fmove value-imag result-imag))))) diff --git a/src/compiler/alpha/char.lisp b/src/compiler/alpha/char.lisp deleted file mode 100644 index 7b76715896..0000000000 --- a/src/compiler/alpha/char.lisp +++ /dev/null @@ -1,155 +0,0 @@ -;;;; the Alpha VM definition of character operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; moves and coercions - -;;; Move a tagged char to an untagged representation. -(define-vop (move-to-character) - (:args (x :scs (any-reg descriptor-reg))) - (:results (y :scs (character-reg))) - (:generator 1 - (inst srl x n-widetag-bits y))) -(define-move-vop move-to-character :move - (any-reg descriptor-reg) (character-reg)) - -;;; Move an untagged char to a tagged representation. -(define-vop (move-from-character) - (:args (x :scs (character-reg))) - (:results (y :scs (any-reg descriptor-reg))) - (:generator 1 - (inst sll x n-widetag-bits y) - (inst bis y character-widetag y))) -(define-move-vop move-from-character :move - (character-reg) (any-reg descriptor-reg)) - -;;; Move untagged character values. -(define-vop (character-move) - (:args (x :target y - :scs (character-reg) - :load-if (not (location= x y)))) - (:results (y :scs (character-reg) - :load-if (not (location= x y)))) - (:generator 0 - (move x y))) -(define-move-vop character-move :move - (character-reg) (character-reg)) - -;;; Move untagged character arguments/return-values. -(define-vop (move-character-arg) - (:args (x :target y - :scs (character-reg)) - (fp :scs (any-reg) - :load-if (not (sc-is y character-reg)))) - (:results (y)) - (:generator 0 - (sc-case y - (character-reg - (move x y)) - (character-stack - (storew x fp (tn-offset y)))))) -(define-move-vop move-character-arg :move-arg - (any-reg character-reg) (character-reg)) - -;;; Use standard MOVE-ARG + coercion to move an untagged character -;;; to a descriptor passing location. -;;; -(define-move-vop move-arg :move-arg - (character-reg) (any-reg descriptor-reg)) - -;;;; other operations -(define-vop (char-code) - (:translate char-code) - (:policy :fast-safe) - (:args (ch :scs (character-reg) :target res)) - (:arg-types character) - (:results (res :scs (any-reg))) - (:result-types positive-fixnum) - (:generator 1 - (inst sll ch n-fixnum-tag-bits res))) - -(define-vop (code-char) - (:translate code-char) - (:policy :fast-safe) - (:args (code :scs (any-reg) :target res)) - (:arg-types positive-fixnum) - (:results (res :scs (character-reg))) - (:result-types character) - (:generator 1 - (inst srl code n-fixnum-tag-bits res))) - -;;;; comparison of CHARACTERs - -(define-vop (character-compare) - (:args (x :scs (character-reg)) - (y :scs (character-reg))) - (:arg-types character character) - (:temporary (:scs (non-descriptor-reg)) temp) - (:conditional) - (:info target not-p) - (:policy :fast-safe) - (:note "inline comparison") - (:variant-vars cond) - (:generator 3 - (ecase cond - (:eq (inst cmpeq x y temp)) - (:lt (inst cmplt x y temp)) - (:gt (inst cmplt y x temp))) - (if not-p - (inst beq temp target) - (inst bne temp target)))) - -(define-vop (fast-char=/character character-compare) - (:translate char=) - (:variant :eq)) - -(define-vop (fast-char/character character-compare) - (:translate char>) - (:variant :gt)) - -(define-vop (character-compare/c) - (:args (x :scs (character-reg))) - (:arg-types character (:constant (character-set ((0 . #xFF))))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:conditional) - (:info target not-p y) - (:policy :fast-safe) - (:note "inline constant comparison") - (:variant-vars cond) - (:generator 2 - (ecase cond - (:eq (inst cmpeq x (sb-xc:char-code y) temp)) - (:lt (inst cmplt x (sb-xc:char-code y) temp)) - (:gt (inst cmple x (sb-xc:char-code y) temp))) - (if not-p - (if (eq cond :gt) - (inst bne temp target) - (inst beq temp target)) - (if (eq cond :gt) - (inst beq temp target) - (inst bne temp target))))) - -(define-vop (fast-char=/character/c character-compare/c) - (:translate char=) - (:variant :eq)) - -(define-vop (fast-char/character/c character-compare/c) - (:translate char>) - (:variant :gt)) diff --git a/src/compiler/alpha/debug.lisp b/src/compiler/alpha/debug.lisp deleted file mode 100644 index e96c705ab5..0000000000 --- a/src/compiler/alpha/debug.lisp +++ /dev/null @@ -1,118 +0,0 @@ -;;;; Alpha compiler support for the new whizzy debugger - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(define-vop () - (:translate current-sp) - (:policy :fast-safe) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 1 - (move csp-tn res))) - -(define-vop () - (:translate current-fp) - (:policy :fast-safe) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 1 - (move cfp-tn res))) - -(define-vop () - (:translate stack-ref) - (:policy :fast-safe) - (:args (object :scs (sap-reg) :target sap) - (offset :scs (any-reg))) - (:arg-types system-area-pointer positive-fixnum) - (:temporary (:scs (sap-reg) :from :eval) sap) - (:results (result :scs (descriptor-reg))) - (:result-types *) - (:generator 5 - (inst addq object offset sap) - (inst ldl result 0 sap))) - -(define-vop () - (:translate %set-stack-ref) - (:policy :fast-safe) - (:args (object :scs (sap-reg) :target sap) - (offset :scs (any-reg)) - (value :scs (descriptor-reg) :target result)) - (:arg-types system-area-pointer positive-fixnum *) - (:results (result :scs (descriptor-reg))) - (:result-types *) - (:temporary (:scs (sap-reg) :from (:argument 1)) sap) - (:generator 2 - (inst addq object offset sap) - (inst stl value 0 sap) - (move value result))) - -(define-vop (code-from-mumble) - (:policy :fast-safe) - (:args (thing :scs (descriptor-reg))) - (:results (code :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:variant-vars lowtag) - (:generator 5 - (let ((bogus (gen-label)) - (done (gen-label))) - (loadw temp thing 0 lowtag) - (inst srl temp n-widetag-bits temp) - (inst beq temp bogus) - (inst sll temp word-shift temp) - (unless (= lowtag other-pointer-lowtag) - (inst subq temp (- other-pointer-lowtag lowtag) temp)) - (inst subq thing temp code) - (emit-label done) - (assemble (:elsewhere) - (emit-label bogus) - (move null-tn code) - (inst br zero-tn done))))) - -(define-vop (code-from-lra code-from-mumble) - (:translate lra-code-header) - (:variant other-pointer-lowtag)) - -(define-vop (code-from-function code-from-mumble) - (:translate fun-code-header) - (:variant fun-pointer-lowtag)) - -(define-vop (%make-lisp-obj) - (:policy :fast-safe) - (:translate %make-lisp-obj) - (:args (value :scs (unsigned-reg) :target result)) - (:arg-types unsigned-num) - (:results (result :scs (descriptor-reg))) - (:generator 1 - (move value result))) - -(define-vop (get-lisp-obj-address) - (:policy :fast-safe) - (:translate get-lisp-obj-address) - (:args (thing :scs (descriptor-reg any-reg) :target result)) - (:results (result :scs (unsigned-reg))) - (:result-types unsigned-num) - (:generator 1 - (move thing result))) - -(defknown make-number-stack-pointer ((unsigned-byte 32)) system-area-pointer - (movable foldable flushable)) - -(define-vop (make-number-stack-pointer) - (:policy :fast-safe) - (:translate make-number-stack-pointer) - (:args (arg :scs (unsigned-reg) :to (:argument 1))) - (:arg-types unsigned-num) - (:results (res :scs (sap-reg) :from (:argument 0))) - (:result-types system-area-pointer) - (:generator 5 - (inst mskll nsp-tn 0 res) - (inst bis res arg res))) diff --git a/src/compiler/alpha/float.lisp b/src/compiler/alpha/float.lisp deleted file mode 100644 index f46dbd8790..0000000000 --- a/src/compiler/alpha/float.lisp +++ /dev/null @@ -1,865 +0,0 @@ -;;;; floating point support for the Alpha - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; float move functions - -(define-move-fun (load-fp-zero 1) (vop x y) - ((fp-single-zero) (single-reg) - (fp-double-zero) (double-reg)) - (inst fmove x y)) - -(define-move-fun (load-single 1) (vop x y) - ((single-stack) (single-reg)) - (inst lds y (tn-byte-offset x) (current-nfp-tn vop))) - -(define-move-fun (store-single 1) (vop x y) - ((single-reg) (single-stack)) - (inst sts x (tn-byte-offset y) (current-nfp-tn vop))) - -(define-move-fun (load-double 2) (vop x y) - ((double-stack) (double-reg)) - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset x))) - (inst ldt y offset nfp))) - -(define-move-fun (store-double 2) (vop x y) - ((double-reg) (double-stack)) - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset y))) - (inst stt x offset nfp))) - -;;;; float move VOPs - -(macrolet ((frob (vop sc) - `(progn - (define-vop (,vop) - (:args (x :scs (,sc) - :target y - :load-if (not (location= x y)))) - (:results (y :scs (,sc) - :load-if (not (location= x y)))) - (:note "float move") - (:generator 0 - (unless (location= y x) - (inst fmove x y)))) - (define-move-vop ,vop :move (,sc) (,sc))))) - (frob single-move single-reg) - (frob double-move double-reg)) - - -(define-vop (move-from-float) - (:args (x :to :save)) - (:results (y)) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:variant-vars double-p size type data) - (:note "float to pointer coercion") - (:generator 13 - (with-fixed-allocation (y ndescr type size) - (if double-p - (inst stt x (- (* data n-word-bytes) other-pointer-lowtag) y) - (inst sts x (- (* data n-word-bytes) other-pointer-lowtag) y))))) - -(macrolet ((frob (name sc &rest args) - `(progn - (define-vop (,name move-from-float) - (:args (x :scs (,sc) :to :save)) - (:results (y :scs (descriptor-reg))) - (:variant ,@args)) - (define-move-vop ,name :move (,sc) (descriptor-reg))))) - (frob move-from-single single-reg - nil single-float-size single-float-widetag single-float-value-slot) - (frob move-from-double double-reg - t double-float-size double-float-widetag double-float-value-slot)) - -(macrolet ((frob (name sc double-p value) - `(progn - (define-vop (,name) - (:args (x :scs (descriptor-reg))) - (:results (y :scs (,sc))) - (:note "pointer to float coercion") - (:generator 2 - ,@(if double-p - `((inst ldt y (- (* ,value n-word-bytes) - other-pointer-lowtag) - x)) - `((inst lds y (- (* ,value n-word-bytes) - other-pointer-lowtag) - x))))) - (define-move-vop ,name :move (descriptor-reg) (,sc))))) - (frob move-to-single single-reg nil single-float-value-slot) - (frob move-to-double double-reg t double-float-value-slot)) - - -(macrolet ((frob (name sc stack-sc double-p) - `(progn - (define-vop (,name) - (:args (x :scs (,sc) :target y) - (nfp :scs (any-reg) - :load-if (not (sc-is y ,sc)))) - (:results (y)) - (:note "float argument move") - (:generator ,(if double-p 2 1) - (sc-case y - (,sc - (unless (location= x y) - (inst fmove x y))) - (,stack-sc - (let ((offset (tn-byte-offset y))) - ,@(if double-p - '((inst stt x offset nfp)) - '((inst sts x offset nfp)))))))) - (define-move-vop ,name :move-arg - (,sc descriptor-reg) (,sc))))) - (frob move-single-float-arg single-reg single-stack nil) - (frob move-double-float-arg double-reg double-stack t)) - -;;;; complex float move functions - -(defun complex-single-reg-real-tn (x) - (make-random-tn :kind :normal :sc (sc-or-lose 'single-reg ) - :offset (tn-offset x))) -(defun complex-single-reg-imag-tn (x) - (make-random-tn :kind :normal :sc (sc-or-lose 'single-reg ) - :offset (1+ (tn-offset x)))) - -(defun complex-double-reg-real-tn (x) - (make-random-tn :kind :normal :sc (sc-or-lose 'double-reg ) - :offset (tn-offset x))) -(defun complex-double-reg-imag-tn (x) - (make-random-tn :kind :normal :sc (sc-or-lose 'double-reg ) - :offset (1+ (tn-offset x)))) - - -(define-move-fun (load-complex-single 2) (vop x y) - ((complex-single-stack) (complex-single-reg)) - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset x))) - (let ((real-tn (complex-single-reg-real-tn y))) - (inst lds real-tn offset nfp)) - (let ((imag-tn (complex-single-reg-imag-tn y))) - (inst lds imag-tn (+ offset n-word-bytes) nfp)))) - -(define-move-fun (store-complex-single 2) (vop x y) - ((complex-single-reg) (complex-single-stack)) - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset y))) - (let ((real-tn (complex-single-reg-real-tn x))) - (inst sts real-tn offset nfp)) - (let ((imag-tn (complex-single-reg-imag-tn x))) - (inst sts imag-tn (+ offset n-word-bytes) nfp)))) - - -(define-move-fun (load-complex-double 4) (vop x y) - ((complex-double-stack) (complex-double-reg)) - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset x))) - (let ((real-tn (complex-double-reg-real-tn y))) - (inst ldt real-tn offset nfp)) - (let ((imag-tn (complex-double-reg-imag-tn y))) - (inst ldt imag-tn (+ offset (* 2 n-word-bytes)) nfp)))) - -(define-move-fun (store-complex-double 4) (vop x y) - ((complex-double-reg) (complex-double-stack)) - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset y))) - (let ((real-tn (complex-double-reg-real-tn x))) - (inst stt real-tn offset nfp)) - (let ((imag-tn (complex-double-reg-imag-tn x))) - (inst stt imag-tn (+ offset (* 2 n-word-bytes)) nfp)))) - -;;; -;;; complex float register to register moves. -;;; -(define-vop (complex-single-move) - (:args (x :scs (complex-single-reg) :target y - :load-if (not (location= x y)))) - (:results (y :scs (complex-single-reg) :load-if (not (location= x y)))) - (:note "complex single float move") - (:generator 0 - (unless (location= x y) - ;; Note the complex-float-regs are aligned to every second - ;; float register so there is not need to worry about overlap. - (let ((x-real (complex-single-reg-real-tn x)) - (y-real (complex-single-reg-real-tn y))) - (inst fmove x-real y-real)) - (let ((x-imag (complex-single-reg-imag-tn x)) - (y-imag (complex-single-reg-imag-tn y))) - (inst fmove x-imag y-imag))))) -;;; -(define-move-vop complex-single-move :move - (complex-single-reg) (complex-single-reg)) - -(define-vop (complex-double-move) - (:args (x :scs (complex-double-reg) - :target y :load-if (not (location= x y)))) - (:results (y :scs (complex-double-reg) :load-if (not (location= x y)))) - (:note "complex double float move") - (:generator 0 - (unless (location= x y) - ;; Note the complex-float-regs are aligned to every second - ;; float register so there is not need to worry about overlap. - (let ((x-real (complex-double-reg-real-tn x)) - (y-real (complex-double-reg-real-tn y))) - (inst fmove x-real y-real)) - (let ((x-imag (complex-double-reg-imag-tn x)) - (y-imag (complex-double-reg-imag-tn y))) - (inst fmove x-imag y-imag))))) -;;; -(define-move-vop complex-double-move :move - (complex-double-reg) (complex-double-reg)) - -;;; -;;; Move from a complex float to a descriptor register allocating a -;;; new complex float object in the process. -;;; -(define-vop (move-from-complex-single) - (:args (x :scs (complex-single-reg) :to :save)) - (:results (y :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:note "complex single float to pointer coercion") - (:generator 13 - (with-fixed-allocation (y ndescr complex-single-float-widetag - complex-single-float-size) - (let ((real-tn (complex-single-reg-real-tn x))) - (inst sts real-tn (- (* complex-single-float-real-slot - n-word-bytes) - other-pointer-lowtag) - y)) - (let ((imag-tn (complex-single-reg-imag-tn x))) - (inst sts imag-tn (- (* complex-single-float-imag-slot - n-word-bytes) - other-pointer-lowtag) - y))))) -;;; -(define-move-vop move-from-complex-single :move - (complex-single-reg) (descriptor-reg)) - -(define-vop (move-from-complex-double) - (:args (x :scs (complex-double-reg) :to :save)) - (:results (y :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:note "complex double float to pointer coercion") - (:generator 13 - (with-fixed-allocation (y ndescr complex-double-float-widetag - complex-double-float-size) - (let ((real-tn (complex-double-reg-real-tn x))) - (inst stt real-tn (- (* complex-double-float-real-slot - n-word-bytes) - other-pointer-lowtag) - y)) - (let ((imag-tn (complex-double-reg-imag-tn x))) - (inst stt imag-tn (- (* complex-double-float-imag-slot - n-word-bytes) - other-pointer-lowtag) - y))))) -;;; -(define-move-vop move-from-complex-double :move - (complex-double-reg) (descriptor-reg)) - -;;; -;;; Move from a descriptor to a complex float register. -;;; -(define-vop (move-to-complex-single) - (:args (x :scs (descriptor-reg))) - (:results (y :scs (complex-single-reg))) - (:note "pointer to complex float coercion") - (:generator 2 - (let ((real-tn (complex-single-reg-real-tn y))) - (inst lds real-tn (- (* complex-single-float-real-slot - n-word-bytes) - other-pointer-lowtag) - x)) - (let ((imag-tn (complex-single-reg-imag-tn y))) - (inst lds imag-tn (- (* complex-single-float-imag-slot - n-word-bytes) - other-pointer-lowtag) - x)))) -(define-move-vop move-to-complex-single :move - (descriptor-reg) (complex-single-reg)) - -(define-vop (move-to-complex-double) - (:args (x :scs (descriptor-reg))) - (:results (y :scs (complex-double-reg))) - (:note "pointer to complex float coercion") - (:generator 2 - (let ((real-tn (complex-double-reg-real-tn y))) - (inst ldt real-tn (- (* complex-double-float-real-slot - n-word-bytes) - other-pointer-lowtag) - x)) - (let ((imag-tn (complex-double-reg-imag-tn y))) - (inst ldt imag-tn (- (* complex-double-float-imag-slot - n-word-bytes) - other-pointer-lowtag) - x)))) -(define-move-vop move-to-complex-double :move - (descriptor-reg) (complex-double-reg)) - -;;; -;;; complex float MOVE-ARG VOP -;;; -(define-vop (move-complex-single-float-arg) - (:args (x :scs (complex-single-reg) :target y) - (nfp :scs (any-reg) :load-if (not (sc-is y complex-single-reg)))) - (:results (y)) - (:note "complex single float argument move") - (:generator 1 - (sc-case y - (complex-single-reg - (unless (location= x y) - (let ((x-real (complex-single-reg-real-tn x)) - (y-real (complex-single-reg-real-tn y))) - (inst fmove x-real y-real)) - (let ((x-imag (complex-single-reg-imag-tn x)) - (y-imag (complex-single-reg-imag-tn y))) - (inst fmove x-imag y-imag)))) - (complex-single-stack - (let ((offset (tn-byte-offset y))) - (let ((real-tn (complex-single-reg-real-tn x))) - (inst sts real-tn offset nfp)) - (let ((imag-tn (complex-single-reg-imag-tn x))) - (inst sts imag-tn (+ offset n-word-bytes) nfp))))))) -(define-move-vop move-complex-single-float-arg :move-arg - (complex-single-reg descriptor-reg) (complex-single-reg)) - -(define-vop (move-complex-double-float-arg) - (:args (x :scs (complex-double-reg) :target y) - (nfp :scs (any-reg) :load-if (not (sc-is y complex-double-reg)))) - (:results (y)) - (:note "complex double float argument move") - (:generator 2 - (sc-case y - (complex-double-reg - (unless (location= x y) - (let ((x-real (complex-double-reg-real-tn x)) - (y-real (complex-double-reg-real-tn y))) - (inst fmove x-real y-real)) - (let ((x-imag (complex-double-reg-imag-tn x)) - (y-imag (complex-double-reg-imag-tn y))) - (inst fmove x-imag y-imag)))) - (complex-double-stack - (let ((offset (tn-byte-offset y))) - (let ((real-tn (complex-double-reg-real-tn x))) - (inst stt real-tn offset nfp)) - (let ((imag-tn (complex-double-reg-imag-tn x))) - (inst stt imag-tn (+ offset (* 2 n-word-bytes)) nfp))))))) -(define-move-vop move-complex-double-float-arg :move-arg - (complex-double-reg descriptor-reg) (complex-double-reg)) - - -(define-move-vop move-arg :move-arg - (single-reg double-reg complex-single-reg complex-double-reg) - (descriptor-reg)) - - -;;;; float arithmetic VOPs - -(define-vop (float-op) - (:args (x) (y)) - (:results (r)) - (:policy :fast-safe) - (:note "inline float arithmetic") - (:vop-var vop) - (:save-p :compute-only)) - -;;; We need to insure that ops that can cause traps do not clobber an -;;; argument register with invalid results. This so the software trap -;;; handler can re-execute the instruction and produce correct IEEE -;;; result. The :from :load hopefully does that. -(macrolet ((frob (name sc ptype) - `(define-vop (,name float-op) - (:args (x :scs (,sc)) - (y :scs (,sc))) - (:results (r :scs (,sc) :from :load)) - (:arg-types ,ptype ,ptype) - (:result-types ,ptype)))) - (frob single-float-op single-reg single-float) - (frob double-float-op double-reg double-float)) - -;; This is resumption-safe with underflow traps enabled, -;; with software handling and (notyet) dynamic rounding mode. -(macrolet ((frob (op sinst sname scost dinst dname dcost) - `(progn - (define-vop (,sname single-float-op) - (:translate ,op) - (:variant-cost ,scost) - (:generator ,scost - (inst ,sinst x y r) - (note-this-location vop :internal-error) - (inst trapb))) - (define-vop (,dname double-float-op) - (:translate ,op) - (:variant-cost ,dcost) - (:generator ,dcost - (inst ,dinst x y r) - (note-this-location vop :internal-error) - (inst trapb)))))) - ;; Not sure these cost number are right. +*- about same / is 4x - (frob + adds_su +/single-float 1 addt_su +/double-float 1) - (frob - subs_su -/single-float 1 subt_su -/double-float 1) - (frob * muls_su */single-float 1 mult_su */double-float 1) - (frob / divs_su //single-float 4 divt_su //double-float 4)) - -(macrolet ((frob (name inst translate sc type) - `(define-vop (,name) - (:args (x :scs (,sc) :target y)) - (:results (y :scs (,sc))) - (:translate ,translate) - (:policy :fast-safe) - (:arg-types ,type) - (:result-types ,type) - (:note "inline float arithmetic") - (:vop-var vop) - (:save-p :compute-only) - (:generator 1 - (note-this-location vop :internal-error) - (inst ,inst x y))))) - (frob abs/single-float fabs abs single-reg single-float) - (frob abs/double-float fabs abs double-reg double-float) - (frob %negate/single-float fneg %negate single-reg single-float) - (frob %negate/double-float fneg %negate double-reg double-float)) - - -;;;; float comparison - -(define-vop (float-compare) - (:args (x) (y)) - (:conditional) - (:info target not-p) - (:variant-vars eq complement) - (:temporary (:scs (single-reg)) temp) - (:policy :fast-safe) - (:note "inline float comparison") - (:vop-var vop) - (:save-p :compute-only) - (:generator 3 - (note-this-location vop :internal-error) - (inst cmptun x y temp) - (inst fbne temp (if not-p target fall-through)) - (if eq - (inst cmpteq x y temp) - (if complement - (inst cmptle x y temp) - (inst cmptlt x y temp))) - (inst trapb) - (if (if complement (not not-p) not-p) - (inst fbeq temp target) - (inst fbne temp target)) - FALL-THROUGH)) - -(macrolet ((frob (name sc ptype) - `(define-vop (,name float-compare) - (:args (x :scs (,sc)) - (y :scs (,sc))) - (:arg-types ,ptype ,ptype)))) - (frob single-float-compare single-reg single-float) - (frob double-float-compare double-reg double-float)) - -(macrolet ((frob (translate complement sname dname eq) - `(progn - (define-vop (,sname single-float-compare) - (:translate ,translate) - (:variant ,eq ,complement)) - (define-vop (,dname double-float-compare) - (:translate ,translate) - (:variant ,eq ,complement))))) - (frob < nil t >/single-float >/double-float nil) - (frob = nil =/single-float =/double-float t)) - - -;;;; float conversion - -(macrolet - ((frob (name translate inst ld-inst to-sc to-type) - `(define-vop (,name) - (:args (x :scs (signed-reg) :target temp - :load-if (not (sc-is x signed-stack)))) - (:temporary (:scs (,to-sc)) freg1) - (:temporary (:scs (,to-sc)) freg2) - (:temporary (:scs (single-stack)) temp) - - (:results (y :scs (,to-sc))) - (:arg-types signed-num) - (:result-types ,to-type) - (:policy :fast-safe) - (:note "inline float coercion") - (:translate ,translate) - (:vop-var vop) - (:save-p :compute-only) - (:generator 5 - (let ((stack-tn - (sc-case x - (signed-reg - (inst stl x - (* (tn-offset temp) - n-word-bytes) - (current-nfp-tn vop)) - temp) - (signed-stack - x)))) - (inst ,ld-inst freg1 - (tn-byte-offset stack-tn) - (current-nfp-tn vop)) - (note-this-location vop :internal-error) - (inst cvtlq freg1 freg2) - (inst ,inst freg2 y) - (inst excb) - ))))) - (frob %single-float/signed %single-float cvtqs_sui lds single-reg single-float) - (frob %double-float/signed %double-float cvtqt_sui lds double-reg double-float)) - -;;; see previous comment about software trap handlers: also applies here -(macrolet ((frob (name translate inst from-sc from-type to-sc to-type) - `(define-vop (,name) - (:args (x :scs (,from-sc))) - (:results (y :scs (,to-sc) :from :load)) - (:arg-types ,from-type) - (:result-types ,to-type) - (:policy :fast-safe) - (:note "inline float coercion") - (:translate ,translate) - (:vop-var vop) - (:save-p :compute-only) - (:generator 2 - (note-this-location vop :internal-error) - (inst ,inst x y) - (inst excb) - )))) - (frob %single-float/double-float %single-float cvtts_su - double-reg double-float single-reg single-float) - (frob %double-float/single-float %double-float fmove - single-reg single-float double-reg double-float)) - -(macrolet - ((frob (trans from-sc from-type inst &optional single) - (declare (ignorable single)) - `(define-vop (,(symbolicate trans "/" from-type)) - (:args (x :scs (,from-sc) :target temp)) - (:temporary (:from :load ;(:argument 0) - :sc single-reg) temp) - (:temporary (:scs (signed-stack)) stack-temp) - (:results (y :scs (signed-reg) - :load-if (not (sc-is y signed-stack)))) - (:arg-types ,from-type) - (:result-types signed-num) - (:translate ,trans) - (:policy :fast-safe) - (:note "inline float truncate") - (:vop-var vop) - (:save-p :compute-only) - (:generator 5 - (note-this-location vop :internal-error) - (inst ,inst x temp) - (sc-case y - (signed-stack - (inst stt temp - (tn-byte-offset y) - (current-nfp-tn vop))) - (signed-reg - (inst stt temp - (* (tn-offset stack-temp) - n-word-bytes) - (current-nfp-tn vop)) - (inst ldq y - (tn-byte-offset stack-temp) - (current-nfp-tn vop)))) - (inst excb) - )))) - (frob %unary-truncate/single-float single-reg single-float cvttq/c_sv t) - (frob %unary-truncate/double-float double-reg double-float cvttq/c_sv) - (frob %unary-round single-reg single-float cvttq_sv t) - (frob %unary-round double-reg double-float cvttq_sv)) - -(define-vop (make-single-float) - (:args (bits :scs (signed-reg) :target res - :load-if (not (sc-is bits signed-stack)))) - (:results (res :scs (single-reg) - :load-if (not (sc-is res single-stack)))) - (:temporary (:scs (signed-reg) :from (:argument 0) :to (:result 0)) temp) - (:temporary (:scs (signed-stack)) stack-temp) - (:arg-types signed-num) - (:result-types single-float) - (:translate make-single-float) - (:policy :fast-safe) - (:vop-var vop) - (:generator 4 - (sc-case bits - (signed-reg - (sc-case res - (single-reg - (inst stl bits - (tn-byte-offset stack-temp) - (current-nfp-tn vop)) - (inst lds res - (tn-byte-offset stack-temp) - (current-nfp-tn vop))) - (single-stack - (inst stl bits - (tn-byte-offset res) - (current-nfp-tn vop))))) - (signed-stack - (sc-case res - (single-reg - (inst lds res - (tn-byte-offset bits) - (current-nfp-tn vop))) - (single-stack - (unless (location= bits res) - (inst ldl temp - (tn-byte-offset bits) - (current-nfp-tn vop)) - (inst stl temp - (tn-byte-offset res) - (current-nfp-tn vop))))))))) - -(define-vop (make-double-float) - (:args (hi-bits :scs (signed-reg)) - (lo-bits :scs (unsigned-reg))) - (:results (res :scs (double-reg) - :load-if (not (sc-is res double-stack)))) - (:temporary (:scs (double-stack)) temp) - (:arg-types signed-num unsigned-num) - (:result-types double-float) - (:translate make-double-float) - (:policy :fast-safe) - (:vop-var vop) - (:generator 2 - (let ((stack-tn (sc-case res - (double-stack res) - (double-reg temp)))) - (inst stl hi-bits - (* (1+ (tn-offset stack-tn)) n-word-bytes) - (current-nfp-tn vop)) - (inst stl lo-bits - (tn-byte-offset stack-tn) - (current-nfp-tn vop))) - (when (sc-is res double-reg) - (inst ldt res - (tn-byte-offset temp) - (current-nfp-tn vop))))) - -(define-vop (single-float-bits) - (:args (float :scs (single-reg descriptor-reg) - :load-if (not (sc-is float single-stack)))) - (:results (bits :scs (signed-reg) - :load-if (or (sc-is float descriptor-reg single-stack) - (not (sc-is bits signed-stack))))) - (:temporary (:scs (signed-stack)) stack-temp) - (:arg-types single-float) - (:result-types signed-num) - (:translate single-float-bits) - (:policy :fast-safe) - (:vop-var vop) - (:generator 4 - (sc-case bits - (signed-reg - (sc-case float - (single-reg - (inst sts float - (tn-byte-offset stack-temp) - (current-nfp-tn vop)) - (inst ldl bits - (tn-byte-offset stack-temp) - (current-nfp-tn vop))) - (single-stack - (inst ldl bits - (tn-byte-offset float) - (current-nfp-tn vop))) - (descriptor-reg - (loadw bits float single-float-value-slot - other-pointer-lowtag)))) - (signed-stack - (sc-case float - (single-reg - (inst sts float - (tn-byte-offset bits) - (current-nfp-tn vop)))))))) - -(define-vop (double-float-high-bits) - (:args (float :scs (double-reg descriptor-reg) - :load-if (not (sc-is float double-stack)))) - (:results (hi-bits :scs (signed-reg))) - (:temporary (:scs (double-stack)) stack-temp) - (:arg-types double-float) - (:result-types signed-num) - (:translate double-float-high-bits) - (:policy :fast-safe) - (:vop-var vop) - (:generator 5 - (sc-case float - (double-reg - (inst stt float - (tn-byte-offset stack-temp) - (current-nfp-tn vop)) - (inst ldl hi-bits - (* (1+ (tn-offset stack-temp)) n-word-bytes) - (current-nfp-tn vop))) - (double-stack - (inst ldl hi-bits - (* (1+ (tn-offset float)) n-word-bytes) - (current-nfp-tn vop))) - (descriptor-reg - (loadw hi-bits float (1+ double-float-value-slot) - other-pointer-lowtag))))) - -(define-vop (double-float-low-bits) - (:args (float :scs (double-reg descriptor-reg) - :load-if (not (sc-is float double-stack)))) - (:results (lo-bits :scs (unsigned-reg))) - (:temporary (:scs (double-stack)) stack-temp) - (:arg-types double-float) - (:result-types unsigned-num) - (:translate double-float-low-bits) - (:policy :fast-safe) - (:vop-var vop) - (:generator 5 - (sc-case float - (double-reg - (inst stt float - (tn-byte-offset stack-temp) - (current-nfp-tn vop)) - (inst ldl lo-bits - (tn-byte-offset stack-temp) - (current-nfp-tn vop))) - (double-stack - (inst ldl lo-bits - (tn-byte-offset float) - (current-nfp-tn vop))) - (descriptor-reg - (loadw lo-bits float double-float-value-slot - other-pointer-lowtag))) - (inst mskll lo-bits 4 lo-bits))) - - -;;;; float mode hackery has moved to alpha-vm.lisp - - -;;;; complex float VOPs - -(define-vop (make-complex-single-float) - (:translate complex) - (:args (real :scs (single-reg) :target r) - (imag :scs (single-reg) :to :save)) - (:arg-types single-float single-float) - (:results (r :scs (complex-single-reg) :from (:argument 0) - :load-if (not (sc-is r complex-single-stack)))) - (:result-types complex-single-float) - (:note "inline complex single-float creation") - (:policy :fast-safe) - (:vop-var vop) - (:generator 5 - (sc-case r - (complex-single-reg - (let ((r-real (complex-single-reg-real-tn r))) - (unless (location= real r-real) - (inst fmove real r-real))) - (let ((r-imag (complex-single-reg-imag-tn r))) - (unless (location= imag r-imag) - (inst fmove imag r-imag)))) - (complex-single-stack - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset r))) - (inst sts real offset nfp) - (inst sts imag (+ offset n-word-bytes) nfp)))))) - -(define-vop (make-complex-double-float) - (:translate complex) - (:args (real :scs (double-reg) :target r) - (imag :scs (double-reg) :to :save)) - (:arg-types double-float double-float) - (:results (r :scs (complex-double-reg) :from (:argument 0) - :load-if (not (sc-is r complex-double-stack)))) - (:result-types complex-double-float) - (:note "inline complex double-float creation") - (:policy :fast-safe) - (:vop-var vop) - (:generator 5 - (sc-case r - (complex-double-reg - (let ((r-real (complex-double-reg-real-tn r))) - (unless (location= real r-real) - (inst fmove real r-real))) - (let ((r-imag (complex-double-reg-imag-tn r))) - (unless (location= imag r-imag) - (inst fmove imag r-imag)))) - (complex-double-stack - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset r))) - (inst stt real offset nfp) - (inst stt imag (+ offset (* 2 n-word-bytes)) nfp)))))) - -(define-vop (complex-single-float-value) - (:args (x :scs (complex-single-reg) :target r - :load-if (not (sc-is x complex-single-stack)))) - (:arg-types complex-single-float) - (:results (r :scs (single-reg))) - (:result-types single-float) - (:variant-vars slot) - (:policy :fast-safe) - (:vop-var vop) - (:generator 3 - (sc-case x - (complex-single-reg - (let ((value-tn (ecase slot - (:real (complex-single-reg-real-tn x)) - (:imag (complex-single-reg-imag-tn x))))) - (unless (location= value-tn r) - (inst fmove value-tn r)))) - (complex-single-stack - (inst lds r (* (+ (ecase slot (:real 0) (:imag 1)) (tn-offset x)) - n-word-bytes) - (current-nfp-tn vop)))))) - -(define-vop (realpart/complex-single-float complex-single-float-value) - (:translate realpart) - (:note "complex single float realpart") - (:variant :real)) - -(define-vop (imagpart/complex-single-float complex-single-float-value) - (:translate imagpart) - (:note "complex single float imagpart") - (:variant :imag)) - -(define-vop (complex-double-float-value) - (:args (x :scs (complex-double-reg) :target r - :load-if (not (sc-is x complex-double-stack)))) - (:arg-types complex-double-float) - (:results (r :scs (double-reg))) - (:result-types double-float) - (:variant-vars slot) - (:policy :fast-safe) - (:vop-var vop) - (:generator 3 - (sc-case x - (complex-double-reg - (let ((value-tn (ecase slot - (:real (complex-double-reg-real-tn x)) - (:imag (complex-double-reg-imag-tn x))))) - (unless (location= value-tn r) - (inst fmove value-tn r)))) - (complex-double-stack - (inst ldt r (* (+ (ecase slot (:real 0) (:imag 2)) (tn-offset x)) - n-word-bytes) - (current-nfp-tn vop)))))) - -(define-vop (realpart/complex-double-float complex-double-float-value) - (:translate realpart) - (:note "complex double float realpart") - (:variant :real)) - -(define-vop (imagpart/complex-double-float complex-double-float-value) - (:translate imagpart) - (:note "complex double float imagpart") - (:variant :imag)) - diff --git a/src/compiler/alpha/insts.lisp b/src/compiler/alpha/insts.lisp deleted file mode 100644 index 59f28f2bca..0000000000 --- a/src/compiler/alpha/insts.lisp +++ /dev/null @@ -1,693 +0,0 @@ -;;; the instruction set definition for the Alpha - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-ALPHA-ASM") - -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; Imports from this package into SB-VM - (import '(reg-tn-encoding) "SB-VM") - ;; Imports from SB-VM into this package - (import '(sb-vm::zero sb-vm::fp-single-zero sb-vm::fp-double-zero - sb-vm::registers sb-vm::float-registers - sb-vm::zero-tn sb-vm::fp-single-zero-tn sb-vm::fp-double-zero-tn - sb-vm::zero-offset sb-vm::null-offset sb-vm::code-offset))) - - -;;;; utility functions - -(defun reg-tn-encoding (tn) - (declare (type tn tn) - (values (unsigned-byte 5))) - (sc-case tn - (zero zero-offset) - (null null-offset) - (t - (aver (eq (sb-name (sc-sb (tn-sc tn))) 'registers)) - (tn-offset tn)))) - -(defun fp-reg-tn-encoding (tn) - (declare (type tn tn)) - (sc-case tn - (fp-single-zero (tn-offset fp-single-zero-tn)) - (fp-double-zero (tn-offset fp-double-zero-tn)) - (t - (unless (eq (sb-name (sc-sb (tn-sc tn))) 'float-registers) - (error "~S isn't a floating-point register." tn)) - (tn-offset tn)))) - -;;;; initial disassembler setup - -(defvar *disassem-use-lisp-reg-names* t) - -(defparameter reg-symbols - (map 'vector - (lambda (name) - (cond ((null name) nil) - (t (make-symbol (concatenate 'string "$" name))))) - sb-vm::*register-names*)) - -(define-arg-type reg - :printer (lambda (value stream dstate) - (declare (stream stream) (fixnum value)) - (let ((regname (aref reg-symbols value))) - (princ regname stream) - (maybe-note-associated-storage-ref - value - 'registers - regname - dstate)))) - -(define-arg-type memory-address-annotation - :printer (lambda (value stream dstate) - (declare (ignore stream)) - (destructuring-bind (reg offset) value - (cond - ((= reg code-offset) - (note-code-constant offset dstate)) - ((= reg null-offset) - (maybe-note-nil-indexed-object offset dstate)))))) - -(defparameter float-reg-symbols - #.(coerce - (loop for n from 0 to 31 collect (make-symbol (format nil "~D" n))) - 'vector)) - -(define-arg-type fp-reg - :printer (lambda (value stream dstate) - (declare (stream stream) (fixnum value)) - (let ((regname (aref float-reg-symbols value))) - (princ regname stream) - (maybe-note-associated-storage-ref - value - 'float-registers - regname - dstate)))) - -(define-arg-type relative-label - :sign-extend t - :use-label (lambda (value dstate) - (declare (type (signed-byte 21) value) - (type disassem-state dstate)) - (+ 4 (ash value 2) (dstate-cur-addr dstate)))) - -;;;; DEFINE-INSTRUCTION-FORMATs for the disassembler - -(define-instruction-format (memory 32 - :default-printer '(:name :tab ra "," disp "(" rb ")" - memory-address-annotation)) - (op :field (byte 6 26)) - (ra :field (byte 5 21) :type 'reg) - (rb :field (byte 5 16) :type 'reg) - (disp :field (byte 16 0) :sign-extend t) - (memory-address-annotation :fields (list (byte 5 16) (byte 16 0)) - :type 'memory-address-annotation)) - -(define-instruction-format (jump 32 - :default-printer '(:name :tab ra ",(" rb ")," hint)) - (op :field (byte 6 26)) - (ra :field (byte 5 21) :type 'reg) - (rb :field (byte 5 16) :type 'reg) - (subop :field (byte 2 14)) - (hint :field (byte 14 0))) - -(define-instruction-format (branch 32 - :default-printer '(:name :tab ra "," disp)) - (op :field (byte 6 26)) - (ra :field (byte 5 21) :type 'reg) - (disp :field (byte 21 0) :type 'relative-label)) - -(define-instruction-format (reg-operate 32 - :default-printer '(:name :tab ra "," rb "," rc)) - (op :field (byte 6 26)) - (ra :field (byte 5 21) :type 'reg) - (rb :field (byte 5 16) :type 'reg) - (sbz :field (byte 3 13)) - (f :field (byte 1 12) :value 0) - (fn :field (byte 7 5)) - (rc :field (byte 5 0) :type 'reg)) - -(define-instruction-format (lit-operate 32 - :default-printer '(:name :tab ra "," lit "," rc)) - (op :field (byte 6 26)) - (ra :field (byte 5 21) :type 'reg) - (lit :field (byte 8 13)) - (f :field (byte 1 12) :value 1) - (fn :field (byte 7 5)) - (rc :field (byte 5 0) :type 'reg)) - -(define-instruction-format (fp-operate 32 - :default-printer '(:name :tab fa "," fb "," fc)) - (op :field (byte 6 26)) - (fa :field (byte 5 21) :type 'fp-reg) - (fb :field (byte 5 16) :type 'fp-reg) - (fn :field (byte 11 5)) - (fc :field (byte 5 0) :type 'fp-reg)) - -(define-instruction-format (call-pal 32 - :default-printer '('call_pal :tab 'pal_ :name)) - (op :field (byte 6 26) :value 0) - (palcode :field (byte 26 0))) - -(define-instruction-format (bugchk 32 - :default-printer '('call_pal :tab 'pal_bugchk "," code)) - (op :field (byte 6 26) :value 0) - (palcode :field (byte 26 0) :value #x81) - ;; We use CALL-PAL BUGCHK as part of our trap logic. It is invariably - ;; followed by a trap-code word, which we pick out with the - ;; semi-traditional prefilter approach. - (code :prefilter (lambda (dstate) (read-suffix 32 dstate)) - :reader bugchk-trap-code)) - -;;;; emitters - -(define-bitfield-emitter emit-word 16 - (byte 16 0)) - -(define-bitfield-emitter emit-lword 32 - (byte 32 0)) - -(define-bitfield-emitter emit-qword 64 - (byte 64 0)) - -(define-bitfield-emitter emit-memory 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 16 0)) - -(define-bitfield-emitter emit-branch 32 - (byte 6 26) (byte 5 21) (byte 21 0)) - -(define-bitfield-emitter emit-reg-operate 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 3 13) (byte 1 12) (byte 7 5) - (byte 5 0)) - -(define-bitfield-emitter emit-lit-operate 32 - (byte 6 26) (byte 5 21) (byte 8 13) (byte 1 12) (byte 7 5) (byte 5 0)) - -(define-bitfield-emitter emit-fp-operate 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 11 5) (byte 5 0)) - -(define-bitfield-emitter emit-pal 32 - (byte 6 26) (byte 26 0)) - -;;;; macros for instructions - -(macrolet ((define-memory (name op &optional fixup float) - `(define-instruction ,name (segment ra disp rb ,@(if fixup - '(&optional type))) - (:declare (type tn ra rb) - ,@(if fixup ; ### unsigned-byte 16 bad idea? - '((type (or (unsigned-byte 16) (signed-byte 16) fixup) - disp)) - '((type (or (unsigned-byte 16) (signed-byte 16)) disp)))) - (:printer memory ((op ,op)) - ,@(when fixup - ;; Don't try to parse a constant - ;; reference if we're doing LDA or LDAH - ;; against $CODE. - '('(:name :tab ra "," disp "(" rb ")")))) - (:emitter - ,@(when fixup - `((when (fixup-p disp) - (note-fixup segment (or type ,fixup) disp) - (setf disp 0)))) - (emit-memory segment ,op ,@(if float - '((fp-reg-tn-encoding ra)) - '((reg-tn-encoding ra))) - (reg-tn-encoding rb) - disp))))) - (define-memory lda #x08 :lda) - (define-memory ldah #x09 :ldah) - (define-memory ldbu #x0a) ; BWX extension - (define-memory ldwu #x0c) ; BWX extension - (define-memory ldl #x28) - (define-memory ldq #x29) - (define-memory ldl_l #x2a) - (define-memory ldq_q #x2b) - (define-memory ldq_u #x0b) - (define-memory stw #x0d) ; BWX extension - (define-memory stb #x0e) ; BWX extension - (define-memory stl #x2c) - (define-memory stq #x2d) - (define-memory stl_c #x2e) - (define-memory stq_c #x2f) - (define-memory stq_u #x0f) - (define-memory ldf #x20 nil t) - (define-memory ldg #x21 nil t) - (define-memory lds #x22 nil t) - (define-memory ldt #x23 nil t) - (define-memory stf #x24 nil t) - (define-memory stg #x25 nil t) - (define-memory sts #x26 nil t) - (define-memory stt #x27 nil t)) - -(macrolet ((define-jump (name subop) - `(define-instruction ,name (segment ra rb &optional (hint 0)) - (:declare (type tn ra rb) - (type (or (unsigned-byte 14) fixup) hint)) - (:printer jump ((op #x1a) (subop ,subop))) - (:emitter - (when (fixup-p hint) - (note-fixup segment :jmp-hint hint) - (setf hint 0)) - (emit-memory segment #x1a (reg-tn-encoding ra) (reg-tn-encoding rb) - (logior (ash ,subop 14) hint)))))) - (define-jump jmp 0) - (define-jump jsr 1) - (define-jump ret 2) - (define-jump jsr-coroutine 3)) - - -(macrolet ((define-branch (name op &optional (float nil)) - `(define-instruction ,name (segment ra target) - (:declare (type tn ra) - (type label target)) - (:printer branch ((op ,op) - ,@(when float - '((ra nil :type 'fp-reg))))) - (:emitter - (emit-back-patch segment 4 - (lambda (segment posn) - (emit-branch segment ,op - ,@(if float - '((fp-reg-tn-encoding ra)) - '((reg-tn-encoding ra))) - (ash (- (label-position target) - (+ posn 4)) - -2)))))))) - (define-branch br #x30) - (define-branch bsr #x34) - (define-branch blbc #x38) - (define-branch blbs #x3c) - (define-branch fbeq #x31 t) - (define-branch fbne #x35 t) - (define-branch beq #x39) - (define-branch bne #x3d) - (define-branch fblt #x32 t) - (define-branch fbge #x36 t) - (define-branch blt #x3a) - (define-branch bge #x3e) - (define-branch fble #x33 t) - (define-branch fbgt #x37 t) - (define-branch ble #x3b) - (define-branch bgt #x3f)) - -(macrolet ((define-operate (name op fn) - `(define-instruction ,name (segment ra rb rc) - (:declare (type tn ra rc) - (type (or tn (unsigned-byte 8)) rb)) - (:printer reg-operate ((op ,op) (fn ,fn))) - (:printer lit-operate ((op ,op) (fn ,fn))) - ,@(when (and (= op #x11) (= fn #x20)) - `((:printer reg-operate ((op ,op) (fn ,fn) (ra 31)) - '('move :tab rb "," rc)) - (:printer reg-operate ((op ,op) (fn ,fn) (ra 31) (rb 31) (rc 31)) - '('nop)))) - (:emitter - (etypecase rb - (tn - (emit-reg-operate segment ,op (reg-tn-encoding ra) - (reg-tn-encoding rb) 0 0 ,fn (reg-tn-encoding rc))) - (number - (emit-lit-operate segment ,op (reg-tn-encoding ra) rb 1 ,fn - (reg-tn-encoding rc)))))))) - (define-operate addl #x10 #x00) - (define-operate addl/v #x10 #x40) - (define-operate addq #x10 #x20) - (define-operate addq/v #x10 #x60) - (define-operate cmpule #x10 #x3d) - (define-operate cmpbge #x10 #x0f) - (define-operate subl #x10 #x09) - (define-operate subl/v #x10 #x49) - (define-operate subq #x10 #x29) - (define-operate subq/v #x10 #x69) - (define-operate cmpeq #x10 #x2d) - (define-operate cmplt #x10 #x4d) - (define-operate cmple #x10 #x6d) - (define-operate cmpult #x10 #x1d) - (define-operate s4addl #x10 #x02) - (define-operate s4addq #x10 #x22) - (define-operate s4subl #x10 #x0b) - (define-operate s4subq #x10 #x2b) - (define-operate s8addl #x10 #x12) - (define-operate s8addq #x10 #x32) - (define-operate s8subl #x10 #x1b) - (define-operate s8subq #x10 #x3b) - - (define-operate and #x11 #x00) - (define-operate bic #x11 #x08) - (define-operate cmoveq #x11 #x24) - (define-operate cmovne #x11 #x26) - (define-operate cmovlbs #x11 #x14) - (define-operate bis #x11 #x20) - (define-operate ornot #x11 #x28) - (define-operate cmovlt #x11 #x44) - (define-operate cmovge #x11 #x46) - (define-operate cmovlbc #x11 #x16) - (define-operate xor #x11 #x40) - (define-operate eqv #x11 #x48) - (define-operate cmovle #x11 #x64) - (define-operate cmovgt #x11 #x66) - - (define-operate sll #x12 #x39) - (define-operate extbl #x12 #x06) - (define-operate extwl #x12 #x16) - (define-operate extll #x12 #x26) - (define-operate extql #x12 #x36) - (define-operate extwh #x12 #x5a) - (define-operate extlh #x12 #x6a) - (define-operate extqh #x12 #x7a) - (define-operate sra #x12 #x3c) - (define-operate insbl #x12 #x0b) - (define-operate inswl #x12 #x1b) - (define-operate insll #x12 #x2b) - (define-operate insql #x12 #x3b) - (define-operate inswh #x12 #x57) - (define-operate inslh #x12 #x67) - (define-operate insqh #x12 #x77) - (define-operate srl #x12 #x34) - (define-operate mskbl #x12 #x02) - (define-operate mskwl #x12 #x12) - (define-operate mskll #x12 #x22) - (define-operate mskql #x12 #x32) - (define-operate mskwh #x12 #x52) - (define-operate msklh #x12 #x62) - (define-operate mskqh #x12 #x72) - (define-operate zap #x12 #x30) - (define-operate zapnot #x12 #x31) - - (define-operate mull #x13 #x00) - (define-operate mulq/v #x13 #x60) - (define-operate mull/v #x13 #x40) - (define-operate umulh #x13 #x30) - (define-operate mulq #x13 #x20) - - (define-operate ctpop #x1c #x30) ; CIX extension - (define-operate ctlz #x1c #x32) ; CIX extension - (define-operate cttz #x1c #x33)) ; CIX extension - - -(macrolet ((define-fp-operate (name op fn &optional (args 3)) - `(define-instruction ,name (segment ,@(when (= args 3) '(fa)) fb fc) - (:declare (type tn ,@(when (= args 3) '(fa)) fb fc)) - (:printer fp-operate ((op ,op) (fn ,fn) ,@(when (= args 2) '((fa 31)))) - ,@(when (= args 2) - '('(:name :tab fb "," fc)))) - ,@(when (and (= op #x17) (= fn #x20)) - `((:printer fp-operate ((op ,op) (fn ,fn) (fa 31)) - '('fabs :tab fb "," fc)))) - (:emitter - (emit-fp-operate segment ,op ,@(if (= args 3) - '((fp-reg-tn-encoding fa)) - '(31)) - (fp-reg-tn-encoding fb) ,fn (fp-reg-tn-encoding fc)))))) - (define-fp-operate cpys #x17 #x020) - (define-fp-operate mf_fpcr #x17 #x025) - (define-fp-operate cpysn #x17 #x021) - (define-fp-operate mt_fpcr #x17 #x024) - (define-fp-operate cpyse #x17 #x022) - (define-fp-operate cvtql/sv #x17 #x530 2) - (define-fp-operate cvtlq #x17 #x010 2) - (define-fp-operate cvtql #x17 #x030 2) - (define-fp-operate cvtql/v #x17 #x130 2) - (define-fp-operate fcmoveq #x17 #x02a) - (define-fp-operate fcmovne #x17 #x02b) - (define-fp-operate fcmovlt #x17 #x02c) - (define-fp-operate fcmovge #x17 #x02d) - (define-fp-operate fcmovle #x17 #x02e) - (define-fp-operate fcmovgt #x17 #x02f) - - (define-fp-operate cvtqs #x16 #x0bc 2) - (define-fp-operate cvtqt #x16 #x0be 2) - (define-fp-operate cvtts #x16 #x0ac 2) - (define-fp-operate cvttq #x16 #x0af 2) - (define-fp-operate cvttq/c #x16 #x02f 2) - (define-fp-operate cmpteq #x16 #x5a5) - (define-fp-operate cmptlt #x16 #x5a6) - (define-fp-operate cmptle #x16 #x5a7) - (define-fp-operate cmptun #x16 #x5a4) - (define-fp-operate adds #x16 #x080) - (define-fp-operate addt #x16 #x0a0) - (define-fp-operate divs #x16 #x083) - (define-fp-operate divt #x16 #x0a3) - (define-fp-operate muls #x16 #x082) - (define-fp-operate mult #x16 #x0a2) - (define-fp-operate subs #x16 #x081) - (define-fp-operate subt #x16 #x0a1) - -;;; IEEE support - (defconstant +su+ #x500) ; software, underflow enabled - (defconstant +sui+ #x700) ; software, inexact & underflow enabled - (defconstant +sv+ #x500) ; software, interger overflow enabled - (defconstant +svi+ #x700) - (defconstant +rnd+ #x0c0) ; dynamic rounding mode - (defconstant +sud+ #x5c0) - (defconstant +svid+ #x7c0) - (defconstant +suid+ #x7c0) - - (define-fp-operate cvtqs_su #x16 (logior +su+ #x0bc) 2) - (define-fp-operate cvtqs_sui #x16 (logior +sui+ #x0bc) 2) - (define-fp-operate cvtqt_su #x16 (logior +su+ #x0be) 2) - (define-fp-operate cvtqt_sui #x16 (logior +sui+ #x0be) 2) - (define-fp-operate cvtts_su #x16 (logior +su+ #x0ac) 2) - - (define-fp-operate cvttq_sv #x16 (logior +su+ #x0af) 2) - (define-fp-operate cvttq/c_sv #x16 (logior +su+ #x02f) 2) - - (define-fp-operate adds_su #x16 (logior +su+ #x080)) - (define-fp-operate addt_su #x16 (logior +su+ #x0a0)) - (define-fp-operate divs_su #x16 (logior +su+ #x083)) - (define-fp-operate divt_su #x16 (logior +su+ #x0a3)) - (define-fp-operate muls_su #x16 (logior +su+ #x082)) - (define-fp-operate mult_su #x16 (logior +su+ #x0a2)) - (define-fp-operate subs_su #x16 (logior +su+ #x081)) - (define-fp-operate subt_su #x16 (logior +su+ #x0a1))) - -(define-instruction excb (segment) - (:emitter (emit-lword segment #x63ff0400))) - -(define-instruction trapb (segment) - (:emitter (emit-lword segment #x63ff0000))) - -(define-instruction imb (segment) - (:emitter (emit-lword segment #x00000086))) - -(define-instruction gentrap (segment code) - (:printer bugchk () :default - :control #'bugchk-trap-control) - (:emitter - (emit-lword segment #x000081) ;actually bugchk - (emit-lword segment code))) - -(define-instruction-macro move (src dst) - `(inst bis zero-tn ,src ,dst)) - -(define-instruction-macro not (src dst) - `(inst ornot zero-tn ,src ,dst)) - -(define-instruction-macro fmove (src dst) - `(inst cpys ,src ,src ,dst)) - -(define-instruction-macro fabs (src dst) - `(inst cpys fp-single-zero-tn ,src ,dst)) - -(define-instruction-macro fneg (src dst) - `(inst cpysn ,src ,src ,dst)) - -(define-instruction-macro nop () - `(inst bis zero-tn zero-tn zero-tn)) - -(defun %li (value reg) - (etypecase value - ((signed-byte 16) - (inst lda reg value zero-tn)) - ((signed-byte 32) - (flet ((se (x n) - (let ((x (logand x (lognot (ash -1 n))))) - (if (logbitp (1- n) x) - (logior (ash -1 (1- n)) x) - x)))) - (let* ((value (se value 32)) - (low (ldb (byte 16 0) value)) - (tmp1 (- value (se low 16))) - (high (ldb (byte 16 16) tmp1)) - (tmp2 (- tmp1 (se (ash high 16) 32))) - (extra 0)) - (unless (= tmp2 0) - (setf extra #x4000) - (setf tmp1 (- tmp1 #x40000000)) - (setf high (ldb (byte 16 16) tmp1))) - (inst lda reg low zero-tn) - (unless (= extra 0) - (inst ldah reg extra reg)) - (unless (= high 0) - (inst ldah reg high reg))))) - ((or (unsigned-byte 32) (signed-byte 64) (unsigned-byte 64)) - ;; Since it took NJF and CSR a good deal of puzzling to work out - ;; (a) what a previous version of this was doing and (b) why it - ;; was wrong: - ;; - ;; write VALUE = a_63 * 2^63 + a_48-62 * 2^48 - ;; + a_47 * 2^47 + a_32-46 * 2^32 - ;; + a_31 * 2^31 + a_16-30 * 2^16 - ;; + a_15 * 2^15 + a_0-14 - ;; - ;; then, because of the wonders of sign-extension and - ;; twos-complement arithmetic modulo 2^64, if a_15 is set, LDA - ;; (which sign-extends its argument) will add - ;; - ;; (a_15 * 2^15 + a_0-14 - 65536). - ;; - ;; So we need to add that 65536 back on, which is what this - ;; LOGBITP business is doing. The same applies for bits 31 and - ;; 47 (bit 63 is taken care of by the fact that all of this - ;; arithmetic is mod 2^64 anyway), but we have to be careful that - ;; we consider the altered value, not the original value. - ;; - ;; I think, anyway. -- CSR, 2003-09-26 - (let* ((value1 (if (logbitp 15 value) (+ value (ash 1 16)) value)) - (value2 (if (logbitp 31 value1) (+ value1 (ash 1 32)) value1)) - (value3 (if (logbitp 47 value2) (+ value2 (ash 1 48)) value2))) - (inst lda reg (ldb (byte 16 32) value2) zero-tn) - ;; FIXME: Don't yet understand these conditionals. If I'm - ;; right, surely we can just consider the zeroness of the - ;; particular bitfield, not the zeroness of the whole thing? - ;; -- CSR, 2003-09-26 - (unless (= value3 0) - (inst ldah reg (ldb (byte 16 48) value3) reg)) - (unless (and (= value2 0) (= value3 0)) - (inst sll reg 32 reg)) - (unless (= value 0) - (inst lda reg (ldb (byte 16 0) value) reg)) - (unless (= value1 0) - (inst ldah reg (ldb (byte 16 16) value1) reg)))) - (fixup - (inst lda reg value zero-tn :bits-47-32) - (inst ldah reg value reg :bits-63-48) - (inst sll reg 32 reg) - (inst lda reg value reg) - (inst ldah reg value reg)))) - -(define-instruction-macro li (value reg) - `(%li ,value ,reg)) - - -;;;; - -(define-instruction lword (segment lword) - (:declare (type (or (unsigned-byte 32) (signed-byte 32) fixup) lword)) - (:cost 0) - (:emitter - (etypecase lword - (fixup - (note-fixup segment :absolute32 lword) - (emit-lword segment 0)) - (integer - (emit-lword segment lword))))) - -(define-instruction short (segment word) - (:declare (type (or (unsigned-byte 16) (signed-byte 16)) word)) - (:cost 0) - (:emitter - (emit-word segment word))) - -(define-instruction byte (segment byte) - (:declare (type (or (unsigned-byte 8) (signed-byte 8)) byte)) - (:cost 0) - (:emitter - (emit-byte segment byte))) - -(defun emit-header-data (segment type) - (emit-back-patch - segment 4 - (lambda (segment posn) - (emit-lword segment - (logior type - (ash (+ posn (component-header-length)) - (- n-widetag-bits word-shift))))))) - -(define-instruction simple-fun-header-word (segment) - (:cost 0) - (:emitter - (emit-header-data segment simple-fun-widetag))) - -(define-instruction lra-header-word (segment) - (:cost 0) - (:emitter - (emit-header-data segment return-pc-widetag))) - -(defun emit-compute-inst (segment vop dst src label temp calc) - (declare (ignore temp)) - (emit-chooser - ;; We emit either 12 or 4 bytes, so we maintain 8 byte alignments. - segment 12 3 - (lambda (segment chooser posn delta-if-after) - (declare (ignore chooser)) - (let ((delta (funcall calc label posn delta-if-after))) - (when (<= (- (ash 1 15)) delta (1- (ash 1 15))) - (emit-back-patch segment 4 - (lambda (segment posn) - (assemble (segment vop) - (inst lda dst - (funcall calc label posn 0) - src)))) - t))) - (lambda (segment posn) - (assemble (segment vop) - (flet ((se (x n) - (let ((x (logand x (lognot (ash -1 n))))) - (if (logbitp (1- n) x) - (logior (ash -1 (1- n)) x) - x)))) - (let* ((value (se (funcall calc label posn 0) 32)) - (low (ldb (byte 16 0) value)) - (tmp1 (- value (se low 16))) - (high (ldb (byte 16 16) tmp1)) - (tmp2 (- tmp1 (se (ash high 16) 32))) - (extra 0)) - (unless (= tmp2 0) - (setf extra #x4000) - (setf tmp1 (- tmp1 #x40000000)) - (setf high (ldb (byte 16 16) tmp1))) - (inst lda dst low src) - (inst ldah dst extra dst) - (inst ldah dst high dst))))))) - -;; code = lip - header - label-offset + other-pointer-tag -(define-instruction compute-code-from-lip (segment dst src label temp) - (:declare (type tn dst src temp) (type label label)) - (:vop-var vop) - (:emitter - (emit-compute-inst segment vop dst src label temp - (lambda (label posn delta-if-after) - (- other-pointer-lowtag - (label-position label posn delta-if-after) - (component-header-length)))))) - -;; code = lra - other-pointer-tag - header - label-offset + other-pointer-tag -;; = lra - (header + label-offset) -(define-instruction compute-code-from-lra (segment dst src label temp) - (:declare (type tn dst src temp) (type label label)) - (:vop-var vop) - (:emitter - (emit-compute-inst segment vop dst src label temp - (lambda (label posn delta-if-after) - (- (+ (label-position label posn delta-if-after) - (component-header-length))))))) - -;; lra = code + other-pointer-tag + header + label-offset - other-pointer-tag -;; = code + header + label-offset -(define-instruction compute-lra-from-code (segment dst src label temp) - (:declare (type tn dst src temp) (type label label)) - (:vop-var vop) - (:emitter - (emit-compute-inst segment vop dst src label temp - (lambda (label posn delta-if-after) - (+ (label-position label posn delta-if-after) - (component-header-length)))))) diff --git a/src/compiler/alpha/macros.lisp b/src/compiler/alpha/macros.lisp deleted file mode 100644 index e67d20373c..0000000000 --- a/src/compiler/alpha/macros.lisp +++ /dev/null @@ -1,488 +0,0 @@ -;;;; various useful macros for generating Alpha code - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;; a handy macro for defining top level forms that depend on the -;;; compile environment -(defmacro expand (expr) - (let ((gensym (gensym))) - `(macrolet - ((,gensym () - ,expr)) - (,gensym)))) - -;;; instruction-like macros - -;;; c.f. x86 backend: -;;(defmacro move (dst src) -;; "Move SRC into DST unless they are location=." -;; (once-only ((n-dst dst) -;; (n-src src)) -;; `(unless (location= ,n-dst ,n-src) -;; (inst mov ,n-dst ,n-src)))) - -(defmacro move (src dst) - "Move SRC into DST unless they are location=." - (once-only ((n-src src) (n-dst dst)) - `(unless (location= ,n-src ,n-dst) - (inst move ,n-src ,n-dst)))) - -(defmacro loadw (result base &optional (offset 0) (lowtag 0)) - (once-only ((result result) (base base)) - `(inst ldl ,result (- (ash ,offset word-shift) ,lowtag) ,base))) - -(defmacro loadq (result base &optional (offset 0) (lowtag 0)) - (once-only ((result result) (base base)) - `(inst ldq ,result (- (ash ,offset word-shift) ,lowtag) ,base))) - -(defmacro storew (value base &optional (offset 0) (lowtag 0)) - (once-only ((value value) (base base) (offset offset) (lowtag lowtag)) - `(inst stl ,value (- (ash ,offset word-shift) ,lowtag) ,base))) - -(defmacro storeq (value base &optional (offset 0) (lowtag 0)) - (once-only ((value value) (base base) (offset offset) (lowtag lowtag)) - `(inst stq ,value (- (ash ,offset word-shift) ,lowtag) ,base))) - -(defmacro load-symbol (reg symbol) - (once-only ((reg reg) (symbol symbol)) - `(inst lda ,reg (static-symbol-offset ,symbol) null-tn))) - -(defmacro load-symbol-value (reg symbol) - `(inst ldl ,reg - (+ (static-symbol-offset ',symbol) - (ash symbol-value-slot word-shift) - (- other-pointer-lowtag)) - null-tn)) - -(defmacro store-symbol-value (reg symbol) - `(inst stl ,reg - (+ (static-symbol-offset ',symbol) - (ash symbol-value-slot word-shift) - (- other-pointer-lowtag)) - null-tn)) - -(defmacro load-type (target source &optional (offset 0)) - "Loads the type bits of a pointer into target independent of - byte-ordering issues." - (once-only ((n-target target) - (n-source source) - (n-offset offset)) - `(progn - (inst ldl ,n-target ,n-offset ,n-source) - (inst and ,n-target #xff ,n-target)))) - -;;; macros to handle the fact that we cannot use the machine native -;;; call and return instructions - -(defmacro lisp-jump (function lip) - "Jump to the lisp function FUNCTION. LIP is an interior-reg temporary." - `(progn - (inst lda ,lip (- (ash simple-fun-insts-offset word-shift) - fun-pointer-lowtag) - ,function) - (move ,function code-tn) - (inst jsr zero-tn ,lip 1))) - -(defmacro lisp-return (return-pc lip &key (offset 0) (frob-code t)) - "Return to RETURN-PC. LIP is an interior-reg temporary." - `(progn - (inst lda ,lip - (- (* (1+ ,offset) n-word-bytes) other-pointer-lowtag) - ,return-pc) - ,@(when frob-code - `((move ,return-pc code-tn))) - (inst ret zero-tn ,lip 1))) - - -(defmacro emit-return-pc (label) - "Emit a return-pc header word. LABEL is the label to use for this - return-pc." - `(progn - (emit-alignment n-lowtag-bits) - (emit-label ,label) - (inst lra-header-word))) - - - -;;;; stack TN's - -;;; Move a stack TN to a register and vice-versa. -(defmacro load-stack-tn (reg stack) - `(let ((reg ,reg) - (stack ,stack)) - (let ((offset (tn-offset stack))) - (sc-case stack - ((control-stack) - (loadw reg cfp-tn offset)))))) -(defmacro store-stack-tn (stack reg) - `(let ((stack ,stack) - (reg ,reg)) - (let ((offset (tn-offset stack))) - (sc-case stack - ((control-stack) - (storew reg cfp-tn offset)))))) - -;;; Move the TN Reg-Or-Stack into Reg if it isn't already there. -(defmacro maybe-load-stack-tn (reg reg-or-stack) - (once-only ((n-reg reg) - (n-stack reg-or-stack)) - `(sc-case ,n-reg - ((any-reg descriptor-reg) - (sc-case ,n-stack - ((any-reg descriptor-reg) - (move ,n-stack ,n-reg)) - ((control-stack) - (loadw ,n-reg cfp-tn (tn-offset ,n-stack)))))))) - -;;; Move the TN Reg-Or-Stack into Reg if it isn't already there. -(defmacro maybe-load-stack-nfp-tn (reg reg-or-stack temp) - (once-only ((n-reg reg) - (n-stack reg-or-stack)) - `(when ,reg - (sc-case ,n-reg - ((any-reg descriptor-reg) - (sc-case ,n-stack - ((any-reg descriptor-reg) - (move ,n-stack ,n-reg)) - ((control-stack) - (loadw ,n-reg cfp-tn (tn-offset ,n-stack)) - (inst mskll nsp-tn 0 ,temp) - (inst bis ,temp ,n-reg ,n-reg)))))))) - -;;;; storage allocation - -;;; Do stuff to allocate an other-pointer object of fixed SIZE with a -;;; single word header having the specified WIDETAG value. The result is -;;; placed in RESULT-TN, Flag-Tn must be wired to NL3-OFFSET, and -;;; Temp-TN is a non- descriptor temp (which may be randomly used by -;;; the body.) The body is placed inside the PSEUDO-ATOMIC, and -;;; presumably initializes the object. -(defmacro with-fixed-allocation ((result-tn temp-tn widetag size) - &body body) - (unless body - (bug "empty &body in WITH-FIXED-ALLOCATION")) - (once-only ((result-tn result-tn) (temp-tn temp-tn) (size size)) - `(pseudo-atomic (:extra (pad-data-block ,size)) - (inst bis alloc-tn other-pointer-lowtag ,result-tn) - (inst li (compute-object-header ,size ,widetag) ,temp-tn) - (storew ,temp-tn ,result-tn 0 other-pointer-lowtag) - ,@body))) - -(defun align-csp (temp) - ;; is used for stack allocation of dynamic-extent objects - (let ((aligned (gen-label))) - (inst and csp-tn lowtag-mask temp) - (inst beq temp aligned) - (inst addq csp-tn n-word-bytes csp-tn) - (storew zero-tn csp-tn -1) - (emit-label aligned))) - -;;;; error code -(defun emit-error-break (vop kind code values) - (assemble () - (when vop - (note-this-location vop :internal-error)) - (emit-internal-error kind code values - :trap-emitter (lambda (tramp-number) - (inst gentrap tramp-number))) - (emit-alignment word-shift))) - -(defun generate-error-code (vop error-code &rest values) - "Generate-Error-Code Error-code Value* - Emit code for an error with the specified Error-Code and context Values." - (assemble (:elsewhere) - (let ((start-lab (gen-label))) - (emit-label start-lab) - (apply #'error-call vop error-code values) - start-lab))) - -;;; a handy macro for making sequences look atomic -(defmacro pseudo-atomic ((&key (extra 0)) &rest forms) - `(progn - (inst addq alloc-tn 1 alloc-tn) - ,@forms - (inst lda alloc-tn (1- ,extra) alloc-tn) - (inst stl zero-tn 0 alloc-tn))) - -;;;; memory accessor vop generators - -(sb-xc:deftype load/store-index (scale lowtag min-offset - &optional (max-offset min-offset)) - `(integer ,(- (truncate (+ (ash 1 16) - (* min-offset sb-vm:n-word-bytes) - (- lowtag)) - scale)) - ,(truncate (- (+ (1- (ash 1 16)) lowtag) - (* max-offset sb-vm:n-word-bytes)) - scale))) - -(defmacro define-full-reffer (name type offset lowtag scs el-type - &optional translate) - `(progn - (define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types ,type tagged-num) - (:temporary (:scs (interior-reg)) lip) - (:results (value :scs ,scs)) - (:result-types ,el-type) - (:generator 5 - (inst addq object index lip) - (inst ldl value (- (* ,offset n-word-bytes) ,lowtag) lip) - ,@(when (equal scs '(unsigned-reg)) - '((inst mskll value 4 value))))) - (define-vop (,(symbolicate name "-C")) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:info index) - (:arg-types ,type - (:constant (load/store-index ,n-word-bytes ,(eval lowtag) - ,(eval offset)))) - (:results (value :scs ,scs)) - (:result-types ,el-type) - (:generator 4 - (inst ldl value (- (* (+ ,offset index) n-word-bytes) ,lowtag) - object) - ,@(when (equal scs '(unsigned-reg)) - '((inst mskll value 4 value))))))) - -(defmacro define-full-setter (name type offset lowtag scs el-type - &optional translate #+gengc (remember t)) - `(progn - (define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs ,scs :target result)) - (:arg-types ,type tagged-num ,el-type) - (:temporary (:scs (interior-reg)) lip) - (:results (result :scs ,scs)) - (:result-types ,el-type) - (:generator 2 - (inst addq index object lip) - (inst stl value (- (* ,offset n-word-bytes) ,lowtag) lip) - (move value result))) - (define-vop (,(symbolicate name "-C")) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (value :scs ,scs)) - (:info index) - (:arg-types ,type - (:constant (load/store-index ,n-word-bytes ,(eval lowtag) - ,(eval offset))) - ,el-type) - (:results (result :scs ,scs)) - (:result-types ,el-type) - (:generator 1 - (inst stl value (- (* (+ ,offset index) n-word-bytes) ,lowtag) - object) - (move value result))))) - - -(defmacro define-partial-reffer (name type size signed offset lowtag scs - el-type &optional translate) - (let ((scale (ecase size (:byte 1) (:short 2)))) - `(progn - (define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (unsigned-reg))) - (:arg-types ,type positive-fixnum) - (:results (value :scs ,scs)) - (:result-types ,el-type) - (:temporary (:scs (interior-reg)) lip) - (:temporary (:sc non-descriptor-reg) temp) - (:temporary (:sc non-descriptor-reg) temp1) - (:generator 5 - (inst addq object index lip) - ,@(when (eq size :short) - '((inst addq index lip lip))) - ,@(ecase size - (:byte - (if signed - `((inst ldq_u temp (- (* ,offset n-word-bytes) ,lowtag) - lip) - (inst lda temp1 (1+ (- (* ,offset n-word-bytes) ,lowtag)) - lip) - (inst extqh temp temp1 temp) - (inst sra temp 56 value)) - `((inst ldq_u - temp - (- (* ,offset n-word-bytes) ,lowtag) - lip) - (inst lda temp1 (- (* ,offset n-word-bytes) ,lowtag) - lip) - (inst extbl temp temp1 value)))) - (:short - (if signed - `((inst ldq_u temp (- (* ,offset n-word-bytes) ,lowtag) - lip) - (inst lda temp1 (- (* ,offset n-word-bytes) ,lowtag) - lip) - (inst extwl temp temp1 temp) - (inst sll temp 48 temp) - (inst sra temp 48 value)) - `((inst ldq_u temp (- (* ,offset n-word-bytes) ,lowtag) - lip) - (inst lda temp1 (- (* ,offset n-word-bytes) ,lowtag) lip) - (inst extwl temp temp1 value))))))) - (define-vop (,(symbolicate name "-C")) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:info index) - (:arg-types ,type - (:constant (load/store-index ,scale - ,(eval lowtag) - ,(eval offset)))) - (:results (value :scs ,scs)) - (:result-types ,el-type) - (:temporary (:sc non-descriptor-reg) temp) - (:temporary (:sc non-descriptor-reg) temp1) - (:generator 4 - ,@(ecase size - (:byte - (if signed - `((inst ldq_u temp (- (+ (* ,offset n-word-bytes) - (* index ,scale)) ,lowtag) - object) - (inst lda temp1 (1+ (- (+ (* ,offset n-word-bytes) - (* index ,scale)) ,lowtag)) - object) - (inst extqh temp temp1 temp) - (inst sra temp 56 value)) - `((inst ldq_u temp (- (+ (* ,offset n-word-bytes) - (* index ,scale)) ,lowtag) - object) - (inst lda temp1 (- (+ (* ,offset n-word-bytes) - (* index ,scale)) ,lowtag) - object) - (inst extbl temp temp1 value)))) - (:short - (if signed - `((inst ldq_u temp (- (+ (* ,offset n-word-bytes) - (* index ,scale)) ,lowtag) - object) - (inst lda temp1 (- (+ (* ,offset n-word-bytes) - (* index ,scale)) ,lowtag) - object) - (inst extwl temp temp1 temp) - (inst sll temp 48 temp) - (inst sra temp 48 value)) - `((inst ldq_u temp (- (+ (* ,offset n-word-bytes) - (* index ,scale)) ,lowtag) - object) - (inst lda temp1 (- (+ (* ,offset n-word-bytes) - (* index ,scale)) ,lowtag) - object) - (inst extwl temp temp1 value)))))))))) - -(defmacro define-partial-setter (name type size offset lowtag scs el-type - &optional translate) - (let ((scale (ecase size (:byte 1) (:short 2)))) - `(progn - (define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (unsigned-reg)) - (value :scs ,scs :target result)) - (:arg-types ,type positive-fixnum ,el-type) - (:temporary (:scs (interior-reg)) lip) - (:temporary (:sc non-descriptor-reg) temp) - (:temporary (:sc non-descriptor-reg) temp1) - (:temporary (:sc non-descriptor-reg) temp2) - (:results (result :scs ,scs)) - (:result-types ,el-type) - (:generator 5 - (inst addq object index lip) - ,@(when (eq size :short) - '((inst addq lip index lip))) - ,@(ecase size - (:byte - `((inst lda temp (- (* ,offset n-word-bytes) ,lowtag) lip) - (inst ldq_u temp1 (- (* ,offset n-word-bytes) ,lowtag) lip) - (inst insbl value temp temp2) - (inst mskbl temp1 temp temp1) - (inst bis temp1 temp2 temp1) - (inst stq_u temp1 (- (* ,offset n-word-bytes) ,lowtag) lip))) - (:short - `((inst lda temp (- (* ,offset n-word-bytes) ,lowtag) lip) - (inst ldq_u temp1 (- (* ,offset n-word-bytes) ,lowtag) lip) - (inst mskwl temp1 temp temp1) - (inst inswl value temp temp2) - (inst bis temp1 temp2 temp) - (inst stq_u temp (- (* ,offset n-word-bytes) ,lowtag) lip)))) - (move value result))) - (define-vop (,(symbolicate name "-C")) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (value :scs ,scs :target result)) - (:info index) - (:arg-types ,type - (:constant (load/store-index ,scale - ,(eval lowtag) - ,(eval offset))) - ,el-type) - (:temporary (:sc non-descriptor-reg) temp) - (:temporary (:sc non-descriptor-reg) temp1) - (:temporary (:sc non-descriptor-reg) temp2) - (:results (result :scs ,scs)) - (:result-types ,el-type) - (:generator 4 - ,@(ecase size - (:byte - `((inst lda temp (- (+ (* ,offset n-word-bytes) - (* index ,scale)) - ,lowtag) - object) - (inst ldq_u temp1 (- (+ (* ,offset n-word-bytes) - (* index ,scale)) - ,lowtag) - object) - (inst insbl value temp temp2) - (inst mskbl temp1 temp temp1) - (inst bis temp1 temp2 temp1) - (inst stq_u temp1 (- (+ (* ,offset n-word-bytes) - (* index ,scale)) - ,lowtag) object))) - (:short - `((inst lda temp (- (+ (* ,offset n-word-bytes) - (* index ,scale)) - ,lowtag) - object) - (inst ldq_u temp1 (- (+ (* ,offset n-word-bytes) - (* index ,scale)) - ,lowtag) - object) - (inst mskwl temp1 temp temp1) - (inst inswl value temp temp2) - (inst bis temp1 temp2 temp) - (inst stq_u temp (- (+ (* ,offset n-word-bytes) - (* index ,scale)) - ,lowtag) object)))) - (move value result)))))) diff --git a/src/compiler/alpha/memory.lisp b/src/compiler/alpha/memory.lisp deleted file mode 100644 index 7ef8470611..0000000000 --- a/src/compiler/alpha/memory.lisp +++ /dev/null @@ -1,30 +0,0 @@ -;;;; the Alpha definitions of some general purpose memory reference -;;;; VOPs inherited by basic memory reference operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;; Cell-Ref and Cell-Set are used to define VOPs like CAR, where the -;;; offset to be read or written is a property of the VOP used. -(define-vop (cell-ref) - (:args (object :scs (descriptor-reg))) - (:results (value :scs (descriptor-reg any-reg))) - (:variant-vars offset lowtag) - (:policy :fast-safe) - (:generator 4 - (loadw value object offset lowtag))) -(define-vop (cell-set) - (:args (object :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg null zero))) - (:variant-vars offset lowtag) - (:policy :fast-safe) - (:generator 4 - (storew value object offset lowtag))) diff --git a/src/compiler/alpha/move.lisp b/src/compiler/alpha/move.lisp deleted file mode 100644 index 8beff7bba6..0000000000 --- a/src/compiler/alpha/move.lisp +++ /dev/null @@ -1,317 +0,0 @@ -;;;; the Alpha VM definition of operand loading/saving and the Move VOP - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(define-move-fun (load-immediate 1) (vop x y) - ((null zero immediate) - (any-reg descriptor-reg)) - (let ((val (tn-value x))) - (etypecase val - (integer - (inst li (fixnumize val) y)) - (null - (move null-tn y)) - (symbol - (load-symbol y val)) - (character - (inst li (logior (ash (char-code val) n-widetag-bits) character-widetag) - y))))) - -(define-move-fun (load-number 1) (vop x y) - ((zero immediate) - (signed-reg unsigned-reg)) - (inst li (tn-value x) y)) - -(define-move-fun (load-character 1) (vop x y) - ((immediate) (character-reg)) - (inst li (char-code (tn-value x)) y)) - -(define-move-fun (load-system-area-pointer 1) (vop x y) - ((immediate) (sap-reg)) - (inst li (sap-int (tn-value x)) y)) - -(define-move-fun (load-constant 5) (vop x y) - ((constant) (descriptor-reg any-reg)) - (loadw y code-tn (tn-offset x) other-pointer-lowtag)) - -(define-move-fun (load-stack 5) (vop x y) - ((control-stack) (any-reg descriptor-reg)) - (load-stack-tn y x)) - -(define-move-fun (load-number-stack 5) (vop x y) - ((character-stack) (character-reg)) - (let ((nfp (current-nfp-tn vop))) - (loadw y nfp (tn-offset x)))) - -(define-move-fun (load-number-stack-64 5) (vop x y) - ((sap-stack) (sap-reg) - (signed-stack) (signed-reg) - (unsigned-stack) (unsigned-reg)) - (let ((nfp (current-nfp-tn vop))) - (loadq y nfp (tn-offset x)))) - -(define-move-fun (store-stack 5) (vop x y) - ((any-reg descriptor-reg null zero) (control-stack)) - (store-stack-tn y x)) - -(define-move-fun (store-number-stack 5) (vop x y) - ((character-reg) (character-stack)) - (let ((nfp (current-nfp-tn vop))) - (storew x nfp (tn-offset y)))) - -(define-move-fun (store-number-stack-64 5) (vop x y) - ((sap-reg) (sap-stack) - (signed-reg) (signed-stack) - (unsigned-reg) (unsigned-stack)) - (let ((nfp (current-nfp-tn vop))) - (storeq x nfp (tn-offset y)))) - -;;;; the MOVE VOP - -(define-vop (move) - (:args (x :target y - :scs (any-reg descriptor-reg zero null) - :load-if (not (location= x y)))) - (:results (y :scs (any-reg descriptor-reg control-stack) - :load-if (not (location= x y)))) - (:generator 0 - (unless (location= x y) - (sc-case y - ((any-reg descriptor-reg) - (inst move x y)) - (control-stack - (store-stack-tn y x)))))) - -(define-move-vop move :move - (any-reg descriptor-reg zero null) - (any-reg descriptor-reg)) - -;;; The MOVE-ARG VOP is used for moving descriptor values into -;;; another frame for argument or known value passing. -(define-vop (move-arg) - (:args (x :target y - :scs (any-reg descriptor-reg null zero)) - (fp :scs (any-reg) - :load-if (not (sc-is y any-reg descriptor-reg)))) - (:results (y)) - (:generator 0 - (sc-case y - ((any-reg descriptor-reg) - (move x y)) - (control-stack - (storew x fp (tn-offset y)))))) -;;; -(define-move-vop move-arg :move-arg - (any-reg descriptor-reg null zero) - (any-reg descriptor-reg)) - -;;;; moves and coercions -;;;; -;;;; These MOVE-TO-WORD VOPs move a tagged integer to a raw full-word -;;;; representation. Similarly, the MOVE-FROM-WORD VOPs converts a raw -;;;; integer to a tagged bignum or fixnum. - -;;; ARG is a fixnum, so just shift it. We need a type restriction -;;; because some possible arg SCs (control-stack) overlap with -;;; possible bignum arg SCs. -(define-vop (move-to-word/fixnum) - (:args (x :scs (any-reg descriptor-reg))) - (:results (y :scs (signed-reg unsigned-reg))) - (:arg-types tagged-num) - (:note "fixnum untagging") - (:generator 1 - (inst sra x n-fixnum-tag-bits y))) -(define-move-vop move-to-word/fixnum :move - (any-reg descriptor-reg) (signed-reg unsigned-reg)) - -;;; ARG is a non-immediate constant, load it. -(define-vop (move-to-word-c) - (:args (x :scs (constant))) - (:results (y :scs (signed-reg unsigned-reg))) - (:note "constant load") - (:generator 1 - (cond ((sb-c::tn-leaf x) - (inst li (tn-value x) y)) - (t - (loadw y code-tn (tn-offset x) other-pointer-lowtag) - (inst sra y n-fixnum-tag-bits y))))) -(define-move-vop move-to-word-c :move - (constant) (signed-reg unsigned-reg)) - -;;; ARG is a fixnum or bignum, figure out which and load if necessary. -(define-vop (move-to-word/integer) - (:args (x :scs (descriptor-reg))) - (:results (y :scs (signed-reg unsigned-reg))) - (:note "integer to untagged word coercion") - (:temporary (:sc non-descriptor-reg) header) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 3 - (inst and x fixnum-tag-mask temp) - (inst sra x n-fixnum-tag-bits y) - (inst beq temp done) - - (loadw header x 0 other-pointer-lowtag) - (inst srl header (1+ n-widetag-bits) header) - (loadw y x bignum-digits-offset other-pointer-lowtag) - (inst beq header one) - - (loadw header x (1+ bignum-digits-offset) other-pointer-lowtag) - (inst sll header 32 header) - (inst mskll y 4 y) - (inst bis header y y) - (inst br zero-tn done) - ONE - (when (sc-is y unsigned-reg) - (inst mskll y 4 y)) - DONE)) -(define-move-vop move-to-word/integer :move - (descriptor-reg) (signed-reg unsigned-reg)) - -;;; RESULT is a fixnum, so we can just shift. We need the result type -;;; restriction because of the control-stack ambiguity noted above. -(define-vop (move-from-word/fixnum) - (:args (x :scs (signed-reg unsigned-reg))) - (:results (y :scs (any-reg descriptor-reg))) - (:result-types tagged-num) - (:note "fixnum tagging") - (:generator 1 - (inst sll x n-fixnum-tag-bits y))) -(define-move-vop move-from-word/fixnum :move - (signed-reg unsigned-reg) (any-reg descriptor-reg)) - -;;; RESULT may be a bignum, so we have to check. Use a worst-case cost -;;; to make sure people know they may be number consing. -(define-vop (move-from-signed) - (:args (arg :scs (signed-reg unsigned-reg) :target x)) - (:results (y :scs (any-reg descriptor-reg))) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x temp) - (:temporary (:sc non-descriptor-reg) header) - (:note "signed word to integer coercion") - (:generator 18 - (move arg x) - (inst sra x n-positive-fixnum-bits temp) - (inst sll x n-fixnum-tag-bits y) - (inst beq temp done) - (inst not temp temp) - (inst beq temp done) - - (inst li 2 header) - (inst sra x 31 temp) - (inst cmoveq temp 1 header) - (inst not temp temp) - (inst cmoveq temp 1 header) - (inst sll header n-widetag-bits header) - (inst bis header bignum-widetag header) - - (pseudo-atomic (:extra (pad-data-block (+ bignum-digits-offset 3))) - (inst bis alloc-tn other-pointer-lowtag y) - (storew header y 0 other-pointer-lowtag) - (storew x y bignum-digits-offset other-pointer-lowtag) - (inst srl x 32 temp) - (storew temp y (1+ bignum-digits-offset) other-pointer-lowtag)) - DONE)) -(define-move-vop move-from-signed :move - (signed-reg) (descriptor-reg)) - -(define-vop (move-from-fixnum+1) - (:args (x :scs (signed-reg unsigned-reg))) - (:results (y :scs (any-reg descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:vop-var vop) - (:generator 4 - (inst sra x n-positive-fixnum-bits temp) - (inst sll x n-fixnum-tag-bits y) - (inst beq temp done) - (inst not temp temp) - (inst beq temp done) - (load-constant vop (emit-constant (1+ most-positive-fixnum)) - y) - DONE)) - -(define-vop (move-from-fixnum-1 move-from-fixnum+1) - (:generator 4 - (inst sra x n-positive-fixnum-bits temp) - (inst sll x n-fixnum-tag-bits y) - (inst beq temp done) - (inst not temp temp) - (inst beq temp done) - (load-constant vop (emit-constant (1- most-negative-fixnum)) - y) - DONE)) - -;;; Check for fixnum, and possibly allocate one or two word bignum -;;; result. Use a worst-case cost to make sure people know they may be -;;; number consing. -(define-vop (move-from-unsigned) - (:args (arg :scs (signed-reg unsigned-reg) :target x)) - (:results (y :scs (any-reg descriptor-reg))) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x temp) - (:temporary (:sc non-descriptor-reg) temp1) - (:note "unsigned word to integer coercion") - (:generator 20 - (move arg x) - (inst srl x n-positive-fixnum-bits temp) - (inst sll x n-fixnum-tag-bits y) - (inst beq temp done) - - (inst li 3 temp) - (inst cmovge x 2 temp) - (inst srl x 31 temp1) - (inst cmoveq temp1 1 temp) - (inst sll temp n-widetag-bits temp) - (inst bis temp bignum-widetag temp) - - (pseudo-atomic (:extra (pad-data-block (+ bignum-digits-offset 3))) - (inst bis alloc-tn other-pointer-lowtag y) - (storew temp y 0 other-pointer-lowtag) - (storew x y bignum-digits-offset other-pointer-lowtag) - (inst srl x 32 temp) - (storew temp y (1+ bignum-digits-offset) other-pointer-lowtag)) - DONE)) -(define-move-vop move-from-unsigned :move - (unsigned-reg) (descriptor-reg)) - -;;; Move untagged numbers. -(define-vop (word-move) - (:args (x :target y - :scs (signed-reg unsigned-reg) - :load-if (not (location= x y)))) - (:results (y :scs (signed-reg unsigned-reg) - :load-if (not (location= x y)))) - (:note "word integer move") - (:generator 0 - (move x y))) -(define-move-vop word-move :move - (signed-reg unsigned-reg) (signed-reg unsigned-reg)) - -;;; Move untagged number arguments/return-values. -(define-vop (move-word-arg) - (:args (x :target y - :scs (signed-reg unsigned-reg)) - (fp :scs (any-reg) - :load-if (not (sc-is y signed-reg unsigned-reg)))) - (:results (y)) - (:note "word integer argument move") - (:generator 0 - (sc-case y - ((signed-reg unsigned-reg) - (move x y)) - ((signed-stack unsigned-stack) - (storeq x fp (tn-offset y)))))) -(define-move-vop move-word-arg :move-arg - (descriptor-reg any-reg signed-reg unsigned-reg) (signed-reg unsigned-reg)) - - -;;; Use standard MOVE-ARG + coercion to move an untagged number -;;; to a descriptor passing location. -(define-move-vop move-arg :move-arg - (signed-reg unsigned-reg) (any-reg descriptor-reg)) diff --git a/src/compiler/alpha/nlx.lisp b/src/compiler/alpha/nlx.lisp deleted file mode 100644 index 8d78ac9864..0000000000 --- a/src/compiler/alpha/nlx.lisp +++ /dev/null @@ -1,261 +0,0 @@ -;;;; the definitions of VOPs used for non-local exit (THROW, lexical -;;;; exit, etc.) - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;; Make a TN for the argument count passing location for a -;;; non-local entry. -(defun make-nlx-entry-arg-start-location () - (make-wired-tn *fixnum-primitive-type* immediate-arg-scn ocfp-offset)) - -;;;; save and restoring the dynamic environment -;;;; -;;;; These VOPs are used in the reentered function to restore the -;;;; appropriate dynamic environment. Currently we only save the -;;;; CURRENT-CATCH and binding stack pointer. We don't need to -;;;; save/restore the current UNWIND-PROTECT, since UNWIND-PROTECTS -;;;; are implicitly processed during unwinding. If there were any -;;;; additional stacks (as e.g. there was an interpreter "eval stack" -;;;; before sbcl-0.7.0), then this would be the place to restore the -;;;; top pointers. - -(define-vop (save-dynamic-state) - (:results (catch :scs (descriptor-reg)) - (nfp :scs (descriptor-reg)) - (nsp :scs (descriptor-reg))) - (:vop-var vop) - (:generator 13 - (load-symbol-value catch *current-catch-block*) - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (inst mskll cur-nfp 4 nfp))) - (inst mskll nsp-tn 4 nsp))) - -(define-vop (restore-dynamic-state) - (:args (catch :scs (descriptor-reg)) - (nfp :scs (descriptor-reg)) - (nsp :scs (descriptor-reg))) - (:vop-var vop) - (:temporary (:sc any-reg) temp) - (:generator 10 - (store-symbol-value catch *current-catch-block*) - (inst mskll nsp-tn 0 temp) - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (inst bis nfp temp cur-nfp))) - (inst bis nsp temp nsp-tn))) - -(define-vop (current-stack-pointer) - (:results (res :scs (any-reg descriptor-reg))) - (:generator 1 - (move csp-tn res))) - -(define-vop (current-binding-pointer) - (:results (res :scs (any-reg descriptor-reg))) - (:generator 1 - (move bsp-tn res))) - -(define-vop (current-nsp) - (:results (res :scs (any-reg descriptor-reg))) - (:generator 1 - (move res nsp-tn))) - -(define-vop (set-nsp) - (:args (nsp :scs (any-reg descriptor-reg))) - (:generator 1 - (move nsp-tn nsp))) - -;;;; unwind block hackery - -;;; Compute the address of the catch block from its TN, then store -;;; into the block the current Fp, Env, Unwind-Protect, and the entry PC. -(define-vop (make-unwind-block) - (:args (tn)) - (:info entry-label) - (:results (block :scs (any-reg))) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:generator 22 - (inst lda block (tn-byte-offset tn) cfp-tn) - (load-symbol-value temp *current-unwind-protect-block*) - (storew temp block unwind-block-uwp-slot) - (storew cfp-tn block unwind-block-cfp-slot) - (storew code-tn block unwind-block-code-slot) - (inst compute-lra-from-code temp code-tn entry-label ndescr) - (storew temp block catch-block-entry-pc-slot))) - - -;;; This is like Make-Unwind-Block, except that we also store in the -;;; specified tag, and link the block into the Current-Catch list. -(define-vop (make-catch-block) - (:args (tn) - (tag :scs (any-reg descriptor-reg))) - (:info entry-label) - (:results (block :scs (any-reg))) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (descriptor-reg) :target block :to (:result 0)) result) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:generator 44 - (inst lda result (tn-byte-offset tn) cfp-tn) - (load-symbol-value temp *current-unwind-protect-block*) - (storew temp result catch-block-uwp-slot) - (storew cfp-tn result catch-block-cfp-slot) - (storew code-tn result catch-block-code-slot) - (inst compute-lra-from-code temp code-tn entry-label ndescr) - (storew temp result catch-block-entry-pc-slot) - - (storew tag result catch-block-tag-slot) - (load-symbol-value temp *current-catch-block*) - (storew temp result catch-block-previous-catch-slot) - (store-symbol-value result *current-catch-block*) - - (move result block))) - -;;; Just set the current unwind-protect to UWP. This -;;; instantiates an unwind block as an unwind-protect. -(define-vop (set-unwind-protect) - (:args (uwp :scs (any-reg))) - (:generator 7 - (store-symbol-value uwp *current-unwind-protect-block*))) - -(define-vop (%catch-breakup) - (:args (current-block)) - (:ignore current-block) - (:temporary (:scs (any-reg)) block) - (:policy :fast-safe) - (:generator 17 - (load-symbol-value block *current-catch-block*) - (loadw block block catch-block-previous-catch-slot) - (store-symbol-value block *current-catch-block*))) - -(define-vop (%unwind-protect-breakup) - (:args (current-block)) - (:ignore current-block) - (:temporary (:scs (any-reg)) block) - (:policy :fast-safe) - (:generator 17 - (load-symbol-value block *current-unwind-protect-block*) - (loadw block block unwind-block-uwp-slot) - (store-symbol-value block *current-unwind-protect-block*))) - -;;;; NLX entry VOPs - -(define-vop (nlx-entry) - (:args (sp) ; Note: we can't list an sc-restriction, 'cause any load vops - ; would be inserted before the LRA. - (start) - (count)) - (:results (values :more t)) - (:temporary (:scs (descriptor-reg)) move-temp) - (:temporary (:sc non-descriptor-reg) temp) - (:info label nvals) - (:save-p :force-to-stack) - (:vop-var vop) - (:generator 30 - (emit-return-pc label) - (note-this-location vop :non-local-entry) - (cond ((zerop nvals)) - ((= nvals 1) - (let ((no-values (gen-label))) - (move null-tn (tn-ref-tn values)) - (inst beq count no-values) - (loadw (tn-ref-tn values) start) - (emit-label no-values))) - (t - (collect ((defaults)) - (do ((i 0 (1+ i)) - (tn-ref values (tn-ref-across tn-ref))) - ((null tn-ref)) - (let ((default-lab (gen-label)) - (tn (tn-ref-tn tn-ref))) - (defaults (cons default-lab tn)) - - (inst move count temp) - (inst lda count (fixnumize -1) count) - (inst beq temp default-lab) - (sc-case tn - ((descriptor-reg any-reg) - (loadw tn start i)) - (control-stack - (loadw move-temp start i) - (store-stack-tn tn move-temp))))) - - (let ((defaulting-done (gen-label))) - - (emit-label defaulting-done) - - (assemble (:elsewhere) - (dolist (def (defaults)) - (emit-label (car def)) - (let ((tn (cdr def))) - (sc-case tn - ((descriptor-reg any-reg) - (move null-tn tn)) - (control-stack - (store-stack-tn tn null-tn))))) - (inst br zero-tn defaulting-done)))))) - (load-stack-tn csp-tn sp))) - -(define-vop (nlx-entry-multiple) - (:args (top :target dst) (start :target src) (count :target num)) - ;; Again, no SC restrictions for the args, 'cause the loading would - ;; happen before the entry label. - (:info label) - (:temporary (:scs (any-reg) :from (:argument 0)) dst) - (:temporary (:scs (any-reg) :from (:argument 1)) src) - (:temporary (:scs (any-reg) :from (:argument 2)) num) - (:temporary (:scs (descriptor-reg)) temp) - (:results (new-start) (new-count)) - (:save-p :force-to-stack) - (:vop-var vop) - (:generator 30 - (emit-return-pc label) - (note-this-location vop :non-local-entry) - (let ((loop (gen-label)) - (done (gen-label))) - - ;; Copy args. - (load-stack-tn dst top) - (move start src) - (move count num) - - ;; Establish results. - (sc-case new-start - (any-reg (move dst new-start)) - (control-stack (store-stack-tn new-start dst))) - (sc-case new-count - (any-reg (inst move num new-count)) - (control-stack (store-stack-tn new-count num))) - (inst beq num done) - - ;; Copy stuff on stack. - (emit-label loop) - (loadw temp src) - (inst lda src n-word-bytes src) - (storew temp dst) - (inst lda num (fixnumize -1) num) - (inst lda dst n-word-bytes dst) - (inst bne num loop) - - (emit-label done) - (inst move dst csp-tn)))) - -;;; This VOP is just to force the TNs used in the cleanup onto the stack. -(define-vop (uwp-entry) - (:info label) - (:save-p :force-to-stack) - (:results (block) (start) (count)) - (:ignore block start count) - (:vop-var vop) - (:generator 0 - (emit-return-pc label) - (note-this-location vop :non-local-entry))) diff --git a/src/compiler/alpha/parms.lisp b/src/compiler/alpha/parms.lisp deleted file mode 100644 index 99e334d9eb..0000000000 --- a/src/compiler/alpha/parms.lisp +++ /dev/null @@ -1,190 +0,0 @@ -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(defconstant sb-assem:assem-scheduler-p nil) -(defconstant sb-assem:+inst-alignment-bytes+ 4) - -(defconstant +backend-fasl-file-implementation+ :alpha) - -(defconstant +backend-page-bytes+ 8192) - -(eval-when (:compile-toplevel :load-toplevel :execute) - -;;; number of bits per word where a word holds one lisp descriptor -(defconstant n-word-bits 32) - -;;; the natural width of a machine word (as seen in e.g. register width, -;;; address space) -(defconstant n-machine-word-bits 64) - -(defconstant float-sign-shift 31) - -(defconstant single-float-bias 126) -(defconstant-eqx single-float-exponent-byte (byte 8 23) #'equalp) -(defconstant-eqx single-float-significand-byte (byte 23 0) #'equalp) -(defconstant single-float-normal-exponent-min 1) -(defconstant single-float-normal-exponent-max 254) -(defconstant single-float-hidden-bit (ash 1 23)) - -(defconstant double-float-bias 1022) -(defconstant-eqx double-float-exponent-byte (byte 11 20) #'equalp) -(defconstant-eqx double-float-significand-byte (byte 20 0) #'equalp) -(defconstant double-float-normal-exponent-min 1) -(defconstant double-float-normal-exponent-max #x7FE) -(defconstant double-float-hidden-bit (ash 1 20)) - -(defconstant single-float-digits - (+ (byte-size single-float-significand-byte) 1)) - -(defconstant double-float-digits - (+ (byte-size double-float-significand-byte) n-word-bits 1)) - -;;; These values are originally from the DEC Assembly Language -;;; Programmers guide. Where possible we read/write the software -;;; fp_control word, which apparently is necessary for the OS FPU -;;; completion (OS handler which fixes up non-IEEE answers that the -;;; hardware occasionally gives us) to work properly. The rounding -;;; mode, however, can't be set that way, so we have to deal with that -;;; directly. (FIXME: we actually don't suport setting the rounding mode -;;; at the moment anyway) - -;;; Short guide to floating point trap terminology: an "exception" is -;;; cheap and can happen at almost any time. An exception will only -;;; generate a trap if that trap is enabled, otherwise a default value -;;; will be substituted. A "trap" will end up somewhere in the -;;; kernel, which may play by its own rules, (on Alpha it allegedly -;;; actually fixes up some non-IEEE compliant results to get the -;;; _right_ answer) but if something is really wrong will eventually -;;; signal SIGFPE and let us sort it out. - -;;; Old comment follows: The active bits are actually in (byte 12 52) -;;; of the fpcr. (byte 6 52) contain the exception flags. Bit 63 is the -;;; bitwise logor of all exceptions. The enable and exception bytes -;;; are in a software control word manipulated via OS functions and the -;;; bits in the SCP match those defs. This mapping follows -;;; - -;;; trap enables are set in software (fp_control) -(defconstant float-inexact-trap-bit (ash 1 4)) ; rw -(defconstant float-underflow-trap-bit (ash 1 3)) ; rw -(defconstant float-overflow-trap-bit (ash 1 2)) ; ro -(defconstant float-divide-by-zero-trap-bit (ash 1 1)) ; ro -(defconstant float-invalid-trap-bit (ash 1 0)) ; ro -(defconstant-eqx float-traps-byte (byte 6 1) #'equalp) - -;;; exceptions are also read/written in software (by syscalls, no less). -;;; This is kind of dumb, but has to be done -(defconstant-eqx float-sticky-bits (byte 6 17) #'equalp) ; fp_control - -;;; (We don't actually _have_ "current exceptions" on Alpha; the -;;; hardware only ever sets bits. So, set this the same as accrued -;;; exceptions) -(defconstant-eqx float-exceptions-byte (byte 6 17) #'equalp) - -;;; Rounding modes can only be set by frobbing the hardware fpcr directly -(defconstant float-round-to-zero 0) -(defconstant float-round-to-negative 1) -(defconstant float-round-to-nearest 2) -(defconstant float-round-to-positive 3) -(defconstant-eqx float-rounding-mode (byte 2 58) #'equalp) - -;;; Miscellaneous stuff - I think it's far to say that you deserve -;;; what you get if you ask for fast mode. -(defconstant float-fast-bit 0) - -); eval-when - - - -;;;; Description of the target address space. - -;;; Where to put the different spaces. -;;; - -(defconstant linkage-table-space-start #x1000) -(defconstant linkage-table-space-end linkage-table-space-start) ; 0 size - -#+linux -(progn - (defconstant read-only-space-start #x20000000) - (defconstant read-only-space-end #x24000000)) - -(defconstant static-space-start #x28000000) -(defconstant static-space-end #x2c000000) - -(defparameter dynamic-0-space-start #x30000000) -(defparameter dynamic-0-space-end #x3fff0000) - -;;; FIXME nothing refers to either of these in alpha or x86 cmucl -;;; backend, so they could probably be removed. - -;; The space-register holding the lisp heap. -(defconstant lisp-heap-space 4) - -;; The space-register holding the C text segment. -(defconstant c-text-space 4) - - -;;;; other miscellaneous constants - -(defenum (:start 8) - halt-trap - pending-interrupt-trap - cerror-trap - breakpoint-trap - fun-end-breakpoint-trap - single-step-breakpoint-trap - ;; Stepper actually not implemented on Alpha, but these constants - ;; are still needed to avoid undefined variable warnings during sbcl - ;; build. - single-step-around-trap - single-step-before-trap - error-trap) - -;;;; static symbols - -;;; These symbols are loaded into static space directly after NIL so -;;; that the system can compute their address by adding a constant -;;; amount to NIL. -;;; -;;; The fdefn objects for the static functions are loaded into static -;;; space directly after the static symbols. That way, the raw-addr -;;; can be loaded directly out of them by indirecting relative to NIL. -;;; -(defconstant-eqx +static-symbols+ - `#(,@+common-static-symbols+) - #'equalp) - -(defconstant-eqx +static-fdefns+ - #(length - two-arg-+ - two-arg-- - two-arg-* - two-arg-/ - two-arg-< - two-arg-> - two-arg-= - ;; FIXME: Is this - ;; probably need the following as they are defined in - ;; arith.lisp: two-arg-<= two-arg->= two-arg-/= - ;; a comment from old CMU CL or old old CMU CL or - ;; the SBCL alpha port or what? Do we need to worry about it, - ;; or can we delete it? - two-arg-/= - eql - %negate - two-arg-and - two-arg-ior - two-arg-xor - two-arg-eqv - two-arg-gcd - two-arg-lcm) - #'equalp) diff --git a/src/compiler/alpha/pred.lisp b/src/compiler/alpha/pred.lisp deleted file mode 100644 index 9152ebe5af..0000000000 --- a/src/compiler/alpha/pred.lisp +++ /dev/null @@ -1,55 +0,0 @@ -;;;; the VM definition of predicate VOPs for the Alpha - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; the Branch VOP - -;;; The unconditional branch, emitted when we can't drop through to -;;; the desired destination. Dest is the continuation we transfer -;;; control to. -(define-vop (branch) - (:info dest) - (:generator 5 - (inst br zero-tn dest))) - - -;;;; Generic conditional VOPs - -;;; The generic conditional branch, emitted immediately after test -;;; VOPs that only set flags. - -(define-vop (branch-if) - (:info dest flags not-p) - (:ignore dest flags not-p) - (:generator 0 - (error "BRANCH-IF not yet implemented"))) - -(defun convert-conditional-move-p (node dst-tn x-tn y-tn) - (declare (ignore node dst-tn x-tn y-tn)) - nil) - - -;;;; conditional VOPs - -(define-vop (if-eq) - (:args (x :scs (any-reg descriptor-reg zero null)) - (y :scs (any-reg descriptor-reg zero null))) - (:conditional) - (:temporary (:scs (non-descriptor-reg)) temp) - (:info target not-p) - (:policy :fast-safe) - (:translate eq) - (:generator 3 - (inst cmpeq x y temp) - (if not-p - (inst beq temp target) - (inst bne temp target)))) diff --git a/src/compiler/alpha/sap.lisp b/src/compiler/alpha/sap.lisp deleted file mode 100644 index ab88552b52..0000000000 --- a/src/compiler/alpha/sap.lisp +++ /dev/null @@ -1,355 +0,0 @@ -;;;; the Alpha VM definition of SAP operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; moves and coercions - -;;; Move a tagged SAP to an untagged representation. -(define-vop (move-to-sap) - (:args (x :scs (descriptor-reg))) - (:results (y :scs (sap-reg))) - (:note "system area pointer indirection") - (:generator 1 - (loadq y x sap-pointer-slot other-pointer-lowtag))) -(define-move-vop move-to-sap :move - (descriptor-reg) (sap-reg)) - -;;; Move an untagged SAP to a tagged representation. -(define-vop (move-from-sap) - (:args (x :scs (sap-reg) :target sap)) - (:temporary (:scs (sap-reg) :from (:argument 0)) sap) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:results (y :scs (descriptor-reg))) - (:note "system area pointer allocation") - (:generator 20 - (move x sap) - (with-fixed-allocation (y ndescr sap-widetag sap-size) - (storeq sap y sap-pointer-slot other-pointer-lowtag)))) -(define-move-vop move-from-sap :move - (sap-reg) (descriptor-reg)) - -;;; Move untagged SAP values. -(define-vop (sap-move) - (:args (x :target y - :scs (sap-reg) - :load-if (not (location= x y)))) - (:results (y :scs (sap-reg) - :load-if (not (location= x y)))) - (:generator 0 - (move x y))) -(define-move-vop sap-move :move - (sap-reg) (sap-reg)) - -;;; Move untagged SAP arguments/return-values. -(define-vop (move-sap-arg) - (:args (x :target y - :scs (sap-reg)) - (fp :scs (any-reg) - :load-if (not (sc-is y sap-reg)))) - (:results (y)) - (:generator 0 - (sc-case y - (sap-reg - (move x y)) - (sap-stack - (storeq x fp (tn-offset y)))))) -(define-move-vop move-sap-arg :move-arg - (descriptor-reg sap-reg) (sap-reg)) - -;;; Use standard MOVE-ARG + coercion to move an untagged sap to a -;;; descriptor passing location. -(define-move-vop move-arg :move-arg - (sap-reg) (descriptor-reg)) - -;;;; SAP-INT and INT-SAP - -(define-vop (sap-int) - (:args (sap :scs (sap-reg) :target int)) - (:arg-types system-area-pointer) - (:results (int :scs (unsigned-reg))) - (:result-types unsigned-num) - (:translate sap-int) - (:policy :fast-safe) - (:generator 1 - (move sap int))) - -(define-vop (int-sap) - (:args (int :scs (unsigned-reg) :target sap)) - (:arg-types unsigned-num) - (:results (sap :scs (sap-reg))) - (:result-types system-area-pointer) - (:translate int-sap) - (:policy :fast-safe) - (:generator 1 - (move int sap))) - -;;;; POINTER+ and POINTER- - -(define-vop (pointer+) - (:translate sap+) - (:args (ptr :scs (sap-reg)) - (offset :scs (signed-reg immediate))) - (:arg-types system-area-pointer signed-num) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:policy :fast-safe) - (:generator 1 - (sc-case offset - (signed-reg - (inst addq offset ptr res)) - (immediate - (inst lda res (tn-value offset) ptr))))) - -(define-vop (pointer-) - (:translate sap-) - (:args (ptr1 :scs (sap-reg)) - (ptr2 :scs (sap-reg))) - (:arg-types system-area-pointer system-area-pointer) - (:policy :fast-safe) - (:results (res :scs (signed-reg))) - (:result-types signed-num) - (:generator 1 - (inst subq ptr1 ptr2 res))) - -;;;; mumble-SYSTEM-REF and mumble-SYSTEM-SET - -(macrolet ((def-system-ref-and-set - (ref-name set-name sc type size &optional signed) - (let ((ref-name-c (symbolicate ref-name "-C")) - (set-name-c (symbolicate set-name "-C"))) - `(progn - (define-vop (,ref-name) - (:translate ,ref-name) - (:policy :fast-safe) - (:args (object :scs (sap-reg) :target sap) - (offset :scs (signed-reg))) - (:arg-types system-area-pointer signed-num) - ,@(when (or (eq size :byte) (eq size :short)) - `((:temporary (:sc non-descriptor-reg) temp) - (:temporary (:sc non-descriptor-reg) temp1))) - (:results (result :scs (,sc))) - (:result-types ,type) - (:temporary (:scs (sap-reg) :from (:argument 0)) sap) - (:generator 5 - (inst addq object offset sap) - ,@(ecase size - (:byte - (if signed - '((inst ldq_u temp 0 sap) - (inst lda temp1 1 sap) - (inst extqh temp temp1 temp) - (inst sra temp 56 result)) - '((inst ldq_u temp 0 sap) - (inst lda temp1 0 sap) - (inst extbl temp temp1 result)))) - (:short - (if signed - '((inst ldq_u temp 0 sap) - (inst lda temp1 0 sap) - (inst extwl temp temp1 temp) - (inst sll temp 48 temp) - (inst sra temp 48 result)) - '((inst ldq_u temp 0 sap) - (inst lda temp1 0 sap) - (inst extwl temp temp1 result)))) - (:long - `((inst ldl result 0 sap) - ,@(unless signed - '((inst mskll result 4 result))))) - (:quad - '((inst ldq result 0 sap))) - (:single - '((inst lds result 0 sap))) - (:double - '((inst ldt result 0 sap)))))) - (define-vop (,ref-name-c) - (:translate ,ref-name) - (:policy :fast-safe) - (:args (object :scs (sap-reg))) - (:arg-types system-area-pointer - (:constant ,(if (eq size :double) - ;; We need to be able to add 4. - `(integer ,(- (ash 1 16)) - ,(- (ash 1 16) 5)) - '(signed-byte 16)))) - ,@(when (or (eq size :byte) (eq size :short)) - `((:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:sc non-descriptor-reg) temp1))) - (:info offset) - (:results (result :scs (,sc))) - (:result-types ,type) - (:generator 4 - ,@(ecase size - (:byte - (if signed - '((inst ldq_u temp offset object) - (inst lda temp1 (1+ offset) object) - (inst extqh temp temp1 temp) - (inst sra temp 56 result)) - '((inst ldq_u temp offset object) - (inst lda temp1 offset object) - (inst extbl temp temp1 result)))) - (:short - (if signed - '((inst ldq_u temp offset object) - (inst lda temp1 offset object) - (inst extwl temp temp1 temp) - (inst sll temp 48 temp) - (inst sra temp 48 result)) - '((inst ldq_u temp offset object) - (inst lda temp1 offset object) - (inst extwl temp temp1 result)))) - (:long - `((inst ldl result offset object) - ,@(unless signed - '((inst mskll result 4 result))))) - (:quad - '((inst ldq result offset object))) - (:single - '((inst lds result offset object))) - (:double - '((inst ldt result offset object)))))) - (define-vop (,set-name) - (:translate ,set-name) - (:policy :fast-safe) - (:args (object :scs (sap-reg) :target sap) - (offset :scs (signed-reg)) - (value :scs (,sc) :target result)) - (:arg-types system-area-pointer signed-num ,type) - (:results (result :scs (,sc))) - (:result-types ,type) - (:temporary (:scs (sap-reg) :from (:argument 0)) sap) - ,@(when (or (eq size :byte) (eq size :short)) - `((:temporary (:sc non-descriptor-reg) temp) - (:temporary (:sc non-descriptor-reg) temp1) - (:temporary (:sc non-descriptor-reg) temp2))) - (:generator 5 - (inst addq object offset sap) - ,@(ecase size - (:byte - '((inst lda temp 0 sap) - (inst ldq_u temp1 0 sap) - (inst insbl value temp temp2) - (inst mskbl temp1 temp temp1) - (inst bis temp1 temp2 temp1) - (inst stq_u temp1 0 sap) - (inst move value result))) - (:short - '((inst lda temp 0 sap) - (inst ldq_u temp1 0 sap) - (inst mskwl temp1 temp temp1) - (inst inswl value temp temp2) - (inst bis temp1 temp2 temp) - (inst stq_u temp 0 sap) - (inst move value result))) - (:long - '((inst stl value 0 sap) - (move value result))) - (:quad - '((inst stq value 0 sap) - (move value result))) - (:single - '((unless (location= result value) - (inst fmove value result)) - (inst sts value 0 sap))) - (:double - '((unless (location= result value) - (inst fmove value result)) - (inst stt value 0 sap)))))) - (define-vop (,set-name-c) - (:translate ,set-name) - (:policy :fast-safe) - (:args (object :scs (sap-reg)) - (value :scs (,sc) :target result)) - (:arg-types system-area-pointer - (:constant ,(if (eq size :double) - ;; We need to be able to add 4. - `(integer ,(- (ash 1 16)) - ,(- (ash 1 16) 5)) - '(signed-byte 16))) - ,type) - ,@(when (or (eq size :byte) (eq size :short)) - `((:temporary (:sc non-descriptor-reg) temp) - (:temporary (:sc non-descriptor-reg) temp1) - (:temporary (:sc non-descriptor-reg) temp2))) - (:info offset) - (:results (result :scs (,sc))) - (:result-types ,type) - (:generator 5 - ,@(ecase size - (:byte - '((inst lda temp offset object) - (inst ldq_u temp1 offset object) - (inst insbl value temp temp2) - (inst mskbl temp1 temp temp1) - (inst bis temp1 temp2 temp1) - (inst stq_u temp1 offset object) - (inst move value result))) - (:short - '((inst lda temp offset object) - (inst ldq_u temp1 offset object) - (inst mskwl temp1 temp temp1) - (inst inswl value temp temp2) - (inst bis temp1 temp2 temp) - (inst stq_u temp offset object) - (inst move value result))) - (:long - '((inst stl value offset object) - (move value result))) - (:quad - '((inst stq value offset object) - (move value result))) - (:single - '((unless (location= result value) - (inst fmove value result)) - (inst sts value offset object))) - (:double - '((unless (location= result value) - (inst fmove value result)) - (inst stt value offset object)))))))))) - (def-system-ref-and-set sap-ref-8 %set-sap-ref-8 - unsigned-reg positive-fixnum :byte nil) - (def-system-ref-and-set signed-sap-ref-8 %set-signed-sap-ref-8 - signed-reg tagged-num :byte t) - (def-system-ref-and-set sap-ref-16 %set-sap-ref-16 - unsigned-reg positive-fixnum :short nil) - (def-system-ref-and-set signed-sap-ref-16 %set-signed-sap-ref-16 - signed-reg tagged-num :short t) - (def-system-ref-and-set sap-ref-32 %set-sap-ref-32 - unsigned-reg unsigned-num :long nil) - (def-system-ref-and-set signed-sap-ref-32 %set-signed-sap-ref-32 - signed-reg signed-num :long t) - (def-system-ref-and-set sap-ref-64 %set-sap-ref-64 - unsigned-reg unsigned-num :quad nil) - (def-system-ref-and-set signed-sap-ref-64 %set-signed-sap-ref-64 - signed-reg signed-num :quad t) - (def-system-ref-and-set sap-ref-sap %set-sap-ref-sap - sap-reg system-area-pointer :quad) - (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj - descriptor-reg * :long) - (def-system-ref-and-set sap-ref-single %set-sap-ref-single - single-reg single-float :single) - (def-system-ref-and-set sap-ref-double %set-sap-ref-double - double-reg double-float :double)) - -;;; noise to convert normal Lisp data objects into SAPs - -(define-vop (vector-sap) - (:translate vector-sap) - (:policy :fast-safe) - (:args (vector :scs (descriptor-reg))) - (:results (sap :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 2 - (inst lda sap - (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - vector))) diff --git a/src/compiler/alpha/show.lisp b/src/compiler/alpha/show.lisp deleted file mode 100644 index 98137b54d5..0000000000 --- a/src/compiler/alpha/show.lisp +++ /dev/null @@ -1,34 +0,0 @@ -;;;; temporary printing utilities and similar noise - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(define-vop (print) - (:args (object :scs (descriptor-reg) :target a0)) - (:results (result :scs (descriptor-reg))) - (:save-p t) - (:temporary (:sc any-reg :offset cfunc-offset :target result :to (:result 0)) - cfunc) - (:temporary (:sc descriptor-reg :offset nl0-offset :from (:argument 0)) a0) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp) - (:vop-var vop) - (:generator 0 - (let ((cur-nfp (current-nfp-tn vop))) - (move object a0) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (inst li (make-fixup "debug_print" :foreign) cfunc) - (inst li (make-fixup "call_into_c" :foreign) temp) - (inst jsr lip-tn temp (make-fixup "call_into_c" :foreign)) - (when cur-nfp - (maybe-load-stack-nfp-tn cur-nfp nfp-save temp)) - (move cfunc result)))) diff --git a/src/compiler/alpha/subprim.lisp b/src/compiler/alpha/subprim.lisp deleted file mode 100644 index 24e4f6b80a..0000000000 --- a/src/compiler/alpha/subprim.lisp +++ /dev/null @@ -1,49 +0,0 @@ -;;;; linkage information for standard static functions, and random vops - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; LENGTH - -(define-vop (length/list) - (:translate length) - (:args (object :scs (descriptor-reg) :target ptr)) - (:arg-types list) - (:temporary (:scs (descriptor-reg) :from (:argument 0)) ptr) - (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:scs (any-reg) :to (:result 0) :target result) - count) - (:results (result :scs (any-reg descriptor-reg))) - (:policy :fast-safe) - (:vop-var vop) - (:save-p :compute-only) - (:generator 50 - (move object ptr) - (move zero-tn count) - - LOOP - - (inst cmpeq ptr null-tn temp) - (inst bne temp done) - - (inst and ptr lowtag-mask temp) - (inst xor temp list-pointer-lowtag temp) - (inst bne temp not-list) - - (loadw ptr ptr cons-cdr-slot list-pointer-lowtag) - (inst addq count (fixnumize 1) count) - (inst br zero-tn loop) - - NOT-LIST - (cerror-call vop 'object-not-list-error ptr) - - DONE - (move count result))) diff --git a/src/compiler/alpha/system.lisp b/src/compiler/alpha/system.lisp deleted file mode 100644 index 989d2fdb9e..0000000000 --- a/src/compiler/alpha/system.lisp +++ /dev/null @@ -1,208 +0,0 @@ -;;;; Alpha VM definitions of various system hacking operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; type frobbing VOPs - -(define-vop (widetag-of) - (:translate widetag-of) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 6 - ;; Pick off objects with headers. - (inst and object lowtag-mask result) - (inst cmpeq result other-pointer-lowtag ndescr) - (inst bne ndescr other-ptr) - (inst cmpeq result fun-pointer-lowtag ndescr) - (inst bne ndescr function-ptr) - - ;; Pick off structure and list pointers. - (inst blbs object done) - - ;; Pick off fixnums. - (inst and object fixnum-tag-mask result) - (inst beq result done) - - ;; Must be an other immediate. - (inst and object widetag-mask result) - (inst br zero-tn done) - - FUNCTION-PTR - (load-type result object (- fun-pointer-lowtag)) - (inst br zero-tn done) - - OTHER-PTR - (load-type result object (- other-pointer-lowtag)) - - DONE)) - -(define-vop (%other-pointer-widetag) - (:translate %other-pointer-widetag) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 6 - (load-type result object (- other-pointer-lowtag)))) - -(define-vop (fun-subtype) - (:translate fun-subtype) - (:policy :fast-safe) - (:args (function :scs (descriptor-reg))) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 6 - (load-type result function (- fun-pointer-lowtag)))) - -(define-vop (get-header-data) - (:translate get-header-data) - (:policy :fast-safe) - (:args (x :scs (descriptor-reg))) - (:results (res :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 6 - (loadw res x 0 other-pointer-lowtag) - (inst srl res n-widetag-bits res))) - -(define-vop (set-header-data) - (:translate set-header-data) - (:policy :fast-safe) - (:args (x :scs (descriptor-reg) :target res) - (data :scs (any-reg immediate zero))) - (:arg-types * positive-fixnum) - (:results (res :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) t1 t2) - (:generator 6 - (loadw t1 x 0 other-pointer-lowtag) - (inst and t1 widetag-mask t1) - (sc-case data - (any-reg - (inst sll data (- n-widetag-bits n-fixnum-tag-bits) t2) - (inst bis t1 t2 t1)) - (immediate - (let ((c (ash (tn-value data) n-widetag-bits))) - (cond ((<= 0 c (1- (ash 1 8))) - (inst bis t1 c t1)) - (t - (inst li c t2) - (inst bis t1 t2 t1))))) - (zero)) - (storew t1 x 0 other-pointer-lowtag) - (move x res))) - -(define-vop (pointer-hash) - (:translate pointer-hash) - (:args (ptr :scs (any-reg descriptor-reg))) - (:results (res :scs (any-reg descriptor-reg))) - (:policy :fast-safe) - (:generator 1 - ;; FIXME: It would be better if this would mask the lowtag, - ;; and shift the result into a positive fixnum like on x86. - (inst sll ptr 35 res) - (inst srl res 33 res))) - - -;;;; allocation - -(define-vop (dynamic-space-free-pointer) - (:results (int :scs (sap-reg))) - (:result-types system-area-pointer) - (:translate dynamic-space-free-pointer) - (:policy :fast-safe) - (:generator 1 - (move alloc-tn int))) - -(define-vop (binding-stack-pointer-sap) - (:results (int :scs (sap-reg))) - (:result-types system-area-pointer) - (:translate binding-stack-pointer-sap) - (:policy :fast-safe) - (:generator 1 - (move bsp-tn int))) - -(define-vop (control-stack-pointer-sap) - (:results (int :scs (sap-reg))) - (:result-types system-area-pointer) - (:translate control-stack-pointer-sap) - (:policy :fast-safe) - (:generator 1 - (move csp-tn int))) - - -;;;; code object frobbing - -(define-vop (code-instructions) - (:translate code-instructions) - (:policy :fast-safe) - (:args (code :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:results (sap :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 10 - (loadw ndescr code 0 other-pointer-lowtag) - (inst srl ndescr n-widetag-bits ndescr) - (inst sll ndescr word-shift ndescr) - (inst subq ndescr other-pointer-lowtag ndescr) - (inst addq code ndescr sap))) - -(define-vop (compute-fun) - (:args (code :scs (descriptor-reg)) - (offset :scs (signed-reg unsigned-reg))) - (:arg-types * positive-fixnum) - (:results (func :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:generator 10 - (loadw ndescr code code-boxed-size-slot other-pointer-lowtag) - (inst addq ndescr offset ndescr) - (inst subq ndescr (- other-pointer-lowtag fun-pointer-lowtag) ndescr) - (inst addq code ndescr func))) - -;;;; other random VOPs. - -(defknown sb-unix::receive-pending-interrupt () (values)) -(define-vop (sb-unix::receive-pending-interrupt) - (:policy :fast-safe) - (:translate sb-unix::receive-pending-interrupt) - (:generator 1 - (inst gentrap pending-interrupt-trap))) - - -(define-vop (halt) - (:generator 1 - (inst gentrap halt-trap))) - -(define-vop (istream-memory-barrier) - (:generator 1 - (inst imb))) - -;;;; dynamic vop count collection support - -(define-vop (count-me) - (:args (count-vector :scs (descriptor-reg))) - (:info index) - (:temporary (:scs (non-descriptor-reg)) count) - (:generator 1 - (let ((offset - (- (* (+ index vector-data-offset) n-word-bytes) - other-pointer-lowtag))) - (inst ldl count offset count-vector) - (inst addq count 1 count) - (inst stl count offset count-vector)))) - -;;;; Dummy definition for a spin-loop hint VOP -(define-vop () - (:translate spin-loop-hint) - (:policy :fast-safe) - (:generator 0)) diff --git a/src/compiler/alpha/target-insts.lisp b/src/compiler/alpha/target-insts.lisp deleted file mode 100644 index fe7879977b..0000000000 --- a/src/compiler/alpha/target-insts.lisp +++ /dev/null @@ -1,38 +0,0 @@ -;;;; This file is for stuff which was in CMU CL's insts.lisp -;;;; file, but which in the SBCL build process can't be compiled -;;;; into code for the cross-compilation host. - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-ALPHA-ASM") - -(defun bugchk-trap-control (chunk inst stream dstate) - (declare (ignore inst)) - (flet ((nt (x) (if stream (note x dstate)))) - (let ((trap (bugchk-trap-code chunk dstate))) - (case trap - (#.halt-trap - (nt "Halt trap")) - (#.pending-interrupt-trap - (nt "Pending interrupt trap")) - (#.breakpoint-trap - (nt "Breakpoint trap")) - (#.fun-end-breakpoint-trap - (nt "Function end breakpoint trap")) - (#.single-step-breakpoint-trap - (nt "Single step breakpoint trap")) - (#.single-step-around-trap - (nt "Single step around trap")) - (#.single-step-before-trap - (nt "Single step before trap")) - (t - (when (or (and (= trap cerror-trap) (progn (nt "cerror trap") t)) - (>= trap-number error-trap)) - (handle-break-args #'snarf-error-junk trap stream dstate))))))) diff --git a/src/compiler/alpha/type-vops.lisp b/src/compiler/alpha/type-vops.lisp deleted file mode 100644 index 0fff267d51..0000000000 --- a/src/compiler/alpha/type-vops.lisp +++ /dev/null @@ -1,189 +0,0 @@ -;;;; type testing and checking VOPs for the Alpha VM - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(defun %test-fixnum (value temp target not-p) - (assemble () - (inst and value fixnum-tag-mask temp) - (if not-p - (inst bne temp target) - (inst beq temp target)))) - -(defun %test-fixnum-and-headers (value temp target not-p headers &key value-tn-ref) - (let ((drop-through (gen-label))) - (assemble () - (inst and value fixnum-tag-mask temp) - (inst beq temp (if not-p drop-through target))) - (%test-headers value temp target not-p nil headers - :drop-through drop-through - :value-tn-ref value-tn-ref))) - -(defun %test-immediate (value temp target not-p immediate) - (assemble () - (inst and value 255 temp) - (inst xor temp immediate temp) - (if not-p - (inst bne temp target) - (inst beq temp target)))) - -(defun %test-lowtag (value temp target not-p lowtag) - (assemble () - (inst and value lowtag-mask temp) - (inst xor temp lowtag temp) - (if not-p - (inst bne temp target) - (inst beq temp target)))) - -(defun %test-headers (value temp target not-p function-p headers - &key (drop-through (gen-label)) value-tn-ref) - (declare (ignore value-tn-ref)) - (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag))) - (multiple-value-bind - (when-true when-false) - ;; WHEN-TRUE and WHEN-FALSE are the labels to branch to when - ;; we know it's true and when we know it's false respectively. - (if not-p - (values drop-through target) - (values target drop-through)) - (assemble () - (%test-lowtag value temp when-false t lowtag) - (load-type temp value (- lowtag)) - (let ((delta 0)) - (do ((remaining headers (cdr remaining))) - ((null remaining)) - (let ((header (car remaining)) - (last (null (cdr remaining)))) - (cond - ((atom header) - (inst subq temp (- header delta) temp) - (setf delta header) - (if last - (if not-p - (inst bne temp target) - (inst beq temp target)) - (inst beq temp when-true))) - (t - (let ((start (car header)) - (end (cdr header))) - (unless (= start bignum-widetag) - (inst subq temp (- start delta) temp) - (setf delta start) - (inst blt temp when-false)) - (inst subq temp (- end delta) temp) - (setf delta end) - (if last - (if not-p - (inst bgt temp target) - (inst ble temp target)) - (inst ble temp when-true)))))))) - (emit-label drop-through))))) - -;;;; Other integer ranges. - -;;; A (signed-byte 32) can be represented with either fixnum or a bignum with -;;; exactly one digit. -(define-vop (signed-byte-32-p type-predicate) - (:translate signed-byte-32-p) - (:temporary (:scs (non-descriptor-reg)) temp1) - (:generator 45 - (multiple-value-bind - (yep nope) - (if not-p - (values not-target target) - (values target not-target)) - (assemble () - (inst and value fixnum-tag-mask temp) - (inst beq temp yep) - (inst and value lowtag-mask temp) - (inst xor temp other-pointer-lowtag temp) - (inst bne temp nope) - (loadw temp value 0 other-pointer-lowtag) - (inst li (+ (ash 1 n-widetag-bits) bignum-widetag) temp1) - (inst xor temp temp1 temp) - (if not-p - (inst bne temp target) - (inst beq temp target)))) - NOT-TARGET)) - -;;; An (unsigned-byte 32) can be represented with either a positive fixnum, a -;;; bignum with exactly one positive digit, or a bignum with exactly two digits -;;; and the second digit all zeros. - -(define-vop (unsigned-byte-32-p type-predicate) - (:translate unsigned-byte-32-p) - (:temporary (:scs (non-descriptor-reg)) temp1) - (:generator 45 - (multiple-value-bind (yep nope) - (if not-p - (values not-target target) - (values target not-target)) - (assemble () - ;; Is it a fixnum? - (inst and value fixnum-tag-mask temp1) - (inst move value temp) - (inst beq temp1 fixnum) - - ;; If not, is it an other pointer? - (inst and value lowtag-mask temp) - (inst xor temp other-pointer-lowtag temp) - (inst bne temp nope) - ;; Get the header. - (loadw temp value 0 other-pointer-lowtag) - ;; Is it one? - (inst li (+ (ash 1 n-widetag-bits) bignum-widetag) temp1) - (inst xor temp temp1 temp) - (inst beq temp single-word) - ;; If it's other than two, we can't be an (unsigned-byte 32) - (inst li (logxor (+ (ash 1 n-widetag-bits) bignum-widetag) - (+ (ash 2 n-widetag-bits) bignum-widetag)) - temp1) - (inst xor temp temp1 temp) - (inst bne temp nope) - ;; Get the second digit. - (loadw temp value (1+ bignum-digits-offset) other-pointer-lowtag) - ;; All zeros, its an (unsigned-byte 32). - (inst beq temp yep) - (inst br zero-tn nope) - - SINGLE-WORD - ;; Get the single digit. - (loadw temp value bignum-digits-offset other-pointer-lowtag) - - ;; positive implies (unsigned-byte 32). - FIXNUM - (if not-p - (inst blt temp target) - (inst bge temp target)))) - NOT-TARGET)) - -;;;; List/symbol types: -;;; -;;; symbolp (or symbol (eq nil)) -;;; consp (and list (not (eq nil))) - -(define-vop (symbolp type-predicate) - (:translate symbolp) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 12 - (inst cmpeq value null-tn temp) - (inst bne temp (if not-p drop-thru target)) - (test-type value temp target not-p (symbol-widetag)) - DROP-THRU)) - -(define-vop (consp type-predicate) - (:translate consp) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 8 - (inst cmpeq value null-tn temp) - (inst bne temp (if not-p target drop-thru)) - (test-type value temp target not-p (list-pointer-lowtag)) - DROP-THRU)) diff --git a/src/compiler/alpha/values.lisp b/src/compiler/alpha/values.lisp deleted file mode 100644 index 4bafc5f0cb..0000000000 --- a/src/compiler/alpha/values.lisp +++ /dev/null @@ -1,156 +0,0 @@ -;;;; the Alpha implementation of unknown-values VOPs - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(define-vop (reset-stack-pointer) - (:args (ptr :scs (any-reg))) - (:generator 1 - (move ptr csp-tn))) - -(define-vop (%%nip-values) - (:args (last-nipped-ptr :scs (any-reg) :target dest) - (last-preserved-ptr :scs (any-reg) :target src) - (moved-ptrs :scs (any-reg) :more t)) - (:results (r-moved-ptrs :scs (any-reg) :more t)) - (:temporary (:sc any-reg) src) - (:temporary (:sc any-reg) dest) - (:temporary (:sc non-descriptor-reg) cmp-temp) - (:temporary (:sc descriptor-reg) temp) - (:ignore r-moved-ptrs) - (:generator 1 - (move last-nipped-ptr dest) - (move last-preserved-ptr src) - (inst cmple csp-tn src cmp-temp) - (inst bne cmp-temp DONE) - LOOP - (loadw temp src) - (inst addq dest n-word-bytes dest) - (inst addq src n-word-bytes src) - (storew temp dest -1) - (inst cmple csp-tn src cmp-temp) - (inst beq cmp-temp LOOP) - DONE - (inst lda csp-tn 0 dest) - (inst subq src dest src) - (loop for moved = moved-ptrs then (tn-ref-across moved) - while moved - do (sc-case (tn-ref-tn moved) - ((descriptor-reg any-reg) - (inst subq (tn-ref-tn moved) src (tn-ref-tn moved))) - ((control-stack) - (load-stack-tn temp (tn-ref-tn moved)) - (inst subq temp src temp) - (store-stack-tn (tn-ref-tn moved) temp)))))) - -;;; Push some values onto the stack, returning the start and number of -;;; values pushed as results. It is assumed that the Vals are wired to -;;; the standard argument locations. Nvals is the number of values to -;;; push. -;;; -;;; The generator cost is pseudo-random. We could get it right by -;;; defining a bogus SC that reflects the costs of the -;;; memory-to-memory moves for each operand, but this seems -;;; unworthwhile. -(define-vop (push-values) - (:args - (vals :more t)) - (:results - (start :scs (any-reg)) - (count :scs (any-reg))) - (:info nvals) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (descriptor-reg) - :to (:result 0) - :target start) - start-temp) - (:generator 20 - (move csp-tn start-temp) - (inst lda csp-tn (* nvals n-word-bytes) csp-tn) - (do ((val vals (tn-ref-across val)) - (i 0 (1+ i))) - ((null val)) - (let ((tn (tn-ref-tn val))) - (sc-case tn - (descriptor-reg - (storew tn start-temp i)) - (control-stack - (load-stack-tn temp tn) - (storew temp start-temp i))))) - (move start-temp start) - (inst li (fixnumize nvals) count))) - -;;; Push a list of values on the stack, returning Start and Count as -;;; used in unknown values continuations. -(define-vop (values-list) - (:args (arg :scs (descriptor-reg) :target list)) - (:arg-types list) - (:policy :fast-safe) - (:results (start :scs (any-reg)) - (count :scs (any-reg))) - (:temporary (:scs (descriptor-reg) :from (:argument 0)) list) - (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:vop-var vop) - (:save-p :compute-only) - (:generator 0 - (move arg list) - (move csp-tn start) - - LOOP - (inst cmpeq list null-tn temp) - (inst bne temp done) - (loadw temp list cons-car-slot list-pointer-lowtag) - (loadw list list cons-cdr-slot list-pointer-lowtag) - (inst lda csp-tn n-word-bytes csp-tn) - (storew temp csp-tn -1) - (inst and list lowtag-mask ndescr) - (inst xor ndescr list-pointer-lowtag ndescr) - (inst beq ndescr loop) - (cerror-call vop 'bogus-arg-to-values-list-error list) - - DONE - (inst subq csp-tn start count))) - -;;; Copy the &MORE arg block to the top of the stack so we can use -;;; them as function arguments. -(define-vop (%more-arg-values) - (:args (context :scs (descriptor-reg any-reg) :target src) - (skip :scs (any-reg zero immediate)) - (num :scs (any-reg) :target count)) - (:arg-types * positive-fixnum positive-fixnum) - (:temporary (:sc any-reg :from (:argument 0)) src) - (:temporary (:sc any-reg :from (:argument 2)) dst) - (:temporary (:sc descriptor-reg :from (:argument 1)) temp) - (:temporary (:sc non-descriptor-reg) temp1) - (:results (start :scs (any-reg)) - (count :scs (any-reg))) - (:generator 20 - (sc-case skip - (zero - (move context src)) - (immediate - (inst lda src (* (tn-value skip) n-word-bytes) context)) - (any-reg - (inst addq context skip src))) - (move num count) - (inst move csp-tn start) - (inst beq num done) - (inst move csp-tn dst) - (inst addq csp-tn count csp-tn) - LOOP - (inst ldl temp 0 src) - (inst addq src 4 src) - (inst addq dst 4 dst) - (inst stl temp -4 dst) - (inst cmpeq dst csp-tn temp1) - (inst beq temp1 loop) - DONE)) diff --git a/src/compiler/alpha/vm.lisp b/src/compiler/alpha/vm.lisp deleted file mode 100644 index a41ee8eb39..0000000000 --- a/src/compiler/alpha/vm.lisp +++ /dev/null @@ -1,347 +0,0 @@ -;;;; miscellaneous VM definition noise for the Alpha - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; defining the registers - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defvar *register-names* (make-array 32 :initial-element nil))) - -(macrolet ((defreg (name offset) - (let ((offset-sym (symbolicate name "-OFFSET"))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant ,offset-sym ,offset) - (setf (svref *register-names* ,offset-sym) - ,(symbol-name name))))) - (defregset (name &rest regs) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter ,name - (list ,@(mapcar (lambda (name) - (symbolicate name "-OFFSET")) - regs)))))) - ;; c.f. src/runtime/alpha-lispregs.h - - ;; Ra - (defreg lip 0) - ;; Caller saved 0-7 - (defreg a0 1) - (defreg a1 2) - (defreg a2 3) - (defreg a3 4) - (defreg a4 5) - (defreg a5 6) - (defreg l0 7) - (defreg nargs 8) - ;; Callee saved 0-6 - (defreg csp 9) - (defreg cfp 10) - (defreg ocfp 11) - (defreg bsp 12) - (defreg lexenv 13) - (defreg code 14) - (defreg null 15) - ;; Arg 0-5 - (defreg nl0 16) - (defreg nl1 17) - (defreg nl2 18) - (defreg nl3 19) - (defreg nl4 20) - (defreg nl5 21) - ;; Caller saved 8-11 - (defreg alloc 22) - (defreg fdefn 23) - (defreg cfunc 24) - (defreg nfp 25) - ;; Ra - (defreg lra 26) - ;; Caller saved 12 - (defreg l1 27) - ;; Assembler temp (at) - (defreg l2 28) - ;; Global pointer (gp) - (defreg gp 29) - ;; Stack pointer - (defreg nsp 30) - ;; Wired zero - (defreg zero 31) - - (defregset non-descriptor-regs - nl0 nl1 nl2 nl3 nl4 nl5 nfp cfunc) - - (defregset descriptor-regs - fdefn lexenv nargs ocfp lra a0 a1 a2 a3 a4 a5 l0 l1 l2) - - (defregset boxed-regs - code fdefn lexenv nargs ocfp lra - a0 a1 a2 a3 a4 a5 - l0 l1 l2) - - (defregset *register-arg-offsets* - a0 a1 a2 a3 a4 a5) - (defparameter register-arg-names '(a0 a1 a2 a3 a4 a5))) - -(!define-storage-bases -(define-storage-base registers :finite :size 32) -(define-storage-base float-registers :finite :size 64) -(define-storage-base control-stack :unbounded :size 8) -(define-storage-base non-descriptor-stack :unbounded :size 0) -(define-storage-base constant :non-packed) -(define-storage-base immediate-constant :non-packed) -) - -(!define-storage-classes - - ;; non-immediate constants in the constant pool - (constant constant) - - ;; ZERO and NULL are in registers. - (zero immediate-constant) - (null immediate-constant) - (fp-single-zero immediate-constant) - (fp-double-zero immediate-constant) - - ;; Anything else that can be an immediate. - (immediate immediate-constant) - - - ;; **** The stacks. - - ;; The control stack. (Scanned by GC) - (control-stack control-stack) - - ;; We put ANY-REG and DESCRIPTOR-REG early so that their SC-NUMBER - ;; is small and therefore the error trap information is smaller. - ;; Moving them up here from their previous place down below saves - ;; ~250K in core file size. --njf, 2006-01-27 - - ;; Immediate descriptor objects. Don't have to be seen by GC, but nothing - ;; bad will happen if they are. (fixnums, characters, header values, etc). - (any-reg - registers - :locations #.(append non-descriptor-regs descriptor-regs) - :constant-scs (zero immediate) - :save-p t - :alternate-scs (control-stack)) - - ;; Pointer descriptor objects. Must be seen by GC. - (descriptor-reg registers - :locations #.descriptor-regs - :constant-scs (constant null immediate) - :save-p t - :alternate-scs (control-stack)) - - ;; The non-descriptor stacks. - (signed-stack non-descriptor-stack - :element-size 2 :alignment 2) ; (signed-byte 64) - (unsigned-stack non-descriptor-stack - :element-size 2 :alignment 2) ; (unsigned-byte 64) - (character-stack non-descriptor-stack) ; non-descriptor characters. - (sap-stack non-descriptor-stack - :element-size 2 :alignment 2) ; System area pointers. - (single-stack non-descriptor-stack) ; single-floats - (double-stack non-descriptor-stack - :element-size 2 :alignment 2) ; double floats. - (complex-single-stack non-descriptor-stack :element-size 2) - (complex-double-stack non-descriptor-stack :element-size 4 :alignment 2) - - - ;; **** Things that can go in the integer registers. - - ;; Non-Descriptor characters - (character-reg registers - :locations #.non-descriptor-regs - :constant-scs (immediate) - :save-p t - :alternate-scs (character-stack)) - - ;; Non-Descriptor SAP's (arbitrary pointers into address space) - (sap-reg registers - :locations #.non-descriptor-regs - :constant-scs (immediate) - :save-p t - :alternate-scs (sap-stack)) - - ;; Non-Descriptor (signed or unsigned) numbers. - (signed-reg registers - :locations #.non-descriptor-regs - :constant-scs (zero immediate) - :save-p t - :alternate-scs (signed-stack)) - (unsigned-reg registers - :locations #.non-descriptor-regs - :constant-scs (zero immediate) - :save-p t - :alternate-scs (unsigned-stack)) - - ;; Random objects that must not be seen by GC. Used only as temporaries. - (non-descriptor-reg registers - :locations #.non-descriptor-regs) - - ;; Pointers to the interior of objects. Used only as an temporary. - (interior-reg registers - :locations (#.lip-offset)) - - - ;; **** Things that can go in the floating point registers. - - ;; Non-Descriptor single-floats. - (single-reg float-registers - :locations #.(loop for i from 4 to 30 collect i) - :constant-scs (fp-single-zero) - :save-p t - :alternate-scs (single-stack)) - - ;; Non-Descriptor double-floats. - (double-reg float-registers - :locations #.(loop for i from 4 to 30 collect i) - :constant-scs (fp-double-zero) - :save-p t - :alternate-scs (double-stack)) - - (complex-single-reg float-registers - :locations #.(loop for i from 4 to 28 by 2 collect i) - :element-size 2 - :constant-scs () - :save-p t - :alternate-scs (complex-single-stack)) - - (complex-double-reg float-registers - :locations #.(loop for i from 4 to 28 by 2 collect i) - :element-size 2 - :constant-scs () - :save-p t - :alternate-scs (complex-double-stack)) - - (catch-block control-stack :element-size catch-block-size) - (unwind-block control-stack :element-size unwind-block-size)) - -;;; Make some random tns for important registers. -(macrolet ((defregtn (name sc) - (let ((offset-sym (symbolicate name "-OFFSET")) - (tn-sym (symbolicate name "-TN"))) - `(defparameter ,tn-sym - (make-random-tn :kind :normal - :sc (sc-or-lose ',sc) - :offset ,offset-sym))))) - - ;; These, we access by foo-TN only - - (defregtn zero any-reg) - (defregtn null descriptor-reg) - (defregtn code descriptor-reg) - (defregtn alloc any-reg) - (defregtn bsp any-reg) - (defregtn csp any-reg) - (defregtn cfp any-reg) - (defregtn nsp any-reg) - - ;; These alias regular locations, so we have to make sure we don't bypass - ;; the register allocator when using them. - (defregtn nargs any-reg) - (defregtn ocfp any-reg) - (defregtn lip interior-reg)) - -;; and some floating point values.. -(defparameter fp-single-zero-tn - (make-random-tn :kind :normal - :sc (sc-or-lose 'single-reg) - :offset 31)) -(defparameter fp-double-zero-tn - (make-random-tn :kind :normal - :sc (sc-or-lose 'double-reg) - :offset 31)) - -;;; If value can be represented as an immediate constant, then return -;;; the appropriate SC number, otherwise return NIL. -(defun immediate-constant-sc (value) - (typecase value - ((integer 0 0) - zero-sc-number) - (null - null-sc-number) - ((or (integer #.most-negative-fixnum #.most-positive-fixnum) - character) - immediate-sc-number) - (symbol - (if (static-symbol-p value) - immediate-sc-number - nil)) - (single-float - (if (eql value $0f0) - fp-single-zero-sc-number - nil)) - (double-float - (if (eql value $0d0) - fp-double-zero-sc-number - nil)))) - -(defun boxed-immediate-sc-p (sc) - (or (eql sc zero-sc-number) - (eql sc null-sc-number) - (eql sc immediate-sc-number))) - - -;;;; function call parameters - -;;; the SC numbers for register and stack arguments/return values -(defconstant immediate-arg-scn any-reg-sc-number) -(defconstant control-stack-arg-scn control-stack-sc-number) - -(eval-when (:compile-toplevel :load-toplevel :execute) - -;;; offsets of special stack frame locations -(defconstant ocfp-save-offset 0) -(defconstant lra-save-offset 1) -(defconstant nfp-save-offset 2) - -;;; the number of arguments/return values passed in registers -(defconstant register-arg-count 6) - -;;; (Names to use for the argument registers would go here, but there -;;; are none.) - -); EVAL-WHEN - -;;; a list of TN's describing the register arguments -(defparameter *register-arg-tns* - (mapcar (lambda (n) - (make-random-tn :kind :normal - :sc (sc-or-lose 'descriptor-reg) - :offset n)) - *register-arg-offsets*)) - -;;; This is used by the debugger. -(defconstant single-value-return-byte-offset 4) - -;;; This function is called by debug output routines that want a -;;; pretty name for a TN's location. It returns a thing that can be -;;; printed with PRINC. -(defun location-print-name (tn) -; (declare (type tn tn)) - (let ((sb (sb-name (sc-sb (tn-sc tn)))) - (offset (tn-offset tn))) - (ecase sb - (registers (or (svref *register-names* offset) - (format nil "R~D" offset))) - (float-registers (format nil "F~D" offset)) - (control-stack (format nil "CS~D" offset)) - (non-descriptor-stack (format nil "NS~D" offset)) - (constant (format nil "Const~D" offset)) - (immediate-constant "Immed")))) - -(defun combination-implementation-style (node) - (declare (type sb-c::combination node) (ignore node)) - (values :default nil)) - -(defun primitive-type-indirect-cell-type (ptype) - (declare (ignore ptype)) - nil) diff --git a/src/runtime/Config.alpha-linux b/src/runtime/Config.alpha-linux deleted file mode 100644 index ba1e2900de..0000000000 --- a/src/runtime/Config.alpha-linux +++ /dev/null @@ -1,30 +0,0 @@ -# -*- makefile -*- for the C-level run-time support for SBCL - -# This software is part of the SBCL system. See the README file for -# more information. -# -# This software is derived from the CMU CL system, which was -# written at Carnegie Mellon University and released into the -# public domain. The software is in the public domain and is -# provided with absolutely no warranty. See the COPYING and CREDITS -# files for more information. - -#LD = ld -taso ;; $LD is no longer used anywhere, should that be moved below? -LINKFLAGS += -dynamic -v -Wl,-T -Wl,ld-script.alpha-linux -rdynamic -NM = ./linux-nm - -ASSEM_SRC = alpha-assem.S ldso-stubs.S -ARCH_SRC = alpha-arch.c - -OS_SRC = linux-os.c linux-mman.c alpha-linux-os.c -OS_LIBS = -ldl - -ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz -endif - -GC_SRC = cheneygc.c - -# Nothing to do for after-grovel-headers. -.PHONY: after-grovel-headers -after-grovel-headers: diff --git a/src/runtime/alpha-arch.c b/src/runtime/alpha-arch.c deleted file mode 100644 index a5979b8991..0000000000 --- a/src/runtime/alpha-arch.c +++ /dev/null @@ -1,369 +0,0 @@ -/* - * This software is part of the SBCL system. See the README file for - * more information. - * - * This software is derived from the CMU CL system, which was - * written at Carnegie Mellon University and released into the - * public domain. The software is in the public domain and is - * provided with absolutely no warranty. See the COPYING and CREDITS - * files for more information. - */ - -/* Note that although superficially it appears that we use - * os_context_t like we ought to, we actually just assume its a - * ucontext in places. Naughty */ - -#include -#include - -#include "sbcl.h" -#include "runtime.h" -#include "globals.h" -#include "validate.h" -#include "os.h" -#include "arch.h" -#include "lispregs.h" -#include "signal.h" -#include "alloc.h" -#include "interrupt.h" -#include "interr.h" -#include "breakpoint.h" - -extern char call_into_lisp_LRA[], call_into_lisp_end[]; - -#define BREAKPOINT_INST 0x80 - - -void -arch_init(void) -{ - /* This must be called _after_ os_init(), so that we know what the - * page size is. */ - - if (mmap((os_vm_address_t) call_into_lisp_LRA_page,os_vm_page_size, - OS_VM_PROT_ALL,MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED,-1,0) - == (os_vm_address_t) -1) - perror("mmap"); - - /* call_into_lisp_LRA is a collection of trampolines written in asm - - * see alpha-assem.S. We copy it to call_into_lisp_LRA_page where - * VOPs and things can find it. (I don't know why they can't find it - * where it was to start with.) */ - bcopy(call_into_lisp_LRA,(void *)call_into_lisp_LRA_page,os_vm_page_size); - - os_flush_icache((os_vm_address_t)call_into_lisp_LRA_page, - os_vm_page_size); - return; -} - -os_vm_address_t -arch_get_bad_addr (int sig, siginfo_t *code, os_context_t *context) -{ - unsigned int badinst; - - /* Instructions are 32 bit quantities. */ - unsigned int *pc ; - /* fprintf(stderr,"arch_get_bad_addr %d %p %p\n", - sig, code, context); */ - pc= (unsigned int *)(*os_context_pc_addr(context)); - - if (((unsigned long)pc) & 3) { - return NULL; /* In what case would pc be unaligned?? */ - } - - if ( (pc < READ_ONLY_SPACE_START || - pc >= READ_ONLY_SPACE_START+READ_ONLY_SPACE_SIZE) && - (pc < current_dynamic_space || - pc >= current_dynamic_space + dynamic_space_size)) - return NULL; - - return context->uc_mcontext.sc_traparg_a0; -} - -void -arch_skip_instruction(os_context_t *context) -{ - /* This may be complete rubbish, as (at least for traps) pc points - * _after_ the instruction that caused us to be here anyway. - */ - char **pcptr; - pcptr = (char **) os_context_pc_addr(context); - *pcptr += 4; -} - -unsigned char * -arch_internal_error_arguments(os_context_t *context) -{ - return (unsigned char *)(*os_context_pc_addr(context)+4); -} - -boolean -arch_pseudo_atomic_atomic(os_context_t *context) -{ - /* FIXME: this foreign_function_call_active test is dubious at - * best. If a foreign call is made in a pseudo atomic section - * (?) or more likely a pseudo atomic section is in a foreign - * call then an interrupt is executed immediately. Maybe it - * has to do with C code not maintaining pseudo atomic - * properly. MG - 2005-08-10 - * - * The foreign_function_call_active used to live at each call-site - * to arch_pseudo_atomic_atomic, but this seems clearer. - * --NS 2007-05-15 */ - return (!foreign_function_call_active) - && ((*os_context_register_addr(context,reg_ALLOC)) & 1); -} - -void arch_set_pseudo_atomic_interrupted(os_context_t *context) -{ - /* On coming out of an atomic section, we subtract 1 from - * reg_Alloc, then try to store something at that address. So, - * to signal that it was interrupted and a signal should be handled, - * we set bit 63 of reg_ALLOC here so that the end-of-atomic code - * will raise SIGSEGV (no ram mapped there). We catch the signal - * (see the appropriate *-os.c) and call interrupt_handle_pending() - * for the saved signal instead */ - - *os_context_register_addr(context,reg_ALLOC) |= (1L<<63); -} - -void arch_clear_pseudo_atomic_interrupted(os_context_t *context) -{ - *os_context_register_addr(context, reg_ALLOC) &= ~(1L<<63); -} - -unsigned int arch_install_breakpoint(void *pc) -{ - unsigned int *ptr = (unsigned int *)pc; - unsigned int result = *ptr; - *ptr = BREAKPOINT_INST; - - os_flush_icache((os_vm_address_t)ptr, sizeof(unsigned int)); - - return result; -} - -void arch_remove_breakpoint(void *pc, unsigned int orig_inst) -{ - unsigned int *ptr = (unsigned int *)pc; - *ptr = orig_inst; - os_flush_icache((os_vm_address_t)pc, sizeof(unsigned int)); -} - -static unsigned int *skipped_break_addr, displaced_after_inst, - after_breakpoint; - - -/* This returns a PC value. Lisp code is all in the 32-bit-addressable - * space, so we should be ok with an unsigned int. */ -unsigned int -emulate_branch(os_context_t *context, unsigned int orig_inst) -{ - int op = orig_inst >> 26; - int reg_a = (orig_inst >> 21) & 0x1f; - int reg_b = (orig_inst >> 16) & 0x1f; - int disp = - (orig_inst&(1<<20)) ? - orig_inst | (-1 << 21) : - orig_inst&0x1fffff; - int next_pc = *os_context_pc_addr(context); - int branch = 0; /* was NULL; */ - - switch(op) { - case 0x1a: /* jmp, jsr, jsr_coroutine, ret */ - *os_context_register_addr(context,reg_a) = - *os_context_pc_addr(context); - *os_context_pc_addr(context) = - *os_context_register_addr(context,reg_b)& ~3; - break; - case 0x30: /* br */ - *os_context_register_addr(context,reg_a)=*os_context_pc_addr(context); - branch = 1; - break; - case 0x31: /* fbeq */ - if (*(os_context_float_register_addr(context,reg_a))==0) branch = 1; - break; - case 0x32: /* fblt */ - if (*os_context_float_register_addr(context,reg_a)<0) branch = 1; - break; - case 0x33: /* fble */ - if (*os_context_float_register_addr(context,reg_a)<=0) branch = 1; - break; - case 0x34: /* bsr */ - *os_context_register_addr(context,reg_a)=*os_context_pc_addr(context); - branch = 1; - break; - case 0x35: /* fbne */ - if (*os_context_register_addr(context,reg_a)!=0) branch = 1; - break; - case 0x36: /* fbge */ - if (*os_context_float_register_addr(context,reg_a)>=0) branch = 1; - break; - case 0x37: /* fbgt */ - if (*os_context_float_register_addr(context,reg_a)>0) branch = 1; - break; - case 0x38: /* blbc */ - if ((*os_context_register_addr(context,reg_a)&1) == 0) branch = 1; - break; - case 0x39: /* beq */ - if (*os_context_register_addr(context,reg_a)==0) branch = 1; - break; - case 0x3a: /* blt */ - if (*os_context_register_addr(context,reg_a)<0) branch = 1; - break; - case 0x3b: /* ble */ - if (*os_context_register_addr(context,reg_a)<=0) branch = 1; - break; - case 0x3c: /* blbs */ - if ((*os_context_register_addr(context,reg_a)&1)!=0) branch = 1; - break; - case 0x3d: /* bne */ - if (*os_context_register_addr(context,reg_a)!=0) branch = 1; - break; - case 0x3e: /* bge */ - if (*os_context_register_addr(context,reg_a)>=0) branch = 1; - break; - case 0x3f: /* bgt */ - if (*os_context_register_addr(context,reg_a)>0) branch = 1; - break; - } - if (branch) - next_pc += disp*4; - return next_pc; -} - -static sigset_t orig_sigmask; - -/* Perform the instruction that we overwrote with a breakpoint. As we - * don't have a single-step facility, this means we have to: - * - put the instruction back - * - put a second breakpoint at the following instruction, - * set after_breakpoint and continue execution. - * - * When the second breakpoint is hit (very shortly thereafter, we hope) - * sigtrap_handler gets called again, but follows the AfterBreakpoint - * arm, which - * - puts a bpt back in the first breakpoint place (running across a - * breakpoint shouldn't cause it to be uninstalled) - * - replaces the second bpt with the instruction it was meant to be - * - carries on - * - * Clear? - */ - -void arch_do_displaced_inst(os_context_t *context,unsigned int orig_inst) -{ - /* Apparent off-by-one errors ahoy. If you consult the Alpha ARM, - * it will tell you that after a BPT, the saved PC is the address - * of the instruction _after_ the instruction that caused the trap. - * - * However, we decremented PC by 4 before calling the Lisp-level - * handler that calls this routine (see alpha-arch.c line 322 and - * friends) so when we get to this point PC is actually pointing - * at the BPT instruction itself. This is good, because this is - * where we want to restart execution when we do that */ - - unsigned int *pc=(unsigned int *)(*os_context_pc_addr(context)); - unsigned int *next_pc; - int op = orig_inst >> 26;; - - orig_sigmask = *os_context_sigmask_addr(context); - sigaddset_blockable(os_context_sigmask_addr(context)); - - /* Put the original instruction back. */ - *pc = orig_inst; - os_flush_icache((os_vm_address_t)pc, sizeof(unsigned int)); - skipped_break_addr = pc; - - /* Figure out where we will end up after running the displaced - * instruction */ - if (op == 0x1a || (op&0xf) == 0x30) /* a branch */ - /* The cast to long is just to shut gcc up. */ - next_pc = (unsigned int *)((long)emulate_branch(context,orig_inst)); - else - next_pc = pc+1; - - /* Set the after breakpoint. */ - displaced_after_inst = *next_pc; - *next_pc = BREAKPOINT_INST; - after_breakpoint=1; - os_flush_icache((os_vm_address_t)next_pc, sizeof(unsigned int)); -} - -void -arch_handle_breakpoint(os_context_t *context) -{ - *os_context_pc_addr(context) -=4; - handle_breakpoint(context); -} - -void -arch_handle_fun_end_breakpoint(os_context_t *context) -{ - *os_context_pc_addr(context) -=4; - *os_context_pc_addr(context) = - (int)handle_fun_end_breakpoint(context); -} - -void -arch_handle_single_step_trap(os_context_t *context, int trap) -{ - unsigned int code = *((u32 *) (*os_context_pc_addr(context))); - int register_offset = code >> 8 & 0x1f; - handle_single_step_trap(context, trap, register_offset); - arch_skip_instruction(context); -} - -static void -sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context) -{ - unsigned int code; - - /* this is different from how CMUCL does it. CMUCL used "call_pal - * PAL_gentrap", which doesn't do anything on Linux (unless NL0 - * contains certain specific values). We use "bugchk" instead. - * It's (for our purposes) just the same as bpt but has a - * different opcode so we can test whether we're dealing with a - * breakpoint or a "system service" */ - - if ((*(unsigned int*)(*os_context_pc_addr(context)-4))==BREAKPOINT_INST) { - if (after_breakpoint) { - /* see comments above arch_do_displaced_inst. This is where - * we reinsert the breakpoint that we removed earlier */ - - *os_context_pc_addr(context) -=4; - *skipped_break_addr = BREAKPOINT_INST; - os_flush_icache((os_vm_address_t)skipped_break_addr, - sizeof(unsigned int)); - skipped_break_addr = NULL; - *(unsigned int *)*os_context_pc_addr(context) = - displaced_after_inst; - os_flush_icache((os_vm_address_t)*os_context_pc_addr(context), sizeof(unsigned int)); - *os_context_sigmask_addr(context)= orig_sigmask; - after_breakpoint=0; /* false */ - return; - } else - code = trap_Breakpoint; - } else - /* a "system service" */ - code=*((u32 *)(*os_context_pc_addr(context))); - handle_trap(context, code); -} - -unsigned long -arch_get_fp_control() -{ - return ieee_get_fp_control(); -} - -void -arch_set_fp_control(unsigned long fp) -{ - ieee_set_fp_control(fp); -} - - -void arch_install_interrupt_handlers() -{ - ll_install_handler(SIGTRAP, sigtrap_handler); -} diff --git a/src/runtime/alpha-arch.h b/src/runtime/alpha-arch.h deleted file mode 100644 index dc7d726e57..0000000000 --- a/src/runtime/alpha-arch.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ALPHA_ARCH_H -#define _ALPHA_ARCH_H - -#define ALIEN_STACK_GROWS_DOWNWARD - -#endif /* _ALPHA_ARCH_H */ diff --git a/src/runtime/alpha-assem.S b/src/runtime/alpha-assem.S deleted file mode 100644 index 79a82ad7ab..0000000000 --- a/src/runtime/alpha-assem.S +++ /dev/null @@ -1,300 +0,0 @@ -/* - * This software is part of the SBCL system. See the README file for - * more information. - * - * This software is derived from the CMU CL system, which was - * written at Carnegie Mellon University and released into the - * public domain. The software is in the public domain and is - * provided with absolutely no warranty. See the COPYING and CREDITS - * files for more information. - */ - -#ifdef __ELF__ -// Mark the object as not requiring an executable stack. -.section .note.GNU-stack,"",%progbits -#endif - -#include "validate.h" -#include -#ifdef linux -#include -#else -#include -#endif -#include "sbcl.h" -#include "lispregs.h" -#include "genesis/fdefn.h" -#include "genesis/closure.h" -#include "genesis/code.h" -#include "genesis/funcallable-instance.h" -#include "genesis/simple-fun.h" -#include "genesis/static-symbols.h" - -/* #include "globals.h" */ - -/* - * Function to transfer control into lisp. - */ - .text - .align 4 - .globl call_into_lisp - .ent call_into_lisp -call_into_lisp: -#define framesize 8*8 - ldgp gp, 0($27) - /* Save all the C regs. */ - lda sp,-framesize(sp) - stq ra, framesize-8*8(sp) - stq s0, framesize-8*7(sp) - stq s1, framesize-8*6(sp) - stq s2, framesize-8*5(sp) - stq s3, framesize-8*4(sp) - stq s4, framesize-8*3(sp) - stq s5, framesize-8*2(sp) - stq s6, framesize-8*1(sp) - .mask 0x0fc001fe, -framesize - .frame sp,framesize,ra - - /* Clear descriptor regs */ - ldil reg_CODE,0 - ldil reg_FDEFN,0 - mov a0,reg_LEXENV - sll a2,2,reg_NARGS - ldil reg_OCFP,0 - ldil reg_LRA,0 - ldil reg_L0,0 - ldil reg_L1,0 - - - /* Establish NIL. */ - ldil reg_NULL,NIL - - /* The CMUCL comment here is "Start pseudo-atomic.", but */ - /* there's no obvious code that would have that effect */ - - /* No longer in foreign call. */ - stl zero,foreign_function_call_active - - /* Load lisp state. */ - ldq reg_ALLOC,dynamic_space_free_pointer - ldq reg_BSP,current_binding_stack_pointer - ldq reg_CSP,current_control_stack_pointer - ldq reg_OCFP,current_control_frame_pointer - mov a1,reg_CFP - - .set noat - ldil reg_L2,0 - .set at - - /* End of pseudo-atomic. */ - - /* Establish lisp arguments. */ - ldl reg_A0,0(reg_CFP) - ldl reg_A1,4(reg_CFP) - ldl reg_A2,8(reg_CFP) - ldl reg_A3,12(reg_CFP) - ldl reg_A4,16(reg_CFP) - ldl reg_A5,20(reg_CFP) - - /* This call will 'return' into the LRA page below */ - lda reg_LRA,call_into_lisp_LRA_page+OTHER_POINTER_LOWTAG - - /* Indirect the closure */ - ldl reg_CODE, CLOSURE_FUN_OFFSET(reg_LEXENV) - addl reg_CODE, SIMPLE_FUN_INSTS_OFFSET, reg_LIP - - /* And into lisp we go. */ - jsr reg_ZERO,(reg_LIP) - - - /* a page of the following code (from call_into_lisp_LRA - onwards) is copied into the LRA page at arch_init() time. */ - - .set noreorder - .align 3 - .globl call_into_lisp_LRA -call_into_lisp_LRA: - - .long RETURN_PC_WIDETAG - - /* execution resumes here*/ - mov reg_OCFP,reg_CSP - nop - - /* return value already there */ - mov reg_A0,v0 - - /* Turn on pseudo-atomic. */ - - /* Save LISP registers */ - stq reg_ALLOC, dynamic_space_free_pointer - stq reg_BSP,current_binding_stack_pointer - stq reg_CSP,current_control_stack_pointer - stq reg_CFP,current_control_frame_pointer - - /* Back in C land. [CSP is just a handy non-zero value.] */ - stl reg_CSP,foreign_function_call_active - - /* Turn off pseudo-atomic and check for traps. */ - - /* Restore C regs */ - ldq ra, framesize-8*8(sp) - ldq s0, framesize-8*7(sp) - ldq s1, framesize-8*6(sp) - ldq s2, framesize-8*5(sp) - ldq s3, framesize-8*4(sp) - ldq s4, framesize-8*3(sp) - ldq s5, framesize-8*2(sp) - ldq s6, framesize-8*1(sp) - - /* Restore the C stack! */ - lda sp, framesize(sp) - - ret zero,(ra),1 - .globl call_into_lisp_end -call_into_lisp_end: - .end call_into_lisp - -/* - * Transfering control from Lisp into C. reg_CFUNC (t10, 24) contains - * the address of the C function to call - */ - .set noreorder - .text - .align 4 - .globl call_into_c - .ent call_into_c -call_into_c: - .mask 0x0fc001fe, -12 - .frame sp,12,ra - mov reg_CFP, reg_OCFP - mov reg_CSP, reg_CFP - addq reg_CFP, 32, reg_CSP - stl reg_OCFP, 0(reg_CFP) - subl reg_LIP, reg_CODE, reg_L1 - addl reg_L1, OTHER_POINTER_LOWTAG, reg_L1 - stl reg_L1, 4(reg_CFP) - stl reg_CODE, 8(reg_CFP) - stl reg_NULL, 12(reg_CFP) - - /* Set the pseudo-atomic flag. */ - addq reg_ALLOC,1,reg_ALLOC - - /* Get the top two register args and fix the NSP to point to arg 7 */ - ldq reg_NL4,0(reg_NSP) - ldq reg_NL5,8(reg_NSP) - addq reg_NSP,16,reg_NSP - - /* Save lisp state. */ - subq reg_ALLOC,1,reg_L1 - stq reg_L1, dynamic_space_free_pointer - - stq reg_BSP, current_binding_stack_pointer - stq reg_CSP, current_control_stack_pointer - stq reg_CFP, current_control_frame_pointer - - /* Mark us as in C land. */ - stl reg_CSP, foreign_function_call_active - - /* Were we interrupted? */ - subq reg_ALLOC,1,reg_ALLOC - stl reg_ZERO,0(reg_ALLOC) - - /* Into C land we go. */ - - mov reg_CFUNC, reg_L1 /* L1=pv: this is a hint to the cache */ - - jsr ra, (reg_CFUNC) - ldgp $29,0(ra) - - /* restore NSP */ - subq reg_NSP,16,reg_NSP - - /* Clear unsaved descriptor regs */ - mov reg_ZERO, reg_NARGS - mov reg_ZERO, reg_A0 - mov reg_ZERO, reg_A1 - mov reg_ZERO, reg_A2 - mov reg_ZERO, reg_A3 - mov reg_ZERO, reg_A4 - mov reg_ZERO, reg_A5 - mov reg_ZERO, reg_L0 - .set noat - mov reg_ZERO, reg_L2 - .set at - - /* Turn on pseudo-atomic. */ - lda reg_ALLOC,1(reg_ZERO) - - /* Mark us at in Lisp land. */ - stl reg_ZERO, foreign_function_call_active - - /* Restore ALLOC, preserving pseudo-atomic-atomic */ - ldq reg_NL0,dynamic_space_free_pointer - addq reg_ALLOC,reg_NL0,reg_ALLOC - - /* Check for interrupt */ - subq reg_ALLOC,1,reg_ALLOC - stl reg_ZERO,0(reg_ALLOC) - - ldl reg_NULL, 12(reg_CFP) - - /* Restore LRA & CODE (they may have been GC'ed) */ - /* can you see anything here which touches LRA? I can't ...*/ - ldl reg_CODE, 8(reg_CFP) - ldl reg_NL0, 4(reg_CFP) - subq reg_NL0, OTHER_POINTER_LOWTAG, reg_NL0 - addq reg_CODE, reg_NL0, reg_NL0 - - mov reg_CFP, reg_CSP - mov reg_OCFP, reg_CFP - - ret zero, (reg_NL0), 1 - - .end call_into_c - - .text - .globl start_of_tramps -start_of_tramps: - - .text - .globl end_of_tramps -end_of_tramps: - - -/* - * fun-end breakpoint magic. - */ - -/* - * For an explanation of the magic involved in function-end - * breakpoints, see the implementation in ppc-assem.S. - */ - - .text - .align 2 - .set noreorder - .globl fun_end_breakpoint_guts -fun_end_breakpoint_guts: - .long (((CODE_SIZE+1)&~1)< -#include -#include -#include "sbcl.h" -#include "./signal.h" -#include "os.h" -#include "arch.h" -#include "globals.h" -#include "interrupt.h" -#include "interr.h" -#include "lispregs.h" -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "validate.h" - -#ifdef LISP_FEATURE_SB_THREAD -#error "Define threading support functions" -#else -int arch_os_thread_init(struct thread *thread) { - return 1; /* success */ -} -int arch_os_thread_cleanup(struct thread *thread) { - return 1; /* success */ -} -#endif - - -os_context_register_t * -os_context_register_addr(os_context_t *context, int offset) -{ - return &context->uc_mcontext.sc_regs[offset]; -} - -os_context_register_t * -os_context_float_register_addr(os_context_t *context, int offset) -{ - return &context->uc_mcontext.sc_fpregs[offset]; -} - -os_context_register_t * -os_context_pc_addr(os_context_t *context) -{ - return &((context->uc_mcontext).sc_pc); -} - -sigset_t * -os_context_sigmask_addr(os_context_t *context) -{ - return &context->uc_sigmask; -} - -unsigned long -os_context_fp_control(os_context_t *context) -{ - return ieee_fpcr_to_swcr((context->uc_mcontext).sc_fpcr); -} - -void -os_restore_fp_control(os_context_t *context) -{ - /* FIXME: 0x7E0000 is defined as something useful in constants.h, - but without the UL, which would probably lead to 32/64-bit - errors if we simply used it here. Ugh. CSR, 2003-09-15 */ - arch_set_fp_control(os_context_fp_control(context) & ~(0x7e0000UL) & - /* KLUDGE: for some reason that I don't - understand, by the time we get here the - "enable denormalized traps" bit in the fp - control word is set. Since we really don't - want to tra every time someone types - LEAST-POSITIVE-SINGLE-FLOAT into the repl, - mask that bit out. -- CSR, 2003-09-15 */ - ~(0x1UL<<6)); -} - -void os_flush_icache(os_vm_address_t address, os_vm_size_t length) -{ - asm volatile ("imb" : : : "memory" ); -} diff --git a/src/runtime/alpha-linux-os.h b/src/runtime/alpha-linux-os.h deleted file mode 100644 index 0045a78095..0000000000 --- a/src/runtime/alpha-linux-os.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _ALPHA_LINUX_OS_H -#define _ALPHA_LINUX_OS_H - -typedef ucontext_t os_context_t; -typedef long os_context_register_t; - -#include "arch-os-generic.inc" - -unsigned long os_context_fp_control(os_context_t *context); - -#endif /* _ALPHA_LINUX_OS_H */ diff --git a/src/runtime/alpha-lispregs.h b/src/runtime/alpha-lispregs.h deleted file mode 100644 index 24df43c54d..0000000000 --- a/src/runtime/alpha-lispregs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This software is part of the SBCL system. See the README file for - * more information. - * - * This software is derived from the CMU CL system, which was - * written at Carnegie Mellon University and released into the - * public domain. The software is in the public domain and is - * provided with absolutely no warranty. See the COPYING and CREDITS - * files for more information. - */ - -#define NREGS (32) - -#ifdef __ASSEMBLER__ -#ifdef linux -#define REG(num) $##num -#else -#define REG(num) $/**/num -#endif /* linux */ -#else -#define REG(num) num -#endif - /* "traditional" register name and use */ - /* courtesy of */ -#define reg_LIP REG(0) /* v0 */ -#define reg_A0 REG(1) /* t0 - temporary (caller-saved) */ -#define reg_A1 REG(2) /* t1 */ -#define reg_A2 REG(3) /* t2 */ -#define reg_A3 REG(4) /* t3 */ -#define reg_A4 REG(5) /* t4 */ -#define reg_A5 REG(6) /* t5 */ -#define reg_L0 REG(7) /* t6 */ -#define reg_NARGS REG(8) /* t7 */ -#define reg_CSP REG(9) /* s0 - saved (callee-saved) */ -#define reg_CFP REG(10) /* s1 */ -#define reg_OCFP REG(11) /* s2 */ -#define reg_BSP REG(12) /* s3 */ -#define reg_LEXENV REG(13) /* s4 */ -#define reg_CODE REG(14) /* s5 */ -#define reg_NULL REG(15) /* s6 = fp (frame pointer) */ -#define reg_NL0 REG(16) /* a0 - argument (caller-saved) */ -#define reg_NL1 REG(17) /* a1 */ -#define reg_NL2 REG(18) /* a2 */ -#define reg_NL3 REG(19) /* a3 */ -#define reg_NL4 REG(20) /* a4 */ -#define reg_NL5 REG(21) /* a5 */ -#define reg_ALLOC REG(22) /* t8 - more temps (caller-saved) */ -#define reg_FDEFN REG(23) /* t9 */ -#define reg_CFUNC REG(24) /* t10 */ -#define reg_NFP REG(25) /* t11 */ -#define reg_LRA REG(26) /* ra - return address */ -#define reg_L1 REG(27) /* t12, or pv - procedure variable */ -#define reg_L2 REG(28) /* at - assembler temporary */ -#define reg_GP REG(29) /* global pointer */ -#define reg_NSP REG(30) /* sp - stack pointer */ -#define reg_ZERO REG(31) /* reads as zero, writes are noops */ - -#define call_into_lisp_LRA_page 0x10000 diff --git a/src/runtime/ld-script.alpha-linux b/src/runtime/ld-script.alpha-linux deleted file mode 100644 index 21551ca017..0000000000 --- a/src/runtime/ld-script.alpha-linux +++ /dev/null @@ -1,163 +0,0 @@ -/* This script allegedly has the same effect as -taso would do on Digital - * Unix - that is, it forces stuff into the low 2Gb where 32-bit pointers - * can find it */ - -/* - * This software is part of the SBCL system. See the README file for - * more information. - * - * This software is derived from the CMU CL system, which was - * written at Carnegie Mellon University and released into the - * public domain. The software is in the public domain and is - * provided with absolutely no warranty. See the COPYING and CREDITS - * files for more information. - */ - -OUTPUT_FORMAT("elf64-alpha", "elf64-alpha", - "elf64-alpha") -OUTPUT_ARCH(alpha) -ENTRY(__start) -SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/alpha-linux/lib); -/* Do we need any of these for elf? - __DYNAMIC = 0; */ -SECTIONS -{ - /* Read-only sections, merged into text segment: */ - . = 0x08048000 + SIZEOF_HEADERS; - .interp : { *(.interp) } - .hash : { *(.hash) } - .dynsym : { *(.dynsym) } - .dynstr : { *(.dynstr) } - .gnu.version : { *(.gnu.version) } - .gnu.version_d : { *(.gnu.version_d) } - .gnu.version_r : { *(.gnu.version_r) } - .rel.text : - { *(.rel.text) *(.rel.gnu.linkonce.t*) } - .rela.text : - { *(.rela.text) *(.rela.gnu.linkonce.t*) } - .rel.data : - { *(.rel.data) *(.rel.gnu.linkonce.d*) } - .rela.data : - { *(.rela.data) *(.rela.gnu.linkonce.d*) } - .rel.rodata : - { *(.rel.rodata) *(.rel.gnu.linkonce.r*) } - .rela.rodata : - { *(.rela.rodata) *(.rela.gnu.linkonce.r*) } - .rel.got : { *(.rel.got) } - .rela.got : { *(.rela.got) } - .rel.ctors : { *(.rel.ctors) } - .rela.ctors : { *(.rela.ctors) } - .rel.dtors : { *(.rel.dtors) } - .rela.dtors : { *(.rela.dtors) } - .rel.init : { *(.rel.init) } - .rela.init : { *(.rela.init) } - .rel.fini : { *(.rel.fini) } - .rela.fini : { *(.rela.fini) } - .rel.bss : { *(.rel.bss) } - .rela.bss : { *(.rela.bss) } - .rel.plt : { *(.rel.plt) } - .rela.plt : { *(.rela.plt) } - .init : { *(.init) } =0x47ff041f - .text : - { - *(.text) - *(.stub) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.gnu.linkonce.t*) - } =0x47ff041f - _etext = .; - PROVIDE (etext = .); - .fini : { *(.fini) } =0x47ff041f - .preinit_array : { - __preinit_array_start = .; - *(.preinit_array) - __preinit_array_end = .; - } - .init_array : { - __init_array_start = .; - *(.init_array) - __init_array_end = .; - } - .fini_array : { - __fini_array_start = .; - *(.fini_array) - __fini_array_end = .; - } - .rodata : { *(.rodata) *(.gnu.linkonce.r*) } - .rodata1 : { *(.rodata1) } - .reginfo : { *(.reginfo) } - /* Adjust the address for the data segment. We want to adjust up to - the same address within the page on the next page up. */ - . = ALIGN(0x100000) + (. & (0x100000 - 1)); - .data : - { - *(.data) - *(.gnu.linkonce.d*) - CONSTRUCTORS - } - .data1 : { *(.data1) } - .ctors : - { - *(.ctors) - } - .dtors : - { - *(.dtors) - } - .plt : { *(.plt) } - .got : { *(.got.plt) *(.got) } - .dynamic : { *(.dynamic) } - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - .sdata : { *(.sdata) } - _edata = .; - PROVIDE (edata = .); - __bss_start = .; - .sbss : { *(.sbss) *(.scommon) } - .bss : - { - *(.dynbss) - *(.bss) - *(COMMON) - } - . = ALIGN(64 / 8); - _end = . ; - PROVIDE (end = .); - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - /* These must appear regardless of . */ -} - From 0c0c0afece5ff849c4be4ae7d44cf24b0d78cb51 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 31 Aug 2020 16:36:48 -0400 Subject: [PATCH 0456/4023] Remove LOW_WORD macro --- src/runtime/gc-common.c | 21 +++++++++------------ src/runtime/gc-private.h | 2 +- src/runtime/purify.c | 2 +- src/runtime/runtime.h | 4 +--- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index ce09549597..fa8b3ab6d5 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -129,7 +129,7 @@ static inline void scav1(lispobj* object_ptr, lispobj object) #define FIX_POINTER() { \ lispobj *ptr = native_pointer(object); \ if (forwarding_pointer_p(ptr)) \ - *object_ptr = LOW_WORD(forwarding_pointer_value(ptr)); \ + *object_ptr = forwarding_pointer_value(ptr); \ else /* Scavenge that pointer. */ \ scav_ptr[PTR_SCAVTAB_INDEX(object)](object_ptr, object); \ } @@ -300,7 +300,7 @@ trans_code(struct code *code) gc_dcheck(widetag_of(&code->header) == CODE_HEADER_WIDETAG); /* prepare to transport the code vector */ - lispobj l_code = (lispobj) LOW_WORD(code) | OTHER_POINTER_LOWTAG; + lispobj l_code = make_lispobj(code, OTHER_POINTER_LOWTAG); lispobj l_new_code = copy_large_object(l_code, code_total_nwords(code), CODE_PAGE_TYPE); @@ -351,7 +351,7 @@ static lispobj trans_code_header(lispobj object) { struct code *ncode = trans_code((struct code *) native_pointer(object)); - return (lispobj) LOW_WORD(ncode) | OTHER_POINTER_LOWTAG; + return make_lispobj(ncode, OTHER_POINTER_LOWTAG); } static sword_t @@ -376,10 +376,9 @@ trans_return_pc_header(lispobj object) uword_t offset = HeaderValue(return_pc->header) * N_WORD_BYTES; /* Transport the whole code object */ - struct code *code = (struct code *) ((uword_t) return_pc - offset); - struct code *ncode = trans_code(code); + struct code *code = trans_code((struct code *) ((uword_t) return_pc - offset)); - return ((lispobj) LOW_WORD(ncode) + offset) | OTHER_POINTER_LOWTAG; + return make_lispobj((char*)code + offset, OTHER_POINTER_LOWTAG); } #endif /* RETURN_PC_WIDETAG */ @@ -422,10 +421,9 @@ trans_fun_header(lispobj object) (HeaderValue(fheader->header) & FUN_HEADER_NWORDS_MASK) * N_WORD_BYTES; /* Transport the whole code object */ - struct code *code = (struct code *) ((uword_t) fheader - offset); - struct code *ncode = trans_code(code); + struct code *code = trans_code((struct code *) ((uword_t) fheader - offset)); - return ((lispobj) LOW_WORD(ncode) + offset) | FUN_POINTER_LOWTAG; + return make_lispobj((char*)code + offset, FUN_POINTER_LOWTAG); } @@ -983,8 +981,7 @@ trans_weak_pointer(lispobj object) #define TEST_WEAK_CELL(cell, pointee, broken) \ lispobj *native = native_pointer(pointee); \ if (from_space_p(pointee)) \ - cell = forwarding_pointer_p(native) ? \ - LOW_WORD(forwarding_pointer_value(native)) : broken; \ + cell = forwarding_pointer_p(native) ? forwarding_pointer_value(native) : broken; \ else if (immobile_space_p(pointee)) { \ if (immobile_obj_gen_bits(base_pointer(pointee)) == from_space) cell = broken; \ } @@ -2043,7 +2040,7 @@ scavenge_control_stack(struct thread *th) lispobj *ptr = native_pointer(object); if (forwarding_pointer_p(ptr)) { /* Yes, there's a forwarding pointer. */ - *object_ptr = LOW_WORD(forwarding_pointer_value(ptr)); + *object_ptr = forwarding_pointer_value(ptr); } else { /* Scavenge that pointer. */ long n_words_scavenged = diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index e05fee5ca4..6b2ee9dcb5 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -234,7 +234,7 @@ static inline void add_to_weak_pointer_chain(struct weak_pointer *wp) { * In cheneygc, chaining is performed in 'trans_weak_pointer' * which works just as well, since an object is transported * at most once per GC cycle */ - wp->next = (struct weak_pointer *)LOW_WORD(weak_pointer_chain); + wp->next = weak_pointer_chain; weak_pointer_chain = wp; } diff --git a/src/runtime/purify.c b/src/runtime/purify.c index fd3a0ba09f..0856751520 100644 --- a/src/runtime/purify.c +++ b/src/runtime/purify.c @@ -259,7 +259,7 @@ ptrans_code(lispobj thing) #endif /* Put in forwarding pointers for all the functions. */ for_each_simple_fun(i, newfunc, new, 1, { - lispobj* old = (lispobj*)LOW_WORD((char*)newfunc - displacement); + lispobj* old = (lispobj*)((char*)newfunc - displacement); *old = make_lispobj(newfunc, FUN_POINTER_LOWTAG); pscav(&newfunc->self, 1, 1); // and fix the self-pointer now }); diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 034b8ad381..281d826f91 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -215,8 +215,6 @@ typedef pid_t os_thread_t; typedef uintptr_t uword_t; typedef intptr_t sword_t; -/* FIXME: remove LOW_WORD macro */ -#define LOW_WORD(c) ((uintptr_t)c) #define OBJ_FMTX PRIxPTR typedef uintptr_t lispobj; @@ -347,7 +345,7 @@ native_pointer(lispobj obj) static inline lispobj make_lispobj(void *o, int low_tag) { - return LOW_WORD(o) | low_tag; + return (lispobj)o | low_tag; } #define MAKE_FIXNUM(n) (n << N_FIXNUM_TAG_BITS) From 534efc75427897fce4d2138e2f1b6e33755499e8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 31 Aug 2020 19:30:56 -0400 Subject: [PATCH 0457/4023] Remove HPPA, part 1 of 2 Edit out conditionalized bits from machine-independent files. --- base-target-features.lisp-expr | 2 -- build-order.lisp-expr | 1 - crossbuild-runner/build-all.sh | 7 ++----- make-config.sh | 9 +-------- make-host-1.lisp | 7 ------- src/assembly/assemfile.lisp | 10 ++-------- src/code/float-inf-nan.lisp | 15 +++++++-------- src/code/float-trap.lisp | 3 +-- src/code/foreign.lisp | 2 +- src/code/simple-fun.lisp | 2 +- src/cold/shared.lisp | 2 +- src/cold/shebang.lisp | 2 +- src/compiler/generic/vm-fndb.lisp | 2 +- src/compiler/generic/vm-macs.lisp | 4 ++-- src/compiler/ir2tran.lisp | 2 +- src/compiler/srctran.lisp | 2 +- src/compiler/target-disassem.lisp | 2 +- src/runtime/breakpoint.c | 4 ---- src/runtime/interrupt.c | 6 ------ src/runtime/wrap.h | 2 +- tests/backtrace.impure.lisp | 2 +- tests/compiler-2.pure.lisp | 1 - tests/compiler.pure.lisp | 2 +- tests/debug.impure.lisp | 4 ++-- tests/dynamic-extent.impure.lisp | 6 +++--- tests/foreign-stack-alignment.impure.lisp | 1 - 26 files changed, 31 insertions(+), 71 deletions(-) diff --git a/base-target-features.lisp-expr b/base-target-features.lisp-expr index a5a9ea1adf..d132c634c5 100644 --- a/base-target-features.lisp-expr +++ b/base-target-features.lisp-expr @@ -358,8 +358,6 @@ ;; any PowerPC CPU ;; :ppc64 ;; 64-bit PowerPC CPU, ISA 2.06 (POWER7) or later - ;; :hppa - ;; any PA-RISC CPU ;; :mips ;; any MIPS CPU (in little-endian mode with :little-endian) ;; :arm diff --git a/build-order.lisp-expr b/build-order.lisp-expr index f4b052414d..a47cfb5708 100644 --- a/build-order.lisp-expr +++ b/build-order.lisp-expr @@ -312,7 +312,6 @@ ;; KLUDGE: I'd prefer to have this done with a "code/target" softlink ;; instead of a bunch of reader macros. -- WHN 19990308 #+sparc ("src/code/sparc-vm") - #+hppa ("src/code/hppa-vm") #+x86 ("src/code/x86-vm" :not-host) #+x86-64("src/code/x86-64-vm" :not-host) #+(or ppc ppc64) diff --git a/crossbuild-runner/build-all.sh b/crossbuild-runner/build-all.sh index be0e70617d..f9b120981b 100755 --- a/crossbuild-runner/build-all.sh +++ b/crossbuild-runner/build-all.sh @@ -9,7 +9,7 @@ set -e # or a host machine on which to run its native compiler. if [ -z "$*" ]; then - targets="arm arm64 hppa mips ppc ppc64 riscv sparc x86 x86-64" + targets="arm arm64 mips ppc ppc64 riscv sparc x86 x86-64" else targets="$@" fi @@ -30,10 +30,7 @@ do fi cat crossbuild-runner/backends/$arch/features >> $ltf cat crossbuild-runner/backends/$arch/local-target-features >> $ltf - case "$arch" in - hppa) ;; - *) echo ':linkage-table' >> $ltf - esac + echo ':linkage-table' >> $ltf echo ')))' >> $ltf cp -fv crossbuild-runner/backends/$arch/stuff-groveled-from-headers.lisp \ diff --git a/make-config.sh b/make-config.sh index 5132bbcb37..3f42b3a3b0 100755 --- a/make-config.sh +++ b/make-config.sh @@ -367,8 +367,6 @@ case `uname -m` in ppc64le) guessed_sbcl_arch=ppc64 ;; # is ok because there was never 32-bit LE Power*Macintosh) guessed_sbcl_arch=ppc ;; ibmnws) guessed_sbcl_arch=ppc ;; - parisc*) guessed_sbcl_arch=hppa ;; - 9000/800) guessed_sbcl_arch=hppa ;; mips*) guessed_sbcl_arch=mips ;; arm64) guessed_sbcl_arch=arm64 ;; *arm*) guessed_sbcl_arch=arm ;; @@ -699,12 +697,7 @@ case "$sbcl_arch" in ;; esac -# There is only one architecture that doesn't have :linkage-table -# and also doesn't run for half a dozen other reasons. -case "$sbcl_arch" in - hppa) ;; - *) printf ' :linkage-table' >> $ltf -esac +printf ' :linkage-table' >> $ltf # Use a little C program to try to guess the endianness. Ware # cross-compilers! diff --git a/make-host-1.lisp b/make-host-1.lisp index 290b590111..7a36457426 100644 --- a/make-host-1.lisp +++ b/make-host-1.lisp @@ -10,13 +10,6 @@ (format t "~&target ~S = ~S~%" sym val)))))) (in-package "SB-COLD") (progn - ;; Generating ldso-stubs should be driven by GNUmakefile, but that won't work - ;; because we generate it using Lisp code, and we don't presume the target - ;; to have a lisp implementation. So we generate it on the host by knowing - ;; something about which Config files depend on ldso-stubs. - (when (member :hppa sb-xc:*features*) - (let ((*readtable* *xc-readtable*)) (load "tools-for-build/ldso-stubs.lisp"))) - (setf *host-obj-prefix* "obj/from-host/") (load "src/cold/set-up-cold-packages.lisp") (load "src/cold/defun-load-or-cload-xcompiler.lisp") diff --git a/src/assembly/assemfile.lisp b/src/assembly/assemfile.lisp index 322bf10b82..1c62c0d838 100644 --- a/src/assembly/assemfile.lisp +++ b/src/assembly/assemfile.lisp @@ -226,15 +226,9 @@ :key #'car) (:generator ,cost ,@(mapcar (lambda (arg) - #+(or hppa) `(move ,(reg-spec-name arg) - ,(reg-spec-temp arg)) - #-(or hppa) `(move ,(reg-spec-temp arg) - ,(reg-spec-name arg))) + `(move ,(reg-spec-temp arg) ,(reg-spec-name arg))) args) ,@call-sequence ,@(mapcar (lambda (res) - #+(or hppa) `(move ,(reg-spec-temp res) - ,(reg-spec-name res)) - #-(or hppa) `(move ,(reg-spec-name res) - ,(reg-spec-temp res))) + `(move ,(reg-spec-name res) ,(reg-spec-temp res))) results)))))) diff --git a/src/code/float-inf-nan.lisp b/src/code/float-inf-nan.lisp index ba68b5248a..a0287a2582 100644 --- a/src/code/float-inf-nan.lisp +++ b/src/code/float-inf-nan.lisp @@ -97,21 +97,20 @@ (define-float-inf-or-nan-test float-trapping-nan-p "Return true if the float X is a trapping NaN (Not a Number)." - ;; HPPA (and apparently MIPS) have trapping NaNs (SNaNs) with the - ;; trapping-nan-bit SET. PPC, SPARC, and x86 (and presumably - ;; x86-64, ARM, and ARM64) have trapping NaNs (SNaNs) with the + ;; MIPS has trapping NaNs (SNaNs) with the trapping-nan-bit SET. + ;; All the others have trapping NaNs (SNaNs) with the ;; trapping-nan-bit CLEAR. Note that the given implementation ;; considers infinities to be FLOAT-TRAPPING-NAN-P on most ;; architectures. ;; SINGLE-FLOAT - #+(or mips hppa) (logbitp 22 bits) - #-(or mips hppa) (not (logbitp 22 bits)) + #+mips (logbitp 22 bits) + #-mips (not (logbitp 22 bits)) ;; DOUBLE-FLOAT - #+(or mips hppa) (logbitp 19 hi) - #+(and (not (or mips hppa)) 64-bit) (not (logbitp 51 bits)) - #+(and (not (or mips hppa)) (not 64-bit)) (not (logbitp 19 hi)) + #+mips (logbitp 19 hi) + #+(and (not mips) 64-bit) (not (logbitp 51 bits)) + #+(and (not mips) (not 64-bit)) (not (logbitp 19 hi)) ;; LONG-FLOAT (this code is dead anyway) #+(and long-float x86) diff --git a/src/code/float-trap.lisp b/src/code/float-trap.lisp index 720cef1a81..1d3cd68890 100644 --- a/src/code/float-trap.lisp +++ b/src/code/float-trap.lisp @@ -201,8 +201,7 @@ sets the floating point modes to their current values (and thus is a no-op)." (with-interrupts ;; Reset the accumulated exceptions, may be needed on other ;; platforms too, at least Linux doesn't seem to require it. - #+(or sunos (and hppa linux)) - (setf (ldb sb-vm:float-sticky-bits (floating-point-modes)) 0) + #+sunos (setf (ldb sb-vm:float-sticky-bits (floating-point-modes)) 0) (error (or (cdr (assoc code +sigfpe-code-error-alist+)) 'floating-point-exception) :operation op diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index ade1a69a6a..3650905c29 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -70,7 +70,7 @@ if the symbol isn't found." ;;; Cleanups before saving a core (defun foreign-deinit () - #+(and os-provides-dlopen (not linkage-table)) ; at most HPPA + #+(and os-provides-dlopen (not linkage-table)) (when (dynamic-foreign-symbols-p) (warn "~@ (length arch) 1) (error "More than one architecture selected"))) diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index c877fad8a7..95396e30ed 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -535,7 +535,7 @@ ;;; Extract a 4-byte element relative to the end of CODE-OBJ. ;;; The index should be strictly negative and a multiple of 4. (defknown code-trailer-ref (code-component fixnum) (unsigned-byte 32) - (flushable #-(or sparc hppa ppc64) always-translatable)) + (flushable #-(or sparc ppc64) always-translatable)) (defknown fun-subtype (function) (member . #.sb-vm::+function-widetags+) (flushable)) diff --git a/src/compiler/generic/vm-macs.lisp b/src/compiler/generic/vm-macs.lisp index 23516f4940..baf7be38fc 100644 --- a/src/compiler/generic/vm-macs.lisp +++ b/src/compiler/generic/vm-macs.lisp @@ -181,8 +181,8 @@ (deftype sc-offset () `(integer 0 (,sc-offset-limit))) (defconstant finite-sc-offset-limit - #-(or sparc hppa) 32 - #+(or sparc hppa) 64) + #-(or sparc) 32 + #+(or sparc) 64) (defconstant finite-sc-offset-bits (integer-length (1- finite-sc-offset-limit))) (deftype finite-sc-offset () `(integer 0 (,finite-sc-offset-limit))) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 7fe12a2629..f447d2f47f 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -1352,7 +1352,7 @@ ;; not all backends have been updated yet. On backends ;; that have not been updated, we still need to use ;; XEP-SETUP-SP here. - #+(or hppa mips sparc) + #+(or mips sparc) (vop xep-setup-sp node block) (vop copy-more-arg node block (optional-dispatch-max-args ef) #+x86-64 verified)) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index eddb034848..1d529d4acb 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -3975,7 +3975,7 @@ (source-transform-transitive 'logxor args 0 'integer)) (define-source-transform logand (&rest args) (source-transform-transitive 'logand args -1 'integer)) -#-(or arm arm64 hppa mips x86 x86-64 riscv) ; defined in compiler/target/arith.lisp +#-(or arm arm64 mips x86 x86-64 riscv) ; defined in compiler/target/arith.lisp (define-source-transform logeqv (&rest args) (source-transform-transitive 'logeqv args -1 'integer)) (define-source-transform gcd (&rest args) diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index eb2773a824..62d8a583f4 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -795,7 +795,7 @@ ;; FIXME: this is strictly redundant. ;; You should combine fields in the prefilter ;; so that the labeller receives a single byte. - ;; AARCH64 and HPPA make use of this though. + ;; AARCH64 makes use of this though. (loop for i from 2 below item-length collect (extract-byte i))))) dstate))) diff --git a/src/runtime/breakpoint.c b/src/runtime/breakpoint.c index 08f9702f37..525ad48f03 100644 --- a/src/runtime/breakpoint.c +++ b/src/runtime/breakpoint.c @@ -94,11 +94,7 @@ lispobj find_code(os_context_t *context) static long compute_offset(os_context_t *context, lispobj code) { if (code != NIL) { -#ifdef LISP_FEATURE_HPPA - uword_t pc = *os_context_pc_addr(context) & ~3; -#else uword_t pc = *os_context_pc_addr(context); -#endif struct code *codeptr = (struct code *)native_pointer(code); uword_t code_start = (uword_t)code_text_start(codeptr); int offset; diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 4e9adf8291..e5e7b58a5a 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -805,12 +805,6 @@ fake_foreign_function_call(os_context_t *context) lose("dead in fake_foreign_function_call, context = %x", context); } #endif -/* why doesnt PPC and SPARC do something like this: */ -#if defined(LISP_FEATURE_HPPA) - if ((sword_t)dynamic_space_free_pointer & 4) { - lose("dead in fake_foreign_function_call, context = %x, d_s_f_p = %x", context, dynamic_space_free_pointer); - } -#endif #endif #ifdef reg_BSP set_binding_stack_pointer(thread, diff --git a/src/runtime/wrap.h b/src/runtime/wrap.h index ade600b64f..543d63cb28 100644 --- a/src/runtime/wrap.h +++ b/src/runtime/wrap.h @@ -14,7 +14,7 @@ * * FIXME: But of course we should fix the FFI so that we can use the * actual 64-bit values instead. In fact, we probably have by now - * (2003-10-03) on all working platforms except MIPS and HPPA; if some + * (2003-10-03) on all working platforms except MIPS; if some * motivated spark would simply fix those, this hack could go away. * -- CSR, 2003-10-03 * diff --git a/tests/backtrace.impure.lisp b/tests/backtrace.impure.lisp index 4ba466a9c1..0f1f3aeec5 100644 --- a/tests/backtrace.impure.lisp +++ b/tests/backtrace.impure.lisp @@ -189,7 +189,7 @@ (with-test (:name (:backtrace :undefined-function :bug-346) :skipped-on :interpreter - ;; Failures on SPARC, and probably HPPA are due to + ;; Failures on SPARC are due to ;; not having a full and valid stack frame for the ;; undefined function frame. See PPC ;; undefined_tramp for details. diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 8874dd6cb7..ead9c01f35 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -222,7 +222,6 @@ (incf count))) (assert (= count 2)))) -;; Whoever deals with the Alpha and/or HPPA ports can make this test pass for them (with-test (:name :linkage-table-bogosity) (let ((strings (map 'list (lambda (x) (if (consp x) (car x) x)) sb-vm::+required-foreign-symbols+))) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index 70d4b32fb8..d19eda55b7 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -4988,7 +4988,7 @@ x)))) (with-test (:name (compile :copy-more-arg) - :fails-on (or :hppa :mips :sparc)) + :fails-on (or :mips :sparc)) ;; copy-more-arg might not copy in the right direction ;; when there are more fixed args than stack frame slots, ;; and thus end up splatting a single argument everywhere. diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 84156ba2e2..8d0e9d3427 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -99,7 +99,7 @@ ;;; bug 379 (with-test (:name (trace :encapsulate nil) :fails-on (or (and :ppc (not :linux)) :sparc :arm64) - :broken-on (or :hppa :freebsd)) + :broken-on (or :freebsd)) (let ((output (with-traced-function (trace-this :encapsulate nil) (assert (eq 'ok (trace-this)))))) (assert (search "TRACE-THIS" output)) @@ -107,7 +107,7 @@ (with-test (:name (trace :encapsulate nil :recursive) :fails-on (or (and :ppc (not :linux)) :sparc :arm64) - :broken-on (or :hppa :freebsd)) + :broken-on (or :freebsd)) (let ((output (with-traced-function (trace-fact :encapsulate nil) (assert (= 120 (trace-fact 5)))))) (assert (search "TRACE-FACT" output)) diff --git a/tests/dynamic-extent.impure.lisp b/tests/dynamic-extent.impure.lisp index f13d1f791a..5b4854dbab 100644 --- a/tests/dynamic-extent.impure.lisp +++ b/tests/dynamic-extent.impure.lisp @@ -174,7 +174,7 @@ (defun-with-dx dx-value-cell (x) ;; Not implemented everywhere, yet. - #+(or x86 x86-64 mips hppa) + #+(or x86 x86-64 mips) (let ((cell x)) (declare (sb-int:truly-dynamic-extent cell)) (flet ((f () @@ -873,7 +873,7 @@ (assert (every (lambda (x) (eql x 0)) a)))) (with-test (:name (:dx-bug-misc :bdowning-2005-iv-16)) - #+(or hppa mips x86 x86-64) + #+(or mips x86 x86-64) (assert-no-consing (bdowning-2005-iv-16)) (bdowning-2005-iv-16)) @@ -928,7 +928,7 @@ (multiple-value-bind (y pos2) (read-from-string res nil nil :start pos) (assert (equalp f2 y)) (assert (equalp f3 (read-from-string res nil nil :start pos2)))))) - #+(or hppa mips x86 x86-64) + #+(or mips x86 x86-64) (assert-no-consing (assert (eql n (funcall fun nil)))) (assert (eql n (funcall fun nil)))) diff --git a/tests/foreign-stack-alignment.impure.lisp b/tests/foreign-stack-alignment.impure.lisp index 02a94fd8c7..10b31eb008 100644 --- a/tests/foreign-stack-alignment.impure.lisp +++ b/tests/foreign-stack-alignment.impure.lisp @@ -36,7 +36,6 @@ #+(and ppc (not darwin)) 8 #+(or arm64 x86 x86-64 riscv ppc64) 16 #+sparc 8 - #+hppa 64 (error "Unknown platform"))) ;;;; Build the offset-tool as regular excutable, and run it with From 4dcb4ac2bf6e8f6b0b34f38121cbec29579a6a68 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 31 Aug 2020 19:50:14 -0400 Subject: [PATCH 0458/4023] Remove HPPA, part 2 of 2 Delete all architecture-specific files, and ldso-stubs.lisp which at this juncture was effectively HPPA-specific. --- src/assembly/hppa/alloc.lisp | 6 - src/assembly/hppa/arith.lisp | 296 ----- src/assembly/hppa/array.lisp | 1 - src/assembly/hppa/assem-rtns.lisp | 201 ---- src/assembly/hppa/support.lisp | 68 -- src/assembly/hppa/tramps.lisp | 100 -- src/code/hppa-vm.lisp | 78 -- src/compiler/hppa/alloc.lisp | 222 ---- src/compiler/hppa/arith.lisp | 932 --------------- src/compiler/hppa/array.lisp | 382 ------- src/compiler/hppa/c-call.lisp | 324 ------ src/compiler/hppa/call.lisp | 1226 -------------------- src/compiler/hppa/cell.lisp | 450 -------- src/compiler/hppa/char.lisp | 117 -- src/compiler/hppa/debug.lisp | 91 -- src/compiler/hppa/float.lisp | 996 ---------------- src/compiler/hppa/insts.lisp | 1629 --------------------------- src/compiler/hppa/macros.lisp | 386 ------- src/compiler/hppa/memory.lisp | 21 - src/compiler/hppa/move.lisp | 296 ----- src/compiler/hppa/nlx.lisp | 240 ---- src/compiler/hppa/parms.lisp | 143 --- src/compiler/hppa/pred.lisp | 41 - src/compiler/hppa/sap.lisp | 252 ----- src/compiler/hppa/show.lisp | 25 - src/compiler/hppa/subprim.lisp | 39 - src/compiler/hppa/system.lisp | 228 ---- src/compiler/hppa/target-insts.lisp | 39 - src/compiler/hppa/type-vops.lisp | 164 --- src/compiler/hppa/values.lisp | 136 --- src/compiler/hppa/vm.lisp | 381 ------- src/runtime/Config.hppa-linux | 28 - src/runtime/hppa-arch.c | 369 ------ src/runtime/hppa-arch.h | 7 - src/runtime/hppa-assem.S | 473 -------- src/runtime/hppa-linux-os.c | 96 -- src/runtime/hppa-linux-os.h | 18 - src/runtime/hppa-lispregs.h | 40 - tools-for-build/ldso-stubs.lisp | 209 ---- 39 files changed, 10750 deletions(-) delete mode 100644 src/assembly/hppa/alloc.lisp delete mode 100644 src/assembly/hppa/arith.lisp delete mode 100644 src/assembly/hppa/array.lisp delete mode 100644 src/assembly/hppa/assem-rtns.lisp delete mode 100644 src/assembly/hppa/support.lisp delete mode 100644 src/assembly/hppa/tramps.lisp delete mode 100644 src/code/hppa-vm.lisp delete mode 100644 src/compiler/hppa/alloc.lisp delete mode 100644 src/compiler/hppa/arith.lisp delete mode 100644 src/compiler/hppa/array.lisp delete mode 100644 src/compiler/hppa/c-call.lisp delete mode 100644 src/compiler/hppa/call.lisp delete mode 100644 src/compiler/hppa/cell.lisp delete mode 100644 src/compiler/hppa/char.lisp delete mode 100644 src/compiler/hppa/debug.lisp delete mode 100644 src/compiler/hppa/float.lisp delete mode 100644 src/compiler/hppa/insts.lisp delete mode 100644 src/compiler/hppa/macros.lisp delete mode 100644 src/compiler/hppa/memory.lisp delete mode 100644 src/compiler/hppa/move.lisp delete mode 100644 src/compiler/hppa/nlx.lisp delete mode 100644 src/compiler/hppa/parms.lisp delete mode 100644 src/compiler/hppa/pred.lisp delete mode 100644 src/compiler/hppa/sap.lisp delete mode 100644 src/compiler/hppa/show.lisp delete mode 100644 src/compiler/hppa/subprim.lisp delete mode 100644 src/compiler/hppa/system.lisp delete mode 100644 src/compiler/hppa/target-insts.lisp delete mode 100644 src/compiler/hppa/type-vops.lisp delete mode 100644 src/compiler/hppa/values.lisp delete mode 100644 src/compiler/hppa/vm.lisp delete mode 100644 src/runtime/Config.hppa-linux delete mode 100644 src/runtime/hppa-arch.c delete mode 100644 src/runtime/hppa-arch.h delete mode 100644 src/runtime/hppa-assem.S delete mode 100644 src/runtime/hppa-linux-os.c delete mode 100644 src/runtime/hppa-linux-os.h delete mode 100644 src/runtime/hppa-lispregs.h delete mode 100644 tools-for-build/ldso-stubs.lisp diff --git a/src/assembly/hppa/alloc.lisp b/src/assembly/hppa/alloc.lisp deleted file mode 100644 index d702f4d017..0000000000 --- a/src/assembly/hppa/alloc.lisp +++ /dev/null @@ -1,6 +0,0 @@ -(in-package "SB-VM") - -;;; Given that the pseudo-atomic sequence is so short, there is -;;; nothing that qualifies. But we want to keep the file around -;;; in case we decide to add something later. - diff --git a/src/assembly/hppa/arith.lisp b/src/assembly/hppa/arith.lisp deleted file mode 100644 index 819fea9730..0000000000 --- a/src/assembly/hppa/arith.lisp +++ /dev/null @@ -1,296 +0,0 @@ -(in-package "SB-VM") - - -;;;; Multiplication and Division helping routines. - -;;; ?? FIXME: Where are generic-* and generic-/? -#+sb-assembling -(define-assembly-routine - multiply - ((:arg x (signed-reg) nl0-offset) - (:arg y (signed-reg) nl1-offset) - - (:res res (signed-reg) nl2-offset) - - (:temp tmp (unsigned-reg) nl3-offset) - (:temp sign (unsigned-reg) nl4-offset)) - - ;; Determine the sign of the result. - (inst extrs x 0 1 sign :=) - (inst sub zero-tn x x) - (inst extrs y 0 1 tmp :=) - (inst sub zero-tn y y) - (inst xor sign tmp sign) - - ;; Make sure X is less then Y. - (inst comclr x y tmp :<<) - (inst xor x y tmp) - (inst xor x tmp x) - (inst xor y tmp y) - ;; Blow out of here if the result is zero. - (inst comb := x zero-tn done) - (inst li 0 res) - - LOOP - (inst extru x 31 1 zero-tn :ev) - (inst add y res res) - (inst extru x 30 1 zero-tn :ev) - (inst sh1add y res res) - (inst extru x 29 1 zero-tn :ev) - (inst sh2add y res res) - (inst extru x 28 1 zero-tn :ev) - (inst sh3add y res res) - - (inst srl x 4 x) - (inst comb :<> x zero-tn loop) - (inst sll y 4 y) - - DONE - (inst xor res sign res) - (inst sub res sign res)) - -(define-assembly-routine - (truncate) - ((:arg dividend signed-reg nl0-offset) - (:arg divisor signed-reg nl1-offset) - - (:res quo signed-reg nl2-offset) - (:res rem signed-reg nl3-offset)) - ;; Move abs(divident) into quo. - (inst move dividend quo :>=) - (inst sub zero-tn quo quo) - ;; Do one divive-step with -divisor to prime V (use rem as a temp) - (inst sub zero-tn divisor rem) - (inst ds zero-tn rem zero-tn) - ;; Shift the divident/quotient one bit, setting the carry flag. - (inst add quo quo quo) - ;; The first real divive-step. - (inst ds zero-tn divisor rem) - (inst addc quo quo quo) - ;; And 31 more of them. - (dotimes (i 31) - (inst ds rem divisor rem) - (inst addc quo quo quo)) - ;; If the remainder is negative, we need to add the absolute value of the - ;; divisor. - (inst comb :>= rem zero-tn remainder-positive :nullify t) - (inst comclr divisor zero-tn zero-tn :<) - (inst add rem divisor rem :tr) - (inst sub rem divisor rem) - REMAINDER-POSITIVE - ;; Now we have to fix the signs of quo and rem. - (inst xor divisor dividend zero-tn :>=) - (inst sub zero-tn quo quo) - (inst move dividend zero-tn :>=) - (inst sub zero-tn rem rem)) - - -;;;; Generic arithmetic. - -(define-assembly-routine (generic-+ - (:cost 10) - (:return-style :full-call) - (:translate +) - (:policy :safe) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - (:res res (descriptor-reg any-reg) a0-offset) - (:temp temp non-descriptor-reg nl0-offset) - (:temp temp1 non-descriptor-reg nl1-offset) - (:temp temp2 non-descriptor-reg nl2-offset) - (:temp lra descriptor-reg lra-offset) - (:temp lip interior-reg lip-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - ;; If either arg is not fixnum, use two-arg-+ to summarize - (inst or x y temp) - (inst extru temp 31 3 zero-tn :=) - (inst b DO-STATIC-FUN :nullify t) - ;; check for overflow - (inst add x y temp) - (inst xor temp x temp1) - (inst xor temp y temp2) - (inst and temp1 temp2 temp1) - (inst bc :< nil temp1 zero-tn DO-OVERFLOW) - (inst move temp res) - (lisp-return lra :offset 1) - - DO-OVERFLOW - ;; We did overflow, so do the bignum version - (inst sra x n-fixnum-tag-bits temp1) - (inst sra y n-fixnum-tag-bits temp2) - (inst add temp1 temp2 temp) - (with-fixed-allocation (res nil temp2 bignum-widetag - (1+ bignum-digits-offset) nil) - (storew temp res bignum-digits-offset other-pointer-lowtag)) - (lisp-return lra :offset 1) - - DO-STATIC-FUN - (inst ldw (static-fun-offset 'two-arg-+) null-tn lip) - (inst li (fixnumize 2) nargs) - (move cfp-tn ocfp) - (inst bv lip) - (move csp-tn cfp-tn t)) - -(define-assembly-routine (generic-- - (:cost 10) - (:return-style :full-call) - (:translate -) - (:policy :safe) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res (descriptor-reg any-reg) a0-offset) - - (:temp temp non-descriptor-reg nl0-offset) - (:temp temp1 non-descriptor-reg nl1-offset) - (:temp temp2 non-descriptor-reg nl2-offset) - (:temp lra descriptor-reg lra-offset) - (:temp lip interior-reg lip-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - ;; If either arg is not fixnum, use two-arg-+ to summarize - (inst or x y temp) - (inst extru temp 31 3 zero-tn :=) - (inst b DO-STATIC-FUN :nullify t) - (inst sub x y temp) - ;; check for overflow - (inst xor x y temp1) - (inst xor x temp temp2) - (inst and temp2 temp1 temp1) - (inst bc :< nil temp1 zero-tn DO-OVERFLOW) - (inst move temp res) - (lisp-return lra :offset 1) - - DO-OVERFLOW - ;; We did overflow, so do the bignum version - (inst sra x n-fixnum-tag-bits temp1) - (inst sra y n-fixnum-tag-bits temp2) - (inst sub temp1 temp2 temp) - (with-fixed-allocation (res nil temp2 bignum-widetag - (1+ bignum-digits-offset) nil) - (storew temp res bignum-digits-offset other-pointer-lowtag)) - (lisp-return lra :offset 1) - - DO-STATIC-FUN - (inst ldw (static-fun-offset 'two-arg--) null-tn lip) - (inst li (fixnumize 2) nargs) - (move cfp-tn ocfp) - (inst bv lip) - (move csp-tn cfp-tn t)) - - -;;;; Comparison routines. - -(macrolet - ((define-cond-assem-rtn (name translate static-fn cond) - `(define-assembly-routine (,name - (:cost 10) - (:return-style :full-call) - (:policy :safe) - (:translate ,translate) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res descriptor-reg a0-offset) - - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - (inst extru x 31 2 zero-tn :=) - (inst b do-static-fn :nullify t) - (inst extru y 31 2 zero-tn :=) - (inst b do-static-fn :nullify t) - - (inst comclr x y zero-tn ,cond) - (inst move null-tn res :tr) - (load-symbol res t) - (lisp-return lra :offset 1) - - DO-STATIC-FN - (inst ldw (static-fun-offset ',static-fn) null-tn lip) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst bv lip) - (inst move csp-tn cfp-tn)))) - - (define-cond-assem-rtn generic-< < two-arg-< :<) - (define-cond-assem-rtn generic-> > two-arg-> :>)) - - -(define-assembly-routine - (generic-eql - (:cost 10) - (:return-style :full-call) - (:policy :safe) - (:translate eql) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res descriptor-reg a0-offset) - - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - - (inst comb := x y return-t :nullify t) - (inst extru x 31 2 zero-tn :<>) - (inst b return-nil :nullify t) - (inst extru y 31 2 zero-tn :=) - (inst b do-static-fn :nullify t) - - RETURN-NIL - (inst move null-tn res) - (lisp-return lra :offset 1) - - DO-STATIC-FN - (inst ldw (static-fun-offset 'eql) null-tn lip) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst bv lip) - (inst move csp-tn cfp-tn) - - RETURN-T - (load-symbol res t)) - -(define-assembly-routine - (generic-= - (:cost 10) - (:return-style :full-call) - (:policy :safe) - (:translate =) - (:save-p t)) - ((:arg x (descriptor-reg any-reg) a0-offset) - (:arg y (descriptor-reg any-reg) a1-offset) - - (:res res descriptor-reg a0-offset) - - (:temp lip interior-reg lip-offset) - (:temp lra descriptor-reg lra-offset) - (:temp nargs any-reg nargs-offset) - (:temp ocfp any-reg ocfp-offset)) - - (inst comb := x y return-t :nullify t) - (inst extru x 31 2 zero-tn :=) - (inst b do-static-fn :nullify t) - (inst extru y 31 2 zero-tn :=) - (inst b do-static-fn :nullify t) - - (inst move null-tn res) - (lisp-return lra :offset 1) - - DO-STATIC-FN - (inst ldw (static-fun-offset 'two-arg-=) null-tn lip) - (inst li (fixnumize 2) nargs) - (inst move cfp-tn ocfp) - (inst bv lip) - (inst move csp-tn cfp-tn) - - RETURN-T - (load-symbol res t)) diff --git a/src/assembly/hppa/array.lisp b/src/assembly/hppa/array.lisp deleted file mode 100644 index b80e5342c6..0000000000 --- a/src/assembly/hppa/array.lisp +++ /dev/null @@ -1 +0,0 @@ -(in-package "SB-VM") diff --git a/src/assembly/hppa/assem-rtns.lisp b/src/assembly/hppa/assem-rtns.lisp deleted file mode 100644 index 2627265235..0000000000 --- a/src/assembly/hppa/assem-rtns.lisp +++ /dev/null @@ -1,201 +0,0 @@ -(in-package "SB-VM") - -;;;; Return-multiple with other than one value - -#+sb-assembling ;; we don't want a vop for this one. -(define-assembly-routine - (return-multiple - (:return-style :none)) - ;; These four are really arguments. - ((:temp nvals any-reg nargs-offset) - (:temp vals any-reg nl0-offset) - (:temp ocfp any-reg nl1-offset) - (:temp lra descriptor-reg lra-offset) - ;; These are just needed to facilitate the transfer - (:temp count any-reg nl2-offset) - (:temp dst any-reg nl3-offset) - (:temp temp descriptor-reg l0-offset) - ;; These are needed so we can get at the register args. - (:temp a0 descriptor-reg a0-offset) - (:temp a1 descriptor-reg a1-offset) - (:temp a2 descriptor-reg a2-offset) - (:temp a3 descriptor-reg a3-offset) - (:temp a4 descriptor-reg a4-offset) - (:temp a5 descriptor-reg a5-offset)) - ;; Note, because of the way the return-multiple vop is written, we can - ;; assume that we are never called with nvals == 1 and that a0 has already - ;; been loaded. ;FIX-lav: look at old hppa , replace comb+addi with addib - (inst comb :<= nvals zero-tn DEFAULT-A0-AND-ON) - (inst addi (- (fixnumize 2)) nvals count) - (inst comb :<= count zero-tn DEFAULT-A2-AND-ON) - (inst ldw (* 1 n-word-bytes) vals a1) - (inst addib :<= (- (fixnumize 1)) count DEFAULT-A3-AND-ON) - (inst ldw (* 2 n-word-bytes) vals a2) - (inst addib :<= (- (fixnumize 1)) count DEFAULT-A4-AND-ON) - (inst ldw (* 3 n-word-bytes) vals a3) - (inst addib :<= (- (fixnumize 1)) count DEFAULT-A5-AND-ON) - (inst ldw (* 4 n-word-bytes) vals a4) - (inst addib :<= (- (fixnumize 1)) count done) - (inst ldw (* 5 n-word-bytes) vals a5) - ;; Copy the remaining args to the top of the stack. - (inst addi (fixnumize register-arg-count) vals vals) - (inst addi (fixnumize register-arg-count) cfp-tn dst) - LOOP - (inst ldwm n-word-bytes vals temp) - (inst addib :<> (- (fixnumize 1)) count LOOP) - (inst stwm temp n-word-bytes dst) - (inst b DONE :nullify t) - - DEFAULT-A0-AND-ON - (move null-tn a0) - (move null-tn a1) - DEFAULT-A2-AND-ON - (move null-tn a2) - DEFAULT-A3-AND-ON - (move null-tn a3) - DEFAULT-A4-AND-ON - (move null-tn a4) - DEFAULT-A5-AND-ON - (move null-tn a5) - DONE - ;; Clear the stack. - (move cfp-tn ocfp-tn) - (move ocfp cfp-tn) - (inst add ocfp-tn nvals csp-tn) - (lisp-return lra)) - - -;;;; tail-call-variable. - -#+sb-assembling ;; no vop for this one either. -(define-assembly-routine - (tail-call-variable - (:return-style :none)) - ;; These are really args. - ((:temp args any-reg nl0-offset) - (:temp lexenv descriptor-reg lexenv-offset) - ;; We need to compute this - (:temp nargs any-reg nargs-offset) - ;; These are needed by the blitting code. - (:temp src any-reg nl1-offset) - (:temp dst any-reg nl2-offset) - (:temp count any-reg nl3-offset) - (:temp temp descriptor-reg l0-offset) - ;; These are needed so we can get at the register args. - (:temp a0 descriptor-reg a0-offset) - (:temp a1 descriptor-reg a1-offset) - (:temp a2 descriptor-reg a2-offset) - (:temp a3 descriptor-reg a3-offset) - (:temp a4 descriptor-reg a4-offset) - (:temp a5 descriptor-reg a5-offset)) - ;; Calculate NARGS (as a fixnum) - (inst sub csp-tn args nargs) - ;; Load the argument regs (must do this now, 'cause the blt might - ;; trash these locations) - (loadw a0 args 0) - (loadw a1 args 1) - (loadw a2 args 2) - (loadw a3 args 3) - (loadw a4 args 4) - (loadw a5 args 5) - ;; Calc SRC, DST, and COUNT - (inst addi (- (fixnumize register-arg-count)) nargs count) - (inst comb :<= count zero-tn done) - (inst addi (fixnumize register-arg-count) args src) - (inst addi (fixnumize register-arg-count) cfp-tn dst) - LOOP - ;; Copy one arg and increase src - (inst ldwm n-word-bytes src temp) - (inst addib :<> (- (fixnumize 1)) count LOOP) - (inst stwm temp n-word-bytes dst) - DONE - ;; We are done. Do the jump. - (loadw temp lexenv closure-fun-slot fun-pointer-lowtag) - (lisp-jump temp)) - - -;;;; Non-local exit noise. - -(define-assembly-routine - (unwind - (:translate %unwind) - (:return-style :none) - (:policy :fast-safe)) - ((:arg block (any-reg descriptor-reg) a0-offset) - (:arg start (any-reg descriptor-reg) ocfp-offset) - (:arg count (any-reg descriptor-reg) nargs-offset) - (:temp lra descriptor-reg lra-offset) - (:temp cur-uwp any-reg nl0-offset) - (:temp next-uwp any-reg nl1-offset) - (:temp target-uwp any-reg nl2-offset)) - (declare (ignore start count)) - - - (let ((error (generate-error-code nil 'invalid-unwind-error))) - (inst bc := nil block zero-tn error)) - - (load-symbol-value cur-uwp *current-unwind-protect-block*) - (loadw target-uwp block unwind-block-uwp-slot) - (inst bc :<> nil cur-uwp target-uwp DO-UWP) - - (move block cur-uwp) - - DO-EXIT - (loadw cfp-tn cur-uwp unwind-block-cfp-slot) - (loadw code-tn cur-uwp unwind-block-code-slot) - (loadw lra cur-uwp unwind-block-entry-pc-slot) - (lisp-return lra :frob-code nil) - - DO-UWP - (loadw next-uwp cur-uwp unwind-block-uwp-slot) - (inst b DO-EXIT) - (store-symbol-value next-uwp *current-unwind-protect-block*)) - -(define-assembly-routine - (throw - (:return-style :none)) - ((:arg target descriptor-reg a0-offset) - (:arg start any-reg ocfp-offset) - (:arg count any-reg nargs-offset) - (:temp catch any-reg a1-offset) - (:temp tag descriptor-reg a2-offset) - (:temp fix descriptor-reg nl0-offset)) - (declare (ignore start count)) ; We just need them in the registers. - - (load-symbol-value catch *current-catch-block*) - - LOOP - (let ((error (generate-error-code nil 'unseen-throw-tag-error target))) - (inst bc := nil catch zero-tn error)) - (loadw tag catch catch-block-tag-slot) - (inst comb := tag target EXIT :nullify t) - (inst b LOOP) - (loadw catch catch catch-block-previous-catch-slot) - EXIT - (let ((fixup (make-fixup 'unwind :assembly-routine))) - (inst ldil fixup fix) - (inst ble fixup lisp-heap-space fix)) - (move catch target t)) - -#+hpux -(define-assembly-routine - (return-from-lisp-stub (:return-style :none)) - ((:temp lip interior-reg lip-offset) - (:temp nl0 descriptor-reg nl0-offset) - (:temp nl1 descriptor-reg nl1-offset) - (:temp lra descriptor-reg lra-offset)) - ; before calling into lisp we must save our return address (reg_LRA) - (store-symbol-value lra *c-lra*) - ; note the lra we calculate next must "simulate" an fixnum, - ; because compute-calling-frame will use fixnump on this value. - ; either use 16 or 20, finetune it... - (inst addi 19 nl0 lra) ; then setup the new LRA (rest of this routine after branch) - (inst bv lip :nullify t) - (inst word return-pc-widetag) - ; ok, we are back from the lisp-call, lets return to c - ; FIX-lav: steal more stuff from call_into_lisp here, ideally the whole thing - (inst move ocfp-tn csp-tn) ; dont think we should ever get here - (inst nop) - (load-symbol-value nl0 *c-lra*) - (inst addi 1 nl0 nl0) - (inst ble 0 c-text-space nl0 :nullify t)) diff --git a/src/assembly/hppa/support.lisp b/src/assembly/hppa/support.lisp deleted file mode 100644 index 6c037e0ed3..0000000000 --- a/src/assembly/hppa/support.lisp +++ /dev/null @@ -1,68 +0,0 @@ -;;;; the machine-specific support routines needed by the file assembler - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(defun generate-call-sequence (name style vop options) - (declare (ignore options)) - (ecase style - ((:raw :none) - (with-unique-names (fixup) - (values - `((let ((fixup (make-fixup ',name :assembly-routine))) - (inst ldil fixup ,fixup) - (inst ble fixup lisp-heap-space ,fixup :nullify t))) - `((:temporary (:scs (any-reg) :from (:eval 0) :to (:eval 1)) - ,fixup))))) - (:full-call - (let ((temp (make-symbol "TEMP")) - (nfp-save (make-symbol "NFP-SAVE")) - (lra (make-symbol "LRA"))) - (values - `((let ((lra-label (gen-label)) - (cur-nfp (current-nfp-tn ,vop))) - (when cur-nfp - (store-stack-tn ,nfp-save cur-nfp)) - (inst compute-lra-from-code code-tn lra-label ,temp ,lra) - (note-next-instruction ,vop :call-site) - (let ((fixup (make-fixup ',name :assembly-routine))) - (inst ldil fixup ,temp) - (inst be fixup lisp-heap-space ,temp :nullify t)) - (without-scheduling () - (emit-return-pc lra-label) - (note-this-location ,vop :single-value-return) - (inst move ocfp-tn csp-tn) - (inst nop)) ; this nop is here because of emit-return-pc align - (inst compute-code-from-lra code-tn lra-label ,temp code-tn) - (when cur-nfp - (load-stack-tn cur-nfp ,nfp-save)))) - `((:temporary (:scs (non-descriptor-reg) :from (:eval 0) :to (:eval 1)) - ,temp) - (:temporary (:sc descriptor-reg :offset lra-offset - :from (:eval 0) :to (:eval 1)) - ,lra) - (:temporary (:scs (control-stack) :offset nfp-save-offset) - ,nfp-save) - (:save-p t))))))) - -(defun generate-return-sequence (style) - (ecase style - (:raw - `((inst bv lip-tn :nullify t))) - (:full-call - `((lisp-return (make-random-tn :kind :normal - :sc (sc-or-lose 'descriptor-reg) - :offset lra-offset) - :offset 1))) - (:none))) - -(defun return-machine-address (scp) - (context-register scp lip-offset)) diff --git a/src/assembly/hppa/tramps.lisp b/src/assembly/hppa/tramps.lisp deleted file mode 100644 index 61123c27e5..0000000000 --- a/src/assembly/hppa/tramps.lisp +++ /dev/null @@ -1,100 +0,0 @@ -;;;; Undefined-function and closure trampoline definitions - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. - -(in-package "SB-VM") - -(define-assembly-routine - (xundefined-tramp (:return-style :none) - (:align n-lowtag-bits) - (:export undefined-tramp - (undefined-tramp-tagged - (+ xundefined-tramp - fun-pointer-lowtag)))) - ((:temp lra-tn descriptor-reg lra-offset) - (:temp temp non-descriptor-reg nl0-offset)) - (inst word simple-fun-widetag) ;; header - (inst word (make-fixup 'undefined-tramp-tagged - :assembly-routine)) ;; self - (dotimes (i (- simple-fun-insts-offset 2)) - (inst word nil-value)) - - UNDEFINED-TRAMP - ;; Point reg_CODE to the header and tag it as function, since the - ;; debugger regards a function pointer in reg_CODE which doesn't - ;; point to a code object as undefined function. This is (BACKTRACE - ;; UNDEFINED-FUNCTION BUG-353) in the test suite. - (inst addi (- fun-pointer-lowtag - (ash simple-fun-insts-offset word-shift)) - lip-tn code-tn) - - ;; If we are called with stack arguments (or in a tail-call - ;; scenario), we end up with an allocated stack frame, but the frame - ;; link information is uninitialized. Fix things by allocating and - ;; initializing our stack frame "properly". This is (BACKTRACE - ;; UNDEFINED-FUNCTION BUG-346) in the test suite. - - ;; The :NULLIFY T here is technically optional: If we don't nullify - ;; then we execute the following branch, which also doesn't nullify, - ;; and its branch-delay slot becomes (due to the COMIB) the - ;; instruction at NO-STACK-ARGS, and its target is the following - ;; instruction. But that's a bug waiting to happen in the unlikely - ;; event that someone needs to change this logic. - (inst addi (- (fixnumize register-arg-count)) nargs-tn temp) - (inst comb :< temp zero-tn NO-STACK-ARGS :nullify t) - - (inst b FINISH-FRAME-SETUP) - (inst addi (fixnumize register-arg-count) cfp-tn csp-tn) - - NO-STACK-ARGS - (inst add cfp-tn nargs-tn csp-tn) - - FINISH-FRAME-SETUP - (storew ocfp-tn cfp-tn ocfp-save-offset) - (storew lra-tn cfp-tn lra-save-offset) - - ;; Now that the preliminaries are dealt with, actually trap. - (error-call nil 'undefined-fun-error fdefn-tn)) - -; we need closure-tramp and funcallable-instance-tramp in -; same space as other lisp-code, because caller is doing -; normal lisp-calls where we doesnt specify space. -; if we doesnt have the lisp-function (code from defun, closure, lambda etc..) -; machine-address, resolve it here and jump to it. -(define-assembly-routine - (closure-tramp (:return-style :none)) - ((:temp lip interior-reg lip-offset) - (:temp nl0 descriptor-reg nl0-offset)) - (inst ldw (- (* fdefn-fun-slot n-word-bytes) - other-pointer-lowtag) - fdefn-tn lexenv-tn) - (inst ldw (- (* closure-fun-slot n-word-bytes) - fun-pointer-lowtag) - lexenv-tn nl0) - (inst addi (- (* simple-fun-insts-offset n-word-bytes) - fun-pointer-lowtag) - nl0 lip) - (inst bv lip :nullify t)) - -(define-assembly-routine - (funcallable-instance-tramp-header - (:return-style :none) - (:align n-lowtag-bits) - (:export (funcallable-instance-tramp - (+ funcallable-instance-tramp-header - fun-pointer-lowtag)))) - nil - (inst word simple-fun-widetag) ;;header - (inst word (make-fixup 'funcallable-instance-tramp :assembly-routine)) ;; self - (dotimes (i (- simple-fun-insts-offset 2)) - (inst word nil-value)) - (loadw lexenv-tn lexenv-tn - funcallable-instance-function-slot - fun-pointer-lowtag) - (loadw code-tn lexenv-tn - closure-fun-slot - fun-pointer-lowtag) - (inst addi (- (* simple-fun-insts-offset n-word-bytes) - fun-pointer-lowtag) code-tn lip-tn) - (inst bv lip-tn :nullify t)) diff --git a/src/code/hppa-vm.lisp b/src/code/hppa-vm.lisp deleted file mode 100644 index 4dbdaa1ab5..0000000000 --- a/src/code/hppa-vm.lisp +++ /dev/null @@ -1,78 +0,0 @@ -(in-package "SB-VM") - -#-sb-xc-host -(defun machine-type () - "Returns a string describing the type of the local machine." - "HPPA") - -;;;; FIXUP-CODE-OBJECT -(defconstant-eqx +fixup-kinds+ - #(:absolute :load :load11u :load-short :hi :branch) - #'equalp) -(!with-bigvec-or-sap -(defun fixup-code-object (code offset value kind flavor) - (declare (ignore flavor)) - (unless (zerop (rem offset sb-assem:+inst-alignment-bytes+)) - (error "Unaligned instruction? offset=#x~X." offset)) - (let* ((sap (code-instructions code)) - (inst (sap-ref-32 sap offset))) - (setf (sap-ref-32 sap offset) - (ecase kind - (:absolute - value) - (:load - (logior (mask-field (byte 18 14) value) - (if (< value 0) - (1+ (ash (ldb (byte 13 0) value) 1)) - (ash (ldb (byte 13 0) value) 1)))) - (:load11u - (logior (if (< value 0) - (1+ (ash (ldb (byte 10 0) value) 1)) - (ash (ldb (byte 11 0) value) 1)) - (mask-field (byte 18 14) inst))) - (:load-short - (let ((low-bits (ldb (byte 11 0) value))) - (aver (<= 0 low-bits (1- (ash 1 4)))) - (logior (ash (dpb (ldb (byte 4 0) value) - (byte 4 1) - (ldb (byte 1 4) value)) 17) - (logand inst #xffe0ffff)))) - (:hi - (logior (ash (ldb (byte 5 13) value) 16) - (ash (ldb (byte 2 18) value) 14) - (ash (ldb (byte 2 11) value) 12) - (ash (ldb (byte 11 20) value) 1) - (ldb (byte 1 31) value) - (logand inst #xffe00000))) - (:branch - (let ((bits (ldb (byte 9 2) value))) - (aver (zerop (ldb (byte 2 0) value))) - (logior (ash bits 3) - (mask-field (byte 1 1) inst) - (mask-field (byte 3 13) inst) - (mask-field (byte 11 21) inst))))))) - nil)) - -#-sb-xc-host (progn - -;;; For now. -(defun context-floating-point-modes (context) - (declare (ignore context)) - (warn "stub CONTEXT-FLOATING-POINT-MODES") - 0) - -;;;; Internal-error-arguments. - -;;; INTERNAL-ERROR-ARGUMENTS -- interface. -;;; -;;; Given the sigcontext, extract the internal error arguments from the -;;; instruction stream. -;;; -(defun internal-error-args (context) - (declare (type (alien (* os-context-t)) context)) - (let* ((pc (context-pc context)) - (trap-number (logand (sap-ref-8 pc 3) #x1f))) - (declare (type system-area-pointer pc)) - (sb-kernel::decode-internal-error-args (sap+ pc 5) trap-number - (sap-ref-8 pc 4)))) -) ; end PROGN diff --git a/src/compiler/hppa/alloc.lisp b/src/compiler/hppa/alloc.lisp deleted file mode 100644 index f8a166c2c6..0000000000 --- a/src/compiler/hppa/alloc.lisp +++ /dev/null @@ -1,222 +0,0 @@ -;;;; allocation VOPs for the HPPA - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; LIST and LIST* -(define-vop (list-or-list*) - (:args (things :more t)) - (:temporary (:scs (descriptor-reg)) ptr) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (descriptor-reg) :to (:result 0) :target result) - res) - (:info num) - (:results (result :scs (descriptor-reg))) - (:variant-vars star) - (:policy :safe) - (:node-var node) - (:generator 0 - (cond ((zerop num) - (move null-tn result)) - ((and star (= num 1)) - (move (tn-ref-tn things) result)) - (t - (macrolet - ((store-car (tn list &optional (slot cons-car-slot)) - `(let ((reg (sc-case ,tn - ((any-reg descriptor-reg zero null) ,tn) - (control-stack - (load-stack-tn temp ,tn) - temp)))) - (storew reg ,list ,slot list-pointer-lowtag)))) - (let* ((dx-p (node-stack-allocate-p node)) - (cons-cells (if star (1- num) num)) - (alloc (* (pad-data-block cons-size) cons-cells))) - (pseudo-atomic (:extra (if dx-p 0 alloc)) - (when dx-p - (align-csp res)) - (set-lowtag list-pointer-lowtag (if dx-p csp-tn alloc-tn) res) - (when dx-p - (if (typep alloc '(signed-byte 14)) - (inst ldo alloc csp-tn csp-tn) - ;; FIXME: We have TEMP available, so can do an - ;; LIDL / LDO / ADD sequence here instead of - ;; punting. - (error "VOP LIST-OR-LIST* can't stack-allocate more than 511 CONSes at once"))) - (move res ptr) - (dotimes (i (1- cons-cells)) - (store-car (tn-ref-tn things) ptr) - (setf things (tn-ref-across things)) - (inst addi (pad-data-block cons-size) ptr ptr) - (storew ptr ptr - (- cons-cdr-slot cons-size) - list-pointer-lowtag)) - (store-car (tn-ref-tn things) ptr) - (cond (star - (setf things (tn-ref-across things)) - (store-car (tn-ref-tn things) ptr cons-cdr-slot)) - (t - (storew null-tn ptr - cons-cdr-slot list-pointer-lowtag))) - (aver (null (tn-ref-across things))) - (move res result)))))))) - -(define-vop (list list-or-list*) - (:variant nil)) - -(define-vop (list* list-or-list*) - (:variant t)) - - -;;;; Special purpose inline allocators. -;;; ALLOCATE-VECTOR -(define-vop (allocate-vector-on-heap) - (:args (type :scs (unsigned-reg)) - (length :scs (any-reg)) - (words :scs (any-reg))) - (:arg-types positive-fixnum - positive-fixnum - positive-fixnum) - (:temporary (:sc non-descriptor-reg) bytes) - (:results (result :scs (descriptor-reg) :from :load)) - (:policy :fast-safe) - (:generator 100 - (inst addi (+ lowtag-mask - (* vector-data-offset n-word-bytes)) words bytes) - (inst dep 0 31 n-lowtag-bits bytes) - (pseudo-atomic () - (set-lowtag other-pointer-lowtag alloc-tn result) - (inst add bytes alloc-tn alloc-tn) - (storew type result 0 other-pointer-lowtag) - (storew length result vector-length-slot other-pointer-lowtag)))) - -(define-vop (allocate-vector-on-stack) - (:args (type :scs (unsigned-reg)) - (length :scs (any-reg)) - (words :scs (any-reg))) - (:arg-types positive-fixnum - positive-fixnum - positive-fixnum) - (:temporary (:sc non-descriptor-reg) bytes temp) - (:results (result :scs (descriptor-reg) :from :load)) - (:policy :fast-safe) - (:generator 100 - (inst addi (+ lowtag-mask - (* vector-data-offset n-word-bytes)) words bytes) - (inst dep 0 31 n-lowtag-bits bytes) - ;; FIXME: It would be good to check for stack overflow here. - (pseudo-atomic () - (align-csp temp) - (set-lowtag other-pointer-lowtag csp-tn result) - (inst addi (* vector-data-offset n-word-bytes) csp-tn temp) - (inst add bytes csp-tn csp-tn) - (storew type result 0 other-pointer-lowtag) - (storew length result vector-length-slot other-pointer-lowtag) - (let ((loop (gen-label))) - (emit-label loop) - (inst comb :<> temp csp-tn loop :nullify t) - (inst stwm zero-tn n-word-bytes temp))))) - -(define-vop (make-fdefn) - (:translate make-fdefn) - (:policy :fast-safe) - (:args (name :scs (descriptor-reg) :to :eval)) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (result :scs (descriptor-reg) :from :argument)) - (:generator 37 - (with-fixed-allocation (result nil temp fdefn-widetag fdefn-size nil) - (inst li (make-fixup 'undefined-tramp :assembly-routine) temp) - (storew name result fdefn-name-slot other-pointer-lowtag) - (storew null-tn result fdefn-fun-slot other-pointer-lowtag) - (storew temp result fdefn-raw-addr-slot other-pointer-lowtag)))) - -(define-vop (make-closure) - (:args (function :to :save :scs (descriptor-reg))) - (:info label length stack-allocate-p) - (:ignore label) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (result :scs (descriptor-reg))) - (:generator 10 - (with-fixed-allocation - (result nil temp closure-widetag - (+ length closure-info-offset) - stack-allocate-p :lowtag fun-pointer-lowtag) - (storew function result closure-fun-slot fun-pointer-lowtag)))) - -;;; The compiler likes to be able to directly make value cells. -(define-vop (make-value-cell) - (:args (value :to :save :scs (descriptor-reg any-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (result :scs (descriptor-reg))) - (:info stack-allocate-p) - (:generator 10 - (with-fixed-allocation - (result nil temp value-cell-widetag value-cell-size stack-allocate-p) - (storew value result value-cell-value-slot other-pointer-lowtag)))) - -;;;; Automatic allocators for primitive objects. - -(define-vop (make-unbound-marker) - (:args) - (:results (result :scs (descriptor-reg any-reg))) - (:generator 1 - (inst li unbound-marker-widetag result))) - -(define-vop (make-funcallable-instance-tramp) - (:args) - (:results (result :scs (any-reg))) - (:generator 1 - (inst li (make-fixup 'funcallable-instance-tramp :assembly-routine) - result))) - -(define-vop (fixed-alloc) - (:args) - (:info name words type lowtag stack-allocate-p) - (:ignore name) - (:results (result :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 4 - (with-fixed-allocation - (result nil temp type words stack-allocate-p - :lowtag lowtag :maybe-write t)))) - -(define-vop (var-alloc) - (:args (extra :scs (any-reg))) - (:arg-types positive-fixnum) - (:info name words type lowtag stack-allocate-p) - (:ignore name stack-allocate-p) - (:results (result :scs (descriptor-reg))) - (:temporary (:scs (any-reg)) bytes) - (:temporary (:scs (non-descriptor-reg)) header) - (:generator 6 - (inst addi (* (1+ words) n-word-bytes) extra bytes) - (inst sll bytes (- n-widetag-bits 2) header) - ;; The specified EXTRA value is the exact value placed in the header - ;; as the word count when allocating code. - (cond ((= type code-header-widetag) - (inst addi type header header)) - (t - (cond ((> (length-field-shift type) n-widetag-bits) - ;; can't encode (+ (ash -2 n-widetag-bits) instance-widetag) - ;; as an immediate operand, so do what worked before. - (inst addi (+ (ash -2 n-widetag-bits) 0) header header) - ;; now shift left a few bits more - (inst sll header (- (length-field-shift type) n-widetag-bits) header) - ;; and add the widetag in - (inst addi type header header)) - (t - (inst addi (+ (ash -2 n-widetag-bits) type) header header))) - (inst dep 0 31 n-lowtag-bits bytes))) - (pseudo-atomic () - (set-lowtag lowtag alloc-tn result) - (storew header result 0 lowtag) - (inst add alloc-tn bytes alloc-tn)))) - diff --git a/src/compiler/hppa/arith.lisp b/src/compiler/hppa/arith.lisp deleted file mode 100644 index 8706e6d220..0000000000 --- a/src/compiler/hppa/arith.lisp +++ /dev/null @@ -1,932 +0,0 @@ -;;;; the VM definition arithmetic VOPs for HPPA - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; Unary operations. - -(define-vop (fast-safe-arith-op) - (:policy :fast-safe)) - -(define-vop (fixnum-unop fast-safe-arith-op) - (:args (x :scs (any-reg))) - (:results (res :scs (any-reg))) - (:note "inline fixnum arithmetic") - (:arg-types tagged-num) - (:result-types tagged-num)) - -(define-vop (signed-unop fast-safe-arith-op) - (:args (x :scs (signed-reg))) - (:results (res :scs (signed-reg))) - (:note "inline (signed-byte 32) arithmetic") - (:arg-types signed-num) - (:result-types signed-num)) - -(define-vop (fast-negate/fixnum fixnum-unop) - (:translate %negate) - (:generator 1 - (inst sub zero-tn x res))) - -(define-vop (fast-negate/signed signed-unop) - (:translate %negate) - (:generator 2 - (inst sub zero-tn x res))) - -(define-vop (fast-lognot/fixnum fixnum-unop) - (:translate lognot) - (:temporary (:scs (any-reg) :to (:result 0)) - temp) - (:generator 1 - (inst li (fixnumize -1) temp) - (inst xor x temp res))) - -(define-vop (fast-lognot/signed signed-unop) - (:translate lognot) - (:generator 2 - (inst uaddcm zero-tn x res))) - -;;;; Binary fixnum operations. - -;;; Assume that any constant operand is the second arg... - -(define-vop (fast-fixnum-binop fast-safe-arith-op) - (:args (x :target r :scs (any-reg zero)) - (y :target r :scs (any-reg zero))) - (:arg-types tagged-num tagged-num) - (:results (r :scs (any-reg))) - (:result-types tagged-num) - (:note "inline fixnum arithmetic")) - -(define-vop (fast-unsigned-binop fast-safe-arith-op) - (:args (x :target r :scs (unsigned-reg zero)) - (y :target r :scs (unsigned-reg zero))) - (:arg-types unsigned-num unsigned-num) - (:results (r :scs (unsigned-reg))) - (:result-types unsigned-num) - (:note "inline (unsigned-byte 32) arithmetic")) - -(define-vop (fast-signed-binop fast-safe-arith-op) - (:args (x :target r :scs (signed-reg zero)) - (y :target r :scs (signed-reg zero))) - (:arg-types signed-num signed-num) - (:results (r :scs (signed-reg))) - (:result-types signed-num) - (:note "inline (signed-byte 32) arithmetic")) - -(define-vop (fast-fixnum-c-binop fast-fixnum-binop) - (:args (x :target r :scs (any-reg))) - (:info y) - (:arg-types tagged-num (:constant integer))) - -(define-vop (fast-signed-c-binop fast-signed-binop) - (:args (x :target r :scs (signed-reg))) - (:info y) - (:arg-types tagged-num (:constant integer))) - -(define-vop (fast-unsigned-c-binop fast-unsigned-binop) - (:args (x :target r :scs (unsigned-reg))) - (:info y) - (:arg-types tagged-num (:constant integer))) - -(macrolet - ((define-binop (translate cost untagged-cost op arg-swap) - `(progn - (define-vop (,(symbolicate "FAST-" translate "/FIXNUM=>FIXNUM") - fast-fixnum-binop) - (:args (x :target r :scs (any-reg)) - (y :target r :scs (any-reg))) - (:translate ,translate) - (:generator ,(1+ cost) - ,(if arg-swap - `(inst ,op y x r) - `(inst ,op x y r)))) - (define-vop (,(symbolicate "FAST-" translate "/SIGNED=>SIGNED") - fast-signed-binop) - (:args (x :target r :scs (signed-reg)) - (y :target r :scs (signed-reg))) - (:translate ,translate) - (:generator ,(1+ untagged-cost) - ,(if arg-swap - `(inst ,op y x r) - `(inst ,op x y r)))) - (define-vop (,(symbolicate "FAST-" translate "/UNSIGNED=>UNSIGNED") - fast-unsigned-binop) - (:args (x :target r :scs (unsigned-reg)) - (y :target r :scs (unsigned-reg))) - (:translate ,translate) - (:generator ,(1+ untagged-cost) - ,(if arg-swap - `(inst ,op y x r) - `(inst ,op x y r))))))) - (define-binop + 1 5 add nil) - (define-binop - 1 5 sub nil) - (define-binop logior 1 2 or nil) - (define-binop logand 1 2 and nil) - (define-binop logandc1 1 2 andcm t) - (define-binop logandc2 1 2 andcm nil) - (define-binop logxor 1 2 xor nil)) - -(macrolet - ((define-c-binop (translate cost untagged-cost tagged-type untagged-type inst) - `(progn - (define-vop (,(symbolicate "FAST-" translate "-C/FIXNUM=>FIXNUM") - fast-fixnum-c-binop) - (:arg-types tagged-num (:constant ,tagged-type)) - (:translate ,translate) - (:generator ,cost - (let ((y (fixnumize y))) - ,inst))) - (define-vop (,(symbolicate "FAST-" translate "-C/SIGNED=>SIGNED") - fast-signed-c-binop) - (:arg-types signed-num (:constant ,untagged-type)) - (:translate ,translate) - (:generator ,untagged-cost - ,inst)) - (define-vop (,(symbolicate "FAST-" translate "-C/UNSIGNED=>UNSIGNED") - fast-unsigned-c-binop) - (:arg-types unsigned-num (:constant ,untagged-type)) - (:translate ,translate) - (:generator ,untagged-cost - ,inst))))) - - (define-c-binop + 1 3 (signed-byte 9) (signed-byte 11) - (inst addi y x r)) - (define-c-binop - 1 3 - (integer #.(- 1 (ash 1 8)) #.(ash 1 8)) - (integer #.(- 1 (ash 1 10)) #.(ash 1 10)) - (inst addi (- y) x r))) - -(define-vop (fast-lognor/fixnum=>fixnum fast-fixnum-binop) - (:translate lognor) - (:args (x :target r :scs (any-reg)) - (y :target r :scs (any-reg))) - (:temporary (:sc non-descriptor-reg) temp) - (:generator 4 - (inst or x y temp) - (inst uaddcm zero-tn temp temp) - (inst addi (- fixnum-tag-mask) temp r))) - -(define-vop (fast-lognor/signed=>signed fast-signed-binop) - (:translate lognor) - (:args (x :target r :scs (signed-reg)) - (y :target r :scs (signed-reg))) - (:generator 4 - (inst or x y r) - (inst uaddcm zero-tn r r))) - -(define-vop (fast-lognor/unsigned=>unsigned fast-unsigned-binop) - (:translate lognor) - (:args (x :target r :scs (unsigned-reg)) - (y :target r :scs (unsigned-reg))) - (:generator 4 - (inst or x y r) - (inst uaddcm zero-tn r r))) - -;;; Shifting -(macrolet - ((fast-ash (name reg num tag save) - `(define-vop (,name) - (:translate ash) - (:note "inline ASH") - (:policy :fast-safe) - (:args (number :scs (,reg) :to :save) - (count :scs (signed-reg))) - (:arg-types ,num ,tag) - (:results (result :scs (,reg))) - (:result-types ,num) - (:temporary (:scs (unsigned-reg) - ,@(unless save - '(:to (:result 0)))) temp) - (:generator 8 - (inst comb :>= count zero-tn positive :nullify t) - (inst sub zero-tn count temp) - ,@(if save - '(;; Unsigned case - (inst comiclr 31 temp result :>=) - (inst b done :nullify t) - (inst mtctl temp :sar) - (inst b done) - (inst shd zero-tn number :variable result)) - '(;; Signed case - (inst comiclr 31 temp zero-tn :>=) - (inst li 31 temp) - (inst mtctl temp :sar) - (inst extrs number 0 1 temp) - (inst b done) - (inst shd temp number :variable result))) - POSITIVE - (inst subi 31 count temp) - (inst mtctl temp :sar) - (inst zdep number :variable 32 result) - DONE)))) - (fast-ash fast-ash/unsigned=>unsigned unsigned-reg unsigned-num - tagged-num t) - (fast-ash fast-ash/signed=>signed signed-reg signed-num signed-num nil)) - -(define-vop (fast-ash-c/unsigned=>unsigned) - (:translate ash) - (:note "inline ASH") - (:policy :fast-safe) - (:args (number :scs (unsigned-reg))) - (:info count) - (:arg-types unsigned-num (:constant integer)) - (:results (result :scs (unsigned-reg))) - (:result-types unsigned-num) - (:generator 1 - (cond - ((< count -31) (move zero-tn result)) - ((< count 0) (inst srl number (min (- count) 31) result)) - ((> count 0) (inst sll number (min count 31) result)) - (t (bug "identity ASH not transformed away"))))) - -(define-vop (fast-ash-c/signed=>signed) - (:translate ash) - (:note "inline ASH") - (:policy :fast-safe) - (:args (number :scs (signed-reg))) - (:info count) - (:arg-types signed-num (:constant integer)) - (:results (result :scs (signed-reg))) - (:result-types signed-num) - (:generator 1 - (cond - ((< count 0) (inst sra number (min (- count) 31) result)) - ((> count 0) (inst sll number (min count 31) result)) - (t (bug "identity ASH not transformed away"))))) - -(macrolet ((def (name sc-type type result-type cost) - `(define-vop (,name) - (:translate ash) - (:note "inline ASH") - (:policy :fast-safe) - (:args (number :scs (,sc-type)) - (amount :scs (signed-reg unsigned-reg immediate))) - (:arg-types ,type positive-fixnum) - (:results (result :scs (,result-type))) - (:result-types ,type) - (:temporary (:scs (,sc-type) :to (:result 0)) temp) - (:generator ,cost - (sc-case amount - ((signed-reg unsigned-reg) - (inst subi 31 amount temp) - (inst mtctl temp :sar) - (inst zdep number :variable 32 result)) - (immediate - (let ((amount (tn-value amount))) - (aver (> amount 0)) - (inst sll number amount result)))))))) - (def fast-ash-left/fixnum=>fixnum any-reg tagged-num any-reg 2) - (def fast-ash-left/signed=>signed signed-reg signed-num signed-reg 3) - (def fast-ash-left/unsigned=>unsigned unsigned-reg unsigned-num unsigned-reg 3)) - -(define-vop (signed-byte-32-len) - (:translate integer-length) - (:note "inline (signed-byte 32) integer-length") - (:policy :fast-safe) - (:args (arg :scs (signed-reg) :target shift)) - (:arg-types signed-num) - (:results (res :scs (any-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) shift) - (:generator 30 - (inst move arg shift :>=) - (inst uaddcm zero-tn shift shift) - (inst comb := shift zero-tn done) - (inst li 0 res) - LOOP - (inst srl shift 1 shift) - (inst comb :<> shift zero-tn loop) - (inst addi (fixnumize 1) res res) - DONE)) - -(define-vop (unsigned-byte-32-count) - (:translate logcount) - (:note "inline (unsigned-byte 32) logcount") - (:policy :fast-safe) - (:args (arg :scs (unsigned-reg) :target num)) - (:arg-types unsigned-num) - (:results (res :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0) :to (:result 0) - :target res) num) - (:temporary (:scs (non-descriptor-reg)) mask temp) - (:generator 30 - (inst li #x55555555 mask) - (inst srl arg 1 temp) - (inst and arg mask num) - (inst and temp mask temp) - (inst add num temp num) - (inst li #x33333333 mask) - (inst srl num 2 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst add num temp num) - (inst li #x0f0f0f0f mask) - (inst srl num 4 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst add num temp num) - (inst li #x00ff00ff mask) - (inst srl num 8 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst add num temp num) - (inst li #x0000ffff mask) - (inst srl num 16 temp) - (inst and num mask num) - (inst and temp mask temp) - (inst add num temp res))) - -;;; Multiply and Divide. - -(define-vop (fast-*/fixnum=>fixnum fast-fixnum-binop) - (:translate *) - (:args (x :scs (any-reg zero) :target x-pass) - (y :scs (any-reg zero) :target y-pass)) - (:temporary (:sc signed-reg :offset nl0-offset - :from (:argument 0) :to (:result 0)) x-pass) - (:temporary (:sc signed-reg :offset nl1-offset - :from (:argument 1) :to (:result 0)) y-pass) - (:temporary (:sc signed-reg :offset nl2-offset :target r - :from (:argument 1) :to (:result 0)) res-pass) - (:temporary (:sc signed-reg :offset nl3-offset :to (:result 0)) tmp) - (:temporary (:sc signed-reg :offset nl4-offset - :from (:argument 1) :to (:result 0)) sign) - (:temporary (:sc interior-reg :offset lip-offset) lip) - (:ignore lip sign) ; fix-lav: why dont we ignore tmp ? - (:generator 30 - ;; looking at the register setup above, not sure if both can clash - ;; maybe it is ok that x and x-pass share register ? like it was - (unless (location= y y-pass) - (inst sra x 2 x-pass)) - (let ((fixup (make-fixup 'multiply :assembly-routine))) - (inst ldil fixup tmp) - (inst ble fixup lisp-heap-space tmp)) - (if (location= y y-pass) - (inst sra x 2 x-pass) - (inst move y y-pass)) - (move res-pass r))) - -(define-vop (fast-*/signed=>signed fast-signed-binop) - (:translate *) - (:args (x :scs (signed-reg) :target x-pass) - (y :scs (signed-reg) :target y-pass)) - (:temporary (:sc signed-reg :offset nl0-offset - :from (:argument 0) :to (:result 0)) x-pass) - (:temporary (:sc signed-reg :offset nl1-offset - :from (:argument 1) :to (:result 0)) y-pass) - (:temporary (:sc signed-reg :offset nl2-offset :target r - :from (:argument 1) :to (:result 0)) res-pass) - (:temporary (:sc signed-reg :offset nl3-offset :to (:result 0)) tmp) - (:temporary (:sc signed-reg :offset nl4-offset - :from (:argument 1) :to (:result 0)) sign) - (:temporary (:sc interior-reg :offset lip-offset) lip) - (:ignore lip sign) - (:generator 31 - (let ((fixup (make-fixup 'multiply :assembly-routine))) - (move x x-pass) - (move y y-pass) - (inst ldil fixup tmp) - (inst ble fixup lisp-heap-space tmp) - (inst nop) - (move res-pass r)))) - -(define-vop (fast-*/unsigned=>unsigned fast-unsigned-binop) - (:translate *) - (:args (x :scs (unsigned-reg) :target x-pass) - (y :scs (unsigned-reg) :target y-pass)) - (:temporary (:sc unsigned-reg :offset nl0-offset - :from (:argument 0) :to (:result 0)) x-pass) - (:temporary (:sc unsigned-reg :offset nl1-offset - :from (:argument 1) :to (:result 0)) y-pass) - (:temporary (:sc unsigned-reg :offset nl2-offset :target r - :from (:argument 1) :to (:result 0)) res-pass) - (:temporary (:sc unsigned-reg :offset nl3-offset :to (:result 0)) tmp) - (:temporary (:sc unsigned-reg :offset nl4-offset - :from (:argument 1) :to (:result 0)) sign) - (:temporary (:sc interior-reg :offset lip-offset) lip) - (:ignore lip sign) - (:generator 31 - (let ((fixup (make-fixup 'multiply :assembly-routine))) - (move x x-pass) - (move y y-pass) - (inst ldil fixup tmp) - (inst ble fixup lisp-heap-space tmp) - (inst nop) - (move res-pass r)))) - -(define-vop (fast-truncate/fixnum fast-fixnum-binop) - (:translate truncate) - (:args (x :scs (any-reg) :target x-pass) - (y :scs (any-reg) :target y-pass)) - (:temporary (:sc signed-reg :offset nl0-offset - :from (:argument 0) :to (:result 0)) x-pass) - (:temporary (:sc signed-reg :offset nl1-offset - :from (:argument 1) :to (:result 0)) y-pass) - (:temporary (:sc signed-reg :offset nl2-offset :target q - :from (:argument 1) :to (:result 0)) q-pass) - (:temporary (:sc signed-reg :offset nl3-offset :target r - :from (:argument 1) :to (:result 1)) r-pass) - (:results (q :scs (any-reg)) - (r :scs (any-reg))) - (:result-types tagged-num tagged-num) - (:vop-var vop) - (:save-p :compute-only) - (:generator 30 - (let ((zero (generate-error-code vop 'division-by-zero-error x y))) - (inst bc := nil y zero-tn zero)) - (move x x-pass) - (move y y-pass) - (let ((fixup (make-fixup 'truncate :assembly-routine))) - (inst ldil fixup q-pass) - (inst ble fixup lisp-heap-space q-pass :nullify t)) - (inst nop) - (inst sll q-pass n-fixnum-tag-bits q) - ;(move q-pass q) - (move r-pass r))) - -#+(or) ;; This contains two largely-inexplicable hacks, and there's no - ;; equivalent VOP for either Alpha or ARM. Why is this even - ;; here? -- AB, 2015-11-19 -(define-vop (fast-truncate/unsigned fast-unsigned-binop) - (:translate truncate) - (:args (x :scs (unsigned-reg) :target x-pass) - (y :scs (unsigned-reg) :target y-pass)) - (:temporary (:sc unsigned-reg :offset nl0-offset - :from (:argument 0) :to (:result 0)) x-pass) - (:temporary (:sc unsigned-reg :offset nl1-offset - :from (:argument 1) :to (:result 0)) y-pass) - (:temporary (:sc unsigned-reg :offset nl2-offset :target q - :from (:argument 1) :to (:result 0)) q-pass) - (:temporary (:sc unsigned-reg :offset nl3-offset :target r - :from (:argument 1) :to (:result 1)) r-pass) - (:results (q :scs (unsigned-reg)) - (r :scs (unsigned-reg))) - (:result-types unsigned-num unsigned-num) - (:vop-var vop) - (:save-p :compute-only) - (:generator 35 - (let ((zero (generate-error-code vop 'division-by-zero-error x y))) - (inst bc := nil y zero-tn zero)) - (move x x-pass) - (move y y-pass) - ;; really dirty trick to avoid the bug truncate/unsigned vop - ;; followed by move-from/word->fixnum where the result from - ;; the truncate is 0xe39516a7 and move-from-word will treat - ;; the unsigned high number as an negative number. - ;; instead we clear the high bit in the input to truncate. - (inst li #x1fffffff q) - (inst comb :<> q y skip :nullify t) - (inst addi -1 zero-tn q) - (inst srl q 1 q) ; this should result in #7fffffff - (inst and x-pass q x-pass) - (inst and y-pass q y-pass) - SKIP - ;; fix bug#2 (truncate #xe39516a7 #x3) => #0xf687078d,#x0 - (inst li #x7fffffff q) - (inst and x-pass q x-pass) - (let ((fixup (make-fixup 'truncate :assembly-routine))) - (inst ldil fixup q-pass) - (inst ble fixup lisp-heap-space q-pass :nullify t)) - (inst nop) - (move q-pass q) - (move r-pass r))) - -(define-vop (fast-truncate/signed fast-signed-binop) - (:translate truncate) - (:args (x :scs (signed-reg) :target x-pass) - (y :scs (signed-reg) :target y-pass)) - (:temporary (:sc signed-reg :offset nl0-offset - :from (:argument 0) :to (:result 0)) x-pass) - (:temporary (:sc signed-reg :offset nl1-offset - :from (:argument 1) :to (:result 0)) y-pass) - (:temporary (:sc signed-reg :offset nl2-offset :target q - :from (:argument 1) :to (:result 0)) q-pass) - (:temporary (:sc signed-reg :offset nl3-offset :target r - :from (:argument 1) :to (:result 1)) r-pass) - (:results (q :scs (signed-reg)) - (r :scs (signed-reg))) - (:result-types signed-num signed-num) - (:vop-var vop) - (:save-p :compute-only) - (:generator 35 - (let ((zero (generate-error-code vop 'division-by-zero-error x y))) - (inst bc := nil y zero-tn zero)) - (move x x-pass) - (move y y-pass) - (let ((fixup (make-fixup 'truncate :assembly-routine))) - (inst ldil fixup q-pass) - (inst ble fixup lisp-heap-space q-pass :nullify t)) - (inst nop) - (move q-pass q) - (move r-pass r))) - - -;;;; Binary conditional VOPs: - -(define-vop (fast-conditional) - (:conditional) - (:info target not-p) - (:policy :fast-safe)) - -(define-vop (fast-conditional/fixnum fast-conditional) - (:args (x :scs (any-reg)) - (y :scs (any-reg))) - (:arg-types tagged-num tagged-num) - (:note "inline fixnum comparison")) - -(define-vop (fast-conditional-c/fixnum fast-conditional/fixnum) - (:args (x :scs (any-reg))) - (:arg-types tagged-num (:constant (signed-byte 9))) - (:info target not-p y)) - -(define-vop (fast-conditional/signed fast-conditional) - (:args (x :scs (signed-reg)) - (y :scs (signed-reg))) - (:arg-types signed-num signed-num) - (:note "inline (signed-byte 32) comparison")) - -(define-vop (fast-conditional-c/signed fast-conditional/signed) - (:args (x :scs (signed-reg))) - (:arg-types signed-num (:constant (signed-byte 11))) - (:info target not-p y)) - -(define-vop (fast-conditional/unsigned fast-conditional) - (:args (x :scs (unsigned-reg)) - (y :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num) - (:note "inline (unsigned-byte 32) comparison")) - -(define-vop (fast-conditional-c/unsigned fast-conditional/unsigned) - (:args (x :scs (unsigned-reg))) - (:arg-types unsigned-num (:constant (signed-byte 11))) - (:info target not-p y)) - - -(defmacro define-conditional-vop (translate signed-cond unsigned-cond) - `(progn - ,@(mapcar #'(lambda (suffix cost signed imm) - (unless (and (member suffix '(/fixnum -c/fixnum)) - (eq translate 'eql)) - `(define-vop (,(intern (format nil "~:@(FAST-IF-~A~A~)" - translate suffix)) - ,(intern - (format nil "~:@(FAST-CONDITIONAL~A~)" - suffix))) - (:translate ,translate) - (:generator ,cost - (inst ,(if imm 'bci 'bc) - ,(if signed signed-cond unsigned-cond) - not-p - ,(if (eq suffix '-c/fixnum) - '(fixnumize y) - 'y) - x - target))))) - '(/fixnum -c/fixnum /signed -c/signed /unsigned -c/unsigned) - '(3 2 5 4 5 4) - '(t t t t nil nil) - '(nil t nil t nil t)))) - -;; We switch < and > because the immediate has to come first. - -(define-conditional-vop < :> :>>) -(define-conditional-vop > :< :<<) - -;;; EQL/FIXNUM is funny because the first arg can be of any type, not just a -;;; known fixnum. -;;; -(define-conditional-vop eql := :=) - -;;; These versions specify a fixnum restriction on their first arg. We have -;;; also generic-eql/fixnum VOPs which are the same, but have no restriction on -;;; the first arg and a higher cost. The reason for doing this is to prevent -;;; fixnum specific operations from being used on word integers, spuriously -;;; consing the argument. -;;; -(define-vop (fast-eql/fixnum fast-conditional) - (:args (x :scs (any-reg)) - (y :scs (any-reg))) - (:arg-types tagged-num tagged-num) - (:note "inline fixnum comparison") - (:translate eql) - (:generator 3 - (inst bc := not-p x y target))) -;;; -(define-vop (generic-eql/fixnum fast-eql/fixnum) - (:args (x :scs (any-reg descriptor-reg)) - (y :scs (any-reg))) - (:arg-types * tagged-num) - (:variant-cost 7)) - -(define-vop (fast-eql-c/fixnum fast-conditional/fixnum) - (:args (x :scs (any-reg))) - (:arg-types tagged-num (:constant (signed-byte 9))) - (:info target not-p y) - (:translate eql) - (:generator 2 - (inst bci := not-p (fixnumize y) x target))) -;;; -(define-vop (generic-eql-c/fixnum fast-eql-c/fixnum) - (:args (x :scs (any-reg descriptor-reg))) - (:arg-types * (:constant (signed-byte 9))) - (:variant-cost 6)) - - -;;;; modular functions -(define-modular-fun +-mod32 (x y) + :untagged nil 32) -(define-vop (fast-+-mod32/unsigned=>unsigned fast-+/unsigned=>unsigned) - (:translate +-mod32)) -(define-vop (fast-+-mod32-c/unsigned=>unsigned fast-+-c/unsigned=>unsigned) - (:translate +-mod32)) -(define-modular-fun --mod32 (x y) - :untagged nil 32) -(define-vop (fast---mod32/unsigned=>unsigned fast--/unsigned=>unsigned) - (:translate --mod32)) -(define-vop (fast---mod32-c/unsigned=>unsigned fast---c/unsigned=>unsigned) - (:translate --mod32)) - -(define-vop (fast-ash-left-mod32-c/unsigned=>unsigned - fast-ash-c/unsigned=>unsigned) - (:translate ash-left-mod32)) - -(define-vop (fast-ash-left-mod32/unsigned=>unsigned - fast-ash-left/unsigned=>unsigned)) -(deftransform ash-left-mod32 ((integer count) - ((unsigned-byte 32) (unsigned-byte 5))) - (when (sb-c::constant-lvar-p count) - (sb-c::give-up-ir1-transform)) - '(%primitive fast-ash-left-mod32/unsigned=>unsigned integer count)) - -;;; logical operations -(define-modular-fun lognot-mod32 (x) lognot :untagged nil 32) -(define-vop (lognot-mod32/unsigned=>unsigned) - (:translate lognot-mod32) - (:args (x :scs (unsigned-reg))) - (:arg-types unsigned-num) - (:results (res :scs (unsigned-reg))) - (:result-types unsigned-num) - (:policy :fast-safe) - (:generator 1 - (inst uaddcm zero-tn x res))) - -(define-modular-fun lognor-mod32 (x y) lognor :untagged nil 32) -(define-vop (fast-lognor-mod32/unsigned=>unsigned - fast-lognor/unsigned=>unsigned) - (:translate lognor-mod32)) - -(define-source-transform logeqv (&rest args) - (if (oddp (length args)) - `(logxor ,@args) - `(lognot (logxor ,@args)))) -(define-source-transform logorc1 (x y) - `(logior (lognot ,x) ,y)) -(define-source-transform logorc2 (x y) - `(logior ,x (lognot ,y))) -(define-source-transform lognand (x y) - `(lognot (logand ,x ,y))) -(define-source-transform lognor (x y) - `(lognot (logior ,x ,y))) - -(define-vop (shift-towards-someplace) - (:policy :fast-safe) - (:args (num :scs (unsigned-reg)) - (amount :scs (signed-reg))) - (:arg-types unsigned-num tagged-num) - (:results (r :scs (unsigned-reg))) - (:result-types unsigned-num)) - -(define-vop (shift-towards-start shift-towards-someplace) - (:translate shift-towards-start) - (:temporary (:scs (unsigned-reg) :to (:result 0)) temp) - (:note "SHIFT-TOWARDS-START") - (:generator 1 - (inst subi 31 amount temp) - (inst mtctl temp :sar) - (inst zdep num :variable 32 r))) - -(define-vop (shift-towards-end shift-towards-someplace) - (:translate shift-towards-end) - (:note "SHIFT-TOWARDS-END") - (:generator 1 - (inst mtctl amount :sar) - (inst shd zero-tn num :variable r))) - - - -;;;; Bignum stuff. - -(define-vop (bignum-length get-header-data) - (:translate sb-bignum:%bignum-length) - (:policy :fast-safe)) - -(define-vop (bignum-set-length set-header-data) - (:translate sb-bignum:%bignum-set-length) - (:policy :fast-safe)) - -(define-full-reffer bignum-ref * bignum-digits-offset other-pointer-lowtag - (unsigned-reg) unsigned-num sb-bignum:%bignum-ref) - -(define-full-setter bignum-set * bignum-digits-offset other-pointer-lowtag - (unsigned-reg) unsigned-num sb-bignum:%bignum-set) - -(define-vop (digit-0-or-plus) - (:translate sb-bignum:%digit-0-or-plusp) - (:policy :fast-safe) - (:args (digit :scs (unsigned-reg))) - (:arg-types unsigned-num) - (:conditional) - (:info target not-p) - (:generator 2 - (inst bc :>= not-p digit zero-tn target))) - -(define-vop (add-w/carry) - (:translate sb-bignum:%add-with-carry) - (:policy :fast-safe) - (:args (a :scs (unsigned-reg)) - (b :scs (unsigned-reg)) - (c :scs (any-reg))) - (:arg-types unsigned-num unsigned-num positive-fixnum) - (:results (result :scs (unsigned-reg)) - (carry :scs (unsigned-reg))) - (:result-types unsigned-num positive-fixnum) - (:generator 3 - (inst addi -1 c zero-tn) - (inst addc a b result) - (inst addc zero-tn zero-tn carry))) - -(define-vop (sub-w/borrow) - (:translate sb-bignum:%subtract-with-borrow) - (:policy :fast-safe) - (:args (a :scs (unsigned-reg)) - (b :scs (unsigned-reg)) - (c :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num positive-fixnum) - (:results (result :scs (unsigned-reg)) - (borrow :scs (unsigned-reg))) - (:result-types unsigned-num positive-fixnum) - (:generator 4 - (inst addi -1 c zero-tn) - (inst subb a b result) - (inst addc zero-tn zero-tn borrow))) - -(define-vop (bignum-mult) - (:translate sb-bignum:%multiply) - (:policy :fast-safe) - (:args (x-arg :scs (unsigned-reg) :target x) - (y-arg :scs (unsigned-reg) :target y)) - (:arg-types unsigned-num unsigned-num) - (:temporary (:scs (signed-reg) :from (:argument 0)) x) - (:temporary (:scs (signed-reg) :from (:argument 1)) y) - (:temporary (:scs (signed-reg)) tmp) - (:results (hi :scs (unsigned-reg)) - (lo :scs (unsigned-reg))) - (:result-types unsigned-num unsigned-num) - (:generator 3 - ;; Make sure X is less then Y. - (inst comclr x-arg y-arg tmp :<<) - (inst xor x-arg y-arg tmp) - (inst xor x-arg tmp x) - (inst xor y-arg tmp y) - - ;; Blow out of here if the result is zero. - (inst li 0 hi) - (inst comb := x zero-tn done) - (inst li 0 lo) - (inst li 0 tmp) - - LOOP - (inst comb :ev x zero-tn next-bit) - (inst srl x 1 x) - (inst add lo y lo) - (inst addc hi tmp hi) - NEXT-BIT - (inst add y y y) - (inst comb :<> x zero-tn loop) - (inst addc tmp tmp tmp) - - DONE)) - -(define-source-transform sb-bignum:%multiply-and-add (x y carry &optional (extra 0)) - #+nil ;; This would be greate if it worked, but it doesn't. - (if (eql extra 0) - `(multiple-value-call #'sb-bignum:%dual-word-add - (sb-bignum:%multiply ,x ,y) - (values ,carry)) - `(multiple-value-call #'sb-bignum:%dual-word-add - (multiple-value-call #'sb-bignum:%dual-word-add - (sb-bignum:%multiply ,x ,y) - (values ,carry)) - (values ,extra))) - (with-unique-names (hi lo) - (if (eql extra 0) - `(multiple-value-bind (,hi ,lo) (sb-bignum:%multiply ,x ,y) - (sb-bignum::%dual-word-add ,hi ,lo ,carry)) - `(multiple-value-bind (,hi ,lo) (sb-bignum:%multiply ,x ,y) - (multiple-value-bind - (,hi ,lo) - (sb-bignum::%dual-word-add ,hi ,lo ,carry) - (sb-bignum::%dual-word-add ,hi ,lo ,extra)))))) - -(defknown sb-bignum::%dual-word-add - (sb-bignum:bignum-element-type sb-bignum:bignum-element-type sb-bignum:bignum-element-type) - (values sb-bignum:bignum-element-type sb-bignum:bignum-element-type) - (flushable movable)) - -(define-vop (dual-word-add) - (:policy :fast-safe) - (:translate sb-bignum::%dual-word-add) - (:args (hi :scs (unsigned-reg) :to (:result 1)) - (lo :scs (unsigned-reg)) - (extra :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num unsigned-num) - (:results (hi-res :scs (unsigned-reg) :from (:result 1)) - (lo-res :scs (unsigned-reg) :from (:result 0))) - (:result-types unsigned-num unsigned-num) - (:generator 3 - (inst add lo extra lo-res) - (inst addc hi zero-tn hi-res))) - -(define-vop (bignum-lognot lognot-mod32/unsigned=>unsigned) - (:translate sb-bignum:%lognot)) - -(define-vop (fixnum-to-digit) - (:translate sb-bignum:%fixnum-to-digit) - (:policy :fast-safe) - (:args (fixnum :scs (any-reg))) - (:arg-types tagged-num) - (:results (digit :scs (unsigned-reg))) - (:result-types unsigned-num) - (:generator 1 - (inst sra fixnum n-fixnum-tag-bits digit))) - -(define-vop (bignum-floor) - (:translate sb-bignum:%bigfloor) - (:policy :fast-safe) - (:args (hi :scs (unsigned-reg) :to (:argument 1)) - (lo :scs (unsigned-reg) :to (:argument 0)) - (divisor :scs (unsigned-reg))) - (:arg-types unsigned-num unsigned-num unsigned-num) - (:temporary (:scs (unsigned-reg) :to (:argument 1)) temp) - (:results (quo :scs (unsigned-reg) :from (:argument 0)) - (rem :scs (unsigned-reg) :from (:argument 1))) - (:result-types unsigned-num unsigned-num) - (:generator 65 - (inst sub zero-tn divisor temp) - (inst ds zero-tn temp zero-tn) - (inst add lo lo quo) - (inst ds hi divisor rem) - (inst addc quo quo quo) - (dotimes (i 31) - (inst ds rem divisor rem) - (inst addc quo quo quo)) - (inst comclr rem zero-tn zero-tn :>=) - (inst add divisor rem rem))) - -(define-vop (signify-digit) - (:translate sb-bignum:%fixnum-digit-with-correct-sign) - (:policy :fast-safe) - (:args (digit :scs (unsigned-reg) :target res)) - (:arg-types unsigned-num) - (:results (res :scs (any-reg signed-reg))) - (:result-types signed-num) - (:generator 1 - (sc-case res - (any-reg - (inst sll digit n-fixnum-tag-bits res)) - (signed-reg - (move digit res))))) - -(define-vop (digit-lshr) - (:translate sb-bignum:%digit-logical-shift-right) - (:policy :fast-safe) - (:args (digit :scs (unsigned-reg)) - (count :scs (unsigned-reg))) - (:arg-types unsigned-num positive-fixnum) - (:results (result :scs (unsigned-reg))) - (:result-types unsigned-num) - (:generator 2 - (inst mtctl count :sar) - (inst shd zero-tn digit :variable result))) - -(define-vop (digit-ashr digit-lshr) - (:translate sb-bignum:%ashr) - (:temporary (:scs (unsigned-reg) :to (:result 0)) temp) - (:generator 1 - (inst extrs digit 0 1 temp) - (inst mtctl count :sar) - (inst shd temp digit :variable result))) - -(define-vop (digit-ashl digit-ashr) - (:translate sb-bignum:%ashl) - (:generator 1 - (inst subi 31 count temp) - (inst mtctl temp :sar) - (inst zdep digit :variable 32 result))) diff --git a/src/compiler/hppa/array.lisp b/src/compiler/hppa/array.lisp deleted file mode 100644 index ee5cc90d80..0000000000 --- a/src/compiler/hppa/array.lisp +++ /dev/null @@ -1,382 +0,0 @@ -;;;; the HPPA definitions for array operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; Allocator for the array header. -(define-vop (make-array-header) - (:translate make-array-header) - (:policy :fast-safe) - (:args (type :scs (any-reg)) - (rank :scs (any-reg))) - (:arg-types positive-fixnum positive-fixnum) - (:temporary (:scs (any-reg)) bytes) - (:temporary (:scs (non-descriptor-reg)) header) - (:results (result :scs (descriptor-reg))) - (:generator 13 - ;; Note: Cant use addi, the immediate is too large - (inst li (+ (* (1+ array-dimensions-offset) n-word-bytes) - lowtag-mask) header) - (inst add header rank bytes) - (inst li (lognot lowtag-mask) header) - (inst and bytes header bytes) - (inst addi (fixnumize (1- array-dimensions-offset)) rank header) - (inst sll header n-widetag-bits header) - (inst or header type header) - (inst srl header n-fixnum-tag-bits header) - (pseudo-atomic () - (set-lowtag other-pointer-lowtag alloc-tn result) - (storew header result 0 other-pointer-lowtag) - (inst add bytes alloc-tn alloc-tn)))) - - -;;;; Additional accessors and setters for the array header. -(define-full-reffer %array-dimension * - array-dimensions-offset other-pointer-lowtag - (any-reg) positive-fixnum %array-dimension) - -(define-full-setter %set-array-dimension * - array-dimensions-offset other-pointer-lowtag - (any-reg) positive-fixnum %set-array-dimension) - -(define-vop (array-rank-vop) - (:translate %array-rank) - (:policy :fast-safe) - (:args (x :scs (descriptor-reg))) - (:results (res :scs (any-reg descriptor-reg))) - (:generator 6 - (loadw res x 0 other-pointer-lowtag) - (inst sra res n-widetag-bits res) - (inst addi (- (1- array-dimensions-offset)) res res) - (inst sll res n-fixnum-tag-bits res))) - -;;;; Bounds checking routine. -(define-vop (check-bound) - (:translate %check-bound) - (:policy :fast-safe) - (:args (array :scs (descriptor-reg)) - (bound :scs (any-reg descriptor-reg)) - (index :scs (any-reg descriptor-reg))) - (:vop-var vop) - (:save-p :compute-only) - (:generator 5 - (let ((error (generate-error-code vop 'invalid-array-index-error - array bound index))) - (%test-fixnum index nil error t) - (inst bc :>>= nil index bound error)))) - - -;;;; Accessors/Setters - -;;; Variants built on top of word-index-ref, etc. I.e. those vectors whos -;;; elements are represented in integer registers and are built out of -;;; 8, 16, or 32 bit elements. -(macrolet ((def-full-data-vector-frobs (type element-type &rest scs) - `(progn - (define-full-reffer ,(symbolicate "DATA-VECTOR-REF/" type) ,type - vector-data-offset other-pointer-lowtag - ,(remove-if (lambda (x) (member x '(null zero))) scs) - ,element-type - data-vector-ref) - (define-full-setter ,(symbolicate "DATA-VECTOR-SET/" type) ,type - vector-data-offset other-pointer-lowtag ,scs ,element-type - data-vector-set))) - - (def-partial-data-vector-frobs - (type element-type size signed &rest scs) - `(progn - (define-partial-reffer ,(symbolicate "DATA-VECTOR-REF/" type) ,type - ,size ,signed vector-data-offset other-pointer-lowtag ,scs - ,element-type data-vector-ref) - (define-partial-setter ,(symbolicate "DATA-VECTOR-SET/" type) ,type - ,size vector-data-offset other-pointer-lowtag ,scs - ,element-type data-vector-set)))) - - (def-full-data-vector-frobs simple-vector * - descriptor-reg any-reg null zero) - - (def-partial-data-vector-frobs simple-base-string character - :byte nil character-reg) - #+sb-unicode - (def-full-data-vector-frobs simple-character-string character character-reg) - - (def-partial-data-vector-frobs simple-array-unsigned-byte-7 positive-fixnum - :byte nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-8 positive-fixnum - :byte nil unsigned-reg signed-reg) - - (def-partial-data-vector-frobs simple-array-unsigned-byte-15 positive-fixnum - :short nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-16 positive-fixnum - :short nil unsigned-reg signed-reg) - - (def-full-data-vector-frobs simple-array-unsigned-byte-31 unsigned-num - unsigned-reg) - (def-full-data-vector-frobs simple-array-unsigned-byte-32 unsigned-num - unsigned-reg) - - (def-partial-data-vector-frobs simple-array-signed-byte-8 tagged-num - :byte t signed-reg) - - (def-partial-data-vector-frobs simple-array-signed-byte-16 tagged-num - :short t signed-reg) - - (def-full-data-vector-frobs simple-array-unsigned-fixnum positive-fixnum - any-reg) - (def-full-data-vector-frobs simple-array-fixnum tagged-num - any-reg) - - (def-full-data-vector-frobs simple-array-signed-byte-32 signed-num - signed-reg)) - -;;; Integer vectors whose elements are smaller than a byte. I.e. bit, 2-bit, -;;; and 4-bit vectors. -(macrolet ((def-small-data-vector-frobs (type bits) - (let* ((elements-per-word (floor n-word-bits bits)) - (bit-shift (1- (integer-length elements-per-word)))) - `(progn - (define-vop (,(symbolicate 'data-vector-ref/ type)) - (:translate data-vector-ref) - (:note "inline array access") - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (unsigned-reg))) - (:arg-types ,type positive-fixnum) - (:results (result :scs (any-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (interior-reg)) lip) - (:temporary (:scs (non-descriptor-reg) :to (:result 0)) temp) - (:generator 20 - (inst srl index ,bit-shift temp) - (inst sh2add temp object lip) - (inst zdep index ,(- 32 (integer-length bits)) ,bit-shift temp) - ,@(unless (= bits 1) - `((inst addi ,(1- bits) temp temp))) - (inst mtctl temp :sar) - (loadw result lip vector-data-offset other-pointer-lowtag) - (inst extru result :variable ,bits result) - (inst sll result n-fixnum-tag-bits result))) - (define-vop (,(symbolicate 'data-vector-ref-c/ type)) - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:arg-types ,type (:constant index)) - (:info index) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (non-descriptor-reg) :to (:result 0)) temp) - (:generator 15 - (multiple-value-bind (word extra) (floor index ,elements-per-word) - (let ((offset (- (* (+ word vector-data-offset) n-word-bytes) - other-pointer-lowtag))) - (cond ((typep offset '(signed-byte 14)) - (inst ldw offset object result)) - (t - (inst li offset temp) - (inst ldwx object temp result)))) - (inst extru result (+ (* extra ,bits) ,(1- bits)) ,bits result)))) - (define-vop (,(symbolicate 'data-vector-set/ type)) - (:note "inline array store") - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (unsigned-reg)) - (value :scs (unsigned-reg zero immediate) :target result)) - (:arg-types ,type positive-fixnum positive-fixnum) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (non-descriptor-reg) :to (:result 0)) temp) - (:temporary (:scs (non-descriptor-reg)) old) - (:temporary (:scs (interior-reg)) lip) - (:generator 25 - (inst srl index ,bit-shift temp) - (inst sh2add temp object lip) - (inst zdep index ,(- 32 (integer-length bits)) ,bit-shift temp) - ,@(unless (= bits 1) - `((inst addi ,(1- bits) temp temp))) - (inst mtctl temp :sar) - (loadw old lip vector-data-offset other-pointer-lowtag) - (inst dep (sc-case value (immediate (tn-value value)) (t value)) - :variable ,bits old) - (storew old lip vector-data-offset other-pointer-lowtag) - (sc-case value - (immediate - (inst li (tn-value value) result)) - (t - (move value result))))) - (define-vop (,(symbolicate 'data-vector-set-c/ type)) - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (value :scs (unsigned-reg zero immediate) :target result)) - (:arg-types ,type - (:constant index) - positive-fixnum) - (:info index) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:temporary (:scs (non-descriptor-reg)) old) - (:temporary (:scs (interior-reg)) lip) - (:generator 20 - (multiple-value-bind (word extra) (floor index ,elements-per-word) - (let ((offset (- (* (+ word vector-data-offset) n-word-bytes) - other-pointer-lowtag))) - (cond ((typep offset '(signed-byte 14)) - (inst ldw offset object old)) - (t - (inst li offset lip) - (inst add object lip lip) - (inst ldw 0 lip old))) - (inst dep (sc-case value - (immediate (tn-value value)) - (t value)) - (+ (* extra ,bits) ,(1- bits)) - ,bits - old) - (if (typep offset '(signed-byte 14)) - (inst stw old offset object) - (inst stw old (ldb (byte 11 0) offset) lip))) - (sc-case value - (immediate - (inst li (tn-value value) result)) - (t - (move value result)))))))))) - (def-small-data-vector-frobs simple-bit-vector 1) - (def-small-data-vector-frobs simple-array-unsigned-byte-2 2) - (def-small-data-vector-frobs simple-array-unsigned-byte-4 4)) - -;;; And the float variants. -(macrolet - ((data-vector ((type set cost) &body body) - (let* ((typen (case type (single 'single-float) - (double 'double-float) - (t type))) - (name (symbolicate "DATA-VECTOR-" (if set "SET" "REF") - "/SIMPLE-ARRAY-" typen)) - (reg-type (symbolicate type "-REG"))) - `(define-vop (,name) - (:translate ,(symbolicate "DATA-VECTOR-" (if set "SET" "REF"))) - (:note ,(concatenate 'string "inline array " - (if set "store" "access"))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg) :to (:argument 1)) - (index :scs (any-reg) :to (:argument 0) :target offset) - ,@(if set `((value :scs (,reg-type) :target result)))) - (:arg-types ,(symbolicate "SIMPLE-ARRAY-" typen) positive-fixnum - ,@(if set `(,typen))) - (:results (,(if set 'result 'value) :scs (,reg-type))) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) offset) - (:result-types ,typen) - (:generator ,cost - ,@body))))) - (data-vector (single nil 5) - (inst addi (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag) - index offset) - (inst fldx offset object value)) - (data-vector (single t 5) - (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - index offset) - (inst fstx value offset object) - (unless (location= result value) - (inst funop :copy value result))) - (data-vector (double nil 7) - (inst sll index 1 offset) - (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - offset offset) - (inst fldx offset object value)) - (data-vector (double t 7) - (inst sll index 1 offset) - (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - offset offset) - (inst fstx value offset object) - (unless (location= result value) - (inst funop :copy value result)))) - -(macrolet - ((data-vector ((type set cost) &body body) - (let* ((typen (case type (complex-single 'complex-single-float) - (complex-double 'complex-double-float) - (t type))) - (name (symbolicate "DATA-VECTOR-" (if set "SET" "REF") - "/SIMPLE-ARRAY-" typen)) - (reg-type (symbolicate type "-REG"))) - `(define-vop (,name) - (:translate ,(symbolicate "DATA-VECTOR-" (if set "SET" "REF"))) - (:note ,(concatenate 'string "inline array " - (if set "store" "access"))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg) :to :result) - (index :scs (any-reg)) - ,@(if set `((value :scs (,reg-type) :target result)))) - (:arg-types ,(symbolicate "SIMPLE-ARRAY-" typen) positive-fixnum - ,@(if set `(,typen))) - (:results (,(if set 'result 'value) :scs (,reg-type))) - (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) - (:result-types ,typen) - (:generator ,cost - ,@body))))) - (data-vector (complex-single nil 5) - (inst sll index 1 offset) - (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - offset offset) - (let ((real-tn (complex-single-reg-real-tn value))) - (inst fldx offset object real-tn)) - (let ((imag-tn (complex-single-reg-imag-tn value))) - (inst addi n-word-bytes offset offset) - (inst fldx offset object imag-tn))) - (data-vector (complex-single t 5) - (inst sll index 1 offset) - (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - offset offset) - (let ((value-real (complex-single-reg-real-tn value)) - (result-real (complex-single-reg-real-tn result))) - (inst fstx value-real offset object) - (unless (location= result-real value-real) - (inst funop :copy value-real result-real))) - (let ((value-imag (complex-single-reg-imag-tn value)) - (result-imag (complex-single-reg-imag-tn result))) - (inst addi n-word-bytes offset offset) - (inst fstx value-imag offset object) - (unless (location= result-imag value-imag) - (inst funop :copy value-imag result-imag)))) - (data-vector (complex-double nil 7) - (inst sll index 2 offset) - (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - offset offset) - (let ((real-tn (complex-double-reg-real-tn value))) - (inst fldx offset object real-tn)) - (let ((imag-tn (complex-double-reg-imag-tn value))) - (inst addi (* 2 n-word-bytes) offset offset) - (inst fldx offset object imag-tn))) - (data-vector (complex-double t 20) - (inst sll index 2 offset) - (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - offset offset) - (let ((value-real (complex-double-reg-real-tn value)) - (result-real (complex-double-reg-real-tn result))) - (inst fstx value-real offset object) - (unless (location= result-real value-real) - (inst funop :copy value-real result-real))) - (let ((value-imag (complex-double-reg-imag-tn value)) - (result-imag (complex-double-reg-imag-tn result))) - (inst addi (* 2 n-word-bytes) offset offset) - (inst fstx value-imag offset object) - (unless (location= result-imag value-imag) - (inst funop :copy value-imag result-imag))))) - - -;;; These vops are useful for accessing the bits of a vector irrespective of -;;; what type of vector it is. -(define-full-reffer vector-raw-bits * vector-data-offset other-pointer-lowtag - (unsigned-reg) unsigned-num %vector-raw-bits) -(define-full-setter set-vector-raw-bits * vector-data-offset other-pointer-lowtag - (unsigned-reg) unsigned-num %set-vector-raw-bits) diff --git a/src/compiler/hppa/c-call.lisp b/src/compiler/hppa/c-call.lisp deleted file mode 100644 index 902a68966c..0000000000 --- a/src/compiler/hppa/c-call.lisp +++ /dev/null @@ -1,324 +0,0 @@ -;;;; VOPs and other machine-specific support routines for call-out to C - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(defstruct arg-state - (stack-frame-size 0) - (float-args 0) - nargs) - -;;; beware that we deal alot here with register-offsets directly -;;; instead of their symbol-name in vm.lisp -;;; offset works differently depending on sc-type -(defun my-make-wired-tn (prim-type-name sc-name offset state) - (make-wired-tn (primitive-type-or-lose prim-type-name) - (sc-number-or-lose sc-name) - ;; try to utilize vm.lisp definitions of registers: - (ecase sc-name - ((any-reg sap-reg signed-reg unsigned-reg) - (ecase offset ; FIX: port to other arch ??? - ;(:nfp-offset offset) - (0 nl0-offset) ; On other arch we can - (1 nl1-offset) ; just add an offset to - (2 nl2-offset) ; beginning of args, but on - (3 nl3-offset) ; hppa c-args are spread. - (4 nl4-offset) ; These two are for - (5 nl5-offset))) ; c-return values - ((single-int-carg-reg double-int-carg-reg) - (ecase offset ; FIX: port to other arch ??? - (0 nl0-offset) - (1 nl1-offset) - (2 nl2-offset) - (3 nl3-offset))) - ((single-reg double-reg) ; only for return - (+ 4 offset)) - ;; A tn of stack type tells us that we have data on - ;; stack. This offset is current argument number so - ;; -1 points to the correct place to write that data - ((sap-stack signed-stack unsigned-stack) - (- (arg-state-nargs state) offset 8 1))))) - -(define-alien-type-method (integer :arg-tn) (type state) - (let ((stack-frame-size (arg-state-stack-frame-size state))) - (setf (arg-state-stack-frame-size state) (1+ stack-frame-size)) - (multiple-value-bind - (ptype reg-sc stack-sc) - (if (alien-integer-type-signed type) - (values 'signed-byte-32 'signed-reg 'signed-stack) - (values 'unsigned-byte-32 'unsigned-reg 'unsigned-stack)) - (if (< stack-frame-size 4) - (my-make-wired-tn ptype reg-sc stack-frame-size state) - (my-make-wired-tn ptype stack-sc stack-frame-size state))))) - -(define-alien-type-method (system-area-pointer :arg-tn) (type state) - (declare (ignore type)) - (let ((stack-frame-size (arg-state-stack-frame-size state))) - (setf (arg-state-stack-frame-size state) (1+ stack-frame-size)) - (if (< stack-frame-size 4) - (my-make-wired-tn 'system-area-pointer - 'sap-reg - stack-frame-size state) - (my-make-wired-tn 'system-area-pointer - 'sap-stack - stack-frame-size state)))) - -(define-alien-type-method (double-float :arg-tn) (type state) - (declare (ignore type)) - (let ((stack-frame-size (logandc2 (1+ (arg-state-stack-frame-size state)) 1)) - (float-args (arg-state-float-args state))) - (setf (arg-state-stack-frame-size state) (+ stack-frame-size 2)) - (setf (arg-state-float-args state) (+ 2 float-args)) - (cond ((>= stack-frame-size 4) - (my-make-wired-tn 'double-float - 'double-stack - stack-frame-size state)) - (t - (my-make-wired-tn 'double-float - 'double-reg - (1+ float-args) state))))) - -(define-alien-type-method (single-float :arg-tn) (type state) - (declare (ignore type)) - (let ((stack-frame-size (arg-state-stack-frame-size state)) - (float-args (arg-state-float-args state))) - (setf (arg-state-stack-frame-size state) (1+ stack-frame-size)) - (setf (arg-state-float-args state) (1+ float-args)) - (cond ((>= stack-frame-size 4) - (my-make-wired-tn 'single-float - 'single-stack - stack-frame-size state)) - (t - (my-make-wired-tn 'single-float - 'single-reg - float-args state))))) - -(defstruct result-state - (num-results 0)) - -(define-alien-type-method (integer :result-tn) (type state) - (let ((num-results (result-state-num-results state))) - (setf (result-state-num-results state) (1+ num-results)) - (multiple-value-bind (ptype reg-sc) - (if (alien-integer-type-signed type) - (values 'signed-byte-32 'signed-reg) - (values 'unsigned-byte-32 'unsigned-reg)) - (if (> num-results 1) (error "Too many result values from c-call.")) - (my-make-wired-tn ptype reg-sc (+ num-results 4) state)))) - -(define-alien-type-method (system-area-pointer :result-tn) (type state) - (declare (ignore type)) - (let ((num-results (result-state-num-results state))) - (setf (result-state-num-results state) (1+ num-results)) - (if (> num-results 1) (error "Too many result values from c-call.")) - (my-make-wired-tn 'system-area-pointer 'sap-reg (+ num-results 4) state))) - -(define-alien-type-method (double-float :result-tn) (type state) - (declare (ignore type)) - (let ((num-results (result-state-num-results state))) - (setf (result-state-num-results state) (1+ num-results)) - (my-make-wired-tn 'double-float 'double-reg (* num-results 2) state))) - -(define-alien-type-method (single-float :result-tn) (type state) - (declare (ignore type)) - (let ((num-results (result-state-num-results state))) - (setf (result-state-num-results state) (1+ num-results)) - (my-make-wired-tn 'single-float 'single-reg (* num-results 2) state))) - -(define-alien-type-method (values :result-tn) (type state) - (let ((values (alien-values-type-values type))) - (when (> (length values) 2) - (error "Too many result values from c-call.")) - (mapcar (lambda (type) - (invoke-alien-type-method :result-tn type state)) - values))) - -(defun make-call-out-tns (type) - (let ((arg-state (make-arg-state)) - (nargs 0)) - (dolist (arg-type (alien-fun-type-arg-types type)) - (cond - ((alien-double-float-type-p arg-type) - (incf nargs (logior (1+ nargs) 1))) - (t (incf nargs)))) - (setf (arg-state-nargs arg-state) (logandc2 (+ nargs 8 15) 15)) - (collect ((arg-tns)) - (dolist (arg-type (alien-fun-type-arg-types type)) - (arg-tns (invoke-alien-type-method :arg-tn arg-type arg-state))) - (values (make-normal-tn *fixnum-primitive-type*) - (* n-word-bytes (logandc2 (+ nargs 8 15) 15)) - (arg-tns) - (invoke-alien-type-method :result-tn - (alien-fun-type-result-type type) - (make-result-state)))))) - -(deftransform %alien-funcall ((function type &rest args)) - (aver (sb-c::constant-lvar-p type)) - (let* ((type (sb-c::lvar-value type)) - (env (make-null-lexenv)) - (arg-types (alien-fun-type-arg-types type)) - (result-type (alien-fun-type-result-type type))) - (aver (= (length arg-types) (length args))) - ;; We need to do something special for 64-bit integer arguments - ;; and results. - (if (or (some (lambda (type) - (and (alien-integer-type-p type) - (> (sb-alien::alien-integer-type-bits type) 32))) - arg-types) - (and (alien-integer-type-p result-type) - (> (sb-alien::alien-integer-type-bits result-type) 32))) - (collect ((new-args) (lambda-vars) (new-arg-types)) - (dolist (type arg-types) - (let ((arg (gensym))) - (lambda-vars arg) - (cond ((and (alien-integer-type-p type) - (> (sb-alien::alien-integer-type-bits type) 32)) - ;; 64-bit long long types are stored in - ;; consecutive locations, endian word order, - ;; aligned to 8 bytes. - (when (oddp (length (new-args))) - (new-args nil)) - (progn (new-args `(ash ,arg -32)) - (new-args `(logand ,arg #xffffffff)) - (if (oddp (length (new-arg-types))) - (new-arg-types (parse-alien-type '(unsigned 32) env))) - (if (alien-integer-type-signed type) - (new-arg-types (parse-alien-type '(signed 32) env)) - (new-arg-types (parse-alien-type '(unsigned 32) env))) - (new-arg-types (parse-alien-type '(unsigned 32) env)))) - (t - (new-args arg) - (new-arg-types type))))) - (cond ((and (alien-integer-type-p result-type) - (> (sb-alien::alien-integer-type-bits result-type) 32)) - (let ((new-result-type - (let ((sb-alien::*values-type-okay* t)) - (parse-alien-type - (if (alien-integer-type-signed result-type) - '(values (signed 32) (unsigned 32)) - '(values (unsigned 32) (unsigned 32))) - env)))) - `(lambda (function type ,@(lambda-vars)) - (declare (ignore type)) - (multiple-value-bind - (high low) - (%alien-funcall function - ',(make-alien-fun-type - :arg-types (new-arg-types) - :result-type new-result-type) - ,@(new-args)) - (logior low (ash high 32)))))) - (t - `(lambda (function type ,@(lambda-vars)) - (declare (ignore type)) - (%alien-funcall function - ',(make-alien-fun-type - :arg-types (new-arg-types) - :result-type result-type) - ,@(new-args)))))) - (sb-c::give-up-ir1-transform)))) - -(define-vop (foreign-symbol-sap) - (:translate foreign-symbol-sap) - (:policy :fast-safe) - (:args) - (:arg-types (:constant simple-string)) - (:info foreign-symbol) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 2 - (inst li (make-fixup foreign-symbol :foreign) res))) - -#+linkage-table -(define-vop (foreign-symbol-dataref-sap) - (:translate foreign-symbol-dataref-sap) - (:policy :fast-safe) - (:args) - (:arg-types (:constant simple-string)) - (:info foreign-symbol) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:temporary (:scs (non-descriptor-reg)) addr) - (:generator 2 - (inst li (make-fixup foreign-symbol :foreign-dataref) addr) - (loadw res addr))) - -(define-vop (call-out) - (:args (function :scs (sap-reg) :target cfunc) - (args :more t)) - (:results (results :more t)) - (:ignore args results) - (:save-p t) - (:temporary (:sc any-reg :offset cfunc-offset - :from (:argument 0) :to (:result 0)) cfunc) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - ;; Not sure if using nargs is safe ( have we saved it ). - ;; but we cant use any non-descriptor-reg because c-args nl-4 is of that type - (:temporary (:sc non-descriptor-reg :offset nargs-offset) temp) - (:vop-var vop) - (:generator 0 - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (let ((fixup (make-fixup "call_into_c" :foreign))) - (inst ldil fixup temp) - (inst ble fixup c-text-space temp) - (move function cfunc t)) - (when cur-nfp - (load-stack-tn cur-nfp nfp-save))))) - -(define-vop (alloc-number-stack-space) - (:info amount) - (:result-types system-area-pointer) - (:results (result :scs (sap-reg any-reg))) - (:temporary (:scs (unsigned-reg) :to (:result 0)) temp) - (:generator 0 - ;; Because stack grows to higher addresses, we have the result - ;; pointing to an lowerer address than nsp - (move nsp-tn result) - (unless (zerop amount) - ;; hp-ux stack grows towards larger addresses and stack must be - ;; allocated in blocks of 64 bytes - (let ((delta (+ 0 (logandc2 (+ amount 63) 63)))) ; was + 16 - (cond ((< delta (ash 1 10)) - (inst addi delta nsp-tn nsp-tn)) - (t - (inst li delta temp) - (inst add nsp-tn temp nsp-tn))))))) - -(define-vop (dealloc-number-stack-space) - (:info amount) - (:policy :fast-safe) - (:temporary (:scs (unsigned-reg) :to (:result 0)) temp) - (:generator 0 - (unless (zerop amount) - (let ((delta (+ 0 (logandc2 (+ amount 63) 63)))) ; was + 16 - (cond ((< delta (ash 1 10)) - (inst addi (- delta) nsp-tn nsp-tn)) - (t - (inst li (- delta) temp) - (inst sub nsp-tn temp nsp-tn))))))) - -#-sb-xc-host -(defun alien-callback-accessor-form (type sap offset) - (let ((parsed-type type)) - (if (alien-integer-type-p parsed-type) - (let ((bits (sb-alien::alien-integer-type-bits parsed-type))) - (let ((byte-offset - (cond ((< bits n-word-bits) - (- n-word-bytes - (ceiling bits n-byte-bits))) - (t 0)))) - `(deref (sap-alien (sap+ ,sap - ,(+ byte-offset offset)) - (* ,type))))) - `(deref (sap-alien (sap+ ,sap ,offset) (* ,type)))))) - diff --git a/src/compiler/hppa/call.lisp b/src/compiler/hppa/call.lisp deleted file mode 100644 index cc34f3e6b5..0000000000 --- a/src/compiler/hppa/call.lisp +++ /dev/null @@ -1,1226 +0,0 @@ -;;;; the VM definition of function call for HPPA - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(defconstant arg-count-sc (make-sc+offset immediate-arg-scn nargs-offset)) -(defconstant closure-sc (make-sc+offset descriptor-reg-sc-number lexenv-offset)) - -;;; Make a passing location TN for a local call return PC. If standard is -;;; true, then use the standard (full call) location, otherwise use any legal -;;; location. Even in the non-standard case, this may be restricted by a -;;; desire to use a subroutine call instruction. -(defun make-return-pc-passing-location (standard) - (if standard - (make-wired-tn *backend-t-primitive-type* descriptor-reg-sc-number lra-offset) - (make-restricted-tn *backend-t-primitive-type* descriptor-reg-sc-number))) - -;;; This is similar to MAKE-RETURN-PC-PASSING-LOCATION, but makes a -;;; location to pass OLD-FP in. This is (obviously) wired in the -;;; standard convention, but is totally unrestricted in non-standard -;;; conventions, since we can always fetch it off of the stack using -;;; the arg pointer. -(defun make-old-fp-passing-location () - (make-wired-tn *fixnum-primitive-type* immediate-arg-scn ocfp-offset)) - -(defconstant old-fp-passing-offset - (make-sc+offset descriptor-reg-sc-number ocfp-offset)) - -;;; Make the TNs used to hold OLD-FP and RETURN-PC within the current -;;; function. We treat these specially so that the debugger can find -;;; them at a known location. -(defun make-old-fp-save-location (env) - (specify-save-tn - (physenv-debug-live-tn (make-normal-tn *fixnum-primitive-type*) env) - (make-wired-tn *fixnum-primitive-type* - control-stack-arg-scn - ocfp-save-offset))) - -(defun make-return-pc-save-location (env) - (let ((ptype *backend-t-primitive-type*)) - (specify-save-tn - (physenv-debug-live-tn (make-normal-tn ptype) env) - (make-wired-tn ptype control-stack-arg-scn lra-save-offset)))) - -;;; Make a TN for the standard argument count passing location. We only -;;; need to make the standard location, since a count is never passed when we -;;; are using non-standard conventions. -(defun make-arg-count-location () - (make-wired-tn *fixnum-primitive-type* immediate-arg-scn nargs-offset)) - -;;; bytes-needed-for-non-descriptor-stack-frame is the amount -;;; we grow or shrink the NSP/NFP stack. This stack is used -;;; by C-code so the convention (grow direction, grow size) -;;; is governed by the hpux+hppa ABI or linux+hppa ABI. -;;; Return the number of bytes needed for the current non-descriptor stack. -;;; We have to allocate multiples of 64 bytes -(defun bytes-needed-for-non-descriptor-stack-frame () - (logandc2 (+ (* (sb-allocated-size 'non-descriptor-stack) n-word-bytes) 63) - 63)) - -;;; Used for setting up the Old-FP in local call. -;;; -(define-vop (current-fp) - (:results (val :scs (any-reg))) - (:generator 1 - (move cfp-tn val))) - -;;; Used for computing the caller's NFP for use in known-values return. Only -;;; works assuming there is no variable size stuff on the nstack. -;;; -(define-vop (compute-old-nfp) - (:results (val :scs (any-reg))) - (:vop-var vop) - (:generator 1 - (let ((nfp (current-nfp-tn vop))) - (when nfp - (inst ldo (- (bytes-needed-for-non-descriptor-stack-frame)) - nfp val))))) - -;;; Accessing a slot from an earlier stack frame is definite hackery. -(define-vop (ancestor-frame-ref) - (:args (frame-pointer :scs (descriptor-reg)) - (variable-home-tn :load-if nil)) - (:results (value :scs (descriptor-reg any-reg))) - (:policy :fast-safe) - (:generator 4 - (aver (sc-is variable-home-tn control-stack)) - (loadw value frame-pointer (tn-offset variable-home-tn)))) -(define-vop (ancestor-frame-set) - (:args (frame-pointer :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg))) - (:results (variable-home-tn :load-if nil)) - (:policy :fast-safe) - (:generator 4 - (aver (sc-is variable-home-tn control-stack)) - (storew value frame-pointer (tn-offset variable-home-tn)))) - -(define-vop (xep-allocate-frame) - (:info start-lab) - ;; KLUDGE: Specify an explicit offset for TEMP because NARGS is a - ;; non-descriptor-reg, but is also live, yet the register allocator - ;; does not know that it is, and if TEMP collides NARGS and - ;; COMPUTE-CODE-FROM-LIP needs TEMP then we run into trouble very - ;; quickly. - (:temporary (:sc non-descriptor-reg :offset nl5-offset) temp) - (:generator 1 - ;; Make sure the function is aligned, and drop a label pointing to this - ;; function header. - (emit-alignment n-lowtag-bits) - (emit-label start-lab) - ;; Allocate function header. - (inst simple-fun-header-word) - (inst .skip (* (1- simple-fun-insts-offset) n-word-bytes)) - ;; The start of the actual code. - ;; Fix CODE, cause the function object was passed in. - (let ((entry-point (gen-label))) - (emit-label entry-point) - (inst compute-code-from-lip lip-tn entry-point temp code-tn) - ;; ### We should also save it on the stack so that the garbage - ;; collector won't forget about us if we call anyone else. - ))) - -(define-vop (xep-setup-sp) - (:vop-var vop) - (:generator 1 - (inst ldo (* n-word-bytes (sb-allocated-size 'control-stack)) - cfp-tn csp-tn) - (let ((nfp (current-nfp-tn vop))) - (when nfp - (move nsp-tn nfp) - (inst ldo (bytes-needed-for-non-descriptor-stack-frame) - nsp-tn nsp-tn))))) - -(define-vop (allocate-frame) - (:results (res :scs (any-reg)) - (nfp :scs (any-reg))) - (:info callee) - (:generator 2 - (move csp-tn res) - (inst ldo (* n-word-bytes (sb-allocated-size 'control-stack)) - csp-tn csp-tn) - (when (ir2-physenv-number-stack-p callee) - (move nsp-tn nfp) - (inst ldo (bytes-needed-for-non-descriptor-stack-frame) - nsp-tn nsp-tn)))) - -;;; Allocate a partial frame for passing stack arguments in a full call. Nargs -;;; is the number of arguments passed. If no stack arguments are passed, then -;;; we don't have to do anything. -;;; -(define-vop (allocate-full-call-frame) - (:info nargs) - (:results (res :scs (any-reg))) - (:generator 2 - (when (> nargs register-arg-count) - (move csp-tn res) - (inst ldo (* nargs n-word-bytes) csp-tn csp-tn)))) - - -;;; Fix: boil down below notes into something nicer -;;; Emit code needed at the return-point from an unknown-values call for a -;;; fixed number of values. VALUES is the head of the TN-REF list for the -;;; locations that the values are to be received into. NVALS is the number of -;;; values that are to be received (should equal the length of VALUES). -;;; -;;; MOVE-TEMP is a DESCRIPTOR-REG TN used as a temporary. -;;; -;;; This code exploits the fact that in the unknown-values convention, a -;;; single value return returns at the return PC + 8, whereas a return of other -;;; than one value returns directly at the return PC. -;;; -;;; If 0 or 1 values are expected, then we just emit an instruction to reset -;;; the SP (which will only be executed when other than 1 value is returned.) -;;; -;;; In the general case, we have to do three things: -;;; -- Default unsupplied register values. This need only be done when a -;;; single value is returned, since register values are defaulted by the -;;; called in the non-single case. -;;; -- Default unsupplied stack values. This needs to be done whenever there -;;; are stack values. -;;; -- Reset SP. This must be done whenever other than 1 value is returned, -;;; regardless of the number of values desired. -;;; -;;; The general-case code looks like this: -#| - b regs-defaulted ; Skip if MVs - nop - - move a1 null-tn ; Default register values - ... - loadi nargs 1 ; Force defaulting of stack values - move old-fp csp ; Set up args for SP resetting - -regs-defaulted - subu temp nargs register-arg-count - - bltz temp default-value-7 ; jump to default code - addu temp temp -1 - loadw move-temp old-fp-tn 6 ; Move value to correct location. - store-stack-tn val4-tn move-temp - - bltz temp default-value-8 - addu temp temp -1 - loadw move-temp old-fp-tn 7 - store-stack-tn val5-tn move-temp - - ... - -defaulting-done - move sp old-fp ; Reset SP. - - - -default-value-7 - store-stack-tn val4-tn null-tn ; Nil out 7'th value. (first on stack) - -default-value-8 - store-stack-tn val5-tn null-tn ; Nil out 8'th value. - - ... - - br defaulting-done - nop -|# - -(defun default-unknown-values (vop values nvals move-temp temp lra-label) - (declare (type (or tn-ref null) values) - (type unsigned-byte nvals) - (type tn move-temp temp)) - (cond - ((<= nvals 1) - ;; Note that this is a single-value return point. This is actually - ;; the multiple-value entry point for a single desired value, but - ;; the code location has to be here, or the debugger backtrace - ;; gets confused. - (without-scheduling () - (note-this-location vop :single-value-return) - (move ocfp-tn csp-tn t) - (inst nop)) - (when lra-label - (inst compute-code-from-lra code-tn lra-label temp code-tn))) - (t - (let ((regs-defaulted (gen-label)) - (defaulting-done (gen-label)) - (default-stack-vals (gen-label))) - (without-scheduling () - ;; Note that this is an unknown-values return point. - (note-this-location vop :unknown-return) - ;; Branch off to the MV case. - (inst b regs-defaulted) ; dont nullify - ;; If there are no stack results, clear the stack before branch. - (if (> nvals register-arg-count) ; what inst to late-branch-exec - (inst addi (fixnumize (- register-arg-count)) nargs-tn temp) - (move ocfp-tn csp-tn t))) - ;; Do the single value case. - (do ((i 1 (1+ i)) - (val (tn-ref-across values) (tn-ref-across val))) - ((= i (min nvals register-arg-count))) - (move null-tn (tn-ref-tn val))) - (when (> nvals register-arg-count) - (inst b default-stack-vals) - (move csp-tn ocfp-tn t)) - - (emit-label regs-defaulted) - - (when (> nvals register-arg-count) - ;; If there are stack results, we have to default them - ;; and clear the stack. - (collect ((defaults)) - (do ((i register-arg-count (1+ i)) - (val (do ((i 0 (1+ i)) - (val values (tn-ref-across val))) - ((= i register-arg-count) val)) - (tn-ref-across val))) - ((null val)) - - (let ((default-lab (gen-label)) - (tn (tn-ref-tn val))) - (defaults (cons default-lab tn)) - - (inst ldw (* i n-word-bytes) ocfp-tn move-temp) - (inst bc :<= nil temp zero-tn default-lab) - (inst addi (fixnumize -1) temp temp) - (store-stack-tn tn move-temp))) - - (emit-label defaulting-done) - (move ocfp-tn csp-tn) - - (let ((defaults (defaults))) - (aver defaults) - (assemble (:elsewhere) - (emit-label default-stack-vals) - (do ((remaining defaults (cdr remaining))) - ((null remaining)) - (let ((def (car remaining))) - (emit-label (car def)) - (when (null (cdr remaining)) - (inst b defaulting-done)) - (store-stack-tn (cdr def) null-tn))))))) - (when lra-label - (inst compute-code-from-lra code-tn lra-label temp code-tn))))) - (values)) - - -;;;; Unknown values receiving: - -;;; Emit code needed at the return point for an unknown-values call for an -;;; arbitrary number of values. -;;; -;;; We do the single and non-single cases with no shared code: there doesn't -;;; seem to be any potential overlap, and receiving a single value is more -;;; important efficiency-wise. -;;; -;;; When there is a single value, we just push it on the stack, returning -;;; the old SP and 1. -;;; -;;; When there is a variable number of values, we move all of the argument -;;; registers onto the stack, and return Args and Nargs. -;;; -;;; Args and Nargs are TNs wired to the named locations. We must -;;; explicitly allocate these TNs, since their lifetimes overlap with the -;;; results Start and Count (also, it's nice to be able to target them). -(defun receive-unknown-values (args nargs start count lra-label temp) - (declare (type tn args nargs start count temp)) - (let ((variable-values (gen-label)) - (done (gen-label))) - (without-scheduling () - (inst b variable-values :nullify t) - (inst nop)) ; nop because of emit-return-pc alignment - - (when lra-label - (inst compute-code-from-lra code-tn lra-label temp code-tn)) - (inst addi n-word-bytes csp-tn csp-tn) - (storew (first *register-arg-tns*) csp-tn -1) - (inst addi (- n-word-bytes) csp-tn start) - (inst li (fixnumize 1) count) - - (emit-label done) - - (assemble (:elsewhere) - (emit-label variable-values) - (when lra-label - (inst compute-code-from-lra code-tn lra-label temp code-tn)) - (do ((arg *register-arg-tns* (rest arg)) - (i 0 (1+ i))) - ((null arg)) - (storew (first arg) args i)) - (move args start) - (inst b done) - (move nargs count t))) - (values)) - -;;; VOP that can be inherited by unknown values receivers. The main thing this -;;; handles is allocation of the result temporaries. -;;; -(define-vop (unknown-values-receiver) - (:results (start :scs (any-reg)) - (count :scs (any-reg))) - (:temporary (:sc descriptor-reg :offset ocfp-offset - :from :eval :to (:result 0)) - values-start) - (:temporary (:sc any-reg :offset nargs-offset - :from :eval :to (:result 1)) - nvals) - (:temporary (:scs (non-descriptor-reg)) temp)) - - -;;; This hook in the codegen pass lets us insert code before fall-thru entry -;;; points, local-call entry points, and tail-call entry points. The default -;;; does nothing. -(defun emit-block-header (start-label trampoline-label fall-thru-p alignp) - (declare (ignore fall-thru-p alignp)) - (when trampoline-label - (emit-label trampoline-label)) - (emit-label start-label)) - - -;;;; Local call with unknown values convention return: - -;;; Non-TR local call for a fixed number of values passed according to the -;;; unknown values convention. -;;; -;;; Args are the argument passing locations, which are specified only to -;;; terminate their lifetimes in the caller. -;;; -;;; Values are the return value locations (wired to the standard passing -;;; locations). -;;; -;;; Save is the save info, which we can ignore since saving has been done. -;;; Return-PC is the TN that the return PC should be passed in. -;;; Target is a continuation pointing to the start of the called function. -;;; Nvals is the number of values received. -;;; -;;; Note: we can't use normal load-tn allocation for the fixed args, since all -;;; registers may be tied up by the more operand. Instead, we use -;;; MAYBE-LOAD-STACK-TN. -;;; -(define-vop (call-local) - (:args (cfp) - (nfp) - (args :more t)) - (:results (values :more t)) - (:save-p t) - (:move-args :local-call) - (:info arg-locs callee target nvals) - (:vop-var vop) - (:temporary (:scs (descriptor-reg) :from :eval) move-temp) - (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:sc any-reg :offset ocfp-offset :from :eval) ocfp) - (:ignore arg-locs args ocfp) - (:generator 5 - (let ((label (gen-label)) - (cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (let ((callee-nfp (callee-nfp-tn callee))) - (when callee-nfp - (maybe-load-stack-tn callee-nfp nfp))) - (maybe-load-stack-tn cfp-tn cfp) - (inst compute-lra-from-code code-tn label temp - (callee-return-pc-tn callee)) - (note-this-location vop :call-site) - (inst b target :nullify t) - (emit-return-pc label) - (default-unknown-values vop values nvals move-temp temp label) - (when cur-nfp - (load-stack-tn cur-nfp nfp-save))))) - -;;; Non-TR local call for a variable number of return values passed according -;;; to the unknown values convention. The results are the start of the values -;;; glob and the number of values received. -;;; -;;; Note: we can't use normal load-tn allocation for the fixed args, since all -;;; registers may be tied up by the more operand. Instead, we use -;;; MAYBE-LOAD-STACK-TN. -;;; -(define-vop (multiple-call-local unknown-values-receiver) - (:args (cfp) - (nfp) - (args :more t)) - (:save-p t) - (:move-args :local-call) - (:info save callee target) - (:ignore args save) - (:vop-var vop) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 20 - (let ((label (gen-label)) - (cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (let ((callee-nfp (callee-nfp-tn callee))) - (when callee-nfp - (maybe-load-stack-tn callee-nfp nfp))) - (maybe-load-stack-tn cfp-tn cfp) - (inst compute-lra-from-code code-tn label temp - (callee-return-pc-tn callee)) - (note-this-location vop :call-site) - (inst b target :nullify t) - (emit-return-pc label) - (note-this-location vop :unknown-return) - (receive-unknown-values values-start nvals start count label temp) - (when cur-nfp - (load-stack-tn cur-nfp nfp-save))))) - - -;;;; Local call with known values return: - -;;; Non-TR local call with known return locations. Known-value return works -;;; just like argument passing in local call. -;;; -;;; Note: we can't use normal load-tn allocation for the fixed args, since all -;;; registers may be tied up by the more operand. Instead, we use -;;; MAYBE-LOAD-STACK-TN. -;;; -(define-vop (known-call-local) - (:args (cfp) - (nfp) - (args :more t)) - (:results (res :more t)) - (:move-args :local-call) - (:save-p t) - (:info save callee target) - (:ignore args res save) - (:vop-var vop) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp) - (:generator 5 - (let ((label (gen-label)) - (cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (let ((callee-nfp (callee-nfp-tn callee))) - (when callee-nfp - (maybe-load-stack-tn callee-nfp nfp))) - (maybe-load-stack-tn cfp-tn cfp) - (inst compute-lra-from-code code-tn label temp - (callee-return-pc-tn callee)) - (note-this-location vop :call-site) - (inst b target :nullify t) - (emit-return-pc label) - (note-this-location vop :known-return) - (when cur-nfp - (load-stack-tn cur-nfp nfp-save))))) - -;;; Return from known values call. We receive the return locations as -;;; arguments to terminate their lifetimes in the returning function. We -;;; restore FP and CSP and jump to the Return-PC. -;;; -;;; Note: we can't use normal load-tn allocation for the fixed args, since all -;;; registers may be tied up by the more operand. Instead, we use -;;; MAYBE-LOAD-STACK-TN. -;;; -(define-vop (known-return) - (:args (ocfp :target ocfp-temp) - (return-pc :target return-pc-temp) - (vals :more t)) - (:temporary (:sc any-reg :from (:argument 0)) ocfp-temp) - (:temporary (:sc descriptor-reg :from (:argument 1)) return-pc-temp) - (:temporary (:scs (interior-reg)) lip) - (:move-args :known-return) - (:info val-locs) - (:ignore val-locs vals) - (:vop-var vop) - (:generator 6 - (maybe-load-stack-tn ocfp-temp ocfp) - (maybe-load-stack-tn return-pc-temp return-pc) - (move cfp-tn csp-tn) - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (move cur-nfp nsp-tn))) - (inst addi (- n-word-bytes other-pointer-lowtag) return-pc-temp lip) - (inst bv lip) - (move ocfp-temp cfp-tn t))) - - -;;;; Full call: -;;; -;;; There is something of a cross-product effect with full calls. Different -;;; versions are used depending on whether we know the number of arguments or -;;; the name of the called function, and whether we want fixed values, unknown -;;; values, or a tail call. -;;; -;;; In full call, the arguments are passed creating a partial frame on the -;;; stack top and storing stack arguments into that frame. On entry to the -;;; callee, this partial frame is pointed to by FP. If there are no stack -;;; arguments, we don't bother allocating a partial frame, and instead set FP -;;; to SP just before the call. - -;;; This macro helps in the definition of full call VOPs by avoiding code -;;; replication in defining the cross-product VOPs. -;;; -;;; Name is the name of the VOP to define. -;;; -;;; Named is true if the first argument is a symbol whose global function -;;; definition is to be called. -;;; -;;; Return is either :Fixed, :Unknown or :Tail: -;;; -- If :Fixed, then the call is for a fixed number of values, returned in -;;; the standard passing locations (passed as result operands). -;;; -- If :Unknown, then the result values are pushed on the stack, and the -;;; result values are specified by the Start and Count as in the -;;; unknown-values continuation representation. -;;; -- If :Tail, then do a tail-recursive call. No values are returned. -;;; The Old-Fp and Return-PC are passed as the second and third arguments. -;;; -;;; In non-tail calls, the pointer to the stack arguments is passed as the last -;;; fixed argument. If Variable is false, then the passing locations are -;;; passed as a more arg. Variable is true if there are a variable number of -;;; arguments passed on the stack. Variable cannot be specified with :Tail -;;; return. TR variable argument call is implemented separately. -;;; -;;; In tail call with fixed arguments, the passing locations are passed as a -;;; more arg, but there is no new-FP, since the arguments have been set up in -;;; the current frame. -;;; -(macrolet ((define-full-call (name named return variable) - (aver (not (and variable (eq return :tail)))) - `(define-vop (,name - ,@(when (eq return :unknown) - '(unknown-values-receiver))) - (:args - ,@(unless (eq return :tail) - '((new-fp :scs (any-reg) :to :eval))) - ,@(case named - ((nil) - '((arg-fun :target lexenv))) - (:direct) - (t - '((name :target name-pass)))) - - ,@(when (eq return :tail) - '((ocfp :target ocfp-pass) - (return-pc :target return-pc-pass))) - - ,@(unless variable '((args :more t :scs (descriptor-reg))))) - - ,@(when (eq return :fixed) - '((:results (values :more t)))) - - (:save-p ,(if (eq return :tail) :compute-only t)) - - ,@(unless (or (eq return :tail) variable) - '((:move-args :full-call))) - - (:vop-var vop) - (:info ,@(unless (or variable (eq return :tail)) '(arg-locs)) - ,@(unless variable '(nargs)) - ,@(when (eq named :direct) '(fun)) - ,@(when (eq return :fixed) '(nvals)) - step-instrumenting) - - (:ignore - ,@(unless (or variable (eq return :tail)) '(arg-locs)) - ,@(unless variable '(args))) - - (:temporary (:sc descriptor-reg - :offset ocfp-offset - :from (:argument 1) - ,@(unless (eq return :fixed) - '(:to :eval))) - ocfp-pass) - - (:temporary (:sc descriptor-reg - :offset lra-offset - :from (:argument ,(if (eq return :tail) 2 1)) - :to :eval) - return-pc-pass) - - ,@(case named - ((t) - `((:temporary (:sc descriptor-reg :offset fdefn-offset - :from (:argument ,(if (eq return :tail) 0 1)) - :to :eval) - name-pass))) - ((nil) - `((:temporary (:sc descriptor-reg :offset lexenv-offset - :from (:argument ,(if (eq return :tail) 0 1)) - :to :eval) - lexenv) - (:temporary (:scs (descriptor-reg) :from (:argument 0) :to :eval) - function)))) - - (:temporary (:sc any-reg :offset nargs-offset :to :eval) - nargs-pass) - - ,@(when variable - (mapcar (lambda (name offset) - `(:temporary (:sc descriptor-reg - :offset ,offset - :to :eval) - ,name)) - register-arg-names *register-arg-offsets*)) - ,@(when (eq return :fixed) - '((:temporary (:scs (descriptor-reg) :from :eval) move-temp))) - - (:temporary (:scs (descriptor-reg) :to :eval) stepping) - - ,@(unless (eq return :tail) - '((:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save))) - - (:temporary (:sc interior-reg :offset lip-offset) entry-point) - - (:generator ,(+ (if named 5 0) - (if variable 19 1) - (if (eq return :tail) 0 10) - 15 - (if (eq return :unknown) 25 0)) - (let* ((cur-nfp (current-nfp-tn vop)) - ,@(unless (eq return :tail) - '((lra-label (gen-label)))) - (step-done-label (gen-label)) - (filler - (remove nil - (list :load-nargs - ,@(if (eq return :tail) - '((unless (location= ocfp ocfp-pass) - :load-ocfp) - (unless (location= return-pc - return-pc-pass) - :load-return-pc) - (when cur-nfp - :frob-nfp)) - '(:comp-lra - (when cur-nfp - :frob-nfp) - :save-fp - :load-fp)))))) - (flet ((do-next-filler () - (let* ((next (pop filler)) - (what (if (consp next) (car next) next))) - (ecase what - (:load-nargs - ,@(if variable - `((inst sub csp-tn new-fp nargs-pass) - ,@(let ((index -1)) - (mapcar (lambda (name) - `(inst ldw ,(ash (incf index) - word-shift) - new-fp - ,name)) - register-arg-names))) - '((inst li (fixnumize nargs) nargs-pass)))) - ,@(if (eq return :tail) - '((:load-ocfp - (sc-case ocfp - (any-reg - (move ocfp ocfp-pass t)) - (control-stack - (inst ldw (ash (tn-offset ocfp) - word-shift) - cfp-tn ocfp-pass)))) - (:load-return-pc - (sc-case return-pc - (descriptor-reg - (move return-pc return-pc-pass t)) - (control-stack - (inst ldw (ash (tn-offset return-pc) - word-shift) - cfp-tn return-pc-pass)))) - (:frob-nfp - (inst ldo (- (bytes-needed-for-non-descriptor-stack-frame)) - nsp-tn nsp-tn))) - `((:comp-lra - (inst compute-lra-from-code code-tn lra-label - temp return-pc-pass)) - (:frob-nfp - (store-stack-tn nfp-save cur-nfp)) - (:save-fp - (move cfp-tn ocfp-pass t)) - (:load-fp - ,(if variable - '(move new-fp cfp-tn) - '(if (> nargs register-arg-count) - (move new-fp cfp-tn) - (move csp-tn cfp-tn)))))) - ((nil) - (inst nop))))) - (insert-step-instrumenting (callable-tn) - ;; Conditionally insert a conditional trap: - (when step-instrumenting - (load-symbol-value stepping sb-impl::*stepping*) - ;; If it's not zero, trap. - (inst comb := stepping zero-tn step-done-label :nullify t) - ;; CONTEXT-PC will be pointing here when the - ;; interrupt is handled, not after the BREAK. - (note-this-location vop :internal-error) - ;; Construct a trap code with the low bits from - ;; SINGLE-STEP-AROUND-TRAP and the high bits from - ;; the register number of CALLABLE-TN. - (inst break 0 (logior single-step-around-trap - (ash (reg-tn-encoding callable-tn) - 5))) - (emit-label step-done-label)))) - (declare (ignorable #'insert-step-instrumenting)) - ,@(case named - ((t) - `((sc-case name - (descriptor-reg (move name name-pass)) - (control-stack - (inst ldw (tn-byte-offset name) - cfp-tn name-pass) - (do-next-filler)) - (constant - (inst ldw (- (tn-byte-offset name) - other-pointer-lowtag) - code-tn name-pass) - (do-next-filler))) - ;; The step instrumenting must be done after - ;; FUNCTION is loaded, but before ENTRY-POINT is - ;; calculated. - (insert-step-instrumenting name-pass) - (inst ldw (- (ash fdefn-raw-addr-slot word-shift) - other-pointer-lowtag) - name-pass entry-point) - (do-next-filler))) - ((nil) - `((sc-case arg-fun - (descriptor-reg - (move arg-fun lexenv)) - (control-stack - (inst ldw (tn-byte-offset arg-fun) - cfp-tn lexenv) - (do-next-filler)) - (constant - (inst ldw - (- (tn-byte-offset arg-fun) - other-pointer-lowtag) code-tn lexenv) - (do-next-filler))) - (inst ldw (- (ash closure-fun-slot word-shift) - fun-pointer-lowtag) - lexenv function) - (do-next-filler) - ;; The step instrumenting must be done before - ;; after FUNCTION is loaded, but before ENTRY-POINT - ;; is calculated. - (insert-step-instrumenting function) - (inst addi (- (ash simple-fun-insts-offset word-shift) - fun-pointer-lowtag) - function entry-point))) - (:direct - `((inst ldw (static-fun-offset fun) null-tn entry-point)))) - (loop - (if (cdr filler) - (do-next-filler) - (return))) - - (do-next-filler) - (note-this-location vop :call-site) - (inst bv entry-point :nullify t)) - - ,@(ecase return - (:fixed - '((emit-return-pc lra-label) - (default-unknown-values vop values nvals - move-temp temp lra-label) - (when cur-nfp - (load-stack-tn cur-nfp nfp-save)))) - (:unknown - '((emit-return-pc lra-label) - (note-this-location vop :unknown-return) - (receive-unknown-values values-start nvals start count - lra-label temp) - (when cur-nfp - (load-stack-tn cur-nfp nfp-save)))) - (:tail))))))) - - (define-full-call call nil :fixed nil) - (define-full-call call-named t :fixed nil) - (define-full-call static-call-named :direct :fixed nil) - (define-full-call multiple-call nil :unknown nil) - (define-full-call multiple-call-named t :unknown nil) - (define-full-call static-multiple-call-named :direct :unknown nil) - (define-full-call tail-call nil :tail nil) - (define-full-call tail-call-named t :tail nil) - (define-full-call static-tail-call-named :direct :tail nil) - - (define-full-call call-variable nil :fixed t) - (define-full-call multiple-call-variable nil :unknown t)) - - -;;; Defined separately, since needs special code that blits the arguments -;;; down. -;;; -(define-vop (tail-call-variable) - (:args (args-arg :scs (any-reg) :target args) - (function-arg :scs (descriptor-reg) :target lexenv) - (ocfp-arg :scs (any-reg) :target ocfp) - (lra-arg :scs (descriptor-reg) :target lra)) - - (:temporary (:sc any-reg :offset nl0-offset :from (:argument 0)) args) - (:temporary (:sc any-reg :offset lexenv-offset :from (:argument 1)) lexenv) - (:temporary (:sc any-reg :offset ocfp-offset :from (:argument 2)) ocfp) - (:temporary (:sc any-reg :offset lra-offset :from (:argument 3)) lra) - (:temporary (:scs (any-reg) :from (:argument 3)) tmp) - (:vop-var vop) - (:generator 75 - ;; Move these into the passing locations if they are not already there. - (move args-arg args) - (move function-arg lexenv) - (move ocfp-arg ocfp) - (move lra-arg lra) - ;; And jump to the assembly-routine that does the bliting. - (let ((fixup (make-fixup 'tail-call-variable :assembly-routine))) - (inst ldil fixup tmp) - (inst be fixup lisp-heap-space tmp)) - ;; Pull the number stack if anything is there. - (let ((cur-nfp (current-nfp-tn vop))) - (if cur-nfp - ;;; NSP is restored by setting it to NSP, - ;;; because stack grows towards higher addresses. - (move cur-nfp nsp-tn) - (inst nop))))) - - -;;;; Unknown values return: - -;;; Return a single value using the unknown-values convention. -;;; -;;; NSP is restored by setting it to NSP, because stack grows -;;; towards higher addresses. -(define-vop (return-single) - (:args (ocfp :scs (any-reg)) - (return-pc :scs (descriptor-reg)) - (value)) - (:ignore value) - (:vop-var vop) - (:generator 6 - ;; Clear the number stack. - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (move cur-nfp nsp-tn))) - ;; Clear the control stack, and restore the frame pointer. - (move cfp-tn csp-tn) - (move ocfp cfp-tn) - ;; Out of here. - (lisp-return return-pc :offset 2))) - -;;; Do unknown-values return of a fixed number of values. The Values are -;;; required to be set up in the standard passing locations. Nvals is the -;;; number of values returned. -;;; -;;; If returning a single value, then deallocate the current frame, restore -;;; FP and jump to the single-value entry at Return-PC + 8. -;;; -;;; If returning other than one value, then load the number of values returned, -;;; NIL out unsupplied values registers, restore FP and return at Return-PC. -;;; When there are stack values, we must initialize the argument pointer to -;;; point to the beginning of the values block (which is the beginning of the -;;; current frame.) -;;; -(define-vop (return) - (:args (ocfp :scs (any-reg)) - (return-pc :scs (descriptor-reg) :to (:eval 1)) - (values :more t)) - (:ignore values) - (:info nvals) - (:temporary (:sc descriptor-reg :offset a0-offset :from (:eval 0)) a0) - (:temporary (:sc descriptor-reg :offset a1-offset :from (:eval 0)) a1) - (:temporary (:sc descriptor-reg :offset a2-offset :from (:eval 0)) a2) - (:temporary (:sc descriptor-reg :offset a3-offset :from (:eval 0)) a3) - (:temporary (:sc descriptor-reg :offset a4-offset :from (:eval 0)) a4) - (:temporary (:sc descriptor-reg :offset a5-offset :from (:eval 0)) a5) - (:temporary (:sc any-reg :offset nargs-offset) nargs) - (:temporary (:sc any-reg :offset ocfp-offset) val-ptr) - - (:vop-var vop) - (:generator 6 - ;; Clear the number stack. - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (move cur-nfp nsp-tn))) - (cond - ((= nvals 1) ;; Clear the control stack, and restore the frame pointer - (move cfp-tn csp-tn) - (move ocfp cfp-tn) - ;; Out of here. - (lisp-return return-pc :offset 2)) - (t - ;; Establish the values pointer and values count. - (move cfp-tn val-ptr) - (inst li (fixnumize nvals) nargs) - ;; restore the frame pointer and clear as much of the control - ;; stack as possible. - (move ocfp cfp-tn) - (inst ldo (* nvals n-word-bytes) val-ptr csp-tn) - (aver (= (* nvals n-word-bytes) (fixnumize nvals))) - ;; pre-default any argument register that need it. - (when (< nvals register-arg-count) - (dolist (reg (subseq (list a0 a1 a2 a3 a4 a5) nvals)) - (move null-tn reg))) - ;; And away we go. - (lisp-return return-pc))))) - -;;; Do unknown-values return of an arbitrary number of values (passed on the -;;; stack.) We check for the common case of a single return value, and do that -;;; inline using the normal single value return convention. Otherwise, we -;;; branch off to code that calls an assembly-routine. -;;; -(define-vop (return-multiple) - (:args (ocfp-arg :scs (any-reg) :target ocfp) - (lra-arg :scs (descriptor-reg) :target lra) - (vals-arg :scs (any-reg) :target vals) - (nvals-arg :scs (any-reg) :target nvals)) - - (:temporary (:sc any-reg :offset nl1-offset :from (:argument 0)) ocfp) - (:temporary (:sc descriptor-reg :offset lra-offset :from (:argument 1)) lra) - (:temporary (:sc any-reg :offset nl0-offset :from (:argument 2)) vals) - (:temporary (:sc any-reg :offset nargs-offset :from (:argument 3)) nvals) - (:temporary (:sc descriptor-reg :offset a0-offset) a0) - (:temporary (:scs (any-reg) :from (:eval 0)) tmp) - (:vop-var vop) - (:generator 13 - (let ((not-single (gen-label))) - ;; Clear the number stack. - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (move cur-nfp nsp-tn))) - ;; Check for the single case. - (inst comib :<> (fixnumize 1) nvals-arg not-single) - (loadw a0 vals-arg) - ;; Return with one value. - (move cfp-tn csp-tn) - (move ocfp-arg cfp-tn) - (lisp-return lra-arg :offset 2) - ;; Nope, not the single case. - (emit-label not-single) - ;; most of these moves will not be emitted and therefor - ;; isn't suitable to put in the delay slot below. But if - ;; you do, dont forget to force-emit as in (move src dst t) - (move ocfp-arg ocfp) - (move lra-arg lra) - (move vals-arg vals) - (move nvals-arg nvals) - (let ((fixup (make-fixup 'return-multiple :assembly-routine))) - (inst ldil fixup tmp) - (inst be fixup lisp-heap-space tmp :nullify t))))) - - -;;;; XEP hackery: - -;;; Get the lexical environment from its passing location. -;;; -(define-vop (setup-closure-environment) - (:temporary (:sc descriptor-reg :offset lexenv-offset :target closure - :to (:result 0)) - lexenv) - (:results (closure :scs (descriptor-reg))) - (:info label) - (:ignore label) - (:generator 6 - ;; Get result. - (move lexenv closure))) - -;;; Copy a more arg from the argument area to the end of the current frame. -;;; Fixed is the number of non-more arguments. -;;; FIXME-lav: old hppa code look smarter. -(define-vop (copy-more-arg) - (:temporary (:sc any-reg :offset nl0-offset) result) - (:temporary (:sc any-reg :offset nl1-offset) count) - (:temporary (:sc any-reg :offset nl2-offset) src) - (:temporary (:sc any-reg :offset nl3-offset) dst) - (:temporary (:sc descriptor-reg :offset l0-offset) temp) - (:info fixed) - (:generator 20 - (let ((loop (gen-label)) - (do-regs (gen-label)) - (done (gen-label))) - (when (< fixed register-arg-count) - ;; Save a pointer to the results so we can fill in register args. - ;; We don't need this if there are more fixed args than reg args. - (move csp-tn result)) - ;; Allocate the space on the stack. - (cond ((zerop fixed) - (inst comb := nargs-tn zero-tn done) - (inst add nargs-tn csp-tn csp-tn)) - (t - (inst addi (fixnumize (- fixed)) nargs-tn count) - (inst comb :<= count zero-tn done :nullify t) - (inst add count csp-tn csp-tn))) - (when (< fixed register-arg-count) - ;; We must stop when we run out of stack args, not when we run out of - ;; more args. - (inst addi (fixnumize (- register-arg-count)) nargs-tn count)) - ;; Everything of interest in registers. - (inst comb :<= count zero-tn do-regs) - ;; Initialize dst to be end of stack. - (move csp-tn dst t) - ;; Initialize src to be end of args. - (inst add nargs-tn cfp-tn src) - - (emit-label loop) - ;; decrease src, then load src into temp - (inst ldwm (- n-word-bytes) src temp) - ;; increase, compare if count >= to zero, if true, jump - (inst addib :>= (fixnumize -1) count loop) - ;; decrease dst, then store temp at dst - (inst stwm temp (- n-word-bytes) dst) - - (emit-label do-regs) - (when (< fixed register-arg-count) - ;; Now we have to deposit any more args that showed up in registers. - ;; We know there is at least one more arg, otherwise we would have - ;; branched to done up at the top. - (inst addi (- (fixnumize (1+ fixed))) nargs-tn count) - (do ((i fixed (1+ i))) - ((>= i register-arg-count)) - ;; Is this the last one? - (inst comb := count zero-tn done) - ;; Store it relative to the pointer saved at the start. - (storew (nth i *register-arg-tns*) result (- i fixed)) - ;; Decrement count. - (inst addi (- (fixnumize 1)) count count))) - (emit-label done)))) - -;;; More args are stored consequtively on the stack, starting immediately at -;;; the context pointer. The context pointer is not typed, so the lowtag is 0. -;;; -(define-vop (more-arg) - (:translate %more-arg) - (:policy :fast-safe) - (:args (context :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types * tagged-num) - (:temporary (:scs (any-reg)) temp) - (:results (value :scs (descriptor-reg any-reg))) - (:result-types *) - (:generator 5 - (inst add context index temp) - (loadw value temp))) -(define-vop (more-arg-c) - (:translate %more-arg) - (:policy :fast-safe) - (:args (context :scs (descriptor-reg))) - (:info index) - (:arg-types * (:constant (load/store-index 8 0 0))) - (:results (value :scs (descriptor-reg any-reg))) - (:result-types *) - (:generator 4 - (loadw value context index))) - -;;; Turn more arg (context, count) into a list. -(define-vop () - (:translate %listify-rest-args) - (:args (context-arg :target context :scs (descriptor-reg)) - (count-arg :target count :scs (any-reg))) - (:arg-types * tagged-num) - (:temporary (:scs (any-reg) :from (:argument 0)) context) - (:temporary (:scs (any-reg) :from (:argument 1)) count) - (:temporary (:scs (descriptor-reg) :from :eval) temp dst) - (:results (result :scs (descriptor-reg))) - (:policy :safe) - (:node-var node) - (:generator 20 - (let* ((enter (gen-label)) - (loop (gen-label)) - (done (gen-label)) - (dx-p (node-stack-allocate-p node)) - (alloc-area-tn (if dx-p csp-tn alloc-tn))) - (move context-arg context) - (move count-arg count) - ;; Check to see if there are any arguments. - (inst comb := count zero-tn done) - (move null-tn result t) - - ;; We need to do this atomically. - (pseudo-atomic () - (when dx-p - (align-csp temp)) - ;; Allocate a cons (2 words) for each item. - (set-lowtag list-pointer-lowtag alloc-area-tn result) - (move result dst) - (inst sll count 1 temp) - (inst b enter) - (inst add temp alloc-area-tn alloc-area-tn) - - ;; Store the current cons in the cdr of the previous cons. - (emit-label loop) - (inst addi (* 2 n-word-bytes) dst dst) - (storew dst dst -1 list-pointer-lowtag) - - (emit-label enter) - ;; Grab one value. - (inst ldwm n-word-bytes context temp) - ;; Dec count, and if != zero, go back for more. - (inst addib :<> (fixnumize -1) count loop) - ;; Store the value in the car (in delay slot) - (storew temp dst 0 list-pointer-lowtag) - - ;; NIL out the last cons. - (storew null-tn dst 1 list-pointer-lowtag)) - (emit-label done)))) - -;;; Return the location and size of the more arg glob created by Copy-More-Arg. -;;; Supplied is the total number of arguments supplied (originally passed in -;;; NARGS.) Fixed is the number of non-rest arguments. -;;; -;;; We must duplicate some of the work done by Copy-More-Arg, since at that -;;; time the environment is in a pretty brain-damaged state, preventing this -;;; info from being returned as values. What we do is compute -;;; supplied - fixed, and return a pointer that many words below the current -;;; stack top. -;;; -(define-vop () - (:policy :fast-safe) - (:translate sb-c::%more-arg-context) - (:args (supplied :scs (any-reg))) - (:arg-types tagged-num (:constant fixnum)) - (:info fixed) - (:results (context :scs (descriptor-reg)) - (count :scs (any-reg))) - (:result-types t tagged-num) - (:note "more-arg-context") - (:generator 5 - (inst addi (fixnumize (- fixed)) supplied count) - (inst sub csp-tn count context))) - -(define-vop (verify-arg-count) - (:policy :fast-safe) - (:args (nargs :scs (any-reg))) - (:arg-types positive-fixnum (:constant t) (:constant t)) - (:info min max) - (:vop-var vop) - (:save-p :compute-only) - (:generator 3 - (let ((err-lab - (generate-error-code vop 'invalid-arg-count-error nargs))) - (cond ((not min) - (if (zerop max) - (inst bc :<> nil nargs zero-tn err-lab) - (inst bci :<> nil (fixnumize max) nargs err-lab))) - (max - (when (plusp min) - (inst bci :> nil (fixnumize min) nargs err-lab)) - (inst bci :< nil (fixnumize max) nargs err-lab)) - ((plusp min) - (inst bci :> nil (fixnumize min) nargs err-lab)))))) - -;;; Single-stepping - -(define-vop (step-instrument-before-vop) - (:temporary (:scs (descriptor-reg)) stepping) - (:policy :fast-safe) - (:vop-var vop) - (:generator 3 - (load-symbol-value stepping sb-impl::*stepping*) - ;; If it's not zero, trap. - (inst comb := stepping zero-tn DONE :nullify t) - ;; CONTEXT-PC will be pointing here when the interrupt is handled, - ;; not after the BREAK. - (note-this-location vop :internal-error) - ;; CALLEE-REGISTER-OFFSET isn't needed for before-traps, so we - ;; can just use a bare SINGLE-STEP-BEFORE-TRAP as the code. - (inst break 0 single-step-before-trap) - DONE)) diff --git a/src/compiler/hppa/cell.lisp b/src/compiler/hppa/cell.lisp deleted file mode 100644 index 4686fd0ad6..0000000000 --- a/src/compiler/hppa/cell.lisp +++ /dev/null @@ -1,450 +0,0 @@ -;;;; the VM definition of various primitive memory access VOPs for -;;;; HPPA - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; Data object ref/set stuff. - -(define-vop (slot) - (:args (object :scs (descriptor-reg))) - (:info name offset lowtag) - (:ignore name) - (:results (result :scs (descriptor-reg any-reg))) - (:generator 1 - (loadw result object offset lowtag))) - -(define-vop (set-slot) - (:args (object :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg null zero))) - (:info name offset lowtag) - (:ignore name) - (:results) - (:generator 1 - (storew value object offset lowtag))) - -(define-vop (init-slot set-slot) - (:info name dx-p offset lowtag) - (:ignore name dx-p)) - -;;;; Symbol hacking VOPs: - -;;; The compiler likes to be able to directly SET symbols. -(define-vop (set cell-set) - (:variant symbol-value-slot other-pointer-lowtag)) - -;;; Do a cell ref with an error check for being unbound. -(define-vop (checked-cell-ref) - (:args (object :scs (descriptor-reg) :target obj-temp)) - (:results (value :scs (descriptor-reg any-reg))) - (:policy :fast-safe) - (:vop-var vop) - (:save-p :compute-only) - (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp)) - -;;; With Symbol-Value, we check that the value isn't the trap object. So -;;; Symbol-Value of NIL is NIL. -(define-vop (symbol-value checked-cell-ref) - (:translate symeval) - (:generator 9 - (move object obj-temp) - (loadw value obj-temp symbol-value-slot other-pointer-lowtag) - (let ((err-lab (generate-error-code vop 'unbound-symbol-error obj-temp))) - (inst li unbound-marker-widetag temp) - (inst bc := nil value temp err-lab)))) - -;;; Like CHECKED-CELL-REF, only we are a predicate to see if the cell is bound. -(define-vop (boundp-frob) - (:args (object :scs (descriptor-reg))) - (:conditional) - (:info target not-p) - (:policy :fast-safe) - (:temporary (:scs (descriptor-reg)) value) - (:temporary (:scs (non-descriptor-reg)) temp)) - -(define-vop (boundp boundp-frob) - (:translate boundp) - (:generator 9 - (loadw value object symbol-value-slot other-pointer-lowtag) - (inst li unbound-marker-widetag temp) - (inst bc :<> not-p value temp target))) - -(define-vop (fast-symbol-value cell-ref) - (:variant symbol-value-slot other-pointer-lowtag) - (:policy :fast) - (:translate symeval)) - -(define-vop (symbol-hash) - (:policy :fast-safe) - (:translate symbol-hash) - (:args (symbol :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (res :scs (any-reg))) - (:result-types positive-fixnum) - (:generator 2 - (loadw temp symbol symbol-hash-slot other-pointer-lowtag) - (inst dep 0 31 n-fixnum-tag-bits temp) - ;; we must go through an temporary to avoid gc - (move temp res))) - -;;; On unithreaded builds these are just copies of the non-global versions. -(define-vop (%set-symbol-global-value set)) -(define-vop (symbol-global-value symbol-value) - (:translate sym-global-val)) -(define-vop (fast-symbol-global-value fast-symbol-value) - (:translate sym-global-val)) - -;;;; Fdefinition (fdefn) objects. - -(define-vop (fdefn-fun cell-ref) - (:variant fdefn-fun-slot other-pointer-lowtag)) - -(define-vop (safe-fdefn-fun) - (:translate safe-fdefn-fun) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg) :target obj-temp)) - (:results (value :scs (descriptor-reg any-reg))) - (:vop-var vop) - (:save-p :compute-only) - (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp) - (:generator 10 - (move obj-temp object) - (loadw value obj-temp fdefn-fun-slot other-pointer-lowtag) - (let ((err-lab (generate-error-code vop 'undefined-fun-error obj-temp))) - (inst bc := nil value null-tn err-lab)))) - -(define-vop (set-fdefn-fun) - (:policy :fast-safe) - (:translate (setf fdefn-fun)) - (:args (function :scs (descriptor-reg) :target result) - (fdefn :scs (descriptor-reg))) - (:temporary (:scs (interior-reg)) lip) - (:temporary (:scs (non-descriptor-reg)) type) - (:results (result :scs (descriptor-reg))) - (:generator 38 - (let ((normal-fn (gen-label))) - (load-type type function (- fun-pointer-lowtag)) - (inst addi (- simple-fun-widetag) type type) - (inst comb := type zero-tn normal-fn) - (inst addi (- (ash simple-fun-insts-offset word-shift) fun-pointer-lowtag) - function lip) - (inst li (make-fixup 'closure-tramp :assembly-routine) lip) - (emit-label normal-fn) - (storew function fdefn fdefn-fun-slot other-pointer-lowtag) - (storew lip fdefn fdefn-raw-addr-slot other-pointer-lowtag) - (move function result)))) - -(define-vop (fdefn-makunbound) - (:policy :fast-safe) - (:translate fdefn-makunbound) - (:args (fdefn :scs (descriptor-reg) :target result)) - (:temporary (:scs (non-descriptor-reg)) temp) - (:results (result :scs (descriptor-reg))) - (:generator 38 - (storew null-tn fdefn fdefn-fun-slot other-pointer-lowtag) - (inst li (make-fixup 'undefined-tramp :assembly-routine) temp) - (storew temp fdefn fdefn-raw-addr-slot other-pointer-lowtag) - (move fdefn result))) - - -;;;; Binding and Unbinding. - -;;; BIND -- Establish VAL as a binding for SYMBOL. Save the old value and -;;; the symbol on the binding stack and stuff the new value into the -;;; symbol. -;;; -;;; See the "Chapter 9: Specials" of the SBCL Internals Manual. - -(define-vop (dynbind) - (:args (val :scs (any-reg descriptor-reg)) - (symbol :scs (descriptor-reg))) - (:temporary (:scs (descriptor-reg)) temp) - (:generator 5 - (loadw temp symbol symbol-value-slot other-pointer-lowtag) - (inst addi (* 2 n-word-bytes) bsp-tn bsp-tn) - (storew temp bsp-tn (- binding-value-slot binding-size)) - (storew symbol bsp-tn (- binding-symbol-slot binding-size)) - (storew val symbol symbol-value-slot other-pointer-lowtag))) - -(define-vop (unbind) - (:temporary (:scs (descriptor-reg)) symbol value) - (:generator 0 - (loadw symbol bsp-tn (- binding-symbol-slot binding-size)) - (loadw value bsp-tn (- binding-value-slot binding-size)) - (storew value symbol symbol-value-slot other-pointer-lowtag) - (storew zero-tn bsp-tn (- binding-symbol-slot binding-size)) - (storew zero-tn bsp-tn (- binding-value-slot binding-size)) - (inst addi (- (* 2 n-word-bytes)) bsp-tn bsp-tn))) - -(define-vop (unbind-to-here) - (:args (arg :scs (descriptor-reg any-reg) :target where)) - (:temporary (:scs (any-reg) :from (:argument 0)) where) - (:temporary (:scs (descriptor-reg)) symbol value) - (:generator 0 - (let ((loop (gen-label)) - (skip (gen-label)) - (done (gen-label))) - (move arg where) - (inst comb := where bsp-tn done :nullify t) - - (emit-label loop) - (loadw symbol bsp-tn (- binding-symbol-slot binding-size)) - (inst comb := symbol zero-tn skip) - (loadw value bsp-tn (- binding-value-slot binding-size)) - (storew value symbol symbol-value-slot other-pointer-lowtag) - (storew zero-tn bsp-tn (- binding-symbol-slot binding-size)) - - (emit-label skip) - (storew zero-tn bsp-tn (- binding-value-slot binding-size)) - (inst addi (* -2 n-word-bytes) bsp-tn bsp-tn) - (inst comb :<> where bsp-tn loop) - (inst nop) - (emit-label done)))) - - -;;;; Closure indexing. - -(define-full-reffer closure-index-ref * - closure-info-offset fun-pointer-lowtag - (descriptor-reg any-reg) * %closure-index-ref) - -(define-full-setter set-funcallable-instance-info * - funcallable-instance-info-offset fun-pointer-lowtag - (descriptor-reg any-reg null zero) * %set-funcallable-instance-info) - -(define-full-reffer funcallable-instance-info * - funcallable-instance-info-offset fun-pointer-lowtag - (descriptor-reg any-reg) * %funcallable-instance-info) - -(define-vop (closure-ref) - (:args (object :scs (descriptor-reg))) - (:results (value :scs (descriptor-reg any-reg))) - (:info offset) - (:generator 4 - (loadw value object (+ closure-info-offset offset) fun-pointer-lowtag))) - -(define-vop (closure-init) - (:args (object :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg))) - (:info offset) - (:generator 4 - (storew value object (+ closure-info-offset offset) fun-pointer-lowtag))) - -(define-vop (closure-init-from-fp) - (:args (object :scs (descriptor-reg))) - (:info offset) - (:generator 4 - (storew cfp-tn object (+ closure-info-offset offset) fun-pointer-lowtag))) - -;;;; Value Cell hackery. - -(define-vop (value-cell-ref cell-ref) - (:variant value-cell-value-slot other-pointer-lowtag)) - -(define-vop (value-cell-set cell-set) - (:variant value-cell-value-slot other-pointer-lowtag)) - - - -;;;; Instance hackery: - -(define-vop () - (:policy :fast-safe) - (:translate %instance-length) - (:args (struct :scs (descriptor-reg))) - (:results (res :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 4 - (loadw res struct 0 instance-pointer-lowtag) - (inst srl res instance-length-shift res))) - -(define-full-reffer instance-index-ref * instance-slots-offset - instance-pointer-lowtag (descriptor-reg any-reg) * %instance-ref) - -(define-full-setter instance-index-set * instance-slots-offset - instance-pointer-lowtag (descriptor-reg any-reg null zero) * %instance-set) - - - -;;;; Code object frobbing. - -(define-full-reffer code-header-ref * 0 other-pointer-lowtag - (descriptor-reg any-reg) * code-header-ref) - -(define-full-setter code-header-set * 0 other-pointer-lowtag - (descriptor-reg any-reg null zero) * code-header-set) - - -;;;; raw instance slot accessors -(macrolet ((lfloat (imm base dst &key side) - `(cond - ((< ,imm (ash 1 4)) - (inst flds ,imm ,base ,dst :side ,side)) - ((and (< ,imm (ash 1 13)) - (> ,imm 0)) - (progn - (inst li ,imm offset) - (inst fldx offset ,base ,dst :side ,side))) - (t - (error "inst fldx cant handle offset-register loaded with immediate ~s" ,imm)))) - (sfloat (src imm base &key side) - `(cond - ((< ,imm (ash 1 4)) - (inst fsts ,src ,imm ,base :side ,side)) - ((and (< ,imm (ash 1 13)) - (> ,imm 0)) - (progn - (inst ldo ,imm zero-tn offset) - (inst fstx ,src offset ,base :side ,side))) - (t - (error "inst fstx cant handle offset-register loaded with immediate ~s" ,imm)))) - (raw-instance ((type inc-offset-by set &optional complex) - &body body) - (declare (ignore inc-offset-by)) ; FIXME: remove - (let ((name (symbolicate "RAW-INSTANCE-" - (if set "SET/" "REF/") - (case type - (unsigned "WORD") - (signed "SIGNED-WORD") - (t (or complex type))))) - (type-num (cond - ((eq type 'single) - (if complex 'complex-single-float - 'single-float)) - ((eq type 'double) - (if complex 'complex-double-float - 'double-float)) - (t (symbolicate type "-NUM")))) - (type-reg (symbolicate (or complex type) "-REG"))) - `(define-vop (,name) - (:translate ,(symbolicate "%" name)) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - ,@(if set - `((value :scs (,type-reg) :target result)))) - (:arg-types * positive-fixnum ,@(if set `(,type-num))) - (:results (,(if set 'result 'value) :scs (,type-reg))) - ;; Floating-point load/store might need an extra register - ;; since an immediate displacement is only 5 signed bits. - ,@(if (member type '(single double)) - '((:temporary (:scs (non-descriptor-reg)) offset))) - (:temporary (:scs (interior-reg)) lip) - (:result-types ,type-num) - (:generator 5 - (inst add index object lip) - ,@body))))) - (raw-instance (unsigned -1 nil) - (inst ldw (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) lip value)) - - (raw-instance (unsigned -1 t) - (inst stw value (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) lip) - (move value result)) - - (raw-instance (signed -1 nil) - (inst ldw (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) lip value)) - - (raw-instance (signed -1 t) - (inst stw value (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag) lip) - (move value result)) - - (raw-instance (single -1 nil) - (let ((io (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag))) - (lfloat io lip value))) - - (raw-instance (single -1 t) - (let ((io (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag))) - (sfloat value io lip)) - (unless (location= result value) - (inst funop :copy value result))) - - (raw-instance (double -2 nil) - (let ((io (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag))) - (lfloat io lip value))) - - (raw-instance (double -2 t) - (let ((io (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag))) - (sfloat value io lip :side 0)) - (let ((io (- (* (1+ instance-slots-offset) n-word-bytes) - instance-pointer-lowtag))) - (sfloat value io lip :side 1)) - (unless (location= result value) - (inst funop :copy value result))) - - (raw-instance (single -2 nil complex-single) - (let ((io (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag))) - (lfloat io lip (complex-single-reg-real-tn value))) - (let ((io (- (* (1+ instance-slots-offset) n-word-bytes) - instance-pointer-lowtag))) - (lfloat io lip (complex-single-reg-imag-tn value)))) - - (raw-instance (single -2 t complex-single) - (let ((value-real (complex-single-reg-real-tn value)) - (result-real (complex-single-reg-real-tn result)) - (io (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag))) - - (sfloat value-real io lip) - (unless (location= result-real value-real) - (inst funop :copy value-real result-real))) - (let ((value-imag (complex-single-reg-imag-tn value)) - (result-imag (complex-single-reg-imag-tn result)) - (io (- (* (1+ instance-slots-offset) n-word-bytes) - instance-pointer-lowtag))) - (sfloat value-imag io lip) - (unless (location= result-imag value-imag) - (inst funop :copy value-imag result-imag)))) - - (raw-instance (double -4 nil complex-double) - (let ((r0 (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag)) - (r1 (- (* (+ instance-slots-offset 1) n-word-bytes) - instance-pointer-lowtag)) - (i0 (- (* (+ instance-slots-offset 2) n-word-bytes) - instance-pointer-lowtag)) - (i1 (- (* (+ instance-slots-offset 3) n-word-bytes) - instance-pointer-lowtag))) - (lfloat r0 lip (complex-double-reg-real-tn value) :side 0) - (lfloat r1 lip (complex-double-reg-real-tn value) :side 1) - (lfloat i0 lip (complex-double-reg-imag-tn value) :side 0) - (lfloat i1 lip (complex-double-reg-imag-tn value) :side 1))) - - (raw-instance (double -4 t complex-double) - (let ((value-real (complex-double-reg-real-tn value)) - (result-real (complex-double-reg-real-tn result)) - (value-imag (complex-double-reg-imag-tn value)) - (result-imag (complex-double-reg-imag-tn result)) - (r0 (- (* instance-slots-offset n-word-bytes) - instance-pointer-lowtag)) - (r1 (- (* (+ instance-slots-offset 1) n-word-bytes) - instance-pointer-lowtag)) - (i0 (- (* (+ instance-slots-offset 2) n-word-bytes) - instance-pointer-lowtag)) - (i1 (- (* (+ instance-slots-offset 3) n-word-bytes) - instance-pointer-lowtag))) - (sfloat value-real r0 lip :side 0) - (sfloat value-real r1 lip :side 1) - (sfloat value-imag i0 lip :side 0) - (sfloat value-imag i1 lip :side 1) - (unless (location= result-real value-real) - (inst funop :copy value-real result-real)) - (unless (location= result-imag value-imag) - (inst funop :copy value-imag result-imag))))) diff --git a/src/compiler/hppa/char.lisp b/src/compiler/hppa/char.lisp deleted file mode 100644 index 73043be774..0000000000 --- a/src/compiler/hppa/char.lisp +++ /dev/null @@ -1,117 +0,0 @@ -;;;; the HPPA VM definition of character operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; Moves and coercions: - -;;; Move a tagged char to an untagged representation. -(define-vop (move-to-character) - (:note "character untagging") - (:args (x :scs (any-reg descriptor-reg))) - (:results (y :scs (character-reg))) - (:generator 1 - (inst srl x n-widetag-bits y))) -(define-move-vop move-to-character :move - (any-reg descriptor-reg) (character-reg)) - -;;; Move an untagged char to a tagged representation. -(define-vop (move-from-character) - (:note "character tagging") - (:args (x :scs (character-reg))) - (:results (y :scs (any-reg descriptor-reg))) - (:generator 1 - (inst sll x n-widetag-bits y) - (inst addi character-widetag y y))) -(define-move-vop move-from-character :move - (character-reg) (any-reg descriptor-reg)) - -;;; Move untagged character values. -(define-vop (character-move) - (:note "character move") - (:args (x :target y - :scs (character-reg) - :load-if (not (location= x y)))) - (:results (y :scs (character-reg) - :load-if (not (location= x y)))) - (:generator 0 - (move x y))) -(define-move-vop character-move :move - (character-reg) (character-reg)) - -;;; Move untagged character args/return-values. -(define-vop (move-character-arg) - (:note "character arg move") - (:args (x :target y - :scs (character-reg)) - (fp :scs (any-reg) - :load-if (not (sc-is y character-reg)))) - (:results (y)) - (:generator 0 - (sc-case y - (character-reg - (move x y)) - (character-stack - (storew x fp (tn-offset y)))))) -(define-move-vop move-character-arg :move-arg - (any-reg character-reg) (character-reg)) - -;;; Use standard MOVE-ARG + coercion to move an untagged character to -;;; a descriptor passing location. -(define-move-vop move-arg :move-arg - (character-reg) (any-reg descriptor-reg)) - -;;;; Other operations: -(define-vop (char-code) - (:translate char-code) - (:policy :fast-safe) - (:args (ch :scs (character-reg) :target res)) - (:arg-types character) - (:results (res :scs (any-reg))) - (:result-types positive-fixnum) - (:generator 1 - (inst sll ch 2 res))) - -(define-vop (code-char) - (:translate code-char) - (:policy :fast-safe) - (:args (code :scs (any-reg) :target res)) - (:arg-types positive-fixnum) - (:results (res :scs (character-reg))) - (:result-types character) - (:generator 1 - (inst srl code 2 res))) - -;;; Comparison of characters. -(define-vop (character-compare) - (:args (x :scs (character-reg)) - (y :scs (character-reg))) - (:arg-types character character) - (:conditional) - (:info target not-p) - (:policy :fast-safe) - (:note "inline comparison") - (:variant-vars cond) - (:generator 3 - (inst bc cond not-p x y target))) - -(define-vop (fast-char=/character character-compare) - (:translate char=) - (:variant :=)) - -(define-vop (fast-char/character character-compare) - (:translate char>) - (:variant :>>)) - diff --git a/src/compiler/hppa/debug.lisp b/src/compiler/hppa/debug.lisp deleted file mode 100644 index f5c00c33e6..0000000000 --- a/src/compiler/hppa/debug.lisp +++ /dev/null @@ -1,91 +0,0 @@ -(in-package "SB-VM") - -(define-vop () - (:translate current-sp) - (:policy :fast-safe) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 1 - (move csp-tn res))) - -(define-vop () - (:translate current-fp) - (:policy :fast-safe) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 1 - (move cfp-tn res))) - -(define-vop () - (:translate stack-ref) - (:policy :fast-safe) - (:args (object :scs (sap-reg)) - (offset :scs (any-reg))) - (:arg-types system-area-pointer positive-fixnum) - (:results (result :scs (descriptor-reg))) - (:result-types *) - (:generator 5 - (inst ldwx offset object result))) - -(define-vop () - (:translate %set-stack-ref) - (:policy :fast-safe) - (:args (object :scs (sap-reg) :target sap) - (offset :scs (any-reg)) - (value :scs (descriptor-reg) :target result)) - (:arg-types system-area-pointer positive-fixnum *) - (:results (result :scs (descriptor-reg))) - (:result-types *) - (:temporary (:scs (sap-reg) :from (:argument 1)) sap) - (:generator 2 - (inst add object offset sap) - (inst stw value 0 sap) - (move value result))) - -(define-vop (code-from-mumble) - (:policy :fast-safe) - (:args (thing :scs (descriptor-reg))) - (:results (code :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:variant-vars lowtag) - (:generator 5 - (let ((bogus (gen-label)) - (done (gen-label))) - (loadw temp thing 0 lowtag) - (inst srl temp n-widetag-bits temp) - (inst comb := zero-tn temp bogus) - (inst sll temp word-shift temp) - (unless (= lowtag other-pointer-lowtag) - (inst addi (- lowtag other-pointer-lowtag) temp temp)) - (inst sub thing temp code) - (emit-label done) - (assemble (:elsewhere) - (emit-label bogus) - (inst b done) - (move null-tn code t))))) - -(define-vop (code-from-lra code-from-mumble) - (:translate sb-di::lra-code-header) - (:variant other-pointer-lowtag)) - -(define-vop (code-from-fun code-from-mumble) - (:translate sb-di::fun-code-header) - (:variant fun-pointer-lowtag)) - -(define-vop (%make-lisp-obj) - (:policy :fast-safe) - (:translate %make-lisp-obj) - (:args (value :scs (unsigned-reg) :target result)) - (:arg-types unsigned-num) - (:results (result :scs (descriptor-reg))) - (:generator 1 - (move value result))) - -(define-vop (get-lisp-obj-address) - (:policy :fast-safe) - (:translate sb-di::get-lisp-obj-address) - (:args (thing :scs (descriptor-reg any-reg) :target result)) - (:results (result :scs (unsigned-reg))) - (:result-types unsigned-num) - (:generator 1 - (move thing result))) diff --git a/src/compiler/hppa/float.lisp b/src/compiler/hppa/float.lisp deleted file mode 100644 index bfdf21497b..0000000000 --- a/src/compiler/hppa/float.lisp +++ /dev/null @@ -1,996 +0,0 @@ -;;;; the HPPA VM definition of floating point operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; Move functions. -(define-move-fun (load-fp-zero 1) (vop x y) - ((fp-single-zero) (single-reg) - (fp-double-zero) (double-reg)) - (inst funop :copy x y)) - -(defun ld-float (offset base r) - (cond ((< offset (ash 1 4)) - (inst flds offset base r)) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn lip-tn) - (inst fldx lip-tn base r)) - (t - (error "ld-float: bad offset: ~s~%" offset)))) - -(define-move-fun (load-float 1) (vop x y) - ((single-stack) (single-reg) - (double-stack) (double-reg)) - (let ((offset (tn-byte-offset x))) - (ld-float offset (current-nfp-tn vop) y))) - -(defun str-float (x offset base) - (cond ((< offset (ash 1 4)) - ;(note-next-instruction vop :internal-error) - (inst fsts x offset base)) - ((and (< offset (ash 1 13)) - (> offset 0)) - ;; FIXME-lav, ok with GC to use lip-tn for arbitrary offsets ? - (inst ldo offset zero-tn lip-tn) - ;(note-next-instruction vop :internal-error) - (inst fstx x lip-tn base)) - (t - (error "str-float: bad offset: ~s~%" offset)))) - -(define-move-fun (store-float 1) (vop x y) - ((single-reg) (single-stack) - (double-reg) (double-stack)) - (let ((offset (tn-byte-offset y))) - (str-float x offset (current-nfp-tn vop)))) - -;;;; Move VOPs -(define-vop (move-float) - (:args (x :scs (single-reg double-reg) - :target y - :load-if (not (location= x y)))) - (:results (y :scs (single-reg double-reg) - :load-if (not (location= x y)))) - (:note "float move") - (:generator 0 - (unless (location= y x) - (inst funop :copy x y)))) -(define-move-vop move-float :move (single-reg) (single-reg)) -(define-move-vop move-float :move (double-reg) (double-reg)) - -(define-vop (move-from-float) - (:args (x :to :save)) - (:results (y :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:variant-vars size type data) - (:note "float to pointer coercion") - (:generator 13 - (with-fixed-allocation (y nil ndescr type size nil) - nil) - (inst fsts x (- (* data n-word-bytes) other-pointer-lowtag) y))) - -(macrolet ((frob (name sc &rest args) - `(progn - (define-vop (,name move-from-float) - (:args (x :scs (,sc) :to :save)) - (:variant ,@args)) - (define-move-vop ,name :move (,sc) (descriptor-reg))))) - (frob move-from-single single-reg - single-float-size single-float-widetag single-float-value-slot) - (frob move-from-double double-reg - double-float-size double-float-widetag double-float-value-slot)) - -(define-vop (move-to-float) - (:args (x :scs (descriptor-reg))) - (:results (y)) - (:variant-vars offset) - (:note "pointer to float coercion") - (:generator 2 - (inst flds (- (* offset n-word-bytes) other-pointer-lowtag) x y))) - -(macrolet ((frob (name sc offset) - `(progn - (define-vop (,name move-to-float) - (:results (y :scs (,sc))) - (:variant ,offset)) - (define-move-vop ,name :move (descriptor-reg) (,sc))))) - (frob move-to-single single-reg single-float-value-slot) - (frob move-to-double double-reg double-float-value-slot)) - -(define-vop (move-float-arg) - (:args (x :scs (single-reg double-reg) :target y) - (nfp :scs (any-reg) - :load-if (not (sc-is y single-reg double-reg)))) - (:results (y)) - (:note "float argument move") - (:generator 1 - (sc-case y - ((single-reg double-reg) - (unless (location= x y) - (inst funop :copy x y))) - ((single-stack double-stack) - (let ((offset (tn-byte-offset y))) - (str-float x offset nfp)))))) -(define-move-vop move-float-arg :move-arg - (single-reg descriptor-reg) (single-reg)) -(define-move-vop move-float-arg :move-arg - (double-reg descriptor-reg) (double-reg)) - -;;;; Complex float move functions -(defun complex-single-reg-real-tn (x) - (make-random-tn :kind :normal :sc (sc-or-lose 'single-reg) - :offset (tn-offset x))) -(defun complex-single-reg-imag-tn (x) - (make-random-tn :kind :normal :sc (sc-or-lose 'single-reg) - :offset (1+ (tn-offset x)))) - -(defun complex-double-reg-real-tn (x) - (make-random-tn :kind :normal :sc (sc-or-lose 'complex-double-reg) - :offset (tn-offset x))) -(defun complex-double-reg-imag-tn (x) - (make-random-tn :kind :normal :sc (sc-or-lose 'complex-double-reg) - :offset (1+ (tn-offset x)))) - -(macrolet - ((def-move-fun (dir type size from to) - `(define-move-fun (,(symbolicate dir "-" type) ,size) (vop x y) - ((,(symbolicate type "-" from)) (,(symbolicate type "-" to))) - (let ((nfp (current-nfp-tn vop)) - (offset (* (tn-offset ,(if (eq dir 'load) 'x 'y)) n-word-bytes))) - ,@(if (eq dir 'load) - `((let ((real-tn (,(symbolicate type "-REG-REAL-TN") y))) - (ld-float offset nfp real-tn)) - (let ((imag-tn (,(symbolicate type "-REG-IMAG-TN") y))) - (ld-float (+ offset (* ,(/ size 2) n-word-bytes)) nfp imag-tn))) - `((let ((real-tn (,(symbolicate type "-REG-REAL-TN") x))) - (str-float real-tn offset nfp)) - (let ((imag-tn (,(symbolicate type "-REG-IMAG-TN") x))) - (str-float imag-tn - (+ offset (* ,(/ size 2) n-word-bytes)) - nfp)))))))) - (def-move-fun load complex-single 2 stack reg) - (def-move-fun store complex-single 2 reg stack) - (def-move-fun load complex-double 4 stack reg) - (def-move-fun store complex-double 4 reg stack)) - -;;; Complex float register to register moves. -(define-vop (complex-single-move) - (:args (x :scs (complex-single-reg) :target y - :load-if (not (location= x y)))) - (:results (y :scs (complex-single-reg) :load-if (not (location= x y)))) - (:note "complex single float move") - (:generator 0 - (unless (location= x y) - ;; Note the complex-float-regs are aligned to every second - ;; float register so there is not need to worry about overlap. - (let ((x-real (complex-single-reg-real-tn x)) - (y-real (complex-single-reg-real-tn y))) - (inst funop :copy x-real y-real)) - (let ((x-imag (complex-single-reg-imag-tn x)) - (y-imag (complex-single-reg-imag-tn y))) - (inst funop :copy x-imag y-imag))))) -(define-move-vop complex-single-move :move - (complex-single-reg) (complex-single-reg)) - -(define-vop (complex-double-move) - (:args (x :scs (complex-double-reg) - :target y :load-if (not (location= x y)))) - (:results (y :scs (complex-double-reg) :load-if (not (location= x y)))) - (:note "complex double float move") - (:generator 0 - (unless (location= x y) - ;; Note the complex-float-regs are aligned to every second - ;; float register so there is not need to worry about overlap. - (let ((x-real (complex-double-reg-real-tn x)) - (y-real (complex-double-reg-real-tn y))) - (inst funop :copy x-real y-real)) - (let ((x-imag (complex-double-reg-imag-tn x)) - (y-imag (complex-double-reg-imag-tn y))) - (inst funop :copy x-imag y-imag))))) -(define-move-vop complex-double-move :move - (complex-double-reg) (complex-double-reg)) - -;;; Move from a complex float to a descriptor register allocating a -;;; new complex float object in the process. -(define-vop (move-from-complex-single) - (:args (x :scs (complex-single-reg) :to :save)) - (:results (y :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:note "complex single float to pointer coercion") - (:generator 13 - (with-fixed-allocation (y nil ndescr complex-single-float-widetag - complex-single-float-size nil) - nil) - (let ((real-tn (complex-single-reg-real-tn x))) - (inst fsts real-tn (- (* complex-single-float-real-slot n-word-bytes) - other-pointer-lowtag) y)) - (let ((imag-tn (complex-single-reg-imag-tn x))) - (inst fsts imag-tn (- (* complex-single-float-imag-slot n-word-bytes) - other-pointer-lowtag) y)))) -(define-move-vop move-from-complex-single :move - (complex-single-reg) (descriptor-reg)) - -(define-vop (move-from-complex-double) - (:args (x :scs (complex-double-reg) :to :save)) - (:results (y :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:note "complex double float to pointer coercion") - (:generator 13 - (with-fixed-allocation (y nil ndescr complex-double-float-widetag - complex-double-float-size nil) - nil) - (let ((real-tn (complex-double-reg-real-tn x))) - (inst fsts real-tn (- (* complex-double-float-real-slot n-word-bytes) - other-pointer-lowtag) y)) - (let ((imag-tn (complex-double-reg-imag-tn x))) - (inst fsts imag-tn (- (* complex-double-float-imag-slot n-word-bytes) - other-pointer-lowtag) y)))) -(define-move-vop move-from-complex-double :move - (complex-double-reg) (descriptor-reg)) - -;;; Move from a descriptor to a complex float register -(define-vop (move-to-complex-single) - (:args (x :scs (descriptor-reg))) - (:results (y :scs (complex-single-reg))) - (:note "pointer to complex float coercion") - (:generator 2 - (let ((real-tn (complex-single-reg-real-tn y))) - (inst flds (- (* complex-single-float-real-slot n-word-bytes) - other-pointer-lowtag) - x real-tn)) - (let ((imag-tn (complex-single-reg-imag-tn y))) - (inst flds (- (* complex-single-float-imag-slot n-word-bytes) - other-pointer-lowtag) - x imag-tn)))) -(define-move-vop move-to-complex-single :move - (descriptor-reg) (complex-single-reg)) - -(define-vop (move-to-complex-double) - (:args (x :scs (descriptor-reg))) - (:results (y :scs (complex-double-reg))) - (:note "pointer to complex float coercion") - (:generator 2 - (let ((real-tn (complex-double-reg-real-tn y))) - (inst flds (- (* complex-double-float-real-slot n-word-bytes) - other-pointer-lowtag) - x real-tn)) - (let ((imag-tn (complex-double-reg-imag-tn y))) - (inst flds (- (* complex-double-float-imag-slot n-word-bytes) - other-pointer-lowtag) - x imag-tn)))) -(define-move-vop move-to-complex-double :move - (descriptor-reg) (complex-double-reg)) - -;;; Complex float move-arg vop -(define-vop (move-complex-single-float-arg) - (:args (x :scs (complex-single-reg) :target y) - (nfp :scs (any-reg) :load-if (not (sc-is y complex-single-reg)))) - (:results (y)) - (:note "float argument move") - (:generator 1 - (sc-case y - (complex-single-reg - (unless (location= x y) - (let ((x-real (complex-single-reg-real-tn x)) - (y-real (complex-single-reg-real-tn y))) - (inst funop :copy x-real y-real)) - (let ((x-imag (complex-single-reg-imag-tn x)) - (y-imag (complex-single-reg-imag-tn y))) - (inst funop :copy x-imag y-imag)))) - (complex-single-stack - (let ((offset (tn-byte-offset y))) - (let ((real-tn (complex-single-reg-real-tn x))) - (str-float real-tn offset nfp)) - (let ((imag-tn (complex-single-reg-imag-tn x))) - (str-float imag-tn (+ offset n-word-bytes) nfp))))))) -(define-move-vop move-complex-single-float-arg :move-arg - (complex-single-reg descriptor-reg) (complex-single-reg)) - -(define-vop (move-complex-double-float-arg) - (:args (x :scs (complex-double-reg) :target y) - (nfp :scs (any-reg) :load-if (not (sc-is y complex-double-reg)))) - (:results (y)) - (:note "float argument move") - (:generator 1 - (sc-case y - (complex-double-reg - (unless (location= x y) - (let ((x-real (complex-double-reg-real-tn x)) - (y-real (complex-double-reg-real-tn y))) - (inst funop :copy x-real y-real)) - (let ((x-imag (complex-double-reg-imag-tn x)) - (y-imag (complex-double-reg-imag-tn y))) - (inst funop :copy x-imag y-imag)))) - (complex-double-stack - (let ((offset (tn-byte-offset y))) - (let ((real-tn (complex-double-reg-real-tn x))) - (str-float real-tn offset nfp)) - (let ((imag-tn (complex-double-reg-imag-tn x))) - (str-float imag-tn (+ offset (* 2 n-word-bytes)) nfp))))))) -(define-move-vop move-complex-double-float-arg :move-arg - (complex-double-reg descriptor-reg) (complex-double-reg)) - -(define-move-vop move-arg :move-arg - (single-reg double-reg complex-single-reg complex-double-reg) - (descriptor-reg)) - -;;;; stuff for c-call float-in-int-register arguments -(define-vop (move-to-single-int-reg) - (:note "pointer to float-in-int coercion") - (:args (x :scs (single-reg descriptor-reg))) - (:results (y :scs (single-int-carg-reg) :load-if nil)) - (:generator 1 - (sc-case x - (single-reg - (inst funop :copy x y)) - (descriptor-reg - (inst ldw (- (* single-float-value-slot n-word-bytes) - other-pointer-lowtag) x y))))) -(define-move-vop move-to-single-int-reg - :move (single-reg descriptor-reg) (single-int-carg-reg)) - -(define-vop (move-single-int-reg) - (:args (x :target y :scs (single-int-carg-reg) :load-if nil) - (fp :scs (any-reg) :load-if (not (sc-is y single-int-carg-reg)))) - (:results (y :scs (single-int-carg-reg) :load-if nil)) - (:ignore fp) - (:generator 1 - (unless (location= x y) - (error "Huh? why did it do that?")))) -(define-move-vop move-single-int-reg :move-arg - (single-int-carg-reg) (single-int-carg-reg)) - -; move contents of float register x to register y -(define-vop (move-to-double-int-reg) - (:note "pointer to float-in-int coercion") - (:args (x :scs (double-reg descriptor-reg))) - (:results (y :scs (double-int-carg-reg) :load-if nil)) - (:temporary (:scs (signed-stack) :to (:result 0)) temp) - (:temporary (:scs (signed-reg) :to (:result 0) :target y) old1) - (:temporary (:scs (signed-reg) :to (:result 0) :target y) old2) - (:vop-var vop) - (:save-p :compute-only) - (:generator 2 - (sc-case x - (double-reg - (let* ((nfp (current-nfp-tn vop)) - (stack-tn (sc-case y - (double-stack y) - (double-int-carg-reg temp))) - (offset (tn-byte-offset stack-tn))) - ;; save 8 bytes of stack to two register, - ;; write down float in stack and load it back - ;; into result register. Notice the result hack, - ;; we are writing to one extra register. - ;; Double float argument convention uses two registers, - ;; but we only know about one (thanks to c-call). - (inst ldw offset nfp old1) - (inst ldw (+ offset n-word-bytes) nfp old2) - (str-float x offset nfp) ; writes 8 bytes - (inst ldw offset nfp y) - (inst ldw (+ offset n-word-bytes) nfp - (make-wired-tn (primitive-type-or-lose 'unsigned-byte-32) - unsigned-reg-sc-number - (+ 1 (tn-offset y)))) - (inst stw old1 offset nfp) - (inst stw old2 (+ offset n-word-bytes) nfp))) - (descriptor-reg - (inst ldw (- (* double-float-value-slot n-word-bytes) - other-pointer-lowtag) x y) - (inst ldw (- (* (1+ double-float-value-slot) n-word-bytes) - other-pointer-lowtag) x - (make-wired-tn (primitive-type-or-lose 'unsigned-byte-32) - unsigned-reg-sc-number - (+ 1 (tn-offset y)))))))) -(define-move-vop move-to-double-int-reg - :move (double-reg descriptor-reg) (double-int-carg-reg)) - -(define-vop (move-double-int-reg) - (:args (x :target y :scs (double-int-carg-reg) :load-if nil) - (fp :scs (any-reg) :load-if (not (sc-is y double-int-carg-reg)))) - (:results (y :scs (double-int-carg-reg) :load-if nil)) - (:ignore fp) - (:generator 2 - (unless (location= x y) - (error "Huh? why did it do that?")))) -(define-move-vop move-double-int-reg :move-arg - (double-int-carg-reg) (double-int-carg-reg)) - -;;;; Arithmetic VOPs. - -(define-vop (float-op) - (:args (x) (y)) - (:results (r)) - (:variant-vars operation) - (:policy :fast-safe) - (:note "inline float arithmetic") - (:vop-var vop) - (:save-p :compute-only) - (:generator 0 - (note-this-location vop :internal-error) - (inst fbinop operation x y r))) - -(macrolet ((frob (name sc zero-sc ptype) - `(define-vop (,name float-op) - (:args (x :scs (,sc ,zero-sc)) - (y :scs (,sc ,zero-sc))) - (:results (r :scs (,sc))) - (:arg-types ,ptype ,ptype) - (:result-types ,ptype)))) - (frob single-float-op single-reg fp-single-zero single-float) - (frob double-float-op double-reg fp-double-zero double-float)) - -(macrolet ((frob (translate op sname scost dname dcost) - `(progn - (define-vop (,sname single-float-op) - (:translate ,translate) - (:variant ,op) - (:variant-cost ,scost)) - (define-vop (,dname double-float-op) - (:translate ,translate) - (:variant ,op) - (:variant-cost ,dcost))))) - (frob + :add +/single-float 2 +/double-float 2) - (frob - :sub -/single-float 2 -/double-float 2) - (frob * :mpy */single-float 4 */double-float 5) - (frob / :div //single-float 12 //double-float 19)) - -(macrolet ((frob (name translate sc type inst) - `(define-vop (,name) - (:args (x :scs (,sc))) - (:results (y :scs (,sc))) - (:translate ,translate) - (:policy :fast-safe) - (:arg-types ,type) - (:result-types ,type) - (:note "inline float arithmetic") - (:vop-var vop) - (:save-p :compute-only) - (:generator 1 - (note-this-location vop :internal-error) - ,inst)))) - (frob abs/single-float abs single-reg single-float - (inst funop :abs x y)) - (frob abs/double-float abs double-reg double-float - (inst funop :abs x y))) - -(macrolet ((frob (name translate sc type zero-tn) - `(define-vop (,name) - (:args (x :scs (,sc))) - (:results (y :scs (,sc))) - (:temporary (:scs (,sc)) float-temp) - (:temporary (:scs (signed-reg)) reg-temp) - (:temporary (:scs (signed-stack)) stack-temp) - (:translate ,translate) - (:policy :fast-safe) - (:arg-types ,type) - (:result-types ,type) - (:note "inline float arithmetic") - (:vop-var vop) - (:save-p :compute-only) - (:generator 1 - (note-this-location vop :internal-error) - ;; KLUDGE: Subtracting the input from zero fails to - ;; produce negative zero from positive zero. - ;; Multiplying by -1 causes overflow conditions on - ;; some inputs. The FNEG instruction is available - ;; in PA-RISC 2.0 only, and we're supposed to be - ;; PA-RISC 1.1 compatible. To do the negation as an - ;; integer operation requires writing out the value - ;; (or its high bits) to memory, reading them up - ;; into a non-descriptor-reg, flipping the sign bit - ;; (most likely requiring another unsigned-reg to - ;; hold a constant to XOR with), then getting the - ;; result back to the FPU via memory again. So - ;; instead we test for zeroness explicitly and - ;; decide which of the two FPU-based strategies to - ;; use. I feel unclean for having implemented this, - ;; but it seems to be the least dreadful option. - ;; Help? -- AB, 2015-11-26 - (inst fcmp #b00111 x ,zero-tn) - (inst ftest) - (inst b SUBTRACT-FROM-ZERO :nullify t) - - MULTIPLY-BY-NEGATIVE-ONE - (let ((nfp (current-nfp-tn vop)) - (short-float-temp (make-random-tn :kind :normal - :sc (sc-or-lose 'single-reg) - :offset (tn-offset reg-temp)))) - (inst li -1 reg-temp) - (storew reg-temp nfp (tn-offset stack-temp)) - (ld-float (tn-byte-offset stack-temp) nfp short-float-temp) - (inst fcnvxf short-float-temp float-temp) - (inst fbinop :mpy x float-temp y)) - (inst b DONE :nullify t) - - SUBTRACT-FROM-ZERO - (inst fbinop :sub ,zero-tn x y) - - DONE)))) - (frob %negate/single-float %negate single-reg single-float fp-single-zero-tn) - (frob %negate/double-float %negate double-reg double-float fp-double-zero-tn)) - -;;;; Comparison: - -(define-vop (float-compare) - (:args (x) (y)) - (:conditional) - (:info target not-p) - (:variant-vars condition complement) - (:policy :fast-safe) - (:note "inline float comparison") - (:vop-var vop) - (:save-p :compute-only) - (:generator 3 - (note-this-location vop :internal-error) - ;; This is the condition to nullify the branch, so it is inverted. - (inst fcmp (if not-p condition complement) x y) - (inst ftest) - (inst b target :nullify t))) - -(macrolet ((frob (name sc zero-sc ptype) - `(define-vop (,name float-compare) - (:args (x :scs (,sc ,zero-sc)) - (y :scs (,sc ,zero-sc))) - (:arg-types ,ptype ,ptype)))) - (frob single-float-compare single-reg fp-single-zero single-float) - (frob double-float-compare double-reg fp-double-zero double-float)) - -(macrolet ((frob (translate condition complement sname dname) - `(progn - (define-vop (,sname single-float-compare) - (:translate ,translate) - (:variant ,condition ,complement)) - (define-vop (,dname double-float-compare) - (:translate ,translate) - (:variant ,condition ,complement))))) - ;; FIXME-lav: let 'inst cmp' translate keywords into raw binary instead of giving it here - (frob < #b01001 #b10101 #b10001 #b01101 >/single-float >/double-float) - (frob = #b00101 #b11001 =/single-float =/double-float)) - - -;;;; Conversion: - -(macrolet ((frob (name translate from-sc from-type to-sc to-type) - `(define-vop (,name) - (:args (x :scs (,from-sc))) - (:results (y :scs (,to-sc))) - (:arg-types ,from-type) - (:result-types ,to-type) - (:policy :fast-safe) - (:note "inline float coercion") - (:translate ,translate) - (:vop-var vop) - (:save-p :compute-only) - (:generator 2 - (note-this-location vop :internal-error) - (inst fcnvff x y))))) - (frob %single-float/double-float %single-float - double-reg double-float - single-reg single-float) - (frob %double-float/single-float %double-float - single-reg single-float - double-reg double-float)) - -; convert register-integer to registersingle/double by -; putting it on single-float-stack and then float-loading it into -; an float register, and finally convert the float-register and -; storing the result into y -(macrolet ((frob (name translate to-sc to-type) - `(define-vop (,name) - (:args (x :scs (signed-reg) - :load-if (not (sc-is x signed-stack)) - :target stack-temp)) - (:arg-types signed-num) - (:results (y :scs (,to-sc))) - (:result-types ,to-type) - (:policy :fast-safe) - (:note "inline float coercion") - (:translate ,translate) - (:vop-var vop) - (:save-p :compute-only) - (:temporary (:scs (signed-stack) :from (:argument 0)) - stack-temp) - (:temporary (:scs (single-reg) :to (:result 0) :target y) - fp-temp) - (:temporary (:scs (any-reg) :from (:argument 0) - :to (:result 0)) index) - (:generator 5 - (let* ((nfp (current-nfp-tn vop)) - (stack-tn - (sc-case x - (signed-stack - x) - (signed-reg - (storew x nfp (tn-offset stack-temp)) - stack-temp))) - (offset (tn-byte-offset stack-tn))) - (cond ((< offset (ash 1 4)) - (inst flds offset nfp fp-temp)) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - (inst fldx index nfp fp-temp)) - (t - (error "in vop ~s offset ~s is out-of-range" ',name offset))) - (note-this-location vop :internal-error) - (inst fcnvxf fp-temp y)))))) - (frob %single-float/signed %single-float - single-reg single-float) - (frob %double-float/signed %double-float - double-reg double-float)) - -(macrolet ((frob (trans from-sc from-type inst note) - `(define-vop (,(symbolicate trans "/" from-type)) - (:args (x :scs (,from-sc) - :target fp-temp)) - (:results (y :scs (signed-reg) - :load-if (not (sc-is y signed-stack)))) - (:arg-types ,from-type) - (:result-types signed-num) - (:translate ,trans) - (:policy :fast-safe) - (:note ,note) - (:vop-var vop) - (:save-p :compute-only) - (:temporary (:scs (single-reg) :from (:argument 0)) fp-temp) - (:temporary (:scs (signed-stack) :to (:result 0) :target y) - stack-temp) - (:temporary (:scs (any-reg) :from (:argument 0) - :to (:result 0)) index) - (:generator 3 - (let* ((nfp (current-nfp-tn vop)) - (stack-tn - (sc-case y - (signed-stack y) - (signed-reg stack-temp))) - (offset (tn-byte-offset stack-tn))) - (inst ,inst x fp-temp) - (cond ((< offset (ash 1 4)) - (note-next-instruction vop :internal-error) - (inst fsts fp-temp offset nfp)) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - (note-next-instruction vop :internal-error) - (inst fstx fp-temp index nfp)) - (t - (error "unary error, ldo offset too high"))) - (unless (eq y stack-tn) - (loadw y nfp (tn-offset stack-tn)))))))) - (frob %unary-round single-reg single-float fcnvfx "inline float round") - (frob %unary-round double-reg double-float fcnvfx "inline float round") - (frob %unary-truncate/single-float single-reg single-float fcnvfxt - "inline float truncate") - (frob %unary-truncate/double-float double-reg double-float fcnvfxt - "inline float truncate")) - -(define-vop (make-single-float) - (:args (bits :scs (signed-reg) - :load-if (or (not (sc-is bits signed-stack)) - (sc-is res single-stack)) - :target res)) - (:results (res :scs (single-reg) - :load-if (not (sc-is bits single-stack)))) - (:arg-types signed-num) - (:result-types single-float) - (:translate make-single-float) - (:policy :fast-safe) - (:vop-var vop) - (:temporary (:scs (single-stack) :from (:argument 0) :to (:result 0)) temp) - (:temporary (:scs (any-reg) :from (:argument 0) :to (:result 0)) index) - (:generator 2 - (let ((nfp (current-nfp-tn vop))) - (sc-case bits - (signed-reg - (sc-case res - (single-reg - (let ((offset (tn-byte-offset temp))) - (inst stw bits offset nfp) - (cond ((< offset (ash 1 4)) - (inst flds offset nfp res)) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - (inst fldx index nfp res)) - (t - (error "make-single-float error, ldo offset too large"))))) - (single-stack - (inst stw bits (tn-byte-offset res) nfp)))) - (signed-stack - (sc-case res - (single-reg - (let ((offset (tn-byte-offset bits))) - (cond ((< offset (ash 1 4)) - (inst flds offset nfp res)) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - (inst fldx index nfp res)) - (t - (error "make-single-float error, ldo offset too large"))))))))))) - -(define-vop (make-double-float) - (:args (hi-bits :scs (signed-reg)) - (lo-bits :scs (unsigned-reg))) - (:results (res :scs (double-reg) - :load-if (not (sc-is res double-stack)))) - (:arg-types signed-num unsigned-num) - (:result-types double-float) - (:translate make-double-float) - (:policy :fast-safe) - (:temporary (:scs (double-stack) :to (:result 0)) temp) - (:temporary (:scs (any-reg) :from (:argument 0) :to (:result 0)) index) - (:vop-var vop) - (:generator 2 - (let* ((nfp (current-nfp-tn vop)) - (stack-tn (sc-case res - (double-stack res) - (double-reg temp))) - (offset (tn-byte-offset stack-tn))) - (inst stw hi-bits offset nfp) - (inst stw lo-bits (+ offset n-word-bytes) nfp) - (cond ((eq stack-tn res)) - ((< offset (ash 1 4)) - (inst flds offset nfp res)) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - (inst fldx index nfp res)) - (t - (error "make-single-float error, ldo offset too large")))))) - -(macrolet - ((float-bits (name reg rreg stack rstack atype anum side offset) - `(define-vop (,name) - (:args (float :scs (,reg) - :load-if (not (sc-is float ,stack)))) - (:results (bits :scs (,rreg) - :load-if (or (not (sc-is bits ,rstack)) - (sc-is float ,stack)))) - (:arg-types ,atype) - (:result-types ,anum) - (:translate ,name) - (:policy :fast-safe) - (:vop-var vop) - (:temporary (:scs (signed-stack) :from (:argument 0) :to (:result 0)) temp) - (:temporary (:scs (any-reg) :from (:argument 0) :to (:result 0)) index) - (:generator 2 - (let ((nfp (current-nfp-tn vop))) - (sc-case float - (,reg - (sc-case bits - (,rreg - (let ((offset (tn-byte-offset temp))) - (cond ((< offset (ash 1 4)) - ,@(if side - `((inst fsts float offset nfp :side ,side)) - `((inst fsts float offset nfp)))) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - ,@(if side - `((inst fstx float index nfp :side ,side)) - `((inst fstx float index nfp)))) - (t - (error ,(format nil "~s,~s: inst-LDO offset too large" - name rreg)))) - (inst ldw offset nfp bits))) - (,rstack - (let ((offset (tn-byte-offset bits))) - (cond ((< offset (ash 1 4)) - ,@(if side - `((inst fsts float offset nfp :side ,side)) - `((inst fsts float offset nfp)))) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - ,@(if side - `((inst fstx float index nfp :side ,side)) - `((inst fstx float index nfp)))) - (t - (error ,(format nil "~s,~s: inst-LDO offset too large" - name rstack)))))))) - (,stack - (sc-case bits - (,rreg - (inst ldw (* (+ (tn-offset float) ,offset) n-word-bytes) - nfp bits)))))))))) - (float-bits single-float-bits single-reg signed-reg single-stack - signed-stack single-float signed-num nil 0) - (float-bits double-float-high-bits double-reg signed-reg - double-stack signed-stack double-float signed-num 0 0) - (float-bits double-float-low-bits double-reg unsigned-reg - double-stack unsigned-stack double-float unsigned-num 1 1)) - -;;;; Float mode hackery: - -(sb-xc:deftype float-modes () '(unsigned-byte 32)) -(defknown floating-point-modes () float-modes (flushable)) -(defknown ((setf floating-point-modes)) (float-modes) - float-modes) - -(define-vop (floating-point-modes) - (:results (res :scs (unsigned-reg))) - (:result-types unsigned-num) - (:translate floating-point-modes) - (:policy :fast-safe) - (:temporary (:scs (double-stack)) temp) - (:temporary (:scs (any-reg) :to (:result 0)) index) - (:vop-var vop) - (:generator 3 - (let* ((nfp (current-nfp-tn vop)) - (stack-tn (sc-case res - (unsigned-stack res) - (unsigned-reg temp))) - (offset (tn-byte-offset stack-tn))) - (cond ((< offset (ash 1 4)) - (inst fsts fp-double-zero-tn offset nfp)) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - (inst fstx fp-double-zero-tn index nfp)) - (t - (error "floating-point-modes error, ldo offset too large"))) - (ecase *backend-byte-order* - (:big-endian - (inst ldw offset nfp res)) - (:little-endian - (inst ldw (+ offset 4) nfp res)))))) - -(define-vop (set-floating-point-modes) - (:args (new :scs (unsigned-reg) :target res)) - (:results (res :scs (unsigned-reg))) - (:arg-types unsigned-num) - (:result-types unsigned-num) - (:translate (setf floating-point-modes)) - (:policy :fast-safe) - (:temporary (:scs (double-stack)) stack-tn) - (:temporary (:scs (any-reg)) index) - (:vop-var vop) - (:generator 3 - (let* ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset stack-tn))) - (ecase *backend-byte-order* - (:big-endian - (inst stw new offset nfp) - (inst stw zero-tn (+ offset 4) nfp)) - (:little-endian - (inst stw zero-tn offset nfp) - (inst stw new (+ offset 4) nfp))) - (cond ((< offset (ash 1 4)) - (inst flds offset nfp fp-double-zero-tn)) - ((and (< offset (ash 1 13)) - (> offset 0)) - (inst ldo offset zero-tn index) - (inst fldx index nfp fp-double-zero-tn)) - (t - (error "set-floating-point-modes error, ldo offset too large"))) - (move new res)))) - -;;;; Complex float VOPs - -(define-vop (make-complex-single-float) - (:translate complex) - (:args (real :scs (single-reg) :target r) - (imag :scs (single-reg) :to :save)) - (:arg-types single-float single-float) - (:results (r :scs (complex-single-reg) :from (:argument 0) - :load-if (not (sc-is r complex-single-stack)))) - (:result-types complex-single-float) - (:note "inline complex single-float creation") - (:policy :fast-safe) - (:vop-var vop) - (:generator 5 - (sc-case r - (complex-single-reg - (let ((r-real (complex-single-reg-real-tn r))) - (unless (location= real r-real) - (inst funop :copy real r-real))) - (let ((r-imag (complex-single-reg-imag-tn r))) - (unless (location= imag r-imag) - (inst funop :copy imag r-imag)))) - (complex-single-stack - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset r))) - (str-float real offset nfp) - (str-float imag (+ offset n-word-bytes) nfp)))))) - -(define-vop (make-complex-double-float) - (:translate complex) - (:args (real :scs (double-reg) :target r) - (imag :scs (double-reg) :to :save)) - (:arg-types double-float double-float) - (:results (r :scs (complex-double-reg) :from (:argument 0) - :load-if (not (sc-is r complex-double-stack)))) - (:result-types complex-double-float) - (:note "inline complex double-float creation") - (:policy :fast-safe) - (:vop-var vop) - (:generator 5 - (sc-case r - (complex-double-reg - (let ((r-real (complex-double-reg-real-tn r))) - (unless (location= real r-real) - (inst funop :copy real r-real))) - (let ((r-imag (complex-double-reg-imag-tn r))) - (unless (location= imag r-imag) - (inst funop :copy imag r-imag)))) - (complex-double-stack - (let ((nfp (current-nfp-tn vop)) - (offset (tn-byte-offset r))) - (str-float real offset nfp) - (str-float imag (+ offset (* 2 n-word-bytes)) nfp)))))) - -(define-vop (complex-single-float-value) - (:args (x :scs (complex-single-reg) :target r - :load-if (not (sc-is x complex-single-stack)))) - (:arg-types complex-single-float) - (:results (r :scs (single-reg))) - (:result-types single-float) - (:variant-vars slot) - (:policy :fast-safe) - (:vop-var vop) - (:generator 3 - (sc-case x - (complex-single-reg - (let ((value-tn (ecase slot - (:real (complex-single-reg-real-tn x)) - (:imag (complex-single-reg-imag-tn x))))) - (unless (location= value-tn r) - (inst funop :copy value-tn r)))) - (complex-single-stack - (ld-float (* (+ (ecase slot (:real 0) (:imag 1)) (tn-offset x)) - n-word-bytes) - (current-nfp-tn vop) r))))) - -(define-vop (realpart/complex-single-float complex-single-float-value) - (:translate realpart) - (:note "complex single float realpart") - (:variant :real)) - -(define-vop (imagpart/complex-single-float complex-single-float-value) - (:translate imagpart) - (:note "complex single float imagpart") - (:variant :imag)) - -(define-vop (complex-double-float-value) - (:args (x :scs (complex-double-reg) :target r - :load-if (not (sc-is x complex-double-stack)))) - (:arg-types complex-double-float) - (:results (r :scs (double-reg))) - (:result-types double-float) - (:variant-vars slot) - (:policy :fast-safe) - (:vop-var vop) - (:generator 3 - (sc-case x - (complex-double-reg - (let ((value-tn (ecase slot - (:real (complex-double-reg-real-tn x)) - (:imag (complex-double-reg-imag-tn x))))) - (unless (location= value-tn r) - (inst funop :copy value-tn r)))) - (complex-double-stack - (ld-float (* (+ (ecase slot (:real 0) (:imag 2)) (tn-offset x)) - n-word-bytes) - (current-nfp-tn vop) r))))) - -(define-vop (realpart/complex-double-float complex-double-float-value) - (:translate realpart) - (:note "complex double float realpart") - (:variant :real)) - -(define-vop (imagpart/complex-double-float complex-double-float-value) - (:translate imagpart) - (:note "complex double float imagpart") - (:variant :imag)) diff --git a/src/compiler/hppa/insts.lisp b/src/compiler/hppa/insts.lisp deleted file mode 100644 index 3aed626f39..0000000000 --- a/src/compiler/hppa/insts.lisp +++ /dev/null @@ -1,1629 +0,0 @@ -;;;; the instruction set definition for HPPA - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-HPPA-ASM") - -(eval-when (:compile-toplevel :load-toplevel :execute) - ;; Imports from this package into SB-VM - (import '(reg-tn-encoding) "SB-VM") - ;; Imports from SB-VM into this package - (import '(sb-vm::zero sb-vm::registers sb-vm::float-registers - sb-vm::single-reg sb-vm::double-reg - sb-vm::complex-single-reg sb-vm::complex-double-reg - sb-vm::fp-single-zero sb-vm::fp-double-zero - sb-vm::zero-tn - sb-vm::null-offset sb-vm::code-offset sb-vm::zero-offset))) - - -;;;; Utility functions. - -(defun reg-tn-encoding (tn) - (declare (type tn tn)) - (sc-case tn - (null null-offset) - (zero zero-offset) - (t - (aver (eq (sb-name (sc-sb (tn-sc tn))) 'registers)) - (tn-offset tn)))) - -(defun fp-reg-tn-encoding (tn) - (declare (type tn tn)) - (sc-case tn - (fp-single-zero (values 0 nil)) - (single-reg (values (tn-offset tn) nil)) - (fp-double-zero (values 0 t)) - (double-reg (values (tn-offset tn) t)) - (complex-single-reg (values (tn-offset tn) nil)) - (complex-double-reg (values (tn-offset tn) t)))) - -(defconstant-eqx compare-conditions - '(:never := :< :<= :<< :<<= :sv :od :tr :<> :>= :> :>>= :>> :nsv :ev) - #'equalp) - -(deftype compare-condition () - `(member nil ,@compare-conditions)) - -(defun compare-condition (cond) - (declare (type compare-condition cond)) - (if cond - (let ((result (or (position cond compare-conditions :test #'eq) - (error "Bogus Compare/Subtract condition: ~S" cond)))) - (values (ldb (byte 3 0) result) - (logbitp 3 result))) - (values 0 nil))) - -(defconstant-eqx add-conditions - '(:never := :< :<= :nuv :znv :sv :od :tr :<> :>= :> :uv :vnz :nsv :ev) - #'equalp) - -(deftype add-condition () - `(member nil ,@add-conditions)) - -(defun add-condition (cond) - (declare (type add-condition cond)) - (if cond - (let ((result (or (position cond add-conditions :test #'eq) - (error "Bogus Add condition: ~S" cond)))) - (values (ldb (byte 3 0) result) - (logbitp 3 result))) - (values 0 nil))) - -(defconstant-eqx logical-conditions - '(:never := :< :<= nil nil nil :od :tr :<> :>= :> nil nil nil :ev) - #'equalp) - -(deftype logical-condition () - `(member nil ,@(remove nil logical-conditions))) - -(defun logical-condition (cond) - (declare (type logical-condition cond)) - (if cond - (let ((result (or (position cond logical-conditions :test #'eq) - (error "Bogus Logical condition: ~S" cond)))) - (values (ldb (byte 3 0) result) - (logbitp 3 result))) - (values 0 nil))) - -(defconstant-eqx unit-conditions - '(:never nil :sbz :shz :sdc :sbc :shc :tr nil :nbz :nhz :ndc :nbc :nhc) - #'equalp) - -(deftype unit-condition () - `(member nil ,@(remove nil unit-conditions))) - -(defun unit-condition (cond) - (declare (type unit-condition cond)) - (if cond - (let ((result (or (position cond unit-conditions :test #'eq) - (error "Bogus Unit condition: ~S" cond)))) - (values (ldb (byte 3 0) result) - (logbitp 3 result))) - (values 0 nil))) - -(defconstant-eqx extract/deposit-conditions - '(:never := :< :od :tr :<> :>= :ev) - #'equalp) - -(deftype extract/deposit-condition () - `(member nil ,@extract/deposit-conditions)) - -(defun extract/deposit-condition (cond) - (declare (type extract/deposit-condition cond)) - (if cond - (or (position cond extract/deposit-conditions :test #'eq) - (error "Bogus Extract/Deposit condition: ~S" cond)) - 0)) - - -(defun space-encoding (space) - (declare (type (unsigned-byte 3) space)) - (dpb (ldb (byte 2 0) space) - (byte 2 1) - (ldb (byte 1 2) space))) - - -;;;; Initial disassembler setup. - -(defvar *disassem-use-lisp-reg-names* t) - -; In each define-instruction the form (:dependencies ...) -; contains read and write howto that passed as LOC here. -; Example: (:dependencies (reads src) (writes dst) (writes temp)) -; src, dst and temp is passed each in loc, and can be a register -; immediate or anything else. -; this routine will return an location-number -; this number must be less than +assem-max-locations+ -(defun location-number (loc) - (etypecase loc - (null) - (number) - (label) - (fixup) - (tn - (ecase (sb-name (sc-sb (tn-sc loc))) - (immediate-constant - ;; Can happen if $ZERO or $NULL are passed in. - nil) - (registers - (unless (zerop (tn-offset loc)) - (tn-offset loc))))) - (symbol - (ecase loc - (:memory 0))))) - -(defparameter reg-symbols - (map 'vector - (lambda (name) - (cond ((null name) nil) - (t (make-symbol (concatenate 'string "$" name))))) - sb-vm::*register-names*)) - -(define-arg-type reg - :printer (lambda (value stream dstate) - (declare (stream stream) (fixnum value)) - (let ((regname (aref reg-symbols value))) - (princ regname stream) - (maybe-note-associated-storage-ref - value - 'registers - regname - dstate)))) - -(defparameter float-reg-symbols - #.(coerce - (loop for n from 0 to 31 collect (make-symbol (format nil "$F~d" n))) - 'vector)) - -(define-arg-type fp-reg - :printer (lambda (value stream dstate) - (declare (stream stream) (fixnum value)) - (let ((regname (aref float-reg-symbols value))) - (princ regname stream) - (maybe-note-associated-storage-ref - value - 'float-registers - regname - dstate)))) - -(define-arg-type fp-fmt-0c - :printer (lambda (value stream dstate) - (declare (ignore dstate) (stream stream) (fixnum value)) - (ecase value - (0 (format stream "~A" '\,SGL)) - (1 (format stream "~A" '\,DBL)) - (3 (format stream "~A" '\,QUAD))))) - -(defun low-sign-extend (x n) - (let ((normal (dpb x (byte 1 (1- n)) (ldb (byte (1- n) 1) x)))) - (if (logbitp 0 x) - (logior (ash -1 (1- n)) normal) - normal))) - -(defun assemble-bits (x list) - (let ((result 0) - (offset 0)) - (dolist (e (reverse list)) - (setf result (logior result (ash (ldb e x) offset))) - (incf offset (byte-size e))) - result)) - -(macrolet ((define-imx-decode (name bits) - `(define-arg-type ,name - :printer (lambda (value stream dstate) - (declare (ignore dstate) (stream stream) (fixnum value)) - (format stream "~S" (low-sign-extend value ,bits)))))) - (define-imx-decode im5 5) - (define-imx-decode im11 11) - (define-imx-decode im14 14)) - -(define-arg-type im3 - :printer (lambda (value stream dstate) - (declare (ignore dstate) (stream stream) (fixnum value)) - (format stream "~S" (assemble-bits value `(,(byte 1 0) - ,(byte 2 1)))))) - -(define-arg-type im21 - :printer (lambda (value stream dstate) - (declare (ignore dstate) (stream stream) (fixnum value)) - (format stream "~S" - (assemble-bits value `(,(byte 1 0) ,(byte 11 1) - ,(byte 2 14) ,(byte 5 16) - ,(byte 2 12)))))) - -(define-arg-type cp - :printer (lambda (value stream dstate) - (declare (ignore dstate) (stream stream) (fixnum value)) - (format stream "~S" (- 31 value)))) - -(define-arg-type clen - :printer (lambda (value stream dstate) - (declare (ignore dstate) (stream stream) (fixnum value)) - (format stream "~S" (- 32 value)))) - -(define-arg-type compare-condition - :printer #("" \,= \,< \,<= \,<< \,<<= \,SV \,OD \,TR \,<> \,>= - \,> \,>>= \,>> \,NSV \,EV)) - -(define-arg-type compare-condition-false - :printer #(\,TR \,<> \,>= \,> \,>>= \,>> \,NSV \,EV - "" \,= \,< \,<= \,<< \,<<= \,SV \,OD)) - -(define-arg-type add-condition - :printer #("" \,= \,< \,<= \,NUV \,ZNV \,SV \,OD \,TR \,<> \,>= \,> \,UV - \,VNZ \,NSV \,EV)) - -(define-arg-type add-condition-false - :printer #(\,TR \,<> \,>= \,> \,UV \,VNZ \,NSV \,EV - "" \,= \,< \,<= \,NUV \,ZNV \,SV \,OD)) - -(define-arg-type logical-condition - :printer #("" \,= \,< \,<= "" "" "" \,OD \,TR \,<> \,>= \,> "" "" "" \,EV)) - -(define-arg-type unit-condition - :printer #("" "" \,SBZ \,SHZ \,SDC \,SBC \,SHC \,TR "" \,NBZ \,NHZ \,NDC - \,NBC \,NHC)) - -(define-arg-type extract/deposit-condition - :printer #("" \,= \,< \,OD \,TR \,<> \,>= \,EV)) - -(define-arg-type extract/deposit-condition-false - :printer #(\,TR \,<> \,>= \,EV "" \,= \,< \,OD)) - -(define-arg-type nullify - :printer #("" \,N)) - -(define-arg-type fcmp-cond - :printer #(\FALSE? \FALSE \? \!<=> \= \=T \?= \!<> \!?>= \< \?< - \!>= \!?> \<= \?<= \!> \!?<= \> \?>\ \!<= \!?< \>= - \?>= \!< \!?= \<> \!= \!=T \!? \<=> \TRUE? \TRUE)) - -(define-arg-type integer - :printer (lambda (value stream dstate) - (declare (ignore dstate) (stream stream) (fixnum value)) - (format stream "~S" value))) - -(define-arg-type space - :printer #("" |1,| |2,| |3,|)) - -(define-arg-type memory-address-annotation - :printer (lambda (value stream dstate) - (declare (ignore stream)) - (destructuring-bind (reg raw-offset) value - (let ((offset (low-sign-extend raw-offset 14))) - (cond - ((= reg code-offset) - (note-code-constant offset dstate)) - ((= reg null-offset) - (maybe-note-nil-indexed-object offset dstate))))))) - - -;;;; Define-instruction-formats for disassembler. - -(define-instruction-format (load/store 32) - (op :field (byte 6 26)) - (b :field (byte 5 21) :type 'reg) - (t/r :field (byte 5 16) :type 'reg) - (s :field (byte 2 14) :type 'space) - (im14 :field (byte 14 0) :type 'im14) - (memory-address-annotation :fields (list (byte 5 21) (byte 14 0)) - :type 'memory-address-annotation)) - -(defconstant-eqx cmplt-index-print '((:cond ((u :constant 1) '\,S)) - (:cond ((m :constant 1) '\,M))) - #'equalp) - -(defconstant-eqx cmplt-disp-print '((:cond ((m :constant 1) - (:cond ((s :constant 0) '\,MA) - (t '\,MB))))) - #'equalp) - -(defconstant-eqx cmplt-store-print '((:cond ((s :constant 0) '\,B) - (t '\,E)) - (:cond ((m :constant 1) '\,M))) - #'equalp) - -(define-instruction-format (extended-load/store 32) - (op1 :field (byte 6 26) :value 3) - (b :field (byte 5 21) :type 'reg) - (x/im5/r :field (byte 5 16) :type 'reg) - (s :field (byte 2 14) :type 'space) - (u :field (byte 1 13)) - (op2 :field (byte 3 10)) - (ext4/c :field (byte 4 6)) - (m :field (byte 1 5)) - (t/im5 :field (byte 5 0) :type 'reg)) - -(define-instruction-format (ldil 32 :default-printer '(:name :tab im21 "," t)) - (op :field (byte 6 26)) - (t :field (byte 5 21) :type 'reg) - (im21 :field (byte 21 0) :type 'im21)) - -(define-instruction-format (branch17 32) - (op1 :field (byte 6 26)) - (t :field (byte 5 21) :type 'reg) - (w :fields `(,(byte 5 16) ,(byte 11 2) ,(byte 1 0)) - :use-label - (lambda (value dstate) - (declare (type disassem-state dstate) (list value)) - (let ((x (logior (ash (first value) 12) (ash (second value) 1) - (third value)))) - (+ (ash (sign-extend - (assemble-bits x `(,(byte 1 0) ,(byte 5 12) ,(byte 1 1) - ,(byte 10 2))) 17) 2) - (dstate-cur-addr dstate) 8)))) - (op2 :field (byte 3 13)) - (n :field (byte 1 1) :type 'nullify)) - -(define-instruction-format (branch12 32) - (op1 :field (byte 6 26)) - (r2 :field (byte 5 21) :type 'reg) - (r1 :field (byte 5 16) :type 'reg) - (w :fields `(,(byte 11 2) ,(byte 1 0)) - :use-label - (lambda (value dstate) - (declare (type disassem-state dstate) (list value)) - (let ((x (logior (ash (first value) 1) (second value)))) - (+ (ash (sign-extend - (assemble-bits x `(,(byte 1 0) ,(byte 1 1) ,(byte 10 2))) - 12) 2) - (dstate-cur-addr dstate) 8)))) - (c :field (byte 3 13)) - (n :field (byte 1 1) :type 'nullify)) - -(define-instruction-format (branch 32) - (op1 :field (byte 6 26)) - (t :field (byte 5 21) :type 'reg) - (x :field (byte 5 16) :type 'reg) - (op2 :field (byte 3 13)) - (x1 :field (byte 11 2)) - (n :field (byte 1 1) :type 'nullify) - (x2 :field (byte 1 0))) - -(define-instruction-format (r3-inst 32 - :default-printer '(:name c :tab r1 "," r2 "," t)) - (r3 :field (byte 6 26) :value 2) - (r2 :field (byte 5 21) :type 'reg) - (r1 :field (byte 5 16) :type 'reg) - (c :field (byte 3 13)) - (f :field (byte 1 12)) - (op :field (byte 7 5)) - (t :field (byte 5 0) :type 'reg)) - -(define-instruction-format (imm-inst 32 - :default-printer '(:name c :tab im11 "," r "," t)) - (op :field (byte 6 26)) - (r :field (byte 5 21) :type 'reg) - (t :field (byte 5 16) :type 'reg) - (c :field (byte 3 13)) - (f :field (byte 1 12)) - (o :field (byte 1 11)) - (im11 :field (byte 11 0) :type 'im11)) - -(define-instruction-format (extract/deposit-inst 32) - (op1 :field (byte 6 26)) - (r2 :field (byte 5 21) :type 'reg) - (r1 :field (byte 5 16) :type 'reg) - (c :field (byte 3 13) :type 'extract/deposit-condition) - (op2 :field (byte 3 10)) - (cp :field (byte 5 5) :type 'cp) - (t/clen :field (byte 5 0) :type 'clen)) - -(define-instruction-format (break 32 - :default-printer '(:name :tab im13 "," im5)) - (op1 :field (byte 6 26) :value 0) - (im13 :field (byte 13 13)) - (q2 :field (byte 8 5) :value 0) - (im5 :field (byte 5 0) :reader break-im5)) - -(define-instruction-format (system-inst 32) - (op1 :field (byte 6 26) :value 0) - (r1 :field (byte 5 21) :type 'reg) - (r2 :field (byte 5 16) :type 'reg) - (s :field (byte 3 13)) - (op2 :field (byte 8 5)) - (r3 :field (byte 5 0) :type 'reg)) - -(define-instruction-format (fp-load/store 32) - (op :field (byte 6 26)) - (b :field (byte 5 21) :type 'reg) - (x :field (byte 5 16) :type 'reg) - (s :field (byte 2 14) :type 'space) - (u :field (byte 1 13)) - (x1 :field (byte 1 12)) - (x2 :field (byte 2 10)) - (x3 :field (byte 1 9)) - (x4 :field (byte 3 6)) - (m :field (byte 1 5)) - (t :field (byte 5 0) :type 'fp-reg)) - -(define-instruction-format (fp-class-0-inst 32) - (op1 :field (byte 6 26)) - (r :field (byte 5 21) :type 'fp-reg) - (x1 :field (byte 5 16) :type 'fp-reg) - (op2 :field (byte 3 13)) - (fmt :field (byte 2 11) :type 'fp-fmt-0c) - (x2 :field (byte 2 9)) - (x3 :field (byte 3 6)) - (x4 :field (byte 1 5)) - (t :field (byte 5 0) :type 'fp-reg)) - -(define-instruction-format (fp-class-1-inst 32) - (op1 :field (byte 6 26)) - (r :field (byte 5 21) :type 'fp-reg) - (x1 :field (byte 4 17) :value 0) - (x2 :field (byte 2 15)) - (df :field (byte 2 13) :type 'fp-fmt-0c) - (sf :field (byte 2 11) :type 'fp-fmt-0c) - (x3 :field (byte 2 9) :value 1) - (x4 :field (byte 3 6) :value 0) - (x5 :field (byte 1 5) :value 0) - (t :field (byte 5 0) :type 'fp-reg)) - - - -;;;; Load and Store stuff. - -(define-bitfield-emitter emit-load/store 32 - (byte 6 26) - (byte 5 21) - (byte 5 16) - (byte 2 14) - (byte 14 0)) - -(defun encode-imm21 (segment value) - (declare (type (or fixup (signed-byte 32) (unsigned-byte 32)) value)) - (cond ((fixup-p value) - (note-fixup segment :hi value) - (aver (zerop (fixup-offset value))) - 0) - (t - (let ((hi (ldb (byte 21 11) value))) - (logior (ash (ldb (byte 5 2) hi) 16) - (ash (ldb (byte 2 7) hi) 14) - (ash (ldb (byte 2 0) hi) 12) - (ash (ldb (byte 11 9) hi) 1) - (ldb (byte 1 20) hi)))))) - -(defun encode-imm11 (value) - (declare (type (signed-byte 11) value)) - (dpb (ldb (byte 10 0) value) - (byte 10 1) - (ldb (byte 1 10) value))) - -(defun encode-imm11u (value) - (declare (type (or (signed-byte 32) (unsigned-byte 32)) value)) - (declare (type (unsigned-byte 11) value)) - (dpb (ldb (byte 11 0) value) - (byte 11 1) - 0)) - -(defun encode-imm14 (value) - (declare (type (signed-byte 14) value)) - (dpb (ldb (byte 13 0) value) - (byte 13 1) - (ldb (byte 1 13) value))) - -(defun encode-disp/fixup (segment disp imm-bits) - (cond - ((fixup-p disp) - (aver (zerop (fixup-offset disp))) - (if imm-bits - (note-fixup segment :load11u disp) - (note-fixup segment :load disp)) - 0) - (t - (if imm-bits - (encode-imm11u disp) - (encode-imm14 disp))))) - -; LDO can be used in two ways: to load an 14bit-signed value -; or load an 11bit-unsigned value. The latter is used for -; example in an LDIL/LDO pair. The key :unsigned specifies this. -(macrolet ((define-load-inst (name opcode &optional imm-bits) - (declare (ignore imm-bits)) ; what? - `(define-instruction ,name (segment disp base reg &key unsigned) - (:declare (type tn reg base) - (type (member t nil) unsigned) - (type (or fixup (signed-byte 14)) disp)) - (:delay 0) - (:printer load/store ((op ,opcode) (s 0)) - '(:name :tab im14 "(" s b ")," t/r memory-address-annotation)) - (:dependencies (reads base) (reads :memory) (writes reg)) - (:emitter - (emit-load/store segment ,opcode - (reg-tn-encoding base) (reg-tn-encoding reg) 0 - (if unsigned - (encode-disp/fixup segment disp t) - (encode-disp/fixup segment disp nil)))))) - (define-store-inst (name opcode &optional imm-bits) - `(define-instruction ,name (segment reg disp base) - (:declare (type tn reg base) - (type (or fixup (signed-byte 14)) disp)) - (:delay 0) - (:printer load/store ((op ,opcode) (s 0)) - '(:name :tab t/r "," im14 "(" s b ")" memory-address-annotation)) - (:dependencies (reads base) (reads reg) (writes :memory)) - (:emitter - (emit-load/store segment ,opcode - (reg-tn-encoding base) (reg-tn-encoding reg) 0 - (encode-disp/fixup segment disp ,imm-bits)))))) - (define-load-inst ldw #x12) - (define-load-inst ldh #x11) - (define-load-inst ldb #x10) - (define-load-inst ldwm #x13) - (define-load-inst ldo #x0D) - (define-store-inst stw #x1A) - (define-store-inst sth #x19) - (define-store-inst stb #x18) - (define-store-inst stwm #x1B)) - -(define-bitfield-emitter emit-extended-load/store 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 2 14) (byte 1 13) - (byte 3 10) (byte 4 6) (byte 1 5) (byte 5 0)) - -(macrolet ((define-load-indexed-inst (name opcode) - `(define-instruction ,name (segment index base reg &key modify scale) - (:declare (type tn reg base index) - (type (member t nil) modify scale)) - (:delay 0) - (:dependencies (reads index) (reads base) (writes reg) (reads :memory)) - (:printer extended-load/store ((ext4/c ,opcode) (t/im5 nil :type 'reg) - (op2 0)) - `(:name ,@cmplt-index-print :tab x/im5/r - "(" s b ")" t/im5)) - (:emitter - (emit-extended-load/store - segment #x03 (reg-tn-encoding base) (reg-tn-encoding index) - 0 (if scale 1 0) 0 ,opcode (if modify 1 0) - (reg-tn-encoding reg)))))) - (define-load-indexed-inst ldwx 2) - (define-load-indexed-inst ldhx 1) - (define-load-indexed-inst ldbx 0) - (define-load-indexed-inst ldcwx 7)) - -(defun short-disp-encoding (segment disp) - (declare (type (or fixup (signed-byte 5)) disp)) - (cond ((fixup-p disp) - (note-fixup segment :load-short disp) - (aver (zerop (fixup-offset disp))) - 0) - (t - (dpb (ldb (byte 4 0) disp) - (byte 4 1) - (ldb (byte 1 4) disp))))) - -(macrolet ((define-load-short-inst (name opcode) - `(define-instruction ,name (segment base disp reg &key modify) - (:declare (type tn base reg) - (type (or fixup (signed-byte 5)) disp) - (type (member :before :after nil) modify)) - (:delay 0) - (:dependencies (reads base) (writes reg) (reads :memory)) - (:printer extended-load/store ((ext4/c ,opcode) (t/im5 nil :type 'im5) - (op2 4)) - `(:name ,@cmplt-disp-print :tab x/im5/r - "(" s b ")" t/im5)) - (:emitter - (multiple-value-bind - (m a) - (ecase modify - ((nil) (values 0 0)) - (:after (values 1 0)) - (:before (values 1 1))) - (emit-extended-load/store segment #x03 (reg-tn-encoding base) - (short-disp-encoding segment disp) - 0 a 4 ,opcode m - (reg-tn-encoding reg)))))) - (define-store-short-inst (name opcode) - `(define-instruction ,name (segment reg base disp &key modify) - (:declare (type tn reg base) - (type (or fixup (signed-byte 5)) disp) - (type (member :before :after nil) modify)) - (:delay 0) - (:dependencies (reads base) (reads reg) (writes :memory)) - (:printer extended-load/store ((ext4/c ,opcode) (t/im5 nil :type 'im5) - (op2 4)) - `(:name ,@cmplt-disp-print :tab x/im5/r - "," t/im5 "(" s b ")")) - (:emitter - (multiple-value-bind - (m a) - (ecase modify - ((nil) (values 0 0)) - (:after (values 1 0)) - (:before (values 1 1))) - (emit-extended-load/store segment #x03 (reg-tn-encoding base) - (short-disp-encoding segment disp) - 0 a 4 ,opcode m - (reg-tn-encoding reg))))))) - (define-load-short-inst ldws 2) - (define-load-short-inst ldhs 1) - (define-load-short-inst ldbs 0) - (define-load-short-inst ldcws 7) - - (define-store-short-inst stws 10) - (define-store-short-inst sths 9) - (define-store-short-inst stbs 8)) - -(define-instruction stbys (segment reg base disp where &key modify) - (:declare (type tn reg base) - (type (signed-byte 5) disp) - (type (member :begin :end) where) - (type (member t nil) modify)) - (:delay 0) - (:dependencies (reads base) (reads reg) (writes :memory)) - (:printer extended-load/store ((ext4/c #xC) (t/im5 nil :type 'im5) (op2 4)) - `(:name ,@cmplt-store-print :tab x/im5/r "," t/im5 "(" s b ")")) - (:emitter - (emit-extended-load/store segment #x03 (reg-tn-encoding base) - (reg-tn-encoding reg) 0 - (ecase where (:begin 0) (:end 1)) - 4 #xC (if modify 1 0) - (short-disp-encoding segment disp)))) - - -;;;; Immediate 21-bit Instructions. -;;; Note the heavy scrambling of the immediate value to instruction memory - -(define-bitfield-emitter emit-imm21 32 - (byte 6 26) - (byte 5 21) - (byte 21 0)) - -(define-instruction ldil (segment value reg) - (:declare (type tn reg) - (type (or (signed-byte 32) (unsigned-byte 32) fixup) value)) - (:delay 0) - (:dependencies (writes reg)) - (:printer ldil ((op #x08))) - (:emitter - (emit-imm21 segment #x08 (reg-tn-encoding reg) - (encode-imm21 segment value)))) - -; this one overwrites number stack ? -(define-instruction addil (segment value reg) - (:declare (type tn reg) - (type (or (signed-byte 32) (unsigned-byte 32) fixup) value)) - (:delay 0) - (:dependencies (writes reg)) - (:printer ldil ((op #x0A))) - (:emitter - (emit-imm21 segment #x0A (reg-tn-encoding reg) - (encode-imm21 segment value)))) - - -;;;; Branch instructions. - -(define-bitfield-emitter emit-branch 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 3 13) - (byte 11 2) (byte 1 1) (byte 1 0)) - -(defun label-relative-displacement (label posn &optional delta-if-after) - (declare (type label label) (type index posn)) - (ash (- (if delta-if-after - (label-position label posn delta-if-after) - (label-position label)) - (+ posn 8)) -2)) - -(defun decompose-branch-disp (segment disp) - (declare (type (or fixup (signed-byte 17)) disp)) - (cond ((fixup-p disp) - (note-fixup segment :branch disp) - (aver (zerop (fixup-offset disp))) - (values 0 0 0)) - (t - (values (ldb (byte 5 11) disp) - (dpb (ldb (byte 10 0) disp) - (byte 10 1) - (ldb (byte 1 10) disp)) - (ldb (byte 1 16) disp))))) - -(defun emit-relative-branch (segment opcode link sub-opcode target nullify) - (declare (type (unsigned-byte 6) opcode) - (type (unsigned-byte 5) link) - (type (unsigned-byte 1) sub-opcode) - (type label target) - (type (member t nil) nullify)) - (emit-back-patch segment 4 - (lambda (segment posn) - (let ((disp (label-relative-displacement target posn))) - (aver (typep disp '(signed-byte 17))) - (multiple-value-bind - (w1 w2 w) - (decompose-branch-disp segment disp) - (emit-branch segment opcode link w1 sub-opcode w2 - (if nullify 1 0) w)))))) - -(define-instruction b (segment target &key nullify) - (:declare (type label target) (type (member t nil) nullify)) - (:delay 0) - (:emitter - (emit-relative-branch segment #x3A 0 0 target nullify))) - -(define-instruction bl (segment target reg &key nullify) - (:declare (type tn reg) (type label target) (type (member t nil) nullify)) - (:printer branch17 ((op1 #x3A) (op2 0)) '(:name n :tab w "," t)) - (:delay 0) - (:dependencies (writes reg)) - (:emitter - (emit-relative-branch segment #x3A (reg-tn-encoding reg) 0 target nullify))) - -(define-instruction gateway (segment target reg &key nullify) - (:declare (type tn reg) (type label target) (type (member t nil) nullify)) - (:printer branch17 ((op1 #x3A) (op2 1)) '(:name n :tab w "," t)) - (:delay 0) - (:dependencies (writes reg)) - (:emitter - (emit-relative-branch segment #x3A (reg-tn-encoding reg) 1 target nullify))) - -;;; BLR is useless because we have no way to generate the offset. - -(define-instruction bv (segment base &key nullify offset) - (:declare (type tn base) - (type (member t nil) nullify) - (type (or tn null) offset)) - (:delay 0) - (:dependencies (reads base)) - (:printer branch ((op1 #x3A) (op2 6)) '(:name n :tab x "(" t ")")) - (:emitter - (emit-branch segment #x3A (reg-tn-encoding base) - (if offset (reg-tn-encoding offset) 0) - 6 0 (if nullify 1 0) 0))) - -(define-instruction be (segment disp space base &key nullify) - (:declare (type (or fixup (signed-byte 17)) disp) - (type tn base) - (type (unsigned-byte 3) space) - (type (member t nil) nullify)) - (:delay 0) - (:dependencies (reads base)) - (:printer branch17 ((op1 #x38) (op2 nil :type 'im3)) - '(:name n :tab w "(" op2 "," t ")")) - (:emitter - (multiple-value-bind - (w1 w2 w) - (decompose-branch-disp segment disp) - (emit-branch segment #x38 (reg-tn-encoding base) w1 - (space-encoding space) w2 (if nullify 1 0) w)))) - -(define-instruction ble (segment disp space base &key nullify) - (:declare (type (or fixup (signed-byte 17)) disp) - (type tn base) - (type (unsigned-byte 3) space) - (type (member t nil) nullify)) - (:delay 0) - (:dependencies (reads base)) - (:printer branch17 ((op1 #x39) (op2 nil :type 'im3)) - '(:name n :tab w "(" op2 "," t ")")) - (:dependencies (writes lip-tn)) - (:emitter - (multiple-value-bind - (w1 w2 w) - (decompose-branch-disp segment disp) - (emit-branch segment #x39 (reg-tn-encoding base) w1 - (space-encoding space) w2 (if nullify 1 0) w)))) - -(defun emit-conditional-branch (segment opcode r2 r1 cond target nullify) - (emit-back-patch segment 4 - (lambda (segment posn) - (let ((disp (label-relative-displacement target posn))) - ; emit-conditional-branch is used by instruction emitters: MOVB, COMB, ADDB and BB - ; which assembles an immediate of total 12 bits (including sign bit). - (aver (typep disp '(signed-byte 12))) - (let ((w1 (logior (ash (ldb (byte 10 0) disp) 1) - (ldb (byte 1 10) disp))) - (w (ldb (byte 1 11) disp))) ; take out the sign bit - (emit-branch segment opcode r2 r1 cond w1 (if nullify 1 0) w)))))) - -(defun im5-encoding (value) - (declare (type (signed-byte 5) value) - #+nil (values (unsigned-byte 5))) - (dpb (ldb (byte 4 0) value) - (byte 4 1) - (ldb (byte 1 4) value))) - -(macrolet ((define-branch-inst (r-name r-opcode i-name i-opcode cond-kind - writes-reg) - (let* ((conditional (symbolicate cond-kind "-CONDITION")) - (false-conditional (symbolicate conditional "-FALSE"))) - `(progn - (define-instruction ,r-name (segment cond r1 r2 target &key nullify) - (:declare (type ,conditional cond) - (type tn r1 r2) - (type label target) - (type (member t nil) nullify)) - (:delay 0) - ,@(ecase writes-reg - (:write-reg - '((:dependencies (reads r1) (reads r2) (writes r2)))) - (:pinned - '(:pinned)) - (nil - '((:dependencies (reads r1) (reads r2))))) -; ,@(if writes-reg -; '((:dependencies (reads r1) (reads r2) (writes r2))) -; '((:dependencies (reads r1) (reads r2)))) - (:printer branch12 ((op1 ,r-opcode) (c nil :type ',conditional)) - '(:name c n :tab r1 "," r2 "," w)) - ,@(unless (= r-opcode #x32) - `((:printer branch12 ((op1 ,(+ 2 r-opcode)) - (c nil :type ',false-conditional)) - '(:name c n :tab r1 "," r2 "," w)))) - (:emitter - (multiple-value-bind - (cond-encoding false) - (,conditional cond) - (emit-conditional-branch - segment (if false ,(+ r-opcode 2) ,r-opcode) - (reg-tn-encoding r2) (reg-tn-encoding r1) - cond-encoding target nullify)))) - (define-instruction ,i-name (segment cond imm reg target &key nullify) - (:declare (type ,conditional cond) - (type (signed-byte 5) imm) - (type tn reg) - (type (member t nil) nullify)) - (:delay 0) -; ,@(if writes-reg -; '((:dependencies (reads reg) (writes reg))) -; '((:dependencies (reads reg)))) - ,@(ecase writes-reg - (:write-reg - '((:dependencies (reads r1) (reads r2) (writes r2)))) - (:pinned - '(:pinned)) - (nil - '((:dependencies (reads r1) (reads r2))))) - (:printer branch12 ((op1 ,i-opcode) (r1 nil :type 'im5) - (c nil :type ',conditional)) - '(:name c n :tab r1 "," r2 "," w)) - ,@(unless (= r-opcode #x32) - `((:printer branch12 ((op1 ,(+ 2 i-opcode)) (r1 nil :type 'im5) - (c nil :type ',false-conditional)) - '(:name c n :tab r1 "," r2 "," w)))) - (:emitter - (multiple-value-bind - (cond-encoding false) - (,conditional cond) - (emit-conditional-branch - segment (if false (+ ,i-opcode 2) ,i-opcode) - (reg-tn-encoding reg) (im5-encoding imm) - cond-encoding target nullify)))))))) - (define-branch-inst movb #x32 movib #x33 extract/deposit :write-reg) - (define-branch-inst comb #x20 comib #x21 compare :pinned) - (define-branch-inst addb #x28 addib #x29 add :write-reg)) - -(define-instruction bb (segment cond reg posn target &key nullify) - (:declare (type (member t nil) cond nullify) - (type tn reg) - (type (or (member :variable) (unsigned-byte 5)) posn)) - (:delay 0) - (:dependencies (reads reg)) - (:printer branch12 ((op1 30) (c nil :type 'extract/deposit-condition)) - '('BVB c n :tab r1 "," w)) - (:emitter - (multiple-value-bind - (opcode posn-encoding) - (if (eq posn :variable) - (values #x30 0) - (values #x31 posn)) - (emit-conditional-branch segment opcode posn-encoding - (reg-tn-encoding reg) - (if cond 2 6) target nullify)))) - - -;;;; Computation Instructions - -(define-bitfield-emitter emit-r3-inst 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 3 13) - (byte 1 12) (byte 7 5) (byte 5 0)) - -(macrolet ((define-r3-inst (name cond-kind opcode &optional pinned) - `(define-instruction ,name (segment r1 r2 res &optional cond) - (:declare (type tn res r1 r2)) - (:delay 0) - ,@(if pinned - '(:pinned) - '((:dependencies (reads r1) (reads r2) (writes res)))) - (:printer r3-inst ((op ,opcode) (c nil :type ',(symbolicate - cond-kind - "-CONDITION")))) - ,@(when (eq name 'or) - `((:printer r3-inst ((op ,opcode) (r2 0) - (c nil :type ',(symbolicate cond-kind - "-CONDITION"))) - `('COPY :tab r1 "," t)))) - (:emitter - (multiple-value-bind - (cond false) - (,(symbolicate cond-kind "-CONDITION") cond) - (emit-r3-inst segment #x02 (reg-tn-encoding r2) (reg-tn-encoding r1) - cond (if false 1 0) ,opcode - (reg-tn-encoding res))))))) - (define-r3-inst add add #x30) - (define-r3-inst addl add #x50) - (define-r3-inst addo add #x70) - (define-r3-inst addc add #x38) - (define-r3-inst addco add #x78) - (define-r3-inst sh1add add #x32) - (define-r3-inst sh1addl add #x52) - (define-r3-inst sh1addo add #x72) - (define-r3-inst sh2add add #x34) - (define-r3-inst sh2addl add #x54) - (define-r3-inst sh2addo add #x74) - (define-r3-inst sh3add add #x36) - (define-r3-inst sh3addl add #x56) - (define-r3-inst sh3addo add #x76) - (define-r3-inst sub compare #x20) - (define-r3-inst subo compare #x60) - (define-r3-inst subb compare #x28) - (define-r3-inst subbo compare #x68) - (define-r3-inst subt compare #x26) - (define-r3-inst subto compare #x66) - (define-r3-inst ds compare #x22) - (define-r3-inst comclr compare #x44) - (define-r3-inst or logical #x12 t) ; as a nop it must be pinned - (define-r3-inst xor logical #x14) - (define-r3-inst and logical #x10) - (define-r3-inst andcm logical #x00) - (define-r3-inst uxor unit #x1C) - (define-r3-inst uaddcm unit #x4C) - (define-r3-inst uaddcmt unit #x4E) - (define-r3-inst dcor unit #x5C) - (define-r3-inst idcor unit #x5E)) - -(define-bitfield-emitter emit-imm-inst 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 3 13) - (byte 1 12) (byte 1 11) (byte 11 0)) - -(macrolet ((define-imm-inst (name cond-kind opcode subcode &optional pinned) - (declare (ignorable pinned)) - `(define-instruction ,name (segment imm src dst &optional cond) - (:declare (type tn dst src) - (type (signed-byte 11) imm)) - (:delay 0) - (:printer imm-inst ((op ,opcode) (o ,subcode) - (c nil :type - ',(symbolicate cond-kind "-CONDITION")))) - (:dependencies (reads imm) (reads src) (writes dst)) - (:emitter - (multiple-value-bind (cond false) - (,(symbolicate cond-kind "-CONDITION") cond) - (emit-imm-inst segment ,opcode (reg-tn-encoding src) - (reg-tn-encoding dst) cond - (if false 1 0) ,subcode - (encode-imm11 imm))))))) - (define-imm-inst addi add #x2D 0) - (define-imm-inst addio add #x2D 1) - (define-imm-inst addit add #x2C 0) - (define-imm-inst addito add #x2C 1) - (define-imm-inst subi compare #x25 0) - (define-imm-inst subio compare #x25 1) - (define-imm-inst comiclr compare #x24 0)) - -(define-bitfield-emitter emit-extract/deposit-inst 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 3 13) - (byte 3 10) (byte 5 5) (byte 5 0)) - -(define-instruction shd (segment r1 r2 count res &optional cond) - (:declare (type tn res r1 r2) - (type (or (member :variable) (integer 0 31)) count)) - (:delay 0) - :pinned - (:printer extract/deposit-inst ((op1 #x34) (op2 2) (t/clen nil :type 'reg)) - '(:name c :tab r1 "," r2 "," cp "," t/clen)) - (:printer extract/deposit-inst ((op1 #x34) (op2 0) (t/clen nil :type 'reg)) - '('VSHD c :tab r1 "," r2 "," t/clen)) - (:emitter - (etypecase count - ((member :variable) - (emit-extract/deposit-inst segment #x34 - (reg-tn-encoding r2) (reg-tn-encoding r1) - (extract/deposit-condition cond) - 0 0 (reg-tn-encoding res))) - ((integer 0 31) - (emit-extract/deposit-inst segment #x34 - (reg-tn-encoding r2) (reg-tn-encoding r1) - (extract/deposit-condition cond) - 2 (- 31 count) - (reg-tn-encoding res)))))) - -(macrolet ((define-extract-inst (name opcode) - `(define-instruction ,name (segment src posn len res &optional cond) - (:declare (type tn res src) - (type (or (member :variable) (integer 0 31)) posn) - (type (integer 1 32) len)) - (:delay 0) - (:dependencies (reads src) (writes res)) - (:printer extract/deposit-inst ((op1 #x34) (cp nil :type 'integer) - (op2 ,opcode)) - '(:name c :tab r2 "," cp "," t/clen "," r1)) - (:printer extract/deposit-inst ((op1 #x34) (op2 ,(- opcode 2))) - '('V :name c :tab r2 "," t/clen "," r1)) - (:emitter - (etypecase posn - ((member :variable) - (emit-extract/deposit-inst segment #x34 (reg-tn-encoding src) - (reg-tn-encoding res) - (extract/deposit-condition cond) - ,(- opcode 2) 0 (- 32 len))) - ((integer 0 31) - (emit-extract/deposit-inst segment #x34 (reg-tn-encoding src) - (reg-tn-encoding res) - (extract/deposit-condition cond) - ,opcode posn (- 32 len)))))))) - (define-extract-inst extru 6) - (define-extract-inst extrs 7)) - -(macrolet ((define-deposit-inst (name opcode) - `(define-instruction ,name (segment src posn len res &optional cond) - (:declare (type tn res) - (type (or tn (signed-byte 5)) src) - (type (or (member :variable) (integer 0 31)) posn) - (type (integer 1 32) len)) - (:delay 0) - (:dependencies (reads src) (writes res)) - (:printer extract/deposit-inst ((op1 #x35) (op2 ,opcode)) - ',(let ((base '('VDEP c :tab r1 "," t/clen "," r2))) - (if (= opcode 0) (cons ''Z base) base))) - (:printer extract/deposit-inst ((op1 #x35) (op2 ,(+ 2 opcode))) - ',(let ((base '('DEP c :tab r1 "," cp "," t/clen "," r2))) - (if (= opcode 0) (cons ''Z base) base))) - (:printer extract/deposit-inst ((op1 #x35) (r1 nil :type 'im5) - (op2 ,(+ 4 opcode))) - ',(let ((base '('VDEPI c :tab r1 "," t/clen "," r2))) - (if (= opcode 0) (cons ''Z base) base))) - (:printer extract/deposit-inst ((op1 #x35) (r1 nil :type 'im5) - (op2 ,(+ 6 opcode))) - ',(let ((base '('DEPI c :tab r1 "," cp "," t/clen "," r2))) - (if (= opcode 0) (cons ''Z base) base))) - (:emitter - (multiple-value-bind - (opcode src-encoding) - (etypecase src - (tn - (values ,opcode (reg-tn-encoding src))) - ((signed-byte 5) - (values ,(+ opcode 4) (im5-encoding src)))) - (multiple-value-bind - (opcode posn-encoding) - (etypecase posn - ((member :variable) - (values opcode 0)) - ((integer 0 31) - (values (+ opcode 2) (- 31 posn)))) - (emit-extract/deposit-inst segment #x35 (reg-tn-encoding res) - src-encoding - (extract/deposit-condition cond) - opcode posn-encoding (- 32 len)))))))) - - (define-deposit-inst dep 1) - (define-deposit-inst zdep 0)) - - - -;;;; System Control Instructions. - -(define-bitfield-emitter emit-break 32 - (byte 6 26) (byte 13 13) (byte 8 5) (byte 5 0)) - -(define-instruction break (segment &optional (im5 0) (im13 0)) - (:declare (type (unsigned-byte 13) im13) - (type (unsigned-byte 5) im5)) - (:cost 0) - (:delay 0) - :pinned - (:printer break () :default :control #'break-control) - (:emitter - (emit-break segment 0 im13 0 im5))) - -(define-bitfield-emitter emit-system-inst 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 3 13) (byte 8 5) (byte 5 0)) - -(define-instruction ldsid (segment res base &optional (space 0)) - (:declare (type tn res base) - (type (integer 0 3) space)) - (:delay 0) - :pinned - (:printer system-inst ((op2 #x85) (c nil :type 'space) - (s nil :printer #(0 0 1 1 2 2 3 3))) - `(:name :tab "(" s r1 ")," r3)) - (:emitter - (emit-system-inst segment 0 (reg-tn-encoding base) 0 (ash space 1) #x85 - (reg-tn-encoding res)))) - -(define-instruction mtsp (segment reg space) - (:declare (type tn reg) (type (integer 0 7) space)) - (:delay 0) - :pinned - (:printer system-inst ((op2 #xC1)) '(:name :tab r2 "," s)) - (:emitter - (emit-system-inst segment 0 0 (reg-tn-encoding reg) (space-encoding space) - #xC1 0))) - -(define-instruction mfsp (segment space reg) - (:declare (type tn reg) (type (integer 0 7) space)) - (:delay 0) - :pinned - (:printer system-inst ((op2 #x25) (c nil :type 'space)) '(:name :tab s r3)) - (:emitter - (emit-system-inst segment 0 0 0 (space-encoding space) #x25 - (reg-tn-encoding reg)))) - -(deftype control-reg () - '(or (unsigned-byte 5) (member :sar))) - -(defun control-reg (reg) - (declare (type control-reg reg) - #+nil (values (unsigned-byte 32))) - (if (typep reg '(unsigned-byte 5)) - reg - (ecase reg - (:sar 11)))) - -(define-instruction mtctl (segment reg ctrl-reg) - (:declare (type tn reg) (type control-reg ctrl-reg)) - (:delay 0) - :pinned - (:printer system-inst ((op2 #xC2)) '(:name :tab r2 "," r1)) - (:emitter - (emit-system-inst segment 0 (control-reg ctrl-reg) (reg-tn-encoding reg) - 0 #xC2 0))) - -(define-instruction mfctl (segment ctrl-reg reg) - (:declare (type tn reg) (type control-reg ctrl-reg)) - (:delay 0) - :pinned - (:printer system-inst ((op2 #x45)) '(:name :tab r1 "," r3)) - (:emitter - (emit-system-inst segment 0 (control-reg ctrl-reg) 0 0 #x45 - (reg-tn-encoding reg)))) - - - -;;;; Floating point instructions. - -(define-bitfield-emitter emit-fp-load/store 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 2 14) (byte 1 13) (byte 1 12) - (byte 2 10) (byte 1 9) (byte 3 6) (byte 1 5) (byte 5 0)) - -(define-instruction fldx (segment index base result &key modify scale side) - (:declare (type tn index base result) - (type (member t nil) modify scale) - (type (member nil 0 1) side)) - (:delay 0) - :pinned - (:printer fp-load/store ((op #x0b) (x1 0) (x2 0) (x3 0)) - `('FLDD ,@cmplt-index-print :tab x "(" s b ")" "," t)) - (:printer fp-load/store ((op #x09) (x1 0) (x2 0) (x3 0)) - `('FLDW ,@cmplt-index-print :tab x "(" s b ")" "," t)) - (:emitter - (multiple-value-bind - (result-encoding double-p) - (fp-reg-tn-encoding result) - (when side - (aver double-p) - (setf double-p nil)) - (emit-fp-load/store segment (if double-p #x0B #x09) (reg-tn-encoding base) - (reg-tn-encoding index) 0 (if scale 1 0) 0 0 0 - (or side 0) (if modify 1 0) result-encoding)))) - -(define-instruction fstx (segment value index base &key modify scale side) - (:declare (type tn index base value) - (type (member t nil) modify scale) - (type (member nil 0 1) side)) - (:delay 0) - :pinned - (:printer fp-load/store ((op #x0b) (x1 0) (x2 0) (x3 1)) - `('FSTD ,@cmplt-index-print :tab t "," x "(" s b ")")) - (:printer fp-load/store ((op #x09) (x1 0) (x2 0) (x3 1)) - `('FSTW ,@cmplt-index-print :tab t "," x "(" s b ")")) - (:emitter - (multiple-value-bind - (value-encoding double-p) - (fp-reg-tn-encoding value) - (when side - (aver double-p) - (setf double-p nil)) - (emit-fp-load/store segment (if double-p #x0B #x09) (reg-tn-encoding base) - (reg-tn-encoding index) 0 (if scale 1 0) 0 0 1 - (or side 0) (if modify 1 0) value-encoding)))) - -(define-instruction flds (segment disp base result &key modify side) - (:declare (type tn base result) - (type (signed-byte 5) disp) - (type (member :before :after nil) modify) - (type (member nil 0 1) side)) - (:delay 0) - :pinned - (:printer fp-load/store ((op #x0b) (x nil :type 'im5) (x1 1) (x2 0) (x3 0)) - `('FLDD ,@cmplt-disp-print :tab x "(" s b ")," t)) - (:printer fp-load/store ((op #x09) (x nil :type 'im5) (x1 1) (x2 0) (x3 0)) - `('FLDW ,@cmplt-disp-print :tab x "(" s b ")," t)) - (:emitter - (multiple-value-bind - (result-encoding double-p) - (fp-reg-tn-encoding result) - (when side - (aver double-p) - (setf double-p nil)) - (emit-fp-load/store segment (if double-p #x0B #x09) (reg-tn-encoding base) - (short-disp-encoding segment disp) 0 - (if (eq modify :before) 1 0) 1 0 0 - (or side 0) (if modify 1 0) result-encoding)))) - -(define-instruction fsts (segment value disp base &key modify side) - (:declare (type tn base value) - (type (signed-byte 5) disp) - (type (member :before :after nil) modify) - (type (member nil 0 1) side)) - (:delay 0) - :pinned - (:printer fp-load/store ((op #x0b) (x nil :type 'im5) (x1 1) (x2 0) (x3 1)) - `('FSTD ,@cmplt-disp-print :tab t "," x "(" s b ")")) - (:printer fp-load/store ((op #x09) (x nil :type 'im5) (x1 1) (x2 0) (x3 1)) - `('FSTW ,@cmplt-disp-print :tab t "," x "(" s b ")")) - (:emitter - (multiple-value-bind - (value-encoding double-p) - (fp-reg-tn-encoding value) - (when side - (aver double-p) - (setf double-p nil)) - (emit-fp-load/store segment (if double-p #x0B #x09) (reg-tn-encoding base) - (short-disp-encoding segment disp) 0 - (if (eq modify :before) 1 0) 1 0 1 - (or side 0) (if modify 1 0) value-encoding)))) - - -(define-bitfield-emitter emit-fp-class-0-inst 32 - (byte 6 26) (byte 5 21) (byte 5 16) (byte 3 13) (byte 2 11) (byte 2 9) - (byte 3 6) (byte 1 5) (byte 5 0)) - -(define-bitfield-emitter emit-fp-class-1-inst 32 - (byte 6 26) (byte 5 21) (byte 4 17) (byte 2 15) (byte 2 13) (byte 2 11) - (byte 2 9) (byte 3 6) (byte 1 5) (byte 5 0)) - -;;; Note: classes 2 and 3 are similar enough to class 0 that we don't need -;;; seperate emitters. - -(defconstant-eqx funops '(:copy :abs :sqrt :rnd) - #'equalp) - -(deftype funop () - `(member ,@funops)) - -(define-instruction funop (segment op from to) - (:declare (type funop op) - (type tn from to)) - (:delay 0) - :pinned - (:printer fp-class-0-inst ((op1 #x0C) (op2 2) (x2 0)) - '('FCPY fmt :tab r "," t)) - (:printer fp-class-0-inst ((op1 #x0C) (op2 3) (x2 0)) - '('FABS fmt :tab r "," t)) - (:printer fp-class-0-inst ((op1 #x0C) (op2 4) (x2 0)) - '('FSQRT fmt :tab r "," t)) - (:printer fp-class-0-inst ((op1 #x0C) (op2 5) (x2 0)) - '('FRND fmt :tab r "," t)) - (:emitter - (multiple-value-bind - (from-encoding from-double-p) - (fp-reg-tn-encoding from) - (multiple-value-bind - (to-encoding to-double-p) - (fp-reg-tn-encoding to) - (aver (eq from-double-p to-double-p)) - (emit-fp-class-0-inst segment #x0C from-encoding 0 - (+ 2 (or (position op funops) - (error "Bogus FUNOP: ~S" op))) - (if to-double-p 1 0) 0 0 0 to-encoding))))) - -(macrolet ((define-class-1-fp-inst (name subcode) - `(define-instruction ,name (segment from to) - (:declare (type tn from to)) - (:delay 0) - (:printer fp-class-1-inst ((op1 #x0C) (x2 ,subcode)) - '(:name sf df :tab r "," t)) - (:emitter - (multiple-value-bind - (from-encoding from-double-p) - (fp-reg-tn-encoding from) - (multiple-value-bind - (to-encoding to-double-p) - (fp-reg-tn-encoding to) - (emit-fp-class-1-inst segment #x0C from-encoding 0 ,subcode - (if to-double-p 1 0) (if from-double-p 1 0) - 1 0 0 to-encoding))))))) - - (define-class-1-fp-inst fcnvff 0) - (define-class-1-fp-inst fcnvxf 1) - (define-class-1-fp-inst fcnvfx 2) - (define-class-1-fp-inst fcnvfxt 3)) - -(define-instruction fcmp (segment cond r1 r2) - (:declare (type (unsigned-byte 5) cond) - (type tn r1 r2)) - (:delay 0) - :pinned - (:printer fp-class-0-inst ((op1 #x0C) (op2 0) (x2 2) (t nil :type 'fcmp-cond)) - '(:name fmt t :tab r "," x1)) - (:emitter - (multiple-value-bind - (r1-encoding r1-double-p) - (fp-reg-tn-encoding r1) - (multiple-value-bind - (r2-encoding r2-double-p) - (fp-reg-tn-encoding r2) - (aver (eq r1-double-p r2-double-p)) - (emit-fp-class-0-inst segment #x0C r1-encoding r2-encoding 0 - (if r1-double-p 1 0) 2 0 0 cond))))) - -(define-instruction ftest (segment) - (:delay 0) - :pinned - (:printer fp-class-0-inst ((op1 #x0c) (op2 1) (x2 2)) '(:name)) - (:emitter - (emit-fp-class-0-inst segment #x0C 0 0 1 0 2 0 1 0))) - -(defconstant-eqx fbinops '(:add :sub :mpy :div) - #'equalp) - -(deftype fbinop () - `(member ,@fbinops)) - -(define-instruction fbinop (segment op r1 r2 result) - (:declare (type fbinop op) - (type tn r1 r2 result)) - (:delay 0) - :pinned - (:printer fp-class-0-inst ((op1 #x0C) (op2 0) (x2 3)) - '('FADD fmt :tab r "," x1 "," t)) - (:printer fp-class-0-inst ((op1 #x0C) (op2 1) (x2 3)) - '('FSUB fmt :tab r "," x1 "," t)) - (:printer fp-class-0-inst ((op1 #x0C) (op2 2) (x2 3)) - '('FMPY fmt :tab r "," x1 "," t)) - (:printer fp-class-0-inst ((op1 #x0C) (op2 3) (x2 3)) - '('FDIV fmt :tab r "," x1 "," t)) - (:emitter - (multiple-value-bind - (r1-encoding r1-double-p) - (fp-reg-tn-encoding r1) - (multiple-value-bind - (r2-encoding r2-double-p) - (fp-reg-tn-encoding r2) - (aver (eq r1-double-p r2-double-p)) - (multiple-value-bind - (result-encoding result-double-p) - (fp-reg-tn-encoding result) - (aver (eq r1-double-p result-double-p)) - (emit-fp-class-0-inst segment #x0C r1-encoding r2-encoding - (or (position op fbinops) - (error "Bogus FBINOP: ~S" op)) - (if r1-double-p 1 0) 3 0 0 - result-encoding)))))) - - - -;;;; Instructions built out of other insts. - -(define-instruction-macro move (src dst &optional cond) - `(inst or ,src zero-tn ,dst ,cond)) - -(define-instruction-macro nop (&optional cond) - `(inst or zero-tn zero-tn zero-tn ,cond)) - -(define-instruction li (segment value reg) - (:declare (type tn reg) - (type (or fixup (signed-byte 32) (unsigned-byte 32)) value)) - (:delay 0) - (:dependencies (reads reg)) - (:vop-var vop) - (:emitter - (assemble (segment vop) - (etypecase value - (fixup - (inst ldil value reg) - (inst ldo value reg reg :unsigned t)) - ((signed-byte 14) - (inst ldo value zero-tn reg)) - ((or (signed-byte 32) (unsigned-byte 32)) - (let ((lo (ldb (byte 11 0) value))) - (inst ldil value reg) - (inst ldo lo reg reg :unsigned t))))))) - -(define-instruction-macro sll (src count result &optional cond) - (once-only ((result result) (src src) (count count) (cond cond)) - `(inst zdep ,src (- 31 ,count) (- 32 ,count) ,result ,cond))) - -(define-instruction-macro sra (src count result &optional cond) - (once-only ((result result) (src src) (count count) (cond cond)) - `(inst extrs ,src (- 31 ,count) (- 32 ,count) ,result ,cond))) - -(define-instruction-macro srl (src count result &optional cond) - (once-only ((result result) (src src) (count count) (cond cond)) - `(inst extru ,src (- 31 ,count) (- 32 ,count) ,result ,cond))) - -(defun maybe-negate-cond (cond negate) - (if negate - (multiple-value-bind - (value negate) - (compare-condition cond) - (if negate - (nth value compare-conditions) - (nth (+ value 8) compare-conditions))) - cond)) - -(define-instruction bc (segment cond not-p r1 r2 target) - (:declare (type compare-condition cond) - (type (member t nil) not-p) - (type tn r1 r2) - (type label target)) - (:delay 0) - (:dependencies (reads r1) (reads r2)) - (:vop-var vop) - (:emitter - (emit-chooser segment 8 2 - (lambda (segment chooser posn delta) - (declare (ignore chooser)) - (let ((disp (label-relative-displacement target posn delta))) - (when (<= 0 disp (1- (ash 1 11))) - (assemble (segment vop) - (inst comb (maybe-negate-cond cond not-p) r1 r2 target - :nullify t)) - t))) - (lambda (segment posn) - (let ((disp (label-relative-displacement target posn))) - (assemble (segment vop) - (cond ((typep disp '(signed-byte 12)) - (inst comb (maybe-negate-cond cond not-p) r1 r2 target) - (inst nop)) ; FIXME-lav, cant nullify when backward branch - (t - (inst comclr r1 r2 zero-tn - (maybe-negate-cond cond (not not-p))) - (inst b target :nullify t))))))))) - -(define-instruction bci (segment cond not-p imm reg target) - (:declare (type compare-condition cond) - (type (member t nil) not-p) - (type (signed-byte 11) imm) - (type tn reg) - (type label target)) - (:delay 0) - (:dependencies (reads reg)) - (:vop-var vop) - (:emitter - (emit-chooser segment 8 2 - (lambda (segment chooser posn delta-if-after) - (declare (ignore chooser)) - (let ((disp (label-relative-displacement target posn delta-if-after))) - (when (and (<= 0 disp (1- (ash 1 11))) - (typep imm '(signed-byte 5))) - (assemble (segment vop) - (inst comib (maybe-negate-cond cond not-p) imm reg target - :nullify t)) - t))) - (lambda (segment posn) - (let ((disp (label-relative-displacement target posn))) - (assemble (segment vop) - (cond ((and (typep disp '(signed-byte 12)) - (typep imm '(signed-byte 5))) - (inst comib (maybe-negate-cond cond not-p) imm reg target) - (inst nop)) - (t - (inst comiclr imm reg zero-tn - (maybe-negate-cond cond (not not-p))) - (inst b target :nullify t))))))))) - - -;;;; Instructions to convert between code ptrs, functions, and lras. - -(defun emit-header-data (segment type) - (emit-back-patch - segment 4 - (lambda (segment posn) - (emit-word segment - (logior type - (ash (+ posn (component-header-length)) - (- n-widetag-bits word-shift))))))) - -(define-instruction simple-fun-header-word (segment) - :pinned - (:cost 0) - (:delay 0) - (:emitter - (emit-header-data segment simple-fun-widetag))) - -(define-instruction lra-header-word (segment) - :pinned - (:cost 0) - (:delay 0) - (:emitter - (emit-header-data segment return-pc-widetag))) - - -(defun emit-compute-inst (segment vop src label temp dst calc) - (emit-chooser - ;; We emit either 12 or 4 bytes, so we maintain 3 byte alignments. - segment 12 3 - ;; This is the best-case that emits one instruction ( 4 bytes ) - (lambda (segment chooser posn delta-if-after) - (declare (ignore chooser)) - (let ((delta (funcall calc label posn delta-if-after))) - ;; WHEN, Why not AVER ? - (when (typep delta '(signed-byte 11)) - (emit-back-patch segment 4 - (lambda (segment posn) - (assemble (segment vop) - (inst addi (funcall calc label posn 0) src - dst)))) - t))) - ;; This is the worst-case that emits three instruction ( 12 bytes ) - (lambda (segment posn) - (let ((delta (funcall calc label posn 0))) - ;; FIXME-lav: why do we hit below check ? - ;; (when (<= (- (ash 1 10)) delta (1- (ash 1 10))) - ;; (error "emit-compute-inst selected worst-case, but is shrinkable, delta is ~s" delta)) - ;; Note: if we used addil/ldo to do this in 2 instructions then the - ;; intermediate value would be tagged but pointing into space. - ;; Does above note mean that the intermediate value would be - ;; a bogus pointer that would be GCed wrongly ? - ;; Also what I can see addil would also overwrite NFP (r1) ??? - (assemble (segment vop) - ;; Three instructions (4 * 3) this is the reason for 12 bytes - (inst ldil delta temp) - (inst ldo (ldb (byte 11 0) delta) temp temp :unsigned t) - (inst add src temp dst)))))) - -(macrolet ((compute ((name) &body body) - `(define-instruction ,name (segment src label temp dst) - (:declare (type tn src dst temp) (type label label)) - (:attributes variable-length) - (:dependencies (reads src) (writes dst) (writes temp)) - (:delay 0) - (:vop-var vop) - (:emitter - (emit-compute-inst segment vop src label temp dst - ,@body))))) - (compute (compute-code-from-lip) - (lambda (label posn delta-if-after) - (- other-pointer-lowtag - (label-position label posn delta-if-after) - (component-header-length)))) - (compute (compute-code-from-lra) - (lambda (label posn delta-if-after) - (- (+ (label-position label posn delta-if-after) - (component-header-length))))) - (compute (compute-lra-from-code) - (lambda (label posn delta-if-after) - (+ (label-position label posn delta-if-after) - (component-header-length))))) - -;;;; Data instructions. -(define-bitfield-emitter emit-word 32 - (byte 32 0)) - -(macrolet ((data (size type) - `(define-instruction ,size (segment ,size) - (:declare (type ,type ,size)) - (:cost 0) - (:delay 0) - :pinned - (:emitter - (etypecase ,size - ,@(when (eq size 'word) - '((fixup - (note-fixup segment :absolute word) - (emit-word segment 0)))) - (integer - (,(symbolicate "EMIT-" size) segment ,size))))))) - (data byte (or (unsigned-byte 8) (signed-byte 8))) - (data short (or (unsigned-byte 16) (signed-byte 16))) - (data word (or (unsigned-byte 32) (signed-byte 32) fixup))) diff --git a/src/compiler/hppa/macros.lisp b/src/compiler/hppa/macros.lisp deleted file mode 100644 index 061453551b..0000000000 --- a/src/compiler/hppa/macros.lisp +++ /dev/null @@ -1,386 +0,0 @@ -;;;; various useful macros for generating HPPA code - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. -(in-package "SB-VM") - - - -(defmacro expand (expr) - (let ((gensym (gensym))) - `(macrolet - ((,gensym () - ,expr)) - (,gensym)))) - -;;; Instruction-like macros. -;;; FIXME-lav: add if always-emit-code-p is :e= then error if location= -(defmacro move (src dst &optional always-emit-code-p) - "Move SRC into DST (unless they are location= and ALWAYS-EMIT-CODE-P is nil)." - (once-only ((n-src src) - (n-dst dst)) - `(if (location= ,n-dst ,n-src) - (when ,always-emit-code-p - (inst nop)) - (inst move ,n-src ,n-dst)))) - -(defmacro loadw (result base &optional (offset 0) (lowtag 0)) - (once-only ((result result) (base base)) - `(inst ldw (- (ash ,offset word-shift) ,lowtag) ,base ,result))) - -(defmacro storew (value base &optional (offset 0) (lowtag 0)) - (once-only ((value value) (base base) (offset offset) (lowtag lowtag)) - `(inst stw ,value (- (ash ,offset word-shift) ,lowtag) ,base))) - -(defmacro load-symbol (reg symbol) - (once-only ((reg reg) (symbol symbol)) - `(let ((offset (static-symbol-offset ,symbol))) - (cond - ((typep offset '(signed-byte 11)) - (inst addi offset null-tn ,reg)) - (t - (inst ldil offset ,reg) - (inst ldo offset null-tn ,reg :unsigned t)))))) - -(defmacro load-symbol-value (reg symbol) - `(inst ldw - (+ (static-symbol-offset ',symbol) - (ash symbol-value-slot word-shift) - (- other-pointer-lowtag)) - null-tn ,reg)) - -(defmacro store-symbol-value (reg symbol) - `(inst stw ,reg (+ (static-symbol-offset ',symbol) - (ash symbol-value-slot word-shift) - (- other-pointer-lowtag)) - null-tn)) - -(defmacro load-type (target source &optional (offset 0)) - "Loads the type bits of a pointer into target independent of -byte-ordering issues." - (once-only ((n-target target) - (n-source source) - (n-offset offset)) - (ecase *backend-byte-order* - (:little-endian - `(inst ldb ,n-offset ,n-source ,n-target)) - (:big-endian - `(inst ldb (+ ,n-offset (1- n-word-bytes)) ,n-source ,n-target))))) - -(defmacro set-lowtag (tag src dst) - `(progn - (inst move ,src ,dst) - (inst dep ,tag 31 n-lowtag-bits ,dst))) - -;;; Macros to handle the fact that we cannot use the machine native call and -;;; return instructions. - -(defmacro lisp-jump (function) - "Jump to the lisp function FUNCTION." - `(progn - (inst addi (- (ash simple-fun-insts-offset word-shift) - fun-pointer-lowtag) ,function lip-tn) - (inst bv lip-tn) - (move ,function code-tn t))) - -(defmacro lisp-return (return-pc &key (offset 0) (frob-code t)) - "Return to RETURN-PC." - `(progn - (inst addi (- (* (1+ ,offset) n-word-bytes) other-pointer-lowtag) - ,return-pc lip-tn) - (inst bv lip-tn ,@(unless frob-code '(:nullify t))) - ,@(if frob-code - `((move ,return-pc code-tn t))))) - -(defmacro emit-return-pc (label) - "Emit a return-pc header word. LABEL is the label to use for this - return-pc." - `(progn - ;; alignment causes the return point to land on two address, - ;; where the first must be nop pad. - (emit-alignment n-lowtag-bits) - (emit-label ,label) - (inst lra-header-word))) - - -;;;; Stack TN's - -;;; Move a stack TN to a register and vice-versa. -(defmacro load-stack-tn (reg stack) - `(let ((reg ,reg) - (stack ,stack)) - (let ((offset (tn-offset stack))) - (sc-case stack - ((control-stack) - (loadw reg cfp-tn offset)))))) - -(defmacro store-stack-tn (stack reg) - `(let ((stack ,stack) - (reg ,reg)) - (let ((offset (tn-offset stack))) - (sc-case stack - ((control-stack) - (storew reg cfp-tn offset)))))) - -(defmacro maybe-load-stack-tn (reg reg-or-stack) - "Move the TN Reg-Or-Stack into Reg if it isn't already there." - (once-only ((n-reg reg) - (n-stack reg-or-stack)) - `(sc-case ,n-reg - ((any-reg descriptor-reg) - (sc-case ,n-stack - ((any-reg descriptor-reg) - (move ,n-stack ,n-reg)) - ((control-stack) - (loadw ,n-reg cfp-tn (tn-offset ,n-stack)))))))) - - -;;;; Storage allocation: - -(defmacro with-fixed-allocation ((result-tn flag-tn temp-tn type-code - size dynamic-extent-p - &key (lowtag other-pointer-lowtag) - maybe-write) - &body body) - "Do stuff to allocate an other-pointer object of fixed Size with a single -word header having the specified Type-Code. The result is placed in -Result-TN, and Temp-TN is a non-descriptor temp (which may be randomly used -by the body.) The body is placed inside the PSEUDO-ATOMIC, and presumably -initializes the object." - (declare (ignore flag-tn)) - (once-only ((result-tn result-tn) (temp-tn temp-tn) - (type-code type-code) (size size) - (lowtag lowtag)) - (let ((write-body `((inst li (compute-object-header ,size ,type-code) ,temp-tn) - (storew ,temp-tn ,result-tn 0 ,lowtag)))) - `(if ,dynamic-extent-p - (pseudo-atomic () - (align-csp ,temp-tn) - (set-lowtag ,lowtag csp-tn ,result-tn) - (inst addi (pad-data-block ,size) csp-tn csp-tn) - ,@(if maybe-write - `((when ,type-code ,@write-body)) - write-body) - ,@body) - (pseudo-atomic (:extra (pad-data-block ,size)) - (set-lowtag ,lowtag alloc-tn ,result-tn) - ,@(if maybe-write - `((when ,type-code ,@write-body)) - write-body) - ,@body))))) - -;;; is used for stack allocation of dynamic-extent objects -;;; FIXME-lav, if using defun, atleast surround in assembly-form ? macro better ? -(defun align-csp (temp) - (declare (ignore temp)) - (let ((aligned (gen-label))) - (inst extru csp-tn 31 n-lowtag-bits zero-tn :<>) - (inst b aligned :nullify t) - (inst addi n-word-bytes csp-tn csp-tn) - (storew zero-tn csp-tn -1) - (emit-label aligned))) - - -;;;; Error Code -(defun emit-error-break (vop kind code values) - (assemble () - (when vop - (note-this-location vop :internal-error)) - (emit-internal-error kind code values - :trap-emitter (lambda (trap-number) - (inst break trap-number)) - :compact-error-trap nil) - (emit-alignment word-shift))) - -(defun generate-error-code (vop error-code &rest values) - "Generate-Error-Code Error-code Value* - Emit code for an error with the specified Error-Code and context Values." - (assemble (:elsewhere) - (let ((start-lab (gen-label))) - (emit-label start-lab) - (apply #'error-call vop error-code values) - start-lab))) - -;;;; PSEUDO-ATOMIC - -;;; handy macro for making sequences look atomic -(defmacro pseudo-atomic ((&key (extra 0)) &rest forms) - (let ((n-extra (gensym))) - `(let ((,n-extra ,extra)) - (inst addi 4 alloc-tn alloc-tn) - ,@forms - (cond - ((typep ,n-extra '(signed-byte 11)) - (inst addit (- ,n-extra 4) alloc-tn alloc-tn :od)) - ((typep ,n-extra '(signed-byte 14)) - (inst ldo ,n-extra alloc-tn alloc-tn) - (inst addit -4 alloc-tn alloc-tn :od)) - (t - ;; FIXME: Make this case work, somehow - (error "EXTRA out-of-range in PSEUDO-ATOMIC")))))) - -;;;; indexed references - -(sb-xc:deftype load/store-index (scale lowtag min-offset - &optional (max-offset min-offset)) - `(integer ,(- (truncate (+ (ash 1 14) - (* min-offset n-word-bytes) - (- lowtag)) - scale)) - ,(truncate (- (+ (1- (ash 1 14)) lowtag) - (* max-offset n-word-bytes)) - scale))) - -(defmacro define-full-reffer (name type offset lowtag scs el-type - &optional translate) - `(progn - (define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types ,type tagged-num) - (:temporary (:scs (interior-reg)) lip) - (:results (value :scs ,scs)) - (:result-types ,el-type) - (:generator 5 - (inst add object index lip) - (loadw value lip ,offset ,lowtag))) - (define-vop (,(symbolicate name "-C")) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:info index) - (:arg-types ,type - (:constant (load/store-index ,n-word-bytes ,(eval lowtag) - ,(eval offset)))) - (:results (value :scs ,scs)) - (:result-types ,el-type) - (:generator 4 - (loadw value object (+ ,offset index) ,lowtag))))) - -(defmacro define-full-setter (name type offset lowtag scs el-type - &optional translate) - `(progn - (define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs ,scs :target result)) - (:arg-types ,type tagged-num ,el-type) - (:temporary (:scs (interior-reg)) lip) - (:results (result :scs ,scs)) - (:result-types ,el-type) - (:generator 2 - (inst add object index lip) - (storew value lip ,offset ,lowtag) - (move value result))) - (define-vop (,(symbolicate name "-C")) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (value :scs ,scs)) - (:info index) - (:arg-types ,type - (:constant (load/store-index ,n-word-bytes ,(eval lowtag) - ,(eval offset))) - ,el-type) - (:results (result :scs ,scs)) - (:result-types ,el-type) - (:generator 1 - (storew value object (+ ,offset index) ,lowtag) - (move value result))))) - - -(defmacro define-partial-reffer (name type size signed offset lowtag scs - el-type &optional translate) - (let ((scale (ecase size (:byte 1) (:short 2)))) - `(progn - (define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg) :to (:eval 0)) - (index :scs (unsigned-reg))) - (:arg-types ,type positive-fixnum) - (:results (value :scs ,scs)) - (:result-types ,el-type) - (:temporary (:scs (interior-reg)) lip) - (:generator 5 - (inst ,(ecase size (:byte 'add) (:short 'sh1add)) - index object lip) - (inst ,(ecase size (:byte 'ldb) (:short 'ldh)) - (- (* ,offset n-word-bytes) ,lowtag) lip value) - ,@(when signed - `((inst extrs value 31 ,(* scale n-byte-bits) value))))) - (define-vop (,(symbolicate name "-C")) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:info index) - (:arg-types ,type - (:constant (load/store-index ,scale - ,(eval lowtag) - ,(eval offset)))) - (:results (value :scs ,scs)) - (:result-types ,el-type) - (:generator 5 - (inst ,(ecase size (:byte 'ldb) (:short 'ldh)) - (- (+ (* ,offset n-word-bytes) (* index ,scale)) ,lowtag) - object value) - ,@(when signed - `((inst extrs value 31 ,(* scale n-byte-bits) value)))))))) - -(defmacro define-partial-setter (name type size offset lowtag scs el-type - &optional translate) - (let ((scale (ecase size (:byte 1) (:short 2)))) - `(progn - (define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (unsigned-reg)) - (value :scs ,scs :target result)) - (:arg-types ,type positive-fixnum ,el-type) - (:temporary (:scs (interior-reg)) lip) - (:results (result :scs ,scs)) - (:result-types ,el-type) - (:generator 5 - (inst ,(ecase size (:byte 'add) (:short 'sh1add)) - index object lip) - (inst ,(ecase size (:byte 'stb) (:short 'sth)) - value (- (* ,offset n-word-bytes) ,lowtag) lip) - (move value result))) - (define-vop (,(symbolicate name "-C")) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (value :scs ,scs :target result)) - (:info index) - (:arg-types ,type - (:constant (load/store-index ,scale - ,(eval lowtag) - ,(eval offset))) - ,el-type) - (:results (result :scs ,scs)) - (:result-types ,el-type) - (:generator 5 - (inst ,(ecase size (:byte 'stb) (:short 'sth)) - value - (- (+ (* ,offset n-word-bytes) (* index ,scale)) ,lowtag) - object) - (move value result)))))) diff --git a/src/compiler/hppa/memory.lisp b/src/compiler/hppa/memory.lisp deleted file mode 100644 index a31221daf3..0000000000 --- a/src/compiler/hppa/memory.lisp +++ /dev/null @@ -1,21 +0,0 @@ -(in-package "SB-VM") - -;;; Cell-Ref and Cell-Set are used to define VOPs like CAR, where the offset to -;;; be read or written is a property of the VOP used. Cell-Setf is similar to -;;; Cell-Set, but delivers the new value as the result. -;;; -(define-vop (cell-ref) - (:args (object :scs (descriptor-reg))) - (:results (value :scs (descriptor-reg any-reg))) - (:variant-vars offset lowtag) - (:policy :fast-safe) - (:generator 4 - (loadw value object offset lowtag))) -;;; -(define-vop (cell-set) - (:args (object :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg null zero))) - (:variant-vars offset lowtag) - (:policy :fast-safe) - (:generator 1 - (storew value object offset lowtag))) diff --git a/src/compiler/hppa/move.lisp b/src/compiler/hppa/move.lisp deleted file mode 100644 index 1d6cdb68b7..0000000000 --- a/src/compiler/hppa/move.lisp +++ /dev/null @@ -1,296 +0,0 @@ -;;;; the HPPA VM definition of operand loading/saving and the Move VOP - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -(define-move-fun (load-immediate 1) (vop x y) - ((null zero immediate) - (any-reg descriptor-reg)) - (let ((val (tn-value x))) - (etypecase val - (integer - (inst li (fixnumize val) y)) - (null - (move null-tn y)) - (symbol - (load-symbol y val)) - (character - (inst li (logior (ash (char-code val) n-widetag-bits) - character-widetag) y))))) - -(define-move-fun (load-number 1) (vop x y) - ((zero immediate) - (signed-reg unsigned-reg)) - (inst li (tn-value x) y)) - -(define-move-fun (load-character 1) (vop x y) - ((immediate) (character-reg)) - (inst li (char-code (tn-value x)) y)) - -(define-move-fun (load-system-area-pointer 1) (vop x y) - ((immediate) (sap-reg)) - (inst li (sap-int (tn-value x)) y)) - -(define-move-fun (load-constant 5) (vop x y) - ((constant) (descriptor-reg any-reg)) - (let ((offset (- (tn-byte-offset x) other-pointer-lowtag))) - (cond - ((typep offset '(signed-byte 11)) - (inst ldw offset code-tn y)) - (t - (inst li offset lip-tn) - (inst ldwx lip-tn code-tn y))))) - -(define-move-fun (load-stack 5) (vop x y) - ((control-stack) (any-reg descriptor-reg)) - (load-stack-tn y x)) - -(define-move-fun (load-number-stack 5) (vop x y) - ((character-stack) (character-reg) - (sap-stack) (sap-reg) - (signed-stack) (signed-reg) - (unsigned-stack) (unsigned-reg)) - (let ((nfp (current-nfp-tn vop))) - (loadw y nfp (tn-offset x)))) - -(define-move-fun (store-stack 5) (vop x y) - ((any-reg descriptor-reg null zero) (control-stack)) - (store-stack-tn y x)) - -(define-move-fun (store-number-stack 5) (vop x y) - ((character-reg) (character-stack) - (sap-reg) (sap-stack) - (signed-reg) (signed-stack) - (unsigned-reg) (unsigned-stack)) - (let ((nfp (current-nfp-tn vop))) - (storew x nfp (tn-offset y)))) - - -;;;; The Move VOP: -(define-vop (move) - (:args (x :target y - :scs (any-reg descriptor-reg zero null) - :load-if (not (location= x y)))) - (:results (y :scs (any-reg descriptor-reg control-stack) - :load-if (not (location= x y)))) - (:generator 0 - (unless (location= x y) - (sc-case y - ((any-reg descriptor-reg) - (inst move x y)) - (control-stack - (store-stack-tn y x)))))) - -(define-move-vop move :move - (any-reg descriptor-reg zero null) - (any-reg descriptor-reg)) - -;;; The MOVE-ARG VOP is used for moving descriptor values into another -;;; frame for argument or known value passing. -(define-vop (move-arg) - (:args (x :target y - :scs (any-reg descriptor-reg null zero)) - (fp :scs (any-reg) - :load-if (not (sc-is y any-reg descriptor-reg)))) - (:results (y)) - (:generator 0 - (sc-case y - ((any-reg descriptor-reg) - (move x y)) - (control-stack - (storew x fp (tn-offset y)))))) -(define-move-vop move-arg :move-arg - (any-reg descriptor-reg null zero) - (any-reg descriptor-reg)) - -;;;; Moves and coercions: - -;;; These MOVE-TO-WORD VOPs move a tagged integer to a raw full-word -;;; representation. Similarly, the MOVE-FROM-WORD VOPs converts a raw integer -;;; to a tagged bignum or fixnum. - -;;; ARG is a fixnum, so just shift it. We need a type restriction -;;; because some possible arg SCs (control-stack) overlap with -;;; possible bignum arg SCs. -(define-vop (move-to-word/fixnum) - (:args (x :scs (any-reg descriptor-reg))) - (:results (y :scs (signed-reg unsigned-reg))) - (:arg-types tagged-num) - (:note "fixnum untagging") - (:generator 1 - (inst sra x n-fixnum-tag-bits y))) - -(define-move-vop move-to-word/fixnum :move - (any-reg descriptor-reg) (signed-reg unsigned-reg)) - -;;; ARG is a non-immediate constant, load it. -(define-vop (move-to-word-c) - (:args (x :scs (constant))) - (:results (y :scs (signed-reg unsigned-reg))) - (:note "constant load") - (:generator 1 - (cond ((sb-c::tn-leaf x) - (inst li (tn-value x) y)) - (t - (loadw y code-tn (tn-offset x) other-pointer-lowtag) - (inst sra y n-fixnum-tag-bits y))))) - -(define-move-vop move-to-word-c :move - (constant) (signed-reg unsigned-reg)) - -;;; ARG is a fixnum or bignum, figure out which and load if necessary. -(define-vop (move-to-word/integer) - (:args (x :scs (descriptor-reg))) - (:results (y :scs (signed-reg unsigned-reg))) - (:note "integer to untagged word coercion") - (:generator 3 - (inst sra x n-fixnum-tag-bits y) - (inst extru x 31 2 zero-tn :=) - (loadw y x bignum-digits-offset other-pointer-lowtag))) - -(define-move-vop move-to-word/integer :move - (descriptor-reg) (signed-reg unsigned-reg)) - -;;; RESULT is a fixnum, so we can just shift. We need the result type -;;; restriction because of the control-stack ambiguity noted above. -(define-vop (move-from-word/fixnum) - (:args (x :scs (signed-reg unsigned-reg))) - (:results (y :scs (any-reg descriptor-reg))) - (:result-types tagged-num) - (:note "fixnum tagging") - (:generator 1 - (inst sll x n-fixnum-tag-bits y))) - -(define-move-vop move-from-word/fixnum :move - (signed-reg unsigned-reg) (any-reg descriptor-reg)) - -;;; RESULT may be a bignum, so we have to check. Use a worst-case -;;; cost to make sure people know they may be number consing. -(define-vop (move-from-signed) - (:args (arg :scs (signed-reg unsigned-reg) :target x)) - (:results (y :scs (any-reg descriptor-reg))) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x temp) - (:note "signed word to integer coercion") - (:generator 18 - (move arg x) - ;; Extract the top three bits. - (inst extrs x 2 3 temp :=) - ;; Invert them (unless they are already zero). - (inst uaddcm zero-tn temp temp) - ;; If we are left with zero, it will fit in a fixnum. So branch around - ;; the bignum-construction, doing the shift in the delay slot. - (inst comb := temp zero-tn done) - (inst sll x n-fixnum-tag-bits y) - ;; Make a single-digit bignum. - (with-fixed-allocation - (y nil temp bignum-widetag (1+ bignum-digits-offset) nil) - (storew x y bignum-digits-offset other-pointer-lowtag)) - DONE)) - -(define-move-vop move-from-signed :move - (signed-reg) (descriptor-reg)) - -(define-vop (move-from-fixnum+1) - (:args (x :scs (signed-reg unsigned-reg))) - (:results (y :scs (any-reg descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp) - (:vop-var vop) - (:generator 4 - ;; Extract the top three bits. - (inst extrs x 2 3 temp :=) - ;; Invert them (unless they are already zero). - (inst uaddcm zero-tn temp temp) - ;; If we are left with zero, it will fit in a fixnum. So branch around - ;; the bignum-construction, doing the shift in the delay slot. - (inst comb := temp zero-tn done) - (inst sll x n-fixnum-tag-bits y) - (load-constant vop (emit-constant (1+ most-positive-fixnum)) - y) - DONE)) - -(define-vop (move-from-fixnum-1 move-from-fixnum+1) - (:generator 4 - ;; Extract the top three bits. - (inst extrs x 2 3 temp :=) - ;; Invert them (unless they are already zero). - (inst uaddcm zero-tn temp temp) - ;; If we are left with zero, it will fit in a fixnum. So branch around - ;; the bignum-construction, doing the shift in the delay slot. - (inst comb := temp zero-tn done) - (inst sll x n-fixnum-tag-bits y) - (load-constant vop (emit-constant (1- most-negative-fixnum)) - y) - DONE)) - -;;; Check for fixnum, and possibly allocate one or two word bignum -;;; result. Use a worst-case cost to make sure people know they may -;;; be number consing. -(define-vop (move-from-unsigned) - (:note "unsigned word to integer coercion") - (:args (arg :scs (signed-reg unsigned-reg) :target x)) - (:results (y :scs (any-reg descriptor-reg))) - (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x temp) - (:generator 20 - (move arg x) - (inst srl x n-positive-fixnum-bits temp) - (inst comb := temp zero-tn done) - (inst sll x n-fixnum-tag-bits y) - (pseudo-atomic (:extra (pad-data-block (+ bignum-digits-offset 2))) - (set-lowtag other-pointer-lowtag alloc-tn y) - (inst xor temp temp temp) - (inst comclr x zero-tn zero-tn :>=) - (inst li 1 temp) - (inst sll temp n-widetag-bits temp) - (inst addi (logior (ash 1 n-widetag-bits) bignum-widetag) temp temp) - (storew temp y 0 other-pointer-lowtag)) - - (storew x y bignum-digits-offset other-pointer-lowtag) - DONE)) - -(define-move-vop move-from-unsigned :move - (unsigned-reg) (descriptor-reg)) - -;;; Move untagged numbers. -(define-vop (word-move) - (:args (x :target y - :scs (signed-reg unsigned-reg) - :load-if (not (location= x y)))) - (:results (y :scs (signed-reg unsigned-reg) - :load-if (not (location= x y)))) - (:note "word integer move") - (:generator 0 - (move x y))) - -(define-move-vop word-move :move - (signed-reg unsigned-reg) (signed-reg unsigned-reg)) - -;;; Move untagged number args/return-values. -(define-vop (move-word-arg) - (:args (x :target y - :scs (signed-reg unsigned-reg)) - (fp :scs (any-reg) - :load-if (not (sc-is y signed-reg unsigned-reg)))) - (:results (y)) - (:note "word integer argument move") - (:generator 0 - (sc-case y - ((signed-reg unsigned-reg) - (move x y)) - ((signed-stack unsigned-stack) - (storew x fp (tn-offset y)))))) - -(define-move-vop move-word-arg :move-arg - (descriptor-reg any-reg signed-reg unsigned-reg) (signed-reg unsigned-reg)) - -;;; Use standard MOVE-ARG + coercion to move an untagged number to a -;;; descriptor passing location. -(define-move-vop move-arg :move-arg - (signed-reg unsigned-reg) (any-reg descriptor-reg)) diff --git a/src/compiler/hppa/nlx.lisp b/src/compiler/hppa/nlx.lisp deleted file mode 100644 index f7b7464ef9..0000000000 --- a/src/compiler/hppa/nlx.lisp +++ /dev/null @@ -1,240 +0,0 @@ -(in-package "SB-VM") - -;;; Make a TN for the argument count passing location for a -;;; non-local entry. -(defun make-nlx-entry-arg-start-location () - (make-wired-tn *fixnum-primitive-type* immediate-arg-scn ocfp-offset)) - -;;; Save and restore dynamic environment. -;;; -;;; These VOPs are used in the reentered function to restore the appropriate -;;; dynamic environment. Currently we only save the Current-Catch and binding -;;; stack pointer. We don't need to save/restore the current unwind-protect, -;;; since unwind-protects are implicitly processed during unwinding. If there -;;; were any additional stacks, then this would be the place to restore the top -;;; pointers. - -(define-vop (save-dynamic-state) - (:results (catch :scs (descriptor-reg)) - (nfp :scs (descriptor-reg)) - (nsp :scs (descriptor-reg))) - (:vop-var vop) - (:generator 13 - (load-symbol-value catch *current-catch-block*) - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (move cur-nfp nfp))) - (move nsp-tn nsp))) - -(define-vop (restore-dynamic-state) - (:args (catch :scs (descriptor-reg)) - (nfp :scs (descriptor-reg)) - (nsp :scs (descriptor-reg))) - (:vop-var vop) - (:generator 10 - (store-symbol-value catch *current-catch-block*) - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (move nfp cur-nfp))) - (move nsp nsp-tn))) - -(define-vop (current-stack-pointer) - (:results (res :scs (any-reg descriptor-reg))) - (:generator 1 - (move csp-tn res))) - -(define-vop (current-binding-pointer) - (:results (res :scs (any-reg descriptor-reg))) - (:generator 1 - (move bsp-tn res))) - -(define-vop (current-nsp) - (:results (res :scs (any-reg descriptor-reg))) - (:generator 1 - (move res nsp-tn))) - -(define-vop (set-nsp) - (:args (nsp :scs (any-reg descriptor-reg))) - (:generator 1 - (move nsp-tn nsp))) - -;;;; Unwind block hackery: - -;;; Compute the address of the catch block from its TN, then store into the -;;; block the current Fp, Env, Unwind-Protect, and the entry PC. -;;; -(define-vop (make-unwind-block) - (:args (tn)) - (:info entry-label) - (:results (block :scs (any-reg))) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:generator 22 - (inst ldo (tn-byte-offset tn) cfp-tn block) - (load-symbol-value temp *current-unwind-protect-block*) - (storew temp block unwind-block-uwp-slot) - (storew cfp-tn block unwind-block-cfp-slot) - (storew code-tn block unwind-block-code-slot) - (inst compute-lra-from-code code-tn entry-label ndescr temp) - (storew temp block catch-block-entry-pc-slot))) - -;;; Like Make-Unwind-Block, except that we also store in the specified tag, and -;;; link the block into the Current-Catch list. -;;; -(define-vop (make-catch-block) - (:args (tn) - (tag :scs (any-reg descriptor-reg))) - (:info entry-label) - (:results (block :scs (any-reg))) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (descriptor-reg) :target block :to (:result 0)) result) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:generator 44 - (inst ldo (tn-byte-offset tn) cfp-tn result) - (load-symbol-value temp *current-unwind-protect-block*) - (storew temp result catch-block-uwp-slot) - (storew cfp-tn result catch-block-cfp-slot) - (storew code-tn result catch-block-code-slot) - (inst compute-lra-from-code code-tn entry-label ndescr temp) - (storew temp result catch-block-entry-pc-slot) - - (storew tag result catch-block-tag-slot) - (load-symbol-value temp *current-catch-block*) - (storew temp result catch-block-previous-catch-slot) - (store-symbol-value result *current-catch-block*) - (move result block))) - -;;; Just set the current unwind-protect to UWP. This instantiates an -;;; unwind block as an unwind-protect. -;;; -(define-vop (set-unwind-protect) - (:args (uwp :scs (any-reg))) - (:generator 7 - (store-symbol-value uwp *current-unwind-protect-block*))) - - -(define-vop (%catch-breakup) - (:args (current-block)) - (:ignore current-block) - (:temporary (:scs (any-reg)) block) - (:policy :fast-safe) - (:generator 17 - (load-symbol-value block *current-catch-block*) - (loadw block block catch-block-previous-catch-slot) - (store-symbol-value block *current-catch-block*))) - -(define-vop (%unwind-protect-breakup) - (:args (current-block)) - (:ignore current-block) - (:temporary (:scs (any-reg)) block) - (:policy :fast-safe) - (:generator 17 - (load-symbol-value block *current-unwind-protect-block*) - (loadw block block unwind-block-uwp-slot) - (store-symbol-value block *current-unwind-protect-block*))) - - -;;;; NLX entry VOPs: - - -(define-vop (nlx-entry) - (:args (sp) ;; Note: we can't list an sc-restriction, 'cause any load vops - ;; would be inserted before the LRA. - (start) - (count)) - (:results (values :more t)) - (:temporary (:scs (descriptor-reg)) move-temp) - (:info label nvals) - (:save-p :force-to-stack) - (:vop-var vop) - (:generator 30 - (emit-return-pc label) - (note-this-location vop :non-local-entry) - (cond ((zerop nvals)) - ((= nvals 1) - (loadw (tn-ref-tn values) start) - (inst comclr count zero-tn zero-tn :<>) - (move null-tn (tn-ref-tn values) t)) - (t - (collect ((defaults)) - (do ((i 0 (1+ i)) - (tn-ref values (tn-ref-across tn-ref))) - ((null tn-ref)) - (let ((default-lab (gen-label)) - (tn (tn-ref-tn tn-ref))) - (defaults (cons default-lab tn)) - (inst comb := zero-tn count default-lab) - (inst addi (fixnumize -1) count count) - (sc-case tn - ((descriptor-reg any-reg) - (loadw tn start i)) - (control-stack - (loadw move-temp start i) - (store-stack-tn tn move-temp))))) - (let ((defaulting-done (gen-label))) - (emit-label defaulting-done) - (assemble (:elsewhere) - (dolist (def (defaults)) - (emit-label (car def)) - (let ((tn (cdr def))) - (sc-case tn - ((descriptor-reg any-reg) - (move null-tn tn)) - (control-stack - (store-stack-tn tn null-tn))))) - (inst b defaulting-done :nullify t)))))) - (load-stack-tn csp-tn sp))) - - -(define-vop (nlx-entry-multiple) - (:args (top :target dst) (start :target src) (count :target num)) - ;; Again, no SC restrictions for the args, 'cause the loading would - ;; happen before the entry label. - (:info label) - (:temporary (:scs (any-reg) :from (:argument 0)) dst) - (:temporary (:scs (any-reg) :from (:argument 1)) src) - (:temporary (:scs (any-reg) :from (:argument 2)) num) - (:temporary (:scs (descriptor-reg)) temp) - (:results (new-start) (new-count)) - (:save-p :force-to-stack) - (:vop-var vop) - (:generator 30 - (emit-return-pc label) - (note-this-location vop :non-local-entry) - (let ((loop (gen-label)) - (done (gen-label))) - - ;; Copy args. - (load-stack-tn dst top) - (move start src) - (move count num) - - ;; Establish results. - (sc-case new-start - (any-reg (move dst new-start)) - (control-stack (store-stack-tn new-start dst))) - (inst comb := num zero-tn done :nullify t) - (sc-case new-count - (any-reg (move num new-count)) - (control-stack (store-stack-tn new-count num))) - - ;; Copy stuff on stack. - (emit-label loop) - (inst ldwm n-word-bytes src temp) - (inst addib :<> (fixnumize -1) num loop) - (inst stwm temp n-word-bytes dst) - - (emit-label done) - (move dst csp-tn)))) - -;;; This VOP is just to force the TNs used in the cleanup onto the stack. -;;; -(define-vop (uwp-entry) - (:info label) - (:save-p :force-to-stack) - (:results (block) (start) (count)) - (:ignore block start count) - (:vop-var vop) - (:generator 0 - (emit-return-pc label) - (note-this-location vop :non-local-entry))) diff --git a/src/compiler/hppa/parms.lisp b/src/compiler/hppa/parms.lisp deleted file mode 100644 index 8bf3bbf7da..0000000000 --- a/src/compiler/hppa/parms.lisp +++ /dev/null @@ -1,143 +0,0 @@ -(in-package "SB-VM") - -; normally assem-scheduler-p is t, and nil if debugging the assembler -; but apparently we don't trust any of the instruction definitions. -(defconstant sb-assem:assem-scheduler-p nil) -(defconstant sb-assem:+inst-alignment-bytes+ 4) -(defconstant sb-assem:+assem-max-locations+ 68) ; see number-location - -(defconstant +backend-fasl-file-implementation+ :hppa) -(defconstant +backend-page-bytes+ 4096) - -;;;; Machine Architecture parameters: -(eval-when (:compile-toplevel :load-toplevel :execute) - -;;; number of bits per word where a word holds one lisp descriptor -(defconstant n-word-bits 32) - -;;; the natural width of a machine word (as seen in e.g. register width, -;;; address space) -(defconstant n-machine-word-bits 32) - -(defconstant float-sign-shift 31) - -(defconstant single-float-bias 126) -(defconstant-eqx single-float-exponent-byte (byte 8 23) #'equalp) -(defconstant-eqx single-float-significand-byte (byte 23 0) #'equalp) -(defconstant single-float-normal-exponent-min 1) -(defconstant single-float-normal-exponent-max 254) -(defconstant single-float-hidden-bit (ash 1 23)) - -(defconstant double-float-bias 1022) -(defconstant-eqx double-float-exponent-byte (byte 11 20) #'equalp) -(defconstant-eqx double-float-significand-byte (byte 20 0) #'equalp) -(defconstant double-float-normal-exponent-min 1) -(defconstant double-float-normal-exponent-max #x7FE) -(defconstant double-float-hidden-bit (ash 1 20)) - -(defconstant single-float-digits - (+ (byte-size single-float-significand-byte) 1)) - -(defconstant double-float-digits - (+ (byte-size double-float-significand-byte) n-word-bits 1)) - -(defconstant float-inexact-trap-bit (ash 1 0)) -(defconstant float-underflow-trap-bit (ash 1 1)) -(defconstant float-overflow-trap-bit (ash 1 2)) -(defconstant float-divide-by-zero-trap-bit (ash 1 3)) -(defconstant float-invalid-trap-bit (ash 1 4)) - -(defconstant float-round-to-nearest 0) -(defconstant float-round-to-zero 1) -(defconstant float-round-to-positive 2) -(defconstant float-round-to-negative 3) - -(defconstant-eqx float-rounding-mode (byte 2 7) #'equalp) -(defconstant-eqx float-sticky-bits (byte 5 27) #'equalp) -(defconstant-eqx float-traps-byte (byte 5 0) #'equalp) -(defconstant-eqx float-exceptions-byte (byte 5 27) #'equalp) -(defconstant-eqx float-condition-bit (ash 1 26) #'equalp) -(defconstant float-fast-bit 0) ; No fast mode on HPPA. - - - -;;;; Description of the target address space. - -;;; Where to put the different spaces. -;;; -(defconstant linkage-table-space-start #x1000) -(defconstant linkage-table-space-end linkage-table-space-start) ; 0 size - -(defconstant read-only-space-start #x4b000000) -(defconstant read-only-space-end #x4dff0000) - -(defconstant static-space-start #x4e000000) -(defconstant static-space-end #x4fff0000) - -(defparameter dynamic-0-space-start #x50000000) -(defparameter dynamic-0-space-end #x5fff0000) - -); eval-when - -;;; When doing external branching on hppa (e.g. inst ble) -;;; we must know which space we want to jump into (text, code) - -;; The space-register holding the lisp heap. -(defconstant lisp-heap-space 5) - -;; The space-register holding the C text heap. -(defconstant c-text-space 4) - - -;;;; Other random constants. - -(defenum () - atomic-flag - interrupted-flag) - -(defenum (:start 8) - halt-trap - pending-interrupt-trap - cerror-trap - breakpoint-trap - fun-end-breakpoint-trap - single-step-breakpoint-trap - single-step-around-trap - single-step-before-trap - single-step-after-trap - error-trap) - -;;;; Static symbols. - -;;; These symbols are loaded into static space directly after NIL so -;;; that the system can compute their address by adding a constant -;;; amount to NIL. -;;; -;;; The fdefn objects for the static functions are loaded into static -;;; space directly after the static symbols. That way, the raw-addr -;;; can be loaded directly out of them by indirecting relative to NIL. -(defconstant-eqx +static-symbols+ - `#(,@+common-static-symbols+) - #'equalp) - -(defconstant-eqx +static-fdefns+ - #(length - two-arg-+ - two-arg-- - two-arg-* - two-arg-/ - two-arg-< - two-arg-> - two-arg-= - two-arg-<= - two-arg->= - two-arg-/= - eql - %negate - two-arg-and - two-arg-ior - two-arg-xor - two-arg-gcd - two-arg-lcm) - #'equalp) - diff --git a/src/compiler/hppa/pred.lisp b/src/compiler/hppa/pred.lisp deleted file mode 100644 index be39072a87..0000000000 --- a/src/compiler/hppa/pred.lisp +++ /dev/null @@ -1,41 +0,0 @@ -(in-package "SB-VM") - - -;;;; The Branch VOP. - -;;; The unconditional branch, emitted when we can't drop through to the desired -;;; destination. Dest is the continuation we transfer control to. -;;; -(define-vop (branch) - (:info dest) - (:generator 5 - (inst b dest :nullify t))) - - -;;;; Generic conditional VOPs - -;;; The generic conditional branch, emitted immediately after test -;;; VOPs that only set flags. - -(define-vop (branch-if) - (:info dest not-p flags) - (:ignore dest not-p flags) - (:generator 0 - (error "BRANCH-IF not yet implemented"))) - -(defun convert-conditional-move-p (node dst-tn x-tn y-tn) - (declare (ignore node dst-tn x-tn y-tn)) - nil) - - -;;;; Conditional VOPs: - -(define-vop (if-eq) - (:args (x :scs (any-reg descriptor-reg zero null)) - (y :scs (any-reg descriptor-reg zero null))) - (:conditional) - (:info target not-p) - (:policy :fast-safe) - (:translate eq) - (:generator 3 - (inst bc := not-p x y target))) diff --git a/src/compiler/hppa/sap.lisp b/src/compiler/hppa/sap.lisp deleted file mode 100644 index b88ca1ca24..0000000000 --- a/src/compiler/hppa/sap.lisp +++ /dev/null @@ -1,252 +0,0 @@ -;;;; the HPPA VM definition of SAP operations - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;;; Moves and coercions: - -;;; Move a tagged SAP to an untagged representation. -(define-vop (move-to-sap) - (:args (x :scs (any-reg descriptor-reg))) - (:results (y :scs (sap-reg))) - (:note "system area pointer indirection") - (:generator 1 - (loadw y x sap-pointer-slot other-pointer-lowtag))) - -(define-move-vop move-to-sap :move - (descriptor-reg) (sap-reg)) - -;;; Move an untagged SAP to a tagged representation. -(define-vop (move-from-sap) - (:args (sap :scs (sap-reg) :to :save)) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:results (res :scs (descriptor-reg))) - (:note "system area pointer allocation") - (:generator 20 - (with-fixed-allocation (res nil ndescr sap-widetag sap-size nil) - (storew sap res sap-pointer-slot other-pointer-lowtag)))) - -(define-move-vop move-from-sap :move - (sap-reg) (descriptor-reg)) - -;;; Move untagged sap values. -(define-vop (sap-move) - (:args (x :target y - :scs (sap-reg) - :load-if (not (location= x y)))) - (:results (y :scs (sap-reg) - :load-if (not (location= x y)))) - (:note "SAP move") - (:generator 0 - (move x y))) - -(define-move-vop sap-move :move - (sap-reg) (sap-reg)) - -;;; Move untagged sap args/return-values. -(define-vop (move-sap-arg) - (:args (x :target y - :scs (sap-reg)) - (fp :scs (any-reg) - :load-if (not (sc-is y sap-reg)))) - (:results (y)) - (:note "SAP argument move") - (:generator 0 - (sc-case y - (sap-reg - (move x y)) - (sap-stack - (storew x fp (tn-offset y)))))) - -(define-move-vop move-sap-arg :move-arg - (descriptor-reg sap-reg) (sap-reg)) - -;;; Use standard MOVE-ARG + coercion to move an untagged sap to a -;;; descriptor passing location. -(define-move-vop move-arg :move-arg - (sap-reg) (descriptor-reg)) - -;;;; SAP-INT and INT-SAP -(define-vop (sap-int) - (:args (sap :scs (sap-reg) :target int)) - (:arg-types system-area-pointer) - (:results (int :scs (unsigned-reg))) - (:result-types unsigned-num) - (:translate sap-int) - (:policy :fast-safe) - (:generator 1 - (move sap int))) - -(define-vop (int-sap) - (:args (int :scs (unsigned-reg) :target sap)) - (:arg-types unsigned-num) - (:results (sap :scs (sap-reg))) - (:result-types system-area-pointer) - (:translate int-sap) - (:policy :fast-safe) - (:generator 1 - (move int sap))) - -;;;; POINTER+ and POINTER- -(define-vop (pointer+) - (:translate sap+) - (:args (ptr :scs (sap-reg)) - (offset :scs (signed-reg immediate))) - (:arg-types system-area-pointer signed-num) - (:results (res :scs (sap-reg))) - (:result-types system-area-pointer) - (:policy :fast-safe) - (:generator 1 - (sc-case offset - (signed-reg - (inst add ptr offset res)) - (immediate - (cond - ((and (< (tn-value offset) (ash 1 10)) - (> (tn-value offset) (- (ash 1 10)))) - (inst addi (tn-value offset) ptr res)) - (t - (inst li (tn-value offset) res) - (inst add ptr res res))))))) - -(define-vop (pointer-) - (:translate sap-) - (:args (ptr1 :scs (sap-reg)) - (ptr2 :scs (sap-reg))) - (:arg-types system-area-pointer system-area-pointer) - (:policy :fast-safe) - (:results (res :scs (signed-reg))) - (:result-types signed-num) - (:generator 1 - (inst sub ptr1 ptr2 res))) - -;;;; mumble-SYSTEM-REF and mumble-SYSTEM-SET -(macrolet ((def-system-ref-and-set - (ref-name set-name sc type size &optional signed) - (let ((ref-name-c (symbolicate ref-name "-C")) - (set-name-c (symbolicate set-name "-C"))) - `(progn - (define-vop (,ref-name) - (:translate ,ref-name) - (:policy :fast-safe) - (:args (object :scs (sap-reg)) - (offset :scs (signed-reg))) - (:arg-types system-area-pointer signed-num) - (:results (result :scs (,sc))) - (:result-types ,type) - (:generator 5 - (inst ,(ecase size - (:byte 'ldbx) - (:short 'ldhx) - (:long 'ldwx) - (:float 'fldx)) - offset object result) - ,@(when (and signed (not (eq size :long))) - `((inst extrs result 31 ,(ecase size - (:byte 8) - (:short 16)) - result))))) - (define-vop (,ref-name-c) - (:translate ,ref-name) - (:policy :fast-safe) - (:args (object :scs (sap-reg))) - (:arg-types system-area-pointer - (:constant ,(if (eq size :float) - '(signed-byte 5) - '(signed-byte 14)))) - (:info offset) - (:results (result :scs (,sc))) - (:result-types ,type) - (:generator 4 - (inst ,(ecase size - (:byte 'ldb) - (:short 'ldh) - (:long 'ldw) - (:float 'flds)) - offset object result) - ,@(when (and signed (not (eq size :long))) - `((inst extrs result 31 ,(ecase size - (:byte 8) - (:short 16)) - result))))) - (define-vop (,set-name) - (:translate ,set-name) - (:policy :fast-safe) - (:args (object :scs (sap-reg) - ,@(unless (eq size :float) '(:target sap))) - (offset :scs (signed-reg)) - (value :scs (,sc) :target result)) - (:arg-types system-area-pointer signed-num ,type) - (:results (result :scs (,sc))) - (:result-types ,type) - ,@(unless (eq size :float) - '((:temporary (:scs (sap-reg) :from (:argument 0)) sap))) - (:generator 5 - ,@(if (eq size :float) - `((inst fstx value offset object) - (unless (location= value result) - (inst funop :copy value result))) - `((inst add object offset sap) - (inst ,(ecase size (:byte 'stb) (:short 'sth) (:long 'stw)) - value 0 sap) - (move value result))))) - (define-vop (,set-name-c) - (:translate ,set-name) - (:policy :fast-safe) - (:args (object :scs (sap-reg)) - (value :scs (,sc) :target result)) - (:arg-types system-area-pointer - (:constant ,(if (eq size :float) - '(signed-byte 5) - '(signed-byte 14))) - ,type) - (:info offset) - (:results (result :scs (,sc))) - (:result-types ,type) - (:generator 5 - ,@(if (eq size :float) - `((inst fsts value offset object) - (unless (location= value result) - (inst funop :copy value result))) - `((inst ,(ecase size (:byte 'stb) (:short 'sth) (:long 'stw)) - value offset object) - (move value result))))))))) - (def-system-ref-and-set sap-ref-8 %set-sap-ref-8 - unsigned-reg positive-fixnum :byte nil) - (def-system-ref-and-set signed-sap-ref-8 %set-signed-sap-ref-8 - signed-reg tagged-num :byte t) - (def-system-ref-and-set sap-ref-16 %set-sap-ref-16 - unsigned-reg positive-fixnum :short nil) - (def-system-ref-and-set signed-sap-ref-16 %set-signed-sap-ref-16 - signed-reg tagged-num :short t) - (def-system-ref-and-set sap-ref-32 %set-sap-ref-32 - unsigned-reg unsigned-num :long nil) - (def-system-ref-and-set signed-sap-ref-32 %set-signed-sap-ref-32 - signed-reg signed-num :long t) - (def-system-ref-and-set sap-ref-sap %set-sap-ref-sap - sap-reg system-area-pointer :long) - (def-system-ref-and-set sap-ref-lispobj %set-sap-ref-lispobj - descriptor-reg * :long) - (def-system-ref-and-set sap-ref-single %set-sap-ref-single - single-reg single-float :float) - (def-system-ref-and-set sap-ref-double %set-sap-ref-double - double-reg double-float :float)) - -;;; Noise to convert normal lisp data objects into SAPs. -(define-vop (vector-sap) - (:translate vector-sap) - (:policy :fast-safe) - (:args (vector :scs (descriptor-reg))) - (:results (sap :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 2 - (inst addi (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) - vector sap))) diff --git a/src/compiler/hppa/show.lisp b/src/compiler/hppa/show.lisp deleted file mode 100644 index 247ac80fe5..0000000000 --- a/src/compiler/hppa/show.lisp +++ /dev/null @@ -1,25 +0,0 @@ -(in-package "SB-VM") - -(define-vop (print) - (:args (object :scs (descriptor-reg any-reg) :target nl0)) - (:results) - (:save-p t) - (:temporary (:sc any-reg :offset nl0-offset :from (:argument 0)) nl0) - (:temporary (:sc any-reg :offset cfunc-offset) cfunc) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp) - (:vop-var vop) - (:generator 100 - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (move object nl0) - (inst li (make-fixup "debug_print" :foreign) cfunc) - (let ((fixup (make-fixup "call_into_c" :foreign))) - (inst ldil fixup temp) - (inst ble fixup c-text-space temp)) - (inst addi 64 nsp-tn nsp-tn) - (inst addi -64 nsp-tn nsp-tn) - (when cur-nfp - (load-stack-tn cur-nfp nfp-save))))) - diff --git a/src/compiler/hppa/subprim.lisp b/src/compiler/hppa/subprim.lisp deleted file mode 100644 index 01c638e474..0000000000 --- a/src/compiler/hppa/subprim.lisp +++ /dev/null @@ -1,39 +0,0 @@ -(in-package "SB-VM") - - - -;;;; Length - -(define-vop (length/list) - (:translate length) - (:args (object :scs (descriptor-reg) :target ptr)) - (:arg-types list) - (:temporary (:scs (descriptor-reg) :from (:argument 0)) ptr) - (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:scs (any-reg) :to (:result 0) :target result) - count) - (:results (result :scs (any-reg descriptor-reg))) - (:policy :fast-safe) - (:vop-var vop) - (:save-p :compute-only) - (:generator 50 - (move object ptr) - (inst comb := ptr null-tn done) - (inst li 0 count) - - (inst extru ptr 31 3 temp) - (inst comib :<> list-pointer-lowtag temp lose :nullify t) - (loadw ptr ptr cons-cdr-slot list-pointer-lowtag) - - LOOP - (inst addi (fixnumize 1) count count) - (inst comb := ptr null-tn done :nullify t) - (inst extru ptr 31 3 temp) - (inst comib := list-pointer-lowtag temp loop :nullify t) - (loadw ptr ptr cons-cdr-slot list-pointer-lowtag) - - LOSE - (cerror-call vop 'object-not-list-error ptr) - - DONE - (move count result))) diff --git a/src/compiler/hppa/system.lisp b/src/compiler/hppa/system.lisp deleted file mode 100644 index edeec7cf89..0000000000 --- a/src/compiler/hppa/system.lisp +++ /dev/null @@ -1,228 +0,0 @@ -(in-package "SB-VM") - - -;;;; Type frobbing VOPs - -;FIX this vop got instruction-exploded after mips convert, look at old hppa -(define-vop (widetag-of) - (:translate widetag-of) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) temp1 temp2) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 6 - (inst li lowtag-mask temp1) - (inst li other-pointer-lowtag temp2) - (inst and temp1 object temp1) - (inst xor temp1 temp2 temp1) - (inst comb := temp1 zero-tn OTHER-PTR) - (inst li (logxor other-pointer-lowtag fun-pointer-lowtag) temp2) - (inst xor temp1 temp2 temp1) - (inst comb := temp1 zero-tn FUNCTION-PTR) - (inst li fixnum-tag-mask temp1) ; pick off fixnums - (inst li 1 temp2) - (inst and temp1 object result) - (inst comb := result zero-tn DONE) - - (inst and object temp2 result) - (inst comb :<> result zero-tn LOWTAG-ONLY :nullify t) - - ;; must be an other immediate - (inst li widetag-mask temp2) - (inst b DONE) - (inst and temp2 object result) - - FUNCTION-PTR - (load-type result object (- fun-pointer-lowtag)) - (inst b done :nullify t) - - LOWTAG-ONLY - (inst li lowtag-mask temp1) - (inst b done) - (inst and object temp1 result) - - OTHER-PTR - (load-type result object (- other-pointer-lowtag)) - - DONE)) - -(define-vop (%other-pointer-widetag) - (:translate %other-pointer-widetag) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg))) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 6 - (load-type result object (- other-pointer-lowtag)))) - -(define-vop (fun-subtype) - (:translate fun-subtype) - (:policy :fast-safe) - (:args (function :scs (descriptor-reg))) - (:results (result :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 6 - (load-type result function (- fun-pointer-lowtag)))) - -(define-vop (get-header-data) - (:translate get-header-data) - (:policy :fast-safe) - (:args (x :scs (descriptor-reg))) - (:results (res :scs (unsigned-reg))) - (:result-types positive-fixnum) - (:generator 6 - (loadw res x 0 other-pointer-lowtag) - (inst srl res n-widetag-bits res))) - -;;; FIXME-lav, not sure we need data of type immediate and zero, test without, -;;; if so revert to old hppa code -(define-vop (set-header-data) - (:translate set-header-data) - (:policy :fast-safe) - (:args (x :scs (descriptor-reg) :target res) - (data :scs (any-reg immediate zero))) - (:arg-types * positive-fixnum) - (:results (res :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) t1 t2) - (:generator 6 - (loadw t1 x 0 other-pointer-lowtag) - ;; replace below 2 inst with: (mask widetag-mask t1 t1) - (inst li widetag-mask t2) - (inst and t1 t2 t1) - (sc-case data - (any-reg - (inst sll data (- n-widetag-bits 2) t2) - (inst or t1 t2 t1)) - (immediate - (inst li (ash (tn-value data) n-widetag-bits) t2) - (inst or t1 t2 t1)) - (zero)) - - (storew t1 x 0 other-pointer-lowtag) - (move x res))) - -(define-vop (pointer-hash) - (:translate pointer-hash) - (:args (ptr :scs (any-reg descriptor-reg))) - (:results (res :scs (any-reg descriptor-reg))) - (:policy :fast-safe) - (:generator 1 - (inst zdep ptr n-positive-fixnum-bits n-positive-fixnum-bits res))) - -;;;; Allocation - -(define-vop (dynamic-space-free-pointer) - (:results (int :scs (sap-reg))) - (:result-types system-area-pointer) - (:translate dynamic-space-free-pointer) - (:policy :fast-safe) - (:generator 1 - (move alloc-tn int))) - -(define-vop (binding-stack-pointer-sap) - (:results (int :scs (sap-reg))) - (:result-types system-area-pointer) - (:translate binding-stack-pointer-sap) - (:policy :fast-safe) - (:generator 1 - (move bsp-tn int))) - -(define-vop (control-stack-pointer-sap) - (:results (int :scs (sap-reg))) - (:result-types system-area-pointer) - (:translate control-stack-pointer-sap) - (:policy :fast-safe) - (:generator 1 - (move csp-tn int))) - - -;;;; Code object frobbing. - -(define-vop (code-instructions) - (:translate code-instructions) - (:policy :fast-safe) - (:args (code :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:results (sap :scs (sap-reg))) - (:result-types system-area-pointer) - (:generator 10 - (loadw ndescr code 0 other-pointer-lowtag) - (inst srl ndescr n-widetag-bits ndescr) - (inst sll ndescr word-shift ndescr) - (inst addi (- other-pointer-lowtag) ndescr ndescr) - (inst add code ndescr sap))) - -(define-vop (compute-fun) - (:args (code :scs (descriptor-reg)) - (offset :scs (signed-reg unsigned-reg))) - (:arg-types * positive-fixnum) - (:results (func :scs (descriptor-reg))) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:generator 10 - (loadw ndescr code 0 other-pointer-lowtag) - ;; FIXME-lav: replace below two with DEPW - (inst srl ndescr n-widetag-bits ndescr) - (inst sll ndescr word-shift ndescr) - (inst add ndescr offset ndescr) - (inst addi (- fun-pointer-lowtag other-pointer-lowtag) ndescr ndescr) - (inst add ndescr code func))) - - -;;;; Other random VOPs. - - -(defknown sb-unix::receive-pending-interrupt () (values)) -(define-vop (sb-unix::receive-pending-interrupt) - (:policy :fast-safe) - (:translate sb-unix::receive-pending-interrupt) - (:generator 1 - (inst break pending-interrupt-trap))) - - -(define-vop (halt) - (:generator 1 - (inst break halt-trap))) - -#+hpux -(define-vop (setup-return-from-lisp-stub) - (:results) - (:save-p t) - (:temporary (:sc any-reg :offset nl0-offset) nl0) - (:temporary (:sc any-reg :offset cfunc-offset) cfunc) - (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:scs (non-descriptor-reg)) temp) - (:vop-var vop) - (:generator 100 - (let ((stub (make-fixup 'return-from-lisp-stub :assembly-routine))) - (inst li stub nl0)) - (let ((cur-nfp (current-nfp-tn vop))) - (when cur-nfp - (store-stack-tn nfp-save cur-nfp)) - (inst li (make-fixup "setup_return_from_lisp_stub" :foreign) cfunc) - (let ((fixup (make-fixup "call_into_c" :foreign))) - (inst ldil fixup temp) - (inst ble fixup c-text-space temp)) - (inst addi 64 nsp-tn nsp-tn) - (inst addi -64 nsp-tn nsp-tn) - (when cur-nfp - (load-stack-tn cur-nfp nfp-save))))) - -;;;; Dynamic vop count collection support - -(define-vop (count-me) - (:args (count-vector :scs (descriptor-reg))) - (:info index) - (:temporary (:scs (non-descriptor-reg)) count) - (:generator 1 - (let ((offset - (- (* (+ index vector-data-offset) n-word-bytes) other-pointer-lowtag))) - (inst ldw offset count-vector count) - (inst addi 1 count count) - (inst stw count offset count-vector)))) - -;;;; Dummy definition for a spin-loop hint VOP -(define-vop () - (:translate spin-loop-hint) - (:policy :fast-safe) - (:generator 0)) diff --git a/src/compiler/hppa/target-insts.lisp b/src/compiler/hppa/target-insts.lisp deleted file mode 100644 index cf1a188b23..0000000000 --- a/src/compiler/hppa/target-insts.lisp +++ /dev/null @@ -1,39 +0,0 @@ -;;;; This file is for stuff which was in CMU CL's insts.lisp -;;;; file, but which in the SBCL build process can't be compiled -;;;; into code for the cross-compilation host. - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-HPPA-ASM") - -(defun break-control (chunk inst stream dstate) - (declare (ignore inst)) - (flet ((nt (x) (if stream (note x dstate)))) - (let ((trap (break-im5 chunk dstate))) - (case trap - (#.cerror-trap - (nt "Cerror trap") - (handle-break-args #'snarf-error-junk trap stream dstate)) - (#.breakpoint-trap - (nt "Breakpoint trap")) - (#.pending-interrupt-trap - (nt "Pending interrupt trap")) - (#.halt-trap - (nt "Halt trap")) - (#.fun-end-breakpoint-trap - (nt "Function end breakpoint trap")) - (#.single-step-around-trap - (nt "Single step around trap")) - (#.error-trap - (nt "Error trap") - (handle-break-args (lambda (sap offset trap &optional length-only) - (snarf-error-junk sap offset trap length-only nil)) - trap - stream dstate)))))) diff --git a/src/compiler/hppa/type-vops.lisp b/src/compiler/hppa/type-vops.lisp deleted file mode 100644 index 6fa5179dd6..0000000000 --- a/src/compiler/hppa/type-vops.lisp +++ /dev/null @@ -1,164 +0,0 @@ -;;;; type testing and checking VOPs for the HPPA VM - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - -;;; Test generation utilities. -(defun %test-fixnum (value temp target not-p) - (declare (ignore temp)) - (assemble () - (inst extru value 31 2 zero-tn (if not-p := :<>)) - (inst b target :nullify t))) - -(defun %test-fixnum-and-headers (value temp target not-p headers &key value-tn-ref) - (let ((drop-through (gen-label))) - (assemble () - (inst extru value 31 2 zero-tn :<>) - (inst b (if not-p drop-through target) :nullify t)) - (%test-headers value temp target not-p nil headers - :drop-through drop-through - :value-tn-ref value-tn-ref))) - -(defun %test-immediate (value temp target not-p immediate) - (assemble () - (inst extru value 31 8 temp) - (inst bci := not-p immediate temp target))) - -(defun %test-lowtag (value temp target not-p lowtag &key temp-loaded) - (assemble () - (unless temp-loaded - (inst extru value 31 3 temp)) - (inst bci := not-p lowtag temp target))) - -(defun %test-headers (value temp target not-p function-p headers - &key (drop-through (gen-label)) temp-loaded - value-tn-ref) - (declare (ignore value-tn-ref)) - (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag))) - (multiple-value-bind - (equal greater-or-equal when-true when-false) - ;; EQUAL and GREATER-OR-EQUAL are the conditions for branching to - ;; TARGET. WHEN-TRUE and WHEN-FALSE are the labels to branch to when - ;; we know it's true and when we know it's false respectively. - (if not-p - (values :<> :< drop-through target) - (values := :>= target drop-through)) - (assemble () - (%test-lowtag value temp when-false t lowtag - :temp-loaded temp-loaded) - (inst ldb (- 3 lowtag) value temp) - (do ((remaining headers (cdr remaining))) - ((null remaining)) - (let ((header (car remaining)) - (last (null (cdr remaining)))) - (cond - ((atom header) - (if last - (inst bci equal nil header temp target) - (inst bci := nil header temp when-true))) - (t - (let ((start (car header)) - (end (cdr header))) - (unless (= start bignum-widetag) - (inst bci :> nil start temp when-false)) - (if last - (inst bci greater-or-equal nil end temp target) - (inst bci :>= nil end temp when-true))))))) - (emit-label drop-through))))) - -;;;; Other integer ranges. - -;;; A (signed-byte 32) can be represented with either fixnum or a bignum with -;;; exactly one digit. -(defun signed-byte-32-test (value temp not-p target not-target) - (multiple-value-bind - (yep nope) - (if not-p - (values not-target target) - (values target not-target)) - (assemble () - (inst extru value 31 2 zero-tn :<>) - (inst b yep :nullify t) - (inst extru value 31 3 temp) - (inst bci :<> nil other-pointer-lowtag temp nope) - (loadw temp value 0 other-pointer-lowtag) - (inst bci := not-p (+ (ash 1 n-widetag-bits) bignum-widetag) temp target))) - (values)) - -(define-vop (signed-byte-32-p type-predicate) - (:translate signed-byte-32-p) - (:generator 45 - (signed-byte-32-test value temp not-p target not-target) - NOT-TARGET)) - -;;; An (unsigned-byte 32) can be represented with either a positive fixnum, a -;;; bignum with exactly one positive digit, or a bignum with exactly two digits -;;; and the second digit all zeros. -(defun unsigned-byte-32-test (value temp not-p target not-target) - (let ((nope (if not-p target not-target))) - (assemble () - ;; Is it a fixnum? - (inst extru value 31 2 zero-tn :<>) - (inst b fixnum) - (move value temp t) - - ;; If not, is it an other pointer? - (inst extru value 31 3 temp) - (inst bci :<> nil other-pointer-lowtag temp nope) - ;; Get the header. - (loadw temp value 0 other-pointer-lowtag) - ;; Is it one? - (inst bci := nil (+ (ash 1 n-widetag-bits) bignum-widetag) temp single-word) - ;; If it's other than two, we can't be an (unsigned-byte 32) - (inst bci :<> nil (+ (ash 2 n-widetag-bits) bignum-widetag) temp nope) - ;; Get the second digit. - (loadw temp value (1+ bignum-digits-offset) other-pointer-lowtag) - ;; All zeros, its an (unsigned-byte 32). - ;; Dont nullify comb here, because we cant guarantee target is forward - (inst comb (if not-p := :<>) temp zero-tn not-target) - (inst nop) - (inst b target) - - SINGLE-WORD - ;; Get the single digit. - (loadw temp value bignum-digits-offset other-pointer-lowtag) - - ;; positive implies (unsigned-byte 32). - FIXNUM - (inst bc :>= not-p temp zero-tn target))) - (values)) - -(define-vop (unsigned-byte-32-p type-predicate) - (:translate unsigned-byte-32-p) - (:generator 45 - (unsigned-byte-32-test value temp not-p target not-target) - NOT-TARGET)) - -;;;; List/symbol types: -;;; -;;; symbolp (or symbol (eq nil)) -;;; consp (and list (not (eq nil))) - -(define-vop (symbolp type-predicate) - (:translate symbolp) - (:generator 12 - (inst bc := nil value null-tn (if not-p drop-thru target)) - (test-type value temp target not-p (symbol-widetag)) - DROP-THRU)) - -(define-vop (consp type-predicate) - (:translate consp) - (:generator 8 - (inst bc := nil value null-tn (if not-p target drop-thru)) - (test-type value temp target not-p (list-pointer-lowtag)) - DROP-THRU)) - - diff --git a/src/compiler/hppa/values.lisp b/src/compiler/hppa/values.lisp deleted file mode 100644 index 2df3b9ad1d..0000000000 --- a/src/compiler/hppa/values.lisp +++ /dev/null @@ -1,136 +0,0 @@ -(in-package "SB-VM") - -(define-vop (reset-stack-pointer) - (:args (ptr :scs (any-reg))) - (:generator 1 - (move ptr csp-tn))) - -(define-vop (%%nip-values) - (:args (last-nipped-ptr :scs (any-reg) :target dest) - (last-preserved-ptr :scs (any-reg) :target src) - (moved-ptrs :scs (any-reg) :more t)) - (:results (r-moved-ptrs :scs (any-reg) :more t)) - (:temporary (:sc any-reg) src) - (:temporary (:sc any-reg) dest) - (:temporary (:sc descriptor-reg) temp) - (:ignore r-moved-ptrs) - (:generator 1 - (move last-preserved-ptr src) - (move last-nipped-ptr dest) - (inst comb :>= src csp-tn DONE :nullify t) - LOOP - (inst ldwm n-word-bytes src temp) - (inst addi n-word-bytes dest dest) - (storew temp dest -1) - (inst comb :> csp-tn src LOOP) - (inst nop) - DONE - (move dest csp-tn) - (inst sub src dest src) - (loop for moved = moved-ptrs then (tn-ref-across moved) - while moved do - (sc-case (tn-ref-tn moved) - ((descriptor-reg any-reg) - (inst sub (tn-ref-tn moved) src (tn-ref-tn moved))) - ((control-stack) - (load-stack-tn temp (tn-ref-tn moved)) - (inst sub temp src temp) - (store-stack-tn (tn-ref-tn moved) temp)))))) - -;;; Push some values onto the stack, returning the start and number of values -;;; pushed as results. It is assumed that the Vals are wired to the standard -;;; argument locations. Nvals is the number of values to push. -;;; -;;; The generator cost is pseudo-random. We could get it right by defining a -;;; bogus SC that reflects the costs of the memory-to-memory moves for each -;;; operand, but this seems unworthwhile. -;;; -(define-vop (push-values) - (:args - (vals :more t)) - (:results (start :scs (any-reg)) - (count :scs (any-reg))) - (:info nvals) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (descriptor-reg) - :to (:result 0) - :target start) - start-temp) - (:generator 20 - (move csp-tn start-temp) - (inst addi (* nvals n-word-bytes) csp-tn csp-tn) - (do ((val vals (tn-ref-across val)) - (i 0 (1+ i))) - ((null val)) - (let ((tn (tn-ref-tn val))) - (sc-case tn - (descriptor-reg - (storew tn start-temp i)) - (control-stack - (load-stack-tn temp tn) - (storew temp start-temp i))))) - (move start-temp start) - (inst li (fixnumize nvals) count))) - -;;; Push a list of values on the stack, returning Start and Count as used in -;;; unknown values continuations. -;;; -(define-vop (values-list) - (:args (arg :scs (descriptor-reg) :target list)) - (:arg-types list) - (:policy :fast-safe) - (:results (start :scs (any-reg)) - (count :scs (any-reg))) - (:temporary (:scs (descriptor-reg) :from (:argument 0)) list) - (:temporary (:scs (descriptor-reg)) temp) - (:temporary (:scs (non-descriptor-reg)) ndescr) - (:vop-var vop) - (:save-p :compute-only) - (:generator 0 - (move arg list) - (move csp-tn start) - LOOP - (inst comb := list null-tn done) - (loadw temp list cons-car-slot list-pointer-lowtag) - (loadw list list cons-cdr-slot list-pointer-lowtag) - (inst addi n-word-bytes csp-tn csp-tn) - (storew temp csp-tn -1) - (inst extru list 31 n-lowtag-bits ndescr) - (inst comib := list-pointer-lowtag ndescr loop) - (inst nop) - (cerror-call vop 'bogus-arg-to-values-list-error list) - DONE - (inst sub csp-tn start count))) - -;;; Copy the more arg block to the top of the stack so we can use them -;;; as function arguments. -;;; -(define-vop (%more-arg-values) - (:args (context :scs (descriptor-reg any-reg) :target src) - (skip :scs (any-reg zero immediate)) - (num :scs (any-reg) :target count)) - (:arg-types * positive-fixnum positive-fixnum) - (:temporary (:sc any-reg :from (:argument 0)) src) - (:temporary (:sc any-reg :from (:argument 2)) dst end) - (:temporary (:sc descriptor-reg :from (:argument 1)) temp) - (:results (start :scs (any-reg)) - (count :scs (any-reg))) - (:generator 20 - (sc-case skip - (zero - (move context src)) - (immediate - (inst addi (* (tn-value skip) n-word-bytes) context src)) - (any-reg - (inst add skip context src))) - (move num count) - (inst comb := num zero-tn done) - (move csp-tn start t) - (move csp-tn dst) - (inst add count csp-tn csp-tn) - (inst addi (- n-word-bytes) csp-tn end) - LOOP - (inst ldwm n-word-bytes src temp) - (inst comb :<> dst end loop) - (inst stwm temp n-word-bytes dst) - DONE)) diff --git a/src/compiler/hppa/vm.lisp b/src/compiler/hppa/vm.lisp deleted file mode 100644 index 68cec6a35c..0000000000 --- a/src/compiler/hppa/vm.lisp +++ /dev/null @@ -1,381 +0,0 @@ -;;;; miscellaneous VM definition noise for HPPA - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-VM") - - -;;;; Registers - -(eval-when (:compile-toplevel :load-toplevel :execute) - (defvar *register-names* (make-array 32 :initial-element nil))) - -(macrolet ((defreg (name offset) - (let ((offset-sym (symbolicate name "-OFFSET"))) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (defconstant ,offset-sym ,offset) - (setf (svref *register-names* ,offset-sym) ,(symbol-name name))))) - (defregset (name &rest regs) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter ,name - (list ,@(mapcar #'(lambda (name) (symbolicate name "-OFFSET")) regs)))))) - ;; Wired-zero - (defreg zero 0) - ;; This gets trashed by the C call convention. - (defreg nfp 1) ;; and saved by lisp before calling C - (defreg cfunc 2) - ;; These are the callee saves, so these registers are stay live over - ;; call-out. - (defreg csp 3) - (defreg cfp 4) - (defreg bsp 5) - (defreg null 6) - (defreg alloc 7) - (defreg code 8) - (defreg fdefn 9) - (defreg lexenv 10) - (defreg nargs 11) - (defreg ocfp 12) - (defreg lra 13) - (defreg a0 14) - (defreg a1 15) - (defreg a2 16) - (defreg a3 17) - (defreg a4 18) - ;; This is where the caller-saves registers start, but we don't - ;; really care because we need to clear the above after call-out to - ;; make sure no pointers into oldspace are kept around. - (defreg a5 19) - (defreg l0 20) - (defreg l1 21) - (defreg l2 22) - ;; These are the 4 C argument registers. - (defreg nl3 23) - (defreg nl2 24) - (defreg nl1 25) - (defreg nl0 26) - ;; The global Data Pointer. We just leave it alone, because we - ;; don't need it. - (defreg dp 27) - ;; These two are use for C return values. - (defreg nl4 28) - (defreg nl5 29) - (defreg nsp 30) - (defreg lip 31) - - (defregset non-descriptor-regs - nl0 nl1 nl2 nl3 nl4 nl5 cfunc nargs nfp) - - (defregset descriptor-regs - a0 a1 a2 a3 a4 a5 fdefn lexenv ocfp lra l0 l1 l2) - - (defregset boxed-regs - code fdefn lexenv ocfp lra - a0 a1 a2 a3 a4 a5 - l0 l1 l2 nfp) - - (defregset *register-arg-offsets* - a0 a1 a2 a3 a4 a5) - - (defregset reserve-descriptor-regs - fdefn lexenv) - - (defregset reserve-non-descriptor-regs - cfunc)) - -(!define-storage-bases -(define-storage-base registers :finite :size 32) -(define-storage-base float-registers :finite :size 64) -(define-storage-base control-stack :unbounded :size 8) -(define-storage-base non-descriptor-stack :unbounded :size 0) -(define-storage-base constant :non-packed) -(define-storage-base immediate-constant :non-packed) -) - -(!define-storage-classes - - ;; Non-immediate constants in the constant pool - (constant constant) - - ;; ZERO and NULL are in registers. - (zero immediate-constant) - (null immediate-constant) - (fp-single-zero immediate-constant) - (fp-double-zero immediate-constant) - - ;; Anything else that can be an immediate. - (immediate immediate-constant) - - - ;; **** The stacks. - - ;; The control stack. (Scanned by GC) - (control-stack control-stack) - - ;; We put ANY-REG and DESCRIPTOR-REG early so that their SC-NUMBER - ;; is small and therefore the error trap information is smaller. - ;; Moving them up here from their previous place down below saves - ;; ~250K in core file size. --njf, 2006-01-27 - - ;; Immediate descriptor objects. Don't have to be seen by GC, but nothing - ;; bad will happen if they are. (fixnums, characters, header values, etc). - (any-reg - registers - :locations #.(append non-descriptor-regs descriptor-regs) - :reserve-locations #.(append reserve-non-descriptor-regs - reserve-descriptor-regs) - :constant-scs (constant zero immediate) - :save-p t - :alternate-scs (control-stack)) - - ;; Pointer descriptor objects. Must be seen by GC. - (descriptor-reg registers - :locations #.descriptor-regs - :reserve-locations #.reserve-descriptor-regs - :constant-scs (constant null immediate) - :save-p t - :alternate-scs (control-stack)) - - ;; The non-descriptor stacks. - (signed-stack non-descriptor-stack) ; (signed-byte 32) - (unsigned-stack non-descriptor-stack) ; (unsigned-byte 32) - (character-stack non-descriptor-stack) ; non-descriptor characters. - (sap-stack non-descriptor-stack) ; System area pointers. - (single-stack non-descriptor-stack) ; single-floats - (double-stack non-descriptor-stack - :element-size 2 :alignment 2) ; double floats. - (complex-single-stack non-descriptor-stack :element-size 2) - (complex-double-stack non-descriptor-stack :element-size 4 :alignment 2) - - ;; **** Things that can go in the integer registers. - - ;; Non-Descriptor characters - (character-reg registers - :locations #.non-descriptor-regs - :reserve-locations #.reserve-non-descriptor-regs - :constant-scs (immediate) - :save-p t - :alternate-scs (character-stack)) - - ;; Non-Descriptor SAP's (arbitrary pointers into address space) - (sap-reg registers - :locations #.non-descriptor-regs - :reserve-locations #.reserve-non-descriptor-regs - :constant-scs (immediate) - :save-p t - :alternate-scs (sap-stack)) - - ;; Non-Descriptor (signed or unsigned) numbers. - (signed-reg registers - :locations #.non-descriptor-regs - :reserve-locations #.reserve-non-descriptor-regs - :constant-scs (zero immediate) - :save-p t - :alternate-scs (signed-stack)) - (unsigned-reg registers - :locations #.non-descriptor-regs - :reserve-locations #.reserve-non-descriptor-regs - :constant-scs (zero immediate) - :save-p t - :alternate-scs (unsigned-stack)) - - ;; Random objects that must not be seen by GC. Used only as temporaries. - (non-descriptor-reg registers - :locations #.non-descriptor-regs) - - ;; Pointers to the interior of objects. Used only as an temporary. - (interior-reg registers - :locations (#.lip-offset)) - - - ;; **** Things that can go in the floating point registers. - - ;; Non-Descriptor single-floats. - (single-reg float-registers - :locations #.(loop for i from 4 to 31 collect i) - :constant-scs (fp-single-zero) - :save-p t - :alternate-scs (single-stack)) - - ;; Non-Descriptor double-floats. - (double-reg float-registers - :locations #.(loop for i from 4 to 31 collect i) - :constant-scs (fp-double-zero) - :save-p t - :alternate-scs (double-stack)) - - (complex-single-reg float-registers - :locations #.(loop for i from 4 to 30 by 2 collect i) - :element-size 2 - :constant-scs () - :save-p t - :alternate-scs (complex-single-stack)) - - (complex-double-reg float-registers - :locations #.(loop for i from 4 to 30 by 2 collect i) - :element-size 2 - :constant-scs () - :save-p t - :alternate-scs (complex-double-stack)) - - (catch-block control-stack :element-size catch-block-size) - (unwind-block control-stack :element-size unwind-block-size) - - ;; floating point numbers temporarily stuck in integer registers for c-call - (single-int-carg-reg registers - :locations (26 25 24 23) - :alternate-scs () - :constant-scs ()) - (double-int-carg-reg registers - :locations (25 23) - :constant-scs () - :alternate-scs () -; :alignment 2 ;is this needed? -; :element-size 2 - )) - - -;;;; Make some random tns for important registers. - -;;; how can we address reg L0 through L0-offset when it is not -;;; defined here ? do all registers have an -offset and this is -;;; redundant work ? -;;; -;;; FIXME-lav: move this into arch-generic-helpers -(macrolet ((defregtn (name sc) - (let ((offset-sym (symbolicate name "-OFFSET")) - (tn-sym (symbolicate name "-TN"))) - `(defparameter ,tn-sym - (make-random-tn :kind :normal - :sc (sc-or-lose ',sc) - :offset ,offset-sym))))) - - ;; These, we access by foo-TN only - - (defregtn zero any-reg) - (defregtn nargs any-reg) - ;; FIXME-lav: 20080820: not a fix, but fdefn and lexenv is used in assembly-rtns - (defregtn fdefn descriptor-reg) ; FIXME-lav, not used - (defregtn lexenv descriptor-reg) ; FIXME-lav, not used - - (defregtn nfp descriptor-reg) ; why not descriptor-reg ? - (defregtn ocfp any-reg) ; why not descriptor-reg ? - - (defregtn null descriptor-reg) - - (defregtn bsp any-reg) - (defregtn cfp any-reg) - (defregtn csp any-reg) - (defregtn alloc any-reg) - (defregtn nsp any-reg) - - (defregtn code descriptor-reg) - (defregtn lip interior-reg)) - -;; And some floating point values. -(defparameter fp-single-zero-tn - (make-random-tn :kind :normal - :sc (sc-or-lose 'single-reg) - :offset 0)) -(defparameter fp-double-zero-tn - (make-random-tn :kind :normal - :sc (sc-or-lose 'double-reg) - :offset 0)) - - -;;; If VALUE can be represented as an immediate constant, then return -;;; the appropriate SC number, otherwise return NIL. -(defun immediate-constant-sc (value) - (typecase value - ((integer 0 0) - zero-sc-number) - (null - null-sc-number) - ((or (integer #.most-negative-fixnum #.most-positive-fixnum) - #-sb-xc-host system-area-pointer ; no object can be a SAP in the host - character) - immediate-sc-number) - (symbol - (if (static-symbol-p value) - immediate-sc-number - nil)) - (single-float - (if (eql value $0f0) - fp-single-zero-sc-number - nil)) - (double-float - (if (eql value $0d0) - fp-double-zero-sc-number - nil)))) - -(defun boxed-immediate-sc-p (sc) - (or (eql sc zero-sc-number) - (eql sc null-sc-number) - (eql sc immediate-sc-number))) - -;;;; Function Call Parameters - -;;; The SC numbers for register and stack arguments/return values. -;;; -(defconstant immediate-arg-scn any-reg-sc-number) -(defconstant control-stack-arg-scn control-stack-sc-number) - -(eval-when (:compile-toplevel :load-toplevel :execute) - -;;; Offsets of special stack frame locations -(defconstant ocfp-save-offset 0) -(defconstant lra-save-offset 1) -(defconstant nfp-save-offset 2) - -;;; The number of arguments/return values passed in registers. -;;; -(defconstant register-arg-count 6) - -;;; Names to use for the argument registers. -;;; -(defconstant-eqx register-arg-names '(a0 a1 a2 a3 a4 a5) #'equal) - -) ; EVAL-WHEN - - -;;; A list of TN's describing the register arguments. -;;; -(defparameter *register-arg-tns* - (mapcar (lambda (n) - (make-random-tn :kind :normal - :sc (sc-or-lose 'descriptor-reg) - :offset n)) - *register-arg-offsets*)) - -;;; This is used by the debugger. -(defconstant single-value-return-byte-offset 4) - -;;; This function is called by debug output routines that want a pretty name -;;; for a TN's location. It returns a thing that can be printed with PRINC. -(defun location-print-name (tn) - (declare (type tn tn)) - (let ((sb (sb-name (sc-sb (tn-sc tn)))) - (offset (tn-offset tn))) - (ecase sb - (registers (or (svref *register-names* offset) - (format nil "R~D" offset))) - (float-registers (format nil "F~D" offset)) - (control-stack (format nil "CS~D" offset)) - (non-descriptor-stack (format nil "NS~D" offset)) - (constant (format nil "Const~D" offset)) - (immediate-constant "Immed")))) - -(defun combination-implementation-style (node) - (declare (type sb-c::combination node) (ignore node)) - (values :default nil)) - -(defun primitive-type-indirect-cell-type (ptype) - (declare (ignore ptype)) - nil) diff --git a/src/runtime/Config.hppa-linux b/src/runtime/Config.hppa-linux deleted file mode 100644 index 75cc31c8cb..0000000000 --- a/src/runtime/Config.hppa-linux +++ /dev/null @@ -1,28 +0,0 @@ -# -*- makefile -*- for the C-level run-time support for SBCL - -# This software is part of the SBCL system. See the README file for -# more information. -# -# This software is derived from the CMU CL system, which was -# written at Carnegie Mellon University and released into the -# public domain. The software is in the public domain and is -# provided with absolutely no warranty. See the COPYING and CREDITS -# files for more information. - -LINKFLAGS += -v -NM = ./linux-nm - -ASSEM_SRC = hppa-assem.S ldso-stubs.S -ARCH_SRC = hppa-arch.c - -OS_SRC = linux-os.c linux-mman.c hppa-linux-os.c -OS_LIBS = -ldl -ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz -endif - -GC_SRC = cheneygc.c - -# Nothing to do for after-grovel-headers. -.PHONY: after-grovel-headers -after-grovel-headers: diff --git a/src/runtime/hppa-arch.c b/src/runtime/hppa-arch.c deleted file mode 100644 index bc8ba7b38c..0000000000 --- a/src/runtime/hppa-arch.c +++ /dev/null @@ -1,369 +0,0 @@ -/* - * This software is part of the SBCL system. See the README file for - * more information. - * - * This software is derived from the CMU CL system, which was - * written at Carnegie Mellon University and released into the - * public domain. The software is in the public domain and is - * provided with absolutely no warranty. See the COPYING and CREDITS - * files for more information. - */ -#include - -/* Copied from sparc-arch.c. Not all of these are necessary, probably */ -#include "sbcl.h" -#include "runtime.h" -#include "arch.h" -#include "globals.h" -#include "validate.h" -#include "os.h" -#include "lispregs.h" -#include "signal.h" -#include "alloc.h" -#include "interrupt.h" -#include "interr.h" -#include "breakpoint.h" - -static inline unsigned int -os_context_pc(os_context_t *context) -{ - return (unsigned int)(*os_context_pc_addr(context)); -} - -os_vm_address_t arch_get_bad_addr(int signal, siginfo_t *siginfo, os_context_t *context) -{ - return (os_vm_address_t)siginfo->si_addr; -#if 0 -#ifdef LISP_FEATURE_HPUX - struct save_state *state; - os_vm_address_t addr; - - state = (struct save_state *)(&(scp->sc_sl.sl_ss)); - - if (state == NULL) - return NULL; - - /* Check the instruction address first. */ - addr = (os_vm_address_t)((unsigned long)scp->sc_pcoq_head & ~3); - if (addr < (os_vm_address_t)0x1000) - return addr; - - /* Otherwise, it must have been a data fault. */ - return (os_vm_address_t)state->ss_cr21; -#else - struct hp800_thread_state *state; - os_vm_address_t addr; - - state = (struct hp800_thread_state *)(scp->sc_ap); - - if (state == NULL) - return NULL; - - /* Check the instruction address first. */ - addr = scp->sc_pcoqh & ~3; - if (addr < 0x1000) - return addr; - - /* Otherwise, it must have been a data fault. */ - return state->cr21; -#endif -#endif -} - -unsigned char *arch_internal_error_arguments(os_context_t *context) -{ - return (unsigned char *)((*os_context_pc_addr(context) & ~3) + 4); -} - -boolean arch_pseudo_atomic_atomic(os_context_t *context) -{ - /* FIXME: this foreign_function_call_active test is dubious at - * best. If a foreign call is made in a pseudo atomic section - * (?) or more likely a pseudo atomic section is in a foreign - * call then an interrupt is executed immediately. Maybe it - * has to do with C code not maintaining pseudo atomic - * properly. MG - 2005-08-10 - * - * The foreign_function_call_active used to live at each call-site - * to arch_pseudo_atomic_atomic, but this seems clearer. - * --NS 2007-05-15 */ - -#if defined(LISP_FEATURE_HPUX) - // FIX-lav: use accessor macro instead - return (!foreign_function_call_active) && - *(&((ucontext_t *) context)->uc_mcontext.ss_wide.ss_64.ss_gr7) & 4; -#else - return (!foreign_function_call_active) && - ((*os_context_register_addr(context,reg_ALLOC)) & 4); -#endif -} - -void arch_set_pseudo_atomic_interrupted(os_context_t *context) -{ -#if defined(LISP_FEATURE_HPUX) - *(&((ucontext_t *) context)->uc_mcontext.ss_wide.ss_64.ss_gr7) |= 1; -/* on hpux do we need to watch out for the barbarian ? */ - *((os_context_register_t *) &((ucontext_t *) context)->uc_mcontext.ss_flags) - |= SS_MODIFIEDWIDE; -#else - *os_context_register_addr(context,reg_ALLOC) |= 1; -#endif -} - -/* FIXME: untested */ -void arch_clear_pseudo_atomic_interrupted(os_context_t *context) -{ -#if defined(LISP_FEATURE_HPUX) - *(&((ucontext_t *) context)->uc_mcontext.ss_wide.ss_64.ss_gr7) &= ~1; - *((os_context_register_t *) &((ucontext_t *) context)->uc_mcontext.ss_flags) - |= SS_MODIFIEDWIDE; -#else - *os_context_register_addr(context,reg_ALLOC) &= ~1; -#endif -} - -void arch_skip_instruction(os_context_t *context) -{ - *((unsigned int *) os_context_pc_addr(context)) = *((unsigned int *) os_context_npc_addr(context)); - *((unsigned int *) os_context_npc_addr(context)) += 4; -#ifdef LISP_FEATURE_HPUX - *((os_context_register_t *) &((ucontext_t *) context)->uc_mcontext.ss_flags) - |= SS_MODIFIEDWIDE; -#endif -} - -unsigned int arch_install_breakpoint(void *pc) -{ - unsigned int *ulpc = (unsigned int *)pc; - unsigned int orig_inst = *ulpc; - - *ulpc = trap_Breakpoint; - os_flush_icache((os_vm_address_t)pc, sizeof(*ulpc)); - return orig_inst; -} - -void arch_remove_breakpoint(void *pc, unsigned int orig_inst) -{ - unsigned int *ulpc = (unsigned int *)pc; - - *ulpc = orig_inst; - os_flush_icache((os_vm_address_t)pc, sizeof(*ulpc)); -} - -void arch_do_displaced_inst(os_context_t *context, unsigned int orig_inst) -{ - fprintf(stderr, "arch_do_displaced_inst() WARNING: stub.\n"); - /* FIXME: Fill this in */ -#if 0 -#ifdef LISP_FEATURE_HPUX - /* We change the next-pc to point to a breakpoint instruction, restore */ - /* the original instruction, and exit. We would like to be able to */ - /* sigreturn, but we can't, because this is hpux. */ - unsigned int *pc = (unsigned int *)(SC_PC(scp) & ~3); - - NextPc = SC_NPC(scp); - SC_NPC(scp) = (unsigned int)SingleStepTraps | (SC_NPC(scp)&3); - - BreakpointAddr = pc; - *pc = orig_inst; - os_flush_icache((os_vm_address_t)pc, sizeof(unsigned int)); -#else - /* We set the recovery counter to cover one instruction, put the */ - /* original instruction back in, and then resume. We will then trap */ - /* after executing that one instruction, at which time we can put */ - /* the breakpoint back in. */ - - ((struct hp800_thread_state *)scp->sc_ap)->cr0 = 1; - scp->sc_ps |= 0x10; - *(unsigned int *)SC_PC(scp) = orig_inst; - - sigreturn(scp); -#endif -#endif -} - -#ifdef LISP_FEATURE_HPUX -#if 0 -static void restore_breakpoint(struct sigcontext *scp) -{ - /* We just single-stepped over an instruction that we want to replace */ - /* with a breakpoint. So we put the breakpoint back in, and tweek the */ - /* state so that we will continue as if nothing happened. */ - - if (NextPc == NULL) - lose("SingleStepBreakpoint trap at strange time."); - - if ((SC_PC(scp)&~3) == (unsigned int)SingleStepTraps) { - /* The next instruction was not nullified. */ - SC_PC(scp) = NextPc; - if ((SC_NPC(scp)&~3) == (unsigned int)SingleStepTraps + 4) { - /* The instruction we just stepped over was not a branch, so */ - /* we need to fix it up. If it was a branch, it will point to */ - /* the correct place. */ - SC_NPC(scp) = NextPc + 4; - } - } - else { - /* The next instruction was nullified, so we want to skip it. */ - SC_PC(scp) = NextPc + 4; - SC_NPC(scp) = NextPc + 8; - } - NextPc = NULL; - - if (BreakpointAddr) { - *BreakpointAddr = trap_Breakpoint; - os_flush_icache((os_vm_address_t)BreakpointAddr, - sizeof(unsigned int)); - BreakpointAddr = NULL; - } -} -#endif -#endif - - - -void -arch_handle_breakpoint(os_context_t *context) -{ - /*sigsetmask(scp->sc_mask); */ - handle_breakpoint(context); -} - -void -arch_handle_fun_end_breakpoint(os_context_t *context) -{ - /*sigsetmask(scp->sc_mask); */ - unsigned long pc; - pc = (unsigned long) - handle_fun_end_breakpoint(context); - *os_context_pc_addr(context) = pc; - *os_context_npc_addr(context) = pc + 4; -#ifdef LISP_FEATURE_HPUX - *((os_context_register_t *) &((ucontext_t *) context)->uc_mcontext.ss_flags) - |= SS_MODIFIEDWIDE; -#endif -} - - -//FIX-lav: this whole is copied from mips -void -arch_handle_single_step_trap(os_context_t *context, int trap) -{ - unsigned int code = *((u32 *)(os_context_pc(context))); - int register_offset = code >> 11 & 0x1f; - handle_single_step_trap(context, trap, register_offset); - arch_skip_instruction(context); -} - -static void -sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context) -{ - unsigned int bad_inst; - - bad_inst = *(unsigned int *)(*os_context_pc_addr(context) & ~3); - if (bad_inst & 0xfc001fe0) - interrupt_handle_now(signal, siginfo, context); - else { - int im5 = bad_inst & 0x1f; - handle_trap(context, im5); - } -} - -static void -sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context) -{ - unsigned int bad_inst; - - bad_inst = *(unsigned int *)(*os_context_pc_addr(context) & ~3); - if (bad_inst == 9) { /* pending-interrupt */ - arch_clear_pseudo_atomic_interrupted(context); - arch_skip_instruction(context); - interrupt_handle_pending(context); - } else { - handle_trap(context,bad_inst); - } -} - -static void sigfpe_handler(int signal, siginfo_t *siginfo, - os_context_t *context) -{ - unsigned badinst = *(unsigned *)(*os_context_pc_addr(context) & ~3); - -#ifdef LISP_FEATURE_LINUX - if (!siginfo->si_code && /* Linux 3.14 seems to set si_code to 0 for this case */ -#else - if (siginfo->si_code == FPE_COND && -#endif - (badinst&0xfffff800) == (0xb000e000|reg_ALLOC<<21|reg_ALLOC<<16)) { - /* It is an ADDIT,OD i,ALLOC,ALLOC instruction that trapped. - * That means that it is the end of a pseudo-atomic. So do the - * add stripping off the pseudo-atomic-interrupted bit, and then - * tell the machine-independent code to process the pseudo- - * atomic. We cant skip the instruction because it holds - * extra-bytes that we must add to reg_alloc in context. - * It is so because we optimized away 'addi ,extra-bytes reg_alloc' - */ - int immed = (badinst>>1)&0x3ff; - if (badinst & 1) - immed |= -1<<10; - *os_context_register_addr(context, reg_ALLOC) += (immed-1); - arch_skip_instruction(context); - interrupt_handle_pending(context); - } else { - interrupt_handle_now(signal, siginfo, context); - } -} - -/* Merrily cut'n'pasted from sigfpe_handler. On Linux, until - 2.4.19-pa4 (hopefully), the overflow_trap wasn't implemented, - resulting in a SIGBUS instead. We adapt the sigfpe_handler here, in - the hope that it will do as a replacement until the new kernel sees - the light of day. Since the instructions that we need to fix up - tend not to be doing unaligned memory access, this should be a safe - workaround. -- CSR, 2002-08-17 */ -static void sigbus_handler(int signal, siginfo_t *siginfo, - os_context_t *context) -{ - - unsigned badinst = *(unsigned *)(*os_context_pc_addr(context) & ~3); - - /* First, test for the pseudo-atomic instruction */ - if ((badinst & 0xfffff800) == (0xb000e000 | reg_ALLOC<<21 | - reg_ALLOC<<16)) { - /* It is an ADDIT,OD i,ALLOC,ALLOC instruction that trapped. - That means that it is the end of a pseudo-atomic. So do - the add stripping off the pseudo-atomic-interrupted bit, - and then tell the machine-independent code to process the - pseudo-atomic. */ - int immed = (badinst>>1) & 0x3ff; - if (badinst & 1) - immed |= -1<<10; - *os_context_register_addr(context, reg_ALLOC) += (immed-1); - arch_skip_instruction(context); - interrupt_handle_pending(context); - } else { - interrupt_handle_now(signal, siginfo, context); - } -} - -#ifdef LISP_FEATURE_HPUX -static void -ignore_handler(int signal, siginfo_t *siginfo, os_context_t *context) -{ -} -#endif - -/* this routine installs interrupt handlers that will - * bypass the lisp interrupt handlers */ -void arch_install_interrupt_handlers(void) -{ - ll_install_handler(SIGTRAP,sigtrap_handler); - ll_install_handler(SIGILL,sigill_handler); - ll_install_handler(SIGFPE,sigfpe_handler); - /* FIXME: beyond 2.4.19-pa4 this shouldn't be necessary. */ - ll_install_handler(SIGBUS,sigbus_handler); -#ifdef LISP_FEATURE_HPUX - ll_install_handler(SIGXCPU,ignore_handler); - ll_install_handler(SIGXFSZ,ignore_handler); -#endif -} diff --git a/src/runtime/hppa-arch.h b/src/runtime/hppa-arch.h deleted file mode 100644 index 68541fda04..0000000000 --- a/src/runtime/hppa-arch.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _HPPA_ARCH_H -#define _HPPA_ARCH_H - -#define ARCH_HAS_NPC_REGISTER -#define ALIEN_STACK_GROWS_UPWARD - -#endif /* _HPPA_ARCH_H */ diff --git a/src/runtime/hppa-assem.S b/src/runtime/hppa-assem.S deleted file mode 100644 index 6932e88132..0000000000 --- a/src/runtime/hppa-assem.S +++ /dev/null @@ -1,473 +0,0 @@ -#ifdef __ELF__ -// Mark the object as not requiring an executable stack. -.section .note.GNU-stack,"",%progbits -#endif - -#include "sbcl.h" -#include "lispregs.h" -#include "genesis/closure.h" -#include "genesis/code.h" -#include "genesis/fdefn.h" -#include "genesis/simple-fun.h" -#include "genesis/return-pc.h" -#include "genesis/static-symbols.h" -#include "genesis/funcallable-instance.h" - - .level 2.0 - .text - - .import $global$,data - .import $$dyncall,MILLICODE - .import foreign_function_call_active,data - .import current_control_stack_pointer,data - .import current_control_frame_pointer,data - .import current_binding_stack_pointer,data - .import dynamic_space_free_pointer,data -/* .import return_from_lisp_function,data */ - - -/* - * Call-into-lisp - */ - - .export call_into_lisp -call_into_lisp: - .proc - .callinfo entry_gr=18,save_rp - .entry - /* %arg0=function, %arg1=cfp, %arg2=nargs */ - - stw %rp,-0x14(%sr0,%sp) - stwm %r3,0x40(%sr0,%sp) - stw %r4,-0x3c(%sr0,%sp) - stw %r5,-0x38(%sr0,%sp) - stw %r6,-0x34(%sr0,%sp) - stw %r7,-0x30(%sr0,%sp) - stw %r8,-0x2c(%sr0,%sp) - stw %r9,-0x28(%sr0,%sp) - stw %r10,-0x24(%sr0,%sp) - stw %r11,-0x20(%sr0,%sp) - stw %r12,-0x1c(%sr0,%sp) - stw %r13,-0x18(%sr0,%sp) - stw %r14,-0x14(%sr0,%sp) - stw %r15,-0x10(%sr0,%sp) - stw %r16,-0xc(%sr0,%sp) - stw %r17,-0x8(%sr0,%sp) - stw %r18,-0x4(%sr0,%sp) - - /* Clear the descriptor regs, moving in args as approporate. */ - copy %r0,reg_CODE - copy %r0,reg_FDEFN - copy %arg0,reg_LEXENV - zdep %arg2,29,30,reg_NARGS - copy %r0,reg_OCFP - copy %r0,reg_LRA - copy %r0,reg_A0 - copy %r0,reg_A1 - copy %r0,reg_A2 - copy %r0,reg_A3 - copy %r0,reg_A4 - copy %r0,reg_A5 - copy %r0,reg_L0 - copy %r0,reg_L1 - copy %r0,reg_L2 - - /* Establish NIL. */ - ldil L%NIL,reg_NULL - ldo R%NIL(reg_NULL),reg_NULL - - /* Turn on pseudo-atomic. */ - ldo 4(%r0),reg_ALLOC - - /* No longer in foreign function call land. */ - addil L%foreign_function_call_active-$global$,%dp - stw %r0,R%foreign_function_call_active-$global$(0,%r1) - - /* Load lisp state. */ - addil L%dynamic_space_free_pointer-$global$,%dp - ldw R%dynamic_space_free_pointer-$global$(0,%r1),%r1 - add reg_ALLOC,%r1,reg_ALLOC - addil L%current_binding_stack_pointer-$global$,%dp - ldw R%current_binding_stack_pointer-$global$(0,%r1),reg_BSP - addil L%current_control_stack_pointer-$global$,%dp - ldw R%current_control_stack_pointer-$global$(0,%r1),reg_CSP - addil L%current_control_frame_pointer-$global$,%dp - ldw R%current_control_frame_pointer-$global$(0,%r1),reg_OCFP - copy %arg1,reg_CFP - - /* End of pseudo-atomic. */ - addit,od -4,reg_ALLOC,reg_ALLOC - - /* Establish lisp arguments. */ - ldw 0(reg_CFP),reg_A0 - ldw 4(reg_CFP),reg_A1 - ldw 8(reg_CFP),reg_A2 - ldw 12(reg_CFP),reg_A3 - ldw 16(reg_CFP),reg_A4 - ldw 20(reg_CFP),reg_A5 - - /* Calculate the LRA. */ - ldil L%lra-RETURN_PC_RETURN_POINT_OFFSET,reg_LRA - ldo R%lra-RETURN_PC_RETURN_POINT_OFFSET(reg_LRA),reg_LRA - - /* Indirect the closure */ - ldw CLOSURE_FUN_OFFSET(0,reg_LEXENV),reg_CODE - addi SIMPLE_FUN_INSTS_OFFSET,reg_CODE,reg_LIP - -#ifdef LISP_FEATURE_HPUX - /* Get the stub address, ie assembly-routine return-from-lisp */ - addil L%return_from_lisp_stub-$global$,%dp - ldw R%return_from_lisp_stub-$global$(0,%r1),reg_NL0 - be,n 0(%sr5,reg_NL0) -#else - be,n 0(%sr5,reg_LIP) -#endif - - break 0,0 - - .align 8 -lra: - nop /* a few nops because we dont know where we land */ - nop /* the return convention would govern this */ - nop - nop - - /* Copy CFP (%r4) into someplace else and restore r4. */ - copy reg_CFP,reg_NL1 - ldw -0x3c(0,%sp),%r4 - - /* Copy the return value. */ - copy reg_A0,%ret0 - - /* Turn on pseudo-atomic. */ - addi 4,reg_ALLOC,reg_ALLOC - - /* Store the lisp state. */ - copy reg_ALLOC,reg_NL0 - depi 0,31,3,reg_NL0 - addil L%dynamic_space_free_pointer-$global$,%dp - stw reg_NL0,R%dynamic_space_free_pointer-$global$(0,%r1) - addil L%current_binding_stack_pointer-$global$,%dp - stw reg_BSP,R%current_binding_stack_pointer-$global$(0,%r1) - addil L%current_control_stack_pointer-$global$,%dp - stw reg_CSP,R%current_control_stack_pointer-$global$(0,%r1) - addil L%current_control_frame_pointer-$global$,%dp - stw reg_NL1,R%current_control_frame_pointer-$global$(0,%r1) - - /* Back in C land. [CSP is just a handy non-zero value.] */ - addil L%foreign_function_call_active-$global$,%dp - stw reg_CSP,R%foreign_function_call_active-$global$(0,%r1) - - /* Turn off pseudo-atomic and check for traps. */ - addit,od -4,reg_ALLOC,reg_ALLOC - - ldw -0x54(%sr0,%sp),%rp - ldw -0x4(%sr0,%sp),%r18 - ldw -0x8(%sr0,%sp),%r17 - ldw -0xc(%sr0,%sp),%r16 - ldw -0x10(%sr0,%sp),%r15 - ldw -0x14(%sr0,%sp),%r14 - ldw -0x18(%sr0,%sp),%r13 - ldw -0x1c(%sr0,%sp),%r12 - ldw -0x20(%sr0,%sp),%r11 - ldw -0x24(%sr0,%sp),%r10 - ldw -0x28(%sr0,%sp),%r9 - ldw -0x2c(%sr0,%sp),%r8 - ldw -0x30(%sr0,%sp),%r7 - ldw -0x34(%sr0,%sp),%r6 - ldw -0x38(%sr0,%sp),%r5 - ldw -0x3c(%sr0,%sp),%r4 - bv %r0(%rp) - ldwm -0x40(%sr0,%sp),%r3 - - /* And thats all. */ - .exit - .procend - - -/* - * Call-into-C - */ - - .export call_into_c -call_into_c: - /* Set up a lisp stack frame. */ - copy reg_CFP, reg_OCFP - copy reg_CSP, reg_CFP - addi 32, reg_CSP, reg_CSP - stw reg_OCFP, 0(0,reg_CFP) ; save old cfp - stw reg_CFP, 4(0,reg_CFP) ; save old csp - /* convert raw return PC into a fixnum PC-offset, because we dont - have ahold of an lra object */ - sub reg_LIP, reg_CODE, reg_NL5 - addi 3-OTHER_POINTER_LOWTAG, reg_NL5, reg_NL5 - stw reg_NL5, 8(0,reg_CFP) - stw reg_CODE, 0xc(0,reg_CFP) - - /* set pseudo-atomic flag */ - addi 4, reg_ALLOC, reg_ALLOC - - /* Store the lisp state. */ - copy reg_ALLOC,reg_NL5 - depi 0,31,3,reg_NL5 - addil L%dynamic_space_free_pointer-$global$,%dp - stw reg_NL5,R%dynamic_space_free_pointer-$global$(0,%r1) - addil L%current_binding_stack_pointer-$global$,%dp - stw reg_BSP,R%current_binding_stack_pointer-$global$(0,%r1) - addil L%current_control_stack_pointer-$global$,%dp - stw reg_CSP,R%current_control_stack_pointer-$global$(0,%r1) - addil L%current_control_frame_pointer-$global$,%dp - stw reg_CFP,R%current_control_frame_pointer-$global$(0,%r1) - - /* Back in C land. [CSP is just a handy non-zero value.] */ - addil L%foreign_function_call_active-$global$,%dp - stw reg_CSP,R%foreign_function_call_active-$global$(0,%r1) - - /* Turn off pseudo-atomic and check for traps. */ - addit,od -4,reg_ALLOC,reg_ALLOC - - /* in order to be able to call incrementally linked (ld -A) functions, - we have to do some mild trickery here */ - copy reg_CFUNC, %r22 - bl $$dyncall,%r31 - copy %r31, %r2 -call_into_c_return: - /* Clear the callee saves descriptor regs. */ - copy %r0, reg_A5 - copy %r0, reg_L0 - copy %r0, reg_L1 - copy %r0, reg_L2 - - /* Turn on pseudo-atomic. */ - ldi 4, reg_ALLOC - - /* Turn off foreign function call. */ - addil L%foreign_function_call_active-$global$,%dp - stw %r0,R%foreign_function_call_active-$global$(0,%r1) - - /* Load ALLOC. */ - addil L%dynamic_space_free_pointer-$global$,%dp - ldw R%dynamic_space_free_pointer-$global$(0,%r1),%r1 - add reg_ALLOC,%r1,reg_ALLOC - - /* We don't need to load OCFP, CFP, CSP, or BSP because they are - * in caller saves registers. - */ - - /* End of pseudo-atomic. */ - addit,od -4,reg_ALLOC,reg_ALLOC - - /* Restore CODE. Even though it is in a callee saves register - * it might have been GC'ed. - */ - ldw 0xc(0,reg_CFP), reg_CODE - - /* Restore the return pc. */ - ldw 8(0,reg_CFP), reg_NL0 - addi OTHER_POINTER_LOWTAG-3, reg_NL0, reg_NL0 -/* - addi -3, reg_NL0, reg_NL0 - ldi OTHER_POINTER_LOWTAG, reg_NL1 - sub reg_NL0, reg_NL1, reg_NL0 -*/ - add reg_CODE, reg_NL0, reg_LIP - - /* Pop the lisp stack frame, and back we go. */ - ldw 4(0,reg_CFP), reg_CSP - ldw 0(0,reg_CFP), reg_OCFP - copy reg_OCFP, reg_CFP - be 0(5,reg_LIP) - nop - - -/* - * Stuff to sanctify a block of memory for execution. - */ - - .EXPORT sanctify_for_execution -sanctify_for_execution: - .proc - .callinfo - .entry - /* %arg0=start addr, %arg1=length in bytes */ - add %arg0,%arg1,%arg1 - copy %arg0,%arg2 - ldo -1(%arg1),%arg1 - depi 0,31,5,%arg0 - depi 0,31,5,%arg1 - ldsid (%arg0),%r1 - mtsp %r1,%sr1 - ldi 32,%r1 ; bytes per cache line - /* parisc 1.1 and 2.0 manuals say to flush the dcache, SYNC, - * flush the icache, SYNC again, and burn seven instructions - * before executing modified code. */ -sanctify_loop: - comb,< %arg0,%arg1,sanctify_loop - fdc,m %r1(%sr1,%arg0) - sync -sanctify_loop_2: - comb,< %arg2,%arg1,sanctify_loop_2 - fic,m %r1(%sr1,%arg2) - sync - - bv %r0(%rp) - nop - - .exit - .procend - - -/* - * Core saving/restoring support - */ - - .export call_on_stack -call_on_stack: - /* %arg0 = fn to invoke, %arg1 = new stack base */ - - /* Compute the new stack pointer. */ - addi 64,%arg1,%sp - - /* Zero out the previous stack pointer. */ - stw %r0,-4(0,%sp) - - /* Invoke the function. */ - ble 0(4,%arg0) - copy %r31, %r2 - - /* Flame out. */ - break 0,0 - - .export save_state -save_state: - .proc - .callinfo entry_gr=18,entry_fr=21,save_rp,calls - .entry - - stw %rp,-0x14(%sr0,%sp) - fstds,ma %fr12,8(%sr0,%sp) - fstds,ma %fr13,8(%sr0,%sp) - fstds,ma %fr14,8(%sr0,%sp) - fstds,ma %fr15,8(%sr0,%sp) - fstds,ma %fr16,8(%sr0,%sp) - fstds,ma %fr17,8(%sr0,%sp) - fstds,ma %fr18,8(%sr0,%sp) - fstds,ma %fr19,8(%sr0,%sp) - fstds,ma %fr20,8(%sr0,%sp) - fstds,ma %fr21,8(%sr0,%sp) - stwm %r3,0x70(%sr0,%sp) - stw %r4,-0x6c(%sr0,%sp) - stw %r5,-0x68(%sr0,%sp) - stw %r6,-0x64(%sr0,%sp) - stw %r7,-0x60(%sr0,%sp) - stw %r8,-0x5c(%sr0,%sp) - stw %r9,-0x58(%sr0,%sp) - stw %r10,-0x54(%sr0,%sp) - stw %r11,-0x50(%sr0,%sp) - stw %r12,-0x4c(%sr0,%sp) - stw %r13,-0x48(%sr0,%sp) - stw %r14,-0x44(%sr0,%sp) - stw %r15,-0x40(%sr0,%sp) - stw %r16,-0x3c(%sr0,%sp) - stw %r17,-0x38(%sr0,%sp) - stw %r18,-0x34(%sr0,%sp) - - - /* Remember the function we want to invoke */ - copy %arg0,%r19 - - /* Pass the new stack pointer in as %arg0 */ - copy %sp,%arg0 - - /* Leave %arg1 as %arg1. */ - - /* do the call. */ - ble 0(4,%r19) - copy %r31, %r2 - - .export _restore_state -_restore_state: - - ldw -0xd4(%sr0,%sp),%rp - ldw -0x34(%sr0,%sp),%r18 - ldw -0x38(%sr0,%sp),%r17 - ldw -0x3c(%sr0,%sp),%r16 - ldw -0x40(%sr0,%sp),%r15 - ldw -0x44(%sr0,%sp),%r14 - ldw -0x48(%sr0,%sp),%r13 - ldw -0x4c(%sr0,%sp),%r12 - ldw -0x50(%sr0,%sp),%r11 - ldw -0x54(%sr0,%sp),%r10 - ldw -0x58(%sr0,%sp),%r9 - ldw -0x5c(%sr0,%sp),%r8 - ldw -0x60(%sr0,%sp),%r7 - ldw -0x64(%sr0,%sp),%r6 - ldw -0x68(%sr0,%sp),%r5 - ldw -0x6c(%sr0,%sp),%r4 - ldwm -0x70(%sr0,%sp),%r3 - fldds,mb -8(%sr0,%sp),%fr21 - fldds,mb -8(%sr0,%sp),%fr20 - fldds,mb -8(%sr0,%sp),%fr19 - fldds,mb -8(%sr0,%sp),%fr18 - fldds,mb -8(%sr0,%sp),%fr17 - fldds,mb -8(%sr0,%sp),%fr16 - fldds,mb -8(%sr0,%sp),%fr15 - fldds,mb -8(%sr0,%sp),%fr14 - fldds,mb -8(%sr0,%sp),%fr13 - bv %r0(%rp) - fldds,mb -8(%sr0,%sp),%fr12 - - - .exit - .procend - - .export restore_state -restore_state: - .proc - .callinfo - copy %arg0,%sp - b _restore_state - copy %arg1,%ret0 - .procend - - - -/* FIX, add support for singlestep - break trap_SingleStepBreakpoint,0 - break trap_SingleStepBreakpoint,0 -*/ - .export SingleStepTraps -SingleStepTraps: - -/* Missing !! NOT - there's a break 0,0 in the new version here!!! -*/ - -/* - * For an explanation of the magic involved in function-end - * breakpoints, see the implementation in ppc-assem.S. - */ - - .align 8 - .export fun_end_breakpoint_guts -fun_end_breakpoint_guts: - .word (((CODE_SIZE+1)&~1)< -#include -#include -#include "sbcl.h" -#include "./signal.h" -#include "os.h" -#include "arch.h" -#include "globals.h" -#include "interrupt.h" -#include "interr.h" -#include "lispregs.h" -#include -#include - -#include -#include -#include -#include -#include - -#include "validate.h" - -#ifdef LISP_FEATURE_SB_THREAD -#error "Define threading support functions" -#else -int arch_os_thread_init(struct thread *thread) { - return 1; /* success */ -} -int arch_os_thread_cleanup(struct thread *thread) { - return 1; /* success */ -} -#endif - -os_context_register_t * -os_context_register_addr(os_context_t *context, int offset) -{ - if (offset == 0) { - /* KLUDGE: I'm not sure, but it's possible that Linux puts the - contents of the Processor Status Word in the (wired-zero) - slot in the mcontext. In any case, the following is - unlikely to do any harm: */ - static int zero; - zero = 0; - return &zero; - } else { - return &context->uc_mcontext.sc_gr[offset]; - } -} - -os_context_register_t * -os_context_pc_addr(os_context_t *context) -{ - /* Why do I get all the silly ports? -- CSR, 2002-08-11 */ - return &context->uc_mcontext.sc_iaoq[0]; -} - -os_context_register_t * -os_context_npc_addr(os_context_t *context) -{ - return &context->uc_mcontext.sc_iaoq[1]; -} - -sigset_t * -os_context_sigmask_addr(os_context_t *context) -{ - return &context->uc_sigmask; -} - -void -os_restore_fp_control(os_context_t *context) -{ - /* FIXME: Probably do something. */ -} - -void -os_flush_icache(os_vm_address_t address, os_vm_size_t length) -{ - /* FIXME: Maybe this is OK. */ - sanctify_for_execution(address,length); -} diff --git a/src/runtime/hppa-linux-os.h b/src/runtime/hppa-linux-os.h deleted file mode 100644 index 447ed050a5..0000000000 --- a/src/runtime/hppa-linux-os.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _HPPA_LINUX_OS_H -#define _HPPA_LINUX_OS_H - -typedef struct ucontext_t os_context_t; -/* FIXME: This will change if the parisc-linux people implement - wide-sigcontext for 32-bit kernels */ -typedef unsigned long os_context_register_t; - -#include "arch-os-generic.inc" - -unsigned long os_context_fp_control(os_context_t *context); -void os_restore_fp_control(os_context_t *context); - -#define SC_REG(sc, n) (((unsigned long *)((sc)->sc_ap))[n]) -#define SC_PC(sc) ((sc)->sc_pcoqh) -#define SC_NPC(sc) ((sc)->sc_pcoqt) - -#endif /* _HPPA_LINUX_OS_H */ diff --git a/src/runtime/hppa-lispregs.h b/src/runtime/hppa-lispregs.h deleted file mode 100644 index c1821c457d..0000000000 --- a/src/runtime/hppa-lispregs.h +++ /dev/null @@ -1,40 +0,0 @@ -#define NREGS (32) - -#ifdef __ASSEMBLER__ -#define REG(num) num -#else -#define REG(num) num -#endif - -#define reg_ZERO REG(0) -#define reg_NFP REG(1) -#define reg_CFUNC REG(2) -#define reg_CSP REG(3) -#define reg_CFP REG(4) -#define reg_BSP REG(5) -#define reg_NULL REG(6) -#define reg_ALLOC REG(7) -#define reg_CODE REG(8) -#define reg_FDEFN REG(9) -#define reg_LEXENV REG(10) -#define reg_NARGS REG(11) -#define reg_OCFP REG(12) -#define reg_LRA REG(13) -#define reg_A0 REG(14) -#define reg_A1 REG(15) -#define reg_A2 REG(16) -#define reg_A3 REG(17) -#define reg_A4 REG(18) -#define reg_A5 REG(19) -#define reg_L0 REG(20) -#define reg_L1 REG(21) -#define reg_L2 REG(22) -#define reg_NL3 REG(23) -#define reg_NL2 REG(24) -#define reg_NL1 REG(25) -#define reg_NL0 REG(26) -#define reg_DP REG(27) -#define reg_NL4 REG(28) -#define reg_NL5 REG(29) -#define reg_NSP REG(30) -#define reg_LIP REG(31) diff --git a/tools-for-build/ldso-stubs.lisp b/tools-for-build/ldso-stubs.lisp deleted file mode 100644 index f4e14f41ca..0000000000 --- a/tools-for-build/ldso-stubs.lisp +++ /dev/null @@ -1,209 +0,0 @@ -;;;; Generate stubs for C-linkage library functions which we need to refer to -;;;; from Lisp. -;;;; -;;;; These stubs exist for the benefit of Lisp code that needs to refer -;;;; to foreign symbols when dlsym() is not available (i.e. when dumping -;;;; cold-sbcl.core, when we may be running in a host that's not SBCL, -;;;; or on platforms that don't have it at all). If the runtime is -;;;; dynamically linked, library functions won't be linked into it, so -;;;; the map file won't show them. So, we need a bunch of stubs that -;;;; nm(1) _can_ see. -;;;; -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -;;; This is an attempt to follow DB's hint of sbcl-devel -;;; 2001-09-18. -- CSR -;;; -(defun ldso-stubify (index fct stream) - (declare (ignorable index)) - #+hppa - (let ((stub (format nil "ldso_stub__~a" fct))) - (apply #'format stream (list -" .export ~A -~A: - .proc - .callinfo - b,n ~a - .procend - .import ~a,code~%" stub stub fct fct))) - - #-hppa - (format stream "LDSO_STUBIFY(~A)~%" fct)) - -(defvar *preludes* (list " -/* This is an automatically generated file, please do not hand-edit it. - * See the program tools-for-build/ldso-stubs.lisp. */ - -#ifndef __ASSEMBLER__ -#define __ASSEMBLER__ -#endif -#include \"sbcl.h\"" - -#+hppa " - .level 2.0 - .text" - -)) - -;;; Most of the #+- in here is just noise, but so is this whole file. -;;; So I don't really care to go through with a comb and remove the fluff. -(defvar *stubs* (append - '("_exit" - "accept" - "access" - "acos" - "acosh" - "asin" - "asinh" - "atanh" - "bind" - "chmod" - "chown" - "close" - "closedir" - "connect" - "cosh" - "creat" - "dup" - "dup2" - "execve" - "exit" - "fchmod" - "fchown" - "fcntl" - "fork" - "free" - "fstat" - #+inode64 "fstat$INODE64" - "fsync" - "ftruncate" - "getcwd" - "getdtablesize" - "getegid" - "getenv" - "getgid" - "gethostbyaddr" - "gethostbyname" - "gethostname" - "getitimer" - "getpeername" - "getpgrp" - "getpid" - "getppid" - "getrusage" - "getsockname" - "gettimeofday" - "getuid" - "hypot" - "ioctl" - "isatty" - "kill" - "killpg" - "link" - "listen" - "log1p" - "lseek" - "lstat" - #+inode64 "lstat$INODE64" - "malloc" - #+(or x86 x86-64) "memcmp" - "memmove" - "mkdir" - "nanosleep" - "open" - "opendir" - "pipe" - "poll" - "pow" - "read" - "readdir" - "readlink" - "realpath" - "recv" - "rename" - "rmdir" - "select" - "send" - "setitimer" - "setpgrp" - "setsid" - "sinh" - "socket" - "stat" - #+inode64 "stat$INODE64" - "strerror" - "strlen" - "symlink" - "sync" - "tanh" - "truncate" - "ttyname" - "unlink" - "utimes" - "waitpid" - "write") - ;; These aren't needed on the X86 because they're microcoded into the - ;; FPU, so the Lisp VOPs can implement them directly without having to - ;; call C code. - ;; - ;; Note: There might be some other functions in this category as well. - ;; E.g. I notice tanh() and acos() in the list above.. -- WHN 2001-06-07 - #-x86 - '("sin" - "cos" - "tan" - "atan" - "atan2" - "exp" - "log" - "log10" - "sqrt") - ;; FIXME: After 1.0 this should be made - ;; #-linkage-table, as we only need these stubs if - ;; we don't have linkage-table. Done this way now to - ;; cut down on the number of ports affected. - #-(or win32 darwin freebsd netbsd openbsd) - '("ptsname" - #-android "grantpt" - "unlockpt") - #+(or openbsd freebsd dragonfly) - '("openpty") - '("dlclose" - "dlerror" - "dlopen" - "dlsym") - #+bsd - '("sysctl") - #+darwin - '("sysctlbyname") - #+os-provides-dladdr - '("dladdr") - #-android - '("nl_langinfo" - "getpagesize" - "cfgetispeed" - "cfgetospeed" - "cfsetispeed" - "cfsetospeed" - "tcdrain" - "tcflow" - "tcflush" - "tcgetattr" - "tcsendbreak" - "tcsetattr"))) - -(with-open-file (f "src/runtime/ldso-stubs.S" :direction :output :if-exists :supersede) - (assert (= (length *preludes*) 2)) - (dolist (pre *preludes*) - (write-line pre f)) - (let ((i -1)) - (dolist (stub *stubs*) - (check-type stub string) - (ldso-stubify (incf i) stub f)))) From bf8167e6c64a4c9d1ea6139937f90ca7b794cb27 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 31 Aug 2020 19:54:44 -0400 Subject: [PATCH 0459/4023] Fix the NEWS file --- NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index bc43d4b676..c817e3ff32 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,8 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.0.8: - * incompatible change: DEC Alpha support has been removed. + * incompatible change: HPPA and DEC Alpha architecture + support has been removed. * minor incompatible change: the compiler signals a warning at compile-time when an initform of T, NIL or 0 does not match a STANDARD-CLASS slot's declared type. From 22d7ce133beab05443a51ac6cfe9aab1d5a33cc4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 31 Aug 2020 23:17:20 -0400 Subject: [PATCH 0460/4023] win32: remove linux futex shims, use native API Bypassing the emulation layer speeds up lisp mutexes by 2x or more and removes quite a bit of dubious code. WaitOnAddress has been present since Windows 8 (ca. 2012). Fallback to non-futex code if the OS is too old. --- src/code/target-thread.lisp | 12 +- src/cold/shared.lisp | 3 +- src/compiler/generic/objdef.lisp | 1 + src/runtime/Config.x86-64-win32 | 3 + src/runtime/Config.x86-win32 | 3 + src/runtime/pthreads_win32.c | 128 ------------------ src/runtime/pthreads_win32.h | 4 - src/runtime/win32-os.c | 31 +++++ tests/bug-1180102.impure.lisp | 21 ++- tools-for-build/grovel-features.sh | 14 ++ tools-for-build/os-provides-wakebyaddr-test.c | 7 + 11 files changed, 83 insertions(+), 144 deletions(-) create mode 100644 tools-for-build/os-provides-wakebyaddr-test.c diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 57ea5e15fb..b7c345f155 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -426,15 +426,13 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." #+sb-futex (progn (export 'futex-wake) ; for naughty users only - (declaim (inline futex-wait %futex-wait futex-wake)) - - (define-alien-routine ("futex_wait" %futex-wait) int - (word unsigned) (old-value #+linux (unsigned 32) #-linux unsigned) - (to-sec long) (to-usec unsigned-long)) + (declaim (inline futex-wait futex-wake)) (defun futex-wait (word old to-sec to-usec) - (with-interrupts - (%futex-wait word old to-sec to-usec))) + (with-alien ((%wait (function int unsigned (unsigned 32) long unsigned-long) + :extern "futex_wait")) + (with-interrupts + (alien-funcall %wait word old to-sec to-usec)))) (define-alien-routine "futex_wake" int (word unsigned) (n unsigned-long)))) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 254a7fba74..00fc436360 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -243,7 +243,8 @@ (gc (find-if (lambda (x) (member x '(:cheneygc :gencgc))) target-feature-list)) (arch (target-platform-keyword target-feature-list))) - (when (featurep '(:and :sb-thread (:or :linux :win32)) target-feature-list) + ;; Win32 conditionally adds :sb-futex in grovel-features.sh + (when (featurep '(:and :sb-thread :linux) target-feature-list) (pushnew :sb-futex target-feature-list)) (when (featurep '(:and :sb-thread (:not :win32)) target-feature-list) (push :pauseless-threadstart target-feature-list)) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index fb98b2e233..8cb0ed5ba3 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -582,6 +582,7 @@ during backtrace. #+win32 (carried-base-pointer :c-type "os_context_register_t") #+sb-safepoint (csp-around-foreign-call :c-type "lispobj *") #+win32 (synchronous-io-handle-and-flag :c-type "HANDLE" :length 1) + #+(and win32 sb-futex) (waiting-on-address :c-type "void*") #+(and sb-safepoint-strictly (not win32)) (sprof-alloc-region :c-type "struct alloc_region" :length 4) ;; If we need the header slots, but they can't precede this structure diff --git a/src/runtime/Config.x86-64-win32 b/src/runtime/Config.x86-64-win32 index f8e2c6caf5..485e233961 100644 --- a/src/runtime/Config.x86-64-win32 +++ b/src/runtime/Config.x86-64-win32 @@ -44,6 +44,9 @@ OS_LIBS = -l ws2_32 -ladvapi32 ifdef LISP_FEATURE_SB_CORE_COMPRESSION OS_LIBS += -lz endif +ifdef LISP_FEATURE_SB_FUTEX + OS_LIBS += -lSynchronization +endif ifdef LISP_FEATURE_IMMOBILE_SPACE GC_SRC = fullcgc.c gencgc.c traceroot.c immobile-space.c diff --git a/src/runtime/Config.x86-win32 b/src/runtime/Config.x86-win32 index b9a81d7953..37efac6637 100644 --- a/src/runtime/Config.x86-win32 +++ b/src/runtime/Config.x86-win32 @@ -42,6 +42,9 @@ OS_LIBS = -l ws2_32 -ladvapi32 ifdef LISP_FEATURE_SB_CORE_COMPRESSION OS_LIBS += -lz endif +ifdef LISP_FEATURE_SB_FUTEX + OS_LIBS += -lSynchronization +endif GC_SRC = fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index eea45392e8..62831a4a59 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -223,8 +223,6 @@ void pthread_np_add_pending_signal(pthread_t thread, int signum) asm("lock orl %1,%0":"=m"(thread->pending_signal_set):"r"(to_add)); } -static void futex_interrupt(pthread_t thread); - /* This pthread_kill doesn't do anything to notify target pthread of a * new pending signal. * @@ -234,7 +232,6 @@ static void futex_interrupt(pthread_t thread); int pthread_kill(pthread_t thread, int signum) { pthread_np_add_pending_signal(thread,signum); - futex_interrupt(thread); return 0; } @@ -718,15 +715,12 @@ void pthread_unlock_structures() pthread_mutex_unlock(&mutex_init_lock); } -static pthread_cond_t futex_pseudo_cond; - void pthreads_win32_init() { thread_self_tls_index = TlsAlloc(); pthread_mutex_init(&mutex_init_lock, NULL); pthread_np_notice_thread(); - pthread_cond_init(&futex_pseudo_cond, NULL); } static @@ -802,128 +796,6 @@ int sigpending(sigset_t *set) return 0; } - -#define FUTEX_EWOULDBLOCK 3 -#define FUTEX_EINTR 2 -#define FUTEX_ETIMEDOUT 1 - -int -futex_wait(volatile intptr_t *lock_word, intptr_t oldval, long sec, unsigned long usec) -{ - struct thread_wakeup w; - pthread_t self = pthread_self(); - DWORD msec = sec<0 ? INFINITE : (sec*1000 + usec/1000); - DWORD wfso; - int result; - sigset_t pendset; - int maybeINTR; - int info = sec<0 ? WAKEUP_WAITING_NOTIMEOUT: WAKEUP_WAITING_TIMEOUT; - - sigpending(&pendset); - if (pendset & ~self->blocked_signal_set) - return FUTEX_EINTR; - w.uaddr = lock_word; - w.uval = oldval; - w.info = info; - - if (cv_wakeup_add(&futex_pseudo_cond,&w)) { - return FUTEX_EWOULDBLOCK; - } - self->futex_wakeup = &w; - do { - wfso = WaitForSingleObject(w.event, msec); - } while (wfso == WAIT_OBJECT_0 && w.info == info); - self->futex_wakeup = NULL; - sigpending(&pendset); - maybeINTR = (pendset & ~self->blocked_signal_set)? FUTEX_EINTR : 0; - - switch(wfso) { - case WAIT_TIMEOUT: - if (!cv_wakeup_remove(&futex_pseudo_cond,&w)) { - /* timeout, but someone other removed wakeup. */ - result = maybeINTR; - WaitForSingleObject(w.event,INFINITE); - } else { - result = FUTEX_ETIMEDOUT; - } - break; - case WAIT_OBJECT_0: - result = maybeINTR; - break; - default: - result = -1; - break; - } - futex_pseudo_cond.return_fn(w.event); - return result; -} - -int -futex_wake(volatile intptr_t *lock_word, int n) -{ - pthread_cond_t *cv = &futex_pseudo_cond; - struct thread_wakeup *w, *prev; - HANDLE postponed[128]; - int npostponed = 0,i; - - if (n==0) return 0; - - pthread_mutex_lock(&cv->wakeup_lock); - for (w = cv->first_wakeup, prev = NULL; w && n;) { - if (w->uaddr == lock_word) { - HANDLE event = w->event; - w->info = WAKEUP_HAPPENED; - if (cv->last_wakeup == w) - cv->last_wakeup = prev; - w = w->next; - if (!prev) { - cv->first_wakeup = w; - } else { - prev->next = w; - } - n--; - postponed[npostponed++] = event; - if (npostponed == sizeof(postponed)/sizeof(postponed[0])) { - for (i=0; inext; - } - } - pthread_mutex_unlock(&cv->wakeup_lock); - for (i=0; ifutex_wakeup) { - pthread_cond_t *cv = &futex_pseudo_cond; - struct thread_wakeup *w; - HANDLE event; - pthread_mutex_lock(&cv->wakeup_lock); - if ((w = thread->futex_wakeup)) { - /* we are taking wakeup_lock recursively - ok with - CRITICAL_SECTIONs */ - if (cv_wakeup_remove(&futex_pseudo_cond,w)) { - event = w->event; - w->info = WAKEUP_BY_INTERRUPT; - thread->futex_wakeup = NULL; - } else { - w = NULL; - } - } - if (w) { - SetEvent(event); - } - pthread_mutex_unlock(&cv->wakeup_lock); - } -} - void pthread_np_lose(int trace_depth, const char* fmt, ...) { va_list header; diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index abea6067c1..5d3b80af48 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -219,10 +219,6 @@ int sigismember(const sigset_t *set, int signum); typedef int sig_atomic_t; -/* Futexes */ -int futex_wait(volatile intptr_t *lock_word, intptr_t oldval, long sec, unsigned long usec); -int futex_wake(volatile intptr_t *lock_word, int n); - /* Debugging */ void pthread_np_lose(int trace_depth, const char* fmt, ...); extern struct _pthread_mutex_info DEAD_MUTEX; diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 0c1af9bb29..be68d1a863 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -1826,6 +1826,10 @@ win32_maybe_interrupt_io(void* thread) struct thread *th = thread; boolean done = 0; +#ifdef LISP_FEATURE_SB_FUTEX + if (th->waiting_on_address) WakeByAddressAll(th->waiting_on_address); +#endif + if (ptr_CancelIoEx) { pthread_mutex_lock(&interrupt_io_lock); HANDLE h = (HANDLE) @@ -2166,4 +2170,31 @@ os_cancel_wtimer(HANDLE handle) } #endif +#ifdef LISP_FEATURE_SB_FUTEX +int +futex_wait(int *lock_word, int oldval, long sec, unsigned long usec) +{ + DWORD timeout = sec < 0 ? INFINITE : (sec * 1000) + (usec / 1000); + struct thread* th = arch_os_get_current_thread(); + th->waiting_on_address = lock_word; + int result = WaitOnAddress(lock_word, &oldval, 4, timeout); + th->waiting_on_address = 0; + if (result) + return 0; + if (GetLastError() == ERROR_TIMEOUT) + return 1; + return 0; +} + +int +futex_wake(PVOID lock_word, int n) +{ + if (n == 1) + WakeByAddressSingle(lock_word); + else + WakeByAddressAll(lock_word); + return 0; +} +#endif + /* EOF */ diff --git a/tests/bug-1180102.impure.lisp b/tests/bug-1180102.impure.lisp index 2a87a65833..b879694123 100644 --- a/tests/bug-1180102.impure.lisp +++ b/tests/bug-1180102.impure.lisp @@ -7,17 +7,30 @@ ;; thread already owned SB-THREAD:*MAKE-THREAD-LOCK* and the ;; interrupting code thus made a recursive lock attempt. +;; This test runs excruciatingly slowly on win32 without futexes. +;; Using n-threads = 100 with sb-futex, each trial took between .1 and .2 +;; seconds, so 200 trials took ~ 30 seconds. +;; Without sb-futex and that same number of threads, each trial took +;; between 1.5 and 2.5 seconds which would be 400 seconds total. +(defparameter *test-params* (or #+(and win32 (not sb-futex)) '(10 . 20) + '(100 . 100))) + (with-test (:name (:timer :dispatch-thread :make-thread :bug-1180102) :skipped-on (not :sb-thread)) (flet ((test (thread) (let ((timer (make-timer (lambda ()) :thread thread))) (schedule-timer timer .01 :repeat-interval 0.1) - (dotimes (i 100) - (let ((threads '())) - (dotimes (i 100) + (dotimes (i (car *test-params*)) + (let ((threads '()) + (start (get-internal-real-time))) + (declare (ignorable start)) + (dotimes (i (cdr *test-params*)) (push (sb-thread:make-thread (lambda () (sleep .01))) threads)) - (mapc #'sb-thread:join-thread threads))) + (mapc #'sb-thread:join-thread threads) + #+nil (format t "Trial ~d: ~f sec~%" i + (/ (- (get-internal-real-time) start) + internal-time-units-per-second)))) (unschedule-timer timer)))) (test t) (test sb-thread:*current-thread*))) diff --git a/tools-for-build/grovel-features.sh b/tools-for-build/grovel-features.sh index 7410fc0cb3..1727e35dbb 100644 --- a/tools-for-build/grovel-features.sh +++ b/tools-for-build/grovel-features.sh @@ -17,6 +17,20 @@ featurep() { rm -f $bin } +# Adding a nonexistent link library to Config.*-win32 will fail, +# so this needs its own recipe to detect the library. +if [ "$sbcl_os" = win32 ] ; then + bin=os-provides-wakebyaddr-test + rm -f $bin + # pass -f /dev/null to use only builtin Make recipes + LOADLIBES=-lSynchronization $GNUMAKE -f /dev/null $bin > /dev/null 2>&1 + if [ "$?" -eq 0 ] + then + printf " :sb-futex" + fi + rm -f $bin +fi + # KLUDGE: ppc/darwin dlopen is special cased in make-config.sh, as # we fake it with a shim. featurep os-provides-dlopen diff --git a/tools-for-build/os-provides-wakebyaddr-test.c b/tools-for-build/os-provides-wakebyaddr-test.c new file mode 100644 index 0000000000..b318498f7f --- /dev/null +++ b/tools-for-build/os-provides-wakebyaddr-test.c @@ -0,0 +1,7 @@ +#include + +int main() +{ + WakeByAddressAll((void*)&main); + return 104; +} From 6d8f7f85f97b0013b1148f013cd3a0bceb30a89e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 1 Sep 2020 04:33:40 -0400 Subject: [PATCH 0461/4023] win32: use native synchronization primitives No need for indirection via the emulated pthread mutex for global mutexes. Same for condition variables. All the resulting dead code will be ripped out next. --- src/runtime/alloc.c | 10 +++-- src/runtime/gencgc.c | 14 ++++-- src/runtime/pthreads_win32.c | 76 +++++++++++++-------------------- src/runtime/pthreads_win32.h | 2 +- src/runtime/runtime.h | 9 +++- src/runtime/safepoint.c | 70 +++++++++++++++--------------- src/runtime/thread.c | 55 +++++++++++++++--------- src/runtime/thread.h | 5 ++- src/runtime/win32-os.c | 83 +++++++++++++++++++----------------- src/runtime/x86-64-arch.c | 4 ++ 10 files changed, 177 insertions(+), 151 deletions(-) diff --git a/src/runtime/alloc.c b/src/runtime/alloc.c index 56591a3689..6440acea77 100644 --- a/src/runtime/alloc.c +++ b/src/runtime/alloc.c @@ -30,9 +30,13 @@ boolean alloc_profiling; // enabled flag #ifdef LISP_FEATURE_GENCGC #ifdef LISP_FEATURE_SB_THREAD /* This lock is used to protect non-thread-local allocation. */ -static pthread_mutex_t allocation_lock = PTHREAD_MUTEX_INITIALIZER; +#ifdef LISP_FEATURE_WIN32 +CRITICAL_SECTION code_allocator_lock, alloc_profiler_lock; +#else +static pthread_mutex_t code_allocator_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t alloc_profiler_lock = PTHREAD_MUTEX_INITIALIZER; #endif +#endif lispobj alloc_code_object (unsigned total_words) { struct thread *th = arch_os_get_current_thread(); @@ -51,12 +55,12 @@ lispobj alloc_code_object (unsigned total_words) /* Allocations of code are all serialized. We might also acquire * free_pages_lock depending on availability of space in the region */ - int result = thread_mutex_lock(&allocation_lock); + int result = thread_mutex_lock(&code_allocator_lock); gc_assert(!result); struct code *code = (struct code *) lisp_alloc(&gc_alloc_region[CODE_PAGE_TYPE-1], total_words*N_WORD_BYTES, CODE_PAGE_TYPE, th); - result = thread_mutex_unlock(&allocation_lock); + result = thread_mutex_unlock(&code_allocator_lock); gc_assert(!result); code->header = ((uword_t)total_words << CODE_HEADER_SIZE_SHIFT) | CODE_HEADER_WIDETAG; diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index c1c984808f..930d97a6fc 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -29,7 +29,7 @@ #include #include "sbcl.h" #if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD) -#include "pthreads_win32.h" +// #else #include #endif @@ -350,8 +350,12 @@ page_index_t next_free_page; // upper (exclusive) bound on used page range * >1 thread at a time and must be thread-safe. This lock must be * seized before all accesses to generations[] or to parts of * page_table[] that other threads may want to see */ +#ifdef LISP_FEATURE_WIN32 +static CRITICAL_SECTION free_pages_lock; +#else static pthread_mutex_t free_pages_lock = PTHREAD_MUTEX_INITIALIZER; #endif +#endif extern os_vm_size_t gencgc_release_granularity; os_vm_size_t gencgc_release_granularity = GENCGC_RELEASE_GRANULARITY; @@ -3213,7 +3217,6 @@ preserve_context_registers (void __attribute__((unused)) (*proc)(os_context_regi os_context_t __attribute__((unused)) *c) { #ifdef LISP_FEATURE_SB_THREAD - void **ptr; /* On Darwin the signal context isn't a contiguous block of memory, * so just preserve_pointering its contents won't be sufficient. */ @@ -3247,6 +3250,7 @@ preserve_context_registers (void __attribute__((unused)) (*proc)(os_context_regi #endif #endif #if !defined(LISP_FEATURE_WIN32) + void **ptr; for(ptr = ((void **)(c+1))-1; ptr>=(void **)c; ptr--) { proc((os_context_register_t)*ptr); } @@ -4017,8 +4021,12 @@ collect_garbage(generation_index_t last_gen) void gc_init(void) { +#ifdef LISP_FEATURE_WIN32 + InitializeCriticalSection(&free_pages_lock); +#endif #if defined(LISP_FEATURE_SB_SAFEPOINT) - alloc_gc_page(); + extern void safepoint_init(void); + safepoint_init(); #endif // Verify that foo_BIT constants agree with the C compiler's bit packing // and that we can compute the correct adddress of the bitfields. diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index 62831a4a59..c189dd57e9 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -32,24 +32,20 @@ struct freelist_cell { struct freelist { void* (*create_fn)(); - pthread_mutex_t lock; + CRITICAL_SECTION lock; struct freelist_cell * empty; struct freelist_cell * full; unsigned int count; }; -#define FREELIST_INITIALIZER(create_fn) \ - { \ - event_create, PTHREAD_MUTEX_INITIALIZER, \ - NULL, NULL, 0 \ - } \ - +#define mutex_lock(x) EnterCriticalSection(x) +#define mutex_unlock(x) LeaveCriticalSection(x) static void* freelist_get(struct freelist *fl) { void* result = NULL; if (fl->full) { - pthread_mutex_lock(&fl->lock); + mutex_lock(&fl->lock); if (fl->full) { struct freelist_cell *cell = fl->full; fl->full = cell->next; @@ -57,7 +53,7 @@ static void* freelist_get(struct freelist *fl) cell->next = fl->empty; fl->empty = cell; } - pthread_mutex_unlock(&fl->lock); + mutex_unlock(&fl->lock); } if (!result) { result = fl->create_fn(); @@ -69,13 +65,13 @@ static void freelist_return(struct freelist *fl, void*data) { struct freelist_cell* cell = NULL; if (fl->empty) { - pthread_mutex_lock(&fl->lock); + mutex_lock(&fl->lock); if (fl->empty) { cell = fl->empty; fl->empty = cell->next; goto add_locked; } - pthread_mutex_unlock(&fl->lock); + mutex_unlock(&fl->lock); } if (!cell) { int i,n=32; @@ -85,13 +81,13 @@ static void freelist_return(struct freelist *fl, void*data) cell[i].next = NULL; } - pthread_mutex_lock(&fl->lock); + mutex_lock(&fl->lock); ++fl->count; add_locked: cell->data = data; cell->next = fl->full; fl->full = cell; - pthread_mutex_unlock(&fl->lock); + mutex_unlock(&fl->lock); } typedef unsigned char boolean; @@ -172,7 +168,7 @@ int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset) return 0; } -pthread_mutex_t mutex_init_lock; +static CRITICAL_SECTION mutex_init_lock; int pthread_mutex_init(pthread_mutex_t * mutex, const pthread_mutexattr_t * attr) { @@ -257,11 +253,11 @@ int pthread_mutex_lock(pthread_mutex_t *mutex) { pthread_np_assert_live_mutex(mutex,"lock"); if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - pthread_mutex_lock(&mutex_init_lock); + mutex_lock(&mutex_init_lock); if (*mutex == PTHREAD_MUTEX_INITIALIZER) { pthread_mutex_init(mutex, NULL); } - pthread_mutex_unlock(&mutex_init_lock); + mutex_unlock(&mutex_init_lock); } EnterCriticalSection(&(*mutex)->cs); DEBUG_OWN(*mutex); @@ -272,11 +268,11 @@ int pthread_mutex_trylock(pthread_mutex_t *mutex) { pthread_np_assert_live_mutex(mutex,"trylock"); if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - pthread_mutex_lock(&mutex_init_lock); + mutex_lock(&mutex_init_lock); if (*mutex == PTHREAD_MUTEX_INITIALIZER) { pthread_mutex_init(mutex, NULL); } - pthread_mutex_unlock(&mutex_init_lock); + mutex_unlock(&mutex_init_lock); } if (TryEnterCriticalSection(&(*mutex)->cs)) { DEBUG_OWN(*mutex); @@ -294,14 +290,14 @@ int pthread_mutex_lock_annotate_np(pthread_mutex_t *mutex, const char* file, int int contention = 0; pthread_np_assert_live_mutex(mutex,"lock"); if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - pthread_mutex_lock(&mutex_init_lock); + mutex_lock(&mutex_init_lock); if (*mutex == PTHREAD_MUTEX_INITIALIZER) { pthread_mutex_init(mutex, NULL); pthshow("Mutex #x%p: automatic initialization; #x%p %s +%d", mutex, *mutex, file, line); } - pthread_mutex_unlock(&mutex_init_lock); + mutex_unlock(&mutex_init_lock); } if ((*mutex)->owner) { pthshow("Mutex #x%p -> #x%p: contention; owned by #x%p, wanted by #x%p", @@ -334,11 +330,11 @@ int pthread_mutex_trylock_annotate_np(pthread_mutex_t *mutex, const char* file, int contention = 0; pthread_np_assert_live_mutex(mutex,"trylock"); if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - pthread_mutex_lock(&mutex_init_lock); + mutex_lock(&mutex_init_lock); if (*mutex == PTHREAD_MUTEX_INITIALIZER) { pthread_mutex_init(mutex, NULL); } - pthread_mutex_unlock(&mutex_init_lock); + mutex_unlock(&mutex_init_lock); } if ((*mutex)->owner) { pthshow("Mutex #x%p -> #x%p: tried contention; owned by #x%p, wanted by #x%p", @@ -398,7 +394,7 @@ static void* event_create() return (void*)CreateEvent(NULL,FALSE,FALSE,NULL); } -static struct freelist event_freelist = FREELIST_INITIALIZER(event_create); +static struct freelist event_freelist; unsigned int pthread_free_event_pool_size() @@ -454,7 +450,7 @@ int pthread_cond_init(pthread_cond_t * cv, const pthread_condattr_t * attr) { if (!attr) attr = &cv_default_attr; - pthread_mutex_init(&cv->wakeup_lock, NULL); + InitializeCriticalSection(&cv->wakeup_lock); cv->first_wakeup = NULL; cv->last_wakeup = NULL; cv->alertable = attr->alertable; @@ -483,7 +479,6 @@ int pthread_condattr_setevent_np(pthread_condattr_t *attr, int pthread_cond_destroy(pthread_cond_t *cv) { - pthread_mutex_destroy(&cv->wakeup_lock); return 0; } @@ -498,7 +493,7 @@ int pthread_cond_broadcast(pthread_cond_t *cv) mutex unlock around waiting. */ if (!cv->first_wakeup) return 0; - pthread_mutex_lock(&cv->wakeup_lock); + mutex_lock(&cv->wakeup_lock); while (cv->first_wakeup) { struct thread_wakeup * w = cv->first_wakeup; @@ -515,7 +510,7 @@ int pthread_cond_broadcast(pthread_cond_t *cv) ++count; } cv->last_wakeup = NULL; - pthread_mutex_unlock(&cv->wakeup_lock); + mutex_unlock(&cv->wakeup_lock); for (i=0; ifirst_wakeup) return 0; - pthread_mutex_lock(&cv->wakeup_lock); + mutex_lock(&cv->wakeup_lock); w = cv->first_wakeup; if (w) { HANDLE waitevent = w->event; @@ -538,7 +533,7 @@ int pthread_cond_signal(pthread_cond_t *cv) w->info = WAKEUP_HAPPENED; SetEvent(waitevent); } - pthread_mutex_unlock(&cv->wakeup_lock); + mutex_unlock(&cv->wakeup_lock); return 0; } @@ -547,10 +542,10 @@ int cv_wakeup_add(struct pthread_cond_t* cv, struct thread_wakeup* w) { HANDLE event; w->next = NULL; - pthread_mutex_lock(&cv->wakeup_lock); + mutex_lock(&cv->wakeup_lock); if (w->uaddr) { if (w->uval != *w->uaddr) { - pthread_mutex_unlock(&cv->wakeup_lock); + mutex_unlock(&cv->wakeup_lock); return 1; } pthread_self()->futex_wakeup = w; @@ -572,7 +567,7 @@ int cv_wakeup_add(struct pthread_cond_t* cv, struct thread_wakeup* w) cv->first_wakeup = w; cv->last_wakeup = w; } - pthread_mutex_unlock(&cv->wakeup_lock); + mutex_unlock(&cv->wakeup_lock); return 0; } @@ -582,7 +577,7 @@ int cv_wakeup_remove(struct pthread_cond_t* cv, struct thread_wakeup* w) int result = 0; if (w->info == WAKEUP_HAPPENED || w->info == WAKEUP_BY_INTERRUPT) goto finish; - pthread_mutex_lock(&cv->wakeup_lock); + mutex_lock(&cv->wakeup_lock); { if (w->info == WAKEUP_HAPPENED || w->info == WAKEUP_BY_INTERRUPT) goto unlock; @@ -605,7 +600,7 @@ int cv_wakeup_remove(struct pthread_cond_t* cv, struct thread_wakeup* w) } } unlock: - pthread_mutex_unlock(&cv->wakeup_lock); + mutex_unlock(&cv->wakeup_lock); finish: return result; } @@ -705,21 +700,10 @@ int sched_yield() return 0; } -void pthread_lock_structures() -{ - pthread_mutex_lock(&mutex_init_lock); -} - -void pthread_unlock_structures() -{ - pthread_mutex_unlock(&mutex_init_lock); -} - void pthreads_win32_init() { - thread_self_tls_index = TlsAlloc(); - pthread_mutex_init(&mutex_init_lock, NULL); + InitializeCriticalSection(&mutex_init_lock); pthread_np_notice_thread(); } diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index 5d3b80af48..c4efa8b9da 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -123,7 +123,7 @@ typedef HANDLE (*cv_event_get_fn)(); typedef void (*cv_event_return_fn)(HANDLE event); typedef struct pthread_cond_t { - pthread_mutex_t wakeup_lock; + CRITICAL_SECTION wakeup_lock; struct thread_wakeup *first_wakeup; struct thread_wakeup *last_wakeup; unsigned char alertable; diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 281d826f91..9b5ecc6d86 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -34,12 +34,17 @@ #ifdef LISP_FEATURE_WIN32 #define thread_sigmask _sbcl_pthread_sigmask +// wrap CriticalSection operators in a function returning 0 to satisfy assertions +static inline int cs_mutex_lock(void* l) { EnterCriticalSection(l); return 0; } +static inline int cs_mutex_unlock(void* l) { LeaveCriticalSection(l); return 0; } +#define thread_mutex_lock(l) cs_mutex_lock(l) +#define thread_mutex_unlock(l) cs_mutex_unlock(l) #else #define thread_sigmask pthread_sigmask -#endif - #define thread_mutex_lock(l) pthread_mutex_lock(l) #define thread_mutex_unlock(l) pthread_mutex_unlock(l) +#endif + #else #define thread_self() 0 #define thread_equal(a,b) ((a)==(b)) diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 8515c1498d..768d268dcd 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -106,8 +106,8 @@ const char* gc_phase_names[GC_NPHASES] = { #define SET_THREAD_STOP_PENDING(th,state) \ write_TLS(STOP_FOR_GC_PENDING,state,th) #define WITH_ALL_THREADS_LOCK \ - pthread_mutex_lock(&all_threads_lock); \ - RUN_BODY_ONCE(all_threads_lock, pthread_mutex_unlock(&all_threads_lock)) + thread_mutex_lock(&all_threads_lock); \ + RUN_BODY_ONCE(all_threads_lock, thread_mutex_unlock(&all_threads_lock)) #else #define CURRENT_THREAD_VAR(name) #define THREAD_STOP_PENDING(th) NIL @@ -119,12 +119,6 @@ const char* gc_phase_names[GC_NPHASES] = { /* win32-os.c covers these, but there is no unixlike-os.c, so the normal * definition goes here. Fixme: (Why) don't these work for Windows? */ -void -alloc_gc_page() -{ - os_validate(NOT_MOVABLE, GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES); -} - void map_gc_page() { @@ -142,15 +136,14 @@ unmap_gc_page() } #endif /* !LISP_FEATURE_WIN32 */ -struct gc_state { -#ifdef LISP_FEATURE_SB_THREAD - /* Flag: conditions are initialized */ - boolean initialized; - +static struct gc_state { +#ifdef LISP_FEATURE_WIN32 /* Per-process lock for gc_state */ - pthread_mutex_t lock; - + CRITICAL_SECTION lock;; /* Conditions: one per phase */ + CONDITION_VARIABLE phase_cond[GC_NPHASES]; +#else + pthread_mutex_t lock; pthread_cond_t phase_cond[GC_NPHASES]; #endif @@ -164,21 +157,32 @@ struct gc_state { /* Current GC phase */ gc_phase_t phase; -}; +} gc_state; -static struct gc_state gc_state = { -#ifdef LISP_FEATURE_SB_THREAD - .lock = PTHREAD_MUTEX_INITIALIZER, +void safepoint_init() +{ + int i; +# ifdef LISP_FEATURE_WIN32 + extern void alloc_gc_page(void); + alloc_gc_page(); + for (i=GC_NONE; i GC_QUIET))) { -#ifdef LISP_FEATURE_SB_THREAD +#ifdef LISP_FEATURE_WIN32 + SleepConditionVariableCS(&gc_state.phase_cond[phase], &gc_state.lock, INFINITE); +#elif defined LISP_FEATURE_SB_THREAD pthread_cond_wait(&gc_state.phase_cond[phase],&gc_state.lock); #else lose("gc_state_wait() blocks, but we're #-SB-THREAD"); @@ -456,7 +454,9 @@ static inline void gc_advance(gc_phase_t cur, gc_phase_t old) { gc_state.phase = gc_phase_next(gc_state.phase); odxprint(safepoints,"no blockers, direct advance to %d (%s)",gc_state.phase,gc_phase_names[gc_state.phase]); gc_handle_phase(); -#ifdef LISP_FEATURE_SB_THREAD +#ifdef LISP_FEATURE_WIN32 + WakeAllConditionVariable(&gc_state.phase_cond[gc_state.phase]); +#elif defined LISP_FEATURE_SB_THREAD pthread_cond_broadcast(&gc_state.phase_cond[gc_state.phase]); #endif } @@ -936,7 +936,7 @@ wake_thread_win32(struct thread *thread) return; wake_thread_io(thread); - pthread_mutex_unlock(&all_threads_lock); + thread_mutex_unlock(&all_threads_lock); WITH_GC_STATE_LOCK { if (gc_state.phase == GC_NONE) { @@ -945,7 +945,7 @@ wake_thread_win32(struct thread *thread) } } - pthread_mutex_lock(&all_threads_lock); + thread_mutex_lock(&all_threads_lock); return; } # else diff --git a/src/runtime/thread.c b/src/runtime/thread.c index dab704d0db..fd3776f31f 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -65,13 +65,21 @@ os_vm_size_t thread_alien_stack_size = ALIEN_STACK_SIZE; struct thread *all_threads; #ifdef LISP_FEATURE_SB_THREAD -pthread_mutex_t all_threads_lock = PTHREAD_MUTEX_INITIALIZER; #ifdef LISP_FEATURE_GCC_TLS __thread struct thread *current_thread; #elif !defined LISP_FEATURE_WIN32 pthread_key_t specials = 0; #endif + +#ifdef LISP_FEATURE_WIN32 +CRITICAL_SECTION all_threads_lock; +static CRITICAL_SECTION recyclebin_lock; +#else +pthread_mutex_t all_threads_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t recyclebin_lock = PTHREAD_MUTEX_INITIALIZER; +#endif + #endif #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) @@ -236,6 +244,10 @@ void* get_current_vm_thread() { #endif void create_main_lisp_thread(lispobj function) { +#ifdef LISP_FEATURE_WIN32 + InitializeCriticalSection(&all_threads_lock); + InitializeCriticalSection(&recyclebin_lock); +#endif struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER_WIDETAG); if (!th || arch_os_thread_init(th)==0 || !init_shared_attr_object()) lose("can't create initial thread"); @@ -329,11 +341,11 @@ init_new_thread(struct thread *th, #ifdef LISP_FEATURE_SB_SAFEPOINT *th->csp_around_foreign_call = (lispobj)scribble; #endif - lock_ret = pthread_mutex_lock(&all_threads_lock); + lock_ret = thread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); link_thread(th); if (!retain_all_threads_lock) { - lock_ret = pthread_mutex_unlock(&all_threads_lock); + lock_ret = thread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); } @@ -365,10 +377,10 @@ unregister_thread(struct thread *th, ensure_region_closed(&th->sprof_alloc_region, BOXED_PAGE_FLAG); #endif pop_gcing_safety(&scribble->safety); - lock_ret = pthread_mutex_lock(&all_threads_lock); + lock_ret = thread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); unlink_thread(th); - lock_ret = pthread_mutex_unlock(&all_threads_lock); + lock_ret = thread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); #else @@ -383,7 +395,7 @@ unregister_thread(struct thread *th, * thread, but since we are either exiting lisp code as a lisp * thread that is dying, or exiting lisp code to return to * former status as a C thread, it won't wait long. */ - lock_ret = pthread_mutex_lock(&all_threads_lock); + lock_ret = thread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); /* FIXME: this nests the free_pages_lock inside the all_threads_lock. @@ -394,7 +406,7 @@ unregister_thread(struct thread *th, ensure_region_closed(&th->sprof_alloc_region, BOXED_PAGE_FLAG); #endif unlink_thread(th); - pthread_mutex_unlock(&all_threads_lock); + thread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); #endif @@ -560,36 +572,39 @@ void* new_thread_trampoline_switch_stack(void* th) { #endif static struct thread* recyclebin_threads; -static pthread_mutex_t recyclebin_lock = PTHREAD_MUTEX_INITIALIZER; static struct thread* get_recyclebin_item() { struct thread* result = 0; int rc; - rc = pthread_mutex_lock(&recyclebin_lock); + rc = thread_mutex_lock(&recyclebin_lock); gc_assert(!rc); if (recyclebin_threads) { result = recyclebin_threads; recyclebin_threads = result->next; } - pthread_mutex_unlock(&recyclebin_lock); + thread_mutex_unlock(&recyclebin_lock); return result ? result->os_address : 0; } static void put_recyclebin_item(struct thread* th) { int rc; - rc = pthread_mutex_lock(&recyclebin_lock); + rc = thread_mutex_lock(&recyclebin_lock); gc_assert(!rc); th->next = recyclebin_threads; recyclebin_threads = th; - pthread_mutex_unlock(&recyclebin_lock); + thread_mutex_unlock(&recyclebin_lock); } void empty_thread_recyclebin() { if (!recyclebin_threads) return; sigset_t old; block_deferrable_signals(&old); - int rc = pthread_mutex_trylock(&recyclebin_lock); - if (!rc) { // no big deal if already locked (recursive GC?) + // no big deal if already locked (recursive GC?) +#ifdef LISP_FEATURE_WIN32 + if (TryEnterCriticalSection(&recyclebin_lock)) { +#else + if (!pthread_mutex_trylock(&recyclebin_lock)) { +#endif struct thread* this = recyclebin_threads; while (this) { struct thread* next = this->next; @@ -597,7 +612,7 @@ void empty_thread_recyclebin() this = next; } recyclebin_threads = 0; - pthread_mutex_unlock(&recyclebin_lock); + thread_mutex_unlock(&recyclebin_lock); } thread_sigmask(SIG_SETMASK, &old, 0); } @@ -764,7 +779,7 @@ callback_wrapper_trampoline( // Balance out the mutex_lock in attach_os_thread() void release_all_threads_lock() { - if (pthread_mutex_unlock(&all_threads_lock)) + if (thread_mutex_unlock(&all_threads_lock)) lose("ENTER-FOREIGN-CALLBACK bug"); } @@ -1097,7 +1112,7 @@ void gc_stop_the_world() FSHOW_SIGNAL((stderr,"/gc_stop_the_world:waiting on lock\n")); /* Keep threads from registering with GC while the world is stopped. */ - lock_ret = pthread_mutex_lock(&all_threads_lock); + lock_ret = thread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); FSHOW_SIGNAL((stderr,"/gc_stop_the_world:got lock\n")); @@ -1162,7 +1177,7 @@ void gc_start_the_world() } } - lock_ret = pthread_mutex_unlock(&all_threads_lock); + lock_ret = thread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); FSHOW_SIGNAL((stderr,"/gc_start_the_world:end\n")); @@ -1251,7 +1266,7 @@ kill_safely(os_thread_t os_thread, int signal) /* pthread_kill is not async signal safe and we don't want to be * interrupted while holding the lock. */ block_deferrable_signals(&oldset); - pthread_mutex_lock(&all_threads_lock); + thread_mutex_lock(&all_threads_lock); for (thread = all_threads; thread; thread = thread->next) { if (thread->os_thread == os_thread) { int status = pthread_kill(os_thread, signal); @@ -1263,7 +1278,7 @@ kill_safely(os_thread_t os_thread, int signal) break; } } - pthread_mutex_unlock(&all_threads_lock); + thread_mutex_unlock(&all_threads_lock); thread_sigmask(SIG_SETMASK,&oldset,0); if (thread) return 0; diff --git a/src/runtime/thread.h b/src/runtime/thread.h index a1494d4e32..c68bca2116 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -41,7 +41,6 @@ struct gcing_safety { int handle_safepoint_violation(os_context_t *context, os_vm_address_t addr); void** os_get_csp(struct thread* th); -void alloc_gc_page(); void assert_on_stack(struct thread *th, void *esp); #endif /* defined(LISP_FEATURE_SB_SAFEPOINT) */ @@ -384,7 +383,9 @@ void signal_handler_callback(lispobj, int, void *, void *); extern void create_main_lisp_thread(lispobj); -#ifdef LISP_FEATURE_SB_THREAD +#ifdef LISP_FEATURE_WIN32 +extern CRITICAL_SECTION all_threads_lock; +#elif defined LISP_FEATURE_SB_THREAD extern pthread_mutex_t all_threads_lock; #endif diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index be68d1a863..8e7f87f7fa 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -640,8 +640,27 @@ void* os_dlsym_default(char* name) started before _any_ TLS slot is allocated by libraries, and some C compiler vendors rely on this fact. */ +extern CRITICAL_SECTION code_allocator_lock, alloc_profiler_lock; +static CRITICAL_SECTION interrupt_io_lock; + +struct { + console_char buffer[MAX_CONSOLE_TCHARS]; + DWORD head, tail; + CRITICAL_SECTION lock; + CONDITION_VARIABLE cond_has_data; + CONDITION_VARIABLE cond_has_client; + pthread_t thread; + boolean initialized; + HANDLE handle; + boolean in_progress; +} ttyinput; + int os_preinit(char *argv[], char *envp[]) { + InitializeCriticalSection(&code_allocator_lock); + InitializeCriticalSection(&alloc_profiler_lock); + InitializeCriticalSection(&interrupt_io_lock); + InitializeCriticalSection(&ttyinput.lock); pthreads_win32_init(); #ifdef LISP_FEATURE_X86 DWORD slots[TLS_MINIMUM_AVAILABLE]; @@ -1003,14 +1022,14 @@ is_some_thread_local_addr(os_vm_address_t addr) boolean result = 0; #ifdef LISP_FEATURE_SB_THREAD struct thread *th; - pthread_mutex_lock(&all_threads_lock); + thread_mutex_lock(&all_threads_lock); for_each_thread(th) { if(is_thread_local_addr(th,addr)) { result = 1; break; } } - pthread_mutex_unlock(&all_threads_lock); + thread_mutex_unlock(&all_threads_lock); #endif return result; } @@ -1562,8 +1581,6 @@ boolean io_begin_interruptible(HANDLE handle) return 1; } -static pthread_mutex_t interrupt_io_lock = PTHREAD_MUTEX_INITIALIZER; - /* Unmark current thread as (probably) doing synchronous I/O; if an * I/O cancellation was requested, postpone it until next * io_begin_interruptible */ @@ -1572,10 +1589,10 @@ io_end_interruptible(HANDLE handle) { if (!ptr_CancelIoEx) return; - pthread_mutex_lock(&interrupt_io_lock); + thread_mutex_lock(&interrupt_io_lock); __sync_bool_compare_and_swap(&this_thread->synchronous_io_handle_and_flag, handle, 0); - pthread_mutex_unlock(&interrupt_io_lock); + thread_mutex_unlock(&interrupt_io_lock); } #define WITH_INTERRUPTIBLE_IO(handle) \ if (!io_begin_interruptible(handle)) { \ @@ -1653,30 +1670,18 @@ int console_handle_p(HANDLE handle) * entered. */ -struct { - console_char buffer[MAX_CONSOLE_TCHARS]; - DWORD head, tail; - pthread_mutex_t lock; - pthread_cond_t cond_has_data; - pthread_cond_t cond_has_client; - pthread_t thread; - boolean initialized; - HANDLE handle; - boolean in_progress; -} ttyinput = {.lock = PTHREAD_MUTEX_INITIALIZER}; - static unsigned long tty_read_line_server() { - pthread_mutex_lock(&ttyinput.lock); + thread_mutex_lock(&ttyinput.lock); while (ttyinput.handle) { DWORD nchars; BOOL ok; while (!ttyinput.in_progress) - pthread_cond_wait(&ttyinput.cond_has_client,&ttyinput.lock); + SleepConditionVariableCS(&ttyinput.cond_has_client,&ttyinput.lock,INFINITE); - pthread_mutex_unlock(&ttyinput.lock); + thread_mutex_unlock(&ttyinput.lock); #ifdef LISP_FEATURE_SB_UNICODE ok = ReadConsoleW(ttyinput.handle, &ttyinput.buffer[ttyinput.tail], @@ -1689,16 +1694,16 @@ tty_read_line_server() &nchars,NULL); #endif - pthread_mutex_lock(&ttyinput.lock); + thread_mutex_lock(&ttyinput.lock); if (ok) { ttyinput.tail += nchars; - pthread_cond_broadcast(&ttyinput.cond_has_data); + WakeAllConditionVariable(&ttyinput.cond_has_data); } ttyinput.in_progress = 0; } - pthread_mutex_unlock(&ttyinput.lock); - return NULL; + thread_mutex_unlock(&ttyinput.lock); + return 0; } static boolean @@ -1710,8 +1715,8 @@ tty_maybe_initialize_unlocked(HANDLE handle) 0,FALSE,DUPLICATE_SAME_ACCESS)) { return 0; } - pthread_cond_init(&ttyinput.cond_has_data,NULL); - pthread_cond_init(&ttyinput.cond_has_client,NULL); + InitializeConditionVariable(&ttyinput.cond_has_data); + InitializeConditionVariable(&ttyinput.cond_has_client); ttyinput.thread = CreateThread(NULL, 0, // stack size = default tty_read_line_server, 0, @@ -1727,7 +1732,7 @@ win32_tty_listen(HANDLE handle) boolean result = 0; INPUT_RECORD ir; DWORD nevents; - pthread_mutex_lock(&ttyinput.lock); + thread_mutex_lock(&ttyinput.lock); if (!tty_maybe_initialize_unlocked(handle)) result = 0; @@ -1739,11 +1744,11 @@ win32_tty_listen(HANDLE handle) } else { if (PeekConsoleInput(ttyinput.handle,&ir,1,&nevents) && nevents) { ttyinput.in_progress = 1; - pthread_cond_broadcast(&ttyinput.cond_has_client); + WakeAllConditionVariable(&ttyinput.cond_has_client); } } } - pthread_mutex_unlock(&ttyinput.lock); + thread_mutex_unlock(&ttyinput.lock); return result; } @@ -1759,7 +1764,7 @@ static int win32_read_console(HANDLE handle, void* buf, int count) count = nchars*sizeof(console_char); - pthread_mutex_lock(&ttyinput.lock); + thread_mutex_lock(&ttyinput.lock); if (!tty_maybe_initialize_unlocked(handle)) { result = -1; @@ -1779,9 +1784,9 @@ static int win32_read_console(HANDLE handle, void* buf, int count) /* We are to wait */ ttyinput.in_progress=1; /* wake console reader */ - pthread_cond_broadcast(&ttyinput.cond_has_client); + WakeAllConditionVariable(&ttyinput.cond_has_client); } - pthread_cond_wait(&ttyinput.cond_has_data, &ttyinput.lock); + SleepConditionVariableCS(&ttyinput.cond_has_data, &ttyinput.lock, INFINITE); io_end_interruptible(ttyinput.handle); } } @@ -1816,7 +1821,7 @@ static int win32_read_console(HANDLE handle, void* buf, int count) } } unlock: - pthread_mutex_unlock(&ttyinput.lock); + thread_mutex_unlock(&ttyinput.lock); return result; } @@ -1831,7 +1836,7 @@ win32_maybe_interrupt_io(void* thread) #endif if (ptr_CancelIoEx) { - pthread_mutex_lock(&interrupt_io_lock); + thread_mutex_lock(&interrupt_io_lock); HANDLE h = (HANDLE) InterlockedExchangePointer((volatile LPVOID *) &th->synchronous_io_handle_and_flag, @@ -1839,9 +1844,9 @@ win32_maybe_interrupt_io(void* thread) if (h && (h!=INVALID_HANDLE_VALUE)) { if (console_handle_p(h)) { - pthread_mutex_lock(&ttyinput.lock); - pthread_cond_broadcast(&ttyinput.cond_has_data); - pthread_mutex_unlock(&ttyinput.lock); + thread_mutex_lock(&ttyinput.lock); + WakeAllConditionVariable(&ttyinput.cond_has_data); + thread_mutex_unlock(&ttyinput.lock); done = 1; goto unlock; } @@ -1851,7 +1856,7 @@ win32_maybe_interrupt_io(void* thread) done |= !!ptr_CancelIoEx(h,NULL); } unlock: - pthread_mutex_unlock(&interrupt_io_lock); + thread_mutex_unlock(&interrupt_io_lock); } return done; } diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 5f2fbf1db1..ef507a8818 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -604,8 +604,12 @@ lispobj fdefn_callee_lispobj(struct fdefn* fdefn) { extern unsigned int alloc_profile_n_counters; extern unsigned int max_alloc_point_counters; #ifdef LISP_FEATURE_SB_THREAD +#ifdef LISP_FEATURE_WIN32 +extern CRITICAL_SECTION alloc_profiler_lock; +#else extern pthread_mutex_t alloc_profiler_lock; #endif +#endif static unsigned int claim_index(int qty) { From a603c8462eb559ab4497ca8a28f0541be7578077 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 1 Sep 2020 05:20:54 -0400 Subject: [PATCH 0462/4023] sb-safepoint: avoid mention of any semaphore type As is consistent with the #ifdef at 'struct nonpointer_thread_data' --- src/runtime/os-common.c | 4 ++-- src/runtime/os.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 88e03d3182..c5bd264716 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -100,8 +100,8 @@ os_get_errno(void) return errno; } - -#if defined(LISP_FEATURE_SB_THREAD) && (!defined(CANNOT_USE_POSIX_SEM_T) || defined(LISP_FEATURE_WIN32)) +#if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_SB_SAFEPOINT \ + && !defined CANNOT_USE_POSIX_SEM_T void os_sem_init(os_sem_t *sem, unsigned int value) diff --git a/src/runtime/os.h b/src/runtime/os.h index e8c181f82a..87c1ec5966 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -221,7 +221,7 @@ extern char *os_get_runtime_executable_path(); #define OS_VM_SIZE_FMT PRIuPTR #define OS_VM_SIZE_FMTX PRIxPTR -#ifdef LISP_FEATURE_SB_THREAD +#if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_SB_SAFEPOINT # ifndef CANNOT_USE_POSIX_SEM_T # include typedef sem_t os_sem_t; From 544548c21c877bac90be5114e3f8d5af8ac2e82e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 1 Sep 2020 05:31:47 -0400 Subject: [PATCH 0463/4023] win32: Garbage-collect pthreads_win32.[ch] --- src/runtime/pthreads_win32.c | 642 ----------------------------------- src/runtime/pthreads_win32.h | 137 -------- src/runtime/thread.c | 1 - src/runtime/win32-os.h | 3 - 4 files changed, 783 deletions(-) diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index c189dd57e9..778fb07d62 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -8,90 +8,6 @@ #include #include -#ifdef PTHREAD_DEBUG_OUTPUT -#define pthshow(fmt,...) \ - do { \ - fprintf(stderr,fmt "\n", __VA_ARGS__); \ - fflush(stderr); \ - } while (0) - -#define DEBUG_OWN(cs) do {(cs)->owner=pthread_self(); } while(0) -#define DEBUG_RELEASE(cs) do {(cs)->owner=0;} while(0) - -#else -#define pthshow(fmt,...) do {} while (0) -#define DEBUG_OWN(cs) do {} while(0) -#define DEBUG_RELEASE(cs) do {} while(0) -#endif - - -struct freelist_cell { - struct freelist_cell * next; - void* data; -}; - -struct freelist { - void* (*create_fn)(); - CRITICAL_SECTION lock; - struct freelist_cell * empty; - struct freelist_cell * full; - unsigned int count; -}; - -#define mutex_lock(x) EnterCriticalSection(x) -#define mutex_unlock(x) LeaveCriticalSection(x) - -static void* freelist_get(struct freelist *fl) -{ - void* result = NULL; - if (fl->full) { - mutex_lock(&fl->lock); - if (fl->full) { - struct freelist_cell *cell = fl->full; - fl->full = cell->next; - result = cell->data; - cell->next = fl->empty; - fl->empty = cell; - } - mutex_unlock(&fl->lock); - } - if (!result) { - result = fl->create_fn(); - } - return result; -} - -static void freelist_return(struct freelist *fl, void*data) -{ - struct freelist_cell* cell = NULL; - if (fl->empty) { - mutex_lock(&fl->lock); - if (fl->empty) { - cell = fl->empty; - fl->empty = cell->next; - goto add_locked; - } - mutex_unlock(&fl->lock); - } - if (!cell) { - int i,n=32; - cell = malloc(sizeof(*cell)*n); - for (i=0; i<(n-1); ++i) - cell[i].next = &cell[i+1]; - cell[i].next = NULL; - } - - mutex_lock(&fl->lock); - ++fl->count; - add_locked: - cell->data = data; - cell->next = fl->full; - fl->full = cell; - mutex_unlock(&fl->lock); -} - -typedef unsigned char boolean; - /* TLS management internals */ DWORD thread_self_tls_index; @@ -168,43 +84,6 @@ int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset) return 0; } -static CRITICAL_SECTION mutex_init_lock; - -int pthread_mutex_init(pthread_mutex_t * mutex, const pthread_mutexattr_t * attr) -{ - *mutex = (struct _pthread_mutex_info*)malloc(sizeof(struct _pthread_mutex_info)); - InitializeCriticalSection(&(*mutex)->cs); - (*mutex)->file = " (free) "; - return 0; -} - -int pthread_mutexattr_init(pthread_mutexattr_t* attr) -{ - return 0; -} -int pthread_mutexattr_destroy(pthread_mutexattr_t* attr) -{ - return 0; -} - -int pthread_mutexattr_settype(pthread_mutexattr_t* attr,int mutex_type) -{ - return 0; -} - -struct _pthread_mutex_info DEAD_MUTEX; - -int pthread_mutex_destroy(pthread_mutex_t *mutex) -{ - if (*mutex != PTHREAD_MUTEX_INITIALIZER) { - pthread_np_assert_live_mutex(mutex,"destroy"); - DeleteCriticalSection(&(*mutex)->cs); - free(*mutex); - *mutex = &DEAD_MUTEX; - } - return 0; -} - /* Add pending signal to (other) thread */ void pthread_np_add_pending_signal(pthread_t thread, int signum) { @@ -244,452 +123,6 @@ sigset_t pthread_np_other_thread_sigpending(pthread_t thread) 0, 0); } -/* Mutex implementation uses CRITICAL_SECTIONs. Somethings to keep in - mind: (1) uncontested locking is cheap; (2) long wait on a busy - lock causes exception, so it should never be attempted; (3) those - mutexes are recursive; (4) one thread locks, the other unlocks -> - the next one hangs. */ -int pthread_mutex_lock(pthread_mutex_t *mutex) -{ - pthread_np_assert_live_mutex(mutex,"lock"); - if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - mutex_lock(&mutex_init_lock); - if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - pthread_mutex_init(mutex, NULL); - } - mutex_unlock(&mutex_init_lock); - } - EnterCriticalSection(&(*mutex)->cs); - DEBUG_OWN(*mutex); - return 0; -} - -int pthread_mutex_trylock(pthread_mutex_t *mutex) -{ - pthread_np_assert_live_mutex(mutex,"trylock"); - if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - mutex_lock(&mutex_init_lock); - if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - pthread_mutex_init(mutex, NULL); - } - mutex_unlock(&mutex_init_lock); - } - if (TryEnterCriticalSection(&(*mutex)->cs)) { - DEBUG_OWN(*mutex); - return 0; - } - else - return EBUSY; -} - -/* Versions of lock/trylock useful for debugging. Our header file - conditionally redefines lock/trylock to call them. */ - -int pthread_mutex_lock_annotate_np(pthread_mutex_t *mutex, const char* file, int line) -{ - int contention = 0; - pthread_np_assert_live_mutex(mutex,"lock"); - if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - mutex_lock(&mutex_init_lock); - if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - pthread_mutex_init(mutex, NULL); - pthshow("Mutex #x%p: automatic initialization; #x%p %s +%d", - mutex, *mutex, - file, line); - } - mutex_unlock(&mutex_init_lock); - } - if ((*mutex)->owner) { - pthshow("Mutex #x%p -> #x%p: contention; owned by #x%p, wanted by #x%p", - mutex, *mutex, - (*mutex)->owner, - pthread_self()); - pthshow("Mutex #x%p -> #x%p: contention notes: old %s +%d, new %s +%d", - mutex, *mutex, - (*mutex)->file,(*mutex)->line, file, line); - contention = 1; - } - EnterCriticalSection(&(*mutex)->cs); - if (contention) { - pthshow("Mutex #x%p -> #x%p: contention end; left by #x%p, taken by #x%p", - mutex, *mutex, - (*mutex)->owner, - pthread_self()); - pthshow("Mutex #x%p -> #x%p: contention notes: old %s +%d, new %s +%d", - mutex, *mutex, - (*mutex)->file,(*mutex)->line, file, line); - } - (*mutex)->owner = pthread_self(); - (*mutex)->file = file; - (*mutex)->line = line; - return 0; -} - -int pthread_mutex_trylock_annotate_np(pthread_mutex_t *mutex, const char* file, int line) -{ - int contention = 0; - pthread_np_assert_live_mutex(mutex,"trylock"); - if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - mutex_lock(&mutex_init_lock); - if (*mutex == PTHREAD_MUTEX_INITIALIZER) { - pthread_mutex_init(mutex, NULL); - } - mutex_unlock(&mutex_init_lock); - } - if ((*mutex)->owner) { - pthshow("Mutex #x%p -> #x%p: tried contention; owned by #x%p, wanted by #x%p", - mutex, *mutex, - (*mutex)->owner, - pthread_self()); - pthshow("Mutex #x%p -> #x%p: contention notes: old %s +%d, new %s +%d", - mutex, *mutex, - (*mutex)->file,(*mutex)->line, file, line); - contention = 1; - } - if (TryEnterCriticalSection(&(*mutex)->cs)) { - if (contention) { - pthshow("Mutex #x%p -> #x%p: contention end; left by #x%p, taken by #x%p", - mutex, *mutex, - (*mutex)->owner, - pthread_self()); - pthshow("Mutex #x%p -> #x%p: contention notes: old %s +%d, new %s +%d", - mutex, *mutex, - (*mutex)->file,(*mutex)->line, file, line); - } - (*mutex)->owner = pthread_self(); - (*mutex)->file = file; - (*mutex)->line = line; - return 0; - } - else - return EBUSY; -} - -int pthread_mutex_unlock(pthread_mutex_t *mutex) -{ - /* Owner is for debugging only; NB if mutex is used recursively, - owner field will lie. */ - pthread_np_assert_live_mutex(mutex,"unlock"); - DEBUG_RELEASE(*mutex); - LeaveCriticalSection(&(*mutex)->cs); - return 0; -} - -/* Condition variables implemented with events and wakeup queues. */ - -/* .info field in wakeup record is an "opportunistic" indicator that - wakeup has happened. On timeout from WaitForSingleObject, thread - doesn't know (1) whether to reset event, (2) whether to (try) to - find and unlink wakeup record. Let's let it know (of course, - it will know for sure only under cv_wakeup_lock). */ - -#define WAKEUP_WAITING_NOTIMEOUT 0 -#define WAKEUP_WAITING_TIMEOUT 4 - -#define WAKEUP_HAPPENED 1 -#define WAKEUP_BY_INTERRUPT 2 - -static void* event_create() -{ - return (void*)CreateEvent(NULL,FALSE,FALSE,NULL); -} - -static struct freelist event_freelist; - - -unsigned int pthread_free_event_pool_size() -{ - return event_freelist.count; -} - -static HANDLE fe_get_event() -{ - return (HANDLE)freelist_get(&event_freelist); -} - -static void fe_return_event(HANDLE handle) -{ - freelist_return(&event_freelist, (void*)handle); -} - -static HANDLE cv_default_event_get_fn() -{ - pthread_thread *self = pthread_self(); - HANDLE event = self->cv_event; - if (!event) { - event = CreateEvent(NULL, FALSE, FALSE, NULL); - self->cv_event = event; - } else { - /* ResetEvent(event); used to be here. Let's try without. It's - safe in pthread_cond_wait: if WaitForSingleObjectEx ever - returns, event is reset automatically, and the wakeup queue item - is removed by the signaller under wakeup_lock. - - pthread_cond_timedwait should reset the event if - cv_wakeup_remove failed to find its wakeup record, otherwise - it's safe too. */ - } - return event; -} - -static void cv_default_event_return_fn(HANDLE event) -{ - /* ResetEvent(event); could be here as well (and used to be). - Avoiding syscalls makes sense, however. */ -} - -static pthread_condattr_t cv_default_attr = { - 0, /* alertable */ - fe_get_event, - fe_return_event, - /* cv_default_event_get_fn, /\* get_fn *\/ */ - /* cv_default_event_return_fn /\* return_fn *\/ */ -}; - -int pthread_cond_init(pthread_cond_t * cv, const pthread_condattr_t * attr) -{ - if (!attr) - attr = &cv_default_attr; - InitializeCriticalSection(&cv->wakeup_lock); - cv->first_wakeup = NULL; - cv->last_wakeup = NULL; - cv->alertable = attr->alertable; - cv->get_fn = attr->get_fn; - cv->return_fn = attr->return_fn; - return 0; -} - -int pthread_condattr_init(pthread_condattr_t *attr) -{ - *attr = cv_default_attr; - return 0; -} - -int pthread_condattr_destroy(pthread_condattr_t *attr) -{ - return 0; -} -int pthread_condattr_setevent_np(pthread_condattr_t *attr, - cv_event_get_fn get_fn, cv_event_return_fn ret_fn) -{ - attr->get_fn = get_fn ? get_fn : fe_get_event;// cv_default_event_get_fn; - attr->return_fn = ret_fn ? ret_fn : fe_return_event; // cv_default_event_return_fn; - return 0; -} - -int pthread_cond_destroy(pthread_cond_t *cv) -{ - return 0; -} - -int pthread_cond_broadcast(pthread_cond_t *cv) -{ - int count = 0; - - HANDLE postponed[128]; - int npostponed = 0,i; - - /* No strict requirements to memory visibility model, because of - mutex unlock around waiting. */ - if (!cv->first_wakeup) - return 0; - mutex_lock(&cv->wakeup_lock); - while (cv->first_wakeup) - { - struct thread_wakeup * w = cv->first_wakeup; - HANDLE waitevent = w->event; - cv->first_wakeup = w->next; - w->info = WAKEUP_HAPPENED; - postponed[npostponed++] = waitevent; - if (/* w->info == WAKEUP_WAITING_TIMEOUT || */ npostponed == - sizeof(postponed)/sizeof(postponed[0])) { - for (i=0; ilast_wakeup = NULL; - mutex_unlock(&cv->wakeup_lock); - for (i=0; ifirst_wakeup) - return 0; - mutex_lock(&cv->wakeup_lock); - w = cv->first_wakeup; - if (w) { - HANDLE waitevent = w->event; - cv->first_wakeup = w->next; - if (!cv->first_wakeup) - cv->last_wakeup = NULL; - w->info = WAKEUP_HAPPENED; - SetEvent(waitevent); - } - mutex_unlock(&cv->wakeup_lock); - return 0; -} - -/* Return value is used for futexes: 0=ok, 1 on unexpected word change. */ -int cv_wakeup_add(struct pthread_cond_t* cv, struct thread_wakeup* w) -{ - HANDLE event; - w->next = NULL; - mutex_lock(&cv->wakeup_lock); - if (w->uaddr) { - if (w->uval != *w->uaddr) { - mutex_unlock(&cv->wakeup_lock); - return 1; - } - pthread_self()->futex_wakeup = w; - } - event = cv->get_fn(); - w->event = event; - if (cv->last_wakeup == w) { - fprintf(stderr, "cv->last_wakeup == w\n"); - fflush(stderr); - ExitProcess(0); - } - if (cv->last_wakeup != NULL) - { - cv->last_wakeup->next = w; - cv->last_wakeup = w; - } - else - { - cv->first_wakeup = w; - cv->last_wakeup = w; - } - mutex_unlock(&cv->wakeup_lock); - return 0; -} - -/* Return true if wakeup found, false if missing */ -int cv_wakeup_remove(struct pthread_cond_t* cv, struct thread_wakeup* w) -{ - int result = 0; - if (w->info == WAKEUP_HAPPENED || w->info == WAKEUP_BY_INTERRUPT) - goto finish; - mutex_lock(&cv->wakeup_lock); - { - if (w->info == WAKEUP_HAPPENED || w->info == WAKEUP_BY_INTERRUPT) - goto unlock; - if (cv->first_wakeup == w) { - cv->first_wakeup = w->next; - if (cv->last_wakeup == w) - cv->last_wakeup = NULL; - result = 1; - } else { - struct thread_wakeup * prev = cv->first_wakeup; - while (prev && prev->next != w) - prev = prev->next; - if (!prev) { - goto unlock; - } - prev->next = w->next; - if (cv->last_wakeup == w) - cv->last_wakeup = prev; - result = 1; - } - } - unlock: - mutex_unlock(&cv->wakeup_lock); - finish: - return result; -} - - -int pthread_cond_wait(pthread_cond_t * cv, pthread_mutex_t * cs) -{ - struct thread_wakeup w; - w.uaddr = 0; - w.info = WAKEUP_WAITING_NOTIMEOUT; - cv_wakeup_add(cv, &w); - if (cv->last_wakeup->next == cv->last_wakeup) { - pthread_np_lose(5,"cv->last_wakeup->next == cv->last_wakeup\n"); - } - if (cv->last_wakeup->next != NULL) { - pthread_np_lose(5,"cv->last_wakeup->next == cv->last_wakeup\n"); - } - pthread_self()->waiting_cond = cv; - DEBUG_RELEASE(*cs); - pthread_mutex_unlock(cs); - do { - if (cv->alertable) { - while (WaitForSingleObjectEx(w.event, INFINITE, TRUE) == WAIT_IO_COMPLETION); - } else { - WaitForSingleObject(w.event, INFINITE); - } - } while (w.info == WAKEUP_WAITING_NOTIMEOUT); - pthread_self()->waiting_cond = NULL; - /* Event is signalled once, wakeup is dequeued by signaller. */ - cv->return_fn(w.event); - pthread_mutex_lock(cs); - DEBUG_OWN(*cs); - return 0; -} - -int pthread_cond_timedwait(pthread_cond_t * cv, pthread_mutex_t * cs, - const struct timespec * abstime) -{ - DWORD rv; - struct thread_wakeup w; - pthread_t self = pthread_self(); - - w.info = WAKEUP_WAITING_TIMEOUT; - w.uaddr = 0; - cv_wakeup_add(cv, &w); - if (cv->last_wakeup->next == cv->last_wakeup) { - fprintf(stderr, "cv->last_wakeup->next == cv->last_wakeup\n"); - ExitProcess(0); - } - self->waiting_cond = cv; - DEBUG_RELEASE(*cs); - /* barrier (release); waiting_cond globally visible */ - pthread_mutex_unlock(cs); - { - struct timeval cur_tm; - long sec, msec; - gettimeofday(&cur_tm, NULL); - sec = abstime->tv_sec - cur_tm.tv_sec; - msec = sec * 1000 + abstime->tv_nsec / 1000000 - cur_tm.tv_usec / 1000; - if (msec < 0) - msec = 0; - do { - if (cv->alertable) { - while ((rv = WaitForSingleObjectEx(w.event, msec, TRUE)) - == WAIT_IO_COMPLETION); - } else { - rv = WaitForSingleObject(w.event, msec); - } - } while (rv == WAIT_OBJECT_0 && w.info == WAKEUP_WAITING_TIMEOUT); - } - self->waiting_cond = NULL; - - if (rv == WAIT_TIMEOUT) { - if (!cv_wakeup_remove(cv, &w)) { - /* Someone removed our wakeup record: though we got a timeout, - event was (will be) signalled before we are here. - Consume this wakeup. */ - WaitForSingleObject(w.event, INFINITE); - } - } - cv->return_fn(w.event); - pthread_mutex_lock(cs); - DEBUG_OWN(*cs); - if (rv == WAIT_TIMEOUT) - return ETIMEDOUT; - else - return 0; -} - int sched_yield() { /* http://stackoverflow.com/questions/1383943/switchtothread-vs-sleep1 @@ -703,7 +136,6 @@ int sched_yield() void pthreads_win32_init() { thread_self_tls_index = TlsAlloc(); - InitializeCriticalSection(&mutex_init_lock); pthread_np_notice_thread(); } @@ -712,7 +144,6 @@ VOID CALLBACK pthreads_win32_unnotice(void* parameter, BOOLEAN timerOrWait) { pthread_t pth = parameter; - if (pth->cv_event) CloseHandle(pth->cv_event); CloseHandle(pth->handle); UnregisterWait(pth->wait_handle); @@ -780,77 +211,4 @@ int sigpending(sigset_t *set) return 0; } -void pthread_np_lose(int trace_depth, const char* fmt, ...) -{ - va_list header; - void* frame; - int n = 0; - void** lastseh; - - va_start(header,fmt); - vfprintf(stderr,fmt,header); - for (lastseh = *(void**)NtCurrentTeb(); - lastseh && (lastseh!=(void*)0xFFFFFFFF); - lastseh = *lastseh); - - fprintf(stderr, "Backtrace: %s (pthread %p)\n", header, pthread_self()); - for (frame = __builtin_frame_address(0); frame; frame=*(void**)frame) - { - if ((n++)>trace_depth) - return; - fprintf(stderr, "[#%02d]: ebp = %p, ret = %p\n",n, - frame, ((void**)frame)[1]); - } - ExitProcess(0); -} - -int -sem_init(sem_t *sem, int pshared_not_implemented, unsigned int value) -{ - sem_t semh = CreateSemaphore(NULL, value, SEM_VALUE_MAX, NULL); - if (!semh) - return -1; - *sem = semh; - return 0; -} - -int -sem_post(sem_t *sem) -{ - return !ReleaseSemaphore(*sem, 1, NULL); -} - -static int -sem_wait_timeout(sem_t *sem, DWORD ms) -{ - switch (WaitForSingleObject(*sem, ms)) { - case WAIT_OBJECT_0: - return 0; - case WAIT_TIMEOUT: - /* errno = EAGAIN; */ - return -1; - default: - /* errno = EINVAL; */ - return -1; - } -} - -int -sem_wait(sem_t *sem) -{ - return sem_wait_timeout(sem, INFINITE); -} - -int -sem_trywait(sem_t *sem) -{ - return sem_wait_timeout(sem, 0); -} - -int -sem_destroy(sem_t *sem) -{ - return !CloseHandle(*sem); -} - #endif diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index c4efa8b9da..29b556a721 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -50,23 +50,12 @@ typedef int sigset_t; #define NSIG 32 /* maximum signal number + 1 */ #endif -/* To avoid overusing system TLS, pthread provides its own */ -#define PTHREAD_KEYS_MAX 128 - -#define PTHREAD_DESTRUCTOR_ITERATIONS 4 - -#define PTHREAD_STACK_MIN 0 - void pthreads_win32_init(); /* 1 - Thread */ typedef struct pthread_thread* pthread_t; -typedef int pthread_attr_t; /* arbitrary */ - -typedef void (*pthread_cleanup_fn)(void* arg); - int pthread_equal(pthread_t thread1, pthread_t thread2); int pthread_kill(pthread_t thread, int signum); @@ -85,58 +74,6 @@ extern DWORD thread_self_tls_index; int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset); #endif -/* 2 - Mutex */ - -typedef struct _pthread_mutex_info { - char padding[64]; - CRITICAL_SECTION cs; - pthread_t owner; - const char* file; - int line; -} __attribute__((aligned(128))) *pthread_mutex_t; - -typedef int pthread_mutexattr_t; -#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t)-1) -int pthread_mutex_init(pthread_mutex_t * mutex, const pthread_mutexattr_t * attr); -int pthread_mutexattr_init(pthread_mutexattr_t*); -int pthread_mutexattr_destroy(pthread_mutexattr_t*); -int pthread_mutexattr_settype(pthread_mutexattr_t*, int); -#define PTHREAD_MUTEX_ERRORCHECK 0 -int pthread_mutex_destroy(pthread_mutex_t *mutex); -int pthread_mutex_lock(pthread_mutex_t *mutex); -int pthread_mutex_trylock(pthread_mutex_t *mutex); -int pthread_mutex_lock_annotate_np(pthread_mutex_t *mutex, const char* file, int line); -int pthread_mutex_trylock_annotate_np(pthread_mutex_t *mutex, const char* file, int line); -int pthread_mutex_unlock(pthread_mutex_t *mutex); - -/* 3 - Condition variable */ - -typedef struct thread_wakeup { - HANDLE event; - struct thread_wakeup *next; - volatile intptr_t *uaddr; - intptr_t uval; - int info; -} thread_wakeup; - -typedef HANDLE (*cv_event_get_fn)(); -typedef void (*cv_event_return_fn)(HANDLE event); - -typedef struct pthread_cond_t { - CRITICAL_SECTION wakeup_lock; - struct thread_wakeup *first_wakeup; - struct thread_wakeup *last_wakeup; - unsigned char alertable; - cv_event_get_fn get_fn; - cv_event_return_fn return_fn; -} pthread_cond_t; - -typedef struct pthread_condattr_t { - unsigned char alertable; - cv_event_get_fn get_fn; - cv_event_return_fn return_fn; -} pthread_condattr_t; - #ifndef _TIMESPEC_DEFINED typedef struct timespec { time_t tv_sec; @@ -144,18 +81,6 @@ typedef struct timespec { } timespec; #endif -// not implemented: PTHREAD_COND_INITIALIZER -int pthread_condattr_init(pthread_condattr_t *attr); -int pthread_condattr_destroy(pthread_condattr_t *attr); -int pthread_condattr_setevent_np(pthread_condattr_t *attr, - cv_event_get_fn get_fn, cv_event_return_fn ret_fn); -int pthread_cond_destroy(pthread_cond_t *cond); -int pthread_cond_init(pthread_cond_t * cond, const pthread_condattr_t * attr); -int pthread_cond_broadcast(pthread_cond_t *cond); -int pthread_cond_signal(pthread_cond_t *cond); -int pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex, const struct timespec * abstime); -int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex); - /* some MinGWs seem to include it, others not: */ #ifndef ETIMEDOUT # define ETIMEDOUT 123 //Something @@ -163,16 +88,9 @@ int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex); int sched_yield(); -void pthread_lock_structures(); -void pthread_unlock_structures(); - -typedef void *(*pthread_fn)(void*); - typedef struct pthread_thread { HANDLE handle; struct thread *vm_thread; - pthread_cond_t *waiting_cond; - void *futex_wakeup; sigset_t blocked_signal_set; volatile sigset_t pending_signal_set; @@ -182,8 +100,6 @@ typedef struct pthread_thread { /* Thread TEB base (mostly informative/debugging) */ void* teb; - - HANDLE cv_event; } pthread_thread; typedef struct { @@ -219,28 +135,6 @@ int sigismember(const sigset_t *set, int signum); typedef int sig_atomic_t; -/* Debugging */ -void pthread_np_lose(int trace_depth, const char* fmt, ...); -extern struct _pthread_mutex_info DEAD_MUTEX; - -static inline void pthread_np_assert_live_mutex(pthread_mutex_t* ptr, - const char *action) -{ - if (*ptr == &DEAD_MUTEX) { - pthread_np_lose(5,"Trying to %s dead mutex %p\n",action,ptr); - } -} - -typedef HANDLE sem_t; - -#define SEM_VALUE_MAX (int) (~0U >>1) - -int sem_init(sem_t *sem, int pshared_not_implemented, unsigned int value); -int sem_post(sem_t *sem); -int sem_wait(sem_t *sem); -int sem_trywait(sem_t *sem); -int sem_destroy(sem_t *sem); - #ifndef PTHREAD_INTERNALS static inline int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset) { @@ -263,36 +157,5 @@ static inline int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t * return 0; } -#ifdef PTHREAD_DEBUG_OUTPUT -#define pthread_mutex_lock(mutex) \ - pthread_mutex_lock_annotate_np(mutex, __FILE__, __LINE__ ) -#define pthread_mutex_trylock(mutex) \ - pthread_mutex_trylock_annotate_np(mutex, __FILE__ ,__LINE__) -#else - -/* I'm not after inlinining _everything_, but those two things below are - (1) fast, (2) critical (3) short */ -static inline int pthread_mutex_lock_np_inline(pthread_mutex_t *mutex) -{ - pthread_np_assert_live_mutex(mutex,"lock"); - if ((*mutex) == PTHREAD_MUTEX_INITIALIZER) { - return pthread_mutex_lock(mutex); - } else { - EnterCriticalSection(&(*mutex)->cs); - return 0; - } -} - -static inline int pthread_mutex_unlock_np_inline(pthread_mutex_t *mutex) -{ - pthread_np_assert_live_mutex(mutex,"unlock"); - LeaveCriticalSection(&(*mutex)->cs); - return 0; -} - -#define pthread_mutex_lock pthread_mutex_lock_np_inline -#define pthread_mutex_unlock pthread_mutex_unlock_np_inline - -#endif /* !PTHREAD_DEBUG_OUTPUT */ #endif /* !PTHREAD_INTERNALS */ #endif /* WIN32_PTHREAD_INCLUDED */ diff --git a/src/runtime/thread.c b/src/runtime/thread.c index fd3776f31f..269d6994b2 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -456,7 +456,6 @@ unregister_thread(struct thread *th, set_thread_self(self); \ struct thread* th = self->vm_thread #define THREAD_TRAMPOLINE_EPILOGUE \ - if (self->cv_event) CloseHandle(self->cv_event); \ free_thread_struct(th); \ HANDLE h = self->handle; \ free(self); \ diff --git a/src/runtime/win32-os.h b/src/runtime/win32-os.h index 7a1d99270f..e8770daada 100644 --- a/src/runtime/win32-os.h +++ b/src/runtime/win32-os.h @@ -30,9 +30,6 @@ #ifdef LISP_FEATURE_SB_THREAD #include "pthreads_win32.h" -/* prevent inclusion of a mingw semaphore.h */ -#define CANNOT_USE_POSIX_SEM_T -typedef sem_t os_sem_t; #else typedef void *siginfo_t; typedef int sigset_t; From 68a703e8435efc6671bd51893c594d56add57caa Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 1 Sep 2020 11:44:17 -0400 Subject: [PATCH 0464/4023] win32: Thoroughly test for usability of WakeByAddress --- tools-for-build/Makefile | 4 ++ tools-for-build/grovel-features.sh | 19 ++++---- tools-for-build/os-provides-wakebyaddr-test.c | 47 ++++++++++++++++++- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/tools-for-build/Makefile b/tools-for-build/Makefile index 1be91e9df1..4c4355b4b7 100644 --- a/tools-for-build/Makefile +++ b/tools-for-build/Makefile @@ -7,6 +7,10 @@ # provided with absolutely no warranty. See the COPYING and CREDITS # files for more information. +# it is illogical that this makefile pulls in Makefile.features, +# which is presumed not to exist, and which when it does exist causes +# confusion as to what flags should be added in for a generic C compile. +# Why do we do this??? -include genesis/Makefile.features -include Config diff --git a/tools-for-build/grovel-features.sh b/tools-for-build/grovel-features.sh index 1727e35dbb..4f277dfd1b 100644 --- a/tools-for-build/grovel-features.sh +++ b/tools-for-build/grovel-features.sh @@ -6,29 +6,26 @@ cd ./tools-for-build > /dev/null # Assumes the presence of $1-test.c, which when built and # run should return with 104 if the feature is present. +# We presumes that the build machine matches the target machine +# in terms of a whether each feature presence test should pass. featurep() { bin="$1-test" + featurename=${2:-$1} rm -f $bin $GNUMAKE $bin -I ../src/runtime > /dev/null 2>&1 && echo "input" | ./$bin> /dev/null 2>&1 if [ "$?" -eq 104 ] then - printf " :$1" + printf " :$featurename" fi rm -f $bin } # Adding a nonexistent link library to Config.*-win32 will fail, -# so this needs its own recipe to detect the library. +# so we pass -lSynchronization to the featurep test specifically +# and not in the general make rule. +# It will get added in by Config.*-win32 only if LISP_FEATURE_SB_FUTEX. if [ "$sbcl_os" = win32 ] ; then - bin=os-provides-wakebyaddr-test - rm -f $bin - # pass -f /dev/null to use only builtin Make recipes - LOADLIBES=-lSynchronization $GNUMAKE -f /dev/null $bin > /dev/null 2>&1 - if [ "$?" -eq 0 ] - then - printf " :sb-futex" - fi - rm -f $bin + LOADLIBES=-lSynchronization featurep os-provides-wakebyaddr sb-futex fi # KLUDGE: ppc/darwin dlopen is special cased in make-config.sh, as diff --git a/tools-for-build/os-provides-wakebyaddr-test.c b/tools-for-build/os-provides-wakebyaddr-test.c index b318498f7f..7b3da046d8 100644 --- a/tools-for-build/os-provides-wakebyaddr-test.c +++ b/tools-for-build/os-provides-wakebyaddr-test.c @@ -1,7 +1,50 @@ #include +int mutex_word = 0; +int expect = 9; + +DWORD waiter(void* arg) { + mutex_word = expect = 2; + return WaitOnAddress(&mutex_word, &expect, 4, 100); // .1 sec max +} +DWORD waker(void* arg) { + mutex_word = 0; + WakeByAddressSingle(&mutex_word); + return 0; +} + int main() { - WakeByAddressAll((void*)&main); - return 104; + // Verify that WaitOnAddress returns right away if the mutex word has the wrong value. + int result = WaitOnAddress(&mutex_word, &expect, 4, 500); // max = .5 sec + if (!result) return 0; // what? shouldn't be an error to mismatch + + // Try really waiting + mutex_word = 9; + result = WaitOnAddress(&mutex_word, &expect, 4, 20); // wait 20 millisec + // expect a timeout + if (!(result == 0 && GetLastError()==ERROR_TIMEOUT)) return 0; + + // Simulate a lisp mutex being woken + HANDLE hWaiter, hWaker; + hWaiter = CreateThread(NULL, 0, + waiter, 0, /* function and argument */ + 0, /* flags */ + 0); /* id */ + + hWaker = CreateThread(NULL, 0, + waker, 0, /* function and argument */ + CREATE_SUSPENDED, /* flags */ + 0); /* id */ + + for (;;) { + // wait for the waiter to place itself into a wait state on the mutex + if (mutex_word == 2) break; + Sleep(10); // 10 millisec + } + // Give them some time to rendezvous + ResumeThread(hWaker); + WaitForSingleObject(hWaiter, 200); // .2 sec max + if (mutex_word == 0) return 104; + return 1; } From 66ee03beb5c6049f29d734fb50b664a54356c200 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 1 Sep 2020 19:54:06 +0300 Subject: [PATCH 0465/4023] Restore x86-win32 --- src/runtime/Config.x86-win32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/Config.x86-win32 b/src/runtime/Config.x86-win32 index 37efac6637..fe84c01079 100644 --- a/src/runtime/Config.x86-win32 +++ b/src/runtime/Config.x86-win32 @@ -49,7 +49,7 @@ endif GC_SRC = fullcgc.c gencgc.c traceroot.c CFLAGS = -g -Wall -O3 \ - -fno-omit-frame-pointer -march=i686 -DWINVER=0x0501 \ + -fno-omit-frame-pointer -march=i686 -DWINVER=0x600 -D_WIN32_WINNT=0x600 \ -D__W32API_USE_DLLIMPORT__ \ -mpreferred-stack-boundary=2 # We assume Windows ABI 4-byte alignment, but GCC decided to change to From 6e71c58da89acc5eebdfdb9c141d8e42560a7332 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 1 Sep 2020 15:34:51 -0400 Subject: [PATCH 0466/4023] win32: Exit with message if running :sb-futex on older OS --- src/runtime/win32-os.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 8e7f87f7fa..88dff2fdf5 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -657,6 +657,17 @@ struct { int os_preinit(char *argv[], char *envp[]) { +#ifdef LISP_FEATURE_SB_FUTEX + if (GetModuleHandle("API-MS-Win-Core-Synch-l1-2-0") == NULL) { + // calling lose() here loses. Such irony. + fprintf(stderr, "This binary was compiled for Windows 8 or later but you appear to be" +" using 7 or earlier.\nRecompiling SBCL from source on the older release will" +" probably work. See also\n" + "https://support.microsoft.com/en-us/help/4057281/windows-7-support-ended-on-january-14-2020\n"); + fflush(stderr); + exit(1); + } +#endif InitializeCriticalSection(&code_allocator_lock); InitializeCriticalSection(&alloc_profiler_lock); InitializeCriticalSection(&interrupt_io_lock); From 3d8534a9b0d65191f1e47fd8a1b91224291b5a97 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 1 Sep 2020 16:19:35 -0400 Subject: [PATCH 0467/4023] Trivially rearrange some stuff All other things being equal, it's better to have DEFINE-STRUCTURE-ACCESOR and together under one occurrence of #+sb-futex, and it's better to have the feature present cases precede the feature absent cases. --- make-target-2-load.lisp | 6 +- src/code/target-thread.lisp | 212 ++++++++++++++++++----------------- src/code/thread-structs.lisp | 21 ++-- 3 files changed, 125 insertions(+), 114 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index e994748a2b..6ada95a7bb 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -8,6 +8,10 @@ ;;; Remove symbols from CL:*FEATURES* that should not be exposed to users. (export 'sb-impl::+internal-features+ 'sb-impl) +;;; FIXME: these lists of constants inside the TLF cause all the keywords +;;; to be retained in the inage, which break my means of rapid check for +;;; what features are built in by saying, e.g. (apropos "FUTEX") and being +;;; surprised that it's there when it shouldn't be. (let* ((non-target-features ;; ;; FIXME: I suspect that this list should be changed to its inverse- @@ -23,7 +27,7 @@ ;; in as much as policy can be changed later arbitrarily. :CONS-PROFILING ;; Used by nothing after compiling 'target-thread.lisp' or 'thread.c' - :SB-FUTEX :FUTEX-USE-TID :OS-THREAD-STACK + :SB-FUTEX :OS-THREAD-STACK ;; These affect the BREAK instruction emitter, but the C code is able ;; to handle anything, and post-build we don't care which it is. :UD2-BREAKPOINTS :INT4-BREAKPOINTS diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index b7c345f155..a8f12adccf 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -425,6 +425,19 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." #+sb-futex (progn + (locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) + (define-structure-slot-addressor mutex-state-address + ;; """ (Futexes are 32 bits in size on all platforms, including 64-bit systems.) """ + ;; which means we need to add 4 bytes to get to the low 32 bits of the slot contents + ;; where we store state. This would be prettier if we had 32-bit raw slots. + :structure mutex + :slot state + :byte-offset (+ #+(and 64-bit big-endian) 4)) + (define-structure-slot-addressor waitqueue-token-address + :structure waitqueue + :slot token + :byte-offset (+ #+(and 64-bit big-endian) 4))) + (export 'futex-wake) ; for naughty users only (declaim (inline futex-wait futex-wake)) @@ -466,17 +479,6 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (setf (documentation 'make-mutex 'function) "Create a mutex." (documentation 'mutex-name 'function) "The name of the mutex. Setfable.") -#+sb-futex -(progn - (locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) - ;; """ (Futexes are 32 bits in size on all platforms, including 64-bit systems.) """ - ;; which means we need to add 4 bytes to get to the low 32 bits of the slot contents - ;; where we store state. This would be prettier if we had 32-bit raw slots. - (define-structure-slot-addressor mutex-state-address - :structure mutex - :slot state - :byte-offset (+ #+(and 64-bit big-endian) 4)))) - (sb-ext:define-load-time-global **deadlock-lock** nil) ;;; Signals an error if owner of LOCK is waiting on a lock whose release @@ -654,36 +656,82 @@ returns NIL each time." 0))))) ,@body)))) +;;; If you want to pick at runtime what kind of mutex to use, you can replace +;;; this DEFCONSTANT with a DEFGLOBAL +(defconstant futex-enabled (or #+sb-futex t)) + (defun %try-mutex (mutex new-owner) (declare (type mutex mutex) (optimize (speed 3))) - #-sb-futex - (progn - (barrier (:read)) - (let ((old (mutex-%owner mutex))) - (when (eq new-owner old) - (error "Recursive lock attempt ~S." mutex)) - #-sb-thread - (when old - (error "Strange deadlock on ~S in an unithreaded build?" mutex)) - #-(and sb-thread sb-futex) - (and (not old) - ;; Don't even bother to try to CAS if it looks bad. - (not (sb-ext:compare-and-swap (mutex-%owner mutex) nil new-owner))))) - #+sb-futex - ;; From the Mutex 2 algorithm from "Futexes are Tricky" by Ulrich Drepper. - (cond ((= (sb-ext:cas (mutex-state mutex) 0 1) 0) - (setf (mutex-%owner mutex) (sb-ext:truly-the thread new-owner)) - t) ; GRAB-MUTEX wants %TRY-MUTEX to return boolean, not generalized boolean - ((eq (mutex-%owner mutex) new-owner) - (error "Recursive lock attempt ~S." mutex)))) + (cond #+sb-futex + (t + ;; From the Mutex 2 algorithm from "Futexes are Tricky" by Ulrich Drepper. + (cond ((= (sb-ext:cas (mutex-state mutex) 0 1) 0) + (setf (mutex-%owner mutex) (sb-ext:truly-the thread new-owner)) + t) ; GRAB-MUTEX wants %TRY-MUTEX to return boolean, not generalized boolean + ((eq (mutex-%owner mutex) new-owner) + (error "Recursive lock attempt ~S." mutex)))) + #-sb-futex + (t + (barrier (:read)) + (let ((old (mutex-%owner mutex))) + (when (eq new-owner old) + (error "Recursive lock attempt ~S." mutex)) + #-sb-thread + (when old + (error "Strange deadlock on ~S in an unithreaded build?" mutex)) + (and (not old) + ;; Don't even bother to try to CAS if it looks bad. + (not (sb-ext:compare-and-swap (mutex-%owner mutex) nil new-owner))))))) #+sb-thread (defun %%wait-for-mutex (mutex new-owner to-sec to-usec stop-sec stop-usec) (declare (type mutex mutex) (optimize (speed 3))) (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) (declare (ignorable to-sec to-usec)) - #-sb-futex - (flet ((cas () + (cond + #+sb-futex + (t + ;; This is a fairly direct translation of the Mutex 2 algorithm from + ;; "Futexes are Tricky" by Ulrich Drepper. + ;; + ;; void lock () { + ;; int c; + ;; if ((c = cmpxchg(val, 0, 1)) != 0) + ;; do { + ;; if (c == 2 || cmpxchg(val, 1, 2) != 0) + ;; futex_wait(&val, 2); + ;; } while ((c = cmpxchg(val, 0, 2)) != 0); + ;; } + ;; + (symbol-macrolet ((val (mutex-state mutex))) + (let ((c (sb-ext:cas val 0 1))) ; available -> taken + (unless (= c 0) ; Got it right off the bat? + (if (not stop-sec) + (loop ; untimed + ;; Mark it as contested, and sleep, unless it is now in state 0. + (when (or (eql c 2) (/= 0 (sb-ext:cas val 1 2))) + (with-pinned-objects (mutex) + (futex-wait (mutex-state-address mutex) 2 -1 0))) + ;; Try to get it, still marking it as contested. + (when (= 0 (setq c (sb-ext:cas val 0 2))) (return))) ; win + (loop ; same as above but check for timeout + (when (or (eql c 2) (/= 0 (sb-ext:cas val 1 2))) + (if (eql 1 (with-pinned-objects (mutex) + (futex-wait (mutex-state-address mutex) 2 to-sec to-usec))) + ;; -1 = EWOULDBLOCK, possibly spurious wakeup + ;; 0 = normal wakeup + ;; 1 = ETIMEDOUT ***DONE*** + ;; 2 = EINTR, a spurious wakeup + (return-from %%wait-for-mutex nil))) + (when (= 0 (setq c (sb-ext:cas val 0 2))) (return)) ; win + ;; Update timeout + (setf (values to-sec to-usec) + (sb-impl::relative-decoded-times stop-sec stop-usec)))))) + (setf (mutex-%owner mutex) new-owner) + t)) + #-sb-futex + (t + (flet ((cas () (loop repeat 100 when (and (progn (barrier (:read)) @@ -696,47 +744,8 @@ returns NIL each time." (sb-ext:spin-loop-hint)) ;; Check for pending interrupts. (with-interrupts nil))) - (declare (dynamic-extent #'cas)) - (%%wait-for #'cas stop-sec stop-usec)) - #+sb-futex - ;; This is a fairly direct translation of the Mutex 2 algorithm from - ;; "Futexes are Tricky" by Ulrich Drepper. - ;; - ;; void lock () { - ;; int c; - ;; if ((c = cmpxchg(val, 0, 1)) != 0) - ;; do { - ;; if (c == 2 || cmpxchg(val, 1, 2) != 0) - ;; futex_wait(&val, 2); - ;; } while ((c = cmpxchg(val, 0, 2)) != 0); - ;; } - ;; - (symbol-macrolet ((val (mutex-state mutex))) - (let ((c (sb-ext:cas val 0 1))) ; available -> taken - (unless (= c 0) ; Got it right off the bat? - (if (not stop-sec) - (loop ; untimed - ;; Mark it as contested, and sleep, unless it is now in state 0. - (when (or (eql c 2) (/= 0 (sb-ext:cas val 1 2))) - (with-pinned-objects (mutex) - (futex-wait (mutex-state-address mutex) 2 -1 0))) - ;; Try to get it, still marking it as contested. - (when (= 0 (setq c (sb-ext:cas val 0 2))) (return))) ; win - (loop ; same as above but check for timeout - (when (or (eql c 2) (/= 0 (sb-ext:cas val 1 2))) - (if (eql 1 (with-pinned-objects (mutex) - (futex-wait (mutex-state-address mutex) 2 to-sec to-usec))) - ;; -1 = EWOULDBLOCK, possibly spurious wakeup - ;; 0 = normal wakeup - ;; 1 = ETIMEDOUT ***DONE*** - ;; 2 = EINTR, a spurious wakeup - (return-from %%wait-for-mutex nil))) - (when (= 0 (setq c (sb-ext:cas val 0 2))) (return)) ; win - ;; Update timeout - (setf (values to-sec to-usec) - (sb-impl::relative-decoded-times stop-sec stop-usec)))))) - (setf (mutex-%owner mutex) new-owner) - t)) + (declare (dynamic-extent #'cas)) + (%%wait-for #'cas stop-sec stop-usec))))) #+sb-thread (defun %wait-for-mutex (mutex self timeout to-sec to-usec stop-sec stop-usec deadlinep) @@ -902,13 +911,6 @@ IF-NOT-OWNER is :FORCE)." (setf (documentation 'waitqueue-name 'function) "The name of the waitqueue. Setfable." (documentation 'make-waitqueue 'function) "Create a waitqueue.") -#+sb-futex -(locally (declare (sb-ext:muffle-conditions sb-ext:compiler-note)) - (define-structure-slot-addressor waitqueue-token-address - :structure waitqueue - :slot token - :byte-offset (+ #+(and 64-bit big-endian) 4))) - (declaim (inline %condition-wait)) (defun %condition-wait (queue mutex timeout to-sec to-usec stop-sec stop-usec deadlinep) @@ -926,22 +928,9 @@ IF-NOT-OWNER is :FORCE)." ;; the mutex on our way out. (without-interrupts (unwind-protect - (progn - #-sb-futex - (progn - (%with-cas-lock ((waitqueue-%owner queue)) - (%waitqueue-enqueue me queue)) - (release-mutex mutex) - (setf status - (or (flet ((wakeup () - (barrier (:read)) - (unless (eq queue (thread-waiting-for me)) - :ok))) - (declare (dynamic-extent #'wakeup)) - (allow-with-interrupts - (%%wait-for #'wakeup stop-sec stop-usec))) - :timeout))) - #+sb-futex + (cond + #+sb-futex + (t (with-pinned-objects (queue) (setf (waitqueue-token queue) (my-kernel-thread-id)) (release-mutex mutex) @@ -966,6 +955,20 @@ IF-NOT-OWNER is :FORCE)." ;; 0 = normal wakeup ;; 2 = EINTR, a spurious wakeup :ok))))) + #-sb-futex + (t + (%with-cas-lock ((waitqueue-%owner queue)) + (%waitqueue-enqueue me queue)) + (release-mutex mutex) + (setf status + (or (flet ((wakeup () + (barrier (:read)) + (unless (eq queue (thread-waiting-for me)) + :ok))) + (declare (dynamic-extent #'wakeup)) + (allow-with-interrupts + (%%wait-for #'wakeup stop-sec stop-usec))) + :timeout)))) #-sb-futex (%with-cas-lock ((waitqueue-%owner queue)) (if (eq queue (thread-waiting-for me)) @@ -1079,12 +1082,9 @@ must be held by this thread during this call." #-sb-thread (error "Not supported in unithread builds.") #+sb-thread - (progn - #-sb-futex - (with-cas-lock ((waitqueue-%owner queue)) - (%waitqueue-wakeup queue n)) - #+sb-futex - (progn + (cond + #+sb-futex + (t ;; No problem if >1 thread notifies during the comment in condition-wait: ;; as long as the value in queue-data isn't the waiting thread's id, it ;; matters not what it is. We rely on kernel thread ID being nonzero. @@ -1096,7 +1096,11 @@ must be held by this thread during this call." (setf (waitqueue-token queue) 0) (with-pinned-objects (queue) (futex-wake (waitqueue-token-address queue) n)) - nil))) + nil) + #-sb-futex + (t + (with-cas-lock ((waitqueue-%owner queue)) + (%waitqueue-wakeup queue n))))) (declaim (ftype (sfunction (waitqueue) null) condition-broadcast)) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index 2669ff2ea3..a297c3455e 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -11,6 +11,16 @@ (in-package "SB-THREAD") +;;; It's possible to make futex/non-futex switchable at runtime by ensuring that +;;; these synchronization primitive structs contain all the slots for the union +;;; of any kind of backing object. Some of the #+sb-futex/#-sb-futex cases in +;;; target-thread also have to be changed to a COND rather than a compile-time test. +;;; Among the uses of this would be to test real posix mutexes (with a finalizer on +;;; each lisp-side proxy) or support older C APIs. Posix mutexes work nicely now +;;; because finalizers are more efficient than they were, and when many threads +;;; compete for a mutex, the pthread code seems to do a better job at reducing +;;; cycles spent in the OS. + ;;; N.B.: If you alter this definition, then you need to verify that FOP-FUNCALL ;;; in genesis can properly emulate MAKE-MUTEX for the altered structure, ;;; or even better, make sure that genesis can emulate any constructor, @@ -24,7 +34,6 @@ (name nil :type (or null simple-string)) (%owner nil :type (or null thread))) -#+(or (not sb-thread) sb-futex) (sb-xc:defstruct (waitqueue (:copier nil) (:constructor make-waitqueue (&key name))) "Waitqueue type." ;; futex words are actually 32-bits, but it needs to be a raw slot and we don't have @@ -32,20 +41,14 @@ #+sb-futex (token 0 :type sb-ext:word) ;; If adding slots between TOKEN and NAME, please see futex_name() in linux_os.c ;; which attempts to divine a string from a futex word address. - (name nil :type (or null string))) - -#+(and sb-thread (not sb-futex)) -(sb-xc:defstruct (waitqueue (:copier nil) (:constructor make-waitqueue (&key name))) - "Waitqueue type." (name nil :type (or null string)) ;; For WITH-CAS-LOCK: because CONDITION-WAIT must be able to call ;; %WAITQUEUE-WAKEUP without re-aquiring the mutex, we need a separate ;; lock. In most cases this should be uncontested thanks to the mutex -- ;; the only case where that might not be true is when CONDITION-WAIT ;; unwinds and %WAITQUEUE-DROP is called. - %owner - %head - %tail) + . #+sb-futex nil + #-sb-futex (%owner %head %tail)) (sb-xc:defstruct (semaphore (:copier nil) (:constructor %make-semaphore (%count mutex queue))) From 1a30081f6b45dc67fabe53a9cd3115366087d678 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 1 Sep 2020 16:30:52 -0400 Subject: [PATCH 0468/4023] Untabify --- src/runtime/win32-os.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 88dff2fdf5..38d0f2da6b 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -663,9 +663,9 @@ int os_preinit(char *argv[], char *envp[]) fprintf(stderr, "This binary was compiled for Windows 8 or later but you appear to be" " using 7 or earlier.\nRecompiling SBCL from source on the older release will" " probably work. See also\n" - "https://support.microsoft.com/en-us/help/4057281/windows-7-support-ended-on-january-14-2020\n"); - fflush(stderr); - exit(1); + "https://support.microsoft.com/en-us/help/4057281/windows-7-support-ended-on-january-14-2020\n"); + fflush(stderr); + exit(1); } #endif InitializeCriticalSection(&code_allocator_lock); From 5a9ccf448deeb7f94d9815c811fe35a066d726d5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Tue, 1 Sep 2020 18:52:51 -0400 Subject: [PATCH 0469/4023] win32: Eradicate more suspicious code pthread_self() is a function in minGW, so in the interest of readability it is best to be totally obvious that we're using "our" one. pthread_kill() is also in minGW but all it does is return ESRCH or EINVAL. --- src/code/target-thread.lisp | 1 + src/runtime/pthreads_win32.c | 37 +++++------------------------------- src/runtime/pthreads_win32.h | 12 +++--------- src/runtime/runtime.h | 9 ++++++--- src/runtime/safepoint.c | 2 -- src/runtime/thread.c | 25 ++++++++++++++++++++---- src/runtime/traceroot.c | 2 +- src/runtime/win32-os.c | 2 +- 8 files changed, 38 insertions(+), 52 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index a8f12adccf..ca934c31d4 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -2117,6 +2117,7 @@ subject to change." ;; If no threads, pthread_kill() won't exist since we didn't link with -lpthread. ;; And raise() - as we use it - can't fail, so just ignore the result. ;; (The signal number is always SIGPIPE or SIGINT, and the process is obviously not dead) + ;; This isn't used on win32 so we don't need to change the symbol to sb_pthr_kill there. #-sb-thread `(raise ,signal) #+sb-thread `(unless (= 0 (alien-funcall (extern-alien "pthread_kill" diff --git a/src/runtime/pthreads_win32.c b/src/runtime/pthreads_win32.c index 778fb07d62..84533059ec 100644 --- a/src/runtime/pthreads_win32.c +++ b/src/runtime/pthreads_win32.c @@ -12,33 +12,11 @@ DWORD thread_self_tls_index; +#define thread_self() ((pthread_t)TlsGetValue(thread_self_tls_index)) void set_thread_self(pthread_t thread) { TlsSetValue(thread_self_tls_index, thread); } -/* Thread identity, as much as pthreads are concerned, is determined - by pthread_t structure that is stored in TLS slot - (thread_self_tls_index). This slot is reassigned when fibers are - switched with pthread_np API. - - Two reasons for not using fiber-local storage for this purpose: (1) - Fls is too young: all other things work with Win2000, it requires - WinXP; (2) this implementation works also with threads that aren't - fibers, and it's a good thing. - - There is one more case, besides fiber switching, when pthread_self - identity migrates between system threads: for non-main system - thread that is not [pthread_create]d, thread-specific data - destructors run in a thread from a system thread pool, after the - original thread dies. In order to provide compatibility with - classic pthread TSD, the system pool thread acquires dead thread's - identity for the duration of destructor calls. -*/ -pthread_t pthread_self() -{ - return (pthread_t)TlsGetValue(thread_self_tls_index); -} - /* Thread function for [pthread_create]d threads. */ /* Signals */ @@ -57,15 +35,10 @@ int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact) return 0; } -int pthread_equal(pthread_t thread1, pthread_t thread2) -{ - return thread1 == thread2; -} - /* TODO call signal handlers */ int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset) { - pthread_t self = pthread_self(); + pthread_t self = thread_self(); if (oldset) *oldset = self->blocked_signal_set; if (set) { @@ -104,7 +77,7 @@ void pthread_np_add_pending_signal(pthread_t thread, int signum) * DFL: ... or so the original comment claimed, but that was before * futexes. Now that we wake up futexes, it's not entirely accurate * anymore, is it? */ -int pthread_kill(pthread_t thread, int signum) +int sb_pthr_kill(pthread_t thread, int signum) { pthread_np_add_pending_signal(thread,signum); return 0; @@ -153,7 +126,7 @@ VOID CALLBACK pthreads_win32_unnotice(void* parameter, BOOLEAN timerOrWait) int pthread_np_notice_thread() { - if (!pthread_self()) { + if (!thread_self()) { pthread_t pth = (pthread_t)calloc(sizeof(pthread_thread),1); pth->teb = NtCurrentTeb(); @@ -206,7 +179,7 @@ int sigismember(const sigset_t *set, int signum) } int sigpending(sigset_t *set) { - *set = InterlockedCompareExchange((volatile LONG*)&pthread_self()->pending_signal_set, + *set = InterlockedCompareExchange((volatile LONG*)&thread_self()->pending_signal_set, 0, 0); return 0; } diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index 29b556a721..090911c834 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -56,14 +56,7 @@ void pthreads_win32_init(); typedef struct pthread_thread* pthread_t; -int pthread_equal(pthread_t thread1, pthread_t thread2); -int pthread_kill(pthread_t thread, int signum); - -#ifndef PTHREAD_INTERNALS -pthread_t pthread_self(void) __attribute__((__const__)); -#else -pthread_t pthread_self(void); -#endif +int sb_pthr_kill(pthread_t thread, int signum); extern DWORD thread_self_tls_index; @@ -136,9 +129,10 @@ int sigismember(const sigset_t *set, int signum); typedef int sig_atomic_t; #ifndef PTHREAD_INTERNALS +#define thread_self() ((pthread_t)TlsGetValue(thread_self_tls_index)) static inline int _sbcl_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset) { - pthread_t self = pthread_self(); + pthread_t self = thread_self(); if (oldset) *oldset = self->blocked_signal_set; if (set) { diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 9b5ecc6d86..cbb416765a 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -28,11 +28,11 @@ #include #if defined(LISP_FEATURE_SB_THREAD) -#define thread_self() pthread_self() -#define thread_equal(a,b) pthread_equal(a,b) -#define thread_kill pthread_kill #ifdef LISP_FEATURE_WIN32 +#define thread_self() ((pthread_t)TlsGetValue(thread_self_tls_index)) +#define thread_equal(a,b) ((a)==(b)) +#define thread_kill sb_pthr_kill #define thread_sigmask _sbcl_pthread_sigmask // wrap CriticalSection operators in a function returning 0 to satisfy assertions static inline int cs_mutex_lock(void* l) { EnterCriticalSection(l); return 0; } @@ -40,6 +40,9 @@ static inline int cs_mutex_unlock(void* l) { LeaveCriticalSection(l); return 0; #define thread_mutex_lock(l) cs_mutex_lock(l) #define thread_mutex_unlock(l) cs_mutex_unlock(l) #else +#define thread_self() pthread_self() +#define thread_equal(a,b) pthread_equal(a,b) +#define thread_kill pthread_kill #define thread_sigmask pthread_sigmask #define thread_mutex_lock(l) pthread_mutex_lock(l) #define thread_mutex_unlock(l) pthread_mutex_unlock(l) diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 768d268dcd..8fa67ed2c4 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -921,8 +921,6 @@ wake_thread_io(struct thread * thread) void wake_thread_win32(struct thread *thread) { - struct thread *self = arch_os_get_current_thread(); - wake_thread_io(thread); if (read_TLS(THRUPTION_PENDING,thread)==T) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 269d6994b2..84b1ca44f5 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -632,7 +632,7 @@ attach_os_thread(init_thread_data *scribble) #endif th->os_kernel_tid = get_nonzero_tid(); - th->os_thread = pthread_self(); + th->os_thread = thread_self(); #if !defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) /* On windows, arch_os_thread_init will take care of finding the @@ -1254,21 +1254,38 @@ kill_safely(os_thread_t os_thread, int signal) /* From the linux man page on pthread_self() - * "variables of type pthread_t can't portably be compared using * the C equality operator (==); use pthread_equal(3) instead." */ - if (thread_equal(os_thread, pthread_self())) { - pthread_kill(os_thread, signal); + if (thread_equal(os_thread, thread_self())) { + thread_kill(os_thread, signal); #ifdef LISP_FEATURE_WIN32 check_pending_thruptions(NULL); #endif return 0; } + /* There are two problems with the comment below this one. + * + * - "... is not async signal safe" is based on obsolete information. + * https://www.man7.org/linux/man-pages/man7/signal-safety.7.html lists + * pthread_kill(3) Added in POSIX.1-2008 TC1 + * + * - the comment is likely mistaken about the meaning of async-signal-safe: + * "An async-signal-safe function is one that can be safely called + * from within a signal handler." + * which is not what's happening here. Or should not be anyway, + * though in fact it would be async-signal safe, while ironically + * pthread_mutex_lock would NOT be safe. + * i.e. we had better not be in a signal handler. + * + * But kill_safely() is all kinds of bad, and shouldn't really be used. + */ + /* pthread_kill is not async signal safe and we don't want to be * interrupted while holding the lock. */ block_deferrable_signals(&oldset); thread_mutex_lock(&all_threads_lock); for (thread = all_threads; thread; thread = thread->next) { if (thread->os_thread == os_thread) { - int status = pthread_kill(os_thread, signal); + int status = thread_kill(os_thread, signal); if (status) lose("kill_safely: pthread_kill failed with %d", status); #if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THRUPTION) diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index bcd7dd62de..ddd3134646 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -1083,7 +1083,7 @@ struct vector* lisp_thread_name(os_thread_t os_thread) { struct thread* th; for_each_thread (th) { - if (pthread_equal(os_thread, th->os_thread)) { + if (thread_equal(os_thread, th->os_thread)) { struct thread_instance *lispthread = (void*)native_pointer(th->lisp_thread); return VECTOR(lispthread->name); } diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 38d0f2da6b..1bf3d66eac 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -1450,7 +1450,7 @@ veh(EXCEPTION_POINTERS *ep) EXCEPTION_DISPOSITION disp; RESTORING_ERRNO() { - if (!pthread_self()) + if (!thread_self()) return EXCEPTION_CONTINUE_SEARCH; } From 19e6e711f791763a7659d5f3a4204605f1ad6493 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 2 Sep 2020 13:13:32 -0400 Subject: [PATCH 0470/4023] Remove obsolete comment The 'readonlyspace hack' seems to have gone away in a41c057bfe9d8. So any reason for doing a "make clean" has to be justified some other way, like it's generally a good idea, maybe? --- make-target-1.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/make-target-1.sh b/make-target-1.sh index 81b4281b93..5042e9ba62 100755 --- a/make-target-1.sh +++ b/make-target-1.sh @@ -43,7 +43,6 @@ fi # is its generation left enabled even for those builds. echo //building runtime system and symbol table file -# The clean is needed for Darwin's readonlyspace hack. $GNUMAKE -C src/runtime clean # $GNUMAKE -C src/runtime depend $GNUMAKE $SBCL_MAKE_JOBS -C src/runtime all From 61d7b716013c5e477eccd3b64408eba2de8c03fe Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 2 Sep 2020 14:07:27 -0400 Subject: [PATCH 0471/4023] Finish implementing OS-visible thread names Due to the wildly different APIs, move all the code into C because I'd prefer a link-time error if this is out-of-whack with reality. Also fixes bug reported by Eric Timmons (https://groups.google.com/forum/#!msg/sbcl-devel/-zybOfVzOrs/ENmGkhiZAgAJ) --- src/code/target-thread.lisp | 11 ----------- src/runtime/gencgc.c | 19 +++++++++++-------- src/runtime/thread.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index ca934c31d4..49d5bf7a36 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1797,17 +1797,6 @@ session." #+sb-thread (thread-trampoline-defining-macro (set-thread-control-stack-slots *current-thread*) - #+linux (let ((name (thread-name *current-thread*))) - ;; "The thread name is a meaningful C language string, whose length is - ;; restricted to 16 characters, including the terminating null byte ('\0'). - ;; The pthread_setname_np() function can fail with the following error: - ;; ERANGE The length of the string ... exceeds the allowed limit." - (when (and (typep name 'simple-base-string) (<= (length name) 15)) - (with-pinned-objects (name) - (alien-funcall (extern-alien "pthread_setname_np" - (function int unsigned system-area-pointer)) - (thread-os-thread *current-thread*) - (vector-sap name))))) ;; Using handling-end-of-the-world would be a bit tricky ;; due to other catches and interrupts, so we essentially ;; re-implement it here. Once and only once more. diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 930d97a6fc..05baeb0579 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3526,8 +3526,8 @@ garbage_collect_generation(generation_index_t generation, int raise) #ifdef STARTING_THREADS lispobj pin_list = SYMBOL(STARTING_THREADS)->value; for ( ; pin_list != NIL ; pin_list = CONS(pin_list)->cdr ) { - lispobj lispthread = CONS(pin_list)->car; - // It would be tempting to say that only the SB-THREAD:THREAD instance + lispobj thing = CONS(pin_list)->car; + // It might be tempting to say that only the SB-THREAD:THREAD instance // requires pinning - because right after we access it to extract the // primitive thread, we link into all_threads - but it may be that the code // emitted by the C compiler in new_thread_trampoline computes untagged pointers @@ -3535,18 +3535,21 @@ garbage_collect_generation(generation_index_t generation, int raise) // seen as valid lisp pointers by the implicit pinning logic. // And the precisely GC'd platforms would not pin anything from C code. // The tests in 'threads.impure.lisp' are good at detecting omissions here. - if (lispthread) { - gc_assert(instancep(lispthread)); - pin_exact_root(lispthread); - lispobj info = ((struct thread_instance*) - (lispthread-INSTANCE_POINTER_LOWTAG))->startup_info; - if (info) { + if (thing) { // Nothing to worry about when 'thing' is already smashed + gc_assert(instancep(thing)); + struct thread_instance *lispthread = (void*)(thing - INSTANCE_POINTER_LOWTAG); + lispobj info = lispthread->startup_info; + // INFO gets set to a fixnum when the thread is exiting. I *think* it won't + // ever be seen in the starting-threads list, but let's be cautious. + if (is_lisp_pointer(info)) { gc_assert(simple_vector_p(info)); gc_assert(VECTOR(info)->length >= make_fixnum(1)); lispobj fun = VECTOR(info)->data[0]; gc_assert(functionp(fun)); + pin_exact_root(thing); pin_exact_root(info); pin_exact_root(fun); + pin_exact_root(lispthread->name); } } } diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 84b1ca44f5..8bc7497dc5 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -9,6 +9,9 @@ * files for more information. */ +#ifdef __linux__ +#define _GNU_SOURCE // for pthread_setname_np() +#endif #include "sbcl.h" #include @@ -493,6 +496,40 @@ void* new_thread_trampoline(void* arg) // 'th->lisp_thread' remains valid despite not being in all_threads // due to the pinning via *STARTING-THREADS*. struct thread_instance *lispthread = (void*)native_pointer(th->lisp_thread); + + /* Potentially set the externally-visible name of this thread, + * and for a whole pile of crazy, look at get_max_thread_name_length_impl() in + * https://github.com/llvm-mirror/llvm/blob/394ea6522c69c2668bf328fc923e1a11cd785265/lib/Support/Unix/Threading.inc + * which among other things, suggests that Linux might not even have the syscall */ + lispobj name = lispthread->name; // pinned + if (other_pointer_p(name) && + header_widetag(VECTOR(name)->header) == SIMPLE_BASE_STRING_WIDETAG) { +#ifdef LISP_FEATURE_LINUX + /* "The thread name is a meaningful C language string, whose length is + * restricted to 16 characters, including the terminating null byte ('\0'). + * The pthread_setname_np() function can fail with the following error: + * ERANGE The length of the string ... exceeds the allowed limit." */ + if (fixnum_value(VECTOR(name)->length) <= 15) + pthread_setname_np(pthread_self(), (char*)VECTOR(name)->data); +#endif +#ifdef LISP_FEATURE_NETBSD + /* This constant is an upper bound on the length including the NUL. + * Exceeding it will fail the call. It happens to be 32. + * Also, don't want to printf-format a name containing a '%' */ + if (fixnum_value(VECTOR(name)->length) < PTHREAD_MAX_NAMELEN_NP) + pthread_setname_np(pthread_self(), "%s", (char*)VECTOR(name)->data); +#endif +#if defined LISP_FEATURE_FREEBSD || defined LISP_FEATURE_OPENBSD + /* Some places document that the length limit is either 16 or 32, + * but my testing showed that 12.1 seems to accept any length */ + pthread_set_name_np(pthread_self(), (char*)VECTOR(name)->data); +#endif +#ifdef LISP_FEATURE_DARWIN + if (fixnum_value(VECTOR(name)->length) < 64) + pthread_setname_np((char*)VECTOR(name)->data); +#endif + } + struct vector* startup_info = VECTOR(lispthread->startup_info); // 'lispthread' is pinned gc_assert(header_widetag(startup_info->header) == SIMPLE_VECTOR_WIDETAG); lispobj startfun = startup_info->data[0]; // 'startup_info' is pinned From 2d97f047a49c4eed38ee5eac1790b6907c43080c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 2 Sep 2020 17:28:49 -0400 Subject: [PATCH 0472/4023] Reduce number of ways to build SBCL * Disallow (AND :SB-SAFEPOINT (NOT :SB-THREAD)) If there is only one thread, there is no use for a ridiculously intricate state machine to decide when "all" threads are in a safe state for GC. * Disallow (AND :SB-THRUPTION (NOT :SB-SAFEPOINT)) The idea with sb-thruption is that lacking POSIX signals, threads poll at GC safepoints whether INTERRUPT-THREAD was invoked. But INSERT-SAFEPOINT happens only if sb-safepoint. No safepoints = no interrupt polling. --- src/code/target-thread.lisp | 6 +++--- src/cold/shared.lisp | 2 ++ src/runtime/thread.c | 33 ++++----------------------------- tests/signals.impure.lisp | 9 ++++----- 4 files changed, 13 insertions(+), 37 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 49d5bf7a36..6bbe80a27f 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -407,7 +407,7 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (sb-ext:define-load-time-global *starting-threads* nil) (declaim (list *starting-threads*)) ; list of threads -#+(or sb-safepoint sb-thruption) +#+sb-safepoint (define-alien-routine "wake_thread" int (os-thread unsigned)) @@ -2271,7 +2271,7 @@ Short version: be careful out there." ;; which prevents thread exit since a thread needs to briefly acquire ;; that lock just prior to exit. - #-(or sb-safepoint sb-thruption) ; Good way + #-sb-safepoint ; Good way (unless (with-os-thread (os-thread thread) (enqueue nil) (pthread-kill os-thread sb-unix:sigpipe) @@ -2281,7 +2281,7 @@ Short version: be careful out there." ;; Shiat way: call to C to acquire the all_threads lock and scan all_threads. ;; Beyond that there's the question of why INVOKED is ever set/examined. Seems fubar. ;; I have no friggin idea how sb-thruption is supposed to work. - #+(or sb-safepoint sb-thruption) + #+sb-safepoint (let ((os-thread ;; This causes an extra acquire/release cycle, and potentially conses a bignum ;; to hold a word. diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 00fc436360..39cfa933d4 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -296,6 +296,8 @@ ":SB-THREAD requires :GENCGC") ("(and pauseless-threadstart (not sb-thread))" ":PAUSELESS-THREADSTART requires :SB-THREAD") + ("(and sb-safepoint (not sb-thread))" ":SB-SAFEPOINT requires :SB-THREAD") + ("(and sb-thruption (not sb-safepoint))" ":SB-THRUPTION requires :SB-SAFEPOINT") ("(and sb-thread (not (or riscv ppc ppc64 x86 x86-64 arm64)))" ":SB-THREAD not supported on selected architecture") ("(and gencgc cheneygc)" diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 8bc7497dc5..20a6dd7b72 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -1239,7 +1239,7 @@ thread_yield() // there is a perfectly fine way of detecting validity of a pthread ID, // and even the link below to Ulrich Drepper's blog post says exactly what // to do. So why does this have anything to do with the all_threads_lock??? -#if defined LISP_FEATURE_SB_THRUPTION || defined LISP_FEATURE_SB_SAFEPOINT +#ifdef LISP_FEATURE_SB_SAFEPOINT int wake_thread(os_thread_t os_thread) { @@ -1272,8 +1272,9 @@ int kill_safely(os_thread_t os_thread, int signal) { FSHOW_SIGNAL((stderr,"/kill_safely: %lu, %d\n", os_thread, signal)); - { -#ifdef LISP_FEATURE_SB_THREAD + + // This indentation is wrong, but the code is cringey anyway + sigset_t oldset; struct thread *thread; /* Frequent special case: resignalling to self. The idea is @@ -1337,31 +1338,5 @@ kill_safely(os_thread_t os_thread, int signal) return 0; else return -1; -#elif defined(LISP_FEATURE_WIN32) - return 0; -#else - int status; - if (os_thread != 0) - lose("kill_safely: who do you want to kill? %d?", os_thread); - /* Dubious (as in don't know why it works) workaround for the - * signal sometimes not being generated on darwin. */ -#ifdef LISP_FEATURE_DARWIN - { - sigset_t oldset; - sigprocmask(SIG_BLOCK, &deferrable_sigset, &oldset); - status = raise(signal); - sigprocmask(SIG_SETMASK,&oldset,0); - } -#else - status = raise(signal); -#endif - if (status == 0) { - return 0; - } else { - lose("cannot raise signal %d, %d %s", - signal, status, strerror(errno)); - } -#endif - } } #endif diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index ba0df22312..0007adeb36 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -64,7 +64,7 @@ (loop until returning) (assert (= saved-errno (sb-unix::get-errno))))) -#+(or sb-safepoint sb-thruption) +#+sb-safepoint (sb-alien:define-alien-routine "kill_safely" int (sb-thread::os-thread unsigned) @@ -80,11 +80,10 @@ (assert (eq :condition (handler-case (progn - ;; KILL-SAFELY has C code for it only if (OR :SB-SAFEPOINT :SB-THRUPTION), + ;; KILL-SAFELY exists only if :SB-SAFEPOINT, ;; otherwise we directly call a POSIX function. - #+(or sb-safepoint sb-thruption) (kill-safely (current-thread-os-thread) - sb-unix:sigint) - #-(or sb-safepoint sb-thruption) (sb-thread::raise sb-unix:sigint) + #+sb-safepoint (kill-safely (current-thread-os-thread) sb-unix:sigint) + #-sb-safepoint (sb-thread::raise sb-unix:sigint) #+sb-safepoint-strictly ;; In this case, the signals handler gets invoked ;; indirectly through an INTERRUPT-THREAD. Give it From 3a3557c335a61b26c7b4ee0362a5406f3ca63420 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 2 Sep 2020 21:49:57 -0400 Subject: [PATCH 0473/4023] Simplify a test kill_safely was trying to do two things: (1) ensure validity of a thread ID, (2) involve the safepoint-based interrupt (a/k/a sb-thruption) mechanism. Except on POSIX it doesn't do the latter, and the special-case for signaling the current thread is identical to just calling pthread_kill. --- tests/signals.impure.lisp | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index 0007adeb36..9cf35831c7 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -64,26 +64,19 @@ (loop until returning) (assert (= saved-errno (sb-unix::get-errno))))) -#+sb-safepoint -(sb-alien:define-alien-routine "kill_safely" - int - (sb-thread::os-thread unsigned) - (signal int)) -(defun current-thread-os-thread () - #+sb-thread (sb-thread::thread-os-thread sb-thread:*current-thread*) - #-sb-thread 0) - ;; It is desirable to support C-c on Windows, but SIGINT ;; is not the mechanism to use on this platform. +;; This test used to call kill_safely() in the C runtime if using safepoints, +;; and perhaps at some point kill_safely() interacted with the safepoint state +;; for POSIX (i.e. not win32), but it doesn't, at least not now. +;; The special case in kill_safely() for the current thread is pthread_kill() +;; and not a thing more, unless on win32, which skips this test. #-win32 (with-test (:name :handle-interactive-interrupt) (assert (eq :condition (handler-case (progn - ;; KILL-SAFELY exists only if :SB-SAFEPOINT, - ;; otherwise we directly call a POSIX function. - #+sb-safepoint (kill-safely (current-thread-os-thread) sb-unix:sigint) - #-sb-safepoint (sb-thread::raise sb-unix:sigint) + (sb-thread::raise sb-unix:sigint) #+sb-safepoint-strictly ;; In this case, the signals handler gets invoked ;; indirectly through an INTERRUPT-THREAD. Give it From 9b9dbd9f396bf73dd2cf00f65af052ca6f2cf9b7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Wed, 2 Sep 2020 22:22:51 -0400 Subject: [PATCH 0474/4023] Fix some C warnings on macOS w/o sb-thread Not including pthread.h meant a missing prototype for pthread_getspecific, except that it worked nonetheless because of default libraries. There are still warnings about int-to-pointer casting, as noted. --- src/runtime/interrupt.c | 4 ++-- src/runtime/runtime.h | 14 ++++++++++++++ src/runtime/thread.c | 4 ++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index e5e7b58a5a..e5d520c046 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -178,7 +178,7 @@ static void sigmask_logandc(sigset_t *dest, const sigset_t *source) * work for SIGSEGV and similar. It is good enough for timers, and * maybe all deferrables. */ -#ifdef LISP_FEATURE_DARWIN +#if defined LISP_FEATURE_DARWIN && defined LISP_FEATURE_SB_THREAD pthread_key_t sigwait_bug_mitigation; int sigwait_bug_mitigation_count; #endif @@ -189,7 +189,7 @@ int sigwait_bug_mitigation_count; static void resignal_to_lisp_thread(int signal, os_context_t *context) { -#ifdef LISP_FEATURE_DARWIN +#if defined LISP_FEATURE_DARWIN && defined LISP_FEATURE_SB_THREAD if (signal == SIG_STOP_FOR_GC && pthread_getspecific(sigwait_bug_mitigation)) { // fprintf(stderr, "ignored a STOP_FOR_GC signal\n"); __sync_fetch_and_add(&sigwait_bug_mitigation_count, 1); diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index cbb416765a..5dac1f0cb5 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -217,6 +217,20 @@ typedef signed int s32; #if defined(LISP_FEATURE_SB_THREAD) typedef pthread_t os_thread_t; #else +// this is subtly wrong and I do not care enough to fix it. +// why is it wrong? Because the autogenerated "src/runtime/genesis/thread.h" +// assumes that every field takes up 1 word (or more). However the os_thread field +// on a 64-bit build with a 4-byte pid_t is undersized by 4 bytes. +// Thanks to ABI alignment requirements, the C compiler is obliged to insert +// 4 padding bytes (which are inaccessible). +// There's another problem though, which is that in error messages we often +// want to cast thread->os_thread to a (void*) so that it can be formatted +// using "%p" (which is technically wrong anyway). But casting a 4-byte +// integer to a pointer gets +// "cast to 'void *' from smaller integer type 'os_thread_t'" +// which is how I discovered this problem in the first place. +// I think the right solution would be to define the field in 'struct thread' +// as having type uword_t, not os_thread_t. typedef pid_t os_thread_t; #endif diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 20a6dd7b72..afdab25458 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -242,7 +242,7 @@ void* get_current_vm_thread() { } #endif -#ifdef LISP_FEATURE_DARWIN +#if defined LISP_FEATURE_DARWIN && defined LISP_FEATURE_SB_THREAD extern pthread_key_t sigwait_bug_mitigation; #endif @@ -257,7 +257,7 @@ void create_main_lisp_thread(lispobj function) { #if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_GCC_TLS && !defined LISP_FEATURE_WIN32 pthread_key_create(&specials, 0); #endif -#ifdef LISP_FEATURE_DARWIN +#if defined LISP_FEATURE_DARWIN && defined LISP_FEATURE_SB_THREAD pthread_key_create(&sigwait_bug_mitigation, 0); #endif #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) From 47e1d01db927d47e5ea43b34f00f8735b84c1ab1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 3 Sep 2020 13:53:00 -0400 Subject: [PATCH 0475/4023] Avoid freeing a wild pointer Calling pthread_attr_destroy() on attributes that were never initialized but filled with random stack bits can crash in a free() in libpthread at: int __pthread_attr_destroy (pthread_attr_t *attr) { ... free (iattr->cpuset); --- src/runtime/thread.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index afdab25458..ecd334a8b0 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -691,6 +691,7 @@ attach_os_thread(init_thread_data *scribble) stack_addr = (char*)pthread_get_stackaddr_np(th->os_thread) - stack_size; # else pthread_attr_t attr; + pthread_attr_init(&attr); # if defined LISP_FEATURE_FREEBSD || defined LISP_FEATURE_DRAGONFLY pthread_attr_get_np(th->os_thread, &attr); # else From 2182468be9fe613492bd8210554fd23abfb8af9f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Thu, 3 Sep 2020 18:07:02 -0400 Subject: [PATCH 0476/4023] Remove unused function --- src/runtime/traceroot.c | 17 ----------------- tests/threads.impure.lisp | 10 ---------- 2 files changed, 27 deletions(-) diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index ddd3134646..c4f490ba79 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -1074,20 +1074,3 @@ int prove_liveness(lispobj objects, int criterion) extern int gc_n_stack_pins; return gc_prove_liveness(0, objects, gc_n_stack_pins, pinned_objects.keys, criterion); } - -#ifdef LISP_FEATURE_SB_THREAD -/// Given a pthread identifier, return the lisp thread's string name. -/// Caveat emptor: This doesn't acquire the all_threads_lock. -/// Ironically perhaps, 'traceroot' no longer uses this, but it's nice to have. -struct vector* lisp_thread_name(os_thread_t os_thread) -{ - struct thread* th; - for_each_thread (th) { - if (thread_equal(os_thread, th->os_thread)) { - struct thread_instance *lispthread = (void*)native_pointer(th->lisp_thread); - return VECTOR(lispthread->name); - } - } - return 0; -} -#endif diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 41924c074a..f860f43c67 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -74,16 +74,6 @@ #-sb-thread (sb-ext:exit :code 104) -(with-test (:name :thread-name-from-pthread) - (let* ((pthread (sb-thread::thread-os-thread sb-thread:*current-thread*)) - (string-data-sap - (alien-funcall (extern-alien "lisp_thread_name" - (function system-area-pointer unsigned)) - pthread))) - (assert (sap= (sb-sys:sap+ (vector-sap (sb-thread:thread-name sb-thread:*current-thread*)) - (* -2 sb-vm:n-word-bytes)) - string-data-sap)))) - ;;;; Now the real tests... (with-test (:name (with-mutex :timeout)) From a3bf5c9e70d3b3e6fc9a0ce8996405c2283cff28 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 4 Sep 2020 09:38:49 -0400 Subject: [PATCH 0477/4023] Mostly deal with the "I don't care" claim Now we're only wrong in #+sb-thread if pthread_t is 4 bytes on a 64-bit system. --- src/compiler/generic/objdef.lisp | 9 ++++++++- src/runtime/runtime.h | 18 +----------------- src/runtime/thread.h | 3 +-- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index 8cb0ed5ba3..8955227397 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -486,9 +486,16 @@ during backtrace. ;; "IEEE Std 1003.1-2001/Cor 2-2004, item XBD/TC2/D6/26 is applied, ;; adding pthread_t to the list of types that are not required to be arithmetic ;; types, thus allowing pthread_t to be defined as a structure." + ;; + ;; Furthermore, it is technically possibly for a pthread_t to be smaller than a word + ;; (a 4-byte identifier, not a pointer, on 64-bit) but that seems not to be true + ;; for any system that we care about. + ;; ;; And this slot is badly named, it should be "Pthread" since it's the POSIX ;; (or emulated POSIX) thread object, not necessarily the OS's thread notion. - (os-thread :c-type "os_thread_t") + ;; + ;; For #-sb-thread, we don't define os_thread_t at all. + (os-thread :c-type #+sb-thread "os_thread_t" #-sb-thread "lispobj") ;; Keep this first bunch of slots from binding-stack-pointer through alloc-region ;; near the beginning of the structure so that x86[-64] assembly code diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 5dac1f0cb5..59697ffdd4 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -214,24 +214,8 @@ typedef signed int s32; #include -#if defined(LISP_FEATURE_SB_THREAD) +#ifdef LISP_FEATURE_SB_THREAD typedef pthread_t os_thread_t; -#else -// this is subtly wrong and I do not care enough to fix it. -// why is it wrong? Because the autogenerated "src/runtime/genesis/thread.h" -// assumes that every field takes up 1 word (or more). However the os_thread field -// on a 64-bit build with a 4-byte pid_t is undersized by 4 bytes. -// Thanks to ABI alignment requirements, the C compiler is obliged to insert -// 4 padding bytes (which are inaccessible). -// There's another problem though, which is that in error messages we often -// want to cast thread->os_thread to a (void*) so that it can be formatted -// using "%p" (which is technically wrong anyway). But casting a 4-byte -// integer to a pointer gets -// "cast to 'void *' from smaller integer type 'os_thread_t'" -// which is how I discovered this problem in the first place. -// I think the right solution would be to define the field in 'struct thread' -// as having type uword_t, not os_thread_t. -typedef pid_t os_thread_t; #endif typedef uintptr_t uword_t; diff --git a/src/runtime/thread.h b/src/runtime/thread.h index c68bca2116..07618d171e 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -44,8 +44,6 @@ void** os_get_csp(struct thread* th); void assert_on_stack(struct thread *th, void *esp); #endif /* defined(LISP_FEATURE_SB_SAFEPOINT) */ -extern int kill_safely(os_thread_t os_thread, int signal); - #define THREAD_SLOT_OFFSET_WORDS(c) \ (offsetof(struct thread,c)/(sizeof (struct thread *))) @@ -79,6 +77,7 @@ extern int dynamic_values_bytes; #ifdef LISP_FEATURE_SB_THREAD +extern int kill_safely(os_thread_t os_thread, int signal); #define for_each_thread(th) for(th=all_threads;th;th=th->next) #else /* there's some possibility a SSC could notice this never actually From 44d9295b0bca5873099d0425474c2e4e7b125fc7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 4 Sep 2020 16:49:17 -0400 Subject: [PATCH 0478/4023] Remove/fix/comment many thread-related weirdosities * Don't add any slots to 'struct thread' for semaphores. Just access all that stuff where it is immediately following the lisp TLS. * thread_state() can be replaced with a much cheaper cmpxchg to get load-with-acquire semantics, vs. two syscalls and two semaphore calls. * thread_state doesn't need a mutex while reading it from the thread whose state it is, except when start_the_world sets other threads' states, in which case those threads have semaphore operations acting as barriers, so still no explicit mutex protecting the state is needed. * thread_state doesn't need to be be represented as a fixnum. * ESRCH in stop_the_world indicates major lossage, and not a special case to be worked around. * use for_each_thread() macro where pertinent. --- src/compiler/generic/objdef.lisp | 10 -- src/runtime/interrupt.c | 33 +++-- src/runtime/thread.c | 208 ++++++++++++++++--------------- src/runtime/thread.h | 26 ++-- 4 files changed, 144 insertions(+), 133 deletions(-) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index 8955227397..4779fcd3a8 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -540,16 +540,6 @@ during backtrace. (binding-stack-start :c-type "lispobj *" :pointer t :special *binding-stack-start*) - #+(and sb-thread (not sb-safepoint)) - (state-sem :c-type "os_sem_t *" :pointer t) - #+(and sb-thread (not sb-safepoint)) - (state-not-running-sem :c-type "os_sem_t *" :pointer t) - #+(and sb-thread (not sb-safepoint)) - (state-not-running-waitcount :c-type "int" :length 1) - #+(and sb-thread (not sb-safepoint)) - (state-not-stopped-sem :c-type "os_sem_t *" :pointer t) - #+(and sb-thread (not sb-safepoint)) - (state-not-stopped-waitcount :c-type "int" :length 1) (control-stack-start :c-type "lispobj *" :pointer t :special *control-stack-start*) (control-stack-end :c-type "lispobj *" :pointer t diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index e5d520c046..991734d21a 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1386,13 +1386,16 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, thread->interrupt_data->gc_blocked_deferrables = 0; } - if(thread_state(thread)!=STATE_RUNNING) { - // macOS warns if OBJ_FMTX is used to format a 'sword_t' - // which fixnum_value() returns. - lose("sig_stop_for_gc_handler: wrong thread state: %"OBJ_FMTX, - (lispobj)fixnum_value(thread->state)); - } - + /* No need to use an atomic memory load here - this thead "owns" its state + * for now, and nobody else touches it, the sole exception being that GC + * sets it to RUNNING. The loads inside thread_wait_until_not() + * are slightly more interesting from that perspective */ + if (thread->state != STATE_RUNNING) + lose("stop_for_gc: bad thread state: %x", (int)thread->state); + + /* We say that the thread is "stopped" as of now, but the blocking operation + * occurs below at thread_wait_until_not(STATE_STOPPED). Note that sem_post() + * is expressly permitted in signal handlers, and set_thread_state uses it */ set_thread_state(thread, STATE_STOPPED, 0); FSHOW_SIGNAL((stderr,"suspended\n")); @@ -1402,13 +1405,19 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, * actually a must. */ scrub_control_stack(); - wait_for_thread_state_change(thread, STATE_STOPPED); + /* Now we wait on a semaphore, which, to be pedantic, is not specified as async-safe. + * Normally the way to implement a "suspend" operation is to issue any blocking + * syscall such as sigsuspend() or select(). Apparently every OS + C runtime that + * we wish to support has no problem with sem_wait() here in the signal handler. */ + int my_state = thread_wait_until_not(STATE_STOPPED, thread); FSHOW_SIGNAL((stderr,"resumed\n")); - if(thread_state(thread)!=STATE_RUNNING) { - lose("sig_stop_for_gc_handler: wrong thread state on wakeup: %"OBJ_FMTX, - (lispobj)fixnum_value(thread_state(thread))); - } + /* The state can't go from STOPPED to DEAD because it's this thread is reading + * its own state, hence it must be running. + * (If we tried to observe a different thread, it could appear to change from + * STOPPED to DEAD, skipping RUNNING, because if you blink you might miss it) */ + if (my_state != STATE_RUNNING) + lose("stop_for_gc: bad state on wakeup: %x", my_state); if (was_in_lisp) { undo_fake_foreign_function_call(context); diff --git a/src/runtime/thread.c b/src/runtime/thread.c index ecd334a8b0..076d0457df 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -102,6 +102,9 @@ link_thread(struct thread *th) all_threads=th; } +// This is needed even if not sb-thread. +#define thread_semaphores(thread) (void *)((char*)thread + dynamic_values_bytes) + #ifdef LISP_FEATURE_SB_THREAD static void unlink_thread(struct thread *th) @@ -114,83 +117,83 @@ unlink_thread(struct thread *th) th->next->prev = th->prev; } +#define get_thread_state(thread) (int)__sync_val_compare_and_swap(&thread->state, -1, -1) + #ifndef LISP_FEATURE_SB_SAFEPOINT -/* Only access thread state with blockables blocked. */ -lispobj -thread_state(struct thread *thread) -{ - lispobj state; - sigset_t old; - block_blockable_signals(&old); - os_sem_wait(thread->state_sem, "thread_state"); - state = thread->state; - os_sem_post(thread->state_sem, "thread_state"); - thread_sigmask(SIG_SETMASK, &old, NULL); - return state; -} void set_thread_state(struct thread *thread, lispobj state, boolean signals_already_blocked) // for foreign thread { + struct nonpointer_thread_data *semaphores = thread_semaphores(thread); int i, waitcount = 0; sigset_t old; // If we've already masked the blockable signals we can avoid two syscalls here. if (!signals_already_blocked) block_blockable_signals(&old); - os_sem_wait(thread->state_sem, "set_thread_state"); + os_sem_wait(&semaphores->state_sem, "set_thread_state"); if (thread->state != state) { if ((STATE_STOPPED==state) || (STATE_DEAD==state)) { - waitcount = thread->state_not_running_waitcount; - thread->state_not_running_waitcount = 0; + waitcount = semaphores->state_not_running_waitcount; + semaphores->state_not_running_waitcount = 0; for (i=0; istate_not_running_sem, "set_thread_state (not running)"); + os_sem_post(&semaphores->state_not_running_sem, "set_thread_state (not running)"); } if ((STATE_RUNNING==state) || (STATE_DEAD==state)) { - waitcount = thread->state_not_stopped_waitcount; - thread->state_not_stopped_waitcount = 0; + waitcount = semaphores->state_not_stopped_waitcount; + semaphores->state_not_stopped_waitcount = 0; for (i=0; istate_not_stopped_sem, "set_thread_state (not stopped)"); + os_sem_post(&semaphores->state_not_stopped_sem, "set_thread_state (not stopped)"); } thread->state = state; } - os_sem_post(thread->state_sem, "set_thread_state"); + os_sem_post(&semaphores->state_sem, "set_thread_state"); if (!signals_already_blocked) thread_sigmask(SIG_SETMASK, &old, NULL); } -void -wait_for_thread_state_change(struct thread *thread, lispobj state) +// Wait until "thread's" state is something other than 'undesired_state' +// and return whatever the new state is. +int thread_wait_until_not(int undesired_state, + struct thread *thread) { + struct nonpointer_thread_data *semaphores = thread_semaphores(thread); sigset_t old; os_sem_t *wait_sem; block_blockable_signals(&old); start: - os_sem_wait(thread->state_sem, "wait_for_thread_state_change"); - if (thread->state == state) { - switch (state) { + os_sem_wait(&semaphores->state_sem, "wait_for_thread_state_change"); + /* "The following functions synchronize memory with respect to other threads: + * ... pthread_mutex_lock() ... " + * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11 + * But we still have to ensure no compiler reordering. + */ + int ending_state = get_thread_state(thread); + if (ending_state == undesired_state) { + switch (undesired_state) { case STATE_RUNNING: - wait_sem = thread->state_not_running_sem; - thread->state_not_running_waitcount++; + wait_sem = &semaphores->state_not_running_sem; + semaphores->state_not_running_waitcount++; break; case STATE_STOPPED: - wait_sem = thread->state_not_stopped_sem; - thread->state_not_stopped_waitcount++; + wait_sem = &semaphores->state_not_stopped_sem; + semaphores->state_not_stopped_waitcount++; break; default: - lose("Invalid state in wait_for_thread_state_change: %"OBJ_FMTX, state); + lose("thread_wait_until_not: invalid argument %x", ending_state); } } else { wait_sem = NULL; } - os_sem_post(thread->state_sem, "wait_for_thread_state_change"); + os_sem_post(&semaphores->state_sem, "wait_for_thread_state_change"); if (wait_sem) { os_sem_wait(wait_sem, "wait_for_thread_state_change"); goto start; } thread_sigmask(SIG_SETMASK, &old, NULL); + return ending_state; } #endif /* sb-safepoint */ #endif /* sb-thread */ @@ -324,7 +327,7 @@ init_new_thread(struct thread *th, lose("arch_os_thread_init failed"); } - th->os_thread=thread_self(); + th->os_thread = thread_self(); #define GUARD_CONTROL_STACK 1 #define GUARD_BINDING_STACK 2 @@ -417,9 +420,10 @@ unregister_thread(struct thread *th, arch_os_thread_cleanup(th); #ifndef LISP_FEATURE_SB_SAFEPOINT - os_sem_destroy(th->state_sem); - os_sem_destroy(th->state_not_running_sem); - os_sem_destroy(th->state_not_stopped_sem); + struct nonpointer_thread_data *semaphores = thread_semaphores(th); + os_sem_destroy(&semaphores->state_sem); + os_sem_destroy(&semaphores->state_not_running_sem); + os_sem_destroy(&semaphores->state_not_stopped_sem); #endif @@ -903,7 +907,7 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { // Refer to the ASCII art in the block comment above struct thread *th = (void*)(csp_page + THREAD_CSP_PAGE_SIZE); - lispobj* tls = (lispobj*)th; + __attribute((unused)) lispobj* tls = (lispobj*)th; #ifdef LISP_FEATURE_SB_THREAD for(i = 0; i < (unsigned int)(dynamic_values_bytes/N_WORD_BYTES); i++) @@ -981,23 +985,17 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { th->csp_around_foreign_call = (lispobj *)th - 1; #endif - struct nonpointer_thread_data *nonpointer_data - = (void *)((char*)th + dynamic_values_bytes); + struct nonpointer_thread_data *nonpointer_data = thread_semaphores(th); th->interrupt_data = &nonpointer_data->interrupt_data; -#ifdef LISP_FEATURE_SB_THREAD -# ifndef LISP_FEATURE_SB_SAFEPOINT - th->state_sem = &nonpointer_data->state_sem; - th->state_not_running_sem = &nonpointer_data->state_not_running_sem; - th->state_not_stopped_sem = &nonpointer_data->state_not_stopped_sem; - os_sem_init(th->state_sem, 1); - os_sem_init(th->state_not_running_sem, 0); - os_sem_init(th->state_not_stopped_sem, 0); - th->state_not_running_waitcount = 0; - th->state_not_stopped_waitcount = 0; -# endif - +#if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_SB_SAFEPOINT + os_sem_init(&nonpointer_data->state_sem, 1); + os_sem_init(&nonpointer_data->state_not_running_sem, 0); + os_sem_init(&nonpointer_data->state_not_stopped_sem, 0); + nonpointer_data->state_not_running_waitcount = 0; + nonpointer_data->state_not_stopped_waitcount = 0; #endif + th->state=STATE_RUNNING; #ifdef ALIEN_STACK_GROWS_DOWNWARD th->alien_stack_pointer=(lispobj*)((char*)th->alien_stack_start @@ -1141,50 +1139,64 @@ uword_t create_thread(lispobj start_routine) /* To avoid deadlocks when gc stops the world all clients of each * mutex must enable or disable SIG_STOP_FOR_GC for the duration of - * holding the lock, but they must agree on which. */ + * holding the lock, but they must agree on which. + * [The preceding remark is probably wrong - STOP_FOR_GC is a signal + * that is directed to a thread, so the "wrong" thread would never + * respond to someone else's STOP_FOR_GC. I'm leaving the comment + * just case someone can decipher it and decide to delete it] + * + * A note about ESRCH: tchnically ESRCH can happen if an OS thread ceases + * to exist, while the thread library has a representation of the thread + * because pthread_join() wasn't invoked on it yet. + * ESRCH can't oocur for us because: + * - if a thread was still linked in all_threads at the acquire of all_threads lock, + * then that thread can't make progress in its termination code, because it's + * waiting on the lock. If it changed its state to DEAD, but we perceived it as + * RUNNING, it now must be blocked on the all_threads_lock and it can't disappear. + * - ESRCH is not guaranteed to be returned anyway, and Linux man page doesn't even + * list it as a possible outcome of pthread_kill. + * Also, there used to be assertion that "thread_state(p)==STATE_DEAD)" on ESRCH + * error, but that's saying that there is still memory backing 'struct thread' + * (so that dereferencing was valid), but if dereferencing was valid, then the thread + * can't have died (i.e. if ESRCH could be returned, then that implies that + * the memory shouldn't be there) */ void gc_stop_the_world() { - struct thread *p,*th=arch_os_get_current_thread(); - int status, lock_ret; - FSHOW_SIGNAL((stderr,"/gc_stop_the_world:waiting on lock\n")); + struct thread *th, *me = arch_os_get_current_thread(); + int rc; /* Keep threads from registering with GC while the world is stopped. */ - lock_ret = thread_mutex_lock(&all_threads_lock); - gc_assert(lock_ret == 0); + rc = thread_mutex_lock(&all_threads_lock); + gc_assert(rc == 0); - FSHOW_SIGNAL((stderr,"/gc_stop_the_world:got lock\n")); /* stop all other threads by sending them SIG_STOP_FOR_GC */ - for(p=all_threads; p; p=p->next) { - gc_assert(p->os_thread != 0); - FSHOW_SIGNAL((stderr,"/gc_stop_the_world: thread=%lu, state=%x\n", - p->os_thread, thread_state(p))); - if((p!=th) && ((thread_state(p)==STATE_RUNNING))) { - FSHOW_SIGNAL((stderr,"/gc_stop_the_world: suspending thread %lu\n", - p->os_thread)); - /* We already hold all_thread_lock, P can become DEAD but - * cannot exit, ergo it's safe to use pthread_kill. */ - status=pthread_kill(p->os_thread,SIG_STOP_FOR_GC); - if (status==ESRCH) { - /* This thread has exited. */ - gc_assert(thread_state(p)==STATE_DEAD); - } else if (status) { - lose("cannot send suspend thread=%lx: %d, %s", - // KLUDGE: assume that os_thread can be cast as long. + for_each_thread(th) { + gc_assert(th->os_thread != 0); + /* We were going to extremes here to use acquire semantics on the state, + * while NOT ACTUALLY PREVENTING CHANGE OF THAT STATE. i.e. we released the + * state lock before returning with the determined state. That's no help. + * Just do an atomic load and we're good */ + int state = get_thread_state(th); + if (th != me && state == STATE_RUNNING) { + /* This pthread_kill is safe. + * A RUNNING thread can transition to DEAD but can't disappear either + * in terms of 'struct thread' being unmapped or the pthread exiting, + * because it'll be blocked on the all_threads lock */ + rc = pthread_kill(th->os_thread,SIG_STOP_FOR_GC); + /* This used to bogusly check for ESRCH. + * I changed the ESRCH case to just fall into lose() */ + if (rc) { + lose("cannot suspend thread %p: %d, %s", + // KLUDGE: assume that os_thread can be cast as pointer. // See comment in 'interr.h' about that. - (long)p->os_thread,status,strerror(status)); + (void*)th->os_thread, rc, strerror(rc)); } } } - FSHOW_SIGNAL((stderr,"/gc_stop_the_world:signals sent\n")); - for(p=all_threads;p;p=p->next) { - if (p!=th) { - FSHOW_SIGNAL - ((stderr, - "/gc_stop_the_world: waiting for thread=%lu: state=%x\n", - p->os_thread, thread_state(p))); - wait_for_thread_state_change(p, STATE_RUNNING); - if (p->state == STATE_RUNNING) - lose("/gc_stop_the_world: unexpected state"); + for_each_thread(th) { + if (th != me) { + int state = thread_wait_until_not(STATE_RUNNING, th); + gc_assert(state != STATE_RUNNING); } } FSHOW_SIGNAL((stderr,"/gc_stop_the_world:end\n")); @@ -1192,32 +1204,28 @@ void gc_stop_the_world() void gc_start_the_world() { - struct thread *p,*th=arch_os_get_current_thread(); + struct thread *th, *me = arch_os_get_current_thread(); int lock_ret; /* if a resumed thread creates a new thread before we're done with * this loop, the new thread will be suspended waiting to acquire * the all_threads lock */ - FSHOW_SIGNAL((stderr,"/gc_start_the_world:begin\n")); - for(p=all_threads;p;p=p->next) { - gc_assert(p->os_thread!=0); - if (p!=th) { - lispobj state = thread_state(p); + for_each_thread(th) { + gc_assert(th->os_thread); + if (th != me) { + /* I don't know if a normal load is fine here. I think we can't read + * any value other than what was already observed? + * No harm in being cautious though with regard to compiler reordering */ + int state = get_thread_state(th); if (state != STATE_DEAD) { - if(state != STATE_STOPPED) { - lose("gc_start_the_world: wrong thread state is %"OBJ_FMTX, - (lispobj)fixnum_value(state)); - } - FSHOW_SIGNAL((stderr, "/gc_start_the_world: resuming %lu\n", - p->os_thread)); - set_thread_state(p, STATE_RUNNING, 0); + if(state != STATE_STOPPED) + lose("gc_start_the_world: bad thread state %x", state); + set_thread_state(th, STATE_RUNNING, 0); } } } lock_ret = thread_mutex_unlock(&all_threads_lock); gc_assert(lock_ret == 0); - - FSHOW_SIGNAL((stderr,"/gc_start_the_world:end\n")); } #endif /* !LISP_FEATURE_SB_SAFEPOINT */ diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 07618d171e..b7d07484b9 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -24,14 +24,11 @@ #include "interrupt.h" #include "validate.h" /* for BINDING_STACK_SIZE etc */ -#define STATE_RUNNING MAKE_FIXNUM(1) -#define STATE_STOPPED MAKE_FIXNUM(2) -#define STATE_DEAD MAKE_FIXNUM(3) +enum threadstate {STATE_RUNNING=1, STATE_STOPPED, STATE_DEAD}; #ifdef LISP_FEATURE_SB_THREAD -lispobj thread_state(struct thread *thread); void set_thread_state(struct thread *thread, lispobj state, boolean); -void wait_for_thread_state_change(struct thread *thread, lispobj state); +int thread_wait_until_not(int state, struct thread *thread); #endif #if defined(LISP_FEATURE_SB_SAFEPOINT) @@ -44,9 +41,6 @@ void** os_get_csp(struct thread* th); void assert_on_stack(struct thread *th, void *esp); #endif /* defined(LISP_FEATURE_SB_SAFEPOINT) */ -#define THREAD_SLOT_OFFSET_WORDS(c) \ - (offsetof(struct thread,c)/(sizeof (struct thread *))) - /* The thread struct is generated from lisp during genesis and it * needs to know the sizes of all its members, but some types may have * arbitrary lengths, thus the pointers are stored instead. This @@ -54,12 +48,22 @@ void assert_on_stack(struct thread *th, void *esp); * pointers can be later shoved into the thread struct. */ struct nonpointer_thread_data { -#ifdef LISP_FEATURE_SB_THREAD -#ifndef LISP_FEATURE_SB_SAFEPOINT +#if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_SB_SAFEPOINT + // 'state_sem' is a binary semaphore used just like a mutex. + // I guess we figure that semaphores are OK to use in signal handlers (which is + // technically false), whereas a mutex would be more certainly wrong? os_sem_t state_sem; + // These are basically "gates" a la SB-CONCURRENCY:GATE. They might be better + // as condition variables, but condvars are not allowed in signal handlers. + // Strictly speaking, sem_wait isn't either, but it seems to work. os_sem_t state_not_running_sem; os_sem_t state_not_stopped_sem; -#endif + // We count waiters on each gate to know how many times to sem_post() to open them. + // The counts themselves are protected against concurrent access by 'state_sem'. + // Since we're not constrained by compiler/generic/objdef any more, we can + // make these "only" 4 bytes each, instead of lispwords. + uint32_t state_not_running_waitcount; + uint32_t state_not_stopped_waitcount; #endif struct interrupt_data interrupt_data; }; From de8fb8512fb516e3e46b3eaac4a1792095cb30ef Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 4 Sep 2020 21:19:18 -0400 Subject: [PATCH 0479/4023] Make the code match the comments Calculate the safepoint page according to the picture above it. The existing arithmetic wasn't wrong, just a little confusing. --- src/runtime/thread.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 076d0457df..534b23f0ff 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -898,16 +898,18 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { /* Aligning up is safe as THREAD_STRUCT_SIZE has * THREAD_ALIGNMENT_BYTES padding. */ char *aligned_spaces = PTR_ALIGN_UP(spaces, THREAD_ALIGNMENT_BYTES); - char* csp_page= - (aligned_spaces+ - thread_control_stack_size+ - BINDING_STACK_SIZE+ - ALIEN_STACK_SIZE + - (MAX_INTERRUPTS*sizeof(os_context_t*))); + char* csp_page = aligned_spaces + thread_control_stack_size + + BINDING_STACK_SIZE + ALIEN_STACK_SIZE; // Refer to the ASCII art in the block comment above - struct thread *th = (void*)(csp_page + THREAD_CSP_PAGE_SIZE); + struct thread *th = + (void*)(csp_page + THREAD_CSP_PAGE_SIZE + N_WORD_BYTES*MAX_INTERRUPTS); __attribute((unused)) lispobj* tls = (lispobj*)th; +#ifdef LISP_FEATURE_SB_SAFEPOINT + // Out of caution I'm supposing that the last thread to use this memory + // might have left this page as read-only. Could it? I have no idea. + os_protect(csp_page, THREAD_CSP_PAGE_SIZE, OS_VM_PROT_READ|OS_VM_PROT_WRITE); +#endif #ifdef LISP_FEATURE_SB_THREAD for(i = 0; i < (unsigned int)(dynamic_values_bytes/N_WORD_BYTES); i++) From e79d719b953ff0ed93e55d36ab3ccd3b0707eedb Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 4 Sep 2020 22:08:09 -0400 Subject: [PATCH 0480/4023] Greatly simplify wake_thread() --- contrib/sb-sprof/record.lisp | 6 +- src/code/target-thread.lisp | 126 +++++++++++++---------------------- src/runtime/print.c | 5 +- src/runtime/runtime.h | 4 +- src/runtime/safepoint.c | 46 +++++-------- src/runtime/thread.c | 96 +++++++------------------- src/runtime/thread.h | 8 +-- 7 files changed, 93 insertions(+), 198 deletions(-) diff --git a/contrib/sb-sprof/record.lisp b/contrib/sb-sprof/record.lisp index 76888791f2..f521feca4f 100644 --- a/contrib/sb-sprof/record.lisp +++ b/contrib/sb-sprof/record.lisp @@ -341,8 +341,10 @@ EXPERIMENTAL: Interface subject to change." (unless (sb-thread:mutex-owner lock) (sb-thread::with-system-mutex (lock) (dolist (thread (profiled-threads)) - (sb-thread:with-os-thread (os-thread thread) - (sb-thread::pthread-kill os-thread sb-unix:sigprof)))))) + (sb-thread:with-deathlok (thread c-thread) + (unless (= c-thread 0) + (sb-thread:pthread-kill (sb-thread::thread-os-thread thread) + sb-unix:sigprof))))))) #-sb-thread (unix-kill 0 sb-unix:sigprof)) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 6bbe80a27f..141e201987 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -19,7 +19,7 @@ raise release-spinlock spinlock - with-os-thread + with-deathlok with-session-lock with-spinlock)) @@ -407,11 +407,6 @@ See also: RETURN-FROM-THREAD and SB-EXT:EXIT." (sb-ext:define-load-time-global *starting-threads* nil) (declaim (list *starting-threads*)) ; list of threads -#+sb-safepoint -(define-alien-routine "wake_thread" - int - (os-thread unsigned)) - #+sb-thread (progn (declaim (inline %block-deferrable-signals)) @@ -1365,9 +1360,13 @@ on this semaphore, then N of them is woken up." `(labels ((,fb-name () ,@forms)) (call-with-new-session (function ,fb-name))))) -(defmacro with-interruptions-lock ((thread) &body body) +;;; WITH-DEATHLOK ensures that the 'struct thread' and/or OS thread won't go away +;;; by synchronizing with HANDLE-THREAD-EXIT. +(defmacro with-deathlok ((thread &optional c-thread) &body body) `(with-system-mutex ((thread-interruptions-lock ,thread)) - ,@body)) + ,@(if c-thread + `((let ((,c-thread (thread-primitive-thread ,thread))) ,@body)) + body))) #+sb-thread (progn @@ -1395,7 +1394,7 @@ on this semaphore, then N of them is woken up." ;; there is no real harm in reading the memory. In this state the pthread library ;; will usually return ESRCH if you try to use the pthread id - it's a valid ;; pointer, but it knows that it has no underlying OS thread. - (with-interruptions-lock (thread) + (with-deathlok (thread) (when sem ; ordinary lisp thread, not FOREIGN-THREAD (setf (thread-startup-info thread) c-thread)) (setf (thread-primitive-thread thread) 0) @@ -1685,10 +1684,9 @@ session." ;; Clean up *ALL-THREADS* (delete-from-all-threads (sap-int c-thread)) ;; Free the pthread resources - (let ((posix-thread (thread-os-thread thread))) - (alien-funcall (extern-alien "pthread_join" (function int unsigned unsigned)) - posix-thread 0) ; no result pointer - (setf (thread-os-thread thread) 0)) + (alien-funcall (extern-alien "pthread_join" (function int unsigned unsigned)) + (thread-os-thread thread) 0) ; no result pointer + (setf (thread-os-thread thread) 0) (cond (dispose (free-thread-struct c-thread) nil) @@ -2117,7 +2115,7 @@ subject to change." ;;; Called from the signal handler. #-(or sb-thruption win32) (defun run-interruption () - (let ((interruption (with-interruptions-lock (*current-thread*) + (let ((interruption (with-deathlok (*current-thread*) (pop (thread-interruptions *current-thread*))))) ;; If there is more to do, then resignal and let the normal ;; interrupt deferral mechanism take care of the rest. From the @@ -2133,7 +2131,7 @@ subject to change." #+sb-thruption (defun run-interruption (*current-internal-error-context*) (in-interruption () ;the non-thruption code does this in the signal handler - (let ((interruption (with-interruptions-lock (*current-thread*) + (let ((interruption (with-deathlok (*current-thread*) (pop (thread-interruptions *current-thread*))))) (when interruption (funcall interruption) @@ -2156,33 +2154,13 @@ subject to change." ;; -- DFL (setf *thruption-pending* t))))) -(defmacro with-c-thread ((c-thread thread) &body body) - `(with-interruptions-lock (,thread) - (let ((,c-thread (thread-primitive-thread ,thread))) - ,@body))) - -;;; A macro to extract the pthread id out of the thread's C memory -;;; while ensuring that the thread can't exit. -;;; Invokes BODY only if the pthread ID is valid. -(defmacro with-os-thread ((os-thread thread) &body body) - #+sb-thread - `(let ((lisp-thread ,thread)) - (with-c-thread (c-thread lisp-thread) - (unless (= c-thread 0) - (let ((,os-thread (thread-os-thread lisp-thread))) - ,@body)))) - #-sb-thread - `(let ((lisp-thread ,thread) (,os-thread 0)) - (declare (ignorable lisp-thread ,os-thread)) - ,@body)) - #+linux (defun thread-os-tid (thread) (declare (ignorable thread)) #+sb-thread (if (eq *current-thread* thread) (my-kernel-thread-id) - (with-c-thread (c-thread thread) + (with-deathlok (thread c-thread) (unless (= c-thread 0) (sap-ref-32 (int-sap c-thread) (+ (ash sb-vm::thread-os-kernel-tid-slot sb-vm:word-shift) @@ -2246,59 +2224,49 @@ the state of a thread: (interrupt-thread thread #'break) Short version: be careful out there." - #+(and (not sb-thread) win32) - (with-interrupt-bindings - (with-interrupts (funcall function))) - #-(and (not sb-thread) win32) - (macrolet ((enqueue (set-invoked) + (macrolet ((enqueue () ;; Append to the end of the interruptions queue. It's ;; O(N), but it does not hurt to slow interruptors down a ;; bit when the queue gets long. `(setf (thread-interruptions thread) (append (thread-interruptions thread) (list (lambda () - ,@(if set-invoked '((setf invoked t))) - (barrier (:memory)) + (barrier (:memory)) ; why??? (without-interrupts (allow-with-interrupts (funcall function))))))))) - ;; POSIX says: ;; "If an application attempts to use a thread ID whose lifetime has ended, ;; the behavior is undefined." - ;; We have two ways of handling this, the good way and the shiat way. - ;; The good way is to pthread_kill() while holding the interruptions lock, - ;; which prevents thread exit since a thread needs to briefly acquire - ;; that lock just prior to exit. - - #-sb-safepoint ; Good way - (unless (with-os-thread (os-thread thread) - (enqueue nil) - (pthread-kill os-thread sb-unix:sigpipe) - t) - (error 'interrupt-thread-error :thread thread)) - - ;; Shiat way: call to C to acquire the all_threads lock and scan all_threads. - ;; Beyond that there's the question of why INVOKED is ever set/examined. Seems fubar. - ;; I have no friggin idea how sb-thruption is supposed to work. - #+sb-safepoint - (let ((os-thread - ;; This causes an extra acquire/release cycle, and potentially conses a bignum - ;; to hold a word. - ;; Anybody who builds with these features should feel free to improve it. - (with-os-thread (os-thread thread) os-thread))) - (cond ((not os-thread) - (error 'interrupt-thread-error :thread thread)) - (t - (let (invoked) - (with-interruptions-lock (thread) - (enqueue t)) - (when (and (minusp (wake-thread os-thread)) - ;; The interrupt queue has been processed by - ;; some other interrupt. - (progn (barrier (:memory)) - (not invoked))) - (error 'interrupt-thread-error :thread thread)))))))) + ;; so we use the death lock to keep the thread alive, unless it already isn't. + ;; + ;; KNOWN BUG: With safepoints, when interrupting *CURRENT-THREAD*, we invoke + ;; the interrupt synchronously, despite being effectively in the extent of a + ;; WITHOUT-INTERRUPTS courtesy of WITH-SYSTEM-MUTEX. Hence we can't pop the + ;; the interruptions queue without getting a recursive lock attempt + ;; unless the interruptions lock is a different lock from the death lock. + ;; + ;; On non-safepoint builds, the signal will be deferred even if it delivered + ;; to *CURRENT-THREAD*. i.e. there will be no possibility of recursion on + ;; the interruptions lock. So that and the death lock are one and the same. + ;; + ;; I would imagine that this behavioral discrepancy is responsible for the + ;; differences in the regression suite as to which tests are expected to fail. + ;; + (when (with-deathlok (thread c-thread) + ;; Return T if couldn't interrupt. + (cond ((eql c-thread 0) t) + (t + (enqueue) + #-sb-safepoint (pthread-kill (thread-os-thread thread) sb-unix:sigpipe) + #+sb-safepoint + (with-alien ((wake (function void system-area-pointer) + :extern "wake_thread")) + (with-pinned-objects (thread) + (alien-funcall wake (sap+ (int-sap (get-lisp-obj-address thread)) + (- sb-vm:instance-pointer-lowtag))))) + nil))) + (error 'interrupt-thread-error :thread thread)))) (defun terminate-thread (thread) "Terminate the thread identified by THREAD, by interrupting it and @@ -2354,7 +2322,7 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (sb-ext:define-load-time-global sb-vm::*free-tls-index* 0) (defun %symbol-value-in-thread (symbol thread) - (with-c-thread (c-thread thread) + (with-deathlok (thread c-thread) (if (/= c-thread 0) (let ((val (sap-ref-lispobj (int-sap c-thread) (symbol-tls-index symbol)))) (case (get-lisp-obj-address val) @@ -2364,7 +2332,7 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (values nil :thread-dead)))) (defun %set-symbol-value-in-thread (symbol thread value) - (with-c-thread (c-thread thread) + (with-deathlok (thread c-thread) (if (/= c-thread 0) (let ((offset (symbol-tls-index symbol))) (cond ((zerop offset) diff --git a/src/runtime/print.c b/src/runtime/print.c index db5e178b68..bb1e58e603 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -156,10 +156,7 @@ vodxprint_fun(const char *fmt, va_list args) int n = 0; #ifdef LISP_FEATURE_SB_THREAD - struct thread *arch_os_get_current_thread(void); - struct thread *self = arch_os_get_current_thread(); - void *pth = self ? (void *) self->os_thread : 0; - snprintf(buf, sizeof(buf), "[%p/%p] ", self, pth); + snprintf(buf, sizeof(buf), "[%p] ", (void*)thread_self()); n = strlen(buf); #endif diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 59697ffdd4..f844d18671 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -32,7 +32,6 @@ #ifdef LISP_FEATURE_WIN32 #define thread_self() ((pthread_t)TlsGetValue(thread_self_tls_index)) #define thread_equal(a,b) ((a)==(b)) -#define thread_kill sb_pthr_kill #define thread_sigmask _sbcl_pthread_sigmask // wrap CriticalSection operators in a function returning 0 to satisfy assertions static inline int cs_mutex_lock(void* l) { EnterCriticalSection(l); return 0; } @@ -42,16 +41,15 @@ static inline int cs_mutex_unlock(void* l) { LeaveCriticalSection(l); return 0; #else #define thread_self() pthread_self() #define thread_equal(a,b) pthread_equal(a,b) -#define thread_kill pthread_kill #define thread_sigmask pthread_sigmask #define thread_mutex_lock(l) pthread_mutex_lock(l) #define thread_mutex_unlock(l) pthread_mutex_unlock(l) #endif #else +// not SB_THREAD #define thread_self() 0 #define thread_equal(a,b) ((a)==(b)) -#define thread_kill kill_safely #define thread_sigmask sigprocmask #define thread_mutex_lock(l) 0 #define thread_mutex_unlock(l) 0 diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 8fa67ed2c4..6bbe5aea1e 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -918,9 +918,9 @@ wake_thread_io(struct thread * thread) win32_maybe_interrupt_io(thread); } -void -wake_thread_win32(struct thread *thread) +void wake_thread_impl(struct thread_instance *lispthread) { + struct thread* thread = (void*)lispthread->primitive_thread; wake_thread_io(thread); if (read_TLS(THRUPTION_PENDING,thread)==T) @@ -947,20 +947,18 @@ wake_thread_win32(struct thread *thread) return; } # else -int -wake_thread_posix(os_thread_t os_thread) +void wake_thread_impl(struct thread_instance *lispthread) { - int found = 0; - struct thread *thread; + struct thread *thread = (void*)lispthread->primitive_thread; struct thread *self = arch_os_get_current_thread(); /* Must not and need not attempt to signal ourselves while we're the * STW initiator. */ - if (self->os_thread == os_thread) { + if (thread == self) { write_TLS(THRUPTION_PENDING,T,self); while (check_pending_thruptions(0 /* ignore the sigmask */)) ; - return 0; + return; } /* We are not in a signal handler here, so need to block signals @@ -973,13 +971,14 @@ wake_thread_posix(os_thread_t os_thread) odxprint(safepoints, "wake_thread_posix: invoking"); gc_advance(GC_INVOKED,GC_NONE); { + /* I do not know whether WITH_ALL_THREADS_LOCK was only to avoid + * hitting wild pointers in the loop over threads (gone now) + * or whether it _also_ had an effect on the safepoint state. + * Out of caution I'm leaving it in despite removing the loop */ + /* only if in foreign code, notify using signal */ WITH_ALL_THREADS_LOCK { - for_each_thread (thread) - if (thread->os_thread == os_thread) { - /* it's still alive... */ - found = 1; - + do { odxprint(safepoints, "wake_thread_posix: found"); write_TLS(THRUPTION_PENDING,T,thread); if (read_TLS(GC_PENDING,thread) == T @@ -990,36 +989,21 @@ wake_thread_posix(os_thread_t os_thread) odxprint(safepoints, "wake_thread_posix: kill"); /* ... and in foreign code. Push it into a safety * transition. */ - int status = pthread_kill(os_thread, SIGPIPE); + int status = pthread_kill((pthread_t)lispthread->os_thread, SIGPIPE); if (status) lose("wake_thread_posix: pthread_kill failed with %d", status); } - break; - } + } while(0); } } gc_advance(GC_NONE,GC_INVOKED); } else { odxprint(safepoints, "wake_thread_posix: passive"); - /* We are not able to wake the thread up actively, but maybe - * some other thread will take care of it. Kludge: Unless it is - * in foreign code. Let's at least try to get our return value - * right. */ - WITH_ALL_THREADS_LOCK { - for_each_thread (thread) - if (thread->os_thread == os_thread) { - write_TLS(THRUPTION_PENDING,T,thread); - found = 1; - break; - } - } + write_TLS(THRUPTION_PENDING, T, thread); } } - - odxprint(safepoints, "wake_thread_posix leaving, found=%d", found); thread_sigmask(SIG_SETMASK, &oldset, 0); - return found ? 0 : -1; } #endif /* !LISP_FEATURE_WIN32 */ #endif /* LISP_FEATURE_SB_THRUPTION */ diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 534b23f0ff..d6e6358408 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -1243,26 +1243,7 @@ thread_yield() #endif } -// The code is extremely trashy and a good candidate for removal/cleanup -// but I don't understand this feature combination well enough to do so. -// The part of it we need to keep is the GC state interaction, though -// as can plainly be seen from the "good" case of SB-THREAD::INTERRUPT-THREAD -// there is a perfectly fine way of detecting validity of a pthread ID, -// and even the link below to Ulrich Drepper's blog post says exactly what -// to do. So why does this have anything to do with the all_threads_lock??? #ifdef LISP_FEATURE_SB_SAFEPOINT -int -wake_thread(os_thread_t os_thread) -{ -#if defined(LISP_FEATURE_WIN32) - return kill_safely(os_thread, 1); -#elif !defined(LISP_FEATURE_SB_THRUPTION) - return kill_safely(os_thread, SIGPIPE); -#else - return wake_thread_posix(os_thread); -#endif -} - /* If the thread id given does not belong to a running thread (it has * exited or never even existed) pthread_kill _may_ fail with ESRCH, * but it is also allowed to just segfault, see @@ -1279,19 +1260,12 @@ wake_thread(os_thread_t os_thread) * Note (DFL, 2011-06-22): At the time of writing, this function is only * used for INTERRUPT-THREAD, hence the wake_thread special-case for * Windows is OK. */ -int -kill_safely(os_thread_t os_thread, int signal) +void wake_thread(struct thread_instance* lispthread) { - FSHOW_SIGNAL((stderr,"/kill_safely: %lu, %d\n", os_thread, signal)); - - // This indentation is wrong, but the code is cringey anyway +#ifdef LISP_FEATURE_WIN32 + /* META: why is this comment about safepoint builds mentioning + * gc_stop_the_world() ? Never the twain shall meet. */ - sigset_t oldset; - struct thread *thread; - /* Frequent special case: resignalling to self. The idea is - * that leave_region safepoint will acknowledge the signal, so - * there is no need to take locks, roll thread to safepoint - * etc. */ /* Kludge (on safepoint builds): At the moment, this isn't just * an optimization; rather it masks the fact that * gc_stop_the_world() grabs the all_threads mutex without @@ -1300,54 +1274,30 @@ kill_safely(os_thread_t os_thread, int signal) * would go wrong. Why are we running interruptions while * stopping the world though? Test case is (:ASYNC-UNWIND * :SPECIALS), especially with s/10/100/ in both loops. */ - /* From the linux man page on pthread_self() - - * "variables of type pthread_t can't portably be compared using - * the C equality operator (==); use pthread_equal(3) instead." */ - if (thread_equal(os_thread, thread_self())) { - thread_kill(os_thread, signal); -#ifdef LISP_FEATURE_WIN32 + + /* Frequent special case: resignalling to self. The idea is + * that leave_region safepoint will acknowledge the signal, so + * there is no need to take locks, roll thread to safepoint + * etc. */ + struct thread* thread = (void*)lispthread->primitive_thread; + if (thread == arch_os_get_current_thread()) { + sb_pthr_kill(thread->os_thread, SIGPIPE); // can't fail check_pending_thruptions(NULL); -#endif - return 0; + return; } - - /* There are two problems with the comment below this one. - * - * - "... is not async signal safe" is based on obsolete information. - * https://www.man7.org/linux/man-pages/man7/signal-safety.7.html lists - * pthread_kill(3) Added in POSIX.1-2008 TC1 - * - * - the comment is likely mistaken about the meaning of async-signal-safe: - * "An async-signal-safe function is one that can be safely called - * from within a signal handler." - * which is not what's happening here. Or should not be anyway, - * though in fact it would be async-signal safe, while ironically - * pthread_mutex_lock would NOT be safe. - * i.e. we had better not be in a signal handler. - * - * But kill_safely() is all kinds of bad, and shouldn't really be used. - */ - - /* pthread_kill is not async signal safe and we don't want to be - * interrupted while holding the lock. */ + // block_deferrables + mutex_lock looks very unnecessary here, + // but without them, make-target-contrib hangs in bsd-sockets. + sigset_t oldset; block_deferrable_signals(&oldset); thread_mutex_lock(&all_threads_lock); - for (thread = all_threads; thread; thread = thread->next) { - if (thread->os_thread == os_thread) { - int status = thread_kill(os_thread, signal); - if (status) - lose("kill_safely: pthread_kill failed with %d", status); -#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THRUPTION) - wake_thread_win32(thread); -#endif - break; - } - } + sb_pthr_kill(thread->os_thread, SIGPIPE); // can't fail + wake_thread_impl(lispthread); thread_mutex_unlock(&all_threads_lock); thread_sigmask(SIG_SETMASK,&oldset,0); - if (thread) - return 0; - else - return -1; +#elif defined LISP_FEATURE_SB_THRUPTION + wake_thread_impl(lispthread); +#else + pthread_kill(lispthread->os_thread, SIGPIPE); +#endif } #endif diff --git a/src/runtime/thread.h b/src/runtime/thread.h index b7d07484b9..99637c3838 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -335,12 +335,8 @@ void thread_interrupted(os_context_t *ctx); extern void thread_register_gc_trigger(); # ifdef LISP_FEATURE_SB_THRUPTION -int wake_thread(os_thread_t os_thread); -# ifdef LISP_FEATURE_WIN32 -void wake_thread_win32(struct thread *thread); -# else -int wake_thread_posix(os_thread_t os_thread); -# endif +void wake_thread(struct thread_instance*), + wake_thread_impl(struct thread_instance*); # endif static inline From dd99cebe2c2db1eacc5ccac14d98ac8f67b13d08 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 5 Sep 2020 11:21:31 -0400 Subject: [PATCH 0481/4023] Make small adjustments to wake_thread etc for win32 * Ensure that THREAD-PRIMITIVE-THREAD is filled in whether or not the newly created thread filled it in yet. This might matter. Also add a missing WITH-PINNED-OBJECTS (which can't have mattered). * Use _beginthreadex, not CreateThread because most documentation seems to imply that bad things happen if you don't. * Prior to the last change, signal 1 (SIGHUP) was used in lieu of SIGPIPE for wake_thread. I don't see how that matters, but set it back to 1. * Put back an #ifdef that should have have been always true, but maybe somebody builds without sb-thruption. * The comment in 'target-thread' about a recursive lock attempt was written prior to my discovering that block_deferrable_signals() in 'wake_thread' was the solution; I had meant to remove the comment. Hopefully this will fix #-sb-futex, but I don't know which of those things affect anything. --- src/code/target-thread.lisp | 27 +++++++++------------------ src/runtime/thread.c | 34 ++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 141e201987..33a2a2b711 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -2014,12 +2014,16 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;; INITIAL-FUNCTION to another thread. ;; (Does WITHOUT-INTERRUPTS really matter now that it's DXed?) (with-system-mutex (*make-thread-lock*) - (with-alien ((create-thread (function unsigned unsigned) + (with-alien ((create-thread (function unsigned unsigned unsigned) :extern "create_thread")) - (if (eql (alien-funcall create-thread (get-lisp-obj-address #'start-routine)) - 0) - (setq thread nil) - (wait-on-semaphore setup-sem)))))) + (with-pinned-objects (thread #'start-routine) + (if (eql (alien-funcall create-thread + (- (get-lisp-obj-address thread) + sb-vm:instance-pointer-lowtag) + (get-lisp-obj-address #'start-routine)) + 0) + (setq thread nil) + (wait-on-semaphore setup-sem))))))) (or thread (error "Could not create a new thread."))) (defun join-thread (thread &key (default nil defaultp) timeout) @@ -2240,19 +2244,6 @@ Short version: be careful out there." ;; the behavior is undefined." ;; so we use the death lock to keep the thread alive, unless it already isn't. ;; - ;; KNOWN BUG: With safepoints, when interrupting *CURRENT-THREAD*, we invoke - ;; the interrupt synchronously, despite being effectively in the extent of a - ;; WITHOUT-INTERRUPTS courtesy of WITH-SYSTEM-MUTEX. Hence we can't pop the - ;; the interruptions queue without getting a recursive lock attempt - ;; unless the interruptions lock is a different lock from the death lock. - ;; - ;; On non-safepoint builds, the signal will be deferred even if it delivered - ;; to *CURRENT-THREAD*. i.e. there will be no possibility of recursion on - ;; the interruptions lock. So that and the death lock are one and the same. - ;; - ;; I would imagine that this behavioral discrepancy is responsible for the - ;; differences in the regression suite as to which tests are expected to fail. - ;; (when (with-deathlok (thread c-thread) ;; Return T if couldn't interrupt. (cond ((eql c-thread 0) t) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index d6e6358408..ed66a21276 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -479,7 +479,7 @@ unregister_thread(struct thread *th, * bookkeeping needs to be done */ #ifdef LISP_FEATURE_WIN32 -DWORD WINAPI new_thread_trampoline(LPVOID arg) +__stdcall unsigned int new_thread_trampoline(LPVOID arg) #else void* new_thread_trampoline(void* arg) #endif @@ -1082,7 +1082,7 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { #ifdef LISP_FEATURE_WIN32 /* Allocate a thread structure, call CreateThread(), * and return 1 for success, 0 for failure */ -uword_t create_thread(lispobj start_routine) +uword_t create_thread(struct thread_instance* instance, lispobj start_routine) { struct thread *th, *thread = arch_os_get_current_thread(); @@ -1106,8 +1106,9 @@ uword_t create_thread(lispobj start_routine) * SIG_STOP_FOR_GC because the child process is not linked onto * all_threads until it's ready. */ block_deferrable_signals(&oldset); - DWORD tid; + unsigned int tid; pthread_t pth = (pthread_t)calloc(sizeof(pthread_thread),1); + gc_assert(pth != NULL); // Theoretically you should tell the new thread a signal mask to restore // after it finishes any uninterruptable setup code, but the way this worked // on windows is that we passed the mask of blocked signals in the parent @@ -1116,15 +1117,22 @@ uword_t create_thread(lispobj start_routine) // and we don't really have posix signals anyway. pth->blocked_signal_set = deferrable_sigset; pth->vm_thread = th; - pth->handle = CreateThread(NULL, thread_control_stack_size, - new_thread_trampoline, pth, 0, &tid); - success = pth->handle != NULL; - if (success) - th->os_thread = pth, th->os_kernel_tid = tid; - else + // It's somewhat customary in the win32 API to start threads as suspended. + pth->handle = (HANDLE) + _beginthreadex(NULL, thread_control_stack_size, new_thread_trampoline, pth, + CREATE_SUSPENDED, &tid); + success = (pth->handle != NULL); + if (success) { + // TOO MANY DIFFERENT THREAD STRUCTURES, CAN WE * PUHLEASE * SIMPLIFY!? + instance->primitive_thread = (lispobj)th; + th->os_thread = pth; + th->os_kernel_tid = tid; + ResumeThread(pth->handle); + } else { free(pth); + free_thread_struct(th); + } thread_sigmask(SIG_SETMASK,&oldset,0); - if (!success) free_thread_struct(th); return success; } #endif @@ -1281,7 +1289,7 @@ void wake_thread(struct thread_instance* lispthread) * etc. */ struct thread* thread = (void*)lispthread->primitive_thread; if (thread == arch_os_get_current_thread()) { - sb_pthr_kill(thread->os_thread, SIGPIPE); // can't fail + sb_pthr_kill(thread->os_thread, 1); // can't fail check_pending_thruptions(NULL); return; } @@ -1290,8 +1298,10 @@ void wake_thread(struct thread_instance* lispthread) sigset_t oldset; block_deferrable_signals(&oldset); thread_mutex_lock(&all_threads_lock); - sb_pthr_kill(thread->os_thread, SIGPIPE); // can't fail + sb_pthr_kill(thread->os_thread, 1); // can't fail +# ifdef LISP_FEATURE_SB_THRUPTION wake_thread_impl(lispthread); +# endif thread_mutex_unlock(&all_threads_lock); thread_sigmask(SIG_SETMASK,&oldset,0); #elif defined LISP_FEATURE_SB_THRUPTION From 703ee7ea119c8ffed56beebf15daf169e203c1b3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sat, 5 Sep 2020 16:35:21 -0400 Subject: [PATCH 0482/4023] Fix #-sb-thread --- src/code/target-thread.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 33a2a2b711..9c9c250ae7 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -2245,8 +2245,9 @@ Short version: be careful out there." ;; so we use the death lock to keep the thread alive, unless it already isn't. ;; (when (with-deathlok (thread c-thread) + (declare (ignorable c-thread)) ;; Return T if couldn't interrupt. - (cond ((eql c-thread 0) t) + (cond #+sb-thread ((eql c-thread 0) t) (t (enqueue) #-sb-safepoint (pthread-kill (thread-os-thread thread) sb-unix:sigpipe) From 9347af8e9130ea39087350f15786e44553f72e96 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 6 Sep 2020 13:20:06 -0400 Subject: [PATCH 0483/4023] Use external thread ID in messages --- src/runtime/print.c | 2 +- src/runtime/runtime.h | 2 -- src/runtime/thread.h | 3 +++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/runtime/print.c b/src/runtime/print.c index bb1e58e603..1f626cc7c8 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -156,7 +156,7 @@ vodxprint_fun(const char *fmt, va_list args) int n = 0; #ifdef LISP_FEATURE_SB_THREAD - snprintf(buf, sizeof(buf), "[%p] ", (void*)thread_self()); + snprintf(buf, sizeof(buf), "["THREAD_ID_LABEL"] ", THREAD_ID_VALUE); n = strlen(buf); #endif diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index f844d18671..14a1ebe2cf 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -30,8 +30,6 @@ #if defined(LISP_FEATURE_SB_THREAD) #ifdef LISP_FEATURE_WIN32 -#define thread_self() ((pthread_t)TlsGetValue(thread_self_tls_index)) -#define thread_equal(a,b) ((a)==(b)) #define thread_sigmask _sbcl_pthread_sigmask // wrap CriticalSection operators in a function returning 0 to satisfy assertions static inline int cs_mutex_lock(void* l) { EnterCriticalSection(l); return 0; } diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 99637c3838..f4e95983be 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -393,6 +393,9 @@ extern pthread_mutex_t all_threads_lock; // "warning: too many arguments for format [-Wformat-extra-args]" # define THREAD_ID_LABEL "%s" # define THREAD_ID_VALUE "" +#elif defined LISP_FEATURE_WIN32 +# define THREAD_ID_LABEL "%ld" +# define THREAD_ID_VALUE (GetCurrentThreadId()) #elif defined __linux__ extern int sb_GetTID(); # define THREAD_ID_LABEL " tid %d" From a02f8bcd4cb16b66becd51f8804ce4645cc91b22 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sun, 6 Sep 2020 21:04:27 +0300 Subject: [PATCH 0484/4023] Inline nreverse-word-specialized-vector. It's only used inside vector-nreverse. --- src/code/seq.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 72cb29ce0d..e760ca9d3a 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -958,6 +958,7 @@ many elements are copied." ((atom 2nd) 3rd) (rplacd 2nd 3rd))) +(declaim (inline nreverse-word-specialized-vector)) (defun nreverse-word-specialized-vector (vector start end) (do ((left-index start (1+ left-index)) (right-index (1- end) (1- right-index))) From 83a5a0f1cd6bf50148780c7750cb1c2c0e1ed5cf Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 6 Sep 2020 14:12:22 -0400 Subject: [PATCH 0485/4023] Use _beginthreadex --- src/runtime/win32-os.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 1bf3d66eac..3116307550 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -649,7 +649,7 @@ struct { CRITICAL_SECTION lock; CONDITION_VARIABLE cond_has_data; CONDITION_VARIABLE cond_has_client; - pthread_t thread; + HANDLE thread; boolean initialized; HANDLE handle; boolean in_progress; @@ -1681,8 +1681,7 @@ int console_handle_p(HANDLE handle) * entered. */ -static unsigned long -tty_read_line_server() +static __stdcall unsigned int tty_read_line_server(LPVOID arg) { thread_mutex_lock(&ttyinput.lock); while (ttyinput.handle) { @@ -1728,10 +1727,11 @@ tty_maybe_initialize_unlocked(HANDLE handle) } InitializeConditionVariable(&ttyinput.cond_has_data); InitializeConditionVariable(&ttyinput.cond_has_client); - ttyinput.thread = CreateThread(NULL, - 0, // stack size = default - tty_read_line_server, 0, - 0, 0); + ttyinput.thread = + (HANDLE)_beginthreadex(NULL, + 0, // stack size = default + tty_read_line_server, 0, + 0, 0); ttyinput.initialized = 1; } return 1; From 338c975db2f115d0168fb2b5a3ccd1aaac21bf4e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 7 Sep 2020 02:17:05 -0400 Subject: [PATCH 0486/4023] Use a native mutex for already-in-gc And consequently simplify ENTER-FOREIGN-CALLBACK --- src/code/alien-callback.lisp | 18 +--------------- src/code/gc.lisp | 17 +++++++++------ src/code/save.lisp | 1 - src/code/target-thread.lisp | 4 ---- src/runtime/thread.c | 41 ++++++++++++++++-------------------- 5 files changed, 29 insertions(+), 52 deletions(-) diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index a0912022bd..557029d301 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -292,23 +292,7 @@ the alien callback for that function with the given alien type." (in-package "SB-THREAD") #+sb-thread (defun enter-foreign-callback (index return arguments) - (let ((thread - #+sb-safepoint ; cons a FOREIGN-THREAD - (without-gcing (init-thread-local-storage (make-foreign-thread))) - - ;; Deferrable signals are blocked. STOP_FOR_GC is not blocked but can't - ;; occur because GC could only send it after acquiring the all_threads lock, - ;; which it can't get because this thread owns it for the moment. - #-sb-safepoint ; use the preallocated FOREIGN-THREAD - (let ((thread (init-thread-local-storage *foreign-thread*))) - ;; GC would be ok to happen now, but it can't yet because of the - ;; all_threads_lock acting both as a guard on the preallocated thread - ;; and the stop-the-world inhibitor. - ;; There's no point in splitting that into two locks. - (setq *foreign-thread* (make-foreign-thread)) ; "Pay it forward" - (alien-funcall (extern-alien "release_all_threads_lock" - (function void))) - thread))) + (let ((thread (init-thread-local-storage (make-foreign-thread)))) #+pauseless-threadstart (dx-let ((startup-info (vector nil ; trampoline is n/a nil ; cell in *STARTING-THREADS* is n/a diff --git a/src/code/gc.lisp b/src/code/gc.lisp index e40f4f3699..45a97c0404 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -147,7 +147,13 @@ statistics are appended to it." ;;; For GENCGC all generations < GEN will be GC'ed. -(define-load-time-global *already-in-gc* (sb-thread:make-mutex :name "GC lock")) +(defmacro try-acquire-gc-lock (&rest forms) + #-sb-thread `(progn ,@forms t) + #+sb-thread + `(when (eql (alien-funcall (extern-alien "try_acquire_gc_lock" (function int))) 1) + ,@forms + (alien-funcall (extern-alien "release_gc_lock" (function void))) + t)) (defun sub-gc (gen) (cond (*gc-inhibit* @@ -193,8 +199,6 @@ statistics are appended to it." ;; Let's make sure we're not interrupted and that none of ;; the deadline or deadlock detection stuff triggers. (without-interrupts - (sb-thread::without-thread-waiting-for - (:already-without-interrupts t) (let ((sb-impl::*deadline* nil) (epoch *gc-epoch*)) (loop @@ -208,10 +212,9 @@ statistics are appended to it." ;; execute the remainder of the GC: stopping the ;; world with interrupts disabled is the mother of ;; all critical sections. - (cond ((sb-thread:with-mutex (*already-in-gc* :wait-p nil) + (cond ((try-acquire-gc-lock (unsafe-clear-roots gen) - (gc-stop-the-world) - t) + (gc-stop-the-world)) ;; Success! GC. (perform-gc) ;; Return, but leave *gc-pending* as is: we @@ -238,7 +241,7 @@ statistics are appended to it." ;; runtime. (when (and (eql gen 0) (neq epoch *gc-pending*)) - (return 0)))))))))) + (return 0))))))))) (defun post-gc () ;; Outside the mutex, interrupts may be enabled: these may cause diff --git a/src/code/save.lisp b/src/code/save.lisp index ccdcc07ef9..d16f5d583b 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -76,7 +76,6 @@ ;; SAVE-LISP-AND-DIE should have cleaned up, but there's a timing problem ;; with the finalizer thread, and I'm loathe to put in a SLEEP delay. sb-thread::*joinable-threads* - sb-thread::*foreign-thread* sb-thread::*all-threads* sb-thread::*session* sb-kernel::*gc-epoch*)) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 9c9c250ae7..3a5cfed6e9 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -278,9 +278,6 @@ created and old ones may exit at any time." (int-sap 0)) (sb-ext:define-load-time-global *initial-thread* nil) -;;; Always keep one preallocated foreign thread instance so that a non-lisp thread -;;; doesn't need to cons anything prior to release of the all_threads lock. -(sb-ext:define-load-time-global *foreign-thread* nil) ;;; *JOINABLE-THREADS* is a list of THREAD instances used only if #+pauseless-threadstart ;;; I had attempted to construct the list using the thread's memory to create cons @@ -327,7 +324,6 @@ created and old ones may exit at any time." (init-thread-local-storage thread) (setf *initial-thread* thread) (setf *joinable-threads* nil) - #-sb-safepoint (setq *foreign-thread* (make-foreign-thread)) (setq *all-threads* (avl-insert nil (sb-thread::thread-primitive-thread sb-thread:*current-thread*) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index ed66a21276..27f0493b7f 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -78,9 +78,11 @@ pthread_key_t specials = 0; #ifdef LISP_FEATURE_WIN32 CRITICAL_SECTION all_threads_lock; static CRITICAL_SECTION recyclebin_lock; +static CRITICAL_SECTION in_gc_lock; #else pthread_mutex_t all_threads_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t recyclebin_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t in_gc_lock = PTHREAD_MUTEX_INITIALIZER; #endif #endif @@ -253,6 +255,7 @@ void create_main_lisp_thread(lispobj function) { #ifdef LISP_FEATURE_WIN32 InitializeCriticalSection(&all_threads_lock); InitializeCriticalSection(&recyclebin_lock); + InitializeCriticalSection(&in_gc_lock); #endif struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER_WIDETAG); if (!th || arch_os_thread_init(th)==0 || !init_shared_attr_object()) @@ -316,8 +319,7 @@ void free_thread_struct(struct thread *th) static void init_new_thread(struct thread *th, init_thread_data __attribute__((unused)) *scribble, - int guardp, - int retain_all_threads_lock) + int guardp) { int lock_ret; @@ -350,10 +352,7 @@ init_new_thread(struct thread *th, lock_ret = thread_mutex_lock(&all_threads_lock); gc_assert(lock_ret == 0); link_thread(th); - if (!retain_all_threads_lock) { - lock_ret = thread_mutex_unlock(&all_threads_lock); - gc_assert(lock_ret == 0); - } + thread_mutex_unlock(&all_threads_lock); /* Kludge: Changed the order of some steps between the safepoint/ * non-safepoint versions of this code. Can we unify this more? @@ -563,7 +562,7 @@ void* new_thread_trampoline(void* arg) th->control_stack_end = (lispobj*)&arg + 1; #endif th->os_kernel_tid = get_nonzero_tid(); - init_new_thread(th, SCRIBBLE, 0, 0); + init_new_thread(th, SCRIBBLE, 0); // Passing the untagged pointer ensures 2 things: // - that the pinning mechanism works as designed, and not just by accident. // - that the initial stack does not contain a lisp pointer after it is not needed. @@ -586,8 +585,7 @@ void* new_thread_trampoline(void* arg) lispobj function = th->no_tls_value_marker; th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; init_new_thread(th, &scribble, - GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK, - 0); + GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK); funcall0(function); unregister_thread(th, &scribble); @@ -709,16 +707,12 @@ attach_os_thread(init_thread_data *scribble) th->control_stack_end = (void *) (((uintptr_t) stack_addr) + stack_size); #endif -#ifdef LISP_FEATURE_SB_SAFEPOINT - const int retain_lock = 0; -#else - const int retain_lock = 1; -#endif + /* We don't protect the control stack when adopting a foreign thread + * because we wouldn't know where to put the guard */ init_new_thread(th, scribble, /* recycled memory already had mprotect() done, * so avoid 2 syscalls when possible */ - recycled_memory ? 0 : GUARD_BINDING_STACK|GUARD_ALIEN_STACK, - retain_lock); + recycled_memory ? 0 : GUARD_BINDING_STACK|GUARD_ALIEN_STACK); } void @@ -817,13 +811,6 @@ callback_wrapper_trampoline( } } -// Balance out the mutex_lock in attach_os_thread() -void release_all_threads_lock() -{ - if (thread_mutex_unlock(&all_threads_lock)) - lose("ENTER-FOREIGN-CALLBACK bug"); -} - #endif /* LISP_FEATURE_SB_THREAD */ /* this is called from any other thread to create the new one, and @@ -1137,6 +1124,14 @@ uword_t create_thread(struct thread_instance* instance, lispobj start_routine) } #endif +#ifdef LISP_FEATURE_WIN32 +int try_acquire_gc_lock() { return TryEnterCriticalSection(&in_gc_lock); } +void release_gc_lock() { LeaveCriticalSection(&in_gc_lock); } +#else +int try_acquire_gc_lock() { return !pthread_mutex_trylock(&in_gc_lock); } +void release_gc_lock() { pthread_mutex_unlock(&in_gc_lock); } +#endif + /* stopping the world is a two-stage process. From this thread we signal * all the others with SIG_STOP_FOR_GC. The handler for this signal does * the usual pseudo-atomic checks (we don't want to stop a thread while From 410224dc1b96670226763d0f6f7b07be2ebb3ea7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 7 Sep 2020 10:27:05 -0400 Subject: [PATCH 0487/4023] Scrub stack in test --- tests/hide-packages.test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/hide-packages.test.sh b/tests/hide-packages.test.sh index 4107344a3e..5b98c237e9 100644 --- a/tests/hide-packages.test.sh +++ b/tests/hide-packages.test.sh @@ -60,7 +60,6 @@ run_sbcl <
T NIL), ensuring that a -;;; predicate always appears in a conditional context. -;;; -;;; If the function isn't a predicate, then we call -;;; IR1-CONVERT-COMBINATION-CHECKING-TYPE. -(defun ir1-convert-maybe-predicate (start next result form var) - (declare (type ctran start next) - (type (or lvar null) result) - (list form) - (type global-var var)) - (let ((info (info :function :info (leaf-source-name var)))) - (if (and info - (ir1-attributep (fun-info-attributes info) predicate) - (not (if-p (and result (lvar-dest result))))) - (let ((*instrument-if-for-code-coverage* nil)) - (ir1-convert start next result `(if ,form t nil))) - (ir1-convert-combination-checking-type start next result form var)))) - ;;; Actually really convert a global function call that we are allowed ;;; to early-bind. ;;; diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index eca8d05a3c..3065a44640 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -504,6 +504,34 @@ (locall-analyze-component *current-component*)))) (values)) +;;; Similar to FILTER-LVAR, but wraps just one use of an LVAR +(defun wrap-node (node function) + (let* ((lvar (node-lvar node)) + (ctran (or (node-next node) + (block-start (car (block-succ (node-block node)))))) + (placeholder (make-constant 0)) + (form (funcall function placeholder))) + (with-ir1-environment-from-node node + (ensure-block-start ctran) + (let* ((old-block (node-block node)) + (new-start (make-ctran)) + (filtered-lvar (make-lvar)) + (new-block (ctran-starts-block new-start))) + (change-block-successor old-block (car (block-succ old-block)) new-block) + + (%delete-lvar-use node) + (use-lvar node filtered-lvar) + (ir1-convert new-start ctran lvar form) + + ;; Replace PLACEHOLDER with the LVAR. + (let* ((refs (leaf-refs placeholder)) + (node (first refs)) + (victim (node-lvar node))) + (aver (null (rest refs))) ; PLACEHOLDER must be referenced exactly once. + + (substitute-lvar filtered-lvar victim) + (flush-dest victim)))))) + ;;; Delete NODE and VALUE. It may result in some calls becoming tail. (defun delete-filter (node lvar value) (aver (eq (lvar-dest value) node)) diff --git a/src/compiler/ltn.lisp b/src/compiler/ltn.lisp index 6386a63998..25d92852e8 100644 --- a/src/compiler/ltn.lisp +++ b/src/compiler/ltn.lisp @@ -680,6 +680,37 @@ (t (values nil :result-types))))) +(defun conditional-call-translated-p (call) + (let ((templates (fun-info-templates (basic-combination-fun-info call)))) + (labels ((template-args-ok (template ) + (let ((mtype (template-more-args-type template))) + (do ((args (basic-combination-args call) (cdr args)) + (types (template-arg-types template) (cdr types))) + ((null types) + (cond ((null args) t) + ((not mtype) nil) + (t + (dolist (arg args t) + (unless (operand-restriction-ok mtype + (primitive-type (lvar-type arg))) + (return nil)))))) + (when (null args) (return nil)) + (let ((arg (car args)) + (type (car types))) + (unless (operand-restriction-ok type (primitive-type (lvar-type arg)) + :lvar arg) + (return nil)))))) + (is-ok-template-use (template) + (let* ((guard (template-guard template))) + (cond ((and guard (not (funcall guard call))) + nil) + (t + (template-args-ok template)))))) + + (loop for template in templates + thereis + (is-ok-template-use template))))) + ;;; Use operand type information to choose a template from the list ;;; TEMPLATES for a known CALL. We return three values: ;;; 1. The template we found. diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 727cc914eb..e0c62bdad8 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3731,38 +3731,38 @@ (with-test (:name :type-constraint-joining./=) (assert diff --git a/tests/test-util.lisp b/tests/test-util.lisp index d13a5e3ec1..1f00de7ae1 100644 --- a/tests/test-util.lisp +++ b/tests/test-util.lisp @@ -79,12 +79,12 @@ (and (subtypep x y) (subtypep y x))) (defun ctype= (left right) - (let ((a (sb-kernel:specifier-type left))) + (let ((a (sb-kernel:values-specifier-type left))) ;; SPECIFIER-TYPE is a memoized function, and TYPE= is a trivial ;; operation if A and B are EQ. ;; To actually exercise the type operation, remove the memoized parse. (sb-int:drop-all-hash-caches) - (let ((b (sb-kernel:specifier-type right))) + (let ((b (sb-kernel:values-specifier-type right))) (assert (not (eq a b))) (sb-kernel:type= a b)))) From 359084a6793c6c17b7c1ce62cca95ff229e93159 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Wed, 6 Apr 2022 08:16:00 +0300 Subject: [PATCH 3067/4023] Move constraint tests to constraint.pure.lisp --- tests/compiler-2.pure.lisp | 159 ------------------------------------- tests/constraint.pure.lisp | 159 +++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+), 159 deletions(-) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index e0c62bdad8..dab8256d75 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3637,165 +3637,6 @@ (dynamic-extent x)) (throw 'c (the (integer 0 10) r)))))) -(with-test (:name :type-constraint-joining) - (assert - (equal (caddr - (sb-kernel:%simple-fun-type - (checked-compile - `(lambda () - (let ((x 'foo)) - (if (read) - (setq x 3) - (setq x 5)) - x))))) - '(values (or (integer 5 5) (integer 3 3)) &optional)))) - -(with-test (:name :type-constraint-joining.2) - (assert - (equal (caddr - (sb-kernel:%simple-fun-type - (checked-compile - `(lambda (x) - (etypecase x - (integer (read)) - (float (read))) - x)))) - '(values (or float integer) &optional)))) - -(with-test (:name :type-constraint-joining.3) - (assert - (equal (caddr - (sb-kernel:%simple-fun-type - (checked-compile - `(lambda (x) - (if (read) - (setq x (random 10)) - (setq x (random 10.0))) - x)))) - '(values (or (single-float 0.0 (10.0)) (mod 10)) &optional)))) - -(with-test (:name :type-constraint-joining-terminates) - (checked-compile - sb-c:: - `(lambda (name vop) - (block foo - (do* ((block (vop-block vop) (ir2-block-prev block)) - (last vop (ir2-block-last-vop block))) - (nil) - (aver (eq (ir2-block-block block) (ir2-block-block (vop-block vop)))) - (do ((current last (vop-prev current))) - ((null current)) - (when (eq (vop-name current) name) - (return-from foo current)))))))) - -(with-test (:name :type-constraint-joining-conflicts) - (assert (nth-value - 1 - (checked-compile - '(lambda (y) - (let ((x 'foo)) - (ecase y - (1 (setq x (random 10))) - (2 (setq x (make-array 10))) - (3 (setq x (make-hash-table)))) - (symbol-name x))) - :allow-warnings t)))) - -(with-test (:name :type-constraint-joining.eql) - (assert - (equal (caddr - (sb-kernel:%simple-fun-type - (checked-compile - `(lambda (x) - (ecase x - (1 (read)) - (2 (read))) - x)))) - '(values (integer 1 2) &optional)))) - -(with-test (:name :type-constraint-joining./=) - (assert - (equal (caddr - (sb-kernel:%simple-fun-type - (checked-compile - `(lambda (x) - (declare (integer x)) - (cond ((= x 5)) - ((> x 20)) - ((> x 10)) - (t (error ""))) x)))) - '(values (or - (integer 11) - (integer 5 5)) - &optional)))) - -(with-test (:name :type-constraint-joining.complement) - (assert - (equal (caddr - (sb-kernel:%simple-fun-type - (checked-compile - `(lambda (x) - (if (read) - (cond ((typep x 'integer) - (error "")) - (t (print ""))) - (cond ((typep x 'float) - (print "")) - (t (error "")))) - x)))) - '(values (not integer) &optional)))) - (with-test (:name :list-ir2-convert) (checked-compile '(lambda () (declare (notinline list +)) diff --git a/tests/constraint.pure.lisp b/tests/constraint.pure.lisp index 77a99da2b1..6d469b0ec7 100644 --- a/tests/constraint.pure.lisp +++ b/tests/constraint.pure.lisp @@ -146,3 +146,162 @@ a))) ((3 1) nil) ((3 3) t))) + +(with-test (:name :type-constraint-joining) + (assert + (equal (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda () + (let ((x 'foo)) + (if (read) + (setq x 3) + (setq x 5)) + x))))) + '(values (or (integer 5 5) (integer 3 3)) &optional)))) + +(with-test (:name :type-constraint-joining.2) + (assert + (equal (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (x) + (etypecase x + (integer (read)) + (float (read))) + x)))) + '(values (or float integer) &optional)))) + +(with-test (:name :type-constraint-joining.3) + (assert + (equal (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (x) + (if (read) + (setq x (random 10)) + (setq x (random 10.0))) + x)))) + '(values (or (single-float 0.0 (10.0)) (mod 10)) &optional)))) + +(with-test (:name :type-constraint-joining-terminates) + (checked-compile + sb-c:: + `(lambda (name vop) + (block foo + (do* ((block (vop-block vop) (ir2-block-prev block)) + (last vop (ir2-block-last-vop block))) + (nil) + (aver (eq (ir2-block-block block) (ir2-block-block (vop-block vop)))) + (do ((current last (vop-prev current))) + ((null current)) + (when (eq (vop-name current) name) + (return-from foo current)))))))) + +(with-test (:name :type-constraint-joining-conflicts) + (assert (nth-value + 1 + (checked-compile + '(lambda (y) + (let ((x 'foo)) + (ecase y + (1 (setq x (random 10))) + (2 (setq x (make-array 10))) + (3 (setq x (make-hash-table)))) + (symbol-name x))) + :allow-warnings t)))) + +(with-test (:name :type-constraint-joining.eql) + (assert + (equal (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (x) + (ecase x + (1 (read)) + (2 (read))) + x)))) + '(values (integer 1 2) &optional)))) + +(with-test (:name :type-constraint-joining./=) + (assert + (equal (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (x) + (declare (integer x)) + (cond ((= x 5)) + ((> x 20)) + ((> x 10)) + (t (error ""))) x)))) + '(values (or + (integer 11) + (integer 5 5)) + &optional)))) + +(with-test (:name :type-constraint-joining.complement) + (assert + (equal (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (x) + (if (read) + (cond ((typep x 'integer) + (error "")) + (t (print ""))) + (cond ((typep x 'float) + (print "")) + (t (error "")))) + x)))) + '(values (not integer) &optional)))) From 2bc2c6d80397af0c78926fa6680bff7c16e103f8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 7 Apr 2022 01:08:15 +0300 Subject: [PATCH 3068/4023] arm64: use a dedicated VOP for getting T/NIL from conditionals. Simpler than wrapping in (if x t nil) and produces better code. --- src/compiler/arm64/move.lisp | 10 +++ src/compiler/ir1opt.lisp | 13 ---- src/compiler/ir1tran.lisp | 33 ++++++++-- src/compiler/ir2opt.lisp | 116 ++++++++++++++++++----------------- src/compiler/ir2tran.lisp | 46 +++++++++++++- src/compiler/ltn.lisp | 43 +++---------- tests/constraint.pure.lisp | 52 ++++++++-------- 7 files changed, 173 insertions(+), 140 deletions(-) diff --git a/src/compiler/arm64/move.lisp b/src/compiler/arm64/move.lisp index 50d8b7de6e..1b186825a7 100644 --- a/src/compiler/arm64/move.lisp +++ b/src/compiler/arm64/move.lisp @@ -552,3 +552,13 @@ ;;; descriptor passing location. (define-move-vop move-arg :move-arg (signed-reg unsigned-reg) (any-reg descriptor-reg)) + +(define-vop (move-conditional-result) + (:results (res :scs (descriptor-reg))) + (:info true) + (:generator 1 + (move res null-tn) + (inst b done) + (emit-label true) + (load-symbol res t) + done)) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index ed9a080663..dfc66e68d8 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -1130,18 +1130,6 @@ (return-from check-proper-sequences)))) combination info))) -(defun maybe-wrap-predicate (info call) - (when (ir1-attributep (fun-info-attributes info) predicate) - (let ((lvar (node-lvar call))) - (when (and lvar - (not (and (if-p (lvar-dest lvar)) - (immediately-used-p (if-test (lvar-dest lvar)) call))) - (conditional-call-translated-p call)) - (let (*instrument-if-for-code-coverage*) - (wrap-node call - (lambda (x) - `(if ,x t nil)))))))) - ;;; Do IR1 optimizations on a COMBINATION node. (defun ir1-optimize-combination (node &aux (show *show-transforms-p*)) (declare (type combination node)) @@ -1222,7 +1210,6 @@ (constant-lvar-p (first args)) (not (constant-lvar-p (second args)))) (setf (basic-combination-args node) (nreverse args)))) - (maybe-wrap-predicate info node) (let ((fun-source-name (combination-fun-source-name node)) (optimizer (fun-info-optimizer info))) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 00a4b583a3..b4f784dd15 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1105,9 +1105,9 @@ (struct-fun-transform transform form name)) ;; Note that "pass" means fail. Gotta love it. (cond (pass - (ir1-convert-combination-checking-type start next result - (proper-list form) - var)) + (ir1-convert-maybe-predicate start next result + (proper-list form) + var)) (t (unless (policy *lexenv* (zerop store-xref-data)) (record-call name (ctran-block start) *current-path*)) @@ -1117,15 +1117,36 @@ (when (eq (car *current-path*) 'original-source-start) (setf (ctran-source-path start) *current-path*)) (ir1-convert start next result transformed))))) - (ir1-convert-combination-checking-type start next result - (proper-list form) - var)))))) + (ir1-convert-maybe-predicate start next result + (proper-list form) + var)))))) ;;; KLUDGE: If we insert a synthetic IF for a function with the PREDICATE ;;; attribute, don't generate any branch coverage instrumentation for it. (defvar *instrument-if-for-code-coverage* t) +;;; If the function has the PREDICATE attribute, and the RESULT's DEST +;;; isn't an IF, then we convert (IF T NIL), ensuring that a +;;; predicate always appears in a conditional context. +;;; +;;; If the function isn't a predicate, then we call +;;; IR1-CONVERT-COMBINATION-CHECKING-TYPE. +(defun ir1-convert-maybe-predicate (start next result form var) + (declare (type ctran start next) + (type (or lvar null) result) + (list form) + (type global-var var)) + (if (vop-existsp :named sb-vm::move-conditional-result) + (ir1-convert-combination-checking-type start next result form var) + (let ((info (info :function :info (leaf-source-name var)))) + (if (and info + (ir1-attributep (fun-info-attributes info) predicate) + (not (if-p (and result (lvar-dest result))))) + (let ((*instrument-if-for-code-coverage* nil)) + (ir1-convert start next result `(if ,form t nil))) + (ir1-convert-combination-checking-type start next result form var))))) + ;;; Actually really convert a global function call that we are allowed ;;; to early-bind. ;;; diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 78349ca9aa..58f523c109 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -999,63 +999,65 @@ (defoptimizer (vop-optimize (bignump integerp)) (vop) (when (boundp '*2block-info*) (destructuring-bind (target not-p) (vop-codegen-info vop) - (let* ((next (ir2-block-next (vop-block vop))) - (target-block (gethash target *2block-info*)) - (not-target-block (if not-p - target-block - next)) - (target-block (if not-p - next - target-block)) - (cmp (ir2-block-start-vop target-block))) - (when (and cmp - (singleton-p (ir2block-predecessors target-block))) - (let ((integer (tn-ref-tn (vop-args vop))) - (args (vop-args cmp)) - tns) - (when (case (vop-name cmp) - ((sb-vm::>-integer-fixnum sb-vm::<-integer-fixnum) - (when (eq (tn-ref-tn args) integer) - (setf tns (list integer (tn-ref-tn (tn-ref-across args)))))) - ((sb-vm::>-fixnum-integer sb-vm::<-fixnum-integer) - (when (eq (tn-ref-tn (tn-ref-across args)) integer) - (setf tns (list (tn-ref-tn args) integer))))) - (destructuring-bind (cmp-target cmp-not-p) (vop-codegen-info cmp) - (let* ((cmp-next (ir2-block-next (vop-block cmp))) - (cmp-target-block (gethash cmp-target *2block-info*)) - (cmp-not-target-block (if cmp-not-p - cmp-target-block - cmp-next)) - (cmp-target-block (if cmp-not-p - cmp-next - cmp-target-block))) - (when (if cmp-not-p - (eq cmp-not-target-block not-target-block) - (eq cmp-target-block not-target-block)) - (flet ((invert () - (template-or-lose - (case (vop-name cmp) - (sb-vm::>-integer-fixnum 'sb-vm::<=-integer-fixnum) - (sb-vm::<-integer-fixnum 'sb-vm::>=-integer-fixnum) - (sb-vm::>-fixnum-integer 'sb-vm::<=-fixnum-integer) - (sb-vm::<-fixnum-integer 'sb-vm::>=-fixnum-integer))))) - (multiple-value-bind (new-vop new-target new-not-p) - (cond ((and not-p cmp-not-p) - (values (vop-info cmp) target t)) - (not-p - (values (invert) target t)) - (cmp-not-p - (values (invert) cmp-target nil)) - (t - (values (invert) target nil))) - (prog1 - (emit-and-insert-vop (vop-node vop) (vop-block vop) - new-vop - (reference-tn-list tns nil) - nil vop - (list new-target new-not-p)) - (delete-vop vop) - (delete-vop cmp))))))))))) + (let ((target-block (gethash target *2block-info*))) + (when target-block + (let* ((next (ir2-block-next (vop-block vop))) + + (not-target-block (if not-p + target-block + next)) + (target-block (if not-p + next + target-block)) + (cmp (ir2-block-start-vop target-block))) + (when (and cmp + (singleton-p (ir2block-predecessors target-block))) + (let ((integer (tn-ref-tn (vop-args vop))) + (args (vop-args cmp)) + tns) + (when (case (vop-name cmp) + ((sb-vm::>-integer-fixnum sb-vm::<-integer-fixnum) + (when (eq (tn-ref-tn args) integer) + (setf tns (list integer (tn-ref-tn (tn-ref-across args)))))) + ((sb-vm::>-fixnum-integer sb-vm::<-fixnum-integer) + (when (eq (tn-ref-tn (tn-ref-across args)) integer) + (setf tns (list (tn-ref-tn args) integer))))) + (destructuring-bind (cmp-target cmp-not-p) (vop-codegen-info cmp) + (let* ((cmp-next (ir2-block-next (vop-block cmp))) + (cmp-target-block (gethash cmp-target *2block-info*)) + (cmp-not-target-block (if cmp-not-p + cmp-target-block + cmp-next)) + (cmp-target-block (if cmp-not-p + cmp-next + cmp-target-block))) + (when (if cmp-not-p + (eq cmp-not-target-block not-target-block) + (eq cmp-target-block not-target-block)) + (flet ((invert () + (template-or-lose + (case (vop-name cmp) + (sb-vm::>-integer-fixnum 'sb-vm::<=-integer-fixnum) + (sb-vm::<-integer-fixnum 'sb-vm::>=-integer-fixnum) + (sb-vm::>-fixnum-integer 'sb-vm::<=-fixnum-integer) + (sb-vm::<-fixnum-integer 'sb-vm::>=-fixnum-integer))))) + (multiple-value-bind (new-vop new-target new-not-p) + (cond ((and not-p cmp-not-p) + (values (vop-info cmp) target t)) + (not-p + (values (invert) target t)) + (cmp-not-p + (values (invert) cmp-target nil)) + (t + (values (invert) target nil))) + (prog1 + (emit-and-insert-vop (vop-node vop) (vop-block vop) + new-vop + (reference-tn-list tns nil) + nil vop + (list new-target new-not-p)) + (delete-vop vop) + (delete-vop cmp))))))))))))) nil)))) ;;; No need to reset the stack pointer just before returning. diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 74e1146a65..b237de5a01 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -637,6 +637,43 @@ (register-drop-thru alternative) (vop branch if block (block-label alternative))))))) +(when-vop-existsp (:named sb-vm::move-conditional-result) + ;; Use a dedicated VOP instead of wrapping a conditional that needs + ;; to return T/NIL in (if x t nil) + ;; Produces slightly better code, not emitted when not needed. + (defun ir2-convert-conditional-result (node block template args info-args lvar) + (declare (type node node) (type ir2-block block) + (type template template) (type (or tn-ref null) args) + (list info-args)) + (let* ((res (lvar-result-tns lvar + (list *universal-type*) + (list *backend-t-primitive-type*))) + (res-refs (reference-tn-list res t)) + (flags (and (consp (template-result-types template)) + (rest (template-result-types template))))) + (aver (= (template-info-arg-count template) + (+ (length info-args) + (if flags 0 2)))) + (cond ((not flags) + (let ((true (gen-label))) + (emit-template node block template args nil + (list* true nil info-args)) + (emit-template node block (template-or-lose 'sb-vm::move-conditional-result) nil res-refs + (list true)))) + (t + (when (equal flags '(:after-sc-selection)) + ;; To be fixed up by VOP-INFO-AFTER-SC-SELECTION + (setf flags (list :after-sc-selection)) + (setf info-args (append info-args flags))) + (emit-template node block template args nil info-args) + (emit-template node block (template-or-lose 'sb-vm::move-if/descriptor) + (reference-tn-list + (list (emit-constant t) + (emit-constant nil)) + nil) + res-refs (list flags)))) + (move-lvar-result node block res lvar)))) + ;;; Convert an IF that isn't the DEST of a conditional template. (defun ir2-convert-if (node block) (declare (type ir2-block block) (type cif node)) @@ -702,8 +739,13 @@ (reference-args call block (combination-args call) template) (aver (not (template-more-results-type template))) (if (template-conditional-p template) - (ir2-convert-conditional call block template args info-args - (lvar-dest lvar) nil) + (let ((dest (lvar-dest lvar))) + (if (and (vop-existsp :named sb-vm::move-conditional-result) + (not (and (if-p dest) + (immediately-used-p (if-test dest) call)))) + (ir2-convert-conditional-result call block template args info-args lvar) + (ir2-convert-conditional call block template args info-args + (lvar-dest lvar) nil))) (let* ((results (make-template-result-tns call lvar rtypes)) (r-refs (reference-tn-list results t))) (aver (= (length info-args) diff --git a/src/compiler/ltn.lisp b/src/compiler/ltn.lisp index 25d92852e8..4001272f2c 100644 --- a/src/compiler/ltn.lisp +++ b/src/compiler/ltn.lisp @@ -464,6 +464,7 @@ (let* ((test (if-test node)) (use (lvar-uses test))) (unless (and (combination-p use) + (immediately-used-p test use) (let ((info (basic-combination-info use))) (and (template-p info) (template-conditional-p info)))) @@ -670,47 +671,17 @@ :arg-check :arg-types))) ((template-conditional-p template) - (let ((dest (lvar-dest lvar))) - (if (and (if-p dest) - (immediately-used-p (if-test dest) call)) - (values t nil) - (values nil :conditional)))) + (or (vop-existsp :named sb-vm::move-conditional-result) + (let ((dest (lvar-dest lvar))) + (if (and (if-p dest) + (immediately-used-p (if-test dest) call)) + (values t nil) + (values nil :conditional))))) ((template-results-ok template dtype) (values t nil)) (t (values nil :result-types))))) -(defun conditional-call-translated-p (call) - (let ((templates (fun-info-templates (basic-combination-fun-info call)))) - (labels ((template-args-ok (template ) - (let ((mtype (template-more-args-type template))) - (do ((args (basic-combination-args call) (cdr args)) - (types (template-arg-types template) (cdr types))) - ((null types) - (cond ((null args) t) - ((not mtype) nil) - (t - (dolist (arg args t) - (unless (operand-restriction-ok mtype - (primitive-type (lvar-type arg))) - (return nil)))))) - (when (null args) (return nil)) - (let ((arg (car args)) - (type (car types))) - (unless (operand-restriction-ok type (primitive-type (lvar-type arg)) - :lvar arg) - (return nil)))))) - (is-ok-template-use (template) - (let* ((guard (template-guard template))) - (cond ((and guard (not (funcall guard call))) - nil) - (t - (template-args-ok template)))))) - - (loop for template in templates - thereis - (is-ok-template-use template))))) - ;;; Use operand type information to choose a template from the list ;;; TEMPLATES for a known CALL. We return three values: ;;; 1. The template we found. diff --git a/tests/constraint.pure.lisp b/tests/constraint.pure.lisp index 6d469b0ec7..6da240dc5f 100644 --- a/tests/constraint.pure.lisp +++ b/tests/constraint.pure.lisp @@ -225,19 +225,19 @@ (with-test (:name :type-constraint-joining./=) (assert - (equal (caddr - (sb-kernel:%simple-fun-type - (checked-compile - `(lambda (x) - (declare (integer x)) - (cond ((= x 5)) - ((> x 20)) - ((> x 10)) - (t (error ""))) x)))) - '(values (or - (integer 11) - (integer 5 5)) - &optional)))) + (ctype= (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (x) + (declare (integer x)) + (cond ((= x 5)) + ((> x 20)) + ((> x 10)) + (t (error ""))) x)))) + '(values (or + (integer 11) + (integer 5 5)) + &optional)))) (with-test (:name :type-constraint-joining.complement) (assert From 114eb4fea9d16a39b9f397e1e85c60bf5ba66fd5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 7 Apr 2022 01:19:40 +0300 Subject: [PATCH 3069/4023] Properly test for vop existence. --- src/compiler/ir2tran.lisp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index b237de5a01..8edfc6e075 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -740,12 +740,14 @@ (aver (not (template-more-results-type template))) (if (template-conditional-p template) (let ((dest (lvar-dest lvar))) - (if (and (vop-existsp :named sb-vm::move-conditional-result) - (not (and (if-p dest) - (immediately-used-p (if-test dest) call)))) - (ir2-convert-conditional-result call block template args info-args lvar) - (ir2-convert-conditional call block template args info-args - (lvar-dest lvar) nil))) + (cond ((when-vop-existsp (:named sb-vm::move-conditional-result) + (unless (and (if-p dest) + (immediately-used-p (if-test dest) call)) + (ir2-convert-conditional-result call block template args info-args lvar) + t))) + (t + (ir2-convert-conditional call block template args info-args + (lvar-dest lvar) nil)))) (let* ((results (make-template-result-tns call lvar rtypes)) (r-refs (reference-tn-list results t))) (aver (= (length info-args) From 084bdd9ad7861a10cefa6206fde4d61205339ef2 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 7 Apr 2022 01:22:33 +0300 Subject: [PATCH 3070/4023] Use a var. --- src/compiler/ir2tran.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 8edfc6e075..0322e550af 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -747,7 +747,7 @@ t))) (t (ir2-convert-conditional call block template args info-args - (lvar-dest lvar) nil)))) + dest nil)))) (let* ((results (make-template-result-tns call lvar rtypes)) (r-refs (reference-tn-list results t))) (aver (= (length info-args) From 229ccaf18dc3eb04258acac1013355fd22ad7286 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Mon, 4 Apr 2022 01:23:41 -0700 Subject: [PATCH 3071/4023] Use DECLARE instead of DECLAIM FTYPE Declaring types is more maintainable (don't need to keep number of args the same or in sync) and also more consistent with the other functions in this file. --- src/compiler/ctype.lisp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/compiler/ctype.lisp b/src/compiler/ctype.lisp index 19f3dbac0c..acd36b38a8 100644 --- a/src/compiler/ctype.lisp +++ b/src/compiler/ctype.lisp @@ -271,8 +271,8 @@ and no value was provided for it." name)))))))))) ;;; Check that each of the type of each supplied argument intersects ;;; with the type specified for that argument. If we can't tell, then ;;; we can complain about the absence of manifest winnage. -(declaim (ftype (function (list list (or ctype null)) (values)) check-fixed-and-rest)) (defun check-fixed-and-rest (args types rest) + (declare (list args types) (type (or ctype null) rest)) (do ((arg args (cdr arg)) (type types (cdr type)) (n 1 (1+ n))) @@ -289,8 +289,8 @@ and no value was provided for it." name)))))))))) ;;; be known and the corresponding argument should be of the correct ;;; type. If the key isn't a constant, then we can't tell, so we can ;;; complain about absence of manifest winnage. -(declaim (ftype (function (t list fixnum fun-type) boolean) check-key-args)) (defun check-key-args (name args pre-key type) + (declare (list args) (fixnum pre-key) (fun-type type)) (declare (ignorable name)) (let (lossages allow-other-keys unknown-keys) @@ -347,8 +347,9 @@ and no value was provided for it." name)))))))))) ;;; ;;; Due to the lack of a (LIST X) type specifier, we can't reconstruct ;;; the &REST type. -(declaim (ftype (sfunction (functional) fun-type) definition-type)) (defun definition-type (functional) + (declare (type functional functional) + #-sb-xc-host (values fun-type)) (if (lambda-p functional) (make-fun-type :required (mapcar #'leaf-type (lambda-vars functional)) @@ -433,11 +434,11 @@ and no value was provided for it." name)))))))))) ;;; Return an APPROXIMATE-FUN-TYPE representing the context of ;;; CALL. If TYPE is supplied and not null, then we merge the ;;; information into the information already accumulated in TYPE. -(declaim (ftype (function (combination - &optional (or approximate-fun-type null)) - approximate-fun-type) - note-fun-use)) (defun note-fun-use (call &optional type) + (declare (type combination call) + (type (or approximate-fun-type null) type) + #-sb-xc-host + (values approximate-fun-type)) (let* ((type (or type (make-approximate-fun-type))) (types (approximate-fun-type-types type)) (args (combination-args call)) @@ -498,16 +499,17 @@ and no value was provided for it." name)))))))))) ;;; This is similar to VALID-FUN-USE, but checks an ;;; APPROXIMATE-FUN-TYPE against a real function type. -(declaim (ftype (function (approximate-fun-type fun-type - &optional function function function) - (values boolean boolean)) - valid-approximate-type)) (defun valid-approximate-type (call-type type &optional (*ctype-test-fun* #'types-equal-or-intersect) (*lossage-fun* #'compiler-style-warn) (*unwinnage-fun* #'compiler-notify)) + (declare (type approximate-fun-type call-type) + (type fun-type type) + (function *ctype-test-fun* *lossage-fun* *unwinnage-fun*) + #-sb-xc-host + (values boolean boolean)) (let* ((*lossage-detected* nil) (*unwinnage-detected* nil) (required (fun-type-required type)) @@ -551,10 +553,10 @@ and no value was provided for it." name)))))))))) ;;; Check that each of the types used at each arg position is ;;; compatible with the actual type. -(declaim (ftype (function (approximate-fun-type list (or ctype null)) - (values)) - check-approximate-fixed-and-rest)) (defun check-approximate-fixed-and-rest (call-type fixed rest) + (declare (type approximate-fun-type call-type) + (list fixed) + (type (or ctype null) rest)) (do ((types (approximate-fun-type-types call-type) (cdr types)) (n 1 (1+ n)) (arg fixed (cdr arg))) @@ -566,9 +568,8 @@ and no value was provided for it." name)))))))))) ;;; Check that each of the call-types is compatible with DECL-TYPE, ;;; complaining if not or if we can't tell. -(declaim (ftype (function (list ctype string &rest t) (values)) - check-approximate-arg-type)) (defun check-approximate-arg-type (call-types decl-type context &rest args) + (declare (list call-types) (type ctype decl-type) (string context)) (when *ctype-test-fun* (let ((losers *empty-type*)) (dolist (ctype call-types) From c3ee632afd5168c6bbb355be9a961dd3ee16ffa2 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Wed, 6 Apr 2022 15:22:47 -0700 Subject: [PATCH 3072/4023] Remove unused function. It's OAOO too. --- src/compiler/ir1util.lisp | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 3065a44640..eca8d05a3c 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -504,34 +504,6 @@ (locall-analyze-component *current-component*)))) (values)) -;;; Similar to FILTER-LVAR, but wraps just one use of an LVAR -(defun wrap-node (node function) - (let* ((lvar (node-lvar node)) - (ctran (or (node-next node) - (block-start (car (block-succ (node-block node)))))) - (placeholder (make-constant 0)) - (form (funcall function placeholder))) - (with-ir1-environment-from-node node - (ensure-block-start ctran) - (let* ((old-block (node-block node)) - (new-start (make-ctran)) - (filtered-lvar (make-lvar)) - (new-block (ctran-starts-block new-start))) - (change-block-successor old-block (car (block-succ old-block)) new-block) - - (%delete-lvar-use node) - (use-lvar node filtered-lvar) - (ir1-convert new-start ctran lvar form) - - ;; Replace PLACEHOLDER with the LVAR. - (let* ((refs (leaf-refs placeholder)) - (node (first refs)) - (victim (node-lvar node))) - (aver (null (rest refs))) ; PLACEHOLDER must be referenced exactly once. - - (substitute-lvar filtered-lvar victim) - (flush-dest victim)))))) - ;;; Delete NODE and VALUE. It may result in some calls becoming tail. (defun delete-filter (node lvar value) (aver (eq (lvar-dest value) node)) From 2f97f2b8563b1ac074f5c4568694ff786ff35fdf Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 7 Apr 2022 22:18:45 +0300 Subject: [PATCH 3073/4023] arm64: add disassembly for CCMP/N. --- src/compiler/arm64/insts.lisp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 644728cc78..d7ae1ac4c0 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -1060,8 +1060,24 @@ (0 1 4) (nzcv 4 0)) +(define-instruction-format + (cond-compare 32 + :default-printer '(:name :tab rn ", " rm ", " nzcv ", " cond)) + (op :field (byte 1 30)) + (op2 :field (byte 9 21) :value #b111010010) + (rm :field (byte 5 16) :type 'reg) + (cond :field (byte 4 12) :type 'cond) + (imm-p :field (byte 1 11)) + (op3 :field (byte 1 10) :value 0) + (rn :field (byte 5 5) :type 'reg) + (op4 :field (byte 1 4) :value 0) + (nzcv :field (byte 4 0) :type 'unsigned-immediate)) + (defmacro def-cond-compare (name op) `(define-instruction ,name (segment rn rm-imm cond &optional (nzcv 0)) + (:printer cond-compare ((op ,op) (imm-p 0))) + (:printer cond-compare ((op ,op) (imm-p 1) + (rm nil :type 'unsigned-immediate))) (:emitter (emit-cond-compare segment +64-bit-size+ ,op (if (integerp rm-imm) From a2761f3210ab10740db2b1ce5ba0365d563ff9be Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 8 Apr 2022 00:29:48 +0300 Subject: [PATCH 3074/4023] ir2-optimize-jumps: delete unused branches. --- src/compiler/ir2opt.lisp | 100 ++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 58 deletions(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 58f523c109..f21eba010b 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -311,27 +311,6 @@ ;;; Remove BRANCHes that are jumped over by BRANCH-IF ;;; Should be run after DELETE-NO-OP-VOPS, otherwise the empty moves ;;; will interfere. - -;;; FIXME: there is one more minor glitch caused by multiway branch, -;;; but it is not a correctness bug. Consider: -;;; (defun f (&optional (a (missing-arg)) (b (missing-arg)) -;;; (c (missing-arg)) (d (missing-arg))) -;;; (list a b c d )) -;;; -;;; Granted that this is a slightly weird idiom, but it is used frequently -;;; in system internals as well as by FORMATTER's macroexpansion. -;;; The main entry point dispatches on the argument count. -;;; After elimination of redundant moves, we end up with: -;;; ; DF2: 42FF2498 JMP QWORD PTR [RAX+R11*4] -;;; ; DF6: E981000000 JMP L3 -;;; ; DFB: E999000000 JMP L4 -;;; ; E00: E9B1000000 JMP L5 -;;; ; E05: E9C9000000 JMP L6 -;;; where every one of the jumps to a label is unreachable. -;;; This is because each of the original IF's would have branched -;;; to two MOVEs that are eliminated as the arg/results get packed -;;; in the same physical location, and then the branch is performed, -;;; but it is in a dead IR2 block. (defun ir2-optimize-jumps (component) (flet ((start-vop (block) (do ((block block (ir2-block-next block))) @@ -353,28 +332,32 @@ (return label)) ((ir2-block-start-vop block) (return nil))))))) - ;; This is the same information as in *2block-info*. "Too Many Cooks" - ;; (Well, the *2block-info* is gone at this point) - (let ((label-block-map (make-hash-table :test #'eq))) - (do-ir2-blocks (block component) - (setf (gethash (ir2-block-%trampoline-label block) label-block-map) - block) - (setf (gethash (ir2-block-%label block) label-block-map) - block)) + (let ((*2block-info* (make-hash-table :test #'eq))) + (initialize-ir2-blocks-flow-info component) (labels ((unchain-jumps (vop) ;; Handle any branching vop except a multiway branch (setf (first (vop-codegen-info vop)) (follow-jumps (first (vop-codegen-info vop))))) - (follow-jumps (target-label) + (follow-jumps (target-label &optional (delete t)) (declare (type label target-label)) - (let* ((target-block (gethash target-label label-block-map)) + (let* ((target-block (gethash target-label *2block-info*)) (target-vop (start-vop target-block))) - (if (and target-vop - (eq (vop-name target-vop) 'branch) - (neq (first (vop-codegen-info target-vop)) - target-label)) - (follow-jumps (first (vop-codegen-info target-vop))) - target-label))) + (cond ((and target-vop + (eq (vop-name target-vop) 'branch) + (neq (first (vop-codegen-info target-vop)) + target-label)) + ;; Just pop any block, *2block-info* is only + ;; used here and it just needs to know the + ;; number of predecessors, not their + ;; identity. + (when delete + (pop (ir2block-predecessors target-block)) + (if (ir2block-predecessors target-block) + (setf delete nil) + (delete-vop target-vop))) + (follow-jumps (first (vop-codegen-info target-vop)) delete)) + (t + target-label)))) (remove-jump-overs (branch-if branch) ;; Turn BRANCH-IF #, BRANCH #, L1: ;; into BRANCH-IF[NOT] L2 @@ -396,27 +379,28 @@ ;; should take the label of the latter. (do-ir2-blocks (block component) (let ((last (ir2-block-last-vop block))) - (case (and last (vop-name last)) - (branch - (unchain-jumps last) - ;; A block may end up having BRANCH-IF + BRANCH after converting an IF. - ;; Multiway can't coexist with any other branch preceding or following - ;; in the block, so we don't have to check for that, just a BRANCH-IF. - (let ((prev (vop-prev last))) - (when (and prev - (or (eq (vop-name prev) 'branch-if) - (conditional-p prev))) - (unchain-jumps prev)))) - (branch-if - (unchain-jumps last)) - (multiway-branch-if-eq - ;; codegen-info = (labels else-label key-type keys original-comparator) - (let ((info (vop-codegen-info last))) - (setf (car info) (mapcar #'follow-jumps (car info)) - (cadr info) (follow-jumps (cadr info))))) - (t - (when (and last (conditional-p last)) - (unchain-jumps last)))))) + (when last + (case (vop-name last) + (branch + (unchain-jumps last) + ;; A block may end up having BRANCH-IF + BRANCH after converting an IF. + ;; Multiway can't coexist with any other branch preceding or following + ;; in the block, so we don't have to check for that, just a BRANCH-IF. + (let ((prev (vop-prev last))) + (when (and prev + (or (eq (vop-name prev) 'branch-if) + (conditional-p prev))) + (unchain-jumps prev)))) + (branch-if + (unchain-jumps last)) + (multiway-branch-if-eq + ;; codegen-info = (labels else-label key-type keys original-comparator) + (let ((info (vop-codegen-info last))) + (setf (car info) (mapcar #'follow-jumps (car info)) + (cadr info) (follow-jumps (cadr info))))) + (t + (when (conditional-p last) + (unchain-jumps last))))))) ;; Pass 2 ;; Need to unchain the jumps before handling jump-overs, ;; otherwise the BRANCH over which BRANCH-IF jumps may be a From 03b7d79e1cb5b388de76ba106486c5da33a0e849 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 8 Apr 2022 00:30:33 +0300 Subject: [PATCH 3075/4023] vop-optimize if-eq: handle wired null registers. --- src/compiler/ir2opt.lisp | 24 ++++++++++++++---------- src/compiler/tn.lisp | 12 +++++++----- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index f21eba010b..5b282d5948 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -623,16 +623,20 @@ (let* ((args (vop-args if-eq)) (x (tn-ref-tn args)) (y (tn-ref-tn (tn-ref-across args)))) - (when (constant-tn-p y) - (let ((move (branch-destination branch-if))) - (when (and move - (eq (vop-name move) 'move)) - (let* ((args (vop-args move)) - (from (tn-ref-tn args))) - (when (and (constant-tn-p from) - (eq (tn-leaf y) - (tn-leaf from))) - (change-tn-ref-tn args x)))))) + (flet ((constant-p (x) + (or (constant-tn-p x) + (type= (tn-type x) + (specifier-type 'null))))) + (when (constant-p y) + (let ((move (branch-destination branch-if))) + (when (and move + (eq (vop-name move) 'move)) + (let* ((args (vop-args move)) + (from (tn-ref-tn args))) + (when (and (constant-p from) + (eq (tn-leaf y) + (tn-leaf from))) + (change-tn-ref-tn args x))))))) nil))))) ;;; If 2BLOCK ends in an IF-EQ (or similar) + BRANCH-IF where the second operand diff --git a/src/compiler/tn.lisp b/src/compiler/tn.lisp index d102af5e1e..01ad8b8082 100644 --- a/src/compiler/tn.lisp +++ b/src/compiler/tn.lisp @@ -226,11 +226,13 @@ (immediate-constant-sc (constant-value constant)) ;; currently NULL-OFFSET is used only on ARM64 (if null-offset - (setf (leaf-info constant) - (component-live-tn - (make-wired-tn (primitive-type (leaf-type constant)) - immed - null-offset))) + (let ((tn (component-live-tn + (make-wired-tn (primitive-type (leaf-type constant)) + immed + null-offset + (specifier-type 'null))))) + (setf (tn-leaf tn) constant + (leaf-info constant) tn)) (let* ((boxed (or (not immed) (boxed-immediate-sc-p immed))) (component (component-info *component-being-compiled*)) From 31bd4947fb57e56a538abb2e93f865760cbeb2af Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 8 Apr 2022 00:31:15 +0300 Subject: [PATCH 3076/4023] arm64: compare widetag ranges using sub+cmp. --- src/compiler/arm64/type-vops.lisp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index eb9e1674a7..b90bcda40c 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -131,6 +131,12 @@ (inst cmp temp (ldb (byte 8 0) (logand start (cdadr remaining)))) (inst b (if not-p :ne :eq) target) (return)) + ((and last + (/= start bignum-widetag) + (/= end complex-array-widetag)) + (inst sub temp temp start) + (inst cmp temp (- end start)) + (inst b (if not-p :hi :ls) target)) (t (unless (= start bignum-widetag) (inst cmp temp start) From 98e515044f53c3ef7d4a2a42055494fa6a186246 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 8 Apr 2022 00:31:49 +0300 Subject: [PATCH 3077/4023] arm64: test for consp without a branch. Using ccmp. --- src/compiler/arm64/type-vops.lisp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index b90bcda40c..f81db231a6 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -532,13 +532,12 @@ (define-vop (consp type-predicate) (:translate consp) + (:conditional :ne) + (:info) (:generator 8 - (let* ((drop-thru (gen-label)) - (is-not-cons-label (if not-p target drop-thru))) - (inst cmp value null-tn) - (inst b :eq is-not-cons-label) - (test-type value temp target not-p (list-pointer-lowtag)) - (emit-label drop-thru)))) + (inst and temp value lowtag-mask) + (inst cmp temp list-pointer-lowtag) + (inst ccmp value null-tn :eq 4))) (define-vop (single-float-p) (:args (value :scs (any-reg descriptor-reg))) From 91e588fd7d0f4976615795aca7c60ded34cbd996 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Fri, 8 Apr 2022 18:37:49 -0400 Subject: [PATCH 3078/4023] Change print_generation_stats a bit * Sum down each column * Show "waste" as a percent * Delete "pinned", it's really not useful (and obsolete as soon as GC returns, and irrelevant to all but 1 generation) --- src/runtime/gencgc.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 80d13bb993..c455dd03dc 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -435,8 +435,8 @@ write_generation_stats(FILE *file) /* Print the heap stats. */ fprintf(file, - "Gen Boxed Cons Raw Code SmMix Mixed LgRaw LgCode LgMix " - "Pin Alloc Waste Trig Dirty GCs Mem-age\n"); + "Gen Boxed Cons Raw Code SmMix Mixed LgRaw LgCode LgMix" + " Waste%% Alloc Trig Dirty GCs Mem-age\n"); generation_index_t i, begin, end; // Print from the lowest gen that has any allocated pages. @@ -446,9 +446,11 @@ write_generation_stats(FILE *file) for (end = SCRATCH_GENERATION; end >= 0; --end) if (generations[end].bytes_allocated) break; + page_index_t coltot[9]; + memset(coltot, 0, sizeof coltot); for (i = begin; i <= end; i++) { page_index_t page; - page_index_t pagect[9], pinned_cnt = 0; + page_index_t pagect[9]; memset(pagect, 0, sizeof pagect); for (page = 0; page < next_free_page; page++) @@ -467,33 +469,37 @@ write_generation_stats(FILE *file) default: lose("Invalid page type %#x (p%"PAGE_INDEX_FMT")", page_table[page].type, page); } pagect[column]++; - if (page_table[page].pinned) pinned_cnt++; + coltot[column]++; } struct generation* gen = &generations[i]; gc_assert(gen->bytes_allocated == count_generation_bytes_allocated(i)); page_index_t tot_pages, n_dirty; tot_pages = count_generation_pages(i, &n_dirty); + uword_t waste = npage_bytes(tot_pages) - generations[i].bytes_allocated; + double pct_waste = tot_pages > 0 ? + (double)waste / (double)npage_bytes(tot_pages) * 100 : 0.0; fprintf(file, " %d %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT - "%7"PAGE_INDEX_FMT"%5d %11"OS_VM_SIZE_FMT - " %9"OS_VM_SIZE_FMT - " %11"OS_VM_SIZE_FMT, + "%7"PAGE_INDEX_FMT" %6.1f %11"OS_VM_SIZE_FMT" %11"OS_VM_SIZE_FMT, i, pagect[0], pagect[1], pagect[2], pagect[3], pagect[4], pagect[5], pagect[6], pagect[7], pagect[8], - (int)pinned_cnt, - (uintptr_t)gen->bytes_allocated, - (uintptr_t)npage_bytes(tot_pages) - generations[i].bytes_allocated, + pct_waste, (uintptr_t)gen->bytes_allocated, (uintptr_t)gen->gc_trigger); // gen0 pages are never WPed fprintf(file, i==0?" -" : " %7"PAGE_INDEX_FMT, n_dirty); fprintf(file, " %3d %7.4f\n", gen->num_gc, generation_average_age(i)); } - fprintf(file," Total bytes allocated = %13"OS_VM_SIZE_FMT"\n", - (uintptr_t)bytes_allocated); - fprintf(file," Dynamic-space-size bytes = %13"OS_VM_SIZE_FMT"\n", - (uintptr_t)dynamic_space_size); + double frac = 100 * (double)bytes_allocated / (double)dynamic_space_size; + fprintf(file, + "-- %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT + "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT + "%7"PAGE_INDEX_FMT" %18"OS_VM_SIZE_FMT + " [%.1f%% of %"OS_VM_SIZE_FMT" max]\n", + coltot[0], coltot[1], coltot[2], coltot[3], coltot[4], coltot[5], coltot[6], + coltot[7], coltot[8], + (uintptr_t)bytes_allocated, frac, (uintptr_t)dynamic_space_size); #ifdef LISP_FEATURE_X86 fpu_restore(fpu_state); From a5789ec9466c949b9312fec03d5b11548d84a37f Mon Sep 17 00:00:00 2001 From: Marco Heisig Date: Mon, 4 Apr 2022 12:44:11 +0200 Subject: [PATCH 3079/4023] Introduce more fine-grained integer simd pack types. Split the type (simd-pack[-256] integer) into (simd-pack[-256] (A B)), where A is one of {signed-byte,unsigned-byte} and where B is one of {8,16,32,64}. The benefits of doing so are more precise static type checking, and a more helpful printed representation of integer SIMD packs. Additionally, introduce a simd-pack[-256]-any primitive type that can be used to implement VOPs whose implementation is independent of the actual SIMD pack type, such as %simd-pack-low or %simd-pack-256-0. This way, we can get rid of the clumsy sb-vm:simd-pack[-256]-dispatch macros that lead to unnecessary code bloat. --- src/code/load.lisp | 4 +- src/code/print.lisp | 132 ++++++++++---------- src/code/stubs.lisp | 8 +- src/cold/exports.lisp | 14 ++- src/compiler/dump.lisp | 2 +- src/compiler/generic/primtype.lisp | 122 +++++++++++++++---- src/compiler/generic/vm-fndb.lisp | 86 ++++++++++++- src/compiler/pack.lisp | 2 +- src/compiler/x86-64/parms.lisp | 12 +- src/compiler/x86-64/simd-pack-256.lisp | 161 +++++++++++++++++-------- src/compiler/x86-64/simd-pack.lisp | 130 ++++++++++++++------ tests/simd-pack-256.pure.lisp | 71 ++++++----- tests/simd-pack.pure.lisp | 71 ++++++----- 13 files changed, 559 insertions(+), 256 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index cc3eb0d60e..237fcd35cf 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -998,8 +998,8 @@ (with-fast-read-byte ((unsigned-byte 8) (fasl-input-stream)) (let ((tag (fast-read-s-integer 8))) (cond #+sb-simd-pack-256 - ((logbitp 2 tag) - (%make-simd-pack-256 (logand tag #b11) + ((logbitp 6 tag) + (%make-simd-pack-256 (logand tag #b00111111) (fast-read-u-integer 8) (fast-read-u-integer 8) (fast-read-u-integer 8) diff --git a/src/code/print.lisp b/src/code/print.lisp index 789b47c637..ee5391ae99 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -1918,69 +1918,57 @@ variable: an unreadable object representing the error is printed instead.") #+sb-simd-pack (defmethod print-object ((pack simd-pack) stream) (cond ((and *print-readably* *read-eval*) - (multiple-value-bind (format maker extractor) - (etypecase pack - ((simd-pack double-float) - (values "#.(~S ~S ~S)" - '%make-simd-pack-double #'%simd-pack-doubles)) - ((simd-pack single-float) - (values "#.(~S ~S ~S ~S ~S)" - '%make-simd-pack-single #'%simd-pack-singles)) - (t - (values "#.(~S #X~16,'0X #X~16,'0X)" - '%make-simd-pack-ub64 #'%simd-pack-ub64s))) - (multiple-value-call - #'format stream format maker (funcall extractor pack)))) + (format stream "#.(~S #b~3,'0b #x~16,'0X #x~16,'0X)" + '%make-simd-pack + (%simd-pack-tag pack) + (%simd-pack-low pack) + (%simd-pack-high pack))) (*print-readably* (print-not-readable-error pack stream)) (t (print-unreadable-object (pack stream) - (flet ((all-ones-p (value start end &aux (mask (- (ash 1 end) (ash 1 start)))) - (= (logand value mask) mask)) - (split-num (value start) - (loop - for i from 0 to 3 - and v = (ash value (- start)) then (ash v -8) - collect (logand v #xFF)))) - (multiple-value-bind (low high) - (%simd-pack-ub64s pack) - (etypecase pack - ((simd-pack double-float) - (multiple-value-bind (v0 v1) (%simd-pack-doubles pack) - (format stream "~S~@{ ~:[~,13E~;~*TRUE~]~}" - 'simd-pack - (all-ones-p low 0 64) v0 - (all-ones-p high 0 64) v1))) - ((simd-pack single-float) - (multiple-value-bind (v0 v1 v2 v3) (%simd-pack-singles pack) - (format stream "~S~@{ ~:[~,7E~;~*TRUE~]~}" - 'simd-pack - (all-ones-p low 0 32) v0 - (all-ones-p low 32 64) v1 - (all-ones-p high 0 32) v2 - (all-ones-p high 32 64) v3))) - (t - (format stream "~S~@{ ~{ ~2,'0X~}~}" - 'simd-pack - (split-num low 0) (split-num low 32) - (split-num high 0) (split-num high 32)))))))))) + (etypecase pack + ((simd-pack double-float) + (multiple-value-call #'format stream "~S~@{ ~,13E~}" + (%simd-pack-doubles pack))) + ((simd-pack single-float) + (multiple-value-call #'format stream "~S~@{ ~,7E~}" 'simd-pack + (%simd-pack-singles pack))) + ((simd-pack (unsigned-byte 8)) + (multiple-value-call #'format stream "~S~@{ ~3D~}" 'simd-pack + (%simd-pack-ub8s pack))) + ((simd-pack (unsigned-byte 16)) + (multiple-value-call #'format stream "~S~@{ ~5D~}" 'simd-pack + (%simd-pack-ub16s pack))) + ((simd-pack (unsigned-byte 32)) + (multiple-value-call #'format stream "~S~@{ ~10D~}" 'simd-pack + (%simd-pack-ub32s pack))) + ((simd-pack (unsigned-byte 64)) + (multiple-value-call #'format stream "~S~@{ ~20D~}" 'simd-pack + (%simd-pack-ub64s pack))) + ((simd-pack (signed-byte 8)) + (multiple-value-call #'format stream "~S~@{ ~4,@D~}" 'simd-pack + (%simd-pack-sb8s pack))) + ((simd-pack (signed-byte 16)) + (multiple-value-call #'format stream "~S~@{ ~6,@D~}" 'simd-pack + (%simd-pack-sb16s pack))) + ((simd-pack (signed-byte 32)) + (multiple-value-call #'format stream "~S~@{ ~11@D~}" 'simd-pack + (%simd-pack-sb32s pack))) + ((simd-pack (signed-byte 64)) + (multiple-value-call #'format stream "~S~@{ ~20@D~}" 'simd-pack + (%simd-pack-sb64s pack)))))))) #+sb-simd-pack-256 (defmethod print-object ((pack simd-pack-256) stream) (cond ((and *print-readably* *read-eval*) - (multiple-value-bind (format maker extractor) - (etypecase pack - ((simd-pack-256 double-float) - (values "#.(~@{~S~^ ~})" - '%make-simd-pack-256-double #'%simd-pack-256-doubles)) - ((simd-pack-256 single-float) - (values "#.(~@{~S~^ ~})" - '%make-simd-pack-256-single #'%simd-pack-256-singles)) - (t - (values "#.(~S~@{ #X~16,'0X~})" - '%make-simd-pack-256-ub64 #'%simd-pack-256-ub64s))) - (multiple-value-call - #'format stream format maker (funcall extractor pack)))) + (format stream "#.(~S #b~3,'0B #x~16,'0D #x~16,'0D #x~16,'0D #x~16,'0D)" + '%make-simd-pack-256 + (%simd-pack-256-tag pack) + (%simd-pack-256-0 pack) + (%simd-pack-256-1 pack) + (%simd-pack-256-2 pack) + (%simd-pack-256-3 pack))) (*print-readably* (print-not-readable-error pack stream)) (t @@ -1988,18 +1976,34 @@ variable: an unreadable object representing the error is printed instead.") (etypecase pack ((simd-pack-256 double-float) (multiple-value-call #'format stream "~S~@{ ~,13E~}" - 'simd-pack-256 (%simd-pack-256-doubles pack))) ((simd-pack-256 single-float) - (multiple-value-call #'format stream "~S~@{ ~,7E~}" - 'simd-pack-256 + (multiple-value-call #'format stream "~S~@{ ~,7E~}" 'simd-pack-256 (%simd-pack-256-singles pack))) - (t - (multiple-value-bind (p0 p1 p2 p3) - (%simd-pack-256-ub64s pack) - (format stream "~S~@{ ~16,'0X~}" - 'simd-pack-256 - p0 p1 p2 p3)))))))) + ((simd-pack-256 (unsigned-byte 8)) + (multiple-value-call #'format stream "~S~@{ ~3D~}" 'simd-pack-256 + (%simd-pack-256-ub8s pack))) + ((simd-pack-256 (unsigned-byte 16)) + (multiple-value-call #'format stream "~S~@{ ~5D~}" 'simd-pack-256 + (%simd-pack-256-ub16s pack))) + ((simd-pack-256 (unsigned-byte 32)) + (multiple-value-call #'format stream "~S~@{ ~10D~}" 'simd-pack-256 + (%simd-pack-256-ub32s pack))) + ((simd-pack-256 (unsigned-byte 64)) + (multiple-value-call #'format stream "~S~@{ ~20D~}" 'simd-pack-256 + (%simd-pack-256-ub64s pack))) + ((simd-pack-256 (signed-byte 8)) + (multiple-value-call #'format stream "~S~@{ ~4@D~}" 'simd-pack-256 + (%simd-pack-256-sb8s pack))) + ((simd-pack-256 (signed-byte 16)) + (multiple-value-call #'format stream "~S~@{ ~6@D~}" 'simd-pack-256 + (%simd-pack-256-sb16s pack))) + ((simd-pack-256 (signed-byte 32)) + (multiple-value-call #'format stream "~S~@{ ~11@D~}" 'simd-pack-256 + (%simd-pack-256-sb32s pack))) + ((simd-pack-256 (signed-byte 64)) + (multiple-value-call #'format stream "~S~@{ ~20@D~}" 'simd-pack-256 + (%simd-pack-256-sb64s pack)))))))) ;;;; functions diff --git a/src/code/stubs.lisp b/src/code/stubs.lisp index 900636c82e..11275c8e1e 100644 --- a/src/code/stubs.lisp +++ b/src/code/stubs.lisp @@ -175,16 +175,16 @@ #+sb-simd-pack (macrolet ((def (name) `(defun ,name (pack) - (sb-vm::simd-pack-dispatch pack - (,name pack))))) + (declare (simd-pack pack)) + (,name pack)))) (def %simd-pack-low) (def %simd-pack-high)) #+sb-simd-pack-256 (macrolet ((def (name) `(defun ,name (pack) - (sb-vm::simd-pack-256-dispatch pack - (,name pack))))) + (declare (simd-pack-256 pack)) + (,name pack)))) (def %simd-pack-256-0) (def %simd-pack-256-1) (def %simd-pack-256-2) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 1d854b808d..421c083933 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1112,8 +1112,14 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "%MAKE-SIMD-PACK-UB64" "%MAKE-SIMD-PACK-DOUBLE" "%MAKE-SIMD-PACK-SINGLE" + "%SIMD-PACK-UB8S" + "%SIMD-PACK-UB16S" "%SIMD-PACK-UB32S" "%SIMD-PACK-UB64S" + "%SIMD-PACK-SB8S" + "%SIMD-PACK-SB16S" + "%SIMD-PACK-SB32S" + "%SIMD-PACK-SB64S" "%SIMD-PACK-DOUBLES" "%SIMD-PACK-SINGLES") #+sb-simd-pack-256 @@ -1124,8 +1130,14 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "%MAKE-SIMD-PACK-256-UB64" "%MAKE-SIMD-PACK-256-DOUBLE" "%MAKE-SIMD-PACK-256-SINGLE" + "%SIMD-PACK-256-UB8S" + "%SIMD-PACK-256-UB16S" "%SIMD-PACK-256-UB32S" "%SIMD-PACK-256-UB64S" + "%SIMD-PACK-256-SB8S" + "%SIMD-PACK-256-SB16S" + "%SIMD-PACK-256-SB32S" + "%SIMD-PACK-256-SB64S" "%SIMD-PACK-256-DOUBLES" "%SIMD-PACK-256-SINGLES")) @@ -1387,7 +1399,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "TN-REF-NEXT" "TN-REF-NEXT-REF" "TN-REF-P" "TN-REF-TARGET" "TN-REF-TN" "TN-REF-TYPE" "TN-REF-VOP" "TN-REF-WRITE-P" "TN-SC" "TN-REF-MEMORY-ACCESS" - "TN-KIND" "TN-VALUE" + "TN-KIND" "TN-PRIMITIVE-TYPE" "TN-VALUE" "TYPE-CHECK-ERROR" "UNBIND" "UNBIND-N" "UNBIND-TO-HERE" "UNSAFE" "UNSAFELY-FLUSHABLE" "UNWIND" "UWP-ENTRY" "UNPACK-CODE-FIXUP-LOCS" diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 15642520eb..10aef8af91 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -513,7 +513,7 @@ #+(and (not sb-xc-host) sb-simd-pack-256) (defun dump-simd-pack-256 (x file) (dump-fop 'fop-simd-pack file) - (dump-integer-as-n-bytes (logior (%simd-pack-256-tag x) 4) 8 file) + (dump-integer-as-n-bytes (logior (%simd-pack-256-tag x) (ash 1 6)) 8 file) (dump-integer-as-n-bytes (%simd-pack-256-0 x) 8 file) (dump-integer-as-n-bytes (%simd-pack-256-1 x) 8 file) (dump-integer-as-n-bytes (%simd-pack-256-2 x) 8 file) diff --git a/src/compiler/generic/primtype.lisp b/src/compiler/generic/primtype.lisp index 59f701a9e8..913672cf24 100644 --- a/src/compiler/generic/primtype.lisp +++ b/src/compiler/generic/primtype.lisp @@ -100,20 +100,72 @@ :type (simd-pack single-float)) (!def-primitive-type simd-pack-double (double-sse-reg descriptor-reg) :type (simd-pack double-float)) - (!def-primitive-type simd-pack-int (int-sse-reg descriptor-reg) - :type (simd-pack integer)) + (!def-primitive-type simd-pack-ub8 (int-sse-reg descriptor-reg) + :type (simd-pack (unsigned-byte 8))) + (!def-primitive-type simd-pack-ub16 (int-sse-reg descriptor-reg) + :type (simd-pack (unsigned-byte 16))) + (!def-primitive-type simd-pack-ub32 (int-sse-reg descriptor-reg) + :type (simd-pack (unsigned-byte 32))) + (!def-primitive-type simd-pack-ub64 (int-sse-reg descriptor-reg) + :type (simd-pack (unsigned-byte 64))) + (!def-primitive-type simd-pack-sb8 (int-sse-reg descriptor-reg) + :type (simd-pack (signed-byte 8))) + (!def-primitive-type simd-pack-sb16 (int-sse-reg descriptor-reg) + :type (simd-pack (signed-byte 16))) + (!def-primitive-type simd-pack-sb32 (int-sse-reg descriptor-reg) + :type (simd-pack (signed-byte 32))) + (!def-primitive-type simd-pack-sb64 (int-sse-reg descriptor-reg) + :type (simd-pack (signed-byte 64))) + (!def-primitive-type simd-pack-any (single-sse-reg double-sse-reg int-sse-reg descriptor-reg) + :type simd-pack) (!def-primitive-type-alias simd-pack - '(:or simd-pack-single simd-pack-double simd-pack-int))) + '(:or simd-pack-single + simd-pack-double + simd-pack-ub8 + simd-pack-ub16 + simd-pack-ub32 + simd-pack-ub64 + simd-pack-sb8 + simd-pack-sb16 + simd-pack-sb32 + simd-pack-sb64 + simd-pack-any))) #+sb-simd-pack-256 (progn (!def-primitive-type simd-pack-256-single (single-avx2-reg descriptor-reg) :type (simd-pack-256 single-float)) (!def-primitive-type simd-pack-256-double (double-avx2-reg descriptor-reg) :type (simd-pack-256 double-float)) - (!def-primitive-type simd-pack-256-int (int-avx2-reg descriptor-reg) - :type (simd-pack-256 integer)) + (!def-primitive-type simd-pack-256-ub8 (int-avx2-reg descriptor-reg) + :type (simd-pack-256 (unsigned-byte 8))) + (!def-primitive-type simd-pack-256-ub16 (int-avx2-reg descriptor-reg) + :type (simd-pack-256 (unsigned-byte 16))) + (!def-primitive-type simd-pack-256-ub32 (int-avx2-reg descriptor-reg) + :type (simd-pack-256 (unsigned-byte 32))) + (!def-primitive-type simd-pack-256-ub64 (int-avx2-reg descriptor-reg) + :type (simd-pack-256 (unsigned-byte 64))) + (!def-primitive-type simd-pack-256-sb8 (int-avx2-reg descriptor-reg) + :type (simd-pack-256 (signed-byte 8))) + (!def-primitive-type simd-pack-256-sb16 (int-avx2-reg descriptor-reg) + :type (simd-pack-256 (signed-byte 16))) + (!def-primitive-type simd-pack-256-sb32 (int-avx2-reg descriptor-reg) + :type (simd-pack-256 (signed-byte 32))) + (!def-primitive-type simd-pack-256-sb64 (int-avx2-reg descriptor-reg) + :type (simd-pack-256 (signed-byte 64))) + (!def-primitive-type simd-pack-256-any (single-avx2-reg double-avx2-reg int-avx2-reg descriptor-reg) + :type simd-pack-256) (!def-primitive-type-alias simd-pack-256 - '(:or simd-pack-256-single simd-pack-256-double simd-pack-256-int))) + '(:or simd-pack-256-single + simd-pack-256-double + simd-pack-256-ub8 + simd-pack-256-ub16 + simd-pack-256-ub32 + simd-pack-256-ub64 + simd-pack-256-sb8 + simd-pack-256-sb16 + simd-pack-256-sb32 + simd-pack-256-sb64 + simd-pack-256-any))) ;;; primitive other-pointer array types (/show0 "primtype.lisp 96") @@ -393,31 +445,57 @@ (let* ((eltypes (simd-pack-type-element-type type)) (count (count 1 eltypes)) (position (position 1 eltypes))) - (if (= count 1) - (cond - ((eql position (position 'integer *simd-pack-element-types*)) - (exactly simd-pack-int)) - ((eql position (position 'single-float *simd-pack-element-types*)) + (cond ((/= count 1) + (part-of simd-pack-any)) + ((eql position (position '(unsigned-byte 8) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-ub8)) + ((eql position (position '(unsigned-byte 16) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-ub16)) + ((eql position (position '(unsigned-byte 32) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-ub32)) + ((eql position (position '(unsigned-byte 64) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-ub64)) + ((eql position (position '(signed-byte 8) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-sb8)) + ((eql position (position '(signed-byte 16) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-sb16)) + ((eql position (position '(signed-byte 32) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-sb32)) + ((eql position (position '(signed-byte 64) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-sb64)) + ((eql position (position 'single-float *simd-pack-element-types* :test #'equal)) (exactly simd-pack-single)) - ((eql position (position 'double-float *simd-pack-element-types*)) + ((eql position (position 'double-float *simd-pack-element-types* :test #'equal)) (exactly simd-pack-double)) - (t (any))) - (any)))) + (t (any))))) #+sb-simd-pack-256 (simd-pack-256-type (let* ((eltypes (simd-pack-256-type-element-type type)) (count (count 1 eltypes)) (position (position 1 eltypes))) - (if (= count 1) - (cond - ((eql position (position 'integer *simd-pack-element-types*)) - (exactly simd-pack-256-int)) - ((eql position (position 'single-float *simd-pack-element-types*)) + (cond ((/= count 1) + (part-of simd-pack-256-any)) + ((eql position (position '(unsigned-byte 8) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-256-ub8)) + ((eql position (position '(unsigned-byte 16) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-256-ub16)) + ((eql position (position '(unsigned-byte 32) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-256-ub32)) + ((eql position (position '(unsigned-byte 64) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-256-ub64)) + ((eql position (position '(signed-byte 8) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-256-sb8)) + ((eql position (position '(signed-byte 16) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-256-sb16)) + ((eql position (position '(signed-byte 32) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-256-sb32)) + ((eql position (position '(signed-byte 64) *simd-pack-element-types* :test #'equal)) + (exactly simd-pack-256-sb64)) + ((eql position (position 'single-float *simd-pack-element-types* :test #'equal)) (exactly simd-pack-256-single)) - ((eql position (position 'double-float *simd-pack-element-types*)) + ((eql position (position 'double-float *simd-pack-element-types* :test #'equal)) (exactly simd-pack-256-double)) - (t (any))) - (any)))) + (t (any))))) (cons-type (part-of list)) (built-in-classoid diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 66ff0f1e75..2a8c359165 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -341,14 +341,30 @@ (flushable movable foldable)) (defknown %make-simd-pack-ub32 ((unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32)) - (simd-pack integer) + (simd-pack (unsigned-byte 32)) (flushable movable #-sb-xc-host foldable)) (defknown %make-simd-pack-ub64 ((unsigned-byte 64) (unsigned-byte 64)) - (simd-pack integer) + (simd-pack (unsigned-byte 64)) (flushable movable #-sb-xc-host foldable)) (defknown (%simd-pack-low %simd-pack-high) (simd-pack) (unsigned-byte 64) (flushable movable foldable)) + (defknown %simd-pack-ub8s (simd-pack) + (values (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8)) + (flushable movable foldable)) + (defknown %simd-pack-ub16s (simd-pack) + (values (unsigned-byte 16) (unsigned-byte 16) + (unsigned-byte 16) (unsigned-byte 16) + (unsigned-byte 16) (unsigned-byte 16) + (unsigned-byte 16) (unsigned-byte 16)) + (flushable movable foldable)) (defknown %simd-pack-ub32s (simd-pack) (values (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32)) @@ -356,6 +372,29 @@ (defknown %simd-pack-ub64s (simd-pack) (values (unsigned-byte 64) (unsigned-byte 64)) (flushable movable foldable)) + (defknown %simd-pack-sb8s (simd-pack) + (values (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8)) + (flushable movable foldable)) + (defknown %simd-pack-sb16s (simd-pack) + (values (signed-byte 16) (signed-byte 16) + (signed-byte 16) (signed-byte 16) + (signed-byte 16) (signed-byte 16) + (signed-byte 16) (signed-byte 16)) + (flushable movable foldable)) + (defknown %simd-pack-sb32s (simd-pack) + (values (signed-byte 32) (signed-byte 32) + (signed-byte 32) (signed-byte 32)) + (flushable movable foldable)) + (defknown %simd-pack-sb64s (simd-pack) + (values (signed-byte 64) (signed-byte 64)) + (flushable movable foldable)) (defknown %simd-pack-singles (simd-pack) (values single-float single-float single-float single-float) (flushable movable foldable)) @@ -380,14 +419,30 @@ (flushable movable foldable)) (defknown %make-simd-pack-256-ub32 ((unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32)) - (simd-pack-256 integer) + (simd-pack-256 (unsigned-byte 32)) (flushable movable foldable)) (defknown %make-simd-pack-256-ub64 ((unsigned-byte 64) (unsigned-byte 64) (unsigned-byte 64) (unsigned-byte 64)) - (simd-pack-256 integer) + (simd-pack-256 (unsigned-byte 64)) (flushable movable foldable)) (defknown (%simd-pack-256-0 %simd-pack-256-1 %simd-pack-256-2 %simd-pack-256-3) (simd-pack-256) (unsigned-byte 64) (flushable movable foldable)) + (defknown %simd-pack-256-ub8s (simd-pack-256) + (values (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) + (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8) (unsigned-byte 8)) + (flushable movable foldable)) + (defknown %simd-pack-256-ub16s (simd-pack-256) + (values (unsigned-byte 16) (unsigned-byte 16) (unsigned-byte 16) (unsigned-byte 16) + (unsigned-byte 16) (unsigned-byte 16) (unsigned-byte 16) (unsigned-byte 16) + (unsigned-byte 16) (unsigned-byte 16) (unsigned-byte 16) (unsigned-byte 16) + (unsigned-byte 16) (unsigned-byte 16) (unsigned-byte 16) (unsigned-byte 16)) + (flushable movable foldable)) (defknown %simd-pack-256-ub32s (simd-pack-256) (values (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32) (unsigned-byte 32)) @@ -395,6 +450,29 @@ (defknown %simd-pack-256-ub64s (simd-pack-256) (values (unsigned-byte 64) (unsigned-byte 64) (unsigned-byte 64) (unsigned-byte 64)) (flushable movable foldable)) + (defknown %simd-pack-256-sb8s (simd-pack-256) + (values (signed-byte 8) (signed-byte 8) (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) (signed-byte 8) (signed-byte 8) + (signed-byte 8) (signed-byte 8) (signed-byte 8) (signed-byte 8)) + (flushable movable foldable)) + (defknown %simd-pack-256-sb16s (simd-pack-256) + (values (signed-byte 16) (signed-byte 16) (signed-byte 16) (signed-byte 16) + (signed-byte 16) (signed-byte 16) (signed-byte 16) (signed-byte 16) + (signed-byte 16) (signed-byte 16) (signed-byte 16) (signed-byte 16) + (signed-byte 16) (signed-byte 16) (signed-byte 16) (signed-byte 16)) + (flushable movable foldable)) + (defknown %simd-pack-256-sb32s (simd-pack-256) + (values (signed-byte 32) (signed-byte 32) (signed-byte 32) (signed-byte 32) + (signed-byte 32) (signed-byte 32) (signed-byte 32) (signed-byte 32)) + (flushable movable foldable)) + (defknown %simd-pack-256-sb64s (simd-pack-256) + (values (signed-byte 64) (signed-byte 64) (signed-byte 64) (signed-byte 64)) + (flushable movable foldable)) (defknown %simd-pack-256-singles (simd-pack-256) (values single-float single-float single-float single-float single-float single-float single-float single-float) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index 8acf50d815..3fc1ecff91 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -1188,7 +1188,7 @@ (let ((loc (or target (select-load-tn-location op sc)))) (when loc - (let ((res (make-tn 0 :load nil sc))) + (let ((res (make-tn 0 :load ptype sc))) (setf (tn-offset res) loc) (return res)))) (push sc allowed))))))))) diff --git a/src/compiler/x86-64/parms.lisp b/src/compiler/x86-64/parms.lisp index db7f388d19..e5f7faa779 100644 --- a/src/compiler/x86-64/parms.lisp +++ b/src/compiler/x86-64/parms.lisp @@ -183,7 +183,17 @@ #'equalp) #+sb-simd-pack -(defglobal *simd-pack-element-types* '(integer single-float double-float)) +(defglobal *simd-pack-element-types* + '(single-float + double-float + (unsigned-byte 8) + (unsigned-byte 16) + (unsigned-byte 32) + (unsigned-byte 64) + (signed-byte 8) + (signed-byte 16) + (signed-byte 32) + (signed-byte 64))) (defconstant undefined-fdefn-header ;; This constant is constructed as follows: Take the INT opcode diff --git a/src/compiler/x86-64/simd-pack-256.lisp b/src/compiler/x86-64/simd-pack-256.lisp index fab5997811..7230efe963 100644 --- a/src/compiler/x86-64/simd-pack-256.lisp +++ b/src/compiler/x86-64/simd-pack-256.lisp @@ -94,13 +94,21 @@ (:note "AVX2 to pointer coercion") (:generator 13 (alloc-other simd-pack-256-widetag simd-pack-256-size y node nil thread-tn) - ;; see *simd-pack-element-types* + (aver (tn-primitive-type x)) (storew (fixnumize - (sc-case x - (single-avx2-reg 1) - (double-avx2-reg 2) - (int-avx2-reg 0) - (t 0))) + ;; see *simd-pack-element-types* + (ecase (primitive-type-name (tn-primitive-type x)) + (simd-pack-256-single 0) + (simd-pack-256-double 1) + (simd-pack-256-ub8 2) + (simd-pack-256-ub16 3) + (simd-pack-256-ub32 4) + (simd-pack-256-ub64 5) + (simd-pack-256-any 5) + (simd-pack-256-sb8 6) + (simd-pack-256-sb16 7) + (simd-pack-256-sb32 8) + (simd-pack-256-sb64 9))) y simd-pack-256-tag-slot other-pointer-lowtag) (let ((ea (object-slot-ea y simd-pack-256-p0-slot other-pointer-lowtag))) @@ -227,7 +235,7 @@ (:arg-types unsigned-num unsigned-num unsigned-num unsigned-num) (:temporary (:sc int-avx2-reg) tmp) (:results (dst :scs (int-avx2-reg))) - (:result-types simd-pack-256-int) + (:result-types simd-pack-256-ub64) (:generator 5 (inst vmovq dst p0) (inst vpinsrq dst dst p1 1) @@ -235,44 +243,95 @@ (inst vpinsrq tmp tmp p3 1) (inst vinserti128 dst dst tmp 1))) -(defmacro simd-pack-256-dispatch (pack &body body) - (check-type pack symbol) - `(let ((,pack ,pack)) - (etypecase ,pack - ((simd-pack-256 double-float) ,@body) - ((simd-pack-256 single-float) ,@body) - ((simd-pack-256 integer) ,@body)))) - #-sb-xc-host -(progn - (declaim (inline %make-simd-pack-256-ub32)) - (defun %make-simd-pack-256-ub32 (p0 p1 p2 p3 p4 p5 p6 p7) - (declare (type (unsigned-byte 32) p0 p1 p2 p3 p4 p5 p6 p7)) - (%make-simd-pack-256-ub64 (logior p0 (ash p1 32)) - (logior p2 (ash p3 32)) - (logior p4 (ash p5 32)) - (logior p6 (ash p7 32)))) +(macrolet ((unpack-unsigned (pack bits) + (once-only ((pack pack)) + `(let ((a (%simd-pack-256-0 ,pack)) + (b (%simd-pack-256-1 ,pack)) + (c (%simd-pack-256-2 ,pack)) + (d (%simd-pack-256-3 ,pack))) + (values + ,@(loop for pos by bits below 64 collect + `(unpack-unsigned-1 ,bits ,pos a)) + ,@(loop for pos by bits below 64 collect + `(unpack-unsigned-1 ,bits ,pos b)) + ,@(loop for pos by bits below 64 collect + `(unpack-unsigned-1 ,bits ,pos c)) + ,@(loop for pos by bits below 64 collect + `(unpack-unsigned-1 ,bits ,pos d)))))) + (unpack-unsigned-1 (bits position ub64) + `(ldb (byte ,bits ,position) ,ub64))) + (declaim (inline %simd-pack-256-ub8s)) + (defun %simd-pack-256-ub8s (pack) + (declare (type simd-pack-256 pack)) + (unpack-unsigned pack 8)) - (declaim (inline %simd-pack-256-ub32s %simd-pack-256-ub64s)) + (declaim (inline %simd-pack-256-ub16s)) + (defun %simd-pack-256-ub16s (pack) + (declare (type simd-pack-256 pack)) + (unpack-unsigned pack 16)) + + (declaim (inline %simd-pack-256-ub32s)) (defun %simd-pack-256-ub32s (pack) (declare (type simd-pack-256 pack)) - (simd-pack-256-dispatch pack - (let ((p0 (%simd-pack-256-0 pack)) - (p1 (%simd-pack-256-1 pack)) - (p2 (%simd-pack-256-2 pack)) - (p3 (%simd-pack-256-3 pack))) - (values (ldb (byte 32 0) p0) (ash p0 -32) - (ldb (byte 32 0) p1) (ash p1 -32) - (ldb (byte 32 0) p2) (ash p2 -32) - (ldb (byte 32 0) p3) (ash p3 -32))))) + (unpack-unsigned pack 32)) + (declaim (inline %simd-pack-256-ub64s)) (defun %simd-pack-256-ub64s (pack) (declare (type simd-pack-256 pack)) - (simd-pack-256-dispatch pack - (values (%simd-pack-256-0 pack) - (%simd-pack-256-1 pack) - (%simd-pack-256-2 pack) - (%simd-pack-256-3 pack))))) + (unpack-unsigned pack 64))) + +#-sb-xc-host +(macrolet ((unpack-signed (pack bits) + (once-only ((pack pack)) + `(let ((a (%simd-pack-256-0 ,pack)) + (b (%simd-pack-256-1 ,pack)) + (c (%simd-pack-256-2 ,pack)) + (d (%simd-pack-256-3 ,pack))) + (values + ,@(loop for pos by bits below 64 collect + `(unpack-signed-1 ,bits ,pos a)) + ,@(loop for pos by bits below 64 collect + `(unpack-signed-1 ,bits ,pos b)) + ,@(loop for pos by bits below 64 collect + `(unpack-signed-1 ,bits ,pos c)) + ,@(loop for pos by bits below 64 collect + `(unpack-signed-1 ,bits ,pos d)))))) + (unpack-signed-1 (bits position ub64) + `(- (mod (+ (ldb (byte ,bits ,position) ,ub64) + ,(expt 2 (1- bits))) + ,(expt 2 bits)) + ,(expt 2 (1- bits))))) + (declaim (inline %simd-pack-256-sb8s)) + (defun %simd-pack-256-sb8s (pack) + (declare (type simd-pack-256 pack)) + (unpack-signed pack 8)) + + (declaim (inline %simd-pack-256-sb16s)) + (defun %simd-pack-256-sb16s (pack) + (declare (type simd-pack-256 pack)) + (unpack-signed pack 16)) + + (declaim (inline %simd-pack-256-sb32s)) + (defun %simd-pack-256-sb32s (pack) + (declare (type simd-pack-256 pack)) + (unpack-signed pack 32)) + + (declaim (inline %simd-pack-256-sb64s)) + (defun %simd-pack-256-sb64s (pack) + (declare (type simd-pack-256 pack)) + (unpack-signed pack 64))) + +#-sb-xc-host +(progn + (defun %make-simd-pack-256-ub32 (p0 p1 p2 p3 p4 p5 p6 p7) + (declare (type (unsigned-byte 32) p0 p1 p2 p3 p4 p5 p6 p7)) + (%make-simd-pack-256 + #.(position '(unsigned-byte 32) *simd-pack-element-types* :test #'equal) + (logior p0 (ash p1 32)) + (logior p2 (ash p3 32)) + (logior p4 (ash p5 32)) + (logior p6 (ash p7 32))))) (define-vop (%make-simd-pack-256-double) (:translate %make-simd-pack-256-double) @@ -344,15 +403,14 @@ (declaim (inline %simd-pack-256-singles)) (defun %simd-pack-256-singles (pack) (declare (type simd-pack-256 pack)) - (simd-pack-256-dispatch pack - (values (%simd-pack-256-single-item pack 0) - (%simd-pack-256-single-item pack 1) - (%simd-pack-256-single-item pack 2) - (%simd-pack-256-single-item pack 3) - (%simd-pack-256-single-item pack 4) - (%simd-pack-256-single-item pack 5) - (%simd-pack-256-single-item pack 6) - (%simd-pack-256-single-item pack 7))))) + (values (%simd-pack-256-single-item pack 0) + (%simd-pack-256-single-item pack 1) + (%simd-pack-256-single-item pack 2) + (%simd-pack-256-single-item pack 3) + (%simd-pack-256-single-item pack 4) + (%simd-pack-256-single-item pack 5) + (%simd-pack-256-single-item pack 6) + (%simd-pack-256-single-item pack 7)))) (defknown %simd-pack-256-double-item (simd-pack-256 (integer 0 3)) double-float (flushable)) @@ -383,11 +441,10 @@ (declaim (inline %simd-pack-256-doubles)) (defun %simd-pack-256-doubles (pack) (declare (type simd-pack-256 pack)) - (simd-pack-256-dispatch pack - (values (%simd-pack-256-double-item pack 0) - (%simd-pack-256-double-item pack 1) - (%simd-pack-256-double-item pack 2) - (%simd-pack-256-double-item pack 3)))) + (values (%simd-pack-256-double-item pack 0) + (%simd-pack-256-double-item pack 1) + (%simd-pack-256-double-item pack 2) + (%simd-pack-256-double-item pack 3))) (defun %simd-pack-256-inline-constant (pack) (list :avx2 (logior (%simd-pack-256-0 pack) diff --git a/src/compiler/x86-64/simd-pack.lisp b/src/compiler/x86-64/simd-pack.lisp index fbf886bd76..e70d486f8e 100644 --- a/src/compiler/x86-64/simd-pack.lisp +++ b/src/compiler/x86-64/simd-pack.lisp @@ -88,13 +88,21 @@ (:note "SSE to pointer coercion") (:generator 13 (alloc-other simd-pack-widetag simd-pack-size y node nil thread-tn) - ;; see *simd-pack-element-types* + (aver (tn-primitive-type x)) (storew (fixnumize - (sc-case x - (single-sse-reg 1) - (double-sse-reg 2) - (int-sse-reg 0) - (t 0))) + ;; see *simd-pack-element-types* + (ecase (primitive-type-name (tn-primitive-type x)) + (simd-pack-single 0) + (simd-pack-double 1) + (simd-pack-ub8 2) + (simd-pack-ub16 3) + (simd-pack-ub32 4) + (simd-pack-ub64 5) + (simd-pack-any 5) + (simd-pack-sb8 6) + (simd-pack-sb16 7) + (simd-pack-sb32 8) + (simd-pack-sb64 9))) y simd-pack-tag-slot other-pointer-lowtag) (let ((ea (object-slot-ea y simd-pack-lo-value-slot other-pointer-lowtag))) (if (float-sse-p x) @@ -203,44 +211,88 @@ (:arg-types unsigned-num unsigned-num) (:temporary (:sc int-sse-reg) tmp) (:results (dst :scs (int-sse-reg))) - (:result-types simd-pack-int) + (:result-types simd-pack-ub64) (:generator 5 (inst movq dst lo) (inst movq tmp hi) (inst punpcklqdq dst tmp))) -(defmacro simd-pack-dispatch (pack &body body) - (check-type pack symbol) - `(let ((,pack ,pack)) - (etypecase ,pack - ((simd-pack double-float) ,@body) - ((simd-pack single-float) ,@body) - ((simd-pack integer) ,@body)))) - #-sb-xc-host -(progn - (declaim (inline %make-simd-pack-ub32)) - (defun %make-simd-pack-ub32 (w x y z) - (declare (type (unsigned-byte 32) w x y z)) - (%make-simd-pack-ub64 (logior w (ash x 32)) - (logior y (ash z 32)))) +(macrolet ((unpack-unsigned (pack bits) + (once-only ((pack pack)) + `(let ((lo (%simd-pack-low ,pack)) + (hi (%simd-pack-high ,pack))) + (values + ,@(loop for pos by bits below 64 collect + `(unpack-unsigned-1 ,bits ,pos lo)) + ,@(loop for pos by bits below 64 collect + `(unpack-unsigned-1 ,bits ,pos hi)))))) + (unpack-unsigned-1 (bits position ub64) + `(ldb (byte ,bits ,position) ,ub64))) + (declaim (inline %simd-pack-ub8s)) + (defun %simd-pack-ub8s (pack) + (declare (type simd-pack pack)) + (unpack-unsigned pack 8)) - (declaim (inline %simd-pack-ub32s %simd-pack-ub64s)) + (declaim (inline %simd-pack-ub16s)) + (defun %simd-pack-ub16s (pack) + (declare (type simd-pack pack)) + (unpack-unsigned pack 16)) + + (declaim (inline %simd-pack-ub32s)) (defun %simd-pack-ub32s (pack) (declare (type simd-pack pack)) - (simd-pack-dispatch pack - (let ((lo (%simd-pack-low pack)) - (hi (%simd-pack-high pack))) - (values (ldb (byte 32 0) lo) - (ash lo -32) - (ldb (byte 32 0) hi) - (ash hi -32))))) + (unpack-unsigned pack 32)) + (declaim (inline %simd-pack-ub64s)) (defun %simd-pack-ub64s (pack) (declare (type simd-pack pack)) - (simd-pack-dispatch pack - (values (%simd-pack-low pack) - (%simd-pack-high pack))))) + (unpack-unsigned pack 64))) + +#-sb-xc-host +(macrolet ((unpack-signed (pack bits) + (once-only ((pack pack)) + `(let ((lo (%simd-pack-low ,pack)) + (hi (%simd-pack-high ,pack))) + (values + ,@(loop for pos by bits below 64 collect + `(unpack-signed-1 ,bits ,pos lo)) + ,@(loop for pos by bits below 64 collect + `(unpack-signed-1 ,bits ,pos hi)))))) + (unpack-signed-1 (bits position ub64) + `(- (mod (+ (ldb (byte ,bits ,position) ,ub64) + ,(expt 2 (1- bits))) + ,(expt 2 bits)) + ,(expt 2 (1- bits))))) + (declaim (inline %simd-pack-sb8s)) + (defun %simd-pack-sb8s (pack) + (declare (type simd-pack pack)) + (unpack-signed pack 8)) + + (declaim (inline %simd-pack-sb16s)) + (defun %simd-pack-sb16s (pack) + (declare (type simd-pack pack)) + (unpack-signed pack 16)) + + (declaim (inline %simd-pack-sb32s)) + (defun %simd-pack-sb32s (pack) + (declare (type simd-pack pack)) + (unpack-signed pack 32)) + + (declaim (inline %simd-pack-sb64s)) + (defun %simd-pack-sb64s (pack) + (declare (type simd-pack pack)) + (unpack-signed pack 64))) + +#-sb-xc-host +(progn + (declaim (inline %make-simd-pack-ub32)) + (defun %make-simd-pack-ub32 (w x y z) + (declare (type (unsigned-byte 32) w x y z)) + (%make-simd-pack + #.(position '(unsigned-byte 32) *simd-pack-element-types* :test #'equal) + (logior w (ash x 32)) + (logior y (ash z 32))))) (define-vop (%make-simd-pack-double) (:translate %make-simd-pack-double) @@ -304,11 +356,10 @@ (declaim (inline %simd-pack-singles)) (defun %simd-pack-singles (pack) (declare (type simd-pack pack)) - (simd-pack-dispatch pack - (values (%simd-pack-single-item pack 0) - (%simd-pack-single-item pack 1) - (%simd-pack-single-item pack 2) - (%simd-pack-single-item pack 3))))) + (values (%simd-pack-single-item pack 0) + (%simd-pack-single-item pack 1) + (%simd-pack-single-item pack 2) + (%simd-pack-single-item pack 3)))) (defknown %simd-pack-double-item (simd-pack (integer 0 1)) double-float (flushable)) @@ -340,6 +391,5 @@ (declaim (inline %simd-pack-doubles)) (defun %simd-pack-doubles (pack) (declare (type simd-pack pack)) - (simd-pack-dispatch pack - (values (%simd-pack-double-item pack 0) - (%simd-pack-double-item pack 1))))) + (values (%simd-pack-double-item pack 0) + (%simd-pack-double-item pack 1)))) diff --git a/tests/simd-pack-256.pure.lisp b/tests/simd-pack-256.pure.lisp index ed575f7951..ef3794e24f 100644 --- a/tests/simd-pack-256.pure.lisp +++ b/tests/simd-pack-256.pure.lisp @@ -90,21 +90,7 @@ (print-not-readable (assert-error (do-it) print-not-readable)) (t - (typecase pack - ((simd-pack-256 single-float) - (if (and *print-readably* - (some #'float-nan-p (multiple-value-list - (%simd-pack-256-singles pack)))) - (assert-error (do-it) print-not-readable) - (do-it))) - ((simd-pack-256 double-float) - (if (and *print-readably* - (some #'float-nan-p (multiple-value-list - (%simd-pack-256-doubles pack)))) - (assert-error (do-it) print-not-readable) - (do-it))) - (t - (do-it))))))))) + (do-it))))))) ;; Default (print-them t) ;; Readably @@ -131,7 +117,7 @@ (setq tmp-fasl (compile-file *tmp-filename*)) (let ((*pack* nil)) (load tmp-fasl) - (assert (typep *pack* '(sb-ext:simd-pack-256 integer))) + (assert (typep *pack* '(sb-ext:simd-pack-256 (unsigned-byte 64)))) (assert (= 2 (sb-kernel:%simd-pack-256-0 *pack*))) (assert (= 4 (sb-kernel:%simd-pack-256-1 *pack*))) (assert (= 8 (sb-kernel:%simd-pack-256-2 *pack*))) @@ -189,36 +175,57 @@ (((sb-ext:%make-simd-pack-256-ub64 1 2 3 4) 0) '(1 2 3 4 0) :test #'equal))) (with-test (:name (simd-pack-256 subtypep :smoke)) - (assert-tri-eq t t (subtypep '(simd-pack-256 integer) 'simd-pack-256)) + (assert-tri-eq t t (subtypep '(simd-pack-256 (unsigned-byte 8)) 'simd-pack-256)) + (assert-tri-eq t t (subtypep '(simd-pack-256 (unsigned-byte 16)) 'simd-pack-256)) + (assert-tri-eq t t (subtypep '(simd-pack-256 (unsigned-byte 32)) 'simd-pack-256)) + (assert-tri-eq t t (subtypep '(simd-pack-256 (unsigned-byte 64)) 'simd-pack-256)) + (assert-tri-eq t t (subtypep '(simd-pack-256 (signed-byte 8)) 'simd-pack-256)) + (assert-tri-eq t t (subtypep '(simd-pack-256 (signed-byte 16)) 'simd-pack-256)) + (assert-tri-eq t t (subtypep '(simd-pack-256 (signed-byte 32)) 'simd-pack-256)) + (assert-tri-eq t t (subtypep '(simd-pack-256 (signed-byte 64)) 'simd-pack-256)) (assert-tri-eq t t (subtypep '(simd-pack-256 single-float) 'simd-pack-256)) (assert-tri-eq t t (subtypep '(simd-pack-256 double-float) 'simd-pack-256)) - (assert-tri-eq nil t (subtypep 'simd-pack-256 '(simd-pack-256 integer))) + (assert-tri-eq nil t (subtypep 'simd-pack-256 '(simd-pack-256 (unsigned-byte 64)))) (assert-tri-eq nil t (subtypep 'simd-pack-256 '(simd-pack-256 single-float))) (assert-tri-eq nil t (subtypep 'simd-pack-256 '(simd-pack-256 double-float))) - (assert-tri-eq t t (subtypep '(simd-pack-256 integer) - '(or (simd-pack-256 integer) (simd-pack-256 single-float)))) - (assert-tri-eq t t (subtypep '(simd-pack-256 integer) - '(or (simd-pack-256 integer) (simd-pack-256 double-float)))) - (assert-tri-eq nil t (subtypep '(simd-pack-256 integer) + (assert-tri-eq t t (subtypep '(simd-pack-256 (unsigned-byte 64)) + '(or (simd-pack-256 (unsigned-byte 64)) (simd-pack-256 single-float)))) + (assert-tri-eq t t (subtypep '(simd-pack-256 (unsigned-byte 64)) + '(or (simd-pack-256 (unsigned-byte 64)) (simd-pack-256 double-float)))) + (assert-tri-eq nil t (subtypep '(simd-pack-256 (unsigned-byte 64)) '(or (simd-pack-256 single-float) (simd-pack-256 double-float)))) - (assert-tri-eq nil t (subtypep '(or (simd-pack-256 integer) (simd-pack-256 single-float)) - '(simd-pack-256 integer))) - (assert-tri-eq nil t (subtypep '(or (simd-pack-256 integer) (simd-pack-256 double-float)) - '(simd-pack-256 integer))) + (assert-tri-eq nil t (subtypep '(or (simd-pack-256 (unsigned-byte 64)) (simd-pack-256 single-float)) + '(simd-pack-256 (unsigned-byte 64)))) + (assert-tri-eq nil t (subtypep '(or (simd-pack-256 (unsigned-byte 64)) (simd-pack-256 double-float)) + '(simd-pack-256 (unsigned-byte 64)))) (assert-tri-eq nil t (subtypep '(or (simd-pack-256 single-float) (simd-pack-256 double-float)) - '(simd-pack-256 integer)))) + '(simd-pack-256 (unsigned-byte 64))))) (with-test (:name (simd-pack-256 :ctype-unparse :smoke)) (flet ((unparsed (s) (sb-kernel:type-specifier (sb-kernel:specifier-type s)))) (assert (equal (unparsed 'simd-pack-256) 'simd-pack-256)) - (assert (equal (unparsed '(simd-pack-256 integer)) '(simd-pack-256 integer))) + (assert (equal (unparsed '(simd-pack-256 (unsigned-byte 8))) '(simd-pack-256 (unsigned-byte 8)))) + (assert (equal (unparsed '(simd-pack-256 (unsigned-byte 16))) '(simd-pack-256 (unsigned-byte 16)))) + (assert (equal (unparsed '(simd-pack-256 (unsigned-byte 32))) '(simd-pack-256 (unsigned-byte 32)))) + (assert (equal (unparsed '(simd-pack-256 (unsigned-byte 64))) '(simd-pack-256 (unsigned-byte 64)))) + (assert (equal (unparsed '(simd-pack-256 (signed-byte 8))) '(simd-pack-256 (signed-byte 8)))) + (assert (equal (unparsed '(simd-pack-256 (signed-byte 16))) '(simd-pack-256 (signed-byte 16)))) + (assert (equal (unparsed '(simd-pack-256 (signed-byte 32))) '(simd-pack-256 (signed-byte 32)))) + (assert (equal (unparsed '(simd-pack-256 (signed-byte 64))) '(simd-pack-256 (signed-byte 64)))) (assert (equal (unparsed '(simd-pack-256 single-float)) '(simd-pack-256 single-float))) (assert (equal (unparsed '(simd-pack-256 double-float)) '(simd-pack-256 double-float))) - (assert (equal (unparsed '(or (simd-pack-256 integer) (simd-pack-256 double-float))) + (assert (equal (unparsed '(or (simd-pack-256 (unsigned-byte 64)) (simd-pack-256 double-float))) ;; depends on *SIMD-PACK-ELEMENT-TYPES* order - '(or (simd-pack-256 integer) (simd-pack-256 double-float)))) + '(or (simd-pack-256 double-float) (simd-pack-256 (unsigned-byte 64))))) (assert (equal (unparsed '(or - (simd-pack-256 integer) + (simd-pack-256 (unsigned-byte 8)) + (simd-pack-256 (unsigned-byte 16)) + (simd-pack-256 (unsigned-byte 32)) + (simd-pack-256 (unsigned-byte 64)) + (simd-pack-256 (signed-byte 8)) + (simd-pack-256 (signed-byte 16)) + (simd-pack-256 (signed-byte 32)) + (simd-pack-256 (signed-byte 64)) (simd-pack-256 single-float) (simd-pack-256 double-float))) 'simd-pack-256)))) diff --git a/tests/simd-pack.pure.lisp b/tests/simd-pack.pure.lisp index c8a7ea0c23..f2537899ae 100644 --- a/tests/simd-pack.pure.lisp +++ b/tests/simd-pack.pure.lisp @@ -70,21 +70,7 @@ (print-not-readable (assert-error (do-it) print-not-readable)) (t - (typecase pack - ((simd-pack single-float) - (if (and *print-readably* - (some #'float-nan-p (multiple-value-list - (%simd-pack-singles pack)))) - (assert-error (do-it) print-not-readable) - (do-it))) - ((simd-pack double-float) - (if (and *print-readably* - (some #'float-nan-p (multiple-value-list - (%simd-pack-doubles pack)))) - (assert-error (do-it) print-not-readable) - (do-it))) - (t - (do-it))))))))) + (do-it))))))) ;; Default (print-them t) ;; Readably @@ -111,7 +97,7 @@ (setq tmp-fasl (compile-file *tmp-filename*)) (let ((*pack* nil)) (load tmp-fasl) - (assert (typep *pack* '(sb-kernel:simd-pack integer))) + (assert (typep *pack* '(sb-kernel:simd-pack (unsigned-byte 64)))) (assert (= 2 (sb-kernel:%simd-pack-low *pack*))) (assert (= 4 (sb-kernel:%simd-pack-high *pack*))))) (when tmp-fasl (delete-file tmp-fasl)) @@ -154,36 +140,57 @@ (delete-file *tmp-filename*)))) (with-test (:name (simd-pack subtypep :smoke)) - (assert-tri-eq t t (subtypep '(simd-pack integer) 'simd-pack)) + (assert-tri-eq t t (subtypep '(simd-pack (unsigned-byte 8)) 'simd-pack)) + (assert-tri-eq t t (subtypep '(simd-pack (unsigned-byte 16)) 'simd-pack)) + (assert-tri-eq t t (subtypep '(simd-pack (unsigned-byte 32)) 'simd-pack)) + (assert-tri-eq t t (subtypep '(simd-pack (unsigned-byte 64)) 'simd-pack)) + (assert-tri-eq t t (subtypep '(simd-pack (signed-byte 8)) 'simd-pack)) + (assert-tri-eq t t (subtypep '(simd-pack (signed-byte 16)) 'simd-pack)) + (assert-tri-eq t t (subtypep '(simd-pack (signed-byte 32)) 'simd-pack)) + (assert-tri-eq t t (subtypep '(simd-pack (signed-byte 64)) 'simd-pack)) (assert-tri-eq t t (subtypep '(simd-pack single-float) 'simd-pack)) (assert-tri-eq t t (subtypep '(simd-pack double-float) 'simd-pack)) - (assert-tri-eq nil t (subtypep 'simd-pack '(simd-pack integer))) + (assert-tri-eq nil t (subtypep 'simd-pack '(simd-pack (unsigned-byte 64)))) (assert-tri-eq nil t (subtypep 'simd-pack '(simd-pack single-float))) (assert-tri-eq nil t (subtypep 'simd-pack '(simd-pack double-float))) - (assert-tri-eq t t (subtypep '(simd-pack integer) - '(or (simd-pack integer) (simd-pack single-float)))) - (assert-tri-eq t t (subtypep '(simd-pack integer) - '(or (simd-pack integer) (simd-pack double-float)))) - (assert-tri-eq nil t (subtypep '(simd-pack integer) + (assert-tri-eq t t (subtypep '(simd-pack (unsigned-byte 64)) + '(or (simd-pack (unsigned-byte 64)) (simd-pack single-float)))) + (assert-tri-eq t t (subtypep '(simd-pack (unsigned-byte 64)) + '(or (simd-pack (unsigned-byte 64)) (simd-pack double-float)))) + (assert-tri-eq nil t (subtypep '(simd-pack (unsigned-byte 64)) '(or (simd-pack single-float) (simd-pack double-float)))) - (assert-tri-eq nil t (subtypep '(or (simd-pack integer) (simd-pack single-float)) - '(simd-pack integer))) - (assert-tri-eq nil t (subtypep '(or (simd-pack integer) (simd-pack double-float)) - '(simd-pack integer))) + (assert-tri-eq nil t (subtypep '(or (simd-pack (unsigned-byte 64)) (simd-pack single-float)) + '(simd-pack (unsigned-byte 64)))) + (assert-tri-eq nil t (subtypep '(or (simd-pack (unsigned-byte 64)) (simd-pack double-float)) + '(simd-pack (unsigned-byte 64)))) (assert-tri-eq nil t (subtypep '(or (simd-pack single-float) (simd-pack double-float)) - '(simd-pack integer)))) + '(simd-pack (unsigned-byte 64))))) (with-test (:name (simd-pack :ctype-unparse :smoke)) (flet ((unparsed (s) (sb-kernel:type-specifier (sb-kernel:specifier-type s)))) (assert (equal (unparsed 'simd-pack) 'simd-pack)) - (assert (equal (unparsed '(simd-pack integer)) '(simd-pack integer))) + (assert (equal (unparsed '(simd-pack (unsigned-byte 8))) '(simd-pack (unsigned-byte 8)))) + (assert (equal (unparsed '(simd-pack (unsigned-byte 16))) '(simd-pack (unsigned-byte 16)))) + (assert (equal (unparsed '(simd-pack (unsigned-byte 32))) '(simd-pack (unsigned-byte 32)))) + (assert (equal (unparsed '(simd-pack (unsigned-byte 64))) '(simd-pack (unsigned-byte 64)))) + (assert (equal (unparsed '(simd-pack (signed-byte 8))) '(simd-pack (signed-byte 8)))) + (assert (equal (unparsed '(simd-pack (signed-byte 16))) '(simd-pack (signed-byte 16)))) + (assert (equal (unparsed '(simd-pack (signed-byte 32))) '(simd-pack (signed-byte 32)))) + (assert (equal (unparsed '(simd-pack (signed-byte 64))) '(simd-pack (signed-byte 64)))) (assert (equal (unparsed '(simd-pack single-float)) '(simd-pack single-float))) (assert (equal (unparsed '(simd-pack double-float)) '(simd-pack double-float))) - (assert (equal (unparsed '(or (simd-pack integer) (simd-pack double-float))) + (assert (equal (unparsed '(or (simd-pack (unsigned-byte 64)) (simd-pack double-float))) ;; depends on *SIMD-PACK-ELEMENT-TYPES* order - '(or (simd-pack integer) (simd-pack double-float)))) + '(or (simd-pack double-float) (simd-pack (unsigned-byte 64))))) (assert (equal (unparsed '(or - (simd-pack integer) + (simd-pack (unsigned-byte 8)) + (simd-pack (unsigned-byte 16)) + (simd-pack (unsigned-byte 32)) + (simd-pack (unsigned-byte 64)) + (simd-pack (signed-byte 8)) + (simd-pack (signed-byte 16)) + (simd-pack (signed-byte 32)) + (simd-pack (signed-byte 64)) (simd-pack single-float) (simd-pack double-float))) 'simd-pack)))) From 968b251365ec6e2b0cee3e97df1145074e3a0980 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Fri, 8 Apr 2022 19:53:40 -0700 Subject: [PATCH 3080/4023] Do not propagate PTYPE into Load-TNs. As the block comment above pack-load-tn notes, doing so pessimizes register allocation. --- src/compiler/pack.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index 3fc1ecff91..8acf50d815 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -1188,7 +1188,7 @@ (let ((loc (or target (select-load-tn-location op sc)))) (when loc - (let ((res (make-tn 0 :load ptype sc))) + (let ((res (make-tn 0 :load nil sc))) (setf (tn-offset res) loc) (return res)))) (push sc allowed))))))))) From 17d03b73d91228e293e4e75876087970f845bce7 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 9 Apr 2022 13:30:26 -0700 Subject: [PATCH 3081/4023] simd: Properly fix TN-PRIMITIVE-TYPE sometimes being NIL. Just grovel it from the VOP; the primitive type information is still there, just not necessarily on the load TN. This is a better alternative to propagating the ptype to load TN's, as that can pessimize the register allocator by restricting the possible packing locations. --- src/compiler/x86-64/simd-pack-256.lisp | 5 +++-- src/compiler/x86-64/simd-pack.lisp | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/compiler/x86-64/simd-pack-256.lisp b/src/compiler/x86-64/simd-pack-256.lisp index 7230efe963..80f89ae9a1 100644 --- a/src/compiler/x86-64/simd-pack-256.lisp +++ b/src/compiler/x86-64/simd-pack-256.lisp @@ -91,13 +91,14 @@ (:results (y :scs (descriptor-reg))) #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) (:node-var node) + (:vop-var vop) (:note "AVX2 to pointer coercion") (:generator 13 (alloc-other simd-pack-256-widetag simd-pack-256-size y node nil thread-tn) - (aver (tn-primitive-type x)) (storew (fixnumize ;; see *simd-pack-element-types* - (ecase (primitive-type-name (tn-primitive-type x)) + (ecase (primitive-type-name (tn-primitive-type + (tn-ref-tn (vop-args vop)))) (simd-pack-256-single 0) (simd-pack-256-double 1) (simd-pack-256-ub8 2) diff --git a/src/compiler/x86-64/simd-pack.lisp b/src/compiler/x86-64/simd-pack.lisp index e70d486f8e..db48537ce9 100644 --- a/src/compiler/x86-64/simd-pack.lisp +++ b/src/compiler/x86-64/simd-pack.lisp @@ -85,13 +85,14 @@ (:results (y :scs (descriptor-reg))) #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) (:node-var node) + (:vop-var vop) (:note "SSE to pointer coercion") (:generator 13 (alloc-other simd-pack-widetag simd-pack-size y node nil thread-tn) - (aver (tn-primitive-type x)) (storew (fixnumize ;; see *simd-pack-element-types* - (ecase (primitive-type-name (tn-primitive-type x)) + (ecase (primitive-type-name (tn-primitive-type + (tn-ref-tn (vop-args vop)))) (simd-pack-single 0) (simd-pack-double 1) (simd-pack-ub8 2) From 9b2477d6420bf77dc96f9cea662c2d7ae13cb7e3 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 9 Apr 2022 14:00:17 -0700 Subject: [PATCH 3082/4023] Use :args-var instead of :vop-var. --- src/compiler/x86-64/simd-pack-256.lisp | 4 ++-- src/compiler/x86-64/simd-pack.lisp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/x86-64/simd-pack-256.lisp b/src/compiler/x86-64/simd-pack-256.lisp index 80f89ae9a1..052f3d26d4 100644 --- a/src/compiler/x86-64/simd-pack-256.lisp +++ b/src/compiler/x86-64/simd-pack-256.lisp @@ -91,14 +91,14 @@ (:results (y :scs (descriptor-reg))) #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) (:node-var node) - (:vop-var vop) + (:args-var args) (:note "AVX2 to pointer coercion") (:generator 13 (alloc-other simd-pack-256-widetag simd-pack-256-size y node nil thread-tn) (storew (fixnumize ;; see *simd-pack-element-types* (ecase (primitive-type-name (tn-primitive-type - (tn-ref-tn (vop-args vop)))) + (tn-ref-tn args))) (simd-pack-256-single 0) (simd-pack-256-double 1) (simd-pack-256-ub8 2) diff --git a/src/compiler/x86-64/simd-pack.lisp b/src/compiler/x86-64/simd-pack.lisp index db48537ce9..d5800f0316 100644 --- a/src/compiler/x86-64/simd-pack.lisp +++ b/src/compiler/x86-64/simd-pack.lisp @@ -85,14 +85,14 @@ (:results (y :scs (descriptor-reg))) #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) (:node-var node) - (:vop-var vop) + (:args-var args) (:note "SSE to pointer coercion") (:generator 13 (alloc-other simd-pack-widetag simd-pack-size y node nil thread-tn) (storew (fixnumize ;; see *simd-pack-element-types* (ecase (primitive-type-name (tn-primitive-type - (tn-ref-tn (vop-args vop)))) + (tn-ref-tn args))) (simd-pack-single 0) (simd-pack-double 1) (simd-pack-ub8 2) From 2059dec8b84ccbb84401389c63b23cb662acdbc4 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 9 Apr 2022 15:10:48 -0700 Subject: [PATCH 3083/4023] x86-64: Go back to using SIMD-PACK-DISPATCH. The "any" types introduced too much type erasure when boxing and unboxing, notably when spilling SIMD packs, resulting in SIMD values "losing" their types, as unboxed values on the stack do not keep track of their type. Also remove the PTYPE hack once and for all by splitting up the boxing VOPs to specializie on the arg type. This should keep representation selection fast since we only need to dispatch based on the ptype for the integer AVX2 and SSE SCs. --- src/code/stubs.lisp | 8 +- src/cold/exports.lisp | 2 +- src/compiler/generic/primtype.lisp | 24 +++--- src/compiler/x86-64/simd-pack-256.lisp | 106 ++++++++++++++----------- src/compiler/x86-64/simd-pack.lisp | 92 +++++++++++---------- 5 files changed, 124 insertions(+), 108 deletions(-) diff --git a/src/code/stubs.lisp b/src/code/stubs.lisp index 11275c8e1e..900636c82e 100644 --- a/src/code/stubs.lisp +++ b/src/code/stubs.lisp @@ -175,16 +175,16 @@ #+sb-simd-pack (macrolet ((def (name) `(defun ,name (pack) - (declare (simd-pack pack)) - (,name pack)))) + (sb-vm::simd-pack-dispatch pack + (,name pack))))) (def %simd-pack-low) (def %simd-pack-high)) #+sb-simd-pack-256 (macrolet ((def (name) `(defun ,name (pack) - (declare (simd-pack-256 pack)) - (,name pack)))) + (sb-vm::simd-pack-256-dispatch pack + (,name pack))))) (def %simd-pack-256-0) (def %simd-pack-256-1) (def %simd-pack-256-2) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 421c083933..22c51a7dad 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1399,7 +1399,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "TN-REF-NEXT" "TN-REF-NEXT-REF" "TN-REF-P" "TN-REF-TARGET" "TN-REF-TN" "TN-REF-TYPE" "TN-REF-VOP" "TN-REF-WRITE-P" "TN-SC" "TN-REF-MEMORY-ACCESS" - "TN-KIND" "TN-PRIMITIVE-TYPE" "TN-VALUE" + "TN-KIND" "TN-VALUE" "TYPE-CHECK-ERROR" "UNBIND" "UNBIND-N" "UNBIND-TO-HERE" "UNSAFE" "UNSAFELY-FLUSHABLE" "UNWIND" "UWP-ENTRY" "UNPACK-CODE-FIXUP-LOCS" diff --git a/src/compiler/generic/primtype.lisp b/src/compiler/generic/primtype.lisp index 913672cf24..a091174b7b 100644 --- a/src/compiler/generic/primtype.lisp +++ b/src/compiler/generic/primtype.lisp @@ -116,8 +116,6 @@ :type (simd-pack (signed-byte 32))) (!def-primitive-type simd-pack-sb64 (int-sse-reg descriptor-reg) :type (simd-pack (signed-byte 64))) - (!def-primitive-type simd-pack-any (single-sse-reg double-sse-reg int-sse-reg descriptor-reg) - :type simd-pack) (!def-primitive-type-alias simd-pack '(:or simd-pack-single simd-pack-double @@ -128,8 +126,7 @@ simd-pack-sb8 simd-pack-sb16 simd-pack-sb32 - simd-pack-sb64 - simd-pack-any))) + simd-pack-sb64))) #+sb-simd-pack-256 (progn (!def-primitive-type simd-pack-256-single (single-avx2-reg descriptor-reg) @@ -152,8 +149,6 @@ :type (simd-pack-256 (signed-byte 32))) (!def-primitive-type simd-pack-256-sb64 (int-avx2-reg descriptor-reg) :type (simd-pack-256 (signed-byte 64))) - (!def-primitive-type simd-pack-256-any (single-avx2-reg double-avx2-reg int-avx2-reg descriptor-reg) - :type simd-pack-256) (!def-primitive-type-alias simd-pack-256 '(:or simd-pack-256-single simd-pack-256-double @@ -164,8 +159,7 @@ simd-pack-256-sb8 simd-pack-256-sb16 simd-pack-256-sb32 - simd-pack-256-sb64 - simd-pack-256-any))) + simd-pack-256-sb64))) ;;; primitive other-pointer array types (/show0 "primtype.lisp 96") @@ -445,8 +439,8 @@ (let* ((eltypes (simd-pack-type-element-type type)) (count (count 1 eltypes)) (position (position 1 eltypes))) - (cond ((/= count 1) - (part-of simd-pack-any)) + (if (= count 1) + (cond ((eql position (position '(unsigned-byte 8) *simd-pack-element-types* :test #'equal)) (exactly simd-pack-ub8)) ((eql position (position '(unsigned-byte 16) *simd-pack-element-types* :test #'equal)) @@ -467,14 +461,15 @@ (exactly simd-pack-single)) ((eql position (position 'double-float *simd-pack-element-types* :test #'equal)) (exactly simd-pack-double)) - (t (any))))) + (t (any))) + (any)))) #+sb-simd-pack-256 (simd-pack-256-type (let* ((eltypes (simd-pack-256-type-element-type type)) (count (count 1 eltypes)) (position (position 1 eltypes))) - (cond ((/= count 1) - (part-of simd-pack-256-any)) + (if (= count 1) + (cond ((eql position (position '(unsigned-byte 8) *simd-pack-element-types* :test #'equal)) (exactly simd-pack-256-ub8)) ((eql position (position '(unsigned-byte 16) *simd-pack-element-types* :test #'equal)) @@ -495,7 +490,8 @@ (exactly simd-pack-256-single)) ((eql position (position 'double-float *simd-pack-element-types* :test #'equal)) (exactly simd-pack-256-double)) - (t (any))))) + (t (any))) + (any)))) (cons-type (part-of list)) (built-in-classoid diff --git a/src/compiler/x86-64/simd-pack-256.lisp b/src/compiler/x86-64/simd-pack-256.lisp index 052f3d26d4..4d6f600f8e 100644 --- a/src/compiler/x86-64/simd-pack-256.lisp +++ b/src/compiler/x86-64/simd-pack-256.lisp @@ -86,38 +86,38 @@ (int-avx2-reg single-avx2-reg double-avx2-reg) (int-avx2-reg single-avx2-reg double-avx2-reg)) -(define-vop (move-from-avx2) - (:args (x :scs (single-avx2-reg double-avx2-reg int-avx2-reg))) - (:results (y :scs (descriptor-reg))) - #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) - (:node-var node) - (:args-var args) - (:note "AVX2 to pointer coercion") - (:generator 13 - (alloc-other simd-pack-256-widetag simd-pack-256-size y node nil thread-tn) - (storew (fixnumize - ;; see *simd-pack-element-types* - (ecase (primitive-type-name (tn-primitive-type - (tn-ref-tn args))) - (simd-pack-256-single 0) - (simd-pack-256-double 1) - (simd-pack-256-ub8 2) - (simd-pack-256-ub16 3) - (simd-pack-256-ub32 4) - (simd-pack-256-ub64 5) - (simd-pack-256-any 5) - (simd-pack-256-sb8 6) - (simd-pack-256-sb16 7) - (simd-pack-256-sb32 8) - (simd-pack-256-sb64 9))) - y simd-pack-256-tag-slot other-pointer-lowtag) - (let ((ea (object-slot-ea - y simd-pack-256-p0-slot other-pointer-lowtag))) - (if (float-avx2-p x) - (inst vmovups ea x) - (inst vmovdqu ea x))))) -(define-move-vop move-from-avx2 :move - (int-avx2-reg single-avx2-reg double-avx2-reg) (descriptor-reg)) +(macrolet ((define-move-from-avx2 (type tag &rest scs) + (let ((name (symbolicate "MOVE-FROM-AVX2/" type))) + `(progn + (define-vop (,name) + (:args (x :scs ,scs)) + (:results (y :scs (descriptor-reg))) + #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) + (:node-var node) + (:arg-types ,type) + (:note "AVX2 to pointer coercion") + (:generator 13 + (alloc-other simd-pack-256-widetag simd-pack-256-size y node nil thread-tn) + (storew (fixnumize ,tag) + y simd-pack-256-tag-slot other-pointer-lowtag) + (let ((ea (object-slot-ea + y simd-pack-256-p0-slot other-pointer-lowtag))) + (if (float-avx2-p x) + (inst vmovups ea x) + (inst vmovdqu ea x))))) + (define-move-vop ,name :move + ,scs (descriptor-reg)))))) + ;; see *simd-pack-element-types* + (define-move-from-avx2 simd-pack-256-single 0 single-avx2-reg) + (define-move-from-avx2 simd-pack-256-double 1 double-avx2-reg) + (define-move-from-avx2 simd-pack-256-ub8 2 int-avx2-reg) + (define-move-from-avx2 simd-pack-256-ub16 3 int-avx2-reg) + (define-move-from-avx2 simd-pack-256-ub32 4 int-avx2-reg) + (define-move-from-avx2 simd-pack-256-ub64 5 int-avx2-reg) + (define-move-from-avx2 simd-pack-256-sb8 6 int-avx2-reg) + (define-move-from-avx2 simd-pack-256-sb16 7 int-avx2-reg) + (define-move-from-avx2 simd-pack-256-sb32 8 int-avx2-reg) + (define-move-from-avx2 simd-pack-256-sb64 9 int-avx2-reg)) (define-vop (move-to-avx2) (:args (x :scs (descriptor-reg))) @@ -244,10 +244,18 @@ (inst vpinsrq tmp tmp p3 1) (inst vinserti128 dst dst tmp 1))) +(defmacro simd-pack-256-dispatch (pack &body body) + (check-type pack symbol) + `(let ((,pack ,pack)) + (etypecase ,pack + ,@(mapcar (lambda (eltype) + `((simd-pack-256 ,eltype) ,@body)) + *simd-pack-element-types*)))) + #-sb-xc-host (macrolet ((unpack-unsigned (pack bits) - (once-only ((pack pack)) - `(let ((a (%simd-pack-256-0 ,pack)) + `(simd-pack-256-dispatch ,pack + (let ((a (%simd-pack-256-0 ,pack)) (b (%simd-pack-256-1 ,pack)) (c (%simd-pack-256-2 ,pack)) (d (%simd-pack-256-3 ,pack))) @@ -284,8 +292,8 @@ #-sb-xc-host (macrolet ((unpack-signed (pack bits) - (once-only ((pack pack)) - `(let ((a (%simd-pack-256-0 ,pack)) + `(simd-pack-256-dispatch ,pack + (let ((a (%simd-pack-256-0 ,pack)) (b (%simd-pack-256-1 ,pack)) (c (%simd-pack-256-2 ,pack)) (d (%simd-pack-256-3 ,pack))) @@ -404,14 +412,15 @@ (declaim (inline %simd-pack-256-singles)) (defun %simd-pack-256-singles (pack) (declare (type simd-pack-256 pack)) - (values (%simd-pack-256-single-item pack 0) - (%simd-pack-256-single-item pack 1) - (%simd-pack-256-single-item pack 2) - (%simd-pack-256-single-item pack 3) - (%simd-pack-256-single-item pack 4) - (%simd-pack-256-single-item pack 5) - (%simd-pack-256-single-item pack 6) - (%simd-pack-256-single-item pack 7)))) + (simd-pack-256-dispatch pack + (values (%simd-pack-256-single-item pack 0) + (%simd-pack-256-single-item pack 1) + (%simd-pack-256-single-item pack 2) + (%simd-pack-256-single-item pack 3) + (%simd-pack-256-single-item pack 4) + (%simd-pack-256-single-item pack 5) + (%simd-pack-256-single-item pack 6) + (%simd-pack-256-single-item pack 7))))) (defknown %simd-pack-256-double-item (simd-pack-256 (integer 0 3)) double-float (flushable)) @@ -442,10 +451,11 @@ (declaim (inline %simd-pack-256-doubles)) (defun %simd-pack-256-doubles (pack) (declare (type simd-pack-256 pack)) - (values (%simd-pack-256-double-item pack 0) - (%simd-pack-256-double-item pack 1) - (%simd-pack-256-double-item pack 2) - (%simd-pack-256-double-item pack 3))) + (simd-pack-256-dispatch pack + (values (%simd-pack-256-double-item pack 0) + (%simd-pack-256-double-item pack 1) + (%simd-pack-256-double-item pack 2) + (%simd-pack-256-double-item pack 3)))) (defun %simd-pack-256-inline-constant (pack) (list :avx2 (logior (%simd-pack-256-0 pack) diff --git a/src/compiler/x86-64/simd-pack.lisp b/src/compiler/x86-64/simd-pack.lisp index d5800f0316..2046d524ed 100644 --- a/src/compiler/x86-64/simd-pack.lisp +++ b/src/compiler/x86-64/simd-pack.lisp @@ -80,37 +80,37 @@ (int-sse-reg single-sse-reg double-sse-reg) (int-sse-reg single-sse-reg double-sse-reg)) -(define-vop (move-from-sse) - (:args (x :scs (single-sse-reg double-sse-reg int-sse-reg))) - (:results (y :scs (descriptor-reg))) - #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) - (:node-var node) - (:args-var args) - (:note "SSE to pointer coercion") - (:generator 13 - (alloc-other simd-pack-widetag simd-pack-size y node nil thread-tn) - (storew (fixnumize - ;; see *simd-pack-element-types* - (ecase (primitive-type-name (tn-primitive-type - (tn-ref-tn args))) - (simd-pack-single 0) - (simd-pack-double 1) - (simd-pack-ub8 2) - (simd-pack-ub16 3) - (simd-pack-ub32 4) - (simd-pack-ub64 5) - (simd-pack-any 5) - (simd-pack-sb8 6) - (simd-pack-sb16 7) - (simd-pack-sb32 8) - (simd-pack-sb64 9))) - y simd-pack-tag-slot other-pointer-lowtag) - (let ((ea (object-slot-ea y simd-pack-lo-value-slot other-pointer-lowtag))) - (if (float-sse-p x) - (inst movaps ea x) - (inst movdqa ea x))))) -(define-move-vop move-from-sse :move - (int-sse-reg single-sse-reg double-sse-reg) (descriptor-reg)) +(macrolet ((define-move-from-sse (type tag &rest scs) + (let ((name (symbolicate "MOVE-FROM-SSE/" type))) + `(progn + (define-vop (,name) + (:args (x :scs ,scs)) + (:results (y :scs (descriptor-reg))) + #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) + (:node-var node) + (:arg-types ,type) + (:note "AVX2 to pointer coercion") + (:generator 13 + (alloc-other simd-pack-widetag simd-pack-size y node nil thread-tn) + (storew (fixnumize ,tag) + y simd-pack-tag-slot other-pointer-lowtag) + (let ((ea (object-slot-ea y simd-pack-lo-value-slot other-pointer-lowtag))) + (if (float-sse-p x) + (inst movaps ea x) + (inst movdqa ea x))))) + (define-move-vop ,name :move + ,scs (descriptor-reg)))))) + ;; see *simd-pack-element-types* + (define-move-from-sse simd-pack-single 0 single-sse-reg) + (define-move-from-sse simd-pack-double 1 double-sse-reg) + (define-move-from-sse simd-pack-ub8 2 int-sse-reg) + (define-move-from-sse simd-pack-ub16 3 int-sse-reg) + (define-move-from-sse simd-pack-ub32 4 int-sse-reg) + (define-move-from-sse simd-pack-ub64 5 int-sse-reg) + (define-move-from-sse simd-pack-sb8 6 int-sse-reg) + (define-move-from-sse simd-pack-sb16 7 int-sse-reg) + (define-move-from-sse simd-pack-sb32 8 int-sse-reg) + (define-move-from-sse simd-pack-sb64 9 int-sse-reg)) (define-vop (move-to-sse) (:args (x :scs (descriptor-reg))) @@ -218,10 +218,18 @@ (inst movq tmp hi) (inst punpcklqdq dst tmp))) +(defmacro simd-pack-dispatch (pack &body body) + (check-type pack symbol) + `(let ((,pack ,pack)) + (etypecase ,pack + ,@(mapcar (lambda (eltype) + `((simd-pack ,eltype) ,@body)) + *simd-pack-element-types*)))) + #-sb-xc-host (macrolet ((unpack-unsigned (pack bits) - (once-only ((pack pack)) - `(let ((lo (%simd-pack-low ,pack)) + `(simd-pack-dispatch ,pack + (let ((lo (%simd-pack-low ,pack)) (hi (%simd-pack-high ,pack))) (values ,@(loop for pos by bits below 64 collect @@ -252,8 +260,8 @@ #-sb-xc-host (macrolet ((unpack-signed (pack bits) - (once-only ((pack pack)) - `(let ((lo (%simd-pack-low ,pack)) + `(simd-pack-dispatch ,pack + (let ((lo (%simd-pack-low ,pack)) (hi (%simd-pack-high ,pack))) (values ,@(loop for pos by bits below 64 collect @@ -357,10 +365,11 @@ (declaim (inline %simd-pack-singles)) (defun %simd-pack-singles (pack) (declare (type simd-pack pack)) - (values (%simd-pack-single-item pack 0) - (%simd-pack-single-item pack 1) - (%simd-pack-single-item pack 2) - (%simd-pack-single-item pack 3)))) + (simd-pack-dispatch pack + (values (%simd-pack-single-item pack 0) + (%simd-pack-single-item pack 1) + (%simd-pack-single-item pack 2) + (%simd-pack-single-item pack 3))))) (defknown %simd-pack-double-item (simd-pack (integer 0 1)) double-float (flushable)) @@ -392,5 +401,6 @@ (declaim (inline %simd-pack-doubles)) (defun %simd-pack-doubles (pack) (declare (type simd-pack pack)) - (values (%simd-pack-double-item pack 0) - (%simd-pack-double-item pack 1)))) + (simd-pack-dispatch pack + (values (%simd-pack-double-item pack 0) + (%simd-pack-double-item pack 1))))) From 07430bab80cc48b70afcbb7a4bb70c0ef6c4e48b Mon Sep 17 00:00:00 2001 From: Jan Moringen Date: Sat, 9 Apr 2022 22:38:15 +0200 Subject: [PATCH 3084/4023] Add type to unreadable print output for (simd-pack[-256] double-float) --- src/code/print.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/print.lisp b/src/code/print.lisp index ee5391ae99..ee58269013 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -1929,7 +1929,7 @@ variable: an unreadable object representing the error is printed instead.") (print-unreadable-object (pack stream) (etypecase pack ((simd-pack double-float) - (multiple-value-call #'format stream "~S~@{ ~,13E~}" + (multiple-value-call #'format stream "~S~@{ ~,13E~}" 'simd-pack (%simd-pack-doubles pack))) ((simd-pack single-float) (multiple-value-call #'format stream "~S~@{ ~,7E~}" 'simd-pack @@ -1975,7 +1975,7 @@ variable: an unreadable object representing the error is printed instead.") (print-unreadable-object (pack stream) (etypecase pack ((simd-pack-256 double-float) - (multiple-value-call #'format stream "~S~@{ ~,13E~}" + (multiple-value-call #'format stream "~S~@{ ~,13E~}" 'simd-pack-256 (%simd-pack-256-doubles pack))) ((simd-pack-256 single-float) (multiple-value-call #'format stream "~S~@{ ~,7E~}" 'simd-pack-256 From 999c1c8bc731b074ad6da00acebd2984e65e7d50 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 9 Apr 2022 17:32:36 -0700 Subject: [PATCH 3085/4023] Allow inlining inside MACROLET in the cross-compiler. Simply store the form in the lexenv. This fixes the build with CCL and CLISP, and should avoid this kind of problem in the future. This also avoids a KLUDGE where we need to wrap MACRO lambdas inside a macro policy of saving the source form. --- contrib/sb-cltl2/env.lisp | 2 +- src/code/defmacro.lisp | 11 +++++----- src/code/target-hash-table.lisp | 20 ++++++++--------- src/compiler/ir1-translators.lisp | 31 +++++++++++--------------- src/compiler/ir1tran-lambda.lisp | 36 +++++++++++-------------------- src/compiler/ir1tran.lisp | 2 +- src/compiler/node.lisp | 8 +++---- src/pcl/walk.lisp | 25 ++++++++++----------- 8 files changed, 58 insertions(+), 77 deletions(-) diff --git a/contrib/sb-cltl2/env.lisp b/contrib/sb-cltl2/env.lisp index 4d922174a7..c8788349c8 100644 --- a/contrib/sb-cltl2/env.lisp +++ b/contrib/sb-cltl2/env.lisp @@ -65,7 +65,7 @@ (setf (sb-c::lexenv-funs env) (nconc (loop for (name def) in macro - collect (cons name (cons 'sb-sys::macro def))) + collect (cons name (list* 'sb-sys::macro def (function-lambda-expression def)))) (sb-c::lexenv-funs env)))) (when symbol-macro diff --git a/src/code/defmacro.lisp b/src/code/defmacro.lisp index a8cc8c0871..c88f94eda9 100644 --- a/src/code/defmacro.lisp +++ b/src/code/defmacro.lisp @@ -27,17 +27,18 @@ only." (let ((def (cdr (assoc symbol (lexenv-funs env))))) (when def (return-from macro-function - (when (typep def '(cons (eql macro))) (cdr def))))))) + (when (typep def '(cons (eql macro))) (cadr def))))))) (values (info :function :macro-function symbol))) (defun (setf macro-function) (function symbol &optional environment) (declare (symbol symbol) (type function function)) (when environment - ;; Note: Technically there could be an ENV optional argument to SETF - ;; MACRO-FUNCTION, but since ANSI says that the consequences of - ;; supplying a non-nil one are undefined, we don't allow it. + ;; Note: Technically there could be an ENV optional argument to + ;; SETF MACRO-FUNCTION, but since ANSI says that the consequences + ;; of supplying a non-nil one are undefined, we don't allow it. ;; (Thus our implementation of this unspecified behavior is to - ;; complain. SInce the behavior is unspecified, this is conforming.:-) + ;; complain. Since the behavior is unspecified, this is + ;; conforming.:-) (error "Non-NIL environment argument in SETF of MACRO-FUNCTION ~S: ~S" symbol environment)) (when (eq (info :function :kind symbol) :special-form) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 44257f82e7..715355f4a1 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -67,17 +67,9 @@ (sb-vm:is-lisp-pointer (get-lisp-obj-address key)))) (declaim (inline eql-hash eql-hash-no-memoize)) -#.`(progn ; our usual whacky incantation because of macrolet + inline - ,@(loop - for (name symbol-hash-fun) - in '((eql-hash sxhash) ; via transform - ;; For GETHASH we never compute a symbol-hash. If PUTHASH - ;; (or other) hasn't done it, the lookup will fail anyway. - ;; Also, the backend can at its discretion avoid clearing - ;; the low bits of the hash which is a known fixnum. - (eql-hash-no-memoize symbol-hash)) - collect - `(defun ,name (key) +(macrolet + ((define-eql-hash (name symbol-hash-fun) + `(defun ,name (key) (declare (values fixnum (member t nil))) (if (%other-pointer-subtype-p key @@ -104,6 +96,12 @@ nil) ;; Consider picking off %INSTANCEP too before using EQ-HASH ? (eq-hash key))))) + (define-eql-hash eql-hash sxhash) ; via transform + ;; For GETHASH we should never compute a symbol-hash. If it hasn't been + ;; computed, KEY won't be found, and it doesn't matter what the hash is. + ;; This could theoretically avoid clearing the fixnum tag since the symbol + ;; is not n. + (define-eql-hash eql-hash-no-memoize symbol-hash)) (declaim (inline equal-hash)) (defun equal-hash (key) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 2afce53a5a..3c2d91f72a 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -324,25 +324,18 @@ Evaluate the FORMS in the specified SITUATIONS (any of :COMPILE-TOPLEVEL, (unless (listp arglist) (fail "The local macro argument list ~S is not a list." arglist)) - `(,name macro . - ;; I guess the reason we want to compile here rather than possibly - ;; using an interpreted lambda is that we generate the usual gamut - ;; of style-warnings and such. One might wonder if this could somehow - ;; go through the front-most part of the front-end, to deal with - ;; semantics, but then generate an interpreted function or something - ;; more quick to emit than machine code. - ,(compile-in-lexenv - (let (#-sb-xc-host - (*macro-policy* - ;; Make sure to save the sources if an - ;; inlined functions closes over this - ;; macro. - (process-optimize-decl - '(optimize (store-source-form 3)) - *macro-policy*))) - (make-macro-lambda nil arglist body 'macrolet name)) - lexenv - nil nil nil t nil))))))) ; name source-info tlf ephemeral errorp + (let ((lambda (make-macro-lambda nil arglist body 'macrolet name))) + `(,name macro + ;; I guess the reason we want to compile here rather than possibly + ;; using an interpreted lambda is that we generate the usual gamut + ;; of style-warnings and such. One might wonder if this could somehow + ;; go through the front-most part of the front-end, to deal with + ;; semantics, but then generate an interpreted function or something + ;; more quick to emit than machine code. + ,(compile-in-lexenv lambda lexenv + ;; name source-info tlf ephemeral errorp + nil nil nil t nil) + . ,lambda))))))) (defun funcall-in-macrolet-lexenv (definitions fun context) (%funcall-in-foomacrolet-lexenv diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index ed022a1d92..3ea4d694ed 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -1119,8 +1119,7 @@ (typecase what (cons (push name shadowed-funs) - (let ((expression (function-lambda-expression (cdr what)))) - (aver expression) + (let ((expression (cddr what))) (push (cons name expression) macros))) ;; FIXME: Is there a good reason for this not to be ;; DEFINED-FUN (which :INCLUDEs GLOBAL-VAR, in case @@ -1147,34 +1146,21 @@ (not (null-lexenv-p parent)))) result)) -;;; Return a sexpr for LAMBDA in LEXENV such that loading it from fasl -;;; preserves the original lexical environment for inlining. -;;; Return NIL if the lexical environment is too complicated. +;;; Return a lambda form that has been "closed" with respect ot +;;; LEXENV, returning a LAMBDA-WITH-LEXENV if there are interesting +;;; macros or declarations, so that reloading the definition from a +;;; compiled file preserves the original lexical environment for +;;; inlining. If there is something too complex in the lexical +;;; environment (like a lexical variable), then we return NIL. (defun maybe-inline-syntactic-closure (lambda lexenv) (declare (type list lambda) (type lexenv-designator lexenv)) (aver (eql (first lambda) 'lambda)) - ;; We used to have a trivial implementation, verifying that lexenv - ;; was effectively null. However, this fails to take account of the - ;; idiom - ;; - ;; (declaim (inline foo)) - ;; (macrolet ((def (x) `(defun ,x () ...))) - ;; (def foo)) - ;; - ;; which, while too complicated for the cross-compiler to handle in - ;; unfriendly foreign lisp environments, would be good to support in - ;; the target compiler. -- CSR, 2002-05-13 and 2002-11-02 (typecase lexenv (lexenv (let ((vars (lexenv-vars lexenv)) (funs (lexenv-funs lexenv))) (acond ((or (lexenv-blocks lexenv) (lexenv-tags lexenv)) nil) ((and (null vars) (null funs)) lambda) - ;; If the lexenv is too hairy for cross-compilation, - ;; you'll find out later, when trying to perform inlining. - ;; This is fine, because if the inline expansion is only - ;; for the target, it's totally OK to cross-compile this - ;; defining form. The syntactic env is correctly captured. ((reconstruct-lexenv lexenv) `(lambda-with-lexenv ,it ,@(cdr lambda)))))) #+(and sb-fasteval (not sb-xc-host)) @@ -1204,9 +1190,11 @@ (mapcar (lambda (binding) ;; XC compile-in-lexenv ignores its second arg #+sb-xc-host (aver (null-lexenv-p lexenv)) - (list* (car binding) 'macro - (compile-in-lexenv (cdr binding) lexenv - nil nil nil t nil))) + (destructuring-bind (name . form) binding + (list* name 'macro + (compile-in-lexenv form lexenv + nil nil nil t nil) + form))) bindings))) (recurse body (make-lexenv :default lexenv diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index b4f784dd15..c8b04a3589 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -900,7 +900,7 @@ *inline-expansions*) (list* lexical-def 1 *inline-expansions*)))) (ir1-convert start next result - (careful-expand-macro (cdr lexical-def) form))) + (careful-expand-macro (cadr lexical-def) form))) (progn (compiler-warn "Recursion limit reached while expanding local macro ~ ~/sb-ext:print-symbol-with-prefix/" op) diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index ad4c50221a..6fce628ec4 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -40,10 +40,10 @@ disabled-package-locks %policy user-data parent))) ;; an alist of (NAME . WHAT), where WHAT is either a FUNCTIONAL (a - ;; local function), a DEFINED-FUN, representing an - ;; INLINE/NOTINLINE declaration, or a list (MACRO . ) (a - ;; local macro, with the specifier expander). Note that NAME may be - ;; a (SETF ) list, not necessarily a single symbol. + ;; local function), a DEFINED-FUN, representing an INLINE/NOTINLINE + ;; declaration, or a list (MACRO . ) (a local + ;; macro, with the specifier expander). Note that NAME may be a + ;; (SETF ) list, not necessarily a single symbol. (funs nil :type list) ;; an alist translating variable names to LEAF structures. A special ;; binding is indicated by a :SPECIAL GLOBAL-VAR leaf. Each special diff --git a/src/pcl/walk.lisp b/src/pcl/walk.lisp index 72a1389f53..985418914e 100644 --- a/src/pcl/walk.lisp +++ b/src/pcl/walk.lisp @@ -82,9 +82,9 @@ ;;; variables, blocks, etc. Except for SYMBOL-MACROLET, only the ;;; SB-C::LEXENV-FUNS slot is relevant. It holds: Alist (Name . What), ;;; where What is either a functional (a local function) or a list -;;; (MACRO . ) (a local macro, with the specifier expander.) -;;; Note that Name may be a (SETF ) function. Accessors are -;;; defined below, eg (ENV-WALK-FUNCTION ENV). +;;; (MACRO . ) (a local macro, with the specifier +;;; expander.) Note that Name may be a (SETF ) +;;; function. Accessors are defined below, eg (ENV-WALK-FUNCTION ENV). ;;; ;;; If WITH-AUGMENTED-ENVIRONMENT is called from WALKER-ENVIRONMENT-BIND ;;; this code hides the WALKER version of an environment @@ -101,7 +101,7 @@ ;;; ;;; Instead, we now use a special sort of "function"-type for that ;;; information, because the functions slot in SB-C::LEXENV is -;;; supposed to have a list of elements. +;;; supposed to have a list of . elements. ;;; So, now we hide our bits of interest in the walker-info slot in ;;; our new BOGO-FUN. ;;; @@ -173,12 +173,13 @@ (sb-c::make-functional :lexenv lexenv))) funs) (mapcar (lambda (m) - (list* (car m) - 'sb-sys:macro - (if (eq (car m) - *key-to-walker-environment*) - (walker-info-to-bogo-fun (cadr m)) - (coerce (cadr m) 'function)))) + (destructuring-bind (name form) m + (list* name + 'sb-sys:macro + (if (eq name *key-to-walker-environment*) + (walker-info-to-bogo-fun form) + (coerce form 'function)) + form))) macros))))) (defun environment-function (env fn) @@ -194,8 +195,8 @@ (and entry (eq (cadr entry) 'sb-sys:macro) (if (eq macro *key-to-walker-environment*) - (values (bogo-fun-to-walker-info (cddr entry))) - (values (function-lambda-expression (cddr entry)))))))) + (values (bogo-fun-to-walker-info (caddr entry))) + (values (cadddr entry))))))) ;;;; other environment hacking, not so SBCL-specific as the ;;;; environment hacking in the previous section From 4bd9516489e90763e460ea214265f833902f3b72 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 9 Apr 2022 17:36:11 -0700 Subject: [PATCH 3086/4023] Remove some weird uses of #.` Some of these may have been necessary in the past because of not being able to inline in macrolet in the cross-compiler. Some are just weird. --- src/code/cross-modular.lisp | 6 ++-- src/code/seq.lisp | 54 ++++++++++++++++--------------- src/code/target-defstruct.lisp | 41 ++++++++++++----------- src/compiler/generic/vm-fndb.lisp | 26 ++++++++------- src/compiler/pack-iterative.lisp | 2 +- 5 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/code/cross-modular.lisp b/src/code/cross-modular.lisp index bd64fb1483..74aea77c3c 100644 --- a/src/code/cross-modular.lisp +++ b/src/code/cross-modular.lisp @@ -45,11 +45,9 @@ (do-mfuns *tagged-modular-class*))) `(progn ,@(forms))) -#.` -(defun ,(intern (format nil "ASH-LEFT-MOD~D" sb-vm:n-machine-word-bits) - "SB-VM") +(defun #.(intern (format nil "ASH-LEFT-MOD~D" sb-vm:n-machine-word-bits) "SB-VM") (integer amount) - (ldb (byte ,sb-vm:n-machine-word-bits 0) (ash integer amount))) + (ldb (byte #.sb-vm:n-machine-word-bits 0) (ash integer amount))) #+(or x86 x86-64 arm arm64) (defun sb-vm::ash-left-modfx (integer amount) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 34aa6c9b97..036165b447 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -617,32 +617,34 @@ (define-load-time-global %%fill-bashers%% (make-array (1+ sb-vm:widetag-mask) :initial-element 0)) -#.`(progn - ,@(loop for saetp across sb-vm:*specialized-array-element-type-properties* - for et = (sb-vm:saetp-specifier saetp) - if (or (null et) - (sb-vm:valid-bit-bash-saetp-p saetp)) - collect - (multiple-value-bind (basher value-transform) - (if et - (sb-c::find-basher saetp) - '(lambda (item vector start length) - (declare (ignore item start length)) - (data-nil-vector-ref (truly-the (simple-array nil (*)) vector) 0))) - `(setf - (aref %%fill-bashers%% ,(sb-vm:saetp-typecode saetp)) - (cons #',basher - ,(if et - `(lambda (sb-c::item) - (declare (type ,et sb-c::item)) - ,value-transform) - '#'identity)))) - else do - ;; vector-fill* depends on this assertion - (assert (member et '(t (complex double-float) - #-64-bit (complex single-float) - #-64-bit double-float) - :test #'equal)))) +(macrolet ((init-fill-bashers () + `(progn + ,@(loop for saetp across sb-vm:*specialized-array-element-type-properties* + for et = (sb-vm:saetp-specifier saetp) + if (or (null et) + (sb-vm:valid-bit-bash-saetp-p saetp)) + collect + (multiple-value-bind (basher value-transform) + (if et + (sb-c::find-basher saetp) + '(lambda (item vector start length) + (declare (ignore item start length)) + (data-nil-vector-ref (truly-the (simple-array nil (*)) vector) 0))) + `(setf + (aref %%fill-bashers%% ,(sb-vm:saetp-typecode saetp)) + (cons #',basher + ,(if et + `(lambda (sb-c::item) + (declare (type ,et sb-c::item)) + ,value-transform) + '#'identity)))) + else do + ;; vector-fill* depends on this assertion + (assert (member et '(t (complex double-float) + #-64-bit (complex single-float) + #-64-bit double-float) + :test #'equal)))))) + (init-fill-bashers)) (defun vector-fill* (vector item start end) (declare (type index start) (type (or index null) end) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 7dc4430d54..b8b75b9147 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -129,25 +129,28 @@ (defun (setf %instance-ref) (newval instance index) (%instance-set instance index newval) newval) -#.`(progn - ,@(map 'list - (lambda (rsd) - (let* ((reader (sb-kernel::raw-slot-data-reader-name rsd)) - (writer (sb-kernel::raw-slot-data-writer-name rsd)) - (type (sb-kernel::raw-slot-data-raw-type rsd))) - `(progn - (defun ,reader (instance index) (,reader instance index)) - ;; create a well-behaving SETF-compatible slot setter - (defun (setf ,reader) (newval instance index) - (declare (,type newval)) - (,writer instance index newval) - newval) - ;; .. and a non-SETF-compatible one - (defun ,writer (instance index newval) - (declare (,type newval)) - (,writer instance index newval) - (values))))) - sb-kernel::*raw-slot-data*)) + +(macrolet ((define-raw-slot-accessors () + `(progn + ,@(map 'list + (lambda (rsd) + (let* ((reader (sb-kernel::raw-slot-data-reader-name rsd)) + (writer (sb-kernel::raw-slot-data-writer-name rsd)) + (type (sb-kernel::raw-slot-data-raw-type rsd))) + `(progn + (defun ,reader (instance index) (,reader instance index)) + ;; create a well-behaving SETF-compatible slot setter + (defun (setf ,reader) (newval instance index) + (declare (,type newval)) + (,writer instance index newval) + newval) + ;; .. and a non-SETF-compatible one + (defun ,writer (instance index newval) + (declare (,type newval)) + (,writer instance index newval) + (values))))) + sb-kernel::*raw-slot-data*)))) + (define-raw-slot-accessors)) (macrolet ((id-bits-sap () `(sap+ (int-sap (get-lisp-obj-address layout)) diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 2a8c359165..7fe9da1ac2 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -247,18 +247,20 @@ sb-vm:signed-word ()) (defknown %raw-instance-xchg/word (instance index sb-vm:word) sb-vm:word ()) -#.`(progn - ,@(map 'list - (lambda (rsd) - (let* ((reader (sb-kernel::raw-slot-data-reader-name rsd)) - (writer (sb-kernel::raw-slot-data-writer-name rsd)) - (type (sb-kernel::raw-slot-data-raw-type rsd))) - `(progn - (defknown ,reader (instance index) ,type - (flushable always-translatable)) - (defknown ,writer (instance index ,type) (values) - (always-translatable))))) - sb-kernel::*raw-slot-data*)) +(macrolet ((define-raw-slot-defknowns () + `(progn + ,@(map 'list + (lambda (rsd) + (let* ((reader (sb-kernel::raw-slot-data-reader-name rsd)) + (writer (sb-kernel::raw-slot-data-writer-name rsd)) + (type (sb-kernel::raw-slot-data-raw-type rsd))) + `(progn + (defknown ,reader (instance index) ,type + (flushable always-translatable)) + (defknown ,writer (instance index ,type) (values) + (always-translatable))))) + sb-kernel::*raw-slot-data*)))) + (define-raw-slot-defknowns)) #+compare-and-swap-vops (defknown %raw-instance-atomic-incf/word (instance index sb-vm:word) sb-vm:word diff --git a/src/compiler/pack-iterative.lisp b/src/compiler/pack-iterative.lisp index a8f22c9a1c..dc56773861 100644 --- a/src/compiler/pack-iterative.lisp +++ b/src/compiler/pack-iterative.lisp @@ -65,7 +65,7 @@ ;; vertex, taking into account reserve locations and preallocated ;; TNs. (initial-domain 0 :type sc-locations) - (initial-domain-size 0 :type #.`(integer 0 ,sb-vm:finite-sc-offset-limit)) + (initial-domain-size 0 :type (integer 0 #.sb-vm:finite-sc-offset-limit)) ;; TN this is a vertex for. (tn nil :type tn :read-only t) (element-size nil :type (integer 1 8) :read-only t) From fb899748f6a6347791e52fd08dfd3100a7f546bf Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 9 Apr 2022 17:54:12 -0700 Subject: [PATCH 3087/4023] Cleanup. --- src/compiler/ir1tran-lambda.lisp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 3ea4d694ed..fd15af7488 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -1119,8 +1119,7 @@ (typecase what (cons (push name shadowed-funs) - (let ((expression (cddr what))) - (push (cons name expression) macros))) + (push (cons name (cddr what)) macros)) ;; FIXME: Is there a good reason for this not to be ;; DEFINED-FUN (which :INCLUDEs GLOBAL-VAR, in case ;; you're wondering how this ever worked :-)? Maybe From 435d82accb8619cfe1eb9ebb9455750c0c3b14e3 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sat, 9 Apr 2022 21:07:46 -0700 Subject: [PATCH 3088/4023] Fix sb-fasteval. --- src/interpreter/env.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/interpreter/env.lisp b/src/interpreter/env.lisp index 7ff9ed5c85..02cecf4a74 100644 --- a/src/interpreter/env.lisp +++ b/src/interpreter/env.lisp @@ -979,7 +979,7 @@ nil (map 'vector (lambda (cell) - (let ((expander (cddr cell))) + (let ((expander (caddr cell))) (if (typep expander 'interpreted-function) expander (make-function @@ -1129,7 +1129,7 @@ (cons sym (make-global-var :%source-name sym :kind :special :where-from :declared)))) - (macroize (name thing) (list* name 'sb-sys:macro thing)) + (macroize (name thing) (list* name 'sb-sys:macro thing (function-lambda-expression thing))) (fname (f) (second (fun-name f)))) (multiple-value-bind (vars funs) (typecase env From e32310d50d21fcad7ebe28d2085b80ba1898860c Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 9 Apr 2022 23:52:24 +0300 Subject: [PATCH 3089/4023] Fix ir2-optimize-jumps. Look for predecessors in empty blocks too. Reported by Eric Marsden, Bruce O'Neel. --- src/compiler/ir2opt.lisp | 70 +++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 5b282d5948..09b3175584 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -312,28 +312,45 @@ ;;; Should be run after DELETE-NO-OP-VOPS, otherwise the empty moves ;;; will interfere. (defun ir2-optimize-jumps (component) - (flet ((start-vop (block) - (do ((block block (ir2-block-next block))) - ((null block) nil) - (let ((vop (ir2-block-start-vop block))) - (when vop - (if (eq (vop-name vop) 'sb-c:note-environment-start) - (let ((next (vop-next vop))) - (when next - (return next))) - (return vop)))))) - (next-label (block) - (do ((block (ir2-block-next block) - (ir2-block-next block))) - ((null block) nil) - (let ((label (or (ir2-block-%trampoline-label block) - (ir2-block-%label block)))) - (cond (label - (return label)) - ((ir2-block-start-vop block) - (return nil))))))) - (let ((*2block-info* (make-hash-table :test #'eq))) - (initialize-ir2-blocks-flow-info component) + (let ((*2block-info* (make-hash-table :test #'eq))) + (initialize-ir2-blocks-flow-info component) + (flet ((start-vop (block) + (do ((block block (ir2-block-next block))) + ((null block) nil) + (let ((vop (ir2-block-start-vop block))) + (when vop + (if (eq (vop-name vop) 'sb-c:note-environment-start) + (let ((next (vop-next vop))) + (when next + (return next))) + (return vop)))))) + (delete-chain (block) + (do ((block block (ir2-block-next block))) + ((null block) nil) + ;; Just pop any block, *2block-info* is only used here + ;; and it just needs to know the number of predecessors, + ;; not their identity. + (pop (ir2block-predecessors block)) + (if (ir2block-predecessors block) + (return) + (let ((vop (ir2-block-start-vop block))) + (when vop + (when (eq (vop-name vop) 'sb-c:note-environment-start) + (setf vop (vop-next vop))) + (when vop + (aver (eq (vop-name vop) 'branch)) + (delete-vop vop) + (return t))))))) + (next-label (block) + (do ((block (ir2-block-next block) + (ir2-block-next block))) + ((null block) nil) + (let ((label (or (ir2-block-%trampoline-label block) + (ir2-block-%label block)))) + (cond (label + (return label)) + ((ir2-block-start-vop block) + (return nil))))))) (labels ((unchain-jumps (vop) ;; Handle any branching vop except a multiway branch (setf (first (vop-codegen-info vop)) @@ -346,15 +363,8 @@ (eq (vop-name target-vop) 'branch) (neq (first (vop-codegen-info target-vop)) target-label)) - ;; Just pop any block, *2block-info* is only - ;; used here and it just needs to know the - ;; number of predecessors, not their - ;; identity. (when delete - (pop (ir2block-predecessors target-block)) - (if (ir2block-predecessors target-block) - (setf delete nil) - (delete-vop target-vop))) + (setf delete (delete-chain target-block))) (follow-jumps (first (vop-codegen-info target-vop)) delete)) (t target-label)))) From ac92b00d66defb9dddc03a609f42340029c9a318 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 10 Apr 2022 04:11:53 -0400 Subject: [PATCH 3090/4023] Improve COPY-STRUCTURE Use a layout flag bit to test for absence of raw slots. This allows (DEFSTRUCT SHIP (X 0 :TYPE FIXNUM) (Y 0 :TYPE FIXNUM)) to take the fast loop even though there is a 0 bitmap since GC does not need to read any slot. Iterate over LAYOUT-BITMAP, not DD-BITMAP which avoids needing the descriptive metadata in cold-init and is probably better in general. Remove the obsolete-instance test which does not seem to be prescribed by the spec. Completely avoid use of the bitmap for x86[-64]. --- src/code/defstruct.lisp | 2 +- src/code/early-raw-slots.lisp | 5 +- src/code/target-defstruct.lisp | 87 +++++++++++++++++++++------------- src/compiler/info-vector.lisp | 10 +--- 4 files changed, 60 insertions(+), 44 deletions(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 189a1f81bc..b7e981d295 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -51,7 +51,7 @@ (sb-xc:defmacro %new-instance (layout size) `(let* ((l ,layout) (i (%make-instance ,size))) - (setf (%instance-wrapper i) l) + (%set-instance-layout i l) i)) (declaim (ftype (sfunction (defstruct-description list) function) diff --git a/src/code/early-raw-slots.lisp b/src/code/early-raw-slots.lisp index 72c4f43d06..11d8ddac17 100644 --- a/src/code/early-raw-slots.lisp +++ b/src/code/early-raw-slots.lisp @@ -219,8 +219,7 @@ (,bitmap-limit (%instance-length ,layout)) ;; If this was the last word of the bitmap, then the high bit ;; is infinitely sign-extended, and we can keep right-shifting - ;; the mask word indefinitely. Most bitmaps will have only 1 word, - ;; so this is almost always MOST-POSITIVE-FIXNUM. + ;; the mask word indefinitely. Most bitmaps will have only 1 word. (,nbits (if (= ,bitmap-index ,bitmap-limit) sb-vm:instance-length-mask (- sb-vm:n-word-bits sb-vm:instance-data-start)))) @@ -236,7 +235,7 @@ ;; If mask was fully consumed, fetch the next bitmap word (when (zerop ,nbits) (setq ,mask (%raw-instance-ref/signed-word ,layout ,bitmap-index) - ,nbits (if (= (incf ,bitmap-index) ,bitmap-limit) + ,nbits (if (= (incf (truly-the index ,bitmap-index)) ,bitmap-limit) sb-vm:instance-length-mask sb-vm:n-word-bits))) (when (logbitp 0 ,mask) ,@body) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index b8b75b9147..40b5a4d7e2 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -287,42 +287,65 @@ (dd-name dd)) +;;; Similar to DO-INSTANCE-TAGGED-SLOT but iterating over all words. +(defmacro do-layout-bitmap ((index-var taggedp-var layout count) &body guts) + `(let* ((layout ,layout) + ;; Start counting from the next bitmap word as we've consumed one already + (bitmap-word-index ,(1+ (type-dd-length sb-vm:layout))) + (bitmap-word-limit (%instance-length layout)) + ;; Shift out 1 bit if skipping bit 0 of the 0th mask word + ;; because it's not user-visible data. + (mask (ash (%raw-instance-ref/signed-word layout ,(type-dd-length sb-vm:layout)) + ,(- sb-vm:instance-data-start))) + ;; If this was the last word of the bitmap, then the high bit + ;; is infinitely sign-extended, and we can keep right-shifting + ;; the mask word indefinitely. Most bitmaps will have only 1 word. + (nbits (if (= bitmap-word-index bitmap-word-limit) + ,sb-vm:instance-length-mask + ,(- sb-vm:n-word-bits sb-vm:instance-data-start)))) + (declare (type sb-vm:signed-word mask) + (type fixnum nbits)) + (do ((,index-var sb-vm:instance-data-start (1+ ,index-var)) + (end ,count)) + ((>= ,index-var end)) + (declare (type (unsigned-byte 14) ,index-var)) + ;; If mask was fully consumed, fetch the next bitmap word + (when (zerop nbits) + (setq mask (%raw-instance-ref/signed-word layout bitmap-word-index) + nbits (if (= (incf (truly-the index bitmap-word-index)) + bitmap-word-limit) + ,sb-vm:instance-length-mask + ,sb-vm:n-word-bits))) + (let ((,taggedp-var (logbitp 0 mask))) ,@guts) + (setq mask (ash mask -1) + nbits (truly-the fixnum (1- nbits)))))) + ;;; Copy any old kind of structure. (defun copy-structure (structure) "Return a copy of STRUCTURE with the same (EQL) slot values." (declare (type structure-object structure)) - (let ((wrapper (%instance-wrapper structure))) - (when (wrapper-invalid wrapper) - (error "attempt to copy an obsolete structure:~% ~S" structure)) - ;; Previously this had to used LAYOUT-LENGTH in the allocation, - ;; to avoid copying random bits from the stack to the heap if you had a - ;; padding word in a stack-allocated instance. This is no longer an issue. - ;; %INSTANCE-LENGTH returns the number of words that are logically in the - ;; instance, with no padding. Using %INSTANCE-LENGTH allows potentially - ;; interesting nonstandard things like variable-length structures. - (let* ((len (%instance-length structure)) - (res (%new-instance (%instance-layout structure) len))) - (declare (type index len)) - (let ((bitmap (dd-bitmap (wrapper-dd wrapper)))) - ;; On backends which don't segregate descriptor vs. non-descriptor - ;; registers, we could speed up this code in an obvious way. - (macrolet ((copy-loop (tagged-p &optional step) - `(do ((i sb-vm:instance-data-start (1+ i))) - ((>= i len)) - (declare (index i)) - (if ,tagged-p - (%instance-set res i (%instance-ref structure i)) - (%raw-instance-set/word res i - (%raw-instance-ref/word structure i))) - ,step))) - (cond ((eql bitmap +layout-all-tagged+) (copy-loop t)) - ;; The fixnum case uses fixnum operations for ODDP and ASH. - ((fixnump bitmap) ; shift and mask is faster than logbitp - (copy-loop (oddp (truly-the fixnum bitmap)) - (setq bitmap (ash bitmap -1)))) - (t ; bignum - use LOGBITP to avoid consing more bignums - (copy-loop (logbitp i bitmap)))))) - res))) + ;; %INSTANCE-LENGTH returns the number of words that are logically in the + ;; instance excluding any padding and/or stable-hash slot. + ;; Variable-length structure types are allowed. + (let* ((layout (%instance-layout structure)) + (len (%instance-length structure)) + (res (%new-instance layout len))) + ;; The finicky backends disallow loading and storing raw words + ;; using %INSTANCE-REF. The robust backends allow it. + ;; MIPS is probably robust, but I don't care to try it. + (if (or #+(or x86 x86-64) t + (logtest (layout-flags layout) sb-vm::+strictly-boxed-flag+)) + (do ((i sb-vm:instance-data-start (1+ i))) + ((>= i len)) + (declare (index i)) + (%instance-set res i (%instance-ref structure i))) + (do-layout-bitmap (i taggedp layout len) + (if taggedp + (%instance-set res i (%instance-ref structure i)) + (%raw-instance-set/word + res i (%raw-instance-ref/word structure i))))) + res)) + ;;; Like above, but copy all slots (including the LAYOUT) as though boxed. ;;; If the structure might contain raw slots and the GC is precise, ;;; this won't ever be called. diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index 8b3014c54b..79153b8ea8 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -92,17 +92,11 @@ ;;; The structure constructor is never called ;;; Can't freeze theis type because INSTANCE-LENGTH is variable, ;;; but freezing would make it constant henceforth. -(sb-xc:defstruct (packed-info (:predicate nil) (:constructor nil) (:copier nil)) +(sb-xc:defstruct (packed-info (:predicate nil) (:constructor nil)) cells) (eval-when (#-sb-xc-host :compile-toplevel) (sb-xc:defmacro make-packed-info (n) - `(%new-instance ,(find-layout 'packed-info) (+ ,n ,sb-vm:instance-data-start))) - ;; We can't call COPY-STRUCTURE because during bootstrapping, the DEFSTRUCT-DESCRIPTION - ;; is not available in cold-init by the first call to COPY-PACKED-INFO, - ;; but COPY-STRUCTURE needs to know whether there are raw slos. - (sb-xc:defmacro copy-packed-info (info) - ;; not bothering with ONCE-ONLY here (doesn't matter) - `(%copy-instance (%make-instance (%instance-length ,info)) ,info))) + `(%new-instance ,(find-layout 'packed-info) (+ ,n ,sb-vm:instance-data-start)))) (defconstant info-num-mask (ldb (byte info-number-bits 0) -1)) ; #b111111 From 476b23cc45edac042d9e321fb616a18043021d16 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Sun, 10 Apr 2022 11:18:17 +0100 Subject: [PATCH 3091/4023] Define FUNCTION-LAMBDA-EXPRESSION earlier Now that we store a lambda expression in the LEXENV, as opposed to computing one on demand, conversion of interpreter environments must generate such a lambda when converting their environments to a compiler LEXENV; the easiest way for them to do that is to call FUNCTION-LAMBDA-EXPRESSION themselves. This means that it needs to be defined early enough to support uses of MACROLET in warm init. --- src/code/describe.lisp | 40 ------------------------------------ src/code/target-misc.lisp | 43 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/src/code/describe.lisp b/src/code/describe.lisp index 74b32686f2..800b61f2bc 100644 --- a/src/code/describe.lisp +++ b/src/code/describe.lisp @@ -19,46 +19,6 @@ name class))) -;;;; the ANSI interface to function names (and to other stuff too) -;;; Note: this function gets called by the compiler (as of 1.0.17.x, -;;; in MAYBE-INLINE-SYNTACTIC-CLOSURE), and so although ANSI says -;;; we're allowed to return NIL here freely, it seems plausible that -;;; small changes to the circumstances under which this function -;;; returns non-NIL might have subtle consequences on the compiler. -;;; So it might be desirable to have the compiler not rely on this -;;; function, eventually. -(defun function-lambda-expression (fun) - "Return (VALUES DEFINING-LAMBDA-EXPRESSION CLOSURE-P NAME), where - DEFINING-LAMBDA-EXPRESSION is NIL if unknown, or a suitable argument - to COMPILE otherwise, CLOSURE-P is non-NIL if the function's definition - might have been enclosed in some non-null lexical environment, and - NAME is some name (for debugging only) or NIL if there is no name." - (declare (type function fun)) - (etypecase fun - (interpreted-function - #+sb-eval - (let ((name (sb-eval:interpreted-function-name fun)) - (lambda-list (sb-eval:interpreted-function-lambda-list fun)) - (declarations (sb-eval:interpreted-function-declarations fun)) - (body (sb-eval:interpreted-function-body fun))) - (values `(lambda ,lambda-list - ,@(when declarations `((declare ,@declarations))) - ,@body) - t name)) - #+sb-fasteval - (sb-interpreter:fun-lambda-expression fun)) - (function - (let ((name (%fun-name fun)) - (fun (%fun-fun fun))) - (acond ((%simple-fun-lexpr fun) - (values it t name)) - ((legal-fun-name-p name) - (let ((exp (fun-name-inline-expansion name))) - ;; Isn't this (NOT EXP) wrong if it's a syntactic closure? - (values exp (not exp) name))) - (t - (values nil t name))))))) - ;;; Prints X on a single line, limiting output length by *PRINT-RIGHT-MARGIN* ;;; -- good for printing object parts, etc. (defun prin1-to-line (x &key (columns 1) (reserve 0)) diff --git a/src/code/target-misc.lisp b/src/code/target-misc.lisp index 77ed0f1de6..dac906a195 100644 --- a/src/code/target-misc.lisp +++ b/src/code/target-misc.lisp @@ -119,8 +119,8 @@ the file system." (close *dribble-stream*) (apply #'install-streams (pop *previous-dribble-streams*))))) (values)) - -;;; DEFmumble helpers + +;;;; DEFmumble helpers (defun %defglobal (name value source-location &optional (doc nil docp)) (%compiler-defglobal name :always-bound @@ -172,6 +172,45 @@ the file system." (sb-c::note-name-defined name :function) name) + +;;;; the ANSI interface to function names (and to other stuff too) +;;; Note: this function gets called by the interpreter to convert its +;;; representation of an environment to a LEXENV, and so although ANSI +;;; says we're allowed to return NIL here freely, doing so might +;;; prevent correct inlining of interpreted functions defined within +;;; MACROLETs. +(defun function-lambda-expression (fun) + "Return (VALUES DEFINING-LAMBDA-EXPRESSION CLOSURE-P NAME), where + DEFINING-LAMBDA-EXPRESSION is NIL if unknown, or a suitable argument + to COMPILE otherwise, CLOSURE-P is non-NIL if the function's definition + might have been enclosed in some non-null lexical environment, and + NAME is some name (for debugging only) or NIL if there is no name." + (declare (type function fun)) + (etypecase fun + (interpreted-function + #+sb-eval + (let ((name (sb-eval:interpreted-function-name fun)) + (lambda-list (sb-eval:interpreted-function-lambda-list fun)) + (declarations (sb-eval:interpreted-function-declarations fun)) + (body (sb-eval:interpreted-function-body fun))) + (values `(lambda ,lambda-list + ,@(when declarations `((declare ,@declarations))) + ,@body) + t name)) + #+sb-fasteval + (sb-interpreter:fun-lambda-expression fun)) + (function + (let ((name (%fun-name fun)) + (fun (%fun-fun fun))) + (acond ((%simple-fun-lexpr fun) + (values it t name)) + ((legal-fun-name-p name) + (let ((exp (fun-name-inline-expansion name))) + ;; Isn't this (NOT EXP) wrong if it's a syntactic closure? + (values exp (not exp) name))) + (t + (values nil t name))))))) + (in-package "SB-C") (defun split-version-string (string) From fa88407d92bd443884b54785163d64c781c2dd9b Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Sun, 10 Apr 2022 14:04:10 +0100 Subject: [PATCH 3092/4023] Macros and symbol-macros differ in their lexenv representation Respect that difference when making a lexenv in the interpreter. --- src/interpreter/env.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/interpreter/env.lisp b/src/interpreter/env.lisp index 02cecf4a74..aa9dc0d033 100644 --- a/src/interpreter/env.lisp +++ b/src/interpreter/env.lisp @@ -1130,6 +1130,7 @@ :kind :special :where-from :declared)))) (macroize (name thing) (list* name 'sb-sys:macro thing (function-lambda-expression thing))) + (symbol-macroize (name thing) (list* name 'sb-sys:macro thing)) (fname (f) (second (fun-name f)))) (multiple-value-bind (vars funs) (typecase env @@ -1146,7 +1147,7 @@ ;; access interpreter's lexical vars ;; Prevent SETF on the variable from getting ;; "Destructive function (SETF SVREF) called on constant data" - (macroize sym `(svref (load-time-value ,payload) ,i))) + (symbol-macroize sym `(svref (load-time-value ,payload) ,i))) (t (let ((leaf (make-lambda-var :%source-name sym From cb20bdc1a8ddb4ab147aa36ef429034583860e0e Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 10 Apr 2022 11:43:02 -0400 Subject: [PATCH 3093/4023] Summarize in DEFSTRUCT-DESCRIPTION presence of any raw slot Repurpose ELEMENT-TYPE to have T or * for all-boxed vs some raw. No change if represented as a vector. Add comments re. questionable use of (VECTOR *) as a structure's :TYPE option. I don't know what to make of it. --- src/code/defstruct.lisp | 64 ++++++++++++++++++++-------- src/code/early-classoid.lisp | 14 +++--- src/cold/exports.lisp | 2 +- src/compiler/generic/vm-ir2tran.lisp | 10 ++--- src/compiler/generic/vm-tran.lisp | 10 ++--- 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index b7e981d295..7e62ece589 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -191,7 +191,7 @@ (defun dd-lisp-type (defstruct) (ecase (dd-type defstruct) (list 'list) - (vector `(simple-array ,(dd-element-type defstruct) (*))))) + (vector `(simple-array ,(dd-%element-type defstruct) (*))))) ;;;; shared machinery for inline and out-of-line slot accessor functions @@ -493,7 +493,7 @@ (new-value '(value)) (structure '(structure)) (slot-type `(and ,(dsd-type slot) - ,(dd-element-type defstruct)))) + ,(dd-%element-type defstruct)))) (let ((inherited (accessor-inherited-data name defstruct))) (cond ((not inherited) @@ -614,10 +614,20 @@ requires exactly~;accepts at most~] one argument" keyword syntax-group) (setf (dd-print-option dd) keyword (dd-printer-fname dd) arg)) (:type (cond ((member arg '(list vector)) - (setf (dd-type dd) arg (dd-element-type dd) t)) + (setf (dd-type dd) arg (dd-%element-type dd) t)) ((and (listp arg) (eq (first arg) 'vector)) + ;; The spec is self-contradictory about this! + ;; It defines: + ;; type-option::= (:type type) + ;; type --- one of the type specifiers list, vector, or (vector size), + ;; or some other type specifier defined by the implementation to be appropriate. + ;; However the description of the keyword makes it pretty clear that + ;; the option's syntax is (vector /element-type/). + ;; I'm not sure if it's valid to specify (VECTOR *) as the representation. + ;; CLISP thinks it is not, but only signals an error when the constructor + ;; is called. So at minimum it's unportable, if not illegal. (destructuring-bind (elt-type) (cdr arg) - (setf (dd-type dd) 'vector (dd-element-type dd) elt-type))) + (setf (dd-type dd) 'vector (dd-%element-type dd) elt-type))) (t (error "~S is a bad :TYPE for DEFSTRUCT." arg)))) (:named @@ -668,11 +678,11 @@ requires exactly~;accepts at most~] one argument" keyword syntax-group) ;; CLHS - "The structure can be :named only if the type SYMBOL ;; is a subtype of the supplied element-type." (multiple-value-bind (winp certainp) - (subtypep 'symbol (dd-element-type dd)) + (subtypep 'symbol (dd-%element-type dd)) (when (and (not winp) certainp) (error ":NAMED option is incompatible with element ~ type ~/sb-impl:print-type-specifier/" - (dd-element-type dd)))) + (dd-%element-type dd)))) (when (dd-predicate-name dd) (error ":PREDICATE cannot be used with :TYPE ~ unless :NAMED is also specified."))) @@ -767,8 +777,12 @@ unless :NAMED is also specified."))) (nth-value 1 (parse-1-dsd proto-classoid dd slot-description)))) (comparator-list comparator))) (when (dd-class-p dd) - (setf (dd-bitmap dd) (calculate-dd-bitmap dd))) + (multiple-value-bind (bitmap any-raw) (calculate-dd-bitmap dd) + (when any-raw (setf (dd-%element-type dd) '*)) + (setf (dd-bitmap dd) bitmap))) (values inherits (comparator-list))))) + +(defmacro dd-has-raw-slot-p (dd) `(eq (dd-%element-type ,dd) '*)) ;;;; stuff to parse slot descriptions @@ -968,6 +982,19 @@ unless :NAMED is also specified."))) (or (info :typed-structure :info name) (error ":TYPE'd DEFSTRUCT ~S not found for inclusion." name))) +(defmacro dd-element-type (dd) + `(case (dd-type ,dd) + (vector + ;; %ELEMENT-TYPE might actually be * which is weird + ;; but seems to mostly work. I suspect that it should not. + (dd-%element-type ,dd)) + (t + ;; In theory we have the ability to represent that all slots + ;; of a classoid structure are of type SB-VM:WORD (for example), + ;; but in practice that is not useful. + ;; Just don't return * which is not a type specifier. + t))) + ;;; Process any included slots pretty much like they were specified. ;;; Also inherit various other attributes. (defun frob-dd-inclusion-stuff (proto-classoid dd option-bits) @@ -1594,7 +1621,7 @@ or they must be declared locally notinline at each call site.~@:>" ;; as a pending-deletion flag. See "src/code/target-lflist.lisp") (when (dd-custom-gc-method-p dd) (aver (eq rest :unspecific)) - (return-from calculate-dd-bitmap minimal-bitmap)) + (return-from calculate-dd-bitmap (values minimal-bitmap any-raw))) ;; The minimal bitmap will have the least number of bits set, and the maximal ;; will have the most, but it is not always a performance improvement to prefer @@ -1614,13 +1641,14 @@ or they must be declared locally notinline at each call site.~@:>" ;; If the trailing slots have tagged nature, extend bitmap with ;; an infinite sequence of 1 bits. If :UNSPECIFIC, replicate ;; the most-significant-bit whether it be 0 or 1. - (cond ((or (eq rest :tagged) - (and (eq rest :unspecific) - (plusp n-bits) - (logbitp (1- n-bits) bitmap))) - (dpb bitmap (byte n-bits 0) -1)) - (t - bitmap))))) + (values (cond ((or (eq rest :tagged) + (and (eq rest :unspecific) + (plusp n-bits) + (logbitp (1- n-bits) bitmap))) + (dpb bitmap (byte n-bits 0) -1)) + (t + bitmap)) + any-raw)))) ;;; This is called when we are about to define a structure class. It ;;; returns a (possibly new) class object and the layout which should @@ -1774,7 +1802,7 @@ or they must be declared locally notinline at each call site.~@:>" ;;; be a (VECTOR T). If not, we fallback to MAKE-ARRAY and (SETF AREF). (defun typed-constructor-form (dd values) (multiple-value-bind (operator initial-element) - (cond ((and (eq (dd-type dd) 'vector) (eq (dd-element-type dd) t)) + (cond ((and (eq (dd-type dd) 'vector) (eq (dd-%element-type dd) t)) (values 'vector 0)) ((eq (dd-type dd) 'list) (values 'list nil))) @@ -1801,7 +1829,7 @@ or they must be declared locally notinline at each call site.~@:>" (cons operator vals)) (let ((temp (make-symbol "OBJ"))) `(let ((,temp (make-array ,length - :element-type ',(dd-element-type dd)))) + :element-type ',(dd-%element-type dd)))) ,@(mapcar (lambda (x) `(setf (aref ,temp ,(cdr x)) ',(car x))) names) ,@(mapcan (lambda (dsd val) @@ -1853,7 +1881,7 @@ or they must be declared locally notinline at each call site.~@:>" keys)))))) (values ,(cond ((dd-class-p dd) (dd-name dd)) ((eq (dd-type dd) 'list) 'list) - (t `(vector ,(dd-element-type dd) ,(dd-length dd)))) + (t `(vector ,(dd-%element-type dd) ,(dd-length dd)))) &optional)))) ;;; Return the ftype of global function NAME. diff --git a/src/code/early-classoid.lisp b/src/code/early-classoid.lisp index 1b4675e13f..ffa44b4477 100644 --- a/src/code/early-classoid.lisp +++ b/src/code/early-classoid.lisp @@ -59,16 +59,21 @@ (inherited-accessor-alist () :type list) ;; number of data words, including the layout itself if the layout ;; requires an entire word (when no immobile-space) + ;; Technically this is redundant information: it can be derived from DD-SLOTS + ;; by taking the index of the final slot and adding its length in words. + ;; If there are no slots, then it's just INSTANCE-DATA-START. (length 0 :type index) ;; General kind of implementation. (type 'structure :type (member structure vector list funcallable-structure)) - ;; The next three slots are for :TYPE'd structures (which aren't + ;; If this structure is a classoid, then T if all slots are tagged, * if not. + ;; If a vector, the vector element type. + ;; If a list, not used. + (%element-type t) + ;; The next two slots are for :TYPE'd structures (which aren't ;; classes, DD-CLASS-P = NIL) ;; - ;; vector element type - (element-type t) ;; T if :NAMED was explicitly specified, NIL otherwise (named nil :type boolean) ;; any INITIAL-OFFSET option on this direct type @@ -315,8 +320,7 @@ (when (or (logtest flags (logior +pathname-layout-flag+ +condition-layout-flag+)) (and (logtest flags +structure-layout-flag+) dd - (every (lambda (x) (eq (dsd-raw-type x) t)) - (dd-slots dd)))) + (eq (dd-%element-type dd) 't))) (setf flags (logior flags +strictly-boxed-flag+)))) ;; KLUDGE: I really don't care to make defstruct-with-alternate-metaclass ;; any more complicated than necessary. It is unable to express that diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 22c51a7dad..ca8fa63eb7 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2468,7 +2468,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "NOTE-NAME-DEFINED" "%CODE-CODE-SIZE" "%CODE-TEXT-SIZE" "%CODE-SERIALNO" - "DD-SLOTS" "DD-INCLUDE" "SLOT-SETTER-LAMBDA-FORM" + "DD-SLOTS" "DD-HAS-RAW-SLOT-P" "DD-INCLUDE" "SLOT-SETTER-LAMBDA-FORM" "SLOT-ACCESS-TRANSFORM" "%IMAGPART" "%CODE-DEBUG-INFO" "WRAPPER-CLASSOID" "WRAPPER-INVALID" diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index d7e80136e8..b9e1cd160b 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -21,14 +21,10 @@ ;; slots, or if we're on a target with a conservatively-scavenged ;; stack. We have no reader conditional for stack conservation, but ;; it turns out that the only time stack conservation is in play is - ;; when we're on GENCGC (since CHENEYGC doesn't have conservation) - ;; and C-STACK-IS-CONTROL-STACK (otherwise, the C stack is the + ;; C-STACK-IS-CONTROL-STACK (otherwise, the C stack is the ;; number stack, and we precisely-scavenge the control stack). - #-(and :gencgc :c-stack-is-control-stack) - (every (lambda (x) (eq (dsd-raw-type x) t)) - (dd-slots (lvar-value defstruct-description))) - #+(and :gencgc :c-stack-is-control-stack) - t) + (or #+c-stack-is-control-stack t + (not (dd-has-raw-slot-p (lvar-value defstruct-description))))) (defoptimizer (%make-instance stack-allocate-result) ((n) node dx) (declare (ignore n)) diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index 81d6fc124c..c36e2ee062 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -87,10 +87,6 @@ sb-vm:bignum-digits-offset index offset)) -(defun dd-contains-raw-slots-p (dd) - (dolist (dsd (dd-slots dd)) - (unless (eq (dsd-raw-type dsd) t) (return t)))) - (deftransform copy-structure ((instance) * * :result result :node node) (let* ((classoid (lvar-type instance)) (name (and (structure-classoid-p classoid) (classoid-name classoid))) @@ -106,14 +102,14 @@ (max-inlined-words 5)) (unless (and result ; could be unused result (but entire call wasn't flushed?) layout - ;; And don't copy if raw slots are present on the precisely GCed backends. - ;; To enable that, we'd want variants for {"all-raw", "all-boxed", "mixed"} + ;; Fail if raw slots are present on the precisely GCed backends. ;; Also note that VAR-ALLOC can not cope with dynamic-extent except where ;; support has been added (x86oid so far); so requiring an exact type here ;; causes VAR-ALLOC to become FIXED-ALLOC which works on more architectures. - #-c-stack-is-control-stack (and dd (not (dd-contains-raw-slots-p dd))) + #-c-stack-is-control-stack (and dd (not (dd-has-raw-slot-p dd))) ;; Definitely do this if copying to stack + ;; (Allocation has to be inlined, otherwise there's no way to DX it) (or (lvar-dynamic-extent result) ;; Or if it's a small fixed number of words ;; and speed at least as important as size. From 53cc1e4f43cf03b1790cab5fc1265195c4f9f5bb Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 10 Apr 2022 12:41:28 -0400 Subject: [PATCH 3094/4023] Add %MAKE-INSTANCE/MIXED for instances containing raw slots This allows segregating pure boxed instances at the time of allocation rather than waiting for GC to move an object to a certain page kind, subject to making the requisite changes in each backends' allocator. As motivation: with boxed instances on prezeroed pages, any word on the stack can be determined to either definitely point to the start of an instance, or not, using just a widetag test. It's still ambiguous whether it was _intended_ to be a pointer, but no scanning is needed. --- src/code/stubs.lisp | 1 + src/code/target-defstruct.lisp | 54 ++++++++++++++++++---------- src/cold/exports.lisp | 2 +- src/compiler/generic/vm-fndb.lisp | 2 +- src/compiler/generic/vm-ir2tran.lisp | 6 ++++ src/compiler/generic/vm-tran.lisp | 3 +- src/compiler/x86-64/alloc.lisp | 2 +- 7 files changed, 48 insertions(+), 22 deletions(-) diff --git a/src/code/stubs.lisp b/src/code/stubs.lisp index 900636c82e..fb72cfea04 100644 --- a/src/code/stubs.lisp +++ b/src/code/stubs.lisp @@ -115,6 +115,7 @@ ;; instances (def %make-instance) ; Allocate a new instance with X data slots. + (def %make-instance/mixed) (def %instance-length) ; Given an instance, return its length. (def %instance-layout) (def %instance-wrapper) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 40b5a4d7e2..485b1112f1 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -115,8 +115,13 @@ ;;; when given a STRUCTURE-OBJECT. (defun allocate-struct (type) (let* ((wrapper (classoid-wrapper (the structure-classoid (find-classoid type)))) - (structure (%new-instance wrapper (wrapper-length wrapper)))) - (dolist (dsd (dd-slots (wrapper-dd wrapper)) structure) + (dd (wrapper-dd wrapper)) + (structure (let ((len (wrapper-length wrapper))) + (if (dd-has-raw-slot-p dd) + (%make-instance/mixed len) + (%make-instance len))))) + (%set-instance-layout structure wrapper) + (dolist (dsd (dd-slots dd) structure) (when (eq (dsd-raw-type dsd) 't) (%instance-set structure (dsd-index dsd) (make-unbound-marker)))))) @@ -207,10 +212,13 @@ ;;; Because this sure as heck doesn't check anything] #+(or sb-eval sb-fasteval) (defun %make-structure-instance (dd slot-specs &rest slot-values) - (let ((instance (%new-instance (dd-layout-or-lose dd) - (dd-length dd))) ; length = sans header word + (let ((instance (let ((len (dd-length dd))) ; # of words excluding the header + (if (dd-has-raw-slot-p dd) + (%make-instance/mixed len) + (%make-instance len)))) (value-index 0)) (declare (index value-index)) + (%set-instance-layout instance (dd-layout-or-lose dd)) (dolist (spec slot-specs instance) (destructuring-bind (kind raw-type . index) spec (if (eq kind :unbound) @@ -328,23 +336,33 @@ ;; instance excluding any padding and/or stable-hash slot. ;; Variable-length structure types are allowed. (let* ((layout (%instance-layout structure)) - (len (%instance-length structure)) - (res (%new-instance layout len))) + (len (%instance-length structure))) ;; The finicky backends disallow loading and storing raw words ;; using %INSTANCE-REF. The robust backends allow it. ;; MIPS is probably robust, but I don't care to try it. - (if (or #+(or x86 x86-64) t - (logtest (layout-flags layout) sb-vm::+strictly-boxed-flag+)) - (do ((i sb-vm:instance-data-start (1+ i))) - ((>= i len)) - (declare (index i)) - (%instance-set res i (%instance-ref structure i))) - (do-layout-bitmap (i taggedp layout len) - (if taggedp - (%instance-set res i (%instance-ref structure i)) - (%raw-instance-set/word - res i (%raw-instance-ref/word structure i))))) - res)) + (macrolet ((fast-loop () + `(do ((i sb-vm:instance-data-start (1+ i))) + ((>= i len) res) + (declare (index i)) + (%instance-set res i (%instance-ref structure i))))) + #+(or x86 x86-64) ; Two allocators, but same loop either way + (let ((res (if (logtest (layout-flags layout) sb-vm::+strictly-boxed-flag+) + (%make-instance len) + (%make-instance/mixed len)))) + (%set-instance-layout res layout) + (fast-loop)) + #-(or x86 x86-64) ; Different loops + (if (logtest (layout-flags layout) sb-vm::+strictly-boxed-flag+) + (let ((res (%new-instance layout len))) + (fast-loop)) + (let ((res (%make-instance/mixed len))) + (%set-instance-layout res layout) + (do-layout-bitmap (i taggedp layout len) + (if taggedp + (%instance-set res i (%instance-ref structure i)) + (%raw-instance-set/word + res i (%raw-instance-ref/word structure i)))) + res))))) ;;; Like above, but copy all slots (including the LAYOUT) as though boxed. ;;; If the structure might contain raw slots and the GC is precise, diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index ca8fa63eb7..e57fa41b22 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1874,7 +1874,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "%MAKE-ARRAY" "%MAKE-COMPLEX" "%MAKE-FUNCALLABLE-INSTANCE" "%MAKE-FUNCALLABLE-STRUCTURE-INSTANCE-ALLOCATOR" - "%MAKE-INSTANCE" + "%MAKE-INSTANCE" "%MAKE-INSTANCE/MIXED" "%MAKE-LISP-OBJ" "%MAKE-LIST" "%MAKE-RATIO" diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 7fe9da1ac2..34f07643ad 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -205,7 +205,7 @@ (flushable no-verify-arg-count) :result-arg 0) -(defknown %make-instance (index) instance +(defknown (%make-instance %make-instance/mixed) (index) instance (flushable)) (defknown %make-structure-instance (defstruct-description list &rest t) instance (flushable always-translatable)) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index b9e1cd160b..fea73ab511 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -12,6 +12,8 @@ (def-alloc '%make-structure-instance 1 :structure-alloc sb-vm:instance-widetag sb-vm:instance-pointer-lowtag nil) +(def-alloc '%make-instance/mixed 1 :var-alloc + sb-vm:instance-widetag sb-vm:instance-pointer-lowtag nil) (defoptimizer (%make-structure-instance stack-allocate-result) ((defstruct-description &rest args) node dx) @@ -29,6 +31,10 @@ (defoptimizer (%make-instance stack-allocate-result) ((n) node dx) (declare (ignore n)) (eq dx 'truly-dynamic-extent)) +#+(and gencgc c-stack-is-control-stack) +(defoptimizer (%make-instance/mixed stack-allocate-result) ((n) node dx) + (declare (ignore n)) + (eq dx 'truly-dynamic-extent)) (defoptimizer (%make-funcallable-instance stack-allocate-result) ((n) node dx) (declare (ignore n)) (eq dx 'truly-dynamic-extent)) diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index c36e2ee062..4980bb992d 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -122,7 +122,8 @@ ;; depending on whether layouts are in immobile space. ;; - for a small number of slots, copying them is inlined (cond ((not dd) ; it's going to be some subtype of NAME - `(%copy-instance (%make-instance (%instance-length instance)) instance)) + ;; pessimistically assume MIXED rather than choosing at runtime + `(%copy-instance (%make-instance/mixed (%instance-length instance)) instance)) ((<= (dd-length dd) max-inlined-words) `(let ((copy (%make-structure-instance ,dd nil))) ;; ASSUMPTION: either %INSTANCE-REF is the correct accessor for this word, diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index 0becca979e..e8884ad2c6 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -916,7 +916,7 @@ ;;; BIGNUM (%ALLOCATE-BIGNUM) ;;; FUNCALLABLE-INSTANCE (%MAKE-FUNCALLABLE-INSTANCE) ;;; CLOSURE (%ALLOC-CLOSURE) -;;; INSTANCE (%MAKE-INSTANCE) +;;; INSTANCE (%MAKE-INSTANCE,%MAKE-INSTANCE/MIXED) ;;; WORDS accounts for the mandatory slots *including* the header. ;;; EXTRA is the variable payload, also measured in words. (define-vop (var-alloc) From 225d5b67f88be3532d7f5e8331232bb81763a8e7 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sun, 10 Apr 2022 10:24:34 -0700 Subject: [PATCH 3095/4023] Remove dependence on FUNCTION-LAMBDA-EXPRESSION for correct behavior We shouldn't depend an introspection function that is able to return NIL for correctness. Rather, use internal functions in the interpreter (the dependence on the compiler is fixed already) which will have stronger guarantees of correctness. --- src/code/describe.lisp | 34 ++++++++++++++++++++++++++++++++++ src/code/target-misc.lisp | 39 --------------------------------------- src/interpreter/env.lisp | 2 +- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/code/describe.lisp b/src/code/describe.lisp index 800b61f2bc..f7709fc5b0 100644 --- a/src/code/describe.lisp +++ b/src/code/describe.lisp @@ -19,6 +19,40 @@ name class))) +;;;; the ANSI interface to function names (and to other stuff too) + +(defun function-lambda-expression (fun) + "Return (VALUES DEFINING-LAMBDA-EXPRESSION CLOSURE-P NAME), where + DEFINING-LAMBDA-EXPRESSION is NIL if unknown, or a suitable argument + to COMPILE otherwise, CLOSURE-P is non-NIL if the function's definition + might have been enclosed in some non-null lexical environment, and + NAME is some name (for debugging only) or NIL if there is no name." + (declare (type function fun)) + (etypecase fun + (interpreted-function + #+sb-eval + (let ((name (sb-eval:interpreted-function-name fun)) + (lambda-list (sb-eval:interpreted-function-lambda-list fun)) + (declarations (sb-eval:interpreted-function-declarations fun)) + (body (sb-eval:interpreted-function-body fun))) + (values `(lambda ,lambda-list + ,@(when declarations `((declare ,@declarations))) + ,@body) + t name)) + #+sb-fasteval + (sb-interpreter:fun-lambda-expression fun)) + (function + (let ((name (%fun-name fun)) + (fun (%fun-fun fun))) + (acond ((%simple-fun-lexpr fun) + (values it t name)) + ((legal-fun-name-p name) + (let ((exp (fun-name-inline-expansion name))) + ;; Isn't this (NOT EXP) wrong if it's a syntactic closure? + (values exp (not exp) name))) + (t + (values nil t name))))))) + ;;; Prints X on a single line, limiting output length by *PRINT-RIGHT-MARGIN* ;;; -- good for printing object parts, etc. (defun prin1-to-line (x &key (columns 1) (reserve 0)) diff --git a/src/code/target-misc.lisp b/src/code/target-misc.lisp index dac906a195..dd2157bb7c 100644 --- a/src/code/target-misc.lisp +++ b/src/code/target-misc.lisp @@ -172,45 +172,6 @@ the file system." (sb-c::note-name-defined name :function) name) - -;;;; the ANSI interface to function names (and to other stuff too) -;;; Note: this function gets called by the interpreter to convert its -;;; representation of an environment to a LEXENV, and so although ANSI -;;; says we're allowed to return NIL here freely, doing so might -;;; prevent correct inlining of interpreted functions defined within -;;; MACROLETs. -(defun function-lambda-expression (fun) - "Return (VALUES DEFINING-LAMBDA-EXPRESSION CLOSURE-P NAME), where - DEFINING-LAMBDA-EXPRESSION is NIL if unknown, or a suitable argument - to COMPILE otherwise, CLOSURE-P is non-NIL if the function's definition - might have been enclosed in some non-null lexical environment, and - NAME is some name (for debugging only) or NIL if there is no name." - (declare (type function fun)) - (etypecase fun - (interpreted-function - #+sb-eval - (let ((name (sb-eval:interpreted-function-name fun)) - (lambda-list (sb-eval:interpreted-function-lambda-list fun)) - (declarations (sb-eval:interpreted-function-declarations fun)) - (body (sb-eval:interpreted-function-body fun))) - (values `(lambda ,lambda-list - ,@(when declarations `((declare ,@declarations))) - ,@body) - t name)) - #+sb-fasteval - (sb-interpreter:fun-lambda-expression fun)) - (function - (let ((name (%fun-name fun)) - (fun (%fun-fun fun))) - (acond ((%simple-fun-lexpr fun) - (values it t name)) - ((legal-fun-name-p name) - (let ((exp (fun-name-inline-expansion name))) - ;; Isn't this (NOT EXP) wrong if it's a syntactic closure? - (values exp (not exp) name))) - (t - (values nil t name))))))) - (in-package "SB-C") (defun split-version-string (string) diff --git a/src/interpreter/env.lisp b/src/interpreter/env.lisp index aa9dc0d033..0d45afa0af 100644 --- a/src/interpreter/env.lisp +++ b/src/interpreter/env.lisp @@ -1129,7 +1129,7 @@ (cons sym (make-global-var :%source-name sym :kind :special :where-from :declared)))) - (macroize (name thing) (list* name 'sb-sys:macro thing (function-lambda-expression thing))) + (macroize (name thing) (list* name 'sb-sys:macro thing (fun-lambda-expression thing))) (symbol-macroize (name thing) (list* name 'sb-sys:macro thing)) (fname (f) (second (fun-name f)))) (multiple-value-bind (vars funs) From 3b742bcd2822b1e7aba9863376cb8458ab249e18 Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 10 Apr 2022 15:04:08 -0400 Subject: [PATCH 3096/4023] Pass structure metadata to FIXED-ALLOC vops The vop might wish to decide on which TLAB to use. (Not just for #+compact-instance-header any more) --- src/compiler/generic/utils.lisp | 11 +++++++---- src/compiler/generic/vm-ir2tran.lisp | 12 ++++++++---- src/compiler/x86-64/alloc.lisp | 15 +++++++-------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 6779e5f29b..7f3ac9eb6a 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -312,10 +312,13 @@ (declare (type (unsigned-byte 8) rank)) (logand (1- rank) array-rank-mask)) -(defun compute-object-header (nwords widetag) - (let ((array-header-p - (or (= widetag simple-array-widetag) - (>= widetag complex-base-string-widetag)))) +(defun compute-object-header (nwords widetag-or-metadata) + (let* ((widetag (if (typep widetag-or-metadata '(or wrapper defstruct-description)) + instance-widetag + widetag-or-metadata)) + (array-header-p + (or (= widetag simple-array-widetag) + (>= widetag complex-base-string-widetag)))) (logior (if array-header-p (let ((rank (- nwords array-dimensions-offset))) (ash (encode-array-rank rank) array-rank-position)) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index fea73ab511..32d1f76224 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -201,13 +201,17 @@ (locs (lvar-result-tns lvar (list *universal-type*))) (result (first locs))) (aver (and (constant-lvar-p dd) (constant-lvar-p slot-specs) (= words 1))) + (aver (= type sb-vm:instance-widetag)) (let* ((c-dd (lvar-value dd)) (c-slot-specs (lvar-value slot-specs)) (words (+ (dd-length c-dd) words))) - #+compact-instance-header - (progn (aver (= type sb-vm:instance-widetag)) - (emit-constant (setq type (sb-kernel::dd-layout-or-lose c-dd)))) - (emit-fixed-alloc node block name words type lowtag result lvar) + (let ((metadata #+compact-instance-header + (let ((layout (sb-kernel::dd-layout-or-lose c-dd))) + (emit-constant layout) + layout) + #-compact-instance-header + c-dd)) + (emit-fixed-alloc node block name words metadata lowtag result lvar)) (emit-inits node block name result lowtag `(#-compact-instance-header (:dd . ,c-dd) ,@c-slot-specs) args) (move-lvar-result node block locs lvar)))) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index e8884ad2c6..40bc4bbce7 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -865,10 +865,10 @@ (inst lea result (ea tramp rip-tn)) (inst mov result tramp))))) -(flet ((alloc (name words type lowtag stack-allocate-p result - &optional alloc-temp node) - (let* ((instancep (typep type 'wrapper)) ; is this an instance type? - (bytes (pad-data-block words))) +(flet + ((alloc (name words type lowtag stack-allocate-p result + &optional alloc-temp node + &aux (bytes (pad-data-block words))) #+bignum-assertions (when (eq type bignum-widetag) (setq bytes (* bytes 2))) ; use 2x the space (progn name) ; possibly not used @@ -880,8 +880,7 @@ (if stack-allocate-p (stack-allocation bytes (if type 0 lowtag) result) (allocation nil bytes (if type 0 lowtag) result node alloc-temp thread-tn)) - (let* ((widetag (if instancep instance-widetag type)) - (header (compute-object-header words widetag))) + (let ((header (compute-object-header words type))) (cond #+compact-instance-header ((and (eq name '%make-structure-instance) stack-allocate-p) ;; Write a :DWORD, not a :QWORD, because the high half will be @@ -894,9 +893,9 @@ ;; GC can make the best choice about placement if it has a layout. ;; Of course with conservative GC the object will be pinned anyway, ;; but still, always having a layout is a good thing. - (when instancep ; store its layout, while still in pseudo-atomic + (when (typep type 'wrapper) ; store its layout, while still in pseudo-atomic (inst mov :dword (ea 4 result) (make-fixup type :layout))) - (inst or :byte result lowtag))))) + (inst or :byte result lowtag)))) ;; DX is strictly redundant in these 2 vops, but they're written this way ;; so that backends can choose to use a single vop for both. (define-vop (fixed-alloc) From 9a5810a532acfd5c5ab9393b4fc4f85d4a2c3d49 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Tue, 22 Mar 2022 15:09:38 +0000 Subject: [PATCH 3097/4023] Fix non-portable loop construct In portable code, termination tests must go after (and are tested after) variable initializations or steps. The intent here is, I think, to terminate the loop without further reading once the index has reached the length (i.e. without reading off the end), but strictly that was not what the code did. Rewrite to a more portable form. This makes src/code/target-char.lisp and src/code/string.lisp compile bitwise-identically under CLISP and SBCL cross-compilation hosts. --- src/code/target-char.lisp | 58 +++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/src/code/target-char.lisp b/src/code/target-char.lisp index 5f56948dee..96b2c24294 100644 --- a/src/code/target-char.lisp +++ b/src/code/target-char.lisp @@ -143,36 +143,34 @@ (t (dotimes (i len) (push (read-codepoint) ret)) - (nreverse ret)))))) - (loop until (>= index length) - for key = (read-codepoint) - for upper = (read-length-tagged) - for lower = (read-length-tagged) - for page = (aref %*character-case-pages*% (ash key -6)) - for i = (+ (ash page 6) (ldb (byte 6 0) key)) - do - (setf (aref unicode-table i) - (if (or (consp upper) - (consp lower)) - (cons upper lower) - (dpb upper (byte 21 21) lower))) - when - (flet (#+sb-unicode - (both-case-p-local (code) - (logbitp 7 (aref misc-database - (+ 5 (misc-index-from-char-code - code high-pages low-pages)))))) - (and (atom upper) - (atom lower) - ;; Some characters are only equal under unicode rules, - ;; e.g. #\MICRO_SIGN and #\GREEK_CAPITAL_LETTER_MU - #+sb-unicode - (both-case-p-local lower) - #+sb-unicode - (both-case-p-local upper))) - do - (setf (aref table (* i 2)) lower - (aref table (1+ (* i 2))) upper))) + (nreverse ret))))) + #+sb-unicode + (both-case-p-local (code) + (logbitp 7 (aref misc-database + (+ 5 (misc-index-from-char-code + code high-pages low-pages)))))) + (loop + until (>= index length) + do (let* ((key (read-codepoint)) + (upper (read-length-tagged)) + (lower (read-length-tagged)) + (page (aref %*character-case-pages*% (ash key -6))) + (i (+ (ash page 6) (ldb (byte 6 0) key)))) + (setf (aref unicode-table i) + (if (or (consp upper) + (consp lower)) + (cons upper lower) + (dpb upper (byte 21 21) lower))) + (when (and (atom upper) + (atom lower) + ;; Some characters are only equal under unicode rules, + ;; e.g. #\MICRO_SIGN and #\GREEK_CAPITAL_LETTER_MU + #+sb-unicode + (both-case-p-local lower) + #+sb-unicode + (both-case-p-local upper)) + (setf (aref table (* i 2)) lower + (aref table (1+ (* i 2))) upper))))) `((defconstant-eqx +character-unicode-cases+ ,unicode-table #'equalp) (defconstant-eqx +character-cases+ ,table #'equalp))) From 24538741adff4243ea2fc86649f1ab03fa757bb0 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 24 Mar 2022 11:09:30 +0000 Subject: [PATCH 3098/4023] Fix instances of loop repeat .. for .. pattern Strictly speaking the variable clauses introduced by `for` must precede the main clause introduced by `repeat`. By placing the repeat after the for, the semantics of the loop are changed observably in the presence of a `finally` clause, which will see the effect of one extra step of the iteration variable (and, if the step has side-effects, those side-effects happen one more time). --- contrib/sb-concurrency/tests/test-mailbox.lisp | 4 ++-- src/assembly/x86-64/tramps.lisp | 4 ++-- src/code/arm64-vm.lisp | 4 ++-- src/code/target-error.lisp | 3 ++- src/code/win32-foreign-load.lisp | 4 ++-- src/compiler/mips/c-call.lisp | 3 ++- src/compiler/ppc/c-call.lisp | 2 +- src/compiler/ppc64/c-call.lisp | 2 +- src/pcl/call-next-method.lisp | 4 ++-- tests/avltree.pure.lisp | 2 +- tests/bad-code.pure.lisp | 4 ++-- tests/compiler.pure.lisp | 4 ++-- tests/filesys.pure.lisp | 8 ++++---- tests/info.impure.lisp | 4 ++-- tests/lockfree-list.impure.lisp | 2 +- tests/loop.pure.lisp | 2 +- tests/print.impure.lisp | 16 ++++++++-------- tools-for-build/wxs.lisp | 7 +++---- 18 files changed, 40 insertions(+), 39 deletions(-) diff --git a/contrib/sb-concurrency/tests/test-mailbox.lisp b/contrib/sb-concurrency/tests/test-mailbox.lisp index 14a9dadefb..7bebd48675 100644 --- a/contrib/sb-concurrency/tests/test-mailbox.lisp +++ b/contrib/sb-concurrency/tests/test-mailbox.lisp @@ -215,8 +215,8 @@ ;; receivers (or only senders) are shot ;; dead, there's still one that survives to ;; properly end the test. - (loop repeat 99 - for victim = (nth (random n) threads) + (loop for victim = (nth (random n) threads) + repeat 99 do (kill-thread victim) (sleep (random 0.0001))))) (values diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index 31e8eb7cf8..2ba323974e 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -28,8 +28,8 @@ (inst mov rax-tn 7) (zeroize rdx-tn) ;; Zero the header - (loop repeat 8 - for i from (+ 512 24) by 8 + (loop for i from (+ 512 24) by 8 + repeat 8 do (inst mov (ea i rsp-tn) rdx-tn)) (inst xsave (ea 24 rsp-tn)) diff --git a/src/code/arm64-vm.lisp b/src/code/arm64-vm.lisp index 3578613022..e46241d12c 100644 --- a/src/code/arm64-vm.lisp +++ b/src/code/arm64-vm.lisp @@ -82,8 +82,8 @@ (zerop length)) (decf length)) (setf pc (sap+ pc 4)) - (let ((args (loop repeat length - with index = 0 + (let ((args (loop with index = 0 + repeat length collect (sb-c:sap-read-var-integerf pc index)))) (values error-number (if (= first-offset zr-offset) diff --git a/src/code/target-error.lisp b/src/code/target-error.lisp index de76300a69..93ba86a826 100644 --- a/src/code/target-error.lisp +++ b/src/code/target-error.lisp @@ -26,7 +26,8 @@ (let ((length (error-length error-number))) (declare (type (unsigned-byte 8) length)) (values error-number - (loop repeat length with index = 0 + (loop with index = 0 + repeat length collect (sb-c:sap-read-var-integerf sap index)) trap-number)))) diff --git a/src/code/win32-foreign-load.lisp b/src/code/win32-foreign-load.lisp index 690fd15904..08332cfa6e 100644 --- a/src/code/win32-foreign-load.lisp +++ b/src/code/win32-foreign-load.lisp @@ -106,8 +106,8 @@ (n-names (sap-ref-32 export-data 24)) (functions-sap (sap+ image-base (sap-ref-32 export-data 28))) (names-sap (sap+ image-base (sap-ref-32 export-data 32)))) - (loop repeat (min n-functions n-names) - for offset from 0 by #.sb-vm::n-word-bytes + (loop for offset from 0 by #.sb-vm::n-word-bytes + repeat (min n-functions n-names) collect (cons (sap-int (sap+ image-base (sap-ref-32 functions-sap offset))) diff --git a/src/compiler/mips/c-call.lisp b/src/compiler/mips/c-call.lisp index d5ce148ab4..28815bfe5f 100644 --- a/src/compiler/mips/c-call.lisp +++ b/src/compiler/mips/c-call.lisp @@ -361,8 +361,9 @@ and a pointer to the arguments." (incf words-processed) (incf offset n-word-bytes)) (when gprs - (loop repeat words + (loop for gpr = (pop gprs) + repeat words when gpr do (inst sw gpr nsp-tn offset) do diff --git a/src/compiler/ppc/c-call.lisp b/src/compiler/ppc/c-call.lisp index 521953564f..464ce441e0 100644 --- a/src/compiler/ppc/c-call.lisp +++ b/src/compiler/ppc/c-call.lisp @@ -536,10 +536,10 @@ ) (t (loop with gprs = (mapcar #'make-gpr '(3 4)) - repeat n-return-area-words for gpr = (pop gprs) for offset from (- return-area-pos) by n-word-bytes + repeat n-return-area-words do (unless gpr (bug "Out of return registers in alien-callback trampoline.")) diff --git a/src/compiler/ppc64/c-call.lisp b/src/compiler/ppc64/c-call.lisp index 99ca5833c3..a16143a823 100644 --- a/src/compiler/ppc64/c-call.lisp +++ b/src/compiler/ppc64/c-call.lisp @@ -447,10 +447,10 @@ ) (t (loop with gprs = (mapcar #'make-gpr '(3 4)) - repeat n-return-area-words for gpr = (pop gprs) for offset from (- return-area-pos) by n-word-bytes + repeat n-return-area-words do (unless gpr (bug "Out of return registers in alien-callback trampoline.")) diff --git a/src/pcl/call-next-method.lisp b/src/pcl/call-next-method.lisp index c01abeaf85..41e336a564 100644 --- a/src/pcl/call-next-method.lisp +++ b/src/pcl/call-next-method.lisp @@ -127,9 +127,9 @@ (declare (dynamic-extent args)) ;; Construct the concatenation of the required arguments in ;; ORIG-ARGS and CNM-ARGS in ARGS. - (loop repeat nreq - for rest1 on args + (loop for rest1 on args for arg in orig-args + repeat nreq do (setf (car rest1) arg) finally (loop for rest2 on (rest rest1) for arg in cnm-args diff --git a/tests/avltree.pure.lisp b/tests/avltree.pure.lisp index d75d81f143..04e68cacb1 100644 --- a/tests/avltree.pure.lisp +++ b/tests/avltree.pure.lisp @@ -52,7 +52,7 @@ node [shape=record];~%") (let (tree (prev-op :delete)) (setf (fill-pointer keys) 0) (loop - repeat n-ops for event from 0 do + for event from 0 repeat n-ops do (assert (= (avl-count tree) (length keys))) (let ((op (if (< (random 10) 5) diff --git a/tests/bad-code.pure.lisp b/tests/bad-code.pure.lisp index 36676cdb66..a003f5a515 100644 --- a/tests/bad-code.pure.lisp +++ b/tests/bad-code.pure.lisp @@ -270,8 +270,8 @@ (macrolet ((macro () `((lambda (x) (declare (number x)) - ',@ (loop repeat 10000 - for cons = (list 1) then (list cons) + ',@ (loop for cons = (list 1) then (list cons) + repeat 10000 finally (return cons))) t))) (macro))) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index 06a2a4844c..fcfdf27250 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -3877,8 +3877,8 @@ (let* ((start (get-internal-run-time)) (iterations 0) (fun (if times - (loop repeat times - for result = (checked-compile lambda) + (loop for result = (checked-compile lambda) + repeat times finally (return result)) (loop for result = (checked-compile lambda) do (incf iterations) diff --git a/tests/filesys.pure.lisp b/tests/filesys.pure.lisp index 4e15b5f85d..ee7f8d8fc0 100644 --- a/tests/filesys.pure.lisp +++ b/tests/filesys.pure.lisp @@ -230,8 +230,7 @@ (if p (canon (concatenate 'string (subseq s 0 p) (subseq s (1+ p)))) s)))) - (loop repeat 1000 - for length = (random 32) + (loop for length = (random 32) for native-namestring = (coerce (loop repeat length collect @@ -240,11 +239,11 @@ 'simple-base-string) for pathname = (native-pathname native-namestring) for nnn = (native-namestring pathname) + repeat 1000 do (setf native-namestring (canon native-namestring)) (unless (string= nnn native-namestring) (error "1: wanted ~S, got ~S" native-namestring nnn))) - (loop repeat 1000 - for native-namestring = (with-output-to-string (s) + (loop for native-namestring = (with-output-to-string (s) (write-string "mu" s) (loop (let ((r (random 1.0))) @@ -262,6 +261,7 @@ s)))))) for pathname = (native-pathname native-namestring) for tricky-nnn = (native-namestring pathname) + repeat 1000 do (setf native-namestring (canon native-namestring)) (unless (string= tricky-nnn native-namestring) (error "2: wanted ~S, got ~S" native-namestring tricky-nnn)))))) diff --git a/tests/info.impure.lisp b/tests/info.impure.lisp index 6243b04b44..533d5e4d16 100644 --- a/tests/info.impure.lisp +++ b/tests/info.impure.lisp @@ -598,8 +598,8 @@ for val = (info :variable :macro-expansion name) do (assert (eql (or val 0) count)))))) ;; Try it when names are symbols or "simple" 2-list names - (run (coerce (loop repeat 50 - for sym = (gensym) + (run (coerce (loop for sym = (gensym) + repeat 50 nconc (list `(setf ,sym) sym)) 'vector)) ;; For hairy names, the tricky piece is in the rehash algorithm, diff --git a/tests/lockfree-list.impure.lisp b/tests/lockfree-list.impure.lisp index d3998303f6..1c2abc6748 100644 --- a/tests/lockfree-list.impure.lisp +++ b/tests/lockfree-list.impure.lisp @@ -245,7 +245,7 @@ (defparameter *l* nil) (defun construct (n) (setq *l* (make-ordered-list :key-type 'fixnum)) - (loop repeat n for key from 10 by 10 do (lfl-insert *l* key (make-foo :a key)))) + (loop for key from 10 by 10 repeat n do (lfl-insert *l* key (make-foo :a key)))) (defun scan-lfl-gens (deletep &aux page-indices) (do ((node (get-next (list-head *l*)) ; can't delete the dummy node (list head) diff --git a/tests/loop.pure.lisp b/tests/loop.pure.lisp index 7f3e8bcc5a..16ecf849ac 100644 --- a/tests/loop.pure.lisp +++ b/tests/loop.pure.lisp @@ -428,7 +428,7 @@ (assert-no-signal (compile nil '(lambda () (declare (optimize speed)) - (loop repeat (+ 1 5) for baz = 'this then 'that + (loop for baz = 'this then 'that repeat (+ 1 5) do (print baz)))))) (with-test (:name :loop-default-init-type) diff --git a/tests/print.impure.lisp b/tests/print.impure.lisp index 215a01d40f..ae6e159dc8 100644 --- a/tests/print.impure.lisp +++ b/tests/print.impure.lisp @@ -601,15 +601,15 @@ (oops)) (loop for f = most-positive-single-float then (/ f 2.0) while (> f 0.0) - do (loop repeat 10 - for fr = (random f) + do (loop for fr = (random f) + repeat 10 do (unless (eql fr (read-from-string (prin1-to-string fr))) (push fr oops) (return)))) (loop for f = most-negative-single-float then (/ f 2.0) while (< f -0.0) - do (loop repeat 10 - for fr = (- (random (- f))) + do (loop for fr = (- (random (- f))) + repeat 10 do (unless (eql fr (read-from-string (prin1-to-string fr))) (push fr oops) (return)))) @@ -625,16 +625,16 @@ ;; FIXME skipping denormalized floats due to bug 793774. (loop for f = most-positive-double-float then (/ f 2d0) while (> f 0d0) - do (loop repeat 10 - for fr = (random f) + do (loop for fr = (random f) + repeat 10 do (unless (float-denormalized-p fr) (unless (eql fr (read-from-string (prin1-to-string fr))) (push fr oops) (return))))) (loop for f = most-negative-double-float then (/ f 2d0) while (< f -0d0) - do (loop repeat 10 - for fr = (- (random (- f))) + do (loop for fr = (- (random (- f))) + repeat 10 do (unless (float-denormalized-p fr) (unless (eql fr (read-from-string (prin1-to-string fr))) (push fr oops) diff --git a/tools-for-build/wxs.lisp b/tools-for-build/wxs.lisp index 904a0b17b0..af2a5840a0 100644 --- a/tools-for-build/wxs.lisp +++ b/tools-for-build/wxs.lisp @@ -59,11 +59,10 @@ "Turns something like 0.pre7.14.flaky4.13 (see version.lisp-expr) into an acceptable form for WIX (up to four dot-separated numbers)." (with-output-to-string (output) - (loop repeat 4 - with position = 0 + (loop with position = 0 for separator = "" then "." - for next-digit = (position-if #'digit-char-p horrible-thing - :start position) + for next-digit = (position-if #'digit-char-p horrible-thing :start position) + repeat 4 while next-digit do (multiple-value-bind (number end) (parse-integer horrible-thing :start next-digit :junk-allowed t) From b831e0d9ac19dc7f23ad205d1432b5ad60fe7710 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 24 Mar 2022 11:24:23 +0000 Subject: [PATCH 3099/4023] Fix instances of loop while ... for = (pop ...) This idiom is used for a loop on a list where inspection or other action needs to be taken on the list during the rest of each iteration. It is straightforwardly reordered by using CAR rather than POP in the variable clause, and performing POP in the body. --- contrib/sb-sprof/graph.lisp | 15 ++++++----- src/code/ntrace.lisp | 5 ++-- tests/run-tests.lisp | 52 ++++++++++++++++++------------------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/contrib/sb-sprof/graph.lisp b/contrib/sb-sprof/graph.lisp index e5e1c4a873..db8f4afa55 100644 --- a/contrib/sb-sprof/graph.lisp +++ b/contrib/sb-sprof/graph.lisp @@ -86,13 +86,14 @@ (unless (in-component w) (setf (vertex-root v) (min-root v w)))) (if (eq v (vertex-root v)) - (loop while (and stack (vertex-> (car stack) v)) - as w = (pop stack) - collect w into this-component - do (setf (in-component w) t) - finally - (setf (in-component v) t) - (push (cons v this-component) components)) + (loop for w = (car stack) + while (and stack (vertex-> (car stack) v)) + do (pop stack) + collect w into this-component + do (setf (in-component w) t) + finally + (setf (in-component v) t) + (push (cons v this-component) components)) (push v stack)))) (map-vertices #'visit vertices) components))) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index c0f4d504f5..c038179084 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -621,8 +621,9 @@ the N-th value returned by the function." functions when called with no arguments." (if specs `(progn - ,@(loop while specs - for name = (pop specs) + ,@(loop for name = (car specs) + while specs + do (pop specs) collect (cond ((eq name :function) `(untrace-1 ,(pop specs))) ((stringp name) diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index 6196186161..0f3641439a 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -25,30 +25,32 @@ (defun run-all (&aux (start-time (get-internal-real-time))) (loop :with remainder = (rest *posix-argv*) - :while remainder - :for arg = (pop remainder) - :do (cond - ((string= arg "--evaluator-mode") - (let ((mode (pop remainder))) - (cond - ((string= mode "interpret") - (setf *test-evaluator-mode* :interpret)) - ((string= mode "compile") - (setf *test-evaluator-mode* :compile)) - (t - (error "~@" - mode))))) - ((string= arg "--break-on-failure") - (setf *break-on-error* t) - (setf test-util:*break-on-failure* t)) - ((string= arg "--break-on-expected-failure") - (setf test-util:*break-on-expected-failure* t)) - ((string= arg "--report-skipped-tests") - (setf *report-skipped-tests* t)) - ((string= arg "--no-color")) - (t - (push (merge-pathnames (parse-namestring arg)) *explicit-test-files*)))) + mode))))) + ((string= arg "--break-on-failure") + (setf *break-on-error* t) + (setf test-util:*break-on-failure* t)) + ((string= arg "--break-on-expected-failure") + (setf test-util:*break-on-expected-failure* t)) + ((string= arg "--report-skipped-tests") + (setf *report-skipped-tests* t)) + ((string= arg "--no-color")) + (t + (push (merge-pathnames (parse-namestring arg)) *explicit-test-files*)))) (setf *explicit-test-files* (nreverse *explicit-test-files*)) (with-open-file (log "test.log" :direction :output :if-exists :supersede @@ -60,9 +62,7 @@ #-win32 (impure-runner (sh-files) 'sh-test log) (log-file-elapsed-time "GRAND TOTAL" start-time log)) (report) - (sb-ext:exit :code (if (unexpected-failures) - 1 - 104))) + (sb-ext:exit :code (if (unexpected-failures) 1 104))) (defun report () (terpri) From 15f98f91a3c9e484c99aee198323dcb5d165f9c4 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 24 Mar 2022 13:28:02 +0000 Subject: [PATCH 3100/4023] Rewrite a non-portable loop construct The contortion here was to perform an iteration over the list designator, without consing a list in the case that the designator was an atom. That's laudable, but in the context of the disassembler I can't convince myself that it's worth avoiding the double-word of consing, so rewrite it to use ENSURE-LIST and a straightforward iteration. --- src/compiler/target-disassem.lisp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index ebe012a896..78f3b065f5 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -733,15 +733,13 @@ (lambda (chunk inst) (declare (type dchunk chunk) (type instruction inst)) (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (loop with list = (inst-labeller inst) - while list - ;; item = #(FUNCTION PREFILTERED-VALUE-INDEX) - ;; | #(FUNCTION SIGN-EXTEND-P BYTE-SPEC ...) - for item = (if (listp list) (pop list) (prog1 list (setq list nil))) - then (pop list) - do (let* ((item-length (length item)) - (index/signedp (svref item 1)) - (adjusted-value + (loop + ;; item = #(FUNCTION PREFILTERED-VALUE-INDEX) + ;; | #(FUNCTION SIGN-EXTEND-P BYTE-SPEC ...) + for item in (ensure-list (inst-labeller inst)) + do (let* ((item-length (length item)) + (index/signedp (svref item 1)) + (adjusted-value (funcall (svref item 0) (flet ((extract-byte (spec-index) @@ -753,7 +751,7 @@ (case item-length (2 (svref (dstate-filtered-values dstate) index/signedp)) (3 (extract-byte 2)) ; extract exactly one byte - (t ; extract >1 byte. + (t ; extract >1 byte. ;; FIXME: this is strictly redundant. ;; You should combine fields in the prefilter ;; so that the labeller receives a single byte. @@ -761,10 +759,10 @@ (loop for i from 2 below item-length collect (extract-byte i))))) dstate))) - ;; If non-integer, the value is not a label. - (when (and (integerp adjusted-value) - (not (assoc adjusted-value labels))) - (push (cons adjusted-value nil) labels))))) + ;; If non-integer, the value is not a label. + (when (and (integerp adjusted-value) + (not (assoc adjusted-value labels))) + (push (cons adjusted-value nil) labels))))) segment dstate) ;; erase any notes that got there by accident From 7a7d607fcdd08e202c74319dff692099a387f809 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 24 Mar 2022 13:30:38 +0000 Subject: [PATCH 3101/4023] Move a termination test The test can be done at the end of the loop body, rather than half-way through the iteration variable steps. (This is safe because this loop is guarded by a (plusp index) condition, so there will definitely be at least one iteration.) --- contrib/sb-sprof/record.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/sb-sprof/record.lisp b/contrib/sb-sprof/record.lisp index bfc6d453e9..86524373d7 100644 --- a/contrib/sb-sprof/record.lisp +++ b/contrib/sb-sprof/record.lisp @@ -56,11 +56,11 @@ EXPERIMENTAL: Interface subject to change." (when (plusp index) (sb-int:aver (typep (aref vector 0) '(cons (eql trace-start) index))) (loop for start = 0 then end - while (< start index) for end = (cdr (aref vector start)) for thread = (aref vector (+ start 1)) do (let ((trace (list vector start end))) - (funcall function thread trace)))))) + (funcall function thread trace)) + while (< end index))))) ;;; Call FUNCTION on each PC location in TRACE. ;;; The signature of FUNCTION must be compatible with (info pc-or-offset). From 0051d2c5e74a42b48ec6f62539a43766b4e16ee6 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 24 Mar 2022 13:32:17 +0000 Subject: [PATCH 3102/4023] Rewrite loop while .. for = .. do Since the termination condition does not refer to the iteration variable, it's safe to replace the variable stepping with a fresh binding on each iteration. --- src/code/debug-int.lisp | 83 +++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index bd58aa3db8..46dadb7fd8 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -1709,47 +1709,48 @@ register." :deleted (compact-vector-ref vars index-or-deleted)))) (loop - :while (< i len) - :for ele = (compact-vector-ref args i) :do - (cond - ((eq ele sb-c::debug-info-var-optional) - (setf optionalp t)) - ((eq ele sb-c::debug-info-var-rest) - (push-var '(:rest) 1)) - ;; The next two args are the &MORE arg context and - ;; count. - ((eq ele sb-c::debug-info-var-more) - (push-var '(:more) 2)) - ;; SUPPLIED-P var immediately following keyword or - ;; optional. Stick the extra var in the result element - ;; representing the keyword or optional, which is the - ;; previous one. - ((eq ele sb-c::debug-info-var-supplied-p) - (push-var (pop result) 1)) - ;; The keyword of a keyword parameter. Store it so the next - ;; element can be used to form a (:keyword KEYWORD VALUE) - ;; entry. - ((typep ele 'symbol) - (setf keyword ele)) - ;; The previous element was the keyword of a keyword - ;; parameter and is stored in KEYWORD. The current element - ;; is the index of the value (or a deleted - ;; marker). Construct and push the complete entry. - (keyword - (push-var (list :keyword keyword (var-or-deleted ele)))) - ;; We saw an optional marker, so the following non-symbols - ;; are indexes (or deleted markers) indicating optional - ;; variables. - (optionalp - (push-var (list :optional (var-or-deleted ele)))) - ;; Deleted required, optional or keyword argument. - ((eq ele sb-c::debug-info-var-deleted) - (push-var :deleted)) - ;; Required arg at beginning of args array. - (t - (push-var (compact-vector-ref vars ele)))) - (incf i) - :finally (return (nreverse result)))))) + while (< i len) + do + (let ((ele (compact-vector-ref args i))) + (cond + ((eq ele sb-c::debug-info-var-optional) + (setf optionalp t)) + ((eq ele sb-c::debug-info-var-rest) + (push-var '(:rest) 1)) + ;; The next two args are the &MORE arg context and + ;; count. + ((eq ele sb-c::debug-info-var-more) + (push-var '(:more) 2)) + ;; SUPPLIED-P var immediately following keyword or + ;; optional. Stick the extra var in the result element + ;; representing the keyword or optional, which is the + ;; previous one. + ((eq ele sb-c::debug-info-var-supplied-p) + (push-var (pop result) 1)) + ;; The keyword of a keyword parameter. Store it so the next + ;; element can be used to form a (:keyword KEYWORD VALUE) + ;; entry. + ((typep ele 'symbol) + (setf keyword ele)) + ;; The previous element was the keyword of a keyword + ;; parameter and is stored in KEYWORD. The current element + ;; is the index of the value (or a deleted + ;; marker). Construct and push the complete entry. + (keyword + (push-var (list :keyword keyword (var-or-deleted ele)))) + ;; We saw an optional marker, so the following non-symbols + ;; are indexes (or deleted markers) indicating optional + ;; variables. + (optionalp + (push-var (list :optional (var-or-deleted ele)))) + ;; Deleted required, optional or keyword argument. + ((eq ele sb-c::debug-info-var-deleted) + (push-var :deleted)) + ;; Required arg at beginning of args array. + (t + (push-var (compact-vector-ref vars ele)))) + (incf i)) + finally (return (nreverse result)))))) ;;; This is used in COMPILED-DEBUG-FUN-LAMBDA-LIST. (defun compiled-debug-fun-lambda-list-var (args i vars) From 2dae4ebc92e36669b284d19b309b42aeeca70bdc Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 24 Mar 2022 13:34:00 +0000 Subject: [PATCH 3103/4023] ANSIfy loops in s-%write-sequence As the comments observe, the interleaving of termination and iteration was non-portable. Rewrite to be portable, performing bindings and explicit updates to variables as appropriate. --- contrib/sb-simple-streams/impl.lisp | 46 ++++++++++++++++------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/contrib/sb-simple-streams/impl.lisp b/contrib/sb-simple-streams/impl.lisp index 65fc4949f4..e8905c0804 100644 --- a/contrib/sb-simple-streams/impl.lisp +++ b/contrib/sb-simple-streams/impl.lisp @@ -526,32 +526,36 @@ (single-channel-simple-stream (with-stream-class (single-channel-simple-stream stream) (loop with max-ptr fixnum = (sm buf-len stream) - for src-pos fixnum = start then (+ src-pos count) + with src-pos fixnum = start for src-rest fixnum = (- end src-pos) - while (> src-rest 0) ; FIXME: this is non-ANSI - for ptr fixnum = (let ((ptr (sm buffpos stream))) - (if (>= ptr max-ptr) - (flush-buffer stream t) - ptr)) - for buf-rest fixnum = (- max-ptr ptr) - for count fixnum = (min buf-rest src-rest) - do (progn (setf (sm mode stream) 1) - (setf (sm buffpos stream) (+ ptr count)) - (buffer-copy seq src-pos (sm buffer stream) ptr count))))) + while (> src-rest 0) + do (let* ((ptr (let ((ptr (sm buffpos stream))) + (if (>= ptr max-ptr) + (flush-buffer stream t) + ptr))) + (buf-rest (- max-ptr ptr)) + (count (min buf-rest src-rest))) + (declare (type fixnum ptr buf-rest count)) + (setf (sm mode stream) 1) + (setf (sm buffpos stream) (+ ptr count)) + (buffer-copy seq src-pos (sm buffer stream) ptr count) + (incf src-pos count))))) (dual-channel-simple-stream (with-stream-class (dual-channel-simple-stream stream) (loop with max-ptr fixnum = (sm max-out-pos stream) - for src-pos fixnum = start then (+ src-pos count) + with src-pos fixnum = start for src-rest fixnum = (- end src-pos) - while (> src-rest 0) ; FIXME: this is non-ANSI - for ptr fixnum = (let ((ptr (sm outpos stream))) - (if (>= ptr max-ptr) - (flush-out-buffer stream t) - ptr)) - for buf-rest fixnum = (- max-ptr ptr) - for count fixnum = (min buf-rest src-rest) - do (progn (setf (sm outpos stream) (+ ptr count)) - (buffer-copy seq src-pos (sm out-buffer stream) ptr count))))) + while (> src-rest 0) + do (let* ((ptr (let ((ptr (sm outpos stream))) + (if (>= ptr max-ptr) + (flush-out-buffer stream t) + ptr))) + (buf-rest (- max-ptr ptr)) + (count (min buf-rest src-rest))) + (declare (type fixnum ptr buf-rest count)) + (setf (sm outpos stream) (+ ptr count)) + (buffer-copy seq src-pos (sm out-buffer stream) ptr count) + (incf src-pos count))))) (string-simple-stream (error 'simple-type-error :datum stream From de354a441a83925ee08d1d995cc3ec1826f01bfd Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 24 Mar 2022 15:25:16 +0000 Subject: [PATCH 3104/4023] Rewrite another non-ANSI loop Make the order of tests and sets explicit. --- src/code/target-thread.lisp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index b1efb33cb5..973fefed9a 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -974,15 +974,16 @@ IF-NOT-OWNER is :FORCE)." nil) (defun %waitqueue-wakeup (queue n) (declare (fixnum n)) - (loop while (plusp n) - for next = (let ((head (waitqueue-%head queue)) - (tail (waitqueue-%tail queue))) - (when head - (if (eq head tail) - (setf (waitqueue-%head queue) nil - (waitqueue-%tail queue) nil) - (setf (waitqueue-%head queue) (cdr head))) - (car head))) + (loop with next = nil + while (plusp n) + do (setq next (let ((head (waitqueue-%head queue)) + (tail (waitqueue-%tail queue))) + (when head + (if (eq head tail) + (setf (waitqueue-%head queue) nil + (waitqueue-%tail queue) nil) + (setf (waitqueue-%head queue) (cdr head))) + (car head)))) while next do (when (eq queue (sb-ext:compare-and-swap (thread-waiting-for next) queue nil)) From 4c95f9edcfd9b126af392ad4128b1c48d492afdd Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sun, 10 Apr 2022 15:24:35 -0700 Subject: [PATCH 3105/4023] Don't save the whole lexical environment in inline expansions. Just what's needed from declarations and stuff. Do this by using the code-walker. We could probably avoid making the syntactic closure for this case as well by just stuffing the declarations somewhere in the body. This can be done if we really want to get rid of syntactic closures entirely. --- NEWS | 3 + contrib/sb-cltl2/defpackage.lisp | 1 + contrib/sb-cltl2/env.lisp | 2 +- contrib/sb-cltl2/macroexpand.lisp | 98 ------------------------ contrib/sb-cltl2/sb-cltl2.asd | 1 - src/code/defmacro.lisp | 2 +- src/cold/build-order.lisp-expr | 2 +- src/cold/exports.lisp | 1 + src/compiler/ir1-translators.lisp | 23 +++--- src/compiler/ir1tran-lambda.lisp | 70 ++++++++--------- src/compiler/ir1tran.lisp | 2 +- src/compiler/node.lisp | 8 +- src/interpreter/env.lisp | 5 +- src/pcl/walk.lisp | 122 ++++++++++++++++++++++++++---- 14 files changed, 171 insertions(+), 169 deletions(-) delete mode 100644 contrib/sb-cltl2/macroexpand.lisp diff --git a/NEWS b/NEWS index 87945bcfea..9dd3d4f82f 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,9 @@ changes relative to sbcl-2.2.3: or (LAMBDA (X) (ETYPECASE (INTEGER ...) (SYMBOL ...)) X) instead of forgetting all information about X after the E(TYPE)CASE. + * optimization: inlined functions enclosed in local macro definitions no + longer save their entire lexical environment, reducing unnecessary + memory retention. changes in sbcl-2.2.3 relative to sbcl-2.2.2: * minor incompatible change: SB-THREAD:MUTEX-OWNER may return :THREAD-DEAD diff --git a/contrib/sb-cltl2/defpackage.lisp b/contrib/sb-cltl2/defpackage.lisp index 765e79472c..baac62c98b 100644 --- a/contrib/sb-cltl2/defpackage.lisp +++ b/contrib/sb-cltl2/defpackage.lisp @@ -1,5 +1,6 @@ (defpackage :sb-cltl2 (:use :cl :sb-c :sb-int :sb-kernel) + (:import-from #:sb-walker #:macroexpand-all) (:export #:compiler-let #:macroexpand-all ;; environment access diff --git a/contrib/sb-cltl2/env.lisp b/contrib/sb-cltl2/env.lisp index c8788349c8..4d922174a7 100644 --- a/contrib/sb-cltl2/env.lisp +++ b/contrib/sb-cltl2/env.lisp @@ -65,7 +65,7 @@ (setf (sb-c::lexenv-funs env) (nconc (loop for (name def) in macro - collect (cons name (list* 'sb-sys::macro def (function-lambda-expression def)))) + collect (cons name (cons 'sb-sys::macro def))) (sb-c::lexenv-funs env)))) (when symbol-macro diff --git a/contrib/sb-cltl2/macroexpand.lisp b/contrib/sb-cltl2/macroexpand.lisp deleted file mode 100644 index 466fc88c1a..0000000000 --- a/contrib/sb-cltl2/macroexpand.lisp +++ /dev/null @@ -1,98 +0,0 @@ -(in-package :sb-cltl2) - -(defun macroexpand-all (form &optional environment) - (let ((sb-walker::*walk-form-expand-macros-p* t)) - (sb-walker:walk-form - form environment - (lambda (subform context env) - (acond ((and (eq context :eval) - (listp subform) - (symbolp (car subform)) - (get (car subform) :partial-macroexpander)) - ;; The partial expander must return T as its second value - ;; if it wants to stop the walk. - (funcall it subform env)) - (t - subform)))))) - -;; Given EXPR, the argument to an invocation of Quasiquote macro, macroexpand -;; evaluable subforms of EXPR using ENV. A subform is evaluable if all -;; preceding occurrences of #\` have been "canceled" by a comma. -;; DEPTH counts the nesting and should not be supplied by external callers. -(defun %quasiquoted-macroexpand-all (expr env &optional (depth 0)) - (flet ((quasiquote-p (x) - (and (listp x) (eq (car x) 'quasiquote) (singleton-p (cdr x)))) - (recurse (x) - (%quasiquoted-macroexpand-all x env depth))) - (if (atom expr) - (cond ((simple-vector-p expr) (map 'vector #'recurse expr)) - ((comma-p expr) - (unquote (if (> depth 1) - (%quasiquoted-macroexpand-all - (comma-expr expr) env (1- depth)) - (macroexpand-all (comma-expr expr) env)) - (comma-kind expr))) - (t expr)) - (if (quasiquote-p expr) - (list 'quasiquote - (%quasiquoted-macroexpand-all (second expr) env (1+ depth))) - (let (result) - (loop - (push (recurse (pop expr)) result) - (when (or (atom expr) (quasiquote-p expr)) - (return (nreconc result (recurse expr)))))))))) - -(setf (get 'quasiquote :partial-macroexpander) - (lambda (form env) - (destructuring-bind (arg) (cdr form) ; sanity-check the shape - (declare (ignore arg)) - (values (%quasiquoted-macroexpand-all form env) t)))) - -#| - -;; Another example that some people might find useful. - -(defun macroexpand-decls+forms (body env) ; a bit of a kludge, but it works - (mapcar (lambda (x) - (if (and (listp x) (eq (car x) 'declare)) - x - (macroexpand-all x env))) - body)) - -(setf (get 'dotimes :partial-macroexpander) - (lambda (form env) - (destructuring-bind ((var count &optional (result nil result-p)) - &body body) (cdr form) - (values `(dotimes (,var ,(macroexpand-all count env) - ,@(if result-p - (list (macroexpand-all result env)))) - ,@(macroexpand-decls+forms body env)) - t)))) - -(macroexpand-all '(macrolet ((hair (x) `(car ,x))) - (dotimes (i (bar)) (foo i (hair baz)) l)))) -=> -(MACROLET ((HAIR (X) - `(CAR ,X))) - (DOTIMES (I (BAR)) (FOO I (CAR BAZ)) L)) - -instead of - -(MACROLET ((HAIR (X) - `(CAR ,X))) - (BLOCK NIL - (LET ((I 0) (#:COUNT699 (BAR))) - (DECLARE (TYPE UNSIGNED-BYTE I) - (TYPE INTEGER #:COUNT699)) - (TAGBODY - (GO #:G701) - #:G700 - (TAGBODY (FOO I (CAR BAZ)) L) - (LET* () - (MULTIPLE-VALUE-BIND (#:NEW702) (1+ I) (PROGN (SETQ I #:NEW702) NIL))) - #:G701 - (IF (>= I #:COUNT699) - NIL - (PROGN (GO #:G700))) - (RETURN-FROM NIL (PROGN NIL)))))) -|# diff --git a/contrib/sb-cltl2/sb-cltl2.asd b/contrib/sb-cltl2/sb-cltl2.asd index 2ebbe5e254..ffec6494dd 100644 --- a/contrib/sb-cltl2/sb-cltl2.asd +++ b/contrib/sb-cltl2/sb-cltl2.asd @@ -8,7 +8,6 @@ #+sb-building-contrib #p"SYS:CONTRIB;SB-CLTL2;" :components ((:file "defpackage") (:file "compiler-let" :depends-on ("defpackage")) - (:file "macroexpand" :depends-on ("defpackage")) (:file "env" :depends-on ("defpackage"))) :perform (load-op :after (o c) (provide 'sb-cltl2)) :in-order-to ((test-op (test-op "sb-cltl2/tests")))) diff --git a/src/code/defmacro.lisp b/src/code/defmacro.lisp index c88f94eda9..fedceceb33 100644 --- a/src/code/defmacro.lisp +++ b/src/code/defmacro.lisp @@ -27,7 +27,7 @@ only." (let ((def (cdr (assoc symbol (lexenv-funs env))))) (when def (return-from macro-function - (when (typep def '(cons (eql macro))) (cadr def))))))) + (when (typep def '(cons (eql macro))) (cdr def))))))) (values (info :function :macro-function symbol))) (defun (setf macro-function) (function symbol &optional environment) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index d583054120..42e3cb9759 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -580,7 +580,7 @@ ;;; as PCL gets more integrated into the system, we'd like to ;;; bootstrap things like classes at the same time as the rest of the ;;; type system. - ("src/pcl/walk" :not-host) + ("src/pcl/walk") ("src/pcl/low" :not-host) ("src/pcl/macros" :not-host) ("src/pcl/ecd" :not-host) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index e57fa41b22..1952bf395c 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2809,6 +2809,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") (:use "CL" "SB-INT" "SB-EXT") (:shadow "RECONS") (:export "DEFINE-WALKER-TEMPLATE" + "MACROEXPAND-ALL" "WALK-FORM" "*WALK-FORM-EXPAND-MACROS-P*" "VAR-LEXICAL-P" "VAR-SPECIAL-P" diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 3c2d91f72a..d957760eda 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -324,18 +324,17 @@ Evaluate the FORMS in the specified SITUATIONS (any of :COMPILE-TOPLEVEL, (unless (listp arglist) (fail "The local macro argument list ~S is not a list." arglist)) - (let ((lambda (make-macro-lambda nil arglist body 'macrolet name))) - `(,name macro - ;; I guess the reason we want to compile here rather than possibly - ;; using an interpreted lambda is that we generate the usual gamut - ;; of style-warnings and such. One might wonder if this could somehow - ;; go through the front-most part of the front-end, to deal with - ;; semantics, but then generate an interpreted function or something - ;; more quick to emit than machine code. - ,(compile-in-lexenv lambda lexenv - ;; name source-info tlf ephemeral errorp - nil nil nil t nil) - . ,lambda))))))) + `(,name macro . + ;; I guess the reason we want to compile here rather than possibly + ;; using an interpreted lambda is that we generate the usual gamut + ;; of style-warnings and such. One might wonder if this could somehow + ;; go through the front-most part of the front-end, to deal with + ;; semantics, but then generate an interpreted function or something + ;; more quick to emit than machine code. + ,(compile-in-lexenv + (make-macro-lambda nil arglist body 'macrolet name) + lexenv + nil nil nil t nil))))))) ; name source-info tlf ephemeral errorp (defun funcall-in-macrolet-lexenv (definitions fun context) (%funcall-in-foomacrolet-lexenv diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index fd15af7488..73795a8f43 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -1049,8 +1049,8 @@ (declaim (end-block)) - ;;;; defining global functions + ;;; Given a lambda-list, return a FUN-TYPE object representing the signature: ;;; return type is *, and each individual arguments type is T -- but we get ;;; the argument counts and keywords. @@ -1074,17 +1074,19 @@ (declaim (start-block maybe-inline-syntactic-closure)) -;;; Take the lexenv surrounding an inlined function and extract things -;;; needed for the inline expansion suitable for dumping into fasls. -;;; Right now it's MACROLET, SYMBOL-MACROLET, SPECIAL and -;;; INLINE/NOTINLINE declarations. Upon encountering something else return NIL. -;;; This is later used by PROCESS-INLINE-LEXENV to reproduce the lexenv. +;;; Expand a lambda form in LEXENV, returning the expansion and +;;; extract the other stuff like SPECIAL and INLINE/NOTINLINE +;;; declarations needed for reconstructing the lambda in the remaining +;;; lexical environment. Return this other stuff as a secondary value, +;;; but if the lexical environment still contains things that are too +;;; hairy to handle, return NIL. This is later used by +;;; PROCESS-INLINE-LEXENV to reproduce the lexenv. ;;; ;;; Previously it just used the functions and vars of the innermost ;;; lexenv, but the body of macrolet can refer to other macrolets ;;; defined earlier, so it needs to process all the parent lexenvs to ;;; recover the proper order. -(defun reconstruct-lexenv (lexenv) +(defun expand-in-syntactic-environment (lambda lexenv) (let (shadowed-funs shadowed-vars result) @@ -1093,8 +1095,6 @@ for vars = (lexenv-vars env) for funs = (lexenv-funs env) for declarations = nil - for symbol-macros = nil - for macros = nil do (loop for binding in vars for (name . what) = binding @@ -1103,14 +1103,14 @@ do (typecase what (cons (aver (eq (car what) 'macro)) - (push name shadowed-vars) - (push (list name (cdr what)) symbol-macros)) + (push name shadowed-vars)) (global-var (aver (eq (global-var-kind what) :special)) (push `(special ,name) declarations)) (t (unless (memq name shadowed-vars) - (return-from reconstruct-lexenv))))) + (return-from expand-in-syntactic-environment + (values nil nil)))))) (loop for binding in funs for (name . what) = binding unless (and parent @@ -1118,8 +1118,7 @@ do (typecase what (cons - (push name shadowed-funs) - (push (cons name (cddr what)) macros)) + (push name shadowed-funs)) ;; FIXME: Is there a good reason for this not to be ;; DEFINED-FUN (which :INCLUDEs GLOBAL-VAR, in case ;; you're wondering how this ever worked :-)? Maybe @@ -1128,28 +1127,28 @@ ;; 2002-07-08 (global-var (unless (defined-fun-p what) - (return-from reconstruct-lexenv)) + (return-from expand-in-syntactic-environment + (values nil nil))) (push `(,(car (defined-fun-inlinep what)) ,name) declarations)) (t (unless (memq name shadowed-funs) - (return-from reconstruct-lexenv))))) + (return-from expand-in-syntactic-environment + (values nil nil)))))) (when declarations (setf result (list* :declare declarations (and result (list result))))) - (when symbol-macros - (setf result (list* :symbol-macro symbol-macros (and result (list result))))) - (when macros - (setf result (list* :macro macros (and result (list result))))) while (and parent (not (null-lexenv-p parent)))) - result)) + (values (sb-walker:macroexpand-all lambda lexenv) + result))) -;;; Return a lambda form that has been "closed" with respect ot +;;; Return a lambda form that has been "closed" with respect to ;;; LEXENV, returning a LAMBDA-WITH-LEXENV if there are interesting -;;; macros or declarations, so that reloading the definition from a -;;; compiled file preserves the original lexical environment for -;;; inlining. If there is something too complex in the lexical +;;; declarations. To handle local macros, rather than closing over +;;; definitions in the environment, expand all macros in the body of +;;; LAMBDA, so that nothing in the syntactic environment is needed in +;;; the expansion. If there is something too complex in the lexical ;;; environment (like a lexical variable), then we return NIL. (defun maybe-inline-syntactic-closure (lambda lexenv) (declare (type list lambda) (type lexenv-designator lexenv)) @@ -1158,10 +1157,15 @@ (lexenv (let ((vars (lexenv-vars lexenv)) (funs (lexenv-funs lexenv))) - (acond ((or (lexenv-blocks lexenv) (lexenv-tags lexenv)) nil) - ((and (null vars) (null funs)) lambda) - ((reconstruct-lexenv lexenv) - `(lambda-with-lexenv ,it ,@(cdr lambda)))))) + (cond ((or (lexenv-blocks lexenv) (lexenv-tags lexenv)) nil) + ((and (null vars) (null funs)) lambda) + (t + (multiple-value-bind (expansion remaining-lexenv) + (expand-in-syntactic-environment lambda lexenv) + (when expansion + (if remaining-lexenv + `(lambda-with-lexenv ,remaining-lexenv ,@(cdr expansion)) + expansion))))))) #+(and sb-fasteval (not sb-xc-host)) (sb-interpreter:basic-env (awhen (sb-interpreter::reconstruct-syntactic-closure-env lexenv) @@ -1189,11 +1193,9 @@ (mapcar (lambda (binding) ;; XC compile-in-lexenv ignores its second arg #+sb-xc-host (aver (null-lexenv-p lexenv)) - (destructuring-bind (name . form) binding - (list* name 'macro - (compile-in-lexenv form lexenv - nil nil nil t nil) - form))) + (list* (car binding) 'macro + (compile-in-lexenv (cdr binding) lexenv + nil nil nil t nil))) bindings))) (recurse body (make-lexenv :default lexenv diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index c8b04a3589..b4f784dd15 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -900,7 +900,7 @@ *inline-expansions*) (list* lexical-def 1 *inline-expansions*)))) (ir1-convert start next result - (careful-expand-macro (cadr lexical-def) form))) + (careful-expand-macro (cdr lexical-def) form))) (progn (compiler-warn "Recursion limit reached while expanding local macro ~ ~/sb-ext:print-symbol-with-prefix/" op) diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index 6fce628ec4..ad4c50221a 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -40,10 +40,10 @@ disabled-package-locks %policy user-data parent))) ;; an alist of (NAME . WHAT), where WHAT is either a FUNCTIONAL (a - ;; local function), a DEFINED-FUN, representing an INLINE/NOTINLINE - ;; declaration, or a list (MACRO . ) (a local - ;; macro, with the specifier expander). Note that NAME may be a - ;; (SETF ) list, not necessarily a single symbol. + ;; local function), a DEFINED-FUN, representing an + ;; INLINE/NOTINLINE declaration, or a list (MACRO . ) (a + ;; local macro, with the specifier expander). Note that NAME may be + ;; a (SETF ) list, not necessarily a single symbol. (funs nil :type list) ;; an alist translating variable names to LEAF structures. A special ;; binding is indicated by a :SPECIAL GLOBAL-VAR leaf. Each special diff --git a/src/interpreter/env.lisp b/src/interpreter/env.lisp index 0d45afa0af..415068f419 100644 --- a/src/interpreter/env.lisp +++ b/src/interpreter/env.lisp @@ -1129,8 +1129,7 @@ (cons sym (make-global-var :%source-name sym :kind :special :where-from :declared)))) - (macroize (name thing) (list* name 'sb-sys:macro thing (fun-lambda-expression thing))) - (symbol-macroize (name thing) (list* name 'sb-sys:macro thing)) + (macroize (name thing) (list* name 'sb-sys:macro thing)) (fname (f) (second (fun-name f)))) (multiple-value-bind (vars funs) (typecase env @@ -1147,7 +1146,7 @@ ;; access interpreter's lexical vars ;; Prevent SETF on the variable from getting ;; "Destructive function (SETF SVREF) called on constant data" - (symbol-macroize sym `(svref (load-time-value ,payload) ,i))) + (macroize sym `(svref (load-time-value ,payload) ,i))) (t (let ((leaf (make-lambda-var :%source-name sym diff --git a/src/pcl/walk.lisp b/src/pcl/walk.lisp index 985418914e..602ad6827a 100644 --- a/src/pcl/walk.lisp +++ b/src/pcl/walk.lisp @@ -82,9 +82,9 @@ ;;; variables, blocks, etc. Except for SYMBOL-MACROLET, only the ;;; SB-C::LEXENV-FUNS slot is relevant. It holds: Alist (Name . What), ;;; where What is either a functional (a local function) or a list -;;; (MACRO . ) (a local macro, with the specifier -;;; expander.) Note that Name may be a (SETF ) -;;; function. Accessors are defined below, eg (ENV-WALK-FUNCTION ENV). +;;; (MACRO . ) (a local macro, with the specifier expander.) +;;; Note that Name may be a (SETF ) function. Accessors are +;;; defined below, eg (ENV-WALK-FUNCTION ENV). ;;; ;;; If WITH-AUGMENTED-ENVIRONMENT is called from WALKER-ENVIRONMENT-BIND ;;; this code hides the WALKER version of an environment @@ -101,7 +101,7 @@ ;;; ;;; Instead, we now use a special sort of "function"-type for that ;;; information, because the functions slot in SB-C::LEXENV is -;;; supposed to have a list of . elements. +;;; supposed to have a list of elements. ;;; So, now we hide our bits of interest in the walker-info slot in ;;; our new BOGO-FUN. ;;; @@ -173,13 +173,12 @@ (sb-c::make-functional :lexenv lexenv))) funs) (mapcar (lambda (m) - (destructuring-bind (name form) m - (list* name - 'sb-sys:macro - (if (eq name *key-to-walker-environment*) - (walker-info-to-bogo-fun form) - (coerce form 'function)) - form))) + (list* (car m) + 'sb-sys:macro + (if (eq (car m) + *key-to-walker-environment*) + (walker-info-to-bogo-fun (cadr m)) + (coerce (cadr m) 'function)))) macros))))) (defun environment-function (env fn) @@ -195,8 +194,8 @@ (and entry (eq (cadr entry) 'sb-sys:macro) (if (eq macro *key-to-walker-environment*) - (values (bogo-fun-to-walker-info (caddr entry))) - (values (cadddr entry))))))) + (values (bogo-fun-to-walker-info (cddr entry))) + (values (function-lambda-expression (cddr entry)))))))) ;;;; other environment hacking, not so SBCL-specific as the ;;;; environment hacking in the previous section @@ -472,6 +471,103 @@ (defvar *walk-form-expand-macros-p* nil) (defvar *walk-form-preserve-source* nil) +(defun macroexpand-all (form &optional environment) + (let ((*walk-form-expand-macros-p* t)) + (sb-walker:walk-form + form environment + (lambda (subform context env) + (acond ((and (eq context :eval) + (listp subform) + (symbolp (car subform)) + (get (car subform) :partial-macroexpander)) + ;; The partial expander must return T as its second value + ;; if it wants to stop the walk. + (funcall it subform env)) + (t + subform)))))) + +;; Given EXPR, the argument to an invocation of Quasiquote macro, macroexpand +;; evaluable subforms of EXPR using ENV. A subform is evaluable if all +;; preceding occurrences of #\` have been "canceled" by a comma. +;; DEPTH counts the nesting and should not be supplied by external callers. +(defun %quasiquoted-macroexpand-all (expr env &optional (depth 0)) + (flet ((quasiquote-p (x) + (and (listp x) (eq (car x) 'quasiquote) (singleton-p (cdr x)))) + (recurse (x) + (%quasiquoted-macroexpand-all x env depth))) + (if (atom expr) + (cond ((simple-vector-p expr) (map 'vector #'recurse expr)) + ((comma-p expr) + (unquote (if (> depth 1) + (%quasiquoted-macroexpand-all + (comma-expr expr) env (1- depth)) + (macroexpand-all (comma-expr expr) env)) + (comma-kind expr))) + (t expr)) + (if (quasiquote-p expr) + (list 'quasiquote + (%quasiquoted-macroexpand-all (second expr) env (1+ depth))) + (let (result) + (loop + (push (recurse (pop expr)) result) + (when (or (atom expr) (quasiquote-p expr)) + (return (nreconc result (recurse expr)))))))))) + +(setf (get 'quasiquote :partial-macroexpander) + (lambda (form env) + (destructuring-bind (arg) (cdr form) ; sanity-check the shape + (declare (ignore arg)) + (values (%quasiquoted-macroexpand-all form env) t)))) + +#| + +;; Another example that some people might find useful. + +(defun macroexpand-decls+forms (body env) ; a bit of a kludge, but it works + (mapcar (lambda (x) + (if (and (listp x) (eq (car x) 'declare)) + x + (macroexpand-all x env))) + body)) + +(setf (get 'dotimes :partial-macroexpander) + (lambda (form env) + (destructuring-bind ((var count &optional (result nil result-p)) + &body body) (cdr form) + (values `(dotimes (,var ,(macroexpand-all count env) + ,@(if result-p + (list (macroexpand-all result env)))) + ,@(macroexpand-decls+forms body env)) + t)))) + +(macroexpand-all '(macrolet ((hair (x) `(car ,x))) + (dotimes (i (bar)) (foo i (hair baz)) l)))) +=> +(MACROLET ((HAIR (X) + `(CAR ,X))) + (DOTIMES (I (BAR)) (FOO I (CAR BAZ)) L)) + +instead of + +(MACROLET ((HAIR (X) + `(CAR ,X))) + (BLOCK NIL + (LET ((I 0) (#:COUNT699 (BAR))) + (DECLARE (TYPE UNSIGNED-BYTE I) + (TYPE INTEGER #:COUNT699)) + (TAGBODY + (GO #:G701) + #:G700 + (TAGBODY (FOO I (CAR BAZ)) L) + (LET* () + (MULTIPLE-VALUE-BIND (#:NEW702) (1+ I) (PROGN (SETQ I #:NEW702) NIL))) + #:G701 + (IF (>= I #:COUNT699) + NIL + (PROGN (GO #:G700))) + (RETURN-FROM NIL (PROGN NIL)))))) +|# + #+sb-fasteval (declaim (ftype (sfunction (sb-interpreter:basic-env &optional t) sb-kernel:lexenv) sb-interpreter:lexenv-from-env environment)) From 38e754d0cdd33436ad890fc49c8b79b1283aaa2d Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sun, 10 Apr 2022 15:53:05 -0700 Subject: [PATCH 3106/4023] Missed change for sb-fasteval. --- src/interpreter/env.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interpreter/env.lisp b/src/interpreter/env.lisp index 415068f419..7ff9ed5c85 100644 --- a/src/interpreter/env.lisp +++ b/src/interpreter/env.lisp @@ -979,7 +979,7 @@ nil (map 'vector (lambda (cell) - (let ((expander (caddr cell))) + (let ((expander (cddr cell))) (if (typep expander 'interpreted-function) expander (make-function From c12a0e1cc49642fe3e0931c11dccfde457693b07 Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sun, 10 Apr 2022 15:55:21 -0700 Subject: [PATCH 3107/4023] Fix arm64 build. --- src/pcl/walk.lisp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pcl/walk.lisp b/src/pcl/walk.lisp index 602ad6827a..f33fb651bd 100644 --- a/src/pcl/walk.lisp +++ b/src/pcl/walk.lisp @@ -224,9 +224,10 @@ (defun convert-macro-to-lambda (llist body env &optional (name "dummy macro")) (declare (ignorable llist body env name)) - #+sb-xc-host (error "CONVERT-MACRO-TO-LAMBDA called") ; no EVAL-IN-LEXENV - #-sb-xc-host (let ((gensym (make-symbol name))) + #+sb-xc-host + (eval `(sb-xc:defmacro ,gensym ,llist ,@body)) + #-sb-xc-host (eval-in-lexenv `(defmacro ,gensym ,llist ,@body) (sb-c::make-restricted-lexenv env)) (macro-function gensym))) From 0ac92a65412dcb1d81dc0cd15002f7a359526f1a Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Sun, 10 Apr 2022 22:26:42 -0700 Subject: [PATCH 3108/4023] Fix cross compiler discrepancies. --- src/code/macros.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 839ecd2f0f..f00f6c84fc 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -1395,7 +1395,7 @@ symbol-case giving up: case=((V U) (F)) (defun case-body (name keyform cases multi-p test errorp proceedp needcasesp) (unless (or cases (not needcasesp)) (warn "no clauses in ~S" name)) - (let ((keyform-value (gensym)) + (let ((keyform-value (sb-xc:gensym)) (clauses ()) (keys ()) (keys-seen (make-hash-table :test #'eql))) From 6aa1cd97bd2ebb73b0a1fb6d8bcaf44916584e1c Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Mon, 11 Apr 2022 00:25:56 -0700 Subject: [PATCH 3109/4023] Simplify inline syntactic closure code. We don't need to process parent lexenvs, now that we do code walking to perform a sort of minimal compilation on the inline expansion. --- src/compiler/ir1tran-lambda.lisp | 113 ++++++++++--------------------- 1 file changed, 37 insertions(+), 76 deletions(-) diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 73795a8f43..d8202192ec 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -1074,75 +1074,6 @@ (declaim (start-block maybe-inline-syntactic-closure)) -;;; Expand a lambda form in LEXENV, returning the expansion and -;;; extract the other stuff like SPECIAL and INLINE/NOTINLINE -;;; declarations needed for reconstructing the lambda in the remaining -;;; lexical environment. Return this other stuff as a secondary value, -;;; but if the lexical environment still contains things that are too -;;; hairy to handle, return NIL. This is later used by -;;; PROCESS-INLINE-LEXENV to reproduce the lexenv. -;;; -;;; Previously it just used the functions and vars of the innermost -;;; lexenv, but the body of macrolet can refer to other macrolets -;;; defined earlier, so it needs to process all the parent lexenvs to -;;; recover the proper order. -(defun expand-in-syntactic-environment (lambda lexenv) - (let (shadowed-funs - shadowed-vars - result) - (loop for env = lexenv then parent - for parent = (lexenv-parent env) - for vars = (lexenv-vars env) - for funs = (lexenv-funs env) - for declarations = nil - do - (loop for binding in vars - for (name . what) = binding - unless (and parent - (find binding (lexenv-vars parent))) - do (typecase what - (cons - (aver (eq (car what) 'macro)) - (push name shadowed-vars)) - (global-var - (aver (eq (global-var-kind what) :special)) - (push `(special ,name) declarations)) - (t - (unless (memq name shadowed-vars) - (return-from expand-in-syntactic-environment - (values nil nil)))))) - (loop for binding in funs - for (name . what) = binding - unless (and parent - (find binding (lexenv-funs parent))) - do - (typecase what - (cons - (push name shadowed-funs)) - ;; FIXME: Is there a good reason for this not to be - ;; DEFINED-FUN (which :INCLUDEs GLOBAL-VAR, in case - ;; you're wondering how this ever worked :-)? Maybe - ;; in conjunction with an AVERrance that it's not an - ;; (AND GLOBAL-VAR (NOT GLOBAL-FUN))? -- CSR, - ;; 2002-07-08 - (global-var - (unless (defined-fun-p what) - (return-from expand-in-syntactic-environment - (values nil nil))) - (push `(,(car (defined-fun-inlinep what)) - ,name) - declarations)) - (t - (unless (memq name shadowed-funs) - (return-from expand-in-syntactic-environment - (values nil nil)))))) - (when declarations - (setf result (list* :declare declarations (and result (list result))))) - while (and parent - (not (null-lexenv-p parent)))) - (values (sb-walker:macroexpand-all lambda lexenv) - result))) - ;;; Return a lambda form that has been "closed" with respect to ;;; LEXENV, returning a LAMBDA-WITH-LEXENV if there are interesting ;;; declarations. To handle local macros, rather than closing over @@ -1156,16 +1087,46 @@ (typecase lexenv (lexenv (let ((vars (lexenv-vars lexenv)) - (funs (lexenv-funs lexenv))) + (funs (lexenv-funs lexenv)) + (decls ())) (cond ((or (lexenv-blocks lexenv) (lexenv-tags lexenv)) nil) ((and (null vars) (null funs)) lambda) + ((dolist (x vars nil) + (let ((name (car x)) + (what (cdr x))) + (when (eq x (assoc name vars :test #'eq)) + (typecase what + (cons + (aver (eq (car what) 'macro))) + (global-var + (aver (eq (global-var-kind what) :special)) + (push `(special ,name) decls)) + (t (return t)))))) + nil) + ((dolist (x funs nil) + (let ((name (car x)) + (what (cdr x))) + (when (eq x (assoc name funs :test #'equal)) + (typecase what + (cons) + ;; FIXME: Is there a good reason for this not to be + ;; DEFINED-FUN (which :INCLUDEs GLOBAL-VAR, in case + ;; you're wondering how this ever worked :-)? Maybe + ;; in conjunction with an AVERrance that it's not an + ;; (AND GLOBAL-VAR (NOT GLOBAL-FUN))? -- CSR, + ;; 2002-07-08 + (global-var + (when (defined-fun-p what) + (push `(,(car (defined-fun-inlinep what)) + ,name) + decls))) + (t (return t)))))) + nil) (t - (multiple-value-bind (expansion remaining-lexenv) - (expand-in-syntactic-environment lambda lexenv) - (when expansion - (if remaining-lexenv - `(lambda-with-lexenv ,remaining-lexenv ,@(cdr expansion)) - expansion))))))) + (let ((expansion (sb-walker:macroexpand-all lambda lexenv))) + (if decls + `(lambda-with-lexenv (:declare ,decls) ,@(cdr expansion)) + expansion)))))) #+(and sb-fasteval (not sb-xc-host)) (sb-interpreter:basic-env (awhen (sb-interpreter::reconstruct-syntactic-closure-env lexenv) From 3ddc09787f05867b104701fcf6f00bba6e186240 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 11 Apr 2022 17:11:06 +0300 Subject: [PATCH 3110/4023] arm64: store CFP for local calls in allocate-frame. Which is more compact. --- src/compiler/arm64/call.lisp | 8 ++++++-- src/compiler/ir2tran.lisp | 11 +++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/compiler/arm64/call.lisp b/src/compiler/arm64/call.lisp index 58d654f2e1..10ac87e2a5 100644 --- a/src/compiler/arm64/call.lisp +++ b/src/compiler/arm64/call.lisp @@ -121,8 +121,12 @@ (:info callee) (:generator 2 (move res csp-tn) - (inst add csp-tn csp-tn (add-sub-immediate - (* (max 1 (sb-allocated-size 'control-stack)) n-word-bytes))) + (let ((size (add-sub-immediate (* (max 1 (sb-allocated-size 'control-stack)) n-word-bytes)))) + (cond ((typep size '(signed-byte 9)) + (inst str cfp-tn (@ csp-tn size :post-index))) + (t + (inst add csp-tn csp-tn size) + (storew cfp-tn res ocfp-save-offset)))) (when (ir2-environment-number-stack-p callee) (inst sub nfp nsp-tn (add-sub-immediate (bytes-needed-for-non-descriptor-stack-frame))) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 0322e550af..df2898700f 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -877,8 +877,10 @@ (push loc passed) (temps value) (locs loc)))) - (temps old-fp) - (locs (ir2-environment-old-fp called-env)))) + #-arm64 + (progn + (temps old-fp) + (locs (ir2-environment-old-fp called-env))))) (values (temps) (locs))))) @@ -896,7 +898,7 @@ ;; If we're about to emit a move from CURRENT-FP then we need to ;; initialize it. - (when (find current-fp temps) + (when (memq current-fp temps) (vop current-fp node block current-fp)) (mapc (lambda (temp loc) @@ -940,7 +942,8 @@ (old-fp (make-stack-pointer-tn))) (multiple-value-bind (temps locs) (emit-psetq-moves node block fun old-fp) - (vop current-fp node block old-fp) + (when (memq old-fp temps) + (vop current-fp node block old-fp)) (vop allocate-frame node block (environment-info (lambda-environment fun)) fp nfp) From 61e2b67b61554b1e0c711da3095a6f5032650652 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 11 Apr 2022 17:28:26 +0300 Subject: [PATCH 3111/4023] arm64/known-return: use ldp. Basically do what is already done in RETURN. --- src/compiler/arm64/call.lisp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/compiler/arm64/call.lisp b/src/compiler/arm64/call.lisp index 10ac87e2a5..79bcf64a5d 100644 --- a/src/compiler/arm64/call.lisp +++ b/src/compiler/arm64/call.lisp @@ -806,24 +806,21 @@ ;;; registers may be tied up by the more operand. Instead, we use ;;; MAYBE-LOAD-STACK-TN. (define-vop (known-return) - (:args (old-fp :target old-fp-temp) + (:args (old-fp) (return-pc) (vals :more t)) - (:temporary (:sc any-reg :from (:argument 0)) old-fp-temp) (:temporary (:scs (interior-reg)) lip) (:move-args :known-return) (:info val-locs) - (:ignore val-locs vals) + (:ignore old-fp return-pc val-locs vals) (:vop-var vop) (:generator 6 - (maybe-load-stack-tn old-fp-temp old-fp) - (maybe-load-stack-tn lip return-pc) (move csp-tn cfp-tn) + (loadw-pair cfp-tn ocfp-save-offset lip lra-save-offset cfp-tn) (let ((cur-nfp (current-nfp-tn vop))) (when cur-nfp (inst add nsp-tn cur-nfp (add-sub-immediate (bytes-needed-for-non-descriptor-stack-frame))))) - (move cfp-tn old-fp-temp) (lisp-return lip :known))) ;;;; Full call: From 1818d474af1c889e2f3508c1260727ae30560a07 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Mon, 11 Apr 2022 17:30:43 +0300 Subject: [PATCH 3112/4023] Don't do anything after calling NIL-functions. Arm64 was resetting CSP, x86-64 was inserting a NOP. But the debugger seems to deal fine with a NIL function at the end of a code object. --- src/compiler/arm64/call.lisp | 8 +++++--- src/compiler/x86-64/call.lisp | 8 +------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/compiler/arm64/call.lisp b/src/compiler/arm64/call.lisp index 79bcf64a5d..bd35958748 100644 --- a/src/compiler/arm64/call.lisp +++ b/src/compiler/arm64/call.lisp @@ -208,9 +208,11 @@ ;; value return case). (unless (or expecting-values-on-stack (type-single-value-p type)) - (if (values-type-may-be-single-value-p type) - (inst csel csp-tn ocfp-tn csp-tn :eq) - (inst mov csp-tn ocfp-tn))) + (cond ((values-type-may-be-single-value-p type) + (inst csel csp-tn ocfp-tn csp-tn :eq)) + ((eq type *empty-type*)) + (t + (inst mov csp-tn ocfp-tn)))) ;; If we ARE expecting values on the stack, we need to ;; either move them to their result location or to set their diff --git a/src/compiler/x86-64/call.lisp b/src/compiler/x86-64/call.lisp index 1ea5b4877a..bcb08e6962 100644 --- a/src/compiler/x86-64/call.lisp +++ b/src/compiler/x86-64/call.lisp @@ -248,13 +248,7 @@ (note-this-location vop :single-value-return) (cond ((<= (sb-kernel:values-type-max-value-count type) - register-arg-count) - (when (and (named-type-p type) - (eq nil (named-type-name type))) - ;; The function never returns, it may happen that the code - ;; ends right here leavig the :SINGLE-VALUE-RETURN note - ;; dangling. Let's emit a NOP. - (inst nop))) + register-arg-count)) ((not (sb-kernel:values-type-may-be-single-value-p type)) (inst mov rsp-tn rbx)) (t From cde56f8af3fe67ef1bf9fbfd1feb8752d52b0b8f Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Tue, 12 Apr 2022 20:13:59 +0300 Subject: [PATCH 3113/4023] Highlight the clauses for warnings in handler-bind/case. Instead of the whole form. Usually for unused variable warnings. --- src/code/error.lisp | 33 ++++++---- src/compiler/ir1tran-lambda.lisp | 107 ++++++++++++++++--------------- src/compiler/ir1tran.lisp | 24 +++---- 3 files changed, 87 insertions(+), 77 deletions(-) diff --git a/src/code/error.lisp b/src/code/error.lisp index e092c588bb..b039b02c32 100644 --- a/src/code/error.lisp +++ b/src/code/error.lisp @@ -172,23 +172,24 @@ (if (typep handler '(cons (member function quote) (cons symbol null))) handler (let* ((name (let ((*gensym-counter* - (length (cluster-entries)))) + (length (cluster-entries)))) (sb-xc:gensym "H"))) (lexpr - (typecase handler - ;; These two are merely expansion prettifiers, - ;; and not strictly necessary. - ((cons (eql function) (cons (cons (eql lambda)) null)) - (cadr handler)) - ((cons (eql lambda)) - handler) - (t - (complex-initforms `(,name ,handler)) - ;; Should be (THE (FUNCTION-DESIGNATOR (CONDITION))) - ;; but the cast kills DX allocation. - `(lambda (c) (funcall ,name c)))))) + (typecase handler + ;; These two are merely expansion prettifiers, + ;; and not strictly necessary. + ((cons (eql function) (cons (cons (eql lambda)) null)) + (cadr handler)) + ((cons (eql lambda)) + handler) + (t + (complex-initforms `(,name ,handler)) + ;; Should be (THE (FUNCTION-DESIGNATOR (CONDITION))) + ;; but the cast kills DX allocation. + `(lambda (c) (funcall ,name c)))))) (local-functions `(,name ,(cadr lexpr) + (declare (sb-c::source-form ,binding)) ,@(when (typep (cadr lexpr) '(cons t null)) '((declare (sb-c::local-optimize (sb-c::verify-arg-count 0))))) ,@(cddr lexpr))) @@ -251,7 +252,11 @@ specification." ll)) (multiple-value-bind (body declarations) (parse-body body nil) - (push `(,fun ,ll ,@declarations (progn ,@body)) local-funs)) + (push `(,fun ,ll + (declare (sb-c::source-form ,case)) + ,@declarations + (progn ,@body)) + local-funs)) (list block type ll fun))))) cases))) (with-unique-names (block form-fun) diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index d8202192ec..2003a083ae 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -894,58 +894,61 @@ (bug "Both SYSTEM-LAMBDA and MAYBE-ADD-DEBUG-CATCH specified")) (unless (or debug-name (neq '.anonymous. source-name)) (setf debug-name (name-lambdalike form))) - (multiple-value-bind (forms decls doc) (parse-body (cddr form) t) - (let ((*lexenv* (process-muffle-decls decls *lexenv*))) - (multiple-value-bind (vars keyp allow-other-keys aux-vars aux-vals) - (make-lambda-vars (cadr form)) - (binding* (((*lexenv* result-type post-binding-lexenv - lambda-list explicit-check source-form - local-policy) - (process-decls decls (append aux-vars vars) nil - :binding-form-p t :allow-lambda-list t)) - (debug-catch-p (and maybe-add-debug-catch - *allow-instrumenting* - (policy *lexenv* - (>= insert-debug-catch 2)))) - (forms (if debug-catch-p - (wrap-forms-in-debug-catch forms) - forms)) - (forms (if (eq result-type *wild-type*) - forms - `((the ,(type-specifier result-type) (progn ,@forms))))) - (*allow-instrumenting* (and (not system-lambda) *allow-instrumenting*)) - (res (cond ((or (find-if #'lambda-var-arg-info vars) keyp) - (ir1-convert-hairy-lambda forms vars keyp - allow-other-keys - aux-vars aux-vals - :post-binding-lexenv post-binding-lexenv - :source-name source-name - :debug-name debug-name - :system-lambda system-lambda)) - (t - (ir1-convert-lambda-body forms vars - :aux-vars aux-vars - :aux-vals aux-vals - :post-binding-lexenv post-binding-lexenv - :source-name source-name - :debug-name debug-name - :system-lambda system-lambda - :local-policy local-policy))))) - (when explicit-check - (setf (getf (functional-plist res) 'explicit-check) explicit-check)) - (setf (functional-inline-expansion res) (or source-form form)) - (setf (functional-arg-documentation res) - (if (eq lambda-list :unspecified) - (strip-lambda-list (cadr form) :arglist) - lambda-list)) - (setf (functional-documentation res) doc) - (when (boundp '*lambda-conversions*) - ;; KLUDGE: Not counting TL-XEPs is a lie, of course, but - ;; keeps things less confusing to users of TIME, where this - ;; count gets used. - (unless (and (consp debug-name) (eq 'tl-xep (car debug-name))) - (incf *lambda-conversions*))) - res))))) + (binding* (((forms decls doc) (parse-body (cddr form) t)) + ((*lexenv* source-form) (process-muffle-decls decls *lexenv*)) + (*current-path* (or (and source-form + (get-source-path source-form)) + *current-path*)) + ((vars keyp allow-other-keys aux-vars aux-vals) + (make-lambda-vars (cadr form))) + ((*lexenv* result-type post-binding-lexenv + lambda-list explicit-check source-form + local-policy) + (process-decls decls (append aux-vars vars) nil + :binding-form-p t :allow-lambda-list t)) + (debug-catch-p (and maybe-add-debug-catch + *allow-instrumenting* + (policy *lexenv* + (>= insert-debug-catch 2)))) + (forms (if debug-catch-p + (wrap-forms-in-debug-catch forms) + forms)) + (forms (if (eq result-type *wild-type*) + forms + `((the ,(type-specifier result-type) (progn ,@forms))))) + (*allow-instrumenting* (and (not system-lambda) *allow-instrumenting*)) + (res (cond ((or (find-if #'lambda-var-arg-info vars) keyp) + (ir1-convert-hairy-lambda forms vars keyp + allow-other-keys + aux-vars aux-vals + :post-binding-lexenv post-binding-lexenv + :source-name source-name + :debug-name debug-name + :system-lambda system-lambda)) + (t + (ir1-convert-lambda-body forms vars + :aux-vars aux-vars + :aux-vals aux-vals + :post-binding-lexenv post-binding-lexenv + :source-name source-name + :debug-name debug-name + :system-lambda system-lambda + :local-policy local-policy))))) + (when explicit-check + (setf (getf (functional-plist res) 'explicit-check) explicit-check)) + (setf (functional-inline-expansion res) (or source-form form)) + (setf (functional-arg-documentation res) + (if (eq lambda-list :unspecified) + (strip-lambda-list (cadr form) :arglist) + lambda-list)) + (setf (functional-documentation res) doc) + (when (boundp '*lambda-conversions*) + ;; KLUDGE: Not counting TL-XEPs is a lie, of course, but + ;; keeps things less confusing to users of TIME, where this + ;; count gets used. + (unless (and (consp debug-name) (eq 'tl-xep (car debug-name))) + (incf *lambda-conversions*))) + res)) (defun wrap-forms-in-debug-catch (forms) #+unwind-to-frame-and-call-vop diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index b4f784dd15..c669b63be6 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1681,15 +1681,18 @@ optimize-qualities))) (defun process-muffle-decls (decls lexenv) - (flet ((process-it (spec) - (cond ((atom spec)) - ((member (car spec) '(muffle-conditions unmuffle-conditions)) - (setq lexenv - (process-1-decl spec lexenv nil nil nil nil)))))) - (dolist (decl decls) - (dolist (spec (rest decl)) - (process-it spec)))) - lexenv) + (let (source-form) + (flet ((process-it (spec) + (cond ((atom spec)) + ((member (car spec) '(muffle-conditions unmuffle-conditions)) + (setq lexenv + (process-1-decl spec lexenv nil nil nil nil))) + ((eq (car spec) 'source-form) + (setf source-form (cadr spec)))))) + (dolist (decl decls) + (dolist (spec (rest decl)) + (process-it spec)))) + (values lexenv source-form))) ;;; Use a list of DECLARE forms to annotate the lists of LAMBDA-VAR ;;; and FUNCTIONAL structures which are being bound. In addition to @@ -1759,8 +1762,7 @@ ;; E.g. suppressing argument checking without doing ;; so in all the subforms. ((typep spec '(cons (eql local-optimize))) - (setf local-optimize spec) - (setf source-form (cadr spec))) + (setf local-optimize spec)) (t (multiple-value-bind (new-env new-qualities) (process-1-decl spec lexenv vars fvars From 60f84eda5c1f877cfa2be6c33f1ca1050dc7fa6c Mon Sep 17 00:00:00 2001 From: Charles Zhang Date: Wed, 13 Apr 2022 01:47:59 -0700 Subject: [PATCH 3114/4023] Check in some CMU CL documentation verbatim. Our source code makes direct reference to some internals .tex files found only in the CMU CL source, and even our own manual has direct references to the CMU CL manual because the corresponding sections haven't been written yet (for over 2 decades). We might as well check-in the original documentation. I doubt anyone will ever be paid to write or even finish porting such high quality documentation, and it would be a shame to have 95% correct internals documentation be completely missing as well. --- doc/cmu-user/.cvsignore | 25 + doc/cmu-user/Makefile | 124 + doc/cmu-user/aliens.tex | 1163 +++++++ doc/cmu-user/cmu-user.dict | 460 +++ doc/cmu-user/cmu-user.hva | 189 ++ doc/cmu-user/cmu-user.tex | 146 + doc/cmu-user/cmucl.css | 85 + doc/cmu-user/compiler-hint.tex | 4138 +++++++++++++++++++++++ doc/cmu-user/compiler.tex | 1251 +++++++ doc/cmu-user/contents_motif.gif | Bin 0 -> 316 bytes doc/cmu-user/cross-referencing.tex | 297 ++ doc/cmu-user/debug-internals.tex | 765 +++++ doc/cmu-user/debugger.tex | 1334 ++++++++ doc/cmu-user/extensions.tex | 3077 +++++++++++++++++ doc/cmu-user/hierarchical-packages.tex | 213 ++ doc/cmu-user/internet.tex | 341 ++ doc/cmu-user/introduction.tex | 357 ++ doc/cmu-user/ipc.tex | 414 +++ doc/cmu-user/latex2html.tex | 56 + doc/cmu-user/macros.tex | 284 ++ doc/cmu-user/next_motif.gif | Bin 0 -> 317 bytes doc/cmu-user/package-locks.tex | 124 + doc/cmu-user/previous_motif.gif | Bin 0 -> 317 bytes doc/cmu-user/serve-event.tex | 575 ++++ doc/cmu-user/simple-streams.tex | 21 + doc/cmu-user/typehtml.dtx | 2364 +++++++++++++ doc/cmu-user/typehtml.ins | 3 + doc/cmu-user/typehtml.sty | 899 +++++ doc/cmu-user/unicode.tex | 733 ++++ doc/cmu-user/unix.tex | 508 +++ doc/internals/cmu/.cvsignore | 11 + doc/internals/cmu/.gitignore | 10 + doc/internals/cmu/Makefile | 83 + doc/internals/cmu/architecture.tex | 205 ++ doc/internals/cmu/back.tex | 728 ++++ doc/internals/cmu/compiler-overview.tex | 550 +++ doc/internals/cmu/compiler.tex | 6 + doc/internals/cmu/debugger.tex | 657 ++++ doc/internals/cmu/design.tex | 92 + doc/internals/cmu/environment.tex | 23 + doc/internals/cmu/executable.tex | 100 + doc/internals/cmu/fasl.tex | 640 ++++ doc/internals/cmu/front.tex | 968 ++++++ doc/internals/cmu/glossary.tex | 411 +++ doc/internals/cmu/interface.tex | 6 + doc/internals/cmu/internal-design.txt | 694 ++++ doc/internals/cmu/interpreter.tex | 196 ++ doc/internals/cmu/lowlev.tex | 85 + doc/internals/cmu/middle.tex | 667 ++++ doc/internals/cmu/object.tex | 770 +++++ doc/internals/cmu/outline.txt | 120 + doc/internals/cmu/retargeting.tex | 1113 ++++++ doc/internals/cmu/run-time.tex | 8 + doc/internals/cmu/vm.tex | 1460 ++++++++ 54 files changed, 29549 insertions(+) create mode 100644 doc/cmu-user/.cvsignore create mode 100644 doc/cmu-user/Makefile create mode 100644 doc/cmu-user/aliens.tex create mode 100644 doc/cmu-user/cmu-user.dict create mode 100644 doc/cmu-user/cmu-user.hva create mode 100644 doc/cmu-user/cmu-user.tex create mode 100644 doc/cmu-user/cmucl.css create mode 100644 doc/cmu-user/compiler-hint.tex create mode 100644 doc/cmu-user/compiler.tex create mode 100644 doc/cmu-user/contents_motif.gif create mode 100644 doc/cmu-user/cross-referencing.tex create mode 100644 doc/cmu-user/debug-internals.tex create mode 100644 doc/cmu-user/debugger.tex create mode 100644 doc/cmu-user/extensions.tex create mode 100644 doc/cmu-user/hierarchical-packages.tex create mode 100644 doc/cmu-user/internet.tex create mode 100644 doc/cmu-user/introduction.tex create mode 100644 doc/cmu-user/ipc.tex create mode 100644 doc/cmu-user/latex2html.tex create mode 100644 doc/cmu-user/macros.tex create mode 100644 doc/cmu-user/next_motif.gif create mode 100644 doc/cmu-user/package-locks.tex create mode 100644 doc/cmu-user/previous_motif.gif create mode 100644 doc/cmu-user/serve-event.tex create mode 100644 doc/cmu-user/simple-streams.tex create mode 100644 doc/cmu-user/typehtml.dtx create mode 100644 doc/cmu-user/typehtml.ins create mode 100644 doc/cmu-user/typehtml.sty create mode 100644 doc/cmu-user/unicode.tex create mode 100644 doc/cmu-user/unix.tex create mode 100644 doc/internals/cmu/.cvsignore create mode 100644 doc/internals/cmu/.gitignore create mode 100644 doc/internals/cmu/Makefile create mode 100644 doc/internals/cmu/architecture.tex create mode 100644 doc/internals/cmu/back.tex create mode 100644 doc/internals/cmu/compiler-overview.tex create mode 100644 doc/internals/cmu/compiler.tex create mode 100644 doc/internals/cmu/debugger.tex create mode 100644 doc/internals/cmu/design.tex create mode 100644 doc/internals/cmu/environment.tex create mode 100644 doc/internals/cmu/executable.tex create mode 100644 doc/internals/cmu/fasl.tex create mode 100644 doc/internals/cmu/front.tex create mode 100644 doc/internals/cmu/glossary.tex create mode 100644 doc/internals/cmu/interface.tex create mode 100644 doc/internals/cmu/internal-design.txt create mode 100644 doc/internals/cmu/interpreter.tex create mode 100644 doc/internals/cmu/lowlev.tex create mode 100644 doc/internals/cmu/middle.tex create mode 100644 doc/internals/cmu/object.tex create mode 100644 doc/internals/cmu/outline.txt create mode 100644 doc/internals/cmu/retargeting.tex create mode 100644 doc/internals/cmu/run-time.tex create mode 100644 doc/internals/cmu/vm.tex diff --git a/doc/cmu-user/.cvsignore b/doc/cmu-user/.cvsignore new file mode 100644 index 0000000000..f6773e158a --- /dev/null +++ b/doc/cmu-user/.cvsignore @@ -0,0 +1,25 @@ +*.aux +*.cdx +*.cnd +*.dvi +*.fdx +*.fnd +*.html +*.idx +*.ilg +*.log +*.out +*.pdf +*.tdx +*.tnd +*.toc +*.vdx +*.vnd +cmu-user-html.tgz +cmu-user-letter.ps +cmu-user.haux +cmu-user.hcnd +cmu-user.hfnd +cmu-user.htnd +cmu-user.htoc +cmu-user.hvnd diff --git a/doc/cmu-user/Makefile b/doc/cmu-user/Makefile new file mode 100644 index 0000000000..b554af2431 --- /dev/null +++ b/doc/cmu-user/Makefile @@ -0,0 +1,124 @@ +# -*- makefile -*- +# +# +# This Makefile contains rules for converting the LaTeX sources of the +# CMUCL User's Manual into various formats: Postscript, PDF, DVI, HTML +# and info. The useful targets are: +# +# make cmu-user.ps (A4 paper) +# make cmu-user-letter.ps (letter paper) +# make cmu-user.dvi +# make cmu-user.pdf +# make cmu-user.html +# make cmu-user.info +# make clean + +# A number of addon LaTeX packages are used in the manual, to support +# features such as hyperlinks and multiple indexes. A current +# distribution of teTeX contains everything that is necessary to +# generate the Postscript, PDF and DVI formats. HTML output is +# generated using the Hevea tool, which is available from +# . The HTML files are +# then split into sections using the hacha tool (distributed with +# hevea), and cleaned up using tidy. Note that hevea 1.10 produces +# HTML that looks a bit weird. However, hevea 1.06 works nicely. +# +# The generated DVI file should include clickable hyperlinks. The PDF +# output should include a hyperlinked table of contents, hyperlinked +# cross-references, and an index. The generated Postscript should use +# Postscript fonts that give good quality output at high resolutions. + + +SHELL = /bin/sh +LATEX ?= latex +BIBTEX ?= bibtex +PDFLATEX ?= pdflatex +HEVEA ?= hevea +HACHA ?= hacha +TIDY ?= tidy + +FILES = *.tex + +.SUFFIXES: +.SUFFIXES: .tex .dvi .ps .ps1 .pdf .html .info + + +all: cmu-user.pdf + + +# Runs LaTeX once, then reruns LaTeX as many times as necessary to get +# rid of the "undefined references" message, generates the indexes, +# the reruns LaTeX. The dependency on the .tex files means that the +# DVI file will be rebuilt only if one of the included LaTeX files has +# been modified. +%.dvi : %.tex $(FILES) + $(LATEX) $< + @while ( grep -q "Rerun to get cross" $*.log > /dev/null ); do \ + $(LATEX) $<; \ + done + if [ "$<" = "cmu-user.tex" ]; then $(MAKE) index; else $(MAKE) index-letter; fi + + $(LATEX) $< + +%.pdf : %.tex $(FILES) + $(PDFLATEX) $< + if [ "$<" = "cmu-user.tex" ]; then $(MAKE) index; else $(MAKE) index-letter; fi + @while ( grep 'Rerun to get cross' $*.log > /dev/null ); do \ + $(PDFLATEX) $<; \ + if [ "$<" = "cmu-user.tex" ]; then $(MAKE) index; else $(MAKE) index-letter; fi; \ + done + +# the "-fix" option to hevea makes it run as many times as necessary +# to resolve all cross-references and generate an index. +%.html : %.tex $(FILES) cmu-user.hva + $(HEVEA) -fix cmu-user.hva $< + $(HACHA) -tocbis $@ + -$(TIDY) -m *.html + +%.info : %.tex $(FILES) + $(HEVEA) -fix -info cmu-user.hva $< + +%.ps1 : %.dvi + dvips -o $@ $< + +# convert the Postscript file to duplex (will print double-sided if +# the printer supports it) +%.ps : %.ps1 + if [ -x psset ]; then psset -d -o $@ $<; else cp $< $@; fi + +# Tar up the html files. Note: cmucl.css is duplicated here, from the +# cmucl-www repository. Please remember to update cmucl.css here +# whenever cmucl.css changes in cmucl-www. +cmu-user-html.tgz : cmu-user.html + mkdir cmu-user + cp cmucl.css *.html *.gif cmu-user + tar cf - cmu-user | gzip > cmu-user-html.tgz + +# generate Postscript for letter format, instead of for A4 paper +.INTERMEDIATE: cmu-user-letter.tex +cmu-user-letter.tex: cmu-user.tex + cp $< $@ + perl -pi -e 's/documentclass\[a4paper\]/documentclass\[letter\]/' $@ + + +clean: + rm -f *.log *.bbl *.blg *.ps *.pdf *.aux *.lof *.toc *.out *.ilg + rm -f *.vdx *.cdx *.tdx *.fdx *.idx *.cnd *.fnd *.tnd *.vnd *.haux + rm -f *.html *.hcnd *.htnd *.hvnd *.hfnd *.htoc + rm -f cmu-user.css + +index: + makeindex cmu-user.tdx -o cmu-user.tnd + makeindex cmu-user.vdx -o cmu-user.vnd + makeindex cmu-user.fdx -o cmu-user.fnd + makeindex cmu-user.cdx -o cmu-user.cnd + +index-letter: + makeindex cmu-user-letter.tdx -o cmu-user-letter.tnd + makeindex cmu-user-letter.vdx -o cmu-user-letter.vnd + makeindex cmu-user-letter.fdx -o cmu-user-letter.fnd + makeindex cmu-user-letter.cdx -o cmu-user-letter.cnd + +.PHONY: clean index + +# EOF diff --git a/doc/cmu-user/aliens.tex b/doc/cmu-user/aliens.tex new file mode 100644 index 0000000000..34ac3176df --- /dev/null +++ b/doc/cmu-user/aliens.tex @@ -0,0 +1,1163 @@ +\chapter{Alien Objects} +\label{aliens} + +\credits{by Robert MacLachlan and William Lott} + + +\section{Introduction to Aliens} + +Because of Lisp's emphasis on dynamic memory allocation and garbage +collection, Lisp implementations use unconventional memory representations +for objects. This representation mismatch creates problems when a Lisp +program must share objects with programs written in another language. There +are three different approaches to establishing communication: + +\begin{itemize} +\item The burden can be placed on the foreign program (and programmer) by +requiring the use of Lisp object representations. The main difficulty with +this approach is that either the foreign program must be written with Lisp +interaction in mind, or a substantial amount of foreign ``glue'' code must be +written to perform the translation. + +\item The Lisp system can automatically convert objects back and forth +between the Lisp and foreign representations. This is convenient, but +translation becomes prohibitively slow when large or complex data structures +must be shared. + +\item The Lisp program can directly manipulate foreign objects through the +use of extensions to the Lisp language. Most Lisp systems make use of +this approach, but the language for describing types and expressing +accesses is often not powerful enough for complex objects to be easily +manipulated. +\end{itemize} + +\cmucl{} relies primarily on the automatic conversion and direct manipulation +approaches: Aliens of simple scalar types are automatically converted, +while complex types are directly manipulated in their foreign +representation. Any foreign objects that can't automatically be +converted into Lisp values are represented by objects of type +\code{alien-value}. Since Lisp is a dynamically typed language, even +foreign objects must have a run-time type; this type information is +provided by encapsulating the raw pointer to the foreign data within an +\code{alien-value} object. + +The Alien type language and operations are most similar to those of the +C language, but Aliens can also be used when communicating with most +other languages that can be linked with C. + + +\section{Alien Types} + +Alien types have a description language based on nested list structure. For +example: + +\begin{example} +struct foo \{ + int a; + struct foo *b[100]; +\}; +\end{example} + +has the corresponding Alien type: + +\begin{lisp} +(struct foo + (a int) + (b (array (* (struct foo)) 100))) +\end{lisp} + + +\subsection{Defining Alien Types} + +Types may be either named or anonymous. With structure and union +types, the name is part of the type specifier, allowing recursively +defined types such as: + +\begin{lisp} +(struct foo (a (* (struct foo)))) +\end{lisp} + +An anonymous structure or union type is specified by using the name +\nil{}. The \funref{with-alien} macro defines a local scope which +``captures'' any named type definitions. Other types are not +inherently named, but can be given named abbreviations using +\code{def-alien-type}. + +\begin{defmac}{alien:}{def-alien-type}{name type} + This macro globally defines \var{name} as a shorthand for the Alien + type \var{type}. When introducing global structure and union type + definitions, \var{name} may be \nil, in which case the name to + define is taken from the type's name. +\end{defmac} + + +\subsection{Alien Types and Lisp Types} + +The Alien types form a subsystem of the \cmucl{} type system. An +\code{alien} type specifier provides a way to use any Alien type as a +Lisp type specifier. For example + +\begin{lisp} +(typep foo '(alien (* int))) +\end{lisp} + +can be used to determine whether \code{foo} is a pointer to an +\code{int}. \code{alien} type specifiers can be used in the same ways +as ordinary type specifiers (like \code{string}.) Alien type +declarations are subject to the same precise type checking as any +other declaration (\pxlref{precise-type-checks}.) + +Note that the Alien type system overlaps with normal Lisp type +specifiers in some cases. For example, the type specifier +\code{(alien single-float)} is identical to \code{single-float}, since +Alien floats are automatically converted to Lisp floats. When +\code{type-of} is called on an Alien value that is not automatically +converted to a Lisp value, then it will return an \code{alien} type +specifier. + + +\subsection{Alien Type Specifiers} + +Some Alien type names are \clisp{} symbols, but the names are +still exported from the \code{alien} package, so it is legal to say +\code{alien:single-float}. These are the basic Alien type specifiers: + +\begin{deftp}{Alien type}{*}{% + \args{\var{type}}} + + A pointer to an object of the specified \var{type}. If \var{type} + is \true, then it means a pointer to anything, similar to + ``\code{void *}'' in ANSI C. Currently, the only way to detect a + null pointer is: +\begin{lisp} + (zerop (sap-int (alien-sap \var{ptr}))) +\end{lisp} +\xlref{system-area-pointers} +\end{deftp} + +\begin{deftp}{Alien type}{array}{\var{type} \mstar{\var{dimension}}} + + An array of the specified \var{dimensions}, holding elements of type + \var{type}. Note that \code{(* int)} and \code{(array int)} are + considered to be different types when type checking is done; pointer + and array types must be explicitly coerced using \code{cast}. + + Arrays are accessed using \code{deref}, passing the indices as + additional arguments. Elements are stored in column-major order (as + in C), so the first dimension determines only the size of the memory + block, and not the layout of the higher dimensions. An array whose + first dimension is variable may be specified by using \nil{} as the + first dimension. Fixed-size arrays can be allocated as array + elements, structure slots or \code{with-alien} variables. Dynamic + arrays can only be allocated using \funref{make-alien}. +\end{deftp} + +\begin{deftp}{Alien type}{struct}{\var{name} + \mstar{(\var{field} \var{type} \mopt{\var{bits}})}} + + A structure type with the specified \var{name} and \var{fields}. + Fields are allocated at the same positions used by the + implementation's C compiler. \var{bits} is intended for C-like bit + field support, but is currently unused. If \var{name} is \false, + then the type is anonymous. + + If a named Alien \code{struct} specifier is passed to + \funref{def-alien-type} or \funref{with-alien}, then this defines, + respectively, a new global or local Alien structure type. If no + \var{fields} are specified, then the fields are taken from the + current (local or global) Alien structure type definition of + \var{name}. +\end{deftp} + +\begin{deftp}{Alien type}{union}{\var{name} + \mstar{(\var{field} \var{type} \mopt{\var{bits}})}} + + Similar to \code{struct}, but defines a union type. All fields are + allocated at the same offset, and the size of the union is the size + of the largest field. The programmer must determine which field is + active from context. +\end{deftp} + +\begin{deftp}{Alien type}{enum}{\var{name} \mstar{\var{spec}}} + + An enumeration type that maps between integer values and keywords. + If \var{name} is \false, then the type is anonymous. Each + \var{spec} is either a keyword, or a list \code{(\var{keyword} + \var{value})}. If \var{integer} is not supplied, then it defaults + to one greater than the value for the preceding spec (or to zero if + it is the first spec.) +\end{deftp} + +\begin{deftp}{Alien type}{signed}{\mopt{\var{bits}}} + A signed integer with the specified number of bits precision. The + upper limit on integer precision is determined by the machine's word + size. If no size is specified, the maximum size will be used. +\end{deftp} + +\begin{deftp}{Alien type}{integer}{\mopt{\var{bits}}} + Identical to \code{signed}---the distinction between \code{signed} + and \code{integer} is purely stylistic. +\end{deftp} + +\begin{deftp}{Alien type}{unsigned}{\mopt{\var{bits}}} + Like \code{signed}, but specifies an unsigned integer. +\end{deftp} + +\begin{deftp}{Alien type}{boolean}{\mopt{\var{bits}}} + Similar to an enumeration type that maps \code{0} to \false{} and + all other values to \true. \var{bits} determines the amount of + storage allocated to hold the truth value. +\end{deftp} + +\begin{deftp}{Alien type}{single-float}{} + A floating-point number in IEEE single format. +\end{deftp} + +\begin{deftp}{Alien type}{double-float}{} + A floating-point number in IEEE double format. +\end{deftp} + +\begin{deftp}{Alien type}{function}{\var{result-type} \mstar{\var{arg-type}}} + \label{alien-function-types} + A Alien function that takes arguments of the specified + \var{arg-types} and returns a result of type \var{result-type}. + Note that the only context where a \code{function} type is directly + specified is in the argument to \code{alien-funcall} (see section + \funref{alien-funcall}.) In all other contexts, functions are + represented by function pointer types: \code{(* (function ...))}. +\end{deftp} + +\begin{deftp}{Alien type}{system-area-pointer}{} + A pointer which is represented in Lisp as a + \code{system-area-pointer} object (\pxlref{system-area-pointers}.) +\end{deftp} + + +\subsection{The C-Call Package} + +The \code{c-call} package exports these type-equivalents to the C type +of the same name: \code{char}, \code{short}, \code{int}, \code{long}, +\code{unsigned-char}, \code{unsigned-short}, \code{unsigned-int}, +\code{unsigned-long}, \code{float}, \code{double}. \code{c-call} also +exports these types: + +\begin{deftp}{Alien type}{void}{} + This type is used in function types to declare that no useful value + is returned. Evaluation of an \code{alien-funcall} form will return + zero values. +\end{deftp} + +\begin{deftp}{Alien type}{c-string}{} + This type is similar to \code{(* char)}, but is interpreted as a + null-terminated string, and is automatically converted into a Lisp + string when accessed. If the pointer is C \code{NULL} (or 0), then + accessing gives Lisp \false. + + With Unicode, a Lisp string is not the same as a C string since a + Lisp string uses two bytes for each character. In this case, a + C string is converted to a Lisp string by taking each byte of the + C-string and applying \code{code-char} to create each character of + the Lisp string. + + Similarly, a Lisp string is converted to a C string by taking the + low 8 bits of the \code{char-code} of each character and assigning + that to each byte of the C string. + + In either case, \code{string-encode} and \code{string-decode} may be + useful to convert Unicode Lisp strings to or from C strings. + + Assigning a Lisp string to a \code{c-string} structure field or + variable stores the contents of the string to the memory already + pointed to by that variable. When an Alien of type \code{(* char)} + is assigned to a \code{c-string}, then the \code{c-string} pointer + is assigned to. This allows \code{c-string} pointers to be + initialized. For example: + +\begin{lisp} + (def-alien-type nil (struct foo (str c-string))) + + (defun make-foo (str) + (let ((my-foo (make-alien (struct foo)))) + (setf (slot my-foo 'str) (make-alien char (length str))) + (setf (slot my-foo 'str) str) + my-foo)) +\end{lisp} + +Storing Lisp \false{} writes C \code{NULL} to the \code{c-string} +pointer. +\end{deftp} + + + +\section{Alien Operations} + +This section describes the basic operations on Alien values. + +\subsection{Alien Access Operations} + +\begin{defun}{alien:}{deref}{\args{\var{pointer-or-array} \amprest{} \var{indices}}} + + This function returns the value pointed to by an Alien pointer or + the value of an Alien array element. If a pointer, an optional + single index can be specified to give the equivalent of C pointer + arithmetic; this index is scaled by the size of the type pointed to. + If an array, the number of indices must be the same as the number of + dimensions in the array type. \code{deref} can be set with + \code{setf} to assign a new value. +\end{defun} + +\begin{defun}{alien:}{slot}{\args{\var{struct-or-union} \var{slot-name}}} + + This function extracts the value of slot \var{slot-name} from the an + Alien \code{struct} or \code{union}. If \var{struct-or-union} is a + pointer to a structure or union, then it is automatically + dereferenced. This can be set with \code{setf} to assign a new + value. Note that \var{slot-name} is evaluated, and need not be a + compile-time constant (but only constant slot accesses are + efficiently compiled.) +\end{defun} + + +\subsection{Alien Coercion Operations} + +\begin{defmac}{alien:}{addr}{\var{alien-expr}} + + This macro returns a pointer to the location specified by + \var{alien-expr}, which must be either an Alien variable, a use of + \code{deref}, a use of \code{slot}, or a use of + \funref{extern-alien}. +\end{defmac} + +\begin{defmac}{alien:}{cast}{\var{alien} \var{new-type}} + + This macro converts \var{alien} to a new Alien with the specified + \var{new-type}. Both types must be an Alien pointer, array or + function type. Note that the result is not \code{eq} to the + argument, but does refer to the same data bits. +\end{defmac} + +\begin{defmac}{alien:}{sap-alien}{\var{sap} \var{type}} + \defunx[alien:]{alien-sap}{\var{alien-value}} + + \code{sap-alien} converts \var{sap} (a system area pointer + \pxlref{system-area-pointers}) to an Alien value with the specified + \var{type}. \var{type} is not evaluated. + +\code{alien-sap} returns the SAP which points to \var{alien-value}'s +data. + +The \var{type} to \code{sap-alien} and the type of the \var{alien-value} to +\code{alien-sap} must some Alien pointer, array or record type. +\end{defmac} + + +\subsection{Alien Dynamic Allocation} + +Dynamic Aliens are allocated using the \code{malloc} library, so foreign code +can call \code{free} on the result of \code{make-alien}, and Lisp code can +call \code{free-alien} on objects allocated by foreign code. + +\begin{defmac}{alien:}{make-alien}{\var{type} \mopt{\var{size}}} + + This macro returns a dynamically allocated Alien of the specified + \var{type} (which is not evaluated.) The allocated memory is not + initialized, and may contain arbitrary junk. If supplied, + \var{size} is an expression to evaluate to compute the size of the + allocated object. There are two major cases: + \begin{itemize} + \item When \var{type} is an array type, an array of that type is + allocated and a \var{pointer} to it is returned. Note that you + must use \code{deref} to change the result to an array before you + can use \code{deref} to read or write elements: + +\begin{lisp} +(defvar *foo* (make-alien (array char 10))) + +(type-of *foo*) \result{} (alien (* (array (signed 8) 10))) + +(setf (deref (deref foo) 0) 10) \result{} 10 +\end{lisp} + + If supplied, \var{size} is used as the first dimension for the + array. + + \item When \var{type} is any other type, then then an object for + that type is allocated, and a \var{pointer} to it is returned. So + \code{(make-alien int)} returns a \code{(* int)}. If \var{size} + is specified, then a block of that many objects is allocated, with + the result pointing to the first one. + \end{itemize} +\end{defmac} + +\begin{defun}{alien:}{free-alien}{\var{alien}} + + This function frees the storage for \var{alien} (which must have + been allocated with \code{make-alien} or \code{malloc}.) +\end{defun} + +See also \funref{with-alien}, which stack-allocates Aliens. + + +\section{Alien Variables} + +Both local (stack allocated) and external (C global) Alien variables are +supported. + + +\subsection{Local Alien Variables} + +\begin{defmac}{alien:}{with-alien}{\mstar{(\var{name} \var{type} + \mopt{\var{initial-value}})} \mstar{form}} + + This macro establishes local alien variables with the specified + Alien types and names for dynamic extent of the body. The variable + \var{names} are established as symbol-macros; the bindings have + lexical scope, and may be assigned with \code{setq} or \code{setf}. + This form is analogous to defining a local variable in C: additional + storage is allocated, and the initial value is copied. + + \code{with-alien} also establishes a new scope for named structures + and unions. Any \var{type} specified for a variable may contain + name structure or union types with the slots specified. Within the + lexical scope of the binding specifiers and body, a locally defined + structure type \var{foo} can be referenced by its name using: +\begin{lisp} + (struct foo) +\end{lisp} +\end{defmac} + + +\subsection{External Alien Variables} +\label{external-aliens} + +External Alien names are strings, and Lisp names are symbols. When an +external Alien is represented using a Lisp variable, there must be a +way to convert from one name syntax into the other. The macros +\code{extern-alien}, \code{def-alien-variable} and +\funref{def-alien-routine} use this conversion heuristic: +\begin{itemize} +\item Alien names are converted to Lisp names by uppercasing and + replacing underscores with hyphens. + +\item Conversely, Lisp names are converted to Alien names by + lowercasing and replacing hyphens with underscores. + +\item Both the Lisp symbol and Alien string names may be separately + specified by using a list of the form: +\begin{lisp} + (\var{alien-string} \var{lisp-symbol}) +\end{lisp} +\end{itemize} + +\begin{defmac}{alien:}{def-alien-variable}{\var{name} \var{type}} + + This macro defines \var{name} as an external Alien variable of the + specified Alien \var{type}. \var{name} and \var{type} are not + evaluated. The Lisp name of the variable (see above) becomes a + global Alien variable in the Lisp namespace. Global Alien variables + are effectively ``global symbol macros''; a reference to the + variable fetches the contents of the external variable. Similarly, + setting the variable stores new contents---the new contents must be + of the declared \var{type}. + + For example, it is often necessary to read the global C variable + \code{errno} to determine why a particular function call failed. It + is possible to define errno and make it accessible from Lisp by the + following: +\begin{lisp} +(def-alien-variable "errno" int) + +;; Now it is possible to get the value of the C variable errno simply by +;; referencing that Lisp variable: +;; +(print errno) +\end{lisp} +\end{defmac} + +\begin{defmac}{alien:}{extern-alien}{\var{name} \var{type}} + + This macro returns an Alien with the specified \var{type} which + points to an externally defined value. \var{name} is not evaluated, + and may be specified either as a string or a symbol. \var{type} is + an unevaluated Alien type specifier. +\end{defmac} + + +\section{Alien Data Structure Example} + +Now that we have Alien types, operations and variables, we can manipulate +foreign data structures. This C declaration can be translated into the +following Alien type: + +\begin{lisp} +struct foo \{ + int a; + struct foo *b[100]; +\}; + + \myequiv + +(def-alien-type nil + (struct foo + (a int) + (b (array (* (struct foo)) 100)))) +\end{lisp} + +With this definition, the following C expression can be translated in this way: + +\begin{example} +struct foo f; +f.b[7].a + + \myequiv + +(with-alien ((f (struct foo))) + (slot (deref (slot f 'b) 7) 'a) + ;; + ;; Do something with f... + ) +\end{example} + + +Or consider this example of an external C variable and some accesses: + +\begin{example} +struct c_struct \{ + short x, y; + char a, b; + int z; + c_struct *n; +\}; + +extern struct c_struct *my_struct; + +my_struct->x++; +my_struct->a = 5; +my_struct = my_struct->n; +\end{example} + +which can be made be manipulated in Lisp like this: + +\begin{lisp} +(def-alien-type nil + (struct c-struct + (x short) + (y short) + (a char) + (b char) + (z int) + (n (* c-struct)))) + +(def-alien-variable "my_struct" (* c-struct)) + +(incf (slot my-struct 'x)) +(setf (slot my-struct 'a) 5) +(setq my-struct (slot my-struct 'n)) +\end{lisp} + + +\section{Loading Unix Object Files} + +\cmucl{} is able to load foreign object files at runtime, using the +function \code{load-foreign}. This function is able to load shared +libraries (that are typically named \verb|.so|) via the dlopen +mechanism. It can also load \verb|.a| or \verb|.o| object files by +calling the linker on the files and libraries to create a loadable +object file. Once loaded, the external symbols that define routines +and variables are made available for future external references (e.g. +by \code{extern-alien}.) \code{load-foreign} must be run before any of +the defined symbols are referenced. + +Note that if a Lisp core image is saved (using \funref{save-lisp}), all +loaded foreign code is lost when the image is restarted. + + +\begin{defun}{ext:}{load-foreign}{% + \args{\var{files} \keys{\kwd{libraries} \kwd{base-file} \kwd{env}}}} + + \var{files} is a \code{simple-string} or list of + \code{simple-string}s specifying the names of the object files. If + \var{files} is a simple-string, the file that it designates is + loaded using the platform's dlopen mechanism. If it is a list of + strings, the platform linker \code{ld} is invoked to transform the + object files into a loadable object file. \var{libraries} is a list + of \code{simple-string}s specifying libraries in a format that the + platform linker expects. The default value for \var{libraries} is + \code{("-lc")} (i.e., the standard C library). \var{base-file} is + the file to use for the initial symbol table information. The + default is the Lisp start up code: \file{path:lisp}. \var{env} + should be a list of simple strings in the format of Unix environment + variables (i.e., \code{\var{A}=\var{B}}, where \var{A} is an + environment variable and \var{B} is its value). The default value + for \var{env} is the environment information available at the time + Lisp was invoked. Unless you are certain that you want to change + this, you should just use the default. +\end{defun} + + +\section{Alien Function Calls} + +The foreign function call interface allows a Lisp program to call functions +written in other languages. The current implementation of the foreign +function call interface assumes a C calling convention and thus routines +written in any language that adheres to this convention may be called from +Lisp. + +Lisp sets up various interrupt handling routines and other environment +information when it first starts up, and expects these to be in place at all +times. The C functions called by Lisp should either not change the +environment, especially the interrupt entry points, or should make sure +that these entry points are restored when the C function returns to Lisp. +If a C function makes changes without restoring things to the way they were +when the C function was entered, there is no telling what will happen. + + +\subsection{The alien-funcall Primitive} + +\begin{defun}{alien:}{alien-funcall}{% + \args{\var{alien-function} \amprest{} \var{arguments}}} + + This function is the foreign function call primitive: + \var{alien-function} is called with the supplied \var{arguments} and + its value is returned. The \var{alien-function} is an arbitrary + run-time expression; to call a constant function, use + \funref{extern-alien} or \code{def-alien-routine}. + + The type of \var{alien-function} must be \code{(alien (function + ...))} or \code{(alien (* (function ...)))}, + \xlref{alien-function-types}. The function type is used to + determine how to call the function (as though it was declared with + a prototype.) The type need not be known at compile time, but only + known-type calls are efficiently compiled. Limitations: + \begin{itemize} + \item Structure type return values are not implemented. + \item Passing of structures by value is not implemented. + \end{itemize} +\end{defun} + +Here is an example which allocates a \code{(struct foo)}, calls a foreign +function to initialize it, then returns a Lisp vector of all the +\code{(* (struct foo))} objects filled in by the foreign call: + +\begin{lisp} +;; Allocate a foo on the stack. +(with-alien ((f (struct foo))) + ;; + ;; Call some C function to fill in foo fields. + (alien-funcall (extern-alien "mangle_foo" (function void (* foo))) + (addr f)) + ;; + ;; Find how many foos to use by getting the A field. + (let* ((num (slot f 'a)) + (result (make-array num))) + ;; + ;; Get a pointer to the array so that we don't have to keep + ;; extracting it: + (with-alien ((a (* (array (* (struct foo)) 100)) (addr (slot f 'b)))) + ;; + ;; Loop over the first N elements and stash them in the + ;; result vector. + (dotimes (i num) + (setf (svref result i) (deref (deref a) i))) + result))) +\end{lisp} + + +\subsection{The def-alien-routine Macro} + +\begin{defmac}{alien:}{def-alien-routine}{\var{name} \var{result-type} + \mstar{(\var{aname} \var{atype} \mopt{style})}} + + This macro is a convenience for automatically generating Lisp + interfaces to simple foreign functions. The primary feature is the + parameter style specification, which translates the C + pass-by-reference idiom into additional return values. + + \var{name} is usually a string external symbol, but may also be a + symbol Lisp name or a list of the foreign name and the Lisp name. + If only one name is specified, the other is automatically derived, + (\pxlref{external-aliens}.) + + \var{result-type} is the Alien type of the return value. Each + remaining subform specifies an argument to the foreign function. + \var{aname} is the symbol name of the argument to the constructed + function (for documentation) and \var{atype} is the Alien type of + corresponding foreign argument. The semantics of the actual call + are the same as for \funref{alien-funcall}. \var{style} should be + one of the following: + \begin{Lentry} + \item[\kwd{in}] specifies that the argument is passed by value. + This is the default. \kwd{in} arguments have no corresponding + return value from the Lisp function. + + \item[\kwd{out}] specifies a pass-by-reference output value. The + type of the argument must be a pointer to a fixed sized object + (such as an integer or pointer). \kwd{out} and \kwd{in-out} + cannot be used with pointers to arrays, records or functions. An + object of the correct size is allocated, and its address is passed + to the foreign function. When the function returns, the contents + of this location are returned as one of the values of the Lisp + function. + + \item[\kwd{copy}] is similar to \kwd{in}, but the argument is copied + to a pre-allocated object and a pointer to this object is passed + to the foreign routine. + + \item[\kwd{in-out}] is a combination of \kwd{copy} and \kwd{out}. + The argument is copied to a pre-allocated object and a pointer to + this object is passed to the foreign routine. On return, the + contents of this location is returned as an additional value. + \end{Lentry} + Any efficiency-critical foreign interface function should be inline + expanded by preceding \code{def-alien-routine} with: + +\begin{lisp} +(declaim (inline \var{lisp-name})) +\end{lisp} + + In addition to avoiding the Lisp call overhead, this allows + pointers, word-integers and floats to be passed using non-descriptor + representations, avoiding consing (\pxlref{non-descriptor}.) +\end{defmac} + + +\subsection{def-alien-routine Example} + +Consider the C function \code{cfoo} with the following calling convention: + +\begin{example} +/* a for update + * i out + */ +void cfoo (char *str, char *a, int *i); +\end{example} + +which can be described by the following call to \code{def-alien-routine}: + +\begin{lisp} +(def-alien-routine "cfoo" void + (str c-string) + (a char :in-out) + (i int :out)) +\end{lisp} + +The Lisp function \code{cfoo} will have two arguments (\var{str} and \var{a}) +and two return values (\var{a} and \var{i}). + + +\subsection{Calling Lisp from C} + +% Calling Lisp functions from C is sometimes possible, but is rather hackish. +% See \code{funcall0} ... \code{funcall3} in the \file{lisp/arch.h}. The +% arguments must be valid \cmucl{} object descriptors (e.g. fixnums must be +% left-shifted by 2.) See \file{compiler/generic/objdef.lisp} or the derived +% file \file{lisp/internals.h} for details of the object representation. +% \file{lisp/internals.h} is mechanically generated, and is not part of the +% source distribution. It is distributed in the \file{docs/} directory of the +% binary distribution. + +% Note that the garbage collector moves objects, and won't be able to fix up any +% references in C variables, so either turn GC off or don't keep Lisp pointers +% in C data unless they are to statically allocated objects. You can use +% \funref{purify} to place live data structures in static space so that they +% won't move during GC. + +\cmucl{} supports calling Lisp from C via the \funref{def-callback} +macro: + +\begin{defmac}{alien:}{def-callback}{\var{name} (\var{return-type} + \mstar{(arg-name arg-type)}) \ampbody{} \var{body}} + This macro defines a Lisp function that can be called from C and a + Lisp variable. The arguments to the function must be alien types, + and the return type must also be an alien type. This Lisp function + can be accessed via the \funref{callback} macro. + + \var{name} is the name of the Lisp function. It is also the name of + a variable to be used by the \code{callback} macro. + + \var{return-type} is the return type of the function. This must be + a recognized alien type. + + \var{arg-name} specifies the name of the argument to the function, + and the argument has type \var{arg-type}, which must be an alien type. +\end{defmac} + +\begin{defmac}{alien:}{callback}{\var{callback-symbol}} + This macro extracts the appropriate information for the function + named \var{callback-symbol} so that it can be called by a C + function. \var{callback-symbol} must be a symbol created by the + \code{def-callback} macro. +\end{defmac} + +\begin{defmac}{alien:}{callback-funcall}{\var{callback-name} \amprest{} + \var{args}} + This macro does the necessary stuff to call the callback named + \var{callback-name} with the given arguments. +\end{defmac} + +\subsection{Callback Example} + +Here is a simple example of using callbacks. +\begin{lisp} +(use-package :alien) +(use-package :c-call) + +(def-callback foo (int (arg1 int) (arg2 int)) + (format t "~&foo: ~S, ~S~%" arg1 arg2) + (+ arg1 arg2)) + +(defun test-foo () + (callback-funcall foo 555 444444)) +\end{lisp} + +In this example, the callback function \code{foo} is defined which +takes two C \code{int} parameters and returns a \code{int}. As this +shows, we can use arbitrary Lisp inside the function. + +The function \code{test-foo} shows how we can call this callback +function from Lisp. The macro \code{callback} extracts the necessary +information for the callback function \code{foo} which can be +converted into a pointer which we can call via \code{alien-funcall}. + +The following code is a more complete example where a foreign routine +calls our Lisp routine. +\begin{lisp} +(use-package :alien) +(use-package :c-call) + +(def-alien-routine qsort void + (base (* t)) + (nmemb int) + (size int) + (compar (* (function int (* t) (* t))))) + +(def-callback my< (int (arg1 (* double)) + (arg2 (* double))) + (let ((a1 (deref arg1)) + (a2 (deref arg2))) + (cond ((= a1 a2) 0) + ((< a1 a2) -1) + (t +1)))) + +(defun test-qsort () + (let ((a (make-array 10 :element-type 'double-float + :initial-contents '(0.1d0 0.5d0 0.2d0 1.2d0 1.5d0 + 2.5d0 0.0d0 0.1d0 0.2d0 0.3d0)))) + (print a) + (qsort (sys:vector-sap a) + (length a) + (alien-size double :bytes) + (alien:callback my<)) + (print a))) +\end{lisp} + +We define the alien routine, \code{qsort}, and a callback, \code{my<}, +to determine whether two \code{double}'s are less than, greater than +or equal to each other. + +The test function \code{test-qsort} shows how we can call the alien +sort routine with our Lisp comparison routine to produce a sorted +array. + +\subsection{Accessing Lisp Arrays} + +Due to the way \cmucl{} manages memory, the amount of memory that can +be dynamically allocated by \code{malloc} or \funref{make-alien} is +limited\footnote{\cmucl{} mmaps a large piece of memory for its own +use and this memory is typically about 256~MB above the start of the C +heap. Thus, only about 256~MB of memory can be dynamically allocated. +In earlier versions, this limit was closer to 8~MB.}. + +To overcome this limitation, it is possible to access the content of +Lisp arrays which are limited only by the amount of physical memory +and swap space available. However, this technique is only useful if +the foreign function takes pointers to memory instead of allocating +memory for itself. In latter case, you will have to modify the +foreign functions. + +This technique takes advantage of the fact that \cmucl{} has +specialized array types (\pxlref{specialized-array-types}) that match +a typical C array. For example, a \code{(simple-array double-float + (100))} is stored in memory in essentially the same way as the C +array \code{double x[100]} would be. The following function allows us +to get the physical address of such a Lisp array: + +\begin{example} +(defun array-data-address (array) + "Return the physical address of where the actual data of an array is +stored. + +ARRAY must be a specialized array type in \cmucl{}. This means ARRAY +must be an array of one of the following types: + + double-float + single-float + (unsigned-byte 32) + (unsigned-byte 16) + (unsigned-byte 8) + (signed-byte 32) + (signed-byte 16) + (signed-byte 8) +" + (declare (type (or (simple-array (signed-byte 8)) + (simple-array (signed-byte 16)) + (simple-array (signed-byte 32)) + (simple-array (unsigned-byte 8)) + (simple-array (unsigned-byte 16)) + (simple-array (unsigned-byte 32)) + (simple-array single-float) + (simple-array double-float) + (simple-array (complex single-float)) + (simple-array (complex double-float))) + array) + (optimize (speed 3) (safety 0)) + (ext:optimize-interface (safety 3))) + ;; with-array-data will get us to the actual data. However, because + ;; the array could have been displaced, we need to know where the + ;; data starts. + (lisp::with-array-data ((data array) + (start) + (end)) + (declare (ignore end)) + ;; DATA is a specialized simple-array. Memory is laid out like this: + ;; + ;; byte offset Value + ;; 0 type code (should be 70 for double-float vector) + ;; 4 4 * number of elements in vector + ;; 8 1st element of vector + ;; ... ... + ;; + (let ((addr (+ 8 (logandc1 7 (kernel:get-lisp-obj-address data)))) + (type-size + (let ((type (array-element-type data))) + (cond ((or (equal type '(signed-byte 8)) + (equal type '(unsigned-byte 8))) + 1) + ((or (equal type '(signed-byte 16)) + (equal type '(unsigned-byte 16))) + 2) + ((or (equal type '(signed-byte 32)) + (equal type '(unsigned-byte 32))) + 4) + ((equal type 'single-float) + 4) + ((equal type 'double-float) + 8) + (t + (error "Unknown specialized array element type")))))) + (declare (type (unsigned-byte 32) addr) + (optimize (speed 3) (safety 0) (ext:inhibit-warnings 3))) + (system:int-sap (the (unsigned-byte 32) + (+ addr (* type-size start))))))) +\end{example} + +We note, however, that the system function +\findexed{system:vector-sap} will do the same thing as above does. + +Assume we have the C function below that we wish to use: + +\begin{example} + double dotprod(double* x, double* y, int n) + \{ + int k; + double sum = 0; + + for (k = 0; k < n; ++k) \{ + sum += x[k] * y[k]; + \} + return sum; + \} +\end{example} + +The following example generates two large arrays in Lisp, and calls the C +function to do the desired computation. This would not have been +possible using \code{malloc} or \code{make-alien} since we need about +16 MB of memory to hold the two arrays. + +\begin{example} + (alien:def-alien-routine "dotprod" c-call:double + (x (* double-float) :in) + (y (* double-float) :in) + (n c-call:int :in)) + + (defun test-dotprod () + (let ((x (make-array 10000 :element-type 'double-float + :initial-element 2d0)) + (y (make-array 10000 :element-type 'double-float + :initial-element 10d0))) + (sys:without-gcing + (let ((x-addr (sys:vector-sap x)) + (y-addr (sys:vector-sap y))) + (dotprod x-addr y-addr 10000))))) +\end{example} + +In this example, we have used \code{sys:vector-sap} instead of +\code{array-data-address}, but we could have used \code{(sys:int-sap + (array-data-address x))} as well. + +Also, we have wrapped the inner \code{let} expression in a +\code{sys:without-gcing} that disables garbage collection for the +duration of the body. This will prevent garbage collection from +moving \code{x} and \code{y} arrays after we have obtained the (now +erroneous) addresses but before the call to \code{dotprod} is made. + + +\section{Step-by-Step Alien Example} + +This section presents a complete example of an interface to a somewhat +complicated C function. This example should give a fairly good idea +of how to get the effect you want for almost any kind of C function. +Suppose you have the following C function which you want to be able to +call from Lisp in the file \file{test.c}: + +\begin{verbatim} +struct c_struct +{ + int x; + char *s; +}; + +struct c_struct *c_function (i, s, r, a) + int i; + char *s; + struct c_struct *r; + int a[10]; +{ + int j; + struct c_struct *r2; + + printf("i = %d\n", i); + printf("s = %s\n", s); + printf("r->x = %d\n", r->x); + printf("r->s = %s\n", r->s); + for (j = 0; j < 10; j++) printf("a[%d] = %d.\n", j, a[j]); + r2 = (struct c_struct *) malloc (sizeof(struct c_struct)); + r2->x = i + 5; + r2->s = "A C string"; + return(r2); +}; +\end{verbatim} + +It is possible to call this function from Lisp using the file \file{test.lisp} +whose contents is: + +\begin{lisp} +;;; -*- Package: test-c-call -*- +(in-package "TEST-C-CALL") +(use-package "ALIEN") +(use-package "C-CALL") + +;;; Define the record c-struct in Lisp. +(def-alien-type nil + (struct c-struct + (x int) + (s c-string))) + +;;; Define the Lisp function interface to the C routine. It returns a +;;; pointer to a record of type c-struct. It accepts four parameters: +;;; i, an int; s, a pointer to a string; r, a pointer to a c-struct +;;; record; and a, a pointer to the array of 10 ints. +;;; +;;; The INLINE declaration eliminates some efficiency notes about heap +;;; allocation of Alien values. +(declaim (inline c-function)) +(def-alien-routine c-function + (* (struct c-struct)) + (i int) + (s c-string) + (r (* (struct c-struct))) + (a (array int 10))) + +;;; A function which sets up the parameters to the C function and +;;; actually calls it. +(defun call-cfun () + (with-alien ((ar (array int 10)) + (c-struct (struct c-struct))) + (dotimes (i 10) ; Fill array. + (setf (deref ar i) i)) + (setf (slot c-struct 'x) 20) + (setf (slot c-struct 's) "A Lisp String") + + (with-alien ((res (* (struct c-struct)) + (c-function 5 "Another Lisp String" (addr c-struct) ar))) + (format t "Returned from C function.~%") + (multiple-value-prog1 + (values (slot res 'x) + (slot res 's)) + ;; + ;; Deallocate result {\em after} we are done using it. + (free-alien res))))) +\end{lisp} + +To execute the above example, it is necessary to compile the C routine as +follows: + +\begin{example} +cc -c test.c +\end{example} + +In order to enable incremental loading with some linkers, you may need to say: + +\begin{example} +cc -G 0 -c test.c +\end{example} + +Once the C code has been compiled, you can start up Lisp and load it in: + +\begin{example} +% lisp +;;; Lisp should start up with its normal prompt. + +;;; Compile the Lisp file. This step can be done separately. You don't have +;;; to recompile every time. +* (compile-file "test.lisp") + +;;; Load the foreign object file to define the necessary symbols. This must +;;; be done before loading any code that refers to these symbols. next block +;;; of comments are actually the output of LOAD-FOREIGN. Different linkers +;;; will give different warnings, but some warning about redefining the code +;;; size is typical. +* (load-foreign "test.o") + +;;; Running library:load-foreign.csh... +;;; Loading object file... +;;; Parsing symbol table... +Warning: "_gp" moved from #x00C082C0 to #x00C08460. +Warning: "end" moved from #x00C00340 to #x00C004E0. + +;;; o.k. now load the compiled Lisp object file. +* (load "test") + +;;; Now we can call the routine that sets up the parameters and calls the C +;;; function. +* (test-c-call::call-cfun) + +;;; The C routine prints the following information to standard output. +i = 5 +s = Another Lisp string +r->x = 20 +r->s = A Lisp string +a[0] = 0. +a[1] = 1. +a[2] = 2. +a[3] = 3. +a[4] = 4. +a[5] = 5. +a[6] = 6. +a[7] = 7. +a[8] = 8. +a[9] = 9. +;;; Lisp prints out the following information. +Returned from C function. +;;; Return values from the call to test-c-call::call-cfun. +10 +"A C string" +* +\end{example} + +If any of the foreign functions do output, they should not be called +from within \hemlock{}. Depending on the situation, various strange +behavior occurs. Under X, the output goes to the window in which Lisp +was started; on a terminal, the output will overwrite the \hemlock{} +screen image; in a \hemlock{} slave, standard output is +\file{/dev/null} by default, so any output is discarded. diff --git a/doc/cmu-user/cmu-user.dict b/doc/cmu-user/cmu-user.dict new file mode 100644 index 0000000000..ce86160b64 --- /dev/null +++ b/doc/cmu-user/cmu-user.dict @@ -0,0 +1,460 @@ +'BAR +VARREF +'TEST +UPCASE +ENDLISP +SUBSEQ +ENDDEFUN +FUNARGS +GENSYM +VARS +UNINTERNED +VAR +VSOURCE +CLISP +COND +MYSTUFF +TRADEOFFS +PATHNAME +LLISP +CMUCL +REF +YETMOREKEYS +CLEANUP +ARGS +DEFUN +ZOQ +FOO +'S +CLTL +MACROEXPANDS +MACROEXPANSION +PROXY +ERRORFUL +EQ +ECASE +PYTHON +DEFMACRO +PROMISCUOUS +FLAMAGE +DEBUGGABILITY +FEATUREFULNESS +DEBUGGABLE +ENDDEFVAR +MACROEXPANDED +DEFVAR +ENDDEFMAC +KWD +MGROUP +MSTAR +DEFMAC +OFFS +NOTINLINE +TRADEOFF +FUNCALL +SOMEVAL +SOMEFUN +CM +DEFTYPE +CONSING +FIXNUMS +BIGNUMS +FROB +'FOO +RECOMPILES +FTYPE +TYPECASE +TYPEP +UNTYPED +UNIONED +GLOBALS +MODICUM +MACREF +SLEAZING +ES +STEELE +ETYPECASE +'EQL +'IDENTITY +'FUN +LOCALFUN +ISQRT +ODDP +MYFUN +POS +ZOW +YOW +'YOW +CADR +ZEROP +RES +EXPT +PARED +PUSHING +'ING +RPLACD +IOTA +NTHCDR +NTH +CADDDR +RPLACA +CADDR +FIENDS +SQRT +'SQRT +LISPY +BLANKSPACE +MYCHAPTER +UNENCAPSULATED +ENCAPSULATIONS +UNENCAPSULATE +UNTRACED +UNTRACE +EVALED +SPEC +PUSHES +TRUENAME +MYMAC +UNINFORMATIVE +FOOBAR +BAZ +BACKQUOTE +MALFORMED +MOREKEYS +FUNREF +QUIRKS +UNDILUTED +DISASSEMBLY +NAN +DENORMALIZED +ENDDEFCONST +DEFCONST +HASHTABLES +EFF +OBFUSCATING +SNOC +GRUE +GORP +FLO +NUM +VEC +MULTBY +SOMEOTHERFUN +'CHAR +NOTP +TESTP +FUNVAR +RAZ +ZUG +XFF +IO +GC'ING +EXT +MEGABYTE +SYS +UX +ED +MATCHMAKER +DIRED +PCL +CLOS +CONFORMANCE +ENDDEFCON +DEFCON +DECLAIM +DEFSTRUCT +ENUM +EXTERN +LOWERCASING +DEREFERENCED +MOPT +STRUCT +DEFTP +ENDDEFTP +MALLOC +CSH +PXLREF +ATYPE +CONSTRUCTUED +ANAME +PXREF +ENV +ONECOLUMN +TP +VR +FN +PRINTINDEX +UNNUMBERED +TWOCOLUMN +TLF +UNCOMPILED +DEACTIVATE +CALLABLE +UNREFERENCED +SUPPLIEDP +INTERNING +UNHANDLED +BACKTRACING +TEX +OOB +OBJ +PRIN +OBJS +GP +LINKERS +CC +AR +CFUN +INTS +SIZEOF +PRINTF +CFOO +SUBFORM +SVREF +STASH +FOOS +LC +LD +'N +'X +ERRNO +UPPERCASING +EXPR +ADDR +'STR +STR +DEREF +PTR +SWINDOW +IWINDOW +'SLIDER +DRAWABLE +'KEY +'EXT +TIMEOUTS +'MY +ID +PIXMAPS +'EQ +FUNCALLED +XWINDOW +'IH +SIGSTOP +GETPID +SIGTSTP +SCP +SIGINT +IH +CNT +GENERALRETURN +DEFMACX +'NUKEGARBAGE +GR +HASSLE +PREPENDS +TIMEOUT +FD +MSG +SYSCALL +UNHELPFUL +PREPENDED +VM +PAGEREF +INT +PORTSID +PORTSNAME +SERVPORT +KERN +DATATYPES +TTY +STDERR +STDOUT +STDIN +CMD +AUX +PS +UNACCOUNTED +RUNTIMES +PROFILER +UNPROFILE +REPROFILED +UNPROFILED +CF +ELT +VOPS +MAPCAR +OPTIONALS +CONSES +CONTORTIONS +ALISTS +ALIST +ASSOC +EXP +MYEXP +DEFCONSTANT +INCF +MEMQ +COERCIONS +EQL +LOGAND +AREF +CONSP +TYPEN +LOGIOR +EQUIV +SUPERTYPE +DEFMETHOD +SUBFORMS +CERROR +PSETQ +TAGBODY +DOTIMES +PLOQ +ROQ +SPECS +MPLUS +STEPPER +FDEFINITION +FUNCALLABLE +ST +BR +DB +LB +LL +HFILL +PP +VPRINT +TH +ARGLISTS +SETQ +NAMESPACE +SUBFUNCTION +BACKTRACE +'B +FLET +ARG +'A +CPSUBINDEX +PROGN +CONTRIB +WEEKDAYS +GREENWICH +TIMEZONE +DEST +WEEKDAY +JAN +CINDEX +NAMESTRING +PATHNAMES +FASL +SIGSEGV +PLIST +'ABLE +SETF +PID +EXECVE +DEV +SUBPROCESS +PTY +'TH +UNSUPPLIED +DEFVARX +GCS +CONSED +GC'ED +GC +TRASHING +XLIB +CL +HI +COMMONLOOPS +CTRL +XLREF +DEFUNX +DEFCONSTX +SUBSUBSECTION +VINDEXED +TINDEXED +RESEARCHCREDIT +EM +WHOLEY +SKEF +KAUFMANN +TODD +KOLOJEJCHICK +BUSDIECKER +'' +NOINDENT +MOORE +TIM +LOTT +LEINEN +HALLGREN +GLEICHAUF +DUNNING +TED +BADER +MYLISP +NOINIT +FINDEXED +INIT +EVAL +SUBDIRECTORIES +COPYRIGHTED +FTP +LANG +COMP +MEG +MEGABYTES +UNCOMPRESS +CD +OS +USERNAME +SLISP +RT +LIB +SETENV +SAMP +SETPATH +LOGIN +MISC +USR +MODMISC +TXT +DOC +EXECUTABLES +PERQ +UNTAGGED +BENCHMARKING +WINDOWING +INTRO +DOCS +EDU +AFS +VSPACE +IFINFO +DIR +SETFILENAME +TABLEOFCONTENTS +PAGENUMBERING +CLEARPAGE +MAKETITLE +ARPASUPPORT +CITATIONINFO +TRNUMBER +IFTEX +SUNOS +SPARC +DECSTATIONS +THEABSTRACT +DEF +KY +CP +NEWINDEX +ALWAYSREFILL +PAGESTYLE +CMULISP +TITLEPAGE +ELISP +LATEXINFO +DOCUMENTSTYLE diff --git a/doc/cmu-user/cmu-user.hva b/doc/cmu-user/cmu-user.hva new file mode 100644 index 0000000000..a5a4e2dd21 --- /dev/null +++ b/doc/cmu-user/cmu-user.hva @@ -0,0 +1,189 @@ +% -*- tex -*- +% +% This file contains macros which are used when translating +% to HTML using Hevea. By Luc Maranget and Eric Marsden. + +\newif\ifhmode\hmodefalse +\newcommand{\pdfinfo}[1]{\@print{}} +\let\hbox\mbox +\def\hfil{} +\def\hfill{} +\newcommand{\parbox}[3][]{\mbox{#3}} +\newcommand{\lengthtest}[1]{true} +\newenvironment{minipage}[2][]{}{} +\newcommand{\layout}[5][] + {\@open{DIV}{align=left}#5% + [#4] \\ + \begin{tabbing} + \fcnname{#1}\fcnname{#2} #3 \@print{   } + \end{tabbing} + \@close{DIV}} +\newcommand{\keys}[1]{\code{\&key}\@print{ }\= #1} + +\renewcommand{\textgreater}{\@print{>}} +\renewcommand{\textless}{\@print{<}} + +% \newcommand{\layout}[4][] +% {\begin{tabular} +% {llp{10cm}@{\hspace{10cm}}r}\fcnname{#1} & +% \fcnname{#2} & +% \begin{flushleft}#3\end{flushleft} & +% [#4] +% \end{tabular}} + + +\newcommand{\fcntype}[1]{\@styleattr{TT}{class=function-type}#1\@clearstyle} +\newcommand{\argtype}[1]{\@styleattr{TT}{class=argument-type}#1\@clearstyle} +\newcommand{\fcnname}[1]{\@styleattr{TT}{class=function-name}#1\@clearstyle} +\newcommand{\var}[1]{\@styleattr{TT}{class=variable}#1\@clearstyle} +\newcommand{\code}[1]{\@styleattr{TT}{class=code}#1\@clearstyle} +\newcommand{\file}[1]{\@styleattr{TT}{class=filename}#1\@clearstyle} + +%% Define a new type +%% +%% \begin{deftp}{typeclass}{typename}{args} +%% some description +%% \end{deftp} +\newenvironment{deftp}[3] + {\layout{#2}{\var{#3}}{#1}% + {\bigskip\index[types]{#2|textbf}} + \begin{quote}} + {\end{quote}} + +%% Define a function +%% +%% \begin{defun}[suffix]{pkg}{name}{params} +%% \defunx[pkg]{name}{params} +%% description of function +%% \end{defun} +\newenvironment{defun}[4][] + {\layout[#2]{#3}{#4}{Function}% + {\defunvspace\fnindexbold{#3}\label{FN:#3#1}} + \begin{quote}} + {\end{quote}} +\newcommand{\defunx}[3][\mbox{}]{% + \layout[#1]{#2}{#3}{Function}% + {\fnindexbold{#2}\label{FN:#2}}} + +%% Define a macro +%% +%% \begin{defmac}[suffix]{pkg}{name}{params} +%% \defmacx[pkg]{name}{params} +%% description of macro +%% \end{defmac} +\newenvironment{defmac}[4][]{% + \layout[#2]{#3}{#4}{Macro}% + {\defunvspace\fnindexbold{#3}\label{FN:#3#1}} + \begin{quote}} + {\end{quote}} +\newcommand{\defmacx}[3][\mbox{}]{% + \layout[#1]{#2}{#3}{Function}% + {\fnindexbold{#2}\label{FN:#2}}} + +%% Define a variable +%% +%% \begin{defvar}{pkg}{name} +%% \defvarx[pkg]{name} +%% description of defvar +%% \end{defvar} +\newenvironment{defvar}[2]{% + \layout[#1]{*#2*}{}{Variable}% + {\defunvspace\vrindexbold{#2}\label{VR:#2}} + \begin{quote}} + {\end{quote}} +\newcommand{\defvarx}[2][\mbox{}]{% + \layout[#1]{*#2*}{}{Variable}% + {\vrindexbold{#2}\label{VR:#2}}} + +%% Define a constant +%% +%% \begin{defconst}{pkg}{name} +%% \defconstx[pkg]{name} +%% description of defconst +%% \end{defconst} +\newenvironment{defconst}[2]{% + \layout[#1]{#2}{}{Constant}% + {\defunvspace} + \begin{quote}} + {\end{quote}} +\newcommand{\defconstx}[2][\mbox{}]{% + \layout[#1]{#2}{}{Constant}{}} + + + +% \@hr[NOSHADE]{.8\linewidth}{} +\newenvironment{example} + {\@open{BLOCKQUOTE}{class=example}\begin{alltt}} + {\end{alltt}\@close{BLOCKQUOTE}} +\newenvironment{lisp} + {\@open{BLOCKQUOTE}{CLASS=lisp}\begin{alltt}} + {\end{alltt}\@close{BLOCKQUOTE}} +\newcommand{\cmucl}{{\scshape cmucl}} + + +% there are no page numbers in HTML, so we need to override certain +% cross-referencing macros +\newcommand{\pxlref}[1]{see section~\ref{#1}} +\newcommand{\xlref}[1]{See section~\ref{#1}} +\newcommand{\funref}[1]{\findexed{#1}} +\newcommand{\specref}[1]{\findexed{#1}} +\newcommand{\macref}[1]{\findexed{#1}} +\newcommand{\varref}[1]{\vindexed{#1}} +\newcommand{\conref}[1]{\conindexed{#1}} +\newcommand{\ctrl}[1]{\code{Ctrl-#1}} +\newcommand{\result}{==>} +\newcommand{\myequiv}{<==>} +\newcommand{\mopt}[1]{\code{\{#1\}}} +\newcommand{\mstar}[1]{\code{\{#1\}}$^*$} +\newcommand{\mplus}[1]{\code{\{#1\}}$^+$} +\newcommand{\mgroup}[1]{\code{\{#1\}}} + + +% disable ``this document generated by'' footer +\def\@footer{} + +% \htmlhead{\@print{ +% CMUCL -> +% Documentation
} +% \@hr[NOSHADE]{.8\linewidth}{}\@print{
}} +% \htmlfoot{\@hr[NOSHADE]{.99\linewidth}{} +% \copyright{} 1995-2003 CMUCL Project} + + +\let\orig@meta=\@meta +\renewcommand{\@meta}{% +\orig@meta +\begin{rawhtml} + + +\end{rawhtml}} + + +% when generating HTML, produce file names based on the chapter name +% instead of machine-generated numbers +\let\orig@input\input +\renewcommand{\input}[1]{\orig@input{#1}\cutname{#1.html}} +\htmlprefix{CMUCL User's Manual: } + + +% generate HTML with section headers on a blue background + +\setcounter{cuttingdepth}{10} + +\input{report.hva} +%%\input{fancysection.hva} +\usepackage{color} +\definecolor{chapter}{rgb}{1, 1, 0.74} +\definecolor{part}{rgb}{1, 1, 0.81} +\definecolor{section}{rgb}{1, 1, 0.83} +\definecolor{subsection}{rgb}{1, 1, 0.89} +\definecolor{subsubsection}{rgb}{1, 1, 0.93} +\newstyle{.chapter}{padding:0.5ex;background-color:\@getstylecolor{chapter}} +\newstyle{.section} {padding:.5ex;background-color:\@getstylecolor{section}}% +\newstyle{.subsection} {padding:0.3ex;background-color:\@getstylecolor{subsection}}% +\newstyle{.subsubsection} {padding:0.5ex;background-color:\@getstylecolor{subsubsection}}% +\newstyle{.paragraph} {padding:0.5ex;background-color:\@getstylecolor{paragraph}}% +\renewcommand{\@bodyargs}{} + + +% EOF diff --git a/doc/cmu-user/cmu-user.tex b/doc/cmu-user/cmu-user.tex new file mode 100644 index 0000000000..743300e28b --- /dev/null +++ b/doc/cmu-user/cmu-user.tex @@ -0,0 +1,146 @@ +%% cmu-user.tex --- CMUCL User's Manual +%% +%% 2001-04-05 Eric Marsden +%% Modifications to work with hevea and pdflatex. +%% +%% Aug 1997 Raymond Toy +%% This is a modified version of the original CMUCL User's Manual. +%% The key changes are modification of this file to use standard +%% LaTeX2e. This means latexinfo isn't going to work anymore. +%% However, Latex2html support has been added. +%% +%% Jan 1998 Paul Werkowski +%% A few of the packages below are not part of the standard LaTeX2e +%% distribution, and must be obtained from a repository. At this time +%% I was able to fetch from +%% ftp.cdrom.com:pub/tex/ctan/macros/latex/contrib/supported/ +%% camel/index.ins +%% camel/index.dtx +%% calc/calc.ins +%% calc/calc.dtx +%% changebar/changebar.ins +%% changebar/changebar.dtx +%% One runs latex on the .ins file to produce .tex and/or .sty +%% files that must be put in a path searched by latex. +%% +%% Note all of the required packages are included in the teTeX distribution, +%% and a current version of latex2html can be obtained from: +%% http://saftsack.fs.uni-bayreuth.de/~latex2ht/ + +%% Delete "[a4paper]" if you don't want this formatted for A4 paper. +\documentclass[a4paper]{report} +\usepackage{xspace} +\usepackage{alltt} +\usepackage{index} +\usepackage{ifpdf} +\usepackage{ifthen} +\usepackage{calc} +\usepackage{sectsty} +\usepackage{varioref} +\usepackage[hyperindex=false,colorlinks=false,urlcolor=blue]{hyperref} +%% \usepackage{html} +\usepackage{typehtml} + +\input{macros} + +\title{CMUCL User's Manual} +\author{Robert A. MacLachlan, \textit{Editor}} +\newcommand{\keywords}{lisp, Common Lisp, manual, compiler, programming +language implementation, programming environment} + +\date{October 2017 \\ 21c} + + +\begin{document} + +\begin{titlepage} + \makeatletter + \vspace{60pt} + \begin{center} + \rule{\linewidth}{0.7mm} + \vspace{3em} + {\Huge \@title \par} + \vspace{4em} + {\large + \begin{tabular}[t]{c} + \@author + \end{tabular}\par} + \vspace{2em} + {\large \@date \par} + \vspace{2em} + \rule{\linewidth}{0.7mm} + \end{center} + \vfill + + \begin{quotation} + \cmucl{} is a free, high-performance implementation of the Common Lisp + programming language, which runs on most major Unix platforms. It + mainly conforms to the ANSI Common Lisp Standard. \cmucl{} features a + sophisticated native-code compiler, a foreign function interface, a + graphical source-level debugger, an interface to the X11 Window + System, and an Emacs-like editor. + + \medskip \textbf{Keywords}: \keywords + \end{quotation} + + \vspace{5cm} + + This manual is based on CMU Technical Report CMU-CS-92-161, edited by + Robert A. MacLachlan, dated July 1992. + + \thispagestyle{empty} + \makeatother +\end{titlepage} + +\ifpdf +\pdfinfo{ +/Author (Robert A. MacLachlan, ed) +/Title (CMUCL User's Manual) +/Keywords (\keywords) +} +% Add section numbers to the bookmarks, and open 2 levels by default. +\hypersetup{bookmarksnumbered=true, + bookmarksopen=true, + bookmarksopenlevel=2} +\fi + +% \maketitle + +\pagestyle{headings} +\pagenumbering{roman} +\tableofcontents + +\clearpage +\pagenumbering{arabic} + +\input{introduction} +\input{extensions} +\input{debugger} +\input{compiler} +\input{compiler-hint} +\input{unix} +\input{serve-event} +\input{aliens} +\input{ipc} +\input{internet} +\input{debug-internals} +\input{cross-referencing} +\input{unicode} + +\twocolumn +\cindex{Function Index} +\printindex[funs] + +\twocolumn +\cindex{Variable Index} +\printindex[vars] + +\twocolumn +\cindex{Type Index} +\printindex[types] + +\onecolumn +\cindex{Concept Index} +\printindex[concept] + +\end{document} diff --git a/doc/cmu-user/cmucl.css b/doc/cmu-user/cmucl.css new file mode 100644 index 0000000000..c65761f2f4 --- /dev/null +++ b/doc/cmu-user/cmucl.css @@ -0,0 +1,85 @@ +html { + color: black; + background-color: white; + margin-left: 4%; + margin-right: 2%; +} + +h1 { + text-align: center; + font-family: Helvetica, Arial, sans-serif +} + +h2 { + color: #515e4b; + font-family: Helvetica, Arial, sans-serif +} + +h3 { + font-family: Helvetica, Arial, sans-serif; +} + +.lisp { + background: #aaaaaa; + border:solid #aaaaaa 0.1px; + white-space:pre; + font-family: sans-serif; +} + +.example { + background: #cccccc; + border:solid #cccccc 0.1px; + white-space:pre; +} + +.code { + background: #faf0e6; + border:solid #faf0e6 1px; + white-space:pre-line; +} + +.technical { + background: #dddddd; + border: solid black 1px; + padding-left: 1em; + padding-right: 1em; + padding-top: 1ex; + padding-bottom: 1ex; + font-size: smaller; + font-stretch: semi-condensed; + margin-left: 10%; +} + +.credits { + background: #eeeeee; + font-stretch: condensed; + font-size: 0.8em; + font-family: Helvetica, Arial, sans-serif; + text-align: right; +} + +.function-name { + color: rgb(25%,0%,0%); +} + +.variable { + color: rgb(0%,25%,0%); +} + + +A:link +{ + text-decoration: none +} +A:active +{ + text-decoration: none +} +A:visited +{ + text-decoration: none +} +A:hover +{ + text-decoration: underline +} diff --git a/doc/cmu-user/compiler-hint.tex b/doc/cmu-user/compiler-hint.tex new file mode 100644 index 0000000000..2e68a37fb3 --- /dev/null +++ b/doc/cmu-user/compiler-hint.tex @@ -0,0 +1,4138 @@ +\chapter{Advanced Compiler Use and Efficiency Hints} +\label{advanced-compiler} + +\credits{by Robert MacLachlan} + + +\section{Advanced Compiler Introduction} + +In \cmucl{}, as with any language on any computer, the path to efficient +code starts with good algorithms and sensible programming techniques, +but to avoid inefficiency pitfalls, you need to know some of this +implementation's quirks and features. This chapter is mostly a fairly +long and detailed overview of what optimizations \python{} does. +Although there are the usual negative suggestions of inefficient +features to avoid, the main emphasis is on describing the things that +programmers can count on being efficient. + +The optimizations described here can have the effect of speeding up +existing programs written in conventional styles, but the potential +for new programming styles that are clearer and less error-prone is at +least as significant. For this reason, several sections end with a +discussion of the implications of these optimizations for programming +style. + + + +\subsection{Types} + +\python{}'s support for types is unusual in three major ways: +\begin{itemize} + +\item Precise type checking encourages the specific use of type + declarations as a form of run-time consistency checking. This + speeds development by localizing type errors and giving more + meaningful error messages. \xlref{precise-type-checks}. \python{} + produces completely safe code; optimized type checking maintains + reasonable efficiency on conventional hardware + (\pxlref{type-check-optimization}.) + +\item Comprehensive support for the \clisp{} type system makes complex + type specifiers useful. Using type specifiers such as \code{or} and + \code{member} has both efficiency and robustness advantages. + \xlref{advanced-type-stuff}. + +\item Type inference eliminates the need for some declarations, and + also aids compile-time detection of type errors. Given detailed + type declarations, type inference can often eliminate type checks + and enable more efficient object representations and code sequences. + Checking all types results in fewer type checks. See sections + \ref{type-inference} and \ref{non-descriptor}. +\end{itemize} + + +\subsection{Optimization} + +The main barrier to efficient Lisp programs is not that there is no +efficient way to code the program in Lisp, but that it is difficult to +arrive at that efficient coding. \clisp{} is a highly complex +language, and usually has many semantically equivalent ``reasonable'' +ways to code a given problem. It is desirable to make all of these +equivalent solutions have comparable efficiency so that programmers +don't have to waste time discovering the most efficient solution. + +Source level optimization increases the number of efficient ways to +solve a problem. This effect is much larger than the increase in the +efficiency of the ``best'' solution. Source level optimization +transforms the original program into a more efficient (but equivalent) +program. Although the optimizer isn't doing anything the programmer +couldn't have done, this high-level optimization is important because: + +\begin{itemize} +\item The programmer can code simply and directly, rather than + obfuscating code to please the compiler. + +\item When presented with a choice of similar coding alternatives, the + programmer can chose whichever happens to be most convenient, + instead of worrying about which is most efficient. +\end{itemize} + +Source level optimization eliminates the need for macros to optimize +their expansion, and also increases the effectiveness of inline +expansion. See sections \ref{source-optimization} and +\ref{inline-expansion}. + +Efficient support for a safer programming style is the biggest +advantage of source level optimization. Existing tuned programs +typically won't benefit much from source optimization, since their +source has already been optimized by hand. However, even tuned +programs tend to run faster under \python{} because: + +\begin{itemize} +\item Low level optimization and register allocation provides modest + speedups in any program. + +\item Block compilation and inline expansion can reduce function call + overhead, but may require some program restructuring. See sections + \ref{inline-expansion}, \ref{local-call} and + \ref{block-compilation}. + +\item Efficiency notes will point out important type declarations that + are often missed even in highly tuned programs. + \xlref{efficiency-notes}. + +\item Existing programs can be compiled safely without prohibitive + speed penalty, although they would be faster and safer with added + declarations. \xlref{type-check-optimization}. + +\item The context declaration mechanism allows both space and runtime + of large systems to be reduced without sacrificing robustness by + semi-automatically varying compilation policy without addition any + \code{optimize} declarations to the source. + \xlref{context-declarations}. + +\item Byte compilation can be used to dramatically reduce the size of + code that is not speed-critical. \xlref{byte-compile} +\end{itemize} + + +\subsection{Function Call} + +The sort of symbolic programs generally written in \llisp{} often +favor recursion over iteration, or have inner loops so complex that +they involve multiple function calls. Such programs spend a larger +fraction of their time doing function calls than is the norm in other +languages; for this reason \llisp{} implementations strive to make the +general (or full) function call as inexpensive as possible. \python{} +goes beyond this by providing two good alternatives to full call: + +\begin{itemize} +\item Local call resolves function references at compile time, + allowing better calling sequences and optimization across function + calls. \xlref{local-call}. + +\item Inline expansion totally eliminates call overhead and allows + many context dependent optimizations. This provides a safe and + efficient implementation of operations with function semantics, + eliminating the need for error-prone macro definitions or manual + case analysis. Although most \clisp{} implementations support + inline expansion, it becomes a more powerful tool with \python{}'s + source level optimization. See sections \ref{source-optimization} + and \ref{inline-expansion}. +\end{itemize} + + +Generally, \python{} provides simple implementations for simple uses +of function call, rather than having only a single calling convention. +These features allow a more natural programming style: + +\begin{itemize} +\item Proper tail recursion. \xlref{tail-recursion} + +\item Relatively efficient closures. + +\item A \code{funcall} that is as efficient as normal named call. + +\item Calls to local functions such as from \code{labels} are + optimized: +\begin{itemize} + +\item Control transfer is a direct jump. + +\item The closure environment is passed in registers rather than heap + allocated. + +\item Keyword arguments and multiple values are implemented more + efficiently. +\end{itemize} + +\xlref{local-call}. +\end{itemize} + + +\subsection{Representation of Objects} + +Sometimes traditional \llisp{} implementation techniques compare so +poorly to the techniques used in other languages that \llisp{} can +become an impractical language choice. Terrible inefficiencies appear +in number-crunching programs, since \llisp{} numeric operations often +involve number-consing and generic arithmetic. \python{} supports +efficient natural representations for numbers (and some other types), +and allows these efficient representations to be used in more +contexts. \python{} also provides good efficiency notes that warn +when a crucial declaration is missing. + +See section \ref{non-descriptor} for more about object representations and +numeric types. Also \pxlref{efficiency-notes} about efficiency notes. + + +\subsection{Writing Efficient Code} +\label{efficiency-overview} + +Writing efficient code that works is a complex and prolonged process. +It is important not to get so involved in the pursuit of efficiency +that you lose sight of what the original problem demands. Remember +that: +\begin{itemize} + +\item The program should be correct\dash{}it doesn't matter how + quickly you get the wrong answer. + +\item Both the programmer and the user will make errors, so the + program must be robust\dash{}it must detect errors in a way that + allows easy correction. + +\item A small portion of the program will consume most of the + resources, with the bulk of the code being virtually irrelevant to + efficiency considerations. Even experienced programmers familiar + with the problem area cannot reliably predict where these ``hot + spots'' will be. +\end{itemize} + + + +The best way to get efficient code that is still worth using, is to separate +coding from tuning. During coding, you should: +\begin{itemize} + +\item Use a coding style that aids correctness and robustness without + being incompatible with efficiency. + +\item Choose appropriate data structures that allow efficient + algorithms and object representations + (\pxlref{object-representation}). Try to make interfaces abstract + enough so that you can change to a different representation if + profiling reveals a need. + +\item Whenever you make an assumption about a function argument or + global data structure, add consistency assertions, either with type + declarations or explicit uses of \code{assert}, \code{ecase}, etc. +\end{itemize} + +During tuning, you should: +\begin{itemize} + +\item Identify the hot spots in the program through profiling (section + \ref{profiling}.) + +\item Identify inefficient constructs in the hot spot with efficiency + notes, more profiling, or manual inspection of the source. See + sections \ref{general-efficiency} and \ref{efficiency-notes}. + +\item Add declarations and consider the application of optimizations. + See sections \ref{local-call}, \ref{inline-expansion} and + \ref{non-descriptor}. + +\item If all else fails, consider algorithm or data structure changes. + If you did a good job coding, changes will be easy to introduce. +\end{itemize} + + +\section{More About Types in Python} +\label{advanced-type-stuff} +\cpsubindex{types}{in python} + +This section goes into more detail describing what types and declarations are +recognized by \python. The area where \python{} differs most radically from +previous \llisp{} compilers is in its support for types: +\begin{itemize} + +\item Precise type checking helps to find bugs at run time. + +\item Compile-time type checking helps to find bugs at compile time. + +\item Type inference minimizes the need for generic operations, and + also increases the efficiency of run time type checking and the + effectiveness of compile time type checking. + +\item Support for detailed types provides a wealth of opportunity for + operation-specific type inference and optimization. +\end{itemize} + + + +\subsection{More Types Meaningful} + +\clisp{} has a very powerful type system, but conventional \llisp{} +implementations typically only recognize the small set of types +special in that implementation. In these systems, there is an +unfortunate paradox: a declaration for a relatively general type like +\code{fixnum} will be recognized by the compiler, but a highly +specific declaration such as \code{\w{(integer 3 17)}} is totally +ignored. + +This is obviously a problem, since the user has to know how to specify +the type of an object in the way the compiler wants it. A very +minimal (but rarely satisfied) criterion for type system support is +that it be no worse to make a specific declaration than to make a +general one. \python{} goes beyond this by exploiting a number of +advantages obtained from detailed type information. + +Using more restrictive types in declarations allows the compiler to do +better type inference and more compile-time type checking. Also, when +type declarations are considered to be consistency assertions that +should be verified (conditional on policy), then complex types are +useful for making more detailed assertions. + +\python{} ``understands'' the list-style \code{or}, \code{member}, +\code{function}, array and number type specifiers. Understanding +means that: +\begin{itemize} + +\item If the type contains more information than is used in a + particular context, then the extra information is simply ignored, + rather than derailing type inference. + +\item In many contexts, the extra information from these type + specifier is used to good effect. In particular, type checking in + \python{} is \var{precise}, so these complex types can be used + in declarations to make interesting assertions about functions and + data structures (\pxlref{precise-type-checks}.) More specific + declarations also aid type inference and reduce the cost for type + checking. +\end{itemize} + +For related information, \pxlref{numeric-types} for numeric types, and +section \ref{array-types} for array types. + + +\subsection{Canonicalization} +\cpsubindex{types}{equivalence} +\cindex{canonicalization of types} +\cindex{equivalence of types} + +When given a type specifier, \python{} will often rewrite it into a +different (but equivalent) type. This is the mechanism that \python{} +uses for detecting type equivalence. For example, in \python{}'s +canonical representation, these types are equivalent: +\begin{example} +(or list (member :end)) \myequiv (or cons (member nil :end)) +\end{example} +This has two implications for the user: +\begin{itemize} + +\item The standard symbol type specifiers for \code{atom}, + \code{null}, \code{fixnum}, etc., are in no way magical. The + \tindexed{null} type is actually defined to be \code{\w{(member + nil)}}, \tindexed{list} is \code{\w{(or cons null)}}, and + \tindexed{fixnum} is \code{\w{(signed-byte 30)}}. + +\item When the compiler prints out a type, it may not look like the + type specifier that originally appeared in the program. This is + generally not a problem, but it must be taken into consideration + when reading compiler error messages. +\end{itemize} + + +\subsection{Member Types} +\cindex{member types} + +The \tindexed{member} type specifier can be used to represent +``symbolic'' values, analogous to the enumerated types of Pascal. For +example, the second value of \code{find-symbol} has this type: +\begin{lisp} +(member :internal :external :inherited nil) +\end{lisp} +Member types are very useful for expressing consistency constraints on data +structures, for example: +\begin{lisp} +(defstruct ice-cream + (flavor :vanilla :type (member :vanilla :chocolate :strawberry))) +\end{lisp} +Member types are also useful in type inference, as the number of members can +sometimes be pared down to one, in which case the value is a known constant. + + +\subsection{Union Types} +\cindex{union (\code{or}) types} +\cindex{or (union) types} + +The \tindexed{or} (union) type specifier is understood, and is +meaningfully applied in many contexts. The use of \code{or} allows +assertions to be made about types in dynamically typed programs. For +example: + +\begin{lisp} +(defstruct box + (next nil :type (or box null)) + (top :removed :type (or box-top (member :removed)))) +\end{lisp} + +The type assertion on the \code{top} slot ensures that an error will be signaled +when there is an attempt to store an illegal value (such as \kwd{rmoved}.) +Although somewhat weak, these union type assertions provide a useful input into +type inference, allowing the cost of type checking to be reduced. For example, +this loop is safely compiled with no type checks: + +\begin{lisp} +(defun find-box-with-top (box) + (declare (type (or box null) box)) + (do ((current box (box-next current))) + ((null current)) + (unless (eq (box-top current) :removed) + (return current)))) +\end{lisp} + +Union types are also useful in type inference for representing types that are +partially constrained. For example, the result of this expression: +\begin{lisp} +(if foo + (logior x y) + (list x y)) +\end{lisp} +can be expressed as \code{\w{(or integer cons)}}. + + +\subsection{The Empty Type} +\label{empty-type} +\cindex{NIL type} +\cpsubindex{empty type}{the} +\cpsubindex{errors}{result type of} + +The type \false{} is also called the empty type, since no object is of +type \false{}. The union of no types, \code{(or)}, is also empty. +\python{}'s interpretation of an expression whose type is \false{} is +that the expression never yields any value, but rather fails to +terminate, or is thrown out of. For example, the type of a call to +\code{error} or a use of \code{return} is \false{}. When the type of +an expression is empty, compile-time type warnings about its value are +suppressed; presumably somebody else is signaling an error. If a +function is declared to have return type \false{}, but does in fact +return, then (in safe compilation policies) a ``\code{NIL Function + returned}'' error will be signaled. See also the function +\funref{required-argument}. + + +\subsection{Function Types} +\label{function-types} +\cpsubindex{function}{types} +\cpsubindex{types}{function} + +\findexed{function} types are understood in the restrictive sense, specifying: +\begin{itemize} + +\item The argument syntax that the function must be called with. This + is information about what argument counts are acceptable, and which + keyword arguments are recognized. In \python, warnings about + argument syntax are a consequence of function type checking. + +\item The types of the argument values that the caller must pass. If + the compiler can prove that some argument to a call is of a type + disallowed by the called function's type, then it will give a + compile-time type warning. In addition to being used for + compile-time type checking, these type assertions are also used as + output type assertions in code generation. For example, if + \code{foo} is declared to have a \code{fixnum} argument, then the + \code{1+} in \w{\code{(foo (1+ x))}} is compiled with knowledge that + the result must be a fixnum. + +\item The types the values that will be bound to argument variables in + the function's definition. Declaring a function's type with + \code{ftype} implicitly declares the types of the arguments in the + definition. \python{} checks for consistency between the definition + and the \code{ftype} declaration. Because of precise type checking, + an error will be signaled when a function is called with an + argument of the wrong type. + +\item The type of return value(s) that the caller can expect. This + information is a useful input to type inference. For example, if a + function is declared to return a \code{fixnum}, then when a call to + that function appears in an expression, the expression will be + compiled with knowledge that the call will return a \code{fixnum}. + +\item The type of return value(s) that the definition must return. + The result type in an \code{ftype} declaration is treated like an + implicit \code{the} wrapped around the body of the definition. If + the definition returns a value of the wrong type, an error will be + signaled. If the compiler can prove that the function returns the + wrong type, then it will give a compile-time warning. +\end{itemize} + +This is consistent with the new interpretation of function types and +the \code{ftype} declaration in the proposed X3J13 +``function-type-argument-type-semantics'' cleanup. Note also, that if +you don't explicitly declare the type of a function using a global +\code{ftype} declaration, then \python{} will compute a function type +from the definition, providing a degree of inter-routine type +inference, \pxlref{function-type-inference}. + + +\subsection{The Values Declaration} +\cindex{values declaration} + +\cmucl{} supports the \code{values} declaration as an extension to +\clisp. The syntax of the declaration is +{\code{(values \var{type1} \var{type2}$\ldots$\var{typen})}}. This +declaration is semantically equivalent to a \code{the} form wrapped +around the body of the special form in which the \code{values} +declaration appears. The advantage of \code{values} over +\findexed{the} is purely syntactic\dash{}it doesn't introduce more +indentation. For example: + +\begin{example} +(defun foo (x) + (declare (values single-float)) + (ecase x + (:this ...) + (:that ...) + (:the-other ...))) +\end{example} + +is equivalent to: + +\begin{example} +(defun foo (x) + (the single-float + (ecase x + (:this ...) + (:that ...) + (:the-other ...)))) +\end{example} + +and + +\begin{example} +(defun floor (number &optional (divisor 1)) + (declare (values integer real)) + ...) +\end{example} + +is equivalent to: + +\begin{example} +(defun floor (number &optional (divisor 1)) + (the (values integer real) + ...)) +\end{example} + +In addition to being recognized by \code{lambda} (and hence by +\code{defun}), the \code{values} declaration is recognized by all the +other special forms with bodies and declarations: \code{let}, +\code{let*}, \code{labels} and \code{flet}. Macros with declarations +usually splice the declarations into one of the above forms, so they +will accept this declaration too, but the exact effect of a +\code{values} declaration will depend on the macro. + +If you declare the types of all arguments to a function, and also +declare the return value types with \code{values}, you have described +the type of the function. \python{} will use this argument and result +type information to derive a function type that will then be applied +to calls of the function (\pxlref{function-types}.) This provides a +way to declare the types of functions that is much less syntactically +awkward than using the \code{ftype} declaration with a \code{function} +type specifier. + +Although the \code{values} declaration is non-standard, it is +relatively harmless to use it in otherwise portable code, since any +warning in non-CMU implementations can be suppressed with the standard +\code{declaration} proclamation. + + +\subsection{Structure Types} +\label{structure-types} +\cindex{structure types} +\cindex{defstruct types} +\cpsubindex{types}{structure} + +Because of precise type checking, structure types are much better +supported by \python{} than by conventional compilers: + +\begin{itemize} +\item The structure argument to structure accessors is precisely + checked\dash{}if you call \code{foo-a} on a \code{bar}, an error + will be signaled. + +\item The types of slot values are precisely checked\dash{}if you pass + the wrong type argument to a constructor or a slot setter, then an + error will be signaled. +\end{itemize} + +This error checking is tremendously useful for detecting bugs in +programs that manipulate complex data structures. + +An additional advantage of checking structure types and enforcing slot +types is that the compiler can safely believe slot type declarations. +\python{} effectively moves the type checking from the slot access to +the slot setter or constructor call. This is more efficient since +caller of the setter or constructor often knows the type of the value, +entirely eliminating the need to check the value's type. Consider +this example: + +\begin{lisp} +(defstruct coordinate + (x nil :type single-float) + (y nil :type single-float)) + +(defun make-it () + (make-coordinate :x 1.0 :y 1.0)) + +(defun use-it (it) + (declare (type coordinate it)) + (sqrt (expt (coordinate-x it) 2) (expt (coordinate-y it) 2))) +\end{lisp} + +\code{make-it} and \code{use-it} are compiled with no checking on the +types of the float slots, yet \code{use-it} can use +\code{single-float} arithmetic with perfect safety. Note that +\code{make-coordinate} must still check the values of \code{x} and +\code{y} unless the call is block compiled or inline expanded +(\pxlref{local-call}.) But even without this advantage, it is almost +always more efficient to check slot values on structure +initialization, since slots are usually written once and read many +times. + + +\subsection{The Freeze-Type Declaration} +\cindex{freeze-type declaration} +\label{freeze-type} + +The \code{extensions:freeze-type} declaration is a \cmucl{} extension that +enables more efficient compilation of user-defined types by asserting +that the definition is not going to change. This declaration may only +be used globally (with \code{declaim} or \code{proclaim}). Currently +\code{freeze-type} only affects structure type testing done by +\code{typep}, \code{typecase}, etc. Here is an example: + +\begin{lisp} +(declaim (freeze-type foo bar)) +\end{lisp} + +This asserts that the types \code{foo} and \code{bar} and their +subtypes are not going to change. This allows more efficient type +testing, since the compiler can open-code a test for all possible +subtypes, rather than having to examine the type hierarchy at +run-time. + + +\subsection{Type Restrictions} +\cpsubindex{types}{restrictions on} + +Avoid use of the \code{and}, \code{not} and \code{satisfies} types in +declarations, since type inference has problems with them. When these +types do appear in a declaration, they are still checked precisely, +but the type information is of limited use to the compiler. +\code{and} types are effective as long as the intersection can be +canonicalized to a type that doesn't use \code{and}. For example: + +\begin{example} +(and fixnum unsigned-byte) +\end{example} + +is fine, since it is the same as: + +\begin{example} +(integer 0 \var{most-positive-fixnum}) +\end{example} + +but this type: + +\begin{example} +(and symbol (not (member :end))) +\end{example} + +will not be fully understood by type interference since the \code{and} +can't be removed by canonicalization. + +Using any of these type specifiers in a type test with \code{typep} or +\code{typecase} is fine, since as tests, these types can be translated +into the \code{and} macro, the \code{not} function or a call to the +satisfies predicate. + + +\subsection{Type Style Recommendations} +\cindex{style recommendations} + +\python{} provides good support for some currently unconventional ways of +using the \clisp{} type system. With \python{}, it is desirable to make +declarations as precise as possible, but type inference also makes +some declarations unnecessary. Here are some general guidelines for +maximum robustness and efficiency: +\begin{itemize} + +\item Declare the types of all function arguments and structure slots + as precisely as possible (while avoiding \code{not}, \code{and} and + \code{satisfies}). Put these declarations in during initial coding + so that type assertions can find bugs for you during debugging. + +\item Use the \tindexed{member} type specifier where there are a small + number of possible symbol values, for example: \w{\code{(member :red + :blue :green)}}. + +\item Use the \tindexed{or} type specifier in situations where the + type is not certain, but there are only a few possibilities, for + example: \w{\code{(or list vector)}}. + +\item Declare integer types with the tightest bounds that you can, + such as \code{\w{(integer 3 7)}}. + +\item Define \findexed{deftype} or \findexed{defstruct} types before + they are used. Definition after use is legal (producing no + ``undefined type'' warnings), but type tests and structure + operations will be compiled much less efficiently. + +\item Use the \code{extensions:freeze-type} declaration to speed up + type testing for structure types which won't have new subtypes added + later. \xlref{freeze-type} + +\item In addition to declaring the array element type and simpleness, + also declare the dimensions if they are fixed, for example: + \begin{example} + (simple-array single-float (1024 1024)) + \end{example} + This bounds information allows array indexing for multi-dimensional + arrays to be compiled much more efficiently, and may also allow + array bounds checking to be done at compile time. + \xlref{array-types}. + +\item Avoid use of the \findexed{the} declaration within expressions. + Not only does it clutter the code, but it is also almost worthless + under safe policies. If the need for an output type assertion is + revealed by efficiency notes during tuning, then you can consider + \code{the}, but it is preferable to constrain the argument types + more, allowing the compiler to prove the desired result type. + +\item Don't bother declaring the type of \findexed{let} or other + non-argument variables unless the type is non-obvious. If you + declare function return types and structure slot types, then the + type of a variable is often obvious both to the programmer and to + the compiler. An important case where the type isn't obvious, and a + declaration is appropriate, is when the value for a variable is + pulled out of untyped structure (e.g., the result of \code{car}), or + comes from some weakly typed function, such as \code{read}. + +\item Declarations are sometimes necessary for integer loop variables, + since the compiler can't always prove that the value is of a good + integer type. These declarations are best added during tuning, when + an efficiency note indicates the need. +\end{itemize} + + +\section{Type Inference} +\label{type-inference} +\cindex{type inference} +\cindex{inference of types} +\cindex{derivation of types} + +Type inference is the process by which the compiler tries to figure +out the types of expressions and variables, given an inevitable lack +of complete type information. Although \python{} does much more type +inference than most \llisp{} compilers, remember that the more precise +and comprehensive type declarations are, the more type inference will +be able to do. + + +\subsection{Variable Type Inference} +\label{variable-type-inference} + +The type of a variable is the union of the types of all the +definitions. In the degenerate case of a let, the type of the +variable is the type of the initial value. This inferred type is +intersected with any declared type, and is then propagated to all the +variable's references. The types of \findexed{multiple-value-bind} +variables are similarly inferred from the types of the individual +values of the values form. + +If multiple type declarations apply to a single variable, then all the +declarations must be correct; it is as though all the types were intersected +producing a single \tindexed{and} type specifier. In this example: +\begin{example} +(defmacro my-dotimes ((var count) &body body) + `(do ((,var 0 (1+ ,var))) + ((>= ,var ,count)) + (declare (type (integer 0 *) ,var)) + ,@body)) + +(my-dotimes (i ...) + (declare (fixnum i)) + ...) +\end{example} +the two declarations for \code{i} are intersected, so \code{i} is +known to be a non-negative fixnum. + +In practice, this type inference is limited to lets and local +functions, since the compiler can't analyze all the calls to a global +function. But type inference works well enough on local variables so +that it is often unnecessary to declare the type of local variables. +This is especially likely when function result types and structure +slot types are declared. The main areas where type inference breaks +down are: +\begin{itemize} + +\item When the initial value of a variable is a untyped expression, + such as \code{\w{(car x)}}, and + +\item When the type of one of the variable's definitions is a function + of the variable's current value, as in: \code{(setq x (1+ x))} +\end{itemize} + + +\subsection{Local Function Type Inference} +\cpsubindex{local call}{type inference} + +The types of arguments to local functions are inferred in the same was +as any other local variable; the type is the union of the argument +types across all the calls to the function, intersected with the +declared type. If there are any assignments to the argument +variables, the type of the assigned value is unioned in as well. + +The result type of a local function is computed in a special way that +takes tail recursion (\pxlref{tail-recursion}) into consideration. +The result type is the union of all possible return values that aren't +tail-recursive calls. For example, \python{} will infer that the +result type of this function is \code{integer}: + +\begin{lisp} +(defun ! (n res) + (declare (integer n res)) + (if (zerop n) + res + (! (1- n) (* n res)))) +\end{lisp} + +Although this is a rather obvious result, it becomes somewhat less +trivial in the presence of mutual tail recursion of multiple +functions. Local function result type inference interacts with the +mechanisms for ensuring proper tail recursion mentioned in section +\ref{local-call-return}. + + +\subsection{Global Function Type Inference} +\label{function-type-inference} +\cpsubindex{function}{type inference} + +As described in section \ref{function-types}, a global function type +(\tindexed{ftype}) declaration places implicit type assertions on the +call arguments, and also guarantees the type of the return value. So +wherever a call to a declared function appears, there is no doubt as +to the types of the arguments and return value. Furthermore, +\python{} will infer a function type from the function's definition if +there is no \code{ftype} declaration. Any type declarations on the +argument variables are used as the argument types in the derived +function type, and the compiler's best guess for the result type of +the function is used as the result type in the derived function type. + +This method of deriving function types from the definition implicitly assumes +that functions won't be redefined at run-time. Consider this example: +\begin{lisp} +(defun foo-p (x) + (let ((res (and (consp x) (eq (car x) 'foo)))) + (format t "It is ~:[not ~;~]foo." res))) + +(defun frob (it) + (if (foo-p it) + (setf (cadr it) 'yow!) + (1+ it))) +\end{lisp} + +Presumably, the programmer really meant to return \code{res} from +\code{foo-p}, but he seems to have forgotten. When he tries to call +do \code{\w{(frob (list 'foo nil))}}, \code{frob} will flame out when +it tries to add to a \code{cons}. Realizing his error, he fixes +\code{foo-p} and recompiles it. But when he retries his test case, he +is baffled because the error is still there. What happened in this +example is that \python{} proved that the result of \code{foo-p} is +\code{null}, and then proceeded to optimize away the \code{setf} in +\code{frob}. + +Fortunately, in this example, the error is detected at compile time +due to notes about unreachable code (\pxlref{dead-code-notes}.) +Still, some users may not want to worry about this sort of problem +during incremental development, so there is a variable to control +deriving function types. + +\begin{defvar}{extensions:}{derive-function-types} + + If true (the default), argument and result type information derived + from compilation of \code{defun}s is used when compiling calls to + that function. If false, only information from \code{ftype} + proclamations will be used. +\end{defvar} + + +\subsection{Operation Specific Type Inference} +\label{operation-type-inference} +\cindex{operation specific type inference} +\cindex{arithmetic type inference} +\cpsubindex{numeric}{type inference} + +Many of the standard \clisp{} functions have special type inference +procedures that determine the result type as a function of the +argument types. For example, the result type of \code{aref} is the +array element type. Here are some other examples of type inferences: +\begin{lisp} +(logand x #xFF) \result{} (unsigned-byte 8) + +(+ (the (integer 0 12) x) (the (integer 0 1) y)) \result{} (integer 0 13) + +(ash (the (unsigned-byte 16) x) -8) \result{} (unsigned-byte 8) +\end{lisp} + + +\subsection{Dynamic Type Inference} +\label{constraint-propagation} +\cindex{dynamic type inference} +\cindex{conditional type inference} +\cpsubindex{type inference}{dynamic} + +\python{} uses flow analysis to infer types in dynamically typed +programs. For example: + +\begin{example} +(ecase x + (list (length x)) + ...) +\end{example} + +Here, the compiler knows the argument to \code{length} is a list, +because the call to \code{length} is only done when \code{x} is a +list. The most significant efficiency effect of inference from +assertions is usually in type check optimization. + +Dynamic type inference has two inputs: explicit conditionals and +implicit or explicit type assertions. Flow analysis propagates these +constraints on variable type to any code that can be executed only +after passing though the constraint. Explicit type constraints come +from \findexed{if}s where the test is either a lexical variable or a +function of lexical variables and constants, where the function is +either a type predicate, a numeric comparison or \code{eq}. + +If there is an \code{eq} (or \code{eql}) test, then the compiler will +actually substitute one argument for the other in the true branch. +For example: +\begin{lisp} +(when (eq x :yow!) (return x)) +\end{lisp} +becomes: +\begin{lisp} +(when (eq x :yow!) (return :yow!)) +\end{lisp} +This substitution is done when one argument is a constant, or one +argument has better type information than the other. This +transformation reveals opportunities for constant folding or +type-specific optimizations. If the test is against a constant, then +the compiler can prove that the variable is not that constant value in +the false branch, or \w{\code{(not (member :yow!))}} in the example +above. This can eliminate redundant tests, for example: +\begin{example} +(if (eq x nil) + ... + (if x a b)) +\end{example} +is transformed to this: +\begin{example} +(if (eq x nil) + ... + a) +\end{example} +Variables appearing as \code{if} tests are interpreted as +\code{\w{(not (eq \var{var} nil))}} tests. The compiler also converts +\code{=} into \code{eql} where possible. It is difficult to do +inference directly on \code{=} since it does implicit coercions. + +When there is an explicit \code{\textless} or \code{\textgreater} test on numeric +variables, the compiler makes inferences about the ranges the +variables can assume in the true and false branches. This is mainly +useful when it proves that the values are small enough in magnitude to +allow open-coding of arithmetic operations. For example, in many uses +of \code{dotimes} with a \code{fixnum} repeat count, the compiler +proves that fixnum arithmetic can be used. + +Implicit type assertions are quite common, especially if you declare +function argument types. Dynamic inference from implicit type +assertions sometimes helps to disambiguate programs to a useful +degree, but is most noticeable when it detects a dynamic type error. +For example: + +\begin{lisp} +(defun foo (x) + (+ (car x) x)) +\end{lisp} + +results in this warning: + +\begin{example} +In: DEFUN FOO + (+ (CAR X) X) +==> + X +Warning: Result is a LIST, not a NUMBER. +\end{example} + +Note that \llisp{}'s dynamic type checking semantics make dynamic type +inference useful even in programs that aren't really dynamically +typed, for example: + +\begin{lisp} +(+ (car x) (length x)) +\end{lisp} + +Here, \code{x} presumably always holds a list, but in the absence of a +declaration the compiler cannot assume \code{x} is a list simply +because list-specific operations are sometimes done on it. The +compiler must consider the program to be dynamically typed until it +proves otherwise. Dynamic type inference proves that the argument to +\code{length} is always a list because the call to \code{length} is +only done after the list-specific \code{car} operation. + + +\subsection{Type Check Optimization} +\label{type-check-optimization} +\cpsubindex{type checking}{optimization} +\cpsubindex{optimization}{type check} + +\python{} backs up its support for precise type checking by minimizing +the cost of run-time type checking. This is done both through type +inference and though optimizations of type checking itself. + +Type inference often allows the compiler to prove that a value is of +the correct type, and thus no type check is necessary. For example: +\begin{lisp} +(defstruct foo a b c) +(defstruct link + (foo (required-argument) :type foo) + (next nil :type (or link null))) + +(foo-a (link-foo x)) +\end{lisp} + +Here, there is no need to check that the result of \code{link-foo} is +a \code{foo}, since it always is. Even when some type checks are +necessary, type inference can often reduce the number: +\begin{example} +(defun test (x) + (let ((a (foo-a x)) + (b (foo-b x)) + (c (foo-c x))) + ...)) +\end{example} +In this example, only one \w{\code{(foo-p x)}} check is needed. This +applies to a lesser degree in list operations, such as: +\begin{lisp} +(if (eql (car x) 3) (cdr x) y) +\end{lisp} +Here, we only have to check that \code{x} is a list once. + +Since \python{} recognizes explicit type tests, code that explicitly +protects itself against type errors has little introduced overhead due +to implicit type checking. For example, this loop compiles with no +implicit checks checks for \code{car} and \code{cdr}: +\begin{lisp} +(defun memq (e l) + (do ((current l (cdr current))) + ((atom current) nil) + (when (eq (car current) e) (return current)))) +\end{lisp} + +\cindex{complemented type checks} +\python{} reduces the cost of checks that must be done through an +optimization called \var{complementing}. A complemented check for +\var{type} is simply a check that the value is not of the type +\w{\code{(not \var{type})}}. This is only interesting when something +is known about the actual type, in which case we can test for the +complement of \w{\code{(and \var{known-type} (not \var{type}))}}, or +the difference between the known type and the assertion. An example: +\begin{lisp} +(link-foo (link-next x)) +\end{lisp} +Here, we change the type check for \code{link-foo} from a test for +\code{foo} to a test for: +\begin{lisp} +(not (and (or foo null) (not foo))) +\end{lisp} +or more simply \w{\code{(not null)}}. This is probably the most +important use of complementing, since the situation is fairly common, +and a \code{null} test is much cheaper than a structure type test. + +Here is a more complicated example that illustrates the combination of +complementing with dynamic type inference: +\begin{lisp} +(defun find-a (a x) + (declare (type (or link null) x)) + (do ((current x (link-next current))) + ((null current) nil) + (let ((foo (link-foo current))) + (when (eq (foo-a foo) a) (return foo))))) +\end{lisp} +This loop can be compiled with no type checks. The \code{link} test +for \code{link-foo} and \code{link-next} is complemented to +\w{\code{(not null)}}, and then deleted because of the explicit +\code{null} test. As before, no check is necessary for \code{foo-a}, +since the \code{link-foo} is always a \code{foo}. This sort of +situation shows how precise type checking combined with precise +declarations can actually result in reduced type checking. + + +\section{Source Optimization} +\label{source-optimization} +\cindex{optimization} + +This section describes source-level transformations that \python{} does on +programs in an attempt to make them more efficient. Although source-level +optimizations can make existing programs more efficient, the biggest advantage +of this sort of optimization is that it makes it easier to write efficient +programs. If a clean, straightforward implementation is can be transformed +into an efficient one, then there is no need for tricky and dangerous hand +optimization. + + +\subsection{Let Optimization} +\label{let-optimization} + +\cindex{let optimization} \cpsubindex{optimization}{let} + +The primary optimization of let variables is to delete them when they +are unnecessary. Whenever the value of a let variable is a constant, +a constant variable or a constant (local or non-notinline) function, +the variable is deleted, and references to the variable are replaced +with references to the constant expression. This is useful primarily +in the expansion of macros or inline functions, where argument values +are often constant in any given call, but are in general non-constant +expressions that must be bound to preserve order of evaluation. Let +variable optimization eliminates the need for macros to carefully +avoid spurious bindings, and also makes inline functions just as +efficient as macros. + +A particularly interesting class of constant is a local function. +Substituting for lexical variables that are bound to a function can +substantially improve the efficiency of functional programming styles, +for example: +\begin{lisp} +(let ((a #'(lambda (x) (zow x)))) + (funcall a 3)) +\end{lisp} +effectively transforms to: +\begin{lisp} +(zow 3) +\end{lisp} +This transformation is done even when the function is a closure, as in: +\begin{lisp} +(let ((a (let ((y (zug))) + #'(lambda (x) (zow x y))))) + (funcall a 3)) +\end{lisp} +becoming: +\begin{lisp} +(zow 3 (zug)) +\end{lisp} + +A constant variable is a lexical variable that is never assigned to, +always keeping its initial value. Whenever possible, avoid setting +lexical variables\dash{}instead bind a new variable to the new value. +Except for loop variables, it is almost always possible to avoid +setting lexical variables. This form: +\begin{example} +(let ((x (f x))) + ...) +\end{example} +is \var{more} efficient than this form: +\begin{example} +(setq x (f x)) +... +\end{example} +Setting variables makes the program more difficult to understand, both +to the compiler and to the programmer. \python{} compiles assignments +at least as efficiently as any other \llisp{} compiler, but most let +optimizations are only done on constant variables. + +Constant variables with only a single use are also optimized away, +even when the initial value is not constant.\footnote{The source + transformation in this example doesn't represent the preservation of + evaluation order implicit in the compiler's internal representation. + Where necessary, the back end will reintroduce temporaries to + preserve the semantics.} For example, this expansion of +\code{incf}: +\begin{lisp} +(let ((#:g3 (+ x 1))) + (setq x #:G3)) +\end{lisp} +becomes: +\begin{lisp} +(setq x (+ x 1)) +\end{lisp} +The type semantics of this transformation are more important than the +elimination of the variable itself. Consider what happens when +\code{x} is declared to be a \code{fixnum}; after the transformation, +the compiler can compile the addition knowing that the result is a +\code{fixnum}, whereas before the transformation the addition would +have to allow for fixnum overflow. + +Another variable optimization deletes any variable that is never read. +This causes the initial value and any assigned values to be unused, +allowing those expressions to be deleted if they have no side-effects. + +Note that a let is actually a degenerate case of local call +(\pxlref{let-calls}), and that let optimization can be done on calls +that weren't created by a let. Also, local call allows an applicative +style of iteration that is totally assignment free. + + +\subsection{Constant Folding} +\cindex{constant folding} +\cpsubindex{folding}{constant} + +Constant folding is an optimization that replaces a call of constant +arguments with the constant result of that call. Constant folding is +done on all standard functions for which it is legal. Inline +expansion allows folding of any constant parts of the definition, and +can be done even on functions that have side-effects. + +It is convenient to rely on constant folding when programming, as in this +example: +\begin{example} +(defconstant limit 42) + +(defun foo () + (... (1- limit) ...)) +\end{example} +Constant folding is also helpful when writing macros or inline +functions, since it usually eliminates the need to write a macro that +special-cases constant arguments. + +\cindex{constant-function declaration} Constant folding of a user +defined function is enabled by the \code{extensions:constant-function} +proclamation. In this example: +\begin{example} +(declaim (ext:constant-function myfun)) +(defun myexp (x y) + (declare (single-float x y)) + (exp (* (log x) y))) + + ... (myexp 3.0 1.3) ... +\end{example} +The call to \code{myexp} is constant-folded to \code{4.1711674}. + + +\subsection{Unused Expression Elimination} +\cindex{unused expression elimination} +\cindex{dead code elimination} + +If the value of any expression is not used, and the expression has no +side-effects, then it is deleted. As with constant folding, this +optimization applies most often when cleaning up after inline +expansion and other optimizations. Any function declared an +\code{extensions:constant-function} is also subject to unused +expression elimination. + +Note that \python{} will eliminate parts of unused expressions known +to be side-effect free, even if there are other unknown parts. For +example: +\begin{lisp} +(let ((a (list (foo) (bar)))) + (if t + (zow) + (raz a))) +\end{lisp} +becomes: +\begin{lisp} +(progn (foo) (bar)) +(zow) +\end{lisp} + + +\subsection{Control Optimization} +\cindex{control optimization} +\cpsubindex{optimization}{control} + +The most important optimization of control is recognizing when an +\findexed{if} test is known at compile time, then deleting the +\code{if}, the test expression, and the unreachable branch of the +\code{if}. This can be considered a special case of constant folding, +although the test doesn't have to be truly constant as long as it is +definitely not \false. Note also, that type inference propagates the +result of an \code{if} test to the true and false branches, +\pxlref{constraint-propagation}. + +A related \code{if} optimization is this transformation:\footnote{Note + that the code for \code{x} and \code{y} isn't actually replicated.} +\begin{lisp} +(if (if a b c) x y) +\end{lisp} +into: +\begin{lisp} +(if a + (if b x y) + (if c x y)) +\end{lisp} +The opportunity for this sort of optimization usually results from a +conditional macro. For example: +\begin{lisp} +(if (not a) x y) +\end{lisp} +is actually implemented as this: +\begin{lisp} +(if (if a nil t) x y) +\end{lisp} +which is transformed to this: +\begin{lisp} +(if a + (if nil x y) + (if t x y)) +\end{lisp} +which is then optimized to this: +\begin{lisp} +(if a y x) +\end{lisp} +Note that due to \python{}'s internal representations, the +\code{if}\dash{}\code{if} situation will be recognized even if other +forms are wrapped around the inner \code{if}, like: +\begin{example} +(if (let ((g ...)) + (loop + ... + (return (not g)) + ...)) + x y) +\end{example} + +In \python, all the \clisp{} macros really are macros, written in +terms of \code{if}, \code{block} and \code{tagbody}, so user-defined +control macros can be just as efficient as the standard ones. +\python{} emits basic blocks using a heuristic that minimizes the +number of unconditional branches. The code in a \code{tagbody} will +not be emitted in the order it appeared in the source, so there is no +point in arranging the code to make control drop through to the +target. + + +\subsection{Unreachable Code Deletion} +\label{dead-code-notes} +\cindex{unreachable code deletion} +\cindex{dead code elimination} + +\python{} will delete code whenever it can prove that the code can never be +executed. Code becomes unreachable when: + +\begin{itemize} +\item +An \code{if} is optimized away, or + +\item +There is an explicit unconditional control transfer such as \code{go} or +\code{return-from}, or + +\item +The last reference to a local function is deleted (or there never was any +reference.) +\end{itemize} + +When code that appeared in the original source is deleted, the compiler prints +a note to indicate a possible problem (or at least unnecessary code.) For +example: +\begin{lisp} +(defun foo () + (if t + (write-line "True.") + (write-line "False."))) +\end{lisp} +will result in this note: +\begin{example} +In: DEFUN FOO + (WRITE-LINE "False.") +Note: Deleting unreachable code. +\end{example} + +It is important to pay attention to unreachable code notes, since they often +indicate a subtle type error. For example: +\begin{example} +(defstruct foo a b) + +(defun lose (x) + (let ((a (foo-a x)) + (b (if x (foo-b x) :none))) + ...)) +\end{example} +results in this note: +\begin{example} +In: DEFUN LOSE + (IF X (FOO-B X) :NONE) +==> + :NONE +Note: Deleting unreachable code. +\end{example} +The \kwd{none} is unreachable, because type inference knows that the argument +to \code{foo-a} must be a \code{foo}, and thus can't be \false. Presumably the +programmer forgot that \code{x} could be \false{} when he wrote the binding for +\code{a}. + +Here is an example with an incorrect declaration: +\begin{lisp} +(defun count-a (string) + (do ((pos 0 (position #\back{a} string :start (1+ pos))) + (count 0 (1+ count))) + ((null pos) count) + (declare (fixnum pos)))) +\end{lisp} +This time our note is: +\begin{example} +In: DEFUN COUNT-A + (DO ((POS 0 #) (COUNT 0 #)) + ((NULL POS) COUNT) + (DECLARE (FIXNUM POS))) +--> BLOCK LET TAGBODY RETURN-FROM PROGN +==> + COUNT +Note: Deleting unreachable code. +\end{example} + +The problem here is that \code{pos} can never be null since it is declared a +\code{fixnum}. + +It takes some experience with unreachable code notes to be able to +tell what they are trying to say. In non-obvious cases, the best +thing to do is to call the function in a way that should cause the +unreachable code to be executed. Either you will get a type error, or +you will find that there truly is no way for the code to be executed. + +Not all unreachable code results in a note: + +\begin{itemize} +\item A note is only given when the unreachable code textually appears + in the original source. This prevents spurious notes due to the + optimization of macros and inline functions, but sometimes also + foregoes a note that would have been useful. + +\item Since accurate source information is not available for non-list + forms, there is an element of heuristic in determining whether or + not to give a note about an atom. Spurious notes may be given when + a macro or inline function defines a variable that is also present + in the calling function. Notes about \false{} and \true{} are never + given, since it is too easy to confuse these constants in expanded + code with ones in the original source. + +\item Notes are only given about code unreachable due to control flow. + There is no note when an expression is deleted because its value is + unused, since this is a common consequence of other optimizations. +\end{itemize} + + +Somewhat spurious unreachable code notes can also result when a macro +inserts multiple copies of its arguments in different contexts, for +example: +\begin{lisp} +(defmacro t-and-f (var form) + `(if ,var ,form ,form)) + +(defun foo (x) + (t-and-f x (if x "True." "False."))) +\end{lisp} +results in these notes: +\begin{example} +In: DEFUN FOO + (IF X "True." "False.") +==> + "False." +Note: Deleting unreachable code. + +==> + "True." +Note: Deleting unreachable code. +\end{example} + +It seems like it has deleted both branches of the \code{if}, but it has really +deleted one branch in one copy, and the other branch in the other copy. Note +that these messages are only spurious in not satisfying the intent of the rule +that notes are only given when the deleted code appears in the original source; +there is always \var{some} code being deleted when a unreachable code note is +printed. + + +\subsection{Multiple Values Optimization} +\cindex{multiple value optimization} +\cpsubindex{optimization}{multiple value} + +Within a function, \python{} implements uses of multiple values +particularly efficiently. Multiple values can be kept in arbitrary +registers, so using multiple values doesn't imply stack manipulation +and representation conversion. For example, this code: +\begin{example} +(let ((a (if x (foo x) u)) + (b (if x (bar x) v))) + ...) +\end{example} +is actually more efficient written this way: +\begin{example} +(multiple-value-bind + (a b) + (if x + (values (foo x) (bar x)) + (values u v)) + ...) +\end{example} + +Also, \pxlref{local-call-return} for information on how local call +provides efficient support for multiple function return values. + + +\subsection{Source to Source Transformation} +\cindex{source-to-source transformation} +\cpsubindex{transformation}{source-to-source} + +The compiler implements a number of operation-specific optimizations as +source-to-source transformations. You will often see unfamiliar code in error +messages, for example: + +\begin{lisp} +(defun my-zerop () (zerop x)) +\end{lisp} + +gives this warning: + +\begin{example} +In: DEFUN MY-ZEROP + (ZEROP X) +==> + (= X 0) +Warning: Undefined variable: X +\end{example} + +The original \code{zerop} has been transformed into a call to +\code{=}. This transformation is indicated with the same \code{==$>$} +used to mark macro and function inline expansion. Although it can be +confusing, display of the transformed source is important, since +warnings are given with respect to the transformed source. This a +more obscure example: + +\begin{lisp} +(defun foo (x) (logand 1 x)) +\end{lisp} + +gives this efficiency note: + +\begin{example} +In: DEFUN FOO + (LOGAND 1 X) +==> + (LOGAND C::Y C::X) +Note: Forced to do static-function Two-arg-and (cost 53). + Unable to do inline fixnum arithmetic (cost 1) because: + The first argument is a INTEGER, not a FIXNUM. + etc. +\end{example} + +Here, the compiler commuted the call to \code{logand}, introducing +temporaries. The note complains that the \var{first} argument is not +a \code{fixnum}, when in the original call, it was the second +argument. To make things more confusing, the compiler introduced +temporaries called \code{c::x} and \code{c::y} that are bound to +\code{y} and \code{1}, respectively. + +You will also notice source-to-source optimizations when efficiency +notes are enabled (\pxlref{efficiency-notes}.) When the compiler is +unable to do a transformation that might be possible if there was more +information, then an efficiency note is printed. For example, +\code{my-zerop} above will also give this efficiency note: +\begin{example} +In: DEFUN FOO + (ZEROP X) +==> + (= X 0) +Note: Unable to optimize because: + Operands might not be the same type, so can't open code. +\end{example} + + +\subsection{Style Recommendations} +\cindex{style recommendations} + +Source level optimization makes possible a clearer and more relaxed programming +style: +\begin{itemize} + +\item Don't use macros purely to avoid function call. If you want an + inline function, write it as a function and declare it inline. It's + clearer, less error-prone, and works just as well. + +\item Don't write macros that try to ``optimize'' their expansion in + trivial ways such as avoiding binding variables for simple + expressions. The compiler does these optimizations too, and is less + likely to make a mistake. + +\item Make use of local functions (i.e., \code{labels} or \code{flet}) + and tail-recursion in places where it is clearer. Local function + call is faster than full call. + +\item Avoid setting local variables when possible. Binding a new + \code{let} variable is at least as efficient as setting an existing + variable, and is easier to understand, both for the compiler and the + programmer. + +\item Instead of writing similar code over and over again so that it + can be hand customized for each use, define a macro or inline + function, and let the compiler do the work. +\end{itemize} + + +\section{Tail Recursion} +\label{tail-recursion} +\cindex{tail recursion} +\cindex{recursion} + +A call is tail-recursive if nothing has to be done after the the call +returns, i.e. when the call returns, the returned value is immediately +returned from the calling function. In this example, the recursive +call to \code{myfun} is tail-recursive: +\begin{lisp} +(defun myfun (x) + (if (oddp (random x)) + (isqrt x) + (myfun (1- x)))) +\end{lisp} + +Tail recursion is interesting because it is form of recursion that can be +implemented much more efficiently than general recursion. In general, a +recursive call requires the compiler to allocate storage on the stack at +run-time for every call that has not yet returned. This memory consumption +makes recursion unacceptably inefficient for representing repetitive algorithms +having large or unbounded size. Tail recursion is the special case of +recursion that is semantically equivalent to the iteration constructs normally +used to represent repetition in programs. Because tail recursion is equivalent +to iteration, tail-recursive programs can be compiled as efficiently as +iterative programs. + +So why would you want to write a program recursively when you can write it +using a loop? Well, the main answer is that recursion is a more general +mechanism, so it can express some solutions simply that are awkward to write as +a loop. Some programmers also feel that recursion is a stylistically +preferable way to write loops because it avoids assigning variables. +For example, instead of writing: + +\begin{lisp} +(defun fun1 (x) + something-that-uses-x) + +(defun fun2 (y) + something-that-uses-y) + +(do ((x something (fun2 (fun1 x)))) + (nil)) +\end{lisp} + +You can write: + +\begin{lisp} +(defun fun1 (x) + (fun2 something-that-uses-x)) + +(defun fun2 (y) + (fun1 something-that-uses-y)) + +(fun1 something) +\end{lisp} + +The tail-recursive definition is actually more efficient, in addition to being +(arguably) clearer. As the number of functions and the complexity of their +call graph increases, the simplicity of using recursion becomes compelling. +Consider the advantages of writing a large finite-state machine with separate +tail-recursive functions instead of using a single huge \code{prog}. + +It helps to understand how to use tail recursion if you think of a +tail-recursive call as a \code{psetq} that assigns the argument values to the +called function's variables, followed by a \code{go} to the start of the called +function. This makes clear an inherent efficiency advantage of tail-recursive +call: in addition to not having to allocate a stack frame, there is no need to +prepare for the call to return (e.g., by computing a return PC.) + +Is there any disadvantage to tail recursion? Other than an increase +in efficiency, the only way you can tell that a call has been compiled +tail-recursively is if you use the debugger. Since a tail-recursive +call has no stack frame, there is no way the debugger can print out +the stack frame representing the call. The effect is that backtrace +will not show some calls that would have been displayed in a +non-tail-recursive implementation. In practice, this is not as bad as +it sounds\dash{}in fact it isn't really clearly worse, just different. +\xlref{debug-tail-recursion} for information about the debugger +implications of tail recursion, and how to turn it off for the sake of +more conservative backtrace information. + +In order to ensure that tail-recursion is preserved in arbitrarily +complex calling patterns across separately compiled functions, the +compiler must compile any call in a tail-recursive position as a +tail-recursive call. This is done regardless of whether the program +actually exhibits any sort of recursive calling pattern. In this +example, the call to \code{fun2} will always be compiled as a +tail-recursive call: + +\begin{lisp} +(defun fun1 (x) + (fun2 x)) +\end{lisp} + +So tail recursion doesn't necessarily have anything to do with recursion +as it is normally thought of. \xlref{local-tail-recursion} for more +discussion of using tail recursion to implement loops. + + +\subsection{Tail Recursion Exceptions} + +Although \python{} is claimed to be ``properly'' tail-recursive, some +might dispute this, since there are situations where tail recursion is +inhibited: +\begin{itemize} + +\item When the call is enclosed by a special binding, or + +\item When the call is enclosed by a \code{catch} or + \code{unwind-protect}, or + +\item When the call is enclosed by a \code{block} or \code{tagbody} + and the block name or \code{go} tag has been closed over. +\end{itemize} +These dynamic extent binding forms inhibit tail recursion because they +allocate stack space to represent the binding. Shallow-binding +implementations of dynamic scoping also require cleanup code to be +evaluated when the scope is exited. + +In addition, optimization of tail-recursive calls is inhibited when +the \code{debug} optimization quality is greater than \code{2} +(\pxlref{debugger-policy}.) + + +\section{Local Call} +\label{local-call} +\cindex{local call} +\cpsubindex{call}{local} +\cpsubindex{function call}{local} + +\python{} supports two kinds of function call: full call and local call. +Full call is the standard calling convention; its late binding and +generality make \llisp{} what it is, but create unavoidable overheads. +When the compiler can compile the calling function and the called +function simultaneously, it can use local call to avoid some of the +overhead of full call. Local call is really a collection of +compilation strategies. If some aspect of call overhead is not needed +in a particular local call, then it can be omitted. In some cases, +local call can be totally free. Local call provides two main +advantages to the user: +\begin{itemize} + +\item Local call makes the use of the lexical function binding forms + \findexed{flet} and \findexed{labels} much more efficient. A local + call is always faster than a full call, and in many cases is much + faster. + +\item Local call is a natural approach to \textit{block compilation}, a + compilation technique that resolves function references at compile + time. Block compilation speeds function call, but increases + compilation times and prevents function redefinition. +\end{itemize} + + + +\subsection{Self-Recursive Calls} +\cpsubindex{recursion}{self} + +Local call is used when a function defined by \code{defun} calls itself. For +example: +\begin{lisp} +(defun fact (n) + (if (zerop n) + 1 + (* n (fact (1- n))))) +\end{lisp} + +This use of local call speeds recursion, but can also complicate +debugging, since \findexed{trace} will only show the first call to +\code{fact}, and not the recursive calls. This is because the +recursive calls directly jump to the start of the function, and don't +indirect through the \code{symbol-function}. Self-recursive local +call is inhibited when the \kwd{block-compile} argument to +\code{compile-file} is \false{} (\pxlref{compile-file-block}.) + + +\subsection{Let Calls} +\label{let-calls} +Because local call avoids unnecessary call overheads, the compiler +internally uses local call to implement some macros and special forms +that are not normally thought of as involving a function call. For +example, this \code{let}: + +\begin{example} +(let ((a (foo)) + (b (bar))) + ...) +\end{example} + +is internally represented as though it was macroexpanded into: + +\begin{example} +(funcall #'(lambda (a b) + ...) + (foo) + (bar)) +\end{example} + +This implementation is acceptable because the simple cases of local +call (equivalent to a \code{let}) result in good code. This doesn't +make \code{let} any more efficient, but does make local calls that are +semantically the same as \code{let} much more efficient than full +calls. For example, these definitions are all the same as far as the +compiler is concerned: + +\begin{example} +(defun foo () + ...some other stuff... + (let ((a something)) + ...some stuff...)) + +(defun foo () + (flet ((localfun (a) + ...some stuff...)) + ...some other stuff... + (localfun something))) + +(defun foo () + (let ((funvar #'(lambda (a) + ...some stuff...))) + ...some other stuff... + (funcall funvar something))) +\end{example} + +Although local call is most efficient when the function is called only +once, a call doesn't have to be equivalent to a \code{let} to be more +efficient than full call. All local calls avoid the overhead of +argument count checking and keyword argument parsing, and there are a +number of other advantages that apply in many common situations. +\xlref{let-optimization} for a discussion of the optimizations done on +let calls. + + +\subsection{Closures} +\cindex{closures} + +Local call allows for much more efficient use of closures, since the +closure environment doesn't need to be allocated on the heap, or even +stored in memory at all. In this example, there is no penalty for +\code{localfun} referencing \code{a} and \code{b}: +\begin{lisp} +(defun foo (a b) + (flet ((localfun (x) + (1+ (* a b x)))) + (if (= a b) + (localfun (- x)) + (localfun x)))) +\end{lisp} +In local call, the compiler effectively passes closed-over values as +extra arguments, so there is no need for you to ``optimize'' local +function use by explicitly passing in lexically visible values. +Closures may also be subject to let optimization +(\pxlref{let-optimization}.) + +Note: indirect value cells are currently always allocated on the heap +when a variable is both assigned to (with \code{setq} or \code{setf}) +and closed over, regardless of whether the closure is a local function +or not. This is another reason to avoid setting variables when you +don't have to. + + +\subsection{Local Tail Recursion} +\label{local-tail-recursion} +\cindex{tail recursion} +\cpsubindex{recursion}{tail} + +Tail-recursive local calls are particularly efficient, since they are +in effect an assignment plus a control transfer. Scheme programmers +write loops with tail-recursive local calls, instead of using the +imperative \code{go} and \code{setq}. This has not caught on in the +\clisp{} community, since conventional \llisp{} compilers don't +implement local call. In \python, users can choose to write loops +such as: +\begin{lisp} +(defun ! (n) + (labels ((loop (n total) + (if (zerop n) + total + (loop (1- n) (* n total))))) + (loop n 1))) +\end{lisp} + +\begin{defmac}{extensions:}{iterate}{% + \args{\var{name} (\mstar{(\var{var} \var{initial-value})}) + \mstar{\var{declaration}} \mstar{\var{form}}}} + + This macro provides syntactic sugar for using \findexed{labels} to + do iteration. It creates a local function \var{name} with the + specified \var{var}s as its arguments and the \var{declaration}s and + \var{form}s as its body. This function is then called with the + \var{initial-values}, and the result of the call is return from the + macro. + + Here is our factorial example rewritten using \code{iterate}: + + \begin{lisp} + (defun ! (n) + (iterate loop + ((n n) + (total 1)) + (if (zerop n) + total + (loop (1- n) (* n total))))) + \end{lisp} + + The main advantage of using \code{iterate} over \code{do} is that + \code{iterate} naturally allows stepping to be done differently + depending on conditionals in the body of the loop. \code{iterate} + can also be used to implement algorithms that aren't really + iterative by simply doing a non-tail call. For example, the + standard recursive definition of factorial can be written like this: +\begin{lisp} +(iterate fact + ((n n)) + (if (zerop n) + 1 + (* n (fact (1- n))))) +\end{lisp} +\end{defmac} + + +\subsection{Return Values} +\label{local-call-return} +\cpsubindex{return values}{local call} +\cpsubindex{local call}{return values} + +One of the more subtle costs of full call comes from allowing +arbitrary numbers of return values. This overhead can be avoided in +local calls to functions that always return the same number of values. +For efficiency reasons (as well as stylistic ones), you should write +functions so that they always return the same number of values. This +may require passing extra \false{} arguments to \code{values} in some +cases, but the result is more efficient, not less so. + +When efficiency notes are enabled (\pxlref{efficiency-notes}), and the +compiler wants to use known values return, but can't prove that the +function always returns the same number of values, then it will print +a note like this: +\begin{example} +In: DEFUN GRUE + (DEFUN GRUE (X) (DECLARE (FIXNUM X)) (COND (# #) (# NIL) (T #))) +Note: Return type not fixed values, so can't use known return convention: + (VALUES (OR (INTEGER -536870912 -1) NULL) &REST T) +\end{example} + +In order to implement proper tail recursion in the presence of known +values return (\pxlref{tail-recursion}), the compiler sometimes must +prove that multiple functions all return the same number of values. +When this can't be proven, the compiler will print a note like this: +\begin{example} +In: DEFUN BLUE + (DEFUN BLUE (X) (DECLARE (FIXNUM X)) (COND (# #) (# #) (# #) (T #))) +Note: Return value count mismatch prevents known return from + these functions: + BLUE + SNOO +\end{example} +\xlref{number-local-call} for the interaction between local call +and the representation of numeric types. + + +\section{Block Compilation} +\label{block-compilation} +\cindex{block compilation} +\cpsubindex{compilation}{block} + +Block compilation allows calls to global functions defined by +\findexed{defun} to be compiled as local calls. The function call +can be in a different top-level form than the \code{defun}, or even in a +different file. + +In addition, block compilation allows the declaration of the \textit{entry points} +to the block compiled portion. An entry point is any function that may be +called from outside of the block compilation. If a function is not an entry +point, then it can be compiled more efficiently, since all calls are known at +compile time. In particular, if a function is only called in one place, then +it will be let converted. This effectively inline expands the function, but +without the code duplication that results from defining the function normally +and then declaring it inline. + +The main advantage of block compilation is that it it preserves efficiency in +programs even when (for readability and syntactic convenience) they are broken +up into many small functions. There is absolutely no overhead for calling a +non-entry point function that is defined purely for modularity (i.e. called +only in one place.) + +Block compilation also allows the use of non-descriptor arguments and return +values in non-trivial programs (\pxlref{number-local-call}). + + +\subsection{Block Compilation Semantics} + +The effect of block compilation can be envisioned as the compiler turning all +the \code{defun}s in the block compilation into a single \code{labels} form: +\begin{example} +(declaim (start-block fun1 fun3)) + +(defun fun1 () + ...) + +(defun fun2 () + ... + (fun1) + ...) + +(defun fun3 (x) + (if x + (fun1) + (fun2))) + +(declaim (end-block)) +\end{example} +becomes: +\begin{example} +(labels ((fun1 () + ...) + (fun2 () + ... + (fun1) + ...) + (fun3 (x) + (if x + (fun1) + (fun2)))) + (setf (fdefinition 'fun1) #'fun1) + (setf (fdefinition 'fun3) #'fun3)) +\end{example} +Calls between the block compiled functions are local calls, so changing the +global definition of \code{fun1} will have no effect on what \code{fun2} does; +\code{fun2} will keep calling the old \code{fun1}. + +The entry points \code{fun1} and \code{fun3} are still installed in +the \code{symbol-function} as the global definitions of the functions, +so a full call to an entry point works just as before. However, +\code{fun2} is not an entry point, so it is not globally defined. In +addition, \code{fun2} is only called in one place, so it will be let +converted. + + +\subsection{Block Compilation Declarations} +\cpsubindex{declarations}{block compilation} +\cindex{start-block declaration} +\cindex{end-block declaration} + +The \code{extensions:start-block} and \code{extensions:end-block} +declarations allow fine-grained control of block compilation. These +declarations are only legal as a global declarations (\code{declaim} +or \code{proclaim}). + +\noindent +\vspace{1 em} +The \code{start-block} declaration has this syntax: +\begin{example} +(start-block \mstar{\var{entry-point-name}}) +\end{example} +When processed by the compiler, this declaration marks the start of +block compilation, and specifies the entry points to that block. If +no entry points are specified, then \var{all} functions are made into +entry points. If already block compiling, then the compiler ends the +current block and starts a new one. + +\noindent +\vspace{1 em} +The \code{end-block} declaration has no arguments: +\begin{lisp} +(end-block) +\end{lisp} +The \code{end-block} declaration ends a block compilation unit without +starting a new one. This is useful mainly when only a portion of a file +is worth block compiling. + + +\subsection{Compiler Arguments} +\label{compile-file-block} +\cpsubindex{compile-file}{block compilation arguments} + +The \kwd{block-compile} and \kwd{entry-points} arguments to +\code{extensions:compile-from-stream} and \funref{compile-file} provide overall +control of block compilation, and allow block compilation without requiring +modification of the program source. + +There are three possible values of the \kwd{block-compile} argument: +\begin{Lentry} + +\item[\false{}] Do no compile-time resolution of global function + names, not even for self-recursive calls. This inhibits any + \code{start-block} declarations appearing in the file, allowing all + functions to be incrementally redefined. + +\item[\true{}] Start compiling in block compilation mode. This is + mainly useful for block compiling small files that contain no + \code{start-block} declarations. See also the \kwd{entry-points} + argument. + +\item[\kwd{specified}] Start compiling in form-at-a-time mode, but + exploit any \code{start-block} declarations and compile + self-recursive calls as local calls. Normally \kwd{specified} is + the default for this argument (see \varref{block-compile-default}.) +\end{Lentry} + +The \kwd{entry-points} argument can be used in conjunction with +\w{\kwd{block-compile} \true{}} to specify the entry-points to a +block-compiled file. If not specified or \nil, all global functions +will be compiled as entry points. When \kwd{block-compile} is not +\true, this argument is ignored. + +\begin{defvar}{}{block-compile-default} + + This variable determines the default value for the + \kwd{block-compile} argument to \code{compile-file} and + \code{compile-from-stream}. The initial value of this variable is + \kwd{specified}, but \false{} is sometimes useful for totally + inhibiting block compilation. +\end{defvar} + + +\subsection{Practical Difficulties} + +The main problem with block compilation is that the compiler uses +large amounts of memory when it is block compiling. This places an +upper limit on the amount of code that can be block compiled as a +unit. To make best use of block compilation, it is necessary to +locate the parts of the program containing many internal calls, and +then add the appropriate \code{start-block} declarations. When writing +new code, it is a good idea to put in block compilation declarations +from the very beginning, since writing block declarations correctly +requires accurate knowledge of the program's function call structure. +If you want to initially develop code with full incremental +redefinition, you can compile with \varref{block-compile-default} set to +\false. + +Note if a \code{defun} appears in a non-null lexical environment, then +calls to it cannot be block compiled. + +Unless files are very small, it is probably impractical to block compile +multiple files as a unit by specifying a list of files to \code{compile-file}. +Semi-inline expansion (\pxlref{semi-inline}) provides another way to +extend block compilation across file boundaries. + + +\subsection{Context Declarations} +\label{context-declarations} +\cindex{context sensitive declarations} +\cpsubindex{declarations}{context-sensitive} + +\cmucl{} has a context-sensitive declaration mechanism which is useful +because it allows flexible control of the compilation policy in large +systems without requiring changes to the source files. The primary +use of this feature is to allow the exported interfaces of a system to +be compiled more safely than the system internals. The context used +is the name being defined and the kind of definition (function, macro, +etc.) + +The \kwd{context-declarations} option to \macref{with-compilation-unit} has +dynamic scope, affecting all compilation done during the evaluation of the +body. The argument to this option should evaluate to a list of lists of the +form: +\begin{example} +(\var{context-spec} \mplus{\var{declare-form}}) +\end{example} +In the indicated context, the specified declare forms are inserted at +the head of each definition. The declare forms for all contexts that +match are appended together, with earlier declarations getting +precedence over later ones. A simple example: +\begin{example} + :context-declarations + '((:external (declare (optimize (safety 2))))) +\end{example} +This will cause all functions that are named by external symbols to be +compiled with \code{safety 2}. + +The full syntax of context specs is: +\begin{Lentry} + +\item[\kwd{internal}, \kwd{external}] True if the symbol is internal + (external) in its home package. + +\item[\kwd{uninterned}] True if the symbol has no home package. + +\item[\code{\w{(:package \mstar{\var{package-name}})}}] True if the + symbol's home package is in any of the named packages (false if + uninterned.) + +\item[\kwd{anonymous}] True if the function doesn't have any + interesting name (not \code{defmacro}, \code{defun}, \code{labels} + or \code{flet}). + +\item[\kwd{macro}, \kwd{function}] \kwd{macro} is a global + (\code{defmacro}) macro. \kwd{function} is anything else. + +\item[\kwd{local}, \kwd{global}] \kwd{local} is a \code{labels} or + \code{flet}. \kwd{global} is anything else. + +\item[\code{\w{(:or \mstar{\var{context-spec}})}}] True when any + supplied \var{context-spec} is true. + +\item[\code{\w{(:and \mstar{\var{context-spec}})}}] True only when all + supplied \var{context-spec}s are true. + +\item[\code{\w{(:not \mstar{\var{context-spec}})}}] True when + \var{context-spec} is false. + +\item[\code{\w{(:member \mstar{\var{name}})}}] True when the defined + name is one of these names (\code{equal} test.) + +\item[\code{\w{(:match \mstar{\var{pattern}})}}] True when any of the + patterns is a substring of the name. The name is wrapped with + \code{\$}'s, so ``\code{\$FOO}'' matches names beginning with + ``\code{FOO}'', etc. +\end{Lentry} + + +\subsection{Context Declaration Example} + +Here is a more complex example of \code{with-compilation-unit} options: +\begin{example} +:optimize '(optimize (speed 2) (space 2) (inhibit-warnings 2) + (debug 1) (safety 0)) +:optimize-interface '(optimize-interface (safety 1) (debug 1)) +:context-declarations +'(((:or :external (:and (:match "\%") (:match "SET"))) + (declare (optimize-interface (safety 2)))) + ((:or (:and :external :macro) + (:match "\$PARSE-")) + (declare (optimize (safety 2))))) +\end{example} +The \code{optimize} and \code{extensions:optimize-interface} +declarations (\pxlref{optimize-declaration}) set up the global +compilation policy. The bodies of functions are to be compiled +completely unsafe (\code{safety 0}), but argument count and weakened +argument type checking is to be done when a function is called +(\code{speed 2 safety 1}). + +The first declaration specifies that all functions that are external +or whose names contain both ``\code{\%}'' and ``\code{SET}'' are to be +compiled compiled with completely safe interfaces (\code{safety 2}). +The reason for this particular \kwd{match} rule is that \code{setf} +inverse functions in this system tend to have both strings in their +name somewhere. We want \code{setf} inverses to be safe because they +are implicitly called by users even though their name is not exported. + +The second declaration makes external macros or functions whose names +start with ``\code{PARSE-}'' have safe bodies (as well as interfaces). +This is desirable because a syntax error in a macro may cause a type +error inside the body. The \kwd{match} rule is used because macros +often have auxiliary functions whose names begin with this string. + +This particular example is used to build part of the standard \cmucl{} +system. Note however, that context declarations must be set up +according to the needs and coding conventions of a particular system; +different parts of \cmucl{} are compiled with different context +declarations, and your system will probably need its own declarations. +In particular, any use of the \kwd{match} option depends on naming +conventions used in coding. + + +\section{Inline Expansion} +\label{inline-expansion} +\cindex{inline expansion} +\cpsubindex{expansion}{inline} +\cpsubindex{call}{inline} +\cpsubindex{function call}{inline} +\cpsubindex{optimization}{function call} + +\python{} can expand almost any function inline, including functions +with keyword arguments. The only restrictions are that keyword +argument keywords in the call must be constant, and that global +function definitions (\code{defun}) must be done in a null lexical +environment (not nested in a \code{let} or other binding form.) Local +functions (\code{flet}) can be inline expanded in any environment. +Combined with \python{}'s source-level optimization, inline expansion +can be used for things that formerly required macros for efficient +implementation. In \python, macros don't have any efficiency +advantage, so they need only be used where a macro's syntactic +flexibility is required. + +Inline expansion is a compiler optimization technique that reduces +the overhead of a function call by simply not doing the call: +instead, the compiler effectively rewrites the program to appear as +though the definition of the called function was inserted at each +call site. In \llisp, this is straightforwardly expressed by +inserting the \code{lambda} corresponding to the original definition: +\begin{lisp} +(proclaim '(inline my-1+)) +(defun my-1+ (x) (+ x 1)) + +(my-1+ someval) \result{} ((lambda (x) (+ x 1)) someval) +\end{lisp} + +When the function expanded inline is large, the program after inline +expansion may be substantially larger than the original program. If +the program becomes too large, inline expansion hurts speed rather +than helping it, since hardware resources such as physical memory and +cache will be exhausted. Inline expansion is called for: +\begin{itemize} + +\item When profiling has shown that a relatively simple function is + called so often that a large amount of time is being wasted in the + calling of that function (as opposed to running in that function.) + If a function is complex, it will take a long time to run relative + the time spent in call, so the speed advantage of inline expansion + is diminished at the same time the space cost of inline expansion is + increased. Of course, if a function is rarely called, then the + overhead of calling it is also insignificant. + +\item With functions so simple that they take less space to inline + expand than would be taken to call the function (such as + \code{my-1+} above.) It would require intimate knowledge of the + compiler to be certain when inline expansion would reduce space, but + it is generally safe to inline expand functions whose definition is + a single function call, or a few calls to simple \clisp{} functions. +\end{itemize} + + +In addition to this speed/space tradeoff from inline expansion's +avoidance of the call, inline expansion can also reveal opportunities +for optimization. \python{}'s extensive source-level optimization can +make use of context information from the caller to tremendously +simplify the code resulting from the inline expansion of a function. + +The main form of caller context is local information about the actual +argument values: what the argument types are and whether the arguments +are constant. Knowledge about argument types can eliminate run-time +type tests (e.g., for generic arithmetic.) Constant arguments in a +call provide opportunities for constant folding optimization after +inline expansion. + +A hidden way that constant arguments are often supplied to functions +is through the defaulting of unsupplied optional or keyword arguments. +There can be a huge efficiency advantage to inline expanding functions +that have complex keyword-based interfaces, such as this definition of +the \code{member} function: +\begin{lisp} +(proclaim '(inline member)) +(defun member (item list &key + (key #'identity) + (test #'eql testp) + (test-not nil notp)) + (do ((list list (cdr list))) + ((null list) nil) + (let ((car (car list))) + (if (cond (testp + (funcall test item (funcall key car))) + (notp + (not (funcall test-not item (funcall key car)))) + (t + (funcall test item (funcall key car)))) + (return list))))) + +\end{lisp} +After inline expansion, this call is simplified to the obvious code: +\begin{lisp} +(member a l :key #'foo-a :test #'char=) \result{} + +(do ((list list (cdr list))) + ((null list) nil) + (let ((car (car list))) + (if (char= item (foo-a car)) + (return list)))) +\end{lisp} +In this example, there could easily be more than an order of magnitude +improvement in speed. In addition to eliminating the original call to +\code{member}, inline expansion also allows the calls to \code{char=} +and \code{foo-a} to be open-coded. We go from a loop with three tests +and two calls to a loop with one test and no calls. + +\xlref{source-optimization} for more discussion of source level +optimization. + + +\subsection{Inline Expansion Recording} +\cindex{recording of inline expansions} + +Inline expansion requires that the source for the inline expanded function to +be available when calls to the function are compiled. The compiler doesn't +remember the inline expansion for every function, since that would take an +excessive about of space. Instead, the programmer must tell the compiler to +record the inline expansion before the definition of the inline expanded +function is compiled. This is done by globally declaring the function inline +before the function is defined, by using the \code{inline} and +\code{extensions:maybe-inline} (\pxlref{maybe-inline-declaration}) +declarations. + +In addition to recording the inline expansion of inline functions at the time +the function is compiled, \code{compile-file} also puts the inline expansion in +the output file. When the output file is loaded, the inline expansion is made +available for subsequent compilations; there is no need to compile the +definition again to record the inline expansion. + +If a function is declared inline, but no expansion is recorded, then the +compiler will give an efficiency note like: + +\begin{example} +Note: MYFUN is declared inline, but has no expansion. +\end{example} + +When you get this note, check that the \code{inline} declaration and the +definition appear before the calls that are to be inline expanded. This note +will also be given if the inline expansion for a \code{defun} could not be +recorded because the \code{defun} was in a non-null lexical environment. + + +\subsection{Semi-Inline Expansion} +\label{semi-inline} + +\python{} supports \var{semi-inline} functions. Semi-inline expansion +shares a single copy of a function across all the calls in a component +by converting the inline expansion into a local function +(\pxlref{local-call}.) This takes up less space when there are +multiple calls, but also provides less opportunity for context +dependent optimization. When there is only one call, the result is +identical to normal inline expansion. Semi-inline expansion is done +when the \code{space} optimization quality is \code{0}, and the +function has been declared \code{extensions:maybe-inline}. + +This mechanism of inline expansion combined with local call also +allows recursive functions to be inline expanded. If a recursive +function is declared \code{inline}, calls will actually be compiled +semi-inline. Although recursive functions are often so complex that +there is little advantage to semi-inline expansion, it can still be +useful in the same sort of cases where normal inline expansion is +especially advantageous, i.e. functions where the calling context can +help a lot. + + +\subsection{The Maybe-Inline Declaration} +\label{maybe-inline-declaration} +\cindex{maybe-inline declaration} + +The \code{extensions:maybe-inline} declaration is a \cmucl{} +extension. It is similar to \code{inline}, but indicates that inline +expansion may sometimes be desirable, rather than saying that inline +expansion should almost always be done. When used in a global +declaration, \code{extensions:maybe-inline} causes the expansion for +the named functions to be recorded, but the functions aren't actually +inline expanded unless \code{space} is \code{0} or the function is +eventually (perhaps locally) declared \code{inline}. + +Use of the \code{extensions:maybe-inline} declaration followed by the +\code{defun} is preferable to the standard idiom of: +\begin{lisp} +(proclaim '(inline myfun)) +(defun myfun () ...) +(proclaim '(notinline myfun)) + +;;; \textit{Any calls to \code{myfun} here are not inline expanded.} + +(defun somefun () + (declare (inline myfun)) + ;; + ;; \textit{Calls to \code{myfun} here are inline expanded.} + ...) +\end{lisp} +The problem with using \code{notinline} in this way is that in +\clisp{} it does more than just suppress inline expansion, it also +forbids the compiler to use any knowledge of \code{myfun} until a +later \code{inline} declaration overrides the \code{notinline}. This +prevents compiler warnings about incorrect calls to the function, and +also prevents block compilation. + +The \code{extensions:maybe-inline} declaration is used like this: +\begin{lisp} +(proclaim '(extensions:maybe-inline myfun)) +(defun myfun () ...) + +;;; \textit{Any calls to \code{myfun} here are not inline expanded.} + +(defun somefun () + (declare (inline myfun)) + ;; + ;; \textit{Calls to \code{myfun} here are inline expanded.} + ...) + +(defun someotherfun () + (declare (optimize (space 0))) + ;; + ;; \textit{Calls to \code{myfun} here are expanded semi-inline.} + ...) +\end{lisp} +In this example, the use of \code{extensions:maybe-inline} causes the +expansion to be recorded when the \code{defun} for \code{somefun} is +compiled, and doesn't waste space through doing inline expansion by +default. Unlike \code{notinline}, this declaration still allows the +compiler to assume that the known definition really is the one that +will be called when giving compiler warnings, and also allows the +compiler to do semi-inline expansion when the policy is appropriate. + +When the goal is merely to control whether inline expansion is done by +default, it is preferable to use \code{extensions:maybe-inline} rather +than \code{notinline}. The \code{notinline} declaration should be +reserved for those special occasions when a function may be redefined +at run-time, so the compiler must be told that the obvious definition +of a function is not necessarily the one that will be in effect at the +time of the call. + + +\section{Byte Coded Compilation} +\label{byte-compile} +\cindex{byte coded compilation} +\cindex{space optimization} + +\python{} supports byte compilation to reduce the size of Lisp +programs by allowing functions to be compiled more compactly. Byte +compilation provides an extreme speed/space tradeoff: byte code is +typically six times more compact than native code, but runs fifty +times (or more) slower. This is about ten times faster than the +standard interpreter, which is itself considered fast in comparison to +other \clisp{} interpreters. + +Large Lisp systems (such as \cmucl{} itself) often have large amounts +of user-interface code, compile-time (macro) code, debugging code, or +rarely executed special-case code. This code is a good target for +byte compilation: very little time is spent running in it, but it can +take up quite a bit of space. Straight-line code with many function +calls is much more suitable than inner loops. + +When byte-compiling, the compiler compiles about twice as fast, and +can produce a hardware independent object file (\file{.bytef} type.) +This file can be loaded like a normal fasl file on any implementation +of \cmucl{} with the same byte-ordering. + +The decision to byte compile or native compile can be done on a +per-file or per-code-object basis. The \kwd{byte-compile} argument to +\funref{compile-file} has these possible values: + +\begin{Lentry} +\item[\false{}] Don't byte compile anything in this file. + +\item[\true{}] Byte compile everything in this file and produce a + processor-independent \file{.bytef} file. + +\item[\kwd{maybe}] Produce a normal fasl file, but byte compile any + functions for which the \code{speed} optimization quality is + \code{0} and the \code{debug} quality is not greater than \code{1}. +\end{Lentry} + +\begin{defvar}{extensions:}{byte-compile-top-level} + + If this variable is true (the default) and the \kwd{byte-compile} + argument to \code{compile-file} is \kwd{maybe}, then byte compile + top-level code (code outside of any \code{defun}, \code{defmethod}, + etc.) +\end{defvar} + +\begin{defvar}{extensions:}{byte-compile-default} + + This variable determines the default value for the + \kwd{byte-compile} argument to \code{compile-file}, initially + \kwd{maybe}. +\end{defvar} + + +\section{Object Representation} +\label{object-representation} +\cindex{object representation} +\cpsubindex{representation}{object} +\cpsubindex{efficiency}{of objects} + +A somewhat subtle aspect of writing efficient \clisp{} programs is +choosing the correct data structures so that the underlying objects +can be implemented efficiently. This is partly because of the need +for multiple representations for a given value +(\pxlref{non-descriptor}), but is also due to the sheer number of +object types that \clisp{} has built in. The number of possible +representations complicates the choice of a good representation +because semantically similar objects may vary in their efficiency +depending on how the program operates on them. + + +\subsection{Think Before You Use a List} +\cpsubindex{lists}{efficiency of} + +Although Lisp's creator seemed to think that it was for LISt +Processing, the astute observer may have noticed that the chapter on +list manipulation makes up less that three percent of \cltltwo{}. The +language has grown since Lisp 1.5\dash{}new data types supersede lists +for many purposes. + + +\subsection{Structure Representation} +\cpsubindex{structure types}{efficiency of} One of the best ways of +building complex data structures is to define appropriate structure +types using \findexed{defstruct}. In \python, access of structure +slots is always at least as fast as list or vector access, and is +usually faster. In comparison to a list representation of a tuple, +structures also have a space advantage. + +Even if structures weren't more efficient than other representations, structure +use would still be attractive because programs that use structures in +appropriate ways are much more maintainable and robust than programs written +using only lists. For example: +\begin{lisp} +(rplaca (caddr (cadddr x)) (caddr y)) +\end{lisp} +could have been written using structures in this way: +\begin{lisp} +(setf (beverage-flavor (astronaut-beverage x)) (beverage-flavor y)) +\end{lisp} +The second version is more maintainable because it is easier to +understand what it is doing. It is more robust because structures +accesses are type checked. An \code{astronaut} will never be confused +with a \code{beverage}, and the result of \code{beverage-flavor} is +always a flavor. See sections \ref{structure-types} and +\ref{freeze-type} for more information about structure types. +\xlref{type-inference} for a number of examples that make clear the +advantages of structure typing. + +Note that the structure definition should be compiled before any uses +of its accessors or type predicate so that these function calls can be +efficiently open-coded. + + +\subsection{Arrays} +\label{array-types} +\cpsubindex{arrays}{efficiency of} + +Arrays are often the most efficient representation for collections of objects +because: +\begin{itemize} + +\item Array representations are often the most compact. An array is + always more compact than a list containing the same number of + elements. + +\item Arrays allow fast constant-time access. + +\item Arrays are easily destructively modified, which can reduce + consing. + +\item Array element types can be specialized, which reduces both + overall size and consing (\pxlref{specialized-array-types}.) +\end{itemize} + + +Access of arrays that are not of type \code{simple-array} is less +efficient, so declarations are appropriate when an array is of a +simple type like \code{simple-string} or \code{simple-bit-vector}. +Arrays are almost always simple, but the compiler may not be able to +prove simpleness at every use. The only way to get a non-simple array +is to use the \kwd{displaced-to}, \kwd{fill-pointer} or +\code{adjustable} arguments to \code{make-array}. If you don't use +these hairy options, then arrays can always be declared to be simple. + +Because of the many specialized array types and the possibility of +non-simple arrays, array access is much like generic arithmetic +(\pxlref{generic-arithmetic}). In order for array accesses to be +efficiently compiled, the element type and simpleness of the array +must be known at compile time. If there is inadequate information, +the compiler is forced to call a generic array access routine. You +can detect inefficient array accesses by enabling efficiency notes, +\pxlref{efficiency-notes}. + + +\subsection{Vectors} +\cpsubindex{vectors}{efficiency of} + +Vectors (one dimensional arrays) are particularly useful, since in +addition to their obvious array-like applications, they are also well +suited to representing sequences. In comparison to a list +representation, vectors are faster to access and take up between two +and sixty-four times less space (depending on the element type.) As +with arbitrary arrays, the compiler needs to know that vectors are not +complex, so you should use \code{simple-string} in preference to +\code{string}, etc. + +The only advantage that lists have over vectors for representing +sequences is that it is easy to change the length of a list, add to it +and remove items from it. Likely signs of archaic, slow lisp code are +\code{nth} and \code{nthcdr}. If you are using these functions you +should probably be using a vector. + + +\subsection{Bit-Vectors} +\cpsubindex{bit-vectors}{efficiency of} + +Another thing that lists have been used for is set manipulation. In +applications where there is a known, reasonably small universe of +items bit-vectors can be used to improve performance. This is much +less convenient than using lists, because instead of symbols, each +element in the universe must be assigned a numeric index into the bit +vector. Using a bit-vector will nearly always be faster, and can be +tremendously faster if the number of elements in the set is not small. +The logical operations on \code{simple-bit-vector}s are efficient, +since they operate on a word at a time. + + +\subsection{Hashtables} +\cpsubindex{hash-tables}{efficiency of} + +Hashtables are an efficient and general mechanism for maintaining associations +such as the association between an object and its name. Although hashtables +are usually the best way to maintain associations, efficiency and style +considerations sometimes favor the use of an association list (a-list). + +\code{assoc} is fairly fast when the \var{test} argument is \code{eq} +or \code{eql} and there are only a few elements, but the time goes up +in proportion with the number of elements. In contrast, the +hash-table lookup has a somewhat higher overhead, but the speed is +largely unaffected by the number of entries in the table. For an +\code{equal} hash-table or alist, hash-tables have an even greater +advantage, since the test is more expensive. Whatever you do, be sure +to use the most restrictive test function possible. + +The style argument observes that although hash-tables and alists +overlap in function, they do not do all things equally well. +\begin{itemize} + +\item Alists are good for maintaining scoped environments. They were + originally invented to implement scoping in the Lisp interpreter, + and are still used for this in \python. With an alist one can + non-destructively change an association simply by consing a new + element on the front. This is something that cannot be done with + hash-tables. + +\item Hashtables are good for maintaining a global association. The + value associated with an entry can easily be changed with + \code{setf}. With an alist, one has to go through contortions, + either \code{rplacd}'ing the cons if the entry exists, or pushing a + new one if it doesn't. The side-effecting nature of hash-table + operations is an advantage here. +\end{itemize} + + +Historically, symbol property lists were often used for global name +associations. Property lists provide an awkward and error-prone +combination of name association and record structure. If you must use +the property list, please store all the related values in a single +structure under a single property, rather than using many properties. +This makes access more efficient, and also adds a modicum of typing +and abstraction. \xlref{advanced-type-stuff} for information on types +in \cmucl. + + +\section{Numbers} +\label{numeric-types} +\cpsubindex{numeric}{types} +\cpsubindex{types}{numeric} + +Numbers are interesting because numbers are one of the few \llisp{} data types +that have direct support in conventional hardware. If a number can be +represented in the way that the hardware expects it, then there is a big +efficiency advantage. + +Using hardware representations is problematical in \llisp{} due to +dynamic typing (where the type of a value may be unknown at compile +time.) It is possible to compile code for statically typed portions +of a \llisp{} program with efficiency comparable to that obtained in +statically typed languages such as C, but not all \llisp{} +implementations succeed. There are two main barriers to efficient +numerical code in \llisp{}: +\begin{itemize} + +\item The compiler must prove that the numerical expression is in fact + statically typed, and + +\item The compiler must be able to somehow reconcile the conflicting + demands of the hardware mandated number representation with the + \llisp{} requirements of dynamic typing and garbage-collecting + dynamic storage allocation. +\end{itemize} + +Because of its type inference (\pxlref{type-inference}) and efficiency +notes (\pxlref{efficiency-notes}), \python{} is better than +conventional \llisp{} compilers at ensuring that numerical expressions +are statically typed. \python{} also goes somewhat farther than existing +compilers in the area of allowing native machine number +representations in the presence of garbage collection. + + +\subsection{Descriptors} +\cpsubindex{descriptors}{object} +\cindex{object representation} +\cpsubindex{representation}{object} +\cpsubindex{consing}{overhead of} + +\llisp{}'s dynamic typing requires that it be possible to represent +any value with a fixed length object, known as a \var{descriptor}. +This fixed-length requirement is implicit in features such as: +\begin{itemize} + +\item Data types (like \code{simple-vector}) that can contain any type + of object, and that can be destructively modified to contain + different objects (of possibly different types.) + +\item Functions that can be called with any type of argument, and that + can be redefined at run time. +\end{itemize} + +In order to save space, a descriptor is invariably represented as a +single word. Objects that can be directly represented in the +descriptor itself are said to be \var{immediate}. Descriptors for +objects larger than one word are in reality pointers to the memory +actually containing the object. + +Representing objects using pointers has two major disadvantages: +\begin{itemize} + +\item The memory pointed to must be allocated on the heap, so it must + eventually be freed by the garbage collector. Excessive heap + allocation of objects (or ``consing'') is inefficient in several + ways. \xlref{consing}. + +\item Representing an object in memory requires the compiler to emit + additional instructions to read the actual value in from memory, and + then to write the value back after operating on it. +\end{itemize} + +The introduction of garbage collection makes things even worse, since +the garbage collector must be able to determine whether a descriptor +is an immediate object or a pointer. This requires that a few bits in +each descriptor be dedicated to the garbage collector. The loss of a +few bits doesn't seem like much, but it has a major efficiency +implication\dash{}objects whose natural machine representation is a +full word (integers and single-floats) cannot have an immediate +representation. So the compiler is forced to use an unnatural +immediate representation (such as \code{fixnum}) or a natural pointer +representation (with the attendant consing overhead.) + + +\subsection{Non-Descriptor Representations} +\label{non-descriptor} +\cindex{non-descriptor representations} +\cindex{stack numbers} + +From the discussion above, we can see that the standard descriptor +representation has many problems, the worst being number consing. +\llisp{} compilers try to avoid these descriptor efficiency problems by using +\var{non-descriptor} representations. A compiler that uses non-descriptor +representations can compile this function so that it does no number consing: +\begin{lisp} +(defun multby (vec n) + (declare (type (simple-array single-float (*)) vec) + (single-float n)) + (dotimes (i (length vec)) + (setf (aref vec i) + (* n (aref vec i))))) +\end{lisp} +If a descriptor representation were used, each iteration of the loop might +cons two floats and do three times as many memory references. + +As its negative definition suggests, the range of possible non-descriptor +representations is large. The performance improvement from non-descriptor +representation depends upon both the number of types that have non-descriptor +representations and the number of contexts in which the compiler is forced to +use a descriptor representation. + +Many \llisp{} compilers support non-descriptor representations for +float types such as \code{single-float} and \code{double-float} +(section \ref{float-efficiency}.) \python{} adds support for full +word integers (\pxlref{word-integers}), characters +(\pxlref{characters}) and system-area pointers (unconstrained +pointers, \pxlref{system-area-pointers}.) Many \llisp{} compilers +support non-descriptor representations for variables (section +\ref{ND-variables}) and array elements (section +\ref{specialized-array-types}.) \python{} adds support for +non-descriptor arguments and return values in local call +(\pxlref{number-local-call}) and structure slots (\pxlref{raw-slots}). + + +\subsection{Variables} +\label{ND-variables} +\cpsubindex{variables}{non-descriptor} +\cpsubindex{type declarations}{variable} +\cpsubindex{efficiency}{of numeric variables} + +In order to use a non-descriptor representation for a variable or +expression intermediate value, the compiler must be able to prove that +the value is always of a particular type having a non-descriptor +representation. Type inference (\pxlref{type-inference}) often needs +some help from user-supplied declarations. The best kind of type +declaration is a variable type declaration placed at the binding +point: +\begin{lisp} +(let ((x (car l))) + (declare (single-float x)) + ...) +\end{lisp} +Use of \code{the}, or of variable declarations not at the binding form +is insufficient to allow non-descriptor representation of the +variable\dash{}with these declarations it is not certain that all +values of the variable are of the right type. It is sometimes useful +to introduce a gratuitous binding that allows the compiler to change +to a non-descriptor representation, like: +\begin{lisp} +(etypecase x + ((signed-byte 32) + (let ((x x)) + (declare (type (signed-byte 32) x)) + ...)) + ...) +\end{lisp} +The declaration on the inner \code{x} is necessary here due to a phase +ordering problem. Although the compiler will eventually prove that +the outer \code{x} is a \w{\code{(signed-byte 32)}} within that +\code{etypecase} branch, the inner \code{x} would have been optimized +away by that time. Declaring the type makes let optimization more +cautious. + +Note that storing a value into a global (or \code{special}) variable +always forces a descriptor representation. Wherever possible, you +should operate only on local variables, binding any referenced globals +to local variables at the beginning of the function, and doing any +global assignments at the end. + +Efficiency notes signal use of inefficient representations, so +programmer's needn't continuously worry about the details of +representation selection (\pxlref{representation-eff-note}.) + + +\subsection{Generic Arithmetic} +\label{generic-arithmetic} +\cindex{generic arithmetic} +\cpsubindex{arithmetic}{generic} +\cpsubindex{numeric}{operation efficiency} + +In \clisp, arithmetic operations are \var{generic}.\footnote{As Steele + notes in CLTL II, this is a generic conception of generic, and is + not to be confused with the CLOS concept of a generic function.} +The \code{+} function can be passed \code{fixnum}s, \code{bignum}s, +\code{ratio}s, and various kinds of \code{float}s and +\code{complex}es, in any combination. In addition to the inherent +complexity of \code{bignum} and \code{ratio} operations, there is also +a lot of overhead in just figuring out which operation to do and what +contagion and canonicalization rules apply. The complexity of generic +arithmetic is so great that it is inconceivable to open code it. +Instead, the compiler does a function call to a generic arithmetic +routine, consuming many instructions before the actual computation +even starts. + +This is ridiculous, since even \llisp{} programs do a lot of +arithmetic, and the hardware is capable of doing operations on small +integers and floats with a single instruction. To get acceptable +efficiency, the compiler special-cases uses of generic arithmetic that +are directly implemented in the hardware. In order to open code +arithmetic, several constraints must be met: +\begin{itemize} + +\item All the arguments must be known to be a good type of number. + +\item The result must be known to be a good type of number. + +\item Any intermediate values such as the result of \w{\code{(+ a b)}} + in the call \w{\code{(+ a b c)}} must be known to be a good type of + number. + +\item All the above numbers with good types must be of the \var{same} + good type. Don't try to mix integers and floats or different float + formats. +\end{itemize} + +The ``good types'' are \w{\code{(signed-byte 32)}}, +\w{\code{(unsigned-byte 32)}}, \code{single-float}, +\code{double-float}, \code{(complex single-float)}, and \code{(complex + double-float)}. See sections \ref{fixnums}, \ref{word-integers} +and \ref{float-efficiency} for more discussion of good numeric types. + +\code{float} is not a good type, since it might mean either +\code{single-float} or \code{double-float}. \code{integer} is not a +good type, since it might mean \code{bignum}. \code{rational} is not +a good type, since it might mean \code{ratio}. Note however that +these types are still useful in declarations, since type inference may +be able to strengthen a weak declaration into a good one, when it +would be at a loss if there was no declaration at all +(\pxlref{type-inference}). The \code{integer} and +\code{unsigned-byte} (or non-negative integer) types are especially +useful in this regard, since they can often be strengthened to a good +integer type. + +% Arithmetic with \code{complex} numbers is inefficient in comparison to +% float and integer arithmetic. Complex numbers are always represented +% with a pointer descriptor (causing consing overhead), and complex +% arithmetic is always closed coded using the general generic arithmetic +As noted above, \cmucl{} has support for \code{(complex single-float)} +and \code{(complex double-float)}. These can be unboxed and, thus, +are quite efficient. However, arithmetic with complex types such as: +\begin{lisp} +(complex float) +(complex fixnum) +\end{lisp} +will be significantly slower than the good complex types but is still +faster than \code{bignum} or \code{ratio} arithmetic, since the +implementation is much simpler. + +Note: don't use \code{/} to divide integers unless you want the +overhead of rational arithmetic. Use \code{truncate} even when you +know that the arguments divide evenly. + +You don't need to remember all the rules for how to get open-coded +arithmetic, since efficiency notes will tell you when and where there +is a problem\dash{}\pxlref{efficiency-notes}. + + +\subsection{Fixnums} +\label{fixnums} +\cindex{fixnums} +\cindex{bignums} + +A fixnum is a ``FIXed precision NUMber''. In modern \llisp{} +implementations, fixnums can be represented with an immediate +descriptor, so operating on fixnums requires no consing or memory +references. Clever choice of representations also allows some +arithmetic operations to be done on fixnums using hardware supported +word-integer instructions, somewhat reducing the speed penalty for +using an unnatural integer representation. + +It is useful to distinguish the \code{fixnum} type from the fixnum +representation of integers. In \python, there is absolutely nothing +magical about the \code{fixnum} type in comparison to other finite +integer types. \code{fixnum} is equivalent to (is defined with +\code{deftype} to be) \w{\code{(signed-byte 30)}}. \code{fixnum} is +simply the largest subset of integers that {\em can be represented} +using an immediate fixnum descriptor. + +Unlike in other \clisp{} compilers, it is in no way desirable to use +the \code{fixnum} type in declarations in preference to more +restrictive integer types such as \code{bit}, \w{\code{(integer -43 + 7)}} and \w{\code{(unsigned-byte 8)}}. Since \python{} does +understand these integer types, it is preferable to use the more +restrictive type, as it allows better type inference +(\pxlref{operation-type-inference}.) + +The small, efficient fixnum is contrasted with bignum, or ``BIG +NUMber''. This is another descriptor representation for integers, but +this time a pointer representation that allows for arbitrarily large +integers. Bignum operations are less efficient than fixnum +operations, both because of the consing and memory reference overheads +of a pointer descriptor, and also because of the inherent complexity +of extended precision arithmetic. While fixnum operations can often +be done with a single instruction, bignum operations are so complex +that they are always done using generic arithmetic. + +A crucial point is that the compiler will use generic arithmetic if it +can't \var{prove} that all the arguments, intermediate values, and +results are fixnums. With bounded integer types such as +\code{fixnum}, the result type proves to be especially problematical, +since these types are not closed under common arithmetic operations +such as \code{+}, \code{-}, \code{*} and \code{/}. For example, +\w{\code{(1+ (the fixnum x))}} does not necessarily evaluate to a +\code{fixnum}. Bignums were added to \llisp{} to get around this +problem, but they really just transform the correctness problem ``if +this add overflows, you will get the wrong answer'' to the efficiency +problem ``if this add \var{might} overflow then your program will run +slowly (because of generic arithmetic.)'' + +There is just no getting around the fact that the hardware only +directly supports short integers. To get the most efficient open +coding, the compiler must be able to prove that the result is a good +integer type. This is an argument in favor of using more restrictive +integer types: \w{\code{(1+ (the fixnum x))}} may not always be a +\code{fixnum}, but \w{\code{(1+ (the (unsigned-byte 8) x))}} always +is. Of course, you can also assert the result type by putting in lots +of \code{the} declarations and then compiling with \code{safety} +\code{0}. + + +\subsection{Word Integers} +\label{word-integers} +\cindex{word integers} + +\python{} is unique in its efficient implementation of arithmetic +on full-word integers through non-descriptor representations and open coding. +Arithmetic on any subtype of these types: + +\begin{lisp} +(signed-byte 32) +(unsigned-byte 32) +\end{lisp} + +is reasonably efficient, although subtypes of \code{fixnum} remain +somewhat more efficient. + +If a word integer must be represented as a descriptor, then the +\code{bignum} representation is used, with its associated consing +overhead. The support for word integers in no way changes the +language semantics, it just makes arithmetic on small bignums vastly +more efficient. It is fine to do arithmetic operations with mixed +\code{fixnum} and word integer operands; just declare the most +specific integer type you can, and let the compiler decide what +representation to use. + +In fact, to most users, the greatest advantage of word integer +arithmetic is that it effectively provides a few guard bits on the +fixnum representation. If there are missing assertions on +intermediate values in a fixnum expression, the intermediate results +can usually be proved to fit in a word. After the whole expression is +evaluated, there will often be a fixnum assertion on the final result, +allowing creation of a fixnum result without even checking for +overflow. + +The remarks in section \ref{fixnums} about fixnum result type also +apply to word integers; you must be careful to give the compiler +enough information to prove that the result is still a word integer. +This time, though, when we blow out of word integers we land in into +generic bignum arithmetic, which is much worse than sleazing from +\code{fixnum}s to word integers. Note that mixing +\w{\code{(unsigned-byte 32)}} arguments with arguments of any signed +type (such as \code{fixnum}) is a no-no, since the result might not be +unsigned. + + +\subsection{Floating Point Efficiency} +\label{float-efficiency} +\cindex{floating point efficiency} + +Arithmetic on objects of type \code{single-float} and \code{double-float} is +efficiently implemented using non-descriptor representations and open coding. +As for integer arithmetic, the arguments must be known to be of the same float +type. Unlike for integer arithmetic, the results and intermediate values +usually take care of themselves due to the rules of float contagion, i.e. +\w{\code{(1+ (the single-float x))}} is always a \code{single-float}. + +Although they are not specially implemented, \code{short-float} and +\code{long-float} are also acceptable in declarations, since they are +synonyms for the \code{single-float} and \code{double-float} types, +respectively. + +In \cmucl{}, list-style float type specifiers such as +\w{\code{(single-float 0.0 1.0)}} will be used to good effect. + +For example, in this function, + +\begin{example} + (defun square (x) + (declare (type (single-float 0f0 10f0))) + (* x x)) +\end{example} + +\python{} can deduce that the +return type of the function \code{square} is \w{\code{(single-float + 0f0 100f0)}}. + +Many union types are also supported so that + +\begin{example} + (+ (the (or (integer 1 1) (integer 5 5)) x) + (the (or (integer 10 10) (integer 20 20)) y)) +\end{example} + +has the inferred type \code{(or (integer 11 11) (integer 15 15) + (integer 21 21) (integer 25 25))}. This also works for +floating-point numbers. Member types are also supported. + +\cmucl{} can also infer types for many mathematical functions +including square root, exponential and logarithmic functions, +trignometric functions and their inverses, and hyperbolic functions +and their inverses. For numeric code, this can greatly enhance +efficiency by allowing the compiler to use specialized versions of +the functions instead of the generic versions. The greatest benefit +of this type inference is determining that the result of the +function is real-valued number instead of possibly being +a complex-valued number. + +For example, consider the function +\begin{example} + (defun fun (x) + (declare (type (single-float (0f0) 100f0) x)) + (values (sqrt x) (log x))) +\end{example} +With this declaration, the compiler can determine that the argument +to \code{sqrt} and \code{log} are always non-negative so that the result +is always a \code{single-float}. In fact, the return type for this +function is derived to be \code{(values (single-float 0f0 10f0) + (single-float * 2f0))}. + +If the declaration were reduced to just \w{\code{(declare + (single-float x))}}, the argument to \code{sqrt} and \code{log} +could be negative. This forces the use of the generic versions of +these functions because the result could be a complex number. + +We note, however, that proper interval arithmetic is not fully +implemented in the compiler so the inferred types may be slightly in +error due to round-off errors. This round-off error could +accumulate to cause the compiler to erroneously deduce the result +type and cause code to be removed as being +unreachable.\footnote{This, however, has not actually happened, but + it is a possibility.}% +Thus, the declarations should only be precise enough for the +compiler to deduce that a real-valued argument to a function would +produce a real-valued result. The efficiency notes +(\pxlref{representation-eff-note}) from the compiler will guide you +on what declarations might be useful. + +When a float must be represented as a descriptor, a pointer representation is +used, creating consing overhead. For this reason, you should try to avoid +situations (such as full call and non-specialized data structures) that force a +descriptor representation. See sections \ref{specialized-array-types}, +\ref{raw-slots} and \ref{number-local-call}. + +\xlref{ieee-float} for information on the extensions to support IEEE +floating point. + +\subsubsection{Signed Zeroes and Special Functions} + +\cmucl{} supports IEEE signed zeroes. In typical usage, the signed +zeroes are not a problem and can be treated as an unsigned zero. +However, some of the special functions have branch points at zero, so +care must be taken. + +For example, suppose we have the function +\begin{example} + (defun fun (x) + (declare (type (single-float 0f0) x)) + (log x)) +\end{example} +The derived result of the function is \code{(OR SINGLE-FLOAT +(COMPLEX SINGLE-FLOAT))} because the declared values for +\code{x} includes both $-0.0$ and $0.0$ and \code{(log -0.0)} is +actually a complex number. Because of this, the generic complex log +routine is used. + +If the declaration for \code{x} were \code{(single-float (0f0))} so $+0.0$ +is not included or \code{(or (single-float (0f0)) (member 0f0))} so + $+0.0$ is include but not $-0.0$, the derived type would be + \code{single-float} for both cases. By declaring \code{x} this way, + the log can be implemented using a fast real-valued log routine + instead of the generic log routine. + +\cmucl{} implements the branch cuts and values given by +Kahan\footnote{Kahan, W., ``Branch Cuts for Complex Elementary +Functions, or Much Ado About Nothing's Sign Bit'' +in Iserles and Powell (eds.) \textit{The State of the Art +in Numerical Analysis}, pp. 165-211, Clarendon +Press, 1987}. + + + +\subsection{Specialized Arrays} +\label{specialized-array-types} +\cindex{specialized array types} +\cpsubindex{array types}{specialized} +\cpsubindex{types}{specialized array} + +\clisp{} supports specialized array element types through the +\kwd{element-type} argument to \code{make-array}. When an array has a +specialized element type, only elements of that type can be stored in +the array. From this restriction comes two major efficiency +advantages: +\begin{itemize} + +\item A specialized array can save space by packing multiple elements + into a single word. For example, a \code{base-char} array can have + 4 elements per word, and a \code{bit} array can have 32. This + space-efficient representation is possible because it is not + necessary to separately indicate the type of each element. + +\item The elements in a specialized array can be given the same + non-descriptor representation as the one used in registers and on + the stack, eliminating the need for representation conversions when + reading and writing array elements. For objects with pointer + descriptor representations (such as floats and word integers) there + is also a substantial consing reduction because it is not necessary + to allocate a new object every time an array element is modified. +\end{itemize} + + +These are the specialized element types currently supported: +\begin{lisp} +bit +(unsigned-byte 2) +(unsigned-byte 4) +(unsigned-byte 8) +(unsigned-byte 16) +(unsigned-byte 32) +(signed-byte 8) +(signed-byte 16) +(signed-byte 30) +(signed-byte 32) +base-character +single-float +double-float +ext:double-double-float +(complex single-float) +(complex double-float) +(complex ext:double-double-float) +\end{lisp} + +Although a \code{simple-vector} can hold any type of object, \true{} +should still be considered a specialized array type, since arrays with +element type \true{} are specialized to hold descriptors. + + + +When using non-descriptor representations, it is particularly +important to make sure that array accesses are open-coded, since in +addition to the generic operation overhead, efficiency is lost when +the array element is converted to a descriptor so that it can be +passed to (or from) the generic access routine. You can detect +inefficient array accesses by enabling efficiency notes, +\pxlref{efficiency-notes}. \xlref{array-types}. + + +\subsection{Specialized Structure Slots} +\label{raw-slots} +\cpsubindex{structure types}{numeric slots} +\cindex{specialized structure slots} + +Structure slots declared by the \kwd{type} \code{defstruct} slot option +to have certain known numeric types are also given non-descriptor +representations. These types (and subtypes of these types) are supported: +\begin{lisp} +(unsigned-byte 32) +single-float +double-float +(complex single-float) +(complex double-float) +\end{lisp} + +The primary advantage of specialized slot representations is a large +reduction spurious memory allocation and access overhead of programs +that intensively use these types. + + +\subsection{Interactions With Local Call} +\label{number-local-call} +\cpsubindex{local call}{numeric operands} +\cpsubindex{call}{numeric operands} +\cindex{numbers in local call} + +Local call has many advantages (\pxlref{local-call}); one relevant to +our discussion here is that local call extends the usefulness of +non-descriptor representations. If the compiler knows from the +argument type that an argument has a non-descriptor representation, +then the argument will be passed in that representation. The easiest +way to ensure that the argument type is known at compile time is to +always declare the argument type in the called function, like: +\begin{lisp} +(defun 2+f (x) + (declare (single-float x)) + (+ x 2.0)) +\end{lisp} +The advantages of passing arguments and return values in a non-descriptor +representation are the same as for non-descriptor representations in general: +reduced consing and memory access (\pxlref{non-descriptor}.) This +extends the applicative programming styles discussed in section +\ref{local-call} to numeric code. Also, if source files are kept reasonably +small, block compilation can be used to reduce number consing to a minimum. + +Note that non-descriptor return values can only be used with the known return +convention (section \ref{local-call-return}.) If the compiler can't prove that +a function always returns the same number of values, then it must use the +unknown values return convention, which requires a descriptor representation. +Pay attention to the known return efficiency notes to avoid number consing. + + +\subsection{Representation of Characters} +\label{characters} +\cindex{characters} +\cindex{strings} + +\python{} also uses a non-descriptor representation for characters when +convenient. This improves the efficiency of string manipulation, but is +otherwise pretty invisible; characters have an immediate descriptor +representation, so there is not a great penalty for converting a character to a +descriptor. Nonetheless, it may sometimes be helpful to declare +character-valued variables as \code{base-character}. + + +\section{General Efficiency Hints} +\label{general-efficiency} +\cpsubindex{efficiency}{general hints} + +This section is a summary of various implementation costs and ways to get +around them. These hints are relatively unrelated to the use of the \python{} +compiler, and probably also apply to most other \llisp{} implementations. In +each section, there are references to related in-depth discussion. + + +\subsection{Compile Your Code} +\cpsubindex{compilation}{why to} + +At this point, the advantages of compiling code relative to running it +interpreted probably need not be emphasized too much, but remember that +in \cmucl, compiled code typically runs hundreds of times faster than +interpreted code. Also, compiled (\code{fasl}) files load significantly faster +than source files, so it is worthwhile compiling files which are loaded many +times, even if the speed of the functions in the file is unimportant. + +Even disregarding the efficiency advantages, compiled code is as good or better +than interpreted code. Compiled code can be debugged at the source level (see +chapter \ref{debugger}), and compiled code does more error checking. For these +reasons, the interpreter should be regarded mainly as an interactive command +interpreter, rather than as a programming language implementation. + +\b{Do not} be concerned about the performance of your program until you +see its speed compiled. Some techniques that make compiled code run +faster make interpreted code run slower. + + +\subsection{Avoid Unnecessary Consing} +\label{consing} +\cindex{consing} +\cindex{garbage collection} +\cindex{memory allocation} +\cpsubindex{efficiency}{of memory use} + + +Consing is another name for allocation of storage, as done by the +\code{cons} function (hence its name.) \code{cons} is by no means the +only function which conses\dash{}so does \code{make-array} and many +other functions. Arithmetic and function call can also have hidden +consing overheads. Consing hurts performance in the following ways: +\begin{itemize} + +\item Consing reduces memory access locality, increasing paging + activity. + +\item Consing takes time just like anything else. + +\item Any space allocated eventually needs to be reclaimed, either by + garbage collection or by starting a new \code{lisp} process. +\end{itemize} + + +Consing is not undiluted evil, since programs do things other than +consing, and appropriate consing can speed up the real work. It would +certainly save time to allocate a vector of intermediate results that +are reused hundreds of times. Also, if it is necessary to copy a +large data structure many times, it may be more efficient to update +the data structure non-destructively; this somewhat increases update +overhead, but makes copying trivial. + +Note that the remarks in section \ref{efficiency-overview} about the +importance of separating tuning from coding also apply to consing +overhead. The majority of consing will be done by a small portion of +the program. The consing hot spots are even less predictable than the +CPU hot spots, so don't waste time and create bugs by doing +unnecessary consing optimization. During initial coding, avoid +unnecessary side-effects and cons where it is convenient. If +profiling reveals a consing problem, \var{then} go back and fix the +hot spots. + +\xlref{non-descriptor} for a discussion of how to avoid number consing +in \python. + + +\subsection{Complex Argument Syntax} +\cpsubindex{argument syntax}{efficiency} +\cpsubindex{efficiency}{of argument syntax} +\cindex{keyword argument efficiency} +\cindex{rest argument efficiency} + +\clisp{} has very powerful argument passing mechanisms. Unfortunately, two +of the most powerful mechanisms, rest arguments and keyword arguments, have a +significant performance penalty: + +\begin{itemize} +\item +With keyword arguments, the called function has to parse the supplied keywords +by iterating over them and checking them against the desired keywords. + +\item +With rest arguments, the function must cons a list to hold the arguments. If a +function is called many times or with many arguments, large amounts of memory +will be allocated. +\end{itemize} + +Although rest argument consing is worse than keyword parsing, neither problem +is serious unless thousands of calls are made to such a function. The use of +keyword arguments is strongly encouraged in functions with many arguments or +with interfaces that are likely to be extended, and rest arguments are often +natural in user interface functions. + +Optional arguments have some efficiency advantage over keyword +arguments, but their syntactic clumsiness and lack of extensibility +has caused many \clisp{} programmers to abandon use of optionals +except in functions that have obviously simple and immutable +interfaces (such as \code{subseq}), or in functions that are only +called in a few places. When defining an interface function to be +used by other programmers or users, use of only required and keyword +arguments is recommended. + +Parsing of \code{defmacro} keyword and rest arguments is done at +compile time, so a macro can be used to provide a convenient syntax +with an efficient implementation. If the macro-expanded form contains +no keyword or rest arguments, then it is perfectly acceptable in inner +loops. + +Keyword argument parsing overhead can also be avoided by use of inline +expansion (\pxlref{inline-expansion}) and block compilation (section +\ref{block-compilation}.) + +Note: the compiler open-codes most heavily used system functions which have +keyword or rest arguments, so that no run-time overhead is involved. + + +\subsection{Mapping and Iteration} +\cpsubindex{mapping}{efficiency of} + +One of the traditional \llisp{} programming styles is a highly applicative one, +involving the use of mapping functions and many lists to store intermediate +results. To compute the sum of the square-roots of a list of numbers, one +might say: + +\begin{lisp} +(apply #'+ (mapcar #'sqrt list-of-numbers)) +\end{lisp} + +This programming style is clear and elegant, but unfortunately results +in slow code. There are two reasons why: + +\begin{itemize} +\item The creation of lists of intermediate results causes much + consing (see \ref{consing}). + +\item Each level of application requires another scan down the list. + Thus, disregarding other effects, the above code would probably take + twice as long as a straightforward iterative version. +\end{itemize} + + +An example of an iterative version of the same code: +\begin{lisp} +(do ((num list-of-numbers (cdr num)) + (sum 0 (+ (sqrt (car num)) sum))) + ((null num) sum)) +\end{lisp} + +See sections \ref{variable-type-inference} and \ref{let-optimization} +for a discussion of the interactions of iteration constructs with type +inference and variable optimization. Also, section +\ref{local-tail-recursion} discusses an applicative style of +iteration. + + +\subsection{Trace Files and Disassembly} +\label{trace-files} +\cindex{trace files} +\cindex{assembly listing} +\cpsubindex{listing files}{trace} +\cindex{Virtual Machine (VM, or IR2) representation} +\cindex{implicit continuation representation (IR1)} +\cpsubindex{continuations}{implicit representation} + +In order to write efficient code, you need to know the relative costs +of different operations. The main reason why writing efficient +\llisp{} code is difficult is that there are so many operations, and +the costs of these operations vary in obscure context-dependent ways. +Although efficiency notes point out some problem areas, the only way +to ensure generation of the best code is to look at the assembly code +output. + +The \code{disassemble} function is a convenient way to get the assembly code for a +function, but it can be very difficult to interpret, since the correspondence +with the original source code is weak. A better (but more awkward) option is +to use the \kwd{trace-file} argument to \code{compile-file} to generate a trace +file. + +A trace file is a dump of the compiler's internal representations, +including annotated assembly code. Each component in the program gets +four pages in the trace file (separated by ``\code{$\hat{ }L$}''): +\begin{itemize} + +\item The implicit-continuation (or IR1) representation of the + optimized source. This is a dump of the flow graph representation + used for ``source level'' optimizations. As you will quickly + notice, it is not really very close to the source. This + representation is not very useful to even sophisticated users. + +\item The Virtual Machine (VM, or IR2) representation of the program. + This dump represents the generated code as sequences of ``Virtual + OPerations'' (VOPs.) This representation is intermediate between + the source and the assembly code\dash{}each VOP corresponds fairly + directly to some primitive function or construct, but a given VOP + also has a fairly predictable instruction sequence. An operation + (such as \code{+}) may have multiple implementations with different + cost and applicability. The choice of a particular VOP such as + \code{+/fixnum} or \code{+/single-float} represents this choice of + implementation. Once you are familiar with it, the VM + representation is probably the most useful for determining what + implementation has been used. + +\item An assembly listing, annotated with the VOP responsible for + generating the instructions. This listing is useful for figuring + out what a VOP does and how it is implemented in a particular + context, but its large size makes it more difficult to read. + +\item A disassembly of the generated code, which has all + pseudo-operations expanded out, but is not annotated with VOPs. +\end{itemize} + + +Note that trace file generation takes much space and time, since the trace file +is tens of times larger than the source file. To avoid huge confusing trace +files and much wasted time, it is best to separate the critical program portion +into its own file and then generate the trace file from this small file. + + +\section{Efficiency Notes} +\label{efficiency-notes} +\cindex{efficiency notes} +\cpsubindex{notes}{efficiency} +\cindex{tuning} + +Efficiency notes are messages that warn the user that the compiler has +chosen a relatively inefficient implementation for some operation. +Usually an efficiency note reflects the compiler's desire for more +type information. If the type of the values concerned is known to the +programmer, then additional declarations can be used to get a more +efficient implementation. + +Efficiency notes are controlled by the +\code{extensions:inhibit-warnings} (\pxlref{optimize-declaration}) +optimization quality. When \code{speed} is greater than +\code{extensions:inhibit-warnings}, efficiency notes are enabled. +Note that this implicitly enables efficiency notes whenever +\code{speed} is increased from its default of \code{1}. + +Consider this program with an obscure missing declaration: + +\begin{lisp} +(defun eff-note (x y z) + (declare (fixnum x y z)) + (the fixnum (+ x y z))) +\end{lisp} + +If compiled with \code{\w{(speed 3) (safety 0)}}, this note is given: + +\begin{example} +In: DEFUN EFF-NOTE + (+ X Y Z) +==> + (+ (+ X Y) Z) +Note: Forced to do inline (signed-byte 32) arithmetic (cost 3). + Unable to do inline fixnum arithmetic (cost 2) because: + The first argument is a (INTEGER -1073741824 1073741822), + not a FIXNUM. +\end{example} + +This efficiency note tells us that the result of the intermediate +computation \code{\w{(+ x y)}} is not known to be a \code{fixnum}, so +the addition of the intermediate sum to \code{z} must be done less +efficiently. This can be fixed by changing the definition of +\code{eff-note}: + +\begin{lisp} +(defun eff-note (x y z) + (declare (fixnum x y z)) + (the fixnum (+ (the fixnum (+ x y)) z))) +\end{lisp} + + +\subsection{Type Uncertainty} +\cpsubindex{types}{uncertainty} +\cindex{uncertainty of types} + +The main cause of inefficiency is the compiler's lack of adequate +information about the types of function argument and result values. +Many important operations (such as arithmetic) have an inefficient +general (generic) case, but have efficient implementations that can +usually be used if there is sufficient argument type information. + +Type efficiency notes are given when a value's type is uncertain. +There is an important distinction between values that are {\em not +known} to be of a good type (uncertain) and values that are {\em known +not} to be of a good type. Efficiency notes are given mainly for the +first case (uncertain types.) If it is clear to the compiler that that +there is not an efficient implementation for a particular function +call, then an efficiency note will only be given if the +\code{extensions:inhibit-warnings} optimization quality is \code{0} +(\pxlref{optimize-declaration}.) + +In other words, the default efficiency notes only suggest that you add +declarations, not that you change the semantics of your program so +that an efficient implementation will apply. For example, compilation +of this form will not give an efficiency note: +\begin{lisp} +(elt (the list l) i) +\end{lisp} +even though a vector access is more efficient than indexing a list. + + +\subsection{Efficiency Notes and Type Checking} +\cpsubindex{type checking}{efficiency of} +\cpsubindex{efficiency}{of type checking} +\cpsubindex{optimization}{type check} + +It is important that the \code{eff-note} example above used +\w{\code{(safety 0)}}. When type checking is enabled, you may get apparently +spurious efficiency notes. With \w{\code{(safety 1)}}, the note has this extra +line on the end: + +\begin{example} +The result is a (INTEGER -1610612736 1610612733), not a FIXNUM. +\end{example} + +This seems strange, since there is a \code{the} declaration on the result of that +second addition. + +In fact, the inefficiency is real, and is a consequence of \python{}'s +treating declarations as assertions to be verified. The compiler +can't assume that the result type declaration is true\dash{}it must +generate the result and then test whether it is of the appropriate +type. + +In practice, this means that when you are tuning a program to run +without type checks, you should work from the efficiency notes +generated by unsafe compilation. If you want code to run efficiently +with type checking, then you should pay attention to all the +efficiency notes that you get during safe compilation. Since user +supplied output type assertions (e.g., from \code{the}) are +disregarded when selecting operation implementations for safe code, +you must somehow give the compiler information that allows it to prove +that the result truly must be of a good type. In our example, it +could be done by constraining the argument types more: + +\begin{lisp} +(defun eff-note (x y z) + (declare (type (unsigned-byte 18) x y z)) + (+ x y z)) +\end{lisp} + +Of course, this declaration is acceptable only if the arguments to \code{eff-note} +always \var{are} \w{\code{(unsigned-byte 18)}} integers. + + +\subsection{Representation Efficiency Notes} +\label{representation-eff-note} +\cindex{representation efficiency notes} +\cpsubindex{efficiency notes}{for representation} +\cindex{object representation efficiency notes} +\cindex{stack numbers} +\cindex{non-descriptor representations} +\cpsubindex{descriptor representations}{forcing of} + +When operating on values that have non-descriptor representations +(\pxlref{non-descriptor}), there can be a substantial time and consing +penalty for converting to and from descriptor representations. For +this reason, the compiler gives an efficiency note whenever it is +forced to do a representation coercion more expensive than +\varref{efficiency-note-cost-threshold}. + +Inefficient representation coercions may be due to type uncertainty, +as in this example: + +\begin{lisp} +(defun set-flo (x) + (declare (single-float x)) + (prog ((var 0.0)) + (setq var (gorp)) + (setq var x) + (return var))) +\end{lisp} + +which produces this efficiency note: + +\begin{example} +In: DEFUN SET-FLO + (SETQ VAR X) +Note: Doing float to pointer coercion (cost 13) from X to VAR. +\end{example} + +The variable \code{var} is not known to always hold values of type +\code{single-float}, so a descriptor representation must be used for its value. +In this sort of situation, adding a declaration will eliminate the inefficiency. + +Often inefficient representation conversions are not due to type +uncertainty\dash{}instead, they result from evaluating a +non-descriptor expression in a context that requires a descriptor +result: + +\begin{itemize} +\item Assignment to or initialization of any data structure other than + a specialized array (\pxlref{specialized-array-types}), or + +\item Assignment to a \code{special} variable, or + +\item Passing as an argument or returning as a value in any function + call that is not a local call (\pxlref{number-local-call}.) +\end{itemize} + +If such inefficient coercions appear in a ``hot spot'' in the program, data +structures redesign or program reorganization may be necessary to improve +efficiency. See sections \ref{block-compilation}, \ref{numeric-types} and +\ref{profiling}. + +Because representation selection is done rather late in compilation, +the source context in these efficiency notes is somewhat vague, making +interpretation more difficult. This is a fairly straightforward +example: + +\begin{lisp} +(defun cf+ (x y) + (declare (single-float x y)) + (cons (+ x y) t)) +\end{lisp} + +which gives this efficiency note: + +\begin{example} +In: DEFUN CF+ + (CONS (+ X Y) T) +Note: Doing float to pointer coercion (cost 13), for: + The first argument of CONS. +\end{example} + +The source context form is almost always the form that receives the value being +coerced (as it is in the preceding example), but can also be the source form +which generates the coerced value. Compiling this example: + +\begin{lisp} +(defun if-cf+ (x y) + (declare (single-float x y)) + (cons (if (grue) (+ x y) (snoc)) t)) +\end{lisp} + +produces this note: + +\begin{example} +In: DEFUN IF-CF+ + (+ X Y) +Note: Doing float to pointer coercion (cost 13). +\end{example} + +In either case, the note's text explanation attempts to include +additional information about what locations are the source and +destination of the coercion. Here are some example notes: +\begin{example} + (IF (GRUE) X (SNOC)) +Note: Doing float to pointer coercion (cost 13) from X. + + (SETQ VAR X) +Note: Doing float to pointer coercion (cost 13) from X to VAR. +\end{example} +Note that the return value of a function is also a place to which coercions may +have to be done: +\begin{example} + (DEFUN F+ (X Y) (DECLARE (SINGLE-FLOAT X Y)) (+ X Y)) +Note: Doing float to pointer coercion (cost 13) to "". +\end{example} +Sometimes the compiler is unable to determine a name for the source or +destination, in which case the source context is the only clue. + + +\subsection{Verbosity Control} +\cpsubindex{verbosity}{of efficiency notes} +\cpsubindex{efficiency notes}{verbosity} + +These variables control the verbosity of efficiency notes: + +\begin{defvar}{}{efficiency-note-cost-threshold} + + Before printing some efficiency notes, the compiler compares the + value of this variable to the difference in cost between the chosen + implementation and the best potential implementation. If the + difference is not greater than this limit, then no note is printed. + The units are implementation dependent; the initial value suppresses + notes about ``trivial'' inefficiencies. A value of \code{1} will + note any inefficiency. +\end{defvar} + +\begin{defvar}{}{efficiency-note-limit} + + When printing some efficiency notes, the compiler reports possible + efficient implementations. The initial value of \code{2} prevents + excessively long efficiency notes in the common case where there is + no type information, so all implementations are possible. +\end{defvar} + + +\section{Profiling} +\cindex{profiling} +\cindex{timing} +\cindex{consing} +\cindex{tuning} +\label{profiling} + +The first step in improving a program's performance is to profile the +activity of the program to find where it spends its time. The best +way to do this is to use the profiling utility found in the +\code{profile} package. This package provides a macro \code{profile} +that encapsulates functions with statistics gathering code. + + +\subsection{Profile Interface} + +\begin{defvar}{profile:}{timed-functions} + + This variable holds a list of all functions that are currently being + profiled. +\end{defvar} + +\begin{defmac}{profile:}{profile}{% + \args{\mstar{\var{name} \mor \kwd{callers} \code{t}}}} + + This macro wraps profiling code around the named functions. As in + \code{trace}, the \var{name}s are not evaluated. If a function is + already profiled, then the function is unprofiled and reprofiled + (useful to notice function redefinition.) A warning is printed for + each name that is not a defined function. + + If \kwd{callers \var{t}} is specified, then each function that calls + this function is recorded along with the number of calls made. +\end{defmac} + +\begin{defmac}{profile:}{unprofile}{% + \args{\mstar{\var{name}}}} + + This macro removes profiling code from the named functions. If no + \var{name}s are supplied, all currently profiled functions are + unprofiled. +\end{defmac} + +\begin{defmac}{profile:}{profile-all}{% + \args{\keys{\kwd{package} \kwd{callers-p}}}} + + This macro in effect calls \code{profile:profile} for each + function in the specified package which defaults to + \code{*package*}. \kwd{callers-p} has the same meaning as in + \code{profile:profile}. +\end{defmac} + +\begin{defmac}{profile:}{report-time}{\args{\mstar{\var{name}}}} + + This macro prints a report for each \var{name}d function of the + following information: + \begin{itemize} + \item The total CPU time used in that function for all calls, + + \item the total number of bytes consed in that function for all + calls, + + \item the total number of calls, + + \item the average amount of CPU time per call. + \end{itemize} + Summary totals of the CPU time, consing and calls columns are + printed. An estimate of the profiling overhead is also printed (see + below). If no \var{name}s are supplied, then the times for all + currently profiled functions are printed. +\end{defmac} + +\begin{defmac}{}{reset-time}{\args{\mstar{\var{name}}}} + + This macro resets the profiling counters associated with the + \var{name}d functions. If no \var{name}s are supplied, then all + currently profiled functions are reset. +\end{defmac} + + +\subsection{Profiling Techniques} + +Start by profiling big pieces of a program, then carefully choose which +functions close to, but not in, the inner loop are to be profiled next. +Avoid profiling functions that are called by other profiled functions, since +this opens the possibility of profiling overhead being included in the reported +times. + +If the per-call time reported is less than 1/10 second, then consider the clock +resolution and profiling overhead before you believe the time. It may be that +you will need to run your program many times in order to average out to a +higher resolution. + + +\subsection{Nested or Recursive Calls} + +The profiler attempts to compensate for nested or recursive calls. Time and +consing overhead will be charged to the dynamically innermost (most recent) +call to a profiled function. So profiling a subfunction of a profiled function +will cause the reported time for the outer function to decrease. However if an +inner function has a large number of calls, some of the profiling overhead may +``leak'' into the reported time for the outer function. In general, be wary of +profiling short functions that are called many times. + + +\subsection{Clock resolution} + +Unless you are very lucky, the length of your machine's clock ``tick'' is +probably much longer than the time it takes simple function to run. For +example, on the IBM RT, the clock resolution is 1/50 second. This means that +if a function is only called a few times, then only the first couple decimal +places are really meaningful. + +Note however, that if a function is called many times, then the statistical +averaging across all calls should result in increased resolution. For example, +on the IBM RT, if a function is called a thousand times, then a resolution of +tens of microseconds can be expected. + +\subsection{Profiling overhead} + +The added profiling code takes time to run every time that the profiled +function is called, which can disrupt the attempt to collect timing +information. In order to avoid serious inflation of the times for functions +that take little time to run, an estimate of the overhead due to profiling is +subtracted from the times reported for each function. + +Although this correction works fairly well, it is not totally accurate, +resulting in times that become increasingly meaningless for functions with +short runtimes. This is only a concern when the estimated profiling overhead +is many times larger than reported total CPU time. + +The estimated profiling overhead is not represented in the reported total CPU +time. The sum of total CPU time and the estimated profiling overhead should be +close to the total CPU time for the entire profiling run (as determined by the +\code{time} macro.) Time unaccounted for is probably being used by functions that +you forgot to profile. + +\subsection{Additional Timing Utilities} + +\begin{defmac}{}{time}{ \args{\var{form}}} + + This macro evaluates \var{form}, prints some timing and memory + allocation information to \code{*trace-output*}, and returns any + values that \var{form} returns. The timing information includes + real time, user run time, and system run time. This macro executes + a form and reports the time and consing overhead. If the + \code{time} form is not compiled (e.g. it was typed at top-level), + then \code{compile} will be called on the form to give more accurate + timing information. If you really want to time interpreted speed, + you can say: +\begin{lisp} +(time (eval '\var{form})) +\end{lisp} +Things that execute fairly quickly should be timed more than once, +since there may be more paging overhead in the first timing. To +increase the accuracy of very short times, you can time multiple +evaluations: +\begin{lisp} +(time (dotimes (i 100) \var{form})) +\end{lisp} +\end{defmac} + +\begin{defun}{extensions:}{get-bytes-consed}{} + + This function returns the number of bytes allocated since the first + time you called it. The first time it is called it returns zero. + The above profiling routines use this to report consing information. +\end{defun} + +\begin{defvar}{extensions:}{gc-run-time} + + This variable accumulates the run-time consumed by garbage + collection, in the units returned by + \findexed{get-internal-run-time}. +\end{defvar} + +\begin{defconst}{}{internal-time-units-per-second} +The value of internal-time-units-per-second is 100. +\end{defconst} + +\subsection{A Note on Timing} +\cpsubindex{CPU time}{interpretation of} +\cpsubindex{run time}{interpretation of} +\cindex{interpretation of run time} + +There are two general kinds of timing information provided by the +\code{time} macro and other profiling utilities: real time and run +time. Real time is elapsed, wall clock time. It will be affected in +a fairly obvious way by any other activity on the machine. The more +other processes contending for CPU and memory, the more real time will +increase. This means that real time measurements are difficult to +replicate, though this is less true on a dedicated workstation. The +advantage of real time is that it is real. It tells you really how +long the program took to run under the benchmarking conditions. The +problem is that you don't know exactly what those conditions were. + +Run time is the amount of time that the processor supposedly spent +running the program, as opposed to waiting for I/O or running other +processes. ``User run time'' and ``system run time'' are numbers +reported by the Unix kernel. They are supposed to be a measure of how +much time the processor spent running your ``user'' program (which +will include GC overhead, etc.), and the amount of time that the +kernel spent running ``on your behalf.'' + +Ideally, user time should be totally unaffected by benchmarking +conditions; in reality user time does depend on other system activity, +though in rather non-obvious ways. + +System time will clearly depend on benchmarking conditions. In Lisp +benchmarking, paging activity increases system run time (but not by as much +as it increases real time, since the kernel spends some time waiting for +the disk, and this is not run time, kernel or otherwise.) + +In my experience, the biggest trap in interpreting kernel/user run time is +to look only at user time. In reality, it seems that the \var{sum} of kernel +and user time is more reproducible. The problem is that as system activity +increases, there is a spurious \var{decrease} in user run time. In effect, as +paging, etc., increases, user time leaks into system time. + +So, in practice, the only way to get truly reproducible results is to run +with the same competing activity on the system. Try to run on a machine +with nobody else logged in, and check with ``ps aux'' to see if there are any +system processes munching large amounts of CPU or memory. If the ratio +between real time and the sum of user and system time varies much between +runs, then you have a problem. + + +\subsection{Benchmarking Techniques} +\cindex{benchmarking techniques} + +Given these imperfect timing tools, how do should you do benchmarking? The +answer depends on whether you are trying to measure improvements in the +performance of a single program on the same hardware, or if you are trying to +compare the performance of different programs and/or different hardware. + +For the first use (measuring the effect of program modifications with +constant hardware), you should look at \var{both} system+user and real time to +understand what effect the change had on CPU use, and on I/O (including +paging.) If you are working on a CPU intensive program, the change in +system+user time will give you a moderately reproducible measure of +performance across a fairly wide range of system conditions. For a CPU +intensive program, you can think of system+user as ``how long it would have +taken to run if I had my own machine.'' So in the case of comparing CPU +intensive programs, system+user time is relatively real, and reasonable to +use. + +For programs that spend a substantial amount of their time paging, you +really can't predict elapsed time under a given operating condition without +benchmarking in that condition. User or system+user time may be fairly +reproducible, but it is also relatively meaningless, since in a paging or +I/O intensive program, the program is spending its time waiting, not +running, and system time and user time are both measures of run time. +A change that reduces run time might increase real time by increasing +paging. + +Another common use for benchmarking is comparing the performance of +the same program on different hardware. You want to know which +machine to run your program on. For comparing different machines +(operating systems, etc.), the only way to compare that makes sense is +to set up the machines in \var{exactly} the way that they will +\var{normally} be run, and then measure \var{real} time. If the +program will normally be run along with X, then run X. If the program +will normally be run on a dedicated workstation, then be sure nobody +else is on the benchmarking machine. If the program will normally be +run on a machine with three other Lisp jobs, then run three other Lisp +jobs. If the program will normally be run on a machine with 64MB of +memory, then run with 64MB. Here, ``normal'' means ``normal for that +machine''. + +If you have a program you believe to be CPU intensive, then you might be +tempted to compare ``run'' times across systems, hoping to get a meaningful +result even if the benchmarking isn't done under the expected running +condition. Don't to this, for two reasons: + +\begin{itemize} +\item The operating systems might not compute run time in the same + way. + +\item Under the real running condition, the program might not be CPU + intensive after all. +\end{itemize} + + +In the end, only real time means anything\dash{}it is the amount of time you +have to wait for the result. The only valid uses for run time are: + +\begin{itemize} +\item To develop insight into the program. For example, if run time + is much less than elapsed time, then you are probably spending lots + of time paging. + +\item To evaluate the relative performance of CPU intensive programs + in the same environment. +\end{itemize} diff --git a/doc/cmu-user/compiler.tex b/doc/cmu-user/compiler.tex new file mode 100644 index 0000000000..2d84164dc0 --- /dev/null +++ b/doc/cmu-user/compiler.tex @@ -0,0 +1,1251 @@ +\chapter{The Compiler} + +\section{Compiler Introduction} + +This chapter contains information about the compiler that every \cmucl{} user +should be familiar with. Chapter \ref{advanced-compiler} goes into greater +depth, describing ways to use more advanced features. + +The \cmucl{} compiler (also known as \python{}, not to be confused +with the programming language of the same name) has many features +that are seldom or never supported by conventional \llisp{} +compilers: + +\begin{itemize} +\item Source level debugging of compiled code (see chapter + \ref{debugger}.) + +\item Type error compiler warnings for type errors detectable at + compile time. + +\item Compiler error messages that provide a good indication of where + the error appeared in the source. + +\item Full run-time checking of all potential type errors, with + optimization of type checks to minimize the cost. + +\item Scheme-like features such as proper tail recursion and extensive + source-level optimization. + +\item Advanced tuning and optimization features such as comprehensive + efficiency notes, flow analysis, and untagged number representations + (see chapter \ref{advanced-compiler}.) +\end{itemize} + + +\section{Calling the Compiler} +\cindex{compiling} + +Functions may be compiled using \code{compile}, \code{compile-file}, or +\code{compile-from-stream}. + +\begin{defun}{}{compile}{ \args{\var{name} \ampoptional{} \var{definition}}} + + This function compiles the function whose name is \var{name}. If + \var{name} is \false, the compiled function object is returned. If + \var{definition} is supplied, it should be a lambda expression that + is to be compiled and then placed in the function cell of + \var{name}. As per the proposed X3J13 cleanup + ``compile-argument-problems'', \var{definition} may also be an + interpreted function. + + The return values are as per the proposed X3J13 cleanup + ``compiler-diagnostics''. The first value is the function name or + function object. The second value is \false{} if no compiler + diagnostics were issued, and \true{} otherwise. The third value is + \false{} if no compiler diagnostics other than style warnings were + issued. A non-\false{} value indicates that there were ``serious'' + compiler diagnostics issued, or that other conditions of type + \tindexed{error} or \tindexed{warning} (but not + \tindexed{style-warning}) were signaled during compilation. +\end{defun} + + +\begin{defun}{}{compile-file}{ + \args{\var{input-pathname} + \keys{\kwd{output-file} \kwd{error-file} \kwd{trace-file}} + \morekeys{\kwd{error-output} \kwd{verbose} \kwd{print} \kwd{progress}} + \yetmorekeys{\kwd{load} \kwd{block-compile} \kwd{entry-points}} + \yetmorekeys{\kwd{byte-compile} \kwd{xref}}}} + + The \cmucl{} \code{compile-file} is extended through the addition of + several new keywords and an additional interpretation of + \var{input-pathname}: + \begin{Lentry} + + \item[\var{input-pathname}] If this argument is a list of input + files, rather than a single input pathname, then all the source + files are compiled into a single object file. In this case, the + name of the first file is used to determine the default output + file names. This is especially useful in combination with + \var{block-compile}. + + \item[\kwd{output-file}] This argument specifies the name of the + output file. \true{} gives the default name, \false{} suppresses + the output file. + + \item[\kwd{error-file}] A listing of all the error output is + directed to this file. If there are no errors, then no error file + is produced (and any existing error file is deleted.) \true{} + gives \w{"\var{name}\code{.err}"} (the default), and \false{} + suppresses the output file. + + \item[\kwd{error-output}] If \true{} (the default), then error + output is sent to \code{*error-output*}. If a stream, then output + is sent to that stream instead. If \false, then error output is + suppressed. Note that this error output is in addition to (but + the same as) the output placed in the \var{error-file}. + + \item[\kwd{verbose}] If \true{} (the default), then the compiler + prints to error output at the start and end of compilation of each + file. See \varref{compile-verbose}. + + \item[\kwd{print}] If \true{} (the default), then the compiler + prints to error output when each function is compiled. See + \varref{compile-print}. + + \item[\kwd{progress}] If \true{} (default \false{}), then the + compiler prints to error output progress information about the + phases of compilation of each function. This is a \cmucl{} extension + that is useful mainly in large block compilations. See + \varref{compile-progress}. + + \item[\kwd{trace-file}] If \true{}, several of the intermediate + representations (including annotated assembly code) are dumped out + to this file. \true{} gives \w{"\var{name}\code{.trace}"}. Trace + output is off by default. \xlref{trace-files}. + + \item[\kwd{load}] If \true{}, load the resulting output file. + + \item[\kwd{block-compile}] Controls the compile-time resolution of + function calls. By default, only self-recursive calls are + resolved, unless an \code{ext:block-start} declaration appears in + the source file. \xlref{compile-file-block}. + + \item[\kwd{entry-points}] If non-\nil, then this is a list of the + names of all functions in the file that should have global + definitions installed (because they are referenced in other + files.) \xlref{compile-file-block}. + + \item[\kwd{byte-compile}] If \true{}, compiling to a compact + interpreted byte code is enabled. Possible values are \true{}, + \false{}, and \kwd{maybe} (the default.) See + \varref{byte-compile-default} and \pxlref{byte-compile}. + + \item[\kwd{xref}] If non-\nil, enable recording of cross-reference + information. The default is the value of + \code{c:*record-xref-info*}. \xlref{xref}. Note that the + compiled fasl file will also contain cross-reference information + and loading the fasl later will populate the cross-reference database. + \end{Lentry} + + The return values are as per the proposed X3J13 cleanup + ``compiler-diagnostics''. The first value from \code{compile-file} + is the truename of the output file, or \false{} if the file could + not be created. The interpretation of the second and third values + is described above for \code{compile}. +\end{defun} + +\begin{defvar}{}{compile-verbose} + \defvarx{compile-print} + \defvarx{compile-progress} + + These variables determine the default values for the \kwd{verbose}, + \kwd{print} and \kwd{progress} arguments to \code{compile-file}. +\end{defvar} + +\begin{defun}{extensions:}{compile-from-stream}{% + \args{\var{input-stream} + \keys{\kwd{error-stream}} + \morekeys{\kwd{trace-stream}} + \yetmorekeys{\kwd{block-compile} \kwd{entry-points}} + \yetmorekeys{\kwd{byte-compile}}}} + + This function is similar to \code{compile-file}, but it takes all + its arguments as streams. It reads \llisp{} code from + \var{input-stream} until end of file is reached, compiling into the + current environment. This function returns the same two values as + the last two values of \code{compile}. No output files are + produced. +\end{defun} + + +\section{Compilation Units} +\cpsubindex{compilation}{units} + +\cmucl{} supports the \code{with-compilation-unit} macro added to the +language by the X3J13 ``with-compilation-unit'' compiler cleanup +issue. This provides a mechanism for eliminating spurious undefined +warnings when there are forward references across files, and also +provides a standard way to access compiler extensions. + +\begin{defmac}{}{with-compilation-unit}{% + \args{(\mstar{\var{key} \var{value}}) \mstar{\var{form}}}} + + This macro evaluates the \var{forms} in an environment that causes + warnings for undefined variables, functions and types to be delayed + until all the forms have been evaluated. Each keyword \var{value} + is an evaluated form. These keyword options are recognized: + \begin{Lentry} + + \item[\kwd{override}] If uses of \code{with-compilation-unit} are + dynamically nested, the outermost use will take precedence, + suppressing printing of undefined warnings by inner uses. + However, when the \code{override} option is true this shadowing is + inhibited; an inner use will print summary warnings for the + compilations within the inner scope. + + \item[\kwd{optimize}] This is a \cmucl{} extension that specifies of the + ``global'' compilation policy for the dynamic extent of the body. + The argument should evaluate to an \code{optimize} declare form, + like: + \begin{lisp} + (optimize (speed 3) (safety 0)) + \end{lisp} + \xlref{optimize-declaration} + + \item[\kwd{optimize-interface}] Similar to \kwd{optimize}, but + specifies the compilation policy for function interfaces (argument + count and type checking) for the dynamic extent of the body. + \xlref{optimize-interface-declaration}. + + \item[\kwd{context-declarations}] This is a \cmucl{} extension that + pattern-matches on function names, automatically splicing in any + appropriate declarations at the head of the function definition. + \xlref{context-declarations}. + \end{Lentry} +\end{defmac} + + +\subsection{Undefined Warnings} + +\cindex{undefined warnings} +Warnings about undefined variables, functions and types are delayed until the +end of the current compilation unit. The compiler entry functions +(\code{compile}, etc.) implicitly use \code{with-compilation-unit}, so undefined +warnings will be printed at the end of the compilation unless there is an +enclosing \code{with-compilation-unit}. In order the gain the benefit of this +mechanism, you should wrap a single \code{with-compilation-unit} around the calls +to \code{compile-file}, i.e.: +\begin{lisp} +(with-compilation-unit () + (compile-file "file1") + (compile-file "file2") + ...) +\end{lisp} + +Unlike for functions and types, undefined warnings for variables are +not suppressed when a definition (e.g. \code{defvar}) appears after +the reference (but in the same compilation unit.) This is because +doing special declarations out of order just doesn't +work\dash{}although early references will be compiled as special, +bindings will be done lexically. + +Undefined warnings are printed with full source context +(\pxlref{error-messages}), which tremendously simplifies the problem +of finding undefined references that resulted from macroexpansion. +After printing detailed information about the undefined uses of each +name, \code{with-compilation-unit} also prints summary listings of the +names of all the undefined functions, types and variables. + +\begin{defvar}{}{undefined-warning-limit} + + This variable controls the number of undefined warnings for each + distinct name that are printed with full source context when the + compilation unit ends. If there are more undefined references than + this, then they are condensed into a single warning: + \begin{example} + Warning: \var{count} more uses of undefined function \var{name}. + \end{example} + When the value is \code{0}, then the undefined warnings are not + broken down by name at all: only the summary listing of undefined + names is printed. +\end{defvar} + + +\section{Interpreting Error Messages} +\label{error-messages} +\cpsubindex{error messages}{compiler} +\cindex{compiler error messages} + +One of \python{}'s unique features is the level of source location +information it provides in error messages. The error messages contain +a lot of detail in a terse format, to they may be confusing at first. +Error messages will be illustrated using this example program: +\begin{lisp} +(defmacro zoq (x) + `(roq (ploq (+ ,x 3)))) + +(defun foo (y) + (declare (symbol y)) + (zoq y)) +\end{lisp} +The main problem with this program is that it is trying to add \code{3} to a +symbol. Note also that the functions \code{roq} and \code{ploq} aren't defined +anywhere. + + +\subsection{The Parts of the Error Message} + +The compiler will produce this warning: + +\begin{example} +File: /usr/me/stuff.lisp +In: DEFUN FOO + (ZOQ Y) +--> ROQ PLOQ + +==> + Y +Warning: Result is a SYMBOL, not a NUMBER. +\end{example} + +In this example we see each of the six possible parts of a compiler error +message: + +\begin{Lentry} +\item[\w{\code{File: /usr/me/stuff.lisp}}] This is the \var{file} that + the compiler read the relevant code from. The file name is + displayed because it may not be immediately obvious when there is an + error during compilation of a large system, especially when + \code{with-compilation-unit} is used to delay undefined warnings. + +\item[\w{\code{In: DEFUN FOO}}] This is the \var{definition} or + top-level form responsible for the error. It is obtained by taking + the first two elements of the enclosing form whose first element is + a symbol beginning with ``\code{DEF}''. If there is no enclosing + \w{\var{def}mumble}, then the outermost form is used. If there are + multiple \w{\var{def}mumbles}, then they are all printed from the + out in, separated by \code{$=>$}'s. In this example, the problem + was in the \code{defun} for \code{foo}. + +\item[\w{\code{(ZOQ Y)}}] This is the {\em original source} form + responsible for the error. Original source means that the form + directly appeared in the original input to the compiler, i.e. in the + lambda passed to \code{compile} or the top-level form read from the + source file. In this example, the expansion of the \code{zoq} macro + was responsible for the error. + +\item[\w{\code{--$>$ ROQ PLOQ +}} ] This is the {\em processing path} + that the compiler used to produce the errorful code. The processing + path is a representation of the evaluated forms enclosing the actual + source that the compiler encountered when processing the original + source. The path is the first element of each form, or the form + itself if the form is not a list. These forms result from the + expansion of macros or source-to-source transformation done by the + compiler. In this example, the enclosing evaluated forms are the + calls to \code{roq}, \code{ploq} and \code{+}. These calls resulted + from the expansion of the \code{zoq} macro. + +\item[\code{==$>$ Y}] This is the {\em actual source} responsible for + the error. If the actual source appears in the explanation, then we + print the next enclosing evaluated form, instead of printing the + actual source twice. (This is the form that would otherwise have + been the last form of the processing path.) In this example, the + problem is with the evaluation of the reference to the variable + \code{y}. + +\item[\w{\code{Warning: Result is a SYMBOL, not a NUMBER.}}] This is + the \var{explanation} the problem. In this example, the problem is + that \code{y} evaluates to a \code{symbol}, but is in a context + where a number is required (the argument to \code{+}). +\end{Lentry} + +Note that each part of the error message is distinctively marked: + +\begin{itemize} +\item \code{File:} and \code{In:} mark the file and definition, + respectively. + +\item The original source is an indented form with no prefix. + +\item Each line of the processing path is prefixed with \code{--$>$}. + +\item The actual source form is indented like the original source, but + is marked by a preceding \code{==$>$} line. This is like the + ``macroexpands to'' notation used in \cltl. + +\item The explanation is prefixed with the error severity + (\pxlref{error-severity}), either \code{Error:}, \code{Warning:}, or + \code{Note:}. +\end{itemize} + + +Each part of the error message is more specific than the preceding +one. If consecutive error messages are for nearby locations, then the +front part of the error messages would be the same. In this case, the +compiler omits as much of the second message as in common with the +first. For example: + +\begin{example} +File: /usr/me/stuff.lisp +In: DEFUN FOO + (ZOQ Y) +--> ROQ +==> + (PLOQ (+ Y 3)) +Warning: Undefined function: PLOQ + +==> + (ROQ (PLOQ (+ Y 3))) +Warning: Undefined function: ROQ +\end{example} + +In this example, the file, definition and original source are +identical for the two messages, so the compiler omits them in the +second message. If consecutive messages are entirely identical, then +the compiler prints only the first message, followed by: + +\begin{example} +[Last message occurs \var{repeats} times] +\end{example} + +where \var{repeats} is the number of times the message was given. + +If the source was not from a file, then no file line is printed. If +the actual source is the same as the original source, then the +processing path and actual source will be omitted. If no forms +intervene between the original source and the actual source, then the +processing path will also be omitted. + + +\subsection{The Original and Actual Source} +\cindex{original source} +\cindex{actual source} + +The {\em original source} displayed will almost always be a list. If the actual +source for an error message is a symbol, the original source will be the +immediately enclosing evaluated list form. So even if the offending symbol +does appear in the original source, the compiler will print the enclosing list +and then print the symbol as the actual source (as though the symbol were +introduced by a macro.) + +When the {\em actual source} is displayed (and is not a symbol), it will always +be code that resulted from the expansion of a macro or a source-to-source +compiler optimization. This is code that did not appear in the original +source program; it was introduced by the compiler. + +Keep in mind that when the compiler displays a source form in an error message, +it always displays the most specific (innermost) responsible form. For +example, compiling this function: + +\begin{lisp} +(defun bar (x) + (let (a) + (declare (fixnum a)) + (setq a (foo x)) + a)) +\end{lisp} + +gives this error message: + +\begin{example} +In: DEFUN BAR + (LET (A) (DECLARE (FIXNUM A)) (SETQ A (FOO X)) A) +Warning: The binding of A is not a FIXNUM: + NIL +\end{example} + +This error message is not saying ``there's a problem somewhere in this +\code{let}''\dash{}it is saying that there is a problem with the +\code{let} itself. In this example, the problem is that \code{a}'s +\false{} initial value is not a \code{fixnum}. + + +\subsection{The Processing Path} +\cindex{processing path} +\cindex{macroexpansion} +\cindex{source-to-source transformation} + +The processing path is mainly useful for debugging macros, so if you don't +write macros, you can ignore the processing path. Consider this example: + +\begin{lisp} +(defun foo (n) + (dotimes (i n *undefined*))) +\end{lisp} + +Compiling results in this error message: + +\begin{example} +In: DEFUN FOO + (DOTIMES (I N *UNDEFINED*)) +--> DO BLOCK LET TAGBODY RETURN-FROM +==> + (PROGN *UNDEFINED*) +Warning: Undefined variable: *UNDEFINED* +\end{example} + +Note that \code{do} appears in the processing path. This is because \code{dotimes} +expands into: + +\begin{lisp} +(do ((i 0 (1+ i)) (#:g1 n)) + ((>= i #:g1) *undefined*) + (declare (type unsigned-byte i))) +\end{lisp} + +The rest of the processing path results from the expansion of \code{do}: + +\begin{lisp} +(block nil + (let ((i 0) (#:g1 n)) + (declare (type unsigned-byte i)) + (tagbody (go #:g3) + #:g2 (psetq i (1+ i)) + #:g3 (unless (>= i #:g1) (go #:g2)) + (return-from nil (progn *undefined*))))) +\end{lisp} + +In this example, the compiler descended into the \code{block}, +\code{let}, \code{tagbody} and \code{return-from} to reach the +\code{progn} printed as the actual source. This is a place where the +``actual source appears in explanation'' rule was applied. The +innermost actual source form was the symbol \code{*undefined*} itself, +but that also appeared in the explanation, so the compiler backed out +one level. + + +\subsection{Error Severity} +\label{error-severity} +\cindex{severity of compiler errors} +\cindex{compiler error severity} + +There are three levels of compiler error severity: + +\begin{Lentry} +\item[Error] This severity is used when the compiler encounters a + problem serious enough to prevent normal processing of a form. + Instead of compiling the form, the compiler compiles a call to + \code{error}. Errors are used mainly for signaling syntax errors. + If an error happens during macroexpansion, the compiler will handle + it. The compiler also handles and attempts to proceed from read + errors. + +\item[Warning] Warnings are used when the compiler can prove that + something bad will happen if a portion of the program is executed, + but the compiler can proceed by compiling code that signals an error + at runtime if the problem has not been fixed: + \begin{itemize} + + \item Violation of type declarations, or + + \item Function calls that have the wrong number of arguments or + malformed keyword argument lists, or + + \item Referencing a variable declared \code{ignore}, or unrecognized + declaration specifiers. + \end{itemize} + + In the language of the \clisp{} standard, these are situations where + the compiler can determine that a situation with undefined + consequences or that would cause an error to be signaled would + result at runtime. + +\item[Note] Notes are used when there is something that seems a bit + odd, but that might reasonably appear in correct programs. +\end{Lentry} + +Note that the compiler does not fully conform to the proposed X3J13 +``compiler-diagnostics'' cleanup. Errors, warnings and notes mostly +correspond to errors, warnings and style-warnings, but many things +that the cleanup considers to be style-warnings are printed as +warnings rather than notes. Also, warnings, style-warnings and most +errors aren't really signaled using the condition system. + + +\subsection{Errors During Macroexpansion} +\cpsubindex{macroexpansion}{errors during} + +The compiler handles errors that happen during macroexpansion, turning +them into compiler errors. If you want to debug the error (to debug a +macro), you can set \code{*break-on-signals*} to \code{error}. For +example, this definition: + +\begin{lisp} +(defun foo (e l) + (do ((current l (cdr current)) + ((atom current) nil)) + (when (eq (car current) e) (return current)))) +\end{lisp} + +gives this error: + +\begin{example} +In: DEFUN FOO + (DO ((CURRENT L #) (# NIL)) (WHEN (EQ # E) (RETURN CURRENT)) ) +Error: (during macroexpansion) + +Error in function LISP::DO-DO-BODY. +DO step variable is not a symbol: (ATOM CURRENT) +\end{example} + + +\subsection{Read Errors} +\cpsubindex{read errors}{compiler} + +The compiler also handles errors while reading the source. For example: + +\begin{example} +Error: Read error at 2: + "(,/\back{foo})" +Error in function LISP::COMMA-MACRO. +Comma not inside a backquote. +\end{example} + +The ``\code{at 2}'' refers to the character position in the source file at +which the error was signaled, which is generally immediately after the +erroneous text. The next line, ``\code{(,/\back{foo})}'', is the line in +the source that contains the error file position. The ``\code{/\back{} }'' +indicates the error position within that line (in this example, +immediately after the offending comma.) + +When in \hemlock{} (or any other EMACS-like editor), you can go to a +character position with: + +\begin{example} +M-< C-u \var{position} C-f +\end{example} + +Note that if the source is from a \hemlock{} buffer, then the position +is relative to the start of the compiled region or \code{defun}, not the +file or buffer start. + +After printing a read error message, the compiler attempts to recover from the +error by backing up to the start of the enclosing top-level form and reading +again with \code{*read-suppress*} true. If the compiler can recover from the +error, then it substitutes a call to \code{cerror} for the unreadable form and +proceeds to compile the rest of the file normally. + +If there is a read error when the file position is at the end of the file +(i.e., an unexpected EOF error), then the error message looks like this: + +\begin{example} +Error: Read error in form starting at 14: + "(defun test ()" +Error in function LISP::FLUSH-WHITESPACE. +EOF while reading # +\end{example} + +In this case, ``\code{starting at 14}'' indicates the character +position at which the compiler started reading, i.e. the position +before the start of the form that was missing the closing delimiter. +The line \w{"\code{(defun test ()}"} is first line after the starting +position that the compiler thinks might contain the unmatched open +delimiter. + + +\subsection{Error Message Parameterization} +\cpsubindex{error messages}{verbosity} +\cpsubindex{verbosity}{of error messages} + +There is some control over the verbosity of error messages. See also +\varref{undefined-warning-limit}, \code{*efficiency-note-limit*} and +\varref{efficiency-note-cost-threshold}. + +\begin{defvar}{}{enclosing-source-cutoff} + + This variable specifies the number of enclosing actual source forms + that are printed in full, rather than in the abbreviated processing + path format. Increasing the value from its default of \code{1} + allows you to see more of the guts of the macroexpanded source, + which is useful when debugging macros. +\end{defvar} + +\begin{defvar}{}{error-print-length} + \defvarx{error-print-level} + + These variables are the print level and print length used in + printing error messages. The default values are \code{5} and + \code{3}. If null, the global values of \code{*print-level*} and + \code{*print-length*} are used. +\end{defvar} + +\begin{defmac}{extensions:}{def-source-context}{% + \args{\var{name} \var{lambda-list} \mstar{form}}} + + This macro defines how to extract an abbreviated source context from + the \var{name}d form when it appears in the compiler input. + \var{lambda-list} is a \code{defmacro} style lambda-list used to + parse the arguments. The \var{body} should return a list of + subforms that can be printed on about one line. There are + predefined methods for \code{defstruct}, \code{defmethod}, etc. If + no method is defined, then the first two subforms are returned. + Note that this facility implicitly determines the string name + associated with anonymous functions. +\end{defmac} + + +\section{Types in Python} +\cpsubindex{types}{in python} + +A big difference between \python{} and all other \llisp{} compilers +is the approach to type checking and amount of knowledge about types: +\begin{itemize} + +\item \python{} treats type declarations much differently that other + Lisp compilers do. \python{} doesn't blindly believe type + declarations; it considers them assertions about the program that + should be checked. + +\item \python{} also has a tremendously greater knowledge of the + \clisp{} type system than other compilers. Support is incomplete + only for the \code{not}, \code{and} and \code{satisfies} types. +\end{itemize} +See also sections \ref{advanced-type-stuff} and \ref{type-inference}. + + +\subsection{Compile Time Type Errors} +\cindex{compile time type errors} +\cpsubindex{type checking}{at compile time} + +If the compiler can prove at compile time that some portion of the +program cannot be executed without a type error, then it will give a +warning at compile time. It is possible that the offending code would +never actually be executed at run-time due to some higher level +consistency constraint unknown to the compiler, so a type warning +doesn't always indicate an incorrect program. For example, consider +this code fragment: +\begin{lisp} +(defun raz (foo) + (let ((x (case foo + (:this 13) + (:that 9) + (:the-other 42)))) + (declare (fixnum x)) + (foo x))) +\end{lisp} + +Compilation produces this warning: + +\begin{example} +In: DEFUN RAZ + (CASE FOO (:THIS 13) (:THAT 9) (:THE-OTHER 42)) +--> LET COND IF COND IF COND IF +==> + (COND) +Warning: This is not a FIXNUM: + NIL +\end{example} + +In this case, the warning is telling you that if \code{foo} isn't any +of \kwd{this}, \kwd{that} or \kwd{the-other}, then \code{x} will be +initialized to \false, which the \code{fixnum} declaration makes +illegal. The warning will go away if \code{ecase} is used instead of +\code{case}, or if \kwd{the-other} is changed to \true. + +This sort of spurious type warning happens moderately often in the +expansion of complex macros and in inline functions. In such cases, +there may be dead code that is impossible to correctly execute. The +compiler can't always prove this code is dead (could never be +executed), so it compiles the erroneous code (which will always signal +an error if it is executed) and gives a warning. + +\begin{defun}{extensions:}{required-argument}{} + + This function can be used as the default value for keyword arguments + that must always be supplied. Since it is known by the compiler to + never return, it will avoid any compile-time type warnings that + would result from a default value inconsistent with the declared + type. When this function is called, it signals an error indicating + that a required keyword argument was not supplied. This function is + also useful for \code{defstruct} slot defaults corresponding to + required arguments. \xlref{empty-type}. + + Although this function is a \cmucl{} extension, it is relatively harmless + to use it in otherwise portable code, since you can easily define it + yourself: + \begin{lisp} + (defun required-argument () + (error "A required keyword argument was not supplied.")) + \end{lisp} +\end{defun} + +Type warnings are inhibited when the +\code{extensions:inhibit-warnings} optimization quality is \code{3} +(\pxlref{compiler-policy}.) This can be used in a local declaration +to inhibit type warnings in a code fragment that has spurious +warnings. + + +\subsection{Precise Type Checking} +\label{precise-type-checks} +\cindex{precise type checking} +\cpsubindex{type checking}{precise} + +With the default compilation policy, all type +assertions\footnote{There are a few circumstances where a type + declaration is discarded rather than being used as type assertion. + This doesn't affect safety much, since such discarded declarations + are also not believed to be true by the compiler.} are precisely +checked. Precise checking means that the check is done as though +\code{typep} had been called with the exact type specifier that +appeared in the declaration. \python{} uses \var{policy} to determine +whether to trust type assertions (\pxlref{compiler-policy}). Type +assertions from declarations are indistinguishable from the type +assertions on arguments to built-in functions. In \python, adding +type declarations makes code safer. + +If a variable is declared to be \w{\code{(integer 3 17)}}, then its +value must always always be an integer between \code{3} and \code{17}. +If multiple type declarations apply to a single variable, then all the +declarations must be correct; it is as though all the types were +intersected producing a single \code{and} type specifier. + +Argument type declarations are automatically enforced. If you declare +the type of a function argument, a type check will be done when that +function is called. In a function call, the called function does the +argument type checking, which means that a more restrictive type +assertion in the calling function (e.g., from \code{the}) may be lost. + +The types of structure slots are also checked. The value of a +structure slot must always be of the type indicated in any \kwd{type} +slot option.\footnote{The initial value need not be of this type as + long as the corresponding argument to the constructor is always + supplied, but this will cause a compile-time type warning unless + \code{required-argument} is used.} Because of precise type checking, +the arguments to slot accessors are checked to be the correct type of +structure. + +In traditional \llisp{} compilers, not all type assertions are +checked, and type checks are not precise. Traditional compilers +blindly trust explicit type declarations, but may check the argument +type assertions for built-in functions. Type checking is not precise, +since the argument type checks will be for the most general type legal +for that argument. In many systems, type declarations suppress what +little type checking is being done, so adding type declarations makes +code unsafe. This is a problem since it discourages writing type +declarations during initial coding. In addition to being more error +prone, adding type declarations during tuning also loses all the +benefits of debugging with checked type assertions. + +To gain maximum benefit from \python{}'s type checking, you should +always declare the types of function arguments and structure slots as +precisely as possible. This often involves the use of \code{or}, +\code{member} and other list-style type specifiers. Paradoxically, +even though adding type declarations introduces type checks, it +usually reduces the overall amount of type checking. This is +especially true for structure slot type declarations. + +\python{} uses the \code{safety} optimization quality (rather than +presence or absence of declarations) to choose one of three levels of +run-time type error checking: \pxlref{optimize-declaration}. +\xlref{advanced-type-stuff} for more information about types in +\python{}. + + +\subsection{Weakened Type Checking} +\label{weakened-type-checks} +\cindex{weakened type checking} +\cpsubindex{type checking}{weakened} + +When the value for the \code{speed} optimization quality is greater +than \code{safety}, and \code{safety} is not \code{0}, then type +checking is weakened to reduce the speed and space penalty. In +structure-intensive code this can double the speed, yet still catch +most type errors. Weakened type checks provide a level of safety +similar to that of ``safe'' code in other \llisp{} compilers. + +A type check is weakened by changing the check to be for some +convenient supertype of the asserted type. For example, +\code{\w{(integer 3 17)}} is changed to \code{fixnum}, +\code{\w{(simple-vector 17)}} to \code{simple-vector}, and structure +types are changed to \code{structure}. A complex check like: +\begin{example} +(or node hunk (member :foo :bar :baz)) +\end{example} +will be omitted entirely (i.e., the check is weakened to \code{*}.) If +a precise check can be done for no extra cost, then no weakening is +done. + +Although weakened type checking is similar to type checking done by +other compilers, it is sometimes safer and sometimes less safe. +Weakened checks are done in the same places is precise checks, so all +the preceding discussion about where checking is done still applies. +Weakened checking is sometimes somewhat unsafe because although the +check is weakened, the precise type is still input into type +inference. In some contexts this will result in type inferences not +justified by the weakened check, and hence deletion of some type +checks that would be done by conventional compilers. + +For example, if this code was compiled with weakened checks: + +\begin{lisp} +(defstruct foo + (a nil :type simple-string)) + +(defstruct bar + (a nil :type single-float)) + +(defun myfun (x) + (declare (type bar x)) + (* (bar-a x) 3.0)) +\end{lisp} + +and \code{myfun} was passed a \code{foo}, then no type error would be +signaled, and we would try to multiply a \code{simple-vector} as +though it were a float (with unpredictable results.) This is because +the check for \code{bar} was weakened to \code{structure}, yet when +compiling the call to \code{bar-a}, the compiler thinks it knows it +has a \code{bar}. + +Note that normally even weakened type checks report the precise type +in error messages. For example, if \code{myfun}'s \code{bar} check is +weakened to \code{structure}, and the argument is \false{}, then the +error will be: + +\begin{example} +Type-error in MYFUN: + NIL is not of type BAR +\end{example} + +However, there is some speed and space cost for signaling a precise +error, so the weakened type is reported if the \code{speed} +optimization quality is \code{3} or \code{debug} quality is less than +\code{1}: + +\begin{example} +Type-error in MYFUN: + NIL is not of type STRUCTURE +\end{example} + +\xlref{optimize-declaration} for further discussion of the +\code{optimize} declaration. + + +\section{Getting Existing Programs to Run} +\cpsubindex{existing programs}{to run} +\cpsubindex{types}{portability} +\cindex{compatibility with other Lisps} + +Since \python{} does much more comprehensive type checking than other +Lisp compilers, \python{} will detect type errors in many programs +that have been debugged using other compilers. These errors are +mostly incorrect declarations, although compile-time type errors can +find actual bugs if parts of the program have never been tested. + +Some incorrect declarations can only be detected by run-time type +checking. It is very important to initially compile programs with +full type checks and then test this version. After the checking +version has been tested, then you can consider weakening or +eliminating type checks. {\bf This applies even to previously debugged + programs.} \python{} does much more type inference than other +\llisp{} compilers, so believing an incorrect declaration does much +more damage. + +The most common problem is with variables whose initial value doesn't +match the type declaration. Incorrect initial values will always be +flagged by a compile-time type error, and they are simple to fix once +located. Consider this code fragment: + +\begin{example} +(prog (foo) + (declare (fixnum foo)) + (setq foo ...) + ...) +\end{example} + +Here the variable \code{foo} is given an initial value of \false, but +is declared to be a \code{fixnum}. Even if it is never read, the +initial value of a variable must match the declared type. There are +two ways to fix this problem. Change the declaration: + +\begin{example} +(prog (foo) + (declare (type (or fixnum null) foo)) + (setq foo ...) + ...) +\end{example} + +or change the initial value: + +\begin{example} +(prog ((foo 0)) + (declare (fixnum foo)) + (setq foo ...) + ...) +\end{example} + +It is generally preferable to change to a legal initial value rather +than to weaken the declaration, but sometimes it is simpler to weaken +the declaration than to try to make an initial value of the +appropriate type. + +Another declaration problem occasionally encountered is incorrect +declarations on \code{defmacro} arguments. This probably usually +happens when a function is converted into a macro. Consider this +macro: + +\begin{lisp} +(defmacro my-1+ (x) + (declare (fixnum x)) + `(the fixnum (1+ ,x))) +\end{lisp} + +Although legal and well-defined \clisp, this meaning of this +definition is almost certainly not what the writer intended. For +example, this call is illegal: + +\begin{lisp} +(my-1+ (+ 4 5)) +\end{lisp} + +The call is illegal because the argument to the macro is \w{\code{(+ 4 + 5)}}, which is a \code{list}, not a \code{fixnum}. Because of +macro semantics, it is hardly ever useful to declare the types of +macro arguments. If you really want to assert something about the +type of the result of evaluating a macro argument, then put a +\code{the} in the expansion: + +\begin{lisp} +(defmacro my-1+ (x) + `(the fixnum (1+ (the fixnum ,x)))) +\end{lisp} + +In this case, it would be stylistically preferable to change this +macro back to a function and declare it inline. Macros have no +efficiency advantage over inline functions when using \python{}. +\xlref{inline-expansion}. + + +Some more subtle problems are caused by incorrect declarations that +can't be detected at compile time. Consider this code: + +\begin{example} +(do ((pos 0 (position #\back{a} string :start (1+ pos)))) + ((null pos)) + (declare (fixnum pos)) + ...) +\end{example} + +Although \code{pos} is almost always a \code{fixnum}, it is \false{} +at the end of the loop. If this example is compiled with full type +checks (the default), then running it will signal a type error at the +end of the loop. If compiled without type checks, the program will go +into an infinite loop (or perhaps \code{position} will complain +because \w{\code{(1+ nil)}} isn't a sensible start.) Why? Because if +you compile without type checks, the compiler just quietly believes +the type declaration. Since \code{pos} is always a \code{fixnum}, it +is never \nil, so \w{\code{(null pos)}} is never true, and the loop +exit test is optimized away. Such errors are sometimes flagged by +unreachable code notes (\pxlref{dead-code-notes}), but it is still +important to initially compile any system with full type checks, even +if the system works fine when compiled using other compilers. + +In this case, the fix is to weaken the type declaration to +\w{\code{(or fixnum null)}}.\footnote{Actually, this declaration is + totally unnecessary in \python{}, since it already knows + \code{position} returns a non-negative \code{fixnum} or \false.} +Note that there is usually little performance penalty for weakening a +declaration in this way. Any numeric operations in the body can still +assume the variable is a \code{fixnum}, since \false{} is not a legal +numeric argument. Another possible fix would be to say: + +\begin{example} +(do ((pos 0 (position #\back{a} string :start (1+ pos)))) + ((null pos)) + (let ((pos pos)) + (declare (fixnum pos)) + ...)) +\end{example} + +This would be preferable in some circumstances, since it would allow a +non-standard representation to be used for the local \code{pos} +variable in the loop body (see section \ref{ND-variables}.) + +In summary, remember that {\em all} values that a variable {\em ever} +has must be of the declared type, and that you should test using safe +code initially. + + +\section{Compiler Policy} +\label{compiler-policy} +\cpsubindex{policy}{compiler} +\cindex{compiler policy} + +The policy is what tells the compiler \var{how} to compile a program. +This is logically (and often textually) distinct from the program +itself. Broad control of policy is provided by the \code{optimize} +declaration; other declarations and variables control more specific +aspects of compilation. + + +\subsection{The Optimize Declaration} +\label{optimize-declaration} +\cindex{optimize declaration} +\cpsubindex{declarations}{\code{optimize}} + +The \code{optimize} declaration recognizes six different +\var{qualities}. The qualities are conceptually independent aspects +of program performance. In reality, increasing one quality tends to +have adverse effects on other qualities. The compiler compares the +relative values of qualities when it needs to make a trade-off; i.e., +if \code{speed} is greater than \code{safety}, then improve speed at +the cost of safety. + +The default for all qualities (except \code{debug}) is \code{1}. +Whenever qualities are equal, ties are broken according to a broad +idea of what a good default environment is supposed to be. Generally +this downplays \code{speed}, \code{compile-speed} and \code{space} in +favor of \code{safety} and \code{debug}. Novice and casual users +should stick to the default policy. Advanced users often want to +improve speed and memory usage at the cost of safety and +debuggability. + +If the value for a quality is \code{0} or \code{3}, then it may have a +special interpretation. A value of \code{0} means ``totally +unimportant'', and a \code{3} means ``ultimately important.'' These +extreme optimization values enable ``heroic'' compilation strategies +that are not always desirable and sometimes self-defeating. +Specifying more than one quality as \code{3} is not desirable, since +it doesn't tell the compiler which quality is most important. + + +These are the optimization qualities: +\begin{Lentry} + +\item[\code{speed}] \cindex{speed optimization quality}How fast the + program should is run. \code{speed 3} enables some optimizations + that hurt debuggability. + +\item[\code{compilation-speed}] \cindex{compilation-speed optimization + quality}How fast the compiler should run. Note that increasing + this above \code{safety} weakens type checking. + +\item[\code{space}] \cindex{space optimization quality}How much space + the compiled code should take up. Inline expansion is mostly + inhibited when \code{space} is greater than \code{speed}. A value + of \code{0} enables promiscuous inline expansion. Wide use of a + \code{0} value is not recommended, as it may waste so much space + that run time is slowed. \xlref{inline-expansion} for a discussion + of inline expansion. + +\item[\code{debug}] \cindex{debug optimization quality}How debuggable + the program should be. The quality is treated differently from the + other qualities: each value indicates a particular level of debugger + information; it is not compared with the other qualities. + \xlref{debugger-policy} for more details. + +\item[\code{safety}] \cindex{safety optimization quality}How much + error checking should be done. If \code{speed}, \code{space} or + \code{compilation-speed} is more important than \code{safety}, then + type checking is weakened (\pxlref{weakened-type-checks}). If + \code{safety} if \code{0}, then no run time error checking is done. + In addition to suppressing type checks, \code{0} also suppresses + argument count checking, unbound-symbol checking and array bounds + checks. + +\item[\code{extensions:inhibit-warnings}] \cindex{inhibit-warnings + optimization quality}This is a \cmucl{} extension that determines how + little (or how much) diagnostic output should be printed during + compilation. This quality is compared to other qualities to + determine whether to print style notes and warnings concerning those + qualities. If \code{speed} is greater than \code{inhibit-warnings}, + then notes about how to improve speed will be printed, etc. The + default value is \code{1}, so raising the value for any standard + quality above its default enables notes for that quality. If + \code{inhibit-warnings} is \code{3}, then all notes and most + non-serious warnings are inhibited. This is useful with + \code{declare} to suppress warnings about unavoidable problems. +\end{Lentry} + + +\subsection{The Optimize-Interface Declaration} +\label{optimize-interface-declaration} +\cindex{optimize-interface declaration} +\cpsubindex{declarations}{\code{optimize-interface}} + +The \code{extensions:optimize-interface} declaration is identical in +syntax to the \code{optimize} declaration, but it specifies the policy +used during compilation of code the compiler automatically generates +to check the number and type of arguments supplied to a function. It +is useful to specify this policy separately, since even thoroughly +debugged functions are vulnerable to being passed the wrong arguments. +The \code{optimize-interface} declaration can specify that arguments +should be checked even when the general \code{optimize} policy is +unsafe. + +Note that this argument checking is the checking of user-supplied +arguments to any functions defined within the scope of the +declaration, \code{not} the checking of arguments to \llisp{} +primitives that appear in those definitions. + +The idea behind this declaration is that it allows the definition of +functions that appear fully safe to other callers, but that do no +internal error checking. Of course, it is possible that arguments may +be invalid in ways other than having incorrect type. Functions +compiled unsafely must still protect themselves against things like +user-supplied array indices that are out of bounds and improper lists. +See also the \kwd{context-declarations} option to +\macref{with-compilation-unit}. + + +\section{Open Coding and Inline Expansion} +\label{open-coding} +\cindex{open-coding} +\cindex{inline expansion} +\cindex{static functions} + +Since \clisp{} forbids the redefinition of standard functions\footnote{See the +proposed X3J13 ``lisp-symbol-redefinition'' cleanup.}, the compiler can have +special knowledge of these standard functions embedded in it. This special +knowledge is used in various ways (open coding, inline expansion, source +transformation), but the implications to the user are basically the same: +\begin{itemize} + +\item Attempts to redefine standard functions may be frustrated, since + the function may never be called. Although it is technically + illegal to redefine standard functions, users sometimes want to + implicitly redefine these functions when they are debugging using + the \code{trace} macro. Special-casing of standard functions can be + inhibited using the \code{notinline} declaration. + +\item The compiler can have multiple alternate implementations of + standard functions that implement different trade-offs of speed, + space and safety. This selection is based on the compiler policy, + \pxlref{compiler-policy}. +\end{itemize} + + +When a function call is {\em open coded}, inline code whose effect is +equivalent to the function call is substituted for that function call. +When a function call is {\em closed coded}, it is usually left as is, +although it might be turned into a call to a different function with +different arguments. As an example, if \code{nthcdr} were to be open +coded, then + +\begin{lisp} +(nthcdr 4 foobar) +\end{lisp} + +might turn into + +\begin{lisp} +(cdr (cdr (cdr (cdr foobar)))) +\end{lisp} + +or even + +\begin{lisp} +(do ((i 0 (1+ i)) + (list foobar (cdr foobar))) + ((= i 4) list)) +\end{lisp} + +If \code{nth} is closed coded, then + +\begin{lisp} +(nth x l) +\end{lisp} + +might stay the same, or turn into something like: + +\begin{lisp} +(car (nthcdr x l)) +\end{lisp} + +In general, open coding sacrifices space for speed, but some functions (such as +\code{car}) are so simple that they are always open-coded. Even when not +open-coded, a call to a standard function may be transformed into a +different function call (as in the last example) or compiled as {\em +static call}. Static function call uses a more efficient calling +convention that forbids redefinition. diff --git a/doc/cmu-user/contents_motif.gif b/doc/cmu-user/contents_motif.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d3d016702478a74ae10ef900888bdd3c379aa3b GIT binary patch literal 316 zcmZ?wbhEHb6krfw_{abP1q~Da{|7M?|0yXbc;*)57nP)@D5MqT=PE=5_$p-PCZ?xa zDU{?V>s1uwGARCJVPs%nX3zm?0h!{!^!$#Qv4ElRF^Oazg%$xP4gr?K20Vui7@8Cq z96<~aYG7bFXduDE)_gF*K!Sm#!2w8tc?<#^EKH0F0@&nWDh*(OL4iR)0LC#eU{Fv% q765UP1Rz|v0LZ;S{U8800mw%-4`?77pMe2nUBZC|MrJMs25SIR**_xy literal 0 HcmV?d00001 diff --git a/doc/cmu-user/cross-referencing.tex b/doc/cmu-user/cross-referencing.tex new file mode 100644 index 0000000000..e72023798e --- /dev/null +++ b/doc/cmu-user/cross-referencing.tex @@ -0,0 +1,297 @@ +\chapter{Cross-Referencing Facility} +\label{xref} +\cindex{cross-referencing} +\credits{by Eric Marsden} + +The \cmucl{} cross-referencing facility (abbreviated XREF) assists in +the analysis of static dependency relationships in a program. It +provides introspection capabilities such as the ability to know which +functions may call a given function, and the program contexts in which +a particular global variable is used. The compiler populates a +database of cross-reference information, which can be queried by the +user to know: + +\begin{itemize} +\item +the list of program contexts (functions, macros, top-level forms) +where a given function may be called at runtime, either directly or +indirectly (via its function-object); + +\item +the list of program contexts where a given global variable may be +read; + +\item +the list of program contexts that bind a global variable; + +\item +the list of program contexts where a given global variable may be +modified during the execution of the program. +\end{itemize} + +A global variable is either a dynamic variable or a constant variable, +for instance declared using \code{defvar} or \code{defparameter} or +\code{defconstant}. + + +\section{Populating the cross-reference database} + +\begin{defvar}{c:}{record-xref-info} + When non-NIL, code that is compiled (either using + \code{compile-file}, or by calling \code{compile} from the + listener), will be analyzed for cross-references. Defaults to + \nil{}. +\end{defvar} + +Cross-referencing information is only generated by the compiler; the +interpreter does not populate the cross-reference database. XREF +analysis is independent of whether the compiler is generating native +code or byte code, and of whether it is compiling from a file, from a +stream, or is invoked interactively from the listener. + +Alternatively, the \kwd{:xref} option to \code{compile-file} may be +specified to populate the cross-reference database when compiling a +file. In this case, loading the generated fasl file in a fresh lisp +will also populate the cross-reference database. + +\begin{defun}{xref:}{init-xref-database}{} + Reinitializes the database of cross-references. This can be used to + reclaim the space occupied by the database contents, or to discard + stale cross-reference information. +\end{defun} + + + +\section{Querying the cross-reference database} + +\cmucl{} provides a number of functions in the XREF package that may +be used to query the cross-reference database: + +\begin{defun}{xref:}{who-calls}{\args \var{function}} + Returns the list of xref-contexts where \var{function} (either a + symbol that names a function, or a function object) may be called + at runtime. XREF does not record calls to macro-functions (such as + \code{defun}) or to special forms (such as \code{eval-when}). +\end{defun} + +\begin{defun}{xref:}{who-references}{\args \var{global-variable}} + Returns the list of program contexts that may reference + \var{global-variable}. +\end{defun} + +\begin{defun}{xref:}{who-binds}{\args \var{global-variable}} + Returns a list of program contexts where the specified global + variable may be bound at runtime (for example using \code{LET}). +\end{defun} + +\begin{defun}{xref:}{who-sets}{\args \var{global-variable}} + Returns a list of program contexts where the given global variable + may be modified at runtime (for example using \code{SETQ}). +\end{defun} + +An \textit{xref-context} is the originating site of a cross-reference. +It identifies a portion of a program, and is defined by an +\code{xref-context} structure, that comprises a name, a source file and a +source-path. + +\begin{defun}{xref:}{xref-context-name}{\args \var{context}} + Returns the name slot of an xref-context, which is one of: +\begin{itemize} +\item +a global function, which is named by a symbol or by a list of the form +\code{(setf\ foo)}. + +\item +a macro, named by a list \verb|(:macro foo)|. + +\item +an inner function (\code{flet}, \code{labels}, or anonymous lambdas) that +is named by a list of the form \code{(:internal outer inner)}. + +\item +a method, named by a list of the form +\verb|(:method foo (specializer1 specializer2)|. + +\item +a string \verb|"Top-Level Form"| that identifies a reference from a +top-level form. Note that multiple references from top-level forms +will only be listed once. + +\item +a compiler-macro, named by a string of the form +\verb|(:compiler-macro foo)|. + +\item +a string such as \verb|"DEFSTRUCT FOO"|, identifying a reference from +within a structure accessor or constructor or copier. + +\item +a string such as +\begin{verbatim} + "Creation Form for #" +\end{verbatim} + +\item +a string such as \verb|"defun foo"|, or \verb|"defmethod bar (t)"|, +that identifies a reference from within code that has been generated +by the compiler for that form. For example, the compilation of a +\code{defclass} form causes accessor functions to be generated by the +compiler; this code is compiler-generated (it does not appear in the +source file), and so is identified by the XREF facility by a string. +\end{itemize} +\end{defun} + + +\begin{defun}{xref:}{xref-context-file}{\var{context}} + Return the truename (in the sense of the variable + \vindexed{compile-file-truename}) of the source file from which the + referencing forms were compiled. This slot will be \nil{} if the + code was compiled from a stream, or interactively from the + listener. +\end{defun} + +\begin{defun}{xref:}{xref-context-source-path}{\var{context}} + Return a list of positive integers identifying the form that + contains the cross-reference. The first integer in the source-path + is the number of the top-level form containing the cross-reference + (for example, 2 identifies the second top-level form in the source + file). The second integer in the source-path identifies the form + within this top-level form that contains the cross-reference, and so + on. This function will always return \nil{} if the file slot of an + xref-context is \nil{}. + +% While walking the top-level form, count one in depth-first order for +% each subform that is a cons. +\end{defun} + + + + +\section{Example usage} + +In this section, we will illustrate use of the XREF facility on a +number of simple examples. + +Consider the following program fragment, that defines a global +variable and a function. + +\begin{verbatim} + (defvar *variable-one* 42) + + (defun function-one (x) + (princ (* x *variable-one*))) +\end{verbatim} + +We save this code in a file named \code{example.lisp}, enable +cross-referencing, clear any previous cross-reference information, +compile the file, and can then query the cross-reference database +(output has been modified for readability). + +\begin{verbatim} + USER> (setf c:*record-xref-info* t) + USER> (xref:init-xref-database) + USER> (compile-file "example") + USER> (xref:who-calls 'princ) + (#) + USER> (xref:who-references '*variable-one*) + (#) +\end{verbatim} + +From this example, we see that the compiler has noted the call to the +global function \code{princ} in \code{function-one}, and the reference +to the global variable \code{*variable-one*}. + +Suppose that we add the following code to the previous file. + +\begin{verbatim} +(defconstant +constant-one+ 1) + +(defstruct struct-one + slot-one + (slot-two +constant-one+ :type integer) + (slot-three 42 :read-only t)) + +(defmacro with-different-one (&body body) + `(let ((*variable-one* 666)) + ,@body)) + +(defun get-variable-one () *variable-one*) + +(defun (setf get-variable-one) (new-value) + (setq *variable-one* new-value)) +\end{verbatim} + +In the following example, we detect references x and y. + + +% FIXME add function with LABELS, a binding, a set + + + +The following function illustrates the effect that various forms of +optimization carried out by the \cmucl{} compiler can have on the +cross-references that are reported for a particular program. The +compiler is able to detect that the evaluated condition is always +false, and that the first clause of the \code{if} will never be taken +(this optimization is called dead-code elimination). XREF will +therefore not register a call to the function \code{sin} from the +function \code{foo}. Likewise, no calls to the functions \code{sqrt} +and \code{\textless} are registered, because the compiler has eliminated the +code that evaluates the condition. Finally, no call to the function +\code{expt} is generated, because the compiler was able to evaluate +the result of the expression \code{(expt 3 2)} at compile-time (though +a process called constant-folding). + +\begin{verbatim} +;; zero call references are registered for this function! +(defun constantly-nine (x) + (if (< (sqrt x) 0) + (sin x) + (expt 3 2))) +\end{verbatim} + + +\section{Limitations of the cross-referencing facility} + +No cross-reference information is available for interpreted functions. +The cross-referencing database is not persistent: unless you save an +image using \code{save-lisp}, the database will be empty each time +\cmucl{} is restarted. There is no mechanism that saves +cross-reference information in FASL files, so loading a system from +compiled code will not populate the cross-reference database. The XREF +database currently accumulates ``stale'' information: when compiling a +file, it does not delete any cross-references that may have previously +been generated for that file. This latter limitation will be removed +in a future release. + +The cross-referencing facility is only able to analyze the static +dependencies in a program; it does not provide any information about +runtime (dynamic) dependencies. For instance, XREF is able to identify +the list of program contexts where a given function may be called, but +is not able to determine which contexts will be activated when the +program is executed with a specific set of input parameters. However, +the static analysis that is performed by the \cmucl{} compiler does +allow XREF to provide more information than would be available from a +mere syntactic analysis of a program. References that occur from +within unreachable code will not be displayed by XREF, because the +\cmucl{} compiler deletes dead code before cross-references are +analyzed. Certain ``trivial'' function calls (where the result of the +function call can be evaluated at compile-time) may be eliminated by +optimizations carried out by the compiler; see the example below. + +If you examine the entire database of cross-reference information (by +accessing undocumented internals of the XREF package), you will note +that XREF notes ``bogus'' cross-references to function calls that are +inserted by the compiler. For example, in safe code, the \cmucl{} +compiler inserts a call to an internal function called +\code{c::\%verify-argument-count}, so that the number of arguments +passed to the function is checked each time it is called. The XREF +facility does not distinguish between user code and these forms that +are introduced during compilation. This limitation should not be +visible if you use the documented functions in the XREF package. + +As of the 18e release of \cmucl{}, the cross-referencing facility is +experimental; expect details of its implementation to change in future +releases. In particular, the names given to CLOS methods and to inner +functions will change in future releases. + diff --git a/doc/cmu-user/debug-internals.tex b/doc/cmu-user/debug-internals.tex new file mode 100644 index 0000000000..8d21902d34 --- /dev/null +++ b/doc/cmu-user/debug-internals.tex @@ -0,0 +1,765 @@ +\chapter{Debugger Programmer's Interface} +\label{debug-internals} + +The debugger programmers interface is exported from from the +\code{DEBUG-INTERNALS} or \code{DI} package. This is a CMU +extension that allows debugging tools to be written without detailed +knowledge of the compiler or run-time system. + +Some of the interface routines take a code-location as an argument. As +described in the section on code-locations, some code-locations are +unknown. When a function calls for a \var{basic-code-location}, it +takes either type, but when it specifically names the argument +\var{code-location}, the routine will signal an error if you give it an +unknown code-location. + + +\section{DI Exceptional Conditions} + +Some of these operations fail depending on the availability debugging +information. In the most severe case, when someone saved a Lisp image +stripping all debugging data structures, no operations are valid. In +this case, even backtracing and finding frames is impossible. Some +interfaces can simply return values indicating the lack of information, +or their return values are naturally meaningful in light missing data. +Other routines, as documented below, will signal +\code{serious-condition}s when they discover awkward situations. This +interface does not provide for programs to detect these situations other +than by calling a routine that detects them and signals a condition. +These are serious-conditions because the program using the interface +must handle them before it can correctly continue execution. These +debugging conditions are not errors since it is no fault of the +programmers that the conditions occur. + +\subsection{Debug-conditions} + +The debug internals interface signals conditions when it can't adhere +to its contract. These are serious-conditions because the program +using the interface must handle them before it can correctly continue +execution. These debugging conditions are not errors since it is no +fault of the programmers that the conditions occur. The interface +does not provide for programs to detect these situations other than +calling a routine that detects them and signals a condition. + + +\begin{deftp}{Condition}{debug-condition}{} + +This condition inherits from serious-condition, and all debug-conditions +inherit from this. These must be handled, but they are not programmer errors. +\end{deftp} + + +\begin{deftp}{Condition}{no-debug-info}{} + +This condition indicates there is absolutely no debugging information +available. +\end{deftp} + + +\begin{deftp}{Condition}{no-debug-function-returns}{} + +This condition indicates the system cannot return values from a frame since +its debug-function lacks debug information details about returning values. +\end{deftp} + + +\begin{deftp}{Condition}{no-debug-blocks}{} +This condition indicates that a function was not compiled with debug-block +information, but this information is necessary necessary for some requested +operation. +\end{deftp} + +\begin{deftp}{Condition}{no-debug-variables}{} +Similar to \code{no-debug-blocks}, except that variable information was +requested. +\end{deftp} + +\begin{deftp}{Condition}{lambda-list-unavailable}{} +Similar to \code{no-debug-blocks}, except that lambda list information was +requested. +\end{deftp} + +\begin{deftp}{Condition}{invalid-value}{} + +This condition indicates a debug-variable has \kwd{invalid} or \kwd{unknown} +value in a particular frame. +\end{deftp} + + +\begin{deftp}{Condition}{ambiguous-variable-name}{} + +This condition indicates a user supplied debug-variable name identifies more +than one valid variable in a particular frame. +\end{deftp} + + +\subsection{Debug-errors} + +These are programmer errors resulting from misuse of the debugging tools' +programmers' interface. You could have avoided an occurrence of one of these +by using some routine to check the use of the routine generating the error. + + +\begin{deftp}{Condition}{debug-error}{} +This condition inherits from error, and all user programming errors inherit +from this condition. +\end{deftp} + + +\begin{deftp}{Condition}{unhandled-condition}{} +This error results from a signalled \code{debug-condition} occurring +without anyone handling it. +\end{deftp} + + +\begin{deftp}{Condition}{unknown-code-location}{} +This error indicates the invalid use of an unknown-code-location. +\end{deftp} + + +\begin{deftp}{Condition}{unknown-debug-variable}{} + +This error indicates an attempt to use a debug-variable in conjunction with an +inappropriate debug-function; for example, checking the variable's validity +using a code-location in the wrong debug-function will signal this error. +\end{deftp} + + +\begin{deftp}{Condition}{frame-function-mismatch}{} + +This error indicates you called a function returned by +\code{preprocess-for-eval} +on a frame other than the one for which the function had been prepared. +\end{deftp} + + +\section{Debug-variables} + +Debug-variables represent the constant information about where the system +stores argument and local variable values. The system uniquely identifies with +an integer every instance of a variable with a particular name and package. To +access a value, you must supply the frame along with the debug-variable since +these are particular to a function, not every instance of a variable on the +stack. + +\begin{defun}{}{debug-variable-name}{\args{\var{debug-variable}}} + + This function returns the name of the \var{debug-variable}. The + name is the name of the symbol used as an identifier when writing + the code. +\end{defun} + + +\begin{defun}{}{debug-variable-package}{\args{\var{debug-variable}}} + + This function returns the package name of the \var{debug-variable}. + This is the package name of the symbol used as an identifier when + writing the code. +\end{defun} + + +\begin{defun}{}{debug-variable-symbol}{\args{\var{debug-variable}}} + + This function returns the symbol from interning + \code{debug-variable-name} in the package named by + \code{debug-variable-package}. +\end{defun} + + +\begin{defun}{}{debug-variable-id}{\args{\var{debug-variable}}} + + This function returns the integer that makes \var{debug-variable}'s + name and package name unique with respect to other + \var{debug-variable}'s in the same function. +\end{defun} + + +\begin{defun}{}{debug-variable-validity}{% + \args{\var{debug-variable} \var{basic-code-location}}} + + This function returns three values reflecting the validity of + \var{debug-variable}'s value at \var{basic-code-location}: + \begin{Lentry} + \item[\kwd{valid}] The value is known to be available. + \item[\kwd{invalid}] The value is known to be unavailable. + \item[\kwd{unknown}] The value's availability is unknown. + \end{Lentry} +\end{defun} + + +\begin{defun}{}{debug-variable-value}{\args{\var{debug-variable} + \var{frame}}} + + This function returns the value stored for \var{debug-variable} in + \var{frame}. The value may be invalid. This is \code{SETF}'able. +\end{defun} + + +\begin{defun}{}{debug-variable-valid-value}{% + \args{\var{debug-variable} \var{frame}}} + + This function returns the value stored for \var{debug-variable} in + \var{frame}. If the value is not \kwd{valid}, then this signals an + \code{invalid-value} error. +\end{defun} + + +\section{Frames} + +Frames describe a particular call on the stack for a particular thread. This +is the environment for name resolution, getting arguments and locals, and +returning values. The stack conceptually grows up, so the top of the stack is +the most recently called function. + +\code{top-frame}, \code{frame-down}, \code{frame-up}, and +\code{frame-debug-function} can only fail when there is absolutely no +debug information available. This can only happen when someone saved a +Lisp image specifying that the system dump all debugging data. + + +\begin{defun}{}{top-frame}{} + + This function never returns the frame for itself, always the frame + before calling \code{top-frame}. +\end{defun} + + +\begin{defun}{}{frame-down}{\args{\var{frame}}} + + This returns the frame immediately below \var{frame} on the stack. + When \var{frame} is the bottom of the stack, this returns \nil. +\end{defun} + + +\begin{defun}{}{frame-up}{\args{\var{frame}}} + + This returns the frame immediately above \var{frame} on the stack. + When \var{frame} is the top of the stack, this returns \nil. +\end{defun} + + +\begin{defun}{}{frame-debug-function}{\args{\var{frame}}} + + This function returns the debug-function for the function whose call + \var{frame} represents. +\end{defun} + + +\begin{defun}{}{frame-code-location}{\args{\var{frame}}} + + This function returns the code-location where \var{frame}'s + debug-function will continue running when program execution returns + to \var{frame}. If someone interrupted this frame, the result could + be an unknown code-location. +\end{defun} + + +\begin{defun}{}{frame-catches}{\args{\var{frame}}} + + This function returns an a-list for all active catches in + \var{frame} mapping catch tags to the code-locations at which the + catch re-enters. +\end{defun} + + +\begin{defun}{}{eval-in-frame}{\args{\var{frame} \var{form}}} + + This evaluates \var{form} in \var{frame}'s environment. This can + signal several different debug-conditions since its success relies + on a variety of inexact debug information: \code{invalid-value}, + \code{ambiguous-variable-name}, \code{frame-function-mismatch}. See + also \funref{preprocess-for-eval}. +\end{defun} + +% \begin{defun}{}{return-from-frame}{\args{\var{frame} \var{values}}} +% +% This returns the elements in the list \var{values} as multiple +% values from \var{frame} as if the function \var{frame} represents +% returned these values. This signals a +% \code{no-debug-function-returns} condition when \var{frame}'s +% debug-function lacks information on returning values. +% +% \i{Not Yet Implemented} +% \end{defun} + + +\section {Debug-functions} + +Debug-functions represent the static information about a function determined at +compile time---argument and variable storage, their lifetime information, +etc. The debug-function also contains all the debug-blocks representing +basic-blocks of code, and these contains information about specific +code-locations in a debug-function. + +\begin{defmac}{}{do-debug-function-blocks}{% + \args{(\var{block-var} \var{debug-function} \mopt{result-form}) + \mstar{form}}} + + This executes the forms in a context with \var{block-var} bound to + each debug-block in \var{debug-function} successively. + \var{Result-form} is an optional form to execute for a return value, + and \code{do-debug-function-blocks} returns \nil if there is no + \var{result-form}. This signals a \code{no-debug-blocks} condition + when the \var{debug-function} lacks debug-block information. +\end{defmac} + + +\begin{defun}{}{debug-function-lambda-list}{\args{\var{debug-function}}} + + This function returns a list representing the lambda-list for + \var{debug-function}. The list has the following structure: + \begin{example} + (required-var1 required-var2 + ... + (:optional var3 suppliedp-var4) + (:optional var5) + ... + (:rest var6) (:rest var7) + ... + (:keyword keyword-symbol var8 suppliedp-var9) + (:keyword keyword-symbol var10) + ... + ) + \end{example} + Each \code{var}\var{n} is a debug-variable; however, the symbol + \kwd{deleted} appears instead whenever the argument remains + unreferenced throughout \var{debug-function}. + + If there is no lambda-list information, this signals a + \code{lambda-list-unavailable} condition. +\end{defun} + + +\begin{defmac}{}{do-debug-function-variables}{% + \args{(\var{var} \var{debug-function} \mopt{result}) + \mstar{form}}} + + This macro executes each \var{form} in a context with \var{var} + bound to each debug-variable in \var{debug-function}. This returns + the value of executing \var{result} (defaults to \nil). This may + iterate over only some of \var{debug-function}'s variables or none + depending on debug policy; for example, possibly the compilation + only preserved argument information. +\end{defmac} + + +\begin{defun}{}{debug-variable-info-available}{\args{\var{debug-function}}} + + This function returns whether there is any variable information for + \var{debug-function}. This is useful for distinguishing whether + there were no locals in a function or whether there was no variable + information. For example, if \code{do-debug-function-variables} + executes its forms zero times, then you can use this function to + determine the reason. +\end{defun} + + +\begin{defun}{}{debug-function-symbol-variables}{% + \args{\var{debug-function} \var{symbol}}} + + This function returns a list of debug-variables in + \var{debug-function} having the same name and package as + \var{symbol}. If \var{symbol} is uninterned, then this returns a + list of debug-variables without package names and with the same name + as \var{symbol}. The result of this function is limited to the + availability of variable information in \var{debug-function}; for + example, possibly \var{debug-function} only knows about its + arguments. +\end{defun} + + +\begin{defun}{}{ambiguous-debug-variables}{% + \args{\var{debug-function} \var{name-prefix-string}}} + + This function returns a list of debug-variables in + \var{debug-function} whose names contain \var{name-prefix-string} as + an initial substring. The result of this function is limited to the + availability of variable information in \var{debug-function}; for + example, possibly \var{debug-function} only knows about its + arguments. +\end{defun} + + +\begin{defun}{}{preprocess-for-eval}{% + \args{\var{form} \var{basic-code-location}}} + + This function returns a function of one argument that evaluates + \var{form} in the lexical context of \var{basic-code-location}. + This allows efficient repeated evaluation of \var{form} at a certain + place in a function which could be useful for conditional breaking. + This signals a \code{no-debug-variables} condition when the + code-location's debug-function has no debug-variable information + available. The returned function takes a frame as an argument. See + also \funref{eval-in-frame}. +\end{defun} + + +\begin{defun}{}{function-debug-function}{\args{\var{function}}} + + This function returns a debug-function that represents debug + information for \var{function}. +\end{defun} + + +\begin{defun}{}{debug-function-kind}{\args{\var{debug-function}}} + + This function returns the kind of function \var{debug-function} + represents. The value is one of the following: + \begin{Lentry} + \item[\kwd{optional}] This kind of function is an entry point to an + ordinary function. It handles optional defaulting, parsing + keywords, etc. + \item[\kwd{external}] This kind of function is an entry point to an + ordinary function. It checks argument values and count and calls + the defined function. + \item[\kwd{top-level}] This kind of function executes one or more + random top-level forms from a file. + \item[\kwd{cleanup}] This kind of function represents the cleanup + forms in an \code{unwind-protect}. + \item[\nil] This kind of function is not one of the above; that is, + it is not specially marked in any way. + \end{Lentry} +\end{defun} + + +\begin{defun}{}{debug-function-function}{\args{\var{debug-function}}} + + This function returns the Common Lisp function associated with the + \var{debug-function}. This returns \nil{} if the function is + unavailable or is non-existent as a user callable function object. +\end{defun} + + +\begin{defun}{}{debug-function-name}{\args{\var{debug-function}}} + + This function returns the name of the function represented by + \var{debug-function}. This may be a string or a cons; do not assume + it is a symbol. +\end{defun} + + +\section{Debug-blocks} + +Debug-blocks contain information pertinent to a specific range of code in a +debug-function. + +\begin{defmac}{}{do-debug-block-locations}{% + \args{(\var{code-var} \var{debug-block} \mopt{result}) + \mstar{form}}} + + This macro executes each \var{form} in a context with \var{code-var} + bound to each code-location in \var{debug-block}. This returns the + value of executing \var{result} (defaults to \nil). +\end{defmac} + + +\begin{defun}{}{debug-block-successors}{\args{\var{debug-block}}} + + This function returns the list of possible code-locations where + execution may continue when the basic-block represented by + \var{debug-block} completes its execution. +\end{defun} + + +\begin{defun}{}{debug-block-elsewhere-p}{\args{\var{debug-block}}} + + This function returns whether \var{debug-block} represents elsewhere + code. This is code the compiler has moved out of a function's code + sequence for optimization reasons. Code-locations in these blocks + are unsuitable for stepping tools, and the first code-location has + nothing to do with a normal starting location for the block. +\end{defun} + + +\section{Breakpoints} + +A breakpoint represents a function the system calls with the current frame when +execution passes a certain code-location. A break point is active or inactive +independent of its existence. They also have an extra slot for users to tag +the breakpoint with information. + +\begin{defun}{}{make-breakpoint}{% + \args{\var{hook-function} \var{what} \keys{\kwd{kind} \kwd{info} + \kwd{function-end-cookie}}}} + + This function creates and returns a breakpoint. When program + execution encounters the breakpoint, the system calls + \var{hook-function}. \var{hook-function} takes the current frame + for the function in which the program is running and the breakpoint + object. + + \var{what} and \var{kind} determine where in a function the system + invokes \var{hook-function}. \var{what} is either a code-location + or a debug-function. \var{kind} is one of \kwd{code-location}, + \kwd{function-start}, or \kwd{function-end}. Since the starts and + ends of functions may not have code-locations representing them, + designate these places by supplying \var{what} as a debug-function + and \var{kind} indicating the \kwd{function-start} or + \kwd{function-end}. When \var{what} is a debug-function and + \var{kind} is \kwd{function-end}, then hook-function must take two + additional arguments, a list of values returned by the function and + a function-end-cookie. + + \var{info} is information supplied by and used by the user. + + \var{function-end-cookie} is a function. To implement function-end + breakpoints, the system uses starter breakpoints to establish the + function-end breakpoint for each invocation of the function. Upon + each entry, the system creates a unique cookie to identify the + invocation, and when the user supplies a function for this argument, + the system invokes it on the cookie. The system later invokes the + function-end breakpoint hook on the same cookie. The user may save + the cookie when passed to the function-end-cookie function for later + comparison in the hook function. + + This signals an error if \var{what} is an unknown code-location. + + {\em Note: Breakpoints in interpreted code or byte-compiled code are + not implemented. Function-end breakpoints are not implemented for + compiled functions that use the known local return convention + (e.g. for block-compiled or self-recursive functions.)} + +\end{defun} + + +\begin{defun}{}{activate-breakpoint}{\args{\var{breakpoint}}} + + This function causes the system to invoke the \var{breakpoint}'s + hook-function until the next call to \code{deactivate-breakpoint} or + \code{delete-breakpoint}. The system invokes breakpoint hook + functions in the opposite order that you activate them. +\end{defun} + + +\begin{defun}{}{deactivate-breakpoint}{\args{\var{breakpoint}}} + + This function stops the system from invoking the \var{breakpoint}'s + hook-function. +\end{defun} + + +\begin{defun}{}{breakpoint-active-p}{\args{\var{breakpoint}}} + + This returns whether \var{breakpoint} is currently active. +\end{defun} + + +\begin{defun}{}{breakpoint-hook-function}{\args{\var{breakpoint}}} + + This function returns the \var{breakpoint}'s function the system + calls when execution encounters \var{breakpoint}, and it is active. + This is \code{SETF}'able. +\end{defun} + + +\begin{defun}{}{breakpoint-info}{\args{\var{breakpoint}}} + + This function returns \var{breakpoint}'s information supplied by the + user. This is \code{SETF}'able. +\end{defun} + + +\begin{defun}{}{breakpoint-kind}{\args{\var{breakpoint}}} + + This function returns the \var{breakpoint}'s kind specification. +\end{defun} + + +\begin{defun}{}{breakpoint-what}{\args{\var{breakpoint}}} + + This function returns the \var{breakpoint}'s what specification. +\end{defun} + + +\begin{defun}{}{delete-breakpoint}{\args{\var{breakpoint}}} + + This function frees system storage and removes computational + overhead associated with \var{breakpoint}. After calling this, + \var{breakpoint} is useless and can never become active again. +\end{defun} + + +\section{Code-locations} + +Code-locations represent places in functions where the system has correct +information about the function's environment and where interesting operations +can occur---asking for a local variable's value, setting breakpoints, +evaluating forms within the function's environment, etc. + +Sometimes the interface returns unknown code-locations. These +represent places in functions, but there is no debug information +associated with them. Some operations accept these since they may +succeed even with missing debug data. These operations' argument is +named \var{basic-code-location} indicating they take known and unknown +code-locations. If an operation names its argument +\var{code-location}, and you supply an unknown one, it will signal an +error. For example, \code{frame-code-location} may return an unknown +code-location if someone interrupted Lisp in the given frame. The +system knows where execution will continue, but this place in the code +may not be a place for which the compiler dumped debug information. + +\begin{defun}{}{code-location-debug-function}{\args{\var{basic-code-location}}} + + This function returns the debug-function representing information + about the function corresponding to the code-location. +\end{defun} + + +\begin{defun}{}{code-location-debug-block}{\args{\var{basic-code-location}}} + + This function returns the debug-block containing code-location if it + is available. Some debug policies inhibit debug-block information, + and if none is available, then this signals a \code{no-debug-blocks} + condition. +\end{defun} + + +\begin{defun}{}{code-location-top-level-form-offset}{% + \args{\var{code-location}}} + + This function returns the number of top-level forms before the one + containing \var{code-location} as seen by the compiler in some + compilation unit. A compilation unit is not necessarily a single + file, see the section on debug-sources. +\end{defun} + + +\begin{defun}{}{code-location-form-number}{\args{\var{code-location}}} + + This function returns the number of the form corresponding to + \var{code-location}. The form number is derived by walking the + subforms of a top-level form in depth-first order. While walking + the top-level form, count one in depth-first order for each subform + that is a cons. See \funref{form-number-translations}. +\end{defun} + + +\begin{defun}{}{code-location-debug-source}{\args{\var{code-location}}} + + This function returns \var{code-location}'s debug-source. +\end{defun} + + +\begin{defun}{}{code-location-unknown-p}{\args{\var{basic-code-location}}} + + This function returns whether \var{basic-code-location} is unknown. + It returns \nil{} when the code-location is known. +\end{defun} + + +\begin{defun}{}{code-location=}{\args{\var{code-location1} + \var{code-location2}}} + + This function returns whether the two code-locations are the same. +\end{defun} + + +\section{Debug-sources} + +Debug-sources represent how to get back the source for some code. The +source is either a file (\code{compile-file} or \code{load}), a +lambda-expression (\code{compile}, \code{defun}, \code{defmacro}), or +a stream (something particular to \cmucl{}, \code{compile-from-stream}). + +When compiling a source, the compiler counts each top-level form it +processes, but when the compiler handles multiple files as one block +compilation, the top-level form count continues past file boundaries. +Therefore \code{code-location-top-level-form-offset} returns an offset +that does not always start at zero for the code-location's +debug-source. The offset into a particular source is +\code{code-location-top-level-form-offset} minus +\code{debug-source-root-number}. + +Inside a top-level form, a code-location's form number indicates the +subform corresponding to the code-location. + +\begin{defun}{}{debug-source-from}{\args{\var{debug-source}}} + + This function returns an indication of the type of source. The + following are the possible values: + \begin{Lentry} + \item[\kwd{file}] from a file (obtained by \code{compile-file} if + compiled). + \item[\kwd{lisp}] from Lisp (obtained by \code{compile} if + compiled). + \item[\kwd{stream}] from a non-file stream (\cmucl{} supports + \code{compile-from-stream}). + \end{Lentry} +\end{defun} + + +\begin{defun}{}{debug-source-name}{\args{\var{debug-source}}} + + This function returns the actual source in some sense represented by + debug-source, which is related to \code{debug-source-from}: + \begin{Lentry} + \item[\kwd{file}] the pathname of the file. + \item[\kwd{lisp}] a lambda-expression. + \item[\kwd{stream}] some descriptive string that's otherwise + useless. +\end{Lentry} +\end{defun} + + +\begin{defun}{}{debug-source-created}{\args{\var{debug-source}}} + + This function returns the universal time someone created the source. + This may be \nil{} if it is unavailable. +\end{defun} + + +\begin{defun}{}{debug-source-compiled}{\args{\var{debug-source}}} + + This function returns the time someone compiled the source. This is + \nil{} if the source is uncompiled. +\end{defun} + + +\begin{defun}{}{debug-source-root-number}{\args{\var{debug-source}}} + + This returns the number of top-level forms processed by the compiler + before compiling this source. If this source is uncompiled, this is + zero. This may be zero even if the source is compiled since the + first form in the first file compiled in one compilation, for + example, must have a root number of zero---the compiler saw no other + top-level forms before it. +\end{defun} + + +\section{Source Translation Utilities} + +These two functions provide a mechanism for converting the rather +obscure (but highly compact) representation of source locations into an +actual source form: + +\begin{defun}{}{debug-source-start-positions}{\args{\var{debug-source}}} + + This function returns the file position of each top-level form as a + vector if \var{debug-source} is from a \kwd{file}. If + \code{debug-source-from} is \kwd{lisp} or \kwd{stream}, or the file + is byte-compiled, then the result is \false{}. +\end{defun} + + +\begin{defun}{}{form-number-translations}{\args{\var{form} + \var{tlf-number}}} + + This function returns a table mapping form numbers (see + \code{code-location-form-number}) to source-paths. A source-path + indicates a descent into the top-level-form \var{form}, going + directly to the subform corresponding to a form number. + \var{tlf-number} is the top-level-form number of \var{form}. +\end{defun} + + +\begin{defun}{}{source-path-context}{% + \args{\var{form} \var{path} \var{context}}} + + This function returns the subform of \var{form} indicated by the + source-path. \var{Form} is a top-level form, and \var{path} is a + source-path into it. \var{Context} is the number of enclosing forms + to return instead of directly returning the source-path form. When + \var{context} is non-zero, the form returned contains a marker, + \code{\#:****HERE****}, immediately before the form indicated by + \var{path}. +\end{defun} diff --git a/doc/cmu-user/debugger.tex b/doc/cmu-user/debugger.tex new file mode 100644 index 0000000000..26dbb484c2 --- /dev/null +++ b/doc/cmu-user/debugger.tex @@ -0,0 +1,1334 @@ +\chapter{The Debugger} +\cindex{debugger} +\label{debugger} + +\credits{by Robert MacLachlan} + + +\section{Debugger Introduction} + +The \cmucl{} debugger is unique in its level of support for source-level +debugging of compiled code. Although some other debuggers allow access of +variables by name, this seems to be the first \llisp{} debugger that: +\begin{itemize} + +\item +Tells you when a variable doesn't have a value because it hasn't been +initialized yet or has already been deallocated, or + +\item +Can display the precise source location corresponding to a code +location in the debugged program. +\end{itemize} +These features allow the debugging of compiled code to be made almost +indistinguishable from interpreted code debugging. + +The debugger is an interactive command loop that allows a user to examine +the function call stack. The debugger is invoked when: +\begin{itemize} + +\item +A \tindexed{serious-condition} is signaled, and it is not handled, or + +\item +\findexed{error} is called, and the condition it signals is not handled, or + +\item +The debugger is explicitly invoked with the \clisp{} \findexed{break} +or \findexed{debug} functions. +\end{itemize} + +{\it Note: there are two debugger interfaces in \cmucl{}: the TTY +debugger (described below) and the Motif debugger. Since the +difference is only in the user interface, much of this chapter also +applies to the Motif version. \xlref{motif-interface} for a very brief +discussion of the graphical interface.} + +When you enter the TTY debugger, it looks something like this: + +\begin{example} +Error in function CAR. +Wrong type argument, 3, should have been of type LIST. + +Restarts: + 0: Return to Top-Level. + +Debug (type H for help) + +(CAR 3) +0] +\end{example} + +The first group of lines describe what the error was that put us in the +debugger. In this case \code{car} was called on \code{3}. After \code{Restarts:} +is a list of all the ways that we can restart execution after this error. In +this case, the only option is to return to top-level. After printing its +banner, the debugger prints the current frame and the debugger prompt. + + +\section{The Command Loop} + +The debugger is an interactive read-eval-print loop much like the normal +top-level, but some symbols are interpreted as debugger commands instead +of being evaluated. A debugger command starts with the symbol name of +the command, possibly followed by some arguments on the same line. Some +commands prompt for additional input. Debugger commands can be +abbreviated by any unambiguous prefix: \code{help} can be typed as +\code{h}, \code{he}, etc. For convenience, some commands have +ambiguous one-letter abbreviations: \code{f} for \code{frame}. + +The package is not significant in debugger commands; any symbol with the +name of a debugger command will work. If you want to show the value of +a variable that happens also to be the name of a debugger command, you +can use the \code{list-locals} command or the \code{debug:var} +function, or you can wrap the variable in a \code{progn} to hide it from +the command loop. + +The debugger prompt is ``\var{frame}\code{]}'', where \var{frame} is the number +of the current frame. Frames are numbered starting from zero at the top (most +recent call), increasing down to the bottom. The current frame is the frame +that commands refer to. The current frame also provides the lexical +environment for evaluation of non-command forms. + +\cpsubindex{evaluation}{debugger} The debugger evaluates forms in the lexical +environment of the functions being debugged. The debugger can only +access variables. You can't \code{go} or \code{return-from} into a +function, and you can't call local functions. Special variable +references are evaluated with their current value (the innermost binding +around the debugger invocation)\dash{}you don't get the value that the +special had in the current frame. \xlref{debug-vars} for more +information on debugger variable access. + + +\section{Stack Frames} +\cindex{stack frames} \cpsubindex{frames}{stack} + +A stack frame is the run-time representation of a call to a function; +the frame stores the state that a function needs to remember what it is +doing. Frames have: +\begin{itemize} + +\item +Variables (\pxlref{debug-vars}), which are the values being operated +on, and + +\item +Arguments to the call (which are really just particularly interesting +variables), and + +\item +A current location (\pxlref{source-locations}), which is the place in +the program where the function was running when it stopped to call another +function, or because of an interrupt or error. +\end{itemize} + + +\subsection{Stack Motion} + +These commands move to a new stack frame and print the name of the function +and the values of its arguments in the style of a Lisp function call: +\begin{Lentry} + +\item[\code{up}] +Move up to the next higher frame. More recent function calls are considered +to be higher on the stack. + +\item[\code{down}] +Move down to the next lower frame. + +\item[\code{top}] +Move to the highest frame. + +\item[\code{bottom}] +Move to the lowest frame. + +\item[\code{frame} [\textit{n}]] +Move to the frame with the specified number. Prompts for the number if not +supplied. + +% \key{S} [\var{function-name} [\var{n}]] +% +% \item +% Search down the stack for function. Prompts for the function name if not +% supplied. Searches an optional number of times, but doesn't prompt for +% this number; enter it following the function. +% +% \item[\key{R} [\var{function-name} [\var{n}]]] +% Search up the stack for function. Prompts for the function name if not +% supplied. Searches an optional number of times, but doesn't prompt for +% this number; enter it following the function. +\end{Lentry} + + +\subsection{How Arguments are Printed} + +A frame is printed to look like a function call, but with the actual argument +values in the argument positions. So the frame for this call in the source: + +\begin{lisp} +(myfun (+ 3 4) 'a) +\end{lisp} + +would look like this: + +\begin{example} +(MYFUN 7 A) +\end{example} + +All keyword and optional arguments are displayed with their actual +values; if the corresponding argument was not supplied, the value will +be the default. So this call: + +\begin{lisp} +(subseq "foo" 1) +\end{lisp} + +would look like this: + +\begin{example} +(SUBSEQ "foo" 1 3) +\end{example} + +And this call: + +\begin{lisp} +(string-upcase "test case") +\end{lisp} + +would look like this: + +\begin{example} +(STRING-UPCASE "test case" :START 0 :END NIL) +\end{example} + +The arguments to a function call are displayed by accessing the argument +variables. Although those variables are initialized to the actual argument +values, they can be set inside the function; in this case the new value will be +displayed. + +\code{\amprest} arguments are handled somewhat differently. The value of +the rest argument variable is displayed as the spread-out arguments to +the call, so: + +\begin{lisp} +(format t "~A is a ~A." "This" 'test) +\end{lisp} + +would look like this: + +\begin{example} +(FORMAT T "~A is a ~A." "This" 'TEST) +\end{example} + +Rest arguments cause an exception to the normal display of keyword +arguments in functions that have both \code{\amprest} and \code{\&key} +arguments. In this case, the keyword argument variables are not +displayed at all; the rest arg is displayed instead. So for these +functions, only the keywords actually supplied will be shown, and the +values displayed will be the argument values, not values of the +(possibly modified) variables. + +If the variable for an argument is never referenced by the function, it will be +deleted. The variable value is then unavailable, so the debugger prints +\code{\#\textless unused-arg\textgreater} instead of the value. Similarly, if for any of a number of +reasons (described in more detail in section \ref{debug-vars}) the value of the +variable is unavailable or not known to be available, then +\code{\#\textless unavailable-arg\textgreater} will be printed instead of the argument value. + +Printing of argument values is controlled by \code{*debug-print-level*} and +\varref{debug-print-length}. + +\subsection{Function Names} +\cpsubindex{function}{names} +\cpsubindex{names}{function} + +If a function is defined by \code{defun}, \code{labels}, or \code{flet}, then the +debugger will print the actual function name after the open parenthesis, like: + +\begin{example} +(STRING-UPCASE "test case" :START 0 :END NIL) +((SETF AREF) \#\back{a} "for" 1) +\end{example} + +Otherwise, the function name is a string, and will be printed in quotes: + +\begin{example} +("DEFUN MYFUN" BAR) +("DEFMACRO DO" (DO ((I 0 (1+ I))) ((= I 13))) NIL) +("SETQ *GC-NOTIFY-BEFORE*") +\end{example} + +This string name is derived from the \w{\code{def}\var{mumble}} form +that encloses or expanded into the lambda, or the outermost enclosing +form if there is no \w{\code{def}\var{mumble}}. + +\subsection{Funny Frames} +\cindex{external entry points} +\cpsubindex{entry points}{external} +\cpsubindex{block compilation}{debugger implications} +\cpsubindex{external}{stack frame kind} +\cpsubindex{optional}{stack frame kind} +\cpsubindex{cleanup}{stack frame kind} + +Sometimes the evaluator introduces new functions that are used to implement a +user function, but are not directly specified in the source. The main place +this is done is for checking argument type and syntax. Usually these functions +do their thing and then go away, and thus are not seen on the stack in the +debugger. But when you get some sort of error during lambda-list processing, +you end up in the debugger on one of these funny frames. + +These funny frames are flagged by printing ``\code{[}\var{keyword}\code{]}'' after the +parentheses. For example, this call: + +\begin{lisp} +(car 'a 'b) +\end{lisp} + +will look like this: + +\begin{example} +(CAR 2 A) [:EXTERNAL] +\end{example} + +And this call: + +\begin{lisp} +(string-upcase "test case" :end) +\end{lisp} + +would look like this: + +\begin{example} +("DEFUN STRING-UPCASE" "test case" 335544424 1) [:OPTIONAL] +\end{example} + +As you can see, these frames have only a vague resemblance to the original +call. Fortunately, the error message displayed when you enter the debugger +will usually tell you what problem is (in these cases, too many arguments +and odd keyword arguments.) Also, if you go down the stack to the frame for +the calling function, you can display the original source (\pxlref{source-locations}.) + +With recursive or block compiled functions +(\pxlref{block-compilation}), an \kwd{EXTERNAL} frame may appear +before the frame representing the first call to the recursive function +or entry to the compiled block. This is a consequence of the way the +compiler does block compilation: there is nothing odd with your +program. You will also see \kwd{CLEANUP} frames during the execution +of \code{unwind-protect} cleanup code. Note that inline expansion and +open-coding affect what frames are present in the debugger, see +sections \ref{debugger-policy} and \ref{open-coding}. + + +\subsection{Debug Tail Recursion} +\label{debug-tail-recursion} +\cindex{tail recursion} +\cpsubindex{recursion}{tail} + +Both the compiler and the interpreter are ``properly tail recursive.'' If a +function call is in a tail-recursive position, the stack frame will be +deallocated {\em at the time of the call}, rather than after the call returns. +Consider this backtrace: +\begin{example} +(BAR ...) +(FOO ...) +\end{example} +Because of tail recursion, it is not necessarily the case that +\code{FOO} directly called \code{BAR}. It may be that \code{FOO} called +some other function \code{FOO2} which then called \code{BAR} +tail-recursively, as in this example: +\begin{example} +(defun foo () + ... + (foo2 ...) + ...) + +(defun foo2 (...) + ... + (bar ...)) + +(defun bar (...) + ...) +\end{example} + +Usually the elimination of tail-recursive frames makes debugging more +pleasant, since theses frames are mostly uninformative. If there is any +doubt about how one function called another, it can usually be +eliminated by finding the source location in the calling frame (section +\ref{source-locations}.) + +The elimination of tail-recursive frames can be prevented by disabling +tail-recursion optimization, which happens when the \code{debug} +optimization quality is greater than \code{2} +(\pxlref{debugger-policy}.) + +For a more thorough discussion of tail recursion, \pxlref{tail-recursion}. + + +\subsection{Unknown Locations and Interrupts} +\label{unknown-locations} +\cindex{unknown code locations} +\cpsubindex{locations}{unknown} +\cindex{interrupts} +\cpsubindex{errors}{run-time} + +The debugger operates using special debugging information attached to +the compiled code. This debug information tells the debugger what it +needs to know about the locations in the code where the debugger can be +invoked. If the debugger somehow encounters a location not described in +the debug information, then it is said to be \var{unknown}. If the code +location for a frame is unknown, then some variables may be +inaccessible, and the source location cannot be precisely displayed. + +There are three reasons why a code location could be unknown: +\begin{itemize} + +\item +There is inadequate debug information due to the value of the \code{debug} +optimization quality. \xlref{debugger-policy}. + +\item +The debugger was entered because of an interrupt such as \code{$\hat{ }C$}. + +\item +A hardware error such as ``\code{bus error}'' occurred in code that was +compiled unsafely due to the value of the \code{safety} optimization +quality. \xlref{optimize-declaration}. +\end{itemize} + +In the last two cases, the values of argument variables are accessible, +but may be incorrect. \xlref{debug-var-validity} for more details on +when variable values are accessible. + +It is possible for an interrupt to happen when a function call or return is in +progress. The debugger may then flame out with some obscure error or insist +that the bottom of the stack has been reached, when the real problem is that +the current stack frame can't be located. If this happens, return from the +interrupt and try again. + +When running interpreted code, all locations should be known. However, +an interrupt might catch some subfunction of the interpreter at an +unknown location. In this case, you should be able to go up the stack a +frame or two and reach an interpreted frame which can be debugged. + + +\section{Variable Access} +\label{debug-vars} +\cpsubindex{variables}{debugger access} +\cindex{debug variables} + +There are three ways to access the current frame's local variables in the +debugger. The simplest is to type the variable's name into the debugger's +read-eval-print loop. The debugger will evaluate the variable reference as +though it had appeared inside that frame. + +The debugger doesn't really understand lexical scoping; it has just one +namespace for all the variables in a function. If a symbol is the name of +multiple variables in the same function, then the reference appears ambiguous, +even though lexical scoping specifies which value is visible at any given +source location. If the scopes of the two variables are not nested, then the +debugger can resolve the ambiguity by observing that only one variable is +accessible. + +When there are ambiguous variables, the evaluator assigns each one a +small integer identifier. The \code{debug:var} function and the +\code{list-locals} command use this identifier to distinguish between +ambiguous variables: +\begin{Lentry} + +\item[\code{list-locals} \mopt{\var{prefix}}]%%\hfill\\ +This command prints the name and value of all variables in the current +frame whose name has the specified \var{prefix}. \var{prefix} may be a +string or a symbol. If no \var{prefix} is given, then all available +variables are printed. If a variable has a potentially ambiguous name, +then the name is printed with a ``\code{\#}\var{identifier}'' suffix, where +\var{identifier} is the small integer used to make the name unique. +\end{Lentry} + +\begin{defun}{debug:}{var}{\args{\var{name} \ampoptional{} \var{identifier}}} + + This function returns the value of the variable in the current frame + with the specified \var{name}. If supplied, \var{identifier} + determines which value to return when there are ambiguous variables. + + When \var{name} is a symbol, it is interpreted as the symbol name of + the variable, i.e. the package is significant. If \var{name} is an + uninterned symbol (gensym), then return the value of the uninterned + variable with the same name. If \var{name} is a string, + \code{debug:var} interprets it as the prefix of a variable name, and + must unambiguously complete to the name of a valid variable. + + This function is useful mainly for accessing the value of uninterned + or ambiguous variables, since most variables can be evaluated + directly. +\end{defun} + + +\subsection{Variable Value Availability} +\label{debug-var-validity} +\cindex{availability of debug variables} +\cindex{validity of debug variables} +\cindex{debug optimization quality} + +The value of a variable may be unavailable to the debugger in portions of the +program where \clisp{} says that the variable is defined. If a variable value is +not available, the debugger will not let you read or write that variable. With +one exception, the debugger will never display an incorrect value for a +variable. Rather than displaying incorrect values, the debugger tells you the +value is unavailable. + +The one exception is this: if you interrupt (e.g., with \code{$\hat{ }C$}) or if there is +an unexpected hardware error such as ``\code{bus error}'' (which should only happen +in unsafe code), then the values displayed for arguments to the interrupted +frame might be incorrect.\footnote{Since the location of an interrupt or hardware +error will always be an unknown location (\pxlref{unknown-locations}), +non-argument variable values will never be available in the interrupted frame.} +This exception applies only to the interrupted frame: any frame farther down +the stack will be fine. + +The value of a variable may be unavailable for these reasons: +\begin{itemize} + +\item +The value of the \code{debug} optimization quality may have omitted debug +information needed to determine whether the variable is available. +Unless a variable is an argument, its value will only be available when +\code{debug} is at least \code{2}. + +\item +The compiler did lifetime analysis and determined that the value was no longer +needed, even though its scope had not been exited. Lifetime analysis is +inhibited when the \code{debug} optimization quality is \code{3}. + +\item +The variable's name is an uninterned symbol (gensym). To save space, the +compiler only dumps debug information about uninterned variables when the +\code{debug} optimization quality is \code{3}. + +\item +The frame's location is unknown (\pxlref{unknown-locations}) because +the debugger was entered due to an interrupt or unexpected hardware error. +Under these conditions the values of arguments will be available, but might be +incorrect. This is the exception above. + +\item +The variable was optimized out of existence. Variables with no reads are +always optimized away, even in the interpreter. The degree to which the +compiler deletes variables will depend on the value of the \code{compile-speed} +optimization quality, but most source-level optimizations are done under all +compilation policies. +\end{itemize} + + +Since it is especially useful to be able to get the arguments to a function, +argument variables are treated specially when the \code{speed} optimization +quality is less than \code{3} and the \code{debug} quality is at least \code{1}. +With this compilation policy, the values of argument variables are almost +always available everywhere in the function, even at unknown locations. For +non-argument variables, \code{debug} must be at least \code{2} for values to be +available, and even then, values are only available at known locations. + + +\subsection{Note On Lexical Variable Access} +\cpsubindex{evaluation}{debugger} + +When the debugger command loop establishes variable bindings for available +variables, these variable bindings have lexical scope and dynamic +extent.\footnote{The variable bindings are actually created using the \clisp{} +\code{symbol-macrolet} special form.} You can close over them, but such closures +can't be used as upward funargs. + +You can also set local variables using \code{setq}, but if the variable was closed +over in the original source and never set, then setting the variable in the +debugger may not change the value in all the functions the variable is defined +in. Another risk of setting variables is that you may assign a value of a type +that the compiler proved the variable could never take on. This may result in +bad things happening. + + +\section{Source Location Printing} +\label{source-locations} +\cpsubindex{source location printing}{debugger} + +One of \cmucl{}'s unique capabilities is source level debugging of compiled +code. These commands display the source location for the current frame: +\begin{Lentry} + +\item[\code{source} \mopt{\var{context}}]%%\hfill\\ +This command displays the file that the current frame's function was defined +from (if it was defined from a file), and then the source form responsible for +generating the code that the current frame was executing. If \var{context} is +specified, then it is an integer specifying the number of enclosing levels of +list structure to print. + +\item[\code{vsource} \mopt{\var{context}}]%%\hfill\\ +This command is identical to \code{source}, except that it uses the +global values of \code{*print-level*} and \code{*print-length*} instead +of the debugger printing control variables \code{*debug-print-level*} +and \code{*debug-print-length*}. +\end{Lentry} + +The source form for a location in the code is the innermost list present +in the original source that encloses the form responsible for generating +that code. If the actual source form is not a list, then some enclosing +list will be printed. For example, if the source form was a reference +to the variable \code{*some-random-special*}, then the innermost +enclosing evaluated form will be printed. Here are some possible +enclosing forms: +\begin{example} +(let ((a *some-random-special*)) + ...) + +(+ *some-random-special* ...) +\end{example} + +If the code at a location was generated from the expansion of a macro or a +source-level compiler optimization, then the form in the original source that +expanded into that code will be printed. Suppose the file +\file{/usr/me/mystuff.lisp} looked like this: +\begin{example} +(defmacro mymac () + '(myfun)) + +(defun foo () + (mymac) + ...) +\end{example} +If \code{foo} has called \code{myfun}, and is waiting for it to return, then the +\code{source} command would print: +\begin{example} +; File: /usr/me/mystuff.lisp + +(MYMAC) +\end{example} +Note that the macro use was printed, not the actual function call form, +\code{(myfun)}. + +If enclosing source is printed by giving an argument to \code{source} or +\code{vsource}, then the actual source form is marked by wrapping it in a list +whose first element is \code{\#:***HERE***}. In the previous example, +\w{\code{source 1}} would print: +\begin{example} +; File: /usr/me/mystuff.lisp + +(DEFUN FOO () + (#:***HERE*** + (MYMAC)) + ...) +\end{example} + + +\subsection{How the Source is Found} + +If the code was defined from \llisp{} by \code{compile} or +\code{eval}, then the source can always be reliably located. If the +code was defined from a \code{fasl} file created by +\findexed{compile-file}, then the debugger gets the source forms it +prints by reading them from the original source file. This is a +potential problem, since the source file might have moved or changed +since the time it was compiled. + +The source file is opened using the \code{truename} of the source file +pathname originally given to the compiler. This is an absolute pathname +with all logical names and symbolic links expanded. If the file can't +be located using this name, then the debugger gives up and signals an +error. + +If the source file can be found, but has been modified since the time it was +compiled, the debugger prints this warning: +\begin{example} +; File has been modified since compilation: +; \var{filename} +; Using form offset instead of character position. +\end{example} +where \var{filename} is the name of the source file. It then proceeds using a +robust but not foolproof heuristic for locating the source. This heuristic +works if: +\begin{itemize} + +\item +No top-level forms before the top-level form containing the source have been +added or deleted, and + +\item +The top-level form containing the source has not been modified much. (More +precisely, none of the list forms beginning before the source form have been +added or deleted.) +\end{itemize} + +If the heuristic doesn't work, the displayed source will be wrong, but will +probably be near the actual source. If the ``shape'' of the top-level form in +the source file is too different from the original form, then an error will be +signaled. When the heuristic is used, the the source location commands are +noticeably slowed. + +Source location printing can also be confused if (after the source was +compiled) a read-macro you used in the code was redefined to expand into +something different, or if a read-macro ever returns the same \code{eq} +list twice. If you don't define read macros and don't use \code{\#\#} in +perverted ways, you don't need to worry about this. + + +\subsection{Source Location Availability} + +\cindex{debug optimization quality} +Source location information is only available when the \code{debug} +optimization quality is at least \code{2}. If source location information is +unavailable, the source commands will give an error message. + +If source location information is available, but the source location is +unknown because of an interrupt or unexpected hardware error +(\pxlref{unknown-locations}), then the command will print: + +\begin{example} +Unknown location: using block start. +\end{example} + +and then proceed to print the source location for the start of the +{\em basic block} enclosing the code location. +\cpsubindex{block}{basic} \cpsubindex{block}{start location} +It's a bit complicated to explain exactly what a basic block is, but +here are some properties of the block start location: + +\begin{itemize} + +\item The block start location may be the same as the true location. + +\item The block start location will never be later in the the + program's flow of control than the true location. + +\item No conditional control structures (such as \code{if}, + \code{cond}, \code{or}) will intervene between the block start and + the true location (but note that some conditionals present in the + original source could be optimized away.) Function calls {\em do not} + end basic blocks. + +\item The head of a loop will be the start of a block. + +\item The programming language concept of ``block structure'' and the + \clisp{} \code{block} special form are totally unrelated to the + compiler's basic block. +\end{itemize} + +In other words, the true location lies between the printed location and the +next conditional (but watch out because the compiler may have changed the +program on you.) + + +\section{Compiler Policy Control} +\label{debugger-policy} +\cpsubindex{policy}{debugger} +\cindex{debug optimization quality} +\cindex{optimize declaration} + +The compilation policy specified by \code{optimize} declarations affects the +behavior seen in the debugger. The \code{debug} quality directly affects the +debugger by controlling the amount of debugger information dumped. Other +optimization qualities have indirect but observable effects due to changes in +the way compilation is done. + +Unlike the other optimization qualities (which are compared in relative value +to evaluate tradeoffs), the \code{debug} optimization quality is directly +translated to a level of debug information. This absolute interpretation +allows the user to count on a particular amount of debug information being +available even when the values of the other qualities are changed during +compilation. These are the levels of debug information that correspond to the +values of the \code{debug} quality: +\begin{Lentry} + +\item[\code{0}] +Only the function name and enough information to allow the stack to +be parsed. + +\item[\code{\w{$>$ 0}}] +Any level greater than \code{0} gives level \code{0} plus all +argument variables. Values will only be accessible if the argument +variable is never set and +\code{speed} is not \code{3}. \cmucl{} allows any real value for optimization +qualities. It may be useful to specify \code{0.5} to get backtrace argument +display without argument documentation. + +\item[\code{1}] Level \code{1} provides argument documentation +(printed arglists) and derived argument/result type information. +This makes \findexed{describe} more informative, and allows the +compiler to do compile-time argument count and type checking for any +calls compiled at run-time. + +\item[\code{2}] +Level \code{1} plus all interned local variables, source location +information, and lifetime information that tells the debugger when arguments +are available (even when \code{speed} is \code{3} or the argument is set.) This is +the default. + +\item[\code{\w{$>$ 2}}] +Any level greater than \code{2} gives level \code{2} and in addition +disables tail-call optimization, so that the backtrace will contain +frames for all invoked functions, even those in tail positions. + +\item[\code{3}] +Level \code{2} plus all uninterned variables. In addition, lifetime +analysis is disabled (even when \code{speed} is \code{3}), ensuring +that all variable values are available at any known location within +the scope of the binding. This has a speed penalty in addition to the +obvious space penalty. +\end{Lentry} + +As you can see, if the \code{speed} quality is \code{3}, debugger performance is +degraded. This effect comes from the elimination of argument variable +special-casing (\pxlref{debug-var-validity}.) Some degree of +speed/debuggability tradeoff is unavoidable, but the effect is not too drastic +when \code{debug} is at least \code{2}. + +\cindex{inline expansion} +\cindex{semi-inline expansion} +In addition to \code{inline} and \code{notinline} declarations, the relative values +of the \code{speed} and \code{space} qualities also change whether functions are +inline expanded (\pxlref{inline-expansion}.) If a function is inline +expanded, then there will be no frame to represent the call, and the arguments +will be treated like any other local variable. Functions may also be +``semi-inline'', in which case there is a frame to represent the call, but the +call is to an optimized local version of the function, not to the original +function. + + +\section{Exiting Commands} + +These commands get you out of the debugger. + +\begin{Lentry} + +\item[\code{quit}] +Throw to top level. + +\item[\code{restart} \mopt{\var{n}}]%%\hfill\\ +Invokes the \var{n}th restart case as displayed by the \code{error} +command. If \var{n} is not specified, the available restart cases are +reported. + +\item[\code{go}] +Calls \code{continue} on the condition given to \code{debug}. If there is no +restart case named \var{continue}, then an error is signaled. + +\item[\code{abort}] +Calls \code{abort} on the condition given to \code{debug}. This is +useful for popping debug command loop levels or aborting to top level, +as the case may be. + +% (\code{debug:debug-return} \var{expression} \mopt{\var{frame}}) +% +% \item +% From the current or specified frame, return the result of evaluating +% expression. If multiple values are expected, then this function should be +% called for multiple values. +\end{Lentry} + + +\section{Information Commands} + +Most of these commands print information about the current frame or +function, but a few show general information. + +\begin{Lentry} + +\item[\code{help}, \code{?}] +Displays a synopsis of debugger commands. + +\item[\code{describe}] +Calls \code{describe} on the current function, displays number of local +variables, and indicates whether the function is compiled or interpreted. + +\item[\code{print}] +Displays the current function call as it would be displayed by moving to +this frame. + +\item[\code{vprint} (or \code{pp}) \mopt{\var{verbosity}}]%%\hfill\\ +Displays the current function call using \code{*print-level*} and +\code{*print-length*} instead of \code{*debug-print-level*} and +\code{*debug-print-length*}. \var{verbosity} is a small integer +(default 2) that controls other dimensions of verbosity. + +\item[\code{error}] +Prints the condition given to \code{invoke-debugger} and the active +proceed cases. + +\item[\code{backtrace} \mopt{\var{n}}]\hfill\\ +Displays all the frames from the current to the bottom. Only shows +\var{n} frames if specified. The printing is controlled by +\code{*debug-print-level*} and \code{*debug-print-length*}. + +% (\code{debug:debug-function} \mopt{\var{n}}) +% +% \item +% Returns the function from the current or specified frame. +% +% \item[(\code{debug:function-name} \mopt{\var{n}])] +% Returns the function name from the current or specified frame. +% +% \item[(\code{debug:pc} \mopt{\var{frame}})] +% Returns the index of the instruction for the function in the current or +% specified frame. This is useful in conjunction with \code{disassemble}. +% The pc returned points to the instruction after the one that was fatal. +\end{Lentry} + + +\section{Breakpoint Commands}\cindex{breakpoints} + +\cmucl{} supports setting of breakpoints inside compiled functions and +stepping of compiled code. Breakpoints can only be set at at known +locations (\pxlref{unknown-locations}), so these commands are largely +useless unless the \code{debug} optimize quality is at least \code{2} +(\pxlref{debugger-policy}). These commands manipulate breakpoints: +\begin{Lentry} +\item[\code{breakpoint} \var{location} \mstar{\var{option} \var{value}}] +%%\hfill\\ +Set a breakpoint in some function. \var{location} may be an integer +code location number (as displayed by \code{list-locations}) or a +keyword. The keyword can be used to indicate setting a breakpoint at +the function start (\kwd{start}, \kwd{s}) or function end +(\kwd{end}, \kwd{e}). The \code{breakpoint} command has +\kwd{condition}, \kwd{break}, \kwd{print} and \kwd{function} +options which work similarly to the \code{trace} options. + +\item[\code{list-locations} (or \code{ll}) \mopt{\var{function}}]%%\hfill\\ +List all the code locations in the current frame's function, or in +\var{function} if it is supplied. The display format is the code +location number, a colon and then the source form for that location: +\begin{example} +3: (1- N) +\end{example} +If consecutive locations have the same source, then a numeric range like +\code{3-5:} will be printed. For example, a default function call has a +known location both immediately before and after the call, which would +result in two code locations with the same source. The listed function +becomes the new default function for breakpoint setting (via the +\code{breakpoint}) command. + +\item[\code{list-breakpoints} (or \code{lb})]%%\hfill\\ +List all currently active breakpoints with their breakpoint number. + +\item[\code{delete-breakpoint} (or \code{db}) \mopt{\var{number}}]%%\hfill\\ +Delete a breakpoint specified by its breakpoint number. If no number is +specified, delete all breakpoints. + +\item[\code{step}]%%\hfill\\ +Step to the next possible breakpoint location in the current function. +This always steps over function calls, instead of stepping into them +\end{Lentry} + + +\subsection{Breakpoint Example} + +Consider this definition of the factorial function: + +\begin{lisp} +(defun ! (n) + (if (zerop n) + 1 + (* n (! (1- n))))) +\end{lisp} + +This debugger session demonstrates the use of breakpoints: + +\begin{example} +common-lisp-user> (break) ; Invoke debugger + +Break + +Restarts: + 0: [CONTINUE] Return from BREAK. + 1: [ABORT ] Return to Top-Level. + +Debug (type H for help) + +(INTERACTIVE-EVAL (BREAK)) +0] ll #'! +0: #'(LAMBDA (N) (BLOCK ! (IF # 1 #))) +1: (ZEROP N) +2: (* N (! (1- N))) +3: (1- N) +4: (! (1- N)) +5: (* N (! (1- N))) +6: #'(LAMBDA (N) (BLOCK ! (IF # 1 #))) +0] br 2 +(* N (! (1- N))) +1: 2 in ! +Added. +0] q + +common-lisp-user> (! 10) ; Call the function + +*Breakpoint hit* + +Restarts: + 0: [CONTINUE] Return from BREAK. + 1: [ABORT ] Return to Top-Level. + +Debug (type H for help) + +(! 10) ; We are now in first call (arg 10) before the multiply +Source: (* N (! (1- N))) +3] st + +*Step* + +(! 10) ; We have finished evaluation of (1- n) +Source: (1- N) +3] st + +*Breakpoint hit* + +Restarts: + 0: [CONTINUE] Return from BREAK. + 1: [ABORT ] Return to Top-Level. + +Debug (type H for help) + +(! 9) ; We hit the breakpoint in the recursive call +Source: (* N (! (1- N))) +3] +\end{example} + + +\section{Function Tracing} +\cindex{tracing} +\cpsubindex{function}{tracing} + +The tracer causes selected functions to print their arguments and +their results whenever they are called. Options allow conditional +printing of the trace information and conditional breakpoints on +function entry or exit. + +\begin{defmac}{}{trace}{% + \args{\mstar{option global-value} \mstar{name \mstar{option value}}}} + + \code{trace} is a debugging tool that prints information when + specified functions are called. In its simplest form: + \begin{example} + (trace \var{name-1} \var{name-2} ...) + \end{example} + \code{trace} causes a printout on \vindexed{trace-output} each time + that one of the named functions is entered or returns (the + \var{names} are not evaluated.) Trace output is indented according + to the number of pending traced calls, and this trace depth is + printed at the beginning of each line of output. Printing verbosity + of arguments and return values is controlled by + \vindexed{debug-print-level} and \vindexed{debug-print-length}. + + Local functions defined by \code{flet} and \code{labels} can be + traced using the syntax \code{(flet f f1 f2 ...)} or \code{(labels f + f1 f2 ...)} where \code{f} is the \code{flet} or \code{labels} + function we want to trace and \code{f1}, \code{f2}, are the + functions containing the local function \code{f}. + Invidiual methods can also be traced using the syntax \code{(method + \var{name} \var{qualifiers} \var{specializers})}. + See~\ref{sec:method-tracing} for more information. + + If no \var{names} or \var{options} are are given, \code{trace} + returns the list of all currently traced functions, + \code{*traced-function-list*}. + + Trace options can cause the normal printout to be suppressed, or + cause extra information to be printed. Each option is a pair of an + option keyword and a value form. Options may be interspersed with + function names. Options only affect tracing of the function whose + name they appear immediately after. Global options are specified + before the first name, and affect all functions traced by a given + use of \code{trace}. If an already traced function is traced again, + any new options replace the old options. The following options are + defined: + \begin{Lentry} + \item[\kwd{condition} \var{form}, \kwd{condition-after} \var{form}, + \kwd{condition-all} \var{form}] If \kwd{condition} is specified, + then \code{trace} does nothing unless \var{form} evaluates to true + at the time of the call. \kwd{condition-after} is similar, but + suppresses the initial printout, and is tested when the function + returns. \kwd{condition-all} tries both before and after. + + \item[\kwd{wherein} \var{names}] If specified, \var{names} is a + function name or list of names. \code{trace} does nothing unless + a call to one of those functions encloses the call to this + function (i.e. it would appear in a backtrace.) Anonymous + functions have string names like \code{"DEFUN FOO"}. Individual + methods can also be traced. See section~\ref{sec:method-tracing}. + + \item[\kwd{wherein-only} \var{names}] If specified, this is just + like \kwd{wherein}, but trace produces output only if the + immediate caller of the traced function is one of the functions + listed in \var{names}. + + \item[\kwd{break} \var{form}, \kwd{break-after} \var{form}, + \kwd{break-all} \var{form}] If specified, and \var{form} evaluates + to true, then the debugger is invoked at the start of the + function, at the end of the function, or both, according to the + respective option. + + \item[\kwd{print} \var{form}, \kwd{print-after} \var{form}, + \kwd{print-all} \var{form}] In addition to the usual printout, the + result of evaluating \var{form} is printed at the start of the + function, at the end of the function, or both, according to the + respective option. Multiple print options cause multiple values + to be printed. + + \item[\kwd{function} \var{function-form}] This is a not really an + option, but rather another way of specifying what function to + trace. The \var{function-form} is evaluated immediately, and the + resulting function is traced. + + \item[\kwd{encapsulate \mgroup{:default | t | nil}}] In \cmucl, + tracing can be done either by temporarily redefining the function + name (encapsulation), or using breakpoints. When breakpoints are + used, the function object itself is destructively modified to + cause the tracing action. The advantage of using breakpoints is + that tracing works even when the function is anonymously called + via \code{funcall}. + + When \kwd{encapsulate} is true, tracing is done via encapsulation. + \kwd{default} is the default, and means to use encapsulation for + interpreted functions and funcallable instances, breakpoints + otherwise. When encapsulation is used, forms are {\it not} + evaluated in the function's lexical environment, but + \code{debug:arg} can still be used. + + Note that if you trace using \kwd{encapsulate}, you will + only get a trace or breakpoint at the outermost call to the traced + function, not on recursive calls. + + \end{Lentry} + + In the case of functions where the known return convention is used + to optimize, encapsulation may be necessary in order to make + tracing work at all. The symptom of this occurring is an error + stating + \begin{example} + Error in function \var{foo}: :FUNCTION-END breakpoints are + currently unsupported for the known return convention. + \end{example} + in such cases we recommend using \code{(trace \var{foo} :encapsulate + t)} + + \cpsubindex{tracing}{errors} + \cpsubindex{breakpoints}{errors} + \cpsubindex{errors}{breakpoints} + \cindex{function-end breakpoints} + \cpsubindex{breakpoints}{function-end} + + \kwd{condition}, \kwd{break} and \kwd{print} forms are evaluated in + the lexical environment of the called function; \code{debug:var} and + \code{debug:arg} can be used. The \code{-after} and \code{-all} + forms are evaluated in the null environment. +\end{defmac} + +\begin{defmac}{}{untrace}{ \args{\amprest{} \var{function-names}}} + + This macro turns off tracing for the specified functions, and + removes their names from \code{*traced-function-list*}. If no + \var{function-names} are given, then all currently traced functions + are untraced. +\end{defmac} + +\begin{defvar}{extensions:}{traced-function-list} + + A list of function names maintained and used by \code{trace}, + \code{untrace}, and \code{untrace-all}. This list should contain + the names of all functions currently being traced. +\end{defvar} + +\begin{defvar}{extensions:}{max-trace-indentation} + + The maximum number of spaces which should be used to indent trace + printout. This variable is initially set to 40. +\end{defvar} + +\begin{defvar}{debug:}{trace-encapsulate-package-names} + + A list of package names. Functions from these packages are traced + using encapsulation instead of function-end breakpoints. This list + should at least include those packages containing functions used + directly or indirectly in the implementation of \code{trace}. +\end{defvar} + + +\subsection{Encapsulation Functions} +\cindex{encapsulation} +\cindex{advising} + +The encapsulation functions provide a mechanism for intercepting the +arguments and results of a function. \code{encapsulate} changes the +function definition of a symbol, and saves it so that it can be +restored later. The new definition normally calls the original +definition. The \clisp{} \findexed{fdefinition} function always returns +the original definition, stripping off any encapsulation. + +The original definition of the symbol can be restored at any time by +the \code{unencapsulate} function. \code{encapsulate} and \code{unencapsulate} +allow a symbol to be multiply encapsulated in such a way that different +encapsulations can be completely transparent to each other. + +Each encapsulation has a type which may be an arbitrary lisp object. +If a symbol has several encapsulations of different types, then any +one of them can be removed without affecting more recent ones. +A symbol may have more than one encapsulation of the same type, but +only the most recent one can be undone. + +\begin{defun}{extensions:}{encapsulate}{% + \args{\var{symbol} \var{type} \var{body}}} + + Saves the current definition of \var{symbol}, and replaces it with a + function which returns the result of evaluating the form, + \var{body}. \var{Type} is an arbitrary lisp object which is the + type of encapsulation. + + When the new function is called, the following variables are bound + for the evaluation of \var{body}: + \begin{Lentry} + + \item[\code{extensions:argument-list}] A list of the arguments to + the function. + + \item[\code{extensions:basic-definition}] The unencapsulated + definition of the function. + \end{Lentry} + The unencapsulated definition may be called with the original + arguments by including the form + \begin{lisp} + (apply extensions:basic-definition extensions:argument-list) + \end{lisp} + + \code{encapsulate} always returns \var{symbol}. +\end{defun} + +\begin{defun}{extensions:}{unencapsulate}{\args{\var{symbol} \var{type}}} + + Undoes \var{symbol}'s most recent encapsulation of type \var{type}. + \var{Type} is compared with \code{eq}. Encapsulations of other + types are left in place. +\end{defun} + +\begin{defun}{extensions:}{encapsulated-p}{% + \args{\var{symbol} \var{type}}} + + Returns \true{} if \var{symbol} has an encapsulation of type + \var{type}. Returns \nil{} otherwise. \var{type} is compared with + \code{eq}. +\end{defun} + +\subsection{Tracing Examples} + Here is an example of tracing with some of the possible options. + For simplicity, this is the function: + \begin{example} + (defun fact (n) + (declare (double-float n) (optimize speed)) + (if (zerop n) + 1d0 + (* n (fact (1- n))))) + (compile 'fact) + \end{example} + + This example shows how to use the :condition option: + \begin{example} + (trace fact :condition (= 4d0 (debug:arg 0))) + (fact 10d0) -> + 0: (FACT 4.0d0) + 0: FACT returned 24.0d0 + 3628800.0d0 + \end{example} + As we can see, we produced output when the condition was satisfied. + + Here's another example: + \begin{example} + (untrace) + (trace fact :break (= 4d0 (debug:arg 0))) + (fact 10d0) -> + 0: (FACT 5.0d0) + 1: (FACT 4.0d0) + + + Breaking before traced call to FACT: + [Condition of type SIMPLE-CONDITION] + + Restarts: + 0: [CONTINUE] Return from BREAK. + 1: [ABORT ] Return to Top-Level. + + Debug (type H for help) + \end{example} + In this example, we see that normal tracing occurs until we the + argument reaches 4d0, at which point, we break into the debugger. + + +% section{The Single Stepper} +% +% \begin{defmac}{}{step}{ \args{\var{form}}} +% +% Evaluates form with single stepping enabled or if \var{form} is +% \code{T}, enables stepping until explicitly disabled. Stepping can +% be disabled by quitting to the lisp top level, or by evaluating the +% form \w{\code{(step ())}}. +% +% While stepping is enabled, every call to eval will prompt the user +% for a single character command. The prompt is the form which is +% about to be \code{eval}ed. It is printed with \code{*print-level*} +% and \code{*print-length*} bound to \code{*step-print-level*} and +% \code{*step-print-length*}. All interaction is done through the +% stream \code{*query-io*}. Because of this, the stepper can not be +% used in Hemlock eval mode. When connected to a slave Lisp, the +% stepper can be used from Hemlock. +% +% The commands are: +% \begin{Lentry} +% +% \item[\key{n} (next)] Evaluate the expression with stepping still +% enabled. +% +% \item[\key{s} (skip)] Evaluate the expression with stepping +% disabled. +% +% \item[\key{q} (quit)] Evaluate the expression, but disable all +% further stepping inside the current call to \code{step}. +% +% \item[\key{p} (print)] Print current form. (does not use +% \code{*step-print-level*} or \code{*step-print-length*}.) +% +% \item[\key{b} (break)] Enter break loop, and then prompt for the +% command again when the break loop returns. +% +% \item[\key{e} (eval)] Prompt for and evaluate an arbitrary +% expression. The expression is evaluated with stepping disabled. +% +% \item[\key{?} (help)] Prints a brief list of the commands. +% +% \item[\key{r} (return)] Prompt for an arbitrary value to return as +% result of the current call to eval. +% +% \item[\key{g}] Throw to top level. +% \end{Lentry} +% \end{defmac} +% +% \begin{defvar}{extensions:}{step-print-level} +% \defvarx[extensions:]{step-print-length} +% +% \code{*print-level*} and \code{*print-length*} are bound to these +% values while printing the current form. \code{*step-print-level*} +% and \code{*step-print-length*} are initially bound to 4 and 5, +% respectively. +% \end{defvar} +% +% \begin{defvar}{extensions:}{max-step-indentation} +% +% Step indents the prompts to highlight the nesting of the evaluation. +% This variable contains the maximum number of spaces to use for +% indenting. Initially set to 40. +% \end{defvar} + + +\section{Specials} +These are the special variables that control the debugger action. + +\begin{defvar}{debug:}{debug-print-level} + \defvarx[debug:]{debug-print-length} + + \code{*print-level*} and \code{*print-length*} are bound to these + values during the execution of some debug commands. When evaluating + arbitrary expressions in the debugger, the normal values of + \code{*print-level*} and \code{*print-length*} are in effect. These + variables are initially set to 3 and 5, respectively. +\end{defvar} diff --git a/doc/cmu-user/extensions.tex b/doc/cmu-user/extensions.tex new file mode 100644 index 0000000000..3521a13342 --- /dev/null +++ b/doc/cmu-user/extensions.tex @@ -0,0 +1,3077 @@ +\chapter{Design Choices and Extensions} + +Several design choices in \clisp{} are left to the individual +implementation, and some essential parts of the programming environment +are left undefined. This chapter discusses the most important design +choices and extensions. + +\section{Data Types} + +\subsection{Integers} + +The \tindexed{fixnum} type is equivalent to \code{(signed-byte 30)}. +Integers outside this range are represented as a \tindexed{bignum} or +a word integer (\pxlref{word-integers}.) Almost all integers that +appear in programs can be represented as a \code{fixnum}, so integer +number consing is rare. + + +\subsection{Floats} +\label{ieee-float} + +\cmucl{} supports three floating point formats: +\tindexed{single-float}, \tindexed{double-float} and +\tindexed{double-double-float}. The first two are implemented with +IEEE single and double float arithmetic, respectively. The last is an +extension; \pxlref{extended-float} for more information. +\code{short-float} is a synonym for \code{single-float}, and +\code{long-float} is a synonym for \code{double-float}. The initial +value of \vindexed{read-default-float-format} is \code{single-float}. + +Both \code{single-float} and \code{double-float} are represented with +a pointer descriptor, so float operations can cause number consing. +Number consing is greatly reduced if programs are written to allow the +use of non-descriptor representations (\pxlref{numeric-types}.) + + +\subsubsection{IEEE Special Values} + +\cmucl{} supports the IEEE infinity and NaN special values. These +non-numeric values will only be generated when trapping is disabled +for some floating point exception (\pxlref{float-traps}), so users of +the default configuration need not concern themselves with special +values. + +\begin{defconst}{extensions:}{short-float-positive-infinity} + \defconstx[extensions:]{short-float-negative-infinity} + \defconstx[extensions:]{single-float-positive-infinity} + \defconstx[extensions:]{single-float-negative-infinity} + \defconstx[extensions:]{double-float-positive-infinity} + \defconstx[extensions:]{double-float-negative-infinity} + \defconstx[extensions:]{long-float-positive-infinity} + \defconstx[extensions:]{long-float-negative-infinity} + + The values of these constants are the IEEE positive and negative + infinity objects for each float format. +\end{defconst} + +\begin{defun}{extensions:}{float-infinity-p}{\args{\var{x}}} + + This function returns true if \var{x} is an IEEE float infinity (of + either sign.) \var{x} must be a float. +\end{defun} + +\begin{defun}{extensions:}{float-nan-p}{\args{\var{x}}} + \defunx[extensions:]{float-signaling-nan-p}{\args{\var{x}}} + \defunx[extensions:]{float-trapping-nan-p}{\args{\var{x}}} + + \code{float-nan-p} returns true if \var{x} is an IEEE NaN (Not A + Number) object. \code{float-signaling-nan-p} returns true only if + \var{x} is a trapping NaN. With either function, \var{x} must be a + float. \code{float-trapping-nan-p} is the former name of + \code{float-signaling-nan-p} and is deprecated. +\end{defun} + +\subsubsection{Negative Zero} + +The IEEE float format provides for distinct positive and negative +zeros. To test the sign on zero (or any other float), use the +\clisp{} \findexed{float-sign} function. Negative zero prints as +\code{-0.0f0} or \code{-0.0d0}. + +\subsubsection{Denormalized Floats} + +\cmucl{} supports IEEE denormalized floats. Denormalized floats +provide a mechanism for gradual underflow. The \clisp{} +\findexed{float-precision} function returns the actual precision of a +denormalized float, which will be less than \findexed{float-digits}. +Note that in order to generate (or even print) denormalized floats, +trapping must be disabled for the underflow exception +(\pxlref{float-traps}.) The \clisp{} +\w{\code{least-positive-}\var{format}-\code{float}} constants are +denormalized. + +\begin{defun}{extensions:}{float-denormalized-p}{\args{\var{x}}} + + This function returns true if \var{x} is a denormalized float. + \var{x} must be a float. +\end{defun} + + +\subsubsection{Floating Point Exceptions} +\label{float-traps} + +The IEEE floating point standard defines several exceptions that occur +when the result of a floating point operation is unclear or +undesirable. Exceptions can be ignored, in which case some default +action is taken, such as returning a special value. When trapping is +enabled for an exception, a error is signalled whenever that exception +occurs. These are the possible floating point exceptions: +\begin{Lentry} + +\item[\kwd{underflow}] This exception occurs when the result of an + operation is too small to be represented as a normalized float in + its format. If trapping is enabled, the + \tindexed{floating-point-underflow} condition is signalled. + Otherwise, the operation results in a denormalized float or zero. + +\item[\kwd{overflow}] This exception occurs when the result of an + operation is too large to be represented as a float in its format. + If trapping is enabled, the \tindexed{floating-point-overflow} + exception is signalled. Otherwise, the operation results in the + appropriate infinity. + +\item[\kwd{inexact}] This exception occurs when the result of a + floating point operation is not exact, i.e. the result was rounded. + If trapping is enabled, the \code{extensions:floating-point-inexact} + condition is signalled. Otherwise, the rounded result is returned. + +\item[\kwd{invalid}] This exception occurs when the result of an + operation is ill-defined, such as \code{\w{(/ 0.0 0.0)}}. If + trapping is enabled, the \code{extensions:floating-point-invalid} + condition is signalled. Otherwise, a quiet NaN is returned. + +\item[\kwd{divide-by-zero}] This exception occurs when a float is + divided by zero. If trapping is enabled, the + \tindexed{divide-by-zero} condition is signalled. Otherwise, the + appropriate infinity is returned. +\end{Lentry} + +\subsubsection{Floating Point Rounding Mode} +\label{float-rounding-modes} + +IEEE floating point specifies four possible rounding modes: +\begin{Lentry} + +\item[\kwd{nearest}] In this mode, the inexact results are rounded to + the nearer of the two possible result values. If the neither + possibility is nearer, then the even alternative is chosen. This + form of rounding is also called ``round to even'', and is the form + of rounding specified for the \clisp{} \findexed{round} function. + +\item[\kwd{positive-infinity}] This mode rounds inexact results to the + possible value closer to positive infinity. This is analogous to + the \clisp{} \findexed{ceiling} function. + +\item[\kwd{negative-infinity}] This mode rounds inexact results to the + possible value closer to negative infinity. This is analogous to + the \clisp{} \findexed{floor} function. + +\item[\kwd{zero}] This mode rounds inexact results to the possible + value closer to zero. This is analogous to the \clisp{} + \findexed{truncate} function. +\end{Lentry} + +Warning: Although the rounding mode can be changed with +\code{set-floating-point-modes}, use of any value other than the +default (\kwd{nearest}) can cause unusual behavior, since it will +affect rounding done by \llisp{} system code as well as rounding in +user code. In particular, the unary \code{round} function will stop +doing round-to-nearest on floats, and instead do the selected form of +rounding. + +%% \subsubsection{Precision Control} +%% \label{precision-control} +%% +%% The floating-point unit for the Intel IA-32 architecture supports a +%% precision control mechanism. The floating-point unit consists of an +%% IEEE extended double-float unit and all operations are always done +%% using his format, and this includes rounding. However, by setting the +%% precision control mode, the user can control how rounding is done for +%% each basic arithmetic operation like addition, subtraction, +%% multiplication, and division. The extra instructions for +%% trigonometric, exponential, and logarithmic operations are not +%% affected. We refer the reader to Intel documentation for more +%% information. +%% +%% The possible modes are: +%% \begin{Lentry} +%% +%% \item[\kwd{24-bit}] In this mode, all basic arithmetic operations like +%% addition, subtraction, multiplication, and division, are rounded +%% after each operation as if both the operands were IEEE single +%% precision numbers. +%% +%% \item[\kwd{53-bit}] In this mode, rounding is performed as if the +%% operands and results were IEEE double precision numbers. +%% +%% \item[\kwd{64-bit}] In this mode, the default, rounding is performed +%% on the full IEEE extended double precision format. +%% +%% \end{Lentry} +%% +%% \subsubsection{Warning:} +%% +%% Although the precision mode can be changed with +%% \code{set-floating-point-modes}, use of anything other than +%% \kwd{64-bit} or \kwd{53-bit} can cause unexpected results, especially +%% if external functions or libraries are called. A setting of +%% \kwd{64-bit} also causes \code{(= 1d0 (+ 1d0 double-float-epsilon))} +%% to return \true{} instead of \false. +%% +%% +\subsubsection{Accessing the Floating Point Modes} + +These functions can be used to modify or read the floating point modes: + +\begin{defun}{extensions:}{set-floating-point-modes}{% + \keys{\kwd{traps} \kwd{rounding-mode}} + \morekeys{\kwd{fast-mode} \kwd{accrued-exceptions}} + \yetmorekeys{\kwd{current-exceptions}}} + \defunx[extensions:]{get-floating-point-modes}{} + + The keyword arguments to \code{set-floating-point-modes} set various + modes controlling how floating point arithmetic is done: + \begin{Lentry} + + \item[\kwd{traps}] A list of the exception conditions that should + cause traps. Possible exceptions are \kwd{underflow}, + \kwd{overflow}, \kwd{inexact}, \kwd{invalid} and + \kwd{divide-by-zero}. Initially all traps except \kwd{inexact} + are enabled. \xlref{float-traps}. + + \item[\kwd{rounding-mode}] The rounding mode to use when the result + is not exact. Possible values are \kwd{nearest}, + \kwd{positive-infinity}, \kwd{negative-infinity} and \kwd{zero}. + Initially, the rounding mode is \kwd{nearest}. See the warning in + section \ref{float-rounding-modes} about use of other rounding + modes. + + \item[\kwd{current-exceptions}, \kwd{accrued-exceptions}] Lists of + exception keywords used to set the exception flags. The + \var{current-exceptions} are the exceptions for the previous + operation, so setting it is not very useful. The + \var{accrued-exceptions} are a cumulative record of the exceptions + that occurred since the last time these flags were cleared. + Specifying \code{()} will clear any accrued exceptions. + + \item[\kwd{fast-mode}] Set the hardware's ``fast mode'' flag, if + any. When set, IEEE conformance or debuggability may be impaired. + Some machines may not have this feature, in which case the value + is always \false. Sparc platforms support a fast mode where + denormal numbers are silently truncated to zero. + \end{Lentry} + If a keyword argument is not supplied, then the associated state is + not changed. + + \code{get-floating-point-modes} returns a list representing the + state of the floating point modes. The list is in the same format + as the keyword arguments to \code{set-floating-point-modes}, so + \code{apply} could be used with \code{set-floating-point-modes} to + restore the modes in effect at the time of the call to + \code{get-floating-point-modes}. +\end{defun} + +To make handling control of floating-point exceptions, the following +macro is useful. + +\begin{defmac}{ext:}{with-float-traps-masked}{\var{traps} \ampbody\ \var{body}} + \code{body} is executed with the selected floating-point exceptions + given by \code{traps} masked out (disabled). \code{traps} should be + a list of possible floating-point exceptions that should be ignored. + Possible values are \kwd{underflow}, \kwd{overflow}, \kwd{inexact}, + \kwd{invalid} and \kwd{divide-by-zero}. + + This is equivalent to saving the current traps from + \code{get-floating-point-modes}, setting the floating-point modes to + the desired exceptions, running the \code{body}, and restoring the + saved floating-point modes. The advantage of this macro is that it + causes less consing to occur. + + Some points about the with-float-traps-masked: + + \begin{itemize} + \item Two approaches are available for detecting FP exceptions: + \begin{enumerate} + \item enabling the traps and handling the exceptions + \item disabling the traps and either handling the return values or + checking the accrued exceptions. + \end{enumerate} + Of these the latter is the most portable because on the alpha port + it is not possible to enable some traps at run-time. + + \item To assist the checking of the exceptions within the body any + accrued exceptions matching the given traps are cleared at the + start of the body when the traps are masked. + + \item To allow the macros to be nested these accrued exceptions are + restored at the end of the body to their values at the start of + the body. Thus any exceptions that occurred within the body will + not affect the accrued exceptions outside the macro. + + \item Note that only the given exceptions are restored at the end of + the body so other exception will be visible in the accrued + exceptions outside the body. + + \item On the x86, setting the accrued exceptions of an unmasked + exception would cause a FP trap. The macro behaviour of restoring + the accrued exceptions ensures than if an accrued exception is + initially not flagged and occurs within the body it will be + restored/cleared at the exit of the body and thus not cause a + trap. + + \item On the x86, and, perhaps, the hppa, the FP exceptions may be + delivered at the next FP instruction which requires a FP + \code{wait} instruction (\code{x86::float-wait}) if using the lisp + conditions to catch trap within a \code{handler-bind}. The + \code{handler-bind} macro does the right thing and inserts a + float-wait (at the end of its body on the x86). The masking and + noting of exceptions is also safe here. + + \item The setting of the FP flags uses the + \code{(floating-point-modes)} and the \code{(set + (floating-point-modes)\ldots)} VOPs. These VOPs blindly update + the flags which may include other state. We assume this state + hasn't changed in between getting and setting the state. For + example, if you used the FP unit between the above calls, the + state may be incorrectly restored! The + \code{with-float-traps-masked} macro keeps the intervening code to + a minimum and uses only integer operations. + %% Safe byte-compiled? + %% Perhaps the VOPs (x86) should be smarter and only update some of + %% the flags, the trap masks and exceptions? + \end{itemize} + +\end{defmac} + +\subsection{Extended Floats} +\label{extended-float} + +\cmucl{} also has an extension to support \code{double-double-float} +type. This float format provides extended precision of about 31 +decimal digits, with the same exponent range as \code{double-float}. +It is completely integrated into \cmucl{}, and can be used just like +any other floating-point object, including arrays, complex +\code{double-double-float}'s, and special functions. With appropriate +declarations, no boxing is needed, just like \code{single-float} and +\code{double-float}. + +The exponent marker for a double-double float number is ``W'', so +``1.234w0'' is a double-double float number. + + +Note that there are a few shortcomings with +\code{double-double-float}'s: +\begin{itemize} + \item There are no equivalents to \code{most-positive-double-float}, + \code{double-float-positive-infinity}, \textit{etc}. This is because + these are not really well defined for \code{double-double-float}'s. + \item Underflow and overflow may be prematurely signaled. This is + due to how \code{double-double-float}'s are implemented. + \item Basic arithmetic operations are inlined, so the code size is + fairly large. + \item \code{double-double-float} arithmetic is quite a bit slower + than \code{double-float} since there is no hardware support for + this type. + \item The constant \code{pi} is still a \code{double-float} instead + of a \code{double-double-float}. Use \code{ext:dd-pi} if you + want a \code{double-double-float} value for $\pi$. +\end{itemize} + +\begin{deftp}{float}{extensions:double-double-float}{} + The \code{double-double-float} type. It is in the \code{EXTENSIONS} + package. +\end{deftp} + +\begin{defconst}{extensions:}{dd-pi} + A \code{double-double-float} approximation to $\pi$. +\end{defconst} + +\subsection{Characters} + +\cmucl{} implements characters according to \cltltwo{}. The +main difference from the first version is that character bits and font +have been eliminated, and the names of the types have been changed. +\tindexed{base-character} is the new equivalent of the old +\tindexed{string-char}. In this implementation, all characters are +base characters (there are no extended characters.) Character codes +range between \code{0} and \code{255}, using the ASCII encoding. +Table~\ref{tbl:chars}~\vpageref{tbl:chars} shows characters recognized +by \cmucl. + +\begin{table}[tbhp] + \begin{center} + \begin{tabular}{|c|c|l|l|l|l|} + \hline + \multicolumn{2}{|c|}{ASCII} & \multicolumn{1}{|c}{Lisp} & + \multicolumn{3}{|c|}{} \\ + \cline{1-2} + Name & Code & \multicolumn{1}{|c|}{Name} & \multicolumn{3}{|c|}{\raisebox{1.5ex}{Alternatives}}\\ + \hline + \hline + \code{nul} & 0 & \code{\#\back{NULL}} & \code{\#\back{NUL}} & &\\ + \code{bel} & 7 & \code{\#\back{BELL}} & & &\\ + \code{bs} & 8 & \code{\#\back{BACKSPACE}} & \code{\#\back{BS}} & &\\ + \code{tab} & 9 & \code{\#\back{TAB}} & & &\\ + \code{lf} & 10 & \code{\#\back{NEWLINE}} & \code{\#\back{NL}} & \code{\#\back{LINEFEED}} & \code{\#\back{LF}}\\ + \code{ff} & 11 & \code{\#\back{VT}} & \code{\#\back{PAGE}} & \code{\#\back{FORM}} &\\ + \code{cr} & 13 & \code{\#\back{RETURN}} & \code{\#\back{CR}} & &\\ + \code{esc} & 27 & \code{\#\back{ESCAPE}} & \code{\#\back{ESC}} & \code{\#\back{ALTMODE}} & \code{\#\back{ALT}}\\ + \code{sp} & 32 & \code{\#\back{SPACE}} & \code{\#\back{SP}} & &\\ + \code{del} & 127 & \code{\#\back{DELETE}} & \code{\#\back{RUBOUT}} & &\\ + \hline + \end{tabular} + \caption{Characters recognized by \cmucl} + \label{tbl:chars} + \end{center} +\end{table} + + +\subsection{Array Initialization} + +If no \kwd{initial-value} is specified, arrays are initialized to zero. + + +\subsection{Hash tables} + +The \tindexed{hash-tables} defined by \clisp{} have limited utility because they +are limited to testing their keys using the equality predicates +provided by (pre-CLOS) \clisp{}. \cmucl{} overcomes this limitation +by allowing its users to specify new hash table tests and hashing +methods. The hashing method must also be specified, since the +compiler is unable to determine a good hashing function for an +arbitrary equality (equivalence) predicate. + +\begin{defun}{extensions:}{define-hash-table-test}% + {\args{\var{hash-table-test-name} \var{test-function} \var{hash-function}}} + + The \var{hash-table-test-name} must be a symbol. + % I just assumed the above. [2002/10/10:rpg] + The \var{test-function} takes two objects and returns true + iff they are the same. The \var{hash-function} takes one object and + returns two values: the (positive fixnum) hash value and true if + the hashing depends on pointer values and will have to be redone + if the object moves. + + To create a hash-table using this new ``test'' (really, a + test/hash-function pair), use + \code{(\index[funs]{make-hash-table}make-hash-table :test + \var{hash-table-test-name} \ldots)}. + + Note that it is the \var{hash-table-test-name} that will be + returned by the function \findexed{hash-table-test}, when applied to + a hash-table created using this function. + + This function updates \vindexed{hash-table-tests}, which is now + internal. +\end{defun} + +\cmucl{} also supports a number of weak hash tables. These weak +tables are created using the \kwd{weak-p} argument to +\code{make-hash-table}. Normally, a reference to an object as either +the key or value of the hash-table will prevent that object from being +garbage-collected. However, in a weak table, if the only reference is +the hash-table, the object can be collected. + +The possible values for \kwd{weak-p} are listed below. An entry in +the table remains if the condition holds +\begin{Lentry} +\item[\kwd{key}] The key is referenced elsewhere +\item[\kwd{value}] The value is referenced elsewhere +\item[\kwd{key-and-value}] Both the key and value are referenced elsewhere +\item[\kwd{key-or-value}] Either the key or value are referenced elsewhere +\item[T] For backward compatibility, this means the same as \kwd{key}. +\end{Lentry} +If the condition does not hold, the object can be removed from the +hash table. + +Weak hash tables can only be created if the test is \code{eq} or +\code{eql}. An error is signaled if this is not the case. + +\begin{defun}{}{make-hash-table}% + {\args{\keys{\kwd{test} \kwd{size} \kwd{rehash-size} \kwd{rehash-threshold} \kwd{weak-p}}}} + Creates a hash-table with the specified properties. +\end{defun} +\section{Default Interrupts for Lisp} + +\cmucl{} has several interrupt handlers defined when it starts up, +as follows: +\begin{Lentry} + +\item[\code{SIGINT} (\ctrl{c})] causes Lisp to enter a break loop. + This puts you into the debugger which allows you to look at the + current state of the computation. If you proceed from the break + loop, the computation will proceed from where it was interrupted. + +\item[\code{SIGQUIT} (\ctrl{L})] causes Lisp to do a throw to the + top-level. This causes the current computation to be aborted, and + control returned to the top-level read-eval-print loop. + +\item[\code{SIGTSTP} (\ctrl{z})] causes Lisp to suspend execution and + return to the Unix shell. If control is returned to Lisp, the + computation will proceed from where it was interrupted. + +\item[\code{SIGILL}, \code{SIGBUS}, \code{SIGSEGV}, and \code{SIGFPE}] + cause Lisp to signal an error. +\end{Lentry} +For keyboard interrupt signals, the standard interrupt character is in +parentheses. Your \file{.login} may set up different interrupt +characters. When a signal is generated, there may be some delay before +it is processed since Lisp cannot be interrupted safely in an arbitrary +place. The computation will continue until a safe point is reached and +then the interrupt will be processed. \xlref{signal-handlers} to define +your own signal handlers. + + +\section{Implementation-Specific Packages} + +When \cmucl{} is first started up, the default package is the +\code{common-lisp-user} package. The \code{common-lisp-user} package +uses the \code{common-lisp} and \code{extensions} packages. The +symbols exported from these three packages can be referenced without +package qualifiers. This section describes packages which have +exported interfaces that may concern users. The numerous internal +packages which implement parts of the system are not described here. +Package nicknames are in parenthesis after the full name. + +\begin{Lentry} +\item[\code{alien}, \code{c-call}] Export the features of the Alien + foreign data structure facility (\pxlref{aliens}.) + +\item[\code{pcl}] This package contains PCL (Portable CommonLoops), + which is a portable implementation of CLOS (the Common Lisp Object + System.) This implements most (but not all) of the features in the + CLOS chapter of \cltltwo{}. + +\item[\code{clos-mop (mop)}] This package contains an implementation + of the CLOS Metaobject Protocol, as per the book \textit{The Art of + the Metaobject Protocol}. + +\item[\code{debug}] The \code{debug} package contains the command-line + oriented debugger. It exports utility various functions and + switches. + +\item[\code{debug-internals}] The \code{debug-internals} package + exports the primitives used to write debuggers. + \xlref{debug-internals}. + +\item[\code{extensions (ext)}] The \code{extensions} packages exports + local extensions to \clisp{} that are documented in this manual. + Examples include the \code{save-lisp} function and time parsing. + +\item[\code{hemlock (ed)}] The \code{hemlock} package contains all the + code to implement Hemlock commands. The \code{hemlock} package + currently exports no symbols. + +\item[\code{hemlock-internals (hi)}] The \code{hemlock-internals} + package contains code that implements low level primitives and + exports those symbols used to write Hemlock commands. + +\item[\code{keyword}] The \code{keyword} package contains keywords + (e.g., \kwd{start}). All symbols in the \code{keyword} package are + exported and evaluate to themselves (i.e., the value of the symbol + is the symbol itself). + +\item[\code{profile}] The \code{profile} package exports a simple + run-time profiling facility (\pxlref{profiling}). + +\item[\code{common-lisp (cl)}] The \code{common-lisp} package + exports all the symbols defined by \cltl{} and only those symbols. + Strictly portable Lisp code will depend only on the symbols exported + from the \code{common-lisp} package. + +\item[\code{unix}] This package exports system call + interfaces to Unix (\pxlref{unix-interface}). + +\item[\code{system (sys)}] The \code{system} package contains + functions and information necessary for system interfacing. This + package is used by the \code{lisp} package and exports several + symbols that are necessary to interface to system code. + +\item[\code{xlib}] The \code{xlib} package contains the Common Lisp X + interface (CLX) to the X11 protocol. This is mostly Lisp code with + a couple of functions that are defined in C to connect to the + server. + +\item[\code{wire}] The \code{wire} package exports a remote procedure + call facility (\pxlref{remote}). + +\item[\code{stream}] The \code{stream} package exports the public + interface to the simple-streams implementation (\pxlref{simple-streams}). + +\item[\code{xref}] The \code{xref} package exports the public + interface to the cross-referencing utility (\pxlref{xref}). + +\end{Lentry} + + +\input{hierarchical-packages} + +\input{package-locks} + + + +\section{The Editor} + +The \code{ed} function invokes the Hemlock editor which is described +in {\it Hemlock User's Manual} and {\it Hemlock Command Implementor's +Manual}. Most users at CMU prefer to use Hemlock's slave \llisp{} +mechanism which provides an interactive buffer for the +\code{read-eval-print} loop and editor commands for evaluating and +compiling text from a buffer into the slave \llisp. Since the editor +runs in the \llisp, using slaves keeps users from trashing their +editor by developing in the same \llisp{} with \hemlock{}. + + +\section{Garbage Collection} + +\cmucl{} uses either a stop-and-copy garbage collector or a +generational, mostly copying garbage collector. Which collector is +available depends on the platform and the features of the platform. +The stop-and-copy GC is available on all RISC platforms. The x86 +platform supports a conservative stop-and-copy collector, which is now +rarely used, and a generational conservative collector. On the Sparc +platform, both the stop-and-copy GC and the generational GC are +available, but the stop-and-copy GC is deprecated in favor of the +generational GC. + +The generational GC is available if \var{*features*} contains +\code{:gencgc}. + +%% The stop-and-copy GC compacts the items in dynamic space every time it +%% runs. Most users cause the system to garbage collect (GC) frequently, +%% long before space is exhausted. With 16 or 24 megabytes of memory, +%% causing GC's more frequently on less garbage allows the system to GC +%% without much (if any) paging. + +The following functions invoke the garbage collector or control whether +automatic garbage collection is in effect: + +\begin{defun}[-cheney]{extensions:}{gc}{\args{\ampoptional{} \var{verbose-p}}} + + This function runs the garbage collector. If + \code{ext:*gc-verbose*} is non-\nil, then it invokes + \code{ext:*gc-notify-before*} before GC'ing and + \code{ext:*gc-notify-after*} afterwards. + + \code{verbose-p} indicates whether GC statistics are printed or + not. + +\end{defun} + +\begin{defun}{extensions:}{gc-off}{} + + This function inhibits automatic garbage collection. After calling + it, the system will not GC unless you call \code{ext:gc} or + \code{ext:gc-on}. +\end{defun} + +\begin{defun}{extensions:}{gc-on}{} + + This function reinstates automatic garbage collection. If the + system would have GC'ed while automatic GC was inhibited, then this + will call \code{ext:gc}. +\end{defun} + +\subsection{GC Parameters} + +The following variables control the behavior of the garbage collector: + +\begin{defvar}{extensions:}{bytes-consed-between-gcs} + + \cmucl{} automatically GC's whenever the amount of memory + allocated to dynamic objects exceeds the value of an internal + variable. After each GC, the system sets this internal variable to + the amount of dynamic space in use at that point plus the value of + the variable \code{ext:*bytes-consed-between-gcs*}. The default + value is 2000000. +\end{defvar} + +\begin{defvar}{extensions:}{gc-verbose} + + This variable controls whether \code{ext:gc} invokes the functions + in \code{ext:*gc-notify-before*} and + \code{ext:*gc-notify-after*}. If \code{*gc-verbose*} is \nil, + \code{ext:gc} foregoes printing any messages. The default value is + \code{T}. +\end{defvar} + +\begin{defvar}{extensions:}{gc-notify-before} + + This variable's value is a function that should notify the user that + the system is about to GC. It takes one argument, the amount of + dynamic space in use before the GC measured in bytes. The default + value of this variable is a function that prints a message similar + to the following: +\begin{verbatim} + [GC threshold exceeded with 2,107,124 bytes in use. Commencing GC.] +\end{verbatim} +\end{defvar} + +\begin{defvar}{extensions:}{gc-notify-after} + + This variable's value is a function that should notify the user when + a GC finishes. The function must take three arguments, the amount + of dynamic spaced retained by the GC, the amount of dynamic space + freed, and the new threshold which is the minimum amount of space in + use before the next GC will occur. All values are byte quantities. + The default value of this variable is a function that prints a + message similar to the following: + \begin{verbatim} + [GC completed with 25,680 bytes retained and 2,096,808 bytes freed.] + [GC will next occur when at least 2,025,680 bytes are in use.] + \end{verbatim} +\end{defvar} + +Note that a garbage collection will not happen at exactly the new +threshold printed by the default \code{ext:*gc-notify-after*} +function. The system periodically checks whether this threshold has +been exceeded, and only then does a garbage collection. + +\begin{defvar}{extensions:}{gc-inhibit-hook} + + This variable's value is either a function of one argument or \nil. + When the system has triggered an automatic GC, if this variable is a + function, then the system calls the function with the amount of + dynamic space currently in use (measured in bytes). If the function + returns \nil, then the GC occurs; otherwise, the system inhibits + automatic GC as if you had called \code{ext:gc-off}. The writer of + this hook is responsible for knowing when automatic GC has been + turned off and for calling or providing a way to call + \code{ext:gc-on}. The default value of this variable is \nil. +\end{defvar} + +\begin{defvar}{extensions:}{before-gc-hooks} + \defvarx[extensions:]{after-gc-hooks} + + These variables' values are lists of functions to call before or + after any GC occurs. The system provides these purely for + side-effect, and the functions take no arguments. +\end{defvar} + +\subsection{Generational GC} +Generational GC also supports some additional functions and variables +to control it. + +\begin{defun}[-gencgc]{extensions:}{gc}{\args{\keys{\kwd{verbose} \kwd{gen} \kwd{full}}}} + + This function runs the garbage collector. If + \code{ext:*gc-verbose*} is non-\nil, then it invokes + \code{ext:*gc-notify-before*} before GC'ing and + \code{ext:*gc-notify-after*} afterwards. + + \begin{Lentry} + \item[\code{verbose}] Print GC statistics if non-\code{NIL}. + \item[\code{gen}] The number of generations to be collected. + \item[\code{full}] If non-\code{NIL}, a full collection of all + generations is performed. + \end{Lentry} +\end{defun} + +\begin{defun}{lisp::}{gencgc-stats}{\args{\var{generation}}} + Returns statistics about the generation, as multiple values: + \begin{enumerate} + \item Bytes allocated in this generation + \item The GC trigger for this generation. When this many bytes have + been allocated, a GC is started automatically. + \item The number of bytes consed between GCs. + \item The number of GCs that have been done on this generation. + This is reset to zero when the generation is raised. + \item The trigger age, which is the maximum number of GCs to perform + before this generation is raised. + \item The total number of bytes allocated to this generation. + \item Average age of the objects in this generations. The average + age is the cumulative bytes allocated divided by current number of + bytes allocated. + \end{enumerate} +\end{defun} + +\begin{defun}{lisp::}{set-gc-trigger}{\args{\var{gen} \var{trigger}}} + Sets the GC trigger value for the specified generation. +\end{defun} + +\begin{defun}{lisp::}{set-trigger-age}{\args{\var{gen} \var{trigger-age}}} + Sets the GC trigger age for the specified generation. +\end{defun} + +\begin{defun}{lisp::}{set-min-mem-age}{\args{\var{gen} \var{min-mem-age}}} + Sets the minimum average memory age for the specified generation. + If the computed memory age is below this, GC is not performed, which + helps prevent a GC when a large number of new live objects have been + added in which case a GC would usually be a waste of time. +\end{defun} + +\subsection{Weak Pointers} + +A weak pointer provides a way to maintain a reference to an object +without preventing an object from being garbage collected. If the +garbage collector discovers that the only pointers to an object are +weak pointers, then it breaks the weak pointers and deallocates the +object. + +\begin{defun}{extensions:}{make-weak-pointer}{\args{\var{object}}} + \defunx[extensions:]{weak-pointer-value}{\args{\var{weak-pointer}}} + + \code{make-weak-pointer} returns a weak pointer to an object. + \code{weak-pointer-value} follows a weak pointer, returning the two + values: the object pointed to (or \false{} if broken) and a boolean + value which is \false{} if the pointer has been broken, and true + otherwise. +\end{defun} + + +\subsection{Finalization} + +Finalization provides a ``hook'' that is triggered when the garbage +collector reclaims an object. It is usually used to recover non-Lisp +resources that were allocated to implement the finalized Lisp object. +For example, when a unix file-descriptor stream is collected, +finalization is used to close the underlying file descriptor. + +\begin{defun}{extensions:}{finalize}{\args{\var{object} \var{function}}} + + This function registers \var{object} for finalization. + \var{function} is called with no arguments when \var{object} is + reclaimed. Normally \var{function} will be a closure over the + underlying state that needs to be freed, e.g. the unix file + descriptor in the fd-stream case. Note that \var{function} must not + close over \var{object} itself, as this prevents the object from + ever becoming garbage. +\end{defun} + +\begin{defun}{extensions:}{cancel-finalization}{\args{\var{object}}} + + This function cancel any finalization request for \var{object}. +\end{defun} + + +\section{Describe} + +\begin{defun}{}{describe}{ \args{\var{object} \ampoptional{} \var{stream}}} + + The \code{describe} function prints useful information about + \var{object} on \var{stream}, which defaults to + \code{*standard-output*}. For any object, \code{describe} will + print out the type. Then it prints other information based on the + type of \var{object}. The types which are presently handled are: + + \begin{Lentry} + + \item[\tindexed{hash-table}] \code{describe} prints the number of + entries currently in the hash table and the number of buckets + currently allocated. + + \item[\tindexed{function}] \code{describe} prints a list of the + function's name (if any) and its formal parameters. If the name + has function documentation, then it will be printed. If the + function is compiled, then the file where it is defined will be + printed as well. + + \item[\tindexed{fixnum}] \code{describe} prints whether the integer + is prime or not. + + \item[\tindexed{symbol}] The symbol's value, properties, and + documentation are printed. If the symbol has a function + definition, then the function is described. + \end{Lentry} + If there is anything interesting to be said about some component of + the object, describe will invoke itself recursively to describe that + object. The level of recursion is indicated by indenting output. +\end{defun} + +A number of switches can be used to control \code{describe}'s behavior. + +\begin{defvar}{extensions:}{describe-level} + + The maximum level of recursive description allowed. Initially two. +\end{defvar} + +\begin{defvar}{extensions:}{describe-indentation} + +The number of spaces to indent for each level of recursive +description, initially three. +\end{defvar} + +\begin{defvar}{extensions:}{describe-print-level} + \defvarx[extensions:]{describe-print-length} + + The values of \code{*print-level*} and \code{*print-length*} during + description. Initially two and five. +\end{defvar} + + +\section{The Inspector} + +\cmucl{} has both a graphical inspector that uses the X Window System, +and a simple terminal-based inspector. + +\begin{defun}{}{inspect}{ \args{\ampoptional{} \var{object}}} + + \code{inspect} calls the inspector on the optional argument + \var{object}. If \var{object} is unsupplied, \code{inspect} + immediately returns \false. Otherwise, the behavior of inspect + depends on whether Lisp is running under X. When \code{inspect} is + eventually exited, it returns some selected Lisp object. +\end{defun} + + +\subsection{The Graphical Interface} +\label{motif-interface} + +\cmucl{} has an interface to Motif which is functionally similar to +CLM, but works better in \cmucl{}. This interface is documented in +separate manuals \textit{CMUCL Motif Toolkit} and \textit{Design Notes +on the Motif Toolkit}, which are distributed with \cmucl{}. + +This motif interface has been used to write the inspector and graphical +debugger. There is also a Lisp control panel with a simple file management +facility, apropos and inspector dialogs, and controls for setting global +options. See the \code{interface} and \code{toolkit} packages. + +\begin{defun}{interface:}{lisp-control-panel}{} + + This function creates a control panel for the Lisp process. +\end{defun} + +\begin{defvar}{interface:}{interface-style} + + When the graphical interface is loaded, this variable controls + whether it is used by \code{inspect} and the error system. If the + value is \kwd{graphics} (the default) and the \code{DISPLAY} + environment variable is defined, the graphical inspector and + debugger will be invoked by \findexed{inspect} or when an error is + signalled. Possible values are \kwd{graphics} and {tty}. If the + value is \kwd{graphics}, but there is no X display, then we quietly + use the TTY interface. +\end{defvar} + + +\subsection{The TTY Inspector} + +If X is unavailable, a terminal inspector is invoked. The TTY inspector +is a crude interface to \code{describe} which allows objects to be +traversed and maintains a history. This inspector prints information +about and object and a numbered list of the components of the object. +The command-line based interface is a normal +\code{read}--\code{eval}--\code{print} loop, but an integer \var{n} +descends into the \var{n}'th component of the current object, and +symbols with these special names are interpreted as commands: + +\begin{Lentry} +\item[U] Move back to the enclosing object. As you descend into the +components of an object, a stack of all the objects previously seen is +kept. This command pops you up one level of this stack. + +\item[Q, E] Return the current object from \code{inspect}. + +\item[R] Recompute object display, and print again. Useful if the +object may have changed. + +\item[D] Display again without recomputing. + +\item[H, ?] Show help message. +\end{Lentry} + + +\section{Load} + +\begin{defun}{}{load}{% + \args{\var{filename} + \keys{\kwd{verbose} \kwd{print} \kwd{if-does-not-exist}} + \morekeys{\kwd{if-source-newer} \kwd{contents}}}} + + As in standard \clisp{}, this function loads a file containing + source or object code into the running Lisp. Several CMU extensions + have been made to \code{load} to conveniently support a variety of + program file organizations. \var{filename} may be a wildcard + pathname such as \file{*.lisp}, in which case all matching files are + loaded. + + If \var{filename} has a \code{pathname-type} (or extension), then + that exact file is loaded. If the file has no extension, then this + tells \code{load} to use a heuristic to load the ``right'' file. + The \code{*load-source-types*} and \code{*load-object-types*} + variables below are used to determine the default source and object + file types. If only the source or the object file exists (but not + both), then that file is quietly loaded. Similarly, if both the + source and object file exist, and the object file is newer than the + source file, then the object file is loaded. The value of the + \var{if-source-newer} argument is used to determine what action to + take when both the source and object files exist, but the object + file is out of date: + \begin{Lentry} + \item[\kwd{load-object}] The object file is loaded even though the + source file is newer. + + \item[\kwd{load-source}] The source file is loaded instead of the + older object file. + + \item[\kwd{compile}] The source file is compiled and then the new + object file is loaded. + + \item[\kwd{query}] The user is asked a yes or no question to + determine whether the source or object file is loaded. + \end{Lentry} + This argument defaults to the value of + \code{ext:*load-if-source-newer*} (initially \kwd{load-object}.) + + The \var{contents} argument can be used to override the heuristic + (based on the file extension) that normally determines whether to + load the file as a source file or an object file. If non-null, this + argument must be either \kwd{source} or \kwd{binary}, which forces + loading in source and binary mode, respectively. You really + shouldn't ever need to use this argument. +\end{defun} + +\begin{defvar}{extensions:}{load-source-types} + \defvarx[extensions:]{load-object-types} + + These variables are lists of possible \code{pathname-type} values + for source and object files to be passed to \code{load}. These + variables are only used when the file passed to \code{load} has no + type; in this case, the possible source and object types are used to + default the type in order to determine the names of the source and + object files. +\end{defvar} + +\begin{defvar}{extensions:}{load-if-source-newer} + + This variable determines the default value of the + \var{if-source-newer} argument to \code{load}. Its initial value is + \kwd{load-object}. +\end{defvar} + + +\section{The Reader} + +\subsection{Reader Extensions} +\cmucl{} supports an ANSI-compatible extension to enable reading of +specialized arrays. Thus +\begin{example} + * (setf *print-readably* nil) + NIL + * (make-array '(2 2) :element-type '(signed-byte 8)) + #2A((0 0) (0 0)) + * (setf *print-readably* t) + T + * (make-array '(2 2) :element-type '(signed-byte 8)) + #A((SIGNED-BYTE 8) (2 2) ((0 0) (0 0))) + * (type-of (read-from-string "#A((SIGNED-BYTE 8) (2 2) ((0 0) (0 0)))")) + (SIMPLE-ARRAY (SIGNED-BYTE 8) (2 2)) + * (setf *print-readably* nil) + NIL + * (type-of (read-from-string "#A((SIGNED-BYTE 8) (2 2) ((0 0) (0 0)))")) + (SIMPLE-ARRAY (SIGNED-BYTE 8) (2 2)) +\end{example} + +\subsection{Reader Parameters} +\begin{defvar}{extensions:}{ignore-extra-close-parentheses} + + If this variable is \true{} (the default), then the reader merely + prints a warning when an extra close parenthesis is detected + (instead of signalling an error.) +\end{defvar} + +\section{Stream Extensions} +\begin{defun}{sys:}{read-n-bytes}{% + \args{\var{stream buffer start numbytes} + \ampoptional{} \var{eof-error-p}}} + + On streams that support it, this function reads multiple bytes of + data into a buffer. The buffer must be a \code{simple-string} or + \code{(simple-array (unsigned-byte 8) (*))}. The argument + \var{nbytes} specifies the desired number of bytes, and the return + value is the number of bytes actually read. + \begin{itemize} + \item If \var{eof-error-p} is true, an \tindexed{end-of-file} + condition is signalled if end-of-file is encountered before + \var{count} bytes have been read. + + \item If \var{eof-error-p} is false, \code{read-n-bytes reads} as + much data is currently available (up to count bytes.) On pipes or + similar devices, this function returns as soon as any data is + available, even if the amount read is less than \var{count} and + eof has not been hit. See also \funref{make-fd-stream}. + \end{itemize} +\end{defun} + +\input{simple-streams} + +\section{Running Programs from Lisp} + +It is possible to run programs from Lisp by using the following function. + +\begin{defun}{extensions:}{run-program}{% + \args{\var{program} \var{args} + \keys{\kwd{env} \kwd{wait} \kwd{pty} \kwd{input}} + \morekeys{\kwd{if-input-does-not-exist}} + \yetmorekeys{\kwd{output} \kwd{if-output-exists}} + \yetmorekeys{\kwd{error} \kwd{if-error-exists}} + \yetmorekeys{\kwd{status-hook} \kwd{external-format}} + \yetmorekeys{\kwd{element-type}}}} + + \code{run-program} runs \var{program} in a child process. + \var{Program} should be a pathname or string naming the program. + \var{Args} should be a list of strings which this passes to + \var{program} as normal Unix parameters. For no arguments, specify + \var{args} as \nil. The value returned is either a process + structure or \nil. The process interface follows the description of + \code{run-program}. If \code{run-program} fails to fork the child + process, it returns \nil. + + Except for sharing file descriptors as explained in keyword argument + descriptions, \code{run-program} closes all file descriptors in the + child process before running the program. When you are done using a + process, call \code{process-close} to reclaim system resources. You + only need to do this when you supply \kwd{stream} for one of + \kwd{input}, \kwd{output}, or \kwd{error}, or you supply \kwd{pty} + non-\nil. You can call \code{process-close} regardless of whether + you must to reclaim resources without penalty if you feel safer. + + \code{run-program} accepts the following keyword arguments: + + \begin{Lentry} + \item[\kwd{env}] This is an a-list mapping keywords and + simple-strings. The default is \code{ext:*environment-list*}. If + \kwd{env} is specified, \code{run-program} uses the value given + and does not combine the environment passed to Lisp with the one + specified. + + \item[\kwd{wait}] If non-\nil{} (the default), wait until the child + process terminates. If \nil, continue running Lisp while the + child process runs. + + \item[\kwd{pty}] This should be one of \true, \nil, or a stream. If + specified non-\nil, the subprocess executes under a Unix PTY. + If specified as a stream, the system collects all output to this + pty and writes it to this stream. If specified as \true, the + \code{process-pty} slot contains a stream from which you can read + the program's output and to which you can write input for the + program. The default is \nil. + + \item[\kwd{input}] This specifies how the program gets its input. + If specified as a string, it is the name of a file that contains + input for the child process. \code{run-program} opens the file as + standard input. If specified as \nil{} (the default), then + standard input is the file \file{/dev/null}. If specified as + \true, the program uses the current standard input. This may + cause some confusion if \kwd{wait} is \nil{} since two processes + may use the terminal at the same time. If specified as + \kwd{stream}, then the \code{process-input} slot contains an + output stream. Anything written to this stream goes to the + program as input. \kwd{input} may also be an input stream that + already contains all the input for the process. In this case + \code{run-program} reads all the input from this stream before + returning, so this cannot be used to interact with the process. + If \kwd{input} is a string stream, it is up to the caller to call + \code{string-encode} or other function to convert the string to + the appropriate encoding. In either case, the least significant 8 + bits of the \code{char-code} of each \code{character} is + sent to the program. + + \item[\kwd{if-input-does-not-exist}] This specifies what to do if + the input file does not exist. The following values are valid: + \nil{} (the default) causes \code{run-program} to return \nil{} + without doing anything; \kwd{create} creates the named file; and + \kwd{error} signals an error. + + \item[\kwd{output}] This specifies what happens with the program's + output. If specified as a pathname, it is the name of a file that + contains output the program writes to its standard output. If + specified as \nil{} (the default), all output goes to + \file{/dev/null}. If specified as \true, the program writes to + the Lisp process's standard output. This may cause confusion if + \kwd{wait} is \nil{} since two processes may write to the terminal + at the same time. If specified as \kwd{stream}, then the + \code{process-output} slot contains an input stream from which you + can read the program's output. \kwd{output} can also be a stream + in which case all output from the process is written to this + stream. If \kwd{output} is a string-stream, each octet read from + the program is converted to a character using \code{code-char}. + It is up to the caller to convert this using the appropriate + external format to create the desired encoded string. + + \item[\kwd{if-output-exists}] This specifies what to do if the + output file already exists. The following values are valid: + \nil{} causes \code{run-program} to return \nil{} without doing + anything; \kwd{error} (the default) signals an error; + \kwd{supersede} overwrites the current file; and \kwd{append} + appends all output to the file. + + \item[\kwd{error}] This is similar to \kwd{output}, except the file + becomes the program's standard error. Additionally, \kwd{error} + can be \kwd{output} in which case the program's error output is + routed to the same place specified for \kwd{output}. If specified + as \kwd{stream}, the \code{process-error} contains a stream + similar to the \code{process-output} slot when specifying the + \kwd{output} argument. + + \item[\kwd{if-error-exists}] This specifies what to do if the error + output file already exists. It accepts the same values as + \kwd{if-output-exists}. + + \item[\kwd{status-hook}] This specifies a function to call whenever + the process changes status. This is especially useful when + specifying \kwd{wait} as \nil. The function takes the process as + a required argument. + + \item[\kwd{external-format}] This specifies the external format to + use for streams created for \code{run-program}. This does not + apply to string streams passed in as \kwd{input} or \kwd{output} + parameters. + + \item[\kwd{element-type}] If streams are created \code{run-program}, + use this as the \kwd{element-type} for the stream. Defaults to + \code{BASE-CHAR}. + +% \item[\kwd{before-execve}] This specifies a function to run in the +% child process before it becomes the program to run. This is +% useful for actions such as authenticating the child process +% without modifying the parent Lisp process. + \end{Lentry} +\end{defun} + + +\subsection{Process Accessors} + +The following functions interface the process returned by \code{run-program}: + +\begin{defun}{extensions:}{process-p}{\args{\var{thing}}} + + This function returns \true{} if \var{thing} is a process. + Otherwise it returns \nil{} +\end{defun} + +\begin{defun}{extensions:}{process-pid}{\args{\var{process}}} + + This function returns the process ID, an integer, for the + \var{process}. +\end{defun} + +\begin{defun}{extensions:}{process-status}{\args{\var{process}}} + + This function returns the current status of \var{process}, which is + one of \kwd{running}, \kwd{stopped}, \kwd{exited}, or + \kwd{signaled}. +\end{defun} + +\begin{defun}{extensions:}{process-exit-code}{\args{\var{process}}} + + This function returns either the exit code for \var{process}, if it + is \kwd{exited}, or the termination signal \var{process} if it is + \kwd{signaled}. The result is undefined for processes that are + still alive. +\end{defun} + +\begin{defun}{extensions:}{process-core-dumped}{\args{\var{process}}} + + This function returns \true{} if someone used a Unix signal to + terminate the \var{process} and caused it to dump a Unix core image. +\end{defun} + +\begin{defun}{extensions:}{process-pty}{\args{\var{process}}} + + This function returns either the two-way stream connected to + \var{process}'s Unix PTY connection or \nil{} if there is none. +\end{defun} + +\begin{defun}{extensions:}{process-input}{\args{\var{process}}} + \defunx[extensions:]{process-output}{\args{\var{process}}} + \defunx[extensions:]{process-error}{\args{\var{process}}} + + If the corresponding stream was created, these functions return the + input, output or error fd-stream. \nil{} is returned if there + is no stream. +\end{defun} + +\begin{defun}{extensions:}{process-status-hook}{\args{\var{process}}} + + This function returns the current function to call whenever + \var{process}'s status changes. This function takes the + \var{process} as a required argument. \code{process-status-hook} is + \code{setf}'able. +\end{defun} + +\begin{defun}{extensions:}{process-plist}{\args{\var{process}}} + + This function returns annotations supplied by users, and it is + \code{setf}'able. This is available solely for users to associate + information with \var{process} without having to build a-lists or + hash tables of process structures. +\end{defun} + +\begin{defun}{extensions:}{process-wait}{ + \args{\var{process} \ampoptional{} \var{check-for-stopped}}} + + This function waits for \var{process} to finish. If + \var{check-for-stopped} is non-\nil, this also returns when + \var{process} stops. +\end{defun} + +\begin{defun}{extensions:}{process-kill}{% + \args{\var{process} \var{signal} \ampoptional{} \var{whom}}} + + This function sends the Unix \var{signal} to \var{process}. + \var{Signal} should be the number of the signal or a keyword with + the Unix name (for example, \kwd{sigsegv}). \var{Whom} should be + one of the following: + \begin{Lentry} + + \item[\kwd{pid}] This is the default, and it indicates sending the + signal to \var{process} only. + + \item[\kwd{process-group}] This indicates sending the signal to + \var{process}'s group. + + \item[\kwd{pty-process-group}] This indicates sending the signal to + the process group currently in the foreground on the Unix PTY + connected to \var{process}. This last option is useful if the + running program is a shell, and you wish to signal the program + running under the shell, not the shell itself. If + \code{process-pty} of \var{process} is \nil, using this option is + an error. + \end{Lentry} +\end{defun} + +\begin{defun}{extensions:}{process-alive-p}{\args{\var{process}}} + + This function returns \true{} if \var{process}'s status is either + \kwd{running} or \kwd{stopped}. +\end{defun} + +\begin{defun}{extensions:}{process-close}{\args{\var{process}}} + + This function closes all the streams associated with \var{process}. + When you are done using a process, call this to reclaim system + resources. +\end{defun} + + +\section{Saving a Core Image} + +A mechanism has been provided to save a running Lisp core image and to +later restore it. This is convenient if you don't want to load several files +into a Lisp when you first start it up. The main problem is the large +size of each saved Lisp image, typically at least 20 megabytes. + +\begin{defun}{extensions:}{save-lisp}{% + \args{\var{file} + \keys{\kwd{purify} \kwd{root-structures} \kwd{init-function}} + \morekeys{\kwd{load-init-file} \kwd{print-herald} \kwd{site-init}} + \yetmorekeys{\kwd{process-command-line} \kwd{batch-mode} \kwd{executable}}}} + + The \code{save-lisp} function saves the state of the currently + running Lisp core image in \var{file}. The keyword arguments have + the following meaning: + \begin{Lentry} + + \item[\kwd{purify}] If non-\nil{} (the default), the core image is + purified before it is saved (see \funref{purify}.) This reduces + the amount of work the garbage collector must do when the + resulting core image is being run. Also, if more than one Lisp is + running on the same machine, this maximizes the amount of memory + that can be shared between the two processes. + + \item[\kwd{root-structures}] + This should be a list of the main entry points in any newly + loaded systems. This need not be supplied, but locality and/or + GC performance will be better if they are. Meaningless if + \kwd{purify} is \nil. See \funref{purify}. + + \item[\kwd{init-function}] This is the function that starts running + when the created core file is resumed. The default function + simply invokes the top level read-eval-print loop. If the + function returns the lisp will exit. + + \item[\kwd{load-init-file}] If non-NIL, then load an init file; + either the one specified on the command line or + ``\w{\file{init.}\var{fasl-type}}'', or, if + ``\w{\file{init.}\var{fasl-type}}'' does not exist, + \code{init.lisp} from the user's home directory. If the init file + is found, it is loaded into the resumed core file before the + read-eval-print loop is entered. + + \item[\kwd{site-init}] If non-NIL, the name of the site init file to + quietly load. The default is \file{library:site-init}. No error + is signalled if the file does not exist. + + \item[\kwd{print-herald}] If non-NIL (the default), then print out + the standard Lisp herald when starting. + + \item[\kwd{process-command-line}] If non-NIL (the default), + processes the command line switches and performs the appropriate + actions. + + \item[\kwd{batch-mode}] If NIL (the default), then the presence of + the -batch command-line switch will invoke batch-mode processing + upon resuming the saved core. If non-NIL, the produced core will + always be in batch-mode, regardless of any command-line switches. + + \item[\kwd{executable}] If non-NIL, an executable image is created. + Normally, \cmucl{} consists of the C runtime along with a core + file image. When \kwd{executable} is non-NIL, the core file is + incorporated into the C runtime, so one (large) executable is + created instead of a new separate core file. + + This feature is only available on some platforms, as indicated by + having the feature \kwd{executable}. Currently only x86 ports and + the solaris/sparc port have this feature. + \end{Lentry} +\end{defun} + +To resume a saved file, type: +\begin{example} +lisp -core file +\end{example} +However, if the \kwd{executable} option was specified, you can just +use +\begin{example} + file +\end{example} +since the executable contains the core file within the executable. + +\begin{defun}{extensions:}{purify}{ + \args{\var{file} + \keys{\kwd{root-structures} \kwd{environment-name}}}} + + This function optimizes garbage collection by moving all currently + live objects into non-collected storage. Once statically allocated, + the objects can never be reclaimed, even if all pointers to them are + dropped. This function should generally be called after a large + system has been loaded and initialized. + + \begin{Lentry} + \item[\kwd{root-structures}] is an optional list of objects which + should be copied first to maximize locality. This should be a + list of the main entry points for the resulting core image. The + purification process tries to localize symbols, functions, etc., + in the core image so that paging performance is improved. The + default value is NIL which means that Lisp objects will still be + localized but probably not as optimally as they could be. + + \var{defstruct} structures defined with the \code{(:pure t)} + option are moved into read-only storage, further reducing GC cost. + List and vector slots of pure structures are also moved into + read-only storage. + + \item[\kwd{environment-name}] is gratuitous documentation for the + compacted version of the current global environment (as seen in + \code{c::*info-environment*}.) If \false{} is supplied, then + environment compaction is inhibited. + \end{Lentry} +\end{defun} + + +\section{Pathnames} + +In \clisp{} quite a few aspects of \tindexed{pathname} semantics are left to +the implementation. + + +\subsection{Unix Pathnames} +\cpsubindex{unix}{pathnames} + +Unix pathnames are always parsed with a \code{unix-host} object as the host and +\code{nil} as the device. The last two dots (\code{.}) in the namestring mark +the type and version, however if the first character is a dot, it is considered +part of the name. If the last character is a dot, then the pathname has the +empty-string as its type. The type defaults to \code{nil} and the version +defaults to \kwd{newest}. + +\begin{example} +(defun parse (x) + (values (pathname-name x) (pathname-type x) (pathname-version x))) + +(parse "foo") \result "foo", NIL, NIL +(parse "foo.bar") \result "foo", "bar", NIL +(parse ".foo") \result ".foo", NIL, NIL +(parse ".foo.bar") \result ".foo", "bar", NIL +(parse "..") \result NIL, NIL, NIL +(parse "foo.") \result "foo", "", NIL +(parse "foo.bar.~1~") \result "foo", "bar", 1 +(parse "foo.bar.baz") \result "foo.bar", "baz", NIL +\end{example} + +The directory of pathnames beginning with a slash (or a search-list, +\pxlref{search-lists}) is starts \kwd{absolute}, others start with +\kwd{relative}. The \code{..} directory is parsed as \kwd{up}; there is no +namestring for \kwd{back}: + +\begin{example} +(pathname-directory "/usr/foo/bar.baz") \result (:ABSOLUTE "usr" "foo") +(pathname-directory "../foo/bar.baz") \result (:RELATIVE :UP "foo") +\end{example} + + +\subsection{Wildcard Pathnames} + +Wildcards are supported in Unix pathnames. If `\code{*}' is specified for a +part of a pathname, that is parsed as \kwd{wild}. `\code{**}' can be used as a +directory name to indicate \kwd{wild-inferiors}. Filesystem operations +treat \kwd{wild-inferiors} the same as\ \kwd{wild}, but pathname pattern +matching (e.g. for logical pathname translation, \pxlref{logical-pathnames}) +matches any number of directory parts with `\code{**}' (see +\pxlref{wildcard-matching}.) + +`\code{*}' embedded in a pathname part matches any number of characters. +Similarly, `\code{?}' matches exactly one character, and `\code{[a,b]}' +matches the characters `\code{a}' or `\code{b}'. These pathname parts are +parsed as \code{pattern} objects. + +Backslash can be used as an escape character in namestring +parsing to prevent the next character from being treated as a wildcard. Note +that if typed in a string constant, the backslash must be doubled, since the +string reader also uses backslash as a quote: + +\begin{example} +(pathname-name "foo\(\backslash\backslash\)*bar") => "foo*bar" +\end{example} + + +\subsection{Logical Pathnames} +\cindex{logical pathnames} +\label{logical-pathnames} + +If a namestring begins with the name of a defined logical pathname +host followed by a colon, then it will be parsed as a logical +pathname. Both `\code{*}' and `\code{**}' wildcards are implemented. +\findexed{load-logical-pathname-translations} on \var{name} looks for a +logical host definition file in +\w{\file{library:\var{name}.translations}}. Note that \file{library:} +designates the search list (\pxlref{search-lists}) initialized to the +\cmucl{} \file{lib/} directory, not a logical pathname. The format of +the file is a single list of two-lists of the from and to patterns: + +\begin{example} +(("foo;*.text" "/usr/ram/foo/*.txt") + ("foo;*.lisp" "/usr/ram/foo/*.l")) +\end{example} + + +\subsection{Search Lists} +\cindex{search lists} +\label{search-lists} + +Search lists are an extension to \clisp{} pathnames. They serve a function +somewhat similar to \clisp{} logical pathnames, but work more like Unix PATH +variables. Search lists are used for two purposes: +\begin{itemize} +\item They provide a convenient shorthand for commonly used directory names, +and + +\item They allow the abstract (directory structure independent) specification +of file locations in program pathname constants (similar to logical pathnames.) +\end{itemize} +Each search list has an associated list of directories (represented as +pathnames with no name or type component.) The namestring for any relative +pathname may be prefixed with ``\var{slist}\code{:}'', indicating that the +pathname is relative to the search list \var{slist} (instead of to the current +working directory.) Once qualified with a search list, the pathname is no +longer considered to be relative. + +When a search list qualified pathname is passed to a file-system operation such +as \code{open}, \code{load} or \code{truename}, each directory in the search +list is successively used as the root of the pathname until the file is +located. When a file is written to a search list directory, the file is always +written to the first directory in the list. + + +\subsection{Predefined Search-Lists} + +These search-lists are initialized from the Unix environment or when Lisp was +built: +\begin{Lentry} +\item[\code{default:}] The current directory at startup. + +\item[\code{home:}] The user's home directory. + +\item[\code{library:}] The \cmucl{} \file{lib/} directory (\code{CMUCLLIB} environment +variable). + +\item[\code{path:}] The Unix command path (\code{PATH} environment variable). +\item[\code{ld-library-path:}] The Unix \code{LD\_LIBRARY\_PATH} + environment variable. +\item[\code{target:}] The root of the tree where \cmucl{} was compiled. +\item[\code{modules:}] The list of directories where \cmucl{}'s + modules can be found. +\item[\code{ext-formats:}] The list of directories where \cmucl{} can + find the implementation of external formats. +\end{Lentry} +It can be useful to redefine these search-lists, for example, \file{library:} +can be augmented to allow logical pathname translations to be located, and +\file{target:} can be redefined to point to where \cmucl{} system sources are +locally installed. + + +\subsection{Search-List Operations} + +These operations define and access search-list definitions. A search-list name +may be parsed into a pathname before the search-list is actually defined, but +the search-list must be defined before it can actually be used in a filesystem +operation. + +\begin{defun}{extensions:}{search-list}{\var{name}} + + This function returns the list of directories associated with the + search list \var{name}. If \var{name} is not a defined search list, + then an error is signaled. When set with \code{setf}, the list of + directories is changed to the new value. If the new value is just a + namestring or pathname, then it is interpreted as a one-element + list. Note that (unlike Unix pathnames), search list names are + case-insensitive. +\end{defun} + +\begin{defun}{extensions:}{search-list-defined-p}{\var{name}} + \defunx[extensions:]{clear-search-list}{\var{name}} + + \code{search-list-defined-p} returns \true{} if \var{name} is a + defined search list name, \false{} otherwise. + \code{clear-search-list} make the search list \var{name} undefined. +\end{defun} + +\begin{defmac}{extensions:}{enumerate-search-list}{% + \args{(\var{var} \var{pathname} \mopt{result}) \mstar{form}}} + + This macro provides an interface to search list resolution. The + body \var{forms} are executed with \var{var} bound to each + successive possible expansion for \var{name}. If \var{name} does + not contain a search-list, then the body is executed exactly once. + Everything is wrapped in a block named \nil, so \code{return} can be + used to terminate early. The \var{result} form (default \nil) is + evaluated to determine the result of the iteration. +\end{defmac} + + +\subsection{Search List Example} + +The search list \code{code:} can be defined as follows: +\begin{example} +(setf (ext:search-list "code:") '("/usr/lisp/code/")) +\end{example} +It is now possible to use \code{code:} as an abbreviation for the directory +\file{/usr/lisp/code/} in all file operations. For example, you can now specify +\code{code:eval.lisp} to refer to the file \file{/usr/lisp/code/eval.lisp}. + +To obtain the value of a search-list name, use the function search-list +as follows: +\begin{example} +(ext:search-list \var{name}) +\end{example} +Where \var{name} is the name of a search list as described above. For example, +calling \code{ext:search-list} on \code{code:} as follows: +\begin{example} +(ext:search-list "code:") +\end{example} +returns the list \code{("/usr/lisp/code/")}. + + +\section{Filesystem Operations} + +\cmucl{} provides a number of extensions and optional features beyond those +required by the \clisp{} specification. + + +\subsection{Wildcard Matching} +\label{wildcard-matching} + +Unix filesystem operations such as \code{open} will accept wildcard pathnames +that match a single file (of course, \code{directory} allows any number of +matches.) Filesystem operations treat \kwd{wild-inferiors} the same as\ +\kwd{wild}. + +\begin{defun}{}{directory}{\var{wildname} \keys{\kwd{all} \kwd{check-for-subdirs}} + \kwd{truenamep} \morekeys{\kwd{follow-links}}} + + The keyword arguments to this \clisp{} function are a \cmucl{} extension. + The arguments (all default to \code{t}) have the following + functions: + \begin{Lentry} + \item[\kwd{all}] Include files beginning with dot such as + \file{.login}, similar to ``\code{ls -a}''. + + \item[\kwd{check-for-subdirs}] Test whether files are directories, + similar to ``\code{ls -F}''. + + \item[\kwd{truenamep}] Call \code{truename} on each file, which + expands out all symbolic links. Note that this option can easily + result in pathnames being returned which have a different + directory from the one in the \var{wildname} argument. + + \item[\kwd{follow-links}] Follow symbolic links when searching for + matching directories. + \end{Lentry} +\end{defun} + +\begin{defun}{extensions:}{print-directory}{% + \args{\var{wildname} + \ampoptional{} \var{stream} + \keys{\kwd{all} \kwd{verbose}} + \morekeys{\kwd{return-list}}}} + + Print a directory of \var{wildname} listing to \var{stream} (default + \code{*standard-output*}.) \kwd{all} and \kwd{verbose} both default + to \false{} and correspond to the ``\code{-a}'' and ``\code{-l}'' + options of \file{ls}. Normally this function returns \false{}, but + if \kwd{return-list} is true, a list of the matched pathnames are + returned. +\end{defun} + + +\subsection{File Name Completion} + +\begin{defun}{extensions:}{complete-file}{% + \args{\var{pathname} + \keys{\kwd{defaults} \kwd{ignore-types}}}} + + Attempt to complete a file name to the longest unambiguous prefix. + If supplied, directory from \kwd{defaults} is used as the ``working + directory'' when doing completion. \kwd{ignore-types} is a list of + strings of the pathname types (a.k.a. extensions) that should be + disregarded as possible matches (binary file names, etc.) +\end{defun} + +\begin{defun}{extensions:}{ambiguous-files}{% + \args{\var{pathname} + \ampoptional{} \var{defaults}}} + + Return a list of pathnames for all the possible completions of + \var{pathname} with respect to \var{defaults}. +\end{defun} + + +\subsection{Miscellaneous Filesystem Operations} + +\begin{defun}{extensions:}{default-directory}{} + + Return the current working directory as a pathname. If set with + \code{setf}, set the working directory. +\end{defun} + +\begin{defun}{extensions:}{file-writable}{\var{name}} + + This function accepts a pathname and returns \true{} if the current + process can write it, and \false{} otherwise. +\end{defun} + +\begin{defun}{extensions:}{unix-namestring}{% + \args{\var{pathname} + \ampoptional{} \var{for-input}}} + + This function converts \var{pathname} into a string that can be used + with UNIX system calls. Search-lists and wildcards are expanded. + \var{for-input} controls the treatment of search-lists: when true + (the default) and the file exists anywhere on the search-list, then + that absolute pathname is returned; otherwise the first element of + the search-list is used as the directory. +\end{defun} + + +\section{Time Parsing and Formatting} + +\cindex{time parsing} \cindex{time formatting} +Functions are provided to allow parsing strings containing time information +and printing time in various formats are available. + +\begin{defun}{extensions:}{parse-time}{% + \args{\var{time-string} + \keys{\kwd{error-on-mismatch} \kwd{default-seconds}} + \morekeys{\kwd{default-minutes} \kwd{default-hours}} + \yetmorekeys{\kwd{default-day} \kwd{default-month}} + \yetmorekeys{\kwd{default-year} \kwd{default-zone}} + \yetmorekeys{\kwd{default-weekday}}}} + + \code{parse-time} accepts a string containing a time (e.g., + \w{"\code{Jan 12, 1952}"}) and returns the universal time if it is + successful. If it is unsuccessful and the keyword argument + \kwd{error-on-mismatch} is non-\nil{}, it signals an error. + Otherwise it returns \nil{}. The other keyword arguments have the + following meaning: + + \begin{Lentry} + \item[\kwd{default-seconds}] specifies the default value for the + seconds value if one is not provided by \var{time-string}. The + default value is 0. + + \item[\kwd{default-minutes}] specifies the default value for the + minutes value if one is not provided by \var{time-string}. The + default value is 0. + + \item[\kwd{default-hours}] specifies the default value for the hours + value if one is not provided by \var{time-string}. The default + value is 0. + + \item[\kwd{default-day}] specifies the default value for the day + value if one is not provided by \var{time-string}. The default + value is the current day. + + \item[\kwd{default-month}] specifies the default value for the month + value if one is not provided by \var{time-string}. The default + value is the current month. + + \item[\kwd{default-year}] specifies the default value for the year + value if one is not provided by \var{time-string}. The default + value is the current year. + + \item[\kwd{default-zone}] specifies the default value for the time + zone value if one is not provided by \var{time-string}. The + default value is the current time zone. + + \item[\kwd{default-weekday}] specifies the default value for the day + of the week if one is not provided by \var{time-string}. The + default value is the current day of the week. + \end{Lentry} + Any of the above keywords can be given the value \kwd{current} which + means to use the current value as determined by a call to the + operating system. +\end{defun} + +\begin{defun}{extensions:}{format-universal-time}{ + \args{\var{dest} \var{universal-time} + \\ + \keys{\kwd{timezone}} + \morekeys{\kwd{style} \kwd{date-first}} + \yetmorekeys{\kwd{print-seconds} \kwd{print-meridian}} + \yetmorekeys{\kwd{print-timezone} \kwd{print-weekday}}}} + \defunx[extensions:]{format-decoded-time}{ + \args{\var{dest} \var{seconds} \var{minutes} \var{hours} \var{day} \var{month} \var{year} + \\ + \keys{\kwd{timezone}} + \morekeys{\kwd{style} \kwd{date-first}} + \yetmorekeys{\kwd{print-seconds} \kwd{print-meridian}} + \yetmorekeys{\kwd{print-timezone} \kwd{print-weekday}}}} + + \code{format-universal-time} formats the time specified by + \var{universal-time}. \code{format-decoded-time} formats the time + specified by \var{seconds}, \var{minutes}, \var{hours}, \var{day}, + \var{month}, and \var{year}. \var{Dest} is any destination + accepted by the \code{format} function. The keyword arguments have + the following meaning: + \begin{Lentry} + + \item[\kwd{timezone}] is an integer specifying the hours west of + Greenwich. \kwd{timezone} defaults to the current time zone. + + \item[\kwd{style}] specifies the style to use in formatting the + time. The legal values are: + \begin{Lentry} + + \item[\kwd{short}] specifies to use a numeric date. + + \item[\kwd{long}] specifies to format months and weekdays as + words instead of numbers. + + \item[\kwd{abbreviated}] is similar to long except the words are + abbreviated. + + \item[\kwd{government}] is similar to abbreviated, except the + date is of the form ``day month year'' instead of ``month day, + year''. + \end{Lentry} + + \item[\kwd{date-first}] if non-\false{} (default) will place the + date first. Otherwise, the time is placed first. + + \item[\kwd{print-seconds}] if non-\false{} (default) will format + the seconds as part of the time. Otherwise, the seconds will be + omitted. + + \item[\kwd{print-meridian}] if non-\false{} (default) will format + ``AM'' or ``PM'' as part of the time. Otherwise, the ``AM'' or + ``PM'' will be omitted. + + \item[\kwd{print-timezone}] if non-\false{} (default) will format + the time zone as part of the time. Otherwise, the time zone will + be omitted. + + %%\item[\kwd{print-seconds}] + %%if non-\false{} (default) will format the seconds as part of + %%the time. Otherwise, the seconds will be omitted. + + \item[\kwd{print-weekday}] if non-\false{} (default) will format + the weekday as part of date. Otherwise, the weekday will be + omitted. + \end{Lentry} +\end{defun} + + +\section{Random Number Generation} +\cindex{random number generation} + +\clisp{} includes a random number generator as a standard part of the +language; however, the implementation of the generator is not +specified. + +\subsection{MT-19937 Generator} +\cpsubindex{random number generation}{MT-19937 generator} +On all platforms, the random number is \code{MT-19937} generator as indicated by +\kwd{rand-mt19937} being in \code{*features*}. This is a Lisp +implementation of the MT-19937 generator of Makoto Matsumoto and +T. Nishimura. We refer the reader to their paper\footnote{``Mersenne + Twister: A 623-Dimensionally Equidistributed Uniform Pseudorandom + Number Generator,'' ACM Trans. on Modeling and Computer Simulation, + Vol. 8, No. 1, January 1998, pp.3--30} or to +their +\ifpdf +\href{http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html}{website}. +\else +website at +\href{http://www.math.keio.ac.jp/~matumoto/emt.html}{\texttt{http://www.math.keio.ac.jp/~matsumoto/emt.html}}. +\fi + +When \cmucl{} starts up, \code{*random-state*} is initialized by +reading 627 words from \code{/dev/urandom}, when available. If +\code{/dev/urandom} is not available, the universal time is used to +initialize \code{*random-state*}. The initialization is done as given +in Matsumoto's paper. + +\section{Lisp Threads} +\cindex{lisp threads} + +\cmucl{} supports Lisp threads for the x86 platform. + +\section{Lisp Library} +\label{lisp-lib} + +The \cmucl{} project maintains a collection of useful or interesting +programs written by users of our system. The library is in +\file{lib/contrib/}. Two files there that users should read are: +\begin{Lentry} + +\item[CATALOG.TXT] +This file contains a page for each entry in the library. It +contains information such as the author, portability or dependency issues, how +to load the entry, etc. + +\item[READ-ME.TXT] +This file describes the library's organization and all the +possible pieces of information an entry's catalog description could contain. +\end{Lentry} + +Hemlock has a command \F{Library Entry} that displays a list of the current +library entries in an editor buffer. There are mode specific commands that +display catalog descriptions and load entries. This is a simple and convenient +way to browse the library. + + +\section{Generalized Function Names} + +\begin{defmac}{ext:}{define-function-name-syntax}{% + \var{name} (\var{var}) \ampbody\ \var{body}} + Define lists starting with the symbol \code{name} as a new extended + function name syntax. + + \code{body} is executed with \code{var} bound to an actual function + name of that form, and should return two values: + + \begin{itemize} + \item A generalized boolean that is true if \code{var} is a valid + function name. + \item A symbol that can be used as a \code{block} name in functions + whose name is \code{var}. (For some sorts of function names it + might make sense to return \code{nil} for the block name, or just + return one value.) + \end{itemize} + + Users should not define function names starting with a symbol that + \cmucl{} might be using internally. It is therefore advisable to + only define new function names starting with a symbol from a + user-defined package. +\end{defmac} + +\begin{defun}{ext:}{valid-function-name-p}{\var{name}} + Returns two values: + + \begin{itemize} + \item True if \code{name} is a valid function name. + \item A symbol that can be used as a \code{block} name in + functions whose name is \code{name}. This can be \code{nil} + for some function names. + \end{itemize} +\end{defun} + + + +\section{CLOS} + +\subsection{Primary Method Errors} +\cindex{primary method} + +The standard requires that an error is signaled when a generic +function is called and + +\begin{itemize} +\item no primary method is applicable to the generic function's actual + arguments, and +\item the generic function's method combination is either the standard + method combination or a method combination defined with the short + form of \code{define-method-combination}. The latter includes the + standardized method combinations like \code{progn}, \code{and}, etc. +\end{itemize} + +\begin{defgeneric}[-generic]{pcl:}{no-primary-method}{\var{gf} \amprest{} \var{args}} + In \cmucl, this generic function is called in the above erroneous + cases. The parameter \code{gf} is the generic function being + called, and \code{args} is a list of actual arguments in the generic + function call. +\end{defgeneric} + +\begin{defmethod}[-standard]{pcl:}{no-primary-method}{% + (\var{gf} \argtype{standard-generic-function}) \amprest{} \var{args}} + This method signals a continuable error of type + \code{pcl:no-primary-method-error}. +\end{defmethod} + + +\subsection{Slot Type Checking} +\cindex{slot type checking} + +Declared slot types are used when + +\begin{itemize} +\item reading slot values with \code{slot-value} in methods, or + +\item setting slots with \code{(setf slot-value)} in methods, or + +\item creating instances with \code{make-instance}, when slots are + initialized from initforms. This currently depends on PCL being + able to use its internal \code{make-instance} optimization, which it + usually can. +\end{itemize} + +Example: + +\begin{example} +(defclass foo () + ((a :type fixnum))) + +(defmethod bar ((object foo) value) + (with-slots (a) object + (setf a value))) + +(defmethod baz ((object foo)) + (< (slot-value object 'a) 10)) +\end{example} + +In method \code{bar}, and with a suitable safety setting, a type error +will occur if \code{value} is not a \code{fixnum}. In method +\code{baz}, a \code{fixnum} comparison can be used by the compiler. + +\begin{defvar}{pcl::}{use-slot-types-p} + Slot type checking can be turned off by setting this variable to + \false, which can be useful for compiling code containing incorrect + slot type declarations. +\end{defvar} + + +\subsection{Slot Access Optimization} +\cindex{slot access optimization} +\cindex{slot declarations} + +The declaration \code{ext:slots} is used for optimizing slot access in +methods. + +\begin{example} +declare (ext:slots specifier*) + +specifier ::= (quality class-entry*) +quality ::= SLOT-BOUNDP | INLINE +class-entry ::= class | (class slot-name*) +class ::= the name of a class +slot-name ::= the name of a slot +\end{example} + +The \code{slot-boundp} quality specifies that all or some slots of a +class are always bound. + +The \code{inline} quality specifies that access to all or some slots +of a class should be inlined, using compile-time knowledge of class +layouts. + + + +\subsubsection{\code{slot-boundp} Declaration} +\cpsubindex{slot declaration}{slot-boundp} + +Example: + +\begin{example} +(defclass foo () + (a b)) + +(defmethod bar ((x foo)) + (declare (ext:slots (slot-boundp foo))) + (list (slot-value x 'a) (slot-value x 'b))) +\end{example} + +The \code{slot-boundp} declaration in method \code{bar} specifies that +the slots \code{a} and \code{b} accessed through parameter \code{x} in +the scope of the declaration are always bound, because parameter +\code{x} is specialized on class \code{foo} to which the +\code{slot-boundp} declaration applies. The PCL-generated code for +the \code{slot-value} forms will thus not contain tests for the slots +being bound or not. The consequences are undefined should one of the +accessed slots not be bound. + + + +\subsubsection{\code{inline} Declaration} +\cpsubindex{slot declaration}{inline} + +Example: + +\begin{example} +(defclass foo () + (a b)) + +(defmethod bar ((x foo)) + (declare (ext:slots (inline (foo a)))) + (list (slot-value x 'a) (slot-value x 'b))) +\end{example} + +The \code{inline} declaration in method \code{bar} tells PCL to use +compile-time knowledge of slot locations for accessing slot \code{a} +of class \code{foo}, in the scope of the declaration. + +Class \code{foo} must be known at compile time for this optimization +to be possible. PCL prints a warning and uses normal slot access If +the class is not defined at compile time. + +If a class is \code{proclaim}ed to use inline slot access before it is +defined, the class is defined at compile time. Example: + +\begin{example} +(declaim (ext:slots (inline (foo slot-a)))) +(defclass foo () ...) +(defclass bar (foo) ...) +\end{example} + +Class \code{foo} will be defined at compile time because it is +declared to use inline slot access; methods accessing slot +\code{slot-a} of \code{foo} will use inline slot access if otherwise +possible. Class \code{bar} will be defined at compile time because +its superclass \code{foo} is declared to use inline slot access. PCL +uses compile-time information from subclasses to warn about situations +where using inline slot access is not possible. + +Normal slot access will be used if PCL finds, at method compilation +time, that + +\begin{itemize} +\item class \code{foo} has a subclass in which slot \code{a} is at a + different location, or + +\item there exists a \code{slot-value-using-class} method for + \code{foo} or a subclass of \code{foo}. +\end{itemize} + +When the declaration is used to optimize calls to slot accessor +generic functions in methods, as opposed to \code{slot-value} or +\code{(setf slot-value)}, the optimization is additionally not used if + +\begin{itemize} +\item there exist, at compile time, applicable methods on the + reader/writer generic function that are not standard accessor + methods (for instance, there exist around-methods), or + +\item applicable reader/writer methods access different slots in a + class accessed inline, and one of its subclasses. +\end{itemize} + +The consequences are undefined if the compile-time environment is not +the same as the run-time environment in these respects, or if the +definition of class \code{foo} or any subclass of \code{foo} is +changed in an incompatible way, that is, if slot locations change. + +The effect of the \code{inline} optimization combined with the +\code{slot-boundp} optimization is that CLOS slot access becomes as +fast as structure slot access, which is an order of magnitude faster +than normal CLOS slot access. + +\begin{defvar}{pcl::}{optimize-inline-slot-access-p} + This variable controls if inline slot access optimizations are + performed. It is true by default. +\end{defvar} + + + +\subsubsection{Automatic Method Recompilation} +\cindex{methods} +\cpsubindex{methods}{auto-compilation} +\cpsubindex{slot declaration}{method recompilation} + +Methods using inline slot access can be automatically recompiled after +class changes. Two declarations control which methods are +automatically recompiled. + +\begin{example} +declaim (ext:auto-compile specifier*) +declaim (ext:not-auto-compile specifier*) + +specifier ::= gf-name | (gf-name qualifier* (specializer*)) +gf-name ::= the name of a generic function +qualifier ::= a method qualifier +specializer ::= a method specializer +\end{example} + +If no specifier is given, auto-compilation is by default done/not done +for all methods of all generic functions using inline slot access; +current default is that it is not done. This global policy can be +overridden on a generic function and method basis. If +\code{specifier} is a generic function name, it applies to all methods +of that generic function. + +Examples: + +\begin{example} +(declaim (ext:auto-compile foo)) +(defmethod foo :around ((x bar)) ...) +\end{example} + +The around-method \code{foo} will be automatically recompiled because +the declamation applies to all methods with name \code{foo}. + +\begin{example} +(declaim (ext:auto-compile (foo (bar)))) +(defmethod foo :around ((x bar)) ...) +(defmethod foo ((x bar)) ...) +\end{example} + +The around-method will not be automatically recompiled, but the +primary method will. + +\begin{example} +(declaim (ext:auto-compile foo)) +(declaim (ext:not-auto-compile (foo :around (bar))) +(defmethod foo :around ((x bar)) ...) +(defmethod foo ((x bar)) ...) +\end{example} + +The around-method will not be automatically recompiled, because it +is explicitly declaimed not to be. The primary method will be +automatically recompiled because the first declamation applies to +it. + +Auto-recompilation works by recording method bodies using inline slot +access. When PCL determines that a recompilation is necessary, a +\code{defmethod} form is constructed and evaluated. + +Auto-compilation can only be done for methods defined in a null +lexical environment. PCL prints a warning and doesn't record the +method body if a method using inline slot access is defined in a +non-null lexical environment. Instead of doing a recompilation on +itself, PCL will then print a warning that the method must be +recompiled manually when classes are changed. + + + +\subsection{Inlining Methods in Effective Methods} +\cindex{effective method} +\cpsubindex{methods}{inlining in effective methods} +\cpsubindex{effective method}{inlining of methods} +\cindex{inline} + +When a generic function is called, an effective method is constructed +from applicable methods. The effective method is called with the +original arguments, and itself calls applicable methods according to +the generic function's method combination. Some of the function call +overhead in effective methods can be removed by inlining methods in +effective methods, at the expense of increased code size. + +Inlining of methods is controlled by the usual \code{inline} +declaration. In the following example, both \code{foo} methods shown +will be inlined in effective methods: + +\begin{example} +(declaim (inline (method foo (foo)) + (method foo :before (foo)))) +(defmethod foo ((x foo)) ...) +(defmethod foo :before ((x foo)) ...) +\end{example} + +Please note that this form of inlining has no noticeable effect for +effective methods that consist of a primary method only, which doesn't +have keyword arguments. In such cases, PCL uses the primary method +directly for the effective method. + +When the definition of an inlined method is changed, effective methods +are \textbf{not} automatically updated to reflect the change. This is +just as it is when inlining normal functions. Different from the +normal case is that users do not have direct access to effective +methods, as it would be the case when a function is inlined somewhere +else. Because of this, the function \code{pcl:flush-emf-cache} is +provided for forcing such an update of effective methods. + +\begin{defun}{pcl:}{flush-emf-cache}{\ampoptional{} \var{gf}} + Flush cached effective method functions. If \code{gf} is supplied, + it should be a generic function metaobject or the name of a generic + function, and this function flushes all cached effective methods for + the given generic function. If \code{gf} is not supplied, all + cached effective methods are flushed. +\end{defun} + +\begin{defvar}{pcl::}{inline-methods-in-emfs} + If true, the default, perform method inlining as described above. + If false, don't. +\end{defvar} + + + +\subsection{Effective Method Precomputation} +\cpsubindex{effective method}{precomputation} +\cpsubindex{methods}{load time} +\cpsubindex{methods}{emf precomputation} + +When a generic function is called, the generic function's +discriminating function computes the set of methods applicable to +actual arguments and constructs an effective method function from +applicable methods, using the generic function's method combination. + +Effective methods can be precomputed at method load time instead of +when the generic function is called depending on the value of +\code{pcl:*max-emf-precomputation-methods*}. + +\begin{defvar}{pcl:}{*max-emf-precomputation-methods*} + If nonzero, the default value is 100, precompute effective methods + when methods are loaded, and the method's generic function has less + than the specified number of methods. + + If zero, compute effective methods only when the generic function is + called. +\end{defvar} + + + +\subsection{Sealing} +\cindex{sealing} +\cpsubindex{sealing}{subclasses} +\cpsubindex{sealing}{methods} +\cpsubindex{methods}{sealing} + +Support for sealing classes and generic functions have been +implemented. Please note that this interface is subject to change. + +\begin{defmac}{pcl:}{seal}{\var{name} (\var{var}) \amprest{} \var{specifiers}} + Seal \code{name} with respect to the given specifiers; \code{name} + can be the name of a class or generic-function. + + Supported specifiers are \kwd{subclasses} for classes, + which prevents changing subclasses of a class, and \kwd{methods} + which prevents changing the methods of a generic function. + + Sealing violations signal an error of type \code{pcl:sealed-error}. +\end{defmac} + +\begin{defun}{pcl:}{unseal}{\var{name-or-object}} + Remove seals from \code{name-or-object}. +\end{defun} + + + +\subsection{Method Tracing and Profiling} +\label{sec:method-tracing} +\cindex{tracing} +\cpsubindex{tracing}{methods} +\cindex{profiling} +\cpsubindex{profiling}{methods} +\cpsubindex{methods}{tracing} +\cpsubindex{methods}{profiling} + +Methods can be traced with \code{trace}, using function names of the +form \code{(method )}. Example: + +\begin{example} +(defmethod foo ((x integer)) x) +(defmethod foo :before ((x integer)) x) + +(trace (method foo (integer))) +(trace (method foo :before (integer))) +(untrace (method foo :before (integer))) +\end{example} + +\code{trace} and \code{untrace} also allow a name specifier +\code{:methods gf-form} for tracing all methods of a generic function: + +\begin{example} +(trace :methods 'foo) +(untrace :methods 'foo) +\end{example} + +Methods can also be specified for the \kwd{wherein} option to +\code{trace}. Because this option is a name or a list of names, +methods must be specified as a list. Thus, to trace all calls of +\code{foo} from the method \code{bar} specialized on integer argument, +use +\begin{example} + (trace foo :wherein ((method bar (integer)))) +\end{example} +Before and after methods are supported as well: +\begin{example} + (trace foo :wherein ((method bar :before (integer)))) +\end{example} + +Method profiling is done analogously to \code{trace}: + +\begin{example} +(defmethod foo ((x integer)) x) +(defmethod foo :before ((x integer)) x) + +(profile:profile (method foo (integer))) +(profile:profile (method foo :before (integer))) +(profile:unprofile (method foo :before (integer))) + +(profile:profile :methods 'foo) +(profile:unprofile :methods 'foo) + +(profile:profile-all :methods t) +\end{example} + + + +\subsection{Misc} +\cpsubindex{methods}{interpreted} + +\begin{defvar}{pcl::}{compile-interpreted-methods-p} + This variable controls compilation of interpreted method functions, + e.g. for methods defined interactively at the REPL. Default is + true, that is, method functions are compiled. +\end{defvar} + + + + + +\section{Differences from ANSI Common Lisp} +This section describes some of the known differences between \cmucl{} +and ANSI \clisp{}. Some may be non-compliance issues; same may be +extensions. + +\subsection{Extensions} + +\begin{defun}{}{constantly}{% + \var{value} \ampoptional{} \var{val1} \var{val2} \amprest{} \var{more-values}} + As an extension, \cmucl{} allows \code{constantly} to accept more + than one value which are returned as multiple values. +\end{defun} + + + + +\section{Function Wrappers} +\cindex{function wrappers} +\cindex{fwrappers} + +Function wrappers, fwrappers for short, are a facility for efficiently +encapsulating functions\footnote{This feature was independently +developed, but the interface is modelled after a similar feature in +Allegro. Some names, however, have been changed.}. + +Functions in \cmucl{} are represented by \code{kernel:fdefn} +objects. Each \code{fdefn} object contains a reference to its +function's actual code, which we call the function's primary function. + +A function wrapper replaces the primary function in the \code{fdefn} +object with a function of its own, and records the original function +in an fwrapper object, a funcallable instance. Thus, when the +function is called, the fwrapper gets called, which in turn might call +the primary function, or a previously installed fwrapper that was +found in the \code{fdefn} object when the second fwrapper was +installed. + +Example: + +\begin{lisp} +(use-package :fwrappers) + +(define-fwrapper foo (x y) + (format t "x = ~s, y = ~s, user-data = ~s~%" + x y (fwrapper-user-data fwrapper)) + (let ((value (call-next-function))) + (format t "value = ~s~%" value) + value)) + +(defun bar (x y) + (+ x y)) + +(fwrap 'bar #'foo :type 'foo :user-data 42) + +(bar 1 2) + => + x = 1, y = 2, user-data = 42 + value = 3 + 3 +\end{lisp} + +Fwrappers are used in the implementation of \code{trace} and +\code{profile}. + +Please note that \code{fdefinition} always returns the primary +definition of a function; if a function is fwrapped, +\code{fdefinition} returns the primary function stored in the +innermost fwrapper object. Likewise, if a function is fwrapped, +\code{(setf fdefinition)} will set the primary function in the +innermost fwrapper. + +\begin{defmac}{fwrappers:}{define-fwrapper}{\var{name} \var{lambda-list} \ampbody{} \var{body}} + This macro is like \code{defun}, but defines a function named + \var{name} that can be used as an fwrapper definition. + + In \var{body}, the symbol \code{fwrapper} is bound to the current + fwrapper object. + + The macro \code{call-next-function} can be used to invoke the next + fwrapper, or the primary function that is being fwrapped. When + called with no arguments, \code{call-next-function} invokes the next + function with the original arguments passed to the fwrapper, unless + you modify one of the parameters. When called with arguments, + \code{call-next-function} invokes the next function with the given + arguments. +\end{defmac} + +\begin{defun}{fwrappers:}{fwrap}{\var{function-name} \var{fwrapper} % + \keys{\kwd{type} \kwd{user-data}}} + This function wraps function \code{function-name} in an fwrapper + \var{fwrapper} which was defined with \code{define-fwrapper}. + + The value of \var{type}, if supplied, is used as an identifying + tag that can be used in various other operations. + + The value of \var{user-data} is stored as user-supplied data in the + fwrapper object that is created for the function encapsulation. + User-data is accessible in the body of fwrappers defined with + \code{define-fwrapper} as \code{(fwrapper-user-data fwrapper)}. + + Value is the fwrapper object created. +\end{defun} + +\begin{defun}{fwrappers:}{funwrap}{\var{function-name} \keys{\kwd{type} \kwd{test}}} + Remove fwrappers from the function named \var{function-name}. If + \var{type} is supplied, remove fwrappers whose type is \code{equal} + to \var{type}. If \var{test} is supplied, remove fwrappers + satisfying \var{test}. +\end{defun} + +\begin{defun}{fwrappers:}{find-fwrapper}{\var{function-name} \keys{\kwd{type} \kwd{test}}} + Find an fwrapper of \var{function-name}. If \var{type} is supplied, + find an fwrapper whose type is \code{equal} to \var{type}. If + \var{test} is supplied, find an fwrapper satisfying \var{test}. +\end{defun} + +\begin{defun}{fwrappers:}{update-fwrapper}{\var{fwrapper}} + Update the funcallable instance function of the fwrapper object + \var{fwrapper} from the definition of its function that was + defined with \code{define-fwrapper}. This can be used to update + fwrappers after changing a \code{define-fwrapper}. +\end{defun} + +\begin{defun}{fwrappers:}{update-fwrappers}{\var{function-name} \keys{\kwd{type} \kwd{test}}} + Update fwrappers of \var{function-name}; see \code{update-fwrapper}. + If \var{type} is supplied, update fwrappers whose type is + \code{equal} to \var{type}. If \var{test} is supplied, update fwrappers + satisfying \var{test}. +\end{defun} + +\begin{defun}{fwrappers:}{set-fwrappers}{\var{function-name} \var{fwrappers}} + Set \var{function-names}'s fwrappers to elements of the list + \var{fwrappers}, which is assumed to be ordered from outermost to + innermost. \var{fwrappers} null means remove all fwrappers. +\end{defun} + +\begin{defun}{fwrappers:}{list-fwrappers}{\var{function-name}} + Return a list of all fwrappers of \var{function-name}, ordered + from outermost to innermost. +\end{defun} + +\begin{defun}{fwrappers:}{push-fwrapper}{\var{fwrapper} \var{function-name}} + Prepend fwrapper \var{fwrapper} to the definition of + \var{function-name}. Signal an error if \var{function-name} is an + undefined function. +\end{defun} + +\begin{defun}{fwrappers:}{delete-fwrapper}{\var{fwrapper} \var{function-name}} + Remove fwrapper \var{fwrapper} from the definition of + \var{function-name}. Signal an error if \var{function-name} is an + undefined function. +\end{defun} + +\begin{defmac}{fwrappers:}{do-fwrappers}{(\var{var} \var{fdefn} \ampoptional{} + \var{result}) \ampbody{} \var{body}} + Evaluate \var{body} with \var{var} bound to consecutive fwrappers of + \var{fdefn}. Return \var{result} at the end. Note that \var{fdefn} + must be an \code{fdefn} object. You can use + \code{kernel:fdefn-or-lose}, for instance, to get the \code{fdefn} + object from a function name. +\end{defmac} + +\section{Dynamic-Extent Declarations} +\cindex{dynamic-extent} + +\emph{Note: As of the 19a release, \code{dynamic-extent} is + unfortunately disabled by default. It is known to cause some issues + with CLX and Hemlock. The cause is not known, but causes random + errors and brokeness. Enable at your own risk. However, it is safe + enough to build all of CMUCL without problems.} + +On x86 and sparc, \cmucl{} can exploit \code{dynamic-extent} +declarations by allocating objects on the stack instead of the heap. + +You can tell \cmucl{} to trust or not trust \code{dynamic-extent} +declarations by setting the variable +\var{*trust-dynamic-extent-declarations*}. + +\begin{defvar}{ext:}{trust-dynamic-extent-declarations} + If the value of \var{*trust-dynamic-extent-declarations*} is + \code{NIL}, \code{dynamic-extent} declarations are effectively + ignored. + + If the value of this variable is a function, the function is called + with four arguments to determine if a \code{dynamic-extent} + declaration should be trusted. The arguments are the safety, + space, speed, and debug settings at the point where the + \code{dynamic-extent} declaration is used. If the function + returns true, the declaration is trusted, otherwise it is not + trusted. + + In all other cases, \code{dynamic-extent} declarations are + trusted. +\end{defvar} + +Please note that stack-allocation is inherently unsafe. If you make a +mistake, and a stack-allocated object or part of it escapes, \cmucl{} +is likely to crash, or format your hard disk. + +\subsection{\code{\&rest} argument lists} +\cpsubindex{dynamic-extent}{rest lists} + +Rest argument lists can be allocated on the stack by declaring the +rest argument variable \code{dynamic-extent}. Examples: + +\begin{lisp} +(defun foo (x &rest rest) + (declare (dynamic-extent rest)) + ...) + +(defun bar () + (lambda (&rest rest) + (declare (dynamic-extent rest)) + ...)) +\end{lisp} + +\subsection{Closures} +\cpsubindex{dynamic-extent}{closures} + +Closures for local functions can be allocated on the stack if the +local function is declared \code{dynamic-extent}, and the closure +appears as an argument in the call of a named function. In the +example: + +\begin{lisp} +(defun foo (x) + (flet ((bar () x)) + (declare (dynamic-extent #'bar)) + (baz #'bar))) +\end{lisp} + +the closure passed to function \code{baz} is allocated on the stack. +Likewise in the example: + +\begin{lisp} +(defun foo (x) + (flet ((bar () x)) + (baz #'bar) + (locally (declare (dynamic-extent #'bar)) + (baz #'bar)))) +\end{lisp} + +\cpsubindex{dynamic-extent}{known CL functions} + +Stack-allocation of closures can also automatically take place when +calling certain known CL functions taking function arguments, for +example \code{some} or \code{find-if}. + +\subsection{\code{list}, \code{list*}, and \code{cons}} +\cpsubindex{dynamic-extent}{list, list*, cons} + +New conses allocated by \code{list}, \code{list*}, or \code{cons} +which are used to initialize variables can be allocated from the stack +if the variables are declared \code{dynamic-extent}. In the case of +\code{cons}, only the outermost cons cell is allocated from the stack; +this is an arbitrary restriction. + +\begin{lisp} +(let ((x (list 1 2)) + (y (list* 1 2 x)) + (z (cons 1 (cons 2 nil)))) + (declare (dynamic-extent x y z)) + ... + (setq x (list 2 3)) + ...) +\end{lisp} + +Please note that the \code{setq} of \code{x} in the example program +assigns to \code{x} a list that is allocated from the heap. This is +another arbitrary restriction that exists because other Lisps behave +that way. + +\section{Modular Arithmetic} +\cindex{modular-arith} + +This section is mostly taken, with permission, from the documentation +for SBCL. + +Some numeric functions have a property: \code{N} lower bits of +the result depend only on \code{N} lower bits of (all or some) +arguments. If the compiler sees an expression of form \code{(logand +exp mask)}, where \code{exp} is a tree of such ``good'' functions +and \code{mask} is known to be of type \code{(unsigned-byte +w)}, where \code{w} is a "good" width, all intermediate results +will be cut to \code{w} bits (but it is not done for variables +and constants!). This often results in an ability to use simple +machine instructions for the functions. + +Consider an example. +\begin{lisp} +(defun i (x y) + (declare (type (unsigned-byte 32) x y)) + (ldb (byte 32 0) (logxor x (lognot y)))) +\end{lisp} +The result of \code{(lognot y)} will be negative and of +type \code{(signed-byte 33)}, so a naive implementation on a 32-bit +platform is unable to use 32-bit arithmetic here. But modular +arithmetic optimizer is able to do it: because the result is cut down +to 32 bits, the compiler will replace \code{logxor} +and \code{lognot} with versions cutting results to 32 bits, and +because terminals (here---expressions \code{x} and \code{y}) +are also of type \code{(unsigned-byte 32)}, 32-bit machine +arithmetic can be used. + + +Currently ``good'' functions +are \code{+}, \code{-}, \code{*}; \code{logand}, \code{logior}, +\code{logxor}, \code{lognot} and their combinations; +and \code{ash} with the positive second argument. ``Good'' widths +are 32 on HPPA, MIPS, PPC, Sparc and X86 and 64 on Alpha. While it is +possible to support smaller widths as well, currently it is not +implemented. + +A more extensive description of modular arithmetic can be found in the +paper ``Efficient Hardware Arithmetic in Common Lisp'' by Alexey +Dejneka, and Christophe Rhodes, to be published. + +\section{Extension to REQUIRE} +\cindex{require} + +The behavior of \code{require} when called with only one argument is +implementation-defined. In \cmucl, functions from the list +\var{*module-provider-functions*} are called in order with the +stringified module name as the argument. The first function to return +non-\var{NIL} is assumed to have loaded the module. + +By default the functions \code{module-provide-cmucl-defmodule} and +\code{module-provide- cmucl-library} are on this list of functions, in +that order. + +\begin{defvar}{ext:}{module-provider-functions} + This is a list of functions taking a single argument. + \code{require} calls each function in turn with the stringified + module name. The first function to return non-\var{NIL} indicates + that the module has been loaded. The remaining functions, if any, + are not called. + + To add new providers, push the new provider function onto the + beginning of this list. +\end{defvar} + +\begin{defmac}{ext:}{defmodule}{\var{name} \amprest{} \var{files}} + Defines a module by registering the files that need to be loaded + when the module is required. If \var{name} is a symbol, its print + name is used after downcasing it. +\end{defmac} + +\begin{defun}{ext:}{module-provide-cmucl-defmodule}{\var{module-name}} + This function is the module-provider for modules registered by a + \code{ext:defmodule} form. +\end{defun} + +\begin{defun}{ext:}{module-provide-cmucl-library}{\var{module-name}} + This function is the module-provider for \cmucl's libraries, + including Gray streams, simple streams, CLX, CLM, Hemlock, + \emph{etc}. + + This function causes a file to be loaded whose name is formed by + merging the search-list ``modules:'' and the concatenation of + module-name with the suffix ``-LIBRARY''. Note that both the + module-name and the suffix are each, separately, converted from + :case :common to :case :local. This merged name will be probed with + both a .lisp and .fasl extensions, calling \code{LOAD} if it exists. +\end{defun} + + +\section{Localization} +\label{sec:localization} + +\cmucl{} support localization where messages can be presented in the +native language. This is done in the style of \code{gettext} which +marks strings that are to be translated and provides the lookup to +convert the string to the specified language. + +All messages from \cmucl{} can be translated but as of this writing, +the only complete translation is a Pig Latin translation done by +machine. There are a few messages translated to Korean. + +In general, translatable strings are marked as such by using the +functions \code{intl:gettext} and \code{intl:ngettext} or by using the +reader macros \verb+_+ or \verb+_N+. When loading or compiling, such +strings are recorded for translation. At runtime, such strings are +looked in and the translation is returned. Doc strings do not need to +be noted in any way; the are automatically noted for translation. + +By default, recording of translatable strings is disabled. To enable +recording of strings, call \code{intl:translation-enable}. + +\subsection{Dictionary} +\label{sec:localization-dictionary} + +\begin{defun}{intl:}{translation-enable}{} + Enable recording of translatable strings. +\end{defun} + +\begin{defun}{intl:}{translation-disable}{} + Disablle recording of translatable strings. +\end{defun} + +\begin{defun}{intl:}{setlocale}{\ampoptional{} \var{locale}} + Sets the locale to the locale specified by \var{locale}. If + \var{locale} is not give or is \nil, the locale is determined by + look at the environment variables \code{LANGUAGE}, \code{LC\_ALL}, + \code{LC\_MESSAGES}, or \code{LANG}. If none of these are set, the + locale is unchanged. + + The default locale is ``C''. +\end{defun} + +\begin{defun}{intl:}{textdomain}{\var{domain}} + Set the default domain to the domain specified by \var{domain}. + Typically, this only needs to be done at the top of each source + file. This is used to \code{gettext} and \code{ngettext} to set the + domain for the message string. +\end{defun} + +\begin{defmac}{intl:}{gettext}{\var{string}} + Look up the specified string, \var{string}, in the current message + domain and return its translation. +\end{defmac} + +\begin{defun}{intl:}{dgettext}{\var{domain} \var{string}} + Look up the specified string, \var{string}, in the message domain, + \var{domain}. The translation is returned. + + When compiled, this also function also records the string so that an + appropriate message template file can be created. (See + \code{intl::dump-pot-files}.) +\end{defun} + +\begin{defmac}{intl:}{ngettext}{\var{singular} \var{plural} \var{n}} + Look up the singular or plural form of a message in the default + domain. The singular form is \var{singular}; the plural is + \var{plural}. The number of items is specified by \var{n} in case + the correct translation depends on the actual number of items. +\end{defmac} + +\begin{defun}{intl:}{dngettext}{\var{domain} \var{singular} \var{plural} \var{n}} + Look up the singular or plural form of a message in the specified + domain, \var{domain}. The singular form is \var{singular}; the + plural is \var{plural}. The number of items is specified by \var{n} + in case the correct translation depends on the actual number of + items. + + When compiled, this also function also records the singular and + plural forms so that an appropriate message template file can be + created. (See \code{intl::dump-pot-files}.) +\end{defun} + +\begin{defun}{intl::}{dump-pot-files}{\keys{\kwd{copyright} \kwd{output-directory}}} + Dumps the translatable strings recorded by \code{dgettext} and + \code{dngettext}. The message template file (pot file) is written + to a file in the directory specified by \var{output-directory}, and + the name of the file is the domain of the string. + + If \var{copyright} is specified, this is placed in the output file + as the copyright message. +\end{defun} + +\begin{defvar}{intl:}{locale-directories} + This is a list of directory pathnames where the translations can be found. +\end{defvar} + +\begin{defun}{intl:}{install}{\ampoptional{} (\var{rt} \var{*readtable*})} + Installs reader macros and comment reader into the specified + readtable as explained below. The readtable defaults to + \var{*readtable*}. +\end{defun} + +Two reader macros are also provided: \code{\_''} and \code{\_N''}. The +first is equivalent to wrapping \code{dgettext} around the string. +The second returns the string, but also records the string. This is +needed when we want to record a docstring for translation or any other +string in a place where a macro or function call would be incorrect. + +Also, the standard comment reader is extended to allow translator +comments to be saved and written to the messages template file so that +the translator may not need to look at the original source to +understand the string. Any comment line that begins with exactly +\verb|"TRANSLATORS: "| is saved. This means each translator comment +must be preceded by this string to be saved; the translator comment +ends at the end of each line. + + +\subsection{Example Usage} +\label{sec:localization-usage} + +Here is a simple example of how to localize your code. Let the file +\code{intl-ex.lisp} contain: + +\begin{example} + +(intl:textdomain "example") + +(defun foo (x y) + "Cool function foo of x and y" + (let ((result (bar x y))) + ;; TRANSLATORS: One line comment about bar. + (format t _"bar of ~A and ~A = ~A~%" x y result) + #| TRANSLATORS: Multiline comment about + how many Xs there are + |# + (format t (intl:ngettext "There is one X" + "There are many Xs" + x)) + result)) +\end{example} + +The call to \code{textdomain} sets the default domain for all +translatable strings following the call. + +Here is a sample session for creating a template file: + +\begin{example} +* (intl:install) + +T +* (intl:translation-enable) + +T +* (compile-file "intl-ex") + +#P"/Volumes/share/cmucl/cvs/intl-ex.sse2f" +NIL +NIL +* (intl::dump-pot-files :output-directory "./") + +Dumping 3 messages for domain "example" +NIL +* +\end{example} + +When this file is compiled, all of the translatable strings are +recorded. This includes the docstring for \code{foo}, the string for +the first \code{format}, and the string marked by the call to +\code{intl:ngettext}. + +A file named ``example.pot'' in the directory ``./'' is created. +The contents of this file are: +\begin{example} +#@ example + +# SOME DESCRIPTIVE TITLE +# FIRST AUTHOR , YEAR +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION" +"Report-Msgid-Bugs-To: " +"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE" +"Last-Translator: FULL NAME " +"Language-Team: LANGUAGE " +"MIME-Version: 1.0" +"Content-Type: text/plain; charset=UTF-8" +"Content-Transfer-Encoding: 8bit" + +#. One line comment about bar. +#: intl-ex.lisp +msgid "bar of ~A and ~A = ~A~%" +msgstr "" + +#. Multiline comment about + how many Xs there are +#: intl-ex.lisp +msgid "Cool function foo of x and y" +msgstr "" + +#: intl-ex.lisp +msgid "There is one X" +msgid_plural "There are many Xs" +msgstr[0] "" + +\end{example} + +To finish the translation, a corresponding ``example.po'' file needs +to be created with the appropriate translations for the given +strings. This file must be placed in some directory that is included +in \code{intl:*locale-directories*}. + +Suppose the translation is done for Korean. Then the user can set the +environment variables appropriately or call \code{(intl:setlocale + "ko")}. Note that the external format for the standard streams +needs to be set up appropriately too. It is up to the user to set +this correctly. Once this is all done, the output from the function +\code{foo} will now be in Korean instead of English as in the original +source file. + +For further information, we refer the reader to documentation on +\ifpdf +\href{http://www.gnu.org/software/gettext/manual/gettext.html}{gettext}. +\else +gettext at +\href{http://www.gnu.org/software/gettext/manual/gettext.html}{\texttt{http://www.gnu.org/software/gettext/manual/gettext.html}}. +\fi + +\section{Static Arrays} +\label{sec:static-arrays} + +\cmucl{} supports static arrays which are arrays that are not moved by +the garbage collector. To create such an array, use the +\kwd{allocation} option to \code{make-array} with a value of +\kwd{malloc}. These arrays appear as normal Lisp arrays, but are +actually allocated from the \code{C} heap (hence the \kwd{malloc}). +Thus, the number and size of such arrays are limited by the available +\code{C} heap. + +Also, only certain types of arrays can be allocated. The static array +cannot be adjustable and cannot be displaced to. The array must also +be a \code{simple-array} of one dimension. The element type is also +constrained to be one of the types in +Table~\ref{tbl:static-array-types}. + +\begin{table}[tbhp] + \begin{center} + \begin{tabular}{|c|} + \hline + \code{(unsigned-byte 8)} \\ + \hline + \code{(unsigned-byte 16)} \\ + \hline + \code{(unsigned-byte 32)} \\ + \hline + \code{(signed-byte 8)} \\ + \hline + \code{(signed-byte 16)} \\ + \hline + \code{(signed-byte 32)} \\ + \hline + \code{single-float} \\ + \hline + \code{double-float} \\ + \hline + \code{(complex single-float)} \\ + \hline + \code{(complex double-float)} \\ + \hline + \end{tabular} + \caption{Allowed element types for static arrays} + \label{tbl:static-array-types} + \end{center} +\end{table} + +The arrays are properly handled by GC. GC will not move the arrays, +but they will be properly removed up if they become garbage. diff --git a/doc/cmu-user/hierarchical-packages.tex b/doc/cmu-user/hierarchical-packages.tex new file mode 100644 index 0000000000..74e08a6bec --- /dev/null +++ b/doc/cmu-user/hierarchical-packages.tex @@ -0,0 +1,213 @@ +\section{Hierarchical Packages} +\cindex{hierarchical packages} + + +% this section is heavily based on the Franz Inc. documentation for +% the hierarchical packages feature, as per +% +% accessed on 2002-03-18. It is used by permission from Kevin Layer, +% obtained in email to Eric Marsden, in response to spr25795. +% +% Allegro-specific references in the document have been removed. + + +\subsection{Introduction} + +The \clisp{} package system, designed and standardized several years +ago, is not hierarchical. Since \clisp{} was standardized, other +languages, including Java and Perl, have evolved namespaces which are +hierarchical. This document describes a hierarchical package naming +scheme for \clisp{}. The scheme was proposed by Franz Inc and +implemented in their \textit{Allegro Common Lisp} product; a +compatible implementation of the naming scheme is implemented in +\cmucl{}. This documentation is based on the Franz Inc. documentation, +and is included with permission. + +The goals of hierarchical packages in \clisp{} are: + +\begin{itemize} +\item +Reduce collisions with user-defined packages: it is a well-known +problem that package names used by the Lisp implementation and those +defined by users can easily conflict. The intent of hierarchical +packages is to reduce such conflicts to a minimum. + +\item +Improve modularity: the current organization of packages in various +implementations has grown over the years and appears somewhat random. +Organizing future packages into a hierarchy will help make the +intention of the implementation more clear. + +\item +Foster growth in \clisp{} programs, or modules, available to the CL +community: the Perl and Java communities are able to contribute code +to repositories, with minimal fear of collision, because of the +hierarchical nature of the name spaces used by the contributed code. +We want the Lisp community to benefit from shared modules in the same +way. +\end{itemize} + +In a nutshell, a dot (\verb|.|) is used to separate levels in package +names, and a leading dot signifies a relative package name. The choice +of dot follows Java. Perl, another language with hierarchical +packages, uses a colon (\verb|:|) as a delimiter, but the colon is +already reserved in \clisp{}. Absolute package names require no +modifications to the underlying \clisp{} implementation. Relative +package names require only small and simple modifications. + + +\subsection{Relative Package Names} + +Relative package names are needed for the same reason as relative +pathnames, for brevity and to reduce the brittleness of absolute +names. A relative package name is one that begins with one or more +dots. A single dot means the current package, two dots mean the parent +of the current package, and so on. + +Table~\ref{tbl:hierarchical-packages} presents a number of examples, +assuming that the packages named \verb|foo|, \verb|foo.bar|, +\verb|mypack|, \verb|mypack.foo|, \verb|mypack.foo.bar|, +\verb|mypack.foo.baz|, \verb|mypack.bar|, and \verb|mypack.bar.baz|, +have all been created. + +\begin{table}[h] +\begin{center} +\begin{tabular}{|l|l|l|} +\hline +relative name & current package & absolute name of referenced package \\ +\hline +foo & any & foo \\ +foo.bar & any & foo.bar \\ +.foo & mypack & mypack.foo \\ + .foo.bar & mypack & mypack.foo.bar \\ + ..foo & mypack.bar & mypack.foo \\ + ..foo.baz & mypack.bar & mypack.foo.baz \\ + ...foo & mypack.bar.baz & mypack.foo \\ + . & mypack.bar.baz & mypack.bar.baz \\ + .. & mypack.bar.baz & mypack.bar \\ + ... & mypack.bar.baz & mypack \\ +\hline +\end{tabular} +\end{center} +\caption{Examples of hierarchical packages} +\label{tbl:hierarchical-packages} +\end{table} + +Additional notes: + +\begin{enumerate} +\item +All packages in the hierarchy must exist. + +\item +\textbf{Warning about nicknames}: Unless you provide nicknames for +your hierarchical packages (and we recommend against doing so because +the number gets quite large), you can only use the names supplied. You +cannot mix in nicknames or alternate names. \code{cl-user} +is nickname of the \code{common-lisp-user} package. +Consider the following: + +\begin{verbatim} + (defpackage :cl-user.foo) +\end{verbatim} + +When the current package (the value of the variable \code{*package*}) +is \code{common-lisp-user}, you might expect \verb|.foo| to refer to +\verb|cl-user.foo|, but it does not. It actually refers to the non-existent +package \verb|common-lisp-user.foo|. Note that the purpose of +nicknames is to provide shorter names in place of the longer names +that are designed to be fully descriptive. The hope is that +hierarchical packages makes longer names unnecessary and thus makes +nicknames unnecessary. + +\item +Multiple dots can only appear at the beginning of a package name. For +example, \verb|foo.bar..baz| does not mean \verb|foo.baz| -- it is +invalid. (Of course, it is perfectly legal to name a package +\verb|foo.bar..baz|, but \code{cl:find-package} will not process such +a name to find \verb|foo.baz| in the package hierarchy.) +\end{enumerate} + + +\subsection{Compatibility with ANSI \clisp{}} + +The implementation of hierarchical packages modifies the +\code{cl:find-package} function, and provides certain auxiliary +functions, \code{package-parent}, \code{package-children}, and +\code{relative-package-name-to-package}, as described in this section. +The function \code{defpackage} itself requires no modification. + +While the changes to \code{cl:find-package} are small and described +below, it is an important consideration for authors who would like +their programs to run on a variety of implementations that using +hierarchical packages will work in an implementation without the +modifications discussed in this document. We show why after +describing the changes to \code{cl:find-package}. + +Absolute hierarchical package names require no changes in the +underlying \clisp{} implementation. + + +\subsubsection{Changes to \code{cl:find-package}} + +Using relative hierarchical package names requires a simple +modification of \code{cl:find-package}. + +In ANSI \clisp{}, \code{cl:find-package}, if passed a package object, +returns it; if passed a string, \code{cl:find-package} looks for a +package with that string as its name or nickname, and returns the +package if it finds one, or returns nil if it does not; if passed a +symbol, the symbol name (a string) is extracted and +\code{cl:find-package} proceeds as it does with a string. + +For implementing hierarchical packages, the behavior when the argument +is a package object (return it) does not change. But when the argument +is a string starting with one or more dots not directly naming a +package, \code{cl:find-package} will, instead of returning nil, check +whether the string can be resolved as naming a relative package, and +if so, return the associated absolute package object. (If the argument +is a symbol, the symbol name is extracted and \code{cl:find-package} +proceeds as it does with a string argument.) + +Note that you should not use leading dots in package names when using +hierarchical packages. + +\subsubsection{Using Hierarchical Packages without Modifying cl:find-package} + +Even without the modifications to \code{cl:find-package}, authors need +not avoid using relative package names, but the ability to reuse +relative package names is restricted. Consider for example a module +\textit{foo} which is composed of the \verb|my.foo.bar| and +\verb|my.foo.baz| packages. In the code for each of the these packages +there are relative package references, \verb|..bar| and \verb|..baz|. + +Implementations that have the new \code{cl:find-package} would have +\verb|:relative-package-names| on their \code{*features*} +list (this is the case of \cmucl{} releases starting from 18d). Then, +in the \textit{foo} module, there would be definitions of the +\verb|my.foo.bar| and \verb|my.foo.baz| packages like so: + +\begin{verbatim} + (defpackage :my.foo.bar + #-relative-package-names (:nicknames #:..bar) + ...) + + (defpackage :my.foo.baz + #-relative-package-names (:nicknames #:..baz) + ...) +\end{verbatim} + +Then, in a \verb|#-relative-package-names| implementation, the symbol +\verb|my.foo.bar:blam| would be visible from \verb|my.foo.baz| as +\verb|..bar:blam|, just as it would from a +\verb|#+relative-package-names| implementation. + +So, even without the implementation of the augmented +\code{cl:find-package}, one can still write \clisp{} code that will +work in both types of implementations, but \verb|..bar| and +\verb|..baz| are now used, so you cannot also have +\verb|otherpack.foo.bar| and \verb|otherpack.foo.baz| and use +\verb|..bar| and \verb|..baz| as relative names. (The point of +hierarchical packages, of course, is to allow reusing relative package +names.) + diff --git a/doc/cmu-user/internet.tex b/doc/cmu-user/internet.tex new file mode 100644 index 0000000000..da9f13e0df --- /dev/null +++ b/doc/cmu-user/internet.tex @@ -0,0 +1,341 @@ +\chapter{Networking Support} +\label{internet} + +\credits{by Mario S. Mommer} + +This chapter documents the IPv4 networking and local sockets support +offered by \cmucl{}. It covers most of the basic sockets interface +functionality in a convenient and transparent way. + +For reasons of space it would be impossible to include a thorough +introduction to network programming, so we assume some basic knowledge +of the matter. + +\section{Byte Order Converters} + +These are the functions that convert integers from host byte order to +network byte order (big-endian). + +\begin{defun}{extensions:}{htonl}{% + \args{\var{integer}}} + + Converts a $32$ bit integer from host byte order to network byte + order. + +\end{defun} + +\begin{defun}{extensions:}{htons}{% + \args{\var{integer}}} + + Converts a $16$ bit integer from host byte order to network byte + order. + +\end{defun} + +\begin{defun}{extensions:}{ntohs}{% + \args{\var{integer}}} + + Converts a $32$ bit integer from network byte order to host + byte order. + +\end{defun} + +\begin{defun}{extensions:}{ntohl}{% + \args{\var{integer}}} + + Converts a $32$ bit integer from network byte order to host byte + order. + +\end{defun} + +\section{Domain Name Services (DNS)} + +The networking support of \cmucl{} includes the possibility of doing +DNS lookups. The function + +\begin{defun}{extensions:}{lookup-host-entry}{% + \args{\var{host}}} + + returns a structure of type \var{host-entry} (explained below) for + the given \var{host}. If \var{host} is an integer, it will be + assumed to be the IP address in host (byte-)order. If it is a string, + it can contain either the host name or the IP address in dotted + format. + + This function works by completing the structure \var{host-entry}. + That is, if the user provides the IP address, then the structure will + contain that information and also the domain names. If the user + provides the domain name, the structure will be complemented with + the IP addresses along with the any aliases the host might have. + +\end{defun} + +\newpage + +\begin{deftp}{structure}{host-entry}\args{\var{name} \var{aliases} + \var{addr-type} \var{addr-list}} + + This structure holds all information available at request time on a + given host. The entries are self-explanatory. Aliases is a list of + strings containing alternative names of the host, and addr-list a + list of addresses stored in host byte order. The field + \var{addr-type} contains the number of the address family, as + specified in {\tt socket.h}, to which the addresses belong. Since + only addresses of the IPv4 family are currently supported, this slot + always has the value $2$. + +\end{deftp} + +\begin{defun}{extensions:}{ip-string}{% + \args{\var{addr}}} + + This function takes an IP address in host order and returns a string + containing it in dotted format. + +\end{defun} + +\section{Binding to Interfaces} + +In this section, functions for creating sockets bound to an interface +are documented. + +\begin{defun}{extensions:}{create-inet-listener}{% + \args{\var{port} \ampoptional{} \var{kind} % + \keys{\kwd{reuse-address} \kwd{backlog} \kwd{host}}}} + + Creates a socket and binds it to a port, prepared to receive + connections of kind \var{kind} (which defaults to \kwd{stream}), + queuing up to \var{backlog} of them. If \kwd{reuse-address} \var{T} + is used, the option SO\_REUSEADDR is used in the call to \var{bind}. + If no value is given for \kwd{host}, it will try to bind to the + default IP address of the machine where the Lisp process is running. + +\end{defun} + +\begin{defun}{extensions:}{create-unix-listener}{% + \args{\var{path} \ampoptional{} \var{kind} \keys{ + \kwd{backlog}}}} + + Creates a socket and binds it to the file name given by \var{path}, + prepared to receive connections of kind \var{kind} (which defaults + to \kwd{stream}), queuing up to \var{backlog} of them. +% If +% \kwd{reuse-address} \var{T} is used, then the file given by +% \var{path} is unlinked first. + +\end{defun} + +\section{Accepting Connections} + +Once a socket is bound to its interface, we have to explicitly accept +connections. This task is performed by the functions we document here. + +\begin{defun}{extensions:}{accept-tcp-connection}{% + \args{\var{unconnected}}} + + Waits until a connection arrives on the (internet family) socket + \var{unconnected}. Returns the file descriptor of the connection. + These can be conveniently encapsulated using file descriptor + streams; see \ref{sec:fds}. + +\end{defun} + +\begin{defun}{extensions:}{accept-unix-connection}{% + \args{\var{unconnected}}} + + Waits until a connection arrives on the (unix family) socket + \var{unconnected}. Returns the file descriptor of the connection. + These can be conveniently encapsulated using file descriptor + streams; see \ref{sec:fds}. + +\end{defun} + +\begin{defun}{extensions:}{accept-network-stream}{% + \args{\var{socket} \keys{\kwd{buffering} \kwd{timeout} \kwd{wait-max}}}} + + Accept a connect from the specified \var{socket} and returns a stream + connected to connection. +\end{defun} + +\section{Connecting} + +The task performed by the functions we present next is connecting to +remote hosts. + +\begin{defun}{extensions:}{connect-to-inet-socket}{% + \args{\var{host} \var{port} \ampoptional{} \var{kind} + \keys{\kwd{local-host} \kwd{local-port}}}} + + Tries to open a connection to the remote host \var{host} (which may + be an IP address in host order, or a string with either a host name + or an IP address in dotted format) on port \var{port}. Returns the + file descriptor of the connection. The optional parameter + \var{kind} can be either \kwd{stream} (the default) or \kwd{datagram}. + + If \var{local-host} and \var{local-port} are specified, the socket + that is created is also bound to the specified \var{local-host} and + \var{port}. + +\end{defun} + +\begin{defun}{extensions:}{connect-to-unix-socket}{% + \args{\var{path} \ampoptional{} \var{kind}}} + + Opens a connection to the unix ``address'' given by \var{path}. + Returns the file descriptor of the connection. The type of + connection is given by \var{kind}, which can be either \kwd{stream} + (the default) or \kwd{datagram}. + +\end{defun} + +\begin{defun}{extensions:}{open-network-stream}{% + \args{\var{host} \var{port} \keys{\kwd{buffering} \kwd{timeout}}}} + + Return a stream connected to the specified \var{port} on the given \var{host}. +\end{defun} + + +\section{Out-of-Band Data} +\label{internet-oob} + +Out-of-band data is data transmitted with a higher priority than +ordinary data. This is usually used by either side of the connection +to signal exceptional conditions. Due to the fact that most TCP/IP +implementations are broken in this respect, only single characters can +reliably be sent this way. + +\begin{defun}{extensions:}{add-oob-handler}{% + \args{\var{fd} \var{char} \var{handler}}} + + Sets the function passed in \var{handler} as a handler for the + character \var{char} on the connection whose descriptor is \var{fd}. + In case this character arrives, the function in \var{handler} is + called without any argument. + +\end{defun} + +\begin{defun}{extensions:}{remove-oob-handler}{% + \args{\var{fd} \var{char}}} + + Removes the handler for the character \var{char} from the connection + with the file descriptor \var{fd} + +\end{defun} + +\begin{defun}{extensions:}{remove-all-oob-handlers}{% + \args{\var{fd}}} + + After calling this function, the connection whose descriptor is + \var{fd} will ignore any out-of-band character it receives. + +\end{defun} + +\begin{defun}{extensions:}{send-character-out-of-band}{% + \args{\var{fd} \var{char}}} + + Sends the character \var{char} through the connection \var{fd} out + of band. + +\end{defun} + +\section{Unbound Sockets, Socket Options, and Closing Sockets} + +These functions create unbound sockets. This is usually not necessary, +since connectors and listeners create their own. + +\begin{defun}{extensions:}{create-unix-socket}{% + \args{\ampoptional{} \var{type}}} + + Creates a unix socket for the unix address family, of type + \var{:stream} and (on success) returns its file descriptor. + +\end{defun} + +\begin{defun}{extensions:}{create-inet-socket}{% + \args{\ampoptional{} \var{kind}}} + + Creates a unix socket for the internet address family, of type + \var{:stream} and (on success) returns its file descriptor. + +\end{defun} +\bigskip + +Once a socket is created, it is sometimes useful to bind the socket to a +local address using \code{bind-inet-socket}: + +\begin{defun}{extensions:}{bind-inet-socket}{% + \args{\var{socket} \var{host} \var{port}}} + + Bind the \var{socket} to a local interface address specified + by \var{host} and \var{port}. + +\end{defun} +\bigskip + +Further, it is desirable to be able to change socket options. This is +performed by the following two functions, which are essentially +wrappers for system calls to {\tt getsockopt} and {\tt setsockopt}. + +\begin{defun}{extensions:}{get-socket-option}{% + \args{\var{socket} \var{level} \var{optname}}} + + Gets the value of option \var{optname} from the socket \var{socket}. + +\end{defun} + +\begin{defun}{extensions:}{set-socket-option}{% + \args{\var{socket} \var{level} \var{optname} \var{optval}}} + + Sets the value of option \var{optname} from the socket \var{socket} + to the value \var{optval}. + +\end{defun} +\bigskip + +For information on possible options and values we refer to the +manpages of {\tt getsockopt} and {\tt setsockopt}, and to {\tt + socket.h} + +Finally, the function + +\begin{defun}{extensions:}{close-socket}{% + \args{\var{socket}}} + + Closes the socket given by the file descriptor \var{socket}. + +\end{defun} + +\section{Unix Datagrams} + +Datagram network is supported with the following functions. + +\begin{defun}{extensions:}{inet-recvfrom}{% + \args{\var{fd} \var{buffer} \var{size}} + \keys{\kwd{flags}}} + A simple interface to the Unix \code{recvfrom} function. Returns + three values: bytecount, source address as integer, and source + port. Bytecount can of course be negative, to indicate faults. +\end{defun} + +\begin{defun}{extensions:}{inet-sendto}{% + \args{\var{fd} \var{buffer} \var{size} \var{addr} \var{port}} + \keys{\kwd{flags}}} + A simple interface to the Unix \code{sendto} function. +\end{defun} + +\begin{defun}{extensions:}{inet-shutdown}{% + \args{\var{fd} \var{level}}} + + A simple interface to the Unix \code{shutdown} function. For + \code{level}, you may use the following symbols to close one or + both ends of a socket: \code{shut-rd}, \code{shut-wr}, + \code{shut-rdwr}. + +\end{defun} + +\section{Errors} + +Errors that occur during socket operations signal a +\code{socket-error} condition, a subtype of the \code{error} +condition. Currently this condition includes just the Unix +\code{errno} associated with the error. diff --git a/doc/cmu-user/introduction.tex b/doc/cmu-user/introduction.tex new file mode 100644 index 0000000000..9711e7242f --- /dev/null +++ b/doc/cmu-user/introduction.tex @@ -0,0 +1,357 @@ +\chapter{Introduction} + +\cmucl{} is a free, high-performance implementation of the Common Lisp +programming language which runs on most major Unix platforms. It +mainly conforms to the ANSI Common Lisp standard. Here is a summary of +its main features: + +\begin{itemize} +\item a {\em sophisticated native-code compiler} which is capable of +powerful type inferences, and generates code competitive in speed with +C compilers. + +\item generational garbage collection and multiprocessing +capability on the x86 ports. + +\item a foreign function interface which allows interfacing with C code and +system libraries, including shared libraries on most platforms, and +direct access to Unix system calls. + +\item support for interprocess communication and remote procedure +calls. + +\item an implementation of CLOS, the Common Lisp Object System, which +includes multimethods and a metaobject protocol. + +\item a graphical source-level debugger using a Motif interface, and a +code profiler. + +\item an interface to the X11 Window System (CLX), and a sophisticated +graphical widget library (Garnet). + +\item programmer-extensible input and output streams. + +\item an Emacs-like editor implemented in Common Lisp. + +\item public domain: free, with full source code and no +strings attached (and no warranty). Like GNU/Linux and the *BSD +operating systems, \cmucl{} is maintained and improved by a team of +volunteers collaborating over the Internet. +\end{itemize} + + +This user's manual contains only implementation-specific information +about \cmucl. Users will also need a separate manual describing the +\clisp{} standard, for example, the +\ifpdf +\href{http://www.lispworks.com/documentation/HyperSpec/Front/index.htm} +{Hyperspec}. +\else +\emph{Hyperspec} at \url{http://www.lispworks.com/documentation/HyperSpec/Front/index.htm} +\fi + + +In addition to the language itself, this document describes a number +of useful library modules that run in \cmucl. \hemlock, an Emacs-like +text editor, is included as an integral part of the \cmucl{} +environment. Two documents describe \hemlock{}: the {\it Hemlock +User's Manual}, and the {\it Hemlock Command Implementor's Manual}. + + +\section{Distribution and Support} + +\cmucl{} is developed and maintained by a group of volunteers who +collaborate over the internet. Sources and binary releases for the +various supported platforms can be obtained from +\href{http://www.cons.org/cmucl/}{www.cons.org/cmucl}. These pages +describe how to download by FTP or CVS. + +A number of mailing lists are available for users and developers; +please see the web site for more information. + + +\section{Command Line Options} +\cindex{command line options} +\label{command-line-options} + +The command line syntax and environment is described in the +\verb|lisp(1)| man page in the man/man1 directory of the distribution. +See also \verb|cmucl(1)|. Currently \cmucl{} accepts the following +switches: + +\begin{Lentry} +\item[\code{-{}-help}] Same as \code{-help}. + +\item[\code{-help}] Print ou the command line options and exit. + +\item[\code{-batch}] specifies batch mode, where all input is + directed from standard-input. An error code of 0 is returned upon + encountering an EOF and 1 otherwise. + +\item[\code{-quiet}] enters quiet mode. This implies setting the + variables \code{*load-verbose*}, \code{*compile-verbose*}, + \code{*compile-print*}, \code{*compile-progress*}, + \code{*require-verbose*} and \code{*gc-verbose*} to NIL, and + disables the printing of the startup banner. + +\item[\code{-core}] requires an argument that should be the name of a + core file. Rather than using the default core file, which is searched + in a number of places, according to the initial value of the + \code{library:} search-list, the specified core file is loaded. This + switch overrides the value of the \code{CMUCLCORE} environment variable, + if present. + +\item[\code{-lib}] requires an argument that should be the path to the + CMUCL library directory, which is going to be used to initialize the + \code{library:} search-list, among other things. This switch overrides + the value of the \code{CMUCLLIB} environment variable, if present. + +\item[\code{-dynamic-space-size}] requires an argument that should be + the number of megabytes (1048576 bytes) that should be allocated to + the heap. If not specified, a platform-specific default is used. + The actual maximum allowed heap size is platform-specific. + + Currently, this option is only available for the x86 and sparc + platforms. + +\item[\code{-edit}] specifies to enter Hemlock. A file to edit may be + specified by placing the name of the file between the program name + (usually \file{lisp}) and the first switch. + +\item[\code{-eval}] accepts one argument which should be a Lisp form + to evaluate during the start up sequence. The value of the form + will not be printed unless it is wrapped in a form that does output. + +\item[\code{-hinit}] accepts an argument that should be the name of + the hemlock init file to load the first time the function + \findexed{ed} is invoked. The default is to load + \file{hemlock-init.\var{object-type}}, or if that does not exist, + \file{hemlock-init.lisp} from the user's home directory. If the + file is not in the user's home directory, the full path must be + specified. + +\item[\code{-init}] accepts an argument that should be the name of an + init file to load during the normal start up sequence. The default + is to load \file{init.\var{object-type}} or, if that does not exist, + \file{init.lisp} from the user's home directory. If neither exists, + \cmucl tries \file{.cmucl-init.\var{object-type}} and then + \file{.cmucl-init.lisp}. If the file is not + in the user's home directory, the full path must be specified. If + the file does not exist, \cmucl silently ignores it. + +\item[\code{-noinit}] accepts no arguments and specifies that an init + file should not be loaded during the normal start up sequence. + Also, this switch suppresses the loading of a hemlock init file when + Hemlock is started up with the \code{-edit} switch. + +\item[\code{-nositeinit}] accepts no arguments and specifies that the + site init file should not be loaded during the normal start up + sequence. + +\item[\code{-load}] accepts an argument which should be the name of a + file to load into Lisp before entering Lisp's read-eval-print loop. + +\item[\code{-slave}] specifies that Lisp should start up as a + \i{slave} Lisp and try to connect to an editor Lisp. The name of + the editor to connect to must be specified\dash{}to find the + editor's name, use the \hemlock{} ``\code{Accept Slave + Connections}'' command. The name for the editor Lisp is of the + form: + \begin{example} + \var{machine-name}\code{:}\var{socket} + \end{example} + where \var{machine-name} is the internet host name for the machine + and \var{socket} is the decimal number of the socket to connect to. + +\item[\code{-fpu}] specifies what fpu should be used for x87 machines. + The possible values are ``\code{x87}'', ``\code{sse2}'', or + ``\code{auto}'', which is the default. By default, \cmucl will + detect if the chip supports the SSE2 instruction set or not. If so + or if \code{-fpu sse2} is specified, the SSE2 core will be loaded + that uses SSE2 for floating-point arithmetic. If SSE2 is not + available or if \code{-fpu x87} is given, the legacy x87 core is + loaded. + +\item[\code{--}] indicates that everything after ``\code{--}'' is not + subject to \cmucl's command line parsing. Everything after + ``\code{--}'' is placed in the variable + \code{ext:*command-line-application-arguments*}. +\end{Lentry} + +For more details on the use of the \code{-edit} and \code{-slave} +switches, see the {\it Hemlock User's Manual}. + +Arguments to the above switches can be specified in one of two ways: +\w{\var{switch}\code{=}\var{value}} or +\w{\var{switch}<\var{space}>\var{value}}. For example, to start up +the saved core file mylisp.core use either of the following two +commands: + +\begin{example} + lisp -core=mylisp.core + lisp -core mylisp.core +\end{example} + + +\section{Credits} + +\cmucl{} was developed at the Computer Science Department of Carnegie +Mellon University. The work was a small autonomous part within the +Mach microkernel-based operating system project, and started more as a +tool development effort than a research project. The project started +out as Spice Lisp, which provided a modern Lisp implementation for use +in the CMU community. \cmucl{} has been under continual development since +the early 1980's (concurrent with the \clisp{} standardization +effort). Most of the CMU Common Lisp implementors went on to work on +the Gwydion environment for Dylan. The CMU team was lead by Scott E. +Fahlman, the \python{} compiler was written by Robert MacLachlan. + +\cmucl{}'s CLOS implementation is derived from the PCL reference +implementation written at Xerox PARC: +\begin{quotation} +\noindent Copyright (c) 1985, 1986, 1987, 1988, 1989, 1990 Xerox +Corporation.\\ +All rights reserved. + +\vspace{1ex} +\noindent Use and copying of this software and preparation of +derivative works based upon this software are permitted. Any +distribution of this software or derivative works must comply with all +applicable United States export control laws. + +\vspace{1ex} +\noindent This software is made available AS IS, and Xerox Corporation +makes no warranty about the software, its performance or its +conformity to any specification. +\end{quotation} +Its implementation of the LOOP macro was derived from code from +Symbolics, which was derived from code written at MIT: +\begin{quotation} +\noindent Portions of LOOP are Copyright (c) 1986 by the Massachusetts +Institute of Technology.\\ +All Rights Reserved. + +\vspace{1ex} +\noindent Permission to use, copy, modify and distribute this software +and its documentation for any purpose and without fee is hereby granted, +provided that the M.I.T. copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. The names "M.I.T." and "Massachusetts +Institute of Technology" may not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. Notice must be given in supporting documentation that +copying distribution is by permission of M.I.T. M.I.T. makes no +representations about the suitability of this software for any purpose. +It is provided "as is" without express or implied warranty. + +\vspace{3ex} +\noindent Portions of LOOP are Copyright (c) 1989, 1990, 1991, 1992 by +Symbolics, Inc.\\ +All Rights Reserved. + +\vspace{1ex} +\noindent Permission to use, copy, modify and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the Symbolics copyright notice appear in all +copies and that both that copyright notice and this permission notice +appear in supporting documentation. The name "Symbolics" may not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. Notice must be +given in supporting documentation that copying distribution is by +permission of Symbolics. Symbolics makes no representations about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +\vspace{1ex} +\noindent Symbolics, CLOE Runtime, and Minima are trademarks, and +CLOE, Genera, and Zetalisp are registered trademarks of Symbolics, +Inc. +\end{quotation} +The CLX code is copyrighted by Texas Instruments Incorporated: +\begin{quotation} +\noindent Copyright (C) 1987 Texas Instruments Incorporated. + +\vspace{1ex} +\noindent Permission is granted to any individual or institution to +use, copy, modify, and distribute this software, provided that this +complete copyright and permission notice is maintained, intact, in all +copies and supporting documentation. + +\vspace{1ex} +\noindent Texas Instruments Incorporated provides this software "as +is" without express or implied warranty. +\end{quotation} + +\cmucl{} was funded by DARPA under CMU's "Research on Parallel Computing" +contract. Rather than doing pure research on programming languages and +environments, the emphasis was on developing practical programming +tools. Sometimes this required new technology, but much of the work +was in creating a \clisp{} environment that incorporates +state-of-the-art features from existing systems (both Lisp and +non-Lisp). Archives of the project are available online. + +The project funding stopped in 1994, so support at Carnegie Mellon +University has been discontinued. All code and documentation developed +at CMU was released into the public domain. The project continues as a +group of users and developers collaborating over the Internet. The +current and previous maintainers include: + +\begin{itemize} +\item Marco Antoniotti +\item Martin Cracauer +\item Fred Gilham +\item Alex Goncharov +\item Rob MacLachlan +\item Pierre Mai +\item Eric Marsden +\item Gerd Moellman +\item Tim Moore +\item Carl Shapiro +\item Robert Swindells +\item Raymond Toy +\item Peter Van Eynde +\item Paul Werkowski +\end{itemize} + +In particular, Paul Werkowski and Douglas Crosher completed the port +for the x86 architecture for FreeBSD. Peter VanEnyde took the FreeBSD +port and created a Linux version. Other people who have contributed to +the development of \cmucl{} since 1981 are + +\begin{itemize} +\item David Axmark +\item Miles Bader +\item Rick Busdiecker +\item Bill Chiles +\item Douglas Thomas Crosher +\item Casper Dik +\item Ted Dunning +\item Scott Fahlman +\item Mike Garland +\item Paul Gleichauf +\item Sean Hallgren +\item Richard Harris +\item Joerg-Cyril Hoehl +\item Chris Hoover +\item John Kolojejchick +\item Todd Kaufmann +\item Simon Leinen +\item Sandra Loosemore +\item William Lott +\item Dave McDonald +\item Tim Moore +\item Skef Wholey +\item Paul Foley +\item Helmut Eller +\item Jan Rychter +\end{itemize} + +Countless others have contributed to the project by sending in bug +reports, bug fixes, and new features. + +This manual is based on CMU Technical Report CMU-CS-92-161, edited by +Robert A. MacLachlan, dated July 1992. Other contributors include +Raymond Toy, Paul Werkowski and Eric Marsden. The Hierarchical +Packages chapter is based on documentation written by Franz. Inc, and +is used with permission. The remainder of the document is in the +public domain. diff --git a/doc/cmu-user/ipc.tex b/doc/cmu-user/ipc.tex new file mode 100644 index 0000000000..6becab088d --- /dev/null +++ b/doc/cmu-user/ipc.tex @@ -0,0 +1,414 @@ +\chapter{Interprocess Communication under LISP} +\label{remote} + +\credits{by William Lott and Bill Chiles} + + +\cmucl{} offers a facility for interprocess communication (IPC) +on top of using Unix system calls and the complications of that level +of IPC. There is a simple remote-procedure-call (RPC) package build +on top of TCP/IP sockets. + + +\section{The REMOTE Package} + +The \code{remote} package provides simple RPC facility including +interfaces for creating servers, connecting to already existing +servers, and calling functions in other Lisp processes. The routines +for establishing a connection between two processes, +\code{create-request-server} and \code{connect-to-remote-server}, +return \var{wire} structures. A wire maintains the current state of +a connection, and all the RPC forms require a wire to indicate where +to send requests. + + +\subsection{Connecting Servers and Clients} + +Before a client can connect to a server, it must know the network address on +which the server accepts connections. Network addresses consist of a host +address or name, and a port number. Host addresses are either a string of the +form \code{VANCOUVER.SLISP.CS.CMU.EDU} or a 32 bit unsigned integer. Port +numbers are 16 bit unsigned integers. Note: \var{port} in this context has +nothing to do with Mach ports and message passing. + +When a process wants to receive connection requests (that is, become a +server), it first picks an integer to use as the port. Only one server +(Lisp or otherwise) can use a given port number on a given machine at +any particular time. This can be an iterative process to find a free +port: picking an integer and calling \code{create-request-server}. This +function signals an error if the chosen port is unusable. You will +probably want to write a loop using \code{handler-case}, catching +conditions of type error, since this function does not signal more +specific conditions. + +\begin{defun}{wire:}{create-request-server}{% + \args{\var{port} \ampoptional{} \var{on-connect}}} + + \code{create-request-server} sets up the current Lisp to accept + connections on the given port. If port is unavailable for any + reason, this signals an error. When a client connects to this port, + the acceptance mechanism makes a wire structure and invokes the + \var{on-connect} function. Invoking this function has a couple of + purposes, and \var{on-connect} may be \nil{} in which case the + system foregoes invoking any function at connect time. + + The \var{on-connect} function is both a hook that allows you access + to the wire created by the acceptance mechanism, and it confirms the + connection. This function takes two arguments, the wire and the + host address of the connecting process. See the section on host + addresses below. When \var{on-connect} is \nil, the request server + allows all connections. When it is non-\nil, the function returns + two values, whether to accept the connection and a function the + system should call when the connection terminates. Either value may + be \nil, but when the first value is \nil, the acceptance mechanism + destroys the wire. + + \code{create-request-server} returns an object that + \code{destroy-request-server} uses to terminate a connection. +\end{defun} + +\begin{defun}{wire:}{destroy-request-server}{\args{\var{server}}} + + \code{destroy-request-server} takes the result of + \code{create-request-server} and terminates that server. Any + existing connections remain intact, but all additional connection + attempts will fail. +\end{defun} + +\begin{defun}{wire:}{connect-to-remote-server}{% + \args{\var{host} \var{port} \ampoptional{} \var{on-death}}} + + \code{connect-to-remote-server} attempts to connect to a remote + server at the given \var{port} on \var{host} and returns a wire + structure if it is successful. If \var{on-death} is non-\nil, it is + a function the system invokes when this connection terminates. +\end{defun} + + +\subsection{Remote Evaluations} + +After the server and client have connected, they each have a wire +allowing function evaluation in the other process. This RPC mechanism +has three flavors: for side-effect only, for a single value, and for +multiple values. + +Only a limited number of data types can be sent across wires as +arguments for remote function calls and as return values: integers +inclusively less than 32 bits in length, symbols, lists, and +\var{remote-objects} (\pxlref{remote-objs}). The system sends symbols +as two strings, the package name and the symbol name, and if the +package doesn't exist remotely, the remote process signals an error. +The system ignores other slots of symbols. Lists may be any tree of +the above valid data types. To send other data types you must +represent them in terms of these supported types. For example, you +could use \code{prin1-to-string} locally, send the string, and use +\code{read-from-string} remotely. + +\begin{defmac}{wire:}{remote}{% + \args{\var{wire} \mstar{call-specs}}} + + The \code{remote} macro arranges for the process at the other end of + \var{wire} to invoke each of the functions in the \var{call-specs}. + To make sure the system sends the remote evaluation requests over + the wire, you must call \code{wire-force-output}. + + Each of \var{call-specs} looks like a function call textually, but + it has some odd constraints and semantics. The function position of + the form must be the symbolic name of a function. \code{remote} + evaluates each of the argument subforms for each of the + \var{call-specs} locally in the current context, sending these + values as the arguments for the functions. + + Consider the following example: + +\begin{verbatim} +(defun write-remote-string (str) + (declare (simple-string str)) + (wire:remote wire + (write-string str))) +\end{verbatim} + + The value of \code{str} in the local process is passed over the wire + with a request to invoke \code{write-string} on the value. The + system does not expect to remotely evaluate \code{str} for a value + in the remote process. +\end{defmac} + +\begin{defun}{wire:}{wire-force-output}{\args{\var{wire}}} + + \code{wire-force-output} flushes all internal buffers associated + with \var{wire}, sending the remote requests. This is necessary + after a call to \code{remote}. +\end{defun} + +\begin{defmac}{wire:}{remote-value}{\args{\var{wire} \var{call-spec}}} + + The \code{remote-value} macro is similar to the \code{remote} macro. + \code{remote-value} only takes one \var{call-spec}, and it returns + the value returned by the function call in the remote process. The + value must be a valid type the system can send over a wire, and + there is no need to call \code{wire-force-output} in conjunction + with this interface. + + If client unwinds past the call to \code{remote-value}, the server + continues running, but the system ignores the value the server sends + back. + + If the server unwinds past the remotely requested call, instead of + returning normally, \code{remote-value} returns two values, \nil{} + and \true. Otherwise this returns the result of the remote + evaluation and \nil. +\end{defmac} + +\begin{defmac}{wire:}{remote-value-bind}{% + \args{\var{wire} (\mstar{variable}) \var{remote-form} + \mstar{local-forms}}} + + \code{remote-value-bind} is similar to \code{multiple-value-bind} + except the values bound come from \var{remote-form}'s evaluation in + the remote process. The \var{local-forms} execute in an implicit + \code{progn}. + + If the client unwinds past the call to \code{remote-value-bind}, the + server continues running, but the system ignores the values the + server sends back. + + If the server unwinds past the remotely requested call, instead of + returning normally, the \var{local-forms} never execute, and + \code{remote-value-bind} returns \nil. +\end{defmac} + + +\subsection{Remote Objects} +\label{remote-objs} + +The wire mechanism only directly supports a limited number of data +types for transmission as arguments for remote function calls and as +return values: integers inclusively less than 32 bits in length, +symbols, lists. Sometimes it is useful to allow remote processes to +refer to local data structures without allowing the remote process +to operate on the data. We have \var{remote-objects} to support +this without the need to represent the data structure in terms of +the above data types, to send the representation to the remote +process, to decode the representation, to later encode it again, and +to send it back along the wire. + +You can convert any Lisp object into a remote-object. When you send +a remote-object along a wire, the system simply sends a unique token +for it. In the remote process, the system looks up the token and +returns a remote-object for the token. When the remote process +needs to refer to the original Lisp object as an argument to a +remote call back or as a return value, it uses the remote-object it +has which the system converts to the unique token, sending that +along the wire to the originating process. Upon receipt in the +first process, the system converts the token back to the same +(\code{eq}) remote-object. + +\begin{defun}{wire:}{make-remote-object}{\args{\var{object}}} + + \code{make-remote-object} returns a remote-object that has + \var{object} as its value. The remote-object can be passed across + wires just like the directly supported wire data types. +\end{defun} + +\begin{defun}{wire:}{remote-object-p}{\args{\var{object}}} + + The function \code{remote-object-p} returns \true{} if \var{object} + is a remote object and \nil{} otherwise. +\end{defun} + +\begin{defun}{wire:}{remote-object-local-p}{\args{\var{remote}}} + + The function \code{remote-object-local-p} returns \true{} if + \var{remote} refers to an object in the local process. This is can + only occur if the local process created \var{remote} with + \code{make-remote-object}. +\end{defun} + +\begin{defun}{wire:}{remote-object-eq}{\args{\var{obj1} \var{obj2}}} + + The function \code{remote-object-eq} returns \true{} if \var{obj1} and + \var{obj2} refer to the same (\code{eq}) lisp object, regardless of + which process created the remote-objects. +\end{defun} + +\begin{defun}{wire:}{remote-object-value}{\args{\var{remote}}} + + This function returns the original object used to create the given + remote object. It is an error if some other process originally + created the remote-object. +\end{defun} + +\begin{defun}{wire:}{forget-remote-translation}{\args{\var{object}}} + + This function removes the information and storage necessary to + translate remote-objects back into \var{object}, so the next + \code{gc} can reclaim the memory. You should use this when you no + longer expect to receive references to \var{object}. If some remote + process does send a reference to \var{object}, + \code{remote-object-value} signals an error. +\end{defun} + + +% This stuff has been moved to internet.tex. *** Remove me someday *** +% \subsection{Host Addresses} + +% The operating system maintains a database of all the valid host +% addresses. You can use this database to convert between host names +% and addresses and vice-versa. + +% \begin{defun}{ext:}{lookup-host-entry}{\args{\var{host}}} + +% \code{lookup-host-entry} searches the database for the given +% \var{host} and returns a host-entry structure for it. If it fails +% to find \var{host} in the database, it returns \nil. \var{Host} is +% either the address (as an integer) or the name (as a string) of the +% desired host. +% \end{defun} + +% \begin{defun}{ext:}{host-entry-name}{\args{\var{host-entry}}} +% \defunx[ext:]{host-entry-aliases}{\args{\var{host-entry}}} +% \defunx[ext:]{host-entry-addr-list}{\args{\var{host-entry}}} +% \defunx[ext:]{host-entry-addr}{\args{\var{host-entry}}} + +% \code{host-entry-name}, \code{host-entry-aliases}, and +% \code{host-entry-addr-list} each return the indicated slot from the +% host-entry structure. \code{host-entry-addr} returns the primary +% (first) address from the list returned by +% \code{host-entry-addr-list}. +% \end{defun} + + +\section{The WIRE Package} + +The \code{wire} package provides for sending data along wires. The +\code{remote} package sits on top of this package. All data sent +with a given output routine must be read in the remote process with +the complementary fetching routine. For example, if you send so a +string with \code{wire-output-string}, the remote process must know +to use \code{wire-get-string}. To avoid rigid data transfers and +complicated code, the interface supports sending +\var{tagged} data. With tagged data, the system sends a tag +announcing the type of the next data, and the remote system takes +care of fetching the appropriate type. + +When using interfaces at the wire level instead of the RPC level, +the remote process must read everything sent by these routines. If +the remote process leaves any input on the wire, it will later +mistake the data for an RPC request causing unknown lossage. + + +\subsection{Untagged Data} + +When using these routines both ends of the wire know exactly what types are +coming and going and in what order. This data is restricted to the following +types: + +\begin{itemize} +\item +8 bit unsigned bytes. + +\item +32 bit unsigned bytes. + +\item +32 bit integers. + +\item +simple-strings less than 65535 in length. +\end{itemize} + +\begin{defun}{wire:}{wire-output-byte}{\args{\var{wire} \var{byte}}} + \defunx[wire:]{wire-get-byte}{\args{\var{wire}}} + \defunx[wire:]{wire-output-number}{\args{\var{wire} \var{number}}} + \defunx[wire:]{wire-get-number}{\args{\var{wire} \ampoptional{} + \var{signed}}} + \defunx[wire:]{wire-output-string}{\args{\var{wire} \var{string}}} + \defunx[wire:]{wire-get-string}{\args{\var{wire}}} + + These functions either output or input an object of the specified + data type. When you use any of these output routines to send data + across the wire, you must use the corresponding input routine + interpret the data. +\end{defun} + + +\subsection{Tagged Data} + +When using these routines, the system automatically transmits and interprets +the tags for you, so both ends can figure out what kind of data transfers +occur. Sending tagged data allows a greater variety of data types: integers +inclusively less than 32 bits in length, symbols, lists, and \var{remote-objects} +(\pxlref{remote-objs}). The system sends symbols as two strings, the +package name and the symbol name, and if the package doesn't exist remotely, +the remote process signals an error. The system ignores other slots of +symbols. Lists may be any tree of the above valid data types. To send other +data types you must represent them in terms of these supported types. For +example, you could use \code{prin1-to-string} locally, send the string, and use +\code{read-from-string} remotely. + +\begin{defun}{wire:}{wire-output-object}{% + \args{\var{wire} \var{object} \ampoptional{} \var{cache-it}}} + \defunx[wire:]{wire-get-object}{\args{\var{wire}}} + + The function \code{wire-output-object} sends \var{object} over + \var{wire} preceded by a tag indicating its type. + + If \var{cache-it} is non-\nil, this function only sends \var{object} + the first time it gets \var{object}. Each end of the wire + associates a token with \var{object}, similar to remote-objects, + allowing you to send the object more efficiently on successive + transmissions. \var{cache-it} defaults to \true{} for symbols and + \nil{} for other types. Since the RPC level requires function + names, a high-level protocol based on a set of function calls saves + time in sending the functions' names repeatedly. + + The function \code{wire-get-object} reads the results of + \code{wire-output-object} and returns that object. +\end{defun} + + +\subsection{Making Your Own Wires} + +You can create wires manually in addition to the \code{remote} +package's interface creating them for you. To create a wire, you need +a Unix {\em file descriptor}. If you are unfamiliar with Unix file +descriptors, see section 2 of the Unix manual pages. + +\begin{defun}{wire:}{make-wire}{\args{\var{descriptor}}} + + The function \code{make-wire} creates a new wire when supplied with + the file descriptor to use for the underlying I/O operations. +\end{defun} + +\begin{defun}{wire:}{wire-p}{\args{\var{object}}} + + This function returns \true{} if \var{object} is indeed a wire, + \nil{} otherwise. +\end{defun} + +\begin{defun}{wire:}{wire-fd}{\args{\var{wire}}} + + This function returns the file descriptor used by the \var{wire}. +\end{defun} + + +\section{Out-Of-Band Data} + +The TCP/IP protocol allows users to send data asynchronously, otherwise +known as \var{out-of-band} data. When using this feature, the operating +system interrupts the receiving process if this process has chosen to be +notified about out-of-band data. The receiver can grab this input +without affecting any information currently queued on the socket. +Therefore, you can use this without interfering with any current +activity due to other wire and remote interfaces. + +Unfortunately, most implementations of TCP/IP are broken, so use of +out-of-band data is limited for safety reasons. You can only reliably +send one character at a time. + +The Wire package is built on top of \cmucl{}s networking support. In +view of this, it is possible to use the routines described in section +\ref{internet-oob} for handling and sending out-of-band data. These +all take a Unix file descriptor instead of a wire, but you can fetch a +wire's file descriptor with \code{wire-fd}. diff --git a/doc/cmu-user/latex2html.tex b/doc/cmu-user/latex2html.tex new file mode 100644 index 0000000000..428d14f108 --- /dev/null +++ b/doc/cmu-user/latex2html.tex @@ -0,0 +1,56 @@ +%% Replacement commands when we run latex2html. This should be last +%% so that latex2html uses these commands instead of the LaTeX +%% commands above. +\usepackage{makeidx} + +\newcommand{\var}[1]{\textnormal{\textit{#1}}} +\newcommand{\code}[1]{\textnormal{\texttt{#1}}} +%%\newcommand{\printindex}[1][\mbox{}]{} + +%% We need the quote environment because the alltt is broken. The +%% quote environment helps us in postprocessing to result to get +%% what we want. +\newenvironment{example}{\begin{quote}\begin{alltt}}{\end{alltt}\end{quote}} +\newenvironment{display}{\begin{quote}\begin{alltt}}{\end{alltt}\end{quote}} + +\newcommand{\textnormal}[1]{\rm #1} +\newcommand{\hbox}[1]{\mbox{#1}} +\newcommand{\xspace}{} +\newcommand{newindex}[4]{} + +\newcommand{\pxlref}[1]{see section~\ref{#1}} +\newcommand{\xlref}[1]{See section~\ref{#1}} + +\newcommand{\tindexed}[1]{\index{#1}\texttt{#1}} +\newcommand{\findexed}[1]{\index{#1}\texttt{#1}} +\newcommand{\vindexed}[1]{\index{#1}\texttt{*#1*}} +\newcommand{\cindex}[1]{\index{#1}} +\newcommand{\cpsubindex}[2]{\index{#1!#2}} + +\newcommand{\keys}[1]{\texttt{\&key} #1} +\newcommand{\morekeys}[1]{#1} +\newcommand{\yetmorekeys}[1]{#1} + +\newenvironment{defun}[3]{% + \textbf{[Function]}\\ + \texttt{#1#2} \emph{#3}\\}{} +\newcommand{\defunx}[3][\mbox{}]{% + \texttt{#1#2} {\em #3}\\} +\newenvironment{defmac}[3]{% + \textbf{[Macro]}\\ + \texttt{#1#2} \emph{#3}\\}{} +\newcommand{\defmacx}[3][\mbox{}]{% + \texttt{#1#2} {\em #3}\\} +\newenvironment{defvar}[2]{% + \textbf{[Variable]}\\ + \texttt{#1*#2*}\\ \\}{} +\newcommand{\defvarx}[2][\mbox{}]{% + \texttt{#1*#2*}\\} +\newenvironment{defconst}[2]{% + \textbf{[Constant]}\\ + \texttt{#1#2}\\}{} +\newcommand{\defconstx}[2][\mbox{}]{\texttt{#1#2}\\} +\newenvironment{deftp}[3]{% + \textbf{[#1]}\\ + \texttt{#2} \textit{#3}\\}{} +\newenvironment{Lentry}{\begin{description}}{\end{description}} diff --git a/doc/cmu-user/macros.tex b/doc/cmu-user/macros.tex new file mode 100644 index 0000000000..bfb1669cf6 --- /dev/null +++ b/doc/cmu-user/macros.tex @@ -0,0 +1,284 @@ +% macro.tex +% +% LaTeX macros for CMUCL User's Manual +% +% by Raymond Toy + +% use Palatino +\renewcommand{\rmdefault}{ppl} +\ifpdf +\usepackage{palatino} +\fi + +%% Define the indices. We need one for Types, Variables, Functions, +%% and a general concept index. +\makeindex +\newindex{types}{tdx}{tnd}{Type Index} +\newindex{vars}{vdx}{vnd}{Variable Index} +\newindex{funs}{fdx}{fnd}{Function Index} +\newindex{concept}{cdx}{cnd}{Concept Index} + +\newcommand{\tindexed}[1]{\index[types]{#1}\code{#1}} +\newcommand{\findexed}[1]{\index[funs]{#1}\code{#1}} +\newcommand{\vindexed}[1]{\index[vars]{#1}\code{*#1*}} +\newcommand{\cindex}[1]{\index[concept]{#1}} +\newcommand{\cpsubindex}[2]{\index[concept]{#1!#2}} + + +%% This code taken from the LaTeX companion. It's meant as a +%% replacement for the description environment. We want one that +%% prints description items in a fixed size box and puts the +%% description itself on the same line or the next depending on the +%% size of the item. +\newcommand{\entrylabel}[1]{\mbox{#1}\hfil} +\newenvironment{entry}{% + \begin{list}{}% + {\renewcommand{\makelabel}{\entrylabel}% + \setlength{\labelwidth}{45pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}}}% + {\end{list}} + +\newlength{\Mylen} +\newcommand{\Lentrylabel}[1]{% + \settowidth{\Mylen}{#1}% + \ifthenelse{\lengthtest{\Mylen > \labelwidth}}% + {\parbox[b]{\labelwidth}% term > labelwidth + {\makebox[0pt][l]{#1}\\}}% + {#1}% + \hfil\relax} +\newenvironment{Lentry}{% + \renewcommand{\entrylabel}{\Lentrylabel} + \begin{entry}}% + {\end{entry}} + +\newcommand{\fcntype}[1]{\textit{#1}} +\newcommand{\argtype}[1]{\textit{#1}} +\newcommand{\fcnname}[1]{\textsf{#1}} + +\newlength{\formnamelen} % length of a name of a form +\newlength{\pboxargslen} % length of parbox for arguments +\newlength{\typelen} % length of the type label for the form + +\newcommand{\args}[1]{#1} +\newcommand{\keys}[1]{\code{\&key} \= #1} +\newcommand{\morekeys}[1]{\\ \> #1} +\newcommand{\yetmorekeys}[1]{\\ \> #1} + +\newcommand{\defunvspace}{\ifhmode\unskip \par\fi\addvspace{18pt plus 12pt minus 6pt}} + + +%% \layout[pkg]{name}{param list}{type} +%% +%% This lays out a entry like so: +%% +%% pkg:name arg1 arg2 [Function] +%% +%% where [Function] is flush right. +%% +\newcommand{\layout}[4][\mbox{}]{% + \par\noindent + \fcnname{#1#2\hspace{1em}}% + \settowidth{\formnamelen}{\fcnname{#1#2\hspace{1em}}}% + \settowidth{\typelen}{[\argtype{#4}]}% + \setlength{\pboxargslen}{\linewidth}% + \addtolength{\pboxargslen}{-1\formnamelen}% + \addtolength{\pboxargslen}{-1\typelen}% + \begin{minipage}[t]{\pboxargslen} + \begin{tabbing} + #3 + \end{tabbing} + \end{minipage} + \hfill[\fcntype{#4}]% + \par\addvspace{2pt plus 2pt minus 2pt}} + +\newcommand{\vrindexbold}[1]{\index[vars]{#1|textbf}} +\newcommand{\fnindexbold}[1]{\index[funs]{#1|textbf}} + +%% Define a new type +%% +%% \begin{deftp}{typeclass}{typename}{args} +%% some description +%% \end{deftp} +\newenvironment{deftp}[3]{% + \par\bigskip\index[types]{#2|textbf}% + \layout{#2}{\var{#3}}{#1} + }{} + +%% Define a function with name NAME and given parameters PARAM. The +%% function is in the package PKG. If the optional arg SUFFIX is +%% given, this is used as a suffix for the label. (Useful when you +%% have functions of the same name, such as methods, but want +%% different labels for each version.) +%% +%% The defunx is for additional functions that are related to this one +%% in some way, and we want to group them all together. +%% +%% \begin{defun}[suffix]{pkg}{name}{params} +%% \defunx[pkg]{name}{params} +%% description of function +%% \end{defun} +\newenvironment{defun}[4][]{% + \par\defunvspace\fnindexbold{#3}\label{FN:#3#1}% + \layout[#2]{#3}{#4}{Function} + }{} +\newcommand{\defunx}[3][\mbox{}]{% + \par\fnindexbold{#2}\label{FN:#2}% + \layout[#1]{#2}{#3}{Function}} + +%% Define a generic function. Like defun, but for defgeneric. +%% +%% \begin{defgeneric}[suffix]{pkg}{name}{params} +%% \defgenericx[pkg]{name}{params} +%% description of function +%% \end{defgeneric} +\newenvironment{defgeneric}[4][]{% + \par\defunvspace\fnindexbold{#3}\label{FN:#3-generic#1}% + \layout[#2]{#3}{#4}{Generic Function} + }{} +\newcommand{\defgenericx}[3][\mbox{}]{% + \par\fnindexbold{#2}\label{FN:#2}% + \layout[#1]{#2}{#3}{Generic Function}} + +%% Define a method. Like defgeneric, but for methods. +%% +%% \begin{defmethod}[suffix]{pkg}{name}{params} +%% \defmethod[pkg]{name}{params} +%% description of function +%% \end{defmethod} +\newenvironment{defmethod}[4][]{% + \par\defunvspace\fnindexbold{#3}\label{FN:#3-method#1}% + \layout[#2]{#3}{#4}{Method} + }{} +\newcommand{\defmethodx}[3][\mbox{}]{% + \par\fnindexbold{#2}\label{FN:#2}% + \layout[#1]{#2}{#3}{Method}} + +%% Define a macro +%% +%% \begin{defmac}[suffix]{pkg}{name}{params} +%% \defmacx[pkg]{name}{params} +%% description of macro +%% \end{defmac} +\newenvironment{defmac}[4][]{% + \par\defunvspace\fnindexbold{#3}\label{FN:#3#1}% + \layout[#2]{#3}{#4}{Macro}}{} +\newcommand{\defmacx}[3][\mbox{}]{% + \par\fnindexbold{#2}\label{FN:#2}% + \layout[#1]{#2}{#3}{Macro}} + +%% Define a variable +%% +%% \begin{defvar}{pkg}{name} +%% \defvarx[pkg]{name} +%% description of defvar +%% \end{defvar} +\newenvironment{defvar}[2]{% + \par\defunvspace\vrindexbold{#2}\label{VR:#2} + \layout[#1]{*#2*}{}{Variable}}{} +\newcommand{\defvarx}[2][\mbox{}]{% + \par\vrindexbold{#2}\label{VR:#2} + \layout[#1]{*#2*}{}{Variable}} + +%% Define a constant +%% +%% \begin{defconst}{pkg}{name} +%% \ddefconstx[pkg]{name} +%% description of defconst +%% \end{defconst} +\newcommand{\defconstx}[2][\mbox{}]{% + \layout[#1]{#2}{}{Constant}} +\newenvironment{defconst}[2]{% + \defunvspace\defconstx[#1]{#2}}{} + +\newcommand{\credits}[1]{% + \begin{center} + \textbf{#1} + \end{center}} + +\newenvironment{example}{\begin{quote}\begin{alltt}}{\end{alltt}\end{quote}} +\newenvironment{lisp}{\begin{example}}{\end{example}} + +\newcommand{\hide}[1]{} +\newcommand{\trnumber}[1]{#1} +\newcommand{\citationinfo}[1]{#1} +\newcommand{\var}[1]{{\textsf{\textsl{#1}}\xspace}} +\newcommand{\code}[1]{\textnormal{{\sffamily #1}}} +\newcommand{\file}[1]{`\texttt{#1}'} +\newcommand{\kwd}[1]{\code{:#1}} +\newcommand{\F}[1]{\code{#1}} +\newcommand{\w}[1]{\hbox{#1}} +\newcommand{\ctrl}[1]{$\uparrow$\textsf{#1}} +\newcommand{\result}{$\Rightarrow$} +\newcommand{\myequiv}{$\equiv$} +\newcommand{\back}[1]{\(\backslash\)#1} +\newcommand{\pxlref}[1]{see section~\ref{#1}, page~\pageref{#1}} +\newcommand{\xlref}[1]{See section~\ref{#1}, page~\pageref{#1}} +\newcommand{\funref}[1]{\findexed{#1} (page~\pageref{FN:#1})} +\newcommand{\specref}[1]{\findexed{#1} (page~\pageref{FN:#1})} +\newcommand{\macref}[1]{\findexed{#1} (page~\pageref{FN:#1})} +\newcommand{\varref}[1]{\vindexed{#1} (page~\pageref{VR:#1})} +\newcommand{\conref}[1]{\conindexed{#1} (page~\pageref{VR:#1})} + +\newcommand{\false}{\code{nil}} +\newcommand{\true}{\code{t}} +\newcommand{\nil}{\false{}} +%% Printed lisp character #\foo +\newcommand{\lispchar}[1]{\code{\#\back{#1}}} + +\newcommand{\ampoptional}{\code{\&optional}} +\newcommand{\amprest}{\code{\&rest}} +\newcommand{\ampbody}{\code{\&body}} + +\newcommand{\mopt}[1]{{$\,\{$}\textnormal{\textsf{\textsl{#1\/}}}{$\}\,$}} +\newcommand{\mstar}[1]{{$\,\{$}\textnormal{\textsf{\textsl{#1\/}}}{$\}^*\,$}} +\newcommand{\mplus}[1]{{$\,\{$}\textnormal{\textsf{\textsl{#1\/}}}{$\}^+\,$}} +\newcommand{\mgroup}[1]{{$\,\{$}\textnormal{\textsf{\textsl{#1\/}}}{$\}\,$}} +\newcommand{\mor}{$|$} + + +%% Some common abbreviations +\newcommand{\dash}{---} +\newcommand{\alien}{Alien} +\newcommand{\aliens}{Aliens} +\newcommand{\hemlock}{Hemlock} +\newcommand{\python}{Python} +\newcommand{\cmucl}{\textsc{cmucl}} +\newcommand{\clisp}{Common Lisp} +\newcommand{\llisp}{Common Lisp} +\newcommand{\cltl}{\textit{Common Lisp: The Language}} +\newcommand{\cltltwo}{\textit{Common Lisp: The Language II}} + + +%% Set up margins +\setlength{\oddsidemargin}{-10pt} +\setlength{\evensidemargin}{-10pt} +\setlength{\topmargin}{-40pt} +\setlength{\headheight}{12pt} +\setlength{\headsep}{25pt} +\setlength{\footskip}{30pt} +\setlength{\textheight}{9.25in} +\setlength{\textwidth}{6.75in} +\setlength{\columnsep}{0.375in} +\setlength{\columnseprule}{0pt} + + +\setcounter{tocdepth}{2} +\setcounter{secnumdepth}{3} +\def\textfraction{.1} +\def\bottomfraction{.9} % was .3 +\def\topfraction{.9} + +%% Allow TeX some stretching space to avoid overfull and underfull +%% boxes. +\setlength{\emergencystretch}{5pt} + +%% requires the sectsty package +\allsectionsfont{\bfseries\sffamily} +\chapterfont{\fontfamily{pag}\selectfont} + +%% section numbers in the left margin +\makeatletter +\def\@seccntformat#1{\protect\makebox[0pt][r]{\csname + the#1\endcsname\quad}} +\makeatother + diff --git a/doc/cmu-user/next_motif.gif b/doc/cmu-user/next_motif.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f84bacfb26ea6a4141ad407ff4fb77954171fea GIT binary patch literal 317 zcmZ?wbhEHb6krfw_{abP1q~Da{|AwZ|CALJJaY^3i%L>c6w-?Fa}^>2d=)Zt6Vp?z z6!KClO7toUav2nVvM@3*Ff-_YG=q$BV0wPX%oqrcNic)NoH!IY7zB6@8}Kj-us9lk z7$CL+2ZMnG4_ouW1Z2ulL4bpWfr*g;NHKx6GcYhUIw%M*FhEp-DFfUZHARYuTK(sM{cnnYuPzb0WB7s6C9B5!<=3-#51_0IeJqZ8+ literal 0 HcmV?d00001 diff --git a/doc/cmu-user/package-locks.tex b/doc/cmu-user/package-locks.tex new file mode 100644 index 0000000000..aa73f5d312 --- /dev/null +++ b/doc/cmu-user/package-locks.tex @@ -0,0 +1,124 @@ +\section{Package Locks} +\cindex{package locks} + +\cmucl{} provides two types of package locks, as an extension to the +ANSI Common Lisp standard. The package-lock protects a package from +changes in its structure (the set of exported symbols, its use list, +etc). The package-definition-lock protects the symbols in the package +from being redefined due to the execution of a \code{defun}, +\code{defmacro}, \code{defstruct}, \code{deftype} or \code{defclass} +form. + + +\subsection{Rationale} + +Package locks are an aid to program development, by helping to detect +inadvertent name collisions and function redefinitions. They are +consistent with the principle that a package ``belongs to'' its +implementor, and that noone other than the package's developer should +be making or modifying definitions on symbols in that package. Package +locks are compatible with the ANSI Common Lisp standard, which states +that the consequences of redefining functions in the +\code{COMMON-LISP} package are undefined. + +Violation of a package lock leads to a continuable error of type +\code{lisp::package-locked-error} being signaled. The user may choose +to ignore the lock and proceed, or to abort the computation. Two other +restarts are available, one which disables all locks on all packages, +and one to disable only the package-lock or package-definition-lock +that was tripped. + +The following transcript illustrates the behaviour seen when +attempting to redefine a standard macro in the \code{COMMON-LISP} +package, or to redefine a function in one of \cmucl{}'s +implementation-defined packages: + +{\small +\begin{verbatim} +CL-USER> (defmacro 1+ (x) (* x 2)) +Attempt to modify the locked package COMMON-LISP, by defining macro 1+ + [Condition of type LISP::PACKAGE-LOCKED-ERROR] + +Restarts: + 0: [continue ] Ignore the lock and continue + 1: [unlock-package] Disable the package's definition-lock then continue + 2: [unlock-all ] Unlock all packages, then continue + 3: [abort ] Return to Top-Level. + +CL-USER> (defun ext:gc () t) +Attempt to modify the locked package EXTENSIONS, by redefining function GC + [Condition of type LISP::PACKAGE-LOCKED-ERROR] + +Restarts: + 0: [continue ] Ignore the lock and continue + 1: [unlock-package] Disable package's definition-lock, then continue + 2: [unlock-all ] Disable all package locks, then continue + 3: [abort ] Return to Top-Level. +\end{verbatim} + + +The following transcript illustrates the behaviour seen when an +attempt to modify the structure of a package is made: + +\begin{verbatim} +CL-USER> (unexport 'load-foreign :ext) +Attempt to modify the locked package EXTENSIONS, by unexporting symbols LOAD-FOREIGN + [Condition of type lisp::package-locked-error] + +Restarts: + 0: [continue ] Ignore the lock and continue + 1: [unlock-package] Disable package's lock then continue + 2: [unlock-all ] Unlock all packages, then continue + 3: [abort ] Return to Top-Level. +\end{verbatim} +} + +The \code{COMMON-LISP} package and the \cmucl{}-specific +implementation packages are locked on startup. Users can lock their +own packages by using the \code{ext:package-lock} and +\code{ext:package-definition-lock} accessors. + + + +\subsection{Disabling package locks} + +A package's locks can be enabled or disabled by using the +\code{ext:package-lock} and \code{ext:package-definition-lock} +accessors, as follows: + +\begin{lisp} + (setf (ext:package-lock (find-package "UNIX")) nil) + (setf (ext:package-definition-lock (find-package "UNIX")) nil) +\end{lisp} + + +\begin{defun}{ext:}{package-lock}{\var{package}} + This function is an accessor for a package's structural lock, which + protects it against modifications to its list of exported symbols. +\end{defun} + + +\begin{defun}{ext:}{package-definition-lock}{\var{package}} + This function is an accessor for a package's definition-lock, which + protects symbols in that package from redefinition. As well as + protecting the symbol's fdefinition from change, attempts to change + the symbol's definition using \code{defstruct}, \code{defclass} or + \code{deftype} will be trapped. +\end{defun} + + +\begin{defmac}{ext:}{without-package-locks}{\args{\amprest{} \var{body}}} + This macro can be used to execute forms with all package locks (both + structure and definition locks) disabled. +\end{defmac} + + +\begin{defun}{ext:}{unlock-all-packages}{} + This function disables both structure and definition locks on all + currently defined packages. Note that package locks are reset when + \cmucl{} is restarted, so the effect of this function is limited to + the current session. +\end{defun} + + +% EOF diff --git a/doc/cmu-user/previous_motif.gif b/doc/cmu-user/previous_motif.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c8a3e6430050e67e2e71dbd1f99fb9caf6176bf GIT binary patch literal 317 zcmZ?wbhEHb6krfw_{abP1q~Da{|AwZ|CALJJaY^3i%L>c6w-?Fa}^>2d=)Zt6Vp?z z6bgz`%k(M=av2nVvM@3*Ff-_YG=q$BV0wPX%oqrcNhmWYviw rA^>J9009F?7$^Z^BLGMh0|ST;RSz`=t{-8nfkDE721aHs1_o;Y3u!(; literal 0 HcmV?d00001 diff --git a/doc/cmu-user/serve-event.tex b/doc/cmu-user/serve-event.tex new file mode 100644 index 0000000000..bf4d8aa172 --- /dev/null +++ b/doc/cmu-user/serve-event.tex @@ -0,0 +1,575 @@ +\chapter{Event Dispatching with SERVE-EVENT} +\label{serve-event} + +\credits{by Bill Chiles and Robert MacLachlan} + + +It is common to have multiple activities simultaneously operating in the same +Lisp process. Furthermore, Lisp programmers tend to expect a flexible +development environment. It must be possible to load and modify application +programs without requiring modifications to other running programs. \cmucl{} +achieves this by having a central scheduling mechanism based on an +event-driven, object-oriented paradigm. + +An \var{event} is some interesting happening that should cause the Lisp process +to wake up and do something. These events include X events and activity on +Unix file descriptors. The object-oriented mechanism is only available with +the first two, and it is optional with X events as described later in this +chapter. In an X event, the window ID is the object capability and the X event +type is the operation code. The Unix file descriptor input mechanism simply +consists of an association list of a handler to call when input shows up on a +particular file descriptor. + + +\section{Object Sets} +\label{object-sets} +\cindex{object sets} + +An {\em object set} is a collection of objects that have the same implementation +for each operation. Externally the object is represented by the object +capability and the operation is represented by the operation code. Within +Lisp, the object is represented by an arbitrary Lisp object, and the +implementation for the operation is represented by an arbitrary Lisp function. +The object set mechanism maintains this translation from the external to the +internal representation. + +\begin{defun}{system:}{make-object-set}{% + \args{\var{name} \ampoptional{} \var{default-handler}}} + + This function makes a new object set. \var{Name} is a string used + only for purposes of identifying the object set when it is printed. + \var{Default-handler} is the function used as a handler when an + undefined operation occurs on an object in the set. You can define + operations with the \code{serve-}\var{operation} functions exported + the \code{extensions} package for X events + (\pxlref{x-serve-mumbles}). Objects are added with + \code{system:add-xwindow-object}. Initially the object set has no + objects and no defined operations. +\end{defun} + +\begin{defun}{system:}{object-set-operation}{% + \args{\var{object-set} \var{operation-code}}} + + This function returns the handler function that is the + implementation of the operation corresponding to + \var{operation-code} in \var{object-set}. When set with + \code{setf}, the setter function establishes the new handler. The + \code{serve-}\var{operation} functions exported from the + \code{extensions} package for X events (\pxlref{x-serve-mumbles}) + call this on behalf of the user when announcing a new operation for + an object set. +\end{defun} + +\begin{defun}{system:}{add-xwindow-object}{% + \args{\var{window} \var{object} \var{object-set}}} + + These functions add \var{port} or \var{window} to \var{object-set}. + \var{Object} is an arbitrary Lisp object that is associated with the + \var{port} or \var{window} capability. \var{Window} is a CLX + window. When an event occurs, \code{system:serve-event} passes + \var{object} as an argument to the handler function. +\end{defun} + + +\section{The SERVE-EVENT Function} + +The \code{system:serve-event} function is the standard way for an application +to wait for something to happen. For example, the Lisp system calls +\code{system:serve-event} when it wants input from X or a terminal stream. +The idea behind \code{system:serve-event} is that it knows the appropriate +action to take when any interesting event happens. If an application calls +\code{system:serve-event} when it is idle, then any other applications with +pending events can run. This allows several applications to run ``at the +same time'' without interference, even though there is only one thread of +control. Note that if an application is waiting for input of any kind, +then other applications will get events. + +\begin{defun}{system:}{serve-event}{\args{\ampoptional{} \var{timeout}}} + + This function waits for an event to happen and then dispatches to + the correct handler function. If specified, \var{timeout} is the + number of seconds to wait before timing out. A time out of zero + seconds is legal and causes \code{system:serve-event} to poll for + any events immediately available for processing. + \code{system:serve-event} returns \true{} if it serviced at least + one event, and \nil{} otherwise. Depending on the application, when + \code{system:serve-event} returns \true, you might want to call it + repeatedly with a timeout of zero until it returns \nil. + + If input is available on any designated file descriptor, then this + calls the appropriate handler function supplied by + \code{system:add-fd-handler}. + + Since events for many different applications may arrive + simultaneously, an application waiting for a specific event must + loop on \code{system:serve-event} until the desired event happens. + Since programs such as \hemlock{} call \code{system:serve-event} for + input, applications usually do not need to call + \code{system:serve-event} at all; \hemlock{} allows other + application's handlers to run when it goes into an input wait. +\end{defun} + +\begin{defun}{system:}{serve-all-events}{\args{\ampoptional{} \var{timeout}}} + + This function is similar to \code{system:serve-event}, except it + serves all the pending events rather than just one. It returns + \true{} if it serviced at least one event, and \nil{} otherwise. +\end{defun} + + +\section{Using SERVE-EVENT with Unix File Descriptors} + +Object sets are not available for use with file descriptors, as there are +only two operations possible on file descriptors: input and output. +Instead, a handler for either input or output can be registered with +\code{system:serve-event} for a specific file descriptor. Whenever any input +shows up, or output is possible on this file descriptor, the function +associated with the handler for that descriptor is funcalled with the +descriptor as it's single argument. + +\begin{defun}{system:}{add-fd-handler}{% + \args{\var{fd} \var{direction} \var{function}}} + + This function installs and returns a new handler for the file + descriptor \var{fd}. \var{direction} can be either \kwd{input} if + the system should invoke the handler when input is available or + \kwd{output} if the system should invoke the handler when output is + possible. This returns a unique object representing the handler, + and this is a suitable argument for \code{system:remove-fd-handler} + \var{function} must take one argument, the file descriptor. +\end{defun} + +\begin{defun}{system:}{remove-fd-handler}{\args{\var{handler}}} + + This function removes \var{handler}, that \code{add-fd-handler} must + have previously returned. +\end{defun} + +\begin{defmac}{system:}{with-fd-handler}{% + \args{(\var{fd} \var{direction} \var{function}) + \mstar{\var{form}}}} + + This macro executes the supplied forms with a handler installed + using \var{fd}, \var{direction}, and \var{function}. See + \code{system:add-fd-handler}. The given forms are wrapped in an + \code{unwind-protect}; the handler is removed (see + \code{system:remove-fd-handler}) when done. +\end{defmac} + +\begin{defun}{system:}{wait-until-fd-usable}{% + \args{\var{fd} \var{direction} \ampoptional{} \var{timeout}}} + + This function waits for up to \var{timeout} seconds for \var{fd} to + become usable for \var{direction} (either \kwd{input} or + \kwd{output}). If \var{timeout} is \nil{} or unspecified, this + waits forever. +\end{defun} + +\begin{defun}{system:}{invalidate-descriptor}{\args{\var{fd}}} + + This function removes all handlers associated with \var{fd}. This + should only be used in drastic cases (such as I/O errors, but not + necessarily EOF). Normally, you should use \code{remove-fd-handler} + to remove the specific handler. +\end{defun} + + + + +\section{Using SERVE-EVENT with the CLX Interface to X} +\label{x-serve-mumbles} + +Remember from section \ref{object-sets}, an object set is a collection of +objects, CLX windows in this case, with some set of operations, event keywords, +with corresponding implementations, the same handler functions. Since X allows +multiple display connections from a given process, you can avoid using object +sets if every window in an application or display connection behaves the same. +If a particular X application on a single display connection has windows that +want to handle certain events differently, then using object sets is a +convenient way to organize this since you need some way to map the window/event +combination to the appropriate functionality. + +The following is a discussion of functions exported from the \code{extensions} +package that facilitate handling CLX events through \code{system:serve-event}. +The first two routines are useful regardless of whether you use +\code{system:serve-event}: +\begin{defun}{ext:}{open-clx-display}{% + \args{\ampoptional{} \var{string}}} + + This function parses \var{string} for an X display specification + including display and screen numbers. \var{String} defaults to the + following: + \begin{example} + (cdr (assoc :display ext:*environment-list* :test #'eq)) + \end{example} + If any field in the display specification is missing, this signals + an error. \code{ext:open-clx-display} returns the CLX display and + screen. +\end{defun} + +\begin{defun}{ext:}{flush-display-events}{\args{\var{display}}} + + This function flushes all the events in \var{display}'s event queue + including the current event, in case the user calls this from within + an event handler. +\end{defun} + + + +\subsection{Without Object Sets} + +Since most applications that use CLX, can avoid the complexity of object sets, +these routines are described in a separate section. The routines described in +the next section that use the object set mechanism are based on these +interfaces. + +\begin{defun}{ext:}{enable-clx-event-handling}{% + \args{\var{display} \var{handler}}} + + This function causes \code{system:serve-event} to notice when there + is input on \var{display}'s connection to the X11 server. When this + happens, \code{system:serve-event} invokes \var{handler} on + \var{display} in a dynamic context with an error handler bound that + flushes all events from \var{display} and returns. By returning, + the error handler declines to handle the error, but it will have + cleared all events; thus, entering the debugger will not result in + infinite errors due to streams that wait via + \code{system:serve-event} for input. Calling this repeatedly on the + same \var{display} establishes \var{handler} as a new handler, + replacing any previous one for \var{display}. +\end{defun} + +\begin{defun}{ext:}{disable-clx-event-handling}{\args{\var{display}}} + + This function undoes the effect of + \code{ext:enable-clx-event-handling}. +\end{defun} + +\begin{defmac}{ext:}{with-clx-event-handling}{% + \args{(\var{display} \var{handler}) \mstar{form}}} + + This macro evaluates each \var{form} in a context where + \code{system:serve-event} invokes \var{handler} on \var{display} + whenever there is input on \var{display}'s connection to the X + server. This destroys any previously established handler for + \var{display}. +\end{defmac} + + +\subsection{With Object Sets} + +This section discusses the use of object sets and +\code{system:serve-event} to handle CLX events. This is necessary +when a single X application has distinct windows that want to handle +the same events in different ways. Basically, you need some way of +asking for a given window which way you want to handle some event +because this event is handled differently depending on the window. +Object sets provide this feature. + +For each CLX event-key symbol-name \i{XXX} (for example, +\var{key-press}), there is a function \code{serve-}\i{XXX} of two +arguments, an object set and a function. The \code{serve-}\i{XXX} +function establishes the function as the handler for the \kwd{XXX} +event in the object set. Recall from section \ref{object-sets}, +\code{system:add-xwindow-object} associates some Lisp object with a +CLX window in an object set. When \code{system:serve-event} notices +activity on a window, it calls the function given to +\code{ext:enable-clx-event-handling}. If this function is +\code{ext:object-set-event-handler}, it calls the function given to +\code{serve-}\i{XXX}, passing the object given to +\code{system:add-xwindow-object} and the event's slots as well as a +couple other arguments described below. + +To use object sets in this way: + +\begin{itemize} +\item Create an object set. + +\item Define some operations on it using the \code{serve-}\i{XXX} + functions. + +\item Add an object for every window on which you receive requests. + This can be the CLX window itself or some structure more meaningful + to your application. + +\item Call \code{system:serve-event} to service an X event. +\end{itemize} + + +\begin{defun}{ext:}{object-set-event-handler}{% + \args{\var{display}}} + + This function is a suitable argument to + \code{ext:enable-clx-event-handling}. The actual event handlers + defined for particular events within a given object set must take an + argument for every slot in the appropriate event. In addition to + the event slots, \code{ext:object-set-event-handler} passes the + following arguments: + \begin{itemize} + \item The object, as established by + \code{system:add-xwindow-object}, on which the event occurred. + \item event-key, see \code{xlib:event-case}. + \item send-event-p, see \code{xlib:event-case}. + \end{itemize} + + Describing any \code{ext:serve-}\var{event-key-name} function, where + \var{event-key-name} is an event-key symbol-name (for example, + \code{ext:serve-key-press}), indicates exactly what all the + arguments are in their correct order. + +%% \begin{comment} +%% \code{ext:object-set-event-handler} ignores \kwd{no-exposure} +%% events on pixmaps, issuing a warning if one occurs. It is only +%% prepared to dispatch events for windows. +%% \end{comment} + + When creating an object set for use with + \code{ext:object-set-event-handler}, specify + \code{ext:default-clx-event-handler} as the default handler for + events in that object set. If no default handler is specified, and + the system invokes the default default handler, it will cause an + error since this function takes arguments suitable for handling port + messages. +\end{defun} + + +\section{A SERVE-EVENT Example} + +This section contains two examples using \code{system:serve-event}. The first +one does not use object sets, and the second, slightly more complicated one +does. + +\subsection{Without Object Sets Example} + +This example defines an input handler for a CLX display connection. It only +recognizes \kwd{key-press} events. The body of the example loops over +\code{system:serve-event} to get input. + +\begin{lisp} +(in-package "SERVER-EXAMPLE") + +(defun my-input-handler (display) + (xlib:event-case (display :timeout 0) + (:key-press (event-window code state) + (format t "KEY-PRESSED (Window = ~D) = ~S.~%" + (xlib:window-id event-window) + ;; See Hemlock Command Implementor's Manual for convenient + ;; input mapping function. + (ext:translate-character display code state)) + ;; Make XLIB:EVENT-CASE discard the event. + t))) +\end{lisp} + +\begin{lisp} +(defun server-example () + "An example of using the SYSTEM:SERVE-EVENT function and object sets to + handle CLX events." + (let* ((display (ext:open-clx-display)) + (screen (display-default-screen display)) + (black (screen-black-pixel screen)) + (white (screen-white-pixel screen)) + (window (create-window :parent (screen-root screen) + :x 0 :y 0 :width 200 :height 200 + :background white :border black + :border-width 2 + :event-mask + (xlib:make-event-mask :key-press)))) + ;; Wrap code in UNWIND-PROTECT, so we clean up after ourselves. + (unwind-protect + (progn + ;; Enable event handling on the display. + (ext:enable-clx-event-handling display #'my-input-handler) + ;; Map the windows to the screen. + (map-window window) + ;; Make sure we send all our requests. + (display-force-output display) + ;; Call serve-event for 100,000 events or immediate timeouts. + (dotimes (i 100000) (system:serve-event))) + ;; Disable event handling on this display. + (ext:disable-clx-event-handling display) + ;; Get rid of the window. + (destroy-window window) + ;; Pick off any events the X server has already queued for our + ;; windows, so we don't choke since SYSTEM:SERVE-EVENT is no longer + ;; prepared to handle events for us. + (loop + (unless (deleting-window-drop-event *display* window) + (return))) + ;; Close the display. + (xlib:close-display display)))) + +(defun deleting-window-drop-event (display win) + "Check for any events on win. If there is one, remove it from the + event queue and return t; otherwise, return nil." + (xlib:display-finish-output display) + (let ((result nil)) + (xlib:process-event + display :timeout 0 + :handler #'(lambda (&key event-window &allow-other-keys) + (if (eq event-window win) + (setf result t) + nil))) + result)) +\end{lisp} + + +\subsection{With Object Sets Example} + +This example involves more work, but you get a little more for your effort. It +defines two objects, \code{input-box} and \code{slider}, and establishes a +\kwd{key-press} handler for each object, \code{key-pressed} and +\code{slider-pressed}. We have two object sets because we handle events on the +windows manifesting these objects differently, but the events come over the +same display connection. + +\begin{lisp} +(in-package "SERVER-EXAMPLE") + +(defstruct (input-box (:print-function print-input-box) + (:constructor make-input-box (display window))) + "Our program knows about input-boxes, and it doesn't care how they + are implemented." + display ; The CLX display on which my input-box is displayed. + window) ; The CLX window in which the user types. +;;; +(defun print-input-box (object stream n) + (declare (ignore n)) + (format stream "#" (input-box-display object))) + +(defvar *input-box-windows* + (system:make-object-set "Input Box Windows" + #'ext:default-clx-event-handler)) + +(defun key-pressed (input-box event-key event-window root child + same-screen-p x y root-x root-y modifiers time + key-code send-event-p) + "This is our :key-press event handler." + (declare (ignore event-key root child same-screen-p x y + root-x root-y time send-event-p)) + (format t "KEY-PRESSED (Window = ~D) = ~S.~%" + (xlib:window-id event-window) + ;; See Hemlock Command Implementor's Manual for convenient + ;; input mapping function. + (ext:translate-character (input-box-display input-box) + key-code modifiers))) +;;; +(ext:serve-key-press *input-box-windows* #'key-pressed) +\end{lisp} + +\begin{lisp} +(defstruct (slider (:print-function print-slider) + (:include input-box) + (:constructor %make-slider + (display window window-width max))) + "Our program knows about sliders too, and these provide input values + zero to max." + bits-per-value ; bits per discrete value up to max. + max) ; End value for slider. +;;; +(defun print-slider (object stream n) + (declare (ignore n)) + (format stream "#" + (input-box-display object) + (1- (slider-max object)))) +;;; +(defun make-slider (display window max) + (%make-slider display window + (truncate (xlib:drawable-width window) max) + max)) + +(defvar *slider-windows* + (system:make-object-set "Slider Windows" + #'ext:default-clx-event-handler)) + +(defun slider-pressed (slider event-key event-window root child + same-screen-p x y root-x root-y modifiers time + key-code send-event-p) + "This is our :key-press event handler for sliders. Probably this is + a mouse thing, but for simplicity here we take a character typed." + (declare (ignore event-key root child same-screen-p x y + root-x root-y time send-event-p)) + (format t "KEY-PRESSED (Window = ~D) = ~S --> ~D.~%" + (xlib:window-id event-window) + ;; See Hemlock Command Implementor's Manual for convenient + ;; input mapping function. + (ext:translate-character (input-box-display slider) + key-code modifiers) + (truncate x (slider-bits-per-value slider)))) +;;; +(ext:serve-key-press *slider-windows* #'slider-pressed) +\end{lisp} + +\begin{lisp} +(defun server-example () + "An example of using the SYSTEM:SERVE-EVENT function and object sets to + handle CLX events." + (let* ((display (ext:open-clx-display)) + (screen (display-default-screen display)) + (black (screen-black-pixel screen)) + (white (screen-white-pixel screen)) + (iwindow (create-window :parent (screen-root screen) + :x 0 :y 0 :width 200 :height 200 + :background white :border black + :border-width 2 + :event-mask + (xlib:make-event-mask :key-press))) + (swindow (create-window :parent (screen-root screen) + :x 0 :y 300 :width 200 :height 50 + :background white :border black + :border-width 2 + :event-mask + (xlib:make-event-mask :key-press))) + (input-box (make-input-box display iwindow)) + (slider (make-slider display swindow 15))) + ;; Wrap code in UNWIND-PROTECT, so we clean up after ourselves. + (unwind-protect + (progn + ;; Enable event handling on the display. + (ext:enable-clx-event-handling display + #'ext:object-set-event-handler) + ;; Add the windows to the appropriate object sets. + (system:add-xwindow-object iwindow input-box + *input-box-windows*) + (system:add-xwindow-object swindow slider + *slider-windows*) + ;; Map the windows to the screen. + (map-window iwindow) + (map-window swindow) + ;; Make sure we send all our requests. + (display-force-output display) + ;; Call server for 100,000 events or immediate timeouts. + (dotimes (i 100000) (system:serve-event))) + ;; Disable event handling on this display. + (ext:disable-clx-event-handling display) + (delete-window iwindow display) + (delete-window swindow display) + ;; Close the display. + (xlib:close-display display)))) +\end{lisp} + +\begin{lisp} +(defun delete-window (window display) + ;; Remove the windows from the object sets before destroying them. + (system:remove-xwindow-object window) + ;; Destroy the window. + (destroy-window window) + ;; Pick off any events the X server has already queued for our + ;; windows, so we don't choke since SYSTEM:SERVE-EVENT is no longer + ;; prepared to handle events for us. + (loop + (unless (deleting-window-drop-event display window) + (return)))) + +(defun deleting-window-drop-event (display win) + "Check for any events on win. If there is one, remove it from the + event queue and return t; otherwise, return nil." + (xlib:display-finish-output display) + (let ((result nil)) + (xlib:process-event + display :timeout 0 + :handler #'(lambda (&key event-window &allow-other-keys) + (if (eq event-window win) + (setf result t) + nil))) + result)) +\end{lisp} diff --git a/doc/cmu-user/simple-streams.tex b/doc/cmu-user/simple-streams.tex new file mode 100644 index 0000000000..cdb60042bf --- /dev/null +++ b/doc/cmu-user/simple-streams.tex @@ -0,0 +1,21 @@ +\section{Simple Streams} +\cindex{simple-streams} +\label{simple-streams} + +\cmucl{} includes a partial implementation of \emph{Simple Streams}, a +protocol that allows user-extensible streams\footnote{This +implementation was donated by Paul Foley}. The protocol was proposed +by Franz, Inc. and is intended to replace the \emph{Gray Streams} +method of extending streams. Simple streams are distributed as a +\cmucl{} subsystem, that can be loaded into the image by saying + +\begin{lisp} + (require :simple-streams) +\end{lisp} + +Note that CMUCL's implementation of simple streams is incomplete, and +in particular is currently missing support for the functions +\code{read-sequence} and \code{write-sequence}. Please consult the +\textit{Allegro Common Lisp} documentation for more information on +simple streams. + diff --git a/doc/cmu-user/typehtml.dtx b/doc/cmu-user/typehtml.dtx new file mode 100644 index 0000000000..0cddf95988 --- /dev/null +++ b/doc/cmu-user/typehtml.dtx @@ -0,0 +1,2364 @@ +% +% \iffalse +%% +%% Source File `typehtml.dtx'. +%% Copyright (C) 1996 1997 David Carlisle +%% This file may be distributed under the terms of the LPPL. +%% See 00readme.txt for details. +%% +% +%<*dtx> + \ProvidesFile{typehtml.dtx} +% +%\NeedsTeXFormat{LaTeX2e}[1995/06/01] +%\ProvidesPackage{typehtml} +%\ProvidesFile{typehtml.drv} +% \fi +% \ProvidesFile{typehtml.dtx} + [1997/11/19 v0.12 HTML printer (DPC)] +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\usepackage[html3,subsection*,bigint]{typehtml} +\DocInput{typehtml.dtx} +\end{document} +% +% \fi +% +% \GetFileInfo{typehtml.dtx} +% \begin{document} +% \title{The \textsf{typehtml} package\thanks{This file +% has version number \fileversion, last +% revised \filedate.}} +% \author{David Carlisle} +% \date{\filedate} +% +% \changes{v0.01}{1996/03/06}{Initial version} +% \changes{v0.02}{1996/03/07}{Fiddling} +% \changes{v0.03}{1996/03/08}{HTML3 maths} +% \changes{v0.05}{1996/03/11} +% {change name to prevent clash with html package in latex2html} +% \changes{v0.11}{1996/03/28}{Minor improvements} +% \changes{v0.12}{1997/11/29}{Assorted changes for Bernard Gaulle, active +% french punctuation} +% \maketitle +% +% \CheckSum{2283} +% +% \section{Intoduction} +% +% This package enables the processing of HTML codes. The +% \verb|\dohtml| command +% allows fragments of HTML to be placed within a \LaTeX\ +% document, +%\begin{verbatim} +% \dohtml +% +% html markup ... +% +%\end{verbatim} +% The \verb||\ldots\verb|| is \emph{required}. (It is +% anyway a good idea to have these tags in an HTML document.) +% +% The \verb|\htmlinput| command is similar, but takes a file +% name as argument. In that case the file need not necessarily start +% and end with \verb||\ldots\verb||. +% +% This package covers most of the HTML2 DTD, together with the +% mathematics extensions from HTML3.\footnote +% {The draft specification of HTML3 has expired, and the W3C group +% are currently devising a new proposed extension of HTML, so the +% mathematics typesetting part of this package may need substantial +% revision once a final specification of the HTML mathematics markup +% is agreed.} +% The rest of HTML3 may be added at a later date. +% +% Its current incarnation has not been extensively tested, having been +% thrown together during the last couple of weeks in response to a +% question on \texttt{comp.text.tex} about the availability of such a +% package. +% +% The package falls into three sections. Firstly the options section +% allows a certain amount of customisation, and enabling of +% extensions. Not all these options are fully operational at present. +% Secondly comes a section that implements a kind of SGML parser. This +% is not a real conforming SGML parser (not even a close approximation +% to such a thing!) The assumption (sadly false in the anarchic WWW) +% is that any document will have been validated by a conforming SGML +% parser before it ever gets to the stage of being printed by this +% package. Finally are a set of declarations that essentially map the +% declarations of the HTML DTD into \LaTeX\ constructs. +% +% \section{Options} +% +% \subsection{HTML Level} +% The options \texttt{html2} (the default) and \texttt{html3} control +% HTML variant supported. Using the \texttt{html3} option will use up a +% lot more memory to support the extra features, and the math entity +% (symbol) names. Against my better judgement there is also a +% \texttt{netscape} option to allow some of the non-HTML tags accepted +% by that browser. +% +% \subsection{Headings} +% The six options \texttt{chapter}, \texttt{chapter*}, \texttt{section}, +% \texttt{section*}, \texttt{subsection} and \texttt{subsection*} +% Determine to which \LaTeX\ sectional command the HTML element +% \texttt{h1} is mapped. (\texttt{h2}--\texttt{h6} will +% automatically follow suit.) The default is \texttt{section*}. +% +% \subsection{Double Quote Handling} +% Most HTML pages use |"| as as a quotation mark in text, for +% example: +%\begin{verbatim} +% quoted "like this" example +%\end{verbatim} +% +% This slot in the ISO latin-1 encoding is for `straight' double +% quotes. Unfortunately the Standard \TeX\ fonts in the OT1 encoding +% do not have such a character, only left and right quotes, ``like +% this''. By default this package uses the \texttt{straightquotedbl} +% option which uses the \LaTeX\ command |\textquotedbl| to render +% |"|. If used with the T1 encoded fonts |\usepackage[T1]{fontenc}| +% then the straight double quote from the current font is used. With +% OT1 fonts, the double quote is taken from the |\ttfamily| font, +% which looks \texttt{"}like this\texttt{"} which is fairly +% horrible, but better than the alternative which is ''like this''. +% +% The \texttt{smartquotedbl} option redefines |"| so that it produces +% alternatively an open double quote `` then a close ''. As there is a +% chance of it becoming confused, it is reset to `` at the beginning +% of every paragraph, whatever the current mode. +% +% Neither of these options affects the use of |"| as part of the SGML +% syntax to surround attribute values. +% +% In principle the package ought to have similar options dealing with +% the single quote, but there the situation is more complicated due to +% its dual use as an apostrophe, so currently the package takes no +% special precautions: all single quotes are treated as a closing +% quote/apostrophe. Also the conventions of `open' and `close' quotes +% only really apply to English. If someone wants to suggest what the +% package should do with |"| in other languages\ldots +% +% \subsection{Images} +% The default option is \texttt{imgalt} This means that all inline +% images (the HTML \texttt{img} element) are replaced by the text +% specified by the \texttt{alt} attribute, or \textsf{[image]} if no +% such attribute is specified. +% +% The \texttt{imggif} option\footnote{one day} uses the +% \verb|\includegraphics| command so that inline images appear as +% such in the printed version. +% +% The \texttt{imgps} option\footnotemark[1] is similar to +% \texttt{imggif} but first replaces the extension \texttt{.gif} at +% the end of the source file name by \texttt{.ps}. This will enable +% drivers that can not include GIF files to be used, as long as the +% user keeps the image in both PostScript and Gif formats. +% +% \subsection{Hyperref} +% +% Several options control how the HTML anchor tag is treated. +% +% The default \texttt{nohyperref} option ignores name anchors, and +% typesets the body of src anchors using |\emph|. +% +% The \texttt{ftnhyperref} option is similar to \texttt{nohyperref}, +% but adds a footnote showing the destination address of each link, +% as specified by the SRC attribute. +% +% If the \texttt{hyperref} option is specified, the hypertext markup +% in the HTML file will be replicated using the +% hypertext specials of the Hyper\TeX\ group. If in addition the +% \textsf{hyperref} package is loaded, the extra features of that +% package may be used, for instance producing `native PDF' specials +% for direct use by Adobe distiller rather than producing the specials +% of the hyper\TeX\ conventions. +% +% The \texttt{dviwindo} option converts the hypertext information in +% the HTML into the |\special| conventions of Y\&Y's \emph{dviwindo} +% previewer for Microsoft Windows. +% +% \subsection{Big Integrals} +% \LaTeX\ does not treat integral signs as variable sized symbols, +% in the way that it treats delimiters such as brackets. In common +% with summation signs and a few other operators, they come in +% just two fixed sizes, a small version for inline mathematics, and a +% large version used in displays. In fact by default \LaTeX\ always +% uses the same two sizes (from the 10\,pt math extension font) even if +% the document class has been specified with a size option such as +% \texttt{12pt}, or if a size command such as |\large| has been used. +% +% The standard \textsf{exscale} package loads the math extension font +% at larger sizes if the current font size is larger than 10\,pt. +% +% The HTML3 math description explicitly states that integral signs +% should be treated like delimiters and stretch if applied to a large +% math expression. By default this package ignores this advice and +% treats integral signs in the standard way, however an option +% \texttt{bigint} does cause integral signs to `stretch' (or at least +% be taken from a suitably large font). The standard Computer Modern +% fonts use a very `sloped' integral which means that they are +% not really suitable for being stretched. Some other math fonts, for +% instance Lucida, have more vertical integral signs, and one could +% imagine in those cases making an integral sign with a `repeatable' +% vertical middle section so that it could grow to an arbitrary size, in +% the way that brackets grow. +% +% \section{Latin-1 characters} +% The SGML character entities for the ISO-Latin1 characters such as +% \texttt{\é} are recognised by this style, although as usual, +% some of them such as the Icelandic thorn character, +% \texttt{\þ}, \verb|\th|, produce an error if the old `OT1' +% encoded fonts are being used. These characters will print correctly +% if `T1' encoded fonts are used, for example by declaring +% \verb|\usepackage[T1]{fontenc}|~. +% +% HTML also allows direct 8-bit input of characters according to the +% ISO-latin1 encoding, to enable this you need to enable latin-1 input +% for \LaTeX\ with a declaration such as +% \verb|\usepackage[latin1]{inputenc}|~. +% +% \section{Mathematics} +% The HTML3 MATH element is fairly well supported, including the BOX +% and CLASS attributes. (Currently only CHEM value for class is +% supported, and as far as I can see the BOX attribute is only in the +% report, not in the dtd.) The super and subscripts are supported, +% including the shortref maps, however only the default right +% alignment is +% implemented so far. The convention described in the draft report +% for using white space to distinguish superscript positioning is +% fairly \emph{horrible}! +% +% +% The documentation that I could find on HTML3 did not include a full +% list of the entity names to be used for the symbols. This +% package currently \emph{only} defines the following entities, which +% should be enough for testing purposes at least. +% +% \begin{itemize} +% \item +% |gt| ($>$) |lt| ($<$) (Already in the HTML2 DTD) +% +% \item +% Some Greek letters. +% +% |alpha| ($\alpha$) +% |beta| ($\beta$) +% |gamma| ($\gamma$) +% |Gamma| ($\Gamma$) +% +% \item +% Integral and Sum. $\int$ grows large if the \texttt{bigint} package +% option is given. +% +% |int| ($\int$) +% |sum| ($\sum$) +% +% \item +% Braces (The delimiters ()[] also stretch as expected in the BOX +% element) +% +% |lbrace| ($\lbrace$) +% |rbrace| ($\rbrace$) +% +% \item +% A random collection of mathematical symbols: +% +% |times| ($\times$) +% |cup| ($\cup$) +% |cap| ($\cap$) +% |vee| ($\vee$) +% |wedge| ($\wedge$) +% |infty| ($\infty$) +% |oplus| ($\oplus$) +% |ominus| ($\ominus$) +% |otimes| ($\otimes$) +% +% \item +% A Minimal set of trig functions: +% +% |sin| ($\sin$) +% |cos| ($\cos$) +% |tan| ($\tan$) +% +% \item +% Also in the special context as attributes to ABOVE and BELOW elements +% the entities: +% +% |overbrace| ($\overbrace{\quad}$) +% |underbrace| ($\underbrace{\quad}$) and any (\TeX) math accent name. +% +% \end{itemize} +% +% \section{SGML Minimisation features} +% SGML (and hence HTML) support various minimisation features that aim +% to make it easier to enter the markp `by hand'. These features make +% the kind of `casual' attempt at parsing SGML as implemented in this +% package somewhat error prone. +% +% Two particular features are enabled in HTML. The so called SHORTTAG +% feature means that the name of a tag may be omitted if it may be +% inferred from the context. Typically in HTML this is used in +% examples like +%\begin{verbatim} +% A Document Title</> +%\end{verbatim} +% The end tag is shortened to |</>| and the system infers that +% TITLE is the element to be closed. +% +% The second form of minimisation enabled in HTML is the OMITTAG +% feature. Here a tag may be omitted altogether in certain +% circumstances. +% A typical example is the HTML list, where each list item is started +% with |<li>| but the closing |</li>| at the end of the item may be +% omitted and inferred by the following |<li>| or |</ol>| tag. +% +% This package is reasonably robust with respect to omitted +% tags. However it only makes a half hearted attempt at supporting the +% SHORTTAG feature. The TITLE example above would work, but nested +% elements, with multiple levels of minimised end tags will probably +% break this package. +% +% It would be possible to build a \LaTeX\ system that had full +% knowledge of the HTML (or any other) DTD and in particular the +% `content model' of every element, this would produce a more robust +% parsing system but would take longer than I was prepared to +% spend this week\ldots\ In anycase if you need a fully conforming SGML +% parser, it probably makes sense to use an existing one (excellent +% free parsers are freely available) and then convert the output of +% the parser to a form suitable for \LaTeX. In that way all such +% concerns about SGML syntax features such as minimisation will have +% been resolved by the time \LaTeX\ sees the document. +% +% \section{Examples} +% \let\olddohtml\dohtml +% \def\dohtml{\olddohtml\MakePercentIgnore} +% +% +% \subsection{A section} +% This document uses the \texttt{subsection*} option. +%\begin{verbatim} +% <h1>HTML and LaTeX</h1> +%\end{verbatim} +% \dohtml +% <html> +% <h1>HTML and LaTeX</h1> +% </html> +% +% \subsection{An itemised list} +%\begin{verbatim} +% <ul> +% <li> something +% <li> something else +% </ul> +%\end{verbatim} +% \dohtml +% <html> +% <ul> +% <li> something +% <li> something else +% </ul> +% </html> +% +% \subsection{Latin1 Characters} +%\begin{verbatim} +% é ö +%\end{verbatim} +% \dohtml +% <html> +% é ö +% </html> +% +% \subsection{Images} +% Currently only the ALT attribute is supported. +%\begin{verbatim} +% This is an image of me <img alt="DPC" src="dpc.gif"> +%\end{verbatim} +% \dohtml +% <html> +% This is an image of me <img alt="DPC" src="dpc.gif"> +% </html> +% +% \subsection{A Form} +%\begin{verbatim} +% <form +% action="http://www.cogs.susx.ac.uk/cgi-bin/ltxbugs2html" +% method=get><hr> +% You can search for all the bug reports about: <select name="category"> +% <option>AMS LaTeX</option> +% <option>Babel</option> +% <option>Graphics and colour</option> +% <option>LaTeX</option> +% <option selected>Metafont fonts</option> +% <option>PostScript fonts</option> +% <option>Tools</option> +% </select> +% <hr> +% </form> +%\end{verbatim} +% \dohtml +% <html> +% <form +% action="http://www.cogs.susx.ac.uk/cgi-bin/ltxbugs2html" +% method=get><hr> +% You can search for all the bug reports about: <select name="category"> +% <option>AMS LaTeX</option> +% <option>Babel</option> +% <option>Graphics and colour</option> +% <option>LaTeX</option> +% <option selected>Metafont fonts</option> +% <option>PostScript fonts</option> +% <option>Tools</option> +% </select> +% <hr> +% </form> +% </html> +% +% \subsection{Styles of Mathematics} +%\begin{verbatim} +% <math> +% H_2_O + CO_2_ +% </math> +% <math class=chem> +% H_2_O + CO_2_ +% </math> +% <math box> +% H_2_O + CO_2_ +% </math> +% <math class=chem box> +% H_2_O + CO_2_ +% </math> +%\end{verbatim} +% \dohtml +% <html> +% <math> +% H_2_O + CO_2_ +% </math> +% <math class=chem> +% H_2_O + CO_2_ +% </math> +% <math box> +% H_2_O + CO_2_ +% </math> +% <math class=chem box> +% H_2_O + CO_2_ +% </math> +% </html> +% +% \subsection{Integrals} +% Stretchy integrals with the \texttt{bigint} option. +%\begin{verbatim} +% <math> +% {∫^1^_3_<left> +% 1 +% <over> +% {x+{1<over>x+{2<over>x+ +% {3<over>x+{4<over>x}}}}} +% <right>dx} +% </math> +%\end{verbatim} +% \dohtml +% <html> +% <math> +% {∫^1^_3_<left> +% 1 +% <over> +% {x+{1<over>x+{2<over>x+ +% {3<over>x+{4<over>x}}}}} +% <right><t>d</t> x} +% </math> +% </html> +% And the same integral with the standard integral sign. +% \begingroup +% \makeatletter +% \let\HTML@bigint\int +% \dohtml +% <html> +% <math> +% {∫^1^_3_<left> +% 1 +% <over> +% {x+{1<over>x+{2<over>x+ +% {3<over>x+{4<over>x}}}}} +% <right><t>d</t>x} +% </math> +% </html> +% \endgroup +% +% \subsection{Oversized delimiters} +%\begin{verbatim} +% <math> +% <box>(<left>1 <atop> 2 <right>)</box> +% <box size=large>(<left>1 <atop> 2 <right>)</box> +% </math> +%\end{verbatim} +% \dohtml +% <html> +% <math> +% <box>(<left>1 <atop> 2 <right>)</box> +% <box size=large>(<left>1 <atop> 2 <right>)</box> +% </math> +% </html> +% +% \subsection{Roots, Overbraces etc} +%\begin{verbatim} +% <math> +% <above sym=overbrace> abc </above><sup>k</sup> +%   +% <root>3<of>x</root> +% <sqrt>5</sqrt> +%   +% <below sym=underline> abc </below> +% <above sym=widehat> abc </above> +% </math> +%\end{verbatim} +% \dohtml +% <html> +% <math> +% <above sym=overbrace> a bc </above><sup>k</sup> +%   +% <root>3<of>x</root> +% <sqrt>5</sqrt> +%   +% <below sym=underline> abc </below> +% <above sym=widehat> abc </above> +% </math> +% </html> +% +% \subsection{Arrays} +% +%\begin{verbatim} +% <math> +% aa<array align=top> +% <row><item><text>first col</text><item><text>second col</text><item> +% <text>third col</text><item><text>fourth col</text> +% <row><item><text>row 2</text><item> a_22_ <item>a_23_<item>a_24_ +% <row><item><text>row 3</text><item rowspan=3 colspan=2> +% a_32_-a_53_<item>a_34_ +% <row><item><text>row 4</text><item>a_44_ +% <row><item><text>row 5</text><item>a_54_ +% <row><item><text>row 6</text><item align=left> +% al_62_<item>a_63_<item>a_64_ +% <row><item><text>row 7</text><item align=right> +% ar_72_<item>a_73_<item>a_74_ +% </array>bb +% </math> +%\end{verbatim} +% +% \dohtml +% <html> +% <math> +% aa<array align=top> +% <row><item><text>first col</text><item><text>second col</text><item> +% <text>third col</text><item><text>fourth col</text> +% <row><item><text>row 2</text><item> a_22_ <item>a_23_<item>a_24_ +% <row><item><text>row 3</text><item rowspan=3 colspan=2> +% a_32_-a_53_<item>a_34_ +% <row><item><text>row 4</text><item>a_44_ +% <row><item><text>row 5</text><item>a_54_ +% <row><item><text>row 6</text><item align=left> +% al_62_<item>a_63_<item>a_64_ +% <row><item><text>row 7</text><item align=right> +% ar_72_<item>a_73_<item>a_74_ +% </array>bb +% </math> +% </html> +% +% Repeat that element, but change the ARRAY attributes as follows: +%\begin{verbatim} +% <array ldelim="(" rdelim=")" labels> +%\end{verbatim} +% +% \dohtml +% <html> +% <math> +% aa<array ldelim="(" rdelim=")" labels> +% <row><item><text>first col</text><item><text>second col</text><item> +% <text>third col</text><item><text>fourth col</text> +% <row><item><text>row 2</text><item> a_22_ <item>a_23_<item>a_24_ +% <row><item><text>row 3</text><item rowspan=3 colspan=2> +% a_32_-a_53_<item>a_34_ +% <row><item><text>row 4</text><item>a_44_ +% <row><item><text>row 5</text><item>a_54_ +% <row><item><text>row 6</text><item align=left> +% al_62_<item>a_63_<item>a_64_ +% <row><item><text>row 7</text><item align=right> +% ar_72_<item>a_73_<item>a_74_ +% </array>bb +% </math> +% </html> +% +% and finally an example of COLSPEC +%\begin{verbatim} +% <math> +% <array colspec="R+C=L"> +% <row><item>abc_11_<item>abc_12_<item>abc_13_ +% <row><item>a_21_<item>a_22_<item>a_23_ +% <row><item>a_31_<item>a_32_<item>a_33_ +% </array> +% </math> +%\end{verbatim} +% +% \dohtml +% <html> +% <math> +% <array colspec="R+C=L"> +% <row><item>abc_11_<item>abc_12_<item>abc_13_ +% <row><item>a_21_<item>a_22_<item>a_23_ +% <row><item>a_31_<item>a_32_<item>a_33_ +% </array> +% </math> +% </html> +% +% \subsection{Tables} +% HTML3 tables are not yet supported, but there is a minimal ammount to +% catch simple cases. +% +%\begin{verbatim} +% <table> +% <caption>Simple Table</caption> +% <tr><td>one <td> two +% <tr><td>a <td> b +% </table> +%\end{verbatim} +% +% \dohtml +% <html> +% <table> +% <caption>Simple Table</caption> +% <tr><td>one <td> two +% <tr><td>a <td> b +% </table> +% </html> +% +% \StopEventually{} +% +% \section{The Code} +% +% \subsection{Option Handling} +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{html2}{\let\HTML@two@stop\endinput} +% \end{macrocode} +% +% The |#| here, and in later option code will need doubling +% if you are using a \LaTeX\ before June 95. +% \begin{macrocode} +\DeclareOption{netscape} + {\def\HTML@not#1{\SGML@w{<#1> is not valid HTML}}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{html3}{\let\HTML@two@stop\relax} +% \end{macrocode} +% +% \changes{v0.08}{1996/03/16}{Add nohyperref option} +% \begin{macrocode} +\DeclareOption{nohyperref}{% + \let\HTML@doname\@secondoftwo + \def\HTML@dosrc#1#2{\emph{#2}}} +% \end{macrocode} +% +% \changes{v0.08}{1996/03/16}{Add ftnhyperref option} +% \begin{macrocode} +\DeclareOption{ftnhyperref}{% + \let\HTML@doname\@secondoftwo + \def\HTML@dosrc#1#2{\emph{#2}\footnote{HREF: \texttt{#1}}}} +% \end{macrocode} +% +% \changes{v0.08}{1996/03/16} +% {make hyperref independent of hyperref package} +% \begin{macrocode} +\DeclareOption{hyperref}{% + \AtBeginDocument{% + \providecommand\href[2]{\special{html:<A href="#1">}% + #2\special{html:</A>}}% + \providecommand\hypertarget[2]{\special{html:<A name="#1">}% + #2\special{html:</A>}}% + \let\HTML@doname\hypertarget + \let\HTML@dosrc\href}} +% \end{macrocode} +% +% \changes{v0.08}{1996/03/16}{Add dviwindo option} +% Dviwindo itself deals with links within a document i.e., a src +% attribute of the form |"#name"|. The code below detects +% a more general URL and fires a |launch:| action from the |\special|, +% which calls the non-existant command \texttt{typehtml}. Presumably +% this could be a batch file that calls netscape or some other WWW +% engine to process the URL. +% \begin{macrocode} +\DeclareOption{dviwindo}{% + \def\HTML@dosrc#1#2{{% + \leavevmode\sbox\z@{#2}\count@\ht\z@\@tempcnta\wd\z@ + \if\string##\@car#1\@nil + \special{button: \the\@tempcnta\space\the\count@\space + "\@gobble#1"}% + \else + \special{button: \the\@tempcnta\space\the\count@\space + launch: typehtml "#1"} + \fi + \special{color push}\special{color rgb 0 1 0}% + \unhbox\z@ + \special{color pop}}}% + \def\HTML@doname#1#2{\leavevmode\special{mark: "#1"}#2}}% +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{imgalt}{} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{imggif}{\SGML@w{img gif support not done yet}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{imgps}{\SGML@w{img ps support not done yet}} +% \end{macrocode} +% +% \changes{v0.10}{1996/03/25}{Add double quote handling} +% \begin{macrocode} +\DeclareOption{smartquotedbl}{% + \def\SGMLquotedbla{% + \textquotedblleft\global\let\SGMLquotedbl\SGMLquotedblb} + \def\SGMLquotedblb{% + \textquotedblright\global\let\SGMLquotedbl\SGMLquotedbla} + \let\SGMLquotedbl\SGMLquotedbla + \let\SGML@savedeverypar\everypar + \newtoks\everypar + \SGML@savedeverypar{% + \global\let\SGMLquotedbl\SGMLquotedbla\the\everypar}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{straightquotedbl}{% + \DeclareTextCommandDefault{\textquotedbl}{{\ttfamily\char`\"}}% + \let\SGMLquotedbl\textquotedbl} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{chapter}{% + \def\HTML@headings{% + \chapter\section\subsection% + \subsubsection\paragraph\subparagraph}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{chapter*}{% + \def\HTML@headings{% + {\chapter*}{\section*}{\subsection*}% + {\subsubsection*}{\paragraph*}{\subparagraph*}}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{section}{% + \def\HTML@headings{% + \section\subsection% + \subsubsection\paragraph\subparagraph\endgraf}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{section*}{% + \def\HTML@headings{% + {\section*}{\subsection*}% + {\subsubsection*}{\paragraph*}{\subparagraph*}\endgraf}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{subsection}{% + \def\HTML@headings{% + \subsection% + \subsubsection\paragraph\subparagraph\endgraf\endgraf}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{subsection*}{% + \def\HTML@headings{% + {\subsection*}% + {\subsubsection*}{\paragraph*}{\subparagraph*}\endgraf\endgraf}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{bigint}{% + \let\HTML@int\int + \AtEndOfPackage{\RequirePackage{exscale}}} +% \end{macrocode} +% +% \changes{v0.08}{1996/03/16}{Make unnumbered sections the default} +% \begin{macrocode} +\ExecuteOptions{section*,imgalt,html2,nohyperref,straightquotedbl} +% \end{macrocode} +% +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% +% \subsection{Fake SGML parser} +% +% \begin{macrocode} +\begingroup +% \end{macrocode} +% +% \changes{v0.12}{1997/11/29}{activate gtr and semicolon} +% \begin{macrocode} +\catcode`\<=\active +\catcode`\>=\active +\catcode`\&=\active +\catcode`\$=\active +\catcode`\"=\active +\catcode`\^=\active +\catcode`\_=\active +\catcode`\;=\active +\catcode`\A=\active +\catcode`\B=\active +\catcode`\C=\active +\catcode`\D=\active +% \end{macrocode} +% \changes{v0.12}{1997/11/29}{\cs{uppercase} not \cs{lowercase}} +% \begin{macrocode} +\uccode`\A=`\{% +\uccode`\B=`\}% +% \end{macrocode} +% \changes{v0.10}{1996/03/25}{Swap round lccodes of C and D} +% \changes{v0.10}{1996/03/25}{Add double quote handling} +% \begin{macrocode} +\uccode`\C=`\|% +\uccode`\D=`\\% +% \end{macrocode} +% +% \begin{macrocode} +\uppercase{\endgroup +% \end{macrocode} +% +% \begin{macro}{\SGMLent@@} +% \changes{v0.12}{1997/11/29}{delimit with active semicolon and gtr} +% \begin{macrocode} +\def\SGMLent@@#1;{\csname SGML@E@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLent@@} +% \changes{v0.12}{1997/11/29}{macro added} +% \begin{macrocode} +\def\SGML@def@active#1>{% + \expandafter\def\csname SGML@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\def\dohtml{% + \begingroup + \ifx;\@undefined\expandafter\let\expandafter;\string;\fi + \ifx>\@undefined\expandafter\let\expandafter>\string>\fi + \catcode`\<=\active + \catcode`\>=\active + \catcode`\&=\active + \catcode`\{=\active + \catcode`\}=\active + \catcode`\$=\active + \catcode`\"=\active + \catcode`\^=\active + \catcode`\_=\active + \catcode`\\=\active + \catcode`\|=\active + \catcode\endlinechar=10 + \catcode`\%=12 + \catcode`\#=12 + \catcode`\;=\active + \def\verbatim@nolig@list{\do\`\do\,\do\'\do\-} + \def<{\SGMLopen}% + \def&{\SGMLent}% + \let^\textasciicircum + \let~\textasciitilde + \def_{\_}% + \let$\$% + \def"{\SGMLquotedbl}% + \def A{\{}% + \def B{\}}% + \def C{\texttt{|}}% + \def D{\texttt{\char`\\}}% +% \end{macrocode} +% \changes{v0.07}{1996/03/15}{macro added} +% Need to be careful about writing to table of contents. +% \begin{macrocode} + \def\addcontentsline##1##2##3{% + {\def<{\string<}\def&{\string&}% + \addtocontents{##1}{\protect\dotochtml<html>}% + \addtocontents{##1}{\protect\contentsline{##2}{##3}{\thepage}}% + \addtocontents{##1}{\protect</html>}}}} +% \end{macrocode} +% +% \begin{macro}{\dotochtml} +% A `compromise' version of |\dohtml| for use in table of contents +% files. +% Allows HTML markup |<|, |&| etc, but also \TeX\ markup |\|, |{|, |}|. +% As these are incompatible, this is not 100\% reliable but it seems to +% cover most cases in practice. +% \changes{v0.07}{1996/03/15}{macro added} +% \begin{macrocode} +\def\dotochtml{% + \dohtml + \catcode`\\\z@ + \catcode`\{\@ne + \catcode`\}\tw@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLshortend} +% \changes{v0.04}{1996/03/09}{macro added} +% \begin{macrocode} +\def\SGMLshortend{/} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLgrab@} +% \begin{macrocode} +\def\SGMLgrab@#1<#2>{% + \edef\@tempd{\lowercase{\def\noexpand\@tempd{\gobblespc#2 \relax}}}% + \@tempd +% \end{macrocode} +% +% \changes{v0.04}{1996/03/09}{SHORTTAG support} +% \begin{macrocode} + \ifx\@tempd\SGMLshortend\let\@tempd\@tempc\fi +% \end{macrocode} +% +% \begin{macrocode} + \ifx\@tempb\@tempd + \advance\@tempcnta\@ne + \else + \ifx\@tempc\@tempd + \advance\@tempcnta\m@ne + \fi + \fi + \ifnum\@tempcnta=\z@ + \expandafter\@tempa\expandafter{\the\@temptokena#1}% + \else + \addto@hook\@temptokena{#1<#2>}% + \expandafter\SGMLgrab@ + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLopen} +% \changes{v0.10}{1996/03/25}{Add double quote handling} +% \changes{v0.12}{1997/11/29}{delimit with active gtr} +% \begin{macrocode} +\def\SGMLopen#1>{% + \SGMLopen@#1 \@nil} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +} +% \end{macrocode} +% +% \begin{macro}{\htmlinput} +% \begin{macrocode} +\def\htmlinput#1{\dohtml\let\@endhtml\relax\input{#1}\endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\gobblespc} +% \begin{macrocode} +\def\gobblespc#1 #2\relax{#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLgrabber} +% \begin{macrocode} +\def\SGMLgrabber#1#2{% + \def\@tempa{#2}% + \@tempcnta\@ne + \@temptokena{}% + \lowercase{\def\@tempb{#1}\def\@tempc{/#1}}% + \SGMLgrab@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLopen@} +% \changes{v0.07}{1996/03/15}{macro added} +% \begin{macrocode} +\begingroup +\catcode`\"=\active +\uppercase{\endgroup +\def\SGMLopen@#1 #2\@nil{% + \toks@{}% + \edef\@tempa{\lowercase{\def\noexpand\SGMLelement{#1}}}\@tempa + \if!\@car#1\relax\@nil + \toks@{#1 #2}% + \SGML@w{Declaration ignored\MessageBreak<\the\toks@>\MessageBreak}% + \else + \if$#2$\else + \replacequotes#2"\@nil"% + \SGMLafterfi + \expandafter\toks@\expandafter{\expandafter}% + \expandafter\SGMLgetattrib\the\toks@ \@nil + \fi + \expandafter\ifx\csname SGML@\SGMLelement + \expandafter\endcsname\relax + \SGML@w{<\SGMLelement> undefined}% + \else + \csname SGML@\SGMLelement + \expandafter\expandafter\expandafter\endcsname + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\replacequotes} +% \begin{macrocode} +\def\replacequotes#1"#2"{% + \def\@tempb{#2}% + \ifx\@tempb\@nnil + \addto@hook\toks@{#1}% + \else + \addto@hook\toks@{#1{#2}}% + \expandafter\replacequotes + \fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLafterfi} +% \begin{macrocode} +\def\SGMLafterfi#1\fi{\fi#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLgobbletofi} +% \begin{macrocode} +\def\SGMLgobbletofi#1\fi{\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLgetattrib} +% \changes{v0.10}{1996/03/25}{use dollar to distingish empty value} +% \begin{macrocode} +\def\SGMLgetattrib#1 #2{% + \ifx\box#1\box\else + \SGMLgetval#1=$=\@nil + \def\@tempa{#2}% + \ifx\@tempa\@nnil + \expandafter\SGMLgobbletofi + \else + \expandafter\SGMLafterfi + \fi + \SGMLgetattrib#2% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLgetval} +% \changes{v0.08}{1996/03/16}{lowercase attribute names} +% If no value was supplied |#2| will be |$| (Even if the value is |$| +% The test is false, as that would be catcode 13. Done this way rather +% than looking for empty to distinguish |alt=""| with empty value. +% \begin{macrocode} +\def\SGMLgetval#1=#2=#3\@nil{% + \ifcat$#2% + \lowercase{\SGML@addattrib\doimplied{#1}}% + \else + \lowercase{\SGML@addattrib{\do{#1}}}{#2}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGML@addattrib} +% \changes{v0.08}{1996/03/16}{macro added} +% \begin{macrocode} +\def\SGML@addattrib#1#2{\addto@hook\toks@{#1{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGML@w} +% \begin{macrocode} +\def\SGML@w{\PackageWarning{typehtml}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLdef} +% \changes{v0.12}{1997/11/29}{allow active delimiters} +% \begin{macrocode} +\def\SGMLdef#1{% + \ifcat\noexpand#1\noexpand~% + \expandafter\SGML@def@active + \else + \expandafter\SGML@def + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLdef} +% \changes{v0.12}{1997/11/29}{macro added} +% make sure this is a catcode 12 |>|. +% \begin{macrocode} +\edef\@tempa{\def\noexpand\SGML@def##1\string>}\@tempa{% + \expandafter\def\csname SGML@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLent} +% \begin{macrocode} +\expandafter\def\expandafter\SGMLent\expandafter{% + \expandafter\protect\csname& \endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{& } +% \begin{macrocode} +\expandafter\def\csname& \endcsname{% + \futurelet\@let@token\SGMLent@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLent@} +% \begin{macrocode} +\def\SGMLent@{% + \ifx\@let@token\@sptoken + \&% + \else + \expandafter\SGMLent@@ + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGMLentity} +% \begin{macrocode} +\def\SGMLentity#1{% + \expandafter\def\csname SGML@E@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \subsection{The HTML2 DTD} +% +% \begin{macrocode} +\SGMLdef<html>{} +\SGMLdef</html>{\@endhtml} +\let\@endhtml\endgroup +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<title>{\typeout{***TITLE***}\SGMLgrabber{title}\typeout} +% \end{macrocode} +% +% \begin{macrocode} +\long\def\@tempa#1#2#3#4#5#6{% + \SGMLdef<h1>{\SGMLgrabber{h1}{\HTMLsection{#1}}}% + \SGMLdef<h2>{\SGMLgrabber{h2}{\HTMLsection{#2}}}% + \SGMLdef<h3>{\SGMLgrabber{h3}{\HTMLsection{#3}}}% + \SGMLdef<h4>{\SGMLgrabber{h4}{\HTMLsection{#4}}}% + \SGMLdef<h5>{\SGMLgrabber{h5}{\HTMLsection{#5}}}% + \SGMLdef<h6>{\SGMLgrabber{h6}{\HTMLsection{#6}}}} +% \end{macrocode} +% +% \begin{macrocode} +\expandafter\@tempa\HTML@headings +% \end{macrocode} +% +% \begin{macrocode} +\def\HTMLsection#1#2{#1{\ignorespaces#2\unskip}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<head>{} +\SGMLdef</head>{} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<body>{} +\SGMLdef</body>{} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<bodytext>{} +\SGMLdef</bodytext>{} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<p>{\par} +\SGMLdef</p>{\par} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<blockquote>{\begin{quote}} +\SGMLdef</blockquote>{\end{quote}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<address>{\begin{quote}} +\SGMLdef</address>{\end{quote}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<ul>{\begin{itemize}} +\SGMLdef</ul>{\end{itemize}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<ol>{\begin{enumerate}} +\SGMLdef</ol>{\end{enumerate}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<li>{\item} +\SGMLdef</li>{} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<dl>{% + \let\do\dldo + \let\doimplied\dlimplied + \begin{description}\the\toks@} +\SGMLdef</dl>{\end{description}} +% \end{macrocode} +% +% \begin{macrocode} +\def\dldo#1#2{% + \def\@tempa{compact}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \itemsep\z@ + \advance\@totalleftmargin-\leftmargin + \advance\linewidth\leftmargin + \itemindent-\labelsep + \leftmargin\z@ + \parshape \@ne \@totalleftmargin \linewidth + \fi} +\def\dlimplied#1{\dldo{#1}\relax} +% \end{macrocode} +% +% \begin{macrocode} +\def\itx#1{\item[#1]} +\SGMLdef<dt>{\begin{lrbox}\z@\bfseries\let\maybeenddt\enddt} +\SGMLdef</dt>{\maybeenddt} +\SGMLdef<dd>{\maybeenddt} +\SGMLdef</dd>{} +\def\enddt{\end{lrbox}\item[\unhbox\z@]} +\let\maybeenddt\relax +% \end{macrocode} +% +% \changes{v0.07}{1996/03/15}{hyperref support (SPQR)} +% \begin{macrocode} +\SGMLdef<a>{\SGMLgrabber{a}\HTML@anchor} +% \end{macrocode} +% +% \begin{macro}{\HTML@anchor} +% This handles the A tag. +% \changes{v0.04}{1996/03/09}{macro added} +% \begin{macrocode} +\def\HTML@anchor#1{{% + \let\@tempa\@gobble + \def\_{\string_}% + \let\do\ado + \the\toks@ + \@tempa{#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ado} +% Thanks to SPQR for first pass at integrating \textsf{hyperref}. +% \begin{macrocode} +\def\ado#1#2{% + \def\@tempb{name}\def\@tempc{#1}% + \ifx\@tempb\@tempc + \let\@tempa\@firstofone + \def\@tempa{\HTML@doname{#2}}% + \else + \def\@tempa{\HTML@dosrc{#2}}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \changes{v0.03}{1996/03/08}{pre is alltt not verbatim} +% \begin{macrocode} +\SGMLdef<pre>{% + \par + \begingroup + \parindent\z@ + \obeylines\verbatim@font\@noligs + \frenchspacing\@vobeyspaces} +% \end{macrocode} +% +% +% \begin{macrocode} +\SGMLdef</pre>{\endgroup} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<tt>{\SGMLgrabber{tt}\texttt} +\SGMLdef<b>{\SGMLgrabber{b}\textbf} +\SGMLdef<i>{\SGMLgrabber{i}\textit} +\SGMLdef<em>{\SGMLgrabber{em}\emph} +\SGMLdef<strong>{\SGMLgrabber{strong}\textbf} +\SGMLdef<code>{\SGMLgrabber{code}\texttt} +\SGMLdef<samp>{\SGMLgrabber{samp}\textsf} +\SGMLdef<kbd>{\SGMLgrabber{kbd}\texttt} +\SGMLdef<var>{\SGMLgrabber{var}\textit} +\SGMLdef<cite>{\SGMLgrabber{cite}\textit} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<form>{\par\medskip} +\SGMLdef</form>{\par\medskip} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<select>{% + \let\do\selectdo + \the\toks@\par + \begin{tabular}{|l|}% + \hline\@tempc\\\hline + \let\tabularnewline\relax + \ignorespaces} +% \end{macrocode} +% +% \begin{macrocode} +\def\selectdo#1#2{% + \def\@tempa{name}\def\@tempb{#1}% + \ifx\@tempa\@tempb\def\@tempc{#2}\fi} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef</select>{\\\hline\end{tabular}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<option>{% + \gdef\optionbul{\phantom{$\bullet$}}% + \let\do\optiondo + \let\doimplied\optionimplied + \the\toks@ + \tabularnewline + \let\tabularnewline\\% + \optionbul\space\ignorespaces} +\SGMLdef</option>{} +% \end{macrocode} +% +% \begin{macro}{\optiondo} +% Handle attributes to the OPTION element. +% \begin{macrocode} +\def\optiondo#1#2{% + \def\@tempa{selected}\def\@tempb{#1}% + \ifx\@tempa\@tempb\gdef\optionbul{$\bullet$}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optionimplied} +% Handle the case where just the attribute value is given. +% \begin{macrocode} +\def\optionimplied#1{% + \def\@tempa{selected}\def\@tempb{#1}% + \ifx\@tempa\@tempb\gdef\optionbul{$\bullet$}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\SGMLdef<input>{} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<img>{{% + \let\do\imgdo + \def\@tempa{\doimage}% + \the\toks@ + \@tempa}} +% \end{macrocode} +% +% \begin{macrocode} +\def\doimage{\textsf{[image]}} +% \end{macrocode} +% +% \begin{macro}{\imgdo} +% Handle IMG attributes (not very usefully) +% \begin{macrocode} +\def\imgdo#1{\csname img=#1\endcsname} +\expandafter\def\csname img=align\endcsname#1{% + \SGML@w{align=#1 ignored}} +\expandafter\def\csname img=src\endcsname#1{% + \SGML@w{src=#1 ignored}} +\expandafter\def\csname img=height\endcsname#1{% + \SGML@w{height=#1 ignored}} +\expandafter\def\csname img=alt\endcsname#1{% + \def\doimage{#1}} +% \end{macrocode} +% \end{macro} +% +% Horizontal rules and line breaks. +% \changes{v0.12}{1997/11/29}{BR in vertical mode allowed.} +% \begin{macrocode} +\SGMLdef<hr>{\par\smallskip\hrule\smallskip} +\SGMLdef<br>{\leavevmode\\} +% \end{macrocode} +% +% These are obsolete in HTML3 but do them anyway. +% \changes{v0.10}{1996/03/25}{XMP and LISTING and PLAINTEXT added} +% \begin{macrocode} +\SGMLdef<xmp>{% + \SGML@pre + \def\@tempb{/xmp}% + \let\SGMLopen\HTML@xmptest} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<listing>{% + \SGML@xmp + \def\@tempb{/listing}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<plaintext>{% + \SGML@xmp + \def\@tempb{/plaintext}}% +% \end{macrocode} +% +% \begin{macro}{\HTML@xmptest} +% \begin{macrocode} +\def\HTML@xmptest#1>{% + \lowercase{\def\@tempa{#1}}% + \ifx\@tempa\@tempb + \endgroup + \else + \SGMLafterfi + <#1>% + \fi} +% \end{macrocode} +% \end{macro} +% +% +% SGML syntax Character entities. +% \begin{macrocode} +\SGMLentity{amp}{\&} +\SGMLentity{lt}{\ensuremath{<}} +\SGMLentity{gt}{\ensuremath{>}} +% \end{macrocode} +% +% ISO Latin-1 Character entities. +% \begin{macrocode} +\SGMLentity{aacute}{\'a} +\SGMLentity{Aacute}\'A{} +\SGMLentity{acirc}{\^a} +\SGMLentity{Acirc}{\^A} +\SGMLentity{agrave}{\`a} +\SGMLentity{Agrave}{\`A} +\SGMLentity{aring}{\r a} +\SGMLentity{Aring}{\r A} +\SGMLentity{atilde}{\~a} +\SGMLentity{Atilde}{\~A} +\SGMLentity{auml}{\"a} +\SGMLentity{Auml}{\"A} +\SGMLentity{aelig}{\ae} +\SGMLentity{AElig}{\AE} +\SGMLentity{ccedil}{\c c} +\SGMLentity{Ccedil}{\c C} +\SGMLentity{eth}{\dh} +\SGMLentity{ETH}{\DH} +\SGMLentity{eacute}{\'e} +\SGMLentity{Eacute}{\`E} +\SGMLentity{ecirc}{\^e} +\SGMLentity{Ecirc}{\^E} +\SGMLentity{egrave}{\`e} +\SGMLentity{Egrave}{\`E} +\SGMLentity{euml}{\"e} +\SGMLentity{Euml}{\"E} +\SGMLentity{iacute}{\'\i} +\SGMLentity{Iacute}{\'I} +\SGMLentity{icirc}{\^\i} +\SGMLentity{Icirc}{\^I} +\SGMLentity{igrave}{\`\i} +\SGMLentity{Igrave}{\`I} +\SGMLentity{iuml}{\"\i} +\SGMLentity{Iuml}{\"I} +\SGMLentity{ntilde}{\~n} +\SGMLentity{Ntilde}{\~N} +\SGMLentity{oacute}{\'o} +\SGMLentity{Oacute}{\'O} +\SGMLentity{ocirc}{\^o} +\SGMLentity{Ocirc}{\^O} +\SGMLentity{ograve}{\`o} +\SGMLentity{Ograve}{\`O} +\SGMLentity{oslash}{\oe} +\SGMLentity{Oslash}{\OE} +\SGMLentity{otilde}{\~o} +\SGMLentity{Otilde}{\~O} +\SGMLentity{ouml}{\"o} +\SGMLentity{Ouml}{\"O} +\SGMLentity{szlig}{\ss} +\SGMLentity{thorn}{\th} +\SGMLentity{THORN}{\TH} +\SGMLentity{uacute}{\'u} +\SGMLentity{Uacute}{\'U} +\SGMLentity{ucirc}{\^u} +\SGMLentity{Ucirc}{\^U} +\SGMLentity{ugrave}{\`u} +\SGMLentity{Ugrave}{\`U} +\SGMLentity{uuml}{\"u} +\SGMLentity{Uuml}{\"U} +\SGMLentity{yacute}{\'y} +\SGMLentity{Yacute}{\'Y} +\SGMLentity{yuml}{\"y} +% \end{macrocode} +% +% \subsection{Netscape Non-HTML tags} +% +% Netscape allows certain tags that do not correspond to HTML elements. +% These are \emph{Bad Thing}. Originally the documentation of this +% package stated that such `extensions' would not be supported, however +% as a request came from \ldots\ldots\footnote{Name withheld to +% protect the guilty} who also supplied most of the code in this +% section (and also the table section), I have added some support +% which is enabled if the \texttt{netscape} option is used. +% \begin{macrocode} +\ifx\HTML@not\@undefined\else +% \end{macrocode} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Do something with bad reprehensible nonstandard tags +% that have the annoying habit of turning up often in html files that +% I want to print. [mjd,1996/03/20] +% +% |\HTML@not| is defined above in the netscape option: +% Naughty Nonstandard Extension Warning for things like +% |<center>| and |<font>|. (I thought these were +% Netscape-specific but the technical notes at Spyglass's web site +% showed that I was wrong. [mjd,1996/03/20]) +% \begin{macrocode} +\SGMLdef<center>{\HTML@not{center}\begin{center}} +\SGMLdef</center>{\end{center}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<blink>{\SGMLgrabber{blink}\textbf} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<font>{\HTML@not{font}\begingroup + \let\do\fontdo\the\toks@} +\SGMLdef</font>{\endgroup} +% \end{macrocode} +% |\fontdo| must look at the first character of the `size, value to see +% if it is a relative size change (|+| or |-|). Otherwise it is an +% absolute size change. +% \begin{macrocode} +\def\fontdo#1#2{% + \def\@tempa{size}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \font@switch#2\relax\@nil + \fi} +% \end{macrocode} +% +% Let's hack a nice little hook into |\@setfontsize| (tsk tsk). +% If we can set the current font size number there, it makes the rest +% of the job much easier. +% \begin{macrocode} +\toks@\expandafter{\set@fontsize{#1}{#2}{#3}} +\edef\@tempa{% + \def\noexpand\set@fontsize##1##2##3{\the\toks@\noexpand\set@fontnum}} +\@tempa +% \end{macrocode} +% +% Take |\f@size| which is a real number, convert it to an integer, +% and normalize to the desired range. +% \begin{macrocode} +\def\set@fontnum{\dimen@\f@size\p@ + \dimen@\mul@ptsize\dimen@ + \count@\dimen@ \divide\count@\p@ + \advance\count@ -5\relax + \edef\@fontnum{\number\count@}} +% \end{macrocode} +% +% Nice consistent naming conventions as always. +% multiplier if 11pt or 12pt documentclass option is used +% \begin{macrocode} +\def\mul@ptsize{}% +% \end{macrocode} +% +% 5 = |\normalsize| I think +% \begin{macrocode} +\def\@fontnum{5} +% \end{macrocode} +% +% Initialize |\mul@ptsize| +% \begin{macrocode} +\ifcase 0\@ptsize\relax + \global\let\mul@ptsize\@empty% case 0, ptsize = 10 + \or\gdef\mul@ptsize{.9091}% case 1, ptsize = 11 + \else\gdef\mul@ptsize{.8333}% case 2, ptsize = 12 +\fi +% \end{macrocode} +% +% |\font@switch| looks for |+| or |-| and selects a suitable fontsize +% command. +% \begin{macrocode} +\def\font@switch#1#2\@nil{\count@\@fontnum\relax + \ifx +#1\advance\else\ifx -#1\advance\fi\fi + \count@#1#2\relax + \ifcase\count@ \tiny\or \tiny\or \scriptsize + \or\footnotesize \or\small \or\normalsize \or\large + \or\Large \or\LARGE \or\huge \else\Huge \fi} +% \end{macrocode} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \subsection{The HTML3 DTD} +% +% |\HTML@two@stop| is |\endinput| (and so the package stops here) +% unless the HTML3 option is given. +% \begin{macrocode} +\HTML@two@stop +\SGML@w{HTML3 support not finished yet} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<math>{\SGMLgrabber{math}\domath} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<sup>{^\bgroup\HTMLscriptmap} +\SGMLdef</sup>{\egroup} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<sub>{_\bgroup\HTMLscriptmap} +\SGMLdef</sub>{\egroup} +% \end{macrocode} +% +% GRUMBLE! GRUMBLE! GRUMBLE! Possibly the worst feature of \TeX's math +% markup is the nature of the infix operators for fractions and the +% like. And here it is faithfully (or actually not very faithfully) +% reconstructed here\ldots +% \begin{macrocode} +\SGMLdef<box>{\SGMLgrabber{box}\dobox} +% \end{macrocode} +% +% \begin{macrocode} +\begingroup +\catcode`\<=\active +\catcode`\>=\active +\catcode`\&=\active +\catcode`\_=\active +\catcode`\^=\active +\catcode`\"=\active +% \end{macrocode} +% +% \begin{macro}{\domath} +% Handle the MATH element. The body is pre-expanded one level to +% replace |{ }| by BOX elements, and to replace any SGML entitity +% references by single \TeX\ tokens so they can be recognised more +% easily. Then start math mode with |\[| (which may have been +% redefined locally if the BOX attribute was used) set up the +% shorteref map. +% \begin{macrocode} +\gdef\domath#1{% + {{\def&{\expandafter\expandafter\expandafter\noexpand\SGMLent@@}% + \let<\relax\let>\relax\let_\relax\let^\relax\let"\relax + \def\{{<box>}\def\}{</box>}% + \xdef\@gtempa{#1}}% + \let\do\mathdo + \let\doimplied\mathimplied + \the\toks@ + \[% + \m@th\nulldelimiterspace\z@ + \def^{<sup>}% + \def_{<sub>}% + \@gtempa\]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\HTMLscriptmap} +% Set up the shortref map used in super and subscripts. +% \begin{macrocode} +\gdef\HTMLscriptmap{% + \def^{</sup>}% + \def_{</sub>}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dobox} +% Handle the BOX element. +% First deal with the attributes, then set up the shortref map. Then +% start looking for a LEFT tag. +% \begin{macrocode} +\gdef\dobox#1{% + {\let\do\boxdo + \let\bigstrut\relax + \the\toks@ + \def^{<sup>}% + \def_{<sub>}% + \lookleft@#1<left>\@nil}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lookleft@} +% See whether this BOX element contains a LEFT tag. Supply a `null +% delimiter' if not one supplied. +% \begin{macrocode} +\gdef\lookleft@#1<left>#2\@nil{% + \if$#2$% + {\left.\bgroup#1\mayberight}% + \else + \lookbox@#1<box>\@nil#2\@nil + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lookbox@} +% Having found a LEFT tag, need to check it isn't inside a nested BOX. +% The following code looks for an explicit |<BOX>| (which includes a +% |{| shortref as that will have been expanded by now, however it will +% fail if nested boxes have attributes, so it may need some further +% modifications later. +% \begin{macrocode} +\gdef\lookbox@#1<box>#2\@nil#3<left>\@nil{% + \if$#2$% + {\maybeleft#1\@nil#3\mayberight} + \else + {#1 \boxtofront#2 <left> #3}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\boxtofront} +% After all that messing around need to put the BOX tag back where we +% found it. +% \begin{macrocode} +\gdef\boxtofront#1<box>{<box>#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\endgroup +% \end{macrocode} +% +% \begin{macro}{\mathdo} +% \changes{v0.04}{1996/03/10}{Support math attributes} +% \begin{macrocode} +\def\mathdo#1#2{% + \def\@tempa{class-chem}\def\@tempb{#1-#2}% + \ifx\@tempa\@tempb + \everymath{\fam\z@}\everydisplay{\fam\z@}% + \fi} +\def\mathimplied#1{% + \def\@tempa{box}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \def\[{\center\setbox\z@\hbox\bgroup$\displaystyle}% + \def\]{$\egroup\fbox{\box\z@}\endcenter}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\boxdo} +% \changes{v0.04}{1996/03/09}{Support box size attribute} +% \begin{macrocode} +\def\boxdo#1#2{% + \def\@tempa{size}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \def\@tempb{#2} + \def\@tempa{normal}\ifx\@tempa\@tempb\def\@tempc{1}\fi + \def\@tempa{medium}\ifx\@tempa\@tempb\def\@tempc{2}\fi + \def\@tempa{large}\ifx\@tempa\@tempb\def\@tempc{3}\fi + \def\@tempa{huge}\ifx\@tempa\@tempb\def\@tempc{4}\fi + \edef\bigstrut{\vrule\@height\@tempc\ht\strutbox\@width\z@} + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SGML@left} +% \begin{macrocode} +\SGMLdef<left>{\left.\bgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mayberight} +% \begin{macrocode} +\def\mayberight{\egroup\bigstrut\right.} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maybeleft} +% \changes{v0.04}{1996/03/09}{macro added} +% \begin{macrocode} +\def\maybeleft#1#2\@nil{% + \in@{#1}{()[]\SGML@E@rbrace\SGML@E@lbrace}% + \ifin@ + \left#1\bgroup#2% + \else + \let\SGML@E@int\HTML@bigint + #1#2\left.\bgroup\let\SGML@E@int\int + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\righttest} +% \changes{v0.04}{1996/03/09}{macro added} +% \begin{macrocode} +\def\righttest#1{% + \in@{#1}{()[]\SGML@E@rbrace\SGML@E@lbrace}% + \ifin@ + \right#1\let\mayberight\relax + \else + \right.\let\mayberight\relax\expandafter#1% + \fi} +% \end{macrocode} +% \end{macro} +% +% \subsection{`Big int' processing} +% I am not sure that stretchy integral signs are good idea in general, +% and certainly they do not fit well with the Computer Modern style of +% sloping integral sign as opposed to the more vertical style of, say, +% Lucida. However\ldots +% +% \begin{macro}{\HTML@int} +% \changes{v0.04}{1996/03/010}{macro added} +% \begin{macrocode} +\ifx\HTML@int\@undefined +% \end{macrocode} +% +% \begin{macro}{\HTML@bigint} +% Normally just use the standard |\int|. +% \begin{macrocode} +\let\HTML@bigint\int +% \end{macrocode} +% +% \begin{macrocode} +\else +% \end{macrocode} +% +% With the |bigint| option . +% The original |\int| (in a big font) together with any saved limits +% (in the normal font). +% \begin{macrocode} +\def\HTML@int{\int^{\box\tw@}_{\box4}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\HTML@bigint} +% \begin{macrocode} +\def\HTML@bigint#1\left.\bgroup{% + \def\@tempa{#1}% + \setbox\z@\hbox\bgroup + \aftergroup\HTMLafterbigint$\displaystyle\bgroup + \aftergroup$\aftergroup\egroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\HTMLafterbigint} +% \begin{macrocode} +\def\HTMLafterbigint{% + \dimen@.5\ht\z@ + \advance\dimen@.5\dp\z@ + {\SGMLdef<sup>{\setbox\tw@\hbox\bgroup\HTMLscriptmap$\scriptstyle}% + \SGMLdef<sub>{\setbox4\hbox\bgroup\HTMLscriptmap$\scriptstyle}% + \SGMLdef</sup>{$\egroup}% + \SGMLdef</sub>{$\egroup}% + \setbox\tw@\box\voidb@x + \setbox4\box\voidb@x + \@tempa + \ifdim\dimen@>\f@size\p@ +% \end{macrocode} +% At this point, could do |\fontsize\dimen@\z@\selectfont| but that +% would load \emph{all} the math fonnts at a strange size, so instead +% just load the extension font, and then subvert NFSS to drop that +% into the math expression. The NFSS interface is still used to +% declare the font so that a size substitution is done on the loading +% (otherwise every integral may use up a new font). +% \changes{v0.08}{1996/03/16}{Use \cs{DeclareFixedFont}} +% \begin{macrocode} + \mathop{\hbox{\DeclareFixedFont\@tempa{OMX}{cmex}{m}{n}\dimen@ + $\displaystyle\textfont\thr@@\@tempa\HTML@int$}}% + \else + \HTML@int + \fi + }\left.\box\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% \end{macro} +% +% +% See above grumble. The HTML3 DTD comments specifically refer to +% these as `\LaTeX\ commands' but they are no such thing. They are in +% plain and survive into \LaTeX\ under protest! The AMS \LaTeX\ +% documentation contains a much longer diatribe against these infix +% commands, and they are \emph{disabled} in the AMS \LaTeX\ styles. +% \begin{macrocode} +\SGMLdef<over>{\over} +\SGMLdef<atop>{\atop} +\SGMLdef<choose>{\choose} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<right>{\egroup\bigstrut\righttest} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<above>{\SGMLgrabber{above}% + {\let\@tempc\overlineop + \let\do\abovedo + \the\toks@ + \@tempc}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<below>{\SGMLgrabber{below}% + {\let\@tempc\underlineop + \let\do\abovedo + \the\toks@ + \@tempc}} +% \end{macrocode} +% +% \begin{macrocode} +\def\overlineop#1{\mathop{\overline{#1}}} +\def\underlineop#1{\mathop{\underline{#1}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\abovedo#1#2{% + \def\@tempa{sym}\def\@tempb{#1}% + \ifx\@tempa\@tempb\def\@tempc{\csname#2\endcsname}\fi} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<vec>{\SGMLgrabber{vec}\vec} +\SGMLdef<bar>{\SGMLgrabber{bar}\bar} +\SGMLdef<dot>{\SGMLgrabber{dot}\dot} +\SGMLdef<ddot>{\SGMLgrabber{ddot}\ddot} +\SGMLdef<hat>{\SGMLgrabber{hat}\hat} +\SGMLdef<tilde>{\SGMLgrabber{tilde}\tilde} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<t>{\SGMLgrabber{t}\mathrm} +\SGMLdef<bt>{\SGMLgrabber{bt}\mathbf} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<text>{\SGMLgrabber{text}\textnormal}%%%%% not in the dtd???? +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<root>{\rootfudge} +\def\rootfudge#1{% + \setbox\rootbox\hbox\bgroup$\m@th\scriptscriptstyle\bgroup#1} +% \end{macrocode} +% +% I think the HTML3 DTD is wrong here\footnote +% {Since confirmed by Dave Raggett, the HTML3 author}, +% it allows the OF element to +% take content, which is at variance with the description in the text. +% \begin{macrocode} +\SGMLdef<of>{\egroup$\egroup\SGMLgrabber{root}\offudge} +\SGMLdef</of>{} +\def\offudge#1{\mathpalette\r@@t{#1}} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<sqrt>{\SGMLgrabber{sqrt}\sqrt} +% \end{macrocode} +% +% \changes{v0.08}{1996/03/16}{Add basic support for array element} +% +% Hate allocating registers, so this will probably go, but for now +% give myself four (global) count registers to play with. +% \begin{macrocode} +\newcount\HTMLrow +\newcount\HTMLcol +\newcount\HTMLrowspan +\newcount\HTMLcolspan +% \end{macrocode} +% +% The HTML array element. Support for ALIGN, COLSPAN, ROWSPAN +% LABELS, LDELIM and RDELIM. However not all combinations of alignment +% and labels do `the right thing'. +% +% \changes{v0.09}{1996/03/21}{COLSPEC support for ARRAY} +% +% Uses a \TeX\ primitive |\halign| construction, rather than use the +% \LaTeX\ |array| environment directly. +% \begin{macrocode} +\SGMLdef<array>{{\ifnum`}=0\fi + \let\do\arraydo + \let\doimplied\arrayimplied + \let\HTMLal.% + \let\HTMLar.% + \global\HTMLrow\z@ + \let\HTMLabox\vcenter + \the\toks@ + \setbox\z@\vbox\bgroup\halign\bgroup + \strut\span\HTMLacolspec\cr\nocr} +% \end{macrocode} +% +% \begin{macro}{\HTMLacolspec} +% \changes{v0.09}{1996/03/21}{macro added} +% \begin{macrocode} +\def\HTMLacolspec{##&&##} +% \end{macrocode} +% \end{macro} +% + +% \begin{macro}{\HTMLamakepream} +% \changes{v0.09}{1996/03/21}{macro added} +% \begin{macrocode} +\def\HTMLamakepream#1{% + \let\HTMLacolspec\@empty + \let\@sharp\relax + \lowercase{\@tfor\@tempc:=#1}\do{% + \if\@tempc l% + \edef\HTMLacolspec{\HTMLacolspec\@sharp\hfill&}% + \else + \if\@tempc c% + \edef\HTMLacolspec{\HTMLacolspec\hfill\@sharp\hfill&}% + \else + \if\@tempc r% + \edef\HTMLacolspec{\HTMLacolspec\hfill\@sharp&}% + \else + \if\@tempc +% + \edef\HTMLacolspec{\HTMLacolspec$+$}% + \else + \if\@tempc -% + \edef\HTMLacolspec{\HTMLacolspec$-$}% + \else + \if\@tempc =% + \edef\HTMLacolspec{\HTMLacolspec$=$}% + \fi + \fi + \fi + \fi + \fi + \fi}% + \def\@sharp{########}% + \edef\HTMLacolspec{\HTMLacolspec&\@sharp}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\SGMLdef</array>{\HTMLendarray} +% \end{macrocode} +% +% \begin{macrocode} +\let\HTMLcr\cr +% \end{macrocode} +% +% \begin{macro}{\HTMLendarray} +% Non LABELS ending +% \begin{macrocode} +\def\HTMLendarray{% + \endi\crcr\egroup\egroup + \ifx\HTMLabox\vtop + \setbox\z@\vtop{\unvbox\z@}% + \else + \ifx\HTMLabox\vcenter + \dimen@\ht\z@ + \advance\dimen@\dp\z@ + \divide\dimen@\tw@ + \advance\dimen@-\ht\z@ + \setbox\z@\hbox{\raise\dimen@\box\z@}% + \fi + \fi + \dimen@=\ht\z@ + \setbox\z@ +\hbox{$\left\HTMLal\kern-1em\vcenter{\box\z@}\kern-1em\right\HTMLar$}% + \advance\dimen@-\ht\z@ + \raise\dimen@\box\z@ + \ifnum`{=0\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\HTMLendarraylabels} +% LABELS ending +% \begin{macrocode} +\def\HTMLendarraylabels{% + \endi\crcr\strut\cr\egroup\egroup + \setbox2=\vsplit\z@ to \baselineskip + \setbox\z@\vbox{\unvbox\z@\global\setbox\@ne\lastbox}% + \setbox4\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% + \vcenter{% + \box2 + \hbox{$\kern\wd\@ne + \left\HTMLal\kern-\wd\@ne + \vcenter{\box\z@}% + \right\HTMLar$}}% + \ifnum`{=0\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\def\nocr{\relax\iffalse{\fi\let\HTMLcr\relax\iffalse}\fi} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<row>{% + \endi\HTMLcr + \global\advance\HTMLrow\@ne + \global\HTMLcol\z@} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef</row>{} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLdef<item>{% + \let\do\itemdo + \gdef\@gtempa{\global\advance\HTMLcol\@ne}% + \gdef\@gtempb{}% + \gdef\@gtempc{}% + \global\HTMLcolspan\@ne + \the\toks@ + \endi% + \@gtempc + \@gtempa +% \end{macrocode} +% +% If an earlier row contained an entry spanning down to this point, +% need to jump across to the next column (and perhaps further). +% \begin{macrocode} + \spanifneeded +% \end{macrocode} +% +% |\@gtempb| is normally empty but will be defined if the item had an +% ALIGN attribute. +% \begin{macrocode} + \@gtempb +% \end{macrocode} +% First box each entry which allows measuring needed (but not yet +% done) for vertical spanning. +% \begin{macrocode} + \setbox\z@\hbox\bgroup$% + \def\endi{\unskip$\egroup% + \quad\HTMLaleft\box\z@\HTMLaright\quad&}% + \ignorespaces} +% \end{macrocode} +% +% \begin{macro}{\spanifneeded} +% If the current row/column is in the list of spanned entries, jump to +% next column and look again. +% \begin{macrocode} +\def\spanifneeded{% + \edef\@tempa{\noexpand\in@{,\the\HTMLrow/\the\HTMLcol,}{\spanitems}}% + \@tempa + \ifin@ + \@firstofone{&}\global\advance\HTMLcol\@ne + \expandafter\spanifneeded + \fi} +% \end{macrocode} +% \end{macro} +% +% As usual handle end tags that may be omitted by making them +% translate to empty. +% \begin{macrocode} +\SGMLdef</item>{} +% \end{macrocode} +% +% \begin{macro}{\HTMLaleft} +% \begin{macro}{\HTMLaright} +% Default stuff to put around the entries. Locally redefined by an +% ALIGN attribute. +% \begin{macrocode} +\let\HTMLaleft\hfil +\let\HTMLaright\hfil +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\endi} +% Code to end an item. Extra indirection used to handle omitted tags. +% \begin{macrocode} +\let\endi\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\arraydo} +% \changes{v0.09}{1996/03/21}{COLSPEC added} +% Handle ARRAY attributes. +% \begin{macrocode} +\def\arraydo#1#2{% + \def\@tempa{#1}\def\@tempb{#2}% + \def\@tempc{align}% + \ifx\@tempa\@tempc + \def\@tempc{top}% + \ifx\@tempb\@tempc + \let\HTMLabox\vtop + \else + \def\@tempc{bottom}% + \ifx\@tempb\@tempc + \let\HTMLabox\vbox + \fi + \fi + \else + \def\@tempc{ldelim}% + \ifx\@tempa\@tempc + \let\HTMLal\@tempb + \else + \def\@tempc{rdelim}% + \ifx\@tempa\@tempc + \let\HTMLar\@tempb + \else + \def\@tempc{labels}% + \ifx\@tempa\@tempc + \let\HTMLendarray\HTMLendarraylabels + \else + \def\@tempc{colspec}% + \ifx\@tempa\@tempc + \HTMLamakepream{#2}% + \fi + \fi + \fi + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\arrayimplied} +\def\arrayimplied#1{% + \def\@tempa{labels}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \let\HTMLendarray\HTMLendarraylabels + \fi} +% \end{macro} +% +% \begin{macro}{\itemdo} +% Handle ITEM attributes +% \begin{macrocode} +\def\itemdo#1#2{% + \def\@tempa{#1}\def\@tempb{#2}% + \def\@tempc{colspan}% + \ifx\@tempa\@tempc + \global\HTMLcolspan#2\relax + \gdef\@gtempa{\@multispan#2\relax\global\advance\HTMLcol#2\relax}% + \else + \def\@tempc{align}% + \ifx\@tempa\@tempc + \def\@tempc{left}% + \ifx\@tempb\@tempc + \gdef\@gtempb{\let\HTMLaleft\relax}% + \else + \def\@tempc{right}% + \ifx\@tempb\@tempc + \gdef\@gtempb{\let\HTMLaright\relax}% + \fi + \fi + \else + \def\@tempc{rowspan}% + \ifx\@tempa\@tempc + \global\HTMLrowspan#2\relax + \gdef\@gtempc{% + \@tempcnta=\HTMLrow + \advance\@tempcnta\HTMLrowspan +% \end{macrocode} +% +% Double loop adds all the entries below this a ROWSPAN entry +% to |\spanitems| list. +% \begin{macrocode} + \loop + \@tempcntb=\HTMLcol + \advance\@tempcntb\HTMLcolspan + \advance\@tempcnta\m@ne + \ifnum\@tempcnta>\HTMLrow + {\loop + \xdef\spanitems{% + \spanitems\the\@tempcnta/\the\@tempcntb,}% + \advance\@tempcntb\m@ne + \ifnum\@tempcntb>\HTMLcol + \repeat}% + \repeat}% + \fi + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\spanitems} +% Initial value for list of spanned entries. +% \begin{macrocode} +\def\spanitems{,} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\SGMLentity{thinsp}{\,} +\SGMLentity{emsp}{\quad} +% \end{macrocode} +% +% Far from final list of math symbol entity names\ldots +% \begin{macrocode} +\SGMLentity{alpha}{\alpha} +\SGMLentity{beta}{\beta} +\SGMLentity{gamma}{\gamma} +\SGMLentity{Gamma}{\Gamma} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLentity{int}{\int} +\SGMLentity{sum}{\sum} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLentity{lbrace}{\lbrace} +\SGMLentity{rbrace}{\rbrace} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLentity{times}{\times} +\SGMLentity{cup}{\cup} +\SGMLentity{cap}{\cap} +\SGMLentity{vee}{\vee} +\SGMLentity{wedge}{\wedge} +\SGMLentity{infty}{\infty} +\SGMLentity{oplus}{\oplus} +\SGMLentity{ominus}{\ominus} +\SGMLentity{otimes}{\otimes} +% \end{macrocode} +% +% \begin{macrocode} +\SGMLentity{sin}{\sin} +\SGMLentity{cos}{\cos} +\SGMLentity{tan}{\tan} +% \end{macrocode} +% +% \section{HTML3 Tables} +% \changes{v0.09}{1996/03/21}{TABLE added (mjd)} +% Not done yet, but here is a start\ldots +% +% Final version will probably need primitive |\halign| coding +% as for (but hopefully better than) array stuff above. Also +% will need to be lontable-like. +% +% This is all very slapdash and temporary [mjd,1996/03/20]. +% Don't expect good-looking results, just results, occasionally. +% +% \begin{macrocode} +\SGMLdef<table>{\begin{table}[htp]\centering\begin{tabular}{*{10}c}} +\SGMLdef</table>{\end{tabular}\end{table}} +\SGMLdef<tr>{\ifhmode\expandafter\\\fi\relax} +\SGMLdef</tr>{\\\relax} +\SGMLdef<td>{\ifvmode\else\expandafter\hiddenamp\fi} +\def\hiddenamp{&} +% \end{macrocode} +% if |<td>| is present for each cell, then |</td>| doesn't +% need to do anything +% \begin{macrocode} +\SGMLdef</td>{} +% \end{macrocode} +% +% Whoa, if I'm to define caption properly I'd have to look up +% how/where it's used. Who, lazy old me? +% +% \begin{macrocode} +\SGMLdef<caption>{\end{tabular}\begingroup\bfseries} +\SGMLdef</caption>{\endgroup\par\smallskip\begin{tabular}{*{10}{c}}} +% \end{macrocode} +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \Finale +% diff --git a/doc/cmu-user/typehtml.ins b/doc/cmu-user/typehtml.ins new file mode 100644 index 0000000000..77fefef3fe --- /dev/null +++ b/doc/cmu-user/typehtml.ins @@ -0,0 +1,3 @@ +\def\batchfile{typehtml.ins} +\input docstrip +\generateFile{typehtml.sty}{f}{\from{typehtml.dtx}{package}} diff --git a/doc/cmu-user/typehtml.sty b/doc/cmu-user/typehtml.sty new file mode 100644 index 0000000000..c07cf79269 --- /dev/null +++ b/doc/cmu-user/typehtml.sty @@ -0,0 +1,899 @@ +%% +%% This is file `typehtml.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% typehtml.dtx (with options: `package') +%% +%% IMPORTANT NOTICE: +%% +%% For the copyright see the source file. +%% +%% Any modified versions of this file must be renamed +%% with new filenames distinct from typehtml.sty. +%% +%% For distribution of the original source see the terms +%% for copying and modification in the file typehtml.dtx. +%% +%% This generated file may be distributed as long as the +%% original source files, as listed above, are part of the +%% same distribution. (The sources need not necessarily be +%% in the same archive or directory.) +%% +%% Source File `typehtml.dtx'. +%% Copyright (C) 1996 1997 David Carlisle +%% This file may be distributed under the terms of the LPPL. +%% See 00readme.txt for details. +%% +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{typehtml} + [1997/11/19 v0.12 HTML printer (DPC)] +\DeclareOption{html2}{\let\HTML@two@stop\endinput} +\DeclareOption{netscape} + {\def\HTML@not#1{\SGML@w{<#1> is not valid HTML}}} +\DeclareOption{html3}{\let\HTML@two@stop\relax} +\DeclareOption{nohyperref}{% + \let\HTML@doname\@secondoftwo + \def\HTML@dosrc#1#2{\emph{#2}}} +\DeclareOption{ftnhyperref}{% + \let\HTML@doname\@secondoftwo + \def\HTML@dosrc#1#2{\emph{#2}\footnote{HREF: \texttt{#1}}}} +\DeclareOption{hyperref}{% + \AtBeginDocument{% + \providecommand\href[2]{\special{html:<A href="#1">}% + #2\special{html:</A>}}% + \providecommand\hypertarget[2]{\special{html:<A name="#1">}% + #2\special{html:</A>}}% + \let\HTML@doname\hypertarget + \let\HTML@dosrc\href}} +\DeclareOption{dviwindo}{% + \def\HTML@dosrc#1#2{{% + \leavevmode\sbox\z@{#2}\count@\ht\z@\@tempcnta\wd\z@ + \if\string##\@car#1\@nil + \special{button: \the\@tempcnta\space\the\count@\space + "\@gobble#1"}% + \else + \special{button: \the\@tempcnta\space\the\count@\space + launch: typehtml "#1"} + \fi + \special{color push}\special{color rgb 0 1 0}% + \unhbox\z@ + \special{color pop}}}% + \def\HTML@doname#1#2{\leavevmode\special{mark: "#1"}#2}}% +\DeclareOption{imgalt}{} +\DeclareOption{imggif}{\SGML@w{img gif support not done yet}} +\DeclareOption{imgps}{\SGML@w{img ps support not done yet}} +\DeclareOption{smartquotedbl}{% + \def\SGMLquotedbla{% + \textquotedblleft\global\let\SGMLquotedbl\SGMLquotedblb} + \def\SGMLquotedblb{% + \textquotedblright\global\let\SGMLquotedbl\SGMLquotedbla} + \let\SGMLquotedbl\SGMLquotedbla + \let\SGML@savedeverypar\everypar + \newtoks\everypar + \SGML@savedeverypar{% + \global\let\SGMLquotedbl\SGMLquotedbla\the\everypar}} +\DeclareOption{straightquotedbl}{% + \DeclareTextCommandDefault{\textquotedbl}{{\ttfamily\char`\"}}% + \let\SGMLquotedbl\textquotedbl} +\DeclareOption{chapter}{% + \def\HTML@headings{% + \chapter\section\subsection% + \subsubsection\paragraph\subparagraph}} +\DeclareOption{chapter*}{% + \def\HTML@headings{% + {\chapter*}{\section*}{\subsection*}% + {\subsubsection*}{\paragraph*}{\subparagraph*}}} +\DeclareOption{section}{% + \def\HTML@headings{% + \section\subsection% + \subsubsection\paragraph\subparagraph\endgraf}} +\DeclareOption{section*}{% + \def\HTML@headings{% + {\section*}{\subsection*}% + {\subsubsection*}{\paragraph*}{\subparagraph*}\endgraf}} +\DeclareOption{subsection}{% + \def\HTML@headings{% + \subsection% + \subsubsection\paragraph\subparagraph\endgraf\endgraf}} +\DeclareOption{subsection*}{% + \def\HTML@headings{% + {\subsection*}% + {\subsubsection*}{\paragraph*}{\subparagraph*}\endgraf\endgraf}} +\DeclareOption{bigint}{% + \let\HTML@int\int + \AtEndOfPackage{\RequirePackage{exscale}}} +\ExecuteOptions{section*,imgalt,html2,nohyperref,straightquotedbl} +\ProcessOptions +\begingroup +\catcode`\<=\active +\catcode`\>=\active +\catcode`\&=\active +\catcode`\$=\active +\catcode`\"=\active +\catcode`\^=\active +\catcode`\_=\active +\catcode`\;=\active +\catcode`\A=\active +\catcode`\B=\active +\catcode`\C=\active +\catcode`\D=\active +\uccode`\A=`\{% +\uccode`\B=`\}% +\uccode`\C=`\|% +\uccode`\D=`\\% +\uppercase{\endgroup +\def\SGMLent@@#1;{\csname SGML@E@#1\endcsname} +\def\SGML@def@active#1>{% + \expandafter\def\csname SGML@#1\endcsname} +\def\dohtml{% + \begingroup + \ifx;\@undefined\expandafter\let\expandafter;\string;\fi + \ifx>\@undefined\expandafter\let\expandafter>\string>\fi + \catcode`\<=\active + \catcode`\>=\active + \catcode`\&=\active + \catcode`\{=\active + \catcode`\}=\active + \catcode`\$=\active + \catcode`\"=\active + \catcode`\^=\active + \catcode`\_=\active + \catcode`\\=\active + \catcode`\|=\active + \catcode\endlinechar=10 + \catcode`\%=12 + \catcode`\#=12 + \catcode`\;=\active + \def\verbatim@nolig@list{\do\`\do\,\do\'\do\-} + \def<{\SGMLopen}% + \def&{\SGMLent}% + \let^\textasciicircum + \let~\textasciitilde + \def_{\_}% + \let$\$% + \def"{\SGMLquotedbl}% + \def A{\{}% + \def B{\}}% + \def C{\texttt{|}}% + \def D{\texttt{\char`\\}}% + \def\addcontentsline##1##2##3{% + {\def<{\string<}\def&{\string&}% + \addtocontents{##1}{\protect\dotochtml<html>}% + \addtocontents{##1}{\protect\contentsline{##2}{##3}{\thepage}}% + \addtocontents{##1}{\protect</html>}}}} +\def\dotochtml{% + \dohtml + \catcode`\\\z@ + \catcode`\{\@ne + \catcode`\}\tw@} +\def\SGMLshortend{/} +\def\SGMLgrab@#1<#2>{% + \edef\@tempd{\lowercase{\def\noexpand\@tempd{\gobblespc#2 \relax}}}% + \@tempd + \ifx\@tempd\SGMLshortend\let\@tempd\@tempc\fi + \ifx\@tempb\@tempd + \advance\@tempcnta\@ne + \else + \ifx\@tempc\@tempd + \advance\@tempcnta\m@ne + \fi + \fi + \ifnum\@tempcnta=\z@ + \expandafter\@tempa\expandafter{\the\@temptokena#1}% + \else + \addto@hook\@temptokena{#1<#2>}% + \expandafter\SGMLgrab@ + \fi} +\def\SGMLopen#1>{% + \SGMLopen@#1 \@nil} +} +\def\htmlinput#1{\dohtml\let\@endhtml\relax\input{#1}\endgroup} +\def\gobblespc#1 #2\relax{#1} +\def\SGMLgrabber#1#2{% + \def\@tempa{#2}% + \@tempcnta\@ne + \@temptokena{}% + \lowercase{\def\@tempb{#1}\def\@tempc{/#1}}% + \SGMLgrab@} +\begingroup +\catcode`\"=\active +\uppercase{\endgroup +\def\SGMLopen@#1 #2\@nil{% + \toks@{}% + \edef\@tempa{\lowercase{\def\noexpand\SGMLelement{#1}}}\@tempa + \if!\@car#1\relax\@nil + \toks@{#1 #2}% + \SGML@w{Declaration ignored\MessageBreak<\the\toks@>\MessageBreak}% + \else + \if$#2$\else + \replacequotes#2"\@nil"% + \SGMLafterfi + \expandafter\toks@\expandafter{\expandafter}% + \expandafter\SGMLgetattrib\the\toks@ \@nil + \fi + \expandafter\ifx\csname SGML@\SGMLelement + \expandafter\endcsname\relax + \SGML@w{<\SGMLelement> undefined}% + \else + \csname SGML@\SGMLelement + \expandafter\expandafter\expandafter\endcsname + \fi + \fi} +\def\replacequotes#1"#2"{% + \def\@tempb{#2}% + \ifx\@tempb\@nnil + \addto@hook\toks@{#1}% + \else + \addto@hook\toks@{#1{#2}}% + \expandafter\replacequotes + \fi}} +\def\SGMLafterfi#1\fi{\fi#1} +\def\SGMLgobbletofi#1\fi{\fi} +\def\SGMLgetattrib#1 #2{% + \ifx\box#1\box\else + \SGMLgetval#1=$=\@nil + \def\@tempa{#2}% + \ifx\@tempa\@nnil + \expandafter\SGMLgobbletofi + \else + \expandafter\SGMLafterfi + \fi + \SGMLgetattrib#2% + \fi} +\def\SGMLgetval#1=#2=#3\@nil{% + \ifcat$#2% + \lowercase{\SGML@addattrib\doimplied{#1}}% + \else + \lowercase{\SGML@addattrib{\do{#1}}}{#2}% + \fi} +\def\SGML@addattrib#1#2{\addto@hook\toks@{#1{#2}}} +\def\SGML@w{\PackageWarning{typehtml}} +\def\SGMLdef#1{% + \ifcat\noexpand#1\noexpand~% + \expandafter\SGML@def@active + \else + \expandafter\SGML@def + \fi} +\edef\@tempa{\def\noexpand\SGML@def##1\string>}\@tempa{% + \expandafter\def\csname SGML@#1\endcsname} +\expandafter\def\expandafter\SGMLent\expandafter{% + \expandafter\protect\csname& \endcsname} +\expandafter\def\csname& \endcsname{% + \futurelet\@let@token\SGMLent@} +\def\SGMLent@{% + \ifx\@let@token\@sptoken + \&% + \else + \expandafter\SGMLent@@ + \fi} +\def\SGMLentity#1{% + \expandafter\def\csname SGML@E@#1\endcsname} +\SGMLdef<html>{} +\SGMLdef</html>{\@endhtml} +\let\@endhtml\endgroup +\SGMLdef<title>{\typeout{***TITLE***}\SGMLgrabber{title}\typeout} +\long\def\@tempa#1#2#3#4#5#6{% + \SGMLdef<h1>{\SGMLgrabber{h1}{\HTMLsection{#1}}}% + \SGMLdef<h2>{\SGMLgrabber{h2}{\HTMLsection{#2}}}% + \SGMLdef<h3>{\SGMLgrabber{h3}{\HTMLsection{#3}}}% + \SGMLdef<h4>{\SGMLgrabber{h4}{\HTMLsection{#4}}}% + \SGMLdef<h5>{\SGMLgrabber{h5}{\HTMLsection{#5}}}% + \SGMLdef<h6>{\SGMLgrabber{h6}{\HTMLsection{#6}}}} +\expandafter\@tempa\HTML@headings +\def\HTMLsection#1#2{#1{\ignorespaces#2\unskip}} +\SGMLdef<head>{} +\SGMLdef</head>{} +\SGMLdef<body>{} +\SGMLdef</body>{} +\SGMLdef<bodytext>{} +\SGMLdef</bodytext>{} +\SGMLdef<p>{\par} +\SGMLdef</p>{\par} +\SGMLdef<blockquote>{\begin{quote}} +\SGMLdef</blockquote>{\end{quote}} +\SGMLdef<address>{\begin{quote}} +\SGMLdef</address>{\end{quote}} +\SGMLdef<ul>{\begin{itemize}} +\SGMLdef</ul>{\end{itemize}} +\SGMLdef<ol>{\begin{enumerate}} +\SGMLdef</ol>{\end{enumerate}} +\SGMLdef<li>{\item} +\SGMLdef</li>{} +\SGMLdef<dl>{% + \let\do\dldo + \let\doimplied\dlimplied + \begin{description}\the\toks@} +\SGMLdef</dl>{\end{description}} +\def\dldo#1#2{% + \def\@tempa{compact}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \itemsep\z@ + \advance\@totalleftmargin-\leftmargin + \advance\linewidth\leftmargin + \itemindent-\labelsep + \leftmargin\z@ + \parshape \@ne \@totalleftmargin \linewidth + \fi} +\def\dlimplied#1{\dldo{#1}\relax} +\def\itx#1{\item[#1]} +\SGMLdef<dt>{\begin{lrbox}\z@\bfseries\let\maybeenddt\enddt} +\SGMLdef</dt>{\maybeenddt} +\SGMLdef<dd>{\maybeenddt} +\SGMLdef</dd>{} +\def\enddt{\end{lrbox}\item[\unhbox\z@]} +\let\maybeenddt\relax +\SGMLdef<a>{\SGMLgrabber{a}\HTML@anchor} +\def\HTML@anchor#1{{% + \let\@tempa\@gobble + \def\_{\string_}% + \let\do\ado + \the\toks@ + \@tempa{#1}}} +\def\ado#1#2{% + \def\@tempb{name}\def\@tempc{#1}% + \ifx\@tempb\@tempc + \let\@tempa\@firstofone + \def\@tempa{\HTML@doname{#2}}% + \else + \def\@tempa{\HTML@dosrc{#2}}% + \fi} +\SGMLdef<pre>{% + \par + \begingroup + \parindent\z@ + \obeylines\verbatim@font\@noligs + \frenchspacing\@vobeyspaces} +\SGMLdef</pre>{\endgroup} +\SGMLdef<tt>{\SGMLgrabber{tt}\texttt} +\SGMLdef<b>{\SGMLgrabber{b}\textbf} +\SGMLdef<i>{\SGMLgrabber{i}\textit} +\SGMLdef<em>{\SGMLgrabber{em}\emph} +\SGMLdef<strong>{\SGMLgrabber{strong}\textbf} +\SGMLdef<code>{\SGMLgrabber{code}\texttt} +\SGMLdef<samp>{\SGMLgrabber{samp}\textsf} +\SGMLdef<kbd>{\SGMLgrabber{kbd}\texttt} +\SGMLdef<var>{\SGMLgrabber{var}\textit} +\SGMLdef<cite>{\SGMLgrabber{cite}\textit} +\SGMLdef<form>{\par\medskip} +\SGMLdef</form>{\par\medskip} +\SGMLdef<select>{% + \let\do\selectdo + \the\toks@\par + \begin{tabular}{|l|}% + \hline\@tempc\\\hline + \let\tabularnewline\relax + \ignorespaces} +\def\selectdo#1#2{% + \def\@tempa{name}\def\@tempb{#1}% + \ifx\@tempa\@tempb\def\@tempc{#2}\fi} +\SGMLdef</select>{\\\hline\end{tabular}} +\SGMLdef<option>{% + \gdef\optionbul{\phantom{$\bullet$}}% + \let\do\optiondo + \let\doimplied\optionimplied + \the\toks@ + \tabularnewline + \let\tabularnewline\\% + \optionbul\space\ignorespaces} +\SGMLdef</option>{} +\def\optiondo#1#2{% + \def\@tempa{selected}\def\@tempb{#1}% + \ifx\@tempa\@tempb\gdef\optionbul{$\bullet$}\fi} +\def\optionimplied#1{% + \def\@tempa{selected}\def\@tempb{#1}% + \ifx\@tempa\@tempb\gdef\optionbul{$\bullet$}\fi} +\SGMLdef<input>{} +\SGMLdef<img>{{% + \let\do\imgdo + \def\@tempa{\doimage}% + \the\toks@ + \@tempa}} +\def\doimage{\textsf{[image]}} +\def\imgdo#1{\csname img=#1\endcsname} +\expandafter\def\csname img=align\endcsname#1{% + \SGML@w{align=#1 ignored}} +\expandafter\def\csname img=src\endcsname#1{% + \SGML@w{src=#1 ignored}} +\expandafter\def\csname img=height\endcsname#1{% + \SGML@w{height=#1 ignored}} +\expandafter\def\csname img=alt\endcsname#1{% + \def\doimage{#1}} +\SGMLdef<hr>{\par\smallskip\hrule\smallskip} +\SGMLdef<br>{\leavevmode\\} +\SGMLdef<xmp>{% + \SGML@pre + \def\@tempb{/xmp}% + \let\SGMLopen\HTML@xmptest} +\SGMLdef<listing>{% + \SGML@xmp + \def\@tempb{/listing}} +\SGMLdef<plaintext>{% + \SGML@xmp + \def\@tempb{/plaintext}}% +\def\HTML@xmptest#1>{% + \lowercase{\def\@tempa{#1}}% + \ifx\@tempa\@tempb + \endgroup + \else + \SGMLafterfi + <#1>% + \fi} +\SGMLentity{amp}{\&} +\SGMLentity{lt}{\ensuremath{<}} +\SGMLentity{gt}{\ensuremath{>}} +\SGMLentity{aacute}{\'a} +\SGMLentity{Aacute}\'A{} +\SGMLentity{acirc}{\^a} +\SGMLentity{Acirc}{\^A} +\SGMLentity{agrave}{\`a} +\SGMLentity{Agrave}{\`A} +\SGMLentity{aring}{\r a} +\SGMLentity{Aring}{\r A} +\SGMLentity{atilde}{\~a} +\SGMLentity{Atilde}{\~A} +\SGMLentity{auml}{\"a} +\SGMLentity{Auml}{\"A} +\SGMLentity{aelig}{\ae} +\SGMLentity{AElig}{\AE} +\SGMLentity{ccedil}{\c c} +\SGMLentity{Ccedil}{\c C} +\SGMLentity{eth}{\dh} +\SGMLentity{ETH}{\DH} +\SGMLentity{eacute}{\'e} +\SGMLentity{Eacute}{\`E} +\SGMLentity{ecirc}{\^e} +\SGMLentity{Ecirc}{\^E} +\SGMLentity{egrave}{\`e} +\SGMLentity{Egrave}{\`E} +\SGMLentity{euml}{\"e} +\SGMLentity{Euml}{\"E} +\SGMLentity{iacute}{\'\i} +\SGMLentity{Iacute}{\'I} +\SGMLentity{icirc}{\^\i} +\SGMLentity{Icirc}{\^I} +\SGMLentity{igrave}{\`\i} +\SGMLentity{Igrave}{\`I} +\SGMLentity{iuml}{\"\i} +\SGMLentity{Iuml}{\"I} +\SGMLentity{ntilde}{\~n} +\SGMLentity{Ntilde}{\~N} +\SGMLentity{oacute}{\'o} +\SGMLentity{Oacute}{\'O} +\SGMLentity{ocirc}{\^o} +\SGMLentity{Ocirc}{\^O} +\SGMLentity{ograve}{\`o} +\SGMLentity{Ograve}{\`O} +\SGMLentity{oslash}{\oe} +\SGMLentity{Oslash}{\OE} +\SGMLentity{otilde}{\~o} +\SGMLentity{Otilde}{\~O} +\SGMLentity{ouml}{\"o} +\SGMLentity{Ouml}{\"O} +\SGMLentity{szlig}{\ss} +\SGMLentity{thorn}{\th} +\SGMLentity{THORN}{\TH} +\SGMLentity{uacute}{\'u} +\SGMLentity{Uacute}{\'U} +\SGMLentity{ucirc}{\^u} +\SGMLentity{Ucirc}{\^U} +\SGMLentity{ugrave}{\`u} +\SGMLentity{Ugrave}{\`U} +\SGMLentity{uuml}{\"u} +\SGMLentity{Uuml}{\"U} +\SGMLentity{yacute}{\'y} +\SGMLentity{Yacute}{\'Y} +\SGMLentity{yuml}{\"y} +\ifx\HTML@not\@undefined\else +\SGMLdef<center>{\HTML@not{center}\begin{center}} +\SGMLdef</center>{\end{center}} +\SGMLdef<blink>{\SGMLgrabber{blink}\textbf} +\SGMLdef<font>{\HTML@not{font}\begingroup + \let\do\fontdo\the\toks@} +\SGMLdef</font>{\endgroup} +\def\fontdo#1#2{% + \def\@tempa{size}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \font@switch#2\relax\@nil + \fi} +\toks@\expandafter{\set@fontsize{#1}{#2}{#3}} +\edef\@tempa{% + \def\noexpand\set@fontsize##1##2##3{\the\toks@\noexpand\set@fontnum}} +\@tempa +\def\set@fontnum{\dimen@\f@size\p@ + \dimen@\mul@ptsize\dimen@ + \count@\dimen@ \divide\count@\p@ + \advance\count@ -5\relax + \edef\@fontnum{\number\count@}} +\def\mul@ptsize{}% +\def\@fontnum{5} +\ifcase 0\@ptsize\relax + \global\let\mul@ptsize\@empty% case 0, ptsize = 10 + \or\gdef\mul@ptsize{.9091}% case 1, ptsize = 11 + \else\gdef\mul@ptsize{.8333}% case 2, ptsize = 12 +\fi +\def\font@switch#1#2\@nil{\count@\@fontnum\relax + \ifx +#1\advance\else\ifx -#1\advance\fi\fi + \count@#1#2\relax + \ifcase\count@ \tiny\or \tiny\or \scriptsize + \or\footnotesize \or\small \or\normalsize \or\large + \or\Large \or\LARGE \or\huge \else\Huge \fi} +\fi +\HTML@two@stop +\SGML@w{HTML3 support not finished yet} +\SGMLdef<math>{\SGMLgrabber{math}\domath} +\SGMLdef<sup>{^\bgroup\HTMLscriptmap} +\SGMLdef</sup>{\egroup} +\SGMLdef<sub>{_\bgroup\HTMLscriptmap} +\SGMLdef</sub>{\egroup} +\SGMLdef<box>{\SGMLgrabber{box}\dobox} +\begingroup +\catcode`\<=\active +\catcode`\>=\active +\catcode`\&=\active +\catcode`\_=\active +\catcode`\^=\active +\catcode`\"=\active +\gdef\domath#1{% + {{\def&{\expandafter\expandafter\expandafter\noexpand\SGMLent@@}% + \let<\relax\let>\relax\let_\relax\let^\relax\let"\relax + \def\{{<box>}\def\}{</box>}% + \xdef\@gtempa{#1}}% + \let\do\mathdo + \let\doimplied\mathimplied + \the\toks@ + \[% + \m@th\nulldelimiterspace\z@ + \def^{<sup>}% + \def_{<sub>}% + \@gtempa\]}} +\gdef\HTMLscriptmap{% + \def^{</sup>}% + \def_{</sub>}} +\gdef\dobox#1{% + {\let\do\boxdo + \let\bigstrut\relax + \the\toks@ + \def^{<sup>}% + \def_{<sub>}% + \lookleft@#1<left>\@nil}} +\gdef\lookleft@#1<left>#2\@nil{% + \if$#2$% + {\left.\bgroup#1\mayberight}% + \else + \lookbox@#1<box>\@nil#2\@nil + \fi} +\gdef\lookbox@#1<box>#2\@nil#3<left>\@nil{% + \if$#2$% + {\maybeleft#1\@nil#3\mayberight} + \else + {#1 \boxtofront#2 <left> #3}% + \fi} +\gdef\boxtofront#1<box>{<box>#1} +\endgroup +\def\mathdo#1#2{% + \def\@tempa{class-chem}\def\@tempb{#1-#2}% + \ifx\@tempa\@tempb + \everymath{\fam\z@}\everydisplay{\fam\z@}% + \fi} +\def\mathimplied#1{% + \def\@tempa{box}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \def\[{\center\setbox\z@\hbox\bgroup$\displaystyle}% + \def\]{$\egroup\fbox{\box\z@}\endcenter}% + \fi} +\def\boxdo#1#2{% + \def\@tempa{size}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \def\@tempb{#2} + \def\@tempa{normal}\ifx\@tempa\@tempb\def\@tempc{1}\fi + \def\@tempa{medium}\ifx\@tempa\@tempb\def\@tempc{2}\fi + \def\@tempa{large}\ifx\@tempa\@tempb\def\@tempc{3}\fi + \def\@tempa{huge}\ifx\@tempa\@tempb\def\@tempc{4}\fi + \edef\bigstrut{\vrule\@height\@tempc\ht\strutbox\@width\z@} + \fi} +\SGMLdef<left>{\left.\bgroup} +\def\mayberight{\egroup\bigstrut\right.} +\def\maybeleft#1#2\@nil{% + \in@{#1}{()[]\SGML@E@rbrace\SGML@E@lbrace}% + \ifin@ + \left#1\bgroup#2% + \else + \let\SGML@E@int\HTML@bigint + #1#2\left.\bgroup\let\SGML@E@int\int + \fi} +\def\righttest#1{% + \in@{#1}{()[]\SGML@E@rbrace\SGML@E@lbrace}% + \ifin@ + \right#1\let\mayberight\relax + \else + \right.\let\mayberight\relax\expandafter#1% + \fi} +\ifx\HTML@int\@undefined +\let\HTML@bigint\int +\else +\def\HTML@int{\int^{\box\tw@}_{\box4}} +\def\HTML@bigint#1\left.\bgroup{% + \def\@tempa{#1}% + \setbox\z@\hbox\bgroup + \aftergroup\HTMLafterbigint$\displaystyle\bgroup + \aftergroup$\aftergroup\egroup} +\def\HTMLafterbigint{% + \dimen@.5\ht\z@ + \advance\dimen@.5\dp\z@ + {\SGMLdef<sup>{\setbox\tw@\hbox\bgroup\HTMLscriptmap$\scriptstyle}% + \SGMLdef<sub>{\setbox4\hbox\bgroup\HTMLscriptmap$\scriptstyle}% + \SGMLdef</sup>{$\egroup}% + \SGMLdef</sub>{$\egroup}% + \setbox\tw@\box\voidb@x + \setbox4\box\voidb@x + \@tempa + \ifdim\dimen@>\f@size\p@ + \mathop{\hbox{\DeclareFixedFont\@tempa{OMX}{cmex}{m}{n}\dimen@ + $\displaystyle\textfont\thr@@\@tempa\HTML@int$}}% + \else + \HTML@int + \fi + }\left.\box\z@} +\fi +\SGMLdef<over>{\over} +\SGMLdef<atop>{\atop} +\SGMLdef<choose>{\choose} +\SGMLdef<right>{\egroup\bigstrut\righttest} +\SGMLdef<above>{\SGMLgrabber{above}% + {\let\@tempc\overlineop + \let\do\abovedo + \the\toks@ + \@tempc}} +\SGMLdef<below>{\SGMLgrabber{below}% + {\let\@tempc\underlineop + \let\do\abovedo + \the\toks@ + \@tempc}} +\def\overlineop#1{\mathop{\overline{#1}}} +\def\underlineop#1{\mathop{\underline{#1}}} +\def\abovedo#1#2{% + \def\@tempa{sym}\def\@tempb{#1}% + \ifx\@tempa\@tempb\def\@tempc{\csname#2\endcsname}\fi} +\SGMLdef<vec>{\SGMLgrabber{vec}\vec} +\SGMLdef<bar>{\SGMLgrabber{bar}\bar} +\SGMLdef<dot>{\SGMLgrabber{dot}\dot} +\SGMLdef<ddot>{\SGMLgrabber{ddot}\ddot} +\SGMLdef<hat>{\SGMLgrabber{hat}\hat} +\SGMLdef<tilde>{\SGMLgrabber{tilde}\tilde} +\SGMLdef<t>{\SGMLgrabber{t}\mathrm} +\SGMLdef<bt>{\SGMLgrabber{bt}\mathbf} +\SGMLdef<text>{\SGMLgrabber{text}\textnormal}%%%%% not in the dtd???? +\SGMLdef<root>{\rootfudge} +\def\rootfudge#1{% + \setbox\rootbox\hbox\bgroup$\m@th\scriptscriptstyle\bgroup#1} +\SGMLdef<of>{\egroup$\egroup\SGMLgrabber{root}\offudge} +\SGMLdef</of>{} +\def\offudge#1{\mathpalette\r@@t{#1}} +\SGMLdef<sqrt>{\SGMLgrabber{sqrt}\sqrt} +\newcount\HTMLrow +\newcount\HTMLcol +\newcount\HTMLrowspan +\newcount\HTMLcolspan +\SGMLdef<array>{{\ifnum`}=0\fi + \let\do\arraydo + \let\doimplied\arrayimplied + \let\HTMLal.% + \let\HTMLar.% + \global\HTMLrow\z@ + \let\HTMLabox\vcenter + \the\toks@ + \setbox\z@\vbox\bgroup\halign\bgroup + \strut\span\HTMLacolspec\cr\nocr} +\def\HTMLacolspec{##&&##} + +\def\HTMLamakepream#1{% + \let\HTMLacolspec\@empty + \let\@sharp\relax + \lowercase{\@tfor\@tempc:=#1}\do{% + \if\@tempc l% + \edef\HTMLacolspec{\HTMLacolspec\@sharp\hfill&}% + \else + \if\@tempc c% + \edef\HTMLacolspec{\HTMLacolspec\hfill\@sharp\hfill&}% + \else + \if\@tempc r% + \edef\HTMLacolspec{\HTMLacolspec\hfill\@sharp&}% + \else + \if\@tempc +% + \edef\HTMLacolspec{\HTMLacolspec$+$}% + \else + \if\@tempc -% + \edef\HTMLacolspec{\HTMLacolspec$-$}% + \else + \if\@tempc =% + \edef\HTMLacolspec{\HTMLacolspec$=$}% + \fi + \fi + \fi + \fi + \fi + \fi}% + \def\@sharp{########}% + \edef\HTMLacolspec{\HTMLacolspec&\@sharp}} +\SGMLdef</array>{\HTMLendarray} +\let\HTMLcr\cr +\def\HTMLendarray{% + \endi\crcr\egroup\egroup + \ifx\HTMLabox\vtop + \setbox\z@\vtop{\unvbox\z@}% + \else + \ifx\HTMLabox\vcenter + \dimen@\ht\z@ + \advance\dimen@\dp\z@ + \divide\dimen@\tw@ + \advance\dimen@-\ht\z@ + \setbox\z@\hbox{\raise\dimen@\box\z@}% + \fi + \fi + \dimen@=\ht\z@ + \setbox\z@ +\hbox{$\left\HTMLal\kern-1em\vcenter{\box\z@}\kern-1em\right\HTMLar$}% + \advance\dimen@-\ht\z@ + \raise\dimen@\box\z@ + \ifnum`{=0\fi}} +\def\HTMLendarraylabels{% + \endi\crcr\strut\cr\egroup\egroup + \setbox2=\vsplit\z@ to \baselineskip + \setbox\z@\vbox{\unvbox\z@\global\setbox\@ne\lastbox}% + \setbox4\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% + \vcenter{% + \box2 + \hbox{$\kern\wd\@ne + \left\HTMLal\kern-\wd\@ne + \vcenter{\box\z@}% + \right\HTMLar$}}% + \ifnum`{=0\fi}} +\def\nocr{\relax\iffalse{\fi\let\HTMLcr\relax\iffalse}\fi} +\SGMLdef<row>{% + \endi\HTMLcr + \global\advance\HTMLrow\@ne + \global\HTMLcol\z@} +\SGMLdef</row>{} +\SGMLdef<item>{% + \let\do\itemdo + \gdef\@gtempa{\global\advance\HTMLcol\@ne}% + \gdef\@gtempb{}% + \gdef\@gtempc{}% + \global\HTMLcolspan\@ne + \the\toks@ + \endi% + \@gtempc + \@gtempa + \spanifneeded + \@gtempb + \setbox\z@\hbox\bgroup$% + \def\endi{\unskip$\egroup% + \quad\HTMLaleft\box\z@\HTMLaright\quad&}% + \ignorespaces} +\def\spanifneeded{% + \edef\@tempa{\noexpand\in@{,\the\HTMLrow/\the\HTMLcol,}{\spanitems}}% + \@tempa + \ifin@ + \@firstofone{&}\global\advance\HTMLcol\@ne + \expandafter\spanifneeded + \fi} +\SGMLdef</item>{} +\let\HTMLaleft\hfil +\let\HTMLaright\hfil +\let\endi\relax +\def\arraydo#1#2{% + \def\@tempa{#1}\def\@tempb{#2}% + \def\@tempc{align}% + \ifx\@tempa\@tempc + \def\@tempc{top}% + \ifx\@tempb\@tempc + \let\HTMLabox\vtop + \else + \def\@tempc{bottom}% + \ifx\@tempb\@tempc + \let\HTMLabox\vbox + \fi + \fi + \else + \def\@tempc{ldelim}% + \ifx\@tempa\@tempc + \let\HTMLal\@tempb + \else + \def\@tempc{rdelim}% + \ifx\@tempa\@tempc + \let\HTMLar\@tempb + \else + \def\@tempc{labels}% + \ifx\@tempa\@tempc + \let\HTMLendarray\HTMLendarraylabels + \else + \def\@tempc{colspec}% + \ifx\@tempa\@tempc + \HTMLamakepream{#2}% + \fi + \fi + \fi + \fi + \fi} +\def\arrayimplied#1{% + \def\@tempa{labels}\def\@tempb{#1}% + \ifx\@tempa\@tempb + \let\HTMLendarray\HTMLendarraylabels + \fi} +\def\itemdo#1#2{% + \def\@tempa{#1}\def\@tempb{#2}% + \def\@tempc{colspan}% + \ifx\@tempa\@tempc + \global\HTMLcolspan#2\relax + \gdef\@gtempa{\@multispan#2\relax\global\advance\HTMLcol#2\relax}% + \else + \def\@tempc{align}% + \ifx\@tempa\@tempc + \def\@tempc{left}% + \ifx\@tempb\@tempc + \gdef\@gtempb{\let\HTMLaleft\relax}% + \else + \def\@tempc{right}% + \ifx\@tempb\@tempc + \gdef\@gtempb{\let\HTMLaright\relax}% + \fi + \fi + \else + \def\@tempc{rowspan}% + \ifx\@tempa\@tempc + \global\HTMLrowspan#2\relax + \gdef\@gtempc{% + \@tempcnta=\HTMLrow + \advance\@tempcnta\HTMLrowspan + \loop + \@tempcntb=\HTMLcol + \advance\@tempcntb\HTMLcolspan + \advance\@tempcnta\m@ne + \ifnum\@tempcnta>\HTMLrow + {\loop + \xdef\spanitems{% + \spanitems\the\@tempcnta/\the\@tempcntb,}% + \advance\@tempcntb\m@ne + \ifnum\@tempcntb>\HTMLcol + \repeat}% + \repeat}% + \fi + \fi + \fi} +\def\spanitems{,} +\SGMLentity{thinsp}{\,} +\SGMLentity{emsp}{\quad} +\SGMLentity{alpha}{\alpha} +\SGMLentity{beta}{\beta} +\SGMLentity{gamma}{\gamma} +\SGMLentity{Gamma}{\Gamma} +\SGMLentity{int}{\int} +\SGMLentity{sum}{\sum} +\SGMLentity{lbrace}{\lbrace} +\SGMLentity{rbrace}{\rbrace} +\SGMLentity{times}{\times} +\SGMLentity{cup}{\cup} +\SGMLentity{cap}{\cap} +\SGMLentity{vee}{\vee} +\SGMLentity{wedge}{\wedge} +\SGMLentity{infty}{\infty} +\SGMLentity{oplus}{\oplus} +\SGMLentity{ominus}{\ominus} +\SGMLentity{otimes}{\otimes} +\SGMLentity{sin}{\sin} +\SGMLentity{cos}{\cos} +\SGMLentity{tan}{\tan} +\SGMLdef<table>{\begin{table}[htp]\centering\begin{tabular}{*{10}c}} +\SGMLdef</table>{\end{tabular}\end{table}} +\SGMLdef<tr>{\ifhmode\expandafter\\\fi\relax} +\SGMLdef</tr>{\\\relax} +\SGMLdef<td>{\ifvmode\else\expandafter\hiddenamp\fi} +\def\hiddenamp{&} +\SGMLdef</td>{} +\SGMLdef<caption>{\end{tabular}\begingroup\bfseries} +\SGMLdef</caption>{\endgroup\par\smallskip\begin{tabular}{*{10}{c}}} +\endinput +%% +%% End of file `typehtml.sty'. diff --git a/doc/cmu-user/unicode.tex b/doc/cmu-user/unicode.tex new file mode 100644 index 0000000000..f3016a17fc --- /dev/null +++ b/doc/cmu-user/unicode.tex @@ -0,0 +1,733 @@ +\chapter{Internationalization} +\label{i18n} +\cindex{Internationalization} + +\cmucl{} supports internationalization by supporting Unicode +characters internally and by adding support for external formats to +convert from the internal format to an appropriate external character +coding format. + +To understand the support for Unicode, we refer the reader to the +\ifpdf +\href{http://www.unicode.org/}{Unicode standard}. +\else +\emph{Unicode standard} at \url{http://www.unicode.org} +\fi +\section{Changes} + +To support internationalization, the following changes to Common Lisp +functions have been done. + + +\subsection{Design Choices} + +To support Unicode, there are many approaches. One choice is to +support both 8-bit \code{base-char} and a 21-bit (or larger) +\code{character} since Unicode codepoints use 21 bits. This generally +means strings are much larger, and complicates the compiler by having +to support both \code{base-char} and \code{character} types and the +corresponding string types. This also adds complexity for the user to +understand the difference between the different string and character +types. + +Another choice is to have just one character and string type that can +hold the entire Unicode codepoint. While simplifying the compiler and +reducing the burden on the user, this significantly increases memory +usage for strings. + +The solution chosen by \cmucl{} is to tradeoff the size and complexity +by having only 16-bit characters. Most of the important languages can +be encoded using only 16-bits. The rest of the codepoints are for +rare languages or ancient scripts. Thus, the memory usage is +significantly reduced while still supporting the the most important +languages. Compiler complexity is also reduced since \code{base-char} +and \code{character} are the same as are the string types.. But we +still want to support the full Unicode character set. This is +achieved by making strings be UTF-16 strings internally. Hence, Lisp +strings are UTF-16 strings, and Lisp characters are UTF-16 code-units. + + +\subsection{Characters} +\label{sec:i18n:characters} + +Characters are now 16 bits long instead of 8 bits, and \code{base-char} +and \code{character} types are the same. This difference is +naturally indicated by changing \code{char-code-limit} from 256 to +65536. + +\subsection{Strings} +\label{sec:i18n:strings} + +In \cmucl{} there is only one type of string---\code{base-string} and +\code{string} are the same. + +Internally, the strings are encoded using UTF-16. This means that in +some rare cases the number of Lisp characters in a string is not the +same as the number of codepoints in the string. + + +\section{External Formats} + +To be able to communicate to the external world, \cmucl{} supports +external formats to convert to and from the external world to +\cmucl{}'s string format. The external format is specified in several +ways. The standard streams \var{*standard-input*}, +\var{*standard-output*}, and \var{*standard-error*} take the format +from the value specified by \var{*default-external-format*}. The +default value of \var{*default-external-format*} is \kwd{iso8859-1}. + +For files, \code{OPEN} takes the \kwd{external-format} +parameter to specify the format. The default external format is +\kwd{default}. + +\subsection{Available External Formats} + +The available external formats are listed below in +Table~\ref{table:external-formats}. The first column gives the +external format, and the second column gives a list of aliases that +can be used for this format. The set of aliases can be changed by +changing the \file{aliases} file. + +For all of these formats, if an illegal sequence is encountered, no +error or warning is signaled. Instead, the offending sequence is +silently replaced with the Unicode REPLACEMENT CHARACTER (U$+$FFFD). + +\begin{table} + \centering + \begin{tabular}{|l|l|p{3in}|} + \hline + \textbf{Format} & \textbf{Aliases} & \textbf{Description} \\ + \hline + \hline + \kwd{iso8859-1} & \kwd{latin1} \kwd{latin-1} \kwd{iso-8859-1} & ISO8859-1 \\ + \hline + \kwd{iso8859-2} & \kwd{latin2} \kwd{latin-2} \kwd{iso-8859-2} & ISO8859-2 \\ + \hline + \kwd{iso8859-3} & \kwd{latin3} \kwd{latin-3} \kwd{iso-8859-3} & ISO8859-3 \\ + \hline + \kwd{iso8859-4} & \kwd{latin4} \kwd{latin-4} \kwd{iso-8859-4} & ISO8859-4 \\ + \hline + \kwd{iso8859-5} & \kwd{cyrillic} \kwd{iso-8859-5} & ISO8859-5 \\ + \hline + \kwd{iso8859-6} & \kwd{arabic} \kwd{iso-8859-6} & ISO8859-6 \\ + \hline + \kwd{iso8859-7} & \kwd{greek} \kwd{iso-8859-7} & ISO8859-7 \\ + \hline + \kwd{iso8859-8} & \kwd{hebrew} \kwd{iso-8859-8} & ISO8859-8 \\ + \hline + \kwd{iso8859-9} & \kwd{latin5} \kwd{latin-5} \kwd{iso-8859-9} & ISO8859-9 \\ + \hline + \kwd{iso8859-10} & \kwd{latin6} \kwd{latin-6} \kwd{iso-8859-10} & ISO8859-10 \\ + \hline + \kwd{iso8859-13} & \kwd{latin7} \kwd{latin-7} \kwd{iso-8859-13} & ISO8859-13 \\ + \hline + \kwd{iso8859-14} & \kwd{latin8} \kwd{latin-8} \kwd{iso-8859-14} & ISO8859-14 \\ + \hline + \kwd{iso8859-15} & \kwd{latin9} \kwd{latin-9} \kwd{iso-8859-15} & ISO8859-15 \\ + \hline + \kwd{utf-8} & \kwd{utf} \kwd{utf8} & UTF-8 \\ + \hline + \kwd{utf-16} & \kwd{utf16} & UTF-16 with optional BOM \\ + \hline + \kwd{utf-16-be} & \kwd{utf-16be} \kwd{utf16-be} & UTF-16 big-endian (without BOM) \\ + \hline + \kwd{utf-16-le} & \kwd{utf-16le} \kwd{utf16-le} & UTF-16 little-endian (without BOM) \\ + \hline + \kwd{utf-32} & \kwd{utf32} & UTF-32 with optional BOM \\ + \hline + \kwd{utf-32-be} & \kwd{utf-32be} \kwd{utf32-be} & UTF-32 big-endian (without BOM) \\ + \hline + \kwd{utf-32-le} & \kwd{utf-32le} \kwd{utf32-le} & UTF-32 little-endian (without BOM) \\ + \hline + \kwd{cp1250} & & \\ + \hline + \kwd{cp1251} & & \\ + \hline + \kwd{cp1252} & \kwd{windows-1252} \kwd{windows-cp1252} \kwd{windows-latin1} & \\ + \hline + \kwd{cp1253} & & \\ + \hline + \kwd{cp1254} & & \\ + \hline + \kwd{cp1255} & & \\ + \hline + \kwd{cp1256} & & \\ + \hline + \kwd{cp1257} & & \\ + \hline + \kwd{cp1258} & & \\ + \hline + \kwd{koi8-r} & & \\ + \hline + \kwd{mac-cyrillic} & & \\ + \hline + \kwd{mac-greek} & & \\ + \hline + \kwd{mac-icelandic} & & \\ + \hline + \kwd{mac-latin2} & & \\ + \hline + \kwd{mac-roman} & & \\ + \hline + \kwd{mac-turkish} & & \\ + \hline + \end{tabular} + \caption{External formats} + \label{table:external-formats} +\end{table} + +\subsection{Composing External Formats} + +A composing external format is an external format that converts between +one codepoint and another, rather than between codepoints and octets. +A composing external format must be used in conjunction with another +(octet-producing) external format. This is specified by +using a list as the external format. For example, we can use +\code{'(\kwd{latin1} \kwd{crlf})} as the external format. In this +particular example, the external format is latin1, but whenever a +carriage-return/linefeed sequence is read, it is converted to the Lisp +\lispchar{Newline} character. Conversely, whenever a string is written, +a Lisp \lispchar{Newline} character is converted to a +carriage-return/linefeed sequence. Without the \kwd{crlf} composing +format, the carriage-return and linefeed will be read in as separate +characters, and on output the Lisp \lispchar{Newline} character is +output as a single linefeed character. + +Table~\ref{table:composing-formats} lists the available composing formats. + +\begin{table} + \centering + \begin{tabular}{|l|l|p{3in}|} + \hline + \textbf{Format} & \textbf{Aliases} & \textbf{Description} \\ + \hline + \hline + \kwd{crlf} & \kwd{dos} & Composing format for converting to/from DOS (CR/LF) + end-of-line sequence to \lispchar{Newline}\\ + \kwd{cr} & \kwd{mac} & Composing format for converting to/from DOS (CR/LF) + end-of-line sequence to \lispchar{Newline}\\ + \hline + \kwd{beta-gk} & & Composing format that translates (lower-case) Beta + code (an ASCII encoding of ancient Greek) \\ + \hline + \kwd{final-sigma} & & Composing format that attempts to detect sigma in + word-final position and change it from U+3C3 to U+3C2\\ + \hline + \end{tabular} + \caption{Composing external formats} + \label{table:composing-formats} +\end{table} + +\section{Dictionary} + +\subsection{Variables} + +\begin{defvar}{extensions:}{default-external-format} + This is the default external format to use for all newly opened + files. It is also the default format to use for + \var{*standard-input*}, \var{*standard-output*}, and + \var{*standard-error*}. The default value is \kwd{iso8859-1}. + + Setting this will cause the standard streams to start using the new + format immediately. If a stream has been created with external + format \kwd{default}, then setting \var{*default-external-format*} + will cause all subsequent input and output to use the new value of + \var{*default-external-format*}. +\end{defvar} +\subsection{Characters} + +Remember that \cmucl{}'s characters are only 16-bits long but Unicode +codepoints are up to 21 bits long. Hence there are codepoints that +cannot be represented via Lisp characters. Operating on individual +characters is not recommended. Operations on strings are better. +(This would be true even if \cmucl{}'s characters could hold a +full Unicode codepoint.) + +\begin{defun}{}{char-equal}{\amprest{} \var{characters}} + \defunx{char-not-equal}{\amprest{} \var{characters}} + \defunx{char-lessp}{\amprest{} \var{characters}} + \defunx{char-greaterp}{\amprest{} \var{characters}} + \defunx{char-not-greaterp}{\amprest{} \var{characters}} + \defunx{char-not-lessp}{\amprest{} \var{characters}} + For the comparison, the characters are converted to lowercase and + the corresponding \code{char-code} are compared. +\end{defun} + +\begin{defun}{}{alpha-char-p}{\args \var{character}} + Returns non-nil{} if the Unicode category is a letter category. +\end{defun} + +\begin{defun}{}{alphanumericp}{\args \var{character}} + Returns non-nil{} if the Unicode category is a letter category or an ASCII + digit. +\end{defun} + +\begin{defun}{}{digit-char-p}{\args \var{character} \ampoptional{} \var{radix}} + Only recognizes ASCII digits (and ASCII letters if the radix is larger + than 10). +\end{defun} + +\begin{defun}{}{graphic-char-p}{\args \var{character}} + Returns non-nil{} if the Unicode category is a graphic category. +\end{defun} + +\begin{defun}{}{upper-case-p}{\args \var{character}} + \defunx{lower-case-p}{\args \var{character}} + Returns non-nil{} if the Unicode category is an uppercase + (lowercase) character. +\end{defun} + +\begin{defun}{lisp:}{title-case-p}{\args \var{character}} + Returns non-nil{} if the Unicode category is a titlecase character. +\end{defun} + +\begin{defun}{}{both-case-p}{\args \var{character}} + Returns non-nil{} if the Unicode category is an uppercase, + lowercase, or titlecase character. +\end{defun} + +\begin{defun}{}{char-upcase}{\args \var{character}} + \defunx{char-downcase}{\args \var{character}} + The Unicode uppercase (lowercase) letter is returned. +\end{defun} + +\begin{defun}{lisp:}{char-titlecase}{\args \var{character}} + The Unicode titlecase letter is returned. +\end{defun} + +\begin{defun}{}{char-name}{\args \var{char}} + If possible the name of the character \var{char} is returned. If + there is a Unicode name, the Unicode name is returned, except + spaces are converted to underscores and the string is capitalized + via \code{string-capitalize}. If there is no Unicode name, the + form \lispchar{U+xxxx} is returned where ``xxxx'' is the + \code{char-code} of the character, in hexadecimal. +\end{defun} + +\begin{defun}{}{name-char}{\args \var{name}} + The inverse to \code{char-name}. If no character has the name + \var{name}, then \nil{} is returned. Unicode names are not + case-sensitive, and spaces and underscores are optional. +\end{defun} +\subsection{Strings} + +Strings in \cmucl{} are UTF-16 strings. That is, for Unicode code +points greater than 65535, surrogate pairs are used. We refer the +reader to the Unicode standard for more information about surrogate +pairs. We just want to make a note that because of the UTF-16 +encoding of strings, there is a distinction between Lisp characters +and Unicode codepoints. The standard string operations know about +this encoding and handle the surrogate pairs correctly. + + +\begin{defun}{}{string-upcase}{\args \var{string} \keys{\kwd{start} + \kwd{end} \kwd{casing}}} + \defunx{string-downcase}{\args \var{string} \keys{\kwd{start} + \kwd{end} \kwd{casing}}} + \defunx{string-capitalize}{\args \var{string} \keys{\kwd{start} + \kwd{end} \kwd{casing}}} + The case of the \var{string} is changed appropriately. Surrogate + pairs are handled correctly. The conversion to the appropriate case + is done based on the Unicode conversion. The additional argument + \kwd{casing} controls how case conversion is done. The default + value is \kwd{simple}, which uses simple Unicode case conversion. + If \kwd{casing} is \kwd{full}, then full Unicode case conversion is + done where the string may actually increase in length. +\end{defun} + +\begin{defun}{}{nstring-upcase}{\args \var{string} \keys{\kwd{start} \kwd{end}}} + \defunx{nstring-downcase}{\args \var{string} \keys{\kwd{start} \kwd{end}}} + \defunx{nstring-capitalize}{\args \var{string} \keys{\kwd{start} + \kwd{end}}} + The case of the \var{string} is changed appropriately. Surrogate + pairs are handled correctly. The conversion to the appropriate case + is done based on the Unicode conversion. (Full casing is not + available because the string length cannot be increased when needed.) +\end{defun} + +\begin{defun}{}{string=}{\args \var{s1} \var{s2} \keys{\kwd{start1} + \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string/=}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string\textless}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string\textgreater}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string\textless=}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string\textgreater=}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + The string comparison is done in codepoint order. (This is + different from just comparing the order of the individual characters + due to surrogate pairs.) Unicode collation is not done. +\end{defun} + +\begin{defun}{}{string-equal}{\args \var{s1} \var{s2} \keys{\kwd{start1} + \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string-not-equal}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string-lessp}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string-greaterp}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string-not-greaterp}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + \defunx{string-not-lessp}{\args \var{s1} \var{s2} \keys{\kwd{start1} \kwd{end1} \kwd{start2} \kwd{end2}}} + Each codepoint in each string is converted to lowercase and the + appropriate comparison of the codepoint values is done. Unicode + collation is not done. +\end{defun} + +\begin{defun}{}{string-left-trim}{\args \var{bag} \var{string}} + \defunx{string-right-trim}{\args \var{bag} \var{string}} + \defunx{string-trim}{\args \var{bag} \var{string}} + Removes any characters in \code{bag} from the left, right, or both + ends of the string \code{string}, respectively. This has potential + problems if you want to remove a surrogate character from the + string, since a single character cannot represent a surrogate. As + an extension, if \code{bag} is a string, we properly handle + surrogate characters in the \code{bag}. +\end{defun} + +\subsection{Sequences} + +Since strings are also sequences, the sequence functions can be used +on strings. We note here some issues with these functions. Most +issues are due to the fact that strings are UTF-16 strings and +characters are UTF-16 code units, not Unicode codepoints. + +\begin{defun}{}{remove-duplicates}{\args \var{sequence} + \keys{\kwd{from-end} \kwd{test} \kwd{test-not} \kwd{start} + \kwd{end} \kwd{key}}} + \defunx{delete-duplicates}{\args \var{sequence} + \keys{\kwd{from-end} \kwd{test} \kwd{test-not} \kwd{start} + \kwd{end} \kwd{key}}} + Because of surrogate pairs these functions may remove a high or low + surrogate value, leaving the string in an invalid state. Use these + functions carefully with strings. +\end{defun} + + +\subsection{Reader} + +To support Unicode characters, the reader has been extended to +recognize characters written in hexadecimal. Thus \lispchar{U+41} is +the ASCII capital letter ``A'', since 41 is the hexadecimal code for +that letter. The Unicode name of the character is also recognized, +except spaces in the name are replaced by underscores. + +Recall, however, that characters in \cmucl{} are only 16 bits long so +many Unicode characters cannot be represented. However, strings can +represent all Unicode characters. + +When symbols are read, the symbol name is converted to Unicode NFC +form before interning the symbol into the package. Hence, +\code{symbol-name (intern ``string'')} may produce a string that is +not \code{string=} to ``string''. However, after conversion to NFC +form, the strings will be identical. + +\subsection{Printer} + +When printing characters, if the character is a graphic character, the +character is printed. Thus \lispchar{U+41} is printed as +\lispchar{A}. If the character is not a graphic character, the Lisp +name (e.g., \lispchar{Tab}) is used if possible; +if there is no Lisp name, the Unicode name is used. If there is no +Unicode name, the hexadecimal char-code is +printed. For example, \lispchar{U+34e}, which is not a graphic +character, is printed as \lispchar{Combining\_Upwards\_Arrow\_Below}, +and \lispchar{U+9f} which is not a graphic character and does not have a +Unicode name, is printed as \lispchar{U+009F}. + +\subsection{Miscellaneous} + + +\subsubsection{Files} + +\cmucl{} loads external formats using the search-list +\file{ext-formats:}. The \file{aliases} file is also located using +this search-list. + +The Unicode data base is stored in compressed form in the file +\file{ext-formats:unidata.bin}. If this file is not found, Unicode +support is severely reduced; you can only use ASCII characters. + +\begin{defun}{}{open}{\args \var{filename} \amprest{} \var{options} + \keys{\kwd{direction} \kwd{element-type} \kwd{if-exists} + \kwd{if-does-not-exist} \morekeys \kwd{class} \kwd{mapped} + \kwd{input-handle} \kwd{output-handle} + \yetmorekeys \kwd{external-format} \kwd{decoding-error} + \kwd{encoding-error}}} + + The main options are covered elsewhere. Here we describe the + options specific to Unicode. The option \kwd{external-format} + specifies the external format to use for reading and writing the + file. The external format is a keyword. + + The options \kwd{decoding-error} and \kwd{encoding-error} are used + to specify how encoding and decoding errors are handled. The + default value on \nil means the external format handles errors + itself and typically replaces invalid sequences with the Unicode + replacement character. + + Otherwise, the value for \code{decoding-error} is either a + character, a symbol or a function. If a character is + specified. it is used as the replacement character for any invalid + decoding. If a symbol or a function is given, it must be a + function of three arguments: a message string to be printed, the + offending octet, and the number of octets read. If the function + returns, it should return two values: the code point to use as the + replacement character and the number of octets read. In addition, + \true{} may be specified. This indicates that a continuable error + is signaled, which, if continued, the Unicode replacement + character is used. + + For \code{encoding-error}, a character, symbol, or function can be + specified, like \code{decoding-error}, with the same meaning. The + function, however, takes two arguments: a format message string + and the incorrect codepoint. If the function returns, it should + be the replacement codepoint. +\end{defun} + +\subsubsection{Utilities} + +\begin{defun}{stream:}{set-system-external-format}{\var{terminal} \ampoptional{} \var{filenames}} + This function changes the external format used for + \var{*standard-input*}, \var{*standard-output*}, and + \var{*standard-error*} to the external format specified by + \var{terminal}. Additionally, the Unix file name encoding can be + set to the value specified by \var{filenames} if non-\nil. +\end{defun} + +\begin{defun}{extensions:}{list-all-external-formats}{} + list all of the vailable external formats. A list is returned where + each element is a list of the external format name and a list of + aliases for the format. No distinction is made between external + formats and composing external formats. +\end{defun} + +\begin{defun}{extensions:}{describe-external-format}{\var{external-format}} + Print a description of the given \var{external-format}. This may + cause the external format to be loaded (silently) if it is not + already loaded. +\end{defun} + +Since strings are UTF-16 and hence may contain surrogate pairs, some +utility functions are provided to make access easier. + +\begin{defun}{lisp:}{codepoint}{\args \var{string} \var{i} + \ampoptional{} \var{end}} + Return the codepoint value from \var{string} at position \var{i}. + If code unit at that position is a surrogate value, it is combined + with either the previous or following code unit (when possible) to + compute the codepoint. The first return value is the codepoint + itself. The second return value is \nil{} if the position is not a + surrogate pair. Otherwise, $+1$ or $-1$ is returned if the position + is the high (leading) or low (trailing) surrogate value, respectively. + + This is useful for iterating through a string in codepoint sequence. +\end{defun} + +\begin{defun}{lisp:}{surrogates-to-codepoint}{\args \var{hi} \var{lo}} + Convert the given \var{hi} and \var{lo} surrogate characters to the + corresponding codepoint value +\end{defun} + +\begin{defun}{lisp:}{surrogates}{\args \var{codepoint}} + Convert the given \var{codepoint} value to the corresponding high + and low surrogate characters. If the codepoint is less than 65536, + the second value is \nil{} since the codepoint does not need to be + represented as a surrogate pair. +\end{defun} + +\begin{defun}{stream:}{string-encode}{\args \var{string} + \var{external-format} \ampoptional{} (\var{start} 0) \var{end}} + \code{string-encode} encodes \var{string} using the format + \var{external-format}, producing an array of octets. Each octet is + converted to a character via \code{code-char} and the resulting + string is returned. + + The optional argument \var{start}, defaulting to 0, specifies the + starting index and \var{end}, defaulting to the length of the + string, is the end of the string. +\end{defun} + +\begin{defun}{stream:}{string-decode}{\args \var{string} + \var{external-format} \ampoptional{} (\var{start} 0) \var{end}} + \code{string-decode} decodes \var{string} using the format + \var{external-format} and produces a new string. Each character of + \var{string} is converted to octet (by \code{char-code}) and the + resulting array of octets is used by the external format to produce + a string. This is the inverse of \code{string-encode}. + + The optional argument \var{start}, defaulting to 0, specifies the + starting index and \var{end}, defaulting to the length of the + string, is the end of the string. + + \var{string} must consist of characters whose \code{char-code} is + less than 256. +\end{defun} + +\begin{defun}{}{string-to-octets}{\args \var{string} \keys{\kwd{start} + \kwd{end} \kwd{external-format} \kwd{buffer} \kwd{buffer-start} + \kwd{error}}} + \code{string-to-octets} converts \var{string} to a sequence of + octets according to the external format specified by + \var{external-format}. The string to be converted is bounded by + \var{start}, which defaults to 0, and \var{end}, which defaults to + the length of the string. If \var{buffer} is specified, the octets + are placed in \var{buffer}. If \var{buffer} is not specified, a new + array is allocated to hold the octets. \var{buffer-start} specifies + where in the buffer the first octet will be placed. + + An error method may also be specified by \var{error}. Any errors + encountered while converting the string to octets will be handled + according to error. If \nil{}, a replacement character is converted + to octets in place of the error. Otherwise, \var{error} should be a + symbol or function that will be called when the error occurs. The + function takes two arguments: an error string and the character + that caused the error. It should return a replacement character. + + Three values are returned: The buffer, the number of valid octets + written, and the number of characters converted. Note that the + actual number of octets written may be greater than the returned + value, These represent the partial octets of the next character to + be converted, but there was not enough room to hold the complete set + of octets. +\end{defun} + +\begin{defun}{}{octets-to-string}{\args \var{octets} \keys{\kwd{start} + \kwd{end} \kwd{external-format} \kwd{string} \kwd{s-start} + \kwd{s-end} \kwd{state}}} + \code{octets-to-string} converts the sequence of octets in + \var{octets} to a string. \var{octets} must be a + \code{(simple-array (unsigned-byte 8) (*))}. The octets to be + converted are bounded by \var{start} and \var{end}, which default to + 0 and the length of the array, respectively. The conversion is + performed according to the external format specified by + \var{external-format}. If \var{string} is specified, the octets are + converted and stored in \var{string}, starting at \var{s-start} + (defaulting to 0) and ending just before \var{s-end} (defaulting to + the end of \var{string}. \var{string} must be \code{simple-string}. + If the bounded string is not large enough to hold all of the + characters, then some octets will not be converted. If \var{string} + is not specified, a new string is created. + + The \var{state} is used as the initial state of for the external + format. This is useful when converting buffers of octets where the + buffers are not on character boundaries, and state information is + needed between buffers. + + Four values are returned: the string, the number of characters + written to the string, and the number of octets consumed to produce + the characters, and the final state of external format after + converting the octets. +\end{defun} + +\section{Writing External Formats} + +\subsection{External Formats} +Users may write their own external formats. It is probably easiest to +look at existing external formats to see how do this. + +An external format basically needs two functions: +\code{octets-to-code} to convert octets to Unicode codepoints and +\code{code-to-octets} to convert Unicode codepoints to octets. The +external format is defined using the macro +\code{stream::define-external-format}. + +% tricky +\begin{defmac}[base]{stream::}{define-external-format}{\args \var{name} + (\keys{\kwd{base} \kwd{min} \kwd{max} \kwd{size} \kwd{documentation}}) + (\amprest{} \var{slots}) + \\ + \= \ampoptional{} \var{octets-to-code} \var{code-to-octets} \var{flush-state} \var{copy-state}} + + + If \kwd{base} is not given, this defines a new external format of + the name \kwd{name}. \var{min}, \var{max}, and \var{size} are the + minimum and maximum number of octets that make up a character. + (\code{\kwd{size} n} is just a short cut for \code{\kwd{min} n + \kwd{max} n}.) The description of the external format can be + given using \kwd{documentation}. The arguments \var{octets-to-code} + and \var{code-to-octets} are not optional in this case. They + specify how to convert octets to codepoints and vice versa, + respectively. These should be backquoted forms for the body of a + function to do the conversion. See the description below for these + functions. Some good examples are the external format for + \kwd{utf-8} or \kwd{utf-16}. The \kwd{slots} argument is a list of + read-only slots, similar to defstruct. The slot names are available + as local variables inside the \var{code-to-octets} and + \var{octets-to-code} bodies. + + If \kwd{base} is given, then an external format is defined with the + name \kwd{name} that is based on a previously defined format + \kwd{base}. The \var{slots} are inherited from the \kwd{base} format + by default, although the definition may alter their values and add + new slots. See, for example, the \kwd{mac-greek} external format. + +\end{defmac} + +\begin{defmac}{}{octets-to-code}{\args \var{state} \var{input} + \var{unput} \var{error} \amprest{} \var{args}} + This defines a form to be used by an external format to convert + octets to a code point. \var{state} is a form that can be used by + the body to access the state variable of a stream. This can be used + for any reason to hold anything needed by \code{octets-to-code}. + \var{input} is a form that returns one octet from the input stream. + \var{unput} will put back \var{N} octets to the stream. \var{args} is a + list of variables that need to be defined for any symbols in the + body of the macro. + + \var{error} controls how errors are handled. If \nil, some suitable + replacement character is used. That is, any errors are silently + ignored and replaced by some replacement character. If non-\nil, + \var{error} is a symbol or function that is called to handle the + error. This function takes three arguments: a message string, the + invalid octet (or \nil), and a count of the number of octets that + have been read so far. If the function returns, it should be the + codepoint of the desired replacement character. +\end{defmac} + +\begin{defmac}{}{code-to-octets}{\args \var{code} \var{state} + \var{output} \var{error} \amprest{} \var{args}} + Defines a form to be used by the external format to convert a code + point to octets for output. \var{code} is the code point to be + converted. \var{state} is a form to access the current value of the + stream's state variable. \var{output} is a form that writes one + octet to the output stream. + + Similar to \code{octets-to-code}, \var{error} indicates how errors + should be handled. If \nil, some default replacement character is + substituted. If non-\nil, \var{error} should be a symbol or + function. This function takes two arguments: a message string and + the invalid codepoint. If the function returns, it should be the + codepoint that will be substituted for the invalid codepoint. +\end{defmac} + +\begin{defmac}{}{flush-state}{\args \var{state} + \var{output} \var{error} \amprest{} \var{args}} + Defines a form to be used by the external format to flush out + any state when an output stream is closed. Similar to + \code{code-to-octets}, but there is no code point to be output. The + \var{error} argument indicates how to handle errors. If \nil, some + default replacement character is used. Otherwise, \var{error} is a + symbol or function that will be called with a message string and + codepoint of the offending state. If the function returns, it + should be the codepoint of a suitable replacement. + + If \code{flush-state} is \false, then nothing special is needed to + flush the state to the output. + + This is called only when an output character stream is being closed. +\end{defmac} + +\begin{defmac}{}{copy-state}{\args \var{state} \amprest{} \var{args}} + Defines a form to copy any state needed by the external format. + This should probably be a deep copy so that if the original + state is modified, the copy is not. + + If not given, then nothing special is needed to copy the state + either because there is no state for the external format or that no + special copier is needed. +\end{defmac} + +\subsection{Composing External Formats} + +\begin{defmac}{stream:}{define-composing-external-format}{\args \var{name} + (\keys{\kwd{min} \kwd{max} \kwd{size} \kwd{documentation}}) \var{input} + \var{output}} + This is the same as \code{define-external-format}, except that a + composing external format is created. +\end{defmac} diff --git a/doc/cmu-user/unix.tex b/doc/cmu-user/unix.tex new file mode 100644 index 0000000000..fccd0c9ad1 --- /dev/null +++ b/doc/cmu-user/unix.tex @@ -0,0 +1,508 @@ +\chapter{UNIX Interface} +\label{unix-interface} + +\credits{by Robert MacLachlan, Skef Wholey, Bill Chiles and William Lott} + + +\cmucl{} attempts to make the full power of the underlying +environment available to the Lisp programmer. This is done using +combination of hand-coded interfaces and foreign function calls to C +libraries. Although the techniques differ, the style of interface is +similar. This chapter provides an overview of the facilities available +and general rules for using them, as well as describing specific +features in detail. It is assumed that the reader has a working +familiarity with Unix and X11, as well as access to the standard +system documentation. + + +\section{Reading the Command Line} + +The shell parses the command line with which Lisp is invoked, and +passes a data structure containing the parsed information to Lisp. +This information is then extracted from that data structure and put +into a set of Lisp data structures. + +\begin{defvar}{extensions:}{command-line-strings} + \defvarx[extensions:]{command-line-utility-name} + \defvarx[extensions:]{command-line-words} + \defvarx[extensions:]{command-line-switches} + + The value of \code{*command-line-words*} is a list of strings that + make up the command line, one word per string. The first word on + the command line, i.e. the name of the program invoked (usually + \code{lisp}) is stored in \code{*command-line-utility-name*}. The + value of \code{*command-line-switches*} is a list of + \code{command-line-switch} structures, with a structure for each + word on the command line starting with a hyphen. All the command + line words between the program name and the first switch are stored + in \code{*command-line-words*}. +\end{defvar} + +The following functions may be used to examine \code{command-line-switch} +structures. +\begin{defun}{extensions:}{cmd-switch-name}{\args{\var{switch}}} + + Returns the name of the switch, less the preceding hyphen and + trailing equal sign (if any). +\end{defun} +\begin{defun}{extensions:}{cmd-switch-value}{\args{\var{switch}}} + + Returns the value designated using an embedded equal sign, if any. + If the switch has no equal sign, then this is null. +\end{defun} +\begin{defun}{extensions:}{cmd-switch-words}{\args{\var{switch}}} + + Returns a list of the words between this switch and the next switch + or the end of the command line. +\end{defun} +\begin{defun}{extensions:}{cmd-switch-arg}{\args{\var{switch}}} + + Returns the first non-null value from \code{cmd-switch-value}, the + first element in \code{cmd-switch-words}, or the first word in + \var{command-line-words}. +\end{defun} + +\begin{defun}{extensions:}{get-command-line-switch}{\args{\var{sname}}} + + This function takes the name of a switch as a string and returns the + value of the switch given on the command line. If no value was + specified, then any following words are returned. If there are no + following words, then \true{} is returned. If the switch was not + specified, then \false{} is returned. +\end{defun} + +\begin{defmac}{extensions:}{defswitch}{% + \args{\var{name} \ampoptional{} \var{function}}} + + This macro causes \var{function} to be called when the switch + \var{name} appears in the command line. Name is a simple-string + that does not begin with a hyphen (unless the switch name really + does begin with one.) + + If \var{function} is not supplied, then the switch is parsed into + \var{command-line-switches}, but otherwise ignored. This suppresses + the undefined switch warning which would otherwise take place. The + warning can also be globally suppressed by + \var{complain-about-illegal-switches}. +\end{defmac} + + +\section{Useful Variables} + +\begin{defvar}{system:}{stdin} + \defvarx[system:]{stdout} \defvarx[system:]{stderr} + + Streams connected to the standard input, output and error file + descriptors. +\end{defvar} + +\begin{defvar}{system:}{tty} + + A stream connected to \file{/dev/tty}. +\end{defvar} + +\begin{defvar}{extensions:}{environment-list} + The environment variables inherited by the current process, as a + keyword-indexed alist. For example, to access the DISPLAY + environment variable, you could use + +\begin{lisp} + (cdr (assoc :display ext:*environment-list*)) +\end{lisp} + + Note that the case of the variable name is preserved when converting + to a keyword. Therefore, you need to specify the keyword properly for + variable names containing lower-case letters, +\end{defvar} + + +\section{Lisp Equivalents for C Routines} + +The UNIX documentation describes the system interface in terms of C +procedure headers. The corresponding Lisp function will have a somewhat +different interface, since Lisp argument passing conventions and +datatypes are different. + +The main difference in the argument passing conventions is that Lisp does not +support passing values by reference. In Lisp, all argument and results are +passed by value. Interface functions take some fixed number of arguments and +return some fixed number of values. A given ``parameter'' in the C +specification will appear as an argument, return value, or both, depending on +whether it is an In parameter, Out parameter, or In/Out parameter. The basic +transformation one makes to come up with the Lisp equivalent of a C routine is +to remove the Out parameters from the call, and treat them as extra return +values. In/Out parameters appear both as arguments and return values. Since +Out and In/Out parameters are only conventions in C, you must determine the +usage from the documentation. + +Thus, the C routine declared as + +\begin{example} +kern_return_t lookup(servport, portsname, portsid) + port servport; + char *portsname; + int *portsid; /* out */ + { + ... + *portsid = <expression to compute portsid field> + return(KERN_SUCCESS); + } +\end{example} + +has as its Lisp equivalent something like + +\begin{lisp} +(defun lookup (ServPort PortsName) + ... + (values + success + <expression to compute portsid field>)) +\end{lisp} + +If there are multiple out or in-out arguments, then there are multiple +additional returns values. + +Fortunately, \cmucl{} programmers rarely have to worry about the +nuances of this translation process, since the names of the arguments and +return values are documented in a way so that the \code{describe} function +(and the \hemlock{} \code{Describe Function Call} command, invoked with +\b{C-M-Shift-A}) will list this information. Since the names of arguments +and return values are usually descriptive, the information that +\code{describe} prints is usually all one needs to write a +call. Most programmers use this on-line documentation nearly +all of the time, and thereby avoid the need to handle bulky +manuals and perform the translation from barbarous tongues. + + +\section{Type Translations} +\cindex{aliens} +\cpsubindex{types}{alien} +\cpsubindex{types}{foreign language} + +Lisp data types have very different representations from those used by +conventional languages such as C. Since the system interfaces are +designed for conventional languages, Lisp must translate objects to and +from the Lisp representations. Many simple objects have a direct +translation: integers, characters, strings and floating point numbers +are translated to the corresponding Lisp object. A number of types, +however, are implemented differently in Lisp for reasons of clarity and +efficiency. + +Instances of enumerated types are expressed as keywords in Lisp. +Records, arrays, and pointer types are implemented with the \alien{} +facility (\pxlref{aliens}). Access functions are defined +for these types which convert fields of records, elements of arrays, +or data referenced by pointers into Lisp objects (possibly another +object to be referenced with another access function). + +One should dispose of \alien{} objects created by constructor +functions or returned from remote procedure calls when they are no +longer of any use, freeing the virtual memory associated with that +object. Since \alien{}s contain pointers to non-Lisp data, the +garbage collector cannot do this itself. If the memory +was obtained from \funref{make-alien} or from a foreign function call +to a routine that used \code{malloc}, then \funref{free-alien} should +be used. + + +\section{System Area Pointers} +\label{system-area-pointers} + +\cindex{pointers}\cpsubindex{malloc}{C function}\cpsubindex{free}{C function} +Note that in some cases an address is represented by a Lisp integer, and in +other cases it is represented by a real pointer. Pointers are usually used +when an object in the current address space is being referred to. The MACH +virtual memory manipulation calls must use integers, since in principle the +address could be in any process, and Lisp cannot abide random pointers. +Because these types are represented differently in Lisp, one must explicitly +coerce between these representations. + +System Area Pointers (SAPs) provide a mechanism that bypasses the +\alien{} type system and accesses virtual memory directly. A SAP is a +raw byte pointer into the \code{lisp} process address space. SAPs are +represented with a pointer descriptor, so SAP creation can cause +consing. However, the compiler uses a non-descriptor representation +for SAPs when possible, so the consing overhead is generally minimal. +\xlref{non-descriptor}. + +\begin{defun}{system:}{sap-int}{\args{\var{sap}}} + \defunx[system:]{int-sap}{\args{\var{int}}} + + The function \code{sap-int} is used to generate an integer + corresponding to the system area pointer, suitable for passing to + the kernel interfaces (which want all addresses specified as + integers). The function \code{int-sap} is used to do the opposite + conversion. The integer representation of a SAP is the byte offset + of the SAP from the start of the address space. +\end{defun} + +\begin{defun}{system:}{sap+}{\args{\var{sap} \var{offset}}} + + This function adds a byte \var{offset} to \var{sap}, returning a new + SAP. +\end{defun} + +\begin{defun}{system:}{sap-ref-8}{\args{\var{sap} \var{offset}}} + \defunx[system:]{sap-ref-16}{\args{\var{sap} \var{offset}}} + \defunx[system:]{sap-ref-32}{\args{\var{sap} \var{offset}}} + + These functions return the 8, 16 or 32 bit unsigned integer at + \var{offset} from \var{sap}. The \var{offset} is always a byte + offset, regardless of the number of bits accessed. \code{setf} may + be used with the these functions to deposit values into virtual + memory. +\end{defun} + +\begin{defun}{system:}{signed-sap-ref-8}{\args{\var{sap} \var{offset}}} + \defunx[system:]{signed-sap-ref-16}{\args{\var{sap} \var{offset}}} + \defunx[system:]{signed-sap-ref-32}{\args{\var{sap} \var{offset}}} + + These functions are the same as the above unsigned operations, + except that they sign-extend, returning a negative number if the + high bit is set. +\end{defun} + + +\section{Unix System Calls} + +You probably won't have much cause to use them, but all the Unix system +calls are available. The Unix system call functions are in the +\code{Unix} package. The name of the interface for a particular system +call is the name of the system call prepended with \code{unix-}. The +system usually defines the associated constants without any prefix name. +To find out how to use a particular system call, try using +\code{describe} on it. If that is unhelpful, look at the source in +\file{unix.lisp} or consult your system maintainer. + +The Unix system calls indicate an error by returning \false{} as the +first value and the Unix error number as the second value. If the call +succeeds, then the first value will always be non-\nil, often \code{t}. + +For example, to use the \code{chdir} syscall: + +\begin{lisp} +(multiple-value-bind (success errno) + (unix:unix-chdir "/tmp") + (unless success + (error "Can't change working directory: ~a" + (unix:get-unix-error-msg errno)))) +\end{lisp} + +\begin{defun}{Unix:}{get-unix-error-msg}{\args{\var{error}}} + + This function returns a string describing the Unix error number + \var{error} (this is similar to the Unix function \code{perror}). +\end{defun} + + +\section{File Descriptor Streams} +\label{sec:fds} + +Many of the UNIX system calls return file descriptors. Instead of using other +UNIX system calls to perform I/O on them, you can create a stream around them. +For this purpose, fd-streams exist. See also \funref{read-n-bytes}. + +\begin{defun}{system:}{make-fd-stream}{% + \args{\var{descriptor}} \keys{\kwd{input} \kwd{output} + \kwd{element-type}} \morekeys{\kwd{buffering} \kwd{name} + \kwd{file} \kwd{original}} \yetmorekeys{\kwd{delete-original} + \kwd{auto-close}} \yetmorekeys{\kwd{timeout} \kwd{pathname}}} + + This function creates a file descriptor stream using + \var{descriptor}. If \kwd{input} is non-\nil, input operations are + allowed. If \kwd{output} is non-\nil, output operations are + allowed. The default is input only. These keywords are defined: + \begin{Lentry} + \item[\kwd{element-type}] is the type of the unit of transaction for + the stream, which defaults to \code{string-char}. See the \clisp{} + description of \code{open} for valid values. + + \item[\kwd{buffering}] is the kind of output buffering desired for + the stream. Legal values are \kwd{none} for no buffering, + \kwd{line} for buffering up to each newline, and \kwd{full} for + full buffering. + + \item[\kwd{name}] is a simple-string name to use for descriptive + purposes when the system prints an fd-stream. When printing + fd-streams, the system prepends the streams name with \code{Stream + for }. If \var{name} is unspecified, it defaults to a string + containing \var{file} or \var{descriptor}, in order of preference. + + \item[\kwd{file}, \kwd{original}] \var{file} specifies the defaulted + namestring of the associated file when creating a file stream + (must be a \code{simple-string}). \var{original} is the + \code{simple-string} name of a backup file containing the original + contents of \var{file} while writing \var{file}. + + When you abort the stream by passing \true{} to \code{close} as + the second argument, if you supplied both \var{file} and + \var{original}, \code{close} will rename the \var{original} name + to the \var{file} name. When you \code{close} the stream + normally, if you supplied \var{original}, and + \var{delete-original} is non-\nil, \code{close} deletes + \var{original}. If \var{auto-close} is true (the default), then + \var{descriptor} will be closed when the stream is garbage + collected. + + \item[\kwd{pathname}]: The original pathname passed to open and + returned by \code{pathname}; not defaulted or translated. + + \item[\kwd{timeout}] if non-null, then \var{timeout} is an integer + number of seconds after which an input wait should time out. If a + read does time out, then the \code{system:io-timeout} condition is + signalled. + \end{Lentry} +\end{defun} + +\begin{defun}{system:}{fd-stream-p}{\args{\var{object}}} + + This function returns \true{} if \var{object} is an fd-stream, and + \nil{} if not. Obsolete: use the portable \code{(typep x + 'file-stream)}. +\end{defun} + +\begin{defun}{system:}{fd-stream-fd}{\args{\var{stream}}} + + This returns the file descriptor associated with \var{stream}. +\end{defun} + + +\section{Unix Signals} +\cindex{unix signals} \cindex{signals} + +\cmucl{} allows access to all the Unix signals that can be generated +under Unix. It should be noted that if this capability is abused, it is +possible to completely destroy the running Lisp. The following macros and +functions allow access to the Unix interrupt system. The signal names as +specified in section 2 of the {\em Unix Programmer's Manual} are exported +from the Unix package. + +\subsection{Changing Signal Handlers} +\label{signal-handlers} + +\begin{defmac}{system:}{with-enabled-interrupts}{ + \args{\var{specs} \amprest{} \var{body}}} + + This macro should be called with a list of signal specifications, + \var{specs}. Each element of \var{specs} should be a list of + two\hide{ or three} elements: the first should be the Unix signal + for which a handler should be established, the second should be a + function to be called when the signal is received\hide{, and the + third should be an optional character used to generate the signal + from the keyboard. This last item is only useful for the SIGINT, + SIGQUIT, and SIGTSTP signals.} One or more signal handlers can be + established in this way. \code{with-enabled-interrupts} establishes + the correct signal handlers and then executes the forms in + \var{body}. The forms are executed in an unwind-protect so that the + state of the signal handlers will be restored to what it was before + the \code{with-enabled-interrupts} was entered. A signal handler + function specified as NIL will set the Unix signal handler to the + default which is normally either to ignore the signal or to cause a + core dump depending on the particular signal. +\end{defmac} + +\begin{defmac}{system:}{without-interrupts}{\args{\amprest{} \var{body}}} + + It is sometimes necessary to execute a piece a code that can not be + interrupted. This macro the forms in \var{body} with interrupts + disabled. Note that the Unix interrupts are not actually disabled, + rather they are queued until after \var{body} has finished + executing. +\end{defmac} + +\begin{defmac}{system:}{with-interrupts}{\args{\amprest{} \var{body}}} + + When executing an interrupt handler, the system disables interrupts, + as if the handler was wrapped in in a \code{without-interrupts}. + The macro \code{with-interrupts} can be used to enable interrupts + while the forms in \var{body} are evaluated. This is useful if + \var{body} is going to enter a break loop or do some long + computation that might need to be interrupted. +\end{defmac} + +\begin{defmac}{system:}{without-hemlock}{\args{\amprest{} \var{body}}} + + For some interrupts, such as SIGTSTP (suspend the Lisp process and + return to the Unix shell) it is necessary to leave Hemlock and then + return to it. This macro executes the forms in \var{body} after + exiting Hemlock. When \var{body} has been executed, control is + returned to Hemlock. +\end{defmac} + +\begin{defun}{system:}{enable-interrupt}{% + \args{\var{signal} \var{function}\hide{ \ampoptional{} + \var{character}}}} + + This function establishes \var{function} as the handler for + \var{signal}. + \hide{The optional \var{character} can be specified + for the SIGINT, SIGQUIT, and SIGTSTP signals and causes that + character to generate the appropriate signal from the keyboard.} + Unless you want to establish a global signal handler, you should use + the macro \code{with-enabled-interrupts} to temporarily establish a + signal handler. \hide{Without \var{character},} + \code{enable-interrupt} returns the old function associated with the + signal. \hide{When \var{character} is specified for SIGINT, + SIGQUIT, or SIGTSTP, it returns the old character code.} +\end{defun} + +\begin{defun}{system:}{ignore-interrupt}{\args{\var{signal}}} + + Ignore-interrupt sets the Unix signal mechanism to ignore + \var{signal} which means that the Lisp process will never see the + signal. Ignore-interrupt returns the old function associated with + the signal or \false{} if none is currently defined. +\end{defun} + +\begin{defun}{system:}{default-interrupt}{\args{\var{signal}}} + + Default-interrupt can be used to tell the Unix signal mechanism to + perform the default action for \var{signal}. For details on what + the default action for a signal is, see section 2 of the {\em Unix + Programmer's Manual}. In general, it is likely to ignore the + signal or to cause a core dump. +\end{defun} + + +\subsection{Examples of Signal Handlers} + +The following code is the signal handler used by the Lisp system for the +SIGINT signal. + +\begin{lisp} +(defun ih-sigint (signal code scp) + (declare (ignore signal code scp)) + (without-hemlock + (with-interrupts + (break "Software Interrupt" t)))) +\end{lisp} + +The \code{without-hemlock} form is used to make sure that Hemlock is exited before +a break loop is entered. The \code{with-interrupts} form is used to enable +interrupts because the user may want to generate an interrupt while in the +break loop. Finally, break is called to enter a break loop, so the user +can look at the current state of the computation. If the user proceeds +from the break loop, the computation will be restarted from where it was +interrupted. + +The following function is the Lisp signal handler for the SIGTSTP signal +which suspends a process and returns to the Unix shell. + +\begin{lisp} +(defun ih-sigtstp (signal code scp) + (declare (ignore signal code scp)) + (without-hemlock + (Unix:unix-kill (Unix:unix-getpid) Unix:sigstop))) +\end{lisp} + +Lisp uses this interrupt handler to catch the SIGTSTP signal because it is +necessary to get out of Hemlock in a clean way before returning to the shell. + +To set up these interrupt handlers, the following is recommended: + +\begin{lisp} +(with-enabled-interrupts ((Unix:SIGINT #'ih-sigint) + (Unix:SIGTSTP #'ih-sigtstp)) + <user code to execute with the above signal handlers enabled.> +) +\end{lisp} diff --git a/doc/internals/cmu/.cvsignore b/doc/internals/cmu/.cvsignore new file mode 100644 index 0000000000..7bbca4b4a0 --- /dev/null +++ b/doc/internals/cmu/.cvsignore @@ -0,0 +1,11 @@ +architecture.aux +compiler.aux +design.aux +design.dvi +design.log +design.out +design.pdf +design.toc +glossary.aux +retargeting.aux +run-time.aux diff --git a/doc/internals/cmu/.gitignore b/doc/internals/cmu/.gitignore new file mode 100644 index 0000000000..3dc4f08af1 --- /dev/null +++ b/doc/internals/cmu/.gitignore @@ -0,0 +1,10 @@ +/architecture.aux +/compiler.aux +/design.aux +/design.log +/design.out +/design.pdf +/design.toc +/glossary.aux +/retargeting.aux +/run-time.aux diff --git a/doc/internals/cmu/Makefile b/doc/internals/cmu/Makefile new file mode 100644 index 0000000000..0e9d8e6c53 --- /dev/null +++ b/doc/internals/cmu/Makefile @@ -0,0 +1,83 @@ +LATEX=latex +PDFLATEX=pdflatex +DVIPS=dvips +DVIPSRES=1200 +DVIPSOPTS=-t a4 -D $(DVIPSRES) +RM=rm +CP=cp +MV=mv + +HTML_SPLIT_LEVEL=2 + +MASTERFILE=design + +FILES=architecture.tex back.tex compiler-overview.tex compiler.tex debugger.tex \ + design.tex environment.tex fasl.tex front.tex glossary.tex interface.tex \ + interpreter.tex lowlev.tex middle.tex object.tex retargeting.tex \ + run-time.tex vm.tex + +FIGURES= + +all : $(MASTERFILE).pdf + +$(MASTERFILE).dvi : $(FILES) $(FIGURES) + $(LATEX) $(MASTERFILE).tex + +# $(MASTERFILE).aux $(MASTERFILE).toc : $(FILES) $(FIGURES) +# $(LATEX) $(MASTERFILE).tex +# $(RM) $(MASTERFILE).dvi + +# $(MASTERFILE).dvi : $(FILES) $(MASTERFILE).aux $(MASTERFILE).toc $(FIGURES) +# $(LATEX) $(MASTERFILE).tex + +# Three times should be enough for everyone(tm). +.PHONY: firsttime +firsttime: $(MASTERFILE).dvi + $(LATEX) $(MASTERFILE).tex + $(LATEX) $(MASTERFILE).tex + + +.PRECIOUS: %.aux %.toc %.tex + + +%.dvi : %.tex + $(LATEX) $< + @while ( grep Rerun $*.log > /dev/null ); do \ + $(LATEX) $<; \ + done + $(LATEX) $< + +%.eps : %.fig + fig2dev -L ps $^ $@ + +%.pdf : %.tex + $(PDFLATEX) $^ + @while ( grep 'Rerun to get cross' $*.log > /dev/null ); do \ + $(PDFLATEX) $<; \ + done + $(PDFLATEX) $< + +%.ps : %.dvi + $(DVIPS) $(DVIPSOPTS) -o $@ $* + +.PHONY: html +html : $(MASTERFILE).dvi $(FILES) $(FIGURES) + latex2html -local_icons -antialias_text -antialias -scalable_fonts \ + -split $(HTML_SPLIT_LEVEL) -transparent -white $(MASTERFILE).tex + +clean distclean cvsclean : + -$(RM) -f *.log *.toc *.aux *.dvi *~ *.bak *.ps *.pdf core *.eps + -$(RM) -rf design + +.PHONY : allformats +allformats: $(FILES) $(FIGURES) + $(MAKE) firsttime LATEX=pslatex + $(MAKE) design.ps ; $(MV) design.ps design-psfonts.ps + $(MAKE) firsttime + $(MAKE) design.ps DVIPSRES=1200 ; $(MV) design.ps design-1200.ps + $(MAKE) design.ps DVIPSRES=600 ; $(MV) design.ps design-600.ps + $(MAKE) design.ps DVIPSRES=300 ; $(MV) design.ps design-300.ps + $(MAKE) design.pdf + $(MAKE) html HTML_SPLIT_LEVEL=3 ; $(MV) design design-split3 + $(MAKE) html HTML_SPLIT_LEVEL=2 ; $(MV) design design-split2 + $(MAKE) html HTML_SPLIT_LEVEL=1 ; $(MV) design design-split1 diff --git a/doc/internals/cmu/architecture.tex b/doc/internals/cmu/architecture.tex new file mode 100644 index 0000000000..bb52888d59 --- /dev/null +++ b/doc/internals/cmu/architecture.tex @@ -0,0 +1,205 @@ +\part{System Architecture}% -*- Dictionary: int:design -*- + +\chapter{Package and File Structure} + +\section{Source Tree Structure} + +The \cmucl{} source tree has subdirectories for each major subsystem: + +\begin{description} +\item[{\tt assembly/}] Holds the CMU CL source-file assembler, and has machine +specific subdirectories holding assembly code for that architecture. + +\item[{\tt clx/}] The CLX interface to the X11 window system. + +\item[{\tt code/}] The Lisp code for the runtime system and standard CL +utilities. + +\item[{\tt compiler/}] The Python compiler. Has architecture-specific +subdirectories which hold backends for different machines. The {\tt generic} +subdirectory holds code that is shared across most backends. + +\item[{\tt hemlock/}] The Hemlock editor. + +\item[{\tt lisp/}] The C runtime system code and low-level Lisp debugger. + +\item[{\tt pcl/}] \cmucl{} version of the PCL implementation of CLOS. + +\item[{\tt tools/}] System building command files and source management tools. +\end{description} + + +\section{Package structure} + +Goals: with the single exception of LISP, we want to be able to export from the +package that the code lives in. + +\begin{description} +\item[Mach, CLX...] --- These Implementation-dependent system-interface +packages provide direct access to specific features available in the operating +system environment, but hide details of how OS communication is done. + +\item[system] contains code that must know about the operating system +environment: I/O, etc. Hides the operating system environment. Provides OS +interface extensions such as {\tt print-directory}, etc. + +\item[kernel] hides state and types used for system integration: package +system, error system, streams (?), reader, printer. Also, hides the VM, in +that we don't export anything that reveals the VM interface. Contains code +that needs to use the VM and SYSTEM interface, but is independent of OS and VM +details. This code shouldn't need to be changed in any port of CMU CL, but +won't work when plopped into an arbitrary CL. Uses SYSTEM, VM, EXTENSIONS. We +export "hidden" symbols related to implementation of CL: setf-inverses, +possibly some global variables. + +The boundary between KERNEL and VM is fuzzy, but this fuzziness reflects the +fuzziness in the definition of the VM. We can make the VM large, and bring +everything inside, or we can make it small. Obviously, we want the VM to be +as small as possible, subject to efficiency constraints. Pretty much all of +the code in KERNEL could be put in VM. The issue is more what VM hides from +KERNEL: VM knows about everything. + +\item[lisp] Originally, this package had all the system code in it. The +current ideal is that this package should have {\it no} code in it, and only +exist to export the standard interface. Note that the name has been changed by +x3j13 to common-lisp. + +\item[extensions] contains code that any random user could have written: list +operations, syntactic sugar macros. Uses only LISP, so code in EXTENSIONS is +pure CL. Exports everything defined within that is useful elsewhere. This +package doesn't hide much, so it is relatively safe for users to use +EXTENSIONS, since they aren't getting anything they couldn't have written +themselves. Contrast this to KERNEL, which exports additional operations on +CL's primitive data structures: PACKAGE-INTERNAL-SYMBOL-COUNT, etc. Although +some of the functionality exported from KERNEL could have been defined in CL, +the kernel implementation is much more efficient because it knows about +implementation internals. Currently this package contains only extensions to +CL, but in the ideal scheme of things, it should contain the implementations of +all CL functions that are in KERNEL (the library.) + +\item[VM] hides information about the hardware and data structure +representations. Contains all code that knows about this sort of thing: parts +of the compiler, GC, etc. The bulk of the code is the compiler back-end. +Exports useful things that are meaningful across all implementations, such as +operations for examining compiled functions, system constants. Uses COMPILER +and whatever else it wants. Actually, there are different {\it machine}{\tt +-VM} packages for each target implementation. VM is a nickname for whatever +implementation we are currently targeting for. + + +\item[compiler] hides the algorithms used to map Lisp semantics onto the +operations supplied by the VM. Exports the mechanisms used for defining the +VM. All the VM-independent code in the compiler, partially hiding the compiler +intermediate representations. Uses KERNEL. + +\item[eval] holds code that does direct execution of the compiler's ICR. Uses +KERNEL, COMPILER. Exports debugger interface to interpreted code. + +\item[debug-internals] presents a reasonable, unified interface to +manipulation of the state of both compiled and interpreted code. (could be in +KERNEL) Uses VM, INTERPRETER, EVAL, KERNEL. + +\item[debug] holds the standard debugger, and exports the debugger +\end{description} + +\chapter{System Building} + +It's actually rather easy to build a CMU CL core with exactly what you want in +it. But to do this you need two things: the source and a working CMU CL. + +Basically, you use the working copy of CMU CL to compile the sources, +then run a process call ``genesis'' which builds a ``kernel'' core. +You then load whatever you want into this kernel core, and save it. + +In the \verb|tools/| directory in the sources there are several files that +compile everything, and build cores, etc. The first step is to compile the C +startup code. + +{\bf Note:} {\it the various scripts mentioned below have hard-wired paths in +them set up for our directory layout here at CMU. Anyone anywhere else will +have to edit them before they will work.} + +\section{Compiling the C Startup Code} + +There is a circular dependancy between lisp/internals.h and lisp/lisp.map that +causes bootstrapping problems. The easiest way to get around this problem +is to make a fake lisp.nm file that has nothing in it but a version number: + +\begin{verbatim} + % echo "Map file for lisp version 0" > lisp.nm +\end{verbatim} +and then run genesis with NIL for the list of files: +\begin{verbatim} + * (load ".../compiler/generic/new-genesis") ; compile before loading + * (lisp::genesis nil ".../lisp/lisp.nm" "/dev/null" + ".../lisp/lisp.map" ".../lisp/lisp.h") +\end{verbatim} +It will generate +a whole bunch of warnings about things being undefined, but ignore +that, because it will also generate a correct lisp.h. You can then +compile lisp producing a correct lisp.map: +\begin{verbatim} + % make +\end{verbatim} +and then use \verb|tools/do-worldbuild| and \verb|tools/mk-lisp| to build +\verb|kernel.core| and \verb|lisp.core| (see section \ref{building-cores}.) + +\section{Compiling the Lisp Code} + +The \verb|tools| directory contains various lisp and C-shell utilities for +building CMU CL: +\begin{description} +\item[compile-all*] Will compile lisp files and build a kernel core. It has +numerous command-line options to control what to compile and how. Try -help to +see a description. It runs a separate Lisp process to compile each +subsystem. Error output is generated in files with ``{\tt .log}'' extension in +the root of the build area. + +\item[setup.lisp] Some lisp utilities used for compiling changed files in batch +mode and collecting the error output. Sort of a crude defsystem. Loads into the +``user'' package. See {\tt with-compiler-log-file} and {\tt comf}. + +\item[{\it foo}com.lisp] Each system has a ``\verb|.lisp|'' file in +\verb|tools/| which compiles that system. +\end{description} + +\section{Building Core Images} +\label{building-cores} +Both the kernel and final core build are normally done using shell script +drivers: +\begin{description} +\item[do-worldbuild*] Builds a kernel core for the current machine. The +version to build is indicated by an optional argument, which defaults to +``alpha''. The \verb|kernel.core| file is written either in the \verb|lisp/| +directory in the build area, or in \verb|/usr/tmp/|. The directory which +already contains \verb|kernel.core| is chosen. You can create a dummy version +with e.g. ``touch'' to select the initial build location. + +\item[mk-lisp*] Builds a full core, with conditional loading of subsystems. +The version is the first argument, which defaults to ``alpha''. Any additional +arguments are added to the \verb|*features*| list, which controls system +loading (among other things.) The \verb|lisp.core| file is written in the +current working directory. +\end{description} + +These scripts load Lisp command files. When \verb|tools/worldbuild.lisp| is +loaded, it calls genesis with the correct arguments to build a kernel core. +Similarly, \verb|worldload.lisp| +builds a full core. Adding certain symbols to \verb|*features*| before +loading worldload.lisp suppresses loading of different parts of the +system. These symbols are: +\begin{description} +\item[:no-compiler] don't load the compiler. +\item[:no-clx] don't load CLX. +\item[:no-clm] don't load CLM. +\item[:no-hemlock] don't load Hemlock. +\item[:no-pcl] don't load PCL. +\item[:runtime] build a runtime code, implies all of the above, and then some. +\end{description} + +Note: if you don't load the compiler, you can't (successfully) load the +pretty-printer or pcl. And if you compiled hemlock with CLX loaded, you can't +load it without CLX also being loaded. + +These features are only used during the worldload process; they are +not propagated to the generated \verb|lisp.core| file. diff --git a/doc/internals/cmu/back.tex b/doc/internals/cmu/back.tex new file mode 100644 index 0000000000..d63f02bf49 --- /dev/null +++ b/doc/internals/cmu/back.tex @@ -0,0 +1,728 @@ +% -*- Dictionary: design -*- + +\chapter{Copy propagation} + +File: {\tt copyprop} + +This phase is optional, but should be done whenever speed or space is more +important than compile speed. We use global flow analysis to find the reaching +definitions for each TN. This information is used here to eliminate +unnecessary TNs, and is also used later on by loop invariant optimization. + +In some cases, VMR conversion will unnecessarily copy the value of a TN into +another TN, since it may not be able to tell that the initial TN has the same +value at the time the second TN is referenced. This can happen when ICR +optimize is unable to eliminate a trivial variable binding, or when the user +does a setq, or may also result from creation of expression evaluation +temporaries during VMR conversion. Whatever the cause, we would like to avoid +the unnecessary creation and assignment of these TNs. + +What we do is replace TN references whose only reaching definition is a Move +VOP with a reference to the TN moved from, and then delete the Move VOP if the +copy TN has no remaining references. There are several restrictions on copy +propagation: +\begin{itemize} +\item The TNs must be ``ordinary'' TNs, not restricted or otherwise +unusual. Extending the life of restricted (or wired) TNs can make register +allocation impossible. Some other TN kinds have hidden references. + +\item We don't want to defeat source-level debugging by replacing named +variables with anonymous temporaries. + +\item We can't delete moves that representation selected might want to change +into a representation conversion, since we need the primitive types of both TNs +to select a conversion. +\end{itemize} + +Some cleverness reduces the cost of flow analysis. As for lifetime analysis, +we only need to do flow analysis on global packed TNs. We can't do the real +local TN assignment pass before this, since we allocate TNs afterward, so we do +a pre-pass that marks the TNs that are local for our purposes. We don't care +if block splitting eventually causes some of them to be considered global. + +Note also that we are really only interested in knowing if there is a +unique reaching definition, which we can mash into our flow analysis rules by +doing an intersection. Then a definition only appears in the set when it is +unique. We then propagate only definitions of TNs with only one write, which +allows the TN to stand for the definition. + + +\chapter{Representation selection} + +File: {\tt represent} + +Some types of object (such as {\tt single-float}) have multiple possible +representations. Multiple representations are useful mainly when there is a +particularly efficient non-descriptor representation. In this case, there is +the normal descriptor representation, and an alternate non-descriptor +representation. + +This possibility brings up two major issues: +\begin{itemize} +\item The compiler must decide which representation will be most efficient for +any given value, and + +\item Representation conversion code must be inserted where the representation +of a value is changed. +\end{itemize} +First, the representations for TNs are selected by examining all the TN +references and attempting to minimize reference costs. Then representation +conversion code is introduced. + +This phase is in effect a pre-pass to register allocation. The main reason for +its existence is that representation conversions may be farily complex (e.g. +involving memory allocation), and thus must be discovered before register +allocation. + + +VMR conversion leaves stubs for representation specific move operations. +Representation selection recognizes {\tt move} by name. Argument and return +value passing for call VOPs is controlled by the {\tt :move-arguments} option +to {\tt define-vop}. + +Representation selection is also responsible for determining what functions use +the number stack. If any representation is chosen which could involve packing +into the {\tt non-descriptor-stack} SB, then we allocate the NFP register +throughout the component. As an optimization, permit the decision of whether a +number stack frame needs to be allocated to be made on a per-function basis. +If a function doesn't use the number stack, and isn't in the same tail-set as +any function that uses the number stack, then it doesn't need a number stack +frame, even if other functions in the component do. + + +\chapter{Lifetime analysis} + +File: {\tt life} + +This phase is a preliminary to Pack. It involves three passes: + -- A pre-pass that computes the DEF and USE sets for live TN analysis, while + also assigning local TN numbers, splitting blocks if necessary. \#\#\# But +not really... + -- A flow analysis pass that does backward flow analysis on the + component to find the live TNs at each block boundary. + -- A post-pass that finds the conflict set for each TN. + +\#| +Exploit the fact that a single VOP can only exhaust LTN numbers when there are +large more operands. Since more operand reference cannot be interleaved with +temporary reference, the references all effectively occur at the same time. +This means that we can assign all the more args and all the more results the +same LTN number and the same lifetime info. +|\# + + +\section{Flow analysis} + +It seems we could use the global-conflicts structures during compute the +inter-block lifetime information. The pre-pass creates all the +global-conflicts for blocks that global TNs are referenced in. The flow +analysis pass just adds always-live global-conflicts for the other blocks the +TNs are live in. In addition to possibly being more efficient than SSets, this +would directly result in the desired global-conflicts information, rather than +having to create it from another representation. + +The DFO sorted per-TN global-conflicts thread suggests some kind of algorithm +based on the manipulation of the sets of blocks each TN is live in (which is +what we really want), rather than the set of TNs live in each block. + +If we sorted the per-TN global-conflicts in reverse DFO (which is just as good +for determining conflicts between TNs), then it seems we could scan though the +conflicts simultaneously with our flow-analysis scan through the blocks. + +The flow analysis step is the following: + If a TN is always-live or read-before-written in a successor block, then we + make it always-live in the current block unless there are already + global-conflicts recorded for that TN in this block. + +The iteration terminates when we don't add any new global-conflicts during a +pass. + +We may also want to promote TNs only read within a block to always-live when +the TN is live in a successor. This should be easy enough as long as the +global-conflicts structure contains this kind of info. + +The critical operation here is determining whether a given global TN has global +conflicts in a given block. Note that since we scan the blocks in DFO, and the +global-conflicts are sorted in DFO, if we give each global TN a pointer to the +global-conflicts for the last block we checked the TN was in, then we can +guarantee that the global-conflicts we are looking for are always at or after +that pointer. If we need to insert a new structure, then the pointer will help +us rapidly find the place to do the insertion.] + + +\section{Conflict detection} + +[\#\#\# Environment, :more TNs.] + +This phase makes use of the results of lifetime analysis to find the set of TNs +that have lifetimes overlapping with those of each TN. We also annotate call +VOPs with information about the live TNs so that code generation knows which +registers need to be saved. + +The basic action is a backward scan of each block, looking at each TN-Ref and +maintaining a set of the currently live TNs. When we see a read, we check if +the TN is in the live set. If not, we: + -- Add the TN to the conflict set for every currently live TN, + -- Union the set of currently live TNs with the conflict set for the TN, and + -- Add the TN to the set of live TNs. + +When we see a write for a live TN, we just remove it from the live set. If we +see a write to a dead TN, then we update the conflicts sets as for a read, but +don't add the TN to the live set. We have to do this so that the bogus write +doesn't clobber anything. + +[We don't consider always-live TNs at all in this process, since the conflict +of always-live TNs with other TNs in the block is implicit in the +global-conflicts structures. + +Before we do the scan on a block, we go through the global-conflicts structures +of TNs that change liveness in the block, assigning the recorded LTN number to +the TN's LTN number for the duration of processing of that block.] + + +Efficiently computing and representing this information calls for some +cleverness. It would be prohibitively expensive to represent the full conflict +set for every TN with sparse sets, as is done at the block-level. Although it +wouldn't cause non-linear behavior, it would require a complex linked structure +containing tens of elements to be created for every TN. Fortunately we can +improve on this if we take into account the fact that most TNs are ``local'' TNs: +TNs which have all their uses in one block. + +First, many global TNs will be either live or dead for the entire duration of a +given block. We can represent the conflict between global TNs live throughout +the block and TNs local to the block by storing the set of always-live global +TNs in the block. This reduces the number of global TNs that must be +represented in the conflicts for local TNs. + +Second, we can represent conflicts within a block using bit-vectors. Each TN +that changes liveness within a block is assigned a local TN number. Local +conflicts are represented using a fixed-size bit-vector of 64 elements or so +which has a 1 for the local TN number of every TN live at that time. The block +has a simple-vector which maps from local TN numbers to TNs. Fixed-size +vectors reduce the hassle of doing allocations and allow operations to be +open-coded in a maximally tense fashion. + +We can represent the conflicts for a local TN by a single bit-vector indexed by +the local TN numbers for that block, but in the global TN case, we need to be +able to represent conflicts with arbitrary TNs. We could use a list-like +sparse set representation, but then we would have to either special-case global +TNs by using the sparse representation within the block, or convert the local +conflicts bit-vector to the sparse representation at the block end. Instead, +we give each global TN a list of the local conflicts bit-vectors for each block +that the TN is live in. If the TN is always-live in a block, then we record +that fact instead. This gives us a major reduction in the amount of work we +have to do in lifetime analysis at the cost of some increase in the time to +iterate over the set during Pack. + +Since we build the lists of local conflict vectors a block at a time, the +blocks in the lists for each TN will be sorted by the block number. The +structure also contains the local TN number for the TN in that block. These +features allow pack to efficiently determine whether two arbitrary TNs +conflict. You just scan the lists in order, skipping blocks that are in only +one list by using the block numbers. When we find a block that both TNs are +live in, we just check the local TN number of one TN in the local conflicts +vector of the other. + +In order to do these optimizations, we must do a pre-pass that finds the +always-live TNs and breaks blocks up into small enough pieces so that we don't +run out of local TN numbers. If we can make a block arbitrarily small, then we +can guarantee that an arbitrarily small number of TNs change liveness within +the block. We must be prepared to make the arguments to unbounded arg count +VOPs (such as function call) always-live even when they really aren't. This is +enabled by a panic mode in the block splitter: if we discover that the block +only contains one VOP and there are still too many TNs that aren't always-live, +then we promote the arguments (which we'd better be able to do...). + +This is done during the pre-scan in lifetime analysis. We can do this because +all TNs that change liveness within a block can be found by examining that +block: the flow analysis only adds always-live TNs. + + +When we are doing the conflict detection pass, we set the LTN number of global +TNs. We can easily detect global TNs that have not been locally mapped because +this slot is initially null for global TNs and we null it out after processing +each block. We assign all Always-Live TNs to the same local number so that we +don't need to treat references to them specially when making the scan. + +We also annotate call VOPs that do register saving with the TNs that are live +during the call, and thus would need to be saved if they are packed in +registers. + +We adjust the costs for TNs that need to be saved so that TNs costing more to +save and restore than to reference get packed on the stack. We would also like +more often saved TNs to get higher costs so that they are packed in more +savable locations. + + +\chapter{Packing} + +File: {\tt pack} + +\#| + +Add lifetime/pack support for pre-packed save TNs. + +Fix GTN/VMR conversion to use pre-packed save TNs for old-cont and return-PC. +(Will prevent preference from passing location to save location from ever being +honored?) + +We will need to make packing of passing locations smarter before we will be +able to target the passing location on the stack in a tail call (when that is +where the callee wants it.) Currently, we will almost always pack the passing +location in a register without considering whether that is really a good idea. +Maybe we should consider schemes that explicitly understand the parallel +assignment semantics, and try to do the assignment with a minimum number of +temporaries. We only need assignment temps for TNs that appear both as an +actual argument value and as a formal parameter of the called function. This +only happens in self-recursive functions. + +Could be a problem with lifetime analysis, though. The write by a move-arg VOP +would look like a write in the current env, when it really isn't. If this is a +problem, then we might want to make the result TN be an info arg rather than a +real operand. But this would only be a problem in recursive calls, anyway. +[This would prevent targeting, but targeting across passing locations rarely +seems to work anyway.] [\#\#\# But the :ENVIRONMENT TN mechanism would get +confused. Maybe put env explicitly in TN, and have it only always-live in that +env, and normal in other envs (or blocks it is written in.) This would allow +targeting into environment TNs. + +I guess we would also want the env/PC save TNs normal in the return block so +that we can target them. We could do this by considering env TNs normal in +read blocks with no successors. + +ENV TNs would be treated totally normally in non-env blocks, so we don't have +to worry about lifetime analysis getting confused by variable initializations. +Do some kind of TN costing to determine when it is more trouble than it is +worth to allocate TNs in registers. + +Change pack ordering to be less pessimal. Pack TNs as they are seen in the LTN +map in DFO, which at least in non-block compilations has an effect something +like packing main trace TNs first, since control analysis tries to put the good +code first. This could also reduce spilling, since it makes it less likely we +will clog all registers with global TNs. + +If we pack a TN with a specified save location on the stack, pack in the +specified location. + +Allow old-cont and return-pc to be kept in registers by adding a new ``keep +around'' kind of TN. These are kind of like environment live, but are only +always-live in blocks that they weren't referenced in. Lifetime analysis does +a post-pass adding always-live conflicts for each ``keep around'' TN to those +blocks with no conflict for that TN. The distinction between always-live and +keep-around allows us to successfully target old-cont and return-pc to passing +locations. MAKE-KEEP-AROUND-TN (ptype), PRE-PACK-SAVE-TN (tn scn offset). +Environment needs a KEEP-AROUND-TNS slot so that conflict analysis can find +them (no special casing is needed after then, they can be made with :NORMAL +kind). VMR-component needs PRE-PACKED-SAVE-TNS so that conflict analysis or +somebody can copy conflict info from the saved TN. + + + +Note that having block granularity in the conflict information doesn't mean +that a localized packing scheme would have to do all moves at block boundaries +(which would clash with the desire to have saving done as part of this +mechanism.) All that it means is that if we want to do a move within the +block, we would need to allocate both locations throughout that block (or +something). + + + + + +Load TN pack: + +A location is out for load TN packing if: + +The location has TN live in it after the VOP for a result, or before the VOP +for an argument, or + +The location is used earlier in the TN-ref list (after) the saved results ref +or later in the TN-Ref list (before) the loaded argument's ref. + +To pack load TNs, we advance the live-tns to the interesting VOP, then +repeatedly scan the vop-refs to find vop-local conflicts for each needed load +TN. We insert move VOPs and change over the TN-Ref-TNs as we go so the TN-Refs +will reflect conflicts with already packed load-TNs. + +If we fail to pack a load-TN in the desired SC, then we scan the Live-TNs for +the SB, looking for a TN that can be packed in an unbounded SB. This TN must +then be repacked in the unbounded SB. It is important the load-TNs are never +packed in unbounded SBs, since that would invalidate the conflicts info, +preventing us from repacking TNs in unbounded SBs. We can't repack in a finite +SB, since there might have been load TNs packed in that SB which aren't +represented in the original conflict structures. + +Is it permissible to ``restrict'' an operand to an unbounded SC? Not impossible +to satisfy as long as a finite SC is also allowed. But in practice, no +restriction would probably be as good. + +We assume all locations can be used when an sc is based on an unbounded sb. + +] + + +TN-Refs are convenient structures to build the target graph out of. If we +allocated space in every TN-Ref, then there would certainly be enough to +represent arbitrary target graphs. Would it be enough to allocate a single +Target slot? If there is a target path through a given VOP, then the Target of +the write ref would be the read, and vice-versa. To find all the TNs that +target us, we look at the TN for the target of all our write refs. + +We separately chain together the read refs and the write refs for a TN, +allowing easy determination of things such as whether a TN has only a single +definition or has no reads. It would also allow easier traversal of the target +graph. + +Represent per-location conflicts as vectors indexed by block number of +per-block conflict info. To test whether a TN conflicts on a location, we +would then have to iterate over the TNs global-conflicts, using the block +number and LTN number to check for a conflict in that block. But since most +TNs are local, this test actually isn't much more expensive than indexing into +a bit-vector by GTN numbers. + +The big win of this scheme is that it is much cheaper to add conflicts into the +conflict set for a location, since we never need to actually compute the +conflict set in a list-like representation (which requires iterating over the +LTN conflicts vectors and unioning in the always-live TNs). Instead, we just +iterate over the global-conflicts for the TN, using BIT-IOR to combine the +conflict set with the bit-vector for that block in that location, or marking +that block/location combination as being always-live if the conflict is +always-live. + +Generating the conflict set is inherently more costly, since although we +believe the conflict set size to be roughly constant, it can easily contain +tens of elements. We would have to generate these moderately large lists for +all TNs, including local TNs. In contrast, the proposed scheme does work +proportional to the number of blocks the TN is live in, which is small on +average (1 for local TNs). This win exists independently from the win of not +having to iterate over LTN conflict vectors. + + +[\#\#\# Note that since we never do bitwise iteration over the LTN conflict +vectors, part of the motivation for keeping these a small fixed size has been +removed. But it would still be useful to keep the size fixed so that we can +easily recycle the bit-vectors, and so that we could potentially have maximally +tense special primitives for doing clear and bit-ior on these vectors.] + +This scheme is somewhat more space-intensive than having a per-location +bit-vector. Each vector entry would be something like 150 bits rather than one +bit, but this is mitigated by the number of blocks being 5-10x smaller than the +number of TNs. This seems like an acceptable overhead, a small fraction of the +total VMR representation. + +The space overhead could also be reduced by using something equivalent to a +two-dimensional bit array, indexed first by LTN numbers, and then block numbers +(instead of using a simple-vector of separate bit-vectors.) This would +eliminate space wastage due to bit-vector overheads, which might be 50% or +more, and would also make efficient zeroing of the vectors more +straightforward. We would then want efficient operations for OR'ing LTN +conflict vectors with rows in the array. + +This representation also opens a whole new range of allocation algorithms: ones +that store allocate TNs in different locations within different portions of the +program. This is because we can now represent a location being used to hold a +certain TN within an arbitrary subset of the blocks the TN is referenced in. + + + + + + + + + +Pack goals: + +Pack should: + +Subject to resource constraints: + -- Minimize use costs + -- ``Register allocation'' + Allocate as many values as possible in scarce ``good'' locations, + attempting to minimize the aggregate use cost for the entire program. + -- ``Save optimization'' + Don't allocate values in registers when the save/restore costs exceed + the expected gain for keeping the value in a register. (Similar to + ``opening costs'' in RAOC.) [Really just a case of representation + selection.] + + -- Minimize preference costs + Eliminate as many moves as possible. + + +``Register allocation'' is basically an attempt to eliminate moves between +registers and memory. ``Save optimization'' counterbalances ``register +allocation'' to prevent it from becoming a pessimization, since saves can +introduce register/memory moves. + +Preference optimization reduces the number of moves within an SC. Doing a good +job of honoring preferences is important to the success of the compiler, since +we have assumed in many places that moves will usually be optimized away. + +The scarcity-oriented aspect of ``register allocation'' is handled by a greedy +algorithm in pack. We try to pack the ``most important'' TNs first, under the +theory that earlier packing is more likely to succeed due to fewer constraints. + +The drawback of greedy algorithms is their inability to look ahead. Packing a +TN may mess up later ``register allocation'' by precluding packing of TNs that +are individually ``less important,'' but more important in aggregate. Packing a +TN may also prevent preferences from being honored. + + + +Initial packing: + + +Pack all TNs restricted to a finite SC first, before packing any other TNs. + +One might suppose that Pack would have to treat TNs in different environments +differently, but this is not the case. Pack simply assigns TNs to locations so +that no two conflicting TNs are in the same location. In the process of +implementing call semantics in conflict analysis, we cause TNs in different +environments not to conflict. In the case of passing TNs, cross environment +conflicts do exist, but this reflects reality, since the passing TNs are +live in both the caller and the callee. Environment semantics has already been +implemented at this point. + +This means that Pack can pack all TNs simultaneously, using one data structure +to represent the conflicts for each location. So we have only one conflict set +per SB location, rather than separating this information by environment. + + +Load TN packing: + +We create load TNs as needed in a post-pass to the initial packing. After TNs +are packed, it may be that some references to a TN will require it to be in a +SC other than the one it was packed in. We create load-TNs and pack them on +the fly during this post-pass. + +What we do is have an optional SC restriction associated with TN-refs. If we +pack the TN in an SC which is different from the required SC for the reference, +then we create a TN for each such reference, and pack it into the required SC. + +In many cases we will be able to pack the load TN with no hassle, but in +general we may need to spill a TN that has already been packed. We choose a +TN that isn't in use by the offending VOP, and then spill that TN onto the +stack for the duration of that VOP. If the VOP is a conditional, then we must +insert a new block interposed before the branch target so that the TN +value is restored regardless of which branch is taken. + +Instead of remembering lifetime information from conflict analysis, we rederive +it. We scan each block backward while keeping track of which locations have +live TNs in them. When we find a reference that needs a load TN packed, we try +to pack it in an unused location. If we can't, we unpack the currently live TN +with the lowest cost and force it into an unbounded SC. + +The per-location and per-TN conflict information used by pack doesn't +need to be updated when we pack a load TN, since we are done using those data +structures. + +We also don't need to create any TN-Refs for load TNs. [??? How do we keep +track of load-tn lifetimes? It isn't really that hard, I guess. We just +remember which load TNs we created at each VOP, killing them when we pass the +loading (or saving) step. This suggests we could flush the Refs thread if we +were willing to sacrifice some flexibility in explicit temporary lifetimes. +Flushing the Refs would make creating the VMR representation easier.] + +The lifetime analysis done during load-TN packing doubles as a consistency +check. If we see a read of a TN packed in a location which has a different TN +currently live, then there is a packing bug. If any of the TNs recorded as +being live at the block beginning are packed in a scarce SB, but aren't current +in that location, then we also have a problem. + +The conflict structure for load TNs is fairly simple, the load TNs for +arguments and results all conflict with each other, and don't conflict with +much else. We just try packing in targeted locations before trying at random. + + + +\chapter{Code generation} + +This is fairly straightforward. We translate VOPs into instruction sequences +on a per-block basis. + +After code generation, the VMR representation is gone. Everything is +represented by the assembler data structures. + + +\chapter{Assembly} + +In effect, we do much of the work of assembly when the compiler is compiled. + +The assembler makes one pass fixing up branch offsets, then squeezes out the +space left by branch shortening and dumps out the code along with the load-time +fixup information. The assembler also deals with dumping unboxed non-immediate +constants and symbols. Boxed constants are created by explicit constructor +code in the top-level form, while immediate constants are generated using +inline code. + +[\#\#\# The basic output of the assembler is: + A code vector + A representation of the fixups along with indices into the code vector for + the fixup locations + A PC map translating PCs into source paths + +This information can then be used to build an output file or an in-core +function object. +] + +The assembler is table-driven and supports arbitrary instruction formats. As +far as the assembler is concerned, an instruction is a bit sequence that is +broken down into subsequences. Some of the subsequences are constant in value, +while others can be determined at assemble or load time. + +\begin{verbatim} +Assemble Node Form* + Allow instructions to be emitted during the evaluation of the Forms by + defining Inst as a local macro. This macro caches various global + information in local variables. Node tells the assembler what node + ultimately caused this code to be generated. This is used to create the + pc=>source map for the debugger. + +Assemble-Elsewhere Node Form* + Similar to Assemble, but the current assembler location is changed to + somewhere else. This is useful for generating error code and similar + things. Assemble-Elsewhere may not be nested. + +Inst Name Arg* + Emit the instruction Name with the specified arguments. + +Gen-Label +Emit-Label (Label) + Gen-Label returns a Label object, which describes a place in the code. + Emit-Label marks the current position as being the location of Label. +\end{verbatim} + + + +\chapter{Dumping} + +So far as input to the dumper/loader, how about having a list of Entry-Info +structures in the VMR-Component? These structures contain all information +needed to dump the associated function objects, and are only implicitly +associated with the functional/XEP data structures. Load-time constants that +reference these function objects should specify the Entry-Info, rather than the +functional (or something). We would then need to maintain some sort of +association so VMR conversion can find the appropriate Entry-Info. +Alternatively, we could initially reference the functional, and then later +clobber the reference to the Entry-Info. + +We have some kind of post-pass that runs after assembly, going through the +functions and constants, annotating the VMR-Component for the benefit of the +dumper: + Resolve :Label load-time constants. + Make the debug info. + Make the entry-info structures. + +Fasl dumper and in-core loader are implementation (but not instruction set) +dependent, so we want to give them a clear interface. + +\begin{verbatim} +open-fasl-file name => fasl-file + Returns a ``fasl-file'' object representing all state needed by the dumper. + We objectify the state, since the fasdumper should be reentrant. (but + could fail to be at first.) + +close-fasl-file fasl-file abort-p + Close the specified fasl-file. + +fasl-dump-component component code-vector length fixups fasl-file + Dump the code, constants, etc. for component. Code-Vector is a vector + holding the assembled code. Length is the number of elements of Vector + that are actually in use. Fixups is a list of conses (offset . fixup) + describing the locations and things that need to be fixed up at load time. + If the component is a top-level component, then the top-level lambda will + be called after the component is loaded. + +load-component component code-vector length fixups + Like Fasl-Dump-Component, but directly installs the code in core, running + any top-level code immediately. (???) but we need some way to glue + together the componenents, since we don't have a fasl table. +\end{verbatim} + + + +Dumping: + +Dump code for each component after compiling that component, but defer dumping +of other stuff. We do the fixups on the code vectors, and accumulate them in +the table. + +We have to grovel the constants for each component after compiling that +component so that we can fix up load-time constants. Load-time constants are +values needed by the code that are computed after code generation/assembly +time. Since the code is fixed at this point, load-time constants are always +represented as non-immediate constants in the constant pool. A load-time +constant is distinguished by being a cons (Kind . What), instead of a Constant +leaf. Kind is a keyword indicating how the constant is computed, and What is +some context. + +Some interesting load-time constants: +\begin{verbatim} + (:label . <label>) + Is replaced with the byte offset of the label within the code-vector. + + (:code-vector . <component>) + Is replaced by the component's code-vector. + + (:entry . <function>) + (:closure-entry . <function>) + Is replaced by the function-entry structure for the specified function. + :Entry is how the top-level component gets a handle on the function + definitions so that it can set them up. +\end{verbatim} +We also need to remember the starting offset for each entry, although these +don't in general appear as explicit constants. + +We then dump out all the :Entry and :Closure-Entry objects, leaving any +constant-pool pointers uninitialized. After dumping each :Entry, we dump some +stuff to let genesis know that this is a function definition. Then we dump all +the constant pools, fixing up any constant-pool pointers in the already-dumped +function entry structures. + +The debug-info *is* a constant: the first constant in every constant pool. But +the creation of this constant must be deferred until after the component is +compiled, so we leave a (:debug-info) placeholder. [Or maybe this is +implicitly added in by the dumper, being supplied in a VMR-component slot.] + + + Work out details of the interface between the back-end and the + assembler/dumper. + + Support for multiple assemblers concurrently loaded? (for byte code) + + We need various mechanisms for getting information out of the assembler. + + We can get entry PCs and similar things into function objects by making a + Constant leaf, specifying that it goes in the closure, and then + setting the value after assembly. + + We have an operation Label-Value which can be used to get the value of a + label after assembly and before the assembler data structures are + deallocated. + + The function map can be constructed without any special help from the + assembler. Codegen just has to note the current label when the function + changes from one block to the next, and then use the final value of these + labels to make the function map. + + Probably we want to do the source map this way too. Although this will + make zillions of spurious labels, we would have to effectively do that + anyway. + + With both the function map and the source map, getting the locations right + for uses of Elsewhere will be a bit tricky. Users of Elsewhere will need + to know about how these maps are being built, since they must record the + labels and corresponding information for the elsewhere range. It would be + nice to have some cooperation from Elsewhere so that this isn't necessary, + otherwise some VOP writer will break the rules, resulting in code that is + nowhere. + + The Debug-Info and related structures are dumped by consing up the + structure and making it be the value of a constant. + + Getting the code vector and fixups dumped may be a bit more interesting. I + guess we want a Dump-Code-Vector function which dumps the code and fixups + accumulated by the current assembly, returning a magic object that will + become the code vector when it is dumped as a constant. +] diff --git a/doc/internals/cmu/compiler-overview.tex b/doc/internals/cmu/compiler-overview.tex new file mode 100644 index 0000000000..64b086bdc8 --- /dev/null +++ b/doc/internals/cmu/compiler-overview.tex @@ -0,0 +1,550 @@ +\chapter{Compiler Overview} % -*- Dictionary: design -*- + +The structure of the compiler may be broadly characterized by describing the +compilation phases and the data structures that they manipulate. The steps in +the compilation are called phases rather than passes since they don't +necessarily involve a full pass over the code. The data structure used to +represent the code at some point is called an {\it intermediate +representation.} + +Two major intermediate representations are used in the compiler: +\begin{itemize} + +\item The Implicit Continuation Representation (ICR) represents the lisp-level +semantics of the source code during the initial phases. Partial evaluation and +semantic analysis are done on this representation. ICR is roughly equivalent +to a subset of Common Lisp, but is represented as a flow-graph rather than a +syntax tree. Phases which only manipulate ICR comprise the ``front end''. It +would be possible to use a different back end such as one that directly +generated code for a stack machine. + +\item The Virtual Machine Representation (VMR) represents the implementation of +the source code on a virtual machine. The virtual machine may vary depending +on the the target hardware, but VMR is sufficiently stylized that most of the +phases which manipulate it are portable. +\end{itemize} + +Each phase is briefly described here. The phases from ``local call analysis'' +to ``constraint propagation'' all interact; for maximum optimization, they +are generally repeated until nothing new is discovered. The source files which +primarily contain each phase are listed after ``Files: ''. +\begin{description} + +\item[ICR conversion] +Convert the source into ICR, doing macroexpansion and simple source-to-source +transformation. All names are resolved at this time, so we don't have to worry +about name conflicts later on. Files: {\tt ir1tran, srctran, typetran} + +\item[Local call analysis] Find calls to local functions and convert them to +local calls to the correct entry point, doing keyword parsing, etc. Recognize +once-called functions as lets. Create {\it external entry points} for +entry-point functions. Files: {\tt locall} + +\item[Find components] +Find flow graph components and compute depth-first ordering. Separate +top-level code from run-time code, and determine which components are top-level +components. Files: {\tt dfo} + +\item[ICR optimize] A grab-bag of all the non-flow ICR optimizations. Fold +constant functions, propagate types and eliminate code that computes unused +values. Special-case calls to some known global functions by replacing them +with a computed function. Merge blocks and eliminate IF-IFs. Substitute let +variables. Files: {\tt ir1opt, ir1tran, typetran, seqtran, vm/vm-tran} + +\item[Type constraint propagation] +Use global flow analysis to propagate information about lexical variable +types. Eliminate unnecessary type checks and tests. Files: {\tt constraint} + +\item[Type check generation] +Emit explicit ICR code for any necessary type checks that are too complex to be +easily generated on the fly by the back end. Files: {\tt checkgen} + +\item[Event driven operations] +Various parts of ICR are incrementally recomputed, either eagerly on +modification of the ICR, or lazily, when the relevant information is needed. +\begin{itemize} +\item Check that type assertions are satisfied, marking places where type +checks need to be done. + +\item Locate let calls. + +\item Delete functions and variables with no references +\end{itemize} +Files: {\tt ir1util}, {\tt ir1opt} + +\item[ICR finalize] +This phase is run after all components have been compiled. It scans the +global variable references, looking for references to undefined variables +and incompatible function redefinitions. Files: {\tt ir1final}, {\tt main}. + +\item[Environment analysis] +Determine which distinct environments need to be allocated, and what +context needed to be closed over by each environment. We detect non-local +exits and set closure variables. We also emit cleanup code as funny +function calls. This is the last pure ICR pass. Files: {\tt envanal} + +\item[Global TN allocation (GTN)] +Iterate over all defined functions, determining calling conventions +and assigning TNs to local variables. Files: {\tt gtn} + +\item[Local TN allocation (LTN)] +Use type and policy information to determine which VMR translation to use +for known functions, and then create TNs for expression evaluation +temporaries. We also accumulate some random information needed by VMR +conversion. Files: {\tt ltn} + +\item[Control analysis] +Linearize the flow graph in a way that minimizes the number of branches. The +block-level structure of the flow graph is basically frozen at this point. +Files: {\tt control} + +\item[Stack analysis] +Maintain stack discipline for unknown-values continuation in the presence +of local exits. Files: {\tt stack} + +\item[Entry analysis] +Collect some back-end information for each externally callable function. + +\item[VMR conversion] Convert ICR into VMR by translating nodes into VOPs. +Emit type checks. Files: {\tt ir2tran, vmdef} + +\item[Copy propagation] Use flow analysis to eliminate unnecessary copying of +TN values. Files: {\tt copyprop} + +\item[Representation selection] +Look at all references to each TN to determine which representation has the +lowest cost. Emit appropriate move and coerce VOPS for that representation. + +\item[Lifetime analysis] +Do flow analysis to find the set of TNs whose lifetimes +overlap with the lifetimes of each TN being packed. Annotate call VOPs with +the TNs that need to be saved. Files: {\tt life} + +\item[Pack] +Find a legal register allocation, attempting to minimize unnecessary moves. +Files: {\tt pack} + +\item[Code generation] +Call the VOP generators to emit assembly code. Files: {\tt codegen} + +\item[Pipeline reorganization] On some machines, move memory references +backward in the code so that they can overlap with computation. On machines +with delayed branch instructions, locate instructions that can be moved into +delay slots. Files: {\tt assem-opt} + +\item[Assembly] +Resolve branches and convert into object code and fixup information. +Files: {\tt assembler} + +\item[Dumping] Convert the compiled code into an object file or in-core +function. Files: {\tt debug-dump}, {\tt dump}, {\tt vm/core} + +\end{description} + +\chapter{The Implicit Continuation Representation} + +The set of special forms recognized is exactly that specified in the Common +Lisp manual. Everything that is described as a macro in CLTL is a macro. + +Large amounts of syntactic information are thrown away by the conversion to an +anonymous flow graph representation. The elimination of names eliminates the +need to represent most environment manipulation special forms. The explicit +representation of control eliminates the need to represent BLOCK and GO, and +makes flow analysis easy. The full Common Lisp LAMBDA is implemented with a +simple fixed-arg lambda, which greatly simplifies later code. + +The elimination of syntactic information eliminates the need for most of the +``beta transformation'' optimizations in Rabbit. There are no progns, no +tagbodys and no returns. There are no ``close parens'' which get in the way of +determining which node receives a given value. + +In ICR, computation is represented by Nodes. These are the node types: +\begin{description} +\item[if] Represents all conditionals. + +\item[set] Represents a {\tt setq}. + +\item[ref] Represents a constant or variable reference. + +\item[combination] Represents a normal function call. + +\item[MV-combination] Represents a {\tt multiple-value-call}. This is used to +implement all multiple value receiving forms except for {\tt +multiple-value-prog1}, which is implicit. + +\item[bind] +This represents the allocation and initialization of the variables in +a lambda. + +\item[return] +This collects the return value from a lambda and represents the +control transfer on return. + +\item[entry] Marks the start of a dynamic extent that can have non-local exits +to it. Dynamic state can be saved at this point for restoration on re-entry. + +\item[exit] Marks a potentially non-local exit. This node is interposed +between the non-local uses of a continuation and the {\tt dest} so that code to +do a non-local exit can be inserted if necessary. +\end{description} + +Some slots are shared between all node types (via defstruct inheritance.) This +information held in common between all nodes often makes it possible to avoid +special-casing nodes on the basis of type. This shared information is +primarily concerned with the order of evaluation and destinations and +properties of results. This control and value flow is indicated in the node +primarily by pointing to continuations. + +The {\tt continuation} structure represents information sufficiently related +to the normal notion of a continuation that naming it so seems sensible. +Basically, a continuation represents a place in the code, or alternatively the +destination of an expression result and a transfer of control. These two +notions are bound together for the same reasons that they are related in the +standard functional continuation interpretation. + +A continuation may be deprived of either or both of its value or control +significance. If the value of a continuation is unused due to evaluation for +effect, then the continuation will have a null {\tt dest}. If the {\tt next} +node for a continuation is deleted by some optimization, then {\tt next} will +be {\tt :none}. + + [\#\#\# Continuation kinds...] + +The {\tt block} structure represents a basic block, in the the normal sense. +Control transfers other than simple sequencing are represented by information +in the block structure. The continuation for the last node in a block +represents only the destination for the result. + +It is very difficult to reconstruct anything resembling the original source +from ICR, so we record the original source form in each node. The location of +the source form within the input is also recorded, allowing for interfaces such +as ``Edit Compiler Warnings''. See section \ref{source-paths}. + +Forms such as special-bind and catch need to have cleanup code executed at all +exit points from the form. We represent this constraint in ICR by annotating +the code syntactically within the form with a Cleanup structure describing what +needs to be cleaned up. Environment analysis determines the cleanup locations +by watching for a change in the cleanup between two continuations. We can't +emit cleanup code during ICR conversion, since we don't know which exits will +be local until after ICR optimizations are done. + +Special binding is represented by a call to the funny function \%Special-Bind. +The first argument is the Global-Var structure for the variable bound and the +second argument is the value to bind it to. + +Some subprimitives are implemented using a macro-like mechanism for translating +\%PRIMITIVE forms into arbitrary lisp code. Subprimitives special-cased by VMR +conversion are represented by a call to the funny function \%\%Primitive. The +corresponding Template structure is passed as the first argument. + +We check global function calls for syntactic legality with respect to any +defined function type function. If the call is illegal or we are unable to +tell if it is legal due to non-constant keywords, then we give a warning and +mark the function reference as :notinline to force a full call and cause +subsequent phases to ignore the call. If the call is legal and is to a known +function, then we annotate the Combination node with the Function-Info +structure that contains the compiler information for the function. + + +\section{Tail sets} +\#| +Probably want to have a GTN-like function result equivalence class mechanism +for ICR type inference. This would be like the return value propagation being +done by Propagate-From-Calls, but more powerful, less hackish, and known to +terminate. The ICR equivalence classes could probably be used by GTN, as well. + +What we do is have local call analysis eagerly maintain the equivalence classes +of functions that return the same way by annotating functions with a Tail-Info +structure shared between all functions whose value could be the value of this +function. We don't require that the calls actually be tail-recursive, only +that the call deliver its value to the result continuation. [\#\#\# Actually +now done by ICR-OPTIMIZE-RETURN, which is currently making ICR optimize +mandatory.] + +We can then use the Tail-Set during ICR type inference. It would have a type +that is the union across all equivalent functions of the types of all the uses +other than in local calls. This type would be recomputed during optimization +of return nodes. When the type changes, we would propagate it to all calls to +any of the equivalent functions. How do we know when and how to recompute the +type for a tail-set? Recomputation is driven by type propagation on the result +continuation. + +This is really special-casing of RETURN nodes. The return node has the type +which is the union of all the non-call uses of the result. The tail-set is +found though the lambda. We can then recompute the overall union by taking the +union of the type per return node, rather than per-use. + + +How do result type assertions work? We can't intersect the assertions across +all functions in the equivalence class, since some of the call combinations may +not happen (or even be possible). We can intersect the assertion of the result +with the derived types for non-call uses. + +When we do a tail call, we obviously can't check that the returned value +matches our assertion. Although in principle, we would like to be able to +check all assertions, to preserve system integrity, we only need to check +assertions that we depend on. We can afford to lose some assertion information +as long as we entirely lose it, ignoring it for type inference as well as for +type checking. + +Things will work out, since the caller will see the tail-info type as the +derived type for the call, and will emit a type check if it needs a stronger +result. + +A remaining question is whether we should intersect the assertion with +per-RETURN derived types from the very beginning (i.e. before the type check +pass). I think the answer is yes. We delay the type check pass so that we can +get our best guess for the derived type before we decide whether a check is +necessary. But with the function return type, we aren't committing to doing +any type check when we intersect with the type assertion; the need to type +check is still determined in the type check pass by examination of the result +continuation. + +What is the relationship between the per-RETURN types and the types in the +result continuation? The assertion is exactly the Continuation-Asserted-Type +(note that the asserted type of result continuations will never change after +ICR conversion). The per-RETURN derived type is different than the +Continuation-Derived-Type, since it is intersected with the asserted type even +before Type Check runs. Ignoring the Continuation-Derived-Type probably makes +life simpler anyway, since this breaks the potential circularity of the +Tail-Info-Type will affecting the Continuation-Derived-Type, which affects... + +When a given return has no non-call uses, we represent this by using +*empty-type*. This is consistent with the interpretation that a return type of +NIL means the function can't return. + + +\section{Hairy function representation} + +Non-fixed-arg functions are represented using Optional-Dispatch. An +Optional-Dispatch has an entry-point function for each legal number of +optionals, and one for when extra args are present. Each entry point function +is a simple lambda. The entry point function for an optional is passed the +arguments which were actually supplied; the entry point function is expected to +default any remaining parameters and evaluate the actual function body. + +If no supplied-p arg is present, then we can do this fairly easily by having +each entry point supply its default and call the next entry point, with the +last entry point containing the body. If there are supplied-p args, then entry +point function is replaced with a function that calls the original entry +function with T's inserted at the position of all the supplied args with +supplied-p parameters. + +We want to be a bit clever about how we handle arguments declared special when +doing optional defaulting, or we will emit really gross code for special +optionals. If we bound the arg specially over the entire entry-point function, +then the entry point function would be caused to be non-tail-recursive. What +we can do is only bind the variable specially around the evaluation of the +default, and then read the special and store the final value of the special +into a lexical variable which we then pass as the argument. In the common case +where the default is a constant, we don't have to special-bind at all, since +the computation of the default is not affected by and cannot affect any special +bindings. + +Keyword and rest args are both implemented using a LEXPR-like ``more +args'' convention. The More-Entry takes two arguments in addition to +the fixed and optional arguments: the argument context and count. +\verb+(ARG <context> <n>)+ accesses the N'th additional argument. Keyword +args are implemented directly using this mechanism. Rest args are +created by calling \%Listify-Rest-Args with the context and count. + +The More-Entry parses the keyword arguments and passes the values to the main +function as positional arguments. If a keyword default is not constant, then +we pass a supplied-p parameter into the main entry and let it worry about +defaulting the argument. Since the main entry accepts keywords in parsed form, +we can parse keywords at compile time for calls to known functions. We keep +around the original parsed lambda-list and related information so that people +can figure out how to call the main entry. + + +\section{ICR representation of non-local exits} + +All exits are initially represented by EXIT nodes: +How about an Exit node: +\begin{verbatim} + (defstruct (exit (:include node)) + value) +\end{verbatim} +The Exit node uses the continuation that is to receive the thrown Value. +During optimization, if we discover that the Cont's home-lambda is the same as +the exit node's, then we can delete the Exit node, substituting the Cont for +all of the Value's uses. + +The successor block of an EXIT is the entry block in the entered environment. +So we use the Exit node to mark the place where exit code is inserted. During +environment analysis, we need only insert a single block containing the entry +point stub. + +We ensure that all Exits that aren't for a NLX don't have any Value, so that +local exits never require any value massaging. + +The Entry node marks the beginning of a block or tagbody: +\begin{verbatim} + (defstruct (entry (:include node)) + (continuations nil :type list)) +\end{verbatim} +It contains a list of all the continuations that the body could exit to. The +Entry node is used as a marker for the place to snapshot state, including +the control stack pointer. Each lambda has a list of its Entries so +that environment analysis can figure out which continuations are really being +closed over. There is no reason for optimization to delete Entry nodes, +since they are harmless in the degenerate case: we just emit no code (like a +no-var let). + + +We represent CATCH using the lexical exit mechanism. We do a transformation +like this: +\begin{verbatim} + (catch 'foo xxx) ==> + (block #:foo + (%catch #'(lambda () (return-from #:foo (%unknown-values))) 'foo) + (%within-cleanup :catch + xxx)) +\end{verbatim} + +\%CATCH just sets up the catch frame which points to the exit function. \%Catch +is an ordinary function as far as ICR is concerned. The fact that the catcher +needs to be cleaned up is expressed by the Cleanup slots in the continuations +in the body. \%UNKNOWN-VALUES is a dummy function call which represents the +fact that we don't know what values will be thrown. + +\%WITHIN-CLEANUP is a special special form that instantiates its first argument +as the current cleanup when converting the body. In reality, the lambda is +also created by the special special form \%ESCAPE-FUNCTION, which gives the +lambda a special :ESCAPE kind so that the back end knows not to generate any +code for it. + + +We use a similar hack in Unwind-Protect to represent the fact that the cleanup +forms can be invoked at arbitrarily random times. + +\begin{verbatim} + (unwind-protect p c) ==> + (flet ((#:cleanup () c)) + (block #:return + (multiple-value-bind + (#:next #:start #:count) + (block #:unwind + (%unwind-protect #'(lambda (x) (return-from #:unwind x))) + (%within-cleanup :unwind-protect + (return-from #:return p))) + (#:cleanup) + (%continue-unwind #:next #:start #:count)))) +\end{verbatim} + +We use the block \#:unwind to represent the entry to cleanup code in the case +where we are non-locally unwound. Calling of the cleanup function in the +drop-through case (or any local exit) is handled by cleanup generation. We +make the cleanup a function so that cleanup generation can add calls at local +exits from the protected form. \#:next, \#:start and \#:count are state used in +the case where we are unwound. They indicate where to go after doing the +cleanup and what values are being thrown. The cleanup encloses only the +protected form. As in CATCH, the escape function is specially tagged as +:ESCAPE. The cleanup function is tagged as :CLEANUP to inhibit let conversion +(since references are added in environment analysis.) + +Notice that implementing these forms using closures over continuations +eliminates any need to special-case ICR flow analysis. Obviously we don't +really want to make heap-closures here. In reality these functions are +special-cased by the back-end according to their KIND. + + +\section{Block compilation} + +One of the properties of ICR is that it supports ``block compilation'' by allowing +arbitrarily large amounts of code to be converted at once, with actual +compilation of the code being done at will. + + +In order to preserve the normal semantics we must recognize that proclamations +(possibly implicit) are scoped. A proclamation is in effect only from the time +of appearance of the proclamation to the time it is contradicted. The current +global environment at the end of a block is not necessarily the correct global +environment for compilation of all the code within the block. We solve this +problem by closing over the relevant information in the ICR at the time it is +converted. For example, each functional variable reference is marked as +inline, notinline or don't care. Similarly, each node contains a structure +known as a Cookie which contains the appropriate settings of the compiler +policy switches. + +We actually convert each form in the file separately, creating a separate +``initial component'' for each one. Later on, these components are merged as +needed. The main reason for doing this is to cause EVAL-WHEN processing to be +interleaved with reading. + + +\section{Entry points} + +\#| + +Since we need to evaluate potentially arbitrary code in the XEP argument forms +(for type checking), we can't leave the arguments in the wired passing +locations. Instead, it seems better to give the XEP max-args fixed arguments, +with the passing locations being the true passing locations. Instead of using +\%XEP-ARG, we reference the appropriate variable. + +Also, it might be a good idea to do argument count checking and dispatching +with explicit conditional code in the XEP. This would simplify both the code +that creates the XEP and the VMR conversion of XEPs. Also, argument count +dispatching would automatically benefit from any cleverness in compilation of +case-like forms (jump tables, etc). On the downside, this would push some +assumptions about how arg dispatching is done into ICR. But then we are +currently violating abstraction at least as badly in VMR conversion, which is +also supposed to be implementation independent. +|\# + +As a side-effect of finding which references to known functions can be +converted to local calls, we find any references that cannot be converted. +References that cannot be converted to a local call must evaluate to a +``function object'' (or function-entry) that can be called using the full call +convention. A function that can be called from outside the component is called +an ``entry-point''. + +Lots of stuff that happens at compile-time with local function calls must be +done at run-time when an entry-point is called. + +It is desirable for optimization and other purposes if all the calls to every +function were directly present in ICR as local calls. We cannot directly do +this with entry-point functions, since we don't know where and how the +entry-point will be called until run-time. + +What we do is represent all the calls possible from outside the component by +local calls within the component. For each entry-point function, we create a +corresponding lambda called the external entry point or XEP. This is a +function which takes the number of arguments passed as the first argument, +followed by arguments corresponding to each required or optional argument. + +If an optional argument is unsupplied, the value passed into the XEP is +undefined. The XEP is responsible for doing argument count checking and +dispatching. + +In the case of a fixed-arg lambda, we emit a call to the \%VERIFY-ARGUMENT-COUNT +funny function (conditional on policy), then call the real function on the +passed arguments. Even in this simple case, we benefit several ways from +having a separate XEP: +\begin{itemize} +\item The argument count checking is factored out, and only needs to + be done in full calls. +\item Argument type checking happens automatically as a consequence of + passing the XEP arguments in a local call to the real function. + This type checking is also only done in full calls. +\item The real function may use a non-standard calling convention for + the benefit of recursive or block-compiled calls. The XEP converts + arguments/return values to/from the standard convention. This also + requires little special-casing of XEPs. +\end{itemize} + +If the function has variable argument count (represented by an +OPTIONAL-DISPATCH), then the XEP contains a COND which dispatches off of the +argument count, calling the appropriate entry-point function (which then does +defaulting). If there is a more entry (for keyword or rest args), then the XEP +obtains the more arg context and count by calling the \%MORE-ARG-CONTEXT funny +function. + +All non-local-call references to functions are replaced with references to the +corresponding XEP. ICR optimization may discover a local call that was +previously a non-local reference. When we delete the reference to the XEP, we +may find that it has no references. In this case, we can delete the XEP, +causing the function to no longer be an entry-point. + + diff --git a/doc/internals/cmu/compiler.tex b/doc/internals/cmu/compiler.tex new file mode 100644 index 0000000000..cc5c0d7d4a --- /dev/null +++ b/doc/internals/cmu/compiler.tex @@ -0,0 +1,6 @@ +\part{Compiler Organization} +\input{compiler-overview} +\input{front} +\input{middle} +\input{back} +\input{interface} diff --git a/doc/internals/cmu/debugger.tex b/doc/internals/cmu/debugger.tex new file mode 100644 index 0000000000..4d38456aa9 --- /dev/null +++ b/doc/internals/cmu/debugger.tex @@ -0,0 +1,657 @@ +% -*- Dictionary: design; Package: C -*- +\chapter{Debugger} +Two classes of errors are handled by the Lisp debugger. These are +synchronous errors caused by something erring in program code and +asynchronous errors caused by some external context of execution +(clock interrupts, control-c interrupts). Asynchronous errors can +often be postponed if they are delivered at an inconvenient time. + +Synchronous errors are frequently handled by directly invoking the +debugger. However, there are several places where the strategy of +jumping into the debugger is not used. In those situations the +compiler emits a stylized breakpoint; a breakpoint instruction +(usually an INT3) followed by several bytes of argument data. This +will cause a trip through the operating system and ultimately the +invocation of the C-level SIGTRAP handler which, in turn, interprets +the argument bytes following the breakpoint and dispatches to the +correct handler. There is a switch statement in ``sigtrap\_handler'' +which gives the whole story on what types of errors rely on this +mechanism. The most commonly invoked handler is probably +``interrupt\_internal\_error'' as it fields such common exceptions as +the use of unbound symbols. To familiarize with the context these +traps are created in, one can disassemble just about any function and +look at the bottom of the disassembly for blocks of error handling code. +There will often be ``BREAK 10'' opcodes followed by several ``BYTE'' +opcodes with the meaning of the arguments in neatly decoded form off +in the right-hand column. + +The other types of synchronous errors are those errors delivered by +the operating system such as FPU traps and SIGSEGVs. The invocation +of those signals should be funneled through a C-level trampoline which +makes a callback into Lisp passing all of the signal handler +arguments. That code is pretty straight forward and the +``interrupt\_handle\_now'' function is pretty much where all of the +runtime logic is localized. + +Handling asynchronous errors and deferred asynchronous errors is a bit more +involved\ldots + +\section{Tracing and Breakpoints} +\label{sec:trace-and-breakpoints} + +Here are a few notes on how tracing of compiled code works. + +When a function is traced, a breakpoint instruction is placed at the +start of the function, replacing the instruction that was there. +(This is a \verb+:function-start+ breakpoint.) (This appears to be +one instruction after the no-arg parsing entry point.) The breakpoint +instruction is, of course, architecture-specific, but it must signal a +\verb+trap_Breakpoint+ trap. + +When the code is run, the breakpoint instruction is executed causing a +trap. The trap handler runs \verb+HANDLE-BREAKPOINT+ to process it. +After doing the appropriate processing, we now need to continue. Of +course, since the real instruction has been replaced, we to run the +original instruction. This is done by now inserting a \emph{new} +breakpoint after the original breakpoint. This breakpoint must be of +the type \verb+trap_AfterBreakpoint+. The original instruction is +restored and execution continues from there. Then the +\verb+trap_AfterBreakpoint+ instruction gets executed. The handler +for this puts back the original breakpoint, thereby preserving the +breakpoint. Then we replace the AfterBreakpoint with the original +instruction and continue from there. + +That's all pretty straightforward in concept. + +When tracing, additional information is needed. Breakpoints have the +ability to run arbitrary lisp code to process the breakpoint. Tracing +uses this feature. + +When this breakpoint is reached, \verb+HANDLE-BREAKPOINT+ runs the +breakpoint hook function. This function figures out where this +function would return to and creates a new return area and replaces +the original return address with this new address. Thus, when the +function returns, it returns to this new location instead of the +original. + +This new return address is a specially created bogus LRA object. It +is a code-component whose body consists of a code template copied from +an assembly routine into the body. The assembly routine is the code +in \verb+function_end_breakpoint_guts+. This bogus LRA object stores +the real LRA for the function, and also an indication if the +known-return convention is used for this function. + +The bogus LRA object contains a function-end breakpoint +(\verb+trap_FunctionEndBreakpoint+). When it's executed the trap +handler handles this breakpoint. It figures out where this trap come +from and calls \verb+HANDLE-BREAKPOINT+ to handle it. +\verb+HANDLE-BREAKPOINT+ returns and the trap handler arranges it so +that this bogus LRA returns to the real LRA. + +Thus, we can do something when a Lisp function returns, like printing +out the return value for the function for tracing. + +There are lots of internal details left out here, but gives a short +overview of how this works. For more info, look at +\verb+code/debug-int.lisp+ and \verb+lisp/breakpoint.c+, and, of +course, the various \verb+<foo>-arch.c+ files. + +\chapter{Debugger Information} +\index{debugger information} +\label{debug-info} + +Although the compiler's great freedom in choice of function call conventions +and variable representations has major efficiency advantages, it also has +unfortunate consequences for the debugger. The debug information that we need +is even more elaborate than for conventional ``compiled'' languages, since we +cannot even do a simple backtrace without some debug information. However, +once having gone this far, it is not that difficult to go the extra distance, +and provide full source level debugging of compiled code. + +Full debug information has a substantial space penalty, so we allow different +levels of debug information to be specified. In the extreme case, we can +totally omit debug information. + + +\section{The Debug-Info Structure} +\index{debug-info structure} + +The Debug-Info structure directly represents information about the +source code, and points to other structures that describe the layout of +run-time data structures. + + +Make some sort of minimal debug-info format that would support at least the +common cases of level 1 (since that is what we would release), and perhaps +level 0. Actually, it seems it wouldn't be hard to crunch nearly all of the +debug-function structure and debug-info function map into a single byte-vector. +We could have an uncrunch function that restored the current format. This +would be used by the debugger, and also could be used by purify to delete parts +of the debug-info even when the compiler dumps it in crunched form. +[Note that this isn't terribly important if purify is smart about +debug-info...] + + + +Compiled source map representation: + +[\#\#\# store in debug-function PC at which env is properly initialized, i.e. +args (and return-pc, etc.) in internal locations. This is where a +:function-start breakpoint would break.] + +[\#\#\# Note that that we can easily cache the form-number => source-path or +form-number => form translation using a vector indexed by form numbers that we +build during a walk.] + + + + +Instead of using source paths in the debug-info, use ``form numbers''. The form +number of a form is the number of forms that we walk to reach that form when +doing a pre-order walk of the source form. [Might want to use a post-order +walk, as that would more closely approximate evaluation order.] + + +We probably want to continue using source-paths in the compiler, since they are +quick to compute and to get you to a particular form. [\#\#\# But actually, I +guess we don't have to precompute the source paths and annotate nodes with +them: instead we could annotate the nodes with the actual original source form. +Then if we wanted to find the location of that form, we could walk the root +source form, looking that original form. But we might still need to enter all +the forms in a hashtable so that we can tell during IR1 conversion that a given +form appeared in the original source.] + + +Note that form numbers have an interesting property: it is quite efficient to +determine whether an arbitrary form is a subform of some other form, since the +form number of B will be \verb+>+ than A's number and \verb+<+ A's next sibling's number iff +B is a subform of A. + +This should be quite useful for doing the \verb|source=>pc| mapping in the debugger, +since that problem reduces to finding the subset of the known locations that +are for subforms of the specified form. + + +Assume a byte vector with a standard variable-length integer format, something +like this: + +\begin{verbatim} + 0..253 => the integer + 254 => read next two bytes for integer + 255 => read next four bytes for integer +\end{verbatim} + +Then a compiled debug block is just a sequence of variable-length integers in a +particular order, something like this: + +\begin{verbatim} + number of successors + ...offsets of each successor in the function's blocks vector... + first PC + [offset of first top-level form (in forms) (only if not component default)] + form number of first source form + first live mask (length in bytes determined by number of VARIABLES) + ...more <PC, top-level form offset, form-number, live-set> tuples... +\end{verbatim} + +We determine the number of locations recorded in a block by finding the +start of the next compiled debug block in the blocks vector. + +[\#\#\# Actually, only need 2 bits for number of successors {0,1,2}. We might +want to use other bits in the first byte to indicate the kind of location.] +[\#\#\# We could support local packing by having a general concept of ``alternate +locations'' instead of just regular and save locations. The location would have +a bit indicating that there are alternate locations, in which case we read the +number of alternate locations and then that many more SC-OFFSETs. In the +debug-block, we would have a second bit mask with bits set for TNs that are in +an alternate location. We then read a number for each such TN, with the value +being interpreted as an index into the Location's alternate locations.] + + + +It looks like using structures for the compiled-location-info is too bulky. +Instead we need some packed binary representation. + +First, let's represent an SC/offset pair with an ``SC-Offset'', which is an +integer with the SC in the low 5 bits and the offset in the remaining bits: +\begin{verbatim} + ---------------------------------------------------- + | Offset (as many bits as necessary) | SC (5 bits) | + ---------------------------------------------------- +\end{verbatim} +Probably the result should be constrained to fit in a fixnum, since it will be +more efficient and gives more than enough possible offsets. + +We can then represent a compiled location like this: +\begin{verbatim} + single byte of boolean flags: + uninterned name + packaged name + environment-live + has distinct save location + has ID (name not unique in this fun) + name length in bytes (as var-length integer) + ...name bytes... + [if packaged, var-length integer that is package name length] + ...package name bytes...] + [If has ID, ID as var-length integer] + SC-Offset of primary location (as var-length integer) + [If has save SC, SC-Offset of save location (as var-length integer)] +\end{verbatim} + + + + +But for a whizzy breakpoint facility, we would need a good \verb+source=>code+ map. +Dumping a complete \verb+code=>source map+ might be as good a way as any to represent +this, due to the one-to-many relationship between source and code locations. + +We might be able to get away with just storing the source locations for the +beginnings of blocks and maintaining a mapping from code ranges to blocks. +This would be fine both for the profiler and for the ``where am I running now'' +indication. Users might also be convinced that it was most interesting to +break at block starts, but I don't really know how easily people could develop +an understanding of basic blocks. + +It could also be a bit tricky to map an arbitrary user-designated source +location to some ``closest'' source location actually in the debug info. +This problem probably exists to some degree even with a full source map, since +some forms will never appear as the source of any node. It seems you might +have to negotiate with the user. He would mouse something, and then you would +highlight some source form that has a common prefix (i.e. is a prefix of the +user path, or vice-versa.) If they aren't happy with the result, they could +try something else. In some cases, the designated path might be a prefix of +several paths. This ambiguity might be resolved by picking the shortest path +or letting the user choose. + +At the primitive level, I guess what this means is that the structure of source +locations (i.e. source paths) must be known, and the \verb+source=>code+ operation +should return a list of \verb+<source,code>+ pairs, rather than just a list of code +locations. This allows the debugger to resolve the ambiguity however it wants. + +I guess the formal definition of which source paths we would return +is: +\begin{quote} + All source paths in the debug info that have a maximal common prefix with + the specified path. i.e. if several paths have the complete specified path + as a prefix, we return them all. Otherwise, all paths with an equally + large common prefix are returned: if the path with the most in common + matches only the first three elements, then we return all paths that match + in the first three elements. As a degenerate case (which probably + shouldn't happen), if there is no path with anything in common, then we + return *all* of the paths. +\end{quote} + + + +In the DEBUG-SOURCE structure we may ultimately want a vector of the start +positions of each source form, since that would make it easier for the debugger +to locate the source. It could just open the file, FILE-POSITION to the form, +do a READ, then loop down the source path. Of course, it could read each form +starting from the beginning, but that might be too slow. + + +Do XEPs really need Debug-Functions? The only time that we will commonly end +up in the debugger on an XEP is when an argument type check fails. But I +suppose it would be nice to be able to print the arguments passed... + + +Note that assembler-level code motion such as pipeline reorganization can cause +problems with our PC maps. The assembler needs to know that debug info markers +are different from real labels anyway, so I suppose it could inhibit motion +across debug markers conditional on policy. It seems unworthwhile to remember +the node for each individual instruction. + + +For tracing block-compiled calls: +\begin{verbatim} + Info about return value passing locations? + Info about where all the returns are? +\end{verbatim} + +We definitely need the return-value passing locations for debug-return. The +question is what the interface should be. We don't really want to have a +visible debug-function-return-locations operation, since there are various +value passing conventions, and we want to paper over the differences. + + +Probably should be a compiler option to initialize stack frame to a special +uninitialized object (some random immediate type). This would aid debugging, +and would also help GC problems. For the latter reason especially, this should +be locally-turn-onable (off of policy? the new debug-info quality?). + + +What about the interface between the evaluator and the debugger? (i.e. what +happens on an error, etc.) Compiler error handling should be integrated with +run-time error handling. Ideally the error messages should look the same. +Practically, in some cases the run-time errors will have less information. But +the error should look the same to the debugger (or at least similar). + + + +\subsection{Debugger Interface} + +How does the debugger interface to the ``evaluator'' (where the evaluator means +all of native code, byte-code and interpreted IR1)? It seems that it would be +much more straightforward to have a consistent user interface to debugging +all code representations if there was a uniform debugger interface to the +underlying stuff, and vice-versa. + +Of course, some operations might not be supported by some representations, etc. +For example, fine-control stepping might not be available in native code. +In other cases, we might reduce an operation to the lowest common denominator, +for example fetching lexical variables by string and admitting the possibility +of ambiguous matches. [Actually, it would probably be a good idea to store the +package if we are going to allow variables to be closed over.] + +Some objects we would need: +\begin{verbatim} +Location: + The constant information about the place where a value is stored, + everything but which particular frame it is in. Operations: + location name, type, etc. + location-value frame location (setf'able) + monitor-location location function + Function is called whenever location is set with the location, + frame and old value. If active values aren't supported, then we + dummy the effect using breakpoints, in which case the change won't + be noticed until the end of the block (and intermediate changes + will be lost.) +debug info: + All the debug information for a component. +Frame: + frame-changed-locations frame => location* + Return a list of the locations in frame that were changed since the + last time this function was called. Or something. This is for + displaying interesting state changes at breakpoints. + save-frame-state frame => frame-state + restore-frame-state frame frame-state + These operations allow the debugger to back up evaluation, modulo + side-effects and non-local control transfers. This copies and + restores all variables, temporaries, etc, local to the frame, and + also the current PC and dynamic environment (current catch, etc.) + + At the time of the save, the frame must be for the running function + (not waiting for a call to return.) When we restore, the frame + becomes current again, effectively exiting from any frames on top. + (Of course, frame must not already be exited.) + +Thread: + Representation of which stack to use, etc. +Block: + What successors the block has, what calls there are in the block. + (Don't need to know where calls are as long as we know called function, + since can breakpoint at the function.) Whether code in this block is + wildly out of order due to being the result of loop-invariant + optimization, etc. Operations: + block-successors block => code-location* + block-forms block => (source-location code-location)* + Return the corresponding source locations and code locations for + all forms (and form fragments) in the block. +\end{verbatim} + + + +\subsection{Variable maps} + +There are about five things that the debugger might want to know about a +variable: +\begin{itemize} + +\item[Name] + Although a lexical variable's name is ``really'' a symbol (package and + all), in practice it doesn't seem worthwhile to require all the symbols + for local variable names to be retained. There is much less VM and GC + overhead for a constant string than for a symbol. (Also it is useful + to be able to access gensyms in the debugger, even though they are + theoretically ineffable). + +\item[ID] + Which variable with the specified name is this? It is possible to have + multiple variables with the same name in a given function. The ID is + something that makes Name unique, probably a small integer. When + variables aren't unique, we could make this be part of the name, e.g. + ``FOO\#1'', ``FOO\#2''. But there are advantages to keeping this separate, + since in many cases lifetime information can be used to disambiguate, + making qualification unnecessary. + +\item[SC] + When unboxed representations are in use, we must have type information + to properly read and write a location. We only need to know the + SC for this, which would be amenable to a space-saving + numeric encoding. + +\item[Location] + Simple: the offset in SC. [Actually, we need the save location too.] + +\item[Lifetime] + In what parts of the program does this variable hold a meaningful + value? It seems prohibitive to record precise lifetime information, + both in space and compiler effort, so we will have to settle for some + sort of approximation. + + The finest granularity at which it is easy to determine liveness is + the block: we can regard the variable lifetime as the set of blocks + that the variable is live in. Of course, the variable may be dead (and + thus contain meaningless garbage) during arbitrarily large portions of + the block. + + Note that this subsumes the notion of which function a variable belongs + to. A given block is only in one function, so the function is + implicit. +\end{itemize} + +The variable map should represent this information space-efficiently and with +adequate computational efficiency. + +The SC and ID can be represented as small integers. Although the ID can in +principle be arbitrarily large, it should be $<$100 in practice. The location +can be represented by just the offset (a moderately small integer), since the +SB is implicit in the SC. + +The lifetime info can be represented either as a bit-vector indexed by block +numbers, or by a list of block numbers. Which is more compact depends both on +the size of the component and on the number of blocks the variable is live in. +In the limit of large component size, the sparse representation will be more +compact, but it isn't clear where this crossover occurs. Of course, it would +be possible to use both representations, choosing the more compact one on a +per-variable basis. Another interesting special case is when the variable is +live in only one block: this may be common enough to be worth picking off, +although it is probably rarer for named variables than for TNs in general. + +If we dump the type, then a normal list-style type descriptor is fine: the +space overhead is small, since the shareability is high. + +We could probably save some space by cleverly representing the var-info as +parallel vectors of different types, but this would be more painful in use. +It seems better to just use a structure, encoding the unboxed fields in a +fixnum. This way, we can pass around the structure in the debugger, perhaps +even exporting it from the low-level debugger interface. + +[\#\#\# We need the save location too. This probably means that we need two slots +of bits, since we need the save offset and save SC. Actually, we could let the +save SC be implied by the normal SC, since at least currently, we always choose +the same save SC for a given SC. But even so, we probably can't fit all that +stuff in one fixnum without squeezing a lot, so we might as well split and +record both SCs. + +In a localized packing scheme, we would have to dump a different var-info +whenever either the main location or the save location changes. As a practical +matter, the save location is less likely to change than the main location, and +should never change without the main location changing. + +One can conceive of localized packing schemes that do saving as a special case +of localized packing. If we did this, then the concept of a save location +might be eliminated, but this would require major changes in the IR2 +representation for call and/or lifetime info. Probably we will want saving to +continue to be somewhat magical.] + + +How about: + +\begin{verbatim} +(defstruct var-info + ;; + ;; This variable's name. (symbol-name of the symbol) + (name nil :type simple-string) + ;; + ;; The SC, ID and offset, encoded as bit-fields. + (bits nil :type fixnum) + ;; + ;; The set of blocks this variable is live in. If a bit-vector, then it has + ;; a 1 when indexed by the number of a block that it is live in. If an + ;; I-vector, then it lists the live block numbers. If a fixnum, then that is + ;; the number of the sole live block. + (lifetime nil :type (or vector fixnum)) + ;; + ;; The variable's type, represented as list-style type descriptor. + type) +\end{verbatim} + +Then the debug-info holds a simple-vector of all the var-info structures for +that component. We might as well make it sorted alphabetically by name, so +that we can binary-search to find the variable corresponding to a particular +name. + +We need to be able to translate PCs to block numbers. This can be done by an +I-Vector in the component that contains the start location of each block. The +block number is the index at which we find the correct PC range. This requires +that we use an emit-order block numbering distinct from the IR2-Block-Number, +but that isn't any big deal. This seems space-expensive, but it isn't too bad, +since it would only be a fraction of the code size if the average block length +is a few words or more. + +An advantage of our per-block lifetime representation is that it directly +supports keeping a variable in different locations when in different blocks, +i.e. multi-location packing. We use a different var-info for each different +packing, since the SC and offset are potentially different. The Name and ID +are the same, representing the fact that it is the same variable. It is here +that the ID is most significant, since the debugger could otherwise make +same-name variables unique all by itself. + + + +\subsection{Stack parsing} + +[\#\#\# Probably not worth trying to make the stack parseable from the bottom up. +There are too many complications when we start having variable sized stuff on +the stack. It seems more profitable to work on making top-down parsing robust. +Since we are now planning to wire the bottom-up linkage info, scanning from the +bottom to find the top frame shouldn't be too inefficient, even when there was +a runaway recursion. If we somehow jump into hyperspace, then the debugger may +get confused, but we can debug this sort of low-level system lossage using +ADB.] + + +There are currently three relevant context pointers: +\begin{itemize} + \item The PC. The current PC is wired (implicit in the machine). A saved + PC (RETURN-PC) may be anywhere in the current frame. + \item The current stack context (CONT). The current CONT is wired. + A saved CONT (OLD-CONT) may be anywhere in the current frame. + \item The current code object (ENV). The current ENV is wired. + When saved, this is extra-difficult to locate, since it is saved + by the caller, and is thus at an unknown offset in OLD-CONT, + rather than anywhere in the current frame. +\end{itemize} + +We must have all of these to parse the stack. + +With the proposed Debug-Function, we parse the stack (starting at the top) like +this: +\begin{enumerate} +\item Use ENV to locate the current Debug-Info +\item Use the Debug-Info and PC to determine the current Debug-Function. +\item Use the Debug-Function to find the OLD-CONT and RETURN-PC. +\item Find the old ENV by searching up the stack for a saved code object + containing the RETURN-PC. +\item Assign old ENV to ENV, OLD-CONT to CONT, RETURN-PC to PC and goto 1. +\end{enumerate} + +If we changed the function representation so that the code and environment were +a single object, then the location of the old ENV would be simplified. But we +still need to represent ENV as separate from PC, since interrupts and errors +can happen when the current PC isn't positioned at a valid return PC. + +It seems like it might be a good idea to save OLD-CONT, RETURN-PC and ENV at +the beginning of the frame (before any stack arguments). Then we wouldn't have +to search to locate ENV, and we also have a hope of parsing the stack even if +it is damaged. As long as we can locate the start of some frame, we can trace +the stack above that frame. We can recognize a probable frame start by +scanning the stack for a code object (presumably a saved ENV). + +Probably we want some fairly general +mechanism for specifying that a TN should be considered to be live for the +duration of a specified environment. It would be somewhat easier to specify +that the TN is live for all time, but this would become very space-inefficient +in large block compilations. + +This mechanism could be quite useful for other debugger-related things. For +example, when debuggability is important, we could make the TNs holding +arguments live for the entire environment. This would guarantee that a +backtrace would always get the right value (modulo setqs). + +Note that in this context, ``environment'' means the Environment structure (one +per non-let function). At least according to current plans, even when we do +inter-routine register allocation, the different functions will have different +environments: we just ``equate'' the environments. So the number of live +per-environment TNs is bounded by the size of a ``function'', and doesn't blow up +in block compilation. + +The implementation is simple: per-environment TNs are flagged by the +:Environment kind. :Environment TNs are treated the same as :Normal TNs by +everyone except for lifetime/conflict analysis. An environment's TNs are also +stashed in a list in the IR2-Environment structure. During the conflict +analysis post-pass, we look at each block's environment, and make all the +environment's TNs always-live in that block. + +We can implement the ``fixed save location'' concept needed for lazy frame +creation by allocating the save TNs as wired TNs at IR2 conversion time. We +would use the new ``environment lifetime'' concept to specify the lifetimes of +the save locations. There isn't any run-time overhead if we never get around +to using the save TNs. [Pack would also have to notice TNs with pre-allocated +save TNs, packing the original TN in the stack location if its FSC is the +stack.] + + +We want a standard (recognizable) format for an ``escape'' frame. We must make +an escape frame whenever we start running another function without the current +function getting a chance to save its registers. This may be due either to a +truly asynchronous event such as a software interrupt, or due to an ``escape'' +from a miscop. An escape frame marks a brief conversion to a callee-saves +convention. + +Whenever a miscop saves registers, it should make an escape frame. This +ensures that the ``current'' register contents can always be located by the +debugger. In this case, it may be desirable to be able to indicate that only +partial saving has been done. For example, we don't want to have to save all +the FP registers just so that we can use a couple extra general registers. + +When the debugger see an escape frame, it knows that register values are +located in the escape frame's ``register save'' area, rather than in the normal +save locations. + +It would be nice if there was a better solution to this internal error concept. +One problem is that it seems there is a substantial space penalty for emitting +all that error code, especially now that we don't share error code between +errors because we want to preserve the source context in the PC. But this +probably isn't really all that bad when considered as a fraction of the code. +For example, the check part of a type check is 12 bytes, whereas the error part +is usually only 6. In this case, we could never reduce the space overhead for +type checks by more than 1/3, thus the total code size reduction would be +small. This will be made even less important when we do type check +optimizations to reduce the number of type checks. + +Probably we should stick to the same general internal error mechanism, but make +it interact with the debugger better by allocating linkage registers and +allowing proceedable errors. We could support shared error calls and +non-proceedable errors when space is more important than debuggability, but +this is probably more complexity than is worthwhile. + +We jump or trap to a routine that saves the context (allocating at most the +return PC register). We then encode the error and context in the code +immediately following the jump/trap. (On the MIPS, the error code can be +encoded in the trap itself.) The error arguments would be encoded as +SC-offsets relative to the saved context. This could solve both the +arg-trashing problem and save space, since we could encode the SC-offsets more +tersely than the corresponding move instructions. diff --git a/doc/internals/cmu/design.tex b/doc/internals/cmu/design.tex new file mode 100644 index 0000000000..776ee1e994 --- /dev/null +++ b/doc/internals/cmu/design.tex @@ -0,0 +1,92 @@ +%%\documentstyle[cmu-titlepage]{report} % -*- Dictionary: design -*- +%\documentstyle{report} % -*- Dictionary: design -*- + +\documentclass{report} +\usepackage{ifpdf} +\usepackage{ifthen} +\usepackage{calc} +\usepackage{palatino} +\usepackage[hyperindex=false,colorlinks=false,urlcolor=blue]{hyperref} + +\title{Design of CMU Common Lisp} +\date{January 15, 2003} +\author{Robert A. MacLachlan (ed)} + +\ifpdf +\pdfinfo{ +/Author (Robert A. MacLachlan, ed) +/Title (Design of CMU Common Lisp) +} +% Add section numbers to the bookmarks, and open 2 levels by default. +\hypersetup{bookmarksnumbered=true, + bookmarksopen=true, + bookmarksopenlevel=2} +\fi +%%\trnumber{CMU-CS-91-???} + +%% This code taken from the LaTeX companion. It's meant as a +%% replacement for the description environment. We want one that +%% prints description items in a fixed size box and puts the +%% description itself on the same line or the next depending on the +%% size of the item. +\newcommand{\entrylabel}[1]{\mbox{#1}\hfil} +\newenvironment{entry}{% + \begin{list}{}% + {\renewcommand{\makelabel}{\entrylabel}% + \setlength{\labelwidth}{45pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}}}% + {\end{list}} + +\newlength{\Mylen} +\newcommand{\Lentrylabel}[1]{% + \settowidth{\Mylen}{#1}% + \ifthenelse{\lengthtest{\Mylen > \labelwidth}}% + {\parbox[b]{\labelwidth}% term > labelwidth + {\makebox[0pt][l]{#1}\\}}% + {#1}% + \hfil\relax} +\newenvironment{Lentry}{% + \renewcommand{\entrylabel}{\Lentrylabel} + \begin{entry}}% + {\end{entry}} + +\setcounter{tocdepth}{2} +\setcounter{secnumdepth}{3} +\def\textfraction{.1} +\def\bottomfraction{.9} % was .3 +\def\topfraction{.9} + +\newcommand{\code}[1]{\textnormal{{\sffamily #1}}} +%% Some common abbreviations +\newcommand{\cmucl}{\textsc{cmucl}} + +%% Set up margins +\setlength{\oddsidemargin}{-10pt} +\setlength{\evensidemargin}{-10pt} +\setlength{\topmargin}{-40pt} +\setlength{\headheight}{12pt} +\setlength{\headsep}{25pt} +\setlength{\footskip}{30pt} +\setlength{\textheight}{9.25in} +\setlength{\textwidth}{6.75in} +\setlength{\columnsep}{0.375in} +\setlength{\columnseprule}{0pt} + + +\begin{document} +\maketitle +\abstract{This report documents internal details of the CMU Common Lisp +compiler and run-time system. CMU Common Lisp is a public domain +implementation of Common Lisp that runs on various Unix workstations. +This document is a work in progress: neither the contents nor the +presentation are completed. Nevertheless, it provides some useful +background information, in particular regarding the \cmucl{} compiler.} + +\tableofcontents +\include{architecture} +\include{compiler} +\include{retargeting} +\include{run-time} +\appendix +\include{glossary} +\end{document} diff --git a/doc/internals/cmu/environment.tex b/doc/internals/cmu/environment.tex new file mode 100644 index 0000000000..390f7dfde4 --- /dev/null +++ b/doc/internals/cmu/environment.tex @@ -0,0 +1,23 @@ +\chapter{The Type System} + + + +\chapter{The Info Database} + +The info database provides a functional interface to global +information about named things in \cmucl{}. Information is considered to +be global if it must persist between invocations of the compiler. The +use of a functional interface eliminates the need for the compiler to +worry about the details of the representation. The info database also +handles the need to multiple ``global'' environments, which makes it +possible to change something in the compiler without trashing the +running Lisp environment. + +The info database contains arbitrary lisp values, addressed by a +combination of name, class and type. The Name is an EQUAL-thing which +is the name of the thing that we are recording information about. +Class is the kind of object involved: typical classes are Function, +Variable, Type. A type names a particular piece of information within +a given class. Class and Type are symbols, but are compared with +STRING=. + diff --git a/doc/internals/cmu/executable.tex b/doc/internals/cmu/executable.tex new file mode 100644 index 0000000000..8843b0a708 --- /dev/null +++ b/doc/internals/cmu/executable.tex @@ -0,0 +1,100 @@ +\chapter{Saving Executable Lisp Images} + +The :executable flag to SAVE-LISP allows saving the Lisp core sections into an ELF binary that +is executable. To do this, the ELF format is adapted to emulate the old core format. + +\section{Saving} +The first part of the save process is almost the same as saving a core-file image except that +instead of a single core image, three ELF object files are created. These are temporary files +called CORRO.o, CORSTA.o and CORDYN.o containing the read-only, static and dynamic spaces. + +After that, a script called linker.sh is invoked to use the system linker to create the +executable file. The linker links a file called lisp.a with the three object files. When +SAVE-LISP calls linker.sh, it passes the address of the initial function to be run when lisp is +restarted. + +The linker.sh script does several things. + +\begin{enumerate} +\item It locates the directory where the C runtime object files are kept. +\item It passes the name of the linker directive script to the linker. +\item It uses the linker to define two symbols: builtin_image_flag and initial_function_addr. + The first symbol has to be the address of some location in memory with non-zero contents + because it is used to tell the system that it is an executable rather than the traditional + runtime loader with core file. This is definitely a kludge but something like this is needed + because it gets around a bootstrapping issue. The second symbol is the startup function; + ordinarily this would be saved in the core file header. It would be possible to save this + information in the ELF file but since we have to use the linker to define builtin_image_flag + anyway, it is simpler to just define initial_function_addr the same way. +\item Finally, the linker script links the executable with the correct set of libraries and + object files. One of these files is lisp.a, containing the object code of the runtime + loader program, which is no longer a separate file. +\end{enumerate} + +\section{Running} +The startup procedure for an executable image attempts to emulate the startup procedure for a +core image file by using information saved in the ELF section headers. + +When an executable image starts up, it sees the builtin_image_flag that tells it that it is an +executable image. It reads the ELF header of the executable file. It finds the string section +of the file. It then reads ELF section headers, looking for sections with the names CORRO, +CORSTA or CORDYN (it uses the string section to look up the names). Once it finds them, it +mmaps them into the memory space indicated by the parameters in the ELF section header. +Finally it sets variables indicating the starts of the three spaces. It also sets a variable +to indicate how big the dynamic space is. + +\section{Porting the Linker Directive Script} +The following describes how to create a linker directive script. It assumes that the system is +based on GCC and the GCC compiler toolchain (in particular, GNU ld). + +The linker directive script is used to set up the memory layout for the system. It is a +modified version of the normal linker directive script used by the system. + +To obtain a copy of this script (for porting to another operating system), the command ``ld +--verbose'' must be run. This will dump the linker script to standard output. Save this to a +file and edit it as follows. + +First, add a ``PHDRS'' part after the SEARCH_DIR part and before the SECTIONS part. The PHDRS +part should look like this: + +PHDRS +{ + headers PT_PHDR PHDRS ; + interp PT_INTERP ; + text PT_LOAD FILEHDR PHDRS ; + + data PT_LOAD ; + dynamic PT_DYNAMIC ; + note PT_NOTE ; + + /* Add core sections for Lisp. */ + CORRO PT_NOTE ; + CORSTA PT_NOTE ; + CORDYN PT_NOTE ; +} + + +Note the three CORXXX sections. They are given type PT_NOTE so the system will not try to +process them. An attempt was made to use the PT_LOAD type (and thereby taking advantage of the +ELF loader automatically mmapping the sections into place) but this caused systems to get +confused about the memory layout so that any use of malloc would fail. + +Right after the place where the file has something like this: + + _end = .; + PROVIDE (end = .); + . = DATA_SEGMENT_END (.); + + add the following lines (modified for your system): + + /* Lisp core sections. */ + CORRO 0x10000000 : { CORRO.o (CORRO) } :CORRO + CORSTA 0x28f00000 : { CORSTA.o (CORSTA) } :CORSTA + CORDYN 0x48000000 : { CORDYN.o (CORDYN) } :CORDYN + +Note that the addresses (the second field) must correspond to the addresses of the read-only, +static and dynamic sections given in src/lisp/xxx-validate.h. + +This linker directive script will reside in the library: directory along with the linker.sh +script and the lisp.a file created by rebuild-lisp.sh. It should be given a descriptive name +that indicates the system it is used for. diff --git a/doc/internals/cmu/fasl.tex b/doc/internals/cmu/fasl.tex new file mode 100644 index 0000000000..0c0c577afc --- /dev/null +++ b/doc/internals/cmu/fasl.tex @@ -0,0 +1,640 @@ +\chapter{Fasload File Format}% -*- Dictionary: design -*- +\section{General} + +The purpose of Fasload files is to allow concise storage and rapid +loading of Lisp data, particularly function definitions. The intent +is that loading a Fasload file has the same effect as loading the +source file from which the Fasload file was compiled, but accomplishes +the tasks more efficiently. One noticeable difference, of course, is +that function definitions may be in compiled form rather than +S-expression form. Another is that Fasload files may specify in what +parts of memory the Lisp data should be allocated. For example, +constant lists used by compiled code may be regarded as read-only. + +In some Lisp implementations, Fasload file formats are designed to +allow sharing of code parts of the file, possibly by direct mapping +of pages of the file into the address space of a process. This +technique produces great performance improvements in a paged +time-sharing system. Since the Mach project is to produce a +distributed personal-computer network system rather than a +time-sharing system, efficiencies of this type are explicitly {\it not} +a goal for the CMU Common Lisp Fasload file format. + +On the other hand, CMU Common Lisp is intended to be portable, as it will +eventually run on a variety of machines. Therefore an explicit goal +is that Fasload files shall be transportable among various +implementations, to permit efficient distribution of programs in +compiled form. The representations of data objects in Fasload files +shall be relatively independent of such considerations as word +length, number of type bits, and so on. If two implementations +interpret the same macrocode (compiled code format), then Fasload +files should be completely compatible. If they do not, then files +not containing compiled code (so-called ``Fasdump'' data files) should +still be compatible. While this may lead to a format which is not +maximally efficient for a particular implementation, the sacrifice of +a small amount of performance is deemed a worthwhile price to pay to +achieve portability. + +The primary assumption about data format compatibility is that all +implementations can support I/O on finite streams of eight-bit bytes. +By ``finite'' we mean that a definite end-of-file point can be detected +irrespective of the content of the data stream. A Fasload file will +be regarded as such a byte stream. + +\section{Strategy} + +A Fasload file may be regarded as a human-readable prefix followed by +code in a funny little language. When interpreted, this code will +cause the construction of the encoded data structures. The virtual +machine which interprets this code has a {\it stack} and a {\it table}, +both initially empty. The table may be thought of as an expandable +register file; it is used to remember quantities which are needed +more than once. The elements of both the stack and the table are +Lisp data objects. Operators of the funny language may take as +operands following bytes of the data stream, or items popped from the +stack. Results may be pushed back onto the stack or pushed onto the +table. The table is an indexable stack that is never popped; it is +indexed relative to the base, not the top, so that an item once +pushed always has the same index. + +More precisely, a Fasload file has the following macroscopic +organization. It is a sequence of zero or more groups concatenated +together. End-of-file must occur at the end of the last group. Each +group begins with a series of seven-bit ASCII characters terminated +by one or more bytes of all ones \verb|#xFF|; this is called the +{\it header}. Following the bytes which terminate the header is the +{\it body}, a stream of bytes in the funny binary language. The body +of necessity begins with a byte other than \verb|#xFF|. The body is +terminated by the operation {\tt FOP-END-GROUP}. + +The first nine characters of the header must be \verb|FASL FILE| in +upper-case letters. The rest may be any ASCII text, but by +convention it is formatted in a certain way. The header is divided +into lines, which are grouped into paragraphs. A paragraph begins +with a line which does {\it not} begin with a space or tab character, +and contains all lines up to, but not including, the next such line. +The first word of a paragraph, defined to be all characters up to but +not including the first space, tab, or end-of-line character, is the +{\it name} of the paragraph. A Fasload file header might look something like +this: +\begin{verbatim} +FASL FILE >SteelesPerq>User>Guy>IoHacks>Pretty-Print.Slisp +Package Pretty-Print +Compiled 31-Mar-1988 09:01:32 by some random luser +Compiler Version 1.6, Lisp Version 3.0. +Functions: INITIALIZE DRIVER HACK HACK1 MUNGE MUNGE1 GAZORCH + MINGLE MUDDLE PERTURB OVERDRIVE GOBBLE-KEYBOARD + FRY-USER DROP-DEAD HELP CLEAR-MICROCODE + %AOS-TRIANGLE %HARASS-READTABLE-MAYBE +Macros: PUSH POP FROB TWIDDLE +\end{verbatim} +{\it one or more bytes of \verb|#xFF|} + +The particular paragraph names and contents shown here are only intended as +suggestions. + +\section{Fasload Language} + +Each operation in the binary Fasload language is an eight-bit +(one-byte) opcode. Each has a name beginning with ``{\tt FOP-}''. In +the following descriptions, the name is followed by operand +descriptors. Each descriptor denotes operands that follow the opcode +in the input stream. A quantity in parentheses indicates the number +of bytes of data from the stream making up the operand. Operands +which implicitly come from the stack are noted in the text. The +notation ``$\Rightarrow$ stack'' means that the result is pushed onto the +stack; ``$\Rightarrow$ table'' similarly means that the result is added to the +table. A construction like ``{\it n}(1) {\it value}({\it n})'' means that +first a single byte {\it n} is read from the input stream, and this +byte specifies how many bytes to read as the operand named {\it value}. +All numeric values are unsigned binary integers unless otherwise +specified. Values described as ``signed'' are in two's-complement form +unless otherwise specified. When an integer read from the stream +occupies more than one byte, the first byte read is the least +significant byte, and the last byte read is the most significant (and +contains the sign bit as its high-order bit if the entire integer is +signed). + +Some of the operations are not necessary, but are rather special +cases of or combinations of others. These are included to reduce the +size of the file or to speed up important cases. As an example, +nearly all strings are less than 256 bytes long, and so a special +form of string operation might take a one-byte length rather than a +four-byte length. As another example, some implementations may +choose to store bits in an array in a left-to-right format within +each word, rather than right-to-left. The Fasload file format may +support both formats, with one being significantly more efficient +than the other for a given implementation. The compiler for any +implementation may generate the more efficient form for that +implementation, and yet compatibility can be maintained by requiring +all implementations to support both formats in Fasload files. + +Measurements are to be made to determine which operation codes are +worthwhile; little-used operations may be discarded and new ones +added. After a point the definition will be ``frozen'', meaning that +existing operations may not be deleted (though new ones may be added; +some operations codes will be reserved for that purpose). + +\begin{description} +\item[0:] \hspace{2em} {\tt FOP-NOP} \\ +No operation. (This is included because it is recognized +that some implementations may benefit from alignment of operands to some +operations, for example to 32-bit boundaries. This operation can be used +to pad the instruction stream to a desired boundary.) + +\item[1:] \hspace{2em} {\tt FOP-POP} \hspace{2em} $\Rightarrow$ \hspace{2em} table \\ +One item is popped from the stack and added to the table. + +\item[2:] \hspace{2em} {\tt FOP-PUSH} \hspace{2em} {\it index}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +Item number {\it index} of the table is pushed onto the stack. +The first element of the table is item number zero. + +\item[3:] \hspace{2em} {\tt FOP-BYTE-PUSH} \hspace{2em} {\it index}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +Item number {\it index} of the table is pushed onto the stack. +The first element of the table is item number zero. + +\item[4:] \hspace{2em} {\tt FOP-EMPTY-LIST} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The empty list ({\tt ()}) is pushed onto the stack. + +\item[5:] \hspace{2em} {\tt FOP-TRUTH} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The standard truth value ({\tt T}) is pushed onto the stack. + +\item[6:] \hspace{2em} {\tt FOP-SYMBOL-SAVE} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ +The four-byte operand {\it n} specifies the length of the print name +of a symbol. The name follows, one character per byte, +with the first byte of the print name being the first read. +The name is interned in the default package, +and the resulting symbol is both pushed onto the stack and added to the table. + +\item[7:] \hspace{2em} {\tt FOP-SMALL-SYMBOL-SAVE} \hspace{2em} {\it n}(1) \hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ +The one-byte operand {\it n} specifies the length of the print name +of a symbol. The name follows, one character per byte, +with the first byte of the print name being the first read. +The name is interned in the default package, +and the resulting symbol is both pushed onto the stack and added to the table. + +\item[8:] \hspace{2em} {\tt FOP-SYMBOL-IN-PACKAGE-SAVE} \hspace{2em} {\it index}(4) +\hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ +The four-byte {\it index} specifies a package stored in the table. +The four-byte operand {\it n} specifies the length of the print name +of a symbol. The name follows, one character per byte, +with the first byte of the print name being the first read. +The name is interned in the specified package, +and the resulting symbol is both pushed onto the stack and added to the table. + +\item[9:] \hspace{2em} {\tt FOP-SMALL-SYMBOL-IN-PACKAGE-SAVE} \hspace{2em} {\it index}(4) +\hspace{2em} {\it n}(1) \hspace{2em} {\it name}({\it n}) \hspace{2em} +$\Rightarrow$ \hspace{2em} stack \& table\\ +The four-byte {\it index} specifies a package stored in the table. +The one-byte operand {\it n} specifies the length of the print name +of a symbol. The name follows, one character per byte, +with the first byte of the print name being the first read. +The name is interned in the specified package, +and the resulting symbol is both pushed onto the stack and added to the table. + +\item[10:] \hspace{2em} {\tt FOP-SYMBOL-IN-BYTE-PACKAGE-SAVE} \hspace{2em} {\it index}(1) +\hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ +The one-byte {\it index} specifies a package stored in the table. +The four-byte operand {\it n} specifies the length of the print name +of a symbol. The name follows, one character per byte, +with the first byte of the print name being the first read. +The name is interned in the specified package, +and the resulting symbol is both pushed onto the stack and added to the table. + +\item[11:]\hspace{2em} {\tt FOP-SMALL-SYMBOL-IN-BYTE-PACKAGE-SAVE} \hspace{2em} {\it index}(1) +\hspace{2em} {\it n}(1) \hspace{2em} {\it name}({\it n}) \hspace{2em} +$\Rightarrow$ \hspace{2em} stack \& table\\ +The one-byte {\it index} specifies a package stored in the table. +The one-byte operand {\it n} specifies the length of the print name +of a symbol. The name follows, one character per byte, +with the first byte of the print name being the first read. +The name is interned in the specified package, +and the resulting symbol is both pushed onto the stack and added to the table. + +\item[12:] \hspace{2em} {\tt FOP-UNINTERNED-SYMBOL-SAVE} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ +Like {\tt FOP-SYMBOL-SAVE}, except that it creates an uninterned symbol. + +\item[13:] \hspace{2em} {\tt FOP-UNINTERNED-SMALL-SYMBOL-SAVE} \hspace{2em} {\it n}(1) +\hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack +\& table\\ +Like {\tt FOP-SMALL-SYMBOL-SAVE}, except that it creates an uninterned symbol. + +\item[14:] \hspace{2em} {\tt FOP-PACKAGE} \hspace{2em} $\Rightarrow$ \hspace{2em} table \\ +An item is popped from the stack; it must be a symbol. The package of +that name is located and pushed onto the table. + +\item[15:] \hspace{2em} {\tt FOP-LIST} \hspace{2em} {\it length}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The unsigned operand {\it length} specifies a number of +operands to be popped from the stack. These are made into a list +of that length, and the list is pushed onto the stack. +The first item popped from the stack becomes the last element of +the list, and so on. Hence an iterative loop can start with +the empty list and perform ``pop an item and cons it onto the list'' +{\it length} times. +(Lists of length greater than 255 can be made by using {\tt FOP-LIST*} +repeatedly.) + +\item[16:] \hspace{2em} {\tt FOP-LIST*} \hspace{2em} {\it length}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +This is like {\tt FOP-LIST} except that the constructed list is terminated +not by {\tt ()} (the empty list), but by an item popped from the stack +before any others are. Therefore {\it length}+1 items are popped in all. +Hence an iterative loop can start with +a popped item and perform ``pop an item and cons it onto the list'' +{\it length}+1 times. + +\item[17-24:] \hspace{2em} {\tt FOP-LIST-1}, {\tt FOP-LIST-2}, ..., {\tt FOP-LIST-8} \\ +{\tt FOP-LIST-{\it k}} is like {\tt FOP-LIST} with a byte containing {\it k} +following it. These exist purely to reduce the size of Fasload files. +Measurements need to be made to determine the useful values of {\it k}. + +\item[25-32:] \hspace{2em} {\tt FOP-LIST*-1}, {\tt FOP-LIST*-2}, ..., {\tt FOP-LIST*-8} \\ +{\tt FOP-LIST*-{\it k}} is like {\tt FOP-LIST*} with a byte containing {\it k} +following it. These exist purely to reduce the size of Fasload files. +Measurements need to be made to determine the useful values of {\it k}. + +\item[33:] \hspace{2em} {\tt FOP-INTEGER} \hspace{2em} {\it n}(4) \hspace{2em} {\it value}({\it n}) \hspace{2em} +$\Rightarrow$ \hspace{2em} stack \\ +A four-byte unsigned operand specifies the number of following +bytes. These bytes define the value of a signed integer in two's-complement +form. The first byte of the value is the least significant byte. + +\item[34:] \hspace{2em} {\tt FOP-SMALL-INTEGER} \hspace{2em} {\it n}(1) \hspace{2em} {\it value}({\it n}) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +A one-byte unsigned operand specifies the number of following +bytes. These bytes define the value of a signed integer in two's-complement +form. The first byte of the value is the least significant byte. + +\item[35:] \hspace{2em} {\tt FOP-WORD-INTEGER} \hspace{2em} {\it value}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +A four-byte signed integer (in the range $-2^{31}$ to $2^{31}-1$) follows the +operation code. A LISP integer (fixnum or bignum) with that value +is constructed and pushed onto the stack. + +\item[36:] \hspace{2em} {\tt FOP-BYTE-INTEGER} \hspace{2em} {\it value}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +A one-byte signed integer (in the range -128 to 127) follows the +operation code. A LISP integer (fixnum or bignum) with that value +is constructed and pushed onto the stack. + +\item[37:] \hspace{2em} {\tt FOP-STRING} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The four-byte operand {\it n} specifies the length of a string to +construct. The characters of the string follow, one per byte. +The constructed string is pushed onto the stack. + +\item[38:] \hspace{2em} {\tt FOP-SMALL-STRING} \hspace{2em} {\it n}(1) \hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The one-byte operand {\it n} specifies the length of a string to +construct. The characters of the string follow, one per byte. +The constructed string is pushed onto the stack. + +\item[39:] \hspace{2em} {\tt FOP-VECTOR} \hspace{2em} {\it n}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The four-byte operand {\it n} specifies the length of a vector of LISP objects +to construct. The elements of the vector are popped off the stack; +the first one popped becomes the last element of the vector. +The constructed vector is pushed onto the stack. + +\item[40:] \hspace{2em} {\tt FOP-SMALL-VECTOR} \hspace{2em} {\it n}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The one-byte operand {\it n} specifies the length of a vector of LISP objects +to construct. The elements of the vector are popped off the stack; +the first one popped becomes the last element of the vector. +The constructed vector is pushed onto the stack. + +\item[41:] \hspace{2em} {\tt FOP-UNIFORM-VECTOR} \hspace{2em} {\it n}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The four-byte operand {\it n} specifies the length of a vector of LISP objects +to construct. A single item is popped from the stack and used to initialize +all elements of the vector. The constructed vector is pushed onto the stack. + +\item[42:] \hspace{2em} {\tt FOP-SMALL-UNIFORM-VECTOR} \hspace{2em} {\it n}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The one-byte operand {\it n} specifies the length of a vector of LISP objects +to construct. A single item is popped from the stack and used to initialize +all elements of the vector. The constructed vector is pushed onto the stack. + +\item[43:] \hspace{2em} {\tt FOP-INT-VECTOR} \hspace{2em} {\it len}(4) \hspace{2em} +{\it size}(1) \hspace{2em} {\it data}($\left\lceil len*count/8\right\rceil$) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The four-byte operand {\it n} specifies the length of a vector of +unsigned integers to be constructed. Each integer is {\it size} +bits long, and is packed according to the machine's native byte ordering. +{\it size} must be a directly supported i-vector element size. Currently +supported values are 1,2,4,8,16 and 32. + +\item[44:] \hspace{2em} {\tt FOP-UNIFORM-INT-VECTOR} \hspace{2em} {\it n}(4) \hspace{2em} {\it size}(1) \hspace{2em} +{\it value}(@ceiling$<${\it size}/8$>$) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The four-byte operand {\it n} specifies the length of a vector of unsigned +integers to construct. +Each integer is {\it size} bits big, and is initialized to the value +of the operand {\it value}. +The constructed vector is pushed onto the stack. + +\item[45:] \hspace{2em} {\tt FOP-LAYOUT} \hspace{2em} \\ +Pops the stack four times to get the name, length, inheritance and depth for a layout object. + +\item[46:] \hspace{2em} {\tt FOP-SINGLE-FLOAT} \hspace{2em} {\it data}(4) \hspace{2em} +$\Rightarrow$ \hspace{2em} stack \\ +The {\it data} bytes are read as an integer, then turned into an IEEE single +float (as though by {\tt make-single-float}). + +\item[47:] \hspace{2em} {\tt FOP-DOUBLE-FLOAT} \hspace{2em} {\it data}(8) \hspace{2em} +$\Rightarrow$ \hspace{2em} stack \\ +The {\it data} bytes are read as an integer, then turned into an IEEE double +float (as though by {\tt make-double-float}). + +\item[48:] \hspace{2em} {\tt FOP-STRUCT} \hspace{2em} {\it n}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The four-byte operand {\it n} specifies the length structure to construct. The +elements of the vector are popped off the stack; the first one popped becomes +the last element of the structure. The constructed vector is pushed onto the +stack. + +\item[49:] \hspace{2em} {\tt FOP-SMALL-STRUCT} \hspace{2em} {\it n}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The one-byte operand {\it n} specifies the length structure to construct. The +elements of the vector are popped off the stack; the first one popped becomes +the last element of the structure. The constructed vector is pushed onto the +stack. + +\item[50-52:] Unused + +\item[53:] \hspace{2em} {\tt FOP-EVAL} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +Pop an item from the stack and evaluate it (give it to {\tt EVAL}). +Push the result back onto the stack. + +\item[54:] \hspace{2em} {\tt FOP-EVAL-FOR-EFFECT} \\ +Pop an item from the stack and evaluate it (give it to {\tt EVAL}). +The result is ignored. + +\item[55:] \hspace{2em} {\tt FOP-FUNCALL} \hspace{2em} {\it nargs}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +Pop {\it nargs}+1 items from the stack and apply the last one popped +as a function to +all the rest as arguments (the first one popped being the last argument). +Push the result back onto the stack. + +\item[56:] \hspace{2em} {\tt FOP-FUNCALL-FOR-EFFECT} \hspace{2em} {\it nargs}(1) \\ +Pop {\it nargs}+1 items from the stack and apply the last one popped +as a function to +all the rest as arguments (the first one popped being the last argument). +The result is ignored. + +\item[57:] \hspace{2em} {\tt FOP-CODE-FORMAT} \hspace{2em} {\it implementation}(1) +\hspace{2em} {\it version}(1) \\ +This FOP specifiers the code format for following code objects. The operations +{\tt FOP-CODE} and its relatives may not occur in a group until after {\tt +FOP-CODE-FORMAT} has appeared; there is no default format. The {\it +implementation} is an integer indicating the target hardware and environment. +See {\tt compiler/generic/vm-macs.lisp} for the currently defined +implementations. {\it version} for an implementation is increased whenever +there is a change that renders old fasl files unusable. + +\item[58:] \hspace{2em} {\tt FOP-CODE} \hspace{2em} {\it nitems}(4) \hspace{2em} {\it size}(4) \hspace{2em} +{\it code}({\it size}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +A compiled function is constructed and pushed onto the stack. +This object is in the format specified by the most recent +occurrence of {\tt FOP-CODE-FORMAT}. +The operand {\it nitems} specifies a number of items to pop off +the stack to use in the ``boxed storage'' section. The operand {\it code} +is a string of bytes constituting the compiled executable code. + +\item[59:] \hspace{2em} {\tt FOP-SMALL-CODE} \hspace{2em} {\it nitems}(1) \hspace{2em} {\it size}(2) \hspace{2em} +{\it code}({\it size}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +A compiled function is constructed and pushed onto the stack. +This object is in the format specified by the most recent +occurrence of {\tt FOP-CODE-FORMAT}. +The operand {\it nitems} specifies a number of items to pop off +the stack to use in the ``boxed storage'' section. The operand {\it code} +is a string of bytes constituting the compiled executable code. + +\item[60] \hspace{2em} {\tt FOP-FDEFINITION} \hspace{2em} \\ +Pops the stack to get an fdefinition. + +\item[61] \hspace{2em} {\tt FOP-SANCTIFY-FOR-EXECUTION} \hspace{2em} \\ +A code component is popped from the stack, and the necessary magic is applied +to the code so that it can be executed. + +\item[62:] \hspace{2em} {\tt FOP-VERIFY-TABLE-SIZE} \hspace{2em} {\it size}(4) \\ +If the current size of the table is not equal to {\it size}, +then an inconsistency has been detected. This operation +is inserted into a Fasload file purely for error-checking purposes. +It is good practice for a compiler to output this at least at the +end of every group, if not more often. + +\item[63:] \hspace{2em} {\tt FOP-VERIFY-EMPTY-STACK} \\ +If the stack is not currently empty, +then an inconsistency has been detected. This operation +is inserted into a Fasload file purely for error-checking purposes. +It is good practice for a compiler to output this at least at the +end of every group, if not more often. + +\item[64:] \hspace{2em} {\tt FOP-END-GROUP} \\ +This is the last operation of a group. If this is not the +last byte of the file, then a new group follows; the next +nine bytes must be ``{\tt FASL FILE}''. + +\item[65:] \hspace{2em} {\tt FOP-POP-FOR-EFFECT} \hspace{2em} stack \hspace{2em} $\Rightarrow$ \hspace{2em} \\ +One item is popped from the stack. + +\item[66:] \hspace{2em} {\tt FOP-MISC-TRAP} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +A trap object is pushed onto the stack. + +\item[67:] \hspace{2em} {\tt FOP-DOUBLE-DOUBLE-FLOAT} \hspace{2em} {\it double-double-float}(8) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The next 8 bytes are read, and a double-double-float number is constructed. + +\item[68:] \hspace{2em} {\tt FOP-CHARACTER} \hspace{2em} {\it character}(3) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +The three bytes are read as an integer then converted to a character. This FOP +is currently rather useless, as extended characters are not supported. + +\item[69:] \hspace{2em} {\tt FOP-SHORT-CHARACTER} \hspace{2em} {\it character}(1) \hspace{2em} +$\Rightarrow$ \hspace{2em} stack \\ +The one byte specifies the code of a Common Lisp character object. A character +is constructed and pushed onto the stack. + +\item[70:] \hspace{2em} {\tt FOP-RATIO} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +Creates a ratio from two integers popped from the stack. +The denominator is popped first, the numerator second. + +\item[71:] \hspace{2em} {\tt FOP-COMPLEX} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +Creates a complex number from two numbers popped from the stack. +The imaginary part is popped first, the real part second. + +\item[72] \hspace{2em} {\tt FOP-COMPLEX-SINGLE-FLOAT} {\it real(4)} {\it imag(4)}\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +Creates a complex single-float number from the following 8 bytes. + +\item[73] \hspace{2em} {\tt FOP-COMPLEX-DOUBLE-FLOAT} {\it real(8)} {\it imag(8)}\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ +Creates a complex double-float number from the following 16 bytes. + + +\item[74:] \hspace{2em} {\tt FOP-FSET} \hspace{2em} \\ +Except in the cold loader (Genesis), this is a no-op with two stack arguments. +In the initial core this is used to make DEFUN functions defined at cold-load +time so that global functions can be called before top-level forms are run +(which normally installs definitions.) Genesis pops the top two things off of +the stack and effectively does (SETF SYMBOL-FUNCTION). + +\item[75:] \hspace{2em} {\tt FOP-LISP-SYMBOL-SAVE} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ +Like {\tt FOP-SYMBOL-SAVE}, except that it creates a symbol in the LISP +package. + +\item[76:] \hspace{2em} {\tt FOP-LISP-SMALL-SYMBOL-SAVE} \hspace{2em} {\it n}(1) +\hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack +\& table\\ +Like {\tt FOP-SMALL-SYMBOL-SAVE}, except that it creates a symbol in the LISP +package. + +\item[77:] \hspace{2em} {\tt FOP-KEYWORD-SYMBOL-SAVE} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ +Like {\tt FOP-SYMBOL-SAVE}, except that it creates a symbol in the +KEYWORD package. + +\item[78:] \hspace{2em} {\tt FOP-KEYWORD-SMALL-SYMBOL-SAVE} \hspace{2em} {\it n}(1) +\hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack +\& table\\ +Like {\tt FOP-SMALL-SYMBOL-SAVE}, except that it creates a symbol in the +KEYWORD package. + +\item[79-80:] Unused + +\item[81:] \hspace{2em} {\tt FOP-NORMAL-LOAD}\\ +This FOP is used in conjunction with the cold loader (Genesis) to read +top-level package manipulation forms. These forms are to be read as though by +the normal loaded, so that they can be evaluated at cold load time, instead of +being dumped into the initial core image. A no-op in normal loading. + +\item[82:] \hspace{2em} {\tt FOP-MAYBE-COLD-LOAD}\\ +Undoes the effect of {\tt FOP-NORMAL-LOAD}. + +\item[83:] \hspace{2em} {\tt FOP-ARRAY} \hspace{2em} {\it rank}(4) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +This operation creates a simple array header (used for simple-arrays with rank +/= 1). The data vector is popped off of the stack, and then {\it rank} +dimensions are popped off of the stack (the highest dimensions is on top.) + +\item[84:] \hspace{2em} {\tt FOP-SINGLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) + \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Creates a {\it (simple-array single-float (*))} object. The number of single-floats is {\it length}. + +\item[85:] \hspace{2em} {\tt FOP-DOUBLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) + \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Creates a {\it (simple-array double-float (*))} object. The number of double-floats is {\it length}. + +\item[86:] \hspace{2em} {\tt FOP-COMPLEX-SINGLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) + \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Creates a {\it (simple-array (complex single-float) (*))} object. The number of complex single-floats is {\it length}. + +\item[87:] \hspace{2em} {\tt FOP-COMPLEX-DOUBLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) + \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Creates a {\it (simple-array (complex double-float) (*))} object. The number of complex double-floats is {\it length}. + +\item[88:] \hspace{2em} {\tt FOP-DOUBLE-DOUBLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) + \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Creates a {\it (simple-array double-double-float (*))} object. The number of double-double-floats is {\it length}. + +\item[89:] \hspace{2em} {\tt FOP-COMPLEX-DOUBLE-DOUBLE-FLOAT} \hspace{2em} {\it data}(32) + \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Creates a {\it (complex double-double-float)} object from the following 32 bytes of data. + +\item[90:] \hspace{2em} {\tt FOP-COMPLEX-DOUBLE-DOUBLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) + \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Creates a {\it (simple-arra (complex double-double-float) (*))} object. The number of complex double-double-floats is {\it length}. + +\item[91-139:] Unused + +\item[140:] \hspace{2em} {\tt FOP-ALTER-CODE} \hspace{2em} {\it index}(4)\\ +This operation modifies the constants part of a code object (necessary for +creating certain circular function references.) It pops the new value and code +object are off of the stack, storing the new value at the specified index. + +\item[141:] \hspace{2em} {\tt FOP-BYTE-ALTER-CODE} \hspace{2em} {\it index}(1)\\ +Like {\tt FOP-ALTER-CODE}, but has only a one byte offset. + +\item[142:] \hspace{2em} {\tt FOP-FUNCTION-ENTRY} \hspace{2em} {\it index}(4) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Initializes a function-entry header inside of a pre-existing code object, and +returns the corresponding function descriptor. {\it index} is the byte offset +inside of the code object where the header should be plunked down. The stack +arguments to this operation are the code object, function name, function debug +arglist and function type. + +\item[143:] \hspace{2em} {\tt FOP-MAKE-BYTE-COMPILED-FUNCTION} \hspace{2em} {\it size}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Create a byte-compiled function. {\it FIXME:} describe what's on the stack. + +\item[144:] \hspace{2em} {\tt FOP-ASSEMBLER-CODE} \hspace{2em} {\it length}(4) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +This operation creates a code object holding assembly routines. {\it length} +bytes of code are read and placed in the code object, and the code object +descriptor is pushed on the stack. This FOP is only recognized by the cold +loader (Genesis.) + +\item[145:] \hspace{2em} {\tt FOP-ASSEMBLER-ROUTINE} \hspace{2em} {\it offset}(4) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +This operation records an entry point into an assembler code object (for use +with {\tt FOP-ASSEMBLER-FIXUP}). The routine name (a symbol) is on stack top. +The code object is underneath. The entry point is defined at {\it offset} +bytes inside the code area of the code object, and the code object is left on +stack top (allowing multiple uses of this FOP to be chained.) This FOP is only +recognized by the cold loader (Genesis.) + +\item[146:] Unused + +\item[147:] \hspace{2em} {\tt FOP-FOREIGN-FIXUP} \hspace{2em} {\it len}(1) +\hspace{2em} {\it name}({\it len}) +\hspace{2em} {\it offset}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +This operation resolves a reference to a foreign (C) symbol. {\it len} bytes +are read and interpreted as the symbol {\it name}. First the {\it kind} and the +code-object to patch are popped from the stack. The kind is a target-dependent +symbol indicating the instruction format of the patch target (at {\it offset} +bytes from the start of the code area.) The code object is left on +stack top (allowing multiple uses of this FOP to be chained.) + +\item[148:] \hspace{2em} {\tt FOP-ASSEMBLER-FIXUP} \hspace{2em} {\it offset}(4) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +This operation resolves a reference to an assembler routine. The stack args +are ({\it routine-name}, {\it kind} and {\it code-object}). The kind is a +target-dependent symbol indicating the instruction format of the patch target +(at {\it offset} bytes from the start of the code area.) The code object is +left on stack top (allowing multiple uses of this FOP to be chained.) + +\item[149:] \hspace{2em} {\tt FOP-CODE-OBJECT-FIXUP} +\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +{\it FIXME:} Describe what this does! + +\item[150:] \hspace{2em} {\tt FOP-FOREIGN-DATA-FIXUP} +\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +{\it FIXME:} Describe what this does! + +\item[151-156:] Unused + +\item[157:] \hspace{2em} {\tt FOP-LONG-CODE-FORMAT} \hspace{2em} {\it implementation}(1) +\hspace{2em} {\it version}(4) \\ +Like FOP-CODE-FORMAT, except that the version is 32 bits long. + +\item[158-199:] Unused + +\item[200:] \hspace{2em} {\tt FOP-RPLACA} \hspace{2em} {\it table-idx}(4) +\hspace{2em} {\it cdr-offset}(4)\\ + +\item[201:] \hspace{2em} {\tt FOP-RPLACD} \hspace{2em} {\it table-idx}(4) +\hspace{2em} {\it cdr-offset}(4)\\ +These operations destructively modify a list entered in the table. {\it +table-idx} is the table entry holding the list, and {\it cdr-offset} designates +the cons in the list to modify (like the argument to {\tt nthcdr}.) The new +value is popped off of the stack, and stored in the {\tt car} or {\tt cdr}, +respectively. + +\item[202:] \hspace{2em} {\tt FOP-SVSET} \hspace{2em} {\it table-idx}(4) +\hspace{2em} {\it vector-idx}(4)\\ +Destructively modifies a {\tt simple-vector} entered in the table. Pops the +new value off of the stack, and stores it in the {\it vector-idx} element of +the contents of the table entry {\it table-idx.} + +\item[203:] \hspace{2em} {\tt FOP-NTHCDR} \hspace{2em} {\it cdr-offset}(4) +\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ +Does {\tt nthcdr} on the top-of stack, leaving the result there. + +\item[204:] \hspace{2em} {\tt FOP-STRUCTSET} \hspace{2em} {\it table-idx}(4) +\hspace{2em} {\it vector-idx}(4)\\ +Like {\tt FOP-SVSET}, except it alters structure slots. + +\item[205-254:] Unused +\item[255:] \hspace{2em} {\tt FOP-END-HEADER} \\ Indicates the end of a group header, +as described above. +\end{description} diff --git a/doc/internals/cmu/front.tex b/doc/internals/cmu/front.tex new file mode 100644 index 0000000000..1861c07b44 --- /dev/null +++ b/doc/internals/cmu/front.tex @@ -0,0 +1,968 @@ +\chapter{ICR conversion} % -*- Dictionary: design -*- + + +\section{Canonical forms} + +\#| + +Would be useful to have a Freeze-Type proclamation. Its primary use would be +to say that the indicated type won't acquire any new subtypes in the future. +This allows better open-coding of structure type predicates, since the possible +types that would satisfy the predicate will be constant at compile time, and +thus can be compiled as a skip-chain of EQ tests. + +Of course, this is only a big win when the subtypes are few: the most important +case is when there are none. If the closure of the subtypes is much larger +than the average number of supertypes of an inferior, then it is better to grab +the list of superiors out of the object's type, and test for membership in that +list. + +Should type-specific numeric equality be done by EQL rather than =? i.e. +should = on two fixnums become EQL and then convert to EQL/FIXNUM? +Currently we transform EQL into =, which is complicated, since we have to prove +the operands are the class of numeric type before we do it. Also, when EQL +sees one operand is a FIXNUM, it transforms to EQ, but the generator for EQ +isn't expecting numbers, so it doesn't use an immediate compare. + + +\subsection{Array hackery} + +Array type tests are transformed to \verb|%array-typep|, separation of the +implementation-dependent array-type handling. This way we can transform +STRINGP to: + +\begin{verbatim} + (or (simple-string-p x) + (and (complex-array-p x) + (= (array-rank x) 1) + (simple-string-p (%array-data x)))) +\end{verbatim} + +In addition to the similar bit-vector-p, we also handle vectorp and any type +tests on which the a dimension isn't wild. +[Note that we will want to expand into frobs compatible with those that +array references expand into so that the same optimizations will work on both.] + +These changes combine to convert hairy type checks into hairy typep's, and then +convert hairyp typeps into simple typeps. + + +Do we really need non-VOP templates? It seems that we could get the +desired effect through implementation-dependent ICR transforms. The +main risk would be of obscuring the type semantics of the code. We +could fairly easily retain all the type information present at the +time the tranform is run, but if we discover new type information, +then it won't be propagated unless the VM also supplies type inference +methods for its internal frobs (precluding the use of +\verb|%PRIMITIVE|, since primitives don't have derive-type methods.) + +I guess one possibility would be to have the call still considered ``known'' even +though it has been transformed. But this doesn't work, since we start doing +LET optimizations that trash the arglist once the call has been transformed +(and indeed we want to.) + +Actually, I guess the overhead for providing type inference methods for the +internal frobs isn't that great, since we can usually borrow the inference +method for a Common Lisp function. For example, in our AREF case: + +\begin{verbatim} + (aref x y) +==> + (let ((#:len (array-dimension x 0))) + (%unchecked-aref x (%check-in-bounds y #:len))) +\end{verbatim} + +Now in this case, if we made \verb|%UNCHECKED-AREF| have the same +derive-type method as AREF, then if we discovered something new about +X's element type, we could derive a new type for the entire +expression. + +Actually, it seems that baring this detail at the ICR level is +beneficial, since it admits the possibility of optimizing away the bounds +check using type information. If we discover X's dimensions, then +\verb|#:LEN| becomes a constant that can be substituted. Then +\verb|%CHECK-IN-BOUNDS| can notice that the bound is constant and +check it against the type for Y. If Y is known to be in range, then we +can optimize away the bounds check. + +Actually in this particular case, the best thing to do would be if we +discovered the bound is constant, then replace the bounds check with an +implicit type check. This way all the type check optimization mechanisms would +be brought into the act. + +So we actually want to do the bounds-check expansion as soon as possible, +rather than later than possible: it should be a source-transform, enabled by +the fast-safe policy. + +With multi-dimensional arrays we probably want to explicitly do the index +computation: this way portions of the index computation can become loop +invariants. In a scan in row-major order, the inner loop wouldn't have to do +any multiplication: it would only do an addition. We would use normal +fixnum arithmetic, counting on * to cleverly handle multiplication by a +constant, and appropriate inline expansion. + +Note that in a source transform, we can't make any assumptions the type of the +array. If it turns out to be a complex array without declared dimensions, then +the calls to ARRAY-DIMENSION will have to turn into a VOP that can be affected. +But if it is simple, then the VOP is unaffected, and if we know the bounds, it +is constant. Similarly, we would have %ARRAY-DATA and %ARRAY-DISPLACEMENT +operations. %ARRAY-DISPLACEMENT would optimize to 0 if we discover the array +is simple. [This is somewhat inefficient when the array isn't eventually +discovered to be simple, since finding the data and finding the displacement +duplicate each other. We could make %ARRAY-DATA return both as MVs, and then +optimize to (VALUES (%SIMPLE-ARRAY-DATA x) 0), but this would require +optimization of trivial VALUES uses.] + +Also need (THE (ARRAY * * * ...) x) to assert correct rank. + +|\# + +A bunch of functions have source transforms that convert them into the +canonical form that later parts of the compiler want to see. It is not legal +to rely on the canonical form since source transforms can be inhibited by a +Notinline declaration. This shouldn't be a problem, since everyone should keep +their hands off of Notinline calls. + +Some transformations: +\begin{verbatim} +Endp ==> (NULL (THE LIST ...)) +(NOT xxx) or (NULL xxx) => (IF xxx NIL T) + +(typep x '<simple type>) => (<simple predicate> x) +(typep x '<complex type>) => ...composition of simpler operations... +\end{verbatim} + +TYPEP of AND, OR and NOT types turned into conditionals over multiple TYPEP +calls. This makes hairy TYPEP calls more digestible to type constraint +propagation, and also means that the TYPEP code generators don't have to deal +with these cases. [\#\#\# In the case of union types we may want to do something +to preserve information for type constraint propagation.] + + +\begin{verbatim} + (apply \#'foo a b c) +==> + (multiple-value-call \#'foo (values a) (values b) (values-list c)) +\end{verbatim} + +This way only MV-CALL needs to know how to do calls with unknown numbers of +arguments. It should be nearly as efficient as a special-case VMR-Convert +method could be. + + +\begin{verbatim} +Make-String => Make-Array +N-arg predicates associated into two-arg versions. +Associate N-arg arithmetic ops. +Expand CxxxR and FIRST...nTH +Zerop, Plusp, Minusp, 1+, 1-, Min, Max, Rem, Mod +(Values x), (Identity x) => (Prog1 x) + +All specialized aref functions => (aref (the xxx) ...) +\end{verbatim} + +Convert (ldb (byte ...) ...) into internal frob that takes size and position as +separate args. Other byte functions also... + +Change for-value primitive predicates into \verb+(if <pred> t nil)+. This isn't +particularly useful during ICR phases, but makes life easy for VMR conversion. + + +This last can't be a source transformation, since a source transform can't tell +where the form appears. Instead, ICR conversion special-cases calls to known +functions with the Predicate attribute by doing the conversion when the +destination of the result isn't an IF. It isn't critical that this never be +done for predicates that we ultimately discover to deliver their value to an +IF, since IF optimizations will flush unnecessary IFs in a predicate. + + +\section{Inline functions} + +[\#\#\# Inline expansion is especially powerful in the presence of good lisp-level +optimization (``partial evaluation''). Many ``optimizations'' usually done in Lisp +compilers by special-case source-to-source transforms can be had simply by +making the source of the general case function available for inline expansion. +This is especially helpful in Common Lisp, which has many commonly used +functions with simple special cases but bad general cases (list and sequence +functions, for example.) + +Inline expansion of recursive functions is allowed, and is not as silly as it +sounds. When expanded in a specific context, much of the overhead of the +recursive calls may be eliminated (especially if there are many keyword +arguments, etc.) + +[Also have MAYBE-INLINE] +] + +We only record a function's inline expansion in the global environment when the +function is in the null lexical environment, since the expansion must be +represented as source. + +We do inline expansion of functions locally defined by FLET or LABELS even when +the environment is not null. Since the appearances of the local function must +be nested within the desired environment, it is possible to expand local +functions inline even when they use the environment. We just stash the source +form and environments in the Functional for the local function. When we +convert a call to it, we just reconvert the source in the saved environment. + +An interesting alternative to the inline/full-call dichotomy is ``semi-inline'' +coding. Whenever we have an inline expansion for a function, we can expand it +only once per block compilation, and then use local call to call this copied +version. This should get most of the speed advantage of real inline coding +with much less code bloat. This is especially attractive for simple system +functions such as Read-Char. + +The main place where true inline expansion would still be worth doing is where +large amounts of the function could be optimized away by constant folding or +other optimizations that depend on the exact arguments to the call. + + + +\section{Compilation policy} + +We want more sophisticated control of compilation safety than is offered in CL, +so that we can emit only those type checks that are likely to discover +something (i.e. external interfaces.) + + + +\section{Notes} + +Generalized back-end notion provides dynamic retargeting? (for byte code) + +The current node type annotations seem to be somewhat unsatisfactory, since we +lose information when we do a THE on a continuation that already has uses, or +when we convert a let where the actual result continuation has other uses. + +But the case with THE isn't really all that bad, since the test of whether +there are any uses happens before conversion of the argument, thus THE loses +information only when there are uses outside of the declared form. The LET +case may not be a big deal either. + +Note also that losing user assertions isn't really all that bad, since it won't +damage system integrity. At worst, it will cause a bug to go undetected. More +likely, it will just cause the error to be signaled in a different place (and +possibly in a less informative way). Of course, there is an efficiency hit for +losing type information, but if it only happens in strange cases, then this +isn't a big deal. + + +\chapter{Local call analysis} + +All calls to local functions (known named functions and LETs) are resolved to +the exact LAMBDA node which is to be called. If the call is syntactically +illegal, then we emit a warning and mark the reference as :notinline, forcing +the call to be a full call. We don't even think about converting APPLY calls; +APPLY is not special-cased at all in ICR. We also take care not to convert +calls in the top-level component, which would join it to normal code. Calls to +functions with rest args and calls with non-constant keywords are also not +converted. + +We also convert MV-Calls that look like MULTIPLE-VALUE-BIND to local calls, +since we know that they can be open-coded. We replace the optional dispatch +with a call to the last optional entry point, letting MV-Call magically default +the unsupplied values to NIL. + +When ICR optimizations discover a possible new local call, they explicitly +invoke local call analysis on the code that needs to be reanalyzed. + +[\#\#\# Let conversion. What it means to be a let. Argument type checking done +by caller. Significance of local call is that all callers are known, so +special call conventions may be used.] +A lambda called in only one place is called a ``let'' call, since a Let would +turn into one. + +In addition to enabling various ICR optimizations, the let/non-let distinction +has important environment significance. We treat the code in function and all +of the lets called by that function as being in the same environment. This +allows exits from lets to be treated as local exits, and makes life easy for +environment analysis. + +Since we will let-convert any function with only one call, we must be careful +about cleanups. It is possible that a lexical exit from the let function may +have to clean up dynamic bindings not lexically apparent at the exit point. We +handle this by annotating lets with any cleanup in effect at the call site. +The cleanup for continuations with no immediately enclosing cleanup is the +lambda that the continuation is in. In this case, we look at the lambda to see +if any cleanups need to be done. + +Let conversion is disabled for entry-point functions, since otherwise we might +convert the call from the XEP to the entry point into a let. Then later on, we +might want to convert a non-local reference into a local call, and not be able +to, since once a function has been converted to a let, we can't convert it +back. + + +A function's return node may also be deleted if it is unreachable, which can +happen if the function never returns normally. Such functions are not lets. + + +\chapter{Find components} + +This is a post-pass to ICR conversion that massages the flow graph into the +shape subsequent phases expect. Things done: + Compute the depth-first ordering for the flow graph. + Find the components (disconnected parts) of the flow graph. + +This pass need only be redone when newly converted code has been added to the +flow graph. The reanalyze flag in the component structure should be set by +people who mess things up. + +We create the initial DFO using a variant of the basic algorithm. The initial +DFO computation breaks the ICR up into components, which are parts that can be +compiled independently. This is done to increase the efficiency of large block +compilations. In addition to improving locality of reference and reducing the +size of flow analysis problems, this allows back-end data structures to be +reclaimed after the compilation of each component. + +ICR optimization can change the connectivity of the flow graph by discovering +new calls or eliminating dead code. Initial DFO determination splits up the +flow graph into separate components, but does so conservatively, ensuring that +parts that might become joined (due to local call conversion) are joined from +the start. Initial DFO computation also guarantees that all code which shares +a lexical environment is in the same component so that environment analysis +needs to operate only on a single component at a time. + +[This can get a bit hairy, since code seemingly reachable from the +environment entry may be reachable from a NLX into that environment. Also, +function references must be considered as links joining components even though +the flow graph doesn't represent these.] + +After initial DFO determination, components are neither split nor joined. The +standard DFO computation doesn't attempt to split components that have been +disconnected. + + +\chapter{ICR optimize} + +{\bf Somewhere describe basic ICR utilities: continuation-type, +constant-continuation-p, etc. Perhaps group by type in ICR description?} + +We are conservative about doing variable-for-variable substitution in ICR +optimization, since if we substitute a variable with a less restrictive type, +then we may prevent use of a ``good'' representation within the scope of the +inner binding. + +Note that variable-variable substitutions aren't really crucial in ICR, since +they don't create opportunities for new optimizations (unlike substitution of +constants and functions). A spurious variable-variable binding will show up as +a Move operation in VMR. This can be optimized away by reaching-definitions +and also by targeting. [\#\#\# But actually, some optimizers do see if operands +are the same variable.] + +\#| + +The IF-IF optimization can be modeled as a value driven optimization, since +adding a use definitely is cause for marking the continuation for +reoptimization. [When do we add uses? Let conversion is the only obvious +time.] I guess IF-IF conversion could also be triggered by a non-immediate use +of the test continuation becoming immediate, but to allow this to happen would +require Delete-Block (or somebody) to mark block-starts as needing to be +reoptimized when a predecessor changes. It's not clear how important it is +that IF-IF conversion happen under all possible circumstances, as long as it +happens to the obvious cases. + +[\#\#\# It isn't totally true that code flushing never enables other worthwhile +optimizations. Deleting a functional reference can cause a function to cease +being an XEP, or even trigger let conversion. It seems we still want to flush +code during ICR optimize, but maybe we want to interleave it more intimately +with the optimization pass. + +Ref-flushing works just as well forward as backward, so it could be done in the +forward pass. Call flushing doesn't work so well, but we could scan the block +backward looking for any new flushable stuff if we flushed a call on the +forward pass. + +When we delete a variable due to lack of references, we leave the variable +in the lambda-list so that positional references still work. The initial value +continuation is flushed, though (replaced with NIL) allowing the initial value +for to be deleted (modulo side-effects.) + +Note that we can delete vars with no refs even when they have sets. I guess +when there are no refs, we should also flush all sets, allowing the value +expressions to be flushed as well. + +Squeeze out single-reference unset let variables by changing the dest of the +initial value continuation to be the node that receives the ref. This can be +done regardless of what the initial value form is, since we aren't actually +moving the evaluation. Instead, we are in effect using the continuation's +locations in place of the temporary variable. + +Doing this is of course, a wild violation of stack discipline, since the ref +might be inside a loop, etc. But with the VMR back-end, we only need to +preserve stack discipline for unknown-value continuations; this ICR +transformation must be already inhibited when the DEST of the REF is a +multiple-values receiver (EXIT, RETURN or MV-COMBINATION), since we must +preserve the single-value semantics of the let-binding in this case. + +The REF and variable must be deleted as part of this operation, since the ICR +would otherwise be left in an inconsistent state; we can't wait for the REF to +be deleted due to being unused, since we have grabbed the arg continuation and +substituted it into the old DEST. + +The big reason for doing this transformation is that in macros such as INCF and +PSETQ, temporaries are squeezed out, and the new value expression is evaluated +directly to the setter, allowing any result type assertion to be applied to the +expression evaluation. Unlike in the case of substitution, there is no point +in inhibiting this transformation when the initial value type is weaker than +the variable type. Instead, we intersect the asserted type for the old REF's +CONT with the type assertion on the initial value continuation. Note that the +variable's type has already been asserted on the initial-value continuation. + +Of course, this transformation also simplifies the ICR even when it doesn't +discover interesting type assertions, so it makes sense to do it whenever +possible. This reduces the demands placed on register allocation, etc. + + +There are three dead-code flushing rules: + +\begin{enumerate} +\item Refs with no DEST may be flushed. + +\item Known calls with no dest that are flushable may be flushed. We null the +DEST in all the args. + +\item If a lambda-var has no refs, then it may be deleted. The flushed + argument continuations have their DEST nulled. +\end{enumerate} + +These optimizations all enable one another. We scan blocks backward, looking +for nodes whose CONT has no DEST, then type-dispatching off of the node. If we +delete a ref, then we check to see if it is a lambda-var with no refs. When we +flush an argument, we mark the blocks for all uses of the CONT as needing to be +reoptimized. + + +\section{Goals for ICR optimizations} + +\#| + +When an optimization is disabled, code should still be correct and not +ridiculously inefficient. Phases shouldn't be made mandatory when they have +lots of non-required stuff jammed into them. + +|\# + +This pass is optional, but is desirable if anything is more important than +compilation speed. + +This phase is a grab-bag of optimizations that concern themselves with the flow +of values through the code representation. The main things done are type +inference, constant folding and dead expression elimination. This phase can be +understood as a walk of the expression tree that propagates assertions down the +tree and propagates derived information up the tree. The main complication is +that there isn't any expression tree, since ICR is flow-graph based. + +We repeat this pass until we don't discover anything new. This is a bit of +feat, since we dispatch to arbitrary functions which may do arbitrary things, +making it hard to tell if anything really happened. Even if we solve this +problem by requiring people to flag when they changed or by checking to see if +they changed something, there are serious efficiency problems due to massive +redundant computation, since in many cases the only way to tell if anything +changed is to recompute the value and see if it is different from the old one. + +We solve this problem by requiring that optimizations for a node only depend on +the properties of the CONT and the continuations that have the node as their +DEST. If the continuations haven't changed since the last pass, then we don't +attempt to re-optimize the node, since we know nothing interesting will happen. + +We keep track of which continuations have changed by a REOPTIMIZE flag that is +set whenever something about the continuation's value changes. + +When doing the bottom up pass, we dispatch to type specific code that knows how +to tell when a node needs to be reoptimized and does the optimization. These +node types are special-cased: COMBINATION, IF, RETURN, EXIT, SET. + +The REOPTIMIZE flag in the COMBINATION-FUN is used to detect when the function +information might have changed, so that we know when there are new assertions +that could be propagated from the function type to the arguments. + +When we discover something about a leaf, or substitute for leaf, we reoptimize +the CONT for all the REF and SET nodes. + +We have flags in each block that indicate when any nodes or continuations in +the block need to be re-optimized, so we don't have to scan blocks where there +is no chance of anything happening. + +It is important for efficiency purposes that optimizers never say that they did +something when they didn't, but this by itself doesn't guarantee timely +termination. I believe that with the type system implemented, type inference +will converge in finite time, but as a practical matter, it can take far too +long to discover not much. For this reason, ICR optimization is terminated +after three consecutive passes that don't add or delete code. This premature +termination only happens 2\% of the time. + + +\section{Flow graph simplification} + +Things done: + +\begin{itemize} +\item Delete blocks with no predecessors. +\item Merge blocks that can be merged. +\item Convert local calls to Let calls. +\item Eliminate degenerate IFs. +\end{itemize} + +We take care not to merge blocks that are in different functions or have +different cleanups. This guarantees that non-local exits are always at block +ends and that cleanup code never needs to be inserted within a block. + +We eliminate IFs with identical consequent and alternative. This would most +likely happen if both the consequent and alternative were optimized away. + +[Could also be done if the consequent and alternative were different blocks, +but computed the same value. This could be done by a sort of cross-jumping +optimization that looked at the predecessors for a block and merged code shared +between predecessors. IFs with identical branches would eventually be left +with nothing in their branches.] + +We eliminate IF-IF constructs: + +\begin{verbatim} + (IF (IF A B C) D E) ==> + (IF A (IF B D E) (IF C D E)) +\end{verbatim} + +In reality, what we do is replicate blocks containing only an IF node where the +predicate continuation is the block start. We make one copy of the IF node for +each use, leaving the consequent and alternative the same. If you look at the +flow graph representation, you will see that this is really the same thing as +the above source to source transformation. + + +\section{Forward ICR optimizations} + +In the forward pass, we scan the code in forward depth-first order. We +examine each call to a known function, and: + +\begin{itemize} +\item Eliminate any bindings for unused variables. + +\item Do top-down type assertion propagation. In local calls, we propagate +asserted and derived types between the call and the called lambda. + +\item + Replace calls of foldable functions with constant arguments with the + result. We don't have to actually delete the call node, since Top-Down + optimize will delete it now that its value is unused. + +\item + Run any Optimizer for the current function. The optimizer does arbitrary + transformations by hacking directly on the IR. This is useful primarily + for arithmetic simplification and similar things that may need to examine + and modify calls other than the current call. The optimizer is responsible + for recording any changes that it makes. An optimizer can inhibit further + optimization of the node during the current pass by returning true. This + is useful when deleting the node. + +\item + Do ICR transformations, replacing a global function call with equivalent + inline lisp code. + +\item + Do bottom-up type propagation/inferencing. For some functions such as + Coerce we will dispatch to a function to find the result type. The + Derive-Type function just returns a type structure, and we check if it is + different from the old type in order to see if there was a change. + +\item + Eliminate IFs with predicates known to be true or false. + +\item + Substitute the value for unset let variables that are bound to constants, + unset lambda variables or functionals. + +\item + Propagate types from local call args to var refs. +\end{itemize} + +We use type info from the function continuation to find result types for +functions that don't have a derive-type method. + + +\subsection{ICR transformation} + +ICR transformation does ``source to source'' transformations on known global +functions, taking advantage of semantic information such as argument types and +constant arguments. Transformation is optional, but should be done if speed or +space is more important than compilation speed. Transformations which increase +space should pass when space is more important than speed. + +A transform is actually an inline function call where the function is computed +at compile time. The transform gets to peek at the continuations for the +arguments, and computes a function using the information gained. Transforms +should be cautious about directly using the values of constant continuations, +since the compiler must preserve eqlness of named constants, and it will have a +hard time if transforms go around randomly copying constants. + +The lambda that the transform computes replaces the original function variable +reference as the function for the call. This lets the compiler worry about +evaluating each argument once in the right order. We want to be careful to +preserve type information when we do a transform, since it may be less than +obvious what the transformed code does. + +There can be any number of transforms for a function. Each transform is +associated with a function type that the call must be compatible with. A +transform is only invoked if the call has the right type. This provides a way +to deal with the common case of a transform that only applies when the +arguments are of certain types and some arguments are not specified. We always +use the derived type when determining whether a transform is applicable. Type +check is responsible for setting the derived type to the intersection of the +asserted and derived types. + +If the code in the expansion has insufficient explicit or implicit argument +type checking, then it should cause checks to be generated by making +declarations. + +A transformation may decide to pass if it doesn't like what it sees when it +looks at the args. The Give-Up function unwinds out of the transform and deals +with complaining about inefficiency if speed is more important than brevity. +The format args for the message are arguments to Give-Up. If a transform can't +be done, we just record the message where ICR finalize can find it. note. We +can't complain immediately, since it might get transformed later on. + + +\section{Backward ICR optimizations} + +In the backward pass, we scan each block in reverse order, and +eliminate any effectless nodes with unused values. In ICR this is the +only way that code is deleted other than the elimination of unreachable blocks. + + +\chapter{Type checking} + +% Somehow split this section up into three parts: +% -- Conceptual: how we know a check is necessary, and who is responsible for +% doing checks. +% -- Incremental: intersection of derived and asserted types, checking for +% non-subtype relationship. +% -- Check generation phase. + +We need to do a pretty good job of guessing when a type check will ultimately +need to be done. Generic arithmetic, for example: In the absence of +declarations, we will use the safe variant, but if we don't know this, we +will generate a check for NUMBER anyway. We need to look at the fast-safe +templates and guess if any of them could apply. + +We compute a function type from the VOP arguments +and assertions on those arguments. This can be used with Valid-Function-Use +to see which templates do or might apply to a particular call. If we guess +that a safe implementation will be used, then we mark the continuation so as to +force a safe implementation to be chosen. [This will happen if ICR optimize +doesn't run to completion, so the ICR optimization after type check generation +can discover new type information. Since we won't redo type check at that +point, there could be a call that has applicable unsafe templates, but isn't +type checkable.] + +[\#\#\# A better and more general optimization of structure type checks: in type +check conversion, we look at the *original derived* type of the continuation: +if the difference between the proven type and the asserted type is a simple +type check, then check for the negation of the difference. e.g. if we want a +FOO and we know we've got (OR FOO NULL), then test for (NOT NULL). This is a +very important optimization for linked lists of structures, but can also apply +in other situations.] + +If after ICR phases, we have a continuation with check-type set in a context +where it seems likely a check will be emitted, and the type is too +hairy to be easily checked (i.e. no CHECK-xxx VOP), then we do a transformation +on the ICR equivalent to: + +\begin{verbatim} + (... (the hair <foo>) ...) +==> + (... (funcall \#'(lambda (\#:val) + (if (typep \#:val 'hair) + \#:val + (%type-check-error \#:val 'hair))) + <foo>) + ...) +\end{verbatim} +This way, we guarantee that VMR conversion never has to emit type checks for +hairy types. + +[Actually, we need to do a MV-bind and several type checks when there is a MV +continuation. And some values types are just too hairy to check. We really +can't check any assertion for a non-fixed number of values, since there isn't +any efficient way to bind arbitrary numbers of values. (could be done with +MV-call of a more-arg function, I guess...) +] + +[Perhaps only use CHECK-xxx VOPs for types equivalent to a ptype? Exceptions +for CONS and SYMBOL? Anyway, no point in going to trouble to implement and +emit rarely used CHECK-xxx vops.] + +One potential lose in converting a type check to explicit conditionals rather +than to a CHECK-xxx VOP is that VMR code motion optimizations won't be able to +do anything. This shouldn't be much of an issue, though, since type constraint +propagation has already done global optimization of type checks. + + +This phase is optional, but should be done if anything is more important than +compile speed. + +Type check is responsible for reconciling the continuation asserted and derived +types, emitting type checks if appropriate. If the derived type is a subtype +of the asserted type, then we don't need to do anything. + +If there is no intersection between the asserted and derived types, then there +is a manifest type error. We print a warning message, indicating that +something is almost surely wrong. This will inhibit any transforms or +generators that care about their argument types, yet also inhibits further +error messages, since NIL is a subtype of every type. + +If the intersection is not null, then we set the derived type to the +intersection of the asserted and derived types and set the Type-Check flag in +the continuation. We always set the flag when we can't prove that the type +assertion is satisfied, regardless of whether we will ultimately actually emit +a type check or not. This is so other phases such as type constraint +propagation can use the Type-Check flag to detect an interesting type +assertion, instead of having to duplicate much of the work in this phase. +[\#\#\# 7 extremely random values for CONTINUATION-TYPE-CHECK.] + +Type checks are generated on the fly during VMR conversion. When VMR +conversion generates the check, it prints an efficiency note if speed is +important. We don't flame now since type constraint progpagation may decide +that the check is unnecessary. [\#\#\# Not done now, maybe never.] + +In local function call, it is the caller that is in effect responsible for +checking argument types. This happens in the same way as any other type check, +since ICR optimize propagates the declared argument types to the type +assertions for the argument continuations in all the calls. + +Since the types of arguments to entry points are unknown at compile time, we +want to do runtime checks to ensure that the incoming arguments are of the +correct type. This happens without any special effort on the part of type +check, since the XEP is represented as a local call with unknown type +arguments. These arguments will be marked as needing to be checked. + + +\chapter{Constraint propagation} + +New lambda-var-slot: + +constraints: a list of all the constraints on this var for either X or Y. + +How to maintain consistency? Does it really matter if there are constraints +with deleted vars lying around? Note that whatever mechanism we use for +getting the constraints in the first place should tend to keep them up to date. +Probably we would define optimizers for the interesting relations that look at +their CONT's dest and annotate it if it is an IF. + +But maybe it is more trouble then it is worth trying to build up the set of +constraints during ICR optimize (maintaining consistency in the process). +Since ICR optimize iterates a bunch of times before it converges, we would be +wasting time recomputing the constraints, when nobody uses them till constraint +propagation runs. + +It seems that the only possible win is if we re-ran constraint propagation +(which we might want to do.) In that case, we wouldn't have to recompute all +the constraints from scratch. But it seems that we could do this just as well +by having ICR optimize invalidate the affected parts of the constraint +annotation, rather than trying to keep them up to date. This also fits better +with the optional nature of constraint propagation, since we don't want ICR +optimize to commit to doing a lot of the work of constraint propagation. + +For example, we might have a per-block flag indicating that something happened +in that block since the last time constraint propagation ran. We might have +different flags to represent the distinction between discovering a new type +assertion inside the block and discovering something new about an if +predicate, since the latter would be cheaper to update and probably is more +common. + +It's fairly easy to see how we can build these sets of restrictions and +propagate them using flow analysis, but actually using this information seems +a bit more ad-hoc. + +Probably the biggest thing we do is look at all the refs. If we have proven that +the value is EQ (EQL for a number) to some other leaf (constant or lambda-var), +then we can substitute for that reference. In some cases, we will want to do +special stuff depending on the DEST. If the dest is an IF and we proved (not +null), then we can substitute T. And if the dest is some relation on the same +two lambda-vars, then we want to see if we can show that relation is definitely +true or false. + +Otherwise, we can do our best to invert the set of restrictions into a type. +Since types hold only constant info, we have to ignore any constraints between +two vars. We can make some use of negated type restrictions by using +TYPE-DIFFERENCE to remove the type from the ref types. If our inferred type is +as good as the type assertion, then the continuation's type-check flag will be +cleared. + +It really isn't much of a problem that we don't infer union types on joins, +since union types are relatively easy to derive without using flow information. +The normal bottom-up type inference done by ICR optimize does this for us: it +annotates everything with the union of all of the things it might possibly be. +Then constraint propagation subtracts out those types that can't be in effect +because of predicates or checks. + + + +This phase is optional, but is desirable if anything is more important than +compilation speed. We use an algorithm similar to available expressions to +propagate variable type information that has been discovered by implicit or +explicit type tests, or by type inference. + +We must do a pre-pass which locates set closure variables, since we cannot do +flow analysis on such variables. We set a flag in each set closure variable so +that we can quickly tell that it is losing when we see it again. Although this +may seem to be wastefully redundant with environment analysis, the overlap +isn't really that great, and the cost should be small compared to that of the +flow analysis that we are preparing to do. [Or we could punt on set +variables...] + +A type constraint is a structure that includes sset-element and has +the type and variable. [Also a not-p flag indicating whether the sense +is negated.] + +Each variable has a list of its type constraints. We create a type +constraint when we see a type test or check. If there is already a +constraint for the same variable and type, then we just re-use it. If +there is already a weaker constraint, then we generate both the weak +constraints and the strong constraint so that the weak constraints +won't be lost even if the strong one is unavailable. + +We find all the distinct type constraints for each variable during the pre-pass +over the lambda nesting. Each constraint has a list of the weaker constraints +so that we can easily generate them. + +Every block generates all the type constraints in it, but a constraint is +available in a successor only if it is available in all predecessors. We +determine the actual type constraint for a variable at a block by intersecting +all the available type constraints for that variable. + +This isn't maximally tense when there are constraints that are not +hierarchically related, e.g. (or a b) (or b c). If these constraints were +available from two predecessors, then we could infer that we have an (or a b c) +constraint, but the above algorithm would come up with none. This probably +isn't a big problem. + +[\#\#\# Do we want to deal with \verb+(if (eq <var> '<foo>) ...)+ indicating singleton +member type?] + +We detect explicit type tests by looking at type test annotation in the IF +node. If there is a type check, the OUT sets are stored in the node, with +different sets for the consequent and alternative. Implicit type checks are +located by finding Ref nodes whose Cont has the Type-Check flag set. We don't +actually represent the GEN sets, we just initialize OUT to it, and then form +the union in place. + +When we do the post-pass, we clear the Type-Check flags in the continuations +for Refs when we discover that the available constraints satisfy the asserted +type. Any explicit uses of typep should be cleaned up by the ICR optimizer for +typep. We can also set the derived type for Refs to the intersection of the +available type assertions. If we discover anything, we should consider redoing +ICR optimization, since better type information might enable more +optimizations. + + +\chapter{ICR finalize} % -*- Dictionary: design -*- + +This pass looks for interesting things in the ICR so that we can forget about +them. Used and not defined things are flamed about. + +We postpone these checks until now because the ICR optimizations may discover +errors that are not initially obvious. We also emit efficiency notes about +optimizations that we were unable to do. We can't emit the notes immediately, +since we don't know for sure whether a repeated attempt at optimization will +succeed. + +We examine all references to unknown global function variables and update the +approximate type accordingly. We also record the names of the unknown +functions so that they can be flamed about if they are never defined. Unknown +normal variables are flamed about on the fly during ICR conversion, so we +ignore them here. + +We check each newly defined global function for compatibility with previously +recorded type information. If there is no :defined or :declared type, then we +check for compatibility with any approximate function type inferred from +previous uses. + + + +\chapter{Environment analysis} + +A related change would be to annotate ICR with information about tail-recursion +relations. What we would do is add a slot to the node structure that points to +the corresponding Tail-Info when a node is in a TR position. This annotation +would be made in a final ICR pass that runs after cleanup code is generated +(part of environment analysis). When true, the node is in a true TR position +(modulo return-convention incompatibility). When we determine return +conventions, we null out the tail-p slots in XEP calls or known calls where we +decided not to preserve tail-recursion. + + +In this phase, we also check for changes in the dynamic binding environment +that require cleanup code to be generated. We just check for changes in the +Continuation-Cleanup on local control transfers. If it changes from +an inner dynamic context to an outer one that is in the same environment, then +we emit code to clean up the dynamic bindings between the old and new +continuation. We represent the result of cleanup detection to the back end by +interposing a new block containing a call to a funny function. Local exits +from CATCH or UNWIND-PROTECT are detected in the same way. + + +|\# + +The primary activity in environment analysis is the annotation of ICR with +environment structures describing where variables are allocated and what values +the environment closes over. + +Each lambda points to the environment where its variables are allocated, and +the environments point back. We always allocate the environment at the Bind +node for the sole non-let lambda in the environment, so there is a close +relationship between environments and functions. Each ``real function'' (i.e. +not a LET) has a corresponding environment. + +We attempt to share the same environment among as many lambdas as possible so +that unnecessary environment manipulation is not done. During environment +analysis the only optimization of this sort is realizing that a Let (a lambda +with no Return node) cannot need its own environment, since there is no way +that it can return and discover that its old values have been clobbered. + +When the function is called, values from other environments may need to be made +available in the function's environment. These values are said to be ``closed +over''. + +Even if a value is not referenced in a given environment, it may need to be +closed over in that environment so that it can be passed to a called function +that does reference the value. When we discover that a value must be closed +over by a function, we must close over the value in all the environments where +that function is referenced. This applies to all references, not just local +calls, since at other references we must have the values on hand so that we can +build a closure. This propagation must be applied recursively, since the value +must also be available in *those* functions' callers. + +If a closure reference is known to be ``safe'' (not an upward funarg), then the +closure structure may be allocated on the stack. + +Closure analysis deals only with closures over values, while Common Lisp +requires closures over variables. The difference only becomes significant when +variables are set. If a variable is not set, then we can freely make copies of +it without keeping track of where they are. When a variable is set, we must +maintain a single value cell, or at least the illusion thereof. We achieve +this by creating a heap-allocated ``value cell'' structure for each set variable +that is closed over. The pointer to this value cell is passed around as the +``value'' corresponding to that variable. References to the variable must +explicitly indirect through the value cell. + +When we are scanning over the lambdas in the component, we also check for bound +but not referenced variables. + +Environment analysis emits cleanup code for local exits and markers for +non-local exits. + +A non-local exit is a control transfer from one environment to another. In a +non-local exit, we must close over the continuation that we transfer to so that +the exiting function can find its way back. We indicate the need to close a +continuation by placing the continuation structure in the closure and also +pushing it on a list in the environment structure for the target of the exit. +[\#\#\# To be safe, we would treat the continuation as a set closure variable so +that we could invalidate it when we leave the dynamic extent of the exit point. +Transferring control to a meaningless stack pointer would be apt to cause +horrible death.] + +Each local control transfer may require dynamic state such as special bindings +to be undone. We represent cleanup actions by funny function calls in a new +block linked in as an implicit MV-PROG1. + diff --git a/doc/internals/cmu/glossary.tex b/doc/internals/cmu/glossary.tex new file mode 100644 index 0000000000..e77bab5e3b --- /dev/null +++ b/doc/internals/cmu/glossary.tex @@ -0,0 +1,411 @@ +\chapter{Glossary}% -*- Dictionary: int:design -*- + +% Note: in an entry, any word that is also defined should be \it +% should entries have page references as well? + +\begin{description} +\item[assert (a type)] +In Python, all type checking is done via a general type assertion +mechanism. Explicit declarations and implicit assertions (e.g. the arg to ++ is a number) are recorded in the front-end (implicit continuation) +representation. Type assertions (and thus type-checking) are ``unbundled'' +from the operations that are affected by the assertion. This has two major +advantages: +\begin{itemize} +\item Code that implements operations need not concern itself with checking +operand types. + +\item Run-time type checks can be eliminated when the compiler can prove that +the assertion will always be satisfied. +\end{itemize} +See also {\it restrict}. + +\item[back end] The back end is the part of the compiler that operates on the +{\it virtual machine} intermediate representation. Also included are the +compiler phases involved in the conversion from the {\it front end} +representation (or {\it ICR}). + +\item[bind node] This is a node type the that marks the start of a {\it lambda} +body in {\it ICR}. This serves as a placeholder for environment manipulation +code. + +\item[IR1] The first intermediate representation, also known as {\it ICR}, or +the Implicit Continuation Represenation. + +\item[IR2] The second intermediate representation, also known as {\it VMR}, or +the Virtual Machine Representation. + +\item[basic block] A basic block (or simply ``block'') has the pretty much the +usual meaning of representing a straight-line sequence of code. However, the +code sequence ultimately generated for a block might contain internal branches +that were hidden inside the implementation of a particular operation. The type +of a block is actually {\tt cblock}. The {\tt block-info} slot holds an +{\tt VMR-block} containing backend information. + +\item[block compilation] Block compilation is a term commonly used to describe +the compile-time resolution of function names. This enables many +optimizations. + +\item[call graph] +Each node in the call graph is a function (represented by a {\it flow graph}.) +The arcs in the call graph represent a possible call from one function to +another. See also {\it tail set}. + +\item[cleanup] +A cleanup is the part of the implicit continuation representation that +retains information scoping relationships. For indefinite extent bindings +(variables and functions), we can abandon scoping information after ICR +conversion, recovering the lifetime information using flow analysis. But +dynamic bindings (special values, catch, unwind protect, etc.) must be +removed at a precise time (whenever the scope is exited.) Cleanup +structures form a hierarchy that represents the static nesting of dynamic +binding structures. When the compiler does a control transfer, it can use +the cleanup information to determine what cleanup code needs to be emitted. + +\item[closure variable] +A closure variable is any lexical variable that has references outside of +its {\it home environment}. See also {\it indirect value cell}. + +\item[closed continuation] A closed continuation represents a {\tt tagbody} tag +or {\tt block} name that is closed over. These two cases are mostly +indistinguishable in {\it ICR}. + +\item[home] Home is a term used to describe various back-pointers. A lambda +variable's ``home'' is the lambda that the variable belongs to. A lambda's ``home +environment'' is the environment in which that lambda's variables are allocated. + +\item[indirect value cell] +Any closure variable that has assignments ({\tt setq}s) will be allocated in an +indirect value cell. This is necessary to ensure that all references to +the variable will see assigned values, since the compiler normally freely +copies values when creating a closure. + +\item[set variable] Any variable that is assigned to is called a ``set +variable''. Several optimizations must special-case set variables, and set +closure variables must have an {\it indirect value cell}. + +\item[code generator] The code generator for a {\it VOP} is a potentially +arbitrary list code fragment which is responsible for emitting assembly code to +implement that VOP. + +\item[constant pool] The part of a compiled code object that holds pointers to +non-immediate constants. + +\item[constant TN] +A constant TN is the {\it VMR} of a compile-time constant value. A +constant may be immediate, or may be allocated in the {\it constant pool}. + +\item[constant leaf] +A constant {\it leaf} is the {\it ICR} of a compile-time constant value. + +\item[combination] +A combination {\it node} is the {\it ICR} of any fixed-argument function +call (not {\tt apply} or {\tt multiple-value-call}.) + +\item[top-level component] +A top-level component is any component whose only entry points are top-level +lambdas. + +\item[top-level lambda] +A top-level lambda represents the execution of the outermost form on which +the compiler was invoked. In the case of {\tt compile-file}, this is often a +truly top-level form in the source file, but the compiler can recursively +descend into some forms ({\tt eval-when}, etc.) breaking them into separate +compilations. + +\item[component] A component is basically a sequence of blocks. Each component +is compiled into a separate code object. With {\it block compilation} or {\it +local functions}, a component will contain the code for more than one function. +This is called a component because it represents a connected portion of the +call graph. Normally the blocks are in depth-first order ({\it DFO}). + +\item[component, initial] During ICR conversion, blocks are temporarily +assigned to initial components. The ``flow graph canonicalization'' phase +determines the true component structure. + +\item[component, head and tail] +The head and tail of a component are dummy blocks that mark the start and +end of the {\it DFO} sequence. The component head and tail double as the root +and finish node of the component's flow graph. + +\item[local function (call)] +A local function call is a call to a function known at compile time to be +in the same {\it component}. Local call allows compile time resolution of the +target address and calling conventions. See {\it block compilation}. + +\item[conflict (of TNs, set)] +Register allocation terminology. Two TNs conflict if they could ever be +live simultaneously. The conflict set of a TN is all TNs that it conflicts +with. + +\item[continuation] +The ICR data structure which represents both: +\begin{itemize} +\item The receiving of a value (or multiple values), and + +\item A control location in the flow graph. +\end{itemize} +In the Implicit Continuation Representation, the environment is implicit in the +continuation's BLOCK (hence the name.) The ICR continuation is very similar to +a CPS continuation in its use, but its representation doesn't much resemble (is +not interchangeable with) a lambda. + +\item[cont] A slot in the {\it node} holding the {\it continuation} which +receives the node's value(s). Unless the node ends a {\it block}, this also +implicitly indicates which node should be evaluated next. + +\item[cost] Approximations of the run-time costs of operations are widely used +in the back end. By convention, the unit is generally machine cycles, but the +values are only used for comparison between alternatives. For example, the +VOP cost is used to determine the preferred order in which to try possible +implementations. + +\item[CSP, CFP] See {\it control stack pointer} and {\it control frame +pointer}. + +\item[Control stack] The main call stack, which holds function stack frames. +All words on the control stack are tagged {\it descriptors}. In all ports done +so far, the control stack grows from low memory to high memory. The most +recent call frames are considered to be ``on top'' of earlier call frames. + +\item[Control stack pointer] The allocation pointer for the {\it control +stack}. Generally this points to the first free word at the top of the stack. + +\item[Control frame pointer] The pointer to the base of the {\it control stack} +frame for a particular function invocation. The CFP for the running function +must be in a register. + +\item[Number stack] The auxiliary stack used to hold any {\it non-descriptor} +(untagged) objects. This is generally the same as the C call stack, and thus +typically grows down. + +\item[Number stack pointer] The allocation pointer for the {\it number stack}. +This is typically the C stack pointer, and is thus kept in a register. + +\item[NSP, NFP] See {\it number stack pointer}, {\it number frame pointer}. + +\item[Number frame pointer] The pointer to the base of the {\it number stack} +frame for a particular function invocation. Functions that don't use the +number stack won't have an NFP, but if an NFP is allocated, it is always +allocated in a particular register. If there is no variable-size data on the +number stack, then the NFP will generally be identical to the NSP. + +\item[Lisp return address] The name of the {\it descriptor} encoding the +``return pc'' for a function call. + +\item[LRA] See {\it lisp return address}. Also, the name of the register where +the LRA is passed. + + +\item[Code pointer] A pointer to the header of a code object. The code pointer +for the currently running function is stored in the {\tt code} register. + +\item[Interior pointer] A pointer into the inside of some heap-allocated +object. Interior pointers confuse the garbage collector, so their use is +highly constrained. Typically there is a single register dedicated to holding +interior pointers. + +\item[dest] +A slot in the {\it continuation} which points the the node that receives this +value. Null if this value is not received by anyone. + +\item[DFN, DFO] See {\it Depth First Number}, {\it Depth First Order}. + +\item[Depth first number] Blocks are numbered according to their appearance in +the depth-first ordering (the {\tt block-number} slot.) The numbering actually +increases from the component tail, so earlier blocks have larger numbers. + +\item[Depth first order] This is a linearization of the flow graph, obtained by +a depth-first walk. Iterative flow analysis algorithms work better when blocks +are processed in DFO (or reverse DFO.) + + +\item[Object] In low-level design discussions, an object is one of the +following: +\begin{itemize} +\item a single word containing immediate data (characters, fixnums, etc) +\item a single word pointing to an object (structures, conses, etc.) +\end{itemize} +These are tagged with three low-tag bits as described in the section +\ref{sec:tagging} This is synonymous with {\it descriptor}. +In other parts of the documentation, may be used more loosely to refer to a +{\it lisp object}. + +\item[Lisp object] +A Lisp object is a high-level object discussed as a data type in the Common +Lisp definition. + +\item[Data-block] +A data-block is a dual-word aligned block of memory that either manifests a +Lisp object (vectors, code, symbols, etc.) or helps manage a Lisp object on +the heap (array header, function header, etc.). + +\item[Descriptor] +A descriptor is a tagged, single-word object. It either contains immediate +data or a pointer to data. This is synonymous with {\it object}. Storage +locations that must contain descriptors are referred to as descriptor +locations. + +\item[Pointer descriptor] +A descriptor that points to a {\it data block} in memory (i.e. not an immediate +object.) + +\item[Immediate descriptor] +A descriptor that encodes the object value in the descriptor itself; used for +characters, fixnums, etc. + +\item[Word] +A word is a 32-bit quantity. + +\item[Non-descriptor] +Any chunk of bits that isn't a valid tagged descriptor. For example, a +double-float on the number stack. Storage locations that are not scanned by +the garbage collector (and thus cannot contain {\it pointer descriptors}) are +called non-descriptor locations. {\it Immediate descriptors} can be stored in +non-descriptor locations. + + +\item[Entry point] An entry point is a function that may be subject to +``unpredictable'' control transfers. All entry points are linked to the root +of the flow graph (the component head.) The only functions that aren't entry +points are {\it let} functions. When complex lambda-list syntax is used, +multiple entry points may be created for a single lisp-level function. +See {\it external entry point}. + +\item[External entry point] A function that serves as a ``trampoline'' to +intercept function calls coming in from outside of the component. The XEP does +argument syntax and type checking, and may also translate the arguments and +return values for a locally specialized calling calling convention. + +\item[XEP] An {\it external entry point}. + +\item[lexical environment] A lexical environment is a structure that is used +during VMR conversion to represent all lexically scoped bindings (variables, +functions, declarations, etc.) Each {\tt node} is annotated with its lexical +environment, primarily for use by the debugger and other user interfaces. This +structure is also the environment object passed to {\tt macroexpand}. + +\item[environment] The environment is part of the ICR, created during +environment analysis. Environment analysis apportions code to disjoint +environments, with all code in the same environment sharing the same stack +frame. Each environment has a ``{\it real}'' function that allocates it, and +some collection {\tt let} functions. Although environment analysis is the +last ICR phase, in earlier phases, code is sometimes said to be ``in the +same/different environment(s)''. This means that the code will definitely be +in the same environment (because it is in the same real function), or that is +might not be in the same environment, because it is not in the same function. + +\item[fixup] Some sort of back-patching annotation. The main sort encountered +are load-time {\it assembler fixups}, which are a linkage annotation mechanism. + +\item[flow graph] A flow graph is a directed graph of basic blocks, where each +arc represents a possible control transfer. The flow graph is the basic data +structure used to represent code, and provides direct support for data flow +analysis. See component and ICR. + +\item[foldable] An attribute of {\it known functions}. A function is foldable +if calls may be constant folded whenever the arguments are compile-time +constant. Generally this means that it is a pure function with no side +effects. + + +\item[FSC] +\item[full call] +\item[function attribute] +function + ``real'' (allocates environment) + meaning function-entry + more vague (any lambda?) +funny function +GEN (kill and...) +global TN, conflicts, preference +GTN (number) +IR ICR VMR ICR conversion, VMR conversion (translation) +inline expansion, call +kill (to make dead) +known function +LAMBDA +leaf +let call +lifetime analysis, live (tn, variable) +load tn +LOCS (passing, return locations) +local call +local TN, conflicts, (or just used in one block) +location (selection) +LTN (number) +main entry +mess-up (for cleanup) +more arg (entry) +MV +non-local exit +non-packed SC, TN +non-set variable +operand (to vop) +optimizer (in icr optimize) +optional-dispatch +pack, packing, packed +pass (in a transform) +passing + locations (value) + conventions (known, unknown) +policy (safe, fast, small, ...) +predecessor block +primitive-type +reaching definition +REF +representation + selection + for value +result continuation (for function) +result type assertion (for template) (or is it restriction) +restrict + a TN to finite SBs + a template operand to a primitive type (boxed...) + a tn-ref to particular SCs + +return (node, vops) +safe, safety +saving (of registers, costs) +SB +SC (restriction) +semi-inline +side-effect + in ICR + in VMR +sparse set +splitting (of VMR blocks) +SSET +SUBPRIMITIVE +successor block +tail recursion + tail recursive + tail recursive loop + user tail recursion + +template +TN +TNBIND +TN-REF +transform (source, ICR) +type + assertion + inference + top-down, bottom-up + assertion propagation + derived, asserted + descriptor, specifier, intersection, union, member type + check +type-check (in continuation) +UNBOXED (boxed) descriptor +unknown values continuation +unset variable +unwind-block, unwinding +used value (dest) +value passing +VAR +VM +VOP +\item[XEP] + +\end{description} diff --git a/doc/internals/cmu/interface.tex b/doc/internals/cmu/interface.tex new file mode 100644 index 0000000000..b08631e81a --- /dev/null +++ b/doc/internals/cmu/interface.tex @@ -0,0 +1,6 @@ +\chapter{User Interface of the Compiler} + +\section{Error Message Utilities} + +\section{Source Paths} +\label{source-paths} diff --git a/doc/internals/cmu/internal-design.txt b/doc/internals/cmu/internal-design.txt new file mode 100644 index 0000000000..071e1d93aa --- /dev/null +++ b/doc/internals/cmu/internal-design.txt @@ -0,0 +1,694 @@ + + +;;;; Terminology. + +OBJECT + An object is one of the following: + a single word containing immediate data (characters, fixnums, etc) + a single word pointing to an object (structures, conses, etc.) + These are tagged with three low-tag bits as described in the section + "Tagging". This is synonymous with DESCRIPTOR. + +LISP OBJECT + A Lisp object is a high-level object discussed as a data type in Common + Lisp: The Language. + +DATA-BLOCK + A data-block is a dual-word aligned block of memory that either manifests a + Lisp object (vectors, code, symbols, etc.) or helps manage a Lisp object on + the heap (array header, function header, etc.). + +DESCRIPTOR + A descriptor is a tagged, single-word object. It either contains immediate + data or a pointer to data. This is synonymous with OBJECT. + +WORD + A word is a 32-bit quantity. + + + +;;;; Tagging. + +The following is a key of the three bit low-tagging scheme: + 000 even fixnum + 001 function pointer + 010 other-immediate (header-words, characters, symbol-value trap value, etc.) + 011 list pointer + 100 odd fixnum + 101 structure pointer + 110 unused + 111 other-pointer to data-blocks (other than conses, structures, + and functions) + +This taging scheme forces a dual-word alignment of data-blocks on the heap, but +this can be pretty negligible: + RATIOS and COMPLEX must have a header-word anyway since they are not a + major type. This wastes one word for these infrequent data-blocks since + they require two words for the data. + BIGNUMS must have a header-word and probably contain only one other word + anyway, so we probably don't waste any words here. Most bignums just + barely overflow fixnums, that is by a bit or two. + Single and double FLOATS? + no waste + one word wasted + SYMBOLS are dual-word aligned with the header-word. + Everything else is vector-like including code, so these probably take up + so many words that one extra one doesn't matter. + + + +;;;; GC Comments. + +Data-Blocks comprise only descriptors, or they contain immediate data and raw +bits interpreted by the system. GC must skip the latter when scanning the +heap, so it does not look at a word of raw bits and interpret it as a pointer +descriptor. These data-blocks require headers for GC as well as for operations +that need to know how to interpret the raw bits. When GC is scanning, and it +sees a header-word, then it can determine how to skip that data-block if +necessary. Header-Words are tagged as other-immediates. See the sections +"Other-Immediates" and "Data-Blocks and Header-Words" for comments on +distinguishing header-words from other-immediate data. This distinction is +necessary since we scan through data-blocks containing only descriptors just as +we scan through the heap looking for header-words introducing data-blocks. + +Data-Blocks containing only descriptors do not require header-words for GC +since the entire data-block can be scanned by GC a word at a time, taking +whatever action is necessary or appropriate for the data in that slot. For +example, a cons is referenced by a descriptor with a specific tag, and the +system always knows the size of this data-block. When GC encounters a pointer +to a cons, it can transport it into the new space, and when scanning, it can +simply scan the two words manifesting the cons interpreting each word as a +descriptor. Actually there is no cons tag, but a list tag, so we make sure the +cons is not nil when appropriate. A header may still be desired if the pointer +to the data-block does not contain enough information to adequately maintain +the data-block. An example of this is a simple-vector containing only +descriptor slots, and we attach a header-word because the descriptor pointing +to the vector lacks necessary information -- the type of the vector's elements, +its length, etc. + +There is no need for a major tag for GC forwarding pointers. Since the tag +bits are in the low end of the word, a range check on the start and end of old +space tells you if you need to move the thing. This is all GC overhead. + + + +;;;; Structures. + +Structures comprise a word for each slot in the definition in addition to one +word, a type slot which is a pointer descriptor. This points to a structure +describing the data-block as a structure, a defstruct-descriptor object. When +operating on a structure, doing a structure test can be done by simply checking +the tag bits on the pointer descriptor referencing it. As described in section +"GC Comments", data-blocks such as those representing structures may avoid +having a header-word since they are GC-scanable without any problem. This +saves two words for every structure instance. + + + +;;;; Fixnums. + +A fixnum has one of the following formats in 32 bits: + ------------------------------------------------------- + | 30 bit 2's complement even integer | 0 0 0 | + ------------------------------------------------------- +or + ------------------------------------------------------- + | 30 bit 2's complement odd integer | 1 0 0 | + ------------------------------------------------------- + +Effectively, there is one tag for immediate integers, two zeros. This buys one +more bit for fixnums, and now when these numbers index into simple-vectors or +offset into memory, they point to word boundaries on 32-bit, byte-addressable +machines. That is, no shifting need occur to use the number directly as an +offset. + +This format has another advantage on byte-addressable machines when fixnums are +offsets into vector-like data-blocks, including structures. Even though we +previously mentioned data-blocks are dual-word aligned, most indexing and slot +accessing is word aligned, and so are fixnums with effectively two tag bits. + +Two tags also allow better usage of special instructions on some machines that +can deal with two low-tag bits but not three. + +Since the two bits are zeros, we avoid having to mask them off before using the +words for arithmetic, but division and multiplication require special shifting. + + + +;;;; Other-immediates. + +An other-immediate has the following format: + ---------------------------------------------------------------- + | Data (24 bits) | Type (8 bits with low-tag) | 0 1 0 | + ---------------------------------------------------------------- + +The system uses eight bits of type when checking types and defining system +constants. This allows allows for 32 distinct other-immediate objects given +the three low-tag bits tied down. + +The system uses this format for characters, SYMBOL-VALUE unbound trap value, +and header-words for data-blocks on the heap. The type codes are laid out to +facilitate range checks for common subtypes; for example, all numbers will have +contiguous type codes which are distinct from the contiguous array type codes. +See section "Data-Blocks and Other-immediates Typing" for details. + + + +;;;; Data-Blocks and Header-Word Format. + +Pointers to data-blocks have the following format: + ---------------------------------------------------------------- + | Dual-word address of data-block (29 bits) | 1 1 1 | + ---------------------------------------------------------------- + +The word pointed to by the above descriptor is a header-word, and it has the +same format as an other-immediate: + ---------------------------------------------------------------- + | Data (24 bits) | Type (8 bits with low-tag) | 0 1 0 | + ---------------------------------------------------------------- + +This is convenient for scanning the heap when GC'ing, but it does mean that +whenever GC encounters an other-immediate word, it has to do a range check on +the low byte to see if it is a header-word or just a character (for example). +This is easily acceptable performance hit for scanning. + +The system interprets the data portion of the header-word for non-vector +data-blocks as the word length excluding the header-word. For example, the +data field of the header for ratio and complex numbers is two, one word each +for the numerator and denominator or for the real and imaginary parts. + +For vectors and data-blocks representing Lisp objects stored like vectors, the +system ignores the data portion of the header-word: + ---------------------------------------------------------------- + | Unused Data (24 bits) | Type (8 bits with low-tag) | 0 1 0 | + ---------------------------------------------------------------- + | Element Length of Vector (30 bits) | 0 0 | + ---------------------------------------------------------------- + +Using a separate word allows for much larger vectors, and it allows LENGTH to +simply access a single word without masking or shifting. Similarly, the header +for complex arrays and vectors has a second word, following the header-word, +the system uses for the fill pointer, so computing the length of any array is +the same code sequence. + + + +;;;; Data-Blocks and Other-immediates Typing. + +These are the other-immediate types. We specify them including all low eight +bits, including the other-immediate tag, so we can think of the type bits as +one type -- not an other-immediate major type and a subtype. Also, fetching a +byte and comparing it against a constant is more efficient than wasting even a +small amount of time shifting out the other-immediate tag to compare against a +five bit constant. + + Number (< 30) +00000 010 bignum 10 +00000 010 ratio 14 +00000 010 single-float 18 +00000 010 double-float 22 +00000 010 complex 26 + + Array (>= 30 code 86) + Simple-Array (>= 20 code 70) +00000 010 simple-array 30 + Vector (>= 34 code 82) +00000 010 simple-string 34 +00000 010 simple-bit-vector 38 +00000 010 simple-vector 42 +00000 010 (simple-array (unsigned-byte 2) (*)) 46 +00000 010 (simple-array (unsigned-byte 4) (*)) 50 +00000 010 (simple-array (unsigned-byte 8) (*)) 54 +00000 010 (simple-array (unsigned-byte 16) (*)) 58 +00000 010 (simple-array (unsigned-byte 32) (*)) 62 +00000 010 (simple-array single-float (*)) 66 +00000 010 (simple-array double-float (*)) 70 +00000 010 complex-string 74 +00000 010 complex-bit-vector 78 +00000 010 (array * (*)) -- general complex vector. 82 +00000 010 complex-array 86 + +00000 010 code-header-type 90 +00000 010 function-header-type 94 +00000 010 closure-header-type 98 +00000 010 funcallable-instance-header-type 102 +00000 010 unused-function-header-1-type 106 +00000 010 unused-function-header-2-type 110 +00000 010 unused-function-header-3-type 114 +00000 010 closure-function-header-type 118 +00000 010 return-pc-header-type 122 +00000 010 value-cell-header-type 126 +00000 010 symbol-header-type 130 +00000 010 base-character-type 134 +00000 010 system-area-pointer-type (header type) 138 +00000 010 unbound-marker 142 +00000 010 weak-pointer-type 146 + + + +;;;; Strings. + +All strings in the system are C-null terminated. This saves copying the bytes +when calling out to C. The only time this wastes memory is when the string +contains a multiple of eight characters, and then the system allocates two more +words (since Lisp objects are dual-word aligned) to hold the C-null byte. +Since the system will make heavy use of C routines for systems calls and +libraries that save reimplementation of higher level operating system +functionality (such as pathname resolution or current directory computation), +saving on copying strings for C should make C call out more efficient. + +The length word in a string header, see section "Data-Blocks and Header-Word +Format", counts only the characters truly in the Common Lisp string. +Allocation and GC will have to know to handle the extra C-null byte, and GC +already has to deal with rounding up various objects to dual-word alignment. + + + +;;;; Symbols and NIL. + +Symbol data-block has the following format: + ------------------------------------------------------- + | 5 (data-block words) | Symbol Type (8 bits) | + ------------------------------------------------------- + | Value Descriptor | + ------------------------------------------------------- + | Function Pointer | + ------------------------------------------------------- + | Raw Function Address | + ------------------------------------------------------- + | Setf Function | + ------------------------------------------------------- + | Property List | + ------------------------------------------------------- + | Print Name | + ------------------------------------------------------- + | Package | + ------------------------------------------------------- + +Most of these slots are self-explanatory given what symbols must do in Common +Lisp, but a couple require comments. We added the Raw Function Address slot to +speed up named call which is the most common calling convention. This is a +non-descriptor slot, but since objects are dual word aligned, the value +inherently has fixnum low-tag bits. The GC method for symbols must know to +update this slot. The Setf Function slot is currently unused, but we had an +extra slot due to adding Raw Function Address since objects must be dual-word +aligned. + +The issues with nil are that we want it to act like a symbol, and we need list +operations such as CAR and CDR to be fast on it. CMU Common Lisp solves this +by putting nil as the first object in static space, where other global values +reside, so it has a known address in the system: + ------------------------------------------------------- <-- start static + | 0 | space + ------------------------------------------------------- + | 5 (data-block words) | Symbol Type (8 bits) | + ------------------------------------------------------- <-- nil + | Value/CAR | + ------------------------------------------------------- + | Definition/CDR | + ------------------------------------------------------- + | Raw Function Address | + ------------------------------------------------------- + | Setf Function | + ------------------------------------------------------- + | Property List | + ------------------------------------------------------- + | Print Name | + ------------------------------------------------------- + | Package | + ------------------------------------------------------- + | ... | + ------------------------------------------------------- +In addition, we make the list typed pointer to nil actually point past the +header word of the nil symbol data-block. This has usefulness explained below. +The value and definition of nil are nil. Therefore, any reference to nil used +as a list has quick list type checking, and CAR and CDR can go right through +the first and second words as if nil were a cons object. + +When there is a reference to nil used as a symbol, the system adds offsets to +the address the same as it does for any symbol. This works due to a +combination of nil pointing past the symbol header-word and the chosen list and +other-pointer type tags. The list type tag is four less than the other-pointer +type tag, but nil points four additional bytes into its symbol data-block. + + + +;;;; Array Headers. + +The array-header data-block has the following format: + ---------------------------------------------------------------- + | Header Len (24 bits) = Array Rank +5 | Array Type (8 bits) | + ---------------------------------------------------------------- + | Fill Pointer (30 bits) | 0 0 | + ---------------------------------------------------------------- + | Available Elements (30 bits) | 0 0 | + ---------------------------------------------------------------- + | Data Vector (29 bits) | 1 1 1 | + ---------------------------------------------------------------- + | Displacement (30 bits) | 0 0 | + ---------------------------------------------------------------- + | Displacedp (29 bits) -- t or nil | 1 1 1 | + ---------------------------------------------------------------- + | Range of First Index (30 bits) | 0 0 | + ---------------------------------------------------------------- + . + . + . + +The array type in the header-word is one of the eight-bit patterns from section +"Data-Blocks and Other-immediates Typing", indicating that this is a complex +string, complex vector, complex bit-vector, or a multi-dimensional array. The +data portion of the other-immediate word is the length of the array header +data-block. Due to its format, its length is always five greater than the +array's number of dimensions. The following words have the following +interpretations and types: + Fill Pointer + This is a fixnum indicating the number of elements in the data vector + actually in use. This is the logical length of the array, and it is + typically the same value as the next slot. This is the second word, so + LENGTH of any array, with or without an array header, is just four bytes + off the pointer to it. + Available Elements + This is a fixnum indicating the number of elements for which there is + space in the data vector. This is greater than or equal to the logical + length of the array when it is a vector having a fill pointer. + Data Vector + This is a pointer descriptor referencing the actual data of the array. + This a data-block whose first word is a header-word with an array type as + described in sections "Data-Blocks and Header-Word Format" and + "Data-Blocks and Other-immediates Typing" + Displacement + This is a fixnum added to the computed row-major index for any array. + This is typically zero. + Displacedp + This is either t or nil. This is separate from the displacement slot, so + most array accesses can simply add in the displacement slot. The rare + need to know if an array is displaced costs one extra word in array + headers which probably aren't very frequent anyway. + Range of First Index + This is a fixnum indicating the number of elements in the first dimension + of the array. Legal index values are zero to one less than this number + inclusively. IF the array is zero-dimensional, this slot is + non-existent. + ... (remaining slots) + There is an additional slot in the header for each dimension of the + array. These are the same as the Range of First Index slot. + + + +;;;; Bignums. + +Bignum data-blocks have the following format: + ------------------------------------------------------- + | Length (24 bits) | Bignum Type (8 bits) | + ------------------------------------------------------- + | least significant bits | + ------------------------------------------------------- + . + . + . + +The elements contain the two's complement representation of the integer with +the least significant bits in the first element or closer to the header. The +sign information is in the high end of the last element. + + + + +;;;; Code Data-Blocks. + +A code data-block is the run-time representation of a "component". A component +is a connected portion of a program's flow graph that is compiled as a single +unit, and it contains code for many functions. Some of these functions are +callable from outside of the component, and these are termed "entry points". + +Each entry point has an associated user-visible function data-block (of type +FUNCTION). The full call convention provides for calling an entry point +specified by a function object. + +Although all of the function data-blocks for a component's entry points appear +to the user as distinct objects, the system keeps all of the code in a single +code data-block. The user-visible function object is actually a pointer into +the middle of a code data-block. This allows any control transfer within a +component to be done using a relative branch. + +Besides a function object, there are other kinds of references into the middle +of a code data-block. Control transfer into a function also occurs at the +return-PC for a call. The system represents a return-PC somewhat similarly to +a function, so GC can also recognize a return-PC as a reference to a code +data-block. + +It is incorrect to think of a code data-block as a concatenation of "function +data-blocks". Code for a function is not emitted in any particular order with +respect to that function's function-header (if any). The code following a +function-header may only be a branch to some other location where the +function's "real" definition is. + + +The following are the three kinds of pointers to code data-blocks: + Code pointer (labeled A below): + A code pointer is a descriptor, with other-pointer low-tag bits, pointing + to the beginning of the code data-block. The code pointer for the + currently running function is always kept in a register (CODE). In + addition to allowing loading of non-immediate constants, this also serves + to represent the currently running function to the debugger. + Return-PC (labeled B below): + The return-PC is a descriptor, with other-pointer low-tag bits, pointing + to a location for a function call. Note that this location contains no + descriptors other than the one word of immediate data, so GC can treat + return-PC locations the same as instructions. + Function (labeled C below): + A function is a descriptor, with function low-tag bits, that is user + callable. When a function header is referenced from a closure or from + the function header's self-pointer, the pointer has other-pointer low-tag + bits, instead of function low-tag bits. This ensures that the internal + function data-block associated with a closure appears to be uncallable + (although users should never see such an object anyway). + + Information about functions that is only useful for entry points is kept + in some descriptors following the function's self-pointer descriptor. + All of these together with the function's header-word are known as the + "function header". GC must be able to locate the function header. We + provide for this by chaining together the function headers in a NIL + terminated list kept in a known slot in the code data-block. + + +A code data-block has the following format: + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <-- A + | Header-Word count (24 bits) | %Code-Type (8 bits) | + ---------------------------------------------------------------- + | Number of code words (fixnum tag) | + ---------------------------------------------------------------- + | Pointer to first function header (other-pointer tag) | + ---------------------------------------------------------------- + | Debug information (structure tag) | + ---------------------------------------------------------------- + | First constant (a descriptor) | + ---------------------------------------------------------------- + | ... | + ---------------------------------------------------------------- + | Last constant (and last word of code header) | + ---------------------------------------------------------------- + | Some instructions (non-descriptor) | + ---------------------------------------------------------------- + | (pad to dual-word boundary if necessary) | + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <-- B + | Word offset from code header (24) | %Return-PC-Type (8) | + ---------------------------------------------------------------- + | First instruction after return | + ---------------------------------------------------------------- + | ... more code and return-PC header-words | + ---------------------------------------------------------------- + | (pad to dual-word boundary if necessary) | + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <-- C + | Offset from code header (24) | %Function-Header-Type (8) | + ---------------------------------------------------------------- + | Self-pointer back to previous word (with other-pointer tag) | + ---------------------------------------------------------------- + | Pointer to next function (other-pointer low-tag) or NIL | + ---------------------------------------------------------------- + | Function name (a string or a symbol) | + ---------------------------------------------------------------- + | Function debug arglist (a string) | + ---------------------------------------------------------------- + | Function type (a list-style function type specifier) | + ---------------------------------------------------------------- + | Start of instructions for function (non-descriptor) | + ---------------------------------------------------------------- + | More function headers and instructions and return PCs, | + | until we reach the total size of header-words + code | + | words. | + ---------------------------------------------------------------- + + +The following are detailed slot descriptions: + Code data-block header-word: + The immediate data in the code data-block's header-word is the number of + leading descriptors in the code data-block, the fixed overhead words plus + the number of constants. The first non-descriptor word, some code, + appears at this word offset from the header. + Number of code words: + The total number of non-header-words in the code data-block. The total + word size of the code data-block is the sum of this slot and the + immediate header-word data of the previous slot. The system accesses + this slot with the system constant, %Code-Code-Size-Slot, offset from the + header-word. + Pointer to first function header: + A NIL-terminated list of the function headers for all entry points to + this component. The system accesses this slot with the system constant, + %Code-Entry-Points-Slot, offset from the header-word. + Debug information: + The DEBUG-INFO structure describing this component. All information that + the debugger wants to get from a running function is kept in this + structure. Since there are many functions, the current PC is used to + locate the appropriate debug information. The system keeps the debug + information separate from the function data-block, since the currently + running function may not be an entry point. There is no way to recover + the function object for the currently running function, since this + data-block may not exist. The system accesses this slot with the system + constant, %Code-Debug-Info-Slot, offset from the header-word. + First constant ... last constant: + These are the constants referenced by the component, if there are any. + The system accesses the first constant slot with the system constant, + %Code-Constants-Offset, offset from the header-word. + + Return-PC header word: + The immediate header-word data is the word offset from the enclosing code + data-block's header-word to this word. This allows GC and the debugger + to easily recover the code data-block from a return-PC. The code at the + return point restores the current code pointer using a subtract immediate + of the offset, which is known at compile time. + + Function entry point header-word: + The immediate header-word data is the word offset from the enclosing code + data-block's header-word to this word. This is the same as for the + retrun-PC header-word. + Self-pointer back to header-word: + In a non-closure function, this self-pointer to the previous header-word + allows the call sequence to always indirect through the second word in a + user callable function. See section "Closure Format". With a closure, + indirecting through the second word gets you a function header-word. The + system ignores this slot in the function header for a closure, since it + has already indirected once, and this slot could be some random thing + that causes an error if you jump to it. This pointer has an + other-pointer tag instead of a function pointer tag, indicating it is not + a user callable Lisp object. The system accesses this slot with the + system constant, %Function-Code-Slot, offset from the function + header-word. + Pointer to next function: + This is the next link in the thread of entry point functions found in + this component. This value is NIL when the current header is the last + entry point in the component. The system accesses this slot with the + system constant, %Function-Header-Next-Slot, offset from the function + header-word. + Function name: + This function's name (for printing). If the user defined this function + with DEFUN, then this is the defined symbol, otherwise it is a + descriptive string. The system accesses this slot with the system + constant, %Function-Header-Name-Slot, offset from the function + header-word. + Function debug arglist: + A printed string representing the function's argument list, for human + readability. If it is a macroexpansion function, then this is the + original DEFMACRO arglist, not the actual expander function arglist. The + system accesses this slot with the system constant, + %Function-Header-Debug-Arglist-Slot, offset from the function + header-word. + Function type: + A list-style function type specifier representing the argument signature + and return types for this function. For example, + (FUNCTION (FIXNUM FIXNUM FIXNUM) FIXNUM) + or + (FUNCTION (STRING &KEY (:START UNSIGNED-BYTE)) STRING) + This information is intended for machine readablilty, such as by the + compiler. The system accesses this slot with the system constant, + %Function-Header-Type-Slot, offset from the function header-word. + + + +;;;; Closure Format. + +A closure data-block has the following format: + ---------------------------------------------------------------- + | Word size (24 bits) | %Closure-Type (8 bits) | + ---------------------------------------------------------------- + | Pointer to function header (other-pointer low-tag) | + ---------------------------------------------------------------- + | . | + | Environment information | + | . | + ---------------------------------------------------------------- + + +A closure descriptor has function low-tag bits. This means that a descriptor +with function low-tag bits may point to either a function header or to a +closure. The idea is that any callable Lisp object has function low-tag bits. +Insofar as call is concerned, we make the format of closures and non-closure +functions compatible. This is the reason for the self-pointer in a function +header. Whenever you have a callable object, you just jump through the second +word, offset some bytes, and go. + + + +;;;; Function call. + +Due to alignment requirements and low-tag codes, it is not possible to use a +hardware call instruction to compute the return-PC. Instead the return-PC +for a call is computed by doing an add-immediate to the start of the code +data-block. + +An advantage of using a single data-block to represent both the descriptor and +non-descriptor parts of a function is that both can be represented by a +single pointer. This reduces the number of memory accesses that have to be +done in a full call. For example, since the constant pool is implicit in a +return-PC, a call need only save the return-PC, rather than saving both the +return PC and the constant pool. + + + +;;;; Memory Layout. + +CMU Common Lisp has four spaces, read-only, static, dynamic-0, and dynamic-1. +Read-only contains objects that the system never modifies, moves, or reclaims. +Static space contains some global objects necessary for the system's runtime or +performance (since they are located at a known offset at a know address), and +the system never moves or reclaims these. However, GC does need to scan static +space for references to moved objects. Dynamic-0 and dynamic-1 are the two +heap areas for stop-and-copy GC algorithms. + +What global objects are at the head of static space??? + NIL + eval::*top-of-stack* + lisp::*current-catch-block* + lisp::*current-unwind-protect* + FLAGS (RT only) + BSP (RT only) + HEAP (RT only) + +In addition to the above spaces, the system has a control stack, binding stack, +and a number stack. The binding stack contains pairs of descriptors, a symbol +and its previous value. The number stack is the same as the C stack, and the +system uses it for non-Lisp objects such as raw system pointers, saving +non-Lisp registers, parts of bignum computations, etc. + + + +;;;; System Pointers. + +The system pointers reference raw allocated memory, data returned by foreign +function calls, etc. The system uses these when you need a pointer to a +non-Lisp block of memory, using an other-pointer. This provides the greatest +flexibility by relieving contraints placed by having more direct references +that require descriptor type tags. + +A system area pointer data-block has the following format: + ------------------------------------------------------- + | 1 (data-block words) | SAP Type (8 bits) | + ------------------------------------------------------- + | system area pointer | + ------------------------------------------------------- + +"SAP" means "system area pointer", and much of our code contains this naming +scheme. We don't currently restrict system pointers to one area of memory, but +if they do point onto the heap, it is up to the user to prevent being screwed +by GC or whatever. diff --git a/doc/internals/cmu/interpreter.tex b/doc/internals/cmu/interpreter.tex new file mode 100644 index 0000000000..d83d817e57 --- /dev/null +++ b/doc/internals/cmu/interpreter.tex @@ -0,0 +1,196 @@ +% -*- Dictionary: design; Package: C -*- + +\chapter{The IR1 Interpreter} + +May be worth having a byte-code representation for interpreted code. This way, +an entire system could be compiled into byte-code for debugging (the +``check-out'' compiler?). + +Given our current inclination for using a stack machine to interpret IR1, it +would be straightforward to layer a byte-code interpreter on top of this. + + +Instead of having no interpreter, or a more-or-less conventional interpreter, +or byte-code interpreter, how about directly executing IR1? + +We run through the IR1 passes, possibly skipping optional ones, until we get +through environment analysis. Then we run a post-pass that annotates IR1 with +information about where values are kept, i.e. the stack slot. + +We can lazily convert functions by having FUNCTION make an interpreted function +object that holds the code (really a closure over the interpreter). The first +time that we try to call the function, we do the conversion and processing. +Also, we can easily keep track of which interpreted functions we have expanded +macros in, so that macro redefinition automatically invalidates the old +expansion, causing lazy reconversion. + +Probably the interpreter will want to represent MVs by a recognizable structure +that is always heap-allocated. This way, we can punt the stack issues involved +in trying to spread MVs. So a continuation value can always be kept in a +single cell. + +The compiler can have some special frobs for making the interpreter efficient, +such as a call operation that extracts arguments from the stack +slots designated by a continuation list. Perhaps + +\begin{verbatim} + (values-mapcar fun . lists) +<==> + (values-list (mapcar fun . lists)) +\end{verbatim} + +This would be used with MV-CALL. + + +This scheme seems to provide nearly all of the advantages of both the compiler +and conventional interpretation. The only significant disadvantage with +respect to a conventional interpreter is that there is the one-time overhead of +conversion, but doing this lazily should make this quite acceptable. + +With respect to a conventional interpreter, we have major advantages: + + Full syntax checking: safety comparable to compiled code. + + Semantics similar to compiled code due to code sharing. Similar diagnostic + messages, etc. Reduction of error-prone code duplication. + + Potential for full type checking according to declarations (would require + running IR1 optimize?) + + Simplifies debugger interface, since interpreted code can look more like + compiled code: source paths, edit definition, etc. + +For all non-run-time symbol annotations (anything other than SYMBOL-FUNCTION +and SYMBOL-VALUE), we use the compiler's global database. MACRO-FUNCTION will +use INFO, rather than vice-versa. + +When doing the IR1 phases for the interpreter, we probably want to suppress +optimizations that change user-visible function calls: + -- Don't do local call conversion of any named functions (even lexical ones). + This is so that a call will appear on the stack that looks like the call in + the original source. The keyword and optional argument transformations + done by local call mangle things quite a bit. Also, note local-call + converting prevents unreferenced arguments from being deleted, which is + another non-obvious transformation. + -- Don't run source-transforms, IR1 transforms and IR1 optimizers. This way, + TRACE and BACKTRACE will show calls with the original arguments, rather + than the ``optimized'' form, etc. Also, for the interpreter it will + actually be faster to call the original function (which is compiled) than + to ``inline expand'' it. Also, this allows implementation-dependent + transforms to expand into %PRIMITIVE uses. + +There are some problems with stepping, due to our non-syntactic IR1 +representation. The source path information is the key that makes this +conceivable. We can skip over the stepping of a subform by quietly evaluating +nodes whose source path lies within the form being skipped. + +One problem with determining what value has been returned by a form. With a +function call, it is theoretically possible to precisely determine this, since +if we complete evaluation of the arguments, then we arrive at the Combination +node whose value is synonymous with the value of the form. We can even detect +this case, since the Node-Source will be EQ to the form. And we can also +detect when we unwind out of the evaluation, since we will leave the form +without having ever reached this node. + +But with macros and special-forms, there is no node whose value is the value of +the form, and no node whose source is the macro call or special form. We can +still detect when we leave the form, but we can't be sure whether this was a +normal evaluation result or an explicit RETURN-FROM. + +But does this really matter? It seems that we can print the value returned (if +any), then just print the next form to step. In the rare case where we did +unwind, the user should be able to figure it out. + +[We can look at this as a side-effect of CPS: there isn't any difference +between a ``normal'' return and a non-local one.] + +[Note that in any control transfer (normal or otherwise), the stepper may need +to unwind out of an arbitrary number of levels of stepping. This is because a +form in a TR position may yield its to a node arbitrarily far out.] + +Another problem is with deciding what form is being stepped. When we start +evaluating a node, we dive into code that is nested somewhere down inside that +form. So we actually have to do a loop of asking questions before we do any +evaluation. But what do we ask about? + +If we ask about the outermost enclosing form that is a subform of the last +form that the user said to execute, then we might offer a form that isn't +really evaluated, such as a LET binding list. + +But once again, is this really a problem? It is certainly different from a +conventional stepper, but a pretty good argument could be made that it is +superior. Haven't you ever wanted to skip the evaluation of all the +LET bindings, but not the body? Wouldn't it be useful to be able to skip the +DO step forms? + +All of this assumes that nobody ever wants to step through the guts of a +macroexpansion. This seems reasonable, since steppers are for weenies, and +weenies don't define macros (hence don't debug them). But there are probably +some weenies who don't know that they shouldn't be writing macros. + +We could handle this by finding the ``source paths'' in the expansion of each +macro by sticking some special frob in the source path marking the place where +the expansion happened. When we hit code again that is in the source, then we +revert to the normal source path. Something along these lines might be a good +idea anyway (for compiler error messages, for example). + +The source path hack isn't guaranteed to work quite so well in generated code, +though, since macros return stuff that isn't freshly consed. But we could +probably arrange to win as long as any given expansion doesn't return two EQ +forms. + +It might be nice to have a command that skipped stepping of the form, but +printed the results of each outermost enclosed evaluated subform, i.e. if you +used this on the DO step-list, it would print the result of each new-value +form. I think this is implementable. I guess what you would do is print each +value delivered to a DEST whose source form is the current or an enclosing +form. Along with the value, you would print the source form for the node that +is computing the value. + +The stepper can also have a ``back'' command that ``unskips'' or ``unsteps''. This +would allow the evaluation of forms that are pure (modulo lexical variable +setting) to be undone. This is useful, since in stepping it is common that you +skip a form that you shouldn't have, or get confused and want to restart at +some earlier point. + +What we would do is remember the current node and the values of all local +variables. heap before doing each step or skip action. We can then back up +the state of all lexical variables and the ``program counter''. To make this +work right with set closure variables, we would copy the cell's value, rather +than the value cell itself. + +[To be fair, note that this could easily be done with our current interpreter: +the stepper could copy the environment alists.] + +We can't back up the ``program counter'' when a control transfer leaves the +current function, since this state is implicitly represented in the +interpreter's state, and is discarded when we exit. We probably want to ask +for confirmation before leaving the function to give users a chance to ``unskip'' +the forms in a TR position. + +Another question is whether the conventional stepper is really a good thing to +imitate... How about an editor-based mouse-driven interface? Instead of +``skipping'' and ``stepping'', you would just designate the next form that you +wanted to stop at. Instead of displaying return values, you replace the source +text with the printed representation of the value. + +It would show the ``program counter'' by highlighting the *innermost* form that +we are about to evaluate, i.e. the source form for the node that we are stopped +at. It would probably also be useful to display the start of the form that was +used to designate the next stopping point, although I guess this could be +implied by the mouse position. + + +Such an interface would be a little harder to implement than a dumb stepper, +but it would be much easier to use. [It would be impossible for an evalhook +stepper to do this.] + + +\section{Use of \%PRIMITIVE} + +Note: \verb|%PRIMITIVE| can only be used in compiled code. It is a +trapdoor into the compiler, not a general syntax for accessing +``sub-primitives''. It's main use is in implementation-dependent +compiler transforms. It saves us the effort of defining a ``phony +function'' (that is not really defined), and also allows direct +communication with the code generator through codegen-info arguments. + +Some primitives may be exported from the VM so that \verb|%PRIMITIVE| +can be used to make it explicit that an escape routine or interpreter +stub is assuming an operation is implemented by the compiler. diff --git a/doc/internals/cmu/lowlev.tex b/doc/internals/cmu/lowlev.tex new file mode 100644 index 0000000000..e603d84152 --- /dev/null +++ b/doc/internals/cmu/lowlev.tex @@ -0,0 +1,85 @@ +\chapter{Memory Management} + +\section{Stacks and Globals} + +\section{Heap Layout} + +\section{Garbage Collection} + +\chapter{Interface to C and Assembler} + + +\section{Linkage Table} + +The linkage table feature is based on how dynamic libraries dispatch. +A table of functions is used which is filled in with the appropriate +code to jump to the correct address. + +For \cmucl{}, this table is stored at +\code{target-foreign-linkage-space-start}. Each entry is +\code{target-foreign-linkage-entry-size} bytes long. + +At startup, the table is initialized with default values in +\code{os\_foreign\_linkage\_init}. On x86 platforms, the first entry is +code to call the routine \code{resolve\_linkage\_tramp}. All other +entries jump to the first entry. The function +\code{resolve\_linkage\_tramp} looks at where it was called from to +figure out which entry in the table was used. It calls +\code{lazy\_resolve\_linkage} with the address of the linkage entry. +This routine then fills in the appropriate linkage entry with code to +jump to where the real routine is located, and returns the address of +the entry. On return, \code{resolve\_linkage\_tramp} then just jumps to +the returned address to call the desired function. On all subsequent +calls, the entry no longer points to \code{resolve\_linkage\_tramp} but +to the real function. + +This describes how function calls are made. For foreign data, +\code{lazy\_resolve\_linkage} stuffs the address of the actual foreign +data into the linkage table. The lisp code then just loads the address +from there to get the actual address of the foreign data. + +For sparc, the linkage table is slightly different. The first entry is +the entry for \code{call\_into\_c} so we never have to look this up. All +other entries are for \code{resolve\_linkage\_tramp}. This has the +advantage that \code{resolve\_linkage\_tramp} can be much simpler since +all calls to foreign code go through \code{call\_into\_c} anyway, and +that means all live Lisp registers have already been saved. Also, to +make life simpler, we lie about \code{closure\_tramp} and +\code{undefined\_tramp} in the Lisp code. These are really functions, +but we treat them as foreign data since these two routines are only +used as addresses in the Lisp code to stuff into a lisp function +header. + +On the Lisp side, there are two supporting data structures for the +linkage table: \code{*linkage-table-data*} and +\code{*foreign-linkage-symbols*}. The latter is a hash table whose key +is the foreign symbol (a string) and whose value is an index into +\code{*linkage-table-data*}. + +\code{*linkage-table-data*} is a vector with an unlispy layout. Each +entry has 3 parts: + +\begin{itemize} +\item symbol name +\item type, a fixnum, 1 = code, 2 = data +\item library list - the library list at the time the symbol is registered. +\end{itemize} + +Whenever a new foreign symbol is defined, a new +\code{*linkage-table-data*} entry is created. +\code{*foreign-linkage-symbols*} is updated with the symbol and the +entry number into \code{*linkage-table-data*}. + +The \code{*linkage-table-data*} is accessed from C (hence the unlispy +layout), to figure out the symbol name and the type so that the +address of the symbol can be determined. The type tells the C code +how to fill in the entry in the linkage-table itself. + +% (Should say something about genesis too, but I don't know how that +% works other than the initial table is setup with the appropriate first +% entry.) + + +\chapter{Low-level debugging} + +\chapter{Core File Format} diff --git a/doc/internals/cmu/middle.tex b/doc/internals/cmu/middle.tex new file mode 100644 index 0000000000..d9ff29b5ee --- /dev/null +++ b/doc/internals/cmu/middle.tex @@ -0,0 +1,667 @@ +% -*- Dictionary: design -*- + + +\chapter{Virtual Machine Representation Introduction} + + +\chapter{Global TN assignment} + +% Rename this phase so as not to be confused with the local/global TN +% representation. + +The basic mechanism for closing over values is to pass the values as additional +implicit arguments in the function call. This technique is only applicable +when: + +\begin{itemize} +\item the calling function knows which values the called function wants to close + over, and +\item the values to be closed over are available in the calling + environment. +\end{itemize} + +The first condition is always true of local function calls. Environment +analysis can guarantee that the second condition holds by closing over any +needed values in the calling environment. + +If the function that closes over values may be called in an environment where +the closed over values are not available, then we must store the values in a +``closure'' so that they are always accessible. Closures are called using the +``full call'' convention. When a closure is called, control is transferred to +the ``external entry point'', which fetches the values out of the closure and +then does a local call to the real function, passing the closure values as +implicit arguments. + +In this scheme there is no such thing as a ``heap closure variable'' in code, +since the closure values are moved into TNs by the external entry point. There +is some potential for pessimization here, since we may end up moving the values +from the closure into a stack memory location, but the advantages are also +substantial. Simplicity is gained by always representing closure values the +same way, and functions with closure references may still be called locally +without allocating a closure. All the TN based VMR optimizations will apply +to closure variables, since closure variables are represented in the same way +as all other variables in VMR. Closure values will be allocated in registers +where appropriate. + +Closures are created at the point where the function is referenced, eliminating +the need to be able to close over closures. This lazy creation of closures has +the additional advantage that when a closure reference is conditionally not +done, then the closure consing will never be done at all. The corresponding +disadvantage is that a closure over the same values may be created multiple +times if there are multiple references. Note however, that VMR loop and common +subexpression optimizations can eliminate redundant closure consing. In any +case, multiple closures over the same variables doesn't seem to be that common. + +\#| +Having the Tail-Info would also make return convention determination trivial. +We could just look at the type, checking to see if it represents a fixed number +of values. To determine if the standard return convention is necessary to +preserve tail-recursion, we just iterate over the equivalent functions, looking +for XEPs and uses in full calls. +|\# + +The Global TN Assignment pass (GTN) can be considered a post-pass to +environment analysis. This phase assigns the TNs used to hold local lexical +variables and pass arguments and return values and determines the value-passing +strategy used in local calls. + +To assign return locations, we look at the function's tail-set. + +If the result continuation for an entry point is used as the continuation for a +full call, then we may need to constrain the continuation's values passing +convention to the standard one. This is not necessary when the call is known +not to be part of a tail-recursive loop (due to being a known function). + +Once we have figured out where we must use the standard value passing strategy, +we can use a more flexible strategy to determine the return locations for local +functions. We determine the possible numbers of return values from each +function by examining the uses of all the result continuations in the +equivalence class of the result continuation. + +If the tail-set type is for a fixed number of +values, then we return that fixed number of values from all the functions whose +result continuations are equated. If the number of values is not fixed, then +we must use the unknown-values convention, although we are not forced to use +the standard locations. We assign the result TNs at this time. + +We also use the tail-sets to see what convention we want to use. What we do is +use the full convention for any function that has a XEP its tail-set, even if +we aren't required to do so by a tail-recursive full call, as long as there are +no non-tail-recursive local calls in the set. This prevents us from +gratuitously using a non-standard convention when there is no reason to. + + +\chapter{Local TN assignment} + +[Want a different name for this so as not to be confused with the different +local/global TN representations. The really interesting stuff in this phase is +operation selection, values representation selection, return strategy, etc. +Maybe this phase should be conceptually lumped with GTN as ``implementation +selection'', since GTN determines call strategies and locations.] + +\#| + +[\#\#\# I guess I believe that it is OK for VMR conversion to dick the ICR flow +graph. An alternative would be to give VMR its very own flow graph, but that +seems like overkill. + +In particular, it would be very nice if a TR local call looked exactly like a +jump in VMR. This would allow loop optimizations to be done on loops written +as recursions. In addition to making the call block transfer to the head of +the function rather than to the return, we would also have to do something +about skipping the part of the function prolog that moves arguments from the +passing locations, since in a TR call they are already in the right frame. + + +In addition to directly indicating whether a call should be coded with a TR +variant, the Tail-P annotation flags non-call nodes that can directly return +the value (an ``advanced return''), rather than moving the value to the result +continuation and jumping to the return code. Then (according to policy), we +can decide to advance all possible returns. If all uses of the result are +Tail-P, then LTN can annotate the result continuation as :Unused, inhibiting +emission of the default return code. + +[\#\#\# But not really. Now there is a single list of templates, and a given +template has only one policy.] + +In LTN, we use the :Safe template as a last resort even when the policy is +unsafe. Note that we don't try :Fast-Safe; if this is also a good unsafe +template, then it should have the unsafe policies explicitly specified. + +With a :Fast-Safe template, the result type must be proven to satisfy the +output type assertion. This means that a fast-safe template with a fixnum +output type doesn't need to do fixnum overflow checking. [\#\#\# Not right to +just check against the Node-Derived-Type, since type-check intersects with +this.] + +It seems that it would be useful to have a kind of template where the args must +be checked to be fixnum, but the template checks for overflow and signals an +error. In the case where an output assertion is present, this would generate +better code than conditionally branching off to make a bignum, and then doing a +type check on the result. + + How do we deal with deciding whether to do a fixnum overflow check? This + is perhaps a more general problem with the interpretation of result type + restrictions in templates. It would be useful to be able to discriminate + between the case where the result has been proven to be a fixnum and where + it has simply been asserted to be so. + + The semantics of result type restriction is that the result must be proven + to be of that type *except* for safe generators, which are assumed to + verify the assertion. That way ``is-fixnum'' case can be a fast-safe + generator and the ``should-be-fixnum'' case is a safe generator. We could + choose not to have a safe ``should-be-fixnum'' generator, and let the + unrestricted safe generator handle it. We would then have to do an + explicit type check on the result. + + In other words, for all template except Safe, a type restriction on either + an argument or result means ``this must be true; if it is not the system may + break.'' In contrast, in a Safe template, the restriction means ``If this is + not true, I will signal an error.'' + + Since the node-derived-type only takes into consideration stuff that can be + proved from the arguments, we can use the node-derived-type to select + fast-safe templates. With unsafe policies, we don't care, since the code + is supposed to be unsafe. + +|\# + +Local TN assignment (LTN) assigns all the TNs needed to represent the values of +continuations. This pass scans over the code for the component, examining each +continuation and its destination. A number of somewhat unrelated things are +also done at the same time so that multiple passes aren't necessary. + -- Determine the Primitive-Type for each continuation value and assigns TNs + to hold the values. + -- Use policy information to determine the implementation strategy for each + call to a known function. + -- Clear the type-check flags in continuations whose destinations have safe + implementations. + -- Determine the value-passing strategy for each continuation: known or + unknown. + -- Note usage of unknown-values continuations so that stack analysis can tell + when stack values must be discarded. + +If safety is more important than speed and space, then we consider generating +type checks on the values of nodes whose CONT has the Type-Check flag set. If +the destination for the continuation value is safe, then we don't need to do +a check. We assume that all full calls are safe, and use the template +information to determine whether inline operations are safe. + +This phase is where compiler policy switches have most of their effect. The +speed/space/safety tradeoff can determine which of a number of coding +strategies are used. It is important to make the policy choice in VMR +conversion rather than in code generation because the cost and storage +requirement information which drives TNBIND will depend strongly on what actual +VOP is chosen. In the case of +/FIXNUM, there might be three or more +implementations, some optimized for speed, some for space, etc. Some of these +VOPS might be open-coded and some not. + +We represent the implementation strategy for a call by either marking it as a +full call or annotating it with a ``template'' representing the open-coding +strategy. Templates are selected using a two-way dispatch off of operand +primitive-types and policy. The general case of LTN is handled by the +LTN-Annotate function in the function-info, but most functions are handled by a +table-driven mechanism. There are four different translation policies that a +template may have: +\begin{description} +\item[Safe] + The safest implementation; must do argument type checking. + +\item[Small] + The (unsafe) smallest implementation. + +\item[Fast] + The (unsafe) fastest implementation. + +\item[Fast-Safe] + An implementation optimized for speed, but which does any necessary + checks exclusive of argument type checking. Examples are array bounds + checks and fixnum overflow checks. +\end{description} + +Usually a function will have only one or two distinct templates. Either or +both of the safe and fast-safe templates may be omitted; if both are specified, +then they should be distinct. If there is no safe template and our policy is +safe, then we do a full call. + +We use four different coding strategies, depending on the policy: +\begin{description} +\item[Safe:] safety $>$ space $>$ speed, or +we want to use the fast-safe template, but there isn't one. + +\item[Small:] space $>$ (max speed safety) + +\item[Fast:] speed $>$ (max space safety) + +\item[Fast-Safe (and type check):] safety $>$ speed $>$ space, or we want to use +the safe template, but there isn't one. +\end{description} + +``Space'' above is actually the maximum of space and cspeed, under the theory +that less code will take less time to generate and assemble. [\#\#\# This could +lose if the smallest case is out-of-line, and must allocate many linkage +registers.] + + +\chapter{Control optimization} + +In this phase we annotate blocks with drop-throughs. This controls how code +generation linearizes code so that drop-throughs are used most effectively. We +totally linearize the code here, allowing code generation to scan the blocks +in the emit order. + +There are basically two aspects to this optimization: + +\begin{enumerate} +\item +Dynamically reducing the number of branches taken v.s. branches not +taken under the assumption that branches not taken are cheaper. +\item +Statically minimizing the number of unconditional branches, saving +space and presumably time. +\end{enumerate} + +These two goals can conflict, but if they do it seems pretty clear that the +dynamic optimization should get preference. The main dynamic optimization is +changing the sense of a conditional test so that the more commonly taken branch +is the fall-through case. The problem is determining which branch is more +commonly taken. + +The most clear-cut case is where one branch leads out of a loop and the other +is within. In this case, clearly the branch within the loop should be +preferred. The only added complication is that at some point in the loop there +has to be a backward branch, and it is preferable for this branch to be +conditional, since an unconditional branch is just a waste of time. + +In the absence of such good information, we can attempt to guess which branch +is more popular on the basis of difference in the cost between the two cases. +Min-max strategy suggests that we should choose the cheaper alternative, since +the percentagewise improvement is greater when the branch overhead is +significant with respect to the cost of the code branched to. A tractable +approximation of this is to compare only the costs of the two blocks +immediately branched to, since this would avoid having to do any hairy graph +walking to find all the code for the consequent and the alternative. It might +be worthwhile discriminating against ultra-expensive functions such as ERROR. + +For this to work, we have to detect when one of the options is empty. In this +case, the next for one branch is a successor of the other branch, making the +comparison meaningless. We use dominator information to detect this situation. +When a branch is empty, one of the predecessors of the first block in the empty +branch will be dominated by the first block in the other branch. In such a +case we favor the empty branch, since that's about as cheap as you can get. + +Statically minimizing branches is really a much more tractable problem, but +what literature there is makes it look hard. Clearly the thing to do is to use +a non-optimal heuristic algorithm. + +A good possibility is to use an algorithm based on the depth first ordering. +We can modify the basic DFO algorithm so that it chooses an ordering which +favors any drop-thrus that we may choose for dynamic reasons. When we are +walking the graph, we walk the desired drop-thru arc last, which will place it +immediately after us in the DFO unless the arc is a retreating arc. + +We scan through the DFO and whenever we find a block that hasn't been done yet, +we build a straight-line segment by setting the drop-thru to the unreached +successor block which has the lowest DFN greater than that for the block. We +move to the drop-thru block and repeat the process until there is no such +block. We then go back to our original scan through the DFO, looking for the +head of another straight-line segment. + +This process will automagically implement all of the dynamic optimizations +described above as long as we favor the appropriate IF branch when creating the +DFO. Using the DFO will prevent us from making the back branch in a loop the +drop-thru, but we need to be clever about favoring IF branches within loops +while computing the DFO. The IF join will be favored without any special +effort, since we follow through the most favored path until we reach the end. + +This needs some knowledge about the target machine, since on most machines +non-tail-recursive calls will use some sort of call instruction. In this case, +the call actually wants to drop through to the return point, rather than +dropping through to the beginning of the called function. + + +\chapter{VMR conversion} + +\#| +Single-use let var continuation substitution not really correct, since it can +cause a spurious type error. Maybe we do want stuff to prove that an NLX can't +happen after all. Or go back to the idea of moving a combination arg to the +ref location, and having that use the ref cont (with its output assertion.) +This lossage doesn't seem very likely to actually happen, though. +[\#\#\# must-reach stuff wouldn't work quite as well as combination substitute in +psetq, etc., since it would fail when one of the new values is random code +(might unwind.)] + +Is this really a general problem with eager type checking? It seems you could +argue that there was no type error in this code: + +\begin{verbatim} + (+ :foo (throw 'up nil)) +\end{verbatim} + +But we would signal an error. + + +Emit explicit you-lose operation when we do a move between two non-T ptypes, +even when type checking isn't on. Can this really happen? Seems we should +treat continuations like this as though type-check was true. Maybe LTN should +leave type-check true in this case, even when the policy is unsafe. (Do a type +check against NIL?) + +At continuation use time, we may in general have to do both a coerce-to-t and a +type check, allocating two temporary TNs to hold the intermediate results. + + +\section{VMR Control representation} + +We represent all control transfer explicitly. In particular, :Conditional VOPs +take a single Target continuation and a Not-P flag indicating whether the sense +of the test is negated. Then an unconditional Branch VOP will be emitted +afterward if the other path isn't a drop-through. + +So we linearize the code before VMR-conversion. This isn't a problem, +since there isn't much change in control flow after VMR conversion (none until +loop optimization requires introduction of header blocks.) It does make +cost-based branch prediction a bit ucky, though, since we don't have any cost +information in ICR. Actually, I guess we do have pretty good cost information +after LTN even before VMR conversion, since the most important thing to know is +which functions are open-coded. + +|\# + +VMR preserves the block structure of ICR, but replaces the nodes with a target +dependent virtual machine (VM) representation. Different implementations may +use different VMs without making major changes in the back end. The two main +components of VMR are Temporary Names (TNs) and Virtual OPerations (VOPs). TNs +represent the locations that hold values, and VOPs represent the operations +performed on the values. + +A ``primitive type'' is a type meaningful at the VM level. Examples are Fixnum, +String-Char, Short-Float. During VMR conversion we use the primitive type of +an expression to determine both where we can store the result of the expression +and which type-specific implementations of an operation can be applied to the +value. [Ptype is a set of SCs == representation choices and representation +specific operations] + +The VM specific definitions provide functions that do stuff like find the +primitive type corresponding to a type and test for primitive type subtypep. +Usually primitive types will be disjoint except for T, which represents all +types. + +The primitive type T is special-cased. Not only does it overlap with all the +other types, but it implies a descriptor (``boxed'' or ``pointer'') representation. +For efficiency reasons, we sometimes want to use +alternate representations for some objects such as numbers. The majority of +operations cannot exploit alternate representations, and would only be +complicated if they had to be able to convert alternate representations into +descriptors. A template can require an operand to be a descriptor by +constraining the operand to be of type T. + +A TN can only represent a single value, so we bare the implementation of MVs at +this point. When we know the number of multiple values being handled, we use +multiple TNs to hold them. When the number of values is actually unknown, we +use a convention that is compatible with full function call. + +Everything that is done is done by a VOP in VMR. Calls to simple primitive +functions such as + and CAR are translated to VOP equivalents by a table-driven +mechanism. This translation is specified by the particular VM definition; VMR +conversion makes no assumptions about which operations are primitive or what +operand types are worth special-casing. The default calling mechanisms and +other miscellaneous builtin features are implemented using standard VOPs that +must be implemented by each VM. + +Type information can be forgotten after VMR conversion, since all type-specific +operation selections have been made. + +Simple type checking is explicitly done using CHECK-xxx VOPs. They act like +innocuous effectless/unaffected VOPs which return the checked thing as a +result. This allows loop-invariant optimization and common subexpression +elimination to remove redundant checks. All type checking is done at the time +the continuation is used. + +Note that we need only check asserted types, since if type inference works, the +derived types will also be satisfied. We can check whichever is more +convenient, since both should be true. + +Constants are turned into special Constant TNs, which are wired down in a SC +that is determined by their type. The VM definition provides a function that +returns a constant TN to represent a Constant Leaf. + +Each component has a constant pool. There is a register dedicated to holding +the constant pool for the current component. The back end allocates +non-immediate constants in the constant pool when it discovers them during +translation from ICR. + +[\#\#\# Check that we are describing what is actually implemented. But this +really isn't very good in the presence of interesting unboxed +representations...] +Since LTN only deals with values from the viewpoint of the receiver, we must be +prepared during the translation pass to do stuff to the continuation at the +time it is used. + -- If a VOP yields more values than are desired, then we must create TNs to + hold the discarded results. An important special-case is continuations + whose value is discarded. These continuations won't be annotated at all. + In the case of a Ref, we can simply skip evaluation of the reference when + the continuation hasn't been annotated. Although this will eliminate + bogus references that for some reason weren't optimized away, the real + purpose is to handle deferred references. + -- If a VOP yields fewer values than desired, then we must default the extra + values to NIL. + -- If a continuation has its type-check flag set, then we must check the type + of the value before moving it into the result location. In general, this + requires computing the result in a temporary, and having the type-check + operation deliver it in the actual result location. + -- If the template's result type is T, then we must generate a boxed + temporary to compute the result in when the continuation's type isn't T. + + +We may also need to do stuff to the arguments when we generate code for a +template. If an argument continuation isn't annotated, then it must be a +deferred reference. We use the leaf's TN instead. We may have to do any of +the above use-time actions also. Alternatively, we could avoid hair by not +deferring references that must be type-checked or may need to be boxed. + + +\section{Stack analysis} + +Think of this as a lifetime problem: a values generator is a write and a values +receiver is a read. We want to annotate each VMR-Block with the unknown-values +continuations that are live at that point. If we do a control transfer to a +place where fewer continuations are live, then we must deallocate the newly +dead continuations. + +We want to convince ourselves that values deallocation based on lifetime +analysis actually works. In particular, we need to be sure that it doesn't +violate the required stack discipline. It is clear that it is impossible to +deallocate the values before they become dead, since later code may decide to +use them. So the only thing we need to ensure is that the ``right'' time isn't +later than the time that the continuation becomes dead. + +The only reason why we couldn't deallocate continuation A as soon as it becomes +dead would be that there is another continuation B on top of it that isn't dead +(since we can only deallocate the topmost continuation). + +The key to understanding why this can't happen is that each continuation has +only one read (receiver). If B is on top of A, then it must be the case that A +is live at the receiver for B. This means that it is impossible for B to be +live without A being live. + + +The reason that we don't solve this problem using a normal iterative flow +analysis is that we also need to know the ordering of the continuations on the +stack so that we can do deallocation. When it comes time to discard values, we +want to know which discarded continuation is on the bottom so that we can reset +SP to its start. + +[I suppose we could also decrement SP by the aggregate size of the discarded +continuations.] Another advantage of knowing the order in which we expect +continuations to be on the stack is that it allows us to do some consistency +checking. Also doing a localized graph walk around the values-receiver is +likely to be much more efficient than doing an iterative flow analysis problem +over all the code in the component (not that big a consideration.) + + + +\#| +Actually, what we do is a backward graph walk from each unknown-values +receiver. As we go, we mark each walked block with the ordered list of +continuations we believe are on the stack. Starting with an empty stack, we: + -- When we encounter another unknown-values receiver, we push that + continuation on our simulated stack. + -- When we encounter a receiver (which had better be for the topmost + continuation), we pop that continuation. + -- When we pop all continuations, we terminate our walk. + +[\#\#\# not quite right... It seems we may run into ``dead values'' during the +graph walk too. It seems that we have to check if the pushed continuation is +on stack top, and if not, add it to the ending stack so that the post-pass will +discard it.] + + + +[\#\#\# Also, we can't terminate our walk just because we hit a block previously +walked. We have to compare the End-Stack with the values received along +the current path: if we have more values on our current walk than on the walk +that last touched the block, then we need to re-walk the subgraph reachable +from that block, using our larger set of continuations. It seems that our +actual termination condition is reaching a block whose End-Stack is already EQ +to our current stack.] + + + + + +If at the start, the block containing the values receiver has already been +walked, we skip the walk for that continuation, since it has already been +handled by an enclosing values receiver. Once a walk has started, we +ignore any signs of a previous walk, clobbering the old result with our own, +since we enclose that continuation, and the previous walk doesn't take into +consideration the fact that our values block underlies its own. + +When we are done, we have annotated each block with the stack current both at +the beginning and at the end of that block. Blocks that aren't walked don't +have anything on the stack either place (although they may hack MVs +internally). + +We then scan all the blocks in the component, looking for blocks that have +predecessors with a different ending stack than that block's starting stack. +(The starting stack had better be a tail of the predecessor's ending stack.) +We insert a block intervening between all of these predecessors that sets SP to +the end of the values for the continuation that should be on stack top. Of +course, this pass needn't be done if there aren't any global unknown MVs. + +Also, if we find any block that wasn't reached during the walk, but that USEs +an outside unknown-values continuation, then we know that the DEST can't be +reached from this point, so the values are unused. We either insert code to +pop the values, or somehow mark the code to prevent the values from ever being +pushed. (We could cause the popping to be done by the normal pass if we +iterated over the pushes beforehand, assigning a correct END-STACK.) + +[\#\#\# But I think that we have to be a bit clever within blocks, given the +possibility of blocks being joined. We could collect some unknown MVs in a +block, then do a control transfer out of the receiver, and this control +transfer could be squeezed out by merging blocks. How about: + +\begin{verbatim} + (tagbody + (return + (multiple-value-prog1 (foo) + (when bar + (go UNWIND)))) + + UNWIND + (return + (multiple-value-prog1 (baz) + bletch))) +\end{verbatim} + +But the problem doesn't happen here (can't happen in general?) since a node +buried within a block can't use a continuation outside of the block. In fact, +no block can have more then one PUSH continuation, and this must always be the +last continuation. So it is trivially (structurally) true that all pops come +before any push. + +[\#\#\# But not really: the DEST of an embedded continuation may be outside the +block. There can be multiple pushes, and we must find them by iterating over +the uses of MV receivers in LTN. But it would be hard to get the order right +this way. We could easily get the order right if we added the generators as we +saw the uses, except that we can't guarantee that the continuations will be +annotated at that point. (Actually, I think we only need the order for +consistency checks, but that is probably worthwhile). I guess the thing to do +is when we process the receiver, add the generator blocks to the +Values-Generators, then do a post-pass that re-scans the blocks adding the +pushes.] + +I believe that above concern with a dead use getting mashed inside a block +can't happen, since the use inside the block must be the only use, and if the +use isn't reachable from the push, then the use is totally unreachable, and +should have been deleted, which would prevent it from ever being +annotated. +] +] +|\# + +We find the partial ordering of the values globs for unknown values +continuations in each environment. We don't have to scan the code looking for +unknown values continuations since LTN annotates each block with the +continuations that were popped and not pushed or pushed and not popped. This +is all we need to do the inter-block analysis. + +After we have found out what stuff is on the stack at each block boundary, we +look for blocks with predecessors that have junk on the stack. For each such +block, we introduce a new block containing code to restore the stack pointer. +Since unknown-values continuations are represented as \verb+<start, count>+, we can +easily pop a continuation using the Start TN. + +Note that there is only doubt about how much stuff is on the control stack, +since only it is used for unknown values. Any special stacks such as number +stacks will always have a fixed allocation. + + +\section{Non-local exit} + + +If the starting and ending continuations are not in the same environment, then +the control transfer is a non-local exit. In this case just call Unwind with +the appropriate stack pointer, and let the code at the re-entry point worry +about fixing things up. + +It seems like maybe a good way to organize VMR conversion of NLX would be to +have environment analysis insert funny functions in new interposed cleanup +blocks. The thing is that we need some way for VMR conversion to: + 1] Get its hands on the returned values. + 2] Do weird control shit. + 3] Deliver the values to the original continuation destination. +I.e. we need some way to interpose arbitrary code in the path of value +delivery. + +What we do is replace the NLX uses of the continuation with another +continuation that is received by a MV-Call to \%NLX-VALUES in a cleanup block +that is interposed between the NLX uses and the old continuation's block. The +MV-Call uses the original continuation to deliver its values to. + +[Actually, it's not really important that this be an MV-Call, since it has to +be special-cased by LTN anyway. Or maybe we would want it to be an MV call. +If we did normal LTN analysis of an MV call, it would force the returned values +into the unknown values convention, which is probably pretty convenient for use +in NLX. + +Then the entry code would have to use some special VOPs to receive the unknown +values. But we probably need special VOPs for NLX entry anyway, and the code +can share with the call VOPs. Also we probably need the technology anyway, +since THROW will use truly unknown values.] + + +On entry to a dynamic extent that has non-local-exists into it (always at an +ENTRY node), we take a complete snapshot of the dynamic state: + +\begin{itemize} +\item the top pointers for all stacks +\item current Catch and Unwind-Protect +\item current special binding (binding stack pointer in shallow binding) +\end{itemize} + +We insert code at the re-entry point which restores the saved dynamic state. +All TNs live at an NLX EP are forced onto the stack, so we don't have to restore +them, and we don't have to worry about getting them saved. + diff --git a/doc/internals/cmu/object.tex b/doc/internals/cmu/object.tex new file mode 100644 index 0000000000..a6a3deafa9 --- /dev/null +++ b/doc/internals/cmu/object.tex @@ -0,0 +1,770 @@ +\chapter{Object Format} + + + +\label{sec:tagging} + +\section{Tagging} + +The following is a key of the three bit low-tagging scheme: +\begin{description} + \item[000] even fixnum + \item[001] function pointer + \item[010] even other-immediate (header-words, characters, symbol-value trap value, etc.) + \item[011] list pointer + \item[100] odd fixnum + \item[101] structure pointer + \item[110] odd other immediate + \item[111] other-pointer to data-blocks (other than conses, structures, + and functions) +\end{description} + +This tagging scheme forces a dual-word alignment of data-blocks on the heap, +but this can be pretty negligible: +\begin{itemize} +\item RATIOS and COMPLEX must have a header-word anyway since they are not a + major type. This wastes one word for these infrequent data-blocks since + they require two words for the data. + +\item BIGNUMS must have a header-word and probably contain only one other word + anyway, so we probably don't waste any words here. Most bignums just + barely overflow fixnums, that is by a bit or two. + +\item Single and double FLOATS? + no waste, or + one word wasted + +\item SYMBOLS have a pad slot (current called the setf function, but unused.) +\end{itemize} +Everything else is vector-like including code, so these probably take up +so many words that one extra one doesn't matter. + + + +\section{GC Comments} + +Data-Blocks comprise only descriptors, or they contain immediate data and raw +bits interpreted by the system. GC must skip the latter when scanning the +heap, so it does not look at a word of raw bits and interpret it as a pointer +descriptor. These data-blocks require headers for GC as well as for operations +that need to know how to interpret the raw bits. When GC is scanning, and it +sees a header-word, then it can determine how to skip that data-block if +necessary. Header-Words are tagged as other-immediates. See +``Other-Immediates'', section~\ref{sec:other-immediates} and +``Data-Blocks and Header-Words'', section~\ref{sec:data-blocks-and-header} for comments on +distinguishing header-words from other-immediate data. This distinction is +necessary since we scan through data-blocks containing only descriptors just as +we scan through the heap looking for header-words introducing data-blocks. + +Data-Blocks containing only descriptors do not require header-words for GC +since the entire data-block can be scanned by GC a word at a time, taking +whatever action is necessary or appropriate for the data in that slot. For +example, a cons is referenced by a descriptor with a specific tag, and the +system always knows the size of this data-block. When GC encounters a pointer +to a cons, it can transport it into the new space, and when scanning, it can +simply scan the two words manifesting the cons interpreting each word as a +descriptor. Actually there is no cons tag, but a list tag, so we make sure the +cons is not nil when appropriate. A header may still be desired if the pointer +to the data-block does not contain enough information to adequately maintain +the data-block. An example of this is a simple-vector containing only +descriptor slots, and we attach a header-word because the descriptor pointing +to the vector lacks necessary information -- the type of the vector's elements, +its length, etc. + +There is no need for a major tag for GC forwarding pointers. Since the tag +bits are in the low end of the word, a range check on the start and end of old +space tells you if you need to move the thing. This is all GC overhead. + + + +\section{Structures} + +A structure descriptor has the structure lowtag type code, making +{\tt structurep} a fast operation. A structure +data-block has the following format: +\begin{verbatim} + ------------------------------------------------------- + | length (24 bits) | Structure header type (8 bits) | + ------------------------------------------------------- + | structure type name (a symbol) | + ------------------------------------------------------- + | structure slot 0 | + ------------------------------------------------------- + | ... structure slot length - 2 | + ------------------------------------------------------- +\end{verbatim} + +The header word contains the structure length, which is the number of words +(other than the header word.) The length is always at least one, since the +first word of the structure data is the structure type name. + + +\section{Fixnums} + +A fixnum has one of the following formats in 32 bits: +\begin{verbatim} + ------------------------------------------------------- + | 30 bit 2's complement even integer | 0 0 0 | + ------------------------------------------------------- +\end{verbatim} +or +\begin{verbatim} + ------------------------------------------------------- + | 30 bit 2's complement odd integer | 1 0 0 | + ------------------------------------------------------- +\end{verbatim} + +Effectively, there is one tag for immediate integers, two zeros. This buys one +more bit for fixnums, and now when these numbers index into simple-vectors or +offset into memory, they point to word boundaries on 32-bit, byte-addressable +machines. That is, no shifting need occur to use the number directly as an +offset. + +This format has another advantage on byte-addressable machines when fixnums are +offsets into vector-like data-blocks, including structures. Even though we +previously mentioned data-blocks are dual-word aligned, most indexing and slot +accessing is word aligned, and so are fixnums with effectively two tag bits. + +Two tags also allow better usage of special instructions on some machines that +can deal with two low-tag bits but not three. + +Since the two bits are zeros, we avoid having to mask them off before using the +words for arithmetic, but division and multiplication require special shifting. + + + +\section{Other-immediates} +\label{sec:other-immediates} + + + +As for fixnums, there are two different three-bit lowtag codes for +other-immediate, allowing 64 other-immediate types: +\begin{verbatim} +---------------------------------------------------------------- +| Data (24 bits) | Type (8 bits with low-tag) | 1 0 | +---------------------------------------------------------------- +\end{verbatim} + +The type-code for an other-immediate type is considered to include the two +lowtag bits. This supports the concept of a single ``type code'' namespace for +all descriptors, since the normal lowtag codes are disjoint from the +other-immediate codes. + +For other-pointer objects, the full eight bits of the header type code are used +as the type code for that kind of object. This is why we use two lowtag codes +for other-immediate types: each other-pointer object needs a distinct +other-immediate type to mark its header. + +The system uses the other-immediate format for characters, +the {\tt symbol-value} unbound trap value, and header-words for data-blocks on +the heap. The type codes are laid out to facilitate range checks for common +subtypes; for example, all numbers will have contiguous type codes which are +distinct from the contiguous array type codes. See +section~\ref{sec:data-blocks-and-o-i} +for details. + + +\section{Data-Blocks and Header-Word Format} +\label{sec:data-blocks-and-header} + +Pointers to data-blocks have the following format: +\begin{verbatim} +---------------------------------------------------------------- +| Dual-word address of data-block (29 bits) | 1 1 1 | +---------------------------------------------------------------- +\end{verbatim} + +The word pointed to by the above descriptor is a header-word, and it has the +same format as an other-immediate: +\begin{verbatim} +---------------------------------------------------------------- +| Data (24 bits) | Type (8 bits with low-tag) | 0 1 0 | +---------------------------------------------------------------- +\end{verbatim} +This is convenient for scanning the heap when GC'ing, but it does mean that +whenever GC encounters an other-immediate word, it has to do a range check on +the low byte to see if it is a header-word or just a character (for example). +This is easily acceptable performance hit for scanning. + +The system interprets the data portion of the header-word for non-vector +data-blocks as the word length excluding the header-word. For example, the +data field of the header for ratio and complex numbers is two, one word each +for the numerator and denominator or for the real and imaginary parts. + +For vectors and data-blocks representing Lisp objects stored like vectors, the +system (usually) ignores the data portion of the header-word: +\begin{verbatim} +---------------------------------------------------------------- +| Unused Data (24 bits) | Type (8 bits with low-tag) | 0 1 0 | +---------------------------------------------------------------- +| Element Length of Vector (30 bits) | 0 0 | +---------------------------------------------------------------- +\end{verbatim} + +Using a separate word allows for much larger vectors, and it allows {\tt +length} to simply access a single word without masking or shifting. Similarly, +the header for complex arrays and vectors has a second word, following the +header-word, the system uses for the fill pointer, so computing the length of +any array is the same code sequence. + +For normal Lisp vectors, the data portion MUST be zero. For hash +tables, a vector is used to store information about the hash key and +value, and the data portion is non-zero to indicate to GC that this is +the key/value vector for the hash table. GENCGC uses this to +determine scavenge the key/value pairs correctly. Cheney GC also uses +this to determine if rehashing (for EQ hash tables) is needed. + + +\section{Data-Blocks and Other-immediates Typing} + +\label{sec:data-blocks-and-o-i} +These are the other-immediate types. We specify them including all low eight +bits, including the other-immediate tag, so we can think of the type bits as +one type -- not an other-immediate major type and a subtype. Also, fetching a +byte and comparing it against a constant is more efficient than wasting even a +small amount of time shifting out the other-immediate tag to compare against a +five bit constant. (The current values can be obtained from the +generated \code{internals.h} file.) +\begin{verbatim} + HEX +Number (< 36) + bignum 10 0A + ratio 14 0E + single-float 18 12 + double-float 22 16 + double-double-float 26 1A + complex 30 1E + (complex single-float) 34 22 + (complex double-float) 38 26 + (complex double-double-float) 42 2A + +Array (<= 46 code 118) + Simple-Array (<= 46 code 118) + simple-array 46 2E + Vector (<= 50 code 118) + simple-string 50 32 + simple-bit-vector 54 36 + simple-vector 58 3A + (simple-array (unsigned-byte 2) (*)) 62 3E + (simple-array (unsigned-byte 4) (*)) 66 42 + (simple-array (unsigned-byte 8) (*)) 70 46 + (simple-array (unsigned-byte 16) (*)) 74 4A + (simple-array (unsigned-byte 32) (*)) 78 4E + (simple-array (signed-byte 8) (*)) 82 52 + (simple-array (signed-byte 16) (*)) 86 56 + (simple-array (signed-byte 30) (*)) 90 5A + (simple-array (signed-byte 32) (*)) 94 5E + (simple-array single-float (*)) 98 62 + (simple-array double-float (*)) 102 66 + (simple-array double-double-float (*)) 106 6A + (simple-array (complex single-float) (*) 110 6E + (simple-array (complex double-float) (*) 114 72 + (simple-array (complex double-double) (*) 118 76 + complex-string 122 7A + complex-bit-vector 126 7E + (array * (*)) -- general complex vector. 130 82 + complex-array 134 86 + +code-header-type 138 8A +function-header-type 142 8E +closure-header-type 146 92 +funcallable-instance-header-type 150 96 +byte-code-function-header-type 154 9A +byte-code-closure-header-type 158 9E +closure-function-header-type 162 A2 +return-pc-header-type (a.k.a LRA) 166 A6 +value-cell-header-type 170 AA +symbol-header-type 174 AE +base-character-type 178 B2 +system-area-pointer-type (header type) 182 B6 +unbound-marker 186 BA +weak-pointer-type 190 BE +instance-header-type 194 C2 +fdefn-type 198 C6 +scavenger-hook-type 202 CA +\end{verbatim} + +\section{Strings} + +All strings in the system are C-null terminated. This saves copying the bytes +when calling out to C. The only time this wastes memory is when the string +contains a multiple of eight characters, and then the system allocates two more +words (since Lisp objects are dual-word aligned) to hold the C-null byte. +Since the system will make heavy use of C routines for systems calls and +libraries that save reimplementation of higher level operating system +functionality (such as pathname resolution or current directory computation), +saving on copying strings for C should make C call out more efficient. + +The length word in a string header, see ``Data-Blocks and Header-Word +Format'', section~\ref{sec:data-blocks-and-header}, counts only the characters truly in the Common Lisp string. +Allocation and GC will have to know to handle the extra C-null byte, and GC +already has to deal with rounding up various objects to dual-word alignment. + + + +\section{Symbols and NIL} + +Symbol data-block has the following format: +\begin{verbatim} +------------------------------------------------------- +| 5 (data-block words) | Symbol Type (8 bits) | +------------------------------------------------------- +| Value Descriptor | +------------------------------------------------------- +| Hash Value (x86/amd64/sparc) Unused (other arch.) | +------------------------------------------------------- +| Property List | +------------------------------------------------------- +| Print Name | +------------------------------------------------------- +| Package | +------------------------------------------------------- +\end{verbatim} + +All of these slots are self-explanatory given what symbols must do in Common +Lisp. + +The issues with nil are that we want it to act like a symbol, and we need list +operations such as CAR and CDR to be fast on it. CMU Common Lisp solves this +by putting nil as the first object in static space, where other global values +reside, so it has a known address in the system: +\begin{verbatim} +------------------------------------------------------- <-- space +| 6 (data-block words) | 0 | start +------------------------------------------------------- +| 0 (data-block words) | Symbol Type (8 bits) | +------------------------------------------------------- <-- nil +| Value/CAR | +------------------------------------------------------- +| Hash Value/CDR | +------------------------------------------------------- +| Property List | +------------------------------------------------------- +| Print Name | +------------------------------------------------------- +| Package | +------------------------------------------------------- +| ... | +------------------------------------------------------- +\end{verbatim} +In addition, we make the list typed pointer to nil actually point past the +header word of the nil symbol data-block. This has usefulness explained below. +The value and hash-value of nil are nil. Therefore, any reference to nil used +as a list has quick list type checking, and CAR and CDR can go right through +the first and second words as if nil were a cons object. + +When there is a reference to nil used as a symbol, the system adds offsets to +the address the same as it does for any symbol. This works due to a +combination of nil pointing past the symbol header-word and the chosen list and +other-pointer type tags. The list type tag is four less than the other-pointer +type tag, but nil points four additional bytes into its symbol data-block. + + + +\section{Array Headers} + +The array-header data-block has the following format: +\begin{verbatim} +---------------------------------------------------------------- +| Header Len (24 bits) = Array Rank +6 | Array Type (8 bits) | +---------------------------------------------------------------- +| Fill Pointer (30 bits) | 0 0 | +---------------------------------------------------------------- +| Fill Pointer p (29 bits) -- t or nil | 1 1 1 | +---------------------------------------------------------------- +| Available Elements (30 bits) | 0 0 | +---------------------------------------------------------------- +| Data Vector (29 bits) | 1 1 1 | +---------------------------------------------------------------- +| Displacement (30 bits) | 0 0 | +---------------------------------------------------------------- +| Displacedp (29 bits) -- t or nil | 1 1 1 | +---------------------------------------------------------------- +| Range of First Index (30 bits) | 0 0 | +---------------------------------------------------------------- + . + . + . + +\end{verbatim} +The array type in the header-word is one of the eight-bit patterns from +``Data-Blocks and Other-immediates Typing'', section~\ref{sec:data-blocks-and-header}, indicating that this is a complex +string, complex vector, complex bit-vector, or a multi-dimensional array. The +data portion of the other-immediate word is the length of the array header +data-block. Due to its format, its length is always six greater than the +array's number of dimensions. The following words have the following +interpretations and types: +\begin{description} + \item[Fill Pointer:] + This is a fixnum indicating the number of elements in the data vector + actually in use. This is the logical length of the array, and it is + typically the same value as the next slot. This is the second word, so + LENGTH of any array, with or without an array header, is just four bytes + off the pointer to it. + \item[Fill Pointer P:] + This is either T or NIL and indicates whether the array uses the + fill-pointer or not. + \item[Available Elements:] + This is a fixnum indicating the number of elements for which there is + space in the data vector. This is greater than or equal to the logical + length of the array when it is a vector having a fill pointer. + \item[Data Vector:] + This is a pointer descriptor referencing the actual data of the array. + This a data-block whose first word is a header-word with an array type as + described in ``Data-Blocks and Header-Word Format'', section~\ref{sec:data-blocks-and-header} and + ``Data-Blocks and Other-immediates Typing'', section~\ref{sec:data-blocks-and-o-i} + \item[Displacement:] + This is a fixnum added to the computed row-major index for any array. + This is typically zero. + \item[Displacedp:] + This is either t or nil. This is separate from the displacement slot, so + most array accesses can simply add in the displacement slot. The rare + need to know if an array is displaced costs one extra word in array + headers which probably aren't very frequent anyway. + \item[Range of First Index:] + This is a fixnum indicating the number of elements in the first dimension + of the array. Legal index values are zero to one less than this number + inclusively. IF the array is zero-dimensional, this slot is + non-existent. + \item[... (remaining slots):] + There is an additional slot in the header for each dimension of the + array. These are the same as the Range of First Index slot. +\end{description} + + +\section{Bignums} + +Bignum data-blocks have the following format: +\begin{verbatim} +------------------------------------------------------- +| Length (24 bits) | Bignum Type (8 bits) | +------------------------------------------------------- +| least significant bits | +------------------------------------------------------- + . + . + . +\end{verbatim} +The elements contain the two's complement representation of the integer with +the least significant bits in the first element or closer to the header. The +sign information is in the high end of the last element. + + + + +\section{Code Data-Blocks} + +A code data-block is the run-time representation of a ``component''. A component +is a connected portion of a program's flow graph that is compiled as a single +unit, and it contains code for many functions. Some of these functions are +callable from outside of the component, and these are termed ``entry points''. + +Each entry point has an associated user-visible function data-block (of type +{\tt function}). The full call convention provides for calling an entry point +specified by a function object. + +Although all of the function data-blocks for a component's entry points appear +to the user as distinct objects, the system keeps all of the code in a single +code data-block. The user-visible function object is actually a pointer into +the middle of a code data-block. This allows any control transfer within a +component to be done using a relative branch. + +Besides a function object, there are other kinds of references into the middle +of a code data-block. Control transfer into a function also occurs at the +return-PC for a call. The system represents a return-PC somewhat similarly to +a function, so GC can also recognize a return-PC as a reference to a code +data-block. This representation is known as a Lisp Return Address (LRA). + +It is incorrect to think of a code data-block as a concatenation of ``function +data-blocks''. Code for a function is not emitted in any particular order with +respect to that function's function-header (if any). The code following a +function-header may only be a branch to some other location where the +function's ``real'' definition is. + + +The following are the three kinds of pointers to code data-blocks: +\begin{description} + \item[Code pointer (labeled A below):] + A code pointer is a descriptor, with other-pointer low-tag bits, pointing + to the beginning of the code data-block. The code pointer for the + currently running function is always kept in a register (CODE). In + addition to allowing loading of non-immediate constants, this also serves + to represent the currently running function to the debugger. + \item[LRA (labeled B below):] + The LRA is a descriptor, with other-pointer low-tag bits, pointing + to a location for a function call. Note that this location contains no + descriptors other than the one word of immediate data, so GC can treat + LRA locations the same as instructions. + \item[Function (labeled C below):] + A function is a descriptor, with function low-tag bits, that is user + callable. When a function header is referenced from a closure or from + the function header's self-pointer, the pointer has other-pointer low-tag + bits, instead of function low-tag bits. This ensures that the internal + function data-block associated with a closure appears to be uncallable + (although users should never see such an object anyway). + + Information about functions that is only useful for entry points is kept + in some descriptors following the function's self-pointer descriptor. + All of these together with the function's header-word are known as the + ``function header''. GC must be able to locate the function header. We + provide for this by chaining together the function headers in a NIL + terminated list kept in a known slot in the code data-block. +\end{description} + +A code data-block has the following format: +\begin{verbatim} +A --> +**************************************************************** +| Header-Word count (24 bits) | Code-Type (8 bits) | +---------------------------------------------------------------- +| Number of code words (fixnum tag) | +---------------------------------------------------------------- +| Pointer to first function header (other-pointer tag) | +---------------------------------------------------------------- +| Debug information (structure tag) | +---------------------------------------------------------------- +| First constant (a descriptor) | +---------------------------------------------------------------- +| ... | +---------------------------------------------------------------- +| Last constant (and last word of code header) | +---------------------------------------------------------------- +| Some instructions (non-descriptor) | +---------------------------------------------------------------- +| (pad to dual-word boundary if necessary) | + +B --> +**************************************************************** +| Word offset from code header (24) | Return-PC-Type (8) | +---------------------------------------------------------------- +| First instruction after return | +---------------------------------------------------------------- +| ... more code and LRA header-words | +---------------------------------------------------------------- +| (pad to dual-word boundary if necessary) | + +C --> +**************************************************************** +| Offset from code header (24) | Function-Header-Type (8) | +---------------------------------------------------------------- +| x86/amd64/sparc: Address of start of instructions for | +| function (non-descriptor) | +| other architectures: | +| Self-pointer back to previous word (with other-pointer tag) | +---------------------------------------------------------------- +| Pointer to next function (other-pointer low-tag) or NIL | +---------------------------------------------------------------- +| Function name (a string or a symbol) | +---------------------------------------------------------------- +| Function debug arglist (a string) | +---------------------------------------------------------------- +| Function type (a list-style function type specifier) | +---------------------------------------------------------------- +| Start of instructions for function (non-descriptor) | +---------------------------------------------------------------- +| More function headers and instructions and return PCs, | +| until we reach the total size of header-words + code | +| words. | +---------------------------------------------------------------- +\end{verbatim} + +The following are detailed slot descriptions: +\begin{description} + \item[Code data-block header-word:] + The immediate data in the code data-block's header-word is the number of + leading descriptors in the code data-block, the fixed overhead words plus + the number of constants. The first non-descriptor word, some code, + appears at this word offset from the header. + \item[Number of code words:] + The total number of non-header-words in the code data-block. The total + word size of the code data-block is the sum of this slot and the + immediate header-word data of the previous slot. + header-word. + \item[Pointer to first function header:] + A NIL-terminated list of the function headers for all entry points to + this component. + \item[Debug information:] + The DEBUG-INFO structure describing this component. All information that + the debugger wants to get from a running function is kept in this + structure. Since there are many functions, the current PC is used to + locate the appropriate debug information. The system keeps the debug + information separate from the function data-block, since the currently + running function may not be an entry point. There is no way to recover + the function object for the currently running function, since this + data-block may not exist. + \item[First constant ... last constant:] + These are the constants referenced by the component, if there are any. +\vspace{1ex} + \item[LRA header word:] + The immediate header-word data is the word offset from the enclosing code + data-block's header-word to this word. This allows GC and the debugger + to easily recover the code data-block from an LRA. The code at the + return point restores the current code pointer using a subtract immediate + of the offset, which is known at compile time. +\vspace{1ex} + \item[Function entry point header-word:] + The immediate header-word data is the word offset from the enclosing code + data-block's header-word to this word. This is the same as for the + return-PC header-word. + \item[Address of start of instructions for function:] This is + implemented on x86, amd64, and sparc only. In a non-closure + function, this address allows the call sequence to always + indirect through the second word in a user callable function. + See section ``Closure Format''. With a closure, indirecting + through the second word also gets you the start of instructions + of a function. This pointer is a raw address, not a descriptor. + \item[Self-pointer back to header-word:] + In a non-closure function, this self-pointer to the previous header-word + allows the call sequence to always indirect through the second word in a + user callable function. See section ``Closure Format''. With a closure, + indirecting through the second word gets you a function header-word. The + system ignores this slot in the function header for a closure, since it + has already indirected once, and this slot could be some random thing + that causes an error if you jump to it. This pointer has an + other-pointer tag instead of a function pointer tag, indicating it is not + a user callable Lisp object. + \item[Pointer to next function:] + This is the next link in the thread of entry point functions found in + this component. This value is NIL when the current header is the last + entry point in the component. + \item[Function name:] + This function's name (for printing). If the user defined this function + with DEFUN, then this is the defined symbol, otherwise it is a + descriptive string. + \item[Function debug arglist:] + A printed string representing the function's argument list, for human + readability. If it is a macroexpansion function, then this is the + original DEFMACRO arglist, not the actual expander function arglist. + \item[Function type:] + A list-style function type specifier representing the argument signature + and return types for this function. For example, + \begin{verbatim} +(function (fixnum fixnum fixnum) fixnum) + \end{verbatim} + or + \begin{verbatim} +(function (string &key (:start unsigned-byte)) string) + \end{verbatim} + This information is intended for machine readablilty, such as by the + compiler. +\end{description} + + +\section{Closure Format} + +A closure data-block has the following format: +\begin{verbatim} +---------------------------------------------------------------- +| Word size (24 bits) | Closure-Type (8 bits) | +---------------------------------------------------------------- +| Pointer to function header (other-pointer low-tag) | +---------------------------------------------------------------- +| . | +| Environment information | +| . | +---------------------------------------------------------------- +\end{verbatim} + +A closure descriptor has function low-tag bits. This means that a descriptor +with function low-tag bits may point to either a function header or to a +closure. The idea is that any callable Lisp object has function low-tag bits. +Insofar as call is concerned, we make the format of closures and non-closure +functions compatible. This is the reason for the self-pointer in a function +header. Whenever you have a callable object, you just jump through the second +word, offset some bytes, and go. + + + +\section{Function call} + +Due to alignment requirements and low-tag codes, it is not possible to use a +hardware call instruction to compute the LRA. Instead the LRA +for a call is computed by doing an add-immediate to the start of the code +data-block. + +An advantage of using a single data-block to represent both the descriptor and +non-descriptor parts of a function is that both can be represented by a +single pointer. This reduces the number of memory accesses that have to be +done in a full call. For example, since the constant pool is implicit in an +LRA, a call need only save the LRA, rather than saving both the +return PC and the constant pool. + + + +\section{Memory Layout} + +\cmucl{} has four spaces, read-only, static, dynamic-0, and dynamic-1. +Read-only contains objects that the system never modifies, moves, or reclaims. +Static space contains some global objects necessary for the system's runtime or +performance (since they are located at a known offset at a known address), and +the system never moves or reclaims these. However, GC does need to scan static +space for references to moved objects. Dynamic-0 and dynamic-1 are the two +heap areas for stop-and-copy GC algorithms. + +What global objects are at the head of static space??? +\begin{verbatim} + NIL + eval::*top-of-stack* + lisp::*current-catch-block* + lisp::*current-unwind-protect* + FLAGS (RT only) + BSP (RT only) + HEAP (RT only) +\end{verbatim} + +In addition to the above spaces, the system has a control stack, binding stack, +and a number stack. The binding stack contains pairs of descriptors, a symbol +and its previous value. The number stack is the same as the C stack, and the +system uses it for non-Lisp objects such as raw system pointers, saving +non-Lisp registers, parts of bignum computations, etc. + + + +\section{System Pointers} + +The system pointers reference raw allocated memory, data returned by foreign +function calls, etc. The system uses these when you need a pointer to a +non-Lisp block of memory, using an other-pointer. This provides the greatest +flexibility by relieving contraints placed by having more direct references +that require descriptor type tags. + +A system area pointer data-block has the following format: +\begin{verbatim} +------------------------------------------------------- +| 1 (data-block words) | SAP Type (8 bits) | +------------------------------------------------------- +| system area pointer | +------------------------------------------------------- +\end{verbatim} + +``SAP'' means ``system area pointer'', and much of our code contains this naming +scheme. We don't currently restrict system pointers to one area of memory, but +if they do point onto the heap, it is up to the user to prevent being screwed +by GC or whatever. + +\section{Weak Pointers} +\label{sec:weak-pointers} + +A weak-pointer data-block has the following format: +\begin{verbatim} +------------------------------------------------------- +| 4 (data-block words) | Weak pointer Type (8 bits) | +------------------------------------------------------- +| weak-pointer-value | +------------------------------------------------------- +| weak-pointer-broken | +------------------------------------------------------- +| mark-bit (T or NIL) | +------------------------------------------------------- +| next | +------------------------------------------------------- +\end{verbatim} + +The mark-bit is used when gencgc is available. It's used to note if +this weak pointer has been visited before so that scavenging +weak-pointers isn't an $O(n^2)$ process. + +The last slot is an internal slot used by the C runtime to chain all +the weak pointers together for GC. + diff --git a/doc/internals/cmu/outline.txt b/doc/internals/cmu/outline.txt new file mode 100644 index 0000000000..690781c922 --- /dev/null +++ b/doc/internals/cmu/outline.txt @@ -0,0 +1,120 @@ +Todo: +fasl.tex +In good shape. + +object.tex +Fairly good, but should probably be integrated with description of primitives +in vm.tex. + +front.tex +Needs updating cleanup scan. Not too bad. + +middle.tex +Need VMR overview. New names for GTN/LTN? Needs general cleanup, but not too +bad. NLX and stack are the worst. + +back.tex +Pack and assembler need more info. General cleanup. + + +compiler-overview.tex +Adapt introductory material from /../fred/usr/ram/comp.mss, pap:talk.mss +Division between ICR overview and ICR convert needs work. + +debugger.tex +Needs much work. Merge much info from debug-info and debug-int. Duplicating a +fair amount of stuff in the source may make sense where, since this is a part +of the system that is generally interesting. And also, a part that people +building on CMU CL might want to understand. + +glossary.tex +Finish, integrate w/ main text? + +interpreter.tex +Very sketchy and tentative. Needs to be fleshed out from the code. + +retargeting.tex +Very rough. Needs to be merged with parts of vm.tex (call vops). Needs some +additional text. Documentation of assembler, and all other exported +interfaces. (Generate defined VOP descriptions from the core, keyed to files?) + +vm.tex +This file should probably cease to exist, going into object, retargeting and +introductory material. [Also other scrap in stuff/] + + +[VMR and ICR overview also needed...] + +architecture.tex +Missing sections on startup code, compiling, building. + +environment.tex +Needs to be written: type system and info database interfaces. + +interface.tex +Needs to be written: source paths and error message utilities. + +lowlev.tex +Needs to be written. All manner of low-level stuff: memory layout and +management, core file format, C interface, low-level debugging (and ldb.) + + +Several different audiences: + -- Curious compiler implementors (not a big priority. Downplay academic + aspects, i.e. comparisons to other techniques, analysis of limitations, + future work...) Compiler part can be more academic, and include some + justifications of other design decisions. + -- System maintainers. + -- People retargeting the compiler. + -- People bringing up the system in a new environment. + +Sys arch part: + Package + file structure [system.txt] + system building [compiling.txt] + bootstrapping & cross compiling + +Compiler design: + Overview (mirror structure of rest of the part) + ICR data structure + Front end [front.tex] + Basic VMR data structures (no back-end stuff) + Middle end [middle.tex] + Back end + data structures [back.tex] + + Error system interface + Source tracking + +Compiler retargeting: + VM definition concepts [porting.txt, mail.txt, retargeting.tex] + SCs, SBs, primitive-types + Defining VOPS + time specification + defining + and using the assembler + Required VOPs [internal.txt, lowlev.txt, vm.mss] + Standard primitives [vm.mss] (broken down by type, parallels object format + section structure.) + Customizing VMR conversion + multiple hardware + constant operands + VM specific transforms + special-case IR2 convert methods + +Run-time system: + type system + info database + Data format [object.tex] + Debugger: + Info format [debug.txt] + Stack parsing [debug.txt] + Breakpoints + Internal errors + Signals + Memory management: [William] + heap Layout + stacks + GC + misc implementation stuff: foreign call, assembly routines [lowlev.txt] + LDB and low-level debugging + core file format [William] + fasl format [fasl.tex] diff --git a/doc/internals/cmu/retargeting.tex b/doc/internals/cmu/retargeting.tex new file mode 100644 index 0000000000..08399cc853 --- /dev/null +++ b/doc/internals/cmu/retargeting.tex @@ -0,0 +1,1113 @@ +\part{Compiler Retargeting} + +\chapter{Retargeting the Compiler} +[\#\#\# + +In general, it is a danger sign if a generator references a TN that isn't an +operand or temporary, since lifetime analysis hasn't been done for that use. +We are doing weird stuff for the old-cont and return-pc passing locations, +hoping that the conflicts at the called function have the desired effect. +Other stuff? When a function returns unknown values, we don't reference the +values locations when a single-value return is done. But nothing is live at a +return point anyway. + + + +Have a way for template conversion to special-case constant arguments? +How about: + If an arg restriction is (:satisfies [$<$predicate function$>$]), and the + corresponding argument is constant, with the constant value satisfying the + predicate, then (if any other restrictions are satisfied), the template + will be emitted with the literal value passed as an info argument. If the + predicate is omitted, then any constant will do. + + We could sugar this up a bit by allowing (:member $<$object$>$*) for + (:satisfies (lambda (x) (member x '($<$object$>$*)))) + +We could allow this to be translated into a Lisp type by adding a new Constant +type specifier. This could only appear as an argument to a function type. +To satisfy (Constant $<$type$>$), the argument must be a compile-time constant of +the specified type. Just Constant means any constant (i.e. (Constant *)). +This would be useful for the type constraints on ICR transforms. + + +Constant TNs: we count on being able to indirect to the leaf, and don't try to +wedge the information into the offset. We set the FSC to an appropriate +immediate SC. + + Allow ``more operands'' to VOPs in define-vop. You can't do much with the + more operands: define-vop just fills in the cost information according to + the loading costs for a SC you specify. You can't restrict more operands, + and you can't make local preferences. In the generator, the named variable + is bound to the TN-ref for the first extra operand. This should be good + enough to handle all the variable arg VOPs (primarily function call and + return). Usually more operands are used just to get TN lifetimes to work + out; the generator actually ignores them. + + Variable-arg VOPs can't be used with the VOP macro. You must use VOP*. + VOP* doesn't do anything with these extra operand except stick them on the + ends of the operand lists passed into the template. VOP* is often useful + within the convert functions for non-VOP templates, since it can emit a VOP + using an already prepared TN-Ref list. + + + It is pretty basic to the whole primitive-type idea that there is only one + primitive-type for a given lisp type. This is really the same as saying + primitive types are disjoint. A primitive type serves two somewhat + unrelated purposes: + -- It is an abstraction of a Lisp type used to select type specific + operations. Originally kind of an efficiency hack, but it lets a + template's type signature be used both for selection and operand + representation determination. + -- It represents a set of possible representations for a value (SCs). The + primitive type is used to determine the legal SCs for a TN, and is also + used to determine which type-coercion/move VOP to use. + +] + +There are basically three levels of target dependence: + + -- Code in the ``front end'' (before VMR conversion) deals only with Lisp + semantics, and is totally target independent. + + -- Code after VMR conversion and before code generation depends on the VM, + but should work with little modification across a wide range of + ``conventional'' architectures. + + -- Code generation depends on the machine's instruction set and other + implementation details, so it will have to be redone for each + implementation. Most of the work here is in defining the translation into + assembly code of all the supported VOPs. + + + +\chapter{Storage bases and classes} +New interface: instead of CURRENT-FRAME-SIZE, have CURRENT-SB-SIZE \verb+<name>+ which +returns the current element size of the named SB. + +How can we have primitive types that overlap, i.e. (UNSIGNED-BYTE 32), +(SIGNED-BYTE 32), FIXNUM? +Primitive types are used for two things: + Representation selection: which SCs can be used to represent this value? + For this purpose, it isn't necessary that primitive types be disjoint, + since any primitive type can choose an arbitrary set of + representations. For moves between the overlapping representations, + the move/load operations can just be noops when the locations are the + same (vanilla MOVE), since any bad moves should be caught out by type + checking. + VOP selection: + Is this operand legal for this VOP? When ptypes overlap in interesting + ways, there is a problem with allowing just a simple ptype restriction, + since we might want to allow multiple ptypes. This could be handled + by allowing ``union primitive types'', or by allowing multiple primitive + types to be specified (only in the operand restriction.) The latter + would be along the lines of other more flexible VOP operand restriction + mechanisms, (constant, etc.) + + + +Ensure that load/save-operand never need to do representation conversion. + +The PRIMITIVE-TYPE more/coerce info would be moved into the SC. This could +perhaps go along with flushing the TN-COSTS. We would annotate the TN with +best SC, which implies the representation (boxed or unboxed). We would still +need to represent the legal SCs for restricted TNs somehow, and also would have to +come up with some other way for pack to keep track of which SCs we have already +tried. + +An SC would have a list of ``alternate'' SCs and a boolean SAVE-P value that +indicates it needs to be saved across calls in some non-SAVE-P SC. A TN is +initially given its ``best'' SC. The SC is annotated with VOPs that are used for +moving between the SC and its alternate SCs (load/save operand, save/restore +register). It is also annotated with the ``move'' VOPs used for moving between +this SC and all other SCs it is possible to move between. We flush the idea +that there is only c-to-t and c-from-t. + +But how does this mesh with the idea of putting operand load/save back into the +generator? Maybe we should instead specify a load/save function? The +load/save functions would also differ from the move VOPs in that they would +only be called when the TN is in fact in that particular alternate SC, whereas +the move VOPs will be associated with the primary SC, and will be emitted +before it is known whether the TN will be packed in the primary SC or an +alternate. + +I guess a packed SC could also have immediate SCs as alternate SCs, and +constant loading functions could be associated with SCs using this mechanism. + +So given a TN packed in SC X and an SC restriction for Y and Z, how do we know +which load function to call? There would be ambiguity if X was an alternate +for both Y and Z and they specified different load functions. This seems +unlikely to arise in practice, though, so we could just detect the ambiguity +and give an error at define-vop time. If they are doing something totally +weird, they can always inhibit loading and roll their own. + +Note that loading costs can be specified at the same time (same syntax) as +association of loading functions with SCs. It seems that maybe we will be +rolling DEFINE-SAVE-SCS and DEFINE-MOVE-COSTS into DEFINE-STORAGE-CLASS. + +Fortunately, these changes will affect most VOP definitions very little. + + +A Storage Base represents a physical storage resource such as a register set or +stack frame. Storage bases for non-global resources such as the stack are +relativized by the environment that the TN is allocated in. Packing conflict +information is kept in the storage base, but non-packed storage resources such +as closure environments also have storage bases. +Some storage bases: +\begin{verbatim} + General purpose registers + Floating point registers + Boxed (control) stack environment + Unboxed (number) stack environment + Closure environment +\end{verbatim} + +A storage class is a potentially arbitrary set of the elements in a storage +base. Although conceptually there may be a hierarchy of storage classes such +as ``all registers'', ``boxed registers'', ``boxed scratch registers'', this doesn't +exist at the implementation level. Such things can be done by specifying +storage classes whose locations overlap. A TN shouldn't have lots of +overlapping SC's as legal SC's, since time would be wasted repeatedly +attempting to pack in the same locations. + +There will be some SC's whose locations overlap a great deal, since we get Pack +to do our representation analysis by having lots of SC's. An SC is basically a +way of looking at a storage resource. Although we could keep a fixnum and an +unboxed representation of the same number in the same register, they correspond +to different SC's since they are different representation choices. + +TNs are annotated with the primitive type of the object that they hold: + T: random boxed object with only one representation. + Fixnum, Integer, XXX-Float: Object is always of the specified numeric type. + String-Char: Object is always a string-char. + +When a TN is packed, it is annotated with the SC it was packed into. The code +generator for a VOP must be able to uniquely determine the representation of +its operands from the SC. (debugger also...) + +Some SCs: + Reg: any register (immediate objects) + Save-Reg: a boxed register near r15 (registers easily saved in a call) + Boxed-Reg: any boxed register (any boxed object) + Unboxed-Reg: any unboxed register (any unboxed object) + Float-Reg, Double-Float-Reg: float in FP register. + Stack: boxed object on the stack (on cstack) + Word: any 32bit unboxed object on nstack. + Double: any 64bit unboxed object on nstack. + +We have a number of non-packed storage classes which serve to represent access +costs associated with values that are not allocated using conflicts +information. Non-packed TNs appear to already be packed in the appropriate +storage base so that Pack doesn't get confused. Costs for relevant non-packed +SC's appear in the TN-Ref cost information, but need not ever be summed into +the TN cost vectors, since TNs cannot be packed into them. + +There are SCs for non-immediate constants and for each significant kind of +immediate operand in the architecture. On the RT, 4, 8 and 20 bit integer SCs +are probably worth having. + +\begin{verbatim} +Non-packed SCs: + Constant + Immediate constant SCs: + Signed-Byte-<N>, Unsigned-Byte-<N>, for various architecture dependent + values of <N> + String-Char + XXX-Float + Magic values: T, NIL, 0. +\end{verbatim} + +\chapter{Type system parameterization} + +The main aspect of the VM that is likely to vary for good reason is the type +system: + + -- Different systems will have different ways of representing dynamic type + information. The primary effect this has on the compiler is causing VMR + conversion of type tests and checks to be implementation dependent. + Rewriting this code for each implementation shouldn't be a big problem, + since the portable semantics of types has already been dealt with. + + -- Different systems will have different specialized number and array types, + and different VOPs specialized for these types. It is easy to add this kind + of knowledge without affecting the rest of the compiler. All you have to + do is define the VOPs and translations. + + -- Different systems will offer different specialized storage resources + such as floating-point registers, and will have additional kinds of + primitive-types. The storage class mechanism handles a large part of this, + but there may be some problem in getting VMR conversion to realize the + possibly large hidden costs in implicit moves to and from these specialized + storage resources. Probably the answer is to have some sort of general + mechanism for determining the primitive-type for a TN given the Lisp type, + and then to have some sort of mechanism for automatically using specialized + Move VOPs when the source or destination has some particular primitive-type. + +\#| +How to deal with list/null(symbol)/cons in primitive-type structure? Since +cons and symbol aren't used for type-specific template selection, it isn't +really all that critical. Probably Primitive-Type should return the List +primitive type for all of Cons, List and Null (indicating when it is exact). +This would allow type-dispatch for simple sequence functions (such as length) +to be done using the standard template-selection mechanism. [Not a wired +assumption] +|\# + + + +\chapter{VOP Definition} + +Before the operand TN-refs are passed to the emit function, the following +stuff is done: + -- The refs in the operand and result lists are linked together in order using + the Across slot. This list is properly NIL terminated. + -- The TN slot in each ref is set, and the ref is linked into that TN's refs + using the Next slot. + -- The Write-P slot is set depending on whether the ref is an argument or + result. + -- The other slots have the default values. + +The template emit function fills in the Vop, Costs, Cost-Function, +SC-Restriction and Preference slots, and links together the Next-Ref chain as +appropriate. + + +\section{Lifetime model} + +\#| +Note in doc that the same TN may not be used as both a more operand and as any +other operand to the same VOP, to simplify more operand LTN number coalescing. +|\# + +It seems we need a fairly elaborate model for intra-VOP conflicts in order to +allocate temporaries without introducing spurious conflicts. Consider the +important case of a VOP such as a miscop that must have operands in certain +registers. We allocate a wired temporary, create a local preference for the +corresponding operand, and move to (or from) the temporary. If all temporaries +conflict with all arguments, the result will be correct, but arguments could +never be packed in the actual passing register. If temporaries didn't conflict +with any arguments, then the temporary for an earlier argument might get packed +in the same location as the operand for a later argument; loading would then +destroy an argument before it was read. + +A temporary's intra-VOP lifetime is represented by the times at which its life +starts and ends. There are various instants during the evaluation that start +and end VOP lifetimes. Two TNs conflict if the live intervals overlap. +Lifetimes are open intervals: if one TN's lifetime begins at a point where +another's ends, then the TNs don't conflict. + +The times within a VOP are the following: + +:Load + This is the beginning of the argument's lives, as far as intra-vop + conflicts are concerned. If load-TNs are allocated, then this is the + beginning of their lives. + +(:Argument $<$n$>$) + The point at which the N'th argument is read for the last time (by this + VOP). If the argument is dead after this VOP, then the argument becomes + dead at this time, and may be reused as a temporary or result load-TN. + +(:Eval $<$n$>$) + The N'th evaluation step. There may be any number of evaluation steps, but + it is unlikely that more than two are needed. + +(:Result $<$n$>$) + The point at which the N'th result is first written into. This is the + point at which that result becomes live. + +:Save + Similar to :Load, but marks the end of time. This is the point at which result + load-TNs are stored back to the actual location. + +In any of the list-style time specifications, the keyword by itself stands for +the first such time, i.e. +\begin{verbatim} + :argument <==> (:argument 0) +\end{verbatim} + +Note that argument/result read/write times don't actually have to be in the +order specified, but they must *appear* to happen in that order as far as +conflict analysis is concerned. For example, the arguments can be read in any +order as long as no TN is written that has a life beginning at or after +(:Argument $<$n$>$), where N is the number of an argument whose reading was +postponed. + +[\#\#\# (???) + +We probably also want some syntactic sugar in Define-VOP for automatically +moving operands to/from explicitly allocated temporaries so that this kind of +thing is somewhat easy. There isn't really any reason to consider the +temporary to be a load-TN, but we want to compute costs as though it was and +want to use the same operand loading routines. + +We also might consider allowing the lifetime of an argument/result to be +extended forward/backward. This would in many cases eliminate the need for +temporaries when operands are read/written out of order. +] + + +\section{VOP Cost model} + +Note that in this model, if an operand has no restrictions, it has no cost. +This makes sense, since the purpose of the cost is to indicate the +relative value of packing in different SCs. If the operand isn't required to +be in a good SC (i.e. a register), then we might as well leave it in memory. +The SC restriction mechanism can be used even when doing a move into the SC is +too complex to be generated automatically (perhaps requiring temporary +registers), since Define-VOP allows operand loading to be done explicitly. + + +\section{Efficiency notes} + + In addition to +being used to tell whether a particular unsafe template might get emitted, we +can also use it to give better efficiency notes: + -- We can say what is wrong with the call types, rather than just saying we + failed to open-code. + -- We can tell whether any of the ``better'' templates could possibly apply, + i.e. is the inapplicability of a template because of inadequate type + information or because the type is just plain wrong. We don't want to + flame people when a template that couldn't possibly match doesn't match, + e.g. complaining that we can't use fixnum+ when the arguments are known to + be floats. + + +This is how we give better efficiency notes: + +The Template-Note is a short noun-like string without capitalization or +punctuation that describes what the template ``does'', i.e. we say +``Unable to do ~A, doing ~A instead.'' + +The Cost is moved from the Vop-Info to the Template structure, and is used to +determine the ``goodness'' of possibly applicable templates. [Could flush +Template/Vop-Info distinction] The cost is used to choose the best applicable +template to emit, and also to determine what better templates we might have +been able to use. + +A template is possibly applicable if there is an intersection between all of +the arg/result types and the corresponding arg/result restrictions, i.e. the +template is not clearly impossible: more declarations might allow it to be +emitted. + + +\chapter{Assembler Retargeting} + + +\chapter{Writing Assembly Code} + +VOP writers expect: +\begin{Lentry} +\item[MOVE] + You write when you port the assembler.) +\item[EMIT-LABEL] + Assembler interface like INST. Takes a label you made and says ``stick it + here.'' + \item[GEN-LABEL] + Returns a new label suitable for use with EMIT-LABEL exactly once and + for referencing as often as necessary. + \item[INST] + Recognizes and dispatches to instructions you defined for assembler. + \item[ALIGN] + This takes the number of zero bits you want in the low end of the address + of the next instruction. + \item[ASSEMBLE] + \item[ASSEMBLE-ELSEWHERE] + Get ready for assembling stuff. Takes a VOP and arbitrary PROGN-style + body. Wrap these around instruction emission code announcing the first + pass of our assembler. + \item[CURRENT-NFP-TN] + This returns a TN for the NFP if the caller uses the number stack, or + nil. + \item[SB-ALLOCATED-SIZE] + This returns the size of some storage base used by the currently + compiling component. + \item[...] +\end{Lentry} +;;; +;;; VOP idioms +;;; + +\begin{Lentry} +\item[STORE-STACK-TN] +\item[LOAD-STACK-TN] + These move a value from a register to the control stack, or from the + control stack to a register. They take care of checking the TN types, + modifying offsets according to the address units per word, etc. +\end{Lentry} + +\chapter{Required VOPS} + + +Note: the move VOP cannot have any wired temps. (Move-Argument also?) This is +so we can move stuff into wired TNs without stepping on our toes. + + +We create set closure variables using the Value-Cell VOP, which takes a value +and returns a value cell containing the value. We can basically use this +instead of a Move VOP when initializing the variable. Value-Cell-Set and +Value-Cell-Ref are used to access the value cell. We can have a special effect +for value cells so that value cells references can be discovered to be common +subexpressions or loop invariants. + + + + +Represent unknown-values continuations as (start, count). Unknown values +continuations are always outside of the current frame (on stack top). Within a +function, we always set up and receive values in the standard passing +locations. If we receive stack values, then we must BLT them down to the start +of our frame, filling in any unsupplied values. If we generate unknown values +(i.e. PUSH-VALUES), then we set the values up in the standard locations, then +BLT them to stack top. When doing a tail-return of MVs, we just set them up in +the standard locations and decrement SP: no BLT is necessary. + +Unknown argument call (MV-CALL) takes its arguments on stack top (is given a +base pointer). If not a tail call, then we just set the arg pointer to the +base pointer and call. If a tail call, we must BLT the arguments down to the +beginning of the current frame. + + +Implement more args by BLT'ing the more args *on top* of the current frame. +This solves two problems: +\begin{itemize} +\item Any register more arguments can be made uniformly accessibly by copying + them into memory. [We can't store the registers in place, since the + beginning of the frame gets double use for storing the old-cont, return-pc + and env.] +\item It solves the deallocation problem: the arguments will be deallocated when + the frame is returned from or a tail full call is done out of it. So + keyword args will be properly tail-recursive without any special mechanism + for squeezing out the more arg once the parsing is done. Note that a tail + local call won't blast the more arg, since in local call the callee just + takes the frame it is given (in this case containing the more arg). +\end{itemize} + +More args in local call??? Perhaps we should not attempt local call conversion +in this case. We already special-case keyword args in local call. It seems +that the main importance of more args is primarily related to full call: it is +used for defining various kinds of frobs that need to take arbitrary arguments: +\begin{itemize} +\item Keyword arguments +\item Interpreter stubs +\item ``Pass through'' applications such as dispatch functions +\end{itemize} +Given the marginal importance of more args in local call, it seems unworth +going to any implementation difficulty. In fact, it seems that it would cause +complications both at the VMR level and also in the VM definition. This being +the case, we should flush it. + + +\section{Function Call} + + + +\subsection{Registers and frame format} + +These registers are used in function call and return: + +A0..A{\it n} + In full call, the first three arguments. In unknown values return, the + first three return values. + +CFP + The current frame pointer. In full call, this initially points to a + partial frame large enough to hold the passed stack arguments (zero-length + if none). + +CSP + The current control stack top pointer. + +OCFP + In full call, the passing location for the frame to return to. + + In unknown-values return of other than one value, the pointer to returned + stack values. In such a return, OCFP is always initialized to point to + the frame returned from, even when no stack values are returned. This + allows OCFP to be used to restore CSP. + +LRA + In full call, the passing location for the return PC. + +NARGS + In full call, the number of arguments passed. In unknown-values return of + other than one value, the number of values returned. + + +\subsection{Full call} + +What is our usage of CFP, OCFP and CSP? + +It is an invariant that CSP always points after any useful information so that +at any time an interrupt can come and allocate stuff in the stack. + +TR call is also a constraint: we can't deallocate the caller's frame before the +call, since it holds the stack arguments for the call. + +What we do is have the caller set up CFP, and have the callee set CSP to CFP +plus the frame size. The caller leaves CSP alone: the callee is the one who +does any necessary stack deallocation. + +In a TR call, we don't do anything: CFP is left as CFP, and CSP points to the +end of the frame, keeping the stack arguments from being trashed. + +In a normal call, CFP is set to CSP, causing the callee's frame to be allocated +after the current frame. + + +\subsection{Unknown values return} + +The unknown values return convention is always used in full call, and is used +in local call when the compiler either can't prove that a fixed number of +values are returned, or decides not to use the fixed values convention to allow +tail-recursive XEP calls. + +The unknown-values return convention has variants: single value and variable +values. We make this distinction to optimize the important case of a returner +who knows exactly one value is being returned. Note that it is possible to +return a single value using the variable-values convention, but it is less +efficient. + +We indicate single-value return by returning at the return-pc+4; variable value +return is indicated by returning at the return PC. + +Single-value return makes only the following guarantees: + A0 holds the value returned. + CSP has been reset: there is no garbage on the stack. + +In variable value return, more information is passed back: + A0..A2 hold the first three return values. If fewer than three values are + returned, then the unused registers are initialized to NIL. + + OCFP points to the frame returned from. Note that because of our + tail-recursive implementation of call, the frame receiving the values is + always immediately under the frame returning the values. This means that + we can use OCFP to index the values when we access them, and to restore + CSP when we want to discard them. + + NARGS holds the number of values returned. + + CSP is always (+ OCFP (* NARGS 4)), i.e. there is room on the stack + allocated for all returned values, even if they are all actually passed in + registers. + + +\subsection{External Entry Points} + +Things that need to be done on XEP entry: + 1] Allocate frame + 2] Move more arg above the frame, saving context + 3] Set up env, saving closure pointer if closure + 4] Move arguments from closure to local home + Move old-cont and return-pc to the save locations + 5] Argument count checking and dispatching + +XEP VOPs: +\begin{verbatim} +Allocate-Frame +Copy-More-Arg <nargs-tn> 'fixed {in a3} => <context>, <count> +Setup-Environment +Setup-Closure-Environment => <closure> +Verify-Argument-Count <nargs-tn> 'count {for fixed-arg lambdas} +Argument-Count-Error <nargs-tn> {Drop-thru on hairy arg dispatching} +Use fast-if-=/fixnum and fast-if-</fixnum for dispatching. +\end{verbatim} + +Closure vops: +\begin{verbatim} +make-closure <fun entry> <slot count> => <closure> +closure-init <closure> <values> 'slot +\end{verbatim} + +Things that need to be done on all function entry: +\begin{itemize} +\item Move arguments to the variable home (consing value cells as necessary) +\item Move environment values to the local home +\item Move old-cont and return-pc to the save locations +\end{itemize} + +\section{Calls} + +Calling VOP's are a cross product of the following sets (with some members +missing): + Return values + multiple (all values) + fixed (calling with unknown values conventions, wanting a certain + number.) + known (only in local call where caller/callee agree on number of + values.) + tail (doesn't return but does tail call) + What function + local + named (going through symbol, like full but stash fun name for error sys) + full (have a function) + Args + fixed (number of args are known at compile-time) + variable (MULTIPLE-VALUE-CALL and APPLY) + +Note on all jumps for calls and returns that we want to put some instruction +in the jump's delay slot(s). + +Register usage at the time of the call: + +LEXENV + This holds the lexical environment to use during the call if it's a closure, + and it is undefined otherwise. + +CNAME + This holds the symbol for a named call and garbage otherwise. + +OCFP + This holds the frame pointer, which the system restores upon return. The + callee saves this if necessary; this is passed as a pseudo-argument. + +A0 ... An + These holds the first n+1 arguments. + +NARGS + This holds the number of arguments, as a fixnum. + +LRA + This holds the lisp-return-address object which indicates where to return. + For a tail call, this retains its current value. The callee saves this + if necessary; this is passed as a pseudo-argument. + +CODE + This holds the function object being called. + +CSP + The caller ignores this. The callee sets it as necessary based on CFP. + +CFP + This holds the callee's frame pointer. Caller sets this to the new frame + pointer, which it remembered when it started computing arguments; this is + CSP if there were no stack arguments. For a tail call CFP retains its + current value. + +NSP + The system uses this within a single function. A function using NSP must + allocate and deallocate before returning or making a tail call. + +Register usage at the time of the return for single value return, which +goes with the unknown-values convention the caller used. + +A0 + This holds the value. + +CODE + This holds the lisp-return-address at which the system continues executing. + +CSP + This holds the CFP. That is, the stack is guaranteed to be clean, and there + is no code at the return site to adjust the CSP. + +CFP + This holds the OCFP. + +Additional register usage for multiple value return: + +NARGS + This holds the number of values returned. + +A0 ... An + These holds the first n+1 values, or NIL if there are less than n+1 values. + +CSP + Returner stores CSP to hold its CFP + NARGS * \verb+<address units per word>+ + +OCFP + Returner stores this as its CFP, so the returnee has a handle on either + the start of the returned values on the stack. + + +ALLOCATE FULL CALL FRAME. + +If the number of call arguments (passed to the VOP as an info argument) +indicates that there are stack arguments, then it makes some callee frame for +arguments: +\begin{verbatim} + VOP-result <- CSP + CSP <- CSP + value of VOP info arg times address units per word. +\end{verbatim} + +In a call sequence, move some arguments to the right places. + +There's a variety of MOVE-ARGUMENT VOP's. + +FULL CALL VOP'S +(variations determined by whether it's named, it's a tail call, there +is a variable arg count, etc.) +\begin{verbatim} + if variable number of arguments + NARGS <- (CSP - value of VOP argument) shift right by address units per word. + A0...An <- values off of VOP argument (just fill them all) + else + NARGS <- value of VOP info argument (always a constant) + + if tail call + OCFP <- value from VOP argument + LRA <- value from VOP argument + CFP stays the same since we reuse the frame + NSP <- NFP + else + OCFP <- CFP + LRA <- compute LRA by adding an assemble-time determined constant to + CODE. + CFP <- new frame pointer (remembered when starting to compute args) + This is CSP if no stack args. + when (current-nfp-tn VOP-self-pointer) + stack-temp <- NFP + + if named + CNAME <- function symbol name + the-fun <- function object out of symbol + + LEXENV <- the-fun (from previous line or VOP argument) + CODE <- function-entry (the first word after the-fun) + LIP <- calc first instruction addr (CODE + constant-offset) + jump and run off temp + + <emit Lisp return address data-block> + <default and move return values OR receive return values> + when (current-nfp-tn VOP-self-pointer) + NFP <- stack-temp +\end{verbatim} +Callee: + +\begin{verbatim} +XEP-ALLOCATE-FRAME + emit function header (maybe initializes offset back to component start, + but other pointers are set up at load-time. Pads + to dual-word boundary.) + CSP <- CFP + compile-time determined constant (frame size) + if the function uses the number stack + NFP <- NSP + NSP <- NSP + compile-time determined constant (number stack frame size) +\end{verbatim} + +\begin{verbatim} +SETUP-ENVIRONMENT +(either use this or the next one) + +CODE <- CODE - assembler-time determined offset from function-entry back to + the code data-block address. +\end{verbatim} + +\begin{verbatim} +SETUP-CLOSURE-ENVIRONMENT +(either use this or the previous one) +After this the CLOSURE-REF VOP can reference closure variables. + +VOP-result <- LEXENV +CODE <- CODE - assembler-time determined offset from function-entry back to + the code data-block address. +\end{verbatim} + +Return VOP's +RETURN and RETURN-MULTIPLE are for the unknown-values return convention. +For some previous caller this is either it wants n values (and it doesn't +know how many are coming), or it wants all the values returned (and it +doesn't know how many are coming). + + +RETURN +(known fixed number of values, used with the unknown-values convention + in the caller.) +When compiler invokes VOP, all values are already where they should be; +just get back to caller. + +\begin{verbatim} +when (current-nfp-tn VOP-self-pointer) + ;; The number stack grows down in memory. + NSP <- NFP + number stack frame size for calls within the currently + compiling component + times address units per word +CODE <- value of VOP argument with LRA +if VOP info arg is 1 (number of values we know we're returning) + CSP <- CFP + LIP <- calc target addr + (CODE + skip over LRA header word + skip over address units per branch) + (The branch is in the caller to skip down to the MV code.) +else + NARGS <- value of VOP info arg + nil out unused arg regs + OCFP <- CFP (This indicates the start of return values on the stack, + but you leave space for those in registers for convenience.) + CSP <- CFP + NARGS * address-units-per-word + LIP <- calc target addr (CODE + skip over LRA header word) +CFP <- value of VOP argument with OCFP +jump and run off LIP +\end{verbatim} + +RETURN-MULTIPLE +(unknown number of values, used with the unknown-values convention in + the caller.) +When compiler invokes VOP, it gets TN's representing a pointer to the +values on the stack and how many values were computed. + +\begin{verbatim} +when (current-nfp-tn VOP-self-pointer) + ;; The number stack grows down in memory. + NSP <- NFP + number stack frame size for calls within the currently + compiling component + times address units per word +NARGS <- value of VOP argument +copy the args to the beginning of the current (returner's) frame. + Actually some go into the argument registers. When putting the rest at + the beginning of the frame, leave room for those in the argument registers. +CSP <- CFP + NARGS * address-units-per-word +nil out unused arg regs +OCFP <- CFP (This indicates the start of return values on the stack, + but you leave space for those in registers for convenience.) +CFP <- value of VOP argument with OCFP +CODE <- value of VOP argument with LRA +LIP <- calc target addr (CODE + skip over LRA header word) +jump and run off LIP +\end{verbatim} + +Returnee +The call VOP's call DEFAULT-UNKNOWN-VALUES or RECEIVE-UNKNOWN-VALUES after +spitting out transfer control to get stuff from the returner. + +DEFAULT-UNKNOWN-VALUES +(We know what we want and we got something.) +If returnee wants one value, it never does anything to deal with a shortage +of return values. However, if start at PC, then it has to adjust the stack +pointer to dump extra values (move OCFP into CSP). If it starts at PC+N, +then it just goes along with the ``want one value, got it'' case. +If the returnee wants multiple values, and there's a shortage of return +values, there are two cases to handle. One, if the returnee wants fewer +values than there are return registers, and we start at PC+N, then it fills +in return registers \verb|A1..A<desired values necessary>|; if we start at PC, +then the returnee is fine since the returning conventions have filled in +the unused return registers with nil, but the returnee must adjust the +stack pointer to dump possible stack return values (move OCFP to CSP). +Two, if the returnee wants more values than the number of return registers, +and it starts at PC+N (got one value), then it sets up returnee state as if +an unknown number of values came back: +\begin{verbatim} + A0 has the one value + A1..An get nil + NARGS gets 1 + OCFP gets CSP, so general code described below can move OCFP into CSP +If we start at PC, then branch down to the general ``got k values, wanted n'' +code which takes care of the following issues: + If k < n, fill in stack return values of nil for shortage of return + values and move OCFP into CSP + If k >= n, move OCFP into CSP +This also restores CODE from LRA by subtracting an assemble-time constant. +\end{verbatim} + +RECEIVE-UKNOWN-VALUES +(I want whatever I get.) +We want these at the end of our frame. When the returnee starts at +PC, it moves the return value registers to OCFP..OCFP[An] ignoring where +the end of the stack is and whether all the return value registers had +values. The returner left room on the stack before the stack return values +for the register return values. When the returnee starts at PC+N, bump CSP +by 1 and copy A0 there. +This also restores CODE from LRA by subtracting an assemble-time constant. + + +Local call + +There are three flavors: + 1] KNOWN-CALL-LOCAL + Uses known call convention where caller and callee agree where all + the values are, and there's a fixed number of return values. + 2] CALL-LOCAL + Uses the unknown-values convention, but we expect a particular + number of values in return. + 3] MULTIPLE-CALL-LOCAL + Uses the unknown-values convention, but we want all values returned. + +ALLOCATE-FRAME + +If the number of call arguments (passed to the VOP as an info argument) +indicates that there are stack arguments, then it makes some callee frame for +arguments: +\begin{verbatim} + VOP-result1 <- CSP + CSP <- CSP + control stack frame size for calls within the currently + compiling component + times address units per word. + when (callee-nfp-tn <VOP info arg holding callee>) + ;; The number stack grows down. + ;; May have to round to dual-word boundary if machines C calling + ;; conventions demand this. + NSP <- NSP - number stack frame size for calls within the currently + compiling component + times address units per word + VOP-result2 <- NSP +\end{verbatim} +KNOWN-CALL-LOCAL, CALL-LOCAL, MULTIPLE-CALL-LOCAL +KNOWN-CALL-LOCAL has no need to affect CODE since CODE is the same for the +caller/returnee and the returner. This uses KNOWN-RETURN. +With CALL-LOCAL and MULTIPLE-CALL-LOCAL, the caller/returnee must fixup +CODE since the callee may do a tail full call. This happens in the code +emitted by DEFAULT-UNKNOWN-VALUES and RECEIVE-UNKNOWN-VALUES. We use these +return conventions since we don't know what kind of values the returner +will give us. This could happen due to a tail full call to an unknown +function, or because the callee had different return points that returned +various numbers of values. + +\begin{verbatim} +when (current-nfp-tn VOP-self-pointer) ;Get VOP self-pointer with + ;DEFINE-VOP switch :vop-var. + stack-temp <- NFP +CFP <- value of VOP arg +when (callee-nfp-tn <VOP info arg holding callee>) + <where-callee-wants-NFP-tn> <- value of VOP arg +<where-callee-wants-LRA-tn> <- compute LRA by adding an assemble-time + determined constant to CODE. +jump and run off VOP info arg holding start instruction for callee + +<emit Lisp return address data-block> +<case call convention + known: do nothing + call: default and move return values + multiple: receive return values +> +when (current-nfp-tn VOP-self-pointer) + NFP <- stack-temp +\end{verbatim} + +KNOWN-RETURN +\begin{verbatim} +CSP <- CFP +when (current-nfp-tn VOP-self-pointer) + ;; number stack grows down in memory. + NSP <- NFP + number stack frame size for calls within the currently + compiling component + times address units per word +LIP <- calc target addr (value of VOP arg + skip over LRA header word) +CFP <- value of VOP arg +jump and run off LIP + +\end{verbatim} + + +\chapter{Standard Primitives} + + +\chapter{Customizing VMR Conversion} + +Another way in which different implementations differ is in the relative cost +of operations. On machines without an integer multiply instruction, it may be +desirable to convert multiplication by a constant into shifts and adds, while +this is surely a bad idea on machines with hardware support for multiplication. +Part of the tuning process for an implementation will be adding implementation +dependent transforms and disabling undesirable standard transforms. + +When practical, ICR transforms should be used instead of VMR generators, since +transforms are more portable and less error-prone. Note that the Lisp code +need not be implementation independent: it may contain all sorts of +sub-primitives and similar stuff. Generally a function should be implemented +using a transform instead of a VMR translator unless it cannot be implemented +as a transform due to being totally evil or it is just as easy to implement as +a translator because it is so simple. + + +\section{Constant Operands} + +If the code emitted for a VOP when an argument is constant is very different +than the non-constant case, then it may be desirable to special-case the +operation in VMR conversion by emitting different VOPs. An example would be if +SVREF is only open-coded when the index is a constant, and turns into a miscop +call otherwise. We wouldn't want constant references to spuriously allocate +all the miscop linkage registers on the off chance that the offset might not be +constant. See the :constant feature of VOP primitive type restrictions. + + +\section{Supporting Multiple Hardware Configurations} + + +A winning way to change emitted code depending on the hardware configuration, +i.e. what FPA is present is to do this using primitive types. Note that the +Primitive-Type function is VM supplied, and can look at any appropriate +hardware configuration switches. Short-Float can become 6881-Short-Float, +AFPA-Short-Float, etc. There would be separate SBs and SCs for the registers +of each kind of FP hardware, with each hardware-specific primitive type +using the appropriate float register SC. Then the hardware specific templates +would provide AFPA-Short-Float as the argument type restriction. + +Primitive type changes: + +The primitive-type structure is given a new \%Type slot, which is the CType +structure that is equivalent to this type. There is also a Guard slot, which, +if true is a function that control whether this primitive type is allowed (due +to hardware configuration, etc.) + +We add new :Type and :Guard keywords to Def-Primitive-Type. Type is the type +specifier that is equivalent (default to the primitive-type name), and Guard is +an expression evaluated in the null environment that controls whether this type +applies (default to none, i.e. constant T). + +The Primitive-Type-Type function returns the Lisp CType corresponding to a +primitive type. This is the \%Type unless there is a guard that returns false, +in which case it is the empty type (i.e. NIL). + +[But this doesn't do what we want it to do, since we will compute the +function type for a template at load-time, so they will correspond to whatever +configuration was in effect then. Maybe we don't want to dick with guards here +(if at all). I guess we can defer this issue until we actually support +different FP configurations. But it would seem pretty losing to separately +flame about all the different FP configurations that could be used to open-code ++ whenever we are forced to closed-code +. + +If we separately report each better possibly applicable template that we +couldn't use, then it would be reasonable to report any conditional template +allowed by the configuration. + +But it would probably also be good to give some sort of hint that perhaps it +would be a good time to make sure you understand how to tell the compiler to +compile for a particular configuration. Perhaps if there is a template that +applies *but for the guard*, then we could give a note. This way, if someone +thinks they are being efficient by throwing in lots of declarations, we can let +them know that they may have to do more. + +I guess the guard should be associated with the template rather than the +primitive type. This would allow LTN and friends to easily tell whether a +template applies in this configuration. It is also probably more natural for +some sorts of things: with some hardware variants, it may be that the SBs and +representations (SCs) are really the same, but there are some different allowed +operations. In this case, we could easily conditionalize VOPs without the +increased complexity due to bogus SCs. If there are different storage +resources, then we would conditionalize Primitive-Type as well. + + + +\section{Special-case VMR convert methods} + + (defun continuation-tn (cont \&optional (check-p t)) + ...) +Return the TN which holds Continuation's first result value. In general +this may emit code to load the value into a TN. If Check-P is true, then +when policy indicates, code should be emitted to check that the value satisfies +the continuation asserted type. + + (defun result-tn (cont) + ...) +Return the TN that Continuation's first value is delivered in. In general, +may emit code to default any additional values to NIL. + + (defun result-tns (cont n) + ...) +Similar to Result-TN, except that it returns a list of N result TNs, one +for each of the first N values. + + +Nearly all open-coded functions should be handled using standard template +selection. Some (all?) exceptions: +\begin{itemize} +\item List, List* and Vector take arbitrary numbers of arguments. Could + implement Vector as a source transform. Could even do List in a transform + if we explicitly represent the stack args using \%More-Args or something. +\item \%Typep varies a lot depending on the type specifier. We don't want to + transform it, since we want \%Typep as a canonical form so that we can do + type optimizations. +\item Apply is weird. +\item Funny functions emitted by the compiler: \%Listify-Rest-Args, Arg, + \%More-Args, \%Special-Bind, \%Catch, \%Unknown-Values (?), \%Unwind-Protect, + \%Unwind, \%\%Primitive. +\end{itemize} diff --git a/doc/internals/cmu/run-time.tex b/doc/internals/cmu/run-time.tex new file mode 100644 index 0000000000..4499cbf26f --- /dev/null +++ b/doc/internals/cmu/run-time.tex @@ -0,0 +1,8 @@ +\part{Run-Time System} + +\input{environment} +\input{interpreter} +\input{debugger} +\input{object} +\input{lowlev} +\input{fasl} diff --git a/doc/internals/cmu/vm.tex b/doc/internals/cmu/vm.tex new file mode 100644 index 0000000000..7962e83a7e --- /dev/null +++ b/doc/internals/cmu/vm.tex @@ -0,0 +1,1460 @@ +\chapter{Introduction} % -*- Dictionary: design -*- + +% (defun gvp (f) +% (with-open-file (s f :direction :output :if-exists :supersede) +% (maphash \#'(lambda (k v) +% (declare (ignore v)) +% (format s "~A~%" k)) +% (c::backend-template-names c::*backend*)))) + + +\section{Scope and Purpose} + +This document describes the Virtual Machine that serves as the basis for the +portable implementation of \ccl. The Virtual Machine (hereafter referred to as +the VM) provides a layer of abstraction that hides low-level details of +hardware and implementation strategy, while still revealing enough of the +implementation so that most of the system can be written at the VM level or +above. + +\begin{comment} + +{\#\#\# Shouldn't specify VOPs. Instead, should specify which \clisp functions +are primitive and which subprimitives exist. Isn't really anyone's business +which VOPs actually exist. Each primitive function or subprimitive is +implemented either as a VOP or as expansion into Lisp code, at the particular +implementation's discretion. + +From this point of view, the document is expressing the contract that the Lisp +level code outside of the compiler must satisfy. All functions must ultimately +be defined in terms of primitive functions and sub-primitives. + +The responsibility of the compiler is to implement these primitive operations, +and also to implement special forms, variables and function calling. + +VOPs emitted by the hard-wired translators for non-function nodes are a +somewhat different story. Each implementation will presumably implement all +these VOPs in order to avoid having to rewrite IR2 translation. We also need +to spend quite a bit of time discussing the semantics of these operations, +since they don't just correspond to some \clisp function with type constraints. + +Hard-wired stuff: + +function call +variable access: + global + function + constant + closure + local +closure creation +non-local exit +special binding/unbinding +TN hacking: + move VOPs + TN address (???) +Conditionals: + Basic conditionals: EQ, ... + Interface to generation of other conditional VOPs. + +Some VOPs don't need to be implemented at all: + VOPs to delimit the lifetimes of big stack TNs such as catch blocks + Others? Move VOPs might be defined in terms of an implementation supplied + move routine, since we probably also need this info outside of VOP generators + so that implicit moves can be generated. + + +Type testing/checking (somehow) + +} + +What this document talks about: + +Interface between compiler front-end and back end. (VOPs) + Primitive \clisp operations directly supported by the VM. + Support for complex language features such as function call. + +Sub-primitives that allow system code to do things not possible in \clisp. + +Descriptions of how the current \ccl system uses VM facilities, especially +non-standard ones accessed through sub-primitives. + +Notes about known portability problems. + +Guidelines for writing portable \ccl system code. To some degree these +guidelines are implied by statements that certain things are true of \ccl +system code. + +Descriptions of data structures that are not directly used by the VM, such as +debug information and Core files. + +Descriptions of data structures that are directly used by the VM, such as +symbols and arrays. + + +Who should read it: + +People who want to port \ccl. +People who want to understand the compiler. +People who want to understand how \ccl works. +People who need to write portable \ccl system code. +People such as debugger writers who need to access \ccl\t()'s internal data +structures. + +What it won't do: + +Tell you things that are obviously implementation dependent, such as type +systems or memory management disciplines. See the the various implementation +VM documents. + +Tell you only what you need to know. Programmers shouldn't exploit properties +of the VM documented here unless there is no way to do the same thing in +portable \clisp. + +Tell you how the compiler works. In order to understand some of the subtleties +of VOP descriptions, you will have to understand the IR2 representation and how +it fits into the rest of the compiler. + +Tell you anything about \clisp semantics. When some part of the VM has a +direct relationship to \clisp semantics, the relationship will be directly +stated using \clisp terminology, since a restatement of the semantics is likely +to be inaccurate or misleading. Exceptions will be made only when some +implication of the \clisp semantics is non-obvious. + +Tell you everything about how \ccl works. This document only offers +information that is likely to be needed by programmers doing a port or writing +system code; portable, self-contained parts of the system are totally ignored. +This document deliberately avoids replicating information that is easily +available in the system sources, since such replicated information is always +incorrect somewhere. In some cases, a forwarding pointer to the appropriate +source will be given. + + +Things the VM won't do: + +The VM specification does not totally solve the problem of porting \ccl, since +it is inevitable that it will not map cleanly to all possible combinations of +hardware and operating systems. The VM should not be regarded as being cast in +concrete, since changes in many characteristics would only affect a tiny +fraction of the system sources. + +One current major problem with porting is that large pieces of functionality +are entirely within the VM, and would need to be reimplemented for each port. +A major goal for future work on the system is moving code out of the VM, both +by supporting a ``fast-call'' convention that allows reasonable use of Lisp in +the out of line implementation of VOPs, and by having a ``bugout'' mechanism that +allows the VM to call Lisp functions to implement the hard cases in some VOPs. + +The VM is designed to support conventional, untagged, general register +architectures. Suitably lobotomized, it could be mapped to less flexible +hardware such as ``Lisp machines'', but the compiler would have serious +difficulties supporting stack architectures. + +The VM does not support concurrent lightweight processes. Locking primitives +and deep-binding of specials would be needed. + +The VM does not deal with operating systems interface issues at all. A minimal +port would require implementing at least file and terminal I/O streams. \ccl +implements system interfaces using Aliens and other facilities built on top of +them. + +\end{comment} + + + +Major components: +\begin{itemize} +Specific virtual operations implemented by the VM (VOPs). VOPs are primarily +the concern of the compiler, since it translates Lisp code into VOPs and then +translates VOPs into the implementation. + +Sub-primitives that are used by Lisp code needing to perform operations +below the Lisp level. The compiler implements some sub-primitives directly +using VOPs, while others are translated into Lisp code. Sub-primitives provide +a layer of insulation between the Lisp system code and the VM, since the Lisp +code may assume the existence of operations that are not implemented directly +by the VM. Only sub-primitives with fairly portable semantics are documented +here. Others are in implementation-specific VM documentation. +\end{itemize} + +\comment<Not all sub-primitives are VOPs, and most VOPs are not sub-primitives.> + + + +\subsection{VOP base name rules} + +The names of VOPs that implement functions are based on the function name. +Other VOPs may use any base that doesn't conflict with a function name. There +are some rules used to obtain the base name for related operations. + +To get the name of a setting operation, replace the string ``{\tt ref}'' in the name +with ``{\tt set}''. If ``{\tt ref}'' doesn't appear in the name, add the prefix ``{\tt set-}'' to the +base name. For example, {\tt svref} becomes {\tt svset}, and {\tt symbol-value} +becomes {\tt set-symbol-value}. + +To get the name of a conditional VOP from the name of a predicate, add the +prefix ``{\tt if-}'' to the predicate name. For example, {\tt eq} becomes {\tt if-eq}. +{\tt eq} by itself would be a VOP that returned true or false value. + +Some operations check for some error condition, magically signalling the error +through an implicit control transfer. These operations are prefixed with +``{\tt check-}'', as in {\tt check-fixnum} and {\tt check-bound}. + + + +\subsection{VOP name prefixes and suffixes} + +Prefixes and suffixes are added to the base to get the names of variant +versions of the VOP. The fully general VOP name looks like this: +\begin{format} + {``{\tt small-}'' | ``{\tt fast-}''} {\it name}{``{\tt -c}'' {\it info}}{``{\tt /}'' {\it type}{``{\tt =>}'' {\it result-type}} +\end{format} +The ``{\tt small-}'' and ``{\tt fast-}'' prefixes indicates that the VOP does minimal +safety checking and is optimized for space or speed, respectively. The absence +of a prefix indicates the safest (or only) version. Usually if the ``{\tt small-}'' +VOP exists, it will be a synonym for either the fast version or the safe +version, depending on which is smaller. + +The ``{\tt -c}'' suffix indicates that the some info that is passed as a normal +argument to the base version of the VOP is passed as Codegen-Info in this +version. A typical use would be for VOPs where it is important to use a +different version when one of the arguments is a compile time constant. +{\it info} is some (possibly null) string that indicates which ``{\tt -c}'' variant +is involved. + +The ``{\tt /}{\it type}'' suffix asserts that all operands that could be of {\it type} are. +For example, {\tt +/fixnum} adds two fixnums returning a fixnum, while +{\tt length/simple-vector} finds the length of a simple vector, but the result isn't +a simple vector. + +The ``{\tt =>}{\it result-type}'' suffix supplies a result type assertion on the +operation. + +A not totally silly example of all these modifiers simultaneously is + {\tt fast-+-c/fixnum=>integer}. This operation would this operation adds two +fixnums, one of which is a constant passed as codegen info, resulting in an +integer. The implementation is optimized for speed at the expense of space and +safety. + + + +\chapter{Data Types and Storage Resources} + + +\section{Lisp Objects} +\index{Lisp objects} + +A Lisp object is fixed-size data structure that is organized in a way mandated +by the VM implementation. The fixed format allows the VM to determine the type +of the object. \comment<Virtual type? VM type? Implementation type? +...provides the VM enough information about the type of the object for the VM +to implement the VM-level semantics... ...supports the ``dynamic types''...> + +Lisp objects are stored in locations known as cells. + + +Has major types: immediate and non-immediate. +Non-immediate objects may have a subtype. +Non-immediate types: + symbol (nil may be weird) + cons + ratio + complex + some float types + g-vector + i-vector + string + bit-vector + environment (always has subtype) + array header + bignum + structure + pc (code vector) + stack closure (control stack pointer) + +Non-immediate objects are allocated in ``type spaces''. The type space of an +object is characterized by a small integer known as the type code. Any two +objects of one of the above boxed types will always have the same type code. +{But not really... Some types might be allocated in different type spaces at +different times. (?)} + +The type code doesn't totally describe the object. In general, subtype +information may be involved. + + +Immediate types: + character + fixnum + unbound trap + short float + + + +\section{Type VOPs} + +We consider control transfer to be the fundamental result of comparison, rather +than anything such as a condition code. Although most compilers with whizzy +register allocation seem to explicitly allocate and manipulate the condition +codes, it seems that any benefit is small in our case. This is partly because +our VOPs are at a somewhat higher level, making it difficult to tell which VOPs +do and don't trash the the CC. Explicitly incorporating condition codes in our +VM also introduces another architecture dependency. + +At the IR2 level, we have a class of IF-XXX VOPs which transfer control to one +of two places on the basis of some test on the operands. When generating code +for a predicate, we peek at the destination IF node to find where to transfer +control to. + +The exact representation of type tests in IR2 will be fairly implementation +dependent, since it will depend on the specific type system for the given +implementation. For example, if an implementation can test some types with a +simple tag check, but other types require reading a field from the object in +addition, then the two different kinds of checks should be distinct at the VOP +level, since this will allow the VOP cost and storage information to be more +accurate. Generation of type tests should be factored out of code which would +otherwise be more portable. Probably the IR2 translator for TYPEP and the type +check generation code are the only places that should know about how type tests +are represented in IR2. + +if-type (object) +if-type-range + If-Type Tests whether Object has the type code that is passed in the + codegen info. If-Type-Range tests for a range of type codes. + +{small, fast} if-vector-type (object) + Test that Object is either of the specified type code, or is a 1d array + header with data having the specified type code. + +if-vector-subtype (object) + Test the subtype field of a vector-like object. It is assumed that the + object has already been determined to be vector-like. + +if-fixnump (object) +if-short-float-p +if-characterp + The rationale behind having these as separate VOPs is that they are likely + to be immediate types, and thus may have bizzare type schemes. + +if-consp (object) +if-listp + We have distinct operations for these predicates since one or the other + isn't a simple tag test, but we don't know which one. + +if-rationalp (object) +if-floatp +if-integerp +if-numberp +if-vectorp +if-functionp + The rationale behind having these operations is that they may take a lot of + code, so it is reasonable to put them out of line. + + + +\section{Type Sub-primitives} + +change-type (object) => result + Change the type of an object according to codegen info. The meaning of + this is highly type-system dependent, but it doesn't matter, since the + compiler will never emit this VOP directly. The only way that it can show + up is through %Primitive. +get-type + + +Storage resources: + +Boxed and unboxed locations: +Non-immediate objects may not be stored in unboxed locations. +Things not lisp objects may not be stored in boxed locations. + +Control stack is boxed. +Optional number stack is unboxed. +Heap environment is boxed. +Fixed number of registers, some boxed and some unboxed. + +PCs may be stored on the control stack or in boxed registers, subject to the +constraint that a corresponding environment is also stored. Locations +containing PCs don't need to be zeroed when they are no longer used; nothing +bad will happen if an old PC is unaccompanied by an environment. + + +\item[Trap]Illegal object trap. This value is used in symbols to signify an +undefined value or definition. + + +\chapter{Characters} + + +Character is an immediate type. Characters are manipulated primarily by +converting into an integer and accessing these fields: +\begin{description} +\item[{\tt %character-code-byte}]The character code. This is effectively required to +start at bit 0, since \cl equates {\tt char-int} to {\tt char-code} when there is +no bits or font. All current \ccl systems use ASCII for the character codes, +and define {\tt \#\newline} to be a linefeed, but system code should not count on +this. + +\item[{\tt %character-control-byte}]The character bits. Character bits are used by +Hemlock to describe modifiers in keyboard events, but there is no assumption of +any general portable significance of character bits. + +{\tt %character-font-byte}\\The character font. This is not used by \ccl, and is +not particularly useful. +\end{description} + +Characters should be converted to and from integers by using the \clisp +{\tt char-int} and {\tt int-char} functions, which the compiler translates into +these VOPs: +\begin{example} +char-int (char) => int +int-char (int) => char +\end{example} +In the common case where Char is known to be a {\tt string-char}, these +operations are equivalent to {\tt char-code} and {\tt code-char}. In addition to +providing a portable interface to character conversion, the VOP representation +of this type conversion allows the compiler to avoid unnecessary boxing and +unboxing of character objects. + +Existing code explicitly converts fixnums to characters by using the +Make-Immediate-Type sub-primitive with %Character-Type. Currently conversion +of characters to fixnums is rather confused. Originally, characters were a +subtype of the Misc type code, and the result of the Make-Fixnum sub-primitive +had to be masked with {\tt %character-int-mask}; some code still does this, while +other code may not. + +Character comparisons could be implemented by doing numeric comparisons on the +result of {\tt char-int}, or by using {\tt eq} in the case of {\tt char=}, but this +can result in unnecessary type conversions. Instead, the compiler uses these +conditional VOPs: +\begin{example} +if-char= (x y) +if-char< (x y) +if-char> (x y) +\end{example} + + +\chapter{Symbols} + + +Symbols are currently fairly boring in \ccl, containing only the obvious slots: +\begin{description} +{\tt %symbol-value-slot}\\The current dynamic value of this symbol. If the +symbol is currently unbound, then the value of this slot is the unbound marker. + +{\tt %symbol-function-slot}\\The global function function definition of this +symbol. If the symbol is not fbound, then this slot holds the unbound marker. + +\multiple{ +{\tt %symbol-plist-slot} \* +{\tt %symbol-name-slot} \* +{\tt %symbol-package-slot} +}\\The property list, print name and package for this symbol. +\end{description} + + + +\section{Sub-primitives} + +The {\tt alloc-symbol} sub-primitive allocates a new symbol object. {\it name} is +the simple-string that is to be the name of the symbol. +\begin{example} +alloc-symbol (name) => symbol +\end{example} + +The {\tt set-symbol-package} sub-primitive is used by system code that must set +the symbol package. +\begin{example} +set-symbol-package (symbol new-value) +\end{example} + + + +\section{Accessor VOPs} + +These VOPs read the global symbol value and definition cells. {\tt constant-ref} +may only be used on symbols that have been defined to be constants. Since a +constant cannot change in value and cannot be dynamically bound, the compiler +may be able to compile uses of {\tt constant-ref} more efficiently. Unsafe +versions of these VOPs may not check for the slot being unbound, which the +corresponding \clisp functions are required to do. +\begin{example} +{small, fast} symbol-value (symbol) => value +{small, fast} constant-ref (symbol) => value +{small, fast} symbol-function (symbol) => value +\end{example} + +These VOPs set the global symbol value and definition cells. {\tt makunbound} +and {\tt fmakunbound} are implemented by setting the value to the unbound marker. +\begin{example} +{small, fast} set-symbol-value (symbol new-value) +{small, fast} set-symbol-function (symbol new-value) +\end{example} + +The \clisp accessors for other symbol slots are translated into uses of the +{\tt slot-ref} and {\tt slot-set} VOPs. + + + +\section{Special Binding} + +These VOPs implement dynamic binding of special variables using shallow +binding. {\tt bind} binds {\it symbol} to the specified {\it value}, while +{\tt unbind} undoes the most recent {\it count} special bindings on the binding +stack. +\begin{example} +bind (symbol value) +unbind (count) +\end{example} + + +\section{Property Lists} + +The {\tt get} VOP implements the corresponding \clisp function, while {\tt put} +implements its setf-inverse. +\begin{example} +get (symbol indicator default) => value +put (symbol indicator value) +\end{example} + + +\chapter{Lists} + + +cons + +\begin{example} +list<n> (elt0 ... elt<n-1>) => list +list (elt0 ... elt<n-1> more-elts) => list + For some small N, we have fixed-arg versions of List. For larger lists, we + pass in additional elements in a stack TN (possibly required to be on stack + top). List* is similar. +\end{example} + +These VOPs implement the corresponding \clisp functions: +\begin{example} +{small, fast} car (list) => value +{small, fast} cdr (list) => value +\end{example} + +These VOPs set the car or cdr of a cons: +\begin{example} +{small, fast} set-car (cons new-value) +{small, fast} set-cdr (cons new-value) +\end{example} + +These VOPs implement the \clisp {\tt assoc} and {\tt member} functions with test +functions of {\tt eql} and {\tt eq}: +\begin{example} +assoc (item alist) => cons-or-nil +assq (item alist) => cons-or-nil +member (item list) => cons-or-nil +memq (item list) => cons-or-nil +\end{example} + + +{\tt getf} implements the corresponding \clisp function, while {\tt putf} is used +to implement its setf-inverse. {\tt putf} returns the new value for the list so +that it may stored back into the place. +\begin{example} +getf (list indicator default) => value +putf (list indicator new-value) => list +\end{example} + + +\chapter{Numbers} + +\index{Fixnum format} +Fixnum\\An N-bit two's complement integer. + +\index{Short float format} +Short-Float\\An immediate float format. + +\index{Bignum format} +\label{Bignums} +Bignum\\Bignums are infinite-precision integers, represented somehow. + +\index{Flonum format} +\index{Floating point formats} +Floats\\Floats are stored as consecutive words of bits. + +\index{Ratio format} +Ratio\\Ratios are stored as two consecutive words of Lisp objects, which should +both be integers. + +\index{Complex number format} +Complex\\Complex numbers are stored as two consecutive words of Lisp objects, +which should both be numbers. + + + +\section{Number VOPs} + +integer-length +{small, fast} integer-length/fixnum + +float=>xxx-float + +realpart +lmagpart +numerator +denominator +decode-float +{small, fast} decode-float/xxx-float +scale-float +{small, fast} scale-float/xxx-float + +if-= (x y) +{small, fast} if-=/fixnum +{small, fast} if-=/xxx-float + Do numeric comparison of X and Y. The codegen-info contains the + continuations to transfer to in the true and false cases. Same for $<$, $>$. + ++ (x y) => z +{small, fast} +/fixnum +{small, fast} +/fixnum=>integer +{small, fast} +/xxx-float + Same for -, *. Fixnum multiplication by a constant power of 2 (or near + power of 2) can be done by a transform. + +/ (x y) => z +{small, fast} //xxx-float + +negate +{small, fast} negate/fixnum +{small, fast} negate/fixnum=>integer +{small, fast} negate/xxx-float + Ditto for Abs. + +truncate (x y) => q r +{small, fast} truncate/fixnum + +logand (x y) => z +{small, fast} logand/fixnum + Ditto for logior, logxor. + +lognot (n) => z +{small, fast} lognot/fixnum + +ash (n x) => z +{small, fast} ash/fixnum +{small, fast} ash-c/fixnum + +ldb +dpb +mask-field +deposit-field + These will only be used as a last resort. There should be transforms that + turn fixnum operations with constant byte-specifiers into standard logical + operations. + + +\section{Number Sub-primitives} + + +alloc-bignum +make-complex +make-ratio +lsh +logldb +logdpb + + + +\chapter{Arrays} + +\cl arrays can be represented in a few different ways in \rtccl -- +different representations have different performance advantages. Simple +general vectors, simple vectors of integers, and simple strings are basic \rtccl + data types, and access to these structures is quicker than access to +non-simple (or ``complex'') arrays. However, all multi-dimensional arrays in +\rtccl are complex arrays, so references to these are always through a +header structure. + + +Once a vector has been allocated, it is possible to reduce its length by using +the Shrink-Vector sub-primitive, but never to increase its length, even back to +the original size, since the space freed by the reduction may have been +reclaimed. + + + +\subsection{Arrays} +\label{Arrays} +\index{Arrays} + +An array header is identical in form to a G-Vector. At present, the following +subtype codes are defined: +\begin{itemize, spread 0, spacing 1} +0 Normal. +1 Array is displaced to another array (which may be simple). +\end{itemize} +The entries in the header-vector are interpreted as follows: + +\index{Array header format} +\begin{description} +0 Data Vector \\This is a pointer to the I-Vector, G-Vector, or string that +contains the actual data of the array. In a multi-dimensional array, the +supplied indices are converted into a single 1-D index which is used to access +the data vector in the usual way. If the array is displaced, then this is +the array displaced to, which may be an array header. In general, array +access must loop until it finds an actual data vector. + +1 Number of Elements \\This is a fixnum indicating the number of elements for +which there is space in the data vector. + +2 Fill Pointer \\This is a fixnum indicating how many elements of the data +vector are actually considered to be in use. Normally this is initialized to +the same value as the Number of Elements field, but in some array applications +it will be given a smaller value. Any access beyond the fill pointer is +illegal. + +3 Displacement \\This fixnum value is added to the final code-vector index +after the index arithmetic is done but before the access occurs. Used for +mapping a portion of one array into another. For most arrays, this is 0. + +4 Range of First Index \\This is the number of index values along the first +dimension, or one greater than the largest legal value of this index (since the +arrays are always zero-based). A fixnum in the range 0 to 2\+{24}-1. If any +of the indices has a range of 0, the array is legal but will contain no data +and accesses to it will always be out of range. In a 0-dimension array, this +entry will not be present. + +5 - N Ranges of Subsequent Dimensions +\end{description} + +The number of dimensions of an array can be determined by looking at the length +of the array header. The rank will be this number minus 6. The maximum array +rank is 65535 - 6, or 65529. + +The ranges of all indices are checked on every access, during the conversion to +a single data-vector index. In this conversion, each index is added to the +accumulating total, then the total is multiplied by the range of the following +dimension, the next index is added in, and so on. In other words, if the data +vector is scanned linearly, the last array index is the one that varies most +rapidly, then the index before it, and so on. + + + +\section{Array VOPs} + +alloc-bit-vector +alloc-i-vector +alloc-string +alloc-g-vector + Initialized and uninitialized versions? + + +length (sequence) => size +{small, fast} length/vector +{small, fast} length/simple-vector +{small, fast} length/simple-string +{small, fast} length/simple-bit-vector + +aref1 (vector index) => value +{small, fast} aref1/simple-vector +{small, fast} aref1/simple-string +{small, fast} aref1/simple-bit-vector +{small, fast} aref1/simple-array-XXX-float + +aset1 (vector index new-value) +{small, fast} aset1/simple-vector +{small, fast} aset1/simple-string +{small, fast} aset1/simple-bit-vector +{small, fast} aset1/simple-array-XXX-float + +{small, fast} aref1/simple-array-unsigned-byte (vector index) => value +{small, fast} aset1/simple-array-unsigned-byte (vector index new-value) + Byte size is codegen info. + +aref$<$N$>$ (array index0 ... index<n-1>) => value +aset$<$N$>$ (array index0 ... index<n-1> new-value) + For some small value of N. Of course, higher dimensional arrays can also + be specialized in seven different ways.... Multi-dimensional simple array + reference with known dimensions can be open-coded using a transform (useful + for benchmarks.) + + + +\section{Array Sub-primitives} + +alloc-array +vector-subtype +set-vector-subtype +vector-access-code +set-vector-access-code +shrink-vector + +typed-vref +typed-vset + +header-length (header) => size +header-ref (header index) => value +header-set (header index new-value) + +bit-bash +byte-blt +{reverse-}find-character +{reverse-}find-character-with-attribute +{reverse-}string-compare +sxhash-simple-string +sxhash-simple-substring + + +\chapter{Structures} + +{small, fast} structure-ref (s) => value +{small, fast} structure-set (s new-value) + Read and write structure slots. Defstruct slot description is in codegen + info. + +alloc-structure + + +\chapter{Runtime Environment} +\index{Runtime Environment} +\label{Runtime} + + +\section{Register Allocation} +\index{Register allocation} + +The main idea is to globally allocate only those registers with global +significance. + +We permanently dedicate the CONT register to point to the current control stack +environment. This is the ``frame pointer'' in standard terminology. It isn't +possible to get pack to allocate this register on an as-needed basis due to the +classic phase-ordering problem. We need to know if TNs are allocated on the +stack before we can determine tell how badly we need a frame pointer register. +This is of little significance with the control stack environment, since we +almost always need one, and if there are any stack TNs, we must allocate the +frame pointer in a register, since there is nowhere else to put it. The +problem is more severe with a number stack environment pointer. We can't +dedicate a register to it, since we usually don't have any TNs on the number +stack. The only easy solution is to always allocate the number stack +environment pointer on the control stack. This really isn't too bad, when you +compare the cost of doing an extra memory reference to get at the number stack +to the cost of number-consing. + +We also dedicate the ENV register to the current constant pool. It would be +possible to explicitly allocate the constant pointer as needed if we explicitly +represented non-immediate constant access by a VOP, but this would be extra +work, and there are major advantages to representing all constants using TNs. +Another potential efficiency advantage is since the same constant pool is +shared by all the code in a component, we need only initialize ENV on entry to +the component. When we make local calls, we don't have to do anything to make +the constants available to the callee. + +Since the constant pool will also contain the code vector and the debug info, +having it in a known place may make life easier for GC and the debugger. We +may not be able to count on it too much, though, since ENV holds other things +will calls are in progress, and might be pretty random if we jumped into +hyperspace. + + +Runtime environment: + +CONT: the current control stack context. +PC is assumed to be accessible to the debugger when an error happens. +Current-Catch: pointer to the current catch frame. Format of frame is assumed. +Current-Unwind-Protect: current unwind protect frame. Similar to catch. + +If shallow-bind, binding stack and binding stack pointer. +If deep-bind, current special binding. Format of binding frame assumed. + +Everything depends on the current environment, which is CONT. + +\begin{verbatim} +PC +OLD-CONT +ENV +A<n> +CONT +CS +\end{verbatim} + +\section{Other Dynamic State} + +There are some dynamic state variables that are stored in known memory +locations, rather than having a dedicated register: +\begin{description} +binding stack pointer\\The current pointer to the top of the binding stack. + +current catch\\The pointer to the current catch block. + +current unwind-protect\\The pointer to the current unwind-protect block. +\end{description} + + + + +\section{Control-Stack Format} +\label{Control-Stack-Format} +\index{Control-stack format} + + +The control stack contains only Lisp objects. Every object pointed to by an +entry on this stack is kept alive. + +The \rtccl control stack does not have a rigid frame structure. The compiler +is allowed a large amount of freedom in the use of the stack so that it choose +the best calling sequences. Mostly the compiler is the only system that cares +how the stack is laid out, so this isn't a big problem. See chapter +\ref{debug-info} for a description of the structures which allow the debugger +to parse the stack. + + + +\section{Values Passing Conventions} + + +The first {\it nregs} arguments are passed in registers, where nregs is an +implementation dependent constant. Any additional arguments are the block of +storage between CONT and CS on the control stack. The first nregs locations in +this block of storage are unused so that register more-args can be stored on +the stack without having to BLT the stack values up. + +Returning unknown values are passed in a similar way, but the stack values +block is between OLD-CONT and CS. There isn't any underneath the values: on +return OLD-CONT is always what CS was when the function was called. The +function returned to must copy the values into the desired location in its +frame and deallocate excess stuff on the top of the stack. + +More args are represented by a pointer to the block of values and a count. The +function that originally created the more arg must allocate and deallocate this +stuff somehow. In the case of a local call to a more arg entry, we can just +allocate it as a TN. The external entry point for a more arg entry is more +magical. + + + +The caller allocates the environment for the called function, stores the +arguments into it, and jumps to the function. The caller makes the called +environment current, passing in the return OLD-CONT and PC as explicit arguments. + +When returning values, the returner directly stores the return values into the +frame being returned to. This works even though the caller doesn't know what +function it is returning to, since the same return locations are allocated in +all frames. + +In a tail-recursive call, we can destructively modify the current frame and +jump right to the callee, rather than allocating a new frame. We can do this +because TNBind globally allocates frame locations; all frames are the same size +and have the same TNs in the same place. + + +\section{Binding-Stack Format} +\index{Binding stack format} +\comment<In a symbol chapter?> + + +The special binding stack is used to hold previous values of special variables +that have been bound. It grows and shrinks with the depth of the binding +environment, as reflected in the control stack. This stack contains +symbol-value pairs, with only boxed Lisp objects present. + +Each entry of the binding-stack consists of two boxed (32-bit) words. Pushed +first is a pointer to the symbol being bound. Pushed second is the symbol's +old value (any boxed item) that is to be restored when the binding stack is +popped. + + +\chapter{Functions} + +Function calling is a way of life. + +every function is a closure. pointer to current closure is passed in ENV +unless it isn't (in local call may be elsewhere). + +The description of the representation of functions and the function calling +conventions is a large part of the VM description, since: + Function calling is one of the most complicated facilities provided by the + VM. + + Everything that happens, happens in a function, so all parts of the system + tend to get dragged in. + + +Aspects of function call: + Control + Environment CONT, ENV + Argument/value passing + Argument/value count dispatching + + + + +\section{Function Object Format} +\label{Fn-Format} + +The old notion of a ``function object'' is now broken down into four different +parts: +\begin{description} +Function entry\\A function entry is a structure that holds the information +that we need to call a function. This is the user visible function object. + +Environment\\The environment is stuff that a function needs when it runs. +This includes constants computed at load time and variables closed over at run +time. Environment information may be allocated in the function entry structure +after the required linkage information. + +Entry information\\This is information about a specific function entry that is +occasionally referenced at run time, but need not be immediately accessible. +Entry information will be either allocated in the function entry +or in the environment that it points to. + +Debug information\\This is information about a function that isn't normally +needed at run time. Debug information can be found by poking around in +environment objects. +\end{description} +See chapter \ref{control-conventions} for a description of how function objects +are used. + + +\section{Environment Object Sub-primitives} + +alloc-code ? +alloc-closure? + + +\subsection{Debug Information Location} + +If present, debug information is stored immediately following any fixed +information in the environment object. It may be necessary to chain up +multiple levels of environments to find the debug information. The debug +information can be recognized because it is represented by a defstruct +structure. See chapter \ref{debug-info} for a description of the debug +information. + + +\section{Function Calls} +\index{function call} + +\ccl supports three major calling conventions. The convention used +depends on the amount of information available at compile time: +\begin{description} +Local\\Local call is used when the call and the called function are +compiled at the same time. Using the term ``convention'' to describe this +call mechanism is somewhat of a misnomer, since the compiler can do +whatever it wants. + +Named\\Named call is used when the call is to a global function whose name +is known at compile time. + +Anonymous\\Anonymous call is used when the function called is unknown until +run time. +\end{description} + +\#| +IR2 function call: + +Environment manipulation code is always emitted at the location of the Bind or +Return node for a Lambda. + +Implicit args to functions in IR2: +\begin{description} +\item[old-cont] cont to restore on return +\item[return-pc] pc to return to +\item[env] pointer to current closure (if heap) +\item[closure$<$n$>$] closed values for current closure (if stack) +\end{description} + +Other info needed for IR2 conversion of functions: +\begin{itemize} +\item base pointers for all heap closures consed by this function also + have passing locs for each explicit arg return strategy (known or + unknown) and return locs +\end{itemize} + + +All arguments including implicit ones must have both a passing TN and a +permanent TN. Passing locs for let calls can be the actual TN that holds the +variable in the case of local variables. Set closure variables must still have +a separate passing TN. + +If we know the values counts for the argument continuations, then we compile +local mv-calls by moving the TNs for the values continuations into the argument +passing locations. Other mv-calls must be compiled using various hairy +stack-hacking VOPs and unknown argument count call VOPs. + +For now, we will create the callee's frame just before the call, instead of +creating it before the evaluation of the first argument. If we created the +environment early, then we would be able to move the argument values directly +into the frame, instead of having to store them somewhere else for a while. +The problem with early creation is that lifetime analysis gets confused because +there is more than one instance of the same TN present simultaneously in the +case where there are nested calls to the same function. + +It turns out that there isn't a problem with a simple self-call, because the TN +in the called frame is really the ``same'' TN as the one in the current frame, +due to the restricted way in which we use the passing TNs. + +We emit code for external entry points during IR2 conversion. The external +entry point is the place where we start running in a full call from a +function-entry. It does arg count checking and dispatching, moves the +arguments into the passing locations for the for the lambda being called, and +calls the lambda, moving the results into the standard locations if there +aren't there already. +|\# + + +In IR2, the environment manipulation semantics of function call are decoupled +from the control semantics. When allocating closure variables for a Let, it is +possible to do environment manipulation with only the normal sequential control +flow. In the case of a Let call with the same environment, we neither +manipulate the environment nor transfer control; we merely initialize the +variables with Move VOPs. + +If a local function returns a known number of values which is less than the +number expected by the caller, then additional code must be inserted at the +return site which sets the unused values to NIL. + +The full function call mechanism must effectively be a subset of the local call +mechanism, since the two mechanisms must mesh at entry points and full function +calls. A full call turns into some kind of full call VOP. There are different +VOPs for calling named functions and closures. We also have tail-recursive +full call VOPs. Arguments are set up using Move VOPs, just as for local call. +The only difference is that the passing locations and conventions are +restricted to the standard ones. + +The gory details of arg count checking and dispatching are buried in the +Function-Entry VOP, which takes a functional and a list of continuations, one +pointing to each external entry. + + +\subsection{Local Call} +\index{local call} + +Named and anonymous call are called full calls, to distinguish them from +local call. When making full calls, the compiler must make many worst-case +assumptions that aren't necessary in a local call. The advantage of local +call is that the compiler can choose to use only those parts of the full +call sequence that are actually necessary. + +In local call, we always know the function being called, so we never have +to do argument count checking, and can always use an immediate branch for +the control transfer. If the function doesn't return to more than one +place, then can just use a simple branch, or even drop through. + +The argument passing TNs may be allocated anywhere. The caller allocates the +stack frame for the called function, moving any non-register arguments into the +passing locations in the callee's frame. + +If we are calling a local function that doesn't always return the same +number of values, then we must use the same values returning mechanism that +is used in full call, but we don't have to use the standard registers. + +A tail-recursive local call doesn't require any call VOP. We just use Move +VOPs to put the arguments into the passing locations and then jump to the the +start of the code for the function. We don't have to do any stack hackery +since we use the same stack frame format for all the functions compiled at the +same time. In many cases tail-recursive local calls can be entirely optimized +away, since they involve only some moves and a branch. We preference the +argument values to the passing locations of the called function, making it +likely that no move will be necessary. Often the control transfer can be done +by simply dropping through. + +We have to do some funny stuff with local calls in order to get the lifetimes +for the passing locations right, since lifetime analysis skips directly from +the return point to the call point, ignoring the uses of the passing locations +in the called function. Similarly, we pretend that a block ending in a return +has no successors. + +call-local (arg*) ``fun'' => value +multiple-call-local (arg*) ``fun'' =$>$ start end val0 ... val$<$n$>$ + Call-Local is used for calls to local functions that are forced to use the + unknown-values passing convention. Value is the first return value + register; we don't really do anything to it, but we specify it as a result + to represent the assignment done by the calling function. + + Multiple-Call-Local is similar, but specifies all the values used by the + unknown-values convention. Default-Values may be used to receive a + specific number of values. + +known-call-local (arg*) ``fun'' =$>$ value* + This VOP is used for local calls to functions where we can determine at + compile time that the number of values returned is always the same. In + this case, we don't need to indicate the number of values, and can pass + them in separate TNs. The Values are the actual return locations. We + don't really do anything to the return values; we just specify them as + results to represent the assignment done by the called function. + +known-return (return-pc value*) ``fun'' + This VOP is used for returning from local calls using the known return + values convention. The specified return Values are moved into the passing + locations in the caller's frame. + + +If we know that the function we are calling is non-recursive, then we can +compile it much like a tail-recursive call. We must have a call VOP to compute +the return PC, but we don't need to allocate a frame or save registers. We +just set up the arguments in the frame and do the call. + +We require simple functions to use the known-values convention. It would be +possible to support unknown values, but it would potentially require BLT'ing +return values out of the frame and on to the top of the stack. Supporting +unknown values would also require a bunch more VOPs, since we need different +call and return VOPs for simple call. + +Known values return causes no problems, since the callee knows how many values +are wanted. We store the values directly into the current frame, since it is +also the caller's frame. + +known-call-simple () ``fun'' =$>$ return-pc +known-return-simple (return-pc) ``fun'' + Similar to the non-simple VOPs, but don't allocate or deallocate frames, + and assume that argument and value passing is done with explicit Move VOPs. + + +\subsection{Full Call} +\index{full call} + +Both named and anonymous call are optimized for calls where the number of +arguments is known at compile time. Unknown argument calls are a +pathological case of anonymous call; this case will be ignored in the main +discussion. The difference between named and anonymous calls is in the +argument count dispatching mechanism. + +Named call allows an arbitrary number of entry points, with start PCs at +arbitrary locations in the code vector. The link-table mechanism described +below allows named calls to jump directly to the actual entry point without any +run-time argument count or type checking checking. + +Anonymous call has a fixed number of entry points, with start PCs at fixed +locations in the code vector. This allows calls to be made without knowing +what function is being called, but has more run-time overhead. The object +called must be checked to be a valid function-entry object. The entry PC must +be computed from the function entry, and argument count checking must be done +if there are more than three required or optional arguments. + +Argument passing in full call is conceptually similar to local call, but the +caller can't allocate the entire frame for the callee, since it doesn't know +how much stack is needed. Instead we allocate the frame in two parts. The +caller only allocates the beginning of the frame, which contains the stack +arguments in fixed locations. We leave the first $<$n$>$ locations unused so that +the called function can move register more args onto the stack without having +to BLT down any stack arguments. + +The place in the code where a full call jumps in is called an external entry +point. The external entry point allocates the rest of the stack frame and then +does a local call to the actual entry-point function, fetching the arguments +from the standard passing locations. Usually we can do a tail-recursive local +call. + +There are two main cases where the call from the external entry point cannot be +tail-recursive: + -- It is desirable to use the known-values convention for calling the + entry-point function if the entry-point is used in other local calls + (perhaps because of recursion). In this case, the called function stores + the return values back into the frame allocated by the external entry point + and then returns back to it. The external entry point must then return + these values using the standard unknown-values convention. + -- In a more-arg entry point we don't know how many stack arguments there are + at the beginning of the frame, so we can't really use the frame allocated + by the external entry point at all. Instead we do a local call to the + more-arg entry point, passing in a pointer to the first extra value. When + the function returns, we deallocate the crap on the stack and then return + the values. It is still o.k. to use the known-values return convention + from the more-arg entry since the extra arg values are no longer needed by + the time the returning function stores the return values back into the + external entry point frame. + + +In full call we must always use the unknown-values convention for return. The +first $<$n$>$ values are passed in the standard argument registers. The Old-Cont +register holds the Start of the values block and SP points to the End. + + +{small, fast} call (function arg0 ... arg$<$n$>$) ``nargs'' =$>$ value +{small, fast} call-named (arg0 ... arg$<$n$>$) ``nargs'' ``name'' =$>$ value + Call-Closure calls Function with the specified register arguments, + returning the first value as the result. ``nargs'' is the total number of + arguments passed. Only the register arguments actually passed should be + specified as operands. + + Call-Named is similar, but calls a global function specified at compile + time by ``name''. + +{small, fast} tail-call (function pc arg0 ... arg$<$n$>$) ``nargs'' +{small, fast} tail-call-named (pc arg0 ... arg$<$n$>$) ``nargs'' ``name'' + Similar to the standard call VOPs, but passes PC as the return PC, rather + than returning to the call site. These VOPs have no results since they + don't return. + +{small, fast} multiple-call (function arg0 ... arg$<$n$>$) ``nargs'' + =$>$ start end val0 ... val$<$n$>$ +{small, fast} multiple-call-named (arg0 ... arg$<$n$>$) ``nargs'' ``name'' + =$>$ start end val0 ... val$<$n$>$ + These VOPs are similar to the standard call VOPs, but allow any number of + values to be received by returning all the value passing registers as + results. A specific number of values may be received by using + Default-Values. + +call-unknown (function count arg0 ... arg$<$n$>$) =$>$ start end val0 ... val$<$n$>$ +tail-call-unknown (function pc count arg0 ... arg$<$n$>$) + Call a function with an unknown number of arguments. Used for apply and + hairy multiple-value-call. + +Function-Entry () ``function'' =$>$ env return-pc old-cont arg* + This marks the place where we jump into a component for an external + entry point. It represents whatever magic is necessary to do argument + count checking and dispatching. The external entry points for each + argument count will be successors of the entry-vector block (might be in + the same block if only one?) + + Function-Entry also represents argument passing by specifying the actual + external passing locations as results, thus marking the beginning of their + lifetimes. All passing locations actually used by any entry point are + specified as Args, including stack arguments. + {\#\#\# Do we really need this? If we do, then we probably also need similar + entry markers for local functions. The lifetimes don't really need to be + explicitly bounded, since an entry point is effectively ``the end of the + world.''} + + +\section(Returning from a Function Call) +\label(Return) +\index(Return) + + +return (return-pc value) +multiple-return (return-pc start end val0 ... val$<$n$>$) + Return Value from the current function, jumping back to the location + specified by Return-PC. {Perhaps allow to return any fixed, known number + of values.} + + Multiple-Return is similar, but allows an arbitrary number of values to be + returned. End - Start is the total number of values returned. Start + points to the beginning of the block of return values, but the first $<$n$>$ + values val0 ... val$<$n$>$ are actually returned in registers. + +default-values (start end val0 ... val$<$n$>$) =$>$ val0 ... val$<$j$>$ + This VOP is used when we want to receive exactly J values. If fewer than J + values were supplied, then missing values are defaulted to NIL. As a + side-effect, this VOP pops off any returned stack values. + + +\section{Saving and Restoring Registers} + +We use a caller-saves convention. The caller explicitly emits saving and +restoring code. Tail-recursive calls don't need +any register saving since we never come back. + + + +\chapter{Non-local exits} + + +\subsection{Unwind Blocks} +\index{Catch} +\index{Catch frames} + +There is one aspect of the control stack format that is fixed, and which +concerns us at this level. This is the format of the ``frames'' which mark the +destination of non-local exits, such as for BLOCK and CATCH. These frames are +collectively known as unwind blocks. The basic unwind block is used for +lexical exists such as BLOCK, and for UNWIND-PROTECT. Its format is the +following: +\begin{verbatim} +0 Pointer to current unwind-protect. +1 Control stack context to restore on entry. +2 PC to enter at. +\end{verbatim} + +The unwind block for CATCH is identical except for additional cells +containing the catch tag and previous catch. +\begin{verbatim} +0 Pointer to current unwind-protect. +1 Control stack context to restore on entry. +2 PC to enter at. +3 Catch tag. +4 Previous catch. +\end{verbatim} + +The conventions used to manipulate unwind blocks are described in chapter +\ref{Control-Conventions}. + + + +\section{Non-Local Exits} +\label{Catch} +\index{Catch} +\index{Throw} +\index{Unwinding} +\index{Unwind-Protect} +\index{Non-Local Exits} + +In the normal flow of control, each function that is called executes until it +reaches a return point; under these conditions no special effort is needed to +restore the environment as long as each function undoes any change that it +makes to the dynamic state before it returns. When we make a non-local +transfer, we skip a potentially arbitrary collection of these cleanup actions. +Since we cannot in general know what changes have been made to the dynamic +environment below us on the stack, we must restore a snapshot of the dynamic +environment at the re-entry point. + +We represent the closed continuation by the pointer to the unwind-block for the +reentry point. At the exit point, we just pass this stack pointer to the +Unwind VOP, which deals with processing any unwind-protects. When Unwind is +done, it grabs the re-entry PC out of the location at the stack pointer and +jumps in. + +Catch and Unwind-Protect work in pretty much the same way. We make a stack TN +to hold the catch frame or whatever, allocate TNs in them to represent the +slots, and then initialize them. The frame can be explicitly linked in by TN +manipulations, since the active catch and whatnot are represented by TNs. +Since allocation of the frame is decoupled from linking and unlinking, some of +this stuff could be moved out of loops. We will need a VOP for loading the PC +for an arbitrary continuation so that we can set up the reentry PC. This can +be done using the Call VOP. Using a call instruction is probably a good way to +get a PC on most architectures anyway. + +These TNs are allocated by Pack like any others; we use special alloc and +dealloc VOPs to delimit the aggregate lifetimes. + +In the non-local case, the the Block, Catch and Unwind-Protect special forms +are implemented using unwind blocks. The unwind blocks are built by move +operations emitted inline by the compiler. The compiler adds and removes +catches and unwind protects by explicit moves to the locations that hold the +current catch and unwind protect blocks. The entry PC is loaded using the Call +VOP. + +The Unwind miscop is the basis non-local exits. It takes the address of an +unwind block and processes unwind-protects until the current unwind-protect is +the one recorded in the unwind block, then jumps in at the entry in the unwind +block. The entry for the unwind block is responsible for restoring any state +other than the current unwind-protect. + +Unwind is used directly to implement non-local Return-From. The address of the +unwind block is stored in a closure variable. + +Catch just does a scan up the chain of Catch blocks, starting at the current +catch. When it finds the right one, it calls unwind on it. + +Unwind-protects are represented by unwind blocks linked into the current +unwind-protect chain. The cleanup code is entered just like any other any +other unwind entry. As before, the entry is responsible for establishing the +correct dynamic environment for the cleanup code. The target unwind block is +passed in some non-argument register. When the cleanup code is done, it +just calls Unwind with the block passed in. The cleanup code must be careful +not to trash the argument registers or CS, since there may be multiple values +lurking out there. + +With Catch/Throw, we always use the variable values return value passing convention, +since we don't know how many values the catch wants. With Block/Return-From, +we can do whatever we want, since the returner and receiver know each other. + +If a Block or Catch receives stack values, it must call a VOP that BLT's the +values down the stack, squeezing out any intermediate crud. + + +unwind (context) +throw (tag) + Unwind does a non-local exit, unwinding to the place indicated by Context. + Context is a pointer to a block of storage allocated on the control stack, + containing the entry PC, current environment and current unwind-protect. + We scan up the stack, processing unwind-protects until we reach the entry + point. The values being returned are passed in the standard locations. + Throw is similar, but does a dynamic lookup for the Tag to determine what + context to unwind to. + From ad35be781b477fe27eda6e0452376b63e557e1dc Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Wed, 13 Apr 2022 02:06:47 -0700 Subject: [PATCH 3115/4023] Remove some #-sb-xc-host. Just declare the values declaration. --- src/code/cross-early.lisp | 2 ++ src/compiler/ctype.lisp | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/cross-early.lisp b/src/code/cross-early.lisp index d17b7f9e85..b0d564e096 100644 --- a/src/code/cross-early.lisp +++ b/src/code/cross-early.lisp @@ -36,6 +36,8 @@ (declaim (declaration explicit-check always-bound)) +(declaim (declaration values)) + (defgeneric sb-xc:make-load-form (obj &optional env)) ;;; Restore normalcy of MOD and RATIONAL as type specifiers. diff --git a/src/compiler/ctype.lisp b/src/compiler/ctype.lisp index acd36b38a8..e1f317b176 100644 --- a/src/compiler/ctype.lisp +++ b/src/compiler/ctype.lisp @@ -349,7 +349,7 @@ and no value was provided for it." name)))))))))) ;;; the &REST type. (defun definition-type (functional) (declare (type functional functional) - #-sb-xc-host (values fun-type)) + (values fun-type)) (if (lambda-p functional) (make-fun-type :required (mapcar #'leaf-type (lambda-vars functional)) @@ -437,7 +437,6 @@ and no value was provided for it." name)))))))))) (defun note-fun-use (call &optional type) (declare (type combination call) (type (or approximate-fun-type null) type) - #-sb-xc-host (values approximate-fun-type)) (let* ((type (or type (make-approximate-fun-type))) (types (approximate-fun-type-types type)) @@ -508,7 +507,6 @@ and no value was provided for it." name)))))))))) (declare (type approximate-fun-type call-type) (type fun-type type) (function *ctype-test-fun* *lossage-fun* *unwinnage-fun*) - #-sb-xc-host (values boolean boolean)) (let* ((*lossage-detected* nil) (*unwinnage-detected* nil) From 50bda923b3d343dda0297dc18eadd513398f3807 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 13 Apr 2022 16:07:12 +0300 Subject: [PATCH 3116/4023] Revert "Remove some #-sb-xc-host." This reverts commit ad35be781b477fe27eda6e0452376b63e557e1dc. It doesn't build due to violating package locks. --- src/code/cross-early.lisp | 2 -- src/compiler/ctype.lisp | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/cross-early.lisp b/src/code/cross-early.lisp index b0d564e096..d17b7f9e85 100644 --- a/src/code/cross-early.lisp +++ b/src/code/cross-early.lisp @@ -36,8 +36,6 @@ (declaim (declaration explicit-check always-bound)) -(declaim (declaration values)) - (defgeneric sb-xc:make-load-form (obj &optional env)) ;;; Restore normalcy of MOD and RATIONAL as type specifiers. diff --git a/src/compiler/ctype.lisp b/src/compiler/ctype.lisp index e1f317b176..acd36b38a8 100644 --- a/src/compiler/ctype.lisp +++ b/src/compiler/ctype.lisp @@ -349,7 +349,7 @@ and no value was provided for it." name)))))))))) ;;; the &REST type. (defun definition-type (functional) (declare (type functional functional) - (values fun-type)) + #-sb-xc-host (values fun-type)) (if (lambda-p functional) (make-fun-type :required (mapcar #'leaf-type (lambda-vars functional)) @@ -437,6 +437,7 @@ and no value was provided for it." name)))))))))) (defun note-fun-use (call &optional type) (declare (type combination call) (type (or approximate-fun-type null) type) + #-sb-xc-host (values approximate-fun-type)) (let* ((type (or type (make-approximate-fun-type))) (types (approximate-fun-type-types type)) @@ -507,6 +508,7 @@ and no value was provided for it." name)))))))))) (declare (type approximate-fun-type call-type) (type fun-type type) (function *ctype-test-fun* *lossage-fun* *unwinnage-fun*) + #-sb-xc-host (values boolean boolean)) (let* ((*lossage-detected* nil) (*unwinnage-detected* nil) From ff71cc4174370f66ad0cea71ef2acd7eaeaef1c1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 13 Apr 2022 18:35:19 +0300 Subject: [PATCH 3117/4023] Provide proper source locations for warnings in MACROLET definitions. --- src/compiler/ir1-translators.lisp | 32 +++++++++++++++++++---------- src/compiler/parse-lambda-list.lisp | 16 +++++++++++---- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index d957760eda..9a48c21799 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -324,17 +324,27 @@ Evaluate the FORMS in the specified SITUATIONS (any of :COMPILE-TOPLEVEL, (unless (listp arglist) (fail "The local macro argument list ~S is not a list." arglist)) - `(,name macro . - ;; I guess the reason we want to compile here rather than possibly - ;; using an interpreted lambda is that we generate the usual gamut - ;; of style-warnings and such. One might wonder if this could somehow - ;; go through the front-most part of the front-end, to deal with - ;; semantics, but then generate an interpreted function or something - ;; more quick to emit than machine code. - ,(compile-in-lexenv - (make-macro-lambda nil arglist body 'macrolet name) - lexenv - nil nil nil t nil))))))) ; name source-info tlf ephemeral errorp + (let (source-info + tlf) + #-sb-xc-host + (when (boundp '*source-paths*) + (push `(declare (source-form ,definition)) body) + (setf source-info *source-info* + tlf (let ((path (or (get-source-path definition) + (and (boundp '*current-path*) + *current-path*)))) + (source-path-tlf-number path)))) + `(,name macro . + ;; I guess the reason we want to compile here rather than possibly + ;; using an interpreted lambda is that we generate the usual gamut + ;; of style-warnings and such. One might wonder if this could somehow + ;; go through the front-most part of the front-end, to deal with + ;; semantics, but then generate an interpreted function or something + ;; more quick to emit than machine code. + ,(compile-in-lexenv + (make-macro-lambda nil arglist body 'macrolet name) + lexenv + nil source-info tlf t nil)))))))) (defun funcall-in-macrolet-lexenv (definitions fun context) (%funcall-in-foomacrolet-lexenv diff --git a/src/compiler/parse-lambda-list.lisp b/src/compiler/parse-lambda-list.lisp index 3880cd4a03..95a3346759 100644 --- a/src/compiler/parse-lambda-list.lisp +++ b/src/compiler/parse-lambda-list.lisp @@ -1159,10 +1159,15 @@ ;; Drop &WHOLE and &ENVIRONMENT (new-ll (make-lambda-list llks nil req opt rest keys aux)) #-sb-xc-host - (*lexenv* (process-muffle-decls decls - (if (boundp '*lexenv*) - *lexenv* - (make-null-lexenv)))) + ((*lexenv* source-form) (process-muffle-decls decls + (if (boundp '*lexenv*) + *lexenv* + (make-null-lexenv)))) + #-sb-xc-host + (*current-path* (or (and source-form + (get-source-path source-form)) + (and (boundp '*current-path*) + *current-path*))) (parse (parse-ds-lambda-list new-ll)) ((declared-lambda-list decls) (let ((ll @@ -1208,6 +1213,9 @@ (,ll-whole ,@ll-env ,@(and ll-aux (cons '&aux ll-aux))) ,@(when (and docstring (eq doc-string-allowed :internal)) (prog1 (list docstring) (setq docstring nil))) + #-sb-xc-host + ,@(and source-form + `((declare (source-form ,source-form)))) ;; MACROLET doesn't produce an object capable of reflection, ;; so don't bother inserting a different lambda-list. ,@(unless (eq kind 'macrolet) From 68a86e2529756951ecd2d16d1296a2078c056e9f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 13 Apr 2022 20:11:05 +0300 Subject: [PATCH 3118/4023] ir2-optimize-jumps: don't delete branches from multiway-branch-if-eq. multiway-branch-if-eq inserts extra jumps which are not in the original ir2 and do not correspond to any predecessors. Reported by Eric Marsden. --- src/compiler/ir2opt.lisp | 10 ++++++++-- tests/compiler-2.pure.lisp | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 09b3175584..525bea0092 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -406,8 +406,14 @@ (multiway-branch-if-eq ;; codegen-info = (labels else-label key-type keys original-comparator) (let ((info (vop-codegen-info last))) - (setf (car info) (mapcar #'follow-jumps (car info)) - (cadr info) (follow-jumps (cadr info))))) + ;; Don't delete the branches when they reach zero + ;; predecessors as multiway-branch-if-eq inserts + ;; extra jumps which are not in the original ir2 + ;; and do not correspond to any predecessors. + (setf (car info) (mapcar (lambda (x) + (follow-jumps x nil)) + (car info)) + (cadr info) (follow-jumps (cadr info) nil)))) (t (when (conditional-p last) (unchain-jumps last))))))) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index dab8256d75..ed11c160f0 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3641,3 +3641,18 @@ (checked-compile '(lambda () (declare (notinline list +)) (list (loop for i below 2 count t))))) + +(with-test (:name :ir2-optimize-jumps-multiway-branch-if-eq-delete-branch) + (checked-compile-and-assert + () + `(lambda (a) + (declare (type (integer -345 1) a)) + (case (ldb (byte 24 5) a) + ((4 47 61 17 10 39) 1) + ((2 7 55) A) + ((42 48 16 33 40 20) A) + ((60 54 28) 3) + ((15 1 44 29 57 41 52) 32771) + ((46 64 3 18 36 49 37) 1) + (t A))) + ((-5) -5))) From a2096d4cf560bb5e73a70fcacc2d52b72fcd4e45 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Apr 2022 10:06:29 -0400 Subject: [PATCH 3119/4023] Add regression test --- tests/hash.pure.lisp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/hash.pure.lisp b/tests/hash.pure.lisp index 56a4933ea2..e27aef3710 100644 --- a/tests/hash.pure.lisp +++ b/tests/hash.pure.lisp @@ -467,3 +467,14 @@ (assert (>= (length (remove-duplicates field)) 8)))))))) (try 'sxhash) (try 'sb-int:good-hash-word->fixnum))) + +;;; Ensure that all layout-clos-hash values have a 1 somewhere +;;; such that LOGANDing any number of nonzero hashes is nonzero. +(with-test (:name :layout-hashes-constant-1-bit) + (let ((combined most-positive-fixnum)) + (maphash (lambda (classoid wrapper) + (declare (ignore classoid)) + (let ((hash (sb-kernel:wrapper-clos-hash wrapper))) + (setq combined (logand combined hash)))) + (sb-kernel:classoid-subclasses (sb-kernel:find-classoid 't))) + (assert (/= 0 combined)))) From f69cc584048cf3983ba441011af50e27eeb1f4a6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 14 Apr 2022 18:00:07 +0300 Subject: [PATCH 3120/4023] Better source locations for restart-case clauses. --- src/code/restart.lisp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/code/restart.lisp b/src/code/restart.lisp index c792a05cc5..5c76abb55e 100644 --- a/src/code/restart.lisp +++ b/src/code/restart.lisp @@ -126,7 +126,7 @@ ;; the respective BODY. (let ((block-tag (sb-xc:gensym "BLOCK")) (temp-var (gensym))) - (labels ((parse-keywords-and-body (keywords-and-body) + (labels ((parse-keywords-and-body (keywords-and-body source-form) (do ((form keywords-and-body (cddr form)) (result '())) (nil) (destructuring-bind (&optional key (arg nil argp) &rest rest) @@ -137,14 +137,19 @@ (cond ((and (eq key :report) argp) (list :report-function - (if (stringp arg) - `#'(lambda (stream) - (write-string ,arg stream)) - `#',arg))) + `(sb-c::with-source-form ,source-form + ,(if (stringp arg) + `#'(lambda (stream) + (write-string ,arg stream)) + `#',arg)))) ((and (eq key :interactive) argp) - (list :interactive-function `#',arg)) + (list :interactive-function + `(sb-c::with-source-form ,source-form + #',arg))) ((and (eq key :test) argp) - (list :test-function `#',arg)) + (list :test-function + `(sb-c::with-source-form ,source-form + #',arg))) (t (return (values result form)))) result))))) @@ -156,7 +161,7 @@ 'restart-case clause)) (destructuring-bind (name lambda-list &body body) clause (multiple-value-bind (keywords body) - (parse-keywords-and-body body) + (parse-keywords-and-body body clause) (list name (gensym "TAG") keywords lambda-list body))))) (make-binding (clause-data) (destructuring-bind (name tag keywords lambda-list body) clause-data @@ -174,7 +179,7 @@ (locally (declare (optimize (safety 0))) (go ,tag))) ,@keywords))) - (make-apply-and-return (clause-data) + (make-apply-and-return (clause-data source-form) (destructuring-bind (name tag keywords lambda-list body) clause-data (declare (ignore name keywords)) (multiple-value-bind (body declarations) (parse-body body nil) @@ -185,11 +190,13 @@ (not (member (car lambda-list) '(&optional &key &aux)))) `(funcall (lambda ,lambda-list + (declare (sb-c::source-form ,source-form)) ,@declarations (progn ,@body)) ,temp-var)) (t `(apply (lambda ,lambda-list + (declare (sb-c::source-form ,source-form)) ,@declarations (progn ,@body)) ,temp-var))))))))) @@ -202,7 +209,7 @@ ,(mapcar #'make-binding clauses-data) (return-from ,block-tag ,(munge-restart-case-expression expression env))) - ,@(mapcan #'make-apply-and-return clauses-data)))))))) + ,@(mapcan #'make-apply-and-return clauses-data clauses)))))))) (defmacro with-simple-restart ((restart-name format-string &rest format-arguments) From 7981fb6f7ebfe69a0dc4fcf8f4ecbe1ea3998b11 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Apr 2022 16:53:10 -0400 Subject: [PATCH 3121/4023] Funnel COMPILE calls in CLOS through a wrapper function This simplifies rebinding of the warning and note muffler, and allows tracing or otherwise intercepting system-generated compilation. Also: gensym is considered harmful. I'm noticing tons of compilations to the identical lambda, and it's a lot easier to figure out why without having to think about symbols that differ for no good reason. (I suspect that if N threads all need to invoke a GF for the first time at about the same time, they'll all cache miss, and then all compile the identical dfun. This is horrible and is need of good solution) --- src/compiler/policy.lisp | 7 +++++++ src/pcl/cache.lisp | 15 +++++++++++---- src/pcl/call-next-method.lisp | 2 +- src/pcl/ctor.lisp | 13 ++++--------- src/pcl/dlisp.lisp | 4 ++-- src/pcl/fngen.lisp | 5 ++--- src/pcl/init.lisp | 3 +-- src/pcl/low.lisp | 24 ++++++++++++++++++++---- src/pcl/precom2.lisp | 6 +++--- tests/clos.impure-cload.lisp | 6 +++--- 10 files changed, 54 insertions(+), 31 deletions(-) diff --git a/src/compiler/policy.lisp b/src/compiler/policy.lisp index 2c7c655bd4..689ac7597c 100644 --- a/src/compiler/policy.lisp +++ b/src/compiler/policy.lisp @@ -286,6 +286,13 @@ See also :POLICY option in WITH-COMPILATION-UNIT." ;; can create a POLICY that indicates absence of primary qualities. ;; This does not affect RESTRICT-COMPILER-POLICY because a lower bound of 0 ;; can be assumed for everything. SET-MACRO-POLICY might care though. + ;; + ;; FIXME: it is wrong IMHO that the min/max are applied lazily, every time + ;; they are fetched from a policy. This makes it impossible to create + ;; a policy that represents _exactly_ what you want in the internals of the + ;; CLOS implementation. Applying the min/max when a policy is created would + ;; provide an escape mechanism. Alternatively we could indicate in the policy + ;; whether each quality should be treated as absolute. (define-getter %policy-quality (let ((min *policy-min*) (max *policy-max*)) diff --git a/src/pcl/cache.lisp b/src/pcl/cache.lisp index fc1b5666db..f269580168 100644 --- a/src/pcl/cache.lisp +++ b/src/pcl/cache.lisp @@ -124,7 +124,7 @@ ;;; Return VALUE if it is not the unbound marker, otherwise executes ELSE: (defmacro non-empty-or (value else) - (with-unique-names (n-value) + (let ((n-value '#:val)) `(let ((,n-value ,value)) (if (unbound-marker-p ,n-value) ,else @@ -197,12 +197,19 @@ ;;; In other words, produces inlined code for COMPUTE-CACHE-INDEX when ;;; number of keys and presence of values in the cache is known ;;; beforehand. +(defglobal *hash-vars* + (make-array 6 :initial-contents + (loop for i from 0 below 6 collect (make-symbol (format nil "H~D" i))))) (defun emit-cache-lookup (cache-var layout-vars miss-tag value-var) (declare (muffle-conditions code-deletion-note)) - (with-unique-names (probe n-vector n-depth n-mask + (multiple-value-bind (probe n-vector n-depth n-mask MATCH-WRAPPERS EXIT-WITH-HIT) + (values '#:probe '#:vect '#:depth '#:mask '#:try '#:hit) (let* ((num-keys (length layout-vars)) - (hash-vars (make-gensym-list num-keys)) + (hash-vars (loop for i from 0 below num-keys + collect (if (< i #.(length *hash-vars*)) + (aref *hash-vars* i) + (make-symbol (format nil "H~D" i))))) (pointer ;; We don't need POINTER if the cache has 1 key and no value, ;; or if FOLD-INDEX-ADDRESSING is supported, in which case adding @@ -488,7 +495,7 @@ cache) ;;; Copying a cache without expanding it is very much like mapping it: -;;; we need to be carefull because there may be updates while we are +;;; we need to be careful because there may be updates while we are ;;; copying it, and we don't want to copy incomplete entries or invalid ;;; ones. (defun copy-cache (cache) diff --git a/src/pcl/call-next-method.lisp b/src/pcl/call-next-method.lisp index 41e336a564..596d5b1f0a 100644 --- a/src/pcl/call-next-method.lisp +++ b/src/pcl/call-next-method.lisp @@ -188,7 +188,7 @@ (optimize (speed 3) (debug 0) (safety 0))) ',result) nil)) - (function (compile nil lambda)) + (function (pcl-compile lambda)) (specializers (append (method-specializers (first orig-methods)) (method-specializers (first cnm-methods)))) (method (make-instance 'standard-method diff --git a/src/pcl/ctor.lisp b/src/pcl/ctor.lisp index 68b045def6..ace2507484 100644 --- a/src/pcl/ctor.lisp +++ b/src/pcl/ctor.lisp @@ -552,12 +552,9 @@ (multiple-value-bind (form locations names optimizedp) (constructor-function-form ctor) (setf (%funcallable-instance-fun ctor) - (apply - (let ((*compiling-optimized-constructor* t)) - (handler-bind ((compiler-note #'muffle-warning)) - (compile nil `(lambda ,names (declare #.*optimize-speed*) - ,form)))) - locations) + (apply (let ((*compiling-optimized-constructor* t)) + (pcl-compile `(lambda ,names ,form) t)) + locations) (ctor-state ctor) (if optimizedp 'optimized 'fallback)))))) (defun install-optimized-allocator (ctor) @@ -580,9 +577,7 @@ (multiple-value-bind (form optimizedp) (allocator-function-form ctor) (setf (%funcallable-instance-fun ctor) - (let ((*compiling-optimized-constructor* t)) - (handler-bind ((compiler-note #'muffle-warning)) - (compile nil form))) + (let ((*compiling-optimized-constructor* t)) (pcl-compile form t)) (ctor-state ctor) (if optimizedp 'optimized 'fallback)))))) (defun allocator-function-form (ctor) diff --git a/src/pcl/dlisp.lisp b/src/pcl/dlisp.lisp index 5fa13f8f52..ed2682f375 100644 --- a/src/pcl/dlisp.lisp +++ b/src/pcl/dlisp.lisp @@ -182,12 +182,12 @@ (declare (optimize (sb-c:store-source-form 0))) (declare (optimize (sb-c::store-closure-debug-pointer 3))) #'(lambda ,args - (let () + (let () ; What is this LET doing? (declare #.*optimize-speed*) ,form))))) (values (if *precompiling-lap* `#',lambda - (compile nil lambda)) + (pcl-compile lambda)) nil))) ;;; note on implementation for CMU 17 and later (including SBCL): diff --git a/src/pcl/fngen.lisp b/src/pcl/fngen.lisp index 076c8825b9..e931f83651 100644 --- a/src/pcl/fngen.lisp +++ b/src/pcl/fngen.lisp @@ -111,10 +111,9 @@ (defun get-new-fun-generator (lambda test code-converter) (multiple-value-bind (code gensyms) (compute-code lambda code-converter) (let ((generator-lambda `(lambda ,gensyms - (declare (muffle-conditions compiler-note) - (optimize (sb-c:store-source-form 0))) + (declare (optimize (sb-c:store-source-form 0))) (function ,code)))) - (let ((generator (compile nil generator-lambda))) + (let ((generator (pcl-compile generator-lambda))) (ensure-fgen test gensyms generator generator-lambda nil) generator)))) diff --git a/src/pcl/init.lisp b/src/pcl/init.lisp index 6ca870f241..4e3df55773 100644 --- a/src/pcl/init.lisp +++ b/src/pcl/init.lisp @@ -91,8 +91,7 @@ ;; The normal, good case: compile an efficient typecheck function. (let ((*typecheck-stack* (cons cookie *typecheck-stack*))) (handler-bind (((or style-warning compiler-note) #'muffle-warning)) - (let ((fun (compile - nil + (let ((fun (pcl-compile `(named-lambda (slot-typecheck ,type) (value) (declare (optimize (sb-c:store-coverage-data 0) (sb-c::type-check 3) diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 3d3722e876..1299cccb62 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -227,8 +227,6 @@ ;;;; abstraction around our native structure representation doesn't ;;;; seem to add anything useful, and could probably go away. -;;; The definition of STRUCTURE-TYPE-P was moved to early-low.lisp. - (defun structure-type-slot-description-list (type) (let* ((dd (find-defstruct-description type)) (include (dd-include dd)) @@ -281,7 +279,9 @@ ;;; Damned-if-you-do / damned-if-you don't - the best thing would be to ;;; compile all accessors at "really" compile-time but not store the writer ;;; for a reaadonly slot under the #<fdefn> for #'(SETF slot-name). -;;; +;;; FIXME: this is highly obfuscated and we should just do exactly what the +;;; preceding comment suggests: compile all slot-writer frobs and attach +;;; them to the defstruct-definition in %TARGET-DEFSTRUCT. (defun structure-slotd-writer-function (type slotd) ;; TYPE is not used, because the DD is taken from runtime data. (declare (ignore type)) @@ -294,7 +294,7 @@ (lambda (newval instance) (if (eql setter 0) (let* ((dd (wrapper-info (%instance-wrapper instance))) - (f (compile nil (slot-setter-lambda-form dd slotd)))) + (f (pcl-compile (slot-setter-lambda-form dd slotd)))) (if (functionp f) (funcall (setq setter f) newval instance) (uninitialized-accessor-function :writer slotd))) @@ -309,3 +309,19 @@ (defun structure-slotd-init-form (slotd) (dsd-default slotd)) + +(defun pcl-compile (expr &optional unsafe-policy) + (let* ((base-policy sb-c::*policy*) + (lexenv + (sb-c::make-almost-null-lexenv + (if unsafe-policy + (sb-c::process-optimize-decl + '((space 1) (compilation-speed 1) + (speed 3) (safety 0) (sb-ext:inhibit-warnings 3) (debug 0)) + base-policy) + base-policy) + ;; I suspect that INHIBIT-WARNINGS precludes them from happening + (list (cons (sb-kernel:find-classoid 'style-warning) 'muffle-warning) + (cons (sb-kernel:find-classoid 'compiler-note) 'muffle-warning)) + nil nil nil))) + (sb-c:compile-in-lexenv expr lexenv nil nil nil nil nil))) diff --git a/src/pcl/precom2.lisp b/src/pcl/precom2.lisp index 3918b70fb2..2486f36822 100644 --- a/src/pcl/precom2.lisp +++ b/src/pcl/precom2.lisp @@ -34,13 +34,13 @@ (push '("SB-PCL" *pcl-package* *built-in-classes*) *!removable-symbols*) +(defun !system-class-p (x) (typep x 'sb-pcl::system-class)) + (let ((class (find-class 'sequence))) ;; Give the prototype a concrete prototype. It's an extra step because ;; SEQUENCE was removed from *built-in-classes* (setf (slot-value class 'prototype) #())) -(dolist (c (sb-vm:list-allocated-objects - :all - :test (compile nil '(lambda (x) (typep x 'sb-pcl::system-class))))) +(dolist (c (sb-vm:list-allocated-objects :all :test #'!system-class-p)) (when (slot-boundp c 'sb-pcl::prototype) (let ((val (slot-value c 'sb-pcl::prototype))) (assert (typep val c))))) diff --git a/tests/clos.impure-cload.lisp b/tests/clos.impure-cload.lisp index 87e3866f21..2c5af3e6b0 100644 --- a/tests/clos.impure-cload.lisp +++ b/tests/clos.impure-cload.lisp @@ -186,10 +186,10 @@ (call-next-method))) (defvar *compile-count* 0) -(sb-int:encapsulate 'compile 'call-counter - (lambda (f name thing) +(sb-int:encapsulate 'sb-c:compile-in-lexenv 'call-counter + (lambda (realfun &rest args) (incf *compile-count*) - (funcall f name thing))) + (apply realfun args))) (defstruct mystruct-r/w (some-slot)) (defstruct mystruct-r/o (allegedly-immutable-slot 3 :read-only t)) From 485265036424b00c11f82dd36770030af70aed0c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Apr 2022 20:21:47 -0400 Subject: [PATCH 3122/4023] Add finalizers to run-program streams Reported by Don Cohen on sbcl-help --- src/code/run-program.lisp | 8 ++++---- tests/run-program.impure.lisp | 13 +++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/code/run-program.lisp b/src/code/run-program.lisp index 696299010c..5ed0e1fa38 100644 --- a/src/code/run-program.lisp +++ b/src/code/run-program.lisp @@ -1188,16 +1188,16 @@ Users Manual for details about the PROCESS structure. (push write-fd *close-on-error*) (let ((stream (make-fd-stream write-fd :output t :element-type :default - :external-format - external-format))) + :external-format external-format + :auto-close t))) (values read-fd stream))) (:output (push read-fd *close-on-error*) (push write-fd *close-in-parent*) (let ((stream (make-fd-stream read-fd :input t :element-type :default - :external-format - external-format))) + :external-format external-format + :auto-close t))) (values write-fd stream))) (t (sb-unix:unix-close read-fd) diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index dc05286a20..5076a5ca22 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -13,6 +13,19 @@ (cl:in-package :cl-user) +(defun bin-pwd-ignoring-result () + (let ((initially-open-fds (directory "/proc/self/fd/*" :resolve-symlinks nil))) + (sb-ext:run-program "/usr/bin/pwd" nil :input :stream :output :stream :wait nil) + (length initially-open-fds))) + +(with-test (:name (run-program :autoclose-streams) :skipped-on (:not :linux)) + (let ((n-initially-open-fds (bin-pwd-ignoring-result))) + (gc) + (sb-sys:scrub-control-stack) ; Make sure we're not referencing the #<process> + (gc) ; now nothing should reference the streams + (assert (= (length (directory "/proc/self/fd/*" :resolve-symlinks nil)) + n-initially-open-fds)))) + ;; In addition to definitions lower down the impurity we're avoiding ;; is the sigchld handler that RUN-PROGRAM sets up, which interfers ;; with the manual unix process control done by the test framework From a0d2e075eca2abe5265c9b492fb9daf97a160d6e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 15 Apr 2022 22:52:47 +0300 Subject: [PATCH 3123/4023] Fix the <-integer-fixnum vop-optimize. Correctly invert the comparisons. --- src/compiler/ir2opt.lisp | 83 ++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 525bea0092..722900e445 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -994,7 +994,6 @@ (delete-vop vop) (delete-vop next)))))))) - (when (vop-existsp :named sb-vm::<-integer-fixnum) ;; The <-integer-fixnum VOPs already perform dispatch for fixnum/bignum, ;; and load the header byte. @@ -1005,8 +1004,11 @@ (destructuring-bind (target not-p) (vop-codegen-info vop) (let ((target-block (gethash target *2block-info*))) (when target-block - (let* ((next (ir2-block-next (vop-block vop))) - + (let* ((next (if (eq vop (ir2-block-last-vop (vop-block vop))) + (ir2-block-next (vop-block vop)) + (let ((next (next-vop vop))) + (and (eq (vop-name next) 'branch) + (gethash (car (vop-codegen-info next)) *2block-info*))))) (not-target-block (if not-p target-block next)) @@ -1027,41 +1029,46 @@ (when (eq (tn-ref-tn (tn-ref-across args)) integer) (setf tns (list (tn-ref-tn args) integer))))) (destructuring-bind (cmp-target cmp-not-p) (vop-codegen-info cmp) - (let* ((cmp-next (ir2-block-next (vop-block cmp))) - (cmp-target-block (gethash cmp-target *2block-info*)) - (cmp-not-target-block (if cmp-not-p - cmp-target-block - cmp-next)) - (cmp-target-block (if cmp-not-p - cmp-next - cmp-target-block))) - (when (if cmp-not-p - (eq cmp-not-target-block not-target-block) - (eq cmp-target-block not-target-block)) - (flet ((invert () - (template-or-lose - (case (vop-name cmp) - (sb-vm::>-integer-fixnum 'sb-vm::<=-integer-fixnum) - (sb-vm::<-integer-fixnum 'sb-vm::>=-integer-fixnum) - (sb-vm::>-fixnum-integer 'sb-vm::<=-fixnum-integer) - (sb-vm::<-fixnum-integer 'sb-vm::>=-fixnum-integer))))) - (multiple-value-bind (new-vop new-target new-not-p) - (cond ((and not-p cmp-not-p) - (values (vop-info cmp) target t)) - (not-p - (values (invert) target t)) - (cmp-not-p - (values (invert) cmp-target nil)) - (t - (values (invert) target nil))) - (prog1 - (emit-and-insert-vop (vop-node vop) (vop-block vop) - new-vop - (reference-tn-list tns nil) - nil vop - (list new-target new-not-p)) - (delete-vop vop) - (delete-vop cmp))))))))))))) + (let* ((cmp-next-block (ir2-block-next (vop-block cmp))) + (cmp-target-block (gethash cmp-target *2block-info*))) + (flet ((invert () + (template-or-lose + (case (vop-name cmp) + (sb-vm::>-integer-fixnum 'sb-vm::<=-integer-fixnum) + (sb-vm::<-integer-fixnum 'sb-vm::>=-integer-fixnum) + (sb-vm::>-fixnum-integer 'sb-vm::<=-fixnum-integer) + (sb-vm::<-fixnum-integer 'sb-vm::>=-fixnum-integer))))) + (multiple-value-bind (new-vop new-target new-not-p) + (cond ((and not-p + (eq not-target-block cmp-next-block)) + (if cmp-not-p + (values (invert) cmp-target nil) + (values (vop-info cmp) cmp-target nil))) + ((and not-p + (eq not-target-block cmp-target-block)) + (if cmp-not-p + (values (vop-info cmp) cmp-target t) + (values (invert) cmp-target t))) + ((and (not not-p) + (eq not-target-block cmp-target-block)) + (if cmp-not-p + (values (vop-info cmp) (ir2-block-%label target-block) nil) + (values (invert) (ir2-block-%label target-block) nil))) + ((and (not not-p) + (eq not-target-block cmp-next-block)) + (if cmp-not-p + (values (invert) cmp-target nil) + (values (vop-info cmp) cmp-target nil))) + (t + (return-from vop-optimize-bignump-optimizer))) + (prog1 + (emit-and-insert-vop (vop-node vop) (vop-block vop) + new-vop + (reference-tn-list tns nil) + nil vop + (list new-target new-not-p)) + (delete-vop vop) + (delete-vop cmp)))))))))))) nil)))) ;;; No need to reset the stack pointer just before returning. From 332e8c275ad63a087a49fd875c63f6c33180b1a9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 16 Apr 2022 01:06:46 +0300 Subject: [PATCH 3124/4023] x86-64: add >-integer-fixnum VOPs. --- NEWS | 1 + src/compiler/x86-64/arith.lisp | 65 ----------------------- src/compiler/x86-64/type-vops.lisp | 82 ++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 65 deletions(-) diff --git a/NEWS b/NEWS index 9dd3d4f82f..1504591646 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,7 @@ changes relative to sbcl-2.2.3: * optimization: inlined functions enclosed in local macro definitions no longer save their entire lexical environment, reducing unnecessary memory retention. + * optimization: faster (< integer fixnum) comparisons (ARM64 and x86-64). changes in sbcl-2.2.3 relative to sbcl-2.2.2: * minor incompatible change: SB-THREAD:MUTEX-OWNER may return :THREAD-DEAD diff --git a/src/compiler/x86-64/arith.lisp b/src/compiler/x86-64/arith.lisp index 33176da0b1..25457db1a2 100644 --- a/src/compiler/x86-64/arith.lisp +++ b/src/compiler/x86-64/arith.lisp @@ -1961,71 +1961,6 @@ (define-conditional-vop < :l :b :ge :ae) (define-conditional-vop > :g :a :le :be)) -(declaim (inline load-bignum-length)) -(defun load-bignum-length (input output) - ;; Unaligned load - (inst mov :dword output (ea (- 1 other-pointer-lowtag) input))) - -(define-vop (fast-if->-zero) - (:args (x :scs (descriptor-reg))) - (:arg-types integer (:constant (integer 0 0))) - (:info target not-p y) - (:ignore y) - (:temporary (:sc unsigned-reg) temp) - (:translate >) - (:conditional) - (:variant nil) - (:variant-vars bignum-only) - (:policy :fast-safe) - (:generator 8 - (move temp x) - (unless bignum-only - (generate-fixnum-test temp) - (inst jmp :nz BIGNUM) - (inst test temp temp) - (inst jmp (if not-p :le :g) target) - (inst jmp DONE)) - BIGNUM - (load-bignum-length x temp) - (inst cmp :qword - (ea (- (+ (* bignum-digits-offset n-word-bytes)) - other-pointer-lowtag - n-word-bytes) - x - temp - (ash 1 word-shift)) - 0) - (inst jmp (if not-p :l :ge) target) - DONE)) - -(define-vop (fast-if->-zero-bignum fast-if->-zero) - (:arg-types bignum (:constant (integer 0 0))) - (:variant t)) - -(define-vop (fast-if-<-zero fast-if->-zero) - (:info y) - (:translate <) - (:conditional :l) - (:variant nil) - (:generator 9 - (unless bignum-only - (move temp x) - (generate-fixnum-test temp) - (inst jmp :z TEST)) - (load-bignum-length x temp) - (inst mov temp (ea (- (* bignum-digits-offset n-word-bytes) - other-pointer-lowtag - n-word-bytes) - x - temp - (ash 1 word-shift))) - TEST - (inst test temp temp))) - -(define-vop (fast-if-<-zero-bignum fast-if-<-zero) - (:arg-types bignum (:constant (integer 0 0))) - (:variant t)) - (define-vop (fast-if-eql/signed fast-conditional/signed) (:translate eql %eql/integer) (:generator 6 (emit-optimized-cmp x y temp))) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index dbc13f8564..03e3e141cc 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -653,3 +653,85 @@ (sb-c::delete-vop prev) (sb-c::delete-vop vop) new))))))) + +(define-vop (>-integer-fixnum) + (:translate >) + (:args (integer :scs (descriptor-reg)) + (fixnum :scs (immediate any-reg))) + (:arg-types (:or integer bignum) tagged-num) + (:temporary (:sc unsigned-reg) temp) + (:conditional) + (:info target not-p) + (:args-var args) + (:policy :fast-safe) + (:variant-vars comparison) + (:variant :g) + (:generator 8 + (unless (sc-is (tn-ref-tn args) descriptor-reg control-stack) + (setf args (tn-ref-across args))) + (let* ((integer-p (csubtypep (tn-ref-type args) (specifier-type 'integer))) + (fixnum (if (sc-is fixnum immediate) + (let* ((value (fixnumize (tn-value fixnum)))) + (cond ((plausible-signed-imm32-operand-p value) + value) + (t + (inst mov temp value) + temp))) + fixnum))) + (multiple-value-bind (yep nope) + (if not-p + (values not-target target) + (values target not-target)) + (assemble () + (when (types-equal-or-intersect (tn-ref-type args) (specifier-type 'fixnum)) + (generate-fixnum-test integer) + (inst jmp :nz BIGNUM) + (if (eql fixnum 0) + (inst test integer integer) + (inst cmp integer fixnum)) + (inst jmp comparison yep) + (inst jmp nope)) + bignum + (unless (fixnum-or-other-pointer-tn-ref-p args) + (test-type integer temp nope t (other-pointer-lowtag))) + (loadw temp integer 0 other-pointer-lowtag) + (unless integer-p + (inst cmp :byte temp bignum-widetag) + (inst jmp :ne nope)) + #.(assert (= (integer-length bignum-widetag) 5)) + (inst shr temp 5) + (inst cmp :qword (ea (- other-pointer-lowtag) integer temp) 0) + (inst jmp (case comparison + ((:l :le) (if not-p :ge :l)) + (t (if not-p :l :ge))) + target)))) + not-target)) + +(define-vop (<-integer-fixnum >-integer-fixnum) + (:translate <) + (:variant :l)) + +(define-vop (>-fixnum-integer >-integer-fixnum) + (:translate >) + (:args (fixnum :scs (immediate any-reg)) + (integer :scs (descriptor-reg))) + (:arg-types tagged-num (:or integer bignum)) + (:variant :l)) + +(define-vop (<-fixnum-integer >-fixnum-integer) + (:translate <) + (:variant :g)) + +;;; For integerp+cmp +(define-vop (<=-integer-fixnum >-integer-fixnum) + (:translate) + (:variant :le)) +(define-vop (>=-integer-fixnum <-integer-fixnum) + (:translate) + (:variant :ge)) +(define-vop (<=-fixnum-integer >-fixnum-integer) + (:translate) + (:variant :le)) +(define-vop (>=-fixnum-integer <-fixnum-integer) + (:translate) + (:variant :ge)) From d23a2ff60db04b77178bfb77a91e446d91dabc2a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 16 Apr 2022 01:11:56 +0300 Subject: [PATCH 3125/4023] Disable the (run-program :autoclose-streams) test, too flaky. --- tests/run-program.impure.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index 5076a5ca22..9e4c86558d 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -18,7 +18,9 @@ (sb-ext:run-program "/usr/bin/pwd" nil :input :stream :output :stream :wait nil) (length initially-open-fds))) -(with-test (:name (run-program :autoclose-streams) :skipped-on (:not :linux)) +(with-test (:name (run-program :autoclose-streams) + :skipped-on (:or :sbcl ;; not reliable enough + (:not :linux))) (let ((n-initially-open-fds (bin-pwd-ignoring-result))) (gc) (sb-sys:scrub-control-stack) ; Make sure we're not referencing the #<process> From 088a2775792d6521213032dedfc284fc853cc3ea Mon Sep 17 00:00:00 2001 From: Jan Moringen <jmoringe@techfak.uni-bielefeld.de> Date: Fri, 15 Apr 2022 14:17:35 +0200 Subject: [PATCH 3126/4023] Extend float infinity handling in MAKE-NUMERIC-TYPE --- src/code/type.lisp | 126 ++++++++++++++++++++++++------------------- tests/type.pure.lisp | 42 ++++++++++++--- 2 files changed, 106 insertions(+), 62 deletions(-) diff --git a/src/code/type.lisp b/src/code/type.lisp index a3bb8d73f4..58ea25fe77 100644 --- a/src/code/type.lisp +++ b/src/code/type.lisp @@ -2608,24 +2608,83 @@ expansion happened." (case type (rational #+sb-xc-host (return-from coerce-numeric-bound) - #-sb-xc-host (rational thing)) + #-sb-xc-host (if (and (floatp thing) (float-infinity-p thing)) + (return-from coerce-numeric-bound nil) + (rational thing))) ((float single-float) (cond #-sb-xc-host ((<= most-negative-single-float thing most-positive-single-float) (coerce thing 'single-float)) (t - (return-from coerce-numeric-bound)))) + (return-from coerce-numeric-bound nil)))) (double-float (cond #-sb-xc-host ((<= most-negative-double-float thing most-positive-double-float) (coerce thing 'double-float)) (t - (return-from coerce-numeric-bound))))))) + (return-from coerce-numeric-bound nil))))))) (when bound (if (consp bound) (list (c (car bound))) (c bound))))) +(defun %make-union-numeric-type (class format complexp low high enumerable) + (declare (type (member integer rational float nil) class)) + (macrolet ((unionize (&rest specs) + `(type-union + ,@(loop for (class format coerce simple-coerce) in specs + collect `(make-numeric-type + :class ',class + :format ',format + :complexp complexp + :low ,(if simple-coerce + `(coerce low ',coerce) + `(coerce-numeric-bound low ',coerce)) + :high ,(if simple-coerce + `(coerce high ',coerce) + `(coerce-numeric-bound high ',coerce)) + :enumerable enumerable))))) + (cond ((and (null class) (member complexp '(:real :complex))) + (cond ((not (bounds-unbounded-p low high)) + (cond ((and (floatp low) (float-infinity-p low) + (eql low high)) + ;; low and high are some float + ;; infinity. not representable as a + ;; rational. + (let ((complexp :real)) ; TODO what if complexp was :complex? + (unionize (float single-float single-float t) + (float double-float double-float t)))) + (t + (unionize (rational nil rational) + (float single-float single-float) + (float double-float double-float))))) + ((eq complexp :complex) + (specifier-type 'complex)) + (t + (specifier-type 'real)))) + ((and (eq class 'float) (member complexp '(:real :complex)) + (eq format nil)) + (cond ((not (bounds-unbounded-p low high)) + (if (and (floatp low) (float-infinity-p low) + (eql low high)) + (let ((complexp :real)) + (unionize (float single-float single-float t) + (float double-float double-float t) + #+long-float((error "long-float")))) + (unionize (float single-float single-float) + (float double-float double-float) + #+long-float((error "long-float"))))) + ((eq complexp :complex) + (specifier-type '(complex float))) + (t + (specifier-type 'float)))) + ((and (null complexp) + (or class format low high)) + (type-union (make-numeric-type :class class :format format :complexp :complex + :low low :high high :enumerable enumerable) + (make-numeric-type :class class :format format :complexp :real + :low low :high high :enumerable enumerable)))))) + ;;; Impose canonicalization rules for NUMERIC-TYPE. Note that in some ;;; cases, despite the name, we return *EMPTY-TYPE* or a UNION-TYPE instead of a ;;; NUMERIC-TYPE. @@ -2643,50 +2702,9 @@ expansion happened." (defun make-numeric-type (&key class format (complexp :real) low high enumerable) (declare (type (member integer rational float nil) class)) - (macrolet ((unionize (types classes formats) - `(let (types) - (loop for thing in ',types - for class in ',classes - for format in ',formats - do - (let ((low (coerce-numeric-bound low thing)) - (high (coerce-numeric-bound high thing))) - (push (make-numeric-type - :format format - :class class - :complexp complexp - :low low - :high high - :enumerable enumerable) - types))) - (apply #'type-union types)))) - (when (and (null class) (member complexp '(:real :complex))) - (return-from make-numeric-type - (if (bounds-unbounded-p low high) - (if (eq complexp :complex) - (specifier-type 'complex) - (specifier-type 'real)) - (unionize (rational single-float double-float) - (rational float float) - (nil single-float double-float))))) - (when (and (eql class 'float) (member complexp '(:complex :real)) (eql format nil)) - (return-from make-numeric-type - (if (bounds-unbounded-p low high) - (if (eq complexp :complex) - (specifier-type '(complex float)) - (specifier-type 'float)) - (unionize (single-float double-float #+long-float (error "long-float")) - (float float) - (single-float double-float))))) - (when (and (null complexp) - (or class format low high)) - (return-from make-numeric-type - (type-union (make-numeric-type :class class :format format - :low low :high high :enumerable enumerable - :complexp :complex) - (make-numeric-type :class class :format format - :low low :high high :enumerable enumerable - :complexp :real))))) + (let ((union-type (%make-union-numeric-type + class format complexp low high enumerable))) + (when union-type (return-from make-numeric-type union-type))) (multiple-value-bind (low high) (case class (integer @@ -2710,12 +2728,12 @@ expansion happened." (or (case class (float (macrolet ((float-type (fmt complexp - &aux (spec (if (eq complexp :complex) - `(complex ,fmt) fmt))) + &aux (spec (if (eq complexp :complex) + `(complex ,fmt) fmt))) `(literal-ctype (interned-numeric-type ',spec :class 'float :complexp ,complexp :format ',fmt :enumerable nil) - ,spec))) + ,spec))) (when (bounds-unbounded-p low high) (ecase format (single-float @@ -2729,10 +2747,10 @@ expansion happened." (integer (macrolet ((int-type (low high) `(literal-ctype - (interned-numeric-type nil - :class 'integer :low ,low :high ,high - :enumerable (if (and ,low ,high) t nil)) - (integer ,(or low '*) ,(or high '*))))) + (interned-numeric-type nil + :class 'integer :low ,low :high ,high + :enumerable (if (and ,low ,high) t nil)) + (integer ,(or low '*) ,(or high '*))))) (cond ((neq complexp :real) nil) ((and (eql low 0) (eql high (1- array-dimension-limit))) (int-type 0 #.(1- array-dimension-limit))) ; INDEX type diff --git a/tests/type.pure.lisp b/tests/type.pure.lisp index 28e3a39dc7..10051e54ee 100644 --- a/tests/type.pure.lisp +++ b/tests/type.pure.lisp @@ -670,10 +670,42 @@ (assert (eq (sb-int:info :type :kind s) :primitive)) (assert (eq (sb-int:info :type :kind s) :instance))))))) -(with-test (:name :make-numeric-type) +(with-test (:name (make-numeric-type :smoke)) (assert (eq (make-numeric-type :class 'integer :low '(4) :high '(5)) *empty-type*))) +(with-test (:name (make-numeric-type :union)) + (assert (equal (type-specifier (make-numeric-type :low '(-79106810381456307))) + `(or (rational (-79106810381456307)) + (single-float (-7.910681e16)) + (double-float (-7.91068103814563d16)))))) + +(with-test (:name (make-numeric-type :infinities)) + ;; Without class + (assert (equal (type-specifier + (make-numeric-type :low sb-ext:single-float-negative-infinity + :high sb-ext:single-float-negative-infinity)) + `(or (single-float ,sb-ext:single-float-negative-infinity + ,sb-ext:single-float-negative-infinity) + (double-float ,sb-ext:double-float-negative-infinity + ,sb-ext:double-float-negative-infinity)))) + (assert (equal (type-specifier + (make-numeric-type :low sb-ext:single-float-negative-infinity)) + 'real)) + ;; With FLOAT class + (assert (equal (type-specifier + (make-numeric-type :class 'float + :low sb-ext:single-float-negative-infinity + :high sb-ext:single-float-negative-infinity)) + `(or (single-float ,sb-ext:single-float-negative-infinity + ,sb-ext:single-float-negative-infinity) + (double-float ,sb-ext:double-float-negative-infinity + ,sb-ext:double-float-negative-infinity)))) + (assert (equal (type-specifier + (make-numeric-type :class 'float + :low sb-ext:single-float-negative-infinity)) + `float))) + (with-test (:name :prettier-union-types :skipped-on (not :sb-unicode)) ;; (OR STRING BIGNUM) used to unparse as ;; (OR (VECTOR CHARACTER) BASE-STRING (INTEGER * -4611686018427387905) @@ -734,16 +766,10 @@ (assert (eq (type-of (eval '(sb-kernel:%make-instance 12))) 'sb-kernel:instance))) -(with-test (:name :make-numeric-type-union) - (assert (equal (sb-kernel:type-specifier - (sb-kernel:make-numeric-type :low '(-79106810381456307))) - '(or (double-float (-7.91068103814563d16)) (single-float (-7.910681e16)) - (rational (-79106810381456307)))))) - (with-test (:name (:cons-union :lp1912863)) (let ((c (cons 2 4))) (assert (not (typep c '(or (cons (integer 0 8) (integer 5 15)) - (cons (integer 3 15) (integer 4 14)))))))) + (cons (integer 3 15) (integer 4 14)))))))) (with-test (:name (:rational-union :equivalent-to-t)) (let ((type '(or (integer * -1) (rational -1/2 1/2) (integer 1) (not integer)))) From f00b861d697ab750efd9d727429dc734cb45de1e Mon Sep 17 00:00:00 2001 From: Jan Moringen <jmoringe@techfak.uni-bielefeld.de> Date: Fri, 15 Apr 2022 14:00:13 +0200 Subject: [PATCH 3127/4023] Handle intersection involving singleton infinity numeric types better This change allows compiling (lambda (stream unsigned-p) (let ((number (readnum-helper stream unsigned-p))) (cond ((null number) nil) ((sb-ext:float-nan-p number) :nan) ((= number sb-ext:double-float-positive-infinity) number) ((= number sb-ext:double-float-negative-infinity) :-inf) (t :number)))) at all as well as inferring the return type (or (single-float +inf +inf) (double-float +inf +inf) (member nil :nan :inf :number)) The reason for the single float positive infinity in the return type is that (= sb-ext:single-float-positive-infinity sb-ext:double-float-positive-infinity) => t while (eql sb-ext:single-float-positive-infinity sb-ext:double-float-positive-infinity) => nil --- src/code/type.lisp | 36 ++++++++++++++---------- tests/constraint.pure.lisp | 56 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/src/code/type.lisp b/src/code/type.lisp index 58ea25fe77..86a1126278 100644 --- a/src/code/type.lisp +++ b/src/code/type.lisp @@ -3381,27 +3381,33 @@ used for a COMPLEX component.~:@>" ((nil) class2) ((integer float) class1) (rational (if (eq class2 'integer) - 'integer - 'rational)))) + 'integer + 'rational)))) (format (or (numeric-type-format type1) - (numeric-type-format type2)))) + (numeric-type-format type2))) + (low1 (numeric-type-low type1)) + (high1 (numeric-type-high type1)) + (infinity1 (and (floatp low1) (float-infinity-p low1) (eql low1 high1))) + (low2 (numeric-type-low type2)) + (high2 (numeric-type-high type2)) + (infinity2 (and (floatp low2) (float-infinity-p low2) (eql low2 high2)))) (make-numeric-type :class class :format format :complexp (or (numeric-type-complexp type1) (numeric-type-complexp type2)) - :low (numeric-bound-max - (round-numeric-bound (numeric-type-low type1) - class format t) - (round-numeric-bound (numeric-type-low type2) - class format t) - > >= nil) - :high (numeric-bound-max - (round-numeric-bound (numeric-type-high type1) - class format nil) - (round-numeric-bound (numeric-type-high type2) - class format nil) - < <= nil))) + :low (cond (infinity1 low1) + (infinity2 low2) + (t (numeric-bound-max + (round-numeric-bound low1 class format t) + (round-numeric-bound low2 class format t) + > >= nil))) + :high (cond (infinity1 high1) + (infinity2 high2) + (t (numeric-bound-max + (round-numeric-bound high1 class format nil) + (round-numeric-bound high2 class format nil) + < <= nil))))) *empty-type*)) ;;; Given two float formats, return the one with more precision. If diff --git a/tests/constraint.pure.lisp b/tests/constraint.pure.lisp index 6da240dc5f..91a9b925f5 100644 --- a/tests/constraint.pure.lisp +++ b/tests/constraint.pure.lisp @@ -305,3 +305,59 @@ (t (error "")))) x)))) '(values (not integer) &optional)))) + +(with-test (:name (:type-constraint-joining :infinities 1)) + (assert + (ctype= (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (number) + (declare (type (or number null) number)) + (cond ((null number) nil) + ((sb-ext:float-nan-p number) :nan) + ((= number sb-ext:double-float-positive-infinity) :inf) + ((= number sb-ext:double-float-negative-infinity) :-inf) + (number)))))) + '(values (or (member nil :nan :inf :-inf) float) &optional)))) + +(with-test (:name (:type-constraint-joining :infinities 2)) + (assert + (ctype= (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (number) + (declare (type (or number null) number)) + (cond ((null number) nil) + ((sb-ext:float-nan-p number) :nan) + ((= number sb-ext:double-float-positive-infinity) number) + ((= number sb-ext:double-float-negative-infinity) number) + (t :number)))))) + `(values (or (single-float ,sb-ext:single-float-negative-infinity + ,sb-ext:single-float-negative-infinity) + (double-float ,sb-ext:double-float-negative-infinity + ,sb-ext:double-float-negative-infinity) + (single-float ,sb-ext:single-float-positive-infinity + ,sb-ext:single-float-positive-infinity) + (double-float ,sb-ext:double-float-positive-infinity + ,sb-ext:double-float-positive-infinity) + (member nil :nan :number)) + &optional)))) + +(with-test (:name (:type-constraint-joining :infinities 3)) + (assert + (ctype= (caddr + (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (number) + (declare (type (or number null) number)) + (cond ((null number) nil) + ((sb-ext:float-nan-p number) :nan) + ((eql number sb-ext:double-float-positive-infinity) number) + ((eql number sb-ext:double-float-negative-infinity) number) + (t :number)))))) + `(values (or (double-float ,sb-ext:double-float-negative-infinity + ,sb-ext:double-float-negative-infinity) + (double-float ,sb-ext:double-float-positive-infinity + ,sb-ext:double-float-positive-infinity) + (member nil :nan :number)) + &optional)))) From 36b30647ac20c51c1404285c5ffea33d758fea31 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 16 Apr 2022 14:46:59 -0400 Subject: [PATCH 3128/4023] Convert some defstruct-description slots into flags And add a flag bit for variable-length --- src/code/brothertree.lisp | 8 +++++--- src/code/class.lisp | 5 ++++- src/code/defstruct.lisp | 31 +++++++++++++++++++++--------- src/code/early-classoid.lisp | 29 ++++++++++------------------ src/code/redblack.lisp | 6 ++++++ src/cold/exports.lisp | 3 ++- src/compiler/generic/vm-tran.lisp | 32 ++++++++++++++++--------------- src/compiler/info-vector.lisp | 5 +++++ 8 files changed, 71 insertions(+), 48 deletions(-) diff --git a/src/code/brothertree.lisp b/src/code/brothertree.lisp index 85d01196ee..0aa90d0037 100644 --- a/src/code/brothertree.lisp +++ b/src/code/brothertree.lisp @@ -32,9 +32,6 @@ ;; unary should not have unary child but it seems like the deletion algorithm ;; temporarily does that and then eliminates it. (child nil :type t)) -;; Can't freeze BINARY-NODE because freezing implies constant %INSTANCE-LENGTH, -;; but we use variable-length instances. -(declaim (freeze-type unary-node)) ;;; L2 is a temporary node that gets eliminated by the insertion algorithm. ;;; My guess is that the "2" is supposed to be reminiscent of "binary", ;;; but it's a leaf, a/k/a "external node". @@ -45,6 +42,11 @@ (:constructor N3 (left key1 middle key2 right))) left key1 middle key2 right) +(declaim (freeze-type unary-node binary-node ternary-node)) +(eval-when (:compile-toplevel :load-toplevel :execute) + (let ((dd (sb-kernel:find-defstruct-description 'binary-node))) + (setf (sb-kernel:dd-flags dd) (logior (sb-kernel:dd-flags dd) sb-kernel:+dd-varylen+)))) + ;;; Roughly half the binary nodes in a tree are at the fringe, so the left and right ;;; children are both NIL. We have to use binary nodes because only binary nodes ;;; have a key, but a degenerate representation saves a nice amount of space diff --git a/src/code/class.lisp b/src/code/class.lisp index e9855a0496..fe389a8190 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -1222,7 +1222,10 @@ between the ~A definition and the ~A definition" :predicate slot-object-p :hierarchical-p nil :state :read-only - :prototype-form (make-defstruct-description t 'arbitrary)) + ;; Why is this its prototype-form? It sure looks like SLOT-OBJECT's + ;; metaobject has a valid prototype object that is the canonical + ;; CLOS object (the usual 2-word thing of layout + slot vector) + :prototype-form (make-defstruct-description 'arbitrary 0)) ;; KLUDGE: the length must match the subsequent defstruct. (pathname :depth 1 diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 7e62ece589..3d3d2f8674 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -83,6 +83,12 @@ ;;; Does DD describe a structure with a class? (defun dd-class-p (dd) (if (member (dd-type dd) '(structure funcallable-structure)) t nil)) +(defmacro dd-named (dd) `(logtest (dd-flags ,dd) +dd-named+)) +(defmacro dd-pure (dd) `(logtest (dd-flags ,dd) +dd-pure+)) +(defmacro dd-null-lexenv-p (dd) `(logtest (dd-flags ,dd) +dd-nullenv+)) +(defun dd-print-option (dd) + (cond ((logtest (dd-flags dd) +dd-printfun+) :print-function) + ((logtest (dd-flags dd) +dd-printobj+) :print-object))) (defun dd-layout-or-lose (dd) (compiler-layout-or-lose (dd-name dd))) @@ -272,7 +278,9 @@ ;; Rather than hit MAKE-DEFSTRUCT-DESCRIPTION's type-check ;; on the NAME slot, we can be a little more clear. (error "DEFSTRUCT: ~S is not a symbol." name))) - (dd (make-defstruct-description null-env-p name)) + (flagbits (logior #+sb-xc-host (if (member name '(wrapper layout)) +dd-varylen+ 0) + (if null-env-p +dd-nullenv+ 0))) + (dd (make-defstruct-description name flagbits)) (*dsd-source-form* nil) ((inherits comparators) (parse-defstruct dd options slot-descriptions)) (constructor-definitions @@ -297,7 +305,7 @@ ((not (symbolp fname)) ;; Don't dump the source form into the DD constant; ;; just indicate that there was an expression there. - (setf (dd-printer-fname dd) t))) + (setf (dd-printer-fname dd) 'lambda))) `((defmethod print-object ((,x ,name) ,s) (funcall #',fname ,x ,s ,@(if depthp `(*current-level-in-print*))))))))) @@ -611,7 +619,9 @@ requires exactly~;accepts at most~] one argument" keyword syntax-group) (when (dd-print-option dd) (error "~S and ~S may not both be specified" (dd-print-option dd) keyword)) - (setf (dd-print-option dd) keyword (dd-printer-fname dd) arg)) + (setf (dd-flags dd) (logior (if (eq keyword :print-object) +dd-printobj+ +dd-printfun+) + (dd-flags dd)) + (dd-printer-fname dd) arg)) (:type (cond ((member arg '(list vector)) (setf (dd-type dd) arg (dd-%element-type dd) t)) @@ -635,7 +645,8 @@ requires exactly~;accepts at most~] one argument" keyword syntax-group) (:initial-offset (setf (dd-offset dd) arg)) ; FIXME: disallow (:INITIAL-OFFSET NIL) (:pure - (setf (dd-pure dd) arg)) + (setf (dd-flags dd) (logior (logandc2 (dd-flags dd) +dd-pure+) + (if arg +dd-pure+ 0)))) (t (error "unknown DEFSTRUCT option:~% ~S" option))) seen-options)) @@ -647,7 +658,8 @@ requires exactly~;accepts at most~] one argument" keyword syntax-group) (declare (type (unsigned-byte #.(length +dd-option-names+)) seen-options)) (dolist (option options) (if (eq option :named) - (setf named-p t (dd-named dd) t) + (setf named-p t + (dd-flags dd) (logior (dd-flags dd) +dd-named+)) (setq seen-options (parse-1-dd-option (cond ((consp option) option) @@ -1042,8 +1054,9 @@ unless :NAMED is also specified."))) ;; FIXME: This POSITION call should be foldable without read-time eval ;; since literals are immutable, and +DD-OPTION-NAMES+ was initialized ;; from a literal. - (unless (logbitp #.(position :pure +dd-option-names+) option-bits) - (setf (dd-pure dd) (dd-pure included-structure)))) + (when (and (dd-pure included-structure) + (not (logbitp #.(position :pure +dd-option-names+) option-bits))) + (setf (dd-flags dd) (logior (dd-flags dd) +dd-pure+)))) (setf (dd-inherited-accessor-alist dd) (dd-inherited-accessor-alist included-structure)) @@ -2092,7 +2105,7 @@ or they must be declared locally notinline at each call site.~@:>" (dd-type (missing-arg)) metaclass-constructor slot-names) - (let* ((dd (make-defstruct-description t class-name)) + (let* ((dd (make-defstruct-description class-name +dd-nullenv+)) (conc-name (string (gensymify* class-name "-"))) (slot-index 0)) ;; We do *not* fill in the COPIER-NAME and PREDICATE-NAME @@ -2186,7 +2199,7 @@ or they must be declared locally notinline at each call site.~@:>" ;;; special enough (and simple enough) that we just build it by hand ;;; instead of trying to generalize the ordinary DEFSTRUCT code. (defun !set-up-structure-object-class () - (let ((dd (make-defstruct-description t 'structure-object))) + (let ((dd (make-defstruct-description 'structure-object +dd-nullenv+))) (setf (dd-length dd) sb-vm:instance-data-start) (%compiler-set-up-layout dd (vector (find-layout 't))))) #+sb-xc-host(!set-up-structure-object-class) diff --git a/src/code/early-classoid.lisp b/src/code/early-classoid.lisp index ffa44b4477..4f0c0c4bb1 100644 --- a/src/code/early-classoid.lisp +++ b/src/code/early-classoid.lisp @@ -15,6 +15,13 @@ ;;;; DEFSTRUCT-DESCRIPTION +(defconstant +dd-named+ #b000001) ; :NAMED was specified +(defconstant +dd-printfun+ #b000010) ; :PRINT-FUNCTION was specified +(defconstant +dd-printobj+ #b000100) ; :PRINT-OBJECT was specified +(defconstant +dd-pure+ #b001000) ; :PURE T was specified +(defconstant +dd-varylen+ #b010000) +(defconstant +dd-nullenv+ #b100000) + ;;; The DEFSTRUCT-DESCRIPTION structure holds compile-time information ;;; about a structure type. ;;; It is defined prior to WRAPPER because WRAPPER-INFO @@ -23,9 +30,10 @@ (:conc-name dd-) (:copier nil) (:pure t) - (:constructor make-defstruct-description (null-lexenv-p name))) + (:constructor make-defstruct-description (name flags))) ;; name of the structure (name (missing-arg) :type symbol :read-only t) + (flags 0 :type fixnum) ; see the constants above ;; documentation on the structure (doc nil :type (or string null)) ;; prefix for slot names. If NIL, none. @@ -33,8 +41,6 @@ ;; All the :CONSTRUCTOR specs and posssibly an implied constructor, ;; keyword constructors first, then BOA constructors. NIL if none. (constructors () :type list) - ;; True if the DEFSTRUCT appeared in a null lexical environment. - (null-lexenv-p nil :type boolean :read-only t) ; the safe default is NIL ;; name of copying function (copier-name nil :type symbol) ;; name of type predicate @@ -71,27 +77,12 @@ ;; If a vector, the vector element type. ;; If a list, not used. (%element-type t) - ;; The next two slots are for :TYPE'd structures (which aren't - ;; classes, DD-CLASS-P = NIL) - ;; - ;; T if :NAMED was explicitly specified, NIL otherwise - (named nil :type boolean) ;; any INITIAL-OFFSET option on this direct type (offset nil :type (or index null)) - ;; which :PRINT-mumble option was given, if either was. - (print-option nil :type (member nil :print-function :print-object)) ;; the argument to the PRINT-FUNCTION or PRINT-OBJECT option. ;; NIL if the option was given with no argument. - (printer-fname nil :type (or cons symbol)) - - ;; the value of the :PURE option, used by cheneygc when purifying. - ;; This is true if objects of this class are never modified to - ;; contain dynamic pointers in their slots or constant-like - ;; substructure (and hence can be copied into read-only space by - ;; PURIFY). - ;; This is only meaningful if DD-CLASS-P = T. - (pure nil :type (member t nil))) + (printer-fname nil :type (or cons symbol))) (declaim (freeze-type defstruct-description)) (!set-load-form-method defstruct-description (:host :xc :target)) diff --git a/src/code/redblack.lisp b/src/code/redblack.lisp index 71cc6af4db..ac38e7e264 100644 --- a/src/code/redblack.lisp +++ b/src/code/redblack.lisp @@ -286,3 +286,9 @@ (defun node-value (node) (cdr (data node))) (sb-rbtree::define-search-methods < (= <= >=)) (export '(find= find>= find<=)) + +(eval-when (:compile-toplevel) + (do-all-symbols (s) + (let ((dd (sb-kernel:find-defstruct-description s nil))) + (when (and dd (not (sb-kernel::dd-null-lexenv-p dd))) + (format t "~&Jeez ~s~%" (sb-kernel:dd-name dd)))))) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 1952bf395c..42a8a97e9d 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2463,7 +2463,8 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "DEFSTRUCT-DESCRIPTION" "UNDECLARE-STRUCTURE" "UNDEFINE-FUN-NAME" "DD-TYPE" "CLASSOID-STATE" "INSTANCE" "*TYPE-SYSTEM-INITIALIZED*" "FIND-LAYOUT" - "%TYPEP" "%%TYPEP" "DD-NAME" "CLASSOID-SUBCLASSES" + "%TYPEP" "%%TYPEP" "DD-FLAGS" "DD-NAME" "CLASSOID-SUBCLASSES" + "+DD-VARYLEN+" "CLASSOID-LAYOUT" "CLASSOID-NAME" "CLASSOID-P" "CLASSOID-WRAPPER" "NOTE-NAME-DEFINED" "%CODE-CODE-SIZE" "%CODE-TEXT-SIZE" diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index 4980bb992d..656ae25c00 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -124,23 +124,25 @@ (cond ((not dd) ; it's going to be some subtype of NAME ;; pessimistically assume MIXED rather than choosing at runtime `(%copy-instance (%make-instance/mixed (%instance-length instance)) instance)) - ((<= (dd-length dd) max-inlined-words) - `(let ((copy (%make-structure-instance ,dd nil))) - ;; ASSUMPTION: either %INSTANCE-REF is the correct accessor for this word, - ;; or the GC will treat random bit patterns as conservative pointers - ;; (i.e. not alter them if %INSTANCE-REF is not the correct accessor) - ,@(loop for i from sb-vm:instance-data-start below (dd-length dd) - collect `(%instance-set copy ,i (%instance-ref instance ,i))) - copy)) - (t - `(%copy-instance-slots (%make-structure-instance ,dd nil) instance))))) + ((not (logtest (dd-flags dd) +dd-varylen+)) ; fixed length + ;; ASSUMPTION: either %INSTANCE-REF is the correct accessor for this word, + ;; or the GC will treat random bit patterns as conservative pointers + ;; (i.e. not alter them if %INSTANCE-REF is not the correct accessor) + (if (> (dd-length dd) max-inlined-words) + `(%copy-instance-slots (%make-structure-instance ,dd nil) instance) + `(let ((copy (%make-structure-instance ,dd nil))) + ,@(loop for i from sb-vm:instance-data-start below (dd-length dd) + collect `(%instance-set copy ,i (%instance-ref instance ,i))) + copy))) + (t ; variable-length + `(let ((copy (,(if (dd-has-raw-slot-p dd) '%make-instance/mixed '%make-instance) + (%instance-length instance)))) + (%set-instance-layout copy (%instance-layout instance)) + (%copy-instance-slots copy instance)))))) (defun varying-length-struct-p (classoid) - ;; This is a nice feature to have in general, but at present it is only possible - ;; to make varying length instances of SB-VM:LAYOUT (or WRAPPER if that is the same type), - ;; and nothing else. - (eq classoid (load-time-value (find-classoid #+metaspace 'sb-vm:layout - #-metaspace 'wrapper)))) + (let ((dd (find-defstruct-description (classoid-name classoid)))) + (logtest (dd-flags dd) +dd-varylen+))) (deftransform %instance-length ((instance)) (let ((classoid (lvar-type instance))) diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index 79153b8ea8..3c272602a6 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -94,6 +94,11 @@ ;;; but freezing would make it constant henceforth. (sb-xc:defstruct (packed-info (:predicate nil) (:constructor nil)) cells) +(declaim (freeze-type packed-info)) +#-sb-xc-host +(eval-when (:compile-toplevel :load-toplevel :execute) + (let ((dd (find-defstruct-description 'packed-info))) + (setf (dd-flags dd) (logior (dd-flags dd) +dd-varylen+)))) (eval-when (#-sb-xc-host :compile-toplevel) (sb-xc:defmacro make-packed-info (n) `(%new-instance ,(find-layout 'packed-info) (+ ,n ,sb-vm:instance-data-start)))) From 4061ee6e2b3d88c156e2ce2aff61fedf8ffc024a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 16 Apr 2022 16:12:49 -0400 Subject: [PATCH 3129/4023] Remove useless indirection functions --- src/pcl/braid.lisp | 36 ++++++++++++++++++++++++++++-------- src/pcl/low.lisp | 30 +----------------------------- 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/src/pcl/braid.lisp b/src/pcl/braid.lisp index 48326d0628..9506453aa6 100644 --- a/src/pcl/braid.lisp +++ b/src/pcl/braid.lisp @@ -132,14 +132,14 @@ :direct-superclasses supers :direct-slots slots))) (slot-initargs-from-structure-slotd (slotd) - (let ((accessor (structure-slotd-accessor-symbol slotd))) - `(:name ,(structure-slotd-name slotd) + (let ((accessor (dsd-accessor-name slotd))) + `(:name ,(dsd-name slotd) :defstruct-accessor-symbol ,accessor :internal-reader-function ,(structure-slotd-reader-function slotd) :internal-writer-function ,(structure-slotd-writer-function name slotd) - :type ,(or (structure-slotd-type slotd) t) - :initform ,(structure-slotd-init-form slotd) - :initfunction ,(eval-form (structure-slotd-init-form slotd))))) + :type ,(dsd-type slotd) + :initform ,(dsd-default slotd) + :initfunction ,(eval-form (dsd-default slotd))))) (slot-initargs-from-condition-slot (slot) `(:name ,(condition-slot-name slot) :initargs ,(condition-slot-initargs slot) @@ -152,9 +152,29 @@ :allocation ,(condition-slot-allocation slot) :documentation ,(condition-slot-documentation slot)))) (cond ((structure-type-p name) - (ensure 'structure-class - (mapcar #'slot-initargs-from-structure-slotd - (structure-type-slot-description-list name)))) + ;; This seems like a somewhat unclear way to do what it's doing, which is + ;; collect slots of TYPE that are not in its direct ancestor, *or* + ;; which have an altered definition relative to the inherited one. + (flet ((structure-type-slot-description-list (type) + (let* ((dd (find-defstruct-description type)) + (include (dd-include dd)) + (all-slots (dd-slots dd))) + (multiple-value-bind (super slot-overrides) + (if (consp include) + (values (car include) (mapcar #'car (cdr include))) + (values include nil)) + (let ((included-slots + (when super + (dd-slots (find-defstruct-description super))))) + (loop for slot = (pop all-slots) + for included-slot = (pop included-slots) + while slot + when (or (not included-slot) + (member (dsd-name included-slot) slot-overrides :test #'eq)) + collect slot)))))) + (ensure 'structure-class + (mapcar #'slot-initargs-from-structure-slotd + (structure-type-slot-description-list name))))) ((condition-type-p name) (ensure 'condition-class (mapcar #'slot-initargs-from-condition-slot diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 1299cccb62..307ba35f6d 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -227,23 +227,7 @@ ;;;; abstraction around our native structure representation doesn't ;;;; seem to add anything useful, and could probably go away. -(defun structure-type-slot-description-list (type) - (let* ((dd (find-defstruct-description type)) - (include (dd-include dd)) - (all-slots (dd-slots dd))) - (multiple-value-bind (super slot-overrides) - (if (consp include) - (values (car include) (mapcar #'car (cdr include))) - (values include nil)) - (let ((included-slots - (when super - (dd-slots (find-defstruct-description super))))) - (loop for slot = (pop all-slots) - for included-slot = (pop included-slots) - while slot - when (or (not included-slot) - (member (dsd-name included-slot) slot-overrides :test #'eq)) - collect slot))))) + (defun uninitialized-accessor-function (type slotd) (lambda (&rest args) @@ -251,12 +235,6 @@ (error "~:(~A~) function~@[ for ~S ~] not yet initialized." type slotd))) -(defun structure-slotd-name (slotd) - (dsd-name slotd)) - -(defun structure-slotd-accessor-symbol (slotd) - (dsd-accessor-name slotd)) - (defun structure-slotd-reader-function (slotd) (let ((name (dsd-accessor-name slotd))) (if (fboundp name) @@ -304,12 +282,6 @@ (fdefinition name) (uninitialized-accessor-function :writer slotd))))) -(defun structure-slotd-type (slotd) - (dsd-type slotd)) - -(defun structure-slotd-init-form (slotd) - (dsd-default slotd)) - (defun pcl-compile (expr &optional unsafe-policy) (let* ((base-policy sb-c::*policy*) (lexenv From 33c742ae4d1f1fdc31c6f52095ada4cc58adf7ca Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 11 Apr 2022 15:09:14 -0700 Subject: [PATCH 3130/4023] Fix typo. These things are no longer keywords. --- src/compiler/ir1tran-lambda.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 2003a083ae..b752c55174 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -1327,7 +1327,7 @@ (note-inlining (optional-dispatch-more-entry fun)) (mapc #'note-inlining (optional-dispatch-entry-points fun)))) ;; substitute for any old references - (unless (or (eq (defined-fun-inlinep var) :notinline) + (unless (or (eq (defined-fun-inlinep var) 'notinline) (not (block-compile *compilation*)) (and info (or (fun-info-transforms info) From 1749ac2fc104cc40f7083a51bd8123fa15dc43cc Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sun, 17 Apr 2022 01:36:46 -0700 Subject: [PATCH 3131/4023] riscv: Treat SAPs as immediates on 32 bit. Since 32 bit pointers are easily materialized on riscv. (Not so much for 64-bit.) And remove a redundant typecase in the corresponding mips code. --- src/compiler/mips/vm.lisp | 3 +-- src/compiler/riscv/vm.lisp | 12 ++++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/compiler/mips/vm.lisp b/src/compiler/mips/vm.lisp index 564b45476c..5f41b5c461 100644 --- a/src/compiler/mips/vm.lisp +++ b/src/compiler/mips/vm.lisp @@ -293,8 +293,7 @@ (if (static-symbol-p value) immediate-sc-number nil)) - ((or (integer #.most-negative-fixnum #.most-positive-fixnum) - character) + ((integer #.most-negative-fixnum #.most-positive-fixnum) immediate-sc-number) #-sb-xc-host ; There is no such object type in the host (system-area-pointer diff --git a/src/compiler/riscv/vm.lisp b/src/compiler/riscv/vm.lisp index 82dfa7e572..19b37164b7 100644 --- a/src/compiler/riscv/vm.lisp +++ b/src/compiler/riscv/vm.lisp @@ -229,13 +229,17 @@ zero-sc-number) (null (values descriptor-reg-sc-number null-offset)) - ((or (integer #.most-negative-fixnum #.most-positive-fixnum) - character) - immediate-sc-number) (symbol (if (static-symbol-p value) immediate-sc-number - nil)))) + nil)) + ((integer #.most-negative-fixnum #.most-positive-fixnum) + immediate-sc-number) + #-(or sb-xc-host 64-bit) ; There is no such object type in the host + (system-area-pointer + immediate-sc-number) + (character + immediate-sc-number))) (defun boxed-immediate-sc-p (sc) (or (eql sc zero-sc-number) From 9f5b87840f8dfa3e57633ece731c9564eed0db57 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 17 Apr 2022 09:04:25 -0400 Subject: [PATCH 3132/4023] Undo accidental 'git add' --- src/code/redblack.lisp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/code/redblack.lisp b/src/code/redblack.lisp index ac38e7e264..71cc6af4db 100644 --- a/src/code/redblack.lisp +++ b/src/code/redblack.lisp @@ -286,9 +286,3 @@ (defun node-value (node) (cdr (data node))) (sb-rbtree::define-search-methods < (= <= >=)) (export '(find= find>= find<=)) - -(eval-when (:compile-toplevel) - (do-all-symbols (s) - (let ((dd (sb-kernel:find-defstruct-description s nil))) - (when (and dd (not (sb-kernel::dd-null-lexenv-p dd))) - (format t "~&Jeez ~s~%" (sb-kernel:dd-name dd)))))) From 0f1fb5049a0aa738913641e643c6bcab2b3dd0d3 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sun, 17 Apr 2022 11:27:16 -0700 Subject: [PATCH 3133/4023] riscv: Fix potential source of GC unsafety. Instead of trying to materialize immediate values greater than 32 bits, which is hard to do GC-safely on riscv64, don't treat >32 bit immediate values as immediates at all. Rather, always treat them as boxed constants. If we ever fix up how immediates are materialized on riscv64, such that no untagged intermediates could possibly be loaded into descriptor-regs, then we can go back to loading in immediates for all fixnum values. This also corrects a misunderstanding on what immediate-constant-sc is supposed to do, as tested for in vm.before-xc.lisp. It's actually entirely backend/implementation dependent for what we treat as an immediate. It just happened that on 32-bit MIPS, encoded fixnums coincided with the conveniently materializable immediate, so the idea of fixnum = immediate got adopted to the other platforms, even when this wasn't the original design intention. And also give SAPs the same treatment. --- src/compiler/mips/vm.lisp | 2 +- src/compiler/riscv/vm.lisp | 12 ++++++++++-- tests/vm.before-xc.lisp | 10 +--------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/compiler/mips/vm.lisp b/src/compiler/mips/vm.lisp index 5f41b5c461..09920a1607 100644 --- a/src/compiler/mips/vm.lisp +++ b/src/compiler/mips/vm.lisp @@ -293,7 +293,7 @@ (if (static-symbol-p value) immediate-sc-number nil)) - ((integer #.most-negative-fixnum #.most-positive-fixnum) + ((signed-byte 30) immediate-sc-number) #-sb-xc-host ; There is no such object type in the host (system-area-pointer diff --git a/src/compiler/riscv/vm.lisp b/src/compiler/riscv/vm.lisp index 19b37164b7..aa8f9e15a9 100644 --- a/src/compiler/riscv/vm.lisp +++ b/src/compiler/riscv/vm.lisp @@ -234,8 +234,16 @@ immediate-sc-number nil)) ((integer #.most-negative-fixnum #.most-positive-fixnum) - immediate-sc-number) - #-(or sb-xc-host 64-bit) ; There is no such object type in the host + ;; KLUDGE: This is a subset on 64-bit because we currently + ;; produce untagged intermediates in %LI. + (typecase (fixnumize value) + #-64-bit + ((signed-byte 32) + immediate-sc-number) + #+64-bit + ((integer #x-80000800 #x7ffff7ff) + immediate-sc-number))) + #-sb-xc-host ; There is no such object type in the host (system-area-pointer immediate-sc-number) (character diff --git a/tests/vm.before-xc.lisp b/tests/vm.before-xc.lisp index 1a903da37c..79bc1f8758 100644 --- a/tests/vm.before-xc.lisp +++ b/tests/vm.before-xc.lisp @@ -16,17 +16,9 @@ (/show "beginning tests/vm.before-xc.lisp") -(flet ((yes (x) - (assert - (eql immediate-sc-number - (immediate-constant-sc x)))) - (no (x) +(flet ((no (x) (assert (not (immediate-constant-sc x))))) - ;; target fixnums can be dealt with as immediates; target bignums - ;; can not. - (yes #.most-positive-fixnum) - (yes #.most-negative-fixnum) (no #.(1+ most-positive-fixnum)) (no #.(1- most-negative-fixnum))) From 4a6c552cabc9701b9d3bb5020b544bd9a6512163 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sun, 17 Apr 2022 13:32:08 -0700 Subject: [PATCH 3134/4023] Update tests to reflect better representation selection. Our representation selection has been improved enough for a while now (maybe since e6c2b1771c77b5d771ff562f794c1f7393867218, or earlier), such that we don't indiscriminately just store all double-floats in an unboxed format. Update some tests to reflect that. --- tests/compiler.impure.lisp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index b78a5f7ee0..3857c1dbe7 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -2256,22 +2256,20 @@ ;;; check that non-trivial constants are EQ across different files: this is ;;; not something ANSI either guarantees or requires, but we want to do it ;;; anyways. -(when (find-symbol "SORT-INLINE-CONSTANTS" "SB-VM") - (push :inline-constants *features*)) -(defconstant +share-me-1+ #-inline-constants 123.456d0 #+inline-constants nil) +(defconstant +share-me-1+ 123.456d0) (defconstant +share-me-2+ "a string to share") (defconstant +share-me-3+ (vector 1 2 3)) (defconstant +share-me-4+ (* 2 most-positive-fixnum)) -(multiple-value-bind (f1 c1) (compile2 '(lambda () (values +share-me-1+ +(multiple-value-bind (f1 c1) (compile2 `(lambda () (values +share-me-1+ +share-me-2+ +share-me-3+ +share-me-4+ - #-inline-constants pi))) - (multiple-value-bind (f2 c2) (compile2 '(lambda () (values +share-me-1+ + pi))) + (multiple-value-bind (f2 c2) (compile2 `(lambda () (values +share-me-1+ +share-me-2+ +share-me-3+ +share-me-4+ - #-inline-constants pi))) + pi))) (flet ((test (fa fb) (mapc (lambda (a b) (assert (eq a b))) From da7f3aa6414eae80e7cdff44074b1c38ba6ad584 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 00:26:38 +0300 Subject: [PATCH 3135/4023] The type-checking [un]signed+ VOPs can't be flushable. They may derive to a singleton type, avoiding type errors. --- src/compiler/fndb.lisp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index c4852da0a4..5540a718f7 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -89,7 +89,7 @@ #+(or x86 x86-64 arm arm64) (defknown fixnum-mod-p (t fixnum) boolean - (movable foldable flushable always-translatable)) + (movable flushable always-translatable)) ;;;; classes @@ -2195,23 +2195,19 @@ (defknown fixnum* (fixnum fixnum t) fixnum - (movable foldable unsafely-flushable commutative - always-translatable)) + (movable foldable always-translatable)) (defknown (signed* signed+ signed-) (sb-vm:signed-word sb-vm:signed-word t) sb-vm:signed-word - (movable foldable unsafely-flushable commutative - always-translatable)) + (movable foldable commutative always-translatable)) (defknown (unsigned* unsigned+ unsigned-) (word word t) word - (movable foldable unsafely-flushable commutative - always-translatable)) + (movable foldable commutative always-translatable)) (defknown (unsigned+signed unsigned-signed) (word sb-vm:signed-word t) word - (movable foldable unsafely-flushable commutative - always-translatable)) + (movable foldable commutative always-translatable)) From 041b53095433d37975fa31743cb9ede3377e9917 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 00:27:16 +0300 Subject: [PATCH 3136/4023] Test more combinations of arithmetic funs. --- tests/arith-combinations.pure.lisp | 119 +++++++++++++++++++++++++++++ tests/arith.pure.lisp | 62 +-------------- 2 files changed, 120 insertions(+), 61 deletions(-) create mode 100644 tests/arith-combinations.pure.lisp diff --git a/tests/arith-combinations.pure.lisp b/tests/arith-combinations.pure.lisp new file mode 100644 index 0000000000..2fb0a412d1 --- /dev/null +++ b/tests/arith-combinations.pure.lisp @@ -0,0 +1,119 @@ +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; While most of SBCL is derived from the CMU CL system, the test +;;;; files (like this one) were written from scratch after the fork +;;;; from CMU CL. +;;;; +;;;; This software is in the public domain and is provided with +;;;; absolutely no warranty. See the COPYING and CREDITS files for +;;;; more information. + +(enable-test-parallelism) + +(defun test-ops (ops types arguments &optional (result-types types)) + (flet ((normalize-type (type) + (sb-kernel:type-specifier (sb-kernel:specifier-type type)))) + (let ((types (mapcar #'normalize-type types)) + (result-types (mapcar #'normalize-type result-types)) + (cache (make-hash-table :test #'equal))) + (loop for op in ops + do + (loop for a-type in types + do + (loop for b-type in types + do + (loop for result-type in result-types + do + (loop for a in arguments + when (typep a a-type) + do + (loop for b in arguments + for result = (funcall op a b) + when (typep b b-type) + do + (loop for lambda in (list `(lambda (a b) + (declare (,a-type a) + (,b-type b)) + (the ,result-type (,op a b))) + `(lambda (a) + (declare (,a-type a)) + (the ,result-type (,op a ,b))) + `(lambda (b) + (declare (,b-type b)) + (the ,result-type (,op ,a b)))) + for args in (list (list a b) + (list a) + (list b)) + for fun = (or (gethash lambda cache) + (setf (gethash lambda cache) + (checked-compile lambda :allow-warnings t))) + do + (handler-case + (apply fun args) + (error (c) + (if (typep result result-type) + (error "~a => ~a /= ~a" (list* lambda args) c result) + (let ((x (type-error-datum c)) + (type (type-error-expected-type c))) + (cond ((not (equal type result-type)) + (error "~a => type error ~a /= ~a" (list* lambda args) + c + result-type)) + ((not (eql x result)) + (error "~a => type error ~a /= ~a" (list* lambda args) + c + x)))))) + (:no-error (x) + (unless (eql x result) + (error "~a = ~a /= ~a" (list* lambda args) x result)))))))))))))) + +(with-test (:name :overflow-arith) + (test-ops '(+ - *) + `(t fixnum (integer ,(- (expt 2 sb-vm:n-word-bits) 10) + ,(- (expt 2 sb-vm:n-word-bits) 1)) + (signed-byte ,sb-vm:n-word-bits) + (unsigned-byte ,sb-vm:n-word-bits) + (signed-byte 8) + (unsigned-byte 8)) + (list 0 1 2 3 4 -1 -2 -3 -4 + (- (expt 2 sb-vm:n-word-bits) 1) + (- (expt 2 sb-vm:n-word-bits) 5) + (- (expt 2 (1- sb-vm:n-word-bits)) 1) + (- (expt 2 (1- sb-vm:n-word-bits)) 5) + (- (expt 2 (1- sb-vm:n-word-bits))) + (- 10 (expt 2 (1- sb-vm:n-word-bits))) + (expt 2 (1- sb-vm:n-word-bits)) + most-positive-fixnum + most-negative-fixnum + (1- most-positive-fixnum) + (1+ most-negative-fixnum) + (floor most-positive-fixnum 2) + (floor most-negative-fixnum 2)))) + +(with-test (:name :fixnum-integer-cmp) + (test-ops '(> <) + `(t fixnum + integer + bignum + (integer ,(- (expt 2 sb-vm:n-word-bits) 10) + ,(- (expt 2 sb-vm:n-word-bits) 1)) + (signed-byte ,sb-vm:n-word-bits) + (unsigned-byte ,sb-vm:n-word-bits) + (signed-byte 8) + (unsigned-byte 8)) + (list 0 1 2 3 4 -1 -2 -3 -4 + (- (expt 2 sb-vm:n-word-bits) 1) + (- (expt 2 sb-vm:n-word-bits) 5) + (- (expt 2 (1- sb-vm:n-word-bits)) 1) + (- (expt 2 (1- sb-vm:n-word-bits)) 5) + (- (expt 2 (1- sb-vm:n-word-bits))) + (- 10 (expt 2 (1- sb-vm:n-word-bits))) + (expt 2 (1- sb-vm:n-word-bits)) + most-positive-fixnum + most-negative-fixnum + (1- most-positive-fixnum) + (1+ most-negative-fixnum) + (floor most-positive-fixnum 2) + (floor most-negative-fixnum 2)) + '(t))) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index 5faaeaaca5..d2f270a5df 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -495,7 +495,7 @@ ;;; MOD and REM. Test that the transform is indeed triggered and test ;;; several cases for correct results. (with-test (:name (:integer-division-using-multiplication :used) - :skipped-on (not (or :x86-64 :x86))) + :skipped-on (not (or :x86-64 :x86 :arm64))) (dolist (fun '(truncate floor ceiling mod rem)) (let* ((foo (checked-compile `(lambda (x) @@ -1032,63 +1032,3 @@ a b)) (- a b)) (((- (expt 2 sb-vm:n-word-bits) 10) (- (expt 2 sb-vm:n-word-bits) 9)) -1))) - -(with-test (:name :overflow-arith) - (flet ((normalize-type (type) - (sb-kernel:type-specifier (sb-kernel:specifier-type type)))) - (let ((ops '(+ - *)) - (types (mapcar #'normalize-type - `(t fixnum (integer ,(- (expt 2 sb-vm:n-word-bits) 10) - ,(- (expt 2 sb-vm:n-word-bits) 1)) - (signed-byte ,sb-vm:n-word-bits) - (unsigned-byte ,sb-vm:n-word-bits) - (signed-byte 8) - (unsigned-byte 8)))) - (arguments (list 0 1 2 3 4 -1 -2 -3 -4 - (- (expt 2 sb-vm:n-word-bits) 1) - (- (expt 2 sb-vm:n-word-bits) 5) - (- (expt 2 (1- sb-vm:n-word-bits)) 1) - (- (expt 2 (1- sb-vm:n-word-bits)) 5) - (- (expt 2 (1- sb-vm:n-word-bits))) - (- 10 (expt 2 (1- sb-vm:n-word-bits))) - (expt 2 (1- sb-vm:n-word-bits)) - most-positive-fixnum - most-negative-fixnum - (1- most-positive-fixnum) - (1+ most-negative-fixnum) - (floor most-positive-fixnum 2) - (floor most-negative-fixnum 2)))) - (loop for op in ops - do (loop for a-type in types - do (loop for b-type in types - do (loop for result-type in types - do - (let* ((lambda `(lambda (a b) - (declare (,a-type a) - (,b-type b)) - (the ,result-type (,op a b)))) - (fun (checked-compile lambda :allow-warnings t))) - (loop for a in arguments - when (typep a a-type) - do (loop for b in arguments - for result = (funcall op a b) - when (typep b b-type) - do - (handler-case - (funcall fun a b) - (error (c) - (if (typep result result-type) - (error "~a => ~a /= ~a" (list lambda a b) c result) - (let ((x (type-error-datum c)) - (type (type-error-expected-type c))) - (cond ((not (equal type result-type)) - (error "~a => type error ~a /= ~a" (list lambda a b) - c - result-type)) - ((not (eql x result)) - (error "~a => type error ~a /= ~a" (list lambda a b) - c - x)))))) - (:no-error (x) - (unless (= x result) - (error "~a = ~a /= ~a" (list lambda a b) x result)))))))))))))) From 227c8a99f9c8750e5245dadb49b75478b0122e5b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 00:33:36 +0300 Subject: [PATCH 3137/4023] arith-combinations.pure: ensure type errors are signaled. --- tests/arith-combinations.pure.lisp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/arith-combinations.pure.lisp b/tests/arith-combinations.pure.lisp index 2fb0a412d1..c9d6121a5d 100644 --- a/tests/arith-combinations.pure.lisp +++ b/tests/arith-combinations.pure.lisp @@ -65,8 +65,10 @@ c x)))))) (:no-error (x) - (unless (eql x result) - (error "~a = ~a /= ~a" (list* lambda args) x result)))))))))))))) + (if (typep result result-type) + (unless (eql x result) + (error "~a = ~a /= ~a" (list* lambda args) x result)) + (error "~a => ~a /= type error" (list* lambda args) x)))))))))))))) (with-test (:name :overflow-arith) (test-ops '(+ - *) From bdf77715d0f74687a459d1e23d63764928c9b5f2 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sun, 17 Apr 2022 15:13:18 -0700 Subject: [PATCH 3138/4023] Simplify emission of constant TNs. * Instead of convoluted logic for caching the TN in the leaf info depending on essentially whether the constant could be both immediate and boxed, divorce the logic for creating TNs from the caching logic. CONSTANT-TN is not used after IR2tran, and the choice of whether to box happens only after representation selection. * Make the condition for whether to created entries in the boxed constant vector clear. --- src/compiler/ir2tran.lisp | 14 ++++-- src/compiler/tn.lisp | 91 ++++++++++++++++--------------------- src/compiler/x86-64/vm.lisp | 1 + 3 files changed, 52 insertions(+), 54 deletions(-) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index df2898700f..09f1f2281d 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -65,14 +65,22 @@ (lambda-var (unless (lambda-var-indirect leaf) (find-in-environment leaf env))) - (constant (make-constant-tn leaf)) + (constant (constant-tn leaf)) (t nil))) +;;; If LEAF already has a constant TN, return that, otherwise make a +;;; TN for it. +(defun constant-tn (leaf) + (declare (type constant leaf)) + (or (leaf-info leaf) + (setf (leaf-info leaf) + (make-constant-tn leaf)))) + ;;; This is used to conveniently get a handle on a constant TN during ;;; IR2 conversion. It returns a constant TN representing the Lisp ;;; object VALUE. (defun emit-constant (value) - (make-constant-tn (find-constant value))) + (constant-tn (find-constant value))) ;;; Convert a REF node. The reference must not be delayed. (defun ir2-convert-ref (node block) @@ -99,7 +107,7 @@ (vop ancestor-frame-ref node block tn (leaf-info leaf) res)))) (t (emit-move node block tn res))))) (constant - (move-lvar-result node block (list (make-constant-tn leaf)) lvar) + (move-lvar-result node block (list (constant-tn leaf)) lvar) (return-from ir2-convert-ref)) (functional (ir2-convert-closure node block leaf res)) diff --git a/src/compiler/tn.lisp b/src/compiler/tn.lisp index 01ad8b8082..6bae7af691 100644 --- a/src/compiler/tn.lisp +++ b/src/compiler/tn.lisp @@ -221,49 +221,40 @@ ;;; EMIT-MOVES-AND-COERCIONS. That's wasteful. (defun make-constant-tn (constant &optional force-boxed) (declare (type constant constant)) - (or (leaf-info constant) - (multiple-value-bind (immed null-offset) - (immediate-constant-sc (constant-value constant)) - ;; currently NULL-OFFSET is used only on ARM64 - (if null-offset - (let ((tn (component-live-tn - (make-wired-tn (primitive-type (leaf-type constant)) - immed - null-offset - (specifier-type 'null))))) - (setf (tn-leaf tn) constant - (leaf-info constant) tn)) - (let* ((boxed (or (not immed) - (boxed-immediate-sc-p immed))) - (component (component-info *component-being-compiled*)) - ;; If a constant has either an immediate or boxed - ;; representation (e.g. double-float) postpone the SC - ;; choice until SELECT-REPRESENTATIONS. - (sc (cond (boxed - (if immed - (svref *backend-sc-numbers* immed) - (sc-or-lose 'constant))) - (force-boxed - (setf immed nil) - (sc-or-lose 'constant)))) - (res (make-tn 0 :constant (primitive-type (leaf-type constant)) sc))) - ;; Objects of type SYMBOL can be immediate but they still go in the constants - ;; because liveness depends on pointer tracing without looking at code-fixups. - (when (and sc - (or (not immed) - #+immobile-space - (let ((val (constant-value constant))) - (or (and (symbolp val) (not (sb-vm:static-symbol-p val))) - (typep val 'wrapper))))) - (let ((constants (ir2-component-constants component))) - (setf (tn-offset res) - (vector-push-extend constant constants)))) - (when sc - (setf (leaf-info constant) res)) - (push-in tn-next res (ir2-component-constant-tns component)) - (setf (tn-type res) (leaf-type constant)) - (setf (tn-leaf res) constant) - res))))) + (multiple-value-bind (immed null-offset) + (immediate-constant-sc (constant-value constant)) + ;; currently NULL-OFFSET is used only on ARM64 + (if null-offset + (let ((tn (component-live-tn + (make-wired-tn (primitive-type (leaf-type constant)) + immed + null-offset + (specifier-type 'null))))) + (setf (tn-leaf tn) constant + (leaf-info constant) tn)) + (let* ((component (component-info *component-being-compiled*)) + ;; If a constant has either an immediate or boxed + ;; representation (e.g. double-float) postpone the SC + ;; choice until SELECT-REPRESENTATIONS. + (sc (cond ((or force-boxed (not immed)) + (sc-or-lose 'constant)) + ((boxed-immediate-sc-p immed) + (svref *backend-sc-numbers* immed)))) + (res (make-tn 0 :constant (primitive-type (leaf-type constant)) sc))) + ;; Objects of type SYMBOL can be immediate but they still go in the constants + ;; because liveness depends on pointer tracing without looking at code-fixups. + (when (or (not immed) force-boxed + #+immobile-space + (let ((val (constant-value constant))) + (or (and (symbolp val) (not (sb-vm:static-symbol-p val))) + (typep val 'wrapper)))) + (let ((constants (ir2-component-constants component))) + (setf (tn-offset res) + (vector-push-extend constant constants)))) + (push-in tn-next res (ir2-component-constant-tns component)) + (setf (tn-type res) (leaf-type constant)) + (setf (tn-leaf res) constant) + res)))) ;;; Extracted from above (defun constant-sc (constant) @@ -273,14 +264,12 @@ (immediate-constant-sc (constant-value constant)) (if null-offset immed - (let ((boxed (or (not immed) - (boxed-immediate-sc-p immed)))) - (cond (boxed - (if immed - (svref *backend-sc-numbers* immed) - (sc-or-lose 'constant))) - (t - (sc-or-lose 'constant)))))))) + (cond ((not immed) + (sc-or-lose 'constant)) + ((boxed-immediate-sc-p immed) + (svref *backend-sc-numbers* immed)) + (t + (sc-or-lose 'constant))))))) (defun make-load-time-value-tn (handle type) (let* ((component (component-info *component-being-compiled*)) diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index 0d31e1de5c..5b09a72531 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -197,6 +197,7 @@ ;; non-immediate constants in the constant pool (constant constant) + ;; some FP constants can be generated in the i387 silicon (fp-single-zero immediate-constant) (fp-double-zero immediate-constant) (fp-complex-single-zero immediate-constant) From 4691288dd027e1b4cdd84c77f1f364b46044dcb3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 01:17:00 +0300 Subject: [PATCH 3139/4023] x86-64: fix error encoding in fixnum*/c. --- src/compiler/x86-64/arith.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/x86-64/arith.lisp b/src/compiler/x86-64/arith.lisp index 25457db1a2..5996f48048 100644 --- a/src/compiler/x86-64/arith.lisp +++ b/src/compiler/x86-64/arith.lisp @@ -566,7 +566,7 @@ type)) (y (plausible-signed-imm32-operand-p y)) (error (generate-error-code+ (lambda () - (inst mov r y)) + (inst mov r (fixnumize y))) vop 'sb-kernel::mul-overflow-error x r))) From a3d59ab2be6f36fb21698c5d11c8af6231000c35 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 17 Apr 2022 18:26:53 -0400 Subject: [PATCH 3140/4023] Forgo use of excluded stack range in stack scan for #-unix --- src/runtime/gencgc.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index c455dd03dc..9e4cffd1a4 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3755,8 +3755,16 @@ conservative_stack_scan(struct thread* th, // there's no need to call preserve_pointer on them since // they definitely don't point to the heap. // See the picture at create_thread_struct() as a reminder. +#ifdef LISP_FEATURE_UNIX lispobj exclude_from = (lispobj)th->control_stack_start; lispobj exclude_to = (lispobj)th + dynamic_values_bytes; +#define potential_heap_pointer(word) !(exclude_from <= word && word < exclude_to) +#else + // We can't use the heuristic of excluding words that appear to point into + // 'struct thread' on win32 because ... I don't know why. + // See https://groups.google.com/g/sbcl-devel/c/8s7mrapq56s/m/UaAjYPqKBAAJ +#define potential_heap_pointer(word) 1 +#endif lispobj* ptr; for (ptr = esp; ptr < th->control_stack_end; ptr++) { @@ -3764,8 +3772,7 @@ conservative_stack_scan(struct thread* th, // Also note that we can eliminate small fixnums from consideration // since there is no memory on the 0th page. // (most OSes don't let users map memory there, though they used to). - if (word >= BACKEND_PAGE_BYTES && - !(exclude_from <= word && word < exclude_to)) { + if (word >= BACKEND_PAGE_BYTES && potential_heap_pointer(word)) { preserve_pointer(word); } } From e971aa48f22af7e6f3a60cced59af173086d8cbd Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 17 Apr 2022 18:52:40 -0400 Subject: [PATCH 3141/4023] Generate smaller+faster EQUALP predicate for defstruct Avoid use of the slot-access-transform. Though this doesn't type-check the "unsafe" slots, answering the question of whether two structures are EQUALP is generally unaffected. There may be an edge case involving two instances that have a type-incorrect but EQ value in such a slot. This changes considers them EQUALP. We could bypass the custom comparator in safety 3 if it really mattered, but we'd need two variants of EQUALP, and the policy at any call site would dictate which to call. Similar consideration pertains to slots with unbound-marker in them. --- src/code/defstruct.lisp | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 3d3d2f8674..7ed30b5234 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -181,15 +181,23 @@ (defmethod print-object ((x defstruct-slot-description) stream) (print-unreadable-object (x stream :type t) (prin1 (dsd-name x) stream))) + (defun dsd-raw-slot-data (dsd) (let ((rsd-index (dsd-rsd-index dsd))) (and rsd-index (svref *raw-slot-data* rsd-index)))) + (defun dsd-raw-type (dsd) (acond ((dsd-raw-slot-data dsd) (raw-slot-data-raw-type it)) (t))) -(defun dsd-primitive-accessor (dsd &aux (rsd (dsd-raw-slot-data dsd))) - (if rsd (raw-slot-data-reader-name rsd) '%instance-ref)) + +(defun dsd-reader (dsd funinstancep) + (acond ((dsd-raw-slot-data dsd) + (values (raw-slot-data-reader-name it) (raw-slot-data-writer-name it))) + (funinstancep + (values '%funcallable-instance-info '%set-funcallable-instance-info)) + (t + (values '%instance-ref '%instance-set)))) ;;;; typed (non-class) structures @@ -368,9 +376,8 @@ ;; that compare more than one word at a time. (collect ((group1) (group2) (group3)) (mapc (lambda (dsd comparator) - (let* ((slot-key (cons dd dsd)) - (x (slot-access-transform :read '(a) slot-key)) - (y (slot-access-transform :read '(b) slot-key))) + (let ((x `(truly-the ,(dsd-type dsd) (,(dsd-reader dsd nil) a ,(dsd-index dsd)))) + (y `(truly-the ,(dsd-type dsd) (,(dsd-reader dsd nil) b ,(dsd-index dsd))))) (cond ((member comparator '(= char-equal)) (group1 `(,comparator ,x ,y))) ; bounded amount of testing ((member comparator '(bit-vector-=)) @@ -1168,17 +1175,9 @@ unless :NAMED is also specified."))) (defun slot-access-transform (operation args slot-key &optional (fun-or-macro :macro)) (binding* ((dd (car slot-key)) (dsd (cdr slot-key)) + ((reader writer) (dsd-reader dsd (neq (dd-type dd) 'structure))) (type-spec (dsd-type dsd)) - (index (dsd-index dsd)) - ((writer reader) - (acond ((dsd-raw-slot-data dsd) - (values (raw-slot-data-writer-name it) (raw-slot-data-reader-name it))) - (t - (ecase (dd-type dd) - (funcallable-structure - (values '%set-funcallable-instance-info '%funcallable-instance-info)) - (structure - (values '%instance-set '%instance-ref))))))) + (index (dsd-index dsd))) (ecase operation (:read (when (singleton-p args) @@ -2256,7 +2255,7 @@ or they must be declared locally notinline at each call site.~@:>" (let ((slot-name (dsd-name dsd))) (when (or (memq slot-name slot-names) (not slot-names-p)) - (let* ((accessor (dsd-primitive-accessor dsd)) + (let* ((accessor (dsd-reader dsd nil)) (index (dsd-index dsd)) (value (funcall accessor object index))) (inits `(setf (,accessor ,object ,index) ',value)))))) From 42e5e093415bfae6b50798eb27e741dac5b89b78 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 17 Apr 2022 22:08:46 -0400 Subject: [PATCH 3142/4023] Add negative test --- tests/dump.impure-cload.lisp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/dump.impure-cload.lisp b/tests/dump.impure-cload.lisp index b2e116f9a3..d74b262b96 100644 --- a/tests/dump.impure-cload.lisp +++ b/tests/dump.impure-cload.lisp @@ -15,6 +15,7 @@ (load "compiler-test-util.lisp")) (declaim (optimize (debug 3) (speed 2) (space 1))) +(declaim (muffle-conditions compiler-note)) ;;; this would fail an AVER in NOTE-POTENTIAL-CIRCULARITY (defparameter *circular-2d-array* #1=#2A((a b) (#1# x))) @@ -484,6 +485,7 @@ (assert (cadr z)))) (macrolet ((expand () + (declare (muffle-conditions compiler-note)) ; why is DECLAIM not enough? `(progn ,@(loop for i from 0 below sb-vm:n-word-bits collect @@ -524,3 +526,20 @@ (with-test (:name :coalesce-numeric-arrays) (assert (eq (use-numeric-vector-a) (use-numeric-vector-b)))) + +(eval-when (:compile-toplevel :load-toplevel :execute) +(defstruct person id) +(defstruct (spy (:include person (id " " :type (simple-string 2)))) gadgetry) +(defmethod make-load-form ((self spy) &optional environment) + (declare (ignore environment)) + (make-load-form-saving-slots self))) + +(defvar *agent* #.(let ((s (make-spy :id "86" :gadgetry '(shoe-phone)))) + (setf (person-id s) "max") + s)) + +;;; If lp#1969318 is fixed, then *AGENT* should not be reconstructed +;;; from its load form, let alone dumped in the first place. +;;; But thankfully we trap the read of the ID slot. +(with-test (:name :illegal-typed-slot-value) + (assert-error (spy-id *agent*))) From d2ca90b6f3443656cf30e82658bab118bf271a1b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 17 Apr 2022 22:14:04 -0400 Subject: [PATCH 3143/4023] Get rid of a use of PCL-COMPILE for defstruct Never JIT-compile a writer for a readonly slot. Instead when macroexpanding DEFSTRUCT, always create anonymized incarnations of each slot accessor and hand those to the CLOS class installer. Thusly all rigmarole about whether there is a pair of globally BOUNDP function names per slot is irrelevant. --- src/code/cold-init.lisp | 2 + src/code/defstruct.lisp | 74 +++++++++++++++----- src/code/target-defstruct.lisp | 30 ++++++-- src/pcl/braid.lisp | 103 ++++++++++++++++++---------- src/pcl/defs.lisp | 5 ++ src/pcl/fixup.lisp | 1 + src/pcl/low.lisp | 61 ---------------- tests/clos.impure-cload.lisp | 4 +- tests/error-source-path.impure.lisp | 6 +- 9 files changed, 164 insertions(+), 122 deletions(-) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index 930954c079..c94c7c1154 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -136,6 +136,8 @@ (/show0 "entering !COLD-INIT") #+sb-show (setq */show* t) + (setq sb-kernel::*defstruct-hooks* '(sb-kernel::!bootstrap-defstruct-hook) + sb-kernel::*struct-accesss-fragments-delayed* nil) (let ((stream (!make-cold-stderr-stream))) (setq *error-output* stream *standard-output* stream diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 7ed30b5234..07c40a0adf 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -241,6 +241,51 @@ ;;; the source form to them directly. (defvar *dsd-source-form*) +(defun accessor-definitions (dd defuns) + (if defuns + ;; Return the ordinary toplevel (usually, anyway) defuns + (loop for dsd in (dd-slots dd) + for accessor-name = (dsd-accessor-name dsd) + unless (accessor-inherited-data accessor-name dd) + nconc (dx-let ((key (cons dd dsd))) + (let ((source-form (and (boundp '*dsd-source-form*) + (cdr (assq dsd *dsd-source-form*))))) + `(,@(unless (dsd-read-only dsd) + `((sb-c:xdefun (setf ,accessor-name) :accessor ,source-form (value instance) + ,(slot-access-transform :setf '(instance value) key)))) + (sb-c:xdefun ,accessor-name :accessor ,source-form (instance) + ,(slot-access-transform :read '(instance) key)))))) + ;; Return fragements of code that CLOS can use. + ;; We don't return the toplevel DEFUNs because those generally + ;; perform an unneeded type-check unless in safety 0. + ;; These lambdas don't need to check the instance + ;; because it was already subject to type-based dispatch. + ;; FIXME: it seems like all these fragments should be packed into a single codebob + ;; which will have less overhead than separate blobs. + ;; Afaict, the only way to do that is to return one lambda that returns all the lambdas. + (collect ((result)) + (dolist (dsd (dd-slots dd) (result)) + (binding* ((key (cons dd dsd)) + (name (string (dsd-name dsd))) ; anonymize by stringification + ((reader writer) (dsd-reader dsd (neq (dd-type dd) 'structure)))) + (declare (dynamic-extent key)) + (result `(named-lambda (setf ,name) (#1=#:v #2=#:x) + ,@(if (eql (dsd-type dsd) 't) + ;; no typecheck + `((,writer (truly-the ,(dd-name dd) #2#) ,(dsd-index dsd) #1#) #1#) + `(,(slot-access-transform :setf `(#1# (truly-the ,(dd-name dd) #2#)) + key :function)))) + `(named-lambda ,name (#2#) + ,(if (and (dsd-always-boundp dsd) (dsd-safe-p dsd)) + ;; Most slots are always-boundp (don't have a BOA constructor + ;; that omits slots) and safe-p (type-safe for reading), + ;; so we can be concise rather than use SLOT-ACCESS-TRANSFORM + ;; plus a rebinding of X with TRULY-THE. + `(,reader (truly-the ,(dd-name dd) #2#) ,(dsd-index dsd)) + ;; Don't check X, but do check the the fetched value. + (slot-access-transform :read `((truly-the ,(dd-name dd) #2#)) + key))))))))) + ;;; shared logic for host macroexpansion for SB-XC:DEFSTRUCT and ;;; cross-compiler macroexpansion for CL:DEFSTRUCT ;;; This monster has exactly one inline use in the final image, @@ -340,7 +385,7 @@ ,@(awhen (dd-predicate-name dd) `((sb-c:xdefun ,(dd-predicate-name dd) :predicate nil (object) (typep object ',(dd-name dd))))) - ,@(accessor-definitions dd)))) + ,@(accessor-definitions dd t)))) (if (and delayp (not (compiler-layout-ready-p name))) `((sb-impl::%simple-eval ',(cons 'progn defuns) (make-null-lexenv))) @@ -352,7 +397,8 @@ ;; %TARGET-DEFSTRUCT returns NAME (%target-defstruct ',dd ,(if optimize-speed - (gen-custom-equalp dd comparators)))))) + (gen-custom-equalp dd comparators)) + ,@(accessor-definitions dd nil))))) ;; Not DD-CLASS-P ;; FIXME: missing package lock checks `((eval-when (:compile-toplevel :load-toplevel :execute) @@ -2053,19 +2099,6 @@ or they must be declared locally notinline at each call site.~@:>" ;; because the container itself will check. (if (eq type t) initform `(the ,type ,initform))))) (dd-slots dd)))))))))) - -(defun accessor-definitions (dd) - (loop for dsd in (dd-slots dd) - for accessor-name = (dsd-accessor-name dsd) - unless (accessor-inherited-data accessor-name dd) - nconc (dx-let ((key (cons dd dsd))) - (let ((source-form (and (boundp '*dsd-source-form*) - (cdr (assq dsd *dsd-source-form*))))) - `(,@(unless (dsd-read-only dsd) - `((sb-c:xdefun (setf ,accessor-name) :accessor ,source-form (value instance) - ,(slot-access-transform :setf '(instance value) key)))) - (sb-c:xdefun ,accessor-name :accessor ,source-form (instance) - ,(slot-access-transform :read '(instance) key))))))) ;;;; instances with ALTERNATE-METACLASS ;;;; @@ -2169,11 +2202,14 @@ or they must be declared locally notinline at each call site.~@:>" (setf (info :type :kind ',class-name) :instance)) ,@(when (eq metaclass-name 'static-classoid) `((declaim (freeze-type ,class-name))))) - ,@(accessor-definitions dd) + ,@(accessor-definitions dd t) ,@(when constructor (multiple-value-bind (allocate set-layout) (ecase dd-type (structure + ;; I think the only nonfuncallable alternate-metaclass structure + ;; is CONDITION, which has its own fancy constructor. + ;; Maybe this should be (bug "Can't happen") ? (values `(%make-structure-instance-macro ,dd nil) nil)) (funcallable-structure (values `(truly-the ,class-name @@ -2186,7 +2222,11 @@ or they must be declared locally notinline at each call site.~@:>" ,@(mapcar (lambda (dsd) `(setf (,(dsd-accessor-name dsd) object) ,(dsd-name dsd))) (dd-slots dd)) - object))))))) + object)))) + (!target-defstruct-altmetaclass ',dd ,@(accessor-definitions dd nil))))) +#+sb-xc-host +(defun !target-defstruct-altmetaclass (&rest args) + (declare (ignore args))) ;;;; finalizing bootstrapping diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 485b1112f1..83448aab44 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -251,12 +251,27 @@ (defun assign-equalp-impl (type-name function) (set-wrapper-equalp-impl (find-layout type-name) function)) -(defun %target-defstruct (dd equalp) +;;; This variable is just a somewhat hokey way to pass additional +;;; arguments to the defstruct hook (which renders the structure definition +;;; into a CLOS class) without having to figure out some means of stashing +;;; functions in the DD or DD for the structure. +(defvar *struct-accesss-fragments* nil) +(define-load-time-global *struct-accesss-fragments-delayed* nil) + +(defun !bootstrap-defstruct-hook (classoid) + ;; I hate this, but do whatever it takes... + ;; A better approach might be to write the correct data + ;; into the LAYOUT-SLOT-TABLE now. + ;; (I think that's where the code fragments end up) + (unless (member (classoid-name classoid) '(pathname condition)) ; KLUDGE + (push (cons (classoid-name classoid) *struct-accesss-fragments*) + *struct-accesss-fragments-delayed*))) + +(defun %target-defstruct (dd equalp &rest accessors) (declare (type defstruct-description dd)) (when (dd-doc dd) - (setf (documentation (dd-name dd) 'structure) - (dd-doc dd))) + (setf (documentation (dd-name dd) 'structure) (dd-doc dd))) (let ((classoid (find-classoid (dd-name dd)))) (let ((layout (classoid-wrapper classoid))) @@ -289,11 +304,18 @@ (lambda (a b) (sb-impl::instance-equalp* comparators a b))))))) - (when *type-system-initialized* + (let ((*struct-accesss-fragments* accessors)) (dolist (fun *defstruct-hooks*) (funcall fun classoid)))) (dd-name dd)) +(defun !target-defstruct-altmetaclass (dd &rest accessors) + (declare (type defstruct-description dd)) + (let ((classoid (find-classoid (dd-name dd))) + (*struct-accesss-fragments* accessors)) + (dolist (fun *defstruct-hooks*) + (funcall fun classoid))) + t) ;;; Similar to DO-INSTANCE-TAGGED-SLOT but iterating over all words. (defmacro do-layout-bitmap ((index-var taggedp-var layout count) &body guts) diff --git a/src/pcl/braid.lisp b/src/pcl/braid.lisp index 9506453aa6..bbaebf0613 100644 --- a/src/pcl/braid.lisp +++ b/src/pcl/braid.lisp @@ -123,23 +123,62 @@ (defun eval-form (form) (lambda () (eval form))) -(defun ensure-non-standard-class (name classoid &optional existing-class) - (flet +(defun ensure-non-standard-class (name classoid &optional existing-class extra-data) + (labels ((ensure (metaclass slots) (let ((supers (mapcar #'classoid-name (classoid-direct-superclasses classoid)))) (ensure-class-using-class existing-class name :metaclass metaclass :name name :direct-superclasses supers :direct-slots slots))) - (slot-initargs-from-structure-slotd (slotd) - (let ((accessor (dsd-accessor-name slotd))) + (slot-initargs-from-structure-slotd (slotd writer-fn reader-fn) `(:name ,(dsd-name slotd) - :defstruct-accessor-symbol ,accessor - :internal-reader-function ,(structure-slotd-reader-function slotd) - :internal-writer-function ,(structure-slotd-writer-function name slotd) + :defstruct-accessor-symbol ,(dsd-accessor-name slotd) + :internal-reader-function ,reader-fn + :internal-writer-function ,writer-fn :type ,(dsd-type slotd) :initform ,(dsd-default slotd) - :initfunction ,(eval-form (dsd-default slotd))))) + ;; This is nuts! any DEFAULT might need its lexical environment, + ;; yet we EVAL in the null environment. + :initfunction ,(eval-form (dsd-default slotd)))) + (accessor-closures (dsd) + (multiple-value-bind (reader-fn writer-fn) (sb-kernel::dsd-reader dsd nil) + ;; This is for a structure class that exists only in its compile-time representation. + ;; I don't see how these would get called, since you can't make an instance + ;; of the structure. + (list (lambda (newval object) (funcall writer-fn newval object) newval) + (lambda (object) (funcall reader-fn object))))) + (structure-type-slot-description-list (type) + (let* ((dd (find-defstruct-description type)) + (include (dd-include dd)) + (all-slots (dd-slots dd))) + (unless extra-data + (acond ((assoc (dd-name dd) sb-kernel::*struct-accesss-fragments-delayed*) + (let ((fragments (cdr it))) + (dolist (dsd (dd-slots dd)) + (push (list dsd (pop fragments) (pop fragments)) extra-data))) + (setq sb-kernel::*struct-accesss-fragments-delayed* + (delete it sb-kernel::*struct-accesss-fragments-delayed*))) + (t + (dolist (dsd (dd-slots dd)) + (push (cons dsd (accessor-closures dsd)) extra-data))))) + (multiple-value-bind (super slot-overrides) + (if (consp include) + (values (car include) (mapcar #'car (cdr include))) + (values include nil)) + (let ((included-slots + (when super + (dd-slots (find-defstruct-description super))))) + ;; This seems like a very unclear way to do what it's doing, which is + ;; collect slots of TYPE that are not in its direct ancestor, *or* + ;; which have an altered definition relative to the inherited one. + (loop for slot = (pop all-slots) + for included-slot = (pop included-slots) + while slot + when (or (not included-slot) + (member (dsd-name included-slot) slot-overrides :test #'eq)) + collect (apply #'slot-initargs-from-structure-slotd + (assoc slot extra-data))))))) (slot-initargs-from-condition-slot (slot) `(:name ,(condition-slot-name slot) :initargs ,(condition-slot-initargs slot) @@ -152,29 +191,7 @@ :allocation ,(condition-slot-allocation slot) :documentation ,(condition-slot-documentation slot)))) (cond ((structure-type-p name) - ;; This seems like a somewhat unclear way to do what it's doing, which is - ;; collect slots of TYPE that are not in its direct ancestor, *or* - ;; which have an altered definition relative to the inherited one. - (flet ((structure-type-slot-description-list (type) - (let* ((dd (find-defstruct-description type)) - (include (dd-include dd)) - (all-slots (dd-slots dd))) - (multiple-value-bind (super slot-overrides) - (if (consp include) - (values (car include) (mapcar #'car (cdr include))) - (values include nil)) - (let ((included-slots - (when super - (dd-slots (find-defstruct-description super))))) - (loop for slot = (pop all-slots) - for included-slot = (pop included-slots) - while slot - when (or (not included-slot) - (member (dsd-name included-slot) slot-overrides :test #'eq)) - collect slot)))))) - (ensure 'structure-class - (mapcar #'slot-initargs-from-structure-slotd - (structure-type-slot-description-list name))))) + (ensure 'structure-class (structure-type-slot-description-list name))) ((condition-type-p name) (ensure 'condition-class (mapcar #'slot-initargs-from-condition-slot @@ -182,14 +199,30 @@ (t (error "~@<~S is not the name of a class.~@:>" name))))) -(defun ensure-deffoo-class (classoid) +(defun ensure-deffoo-class (classoid &optional accessors) (let ((class (classoid-pcl-class classoid))) (cond (class - (ensure-non-standard-class (class-name class) classoid class)) + (ensure-non-standard-class (class-name class) classoid class accessors)) ((eq 'complete **boot-state**) - (ensure-non-standard-class (classoid-name classoid) classoid))))) + (ensure-non-standard-class (classoid-name classoid) classoid nil accessors))))) -(pushnew 'ensure-deffoo-class sb-kernel::*defstruct-hooks*) +(defun ensure-defstruct-class (classoid) + ;; Create an association from the DSD to the reader and writer functions. + (let* ((name (classoid-name classoid)) + (dd (find-defstruct-description name)) + (fragments sb-kernel::*struct-accesss-fragments*)) + (collect ((accessors)) + (dolist (dsd (dd-slots dd)) + (accessors (list dsd (pop fragments) (pop fragments)))) + (ensure-deffoo-class classoid (accessors))))) + +;;; Prior to the normal (steady-state) defstruct hook getting installed, +;;; we just accumulate an alist of slot accessor functions keyed by +;;; the type name. After switching it over, we start calling +;;; ENSURE-CLASS-USING-CLASS. But that means if PCL isn't ready to +;;; actually create classes, we can't switch over. So we refrain +;;; from installing the DEFSTRUCT-HOOK until there are no more +;;; defstruct forms to execute within PCL itself. (pushnew 'ensure-deffoo-class sb-kernel::*define-condition-hooks*) (defun !make-class-predicate (class name source-location) diff --git a/src/pcl/defs.lisp b/src/pcl/defs.lisp index b65b0b0e36..e10d036ba0 100644 --- a/src/pcl/defs.lisp +++ b/src/pcl/defs.lisp @@ -461,6 +461,11 @@ (info :accessor slot-definition-info))) +(defun uninitialized-accessor-function (type slotd) + (lambda (&rest args) + (declare (ignore args)) + (error "~:(~A~) function~@[ for ~S ~] not yet initialized." + type slotd))) ;;; We use a structure here, because fast slot-accesses to this information ;;; are critical to making SLOT-VALUE-USING-CLASS &co fast: places that need ;;; these functions can access the SLOT-INFO directly, avoiding the overhead diff --git a/src/pcl/fixup.lisp b/src/pcl/fixup.lisp index ffe69c761d..f4a6ac012d 100644 --- a/src/pcl/fixup.lisp +++ b/src/pcl/fixup.lisp @@ -71,6 +71,7 @@ (fmakunbound gf-name) (ensure-accessor gf-name)) +(setq sb-kernel::*defstruct-hooks* '(ensure-defstruct-class)) (compute-standard-slot-locations) (dolist (s '(condition function structure-object)) (sb-kernel::do-subclassoids ((k v) (find-classoid s)) diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 307ba35f6d..03a41439b7 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -221,67 +221,6 @@ (cond ((std-instance-p instance) (std-instance-slots instance)) ((fsc-instance-p instance) (fsc-instance-slots instance)))) -;;;; structure-instance stuff -;;;; -;;;; FIXME: Now that the code is SBCL-only, this extra layer of -;;;; abstraction around our native structure representation doesn't -;;;; seem to add anything useful, and could probably go away. - - - -(defun uninitialized-accessor-function (type slotd) - (lambda (&rest args) - (declare (ignore args)) - (error "~:(~A~) function~@[ for ~S ~] not yet initialized." - type slotd))) - -(defun structure-slotd-reader-function (slotd) - (let ((name (dsd-accessor-name slotd))) - (if (fboundp name) - (fdefinition name) - (uninitialized-accessor-function :reader slotd)))) - -;;; Return a function to write the slot identified by SLOTD. -;;; This is easy for read/write slots - we just return the accessor -;;; that was already set up - but it requires work for read-only slots. -;;; Basically we get the slotter-setter-lambda-form and compile it. -;;; Using (COERCE lambda-form 'FUNCTION) as used to be done might produce -;;; an interpreted function. I'm not sure whether that's right or wrong, -;;; because if the DEFSTRUCT itself were evaluated, then the ordinary -;;; accessors would indeed be interpreted. However if the DEFSTRUCT were -;;; compiled, and the fasl loaded in a Lisp with *EVALUATOR-MODE* = :INTERPRET, -;;; arguably this is against the expectation that all things got compiled. -;;; But can people really expect that manipulating read-only slots -;;; via (SETF SLOT-VALUE) should be fast? -;;; -;;; Damned-if-you-do / damned-if-you don't - the best thing would be to -;;; compile all accessors at "really" compile-time but not store the writer -;;; for a reaadonly slot under the #<fdefn> for #'(SETF slot-name). -;;; FIXME: this is highly obfuscated and we should just do exactly what the -;;; preceding comment suggests: compile all slot-writer frobs and attach -;;; them to the defstruct-definition in %TARGET-DEFSTRUCT. -(defun structure-slotd-writer-function (type slotd) - ;; TYPE is not used, because the DD is taken from runtime data. - (declare (ignore type)) - (if (dsd-read-only slotd) - ;; We'd like to compile the writer just-in-time and store it - ;; back into the STRUCTURE-DIRECT-SLOT-DEFINITION and also - ;; the LAYOUT for the class, but we don't have a handle on - ;; any of the containing objects. So this has to be a closure. - (let ((setter 0)) - (lambda (newval instance) - (if (eql setter 0) - (let* ((dd (wrapper-info (%instance-wrapper instance))) - (f (pcl-compile (slot-setter-lambda-form dd slotd)))) - (if (functionp f) - (funcall (setq setter f) newval instance) - (uninitialized-accessor-function :writer slotd))) - (funcall (truly-the function setter) newval instance)))) - (let ((name `(setf ,(dsd-accessor-name slotd)))) - (if (fboundp name) - (fdefinition name) - (uninitialized-accessor-function :writer slotd))))) - (defun pcl-compile (expr &optional unsafe-policy) (let* ((base-policy sb-c::*policy*) (lexenv diff --git a/tests/clos.impure-cload.lisp b/tests/clos.impure-cload.lisp index 2c5af3e6b0..6ca8013206 100644 --- a/tests/clos.impure-cload.lisp +++ b/tests/clos.impure-cload.lisp @@ -207,6 +207,6 @@ ;; hide the slot name from the compiler so it doesn't optimize (slot-name (eval ''allegedly-immutable-slot))) (setf (slot-value myobj slot-name) :newval1) - (assert (= *compile-count* (1+ old-count))) + (assert (= *compile-count* old-count)) ; no compilation (setf (slot-value myobj slot-name) :newval2) - (assert (= *compile-count* (1+ old-count))))) ; same as before + (assert (= *compile-count* old-count)))) ; no compilation diff --git a/tests/error-source-path.impure.lisp b/tests/error-source-path.impure.lisp index f79d6eb597..8b862fcfd2 100644 --- a/tests/error-source-path.impure.lisp +++ b/tests/error-source-path.impure.lisp @@ -137,17 +137,17 @@ (locally (declare (optimize (safety 0))) (defstruct f (x (print t) :type fixnum))) - (1 2 2)) + (1 2 2) (2)) (assert-condition-source-paths (locally (declare (optimize (safety 0))) (defstruct f (x 33 :type cons))) - (2 2)) + (2 2) (2)) (assert-condition-source-paths (locally (declare (optimize (safety 0))) (defstruct f (x mm))) - (2 2))) + (2) (2 2))) (with-test (:name (:source-path defgeneric :lambda-list)) (assert-condition-source-paths From 5d8a65dd54cc015726f218f3230c631850442229 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 05:41:15 +0300 Subject: [PATCH 3144/4023] x18 is volatile on arm64. Now? Always has been? It's reserved on Darwin (even though nothing seems to be using it currently). --- src/compiler/arm64/c-call.lisp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/arm64/c-call.lisp b/src/compiler/arm64/c-call.lisp index e516ee5dba..7c4330d5e4 100644 --- a/src/compiler/arm64/c-call.lisp +++ b/src/compiler/arm64/c-call.lisp @@ -242,7 +242,7 @@ (loop for reg in (list r0-offset r1-offset r2-offset r3-offset r4-offset r5-offset r6-offset r7-offset - #-darwin r10-offset) + #-darwin r8-offset) do (inst mov (make-random-tn @@ -266,7 +266,7 @@ nl4-offset nl5-offset nl6-offset nl7-offset nl8-offset nl9-offset r0-offset r1-offset r2-offset r3-offset r4-offset r5-offset r6-offset r7-offset - #-darwin r10-offset + #-darwin r8-offset #-sb-thread r11-offset)) (vars)) (append @@ -286,7 +286,7 @@ (:temporary (:sc any-reg :offset r9-offset :from (:argument 0) :to (:result 0)) cfunc) (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) - (:temporary (:sc any-reg :offset r8-offset) temp) + (:temporary (:sc any-reg :offset #+darwin r8-offset #-darwin r10-offset) temp) (:temporary (:sc any-reg :offset lexenv-offset) temp2) (:temporary (:scs (interior-reg)) lip) (:vop-var vop) From 6811e82a9ddd3acdc520a25baeab2a19edded9f9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 06:04:26 +0300 Subject: [PATCH 3145/4023] arm64: fix >-integer-fixnum around other pointers. --- src/compiler/arm64/type-vops.lisp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index f81db231a6..172960c12f 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -263,6 +263,7 @@ (unless (sc-is (tn-ref-tn args) descriptor-reg control-stack) (setf args (tn-ref-across args))) (let* ((integer-p (csubtypep (tn-ref-type args) (specifier-type 'integer))) + (other-pointer-p (fixnum-or-other-pointer-tn-ref-p args)) negative-p (fixnum (if (sc-is fixnum immediate) (let* ((value (fixnumize (tn-value fixnum))) @@ -280,7 +281,7 @@ (values target not-target)) (assemble () (when (types-equal-or-intersect (tn-ref-type args) (specifier-type 'fixnum)) - (cond ((or integer-p + (cond ((or other-pointer-p (not (and (eql fixnum 0) (eq comparison :ge)))) (inst tbnz integer 0 bignum) @@ -312,7 +313,7 @@ (inst tst integer (lognot (fixnumize most-positive-fixnum))) (inst b :eq yep)))) bignum - (unless (fixnum-or-other-pointer-tn-ref-p args) + (unless other-pointer-p (test-type integer temp nope t (other-pointer-lowtag))) (loadw temp integer 0 other-pointer-lowtag) (unless integer-p From aa38e28e04f8a2fda20f17c6f8c5a3a1e95183a5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 19:58:01 +0300 Subject: [PATCH 3146/4023] Pin boxed registers on arm64. To avoid the interior pointer pairing, which doesn't work when LR can't be paired with a code register. --- src/runtime/gc-common.c | 16 ++-------------- src/runtime/gencgc.c | 12 +++++++++--- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index af51908dce..f98b9160df 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -2377,6 +2377,7 @@ scavenge_control_stack(struct thread *th) } } +#ifndef REG_CODE /* Scavenging Interrupt Contexts */ static int boxed_registers[] = BOXED_REGISTERS; @@ -2555,17 +2556,6 @@ scavenge_interrupt_context(os_context_t * context) #endif #ifdef ARCH_HAS_LINK_REGISTER -#ifndef reg_CODE - /* If LR points inside a code object, and there's no reg_CODE, - don't pair it with anything, as there is nothing valid to pair - LR with. On-stack code is pinned, so there is no need to fix up - LR */ - int code_in_lr = 0; - - if (dynamic_space_code_from_pc((char *)*os_context_register_addr(context, reg_LR))) { - code_in_lr = 1; - } -#endif { PAIR_INTERIOR_POINTER(lr); } @@ -2616,9 +2606,6 @@ scavenge_interrupt_context(os_context_t * context) #endif #ifdef ARCH_HAS_LINK_REGISTER -#ifndef reg_CODE - if(!code_in_lr) -#endif { FIXUP_INTERIOR_POINTER(lr); } @@ -2648,6 +2635,7 @@ scavenge_interrupt_contexts(struct thread *th) scavenge_interrupt_context(context); } } +#endif /* !REG_CODE */ #endif /* x86oid targets */ /* Our own implementation of heapsort, because some C libraries have a qsort() diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 9e4cffd1a4..d2253d5dd5 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3650,12 +3650,14 @@ static void semiconservative_pin_stack(struct thread* th, #if GENCGC_IS_PRECISE && !defined(reg_CODE) +static int boxed_registers[] = BOXED_REGISTERS; + /* Pin all (condemned) code objects pointed to by the chain of in-flight calls * based on scanning from the innermost frame pointer. This relies on an exact backtrace, * which some of our architectures have trouble obtaining. But it's theoretically * more efficient to do it this way versus looking at all stack words to see * whether each points to a code object. */ -static void pin_call_chain(struct thread* th) { +static void pin_call_chain_and_boxed_registers(struct thread* th) { lispobj *cfp = access_control_frame_pointer(th); if (cfp) { @@ -3672,6 +3674,10 @@ static void pin_call_chain(struct thread* th) { for (i = i - 1; i >= 0; --i) { os_context_t* context = nth_interrupt_context(i, th); maybe_pin_code((lispobj)*os_context_register_addr(context, reg_LR)); + + for (unsigned i = 0; i < (sizeof(boxed_registers) / sizeof(int)); i++) { + pin_exact_root(*os_context_register_addr(context, boxed_registers[i])); + } } } @@ -3945,7 +3951,7 @@ garbage_collect_generation(generation_index_t generation, int raise, #elif defined REG_RA conservative_pin_code_from_return_addresses(th); #elif !defined(reg_CODE) - pin_call_chain(th); + pin_call_chain_and_boxed_registers(th); #endif } } @@ -4028,7 +4034,7 @@ garbage_collect_generation(generation_index_t generation, int raise, if (conservative_stack) { struct thread *th; for_each_thread(th) { -#ifndef LISP_FEATURE_MIPS // interrupt contexts already pinned everything they see +#if defined(LISP_FEATURE_MIPS) || !defined(reg_CODE) // interrupt contexts already pinned everything they see scavenge_interrupt_contexts(th); #endif scavenge_control_stack(th); From 4f4269f7e7a4e5efea641ad0fbd25eff12488930 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Sun, 13 Feb 2022 16:16:32 -0500 Subject: [PATCH 3147/4023] run-program: Use close_range syscall or libc wrapper before exec FreeBSD and Linux have added the close_range syscall (in April 2020 and 5.9, respectively). This allows for a range of fds to be closed using a single syscall. The behavior of closefrom can be emulated using ~0U as the end fd. FreeBSD immediately added it to their libc, but Linux libcs have lagged behind. To support Linux systems running kernel 5.9+ without a libc wrapper for close_range, we test for the presence of a wrapper at build time and use it if it exists. Otherwise, fall back to the syscall directly (if the number of the syscall can be determined at build time). If close_range can't be found at build time, or the run time kernel does not support it, fall back to close() in a for loop. Linux tests were run on an x86-64 machine with ulimit -n 524288, using (time (dotimes (i 100) (sb-ext:run-program "/bin/true" nil))) Typical "slow" path (no use of close_range) results were: Evaluation took: 11.630 seconds of real time 0.088556 seconds of total run time (0.013697 user, 0.074859 system) 0.77% CPU 1,491 forms interpreted 26,799,410,672 processor cycles 425,376 bytes consed Typical "fast" path results were: Evaluation took: 0.153 seconds of real time 0.055602 seconds of total run time (0.002995 user, 0.052607 system) 36.60% CPU 1,491 forms interpreted 351,242,436 processor cycles 424,192 bytes consed This was tested with a 5.4 kernel and a 5.13 kernel, using Ubuntu 20.04, 21.04, and 21.10 userspaces. The 5.4 kernel has no close_range support. Ubuntu 20.04 has neither a close_range wrapper (-os-provides-close-range-wrapper) nor a version of Linux headers with __NR_close_range defined. Ubuntu 21.04 has no wrapper, but does have __NR_close_range defined. Ubuntu 21.10 has both a wrapper (+os-provides-close-range-wrapper) and __NR_close_range. The results for which path was taken are summarized below. The top row of each table states which kernel was used at build time, the left-most column states which kernel was used at run time. | 20.04 | 5.4 | 5.13 | |-------|------|------| | 5.4 | slow | slow | | 5.13 | slow | slow | | 21.04 | 5.4 | 5.13 | |-------|------|------| | 5.4 | slow | slow | | 5.13 | fast | fast | | 21.10 | 5.4 | 5.13 | |-------|------|------| | 5.4 | slow | slow | | 5.13 | fast | fast | This was additionally tested on FreeBSD amd64 13.0-RELEASE. All easily available versions of FreeBSD have close_range support. So lack of close_range was emulated by building with --without-os-provides-close-range-wrapper. Additionally, FreeBSD has closefrom(2), so a slightly more complicated test was needed to force the use of close_range. (time (dotimes (i 100) (sb-ext:run-program "/bin/true" nil :preserve-fds (list 100000)))) As expected, the test took less time to run with +os-provides-close-range-wrapper as opposed to -os-provides-close-range-wrapper. --- NEWS | 3 + make-target-2-load.lisp | 5 +- src/runtime/run-program.c | 62 ++++++++++++------- tools-for-build/grovel-features.sh | 2 + .../os-provides-close-range-wrapper-test.c | 14 +++++ 5 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 tools-for-build/os-provides-close-range-wrapper-test.c diff --git a/NEWS b/NEWS index 1504591646..9cfd47d408 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,9 @@ changes relative to sbcl-2.2.3: longer save their entire lexical environment, reducing unnecessary memory retention. * optimization: faster (< integer fixnum) comparisons (ARM64 and x86-64). + * platform support: + ** RUN-PROGRAM is faster on Linux and FreeBSD if close_range(2) is + available. changes in sbcl-2.2.3 relative to sbcl-2.2.2: * minor incompatible change: SB-THREAD:MUTEX-OWNER may return :THREAD-DEAD diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index d929342075..baf7d81e37 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -42,7 +42,10 @@ ;; The final batch of symbols is strictly for C. The LISP_FEATURE_ ;; prefix on the corresponding #define is unfortunate. :GCC-TLS :USE-SYS-MMAP - :OS-PROVIDES-BLKSIZE-T)")) ; only for 'src/runtime/wrap.h' + ;; only for 'src/runtime/wrap.h' + :OS-PROVIDES-BLKSIZE-T + ;; only for src/runtime/run-program.c + :OS-PROVIDES-CLOSE-RANGE-WRAPPER)")) (public-features (cons sb-impl::!sbcl-architecture diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 929ac99147..01a9f8123b 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -13,6 +13,11 @@ * files for more information. */ +#ifdef __linux__ +/* glibc won't give us close_range without this */ +#define _GNU_SOURCE +#endif + #include "sbcl.h" #include <stdlib.h> #include <sys/file.h> @@ -27,6 +32,7 @@ #include <termios.h> #include <errno.h> #include <dirent.h> +#include <sys/syscall.h> #include "interr.h" // for lose() #ifdef LISP_FEATURE_OPENBSD @@ -96,20 +102,6 @@ set_pty(char *pty_name) #endif /* !LISP_FEATURE_OPENBSD */ -void closefrom_fallback(int lowfd) -{ - int fd, maxfd; - -#ifdef SVR4 - maxfd = sysconf(_SC_OPEN_MAX)-1; -#else - maxfd = getdtablesize()-1; -#endif - - for (fd = maxfd; fd >= lowfd; fd--) - close(fd); -} - int closefrom_fddir(char *dir, int lowfd) { DIR *d; @@ -133,6 +125,38 @@ int closefrom_fddir(char *dir, int lowfd) return 0; } +void closefds_range(unsigned int first, unsigned int last) +{ + int fds_closed = 0; + // Try using close_range syscall first. +#if defined(LISP_FEATURE_OS_PROVIDES_CLOSE_RANGE_WRAPPER) + // Prefer the libc wrapper, if it exists at build time. + fds_closed = !close_range(first, last, 0); +#elif defined(LISP_FEATURE_LINUX) && defined(__NR_close_range) + // Use syscall(2) if we could detect the syscall number at build time. + fds_closed = !syscall(__NR_close_range, first, last, 0); +#endif + // Otherwise (if the syscall information isn't availble at build time or if + // the run time kernel doesn't support the syscall), fall back to close() + // in a for loop. + if (!fds_closed) + { + unsigned int close_fd; + if (last == ~0U) + { +#ifdef SVR4 + last = sysconf(_SC_OPEN_MAX)-1; +#else + last = getdtablesize()-1; +#endif + } + for (close_fd = first; close_fd <= last; close_fd++) + { + close(close_fd); + } + } +} + void closefds_from(int lowfd, int* dont_close) { if (dont_close) { @@ -142,13 +166,7 @@ void closefds_from(int lowfd, int* dont_close) for (i = 0; i < length; i++) { int fd = dont_close[i]; - int close_fd; - - /* Close the gaps between the fds */ - for (close_fd = lowfd; close_fd < fd; close_fd++) - { - close(close_fd); - } + closefds_range(lowfd, fd - 1); lowfd = fd+1; } } @@ -172,7 +190,7 @@ void closefds_from(int lowfd, int* dont_close) */ if (!fds_closed) - closefrom_fallback(lowfd); + closefds_range(lowfd, ~0U); #endif } diff --git a/tools-for-build/grovel-features.sh b/tools-for-build/grovel-features.sh index 4f277dfd1b..07d4928160 100644 --- a/tools-for-build/grovel-features.sh +++ b/tools-for-build/grovel-features.sh @@ -42,6 +42,8 @@ featurep os-provides-getprotoby-r featurep os-provides-poll +featurep os-provides-close-range-wrapper + if [ "$sbcl_arch" = arm ] ; then featurep arm-softfp fi diff --git a/tools-for-build/os-provides-close-range-wrapper-test.c b/tools-for-build/os-provides-close-range-wrapper-test.c new file mode 100644 index 0000000000..7743c92e01 --- /dev/null +++ b/tools-for-build/os-provides-close-range-wrapper-test.c @@ -0,0 +1,14 @@ +/* We're really only interested in if this builds. If it does, the OS provides + * close_range as a libc wrapper for the close_range syscall. If it doesn't + * build, we fall back to syscall(2) if __NR_close_range is defined. + */ + +/* glibc won't give us close_range without this */ +#define _GNU_SOURCE +#include <unistd.h> + +int main () +{ + close_range(3, ~0U, 0); + return 104; +} From 28685b8c292f2e8e5fd7bcb509d48dfb324934a7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Apr 2022 13:48:20 -0400 Subject: [PATCH 3148/4023] x86-64: Teach INITIALIZE-VECTOR about constant lvars + SIMPLE-VECTOR --- src/compiler/generic/vm-ir2tran.lisp | 13 +++++++++++-- src/compiler/x86-64/array.lisp | 2 +- tests/x86-64-codegen.impure.lisp | 28 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index 32d1f76224..779da85c0f 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -216,6 +216,9 @@ `(#-compact-instance-header (:dd . ,c-dd) ,@c-slot-specs) args) (move-lvar-result node block locs lvar)))) +;;; FIXME: this causes emission of GC store barriers, but it should not. +;;; The vector is freshly consed, so anything being stored into it +;;; is at least as old. (defoptimizer (initialize-vector ir2-convert) ((vector &rest initial-contents) node block) (let* ((vector-ctype (lvar-type vector)) @@ -224,13 +227,14 @@ (bug "Unknown vector type in IR2 conversion for ~S." 'initialize-vector))) (bit-vector-p (type= elt-ctype (specifier-type 'bit))) + (simple-vector-p (type= elt-ctype (specifier-type 't))) (saetp (find-saetp-by-ctype elt-ctype)) (lvar (node-lvar node)) (locs (lvar-result-tns lvar (list vector-ctype))) (result (first locs)) (elt-ptype (primitive-type elt-ctype)) (tmp (make-normal-tn elt-ptype))) - (declare (ignorable bit-vector-p)) + (declare (ignorable bit-vector-p simple-vector-p)) (emit-move node block (lvar-tn node block vector) result) (flet ((compute-setter () ;; Such cringe. I had no idea why all the "-C" vops were mandatory. @@ -293,9 +297,14 @@ ;; Nonetheless it's far better than it was. In all other scenarios, don't pass ;; a constant TN, because we don't know that generated code is better. (cond #+x86-64 ; still moar cringe - ((and bit-vector-p (constant-lvar-p value)) + ((and (or bit-vector-p simple-vector-p) (constant-lvar-p value)) (funcall setter (tnify i) (emit-constant (lvar-value value)))) (t + ;; FIXME: for simple-vector, fixnums should get stored via an ANY-REG + ;; so that data-vector-set doesn't emit a store barrier. + ;; (TMP is a descriptor-reg because ELT-CTYPE is T) + ;; Or just fix this optimizer - as commented above - to somehow elide + ;; the barrier for all elements. (emit-move node block (lvar-tn node block value) tmp) (funcall setter (tnify i) tmp)))))))) (move-lvar-result node block locs lvar))) diff --git a/src/compiler/x86-64/array.lisp b/src/compiler/x86-64/array.lisp index 5f7d87217b..768beb9807 100644 --- a/src/compiler/x86-64/array.lisp +++ b/src/compiler/x86-64/array.lisp @@ -369,7 +369,7 @@ ,type vector-data-offset other-pointer-lowtag ,scs ,element-type))) (progn - (def-full-data-vector-frobs simple-vector * descriptor-reg any-reg immediate) + (def-full-data-vector-frobs simple-vector * descriptor-reg any-reg immediate constant) (def-full-data-vector-frobs simple-array-unsigned-byte-64 unsigned-num unsigned-reg) (def-full-data-vector-frobs simple-array-fixnum tagged-num any-reg) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 0f3aadf097..40ad131836 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1142,3 +1142,31 @@ sb-vm::(define-vop (cl-user::test) (defun zook () (sb-sys:%primitive trythis) nil) + +;;; Previously INITIALIZE-VECTOR would move every element into +;;; a register, causing each to require a store barrier +;;; and then a register-to-memory move like so: +;;; BB02000000 MOV EBX, 2 +;;; 488D4601 LEA RAX, [RSI+1] +;;; 48C1E80A SHR RAX, 10 +;;; 25FFFF0F00 AND EAX, 1048575 +;;; 41C6040400 MOV BYTE PTR [R12+RAX], 0 +;;; 48895E01 MOV [RSI+1], RBX +;;; The improved code emits 4 consecutive MOV instructions, +;;; one per item. It is still suboptimal in that it can not discern +;;; between initializing and updating, so it always uses a :QWORD move +;;; despite the prezeroed pages. +(with-test (:name :init-vector-mov-to-mem) + (let* ((lines (disassembly-lines + '(lambda () (vector #\x 1 2 3)))) + (magic-value + (write-to-string + (logior (ash (char-code #\x) 8) sb-vm:character-widetag))) + (start + (position-if + (lambda (line) (search magic-value line)) + lines))) + (assert start) + (assert (search ", 2" (nth (+ start 1) lines))) + (assert (search ", 4" (nth (+ start 2) lines))) + (assert (search ", 6" (nth (+ start 3) lines))))) From 3ffbab5b00451cb59b88f20f269f0b7dd657fe92 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Apr 2022 14:09:33 -0400 Subject: [PATCH 3149/4023] Remove a word from 'struct alloc_region' last_page was redundant and basically unused. With minor rearrangement we can have 3 TLABs accessible with a 1-byte displacement off thread-tn on x86-64. --- src/compiler/generic/genesis.lisp | 4 +-- src/compiler/generic/objdef.lisp | 41 +++++++++++++++++-------------- src/compiler/x86-64/macros.lisp | 1 + src/runtime/gencgc-alloc-region.h | 14 +++-------- src/runtime/gencgc-internal.h | 2 +- src/runtime/gencgc.c | 35 ++++++++++++++------------ 6 files changed, 50 insertions(+), 47 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a60eb5a1ef..0b7daf32e0 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1723,10 +1723,10 @@ core and return a descriptor to it." ;;; It might be nice to put NIL on a readonly page by itself to prevent unsafe ;;; code from destroying the world with (RPLACx nil 'kablooey) (defun make-nil-descriptor () - ;; 8 words prior to NIL is an array of two 'struct alloc_region'. + ;; 10 words prior to NIL is an array of three 'struct alloc_region'. ;; The lisp objects begin at STATIC_SPACE_OBJECTS_START. ;; See also (DEFCONSTANT NIL-VALUE) in early-objdef. - #+(and gencgc (not sb-thread)) (gspace-claim-n-words *static* 8) + #+(and gencgc (not sb-thread)) (gspace-claim-n-words *static* 10) #+64-bit (setf (gspace-free-word-index *static*) (/ 256 sb-vm:n-word-bytes)) (let* ((des (allocate-otherptr *static* (1+ sb-vm:symbol-size) 0)) (nil-val (make-descriptor (+ (descriptor-bits des) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index 66f7c2dda6..f39d17740f 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -495,17 +495,7 @@ during backtrace. ;; of a symbol is initialized to zero (no-tls-value-marker) - ;; Technically this slot violates our requirement that the size of the thread - ;; primitive object be computable by assuming one word per slot. POSIX says - ;; "IEEE Std 1003.1-2001/Cor 2-2004, item XBD/TC2/D6/26 is applied, - ;; adding pthread_t to the list of types that are not required to be arithmetic - ;; types, thus allowing pthread_t to be defined as a structure." - ;; - ;; Furthermore, it is technically possibly for a pthread_t to be smaller than a word - ;; (a 4-byte identifier, not a pointer, on 64-bit) but that seems not to be true - ;; for any system that we care about. - (os-thread :c-type #+(or win32 (not sb-thread)) "lispobj" ; actually is HANDLE - #-(or win32 (not sb-thread)) "pthread_t") + (stepping) ;; Keep this first bunch of slots from binding-stack-pointer through alloc-region ;; near the beginning of the structure so that x86[-64] assembly code @@ -526,12 +516,12 @@ during backtrace. :c-type "pa_bits_t") (alien-stack-pointer :c-type "lispobj *" :pointer t :special *alien-stack-pointer*) - (stepping) ;; Deterministic consing profile recording area. (profile-data :c-type "uword_t *" :pointer t) ;; Thread-local allocation buffers - #+gencgc (mixed-tlab :c-type "struct alloc_region" :length 4) - #+gencgc (cons-tlab :c-type "struct alloc_region" :length 4) + (boxed-tlab :c-type "struct alloc_region" :length 3) + (cons-tlab :c-type "struct alloc_region" :length 3) + (mixed-tlab :c-type "struct alloc_region" :length 3) ;; END of slots to keep near the beginning. ;; This is the original address at which the memory was allocated, @@ -539,6 +529,17 @@ during backtrace. ;; Kept here so that when the thread dies we can release the whole ;; memory we reserved. (os-address :c-type "void *" :pointer t) + ;; Technically this slot violates our requirement that the size of the thread + ;; primitive object be computable by assuming one word per slot. POSIX says + ;; "IEEE Std 1003.1-2001/Cor 2-2004, item XBD/TC2/D6/26 is applied, + ;; adding pthread_t to the list of types that are not required to be arithmetic + ;; types, thus allowing pthread_t to be defined as a structure." + ;; + ;; Furthermore, it is technically possibly for a pthread_t to be smaller than a word + ;; (a 4-byte identifier, not a pointer, on 64-bit) but that seems not to be true + ;; for any system that we care about. + (os-thread :c-type #+(or win32 (not sb-thread)) "lispobj" ; actually is HANDLE + #-(or win32 (not sb-thread)) "pthread_t") (os-kernel-tid) ; the kernel's thread identifier, 32 bits on linux ;; These aren't accessed (much) from Lisp, so don't really care @@ -647,10 +648,11 @@ during backtrace. (defconstant nil-value (+ static-space-start ;; mixed_region precedes NIL - ;; 8 is the number of words to reserve at the beginning of static space + ;; 10 is the number of words to reserve at the beginning of static space ;; prior to the words of NIL. - ;; If you change this, then also change MAKE-NIL-DESCRIPTOR in genesis. - #+(and gencgc (not sb-thread) (not 64-bit)) (ash 8 word-shift) + ;; If you change this, then also change MAKE-NIL-DESCRIPTOR in genesis, + ;; and zero_all_free_ranges() in gencgc. + #+(and gencgc (not sb-thread) (not 64-bit)) (ash 10 word-shift) ;; This offset of #x100 has to do with some edge cases where a vop ;; might treat UNBOUND-MARKER as a pointer. So it has an address ;; that is somewhere near NIL which makes it sort of "work" @@ -661,9 +663,12 @@ during backtrace. list-pointer-lowtag)) ;;; MIXED-REGION is at the beginning of static space +;;; Be sure to update "#define main_thread_mixed_region" etc +;;; if these get changed. #-sb-thread (progn (defconstant mixed-region static-space-start) - (defconstant cons-region (+ mixed-region (* 4 n-word-bytes)))) + (defconstant cons-region (+ mixed-region (* 3 n-word-bytes))) + (defconstant boxed-region (+ cons-region (* 3 n-word-bytes)))) ;;; Start of static objects: ;;; diff --git a/src/compiler/x86-64/macros.lisp b/src/compiler/x86-64/macros.lisp index 3364040f31..4434874874 100644 --- a/src/compiler/x86-64/macros.lisp +++ b/src/compiler/x86-64/macros.lisp @@ -107,6 +107,7 @@ ;;; assert that alloc-region->free_pointer and ->end_addr can be accessed ;;; using a single byte displacement from thread-tn (eval-when (:compile-toplevel) + (aver (<= (1+ thread-boxed-tlab-slot) 15)) (aver (<= (1+ thread-mixed-tlab-slot) 15)) (aver (<= (1+ thread-cons-tlab-slot) 15))) diff --git a/src/runtime/gencgc-alloc-region.h b/src/runtime/gencgc-alloc-region.h index a981b90c1f..a181d77ffb 100644 --- a/src/runtime/gencgc-alloc-region.h +++ b/src/runtime/gencgc-alloc-region.h @@ -10,20 +10,14 @@ /* Abstract out the data for an allocation region allowing a single * routine to be used for allocation and closing. */ /* Caution: if you change this, you may have to change compiler/generic/objdef - * (for the THREAD object), all the backends' allocators, and room.lisp */ + * (for the THREAD object), all the backends' allocators, and room.lisp. + * But as long as the first two words are left alone, + * it's generally OK to add or remove other words. + */ struct alloc_region { - /* These two are needed for quick allocation. */ void *free_pointer; void *end_addr; /* pointer to the byte after the last usable byte */ - - /* These are needed when closing the region. */ - /* 'last_page' is identical to 'find_page_index((char*)end_addr - 1)' - * whenever the region is in an open state. The value is preserved on - * closing so that allocation can potentially resume where it left off, - * though that's not quite how things are implemented at present. - */ - page_index_t last_page; void *start_addr; }; diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 829e37965b..bf2a197c57 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -257,7 +257,7 @@ static inline void gc_set_region_empty(struct alloc_region *region) static inline void gc_init_region(struct alloc_region *region) { - region->last_page = 0; // must always be a valid page index + // A distinction without a difference (it used to do one more assignment) gc_set_region_empty(region); } diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index d2253d5dd5..1c5ca922a3 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1011,7 +1011,6 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re // Don't need to set the scan_start_offset because free pages have it 0 // (and each of these page types starts a new contiguous block) gc_dcheck(page_table[page].scan_start_offset_ == 0); - alloc_region->last_page = page; alloc_region->start_addr = page_address(page) + page_bytes_used(page); if (page_type == PAGE_TYPE_CONS) { alloc_region->end_addr = page_address(page) + CONS_PAGE_USABLE_BYTES; @@ -1034,7 +1033,6 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re et_find_freeish_page); /* Set up the alloc_region. */ - alloc_region->last_page = last_page; alloc_region->start_addr = page_address(first_page) + page_bytes_used(first_page); alloc_region->free_pointer = alloc_region->start_addr; alloc_region->end_addr = page_address(last_page+1); @@ -1252,7 +1250,8 @@ gc_close_region(struct alloc_region *alloc_region, int page_type) } /* Unallocate any unused pages. */ - while (next_page <= alloc_region->last_page) { + page_index_t region_last_page = find_page_index((char*)alloc_region->end_addr-1); + while (next_page <= region_last_page) { gc_assert(page_words_used(next_page) == 0); reset_page_flags(next_page); next_page++; @@ -1275,9 +1274,8 @@ gc_alloc_large(sword_t nbytes, int page_type, struct alloc_region *alloc_region, // not enough information. At best we can skip some work in only the case where // the supplied region was the one most recently created. To do this right // would entail a malloc-like allocator at the page granularity. - if (first_page <= alloc_region->last_page) { - first_page = alloc_region->last_page+1; - } + page_index_t min = find_page_index(alloc_region->end_addr); + if (first_page < min) first_page = min; INSTRUMENTING( last_page = gc_find_freeish_pages(&first_page, nbytes, @@ -1560,8 +1558,10 @@ void *collector_alloc_fallback(struct alloc_region* region, sword_t nbytes, int return new_obj; } } - __attribute__((unused)) page_index_t page = region->last_page; - gc_assert(page_table[page].type & OPEN_REGION_PAGE_FLAG); + __attribute__((unused)) page_index_t fpi = find_page_index(region->start_addr); + __attribute__((unused)) page_index_t lpi = find_page_index((char*)region->end_addr-1); + gc_assert(fpi == lpi); + gc_assert(page_table[fpi].type & OPEN_REGION_PAGE_FLAG); // Region is open, but card at free_pointer lacks sufficient space. // See if there's another card on the same page. char* page_base = PTR_ALIGN_DOWN(region->start_addr, GENCGC_PAGE_BYTES); @@ -4392,6 +4392,7 @@ extern int finalizer_thread_runflag; # define THREAD_ALLOC_REGION(threadvar,slot) main_thread_ ##slot ##_region #define main_thread_mixed_region (struct alloc_region*)STATIC_SPACE_START #define main_thread_cons_region (1+main_thread_mixed_region) +#define main_thread_boxed_region (2+main_thread_mixed_region) #endif /* GC all generations newer than last_gen, raising the objects in each @@ -5232,12 +5233,10 @@ int gencgc_handle_wp_violation(void* fault_addr) lisp_backtrace(10); fprintf(stderr, "Fault @ %p, page %"PAGE_INDEX_FMT" (~WP) mark=%#x\n" - " mixed_region.first_page: %"PAGE_INDEX_FMT"," - " .last_page %"PAGE_INDEX_FMT"\n" + " mixed_region=%p:%p\n" " page.scan_start: %p .words_used: %u .type: %d .gen: %d\n", fault_addr, page_index, mark, - find_page_index(mixed_region->start_addr), - mixed_region->last_page, + mixed_region->start_addr, mixed_region->end_addr, page_scan_start(page_index), page_words_used(page_index), page_table[page_index].type, @@ -5266,6 +5265,14 @@ zero_all_free_ranges() /* called only by gc_and_save() */ start += page_bytes_used(i); memset(start, 0, page_end-start); } +#ifndef LISP_FEATURE_SB_THREAD + // zero the allocation regions at the start of static-space + // This gets a spurious warning: + // warning: 'memset' offset [0, 71] is out of the bounds [0, 0] [-Warray-bounds] + // which 'volatile' works around. + char * volatile region = (char*)STATIC_SPACE_START; + bzero((char*)region, 3*sizeof (struct alloc_region)); +#endif } /* Things to do before doing a final GC before saving a core (without @@ -5425,10 +5432,6 @@ gc_and_save(char *filename, boolean prepend_runtime, prepare_for_final_gc(); gencgc_alloc_start_page = 0; collect_garbage(HIGHEST_NORMAL_GENERATION+1); -#ifndef LISP_FEATURE_SB_THREAD // reset the first 8 words of static-space - gc_init_region(main_thread_mixed_region); - gc_init_region(main_thread_cons_region); -#endif /* All global allocation regions should be empty */ ASSERT_REGIONS_CLOSED(); // Enforce (rather, warn for lack of) self-containedness of the heap From 5d14ea72d35cbc5d373f3ead6918ae9082bb68bd Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 23:15:33 +0300 Subject: [PATCH 3150/4023] Typo. --- src/runtime/gc-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index f98b9160df..fbd2d5252d 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -2377,7 +2377,7 @@ scavenge_control_stack(struct thread *th) } } -#ifndef REG_CODE +#ifndef reg_CODE /* Scavenging Interrupt Contexts */ static int boxed_registers[] = BOXED_REGISTERS; From a602812ebe0a701cc6c28b539a3bc9f0ad7ce18a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 23:17:04 +0300 Subject: [PATCH 3151/4023] More typos. --- src/runtime/gc-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index fbd2d5252d..5814608a86 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -2377,7 +2377,7 @@ scavenge_control_stack(struct thread *th) } } -#ifndef reg_CODE +#ifdef reg_CODE /* Scavenging Interrupt Contexts */ static int boxed_registers[] = BOXED_REGISTERS; From 6f4cb1adde4af3ad194664d005801e703aab98da Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Apr 2022 16:17:59 -0400 Subject: [PATCH 3152/4023] Revert "Remove SB-COLD:PRESERVING-HOST-FUNCTION, RESTORE-HOST-FUNCTION." This reverts commit b08c1d1ef2812d1afa8f0a4d050e969f6b201b21. Restores buildability using prebuilts downloaded from sbcl.org --- src/code/early-extensions.lisp | 124 ++++++++++++++++++++++++++++- src/cold/set-up-cold-packages.lisp | 35 ++++++++ src/compiler/macros.lisp | 108 ------------------------- 3 files changed, 155 insertions(+), 112 deletions(-) diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index 2afd1da53c..65bc0b11a0 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -929,7 +929,121 @@ NOTE: This interface is experimental and subject to change." (unless sub-value (return (values nil t))) (setf certain? nil)))))) - +;;;; DEFPRINTER + +;;; These functions are called by the expansion of the DEFPRINTER +;;; macro to do the actual printing. +(declaim (ftype (function (symbol t stream) (values)) + defprinter-prin1 defprinter-princ)) +(defun defprinter-prin1 (name value stream) + (defprinter-prinx #'prin1 name value stream)) +(defun defprinter-princ (name value stream) + (defprinter-prinx #'princ name value stream)) +(defun defprinter-prinx (prinx name value stream) + (declare (type function prinx)) + (when *print-pretty* + (pprint-newline :linear stream)) + (format stream ":~A " name) + (funcall prinx value stream) + (values)) +(defun defprinter-print-space (stream) + (write-char #\space stream)) + +(defvar *print-ir-nodes-pretty* nil) + +;;; Define some kind of reasonable PRINT-OBJECT method for a +;;; STRUCTURE-OBJECT class. +;;; +;;; NAME is the name of the structure class, and CONC-NAME is the same +;;; as in DEFSTRUCT. +;;; +;;; The SLOT-DESCS describe how each slot should be printed. Each +;;; SLOT-DESC can be a slot name, indicating that the slot should +;;; simply be printed. A SLOT-DESC may also be a list of a slot name +;;; and other stuff. The other stuff is composed of keywords followed +;;; by expressions. The expressions are evaluated with the variable +;;; which is the slot name bound to the value of the slot. These +;;; keywords are defined: +;;; +;;; :PRIN1 Print the value of the expression instead of the slot value. +;;; :PRINC Like :PRIN1, only PRINC the value +;;; :TEST Only print something if the test is true. +;;; +;;; If no printing thing is specified then the slot value is printed +;;; as if by PRIN1. +;;; +;;; The structure being printed is bound to STRUCTURE and the stream +;;; is bound to STREAM. +;;; +;;; If PRETTY-IR-PRINTER is supplied, the form is invoked when +;;; *PRINT-IR-NODES-PRETTY* is true. +(defmacro defprinter ((name + &key + (conc-name (concatenate 'simple-string + (symbol-name name) + "-")) + identity + pretty-ir-printer) + &rest slot-descs) + (let ((first? t) + maybe-print-space + (reversed-prints nil)) + (flet ((sref (slot-name) + `(,(symbolicate conc-name slot-name) structure))) + (dolist (slot-desc slot-descs) + (if first? + (setf maybe-print-space nil + first? nil) + (setf maybe-print-space `(defprinter-print-space stream))) + (cond ((atom slot-desc) + (push maybe-print-space reversed-prints) + (push `(defprinter-prin1 ',slot-desc ,(sref slot-desc) stream) + reversed-prints)) + (t + (let ((sname (first slot-desc)) + (test t)) + (collect ((stuff)) + (do ((option (rest slot-desc) (cddr option))) + ((null option) + (push `(let ((,sname ,(sref sname))) + (when ,test + ,maybe-print-space + ,@(or (stuff) + `((defprinter-prin1 + ',sname ,sname stream))))) + reversed-prints)) + (case (first option) + (:prin1 + (stuff `(defprinter-prin1 + ',sname ,(second option) stream))) + (:princ + (stuff `(defprinter-princ + ',sname ,(second option) stream))) + (:test (setq test (second option))) + (t + (error "bad option: ~S" (first option))))))))))) + (let ((normal-printer `(pprint-logical-block (stream nil) + (print-unreadable-object (structure + stream + :type t + :identity ,identity) + ,@(nreverse reversed-prints))) )) + `(defmethod print-object ((structure ,name) stream) + ,(cond (pretty-ir-printer + `(if *print-ir-nodes-pretty* + ,pretty-ir-printer + ,normal-printer)) + (t + normal-printer)))))) + +;;; When cross-compiling, there is nothing out of the ordinary +;;; about compilling a DEFUN wrapped in PRESERVING-HOST-FUNCTION, +;;; so just remove the decoration. +#-sb-xc-host +(eval-when (:compile-toplevel) + (sb-xc:defmacro sb-cold:preserving-host-function (form) form)) + +(sb-cold:preserving-host-function (defun print-symbol-with-prefix (stream symbol &optional colon at) "For use with ~/: Write SYMBOL to STREAM as if it is not accessible from the current package." @@ -938,9 +1052,10 @@ NOTE: This interface is experimental and subject to change." ;; keywords are always printed with colons, so this guarantees that the ;; symbol will not be printed without a prefix. (let ((*package* *keyword-package*)) - (write symbol :stream stream :escape t))) + (write symbol :stream stream :escape t)))) (declaim (special sb-pretty:*pprint-quote-with-syntactic-sugar*)) +(sb-cold:preserving-host-function (defun print-type-specifier (stream type-specifier &optional colon at) (declare (ignore colon at)) ;; Binding *PPRINT-QUOTE-WITH-SYNTACTIC-SUGAR* prevents certain @@ -956,10 +1071,11 @@ NOTE: This interface is experimental and subject to change." ;; specifiers. (let ((sb-pretty:*pprint-quote-with-syntactic-sugar* nil) (*package* *cl-package*)) - (prin1 type-specifier stream))) + (prin1 type-specifier stream)))) +(sb-cold:preserving-host-function (defun print-type (stream type &optional colon at) - (print-type-specifier stream (type-specifier type) colon at)) + (print-type-specifier stream (type-specifier type) colon at))) (defun print-lambda-list (stream lambda-list &optional colon at) (declare (ignore colon at)) diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 8b9a0349ac..c8ad44d673 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -95,6 +95,41 @@ (compile 'hide-host-packages) (compile 'unhide-host-format-funs) +;;; Macro invoked from 'src/code/early-extensions' to avoid clobbering +;;; host functions that are potentially called from format strings. +(export 'preserving-host-function) +(defmacro preserving-host-function (defun) + (let ((name (second defun))) + `(progn + ;; Assume that this function got a definition from set-up-cold-packages + ;; and prevent a possible redefinition warning. + (fmakunbound ',name) + ,defun + (restore-host-function ',(string name))))) + +(defun restore-host-function (name) + (declare (ignorable name)) + #+sbcl + (let ((host-fun (second (assoc name *host-format-functions* :test #'string=)))) + (when host-fun + (if (string= name "PRINT-TYPE") + (let* ((our-fun (fdefinition (intern name "SB-IMPL"))) + (combined + (lambda (stream object &rest rest) + (let ((ours (typep object (find-symbol "CTYPE" "SB-KERNEL")))) + (apply (if ours our-fun host-fun) stream object rest))))) + (dolist (entry *host-format-functions*) + (when (string= (car entry) 'print-type) + (let ((symbol (intern name (cddr entry)))) + ;; The parallelized build performs this twice: once from + ;; interpreted load, again from compilation. + ;; So don't wrap more than once. + (unless (sb-impl::closurep (fdefinition symbol)) + (setf (fdefinition symbol) combined)))))) + (dolist (entry *host-format-functions*) + (when (string= (car entry) name) + (setf (fdefinition (intern name (cddr entry))) host-fun))))))) + ;;; an entry in the table which describes the non-standard part (i.e. not ;;; CL/CL-USER/KEYWORD) of the package structure of the SBCL system ;;; diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index 3c2d6e18de..35b792f066 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -640,114 +640,6 @@ (setf (component-last-block ,component) ,old-last-block)))))) - -;;;; DEFPRINTER - -;;; These functions are called by the expansion of the DEFPRINTER -;;; macro to do the actual printing. -(declaim (ftype (function (symbol t stream) (values)) - defprinter-prin1 defprinter-princ)) -(defun defprinter-prin1 (name value stream) - (defprinter-prinx #'prin1 name value stream)) -(defun defprinter-princ (name value stream) - (defprinter-prinx #'princ name value stream)) -(defun defprinter-prinx (prinx name value stream) - (declare (type function prinx)) - (when *print-pretty* - (pprint-newline :linear stream)) - (format stream ":~A " name) - (funcall prinx value stream) - (values)) -(defun defprinter-print-space (stream) - (write-char #\space stream)) - -(defvar *print-ir-nodes-pretty* nil) - -;;; Define some kind of reasonable PRINT-OBJECT method for a -;;; STRUCTURE-OBJECT class. -;;; -;;; NAME is the name of the structure class, and CONC-NAME is the same -;;; as in DEFSTRUCT. -;;; -;;; The SLOT-DESCS describe how each slot should be printed. Each -;;; SLOT-DESC can be a slot name, indicating that the slot should -;;; simply be printed. A SLOT-DESC may also be a list of a slot name -;;; and other stuff. The other stuff is composed of keywords followed -;;; by expressions. The expressions are evaluated with the variable -;;; which is the slot name bound to the value of the slot. These -;;; keywords are defined: -;;; -;;; :PRIN1 Print the value of the expression instead of the slot value. -;;; :PRINC Like :PRIN1, only PRINC the value -;;; :TEST Only print something if the test is true. -;;; -;;; If no printing thing is specified then the slot value is printed -;;; as if by PRIN1. -;;; -;;; The structure being printed is bound to STRUCTURE and the stream -;;; is bound to STREAM. -;;; -;;; If PRETTY-IR-PRINTER is supplied, the form is invoked when -;;; *PRINT-IR-NODES-PRETTY* is true. -(defmacro defprinter ((name - &key - (conc-name (concatenate 'simple-string - (symbol-name name) - "-")) - identity - pretty-ir-printer) - &rest slot-descs) - (let ((first? t) - maybe-print-space - (reversed-prints nil)) - (flet ((sref (slot-name) - `(,(symbolicate conc-name slot-name) structure))) - (dolist (slot-desc slot-descs) - (if first? - (setf maybe-print-space nil - first? nil) - (setf maybe-print-space `(defprinter-print-space stream))) - (cond ((atom slot-desc) - (push maybe-print-space reversed-prints) - (push `(defprinter-prin1 ',slot-desc ,(sref slot-desc) stream) - reversed-prints)) - (t - (let ((sname (first slot-desc)) - (test t)) - (collect ((stuff)) - (do ((option (rest slot-desc) (cddr option))) - ((null option) - (push `(let ((,sname ,(sref sname))) - (when ,test - ,maybe-print-space - ,@(or (stuff) - `((defprinter-prin1 - ',sname ,sname stream))))) - reversed-prints)) - (case (first option) - (:prin1 - (stuff `(defprinter-prin1 - ',sname ,(second option) stream))) - (:princ - (stuff `(defprinter-princ - ',sname ,(second option) stream))) - (:test (setq test (second option))) - (t - (error "bad option: ~S" (first option))))))))))) - (let ((normal-printer `(pprint-logical-block (stream nil) - (print-unreadable-object (structure - stream - :type t - :identity ,identity) - ,@(nreverse reversed-prints))) )) - `(defmethod print-object ((structure ,name) stream) - ,(cond (pretty-ir-printer - `(if *print-ir-nodes-pretty* - ,pretty-ir-printer - ,normal-printer)) - (t - normal-printer)))))) - ;;;; boolean attribute utilities ;;;; From 5e3f1068febf60cad54095fbd2b220c2d41364ca Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Apr 2022 23:19:24 +0300 Subject: [PATCH 3153/4023] More #ifdef struggles. --- src/runtime/gencgc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 1c5ca922a3..4421f31e23 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -4034,7 +4034,7 @@ garbage_collect_generation(generation_index_t generation, int raise, if (conservative_stack) { struct thread *th; for_each_thread(th) { -#if defined(LISP_FEATURE_MIPS) || !defined(reg_CODE) // interrupt contexts already pinned everything they see +#if !defined(LISP_FEATURE_MIPS) && defined(reg_CODE) // interrupt contexts already pinned everything they see scavenge_interrupt_contexts(th); #endif scavenge_control_stack(th); From ad9531680209893e90ec300b75b57a2a47d02e07 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 19 Apr 2022 00:13:29 +0300 Subject: [PATCH 3154/4023] arm64: remove interior-reg. --- src/assembly/arm64/array.lisp | 2 +- src/assembly/arm64/assem-rtns.lisp | 24 +++++----- src/assembly/arm64/support.lisp | 60 +++++-------------------- src/code/debug-int.lisp | 4 +- src/compiler/arm64/alloc.lisp | 14 +++--- src/compiler/arm64/arith.lisp | 12 ++--- src/compiler/arm64/array.lisp | 18 ++++---- src/compiler/arm64/c-call.lisp | 12 ++--- src/compiler/arm64/call.lisp | 70 +++++++++++++++--------------- src/compiler/arm64/cell.lisp | 18 ++++---- src/compiler/arm64/float.lisp | 6 +-- src/compiler/arm64/macros.lisp | 26 +++++------ src/compiler/arm64/memory.lisp | 2 +- src/compiler/arm64/move.lisp | 4 +- src/compiler/arm64/nlx.lisp | 2 +- src/compiler/arm64/sap.lisp | 2 +- src/compiler/arm64/show.lisp | 3 +- src/compiler/arm64/system.lisp | 5 +-- src/compiler/arm64/type-vops.lisp | 5 +-- src/compiler/arm64/vm.lisp | 8 +--- 20 files changed, 124 insertions(+), 173 deletions(-) diff --git a/src/assembly/arm64/array.lisp b/src/assembly/arm64/array.lisp index 788526c6d8..5779625ee9 100644 --- a/src/assembly/arm64/array.lisp +++ b/src/assembly/arm64/array.lisp @@ -25,7 +25,7 @@ (:temp ndescr non-descriptor-reg nl2-offset) (:temp pa-flag non-descriptor-reg nl3-offset) (:temp lra-save non-descriptor-reg nl5-offset) - (:temp lr interior-reg lr-offset)) + (:temp lr non-descriptor-reg lr-offset)) (pseudo-atomic (pa-flag) (inst lsl ndescr words (- word-shift n-fixnum-tag-bits)) (inst add ndescr ndescr (* (1+ vector-data-offset) n-word-bytes)) diff --git a/src/assembly/arm64/assem-rtns.lisp b/src/assembly/arm64/assem-rtns.lisp index 526caca796..1939fdd18c 100644 --- a/src/assembly/arm64/assem-rtns.lisp +++ b/src/assembly/arm64/assem-rtns.lisp @@ -11,7 +11,7 @@ ((:temp nvals any-reg nargs-offset) (:temp vals any-reg nl1-offset) (:temp old-fp any-reg nl2-offset) - (:temp lra interior-reg lr-offset) + (:temp lra non-descriptor-reg lr-offset) ;; These are just needed to facilitate the transfer (:temp count any-reg nl3-offset) @@ -127,7 +127,7 @@ (:temp dest any-reg nl2-offset) ;; Not live concurrent with ARGS. (:temp count any-reg nl3-offset) (:temp temp descriptor-reg r9-offset) - (:temp lip interior-reg lr-offset) + (:temp lr non-descriptor-reg lr-offset) ;; These are needed so we can get at the register args. (:temp r0 descriptor-reg r0-offset) @@ -136,8 +136,8 @@ (:temp r3 descriptor-reg r3-offset)) (prepare-for-tail-call-variable nargs args count dest temp r0 r1 r2 r3) - (loadw lip lexenv closure-fun-slot fun-pointer-lowtag) - (lisp-jump lip)) + (loadw lr lexenv closure-fun-slot fun-pointer-lowtag) + (lisp-jump lr)) #+sb-assembling (define-assembly-routine @@ -155,7 +155,7 @@ (:temp dest any-reg nl2-offset) ;; Not live concurrent with ARGS. (:temp count any-reg nl3-offset) (:temp temp descriptor-reg r9-offset) - (:temp lip interior-reg lr-offset) + (:temp lr non-descriptor-reg lr-offset) ;; These are needed so we can get at the register args. (:temp r0 descriptor-reg r0-offset) @@ -169,8 +169,8 @@ (inst b :eq call) (inst b (entry-point-label 'tail-call-symbol)) call - (loadw lip lexenv closure-fun-slot fun-pointer-lowtag) - (lisp-jump lip)) + (loadw lr lexenv closure-fun-slot fun-pointer-lowtag) + (lisp-jump lr)) #+sb-assembling (define-assembly-routine (call-symbol @@ -251,7 +251,7 @@ (:arg count (any-reg descriptor-reg) nargs-offset) (:temp ocfp any-reg ocfp-offset) (:temp cur-uwp any-reg nl2-offset) - (:temp lip interior-reg lr-offset) + (:temp lr non-descriptor-reg lr-offset) (:temp next-uwp any-reg nl3-offset) ;; for unbind-to-here (:temp where any-reg r1-offset) @@ -282,13 +282,13 @@ (loadw next-uwp cur-uwp unwind-block-uwp-slot) (store-tl-symbol-value next-uwp *current-unwind-protect-block*) - (loadw-pair cfp-tn unwind-block-cfp-slot lip unwind-block-entry-pc-slot cur-uwp) + (loadw-pair cfp-tn unwind-block-cfp-slot lr unwind-block-entry-pc-slot cur-uwp) (loadw next-uwp cur-uwp unwind-block-current-catch-slot) (store-tl-symbol-value next-uwp *current-catch-block*) (loadw-pair (make-random-tn :kind :normal :sc (sc-or-lose 'any-reg) :offset nfp-offset) unwind-block-nfp-slot next-uwp unwind-block-nsp-slot cur-uwp) (inst mov-sp nsp-tn next-uwp) - (inst br lip) + (inst br lr) RET (inst ldr count (@ csp-tn -8 :pre-index)) (inst ldp block start (@ csp-tn -16 :pre-index)) @@ -297,14 +297,14 @@ DO-EXIT (loadw where block unwind-block-bsp-slot) (unbind-to-here where symbol value tmp-tn) - (loadw-pair cfp-tn unwind-block-cfp-slot lip unwind-block-entry-pc-slot block) + (loadw-pair cfp-tn unwind-block-cfp-slot lr unwind-block-entry-pc-slot block) (loadw next-uwp block unwind-block-current-catch-slot) (store-tl-symbol-value next-uwp *current-catch-block*) (loadw-pair (make-random-tn :kind :normal :sc (sc-or-lose 'any-reg) :offset nfp-offset) unwind-block-nfp-slot next-uwp unwind-block-nsp-slot block) (inst mov-sp nsp-tn next-uwp) - (inst br lip)) + (inst br lr)) (define-vop () (:translate %continue-unwind) diff --git a/src/assembly/arm64/support.lisp b/src/assembly/arm64/support.lisp index ba6068f6a3..37b31befe0 100644 --- a/src/assembly/arm64/support.lisp +++ b/src/assembly/arm64/support.lisp @@ -15,60 +15,20 @@ (declare (ignore options vop)) (ecase style ((:none :raw) - (values - `((progn - ,@(if (eq style :none) - `((load-inline-constant tmp-tn '(:fixup ,name :assembly-routine)) - (inst blr tmp-tn)) - `((load-inline-constant lr-tn '(:fixup ,name :assembly-routine)) - (inst blr lr-tn))))) - nil)) - #+(or) - (:full-call - (let ((temp (make-symbol "TEMP")) - (jump (make-symbol "JUMP")) - (nfp-save (make-symbol "NFP-SAVE")) - (lra (make-symbol "LRA"))) + (let ((lr (gensym))) (values - `((let ((lra-label (gen-label)) - (cur-nfp (current-nfp-tn ,vop))) - (when cur-nfp - (store-stack-tn ,nfp-save cur-nfp)) - (inst compute-lra-from-code ,lra code-tn lra-label ,temp) - (note-next-instruction ,vop :call-site) - (inst lr ,jump (make-fixup ',name :assembly-routine)) - (inst mtlr ,jump) - (inst blr) - (emit-return-pc lra-label) - (note-this-location ,vop :single-value-return) - (without-scheduling () - (move csp-tn ocfp-tn) - (inst nop)) - (inst compute-code-from-lra code-tn lra-tn - lra-label ,temp) - (when cur-nfp - (load-stack-tn cur-nfp ,nfp-save)))) - `((:temporary (:scs (non-descriptor-reg) :from (:eval 0) :to (:eval 1)) - ,temp) - (:temporary (:sc descriptor-reg :offset lra-offset - :from (:eval 0) :to (:eval 1)) - ,lra) - (:temporary (:scs (control-stack) :offset nfp-save-offset) - ,nfp-save) - (:temporary (:sc any-reg) ,jump) - (:save-p :compute-only))))))) + `((progn + ,lr + ,@(if (eq style :none) + `((load-inline-constant tmp-tn '(:fixup ,name :assembly-routine)) + (inst blr tmp-tn)) + `((load-inline-constant ,lr '(:fixup ,name :assembly-routine)) + (inst blr ,lr))))) + `((:temporary (:sc non-descriptor-reg :from (:eval 0) :to (:eval 1) :offset lr-offset) + ,lr))))))) (defun generate-return-sequence (style) (ecase style (:raw `((inst br lr-tn))) - #+(or) - (:full-call - `((lisp-return (make-random-tn :kind :normal - :sc (sc-or-lose 'descriptor-reg ) - :offset lra-offset) - (make-random-tn :kind :normal - :sc (sc-or-lose 'interior-reg ) - :offset lip-offset) - :offset 2))) (:none))) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 46dadb7fd8..7d3074e96e 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -2463,7 +2463,7 @@ register." #-(or x86 x86-64) (#.sb-vm:non-descriptor-reg-sc-number (error "Local non-descriptor register access?")) - #-(or x86 x86-64) + #-(or x86 x86-64 arm64) (#.sb-vm:interior-reg-sc-number (error "Local interior register access?")) #+sb-simd-pack @@ -2701,7 +2701,7 @@ register." #-(or x86 x86-64) (#.sb-vm:non-descriptor-reg-sc-number (error "Local non-descriptor register access?")) - #-(or x86 x86-64) + #-(or x86 x86-64 arm64) (#.sb-vm:interior-reg-sc-number (error "Local interior register access?")) #+sb-simd-pack diff --git a/src/compiler/arm64/alloc.lisp b/src/compiler/arm64/alloc.lisp index 836d3df66c..93228ab826 100644 --- a/src/compiler/arm64/alloc.lisp +++ b/src/compiler/arm64/alloc.lisp @@ -17,7 +17,7 @@ (:temporary (:scs (descriptor-reg) :to (:result 0) :target result) res) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:info star cons-cells) (:results (result :scs (descriptor-reg))) (:node-var node) @@ -83,7 +83,7 @@ (define-vop (make-fdefn) (:args (name :scs (descriptor-reg) :to :eval)) (:temporary (:sc non-descriptor-reg) pa-flag temp) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (result :scs (descriptor-reg) :from :argument)) (:policy :fast-safe) (:translate make-fdefn) @@ -97,7 +97,7 @@ (define-vop (make-closure) (:info label length stack-allocate-p) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (result :scs (descriptor-reg))) (:generator 10 (let* ((size (+ length closure-info-offset)) @@ -117,7 +117,7 @@ (define-vop (make-value-cell) (:args (value :to :save :scs (descriptor-reg any-reg))) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:info stack-allocate-p) (:results (result :scs (descriptor-reg))) (:generator 10 @@ -137,7 +137,7 @@ (define-vop (make-funcallable-instance-tramp) (:args) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:results (result :scs (any-reg))) (:generator 1 (load-inline-constant result '(:fixup funcallable-instance-tramp :assembly-routine) lip))) @@ -148,7 +148,7 @@ (:ignore name) (:results (result :scs (descriptor-reg))) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:generator 4 (with-fixed-allocation (result pa-flag type words :lowtag lowtag @@ -163,7 +163,7 @@ (:results (result :scs (descriptor-reg))) (:temporary (:scs (any-reg) :from :argument) bytes) (:temporary (:sc non-descriptor-reg) pa-flag header) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:generator 6 ;; Build the object header, assuming that the header was in WORDS ;; but should not be in the header diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 5b9b44dc4a..6dd7f38415 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -1407,7 +1407,7 @@ (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1444,7 +1444,7 @@ (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1485,7 +1485,7 @@ (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1516,7 +1516,7 @@ (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1547,7 +1547,7 @@ (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1576,7 +1576,7 @@ (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) diff --git a/src/compiler/arm64/array.lisp b/src/compiler/arm64/array.lisp index b773a2eb59..749b097800 100644 --- a/src/compiler/arm64/array.lisp +++ b/src/compiler/arm64/array.lisp @@ -22,7 +22,7 @@ (:arg-types tagged-num tagged-num) (:temporary (:scs (descriptor-reg) :to (:result 0) :target result) header) (:temporary (:sc non-descriptor-reg) pa-flag ndescr) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:results (result :scs (descriptor-reg))) (:generator 5 ;; Compute the allocation size. @@ -265,14 +265,13 @@ (:arg-types ,type positive-fixnum) (:results (result :scs (unsigned-reg))) (:result-types positive-fixnum) - (:temporary (:scs (interior-reg)) lip) (:temporary (:scs (non-descriptor-reg)) temp) (:generator 20 ;; Compute the offset for the word we're interested in. (inst lsr temp index ,bit-shift) ;; Load the word in question. - (inst add lip object (lsl temp word-shift)) - (inst ldr result (@ lip + (inst add temp object (lsl temp word-shift)) + (inst ldr result (@ temp (- (* vector-data-offset n-word-bytes) other-pointer-lowtag))) ;; Compute the position of the bitfield we need. @@ -344,7 +343,7 @@ '(:target shift))) (value :scs (unsigned-reg immediate))) (:arg-types ,type positive-fixnum positive-fixnum) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:temporary (:scs (non-descriptor-reg)) temp old) ,@(unless (= bits 1) '((:temporary (:scs (non-descriptor-reg) :from (:argument 1)) shift))) @@ -395,12 +394,11 @@ (:args (object :scs (descriptor-reg)) (index :scs (unsigned-reg))) (:arg-types simple-bit-vector positive-fixnum) (:conditional :eq) - (:temporary (:scs (interior-reg)) lip) (:temporary (:scs (non-descriptor-reg)) temp x) (:generator 20 (inst lsr temp index 6) - (inst add lip object (lsl temp word-shift)) - (inst ldr x (@ lip (- (* vector-data-offset n-word-bytes) other-pointer-lowtag))) + (inst add temp object (lsl temp word-shift)) + (inst ldr x (@ temp (- (* vector-data-offset n-word-bytes) other-pointer-lowtag))) (inst lsr x x index) (inst tst x 1))) @@ -572,7 +570,7 @@ (:result-types unsigned-num) (:temporary (:sc unsigned-reg) offset) (:temporary (:sc non-descriptor-reg) sum) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg) lip) (:generator 4 (inst lsl offset index (- word-shift n-fixnum-tag-bits)) (inst add offset offset (- (* vector-data-offset n-word-bytes) @@ -597,7 +595,7 @@ (:results (result :scs (unsigned-reg) :from :load)) (:result-types unsigned-num) (:temporary (:sc unsigned-reg) offset) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg) lip) (:guard (member :arm-v8.1 *backend-subfeatures*)) (:generator 3 (inst lsl offset index (- word-shift n-fixnum-tag-bits)) diff --git a/src/compiler/arm64/c-call.lisp b/src/compiler/arm64/c-call.lisp index 7c4330d5e4..7a94e68992 100644 --- a/src/compiler/arm64/c-call.lisp +++ b/src/compiler/arm64/c-call.lisp @@ -200,7 +200,7 @@ (:args) (:arg-types (:constant simple-string)) (:info foreign-symbol) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:sc non-descriptor-reg) lip) (:results (res :scs (sap-reg))) (:result-types system-area-pointer) (:generator 2 @@ -212,7 +212,7 @@ (:args) (:arg-types (:constant simple-string)) (:info foreign-symbol) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:results (res :scs (sap-reg))) (:result-types system-area-pointer) (:generator 2 @@ -282,13 +282,15 @@ (:args (function :scs (sap-reg sap-stack)) (args :more t)) (:results (results :more t)) - (:ignore args results) + (:ignore args results lr) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:temporary (:sc any-reg :offset r9-offset :from (:argument 0) :to (:result 0)) cfunc) (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) (:temporary (:sc any-reg :offset #+darwin r8-offset #-darwin r10-offset) temp) (:temporary (:sc any-reg :offset lexenv-offset) temp2) - (:temporary (:scs (interior-reg)) lip) + + (:temporary (:scs (non-descriptor-reg)) lip) (:vop-var vop) (:generator 0 (emit-c-call vop nfp-save temp temp2 lip cfunc function)) @@ -300,7 +302,7 @@ (define-vop (call-out-named call-out) (:args (args :more t)) (:info function variadic) - (:ignore args results variadic)) + (:ignore args results variadic lr)) (define-vop (alloc-number-stack-space) (:info amount) diff --git a/src/compiler/arm64/call.lisp b/src/compiler/arm64/call.lisp index bd35958748..756706aa13 100644 --- a/src/compiler/arm64/call.lisp +++ b/src/compiler/arm64/call.lisp @@ -92,8 +92,8 @@ (store-stack-offset value frame-pointer variable-home-tn))) (define-vop (xep-allocate-frame) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:info start-lab) - (:temporary (:scs (interior-reg)) lip) (:generator 1 ;; Make sure the function is aligned, and drop a label pointing to this ;; function header. @@ -102,7 +102,7 @@ ;; Allocate function header. (inst simple-fun-header-word) (inst .skip (* (1- simple-fun-insts-offset) n-word-bytes)) - (inst str lip (@ cfp-tn (* lra-save-offset n-word-bytes))))) + (inst str lr (@ cfp-tn (* lra-save-offset n-word-bytes))))) (define-vop (xep-setup-sp) (:vop-var vop) @@ -574,7 +574,7 @@ (:temporary (:scs (descriptor-reg) :from :eval) temp) (:temporary (:scs (any-reg) :from :eval) dst) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) (:results (result :scs (descriptor-reg))) (:policy :safe) (:node-var node) @@ -811,19 +811,19 @@ (:args (old-fp) (return-pc) (vals :more t)) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:move-args :known-return) (:info val-locs) (:ignore old-fp return-pc val-locs vals) (:vop-var vop) (:generator 6 (move csp-tn cfp-tn) - (loadw-pair cfp-tn ocfp-save-offset lip lra-save-offset cfp-tn) + (loadw-pair cfp-tn ocfp-save-offset lr lra-save-offset cfp-tn) (let ((cur-nfp (current-nfp-tn vop))) (when cur-nfp (inst add nsp-tn cur-nfp (add-sub-immediate (bytes-needed-for-non-descriptor-stack-frame))))) - (lisp-return lip :known))) + (lisp-return lr :known))) ;;;; Full call: ;;; @@ -938,7 +938,7 @@ ,@(unless (eq return :tail) '((:temporary (:sc control-stack :offset nfp-save-offset) nfp-save))) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:generator ,(+ (if named 5 0) (if variable 19 1) @@ -1036,23 +1036,23 @@ (return))) ,@(case named ((t) - `((loadw lip name-pass fdefn-raw-addr-slot other-pointer-lowtag) + `((loadw lr name-pass fdefn-raw-addr-slot other-pointer-lowtag) ,(if (eq return :tail) - `(inst add lip lip 4)))) + `(inst add lr lr 4)))) (:direct - `((inst ldr lip (@ null-tn (load-store-offset (static-fun-offset fun)))) + `((inst ldr lr (@ null-tn (load-store-offset (static-fun-offset fun)))) ,(if (eq return :tail) - `(inst add lip lip 4))))) + `(inst add lr lr 4))))) (note-this-location vop :call-site) ,(if named (if (eq return :tail) - `(inst br lip) - `(inst blr lip)) + `(inst br lr) + `(inst blr lr)) (if (eq return :tail) - `(tail-call-unnamed lexenv lip fun-type) - `(call-unnamed lexenv lip fun-type)))) + `(tail-call-unnamed lexenv lr fun-type) + `(call-unnamed lexenv lr fun-type)))) ,@(ecase return (:fixed @@ -1090,7 +1090,7 @@ (:info fun-type) (:temporary (:sc any-reg :offset nl2-offset :from (:argument 0)) args) (:temporary (:sc descriptor-reg :offset lexenv-offset :from (:argument 1)) lexenv) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:ignore old-fp-arg lra-arg) (:vop-var vop) (:generator 75 @@ -1110,7 +1110,7 @@ (inst br tmp-tn))) ;;; Invoke the function-designator FUN. -(defun tail-call-unnamed (lexenv lip type) +(defun tail-call-unnamed (lexenv lr type) (case type (:symbol (load-inline-constant tmp-tn '(:fixup tail-call-symbol :assembly-routine)) @@ -1124,11 +1124,11 @@ (load-inline-constant tmp-tn '(:fixup tail-call-symbol :assembly-routine)) (inst br tmp-tn)) call - (loadw lip lexenv closure-fun-slot fun-pointer-lowtag) - (inst add lip lip 4) - (inst br lip))))) + (loadw lr lexenv closure-fun-slot fun-pointer-lowtag) + (inst add lr lr 4) + (inst br lr))))) -(defun call-unnamed (lexenv lip type) +(defun call-unnamed (lexenv lr type) (case type (:symbol (load-inline-constant tmp-tn '(:fixup call-symbol :assembly-routine)) @@ -1143,8 +1143,8 @@ (inst blr tmp-tn) (inst b ret)) call - (loadw lip lexenv closure-fun-slot fun-pointer-lowtag) - (inst blr lip) + (loadw lr lexenv closure-fun-slot fun-pointer-lowtag) + (inst blr lr) ret)))) ;;;; Unknown values return: @@ -1154,7 +1154,7 @@ (:args (old-fp) (return-pc) (value)) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:ignore value old-fp return-pc) (:vop-var vop) (:generator 6 @@ -1166,11 +1166,11 @@ ;; Interrupts leave two words of space for the new frame, so it's safe ;; to deallocate the frame before accessing OCFP/LR. (move csp-tn cfp-tn) - (loadw-pair cfp-tn ocfp-save-offset lip lra-save-offset cfp-tn) + (loadw-pair cfp-tn ocfp-save-offset lr lra-save-offset cfp-tn) ;; Clear the control stack, and restore the frame pointer. ;; Out of here. - (lisp-return lip :single-value))) + (lisp-return lr :single-value))) ;;; Do unknown-values return of a fixed number of values. The Values are ;;; required to be set up in the standard passing locations. Nvals is the @@ -1195,7 +1195,7 @@ (:temporary (:sc descriptor-reg :offset r1-offset :from (:eval 0)) r1) (:temporary (:sc descriptor-reg :offset r2-offset :from (:eval 0)) r2) (:temporary (:sc descriptor-reg :offset r3-offset :from (:eval 0)) r3) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:temporary (:sc any-reg :offset nargs-offset) nargs) (:temporary (:sc any-reg :offset ocfp-offset) val-ptr) (:vop-var vop) @@ -1208,15 +1208,15 @@ (cond ((= nvals 1) ;; Clear the control stack, and restore the frame pointer. (move csp-tn cfp-tn) - (loadw-pair cfp-tn ocfp-save-offset lip lra-save-offset cfp-tn) + (loadw-pair cfp-tn ocfp-save-offset lr lra-save-offset cfp-tn) ;; Out of here. - (lisp-return lip :single-value)) + (lisp-return lr :single-value)) (t ;; Establish the values pointer. (move val-ptr cfp-tn) ;; restore the frame pointer and clear as much of the control ;; stack as possible. - (loadw-pair cfp-tn ocfp-save-offset lip lra-save-offset cfp-tn) + (loadw-pair cfp-tn ocfp-save-offset lr lra-save-offset cfp-tn) (inst add csp-tn val-ptr (add-sub-immediate (* nvals n-word-bytes))) ;; Establish the values count. (load-immediate-word nargs (fixnumize nvals)) @@ -1225,7 +1225,7 @@ (dolist (reg (subseq (list r0 r1 r2 r3) nvals)) (move reg null-tn))) ;; And away we go. - (lisp-return lip :multiple-values))))) + (lisp-return lr :multiple-values))))) ;;; Do unknown-values return of an arbitrary number of values (passed ;;; on the stack.) We check for the common case of a single return @@ -1242,10 +1242,10 @@ (:temporary (:sc any-reg :offset nl1-offset :from (:argument 2)) vals) (:temporary (:sc any-reg :offset nargs-offset :from (:argument 3)) nvals) (:temporary (:sc descriptor-reg :offset r0-offset) r0) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:vop-var vop) (:generator 13 - (maybe-load-stack-tn lip lra-arg) + (maybe-load-stack-tn lr lra-arg) ;; Clear the number stack. (let ((cur-nfp (current-nfp-tn vop))) (when cur-nfp @@ -1260,13 +1260,13 @@ (inst ldr r0 (@ vals-arg)) (move csp-tn cfp-tn) (move cfp-tn old-fp-arg) - (lisp-return lip :single-value) + (lisp-return lr :single-value) NOT-SINGLE (move old-fp old-fp-arg) (move vals vals-arg) (move nvals nvals-arg) - (load-inline-constant tmp-tn '(:fixup return-multiple :assembly-routine) lip) + (load-inline-constant tmp-tn '(:fixup return-multiple :assembly-routine) lr) (inst br tmp-tn))) ;;; Single-stepping diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 0c17693f2e..5027a903aa 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -37,7 +37,7 @@ (new :scs (descriptor-reg any-reg))) (:info name offset lowtag) (:ignore name) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg) lip) (:results (result :scs (descriptor-reg any-reg) :from :load)) (:generator 5 (inst add-sub lip object (- (* offset n-word-bytes) lowtag)) @@ -241,7 +241,7 @@ (:results (result :scs (descriptor-reg any-reg) :from :load)) #+sb-thread (:temporary (:sc any-reg) tls-index) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg) lip) (:policy :fast-safe) (:vop-var vop) (:generator 15 @@ -283,7 +283,7 @@ (:results (result :scs (descriptor-reg any-reg) :from :load)) #+sb-thread (:temporary (:sc any-reg) tls-index) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg) lip) (:policy :fast-safe) (:vop-var vop) (:guard (member :arm-v8.1 *backend-subfeatures*)) @@ -334,7 +334,7 @@ (:translate (setf fdefn-fun)) (:args (function :scs (descriptor-reg) :target result) (fdefn :scs (descriptor-reg))) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:temporary (:scs (non-descriptor-reg)) type) (:results (result :scs (descriptor-reg))) (:generator 38 @@ -354,7 +354,7 @@ (:translate fdefn-makunbound) (:args (fdefn :scs (descriptor-reg))) (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:generator 38 (storew null-tn fdefn fdefn-fun-slot other-pointer-lowtag) (load-inline-constant temp '(:fixup undefined-tramp :assembly-routine) lip) @@ -378,7 +378,7 @@ (:temporary (:sc descriptor-reg :offset r8-offset :from (:argument 1)) alloc-tls-symbol) (:temporary (:sc non-descriptor-reg :offset nl0-offset) tls-index) (:temporary (:sc non-descriptor-reg :offset nl1-offset) free-tls-index) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) (:ignore free-tls-index) (:temporary (:scs (any-reg)) bsp) (:generator 5 @@ -581,7 +581,7 @@ (value :scs (any-reg descriptor-reg))) (:arg-types * tagged-num *) (:temporary (:scs (non-descriptor-reg)) temp card) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:temporary (:sc non-descriptor-reg) pa-flag) (:generator 10 (load-inline-constant temp `(:fixup "gc_card_table_mask" :foreign-dataref) lip) @@ -668,7 +668,7 @@ (diff :scs (unsigned-reg))) (:arg-types * positive-fixnum unsigned-num) (:temporary (:sc non-descriptor-reg) sum) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg) lip) (:results (result :scs (unsigned-reg) :from :load)) (:result-types unsigned-num) (:generator 4 @@ -692,7 +692,7 @@ (index :scs (any-reg)) (diff :scs (unsigned-reg))) (:arg-types * positive-fixnum unsigned-num) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg) lip) (:results (result :scs (unsigned-reg) :from :load)) (:result-types unsigned-num) (:guard (member :arm-v8.1 *backend-subfeatures*)) diff --git a/src/compiler/arm64/float.lisp b/src/compiler/arm64/float.lisp index c23df9b086..2be5b760d4 100644 --- a/src/compiler/arm64/float.lisp +++ b/src/compiler/arm64/float.lisp @@ -64,7 +64,7 @@ (:results (y)) (:note "float to pointer coercion") (:temporary (:sc non-descriptor-reg) flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:results (y :scs (descriptor-reg))) (:generator 13 (with-fixed-allocation (y flag @@ -167,7 +167,7 @@ (:args (x :scs (complex-single-reg) :to :save)) (:results (y :scs (descriptor-reg))) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:note "complex single float to pointer coercion") (:generator 13 (with-fixed-allocation (y pa-flag complex-single-float-widetag @@ -182,7 +182,7 @@ (:args (x :scs (complex-double-reg) :to :save)) (:results (y :scs (descriptor-reg))) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:note "complex double float to pointer coercion") (:generator 13 (with-fixed-allocation (y pa-flag complex-double-float-widetag diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp index 2e6d86f0ad..d345cccd9d 100644 --- a/src/compiler/arm64/macros.lisp +++ b/src/compiler/arm64/macros.lisp @@ -90,22 +90,20 @@ #+big-endian `(+ ,n-offset (1- n-word-bytes)))) `(inst ldrb ,n-target (@ ,n-source ,target-offset))))) -(defmacro lisp-jump (lip) - `(let ((lip ,lip)) - (aver (sc-is lip interior-reg)) - (inst add lip lip 4) - (inst br lip))) +(defmacro lisp-jump (lr) + `(progn + (inst add ,lr ,lr 4) + (inst br ,lr))) -(defmacro lisp-return (lip return-style) +(defmacro lisp-return (lr return-style) "Return to RETURN-PC." - `(let* ((lip ,lip)) - (aver (sc-is lip interior-reg)) + `(progn ;; Indicate a single-valued return by clearing the Z flag ,@(ecase return-style (:single-value '((inst cmp null-tn 0))) (:multiple-values '((inst cmp zr-tn zr-tn))) (:known)) - (inst ret lip))) + (inst ret ,lr))) ;;;; Stack TN's @@ -136,7 +134,7 @@ (once-only ((n-reg reg) (n-stack reg-or-stack)) `(sc-case ,n-reg - ((any-reg descriptor-reg interior-reg) + ((any-reg descriptor-reg non-descriptor-reg) (sc-case ,n-stack ((any-reg descriptor-reg) (move ,n-reg ,n-stack)) @@ -352,7 +350,7 @@ (:args (object :scs (descriptor-reg)) (index :scs (any-reg immediate))) (:arg-types ,type tagged-num) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:results (value :scs ,scs)) (:result-types ,el-type) (:generator 5 @@ -375,7 +373,7 @@ (index :scs (any-reg immediate)) (value :scs (,@scs zero))) (:arg-types ,type tagged-num ,el-type) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:generator 2 (sc-case index (immediate @@ -397,7 +395,7 @@ (:arg-types ,type tagged-num) (:results (value :scs ,scs)) (:result-types ,el-type) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:generator 5 ,@(multiple-value-bind (op shift) (ecase size @@ -440,7 +438,7 @@ :load-if (not (and (sc-is value immediate) (eql (tn-value value) 0))))) (:arg-types ,type tagged-num ,el-type) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:generator 5 (when (sc-is value immediate) (setf value zr-tn)) diff --git a/src/compiler/arm64/memory.lisp b/src/compiler/arm64/memory.lisp index a34f7f1d26..d754111f38 100644 --- a/src/compiler/arm64/memory.lisp +++ b/src/compiler/arm64/memory.lisp @@ -38,7 +38,7 @@ (old-value :scs (any-reg descriptor-reg)) (new-value :scs (any-reg descriptor-reg))) (:arg-types * tagged-num * *) - (:temporary (:sc interior-reg) lip) + (:temporary (:sc non-descriptor-reg) lip) (:results (result :scs (any-reg descriptor-reg) :from :load)) (:result-types *) (:variant-vars offset lowtag) diff --git a/src/compiler/arm64/move.lisp b/src/compiler/arm64/move.lisp index 1b186825a7..ea4322bf7d 100644 --- a/src/compiler/arm64/move.lisp +++ b/src/compiler/arm64/move.lisp @@ -446,7 +446,7 @@ (:results (y :scs (any-reg descriptor-reg))) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) (:note "signed word to integer coercion") (:generator 20 (move x arg) @@ -489,7 +489,7 @@ (:results (y :scs (any-reg descriptor-reg))) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) (:note "unsigned word to integer coercion") (:generator 20 (move x arg) diff --git a/src/compiler/arm64/nlx.lisp b/src/compiler/arm64/nlx.lisp index 997d6ed1a3..b96c470090 100644 --- a/src/compiler/arm64/nlx.lisp +++ b/src/compiler/arm64/nlx.lisp @@ -274,7 +274,7 @@ (:temporary (:sc descriptor-reg :offset r9-offset) saved-function) (:temporary (:sc unsigned-reg :offset r0-offset) block) (:temporary (:sc descriptor-reg :offset lexenv-offset) lexenv) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) (:temporary (:sc descriptor-reg :offset nargs-offset) nargs) (:vop-var vop) (:generator 22 diff --git a/src/compiler/arm64/sap.lisp b/src/compiler/arm64/sap.lisp index c9abe18967..5e4cad7466 100644 --- a/src/compiler/arm64/sap.lisp +++ b/src/compiler/arm64/sap.lisp @@ -30,7 +30,7 @@ (define-vop (move-from-sap) (:args (sap :scs (sap-reg) :to :save)) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:scs (non-descriptor-reg)) lip) (:results (res :scs (descriptor-reg))) (:note "SAP to pointer coercion") (:generator 20 diff --git a/src/compiler/arm64/show.lisp b/src/compiler/arm64/show.lisp index 88c24b6811..ccc5a9b3bd 100644 --- a/src/compiler/arm64/show.lisp +++ b/src/compiler/arm64/show.lisp @@ -12,7 +12,6 @@ (in-package "SB-VM") - (define-vop (print) (:args (object :scs (descriptor-reg any-reg) :target nl0)) (:results (result :scs (descriptor-reg))) @@ -20,7 +19,7 @@ (:temporary (:sc any-reg :offset nl0-offset :from (:argument 0)) nl0) (:temporary (:sc any-reg :offset r9-offset) cfunc) (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:scs (interior-reg)) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) (:vop-var vop) (:generator 100 diff --git a/src/compiler/arm64/system.lisp b/src/compiler/arm64/system.lisp index 2abd1d6883..0ff5d92b62 100644 --- a/src/compiler/arm64/system.lisp +++ b/src/compiler/arm64/system.lisp @@ -221,10 +221,9 @@ (:translate %closure-fun) (:args (function :scs (descriptor-reg))) (:results (result :scs (descriptor-reg))) - (:temporary (:scs (interior-reg)) lip) (:generator 3 - (loadw lip function closure-fun-slot fun-pointer-lowtag) - (inst add-sub result lip (- fun-pointer-lowtag (* simple-fun-insts-offset n-word-bytes))))) + (loadw result function closure-fun-slot fun-pointer-lowtag) + (inst add-sub result result (- fun-pointer-lowtag (* simple-fun-insts-offset n-word-bytes))))) ;;; (defun load-symbol-dbinfo (result symbol temp) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index 172960c12f..baaaa46e7f 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -256,7 +256,6 @@ (:info target not-p) (:args-var args) (:policy :fast-safe) - (:temporary (:scs (interior-reg)) lip) (:variant-vars comparison) (:variant :gt) (:generator 10 @@ -321,8 +320,8 @@ (inst cmp tmp-tn bignum-widetag) (inst b :ne nope)) #.(assert (= (integer-length bignum-widetag) 5)) - (inst add lip integer (lsr temp 5)) - (inst ldr temp (@ lip (- other-pointer-lowtag))) + (inst add temp integer (lsr temp 5)) + (inst ldr temp (@ temp (- other-pointer-lowtag))) (if (case comparison ((:gt :ge) not-p) (t (not not-p))) diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp index f1da2512f2..66a27887f9 100644 --- a/src/compiler/arm64/vm.lisp +++ b/src/compiler/arm64/vm.lisp @@ -186,10 +186,6 @@ (non-descriptor-reg registers :locations #.non-descriptor-regs) - ;; Pointers to the interior of objects. Used only as a temporary. - (interior-reg registers - :locations (#.lr-offset)) - ;; **** Things that can go in the floating point registers. ;; Non-Descriptor single-floats. @@ -242,9 +238,9 @@ (defregtn zr any-reg) (defregtn cfp any-reg) (defregtn csp any-reg) - (defregtn lr interior-reg) + (defregtn lr any-reg) #+sb-thread - (defregtn thread interior-reg)) + (defregtn thread any-reg)) ;;; If VALUE can be represented as an immediate constant, then return the ;;; appropriate SC number, otherwise return NIL. From 4a5b5c585709f4603e3585594ea22238b723a6f9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 19 Apr 2022 01:10:34 +0300 Subject: [PATCH 3155/4023] arm64: make LR available as a non-descriptor-reg. --- src/compiler/arm64/vm.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp index 66a27887f9..6087f8b254 100644 --- a/src/compiler/arm64/vm.lisp +++ b/src/compiler/arm64/vm.lisp @@ -81,7 +81,7 @@ r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 #-darwin r10 #-sb-thread r11 lexenv) (defregset non-descriptor-regs - nl0 nl1 nl2 nl3 nl4 nl5 nl6 nl7 nl8 nl9 nargs nfp ocfp) + nl0 nl1 nl2 nl3 nl4 nl5 nl6 nl7 nl8 nl9 nargs nfp ocfp lr) (defregset boxed-regs r0 r1 r2 r3 r4 r5 r6 From 41381686edf1430fb62535816c6eeea90a1fdedf Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Apr 2022 19:52:57 -0400 Subject: [PATCH 3156/4023] Prevent C warning about unused variables Standalone ldb redefines start+stop the world as no-ops, so the static variables for elapsed time are never used. --- src/runtime/thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 575510bb41..3fac89a4f6 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -279,7 +279,7 @@ void* read_current_thread() { extern pthread_key_t foreign_thread_ever_lispified; #endif -#if !defined COLLECT_GC_STATS && \ +#if !defined COLLECT_GC_STATS && !defined STANDALONE_LDB && \ defined LISP_FEATURE_LINUX && defined LISP_FEATURE_SB_THREAD && defined LISP_FEATURE_64_BIT #define COLLECT_GC_STATS #endif From 86e49614e51a6935643d4f86c39927113745ffc0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Apr 2022 23:52:55 -0400 Subject: [PATCH 3157/4023] Remove boxed flag from SB-LOCKLESS::LIST-NODE layout --- doc/internals-notes/eden-pages | 6 ++++++ src/code/defstruct.lisp | 4 +++- tests/lockfree-list.impure.lisp | 10 +++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/doc/internals-notes/eden-pages b/doc/internals-notes/eden-pages index 981085c1a5..70e595a601 100644 --- a/doc/internals-notes/eden-pages +++ b/doc/internals-notes/eden-pages @@ -32,6 +32,12 @@ PAGE_TYPE_EDEN_BOXED: - closure, value-cell, weak-pointer - simple-array, simple-vector-nil, simple-vector - complex-{base-string,character-string,bit-vector,vector,array} +* Lockfree list nodes should be allowed on eden boxed pages, + but we need more flag bits: one bit which says whether it can + be initially allocated to BOXED (it won't contain random bits) + and one which says whether it may be transported to BOXED. + Generations > 1 do not use scavenge methods on BOXED pages, + so it would not be allowed to have a list node there. * Differs from BOXED in that ordinary BOXED may not contain any object that demands a type-specific scavenge method. diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 07c40a0adf..1472b28a66 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -1679,7 +1679,9 @@ or they must be declared locally notinline at each call site.~@:>" ;; as a pending-deletion flag. See "src/code/target-lflist.lisp") (when (dd-custom-gc-method-p dd) (aver (eq rest :unspecific)) - (return-from calculate-dd-bitmap (values minimal-bitmap any-raw))) + ;; Pretend there are raw slots so that the layout + ;; does not get the STRICTLY-BOXED flag set. + (return-from calculate-dd-bitmap (values minimal-bitmap t))) ;; The minimal bitmap will have the least number of bits set, and the maximal ;; will have the most, but it is not always a performance improvement to prefer diff --git a/tests/lockfree-list.impure.lisp b/tests/lockfree-list.impure.lisp index 1c2abc6748..89cc00c2c4 100644 --- a/tests/lockfree-list.impure.lisp +++ b/tests/lockfree-list.impure.lisp @@ -1,9 +1,13 @@ (in-package "SB-LOCKLESS") -#-gencgc (sb-ext:exit :code 104) +(test-util:with-test (:name :layout-bits) + (dolist (type '(list-node keyed-node)) + (assert (eq (sb-kernel::dd-%element-type + (sb-kernel:find-defstruct-description type)) + '*)) + (assert (not (logtest (sb-kernel:wrapper-flags (find-layout type)) + sb-kernel::+strictly-boxed-flag+))))) -(assert (not (logtest (sb-kernel:wrapper-flags (find-layout 'keyed-node)) - sb-kernel::+strictly-boxed-flag+))) ;;; Make sure no promotions occur so that objects will be movable ;;; throughout these tests. From 96f1985b83e79e8a948e61550d9ad368342cb358 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Apr 2022 23:57:47 -0400 Subject: [PATCH 3158/4023] Remove obsolete comment --- src/compiler/info-vector.lisp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index 3c272602a6..2c394b99d6 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -90,8 +90,6 @@ ;;;;; Some stuff moved from 'globaldb.lisp': ;;; The structure constructor is never called -;;; Can't freeze theis type because INSTANCE-LENGTH is variable, -;;; but freezing would make it constant henceforth. (sb-xc:defstruct (packed-info (:predicate nil) (:constructor nil)) cells) (declaim (freeze-type packed-info)) From 6832278d130603fe77e2d3576b19a52869a18580 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 19 Apr 2022 13:00:43 -0400 Subject: [PATCH 3159/4023] Stop creating an instance of T T's layout has 0 bitmap - which I think is indisputable. It was a getting a slot vector which became orphaned in GC and would have crashed if you called STD-INSTANCE-SLOTS after that. (If anyone wants to propose a better CLASS-PROTOTYPE, I'm all ears) This probably happened around the time that class-init got moved into make-host-2 and other things changed quite a bit. --- src/pcl/class-init.lisp | 15 ++++++++++----- src/pcl/precom2.lisp | 2 ++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/pcl/class-init.lisp b/src/pcl/class-init.lisp index 54f2993436..3265427d88 100644 --- a/src/pcl/class-init.lisp +++ b/src/pcl/class-init.lisp @@ -230,9 +230,12 @@ (when (layout-for-pcl-obj-p wrapper) (setf (wrapper-slot-list wrapper) slots)) - (setq proto (if (eq meta 'funcallable-standard-class) - (allocate-standard-funcallable-instance wrapper name) - (allocate-standard-instance wrapper))) + (setq proto + (cond ((eq name t) nil) + ((eq meta 'funcallable-standard-class) + (allocate-standard-funcallable-instance wrapper name)) + (t + (allocate-standard-instance wrapper)))) (setq direct-slots (!bootstrap-make-slot-definitions @@ -437,6 +440,7 @@ (case metaclass-name (structure-class + (aver (not proto-p)) (let ((constructor-sym '|STRUCTURE-OBJECT class constructor|)) (set-slot 'defstruct-form `(defstruct (structure-object (:constructor @@ -447,10 +451,11 @@ (set-slot 'plist nil) (set-slot 'prototype (funcall constructor-sym)))) (condition-class + (aver (not proto-p)) (set-slot 'prototype (make-condition name))) (t - (set-slot 'prototype - (if proto-p proto (allocate-standard-instance wrapper))))) + (aver proto-p) + (unless (eq name 't) (set-slot 'prototype proto)))) class)) (defun !bootstrap-make-slot-definitions (name class slots wrapper effective-p) diff --git a/src/pcl/precom2.lisp b/src/pcl/precom2.lisp index 2486f36822..69a6aa15c6 100644 --- a/src/pcl/precom2.lisp +++ b/src/pcl/precom2.lisp @@ -36,6 +36,8 @@ (defun !system-class-p (x) (typep x 'sb-pcl::system-class)) +(let ((c (find-class 't))) + (assert (not (slot-boundp c 'sb-pcl::prototype)))) (let ((class (find-class 'sequence))) ;; Give the prototype a concrete prototype. It's an extra step because ;; SEQUENCE was removed from *built-in-classes* From 6cacf1ef46782545e366f99a3662e395e84e31b2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 19 Apr 2022 14:12:38 -0400 Subject: [PATCH 3160/4023] Add -std=gnu99 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Required by a recent change: gencgc.c: In function ‘pin_call_chain_and_boxed_registers’: gencgc.c:3678:9: error: ‘for’ loop initial declarations are only allowed in C99 mode for (unsigned i = 0; i < (sizeof(boxed_registers) / sizeof(int)); i++) { ^ gencgc.c:3678:9: note: use option -std=c99 or -std=gnu99 to compile your code --- src/runtime/Config.arm64-linux | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/Config.arm64-linux b/src/runtime/Config.arm64-linux index 57a3a1fee3..ff709f334a 100644 --- a/src/runtime/Config.arm64-linux +++ b/src/runtime/Config.arm64-linux @@ -25,6 +25,7 @@ endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION OS_LIBS += -lz endif +CFLAGS += -std=gnu99 ifdef LISP_FEATURE_LARGEFILE CFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 endif From a177d6f841609c63ba4109d5bd6c8f7560f8e5e1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 19 Apr 2022 14:14:32 -0400 Subject: [PATCH 3161/4023] Use Hungarian notation in autogenerated headers In particular call attention to the different signedness of layout->flags as well as being untagged. --- src/compiler/generic/genesis.lisp | 9 ++++++--- src/runtime/gc-common.c | 16 +++++++++++----- src/runtime/gc-private.h | 7 +++---- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 0b7daf32e0..9094ab4853 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3363,9 +3363,12 @@ lispobj symbol_package(struct symbol*);~%") (dolist (slot (dd-slots dd)) (let ((cell (aref names (- (dsd-index slot) sb-vm:instance-data-start))) (name (cstring (dsd-name slot)))) - (if (member (dsd-raw-type slot) '(t sb-vm:word sb-vm:signed-word)) - (rplaca cell name) - (rplacd cell name)))) + (case (dsd-raw-type slot) + ((t) (rplaca cell name)) + ;; remind C programmers which slots are untagged + (sb-vm:signed-word (rplaca cell (format nil "sw_~a" name))) + (sb-vm:word (rplaca cell (format nil "uw_~a" name))) + (t (rplacd cell name))))) (loop for slot across names do (format t " lispobj ~A;~@[ // ~A~]~%" ;; reserved word diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 5814608a86..a95ec37980 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -403,6 +403,12 @@ trans_code(struct code *code) return new_code; } +#ifdef LISP_FEATURE_64_BIT +# define layout_flags(x) x->sw_flags +#else +# define layout_flags(x) x->uw_flags +#endif + static sword_t scav_fun_pointer(lispobj *where, lispobj object) { @@ -425,7 +431,7 @@ scav_fun_pointer(lispobj *where, lispobj object) * except for the trampoline, which points to an asm routine. * This is not true for self-contained trampoline GFs though. */ struct layout* layout = (void*)native_pointer(funinstance_layout(FUNCTION(object))); - if (layout && (layout->flags & STRICTLY_BOXED_FLAG)) // 'flags' is a raw slot + if (layout && (layout_flags(layout) & STRICTLY_BOXED_FLAG)) page_type = PAGE_TYPE_BOXED, region = boxed_region; } else { /* Closures can always go on strictly boxed pages even though the @@ -544,7 +550,7 @@ static inline lispobj copy_instance(lispobj object) && bitmap.nwords == 1) page_type = PAGE_TYPE_UNBOXED, region = unboxed_region; else if (original_length < words_per_card && - (layout->flags & STRICTLY_BOXED_FLAG)) // 'flags' is a raw slot + (layout_flags(layout) & STRICTLY_BOXED_FLAG)) page_type = PAGE_TYPE_BOXED, region = boxed_region; } #endif @@ -831,15 +837,15 @@ scav_instance(lispobj *where, lispobj header) // writing it back if and only if it changed. lispobj layoutptr = instance_layout(where); if (!layoutptr) return total_nwords; // instance can't point to any data yet - struct layout *layout = LAYOUT(layoutptr); #ifdef LISP_FEATURE_METASPACE + struct layout *layout = LAYOUT(layoutptr); // layouts never move in metaspace scav1(&layout->friend, layout->friend); #else lispobj old = layoutptr; scav1(&layoutptr, layoutptr); if (layoutptr != old) instance_layout(where) = layoutptr; + struct layout *layout = LAYOUT(layoutptr); #endif - layout = LAYOUT(layoutptr); // in case it was adjusted in !METASPACE struct bitmap bitmap = get_layout_bitmap(layout); sword_t mask = bitmap.bits[0]; // there's always at least 1 bitmap word @@ -2119,7 +2125,7 @@ static boolean can_invoke_post_gc(__attribute__((unused)) struct thread* th, /* If the SB-THREAD:THREAD has a 0 for its 'struct thread', give up. * This is the same as the THREAD-ALIVE-P test. Maybe a thread that is * in the process of un-setting that slot performed this GC. */ - if (!lispthread->primitive_thread) return 0; + if (!lispthread->uw_primitive_thread) return 0; /* I don't know why we aren't in general willing to run post-GC with some or all * deferrable signals blocked. "Obviously" the idea is to run post-GC code only in diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index d57a0ae678..7e1036d318 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -270,15 +270,14 @@ static inline struct bitmap get_layout_bitmap(struct layout* layout) struct bitmap bitmap; const int layout_id_vector_fixed_capacity = 7; #ifdef LISP_FEATURE_64_BIT - sword_t depthoid = layout->flags; + sword_t depthoid = layout->sw_flags; // Depthoid is stored in the upper 4 bytes of 'flags', as a fixnum. depthoid >>= (32 + N_FIXNUM_TAG_BITS); int extra_id_words = (depthoid > layout_id_vector_fixed_capacity) ? ALIGN_UP(depthoid - layout_id_vector_fixed_capacity, 2) / 2 : 0; #else - sword_t depthoid = layout->depthoid; - depthoid >>= N_FIXNUM_TAG_BITS; + sword_t depthoid = fixnum_value(layout->depthoid); int extra_id_words = (depthoid > layout_id_vector_fixed_capacity) ? depthoid - layout_id_vector_fixed_capacity : 0; #endif @@ -484,7 +483,7 @@ static inline int instanceoid_length(lispobj header) { #endif static inline int layout_depth2_id(struct layout* layout) { - int32_t* vector = (int32_t*)&layout->id_word0; + int32_t* vector = (int32_t*)&layout->uw_id_word0; return vector[0]; } // Keep in sync with hardwired IDs in src/compiler/generic/genesis.lisp From 2fc388fbe48050c3d8b8d8edc5adaf387ad1f5f1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 19 Apr 2022 21:50:32 +0300 Subject: [PATCH 3162/4023] Fix safepoint.c --- src/runtime/safepoint.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 8b6f61650d..bc7a485334 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -625,7 +625,7 @@ static boolean can_invoke_post_gc(struct thread* th) lispobj obj = th->lisp_thread; if (!obj) return 0; struct thread_instance* lispthread = (void*)(obj - INSTANCE_POINTER_LOWTAG); - if (!lispthread->primitive_thread) return 0; + if (!lispthread->uw_primitive_thread) return 0; return 1; } @@ -910,7 +910,7 @@ wake_thread_io(struct thread * thread) void wake_thread_impl(struct thread_instance *lispthread) { - struct thread* thread = (void*)lispthread->primitive_thread; + struct thread* thread = (void*)lispthread->uw_primitive_thread; wake_thread_io(thread); if (read_TLS(THRUPTION_PENDING,thread)==T) @@ -939,7 +939,7 @@ void wake_thread_impl(struct thread_instance *lispthread) # else void wake_thread_impl(struct thread_instance *lispthread) { - struct thread *thread = (void*)lispthread->primitive_thread; + struct thread *thread = (void*)lispthread->uw_primitive_thread; struct thread *self = get_sb_vm_thread(); /* Must not and need not attempt to signal ourselves while we're the @@ -979,7 +979,7 @@ void wake_thread_impl(struct thread_instance *lispthread) odxprint(safepoints, "wake_thread_posix: kill"); /* ... and in foreign code. Push it into a safety * transition. */ - int status = pthread_kill((pthread_t)lispthread->os_thread, SIGURG); + int status = pthread_kill((pthread_t)lispthread->uw_os_thread, SIGURG); if (status) lose("wake_thread_posix: pthread_kill failed with %d", status); From a8103b9020c43dd3f3b2d49aa258fa5619f2f118 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 19 Apr 2022 22:40:45 +0300 Subject: [PATCH 3163/4023] Fix thread.c for win32. --- src/runtime/thread.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 3fac89a4f6..6ddcb20c77 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -1109,7 +1109,7 @@ uword_t create_thread(struct thread_instance* instance, lispobj start_routine) CREATE_SUSPENDED, &tid); boolean success = th->os_thread != 0; if (success) { - instance->primitive_thread = (lispobj)th; + instance->uw_primitive_thread = (lispobj)th; th->os_kernel_tid = tid; ResumeThread((HANDLE)th->os_thread); } else { @@ -1298,7 +1298,7 @@ void wake_thread(struct thread_instance* lispthread) * that leave_region safepoint will acknowledge the signal, so * there is no need to take locks, roll thread to safepoint * etc. */ - struct thread* thread = (void*)lispthread->primitive_thread; + struct thread* thread = (void*)lispthread->uw_primitive_thread; if (thread == get_sb_vm_thread()) { sb_pthr_kill(thread, 1); // can't fail check_pending_thruptions(NULL); @@ -1318,7 +1318,7 @@ void wake_thread(struct thread_instance* lispthread) #elif defined LISP_FEATURE_SB_SAFEPOINT wake_thread_impl(lispthread); #else - pthread_kill(lispthread->os_thread, SIGURG); + pthread_kill(lispthread->uw_os_thread, SIGURG); #endif } #endif From ac59596bee81443ba87b9bbb53dd99e17885eda9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 19 Apr 2022 22:41:12 +0300 Subject: [PATCH 3164/4023] arm64: don't use LIP for load-from-label. A single instruction is enough for 1MB, which is the limit for the conditional branches as well. --- src/assembly/arm64/array.lisp | 2 +- src/compiler/arm64/alloc.lisp | 40 +++++++++++++++++----------------- src/compiler/arm64/arith.lisp | 30 +++++++++++++++---------- src/compiler/arm64/array.lisp | 5 +++-- src/compiler/arm64/c-call.lisp | 16 +++++--------- src/compiler/arm64/call.lisp | 16 +++++--------- src/compiler/arm64/cell.lisp | 16 ++++++-------- src/compiler/arm64/float.lisp | 22 ++++++++++--------- src/compiler/arm64/macros.lisp | 21 +++++++----------- src/compiler/arm64/move.lisp | 10 +++++---- src/compiler/arm64/nlx.lisp | 8 +++---- src/compiler/arm64/sap.lisp | 5 +++-- src/compiler/arm64/show.lisp | 9 ++++---- 13 files changed, 98 insertions(+), 102 deletions(-) diff --git a/src/assembly/arm64/array.lisp b/src/assembly/arm64/array.lisp index 5779625ee9..7267a743d2 100644 --- a/src/assembly/arm64/array.lisp +++ b/src/assembly/arm64/array.lisp @@ -32,7 +32,7 @@ (inst and ndescr ndescr (bic-mask lowtag-mask)) ; double-word align (move lra-save lr) ;; The call to alloc_tramp will overwrite LR (allocation nil ndescr other-pointer-lowtag result - :flag-tn pa-flag :lip nil) ;; keep LR intact as per above + :flag-tn pa-flag) (move lr lra-save) (inst lsr ndescr type n-fixnum-tag-bits) diff --git a/src/compiler/arm64/alloc.lisp b/src/compiler/arm64/alloc.lisp index 93228ab826..e6e53e5f29 100644 --- a/src/compiler/arm64/alloc.lisp +++ b/src/compiler/arm64/alloc.lisp @@ -17,7 +17,8 @@ (:temporary (:scs (descriptor-reg) :to (:result 0) :target result) res) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:info star cons-cells) (:results (result :scs (descriptor-reg))) (:node-var node) @@ -52,8 +53,7 @@ (pseudo-atomic (pa-flag :sync nil :elide-if dx) (allocation 'list alloc list-pointer-lowtag res :flag-tn pa-flag - :stack-allocate-p dx - :lip lip) + :stack-allocate-p dx) (cond ((= cons-cells 1) (inst stp (maybe-load (tn-ref-tn things)) (if star @@ -83,13 +83,14 @@ (define-vop (make-fdefn) (:args (name :scs (descriptor-reg) :to :eval)) (:temporary (:sc non-descriptor-reg) pa-flag temp) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (result :scs (descriptor-reg) :from :argument)) (:policy :fast-safe) (:translate make-fdefn) (:generator 37 - (with-fixed-allocation (result pa-flag fdefn-widetag fdefn-size :lip lip) - (load-inline-constant temp '(:fixup undefined-tramp :assembly-routine) lip) + (with-fixed-allocation (result pa-flag fdefn-widetag fdefn-size) + (load-inline-constant temp '(:fixup undefined-tramp :assembly-routine)) (storew name result fdefn-name-slot other-pointer-lowtag) (storew null-tn result fdefn-fun-slot other-pointer-lowtag) (storew temp result fdefn-raw-addr-slot other-pointer-lowtag)))) @@ -97,7 +98,7 @@ (define-vop (make-closure) (:info label length stack-allocate-p) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) (:results (result :scs (descriptor-reg))) (:generator 10 (let* ((size (+ length closure-info-offset)) @@ -105,25 +106,24 @@ (pseudo-atomic (pa-flag :elide-if stack-allocate-p) (allocation nil alloc-size fun-pointer-lowtag result :flag-tn pa-flag - :stack-allocate-p stack-allocate-p - :lip lip) + :stack-allocate-p stack-allocate-p) (load-immediate-word pa-flag (logior (ash (1- size) n-widetag-bits) closure-widetag)) - (inst adr lip label (ash simple-fun-insts-offset word-shift)) - (storew-pair pa-flag 0 lip closure-fun-slot tmp-tn))))) + (inst adr lr label (ash simple-fun-insts-offset word-shift)) + (storew-pair pa-flag 0 lr closure-fun-slot tmp-tn))))) ;;; The compiler likes to be able to directly make value cells. ;;; (define-vop (make-value-cell) (:args (value :to :save :scs (descriptor-reg any-reg))) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:info stack-allocate-p) (:results (result :scs (descriptor-reg))) (:generator 10 (with-fixed-allocation (result pa-flag value-cell-widetag value-cell-size :stack-allocate-p stack-allocate-p - :lip lip :store-type-code nil) (storew-pair pa-flag 0 value value-cell-value-slot tmp-tn)))) @@ -137,10 +137,9 @@ (define-vop (make-funcallable-instance-tramp) (:args) - (:temporary (:scs (non-descriptor-reg)) lip) (:results (result :scs (any-reg))) (:generator 1 - (load-inline-constant result '(:fixup funcallable-instance-tramp :assembly-routine) lip))) + (load-inline-constant result '(:fixup funcallable-instance-tramp :assembly-routine)))) (define-vop (fixed-alloc) (:args) @@ -148,12 +147,12 @@ (:ignore name) (:results (result :scs (descriptor-reg))) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:generator 4 (with-fixed-allocation (result pa-flag type words :lowtag lowtag - :stack-allocate-p stack-allocate-p - :lip lip)))) + :stack-allocate-p stack-allocate-p)))) (define-vop (var-alloc) (:args (extra :scs (any-reg))) @@ -163,7 +162,8 @@ (:results (result :scs (descriptor-reg))) (:temporary (:scs (any-reg) :from :argument) bytes) (:temporary (:sc non-descriptor-reg) pa-flag header) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:generator 6 ;; Build the object header, assuming that the header was in WORDS ;; but should not be in the header @@ -177,5 +177,5 @@ (inst and bytes bytes (bic-mask lowtag-mask)) ;; Allocate the object and set its header (pseudo-atomic (pa-flag) - (allocation nil bytes lowtag result :flag-tn pa-flag :lip lip) + (allocation nil bytes lowtag result :flag-tn pa-flag) (storew header result 0 lowtag)))) diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 6dd7f38415..8cba9bdb9b 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -1407,7 +1407,8 @@ (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1432,7 +1433,7 @@ (inst mov high 0) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset) :lip lip) + (r pa-flag nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1444,7 +1445,8 @@ (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1473,7 +1475,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset) :lip lip) + (r pa-flag nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1485,7 +1487,8 @@ (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1504,7 +1507,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset) :lip lip) + (r pa-flag nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1516,7 +1519,8 @@ (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1535,7 +1539,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset) :lip lip) + (r pa-flag nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1547,7 +1551,8 @@ (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1564,7 +1569,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset) :lip lip) + (r pa-flag nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1576,7 +1581,8 @@ (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1597,7 +1603,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset) :lip lip) + (r pa-flag nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) diff --git a/src/compiler/arm64/array.lisp b/src/compiler/arm64/array.lisp index 749b097800..ded0008535 100644 --- a/src/compiler/arm64/array.lisp +++ b/src/compiler/arm64/array.lisp @@ -22,7 +22,8 @@ (:arg-types tagged-num tagged-num) (:temporary (:scs (descriptor-reg) :to (:result 0) :target result) header) (:temporary (:sc non-descriptor-reg) pa-flag ndescr) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (result :scs (descriptor-reg))) (:generator 5 ;; Compute the allocation size. @@ -31,7 +32,7 @@ lowtag-mask)) (inst and ndescr ndescr (bic-mask lowtag-mask)) (pseudo-atomic (pa-flag) - (allocation nil ndescr other-pointer-lowtag header :flag-tn pa-flag :lip lip) + (allocation nil ndescr other-pointer-lowtag header :flag-tn pa-flag) ;; Now that we have the space allocated, compute the header ;; value. ;; See ENCODE-ARRAY-RANK. diff --git a/src/compiler/arm64/c-call.lisp b/src/compiler/arm64/c-call.lisp index 7a94e68992..32cb2aab0d 100644 --- a/src/compiler/arm64/c-call.lisp +++ b/src/compiler/arm64/c-call.lisp @@ -200,11 +200,10 @@ (:args) (:arg-types (:constant simple-string)) (:info foreign-symbol) - (:temporary (:sc non-descriptor-reg) lip) (:results (res :scs (sap-reg))) (:result-types system-area-pointer) (:generator 2 - (load-inline-constant res `(:fixup ,foreign-symbol :foreign) lip))) + (load-inline-constant res `(:fixup ,foreign-symbol :foreign)))) (define-vop (foreign-symbol-dataref-sap) (:translate foreign-symbol-dataref-sap) @@ -212,19 +211,18 @@ (:args) (:arg-types (:constant simple-string)) (:info foreign-symbol) - (:temporary (:scs (non-descriptor-reg)) lip) (:results (res :scs (sap-reg))) (:result-types system-area-pointer) (:generator 2 - (load-inline-constant res `(:fixup ,foreign-symbol :foreign-dataref) lip) + (load-inline-constant res `(:fixup ,foreign-symbol :foreign-dataref)) (inst ldr res (@ res)))) -(defun emit-c-call (vop nfp-save temp temp2 lip cfunc function) +(defun emit-c-call (vop nfp-save temp temp2 cfunc function) (let ((cur-nfp (current-nfp-tn vop))) (when cur-nfp (store-stack-tn nfp-save cur-nfp)) (if (stringp function) - (load-inline-constant cfunc `(:fixup ,function :foreign) lip) + (load-inline-constant cfunc `(:fixup ,function :foreign)) (sc-case function (sap-reg (move cfunc function)) (sap-stack @@ -255,7 +253,7 @@ #-sb-thread (progn temp2 - (load-inline-constant temp '(:fixup "call_into_c" :foreign) lip) + (load-inline-constant temp '(:fixup "call_into_c" :foreign)) (inst blr temp)) (when cur-nfp (load-stack-tn cur-nfp nfp-save))))) @@ -289,11 +287,9 @@ (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) (:temporary (:sc any-reg :offset #+darwin r8-offset #-darwin r10-offset) temp) (:temporary (:sc any-reg :offset lexenv-offset) temp2) - - (:temporary (:scs (non-descriptor-reg)) lip) (:vop-var vop) (:generator 0 - (emit-c-call vop nfp-save temp temp2 lip cfunc function)) + (emit-c-call vop nfp-save temp temp2 cfunc function)) . #. (destroyed-c-registers)) diff --git a/src/compiler/arm64/call.lisp b/src/compiler/arm64/call.lisp index 756706aa13..c24f78ed9d 100644 --- a/src/compiler/arm64/call.lisp +++ b/src/compiler/arm64/call.lisp @@ -574,7 +574,7 @@ (:temporary (:scs (descriptor-reg) :from :eval) temp) (:temporary (:scs (any-reg) :from :eval) dst) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:results (result :scs (descriptor-reg))) (:policy :safe) (:node-var node) @@ -601,12 +601,10 @@ (lambda () ;; The size will be computed by subtracting from CSP (inst mov tmp-tn context) - (load-inline-constant dst `(:fixup listify-&rest :assembly-routine) - lip) - (inst blr dst) + (load-inline-constant lr `(:fixup listify-&rest :assembly-routine)) + (inst blr lr) (inst mov result tmp-tn) - (inst b leave-pa)) - :lip lip)) + (inst b leave-pa)))) (move result dst) (inst b ENTER) @@ -1090,7 +1088,6 @@ (:info fun-type) (:temporary (:sc any-reg :offset nl2-offset :from (:argument 0)) args) (:temporary (:sc descriptor-reg :offset lexenv-offset :from (:argument 1)) lexenv) - (:temporary (:scs (non-descriptor-reg)) lip) (:ignore old-fp-arg lra-arg) (:vop-var vop) (:generator 75 @@ -1105,8 +1102,7 @@ (load-inline-constant tmp-tn (if (eq fun-type :function) '(:fixup tail-call-variable :assembly-routine) - '(:fixup tail-call-callable-variable :assembly-routine)) - lip) + '(:fixup tail-call-callable-variable :assembly-routine))) (inst br tmp-tn))) ;;; Invoke the function-designator FUN. @@ -1266,7 +1262,7 @@ (move old-fp old-fp-arg) (move vals vals-arg) (move nvals nvals-arg) - (load-inline-constant tmp-tn '(:fixup return-multiple :assembly-routine) lr) + (load-inline-constant tmp-tn '(:fixup return-multiple :assembly-routine)) (inst br tmp-tn))) ;;; Single-stepping diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 5027a903aa..bc22a4f66a 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -343,7 +343,7 @@ (load-type type function (- fun-pointer-lowtag)) (inst cmp type simple-fun-widetag) (inst b :eq SIMPLE-FUN) - (load-inline-constant lip '(:fixup closure-tramp :assembly-routine) lip) + (load-inline-constant lip '(:fixup closure-tramp :assembly-routine)) SIMPLE-FUN (storew lip fdefn fdefn-raw-addr-slot other-pointer-lowtag) (storew function fdefn fdefn-fun-slot other-pointer-lowtag) @@ -354,10 +354,9 @@ (:translate fdefn-makunbound) (:args (fdefn :scs (descriptor-reg))) (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:scs (non-descriptor-reg)) lip) (:generator 38 (storew null-tn fdefn fdefn-fun-slot other-pointer-lowtag) - (load-inline-constant temp '(:fixup undefined-tramp :assembly-routine) lip) + (load-inline-constant temp '(:fixup undefined-tramp :assembly-routine)) (storew temp fdefn fdefn-raw-addr-slot other-pointer-lowtag))) @@ -378,7 +377,7 @@ (:temporary (:sc descriptor-reg :offset r8-offset :from (:argument 1)) alloc-tls-symbol) (:temporary (:sc non-descriptor-reg :offset nl0-offset) tls-index) (:temporary (:sc non-descriptor-reg :offset nl1-offset) free-tls-index) - (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:ignore free-tls-index) (:temporary (:scs (any-reg)) bsp) (:generator 5 @@ -398,8 +397,8 @@ (inst ldr (32-bit-reg tls-index) (tls-index-of symbol)) (inst cbnz (32-bit-reg tls-index) TLS-INDEX-VALID) (move alloc-tls-symbol symbol) - (load-inline-constant value-temp '(:fixup alloc-tls-index :assembly-routine) lip) - (inst blr value-temp))) + (load-inline-constant lr '(:fixup alloc-tls-index :assembly-routine)) + (inst blr lr))) TLS-INDEX-VALID (inst ldr value-temp (@ thread-tn tls-index)) (inst stp value-temp tls-index-reg @@ -581,10 +580,9 @@ (value :scs (any-reg descriptor-reg))) (:arg-types * tagged-num *) (:temporary (:scs (non-descriptor-reg)) temp card) - (:temporary (:scs (non-descriptor-reg)) lip) (:temporary (:sc non-descriptor-reg) pa-flag) (:generator 10 - (load-inline-constant temp `(:fixup "gc_card_table_mask" :foreign-dataref) lip) + (load-inline-constant temp `(:fixup "gc_card_table_mask" :foreign-dataref)) (inst ldr temp (@ temp)) (inst ldr (32-bit-reg temp) (@ temp)) ; 4-byte int (pseudo-atomic (pa-flag) @@ -592,7 +590,7 @@ (inst lsr card object gencgc-card-shift) (inst and card card temp) ;; Load mark table base - (load-inline-constant temp `(:fixup "gc_card_mark" :foreign-dataref) lip) + (load-inline-constant temp `(:fixup "gc_card_mark" :foreign-dataref)) (inst ldr temp (@ temp)) (inst ldr temp (@ temp)) ;; Touch the card mark byte. diff --git a/src/compiler/arm64/float.lisp b/src/compiler/arm64/float.lisp index 2be5b760d4..e91567d47d 100644 --- a/src/compiler/arm64/float.lisp +++ b/src/compiler/arm64/float.lisp @@ -64,14 +64,14 @@ (:results (y)) (:note "float to pointer coercion") (:temporary (:sc non-descriptor-reg) flag) - (:temporary (:scs (non-descriptor-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (y :scs (descriptor-reg))) (:generator 13 - (with-fixed-allocation (y flag - double-float-widetag - double-float-value-slot - :lip lip) - (storew x y double-float-value-slot other-pointer-lowtag)))) + (with-fixed-allocation (y flag + double-float-widetag + double-float-value-slot) + (storew x y double-float-value-slot other-pointer-lowtag)))) (define-move-vop move-from-double :move (double-reg) (descriptor-reg)) @@ -167,11 +167,12 @@ (:args (x :scs (complex-single-reg) :to :save)) (:results (y :scs (descriptor-reg))) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (non-descriptor-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:note "complex single float to pointer coercion") (:generator 13 (with-fixed-allocation (y pa-flag complex-single-float-widetag - complex-single-float-size :lip lip) + complex-single-float-size) (inst str x (@ y (- (* complex-single-float-data-slot n-word-bytes) other-pointer-lowtag)))))) @@ -182,11 +183,12 @@ (:args (x :scs (complex-double-reg) :to :save)) (:results (y :scs (descriptor-reg))) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (non-descriptor-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:note "complex double float to pointer coercion") (:generator 13 (with-fixed-allocation (y pa-flag complex-double-float-widetag - complex-double-float-size :lip lip) + complex-double-float-size) (inst str x (@ y (- (* complex-double-float-real-slot n-word-bytes) other-pointer-lowtag)))))) diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp index d345cccd9d..bf38c3890d 100644 --- a/src/compiler/arm64/macros.lisp +++ b/src/compiler/arm64/macros.lisp @@ -159,12 +159,12 @@ ;;; P-A FLAG-TN is also acceptable here. #+gencgc -(defun allocation-tramp (type alloc-tn size back-label lip) +(defun allocation-tramp (type alloc-tn size back-label) (if (integerp size) (load-immediate-word tmp-tn size) (inst mov tmp-tn size)) (let ((asm-routine (if (eq type 'list) 'list-alloc-tramp 'alloc-tramp))) - (load-inline-constant alloc-tn `(:fixup ,asm-routine :assembly-routine) lip)) + (load-inline-constant alloc-tn `(:fixup ,asm-routine :assembly-routine))) (inst blr alloc-tn) (inst b back-label)) @@ -173,9 +173,8 @@ (defun allocation (type size lowtag result-tn &key flag-tn stack-allocate-p - (lip (if stack-allocate-p nil (missing-arg))) overflow) - (declare (ignorable type lip)) + (declare (ignorable type)) ;; Normal allocation to the heap. (if stack-allocate-p (assemble () @@ -210,13 +209,11 @@ (allocation-tramp type result-tn size - BACK-FROM-ALLOC - lip)))))) + BACK-FROM-ALLOC)))))) (defmacro with-fixed-allocation ((result-tn flag-tn type-code size &key (lowtag other-pointer-lowtag) stack-allocate-p - (lip (missing-arg)) (store-type-code t)) &body body) "Do stuff to allocate an other-pointer object of fixed Size with a single @@ -226,14 +223,12 @@ initializes the object." (once-only ((result-tn result-tn) (flag-tn flag-tn) (type-code type-code) (size size) (lowtag lowtag) - (stack-allocate-p stack-allocate-p) - (lip lip)) + (stack-allocate-p stack-allocate-p)) `(pseudo-atomic (,flag-tn :sync ,type-code :elide-if ,stack-allocate-p) (allocation nil (pad-data-block ,size) ,lowtag ,result-tn :flag-tn ,flag-tn - :stack-allocate-p ,stack-allocate-p - :lip ,lip) + :stack-allocate-p ,stack-allocate-p) (when ,type-code (load-immediate-word ,flag-tn (compute-object-header ,size ,type-code)) ,@(and store-type-code @@ -470,11 +465,11 @@ (inst ,op ,value (@ lip (- (* ,offset n-word-bytes) ,lowtag)))))))))))) -(defun load-inline-constant (dst value &optional lip) +(defun load-inline-constant (dst value) (destructuring-bind (size . label) (register-inline-constant value) (ecase size (:qword - (inst load-from-label dst label lip))))) + (inst load-from-label dst label))))) ;;; diff --git a/src/compiler/arm64/move.lisp b/src/compiler/arm64/move.lisp index ea4322bf7d..5b8ad9b301 100644 --- a/src/compiler/arm64/move.lisp +++ b/src/compiler/arm64/move.lisp @@ -446,13 +446,14 @@ (:results (y :scs (any-reg descriptor-reg))) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) + (:ignore lr) (:note "signed word to integer coercion") (:generator 20 (move x arg) (inst adds y x x) (inst b :vc DONE) - (with-fixed-allocation (y pa-flag bignum-widetag (1+ bignum-digits-offset) :lip lip + (with-fixed-allocation (y pa-flag bignum-widetag (1+ bignum-digits-offset) :store-type-code nil) ;; TMP-TN has the untagged address coming from ALLOCATION ;; that way STP can be used on an aligned address. @@ -489,7 +490,8 @@ (:results (y :scs (any-reg descriptor-reg))) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) + (:ignore lr) (:note "unsigned word to integer coercion") (:generator 20 (move x arg) @@ -500,7 +502,7 @@ (inst b :eq DONE) (with-fixed-allocation - (y pa-flag bignum-widetag (+ 2 bignum-digits-offset) :lip lip + (y pa-flag bignum-widetag (+ 2 bignum-digits-offset) :store-type-code nil) ;; WITH-FIXED-ALLOCATION, when using a supplied type-code, ;; leaves PA-FLAG containing the computed header value. In our diff --git a/src/compiler/arm64/nlx.lisp b/src/compiler/arm64/nlx.lisp index b96c470090..94766259e0 100644 --- a/src/compiler/arm64/nlx.lisp +++ b/src/compiler/arm64/nlx.lisp @@ -274,7 +274,7 @@ (:temporary (:sc descriptor-reg :offset r9-offset) saved-function) (:temporary (:sc unsigned-reg :offset r0-offset) block) (:temporary (:sc descriptor-reg :offset lexenv-offset) lexenv) - (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) (:temporary (:sc descriptor-reg :offset nargs-offset) nargs) (:vop-var vop) (:generator 22 @@ -303,7 +303,7 @@ (storew temp block catch-block-entry-pc-slot) ;; Run any required UWPs. - (load-inline-constant tmp-tn '(:fixup unwind :assembly-routine) lip) + (load-inline-constant tmp-tn '(:fixup unwind :assembly-routine)) (inst br tmp-tn) (emit-label ENTRY-LABEL) @@ -311,6 +311,6 @@ (move lexenv saved-function) - (loadw lip lexenv closure-fun-slot fun-pointer-lowtag) - (lisp-jump lip)))) + (loadw lr lexenv closure-fun-slot fun-pointer-lowtag) + (lisp-jump lr)))) diff --git a/src/compiler/arm64/sap.lisp b/src/compiler/arm64/sap.lisp index 5e4cad7466..ccd416d7f3 100644 --- a/src/compiler/arm64/sap.lisp +++ b/src/compiler/arm64/sap.lisp @@ -30,11 +30,12 @@ (define-vop (move-from-sap) (:args (sap :scs (sap-reg) :to :save)) (:temporary (:sc non-descriptor-reg) pa-flag) - (:temporary (:scs (non-descriptor-reg)) lip) + (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) + (:ignore lr) (:results (res :scs (descriptor-reg))) (:note "SAP to pointer coercion") (:generator 20 - (with-fixed-allocation (res pa-flag sap-widetag sap-size :lip lip + (with-fixed-allocation (res pa-flag sap-widetag sap-size :store-type-code nil) (storew-pair pa-flag 0 sap sap-pointer-slot tmp-tn)))) diff --git a/src/compiler/arm64/show.lisp b/src/compiler/arm64/show.lisp index ccc5a9b3bd..02945a2a34 100644 --- a/src/compiler/arm64/show.lisp +++ b/src/compiler/arm64/show.lisp @@ -18,8 +18,7 @@ (:save-p t) (:temporary (:sc any-reg :offset nl0-offset :from (:argument 0)) nl0) (:temporary (:sc any-reg :offset r9-offset) cfunc) - (:temporary (:scs (non-descriptor-reg)) temp) - (:temporary (:sc non-descriptor-reg :offset lr-offset) lip) + (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save) (:vop-var vop) (:generator 100 @@ -27,9 +26,9 @@ (when cur-nfp (store-stack-tn nfp-save cur-nfp)) (move nl0 object) - (load-inline-constant temp '(:fixup "call_into_c" :foreign) lip) - (load-inline-constant cfunc '(:fixup "debug_print" :foreign) lip) - (inst blr temp) + (load-inline-constant lr '(:fixup "call_into_c" :foreign)) + (load-inline-constant cfunc '(:fixup "debug_print" :foreign)) + (inst blr lr) (when cur-nfp (load-stack-tn cur-nfp nfp-save)) (move result nl0)))) From f6b977e7825e7d9a0ae724698c766b4c1acdba19 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 19 Apr 2022 23:15:24 +0300 Subject: [PATCH 3165/4023] arm64: use lr for pa-flag for allocation. It is already overwritten by the call to alloc_tramp. --- src/compiler/arm64/alloc.lisp | 40 ++++++++++++++--------------------- src/compiler/arm64/arith.lisp | 30 +++++++++++--------------- src/compiler/arm64/array.lisp | 7 +++--- src/compiler/arm64/call.lisp | 5 ++--- src/compiler/arm64/cell.lisp | 6 ++---- src/compiler/arm64/float.lisp | 28 ++++++++++-------------- src/compiler/arm64/move.lisp | 18 ++++++---------- src/compiler/arm64/sap.lisp | 6 ++---- 8 files changed, 55 insertions(+), 85 deletions(-) diff --git a/src/compiler/arm64/alloc.lisp b/src/compiler/arm64/alloc.lisp index e6e53e5f29..78b46bdb96 100644 --- a/src/compiler/arm64/alloc.lisp +++ b/src/compiler/arm64/alloc.lisp @@ -16,9 +16,7 @@ (:temporary (:scs (descriptor-reg)) ptr temp) (:temporary (:scs (descriptor-reg) :to (:result 0) :target result) res) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:info star cons-cells) (:results (result :scs (descriptor-reg))) (:node-var node) @@ -50,9 +48,9 @@ (setf prev-constant nil) (load-stack-tn ,temp ,tn) ,temp))))) - (pseudo-atomic (pa-flag :sync nil :elide-if dx) + (pseudo-atomic (lr :sync nil :elide-if dx) (allocation 'list alloc list-pointer-lowtag res - :flag-tn pa-flag + :flag-tn lr :stack-allocate-p dx) (cond ((= cons-cells 1) (inst stp (maybe-load (tn-ref-tn things)) @@ -82,14 +80,13 @@ (define-vop (make-fdefn) (:args (name :scs (descriptor-reg) :to :eval)) - (:temporary (:sc non-descriptor-reg) pa-flag temp) + (:temporary (:sc non-descriptor-reg) temp) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (result :scs (descriptor-reg) :from :argument)) (:policy :fast-safe) (:translate make-fdefn) (:generator 37 - (with-fixed-allocation (result pa-flag fdefn-widetag fdefn-size) + (with-fixed-allocation (result lr fdefn-widetag fdefn-size) (load-inline-constant temp '(:fixup undefined-tramp :assembly-routine)) (storew name result fdefn-name-slot other-pointer-lowtag) (storew null-tn result fdefn-fun-slot other-pointer-lowtag) @@ -97,35 +94,33 @@ (define-vop (make-closure) (:info label length stack-allocate-p) - (:temporary (:sc non-descriptor-reg) pa-flag) + (:temporary (:scs (non-descriptor-reg)) temp) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) (:results (result :scs (descriptor-reg))) (:generator 10 (let* ((size (+ length closure-info-offset)) (alloc-size (pad-data-block size))) - (pseudo-atomic (pa-flag :elide-if stack-allocate-p) + (pseudo-atomic (lr :elide-if stack-allocate-p) (allocation nil alloc-size fun-pointer-lowtag result - :flag-tn pa-flag + :flag-tn lr :stack-allocate-p stack-allocate-p) - (load-immediate-word pa-flag + (load-immediate-word temp (logior (ash (1- size) n-widetag-bits) closure-widetag)) (inst adr lr label (ash simple-fun-insts-offset word-shift)) - (storew-pair pa-flag 0 lr closure-fun-slot tmp-tn))))) + (storew-pair temp 0 lr closure-fun-slot tmp-tn))))) ;;; The compiler likes to be able to directly make value cells. ;;; (define-vop (make-value-cell) (:args (value :to :save :scs (descriptor-reg any-reg))) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:info stack-allocate-p) (:results (result :scs (descriptor-reg))) (:generator 10 - (with-fixed-allocation (result pa-flag value-cell-widetag + (with-fixed-allocation (result lr value-cell-widetag value-cell-size :stack-allocate-p stack-allocate-p - :store-type-code nil) - (storew-pair pa-flag 0 value value-cell-value-slot tmp-tn)))) + :store-type-code nil) + (storew-pair lr 0 value value-cell-value-slot tmp-tn)))) ;;;; Automatic allocators for primitive objects. @@ -146,11 +141,9 @@ (:info name words type lowtag stack-allocate-p) (:ignore name) (:results (result :scs (descriptor-reg))) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:generator 4 - (with-fixed-allocation (result pa-flag type words + (with-fixed-allocation (result lr type words :lowtag lowtag :stack-allocate-p stack-allocate-p)))) @@ -161,9 +154,8 @@ (:ignore name stack-allocate-p) (:results (result :scs (descriptor-reg))) (:temporary (:scs (any-reg) :from :argument) bytes) - (:temporary (:sc non-descriptor-reg) pa-flag header) + (:temporary (:sc non-descriptor-reg) header) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:generator 6 ;; Build the object header, assuming that the header was in WORDS ;; but should not be in the header @@ -176,6 +168,6 @@ (inst add bytes bytes (* 2 n-word-bytes)) (inst and bytes bytes (bic-mask lowtag-mask)) ;; Allocate the object and set its header - (pseudo-atomic (pa-flag) - (allocation nil bytes lowtag result :flag-tn pa-flag) + (pseudo-atomic (lr) + (allocation nil bytes lowtag result :flag-tn lr) (storew header result 0 lowtag)))) diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 8cba9bdb9b..8a55cfaa68 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -1406,9 +1406,8 @@ (y :scs (signed-reg immediate))) (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) - (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) + (:temporary (:sc signed-reg :from (:argument 2)) header) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1433,7 +1432,7 @@ (inst mov high 0) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset)) + (r lr nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1444,9 +1443,8 @@ (y :scs (unsigned-reg immediate))) (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) - (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) + (:temporary (:sc unsigned-reg :from (:argument 2)) header) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1475,7 +1473,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset)) + (r lr nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1486,9 +1484,8 @@ (y :scs (signed-reg immediate))) (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) - (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) + (:temporary (:sc signed-reg :from (:argument 2)) header) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1507,7 +1504,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset)) + (r lr nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1518,9 +1515,8 @@ (y :scs (signed-reg immediate))) (:arg-types signed-num signed-num) (:temporary (:sc signed-reg) high low) - (:temporary (:sc signed-reg :from (:argument 2)) header pa-flag) + (:temporary (:sc signed-reg :from (:argument 2)) header) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1539,7 +1535,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset)) + (r lr nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1550,9 +1546,8 @@ (y :scs (unsigned-reg immediate))) (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) - (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) + (:temporary (:sc unsigned-reg :from (:argument 2)) header) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1569,7 +1564,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset)) + (r lr nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) @@ -1580,9 +1575,8 @@ (y :scs (unsigned-reg immediate))) (:arg-types unsigned-num unsigned-num) (:temporary (:sc unsigned-reg) high low) - (:temporary (:sc unsigned-reg :from (:argument 2)) header pa-flag) + (:temporary (:sc unsigned-reg :from (:argument 2)) header) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (r :scs (descriptor-reg))) (:policy :fast-safe) (:vop-var vop) @@ -1603,7 +1597,7 @@ (inst mov header (bignum-header-for-length 1)) allocate (with-fixed-allocation - (r pa-flag nil (+ 2 bignum-digits-offset)) + (r lr nil (+ 2 bignum-digits-offset)) (storew-pair header 0 low bignum-digits-offset tmp-tn) (storew high tmp-tn 2)) DONE)) diff --git a/src/compiler/arm64/array.lisp b/src/compiler/arm64/array.lisp index ded0008535..205194e5ca 100644 --- a/src/compiler/arm64/array.lisp +++ b/src/compiler/arm64/array.lisp @@ -21,9 +21,8 @@ (rank :scs (any-reg))) (:arg-types tagged-num tagged-num) (:temporary (:scs (descriptor-reg) :to (:result 0) :target result) header) - (:temporary (:sc non-descriptor-reg) pa-flag ndescr) + (:temporary (:sc non-descriptor-reg) ndescr) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (result :scs (descriptor-reg))) (:generator 5 ;; Compute the allocation size. @@ -31,8 +30,8 @@ (inst add ndescr ndescr (+ (* array-dimensions-offset n-word-bytes) lowtag-mask)) (inst and ndescr ndescr (bic-mask lowtag-mask)) - (pseudo-atomic (pa-flag) - (allocation nil ndescr other-pointer-lowtag header :flag-tn pa-flag) + (pseudo-atomic (lr) + (allocation nil ndescr other-pointer-lowtag header :flag-tn lr) ;; Now that we have the space allocated, compute the header ;; value. ;; See ENCODE-ARRAY-RANK. diff --git a/src/compiler/arm64/call.lisp b/src/compiler/arm64/call.lisp index c24f78ed9d..dc6bca2100 100644 --- a/src/compiler/arm64/call.lisp +++ b/src/compiler/arm64/call.lisp @@ -573,7 +573,6 @@ (:temporary (:scs (any-reg) :from (:argument 1)) count) (:temporary (:scs (descriptor-reg) :from :eval) temp) (:temporary (:scs (any-reg) :from :eval) dst) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) (:results (result :scs (descriptor-reg))) (:policy :safe) @@ -587,7 +586,7 @@ (let ((dx-p (node-stack-allocate-p node)) (leave-pa (gen-label))) - (pseudo-atomic (pa-flag :sync nil :elide-if dx-p) + (pseudo-atomic (lr :sync nil :elide-if dx-p) ;; Allocate a cons (2 words) for each item. (let ((size (cond (dx-p (lsl count (1+ (- word-shift n-fixnum-tag-bits)))) @@ -595,7 +594,7 @@ (inst lsl temp count (1+ (- word-shift n-fixnum-tag-bits))) temp)))) (allocation 'list size list-pointer-lowtag dst - :flag-tn pa-flag + :flag-tn lr :stack-allocate-p dx-p :overflow (lambda () diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index bc22a4f66a..05327adefb 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -227,11 +227,9 @@ (:translate symbol-name) (:args (symbol :scs (descriptor-reg))) (:results (result :scs (descriptor-reg))) - (:temporary (:sc non-descriptor-reg) pa-flag) (:generator 5 - (pseudo-atomic (pa-flag :sync nil) - (loadw result symbol symbol-name-slot other-pointer-lowtag) - (inst and result result (1- (ash 1 sb-impl::symbol-name-bits)))))) + (loadw tmp-tn symbol symbol-name-slot other-pointer-lowtag) + (inst and result tmp-tn (1- (ash 1 sb-impl::symbol-name-bits))))) (define-vop (%compare-and-swap-symbol-value) (:translate %compare-and-swap-symbol-value) diff --git a/src/compiler/arm64/float.lisp b/src/compiler/arm64/float.lisp index e91567d47d..28092d66df 100644 --- a/src/compiler/arm64/float.lisp +++ b/src/compiler/arm64/float.lisp @@ -63,12 +63,10 @@ (:args (x :scs (double-reg) :to :save)) (:results (y)) (:note "float to pointer coercion") - (:temporary (:sc non-descriptor-reg) flag) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (y :scs (descriptor-reg))) (:generator 13 - (with-fixed-allocation (y flag + (with-fixed-allocation (y lr double-float-widetag double-float-value-slot) (storew x y double-float-value-slot other-pointer-lowtag)))) @@ -166,32 +164,28 @@ (define-vop (move-from-complex-single) (:args (x :scs (complex-single-reg) :to :save)) (:results (y :scs (descriptor-reg))) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:note "complex single float to pointer coercion") (:generator 13 - (with-fixed-allocation (y pa-flag complex-single-float-widetag - complex-single-float-size) - (inst str x (@ y (- (* complex-single-float-data-slot - n-word-bytes) - other-pointer-lowtag)))))) + (with-fixed-allocation (y lr complex-single-float-widetag + complex-single-float-size) + (inst str x (@ y (- (* complex-single-float-data-slot + n-word-bytes) + other-pointer-lowtag)))))) (define-move-vop move-from-complex-single :move (complex-single-reg) (descriptor-reg)) (define-vop (move-from-complex-double) (:args (x :scs (complex-double-reg) :to :save)) (:results (y :scs (descriptor-reg))) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:note "complex double float to pointer coercion") (:generator 13 - (with-fixed-allocation (y pa-flag complex-double-float-widetag - complex-double-float-size) - (inst str x (@ y (- (* complex-double-float-real-slot - n-word-bytes) - other-pointer-lowtag)))))) + (with-fixed-allocation (y lr complex-double-float-widetag + complex-double-float-size) + (inst str x (@ y (- (* complex-double-float-real-slot + n-word-bytes) + other-pointer-lowtag)))))) (define-move-vop move-from-complex-double :move (complex-double-reg) (descriptor-reg)) diff --git a/src/compiler/arm64/move.lisp b/src/compiler/arm64/move.lisp index 5b8ad9b301..389b0d743c 100644 --- a/src/compiler/arm64/move.lisp +++ b/src/compiler/arm64/move.lisp @@ -445,20 +445,18 @@ (:args (arg :scs (signed-reg unsigned-reg) :target x)) (:results (y :scs (any-reg descriptor-reg))) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) - (:ignore lr) (:note "signed word to integer coercion") (:generator 20 (move x arg) (inst adds y x x) (inst b :vc DONE) - (with-fixed-allocation (y pa-flag bignum-widetag (1+ bignum-digits-offset) + (with-fixed-allocation (y lr bignum-widetag (1+ bignum-digits-offset) :store-type-code nil) ;; TMP-TN has the untagged address coming from ALLOCATION ;; that way STP can be used on an aligned address. - ;; PA-FLAG has the widetag computed by WITH-FIXED-ALLOCATION - (storew-pair pa-flag 0 x bignum-digits-offset tmp-tn)) + ;; LR has the widetag computed by WITH-FIXED-ALLOCATION + (storew-pair lr 0 x bignum-digits-offset tmp-tn)) DONE)) (define-move-vop move-from-signed :move (signed-reg) (descriptor-reg)) @@ -489,9 +487,7 @@ (:args (arg :scs (signed-reg unsigned-reg) :target x)) (:results (y :scs (any-reg descriptor-reg))) (:temporary (:scs (non-descriptor-reg) :from (:argument 0)) x) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:sc non-descriptor-reg :offset lr-offset) lr) - (:ignore lr) (:note "unsigned word to integer coercion") (:generator 20 (move x arg) @@ -502,18 +498,18 @@ (inst b :eq DONE) (with-fixed-allocation - (y pa-flag bignum-widetag (+ 2 bignum-digits-offset) + (y lr bignum-widetag (+ 2 bignum-digits-offset) :store-type-code nil) ;; WITH-FIXED-ALLOCATION, when using a supplied type-code, - ;; leaves PA-FLAG containing the computed header value. In our + ;; leaves LR containing the computed header value. In our ;; case, configured for a 2-word bignum. If the sign bit in the ;; value we're boxing is CLEAR, we need to shrink the bignum by ;; one word, hence the following: (inst tbnz x (1- n-word-bits) STORE) - (load-immediate-word pa-flag (bignum-header-for-length 1)) + (load-immediate-word lr (bignum-header-for-length 1)) STORE ;; See the comment in move-from-signed - (storew-pair pa-flag 0 x bignum-digits-offset tmp-tn)) + (storew-pair lr 0 x bignum-digits-offset tmp-tn)) DONE)) (define-move-vop move-from-unsigned :move (unsigned-reg) (descriptor-reg)) diff --git a/src/compiler/arm64/sap.lisp b/src/compiler/arm64/sap.lisp index ccd416d7f3..731695b1f4 100644 --- a/src/compiler/arm64/sap.lisp +++ b/src/compiler/arm64/sap.lisp @@ -29,15 +29,13 @@ ;;; Move an untagged SAP to a tagged representation. (define-vop (move-from-sap) (:args (sap :scs (sap-reg) :to :save)) - (:temporary (:sc non-descriptor-reg) pa-flag) (:temporary (:scs (non-descriptor-reg) :offset lr-offset) lr) - (:ignore lr) (:results (res :scs (descriptor-reg))) (:note "SAP to pointer coercion") (:generator 20 - (with-fixed-allocation (res pa-flag sap-widetag sap-size + (with-fixed-allocation (res lr sap-widetag sap-size :store-type-code nil) - (storew-pair pa-flag 0 sap sap-pointer-slot tmp-tn)))) + (storew-pair lr 0 sap sap-pointer-slot tmp-tn)))) (define-move-vop move-from-sap :move (sap-reg) (descriptor-reg)) From 3ef15e7ed53bd51ee070461a09b783d3de454ca6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 20 Apr 2022 03:20:20 +0300 Subject: [PATCH 3166/4023] arm64: add unsigned-signed comparison VOPs. --- src/compiler/arm64/arith.lisp | 46 +++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 8a55cfaa68..2276514009 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -980,6 +980,52 @@ (define-conditional-vop > :gt :hi) (define-conditional-vop eql :eq :eq) +(define-vop (<-unsigned-signed) + (:translate <) + (:args (unsigned :scs (unsigned-reg)) + (signed :scs (signed-reg))) + (:arg-types unsigned-num signed-num) + (:conditional :lo) + (:policy :fast-safe) + (:generator 7 + (inst cmp signed 0) + (inst ccmp unsigned signed :ge #b0010))) + +(define-vop (>-unsigned-signed <-unsigned-signed) + (:translate >) + (:conditional :hi)) + +(define-vop (<-signed-unsigned) + (:translate <) + (:args (signed :scs (signed-reg)) + (unsigned :scs (unsigned-reg))) + (:arg-types signed-num unsigned-num) + (:conditional :lo) + (:policy :fast-safe) + (:generator 7 + (inst cmp signed 0) + (inst ccmp signed unsigned :ge #b0000))) + +(define-vop (>-signed-unsigned <-signed-unsigned) + (:translate >) + (:conditional :hi)) + +(define-vop (eql-unsigned-signed) + (:translate eql) + (:args (unsigned :scs (unsigned-reg)) + (signed :scs (signed-reg))) + (:arg-types unsigned-num signed-num) + (:conditional :eq) + (:policy :fast-safe) + (:generator 7 + (inst cmp signed 0) + (inst ccmp unsigned signed :ge #b0000))) + +(define-vop (eql-signed-unsigned eql-unsigned-signed) + (:args (signed :scs (signed-reg)) + (unsigned :scs (unsigned-reg))) + (:arg-types signed-num unsigned-num)) + (define-vop (generic-eql/fixnum fast-if-eql/fixnum) (:args (x :scs (any-reg descriptor-reg)) (y :scs (any-reg))) From b430f314c93aa3fbd303614a8a162d113d879073 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 20 Apr 2022 03:46:44 +0300 Subject: [PATCH 3167/4023] arm64: add (eq signed unsigned) VOPs. --- src/compiler/arm64/arith.lisp | 8 ++++++++ src/compiler/arm64/pred.lisp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 2276514009..2340c5a658 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -1026,6 +1026,14 @@ (unsigned :scs (unsigned-reg))) (:arg-types signed-num unsigned-num)) +(define-vop (eq-unsigned-signed eql-unsigned-signed) + (:variant-cost 6) + (:translate eq)) + +(define-vop (eq-signed-unsigned eql-signed-unsigned) + (:variant-cost 6) + (:translate eq)) + (define-vop (generic-eql/fixnum fast-if-eql/fixnum) (:args (x :scs (any-reg descriptor-reg)) (y :scs (any-reg))) diff --git a/src/compiler/arm64/pred.lisp b/src/compiler/arm64/pred.lisp index b436d11a56..853af0468c 100644 --- a/src/compiler/arm64/pred.lisp +++ b/src/compiler/arm64/pred.lisp @@ -129,7 +129,7 @@ (:conditional :eq) (:policy :fast-safe) (:translate eq) - (:generator 6 + (:generator 7 (let ((value (sc-case y (immediate (let ((value (tn-value y))) From 11311a6977666efdc4315df84e6d51d738438aec Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 20 Apr 2022 12:18:31 -0400 Subject: [PATCH 3168/4023] Do a cleanup, a fix, and a rename * Remove gc_allocate_dirty. It works to not prezero, no more proof needed. * MAKE-LAYOUT needs %MAKE-INSTANCE/MIXED though it doesn't matter yet as all backends currently allocate _only_ to the mixed region. * Change 'i' to 'gen_num' in write_generation_stats. --- contrib/asdf-stub.lisp | 2 -- src/code/target-defstruct.lisp | 2 +- src/runtime/cheneygc.c | 9 ----- src/runtime/gencgc.c | 61 ++++++++-------------------------- 4 files changed, 14 insertions(+), 60 deletions(-) diff --git a/contrib/asdf-stub.lisp b/contrib/asdf-stub.lisp index 9068489215..c6da6cc6fe 100644 --- a/contrib/asdf-stub.lisp +++ b/contrib/asdf-stub.lisp @@ -1,5 +1,3 @@ -#+gencgc (setf (extern-alien "gc_allocate_dirty" char) 1) - (setq *compile-print* nil) sb-ext::(declaim (muffle-conditions compiler-note)) (require :asdf) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 83448aab44..5139874751 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -50,7 +50,7 @@ (nwords (+ fixed-words extra-id-words bitmap-words)) (layout (truly-the sb-vm:layout - #-(or metaspace immobile-space) (%make-instance nwords) + #-(or metaspace immobile-space) (%make-instance/mixed nwords) #+metaspace (sb-vm::allocate-metaspace-chunk (1+ nwords)) #+(and immobile-space (not metaspace)) (sb-vm::alloc-immobile-fixedobj diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index 7f1f1ba874..d20bcbc948 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -91,15 +91,6 @@ lispobj copy_possibly_large_object(lispobj object, sword_t nwords, return gc_copy_object(object, nwords, 0, 0); } -/* - * This flag is needed for compatibility with gencgc. - * In theory, it says to splat a nonzero byte pattern over newly allocated - * memory before giving the block to Lisp, to verify that Lisp is able to deal - * with non-pre-zeroed memory. - * In practice, that's not how cheneygc works. - */ -char gc_allocate_dirty = 0; - #if 0 static void verify_range(int purified, lispobj *base, lispobj *end); void show_spaces() diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 4421f31e23..da1b9ab8a4 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -438,7 +438,7 @@ write_generation_stats(FILE *file) "Gen Boxed Cons Raw Code SmMix Mixed LgRaw LgCode LgMix" " Waste%% Alloc Trig Dirty GCs Mem-age\n"); - generation_index_t i, begin, end; + generation_index_t gen_num, begin, end; // Print from the lowest gen that has any allocated pages. for (begin = 0; begin <= PSEUDO_STATIC_GENERATION; ++begin) if (generations[begin].bytes_allocated) break; @@ -448,13 +448,13 @@ write_generation_stats(FILE *file) page_index_t coltot[9]; memset(coltot, 0, sizeof coltot); - for (i = begin; i <= end; i++) { + for (gen_num = begin; gen_num <= end; gen_num++) { page_index_t page; page_index_t pagect[9]; memset(pagect, 0, sizeof pagect); for (page = 0; page < next_free_page; page++) - if (!page_free_p(page) && page_table[page].gen == i) { + if (!page_free_p(page) && page_table[page].gen == gen_num) { int column; switch (page_table[page].type & (SINGLE_OBJECT_FLAG|PAGE_TYPE_MASK)) { case PAGE_TYPE_BOXED: column = 0; break; @@ -471,25 +471,25 @@ write_generation_stats(FILE *file) pagect[column]++; coltot[column]++; } - struct generation* gen = &generations[i]; - gc_assert(gen->bytes_allocated == count_generation_bytes_allocated(i)); + struct generation* gen = &generations[gen_num]; + gc_assert(gen->bytes_allocated == count_generation_bytes_allocated(gen_num)); page_index_t tot_pages, n_dirty; - tot_pages = count_generation_pages(i, &n_dirty); - uword_t waste = npage_bytes(tot_pages) - generations[i].bytes_allocated; + tot_pages = count_generation_pages(gen_num, &n_dirty); + uword_t waste = npage_bytes(tot_pages) - generations[gen_num].bytes_allocated; double pct_waste = tot_pages > 0 ? (double)waste / (double)npage_bytes(tot_pages) * 100 : 0.0; fprintf(file, " %d %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT" %6.1f %11"OS_VM_SIZE_FMT" %11"OS_VM_SIZE_FMT, - i, + gen_num, pagect[0], pagect[1], pagect[2], pagect[3], pagect[4], pagect[5], pagect[6], pagect[7], pagect[8], pct_waste, (uintptr_t)gen->bytes_allocated, (uintptr_t)gen->gc_trigger); // gen0 pages are never WPed - fprintf(file, i==0?" -" : " %7"PAGE_INDEX_FMT, n_dirty); - fprintf(file, " %3d %7.4f\n", gen->num_gc, generation_average_age(i)); + fprintf(file, gen_num==0?" -" : " %7"PAGE_INDEX_FMT, n_dirty); + fprintf(file, " %3d %7.4f\n", gen->num_gc, generation_average_age(gen_num)); } double frac = 100 * (double)bytes_allocated / (double)dynamic_space_size; fprintf(file, @@ -684,7 +684,7 @@ static inline void zero_pages(page_index_t start, page_index_t end) { #ifdef LISP_FEATURE_DARWIN_JIT zero_range_with_mmap(page_address(start), npage_bytes(1+end-start)); #else - fast_bzero(page_address(start), npage_bytes(1+end-start)); + fast_bzero(page_address(start), npage_bytes(1+end-start)); #endif } /* Zero the address range from START up to but not including END */ @@ -693,22 +693,9 @@ static inline void zero_range(char* start, char* end) { fast_bzero(start, end-start); } -// A robustness testing flag: when true, pages claimed for purpose of the current -// GC cycle are prefilled with garbage bytes instead of zeroes. -// This is fine for GC because it always uses memcpy() from the old data. -// Lisp never directly requests unboxed pages, so this is always acceptable -// on unboxed pages. Lisp does directly request pages of code, but the code allocator -// is compatible with the non-prezeroing convention. -// The last case is boxed pages- we can only do this on boxed pages that will be -// consumed by GC and only by GC (i.e. not pages that were either directly -// allocated by lisp, or whose tail could be picked up by lisp) -// This could be made to work for those pages as well if we remember which pages -// haven't been fully used prior to returning to lisp, and then zero-filling -// any unused bytes just in case lisp picks up the remaining part of the page. -char gc_allocate_dirty = 0; /* The generation currently being allocated to. */ static generation_index_t gc_alloc_generation; -static const char * const page_type_description[8] = +__attribute__((unused)) static const char * const page_type_description[8] = {0, "unboxed", "boxed", "mixed", "sm_mix", "cons", "?", "code"}; /* Zero the pages from START to END (inclusive), except for those @@ -740,29 +727,7 @@ void zero_dirty_pages(page_index_t start, page_index_t end, int page_type) { (page_type == PAGE_TYPE_MIXED && usable_by_lisp) || page_type == 0; #endif - if (gc_allocate_dirty) { // For testing only -#ifdef LISP_FEATURE_64_BIT - lispobj word = 0x100 | 5; -#else - lispobj word = 0x100 | 2; -#endif - if (must_zero) - for (i = start; i <= end; i++) - zero_pages(i, i); - else - for (i = start; i <= end; i++) { - // Write every word with a widetag which if scavenged inavertentiy would call scav_lose(). - // This is purely for testing that the lisp side can deal with unzeroed code pages. - // Non-code unboxed pages won't been seen by lisp allocation routines. - lispobj *where = (lispobj*)page_address(i); - lispobj *limit = (lispobj*)((char*)where + GENCGC_PAGE_BYTES); - if (gc_allocate_dirty > 1) - fprintf(stderr, "dirtying g%d %s %d (%p..%p) [%d->%d]\n", - gc_alloc_generation, page_type_description[page_type], - (int)i, where, limit, from_space, new_space); - while (where < limit) *where++ = word; - } - } else if (must_zero) { + if (must_zero) { // look for contiguous ranges. This is probably without merit, since bzero // does not go significantly faster for 2 pages than for 1 page and 1 page. for (i = start; i <= end; i++) { From b5e7d0e58d82c12f5e7c6acb22ec0dbd42985fb0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 21 Apr 2022 01:37:45 +0300 Subject: [PATCH 3169/4023] arm64: add a vop for (signed-byte-64-p unsigned) Just need to check of it's not a negative number. --- src/compiler/arm64/type-vops.lisp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index baaaa46e7f..50e9cee9c1 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -174,6 +174,15 @@ (inst b (if not-p :ne :eq) target)))) not-target)) +(define-vop (signed-byte-64-p/unsigned) + (:args (value :scs (unsigned-reg))) + (:arg-types unsigned-num) + (:conditional :eq) + (:policy :fast-safe) + (:translate signed-byte-64-p) + (:generator 5 + (inst tst value (ash 1 (1- n-word-bits))))) + ;;; An (UNSIGNED-BYTE 64) can be represented with either a positive ;;; fixnum, a bignum with exactly one positive digit, or a bignum with ;;; exactly two digits and the second digit all zeros. @@ -195,7 +204,7 @@ (fixnum-p (move temp value))) (when fixnum-p - (%test-fixnum temp nil fixnum nil)) + (%test-fixnum temp nil fixnum nil)) (unless other-pointer-p (inst cmp (32-bit-reg temp) other-pointer-lowtag) (inst b :ne nope)) @@ -225,7 +234,7 @@ (values)) NOT-TARGET)) -(define-vop (fixnump/unsigned-byte-64) +(define-vop (fixnump/unsigned) (:policy :fast-safe) (:args (value :scs (unsigned-reg))) (:arg-types unsigned-num) @@ -236,7 +245,7 @@ n-positive-fixnum-bits))) n-positive-fixnum-bits)))) -(define-vop (fixnump/signed-byte-64) +(define-vop (fixnump/signed) (:args (value :scs (signed-reg))) (:policy :fast-safe) (:conditional :vc) From 7b9b4d2dedf4b8259ff2de975034a1a4031beed2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 20 Apr 2022 20:11:00 -0400 Subject: [PATCH 3170/4023] Delete obsolete file I started to update it but then came to the conclusion that it is naught but maintenance burden. It's not as its contents will lead us to discovering elusive thread-related bugs at this point. --- doc/internals-notes/threading-specials | 1018 ------------------------ 1 file changed, 1018 deletions(-) delete mode 100644 doc/internals-notes/threading-specials diff --git a/doc/internals-notes/threading-specials b/doc/internals-notes/threading-specials deleted file mode 100644 index dada7f793e..0000000000 --- a/doc/internals-notes/threading-specials +++ /dev/null @@ -1,1018 +0,0 @@ -Things in SBCL that look like special variables (list created by -(apropos "*")) and could conceivably indicate potental thread safety -issues. Organised by functional area. - -The goals are - - (1) classify the unclassified symbols (in such a way as to - make sense for 2) - - (2) read through the subsystems identified looking for places - where global state is mutated. Use this list of symbols as a - guide, but be open to the possibility that other state - (e.g. closures, foreign variables) is touched too. - - When looking at a particular symbol, please annotate it in - this file when you figure out what it's for and how it's - changed. To give us some confidence that we have reasonable - coverage, please don't just delete it if it looks ok. Symbols - shoud only be deleted here if they're obviously not specials - at all (e.g. functions with * in their names), or if the same - commit actually rids SBCL of the symbol itself. Otherwise, - just add a comment saying "read-only" or "unused" or whatever. - - (3) anything else that comes to mind as potential trouble - spots. Global state in closures, etc etc - - (4) suggest strategies (e.g. rewrites of affected code, suitable - locks and lock acquisition/release places) to fix the issues - revealed in (2) and (3) - - (5) implement same - - Candidates may attempt any of the above simultaneously. - Points will be awarded for style - - -Summary so far: - -= loop -= PCL (probably ok if PCL authors did *without-interrupts* right) -= debugger -= profiler -= disassembler -= assembler (I assume protected by *big-compiler-lock*) -= unix interface (apparently ok) -= toplevel/environment stuff -= the formatter & pretty printer (two vars need checking) -= compiler (protected by *big-compiler-lock*) -= fasloader (protected by *big-compiler-lock*) -= runtime stuff - gc, control stacks, interrupts etc -= backend constants -= dead -= unclassified - -================== - -= loop - -I suspect that stuff in sb-loop is only ever frobbed at -macroexpand/compile time anyway, so covered by *big-compiler-lock*. -Haven't thought about this too hard, though - -SB-LOOP::*LOOP-BODY* -SB-LOOP::*LOOP-DESETQ-TEMPORARY* -SB-LOOP::*LOOP-INSIDE-CONDITIONAL* -SB-LOOP::*LOOP-EPILOGUE* -SB-LOOP::*LOOP-ANSI-UNIVERSE* - -= PCL - -Critical parts of PCL are protected by *world-lock* (particularly -those dealing with class graph changes), and some with finer-grained locks. - -accesses locked with a nice granularity - SB-PCL::*CLASSOID-CELLS* - -read-only & safe: - SB-PCL::*BUILT-IN-TYPEP-COST* - SB-PCL::*CACHE-EXPAND-THRESHOLD* - SB-PCL::*CACHE-LOOKUP-COST* - SB-PCL::*CASE-TABLE-LIMIT* - SB-PCL::*CHECK-CACHE-P* - SB-PCL::*COMPUTE-STD-CPL-CLASS->ENTRY-TABLE-SIZE* - SB-PCL::*EQ-CASE-TABLE-LIMIT* - SB-PCL::*NON-BUILT-IN-TYPEP-COST* - SB-PCL::*NON-VAR-DECLARATIONS* - SB-PCL::*SECONDARY-DFUN-CALL-COST* - SB-PCL::*SGF-WRAPPER* - SB-PCL::*STRUCTURE-TYPEP-COST* - SB-PCL::*UNSPECIFIC-ARG* - SB-PCL::*VAR-DECLARATIONS-WITH-ARG* - SB-PCL::*WRAPPER-OF-COST* - -bound & safe: - SB-PCL::*ALLOW-FORWARD-REFERENCED-CLASSES-IN-CPL-P* - SB-PCL::*IN-OBSOLETE-INSTANCE-TRAP* - SB-PCL::*PRECOMPILING-LAP* - SB-PCL::*CACHE-MISS-VALUES-STACK* - -protected by PCL-LOCK: - SB-PCL::*PREVIOUS-NWRAPPERS* - -believed protected by the compiler-lock: - SB-PCL::*ALL-CTORS* - SB-PCL::*FGENS* - SB-PCL::*SGF-DFUN-STATE-INDEX* - SB-PCL::*VAR-DECLARATIONS-WITHOUT-ARG* - -potentially unsafe: - SB-PCL::*CLASS-EQ-SPECIALIZER-METHODS* - SB-PCL::*EFFECTIVE-METHOD-CACHE* - SB-PCL::*EQL-SPECIALIZER-METHODS* - SB-PCL::*METHOD-FUNCTION-PLIST* - SB-PCL::*PV-KEY-TO-PV-TABLE-TABLE* - SB-PCL::*PV-TABLE-CACHE-UPDATE-INFO* - SB-PCL::*PVS* - SB-PCL::*SLOT-NAME-LISTS-INNER* - SB-PCL::*SLOT-NAME-LISTS-OUTER* - -debugging / profiling -- low relevance: - SB-PCL::*DFUN-COUNT* - SB-PCL::*ALLOW-EMF-CALL-TRACING-P* - -build-options and bootstrap machinery -- irrelevant for user-code: - SB-PCL::*ALLOW-EXPERIMENTAL-SPECIALIZERS-P* - SB-PCL::*BOOT-STATE* ; pseudoconstant in finished lisp (not in bootstrap) - SB-PCL::*BUILT-IN-CLASS-SYMBOLS* - SB-PCL::*BUILT-IN-CLASSES* - SB-PCL::*BUILT-IN-WRAPPER-SYMBOLS* - SB-PCL::*CHECKING-OR-CACHING-LIST* - -;;; global, frobbed on generic function -;;; initialization/reinitialization, method precomputation, and -;;; compute-effective-method. Potentially unsafe, may be OK because -;;; of *pcl-lock*, but could easily be liable to races. - -SB-PCL::*CONDITION-SETF-SLOT-VALUE-USING-CLASS-METHOD* -SB-PCL::*CONDITION-SLOT-BOUNDP-USING-CLASS-METHOD* -SB-PCL::*CONDITION-SLOT-VALUE-USING-CLASS-METHOD* -SB-PCL::*CREATE-CLASSES-FROM-INTERNAL-STRUCTURE-DEFINITIONS-P* -SB-PCL::*DFUN-ARG-SYMBOLS* -SB-PCL::*DFUN-CONSTRUCTORS* -SB-PCL::*DFUN-LIST* -SB-PCL::*DFUN-MISS-GFS-ON-STACK* -SB-PCL::*EARLY-CLASS-DEFINITIONS* -SB-PCL::*EARLY-CLASS-PREDICATES* -SB-PCL::*EARLY-CLASS-SLOTS* -SB-PCL::*EARLY-P* -SB-PCL::*EMF-CALL-TRACE* -SB-PCL::*EMF-CALL-TRACE-INDEX* -SB-PCL::*EMF-CALL-TRACE-SIZE* -SB-PCL::*EMIT-FUNCTION-P* -SB-PCL::*ENABLE-DFUN-CONSTRUCTOR-CACHING* -SB-PCL::*ENABLE-EMF-CALL-TRACING-P* -SB-PCL::*EQL-SPECIALIZER-TABLE* -SB-PCL::*GLOBAL-EFFECTIVE-METHOD-GENSYMS* -SB-PCL::*IN-GF-ARG-INFO-P* -SB-PCL::*IN-PRECOMPUTE-EFFECTIVE-METHODS-P* -SB-PCL::*INITFUNCTIONS-FOR-THIS-DEFCLASS* -SB-PCL::*INTERNAL-PCL-GENERALIZED-FUN-NAME-SYMBOLS* -SB-PCL::*LAZY-DFUN-COMPUTE-P* -SB-PCL::*LONG-METHOD-COMBINATION-FUNCTIONS* -SB-PCL::*MINIMUM-CACHE-SIZE-TO-LIST* -SB-PCL::*NAME->CLASS->SLOTD-TABLE* -SB-PCL::*NEW-CLASS* -SB-PCL::*NORMALIZE-TYPE -SB-PCL::*NOT-IN-CACHE* -SB-PCL::*OLD-C-A-M-GF-METHODS* -SB-PCL::*OPTIMIZE-CACHE-FUNCTIONS-P* -SB-PCL::*OPTIMIZE-SPEED* -SB-PCL::*PCL-CLASS-BOOT* -SB-PCL::*PCL-LOCK* ; protecting the rest -SB-PCL::*PCL-PACKAGE* -SB-PCL::*RAISE-METATYPES-TO-CLASS-P* -SB-PCL::*READERS-FOR-THIS-DEFCLASS* -SB-PCL::*REBOUND-EFFECTIVE-METHOD-GENSYMS* -SB-PCL::*SGF-ARG-INFO-INDEX* -SB-PCL::*SGF-METHOD-CLASS-INDEX* -SB-PCL::*SGF-METHODS-INDEX* -SB-PCL::*SGF-NAME-INDEX* -SB-PCL::*SGF-SLOTS-INIT* -SB-PCL::*SHOW-MAKE-UNORDERED-METHODS-EMF-CALLS* -SB-PCL::*SLOT-NAMES-FOR-THIS-DEFCLASS* -SB-PCL::*SLOT-VECTOR-SYMBOLS* -SB-PCL::*STANDARD-CLASSES* -SB-PCL::*STANDARD-METHOD-COMBINATION* -SB-PCL::*STANDARD-SETF-SLOT-VALUE-USING-CLASS-METHOD* -SB-PCL::*STANDARD-SLOT-BOUNDP-USING-CLASS-METHOD* -SB-PCL::*STANDARD-SLOT-LOCATIONS* -SB-PCL::*STANDARD-SLOT-VALUE-USING-CLASS-METHOD* -SB-PCL::*STD-CAM-METHODS* -SB-PCL::*STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD* -SB-PCL::*STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD* -SB-PCL::*STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD* -SB-PCL::*SUBTYPEP -SB-PCL::*THE-CLASS-ARRAY* -SB-PCL::*THE-CLASS-BASE-CHAR* -SB-PCL::*THE-CLASS-BIGNUM* -SB-PCL::*THE-CLASS-BIT-VECTOR* -SB-PCL::*THE-CLASS-BUILT-IN-CLASS* -SB-PCL::*THE-CLASS-CHARACTER* -SB-PCL::*THE-CLASS-CLASS* -SB-PCL::*THE-CLASS-CLASS-EQ-SPECIALIZER* -SB-PCL::*THE-CLASS-CLASS-PROTOTYPE-SPECIALIZER* -SB-PCL::*THE-CLASS-CODE-COMPONENT* -SB-PCL::*THE-CLASS-COMPLEX* -SB-PCL::*THE-CLASS-COMPLEX-DOUBLE-FLOAT* -SB-PCL::*THE-CLASS-COMPLEX-SINGLE-FLOAT* -SB-PCL::*THE-CLASS-CONDITION* -SB-PCL::*THE-CLASS-CONDITION-CLASS* -SB-PCL::*THE-CLASS-CONDITION-DIRECT-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-CONDITION-EFFECTIVE-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-CONDITION-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-CONS* -SB-PCL::*THE-CLASS-DEFINITION-SOURCE-MIXIN* -SB-PCL::*THE-CLASS-DEPENDENT-UPDATE-MIXIN* -SB-PCL::*THE-CLASS-DIRECT-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-DOCUMENTATION-MIXIN* -SB-PCL::*THE-CLASS-DOUBLE-FLOAT* -SB-PCL::*THE-CLASS-EFFECTIVE-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-EQL-SPECIALIZER* -SB-PCL::*THE-CLASS-EXACT-CLASS-SPECIALIZER* -SB-PCL::*THE-CLASS-FDEFN* -SB-PCL::*THE-CLASS-FIXNUM* -SB-PCL::*THE-CLASS-FLOAT* -SB-PCL::*THE-CLASS-FORWARD-REFERENCED-CLASS* -SB-PCL::*THE-CLASS-FUNCALLABLE-INSTANCE* -SB-PCL::*THE-CLASS-FUNCALLABLE-STANDARD-CLASS* -SB-PCL::*THE-CLASS-FUNCALLABLE-STANDARD-OBJECT* -SB-PCL::*THE-CLASS-FUNCTION* -SB-PCL::*THE-CLASS-GENERIC-FUNCTION* -SB-PCL::*THE-CLASS-INSTANCE* -SB-PCL::*THE-CLASS-INTEGER* -SB-PCL::*THE-CLASS-LIST* -SB-PCL::*THE-CLASS-LONG-METHOD-COMBINATION* -SB-PCL::*THE-CLASS-LRA* -SB-PCL::*THE-CLASS-METHOD* -SB-PCL::*THE-CLASS-METHOD-COMBINATION* -SB-PCL::*THE-CLASS-NULL* -SB-PCL::*THE-CLASS-NUMBER* -SB-PCL::*THE-CLASS-PCL-CLASS* -SB-PCL::*THE-CLASS-PLIST-MIXIN* -SB-PCL::*THE-CLASS-RANDOM-CLASS* -SB-PCL::*THE-CLASS-RATIO* -SB-PCL::*THE-CLASS-RATIONAL* -SB-PCL::*THE-CLASS-REAL* -SB-PCL::*THE-CLASS-SEQUENCE* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-COMPLEX-DOUBLE-FLOAT* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-COMPLEX-SINGLE-FLOAT* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-DOUBLE-FLOAT* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-SIGNED-BYTE-16* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-SIGNED-BYTE-30* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-SIGNED-BYTE-32* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-SIGNED-BYTE-8* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-SINGLE-FLOAT* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-UNSIGNED-BYTE-16* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-UNSIGNED-BYTE-2* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-UNSIGNED-BYTE-32* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-UNSIGNED-BYTE-4* -SB-PCL::*THE-CLASS-SIMPLE-ARRAY-UNSIGNED-BYTE-8* -SB-PCL::*THE-CLASS-SIMPLE-BIT-VECTOR* -SB-PCL::*THE-CLASS-SIMPLE-STRING* -SB-PCL::*THE-CLASS-SIMPLE-VECTOR* -SB-PCL::*THE-CLASS-SINGLE-FLOAT* -SB-PCL::*THE-CLASS-SLOT-CLASS* -SB-PCL::*THE-CLASS-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-SLOT-OBJECT* -SB-PCL::*THE-CLASS-SPECIALIZER* -SB-PCL::*THE-CLASS-SPECIALIZER-WITH-OBJECT* -SB-PCL::*THE-CLASS-STANDARD-ACCESSOR-METHOD* -SB-PCL::*THE-CLASS-STANDARD-BOUNDP-METHOD* -SB-PCL::*THE-CLASS-STANDARD-CLASS* -SB-PCL::*THE-CLASS-STANDARD-DIRECT-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-STANDARD-EFFECTIVE-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-STANDARD-GENERIC-FUNCTION* -SB-PCL::*THE-CLASS-STANDARD-METHOD* -SB-PCL::*THE-CLASS-STANDARD-METHOD-COMBINATION* -SB-PCL::*THE-CLASS-STANDARD-OBJECT* -SB-PCL::*THE-CLASS-STANDARD-READER-METHOD* -SB-PCL::*THE-CLASS-STANDARD-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-STANDARD-WRITER-METHOD* -SB-PCL::*THE-CLASS-STD-CLASS* -SB-PCL::*THE-CLASS-STD-OBJECT* -SB-PCL::*THE-CLASS-STREAM* -SB-PCL::*THE-CLASS-STRING* -SB-PCL::*THE-CLASS-STRUCTURE-CLASS* -SB-PCL::*THE-CLASS-STRUCTURE-DIRECT-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-STRUCTURE-EFFECTIVE-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-STRUCTURE-OBJECT* -SB-PCL::*THE-CLASS-STRUCTURE-SLOT-DEFINITION* -SB-PCL::*THE-CLASS-SYMBOL* -SB-PCL::*THE-CLASS-SYSTEM-AREA-POINTER* -SB-PCL::*THE-CLASS-T* -SB-PCL::*THE-CLASS-VECTOR* -SB-PCL::*THE-CLASS-WEAK-POINTER* -SB-PCL::*THE-ESLOTD-FUNCALLABLE-STANDARD-CLASS-SLOTS* -SB-PCL::*THE-ESLOTD-STANDARD-CLASS-SLOTS* -SB-PCL::*THE-SYSTEM-II-METHOD* -SB-PCL::*THE-SYSTEM-SI-METHOD* -SB-PCL::*THE-WRAPPER-OF-ARRAY* -SB-PCL::*THE-WRAPPER-OF-BASE-CHAR* -SB-PCL::*THE-WRAPPER-OF-BIGNUM* -SB-PCL::*THE-WRAPPER-OF-BIT-VECTOR* -SB-PCL::*THE-WRAPPER-OF-CHARACTER* -SB-PCL::*THE-WRAPPER-OF-CODE-COMPONENT* -SB-PCL::*THE-WRAPPER-OF-COMPLEX* -SB-PCL::*THE-WRAPPER-OF-COMPLEX-DOUBLE-FLOAT* -SB-PCL::*THE-WRAPPER-OF-COMPLEX-SINGLE-FLOAT* -SB-PCL::*THE-WRAPPER-OF-CONS* -SB-PCL::*THE-WRAPPER-OF-DOUBLE-FLOAT* -SB-PCL::*THE-WRAPPER-OF-FDEFN* -SB-PCL::*THE-WRAPPER-OF-FIXNUM* -SB-PCL::*THE-WRAPPER-OF-FLOAT* -SB-PCL::*THE-WRAPPER-OF-INTEGER* -SB-PCL::*THE-WRAPPER-OF-LIST* -SB-PCL::*THE-WRAPPER-OF-LRA* -SB-PCL::*THE-WRAPPER-OF-NULL* -SB-PCL::*THE-WRAPPER-OF-NUMBER* -SB-PCL::*THE-WRAPPER-OF-RANDOM-CLASS* -SB-PCL::*THE-WRAPPER-OF-RATIO* -SB-PCL::*THE-WRAPPER-OF-RATIONAL* -SB-PCL::*THE-WRAPPER-OF-REAL* -SB-PCL::*THE-WRAPPER-OF-SEQUENCE* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-COMPLEX-DOUBLE-FLOAT* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-COMPLEX-SINGLE-FLOAT* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-DOUBLE-FLOAT* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-SIGNED-BYTE-16* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-SIGNED-BYTE-30* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-SIGNED-BYTE-32* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-SIGNED-BYTE-8* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-SINGLE-FLOAT* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-UNSIGNED-BYTE-16* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-UNSIGNED-BYTE-2* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-UNSIGNED-BYTE-32* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-UNSIGNED-BYTE-4* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-ARRAY-UNSIGNED-BYTE-8* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-BIT-VECTOR* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-STRING* -SB-PCL::*THE-WRAPPER-OF-SIMPLE-VECTOR* -SB-PCL::*THE-WRAPPER-OF-SINGLE-FLOAT* -SB-PCL::*THE-WRAPPER-OF-STRING* -SB-PCL::*THE-WRAPPER-OF-STRUCTURE-OBJECT* -SB-PCL::*THE-WRAPPER-OF-SYMBOL* -SB-PCL::*THE-WRAPPER-OF-SYSTEM-AREA-POINTER* -SB-PCL::*THE-WRAPPER-OF-T* -SB-PCL::*THE-WRAPPER-OF-VECTOR* -SB-PCL::*THE-WRAPPER-OF-WEAK-POINTER* -SB-PCL::*WRITERS-FOR-THIS-DEFCLASS* -SB-PCL::WRAPPER-CLASS* - - -= debugger - -*DEBUG-PRINT-LENGTH* -*TRACE-FRAME* -*TRACE-ENCAPSULATE-DEFAULT* -*MAX-TRACE-INDENTATION* -*IN-THE-DEBUGGER* -*DEBUG-BEGINNER-HELP-P* -*STACK-TOP-HINT* -*DEBUG-HELP-STRING* -*ONLY-BLOCK-START-LOCATIONS* -*FLUSH-DEBUG-ERRORS* -*DEBUG-CONDITION* -*TRACE-VALUES* -*PRINT-LOCATION-KIND* -*DEBUG-PRINT-LEVEL* -*TRACED-FUN-LIST* -*TRACE-INDENTATION-STEP* -*DEBUG-READTABLE* -SB-DEBUG::*CACHED-DEBUG-SOURCE* -SB-DEBUG::*POSSIBLE-BREAKPOINTS* -SB-DEBUG::*BAD-CODE-LOCATION-TYPES* -SB-DEBUG::*TRACED-ENTRIES* -SB-DEBUG::*DEBUG-COMMAND-LEVEL* -SB-DEBUG::*CACHED-SOURCE-STREAM* -SB-DEBUG::*DEBUG-LOOP-FUN* -SB-DEBUG::*NESTED-DEBUG-CONDITION* -SB-DEBUG::*STEP-BREAKPOINTS* -SB-DEBUG::*DEBUG-RESTARTS* -SB-DEBUG::*BREAKPOINTS* -SB-DEBUG::*TRACED-FUNS* -SB-DEBUG::*DEBUG-COMMANDS* -SB-DEBUG::*DEFAULT-BREAKPOINT-DEBUG-FUN* -SB-DEBUG::*CACHED-READTABLE* -SB-DEBUG::*IN-TRACE* -SB-DEBUG::*CACHED-TOPLEVEL-FORM-OFFSET* -SB-DEBUG::*STACK-TOP* -SB-DEBUG::*CURRENT-FRAME* -SB-DEBUG::*CACHED-TOPLEVEL-FORM* -SB-DEBUG::*NUMBER-OF-STEPS* -SB-DEBUG::*REAL-STACK-TOP* -SB-DI::*PARSING-BUFFER* -SB-DI::*IR1-BLOCK-DEBUG-BLOCK* -SB-DI::*OTHER-PARSING-BUFFER* -SB-DI::*COMPILED-DEBUG-FUNS* -SB-DI::*COMPONENT-BREAKPOINT-OFFSETS* -SB-DI::*FUN-END-COOKIES* -SB-DI::*FORM-NUMBER-CIRCULARITY-TABLE* -SB-DI::*EXECUTING-BREAKPOINT-HOOKS* -SB-DI::*IR1-LAMBDA-DEBUG-FUN* - -= profiler - -SB-PROFILE::*PROFILED-FUN-NAME->INFO* -SB-PROFILE::*ENCLOSED-CONSING* -SB-PROFILE::*COMPUTING-PROFILING-DATA-FOR* -SB-PROFILE::*ENCLOSED-PROFILES* -SB-PROFILE::*TIMER-OVERHEAD-ITERATIONS* -SB-PROFILE::*OVERHEAD* -SB-PROFILE::*ENCLOSED-TICKS* - -= disassembler - -SB-DISASSEM:*DISASSEM-INST-ALIGNMENT-BYTES* -SB-DISASSEM:*DISASSEM-NOTE-COLUMN* -SB-DISASSEM:*DEFAULT-DSTATE-HOOKS* -SB-DISASSEM:*DISASSEM-OPCODE-COLUMN-WIDTH* -SB-DISASSEM:*DISASSEM-SCHEDULER-P* -SB-DISASSEM:*DISASSEM-LOCATION-COLUMN-WIDTH* -SB-DISASSEM::*ARG-FUN-PARAMS* -SB-DISASSEM::*ADDRESS-OF-NIL-OBJECT* -SB-DISASSEM::*DISASSEM-INSTS* -SB-DISASSEM::*DISASSEM-FUN-CACHE* -SB-DISASSEM::*DISASSEM-INST-FORMATS* -SB-DISASSEM::*GROKKED-SYMBOL-SLOTS* -SB-DISASSEM::*ARG-FORM-KINDS* -SB-DISASSEM::*DISASSEM-INST-SPACE* -SB-DISASSEM::*CURRENT-INSTRUCTION-FLAVOR* -SB-DISASSEM::*DISASSEM-ARG-TYPES* -SB-DISASSEM::*ASSEMBLER-ROUTINES-BY-ADDR* - -= assembler - -Currently protected by *big-compiler-lock*. Mostly uninvestigated - -SB-ASSEM:*ASSEM-MAX-LOCATIONS* -SB-ASSEM:*ASSEM-INSTRUCTIONS* -SB-ASSEM:*ASSEM-SCHEDULER-P* -SB-ASSEM::*INSTRUCTION-ATTRIBUTE-TRANSLATIONS* -SB-ASSEM::**CURRENT-VOP** -SB-ASSEM::**CURRENT-SEGMENT** - - -= unix interface - -Looks good to me - -SB-UNIX::*INTERRUPTS-ENABLED* ; ok, bound -SB-UNIX::*UNIX-SIGNALS* ; ok, read-only -SB-UNIX::*INTERRUPT-PENDING* ; ok, bound - -= toplevel/environment stuff - -Some of these should probably be bound on thread entry. I haven't -checked them yet, except where indicated - -*DEBUG-IO* -SB-SYS:*TTY* -SB-SYS:*STDIN* -SB-SYS:*STDOUT* -SB-SYS:*STDERR* -SB-SYS:*LONG-SITE-NAME* ; readonly -SB-SYS:*SHORT-SITE-NAME* ; readonly -SB-SYS::*SOFTWARE-VERSION* ; readonly -SB-THREAD::*SESSION-LOCK* ; bound -SB-THREAD::*BACKGROUND-THREADS-WAIT-FOR-DEBUGGER* ; intentionally global -*** ; bound -** ; bound -* ; bound -*PRINT-PRETTY* -*LOAD-VERBOSE* -*LOAD-TRUENAME* -*READ-BASE* -*BREAK-ON-SIGNALS* -*PRINT-READABLY* -*PRINT-CIRCLE* -*FEATURES* ; write at own risk -*PRINT-BASE* -*PACKAGE* -*PRINT-RADIX* -*READ-SUPPRESS* -*ERROR-OUTPUT* -*DEFAULT-PATHNAME-DEFAULTS* -*LOAD-PATHNAME* -*STANDARD-OUTPUT* -*PRINT-RIGHT-MARGIN* -*READTABLE* -*PRINT-CASE* -*PRINT-MISER-WIDTH* -*PRINT-PPRINT-DISPATCH* -*PRINT-LENGTH* -*TERMINAL-IO* -*PRINT-GENSYM* -*QUERY-IO* -*STANDARD-INPUT* -*LOAD-PRINT* -*DEBUGGER-HOOK* -*PRINT-LINES* -*PRINT-ESCAPE* -*PRINT-LEVEL* -*READ-EVAL* -*PRINT-ESCAPE* -*TRACE-OUTPUT* -SB-IMPL::*INSPECT-LENGTH* -SB-IMPL::*DRIBBLE-STREAM* ; what to do with dribble in threaded lisp? -SB-IMPL::*HELP-FOR-INSPECT* ; read-only -*PRINT-ARRAY* - - - -*POSIX-ARGV* ; read-only -*READ-DEFAULT-FLOAT-FORMAT* ; probably "change at own risk" -*MODULES* ; should be changed only by provide/require, needs locking -*MODULE-PROVIDER-FUNCTIONS* ; probably "change at own risk" -SB-IMPL::*REPL-FUN* -SB-INT:*REPL-READ-FORM-FUN* -SB-INT:*REPL-PROMPT-FUN* - -= the formatter & pretty printer - -== probably safe (readonly unless indicated) - -(defvar *default-format-error-control-string* nil) -(defvar *default-format-error-offset* nil) -SB-FORMAT::*ILLEGAL-INSIDE-JUSTIFICATION* -SB-FORMAT::*OUTSIDE-ARGS* ; safe, bound - - -(defvar *up-up-and-out-allowed* nil) ; safe, bound -(defvar *logical-block-popper* nil) ; bound -(defvar *expander-next-arg-macro* 'expander-next-arg) ; bound -(defvar *orig-args-available* nil) ; bound - -== needs checking - -;;; Used by the expander stuff. Initially starts as T, and gets set to NIL -;;; if someone needs to do something strange with the arg list (like use -;;; the rest, or something). Setf in late-format, haven't checked if it's -;;; always in a bound context -(defvar *only-simple-args*) - -;;; setf in late-format, haven't checked -(defvar *simple-args*) - -== haven't looked at yet - -SB-PRETTY::*INITIAL-PPRINT-DISPATCH* -SB-PRETTY::*BUILDING-INITIAL-TABLE* -SB-PRETTY::*PRECOMPILED-PPRINT-DISPATCH-FUNS* - - -= compiler - -Note that the compiler and fasloader are strongly believed not to be -thread-safe, so there is currently a big lock (*big-compiler-lock*) -around all calls to the compiler or fasloader - -INFO functions are currently believed to be multi-writer/reader threadsafe, -though it's hard to know for sure since they were definitely read-safe, -and writes are done only while holding **WORLD-LOCK** as things stand. -The algorithms employed are used in at least one industrial-strength Lisp -application, though a bug has been reported (to me, dougk) regarding -the fasloader that might be related to INFO, or to the fasloader. -Catch 22: can't expose threading bugs until lock is removed - can't remove the lock until INFO is proven to be threadsafe. - -*COMPILE-FILE-PATHNAME* -*COMPILE-FILE-TRUENAME* -*COMPILE-PRINT* -*COMPILE-VERBOSE* -*COMPILE-PROGRESS* -SB-C:*BACKEND-INTERNAL-ERRORS* -SB-C:*BACKEND-SPECIAL-ARG-TYPES* -SB-C:*LEXENV* -SB-C:*CODE-SEGMENT* -SB-C:*COMPONENT-BEING-COMPILED* -SB-C:*BACKEND-SB-NAMES* -SB-C:*BACKEND-PAGE-SIZE* -SB-C:*BACKEND-SC-NUMBERS* -SB-C:*ELSEWHERE* -SB-C:*BACKEND-T-PRIMITIVE-TYPE* -SB-C:*BACKEND-SB-LIST* -SB-C:*BACKEND-SUBFEATURES* -SB-C:*COUNT-VOP-USAGES* -SB-C:*SUPPRESS-VALUES-DECLARATION* -SB-C:*BACKEND-SC-NAMES* -SB-C::*CURRENT-COMPONENT* -SB-C::*SLOT-INHERIT-ALIST* -SB-C::*COMPILER-NOTE-COUNT* -SB-C::*BACKEND-PREDICATE-TYPES* -SB-C::*POLICY* -SB-C::*INLINEP-TRANSLATIONS* -SB-C::*PACK-OPTIMIZE-SAVES* -SB-C::*DELETION-IGNORED-OBJECTS* -SB-C::*LAST-FORMAT-ARGS* -SB-C::*CONSTANTS-BEING-CREATED* -SB-C::*IGNORED-ERRORS* -SB-C::*COMPILE-OBJECT* -SB-C::*TN-IDS* -SB-C::*LOSSAGE-FUN* -SB-C::*COMPILER-ERROR-COUNT* -SB-C::*EVENT-NOTE-THRESHOLD* -SB-C::*LAST-MESSAGE-COUNT* -SB-C::*EMIT-ASSEMBLY-CODE-NOT-VOPS-P* -SB-C::*LAST-FORMAT-STRING* -SB-C::*UNWINNAGE-FUN* -SB-C::*COMPILER-ERROR-CONTEXT* -SB-C::*SEEN-BLOCKS* -SB-C::*TN-ID* -SB-C::*IR1-OPTIMIZE-UNTIL-DONE-EVENT-INFO* -SB-C::*SPECIALIZED-ARRAY-ELEMENT-TYPE-PROPERTIES* ; readonly -SB-C::*NUMBER-CONTINUATIONS* -SB-C::*CTYPE-TEST-FUN* -SB-C::*IGNORE-COST-VOPS* -SB-C::*QUEUED-PROCLAIMS* -SB-C::*COMPILER-STYLE-WARNING-COUNT* -SB-C::*LABEL-IDS* -SB-C::TN-NEXT* -SB-C::*COMPILED-CODE-LOCATION-KINDS* -SB-C::*VOP-TN-REFS* -SB-C::*FAILURE-P* -SB-C::*LAST-ORIGINAL-SOURCE* -SB-C::NEXT* -SB-C::LIST*-IR2-CONVERT-OPTIMIZER -SB-C::*COMPILER-ERROR-BAILOUT* -SB-C::*DELAYED-IR1-TRANSFORMS* -SB-C::*INFO-TYPES* ; readonly -SB-C::*CHECK-CONSISTENCY* -SB-C::*SEEN-FUNS* -SB-C::*USING-VOP-TN-REFS* -SB-C::*MAKE-VALUE-CELL-EVENT-EVENT-INFO* -SB-C::*IN-PACK* -SB-C::*REPACK-BLOCK-EVENT-INFO* -SB-C::*UNPACK-TN-EVENT-INFO* -SB-C::*COALESCE-MORE-LTN-NUMBERS-EVENT-INFO* -SB-C::*IN-COMPILATION-UNIT* -SB-C::*BACKEND-TEMPLATE-NAMES* -SB-C::*BACKEND-PRIMITIVE-TYPE-NAMES* -SB-C::*CONSTRAINT-PROPAGATE* -SB-C::*BACKEND-PRIMITIVE-TYPE-ALIASES* -SB-C::*NO-COSTS* -SB-C::*PACK-ASSIGN-COSTS* -SB-C::*CURRENT-FORM-NUMBER* -SB-C::*BLOCK-COMPILE-ARG* -SB-C::*COMPILER-ERROR-PRINT-LENGTH* -SB-C::*CONTINUATION-NUMBER* -SB-C::*PREV-SEGMENT* -SB-C::*CONTROL-DELETED-BLOCK-EVENT-INFO* -SB-C::*ALLOW-DEBUG-CATCH-TAG* -SB-C::*ID-LABELS* -SB-C::*BACKEND-TYPE-PREDICATES* -SB-C::*COMPILER-WARNING-COUNT* -SB-C::*SUPPRESS-NOTE-VOPS* -SB-C::*COMPILER-ERROR-PRINT-LEVEL* -SB-C::*COMPLEMENT-TYPE-CHECKS* -SB-C::*FUN-NAMES-IN-THIS-FILE* -SB-C::*SPLIT-IR2-BLOCK-EVENT-INFO* -SB-C::*TRACE-TABLE* -SB-C::*LAST-SOURCE-FORM* -SB-C::*WEAKEN-TYPE-CACHE-VECTOR* ; threadsafe -SB-C::*-DERIVE-TYPE-AUX -SB-C::*BLOCK-COMPILE* -SB-C::*BIG-COMPILER-LOCK* ; protecting the rest -SB-C::*PRIMITIVE-TYPE-SLOT-ALIST* -SB-C::*PREVIOUS-LOCATION* -SB-C::*BYTE-BUFFER* -SB-C::*CONSTANTS-CREATED-SINCE-LAST-INIT* -SB-C::*LAST-SOURCE-CONTEXT* -SB-C::*FIXUPS* -SB-C::VOP* -SB-C::*REOPTIMIZE-MAXED-OUT-EVENT-INFO* -SB-C::*LIST-CONFLICTS-TABLE* -SB-C::*LOSSAGE-DETECTED* -SB-C::*LAST-ERROR-CONTEXT* -SB-C::*PREV-VOP* -SB-C::*POLICY-DEPENDENT-QUALITIES* -SB-C::*REOPTIMIZE-AFTER-TYPE-CHECK-MAX* -SB-C::*-DERIVE-TYPE-OPTIMIZER -SB-C::*IR1-ATTRIBUTE-TRANSLATIONS* -SB-C::*DYNAMIC-COUNTS-TN* -SB-C::*EXTREME-NTHCDR-OPEN-CODE-LIMIT* -SB-C::*BACKEND-PARSED-VOPS* -SB-C::*ABORTED-COMPILATION-UNIT-COUNT* -SB-C::*COPY-DELETED-MOVE-EVENT-INFO* -SB-C::*MAX-OPTIMIZE-ITERATIONS* -SB-C::*TOPLEVEL-LAMBDAS* -SB-C::*SC-VOP-SLOTS* -SB-C::*IR1-OPTIMIZE-MAXED-OUT-EVENT-INFO* -SB-C::*CONTINUATION-NUMBERS* -SB-C::*WARNINGS-P* -SB-C::*FLAME-ON-NECESSARILY-UNDEFINED-FUNCTION* -SB-C::*UNPACK-FALLBACK-EVENT-INFO* -SB-C::*SOURCE-INFO* -SB-C::*LIVE-BLOCK* -SB-C::*NEXT-LOCATION* -SB-C::*ELSEWHERE-LABEL* -SB-C::*SOURCE-PATHS* -SB-C::*DEFAULT-NTHCDR-OPEN-CODE-LIMIT* -SB-C::*ALWAYS-OPTIMIZED-AWAY* -SB-C::*CURRENT-PATH* -SB-C::*LABEL-ID* -SB-C::*ENTRY-POINTS* -SB-C::*COMPILER-TRACE-OUTPUT* -SB-C::*CONSTRAINT-NUMBER* -SB-C::*RESULT-FIXUPS* -SB-C::*REPACK-BLOCKS* -SB-C::IR1-CONVERT-LET* -SB-C::*CODE-VECTOR* -SB-C::*SOURCE-CONTEXT-METHODS* -SB-C::*VOP-ATTRIBUTE-TRANSLATIONS* -SB-C::*COMPILER-ERROR-PRINT-LINES* -SB-C::*LIVE-VOP* -SB-C::*POLICY-QUALITIES* -SB-C::*NO-LOADS* -SB-C::*TRACE-TABLE-INFO* -SB-C::*UNDEFINED-WARNINGS* -SB-C::*BLOCK-ATTRIBUTE-TRANSLATIONS* -SB-C::*EVENT-INFO* -SB-C::*UNWINNAGE-DETECTED* -SB-C::*ID-TNS* - -= fasloader - -SB-FASL:*ASSEMBLER-ROUTINES* -SB-FASL:*FASL-FILE-TYPE* -SB-FASL::FOP-LIST*-4 -SB-FASL::*COLD-LOAD-DUMP* -SB-FASL::FOP-LIST*-7 -SB-FASL::FOP-LIST*-8 -SB-FASL::FOP-LIST*-1 -SB-FASL::FOP-LIST*-2 -SB-FASL::*FASL-INPUT-STREAM* -SB-FASL::*FOP-STACK* -SB-FASL::*LOAD-DEPTH* -SB-FASL::*FEATURES-AFFECTING-FASL-FORMAT* -SB-FASL::*DUMP-ONLY-VALID-STRUCTURES* -SB-FASL::*CURRENT-FOP-TABLE-SIZE* -SB-FASL::*FOP-STACK-POINTER-ON-ENTRY* -SB-FASL::*FREE-FOP-TABLES* -SB-FASL::*LOAD-SYMBOL-BUFFER* -SB-FASL::*FASL-HEADER-STRING-START-STRING* -SB-FASL::DUMP-FOP* -SB-FASL::FOP-LIST* -SB-FASL::*CIRCULARITIES-DETECTED* -SB-FASL::*LOAD-CODE-VERBOSE* -SB-FASL::*FEATURES-POTENTIALLY-AFFECTING-FASL-FORMAT* -SB-FASL::*LOAD-SYMBOL-BUFFER-SIZE* -SB-FASL::*CURRENT-FOP-TABLE* -SB-FASL::*FOP-STACK-POINTER* -SB-FASL::*CURRENT-FOP-TABLE-INDEX* -SB-FASL::*FOP-FUNS* -SB-FASL::*CURRENT-UNWIND-PROTECT-BLOCK* -SB-FASL::FOP-LIST*-5 -SB-FASL::*FOP-NAMES* -SB-FASL::FOP-LIST*-6 -SB-FASL::FOP-LIST*-3 - - -= runtime stuff - - -SB-VM:*STATIC-SPACE-FREE-POINTER* -SB-VM:*INITIAL-DYNAMIC-SPACE-FREE-POINTER* -SB-VM:*CURRENT-CATCH-BLOCK* ; bound at thread entry (in C) -SB-VM:*STATIC-SYMBOLS* -SB-VM:*CONTROL-STACK-START* ; safe, bound at thread entry -SB-VM:*READ-ONLY-SPACE-FREE-POINTER* -SB-VM:*BINDING-STACK-START* ; safe, bound at thread entry -SB-VM:*CONTROL-STACK-END* ; safe, bound at thread entry -SB-VM::*CURRENT-UNWIND-PROTECT-BLOCK* ; bound at thread entry (in C) -SB-VM::*FREE-TLS-INDEX* -SB-VM::*BINDING-STACK-POINTER* -SB-KERNEL:*PSEUDO-ATOMIC-ATOMIC* ; bound -SB-KERNEL:*CONTROL-STACK-EXHAUSTION-SAP* -SB-KERNEL:*FREE-INTERRUPT-CONTEXT-INDEX* ; bound -SB-KERNEL:*GC-INHIBIT* ; do not touch directly. accessors may be broke too -SB-KERNEL:*NEED-TO-COLLECT-GARBAGE* -SB-KERNEL:*ALREADY-MAYBE-GCING* -SB-KERNEL:*PSEUDO-ATOMIC-INTERRUPTED* ; bound -SB-KERNEL::*GC-TRIGGER* ; I think this is dead, check -SB-IMPL::*CURRENT-UNWIND-PROTECT-BLOCK* ; thread-local -SB-IMPL::*READ-ONLY-SPACE-FREE-POINTER* -SB-VM::*ALIEN-STACK* ; bound in create_thread_struct() - -SB-IMPL::*OBJECTS-PENDING-FINALIZATION* ; needs locking for writers - -*AFTER-GC-HOOKS* ; must be global -*GC-RUN-TIME* -SB-INT:*N-BYTES-FREED-OR-PURIFIED* - -Note also the following may need attention -SB-PROFILE::TOTAL-CONSED -GET-BYTES-CONSED (fbound) -BYTES-CONSED-BETWEEN-GCS (fbound) - - -= backend constants - -These are believed to be constant (in the general sense, not necessarily -eligible for defconstant). Mostly they're attributes of the backend machine - - -SB-C:*BACKEND-REGISTER-SAVE-PENALTY* -SB-C:*BACKEND-BYTE-ORDER* -SB-VM:*PRIMITIVE-OBJECTS* -SB-VM:*ASSEMBLY-UNIT-LENGTH* -SB-VM::*FP-CONSTANT-L2E* -SB-VM::*FLOAT-REGISTER-NAMES* -SB-VM::*FP-CONSTANT-1L0* -SB-VM::*BYTE-REGISTER-NAMES* -SB-VM::*DWORD-SC-NAMES* -SB-VM::*FP-CONSTANT-1F0* -SB-VM::*WORD-REGS* -SB-VM::*BYTE-SC-NAMES* -SB-VM::*DEFAULT-ADDRESS-SIZE* -SB-VM::*FP-CONSTANT-0D0* -SB-VM::*FP-CONSTANT-LG2* -SB-VM::*FP-CONSTANT-L2T* -SB-VM::*DWORD-REGS* -SB-VM::*WORD-REGISTER-NAMES* -SB-VM::*FP-CONSTANT-0F0* -SB-VM::*FLOAT-SC-NAMES* -SB-VM::*FLOAT-REGS* -SB-VM::*DWORD-REGISTER-NAMES* -SB-VM::*WORD-SC-NAMES* -SB-VM::*FP-CONSTANT-PI* -SB-VM::*BYTE-REGS* -SB-VM::*FP-CONSTANT-1D0* -SB-VM::*DOUBLE-SC-NAMES* -SB-VM::*FP-CONSTANT-0L0* -SB-VM::*REGISTER-ARG-OFFSETS* -SB-VM::*FLOAT-TRAP-ALIST* -SB-VM::*DWORD-REG-NAMES* -SB-VM::*BYTE-REG-NAMES* -SB-VM::*ROUNDING-MODE-ALIST* -SB-VM::*REGISTER-ARG-NAMES* -SB-VM::*FIXNUM-PRIMITIVE-TYPE* -SB-VM:*STATIC-FUNS* -SB-VM::*FP-CONSTANT-LN2* -SB-VM::*WORD-REG-NAMES* -SB-KERNEL::*BUILT-IN-CLASSES* - -= dead stuff - ------------------------------------------------------------------------- - -= unclassified - -SB-ALIEN-INTERNALS:*VALUES-TYPE-OKAY* -SB-ALIEN::ALIEN-*-TYPE-TRANSLATOR -SB-ALIEN::*DSO-LINKER* -SB-ALIEN::*HANDLES-FROM-DLOPEN* -SB-ALIEN::*ALIEN-TYPE-CLASSES* -SB-ALIEN::*RECORD-TYPES-ALREADY-UNPARSED* -SB-ALIEN::*NEW-AUXILIARY-TYPES* -SB-ALIEN::*DSO-LINKER-OPTIONS* -SB-ALIEN::*METHOD-SLOT-ALIST* - -SB-VM::*SIGNED-IMM-BYTE-PREFILTER-WRAPPER* -SB-VM::*DISPLACEMENT-PRINTER-WRAPPER* -SB-VM::*ACCUM-PRINTER-WRAPPER* -SB-VM::*WIDTH-PRINTER-WRAPPER* -SB-VM::*LABEL-1-PREFILTER-WRAPPER* -SB-VM::*WORD-ACCUM-PRINTER-WRAPPER* -SB-VM::*NUM-FIXUPS* -SB-VM::*SIGNED-IMM-DATA-PREFILTER-WRAPPER* -SB-VM::*FIXNUM-PRIMITIVE-TYPE* -SB-VM::*CONDITIONS* -SB-VM::*IGNORE-AFTER* -SB-VM::*IMM-WORD-PREFILTER-WRAPPER* -SB-VM::*REGISTER-ARG-TNS* -SB-VM::*IMM-DATA-PREFILTER-WRAPPER* -SB-VM::*PRIMITIVE-TYPE-AUX-CACHE-VECTOR* ; threadsafe -SB-VM::*LABEL-2-PREFILTER-WRAPPER* -SB-VM::*ROOM-INFO* -SB-VM::*ADJUSTABLE-VECTORS* ; under **WORLD-LOCK** - should be done better -SB-VM::*CONDITION-NAME-VEC* -SB-VM::*IMM-WORD-16-PREFILTER-WRAPPER* -SB-VM::*SIMPLE-ARRAY-PRIMITIVE-TYPES* -SB-VM::*MAYBE-USE-INLINE-ALLOCATION* -SB-VM::*SIGNED-IMM-DWORD-PREFILTER-WRAPPER* -SB-VM::*IMMEDIATE-TYPES* - -SB-KERNEL:*WILD-TYPE* ; readonly -SB-KERNEL:*UNPARSE-FUN-TYPE-SIMPLIFY* -SB-KERNEL:*CURRENT-LEVEL-IN-PRINT* -SB-KERNEL:*UNIVERSAL-FUN-TYPE* -SB-KERNEL:*UNIVERSAL-TYPE* ; readonly -SB-KERNEL:*HANDLER-CLUSTERS* ; bound per-thread -SB-KERNEL:*EMPTY-TYPE* ; readonly -SB-KERNEL:*MAXIMUM-ERROR-DEPTH* -SB-KERNEL:*CONDITION-RESTARTS* ; bound per-thread -SB-KERNEL:*TYPE-SYSTEM-INITIALIZED* -SB-KERNEL:*RESTART-CLUSTERS* ; bound per-thread -SB-KERNEL::*MAKE-VALUES-TYPE-CACHED-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*BUILT-IN-CLASS-CODES* ; readonly -SB-KERNEL::*DEF!STRUCT-TYPE-MAKE-LOAD-FORM-FUN* -SB-KERNEL::*LAYOUT-CLOS-HASH-RANDOM-STATE* -SB-KERNEL::*TYPE-TEST-ORDERING* -SB-KERNEL::*COMMON-TYPESPECS* -SB-KERNEL::*TYPE=-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*VALUES-SUBTYPEP-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*TYPECHECKFUNS* -SB-KERNEL::*%TYPE-INTERSECTION-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*TYPE-INTERSECTION2-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*COLD-INIT-FORMS* -SB-KERNEL::*DEFAULT-DEFAULT* -SB-KERNEL::*RAW-SLOT-DATA-LIST* -SB-KERNEL::*SPECIALIZED-ARRAY-ELEMENT-TYPES* ; readonly -SB-KERNEL::*DEFSTRUCT-HOOKS* -SB-KERNEL::*VALUES-TYPE-UNION-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*INTERNAL-ERRORS* -SB-KERNEL::*VALUES-TYPE-INTERSECTION-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*FORWARD-REFERENCED-LAYOUTS* -SB-KERNEL::*SYSTEM-LETS* ; bound -SB-KERNEL::*%COERCE-TO-VALUES-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*IGNORABLE-VARS* -SB-KERNEL::*ENV-VAR* ; bound -SB-KERNEL::|*%%MAKE-UNION-TYPE-cached-CACHE-VECTOR*| ; threadsafe -SB-KERNEL::*CSUBTYPEP-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*EMPTY-CONDITION-SLOT* -SB-KERNEL::*TYPE-UNION2-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*TYPE-CLASS-FUN-SLOTS* -SB-KERNEL::*ARG-TESTS* ; bound -SB-KERNEL::*USER-LETS* ; bound -SB-KERNEL::|*%%MAKE-ARRAY-TYPE-cached-CACHE-VECTOR*| ; threadsafe -SB-KERNEL::*FINDING-NAME* -SB-KERNEL::*TYPE-CLASSES* -SB-KERNEL::*VALUES-SPECIFIER-TYPE-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*FLOAT-FORMATS* ; readonly -SB-KERNEL::*INTERNAL-ERROR-ARGS* -SB-KERNEL::*DEF!STRUCT-SUPERTYPE* -SB-KERNEL::*%TYPE-UNION-CACHE-VECTOR* ; threadsafe -SB-KERNEL::*CTYPE-OF-CACHE-VECTOR* ; threadsafe - -SB-IMPL::*READ-BUFFER* ; safe when used via WITH-READ-BUFFER -SB-IMPL::*SECONDARY-ATTRIBUTE-TABLE* ; now *CONSTITUENT-TRAIT-TABLE*, constant -SB-IMPL::*STANDARD-READTABLE* -SB-IMPL::*ERROR-ERROR-DEPTH* -SB-IMPL::*CURRENT-ERROR-DEPTH* -SB-IMPL::*INTERNAL-REAL-TIME-BASE-SECONDS* -SB-IMPL::*OFFENDING-DATUM* -SB-IMPL::*HANDLERS-INSTALLED* -SB-IMPL::*HASH-TABLE-TESTS* -SB-IMPL::*ATTRIBUTE-NAMES* -SB-IMPL::*CHARACTER-ATTRIBUTES* -SB-IMPL::*UNIX-HOST* -SB-IMPL::*DESCRIPTOR-HANDLERS* -SB-IMPL::*STRING-OUTPUT-STREAMS* -SB-IMPL::*CLOSE-ON-ERROR* -SB-IMPL::*BQ-COMMA-FLAG* ; readonly -SB-IMPL::*PROFILE-HASH-CACHE* ; not threadsafe, but don't care- debug only -SB-IMPL::*FIXNUM-POWER--1* -SB-IMPL::*SHARP-EQUAL-CIRCLE-TABLE* -SB-IMPL::*SOFTWARE-INTERRUPT-VECTOR* ; suspect unused -SB-IMPL::*INSPECT-UNBOUND-OBJECT-MARKER* -SB-IMPL::*IN-PACKAGE-INIT* -SB-IMPL::*DELAYED-DEF!METHOD-ARGS* -SB-IMPL::*GENTEMP-COUNTER* -SB-IMPL::*CLOSE-IN-PARENT* -SB-IMPL::*IN-COMPILATION-UNIT* -SB-IMPL::*CIRCULARITY-HASH-TABLE* -SB-IMPL::*LOAD-PRINT-STUFF* -SB-IMPL::*ACTIVE-PROCESSES* -SB-IMPL::*SHARP-SHARP-ALIST* -SB-IMPL::*LOGICAL-PATHNAME-DEFAULTS* -SB-IMPL::*AVAILABLE-BUFFERS* -SB-IMPL::*BQ-DOT-FLAG* ; readonly -SB-IMPL::*CIRCULARITY-COUNTER* -SB-IMPL::*DIGITS* -SB-IMPL::*BQ-VECTOR-FLAG* ; readonly -SB-IMPL::*LOGICAL-HOSTS* -SB-IMPL::*PACKAGE-NAMES* -SB-IMPL::*INSPECT-FUN* -SB-IMPL::*OUTPUT-ROUTINES* -SB-IMPL::*CHAR-NAME-ALIST* -SB-IMPL::*VALID-FUN-NAMES-ALIST* -SB-IMPL::*PERIODIC-POLLING-FUNCTION* -SB-IMPL::*ABORTED-COMPILATION-UNIT-COUNT* -SB-IMPL::*INTERNAL-SYMBOL-OUTPUT-FUN* ; FIXME: printer not threadsafe -SB-IMPL::*BACKQUOTE-COUNT* ; bound -SB-IMPL::*DIGIT-BASES* -SB-IMPL::*PREVIOUS-DRIBBLE-STREAMS* -SB-IMPL::*MAX-EVENT-TO-USEC* -SB-IMPL::*INPUT-ROUTINES* -SB-IMPL::*MAX-EVENT-TO-SEC* -SB-IMPL::*OLD-PACKAGE* -SB-IMPL::*ERROR-THROW-UP-COUNT* -SB-IMPL::*BQ-AT-FLAG* ; readonly -SB-IMPL::*MACHINE-VERSION* ; unset/unbound ? are we using this? -SB-IMPL::*IGNORE-WILDCARDS* -SB-IMPL::*SHARP-EQUAL-ALIST* - -*INLINE-EXPANSION-LIMIT* -*DERIVE-FUNCTION-TYPES* -*ENCLOSING-SOURCE-CUTOFF* -*INSPECTED* -*UNDEFINED-WARNING-LIMIT* -*EFFICIENCY-NOTE-COST-THRESHOLD* -*EFFICIENCY-NOTE-LIMIT* -*USE-IMPLEMENTATION-TYPES* -*INTEXP-MAXIMUM-EXPONENT* -*GENSYM-COUNTER* -*MACROEXPAND-HOOK* -*RANDOM-STATE* - -SB-INT:*CL-PACKAGE* ; readonly -SB-INT:*KEYWORD-PACKAGE* ; readonly -SB-INT:*SETF-FDEFINITION-HOOK* -SB-INT:*DEFAULT-INIT-CHAR-FORM* -SB-INT:*EOF-OBJECT* ; readonly -SB-INT:*AFTER-SAVE-INITIALIZATIONS* -SB-INT:*LOAD-SOURCE-DEFAULT-TYPE* -SB-INT:*BEFORE-SAVE-INITIALIZATIONS* -SB-INT:*INFO-ENVIRONMENT* ; threadsafe From bfcd6d454be98ce1b2825e1f55bc72baa17de982 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 20 Apr 2022 20:17:16 -0400 Subject: [PATCH 3171/4023] Make comments match the code --- src/code/signal.lisp | 2 +- src/code/sysmacs.lisp | 2 +- src/runtime/gencgc.c | 6 +++--- src/runtime/thread.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/code/signal.lisp b/src/code/signal.lisp index eda0fac1f3..724a497722 100644 --- a/src/code/signal.lisp +++ b/src/code/signal.lisp @@ -48,7 +48,7 @@ ;;; (foo)) ;;; provided that the first branch is true "often enough". -;;; These 4 symbols are initialized by create_thread_struct() +;;; These 4 symbols are initialized by alloc_thread_struct() (defvar *interrupts-enabled*) (defvar *interrupt-pending*) #+sb-safepoint (defvar *thruption-pending*) diff --git a/src/code/sysmacs.lisp b/src/code/sysmacs.lisp index 6c5ccfa10d..d87f5fd3ca 100644 --- a/src/code/sysmacs.lisp +++ b/src/code/sysmacs.lisp @@ -11,7 +11,7 @@ (in-package "SB-IMPL") -;;;; these are initialized by create_thread_struct() +;;;; these are initialized by alloc_thread_struct() (defvar *in-without-gcing*) (defvar *gc-inhibit*) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index da1b9ab8a4..407f2e6a38 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2030,7 +2030,7 @@ static void refine_ambiguous_roots() workspace = (lispobj*)os_allocate(pins_alloc_size); gc_assert(workspace); } - gc_filtered_pins = workspace; // needed for wipe_nonpinned_words + gc_filtered_pins = workspace; // needed for obliterate_nonpinned_words lispobj key; int count = 0, index; for_each_hopscotch_key(index, key, pinned_objects) { @@ -3725,7 +3725,7 @@ conservative_stack_scan(struct thread* th, // frame pointers or alien or DX object pointers. In any case // there's no need to call preserve_pointer on them since // they definitely don't point to the heap. - // See the picture at create_thread_struct() as a reminder. + // See the picture at alloc_thread_struct() as a reminder. #ifdef LISP_FEATURE_UNIX lispobj exclude_from = (lispobj)th->control_stack_start; lispobj exclude_to = (lispobj)th + dynamic_values_bytes; @@ -4174,7 +4174,7 @@ garbage_collect_generation(generation_index_t generation, int raise, cull_weak_hash_tables(weak_ht_alivep_funs); obliterate_nonpinned_words(); - // Do this last, because until wipe_nonpinned_words() happens, + // Do this last, because until obliterate_nonpinned_words() happens, // not all page table entries have the 'gen' value updated, // which we need to correctly find all old->young pointers. sweep_immobile_space(raise); diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 0ba34d5505..a7e39d957d 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -268,7 +268,7 @@ extern pthread_key_t specials; /* sigaltstack() - "Signal stacks are automatically adjusted * for the direction of stack growth and alignment requirements." */ static inline void* calc_altstack_base(struct thread* thread) { - // Refer to the picture in the comment above create_thread_struct(). + // Refer to the picture in the comment above alloc_thread_struct(). // Always return the lower limit as the base even if stack grows down. return ((char*) thread) + dynamic_values_bytes + ALIGN_UP(sizeof (struct extra_thread_data), N_WORD_BYTES); From 3b78f2bf43ef01ece3d1bafde890f22dcd97b0db Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 21 Apr 2022 11:46:29 -0400 Subject: [PATCH 3172/4023] Fix latent problem in FOP-STRUCT It needs to pick the right TLAB for when it really makes a difference --- src/code/defstruct.lisp | 6 ++++++ src/code/load.lisp | 2 +- src/code/target-defstruct.lisp | 5 +---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 1472b28a66..3860ad7feb 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -53,6 +53,12 @@ (i (%make-instance ,size))) (%set-instance-layout i l) i)) +(sb-xc:defmacro %new-instance* (layout len) + `(let ((i (if (logtest (layout-flags ,layout) sb-vm::+strictly-boxed-flag+) + (%make-instance ,len) + (%make-instance/mixed ,len)))) + (%set-instance-layout i ,layout) + i)) (declaim (ftype (sfunction (defstruct-description list) function) %make-structure-instance-allocator)) diff --git a/src/code/load.lisp b/src/code/load.lisp index 237fcd35cf..1f3c3f4db6 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -783,7 +783,7 @@ ;; %MAKE-INSTANCE does not exist on the host. (define-fop 48 :not-host (fop-struct ((:operands size) layout)) - (let ((res (%new-instance layout size)) ; number of words excluding header + (let ((res (sb-kernel::%new-instance* layout size)) ; number of words excluding header ;; Discount the layout from number of user-visible words. (n-data-words (- size sb-vm:instance-data-start))) (with-fop-stack ((stack (operand-stack)) ptr n-data-words) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 5139874751..ca4e32aea5 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -368,10 +368,7 @@ (declare (index i)) (%instance-set res i (%instance-ref structure i))))) #+(or x86 x86-64) ; Two allocators, but same loop either way - (let ((res (if (logtest (layout-flags layout) sb-vm::+strictly-boxed-flag+) - (%make-instance len) - (%make-instance/mixed len)))) - (%set-instance-layout res layout) + (let ((res (%new-instance* layout len))) (fast-loop)) #-(or x86 x86-64) ; Different loops (if (logtest (layout-flags layout) sb-vm::+strictly-boxed-flag+) From f4e01a5a6dd76f27be435ebc1cbb662dcf377b08 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 22 Apr 2022 00:20:41 +0300 Subject: [PATCH 3173/4023] x86-64: omit gc-store-barrier in SET-SLOT for provably old values. A start. Not all allocators are detected and it needs to be extended beyond set-slot. --- src/compiler/generic/vm-ir2tran.lisp | 14 ++++----- src/compiler/ir1util.lisp | 43 ++++++++++++++++++++++++++++ src/compiler/loop.lisp | 6 ++-- src/compiler/main.lisp | 5 ++++ src/compiler/node.lisp | 4 ++- src/compiler/x86-64/cell.lisp | 5 ++-- src/compiler/x86-64/type-vops.lisp | 7 +++-- 7 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index 779da85c0f..887e331584 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -77,7 +77,7 @@ res) (move-lvar-result node block locs lvar))) -(defun emit-inits (node block name object lowtag inits args) +(defun emit-inits (node block object lowtag inits args) (let ((unbound-marker-tn nil) (funcallable-instance-tramp-tn nil) (dx-p (node-stack-allocate-p node))) @@ -102,7 +102,7 @@ `(ecase raw-type ((t) (vop set-slot node block object arg-tn - name (+ sb-vm:instance-slots-offset slot) lowtag)) + :allocator (+ sb-vm:instance-slots-offset slot) lowtag)) ,@(map 'list (lambda (rsd) `(,(sb-kernel::raw-slot-data-raw-type rsd) @@ -116,7 +116,7 @@ (:dd (vop set-slot node block object (emit-constant (sb-kernel::dd-layout-or-lose slot)) - name sb-vm:instance-slots-offset lowtag)) + :allocator sb-vm:instance-slots-offset lowtag)) (otherwise (if (and (eq kind :arg) (zero-init-p (car args))) @@ -148,7 +148,7 @@ nil sb-vm:any-reg-sc-number))) (vop make-funcallable-instance-tramp node block tn) tn))))) - name slot lowtag)))))))) + :allocator slot lowtag)))))))) (unless (null args) (bug "Leftover args: ~S" args))) @@ -174,7 +174,7 @@ (locs (lvar-result-tns lvar (list *universal-type*))) (result (first locs))) (emit-fixed-alloc node block name words type lowtag result lvar) - (emit-inits node block name result lowtag inits args) + (emit-inits node block result lowtag inits args) (move-lvar-result node block locs lvar))) (defoptimizer ir2-convert-variable-allocation @@ -191,7 +191,7 @@ (ir2-lvar-stack-pointer (lvar-info lvar)))) (vop var-alloc node block (lvar-tn node block extra) name words type lowtag stack-allocate-p result))) - (emit-inits node block name result lowtag inits args) + (emit-inits node block result lowtag inits args) (move-lvar-result node block locs lvar))) (defoptimizer ir2-convert-structure-allocation @@ -212,7 +212,7 @@ #-compact-instance-header c-dd)) (emit-fixed-alloc node block name words metadata lowtag result lvar)) - (emit-inits node block name result lowtag + (emit-inits node block result lowtag `(#-compact-instance-header (:dd . ,c-dd) ,@c-slot-specs) args) (move-lvar-result node block locs lvar)))) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index eca8d05a3c..fb7d0a3f90 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -413,6 +413,49 @@ (when new-lvar (propagate-lvar-dx new-lvar old-lvar) t))))) + +(defun node-dominates-p (node1 node2) + (let ((block1 (node-block node1)) + (block2 (node-block node2))) + (if (eq block1 block2) + (do-nodes (node nil block1) + (cond ((eq node node1) + (setf node1 0)) + ((eq node node2) + (return (eq node1 0))))) + (let ((component (block-component block1))) + (unless (component-dominators-computed component) + (find-dominators component)) + (dominates-p block1 block2))))) + +(defun set-slot-old-p (node) + (let ((args (combination-args node))) + (multiple-value-bind (object-lvar value-lvar) + (if (lvar-fun-is (combination-fun node) '(%%primitive)) + (values (car (last args 2)) + (car (last args))) + (values (first args) (second args))) + (let ((allocator (principal-lvar-ref-use object-lvar)) + (value-ref (principal-lvar-ref value-lvar)) + (uses (lvar-uses value-lvar))) + (when (and (combination-p allocator) + (lvar-fun-is (combination-fun allocator) '(list* list + %make-instance + %make-funcallable-instance))) + + (when value-ref + (let ((var (ref-leaf value-ref))) + (when (and (lambda-var-p (ref-leaf value-ref)) + (not (lambda-var-sets (ref-leaf value-ref)))) + (when (member (functional-kind (lambda-var-home var)) + '(:external :optional)) + (return-from set-slot-old-p t)) + (setf uses (principal-lvar-ref-use value-lvar))))) + (when uses + (if (consp uses) + (loop for use in uses + always (node-dominates-p use allocator)) + (node-dominates-p uses allocator)))))))) ;;;; block starting/creation diff --git a/src/compiler/loop.lisp b/src/compiler/loop.lisp index 02a1fa42a9..83c9bd0453 100644 --- a/src/compiler/loop.lisp +++ b/src/compiler/loop.lisp @@ -41,11 +41,13 @@ (setq dom (copy-sset pdom) changed t))))) (setf (block-dominators block) dom) (when dom (sset-adjoin block dom)))) - (unless changed (return))))) + (unless changed (return))) + (setf (component-dominators-computed component) t))) (defun clear-dominators (component) (do-blocks (block component) - (setf (block-dominators block) nil))) + (setf (block-dominators block) nil)) + (setf (component-dominators-computed component) nil)) ;;; DOMINATES-P -- Internal ;;; diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 229ff380b2..8ccf0f50b6 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -591,6 +591,11 @@ necessary, since type inference may take arbitrarily long to converge.") (maybe-mumble "IR2Tran ") (entry-analyze component) + + ;; For on-demand recalculation of dominators, the previously + ;; computed results may be stale. + (clear-dominators component) + (ir2-convert component) (when (policy *lexenv* (>= speed compilation-speed)) diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index ad4c50221a..a1626462f5 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -637,7 +637,9 @@ ;; The default LOOP in the component. (outer-loop (missing-arg) :type cloop) ;; The current sset index - (sset-number 0 :type fixnum)) + (sset-number 0 :type fixnum) + (dominators-computed nil)) + (defprinter (component :identity t) name (reanalyze :test reanalyze)) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index cbb763c1aa..228d03e849 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -38,6 +38,7 @@ (:info name offset lowtag) (:results) (:vop-var vop) + (:node-var node) (:temporary (:sc unsigned-reg) val-temp) (:generator 1 (cond #+ubsan @@ -50,8 +51,8 @@ (or (encode-value-if-immediate value) value))) (t ;; gencgc does not need to emit the barrier for constructors - (unless (member name '(%make-structure-instance make-weak-pointer - %make-ratio %make-complex)) + (unless (or (eq name :allocator) + (sb-c::set-slot-old-p node)) (emit-gc-store-barrier object nil val-temp (vop-nth-arg 1 vop) value)) (gen-cell-set (object-slot-ea object offset lowtag) value val-temp))))) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 03e3e141cc..b3eadd3f3a 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -535,8 +535,10 @@ (value :scs (any-reg descriptor-reg))) (:vop-var vop) (:temporary (:sc unsigned-reg) temp) + (:node-var node) (:generator 1 - (emit-gc-store-barrier object nil temp (vop-nth-arg 1 vop) value) + (unless (sb-c::set-slot-old-p node) + (emit-gc-store-barrier object nil temp (vop-nth-arg 1 vop) value)) (inst mov :dword (ea (- 4 instance-pointer-lowtag) object) value))) (define-vop (%fun-layout %instance-layout) (:translate %fun-layout) @@ -544,7 +546,8 @@ (define-vop (%set-fun-layout %set-instance-layout) (:translate %set-fun-layout) (:generator 1 - (emit-gc-store-barrier object nil temp (vop-nth-arg 1 vop) value) + (unless (sb-c::set-slot-old-p node) + (emit-gc-store-barrier object nil temp (vop-nth-arg 1 vop) value)) (inst mov :dword (ea (- 4 fun-pointer-lowtag) object) value))) (define-vop () (:translate sb-c::layout-eq) From c14cbdb630beb8322f02a15ed8e7fa0a04a4d187 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 21 Apr 2022 17:46:42 -0400 Subject: [PATCH 3174/4023] Remove nonsense comment in SYMBOL-VALUE I've never understood how checking for unbound-marker implies anything about symbol-value of NIL. I tried to do archaeology on CMUCL but it contains the same comment and no reason to believe that "so ... nil is nil" had any more relevance to that code. --- src/compiler/arm/cell.lisp | 3 +-- src/compiler/arm64/cell.lisp | 3 +-- src/compiler/mips/cell.lisp | 3 +-- src/compiler/ppc/cell.lisp | 4 +--- src/compiler/ppc64/cell.lisp | 4 +--- src/compiler/riscv/cell.lisp | 1 - src/compiler/sparc/cell.lisp | 1 - src/compiler/x86-64/cell.lisp | 3 +-- src/compiler/x86/cell.lisp | 3 +-- 9 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/compiler/arm/cell.lisp b/src/compiler/arm/cell.lisp index e45c556fb7..1add9a551b 100644 --- a/src/compiler/arm/cell.lisp +++ b/src/compiler/arm/cell.lisp @@ -48,8 +48,7 @@ (:save-p :compute-only) (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp)) -;;; With Symbol-Value, we check that the value isn't the trap object. So -;;; Symbol-Value of NIL is NIL. +;;; With Symbol-Value, we check that the value isn't the trap object. ;;; (define-vop (symbol-value checked-cell-ref) (:translate symeval) diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 05327adefb..1902ba86db 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -68,8 +68,7 @@ (:vop-var vop) (:save-p :compute-only)) -;;; With Symbol-Value, we check that the value isn't the trap object. So -;;; Symbol-Value of NIL is NIL. +;;; With Symbol-Value, we check that the value isn't the trap object. #+sb-thread (progn (define-vop (set) diff --git a/src/compiler/mips/cell.lisp b/src/compiler/mips/cell.lisp index b90fb43b9c..787645df5c 100644 --- a/src/compiler/mips/cell.lisp +++ b/src/compiler/mips/cell.lisp @@ -52,8 +52,7 @@ (:temporary (:scs (non-descriptor-reg)) temp) (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp)) -;;; With Symbol-Value, we check that the value isn't the trap object. So -;;; Symbol-Value of NIL is NIL. +;;; With Symbol-Value, we check that the value isn't the trap object. ;;; (define-vop (symbol-value checked-cell-ref) (:translate symeval) diff --git a/src/compiler/ppc/cell.lisp b/src/compiler/ppc/cell.lisp index ee69ff7bdb..89ad7b64c9 100644 --- a/src/compiler/ppc/cell.lisp +++ b/src/compiler/ppc/cell.lisp @@ -106,7 +106,6 @@ (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp)) ;;; With SYMBOL-VALUE, we check that the value isn't the trap object. -;;; So SYMBOL-VALUE of NIL is NIL. (define-vop (symbol-global-value checked-cell-ref) (:translate sym-global-val) (:generator 9 @@ -138,8 +137,7 @@ (storew value symbol symbol-value-slot other-pointer-lowtag) DONE)) - ;; With Symbol-Value, we check that the value isn't the trap object. So - ;; Symbol-Value of NIL is NIL. + ;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value) (:translate symeval) (:policy :fast-safe) diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index e94580e810..16526d5d23 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -160,7 +160,6 @@ (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp)) ;;; With SYMBOL-VALUE, we check that the value isn't the trap object. -;;; So SYMBOL-VALUE of NIL is NIL. (define-vop (symbol-global-value checked-cell-ref) (:translate sym-global-val) (:generator 9 @@ -209,8 +208,7 @@ (storew value symbol symbol-value-slot other-pointer-lowtag) DONE)) -;; With Symbol-Value, we check that the value isn't the trap object. So -;; Symbol-Value of NIL is NIL. +;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value) (:translate symeval) (:policy :fast-safe) diff --git a/src/compiler/riscv/cell.lisp b/src/compiler/riscv/cell.lisp index 8fbfcb8091..6f570edf53 100644 --- a/src/compiler/riscv/cell.lisp +++ b/src/compiler/riscv/cell.lisp @@ -119,7 +119,6 @@ (:temporary (:scs (non-descriptor-reg)) temp)) ;;; With Symbol-Value, we check that the value isn't the trap object. -;;; So Symbol-Value of NIL is NIL. #+sb-thread (define-vop (symbol-value checked-cell-ref) (:translate symeval) diff --git a/src/compiler/sparc/cell.lisp b/src/compiler/sparc/cell.lisp index e73ed4970b..2f22a4a938 100644 --- a/src/compiler/sparc/cell.lisp +++ b/src/compiler/sparc/cell.lisp @@ -46,7 +46,6 @@ (:temporary (:scs (descriptor-reg) :from (:argument 0)) obj-temp)) ;;; With Symbol-Value, we check that the value isn't the trap object. -;;; So Symbol-Value of NIL is NIL. (define-vop (symbol-value checked-cell-ref) (:translate symeval) (:generator 9 diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 228d03e849..1173a949e7 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -300,8 +300,7 @@ symbol-reg)))) RETRY)))) - ;; With Symbol-Value, we check that the value isn't the trap object. So - ;; Symbol-Value of NIL is NIL. + ;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value) (:translate symeval) (:policy :fast-safe) diff --git a/src/compiler/x86/cell.lisp b/src/compiler/x86/cell.lisp index c8a8eb757c..26238a2cf8 100644 --- a/src/compiler/x86/cell.lisp +++ b/src/compiler/x86/cell.lisp @@ -127,8 +127,7 @@ (storew value symbol symbol-value-slot other-pointer-lowtag) (emit-label done)))) - ;; With Symbol-Value, we check that the value isn't the trap object. So - ;; Symbol-Value of NIL is NIL. + ;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value) (:translate symeval) (:policy :fast-safe) From 90733c0221e601ad292cda52d6d67498e3179b35 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Thu, 21 Apr 2022 16:01:59 -0700 Subject: [PATCH 3175/4023] Fix package environment interaction with TLF queuing, The Right Way. Achieve this instead by making the fasloader use "shadow" packages for interning symbols into when the package doesn't exist yet. This "shadow" package gets promoted to a real package when the package gets created for real. This deferral mechanism is similar to how named constants get treated. Then we can error out at the end of the fasload if the package really never got created. Now we don't need to kludge %DEFPACKAGE processing in the compiler specifically, which always had the flaw that more primitive package creation operations like MAKE-PACKAGE wouldn't get handled as well. That fixes the pessimization during block compilation which delimits the scope of block compiles in the presence of DEFPACKAGE. This also happens to be a prerequisite for auto TLF smashing, which was hacked in relation to package environments in CMU CL with a similar hack to what we used to do by dumping package fops. This actually doesn't preserve ordering semantics, since the fops necessarily had to be hoisted before component loading, as demonstrated in one of our tests, so now we can do this in a totally correct manner. (yay!) --- NEWS | 2 + src/code/load.lisp | 32 ++++++---------- src/code/package.lisp | 6 +++ src/code/target-package.lisp | 71 ++++++++++++++++++++++++++++++++---- src/cold/exports.lisp | 1 + src/compiler/main.lisp | 14 ------- 6 files changed, 84 insertions(+), 42 deletions(-) diff --git a/NEWS b/NEWS index 9cfd47d408..749be023cc 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,8 @@ changes relative to sbcl-2.2.3: * platform support: ** RUN-PROGRAM is faster on Linux and FreeBSD if close_range(2) is available. + * bug fix: block compilation now interacts more correctly with the creation + of new packages. changes in sbcl-2.2.3 relative to sbcl-2.2.2: * minor incompatible change: SB-THREAD:MUTEX-OWNER may return :THREAD-DEAD diff --git a/src/code/load.lisp b/src/code/load.lisp index 1f3c3f4db6..2aa5e6f15b 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -746,12 +746,13 @@ (error "attempt to load an empty FASL file:~% ~S" (namestring stream))) (maybe-announce-load stream verbose) (let ((fasl-input (make-fasl-input stream print))) - (unwind-protect - (loop while (load-fasl-group fasl-input)) - ;; Nuke the table and stack to avoid keeping garbage on - ;; conservatively collected platforms. - (nuke-fop-vector (%fasl-input-table fasl-input)) - (nuke-fop-vector (%fasl-input-stack fasl-input)))) + (with-deferred-package-names + (unwind-protect + (loop while (load-fasl-group fasl-input)) + ;; Nuke the table and stack to avoid keeping garbage on + ;; conservatively collected platforms. + (nuke-fop-vector (%fasl-input-table fasl-input)) + (nuke-fop-vector (%fasl-input-stack fasl-input))))) t) @@ -840,10 +841,6 @@ ;;;; fops for loading symbols -(defstruct (undefined-package (:copier nil)) - (error nil :read-only t)) -(declaim (freeze-type undefined-package)) - ;;; Cold load has its own implementation of all symbol fops, ;;; but we have to execute define-fop now to assign their numbers. ;;; @@ -871,14 +868,8 @@ (aux-fop-intern (length+flag package fasl-input) (multiple-value-bind (name length elt-type) (read-symbol-name length+flag fasl-input) - (if (undefined-package-p package) - (error 'simple-package-error - :format-control "Error finding package for symbol ~s:~% ~a" - :format-arguments - (list (subseq name 0 length) - (undefined-package-error package))) - (push-fop-table (%intern name length package elt-type t) - fasl-input)))) + (push-fop-table (%intern name length package elt-type t) + fasl-input))) (ensure-hashed (symbol) ;; ENSURE-SYMBOL-HASH when vop-translated is flushable since it is ;; conceptually just a slot reader, however its actual effect is to fill in @@ -915,8 +906,9 @@ (read-char-string-as-varints (fasl-input-stream) package-name) (push-fop-table (handler-case (find-undeleted-package-or-lose package-name) - (simple-package-error (c) - (make-undefined-package :error (princ-to-string c)))) + (simple-package-error (condition) + (declare (ignore condition)) + (make-deferred-package package-name))) (fasl-input)))) ;;;; fops for loading numbers diff --git a/src/code/package.lisp b/src/code/package.lisp index 0d407e12f9..ed9354f25d 100644 --- a/src/code/package.lisp +++ b/src/code/package.lisp @@ -121,6 +121,12 @@ (defmacro package-lock (package) `(logbitp 0 (package-%bits ,package))) +(defmacro with-deferred-package-names (&body body) + #+sb-xc-host + `(progn ,@body) + #-sb-xc-host + `(call-with-deferred-package-names (lambda () ,@body))) + ;;;; IN-PACKAGE (proclaim '(special *package*)) (sb-xc:defmacro in-package (string-designator) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 2352cbc57e..223122e31a 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -999,8 +999,10 @@ The default value of USE is implementation-dependent, and in this implementation it is ~S." *!default-package-use-list*) (prog ((name (stringify-string-designator name)) (nicks (stringify-string-designators nicknames)) - (package (%make-package (make-package-hashtable internal-symbols) - (make-package-hashtable external-symbols))) + (package + (or (resolve-deferred-package name) + (%make-package (make-package-hashtable internal-symbols) + (make-package-hashtable external-symbols)))) clobber) :restart (when (find-package name) @@ -1010,12 +1012,6 @@ implementation it is ~S." *!default-package-use-list*) "Clobber existing package." "A package named ~S already exists" name) (setf clobber t)) - (when (and sb-c::*compile-time-eval* - (eq (sb-c::block-compile sb-c::*compilation*) t)) - (style-warn "Package creation forms limit block compilation and ~ - may cause failure with the use of specified entry ~ - points. Consider moving the package creation form outside the ~ - scope of a block compilation.")) (with-package-graph () ;; Check for race, signal the error outside the lock. (when (and (not clobber) (find-package name)) @@ -2118,6 +2114,65 @@ PACKAGE." ;; cookie. i.e. a cached NIL is correct until the next cache invalidation. (or (null pkg) (and (packagep pkg) (package-%name pkg))))) + +;;;; deferred package handling + +(defvar *deferred-package-names*) + +;;; A deferred package is a package which is not added to the normal +;;; package database until some later point in time. The current +;;; purpose for deferred packages is so that the loader symbol fasl +;;; ops can intern symbols into packages, without the packages +;;; necessarily being created yet. This is important for deferred +;;; top-level form loading, as to not cause loading symbols (which may +;;; appear as literal code constants) to fail early. Since the +;;; deferred package is not added to the normal package database until +;;; the package is actually created, we preserve package environment +;;; semantics at runtime, and give a reasonable error if the package +;;; has not been created by the end of the load. +(defun make-deferred-package (name) + (let ((package (%make-package (make-package-hashtable 0) + (make-package-hashtable 0)))) + (unless *deferred-package-names* ; bind on demand + (setq *deferred-package-names* + (make-info-hashtable :comparator #'pkg-name= + :hash-function #'sxhash))) + (setf (info-gethash name *deferred-package-names*) package) + (setf (package-%name package) name) + package)) + +;;; Return the deferred package object for NAME if it exists, +;;; otherwise return NIL. +(defun resolve-deferred-package (name) + (and (boundp '*deferred-package-names*) + *deferred-package-names* + (let ((package (%get-package name *deferred-package-names*))) + (when package + ;; To simulate remhash. + (setf (info-gethash name *deferred-package-names*) :deleted)) + package))) + +;;; Bind the deferred package name table and test to see if the +;;; deferred package table still has any unresolved entries after +;;; FUNCTION is called. +(defun call-with-deferred-package-names (function) + (let ((*deferred-package-names* nil)) ; bind on demand + (funcall function) + (when *deferred-package-names* + (info-maphash + (lambda (name package) + (unless (eq package :deleted) + (dovector (sym (package-hashtable-cells + (package-internal-symbols package))) + (when (symbolp sym) + (error 'simple-package-error + :format-control + "The loader tried loading the symbol named ~a ~ + into the package named ~a, but the package did ~ + not get defined, and does not exist." + :format-arguments (list (symbol-name sym) name)))))) + *deferred-package-names*)))) + ;;; We don't benefit from these transforms because any time we have a constant ;;; package in our code, we refer to it via #.(FIND-PACKAGE). ;;; This is a necessity due to the fact that historically all packages got renamed diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 42a8a97e9d..50025f2cad 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1208,6 +1208,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") (:use "CL" "SB-ALIEN" "SB-ASSEM" "SB-BIGNUM" "SB-C" "SB-EXT" "SB-INT" "SB-KERNEL" "SB-SYS") (:import-from "SB-VM" "+FIXUP-KINDS+") + (:import-from "SB-IMPL" "MAKE-DEFERRED-PACKAGE" "WITH-DEFERRED-PACKAGE-NAMES") (:export "*ASSEMBLER-ROUTINES*" "GET-ASM-ROUTINE" "+BACKEND-FASL-FILE-IMPLEMENTATION+" diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 8ccf0f50b6..991831c950 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1072,13 +1072,6 @@ necessary, since type inference may take arbitrarily long to converge.") (if (eq (block-compile *compilation*) t) (push tll (toplevel-lambdas *compilation*)) (compile-toplevel (list tll) nil)) - (when (consp form) - (case (car form) - ;; Block compilation can cause packages to be defined after - ;; they are referenced at load time, so we have to delimit the - ;; current block compilation. - ((sb-impl::%defpackage) - (delimit-block-compilation)))) nil)))) ;;; Macroexpand FORM in the current environment with an error handler. @@ -1703,13 +1696,6 @@ necessary, since type inference may take arbitrarily long to converge.") (setf (block-compile compilation) :specified) (setf (entry-points compilation) nil)))) -(defun delimit-block-compilation () - (let ((compilation *compilation*)) - (when (block-compile compilation) - (when (toplevel-lambdas compilation) - (compile-toplevel (nreverse (toplevel-lambdas compilation)) nil) - (setf (toplevel-lambdas compilation) nil))))) - (declaim (ftype function handle-condition-p)) (flet ((get-handled-conditions () (if (boundp '*lexenv*) From 5b60c19e4a9c258a3b46604c3092e9736144e92e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 21 Apr 2022 20:15:45 -0400 Subject: [PATCH 3176/4023] Always allow gdb attachment if #+(and linux sb-devel) regardless of /proc/sys/kernel/yama/ptrace_scope --- src/runtime/main.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/runtime/main.c b/src/runtime/main.c index 18c34fe58d..bf1ca929a2 100644 --- a/src/runtime/main.c +++ b/src/runtime/main.c @@ -1,7 +1,13 @@ #include <interr.h> +#if defined LISP_FEATURE_SB_DEVEL && defined LISP_FEATURE_LINUX +#include <sys/prctl.h> +#endif int main(int argc, char *argv[], char *envp[]) { +#if defined LISP_FEATURE_SB_DEVEL && defined LISP_FEATURE_LINUX + prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY); +#endif extern int initialize_lisp(int argc, char *argv[], char *envp[]); initialize_lisp(argc, argv, envp); lose("unexpected return from initial thread in main()"); From ef71923df1c9ebb92934c58d4510507b75eee5d1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 21 Apr 2022 20:33:25 -0400 Subject: [PATCH 3177/4023] Move prctl() to os_init --- src/runtime/linux-os.c | 4 ++++ src/runtime/main.c | 6 ------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 11538f7f33..650b8283b9 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -49,6 +49,7 @@ #include "thread.h" #include "gc-internal.h" #include <fcntl.h> +#include <sys/prctl.h> #ifdef LISP_FEATURE_X86 /* Prototype for personality(2). Done inline here since the header file @@ -264,6 +265,9 @@ void os_init() #ifdef LISP_FEATURE_SB_FUTEX futex_init(); #endif +#ifdef LISP_FEATURE_SB_DEVEL + prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY); +#endif } #if (defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64)) \ diff --git a/src/runtime/main.c b/src/runtime/main.c index bf1ca929a2..18c34fe58d 100644 --- a/src/runtime/main.c +++ b/src/runtime/main.c @@ -1,13 +1,7 @@ #include <interr.h> -#if defined LISP_FEATURE_SB_DEVEL && defined LISP_FEATURE_LINUX -#include <sys/prctl.h> -#endif int main(int argc, char *argv[], char *envp[]) { -#if defined LISP_FEATURE_SB_DEVEL && defined LISP_FEATURE_LINUX - prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY); -#endif extern int initialize_lisp(int argc, char *argv[], char *envp[]); initialize_lisp(argc, argv, envp); lose("unexpected return from initial thread in main()"); From 3afb807d0b05308c6b987f2074a3d4e8e389c7c8 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 22 Apr 2022 15:46:11 +0100 Subject: [PATCH 3178/4023] Note a bug fix. --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 749be023cc..e73e465a55 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,8 @@ changes relative to sbcl-2.2.3: available. * bug fix: block compilation now interacts more correctly with the creation of new packages. + * bug fix: internal compiler error in array reference + optimizer. (lp#1966624) changes in sbcl-2.2.3 relative to sbcl-2.2.2: * minor incompatible change: SB-THREAD:MUTEX-OWNER may return :THREAD-DEAD From aea6f6d342e41063e08b45eb817d08eca7033a7c Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 22 Apr 2022 15:46:49 +0100 Subject: [PATCH 3179/4023] Adjust freeze script Now that CCL/SBCL fasl binary equivalence is tracked by CI, make building from CCL optional during freeze, and build locally using CLISP instead. --- freeze.sh | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/freeze.sh b/freeze.sh index 96020a5f75..632f2a7d0a 100644 --- a/freeze.sh +++ b/freeze.sh @@ -23,6 +23,7 @@ usage: $0 VERSION SBCL_RELEASE_DIR: Absolute path to directory containing all the build artifacts. If not defined, a new build directory is created in \$PWD. CCL: Path to Clozure Common Lisp, suitable as an argument to make.sh + CLISP: Path to CLISP, suitable as an argument to make.sh EOF exit 1 } @@ -40,9 +41,9 @@ then usage "Extra command-line arguments: $@" fi -if [ -z "$CCL" ] +if [ -z "$CLISP" ] then - usage "CCL environment variable not set" + usage "CLISP environment variable not set" fi SBCL_RELEASE_DIR=${SBCL_RELEASE_DIR:-$(mktemp -d $PWD/sbcl-release-dir-$(date +%Y%m%d)-XXXXXXXXX)} @@ -131,18 +132,29 @@ fi # check build from ccl -if [ ! -d $SBCL_RELEASE_DIR/obj_from-xc_ccl ]; then +if [ -n "$CCL" ]; then + if [ ! -d $SBCL_RELEASE_DIR/obj_from-xc_ccl ]; then + cd $SBCL_DIR + sh clean.sh + nice -20 ./make.sh "$CCL" >> $LOGFILE 2>&1 + cd $SBCL_RELEASE_DIR + + mv $SBCL_DIR/obj/from-xc obj_from-xc_ccl + fi +fi + +if [ ! -d $SBCL_RELEASE_DIR/obj_from-xc_clisp ]; then cd $SBCL_DIR sh clean.sh - nice -20 ./make.sh "$CCL" >> $LOGFILE 2>&1 + nice -20 ./make.sh "$CLISP" >> $LOGFILE 2>&1 cd $SBCL_RELEASE_DIR - mv $SBCL_DIR/obj/from-xc obj_from-xc_ccl + mv $SBCL_DIR/obj/from-xc obj_from-xc_clisp fi -# TODO: check binary-equality between ccl, sbcl objs +# TODO: check binary-equality between ccl, clisp, sbcl objs -# TODO: check build from clisp, abcl +# TODO: check build from abcl, ecl # upload rc build From 3e437d314cdf1a8501514e816dee9570aae269f1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 22 Apr 2022 11:11:57 -0400 Subject: [PATCH 3180/4023] Tweak rejection logic in scavenge_root_gens Using 'generation' as the primary criterion potentially avoids extracting bits from the packed 'type' field. Fix barely parseable comment that expressed the same idea in multiple ways each either subtly wrong or egregiously wrong. e.g. "so do need scavenging" is supposed to have said "do NOT". --- src/runtime/gencgc.c | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 407f2e6a38..6a2793ccbb 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2967,29 +2967,21 @@ static page_index_t scan_mixed_root_cards(page_index_t page, generation_index_t } #endif -/* Scavenge all generations from FROM to TO, inclusive, except for - * new_space which needs special handling, as new objects may be - * added which are not checked here - use scavenge_newspace generation. +/* Scavenge all generations greater than or equal to FROM. * - * Write-protected pages should not have any pointers to the - * from_space so do need scavenging; thus write-protected pages are - * not always scavenged. There is some code to check that these pages - * are not written; but to check fully the write-protected pages need - * to be scavenged by disabling the code to skip them. + * Under the current scheme when a generation is GCed, the generations + * younger than it are empty. So, when a generation is being GCed it + * is only necessary to examine generations older than it for pointers. * - * Under the current scheme when a generation is GCed the younger - * generations will be empty. So, when a generation is being GCed it - * is only necessary to scavenge the older generations for pointers - * not the younger. So a page that does not have pointers to younger - * generations does not need to be scavenged. + * Logical or physical write-protection is used to note pages that don't + * contain old->young pointers. But pages can be written without having + * such pointers. After the pages are scavenged here, they are examined + * for old->young pointer, are marked clean (unprotected) if there are none. * - * The write-protection can be used to note pages that don't have - * pointers to younger pages. But pages can be written without having - * pointers to younger generations. After the pages are scavenged here - * they can be scanned for pointers to younger generations and if - * there are none the page can be write-protected. + * Write-protected pages will not have any pointers to the + * from_space so do not need scavenging, but might be visited + * as part of a contiguous range containing a relevant page. * - * One complication is when the newspace is the top temp. generation. */ static void scavenge_root_gens(generation_index_t from) @@ -3000,15 +2992,10 @@ scavenge_root_gens(generation_index_t from) while (i < limit) { generation_index_t generation = page_table[i].gen; - if (!page_boxed_p(i) + if (generation < from || generation == SCRATCH_GENERATION /* Not sure why word_used is checked. Probably because reset_page_flags() * does not change the page's gen to an unused number. Perhaps it should */ - || !page_words_used(i) - || (generation < from) - /* Yet another reason it's bad that SCRATCH_GENERATION is numerically - * higher than PSEUDO_STATIC: we wouldn't need this '<=' test if SCRATCH - * were numerically lowest */ - || (generation > PSEUDO_STATIC_GENERATION)) { + || !page_boxed_p(i) || !page_words_used(i)) { ++i; continue; } From d5600e36f26bb13df1057ef9127c827b8a58338e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 22 Apr 2022 11:36:11 -0400 Subject: [PATCH 3181/4023] Unify some logic in lisp_alloc Asserting that we didn't overrun the TLAB on this allocation is subsumed by the check for whether to refill the TLAB right away. --- src/runtime/gencgc.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 6a2793ccbb..f6d49c369c 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -4840,29 +4840,27 @@ lisp_alloc(int largep, struct alloc_region *region, sword_t nbytes, new_obj = gc_alloc_large(nbytes, page_type, region, 1); else { ensure_region_closed(region, page_type); + // hold the lock after alloc_new_region if a cons page + int release = page_type != PAGE_TYPE_CONS; + new_obj = gc_alloc_new_region(nbytes, page_type, region, release); + region->free_pointer = (char*)new_obj + nbytes; + // addr_diff asserts that 'end' >= 'free_pointer' + int remaining = addr_diff(region->end_addr, region->free_pointer); + // Try to avoid the next Lisp -> C -> Lisp round-trip by possibly + // requesting yet another region. if (page_type == PAGE_TYPE_CONS) { - new_obj = gc_alloc_new_region(nbytes, PAGE_TYPE_CONS, region, 0); // don't release free_pages_lock - region->free_pointer = (char*)new_obj + nbytes; - gc_assert(region->free_pointer <= region->end_addr); - // Refill now if there is only 1 cons remaining on the page. - // This can often avoid the next Lisp -> C -> Lisp round-trip. - if (addr_diff(region->end_addr, region->free_pointer) <= 2 * N_WORD_BYTES) { + if (remaining <= CONS_SIZE * N_WORD_BYTES) { // Refill now if <= 1 more cons to go gc_close_region(region, page_type); // Request > 2 words, forcing a new page to be claimed. gc_alloc_new_region(4 * N_WORD_BYTES, page_type, region, 0); // don't release } ret = mutex_release(&free_pages_lock); gc_assert(ret); - } else { - new_obj = gc_alloc_new_region(nbytes, page_type, region, 1); // do release free_pages_lock - region->free_pointer = (char*)new_obj + nbytes; - gc_assert(region->free_pointer <= region->end_addr); - if (addr_diff(region->end_addr, region->free_pointer) <= 4 * N_WORD_BYTES - && TryEnterCriticalSection(&free_pages_lock)) { - gc_close_region(region, page_type); - // Request > 4 words, forcing a new page to be claimed. - gc_alloc_new_region(6 * N_WORD_BYTES, page_type, region, 1); // do release - } + } else if (remaining <= 4 * N_WORD_BYTES + && TryEnterCriticalSection(&free_pages_lock)) { + gc_close_region(region, page_type); + // Request > 4 words, forcing a new page to be claimed. + gc_alloc_new_region(6 * N_WORD_BYTES, page_type, region, 1); // do release } } From 88d2bc458ee5a1992bdd59ce26bcbc6fe92c0aa6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 22 Apr 2022 19:25:46 +0300 Subject: [PATCH 3182/4023] Don't delete empty special bindings if there is dynamic-extent around. The usual pain inflicted by the fickle dynamic-extent handling. Reported by Eric Marsden. --- src/compiler/srctran.lisp | 5 ++++- tests/dynamic-extent.pure.lisp | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 9c20153c36..1f7e491711 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -5185,7 +5185,10 @@ (and succ (block-start succ) (neq (node-enclosing-cleanup node) - (block-start-cleanup succ))))) + (block-start-cleanup succ)))) + (do-nested-cleanups (cleanup (node-lexenv node) t) + (when (eq (cleanup-kind cleanup) :dynamic-extent) + (return)))) (setf (lexenv-cleanup (node-lexenv node)) nil) (flush-combination prev) nil) diff --git a/tests/dynamic-extent.pure.lisp b/tests/dynamic-extent.pure.lisp index cb096cfe3f..676096932f 100644 --- a/tests/dynamic-extent.pure.lisp +++ b/tests/dynamic-extent.pure.lisp @@ -1683,3 +1683,14 @@ (lambda (j &rest points) (apply continuation j (mapcar identity points))))))) (() '(1 #()) :test #'equalp))) + +(with-test (:name :special-bind-removal) + (checked-compile-and-assert + () + `(lambda (a) + (multiple-value-prog1 (eval a) + (let ((* (let ((x (list 1))) + (setf (car x) 1) + x))) + (declare (dynamic-extent *))))) + ((1) 1))) From d9a4af32a70cd474c4eb0e285d0c8853db4c37e3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 22 Apr 2022 19:46:54 +0300 Subject: [PATCH 3183/4023] Less conservative dynamic-extent protection. Don't look at all cleanups, only the ones up to the next block. --- src/compiler/srctran.lisp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 1f7e491711..8599e7e472 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -5184,11 +5184,13 @@ (let ((succ (car (block-succ (node-block node))))) (and succ (block-start succ) - (neq (node-enclosing-cleanup node) - (block-start-cleanup succ)))) - (do-nested-cleanups (cleanup (node-lexenv node) t) - (when (eq (cleanup-kind cleanup) :dynamic-extent) - (return)))) + (let ((start-cleanup (block-start-cleanup succ))) + (and (neq (node-enclosing-cleanup node) start-cleanup) + (do-nested-cleanups (cleanup (node-lexenv node) t) + (when (eq cleanup start-cleanup) + (return t)) + (when (eq (cleanup-kind cleanup) :dynamic-extent) + (return)))))))) (setf (lexenv-cleanup (node-lexenv node)) nil) (flush-combination prev) nil) From 7e546cc774762cebe16297d815a3d6f0fd606691 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 22 Apr 2022 12:57:00 -0400 Subject: [PATCH 3184/4023] Improve write_generation_stats * Divide "Dirty" by cards per page to yield more intuitive display * Show total % waste --- src/runtime/gencgc.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index f6d49c369c..0a69d786a8 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -353,7 +353,7 @@ os_vm_size_t gencgc_alloc_granularity = GENCGC_ALLOC_GRANULARITY; /* Count the number of pages in the given generation. * Additionally, if 'n_write_protected' is non-NULL, then assign - * into *n_write_protected the count of marked cards. + * into *n_write_protected the count of marked pages. */ static page_index_t count_generation_pages(generation_index_t generation, page_index_t* n_dirty) @@ -368,7 +368,8 @@ count_generation_pages(generation_index_t generation, page_index_t* n_dirty) for (j=0; j<CARDS_PER_PAGE; ++j, ++card) if (card_dirtyp(card)) ++dirty; } - if (n_dirty) *n_dirty = dirty; + // divide by cards per page rounding up + if (n_dirty) *n_dirty = (dirty + (CARDS_PER_PAGE-1)) / CARDS_PER_PAGE; return total; } @@ -491,15 +492,19 @@ write_generation_stats(FILE *file) fprintf(file, gen_num==0?" -" : " %7"PAGE_INDEX_FMT, n_dirty); fprintf(file, " %3d %7.4f\n", gen->num_gc, generation_average_age(gen_num)); } - double frac = 100 * (double)bytes_allocated / (double)dynamic_space_size; + page_index_t tot_pages = coltot[0] + coltot[1] + coltot[2] + coltot[3] + coltot[4] + + coltot[5] + coltot[6] + coltot[7] + coltot[8]; + uword_t waste = npage_bytes(tot_pages) - bytes_allocated; + double pct_waste = (double)waste / (double)npage_bytes(tot_pages) * 100; + double heap_use_frac = 100 * (double)bytes_allocated / (double)dynamic_space_size; fprintf(file, "-- %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT - "%7"PAGE_INDEX_FMT" %18"OS_VM_SIZE_FMT + "%7"PAGE_INDEX_FMT" %6.1f%12"OS_VM_SIZE_FMT " [%.1f%% of %"OS_VM_SIZE_FMT" max]\n", - coltot[0], coltot[1], coltot[2], coltot[3], coltot[4], coltot[5], coltot[6], - coltot[7], coltot[8], - (uintptr_t)bytes_allocated, frac, (uintptr_t)dynamic_space_size); + coltot[0], coltot[1], coltot[2], coltot[3], coltot[4], coltot[5], coltot[6], + coltot[7], coltot[8], pct_waste, + (uintptr_t)bytes_allocated, heap_use_frac, (uintptr_t)dynamic_space_size); #ifdef LISP_FEATURE_X86 fpu_restore(fpu_state); From 643a7fe6f2a5c19cd619ff70f7ff532e92585482 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 22 Apr 2022 22:59:11 -0400 Subject: [PATCH 3185/4023] x86-64: Move a static-space constant There are 9 words needed for alloc regions now, not that we use them, but nonetheless there was an address conflict. --- src/compiler/generic/genesis.lisp | 4 +--- src/compiler/x86-64/type-vops.lisp | 7 ++++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 9094ab4853..f0e2686fac 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1992,9 +1992,7 @@ core and return a descriptor to it." ;; Embed the constant in an unboxed array. This shouldn't be necessary, ;; because the start of the scanned space is STATIC_SPACE_OBJECTS_START, ;; but not all uses strictly follow that rule. (They should though) - ;; This does not conflict with the 2 alloc regions at the start of the space, - ;; because the constant is in word index 10, and the array header is in - ;; word index 8, and the two regions are in indices 0 through 7. + ;; This must not conflict with the alloc regions at the start of the space. (make-random-descriptor (logior (- sb-vm::non-negative-fixnum-mask-constant-wired-address (* 2 sb-vm:n-word-bytes)) sb-vm:other-pointer-lowtag)))) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index b3eadd3f3a..1ee3b6f2b9 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -308,7 +308,12 @@ (defconstant non-negative-fixnum-mask-constant #x8000000000000001) (defconstant non-negative-fixnum-mask-constant-wired-address - (+ static-space-start (* 10 n-word-bytes))) + (+ static-space-start (* 12 n-word-bytes))) +;; the preceding constant is embedded in an array, +;; the header of which must not overlap the static alloc regions +#-sb-thread +(aver (>= (- non-negative-fixnum-mask-constant-wired-address (* 2 n-word-bytes)) + (+ (max boxed-region cons-region mixed-region) (* 3 n-word-bytes)))) ;;; An (unsigned-byte 64) can be represented with either a positive ;;; fixnum, a bignum with exactly one positive digit, or a bignum with From 6e19f8c7a30d99ccaddd03c8d3a087b2b1045ef0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 23 Apr 2022 10:36:29 -0400 Subject: [PATCH 3186/4023] Avoid iterating from static-space-start in print-allocated-objects --- src/code/room.lisp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/code/room.lisp b/src/code/room.lisp index 22efebb5ad..cbd41aa631 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -113,7 +113,9 @@ (defun %space-bounds (space) (macrolet ((bounds (a b) `(values (%make-lisp-obj ,a) (%make-lisp-obj ,b)))) (ecase space - (:static + (:static ;; These bounds are appropriate for computing the space usage + ;; but NOT for computing iteration bounds, because there are + ;; "unformatted" words preceding the lowest addressable object. (bounds static-space-start (sap-int *static-space-free-pointer*))) (:read-only @@ -325,15 +327,10 @@ We could try a few things to mitigate this: (:static ;; Static space starts with NIL, which requires special ;; handling, as the header and alignment are slightly off. - (multiple-value-bind (start end) (%space-bounds space) - (declare (ignore start)) - (funcall fun nil symbol-widetag (* sizeof-nil-in-words n-word-bytes)) - (let ((start (+ (logandc2 nil-value lowtag-mask) - (ash (- sizeof-nil-in-words 2) word-shift)))) - (map-objects-in-range fun - (ash start (- n-fixnum-tag-bits)) - end)))) - + (funcall fun nil symbol-widetag (* sizeof-nil-in-words n-word-bytes)) + (let ((start (%make-lisp-obj static-space-objects-start)) + (end (%make-lisp-obj (sap-int *static-space-free-pointer*)))) + (map-objects-in-range fun start end))) ((:read-only #-gencgc :dynamic) ;; Read-only space (and dynamic space on cheneygc) is a block ;; of contiguous allocations. @@ -722,6 +719,8 @@ We could try a few things to mitigate this: (type stream stream) (type spaces space) (type (or index null) type larger smaller count)) (multiple-value-bind (start end) (%space-bounds space) + (when (eq space :static) + (setq start (%make-lisp-obj static-space-objects-start))) (let* ((space-start (ash start n-fixnum-tag-bits)) (space-end (ash end n-fixnum-tag-bits)) (space-size (- space-end space-start)) From 2afcd4229d75db423df3d7c8d127a6cd029a197d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 24 Apr 2022 21:43:21 -0400 Subject: [PATCH 3187/4023] Add some TODOs --- src/compiler/typetran.lisp | 13 +++++++++++++ src/pcl/braid.lisp | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 31f009b829..0fb07b2cb8 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -854,6 +854,19 @@ ;;; object's layout can ever be EQ to that of the ancestor. ;;; e.g. a fixnum as representative of class REAL. ;;; So in actual practice, you can't make something that is a pure STREAM, etc. + +;;; TODOs: +;;; 1. There is an additional tweak that can potentially return false in one fewer +;;; conditional branch if the layout being tested has depthoid 8 (or 9 if #+64-bit). +;;; In that scenario, if the ID word of the candidate structure's layout does not +;;; exist, then it's the 0th bitmap word and safe to read always. Therefore +;;; STRUCTURE-IS-A and depthoid can be tested in that order. If there is no ID match, +;;; there's no depthoid test. If there is an ID match, it's the same as before. +;;; 2. Since all backends implement STRUCTURE-IS-A, is there any reason that the +;;; depthoid test is in the transform's expansion and not baked into that vop? +;;; Putting it in the vop could be better for some backends, +;;; and would eliminate the ad-hoc LAYOUT-DEPTHOID-GE vop. + #-(or x86 x86-64) ; vop-translated for these 2 (defmacro layout-depthoid-ge (layout depthoid) `(>= (wrapper-depthoid ,layout) ,depthoid)) diff --git a/src/pcl/braid.lisp b/src/pcl/braid.lisp index bbaebf0613..fb1d14ab2d 100644 --- a/src/pcl/braid.lisp +++ b/src/pcl/braid.lisp @@ -268,6 +268,12 @@ ;; but this approach avoids changing how PCL uses MAKE-LAYOUT. ;; The big comment above MAKE-IMMOBILE-FUNINSTANCE in src/code/x86-64-vm ;; explains why we differentiate between SGF and everything else. + ;; FIXME: we should assert that this is not a STRUCTURE-OBJECT, + ;; because there must not be additional ID words preceding the bitmap. + ;; STANDARD-OBJECT can't generally use a fixed number of ID slots + ;; because of arbitrary changes to inheritance being permissible. + ;; On the other hand, we do create a new layout for each change + ;; to superclasses, so maybe it's possible. (dovector (ancestor inherits) (when (eq ancestor #.(find-layout 'function)) (%raw-instance-set/signed-word layout (sb-kernel::type-dd-length sb-vm:layout) From 13bccfbe63ff95e2140882f9adf173a05cc7a1a6 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sun, 24 Apr 2022 20:05:54 -0700 Subject: [PATCH 3188/4023] Revert "Simplify emission of constant TNs." This reverts commit bdf77715d0f74687a459d1e23d63764928c9b5f2. --- src/compiler/ir2tran.lisp | 14 ++---- src/compiler/tn.lisp | 91 +++++++++++++++++++++---------------- src/compiler/x86-64/vm.lisp | 1 - 3 files changed, 54 insertions(+), 52 deletions(-) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 09f1f2281d..df2898700f 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -65,22 +65,14 @@ (lambda-var (unless (lambda-var-indirect leaf) (find-in-environment leaf env))) - (constant (constant-tn leaf)) + (constant (make-constant-tn leaf)) (t nil))) -;;; If LEAF already has a constant TN, return that, otherwise make a -;;; TN for it. -(defun constant-tn (leaf) - (declare (type constant leaf)) - (or (leaf-info leaf) - (setf (leaf-info leaf) - (make-constant-tn leaf)))) - ;;; This is used to conveniently get a handle on a constant TN during ;;; IR2 conversion. It returns a constant TN representing the Lisp ;;; object VALUE. (defun emit-constant (value) - (constant-tn (find-constant value))) + (make-constant-tn (find-constant value))) ;;; Convert a REF node. The reference must not be delayed. (defun ir2-convert-ref (node block) @@ -107,7 +99,7 @@ (vop ancestor-frame-ref node block tn (leaf-info leaf) res)))) (t (emit-move node block tn res))))) (constant - (move-lvar-result node block (list (constant-tn leaf)) lvar) + (move-lvar-result node block (list (make-constant-tn leaf)) lvar) (return-from ir2-convert-ref)) (functional (ir2-convert-closure node block leaf res)) diff --git a/src/compiler/tn.lisp b/src/compiler/tn.lisp index 6bae7af691..01ad8b8082 100644 --- a/src/compiler/tn.lisp +++ b/src/compiler/tn.lisp @@ -221,40 +221,49 @@ ;;; EMIT-MOVES-AND-COERCIONS. That's wasteful. (defun make-constant-tn (constant &optional force-boxed) (declare (type constant constant)) - (multiple-value-bind (immed null-offset) - (immediate-constant-sc (constant-value constant)) - ;; currently NULL-OFFSET is used only on ARM64 - (if null-offset - (let ((tn (component-live-tn - (make-wired-tn (primitive-type (leaf-type constant)) - immed - null-offset - (specifier-type 'null))))) - (setf (tn-leaf tn) constant - (leaf-info constant) tn)) - (let* ((component (component-info *component-being-compiled*)) - ;; If a constant has either an immediate or boxed - ;; representation (e.g. double-float) postpone the SC - ;; choice until SELECT-REPRESENTATIONS. - (sc (cond ((or force-boxed (not immed)) - (sc-or-lose 'constant)) - ((boxed-immediate-sc-p immed) - (svref *backend-sc-numbers* immed)))) - (res (make-tn 0 :constant (primitive-type (leaf-type constant)) sc))) - ;; Objects of type SYMBOL can be immediate but they still go in the constants - ;; because liveness depends on pointer tracing without looking at code-fixups. - (when (or (not immed) force-boxed - #+immobile-space - (let ((val (constant-value constant))) - (or (and (symbolp val) (not (sb-vm:static-symbol-p val))) - (typep val 'wrapper)))) - (let ((constants (ir2-component-constants component))) - (setf (tn-offset res) - (vector-push-extend constant constants)))) - (push-in tn-next res (ir2-component-constant-tns component)) - (setf (tn-type res) (leaf-type constant)) - (setf (tn-leaf res) constant) - res)))) + (or (leaf-info constant) + (multiple-value-bind (immed null-offset) + (immediate-constant-sc (constant-value constant)) + ;; currently NULL-OFFSET is used only on ARM64 + (if null-offset + (let ((tn (component-live-tn + (make-wired-tn (primitive-type (leaf-type constant)) + immed + null-offset + (specifier-type 'null))))) + (setf (tn-leaf tn) constant + (leaf-info constant) tn)) + (let* ((boxed (or (not immed) + (boxed-immediate-sc-p immed))) + (component (component-info *component-being-compiled*)) + ;; If a constant has either an immediate or boxed + ;; representation (e.g. double-float) postpone the SC + ;; choice until SELECT-REPRESENTATIONS. + (sc (cond (boxed + (if immed + (svref *backend-sc-numbers* immed) + (sc-or-lose 'constant))) + (force-boxed + (setf immed nil) + (sc-or-lose 'constant)))) + (res (make-tn 0 :constant (primitive-type (leaf-type constant)) sc))) + ;; Objects of type SYMBOL can be immediate but they still go in the constants + ;; because liveness depends on pointer tracing without looking at code-fixups. + (when (and sc + (or (not immed) + #+immobile-space + (let ((val (constant-value constant))) + (or (and (symbolp val) (not (sb-vm:static-symbol-p val))) + (typep val 'wrapper))))) + (let ((constants (ir2-component-constants component))) + (setf (tn-offset res) + (vector-push-extend constant constants)))) + (when sc + (setf (leaf-info constant) res)) + (push-in tn-next res (ir2-component-constant-tns component)) + (setf (tn-type res) (leaf-type constant)) + (setf (tn-leaf res) constant) + res))))) ;;; Extracted from above (defun constant-sc (constant) @@ -264,12 +273,14 @@ (immediate-constant-sc (constant-value constant)) (if null-offset immed - (cond ((not immed) - (sc-or-lose 'constant)) - ((boxed-immediate-sc-p immed) - (svref *backend-sc-numbers* immed)) - (t - (sc-or-lose 'constant))))))) + (let ((boxed (or (not immed) + (boxed-immediate-sc-p immed)))) + (cond (boxed + (if immed + (svref *backend-sc-numbers* immed) + (sc-or-lose 'constant))) + (t + (sc-or-lose 'constant)))))))) (defun make-load-time-value-tn (handle type) (let* ((component (component-info *component-being-compiled*)) diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index 5b09a72531..0d31e1de5c 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -197,7 +197,6 @@ ;; non-immediate constants in the constant pool (constant constant) - ;; some FP constants can be generated in the i387 silicon (fp-single-zero immediate-constant) (fp-double-zero immediate-constant) (fp-complex-single-zero immediate-constant) From 1bbd98ffa3357b85d36177b6181c573b9f96133d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 25 Apr 2022 17:34:21 +0300 Subject: [PATCH 3189/4023] Don't transform bignump + integer<. Integer< checks for all INTEGERs, which includes fixnums. Separate VOPs could work on bignums, but (and bignump (< x 0)) are probably rare. Fixes lp#1970154 --- src/compiler/ir2opt.lisp | 4 ++-- tests/compiler-2.pure.lisp | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 722900e445..805dd8947a 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -999,7 +999,7 @@ ;; and load the header byte. ;; Replace the preceding INTEGERP VOP with an appropriate ;; <-integer-fixnum, which checks for INTEGER. - (defoptimizer (vop-optimize (bignump integerp)) (vop) + (defoptimizer (vop-optimize integerp) (vop) (when (boundp '*2block-info*) (destructuring-bind (target not-p) (vop-codegen-info vop) (let ((target-block (gethash target *2block-info*))) @@ -1060,7 +1060,7 @@ (values (invert) cmp-target nil) (values (vop-info cmp) cmp-target nil))) (t - (return-from vop-optimize-bignump-optimizer))) + (return-from vop-optimize-integerp-optimizer))) (prog1 (emit-and-insert-vop (vop-node vop) (vop-block vop) new-vop diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index ed11c160f0..9b0d57afa4 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3656,3 +3656,14 @@ ((46 64 3 18 36 49 37) 1) (t A))) ((-5) -5))) + +(with-test (:name :bignump-integer-<) + (checked-compile-and-assert + () + `(lambda (a) + (declare (type integer a)) + (if (and (typep a 'bignum) (< a 0)) + t + nil)) + ((-1) nil) + (((- (expt 2 300))) t))) From e7bd68671fcdd98382c78eb31c4d45738e9edc99 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 25 Apr 2022 10:36:39 -0400 Subject: [PATCH 3190/4023] Fix DO-LAYOUT-BITMAP When implementing variable-length trailing bitmaps, I half forgot that there were variable-length data for the layout IDs of :INCLUDEd types. C code was right but some Lisp code wasn't. BITMAP-NWORDS was right if the depthoid did not require appending to the reserved ID words. There is space for 6 included IDs by default (STRUCTURE-OBJECT being implicit), so for typical structure definitions, no bug was evident. --- src/code/class.lisp | 14 +-- src/code/early-classoid.lisp | 14 ++- src/code/early-raw-slots.lisp | 30 ++++++ src/code/target-defstruct.lisp | 10 +- src/cold/exports.lisp | 1 + tests/defstruct.impure.lisp | 57 ++--------- tests/layouts.pure.lisp | 178 +++++++++++++++++++++++++++++++++ 7 files changed, 238 insertions(+), 66 deletions(-) diff --git a/src/code/class.lisp b/src/code/class.lisp index fe389a8190..cd7b48aa67 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -343,22 +343,18 @@ between the ~A definition and the ~A definition" table)) nil) -;;; Record LAYOUT as the layout for its class, adding it as a subtype +;;; Record WRAPPER as the layout for its class, adding it as a subtype ;;; of all superclasses. This is the operation that "installs" a ;;; layout for a class in the type system, clobbering any old layout. ;;; However, this does not modify the class namespace; that is a ;;; separate operation (think anonymous classes.) ;;; -- If INVALIDATE, then all the layouts for any old definition ;;; and subclasses are invalidated, and the SUBCLASSES slot is cleared. -;;; -- If DESTRUCT-LAYOUT, then this is some old layout, and is to be -;;; destructively modified to hold the same type information. +;;; -- If MODIFY is given, then it is some old layout, and is to be +;;; destructively altered to hold the same data as WRAPPER. (macrolet ((set-bitmap-from-layout (to-layout from-layout) - `(let ((to-index - (+ (type-dd-length sb-vm:layout) - (calculate-extra-id-words (layout-depthoid ,to-layout)))) - (from-index - (+ (type-dd-length sb-vm:layout) - (calculate-extra-id-words (layout-depthoid ,from-layout))))) + `(let ((to-index (bitmap-start ,to-layout)) + (from-index (bitmap-start ,from-layout))) (dotimes (i (bitmap-nwords ,from-layout)) (%raw-instance-set/word ,to-layout (+ to-index i) (%raw-instance-ref/word ,from-layout (+ from-index i))))))) diff --git a/src/code/early-classoid.lisp b/src/code/early-classoid.lisp index 4f0c0c4bb1..1bcc4b6b67 100644 --- a/src/code/early-classoid.lisp +++ b/src/code/early-classoid.lisp @@ -376,17 +376,21 @@ #-sb-xc-host (progn -(declaim (inline bitmap-nwords bitmap-all-taggedp)) +(declaim (inline bitmap-start bitmap-nwords bitmap-all-taggedp)) +(defun bitmap-start (layout) + (+ (type-dd-length sb-vm:layout) + (calculate-extra-id-words (layout-depthoid layout)))) (defun bitmap-nwords (layout) (declare (sb-vm:layout layout)) - (- (%instance-length layout) (type-dd-length sb-vm:layout))) - + (- (%instance-length layout) + (calculate-extra-id-words (layout-depthoid layout)) + (type-dd-length sb-vm:layout))) (defun bitmap-all-taggedp (layout) ;; All bitmaps have at least 1 word; read that first. - (and (= (%raw-instance-ref/signed-word layout (type-dd-length sb-vm:layout)) + (and (= (%raw-instance-ref/signed-word layout (bitmap-start layout)) +layout-all-tagged+) ;; Then check that there are no additional words. - (= (%instance-length layout) (1+ (type-dd-length sb-vm:layout))))) + (= (bitmap-nwords layout) 1))) #+metaspace ; If metaspace, then WRAPPER has no flags; they're in the LAYOUT. (defmacro wrapper-flags (x) `(layout-flags (wrapper-friend ,x))) diff --git a/src/code/early-raw-slots.lisp b/src/code/early-raw-slots.lisp index 11d8ddac17..d70407fa33 100644 --- a/src/code/early-raw-slots.lisp +++ b/src/code/early-raw-slots.lisp @@ -241,3 +241,33 @@ (when (logbitp 0 ,mask) ,@body) (setq ,mask (ash ,mask -1) ,nbits (truly-the fixnum (1- ,nbits))))))) + +;;; FIXME: at the earliest opportunity, either express DO-INSTANCE-TAGGED-SLOT +;;; in terms of DO-LAYOUT-BITMAP or apply this diff: +#| +--- a/src/code/early-raw-slots.lisp ++++ b/src/code/early-raw-slots.lisp +@@ -194,6 +194,7 @@ + ;;; I have a love/hate relationship with this macro. + ;;; It's more efficient than iterating over DSD-SLOTS, and editcore would + ;;; have a harder time using DSD-SLOTS. But it's too complicated. + #-sb-xc-host + (defmacro do-instance-tagged-slot ((index-var thing &optional (pad t) layout-expr) + &body body) +@@ -210,12 +211,12 @@ + (%instance-ref ,instance 0))) + (truly-the sb-vm:layout + (if (eql l 0) #.(find-layout 't) l))))) ++ (,bitmap-index (bitmap-start ,layout)) + ;; Shift out 1 bit if skipping bit 0 of the 0th mask word + ;; because it's not user-visible data. +- (,mask (ash (%raw-instance-ref/signed-word ,layout (type-dd-length sb-vm:layout)) ++ (,mask (ash (%raw-instance-ref/signed-word ++ ,layout (prog1 ,bitmap-index (incf ,bitmap-index))) + (- sb-vm:instance-data-start))) +- ;; Start counting from the next bitmap word as we've consumed one already +- (,bitmap-index (1+ (type-dd-length sb-vm:layout))) + (,bitmap-limit (%instance-length ,layout)) + ;; If this was the last word of the bitmap, then the high bit + ;; is infinitely sign-extended, and we can keep right-shifting +|# diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index ca4e32aea5..f076868f92 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -320,12 +320,12 @@ ;;; Similar to DO-INSTANCE-TAGGED-SLOT but iterating over all words. (defmacro do-layout-bitmap ((index-var taggedp-var layout count) &body guts) `(let* ((layout ,layout) - ;; Start counting from the next bitmap word as we've consumed one already - (bitmap-word-index ,(1+ (type-dd-length sb-vm:layout))) + (bitmap-word-index (bitmap-start layout)) (bitmap-word-limit (%instance-length layout)) ;; Shift out 1 bit if skipping bit 0 of the 0th mask word ;; because it's not user-visible data. - (mask (ash (%raw-instance-ref/signed-word layout ,(type-dd-length sb-vm:layout)) + (mask (ash (%raw-instance-ref/signed-word + layout (prog1 bitmap-word-index (incf bitmap-word-index))) ,(- sb-vm:instance-data-start))) ;; If this was the last word of the bitmap, then the high bit ;; is infinitely sign-extended, and we can keep right-shifting @@ -338,7 +338,7 @@ (do ((,index-var sb-vm:instance-data-start (1+ ,index-var)) (end ,count)) ((>= ,index-var end)) - (declare (type (unsigned-byte 14) ,index-var)) + (declare (type (unsigned-byte 14) ,index-var end)) ;; If mask was fully consumed, fetch the next bitmap word (when (zerop nbits) (setq mask (%raw-instance-ref/signed-word layout bitmap-word-index) @@ -376,6 +376,8 @@ (fast-loop)) (let ((res (%make-instance/mixed len))) (%set-instance-layout res layout) + ;; DO-LAYOUT-BITMAP does not visit the LAYOUT itself + ;; (if that occupies a whole slot vs. being in the header) (do-layout-bitmap (i taggedp layout len) (if taggedp (%instance-set res i (%instance-ref structure i)) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 50025f2cad..3f5b5f1815 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2038,6 +2038,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "DIVISION-BY-ZERO-ERROR" "DO-REST-ARG" "DO-INSTANCE-TAGGED-SLOT" + "DO-LAYOUT-BITMAP" "DOUBLE-FLOAT-EXPONENT" "DOUBLE-FLOAT-BITS" "DOUBLE-FLOAT-HIGH-BITS" "DOUBLE-FLOAT-INT-EXPONENT" diff --git a/tests/defstruct.impure.lisp b/tests/defstruct.impure.lisp index 63f9126351..a247046374 100644 --- a/tests/defstruct.impure.lisp +++ b/tests/defstruct.impure.lisp @@ -11,54 +11,6 @@ (load "compiler-test-util.lisp") -;;;; Better ensure nothing in messed up in the ID space -;;;; or else everything is suspect. -(defun layout-id-vector-sap (layout) - (sb-sys:sap+ (sb-sys:int-sap (sb-kernel:get-lisp-obj-address layout)) - (- (ash (+ sb-vm:instance-slots-offset - (sb-kernel:get-dsd-index sb-vm:layout sb-kernel::id-word0)) - sb-vm:word-shift) - sb-vm:instance-pointer-lowtag))) - -(let ((hash (make-hash-table))) - ;; assert that all layout IDs are unique - (let ((all-wrappers - (delete-if - ;; temporary layouts (created for parsing DEFSTRUCT) - ;; must be be culled out. - (lambda (x) - (and (typep (sb-kernel:wrapper-classoid x) - 'sb-kernel:structure-classoid) - (eq (sb-kernel:wrapper-equalp-impl x) - #'sb-kernel::equalp-err))) - (sb-vm::list-allocated-objects :all - :type sb-vm:instance-widetag - :test #'sb-kernel::wrapper-p)))) - (dolist (wrapper all-wrappers) - (let ((id (sb-kernel:layout-id wrapper))) - (sb-int:awhen (gethash id hash) - (error "ID ~D is ~A and ~A" id sb-int:it wrapper)) - (setf (gethash id hash) wrapper))) - ;; assert that all inherited ID vectors match the layout-inherits vector - (let ((structure-object - (sb-kernel:find-layout 'structure-object))) - (dolist (wrapper all-wrappers) - (when (find structure-object (sb-kernel:wrapper-inherits wrapper)) - (let* ((layout (sb-kernel:wrapper-friend wrapper)) - (ids - (sb-sys:with-pinned-objects (layout) - (let ((sap (layout-id-vector-sap layout))) - (loop for depthoid from 2 to (sb-kernel:wrapper-depthoid wrapper) - collect (sb-sys:signed-sap-ref-32 sap (ash (- depthoid 2) 2)))))) - (expected - (map 'list 'sb-kernel:layout-id (sb-kernel:wrapper-inherits wrapper)))) - (unless (equal (list* (sb-kernel:layout-id (sb-kernel:find-layout 't)) - (sb-kernel:layout-id (sb-kernel:find-layout 'structure-object)) - ids) - (append expected (list (sb-kernel:layout-id wrapper)))) - (error "Wrong IDs for ~A: expect ~D actual ~D~%" - wrapper expected ids)))))))) - ;;;; examples from, or close to, the Common Lisp DEFSTRUCT spec ;;; Type mismatch of slot default init value isn't an error until the @@ -575,6 +527,15 @@ (sb-kernel:dd-slots (sb-kernel:find-defstruct-description 'hugest-manyraw)))))) +(with-test (:name :dd-bitmap-vs-layout-bitmap) + (dolist (typename '(huge-manyraw hugest-manyraw)) + (let* ((layout (sb-kernel:find-layout typename)) + (info (sb-kernel:wrapper-dd layout)) + (bitmap (sb-kernel::dd-bitmap info))) + (assert (typep bitmap 'bignum)) + (assert (= (sb-bignum:%bignum-length bitmap) + (sb-kernel:bitmap-nwords layout)))))) + (defun check-huge-manyraw (s) (assert (and (eql (huge-manyraw-df s) 8.207880688335944d-304) (eql (huge-manyraw-aaa s) 'aaa) diff --git a/tests/layouts.pure.lisp b/tests/layouts.pure.lisp index 9bc11a4c5d..dfd3800a80 100644 --- a/tests/layouts.pure.lisp +++ b/tests/layouts.pure.lisp @@ -25,3 +25,181 @@ (let ((layout (sb-kernel:find-layout name))) (assert (logtest (sb-kernel:wrapper-flags layout) sb-kernel:+strictly-boxed-flag+))))) + +;;; Test some aspects of bitmaps, and the iterator. + +;;; A layout-bitmap has the same representation as a BIGNUM- +;;; least-significant word first, native endian within the word. +;;; Like a bignum, all but the last word are unsigned, and the last is signed. +;;; This representation allows trailing slots to be either all tagged +;;; or all untagged. + +(defun ld (x) (sb-kernel:layout-depthoid (truly-the sb-vm::layout x))) +(compile 'ld) + +(defstruct d2) +(defstruct (d3 (:include d2))) +(defstruct (d4 (:include d3))) +(defstruct (d5 (:include d4))) +(defstruct (d6 (:include d5))) +(defstruct (d7 (:include d6))) +(defstruct (d8 (:include d7))) +(defstruct (d9 (:include d8))) +(defstruct (d10 (:include d9))) +(defstruct (d11 (:include d10))) +(defstruct (d12 (:include d11))) +(defstruct (d13 (:include d12))) +(defstruct (d14 (:include d13))) +(defstruct (d15 (:include d14))) + +(defparameter *test-layouts* + (coerce (list* (sb-kernel:find-layout 't) + (sb-kernel:find-layout 'structure-object) + (loop for i from 2 to 15 + collect (sb-kernel:find-layout (intern (format nil "D~D" i))))) + 'vector)) + +;;; Assert that BITMAP-NWORDS is insensitive to depthoid +(with-test (:name :bitmap-nwords-1) + (loop for depthoid from 3 to 16 + do + (let ((layout (sb-kernel:make-layout + 1 ; random hash + (sb-kernel:make-undefined-classoid 'blah) + :depthoid depthoid + :bitmap #+64-bit #x6fffffffeeeeff02 ; 1-word bignum + #-64-bit #x70ffe123 + :inherits (subseq *test-layouts* 0 depthoid) + :flags sb-kernel:+structure-layout-flag+))) + (assert (= (sb-kernel:bitmap-nwords layout) 1))))) +(with-test (:name :bitmap-nwords-2) + (loop for depthoid from 3 to 16 + do + (let ((layout (sb-kernel:make-layout + 1 ; random hash + (sb-kernel:make-undefined-classoid 'blah) + :depthoid depthoid + :bitmap #+64-bit #xffffffffeeeeff02 ; 2-word bignum + #-64-bit #x80ffe123 + :inherits (subseq *test-layouts* 0 depthoid) + :flags sb-kernel:+structure-layout-flag+))) + (assert (= (sb-kernel:bitmap-nwords layout) 2))))) + +(defun layout-id-vector-sap (layout) + (sb-sys:sap+ (sb-sys:int-sap (sb-kernel:get-lisp-obj-address layout)) + (- (ash (+ sb-vm:instance-slots-offset + (sb-kernel:get-dsd-index sb-vm:layout sb-kernel::id-word0)) + sb-vm:word-shift) + sb-vm:instance-pointer-lowtag))) + +;;;; Ensure ID uniqueness and that layout ID words match the ID's in the INHERITS vector. +(defparameter *all-wrappers* + (delete-if + ;; temporary layouts (created for parsing DEFSTRUCT) + ;; must be be culled out. + (lambda (x) + (and (typep (sb-kernel:wrapper-classoid x) + 'sb-kernel:structure-classoid) + (eq (sb-kernel:wrapper-equalp-impl x) + #'sb-kernel::equalp-err))) + (sb-vm::list-allocated-objects :all + :type sb-vm:instance-widetag + :test #'sb-kernel::wrapper-p))) + +;;; Assert no overlaps on ID +(with-test (:name :id-uniqueness) + (let ((hash (make-hash-table))) + (dolist (wrapper *all-wrappers*) + (let ((id (sb-kernel:layout-id wrapper))) + (sb-int:awhen (gethash id hash) + (error "ID ~D is ~A and ~A" id sb-int:it wrapper)) + (setf (gethash id hash) wrapper))))) + +;;; Assert that IDs are right +(with-test (:name :id-versus-inherits) + (let ((structure-object (sb-kernel:find-layout 'structure-object))) + (dolist (wrapper *all-wrappers*) + (when (find structure-object (sb-kernel:wrapper-inherits wrapper)) + (let* ((layout (sb-kernel:wrapper-friend wrapper)) + (ids + (sb-sys:with-pinned-objects (layout) + (let ((sap (layout-id-vector-sap layout))) + (loop for depthoid from 2 to (sb-kernel:wrapper-depthoid wrapper) + collect (sb-sys:signed-sap-ref-32 sap (ash (- depthoid 2) 2)))))) + (expected + (map 'list 'sb-kernel:layout-id (sb-kernel:wrapper-inherits wrapper)))) + (unless (equal (list* (sb-kernel:layout-id (sb-kernel:find-layout 't)) + (sb-kernel:layout-id (sb-kernel:find-layout 'structure-object)) + ids) + (append expected (list (sb-kernel:layout-id wrapper)))) + (error "Wrong IDs for ~A: expect ~D actual ~D~%" + wrapper expected ids))))))) + +(makunbound '*all-wrappers*) + +(defun random-bitmap (nwords random-state sign-bit) + (let ((integer 0) + (position 0)) + ;; Deposit N-WORD-BITS bits into INTEGER NWORDS times, + ;; then make sure the sign bit is as requested. + (dotimes (i nwords) + (setf (ldb (byte sb-vm:n-word-bits position) integer) + ;; If the PRNG generates a 0 word, change it to 1. + (max 1 (random (ash 1 sb-vm:n-word-bits) random-state))) + (incf position sb-vm:n-word-bits)) + ;; If INSTANCE-DATA-START is 1, then the 0th bitmap bit must be 0 + ;; because we don't want LAYOUT to be lumped in with tagged slots + ;; (even though it's of course tagged) + (when (and (= sb-vm:instance-data-start 1) (oddp integer)) + (setq integer (logxor integer 1))) + (ecase sign-bit + (:positive + (ldb (byte (1- (* nwords sb-vm:n-word-bits)) 0) integer)) + (:negative + (dpb integer (byte (1- (* nwords sb-vm:n-word-bits)) 0) -1))))) +(compile'random-bitmap) + +;;; Check the random bitmap generator a little. +(with-test (:name :check-random-bitmaps) + (loop for nwords from 2 to 8 + do (dolist (sign '(:positive :negative)) + (dotimes (i 100) + (let ((b (random-bitmap nwords *random-state* sign))) + (assert (= (sb-bignum:%bignum-length b) nwords))))))) + +(defun make-layout-for-test (depthoid bitmap) + (sb-kernel:make-layout 1 ; random hash + (sb-kernel:make-undefined-classoid 'blah) + :depthoid depthoid + :bitmap bitmap + :inherits (subseq *test-layouts* 0 depthoid) + :flags sb-kernel:+structure-layout-flag+)) +(compile 'make-layout-for-test) + +(defun test-bitmap-iterator (layout instance-length reference-bitmap) + (let ((count 0)) + (declare (fixnum count)) + (sb-kernel:do-layout-bitmap (slot-index taggedp layout instance-length) + (incf count) + (sb-int:aver (eq (logbitp slot-index reference-bitmap) taggedp))) + (sb-int:aver (= count (- instance-length sb-vm:instance-data-start))))) +(compile 'test-bitmap-iterator) + +;;; Now randomly test bitmaps of varying length in words +;;; and for both values of the sign bit in the last word. +;;; Test with instances that are longer than the bitmap's significant bit count +;;; so that we can verify infinite sign-extension. +;;; And test with shorter to make sure the loop is properly bounded +;;; by the instance length. +(with-test (:name :random-bitmaps) + (let ((rs (make-random-state t))) + ;; Modulate the depthoid so that BITMAP-START is at different indices. + (loop for depthoid from 6 to 10 + do (loop for n-bitmap-words from 1 to 6 + do + (dolist (sign '(:positive :negative)) + (let* ((bitmap (random-bitmap n-bitmap-words rs sign)) + (layout (make-layout-for-test depthoid bitmap))) + (loop for instance-length from 5 to (* (+ n-bitmap-words 2) + sb-vm:n-word-bits) + do (test-bitmap-iterator layout instance-length bitmap)))))))) From 5445814c95212cba648202e2cad6309d6e161ff9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 25 Apr 2022 12:18:50 -0400 Subject: [PATCH 3191/4023] Add a stub --- src/code/stubs.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/stubs.lisp b/src/code/stubs.lisp index fb72cfea04..e6eb749115 100644 --- a/src/code/stubs.lisp +++ b/src/code/stubs.lisp @@ -112,6 +112,7 @@ (def %caller-pc ()) (def sb-vm::%code-fixups) #+x86-64 (def pointerp) + (def sb-bignum:%bignum-length) ;; instances (def %make-instance) ; Allocate a new instance with X data slots. From 28f8c2085efb8147b5eb03c884b6e48c8b7d3a9e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 26 Apr 2022 03:42:22 +0300 Subject: [PATCH 3192/4023] Assign a block number in split-ir2-block. Some random unused number for find-dominators to work later. It happens late enough for the number to not matter. --- src/compiler/ir2tran.lisp | 3 ++- src/compiler/node.lisp | 3 +-- src/compiler/represent.lisp | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index df2898700f..a18cede47b 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -2273,7 +2273,8 @@ not stack-allocated LVAR ~S." source-lvar))))) (policy first-node (/= insert-safepoints 0))) (vop sb-vm::insert-safepoint first-node 2block)))) (ir2-convert-block block) - (incf num)))))) + (incf num)))) + (setf (component-max-block-number component) num))) (values)) ;;; If necessary, emit a terminal unconditional branch to go to the diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index a1626462f5..5346aa2fa0 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -636,8 +636,7 @@ (dx-lvars nil :type list) ;; The default LOOP in the component. (outer-loop (missing-arg) :type cloop) - ;; The current sset index - (sset-number 0 :type fixnum) + (max-block-number 0 :type fixnum) (dominators-computed nil)) (defprinter (component :identity t) diff --git a/src/compiler/represent.lisp b/src/compiler/represent.lisp index 27f50fca58..c8e2066f94 100644 --- a/src/compiler/represent.lisp +++ b/src/compiler/represent.lisp @@ -641,6 +641,8 @@ (no-op-node (make-exit)) (new-2block (make-ir2-block block)) (vop-next (vop-next vop))) + (setf (block-number block) + (incf (component-max-block-number (block-component block)))) (link-node-to-previous-ctran no-op-node start) (setf (block-info block) new-2block) (add-to-emit-order new-2block (ir2-block-prev 2block)) From e02e6bfa97304146f05b416a568e11e2a2afa60a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 26 Apr 2022 00:59:41 -0400 Subject: [PATCH 3193/4023] Mitigate code bloat from PCL accessors on defstructs This essentially restores the state of things prior to rev d2ca90b6 but with the advantage of ahead-of-time compiling the anonymous (and oxymoronic) writer functions for readonly slots. --- src/code/defstruct.lisp | 41 +++++++++++++++++------------ src/pcl/braid.lisp | 7 ++--- tests/error-source-path.impure.lisp | 6 ++--- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 3860ad7feb..82c7bd8480 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -273,24 +273,31 @@ (dolist (dsd (dd-slots dd) (result)) (binding* ((key (cons dd dsd)) (name (string (dsd-name dsd))) ; anonymize by stringification - ((reader writer) (dsd-reader dsd (neq (dd-type dd) 'structure)))) + ;; reader and writer are the primitive operations + ((reader writer) (dsd-reader dsd (neq (dd-type dd) 'structure))) + ;; accessor is the global defun + (accessor (dsd-accessor-name dsd))) (declare (dynamic-extent key)) - (result `(named-lambda (setf ,name) (#1=#:v #2=#:x) - ,@(if (eql (dsd-type dsd) 't) - ;; no typecheck - `((,writer (truly-the ,(dd-name dd) #2#) ,(dsd-index dsd) #1#) #1#) - `(,(slot-access-transform :setf `(#1# (truly-the ,(dd-name dd) #2#)) - key :function)))) - `(named-lambda ,name (#2#) - ,(if (and (dsd-always-boundp dsd) (dsd-safe-p dsd)) - ;; Most slots are always-boundp (don't have a BOA constructor - ;; that omits slots) and safe-p (type-safe for reading), - ;; so we can be concise rather than use SLOT-ACCESS-TRANSFORM - ;; plus a rebinding of X with TRULY-THE. - `(,reader (truly-the ,(dd-name dd) #2#) ,(dsd-index dsd)) - ;; Don't check X, but do check the the fetched value. - (slot-access-transform :read `((truly-the ,(dd-name dd) #2#)) - key))))))))) + (result (if (dsd-read-only dsd) + `(named-lambda (setf ,name) (#1=#:v #2=#:x) + ,@(if (eql (dsd-type dsd) 't) + ;; no typecheck + `((,writer (truly-the ,(dd-name dd) #2#) ,(dsd-index dsd) #1#) #1#) + `(,(slot-access-transform :setf `(#1# (truly-the ,(dd-name dd) #2#)) + key :function)))) + `'(setf ,accessor)) + (if nil ; TODO: policy-based selection perhaps? + `(named-lambda ,name (#2#) + ,(if (and (dsd-always-boundp dsd) (dsd-safe-p dsd)) + ;; Most slots are always-boundp (don't have a BOA constructor + ;; that omits slots) and safe-p (type-safe for reading), + ;; so we can be concise rather than use SLOT-ACCESS-TRANSFORM + ;; plus a rebinding of X with TRULY-THE. + `(,reader (truly-the ,(dd-name dd) #2#) ,(dsd-index dsd)) + ;; Don't check X, but do check the the fetched value. + (slot-access-transform :read `((truly-the ,(dd-name dd) #2#)) + key))) + `',accessor))))))) ;;; shared logic for host macroexpansion for SB-XC:DEFSTRUCT and ;;; cross-compiler macroexpansion for CL:DEFSTRUCT diff --git a/src/pcl/braid.lisp b/src/pcl/braid.lisp index fb1d14ab2d..739600bc7d 100644 --- a/src/pcl/braid.lisp +++ b/src/pcl/braid.lisp @@ -132,15 +132,16 @@ :direct-superclasses supers :direct-slots slots))) (slot-initargs-from-structure-slotd (slotd writer-fn reader-fn) + (flet ((name->fun (f) (if (functionp f) f (fdefinition f)))) `(:name ,(dsd-name slotd) :defstruct-accessor-symbol ,(dsd-accessor-name slotd) - :internal-reader-function ,reader-fn - :internal-writer-function ,writer-fn + :internal-reader-function ,(name->fun reader-fn) + :internal-writer-function ,(name->fun writer-fn) :type ,(dsd-type slotd) :initform ,(dsd-default slotd) ;; This is nuts! any DEFAULT might need its lexical environment, ;; yet we EVAL in the null environment. - :initfunction ,(eval-form (dsd-default slotd)))) + :initfunction ,(eval-form (dsd-default slotd))))) (accessor-closures (dsd) (multiple-value-bind (reader-fn writer-fn) (sb-kernel::dsd-reader dsd nil) ;; This is for a structure class that exists only in its compile-time representation. diff --git a/tests/error-source-path.impure.lisp b/tests/error-source-path.impure.lisp index 8b862fcfd2..f79d6eb597 100644 --- a/tests/error-source-path.impure.lisp +++ b/tests/error-source-path.impure.lisp @@ -137,17 +137,17 @@ (locally (declare (optimize (safety 0))) (defstruct f (x (print t) :type fixnum))) - (1 2 2) (2)) + (1 2 2)) (assert-condition-source-paths (locally (declare (optimize (safety 0))) (defstruct f (x 33 :type cons))) - (2 2) (2)) + (2 2)) (assert-condition-source-paths (locally (declare (optimize (safety 0))) (defstruct f (x mm))) - (2) (2 2))) + (2 2))) (with-test (:name (:source-path defgeneric :lambda-list)) (assert-condition-source-paths From 356a849abd56686f6a1d92167404337d92c1028e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 26 Apr 2022 01:28:36 -0400 Subject: [PATCH 3194/4023] Fix editcore's handling of raw slots --- tools-for-build/editcore.lisp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index 0b7cf8716c..f9a8b0ad5a 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1539,8 +1539,9 @@ (case widetag (#.instance-widetag (let ((type (translate (%instance-layout obj) spaces))) - (do-instance-tagged-slot (i obj t type) - (scanptr vaddr obj (1+ i)))) + (do-layout-bitmap (i taggedp type (%instance-length obj)) + (when taggedp + (scanptr vaddr obj (1+ i))))) (return-from scan-obj)) (#.simple-vector-widetag (let ((len (length (the simple-vector obj)))) From 2d4c389bc93d896d9d4f4e8cf54f25490adfc943 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 26 Apr 2022 11:02:24 -0400 Subject: [PATCH 3195/4023] Deal with C warnings for sparc-linux The usual never-ending battle to figure out how to receive the fewest warnings on the most machines. So today on the machine that I tried, os_context_register_t has to be unsigned int, not unsigned long, which is just as likely wrong for some other libc release. --- src/runtime/sparc-arch.c | 2 +- src/runtime/sparc-linux-os.c | 7 ++++--- src/runtime/sparc-linux-os.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/runtime/sparc-arch.c b/src/runtime/sparc-arch.c index ff08a13802..d77066ae24 100644 --- a/src/runtime/sparc-arch.c +++ b/src/runtime/sparc-arch.c @@ -162,7 +162,7 @@ void arch_handle_after_breakpoint(os_context_t *context) { *skipped_break_addr = trap_Breakpoint; - os_flush_icache(skipped_break_addr, sizeof(unsigned int)); + os_flush_icache((os_vm_address_t)skipped_break_addr, sizeof(unsigned int)); skipped_break_addr = NULL; *(unsigned long *)OS_CONTEXT_PC(context) = displaced_after_inst; /* context->sigmask = orig_sigmask; */ diff --git a/src/runtime/sparc-linux-os.c b/src/runtime/sparc-linux-os.c index 3d1302fb99..069fecbd4e 100644 --- a/src/runtime/sparc-linux-os.c +++ b/src/runtime/sparc-linux-os.c @@ -51,11 +51,11 @@ os_context_register_addr(os_context_t *context, int offset) if (offset == 0) { static int zero; zero = 0; - return &zero; + return (os_context_register_t*)&zero; } else if (offset < 16) { return &context->si_regs.u_regs[offset]; } else if (offset < 32) { - int *sp = (int*) context->si_regs.u_regs[14]; /* Stack Pointer */ + unsigned int *sp = (unsigned int*) context->si_regs.u_regs[14]; /* Stack Pointer */ return &(sp[offset-16]); } else return 0; @@ -70,7 +70,7 @@ os_context_npc_addr(os_context_t *context) sigset_t * os_context_sigmask_addr(os_context_t *context) { - return &(context->si_mask); + return (sigset_t*)&(context->si_mask); } void @@ -91,5 +91,6 @@ void os_flush_icache(os_vm_address_t address, os_vm_size_t length) { /* This is the same for linux and solaris, so see sparc-assem.S */ + extern void sparc_flush_icache(os_vm_address_t,os_vm_size_t); sparc_flush_icache(address,length); } diff --git a/src/runtime/sparc-linux-os.h b/src/runtime/sparc-linux-os.h index e3202fa7f0..f544569df7 100644 --- a/src/runtime/sparc-linux-os.h +++ b/src/runtime/sparc-linux-os.h @@ -2,7 +2,7 @@ #define _SPARC_LINUX_OS_H typedef struct sigcontext os_context_t; -typedef unsigned long os_context_register_t; +typedef unsigned int os_context_register_t; static inline os_context_t *arch_os_get_context(void **void_context) { From 813250e7d7661bf5884493fe7c6a62f52ccc67ed Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 26 Apr 2022 11:07:20 -0400 Subject: [PATCH 3196/4023] Remove obsolete selections from make-config * Sparc allows only gencgc, not cheneygc * PPC/Darwin was removed --- crossbuild-runner/backends/sparc/features | 1 + make-config.sh | 14 ++------------ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/crossbuild-runner/backends/sparc/features b/crossbuild-runner/backends/sparc/features index e69de29bb2..0e82d75421 100644 --- a/crossbuild-runner/backends/sparc/features +++ b/crossbuild-runner/backends/sparc/features @@ -0,0 +1 @@ +:gencgc diff --git a/make-config.sh b/make-config.sh index a08ea44e9a..6053658c23 100755 --- a/make-config.sh +++ b/make-config.sh @@ -652,15 +652,8 @@ case "$sbcl_arch" in $GNUMAKE -C tools-for-build where-is-mcontext -I ../src/runtime tools-for-build/where-is-mcontext > src/runtime/ppc-linux-mcontext.h || (echo "error running where-is-mcontext"; exit 1) elif [ "$sbcl_os" = "darwin" ]; then - # We provide a dlopen shim, so a little lie won't hurt - printf ' :os-provides-dlopen' >> $ltf - # The default stack ulimit under darwin is too small to run PURIFY. - # Best we can do is complain and exit at this stage - if [ "`ulimit -s`" = "512" ]; then - echo "Your stack size limit is too small to build SBCL." - echo "See the limit(1) or ulimit(1) commands and the README file." - exit 1 - fi + echo "Unsupported configuration" + exit 1 fi ;; ppc64) @@ -679,9 +672,6 @@ case "$sbcl_arch" in exit 1 fi ;; - sparc) - printf ' :gencgc' >> $ltf - ;; esac # Use a little C program to try to guess the endianness. Ware From 6db04b68c1df38697938930e7dac8efea9042fb7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 28 Apr 2022 21:12:08 -0400 Subject: [PATCH 3197/4023] Correct a test --- tests/fin-threadsafety.pure.lisp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/fin-threadsafety.pure.lisp b/tests/fin-threadsafety.pure.lisp index bd3752a22e..52ce11e4d6 100644 --- a/tests/fin-threadsafety.pure.lisp +++ b/tests/fin-threadsafety.pure.lisp @@ -37,12 +37,18 @@ (let ((fun (sb-kernel:%make-funcallable-instance 0)) (stop nil) (condition nil)) - ;; It doesn't matter what this layout is, but it has to be something. - ;; GC checks for a layout before fixing up any other slots. That's required - ;; because immobile funcallable-instances contain raw bytes comprising the - ;; self-contained trampoline. For some reason FUNCALLABLE-INSTANCE claims - ;; to have a 0 bitmap which implies 0 tagged slots. I don't like that. - (sb-kernel:%set-fun-layout fun (sb-kernel:find-layout 'function)) + ;; If the %FUN-LLAYOUT were unset or its bitmap were 0, then the + ;; %FUNCALLABLE-INSTANCE-FUN slot would not be visited in GC because + ;; it assumes the instance is wholly empty in that case. + ;; It doesn't matter too much what the layout is, but it has to be something + ;; whose bitmap satisfies the assertion in "verify_headered_object()" + ;; concerning the potentially valid bitmaps for a funcallable instance. + ;; FUNCALLABLE-INSTANCE itself has a 0 bitmap which implies 0 tagged slots + ;; (which seems dubious to be sure), and FUNCTION has a bitmap indicating + ;; 1 raw slot and all the rest tagged. Neither of those is right. + ;; GENERIC-FUNCTION is ok even though this is not an instance of it. + ;; I _think_ this makes the test reliable with pre_verify_gen_0 enabled. + (sb-kernel:%set-fun-layout fun (sb-kernel:find-layout 'generic-function)) (setf (sb-kernel:%funcallable-instance-fun fun) #'closure-one) (flet ((changer () (loop (sb-thread:barrier (:read)) From b0f6cecc4e7e9fb8b4a2ff3af35a1000df646b10 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 29 Apr 2022 17:16:59 +0100 Subject: [PATCH 3198/4023] 2.2.4: will be tagged as "sbcl-2.2.4" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index e73e465a55..d8d6db966e 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.2.3: +changes in sbcl-2.2.4 relative to sbcl-2.2.3: * enhancement: better constraint propagation in the compiler. Specifically, the compiler can now derive the type of X in control flow join situations such as From fae7b6cbd736e49f8120124e93546ebdeb293394 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 27 Apr 2022 19:51:04 +0300 Subject: [PATCH 3199/4023] x86-64: add unsigned-signed comparison VOPs. --- src/compiler/x86-64/arith.lisp | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/compiler/x86-64/arith.lisp b/src/compiler/x86-64/arith.lisp index 5996f48048..49d606eaf9 100644 --- a/src/compiler/x86-64/arith.lisp +++ b/src/compiler/x86-64/arith.lisp @@ -1961,6 +1961,74 @@ (define-conditional-vop < :l :b :ge :ae) (define-conditional-vop > :g :a :le :be)) +(define-vop (<-unsigned-signed) + (:translate <) + (:args (unsigned :scs (unsigned-reg)) + (signed :scs (signed-reg))) + (:arg-types unsigned-num signed-num) + (:temporary (:sc signed-reg) temp) + (:conditional :b) + (:policy :fast-safe) + (:generator 7 + (zeroize temp) + (inst test signed signed) + (inst cmov :ge temp signed) + (inst cmp unsigned temp))) + +(define-vop (>-unsigned-signed) + (:translate >) + (:args (unsigned :scs (unsigned-reg)) + (signed :scs (signed-reg))) + (:arg-types unsigned-num signed-num) + (:policy :fast-safe) + (:conditional :a) + (:generator 7 + (inst test signed signed) + (inst jmp :l done) + (inst cmp unsigned signed) + done)) + +(define-vop (<-signed-unsigned) + (:translate <) + (:args (signed :scs (signed-reg)) + (unsigned :scs (unsigned-reg))) + (:arg-types signed-num unsigned-num) + (:conditional :a) + (:policy :fast-safe) + (:generator 7 + (inst test signed signed) + (inst jmp :l done) + (inst cmp unsigned signed) + done)) + +(define-vop (>-signed-unsigned <-signed-unsigned) + (:translate >) + (:temporary (:sc signed-reg) temp) + (:conditional :a) + (:generator 7 + (zeroize temp) + (inst test signed signed) + (inst cmov :ge temp signed) + (inst cmp temp unsigned))) + +(define-vop (eql-unsigned-signed) + (:translate eql %eql/integer) + (:args (unsigned :scs (unsigned-reg)) + (signed :scs (signed-reg))) + (:arg-types unsigned-num signed-num) + (:conditional :eq) + (:policy :fast-safe) + (:generator 7 + (inst test signed signed) + (inst jmp :l done) + (inst cmp unsigned signed) + done)) + +(define-vop (eql-signed-unsigned eql-unsigned-signed) + (:args (signed :scs (signed-reg)) + (unsigned :scs (unsigned-reg))) + (:arg-types signed-num unsigned-num)) + (define-vop (fast-if-eql/signed fast-conditional/signed) (:translate eql %eql/integer) (:generator 6 (emit-optimized-cmp x y temp))) From ecb651897986d0f34ed20c75d6b24cae7e55e6b8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 28 Apr 2022 06:00:09 +0300 Subject: [PATCH 3200/4023] x86-64: add a vop for (signed-byte-64-p unsigned) --- src/compiler/x86-64/type-vops.lisp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 1ee3b6f2b9..d76846a2d7 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -304,6 +304,15 @@ (inst cmp :qword ea (bignum-header-for-length 1))) OUT)) +(define-vop (signed-byte-64-p/unsigned) + (:args (value :scs (unsigned-reg))) + (:arg-types unsigned-num) + (:conditional :ns) + (:policy :fast-safe) + (:translate signed-byte-64-p) + (:generator 5 + (inst test value value))) + ;;; Sign bit and fixnum tag bit. (defconstant non-negative-fixnum-mask-constant #x8000000000000001) From 1e7d2505dbdeb106ebaa217e60e91703260801be Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 29 Apr 2022 19:10:45 +0300 Subject: [PATCH 3201/4023] Highlight the slot clause for bad initforms in defclass. --- src/pcl/defclass.lisp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/pcl/defclass.lisp b/src/pcl/defclass.lisp index 91eb3bfe15..433ab4da34 100644 --- a/src/pcl/defclass.lisp +++ b/src/pcl/defclass.lisp @@ -345,23 +345,22 @@ (eq type t)) '(function constantly-0)) (t - (let* ((initform (if (eq type t) - initform - `(sb-c::with-source-form ,source-form - (the* (,type :source-form ,initform - ;; Don't want to insert a cast, - ;; as a subclass may change the type, - ;; just report this at compile-time. - :use-annotations t) - ,initform)))) + (let* ((initform `(sb-c::with-source-form ,source-form + (the* (,type :source-form ,initform + ;; Don't want to insert a cast, + ;; as a subclass may change the type, + ;; just report this at compile-time. + :use-annotations t) + ,initform))) (entry (assoc initform *initfunctions-for-this-defclass* :test #'equal))) (unless entry (setq entry (list initform (gensym) - `(function (lambda () - (declare (optimize - (sb-c:store-coverage-data 0))) + `(function + (lambda () + (declare (optimize (sb-c:store-coverage-data 0) + (sb-c:verify-arg-count 0))) ,initform)))) (push entry *initfunctions-for-this-defclass*)) (cadr entry))))) From fc8e4f95c1fbd8a5d1ea6aa57316147feb64224f Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sat, 23 Apr 2022 11:15:18 -0700 Subject: [PATCH 3202/4023] Turn off *check-consistency* for a test. Check consistency doesn't work here on high debug. In addition, the original test case didn't call for it anyway. The reason it doesn't work is that signalling a compiler error while compiling breaks the consistency of the IR. That's just how it is. --- tests/compiler.impure.lisp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index 3857c1dbe7..e4a7774b60 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -2490,13 +2490,12 @@ (test-util:with-test (:name :bug-308941) (multiple-value-bind (warn fail) - (let ((*check-consistency* t)) - (ctu:file-compile - "(eval-when (:compile-toplevel :load-toplevel :execute) + (ctu:file-compile + "(eval-when (:compile-toplevel :load-toplevel :execute) (defstruct foo3)) (defstruct bar (foo #.(make-foo3)))" - :load nil)) + :load nil) ;; ...but the compiler should not break. (assert (and warn fail)))) From 4f4453ee5be5eddb39694e8a8e9da1b596db5baf Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sat, 23 Apr 2022 16:36:09 -0700 Subject: [PATCH 3203/4023] Treat deferred packages with respect to recursive loads right. This subtle situation was encountered when trying to bootstrap asdf. --- src/code/load.lisp | 8 ++------ src/code/target-package.lisp | 29 +++++++++++++++++------------ src/cold/exports.lisp | 2 +- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 2aa5e6f15b..702fe27c03 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -904,12 +904,8 @@ (define-fop 83 :not-host (fop-named-package-save ((:operands length)) nil) (let ((package-name (make-string length))) (read-char-string-as-varints (fasl-input-stream) package-name) - (push-fop-table - (handler-case (find-undeleted-package-or-lose package-name) - (simple-package-error (condition) - (declare (ignore condition)) - (make-deferred-package package-name))) - (fasl-input)))) + (push-fop-table (find-or-maybe-make-deferred-package package-name) + (fasl-input)))) ;;;; fops for loading numbers diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 223122e31a..4003f23502 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -2130,16 +2130,19 @@ PACKAGE." ;;; the package is actually created, we preserve package environment ;;; semantics at runtime, and give a reasonable error if the package ;;; has not been created by the end of the load. -(defun make-deferred-package (name) - (let ((package (%make-package (make-package-hashtable 0) - (make-package-hashtable 0)))) - (unless *deferred-package-names* ; bind on demand - (setq *deferred-package-names* - (make-info-hashtable :comparator #'pkg-name= - :hash-function #'sxhash))) - (setf (info-gethash name *deferred-package-names*) package) - (setf (package-%name package) name) - package)) +(defun find-or-maybe-make-deferred-package (name) + (or (find-package name) + (progn + (unless *deferred-package-names* ; bind on demand + (setq *deferred-package-names* + (make-info-hashtable :comparator #'pkg-name= + :hash-function #'sxhash))) + (or (%get-package name *deferred-package-names*) + (let ((package (%make-package (make-package-hashtable 0) + (make-package-hashtable 0)))) + (%register-package *deferred-package-names* name package) + (setf (package-%name package) name) + package))))) ;;; Return the deferred package object for NAME if it exists, ;;; otherwise return NIL. @@ -2156,9 +2159,11 @@ PACKAGE." ;;; deferred package table still has any unresolved entries after ;;; FUNCTION is called. (defun call-with-deferred-package-names (function) - (let ((*deferred-package-names* nil)) ; bind on demand + (let* ((boundp (boundp '*deferred-package-names*)) + ;; bind on demand + (*deferred-package-names* (if boundp *deferred-package-names* nil))) (funcall function) - (when *deferred-package-names* + (when (and (not boundp) *deferred-package-names*) (info-maphash (lambda (name package) (unless (eq package :deleted) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 3f5b5f1815..90d299dcca 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1208,7 +1208,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") (:use "CL" "SB-ALIEN" "SB-ASSEM" "SB-BIGNUM" "SB-C" "SB-EXT" "SB-INT" "SB-KERNEL" "SB-SYS") (:import-from "SB-VM" "+FIXUP-KINDS+") - (:import-from "SB-IMPL" "MAKE-DEFERRED-PACKAGE" "WITH-DEFERRED-PACKAGE-NAMES") + (:import-from "SB-IMPL" "FIND-OR-MAYBE-MAKE-DEFERRED-PACKAGE" "WITH-DEFERRED-PACKAGE-NAMES") (:export "*ASSEMBLER-ROUTINES*" "GET-ASM-ROUTINE" "+BACKEND-FASL-FILE-IMPLEMENTATION+" From 922c25d6c9e51410f9fefadf34b6f5e9bb1b0d0f Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sat, 23 Apr 2022 18:37:33 -0700 Subject: [PATCH 3204/4023] Fix non-conforming tests. The order of evaluation for LOAD-TIME-VALUE with respect to other top-level forms in the same file is unspecified. --- tests/compiler.impure.lisp | 15 +++++++++------ tests/compiler.test.sh | 3 +-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index e4a7774b60..0178e1af95 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -1321,12 +1321,15 @@ (with-test (:name (load-time-value :errors)) (multiple-value-bind (warn fail) - (ctu:file-compile - `((defvar *load-time-value-error-value* 10) - (declaim (fixnum *load-time-value-error-value*)) - (defun load-time-value-error-test-1 () - (the list (load-time-value *load-time-value-error-value*)))) - :load t) + (progn + (ctu:file-compile + `((defvar *load-time-value-error-value* 10) + (declaim (fixnum *load-time-value-error-value*))) + :load t) + (ctu:file-compile + `((defun load-time-value-error-test-1 () + (the list (load-time-value *load-time-value-error-value*)))) + :load t)) (assert warn) (assert fail)) (handler-case (load-time-value-error-test-1) diff --git a/tests/compiler.test.sh b/tests/compiler.test.sh index cd6e424f8e..ac78ae1a84 100644 --- a/tests/compiler.test.sh +++ b/tests/compiler.test.sh @@ -593,8 +593,7 @@ EOF expect_warned_compile $tmpfilename cat > $tmpfilename <<EOF -(defun foo () 128) -(let ((a (load-time-value (foo)))) +(let ((a (load-time-value (funcall (lambda () 128))))) (declare (fixnum a)) (print a) (terpri)) From f6fd6d7bcbc0a0e9d2e241b6e969d6dac1a429bb Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sat, 23 Apr 2022 21:59:32 -0700 Subject: [PATCH 3205/4023] Let LOAD-LAYOUT incompatible redefinition errors be restartable. By reusing %REDEFINE-DEFSTRUCT. This makes loading incompatible defstructs less brittle when it comes to what order top-level forms in compiled files get run with respect to literal layout loads. --- src/code/class.lisp | 58 ++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/src/code/class.lisp b/src/code/class.lisp index cd7b48aa67..d115e1b42c 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -230,35 +230,43 @@ between the ~A definition and the ~A definition" name old-context context) t)))) +;;; Used by the loader to forward-reference layouts for classes whose +;;; definitions may not have been loaded yet. This allows type tests +;;; to be loaded when the type definition hasn't been loaded yet. +;;; +;;; If we can't find any existing layout, then we create a new one +;;; with the supplied information, storing it in +;;; *FORWARD-REFERENCED-LAYOUTS*. If we can find the layout, then +;;; return it, after checking for compatibility. If incompatible, we +;;; allow the layout to be replaced, altered or left alone. (defun load-layout (name depthoid inherits length bitmap flags) - (let* ((layout - (or (binding* ((classoid (find-classoid name nil) :exit-if-null)) - (classoid-wrapper classoid)) - (let ((table *forward-referenced-wrappers*)) - (with-world-lock () + (let* ((table *forward-referenced-wrappers*) + (classoid (find-classoid name nil)) ; thread safety + (new-layout (make-layout (hash-layout-name name) + (or classoid (make-undefined-classoid name)) + :depthoid depthoid :inherits inherits + :length length :bitmap bitmap :flags flags)) + (existing-layout + (or (and classoid (classoid-wrapper classoid)) + (with-world-lock () (let ((classoid (find-classoid name nil))) + (when classoid + (setf (wrapper-classoid new-layout) classoid)) (or (and classoid (classoid-wrapper classoid)) - (ensure-gethash - name table - (make-layout - (hash-layout-name name) - (or classoid (make-undefined-classoid name)) - :depthoid depthoid :inherits inherits - :length length :bitmap bitmap :flags flags)))))))) + (ensure-gethash name table new-layout)))))) (classoid - (or (find-classoid name nil) (wrapper-classoid layout)))) - (if (or (eq (wrapper-invalid layout) :uninitialized) - (not *type-system-initialized*)) - (setf (wrapper-classoid layout) classoid) - ;; There was an old layout already initialized with old - ;; information, and we'll now check that old information - ;; which was known with certainty is consistent with current - ;; information which is known with certainty. - (when (warn-if-altered-layout "current" layout "compile time" - length inherits depthoid bitmap) - (error "The loaded code expects an incompatible layout for class ~S." - (wrapper-proper-name layout)))) - layout)) + (or (find-classoid name nil) (wrapper-classoid existing-layout)))) + (cond ((or (eq (wrapper-invalid existing-layout) :uninitialized) + (not *type-system-initialized*)) + (setf (wrapper-classoid existing-layout) classoid)) + ;; There was an old layout already initialized with old + ;; information, and we'll now check that old information + ;; which was known with certainty is consistent with current + ;; information which is known with certainty. + ((warn-if-altered-layout "current" existing-layout "compile time" + length inherits depthoid bitmap) + (%redefine-defstruct classoid existing-layout new-layout))) + existing-layout)) (defun classoid-lock (classoid) #+sb-xc-host (declare (ignore classoid)) From 7eb3f2140f69c6b279d5d4c3c9fd7792fd203d78 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sun, 24 Apr 2022 00:12:31 -0700 Subject: [PATCH 3206/4023] Make deprecation behavior exactly the same between compile and load. We share the logic for deprecation warnings between compile file and fasload, so that the same exact conditions are signalled when fasloading as during compilation. This also significantly simplifies the loader, as well as making it less flaky with respect to trying to literally grovel the fop stack for a hardcoded pattern which doesn't manifest at all on higher debug or coverage instrumentation (specifically relying on fopcompilation to happen). --- src/code/load.lisp | 37 ++++++----------------------------- tests/deprecation.impure.lisp | 7 +++---- 2 files changed, 9 insertions(+), 35 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 702fe27c03..e79bd2f047 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -130,7 +130,6 @@ (stack (make-fop-vector 100) :type simple-vector) (name-buffer (vector (make-string 1 :element-type 'character) (make-string 31 :element-type 'base-char))) - (deprecated-stuff nil :type list) ;; Sometimes we want to skip over any FOPs with side-effects (like ;; function calls) while executing other FOPs. SKIP-UNTIL will ;; either contain the position where the skipping will stop, or @@ -713,33 +712,7 @@ byte n-operands arg1 arg2 arg3) (when (functionp function) - (format *trace-output* " ~35t~(~a~)" (%fun-name function)))) - (let ((stack (%fasl-input-stack fasl-input))) - (declare (ignorable stack)) ; not used in xc-host - (when (and (eq byte #.(get 'fop-funcall-for-effect 'opcode)) - (fop-stack-empty-p stack)) ; (presumed) end of TLF - (awhen (%fasl-input-deprecated-stuff fasl-input) - ;; Delaying this message rather than printing it - ;; in fop-fdefn makes it more informative (usually). - (setf (%fasl-input-deprecated-stuff fasl-input) nil) - (loader-deprecation-warn - it - (and (eq (svref stack 1) 'sb-impl::%defun) (svref stack 2))))))))))) - -;; This is the moral equivalent of a warning from /usr/bin/ld that -;; "gets() is dangerous." You're informed by both the compiler and linker. -(defun loader-deprecation-warn (stuff whence) - ;; Stuff is a list: ((<state> name . category) ...) - ;; For now we only deal with category = :FUNCTION so we ignore it. - (let ((warning-class - ;; We're only going to warn once (per toplevel form), - ;; so pick the most stern warning applicable. - (if (every (lambda (x) (eq (car x) :early)) stuff) - 'simple-style-warning 'simple-warning))) - (warn warning-class - :format-control "Reference to deprecated function~P ~S~@[ from ~S~]" - :format-arguments - (list (length stuff) (mapcar #'second stuff) whence)))) + (format *trace-output* " ~35t~(~a~)" (%fun-name function))))))))) (defun load-as-fasl (stream verbose print) (when (zerop (file-length stream)) @@ -1183,9 +1156,11 @@ ;; this gets you an #<fdefn> object, not the result of (FDEFINITION x) ;; cold-loader uses COLD-FDEFINITION-OBJECT instead. (define-fop 18 :not-host (fop-fdefn (name)) - (awhen (deprecated-thing-p 'function name) ; returns the stage of deprecation - (pushnew (list* it name :function) - (%fasl-input-deprecated-stuff (fasl-input)) :test 'equal)) + (when (deprecated-thing-p 'function name) + ;; This is the moral equivalent of a warning from /usr/bin/ld + ;; that "gets() is dangerous." You're informed by both the + ;; compiler and linker. + (check-deprecated-thing 'function name)) (find-or-create-fdefn name)) (define-fop 19 :not-host (fop-known-fun (name)) diff --git a/tests/deprecation.impure.lisp b/tests/deprecation.impure.lisp index a6747ce751..2604dab1dd 100644 --- a/tests/deprecation.impure.lisp +++ b/tests/deprecation.impure.lisp @@ -352,9 +352,8 @@ (write-string "(defun b () (please-dont-use-this 1) (really-dont-do-it 2))" f) (write-string "(defun c () (you-cant-use-this 3))" f)) ;; We expect four deprecation warnings from compiling the source - ;; (four uses of deprecated things) and three from loading it - ;; (loading three functions that contain uses of deprecated - ;; things). + ;; and four from loading it, as there are four uses of deprecated + ;; things) (unwind-protect (progn (setq fasl (assert-signal @@ -363,6 +362,6 @@ late-deprecation-warning final-deprecation-warning) 4)) - (assert-signal (load fasl) warning 3)) + (assert-signal (load fasl) warning 4)) (delete-file fasl) (delete-file source)))) From 076075ae36b65474270ac327894631a390569404 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sun, 24 Apr 2022 20:26:51 -0700 Subject: [PATCH 3207/4023] sb-fasteval: Define RETURN-CONSTANT later It is unportable/undefined behavior for LOAD-TIME-VALUE to reference stuff defined in the same file, and doesn't work with block compilation. --- src/interpreter/eval.lisp | 12 ++++++++++++ src/interpreter/sexpr.lisp | 12 +----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/interpreter/eval.lisp b/src/interpreter/eval.lisp index 5fd450f0b6..45927304a2 100644 --- a/src/interpreter/eval.lisp +++ b/src/interpreter/eval.lisp @@ -237,6 +237,18 @@ ;; affect the policy in an interpreter environment. (%eval form interpreter-env)))) +;;; Return a handler that returns a constant. +;;; The %SEXPR constructor elides a handler for constants, +;;; but there are cases where NIL sneaks through and demands a callable handler. +;;; We avoid generating N copies of such handler. Same goes for 0 and T. +;;; Moved here as LOAD-TIME-VALUE has to happen after the file +;;; containing %HANDLER has been loaded. +(defun return-constant (object) + (cond ((null object) (load-time-value (handler #'%const nil))) + ((eq object t) (load-time-value (handler #'%const t))) + ((eql object 0) (load-time-value (handler #'%const 0))) + (t (handler #'%const object)))) + (push (let ((this-pkg (find-package "SB-INTERPRETER"))) `("SB-INTERPRETER" diff --git a/src/interpreter/sexpr.lisp b/src/interpreter/sexpr.lisp index 1b74a4fd06..486a98115b 100644 --- a/src/interpreter/sexpr.lisp +++ b/src/interpreter/sexpr.lisp @@ -132,22 +132,12 @@ (declare (ignore env sexpr) #.+handler-optimize+) x) -;;; Return a handler that returns a constant. -;;; The %SEXPR constructor elides a handler for constants, -;;; but there are cases where NIL sneaks through and demands a callable handler. -;;; We avoid generating N copies of such handler. Same goes for 0 and T. -(defun return-constant (object) - (cond ((null object) (load-time-value (handler #'%const nil))) - ((eq object t) (load-time-value (handler #'%const t))) - ((eql object 0) (load-time-value (handler #'%const 0))) - (t (handler #'%const object)))) - (defun return-constant-values (values env sexpr) (declare (ignore env sexpr) #.+handler-optimize+) (values-list values)) ;; Forward defs -(declaim (ftype function digest-form %eval eval-setq)) +(declaim (ftype function digest-form %eval eval-setq reutrn-constant)) ;;; Return a SEXPR object that will, when dispatched, evaluate FORM. ;;; Unlike optimizations on SEXPRS whereby they install the most-specific From 3760d2bdc02afeea84cf265d4fc5be37697ec4fe Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sun, 24 Apr 2022 23:20:40 -0700 Subject: [PATCH 3208/4023] Record whether inheritance is allowed when saving symbols. When delaying toplevel form execution until after component loading in the loader, shadowing would not effect the package environment correctly during fasloading. Fix this by recording whether inheritance for the symbol is allowed at the point of dumping. We are allowed to do this because the specification says that in conforming code, the package environment during compilation should be congruent to the package environment during fasload. This is the most expedient fix, but this could probably be done better in a way that unifies the accessibility logic in cold load. --- src/code/load.lisp | 12 +++++++----- src/code/target-package.lisp | 6 +++--- src/compiler/dump.lisp | 5 +++-- src/compiler/generic/genesis.lisp | 4 ++++ tests/block-compile.impure.lisp | 17 +++++++++++++++++ 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index e79bd2f047..5e2f9c937e 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -838,10 +838,10 @@ 'read-char-string-as-varints) (%fasl-input-stream fasl-input) string namelen) (values string namelen elt-type))) - (aux-fop-intern (length+flag package fasl-input) + (aux-fop-intern (length+flag package inherited fasl-input) (multiple-value-bind (name length elt-type) (read-symbol-name length+flag fasl-input) - (push-fop-table (%intern name length package elt-type t) + (push-fop-table (%intern name length package elt-type t inherited) fasl-input))) (ensure-hashed (symbol) ;; ENSURE-SYMBOL-HASH when vop-translated is flushable since it is @@ -855,11 +855,13 @@ symbol)) (define-fop 77 :not-host (fop-lisp-symbol-save ((:operands length+flag))) - (aux-fop-intern length+flag *cl-package* (fasl-input))) + (aux-fop-intern length+flag *cl-package* t (fasl-input))) (define-fop 78 :not-host (fop-keyword-symbol-save ((:operands length+flag))) - (aux-fop-intern length+flag *keyword-package* (fasl-input))) + (aux-fop-intern length+flag *keyword-package* t (fasl-input))) (define-fop 79 :not-host (fop-symbol-in-package-save ((:operands length+flag pkg-index))) - (aux-fop-intern length+flag (ref-fop-table (fasl-input) pkg-index) (fasl-input))) + (aux-fop-intern length+flag (ref-fop-table (fasl-input) pkg-index) t (fasl-input))) + (define-fop 84 :not-host (fop-symbol-in-package-internal-save ((:operands length+flag pkg-index))) + (aux-fop-intern length+flag (ref-fop-table (fasl-input) pkg-index) nil (fasl-input))) (define-fop 80 :not-host (fop-uninterned-symbol-save ((:operands length+flag))) (multiple-value-bind (name len) (read-symbol-name length+flag (fasl-input)) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 4003f23502..048fa72c1e 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -1247,17 +1247,17 @@ implementation it is ~S." *!default-package-use-list*) ;;; The fasloader always supplies NAME as a (SIMPLE-ARRAY <ELT-TYPE> 1), ;;; but the reader uses a buffer of CHARACTER, which, based on a flag, ;;; can be demoted to an array of BASE-CHAR. -(defun %intern (name length package elt-type ignore-lock) +(defun %intern (name length package elt-type ignore-lock &optional (allow-inherited t)) ;; No type declarations, %find-symbol will perform the checks (multiple-value-bind (symbol where) (%find-symbol name length package) - (if where + (if (and where (or allow-inherited (neq where :inherited))) (values symbol where) ;; Double-checked lock pattern: the common case has the symbol already interned, ;; but in case another thread is interning in parallel we need to check after ;; grabbing the lock. (with-package-graph () (setf (values symbol where) (%find-symbol name length package)) - (if where + (if (and where (or allow-inherited (neq where :inherited))) (values symbol where) (let* ((symbol-name (logically-readonlyize diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 10aef8af91..0af2ef3e0f 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1000,8 +1000,9 @@ (dump-fop 'fop-keyword-symbol-save file length+flag)) (t (let ((pkg-index (dump-package pkg file))) - (dump-fop 'fop-symbol-in-package-save file - length+flag pkg-index)))) + (if (eq (find-symbol pname pkg) :inherited) + (dump-fop 'fop-symbol-in-package-save file length+flag pkg-index) + (dump-fop 'fop-symbol-in-package-internal-save file length+flag pkg-index))))) (unless dumped-as-copy (dump-chars pname file base-string-p) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index f0e2686fac..986ca5f59b 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2488,6 +2488,10 @@ Legal values for OFFSET are -4, -8, -12, ..." (cold-load-symbol length+flag (ref-fop-table (fasl-input) pkg-index) (fasl-input))) +(define-cold-fop (fop-symbol-in-package-internal-save (length+flag pkg-index)) + (cold-load-symbol length+flag (ref-fop-table (fasl-input) pkg-index) + (fasl-input))) + (define-cold-fop (fop-lisp-symbol-save (length+flag)) (cold-load-symbol length+flag *cl-package* (fasl-input))) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index 05fcce2c44..e5b636d1dd 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -46,6 +46,23 @@ (assert (eq *x* nil)) (assert *y*)) +(with-test (:name :block-defpackage-symbol-inheritance-load-fasl) + (defpackage block-defpackage2 (:use :cl)) + (ctu:file-compile + `((in-package :block-defpackage2) + + (eval-when (:compile-toplevel :load-toplevel :execute) + (shadow "+")) + + (defun + (x) (print x))) + :block-compile t + :before-load (lambda () + (delete-package :block-defpackage2) + (defpackage block-defpackage2 (:use :cl))) + :load t) + (assert (not (eq (fdefinition (find-symbol "+" "BLOCK-DEFPACKAGE2")) + #'cl:+)))) + (with-test (:name :block-defconstant-then-load-fasl) (ctu:file-compile ;; test a non-EQL-comparable constant. From 3e30f7ef7fc1d64cf675e4311e3f21855c56503e Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Mon, 25 Apr 2022 01:53:06 -0700 Subject: [PATCH 3209/4023] Fix really weird source of cross-host discrepancy. When block compiling this file, using unquoting rather than read eval caused some unintuitive list* fops to get dumped on sbcl host, whereas ccl host wouldn't have used a list* fop. With the reader eval, sbcl dumps the list structure similarly to CCL. It's so weird that we have a host sensitivity here, since the dump logic should be host agnostic at this point, but I suspect it has something to do with how this list is literally spliced in into the next DEFTRANSFORM, causing coalescing, and maybe because it was spliced into a host only function in the same file. ????????????? --- src/compiler/sxhash.lisp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/compiler/sxhash.lisp b/src/compiler/sxhash.lisp index bf12bee12a..2ec694e5b3 100644 --- a/src/compiler/sxhash.lisp +++ b/src/compiler/sxhash.lisp @@ -153,15 +153,16 @@ ;;; Treat double-float essentially the same as a fixnum if words are 64 bits. #+64-bit (defglobal +sxhash-double-float-expr+ - ;; logical negation of magic constant ensures that 0.0d0 hashes to something - ;; other than what the fixnum 0 hashes to (as tested in hash.impure.lisp) - (let ((c (logandc1 1193941380939624010 most-positive-fixnum))) - `(let ((x (double-float-bits x))) - ;; ensure we mix the sign bit into the hash - (logand (logxor (ash x 4) - (ash x (- (1+ sb-vm:n-fixnum-tag-bits))) - ,c) - most-positive-fixnum)))) + `(let ((x (double-float-bits x))) + ;; ensure we mix the sign bit into the hash + (logand (logxor (ash x 4) + (ash x (- (1+ sb-vm:n-fixnum-tag-bits))) + ;; logical negation of magic constant ensures + ;; that 0.0d0 hashes to something other than what + ;; the fixnum 0 hashes to (as tested in + ;; hash.impure.lisp) + #.(logandc1 1193941380939624010 most-positive-fixnum)) + most-positive-fixnum))) (deftransform sxhash ((x) (double-float)) '#.+sxhash-double-float-expr+) From ce2a45dd0dd53a86d0ba53dcecce6752d4207f44 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 26 Apr 2022 15:42:06 -0700 Subject: [PATCH 3210/4023] Use FIND-CONSTANT instead of MAKE-CONSTANT. To ensure only one LEAF is created. --- src/compiler/modarith.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/modarith.lisp b/src/compiler/modarith.lisp index 7e2fe3b19a..488d2ff221 100644 --- a/src/compiler/modarith.lisp +++ b/src/compiler/modarith.lisp @@ -242,7 +242,7 @@ (cond ((= constant-value new-value) (values t nil)) ; we knew what to do and did nothing (t - (change-ref-leaf node (make-constant new-value) + (change-ref-leaf node (find-constant new-value) :recklessly t) (let ((lvar (node-lvar node))) (setf (lvar-%derived-type lvar) From d3498a22a39133d42b5b998ed1b296bc9993b985 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sat, 23 Apr 2022 14:01:45 -0700 Subject: [PATCH 3211/4023] Do auto-tll smashing instead of fop compilation. For top level forms we now smash top level lambdas into one component, as if we were block compiling. We do it automatically 20 tlls at a time, which significantly reduces the number of components that need to get loaded and called at load time, reducing fasl size. Unlike CMU CL, we've solved the problems of package environment interaction, so that the optimization is semantically sound. I also found a solution for recursive IR1 namespacing with respect to forcing top level lambda smashing before emitting load time value and constant junk, as it was causing problems with constant infos not getting cleaned up properly. CMU CL also ran into this issue, but took one step forward and one step back by removing a force call and adding another one. Fix this by doing both force calls. As a representative of compiling a large file, compiling "src/compiler/node.lisp" - with no tlf smashing: produces a fasl of 940039 bytes. - with fop compilation: produces a fasl of 830003 bytes. - with tlf smashing 20 forms at a time: produces a fasl of 752591 bytes. Compiling ironclad shows no difference in speed. Loading the resulting fasls also shows no measurable difference in speed when TIMEd. Since we use the normal compiler, we don't sacrifice any debuggability or coverage instrumentation, as well as avoiding issues with multiple macroexpansion. This also opens up the possibility of using a real byte-compiler in conjunction with tlf smashing to squeeze out even more bytes out of fasls for loading top level code. The ir1-based cmu cl byte compiler, for example, gets 6x space savings over (risc) machine code on average (cf. cmu documentation). Note from the above that fop-based byte compilation does not even produce more compact code than machine code once top level lambdas are merged. The fopcompiler will get removed in a subsequent change. --- NEWS | 4 ++ src/code/array.lisp | 2 +- src/compiler/early-c.lisp | 3 ++ src/compiler/main.lisp | 105 ++++++++++++++++++++++++------------ tests/fopcompiler.pure.lisp | 3 +- 5 files changed, 82 insertions(+), 35 deletions(-) diff --git a/NEWS b/NEWS index d8d6db966e..8319d73b28 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,9 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- +changes relative to sbcl-2.2.4: + * optimization: fasl files are now usually smaller (up to 10% on default + policy) and may load faster, especially on high debug. + changes in sbcl-2.2.4 relative to sbcl-2.2.3: * enhancement: better constraint propagation in the compiler. Specifically, the compiler can now derive the type of X in control flow join situations diff --git a/src/code/array.lisp b/src/code/array.lisp index 5bfceeb971..a0ee75a3db 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -1039,7 +1039,7 @@ of specialized arrays is supported." (defun array-element-ctype (array) ;; same as (SPECIFIER-TYPE (ARRAY-ELEMENT-TYPE ARRAY)) but more efficient - (svref (load-time-value *saetp-widetag-ctype*) + (svref *saetp-widetag-ctype* (- (ash (array-underlying-widetag array) -2) 32))) (defun array-element-type (array) diff --git a/src/compiler/early-c.lisp b/src/compiler/early-c.lisp index c1278d5a8d..dfc2f97df5 100644 --- a/src/compiler/early-c.lisp +++ b/src/compiler/early-c.lisp @@ -264,6 +264,9 @@ the stack without triggering overflow protection.") ;; level lambdas resulting from compiling subforms. (In reverse ;; order.) (toplevel-lambdas nil :type list) + ;; We build a list of top-level lambdas, and then periodically smash them + ;; together into a single component and compile it. + (pending-toplevel-lambdas nil :type list) ;; Bidrectional map between IR1/IR2/assembler abstractions and a corresponding ;; small integer or string identifier. One direction could be done by adding diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 991831c950..33c5145a2d 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1036,6 +1036,8 @@ necessary, since type inference may take arbitrarily long to converge.") ;;;; processing of top level forms +(defvar *fopcompile* nil) + ;;; This is called by top level form processing when we are ready to ;;; actually compile something. If (BLOCK-COMPILE *COMPILATION*) is T, ;;; then we still convert the form, but delay compilation, pushing the result @@ -1051,7 +1053,8 @@ necessary, since type inference may take arbitrarily long to converge.") (return-from convert-and-maybe-compile)) ;; Don't bother to compile simple objects that just sit there. (when (and form (or (symbolp form) (consp form))) - (if (and (policy *policy* + (if (and *fopcompile* + (policy *policy* ;; FOP-compiled code is harder to debug. (or (< debug 2) (> space debug))) @@ -1062,6 +1065,9 @@ necessary, since type inference may take arbitrarily long to converge.") #+sb-xc-host nil #-sb-xc-host (fopcompilable-p form t)) (let ((*fopcompile-label-counter* 0)) + ;; Force any pending lambdas to avoid bad ordering + ;; interaction with fop compilation. + (compile-toplevel-lambdas () t) #+sb-xc-host (error "unreachable") #-sb-xc-host (fopcompile form path nil t)) (let* ((*lexenv* (make-lexenv @@ -1433,9 +1439,8 @@ necessary, since type inference may take arbitrarily long to converge.") ;;; Compile FORM and arrange for it to be called at load-time. Return ;;; the dumper handle and our best guess at the type of the object. -;;; Potential optimizations: We could test the form for constantness -;;; (including FIND-PACKAGE forms) and dump it as a literal directly -;;; instead. We could also fopcompile more complex non-constant forms. +;;; TODO: We could use an IR2 bytecode compiler here to produce +;;; smaller code. Same goes for top level code. (defun compile-load-time-value (form &optional no-skip) (let ((lambda (compile-load-time-stuff form t))) (values (fasl-dump-load-time-value-lambda lambda *compile-object* @@ -1454,6 +1459,11 @@ necessary, since type inference may take arbitrarily long to converge.") ;;; Do the actual work of COMPILE-LOAD-TIME-VALUE or ;;; COMPILE-MAKE-LOAD-FORM-INIT-FORMS. (defun compile-load-time-stuff (form for-value) + ;; We want to force top level lambdas before any recursive IR1 + ;; namespacing happens. Therefore, we need to force here as well as + ;; in EMIT-MAKE-LOAD-FORMS, since we could enter recursive IR1 + ;; namespacing through either function. + (compile-toplevel-lambdas () t) (with-ir1-namespace (let* ((*lexenv* (make-null-lexenv)) (lambda (ir1-toplevel form *current-path* for-value nil))) @@ -1540,6 +1550,13 @@ necessary, since type inference may take arbitrarily long to converge.") (handler-case (make-load-form constant (make-null-lexenv)) (error (condition) (sb-c:compiler-error condition))) (cond + ;; Used mainly as an optimization to avoid dumping internal + ;; compiler data structures (see :IGNORE-IT), and to avoid + ;; unnecessary top level lambda forcing. + ((and (null creation-form) (null init-form)) + (sb-fasl::dump-fop 'sb-fasl::fop-empty-list fasl) + (fasl-note-handle-for-constant constant (sb-fasl::dump-pop fasl) fasl) + nil) ((and ;; MAKE-LOAD-FORM-SAVING-SLOTS on the cross-compiler needs ;; the type to be defined for the target. @@ -1566,6 +1583,9 @@ necessary, since type inference may take arbitrarily long to converge.") (fasl-note-instance-saves-slots constant (slot-names) fasl)) t))))) (t + (compile-toplevel-lambdas () t) + (when (fasl-constant-already-dumped-p constant fasl) + (return-from emit-make-load-form nil)) ;; Allow dumping objects that can't be printed ;; Non-invocation of PRINT-OBJECT is tested by 'mlf.impure-cload.lisp'. (let* ((name #+sb-xc-host 'blobby ; the name means nothing @@ -1604,6 +1624,10 @@ necessary, since type inference may take arbitrarily long to converge.") ;;;; COMPILE-FILE +;;; The maximum number of top-level lambdas we put in a single top-level +;;; component. +(defparameter top-level-lambda-max 20) + (defun object-call-toplevel-lambda (tll) (declare (type functional tll)) (let ((object *compile-object*)) @@ -1612,21 +1636,31 @@ necessary, since type inference may take arbitrarily long to converge.") (core-object (core-call-toplevel-lambda tll object)) (null)))) -;;; Smash LAMBDAS into a single component, compile it, and arrange for -;;; the resulting function to be called. -(defun sub-compile-toplevel-lambdas (lambdas) +;;; Add LAMBDAS to the pending lambdas. If this leaves more than +;;; TOP-LEVEL-LAMBDA-MAX lambdas in the list, or if FORCE-P is true, +;;; then smash the lambdas into a single component, compile it, and +;;; arrange for the resulting function to be called. +(defun sub-compile-toplevel-lambdas (lambdas force-p) (declare (list lambdas)) - (when lambdas - (multiple-value-bind (component tll) (merge-toplevel-lambdas lambdas) - (compile-component component) - (clear-ir1-info component) - (object-call-toplevel-lambda tll))) + (let ((compilation *compilation*)) + (setf (pending-toplevel-lambdas compilation) + (append (pending-toplevel-lambdas compilation) lambdas)) + (let ((pending (pending-toplevel-lambdas compilation))) + (when (and pending + (or (> (length pending) top-level-lambda-max) + force-p)) + (multiple-value-bind (component tll) + (merge-toplevel-lambdas pending) + (setf (pending-toplevel-lambdas compilation) ()) + (compile-component component) + (clear-ir1-info component) + (object-call-toplevel-lambda tll))))) (values)) ;;; Compile top level code and call the top level lambdas. We pick off ;;; top level lambdas in non-top-level components here, calling ;;; SUB-c-t-l-l on each subsequence of normal top level lambdas. -(defun compile-toplevel-lambdas (lambdas) +(defun compile-toplevel-lambdas (lambdas force-p) (declare (list lambdas)) (let ((len (length lambdas))) (flet ((loser (start) @@ -1643,17 +1677,19 @@ necessary, since type inference may take arbitrarily long to converge.") len))) (do* ((start 0 (1+ loser)) (loser (loser start) (loser start))) - ((>= start len)) - (sub-compile-toplevel-lambdas (subseq lambdas start loser)) + ((>= start len) + (when force-p + (sub-compile-toplevel-lambdas nil t))) + (sub-compile-toplevel-lambdas (subseq lambdas start loser) + (or force-p (/= loser len))) (unless (= loser len) (object-call-toplevel-lambda (elt lambdas loser)))))) (values)) ;;; Compile LAMBDAS (a list of CLAMBDAs for top level forms) into the -;;; object file. -;;; -;;; LOAD-TIME-VALUE-P seems to control whether it's MAKE-LOAD-FORM and -;;; COMPILE-LOAD-TIME-VALUE stuff. -- WHN 20000201 +;;; object file. We loop doing local call analysis until it converges, +;;; since a single pass might miss something due to components being +;;; joined by let conversion. (defun compile-toplevel (lambdas load-time-value-p) (declare (list lambdas)) @@ -1667,17 +1703,19 @@ necessary, since type inference may take arbitrarily long to converge.") (maybe-mumble "[Check]~%") (check-ir1-consistency (append components top-components))) - (dolist (component components) - (compile-component component) - (replace-toplevel-xeps component)) + (let ((top-level-closure nil)) + (dolist (component components) + (compile-component component) + (when (replace-toplevel-xeps component) + (setq top-level-closure t))) - (when *check-consistency* - (maybe-mumble "[Check]~%") - (check-ir1-consistency (append components top-components))) + (when *check-consistency* + (maybe-mumble "[Check]~%") + (check-ir1-consistency (append components top-components))) - (if load-time-value-p - (compile-load-time-value-lambda lambdas) - (compile-toplevel-lambdas lambdas)) + (if load-time-value-p + (compile-load-time-value-lambda lambdas) + (compile-toplevel-lambdas lambdas top-level-closure))) (mapc #'clear-ir1-info components)) (values)) @@ -1688,10 +1726,7 @@ necessary, since type inference may take arbitrarily long to converge.") (let ((compilation *compilation*)) (when (block-compile compilation) (when (toplevel-lambdas compilation) - ;; FIXME: Use the source information from the initial - ;; conversion. CMUCL does this right. - (with-source-paths - (compile-toplevel (nreverse (toplevel-lambdas compilation)) nil)) + (compile-toplevel (nreverse (toplevel-lambdas compilation)) nil) (setf (toplevel-lambdas compilation) nil)) (setf (block-compile compilation) :specified) (setf (entry-points compilation) nil)))) @@ -1800,7 +1835,11 @@ necessary, since type inference may take arbitrarily long to converge.") (process-toplevel-form form `(original-source-start 0 ,current-index) nil)))) (let ((*source-info* info)) - (finish-block-compilation))) + ;; FIXME: Use the source information from the initial + ;; conversion. CMUCL does this right. + (with-source-paths + (finish-block-compilation) + (compile-toplevel-lambdas () t)))) (let ((code-coverage-records (code-coverage-records (coverage-metadata *compilation*)))) (unless (zerop (hash-table-count code-coverage-records)) diff --git a/tests/fopcompiler.pure.lisp b/tests/fopcompiler.pure.lisp index 054263fcd4..74ac66aea1 100644 --- a/tests/fopcompiler.pure.lisp +++ b/tests/fopcompiler.pure.lisp @@ -15,7 +15,8 @@ (with-open-file (f lisp :direction :output) (prin1 '(trythis fopcompile-test-undef-var) f)) (multiple-value-bind (fasl warningp errorp) - (compile-file lisp :output-file fasl) + (let ((sb-c::*fopcompile* t)) + (compile-file lisp :output-file fasl)) (sb-int:unencapsulate 'sb-c::fopcompile 'test) (assert *was-fopcompile-called*) (assert (and fasl warningp errorp)))) From 3e210f1ce444d6dcffc769719fbdeadc988ff8b0 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 26 Apr 2022 16:11:24 -0700 Subject: [PATCH 3212/4023] Delete fopcompiler and simplify loader substantially. The parent commit added functionality to allow the normal compiler to produce smaller fasls than the fopcompiler in many cases, without a real compile-time or load-time tradeoff. Therefore, remove the fopcompiler, as it adds a lot of complexity and needs to be turned off on high debug or instrumentation. As a bonus, the fopcode space is freed up a bit. It also suffers from multiple macroexpansion. Some things this allows us to simplify: * No need to have LOAD-FORM-IS-DEFAULT-MLFSS-P be used in the compiler. The way we used it was sketchy anyway. * The compiler and loader no longer need to keep track of skipping on the FOP stack, or whether LOAD-TIME-VALUE needs it to be done or not. --- src/code/load.lisp | 69 +--- src/cold/build-order.lisp-expr | 1 - src/cold/exports.lisp | 1 - src/compiler/dce.lisp | 2 +- src/compiler/dump.lisp | 43 +-- src/compiler/fopcompile.lisp | 478 ---------------------------- src/compiler/generic/genesis.lisp | 5 - src/compiler/generic/vm-tran.lisp | 7 +- src/compiler/main.lisp | 50 +-- tests/dump.impure-cload.lisp | 12 +- tests/fopcompiler.impure-cload.lisp | 147 --------- tests/fopcompiler.impure.lisp | 71 ----- tests/fopcompiler.pure.lisp | 25 -- 13 files changed, 41 insertions(+), 870 deletions(-) delete mode 100644 src/compiler/fopcompile.lisp delete mode 100644 tests/fopcompiler.impure-cload.lisp delete mode 100644 tests/fopcompiler.impure.lisp delete mode 100644 tests/fopcompiler.pure.lisp diff --git a/src/code/load.lisp b/src/code/load.lisp index 5e2f9c937e..d278cf24bd 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -130,11 +130,6 @@ (stack (make-fop-vector 100) :type simple-vector) (name-buffer (vector (make-string 1 :element-type 'character) (make-string 31 :element-type 'base-char))) - ;; Sometimes we want to skip over any FOPs with side-effects (like - ;; function calls) while executing other FOPs. SKIP-UNTIL will - ;; either contain the position where the skipping will stop, or - ;; NIL if we're executing normally. - (skip-until nil :type (or null fixnum)) (print nil :type boolean)) (declaim (freeze-type fasl-input)) @@ -421,8 +416,7 @@ `((macrolet ((fasl-input () '(truly-the fasl-input .fasl-input.)) (fasl-input-stream () '(%fasl-input-stream (fasl-input))) - (operand-stack () '(%fasl-input-stack (fasl-input))) - (skip-until () '(%fasl-input-skip-until (fasl-input)))) + (operand-stack () '(%fasl-input-stack (fasl-input)))) ,@(if (null stack-args) forms (with-unique-names (stack ptr) @@ -1035,24 +1029,19 @@ (read-n-bytes (fasl-input-stream) vector 0 bytes) vector)) -(defun fop-funcall* (argc stack skipping) +(defun fop-funcall* (argc stack) (with-fop-stack ((stack) ptr (1+ argc)) - (unless skipping - (do ((i (+ ptr argc)) - (args)) - ((= i ptr) (apply (fop-stack-ref i) args)) - (declare (type index i)) - (push (fop-stack-ref i) args) - (decf i))))) + (do ((i (+ ptr argc)) + (args)) + ((= i ptr) (apply (fop-stack-ref i) args)) + (declare (type index i)) + (push (fop-stack-ref i) args) + (decf i)))) (define-fop 55 (fop-funcall ((:operands n))) - (fop-funcall* n (operand-stack) (skip-until))) + (fop-funcall* n (operand-stack))) (define-fop 56 (fop-funcall-for-effect ((:operands n)) nil) - (fop-funcall* n (operand-stack) (skip-until))) - -;;; For LOAD-TIME-VALUE which is used for MAKE-LOAD-FORM -(define-fop 57 (fop-funcall-no-skip ((:operands n))) - (fop-funcall* n (operand-stack) nil)) + (fop-funcall* n (operand-stack))) ;;;; fops for fixing up circularities @@ -1218,44 +1207,6 @@ (define-fop 22 (fop-assembler-code) (error "cannot load assembler code except at cold load")) -;;; FOPs needed for implementing an IF operator in a FASL - -;;; Skip until a FOP-MAYBE-STOP-SKIPPING with the same POSITION is -;;; executed. While skipping, we execute most FOPs normally, except -;;; for ones that a) funcall/eval b) start skipping. This needs to -;;; be done to ensure that the fop table gets populated correctly -;;; regardless of the execution path. -(define-fop 6 (fop-skip ((:operands position)) nil) - (unless (skip-until) - (setf (skip-until) position)) - (values)) - -;;; As before, but only start skipping if the top of the FOP stack is NIL. -(define-fop 7 (fop-skip-if-false ((:operands position) condition) nil) - (unless (or condition (skip-until)) - (setf (skip-until) position)) - (values)) - -;;; If skipping, pop the top of the stack and discard it. Needed for -;;; ensuring that the stack stays balanced when skipping. -(define-fop 8 (fop-drop-if-skipping () nil) - (when (skip-until) - (fop-stack-pop-n (operand-stack) 1)) - (values)) - -;;; If skipping, push a dummy value on the stack. Needed for -;;; ensuring that the stack stays balanced when skipping. -(define-fop 9 (fop-push-nil-if-skipping () nil) - (when (skip-until) - (push-fop-stack nil (fasl-input))) - (values)) - -;;; Stop skipping if the top of the stack matches SKIP-UNTIL -(define-fop 10 (fop-maybe-stop-skipping ((:operands label)) nil) - (when (eql (skip-until) label) - (setf (skip-until) nil)) - (values)) - ;;;; fops for code coverage (define-fop 120 :not-host (fop-record-code-coverage (namestring cc) nil) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 42e3cb9759..a52dbeb805 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -470,7 +470,6 @@ #+sb-dyncount ("src/compiler/dyncount") #+sb-dyncount ("src/code/dyncount") - ("src/compiler/fopcompile" :not-host) ("src/code/format-time" :not-host) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 90d299dcca..cdae89be7c 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1226,7 +1226,6 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "FASL-OUTPUT-ENTRY-TABLE" "FASL-OUTPUT-STREAM" "FASL-VALIDATE-STRUCTURE" "FASL-NOTE-INSTANCE-SAVES-SLOTS" - "LOAD-FORM-IS-DEFAULT-MLFSS-P" "*!LOAD-TIME-VALUES*" "OPEN-FASL-OUTPUT" "*!COLD-TOPLEVELS*" diff --git a/src/compiler/dce.lisp b/src/compiler/dce.lisp index cbd9e0d048..282ed712a6 100644 --- a/src/compiler/dce.lisp +++ b/src/compiler/dce.lisp @@ -9,7 +9,7 @@ ;;; A CLAMBDA is deemed to be "externally referenced" if: ;;; - It is of KIND :TOPLEVEL (a toplevel CLAMBDA). ;;; - It is LAMBDA-HAS-EXTERNAL-REFERENCES-P true (from COMPILE -;;; or from the fopcompiler, possibly other causes). +;;; or possibly other causes). ;;; - It has a REF which has a NODE-COMPONENT other than the ;;; LAMBDA-COMPONENT of the CLAMBDA. ;;; diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 0af2ef3e0f..f9e03423a5 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -602,16 +602,13 @@ ;;; Emit a funcall of the function and return the handle for the ;;; result. -(defun fasl-dump-load-time-value-lambda (fun file no-skip) +(defun fasl-dump-load-time-value-lambda (fun file) (declare (type sb-c::clambda fun) (type fasl-output file)) (let ((handle (gethash (sb-c::leaf-info fun) (fasl-output-entry-table file)))) (aver handle) (dump-push handle file) - ;; Can't skip MAKE-LOAD-FORM due to later references - (if no-skip - (dump-fop 'fop-funcall-no-skip file 0) - (dump-fop 'fop-funcall file 0))) + (dump-fop 'fop-funcall file 0)) (dump-pop file)) ;;; Return T iff CONSTANT has already been dumped. It's been dumped if @@ -1326,45 +1323,11 @@ ;;;; dumping structures -;;; Even as late as calling DUMP-STRUCTURE we might have to deduce that a -;;; user's "custom" MAKE-LOAD-FORM amounts to MAKE-LOAD-FORM-SAVING-SLOTS -;;; with the default of all slots. Why: suppose you have some structure -;;; (DEFSTRUCT MYSTRUCT A) -;;; and a macro that returns literal instances of the structure: -;;; (DEFMACRO FUNNYMAC (N) (MAKE-MYSTRUCT :A N)) -;;; and a DEFVAR that uses the structure: -;;; (DEFVAR *A* (FUNNYMAC 1)) -;;; -;;; Now, because the fopcompiler expands macros more than once - at least once -;;; in FOPCOMPILABLE-P and then again in FOPCOMPILE - we see _different_ -;;; instances of MYSTRUCT each of those times. We don't memoize the expansion. -;;; The two structures are similar but not EQ, and only the instance produced -;;; during FOPCOMPILABLE-P was entered in the FASL-OUTPUT-VALID-STRUCTURES table. -;;; The other structure instance isn't there, but we need it to be legal to dump. -;;; -;;; This problem is not just theoretical. We ourselves do just that, e.g.: -;;; (defvar *cpus* (... (sb-alien:alien-funcall ...))) -;;; and the expansion of alien-funcall involves an ALIEN-TYPE literal -;;; which gets multiply expanded exactly as described above. -(defun load-form-is-default-mlfss-p (struct) - ;; FIXME? this is called while writing a fasl and so might need - ;; to invoke MAKE-LOAD-FORM, long after IR1 conversion has happened. - ;; Surely this is not the best design. - (and (typep struct 'structure-object) - (multiple-value-bind (creation-form init-form) - (handler-case (make-load-form struct (make-null-lexenv)) - (error (condition) (sb-c:compiler-error condition))) - (multiple-value-bind (ss-creation-form ss-init-form) - (make-load-form-saving-slots struct) - (and (equal creation-form ss-creation-form) - (equal init-form ss-init-form)))))) - (defun dump-structure (struct file) (unless (or (gethash struct (fasl-output-valid-structures file)) (typep struct '(or sb-c::debug-info sb-c::debug-fun sb-c::debug-source - sb-c:definition-source-location sb-c::debug-name-marker)) - (load-form-is-default-mlfss-p struct)) + sb-c:definition-source-location sb-c::debug-name-marker))) (error "attempt to dump invalid structure:~% ~S~%How did this happen?" struct)) (note-potential-circularity struct file) diff --git a/src/compiler/fopcompile.lisp b/src/compiler/fopcompile.lisp deleted file mode 100644 index f1b9b27fb3..0000000000 --- a/src/compiler/fopcompile.lisp +++ /dev/null @@ -1,478 +0,0 @@ -;;;; A compiler from simple top-level forms to FASL operations. - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -(in-package "SB-C") - -;;; SBCL has no proper byte compiler (having ditched the rather -;;; ambitious and slightly flaky byte compiler inherited from CMU CL) -;;; but its FOPs are a sort of byte code which is expressive enough -;;; that we can compile some simple toplevel forms directly to them, -;;; including very common operations like the forms that DEFVARs and -;;; DECLAIMs macroexpand into. -;;; -;;; FIXME: The expexnasion problem. -;;; FOPCOMPILE and FOPCOMPILABLE-P cause multiple expansion of macros, -;;; which may be problematic with side-effecting macros. When -;;; FOPCOMPILABLE-P succeeds, FOPCOMPILE is called, resulting in -;;; double macroexpansion. When FOPCOMPILABLE-P fails, -;;; IR1-CONVERT-FUNCTOID expands already expanded macros for a second -;;; time. -;;; And an edge case, when the top-level call has a complier-macro -;;; which returns &whole it gets expanded three times, two times by -;;; FOPCOMPILABLE-P and FOPCOMPILE, and one time by -;;; PROCESS-TOPLEVEL-FORM, because unlike other macros, the expanded -;;; form is still a macro-form. That's what the EXPAND optional -;;; parameter solves, PROCESS-TOPLEVEL-FORM passes NIL, expanding -;;; compiler macros at most once. -;;; The instances of double expansion still remain, e.g. (fun (macro)), -;;; since PROCESS-TOPLEVEL-FORM only expands the macros at the first -;;; position. - -(defun fopcompilable-p (form &optional (expand t)) - ;; We'd like to be able to handle - ;; -- simple funcalls, nested recursively, e.g. - ;; (SET '*PACKAGE* (FIND-PACKAGE "CL-USER")) - ;; -- common self-evaluating forms like strings and keywords and - ;; fixnums, which are important for terminating - ;; the recursion of the simple funcalls above - ;; -- quoted lists (which are important for PROCLAIMs, which are - ;; common toplevel forms) - ;; -- fopcompilable stuff wrapped around non-fopcompilable expressions, - ;; e.g. - ;; (%DEFUN 'FOO (LAMBDA () ...) ...) - ;; -- the IF special form, to support things like (DEFVAR *X* 0) - ;; expanding into (UNLESS (BOUNDP '*X*) (SET '*X* 0)) - ;; - ;; Special forms which we don't currently handle, but might consider - ;; supporting in the future are LOCALLY (with declarations), - ;; MACROLET, SYMBOL-MACROLET and THE. - (flet ((expand (form) - (if expand - (handler-case - (%macroexpand form *lexenv*) - (error () (return-from fopcompilable-p))) - (values form nil))) - (expand-cm (form) - (if expand - (expand-compiler-macro form) - (values form nil)))) - (or (and (self-evaluating-p form) - (constant-fopcompilable-p form)) - (and (symbolp form) - (multiple-value-bind (macroexpansion macroexpanded-p) - (expand form) - (if macroexpanded-p - (fopcompilable-p macroexpansion) - ;; Punt on :ALIEN variables - (let ((kind (info :variable :kind form))) - (member kind '(:special :constant :global :unknown)))))) - (and (listp form) - (ignore-errors (list-length form)) - (let ((macroexpansion (expand-cm form))) - (if (neq macroexpansion form) - (return-from fopcompilable-p (fopcompilable-p macroexpansion)) - t)) - (multiple-value-bind (macroexpansion macroexpanded-p) - (expand form) - (if macroexpanded-p - (fopcompilable-p macroexpansion) - (destructuring-bind (operator &rest args) form - (case operator - ;; Special operators that we know how to cope with - ((progn) - (every #'fopcompilable-p args)) - ((quote) - (and (= (length args) 1) - (constant-fopcompilable-p (car args)))) - ((function) - (and (= (length args) 1) - ;; #'(LAMBDA ...), #'(NAMED-LAMBDA ...), etc. These - ;; are not fopcompileable as such, but we can compile - ;; the lambdas with the real compiler, and the rest - ;; of the expression with the fop-compiler. - (or (and (lambda-form-p (car args)) - ;; The lambda might be closing over some - ;; variable, punt. As a further improvement, - ;; we could analyze the lambda body to - ;; see whether it really closes over any - ;; variables. One place where even simple - ;; analysis would be useful are the PCL - ;; slot-definition type-check-functions - ;; -- JES, 2007-01-13 - (notany (lambda (binding) - (lambda-var-p (cdr binding))) - (lexenv-vars *lexenv*))) - ;; #'FOO, #'(SETF FOO), etc - (legal-fun-name-p (car args))))) - ((if) - (and (<= 2 (length args) 3) - (every #'fopcompilable-p args))) - ;; Allow SETQ only on special or global variables - ((setq) - (loop for (name value) on args by #'cddr - always (and (symbolp name) - (member (info :variable :kind name) - '(:special :global)) - (fopcompilable-p value)))) - ;; The real toplevel form processing has already been - ;; done, so EVAL-WHEN handling will be easy. - ((eval-when) - (and (>= (length args) 1) - (eq (set-difference (car args) - '(:compile-toplevel - compile - :load-toplevel - load - :execute - eval)) - nil) - (every #'fopcompilable-p (cdr args)))) - ;; A LET or LET* that introduces only lexical - ;; bindings might be fopcompilable, depending on - ;; whether something closes over the bindings. - ;; (And whether there are declarations in the body, - ;; see below) - ((let let*) - (let-fopcompilable-p operator args)) - ((locally) - (every #'fopcompilable-p args)) - (otherwise - ;; ordinary function calls - (and (symbolp operator) - ;; If a LET/LOCALLY tries to introduce - ;; declarations, we'll detect it here, and - ;; disallow fopcompilation. This is safe, - ;; since defining a function/macro named - ;; DECLARE would violate a package lock. - (not (eq operator 'declare)) - (not (special-operator-p operator)) - (not (macro-function operator)) ; redundant check - (every #'fopcompilable-p args))))))))))) - -(defun let-fopcompilable-p (operator args) - (when (>= (length args) 1) - (multiple-value-bind (body decls) (parse-body (cdr args) nil) - (declare (ignore body)) - (let* ((orig-lexenv *lexenv*) - (*lexenv* (make-lexenv))) - ;; We need to check for declarations - ;; first. Otherwise the fake lexenv we're - ;; constructing might be invalid. - (and (null decls) - (loop for binding in (car args) - for name = (if (consp binding) - (first binding) - binding) - for value = (if (consp binding) - (second binding) - nil) - ;; Only allow binding locals, since special bindings can't - ;; be easily expressed with fops. - always (and (eq (info :variable :kind name) - :unknown) - (let ((*lexenv* (ecase operator - (let orig-lexenv) - (let* *lexenv*)))) - (fopcompilable-p value))) - do (progn - (setf *lexenv* (make-lexenv)) - (push (cons name - (make-lambda-var :%source-name name)) - (lexenv-vars *lexenv*)))) - (every #'fopcompilable-p (cdr args))))))) - -(defun lambda-form-p (form) - (and (consp form) - (member (car form) - '(lambda named-lambda lambda-with-lexenv)))) - -;;; Check that a literal form is fopcompilable. It would not be, for example, -;;; when the form contains structures with funny MAKE-LOAD-FORMS. -;;; In particular, pathnames are not trivially dumpable because the HOST slot -;;; might need to be dumped as a reference to the *PHYSICAL-HOST* symbol. -;;; This function is nowhere near as OAOO-violating as it once was - it no -;;; longer has local knowledge of the set of leaf types, nor how to test for -;;; non-trivial instances. Sharing more code with MAYBE-EMIT-MAKE-LOAD-FORMS -;;; might be a nice goal, but it seems relatively impossible to achieve. -(defun constant-fopcompilable-p (constant) - (declare (optimize (debug 1))) ;; TCO - (let ((xset (alloc-xset)) - (dumpable-structures)) - (named-let grovel ((value constant)) - ;; Unless VALUE is an object which which obviously - ;; can't contain other objects - (unless (dumpable-leaflike-p value) - (if (xset-member-p value xset) - (return-from grovel nil) - (add-to-xset value xset)) - (typecase value - (cons - (grovel (car value)) - (grovel (cdr value))) - (simple-vector - (dotimes (i (length value)) - (grovel (svref value i)))) - ((vector t) - (dotimes (i (length value)) - (grovel (aref value i)))) - ((simple-array t) - ;; Even though the (ARRAY T) branch does the exact - ;; same thing as this branch we do this separately - ;; so that the compiler can use faster versions of - ;; array-total-size and row-major-aref. - (dotimes (i (array-total-size value)) - (grovel (row-major-aref value i)))) - ((array t) - (dotimes (i (array-total-size value)) - (grovel (row-major-aref value i)))) - (instance - ;; Almost always, a make-load-form method will call - ;; MAKE-LOAD-FORM-SAVING-SLOTS for all slots. If so, - ;; then this structure is amenable to FOPCOMPILE. - ;; If not, then it isn't, which is not strictly true- - ;; the method might have returned a fopcompilable - ;; creation form and no init form. (Handling of - ;; circularity is best left to the main compiler.) - (unless (sb-fasl:load-form-is-default-mlfss-p value) - (return-from constant-fopcompilable-p nil)) - (do-instance-tagged-slot (i value) - (grovel (%instance-ref value i))) - (push value dumpable-structures)) - (t - (return-from constant-fopcompilable-p nil))))) - (dolist (structure dumpable-structures) - (fasl-validate-structure structure *compile-object*)) - t)) - -;;; FOR-VALUE-P is true if the value will be used (i.e., pushed onto -;;; FOP stack), or NIL if any value will be discarded. FOPCOMPILABLE-P -;;; has already ensured that the form can be fopcompiled. -;;; -;;; See the expansion problem FIXME above fopcompilable-p. -(defun fopcompile (form path for-value-p &optional (expand t)) - (let ((path (or (get-source-path form) (cons form path))) - (fasl *compile-object*)) - (flet ((expand (form) - (if expand - (%macroexpand form *lexenv*) - (values form nil))) - (expand-cm (form) - (if expand - (expand-compiler-macro form) - (values form nil)))) - (cond ((self-evaluating-p form) - (fopcompile-constant fasl form for-value-p)) - ((symbolp form) - (multiple-value-bind (macroexpansion macroexpanded-p) - (expand form) - (if macroexpanded-p - ;; Symbol macro - (fopcompile macroexpansion path for-value-p) - (let ((kind (info :variable :kind form))) - (cond - ((eq :special kind) - ;; Special variable - (fopcompile `(symbol-value ',form) path for-value-p)) - - ((member kind '(:global :constant)) - ;; Global variable or constant. - (fopcompile `(symbol-global-value ',form) path for-value-p)) - (t - ;; Lexical - (let* ((var (cdr (assoc form (lexenv-vars *lexenv*)))) - (handle (and (lambda-var-p var) - (leaf-info var)))) - (cond (handle - (setf (lambda-var-ever-used var) t) - (when for-value-p - (sb-fasl::dump-push handle fasl))) - (t - (unless var - ;; Undefined variable. Signal a warning, and - ;; treat it as a special variable reference, like - ;; the real compiler does -- do not elide even if - ;; the value is unused. - (note-undefined-reference form :variable)) - (fopcompile `(symbol-value ',form) - path - for-value-p)))))))))) - ((listp form) - (let ((macroexpansion (expand-cm form))) - (if (neq macroexpansion form) - ;; could expand into an atom, so start from the top - (return-from fopcompile - (fopcompile macroexpansion path for-value-p)))) - (multiple-value-bind (macroexpansion macroexpanded-p) - (expand form) - (if macroexpanded-p - (fopcompile macroexpansion path for-value-p) - (destructuring-bind (operator &rest args) form - (case operator - ;; The QUOTE special operator is worth handling: very - ;; easy and very common at toplevel. - ((quote) - (fopcompile-constant fasl (second form) for-value-p)) - ;; A FUNCTION needs to be compiled properly, but doesn't - ;; need to prevent the fopcompilation of the whole form. - ;; We just compile it, and emit an instruction for pushing - ;; the function handle on the FOP stack. - ((function) - (fopcompile-function fasl (second form) path for-value-p)) - ;; KLUDGE! SB-C:SOURCE-LOCATION calls are normally handled - ;; by a compiler-macro. But if SPACE > DEBUG we choose not - ;; to record locations, which is strange because the main - ;; compiler does not have similar logic afaict. - ((source-location) - ;; FIXME: since the fopcompiler expands compiler-macros, - ;; this case should probably be killed. It can't execute. - (if (policy *policy* (and (> space 1) - (> space debug))) - (fopcompile-constant fasl nil for-value-p) - (fopcompile (let ((*current-path* path)) - (make-definition-source-location)) - path - for-value-p))) - ((if) - (fopcompile-if fasl args path for-value-p)) - ((progn locally) - (if (and for-value-p (endp args)) - (fopcompile nil path t) - (loop for (arg . next) on args - do (fopcompile arg path - (if next nil for-value-p))))) - ((setq) - (if (and for-value-p (endp args)) - (fopcompile nil path t) - (loop for (name value . next) on args by #'cddr - do (fopcompile `(set ',name ,value) path - (if next nil for-value-p))))) - ((eval-when) - (destructuring-bind (situations &body body) args - (if (or (member :execute situations) - (member 'eval situations)) - (fopcompile (cons 'progn body) path for-value-p) - (fopcompile nil path for-value-p)))) - ((let let*) - (let ((orig-lexenv *lexenv*) - (*lexenv* (make-lexenv :default *lexenv*)) - vars) - (loop for binding in (car args) - for name = (if (consp binding) - (first binding) - binding) - for value = (if (consp binding) - (second binding) - nil) - do - (let ((*lexenv* (if (eql operator 'let) - orig-lexenv - *lexenv*))) - (fopcompile value path t)) - (let* ((obj (sb-fasl::dump-pop fasl)) - (var (make-lambda-var - :%source-name name - :info obj))) - (push var vars) - (setf *lexenv* - (make-lexenv - :vars (list (cons name var)))))) - (fopcompile (cons 'progn (cdr args)) path for-value-p) - (when (and vars - (and *source-info* path)) - (let* ((tlf (source-path-tlf-number path)) - (file-info (source-info-file-info *source-info*)) - (*compiler-error-context* - (make-compiler-error-context - :original-form form - :file-name (file-info-truename file-info) - :initialized t - :file-position - (nth-value 1 (find-source-root tlf *source-info*)) - :original-source-path (source-path-original-source path) - :handled-conditions - (lexenv-handled-conditions *lexenv*)))) - (note-unreferenced-vars vars *policy*))))) - ;; Otherwise it must be an ordinary funcall. - (otherwise - (cond - ;; Special hack: there's already a fop for - ;; find-undeleted-package-or-lose, so use it. - ;; (We could theoretically do the same for - ;; other operations, but I don't see any good - ;; candidates in a quick read-through of - ;; src/code/fop.lisp.) - ((and (eq operator 'find-undeleted-package-or-lose) - (= 1 (length args)) - for-value-p) - (fopcompile (first args) path t) - (dump-fop 'sb-fasl::fop-package fasl)) - (t - (when (eq (info :function :where-from operator) :assumed) - (note-undefined-reference operator :function)) - (fopcompile-constant fasl operator t) - (let ((n 0)) - (dolist (arg args) - (incf n) - (fopcompile arg path t)) - (if for-value-p - (dump-fop 'sb-fasl::fop-funcall fasl n) - (dump-fop 'sb-fasl::fop-funcall-for-effect - fasl n))))))))))) - (t - (bug "looks unFOPCOMPILEable: ~S" form)))))) - -(defun fopcompile-function (fasl form path for-value-p) - (cond ((lambda-form-p form) - ;; Lambda forms are compiled with the real compiler - (let ((handle (%compile form fasl :path path))) - (when for-value-p - (sb-fasl::dump-push handle fasl)))) - ;; While function names are translated to a call to FDEFINITION. - ((legal-fun-name-p form) - (fopcompile `(fdefinition ',form) path for-value-p)) - (t - (compiler-error "~S is not a legal function name." form)))) - -(defun fopcompile-if (fasl args path for-value-p) - (destructuring-bind (condition then &optional else) args - (let ((else-label (incf *fopcompile-label-counter*)) - (end-label (incf *fopcompile-label-counter*))) - (fopcompile condition path t) - ;; If condition was false, skip to the ELSE - (dump-fop 'sb-fasl::fop-skip-if-false fasl else-label) - (fopcompile then path for-value-p) - ;; The THEN branch will have produced a value even if we were - ;; currently skipping to the ELSE branch (or over this whole - ;; IF). This is done to ensure that the stack effects are - ;; balanced properly when dealing with operations that are - ;; executed even when skipping over code. But this particular - ;; value will be bogus, so we drop it. - (when for-value-p - (dump-fop 'sb-fasl::fop-drop-if-skipping fasl)) - ;; Now skip to the END - (dump-fop 'sb-fasl::fop-skip fasl end-label) - ;; Start of the ELSE branch - (dump-fop 'sb-fasl::fop-maybe-stop-skipping fasl else-label) - (fopcompile else path for-value-p) - ;; As before - (when for-value-p - (dump-fop 'sb-fasl::fop-drop-if-skipping fasl)) - ;; End of IF - (dump-fop 'sb-fasl::fop-maybe-stop-skipping fasl end-label) - ;; If we're still skipping, we must've triggered both of the - ;; drop-if-skipping fops. To keep the stack balanced, push a - ;; dummy value if needed. - (when for-value-p - (dump-fop 'sb-fasl::fop-push-nil-if-skipping fasl))))) - -(defun fopcompile-constant (fasl form for-value-p) - (when for-value-p - (dump-object form fasl))) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 986ca5f59b..b836745a8a 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2611,11 +2611,6 @@ Legal values for OFFSET are -4, -8, -12, ..." (push (pop-stack) *!cold-toplevels*) (error "Can't FOP-FUNCALL-FOR-EFFECT random stuff in cold load"))) -;;; Needed for certain L-T-V lambdas that use the -NO-SKIP variant of funcall. -#-c-headers-only -(setf (svref **fop-funs** (get 'fop-funcall-no-skip 'opcode)) - (svref **fop-funs** (get 'fop-funcall 'opcode))) - (define-cold-fop (fop-named-constant-set (index)) (push (cold-list (cold-intern :named-constant) (pop-stack) diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index 656ae25c00..e6b27a1d49 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -751,15 +751,14 @@ (logior sb-vm:character-widetag (ash (char-code (lvar-value obj)) sb-vm:n-widetag-bits))) +;;; FIXME: The following should really be done by defining +;;; UNBOUND-MARKER as a primitive object. ;; So that the PCL code walker doesn't observe any use of %PRIMITIVE, ;; MAKE-UNBOUND-MARKER is an ordinary function, not a macro. #-sb-xc-host (defun make-unbound-marker () ; for interpreters (sb-sys:%primitive make-unbound-marker)) -;; Get the main compiler to transform MAKE-UNBOUND-MARKER -;; without the fopcompiler seeing it - the fopcompiler does -;; expand compiler-macros, but not source-transforms - -;; because %PRIMITIVE is not generally fopcompilable. +;; Get the main compiler to transform MAKE-UNBOUND-MARKER. (sb-c:define-source-transform make-unbound-marker () `(sb-sys:%primitive make-unbound-marker)) diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 33c5145a2d..cf161c6649 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -68,8 +68,6 @@ (defvar *emit-cfasl* nil) -(defvar *fopcompile-label-counter*) - (declaim (inline code-coverage-records code-coverage-blocks)) ;; Used during compilation to map code paths to the matching ;; instrumentation conses. @@ -1036,8 +1034,6 @@ necessary, since type inference may take arbitrarily long to converge.") ;;;; processing of top level forms -(defvar *fopcompile* nil) - ;;; This is called by top level form processing when we are ready to ;;; actually compile something. If (BLOCK-COMPILE *COMPILATION*) is T, ;;; then we still convert the form, but delay compilation, pushing the result @@ -1053,32 +1049,15 @@ necessary, since type inference may take arbitrarily long to converge.") (return-from convert-and-maybe-compile)) ;; Don't bother to compile simple objects that just sit there. (when (and form (or (symbolp form) (consp form))) - (if (and *fopcompile* - (policy *policy* - ;; FOP-compiled code is harder to debug. - (or (< debug 2) - (> space debug))) - ;; The fopcompiler doesn't play nice with coverage data, - ;; as then top level forms don't get instrumented. - (policy *lexenv* (= store-coverage-data 0)) - (not (eq (block-compile *compilation*) t)) - #+sb-xc-host nil - #-sb-xc-host (fopcompilable-p form t)) - (let ((*fopcompile-label-counter* 0)) - ;; Force any pending lambdas to avoid bad ordering - ;; interaction with fop compilation. - (compile-toplevel-lambdas () t) - #+sb-xc-host (error "unreachable") - #-sb-xc-host (fopcompile form path nil t)) - (let* ((*lexenv* (make-lexenv - :policy *policy* - :handled-conditions *handled-conditions* - :disabled-package-locks *disabled-package-locks*)) - (tll (ir1-toplevel form path nil))) - (if (eq (block-compile *compilation*) t) - (push tll (toplevel-lambdas *compilation*)) - (compile-toplevel (list tll) nil)) - nil)))) + (let* ((*lexenv* (make-lexenv + :policy *policy* + :handled-conditions *handled-conditions* + :disabled-package-locks *disabled-package-locks*)) + (tll (ir1-toplevel form path nil))) + (if (eq (block-compile *compilation*) t) + (push tll (toplevel-lambdas *compilation*)) + (compile-toplevel (list tll) nil)) + nil))) ;;; Macroexpand FORM in the current environment with an error handler. ;;; We only expand one level, so that we retain all the intervening @@ -1439,12 +1418,11 @@ necessary, since type inference may take arbitrarily long to converge.") ;;; Compile FORM and arrange for it to be called at load-time. Return ;;; the dumper handle and our best guess at the type of the object. -;;; TODO: We could use an IR2 bytecode compiler here to produce -;;; smaller code. Same goes for top level code. -(defun compile-load-time-value (form &optional no-skip) +;;; TODO: We could use a bytecode compiler here to produce smaller +;;; code. Same goes for top level code. +(defun compile-load-time-value (form) (let ((lambda (compile-load-time-stuff form t))) - (values (fasl-dump-load-time-value-lambda lambda *compile-object* - no-skip) + (values (fasl-dump-load-time-value-lambda lambda *compile-object*) (let ((type (leaf-type lambda))) (if (fun-type-p type) (single-value-type (fun-type-returns type)) @@ -1603,7 +1581,7 @@ necessary, since type inference may take arbitrarily long to converge.") (catch constant (fasl-note-handle-for-constant constant - (compile-load-time-value creation-form t) + (compile-load-time-value creation-form) fasl) nil) (compiler-error "circular references in creation form for ~S" diff --git a/tests/dump.impure-cload.lisp b/tests/dump.impure-cload.lisp index d74b262b96..8cdac39bd3 100644 --- a/tests/dump.impure-cload.lisp +++ b/tests/dump.impure-cload.lisp @@ -229,6 +229,14 @@ )) ; end EVAL-WHEN +(defun load-form-is-default-mlfss-p (object) + (multiple-value-bind (creation-form init-form) + (make-load-form object) + (multiple-value-bind (ss-creation-form ss-init-form) + (make-load-form-saving-slots object) + (and (equal creation-form ss-creation-form) + (equal init-form ss-init-form))))) + ;; Redefine the MAKE-LOAD-FORM method on FOO. (remove-method #'make-load-form (find-method #'make-load-form nil (list 'foo))) (defvar *foo-save-slots* nil) @@ -241,13 +249,13 @@ (let ((foo (make-foo :x 'x :y 'y))) (flet ((assert-canonical (slots) (let ((*foo-save-slots* slots)) - (assert (sb-fasl:load-form-is-default-mlfss-p foo))))) + (assert (load-form-is-default-mlfss-p foo))))) (assert-canonical :all) (assert-canonical '(x y)) ; specifying all slots explicitly is still canonical (assert-canonical '(y x))) ;; specifying only one slot is not canonical (let ((*foo-save-slots* '(x))) - (assert (not (sb-fasl:load-form-is-default-mlfss-p foo)))))) + (assert (not (load-form-is-default-mlfss-p foo)))))) ;; A huge constant vector. This took 9 seconds to compile (on a MacBook Pro) ;; prior to the optimization for using fops to dump. diff --git a/tests/fopcompiler.impure-cload.lisp b/tests/fopcompiler.impure-cload.lisp deleted file mode 100644 index b3e49cb145..0000000000 --- a/tests/fopcompiler.impure-cload.lisp +++ /dev/null @@ -1,147 +0,0 @@ -;;;; tests of the fop compiler - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; While most of SBCL is derived from the CMU CL system, the test -;;;; files (like this one) were written from scratch after the fork -;;;; from CMU CL. -;;;; -;;;; This software is in the public domain and is provided with -;;;; absolutely no warranty. See the COPYING and CREDITS files for -;;;; more information. - -(in-package "CL-USER") - -;; Can't use normal ASSERT, since it is not fopcompilable... -(defun assert* (value) - (unless value - (error "assert failed"))) - -;;; Test that the forms that are supposed to be fopcompilable are, and -;;; the ones that aren't aren't. The body might contain further tests to -;;; ensure that the fopcompiled code works as intended. -(defmacro fopcompile-test (fopcompilable-p &body body) - (assert (eql (sb-c::fopcompilable-p `(progn ,@body)) - fopcompilable-p)) - `(progn ,@body)) - -(fopcompile-test t - (let ((a 1)) - (assert* (eql a 1)))) - -(fopcompile-test t - (let ((a 3)) - (let ((a 4)) - (assert* (eql a 4))))) - -(fopcompile-test t - (let* ((a 5)) - (let* ((a 6)) - (assert* (eql a 6))))) - -(fopcompile-test nil - (let ((a 7)) - (assert* (eql (funcall (lambda () a)) 7)))) - -(fopcompile-test nil - (let* ((a 8)) - (assert* (eql (funcall (lambda () a)) 8)))) - -(fopcompile-test t - (let ((a 8) - (b (lambda () 1))) - nil)) - -(fopcompile-test t - (let* ((a (lambda () 1))) - nil)) - -(fopcompile-test nil - (let* ((a 8) - (b (lambda () 1))) - nil)) - -(fopcompile-test nil - (let* ((a 9) - (b (funcall (lambda () a)))) - (assert* (eql b 9)))) - -(fopcompile-test t - (let ((a 10)) - (let ((a 11) - (b a)) - (assert* (eql b 10))))) - -(fopcompile-test t - (let ((a 12)) - (let* ((a 13) - (b a)) - (assert* (eql b 13))))) - -;;; Ensure that we're passing sensible environments to macros during -;;; fopcompilation. Reported by Samium Gromoff. - -(defmacro bar (vars &environment env) - (assert (equal vars - (mapcar #'car (sb-c::lexenv-vars env))))) - -(symbol-macrolet ((foo 1)) - (let* ((x (bar (foo))) - (y (bar (x foo)))) - (bar (y x foo)))) - -;;; Some tests involving compiler-macros. - -(defvar *cmacro-result* nil) - -(defun baz (x) (declare (ignore x))) - -;; functional foo - a function with a compiler-macro -(defun ffoo (x) (push `(regular-ffoo ,x) *cmacro-result*)) -(define-compiler-macro ffoo (x) - `(push `(cmacro-ffoo ,,x) *cmacro-result*)) - -;; macro foo - a macro with a compiler-macro -(defmacro mfoo (x) `(push `(regular-mfoo ,,x) *cmacro-result*)) -(define-compiler-macro mfoo (x) - `(push `(cmacro-mfoo ,,x) *cmacro-result*)) - -(defun get-s () (declare (special s)) s) - -;; Verify some assumptions that the tests will test what was intended. -(eval-when (:compile-toplevel) - (let ((sb-c::*lexenv* (sb-kernel:make-null-lexenv))) - (assert (sb-c::fopcompilable-p '(baz (ffoo 3)))) - (assert (sb-c::fopcompilable-p '(baz (mfoo 3)))) - ;; The special binding of S makes these forms not fopcompilable. - (assert (not (sb-c::fopcompilable-p - '(ffoo (let ((s 3)) (declare (special s)) (get-s)))))) - (assert (not (sb-c::fopcompilable-p - '(mfoo (let ((s 3)) (declare (special s)) (get-s)))))))) - -;; fopcompilable toplevel form should execute the compiler macro -(ffoo 1) -(mfoo 1) -;; fopcompilable form expands embedded compiler-macro -(baz (ffoo 2)) -(baz (mfoo 2)) -;; not-fopcompilable toplevel form should execute the compiler macro. -;; This was ok if the toplevel call was a function with a compiler-macro, -;; but was not working for a toplevel macro having a compiler-macro. -(ffoo (let ((s 3)) (declare (special s)) (get-s))) -(mfoo (let ((s 3)) (declare (special s)) (get-s))) - -(with-test (:name :compiler-macros-at-toplevel) - ;; Now assert about the macroexpansions that happened. - (assert (equal *cmacro-result* - '((CMACRO-MFOO 3) (CMACRO-FFOO 3) - (CMACRO-MFOO 2) (CMACRO-FFOO 2) - (CMACRO-MFOO 1) (CMACRO-FFOO 1))))) - -(when (eval nil) - (lambda () #.(find-package "CL"))) - -(with-test (:name :skip-load-form) - (assert (eq #.(find-package "CL") - (eval '(find-package "CL"))))) diff --git a/tests/fopcompiler.impure.lisp b/tests/fopcompiler.impure.lisp deleted file mode 100644 index cea42b83c9..0000000000 --- a/tests/fopcompiler.impure.lisp +++ /dev/null @@ -1,71 +0,0 @@ -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; While most of SBCL is derived from the CMU CL system, the test -;;;; files (like this one) were written from scratch after the fork -;;;; from CMU CL. -;;;; -;;;; This software is in the public domain and is provided with -;;;; absolutely no warranty. See the COPYING and CREDITS files for -;;;; more information. - -;;; These tests don't need to be processed by the compiler before -;;; being executed, in fact mustn't go in "fopcompiler.impure-cload.lisp" -;;; because the call to COMPILE-FILE needs to be wrapped in HANDLER-BIND. - -(defvar *tmp-filename* (scratch-file-name)) - -;; Assert that FORM is handled by the fopcompiler, then compile it. -(defun assert-fopcompilable-and-compile-it (form) - ;; Since FOPCOMPILABLE-P now expands compiler-macros, and the macro for - ;; SOURCE-LOCATION expands to a literal structure, we end up calling - ;; CONSTANT-FOPCOMPILABLE-P which needs *COMPILE-OBJECT* to be bound. - (let ((sb-c::*compile-object* - (sb-fasl::make-fasl-output :stream (make-broadcast-stream))) - (sb-c::*lexenv* (sb-kernel:make-null-lexenv))) - (assert (sb-c::fopcompilable-p form)) - (with-open-file (stream *tmp-filename* - :direction :output :if-exists :supersede) - (prin1 form stream)) - (let (warning) - (handler-bind ((warning - (lambda (c) - (when (null warning) - (setq warning c) - (muffle-warning))))) - (multiple-value-bind (output warningp errorp) - (compile-file *tmp-filename*) - (when output - (delete-file output)) - (if (and (not warningp) (not errorp)) - ;; return muffled warning, which didn't count as a warning - warning)))))) - -;; Ensure we can get a style-warning about undefined functions from FOPCOMPILE. -(with-test (:name :fopcompiler-undefined-warning) - ;; Make sure some wiseacre didn't defconstant *FOO* - (assert (eq (sb-int:info :variable :kind '*foo*) :unknown)) - ;; ... or define the I-DO-NOT-EXIST function. - (assert (eq (sb-int:info :function :where-from 'i-do-not-exist) :assumed)) - (let ((w (assert-fopcompilable-and-compile-it - '(defvar *foo* (i-do-not-exist))))) - (assert (and (typep w 'sb-int:simple-style-warning) - (eql (search "undefined" - (write-to-string w :escape nil)) - 0))))) - -;; Note: This tests fails, but for a bad reason, as opposed to the wrong reason -;; (which was also bad). It used to fail because the name of the variable that it -;; used was completely removed, so it failed with "unknown variable". -;; Nobody noticed because the test got marked as failing when the variable was -;; removed. But now despite addition of a new deprecated variable, it fails -;; because it's *actually* failing, because the thing it tests got broken. -;; Ensure that FOPCOMPILE warns about deprecated variables. -(sb-int:define-deprecated-variable :late "1.1.4.9" *i-am-deprecated*) -(with-test (:name :fopcompiler-deprecated-var-warning - :fails-on :sbcl) - (assert (typep (assert-fopcompilable-and-compile-it - '(defvar *frob* (if *i-am-deprecated* 'yes 'no))) - 'sb-ext:deprecation-condition))) - -(ignore-errors (delete-file *tmp-filename*)) diff --git a/tests/fopcompiler.pure.lisp b/tests/fopcompiler.pure.lisp deleted file mode 100644 index 74ac66aea1..0000000000 --- a/tests/fopcompiler.pure.lisp +++ /dev/null @@ -1,25 +0,0 @@ -;;; Test from git rev cf65b9804d28c5e6ee2fa53cbac143c2f87f108c -;;; which wasn't fully testing what it purported to, which is that -;;; the fopcompiler signals a warning about undefined variables. -;;; (There is no way to assert that by merely placing it in a cload file) -(defvar *value-passer*) -(defun trythis (x) (setf *value-passer* x)) -(defvar *was-fopcompile-called* nil) -(sb-int:encapsulate 'sb-c::fopcompile 'test - (compile nil '(lambda (realfun &rest args) - (setf *was-fopcompile-called* t) - (apply realfun args)))) -(with-test (:name :fopcompile-undefined-var) - (with-scratch-file (fasl "fasl") - (with-scratch-file (lisp "lisp") - (with-open-file (f lisp :direction :output) - (prin1 '(trythis fopcompile-test-undef-var) f)) - (multiple-value-bind (fasl warningp errorp) - (let ((sb-c::*fopcompile* t)) - (compile-file lisp :output-file fasl)) - (sb-int:unencapsulate 'sb-c::fopcompile 'test) - (assert *was-fopcompile-called*) - (assert (and fasl warningp errorp)))) - (setf (symbol-value 'fopcompile-test-undef-var) 1) - (assert (eql (let ((*value-passer*)) (load fasl) *value-passer*) - 1)))) From 800e6e6bc061dd40cc69fde4749f876572125ee0 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 26 Apr 2022 16:46:11 -0700 Subject: [PATCH 3213/4023] Make comment match code. --- src/compiler/main.lisp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index cf161c6649..351109c1e7 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1,6 +1,4 @@ -;;;; the top level interfaces to the compiler, plus some other -;;;; compiler-related stuff (e.g. CL:CALL-ARGUMENTS-LIMIT) which -;;;; doesn't obviously belong anywhere else +;;;; the top level interfaces to the compiler ;;;; This software is part of the SBCL system. See the README file for ;;;; more information. From 18fc1d09df68f50cd1564088ef58f7471c55bd16 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 26 Apr 2022 17:01:41 -0700 Subject: [PATCH 3214/4023] Microoptimize FOP-FUNCALL and friends. The vast majority of FOP-FUNCALLs the loader will encounter will have 0 arguments. FUNCALL is a good deal faster than APPLY. --- src/code/load.lisp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index d278cf24bd..7a3c2053c3 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1031,12 +1031,14 @@ (defun fop-funcall* (argc stack) (with-fop-stack ((stack) ptr (1+ argc)) - (do ((i (+ ptr argc)) - (args)) - ((= i ptr) (apply (fop-stack-ref i) args)) - (declare (type index i)) - (push (fop-stack-ref i) args) - (decf i)))) + (if (zerop argc) + (funcall (fop-stack-ref ptr)) + (do ((i (+ ptr argc)) + (args)) + ((= i ptr) (apply (fop-stack-ref i) args)) + (declare (type index i)) + (push (fop-stack-ref i) args) + (decf i))))) (define-fop 55 (fop-funcall ((:operands n))) (fop-funcall* n (operand-stack))) From 7cec92a55fcd05ade4d93a3c87c7e0b47f6cd751 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 26 Apr 2022 23:45:34 -0700 Subject: [PATCH 3215/4023] Fix a FIXME. By pushing around the scoping of some special variables. Bonus: We cons less by not making a new hash table for every top level form, instead reusing the *SOURCE-PATHS* hash table. (I understand the intent of wanting to cons fresh objects instead of reusing them, but a new hash table for every top level form is not nothing in terms of cost.) --- src/compiler/macros.lisp | 11 ++++------- src/compiler/main.lisp | 42 ++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index 35b792f066..94beef4db3 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -603,17 +603,14 @@ (defvar *source-paths*) (defmacro with-source-paths (&body forms) - (with-unique-names (source-paths) - `(let* ((,source-paths (make-hash-table :test 'eq)) - (*source-paths* ,source-paths)) - (unwind-protect - (progn ,@forms) - (clrhash ,source-paths))))) + `(let ((*source-paths* (make-hash-table :test 'eq))) + ,@forms)) ;;; Bind the hashtables used for keeping track of global variables, ;;; functions, etc. (defmacro with-ir1-namespace (&body forms) - `(let ((*ir1-namespace* (make-ir1-namespace))) ,@forms)) + `(let ((*ir1-namespace* (make-ir1-namespace))) + ,@forms)) ;;; Look up NAME in the lexical environment namespace designated by ;;; SLOT, returning the <value, T>, or <NIL, NIL> if no entry. The diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 351109c1e7..492ba2c877 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1016,11 +1016,9 @@ necessary, since type inference may take arbitrarily long to converge.") &optional (on-error ''input-error-in-load)) &body body) (aver (symbolp form)) - (once-only ((info info)) - `(let ((*source-info* ,info)) - (%do-forms-from-info (lambda (,form &key ,@keys &allow-other-keys) - ,@body) - ,info ,on-error)))) + `(%do-forms-from-info (lambda (,form &key ,@keys &allow-other-keys) + ,@body) + ,info ,on-error)) ;;; Return the INDEX'th source form read from INFO and the position ;;; where it was read. @@ -1766,6 +1764,7 @@ necessary, since type inference may take arbitrarily long to converge.") (*compile-file-truename* nil) ; " (*policy* *policy*) (*macro-policy* *macro-policy*) + (*source-info* info) (*compilation* (make-compilation @@ -1798,26 +1797,23 @@ necessary, since type inference may take arbitrarily long to converge.") (handler-bind (((satisfies handle-condition-p) #'handle-condition-handler)) (with-compilation-values (with-compilation-unit () - (setf (sb-fasl::fasl-output-source-info *compile-object*) - (debug-source-for-info info)) - (with-ir1-namespace + (setf (sb-fasl::fasl-output-source-info *compile-object*) + (debug-source-for-info info)) + (with-ir1-namespace + (with-source-paths (do-forms-from-info ((form current-index) info 'input-error-in-compile-file) - (with-source-paths - (find-source-paths form current-index) - (let ((*gensym-counter* 0)) - (when *compile-print* - (note-top-level-form form)) - (process-toplevel-form - form `(original-source-start 0 ,current-index) nil)))) - (let ((*source-info* info)) - ;; FIXME: Use the source information from the initial - ;; conversion. CMUCL does this right. - (with-source-paths - (finish-block-compilation) - (compile-toplevel-lambdas () t)))) - (let ((code-coverage-records - (code-coverage-records (coverage-metadata *compilation*)))) + (clrhash *source-paths*) + (find-source-paths form current-index) + (let ((*gensym-counter* 0)) + (when *compile-print* + (note-top-level-form form)) + (process-toplevel-form + form `(original-source-start 0 ,current-index) nil))) + (finish-block-compilation) + (compile-toplevel-lambdas () t))) + (let ((code-coverage-records + (code-coverage-records (coverage-metadata *compilation*)))) (unless (zerop (hash-table-count code-coverage-records)) ;; Dump the code coverage records into the fasl. (sb-fasl::dump-code-coverage-records From 2ccf4835aa0b9bb3366d4efea846f0d0c507a9ce Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 26 Apr 2022 23:53:16 -0700 Subject: [PATCH 3216/4023] Revert 8dc0bab87271e2e877b28b1060b2bd73a414100c. This was a very misleading change. This does not actually allow one to block compile multiple files, and this approach can't work to actually do so. The only thing it does is essentially the equivalent of concatenating fasl files, which third party tools like ASDF can already do. None of the state variables for compilation like ir1 namespacing get shared, which is crucial for block compilation. We probably want to do multi-file block compilation through WITH-COMPILATION-UNIT, or if we are going to do the "different signature" route, we should go back to having source infos handle multiple files, like CMU CL, as that is more efficient and more general, because it actually treats multiple files as one thing to read forms out of. --- src/compiler/fndb.lisp | 11 ------ src/compiler/main.lisp | 47 ++++++------------------ tests/compile-multiple-files.impure.lisp | 45 ----------------------- tests/elfcore.test.sh | 2 +- 4 files changed, 12 insertions(+), 93 deletions(-) delete mode 100644 tests/compile-multiple-files.impure.lisp diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 5540a718f7..a50f87abcc 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -1715,17 +1715,6 @@ (:entry-points list) (:emit-cfasl t)) (values (or pathname null) boolean boolean)) -(defknown sb-c::compile-files - (cons &key (:output-file pathname-designator) - (:verbose t) - (:print t) - (:external-format external-format-designator) - (:progress t) - (:trace-file t) - (:block-compile t) - (:entry-points list) - (:emit-cfasl t)) - (values (or pathname null) boolean boolean)) (defknown (compile-file-pathname) (pathname-designator &key (:output-file (or pathname-designator diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 492ba2c877..2e6b0d9d7c 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -907,6 +907,8 @@ necessary, since type inference may take arbitrarily long to converge.") ;;; This gives the effect of rebinding around each file. ;;; which doesn't seem to be true now. Check to make sure that if ;;; such rebinding is necessary, it's still done somewhere. +;;; FIXME: We will want to have a way to process multiple files again +;;; for the sake of block compilation. (defun get-source-stream (info) (declare (type source-info info)) (or (source-info-stream info) @@ -1955,23 +1957,6 @@ returning its filename. :EMIT-CFASL (Experimental). If true, outputs the toplevel compile-time effects of this file into a separate .cfasl file." - (%compile-files (list input-file) external-format output-file-p output-file - trace-file emit-cfasl)) - -(defun compile-files - (inputs &key (output-file "" output-file-p) - ((:verbose *compile-verbose*) *compile-verbose*) - ((:print *compile-print*) *compile-print*) - (external-format :default) - ((:progress *compile-progress*) *compile-progress*) - (trace-file nil) - ((:block-compile *block-compile-argument*) *block-compile-default*) - ((:entry-points *entry-points-argument*) nil) - (emit-cfasl *emit-cfasl*)) - (%compile-files inputs external-format output-file-p output-file trace-file emit-cfasl)) - -(defun %compile-files (inputs external-format output-file-p output-file - trace-file emit-cfasl) (let* ((output-file-pathname nil) (fasl-output nil) (cfasl-pathname nil) @@ -1979,13 +1964,10 @@ returning its filename. (abort-p t) (warnings-p nil) (failure-p t) ; T in case error keeps this from being set later - (input-pathname (verify-source-file (car inputs))) - (source-infos - (mapcar (lambda (file) - (make-file-source-info (verify-source-file file) - external-format - #-sb-xc-host t)) ; can't track, no SBCL streams - inputs)) + (input-pathname (verify-source-file input-file)) + (source-info + (make-file-source-info input-pathname external-format + #-sb-xc-host t)) ; can't track, no SBCL streams (*last-message-count* (list* 0 nil nil)) (*last-error-context* nil) (*compiler-trace-output* nil)) ; might be modified below @@ -1995,8 +1977,7 @@ returning its filename. ;; To avoid passing "" as OUTPUT-FILE when unsupplied, we exploit the fact ;; that COMPILE-FILE-PATHNAME allows random &KEY args. (setq output-file-pathname - (compile-file-pathname (car inputs) - (when output-file-p :output-file) output-file) + (compile-file-pathname input-file (when output-file-p :output-file) output-file) fasl-output (open-fasl-output output-file-pathname (namestring input-pathname))) (when emit-cfasl @@ -2013,15 +1994,10 @@ returning its filename. :if-exists :supersede :direction :output)))) (let ((*compile-object* fasl-output)) - (setf abort-p nil failure-p nil) - (dolist (source-info source-infos) - (multiple-value-bind (sub-abort-p sub-warnings-p sub-failure-p) - (sub-compile-file source-info cfasl-output) - (setf abort-p (or abort-p sub-abort-p) - warnings-p (or warnings-p sub-warnings-p) - failure-p (or failure-p sub-failure-p)))))) + (setf (values abort-p warnings-p failure-p) + (sub-compile-file source-info cfasl-output)))) - (mapc #'close-source-info source-infos) + (close-source-info source-info) (when fasl-output (close-fasl-output fasl-output abort-p) @@ -2041,8 +2017,7 @@ returning its filename. (compiler-mumble "; wrote ~A~%" (namestring cfasl-pathname)))) (when *compile-verbose* - (dolist (source-info source-infos) - (print-compile-end-note source-info (not abort-p)))) + (print-compile-end-note source-info (not abort-p))) ;; Don't nuke stdout if you use :trace-file *standard-output* (when (and trace-file (not (streamp trace-file))) diff --git a/tests/compile-multiple-files.impure.lisp b/tests/compile-multiple-files.impure.lisp deleted file mode 100644 index 48be9cf9c1..0000000000 --- a/tests/compile-multiple-files.impure.lisp +++ /dev/null @@ -1,45 +0,0 @@ -(require 'sb-posix) - -(defpackage multiple-file-compile - (:use :cl :cl-user) - (:export :foo :bar)) - -(defun compile-forms-as-files (forms) - (declare (type list forms)) - (let* ((dir (pathname (concatenate 'string (scratch-file-name) "/")))) - (sb-posix:mkdir dir #b111111111) - (let ((lisps - (loop for f in forms - collect - (merge-pathnames (pathname-name (pathname (scratch-file-name "lisp"))) - dir))) - (fasl (merge-pathnames (pathname-name (pathname (scratch-file-name "fasl"))) - dir))) - (mapc #'(lambda (lisp-file form) - (with-open-file (f lisp-file :direction :output) - (prin1 form f))) - lisps forms) - (let ((res (progn - (sb-c:compile-files lisps :output-file fasl) - (load fasl) - (sb-c:compile-files lisps :output-file fasl :block-compile t) - (load fasl) - (multiple-file-compile:bar 2 3) - t))) - (mapc 'delete-file (directory (merge-pathnames "*.*" dir))) - (sb-posix:rmdir dir) - res)))) - -(with-test (:name :compile-multiple-files) - (compile-forms-as-files - `((defpackage multiple-file-compile - (:use :cl :cl-user) - (:export :foo :bar)) - (progn - (in-package :multiple-file-compile) - (defun multiple-file-compile:foo (a b) - (+ a b))) - (progn - (in-package :multiple-file-compile) - (defun multiple-file-compile:bar (a b) - (* a (multiple-file-compile:foo a b))))))) diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index 7c34dba250..eefdb4b697 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -58,7 +58,7 @@ $SBCL_PWD/../src/runtime/shrinkwrap-sbcl --disable-debugger --no-sysinit --no-us :all) ;; This just needs any function that when ELFinated has its packed fixups rewritten. ;; If the packed value is a bignum, it goes into a C data section. -(let* ((code (sb-kernel:fun-code-header #'sb-c::%compile-files)) +(let* ((code (sb-kernel:fun-code-header #'compile-file)) (fixups (sb-vm::%code-fixups code))) (assert (typep fixups 'bignum)) (assert (not (heap-allocated-p fixups)))) From 746145cb3aea3c6009b9e6f638bfc4bc73da8957 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 27 Apr 2022 00:06:40 -0700 Subject: [PATCH 3217/4023] Remove failing test that uses deprecated function. It fails because it uses a deprecated function. --- tests/x86-64-codegen.impure.lisp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 40ad131836..13b668ea67 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -635,16 +635,6 @@ ;; n-widetags divided by 4, plus jump table count word. 65))) -sb-vm::(define-vop (cl-user::test) - (:generator 0 - ;; pointless to resize to :qword, but the rule won't try to apply itself - ;; to :dword because zeroing the upper 32 bits is a visible effect. - (inst mov (reg-in-size rax-tn :qword) (reg-in-size rcx-tn :qword)) - (inst mov rax-tn rcx-tn))) -(with-test (:name :mov-mov-elim-ignore-resized-reg - :fails-on :sbcl) ; just don't crash - (checked-compile '(lambda () (sb-sys:%primitive test) 0))) - (defstruct a) (defstruct (achild (:include a))) (defstruct (agrandchild (:include achild))) From 38d920da5796c2fdb2763e1b04ab5e9c85d90fc1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 29 Apr 2022 14:42:31 -0400 Subject: [PATCH 3218/4023] Express do-instance-tagged-slot in terms of do-layout-bitmap Remove the option to scan the padding slot and/or specify a layout. --- src/code/early-raw-slots.lisp | 120 ++++++++---------------- src/code/room.lisp | 8 +- src/code/target-defstruct.lisp | 33 ------- tests/raw-slots-interleaved.impure.lisp | 4 +- 4 files changed, 46 insertions(+), 119 deletions(-) diff --git a/src/code/early-raw-slots.lisp b/src/code/early-raw-slots.lisp index d70407fa33..297ec5b074 100644 --- a/src/code/early-raw-slots.lisp +++ b/src/code/early-raw-slots.lisp @@ -187,87 +187,43 @@ (let ((,index-var (dsd-index ,dsd))) ,@body))))) -;;; PAD, if T (the default), includes a final word that may be present at the -;;; end of the structure due to alignment requirements. -;;; TYPE should be supplied only by 'editcore' for manipulating an on-disk core -;;; mapped an address that differs from the core's desired address. -;;; I have a love/hate relationship with this macro. -;;; It's more efficient than iterating over DSD-SLOTS, and editcore would -;;; have a harder time using DSD-SLOTS. But it's too complicated. #-sb-xc-host -(defmacro do-instance-tagged-slot ((index-var thing &optional (pad t) layout-expr) - &body body) - (with-unique-names (instance layout mask bitmap-index bitmap-limit nbits end) - `(let* ((,instance ,thing) - (,layout ,(or layout-expr - ;; %INSTANCE-LAYOUT is defknown'ed to return a LAYOUT, - ;; but heap walking might encounter an instance with no layout, - ;; hence the need to access the layout without assuming - ;; it to be of that type. - `(let ((l #+compact-instance-header - (%primitive %instance-layout ,instance) - #-compact-instance-header - (%instance-ref ,instance 0))) - (truly-the sb-vm:layout - (if (eql l 0) #.(find-layout 't) l))))) - ;; Shift out 1 bit if skipping bit 0 of the 0th mask word - ;; because it's not user-visible data. - (,mask (ash (%raw-instance-ref/signed-word ,layout (type-dd-length sb-vm:layout)) - (- sb-vm:instance-data-start))) - ;; Start counting from the next bitmap word as we've consumed one already - (,bitmap-index (1+ (type-dd-length sb-vm:layout))) - (,bitmap-limit (%instance-length ,layout)) - ;; If this was the last word of the bitmap, then the high bit - ;; is infinitely sign-extended, and we can keep right-shifting - ;; the mask word indefinitely. Most bitmaps will have only 1 word. - (,nbits (if (= ,bitmap-index ,bitmap-limit) - sb-vm:instance-length-mask - (- sb-vm:n-word-bits sb-vm:instance-data-start)))) - (declare (type sb-vm:signed-word ,mask) - (type fixnum ,nbits)) - (do ((,index-var sb-vm:instance-data-start (1+ ,index-var)) - (,end ,(if pad - ;; target instances have an odd number of payload words. - `(logior (%instance-length ,instance) 1) - `(%instance-length ,instance)))) - ((>= ,index-var ,end)) - (declare (type index ,index-var)) - ;; If mask was fully consumed, fetch the next bitmap word - (when (zerop ,nbits) - (setq ,mask (%raw-instance-ref/signed-word ,layout ,bitmap-index) - ,nbits (if (= (incf (truly-the index ,bitmap-index)) ,bitmap-limit) - sb-vm:instance-length-mask - sb-vm:n-word-bits))) - (when (logbitp 0 ,mask) ,@body) - (setq ,mask (ash ,mask -1) - ,nbits (truly-the fixnum (1- ,nbits))))))) +(progn +(defmacro do-layout-bitmap ((index-var taggedp-var layout count) &body guts) + `(let* ((layout ,layout) + (bitmap-word-index (bitmap-start layout)) + (bitmap-word-limit (%instance-length layout)) + ;; Shift out 1 bit if skipping bit 0 of the 0th mask word + ;; because it's not user-visible data. + (mask (ash (%raw-instance-ref/signed-word + layout (prog1 bitmap-word-index (incf bitmap-word-index))) + ,(- sb-vm:instance-data-start))) + ;; If this was the last word of the bitmap, then the high bit + ;; is infinitely sign-extended, and we can keep right-shifting + ;; the mask word indefinitely. Most bitmaps will have only 1 word. + (nbits (if (= bitmap-word-index bitmap-word-limit) + ,sb-vm:instance-length-mask + ,(- sb-vm:n-word-bits sb-vm:instance-data-start)))) + (declare (type sb-vm:signed-word mask) + (type fixnum nbits)) + (do ((,index-var sb-vm:instance-data-start (1+ ,index-var)) + (end ,count)) + ((>= ,index-var end)) + (declare (type (unsigned-byte 14) ,index-var end)) + ;; If mask was fully consumed, fetch the next bitmap word + (when (zerop nbits) + (setq mask (%raw-instance-ref/signed-word layout bitmap-word-index) + nbits (if (= (incf (truly-the index bitmap-word-index)) + bitmap-word-limit) + ,sb-vm:instance-length-mask + ,sb-vm:n-word-bits))) + (let ((,taggedp-var (logbitp 0 mask))) ,@guts) + (setq mask (ash mask -1) + nbits (truly-the fixnum (1- nbits)))))) -;;; FIXME: at the earliest opportunity, either express DO-INSTANCE-TAGGED-SLOT -;;; in terms of DO-LAYOUT-BITMAP or apply this diff: -#| ---- a/src/code/early-raw-slots.lisp -+++ b/src/code/early-raw-slots.lisp -@@ -194,6 +194,7 @@ - ;;; I have a love/hate relationship with this macro. - ;;; It's more efficient than iterating over DSD-SLOTS, and editcore would - ;;; have a harder time using DSD-SLOTS. But it's too complicated. - #-sb-xc-host - (defmacro do-instance-tagged-slot ((index-var thing &optional (pad t) layout-expr) - &body body) -@@ -210,12 +211,12 @@ - (%instance-ref ,instance 0))) - (truly-the sb-vm:layout - (if (eql l 0) #.(find-layout 't) l))))) -+ (,bitmap-index (bitmap-start ,layout)) - ;; Shift out 1 bit if skipping bit 0 of the 0th mask word - ;; because it's not user-visible data. -- (,mask (ash (%raw-instance-ref/signed-word ,layout (type-dd-length sb-vm:layout)) -+ (,mask (ash (%raw-instance-ref/signed-word -+ ,layout (prog1 ,bitmap-index (incf ,bitmap-index))) - (- sb-vm:instance-data-start))) -- ;; Start counting from the next bitmap word as we've consumed one already -- (,bitmap-index (1+ (type-dd-length sb-vm:layout))) - (,bitmap-limit (%instance-length ,layout)) - ;; If this was the last word of the bitmap, then the high bit - ;; is infinitely sign-extended, and we can keep right-shifting -|# +(defmacro do-instance-tagged-slot ((index-var thing) &body body) + (with-unique-names (instance layout taggedp) + `(let* ((,instance ,thing) + (,layout (%instance-layout ,instance))) + (do-layout-bitmap (,index-var ,taggedp ,layout (%instance-length ,instance)) + (when ,taggedp ,@body)))))) diff --git a/src/code/room.lisp b/src/code/room.lisp index cbd41aa631..07b740b86d 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -913,9 +913,13 @@ We could try a few things to mitigate this: ;; These two are in fact generally the most frequently occurring type. ,.(make-case 'cons `(car ,obj) `(cdr ,obj)) ,.(make-case* 'instance - `(progn + ;; %INSTANCE-LAYOUT is defknown'ed to return a LAYOUT, + ;; but heap walking might encounter an instance with no layout, + ;; hence the need to access the slot opaquely. + `(unless (eql 0 #+compact-instance-header (%primitive %instance-layout ,obj) + #-compact-instance-header (%instance-ref ,obj 0)) (,functoid (%instance-layout ,obj) ,@more) - (do-instance-tagged-slot (.i. ,obj nil) + (do-instance-tagged-slot (.i. ,obj) (,functoid (%instance-ref ,obj .i.) ,@more)))) (function (typecase ,obj diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index f076868f92..0b0176961d 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -317,39 +317,6 @@ (funcall fun classoid))) t) -;;; Similar to DO-INSTANCE-TAGGED-SLOT but iterating over all words. -(defmacro do-layout-bitmap ((index-var taggedp-var layout count) &body guts) - `(let* ((layout ,layout) - (bitmap-word-index (bitmap-start layout)) - (bitmap-word-limit (%instance-length layout)) - ;; Shift out 1 bit if skipping bit 0 of the 0th mask word - ;; because it's not user-visible data. - (mask (ash (%raw-instance-ref/signed-word - layout (prog1 bitmap-word-index (incf bitmap-word-index))) - ,(- sb-vm:instance-data-start))) - ;; If this was the last word of the bitmap, then the high bit - ;; is infinitely sign-extended, and we can keep right-shifting - ;; the mask word indefinitely. Most bitmaps will have only 1 word. - (nbits (if (= bitmap-word-index bitmap-word-limit) - ,sb-vm:instance-length-mask - ,(- sb-vm:n-word-bits sb-vm:instance-data-start)))) - (declare (type sb-vm:signed-word mask) - (type fixnum nbits)) - (do ((,index-var sb-vm:instance-data-start (1+ ,index-var)) - (end ,count)) - ((>= ,index-var end)) - (declare (type (unsigned-byte 14) ,index-var end)) - ;; If mask was fully consumed, fetch the next bitmap word - (when (zerop nbits) - (setq mask (%raw-instance-ref/signed-word layout bitmap-word-index) - nbits (if (= (incf (truly-the index bitmap-word-index)) - bitmap-word-limit) - ,sb-vm:instance-length-mask - ,sb-vm:n-word-bits))) - (let ((,taggedp-var (logbitp 0 mask))) ,@guts) - (setq mask (ash mask -1) - nbits (truly-the fixnum (1- nbits)))))) - ;;; Copy any old kind of structure. (defun copy-structure (structure) "Return a copy of STRUCTURE with the same (EQL) slot values." diff --git a/tests/raw-slots-interleaved.impure.lisp b/tests/raw-slots-interleaved.impure.lisp index f2e1de31c6..a6289e5149 100644 --- a/tests/raw-slots-interleaved.impure.lisp +++ b/tests/raw-slots-interleaved.impure.lisp @@ -118,8 +118,8 @@ (sb-kernel:do-instance-tagged-slot (i *afoo*) (push `(,i ,(sb-kernel:%instance-ref *afoo* i)) l)) (assert (equalp (nreverse l) - #-64-bit `((3 aaay) (9 bee) (13 cee) (14 #xdead)) - #+64-bit `((2 aaay) (6 bee) (9 cee) (10 #xdead)))))) + #-64-bit `((3 aaay) (9 bee) (13 cee)) + #+64-bit `((2 aaay) (6 bee) (9 cee)))))) (defvar *anotherfoo* (make-foo1)) From 15985aeae9d698b2fa0114e7dbc811146401d0b8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 03:22:51 -0400 Subject: [PATCH 3219/4023] Use FILLER_WIDETAG in dynamic space instead of code blobs as filler (like in immobile space) --- src/runtime/fullcgc.c | 47 ++++++++++++++----------------------------- src/runtime/gencgc.c | 2 +- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 820b580aaf..1659cfceae 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -571,46 +571,29 @@ static uword_t sweep(lispobj* where, lispobj* end, uword_t arg) { long *zeroed = (long*)arg; // one count per generation sword_t nwords; + extern void deposit_filler(uword_t addr, sword_t nbytes); - // TODO: consecutive dead objects on same page should be merged. for ( ; where < end ; where += nwords ) { lispobj word = *where; + int livep = 0; if (is_header(word)) { nwords = sizetab[header_widetag(word)](where); lispobj markbit = general_widetag_to_markbit(header_widetag(word)); - if (word & markbit) - *where = word ^ markbit; - else { - // Turn the object into either a (0 . 0) cons - // or an unboxed filler depending on size. - if (nwords <= 2) // could be SAP, SIMPLE-ARRAY-NIL, 1-word bignum, etc - goto cons; - struct code* code = (struct code*)where; - // Keep in sync with the definition of filler_obj_p() - if (!filler_obj_p((lispobj*)code)) { - page_index_t page = find_page_index(where); - int gen = page >= 0 ? page_table[page].gen - : immobile_obj_gen_bits(where); - NOTE_GARBAGE(gen, where, nwords, zeroed, { - code->boxed_size = 0; - code->header = (nwords << CODE_HEADER_SIZE_SHIFT) - | CODE_HEADER_WIDETAG; - /* This memset() is needed for strictly boxed pages, - * but probably not for other page types. No big deal. - * fullcgc isn't really used much */ - memset(where+2, 0, (nwords - 2) * N_WORD_BYTES); - }) - } - } + if (word & markbit) livep = 1, *where = word ^ markbit; } else { nwords = 2; - if (!cons_markedp((lispobj)where)) { - if (where[0] | where[1]) { - cons: - gc_dcheck(!immobile_space_p((lispobj)where)); - NOTE_GARBAGE(page_table[find_page_index(where)].gen, - where, 2, zeroed, - where[0] = where[1] = 0); + livep = cons_markedp((lispobj)where); + } + if (!livep) { + if (find_page_index(where)>=0) // dynamic space + deposit_filler((uword_t)where, nwords<<WORD_SHIFT); + else { // immobile space + struct code* code = (struct code*)where; + if (!filler_obj_p((lispobj*)code)) { + code->boxed_size = 0; + code->header = (nwords << CODE_HEADER_SIZE_SHIFT) + | CODE_HEADER_WIDETAG; + memset(where+2, 0, (nwords - 2) * N_WORD_BYTES); } } } diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 0a69d786a8..ce0440c653 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2205,7 +2205,7 @@ void visit_freed_objects(char __attribute__((unused)) *start, #endif } -static void deposit_filler(uword_t addr, sword_t nbytes) { +void deposit_filler(uword_t addr, sword_t nbytes) { if (!nbytes) return; gc_assert(nbytes > 0); sword_t nwords = nbytes >> WORD_SHIFT; From 7468417cc1969b40f260137901f1c08bc212089e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 10:04:43 -0400 Subject: [PATCH 3220/4023] Make fcb-threads more reliable on more platforms This test had a tendency to prevent the non-GC worker threads from running, and/or cause heap exhaustion. Sometimes it would report thousands of GCs instead of the expected couple of dozen or so. And ironically, tests that hammer on GC rather than let it auto-trigger can cause garbage to promote from gen0 to gen1 on each cycle filling up gen1 by accident. The auto-trigger isn't able to compensate for this unusual use-case by triggering in time. --- tests/fcb-threads.impure.lisp | 5 ++++- tests/fin-threadsafety.pure.lisp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 93e849ff65..110beb14b8 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -17,6 +17,9 @@ #+(or (not sb-thread) freebsd) (sb-ext:exit :code 104) +(setf (generation-number-of-gcs-before-promotion 0) 5) +(setf (generation-number-of-gcs-before-promotion 1) 3) + #+win32 (with-scratch-file (solib "dll") (sb-ext:run-program "gcc" @@ -110,7 +113,7 @@ (loop (gc) (incf *n-gcs*) - (sleep .0001) + (sleep .0005) (sb-thread:barrier (:read)) (if (not *keepon*) (return))))))) (start (get-internal-real-time))) diff --git a/tests/fin-threadsafety.pure.lisp b/tests/fin-threadsafety.pure.lisp index 52ce11e4d6..88c32249b3 100644 --- a/tests/fin-threadsafety.pure.lisp +++ b/tests/fin-threadsafety.pure.lisp @@ -37,7 +37,7 @@ (let ((fun (sb-kernel:%make-funcallable-instance 0)) (stop nil) (condition nil)) - ;; If the %FUN-LLAYOUT were unset or its bitmap were 0, then the + ;; If the %FUN-LAYOUT were unset or its bitmap were 0, then the ;; %FUNCALLABLE-INSTANCE-FUN slot would not be visited in GC because ;; it assumes the instance is wholly empty in that case. ;; It doesn't matter too much what the layout is, but it has to be something From 633b06ba9b502b25642bca122cde6a453e908854 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 30 Apr 2022 17:17:07 +0300 Subject: [PATCH 3221/4023] Now there can be multiple top-level lambdas in a single component. Even without block compilation. --- src/compiler/debug-dump.lisp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/debug-dump.lisp b/src/compiler/debug-dump.lisp index 321a1dd874..09da2be6a2 100644 --- a/src/compiler/debug-dump.lisp +++ b/src/compiler/debug-dump.lisp @@ -794,11 +794,9 @@ (cond ((not component-tlf-num) (setf component-tlf-num tlf-num)) ((= component-tlf-num tlf-num)) - ((block-compile *compilation*) - (setf component-tlf-num :multiple) - (return)) (t - (bug "tlf-num mismatch")))))) + (setf component-tlf-num :multiple) + (return)))))) (dolist (lambda (component-lambdas component)) (unless (empty-fun-p lambda) (clrhash var-locs) From 0ece86aa87ce81eea31b8fd9c721261681842b3a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 10:59:07 -0400 Subject: [PATCH 3222/4023] Heap walk safely around */signed vop result In general any cons with most-positive-word in the car. I do like the idea of using -1 because it is unambiguously a filler where (0 . 0) is possibly a real cons. --- src/code/room.lisp | 31 ++++++++++++++++--------- tests/heapwalk.impure.lisp | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 tests/heapwalk.impure.lisp diff --git a/src/code/room.lisp b/src/code/room.lisp index 07b740b86d..f2a357cef6 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -45,6 +45,7 @@ complex-array-widetag)) (setf (svref infos code) info))) + ;; FIXME: do we still need this ? (setf (svref infos filler-widetag) (make-room-info 'filler)) (dotimes (i (length *specialized-array-element-type-properties*)) @@ -189,21 +190,31 @@ (end (descriptor-sap end))) (loop (if (sap>= start end) (return)) - (binding* ((widetag (widetag@baseptr start)) - (obj (lispobj@baseptr start widetag)) - ((typecode size) + (let ((word (sap-ref-word start 0))) + (cond + ((= (logand word widetag-mask) filler-widetag) ; pseudo-object + (let ((size (+ (* (ash word -8) n-word-bytes) n-word-bytes))) + (setq start (sap+ start size)))) + ((= word most-positive-word) + ;; has to be a pseudo-cons resulting from removing an insignificant + ;; sign word of a bignum. Don't call FUN + (setq start (sap+ start (* 2 n-word-bytes)))) + (t + (binding* + ((widetag (widetag@baseptr start)) + (obj (lispobj@baseptr start widetag)) + ((typecode size) ;; PRIMITIVE-OBJECT-SIZE works on conses, but they're exceptions already ;; because of absence of a widetag, so may as well not call the sizer. (if (listp obj) (values list-pointer-lowtag (* 2 n-word-bytes)) (values widetag (primitive-object-size obj))))) - ;; SIZE is surely a fixnum. Non-fixnum would imply at least - ;; a 512MB object if 32-bit words, and is inconceivable if 64-bit. - ;; But check to be sure. - (aver (not (logtest (the fixnum size) lowtag-mask))) - (unless (= typecode filler-widetag) - (funcall fun obj typecode size)) - (setq start (sap+ start size)))) + ;; SIZE is surely a fixnum. Non-fixnum would imply at least + ;; a 512MB object if 32-bit words, and is inconceivable if 64-bit. + ;; But check to be sure. + (aver (not (logtest (the fixnum size) lowtag-mask))) + (funcall fun obj typecode size) + (setq start (sap+ start size))))))) (when strict-bound ;; If START is not eq to END, then we have blown past our endpoint. #+sb-devel diff --git a/tests/heapwalk.impure.lisp b/tests/heapwalk.impure.lisp new file mode 100644 index 0000000000..eee2c679ee --- /dev/null +++ b/tests/heapwalk.impure.lisp @@ -0,0 +1,46 @@ + +(defun mul (x y) (declare (sb-vm:signed-word x y)) (* x y)) +(compile 'mul) + +(defun manymul (n &aux res) + (dotimes (i n res) + (setq res (mul -4706957933656302 (+ i 1000))))) +(compile 'manymul) + +(defun walk () + (let ((v (make-array 1000)) + (ct 0)) + (sb-vm:map-allocated-objects + (lambda (obj type size) + (declare (ignore size)) + (when (and (= type sb-vm:list-pointer-lowtag) + (= (sb-kernel:generation-of obj) 0) + (< ct 1000)) + (setf (aref v ct) obj) + (incf ct))) + :dynamic) + (let ((*print-level* 2) + (*print-length* 4)) + (dotimes (i ct) + (princ (aref v i)))))) +(compile 'walk) + +;;; As a precondition to asserting that heap walking did not +;;; visit an alleged cons that is a filler object, +;;; assert that there is the telltale pattern (if applicable). +#+(or arm64 x86-64) +(let ((product (manymul 1))) + (sb-sys:with-pinned-objects (product) + (let ((word (sb-sys:sap-ref-word + (sb-sys:int-sap (sb-kernel:get-lisp-obj-address product)) + (- (ash 2 sb-vm:word-shift) sb-vm:other-pointer-lowtag)))) + (assert (= word sb-ext:most-positive-word))))) + +(manymul 100) + +;;; Granted it's not a great idea to assume that anything in the heap +;;; can be printed, but this test was a fairly easy way to get +;;; "Unhandled memory fault at #xFFFFFFFFFFFFFFF0." +;;; The should print approximately one cons (for GC epoch) +(with-test (:name :heapwalk-safety) + (progn (gc :gen 1) (manymul 100) (walk))) From 47b7c77f3ed8dd415a0917b4a2ac4fc41763b092 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 11:17:21 -0400 Subject: [PATCH 3223/4023] Make private-cons page generation a manifest constant and choose 6 instead of 0 --- src/runtime/private-cons.inc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/runtime/private-cons.inc b/src/runtime/private-cons.inc index f5ce120a45..4c41021d74 100644 --- a/src/runtime/private-cons.inc +++ b/src/runtime/private-cons.inc @@ -62,6 +62,7 @@ static void release_pages_impl() #else static page_index_t private_cons_page_chain = -1; +#define GC_PRIVATE_CONS_GENERATION 6 static struct cons* private_cons_impl() { @@ -75,7 +76,8 @@ static struct cons* private_cons_impl() page = alloc_start_page(PAGE_TYPE_UNBOXED, 0); page_index_t last_page __attribute__((unused)) = gc_find_freeish_pages(&page, GENCGC_PAGE_BYTES, - SINGLE_OBJECT_FLAG | PAGE_TYPE_UNBOXED, 0); + SINGLE_OBJECT_FLAG | PAGE_TYPE_UNBOXED, + GC_PRIVATE_CONS_GENERATION); // See question about last_page in gc_alloc_large set_alloc_start_page(PAGE_TYPE_UNBOXED, 0, page); @@ -84,7 +86,7 @@ static struct cons* private_cons_impl() fprintf(stderr, "GC-private page @ %p\n", page_header); gc_assert(last_page == page); gc_dcheck(page_cards_all_marked_nonsticky(page)); - page_table[page].gen = 0; + page_table[page].gen = GC_PRIVATE_CONS_GENERATION; page_table[page].type = PAGE_TYPE_UNBOXED; zero_dirty_pages(page, page, 0); page_index_t tail = private_cons_page_chain; From 5a7e8d9ba74bef2f80081e8a15a495d7abc44446 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 11:34:28 -0400 Subject: [PATCH 3224/4023] Improve write_generation_stats again * Anticipate the division of generation 0 into two kinds of pages- those allocated by threads and those allocated by the collector. The latter are ok to scan from Lisp because the collector updates page_bytes_used() whenever it runs, whereas TLAB pages have some concurrency problems that are not easily resolved. (Hence the occasional crash in sb-sprof trying to find a code blob) Also, we can more easily implement different policies on whether to pre-zero generation 0 for the mutators versus collector. * Allow for writing to a stdio stream or a file descriptor or both, so this can be called from Lisp. Avoiding stdio streams in the collector is preferable because we've seen many reports that enabling GC logging may cause lockup. I've found snprintf() and write() to be more reliable in that regard even though the entire printf() family is absent from https://man7.org/linux/man-pages/man7/signal-safety.7.html --- src/runtime/fullcgc.c | 4 +- src/runtime/gencgc-internal.h | 1 + src/runtime/gencgc.c | 89 ++++++++++++++++++++++++++++------- 3 files changed, 75 insertions(+), 19 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 1659cfceae..2fad9cb4f7 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -567,9 +567,9 @@ static void sweep_fixedobj_pages(long *zeroed) } #endif -static uword_t sweep(lispobj* where, lispobj* end, uword_t arg) +static uword_t sweep(lispobj* where, lispobj* end, + __attribute__((unused)) uword_t arg) { - long *zeroed = (long*)arg; // one count per generation sword_t nwords; extern void deposit_filler(uword_t addr, sword_t nbytes); diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index bf2a197c57..4683fcf80a 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -80,6 +80,7 @@ int gencgc_handle_wp_violation(void *); #define PAGE_TYPE_SMALL_MIXED 4 // #b100 #define PAGE_TYPE_CONS 5 // #b101 #define PAGE_TYPE_CODE 7 // #b111 +#define THREAD_PAGE_FLAG 8 #define SINGLE_OBJECT_FLAG 16 #define OPEN_REGION_PAGE_FLAG 32 #define FREE_PAGE_FLAG 0 diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index ce0440c653..0dded15ab6 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -423,8 +423,8 @@ extern void fpu_restore(void *); #define PAGE_INDEX_FMT PRIdPTR -extern void -write_generation_stats(FILE *file) +// You can call this with 0 and NULL to perform its assertions silently +void gc_gen_report_to_file(int filedes, FILE *file) { #ifdef LISP_FEATURE_X86 int fpu_state[27]; @@ -434,10 +434,14 @@ write_generation_stats(FILE *file) fpu_save(fpu_state); #endif +#define OUTPUT(str, len) \ + {if (file) fwrite(str, 1, len, file); if (filedes>=0) write(filedes, str, len);} + /* Print the heap stats. */ - fprintf(file, - "Gen Boxed Cons Raw Code SmMix Mixed LgRaw LgCode LgMix" - " Waste%% Alloc Trig Dirty GCs Mem-age\n"); + char header[] = + " Gen Boxed Cons Raw Code SmMix Mixed LgRaw LgCode LgMix" + " Waste% Alloc Trig Dirty GCs Mem-age\n"; + OUTPUT(header, sizeof header-1); generation_index_t gen_num, begin, end; // Print from the lowest gen that has any allocated pages. @@ -447,15 +451,51 @@ write_generation_stats(FILE *file) for (end = SCRATCH_GENERATION; end >= 0; --end) if (generations[end].bytes_allocated) break; + char linebuf[144]; page_index_t coltot[9]; + uword_t eden_words_allocated = 0; + page_index_t eden_pages = 0; memset(coltot, 0, sizeof coltot); for (gen_num = begin; gen_num <= end; gen_num++) { page_index_t page; page_index_t pagect[9]; memset(pagect, 0, sizeof pagect); + if (gen_num == 0) { // Count the eden pages + for (page = 0; page < next_free_page; page++) + if (page_table[page].gen == 0 && page_table[page].type & THREAD_PAGE_FLAG) { + int column; + switch (page_table[page].type & ~THREAD_PAGE_FLAG) { + case PAGE_TYPE_BOXED: column = 0; break; + case PAGE_TYPE_CONS: column = 1; break; + case PAGE_TYPE_CODE: column = 3; break; + case PAGE_TYPE_MIXED: column = 5; break; + default: lose("Bad eden page subtype: %x\n", page_table[page].type); + } + pagect[column]++; + coltot[column]++; + ++eden_pages; + eden_words_allocated += page_words_used(page); + } + uword_t waste = npage_bytes(eden_pages) - (eden_words_allocated<<WORD_SHIFT); + double pct_waste = eden_pages > 0 ? + (double)waste / (double)npage_bytes(eden_pages) * 100 : 0.0; + if (eden_pages) { + int linelen = snprintf(linebuf, sizeof linebuf, + " E %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%14"PAGE_INDEX_FMT + "%14"PAGE_INDEX_FMT + "%28.1f %11"OS_VM_SIZE_FMT"\n", + pagect[0], pagect[1], pagect[3], pagect[5], + pct_waste, eden_words_allocated<<WORD_SHIFT); + OUTPUT(linebuf, linelen); + } + memset(pagect, 0, sizeof pagect); + } + uword_t words_allocated = 0; + page_index_t tot_pages = 0; for (page = 0; page < next_free_page; page++) - if (!page_free_p(page) && page_table[page].gen == gen_num) { + if (!page_free_p(page) && page_table[page].gen == gen_num + && !(page_table[page].type & THREAD_PAGE_FLAG)) { int column; switch (page_table[page].type & (SINGLE_OBJECT_FLAG|PAGE_TYPE_MASK)) { case PAGE_TYPE_BOXED: column = 0; break; @@ -471,45 +511,60 @@ write_generation_stats(FILE *file) } pagect[column]++; coltot[column]++; + ++tot_pages; + words_allocated += page_words_used(page); } struct generation* gen = &generations[gen_num]; - gc_assert(gen->bytes_allocated == count_generation_bytes_allocated(gen_num)); - page_index_t tot_pages, n_dirty; - tot_pages = count_generation_pages(gen_num, &n_dirty); - uword_t waste = npage_bytes(tot_pages) - generations[gen_num].bytes_allocated; + if (gen_num == 0) + gc_assert(gen->bytes_allocated == + (words_allocated+eden_words_allocated) << WORD_SHIFT); + else { + gc_assert(gen->bytes_allocated == words_allocated << WORD_SHIFT); + } + page_index_t n_dirty; + count_generation_pages(gen_num, &n_dirty); + uword_t waste = npage_bytes(tot_pages) - (words_allocated<<WORD_SHIFT); double pct_waste = tot_pages > 0 ? (double)waste / (double)npage_bytes(tot_pages) * 100 : 0.0; - fprintf(file, - " %d %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT + int linelen = + snprintf(linebuf, sizeof linebuf, + " %d %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT" %6.1f %11"OS_VM_SIZE_FMT" %11"OS_VM_SIZE_FMT, gen_num, pagect[0], pagect[1], pagect[2], pagect[3], pagect[4], pagect[5], pagect[6], pagect[7], pagect[8], - pct_waste, (uintptr_t)gen->bytes_allocated, + pct_waste, words_allocated<<WORD_SHIFT, (uintptr_t)gen->gc_trigger); // gen0 pages are never WPed - fprintf(file, gen_num==0?" -" : " %7"PAGE_INDEX_FMT, n_dirty); - fprintf(file, " %3d %7.4f\n", gen->num_gc, generation_average_age(gen_num)); + linelen += snprintf(linebuf+linelen, sizeof linebuf-linelen, + gen_num==0?" -" : " %7"PAGE_INDEX_FMT, n_dirty); + linelen += snprintf(linebuf+linelen, sizeof linebuf-linelen, + " %3d %7.4f\n", gen->num_gc, generation_average_age(gen_num)); + OUTPUT(linebuf, linelen); } page_index_t tot_pages = coltot[0] + coltot[1] + coltot[2] + coltot[3] + coltot[4] + coltot[5] + coltot[6] + coltot[7] + coltot[8]; uword_t waste = npage_bytes(tot_pages) - bytes_allocated; double pct_waste = (double)waste / (double)npage_bytes(tot_pages) * 100; double heap_use_frac = 100 * (double)bytes_allocated / (double)dynamic_space_size; - fprintf(file, - "-- %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT + int linelen = + snprintf(linebuf, sizeof linebuf, + "Tot %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT" %6.1f%12"OS_VM_SIZE_FMT " [%.1f%% of %"OS_VM_SIZE_FMT" max]\n", coltot[0], coltot[1], coltot[2], coltot[3], coltot[4], coltot[5], coltot[6], coltot[7], coltot[8], pct_waste, (uintptr_t)bytes_allocated, heap_use_frac, (uintptr_t)dynamic_space_size); + OUTPUT(linebuf, linelen); +#undef OUTPUT #ifdef LISP_FEATURE_X86 fpu_restore(fpu_state); #endif } +void write_generation_stats(FILE *file) { gc_gen_report_to_file(-1, file); } extern void write_heap_exhaustion_report(FILE *file, long available, long requested, From c61cae4bb9a44f64a605fb6a9920f7ca197ce672 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 12:15:22 -0400 Subject: [PATCH 3225/4023] Macroize something When I tried implementing non-prezeroed unboxed pages, the first things to break were hash-tables because I totally failed to remove the assumption of 0-fill in the array allocator. The hash-table code is correct as-is, but might as well keep the checker as an amulet to ward off evil. --- src/code/target-hash-table.lisp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 715355f4a1..dd575cf3fd 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -486,6 +486,20 @@ Examples: test test-fun hash-fun size rehash-size rehash-threshold)))) +(defmacro make-index-vector (n) + `(let ((a (make-array ,n :element-type 'hash-table-index + :initial-element 0))) + a)) + +(defun validate-index-vector (tbl reason) + (let* ((iv (hash-table-index-vector tbl)) + (pairs (hash-table-pairs tbl)) + (npairs (length pairs))) + (dovector (indexval iv) + (when (> (* 2 indexval) npairs) + (bug "~a: Busted index vector on ~S, pairlen=~d 2*index=~d" + reason tbl npairs (* 2 indexval)))))) + (defun %make-hash-table (flags test test-fun hash-fun size rehash-size rehash-threshold) (binding* ( ;; KLUDGE: The most natural way of expressing the below is @@ -511,8 +525,7 @@ Examples: (if defaultp #.(sb-xc:make-array 2 :element-type '(unsigned-byte 32) :initial-element 0) - (make-array bucket-count :element-type 'hash-table-index - :initial-element 0))) + (make-index-vector bucket-count))) (kv-vector (if defaultp #(0 0 nil) (%alloc-kv-pairs size))) ;; Needs to be the half the length of the KV vector to link ;; KV entries - mapped to indices at 2i and 2i+1 - @@ -672,9 +685,7 @@ multiple threads accessing the same hash-table without locking." pow2ceil)) ;; These vector lengths are exactly analogous to those in MAKE-HASH-TABLE, ;; prompting the question of whether we can share some code. - (new-index-vector (make-array new-n-buckets - :element-type 'hash-table-index - :initial-element 0)) + (new-index-vector (make-index-vector new-n-buckets)) (new-kv-vector (%alloc-kv-pairs new-size)) (new-next-vector (make-array (1+ new-size) :element-type 'hash-table-index ;; for robustness testing, as explained in %MAKE-HASH-TABLE @@ -894,8 +905,7 @@ multiple threads accessing the same hash-table without locking." (let* ((size (shiftf (hash-table-cache table) 0)) (scaled-size (truncate (/ (float size) (hash-table-rehash-threshold table)))) (bucket-count (power-of-two-ceiling (max scaled-size +min-hash-table-size+))) - (index-vector (make-array bucket-count :element-type 'hash-table-index - :initial-element 0)) + (index-vector (make-index-vector bucket-count)) (kv-vector (%alloc-kv-pairs size)) (next-vector (make-array (1+ size) :element-type 'hash-table-index #+sb-devel :initial-element #+sb-devel bad-next-value)) From 9f926c257fe39ef0613be77f4aff30f071655873 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 30 Apr 2022 20:35:35 +0300 Subject: [PATCH 3226/4023] Make a test 32-bit compatible. --- tests/heapwalk.impure.lisp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/heapwalk.impure.lisp b/tests/heapwalk.impure.lisp index eee2c679ee..7497cde320 100644 --- a/tests/heapwalk.impure.lisp +++ b/tests/heapwalk.impure.lisp @@ -4,7 +4,8 @@ (defun manymul (n &aux res) (dotimes (i n res) - (setq res (mul -4706957933656302 (+ i 1000))))) + (setq res (mul (floor (- (expt 2 (- sb-vm:n-word-bits 2))) 1000) + (+ i 1000))))) (compile 'manymul) (defun walk () @@ -20,7 +21,8 @@ (incf ct))) :dynamic) (let ((*print-level* 2) - (*print-length* 4)) + (*print-length* 4) + (*standard-output* (make-broadcast-stream))) (dotimes (i ct) (princ (aref v i)))))) (compile 'walk) From f2950a0ede87f937895d27234f7adf737ad073f0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 13:47:10 -0400 Subject: [PATCH 3227/4023] arm64: Enable traceroot test --- tests/traceroot.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/traceroot.impure.lisp b/tests/traceroot.impure.lisp index d492aa3579..2f0b974cbb 100644 --- a/tests/traceroot.impure.lisp +++ b/tests/traceroot.impure.lisp @@ -16,7 +16,7 @@ ;;;; It's just that sometimes we get :PINNED as a root instead of ;;;; the expected reference to the one and only thread. ;;;; And also sb-safepoint gets a crash in C. -#-(and gencgc sb-thread (not sb-safepoint) (or ppc64 x86-64)) (sb-ext:exit :code 104) +#-(and gencgc sb-thread (not sb-safepoint) (or arm64 ppc64 x86-64)) (sb-ext:exit :code 104) (setq sb-ext:*evaluator-mode* :compile) (defvar *fred*) From b6956ec887771b5e8990319f52df28a0767b2278 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 13:52:35 -0400 Subject: [PATCH 3228/4023] Never realize FILLER_WIDETAG as a lisp object --- src/code/print.lisp | 1 + src/code/room.lisp | 4 ---- src/compiler/generic/late-objdef.lisp | 1 + src/runtime/gc-private.h | 15 +++++++++++++++ src/runtime/gencgc.c | 14 -------------- src/runtime/traceroot.c | 1 + src/runtime/verify.inc | 4 ++++ tests/gc-testlib.c | 9 +++++++++ 8 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/code/print.lisp b/src/code/print.lisp index ee58269013..b0847567c2 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -2055,6 +2055,7 @@ variable: an unreadable object representing the error is printed instead.") (#.sb-vm:value-cell-widetag (write-string "value cell " stream) (output-object (value-cell-ref object) stream)) + #+nil (#.sb-vm:filler-widetag (write-string "pad " stream) (write (1+ (get-header-data object)) :stream stream) diff --git a/src/code/room.lisp b/src/code/room.lisp index f2a357cef6..91037cec8e 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -45,9 +45,6 @@ complex-array-widetag)) (setf (svref infos code) info))) - ;; FIXME: do we still need this ? - (setf (svref infos filler-widetag) (make-room-info 'filler)) - (dotimes (i (length *specialized-array-element-type-properties*)) (let ((saetp (aref *specialized-array-element-type-properties* i))) (setf (svref infos (saetp-typecode saetp)) saetp))) @@ -1051,7 +1048,6 @@ We could try a few things to mitigate this: (case (widetag-of this) (#.value-cell-widetag (test (value-cell-ref this))) - (#.filler-widetag) (t (bug "Unknown object type #x~x addr=~x" (widetag-of this) diff --git a/src/compiler/generic/late-objdef.lisp b/src/compiler/generic/late-objdef.lisp index 27dfece1c0..4060c6bd54 100644 --- a/src/compiler/generic/late-objdef.lisp +++ b/src/compiler/generic/late-objdef.lisp @@ -183,6 +183,7 @@ static inline lispobj compute_lispobj(lispobj* base_addr) { (+ #x80 (case widetag (#.instance-widetag instance-pointer-lowtag) (#.+function-widetags+ fun-pointer-lowtag) + (#.filler-widetag 0) (t other-pointer-lowtag))))))) (format stream "unsigned char widetag_lowtag[256] = {") (dotimes (line 16) diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index 7e1036d318..2de95f3db5 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -549,4 +549,19 @@ struct slab_header { static const int CONS_PAGE_USABLE_BYTES = MAX_CONSES_PER_PAGE*CONS_SIZE*N_WORD_BYTES; #endif +#include "genesis/cons.h" +/* Return true if 'addr' has a lowtag and widetag that correspond, + * given that the words at 'addr' are within range for an allocated page. + * 'addr' could be a pointer to random data, and this check is merely + * a heuristic. False positives are possible. */ +static inline boolean plausible_tag_p(lispobj addr) +{ + if (listp(addr)) + return is_cons_half(CONS(addr)->car) + && is_cons_half(CONS(addr)->cdr); + unsigned char widetag = widetag_of(native_pointer(addr)); + return other_immediate_lowtag_p(widetag) + && lowtag_of(addr) == LOWTAG_FOR_WIDETAG(widetag); +} + #endif /* _GC_PRIVATE_H_ */ diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 0dded15ab6..3f983f284e 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1822,20 +1822,6 @@ lispobj *search_dynamic_space(void *pointer) return gc_search_space(start, pointer); } -/* Return true if 'addr' has a lowtag and widetag that correspond, - * given that the words at 'addr' are within range for an allocated page. - * 'addr' could be a pointer to random data, and this check is merely - * a heuristic. False positives are possible. */ -static inline boolean plausible_tag_p(lispobj addr) -{ - if (listp(addr)) - return is_cons_half(CONS(addr)->car) - && is_cons_half(CONS(addr)->cdr); - unsigned char widetag = widetag_of(native_pointer(addr)); - return other_immediate_lowtag_p(widetag) - && lowtag_of(addr) == LOWTAG_FOR_WIDETAG(widetag); -} - /* Return true if and only if everything on the specified page is NOT subject * to evacuation, i.e. either the page is not in 'from_space', or is entirely * pinned. "Entirely pinned" is predicated on being marked as pinned, diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 73180302ab..f5f8b23457 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -785,6 +785,7 @@ static uword_t build_refs(lispobj* where, lispobj* end, } } break; + case FILLER_WIDETAG: continue; default: if (!(other_immediate_lowtag_p(widetag) && LOWTAG_FOR_WIDETAG(widetag))) lose("Unknown widetag %x", widetag); diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index d0c1161dbd..ecaa277f75 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -302,6 +302,9 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state } while (where < end) { int widetag = is_header(*where) ? header_widetag(*where) : LIST_POINTER_LOWTAG; + /* Technically we should wait until after performing the widetag validity + * tests before calling the sizer. Otherwise the lossage message would + * not be as good as it could be. I guess that failure doesn't happen much */ long nwords = OBJECT_SIZE(*where,where); state->object_addr = where; state->object_header = is_cons_half(*where) ? 0 : *where; @@ -338,6 +341,7 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state if (!state->object_header) { if (verify_pointer(where[0], where+0, state) || verify_pointer(where[1], where+1, state)) break; + } else if (widetag == FILLER_WIDETAG) { // do nothing } else if (!(other_immediate_lowtag_p(widetag) && LOWTAG_FOR_WIDETAG(widetag))) { lose("Unhandled widetag %"OBJ_FMTX" @ %p", *where, where); } else if (leaf_obj_widetag_p(widetag)) { diff --git a/tests/gc-testlib.c b/tests/gc-testlib.c index 97a299e054..6c299be43a 100644 --- a/tests/gc-testlib.c +++ b/tests/gc-testlib.c @@ -37,6 +37,15 @@ static void make_instances(int page_type, generation_index_t gen, lispobj result // Fill to the end of the card int filler_nwords = (GENCGC_CARD_BYTES >> WORD_SHIFT) - 2; *where = ((filler_nwords - 1) << N_WIDETAG_BITS) | FILLER_WIDETAG; + + // Assert that no tagged pointer can point to the filler + // fprintf(stderr, "Filler @ %p: %"OBJ_FMTX"\n", where, *where); + int lowtag; + for (lowtag=1; lowtag<=LOWTAG_MASK; ++lowtag) { + lispobj addr = make_lispobj(where, lowtag); + gc_assert(!plausible_tag_p(addr)); + } + where += filler_nwords; // Create the funcallable instance, total length 6 words From d8ac32a1e9ff21af4357df24b7993b6aebd6f65d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 14:19:25 -0400 Subject: [PATCH 3229/4023] Zeroize simple-vector suffix in %SHRINK-VECTOR Because GC scavenging is more finicky now that it does not necessarily proceed strictly object-by-object, non-zeroing could have caused inadvertent floating garbage at best, or a crash at worst. --- src/code/array.lisp | 41 ++++++++++++++++++++++++++++------------- tests/gc.impure.lisp | 13 +++++++++++++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index a0ee75a3db..11b2a10659 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -1371,15 +1371,33 @@ of specialized arrays is supported." ;;; dangerous to do so: shrinking the size of an object accessible ;;; to another thread could cause it to access an out-of-bounds element. ;;; GC should generally be fine no matter what happens, because it either -;;; reads the old length or the new length. If the old, and unboxed, -;;; the whole vector is skipped; if simple-vector, then at worst it reads -;;; the header word for a filler, which is a valid element (yup really!). -;;; If it reads the new length, then the next object is filler. -(defun %shrink-vector (vector new-length) +;;; reads the old length or the new length. If it reads the old length, +;;; then the whole vector is skipped if unboxed; if it reads the new length, +;;; then the next object is a filler. +;;; Exception: for SIMPLE-VECTOR we always zeroized the unused tail, +;;; because the garbage collector can scan certain pages without regard +;;; to object boundaries. The situation we need to avoid is this: +;;; "old" #(...............|.....) +;;; "new" #(..........)Fill|..... +;;; ^ page boundary +;;; where GC reads the objects on the page just after the filler +;;; because it doesn't know not to. +;;; +(defun %shrink-vector (vector new-length + &aux (old-length (length vector)) + (new-length* new-length)) (declare (vector vector)) - (unless (or (array-header-p vector) (typep vector '(simple-array nil (*)))) - (let ((old-length (length vector)) - (new-length new-length)) + (cond + ((simple-vector-p vector) + ;; We do in fact call %SHRINK-VECTOR a lot from sequence functions + ;; that overallocate a temporary result. In all places where that happens, + ;; the discarded suffix was never used. So assuming pre-zeroed heap, + ;; it kind of just worked. But I don't want to assume that. + ;; For what it's worth, adding this assertion prior to FILL: + ;; (WHEN (FIND 0 VECTOR :START OLD-LENGTH :TEST #'NEQ) (BUG "No can do")) + ;; produced no failures in the regression suite. + (when (< new-length old-length) (fill vector 0 :start new-length))) + ((not (or (array-header-p vector) (typep vector '(simple-array nil (*))))) (when (simple-base-string-p vector) ;; We can blindly store the hidden #\null at NEW-LENGTH, but it would ;; appear to be an out-of-bounds access if the length is not @@ -1390,14 +1408,11 @@ of specialized arrays is supported." ;; Now treat both the old and new lengths as if they include ;; the byte that holds the implicit string terminator. (incf old-length) - (incf new-length)) + (incf new-length*)) (let* ((n-bits-shift (aref %%simple-array-n-bits-shifts%% (%other-pointer-widetag vector))) (old-nwords (ceiling (ash old-length n-bits-shift) n-word-bits)) - (new-nwords (ceiling (ash new-length n-bits-shift) n-word-bits))) - ;; If we want to impose a constraint that unused bytes above the - ;; new length and below the physical end are 0, - ;; then now would be the time to enforce that. + (new-nwords (ceiling (ash new-length* n-bits-shift) n-word-bits))) (when (< new-nwords old-nwords) (with-pinned-objects (vector) ;; VECTOR-SAP is only for unboxed vectors. Use the vop directly. diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index 0917d47c63..4c5193f485 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -477,3 +477,16 @@ (gc) (let ((marks (sb-kernel:object-card-marks *vvv*))) (assert (not (find 1 marks))))) + +(with-test (:name :%shrink-vector) + (let ((v (make-array 25 :initial-element 'yikes))) + (sb-sys:with-pinned-objects (v) + ;; Can't call VECTOR-SAP on simple-vector. + ;; (Honestly I don't see what purpose that limitation serves) + (let ((sap (sb-sys:sap+ (sb-sys:int-sap (sb-kernel:get-lisp-obj-address v)) + (- (ash sb-vm:vector-data-offset sb-vm:word-shift) + sb-vm:other-pointer-lowtag)))) + (sb-impl::%shrink-vector v 9) + (loop for i from 10 to 24 + do + (assert (= (sb-sys:sap-ref-word sap (ash i sb-vm:word-shift))))))))) From d71fa1b985f2287942df922e902ab0a132b32fa9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 17:50:25 -0400 Subject: [PATCH 3230/4023] Parameterize gc_close_collector_regions The code region is shared by the collector and mutators, so there has to be a way to indicate use by one or the other. --- src/runtime/gc-internal.h | 2 +- src/runtime/gencgc.c | 14 +++++++------- src/runtime/monitor.c | 5 +++-- src/runtime/traceroot.c | 8 +++++++- tests/gc-testlib.c | 2 +- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index b48b97cf79..057fa9e240 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -141,5 +141,5 @@ extern int simple_fun_index(struct code*, struct simple_fun*); extern lispobj fdefn_callee_lispobj(struct fdefn *fdefn); extern void gc_close_thread_regions(struct thread*); -extern void gc_close_collector_regions(); +extern void gc_close_collector_regions(int); #endif /* _GC_INTERNAL_H_ */ diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 3f983f284e..510c7d12b9 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3147,9 +3147,9 @@ static void newspace_full_scavenge(generation_index_t generation) record_new_regions_below = 1 + page_table_pages; } -void gc_close_collector_regions() +void gc_close_collector_regions(int flag) { - ensure_region_closed(code_region, PAGE_TYPE_CODE); + ensure_region_closed(code_region, flag|PAGE_TYPE_CODE); ensure_region_closed(boxed_region, PAGE_TYPE_BOXED); ensure_region_closed(unboxed_region, PAGE_TYPE_UNBOXED); ensure_region_closed(mixed_region, PAGE_TYPE_MIXED); @@ -3162,7 +3162,7 @@ static void scavenge_newspace(generation_index_t generation) { /* Flush the current regions updating the page table. */ - gc_close_collector_regions(); + gc_close_collector_regions(0); /* Turn on the recording of new areas. */ gc_assert(new_areas_index == 0); @@ -3173,7 +3173,7 @@ scavenge_newspace(generation_index_t generation) newspace_full_scavenge(generation); /* Flush the current regions updating the page table. */ - gc_close_collector_regions(); + gc_close_collector_regions(0); while (1) { if (GC_LOGGING) fprintf(gc_activitylog(), "newspace loop\n"); @@ -3184,7 +3184,7 @@ scavenge_newspace(generation_index_t generation) // actually entails new work - it only knows which triggers were removed // from the pending list. So check again if allocations occurred, // which is only if not all triggers referenced already-live objects. - gc_close_collector_regions(); // update new_areas from regions + gc_close_collector_regions(0); // update new_areas from regions if (!new_areas_index && !immobile_scav_queue_count) break; // still no work to do } @@ -3229,7 +3229,7 @@ scavenge_newspace(generation_index_t generation) } /* Flush the current regions updating the page table. */ - gc_close_collector_regions(); + gc_close_collector_regions(0); } /* Turn off recording of allocation regions. */ @@ -4450,7 +4450,7 @@ collect_garbage(generation_index_t last_gen) ensure_region_closed(THREAD_ALLOC_REGION(th,mixed), PAGE_TYPE_MIXED); ensure_region_closed(THREAD_ALLOC_REGION(th,cons), PAGE_TYPE_CONS); } - gc_close_collector_regions(); + ensure_region_closed(code_region, PAGE_TYPE_CODE); if (gencgc_verbose > 2) fprintf(stderr, "[%d] BEGIN gc(%d)\n", n_gcs, last_gen); /* Immobile space generation bits are lazily updated for gen0 diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index dd5ab1a055..3224aaf69a 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -224,7 +224,7 @@ static void suspend_other_threads() { // versus doing this loop struct thread *th; for_each_thread(th) { gc_close_thread_regions(th); } - gc_close_collector_regions(); + gc_close_collector_regions(0); } static void unsuspend_other_threads() { #ifdef LISP_FEATURE_SB_THREAD @@ -753,7 +753,8 @@ ldb_monitor(void) int ambig; printf("Welcome to LDB, a low-level debugger for the Lisp runtime environment.\n"); - if (gc_active_p) printf("(GC in progress)\n"); + if (gc_active_p) printf("(GC in progress, oldspace=%d, newspace=%d)\n", + from_space, new_space); if (gc_activitylog_file) fflush(gc_activitylog_file); if (!ldb_in) { #ifndef LISP_FEATURE_WIN32 diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index f5f8b23457..091d3e046f 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -988,7 +988,13 @@ static int trace_paths(void (*context_scanner)(), } ++i; } while (weak_pointers != NIL); - gc_close_collector_regions(); + // gc_close_collector_regions() won't suffice here. + // Depending on whether this is called from prove_liveness() or + // gc_prove_liveness() via collect_garbage(), there may be an open + // region that has the THREAD_PAGE_FLAG in its PTE. But that's not + // correct for the allocations made for traceroot's answers. + ensure_region_closed(unboxed_region, PAGE_TYPE_UNBOXED); + ensure_region_closed(cons_region, PAGE_TYPE_CONS); os_invalidate(scratchpad.base, scratchpad.end-scratchpad.base); #if TRACEROOT_USE_ABSL_HASHMAP absl_hashmap_destroy(inverted_heap); diff --git a/tests/gc-testlib.c b/tests/gc-testlib.c index 6c299be43a..18eb3ae495 100644 --- a/tests/gc-testlib.c +++ b/tests/gc-testlib.c @@ -69,7 +69,7 @@ static void perform_gc(lispobj* stackptr) extern void garbage_collect_generation(generation_index_t, int, void*); gc_active_p = 1; - gc_close_collector_regions(); + gc_close_collector_regions(0); // TODO: should be THREAD_PAGE_FLAG close_current_thread_tlab(); update_immobile_nursery_bits(); verify_heap(VERIFY_PRE_GC); From 46ebaa57b9a983d5d53a843b3726c99c5c5dd1b5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 19:59:54 -0400 Subject: [PATCH 3231/4023] Skip STATE_DEAD threads in save_gc_crashdump() --- src/runtime/monitor.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 3224aaf69a..e120020622 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -158,16 +158,23 @@ void save_gc_crashdump(char *pathname, int ici = fixnum_value(read_TLS(FREE_INTERRUPT_CONTEXT_INDEX,th)); os_context_t* threadcontext = nth_interrupt_context(0, th); uword_t sp; - if (ici) + if (ici) { #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK sp = *os_context_register_addr(threadcontext, reg_SP); #else sp = *os_context_register_addr(threadcontext, reg_CSP); #endif - else { + } else if (th->state_word.state == STATE_DEAD) { + gc_assert(th->binding_stack_pointer == th->binding_stack_start); + // FIXME: assumes stack grows down + sp = (uword_t)th->control_stack_end; + } else { if (th != get_sb_vm_thread()) { - char msg[] = "No stackptr for crash dump\n"; - write(2, msg, sizeof msg-1); + char msg[80]; + int n = snprintf(msg, sizeof msg, + "thread %p state %d - No stackptr for crash dump\n", + th, th->state_word.state); + write(2, msg, n); _exit(1); } #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK From e24ec0993ab0dbc58e454c084ad3cfb67f10ec25 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 22:08:28 -0400 Subject: [PATCH 3232/4023] Deflake a test --- tests/gc.impure.lisp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index 4c5193f485..f768e79581 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -135,8 +135,11 @@ (sb-sys:with-code-pages-pinned (:dynamic) (gc)) ;; this should not fail to find FUN at its old address (let ((fun (sb-kernel:make-lisp-obj (first *some-object-handles*)))) - ;; this should fail to find a string at its old address - (assert (not (nth-value 1 (sb-kernel:make-lisp-obj (second *some-object-handles*) nil)))) + ;; To prove that _some_ things moved in memory, + ;; assert that we don't see the arbitrary string at its old address. + (multiple-value-bind (thing existsp) + (sb-kernel:make-lisp-obj (second *some-object-handles*) nil) + (assert (or (not existsp) (not (typep thing '(string 7)))))) ;; this should similarly fail- STRING-TWO was transitively reachable but movable (multiple-value-bind (obj validp) (sb-kernel:make-lisp-obj (third *some-object-handles*) nil) (if validp From 7803dca4f631925cf1dc4ec49f9184d78fd71b3a Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 30 Apr 2022 14:51:53 -0700 Subject: [PATCH 3233/4023] Make debug source correct, even on low debug or for block compile. This essentially goes back to the state of affairs before the change 5c2ad7a3fa3d3ee2d55b0b04823ecd8f21944898. That change was completely reasonable at the time because there was no way to have a compiled fun be associated with more than one TLF number. Now that we have block compilation and auto tlf merging working again, we need to store the TLF number at a finer granularity again, and to also record the START-POSITIONS vector, which at least obviates the need for storing the char offset in each compiled debug object. One interesting thing that the restored implementation does is that if each code location in a function shares the same tlf number, that is taken into account and we get no overhead in the fasl in that case. One difference is that instead of incrementally building up the START-POSITIONS vector on each component load, which takes up a lot of space and is annoying to do, now we just forget about using the character offset if loading gets interrupted, and just back up and read the forms out of the source info. This makes debug information during interrupted loads work, without all the extra bookkeeping. The end result is that debug source works better for debug 1 and for block compilation than previous releases, and we also fix it up for high debug after it got worse from adding top-level lambda merging. --- NEWS | 2 + contrib/sb-introspect/introspect.lisp | 25 ++--- src/code/debug-info.lisp | 27 ++--- src/code/debug-int.lisp | 122 ++++++++++++----------- src/code/load.lisp | 16 ++- src/code/save.lisp | 6 -- src/code/simple-fun.lisp | 30 ------ src/cold/exports.lisp | 7 +- src/compiler/debug-dump.lisp | 137 +++++++++++++------------- src/compiler/dump.lisp | 46 +++++++-- src/compiler/generic/genesis.lisp | 8 ++ src/compiler/main.lisp | 11 ++- src/interpreter/sexpr.lisp | 5 - src/pcl/boot.lisp | 5 +- tests/packed-varints.pure.lisp | 19 ---- 15 files changed, 245 insertions(+), 221 deletions(-) diff --git a/NEWS b/NEWS index 8319d73b28..74a0524444 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ changes relative to sbcl-2.2.4: * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. + * enhancement: debug source locations now work correctly for top level forms + with policy DEBUG = 1, as well as for block compiled files. changes in sbcl-2.2.4 relative to sbcl-2.2.3: * enhancement: better constraint propagation in the compiler. Specifically, diff --git a/contrib/sb-introspect/introspect.lisp b/contrib/sb-introspect/introspect.lisp index aabfe94104..3f251690a4 100644 --- a/contrib/sb-introspect/introspect.lisp +++ b/contrib/sb-introspect/introspect.lisp @@ -460,18 +460,19 @@ If an unsupported TYPE is requested, the function will return NIL. (defun find-function-definition-source (function) (let* ((debug-info (function-debug-info function)) (debug-source (debug-info-source debug-info)) - (debug-fun (debug-info-debug-function function debug-info))) - (multiple-value-bind (tlf character-offset) - (sb-di::debug-fun-tlf-and-offset debug-info debug-fun) - (make-definition-source - :pathname - (when (stringp (debug-source-namestring debug-source)) - (parse-namestring (debug-source-namestring debug-source))) - :character-offset character-offset - :form-path (if tlf (list tlf)) - :form-number (sb-c::compiled-debug-fun-form-number debug-fun) - :file-write-date (debug-source-created debug-source) - :plist (sb-c::debug-source-plist debug-source))))) + (debug-fun (debug-info-debug-function function debug-info)) + (tlf (if debug-fun (sb-c::compiled-debug-fun-tlf-number debug-fun)))) + (make-definition-source + :pathname + (when (stringp (debug-source-namestring debug-source)) + (parse-namestring (debug-source-namestring debug-source))) + :character-offset + (if tlf + (elt (sb-c::debug-source-start-positions debug-source) tlf)) + :form-path (if tlf (list tlf)) + :form-number (sb-c::compiled-debug-fun-form-number debug-fun) + :file-write-date (debug-source-created debug-source) + :plist (sb-c::debug-source-plist debug-source)))) (defun translate-source-location (location) (if location diff --git a/src/code/debug-info.lisp b/src/code/debug-info.lisp index 945e292850..063bcacc7d 100644 --- a/src/code/debug-info.lisp +++ b/src/code/debug-info.lisp @@ -134,6 +134,11 @@ (blocks nil :type (or (simple-array (unsigned-byte 8) (*)) (simple-array (signed-byte 8) (*)) null)) + ;; If all code locations in this function are in the same top level + ;; form, then this is the number of that form, otherwise NIL. If + ;; NIL, then each code location represented in the BLOCKS specifies + ;; the TLF number. + (tlf-number nil :type (or index null)) ;; a vector describing the variables that the argument values are ;; stored in within this function. The locations are represented by ;; the ordinal number of the entry in the VARIABLES slot value. The @@ -191,9 +196,6 @@ (return-pc-pass (missing-arg) :type sc+offset) #-fp-and-pc-standard-save (old-fp (missing-arg) :type sc+offset) - ;; When block compiling a single code object can have multiple top level forms, - ;; in that case it's a (cons (pack-tlf-num+offset tlf offset) integer) - ;; otherwise just an integer: ;; An integer which contains between 4 and 6 varint-encoded fields: ;; START-PC - ;; The earliest PC in this function at which the environment is properly @@ -203,7 +205,7 @@ ;; OFFSET ;; The start of elsewhere code for this function (if any.) ;; CLOSURE-SAVE, and BSP-SAVE. - (encoded-locs (missing-arg) :type (or cons unsigned-byte) :read-only t) + (encoded-locs (missing-arg) :type unsigned-byte :read-only t) (next)) (defun cdf-encode-locs (start-pc elsewhere-pc @@ -234,11 +236,8 @@ (integer-from-octets bytes))) (defun cdf-decode-locs (cdf) - (let* ((encoding (compiled-debug-fun-encoded-locs cdf)) - (encoding (if (consp encoding) - (cdr encoding) - encoding)) - (input-pointer 0)) + (let ((encoding (compiled-debug-fun-encoded-locs cdf)) + (input-pointer 0)) (flet ((decode-varint (&aux (accumulator 0) (shift 0)) (loop (let ((byte (ldb (byte 8 input-pointer) encoding))) @@ -394,6 +393,10 @@ ;; the universal time that the source was written, or NIL if ;; unavailable (created nil :type (or unsigned-byte null)) + ;; The FILE-POSITIONs of the truly top level forms read from this + ;; file (if applicable). The vector element type will be chosen to + ;; hold the largest element. + (start-positions nil :type (or (simple-array * (*)) null) :read-only t) ;; Additional information from (WITH-COMPILATION-UNIT (:SOURCE-PLIST ...)) (plist *source-plist* :read-only t)) @@ -416,9 +419,9 @@ ;; Location contexts ;; A (simple-array * (*)) or a context if there's only one context. (contexts nil :type t :read-only t) - ;; Packed integers. Also can be a cons of that plus an alist which - ;; maps SB-C::COMPILED-DEBUG-FUN to SB-DI::COMPILED-DEBUG-FUN instances. - (tlf-num+offset (missing-arg) :type (or integer cons (eql :multiple)))) + ;; The CDR is an alist which maps SB-C::COMPILED-DEBUG-FUN to + ;; SB-DI::COMPILED-DEBUG-FUN instances. Null when unassigned. + (memo-cell nil :type list)) ;;; The TLF-NUMBER and CHAR-OFFSET of a compiled-debug-info can each be NIL, ;;; but aren't often. However, to allow that, convert NIL to 0 and non-nil diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 7d3074e96e..4345c374ea 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -296,6 +296,9 @@ ;; the DEBUG-BLOCK containing CODE-LOCATION. XXX Possibly toss this ;; out and just find it in the blocks cache in DEBUG-FUN. (%debug-block :unparsed :type (or debug-block (member :unparsed))) + ;; This is the number of forms processed by the compiler or loader + ;; before the top level form containing this code-location. + (%tlf-offset :unparsed :type (or index (member :unparsed))) ;; This is the depth-first number of the node that begins ;; code-location within its top level form. (%form-number :unparsed :type (or index (member :unparsed)))) @@ -463,13 +466,13 @@ #+gencgc (let ((memo-cell (let* ((info (sb-vm::%%code-debug-info component)) - (val (sb-c::compiled-debug-info-tlf-num+offset info))) - (if (consp val) - val - (let* ((list (list val)) - (old (cas (sb-c::compiled-debug-info-tlf-num+offset info) val list))) - (if (eq old val) list old)))))) - ;; The CDR of TLF-NUM+OFFSET slot is an alist from compiler -> debugger structure. + (val (sb-c::compiled-debug-info-memo-cell info))) + (if (null val) + (let* ((list (cons val nil)) + (old (cas (sb-c::compiled-debug-info-memo-cell info) val list))) + (if (eq old val) list old)) + val)))) + ;; The CDR of MEMO-CELL slot is an alist from compiler -> debugger structure. (let ((new-df nil) (new-pair nil) (new-alist nil) (alist (cdr memo-cell))) (loop ;; This list generally contains 5 items or less. At least, in our tests it does @@ -494,12 +497,12 @@ str))) (defstruct (compiled-code-location - (:include code-location) - (:constructor make-known-code-location - (pc debug-fun %debug-block %form-number - %live-set kind step-info context &aux (%unknown-p nil))) - (:constructor make-compiled-code-location (pc debug-fun)) - (:copier nil)) + (:include code-location) + (:constructor make-known-code-location + (pc debug-fun %debug-block %tlf-offset %form-number + %live-set kind step-info context &aux (%unknown-p nil))) + (:constructor make-compiled-code-location (pc debug-fun)) + (:copier nil)) ;; an index into DEBUG-FUN's component slot (pc nil :type index :read-only t) ;; a bit-vector indexed by a variable's position in @@ -1803,6 +1806,7 @@ register." ;; element size of the packed binary representation of the ;; blocks data. (live-set-len (ceiling var-count 8)) + (tlf-number (sb-c::compiled-debug-fun-tlf-number compiler-debug-fun)) (elsewhere-pc (sb-c::compiled-debug-fun-elsewhere-pc compiler-debug-fun)) elsewhere-p (len (length blocks)) @@ -1831,6 +1835,8 @@ register." (ldb (byte 3 0) flags))) (pc (+ last-pc (sb-c:read-var-integerf blocks i))) + (tlf-offset (or tlf-number + (sb-c::read-var-integerf blocks i))) (equal-live (logtest sb-c::compiled-code-location-equal-live flags)) (form-number (cond ((logtest sb-c::compiled-code-location-zero-form-number flags) @@ -1864,7 +1870,7 @@ register." (setf elsewhere-p t))) (new-block)) (push (make-known-code-location - pc debug-fun block + pc debug-fun block tlf-offset form-number live-set kind step-info context) locations) @@ -2051,26 +2057,27 @@ register." (debug-signal 'no-debug-blocks :debug-fun (code-location-debug-fun code-location))))) -(defun debug-fun-tlf-and-offset (debug-info debug-fun) - (if (typep (sb-c::compiled-debug-info-tlf-num+offset debug-info) - '(or (eql :multiple) (cons (eql :multiple)))) - (let* ((encoded-locs (sb-c::compiled-debug-fun-encoded-locs debug-fun)) - (tlf-num+offset (and (consp encoded-locs) - (car encoded-locs)))) - (if tlf-num+offset - (sb-c::unpack-tlf-num+offset tlf-num+offset))) - (values (sb-c::compiled-debug-info-tlf-number debug-info) - (sb-c::compiled-debug-info-char-offset debug-info)))) - ;;; Returns the number of top level forms before the one containing ;;; CODE-LOCATION as seen by the compiler in some compilation unit. (A ;;; compilation unit is not necessarily a single file, see the section ;;; on debug-sources.) (defun code-location-toplevel-form-offset (code-location) - (let ((df (code-location-debug-fun code-location))) - (values - (debug-fun-tlf-and-offset (compiled-debug-fun-debug-info df) - (compiled-debug-fun-compiler-debug-fun df))))) + (when (code-location-unknown-p code-location) + (error 'unknown-code-location :code-location code-location)) + (let ((tlf-offset (code-location-%tlf-offset code-location))) + (cond ((eq tlf-offset :unparsed) + (etypecase code-location + (compiled-code-location + (unless (fill-in-code-location code-location) + ;; This check should be unnecessary. We're missing + ;; debug info the compiler should have dumped. + (bug "unknown code location")) + (code-location-%tlf-offset code-location)) + ;; (There used to be more cases back before sbcl-0.7.0,, + ;; when we did special tricks to debug the IR1 + ;; interpreter.) + )) + (t tlf-offset)))) ;;; Return the number of the form corresponding to CODE-LOCATION. The ;;; form number is derived by a walking the subforms of a top level @@ -2210,6 +2217,8 @@ register." (when found (setf (code-location-%debug-block code-location) (code-location-%debug-block found)) + (setf (code-location-%tlf-offset code-location) + (code-location-%tlf-offset found)) (setf (code-location-%form-number code-location) (code-location-%form-number found)) (setf (compiled-code-location-%live-set code-location) @@ -3045,38 +3054,39 @@ register." rt)) ;;; Locate the source file (if it still exists) and grab the top level -;;; form. If the file is modified, we use the top level form offset -;;; instead of the recorded character offset. +;;; form. If the file is modified, or if we are in the middle of +;;; loading the file (so that the start positions map is not available +;;; yet), we use the top level form offset instead of the recorded +;;; character offset. (defun get-file-toplevel-form (location) (let* ((d-source (code-location-debug-source location)) - (di (compiled-debug-fun-debug-info - (code-location-debug-fun location))) + (tlf-offset (code-location-toplevel-form-offset location)) + (start-positions (sb-di:debug-source-start-positions d-source)) (namestring (debug-source-namestring d-source)) (sbcl-source-p (eql (search "SYS:" namestring) 0))) - (multiple-value-bind (tlf-offset char-offset) - (debug-fun-tlf-and-offset di - (compiled-debug-fun-compiler-debug-fun - (code-location-debug-fun location))) - ;; FIXME: External format? - (with-open-file (f namestring :if-does-not-exist nil) - (when f - (let ((*readtable* (safe-readtable))) - (cond ((eql (debug-source-created d-source) (file-write-date f)) - (file-position f char-offset)) - (t + ;; FIXME: External format? + (with-open-file (f namestring :if-does-not-exist nil) + (when f + (let ((*readtable* (safe-readtable))) + (cond ((and (eql (debug-source-created d-source) (file-write-date f)) + start-positions) + (file-position f (aref start-positions tlf-offset))) + (t + (when start-positions (format *debug-io* - "~%; File has been modified since compilation:~%; ~A~@ - ; Using form offset instead of character position.~%" - namestring) - (let ((*read-suppress* t) - (*features* (if sbcl-source-p - (append *features* - '(:sb-xc) - (symbol-value 'sb-impl::+internal-features+)) - *features*))) - (loop repeat tlf-offset - do (read f))))) - (read f))))))) + "~%; File has been modified since compilation:~%; ~A" + namestring)) + (format *debug-io* + "~%; Using form offset instead of character position.~%") + (let ((*read-suppress* t) + (*features* (if sbcl-source-p + (append *features* + '(:sb-xc) + (symbol-value 'sb-impl::+internal-features+)) + *features*))) + (loop repeat tlf-offset + do (read f))))) + (read f)))))) ;;;; PREPROCESS-FOR-EVAL diff --git a/src/code/load.lisp b/src/code/load.lisp index 7a3c2053c3..ef9079d8be 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -130,7 +130,10 @@ (stack (make-fop-vector 100) :type simple-vector) (name-buffer (vector (make-string 1 :element-type 'character) (make-string 31 :element-type 'base-char))) - (print nil :type boolean)) + (print nil :type boolean) + ;; We keep track of partial source info for the input in case + ;; loading gets interrupted. + (partial-source-info nil :type (or null sb-c::debug-source))) (declaim (freeze-type fasl-input)) ;;; Output the current number of semicolons after a fresh-line. @@ -1115,6 +1118,8 @@ ;; Assign debug-info last. A code object that has no debug-info will never ;; have its fun table accessed in conservative_root_p() or pin_object(). (setf (%code-debug-info code) (svref stack (+ ptr n-constants))) + (setf (sb-c::debug-info-source (%code-debug-info code)) + (%fasl-input-partial-source-info (fasl-input))) ;; Boxed constants can be assigned only after figuring out where the range ;; of implicitly tagged words is, which requires knowing how many functions ;; are in the code component, which requires reading the code trailer. @@ -1209,6 +1214,15 @@ (define-fop 22 (fop-assembler-code) (error "cannot load assembler code except at cold load")) +;;;; fops for debug info + +(define-fop 124 (fop-note-partial-source-info (namestring created plist) nil) + (setf (%fasl-input-partial-source-info (fasl-input)) + (sb-c::make-debug-source :namestring namestring + :created created + :plist plist)) + (values)) + ;;;; fops for code coverage (define-fop 120 :not-host (fop-record-code-coverage (namestring cc) nil) diff --git a/src/code/save.lisp b/src/code/save.lisp index 1a7df8b8e9..c0978e2c46 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -500,12 +500,6 @@ sb-c:: (declare (ignore size)) (case widetag (#.sb-vm:code-header-widetag - (let ((di (sb-vm::%%code-debug-info obj))) - ;; Discard memoized debugger's debug info - (when (typep di 'sb-c::compiled-debug-info) - (let ((thing (sb-c::compiled-debug-info-tlf-num+offset di))) - (when (consp thing) - (setf (sb-c::compiled-debug-info-tlf-num+offset di) (car thing)))))) (dotimes (i (sb-kernel:code-n-entries obj)) (let* ((fun (sb-kernel:%code-entry-point obj i)) (arglist (%simple-fun-arglist fun)) diff --git a/src/code/simple-fun.lisp b/src/code/simple-fun.lisp index 21c2b2506a..3210d60154 100644 --- a/src/code/simple-fun.lisp +++ b/src/code/simple-fun.lisp @@ -631,33 +631,3 @@ (do-closure-values (value closure) (when (funcall test value) (return value)))) - -(in-package "SB-C") - -;;; Decode the packed TLF-NUM+OFFSET slot, which might have ancillary -;;; data for the debugger pushed in. So if it's a cons, take the CDR. -;;; This is target-only code, so doesn't belong in 'debug-info.lisp' -(defun unpack-tlf-num+offset (tlf-num+offset - &aux (integer (if (consp tlf-num+offset) - (car tlf-num+offset) - tlf-num+offset)) - (bytepos 0)) - (flet ((unpack-1 () - (let ((shift 0) (acc 0)) - (declare (notinline sb-kernel:%ldb)) ; lp#1573398 - (loop - (let ((byte (ldb (byte 8 bytepos) integer))) - (incf bytepos 8) - (setf acc (logior acc (ash (logand byte #x7f) shift))) - (if (logtest byte #x80) - (incf shift 7) - (return acc))))))) - (let ((v1 (unpack-1)) - (v2 (unpack-1))) - (values (if (eql v1 0) nil (1- v1)) - (if (eql v2 0) nil (1- v2)))))) - -(defun compiled-debug-info-tlf-number (cdi) - (nth-value 0 (unpack-tlf-num+offset (compiled-debug-info-tlf-num+offset cdi)))) - (defun compiled-debug-info-char-offset (cdi) - (nth-value 1 (unpack-tlf-num+offset (compiled-debug-info-tlf-num+offset cdi)))) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index cdae89be7c..a57f84db84 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1147,12 +1147,12 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") (:import-from "SB-C" "DEBUG-SOURCE-NAMESTRING" "DEBUG-SOURCE-CREATED" - "MAKE-DEBUG-SOURCE" + "DEBUG-SOURCE-START-POSITIONS" "MAKE-DEBUG-SOURCE" "DEBUG-SOURCE" "DEBUG-SOURCE-P" "CORE-DEBUG-SOURCE" "CORE-DEBUG-SOURCE-P" "CORE-DEBUG-SOURCE-FORM") (:reexport "DEBUG-SOURCE-NAMESTRING" - "DEBUG-SOURCE-CREATED" + "DEBUG-SOURCE-START-POSITIONS" "DEBUG-SOURCE-CREATED" "DEBUG-SOURCE" "DEBUG-SOURCE-P") (:export "ACTIVATE-BREAKPOINT" "AMBIGUOUS-DEBUG-VARS" "AMBIGUOUS-VAR-NAME" "BREAKPOINT" @@ -1220,7 +1220,8 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "+FASL-FILE-VERSION+" "FASL-DUMP-COMPONENT" "FASL-DUMP-LOAD-TIME-VALUE-LAMBDA" - "FASL-DUMP-TOPLEVEL-LAMBDA-CALL" + "FASL-DUMP-PARTIAL-SOURCE-INFO" + "FASL-DUMP-SOURCE-INFO" "FASL-DUMP-TOPLEVEL-LAMBDA-CALL" "FASL-NOTE-HANDLE-FOR-CONSTANT" "FASL-OUTPUT" "FASL-OUTPUT-P" "FASL-OUTPUT-ENTRY-TABLE" "FASL-OUTPUT-STREAM" diff --git a/src/compiler/debug-dump.lisp b/src/compiler/debug-dump.lisp index 09da2be6a2..b5bdef111e 100644 --- a/src/compiler/debug-dump.lisp +++ b/src/compiler/debug-dump.lisp @@ -197,12 +197,12 @@ ;;; the code/source map and live info. If true, VOP is the VOP ;;; associated with this location, for use in determining whether TNs ;;; are spilled. -(defun dump-1-location (node block kind label live var-locs vop +(defun dump-1-location (node block kind tlf-num label live var-locs vop &optional context) (declare (type node node) (type ir2-block block) (type (or null local-tn-bit-vector) live) (type (or label index) label) - (type location-kind kind) + (type location-kind kind) (type (or index null) tlf-num) (type hash-table var-locs) (type (or vop null) vop)) (let* ((byte-buffer *byte-buffer*) (stepping (and (combination-p node) @@ -255,6 +255,8 @@ (write-var-integer (- loc *previous-location*) byte-buffer) (setq *previous-location* loc) + (unless tlf-num + (write-var-integer (source-path-tlf-number path) byte-buffer)) (unless (zerop form-number) (setf *previous-form-number* form-number) (write-var-integer form-number byte-buffer)) @@ -274,13 +276,14 @@ ;;; Extract context info from a Location-Info structure and use it to ;;; dump a compiled code-location. -(defun dump-location-from-info (loc var-locs) - (declare (type location-info loc) +(defun dump-location-from-info (loc tlf-num var-locs) + (declare (type location-info loc) (type (or index null) tlf-num) (type hash-table var-locs)) (let ((vop (location-info-vop loc))) (dump-1-location (vop-node vop) (vop-block vop) (location-info-kind loc) + tlf-num (location-info-label loc) (vop-save-set vop) var-locs @@ -288,21 +291,44 @@ (location-info-context loc))) (values)) +;;; Scan all the blocks, determining if all locations are in the same +;;; TLF, and returning it or NIL. +(defun find-tlf-number (fun) + (declare (type clambda fun)) + (let ((res (source-path-tlf-number (node-source-path (lambda-bind fun))))) + (declare (type (or index null) res)) + (do-environment-ir2-blocks (2block (lambda-environment fun)) + (let ((block (ir2-block-block 2block))) + (when (eq (block-info block) 2block) + (unless (eql (source-path-tlf-number + (node-source-path + (block-start-node block))) + res) + (setq res nil))) + + (dolist (loc (ir2-block-locations 2block)) + (unless (eql (source-path-tlf-number + (node-source-path + (vop-node (location-info-vop loc)))) + res) + (setq res nil))))) + res)) + ;;; Dump out the number of locations and the locations for Block. -(defun dump-block-locations (block locations var-locs) +(defun dump-block-locations (block locations tlf-num var-locs) (declare (type cblock block) (list locations)) (unless (and locations (eq (location-info-kind (first locations)) :non-local-entry)) (let ((2block (block-info block))) (dump-1-location (block-start-node block) - 2block :block-start + 2block :block-start tlf-num (ir2-block-%label 2block) (ir2-block-live-out 2block) var-locs nil))) (dolist (loc locations) - (dump-location-from-info loc var-locs)) + (dump-location-from-info loc tlf-num var-locs)) (values)) ;;; Return a vector and an integer (or null) suitable for use as the @@ -312,6 +338,7 @@ (let ((*previous-location* 0) *previous-live* *previous-form-number* + (tlf-num (find-tlf-number fun)) (env (lambda-environment fun)) (byte-buffer *byte-buffer*) prev-block @@ -323,7 +350,7 @@ (when (eq (block-info block) 2block) (when prev-block (dump-block-locations prev-block (nreverse (shiftf locations nil)) - var-locs)) + tlf-num var-locs)) (setf prev-block block))) (dolist (loc (ir2-block-locations 2block)) (if (label-elsewhere-p (location-info-label loc) @@ -331,13 +358,15 @@ (push loc elsewhere-locations) (push loc locations)))) - (dump-block-locations prev-block (nreverse locations) var-locs) + (dump-block-locations prev-block (nreverse locations) + tlf-num var-locs) (when elsewhere-locations (dolist (loc (nreverse elsewhere-locations)) - (dump-location-from-info loc var-locs))) + (dump-location-from-info loc tlf-num var-locs))) ;; lz-compress accept any array of octets and returns a simple-array - (logically-readonlyize (lz-compress byte-buffer)))) + (values (logically-readonlyize (lz-compress byte-buffer)) + tlf-num))) ;;; Return DEBUG-SOURCE structure containing information derived from ;;; INFO. @@ -354,7 +383,9 @@ (truename (file-info-truename file-info))))) (if (pathnamep pathname) pathname)) file-info)) - :created (file-info-write-date file-info) + :created (file-info-write-date file-info) + :start-positions (coerce-to-smallest-eltype + (file-info-positions file-info)) (if function (values :form (let ((direct-file-info (source-info-file-info info))) (when (eq :lisp (file-info-truename direct-file-info)) @@ -658,7 +689,7 @@ ;;;; debug functions ;;; Return a C-D-F structure with all the mandatory slots filled in. -(defun dfun-from-fun (fun tlf) +(defun dfun-from-fun (fun) (declare (type clambda fun)) (let* ((2env (environment-info (lambda-environment fun))) (dispatch (lambda-optional-dispatch fun)) @@ -679,22 +710,7 @@ (second name)) (t name)) - name)) - (encoded-locs - (cdf-encode-locs - (label-position (ir2-environment-environment-start 2env)) - (label-position (ir2-environment-elsewhere-start 2env)) - (source-path-form-number (node-source-path (lambda-bind fun))) - (label-position (block-label (lambda-block fun))) - (when (ir2-environment-closure-save-tn 2env) - (tn-sc+offset (ir2-environment-closure-save-tn 2env))) - #+unwind-to-frame-and-call-vop - (when (ir2-environment-bsp-save-tn 2env) - (tn-sc+offset (ir2-environment-bsp-save-tn 2env))) - #-fp-and-pc-standard-save - (label-position (ir2-environment-lra-saved-pc 2env)) - #-fp-and-pc-standard-save - (label-position (ir2-environment-cfp-saved-pc 2env))))) + name))) (funcall (compiled-debug-fun-ctor kind) :name name #-fp-and-pc-standard-save :return-pc @@ -704,21 +720,27 @@ #-fp-and-pc-standard-save :old-fp #-fp-and-pc-standard-save (tn-sc+offset (ir2-environment-old-fp 2env)) :encoded-locs - (if tlf - (cons (pack-tlf-num+offset - tlf - (aref (file-info-positions - (source-info-file-info *source-info*)) - tlf)) - encoded-locs) - encoded-locs)))) + (cdf-encode-locs + (label-position (ir2-environment-environment-start 2env)) + (label-position (ir2-environment-elsewhere-start 2env)) + (source-path-form-number (node-source-path (lambda-bind fun))) + (label-position (block-label (lambda-block fun))) + (when (ir2-environment-closure-save-tn 2env) + (tn-sc+offset (ir2-environment-closure-save-tn 2env))) + #+unwind-to-frame-and-call-vop + (when (ir2-environment-bsp-save-tn 2env) + (tn-sc+offset (ir2-environment-bsp-save-tn 2env))) + #-fp-and-pc-standard-save + (label-position (ir2-environment-lra-saved-pc 2env)) + #-fp-and-pc-standard-save + (label-position (ir2-environment-cfp-saved-pc 2env)))))) ;;; Return a complete C-D-F structure for FUN. This involves ;;; determining the DEBUG-INFO level and filling in optional slots as ;;; appropriate. -(defun compute-1-debug-fun (fun var-locs tlf) +(defun compute-1-debug-fun (fun var-locs) (declare (type clambda fun) (type hash-table var-locs)) - (let* ((dfun (dfun-from-fun fun tlf)) + (let* ((dfun (dfun-from-fun fun)) (actual-level (policy (lambda-bind fun) compute-debug-fun)) (level (cond #+sb-dyncount (*collect-dynamic-statistics* @@ -737,9 +759,13 @@ (compute-vars fun level var-locs)) (setf (compiled-debug-fun-arguments dfun) (compute-args fun var-locs)))) - (when (>= level 1) - (setf (compiled-debug-fun-blocks dfun) - (compute-debug-blocks fun var-locs))) + + (if (>= level 1) + (multiple-value-bind (blocks tlf-num) + (compute-debug-blocks fun var-locs) + (setf (compiled-debug-fun-blocks dfun) blocks + (compiled-debug-fun-tlf-number dfun) tlf-num)) + (setf (compiled-debug-fun-tlf-number dfun) (find-tlf-number fun))) (if (xep-p fun) (setf (compiled-debug-fun-returns dfun) :standard) (let ((info (tail-set-info (lambda-tail-set fun)))) @@ -785,25 +811,12 @@ :adjustable t)) (*contexts* (make-array 10 :fill-pointer 0 - :adjustable t)) - component-tlf-num) - (dolist (lambda (component-lambdas component)) - (unless (empty-fun-p lambda) - (let ((tlf-num (source-path-tlf-number - (node-source-path (lambda-bind lambda))))) - (cond ((not component-tlf-num) - (setf component-tlf-num tlf-num)) - ((= component-tlf-num tlf-num)) - (t - (setf component-tlf-num :multiple) - (return)))))) + :adjustable t))) (dolist (lambda (component-lambdas component)) (unless (empty-fun-p lambda) (clrhash var-locs) - (let ((tlf-num (and (eq component-tlf-num :multiple) - (source-path-tlf-number - (node-source-path (lambda-bind lambda)))))) - (push (compute-1-debug-fun lambda var-locs tlf-num) dfuns)))) + (push (compute-1-debug-fun lambda var-locs) + dfuns))) (let* ((sorted (sort dfuns #'< :key #'compiled-debug-fun-offset)) (fun-map (compute-debug-fun-map sorted))) (make-compiled-debug-info @@ -817,14 +830,6 @@ (sb-c::entry-info-name (car entries))) (component-name component))) :fun-map fun-map - :tlf-num+offset (if (eq component-tlf-num :multiple) - component-tlf-num - (pack-tlf-num+offset - component-tlf-num - (and component-tlf-num - (aref (file-info-positions - (source-info-file-info *source-info*)) - component-tlf-num)))) :contexts (compact-vector *contexts*))))) ;;; Write BITS out to BYTE-BUFFER in backend byte order. The length of diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index f9e03423a5..11a1abc8a2 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -76,6 +76,10 @@ ;; is the offset in the table of the code object needing to be ;; patched, and <offset> is the offset that must be patched. (patch-table (make-hash-table :test 'eq) :type hash-table) + ;; a list of the table handles for all of the DEBUG-INFO structures + ;; dumped in this file. These structures must be back-patched with + ;; source location information when the compilation is complete. + (debug-info () :type list) ;; This is used to keep track of objects that we are in the process ;; of dumping so that circularities can be preserved. The key is the ;; object that we have previously seen, and the value is the object @@ -89,9 +93,7 @@ ;; try to dump a structure that isn't in this hash table, we lose. (valid-structures (make-hash-table :test 'eq) :type hash-table) ;; a hash table of slots to be saved when dumping an instance. - (saved-slot-names (make-hash-table :test 'eq) :type hash-table) - ;; DEBUG-SOURCE written at the very beginning - (source-info nil :type (or null sb-c::debug-source))) + (saved-slot-names (make-hash-table :test 'eq) :type hash-table)) (declaim (freeze-type fasl-output)) ;;; Similarity hash table logic. @@ -1170,9 +1172,9 @@ ;; Dump the debug info. (let ((info (sb-c::debug-info-for-component component))) - (setf (sb-c::debug-info-source info) - (fasl-output-source-info fasl-output)) - (dump-object info fasl-output)) + (dump-object info fasl-output) + (push (dump-to-table fasl-output) + (fasl-output-debug-info fasl-output))) (dump-fop 'fop-load-code fasl-output (logior (ash header-length 1) @@ -1320,6 +1322,38 @@ (dump-push-previously-dumped-fun fun fasl-output) (dump-fop 'fop-funcall-for-effect fasl-output 0) (values)) + +;;; Dump some information to allow partial reconstruction of the +;;; DEBUG-SOURCE structure. +(defun fasl-dump-partial-source-info (info file) + (declare (type sb-c::source-info info) (type fasl-output file)) + (let ((partial (sb-c::debug-source-for-info info))) + (dump-object (sb-c::debug-source-namestring partial) file) + (dump-object (sb-c::debug-source-created partial) file) + (dump-object (sb-c::debug-source-plist partial) file) + (dump-fop 'fop-note-partial-source-info file))) + +;;; Compute the correct list of DEBUG-SOURCE structures and backpatch +;;; all of the dumped DEBUG-INFO structures. We clear the +;;; FASL-OUTPUT-DEBUG-INFO, so that subsequent components with +;;; different source info may be dumped. +(defun fasl-dump-source-info (info file) + (declare (type sb-c::source-info info) (type fasl-output file)) + (let ((res (sb-c::debug-source-for-info info))) + (fasl-validate-structure res file) + (dump-object res file) + (let ((res-handle (dump-pop file))) + (dolist (info-handle (fasl-output-debug-info file)) + (dump-push res-handle file) + (symbol-macrolet + ((debug-info-source-index + (let ((dd (find-defstruct-description 'sb-c::debug-info))) + (dsd-index (find 'source (dd-slots dd) + :key #'dsd-name :test 'string=))))) + (dump-fop 'fop-structset file info-handle debug-info-source-index))))) + + (setf (fasl-output-debug-info file) nil) + (values)) ;;;; dumping structures diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index b836745a8a..2d05e8aa1f 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2854,6 +2854,14 @@ Legal values for OFFSET are -4, -8, -12, ..." (lookup-assembler-reference (car item))))) (apply-fixups (%fasl-input-stack (fasl-input)) asm-code n-fixups))) +;; The partial source info is not needed during the cold load, since +;; it can't be interrupted. +(define-cold-fop (fop-note-partial-source-info) + (pop-stack) + (pop-stack) + (pop-stack) + (values)) + ;;; Target variant of this is defined in 'target-load' (defun apply-fixups (fop-stack code-obj n-fixups) (let ((alloc-points (pop-fop-stack fop-stack))) diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 2e6b0d9d7c..53c2c6a006 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1799,8 +1799,7 @@ necessary, since type inference may take arbitrarily long to converge.") (handler-bind (((satisfies handle-condition-p) #'handle-condition-handler)) (with-compilation-values (with-compilation-unit () - (setf (sb-fasl::fasl-output-source-info *compile-object*) - (debug-source-for-info info)) + (fasl-dump-partial-source-info info *compile-object*) (with-ir1-namespace (with-source-paths (do-forms-from-info ((form current-index) info @@ -1813,7 +1812,13 @@ necessary, since type inference may take arbitrarily long to converge.") (process-toplevel-form form `(original-source-start 0 ,current-index) nil))) (finish-block-compilation) - (compile-toplevel-lambdas () t))) + (compile-toplevel-lambdas () t) + (let ((object *compile-object*)) + (etypecase object + (fasl-output (fasl-dump-source-info info object)) + #-sb-xc-host + (core-object (fix-core-source-info info object)) + (null))))) (let ((code-coverage-records (code-coverage-records (coverage-metadata *compilation*)))) (unless (zerop (hash-table-count code-coverage-records)) diff --git a/src/interpreter/sexpr.lisp b/src/interpreter/sexpr.lisp index 486a98115b..0748a830fc 100644 --- a/src/interpreter/sexpr.lisp +++ b/src/interpreter/sexpr.lisp @@ -1170,11 +1170,6 @@ Test case. (setf (debug-source-namestring source) (sb-kernel::function-file-namestring f) (debug-source-created source) nil) ; = unknown - ;; Clobber the TLF-NUM + OFFSET. We should do better that that, - ;; but interpreted functions do not track their file offset, - ;; so the conservative thing is to plug in NILs, not bogus values - ;; from whatever file (if any) is currently being loaded. - (setf (sb-c::compiled-debug-info-tlf-num+offset cdi) 0) ;; Skirt a package lock by avoiding (SETF SYMBOL-FUNCTION) ;; *technically* this should be a compare-and-swap to ensure that the ;; original lambda expression is as expected. To do that, we need diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index e3be16d637..546e802995 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -2824,10 +2824,11 @@ bootstrapping. (function-header (sb-kernel:fun-code-header function-object)) (debug-info (sb-kernel:%code-debug-info function-header)) (debug-source (sb-c::debug-info-source debug-info)) - (debug-fun (debug-info-debug-function function debug-info))) + (debug-fun (debug-info-debug-function function debug-info)) + (tlf (and debug-fun (sb-c::compiled-debug-fun-tlf-number debug-fun)))) (sb-c::%make-definition-source-location (sb-c::debug-source-namestring debug-source) - (sb-c::compiled-debug-info-tlf-number debug-info) + tlf (sb-c::compiled-debug-fun-form-number debug-fun)))) (debug-info-debug-function (function debug-info) diff --git a/tests/packed-varints.pure.lisp b/tests/packed-varints.pure.lisp index d61a5ee2c1..b15062d6da 100644 --- a/tests/packed-varints.pure.lisp +++ b/tests/packed-varints.pure.lisp @@ -9,25 +9,6 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -(with-test (:name :pack-compiled-debug-info-tlf-num+offset) - (flet ((test (a b) - (let ((cdi - (sb-c::make-compiled-debug-info - :name "test" :fun-map (sb-c::make-compiled-debug-fun :name 'test - :encoded-locs 0 - :allow-other-keys t - :return-pc 0 - :return-pc-pass 0 - :elsewhere-pc 0 - :old-fp 0) - :tlf-num+offset (let ((sb-c::*adjustable-vectors* nil)) - (sb-c::pack-tlf-num+offset a b))))) - (assert (eql a (sb-c::compiled-debug-info-tlf-number cdi))) - (assert (eql b (sb-c::compiled-debug-info-char-offset cdi)))))) - (dolist (i '(nil 0 1 2 313 542)) - (dolist (j '(nil 0 1 2 3 9898989 405344332)) - (test i j))))) - #+(and x86-64 immobile-space sb-unicode (not interpreter)) ; missing symbols otherwise (with-test (:name :bignum-unpacker-no-consing) (flet ((try () From fb4ac8f4b0065f0982201f1dee825d60b218e619 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Apr 2022 23:09:37 -0400 Subject: [PATCH 3234/4023] Remove cheneygc junk from target-lflist WITHOUT-GCING was too big a hammer for linked-list operations. Clarify that manipulating *PINNED-OBJECTS* is needed even for conservative platforms because the explicit pin has an extra effect of pinning the object seen by a possibly-untagged pointer in NODE-NEXT. --- src/code/target-lflist.lisp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/code/target-lflist.lisp b/src/code/target-lflist.lisp index caa263494b..20c39b4965 100644 --- a/src/code/target-lflist.lisp +++ b/src/code/target-lflist.lisp @@ -99,7 +99,7 @@ ;;; MAKE-MARKED-REF can only be called in the scope of WITH-PINNED-OBJECTS. ;;; The critical invariant is that once a 'next' pointer has been turned into ;;; a fixnum, it CAN NOT change. Therefore, the object that GC implicitly pins -;;; - along with the explicit pin of NODE within MARKED+NEXT - is definitely the +;;; - along with the explicit pin of NODE within GET-NEXT - is definitely the ;;; object whose tagged pointer is reconstructed. This is exactly why we choose ;;; the tagged state as the normal state and the untagged state as deleted. ;;; If that were reversed (so tag bits = deleted, no tag bits = normal) to be like @@ -114,14 +114,13 @@ (declaim (inline get-next)) (defun get-next (node) ;; Storing NODE in *PINNED-OBJECTS* causes its successor to become pinned. - (#+cheneygc sb-sys:without-gcing #+gencgc progn - (let* ((sb-vm::*pinned-objects* (cons node sb-vm::*pinned-objects*)) - (%next (%node-next node))) - (declare (truly-dynamic-extent sb-vm::*pinned-objects*)) - (values (truly-the list-node - (%make-lisp-obj (logior (get-lisp-obj-address %next) - sb-vm:instance-pointer-lowtag))) - %next)))) + (let* ((sb-vm::*pinned-objects* (cons node sb-vm::*pinned-objects*)) + (%next (%node-next node))) + (declare (truly-dynamic-extent sb-vm::*pinned-objects*)) + (values (truly-the list-node + (%make-lisp-obj (logior (get-lisp-obj-address %next) + sb-vm:instance-pointer-lowtag))) + %next))) (defmethod print-object ((list linked-list) stream) (print-unreadable-object (list stream :type t) @@ -251,6 +250,9 @@ (unless (fixnump succ) ;; Pin here because we're taking the address of the successor object. ;; Instead we could use bit-test-and-set on the x86 architecture. + ;; This is the ordinary WITH-PINNED-OBJECTS which manipulates + ;; *PINNED-OBJECTS* only if precise GC. Compare/contrast with + ;; GET-NEXT which _always_ binds *PINNED-OBJECTS*. (with-pinned-objects (succ) ;; Step 2: logically delete 'this' (when (eq (cas (%node-next this) succ (make-marked-ref succ)) succ) From 8fd8245e7c9f9bd01fde7958f2f8c15ccfd3f8d5 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 30 Apr 2022 23:36:51 -0700 Subject: [PATCH 3235/4023] Make sure to clear the memoized debug info slot. Accidentally deleted from the previous^2 change. --- src/code/save.lisp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/code/save.lisp b/src/code/save.lisp index c0978e2c46..084c69c021 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -500,6 +500,10 @@ sb-c:: (declare (ignore size)) (case widetag (#.sb-vm:code-header-widetag + (let ((di (sb-vm::%%code-debug-info obj))) + ;; Discard memoized debugger's debug info + (when (typep di 'sb-c::compiled-debug-info) + (setf (sb-c::compiled-debug-info-memo-cell di) nil))) (dotimes (i (sb-kernel:code-n-entries obj)) (let* ((fun (sb-kernel:%code-entry-point obj i)) (arglist (%simple-fun-arglist fun)) From f15e351a0b0ec255b247764cdf15343f08bc293d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 1 May 2022 07:21:52 -0400 Subject: [PATCH 3236/4023] Simplify zero_dirty_pages There are two approaches, both easier than before: * for #+darwin-jit, if any page in [start,end] has need_to_zero then call zero_range_with_mmap() once for the whole range. * for #-darwin-jit, call memset on a per-page basis In neither case do we operate on a strict subrange of [start,end] that is less than the entire range but more than one page. Removing the inner loop makes perfect sense because >90% of all requests to clear dirty pages are for a single page, and in the case of (MAKE-ARRAY 1000000 :INITIAL-ELEMENT NIL), the allocator needs to be redesigned to perform NIL-fill instead of 0-fill anyway. --- src/runtime/gencgc.c | 61 +++++++++++++------------------------------- 1 file changed, 18 insertions(+), 43 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 510c7d12b9..49c65be8b4 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -631,12 +631,6 @@ report_heap_exhaustion(long available, long requested, struct thread *th) } -#if defined LISP_FEATURE_X86 && !defined LISP_FEATURE_LINUX -void fast_bzero(void*, size_t); /* in <arch>-assem.S */ -#else -#define fast_bzero(addr, count) memset(addr, 0, count) -#endif - /* Zero the memory at ADDR for LENGTH bytes, but use mmap/munmap instead * of zeroing it ourselves, i.e. in practice give the memory back to the * OS. Generally done after a large GC. @@ -744,14 +738,9 @@ static inline void zero_pages(page_index_t start, page_index_t end) { #ifdef LISP_FEATURE_DARWIN_JIT zero_range_with_mmap(page_address(start), npage_bytes(1+end-start)); #else - fast_bzero(page_address(start), npage_bytes(1+end-start)); + memset(page_address(start), 0, npage_bytes(1+end-start)); #endif } -/* Zero the address range from START up to but not including END */ -static inline void zero_range(char* start, char* end) { - if (start < end) - fast_bzero(start, end-start); -} /* The generation currently being allocated to. */ static generation_index_t gc_alloc_generation; @@ -766,8 +755,6 @@ __attribute__((unused)) static const char * const page_type_description[8] = int mmap_does_not_zero; #endif void zero_dirty_pages(page_index_t start, page_index_t end, int page_type) { - page_index_t i, j; - // If allocating mixed pages to gen0 (or scratch which becomes gen0) then // this allocation is potentially going to be extended by lisp (if it happens to // pick up the tail of the page as its next available region) @@ -776,33 +763,23 @@ void zero_dirty_pages(page_index_t start, page_index_t end, int page_type) { // So we can avoid pre-zeroing all codes pages, all unboxed pages, // all strictly boxed pages, and all mixed pages allocated to gen>=1. + page_index_t i; #ifdef LISP_FEATURE_DARWIN_JIT /* Must always zero, as it may need changing the protection bits. */ - boolean must_zero = 1; + boolean any_need_to_zero = 0; + for (i = start; i <= end; i++) any_need_to_zero |= page_need_to_zero(i); + if (any_need_to_zero) zero_pages(start, end); #else boolean usable_by_lisp = gc_alloc_generation == 0 || (gc_alloc_generation == SCRATCH_GENERATION && from_space == 0); - boolean must_zero = - (page_type == PAGE_TYPE_MIXED && usable_by_lisp) || page_type == 0; -#endif - - if (must_zero) { - // look for contiguous ranges. This is probably without merit, since bzero - // does not go significantly faster for 2 pages than for 1 page and 1 page. - for (i = start; i <= end; i++) { - if (!page_need_to_zero(i)) continue; - // compute 'j' as the upper exclusive page index bound - for (j = i+1; (j <= end) && page_need_to_zero(j) ; j++) - ; /* empty body */ - zero_pages(i, j-1); - i = j; - } + if ((page_type == PAGE_TYPE_MIXED && usable_by_lisp) || page_type == 0) { + for (i = start; i <= end; i++) + if (page_need_to_zero(i)) zero_pages(i, i); } +#endif - for (i = start; i <= end; i++) { - set_page_need_to_zero(i, 1); - } + for (i = start; i <= end; i++) set_page_need_to_zero(i, 1); } @@ -1723,7 +1700,7 @@ static uword_t adjust_obj_ptes(page_index_t first_page, #endif /* It checks out OK, free the page. */ prev_bytes_used = page_bytes_used(page); - page_table[page].words_used_ = 0; + set_page_bytes_used(page, 0); reset_page_flags(page); bytes_freed += prev_bytes_used; page++; @@ -4317,11 +4294,6 @@ find_next_free_page(void) * If the interior of the aligned range is nonempty, * perform three operations: unmap/remap, fill before, fill after. * Otherwise, just one operation to fill the whole range. - * - * This will make more sense once we do a few other things: - * - enable manual card marking in codegen - * - disable mmap-based page protection - * - enable hugepages (so the OS page is much larger than a card) */ static void remap_page_range (page_index_t from, page_index_t to) @@ -4344,17 +4316,20 @@ remap_page_range (page_index_t from, page_index_t to) char* aligned_start = PTR_ALIGN_UP(start, granularity); char* aligned_end = PTR_ALIGN_DOWN(end, granularity); + /* NOTE: this is largely pointless because gencgc-release-granularity + * is everywhere defined to be EXACTLY +backend-page-bytes+ + * which by definition is the quantum at which we'll unmap/map. + * Maybe we should remove the needless complexity? */ if (aligned_start < aligned_end) { zero_range_with_mmap(aligned_start, aligned_end-aligned_start); - zero_range(start, aligned_start); - zero_range(aligned_end, end); + memset(start, 0, aligned_start - start); + memset(aligned_end, 0, end - aligned_end); } else { zero_pages(from, to); } #endif page_index_t i; - for (i = from; i <= to; i++) - set_page_need_to_zero(i, 0); + for (i = from; i <= to; i++) set_page_need_to_zero(i, 0); } static void From 4a79eccde567c3e0806f8c8cf485bfb4f3b5337b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 1 May 2022 07:25:46 -0400 Subject: [PATCH 3237/4023] Remove fast_bzero A suboptimal libc is not our problem, nor should it ever have been. --- src/runtime/bsd-os.c | 48 -------------- src/runtime/win32-os.c | 3 - src/runtime/x86-arch.h | 3 - src/runtime/x86-assem.S | 139 ---------------------------------------- 4 files changed, 193 deletions(-) diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 787800521b..2f16b8bc91 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -366,20 +366,6 @@ The system may fail to start.\n", } max_allocation_size = (os_vm_size_t)((rl.rlim_cur / 2) & ~(32 * 1024 * 1024)); - -#ifdef LISP_FEATURE_X86 - { - size_t len; - int sse; - - len = sizeof(sse); - if (sysctlbyname("machdep.sse", &sse, &len, - NULL, 0) == 0 && sse != 0) { - /* Use the SSE detector */ - fast_bzero_pointer = fast_bzero_detect; - } - } -#endif /* LISP_FEATURE_X86 */ } /* Various routines in NetBSD's C library are compatibility wrappers @@ -447,26 +433,6 @@ static void freebsd_init() else sig_memory_fault = SIGSEGV; #endif - - /* Quote from sbcl-devel (NIIMI Satoshi): "Some OSes, like FreeBSD - * 4.x with GENERIC kernel, does not enable SSE support even on - * SSE capable CPUs". Detect this situation and skip the - * fast_bzero sse/base selection logic that's normally done in - * x86-assem.S. - */ -#ifdef LISP_FEATURE_X86 - { - size_t len; - int instruction_sse; - - len = sizeof(instruction_sse); - if (sysctlbyname("hw.instruction_sse", &instruction_sse, &len, - NULL, 0) == 0 && instruction_sse != 0) { - /* Use the SSE detector */ - fast_bzero_pointer = fast_bzero_detect; - } - } -#endif /* LISP_FEATURE_X86 */ } #ifdef LISP_FEATURE_SB_FUTEX @@ -502,17 +468,6 @@ futex_wake(int *lock_word, int n) #ifdef __DragonFly__ static void dragonfly_init() { -#ifdef LISP_FEATURE_X86 - size_t len; - int instruction_sse; - - len = sizeof(instruction_sse); - if (sysctlbyname("hw.instruction_sse", &instruction_sse, &len, - NULL, 0) == 0 && instruction_sse != 0) { - /* Use the SSE detector */ - fast_bzero_pointer = fast_bzero_detect; - } -#endif /* LISP_FEATURE_X86 */ } @@ -628,9 +583,6 @@ openbsd_init() mib[1] = CPU_OSFXSR; size = sizeof (openbsd_use_fxsave); sysctl(mib, 2, &openbsd_use_fxsave, &size, NULL, 0); - if (openbsd_use_fxsave) - /* Use the SSE detector */ - fast_bzero_pointer = fast_bzero_detect; #endif /* OpenBSD, like NetBSD, counts mmap()ed space against the diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index f001b79c88..cc7e56803a 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -862,9 +862,6 @@ void os_init() GetSystemInfo(&system_info); os_vm_page_size = system_info.dwPageSize > BACKEND_PAGE_BYTES? system_info.dwPageSize : BACKEND_PAGE_BYTES; -#if defined(LISP_FEATURE_X86) - fast_bzero_pointer = fast_bzero_detect; -#endif os_number_of_processors = system_info.dwNumberOfProcessors; #ifdef LISP_FEATURE_X86_64 diff --git a/src/runtime/x86-arch.h b/src/runtime/x86-arch.h index 3d99035b58..05db5aba2e 100644 --- a/src/runtime/x86-arch.h +++ b/src/runtime/x86-arch.h @@ -16,9 +16,6 @@ #define ARCH_HAS_STACK_POINTER #define ALIEN_STACK_GROWS_DOWNWARD -extern void fast_bzero_detect(void *, size_t); -extern void (*fast_bzero_pointer)(void *, size_t); - /* When single stepping, single_stepping holds the original instruction * PC location. */ extern unsigned int *single_stepping; diff --git a/src/runtime/x86-assem.S b/src/runtime/x86-assem.S index f4070c5454..df19ace806 100644 --- a/src/runtime/x86-assem.S +++ b/src/runtime/x86-assem.S @@ -682,145 +682,6 @@ GNAME(post_signal_tramp): ret SIZE(GNAME(post_signal_tramp)) - -#ifndef LISP_FEATURE_LINUX - /* fast_bzero implementations and code to detect which implementation - * to use. - */ - - .globl GNAME(fast_bzero_pointer) - .data - .align align_16byte -GNAME(fast_bzero_pointer): - /* Variable containing a pointer to the bzero function to use. - * Initially points to a basic function. Change this variable - * to fast_bzero_detect if OS supports SSE. */ - .long GNAME(fast_bzero_base) - - .text - .align align_16byte,0x90 - .globl GNAME(fast_bzero) - TYPE(GNAME(fast_bzero)) -GNAME(fast_bzero): - /* Indirect function call */ - jmp *GNAME(fast_bzero_pointer) - SIZE(GNAME(fast_bzero)) - - - .text - .align align_16byte,0x90 - .globl GNAME(fast_bzero_detect) - TYPE(GNAME(fast_bzero_detect)) -GNAME(fast_bzero_detect): - /* Decide whether to use SSE, MMX or REP version */ - push %eax /* CPUID uses EAX-EDX */ - push %ebx - push %ecx - push %edx - mov $1, %eax - cpuid - test $0x04000000, %edx /* SSE2 needed for MOVNTDQ */ - jnz Lsse2 - /* Originally there was another case here for using the - * MOVNTQ instruction for processors that supported MMX but - * not SSE2. This turned out to be a loss especially on - * Athlons (where this instruction is apparently microcoded - * somewhat slowly). So for simplicity revert to REP STOSL - * for all non-SSE2 processors. - */ -Lbase: - movl $(GNAME(fast_bzero_base)), GNAME(fast_bzero_pointer) - jmp Lrestore -Lsse2: - movl $(GNAME(fast_bzero_sse)), GNAME(fast_bzero_pointer) - jmp Lrestore - -Lrestore: - pop %edx - pop %ecx - pop %ebx - pop %eax - jmp *GNAME(fast_bzero_pointer) - - SIZE(GNAME(fast_bzero_detect)) - - - .text - .align align_16byte,0x90 - .globl GNAME(fast_bzero_sse) - TYPE(GNAME(fast_bzero_sse)) - -GNAME(fast_bzero_sse): - /* A fast routine for zero-filling blocks of memory that are - * guaranteed to start and end at a 4096-byte aligned address. - */ - push %esi /* Save temporary registers */ - push %edi - mov 16(%esp), %esi /* Parameter: amount of bytes to fill */ - mov 12(%esp), %edi /* Parameter: start address */ - shr $6, %esi /* Amount of 64-byte blocks to copy */ - jz Lend_sse /* If none, stop */ - movups %xmm7, -16(%esp) /* Save XMM register */ - xorps %xmm7, %xmm7 /* Zero the XMM register */ - jmp Lloop_sse - .align align_16byte -Lloop_sse: - - /* Copy the 16 zeroes from xmm7 to memory, 4 times. MOVNTDQ is the - * non-caching double-quadword moving variant, i.e. the memory areas - * we're touching are not fetched into the L1 cache, since we're just - * going to overwrite the memory soon anyway. - */ - movntdq %xmm7, 0(%edi) - movntdq %xmm7, 16(%edi) - movntdq %xmm7, 32(%edi) - movntdq %xmm7, 48(%edi) - - add $64, %edi /* Advance pointer */ - dec %esi /* Decrement 64-byte block count */ - jnz Lloop_sse - movups -16(%esp), %xmm7 /* Restore the XMM register */ - sfence /* Ensure that weakly ordered writes are flushed. */ -Lend_sse: - mov 12(%esp), %esi /* Parameter: start address */ - prefetcht0 0(%esi) /* Prefetch the start of the block into cache, - * since it's likely to be used immediately. */ - pop %edi /* Restore temp registers */ - pop %esi - ret - SIZE(GNAME(fast_bzero_sse)) - - - .text - .align align_16byte,0x90 - .globl GNAME(fast_bzero_base) - TYPE(GNAME(fast_bzero_base)) - -GNAME(fast_bzero_base): - /* A fast routine for zero-filling blocks of memory that are - * guaranteed to start and end at a 4096-byte aligned address. - */ - push %eax /* Save temporary registers */ - push %ecx - push %edi - mov 20(%esp), %ecx /* Parameter: amount of bytes to fill */ - mov 16(%esp), %edi /* Parameter: start address */ - xor %eax, %eax /* Zero EAX */ - shr $2, %ecx /* Amount of 4-byte blocks to copy */ - jz Lend_base - - rep - stosl /* Store EAX to *EDI, ECX times, incrementing - * EDI by 4 after each store */ - -Lend_base: - pop %edi /* Restore temp registers */ - pop %ecx - pop %eax - ret - SIZE(GNAME(fast_bzero_base)) -#endif /* LISP_FEATURE_LINUX */ - /* When LISP_FEATURE_C_STACK_IS_CONTROL_STACK, we cannot safely scrub * the control stack from C, largely due to not knowing where the From 1ce8bcd6a823d4163f9edb62f8dfd0398d969e71 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 2 May 2022 00:21:42 +0300 Subject: [PATCH 3238/4023] Fix >=-fixnum-integer flags. Since the argument are switch around the flags need to be inverted. Fixes lp#1971088 --- src/compiler/arm64/type-vops.lisp | 4 ++-- src/compiler/x86-64/type-vops.lisp | 4 ++-- tests/arith.pure.lisp | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index 50e9cee9c1..28a2ccfbfa 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -362,10 +362,10 @@ (:variant :ge)) (define-vop (<=-fixnum-integer >-fixnum-integer) (:translate) - (:variant :le)) + (:variant :ge)) (define-vop (>=-fixnum-integer <-fixnum-integer) (:translate) - (:variant :ge)) + (:variant :le)) ;;; MOD type checks diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index d76846a2d7..f840eab242 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -748,7 +748,7 @@ (:variant :ge)) (define-vop (<=-fixnum-integer >-fixnum-integer) (:translate) - (:variant :le)) + (:variant :ge)) (define-vop (>=-fixnum-integer <-fixnum-integer) (:translate) - (:variant :ge)) + (:variant :le)) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index d2f270a5df..64e089b85d 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -1032,3 +1032,23 @@ a b)) (- a b)) (((- (expt 2 sb-vm:n-word-bits) 10) (- (expt 2 sb-vm:n-word-bits) 9)) -1))) + +(with-test (:name :>=-fixnum-integer) + (checked-compile-and-assert + () + `(lambda (a b) + (declare (fixnum a)) + (and (integerp b) + (>= a b))) + ((1 2) nil) + ((2 2) t) + ((3 2) t)) + (checked-compile-and-assert + () + `(lambda (a b) + (declare (fixnum a)) + (and (integerp b) + (<= a b))) + ((1 2) t) + ((2 2) t) + ((3 2) nil))) From 5bebd63c8e23d40468e03ba292b581478d5f86a6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 2 May 2022 01:41:40 +0300 Subject: [PATCH 3239/4023] Look through LETs when deciding if DX is allowed. E.g. (lambda () (declare (optimize (debug 2))) (let ((x (let ((z (make-array 3))) (setf (aref z 0) 10) (setf (aref z 0) 20) z))) (declare (dynamic-extent x)))) --- src/compiler/fndb.lisp | 4 ++-- src/compiler/ir1util.lisp | 24 ++++++++++++++---------- tests/dynamic-extent.pure.lisp | 20 ++++++++++++++++---- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index a50f87abcc..23e1084b1b 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -1888,9 +1888,9 @@ (always-translatable)) ;;; The lowest-level vector SET operators should not return a value. ;;; Functions built upon them may return the input value. -(defknown data-vector-set (array index t) (values) (always-translatable)) +(defknown data-vector-set (array index t) (values) (dx-safe always-translatable)) (defknown data-vector-set-with-offset (array fixnum fixnum t) (values) - (always-translatable)) + (dx-safe always-translatable)) (defknown hairy-data-vector-ref (array index) t (foldable)) (defknown hairy-data-vector-set (array index t) t ()) (defknown hairy-data-vector-ref/check-bounds (array index) t (foldable)) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index fb7d0a3f90..2f6897f921 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -894,12 +894,16 @@ (let* ((lvar (ref-lvar ref)) (dest (when lvar (lvar-dest lvar)))) (and (combination-p dest) - (eq :known (combination-kind dest)) - (awhen (combination-fun-info dest) - (or (ir1-attributep (fun-info-attributes it) dx-safe) - (and (not (combination-lvar dest)) - (awhen (fun-info-result-arg it) - (eql lvar (nth it (combination-args dest)))))))))) + (case (combination-kind dest) + (:known + (awhen (combination-fun-info dest) + (or (ir1-attributep (fun-info-attributes it) dx-safe) + (and (not (combination-lvar dest)) + (awhen (fun-info-result-arg it) + (eql lvar (nth it (combination-args dest)))))))) + (:local + (every #'trivial-lambda-var-ref-p + (lambda-var-refs (lvar-lambda-var lvar)))))))) (defun trivial-lambda-var-ref-p (use) (and (ref-p use) @@ -909,12 +913,12 @@ (neq (lambda-var-extent var) 'indefinite-extent)) (let ((home (lambda-var-home var)) (refs (lambda-var-refs var))) - ;; bound by a non-XEP system lambda, no other REFS that aren't + ;; bound by a non-XEP lambda, no other REFS that aren't ;; DX-SAFE, or are result-args when the result is discarded. - (when (and (lambda-system-lambda-p home) - (neq :external (lambda-kind home)) + (when (and (neq :external (lambda-kind home)) (dolist (ref refs t) - (unless (or (eq use ref) (ref-good-for-dx-p ref)) + (unless (or (eq use ref) + (ref-good-for-dx-p ref)) (return nil)))) ;; the LAMBDA this var is bound by has only a single REF, going ;; to a combination diff --git a/tests/dynamic-extent.pure.lisp b/tests/dynamic-extent.pure.lisp index 676096932f..0e77eb8e73 100644 --- a/tests/dynamic-extent.pure.lisp +++ b/tests/dynamic-extent.pure.lisp @@ -892,11 +892,11 @@ (b (list x y z)) (c (list a b))) (declare (dynamic-extent c)) - (values (first c) (second c)))) + (values a b))) (with-test (:name :let-converted-vars-dx-allocated-bug) - (multiple-value-bind (i j) (let-converted-vars-dx-allocated-bug 1 2 3) - (assert (and (equal i j) - (equal i (list 1 2 3)))))) + (multiple-value-bind (i j) (let-converted-vars-dx-allocated-bug-default 1 2 3) + (assert (equal i j)) + (assert (equal i (list 1 2 3))))) ;;; workaround for bug 419 -- real issue remains, but check that the ;;; bandaid holds. @@ -1694,3 +1694,15 @@ x))) (declare (dynamic-extent *))))) ((1) 1))) + +(with-test (:name :let-setf-aref) + (checked-compile + `(lambda () + (declare (optimize debug)) + (let ((x (let ((z (make-array 3))) + (setf (aref z 0) 10) + (setf (aref z 0) 20) + z))) + (declare (dynamic-extent x)) + (aref x 0))) + :allow-notes nil)) From 2678469c054ed5e78cd842ca982e0dd8de808ea8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 2 May 2022 00:51:45 +0300 Subject: [PATCH 3240/4023] Unroll FILL for very small vectors. --- src/compiler/seqtran.lisp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 7a4030fd44..bf2d6d9113 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -788,6 +788,25 @@ (cond ((eq *wild-type* element-ctype) (delay-ir1-transform node :constraint) `(vector-fill* seq item start end)) + ((and (array-type-p type) + (not (array-type-complexp type)) + (or (not start) + (and (constant-lvar-p start) + (eql (lvar-value start) 0))) + (not end) + (typep (array-type-dimensions type) '(cons number null)) + (<= (car (array-type-dimensions type)) + (cond #+soft-card-marks + ((eq element-ctype *universal-type*) + ;; Each write will have a store barrier, + ;; marking it pretty large. + 2) + (t + 10)))) + `(progn + ,@(loop for i below (car (array-type-dimensions type)) + collect `(setf (aref seq ,i) item)) + seq)) #+x86-64 ((and (type= element-ctype *universal-type*) (csubtypep (lvar-type seq) (specifier-type '(simple-array * (*)))) From 746f87ccd17e482b4f47d0990fbfa4ffdf386662 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 2 May 2022 00:36:51 -0700 Subject: [PATCH 3241/4023] Don't try to fold named constant references inside backquote anymore The gain for doing so was fairly marginal. The thing that really mattered with the change adding the folding was telling the difference between a named constant and anonymous constant inside the backq constant folder, for the sake of sane load form semantics. Not backq-constant-folding named constant references removes a load-form hack which also just doesn't work with deferred TLF processing, as the load form may get evaluated for value before the constant definition for the named constant is evaluated. --- src/compiler/generic/vm-ir2tran.lisp | 5 ++- src/compiler/seqtran.lisp | 50 +++++++++--------------- tests/backq-const-fold.impure-cload.lisp | 2 +- tests/block-compile.impure.lisp | 17 ++++++++ 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index 887e331584..601ed26d04 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -297,7 +297,10 @@ ;; Nonetheless it's far better than it was. In all other scenarios, don't pass ;; a constant TN, because we don't know that generated code is better. (cond #+x86-64 ; still moar cringe - ((and (or bit-vector-p simple-vector-p) (constant-lvar-p value)) + ((and (or bit-vector-p simple-vector-p) (constant-lvar-p value) + ;; check for constant named-ness to not + ;; trigger load form processing. + (not (leaf-has-source-name-p (nth-value 1 (lvar-value value))))) (funcall setter (tnify i) (emit-constant (lvar-value value)))) (t ;; FIXME: for simple-vector, fixnums should get stored via an ANY-REG diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index bf2d6d9113..0db4b348c2 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -2579,41 +2579,25 @@ (define-trimmer-transform string-trim t t)) -;;; We use this structure to facilitate named constant reference dumping inside -;;; constant folded backquoted structures. -#-sb-xc-host -(defstruct (named-constant-reference - (:constructor make-named-constant-reference (name))) - (name (missing-arg) :type symbol :read-only t)) - -#-sb-xc-host -(defmethod make-load-form ((object named-constant-reference) &optional environment) - (declare (ignore environment)) - (named-constant-reference-name object)) - -;;; Wrap the value of lvar-value if it comes from a named -;;; reference. For bootstrap reasons we don't do this during -;;; cross-compile. -(defun maybe-wrapped-lvar-value (lvar) - #+sb-xc-host - (lvar-value lvar) - #-sb-xc-host - (multiple-value-bind (value leaf) - (lvar-value lvar) - (if (leaf-has-source-name-p leaf) - (make-named-constant-reference (leaf-source-name leaf)) - value))) - -;;; Pop constant values from the end, list/list* them if any, and link -;;; the remainder with list* at runtime. + +;;; Pop anonymous constant values from the end, list/list* them if +;;; any, and link the remainder with list* at runtime. We don't try to +;;; fold named constant references, because while theoretically +;;; possible, in addition to needing to make a load form for a +;;; structure recording the constant name which wraps the constant +;;; value, the dumper would have to learn how to patch constant values +;;; into list structure, to deal with the load form potentially being +;;; evaluated for value earlier than the constant definition is +;;; loaded. (defun transform-backq-list-or-list* (function values) (let ((gensyms (make-gensym-list (length values))) (reverse (reverse values)) (constants '())) (loop while (and reverse - (constant-lvar-p (car reverse))) - do (push (maybe-wrapped-lvar-value (pop reverse)) - constants)) + (constant-lvar-p (car reverse)) + (not (leaf-has-source-name-p + (nth-value 1 (lvar-value (car reverse)))))) + do (push (lvar-value (pop reverse)) constants)) (if (null constants) `(lambda ,gensyms (,function ,@gensyms)) @@ -2644,8 +2628,10 @@ ;; might avoid consing intermediate lists if ,@ is involved ;; though I doubt it would provide benefit to many real-world scenarios. (dolist (elt elts) - (cond ((constant-lvar-p elt) - (push (maybe-wrapped-lvar-value elt) constants)) + (cond ((and (constant-lvar-p elt) + (not (leaf-has-source-name-p + (print (nth-value 1 (lvar-value elt)))))) + (push (lvar-value elt) constants)) (t (setq constants :fail) (return)))) diff --git a/tests/backq-const-fold.impure-cload.lisp b/tests/backq-const-fold.impure-cload.lisp index ea3f51ff47..f08f90d1f0 100644 --- a/tests/backq-const-fold.impure-cload.lisp +++ b/tests/backq-const-fold.impure-cload.lisp @@ -9,7 +9,7 @@ (make-instance 'foo))) ;;; The `(,+foo+) expression was being compile-time-folded to (#<foo -;;; xxxx>). Consequently it is unclear whether the #<foo> inside that +;;; xxxx>). Consequently it was unclear whether the #<foo> inside that ;;; list should require a load-form. We now track whether something ;;; comes from a named constant reference and dump the constant ;;; appropriately. diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index e5b636d1dd..eb3dad01d5 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -106,3 +106,20 @@ :block-compile t :load t) (assert (eq (bar) (symbol-value 'testconstant4)))) + + +(with-test (:name :block-defconstant-hairy-backq-dumping-test) + (ctu:file-compile + `((defconstant +stuff+ + (if (boundp '+stuff+) + (symbol-value '+stuff+) + '(0 0))) + + (defvar *backq-stuff* + `((0 ,(random 10)) + (,@+stuff+ 1 2 (3 . 4)) + (5 6 ,+stuff+)))) + :block-compile t + :before-load (lambda () (unintern (find-symbol "+STUFF+"))) + :load t) + (assert (= 0 (first (third (third (symbol-value '*backq-stuff*))))))) From 5890caab1aa26924a01484d27533c10b479b457e Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 2 May 2022 01:25:40 -0700 Subject: [PATCH 3242/4023] Whitespace. --- tests/block-compile.impure.lisp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index eb3dad01d5..c0043bf2d0 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -107,7 +107,6 @@ :load t) (assert (eq (bar) (symbol-value 'testconstant4)))) - (with-test (:name :block-defconstant-hairy-backq-dumping-test) (ctu:file-compile `((defconstant +stuff+ From 0b2e496a02ee577ce3bcc587b228065ebc7b4138 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 2 May 2022 10:11:11 -0400 Subject: [PATCH 3243/4023] Remove variance between +-64 bit for MUTEX-%OWNER As long as 32-bit has to be different, take advantage of the FIXNUM slot for either word size. Calling MUTEX-OWNER-LOOKUP no longer has to potentially cons a bignum, and GC doesn't need to parse the raw slot bitmap. --- src/code/target-thread.lisp | 2 +- src/code/thread-structs.lisp | 3 +-- src/code/thread.lisp | 7 +++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 973fefed9a..3e44d9f69b 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -262,7 +262,7 @@ an error in that case." ;;; of any thread from any thread would simplify other things in this file ;;; as well as making MUTEX-OWNER more efficient. (defun mutex-owner-lookup (vmthread) - ;; Convert the "fixnum-encoded" value to a normal integer for 32-bit. + ;; Convert the "fixnum-encoded" thread ID to a word. ;; It's possible that a race could cause find to fail. If the mutex ;; really has a dead thread as its owner, you've got bigger problems. ;; Moreover, because 'struct thread' can be recycled (very quickly) diff --git a/src/code/thread-structs.lisp b/src/code/thread-structs.lisp index ea87f88c07..dfdb8dd37b 100644 --- a/src/code/thread-structs.lisp +++ b/src/code/thread-structs.lisp @@ -37,8 +37,7 @@ ;; but the "funny fixnum" representation - i.e. N_WORD_BITS bits of significance, but ;; cast as fixnum when read - avoids consing on 32-bit builds, and also not all of them ;; implement RAW-INSTANCE-CAS which would be otherwise needed. - (%owner 0 :type #+64-bit sb-vm:word - #-64-bit fixnum)) + (%owner 0 :type fixnum)) (sb-xc:defstruct (waitqueue (:copier nil) (:constructor make-waitqueue (&key name))) "Waitqueue type." diff --git a/src/code/thread.lisp b/src/code/thread.lisp index df4b937313..a90477389c 100644 --- a/src/code/thread.lisp +++ b/src/code/thread.lisp @@ -43,13 +43,12 @@ stale value, use MUTEX-OWNER instead." (defmacro current-thread-sap-int () `(sap-int (current-thread-sap))) ;;; This is the same as thread-primitive-thread but using the "funny fixnum" -;;; representation on 32-bit so that we never cons when reading the slot. +;;; representation so that on 32-bit builds we never cons when reading the slot. ;;; I'm not sure where consing was happening, but it did, which caused ;;; failure of the (:no-consing :mutex) test. (defmacro current-vmthread-id () - #-64-bit '(%make-lisp-obj (current-thread-sap-int)) - #+64-bit '(current-thread-sap-int)) -(defmacro vmthread-id->addr (x) #-64-bit `(get-lisp-obj-address ,x) #+64-bit x) + '(sb-ext:truly-the fixnum (%make-lisp-obj (current-thread-sap-int)))) +(defmacro vmthread-id->addr (x) `(get-lisp-obj-address ,x)) (declaim (inline holding-mutex-p)) (defun holding-mutex-p (mutex) From d4779571f1146a620aee452f2b515961bb0c86fa Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Mon, 2 May 2022 10:50:07 -0700 Subject: [PATCH 3244/4023] Remove debugging statement. --- src/compiler/seqtran.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 0db4b348c2..5663c129d7 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -2630,7 +2630,7 @@ (dolist (elt elts) (cond ((and (constant-lvar-p elt) (not (leaf-has-source-name-p - (print (nth-value 1 (lvar-value elt)))))) + (nth-value 1 (lvar-value elt))))) (push (lvar-value elt) constants)) (t (setq constants :fail) From 6d754faed6987ae397772387c6deb74eaf4a1435 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 3 May 2022 00:20:16 +0300 Subject: [PATCH 3245/4023] Convert to CMOV branches jumping over a single move. e.g. (lambda (x y) (unless x (setf y 10)) y) --- src/compiler/arm64/pred.lisp | 19 +++++++++--- src/compiler/ir2opt.lisp | 58 ++++++++++++++++++++++++----------- src/compiler/x86-64/pred.lisp | 19 +++++++++--- 3 files changed, 70 insertions(+), 26 deletions(-) diff --git a/src/compiler/arm64/pred.lisp b/src/compiler/arm64/pred.lisp index 853af0468c..8b24ea4b16 100644 --- a/src/compiler/arm64/pred.lisp +++ b/src/compiler/arm64/pred.lisp @@ -76,10 +76,21 @@ tn) (t (make-representation-tn ptype scn))))) - (values vop - (make-tn x-tn) (make-tn y-tn) - (make-tn dst-tn) - nil))))))) + (cond ((eq dst-tn y-tn) + (values vop + (make-tn x-tn) y-tn + dst-tn + nil)) + ((eq dst-tn x-tn) + (values vop + x-tn (make-tn y-tn) + dst-tn + nil)) + (t + (values vop + (make-tn x-tn) (make-tn y-tn) + (make-tn dst-tn) + nil))))))))) (define-vop (move-if) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 805dd8947a..a7ee65ccd4 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -91,24 +91,46 @@ (defun cmovp (label a b) (declare (type label label) (type cblock a b)) - (cond ((eq label (ir2-block-%label (block-info a)))) - ((eq label (ir2-block-%label (block-info b))) - (rotatef a b)) - (t (return-from cmovp))) - (let ((succ-a (block-succ a)) - (succ-b (block-succ b))) - (when (and (singleton-p succ-a) - (singleton-p succ-b) - (eq (car succ-a) (car succ-b)) - (singleton-p (block-pred a)) - (singleton-p (block-pred b))) - (multiple-value-bind (value-a target) - (move-value-target (block-info a)) - (multiple-value-bind (value-b targetp) - (move-value-target (block-info b)) - (and value-a value-b (eq target targetp) - (values (block-label (car succ-a)) - target value-a value-b))))))) + (let ((a2 (block-info a)) + (b2 (block-info b))) + (cond ((eq label (ir2-block-%label a2))) + ((eq label (ir2-block-%label b2)) + (rotatef a b) + (rotatef a2 b2)) + (t (return-from cmovp))) + (let ((succ-a (block-succ a)) + (succ-b (block-succ b))) + (cond ((and (singleton-p succ-a) + (singleton-p succ-b) + (eq (car succ-a) (car succ-b)) + (singleton-p (block-pred a)) + (singleton-p (block-pred b))) + (multiple-value-bind (value-a target) + (move-value-target a2) + (multiple-value-bind (value-b targetp) + (move-value-target b2) + (and value-a value-b (eq target targetp) + (values (block-label (car succ-a)) + target value-a value-b))))) + ;; A branch jumping over a move. + ((and (singleton-p succ-a) + (singleton-p (block-pred a)) + (equal (car succ-a) + b)) + (multiple-value-bind (value target) + (move-value-target a2) + (when value + (values (block-label b) + target value target)))) + ((and (singleton-p succ-b) + (singleton-p (block-pred b)) + (equal (car succ-b) + a)) + (multiple-value-bind (value target) + (move-value-target b2) + (when value + (values (block-label a) + target target value)))))))) #-x86-64 (defun sb-vm::computable-from-flags-p (res x y flags) diff --git a/src/compiler/x86-64/pred.lisp b/src/compiler/x86-64/pred.lisp index 6c3707e88b..67ec29edfe 100644 --- a/src/compiler/x86-64/pred.lisp +++ b/src/compiler/x86-64/pred.lisp @@ -192,10 +192,21 @@ (if (eq (tn-kind tn) :constant) tn (make-tn)))) - (values vop - (frob-tn x-tn) (frob-tn y-tn) - (make-tn) - nil))))))) + (cond ((eq dst-tn y-tn) + (values vop + x-tn (frob-tn y-tn) + dst-tn + nil)) + ((eq dst-tn x-tn) + (values vop + (frob-tn x-tn) y-tn + dst-tn + nil)) + (t + (values vop + (frob-tn x-tn) (frob-tn y-tn) + (make-tn) + nil))))))))) (define-vop (move-if) (:args (then) (else)) From 170ba306e75a70b9254433c596c2d67405108013 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Mon, 2 May 2022 22:55:45 -0700 Subject: [PATCH 3246/4023] sb-cover: Fix regression. The new IR based implementation of mark compression was wrong as it just assumed that everything in a basic block could share one coverage mark. This isn't true, as function calls can cause arbitrary non-local exits. Even worse, an interrupt can fire anytime and cause a non-local exit, making the coverage information wrong... Let's assume that we don't need to handle this case, as otherwise hardly any marks could be compressed. --- NEWS | 2 ++ contrib/sb-cover/tests.lisp | 11 +++++++++++ src/compiler/coverage.lisp | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 74a0524444..32cf0e78c4 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ changes relative to sbcl-2.2.4: policy) and may load faster, especially on high debug. * enhancement: debug source locations now work correctly for top level forms with policy DEBUG = 1, as well as for block compiled files. + * bug fix: coverage instrumentation behaves correctly with respect to + non-local exits. changes in sbcl-2.2.4 relative to sbcl-2.2.3: * enhancement: better constraint propagation in the compiler. Specifically, diff --git a/contrib/sb-cover/tests.lisp b/contrib/sb-cover/tests.lisp index 0cfa905ed0..aa8eb349ea 100644 --- a/contrib/sb-cover/tests.lisp +++ b/contrib/sb-cover/tests.lisp @@ -133,6 +133,17 @@ (assert (= (sb-cover::ok-of (getf sb-cover::*counts* :expression)) (sb-cover::all-of (getf sb-cover::*counts* :expression)))) +;; Make sure we handle non-local exits from function calls correctly. +(sb-cover:clear-coverage) +(compile-load "test-data-5") +(outer) +(report) + +(assert (zerop (sb-cover::ok-of (getf sb-cover::*counts* :branch)))) +(assert (zerop (sb-cover::all-of (getf sb-cover::*counts* :branch)))) +(assert (= 12 (sb-cover::ok-of (getf sb-cover::*counts* :expression)))) +(assert (= 16 (sb-cover::all-of (getf sb-cover::*counts* :expression)))) + ;; Clean up after the tests (map nil #'delete-file (directory (merge-pathnames #p"*.html" *output-directory*))) diff --git a/src/compiler/coverage.lisp b/src/compiler/coverage.lisp index 0e41e98b1e..e7f6fdab42 100644 --- a/src/compiler/coverage.lisp +++ b/src/compiler/coverage.lisp @@ -28,10 +28,10 @@ (let ((path (source-path-original-source *current-path*))) (when mode (push mode path)) + ;; If this source path has already been instrumented in this + ;; block, don't instrument it again. (if (member (ctran-block start) (gethash path (code-coverage-blocks metadata))) - ;; If this source path has already been instrumented in - ;; this block, don't instrument it again. start (let ((next (make-ctran)) (*allow-instrumenting* nil)) @@ -57,8 +57,36 @@ (instrument-coverage start nil form)))) start)) +;;; Emit a coverage mark for NODE if there is a possibility that +;;; marking a previous coverage mark does not entail NODE's +;;; evaluation. We scan backwards in the block, looking for any +;;; intervening combinations between this node and another +;;; %MARK-COVERED. If the intervening combination is a combination for +;;; a LET or ASSIGNMENT lambda, then we don't need to emit a coverage +;;; mark, as the control flow has been made explicit in the CFG. +;;; KLUDGE: Technically we should stick with merging strictly adjacent +;;; emitted coverage marks in the IR2, as that would make coverage +;;; instrumentation interrupt safe as well. However, doing it this way +;;; produces much less instrumentation. (defoptimizer (%mark-covered ir2-convert) ((path) node block) (aver (constant-lvar-p path)) + (do ((prev (ctran-use (node-prev node)) + (ctran-use (node-prev prev))) + (start-node (block-start-node (ir2-block-block block)))) + ((eq prev start-node)) + (when (basic-combination-p prev) + (let ((kind (basic-combination-kind prev))) + (when (case kind + (:known + (when (eq (lvar-fun-name (basic-combination-fun prev) t) + '%mark-covered) + (return)) + t) + (:local + (functional-somewhat-letlike-p (combination-lambda prev))) + (t t)) + (setf (ir2-block-covered-paths-ref block) + (list nil)))))) (let ((2comp (component-info (node-component node)))) (unless (car (ir2-block-covered-paths-ref block)) (vop mark-covered node block From 7778efc0312bed6be3b0794864b9d5ef884b3f83 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Mon, 2 May 2022 23:27:44 -0700 Subject: [PATCH 3247/4023] Add missing file. --- contrib/sb-cover/test-data-5.lisp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 contrib/sb-cover/test-data-5.lisp diff --git a/contrib/sb-cover/test-data-5.lisp b/contrib/sb-cover/test-data-5.lisp new file mode 100644 index 0000000000..9dd1ccaf39 --- /dev/null +++ b/contrib/sb-cover/test-data-5.lisp @@ -0,0 +1,14 @@ +(declaim (optimize sb-c:store-coverage-data)) + +(defun outer () + (catch 'tag + (inner) + (print "returned from inner"))) + +(defun inner () + (print "inside inner") + (thrower) + (print "after thrower")) + +(defun thrower () + (throw 'tag :good)) From b67956b63897536565a5b0ebadb8698cfb2f1f9c Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 3 May 2022 17:39:53 +0300 Subject: [PATCH 3248/4023] traceroot.impure doesn't work on arm64-darwin. --- tests/traceroot.impure.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/traceroot.impure.lisp b/tests/traceroot.impure.lisp index 2f0b974cbb..394cd48948 100644 --- a/tests/traceroot.impure.lisp +++ b/tests/traceroot.impure.lisp @@ -16,7 +16,9 @@ ;;;; It's just that sometimes we get :PINNED as a root instead of ;;;; the expected reference to the one and only thread. ;;;; And also sb-safepoint gets a crash in C. -#-(and gencgc sb-thread (not sb-safepoint) (or arm64 ppc64 x86-64)) (sb-ext:exit :code 104) +#-(and gencgc sb-thread (not sb-safepoint) + (or (and arm64 (not darwin)) ppc64 x86-64)) +(sb-ext:exit :code 104) (setq sb-ext:*evaluator-mode* :compile) (defvar *fred*) From 0a6ab8a47fa6e2d1385516bbc3ae2aad451916e9 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Tue, 3 May 2022 15:20:23 -0700 Subject: [PATCH 3249/4023] sb-cover: Invert condition. --- src/compiler/coverage.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/coverage.lisp b/src/compiler/coverage.lisp index e7f6fdab42..e6f436ce9b 100644 --- a/src/compiler/coverage.lisp +++ b/src/compiler/coverage.lisp @@ -83,7 +83,7 @@ (return)) t) (:local - (functional-somewhat-letlike-p (combination-lambda prev))) + (not (functional-somewhat-letlike-p (combination-lambda prev)))) (t t)) (setf (ir2-block-covered-paths-ref block) (list nil)))))) From 2819913c1cd1a356c01adb92a2847dd00b476fe0 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 3 May 2022 19:28:50 -0700 Subject: [PATCH 3250/4023] Remove SB-FLUID. Main reason to remove it is that it's broken, but another reason is that people use #+SB-DEVEL now. Someone could add support for disabling inlining with SB-DEVEL if that's desired. --- make-target-2-load.lisp | 4 ++-- src/code/bignum.lisp | 2 +- src/code/cross-early.lisp | 7 ++----- src/code/target-random.lisp | 6 +++--- src/cold/base-target-features.lisp-expr | 9 --------- src/cold/compile-cold-sbcl.lisp | 3 +-- src/compiler/pack.lisp | 2 -- src/compiler/proclaim.lisp | 3 +-- src/compiler/target-disassem.lisp | 4 ++-- 9 files changed, 12 insertions(+), 28 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index baf7d81e37..7c2c874208 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -78,7 +78,7 @@ ;; Developer mode features. A release build will never have them, ;; hence it makes no difference whether they're public or not. :METASPACE - :SB-FLUID :SB-DEVEL :SB-DEVEL-LOCK-PACKAGES)"))) + :SB-DEVEL :SB-DEVEL-LOCK-PACKAGES)"))) (removable-features (append non-target-features public-features))) (defconstant sb-impl:+internal-features+ @@ -316,7 +316,7 @@ Please check that all strings which were not recognizable to the compiler ;; Unintern no-longer-needed stuff before the possible PURIFY in ;; SAVE-LISP-AND-DIE. - #-(or sb-fluid sb-devel) (!unintern-init-only-stuff) + #-sb-devel (!unintern-init-only-stuff) ;; Mark interned immobile symbols so that COMPILE-FILE knows ;; which symbols will always be physically in immobile space. diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index 88f6cdb530..f577d80f6b 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -304,7 +304,7 @@ (declare (type bignum result) (type bignum-length len) (muffle-conditions compiler-note) - #-sb-fluid (inline %normalize-bignum-buffer)) + (inline %normalize-bignum-buffer)) #+bignum-assertions (aver (= (%bignum-length result) len)) (let ((newlen (%normalize-bignum-buffer result len))) (declare (type bignum-length newlen)) diff --git a/src/code/cross-early.lisp b/src/code/cross-early.lisp index d17b7f9e85..8c95e2d1c5 100644 --- a/src/code/cross-early.lisp +++ b/src/code/cross-early.lisp @@ -12,14 +12,11 @@ (in-package "SB-IMPL") (defmacro sb-xc:declaim (&rest declaration-specifiers) - #+(or sb-devel sb-fluid) + #+sb-devel (setq declaration-specifiers (remove-if (lambda (declaration-specifier) (member (first declaration-specifier) - '(#+sb-fluid inline - #+sb-fluid maybe-inline - #+sb-fluid sb-ext:freeze-type - #+sb-devel start-block + '(#+sb-devel start-block #+sb-devel end-block))) declaration-specifiers)) `(cl:declaim ,@declaration-specifiers)) diff --git a/src/code/target-random.lisp b/src/code/target-random.lisp index 2ebb096f18..36cda367fa 100644 --- a/src/code/target-random.lisp +++ b/src/code/target-random.lisp @@ -420,9 +420,9 @@ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html (accept-reject-loop big-random-chunk)))))) (defun random (arg &optional (state *random-state*)) - #-sb-fluid (declare (inline %random-fixnum - %random-single-float %random-double-float - #+long-float %random-long-float)) + (declare (inline %random-fixnum + %random-single-float %random-double-float + #+long-float %random-long-float)) (declare (explicit-check)) (cond ((and (fixnump arg) (> arg 0)) diff --git a/src/cold/base-target-features.lisp-expr b/src/cold/base-target-features.lisp-expr index 3d32e423af..804e33b2f1 100644 --- a/src/cold/base-target-features.lisp-expr +++ b/src/cold/base-target-features.lisp-expr @@ -115,15 +115,6 @@ ;; run-time. ; :sb-qshow - ;; Setting this makes SBCL more "fluid", i.e. more amenable to - ;; modification at runtime, by suppressing various INLINE declarations, - ;; compiler macro definitions, FREEZE-TYPE declarations; and by - ;; suppressing various burning-our-ships-behind-us actions after - ;; initialization is complete; and so forth. This tends to clobber the - ;; performance of the system, so unless you have some special need for - ;; this when hacking SBCL itself, you don't want this set. - ; :sb-fluid - ;; Enable code for collecting statistics on usage of various operations, ;; useful for performance tuning of the SBCL system itself. This code ;; is probably pretty stale (having not been tested since the fork from diff --git a/src/cold/compile-cold-sbcl.lisp b/src/cold/compile-cold-sbcl.lisp index c3f6a3f998..5ceb7b0928 100644 --- a/src/cold/compile-cold-sbcl.lisp +++ b/src/cold/compile-cold-sbcl.lisp @@ -85,8 +85,7 @@ ;; optimizations. (ANSI says users aren't supposed to ;; redefine our functions anyway; and developers can ;; fend for themselves.) - (sb-ext:*derive-function-types* - (if (find :sb-fluid sb-xc:*features*) nil t)) + (sb-ext:*derive-function-types* t) ;; Let the target know that we're the cross-compiler. (sb-xc:*features* (cons :sb-xc sb-xc:*features*)) (*readtable* sb-cold:*xc-readtable*)) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index 8acf50d815..21862fd662 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -17,8 +17,6 @@ ;;; attempt (defvar *pack-assign-costs* t) (defvar *pack-optimize-saves* t) -;;; FIXME: Perhaps SB-FLUID should be renamed to SB-TWEAK and these -;;; should be made conditional on SB-TWEAK. (declaim (ftype (function (component) index) ir2-block-count)) diff --git a/src/compiler/proclaim.lisp b/src/compiler/proclaim.lisp index 19ff04174a..0c9eb50f72 100644 --- a/src/compiler/proclaim.lisp +++ b/src/compiler/proclaim.lisp @@ -542,7 +542,6 @@ #+sb-xc-host (error "Type system not yet initialized."))) (freeze-type - #-sb-fluid (map-args #'process-freeze-type-declaration)) ((start-block end-block) #-(and sb-devel sb-xc-host) @@ -575,7 +574,7 @@ ((disable-package-locks enable-package-locks) (setq *disabled-package-locks* (process-package-lock-decl form *disabled-package-locks*))) - ((#-sb-fluid inline notinline #-sb-fluid maybe-inline) + ((inline notinline maybe-inline) (map-args #'process-inline-declaration kind)) (deprecated (destructuring-bind (state since &rest things) args diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index 78f3b065f5..45e035342f 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -2727,8 +2727,8 @@ ;; nontrivial, the code-generating code is not so useful after the ;; initial instruction space is built, so it can all be removed. ;; But if you need all these macros to exist for some reason, - ;; then define one of the two following features to keep them: - #-(or sb-fluid sb-retain-assembler-macros) + ;; then define the following feature to keep them: + #-sb-retain-assembler-macros (do-symbols (symbol sb-assem::*backend-instruction-set-package*) (remf (symbol-plist symbol) 'arg-type) (remf (symbol-plist symbol) 'inst-format))) From 0c8ca5591660d63ab47dcab92265809db014b192 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 3 May 2022 20:26:44 -0700 Subject: [PATCH 3251/4023] Reduce the special cased list of valid structure types. Many of these were not needed. Why don't we just give these types a make-load-form method?? --- src/compiler/dump.lisp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 11a1abc8a2..b99443675d 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1172,6 +1172,7 @@ ;; Dump the debug info. (let ((info (sb-c::debug-info-for-component component))) + (fasl-validate-structure info fasl-output) (dump-object info fasl-output) (push (dump-to-table fasl-output) (fasl-output-debug-info fasl-output))) @@ -1359,9 +1360,8 @@ (defun dump-structure (struct file) (unless (or (gethash struct (fasl-output-valid-structures file)) - (typep struct - '(or sb-c::debug-info sb-c::debug-fun sb-c::debug-source - sb-c:definition-source-location sb-c::debug-name-marker))) + ;; Assume that DEBUG-FUNs are always valid to dump. + (typep struct 'sb-c::debug-fun)) (error "attempt to dump invalid structure:~% ~S~%How did this happen?" struct)) (note-potential-circularity struct file) From 82e252396e0c627a26ee949807618d59c4cb65f6 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 3 May 2022 23:03:07 -0700 Subject: [PATCH 3252/4023] Clear the IR1 namespace after component compilation. Not only does this reduce garbage retention for large compilations, but doing it this way helps ensure that we don't have any references to IR1 referring to stuff in an already compiled (i.e. "dead") component. We no longer need special logic just to clear specific outdated stuff (as in CLEAR-INVALID-FUNCTIONALS). Originally we must've done this, as this logic is present in CMU CL, but at some point clearing the IR1 namespace got removed and hence the invalid functional hack got added. I can't ascertain why the IR1 namespace clearing was removed in the first place. --- src/compiler/ir1tran.lisp | 47 --------------------------------------- src/compiler/main.lisp | 11 ++++++++- 2 files changed, 10 insertions(+), 48 deletions(-) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index c669b63be6..b483d31714 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -224,52 +224,6 @@ where (maybe-defined-here name where))))))) -;;; Have some DEFINED-FUN-FUNCTIONALS of a FREE-FUNS entry become invalid? -;;; Drop 'em. -;;; -;;; This was added to fix bug 138 in SBCL. It is possible for a FREE-FUNS -;;; entry to contain a DEFINED-FUN whose DEFINED-FUN-FUNCTIONAL object -;;; contained IR1 stuff (NODEs, BLOCKs...) referring to an already compiled -;;; (aka "dead") component. When this IR1 stuff was reused in a new component, -;;; under further obscure circumstances it could be used by -;;; WITH-IR1-ENVIRONMENT-FROM-NODE to generate a binding for -;;; *CURRENT-COMPONENT*. At that point things got all confused, since IR1 -;;; conversion was sending code to a component which had already been compiled -;;; and would never be compiled again. -;;; -;;; Note: as of 1.0.24.41 this seems to happen only in XC, and the original -;;; BUGS entry also makes it seem like this might not be an issue at all on -;;; target. -(defun clear-invalid-functionals (free-fun) - ;; There might be other reasons that FREE-FUN entries could - ;; become invalid, but the only one we've been bitten by so far - ;; (sbcl-0.pre7.118) is this one: - (when (defined-fun-p free-fun) - (setf (defined-fun-functionals free-fun) - (delete-if (lambda (functional) - (or (eq (functional-kind functional) :deleted) - (when (lambda-p functional) - (or - ;; (The main reason for this first test is to bail - ;; out early in cases where the LAMBDA-COMPONENT - ;; call in the second test would fail because links - ;; it needs are uninitialized or invalid.) - ;; - ;; If the BIND node for this LAMBDA is null, then - ;; according to the slot comments, the LAMBDA has - ;; been deleted or its call has been deleted. In - ;; that case, it seems rather questionable to reuse - ;; it, and certainly it shouldn't be necessary to - ;; reuse it, so we cheerfully declare it invalid. - (not (lambda-bind functional)) - ;; If this IR1 stuff belongs to a dead component, - ;; then we can't reuse it without getting into - ;; bizarre confusion. - (eq (component-info (lambda-component functional)) - :dead))))) - (defined-fun-functionals free-fun))) - nil)) - ;;; If NAME already has a valid entry in (FREE-FUNS *IR1-NAMESPACE*), then return ;;; the value. Otherwise, make a new GLOBAL-VAR using information from ;;; the global environment and enter it in FREE-FUNS. If NAME @@ -280,7 +234,6 @@ (defun find-free-fun (name context &aux (free-funs (free-funs *ir1-namespace*))) (or (let ((old-free-fun (gethash name free-funs))) (when old-free-fun - (clear-invalid-functionals old-free-fun) (when (or (not (defined-fun-p old-free-fun)) (not (block-compile *compilation*)) ;; When block-compiling, it is the case that we diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 53c2c6a006..48f1e3ca7a 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1275,6 +1275,14 @@ necessary, since type inference may take arbitrarily long to converge.") (mapc #'clear-ir1-info components-from-dfo) result)))))) +;;; Clear the global hash tables held in IR1-NAMESPACE. +(defun clear-ir1-namespace (ir1-namespace) + (clrhash (free-funs ir1-namespace)) + (clrhash (free-vars ir1-namespace)) + (clrhash (eql-constants ir1-namespace)) + (clrhash (named-constants ir1-namespace)) + (clrhash (similar-constants ir1-namespace))) + ;;; Print some noise about FORM if *COMPILE-PRINT* is true. (defun note-top-level-form (form) (when *compile-print* @@ -1693,7 +1701,8 @@ necessary, since type inference may take arbitrarily long to converge.") (compile-load-time-value-lambda lambdas) (compile-toplevel-lambdas lambdas top-level-closure))) - (mapc #'clear-ir1-info components)) + (mapc #'clear-ir1-info components) + (clear-ir1-namespace *ir1-namespace*)) (values)) ;;; Actually compile any stuff that has been queued up for block From a366a86179108e3bdc55f9d88bec8ba3a49e7d22 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 4 May 2022 11:08:19 -0400 Subject: [PATCH 3253/4023] Print #<THREAD> tersely I noticed that 'info.impure' generated an 8Mb log file from parallel-exec because sb-sprof (which gets enabled therein) summarizes the sampled threads. Some threads returned gigantic simple-vectors. Don't print those. --- src/code/target-thread.lisp | 1 + tests/threads.pure.lisp | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 3e44d9f69b..a801303242 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -197,6 +197,7 @@ a simple-string (not necessarily unique) or NIL.") (list "waiting on:" thing))))) ((eq values :aborted) '(:aborted)) (t :finished))) + (*print-array* nil) (*print-level* 4)) (format stream ;; if not finished, show the STATE as a list. diff --git a/tests/threads.pure.lisp b/tests/threads.pure.lisp index 040b6b4525..77769344cf 100644 --- a/tests/threads.pure.lisp +++ b/tests/threads.pure.lisp @@ -13,6 +13,11 @@ (use-package '("SB-EXT" "SB-THREAD")) +(with-test (:name :dont-print-array) + (let ((thr (sb-thread:make-thread (lambda () (make-array 100))))) + (sb-thread:join-thread thr) + (assert (search "#<(SIMPLE-VECTOR" (write-to-string thr))))) + (with-test (:name atomic-update :skipped-on (not :sb-thread)) (let ((x (cons :count 0)) From cb13594651a5db02b268844f5ffc2884b7ee2a15 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 4 May 2022 18:51:33 +0300 Subject: [PATCH 3254/4023] Recognize LENGTH for array-in-bounds-p constraints. Not just VECTOR-LENGTH. --- src/compiler/constraint.lisp | 2 +- tests/compiler-ir.pure.lisp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/compiler/constraint.lisp b/src/compiler/constraint.lisp index 81d85f9e19..be365509c4 100644 --- a/src/compiler/constraint.lisp +++ b/src/compiler/constraint.lisp @@ -680,7 +680,7 @@ (let ((use (principal-lvar-ref-use length-lvar))) (and (combination-p use) (lvar-fun-is (combination-fun use) - '(vector-length)) + '(vector-length length)) (car (combination-args use)))))) (when (and (or index-var index-constant) array-lvar) diff --git a/tests/compiler-ir.pure.lisp b/tests/compiler-ir.pure.lisp index 31106b30eb..e42ce088dd 100644 --- a/tests/compiler-ir.pure.lisp +++ b/tests/compiler-ir.pure.lisp @@ -79,6 +79,15 @@ :key (lambda (x) (combination-fun-source-name x nil))) 1))) +(with-test (:name :bounds-check-length) + (assert (= (count '%check-bound + (ir-calls + `(lambda (x y) + (when (< x (length y)) + (svref y x)))) + :key (lambda (x) (combination-fun-source-name x nil))) + 0))) + (with-test (:name :local-call-tail-call) (destructuring-bind (combination) (ir-full-calls `(lambda () From 0dab3ab3930c0603926275c81a6317ae35739212 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 4 May 2022 18:53:18 +0300 Subject: [PATCH 3255/4023] Disable a test on -sb-thread. --- tests/threads.pure.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/threads.pure.lisp b/tests/threads.pure.lisp index 77769344cf..3a3f50a85f 100644 --- a/tests/threads.pure.lisp +++ b/tests/threads.pure.lisp @@ -13,7 +13,8 @@ (use-package '("SB-EXT" "SB-THREAD")) -(with-test (:name :dont-print-array) +(with-test (:name :dont-print-array + :skipped-on (not :sb-thread)) (let ((thr (sb-thread:make-thread (lambda () (make-array 100))))) (sb-thread:join-thread thr) (assert (search "#<(SIMPLE-VECTOR" (write-to-string thr))))) From ceb4ff26008d3efde44a87c93053bda0bb82aa60 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 4 May 2022 12:33:45 -0400 Subject: [PATCH 3256/4023] Define SB-KERNEL:GENERATION-OF in make-host-2 --- src/code/gc.lisp | 45 +++++++++++++++++++++++++++++++++++++++------ src/code/room.lisp | 42 ++---------------------------------------- 2 files changed, 41 insertions(+), 46 deletions(-) diff --git a/src/code/gc.lisp b/src/code/gc.lisp index fe595068b9..381046a533 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -378,10 +378,8 @@ Note: currently changes to this value are lost when saving core." ;;;; GENCGC specifics ;;;; -#+gencgc -(progn - (define-symbol-macro sb-vm:dynamic-space-end + ;; FIXME: what uses this? Nothing? If so, remove it. (+ (dynamic-space-size) sb-vm:dynamic-space-start)) (define-alien-variable ("gc_logfile" %gc-logfile) (* char)) @@ -424,6 +422,42 @@ statistics are appended to it." (define-alien-variable generations (array generation #.(1+ sb-vm:+pseudo-static-generation+))) +;;; Why is PAGE-INDEX-T in SB-KERNEL but PAGE and the page table are in SB-VM? +(define-alien-type (struct sb-vm::page) + (struct sb-vm::page + ;; To cut down the size of the page table, the scan_start_offset + ;; - a/k/a "start" - is measured in 4-byte integers regardless + ;; of word size. This is fine for 32-bit address space, + ;; but if 64-bit then we have to scale the value. Additionally + ;; there is a fallback for when even the scaled value is too big. + (sb-vm::start #+64-bit (unsigned 32) #-64-bit signed) + ;; On platforms with small enough GC pages, this field + ;; will be a short. On platforms with larger ones, it'll + ;; be an int. It should probably never be an int. + (sb-vm::words-used (unsigned + #.(if (typep sb-vm::gencgc-page-words '(unsigned-byte 16)) + 16 + 32))) + (sb-vm::flags (unsigned 8)) ; in C this is {type, need_zerofill, pinned} + (sb-vm::gen (signed 8)))) +(define-alien-variable ("page_table" sb-vm:page-table) (* (struct sb-vm::page))) +(declaim (inline sb-vm:find-page-index)) +(define-alien-routine ("ext_find_page_index" sb-vm:find-page-index) page-index-t (address unsigned)) + +(defun generation-of (object) + (with-pinned-objects (object) + (let* ((addr (get-lisp-obj-address object)) + (page (sb-vm:find-page-index addr))) + (cond ((>= page 0) (slot (deref sb-vm:page-table page) 'sb-vm::gen)) + #+immobile-space + ((immobile-space-addr-p addr) + ;; SIMPLE-FUNs don't contain a generation byte + (when (simple-fun-p object) + (setq addr (get-lisp-obj-address (fun-code-header object)))) + (let ((sap (int-sap (logandc2 addr sb-vm:lowtag-mask)))) + (logand (if (fdefn-p object) (sap-ref-8 sap 1) (sap-ref-8 sap 3)) + #xF))))))) + (export 'page-protected-p) (macrolet ((addr->mark (addr) `(sap-ref-8 (extern-alien "gc_card_mark" system-area-pointer) @@ -496,7 +530,7 @@ Experimental: interface subject to change.") "Number of times garbage collection has been done on GENERATION without promotion. Available on GENCGC platforms only. -Experimental: interface subject to change.")) +Experimental: interface subject to change.") (defun generation-average-age (generation) "Average age of memory allocated to GENERATION: average number of times objects allocated to the generation have seen younger objects promoted to it. @@ -506,8 +540,7 @@ Experimental: interface subject to change." (declare (generation-index generation)) (alien-funcall (extern-alien "generation_average_age" (function double generation-index-t)) - generation)) -) + generation))) (macrolet ((cases () `(cond ((< (current-dynamic-space-start) addr diff --git a/src/code/room.lisp b/src/code/room.lisp index 91037cec8e..23a196bfc9 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -225,27 +225,8 @@ ;;; Access to the GENCGC page table for better precision in ;;; MAP-ALLOCATED-OBJECTS -#+gencgc +#+immobile-space (progn - (define-alien-type (struct page) - (struct page - ;; To cut down the size of the page table, the scan_start_offset - ;; - a/k/a "start" - is measured in 4-byte integers regardless - ;; of word size. This is fine for 32-bit address space, - ;; but if 64-bit then we have to scale the value. Additionally - ;; there is a fallback for when even the scaled value is too big. - (start #+64-bit (unsigned 32) #-64-bit signed) - ;; On platforms with small enough GC pages, this field - ;; will be a short. On platforms with larger ones, it'll - ;; be an int. It should probably never be an int. - (words-used (unsigned - #.(if (typep gencgc-page-words '(unsigned-byte 16)) - 16 - 32))) - (flags (unsigned 8)) ; in C this is {type, need_zerofill, pinned} - (gen (signed 8)))) - #+immobile-space - (progn (define-alien-type (struct immobile-page) ;; ... and yet another place for Lisp to become out-of-sync with C. (struct immobile-page @@ -257,11 +238,7 @@ (page-link (unsigned 16)) (prior-free-index (unsigned 16)))) (define-alien-variable "fixedobj_pages" (* (struct immobile-page)))) - (declaim (inline find-page-index)) - (define-alien-routine ("ext_find_page_index" find-page-index) - long (index unsigned)) - (define-alien-variable "next_free_page" sb-kernel::page-index-t) - (define-alien-variable "page_table" (* (struct page)))) +(define-alien-variable "next_free_page" sb-kernel::page-index-t) #+immobile-space (progn @@ -1206,21 +1183,6 @@ We could try a few things to mitigate this: (%make-lisp-obj varyobj-space-start) (%make-lisp-obj (sap-int *varyobj-space-free-pointer*)))))) -#+gencgc -(defun generation-of (object) - (with-pinned-objects (object) - (let* ((addr (get-lisp-obj-address object)) - (page (find-page-index addr))) - (cond ((>= page 0) (slot (deref page-table page) 'gen)) - #+immobile-space - ((immobile-space-addr-p addr) - ;; SIMPLE-FUNs don't contain a generation byte - (when (simple-fun-p object) - (setq addr (get-lisp-obj-address (fun-code-header object)))) - (let ((sap (int-sap (logandc2 addr lowtag-mask)))) - (logand (if (fdefn-p object) (sap-ref-8 sap 1) (sap-ref-8 sap 3)) - #xF))))))) - ;;; Show objects in a much simpler way than print-allocated-objects. ;;; Probably don't use this for generation 0 of dynamic space. Other spaces are ok. ;;; (And this is removed from the image; it's meant for developers) From 10616388a74f84f4c195f2ebd4feeb67ceff426f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 4 May 2022 18:58:17 +0300 Subject: [PATCH 3257/4023] Fix FreeBSD CI. --- .cirrus.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 791849ed5d..303a1c1bd0 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,9 +2,9 @@ freebsd_build_task: freebsd_instance: matrix: - image_family: freebsd-11-3-snap - image_family: freebsd-12-1-snap - # image_family: freebsd-13-0-snap + image_family: freebsd-12-3 + image_family: freebsd-13-0 + image_family: freebsd-14-0-snap cpu: 1 memory: 1G From 3bef54bde3b0b511cf8b0749639fc35249ff892e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 5 May 2022 00:49:09 +0300 Subject: [PATCH 3258/4023] Don't try to optimize TNs in convert-conditional-move-p. A move might still be needed for coercions. --- src/compiler/arm64/pred.lisp | 19 ++++--------------- src/compiler/x86-64/pred.lisp | 19 ++++--------------- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/src/compiler/arm64/pred.lisp b/src/compiler/arm64/pred.lisp index 8b24ea4b16..853af0468c 100644 --- a/src/compiler/arm64/pred.lisp +++ b/src/compiler/arm64/pred.lisp @@ -76,21 +76,10 @@ tn) (t (make-representation-tn ptype scn))))) - (cond ((eq dst-tn y-tn) - (values vop - (make-tn x-tn) y-tn - dst-tn - nil)) - ((eq dst-tn x-tn) - (values vop - x-tn (make-tn y-tn) - dst-tn - nil)) - (t - (values vop - (make-tn x-tn) (make-tn y-tn) - (make-tn dst-tn) - nil))))))))) + (values vop + (make-tn x-tn) (make-tn y-tn) + (make-tn dst-tn) + nil))))))) (define-vop (move-if) diff --git a/src/compiler/x86-64/pred.lisp b/src/compiler/x86-64/pred.lisp index 67ec29edfe..6c3707e88b 100644 --- a/src/compiler/x86-64/pred.lisp +++ b/src/compiler/x86-64/pred.lisp @@ -192,21 +192,10 @@ (if (eq (tn-kind tn) :constant) tn (make-tn)))) - (cond ((eq dst-tn y-tn) - (values vop - x-tn (frob-tn y-tn) - dst-tn - nil)) - ((eq dst-tn x-tn) - (values vop - (frob-tn x-tn) y-tn - dst-tn - nil)) - (t - (values vop - (frob-tn x-tn) (frob-tn y-tn) - (make-tn) - nil))))))))) + (values vop + (frob-tn x-tn) (frob-tn y-tn) + (make-tn) + nil))))))) (define-vop (move-if) (:args (then) (else)) From 168dc60ef8abe9eebf9143f55e1bd8e9f9c27dc4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 4 May 2022 19:17:28 -0400 Subject: [PATCH 3259/4023] Stop building redblack tree into pristine core Though keep it and test it because it might yet be useful --- src/code/redblack.lisp | 17 +++++++++++++---- src/cold/build-order.lisp-expr | 3 +-- src/cold/exports.lisp | 14 -------------- src/compiler/generic/layout-ids.lisp | 3 --- tests/input-manifest.lisp-expr | 3 +++ ...{redblack.pure.lisp => redblack.impure.lisp} | 2 ++ 6 files changed, 19 insertions(+), 23 deletions(-) rename tests/{redblack.pure.lisp => redblack.impure.lisp} (99%) diff --git a/src/code/redblack.lisp b/src/code/redblack.lisp index 71cc6af4db..e310cb181d 100644 --- a/src/code/redblack.lisp +++ b/src/code/redblack.lisp @@ -9,8 +9,6 @@ ;;;; provided with absolutely no warranty. See the COPYING and CREDITS ;;;; files for more information. -(in-package "SB-RBTREE") - ;;; For testing ;;; (declaim (optimize sb-c:store-coverage-data)) @@ -23,6 +21,19 @@ ;;; http://matt.might.net/papers/germane2014deletion.pdf ;;; which I found to be less simple when translated from Haskell. +(defpackage "SB-RBTREE" + (:use "CL" "SB-INT" "SB-EXT")) +(defpackage "SB-RBTREE.WORD" + (:use "CL") + (:shadow "DELETE") + (:export "INSERT" "DELETE")) +(defpackage "SB-RBTREE.MAP" + (:use "CL") + (:shadow "DELETE") + (:export "INSERT" "DELETE")) + +(in-package "SB-RBTREE") + (defmacro define-tree-class (&key key-type value-type (lessp '<) &aux (data-type (if value-type 'cons key-type)) (name (intern "RBNODE")) @@ -239,8 +250,6 @@ ((,lessp (node-key node) key) (recurse (right node) best)) (t node)))))))) -(mapc 'unintern '(define-tree-class define-search-methods)) - ;;; Each specialization of the structure is in its own package. ;;; This may not be the best way to do it. ;;; I was hoping that the FLET of BALANCE would eliminate consing when passing diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index a52dbeb805..39afc02d73 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -606,8 +606,7 @@ ("src/code/format") ; needs SB-XC:DEFMACRO ("src/code/target-format" :not-host) - ("src/code/late-globaldb" :not-host) - ("src/code/redblack" :not-host)) + ("src/code/late-globaldb" :not-host)) ;;; make-target-2 build steps (("src/code/early-ntrace" ; lets PCL hook into tracing diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index a57f84db84..39a3404b1a 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -3531,20 +3531,6 @@ package is deprecated in favour of SB-MOP.") "CLASS-NOT-FOUND-ERROR" "SPECIALIZER-NAME-SYNTAX-ERROR")) -(defpackage* "SB-RBTREE" - (:documentation "internal: red/black tree") - (:use "CL" "SB-INT" "SB-EXT")) -(defpackage* "SB-RBTREE.WORD" - (:documentation nil) - (:use "CL") - (:shadow "DELETE") - (:export "INSERT" "DELETE")) -(defpackage* "SB-RBTREE.MAP" - (:documentation nil) - (:use "CL") - (:shadow "DELETE") - (:export "INSERT" "DELETE")) - (defpackage* "SB-LOCKLESS" (:documentation "internal: lockfree lists") (:use "CL" "SB-INT" "SB-EXT" "SB-SYS" "SB-KERNEL") diff --git a/src/compiler/generic/layout-ids.lisp b/src/compiler/generic/layout-ids.lisp index ed6792ddaa..6ed5d76feb 100644 --- a/src/compiler/generic/layout-ids.lisp +++ b/src/compiler/generic/layout-ids.lisp @@ -30,7 +30,6 @@ SB-C::FUNCTIONAL SB-C::LEAF SB-KERNEL:ANSI-STREAM SB-C::IR2-BLOCK -SB-RBTREE::RBNODE SB-C::VALUED-NODE RANDOM-STATE CAST @@ -40,7 +39,6 @@ SB-SYS:FD-STREAM SB-C::BASIC-COMBINATION SB-INT:SSET-ELEMENT SB-C:TN-REF -SB-RBTREE::RED-NODE SB-KERNEL:ARGS-TYPE SB-C::VOP SB-C:STORAGE-CLASS @@ -48,7 +46,6 @@ SB-KERNEL:LEXENV SB-ASSEM::ANNOTATION SB-KERNEL:INTERSECTION-TYPE SB-C:PRIMITIVE-TYPE -SB-RBTREE::BLACK-NODE #+sb-fasteval SB-INTERPRETER:BASIC-ENV SB-KERNEL:NUMERIC-TYPE SB-KERNEL:CLASSOID diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 13f434bf1d..5a4246b5ae 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -8,6 +8,9 @@ ("bit-vector.impure.lisp" "contrib/sb-posix.fasl") ("brothertree.impure.lisp" "src/code/brothertree.lisp") + ("redblack.impure.lisp" + "tests/bbtree-test-util.lisp" + "src/code/redblack.lisp") ("case.pure.lisp" "tests/case-test.lisp") ("chill.test.sh" "src/cold/chill.lisp" diff --git a/tests/redblack.pure.lisp b/tests/redblack.impure.lisp similarity index 99% rename from tests/redblack.pure.lisp rename to tests/redblack.impure.lisp index 57bd740245..362a28b2e6 100644 --- a/tests/redblack.pure.lisp +++ b/tests/redblack.impure.lisp @@ -1,5 +1,7 @@ ;;;; Tests +(let ((*evaluator-mode* :compile)) (load "../src/code/redblack.lisp")) + (add-package-local-nickname "REDBLACK" "SB-RBTREE.MAP") (use-package 'sb-int) (import 'sb-rbtree::(red black)) From 3c84bea2e4d760f10b738750b0d06be4de69fb9b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 4 May 2022 19:37:43 -0400 Subject: [PATCH 3260/4023] Assign 1-byte layout IDs to a few more layouts --- src/compiler/generic/genesis.lisp | 35 ++--------------- src/compiler/generic/layout-ids.lisp | 36 +++++++++++++++++ src/interpreter/basic-env.lisp | 58 ++++++++++++++++++++++++++++ src/interpreter/env.lisp | 54 -------------------------- src/pcl/boot.lisp | 5 --- src/pcl/low.lisp | 7 ++++ src/runtime/gc-private.h | 3 +- 7 files changed, 106 insertions(+), 92 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 2d05e8aa1f..71c10e10db 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1220,36 +1220,6 @@ core and return a descriptor to it." descriptor) make-cold-layout)) -(defvar *general-layout-uniqueid-counter* ; incremented before use - (ecase sb-kernel::layout-id-type - (signed-byte 127) ; predefined IDs range from -128 to 127 - (unsigned-byte 255))) ; all IDs are unsigned integers -;;; Conditions are numbered from -128 downward, -;;; but only if layout IDs can be negative. -(defvar *condition-layout-uniqueid-counter* -128) ; decremented before use - -(defun choose-layout-id (name conditionp) - ;; If you change these, then also change src/runtime/gc-private.h - ;; The ID of T is irrelevant since we'll never try to compare to it. - (case name - ((t) 0) - (structure-object 1) - #+metaspace (wrapper 2) - (#+metaspace sb-vm:layout #-metaspace wrapper 3) - (sb-lockless::list-node 4) - (t (or (cdr (assq name sb-kernel::*popular-structure-types*)) - (ecase sb-kernel::layout-id-type - (unsigned-byte - (incf *general-layout-uniqueid-counter*)) - (signed-byte - (if conditionp - ;; It doesn't really matter what ID is assigned to a CONDITION subtype - ;; because we don't use the IDs for type testing. Nor for standard-object. - ;; But I'd like to a have a quick visual scan of the IDs assigned during - ;; genesis by giving them negative values which can't otherwise occur. - (decf *condition-layout-uniqueid-counter*) - (incf *general-layout-uniqueid-counter*)))))))) - (defun cold-wrapper-id (wrapper-descriptor) (let* ((layout-descriptor (->layout wrapper-descriptor)) (proxy (gethash (descriptor-bits layout-descriptor) *cold-layout-by-addr*))) @@ -1275,7 +1245,7 @@ core and return a descriptor to it." (or (awhen (gethash 'wrapper *cold-layouts*) (cold-layout-descriptor it)) (make-fixnum-descriptor 0)))) - (this-id (choose-layout-id name (logtest flags +condition-layout-flag+))) + (this-id (sb-kernel::choose-layout-id name (logtest flags +condition-layout-flag+))) (hash (make-fixnum-descriptor (sb-impl::hash-layout-name name)))) (let ((proxy (%make-cold-layout :id this-id @@ -1900,7 +1870,8 @@ core and return a descriptor to it." ;; increment, so we need to add 1 to get to the next value for it because ;; we always pre-increment *general-layout-uniqueid-counter* when reading it. (cold-set 'sb-kernel::*layout-id-generator* - (cold-list (make-fixnum-descriptor (1+ *general-layout-uniqueid-counter*)))) + (cold-list (make-fixnum-descriptor + (1+ sb-kernel::*general-layout-uniqueid-counter*)))) (cold-set 'sb-c::*!initial-parsed-types* (vector-in-core (mapcar (lambda (x) diff --git a/src/compiler/generic/layout-ids.lisp b/src/compiler/generic/layout-ids.lisp index 6ed5d76feb..c9923cbb67 100644 --- a/src/compiler/generic/layout-ids.lisp +++ b/src/compiler/generic/layout-ids.lisp @@ -24,8 +24,10 @@ (defparameter *popular-structure-types* (mapcar 'list '( SB-KERNEL:CTYPE HASH-TABLE +SB-IMPL::GENERAL-HASH-TABLE SB-C::NODE SB-C::GLOBAL-CONFLICTS +SB-C::GLOBAL-VAR SB-C::FUNCTIONAL SB-C::LEAF SB-KERNEL:ANSI-STREAM @@ -41,6 +43,7 @@ SB-INT:SSET-ELEMENT SB-C:TN-REF SB-KERNEL:ARGS-TYPE SB-C::VOP +SB-C:STORAGE-BASE SB-C:STORAGE-CLASS SB-KERNEL:LEXENV SB-ASSEM::ANNOTATION @@ -64,6 +67,7 @@ SB-KERNEL:ARRAY-TYPE SB-KERNEL:COMPOUND-TYPE SB-KERNEL:NEGATION-TYPE SB-REGALLOC::VERTEX +SB-THREAD:THREAD SB-THREAD::AVLNODE SB-C::ABSTRACT-LEXENV SB-KERNEL:UNKNOWN-TYPE @@ -199,6 +203,8 @@ SB-ALIEN-INTERNALS:ALIEN-ENUM-TYPE SB-INT:DEPRECATION-INFO SB-DI::FUN-END-COOKIE SB-ALIEN::SHARED-OBJECT +SB-PCL::FAST-METHOD-CALL +SB-C::DXABLE-ARGS ))) ;;; The rationale for using (signed-byte 8) for small IDs on the x86 @@ -236,3 +242,33 @@ SB-ALIEN::SHARED-OBJECT (rplacd item id) (setq id (if (= id -1) 5 ; hop over the wired IDs (1+ id))))))) + +(defvar *general-layout-uniqueid-counter* ; incremented before use + (ecase sb-kernel::layout-id-type + (signed-byte 127) ; predefined IDs range from -128 to 127 + (unsigned-byte 255))) ; all IDs are unsigned integers +;;; Conditions are numbered from -128 downward, +;;; but only if layout IDs can be negative. +(defvar *condition-layout-uniqueid-counter* -128) ; decremented before use + +(defun choose-layout-id (name conditionp) + ;; If you change these, then also change src/runtime/gc-private.h + ;; The ID of T is irrelevant since we'll never try to compare to it. + (case name + ((t) 0) + (structure-object 1) + #+metaspace (wrapper 2) + (#+metaspace sb-vm:layout #-metaspace wrapper 3) + (sb-lockless::list-node 4) + (t (or (cdr (assq name sb-kernel::*popular-structure-types*)) + (ecase sb-kernel::layout-id-type + (unsigned-byte + (incf *general-layout-uniqueid-counter*)) + (signed-byte + (if conditionp + ;; It doesn't really matter what ID is assigned to a CONDITION subtype + ;; because we don't use the IDs for type testing. Nor for standard-object. + ;; But I'd like to a have a quick visual scan of the IDs assigned during + ;; genesis by giving them negative values which can't otherwise occur. + (decf *condition-layout-uniqueid-counter*) + (incf *general-layout-uniqueid-counter*)))))))) diff --git a/src/interpreter/basic-env.lisp b/src/interpreter/basic-env.lisp index 688a34f4b5..5dd6e11b68 100644 --- a/src/interpreter/basic-env.lisp +++ b/src/interpreter/basic-env.lisp @@ -77,3 +77,61 @@ ;; as heck, since ENV-LEXENV could be reasonably construed as the function ;; that returns a compiler LEXENV corresponding to this BASIC-ENV. (contour nil :type decl-scope :read-only t)) + +;;; Some of these structures could be defined in warm load, but then they +;;; couldn't benefit from the assignment of a single-byte layout ID. +;;; (After self-build is complete, layout-ids are always 4 bytes.) + +;; Binding frame specification for LET and LET* +;; This is a prototype stack-frame rather than a runtime stack frame in that +;; one exists per syntactic form, not per dynamic invocation of same. +(defstruct (frame (:include decl-scope) + (:copier nil) (:predicate nil) + (:constructor make-let-frame + (declarations %policy + symbols special-b values sexpr specials))) + ;; If more symbols exist than values, the remainder are free specials. + (symbols nil :read-only t :type simple-vector) + ;; Bitmask over symbols. 1 in bit N means bind the Nth symbol as special. + (special-b nil :read-only t :type integer) + ;; A let frame can't have zero values. (It would be converted to LOCALLY) + (values nil :read-only t :type simple-vector) + (sexpr nil :read-only t) ; code to execute + ;; To avoid reconstituting the first PROGV operand from the special-b mask + ;; and vector of all bound symbols, store the bound specials as follows: + ;; for LET - a list of all bound specials + ;; for LET* - a list of singleton lists of bound specials + ;; for LAMBDA - possibly both of the preceding: a list for mandatory args + ;; and lists of singleton lists for &optional/&rest/&key. + (specials nil :read-only t)) + +;;; LET and LET* share the same frame structure +(defstruct (let*-frame + (:include frame) (:predicate nil) (:copier nil) + (:constructor make-let*-frame + (declarations %policy symbols special-b + values sexpr specials)))) + +;; Fancy binding frame specification +(defstruct (lambda-frame (:include let*-frame) (:predicate nil) (:copier nil)) + ;; Unlike for a LET* frame the count of bound values can not be determined + ;; from the length of the VALUES vector, which contains various extra markers + ;; dictating how the arguments are to be parsed. + (n-bound-vars 0 :read-only t :type fixnum) + ;; Number of mandatory and optional arguments. + (min-args 0 :read-only t :type fixnum) + (n-optional 0 :read-only t :type fixnum) + ;; Packed flags indicating presence of &REST/&KEY/&ALLOW-OTHER-KEYS. + (keyword-bits 0 :read-only t :type fixnum) + ;; A BLOCK name in which to wrap the lambda's evaluable forms. + ;; This behaves exactly the same as using a block-env around the forms, + ;; however a lambda-env consumes only 8 words plus 2 for the freshly consed + ;; catch tag; whereas a var-env + block-env would consume 6 + 6 + 2, which + ;; entails 40% more overhead to enter the most trivial interpreted function. + (block-name 0 :read-only t :type (or (eql 0) symbol)) + ;; SHARE-BLOCK-P is T if BLOCK-NAME can be created concurrently + ;; with variable bindings. If NIL when a block-name is present, + ;; then another environment is allocated to enclose the block, + ;; which is not as big a win as combining the block-env and var-env, + ;; but still beneficial as it avoids separately calling the block handler. + (share-block-p nil :read-only t :type boolean)) diff --git a/src/interpreter/env.lisp b/src/interpreter/env.lisp index 7ff9ed5c85..178d9d3ff8 100644 --- a/src/interpreter/env.lisp +++ b/src/interpreter/env.lisp @@ -163,42 +163,12 @@ ;;; "scope" and "frame" are basically synonymous here. ;;; The existence of both terms is a minor accident. -;; Binding frame specification for LET and LET* -;; This is a prototype stack-frame rather than a runtime stack frame in that -;; one exists per syntactic form, not per dynamic invocation of same. -(defstruct (frame (:include decl-scope) - (:copier nil) (:predicate nil) - (:constructor make-let-frame - (declarations %policy - symbols special-b values sexpr specials))) - ;; If more symbols exist than values, the remainder are free specials. - (symbols nil :read-only t :type simple-vector) - ;; Bitmask over symbols. 1 in bit N means bind the Nth symbol as special. - (special-b nil :read-only t :type integer) - ;; A let frame can't have zero values. (It would be converted to LOCALLY) - (values nil :read-only t :type simple-vector) - (sexpr nil :read-only t) ; code to execute - ;; To avoid reconstituting the first PROGV operand from the special-b mask - ;; and vector of all bound symbols, store the bound specials as follows: - ;; for LET - a list of all bound specials - ;; for LET* - a list of singleton lists of bound specials - ;; for LAMBDA - possibly both of the preceding: a list for mandatory args - ;; and lists of singleton lists for &optional/&rest/&key. - (specials nil :read-only t)) - (defmethod print-object ((self frame) stream) (print-unreadable-object (self stream :type t :identity t))) (declaim (inline frame-size)) (defun frame-size (frame) (length (frame-values frame))) -;;; A LET* frame is just like a LET frame. -(defstruct (let*-frame - (:include frame) (:predicate nil) (:copier nil) - (:constructor make-let*-frame - (declarations %policy symbols special-b - values sexpr specials)))) - ;;; BASIC-ENV stores a policy for its body, but if evaluation has not reached ;;; the body forms of a LET*, then the old policy is in effect. This is due to ;;; the need for presenting a consistent view of the policy, but a frozen ENV @@ -215,30 +185,6 @@ (env-policy (env-parent env)) policy))))) -;; Fancy binding frame specification -(defstruct (lambda-frame (:include let*-frame) (:predicate nil) (:copier nil)) - ;; Unlike for a LET* frame the count of bound values can not be determined - ;; from the length of the VALUES vector, which contains various extra markers - ;; dictating how the arguments are to be parsed. - (n-bound-vars 0 :read-only t :type fixnum) - ;; Number of mandatory and optional arguments. - (min-args 0 :read-only t :type fixnum) - (n-optional 0 :read-only t :type fixnum) - ;; Packed flags indicating presence of &REST/&KEY/&ALLOW-OTHER-KEYS. - (keyword-bits 0 :read-only t :type fixnum) - ;; A BLOCK name in which to wrap the lambda's evaluable forms. - ;; This behaves exactly the same as using a block-env around the forms, - ;; however a lambda-env consumes only 8 words plus 2 for the freshly consed - ;; catch tag; whereas a var-env + block-env would consume 6 + 6 + 2, which - ;; entails 40% more overhead to enter the most trivial interpreted function. - (block-name 0 :read-only t :type (or (eql 0) symbol)) - ;; SHARE-BLOCK-P is T if BLOCK-NAME can be created concurrently - ;; with variable bindings. If NIL when a block-name is present, - ;; then another environment is allocated to enclose the block, - ;; which is not as big a win as combining the block-env and var-env, - ;; but still beneficial as it avoids separately calling the block handler. - (share-block-p nil :read-only t :type boolean)) - (defconstant +restp-bit+ #b100) (defconstant +keyp-bit+ #b010) (defconstant +allowp-bit+ #b001) diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index 546e802995..a4fa60e4da 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -1358,11 +1358,6 @@ bootstrapping. `(list ,@required-args+rest-arg)) (method-call-call-method-args ,method-call))) -(defstruct (fast-method-call (:copier nil)) - (function #'identity :type function) - pv - next-method-call - arg-info) (defstruct (constant-fast-method-call (:copier nil) (:include fast-method-call)) value) diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 03a41439b7..0dac128833 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -236,3 +236,10 @@ (cons (sb-kernel:find-classoid 'compiler-note) 'muffle-warning)) nil nil nil))) (sb-c:compile-in-lexenv expr lexenv nil nil nil nil nil))) + +;;; This is here, moved from src/pcl/boot so that it gets a 1-byte layout ID +(defstruct (fast-method-call (:copier nil)) + (function #'identity :type function) + pv + next-method-call + arg-info) diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index 2de95f3db5..396ca248f4 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -486,7 +486,8 @@ static inline int layout_depth2_id(struct layout* layout) { int32_t* vector = (int32_t*)&layout->uw_id_word0; return vector[0]; } -// Keep in sync with hardwired IDs in src/compiler/generic/genesis.lisp +// Keep in sync with hardwired IDs in CHOOSE-LAYOUT-ID +// in src/compiler/generic/layout-ids.lisp #define WRAPPER_LAYOUT_ID 2 #define LAYOUT_LAYOUT_ID 3 #define LFLIST_NODE_LAYOUT_ID 4 From d8134d5c23f8c951ab3cf0d785c7c8645172c1c8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 4 May 2022 20:08:14 -0400 Subject: [PATCH 3261/4023] Store young code objects in a balanced tree --- make-target-2-load.lisp | 1 + src/code/alloc.lisp | 10 ++++++++ src/code/brothertree.lisp | 32 +++++++++++------------ src/code/cold-init.lisp | 1 + src/code/debug-int.lisp | 4 +-- src/cold/build-order.lisp-expr | 1 + src/cold/exports.lisp | 6 +++++ src/compiler/generic/layout-ids.lisp | 6 +++-- src/compiler/generic/parms.lisp | 1 + src/runtime/gc-common.c | 2 ++ src/runtime/gc-private.h | 1 + src/runtime/gencgc.c | 28 +++++++++++++++++--- src/runtime/search.c | 23 +++++++++++++++++ tests/brothertree.impure.lisp | 38 +++++++++++++++++++++++++--- tests/run-tests.lisp | 1 + 15 files changed, 128 insertions(+), 27 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index 7c2c874208..05538ff51b 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -433,6 +433,7 @@ Please check that all strings which were not recognizable to the compiler #.(find-package "SB-PCL") #.(find-package "SB-MOP") #.(find-package "SB-PRETTY") + #.(find-package "SB-BROTHERTREE") #.(find-package "SB-KERNEL")) ;; Assume all and only external symbols must be retained (eq accessibility :external)) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index cb539ba054..7dd829461f 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -453,6 +453,8 @@ (defun immobile-space-obj-p (obj) (immobile-space-addr-p (get-lisp-obj-address obj))) +(define-load-time-global *codeblob-tree* nil) + ;;; Enforce limit on boxed words based on maximum total number of words ;;; that can be indicated in the header for 32-bit words. ;;; 22 bits = 4MiB, quite generous for one code object. @@ -502,6 +504,14 @@ (with-pinned-objects (code) (let ((sap (sap+ (int-sap (get-lisp-obj-address code)) (- other-pointer-lowtag)))) + ;; Record it in the balanced tree. + (let ((tree *codeblob-tree*) (addr (sap-int sap))) + (loop (let ((newtree (sb-brothertree:insert addr tree))) + ;; check that it hasn't been promoted from gen0 -> gen1 already + ;; (very unlikely, but certainly possible). + (unless (eq (generation-of code) 0) (return)) + (let ((oldval (cas *codeblob-tree* tree newtree))) + (if (eq oldval tree) (return) (setq tree oldval)))))) ;; The immobile space allocator pre-zeroes, and also it needs a nonzero ;; value in the boxed word count because otherwise it looks like ;; an immobile space page filler. So don't do any more zeroing there. diff --git a/src/code/brothertree.lisp b/src/code/brothertree.lisp index 0aa90d0037..c241a3d43f 100644 --- a/src/code/brothertree.lisp +++ b/src/code/brothertree.lisp @@ -9,11 +9,6 @@ ;;;; provided with absolutely no warranty. See the COPYING and CREDITS ;;;; files for more information. -(defpackage "SB-BROTHERTREE" - (:use "CL" "SB-EXT") - (:import-from "SB-INT" #:named-let #:binding* #:awhen #:acond #:it) - (:shadow #:delete)) - (in-package "SB-BROTHERTREE") ;;;; Translated from the Haskell code in @@ -21,10 +16,12 @@ ;(declaim (optimize (sb-c::store-coverage-data 3))) +(deftype keytype () 'sb-vm:word) + (defstruct (binary-node (:copier nil) (:constructor make-binary-node (key %left %right))) ;; key must be in slot index 0 because fringe binary nodes have only this slot - (key 0 :type fixnum) + (key 0 :type keytype) %left %right) (defstruct (unary-node (:copier nil) (:conc-name "") @@ -79,9 +76,11 @@ (error "won't make binary node from ~S ~S" left right)) (if (or left right) (make-binary-node key left right) - (let ((instance (sb-kernel:%new-instance #.(sb-kernel:find-layout 'binary-node) - (1+ sb-vm:instance-data-start)))) - (sb-kernel:%instance-set instance sb-vm:instance-data-start key) + (let ((instance (sb-kernel:%make-instance/mixed + (1+ sb-vm:instance-data-start)))) + (sb-kernel:%set-instance-layout instance #.(sb-kernel:find-layout 'binary-node)) + ;; Nodes are immutable, hence no setf'er exists. + (sb-kernel:%raw-instance-set/word instance sb-vm:instance-data-start key) (truly-the binary-node instance)))) (defmacro binary-node-parts (node) @@ -108,8 +107,9 @@ (format stream "child=~D" (if child (binary-node-key child)))))) -(defun insert (a tree) - (declare (fixnum a)) +(defun insert (a tree &aux (leaf (L2 a))) + (declare (keytype a)) + (declare (dynamic-extent leaf)) ;; The Haskell code uses different definitions of 'root' and 'n2' ;; for insert and delete. That's certainly confusing. ;; Anyway these have to be internal functions to avoid duplication. @@ -156,7 +156,7 @@ (values l b (ins r))))) (|n2| new-left new-key new-right))) (unary-node (|n1| (ins (child x)))) - (null (L2 a)))) + (null leaf))) (root (x) ; bubble up. not sure why 'root' is a good name for this (typecase x ((cons (eql leaf)) (N2 nil (cdr x) nil)) @@ -172,7 +172,6 @@ ;;; sure we don't wrongly pick the last. ;;; Hence it doesn't really matter much in what order the others are tried. (defglobal *cases* (make-array 8)) -(eval-when (:compile-toplevel :execute) (defmacro pattern-case ((L R) &rest clauses &aux (n -1)) (flet ((shape-is (node shape) ;; SHAPE has a small number of hardcoded possibilities which are @@ -206,10 +205,10 @@ ,(shape-is R (second test))) ;; (incf (aref *cases* ,n)) ,consequent)))) - clauses))))) + clauses)))) (defun delete (a tree) - (declare (fixnum a)) + (declare (keytype a)) (labels ((|n2| (left key right) ;; this surely isn't as readable as pattern-matching in Haskell, ;; but it'll do. @@ -309,6 +308,7 @@ (null)))) (defun find= (key tree) + (declare (keytype key)) (loop (typecase tree (binary-node @@ -320,7 +320,7 @@ (null (return nil))))) (defun find<= (key tree) - (declare (fixnum key)) + (declare (keytype key)) (when tree (named-let recurse ((node tree) (best nil)) (if (unary-node-p (truly-the sb-kernel:instance node)) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index c94c7c1154..3fd213284e 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -136,6 +136,7 @@ (/show0 "entering !COLD-INIT") #+sb-show (setq */show* t) + (setq sb-vm::*codeblob-tree* nil) (setq sb-kernel::*defstruct-hooks* '(sb-kernel::!bootstrap-defstruct-hook) sb-kernel::*struct-accesss-fragments-delayed* nil) (let ((stream (!make-cold-stderr-stream))) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 4345c374ea..6732dcc1c7 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -565,7 +565,7 @@ ;;; (1) use unsafe %MAKE-LISP-OBJ, since we've already determined ;;; where the code object starts with certainty, and we don't need ;;; yet another search to test validity of the address. -;;; (2) wrap the calls in WITHOUT-GCING. +;;; (2) wrap the calls in WITH-CODE-PAGES-PINNED. ;;; ;;; Here's a concrete example, assuming the following objects exists: ;;; 0x8000: vector header | @@ -601,7 +601,7 @@ ;;; to any object on a specified page. ;;; ;;; On top of the considerations about dynamic space, there is a further issue -;;; with allocatin of immobile code. The allocator creates transient inconsistent +;;; with allocation of immobile code. The allocator creates transient inconsistent ;;; states when it reuses holes. Even if the header could be written atomically, ;;; there can be junk in the remaining bytes of the hole that gets rewritten as ;;; a smaller hole. It's evident that acquiring the allocator mutex works around diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 39afc02d73..a281bd27a3 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -518,6 +518,7 @@ ; "compiler/generic/core" ("src/code/alloc" :not-host) ; needs foo-SPACE-START + ("src/code/brothertree" :not-host) #+metaspace ("src/code/metaspace" :not-host) ("src/code/simple-fun" :not-host) ; function slot accessors ("src/code/eval" :not-host) ; uses INFO, wants compiler macro diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 39a3404b1a..1322333deb 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -3531,6 +3531,12 @@ package is deprecated in favour of SB-MOP.") "CLASS-NOT-FOUND-ERROR" "SPECIALIZER-NAME-SYNTAX-ERROR")) +(defpackage* "SB-BROTHERTREE" + (:use "CL" "SB-EXT" "SB-INT") + (:documentation "internal: 1-2-Brother tree") + (:shadow "DELETE") + (:export "INSERT" "DELETE")) + (defpackage* "SB-LOCKLESS" (:documentation "internal: lockfree lists") (:use "CL" "SB-INT" "SB-EXT" "SB-SYS" "SB-KERNEL") diff --git a/src/compiler/generic/layout-ids.lisp b/src/compiler/generic/layout-ids.lisp index c9923cbb67..86e19fb265 100644 --- a/src/compiler/generic/layout-ids.lisp +++ b/src/compiler/generic/layout-ids.lisp @@ -224,10 +224,11 @@ SB-C::DXABLE-ARGS ;;; 2 = WRAPPER if #+metaspace, unused if #-metaspace ;;; 3 = SB-VM:LAYOUT if #+metaspace, WRAPPER if #-metaspace ;;; 4 = SB-LOCKLESS::LIST-NODE +;;; 5 = SB-BROTHERTREE::UNARY-NODE (ecase layout-id-type (unsigned-byte ;; Assign all the above an (UNSIGNED-BYTE 8) layout-id. - (let ((id 4)) ; pre-increment when using + (let ((id 5)) ; pre-increment when using (dolist (item *popular-structure-types*) ;; Because of (MAPCAR #'LIST ...) it is ok to modify this list. (rplacd item (incf id))))) @@ -240,7 +241,7 @@ SB-C::DXABLE-ARGS (dolist (item *popular-structure-types*) ;; Because of (MAPCAR #'LIST ...) it is ok to modify this list. (rplacd item id) - (setq id (if (= id -1) 5 ; hop over the wired IDs + (setq id (if (= id -1) 6 ; hop over the wired IDs (1+ id))))))) (defvar *general-layout-uniqueid-counter* ; incremented before use @@ -260,6 +261,7 @@ SB-C::DXABLE-ARGS #+metaspace (wrapper 2) (#+metaspace sb-vm:layout #-metaspace wrapper 3) (sb-lockless::list-node 4) + (sb-brothertree::unary-node 5) (t (or (cdr (assq name sb-kernel::*popular-structure-types*)) (ecase sb-kernel::layout-id-type (unsigned-byte diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 1113ed7507..5975ceaeb2 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -220,6 +220,7 @@ ;; threading support #+sb-thread ,@'(sb-thread::*starting-threads* *free-tls-index*) + *codeblob-tree* ;; runtime linking of lisp->C calls (regardless of whether ;; the C function is in a dynamic shared object or not) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index a95ec37980..aa006f1987 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1907,6 +1907,8 @@ sword_t scav_code_blob(lispobj *object, lispobj header); lispobj * component_ptr_from_pc(char *pc) { + /* FIXME: this is the wrong way to go about finding code, + * because it won't look in the codeblob tree for immobile space. */ lispobj *object = search_all_gc_spaces(pc); if (object != NULL && widetag_of(object) == CODE_HEADER_WIDETAG) diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index 396ca248f4..ab6ddd4b3e 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -491,6 +491,7 @@ static inline int layout_depth2_id(struct layout* layout) { #define WRAPPER_LAYOUT_ID 2 #define LAYOUT_LAYOUT_ID 3 #define LFLIST_NODE_LAYOUT_ID 4 +#define BROTHERTREE_UNARY_NODE_LAYOUT_ID 5 /// Return true if 'thing' is a layout. /// This predicate is careful, as is it used to verify heap invariants. diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 49c65be8b4..7179ec7907 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1432,9 +1432,9 @@ gc_find_freeish_pages(page_index_t *restart_page_ptr, sword_t nbytes, - page_bytes_used(first_page)) > 0 && // "extensible" means all PTE fields are compatible page_extensible_p(first_page, gen, page_type)) { - // XXX: Prefer to start non-code on new pages. - // This is temporary until scavenging of small-object pages - // is made a little more intelligent (work in progress). + // TODO: Now that BOXED, CONS, and SMALL_MIXED pages exist, investigate + // whether the bias against returning partial pages is still useful. + // It probably isn't. if (bytes_found < nbytes && !is_code(page_type)) { if (bytes_found > most_bytes_found) most_bytes_found = bytes_found; @@ -1774,6 +1774,7 @@ copy_unboxed_object(lispobj object, sword_t nwords) /* This will NOT reliably work for objects in a currently open allocation region, * because page_words_used() is not sync'ed to the free pointer until closing */ +#include "brothertree.h" lispobj *search_dynamic_space(void *pointer) { page_index_t page_index = find_page_index(pointer); @@ -1789,6 +1790,20 @@ lispobj *search_dynamic_space(void *pointer) else return NULL; } + // Generation 0 code is in the tree usually - it isn't for objects + // in generation 0 following a non-promotion cycle. + if (type == PAGE_TYPE_CODE && page_table[page_index].gen == 0) { + lispobj node = brothertree_find_lesseql((uword_t)pointer, + SYMBOL(CODEBLOB_TREE)->value); + if (node != NIL) { + lispobj *codeblob = (lispobj*)((struct binary_node*)INSTANCE(node))->key; + if (widetag_of(codeblob) != CODE_HEADER_WIDETAG) + lose("widetag @ %p is not code? %lx\n", codeblob, *codeblob); + int nwords = code_total_nwords((struct code*)codeblob); + lispobj *upper_bound = codeblob + nwords; + if (pointer < (void*)upper_bound) return codeblob; + } + } lispobj *start; if (type == PAGE_TYPE_SMALL_MIXED) { // find the nearest card boundary below 'pointer' if ((char*)pointer > page_address(page_index)+page_bytes_used(page_index)) return NULL; @@ -4265,6 +4280,13 @@ garbage_collect_generation(generation_index_t generation, int raise, g->num_gc = raise ? 0 : (1 + g->num_gc); maybe_verify: + /* After a GC, pages of code are safe to linearly scan because + * there won't be random junk on them below page_bytes_used. + * And we don't want to see forwarding pointers on objects in the tree, + * so just erase the tree now. + * This is WRONG for immobile code, but not worse than status quo + * in terms of inability to find objects in the SIGPROF handler etc */ + SYMBOL(CODEBLOB_TREE)->value = NIL; if (generation >= verify_gens) verify_heap(VERIFY_POST_GC | (generation<<16)); extern int n_unboxed_instances; diff --git a/src/runtime/search.c b/src/runtime/search.c index f396005af9..a80db14abc 100644 --- a/src/runtime/search.c +++ b/src/runtime/search.c @@ -18,9 +18,11 @@ #include "search.h" #include "thread.h" #include "gc-internal.h" +#include "gc-private.h" #include "genesis/primitive-objects.h" #include "genesis/hash-table.h" #include "genesis/package.h" +#include "brothertree.h" lispobj * search_read_only_space(void *pointer) @@ -201,3 +203,24 @@ lispobj* find_symbol(char* symbol_name, lispobj package, unsigned int* hint) { return package ? search_package_symbols(package, symbol_name, hint) : 0; } + +uword_t brothertree_find_lesseql(uword_t key, lispobj tree) +{ + lispobj best = NIL; + while (tree != NIL) { + lispobj layout = instance_layout(INSTANCE(tree)); + if (layout_depth2_id(LAYOUT(layout)) == BROTHERTREE_UNARY_NODE_LAYOUT_ID) { + tree = ((struct unary_node*)INSTANCE(tree))->child; + } else { + struct binary_node* node = (void*)INSTANCE(tree); + if (node->key == key) return tree; + lispobj l = NIL, r = NIL; + int len = ((unsigned int)node->header >> INSTANCE_LENGTH_SHIFT) + & INSTANCE_LENGTH_MASK; + // unless a fringe node, read the left and right pointers + if (len > (int)(1+INSTANCE_DATA_START)) l = node->left, r = node->right; + if (key < node->key) tree = l; else { best = tree; tree = r; } + } + } + return best; +} diff --git a/tests/brothertree.impure.lisp b/tests/brothertree.impure.lisp index 78af9f6fd6..3b84c613b4 100644 --- a/tests/brothertree.impure.lisp +++ b/tests/brothertree.impure.lisp @@ -12,8 +12,8 @@ (n-unary-internal 0) (n-unary-leaf 0)) (sb-int:named-let recurse ((depth 0) (node root) - (min most-negative-fixnum) - (max most-positive-fixnum)) + (min -1) + (max (1+ sb-ext:most-positive-word))) (etypecase node (unary-node (assert (not (unary-node-p (child node)))) @@ -116,11 +116,11 @@ ;(print *cases*) nil)) -(defun random-big-list (count) +(defun random-big-list (count &optional (maxval (ash 1 30))) (let ((h (make-hash-table))) (loop (when (zerop count) (return (loop for k being each hash-key of h collect k))) - (let ((n (random (min most-positive-fixnum (ash 1 30))))) + (let ((n (random (min most-positive-fixnum maxval)))) (unless (gethash n h) (setf (gethash n h) t) (decf count)))))) @@ -240,6 +240,36 @@ (assert (null tree)) )) +(defun c-find<= (key tree) + (declare (sb-vm:word key)) + (sb-sys:with-pinned-objects (tree) + (let ((result + (sb-alien:alien-funcall + (sb-alien:extern-alien "brothertree_find_lesseql" + (function sb-alien:unsigned sb-alien:unsigned + sb-alien:unsigned)) + key + (sb-kernel:get-lisp-obj-address tree)))) + (unless (eql result sb-vm:nil-value) + (sb-kernel:make-lisp-obj result))))) + +(test-util:with-test (:name :find<=) + (let* ((list (test-util:shuffle (loop for i from 100 by 100 repeat 25 collect i))) + (tree (tree-from-list list))) + (assert (not (find<= 99 tree))) + (assert (not (c-find<= 99 tree))) + (loop for key from 100 by 100 repeat 25 + do + (let ((node (find<= key tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find<= key tree) node))) + (let ((node (find<= (1+ key) tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find<= (1+ key) tree) node))) + (let ((node (find<= (+ key 99) tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find<= (+ key 99) tree) node)))))) + (test-util:with-test (:name :insert-delete) (try-delete-everything (tree-from-list (random-big-list 2500)))) diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index 0f3641439a..0013fbfadc 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -197,6 +197,7 @@ sb-impl::*token-buf-pool* sb-impl::*user-hash-table-tests* sb-impl::**finalizer-store** + sb-vm::*codeblob-tree* ,(maybe "SB-KERNEL" "*EVAL-CALLS*") sb-kernel::*type-cache-nonce* sb-ext:*gc-run-time* From e442793e151c410cb4343f59f701c24708e4e918 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 4 May 2022 11:35:13 -0700 Subject: [PATCH 3262/4023] Fix block compilation interaction with notinline more efficiently. Rather than checking and then creating a new free-fun every time we call FIND-FREE-FUN, simply make notinline proclamations side effect the IR1 namespace correctly, using MAKE-NEW-INLINEP, since that's the point of MAKE-NEW-INLINEP. --- src/compiler/ir1tran.lisp | 14 +------------- src/compiler/proclaim.lisp | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index b483d31714..894b0e2603 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -232,19 +232,7 @@ ;;; demanded a function. (declaim (ftype (sfunction (t string) global-var) find-free-fun)) (defun find-free-fun (name context &aux (free-funs (free-funs *ir1-namespace*))) - (or (let ((old-free-fun (gethash name free-funs))) - (when old-free-fun - (when (or (not (defined-fun-p old-free-fun)) - (not (block-compile *compilation*)) - ;; When block-compiling, it is the case that we - ;; could proclaim an inline, define some things, - ;; then proclaim a notinline, and in the case that - ;; the function's :inlinep info changes, the - ;; old-free-fun is stale and we should make a new - ;; one. - (eq (info :function :inlinep name) - (defined-fun-inlinep old-free-fun))) - old-free-fun))) + (or (gethash name free-funs) (let ((kind (info :function :kind name))) (ecase kind ((:macro :special-form) diff --git a/src/compiler/proclaim.lisp b/src/compiler/proclaim.lisp index 0c9eb50f72..a3360fce77 100644 --- a/src/compiler/proclaim.lisp +++ b/src/compiler/proclaim.lisp @@ -414,11 +414,26 @@ (when (typep class 'classoid) (seal-class class)))) +;;; Similar in effect to FTYPE, but change the :INLINEP. Copying the +;;; global-var ensures that when we substitute a functional for a +;;; global var (i.e. for DEFUN) that we won't clobber any uses +;;; declared :NOTINLINE. (defun process-inline-declaration (name kind) (declare (type (and inlinep (not null)) kind)) ;; since implicitly it is a function, also scrubs (FREE-FUNS *IR1-NAMESPACE*) (proclaim-as-fun-name name) (warn-if-inline-failed/proclaim name kind) + (when (boundp '*ir1-namespace*) + (let* ((free-funs (free-funs *ir1-namespace*)) + (var (gethash name free-funs))) + (etypecase var + (null) + (global-var + (setf (gethash name free-funs) + ;; Use the universal type as the local type + ;; restriction, since we are processing this at + ;; top-level, and hence, in a null lexical environment. + (make-new-inlinep var kind *universal-type*)))))) (setf (info :function :inlinep name) kind)) (defun process-block-compile-declaration (entries kind) From b7ce896270534de2abeac0f2734eac7937e03eae Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 4 May 2022 21:38:59 -0700 Subject: [PATCH 3263/4023] Workaround ARM64 issue. We don't really need to clear out the constant tables, since we blast out the REFs to them. But we definitely need to clear out old free funs and vars which refer to stuff in dead component. --- src/compiler/main.lisp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 48f1e3ca7a..154a97afaa 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -822,6 +822,20 @@ necessary, since type inference may take arbitrarily long to converge.") ;; Its refs will be scanned redundantly, which is harmless. (blast (eql-constants ns))) (values)) + +;;; Clear the global hash tables held in IR1-NAMESPACE. +(defun clear-ir1-namespace (ir1-namespace) + (clrhash (free-funs ir1-namespace)) + (clrhash (free-vars ir1-namespace)) + ;; FIXME: It would make sense to clear these tables as well, but + ;; ARM64 relies on the constant for NIL to stay around in order to + ;; assign a wired TN to it, so we let people share it. Investigate a + ;; proper fix. + #+(or) + (progn + (clrhash (eql-constants ir1-namespace)) + (clrhash (named-constants ir1-namespace)) + (clrhash (similar-constants ir1-namespace)))) ;;;; trace output @@ -1275,14 +1289,6 @@ necessary, since type inference may take arbitrarily long to converge.") (mapc #'clear-ir1-info components-from-dfo) result)))))) -;;; Clear the global hash tables held in IR1-NAMESPACE. -(defun clear-ir1-namespace (ir1-namespace) - (clrhash (free-funs ir1-namespace)) - (clrhash (free-vars ir1-namespace)) - (clrhash (eql-constants ir1-namespace)) - (clrhash (named-constants ir1-namespace)) - (clrhash (similar-constants ir1-namespace))) - ;;; Print some noise about FORM if *COMPILE-PRINT* is true. (defun note-top-level-form (form) (when *compile-print* From 5bcecf6a5cdb76d0babbd02946ddfb9edcfcd36f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 5 May 2022 07:43:38 -0400 Subject: [PATCH 3264/4023] Missing file --- src/runtime/brothertree.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/runtime/brothertree.h diff --git a/src/runtime/brothertree.h b/src/runtime/brothertree.h new file mode 100644 index 0000000000..413d27f085 --- /dev/null +++ b/src/runtime/brothertree.h @@ -0,0 +1,19 @@ +#include "lispobj.h" + +struct binary_node { + lispobj header; +#ifndef LISP_FEATURE_COMPACT_INSTANCE_HEADER + lispobj layout; +#endif + uword_t key; + lispobj left, right; +}; +struct unary_node { + lispobj header; +#ifndef LISP_FEATURE_COMPACT_INSTANCE_HEADER + lispobj layout; +#endif + lispobj child; +}; + +extern uword_t brothertree_find_lesseql(uword_t key, lispobj tree); From 5376b15653216e11754ab71c8e001b79823d656a Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Thu, 5 May 2022 12:46:54 -0700 Subject: [PATCH 3265/4023] Don't bother clearing the IR1 namespace. It causes issues on ARM64 which bypasses the normal machinery for emitting constants for NIL. --- src/compiler/main.lisp | 17 +---------------- src/compiler/tn.lisp | 4 ++-- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 154a97afaa..53c2c6a006 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -822,20 +822,6 @@ necessary, since type inference may take arbitrarily long to converge.") ;; Its refs will be scanned redundantly, which is harmless. (blast (eql-constants ns))) (values)) - -;;; Clear the global hash tables held in IR1-NAMESPACE. -(defun clear-ir1-namespace (ir1-namespace) - (clrhash (free-funs ir1-namespace)) - (clrhash (free-vars ir1-namespace)) - ;; FIXME: It would make sense to clear these tables as well, but - ;; ARM64 relies on the constant for NIL to stay around in order to - ;; assign a wired TN to it, so we let people share it. Investigate a - ;; proper fix. - #+(or) - (progn - (clrhash (eql-constants ir1-namespace)) - (clrhash (named-constants ir1-namespace)) - (clrhash (similar-constants ir1-namespace)))) ;;;; trace output @@ -1707,8 +1693,7 @@ necessary, since type inference may take arbitrarily long to converge.") (compile-load-time-value-lambda lambdas) (compile-toplevel-lambdas lambdas top-level-closure))) - (mapc #'clear-ir1-info components) - (clear-ir1-namespace *ir1-namespace*)) + (mapc #'clear-ir1-info components)) (values)) ;;; Actually compile any stuff that has been queued up for block diff --git a/src/compiler/tn.lisp b/src/compiler/tn.lisp index 01ad8b8082..7fc9689c7b 100644 --- a/src/compiler/tn.lisp +++ b/src/compiler/tn.lisp @@ -231,8 +231,8 @@ immed null-offset (specifier-type 'null))))) - (setf (tn-leaf tn) constant - (leaf-info constant) tn)) + (setf (tn-leaf tn) constant + (leaf-info constant) tn)) (let* ((boxed (or (not immed) (boxed-immediate-sc-p immed))) (component (component-info *component-being-compiled*)) From 8b14637d8d328e76519de2335cceb0a026162afd Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 5 May 2022 17:01:52 -0400 Subject: [PATCH 3266/4023] Cease attempting incremental make Start make-all-targets with deletion of entire artifact tree. Not ideal but easier than figuring out how to trigger rebuilds. --- make-all-targets.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/make-all-targets.sh b/make-all-targets.sh index 267c75f4d9..b57aa7a8d5 100755 --- a/make-all-targets.sh +++ b/make-all-targets.sh @@ -1,5 +1,6 @@ #!/bin/sh +rm -fr obj/xbuild mkdir -p obj/xbuild make -k -j9 -f crossbuild-runner/Makefile \ From 5bb2376cfcf18bf086ed34ab1d12ed588b7373ea Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 6 May 2022 00:09:12 +0300 Subject: [PATCH 3267/4023] Normalize the type in check-type. For consistency with other type checking functionality, and to avoid confusion when a type is redefined. Suggested by Michael Fiano. --- src/code/macros.lisp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index f00f6c84fc..e162b36a91 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -651,7 +651,11 @@ invoked. In that case it will store into PLACE and start over." ;; variable to work around Python's blind spot in type derivation. ;; For more complex places getting the type derived should not ;; matter so much anyhow. - (let ((expanded (%macroexpand place env))) + (let ((expanded (%macroexpand place env)) + (type (let ((ctype (sb-c::careful-specifier-type type))) + (if ctype + (type-specifier ctype) + type)))) (if (symbolp expanded) `(do () ((typep ,place ',type)) From 90fa453bacfdea252b68f31c394fbc57912e7e9f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 5 May 2022 19:35:03 -0400 Subject: [PATCH 3268/4023] Speed up pinned_p Move 'pinned' out the page table, and use 1 byte per page instead of 1 bit per page. Zeroing all the pinned bits is much faster now because memset() outperforms reading and writing one byte per PTE. Having increased the number of pin tracking bits, refine the test which bypasses the pinned_objects hashtable. Map an object to a subrange of its page and check whether 1 bit in the byte is set for that subrange. This seems to reduce the number of hopscotch_containsp calls to about 1% of all uses of pinned_p() where formerly it was over 2%. Naively I expected an 8x reduction, but it's an improvement. Other changes: - clear the bits only once per collect_garbage() instead of making a pass over them for each collect_generation(). - with LRAs, do less work in pin_object() and always translate the LRA to a codeblob address when asking if the LRA if pinned. --- contrib/sb-introspect/introspect.lisp | 19 ++++--- src/runtime/gencgc-internal.h | 34 ++++++----- src/runtime/gencgc.c | 81 ++++++++++++++------------- 3 files changed, 73 insertions(+), 61 deletions(-) diff --git a/contrib/sb-introspect/introspect.lisp b/contrib/sb-introspect/introspect.lisp index 3f251690a4..3bbffc3465 100644 --- a/contrib/sb-introspect/introspect.lisp +++ b/contrib/sb-introspect/introspect.lisp @@ -752,6 +752,14 @@ Experimental. ;;;; ALLOCATION INTROSPECTION +(eval-when (:compile-toplevel :execute) + (defmacro pinnedp (addr) + `(eql (sb-alien:alien-funcall + (sb-alien:extern-alien "sb_introspect_pinnedp" + (function sb-alien:int sb-alien:unsigned)) + ,addr) + 1))) + (defun allocation-information (object) "Returns information about the allocation of OBJECT. Primary return value indicates the general type of allocation: :IMMEDIATE, :HEAP, :STACK, @@ -822,18 +830,13 @@ Experimental: interface subject to change." (index (sb-vm:find-page-index (get-lisp-obj-address object))) (flags (sb-alien:slot page 'sb-vm::flags)) - . - #+big-endian - ((type (ldb (byte 6 2) flags)) - (dontmove (logbitp 0 flags))) - #+little-endian - ((type (ldb (byte 6 0) flags)) - (dontmove (logbitp 7 flags)))) + (type #+little-endian (ldb (byte 6 0) flags) + #+big-endian (ldb (byte 6 2) flags))) (list :space space :generation (sb-alien:slot page 'sb-vm::gen) :write-protected wp :boxed (> (logand type #xf) 1) - :pinned dontmove + :pinned (pinnedp (get-lisp-obj-address object)) :large (logbitp 4 type) :page index))) (list :space space)) diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 4683fcf80a..8aacafc8a5 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -134,11 +134,7 @@ struct page { /* Whether the page was used at all. This is the only bit that can * be 1 on a free page */ need_zerofill :1, - /* If this page should not be moved during a GC then this flag - * is set. It's only valid during a GC for allocated pages, - * and only meaningful for pages in the condemned set. - * (It can be spuriously 1 on a page in any generation) */ - pinned :1; + dontuse :1; /* the generation that this page belongs to. This should be valid * for all pages that may have objects allocated, even current @@ -284,22 +280,34 @@ find_page_index(void *addr) #define page_single_obj_p(page) ((page_table[page].type & SINGLE_OBJECT_FLAG)!=0) +extern unsigned char* gc_page_pins; static inline boolean pinned_p(lispobj obj, page_index_t page) { extern struct hopscotch_table pinned_objects; // Single-object pages can be pinned, but the object doesn't go - // in the hashtable. I'm a little surprised that the return value - // should be 0 in such case, but I think this never gets called - // on large objects because they've all been "moved" to newspace - // by adjusting the page table. Perhaps this should do: - // gc_assert(!page_single_obj_p(page)) - if (!page_table[page].pinned || page_single_obj_p(page)) return 0; + // in the hashtable. pinned_p can be queried on those pages, + // but the answer is always 'No', because if pinned, the page would + // already have had its generation changed to newspace. + if (page_single_obj_p(page)) return 0; + #ifdef RETURN_PC_WIDETAG - if (widetag_of(native_pointer(obj)) == RETURN_PC_WIDETAG) + // Yet another complication from the despised LRA objects- with the + // refinement of 8 pin bits per page, we either must set all possible bits + // for a simple-fun, or map LRAs to the code base address. + if (widetag_of(native_pointer(obj)) == RETURN_PC_WIDETAG) { + // The hash-table stores tagged pointers. obj = make_lispobj(fun_code_header(native_pointer(obj)), OTHER_POINTER_LOWTAG); + page = find_page_index((void*)obj); + } #endif - return hopscotch_containsp(&pinned_objects, obj); + + unsigned char pins = gc_page_pins[page]; + if (!pins) return 0; + unsigned addr_lowpart = obj & (GENCGC_PAGE_BYTES-1); + // Divide the page into 8 parts, see whether that part is pinned. + unsigned subpage = addr_lowpart / (GENCGC_PAGE_BYTES/8); + return (pins & (1<<subpage)) && hopscotch_containsp(&pinned_objects, obj); } // Return true only if 'obj' must be *physically* transported to survive gc. diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 7179ec7907..31c51385fb 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -159,6 +159,7 @@ static boolean conservative_stack = 1; * page_table_pages is set from the size of the dynamic space. */ page_index_t page_table_pages; struct page *page_table; +unsigned char *gc_page_pins; unsigned char *gc_card_mark; lispobj gc_object_watcher; int gc_traceroot_criterion; @@ -187,7 +188,7 @@ static inline boolean protect_page_p(page_index_t page, generation_index_t gener return (page_boxed_p(page) && !(page_table[page].type & OPEN_REGION_PAGE_FLAG) && (page_words_used(page) != 0) - && !page_table[page].pinned + && !gc_page_pins[page] && (page_table[page].gen == generation)); } #endif @@ -261,7 +262,8 @@ page_ends_contiguous_block_p(page_index_t page_index, static inline void reset_page_flags(page_index_t page) { page_table[page].scan_start_offset_ = 0; page_table[page].type = 0; - page_table[page].pinned = 0; + page_table[page].dontuse = 0; + gc_page_pins[page] = 0; // Why can't the 'gen' get cleared? It caused failures. THIS MAKES NO SENSE!!! // page_table[page].gen = 0; // Free pages are dirty (MARKED) because MARKED is equivalent @@ -379,7 +381,7 @@ static void show_pinnedobj_count() int nwords = 0; int n_pinned_largeobj = 0; for (page = 0; page < next_free_page; ++page) { - if (page_table[page].gen == from_space && page_table[page].pinned + if (page_table[page].gen == from_space && gc_page_pins[page] && page_single_obj_p(page)) { nwords += page_words_used(page); if (page_starts_contiguous_block_p(page)) @@ -913,7 +915,7 @@ page_extensible_p(page_index_t index, generation_index_t gen, int type) { int attributes_match = page_table[index].type == type && page_table[index].gen == gen - && !page_table[index].pinned; + && !gc_page_pins[index]; #else /* Test the three conditions above as a single comparison. * @@ -1798,7 +1800,7 @@ lispobj *search_dynamic_space(void *pointer) if (node != NIL) { lispobj *codeblob = (lispobj*)((struct binary_node*)INSTANCE(node))->key; if (widetag_of(codeblob) != CODE_HEADER_WIDETAG) - lose("widetag @ %p is not code? %lx\n", codeblob, *codeblob); + lose("widetag @ %p is not code? %"OBJ_FMTX"\n", codeblob, *codeblob); int nwords = code_total_nwords((struct code*)codeblob); lispobj *upper_bound = codeblob + nwords; if (pointer < (void*)upper_bound) return codeblob; @@ -1828,7 +1830,7 @@ int pin_all_dynamic_space_code; static inline int immune_set_memberp(page_index_t page) { return (page_table[page].gen != from_space) - || (page_table[page].pinned && + || (gc_page_pins[page] && (page_single_obj_p(page) || (is_code(page_table[page].type) && pin_all_dynamic_space_code))); } @@ -2369,6 +2371,10 @@ static void obliterate_nonpinned_words() } } +int sb_introspect_pinnedp(lispobj obj) { + return hopscotch_containsp(&pinned_objects, obj); +} + /* Add 'object' to the hashtable, and if the object is a code component, * then also add all of the embedded simple-funs. * It is OK to call this function on an object which is already pinned- @@ -2391,6 +2397,7 @@ static void obliterate_nonpinned_words() * so the extra work here is quite minimal, even if it can generally add to * the number of keys in the hashtable. */ +#define PAGE_PINNED 0xFF static void pin_object(lispobj object) { if (!compacting_p()) { @@ -2408,11 +2415,11 @@ static void pin_object(lispobj object) * here for large objects, though I do wonder why we can't move the object right now * and be done with it */ if (page_single_obj_p(page)) { - if (page_table[page].pinned) return; + if (gc_page_pins[page]) return; sword_t nwords = OBJECT_SIZE(*object_start, object_start); maybe_adjust_large_object(object_start, page, nwords); page_index_t last_page = find_page_index(object_start + nwords - 1); - while (page <= last_page) page_table[page++].pinned = 1; + while (page <= last_page) gc_page_pins[page++] = PAGE_PINNED; return; } @@ -2421,7 +2428,9 @@ static void pin_object(lispobj object) if (hopscotch_containsp(&pinned_objects, object)) return; hopscotch_insert(&pinned_objects, object, 1); - page_table[page].pinned = 1; + unsigned int addr_lowpart = object & (GENCGC_PAGE_BYTES-1); + // Divide the page into 8 parts, mark that part pinned + gc_page_pins[page] |= 1 << (addr_lowpart / (GENCGC_PAGE_BYTES/8)); struct code* maybe_code = (struct code*)native_pointer(object); // Avoid iterating over embedded simple-funs until the debug info is set. // Prior to that, the unboxed payload will contain random bytes. @@ -2430,18 +2439,10 @@ static void pin_object(lispobj object) if (widetag_of(&maybe_code->header) == CODE_HEADER_WIDETAG && maybe_code->debug_info) { for_each_simple_fun(i, fun, maybe_code, 0, { hopscotch_insert(&pinned_objects, make_lispobj(fun, FUN_POINTER_LOWTAG), 1); - page_table[find_page_index(fun)].pinned = 1; + addr_lowpart = (uword_t)fun & (GENCGC_PAGE_BYTES-1); + gc_page_pins[find_page_index(fun)] |= + 1 << (addr_lowpart / (GENCGC_PAGE_BYTES/8)); }) -#ifdef RETURN_PC_WIDETAG - /* Return PCs can't go in the hash-table, because there's no way to find them. - * But from_space_p() has to return false on return PCs in pinned code. - * pinned_p is mostly OK, but it needs to see the 'pinned' bit on for the page - * having the return PC. There's a chance that we would not set it properly - * in page-spanning objects, so loop over pages just like for a large object */ - size_t nwords = OBJECT_SIZE(*object_start, object_start); - page_index_t last_page = find_page_index(object_start + nwords - 1); - while (page <= last_page) page_table[page++].pinned = 1; -#endif } } @@ -2495,7 +2496,9 @@ static boolean NO_SANITIZE_MEMORY preserve_pointer(uword_t word) if (compacting_p()) { if (!hopscotch_containsp(&pinned_objects, word)) { hopscotch_insert(&pinned_objects, word, 1); - page_table[page].pinned = 1; + unsigned int addr_lowpart = word & (GENCGC_PAGE_BYTES-1); + // Divide the page into 8 parts, mark that part pinned + gc_page_pins[page] |= 1 << (addr_lowpart / (GENCGC_PAGE_BYTES/8)); } return 1; } @@ -2793,7 +2796,7 @@ update_writeprotection(page_index_t first_page, page_index_t last_page, * It's probably rare to pass boxed pages to the OS, but it could be * to read fixnums into a simple-vector. */ for (page = first_page; page <= last_page; ++page) - if (page_table[page].pinned) return 0; + if (gc_page_pins[page]) return 0; #endif /* Now we attempt to find any 1 "witness" that the pages should NOT be protected. @@ -3534,9 +3537,10 @@ move_pinned_pages_to_newspace() for (i = 0; i < next_free_page; i++) { /* 'pinned' is cleared lazily, so test the 'gen' field as well. */ - if (page_table[i].gen == from_space && page_table[i].pinned && - (page_single_obj_p(i) || (is_code(page_table[i].type) - && pin_all_dynamic_space_code))) { + if (gc_page_pins[i] == PAGE_PINNED && + page_table[i].gen == from_space && + (page_single_obj_p(i) || + (is_code(page_table[i].type) && pin_all_dynamic_space_code))) { page_table[i].gen = new_space; /* And since we're moving the pages wholesale, also adjust * the generation allocation counters. */ @@ -3878,26 +3882,16 @@ garbage_collect_generation(generation_index_t generation, int raise, gc_alloc_generation = new_space; RESET_ALLOC_START_PAGES(); - /* Before any pointers are preserved, the pinned flags on the - * pages need to be cleared. */ - /* FIXME: consider moving this bitmap into its own range of words, - * out of the page table. Then we can just bzero() it. - * This will also obviate the extra test at the comment - * "pinned is cleared lazily" in move_pinned_pages_to_newspace(). - */ if (pin_all_dynamic_space_code) { /* This needs to happen before ambiguous root pinning, as the mechanisms * overlap in a way that all-code pinning wouldn't do the right thing if flipped. * FIXME: why would it not? More explanation needed! * Code objects should never get into the pins table in this case */ - for (i = 0; i < next_free_page; i++) { - if (page_table[i].gen == from_space) - page_table[i].pinned = page_words_used(i) != 0 - && is_code(page_table[i].type); - } - } else { - for (i = 0; i < next_free_page; i++) - if (page_table[i].gen == from_space) page_table[i].pinned = 0; + for (i = 0; i < next_free_page; i++) { + if (page_table[i].gen == from_space + && is_code(page_table[i].type) && page_words_used(i)) + gc_page_pins[i] = PAGE_PINNED; + } } /* Un-write-protect the old-space pages. This is essential for the @@ -4461,6 +4455,7 @@ collect_garbage(generation_index_t last_gen) if (gencgc_verbose > 1) print_generation_stats(); + page_index_t initial_nfp = next_free_page; if (gc_mark_only) { garbage_collect_generation(PSEUDO_STATIC_GENERATION, 0, &last_gen); goto finish; @@ -4635,6 +4630,10 @@ collect_garbage(generation_index_t last_gen) finalizer_thread_runflag = newval ? newval : 1; } THREAD_JIT(1); + // Clear all pin bits for the next GC cycle. + // This could be done in the background somehow maybe. + page_index_t max_nfp = initial_nfp > next_free_page ? initial_nfp : next_free_page; + memset(gc_page_pins, 0, max_nfp); } /* Initialization of gencgc metadata is split into two steps: @@ -4713,6 +4712,8 @@ void gc_allocate_ptes() */ page_table = calloc(1+page_table_pages, sizeof(struct page)); gc_assert(page_table); + gc_page_pins = calloc(page_table_pages, 1); + gc_assert(gc_page_pins); // The card table size is a power of 2 at *least* as large // as the number of cards. These are the default values. From bcc3f825ad69fe7c5da037f956d0de6a38e4566e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 6 May 2022 18:51:42 +0300 Subject: [PATCH 3269/4023] arm64: use unsigned comparisons in the ASH VOPs. Reported by Eric Marsden. --- src/compiler/arm64/arith.lisp | 16 ++++++++-------- tests/arith.pure.lisp | 10 ++++++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 2340c5a658..3a8c8e5feb 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -441,10 +441,10 @@ ;; Only the first 6 bits count for shifts. ;; This sets all bits to 1 if AMOUNT is larger than 63, ;; cutting the amount to 63. - (inst csinv temp temp zr-tn :lt) + (inst csinv temp temp zr-tn :lo) (inst asr result number temp)) (:unsigned - (inst csel result number zr-tn :lt) + (inst csel result number zr-tn :lo) (inst lsr result result temp))))) (inst b END) @@ -454,7 +454,7 @@ (inst lsl result number temp)) (t (inst cmp temp n-word-bits) - (inst csel result number zr-tn :lt) + (inst csel result number zr-tn :lo) (inst lsl result result temp))) END)) @@ -485,10 +485,10 @@ ;; Only the first 6 bits count for shifts. ;; This sets all bits to 1 if AMOUNT is larger than 63, ;; cutting the amount to 63. - (inst csinv temp temp zr-tn :lt) + (inst csinv temp temp zr-tn :lo) (inst asr temp-result number temp)) (unsigned-reg - (inst csel temp-result number zr-tn :lt) + (inst csel temp-result number zr-tn :lo) (inst lsr temp-result temp-result temp))))) (inst b END) @@ -498,7 +498,7 @@ (inst lsl temp-result number temp)) (t (inst cmp temp n-word-bits) - (inst csel temp-result number zr-tn :lt) + (inst csel temp-result number zr-tn :lo) (inst lsl temp-result temp-result temp))) END (inst lsl result temp-result n-fixnum-tag-bits))) @@ -541,10 +541,10 @@ (specifier-type `(mod ,n-word-bits))))) (inst cmp amount n-word-bits) (cond ((location= amount result) - (inst csel tmp-tn number zr-tn :lt) + (inst csel tmp-tn number zr-tn :lo) (inst lsl result tmp-tn amount)) (t - (inst csel result number zr-tn :lt) + (inst csel result number zr-tn :lo) (inst lsl result result amount)))) (t (inst lsl result number amount))))) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index 64e089b85d..04747e2a17 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -1052,3 +1052,13 @@ ((1 2) t) ((2 2) t) ((3 2) nil))) + +(with-test (:name :ash-signed-negation-overflow) + (checked-compile-and-assert + () + `(lambda (a b) + (declare (fixnum a) + (sb-vm:signed-word b)) + (truly-the sb-vm:signed-word (ash a b))) + ((-44 (- (expt 2 (1- sb-vm:n-word-bits)))) -1) + ((44 2) 176))) From 8ba4207592eed4835f65ba6ec65fbe4016f30ed8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 6 May 2022 12:00:28 -0400 Subject: [PATCH 3270/4023] Remove a range test from scav1, new_space_p, and from_space_p by ensuring that page_table[-1] contains valid data that doesn't match any in-use page's generation. --- src/runtime/gc-common.c | 24 +++++++++++++++--------- src/runtime/gencgc-internal.h | 13 +++++++------ src/runtime/gencgc.c | 26 ++++++++++++++++++-------- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index aa006f1987..d22ca96164 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -105,10 +105,10 @@ static void (*scav_ptr[4])(lispobj *where, lispobj object); /* forward decl */ * * For GENCGC only: * - With 32-bit words, is_lisp_pointer(object) returns true if addr - * contains a broken heart marker (0x01), so we need a sanity check - * as the last case. + * contains FORWARDING_HEADER (0x01), so we need a guard condition + * as the last case, to make error detection possible. * - With 64-bit words, is_lisp_pointer(object) is false when addr - * contains a broken heart marker (0x01), so this won't get called. + * contains FORWARDING_HEADER, so this function won't get called. */ static inline void scav1(lispobj* addr, lispobj object) { @@ -120,25 +120,31 @@ static inline void scav1(lispobj* addr, lispobj object) scav_ptr[PTR_SCAVTAB_INDEX(object)](addr, object); } #else - page_index_t page; /* In theory we can test forwarding_pointer_p on anything, but it's probably * better to avoid reading more memory than needed. Hence the pre-check * for a from_space object. But, rather than call from_space_p() which always * checks for object pinning, it's a performance boost to treat from_space_p() * as a leaky abstraction - reading one word at *native_pointer(object) is easier * than looking in a hashset, and 9 times out of 10 times we need to read it anyway. - * And if the object was already forwarded, we never need pinned_p. */ - if ((page = find_page_index((void*)object)) >= 0) { - if (page_table[page].gen == from_space) { + * And if the object was already forwarded, we never need pinned_p. + * + * Based on some instrumentation added to this function, I determined + * that it makes sense to read the 'gen' even if find_page_index() returns -1, + * because approximately 25% of all calls to scav1() *do* find that the object + * is in from_space. The guard condition on page_index is not needed + * because it is legal to access page_table at index -1. + * Therefore, when the object is in from_space, we incur one fewer branch */ + + page_index_t page = find_page_index((void*)object); + if (page_table[page].gen == from_space) { if (forwarding_pointer_p(native_pointer(object))) *addr = forwarding_pointer_value(native_pointer(object)); else if (!pinned_p(object, page)) scav_ptr[PTR_SCAVTAB_INDEX(object)](addr, object); - } } #ifdef LISP_FEATURE_IMMOBILE_SPACE // Test immobile_space_p() only if object was definitely not in dynamic space - else if (immobile_space_p(object)) { + else if (page < 0 && immobile_space_p(object)) { lispobj *ptr = base_pointer(object); if (immobile_obj_gen_bits(ptr) == from_space) enliven_immobile_obj(ptr, 1); diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 8aacafc8a5..63fa955146 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -266,8 +266,7 @@ static inline void gc_init_region(struct alloc_region *region) /* Find the page index within the page_table for the given * address. Return -1 on failure. */ -static inline page_index_t -find_page_index(void *addr) +static inline page_index_t find_page_index(void *addr) { if (addr >= (void*)DYNAMIC_SPACE_START) { page_index_t index = ((uintptr_t)addr - @@ -318,16 +317,18 @@ from_space_p(lispobj obj) { gc_dcheck(compacting_p()); page_index_t page_index = find_page_index((void*)obj); - return page_index >= 0 - && page_table[page_index].gen == from_space - && !pinned_p(obj, page_index); + // NOTE: It is legal to access page_table at index -1, + // and the 'gen' of page -1 is an otherwise unused value. + return page_table[page_index].gen == from_space && !pinned_p(obj, page_index); } static boolean __attribute__((unused)) new_space_p(lispobj obj) { gc_dcheck(compacting_p()); page_index_t page_index = find_page_index((void*)obj); - return page_index >= 0 && page_table[page_index].gen == new_space; + // NOTE: It is legal to access page_table at index -1, + // and the 'gen' of page -1 is an otherwise unused value. + return page_table[page_index].gen == new_space; } #ifdef LISP_FEATURE_IMMOBILE_SPACE diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 31c51385fb..b20281beb1 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1781,9 +1781,9 @@ lispobj *search_dynamic_space(void *pointer) { page_index_t page_index = find_page_index(pointer); - /* The address may be invalid, so do some checks. */ - if ((page_index == -1) || page_free_p(page_index)) - return NULL; + /* The address may be invalid, so do some checks. + * page_index -1 is legal, and page_free_p returns true in that case. */ + if (page_free_p(page_index)) return NULL; int type = page_table[page_index].type & PAGE_TYPE_MASK; if (type == PAGE_TYPE_CONS) { int wordindex = ((char*)pointer - page_address(page_index)) >> WORD_SHIFT; @@ -4705,13 +4705,23 @@ void gc_allocate_ptes() #error "FREE_PAGE_FLAG is not 0" #endif - /* An extra struct exists as the end as a sentinel. Its 'scan_start_offset' - * and 'bytes_used' must be zero. - * Doing so avoids testing in page_ends_contiguous_block_p() whether the - * next page_index is within bounds, and whether that page contains data. + /* An extra 'struct page' exists at each end of the page table acting as + * a sentinel. + * + * For for leading sentinel: + * - all fields are zero except that 'gen' has an illegal value + * which makes from_space_p() and new_space_p() both return false + * + * For the trailing sentinel: + * - all fields are zero which makes page_ends_contiguous_block_p() + * return true for the last in-range page index (so the "illegal" + * index at 1+ appears to start a contiguous block even though + * it corresponds to no page) */ - page_table = calloc(1+page_table_pages, sizeof(struct page)); + page_table = calloc(page_table_pages+2, sizeof(struct page)); gc_assert(page_table); + page_table[0].gen = 9; // an arbitrary never-used value + ++page_table; gc_page_pins = calloc(page_table_pages, 1); gc_assert(gc_page_pins); From c5d460c3941a33f421e9656d283a03e0aad5fc09 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 8 May 2022 11:52:27 -0400 Subject: [PATCH 3271/4023] Combine 4 definitions of os_protect * All except linux were missing the prohibition against using mprotect on dynamic space with soft card marks. * Proceeding past a failure never makes sense. --- src/runtime/bsd-os.c | 12 ------------ src/runtime/haiku-os.c | 8 -------- src/runtime/linux-os.c | 21 --------------------- src/runtime/os-common.c | 24 ++++++++++++++++++++++++ src/runtime/sunos-os.c | 9 --------- 5 files changed, 24 insertions(+), 50 deletions(-) diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 2f16b8bc91..a7e09146dd 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -246,18 +246,6 @@ os_invalidate(os_vm_address_t addr, os_vm_size_t len) if (munmap(addr, len) == -1) perror("munmap"); } - -void -os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) -{ - if (mprotect(address, length, prot) == -1) { - - perror("mprotect"); -#ifdef LISP_FEATURE_DARWIN_JIT - lose("%p %lu", address, length); -#endif - } -} /* * any OS-dependent special low-level handling for signals diff --git a/src/runtime/haiku-os.c b/src/runtime/haiku-os.c index f56d06a2e9..796c8663c7 100644 --- a/src/runtime/haiku-os.c +++ b/src/runtime/haiku-os.c @@ -45,14 +45,6 @@ os_invalidate(os_vm_address_t addr, os_vm_size_t len) } } -void -os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) -{ - if (mprotect(address, length, prot)) { - perror("mprotect"); - } -} - char *os_get_runtime_executable_path() { int cookie = 0; diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 650b8283b9..12f82d7da1 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -360,27 +360,6 @@ int os_preinit(char *argv[], char *envp[]) #endif return 0; } - -void -os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) -{ -#ifdef LISP_FEATURE_SOFT_CARD_MARKS - // dynamic space should not have protections manipulated - if (find_page_index(address) >= 0) - lose("unexpected call to os_protect with software card marks"); -#endif - if (mprotect(address, length, prot)) { - if (errno == ENOMEM) { - lose("An mprotect call failed with ENOMEM. This probably means that the maximum amount\n" - "of separate memory mappings was exceeded. To fix the problem, either increase\n" - "the maximum with e.g. 'echo 262144 > /proc/sys/vm/max_map_count' or recompile\n" - "SBCL with a larger value for GENCGC-PAGE-BYTES in\n" - "'src/compiler/"SBCL_TARGET_ARCHITECTURE_STRING"/parms.lisp'."); - } else { - perror("mprotect"); - } - } -} /* * any OS-dependent special low-level handling for signals diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 2ef4332d4e..6d9fb6dfe6 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -370,3 +370,27 @@ char *copied_string(char *string) { return strcpy(successful_malloc(1+strlen(string)), string); } + +#ifdef LISP_FEATURE_UNIX +void +os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) +{ +#ifdef LISP_FEATURE_SOFT_CARD_MARKS + // dynamic space should not have protections manipulated + if (find_page_index(address) >= 0) + lose("unexpected call to os_protect with software card marks"); +#endif + if (mprotect(address, length, prot) < 0) { +#ifdef LISP_FEATURE_LINUX + if (errno == ENOMEM) { + lose("An mprotect call failed with ENOMEM. This probably means that the maximum amount\n" + "of separate memory mappings was exceeded. To fix the problem, either increase\n" + "the maximum with e.g. 'echo 262144 > /proc/sys/vm/max_map_count' or recompile\n" + "SBCL with a larger value for GENCGC-PAGE-BYTES in\n" + "'src/compiler/"SBCL_TARGET_ARCHITECTURE_STRING"/parms.lisp'."); + } +#endif + lose("mprotect(%p,%lx,%d) error %d", address, (long)length, prot, errno); + } +} +#endif diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c index c8eff69adb..98d9e6843a 100644 --- a/src/runtime/sunos-os.c +++ b/src/runtime/sunos-os.c @@ -59,15 +59,6 @@ void os_invalidate(os_vm_address_t addr, os_vm_size_t len) perror("munmap"); } - -void -os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) -{ - if(mprotect((void*)address, length, prot) == -1) { - perror("mprotect"); - } -} - #if defined LISP_FEATURE_GENCGC void From 726a0fabc89878ec86918a710c871f4b6f27d31a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 9 May 2022 00:05:20 +0300 Subject: [PATCH 3272/4023] Fix register allocation around split ir2 blocks. SAVE-COMPLEX-WRITER-TN wants to insert MOVE-OPERAND before ALLOCATE-FRAME, but the ir2 block where ALLOCATE-FRAME is situated may be different from the current block due to SPLIT-IR2-BLOCKS. Reported by Eric Marsden. --- src/compiler/pack.lisp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index 21862fd662..e35aaba9b2 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -485,11 +485,14 @@ (when (eq (tn-kind save) :specified-save) (setf (tn-kind save) :save)) (aver (eq (tn-kind save) :save)) - (emit-operand-load node block tn save - (if (eq (vop-info-move-args (vop-info vop)) - :local-call) - (reverse-find-vop 'allocate-frame vop) - vop)) + (multiple-value-bind (before block) + (if (eq (vop-info-move-args (vop-info vop)) :local-call) + (let ((before (reverse-find-vop 'allocate-frame vop))) + ;; Because of SPLIT-IR2-BLOCKS the ALLOCATE-FRAME VOP + ;; may be in a different block. + (values before (vop-block before))) + (values vop block)) + (emit-operand-load node block tn save before)) (emit-operand-load node block save tn next))) ;;; Return a VOP after which is an OK place to save the value of TN. From 6c421f620af3c37070a31e1a23f576a4223540d4 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Fri, 6 May 2022 14:33:46 -0700 Subject: [PATCH 3273/4023] Separate out the compile time only side effects of PROCLAIM. Some aspects of PROCLAIM only happen at compile-time. This is a bit anomalous because ANSI functions don't usually cause compile-time side effects, instead using a macro. That is the reason of being for DECLAIM, but we currently take the position that PROCLAIM happening at compile time need to cause the same effects, so separate out (textually) some of the compile time only effects to make it clear that is what is happening. --- src/compiler/ir1tran.lisp | 58 ++++++++++++++++++++++++++++++++++++ src/compiler/proclaim.lisp | 60 ++++++++++++-------------------------- 2 files changed, 77 insertions(+), 41 deletions(-) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 894b0e2603..4f364ffd5c 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1775,3 +1775,61 @@ :where-from :declared)))) (declaim (end-block)) + + +;;;; Proclamations: +;;; +;;; PROCLAIM changes the global environment, so we must handle its +;;; compile time side effects if we are to keep the information in the +;;; (FREE-xxx *IR1-NAMESPACE*) tables up to date. When there is a var +;;; structure we disown it by replacing it with an updated copy. Uses +;;; of the variable which were translated before the PROCLAIM will get +;;; the old version, while subsequent references will get the updated +;;; information. + +;;; If a special block compilation delimiter, then start or end the +;;; block as appropriate. If :BLOCK-COMPILE is T or NIL, then we +;;; ignore any start/end block declarations. +(defun process-block-compile-proclamation (kind entry-points) + (if (eq *block-compile-argument* :specified) + (ecase kind + (start-block + (finish-block-compilation) + (let ((compilation *compilation*)) + (setf (block-compile compilation) t) + (setf (entry-points compilation) entry-points))) + (end-block + (finish-block-compilation))) + (compiler-notify "ignoring ~S declaration since ~ + :BLOCK-COMPILE is not :SPECIFIED" + kind))) + +;;; Similar in effect to FTYPE, but change the :INLINEP. Copying the +;;; global-var ensures that when we substitute a functional for a +;;; global var (i.e. for DEFUN) that we won't clobber any uses +;;; declared :NOTINLINE. +(defun process-inline-proclamation (kind funs) + (declare (type (and inlinep (not null)) kind)) + (dolist (name funs) + (proclaim-as-fun-name name) + (let* ((free-funs (free-funs *ir1-namespace*)) + (var (gethash name free-funs))) + (etypecase var + (null) + (global-var + (setf (gethash name free-funs) + ;; Use the universal type as the local type restriction, + ;; since we are processing the proclamation at the top + ;; level and hence in a null lexical environment. + (make-new-inlinep var kind *universal-type*))))))) + +;;; Handle the compile-time side effects of PROCLAIM that don't happen +;;; at load time. These mostly side-effect the global state of the +;;; compiler, rather than the global environment. +(defun %compiler-proclaim (kind args) + (case kind + ((start-block end-block) + #-(and sb-devel sb-xc-host) + (process-block-compile-proclamation kind args)) + ((inline notinline maybe-inline) + (process-inline-proclamation kind args)))) diff --git a/src/compiler/proclaim.lisp b/src/compiler/proclaim.lisp index a3360fce77..49ef1c64cf 100644 --- a/src/compiler/proclaim.lisp +++ b/src/compiler/proclaim.lisp @@ -414,38 +414,6 @@ (when (typep class 'classoid) (seal-class class)))) -;;; Similar in effect to FTYPE, but change the :INLINEP. Copying the -;;; global-var ensures that when we substitute a functional for a -;;; global var (i.e. for DEFUN) that we won't clobber any uses -;;; declared :NOTINLINE. -(defun process-inline-declaration (name kind) - (declare (type (and inlinep (not null)) kind)) - ;; since implicitly it is a function, also scrubs (FREE-FUNS *IR1-NAMESPACE*) - (proclaim-as-fun-name name) - (warn-if-inline-failed/proclaim name kind) - (when (boundp '*ir1-namespace*) - (let* ((free-funs (free-funs *ir1-namespace*)) - (var (gethash name free-funs))) - (etypecase var - (null) - (global-var - (setf (gethash name free-funs) - ;; Use the universal type as the local type - ;; restriction, since we are processing this at - ;; top-level, and hence, in a null lexical environment. - (make-new-inlinep var kind *universal-type*)))))) - (setf (info :function :inlinep name) kind)) - -(defun process-block-compile-declaration (entries kind) - (ecase kind - (start-block - (finish-block-compilation) - (let ((compilation *compilation*)) - (setf (block-compile compilation) t) - (setf (entry-points compilation) entries))) - (end-block - (finish-block-compilation)))) - (defun check-deprecation-declaration (state since form) (unless (typep state 'deprecation-state) (error 'simple-type-error @@ -520,6 +488,19 @@ (defun %proclaim (raw-form location) (destructuring-bind (&whole form &optional kind &rest args) (canonized-decl-spec raw-form) + ;; It seems strange to test whether we are currently in + ;; compile-time mode this way, but the reason we don't just call + ;; %COMPILER-PROCLAIM in a :COMPILE-TOPLEVEL-only situation in the + ;; macro-expansion of DECLAIM is that unlike the DEFmumble macros, + ;; DECLAIM and PROCLAIM both exist, and it is unclear whether the + ;; intent of the ANSI specification is that + ;; (EVAL-WHEN (:COMPILE-TOPLEVEL ...) + ;; (LET () + ;; (PROCLAIM ...))) + ;; should have the exact same compile time effects as (DECLAIM ...). + ;; We make the assumption that yes, they should have the same semantics. + (when (boundp '*compilation*) + (%compiler-proclaim kind args)) (labels ((store-location (name &key (key kind)) (if location (setf (getf (info :source-location :declaration name) key) @@ -558,14 +539,8 @@ (error "Type system not yet initialized."))) (freeze-type (map-args #'process-freeze-type-declaration)) - ((start-block end-block) - #-(and sb-devel sb-xc-host) - (when (and *compile-time-eval* (boundp '*compilation*)) - (if (eq *block-compile-argument* :specified) - (process-block-compile-declaration args kind) - (compiler-notify "ignoring ~S declaration since ~ - :BLOCK-COMPILE is not :SPECIFIED" - kind)))) + ;; This only has compile-time effects. + ((start-block end-block)) (optimize (multiple-value-bind (new-policy specified-qualities) (process-optimize-decl form *policy*) @@ -590,7 +565,10 @@ (setq *disabled-package-locks* (process-package-lock-decl form *disabled-package-locks*))) ((inline notinline maybe-inline) - (map-args #'process-inline-declaration kind)) + (dolist (name args) + (warn-if-inline-failed/proclaim name kind) + (setf (info :function :inlinep name) + (the (and inlinep (not null)) kind)))) (deprecated (destructuring-bind (state since &rest things) args (multiple-value-bind (state software version) From 8ac83b0cbeb9ae0602a36793fef5939ebc2ceaae Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sun, 8 May 2022 02:07:06 -0700 Subject: [PATCH 3274/4023] Make it more clear why we care about DEFINED-FUNs from NAMED-LAMBDA. More generally, we'd like to distinguish the case of a defined fun coming from the same compilation block -- only in that case do we actually want references to resolve to the functional defined in the same block. That still preserves object identity from the reference. Otherwise, we need the reference to refer to the global function, since the function was defined outside the block and we don't want to reference a new entry point for that function. RECOGNIZE-KNOWN-CALL is in charge of actually doing the resolution specifically in the case of a function call, rather than a reference. In that case it doesn't matter whether the defined-fun comes from the same compilation block or not. --- src/compiler/ir1tran-lambda.lisp | 2 +- src/compiler/ir1tran.lisp | 13 ++++++------- src/compiler/node.lisp | 16 ++++++++++------ tests/block-compile.impure.lisp | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index b752c55174..36db021b48 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -1014,7 +1014,7 @@ :source-name name)) (info (info :function :info name))) (setf (functional-inlinep res) (info :function :inlinep name) - (defined-fun-named-lambda-p defined-fun-res) t) + (defined-fun-same-block-p defined-fun-res) t) (when (has-toplevelness-decl lambda-expression) (setf (functional-top-level-defun-p res) t)) ;; FIXME: Should non-entry block compiled defuns have diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 4f364ffd5c..c205635441 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -643,18 +643,15 @@ ;;; Generate a REF node for LEAF, frobbing the LEAF structure as ;;; needed. If LEAF represents a defined function which has already -;;; been converted, and is not NOTINLINE, then reference the -;;; functional instead. +;;; been converted in the same compilation block, and is not +;;; NOTINLINE, then reference the functional instead. (defun reference-leaf (start next result leaf &optional (name '.anonymous.)) (declare (type ctran start next) (type (or lvar null) result) (type leaf leaf)) (assure-leaf-live-p leaf) (let* ((type (lexenv-find leaf type-restrictions)) (leaf (or (and (defined-fun-p leaf) (neq (defined-fun-inlinep leaf) 'notinline) - ;; Only reference defined functionals from named-lambda, - ;; everything else should do this through recognize-known-call, - ;; avoiding copying references to global functions - (defined-fun-named-lambda-p leaf) + (defined-fun-same-block-p leaf) (let ((functional (defined-fun-functional leaf))) (when (and functional (not (functional-kind functional))) (maybe-reanalyze-functional functional)))) @@ -1361,7 +1358,9 @@ (setf (defined-fun-inline-expansion res) (defined-fun-inline-expansion var)) (setf (defined-fun-functionals res) - (defined-fun-functionals var))) + (defined-fun-functionals var)) + (setf (defined-fun-same-block-p res) + (defined-fun-same-block-p var))) ;; FIXME: Is this really right? Needs we not set the FUNCTIONAL ;; to the original global-var? res)) diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index 5346aa2fa0..8d0d0041b5 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -935,16 +935,20 @@ ;; global environment. (inlinep nil :type inlinep) (inline-expansion nil :type (or cons null)) - ;; List of functionals corresponding to this DEFINED-FUN: either from the - ;; conversion of a NAMED-LAMBDA, or from inline-expansion (see - ;; RECOGNIZE-KNOWN-CALL) - we need separate functionals for each policy in - ;; which the function is used. - (functionals nil :type list) - (named-lambda-p nil)) + ;; Was the function defined in this compilation block? + (same-block-p nil :type boolean) + ;; The block-local definition of this function (either because it + ;; was semi-inline, or because it was defined in this block). If + ;; this function is not an entry point, then this may be deleted or + ;; LET-converted. NULL if we haven't converted the expansion yet. + ;; Note: We need separate functionals for each policy in which + ;; the function is used. + (functionals nil :type list)) (defprinter (defined-fun :identity t :pretty-ir-printer (pretty-print-global-var structure stream)) %source-name inlinep + same-block-p (functionals :test functionals)) ;;;; function stuff diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index c0043bf2d0..28cdbf63ea 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -122,3 +122,21 @@ :before-load (lambda () (unintern (find-symbol "+STUFF+"))) :load t) (assert (= 0 (first (third (third (symbol-value '*backq-stuff*))))))) + +(with-test (:name :block-compile-same-block-references-functional) + (ctu:file-compile + `((declaim (inline bar)) + (defun bar (x) (cons x #'bar)) + + (defun foo (x) (cons (bar 9) #'bar))) + :block-compile t + :load t) + (let ((value (funcall (fdefinition 'foo) 9))) + (assert (eq (cdr value) (fdefinition 'bar))) + (assert (eq (cdar value) (fdefinition 'bar)))) + (assert (eq (sb-kernel::fun-code-header (fdefinition 'foo)) + (sb-kernel::fun-code-header (fdefinition 'bar)))) + ;; Should not have to reference any FDEFN objects, as we are + ;; compiling in the same block, allowing us to directly reference + ;; the (simple) function objects directly. + (assert (null (ctu:find-named-callees #'foo)))) From 009febab52dd22d57a0b568c92572b3f4f82d7d9 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sun, 8 May 2022 02:47:46 -0700 Subject: [PATCH 3275/4023] Remove now unneeded bootstrap cruft. --- src/compiler/proclaim.lisp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/compiler/proclaim.lisp b/src/compiler/proclaim.lisp index 49ef1c64cf..dafc342162 100644 --- a/src/compiler/proclaim.lisp +++ b/src/compiler/proclaim.lisp @@ -313,9 +313,7 @@ (when (and (eq kind 'always-bound) (eq info-value :always-bound) (not (boundp name)) ;; Allow it to be unbound at compile-time. - (not *compile-time-eval*) - ;; Check if we are still bootstrapping. - (not (boundp '*queued-proclaims*))) + (not *compile-time-eval*)) (error "Cannot proclaim an unbound symbol as ~A: ~S" kind name)) (multiple-value-bind (allowed test) From 59b5a46c403ab658d0a4124a35024602d9338790 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sun, 8 May 2022 14:47:49 -0700 Subject: [PATCH 3276/4023] Fix block compilation interaction with ftype proclamations. We need to update the cached FREE-FUNS table to make ftype proclamations take effect immediately. Code essentially ported from CMU CL. --- NEWS | 2 ++ src/compiler/ir1tran.lisp | 43 +++++++++++++++++++++++++++++++++ tests/block-compile.impure.lisp | 13 ++++++++++ 3 files changed, 58 insertions(+) diff --git a/NEWS b/NEWS index 32cf0e78c4..6dc2a21901 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,8 @@ changes relative to sbcl-2.2.4: with policy DEBUG = 1, as well as for block compiled files. * bug fix: coverage instrumentation behaves correctly with respect to non-local exits. + * bug fix: ftype proclamations now take effect immediately during block + compilation. changes in sbcl-2.2.4 relative to sbcl-2.2.3: * enhancement: better constraint propagation in the compiler. Specifically, diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index c205635441..a5393013b2 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1803,6 +1803,46 @@ :BLOCK-COMPILE is not :SPECIFIED" kind))) +;;; Update function type info cached in (FREE-FUNS *IR1-NAMESPACE*). +;;; If: +;;; -- there is a GLOBAL-VAR, then just update the type and remove the +;;; name from the list of undefined functions. Someday we should +;;; check for incompatible redeclaration. +;;; -- there is a FUNCTIONAL, then apply the type assertion to that +;;; function. This will only happen during block compilation. +(defun process-1-ftype-proclamation (name type) + (proclaim-as-fun-name name) + (let* ((free-funs (free-funs *ir1-namespace*)) + (var (gethash name free-funs))) + (etypecase var + (null) + (global-var + (setf (gethash name free-funs) + (let ((kind (global-var-kind var))) + (if (defined-fun-p var) + (make-defined-fun + :%source-name name :type type :where-from :declared :kind kind + :inlinep (defined-fun-inlinep var) + :inline-expansion (defined-fun-inline-expansion var) + :same-block-p (defined-fun-same-block-p var) + :functionals (defined-fun-functionals var)) + (make-global-var :%source-name name :type type + :where-from :declared :kind kind)))) + (when (defined-fun-p var) + (let ((fun (defined-fun-functional var))) + (when fun + (assert-definition-type fun type + :unwinnage-fun #'compiler-notify + :where "this declaration")))))))) + +(defun process-ftype-proclamation (spec names) + (declare (list names)) + (let ((type (specifier-type spec))) + (unless (csubtypep type (specifier-type 'function)) + (error "Not a function type: ~/sb-impl:print-type/" spec)) + (dolist (name names) + (process-1-ftype-proclamation name type)))) + ;;; Similar in effect to FTYPE, but change the :INLINEP. Copying the ;;; global-var ensures that when we substitute a functional for a ;;; global var (i.e. for DEFUN) that we won't clobber any uses @@ -1830,5 +1870,8 @@ ((start-block end-block) #-(and sb-devel sb-xc-host) (process-block-compile-proclamation kind args)) + (ftype + (destructuring-bind (spec &rest args) args + (process-ftype-proclamation spec args))) ((inline notinline maybe-inline) (process-inline-proclamation kind args)))) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index 28cdbf63ea..af79477461 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -140,3 +140,16 @@ ;; compiling in the same block, allowing us to directly reference ;; the (simple) function objects directly. (assert (null (ctu:find-named-callees #'foo)))) + +(with-test (:name :block-compile-ftype-proclamation) + (ctu:file-compile + `((declaim (ftype function zoo)) + (defun bar1 (x) (zoo x)) + + (declaim (ftype (function (t) (values integer &optional)) bar1)) + + (defun foo1 (z) (bar1 z))) + :block-compile t + :load t) + (assert (ctype= (caddr (sb-kernel::%simple-fun-type (fdefinition 'foo1))) + '(values integer &optional)))) From 5be450eadfb5c8af19cd3f4fe13089a81f3defeb Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 8 May 2022 18:17:54 -0400 Subject: [PATCH 3277/4023] Missing inclusion --- src/runtime/os-common.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 6d9fb6dfe6..95c7499d82 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -372,6 +372,7 @@ char *copied_string(char *string) } #ifdef LISP_FEATURE_UNIX +#include "gc-internal.h" void os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) { From fa9fa3839f00c27cf3cc0c3bdda62a56b81da4a8 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sun, 8 May 2022 15:47:29 -0700 Subject: [PATCH 3278/4023] Fix kludge. Rather than nuking the entry in the FREE-VARS table, simply update the global var structure when a proclaim is processed at compile time. --- src/compiler/ir1tran.lisp | 16 +++++++++++++++- src/compiler/proclaim.lisp | 6 ------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index a5393013b2..90ac610e56 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1781,7 +1781,7 @@ ;;; PROCLAIM changes the global environment, so we must handle its ;;; compile time side effects if we are to keep the information in the ;;; (FREE-xxx *IR1-NAMESPACE*) tables up to date. When there is a var -;;; structure we disown it by replacing it with an updated copy. Uses +;;; structure we disown it by replacing it with an updated copy. Uses ;;; of the variable which were translated before the PROCLAIM will get ;;; the old version, while subsequent references will get the updated ;;; information. @@ -1867,6 +1867,20 @@ ;;; compiler, rather than the global environment. (defun %compiler-proclaim (kind args) (case kind + ((special global) + (dolist (name args) + (let* ((free-vars (free-vars *ir1-namespace*)) + (old (gethash name free-vars))) + (when old + (ecase (global-var-kind old) + (:special :global) + (:unknown + (setf (gethash name free-vars) + (make-global-var :%source-name name :type (leaf-type old) + :where-from (leaf-where-from old) + :kind (ecase kind + (special :special) + (global :global)))))))))) ((start-block end-block) #-(and sb-devel sb-xc-host) (process-block-compile-proclamation kind args)) diff --git a/src/compiler/proclaim.lisp b/src/compiler/proclaim.lisp index dafc342162..8949805f7f 100644 --- a/src/compiler/proclaim.lisp +++ b/src/compiler/proclaim.lisp @@ -319,14 +319,8 @@ (multiple-value-bind (allowed test) (ecase kind (special - ;; KLUDGE: There is probably a better place to do this. - (when (boundp '*ir1-namespace*) - (remhash name (free-vars *ir1-namespace*))) (values '(:special :unknown) #'eq)) (global - ;; KLUDGE: Ditto. - (when (boundp '*ir1-namespace*) - (remhash name (free-vars *ir1-namespace*))) (values '(:global :unknown) #'eq)) (always-bound (values '(:constant) #'neq))) (let ((old (info :variable :kind name))) From e3f3c0ff3e99ac8c688d2ba5ff02953a3983b49d Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 9 May 2022 12:47:35 -0700 Subject: [PATCH 3279/4023] Add a regression test for 0a6ab8a47fa6e2d1385516bbc3ae2aad451916e9. --- contrib/sb-cover/tests.lisp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/contrib/sb-cover/tests.lisp b/contrib/sb-cover/tests.lisp index aa8eb349ea..bbcbd8151a 100644 --- a/contrib/sb-cover/tests.lisp +++ b/contrib/sb-cover/tests.lisp @@ -144,6 +144,18 @@ (assert (= 12 (sb-cover::ok-of (getf sb-cover::*counts* :expression)))) (assert (= 16 (sb-cover::all-of (getf sb-cover::*counts* :expression)))) +;; And then ensure that non-local exits from local calls are handled +;; correctly as well. +(sb-cover:clear-coverage) +(compile-load "test-data-6") +(nlx-from-flet) +(report) + +(assert (zerop (sb-cover::ok-of (getf sb-cover::*counts* :branch)))) +(assert (zerop (sb-cover::all-of (getf sb-cover::*counts* :branch)))) +(assert (= 7 (sb-cover::ok-of (getf sb-cover::*counts* :expression)))) +(assert (= 11 (sb-cover::all-of (getf sb-cover::*counts* :expression)))) + ;; Clean up after the tests (map nil #'delete-file (directory (merge-pathnames #p"*.html" *output-directory*))) From ae86191b9fc1cce8ef0bc1b280480af3f3fb3c6c Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 9 May 2022 13:22:15 -0700 Subject: [PATCH 3280/4023] Missing file. argh --- contrib/sb-cover/test-data-6.lisp | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 contrib/sb-cover/test-data-6.lisp diff --git a/contrib/sb-cover/test-data-6.lisp b/contrib/sb-cover/test-data-6.lisp new file mode 100644 index 0000000000..1492809adf --- /dev/null +++ b/contrib/sb-cover/test-data-6.lisp @@ -0,0 +1,8 @@ +(declaim (optimize sb-c:store-coverage-data)) + +(defun nlx-from-flet () + (flet ((foo (x) + (return-from nlx-from-flet x))) + (foo 3) + (print "reached") + (foo 4))) From 9fb90aa98280ef2f88927400a0e56db2e84b3bcb Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 9 May 2022 23:13:07 -0700 Subject: [PATCH 3281/4023] Fix function type clobbering in a principled way. The test case that brought on FUNCTIONAL-TOP-LEVEL-DEFUN-P was always a bit suspect because we've decided that by default we want to assume functions in the same file can't be redefined, and hence the test case should have undefined behavior. The fix introducing FUNCTIONAL-TOP-LEVEL-DEFUN-P (9cb20dfbaa0dc4e1f51c8b4d5ed5601f4482619b) was also just wrong because it broke another test case that was basically the inverse of the original test case. So we extend *DERIVE-FUNCTION-TYPES* to actually be able to handle the case when people want the full ability to do function redefinition, and leave *DERIVE-FUNCTION-TYPES* to :SAME-FILE (a new keyword) by default, which matches the status quo behavior. This area of the compiler could probably use some clean up, since it seems in many places we were two minds when it came to how much of the early binding in the same file we actually wanted to expose type-wise in the compiler. --- NEWS | 4 ++ src/code/cross-misc.lisp | 3 -- src/code/macros.lisp | 1 - src/code/save.lisp | 2 +- src/cold/warm.lisp | 5 ++- src/compiler/ir1final.lisp | 67 +++++++++++++++++--------------- src/compiler/ir1tran-lambda.lisp | 10 ----- src/compiler/ir1tran.lisp | 18 ++++----- src/compiler/node.lisp | 2 - tests/compiler.impure-cload.lisp | 31 ++++++++++++--- 10 files changed, 77 insertions(+), 66 deletions(-) diff --git a/NEWS b/NEWS index 6dc2a21901..cb40775ee3 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,10 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.2.4: + * slightly incompatible change: SB-EXT:*DERIVE-FUNCTION-TYPES* being NIL now + means that function calls will strictly only use type information from + proclaimed ftypes. The previous behavior (still the default) of using + derived type information from the same file is specified with :SAME-FILE. * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. * enhancement: debug source locations now work correctly for top level forms diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index a9fbe7c62b..90a1e551af 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -284,9 +284,6 @@ ;;;; in lieu of #+sb-xc-host elsewere which messes up toplevel form numbers. (in-package "SB-C") -;;; For macro lambdas that are processed by the host -(declaim (declaration top-level-form)) - ;;; The opposite of *undefined-fun-allowlist* - if certain full calls ;;; are seen, it is probably the result of a missed transform and/or ;;; misconfiguration. diff --git a/src/code/macros.lisp b/src/code/macros.lisp index e162b36a91..54ec2c6779 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -121,7 +121,6 @@ tree structure resulting from the evaluation of EXPRESSION." (lambda-guts `(,@decls (block ,(fun-name-block-name name) ,@forms))) (lambda `(lambda ,lambda-list ,@lambda-guts)) (named-lambda `(named-lambda ,name ,lambda-list - ,@(when *top-level-form-p* '((declare (sb-c::top-level-form)))) ,@(when doc (list doc)) ,@lambda-guts)) ;; DXABLE-ARGS and SNIPPET are mutually exclusive, so we can sleazily pass ;; whichever exists (if either does) as one parameter to %DEFUN. diff --git a/src/code/save.lisp b/src/code/save.lisp index 084c69c021..0b66123744 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -81,7 +81,7 @@ sb-kernel::*gc-epoch*)) (defun start-lisp (toplevel callable-exports) - (named-lambda start-lisp () + (named-lambda %start-lisp () (cond (callable-exports (reinit t) (dolist (export callable-exports) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 3246205320..01941a4b07 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -165,8 +165,9 @@ sb-kernel::(rplaca (last *handler-clusters*) (car **initial-handler-clusters**)) ((t) (let ((sb-c::*source-namestring* fullname) (sb-ext:*derive-function-types* - (unless (search "/pcl/" stem) - t))) + (if (search "/pcl/" stem) + :same-file + t))) (ensure-directories-exist output) ;; Like PROCLAIM-TARGET-OPTIMIZATION in 'compile-cold-sbcl' ;; We should probably stash a copy of the POLICY instance from diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index 2bb359cecf..1723ce05ca 100644 --- a/src/compiler/ir1final.lisp +++ b/src/compiler/ir1final.lisp @@ -57,45 +57,48 @@ ;;; possibility that new references might be converted to it. (defun finalize-xep-definition (fun) (let* ((leaf (functional-entry-fun fun)) + (source-name (and (leaf-has-source-name-p leaf) + (leaf-source-name leaf))) (ns *ir1-namespace*) (defined-ftype (definition-type leaf))) (setf (leaf-type leaf) defined-ftype) - (when (and (leaf-has-source-name-p leaf) - (eq (leaf-source-name leaf) (functional-debug-name leaf)) - (functional-top-level-defun-p leaf)) - (let ((source-name (leaf-source-name leaf))) - (let* ((where (info :function :where-from source-name)) - (*compiler-error-context* (lambda-bind (main-entry leaf))) - (global-def (gethash source-name (free-funs ns))) - (global-p (defined-fun-p global-def))) - (note-name-defined source-name :function) - (when global-p - (remhash source-name (free-funs ns))) - (ecase where - (:assumed - (let ((approx-type (info :function :assumed-type source-name))) - (when (and approx-type (fun-type-p defined-ftype)) - (valid-approximate-type approx-type defined-ftype)) - ;; globaldb can't enforce invariants such as :assumed-type and - ;; :type being mutually exclusive. For that reason it would have - ;; made sense to use a single info-type holding either a true - ;; function type or an approximate-fun-type. Regardless, it is - ;; slightly preferable to clear the old before setting the new. - (clear-info :function :assumed-type source-name) - (setf (info :function :type source-name) defined-ftype)) - (setf (info :function :where-from source-name) :defined)) - ((:declared :defined-method) - (let ((declared-ftype (global-ftype source-name))) - (unless (defined-ftype-matches-declared-ftype-p + (when (and source-name + (eq source-name (functional-debug-name leaf)) + ;; FIXME (?): We don't know how to set the globaldb + ;; info for these kinds of names. + (not (pcl-methodfn-name-p source-name))) + (let* ((where (info :function :where-from source-name)) + (*compiler-error-context* (lambda-bind (main-entry leaf))) + (global-def (gethash source-name (free-funs ns))) + (global-p (defined-fun-p global-def))) + (note-name-defined source-name :function) + (when global-p + (remhash source-name (free-funs ns))) + (ecase where + (:assumed + (let ((approx-type (info :function :assumed-type source-name))) + (when (and approx-type (fun-type-p defined-ftype)) + (valid-approximate-type approx-type defined-ftype)) + ;; globaldb can't enforce invariants such as :assumed-type and + ;; :type being mutually exclusive. For that reason it would have + ;; made sense to use a single info-type holding either a true + ;; function type or an approximate-fun-type. Regardless, it is + ;; slightly preferable to clear the old before setting the new. + (clear-info :function :assumed-type source-name) + (setf (info :function :type source-name) defined-ftype)) + (setf (info :function :where-from source-name) :defined)) + ((:declared :defined-method) + (let ((declared-ftype (global-ftype source-name))) + (unless (defined-ftype-matches-declared-ftype-p defined-ftype declared-ftype) - (compiler-style-warn - "~@<The previously declared FTYPE~ + (compiler-style-warn + "~@<The previously declared FTYPE~ ~2I ~_~/sb-impl:print-type/~I ~_~ conflicts with the definition type ~ ~2I~_~/sb-impl:print-type/~:>" - declared-ftype defined-ftype)))) - (:defined - (setf (info :function :type source-name) defined-ftype))))))) + declared-ftype defined-ftype)))) + (:defined + (setf (info :function :type source-name) defined-ftype)))))) (values)) ;;; Find all calls in COMPONENT to assumed functions and update the diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 36db021b48..0b91ea0326 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -981,14 +981,6 @@ (progn ,@forms)))))))) -;; FIXME: really should be an aspect of the lexical environment, -;; but LEXENVs don't know whether they are toplevel or not. -(defun has-toplevelness-decl (lambda-expr) - (dolist (expr (cddr lambda-expr)) ; Skip over (LAMBDA (ARGS)) - (cond ((equal expr '(declare (top-level-form))) (return t)) - ((typep expr '(or (cons (eql declare)) string))) ; DECL | DOCSTRING - (t (return nil))))) - ;;; helper for LAMBDA-like things, to massage them into a form ;;; suitable for IR1-CONVERT-LAMBDA. (defun ir1-convert-lambdalike (thing @@ -1015,8 +1007,6 @@ (info (info :function :info name))) (setf (functional-inlinep res) (info :function :inlinep name) (defined-fun-same-block-p defined-fun-res) t) - (when (has-toplevelness-decl lambda-expression) - (setf (functional-top-level-defun-p res) t)) ;; FIXME: Should non-entry block compiled defuns have ;; this propagate? (assert-global-function-definition-type name res) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 90ac610e56..237648e039 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -112,12 +112,12 @@ *current-path*)))) (funcall thunk))) -(defvar *derive-function-types* nil - "Should the compiler assume that function types will never change, - so that it can use type information inferred from current definitions - to optimize code which uses those definitions? Setting this true - gives non-ANSI, early-CMU-CL behavior. It can be useful for improving - the efficiency of stable code.") +(defvar *derive-function-types* :same-file + "If true, argument and result type information derived from + compilation of DEFUNs is used when compiling calls to that + function. If :SAME-FILE (the default, as allowed by ANSI 3.2.2.3), + the information is derived only from DEFUNs in the same file. If + false, only information from FTYPE proclamations will be used.") ;;;; namespace management utilities @@ -214,10 +214,11 @@ :type (if (or (eq where :declared) (and (not latep) (not notinline) - *derive-function-types*)) + (eq *derive-function-types* t))) ftype (specifier-type 'function)) - :defined-type (if (and (not latep) (not notinline)) + :defined-type (if (and (not latep) (not notinline) + *derive-function-types*) ftype (specifier-type 'function)) :where-from (if notinline @@ -1695,7 +1696,6 @@ it)) (setq explicit-check (or (cdr spec) t) allow-explicit-check nil)) ; at most one of this decl - ((equal spec '(top-level-form))) ; ignore ((typep spec '(cons (eql source-form))) (setf source-form (cadr spec))) ;; Used only for the current function. diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index 8d0d0041b5..6cff013ec6 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -1106,8 +1106,6 @@ ;; True if this functional was created from an inline expansion. This ;; is either T, or the GLOBAL-VAR for which it is an expansion. (inline-expanded nil) - ;; Is it coming from a top-level NAMED-LAMBDA? - (top-level-defun-p nil) (ignore nil)) (defun pretty-print-functional (functional stream) diff --git a/tests/compiler.impure-cload.lisp b/tests/compiler.impure-cload.lisp index 5ddd434a8b..c1f31ec227 100644 --- a/tests/compiler.impure-cload.lisp +++ b/tests/compiler.impure-cload.lisp @@ -570,18 +570,37 @@ (with-test (:name :optional-default-hairy-defconstant) (assert (eq (first (f)) foo-vector))) -(defun non-top-level-type-clobbering () +(eval-when (:compile-toplevel) + (setq sb-ext:*derive-function-types* nil)) + +(defun type-clobbering () 99) (when nil - (defun non-top-level-type-clobbering () + (defun type-clobbering () + 93)) + +(defun uses-type-clobbering () + (eq (type-clobbering) 99)) + +(with-test (:name :type-clobbering) + (assert (uses-type-clobbering))) + +(defun type-clobbering.2 () + 99) + +(when t + (defun type-clobbering.2 () 93)) -(defun non-top-level-type-clobbering2 () - (eq (non-top-level-type-clobbering) 99)) +(defun uses-type-clobbering.2 () + (eq (type-clobbering.2) 93)) + +(with-test (:name :type-clobbering.2) + (assert (uses-type-clobbering.2))) -(with-test (:name :non-top-level-type-clobbering) - (assert (non-top-level-type-clobbering2))) +(eval-when (:compile-toplevel) + (setq sb-ext:*derive-function-types* :same-file)) (macrolet ((x () '#(a b c d))) (defun constant-test-1 () From 006ccc85acfcd7a67e95080db8bad2c20e587409 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 9 May 2022 23:25:17 -0700 Subject: [PATCH 3282/4023] Use :BLOCK-COMPILE :SPECIFIED for warm compiled files. To make the policy match that of the policy for cross compiled files. --- src/cold/warm.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 01941a4b07..2a67c49a2e 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -164,6 +164,7 @@ sb-kernel::(rplaca (last *handler-clusters*) (car **initial-handler-clusters**)) (ecase (if (boundp '*compile-files-p*) *compile-files-p* t) ((t) (let ((sb-c::*source-namestring* fullname) + (sb-ext:*block-compile-default* :specified) (sb-ext:*derive-function-types* (if (search "/pcl/" stem) :same-file From 6d339fd69d009388a0788c28da23101a2bd6a093 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 10 May 2022 00:53:14 -0700 Subject: [PATCH 3283/4023] Revert "Use :BLOCK-COMPILE :SPECIFIED for warm compiled files." This reverts commit 006ccc85acfcd7a67e95080db8bad2c20e587409. We already recognize self calls by default, so this doesn't actually do anything. The problem is that we need to turn off self call recognition for map-allocated-objects, or else we cons the &rest list as noted by the KLUDGE. --- src/cold/warm.lisp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 2a67c49a2e..01941a4b07 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -164,7 +164,6 @@ sb-kernel::(rplaca (last *handler-clusters*) (car **initial-handler-clusters**)) (ecase (if (boundp '*compile-files-p*) *compile-files-p* t) ((t) (let ((sb-c::*source-namestring* fullname) - (sb-ext:*block-compile-default* :specified) (sb-ext:*derive-function-types* (if (search "/pcl/" stem) :same-file From 6ce670cc61cf4952ea8e4183b56bf3581b63a74f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 10 May 2022 13:33:17 -0400 Subject: [PATCH 3284/4023] Remove a native_pointer() use - No need to strip lowtag when comparing for end-of-page - Explain the filler insertion logic some more --- src/runtime/gencgc.c | 11 ++++++++--- tests/gc-slow.impure.lisp | 3 +-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index b20281beb1..c77d100f5d 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2344,12 +2344,17 @@ static void obliterate_nonpinned_words() uword_t obj_end_pageaddr = page_base(obj_end - 1); // See if there's another pinned object on this page. // There is always a next object, due to the sentinel. - if ((uword_t)native_pointer(keys[i+1]) < obj_end_pageaddr + GENCGC_PAGE_BYTES) { + if (keys[i+1] < obj_end_pageaddr + GENCGC_PAGE_BYTES) { // Next object starts within the same page. fill_from = obj_end; } else { - // Next pinned object does not start on the same page this obj ends on. - // Any bytes following 'obj' up to its page end are garbage. + /* Next pinned object does not start on the same page this obj ends on. + * Any bytes following 'obj' up to its page end are garbage. + * The reason we don't merely reduce the page_bytes_used is that decreasing + * the grand total bytes allocated had a tendency to delay triggering the + * next GC. This phenomenon was especially bad if the only pinned objects + * were at the start of a page, as it caused the entire rest of the page to + * be unusable. :SMALLOBJ-AUTO-GC-TRIGGER from rev dfddbc8a tests this */ uword_t page_end = obj_end_pageaddr + page_bytes_used(end_page_index); deposit_filler(obj_end, page_end - obj_end); fill_from = page_base(keys[i+1]); diff --git a/tests/gc-slow.impure.lisp b/tests/gc-slow.impure.lisp index 73f4fe632b..510e6dd271 100644 --- a/tests/gc-slow.impure.lisp +++ b/tests/gc-slow.impure.lisp @@ -40,8 +40,7 @@ ;;; an accumulation of pages in generation 1 each with 2 objects' worth ;;; of bytes, and the remainder waste. Because the waste was not accounted ;;; for, it did not trigger GC enough to avoid heap exhaustion. -(with-test (:name :smallobj-auto-gc-trigger - :skipped-on :cheneygc) ; test doesn't test anything +(with-test (:name :smallobj-auto-gc-trigger) ;; Ensure that these are compiled functions because the interpreter ;; would make lots of objects of various sizes which is insufficient ;; to provoke the bug. From 5e5f43fc49c0cda002bb3dde4ac686d1418d3d54 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 10 May 2022 21:49:24 +0300 Subject: [PATCH 3285/4023] Add a type deriver for REDUCE. --- src/compiler/seqtran.lisp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 5663c129d7..04ea4d35d0 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -2785,3 +2785,16 @@ `(sb-impl::tree-equal-eql list1 list2)) (t (give-up-ir1-transform)))) + +(defoptimizer (reduce derive-type) ((fun sequence + &key + initial-value + &allow-other-keys)) + (declare (ignore sequence)) + (let ((fun-type (lvar-type fun)) + result) + (when (fun-type-p fun-type) + (setf result (single-value-type (fun-type-returns fun-type))) + (if initial-value + (type-union result (lvar-type initial-value)) + result)))) From 9cdf62ab15bbaf998a7320bcf64817e7f8514d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 09:04:30 +0000 Subject: [PATCH 3286/4023] Support user-defined functions in TRACE's :REPORT option :REPORT option of NIL and TRACE maintain the same semantics, and additionally any function designator may be provided which is then funcalled for each trace event and may be used to implement custom report methods, e.g., an integration with SLIME. New special variable *TRACE-REPORT-DEFAULT* defaults to 'TRACE and controls the default value of the :REPORT option. --- doc/manual/debugger.texinfo | 2 ++ src/code/early-ntrace.lisp | 8 ++++++-- src/code/ntrace.lisp | 38 ++++++++++++++++++++++++++++--------- src/cold/exports.lisp | 1 + tests/debug.impure.lisp | 18 ++++++++++++++++++ 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/doc/manual/debugger.texinfo b/doc/manual/debugger.texinfo index a90e75a3a9..76b315ba01 100644 --- a/doc/manual/debugger.texinfo +++ b/doc/manual/debugger.texinfo @@ -1086,6 +1086,8 @@ function entry or exit. @include var-sb-debug-star-trace-encapsulate-default-star.texinfo +@include var-sb-debug-star-trace-report-default-star.texinfo + @comment FIXME rudi 2004-03-26: encapsulate is (per TODO file as of @comment 0.8.9) in a state of flux. When it's sorted out, revive the @comment cmucl documentation. diff --git a/src/code/early-ntrace.lisp b/src/code/early-ntrace.lisp index c57382260d..f429eb738b 100644 --- a/src/code/early-ntrace.lisp +++ b/src/code/early-ntrace.lisp @@ -20,6 +20,10 @@ (defvar *trace-encapsulate-default* t "the default value for the :ENCAPSULATE option to TRACE") + +(defvar *trace-report-default* 'trace + "the default value for the :REPORT option to TRACE") + ;;;; internal state @@ -29,7 +33,7 @@ (make-hash-table :test 'eq :synchronized t)) (deftype trace-report-type () - '(member nil trace)) + '(or symbol function)) ;;; A TRACE-INFO object represents all the information we need to ;;; trace a given function. @@ -64,7 +68,7 @@ ;; (the default.) ;; report type - (report 'trace :type trace-report-type) + (report *trace-report-default* :type trace-report-type) ;; current environment forms (condition nil) (break nil) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index c038179084..894c241f0a 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -161,7 +161,9 @@ (defun trace-start-breakpoint-fun (info) (let (conditionp) (values - (lambda (frame bpt &rest args) + ;; HOOK-ARGS holds the function arguments when tracing via + ;; encapsulation and but is NIL when tracing via breakpoints. + (lambda (frame bpt &rest hook-args) (declare (ignore bpt)) (discard-invalid-entries frame) (let ((condition (trace-info-condition info)) @@ -169,7 +171,7 @@ (setq conditionp (and (not *in-trace*) (or (not condition) - (apply (cdr condition) frame args)) + (apply (cdr condition) frame hook-args)) (or (not wherein) (trace-wherein-p frame wherein))))) (when conditionp @@ -178,23 +180,31 @@ (*current-level-in-print* 0) (*standard-output* (make-string-output-stream)) (*in-trace* t)) - (ecase (trace-info-report info) + (case (trace-info-report info) (trace (fresh-line) (print-trace-indentation) (if (trace-info-encapsulated info) (prin1 `(,(trace-info-what info) - ,@(mapcar #'ensure-printable-object args))) + ,@(mapcar #'ensure-printable-object hook-args))) (print-frame-call frame *standard-output*)) (terpri) - (apply #'trace-print frame (trace-info-print info) args)) + (apply #'trace-print frame (trace-info-print info) hook-args)) ((nil) - (apply #'trace-print-unadorned frame (trace-info-print info) args))) + (apply #'trace-print-unadorned frame (trace-info-print info) hook-args)) + (t + (funcall (trace-info-report info) + (count-if #'cdr *traced-entries*) + (trace-info-what info) :enter frame + (if (trace-info-encapsulated info) + hook-args + (nth-value 1 (frame-call frame)))) + (apply #'trace-print-unadorned frame (trace-info-print info) hook-args))) (write-sequence (get-output-stream-string *standard-output*) *trace-output*) (finish-output *trace-output*)) (apply #'trace-maybe-break info (trace-info-break info) "before" - frame args)))) + frame hook-args)))) (lambda (frame cookie) (declare (ignore frame)) (push (cons cookie conditionp) *traced-entries*))))) @@ -221,7 +231,7 @@ (let ((*current-level-in-print* 0) (*standard-output* (make-string-output-stream)) (*in-trace* t)) - (ecase (trace-info-report info) + (case (trace-info-report info) (trace (fresh-line) (let ((*print-pretty* t)) @@ -236,6 +246,11 @@ (terpri)) (apply #'trace-print frame (trace-info-print-after info) values)) ((nil) + (apply #'trace-print-unadorned frame (trace-info-print-after info) values)) + (t + (funcall (trace-info-report info) + (count-if #'cdr *traced-entries*) + (trace-info-what info) :exit frame values) (apply #'trace-print-unadorned frame (trace-info-print-after info) values))) (write-sequence (get-output-stream-string *standard-output*) *trace-output*) @@ -514,7 +529,12 @@ The following options are defined: If Report-Type is TRACE (the default) then information is reported by printing immediately. If Report-Type is NIL, then the only effect of the trace is to execute other - options (e.g. PRINT or BREAK). + options (e.g. PRINT or BREAK). Otherwise, Report-Type is + treated as a function designator and, for each trace event, + funcalled with 5 arguments: trace depth (a non-negative + integer), a function name or a function object, + :ENTER or :EXIT, a stack frame, and a list of values (arguments + or return values). :CONDITION Form :CONDITION-AFTER Form diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 1322333deb..80f843a5e9 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -721,6 +721,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "INTERNAL-DEBUG" "VAR" "*STACK-TOP-HINT*" "*TRACE-ENCAPSULATE-DEFAULT*" + "*TRACE-REPORT-DEFAULT*" "FRAME-HAS-DEBUG-TAG-P" "UNWIND-TO-FRAME-AND-CALL" ;; Deprecated diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index fd8e4af35e..b3e9292e12 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -148,6 +148,24 @@ 1~@ 0~%"))))) +(defvar *collected-traces*) +(defun custom-trace-report (depth what when frame values) + (push (list* depth what when (sb-debug::frame-p frame) values) + *collected-traces*)) + +(with-test (:name (trace :custom-report)) + (let ((*collected-traces* nil)) + (let ((output (with-traced-function (trace-fact :report custom-trace-report) + (trace-fact 2)))) + (assert (zerop (length output))) + (assert (equalp (reverse *collected-traces*) + '((0 trace-fact :enter t 2) + (1 trace-fact :enter t 1) + (2 trace-fact :enter t 0) + (2 trace-fact :exit t 1) + (1 trace-fact :exit t 1) + (0 trace-fact :exit t 2))))))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From 44d35ca30be710786913b0fcbfe06af584ec2ba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 09:04:30 +0000 Subject: [PATCH 3287/4023] Implement encapsulated method tracing Syntax: (trace (method <name> {qualifier}* ({class}*))). Use the same method wrapping approach used by (TRACE :ENCAPSULATED T :METHODS T ...) but for specific methods rather than every method. --- src/code/early-ntrace.lisp | 6 +- src/code/ntrace.lisp | 284 ++++++++++++++++++++----------------- src/pcl/combin.lisp | 20 ++- tests/debug.impure.lisp | 135 ++++++++++++++++++ 4 files changed, 304 insertions(+), 141 deletions(-) diff --git a/src/code/early-ntrace.lisp b/src/code/early-ntrace.lisp index f429eb738b..04ab0ca6de 100644 --- a/src/code/early-ntrace.lisp +++ b/src/code/early-ntrace.lisp @@ -28,9 +28,11 @@ ;;;; internal state ;;; a hash table that maps each traced function to the TRACE-INFO. The -;;; entry for a closure is the shared function entry object. +;;; entry for a closure is the shared function entry object. The entry +;;; for a method is a (CL:METHOD name qualifiers* (specializers*)) +;;; list. (define-load-time-global *traced-funs* - (make-hash-table :test 'eq :synchronized t)) + (make-hash-table :test 'equal :synchronized t)) (deftype trace-report-type () '(or symbol function)) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 894c241f0a..c13b13a053 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -17,41 +17,49 @@ ;;;; utilities -;;; Given a function name, a function or a macro name, return the raw -;;; definition and some information. "Raw" means that if the result is -;;; a closure, we strip off the closure and return the bare code. The -;;; second value is T if the argument was a function name. The third -;;; value is one of :COMPILED, :COMPILED-CLOSURE, :INTERPRETED, -;;; :INTERPRETED-CLOSURE and :FUNCALLABLE-INSTANCE. +;;; Given a function name, a method name, a function or a macro name, +;;; return the raw definition and some information. "Raw" means that +;;; if the result is a closure, we strip off the closure and return +;;; the bare code. The second value is T if the argument was a +;;; function name. The third value is one of :COMPILED, +;;; :COMPILED-CLOSURE, :INTERPRETED, :INTERPRETED-CLOSURE and +;;; :FUNCALLABLE-INSTANCE. The fourth value is a method name, when +;;; applicable. (defun trace-fdefinition (x) - (flet ((get-def () - (if (valid-function-name-p x) - (if (fboundp x) - (fdefinition x) + (flet ((get-def (name) + (if (valid-function-name-p name) + (if (fboundp name) + (fdefinition name) (warn "~/sb-ext:print-symbol-with-prefix/ is ~ - undefined, not tracing." x)) - (warn "~S is not a valid function name, not tracing." x)))) - (multiple-value-bind (res named-p) + undefined, not tracing." name)) + (warn "~S is not a valid function name, not tracing." name)))) + (multiple-value-bind (res named-p method) (typecase x - (symbol - (cond ((special-operator-p x) - (warn "~S is a special operator, not tracing." x)) - ((macro-function x)) - (t - (values (get-def) t)))) - (function - x) - (t - (values (get-def) t))) - (typecase res - (closure - (values (%closure-fun res) named-p :compiled-closure)) - (funcallable-instance - (values res named-p :funcallable-instance)) - ;; FIXME: What about SB-KERNEL:INTERPRETED-FUNCTION -- it gets picked off - ;; by the FIN above, is that right? - (t - (values res named-p :compiled)))))) + (symbol + (cond ((special-operator-p x) + (warn "~S is a special operator, not tracing." x)) + ((macro-function x)) + (t + (values (get-def x) t)))) + (function + x) + ((cons (eql method)) + (let ((gf (get-def (second x)))) + (when gf + (if (find-method gf (butlast (cddr x)) (car (last x)) nil) + (values gf t x) + (warn "~S not found, not tracing." x))))) + (t + (values (get-def x) t))) + (typecase res + (closure + (values (%closure-fun res) named-p :compiled-closure method)) + (funcallable-instance + (values res named-p :funcallable-instance method)) + ;; FIXME: What about SB-KERNEL:INTERPRETED-FUNCTION -- it gets + ;; picked off by the FIN above, is that right? + (t + (values res named-p :compiled method)))))) ;;; When a function name is redefined, and we were tracing that name, ;;; then untrace the old definition and trace the new one. @@ -295,83 +303,86 @@ ;;; If non-null, DEFINITION is the new definition of a function that ;;; we are automatically retracing. (defun trace-1 (function-or-name info &optional definition) - (multiple-value-bind (fun named kind) + (multiple-value-bind (fun named kind method) (if definition (values definition t (nth-value 2 (trace-fdefinition definition))) (trace-fdefinition function-or-name)) (when fun - (when (gethash fun *traced-funs*) - (warn "~S is already TRACE'd, untracing it first." function-or-name) - (untrace-1 fun)) - (let* ((debug-fun (sb-di:fun-debug-fun fun)) - (encapsulated - (if (eq (trace-info-encapsulated info) :default) - (ecase kind - (:compiled nil) - (:compiled-closure - (unless (functionp function-or-name) - (warn "tracing shared code for ~S:~% ~S" - function-or-name - fun)) - nil) - ((:interpreted :interpreted-closure :funcallable-instance) - t)) - (trace-info-encapsulated info))) - (loc (if encapsulated - :encapsulated - (sb-di:debug-fun-start-location debug-fun))) - (info (make-trace-info - :what function-or-name - :named named - :encapsulated encapsulated - :wherein (trace-info-wherein info) - :methods (trace-info-methods info) - :condition (coerce-form (trace-info-condition info) loc) - :break (coerce-form (trace-info-break info) loc) - :report (trace-info-report info) - :print (coerce-form-list (trace-info-print info) loc) - :break-after (coerce-form (trace-info-break-after info) nil) - :condition-after - (coerce-form (trace-info-condition-after info) nil) - :print-after - (coerce-form-list (trace-info-print-after info) nil)))) - - (dolist (wherein (trace-info-wherein info)) - (unless (or (stringp wherein) - (fboundp wherein)) - (warn ":WHEREIN name ~S is not a defined global function." - wherein))) - - (cond - (encapsulated - (unless named - (error "can't use encapsulation to trace anonymous function ~S" - fun)) - (encapsulate function-or-name 'trace - (lambda (function &rest args) - (apply #'trace-call info function args)))) - (t - (multiple-value-bind (start-fun cookie-fun) - (trace-start-breakpoint-fun info) - (let ((start (sb-di:make-breakpoint start-fun debug-fun - :kind :fun-start)) - (end (sb-di:make-breakpoint - (trace-end-breakpoint-fun info) - debug-fun :kind :fun-end - :fun-end-cookie cookie-fun))) - (setf (trace-info-start-breakpoint info) start) - (setf (trace-info-end-breakpoint info) end) - ;; The next two forms must be in the order in which they - ;; appear, since the start breakpoint must run before the - ;; fun-end breakpoint's start helper (which calls the - ;; cookie function.) One reason is that cookie function - ;; requires that the CONDITIONP shared closure variable be - ;; initialized. - (sb-di:activate-breakpoint start) - (sb-di:activate-breakpoint end))))) - - (setf (gethash fun *traced-funs*) info)) + (let ((trace-key (or method fun))) + (when (gethash trace-key *traced-funs*) + (warn "~S is already TRACE'd, untracing it first." function-or-name) + (untrace-1 trace-key)) + (let* ((debug-fun (sb-di:fun-debug-fun fun)) + (encapsulated + (if (eq (trace-info-encapsulated info) :default) + (ecase kind + (:compiled nil) + (:compiled-closure + (unless (functionp function-or-name) + (warn "tracing shared code for ~S:~% ~S" + function-or-name + fun)) + nil) + ((:interpreted :interpreted-closure :funcallable-instance) + t)) + (trace-info-encapsulated info))) + (loc (if encapsulated + :encapsulated + (sb-di:debug-fun-start-location debug-fun))) + (info (make-trace-info + :what function-or-name + :named named + :encapsulated encapsulated + :wherein (trace-info-wherein info) + :methods (trace-info-methods info) + :condition (coerce-form (trace-info-condition info) loc) + :break (coerce-form (trace-info-break info) loc) + :report (trace-info-report info) + :print (coerce-form-list (trace-info-print info) loc) + :break-after (coerce-form (trace-info-break-after info) nil) + :condition-after + (coerce-form (trace-info-condition-after info) nil) + :print-after + (coerce-form-list (trace-info-print-after info) nil)))) + + (dolist (wherein (trace-info-wherein info)) + (unless (or (stringp wherein) + (fboundp wherein)) + (warn ":WHEREIN name ~S is not a defined global function." + wherein))) + + (cond + (encapsulated + (unless named + (error "can't use encapsulation to trace anonymous function ~S" + fun)) + (if method + (reinitialize-instance fun) + (encapsulate function-or-name 'trace + (lambda (function &rest args) + (apply #'trace-call info function args))))) + (t + (multiple-value-bind (start-fun cookie-fun) + (trace-start-breakpoint-fun info) + (let ((start (sb-di:make-breakpoint start-fun debug-fun + :kind :fun-start)) + (end (sb-di:make-breakpoint + (trace-end-breakpoint-fun info) + debug-fun :kind :fun-end + :fun-end-cookie cookie-fun))) + (setf (trace-info-start-breakpoint info) start) + (setf (trace-info-end-breakpoint info) end) + ;; The next two forms must be in the order in which they + ;; appear, since the start breakpoint must run before the + ;; fun-end breakpoint's start helper (which calls the + ;; cookie function.) One reason is that cookie function + ;; requires that the CONDITIONP shared closure variable be + ;; initialized. + (sb-di:activate-breakpoint start) + (sb-di:activate-breakpoint end))))) + + (setf (gethash trace-key *traced-funs*) info))) (when (and (typep fun 'generic-function) (trace-info-methods info) @@ -459,6 +470,8 @@ (when (endp current) (return)) (let ((name (pop current)) (options (copy-trace-info global-options))) + ;; parse options for the current spec. + (setq current (parse-trace-options current options)) (cond ((eq name :function) (let ((temp (gensym))) @@ -478,10 +491,12 @@ (let ((setf-name `(setf ,symbol))) (when (fboundp setf-name) (forms `(trace-1 ',setf-name ',options)))))))) - ;; special-case METHOD: it itself is not a general function - ;; name symbol, but it (at least here) designates one of a - ;; pair of such. - ((and (consp name) (eq (car name) 'method)) + ;; special-case METHOD (without encapsulation): it itself + ;; is not a general function name symbol, but it (at least + ;; here) designates one of a pair of such. + ((and (consp name) + (eq (car name) 'method) + (not (trace-info-encapsulated options))) (when (fboundp (list* 'sb-pcl::slow-method (cdr name))) (forms `(trace-1 ',(list* 'sb-pcl::slow-method (cdr name)) ',options))) @@ -489,9 +504,7 @@ (forms `(trace-1 ',(list* 'sb-pcl::fast-method (cdr name)) ',options)))) (t - (forms `(trace-1 ',name ',options)))) - (setq current (parse-trace-options current options))))) - + (forms `(trace-1 ',name ',options))))))) `(let ,(binds) (remove nil (list ,@(forms)))))) @@ -596,28 +609,33 @@ the N-th value returned by the function." ;;; Untrace one function. (defun untrace-1 (function-or-name) - (let* ((fun (trace-fdefinition function-or-name)) - (info (when fun (gethash fun *traced-funs*)))) - (cond - ((and fun (not info)) - (warn "Function is not TRACEd: ~S" function-or-name)) - ((not fun) - ;; Someone has FMAKUNBOUND it. - (let ((table *traced-funs*)) - (with-system-mutex ((hash-table-lock table)) - (maphash (lambda (fun info) - (when (equal function-or-name (trace-info-what info)) - (remhash fun table))) - table)))) - (t - (cond - ((trace-info-encapsulated info) - (unencapsulate (trace-info-what info) 'trace)) - (t - (sb-di:delete-breakpoint (trace-info-start-breakpoint info)) - (sb-di:delete-breakpoint (trace-info-end-breakpoint info)))) - (setf (trace-info-untraced info) t) - (remhash fun *traced-funs*))))) + (multiple-value-bind (fun named kind method) + (trace-fdefinition function-or-name) + (declare (ignore named kind)) + (let* ((trace-key (or method fun)) + (info (when fun (gethash trace-key *traced-funs*)))) + (cond + ((and fun (not info)) + (warn "Function is not TRACEd: ~S" function-or-name)) + ((not fun) + ;; Someone has FMAKUNBOUND it. + (let ((table *traced-funs*)) + (with-system-mutex ((hash-table-lock table)) + (maphash (lambda (key info) + (when (equal function-or-name (trace-info-what info)) + (remhash key table))) + table)))) + (t + (cond + ((trace-info-encapsulated info) + (if method + (reinitialize-instance fun) + (unencapsulate (trace-info-what info) 'trace))) + (t + (sb-di:delete-breakpoint (trace-info-start-breakpoint info)) + (sb-di:delete-breakpoint (trace-info-end-breakpoint info)))) + (setf (trace-info-untraced info) t) + (remhash trace-key *traced-funs*)))))) ;;; Untrace all traced functions. (defun untrace-all () diff --git a/src/pcl/combin.lisp b/src/pcl/combin.lisp index 49155538a3..071304215a 100644 --- a/src/pcl/combin.lisp +++ b/src/pcl/combin.lisp @@ -146,12 +146,20 @@ `(combined-method ,(generic-function-name gf)))) (defun maybe-trace-method (gf method fun fmf-p) - (let ((info (gethash gf sb-debug::*traced-funs*))) - (if (and info (sb-debug::trace-info-methods info)) - (let ((minfo (copy-structure info))) - (setf (sb-debug::trace-info-what minfo) (method-trace-name gf method)) - (lambda (&rest args) - (apply #'sb-debug::trace-method-call minfo fun fmf-p args))) + (let ((info (when (plusp (hash-table-count sb-debug::*traced-funs*)) + ;; KLUDGE: testing if *TRACE-FUNS* has anything to avoid + ;; calling METHOD-TRACE-NAME during PCL bootstrapping when + ;; the generic-function type is not yet defined. + (let ((m-name (method-trace-name gf method))) + (or (gethash m-name sb-debug::*traced-funs*) + (let ((gf-info (gethash gf sb-debug::*traced-funs*))) + (when (and gf-info (sb-debug::trace-info-methods gf-info)) + (let ((copy (copy-structure gf-info))) + (setf (sb-debug::trace-info-what copy) m-name) + copy)))))))) + (if info + (lambda (&rest args) + (apply #'sb-debug::trace-method-call info fun fmf-p args)) fun))) (defun make-emf-from-method diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index b3e9292e12..a0e7f8079f 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -67,6 +67,31 @@ ,@body) (ignore-errors (untrace ,name))))) +(defun call-collecting-traces (fn trace-arguments) + (let ((traces nil)) + (flet ((collect (depth what when frame values) + (declare (ignore frame)) + (flet ((ensure-readable (x) + (typecase x + (function (sb-impl::%fun-name x)) + (sb-debug::unprintable-object + (sb-debug::unprintable-object-string x)) + (t x)))) + (push (list* depth + (ensure-readable what) + when + (mapcar #'ensure-readable values)) + traces)))) + (unwind-protect + (let ((sb-debug:*trace-report-default* #'collect)) + (eval `(trace ,@trace-arguments)) + (funcall fn)) + (ignore-errors (untrace)))) + (nreverse traces))) + +(defmacro collecting-traces ((&rest trace-arguments) &body body) + `(call-collecting-traces (lambda () ,@body) ',trace-arguments)) + (defun trace-this (&optional arg) (declare (ignore arg)) 'ok) @@ -166,6 +191,116 @@ (1 trace-fact :exit t 1) (0 trace-fact :exit t 2))))))) +(defgeneric trace-gf (x) + (:method ((x float)) (+ x (call-next-method))) + (:method :before ((x float)) 'bf) + (:method :around ((x float)) (call-next-method)) + (:method :after ((x float)) 'af) + (:method ((x number)) (+ x (call-next-method))) + (:method :before ((x number)) 'bn) + (:method :around ((x number)) (call-next-method)) + (:method :after ((x number)) 'an) + (:method ((x (eql 21.0))) (call-next-method)) + (:method (x) 0)) + +(with-test (:name (trace :all-methods)) + (assert (equal (collecting-traces (trace-gf :methods t) + (trace-gf 21.0)) + '((0 trace-gf :enter 21.0) + (1 (method trace-gf :around (float)) :enter 21.0) + (2 (method trace-gf :around (number)) :enter 21.0) + (3 (sb-pcl::combined-method trace-gf) :enter 21.0) + (4 (method trace-gf :before (float)) :enter 21.0) + (4 (method trace-gf :before (float)) :exit bf) + (4 (method trace-gf :before (number)) :enter 21.0) + (4 (method trace-gf :before (number)) :exit bn) + (4 (method trace-gf ((eql 21.0))) :enter 21.0) + (5 (method trace-gf (float)) :enter 21.0) + (6 (method trace-gf (number)) :enter 21.0) + (7 (method trace-gf (t)) :enter 21.0) + (7 (method trace-gf (t)) :exit 0) + (6 (method trace-gf (number)) :exit 21.0) + (5 (method trace-gf (float)) :exit 42.0) + (4 (method trace-gf ((eql 21.0))) :exit 42.0) + (4 (method trace-gf :after (number)) :enter 21.0) + (4 (method trace-gf :after (number)) :exit an) + (4 (method trace-gf :after (float)) :enter 21.0) + (4 (method trace-gf :after (float)) :exit af) + (3 (sb-pcl::combined-method trace-gf) :exit 42.0) + (2 (method trace-gf :around (number)) :exit 42.0) + (1 (method trace-gf :around (float)) :exit 42.0) + (0 trace-gf :exit 42.0))))) + +(with-test (:name (trace :methods)) + (assert (equal (collecting-traces ((method trace-gf :after (float)) + (method trace-gf :around (number)) + (method trace-gf (t))) + (trace-gf 42.0)) + '((0 (method trace-gf :around (number)) :enter 42.0) + (1 (method trace-gf (t)) :enter 42.0) + (1 (method trace-gf (t)) :exit 0) + (1 (method trace-gf :after (float)) :enter 42.0) + (1 (method trace-gf :after (float)) :exit af) + (0 (method trace-gf :around (number)) :exit 84.0))))) + +(with-test (:name (trace :methods :encapsulate nil)) + (assert (equal (collecting-traces (:encapsulate nil + (method trace-gf :after (float)) + (method trace-gf :around (number)) + (method trace-gf (t))) + (trace-gf 42.0)) + '((0 (sb-pcl::fast-method trace-gf :around (number)) :enter 42.0) + (1 (sb-pcl::fast-method trace-gf (t)) :enter "unused argument") + (1 (sb-pcl::fast-method trace-gf (t)) :exit 0) + (1 (sb-pcl::fast-method trace-gf :after (float)) :enter "unused argument") + (1 (sb-pcl::fast-method trace-gf :after (float)) :exit af) + (0 (sb-pcl::fast-method trace-gf :around (number)) :exit 84.0))))) + +(defparameter *expected-trace-gf-number+t-trace* + '((0 (method trace-gf :around (number)) :enter 42.0) + (1 (method trace-gf (t)) :enter 42.0) + (1 (method trace-gf (t)) :exit 0) + (0 (method trace-gf :around (number)) :exit 84.0))) + +(with-test (:name (trace :methods :untrace-some)) + (assert (equal (collecting-traces ((method trace-gf :after (float)) + (method trace-gf :around (number)) + (method trace-gf (t))) + (untrace (method trace-gf :after (float))) + (trace-gf 42.0)) + *expected-trace-gf-number+t-trace*))) + +(with-test (:name (trace :methods :untrace-many)) + (assert (equal (collecting-traces ((method trace-gf :around (number)) + (method trace-gf (t)) + trace-gf :methods t) + (untrace trace-gf) + (trace-gf 42.0)) + *expected-trace-gf-number+t-trace*))) + +(with-test (:name (trace :methods :trace-more)) + (assert (equal (collecting-traces ((method trace-gf (t))) + (eval '(trace (method trace-gf :around (number)))) + (trace-gf 42.0)) + *expected-trace-gf-number+t-trace*))) + +(defgeneric (setf trace-gf) (value) + (:method ((x float)) (call-next-method)) + (:method :before ((x number)) 'before) + (:method ((x number)) x)) + +(with-test (:name (trace :setf-methods)) + (assert (equal (collecting-traces ((method (setf trace-gf) (float)) + (method (setf trace-gf) (number)) + (method (setf trace-gf) :before (number))) + (setf (trace-gf) 42.0)) + '((0 (method (setf trace-gf) :before (number)) :enter 42.0) + (0 (method (setf trace-gf) :before (number)) :exit before) + (0 (method (setf trace-gf) (float)) :enter 42.0) + (1 (method (setf trace-gf) (number)) :enter 42.0) + (1 (method (setf trace-gf) (number)) :exit 42.0) + (0 (method (setf trace-gf) (float)) :exit 42.0))))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From b78bc4703299d72058991de3f6ba2819afca745a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 14:47:27 +0000 Subject: [PATCH 3288/4023] Remove old, commented out, method tracing code --- src/code/ntrace.lisp | 4 +- src/pcl/env.lisp | 126 ------------------------------------------- 2 files changed, 1 insertion(+), 129 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index c13b13a053..18e0aed0ea 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -396,9 +396,7 @@ ;; requested, because the function objects themselves are ;; stored in the method object; (b) when the method in ;; question is particularly simple, when the method - ;; functionality is in the dfun. See src/pcl/env.lisp for a - ;; stub implementation of encapsulating through a - ;; traced-method class. + ;; functionality is in the dfun. (trace-1 mf info) (when (typep mf 'sb-pcl::%method-function) (trace-1 (sb-pcl::%method-function-fast-function mf) info))))) diff --git a/src/pcl/env.lisp b/src/pcl/env.lisp index c1e82f5a8e..1bab5beed8 100644 --- a/src/pcl/env.lisp +++ b/src/pcl/env.lisp @@ -25,132 +25,6 @@ (in-package "SB-PCL") -;;; FIXME: This stuff isn't part of the ANSI spec, and isn't even -;;; exported from PCL, but it looks as though it might be useful, -;;; so I don't want to just delete it. Perhaps it should go in -;;; a "contrib" directory eventually? - -#| -(defun parse-method-or-spec (spec &optional (errorp t)) - (let (gf method name temp) - (if (method-p spec) - (setq method spec - gf (method-generic-function method) - temp (and gf (generic-function-name gf)) - name (if temp - (make-method-spec temp - (method-qualifiers method) - (unparse-specializers - (method-specializers method))) - (make-symbol (format nil "~S" method)))) - (let ((gf-spec (car spec))) - (multiple-value-bind (quals specls) - (parse-defmethod (cdr spec)) - (and (setq gf (and (or errorp (fboundp gf-spec)) - (gdefinition gf-spec))) - (let ((nreq (compute-discriminating-function-arglist-info gf))) - (setq specls (append (parse-specializers specls) - (make-list (- nreq (length specls)) - :initial-element - *the-class-t*))) - (and - (setq method (get-method gf quals specls errorp)) - (setq name - (make-method-spec - gf-spec quals (unparse-specializers specls))))))))) - (values gf method name))) - -;;; TRACE-METHOD and UNTRACE-METHOD accept method specs as arguments. A -;;; method-spec should be a list like: -;;; (<generic-function-spec> qualifiers* (specializers*)) -;;; where <generic-function-spec> should be either a symbol or a list -;;; of (SETF <symbol>). -;;; -;;; For example, to trace the method defined by: -;;; -;;; (defmethod foo ((x spaceship)) 'ss) -;;; -;;; You should say: -;;; -;;; (trace-method '(foo (spaceship))) -;;; -;;; You can also provide a method object in the place of the method -;;; spec, in which case that method object will be traced. -;;; -;;; For UNTRACE-METHOD, if an argument is given, that method is untraced. -;;; If no argument is given, all traced methods are untraced. -(defclass traced-method (method) - ((method :initarg :method) - (function :initarg :function - :reader method-function) - (generic-function :initform nil - :accessor method-generic-function))) - -(defmethod method-lambda-list ((m traced-method)) - (with-slots (method) m (method-lambda-list method))) - -(defmethod method-specializers ((m traced-method)) - (with-slots (method) m (method-specializers method))) - -(defmethod method-qualifiers ((m traced-method)) - (with-slots (method) m (method-qualifiers method))) - -(defmethod accessor-method-slot-name ((m traced-method)) - (with-slots (method) m (accessor-method-slot-name method))) - -(defvar *traced-methods* ()) - -(defun trace-method (spec &rest options) - (multiple-value-bind (gf omethod name) - (parse-method-or-spec spec) - (let* ((tfunction (trace-method-internal (method-function omethod) - name - options)) - (tmethod (make-instance 'traced-method - :method omethod - :function tfunction))) - (remove-method gf omethod) - (add-method gf tmethod) - (pushnew tmethod *traced-methods*) - tmethod))) - -(defun untrace-method (&optional spec) - (flet ((untrace-1 (m) - (let ((gf (method-generic-function m))) - (when gf - (remove-method gf m) - (add-method gf (slot-value m 'method)) - (setq *traced-methods* (remove m *traced-methods*)))))) - (if (not (null spec)) - (multiple-value-bind (gf method) - (parse-method-or-spec spec) - (declare (ignore gf)) - (if (memq method *traced-methods*) - (untrace-1 method) - (error "~S is not a traced method?" method))) - (dolist (m *traced-methods*) (untrace-1 m))))) - -(defun trace-method-internal (ofunction name options) - (eval `(untrace ,name)) - (setf (fdefinition name) ofunction) - (eval `(trace ,name ,@options)) - (fdefinition name)) -|# - -#| -;;;; Helper for slightly newer trace implementation, based on -;;;; breakpoint stuff. The above is potentially still useful, so it's -;;;; left in, commented. - -;;; (this turned out to be a roundabout way of doing things) -(defun list-all-maybe-method-names (gf) - (let (result) - (dolist (method (generic-function-methods gf) (nreverse result)) - (let ((spec (nth-value 2 (parse-method-or-spec method)))) - (push spec result) - (push (list* 'fast-method (cdr spec)) result))))) -|# - ;;;; MAKE-LOAD-FORM ;; Overwrite the old bootstrap non-generic MAKE-LOAD-FORM function with a From 04047e1076b4ea271d6733d2593b55dc917eafc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 09:04:30 +0000 Subject: [PATCH 3289/4023] Suppress named clambda let-conversion if DEBUG=3 In preparation for tracing local functions. --- src/compiler/locall.lisp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/compiler/locall.lisp b/src/compiler/locall.lisp index 7ac703b56b..210b7cf84f 100644 --- a/src/compiler/locall.lisp +++ b/src/compiler/locall.lisp @@ -1199,11 +1199,10 @@ (not (functional-inline-expanded clambda))) ;; ANSI requires that explicit NOTINLINE be respected. (or (eq (lambda-inlinep clambda) 'notinline) - ;; If (= LET-CONVERSION 0) we can guess that inlining - ;; generally won't be appreciated, but if the user - ;; specifically requests inlining, that takes precedence over - ;; our general guess. - (and (policy clambda (= let-conversion 0)) + ;; If (= LET-CONVERSION 0) or (= DEBUG 3) we can guess that inlining + ;; generally won't be appreciated, but if the user specifically requests + ;; inlining, that takes precedence over our general guess. + (and (or (policy clambda (or (= let-conversion 0) (= debug 3)))) (not (eq (lambda-inlinep clambda) 'inline)))))) ;;; We also don't convert calls to named functions which appear in the From 46bd86ac317d5af1a745aef71ce706b068180c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 09:04:30 +0000 Subject: [PATCH 3290/4023] Add support for tracing local functions Including support for local functions within methods. See tests for examples. Tracing via encapsulation vs tracing via breakpoints should be an implementation detail. We default to encapsulation, but since local functions can't be traced that way, automatically fallback to breakpoint-based tracing, rather than signal an error. --- src/code/debug-int.lisp | 31 +++++++------ src/code/early-ntrace.lisp | 6 +++ src/code/ntrace.lisp | 95 +++++++++++++++++++++++++++----------- src/pcl/combin.lisp | 35 ++++++++------ tests/debug.impure.lisp | 95 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 204 insertions(+), 58 deletions(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 6732dcc1c7..c7a0834466 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -1492,10 +1492,10 @@ register." (sub-access-debug-var-slot (frame-pointer frame) it))))))) ;;; Return a DEBUG-FUN that represents debug information for FUN. -(defun fun-debug-fun (fun) +(defun fun-debug-fun (fun &key local-name) (declare (type function fun)) (let ((simple-fun (%fun-fun fun))) - (let* ((name (%simple-fun-name simple-fun)) + (let* ((name (or local-name (%simple-fun-name simple-fun))) (component (fun-code-header simple-fun)) (res (loop for fmap-entry = (sb-c::compiled-debug-info-fun-map (%code-debug-info component)) @@ -1503,22 +1503,23 @@ register." for next = (sb-c::compiled-debug-fun-next fmap-entry) ;; Is NAME really the right thing to match on given how bogus ;; it might be? I would think PC range is better. - when (and (eq (sb-c::compiled-debug-fun-name fmap-entry) name) + when (and (equal (sb-c::compiled-debug-fun-name fmap-entry) name) (eq (sb-c::compiled-debug-fun-kind fmap-entry) nil)) return fmap-entry while next))) - (if res - (make-compiled-debug-fun res component) - ;; KLUDGE: comment from CMU CL: - ;; This used to be the non-interpreted branch, but - ;; William wrote it to return the debug-fun of fun's XEP - ;; instead of fun's debug-fun. The above code does this - ;; more correctly, but it doesn't get or eliminate all - ;; appropriate cases. It mostly works, and probably - ;; works for all named functions anyway. - ;; -- WHN 20000120 - (debug-fun-from-pc component - (function-start-pc-offset simple-fun)))))) + (cond (res + (make-compiled-debug-fun res component)) + ((null local-name) + ;; KLUDGE: comment from CMU CL: + ;; This used to be the non-interpreted branch, but + ;; William wrote it to return the debug-fun of fun's XEP + ;; instead of fun's debug-fun. The above code does this + ;; more correctly, but it doesn't get or eliminate all + ;; appropriate cases. It mostly works, and probably + ;; works for all named functions anyway. + ;; -- WHN 20000120 + (debug-fun-from-pc component + (function-start-pc-offset simple-fun))))))) ;;; Return the kind of the function, which is one of :OPTIONAL, :MORE ;;; :EXTERNAL, :TOPLEVEL, :CLEANUP, or NIL. diff --git a/src/code/early-ntrace.lisp b/src/code/early-ntrace.lisp index 04ab0ca6de..313415ed2a 100644 --- a/src/code/early-ntrace.lisp +++ b/src/code/early-ntrace.lisp @@ -34,6 +34,12 @@ (define-load-time-global *traced-funs* (make-hash-table :test 'equal :synchronized t)) +;;; a hash-table that maps the name of outer functions to local +;;; functions keys in the *TRACED-FUNS* hash-table, e.g.: NAME-X -> +;;; ((NAME-Y :IN NAME-X) (NAME-Z :IN NAME-X)). +(define-load-time-global *traced-locals* + (make-hash-table :test 'equal :synchronized t)) + (deftype trace-report-type () '(or symbol function)) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 18e0aed0ea..e90dce0ebd 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -33,7 +33,7 @@ (warn "~/sb-ext:print-symbol-with-prefix/ is ~ undefined, not tracing." name)) (warn "~S is not a valid function name, not tracing." name)))) - (multiple-value-bind (res named-p method) + (multiple-value-bind (res named-p method local) (typecase x (symbol (cond ((special-operator-p x) @@ -43,7 +43,20 @@ (values (get-def x) t)))) (function x) - ((cons (eql method)) + ((cons (member flet labels)) ; ({FLET,LABELS} name :IN outer-function) + (multiple-value-bind (fun local-name) + (let ((outer (car (last x)))) + (typecase outer + ((cons (eql method)) + (values (get-def `(sb-pcl::fast-method ,@(rest outer))) + `(,(first x) ,(second x) :in ,(second outer)))) + (t + (values (get-def outer) x)))) + (when fun + (if (sb-di:fun-debug-fun fun :local-name local-name) + (values fun nil nil x) + (warn "~S not found, not tracing." x))))) + ((cons (eql method)) ; (METHOD name qualifiers (specializers*)) (let ((gf (get-def (second x)))) (when gf (if (find-method gf (butlast (cddr x)) (car (last x)) nil) @@ -53,13 +66,19 @@ (values (get-def x) t))) (typecase res (closure - (values (%closure-fun res) named-p :compiled-closure method)) + (values (%closure-fun res) named-p :compiled-closure method local)) (funcallable-instance - (values res named-p :funcallable-instance method)) + (values res named-p :funcallable-instance method local)) ;; FIXME: What about SB-KERNEL:INTERPRETED-FUNCTION -- it gets ;; picked off by the FIN above, is that right? (t - (values res named-p :compiled method)))))) + (values res named-p :compiled method local)))))) + +(defun retrace-local-funs (fname &optional new-value) + (dolist (local (gethash fname *traced-locals*)) + (let ((trace-info (gethash local *traced-funs*))) + (untrace-1 local) + (trace-1 local trace-info new-value)))) ;;; When a function name is redefined, and we were tracing that name, ;;; then untrace the old definition and trace the new one. @@ -69,7 +88,8 @@ (info (gethash fun *traced-funs*))) (when (and info (trace-info-named info)) (untrace-1 fname) - (trace-1 fname info new-value))))) + (trace-1 fname info new-value)) + (retrace-local-funs fname new-value)))) (push #'trace-redefined-update *setf-fdefinition-hook*) ;;; Annotate a FORM to evaluate with pre-converted functions. FORM is @@ -303,30 +323,41 @@ ;;; If non-null, DEFINITION is the new definition of a function that ;;; we are automatically retracing. (defun trace-1 (function-or-name info &optional definition) - (multiple-value-bind (fun named kind method) + (multiple-value-bind (fun named kind method local) (if definition - (values definition t - (nth-value 2 (trace-fdefinition definition))) + (multiple-value-bind (fun named kind) + (trace-fdefinition definition) + (declare (ignore named)) + (if (typep function-or-name '(cons (member flet labels))) + (values fun t kind nil function-or-name) + (values definition t kind))) (trace-fdefinition function-or-name)) (when fun - (let ((trace-key (or method fun))) + (let ((trace-key (or local method fun))) (when (gethash trace-key *traced-funs*) (warn "~S is already TRACE'd, untracing it first." function-or-name) (untrace-1 trace-key)) - (let* ((debug-fun (sb-di:fun-debug-fun fun)) + (let* ((local-name (when local + (let ((outer (car (last local)))) + (typecase outer + ((cons (eql method)) + `(,(first local) ,(second local) :in ,(second outer))) + (t local))))) + (debug-fun (sb-di:fun-debug-fun fun :local-name local-name)) (encapsulated - (if (eq (trace-info-encapsulated info) :default) - (ecase kind - (:compiled nil) - (:compiled-closure - (unless (functionp function-or-name) - (warn "tracing shared code for ~S:~% ~S" - function-or-name - fun)) - nil) - ((:interpreted :interpreted-closure :funcallable-instance) - t)) - (trace-info-encapsulated info))) + (and named + (if (eq (trace-info-encapsulated info) :default) + (ecase kind + (:compiled nil) + (:compiled-closure + (unless (functionp function-or-name) + (warn "tracing shared code for ~S:~% ~S" + function-or-name + fun)) + nil) + ((:interpreted :interpreted-closure :funcallable-instance) + t)) + (trace-info-encapsulated info)))) (loc (if encapsulated :encapsulated (sb-di:debug-fun-start-location debug-fun))) @@ -354,9 +385,6 @@ (cond (encapsulated - (unless named - (error "can't use encapsulation to trace anonymous function ~S" - fun)) (if method (reinitialize-instance fun) (encapsulate function-or-name 'trace @@ -382,6 +410,8 @@ (sb-di:activate-breakpoint start) (sb-di:activate-breakpoint end))))) + (when local + (push local (gethash (fourth local) *traced-locals*))) (setf (gethash trace-key *traced-funs*) info))) (when (and (typep fun 'generic-function) @@ -607,10 +637,10 @@ the N-th value returned by the function." ;;; Untrace one function. (defun untrace-1 (function-or-name) - (multiple-value-bind (fun named kind method) + (multiple-value-bind (fun named kind method local) (trace-fdefinition function-or-name) (declare (ignore named kind)) - (let* ((trace-key (or method fun)) + (let* ((trace-key (or local method fun)) (info (when fun (gethash trace-key *traced-funs*)))) (cond ((and fun (not info)) @@ -633,6 +663,15 @@ the N-th value returned by the function." (sb-di:delete-breakpoint (trace-info-start-breakpoint info)) (sb-di:delete-breakpoint (trace-info-end-breakpoint info)))) (setf (trace-info-untraced info) t) + (when local + (let ((table *traced-locals*) + (outer (fourth local))) + (with-system-mutex ((hash-table-lock table)) + (let* ((locals (gethash outer table)) + (remaining (remove local locals :test #'equal))) + (if remaining + (setf (gethash outer table) remaining) + (remhash outer table)))))) (remhash trace-key *traced-funs*)))))) ;;; Untrace all traced functions. diff --git a/src/pcl/combin.lisp b/src/pcl/combin.lisp index 071304215a..9abff1d98d 100644 --- a/src/pcl/combin.lisp +++ b/src/pcl/combin.lisp @@ -146,21 +146,26 @@ `(combined-method ,(generic-function-name gf)))) (defun maybe-trace-method (gf method fun fmf-p) - (let ((info (when (plusp (hash-table-count sb-debug::*traced-funs*)) - ;; KLUDGE: testing if *TRACE-FUNS* has anything to avoid - ;; calling METHOD-TRACE-NAME during PCL bootstrapping when - ;; the generic-function type is not yet defined. - (let ((m-name (method-trace-name gf method))) - (or (gethash m-name sb-debug::*traced-funs*) - (let ((gf-info (gethash gf sb-debug::*traced-funs*))) - (when (and gf-info (sb-debug::trace-info-methods gf-info)) - (let ((copy (copy-structure gf-info))) - (setf (sb-debug::trace-info-what copy) m-name) - copy)))))))) - (if info - (lambda (&rest args) - (apply #'sb-debug::trace-method-call info fun fmf-p args)) - fun))) + (let ((m-name (when (or (plusp (hash-table-count sb-debug::*traced-funs*)) + (plusp (hash-table-count sb-debug::*traced-locals*))) + ;; KLUDGE: testing if *TRACE-FUNS* or *TRACED-LOCALS* have + ;; anything to avoid calling METHOD-TRACE-NAME during PCL + ;; bootstrapping when the generic-function type is not yet + ;; defined.) + (method-trace-name gf method)))) + (when m-name + (sb-debug::retrace-local-funs m-name)) + (let ((info (when m-name + (or (gethash m-name sb-debug::*traced-funs*) + (let ((gf-info (gethash gf sb-debug::*traced-funs*))) + (when (and gf-info (sb-debug::trace-info-methods gf-info)) + (let ((copy (copy-structure gf-info))) + (setf (sb-debug::trace-info-what copy) m-name) + copy))))))) + (if info + (lambda (&rest args) + (apply #'sb-debug::trace-method-call info fun fmf-p args)) + fun)))) (defun make-emf-from-method (gf method cm-args fmf-p &optional method-alist wrappers) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index a0e7f8079f..d4b63b8845 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -301,6 +301,101 @@ (1 (method (setf trace-gf) (number)) :exit 42.0) (0 (method (setf trace-gf) (float)) :exit 42.0))))) +(defun global-fact (x) + (declare (optimize (debug 3))) ; suppress inlining + (labels ((fact (x) + (flet ((multiply (x y) + (* x y))) + (if (zerop x) + 1 + (multiply x (fact (1- x))))))) + (fact x))) + +(with-test (:name (trace :labels)) + (assert (equal (collecting-traces ((labels fact :in global-fact) + (flet multiply :in global-fact)) + (global-fact 1)) + '((0 (labels fact :in global-fact) :enter 1) + (1 (labels fact :in global-fact) :enter 0) + (1 (labels fact :in global-fact) :exit 1) + (1 (flet multiply :in global-fact) :enter 1 1) + (1 (flet multiply :in global-fact) :exit 1) + (0 (labels fact :in global-fact) :exit 1))))) + +(defgeneric gfact (x) + (:method ((x number)) + (declare (optimize (debug 3))) ; suppress inlining + (flet ((fact (x) (global-fact x))) + (fact x)))) + +(with-test (:name (trace :labels :within-method)) + (assert (equal (collecting-traces ((flet fact :in (method gfact (number)))) + (gfact 3)) + '((0 (flet fact :in (method gfact (number))) :enter 3) + (0 (flet fact :in (method gfact (number))) :exit 6))))) + +(with-test (:name (trace :labels :within-untraced-method)) + (assert (equal (collecting-traces ((method gfact (number)) + (flet fact :in (method gfact (number)))) + (untrace (method gfact (number))) + (gfact 3)) + '((0 (flet fact :in (method gfact (number))) :enter 3) + (0 (flet fact :in (method gfact (number))) :exit 6))))) + +(defun trace-foo () + (declare (optimize (debug 3))) + (flet ((body () 'original-foo)) + (body))) + +(defun call-with-trace-foo-redefined (fn) + (let ((original (fdefinition 'trace-foo))) + ;; the local function will be named (FLET BODY) instead of (FLET + ;; BODY :IN TRACE-FOO) unless we use EVAL here. + (eval '(defun trace-foo () + (declare (optimize (debug 3))) + (flet ((body () 'redefined-foo)) + (body)))) + (unwind-protect + (funcall fn) + (setf (fdefinition 'trace-foo) original)))) + +(with-test (:name (trace :labels :redefined)) + (assert (equal (collecting-traces ((flet body :in trace-foo)) + (trace-foo) + (call-with-trace-foo-redefined 'trace-foo)) + '((0 (flet body :in trace-foo) :enter) + (0 (flet body :in trace-foo) :exit original-foo) + (0 (flet body :in trace-foo) :enter) + (0 (flet body :in trace-foo) :exit redefined-foo))))) + +(defmethod trace-foo-gf () + (declare (optimize (debug 3))) + (flet ((body () 'original-foo)) + (body))) + +(defun call-with-trace-foo-gf-redefined (fn) + ;; using ADD-METHOD and REMOVE-METHOD yields outdated DEBUG-FUN + ;; info, so work around that using EVAL. + (eval '(defmethod trace-foo-gf () + (declare (optimize (debug 3))) + (flet ((body () 'redefined-foo)) + (body)))) + (unwind-protect + (funcall fn) + (eval '(defmethod trace-foo-gf () + (declare (optimize (debug 3))) + (flet ((body () 'original-foo)) + (body)))))) + +(with-test (:name (trace :labels :redefined-method)) + (assert (equal (collecting-traces ((flet body :in (method trace-foo-gf ()))) + (trace-foo-gf) + (call-with-trace-foo-gf-redefined 'trace-foo-gf)) + '((0 (flet body :in (method trace-foo-gf ())) :enter) + (0 (flet body :in (method trace-foo-gf ())) :exit original-foo) + (0 (flet body :in (method trace-foo-gf ())) :enter) + (0 (flet body :in (method trace-foo-gf ())) :exit redefined-foo))))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From d1ac2ef7f5ba48c92ef24d95287ef752854946d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 15:08:02 +0000 Subject: [PATCH 3291/4023] Add support for tracing compiler macros ... as well as local functions within compiler macros. --- src/code/ntrace.lisp | 35 ++++++++++++++++++++++------------- tests/debug.impure.lisp | 19 +++++++++++++++++++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index e90dce0ebd..07757c0b29 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -27,12 +27,15 @@ ;;; applicable. (defun trace-fdefinition (x) (flet ((get-def (name) - (if (valid-function-name-p name) - (if (fboundp name) - (fdefinition name) - (warn "~/sb-ext:print-symbol-with-prefix/ is ~ - undefined, not tracing." name)) - (warn "~S is not a valid function name, not tracing." name)))) + (cond ((typep name '(cons (eql compiler-macro))) + (compiler-macro-function (second name))) + ((valid-function-name-p name) + (if (fboundp name) + (fdefinition name) + (warn "~/sb-ext:print-symbol-with-prefix/ is ~ + undefined, not tracing." name))) + (t + (warn "~S is not a valid function name, not tracing." name))))) (multiple-value-bind (res named-p method local) (typecase x (symbol @@ -43,15 +46,21 @@ (values (get-def x) t)))) (function x) + ((cons (eql compiler-macro)) + (values (get-def x) nil)) ((cons (member flet labels)) ; ({FLET,LABELS} name :IN outer-function) (multiple-value-bind (fun local-name) (let ((outer (car (last x)))) - (typecase outer - ((cons (eql method)) - (values (get-def `(sb-pcl::fast-method ,@(rest outer))) - `(,(first x) ,(second x) :in ,(second outer)))) - (t - (values (get-def outer) x)))) + (flet ((simple-local-name () + `(,(first x) ,(second x) :in ,(second outer)))) + (typecase outer + ((cons (eql method)) + (values (get-def `(sb-pcl::fast-method ,@(rest outer))) + (simple-local-name))) + ((cons (eql compiler-macro)) + (values (get-def outer) (simple-local-name))) + (t + (values (get-def outer) x))))) (when fun (if (sb-di:fun-debug-fun fun :local-name local-name) (values fun nil nil x) @@ -340,7 +349,7 @@ (let* ((local-name (when local (let ((outer (car (last local)))) (typecase outer - ((cons (eql method)) + ((cons (member method compiler-macro)) `(,(first local) ,(second local) :in ,(second outer))) (t local))))) (debug-fun (sb-di:fun-debug-fun fun :local-name local-name)) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index d4b63b8845..46f3045a2a 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -396,6 +396,25 @@ (0 (flet body :in (method trace-foo-gf ())) :enter) (0 (flet body :in (method trace-foo-gf ())) :exit redefined-foo))))) +(defun fn-with-cmac (x) x) + +(define-compiler-macro fn-with-cmac (x) + (declare (ignore x) (optimize (debug 3))) ; suppress flet inlining + (flet ((body () 42)) + (body))) + +(with-test (:name (trace :compiler-macro)) + (assert (equal (collecting-traces ((compiler-macro fn-with-cmac)) + (compile nil '(lambda () (fn-with-cmac 0)))) + '((0 (compiler-macro fn-with-cmac) :enter (fn-with-cmac 0) "unused argument") + (0 (compiler-macro fn-with-cmac) :exit 42))))) + +(with-test (:name (trace :flet :within-compiler-macro)) + (assert (equal (collecting-traces ((flet body :in (compiler-macro fn-with-cmac))) + (compile nil '(lambda () (fn-with-cmac 0)))) + '((0 (flet body :in (compiler-macro fn-with-cmac)) :enter) + (0 (flet body :in (compiler-macro fn-with-cmac)) :exit 42))))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From 224882715f44d4e41feccfed89cc8e3373c0a7fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Mon, 5 Apr 2021 09:55:21 +0100 Subject: [PATCH 3292/4023] Detect non-local exits of functions traced via encapsulation --- src/code/ntrace.lisp | 58 ++++++++++++++++++++++++++++------------- tests/debug.impure.lisp | 17 ++++++++++++ 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 07757c0b29..d4ddbd141a 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -254,13 +254,13 @@ ;;; succeeded before printing anything. (declaim (ftype (function (trace-info) function) trace-end-breakpoint-fun)) (defun trace-end-breakpoint-fun (info) - (lambda (frame bpt values cookie) - (declare (ignore bpt)) + (lambda (frame bpt-or-nle values cookie) (unless (eq cookie (caar *traced-entries*)) (setf *traced-entries* (member cookie *traced-entries* :key #'car))) - (let ((entry (pop *traced-entries*))) + (let ((entry (pop *traced-entries*)) + (non-local-exit (eq bpt-or-nle :nle))) (when (and (not (trace-info-untraced info)) (or (cdr entry) (let ((cond (trace-info-condition-after info))) @@ -275,19 +275,27 @@ (pprint-logical-block (*standard-output* nil) (print-trace-indentation) (pprint-indent :current 2) - (format t "~S returned" (trace-info-what info)) - (dolist (v values) - (write-char #\space) - (pprint-newline :linear) - (prin1 (ensure-printable-object v)))) + (cond (non-local-exit + (format t "~S exited non-locally" (trace-info-what info))) + (t + (format t "~S returned" (trace-info-what info)) + (dolist (v values) + (write-char #\space) + (pprint-newline :linear) + (prin1 (ensure-printable-object v)))))) (terpri)) - (apply #'trace-print frame (trace-info-print-after info) values)) + (unless non-local-exit + (apply #'trace-print frame (trace-info-print-after info) values))) ((nil) - (apply #'trace-print-unadorned frame (trace-info-print-after info) values)) + (unless non-local-exit + (apply #'trace-print-unadorned frame (trace-info-print-after info) values))) (t (funcall (trace-info-report info) (count-if #'cdr *traced-entries*) - (trace-info-what info) :exit frame values) + (trace-info-what info) + (if non-local-exit :non-local-exit :exit) + frame + values) (apply #'trace-print-unadorned frame (trace-info-print-after info) values))) (write-sequence (get-output-stream-string *standard-output*) *trace-output*) @@ -305,8 +313,15 @@ (apply #'funcall start frame nil args) (let ((*traced-entries* *traced-entries*)) (funcall cookie frame nil) - (let ((vals (multiple-value-list (apply function args)))) - (funcall (trace-end-breakpoint-fun info) frame nil vals nil) + (let* ((non-local-exit '#:nle) + (vals non-local-exit)) + (unwind-protect + (setq vals (multiple-value-list (apply function args))) + (funcall (trace-end-breakpoint-fun info) + frame + (if (eq vals non-local-exit) :nle nil) + (if (eq vals non-local-exit) nil vals) + nil)) (values-list vals)))))) ;;; This function is like TRACE-CALL above, but munges the method @@ -321,8 +336,15 @@ (apply #'funcall start frame nil (funcall transform args)) (let ((*traced-entries* *traced-entries*)) (funcall cookie frame nil) - (let ((vals (multiple-value-list (apply function args)))) - (funcall (trace-end-breakpoint-fun info) frame nil vals nil) + (let* ((non-local-exit '#:nle) + (vals non-local-exit)) + (unwind-protect + (setq vals (multiple-value-list (apply function args))) + (funcall (trace-end-breakpoint-fun info) + frame + (if (eq vals non-local-exit) :nle nil) + (if (eq vals non-local-exit) nil vals) + nil)) (values-list vals))))))) ;;; Trace one function according to the specified options. We copy the @@ -582,9 +604,9 @@ The following options are defined: options (e.g. PRINT or BREAK). Otherwise, Report-Type is treated as a function designator and, for each trace event, funcalled with 5 arguments: trace depth (a non-negative - integer), a function name or a function object, - :ENTER or :EXIT, a stack frame, and a list of values (arguments - or return values). + integer), a function name or a function object, a + keyword (:ENTER, :EXIT or :NON-LOCAL-EXIT), a stack frame, and + a list of values (arguments or return values). :CONDITION Form :CONDITION-AFTER Form diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 46f3045a2a..987a19cfef 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -415,6 +415,23 @@ '((0 (flet body :in (compiler-macro fn-with-cmac)) :enter) (0 (flet body :in (compiler-macro fn-with-cmac)) :exit 42))))) +(defun throw-foo () + (throw 'foo 42)) + +(defun catch-foo () + (catch 'foo (throw-foo))) + +(with-test (:name (trace :non-local-exit)) + (assert (equal (collecting-traces (throw-foo) + (catch-foo)) + '((0 throw-foo :enter) + (0 throw-foo :non-local-exit))))) + +(with-test (:name (trace :non-local-exit :standard-report)) + (let ((output (with-traced-function (throw-foo) + (catch-foo)))) + (assert (search "exited non-locally" output)))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From 8f4f06749b7d01a32b11167a1271bd1fb5dd6e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 09:04:29 +0000 Subject: [PATCH 3293/4023] Fix (trace foo :wherein bar :encapsulate t) When tracing a function FOO via encapsulation, TRACE-WHEREIN-P is invoked before entering FOO and in that case the top frame is FOO's caller. So, don't skip the frame. When tracing via breakpoints, TRACE-WHEREIN-P is invoked after entering FOO in which case we want to continue skipping the top frame, presumably to do the right thing with (trace foo :wherein foo). --- src/code/ntrace.lisp | 19 +++++++++++-------- tests/debug.impure.lisp | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index d4ddbd141a..908aec45a6 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -143,13 +143,16 @@ (format t "~V,0@T~W: " indent depth))) ;;; Return true if any of the NAMES appears on the stack below FRAME. -(defun trace-wherein-p (frame names) - (do ((frame (sb-di:frame-down frame) (sb-di:frame-down frame))) - ((not frame) nil) - (when (member (sb-di:debug-fun-name (sb-di:frame-debug-fun frame)) - names - :test #'equal) - (return t)))) +(defun trace-wherein-p (encapsulated frame names) + ;; When tracing without encapsulation (i.e. when using breakpoints), + ;; FRAME points to the function being traced, so skip it. + (let ((initial-frame (if encapsulated frame (sb-di:frame-down frame)))) + (do ((frame initial-frame (sb-di:frame-down frame))) + ((not frame) nil) + (when (member (sb-di:debug-fun-name (sb-di:frame-debug-fun frame)) + names + :test #'equal) + (return t))))) ;;; Handle PRINT and PRINT-AFTER options. (defun trace-print (frame forms &rest args) @@ -210,7 +213,7 @@ (or (not condition) (apply (cdr condition) frame hook-args)) (or (not wherein) - (trace-wherein-p frame wherein))))) + (trace-wherein-p (trace-info-encapsulated info) frame wherein))))) (when conditionp (with-standard-io-syntax (let ((*print-readably* nil) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 987a19cfef..5840c62741 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -432,6 +432,41 @@ (catch-foo)))) (assert (search "exited non-locally" output)))) +(defun trace-inner-function (x) + x) + +(defun trace-outer-function (x) + (declare (optimize (debug 3))) ; avoid tail call optimization + (trace-inner-function x)) + +(defun test-trace-inner-function (&key encapsulate) + (assert (equal (let ((sb-debug:*trace-encapsulate-default* encapsulate)) + (collecting-traces (trace-inner-function + :wherein trace-outer-function) + (trace-outer-function 'outer-value) + (trace-inner-function 'inner-value))) + '((0 trace-inner-function :enter outer-value) + (0 trace-inner-function :exit outer-value))))) + +(with-test (:name (trace :wherein :encapsulate t)) + (test-trace-inner-function :encapsulate t)) + +(with-test (:name (trace :wherein :encapsulate nil)) + (test-trace-inner-function :encapsulate nil)) + +(defun test-trace-fact-wherein (&key encapsulate) + (assert (equal (let ((sb-debug:*trace-encapsulate-default* encapsulate)) + (collecting-traces (trace-fact :wherein trace-fact) + (trace-fact 1))) + '((0 trace-fact :enter 0) + (0 trace-fact :exit 1))))) + +(with-test (:name (trace :wherein :recursive :encapsulate t)) + (test-trace-fact-wherein :encapsulate t)) + +(with-test (:name (trace :wherein :recursive :encapsulate nil)) + (test-trace-fact-wherein :encapsulate nil)) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From 5c6096f24c15359c5240b44973276718ff778e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 23:26:13 +0000 Subject: [PATCH 3294/4023] Add trivial test tracing a macro function --- tests/debug.impure.lisp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 5840c62741..8c1c0f3b39 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -467,6 +467,16 @@ (with-test (:name (trace :wherein :recursive :encapsulate nil)) (test-trace-fact-wherein :encapsulate nil)) +(defmacro macro-fact (x) + (labels ((fact (x) (if (zerop x) 1 (* x (fact (1- x)))))) + (fact x))) + +(with-test (:name (trace :macro)) + (assert (equal (collecting-traces (macro-fact) + (macroexpand-1 '(macro-fact 3))) + '((0 macro-fact :enter (macro-fact 3) "unused argument") + (0 macro-fact :exit 6))))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From f7185c9df4417781497706848576de30f9412ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sat, 26 Mar 2022 23:27:17 +0000 Subject: [PATCH 3295/4023] Support tracing local functions within macros --- src/code/ntrace.lisp | 3 ++- tests/debug.impure.lisp | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 908aec45a6..1fb45cdf4c 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -29,11 +29,12 @@ (flet ((get-def (name) (cond ((typep name '(cons (eql compiler-macro))) (compiler-macro-function (second name))) + ((and (symbolp name) (macro-function name))) ((valid-function-name-p name) (if (fboundp name) (fdefinition name) (warn "~/sb-ext:print-symbol-with-prefix/ is ~ - undefined, not tracing." name))) + undefined, not tracing." name))) (t (warn "~S is not a valid function name, not tracing." name))))) (multiple-value-bind (res named-p method local) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 8c1c0f3b39..e5ebb9f04f 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -477,6 +477,12 @@ '((0 macro-fact :enter (macro-fact 3) "unused argument") (0 macro-fact :exit 6))))) +(with-test (:name (trace :labels :within-macro)) + (assert (equal (collecting-traces ((labels fact :in macro-fact)) + (macroexpand-1 '(macro-fact 0))) + '((0 (labels fact :in macro-fact) :enter 0) + (0 (labels fact :in macro-fact) :exit 1))))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From 8a03fd84bdba665bd06b42b61e49506f31f21cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Tue, 29 Mar 2022 15:49:52 +0100 Subject: [PATCH 3296/4023] Add support for tracing local functions within CAS functions/methods In case it wasn't clear already, TRACE-FDEFINITION and TRACE-1 are crying for a refactoring. --- src/code/ntrace.lisp | 14 ++++++++++---- tests/debug.impure.lisp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 1fb45cdf4c..8b10004509 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -53,12 +53,16 @@ (multiple-value-bind (fun local-name) (let ((outer (car (last x)))) (flet ((simple-local-name () - `(,(first x) ,(second x) :in ,(second outer)))) + (labels ((simplify (name) + (if (symbolp name) + name + (simplify (second name))))) + `(,(first x) ,(second x) :in ,(simplify outer))))) (typecase outer ((cons (eql method)) (values (get-def `(sb-pcl::fast-method ,@(rest outer))) (simple-local-name))) - ((cons (eql compiler-macro)) + ((cons (member compiler-macro cas)) (values (get-def outer) (simple-local-name))) (t (values (get-def outer) x))))) @@ -375,8 +379,10 @@ (let* ((local-name (when local (let ((outer (car (last local)))) (typecase outer - ((cons (member method compiler-macro)) - `(,(first local) ,(second local) :in ,(second outer))) + ((cons (member method compiler-macro cas)) + (labels ((simplify (name) + (if (symbolp name) name (simplify (second name))))) + `(,(first local) ,(second local) :in ,(simplify outer)))) (t local))))) (debug-fun (sb-di:fun-debug-fun fun :local-name local-name)) (encapsulated diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index e5ebb9f04f..14acaf8039 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -483,6 +483,36 @@ '((0 (labels fact :in macro-fact) :enter 0) (0 (labels fact :in macro-fact) :exit 1))))) +(defun (cas trace-cas) (old new x) + (declare (optimize (debug 3))) + (flet (((cas body) (o n) + (+ o n x))) + (cas (body) old new))) + +(with-test (:name (trace :cas)) + (assert (equal (collecting-traces ((cas trace-cas) + (flet (cas body) :in (cas trace-cas))) + (cas (trace-cas 1) 21 20)) + '((0 (cas trace-cas) :enter 21 20 1) + (1 (flet (cas body) :in (cas trace-cas)) :enter 21 20) + (1 (flet (cas body) :in (cas trace-cas)) :exit 42) + (0 (cas trace-cas) :exit 42))))) + +(defmethod (cas trace-cas-gf) (old new x) + (declare (optimize (debug 3))) + (flet (((cas body) (o n) + (+ o n x))) + (cas (body) old new))) + +(with-test (:name (trace :cas :generic)) + (assert (equal (collecting-traces ((method (cas trace-cas-gf) (t t t)) + (flet (cas body) :in (method (cas trace-cas-gf) (t t t)))) + (cas (trace-cas-gf 1) 21 20)) + '((0 (method (cas trace-cas-gf) (t t t)) :enter 21 20 1) + (1 (flet (cas body) :in (method (cas trace-cas-gf) (t t t))) :enter 21 20) + (1 (flet (cas body) :in (method (cas trace-cas-gf) (t t t))) :exit 42) + (0 (method (cas trace-cas-gf) (t t t)) :exit 42))))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From 79de6745bbdedf34f79ebcf51ca0333ad17a980e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Thu, 31 Mar 2022 20:02:08 +0100 Subject: [PATCH 3297/4023] Retrace redefined macros Adds new SB-INT:*SETF-MACRO-FUNCTION-HOOK*, similar to SB-INT:*SETF-FDEFINITION-HOOK*. --- src/code/defmacro.lisp | 7 +++++++ src/code/ntrace.lisp | 23 ++++++++++++++--------- src/cold/exports.lisp | 1 + tests/debug.impure.lisp | 28 +++++++++++++++++++++++++++- 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/code/defmacro.lisp b/src/code/defmacro.lisp index fedceceb33..19e9a27bcb 100644 --- a/src/code/defmacro.lisp +++ b/src/code/defmacro.lisp @@ -30,6 +30,10 @@ only." (when (typep def '(cons (eql macro))) (cdr def))))))) (values (info :function :macro-function symbol))) +(defvar *setf-macro-function-hook* nil + "A list of functions that (SETF MACRO-FUNCTION) invokes before storing the new + value. The functions take the macro name and the new value.") + (defun (setf macro-function) (function symbol &optional environment) (declare (symbol symbol) (type function function)) (when environment @@ -43,6 +47,9 @@ only." symbol environment)) (when (eq (info :function :kind symbol) :special-form) (error "~S names a special form." symbol)) + (when (boundp '*setf-macro-function-hook*) ; unbound during cold init + (dolist (f *setf-macro-function-hook*) + (funcall f symbol function))) (with-single-package-locked-error (:symbol symbol "setting the macro-function of ~S") (clear-info :function :type symbol) (setf (info :function :kind symbol) :macro) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 8b10004509..dc51e45af2 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -96,15 +96,20 @@ ;;; When a function name is redefined, and we were tracing that name, ;;; then untrace the old definition and trace the new one. -(defun trace-redefined-update (fname new-value) - (when (fboundp fname) - (let* ((fun (trace-fdefinition fname)) - (info (gethash fun *traced-funs*))) - (when (and info (trace-info-named info)) - (untrace-1 fname) - (trace-1 fname info new-value)) - (retrace-local-funs fname new-value)))) -(push #'trace-redefined-update *setf-fdefinition-hook*) +(defun maybe-retrace (name new-value) + (let* ((fun (trace-fdefinition name)) + (info (gethash fun *traced-funs*))) + (when info + (untrace-1 name) + (trace-1 name info new-value)) + (retrace-local-funs name new-value))) + +(defun maybe-retrace-function (name new-value) + (when (fboundp name) + (maybe-retrace name new-value))) + +(push #'maybe-retrace-function *setf-fdefinition-hook*) +(push #'maybe-retrace-function *setf-macro-function-hook*) ;;; Annotate a FORM to evaluate with pre-converted functions. FORM is ;;; really a cons (EXP . FUNCTION). LOC is the code location to use diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 80f843a5e9..5c17831bb5 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -3009,6 +3009,7 @@ possibly temporarily, because it might be used internally.") "%MACROEXPAND-1" "*SETF-FDEFINITION-HOOK*" + "*SETF-MACRO-FUNCTION-HOOK*" ;; error-reporting facilities diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 14acaf8039..8af2263ea7 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -86,7 +86,8 @@ (let ((sb-debug:*trace-report-default* #'collect)) (eval `(trace ,@trace-arguments)) (funcall fn)) - (ignore-errors (untrace)))) + (ignore-errors (untrace)) + (assert (null (trace))))) (nreverse traces))) (defmacro collecting-traces ((&rest trace-arguments) &body body) @@ -483,6 +484,31 @@ '((0 (labels fact :in macro-fact) :enter 0) (0 (labels fact :in macro-fact) :exit 1))))) +(defun call-with-macro-fact-redefined (fn) + (handler-bind ((sb-kernel:redefinition-with-defmacro #'muffle-warning)) + (eval `(defmacro macro-fact (x) + (declare (ignore x) (optimize (debug 3))) + (labels ((fact () 'redefined)) (fact)))) + (unwind-protect + (funcall fn) + (eval `(defmacro macro-fact (x) + (labels ((fact (x) (if (zerop x) 1 (* x (fact (1- x)))))) + (fact x))))))) + +(with-test (:name (trace :macro :redefined)) + (assert (equal (collecting-traces (macro-fact + (labels fact :in macro-fact)) + (macroexpand-1 '(macro-fact 0)) + (call-with-macro-fact-redefined + (lambda () (macroexpand-1 '(macro-fact 0))))) + '((0 macro-fact :enter (macro-fact 0) "unused argument") + (1 (labels fact :in macro-fact) :enter 0) + (1 (labels fact :in macro-fact) :exit 1) (0 macro-fact :exit 1) + (0 macro-fact :enter (macro-fact 0) "unused argument") + (1 (labels fact :in macro-fact) :enter) + (1 (labels fact :in macro-fact) :exit redefined) + (0 macro-fact :exit redefined))))) + (defun (cas trace-cas) (old new x) (declare (optimize (debug 3))) (flet (((cas body) (o n) From 8a83bc6e7f174151bceae69b54578d417ea953bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Thu, 31 Mar 2022 20:03:38 +0100 Subject: [PATCH 3298/4023] Retrace redefined compiler macros Adds new SB-INT:*SETF-COMPILER-MACRO-FUNCTION-HOOK*, similar to SB-INT:*SETF-MACRO-FUNCTION-HOOK* and SB-INT:*SETF-FDEFINITION-HOOK*. --- src/code/macroexpand.lisp | 8 ++++++++ src/code/ntrace.lisp | 6 ++++++ src/cold/exports.lisp | 1 + tests/debug.impure.lisp | 27 +++++++++++++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/src/code/macroexpand.lisp b/src/code/macroexpand.lisp index 0321ce8bd7..2f9f696047 100644 --- a/src/code/macroexpand.lisp +++ b/src/code/macroexpand.lisp @@ -159,6 +159,11 @@ return NIL. Can be set with SETF when ENV is NIL." ;; we don't do it. (values (info :function :compiler-macro-function name)))) +(defvar *setf-compiler-macro-function-hook* nil + "A list of functions that (SETF COMPILER-MACRO-FUNCTION) invokes before + storing the new value. The functions take the function name and the new + value.") + ;;; FIXME: we don't generate redefinition warnings for these. (defun (setf compiler-macro-function) (function name &optional env) (declare (type (or symbol list) name) @@ -168,6 +173,9 @@ return NIL. Can be set with SETF when ENV is NIL." (error "can't SETF COMPILER-MACRO-FUNCTION when ENV is non-NIL")) (when (eq (info :function :kind name) :special-form) (error "~S names a special form." name)) + (when (boundp '*setf-compiler-macro-function-hook*) ; unbound during cold init + (dolist (f *setf-compiler-macro-function-hook*) + (funcall f name function))) (with-single-package-locked-error (:symbol name "setting the compiler-macro-function of ~A") (setf (info :function :compiler-macro-function name) function) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index dc51e45af2..395d01fd28 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -111,6 +111,12 @@ (push #'maybe-retrace-function *setf-fdefinition-hook*) (push #'maybe-retrace-function *setf-macro-function-hook*) +(defun maybe-retrace-compiler-macro (name new-value) + (when (compiler-macro-function name) + (maybe-retrace `(compiler-macro ,name) new-value))) + +(push #'maybe-retrace-compiler-macro *setf-compiler-macro-function-hook*) + ;;; Annotate a FORM to evaluate with pre-converted functions. FORM is ;;; really a cons (EXP . FUNCTION). LOC is the code location to use ;;; for the lexical environment. If LOC is NIL, evaluate in the null diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 5c17831bb5..727a9673d9 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -3008,6 +3008,7 @@ possibly temporarily, because it might be used internally.") "%MACROEXPAND" "%MACROEXPAND-1" + "*SETF-COMPILER-MACRO-FUNCTION-HOOK*" "*SETF-FDEFINITION-HOOK*" "*SETF-MACRO-FUNCTION-HOOK*" diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 8af2263ea7..5f899bb8e1 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -416,6 +416,33 @@ '((0 (flet body :in (compiler-macro fn-with-cmac)) :enter) (0 (flet body :in (compiler-macro fn-with-cmac)) :exit 42))))) +(defun call-with-compiler-macro-redefined (fn) + (eval `(define-compiler-macro fn-with-cmac (x) + (declare (ignore x) (optimize (debug 3))) + (flet ((body () ''redefined)) + (body)))) + (unwind-protect + (funcall fn) + (eval `(define-compiler-macro fn-with-cmac (x) + (declare (ignore x) (optimize (debug 3))) + (flet ((body () 42)) + (body)))))) + +(with-test (:name (trace :compiler-macro :redefined)) + (assert (equal (collecting-traces ((compiler-macro fn-with-cmac) + (flet body :in (compiler-macro fn-with-cmac))) + (compile nil '(lambda () (fn-with-cmac 0))) + (call-with-compiler-macro-redefined + (lambda () (compile nil '(lambda () (fn-with-cmac 0)))))) + '((0 (compiler-macro fn-with-cmac) :enter (fn-with-cmac 0) "unused argument") + (1 (flet body :in (compiler-macro fn-with-cmac)) :enter) + (1 (flet body :in (compiler-macro fn-with-cmac)) :exit 42) + (0 (compiler-macro fn-with-cmac) :exit 42) + (0 (compiler-macro fn-with-cmac) :enter (fn-with-cmac 0) "unused argument") + (1 (flet body :in (compiler-macro fn-with-cmac)) :enter) + (1 (flet body :in (compiler-macro fn-with-cmac)) :exit 'redefined) + (0 (compiler-macro fn-with-cmac) :exit 'redefined))))) + (defun throw-foo () (throw 'foo 42)) From 75d185f873d678fb02b722fbeb881197c2338ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Thu, 31 Mar 2022 22:46:25 +0100 Subject: [PATCH 3299/4023] Document TRACEability of macros, compiler macros, methods and labels --- src/code/ntrace.lisp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 395d01fd28..c1557e7faa 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -600,9 +600,16 @@ functions are called. In its simplest form: (TRACE NAME-1 NAME-2 ...) -The NAMEs are not evaluated. Each may be a symbol, denoting an -individual function, or a string, denoting all functions fbound to -symbols whose home package is the package with the given name. +The NAMEs are not evaluated. Each may be one of the following: + * SYMBOL, denoting a function or macro. + * FNAME, a valid function name, denoting a function. + * (METHOD FNAME QUALIFIERS* (SPECIALIZERS*)) denoting a method. + * (COMPILER-MACRO SYMBOL) denoting a compiler macro. + * (LABELS FNAME :IN OUTER-NAME) or (FLET FNAME :IN OUTER-NAME) + denoting a local function where OUTER-NAME may be any of the + previous names for functions, macros, methods or compiler macros. + * STRING denoting all functions fbound to symbols whose home package + is the package with the given name. Options allow modification of the default behavior. Each option is a pair of an option keyword and a value form. Global options are From 8c9156b59a5a6d3e8bfee1244521c9538ad39d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Thu, 14 Apr 2022 16:48:12 +0100 Subject: [PATCH 3300/4023] Handle local functions within SETF functions --- src/code/ntrace.lisp | 4 ++-- tests/debug.impure.lisp | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index c1557e7faa..0d0b04109f 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -62,7 +62,7 @@ ((cons (eql method)) (values (get-def `(sb-pcl::fast-method ,@(rest outer))) (simple-local-name))) - ((cons (member compiler-macro cas)) + ((cons (member compiler-macro cas setf)) (values (get-def outer) (simple-local-name))) (t (values (get-def outer) x))))) @@ -390,7 +390,7 @@ (let* ((local-name (when local (let ((outer (car (last local)))) (typecase outer - ((cons (member method compiler-macro cas)) + ((cons (member method compiler-macro cas setf)) (labels ((simplify (name) (if (symbolp name) name (simplify (second name))))) `(,(first local) ,(second local) :in ,(simplify outer)))) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 5f899bb8e1..5d9fd8e28b 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -566,6 +566,21 @@ (1 (flet (cas body) :in (method (cas trace-cas-gf) (t t t))) :exit 42) (0 (method (cas trace-cas-gf) (t t t)) :exit 42))))) +(defun (setf trace-setf) (value x) + (declare (optimize (debug 3))) + (flet (((setf body) (value) + (+ value x))) + (setf (body) value))) + +(with-test (:name (trace :setf)) + (assert (equal (collecting-traces ((setf trace-setf) + (flet (setf body) :in (setf trace-setf))) + (setf (trace-setf 11) 31)) + '((0 (setf trace-setf) :enter 31 11) + (1 (flet (setf body) :in (setf trace-setf)) :enter 31) + (1 (flet (setf body) :in (setf trace-setf)) :exit 42) + (0 (setf trace-setf) :exit 42))))) + (with-test (:name :bug-414) (handler-bind ((warning #'error)) (with-scratch-file (output "fasl") From a9e0987de2e8ea3e32ef0ed12f0ae0245038e449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Mon, 9 May 2022 23:25:47 +0100 Subject: [PATCH 3301/4023] Refactor TRACE-FDEFINITION, TRACE-1, UNTRACE-1 - Removed duplicated code for calculating local function names. That info is now returned by TRACE-FDEFINTION and reused by TRACE-1 - TRACE-FDEFINITION now takes advantage of VALID-FUNCTION-NAME-P to calculate block names. - Simplified and centralised logic for deciding whether to trace via encapsulation in TRACE-1. Removed the TRACE-INFO-NAMED slot. - Store names in *TRACED-FUNS*, simplifying UNTRACE-1. --- src/code/early-ntrace.lisp | 2 - src/code/ntrace.lisp | 361 +++++++++++++++++-------------------- src/pcl/combin.lisp | 13 +- 3 files changed, 168 insertions(+), 208 deletions(-) diff --git a/src/code/early-ntrace.lisp b/src/code/early-ntrace.lisp index 313415ed2a..7c36cca971 100644 --- a/src/code/early-ntrace.lisp +++ b/src/code/early-ntrace.lisp @@ -51,8 +51,6 @@ (prin1 (trace-info-what x) stream))))) ;; the original representation of the thing traced (what nil :type (or function cons symbol)) - ;; Is WHAT a function name whose definition we should track? - (named nil) ;; Is tracing to be done by encapsulation rather than breakpoints? ;; T implies NAMED. (encapsulated *trace-encapsulate-default*) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 0d0b04109f..187a72c344 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -17,76 +17,69 @@ ;;;; utilities -;;; Given a function name, a method name, a function or a macro name, -;;; return the raw definition and some information. "Raw" means that -;;; if the result is a closure, we strip off the closure and return -;;; the bare code. The second value is T if the argument was a -;;; function name. The third value is one of :COMPILED, -;;; :COMPILED-CLOSURE, :INTERPRETED, :INTERPRETED-CLOSURE and -;;; :FUNCALLABLE-INSTANCE. The fourth value is a method name, when -;;; applicable. -(defun trace-fdefinition (x) - (flet ((get-def (name) - (cond ((typep name '(cons (eql compiler-macro))) - (compiler-macro-function (second name))) - ((and (symbolp name) (macro-function name))) - ((valid-function-name-p name) - (if (fboundp name) - (fdefinition name) - (warn "~/sb-ext:print-symbol-with-prefix/ is ~ - undefined, not tracing." name))) - (t - (warn "~S is not a valid function name, not tracing." name))))) - (multiple-value-bind (res named-p method local) - (typecase x - (symbol - (cond ((special-operator-p x) - (warn "~S is a special operator, not tracing." x)) - ((macro-function x)) - (t - (values (get-def x) t)))) - (function - x) - ((cons (eql compiler-macro)) - (values (get-def x) nil)) - ((cons (member flet labels)) ; ({FLET,LABELS} name :IN outer-function) - (multiple-value-bind (fun local-name) - (let ((outer (car (last x)))) - (flet ((simple-local-name () - (labels ((simplify (name) - (if (symbolp name) - name - (simplify (second name))))) - `(,(first x) ,(second x) :in ,(simplify outer))))) - (typecase outer - ((cons (eql method)) - (values (get-def `(sb-pcl::fast-method ,@(rest outer))) - (simple-local-name))) - ((cons (member compiler-macro cas setf)) - (values (get-def outer) (simple-local-name))) - (t - (values (get-def outer) x))))) - (when fun - (if (sb-di:fun-debug-fun fun :local-name local-name) - (values fun nil nil x) - (warn "~S not found, not tracing." x))))) - ((cons (eql method)) ; (METHOD name qualifiers (specializers*)) - (let ((gf (get-def (second x)))) - (when gf - (if (find-method gf (butlast (cddr x)) (car (last x)) nil) - (values gf t x) - (warn "~S not found, not tracing." x))))) - (t - (values (get-def x) t))) - (typecase res - (closure - (values (%closure-fun res) named-p :compiled-closure method local)) - (funcallable-instance - (values res named-p :funcallable-instance method local)) - ;; FIXME: What about SB-KERNEL:INTERPRETED-FUNCTION -- it gets - ;; picked off by the FIN above, is that right? - (t - (values res named-p :compiled method local)))))) +;;; Given X -- a function object or an s-expression naming a global function, +;;; local function, method, macro or compiler-macro -- return the following +;;; values: +;;; * a function object suitable for introspection via +;;; SB-DI:FUN-DEBUG-FUN. For local functions, their parent function is +;;; returned. For methods, their generic function is returned, unless +;;; IF-METHOD is :FAST-METHOD, in which case their respective +;;; SB-PCL::FAST-METHOD function is returned. +;;; * The function's BLOCK name, useful for looking up local functions. +;;; * A keyword symbol describing what X denotes: :ANONYMOUS-FUNCTION, +;;; :FUNCTION, :LOCAL-FUNCTION, :METHOD, :MACRO-FUNCTION. +;;; * [For local functions only] A local name suitable for SB-DI:FUN-DEBUG-FUN +;;; lookup. +(defun %trace-fdefinition (x &key (if-method :gf) definition) + (typecase x + (function + (values x nil :anonymous-function)) + ((cons (eql compiler-macro) (cons t null)) + (let ((fun (or definition (compiler-macro-function (second x))))) + (if fun + (values fun (second x) :compiler-macro) + (warn "~S is undefined, not tracing." x)))) + ((cons (eql method)) ; (METHOD name qualifiers (specializers*)) + (assert (null definition)) + (multiple-value-bind (gf block-name) + (%trace-fdefinition (second x)) + (when gf + (if (find-method gf (butlast (cddr x)) (car (last x)) nil) + (ecase if-method + (:fast-method + (%trace-fdefinition `(sb-pcl::fast-method ,@(rest x)))) + (:gf + (values gf block-name :method))) + (warn "~S not found, not tracing." x))))) + ((cons (member flet labels)) ; ({FLET,LABELS} name :IN outer-function) + (destructuring-bind (flet/labels name &key in) x + (multiple-value-bind (fun block-name) + (%trace-fdefinition in :if-method :fast-method :definition definition) + (when fun + (let ((local-name `(,flet/labels ,name :in ,block-name))) + (if (sb-di:fun-debug-fun fun :local-name local-name) + (values fun nil :local-function local-name) + (warn "~S not found, not tracing." x))))))) + ((and symbol (satisfies special-operator-p)) + (warn "~S is a special operator, not tracing." x)) + ((and symbol (satisfies macro-function)) + (values (or definition (macro-function x)) x :macro-function)) + (t + (multiple-value-bind (valid block-name) + (valid-function-name-p x) + (cond ((not valid) + (warn "~S is not a valid function name, not tracing." x)) + ((fboundp x) + (values (or definition (fdefinition x)) block-name :function)) + (t + (warn "~/sb-ext:print-symbol-with-prefix/ is ~ + undefined, not tracing." x))))))) + +(defun trace-fdefinition (x &optional definition) + (multiple-value-bind (fun block-name kind local-name) + (%trace-fdefinition x :definition definition) + (declare (ignore block-name)) + (values fun kind local-name))) (defun retrace-local-funs (fname &optional new-value) (dolist (local (gethash fname *traced-locals*)) @@ -97,8 +90,7 @@ ;;; When a function name is redefined, and we were tracing that name, ;;; then untrace the old definition and trace the new one. (defun maybe-retrace (name new-value) - (let* ((fun (trace-fdefinition name)) - (info (gethash fun *traced-funs*))) + (let ((info (gethash name *traced-funs*))) (when info (untrace-1 name) (trace-1 name info new-value)) @@ -373,98 +365,80 @@ ;;; If non-null, DEFINITION is the new definition of a function that ;;; we are automatically retracing. (defun trace-1 (function-or-name info &optional definition) - (multiple-value-bind (fun named kind method local) - (if definition - (multiple-value-bind (fun named kind) - (trace-fdefinition definition) - (declare (ignore named)) - (if (typep function-or-name '(cons (member flet labels))) - (values fun t kind nil function-or-name) - (values definition t kind))) - (trace-fdefinition function-or-name)) + (multiple-value-bind (fun kind local-name) + (trace-fdefinition function-or-name definition) (when fun - (let ((trace-key (or local method fun))) - (when (gethash trace-key *traced-funs*) - (warn "~S is already TRACE'd, untracing it first." function-or-name) - (untrace-1 trace-key)) - (let* ((local-name (when local - (let ((outer (car (last local)))) - (typecase outer - ((cons (member method compiler-macro cas setf)) - (labels ((simplify (name) - (if (symbolp name) name (simplify (second name))))) - `(,(first local) ,(second local) :in ,(simplify outer)))) - (t local))))) - (debug-fun (sb-di:fun-debug-fun fun :local-name local-name)) - (encapsulated - (and named - (if (eq (trace-info-encapsulated info) :default) - (ecase kind - (:compiled nil) - (:compiled-closure - (unless (functionp function-or-name) - (warn "tracing shared code for ~S:~% ~S" - function-or-name - fun)) - nil) - ((:interpreted :interpreted-closure :funcallable-instance) - t)) - (trace-info-encapsulated info)))) - (loc (if encapsulated - :encapsulated - (sb-di:debug-fun-start-location debug-fun))) - (info (make-trace-info - :what function-or-name - :named named - :encapsulated encapsulated - :wherein (trace-info-wherein info) - :methods (trace-info-methods info) - :condition (coerce-form (trace-info-condition info) loc) - :break (coerce-form (trace-info-break info) loc) - :report (trace-info-report info) - :print (coerce-form-list (trace-info-print info) loc) - :break-after (coerce-form (trace-info-break-after info) nil) - :condition-after - (coerce-form (trace-info-condition-after info) nil) - :print-after - (coerce-form-list (trace-info-print-after info) nil)))) - - (dolist (wherein (trace-info-wherein info)) - (unless (or (stringp wherein) - (fboundp wherein)) - (warn ":WHEREIN name ~S is not a defined global function." - wherein))) - - (cond - (encapsulated - (if method - (reinitialize-instance fun) - (encapsulate function-or-name 'trace - (lambda (function &rest args) - (apply #'trace-call info function args))))) - (t - (multiple-value-bind (start-fun cookie-fun) - (trace-start-breakpoint-fun info) - (let ((start (sb-di:make-breakpoint start-fun debug-fun - :kind :fun-start)) - (end (sb-di:make-breakpoint - (trace-end-breakpoint-fun info) - debug-fun :kind :fun-end - :fun-end-cookie cookie-fun))) - (setf (trace-info-start-breakpoint info) start) - (setf (trace-info-end-breakpoint info) end) - ;; The next two forms must be in the order in which they - ;; appear, since the start breakpoint must run before the - ;; fun-end breakpoint's start helper (which calls the - ;; cookie function.) One reason is that cookie function - ;; requires that the CONDITIONP shared closure variable be - ;; initialized. - (sb-di:activate-breakpoint start) - (sb-di:activate-breakpoint end))))) - - (when local - (push local (gethash (fourth local) *traced-locals*))) - (setf (gethash trace-key *traced-funs*) info))) + (when (closurep fun) + (setq fun (%closure-fun fun)) + (when (eq (trace-info-encapsulated info) :default) + (warn "tracing shared code for ~S:~% ~S" function-or-name fun))) + (when (gethash function-or-name *traced-funs*) + (warn "~S is already TRACE'd, untracing it first." function-or-name) + (untrace-1 function-or-name)) + (let* ((debug-fun (sb-di:fun-debug-fun fun :local-name local-name)) + (encapsulated + (ecase kind + ((:function :method) + (if (eq (trace-info-encapsulated info) :default) + (funcallable-instance-p fun) + (trace-info-encapsulated info))) + ((:anonymous-function :compiler-macro :macro-function :local-function) + nil))) + (loc (if encapsulated + :encapsulated + (sb-di:debug-fun-start-location debug-fun))) + (info (make-trace-info + :what function-or-name + :encapsulated encapsulated + :wherein (trace-info-wherein info) + :methods (trace-info-methods info) + :condition (coerce-form (trace-info-condition info) loc) + :break (coerce-form (trace-info-break info) loc) + :report (trace-info-report info) + :print (coerce-form-list (trace-info-print info) loc) + :break-after (coerce-form (trace-info-break-after info) nil) + :condition-after + (coerce-form (trace-info-condition-after info) nil) + :print-after + (coerce-form-list (trace-info-print-after info) nil)))) + + (dolist (wherein (trace-info-wherein info)) + (unless (or (stringp wherein) + (fboundp wherein)) + (warn ":WHEREIN name ~S is not a defined global function." + wherein))) + + (cond + (encapsulated + (if (eq kind :method) + (reinitialize-instance fun) + (encapsulate function-or-name 'trace + (lambda (function &rest args) + (apply #'trace-call info function args))))) + (t + (multiple-value-bind (start-fun cookie-fun) + (trace-start-breakpoint-fun info) + (let ((start (sb-di:make-breakpoint start-fun debug-fun + :kind :fun-start)) + (end (sb-di:make-breakpoint + (trace-end-breakpoint-fun info) + debug-fun :kind :fun-end + :fun-end-cookie cookie-fun))) + (setf (trace-info-start-breakpoint info) start) + (setf (trace-info-end-breakpoint info) end) + ;; The next two forms must be in the order in which they + ;; appear, since the start breakpoint must run before the + ;; fun-end breakpoint's start helper (which calls the + ;; cookie function.) One reason is that cookie function + ;; requires that the CONDITIONP shared closure variable be + ;; initialized. + (sb-di:activate-breakpoint start) + (sb-di:activate-breakpoint end))))) + + (when (eq kind :local-function) + (push function-or-name + (gethash (fourth function-or-name) *traced-locals*))) + (setf (gethash function-or-name *traced-funs*) info)) (when (and (typep fun 'generic-function) (trace-info-methods info) @@ -696,42 +670,32 @@ the N-th value returned by the function." ;;; Untrace one function. (defun untrace-1 (function-or-name) - (multiple-value-bind (fun named kind method local) + (multiple-value-bind (fun kind) (trace-fdefinition function-or-name) - (declare (ignore named kind)) - (let* ((trace-key (or local method fun)) - (info (when fun (gethash trace-key *traced-funs*)))) - (cond - ((and fun (not info)) - (warn "Function is not TRACEd: ~S" function-or-name)) - ((not fun) - ;; Someone has FMAKUNBOUND it. - (let ((table *traced-funs*)) - (with-system-mutex ((hash-table-lock table)) - (maphash (lambda (key info) - (when (equal function-or-name (trace-info-what info)) - (remhash key table))) - table)))) - (t - (cond - ((trace-info-encapsulated info) - (if method - (reinitialize-instance fun) - (unencapsulate (trace-info-what info) 'trace))) - (t - (sb-di:delete-breakpoint (trace-info-start-breakpoint info)) - (sb-di:delete-breakpoint (trace-info-end-breakpoint info)))) - (setf (trace-info-untraced info) t) - (when local - (let ((table *traced-locals*) - (outer (fourth local))) - (with-system-mutex ((hash-table-lock table)) - (let* ((locals (gethash outer table)) - (remaining (remove local locals :test #'equal))) - (if remaining - (setf (gethash outer table) remaining) - (remhash outer table)))))) - (remhash trace-key *traced-funs*)))))) + (when fun + (let ((info (gethash function-or-name *traced-funs*))) + (cond ((and fun (not info)) + (warn "Function is not TRACEd: ~S" function-or-name)) + (t + (cond + ((trace-info-encapsulated info) + (if (eq kind :method) + (reinitialize-instance fun) + (unencapsulate (trace-info-what info) 'trace))) + (t + (sb-di:delete-breakpoint (trace-info-start-breakpoint info)) + (sb-di:delete-breakpoint (trace-info-end-breakpoint info)))) + (setf (trace-info-untraced info) t) + (when (eq kind :local-function) + (let ((table *traced-locals*) + (outer (fourth function-or-name))) + (with-system-mutex ((hash-table-lock table)) + (let* ((locals (gethash outer table)) + (remaining (remove function-or-name locals :test #'equal))) + (if remaining + (setf (gethash outer table) remaining) + (remhash outer table)))))))))) + (remhash function-or-name *traced-funs*))) ;;; Untrace all traced functions. (defun untrace-all () @@ -853,7 +817,6 @@ functions when called with no arguments." (info (make-trace-info :what (cond (fdefn (fdefn-name fdefn)) (t (%fun-name traced-fun))) :encapsulated t - :named t :report 'trace)) (tracing-wrapper (compile-funobj-encapsulation 'trace-call info proxy-fun))) diff --git a/src/pcl/combin.lisp b/src/pcl/combin.lisp index 9abff1d98d..75080b9386 100644 --- a/src/pcl/combin.lisp +++ b/src/pcl/combin.lisp @@ -146,18 +146,17 @@ `(combined-method ,(generic-function-name gf)))) (defun maybe-trace-method (gf method fun fmf-p) - (let ((m-name (when (or (plusp (hash-table-count sb-debug::*traced-funs*)) - (plusp (hash-table-count sb-debug::*traced-locals*))) - ;; KLUDGE: testing if *TRACE-FUNS* or *TRACED-LOCALS* have - ;; anything to avoid calling METHOD-TRACE-NAME during PCL - ;; bootstrapping when the generic-function type is not yet - ;; defined.) + (let ((m-name (when (plusp (hash-table-count sb-debug::*traced-funs*)) + ;; KLUDGE: testing if *TRACE-FUNS* has anything anything to + ;; avoid calling METHOD-TRACE-NAME during PCL bootstrapping + ;; when the generic-function type is not yet defined.) (method-trace-name gf method)))) (when m-name (sb-debug::retrace-local-funs m-name)) (let ((info (when m-name (or (gethash m-name sb-debug::*traced-funs*) - (let ((gf-info (gethash gf sb-debug::*traced-funs*))) + (let ((gf-info (gethash (or (generic-function-name gf) gf) + sb-debug::*traced-funs*))) (when (and gf-info (sb-debug::trace-info-methods gf-info)) (let ((copy (copy-structure gf-info))) (setf (sb-debug::trace-info-what copy) m-name) From 5e8257072b6056e24778a965a20268ae0eb0f2b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Tue, 10 May 2022 01:31:05 +0100 Subject: [PATCH 3302/4023] Fix option handling when tracing functions by value E.g.: (trace :function x <options>) --- src/code/ntrace.lisp | 8 +++++--- tests/debug.impure.lisp | 8 ++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 187a72c344..b28708f262 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -522,14 +522,16 @@ (current (parse-trace-options specs global-options))) (loop (when (endp current) (return)) - (let ((name (pop current)) - (options (copy-trace-info global-options))) + (let* ((name (pop current)) + (fn (when (eq name :function) + (pop current))) + (options (copy-trace-info global-options))) ;; parse options for the current spec. (setq current (parse-trace-options current options)) (cond ((eq name :function) (let ((temp (gensym))) - (binds `(,temp ,(pop current))) + (binds `(,temp ,fn)) (forms `(trace-1 ,temp ',options)))) ((and (keywordp name) (not (or (fboundp name) (macro-function name)))) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 5d9fd8e28b..d43a64d55f 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -192,6 +192,14 @@ (1 trace-fact :exit t 1) (0 trace-fact :exit t 2))))))) +(with-test (:name (trace :anonymous)) + (assert (equalp (call-collecting-traces + (lambda () + (trace-fact 1)) + `(:function ,#'trace-fact :condition (plusp (sb-debug:arg 0)))) + '((0 trace-fact :enter 1) + (0 trace-fact :exit 1))))) + (defgeneric trace-gf (x) (:method ((x float)) (+ x (call-next-method))) (:method :before ((x float)) 'bf) From 039a7bee23ede45759b18388b0dd14c9c3247bf2 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 10 May 2022 13:33:12 -0700 Subject: [PATCH 3303/4023] Remove Q&A. We have those docs in tree now. --- src/compiler/ir1tran-lambda.lisp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 0b91ea0326..0ccefcfec1 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -15,8 +15,6 @@ ;;;; LAMBDA hackery -;;;; FIXME: where is that file? -;;;; Answer: As usual, with CMUCL. ;;;; Note: Take a look at the compiler-overview.tex section on "Hairy ;;;; function representation" before you seriously mess with this ;;;; stuff. From 753960270511b5d5500cc363749d0e084541022e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Mon, 9 May 2022 21:40:57 +0100 Subject: [PATCH 3304/4023] Show frames of signal handlers in debugger backtraces SIGNAL was eagerly binding SB-DEBUG:*STACK-TOP-HINT* causing handler frames to be omitted when the debugger was invoked during the handling of a condition. We still bind SB-DEBUG:*STACK-TOP-HINT* before BREAKing due to *BREAK-ON-SIGNALS* to hide the SIGNAL frame and onwards. --- src/code/cold-error.lisp | 6 +++--- tests/debug.impure.lisp | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/code/cold-error.lisp b/src/code/cold-error.lisp index 8489cbfc57..d66c51308c 100644 --- a/src/code/cold-error.lisp +++ b/src/code/cold-error.lisp @@ -79,10 +79,10 @@ (declare (explicit-check)) (%signal (apply #'coerce-to-condition datum 'simple-condition 'signal arguments))) (defun %signal (condition) - (let ((handler-clusters *handler-clusters*) - (sb-debug:*stack-top-hint* (or sb-debug:*stack-top-hint* '%signal))) + (let ((handler-clusters *handler-clusters*)) (when *break-on-signals* - (maybe-break-on-signal condition)) + (let ((sb-debug:*stack-top-hint* (or sb-debug:*stack-top-hint* '%signal))) + (maybe-break-on-signal condition))) (do ((cluster (pop handler-clusters) (pop handler-clusters))) ((null cluster) nil) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index d43a64d55f..9e816ead85 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -1161,3 +1161,39 @@ (compile 'll-unknown) (with-test (:name :unknown-lambda-list) (assert (eq (sb-kernel:%fun-lambda-list #'ll-unknown) :unknown))) + +;;;; SB-DEBUG:*STACK-TOP-HINT* management + +(defun buggy-handler (c) + (declare (ignore c)) + ;; signal a nondescript condition to avoid triggering WITH-TEST's error + ;; handling. + (error 'simple-condition :format-control "buggy handler")) + +(defun signal-and-handle-with-buggy-handler () + (handler-bind ((program-error #'buggy-handler)) + (signal 'program-error))) + +(defun call-getting-stack-top-on-invoke-debugger (fn) + (block nil + (let ((*invoke-debugger-hook* + (lambda (condition hook) + (declare (ignore condition hook)) + (let ((top (sb-debug::resolve-stack-top-hint))) + (return (caar (sb-debug:list-backtrace :from top))))))) + (funcall fn)))) + +;; If an error occurs within a signal handler, we want to see the handling +;; frames in the backtrace. +(with-test (:name (:stack-top-hint :signal)) + (assert (eq 'buggy-handler + (call-getting-stack-top-on-invoke-debugger + #'signal-and-handle-with-buggy-handler)))) + +;; When breaking on signals, we don't need to see the SIGNAL frame or other +;; frames above that. +(with-test (:name (:stack-top-hint :signal :break-on-signals)) + (assert (eq 'signal-and-handle-with-buggy-handler + (let ((*break-on-signals* t)) + (call-getting-stack-top-on-invoke-debugger + #'signal-and-handle-with-buggy-handler))))) From 2353f70c38afcc07eb48d769743f4f92236e1996 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 10 May 2022 18:33:24 -0400 Subject: [PATCH 3305/4023] Fix test find-page-index could return -1 if the test saw an object of sufficiently large size in immobile space. --- tests/allocator.pure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/allocator.pure.lisp b/tests/allocator.pure.lisp index 3bfc74e282..2d97229ffb 100644 --- a/tests/allocator.pure.lisp +++ b/tests/allocator.pure.lisp @@ -59,7 +59,7 @@ (pte (deref sb-vm:page-table (sb-vm:find-page-index addr)))) (when (eq (slot pte 'sb-vm::gen) sb-vm:+pseudo-static-generation+) (assert (large-object-p obj)))))) - :all)) + :dynamic)) (eval-when (:compile-toplevel :load-toplevel :execute) (defparameter large-n-words (/ sb-vm:large-object-size sb-vm:n-word-bytes)) From 729d747c17e10ca1988de036422a80db8cef2474 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 10 May 2022 18:35:09 -0400 Subject: [PATCH 3306/4023] Remove code resulting from transient brain failure "I've never seen this" because it can't happen. Assert that. But then fullcgc can't use deposit_filler. It's not the same use-case. deposit_filler() is for blasting away a range of objects that are the inverse of the pinned objects on a page. Do something else in fullcgc. --- src/runtime/fullcgc.c | 41 +++++++++++++-------- src/runtime/gc-private.h | 5 ++- src/runtime/gencgc.c | 77 +++++++++++++++++++++------------------- src/runtime/verify.inc | 8 ++--- 4 files changed, 75 insertions(+), 56 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 2fad9cb4f7..4f30e4c844 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -567,11 +567,35 @@ static void sweep_fixedobj_pages(long *zeroed) } #endif +/* Overwrite exactly 1 object wit non-pointer words of some sort. + * This eliminates tenured garbage in pseudo-static-generation, + * and does NOT strive to to write as few words as possible, + * unlike deposit_filler() which tries to be efficient */ +static void clobber_headered_object(lispobj* addr, sword_t nwords) +{ + page_index_t page = find_page_index(addr); + if (page < 0) { // code space + struct code* code = (struct code*)addr; + if (!filler_obj_p((lispobj*)code)) { + code->boxed_size = 0; + code->header = (nwords << CODE_HEADER_SIZE_SHIFT) + | CODE_HEADER_WIDETAG; + memset(addr+2, 0, (nwords - 2) * N_WORD_BYTES); + } + } else if (page_table[page].type == PAGE_TYPE_CODE) { + // Code pages don't want (0 . 0) fillers, otherwise heap checking + // gets an error: "object @ 0x..... is non-code on code page" + addr[0] = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; + addr[1] = 0; + } else { + memset(addr, 0, nwords * N_WORD_BYTES); + } +} + static uword_t sweep(lispobj* where, lispobj* end, __attribute__((unused)) uword_t arg) { sword_t nwords; - extern void deposit_filler(uword_t addr, sword_t nbytes); for ( ; where < end ; where += nwords ) { lispobj word = *where; @@ -580,22 +604,11 @@ static uword_t sweep(lispobj* where, lispobj* end, nwords = sizetab[header_widetag(word)](where); lispobj markbit = general_widetag_to_markbit(header_widetag(word)); if (word & markbit) livep = 1, *where = word ^ markbit; + if (!livep) clobber_headered_object(where, nwords); } else { nwords = 2; livep = cons_markedp((lispobj)where); - } - if (!livep) { - if (find_page_index(where)>=0) // dynamic space - deposit_filler((uword_t)where, nwords<<WORD_SHIFT); - else { // immobile space - struct code* code = (struct code*)where; - if (!filler_obj_p((lispobj*)code)) { - code->boxed_size = 0; - code->header = (nwords << CODE_HEADER_SIZE_SHIFT) - | CODE_HEADER_WIDETAG; - memset(where+2, 0, (nwords - 2) * N_WORD_BYTES); - } - } + if (!livep) where[0] = where[1] = (uword_t)-1; } } return 0; diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index ab6ddd4b3e..aa5bea8856 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -560,7 +560,10 @@ static inline boolean plausible_tag_p(lispobj addr) { if (listp(addr)) return is_cons_half(CONS(addr)->car) - && is_cons_half(CONS(addr)->cdr); + && is_cons_half(CONS(addr)->cdr) + // -1 can be left by the */signed=>integer vop + // and is also useful as filler on cons pages. + && CONS(addr)->car != (uword_t)-1; unsigned char widetag = widetag_of(native_pointer(addr)); return other_immediate_lowtag_p(widetag) && lowtag_of(addr) == LOWTAG_FOR_WIDETAG(widetag); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index c77d100f5d..41217a323d 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2240,42 +2240,40 @@ void visit_freed_objects(char __attribute__((unused)) *start, #endif } -void deposit_filler(uword_t addr, sword_t nbytes) { +/* Deposit a FILLER_WIDETAG object covering one or more dead objects. + * If using more than 1 card per page, scavenge_root_gens() is able to scan + * some pages without aligning to object boundaries. For that to work, + * it must not accidentally see a raw word or leftover garbage. + * Note that while CONS and SMALL_MIXED pages never have card-spanning objects, + * deposit_filler() deals with the "mirror image" of the pinned objects, + * hence it might get a card-spanning filler. It has to do something to ensure + * that no card will see garbage if scanned from its base address. + * To achieve that, an extra filler may be needed at the start of any spanned card. + * The sizes of extra fillers don't have to sum up to the total filler size. + * They serve the vital purpose of getting descriptors_scavenge() to skip a + * portion of the card they're on, but those fillers are never visited in a + * heap walk that steps by object from a page's page_scan_start. + * The final filler must be the correct size, so any algorithm that achieves + * the desired end result is OK */ +void deposit_filler(char* from, char* to) { + sword_t nbytes = to - from; if (!nbytes) return; gc_assert(nbytes > 0); sword_t nwords = nbytes >> WORD_SHIFT; - visit_freed_objects((char*)addr, nbytes); gc_assert((nwords - 1) <= 0x7FFFFF); - *(lispobj*)addr = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; - page_index_t page = find_page_index((void*)addr); - // - MIXED does not need this because we always scan by object - // - SMALL_MIXED does because obliterate_nonpinned_words() uses as - // few fillers as it can to cover all non-live ranges on a page. - if (page_table[page].type == PAGE_TYPE_BOXED || - page_table[page].type == PAGE_TYPE_CONS || - page_table[page].type == PAGE_TYPE_SMALL_MIXED) { - /* Strictly boxed cards are scanned without respect to object boundaries, - * so we might need to clobber all pointers that formerly occupied the bytes. - * If the range falls within 1 card, then we don't need to clear anything, - * because the scanning routine can see the filler object and skip over it. */ - char* limit = (char*)addr + nbytes; - if (find_page_index(limit-1) == page) { // single page - long unsigned last_card = addr_to_card_index(limit-1); - /* Within 1 page, put fillers at the start of each card. - * The sizes of the extra fillers don't have to sum up to the total size, - * because although they serve the vital purpose of getting descriptors_scavenge() - * to skip the the leading portion of the card they're on, those pseudo-objects - * can never be visited in a normal heap walk. The final filler has to be the - * correct size, so any algorithm that achieves that is fine */ - while (addr_to_card_index((char*)addr) != last_card) { - addr = ALIGN_DOWN(addr, GENCGC_CARD_BYTES) + GENCGC_CARD_BYTES; - nwords = (limit - (char*)addr) >> WORD_SHIFT; - *(lispobj*)addr = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; - } - } else { - /* If more than 1 page, just do the obvious thing - zeroize all the words. - * I've never seen this case happen, so it's not worth optimizing for */ - memset((char*)addr+N_WORD_BYTES, 0, nbytes-N_WORD_BYTES); + page_index_t page = find_page_index(from); + gc_assert(find_page_index(to-1) == page); + *(lispobj*)from = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; + long unsigned last_card; + switch (page_table[page].type) { + case PAGE_TYPE_BOXED: + case PAGE_TYPE_CONS: + case PAGE_TYPE_SMALL_MIXED: + last_card = addr_to_card_index(to-1); + while (addr_to_card_index(from) != last_card) { + from = PTR_ALIGN_DOWN(from, GENCGC_CARD_BYTES) + GENCGC_CARD_BYTES; + nwords = (to - from) >> WORD_SHIFT; + *(lispobj*)from = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; } } } @@ -2315,8 +2313,8 @@ static void obliterate_nonpinned_words() lispobj* obj = native_pointer(keys[i]); page_index_t begin_page_index = find_page_index(obj); // Create a filler object occupying space from 'fill_from' up to but - // excluding 'obj'. If obj directly abuts its predecessor then don't. - deposit_filler(fill_from, (uword_t)obj - fill_from); + // excluding 'obj'. + deposit_filler((char*)fill_from, (char*)obj); if (fill_from == page_base((uword_t)obj)) { adjust_gen_usage(begin_page_index); // This pinned object started a new page of pins. @@ -2355,8 +2353,8 @@ static void obliterate_nonpinned_words() * next GC. This phenomenon was especially bad if the only pinned objects * were at the start of a page, as it caused the entire rest of the page to * be unusable. :SMALLOBJ-AUTO-GC-TRIGGER from rev dfddbc8a tests this */ - uword_t page_end = obj_end_pageaddr + page_bytes_used(end_page_index); - deposit_filler(obj_end, page_end - obj_end); + deposit_filler((char*)obj_end, + (char*)obj_end_pageaddr + page_bytes_used(end_page_index)); fill_from = page_base(keys[i+1]); } } @@ -4695,6 +4693,13 @@ void gc_allocate_ptes() page_table_pages = dynamic_space_size/GENCGC_PAGE_BYTES; gc_assert(dynamic_space_size == npage_bytes(page_table_pages)); + /* Assert that a cons whose car has MOST-POSITIVE-WORD + * can not be considered a valid cons, which is to say, even though + * MOST-POSITIVE-WORD seems to satisfy is_lisp_pointer(), + * it's OK to use as a filler marker. */ + if (find_page_index((void*)(uword_t)-1) >= 0) + lose("dynamic space too large"); + /* Default nursery size to 5% of the total dynamic space size, * min 1Mb. */ bytes_consed_between_gcs = dynamic_space_size/(os_vm_size_t)20; diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index ecaa277f75..cac36ea197 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -321,11 +321,9 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state gc_assert(page_table[pg].type != PAGE_TYPE_CONS); #ifdef LISP_FEATURE_USE_CONS_REGION else if (page_table[pg].type != PAGE_TYPE_CONS) { - if (where[0] | where[1]) // "page-filler cons" is OK - // KLUDGE: allow negative bignum, but is it good/bad - // to check for a bignum widetag at where[-2] ? - // this SHOULD be: lose("cons @ %p on non-cons page", where); - gc_assert(where[0]==(uword_t)-1 && where[1]==0); + if (where[0] | where[1]) // (0 . 0) cons is OK + gc_assert(where[0]==(uword_t)-1 && + (where[1]==0 || where[1]==(uword_t)-1)); } #endif if (widetag == CODE_HEADER_WIDETAG) { From c707fd27356391538e1db133234a66b931f0ef2f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 10 May 2022 22:34:53 -0400 Subject: [PATCH 3307/4023] Remove some exotic ldb commands - "purify" is not meaningful. - I see no way that "kill" was useful if running under gdb. - "grab-sigs" is best done by modifying 'interrupt.c' to do something specific on a temporary basis when debugging. --- src/runtime/monitor.c | 60 ++----------------------------------------- 1 file changed, 2 insertions(+), 58 deletions(-) diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index e120020622..36417eeca0 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -30,7 +30,6 @@ #include "arch.h" #include "interr.h" #include "search.h" -#include "purify.h" #include "globals.h" #include "lispregs.h" #include "interrupt.h" @@ -217,9 +216,7 @@ void save_gc_crashdump(char *pathname, static cmd call_cmd, dump_cmd, print_cmd, quit_cmd, help_cmd; static cmd flush_cmd, regs_cmd, exit_cmd; static cmd print_context_cmd, pte_cmd, search_cmd; -static cmd backtrace_cmd, purify_cmd, catchers_cmd; -static cmd grab_sigs_cmd; -static cmd kill_cmd; +static cmd backtrace_cmd, catchers_cmd; static cmd threads_cmd; extern void gc_stop_the_world(), gc_start_the_world(); @@ -300,13 +297,6 @@ static struct cmd { {"d", "(an alias for dump)", dump_cmd}, {"exit", "Exit this instance of the monitor.", exit_cmd}, {"flush", "Flush all temp variables.", flush_cmd}, - /* (Classic CMU CL had a "gc" command here, which seems like a - * reasonable idea, but the code was stale (incompatible with - * gencgc) so I just flushed it. -- WHN 20000814 */ - {"grab-signals", "Set the signal handlers to call LDB.", grab_sigs_cmd}, - {"kill", "Kill ourself with signal number N (useful if running under gdb)", - kill_cmd}, - {"purify", "Purify. (Caveat purifier!)", purify_cmd}, {"print", "Print object at ADDRESS.", print_cmd}, {"p", "(an alias for print)", print_cmd}, {"pte", "Page table entry for address", pte_cmd}, @@ -456,16 +446,6 @@ pte_cmd(char **ptr) return 0; } -static int -kill_cmd(char **ptr) -{ -#ifndef LISP_FEATURE_WIN32 - int sig; - if (parse_number(ptr, &sig)) kill(getpid(), sig); -#endif - return 0; -} - static int regs_cmd(char __attribute__((unused)) **ptr) { @@ -610,13 +590,6 @@ exit_cmd(char __attribute__((unused)) **ptr) return 1; // 'done' flag } -static int -purify_cmd(char __attribute__((unused)) **ptr) -{ - purify(NIL, NIL); - return 0; -} - static void print_context(os_context_t *context) { @@ -650,12 +623,11 @@ print_context_cmd(char **ptr) printf("printing context %d\n", index); print_context(nth_interrupt_context(index, thread)); } else { - printf("There aren't that many/few contexts.\n"); printf("There are %d interrupt contexts.\n", free_ici); } } else { if (free_ici == 0) - printf("There are no interrupt contexts!\n"); + printf("There are no interrupt contexts.\n"); else { printf("There are %d interrupt contexts.\n", free_ici); printf("printing context %d\n", free_ici - 1); @@ -721,34 +693,6 @@ catchers_cmd(char __attribute__((unused)) **ptr) return 0; } -/* SIGINT handler that invokes the monitor (for when Lisp isn't up to it) */ -static void -sigint_handler(int __attribute__((unused)) signal, - siginfo_t __attribute__((unused)) *info, - void *context) -{ - extern void ldb_monitor(); - fprintf(stderr, "\nSIGINT hit at %p\n", (void*)os_context_pc(context)); - ldb_monitor(); - fprintf(stderr, "Returning to lisp (if you're lucky).\n"); -} - -static int -grab_sigs_cmd(char __attribute__((unused)) **ptr) -{ -#ifdef LISP_FEATURE_WIN32 - fprintf(stderr, "sorry no can do\n"); fflush(stderr); -#else - printf("Grabbing SIGINT.\n"); - struct sigaction sa; - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_SIGINFO; - sa.sa_sigaction = sigint_handler; - sigaction(SIGINT, &sa, 0); -#endif - return 0; -} - extern boolean gc_active_p; extern FILE *gc_activitylog_file; void From 157e64f5b4d41357775bc49f01e82f78062d1a4f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 11 May 2022 05:58:00 -0400 Subject: [PATCH 3308/4023] Streamline free_oldspace Delete detection of contiguous block boundaries. The only purpose that could have served was to visit objects in the freed block. But you can't- see cautionary note about how not to compute an object size. In light of that, I think the only way to implement visit_freed_objects() would be if forwarding headers stored the original object size. --- src/runtime/gencgc.c | 66 +++++++++++++------------------------------- 1 file changed, 19 insertions(+), 47 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 41217a323d..a20bc44eab 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2218,6 +2218,9 @@ void visit_freed_objects(char __attribute__((unused)) *start, while (where < end) { lispobj word = *where; if (forwarding_pointer_p(where)) { // live oject + /* CAUTION: This CAN NOT WORK RELIABLY. Due to gc_copy_object_resizing() + * we might compute the wrong size because we take it from the copy. + * Are there other places where we get this wrong??? I sure hope not */ lispobj* fwd_where = native_pointer(forwarding_pointer_value(where)); fprintf(stderr, "%p: -> %p\n", where, fwd_where); where += OBJECT_SIZE(*fwd_where, fwd_where); @@ -3321,59 +3324,28 @@ unprotect_oldspace(void) } } -/* Work through all the pages and free any in from_space. This - * assumes that all objects have been copied or promoted to an older - * generation. Bytes_allocated and the generation bytes_allocated - * counter are updated. The number of bytes freed is returned. */ -static uword_t -free_oldspace(void) +/* Work through all the pages and free any in from_space. + * Live non-pinned objects will have been copied to new pages. + * Pinned objects are no longer in 'from_space', as the containing + * page is now in a different generation. + * Bytes_allocated and the generation bytes_allocated + * counter are updated. */ +static void free_oldspace(void) { uword_t bytes_freed = 0; - page_index_t first_page, last_page; - - first_page = 0; - - do { - /* Find a first page for the next region of pages. */ - while ((first_page < next_free_page) - && ((page_words_used(first_page) == 0) - || (page_table[first_page].gen != from_space))) - first_page++; - - if (first_page >= next_free_page) - break; - - /* Find the last page of this region. */ - last_page = first_page; - - page_bytes_t last_page_bytes; - do { - /* Free the page. */ - last_page_bytes = page_bytes_used(last_page); - bytes_freed += last_page_bytes; - reset_page_flags(last_page); - set_page_bytes_used(last_page, 0); + page_index_t page; + for (page = 0; page < next_free_page; ++page) { + if (page_table[page].gen == from_space) { /* Should already be unprotected by unprotect_oldspace(). */ - gc_assert(page_cards_all_marked_nonsticky(last_page)); - last_page++; + gc_dcheck(page_cards_all_marked_nonsticky(last_page)); + /* Free the page. */ + bytes_freed += page_bytes_used(page); + reset_page_flags(page); + set_page_bytes_used(page, 0); } - while ((last_page < next_free_page) - && page_table[last_page].gen == from_space - && page_words_used(last_page)); - - /* 'last_page' is the exclusive upper bound on the page range starting - * at 'first'page'. We have an accurate count of the bytes in use on - * last_page but there may be intervening pages not 100% full which are - * treated as full. This can spuriously visit some (0 . 0) conses - * but is otherwise not a big deal */ - visit_freed_objects(page_address(first_page), - npage_bytes(last_page-first_page-1) + last_page_bytes); - first_page = last_page; - } while (first_page < next_free_page); - + } generations[from_space].bytes_allocated -= bytes_freed; bytes_allocated -= bytes_freed; - return bytes_freed; } /* Call 'proc' with pairs of addresses demarcating ranges in the From 1b6e69cf0f409d21c316f5138bd51f995ac60bd9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 11 May 2022 06:23:15 -0400 Subject: [PATCH 3309/4023] Revise misleading comments and delete a condition * "but not those marked pinned" is wrong because there are, by construction, no pinned pages in from_space * "lower the generation" is bogus in the abstract, because it is merely incidentally the case that SCRATCH_GENERATION has a numerically higher enum value than any usable generation. --- src/runtime/gencgc.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index a20bc44eab..5d230c7b57 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3800,7 +3800,6 @@ void NO_SANITIZE_ADDRESS NO_SANITIZE_MEMORY garbage_collect_generation(generation_index_t generation, int raise, void* approximate_stackptr) { - page_index_t i; struct thread *th; if (gencgc_verbose > 2) fprintf(stderr, "BEGIN gc_gen(%d,%d)\n", generation, raise); @@ -3862,6 +3861,7 @@ garbage_collect_generation(generation_index_t generation, int raise, * overlap in a way that all-code pinning wouldn't do the right thing if flipped. * FIXME: why would it not? More explanation needed! * Code objects should never get into the pins table in this case */ + page_index_t i; for (i = 0; i < next_free_page; i++) { if (page_table[i].gen == from_space && is_code(page_table[i].type) && page_words_used(i)) @@ -4176,17 +4176,15 @@ garbage_collect_generation(generation_index_t generation, int raise, ASSERT_REGIONS_CLOSED(); hopscotch_log_stats(&pinned_objects, "pins"); - /* Free the pages in oldspace, but not those marked pinned. */ free_oldspace(); - /* If the GC is not raising the age then lower the generation back - * to its normal generation number */ + /* If this cycle was not a promotion cycle, change SCRATCH_GENERATION back + * to its correct generation number */ struct generation* g = &generations[generation]; if (!raise) { + page_index_t i; for (i = 0; i < next_free_page; i++) - if ((page_words_used(i) != 0) - && (page_table[i].gen == SCRATCH_GENERATION)) - page_table[i].gen = generation; + if (page_table[i].gen == SCRATCH_GENERATION) page_table[i].gen = generation; gc_assert(g->bytes_allocated == 0); g->bytes_allocated = generations[SCRATCH_GENERATION].bytes_allocated; generations[SCRATCH_GENERATION].bytes_allocated = 0; From b476ebe323a0c0782f97da417ccb4d9bb83752bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Wed, 11 May 2022 12:24:47 +0100 Subject: [PATCH 3310/4023] Expect failures in all breakpoint-based tracing tests --- tests/debug.impure.lisp | 62 ++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 9e816ead85..03b278c38a 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -131,18 +131,20 @@ (lambda (f &rest stuff) (declare (ignore f stuff)))))) +(defparameter *breakpoint-tracing-expectations* + '(:fails-on (or (and :ppc (not :linux)) :arm64) + :broken-on :freebsd)) + ;;; bug 379 (with-test (:name (trace :encapsulate nil) - :fails-on (or (and :ppc (not :linux)) :arm64) - :broken-on (or :freebsd)) + . #.*breakpoint-tracing-expectations*) (let ((output (with-traced-function (trace-this :encapsulate nil) (assert (eq 'ok (trace-this)))))) (assert (search "TRACE-THIS" output)) (assert (search "returned OK" output)))) (with-test (:name (trace :encapsulate nil :recursive) - :fails-on (or (and :ppc (not :linux)) :arm64) - :broken-on (or :freebsd)) + . #.*breakpoint-tracing-expectations*) (let ((output (with-traced-function (trace-fact :encapsulate nil) (assert (= 120 (trace-fact 5)))))) (assert (search "TRACE-FACT" output)) @@ -192,7 +194,7 @@ (1 trace-fact :exit t 1) (0 trace-fact :exit t 2))))))) -(with-test (:name (trace :anonymous)) +(with-test (:name (trace :anonymous) . #.*breakpoint-tracing-expectations*) (assert (equalp (call-collecting-traces (lambda () (trace-fact 1)) @@ -252,7 +254,8 @@ (1 (method trace-gf :after (float)) :exit af) (0 (method trace-gf :around (number)) :exit 84.0))))) -(with-test (:name (trace :methods :encapsulate nil)) +(with-test (:name (trace :methods :encapsulate nil) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces (:encapsulate nil (method trace-gf :after (float)) (method trace-gf :around (number)) @@ -320,7 +323,7 @@ (multiply x (fact (1- x))))))) (fact x))) -(with-test (:name (trace :labels)) +(with-test (:name (trace :labels) . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((labels fact :in global-fact) (flet multiply :in global-fact)) (global-fact 1)) @@ -337,13 +340,15 @@ (flet ((fact (x) (global-fact x))) (fact x)))) -(with-test (:name (trace :labels :within-method)) +(with-test (:name (trace :labels :within-method) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((flet fact :in (method gfact (number)))) (gfact 3)) '((0 (flet fact :in (method gfact (number))) :enter 3) (0 (flet fact :in (method gfact (number))) :exit 6))))) -(with-test (:name (trace :labels :within-untraced-method)) +(with-test (:name (trace :labels :within-untraced-method) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((method gfact (number)) (flet fact :in (method gfact (number)))) (untrace (method gfact (number))) @@ -368,7 +373,8 @@ (funcall fn) (setf (fdefinition 'trace-foo) original)))) -(with-test (:name (trace :labels :redefined)) +(with-test (:name (trace :labels :redefined) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((flet body :in trace-foo)) (trace-foo) (call-with-trace-foo-redefined 'trace-foo)) @@ -396,7 +402,8 @@ (flet ((body () 'original-foo)) (body)))))) -(with-test (:name (trace :labels :redefined-method)) +(with-test (:name (trace :labels :redefined-method) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((flet body :in (method trace-foo-gf ()))) (trace-foo-gf) (call-with-trace-foo-gf-redefined 'trace-foo-gf)) @@ -412,13 +419,15 @@ (flet ((body () 42)) (body))) -(with-test (:name (trace :compiler-macro)) +(with-test (:name (trace :compiler-macro) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((compiler-macro fn-with-cmac)) (compile nil '(lambda () (fn-with-cmac 0)))) '((0 (compiler-macro fn-with-cmac) :enter (fn-with-cmac 0) "unused argument") (0 (compiler-macro fn-with-cmac) :exit 42))))) -(with-test (:name (trace :flet :within-compiler-macro)) +(with-test (:name (trace :flet :within-compiler-macro) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((flet body :in (compiler-macro fn-with-cmac))) (compile nil '(lambda () (fn-with-cmac 0)))) '((0 (flet body :in (compiler-macro fn-with-cmac)) :enter) @@ -436,7 +445,8 @@ (flet ((body () 42)) (body)))))) -(with-test (:name (trace :compiler-macro :redefined)) +(with-test (:name (trace :compiler-macro :redefined) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((compiler-macro fn-with-cmac) (flet body :in (compiler-macro fn-with-cmac))) (compile nil '(lambda () (fn-with-cmac 0))) @@ -487,7 +497,8 @@ (with-test (:name (trace :wherein :encapsulate t)) (test-trace-inner-function :encapsulate t)) -(with-test (:name (trace :wherein :encapsulate nil)) +(with-test (:name (trace :wherein :encapsulate nil) + . #.*breakpoint-tracing-expectations*) (test-trace-inner-function :encapsulate nil)) (defun test-trace-fact-wherein (&key encapsulate) @@ -500,20 +511,23 @@ (with-test (:name (trace :wherein :recursive :encapsulate t)) (test-trace-fact-wherein :encapsulate t)) -(with-test (:name (trace :wherein :recursive :encapsulate nil)) +(with-test (:name (trace :wherein :recursive :encapsulate nil) + . #.*breakpoint-tracing-expectations*) (test-trace-fact-wherein :encapsulate nil)) (defmacro macro-fact (x) (labels ((fact (x) (if (zerop x) 1 (* x (fact (1- x)))))) (fact x))) -(with-test (:name (trace :macro)) +(with-test (:name (trace :macro) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces (macro-fact) (macroexpand-1 '(macro-fact 3))) '((0 macro-fact :enter (macro-fact 3) "unused argument") (0 macro-fact :exit 6))))) -(with-test (:name (trace :labels :within-macro)) +(with-test (:name (trace :labels :within-macro) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((labels fact :in macro-fact)) (macroexpand-1 '(macro-fact 0))) '((0 (labels fact :in macro-fact) :enter 0) @@ -530,7 +544,8 @@ (labels ((fact (x) (if (zerop x) 1 (* x (fact (1- x)))))) (fact x))))))) -(with-test (:name (trace :macro :redefined)) +(with-test (:name (trace :macro :redefined) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces (macro-fact (labels fact :in macro-fact)) (macroexpand-1 '(macro-fact 0)) @@ -550,7 +565,8 @@ (+ o n x))) (cas (body) old new))) -(with-test (:name (trace :cas)) +(with-test (:name (trace :cas) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((cas trace-cas) (flet (cas body) :in (cas trace-cas))) (cas (trace-cas 1) 21 20)) @@ -565,7 +581,8 @@ (+ o n x))) (cas (body) old new))) -(with-test (:name (trace :cas :generic)) +(with-test (:name (trace :cas :generic) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((method (cas trace-cas-gf) (t t t)) (flet (cas body) :in (method (cas trace-cas-gf) (t t t)))) (cas (trace-cas-gf 1) 21 20)) @@ -580,7 +597,8 @@ (+ value x))) (setf (body) value))) -(with-test (:name (trace :setf)) +(with-test (:name (trace :setf) + . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((setf trace-setf) (flet (setf body) :in (setf trace-setf))) (setf (trace-setf 11) 31)) From 2a11594006c8dc4bec8e0aaefb04f1e5fb943e4a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 11 May 2022 20:37:08 +0300 Subject: [PATCH 3311/4023] Derive the type of (reduce '+ ...) E.g. (reduce '+ x :key #'length) is at least UNSIGNED-BYTE. Or (reduce '+ fixnum-vector) is INTEGER, and not NUMBER. --- src/code/type.lisp | 19 ++++++++--- src/compiler/seqtran.lisp | 71 ++++++++++++++++++++++++++++++++++----- 2 files changed, 78 insertions(+), 12 deletions(-) diff --git a/src/code/type.lisp b/src/code/type.lisp index 86a1126278..aa83c7633c 100644 --- a/src/code/type.lisp +++ b/src/code/type.lisp @@ -3427,7 +3427,8 @@ used for a COMPLEX component.~:@>" ;;; If either argument is not a NUMERIC-TYPE, then return NUMBER. This ;;; is useful mainly for allowing types that are technically numbers, ;;; but not a NUMERIC-TYPE. -(defun numeric-contagion (type1 type2) +(defun numeric-contagion (type1 type2 &key (rational t) + unsigned) (if (and (numeric-type-p type1) (numeric-type-p type2)) (let ((class1 (numeric-type-class type1)) (class2 (numeric-type-class type2)) @@ -3462,9 +3463,19 @@ used for a COMPLEX component.~:@>" (t :complex)))) ((eq class2 'float) (numeric-contagion type2 type1)) ((and (eq complexp1 :real) (eq complexp2 :real)) - (make-numeric-type - :class (and class1 class2 'rational) - :complexp :real)) + (if (or rational + (or (neq class1 'integer) + (neq class2 'integer))) + (make-numeric-type + :class (and class1 class2 'rational) + :complexp :real) + (make-numeric-type + :class 'integer + :complexp :real + :low (and unsigned + (typep (numeric-type-low type1) 'unsigned-byte) + (typep (numeric-type-low type2) 'unsigned-byte) + 0)))) (t (specifier-type 'number)))) (specifier-type 'number))) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 04ea4d35d0..f60a49f129 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -2786,15 +2786,70 @@ (t (give-up-ir1-transform)))) +(defun vector-type-length (type) + (catch 'give-up-ir1-transform + (return-from + vector-type-length + (let* ((dim (array-type-dimensions-or-give-up type))) + (when (and (typep dim '(cons integer null)) + (not (conservative-array-type-complexp type))) + (first dim))))) + nil) + (defoptimizer (reduce derive-type) ((fun sequence &key initial-value + key &allow-other-keys)) - (declare (ignore sequence)) - (let ((fun-type (lvar-type fun)) - result) - (when (fun-type-p fun-type) - (setf result (single-value-type (fun-type-returns fun-type))) - (if initial-value - (type-union result (lvar-type initial-value)) - result)))) + (let (result) + (multiple-value-bind (fun-type name) (lvar-fun-type fun) + (when (fun-type-p fun-type) + (let ((initial-value-type (and initial-value + (lvar-type initial-value)))) + ;; Calling the type deriver would be more universal, but + ;; type derivers expect a combination, but even then there's + ;; not a lot of standard functions which are usually used + ;; with REDUCE and which benefit from improved type + ;; derivation. + (when (eq name '+) + (let* ((sequence-type (lvar-type sequence)) + (element-type + (cond ((and key + (multiple-value-bind (key-type name) (lvar-fun-type key) + (cond ((eq name 'identity) + nil) + ((fun-type-p key-type) + (single-value-type (fun-type-returns key-type))) + (t + *universal-type*))))) + ((csubtypep sequence-type (specifier-type 'array)) + (array-type-upgraded-element-type sequence-type))))) + + (when (and element-type + (neq element-type *wild-type*)) + (let* ((non-empty (typep (vector-type-length sequence-type) '(integer 1))) + (identity-p (and (not initial-value) + (not non-empty)))) + (labels ((try (type) + (let ((type (specifier-type type))) + (when (csubtypep element-type type) + (setf result + (cond (identity-p + (type-union type + (specifier-type '(eql 0)))) + (initial-value + (let ((contagion (numeric-contagion type initial-value-type + :rational nil + :unsigned t))) + (if non-empty + contagion + (type-union contagion initial-value-type)))) + (t + type))))))) + (some #'try '(double-float single-float float unsigned-byte integer rational real))))))) + (unless result + (setf result (single-value-type (fun-type-returns fun-type))) + (if initial-value-type + (type-union result initial-value-type) + result))))) + result)) From 3da5b8d1ff6889a653561ab59d6869f1fc1632a7 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 11 May 2022 21:16:13 +0300 Subject: [PATCH 3312/4023] Remove an unused function. --- src/compiler/knownfun.lisp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index 7c0bc8304c..fd47f6764d 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -305,15 +305,6 @@ (let ((lvar (nth n (combination-args call)))) (when lvar (lvar-type lvar))))) -;;; Derive the result type according to the float contagion rules, but -;;; always return a float. This is used for irrational functions that -;;; preserve realness of their arguments. -(defun result-type-float-contagion (call) - (declare (type combination call)) - (reduce #'numeric-contagion (combination-args call) - :key #'lvar-type - :initial-value (specifier-type 'single-float))) - (defun simplify-list-type (type &key preserve-dimensions) ;; Preserve all the list types without dragging ;; (cons (eql 10)) stuff in. From 95189313fd88aaed8c0f4f464fd97c4ada5d435d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 11 May 2022 16:08:51 -0400 Subject: [PATCH 3313/4023] Remark on some flawed but unused code --- src/runtime/gc-common.c | 31 ++++++++++++++++--------------- src/runtime/immobile-space.c | 1 + 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index d22ca96164..c1325e4052 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1958,31 +1958,32 @@ lispobj simple_fun_name_from_pc(char *pc, lispobj** pfun) /* Scan an area looking for an object which encloses the given pointer. * Return the object start on success, or NULL on failure. */ lispobj * -gc_search_space3(void *pointer, lispobj *start, void *limit) +gc_search_space3(void *pointer, lispobj * const start, void *limit) { if (pointer < (void*)start || pointer >= limit) return NULL; size_t count; + lispobj* where = start; + #if SEARCH_SPACE_FOLLOWS_FORWARDING_POINTERS /* CAUTION: this code is _significantly_ slower than the production version - due to the extra checks for forwarding. Only use it if debugging */ - for ( ; (void*)start < limit ; start += count) { - lispobj *forwarded_start; - if (forwarding_pointer_p(start)) - forwarded_start = native_pointer(forwarding_pointer_value(start)); - else - forwarded_start = start; - lispobj thing = *forwarded_start; - count = OBJECT_SIZE(thing, forwarded_start); + due to the extra checks for forwarding. + Also it is BROKEN. DO NOT ENABLE THE #define UNLESS/UNTIL FIXED. */ + for ( ; (void*)where < limit ; where += count) { + lispobj *copy = where; + if (forwarding_pointer_p(where)) + copy = native_pointer(forwarding_pointer_value(where)); + // BUG: the size of a forwarded object may exceed the size of the original + // due to the addition of a stable hash slot. + count = OBJECT_SIZE(*copy, copy); /* Check whether the pointer is within this object. */ - if (pointer < (void*)(start+count)) return start; + if (pointer < (void*)(where+count)) return where; } #else - for ( ; (void*)start < limit ; start += count) { - lispobj thing = *start; - count = OBJECT_SIZE(thing, start); + for ( ; (void*)where < limit ; where += count) { + count = OBJECT_SIZE(*where, where); /* Check whether the pointer is within this object. */ - if (pointer < (void*)(start+count)) return start; + if (pointer < (void*)(where+count)) return where; } #endif return NULL; diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 0a00833be0..f883ab226a 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -2137,6 +2137,7 @@ static void defrag_immobile_space(boolean verbose) lispobj* fwdobj = forwarding_pointer_p(obj) ? tempspace_addr(native_pointer(forwarding_pointer_value(obj))) : obj; + // Sizing a forwarded object is OK here - code size can't change when copied. int size = sizetab[widetag_of(fwdobj)](fwdobj); // Supplying symbol_kind as 0 is fine - symbols can't exist in code space. if (executable_object_p(fwdobj)) From ff12e243751bad6756023cee4a987b5afc506446 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 11 May 2022 16:40:20 -0400 Subject: [PATCH 3314/4023] Remove size_immediate That function was really "size_cons" which should have returned a constant value of 2 instead of 1. I think in years past it was required to return 1 because reasons. Rather than change its behavior, we just don't need it since OBJECT_SIZE prechecks for conses anyway. But we can actually do that test more efficiently by storing a sentinel value of 0 in sizetab[]. If the sizer is 0, then the object is a cons, otherwise call the sizer. I intend to rename OBJECT_SIZE as it is no longer a preprocessor macro, but that's a search-and-replace which touches a lot of lines, and I'd like this change to pass muster independently of that. --- src/compiler/generic/late-objdef.lisp | 4 +++- src/runtime/gc-common.c | 6 ------ src/runtime/gc-internal.h | 7 +++++-- src/runtime/immobile-space.c | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/compiler/generic/late-objdef.lisp b/src/compiler/generic/late-objdef.lisp index 4060c6bd54..ef3cb0edb6 100644 --- a/src/compiler/generic/late-objdef.lisp +++ b/src/compiler/generic/late-objdef.lisp @@ -243,10 +243,12 @@ static inline lispobj compute_lispobj(lispobj* base_addr) { = {~{~% (void(*)(lispobj*,lispobj))~A~^,~}~%};~%" (length ptrtab) ptrtab) (write-table "static lispobj (*transother[64])(lispobj object)" "trans_" transtab) - (format stream "#define size_pointer size_immediate~%") + (format stream "#define size_pointer (sizerfn)0~%") + (format stream "#define size_immediate (sizerfn)0~%") (format stream "#define size_unboxed size_boxed~%") (write-table "sword_t (*sizetab[256])(lispobj *where)" "size_" sizetab) + (format stream "#undef size_immediate~%") (format stream "#undef size_pointer~%") (format stream "#undef size_unboxed~%"))) (format stream "#endif~%")) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index c1325e4052..2565cb6faf 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -758,12 +758,6 @@ scav_immediate(lispobj *where, lispobj object) return 2; } -static sword_t -size_immediate(lispobj __attribute__((unused)) *where) -{ - return 1; -} - //// General boxed object scav/trans/size functions #define DEF_SCAV_BOXED(suffix, sizer) \ diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index 057fa9e240..b67529494b 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -105,8 +105,11 @@ static inline int vector_is_weak_not_hashing_p(unsigned int header) { v->header ^= WEAK_VECTOR_VISITED_BIT extern sword_t (*sizetab[256])(lispobj *where); -#define OBJECT_SIZE(header,where) \ - (is_header(header)?sizetab[header_widetag(header)](where):CONS_SIZE) +typedef sword_t (*sizerfn)(lispobj*); +static inline sword_t OBJECT_SIZE(uword_t header, lispobj* where) { + sizerfn f = sizetab[header & WIDETAG_MASK]; + return f ? f(where) : CONS_SIZE; +} lispobj *gc_search_space3(void *pointer, lispobj *start, void *limit); static inline lispobj *gc_search_space(lispobj *start, void *pointer) { diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index f883ab226a..9846b9c8fb 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1299,7 +1299,7 @@ void prepare_immobile_space_for_final_gc() if (mask & 1<<PSEUDO_STATIC_GENERATION) { lispobj* obj = (lispobj*)page_base; lispobj* limit = (lispobj*)((uword_t)obj + IMMOBILE_CARD_BYTES); - for ( ; obj < limit ; obj += sizetab[widetag_of(obj)](obj) ) + for ( ; obj < limit ; obj += OBJECT_SIZE(*obj, obj) ) if (other_immediate_lowtag_p(*obj) && immobile_obj_gen_bits(obj) == PSEUDO_STATIC_GENERATION) assign_generation(obj, HIGHEST_NORMAL_GENERATION); @@ -1344,7 +1344,7 @@ void prepare_immobile_space_for_save(boolean verbose) while (obj < limit) { if (other_immediate_lowtag_p(*obj)) assign_generation(obj, PSEUDO_STATIC_GENERATION); - obj += sizetab[widetag_of(obj)](obj); + obj += OBJECT_SIZE(*obj, obj); } obj = (lispobj*)VARYOBJ_SPACE_START; From dbe702a5ddc03cb1ccb310253292970b25cf23b9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 11 May 2022 19:32:58 -0400 Subject: [PATCH 3315/4023] Use careful sizer to fix crash in gc-search.impure --- src/runtime/immobile-space.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 9846b9c8fb..29056e18d5 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1433,7 +1433,7 @@ search_immobile_space(void *pointer) if (fixedobj_tempspace.start) // defragmenting end = (char*)obj + spacing; else - end = (char*)(obj + sizetab[widetag_of(obj)](obj)); + end = (char*)(obj + OBJECT_SIZE(*obj,obj)); if ((char*)pointer < end) return obj; } else { return gc_search_space((lispobj*)page_base, pointer); From bd6568d356a3a786fcde46854c08bd6017fd8509 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 10 May 2022 14:45:45 -0700 Subject: [PATCH 3316/4023] Restore documentation for NAMED-LAMBDA. It got swallowed sometime 2 decades ago. --- src/compiler/ir1-translators.lisp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 9a48c21799..497fd75080 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -542,7 +542,30 @@ Return VALUE without evaluating it." (when context (list :in context)))) -;;;; FUNCTION and NAMED-LAMBDA +;;;; FUNCTION and NAMED-LAMBgDA + +;;; `(NAMED-LAMBDA ,NAME ,@REST) is like `(FUNCTION (LAMBDA ,@REST)), +;;; except that the value of NAME is passed to the compiler for use in +;;; creation of debug information for the resulting function. +;;; +;;; NAME can be a legal function name or some arbitrary other thing. +;;; +;;; If NAME is a legal function name, then the caller should be +;;; planning to set (FDEFINITION NAME) to the created function. +;;; (Otherwise the debug names will be inconsistent and thus +;;; unnecessarily confusing.) +;;; +;;; Arbitrary other things are appropriate for naming things which are +;;; not the FDEFINITION of NAME. E.g. +;;; NAME = (:FLET FOO BAR) +;;; for the FLET function in +;;; (DEFUN BAR (X) +;;; (FLET ((FOO (Y) (+ X Y))) +;;; FOO)) +;;; or +;;; NAME = (:METHOD PRINT-OBJECT :AROUND (STARSHIP T)) +;;; for the function used to implement +;;; (DEFMETHOD PRINT-OBJECT :AROUND ((SS STARSHIP) STREAM) ...). (defun name-lambdalike (thing) (case (car thing) ((named-lambda) From c6db3f142ef4a39a0d66d9466aacf5c697e886b4 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 11 May 2022 00:38:45 -0700 Subject: [PATCH 3317/4023] Rename MAYBE-INLINE-SYNTACTIC-CLOSURE and remove declarations. The declarations are pointless. MAYBE doesn't mean anything. --- src/code/macros.lisp | 2 +- src/cold/exports.lisp | 2 +- src/compiler/ir1tran-lambda.lisp | 6 +----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 54ec2c6779..bd0f2e7127 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -131,7 +131,7 @@ tree structure resulting from the evaluation of EXPRESSION." ;; a full inline expansion depending on the lexical environment. ((save-inline-expansion-p name) ;; we want to attempt to inline, so complain if we can't - (cond ((sb-c:maybe-inline-syntactic-closure lambda env)) + (cond ((sb-c:inline-syntactic-closure-lambda lambda env)) (t (#+sb-xc-host warn #-sb-xc-host sb-c:maybe-compiler-notify diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 727a9673d9..0be97a7777 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1355,7 +1355,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "MAKE-REPRESENTATION-TN" "MAKE-RESTRICTED-TN" "MAKE-STACK-POINTER-TN" "MAKE-TN-REF" "MAKE-UNWIND-BLOCK" "MAKE-WIRED-TN" "MAYBE-COMPILER-NOTIFY" - "MAYBE-INLINE-SYNTACTIC-CLOSURE" + "INLINE-SYNTACTIC-CLOSURE-LAMBDA" "MSAN-UNPOISON" "MOVABLE" "MOVE" "MULTIPLE-CALL" "MULTIPLE-CALL-LOCAL" "MULTIPLE-CALL-NAMED" diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 0ccefcfec1..f1790d0841 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -1063,8 +1063,6 @@ (allow (when (ll-kwds-allowp llks) '(&allow-other-keys)))) (careful-specifier-type `(function (,@reqs ,@opts ,@rest ,@keys ,@allow) *)))))) -(declaim (start-block maybe-inline-syntactic-closure)) - ;;; Return a lambda form that has been "closed" with respect to ;;; LEXENV, returning a LAMBDA-WITH-LEXENV if there are interesting ;;; declarations. To handle local macros, rather than closing over @@ -1072,7 +1070,7 @@ ;;; LAMBDA, so that nothing in the syntactic environment is needed in ;;; the expansion. If there is something too complex in the lexical ;;; environment (like a lexical variable), then we return NIL. -(defun maybe-inline-syntactic-closure (lambda lexenv) +(defun inline-syntactic-closure-lambda (lambda lexenv) (declare (type list lambda) (type lexenv-designator lexenv)) (aver (eql (first lambda) 'lambda)) (typecase lexenv @@ -1125,8 +1123,6 @@ #+sb-fasteval (null lambda))) ; trivial case. Never occurs in the compiler. -(declaim (end-block)) - (declaim (start-block ir1-convert-inline-lambda)) ;;; Convert the forms produced by RECONSTRUCT-LEXENV to LEXENV From 61565fb10a269e2455d4cfed65f7a035ae1183e4 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 11 May 2022 11:42:18 -0700 Subject: [PATCH 3318/4023] Make block compilation of top-level closures work. Broken since at least SBCL prehistory, since we removed some of the machinery that lets this stuff work correctly. Now we do essentially what cmu cl does, except that we improve upon that by allowing lexical environments with FLET. Really instead of caring about the lexical environment we should check that the runtime environments coming from environment analysis are compatible, to optimize this to the fullest extent. But at least we can now block compile and correctly execute the code at all. Also, in IR1-convert-inline-expansion, we used to test for EXPANSION. This was wrong ever since we stopped passing the expansion from INLINE-SYNTACTIC-CLOSURE-LAMBDA through, because the (WHEN EXPANSION ...) was really just testing for a hairy lexical environment. Use the new SIMPLE-LEXICAL-ENVIRONMENT-P which ignores local functions instead. Scrubbing forward references actually has semantics for block compilation now, so move that stuff out of the proclamation machinery and back into ir1tran. --- NEWS | 1 + src/code/macros.lisp | 4 +- src/compiler/dfo.lisp | 12 ++-- src/compiler/entry.lisp | 2 +- src/compiler/ir1tran-lambda.lisp | 36 +++++++++-- src/compiler/proclaim.lisp | 13 +--- tests/block-compile.impure.lisp | 103 +++++++++++++++++++++++++++++++ 7 files changed, 144 insertions(+), 27 deletions(-) diff --git a/NEWS b/NEWS index cb40775ee3..31bf1bd594 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ changes relative to sbcl-2.2.4: non-local exits. * bug fix: ftype proclamations now take effect immediately during block compilation. + * bug fix: block compilation of top-level closures now work. changes in sbcl-2.2.4 relative to sbcl-2.2.3: * enhancement: better constraint propagation in the compiler. Specifically, diff --git a/src/code/macros.lisp b/src/code/macros.lisp index bd0f2e7127..238ea6e597 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -171,8 +171,8 @@ tree structure resulting from the evaluation of EXPRESSION." ',name)))))))) ;;; This is one of the major places where the semantics of block -;;; compilation is handled. Substitution for global names is totally -;;; inhibited if (block-compile *compilation*) is NIL. And if +;;; compilation is handled. Substitution for global names is totally +;;; inhibited if (block-compile *compilation*) is NIL. And if ;;; (block-compile *compilation*) is true and entry points are ;;; specified, then we don't install global definitions for non-entry ;;; functions (effectively turning them into local lexical functions.) diff --git a/src/compiler/dfo.lisp b/src/compiler/dfo.lisp index 97ee5da0ac..1461edb36c 100644 --- a/src/compiler/dfo.lisp +++ b/src/compiler/dfo.lisp @@ -303,9 +303,8 @@ ;;; resulting components. Components with a :TOPLEVEL lambda, but no ;;; normal XEPs or potential non-local exits are marked as :TOPLEVEL. ;;; If there is a :TOPLEVEL lambda, and also a normal XEP, then we -;;; treat the component as normal, but also return such components in -;;; a list as the third value. Components with no entry of any sort -;;; are deleted. +;;; treat the component as normal. Components with no entry of any +;;; sort are deleted. (defun separate-toplevelish-components (components) (declare (list components)) (collect ((non-top) @@ -344,10 +343,9 @@ (delete-component component)))))) (values (non-top) (top)))) -;;; Given a list of top level lambdas, return -;;; (VALUES NONTOP-COMPONENTS TOP-COMPONENTS): -;;; NONTOP-COMPONENTS = non-top-level-ish COMPONENTs; -;;; TOP-COMPONENTS = top-level-ish COMPONENTs; +;;; Given a list of top level lambdas, return two lists of components +;;; representing the actual component division. The first value is the +;;; non-top-level components, and the second is the top-level ones. ;;; ;;; We assign the DFO for each component, and delete any unreachable ;;; blocks. We assume that the FLAGS have already been cleared. diff --git a/src/compiler/entry.lisp b/src/compiler/entry.lisp index 3e47e576a6..b0784c2d92 100644 --- a/src/compiler/entry.lisp +++ b/src/compiler/entry.lisp @@ -14,7 +14,7 @@ (in-package "SB-C") ;;; This phase runs before IR2 conversion, initializing each XEP's -;;; ENTRY-INFO structure. If there was a forward reference to a function, +;;; ENTRY-INFO structure. If there was a forward reference to a function, ;;; then the ENTRY-INFO will already exist, but will be uninitialized. (defun entry-analyze (component) (let ((2comp (component-info component))) diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index f1790d0841..fce0aa4168 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -996,7 +996,16 @@ ((named-lambda) (let* ((name (cadr thing)) (lambda-expression `(lambda ,@(cddr thing))) - (*inline-expansions* (list name 1 *inline-expansions*))) + (*inline-expansions* (list name 1 *inline-expansions*)) + (simple-lexenv-p (simple-lexical-environment-p *lexenv*))) + ;; Discard any forward references to this function unless we + ;; are block compiling and the lexical environment doesn't + ;; contain any hair. If the lexical environment is too hairy, then we only + ;; install the definition during the processing of this NAMED-LAMBDA, + ;; ensuring that the function cannot be called outside of the correct + ;; environment. + (unless (and (block-compile *compilation*) simple-lexenv-p) + (remhash name (free-funs *ir1-namespace*))) (if (and name (legal-fun-name-p name)) (let ((defined-fun-res (get-defined-fun name (second lambda-expression))) (res (ir1-convert-lambda lambda-expression @@ -1008,7 +1017,11 @@ ;; FIXME: Should non-entry block compiled defuns have ;; this propagate? (assert-global-function-definition-type name res) - (push res (defined-fun-functionals defined-fun-res)) + ;; If in a simple environment, then we can allow + ;; backward references to this function from following + ;; top-level forms. + (when simple-lexenv-p + (push res (defined-fun-functionals defined-fun-res))) (unless (or (eq (defined-fun-inlinep defined-fun-res) 'notinline) ;; Don't treat recursive stubs like CAR as self-calls @@ -1272,6 +1285,18 @@ "previous declaration" "previous definition")))) +;;; The lexical environment is hairy if it has stuff like lexical +;;; variables, blocks, or tags that are not load-time constants. Local +;;; functions and macros are OK, since we are worried about outside +;;; calls. Macros get expanded, and local functions are load-time +;;; constants. +(defun simple-lexical-environment-p (lexenv) + (and (null (lexenv-blocks lexenv)) + (null (lexenv-tags lexenv)) + (every (lambda (entry) + (consp (cdr entry))) + (lexenv-vars lexenv)))) + ;;; Used for global inline expansion. Earlier something like this was ;;; used by %DEFUN too. FIXME: And now it's probably worth rethinking ;;; whether this function is a good idea at all. @@ -1318,9 +1343,10 @@ (fun-info-templates info) (fun-info-ir2-convert info)))) (substitute-leaf fun var) - ;; If in a simple environment, then we can allow backward references - ;; to this function from following top-level forms. - (when expansion + ;; If in a simple environment, then we can allow backward + ;; references to this function from following top-level + ;; forms. + (when (simple-lexical-environment-p *lexenv*) (push fun (defined-fun-functionals var)))) fun)) diff --git a/src/compiler/proclaim.lisp b/src/compiler/proclaim.lisp index 8949805f7f..cb9b772c0b 100644 --- a/src/compiler/proclaim.lisp +++ b/src/compiler/proclaim.lisp @@ -134,7 +134,7 @@ (assert-symbol-home-package-unlocked name "proclaiming ~S as a function"))) (let ((kind (info :function :kind name))) - ;; scrubbing old data I: possible collision with a macro + ;; scrubbing old data: possible collision with a macro ;; There's a silly little problem with fun names that are not ANSI-legal names, ;; e.g. (CAS mumble). We can't ask the host whether that is FBOUNDP, ;; because it would rightly complain. So, just assume that it is not FBOUNDP. @@ -153,17 +153,6 @@ (unless (pcl-methodfn-name-p name) (setf (info :function :kind name) :function)))))) - ;; scrubbing old data II: dangling forward references - ;; - ;; (This could happen if someone executes PROCLAIM FTYPE at - ;; macroexpansion time, which is bad style, or at compile time, e.g. - ;; in EVAL-WHEN (:COMPILE) inside something like DEFSTRUCT, in which - ;; case it's reasonable style. Either way, NAME is no longer a free - ;; function.) - (when (boundp '*ir1-namespace*) ; when compiling - (unless (block-compile *compilation*) - (remhash name (free-funs *ir1-namespace*)))) - (values)) ;;; Make NAME no longer be a function name: clear everything back to diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index af79477461..451680959b 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -153,3 +153,106 @@ :load t) (assert (ctype= (caddr (sb-kernel::%simple-fun-type (fdefinition 'foo1))) '(values integer &optional)))) + +(with-test (:name :block-compile-top-level-closures) + (ctu:file-compile + `(;; test forward reference + (let ((y 0)) + (defun foo2 (x) + (+ (bar2 x) (incf y)))) + + (let ((y 8)) + (defun bar2 (x) + (+ (incf y) (baz2 (+ 3 x))))) + + ;; test backward reference + (defun baz2 (x) + (if (zerop x) + (foo2 x) + x))) + :block-compile t + :load t) + ;; Make sure BAZ2 and BAR2 get a component together. FOO2 should not + ;; share a component with anyone, since it doesn't local call anyone + ;; with a compatible environment. + (assert (and (eq (sb-kernel::fun-code-header #'baz2) + (sb-kernel::fun-code-header (sb-kernel::%closure-fun #'bar2))) + (not (eq (sb-kernel::fun-code-header #'baz2) + (sb-kernel::fun-code-header (sb-kernel::%closure-fun #'foo2)))))) + (assert (= (baz2 2) 2)) + ;; Test calling the closures behave as expected. + (assert (= (baz2 0) 13)) + (assert (= (baz2 0) 15)) + (assert (= (baz2 0) 17)) + (assert (= (baz2 0) 19))) + +;;; FLET should pose no problem. +(with-test (:name :block-compile-top-level-closures.flet) + (ctu:file-compile + `(;; test forward reference + (flet ((blargh (x) + (+ x x))) + (defun boo (x) + (+ (blargh x) (blargh x)))) + (defun zoo (x) + (boo x))) + :block-compile t + :load t) + ;; Make sure the defuns all get compiled into the same code + ;; component. + (assert (eq (sb-kernel::fun-code-header #'boo) + (sb-kernel::fun-code-header #'zoo))) + (assert (null (ctu:find-named-callees #'zoo))) + (assert (= (zoo 3) 12))) + +(with-test (:name :block-compile-top-level-closures.self-call) + (ctu:file-compile + `((let ((y 9)) + (defun self-call (x) + (if (zerop x) + y + (+ (decf y) (self-call (1- x))))))) + :block-compile t + :load t) + ;; Test that we can call ourselves. + (assert (= (self-call 9) 36))) + +(with-test (:name :block-compile-top-level-closures.self-call.local-calls + :fails-on :sbcl) + ;; Test that we can local call ourselves in the same environment despite + ;; being a top level closure. (Not implemented yet.) + (assert (not (member #'self-call (ctu:find-named-callees #'self-call))))) + +(with-test (:name :block-compile-top-level-closures.same-environment) + (ctu:file-compile + `(;; test forward reference + (let ((y 0)) + (defun foo3 (x) + (+ (bar2 x) (incf y))) + + (defun bar3 (x) + (+ (incf y) (baz2 (+ 3 x)))) + + ;; test backward reference + (defun baz3 (x) + (if (zerop x) + (foo2 x) + x)))) + :block-compile t + :load t) + ;; Test that calls in the same environment work. + (assert (= (baz3 0) 21)) + (assert (= (baz3 0) 23)) + (assert (= (baz3 0) 25)) + (assert (= (baz3 0) 27))) + +(with-test (:name :block-compile-top-level-closures.same-environment.local-calls + :fails-on :sbcl) + ;; FOO3, BAR3, and BAZ3 are all in the same lexical environment, so + ;; therefore have compatible runtime environments. Thus they should + ;; be able to all local call each other. (Not implemented yet.) + (assert (and (eq (sb-kernel::fun-code-header (sb-kernel::%closure-fun #'baz3)) + (sb-kernel::fun-code-header (sb-kernel::%closure-fun #'bar3))) + (eq (sb-kernel::fun-code-header (sb-kernel::%closure-fun #'baz3)) + (sb-kernel::fun-code-header (sb-kernel::%closure-fun #'foo3))))) + (assert (null (ctu:find-named-callees #'baz3)))) From 380656eed3b20902c5c528603249f259c576e594 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 11 May 2022 11:49:37 -0700 Subject: [PATCH 3319/4023] Only add closure vars to LAMBDA-CALLS-OR-CLOSES. This keeps the slot name more honest and make FIND-INITIAL-DFO do marginally less work down the line. --- src/compiler/ir1-translators.lisp | 2 +- src/compiler/ir1tran.lisp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 497fd75080..027420c552 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -1203,7 +1203,7 @@ care." (compiler-error "~S is a constant and thus can't be set." name)) (when (lambda-var-p leaf) (let ((home-lambda (ctran-home-lambda-or-null start))) - (when home-lambda + (when (and home-lambda (neq (lambda-var-home leaf) home-lambda)) (sset-adjoin leaf (lambda-calls-or-closes home-lambda)))) (when (lambda-var-ignorep leaf) ;; ANSI's definition of "Declaration IGNORE, IGNORABLE" diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 237648e039..f1304b8139 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -712,7 +712,7 @@ (cond ((lambda-var-p var) (let ((home (ctran-home-lambda-or-null start))) - (when home + (when (and home (neq (lambda-var-home var) home)) (sset-adjoin var (lambda-calls-or-closes home)))) (when (lambda-var-ignorep var) ;; (ANSI's specification for the IGNORE declaration requires From 18197b601d6314665f5ced6c259332f8e6bc4b4d Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Thu, 12 May 2022 01:19:36 -0700 Subject: [PATCH 3320/4023] Make FIND-INITIAL-DFO compute the set of initial components ASAP. Since top-level lambdas can get moved into different components in the body of the DOLIST through DFO walking, it was possible that we weren't iterating through the actual initial components, because we'd get some new component that had taken in a top level lambda while iterating through. This indeed happened when block compiling top level closures containing non-call references to other functions. I looked at the what the CMU CL code did and it seems like this was an oversight -- CMU CL breaks on the block compilation tests added in this change. Through some software archaelogy it also seems like this "modification while iterating" was worked around a bit. I can't think of any other reason for doing this other than to try to avoid consing an intermediate list. By correctly fixing this issue by iterating over the initial components computed in an intermediate list, we simplify the code substatially (perhaps now even avoiding pointless repeated :DELETED component walking) and AVER that indeed we are grovelling over initial components. Now block compilation of some more non-trivial DFO call graph stuff works, and we test that we can grovel simple fun references in closures and vice versa and resolve them with early binding when possible (as well as shoving what we can into one code component). --- src/compiler/dfo.lisp | 65 ++++++++++++++------------------- tests/block-compile.impure.lisp | 46 +++++++++++++++++++++++ 2 files changed, 74 insertions(+), 37 deletions(-) diff --git a/src/compiler/dfo.lisp b/src/compiler/dfo.lisp index 1461edb36c..92a573524a 100644 --- a/src/compiler/dfo.lisp +++ b/src/compiler/dfo.lisp @@ -349,48 +349,39 @@ ;;; ;;; We assign the DFO for each component, and delete any unreachable ;;; blocks. We assume that the FLAGS have already been cleared. -(defun find-initial-dfo (toplevel-lambdas) - (declare (list toplevel-lambdas)) +;;; +;;; We iterate over the lambdas in each initial component, trying +;;; to put each function in its own component, but joining it to +;;; an existing component if we find that there are references +;;; between them. Any code that is left in an initial component +;;; must be unreachable, so we can delete it. Stray links to the +;;; initial component tail (due to NIL function terminated blocks) +;;; are moved to the appropriate new component tail. +(defun find-initial-dfo (top-level-lambdas) + (declare (list top-level-lambdas)) (collect ((components)) - ;; We iterate over the lambdas in each initial component, trying - ;; to put each function in its own component, but joining it to - ;; an existing component if we find that there are references - ;; between them. Any code that is left in an initial component - ;; must be unreachable, so we can delete it. Stray links to the - ;; initial component tail (due to NIL function terminated blocks) - ;; are moved to the appropriate new component tail. - (dolist (toplevel-lambda toplevel-lambdas) - (let* ((old-component (lambda-component toplevel-lambda)) - (old-component-lambdas (component-lambdas old-component)) - (new-component nil)) - (aver (member toplevel-lambda old-component-lambdas)) - (dolist (component-lambda old-component-lambdas) - (aver (member (functional-kind component-lambda) - '(:optional :external :toplevel nil :escape - :cleanup))) - (unless new-component - (setf new-component (make-empty-component)) - (setf (component-name new-component) - ;; This isn't necessarily an ideal name for the - ;; component, since it might end up with multiple - ;; lambdas in it, not just this one, but it does - ;; seem a better name than just "<unknown>". - (leaf-debug-name component-lambda))) - (let ((res (dfo-scavenge-dependency-graph component-lambda - new-component))) - (when (eq res new-component) - (aver (not (position new-component (components)))) - (components new-component) - (setq new-component nil)))) - (when (eq (component-kind old-component) :initial) - (aver (null (component-lambdas old-component))) - (let ((tail (component-tail old-component))) + (let ((new (make-empty-component))) + (dolist (initial-component (mapcar #'lambda-component top-level-lambdas)) + (unless (eq (component-kind initial-component) :deleted) + (dolist (component-lambda (component-lambdas initial-component)) + (aver (member (functional-kind component-lambda) + '(:optional :external :toplevel nil :escape + :cleanup))) + (let ((res (dfo-scavenge-dependency-graph component-lambda + new))) + (when (eq res new) + (aver (not (member new (components)))) + (components new) + (setq new (make-empty-component))))) + (aver (eq (component-kind initial-component) :initial)) + (aver (null (component-lambdas initial-component))) + (let ((tail (component-tail initial-component))) (dolist (pred (block-pred tail)) (let ((pred-component (block-component pred))) - (unless (eq pred-component old-component) + (unless (eq pred-component initial-component) (unlink-blocks pred tail) (link-blocks pred (component-tail pred-component)))))) - (delete-component old-component)))) + (delete-component initial-component)))) ;; When we are done, we assign DFNs. (dolist (component (components)) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index 451680959b..c7212616e3 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -256,3 +256,49 @@ (eq (sb-kernel::fun-code-header (sb-kernel::%closure-fun #'baz3)) (sb-kernel::fun-code-header (sb-kernel::%closure-fun #'foo3))))) (assert (null (ctu:find-named-callees #'baz3)))) + +(with-test (:name :block-compile-top-level-closures.simple-fun-reference) + (ctu:file-compile + `((defun simple (chr) + (char<= #\0 chr #\9)) + + (let ((scanner 3)) + (defun closure () + (values #'simple (incf scanner))))) + :block-compile t + :load t) + ;; Closure can directly reference the simple fun for SIMPLE. + (assert (not (member #'simple (ctu:find-named-callees #'closure)))) + (multiple-value-bind (val counter) + (closure) + (assert (eq val #'simple)) + (assert (eq counter 4))) + (multiple-value-bind (val counter) + (closure) + (assert (eq val #'simple)) + (assert (eq counter 5)))) + +(with-test (:name :block-compile-top-level-closures.closure-fun-reference) + (ctu:file-compile + `((defun simple1 () + #'closure1) + + (let ((scanner 3)) + (defun closure1 (char) + (values (char<= #\0 char #\9) (incf scanner))))) + :block-compile t + :load t) + ;; SIMPLE1 cannot directly reference the simple fun for CLOSURE1. It + ;; must go through the closure function object instead through the + ;; FDEFN. TODO: It might be worthwhile in the future to treat + ;; top-level closures as load time constants, so that we can + ;; reference the closure object directly, rather than go through the + ;; FDEFN. + (multiple-value-bind (val counter) + (funcall (simple1) #\a) + (assert (eq val nil)) + (assert (eq counter 4))) + (multiple-value-bind (val counter) + (funcall (simple1) #\1) + (assert (eq val t)) + (assert (eq counter 5)))) From 4e17b2d5ceb7ecbf4b6946fe8edad33db25aa404 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 12 May 2022 08:32:11 -0400 Subject: [PATCH 3321/4023] Rename OBJECT_SIZE and friends There are 4 sizing functions now, all the same but different: OBJECT_SIZE() -> object_size2() // meaning it takes 2 args with special case of OBJECT_SIZE(*x,x) as object_size(x) and sizetab[widetag_of(x)](x) becomes headerobj_size(x) etc The concept is that object_size() takes any object but headerobj only accepts headered objects. It may be wishful thinking that selection of the right variant removes some branching, but they can be regarded as assertions about the logic. --- src/runtime/cheneygc.c | 4 +-- src/runtime/coreparse.c | 12 ++++---- src/runtime/fullcgc.c | 8 ++--- src/runtime/gc-common.c | 6 ++-- src/runtime/gc-internal.h | 18 ++++++++++- src/runtime/gencgc.c | 25 ++++++++++------ src/runtime/immobile-space.c | 58 ++++++++++++++++++------------------ src/runtime/monitor.c | 2 +- src/runtime/search.c | 7 ++--- src/runtime/traceroot.c | 9 +++--- src/runtime/verify.inc | 6 ++-- 11 files changed, 88 insertions(+), 67 deletions(-) diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index d20bcbc948..8906c2d90b 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -540,7 +540,7 @@ verify_range(int purified, lispobj *base, lispobj *end) lispobj* where = base; int len, i; lispobj layout; - for ( ; where < end ; where += OBJECT_SIZE(*where, where) ) { + for ( ; where < end ; where += object_size(where) ) { if (is_cons_half(*where)) { CHECK_PTR(where+0, where[0]); CHECK_PTR(where+1, where[1]); @@ -586,7 +586,7 @@ void dump_space_to_file(lispobj* where, lispobj* limit, char* pathname) f = fopen(pathname, "w"); while (where < limit) { fprintf(f, "%p: %x\n", where, *where); - where += OBJECT_SIZE(*where, where); + where += object_size(where); } fprintf(f, "--\n"); fclose(f); diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 9111c54634..5b1769feff 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -662,7 +662,7 @@ void calc_asm_routine_bounds() asm_routines_start = READ_ONLY_SPACE_START; } else { lispobj *where = (lispobj*)STATIC_SPACE_OBJECTS_START; - for (; where < static_space_free_pointer; where += OBJECT_SIZE(*where, where)) + for (; where < static_space_free_pointer; where += object_size(where)) if (widetag_of((lispobj*)where) == CODE_HEADER_WIDETAG) { asm_routines_start = (uword_t)where; break; @@ -1217,7 +1217,7 @@ static void graph_visit(lispobj __attribute__((unused)) referer, case FUNCALLABLE_INSTANCE_WIDETAG: layout = layout_of(obj); graph_visit(ptr, layout, seen); - nwords = sizetab[widetag_of(obj)](obj); + nwords = headerobj_size(obj); struct bitmap bitmap = get_layout_bitmap(LAYOUT(layout)); for (i=0; i<(nwords-1); ++i) if (bitmap_logbitp(i, bitmap)) RECURSE(obj[1+i]); @@ -1254,7 +1254,7 @@ static void graph_visit(lispobj __attribute__((unused)) referer, break; default: if (!leaf_obj_widetag_p(widetag_of(obj))) { - int size = sizetab[widetag_of(obj)](obj); + int size = headerobj_size(obj); for(i=1; i<size; ++i) RECURSE(obj[i]); } } @@ -1277,9 +1277,9 @@ static void tally(lispobj ptr, struct visitor* v) else { lispobj* obj = native_pointer(ptr); lispobj header = *obj; + int words = object_size2(obj, header); int widetag = header_widetag(header); int header_index = widetag>>2; - int words = OBJECT_SIZE(header, obj); ++v->headers[header_index].count; v->headers[header_index].words += words; if (widetag == SIMPLE_VECTOR_WIDETAG) { @@ -1313,7 +1313,7 @@ static uword_t visit(lispobj* where, lispobj* limit, uword_t arg) lispobj ptr = compute_lispobj(obj); tally(ptr, v); if (!hopscotch_get(v->reached, ptr, 0)) printf("unreachable: %p\n", (void*)ptr); - obj += OBJECT_SIZE(*obj, obj); + obj += object_size(obj); } return 0; } @@ -1341,7 +1341,7 @@ static void sanity_check_loaded_core(lispobj initial_function) lispobj* end = static_space_free_pointer; while (where<end) { graph_visit(0, compute_lispobj(where), &reached); - where += OBJECT_SIZE(*where, where); + where += object_size(where); } } graph_visit(0, initial_function, &reached); // not otherwise reachable diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 4f30e4c844..d40719e66e 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -438,7 +438,7 @@ void execute_full_mark_phase() while (where < end) { lispobj obj = compute_lispobj(where); gc_enqueue(obj); - where += listp(obj) ? 2 : sizetab[widetag_of(where)](where); + where += listp(obj) ? 2 : headerobj_size(where); } #ifdef LISP_FEATURE_METASPACE where = (lispobj*)METASPACE_START; @@ -446,7 +446,7 @@ void execute_full_mark_phase() while (where < end) { lispobj obj = compute_lispobj(where); gc_enqueue(obj); - where += listp(obj) ? 2 : sizetab[widetag_of(where)](where); + where += listp(obj) ? 2 : headerobj_size(where); } #endif gc_mark_obj(lisp_package_vector); @@ -562,7 +562,7 @@ static void sweep_fixedobj_pages(long *zeroed) lispobj header = *obj; uword_t markbit = boxedobj_widetag_to_markbit(header_widetag(header)); if (header & markbit) *obj = header ^ markbit; - obj += sizetab[widetag_of(obj)](obj); + obj += headerobj_size(obj); } } #endif @@ -601,7 +601,7 @@ static uword_t sweep(lispobj* where, lispobj* end, lispobj word = *where; int livep = 0; if (is_header(word)) { - nwords = sizetab[header_widetag(word)](where); + nwords = headerobj_size2(where, word); lispobj markbit = general_widetag_to_markbit(header_widetag(word)); if (word & markbit) livep = 1, *where = word ^ markbit; if (!livep) clobber_headered_object(where, nwords); diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 2565cb6faf..e2b69fd684 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1969,13 +1969,13 @@ gc_search_space3(void *pointer, lispobj * const start, void *limit) copy = native_pointer(forwarding_pointer_value(where)); // BUG: the size of a forwarded object may exceed the size of the original // due to the addition of a stable hash slot. - count = OBJECT_SIZE(*copy, copy); + count = object_size(copy); /* Check whether the pointer is within this object. */ if (pointer < (void*)(where+count)) return where; } #else for ( ; (void*)where < limit ; where += count) { - count = OBJECT_SIZE(*where, where); + count = object_size(where); /* Check whether the pointer is within this object. */ if (pointer < (void*)(where+count)) return where; } @@ -2692,5 +2692,5 @@ void gc_heapsort_uwords(heap array, int length) /// External function for calling from Lisp. uword_t primitive_object_size(lispobj ptr) { lispobj* addr = native_pointer(ptr); - return OBJECT_SIZE(*addr,addr) * N_WORD_BYTES; + return object_size(addr) * N_WORD_BYTES; } diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index b67529494b..dcb764b759 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -106,10 +106,26 @@ static inline int vector_is_weak_not_hashing_p(unsigned int header) { extern sword_t (*sizetab[256])(lispobj *where); typedef sword_t (*sizerfn)(lispobj*); -static inline sword_t OBJECT_SIZE(uword_t header, lispobj* where) { +static inline sword_t object_size(lispobj* where) { + sizerfn f = sizetab[widetag_of(where)]; + return f ? f(where) : CONS_SIZE; +} +// These three variants are potentially more efficient - +// (1) if the widetag was loaded, avoids one memory read +// (2) if you know the object isn't a cons, use headerobj_size +// (3) both of the above pertain. +// Cases 1 and 3 exist only because C doesn't have optional args. +// These might be premature optimizations, I really don't know. +static inline sword_t object_size2(lispobj* where, unsigned int header) { sizerfn f = sizetab[header & WIDETAG_MASK]; return f ? f(where) : CONS_SIZE; } +static inline sword_t headerobj_size(lispobj* where) { + return sizetab[widetag_of(where)](where); +} +static inline sword_t headerobj_size2(lispobj* where, unsigned int header) { + return sizetab[header & WIDETAG_MASK](where); +} lispobj *gc_search_space3(void *pointer, lispobj *start, void *limit); static inline lispobj *gc_search_space(lispobj *start, void *pointer) { diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 5d230c7b57..5a0fbf6781 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2101,7 +2101,7 @@ static void refine_ambiguous_roots() * then we're done; the key was not found */ while (1) { if (where < key) { - where += OBJECT_SIZE(*where, where); + where += object_size(where); } else if (where == key) { break; } else { // 'where' went past the key, so the key is bad @@ -2223,12 +2223,12 @@ void visit_freed_objects(char __attribute__((unused)) *start, * Are there other places where we get this wrong??? I sure hope not */ lispobj* fwd_where = native_pointer(forwarding_pointer_value(where)); fprintf(stderr, "%p: -> %p\n", where, fwd_where); - where += OBJECT_SIZE(*fwd_where, fwd_where); + where += object_size(fwd_where); } else { // dead object fprintf(stderr, "%p: %"OBJ_FMTX" %"OBJ_FMTX"\n", where, where[0], where[1]); if (is_header(word)) { // Do something interesting - where += sizetab[header_widetag(word)](where); + where += headerobj_size(where, word); } else { /* Can't do much useful with conses because often we can't distinguish * filler from data. visit_freed_objects is called on ranges of pages @@ -2328,7 +2328,7 @@ static void obliterate_nonpinned_words() // If 'obj' spans pages, move its successive page(s) to newspace and // ensure that those pages' scan_starts point at the same address // that this page's scan start does, which could be this page or earlier. - size_t nwords = OBJECT_SIZE(*obj, obj); + size_t nwords = object_size(obj); uword_t obj_end = (uword_t)(obj + nwords); // non-inclusive address bound page_index_t end_page_index = find_page_index((char*)obj_end - 1); // inclusive bound @@ -2422,7 +2422,7 @@ static void pin_object(lispobj object) * and be done with it */ if (page_single_obj_p(page)) { if (gc_page_pins[page]) return; - sword_t nwords = OBJECT_SIZE(*object_start, object_start); + sword_t nwords = object_size(object_start); maybe_adjust_large_object(object_start, page, nwords); page_index_t last_page = find_page_index(object_start + nwords - 1); while (page <= last_page) gc_page_pins[page++] = PAGE_PINNED; @@ -2858,7 +2858,7 @@ update_code_writeprotection(page_index_t first_page, page_index_t last_page, gc_assert(is_code(page_table[i].type)); lispobj* where = start; - for (; where < limit; where += sizetab[widetag_of(where)](where)) { + for (; where < limit; where += headerobj_size(where)) { switch (widetag_of(where)) { case CODE_HEADER_WIDETAG: if (header_rememberedp(*where)) return; @@ -4117,10 +4117,17 @@ garbage_collect_generation(generation_index_t generation, int raise, lispobj* limit = (lispobj*)page_address(last) + page_words_used(last); while (where < limit) { if (forwarding_pointer_p(where)) { + // The codeblob already survived GC, so we just need to step over it. lispobj* copy = native_pointer(forwarding_pointer_value(where)); - where += sizetab[widetag_of(copy)](copy); + // NOTE: it's OK to size the newspace copy rather than the original + // because code size can't change. + where += headerobj_size(copy); } else { - sword_t nwords = sizetab[widetag_of(where)](where); + // Compute 'nwords' before potentially moving the object + // at 'where', because moving it stomps on the header word. + sword_t nwords = headerobj_size(where); + // If the object is not a filler and not a trampline, then create + // a pointer to it and eliven the pointee. if (widetag_of(where) == CODE_HEADER_WIDETAG && where[1] != 0 /* has at least one boxed word */ && code_serialno((struct code*)where) != 0) { @@ -4651,7 +4658,7 @@ static void __attribute__((unused)) gcbarrier_patch_code_range(uword_t start, vo gcbarrier_patch_code(patch_where, gc_card_table_nbits); } } - where += OBJECT_SIZE(*where, where); + where += object_size(where); } } void gc_allocate_ptes() diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 29056e18d5..c81a5a5438 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -531,7 +531,7 @@ static void full_scavenge_immobile_newspace() set_visited(obj); n_words = scavtab[header_widetag(header)](obj, header); } else { - n_words = sizetab[header_widetag(header)](obj); + n_words = headerobj_size2(obj, header); } } page = find_varyobj_page_index(obj); @@ -663,7 +663,7 @@ scavenge_immobile_roots(generation_index_t min_gen, generation_index_t max_gen) if (gen == new_space) { set_visited(obj); } n_words = scavtab[header_widetag(header)](obj, header); } else { - n_words = sizetab[header_widetag(header)](obj); + n_words = headerobj_size2(obj, header); } } page = find_varyobj_page_index(obj); @@ -682,7 +682,7 @@ scavenge_immobile_roots(generation_index_t min_gen, generation_index_t max_gen) && immobile_obj_gen_bits(where) == from_space && code_serialno((struct code*)where) != 0) enliven_immobile_obj(where, 1); - where += sizetab[widetag_of(where)](where); + where += headerobj_size(where); } } scavenge_immobile_newspace(); @@ -853,7 +853,7 @@ static inline boolean can_wp_fixedobj_page(page_index_t page, int keep_gen, int do { if (!fixnump(*obj) && // an object header fixedobj_points_to_younger_p(obj, - sizetab[widetag_of(obj)](obj), + headerobj_size(obj), immobile_obj_generation(obj), keep_gen, new_gen)) return 0; @@ -871,7 +871,7 @@ static inline boolean can_wp_varyobj_page(page_index_t page, int keep_gen, int n lispobj *begin = varyobj_page_address(page); lispobj *end = begin + WORDS_PER_PAGE; lispobj *obj = varyobj_scan_start(page); - for ( ; obj < end ; obj += sizetab[widetag_of(obj)](obj) ) { + for ( ; obj < end ; obj += headerobj_size(obj) ) { gc_assert(other_immediate_lowtag_p(*obj)); if (!filler_obj_p(obj) && varyobj_points_to_younger_p(obj, @@ -983,12 +983,12 @@ sweep_fixedobj_pages(int raise) assign_generation(obj, gen = new_gen); #ifdef DEBUG gc_assert(!fixedobj_points_to_younger_p(obj, - sizetab[widetag_of(obj)](obj), + headerobj_size(obj), gen, keep_gen, new_gen)); #endif any_kept = -1; } else if (wp_it && fixedobj_points_to_younger_p(obj, - sizetab[widetag_of(obj)](obj), + headerobj_size(obj), gen, keep_gen, new_gen)) wp_it = 0; } while (NEXT_FIXEDOBJ(obj, obj_spacing) <= limit); @@ -1081,14 +1081,14 @@ sweep_varyobj_pages(int raise) // We MUST skip this object in the sweep, because in the case of // non-promotion (raise=0), we could see an object in from_space // and believe it to be dead. - obj += sizetab[widetag_of(obj)](obj); + obj += headerobj_size(obj); // obj can't hop over this page. If it did, there would be no // headers on the page, and genmask would have been zero. gc_assert(obj < limit); } for ( ; obj < limit ; obj += size ) { lispobj word = *obj; - size = sizetab[header_widetag(word)](obj); + size = object_size2(obj, word); if (filler_obj_p(obj)) { // do nothing } else if ((gen = immobile_obj_gen_bits(obj)) == discard_gen) { if (header_widetag(word) == CODE_HEADER_WIDETAG) { @@ -1170,13 +1170,13 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t varyobj_len) end = (lispobj*)((char*)where + fixedobj_len); while (where < end) { if (!fixnump(*where)) assign_generation(where, gen); - where += OBJECT_SIZE(*where, where); + where += object_size(where); } where = (lispobj*)VARYOBJ_SPACE_START; end = (lispobj*)((char*)where + varyobj_len); while (where < end) { if (!filler_obj_p(where)) assign_generation(where, gen); - where += OBJECT_SIZE(*where, where); + where += object_size(where); } // If the regression suite is run with core pages in gen0 (to more aggressively // test code page transporting), we don't want to cause failures in 'script.test.sh' @@ -1200,7 +1200,7 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t varyobj_len) lispobj header = *obj; if (!fixnump(header)) { gc_assert(other_immediate_lowtag_p(*obj)); - int size = sizetab[header_widetag(header)](obj); + int size = object_size2(obj, header); fixedobj_pages[page].attr.parts.obj_align = size; fixedobj_pages[page].gens |= 1 << immobile_obj_gen_bits(obj); if (gen != 0 && ENABLE_PAGE_PROTECTION) @@ -1229,7 +1229,7 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t varyobj_len) && limit <= (lispobj*)(address + varyobj_len)); for ( ; obj < limit ; obj += n_words ) { gc_assert(other_immediate_lowtag_p(obj[0])); - n_words = sizetab[widetag_of(obj)](obj); + n_words = headerobj_size(obj); if (filler_obj_p(obj)) { // Holes were chained through the debug_info slot at save. // Just update the head of the chain. @@ -1299,7 +1299,7 @@ void prepare_immobile_space_for_final_gc() if (mask & 1<<PSEUDO_STATIC_GENERATION) { lispobj* obj = (lispobj*)page_base; lispobj* limit = (lispobj*)((uword_t)obj + IMMOBILE_CARD_BYTES); - for ( ; obj < limit ; obj += OBJECT_SIZE(*obj, obj) ) + for ( ; obj < limit ; obj += object_size(obj) ) if (other_immediate_lowtag_p(*obj) && immobile_obj_gen_bits(obj) == PSEUDO_STATIC_GENERATION) assign_generation(obj, HIGHEST_NORMAL_GENERATION); @@ -1310,7 +1310,7 @@ void prepare_immobile_space_for_final_gc() lispobj* obj = (lispobj*)VARYOBJ_SPACE_START; lispobj* limit = varyobj_free_pointer; - for ( ; obj < limit ; obj += sizetab[widetag_of(obj)](obj) ) { + for ( ; obj < limit ; obj += headerobj_size(obj) ) { if (immobile_obj_gen_bits(obj) == PSEUDO_STATIC_GENERATION) assign_generation(obj, HIGHEST_NORMAL_GENERATION); } @@ -1344,19 +1344,19 @@ void prepare_immobile_space_for_save(boolean verbose) while (obj < limit) { if (other_immediate_lowtag_p(*obj)) assign_generation(obj, PSEUDO_STATIC_GENERATION); - obj += OBJECT_SIZE(*obj, obj); + obj += object_size(obj); } obj = (lispobj*)VARYOBJ_SPACE_START; limit = varyobj_free_pointer; - for ( varyobj_holes = 0 ; obj < limit ; obj += sizetab[widetag_of(obj)](obj) ) { + for ( varyobj_holes = 0 ; obj < limit ; obj += headerobj_size(obj) ) { if (filler_obj_p(obj)) { struct code* code = (struct code*)obj; code->debug_info = varyobj_holes; code->fixups = 0; varyobj_holes = (lispobj)code; // 0-fill the unused space. - int nwords = sizetab[widetag_of(obj)](obj); + int nwords = headerobj_size(obj); memset(code->constants, 0, (nwords * N_WORD_BYTES) - offsetof(struct code, constants)); } else @@ -1433,7 +1433,7 @@ search_immobile_space(void *pointer) if (fixedobj_tempspace.start) // defragmenting end = (char*)obj + spacing; else - end = (char*)(obj + OBJECT_SIZE(*obj,obj)); + end = (char*)(obj + object_size(obj)); if ((char*)pointer < end) return obj; } else { return gc_search_space((lispobj*)page_base, pointer); @@ -1455,7 +1455,7 @@ lispobj* find_preceding_object(lispobj* obj) lispobj* start = varyobj_scan_start(page); if (start < obj) { // Scan from here forward while (1) { - lispobj* end = start + sizetab[widetag_of(start)](start); + lispobj* end = start + headerobj_size(start); if (end == obj) return start; gc_assert(end < obj); start = end; @@ -1620,8 +1620,8 @@ static void fixup_space(lispobj* where, size_t n_words) where += 2; continue; } + size = headerobj_size2(where, header_word); widetag = header_widetag(header_word); - size = sizetab[widetag](where); switch (widetag) { default: if (!leaf_obj_widetag_p(widetag)) @@ -2082,7 +2082,7 @@ static void defrag_immobile_space(boolean verbose) if ((new_vaddr = components[i*2+1]) != 0) { addr = native_pointer(components[i*2]); memcpy(tempspace_addr((void*)new_vaddr), addr, - sizetab[widetag_of(addr)](addr) << WORD_SHIFT); + headerobj_size(addr) << WORD_SHIFT); int displacement = new_vaddr - (lispobj)addr; switch (widetag_of(addr)) { default: @@ -2138,7 +2138,7 @@ static void defrag_immobile_space(boolean verbose) forwarding_pointer_p(obj) ? tempspace_addr(native_pointer(forwarding_pointer_value(obj))) : obj; // Sizing a forwarded object is OK here - code size can't change when copied. - int size = sizetab[widetag_of(fwdobj)](fwdobj); + int size = headerobj_size(fwdobj); // Supplying symbol_kind as 0 is fine - symbols can't exist in code space. if (executable_object_p(fwdobj)) place_fixedobj(obj, size << WORD_SHIFT, alloc_ptrs, 0); @@ -2452,7 +2452,7 @@ void check_varyobj_pages() while (obj < end) { lispobj word = *obj; gc_assert(other_immediate_lowtag_p(word)); - int n_words = sizetab[header_widetag(word)](obj); + int n_words = headerobj_size(obj); obj += n_words; ++n_immobile_objects; } @@ -2467,7 +2467,7 @@ void check_varyobj_pages() while (obj < end) { immobile_objects[i++] = (lispobj)obj; lispobj word = *obj; - int n_words = sizetab[header_widetag(word)](obj); + int n_words = headerobj_size(obj); obj += n_words; } // Check that each page's scan start is a known immobile object @@ -2484,7 +2484,7 @@ void check_varyobj_pages() if (scan_start_obj != (lispobj*)(long)stored_scan_start) { //printf("page %d: found-below=%p stored=%p\n", page, scan_start_obj, stored_scan_start); while (filler_obj_p(scan_start_obj)) { - int nwords = sizetab[widetag_of(scan_start_obj)](scan_start_obj); + int nwords = headerobj_size(scan_start_obj); // printf("skipping %d words to %p\n", nwords, scan_start_obj + nwords); scan_start_obj += nwords; // the stored scan start does not guarantee that it points @@ -2509,7 +2509,7 @@ void check_varyobj_pages() // the object below must touch this page. // if it didn't, there should be a higher object below. lispobj* below = (lispobj*)(long)*found_below; - int n_words = sizetab[header_widetag(*below)](below); + int n_words = headerobj_size(below); lispobj* end = below + n_words; gc_assert(end > (lispobj*)page_addr); } @@ -2523,14 +2523,14 @@ void check_varyobj_pages() continue; // page is all holes or never used obj = varyobj_scan_start(page); lispobj word = *obj; - int n_words = sizetab[header_widetag(word)](obj); + int n_words = headerobj_size(obj); // Skip the first object if it doesn't start on this page. if (obj < (lispobj*)varyobj_page_address(page)) obj += n_words; lispobj* limit = (lispobj*)varyobj_page_address(page) + WORDS_PER_PAGE; lispobj* freeptr = varyobj_free_pointer; if (limit > freeptr) limit = freeptr; int mask = 0; - for ( ; obj < limit ; obj += sizetab[widetag_of(obj)](obj) ) { + for ( ; obj < limit ; obj += headerobj_size(obj) ) { int gen = immobile_obj_gen_bits(obj); if (filler_obj_p(obj)) { gc_assert(gen == 0); diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 36417eeca0..1ce9a9cfa2 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -410,7 +410,7 @@ dump_cmd(char **ptr) if (word != 0 && !is_lisp_pointer(word) && valid_widetag_p(header_widetag(word))) { printf(" %s", widetag_names[header_widetag(word)>>2]); - next_object += sizetab[header_widetag(word)](next_object); + next_object += headerobj_size2(next_object, word); } else if (!is_header(word)) { next_object += CONS_SIZE; } else { // disable decoder if weirdness observed diff --git a/src/runtime/search.c b/src/runtime/search.c index a80db14abc..ec50001c6d 100644 --- a/src/runtime/search.c +++ b/src/runtime/search.c @@ -107,9 +107,8 @@ lispobj* search_for_symbol(char *name, lispobj start, lispobj end, boolean ignor } #endif while (where < limit) { - lispobj word = *where; struct vector *string; - if (header_widetag(word) == SYMBOL_WIDETAG && + if (widetag_of(where) == SYMBOL_WIDETAG && (string = symbol_name((struct symbol*)where)) != 0 && string->length_ == namelen) { if (gc_managed_addr_p((lispobj)string) && @@ -123,7 +122,7 @@ lispobj* search_for_symbol(char *name, lispobj start, lispobj end, boolean ignor )) return where; } - where += OBJECT_SIZE(word, where); + where += object_size(where); } return 0; } @@ -146,7 +145,7 @@ struct symbol* lisp_symbol_from_tls_index(lispobj tls_index) if (widetag == SYMBOL_WIDETAG && tls_index_of(((struct symbol*)where)) == tls_index) return (struct symbol*)where; - where += OBJECT_SIZE(header, where); + where += object_size2(where, header); } if (where >= (lispobj*)DYNAMIC_SPACE_START) break; diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 091d3e046f..e67ef203c8 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -159,8 +159,8 @@ static int find_ref(lispobj* source, lispobj target) check_ptr(1, source[1]); return -1; } + scan_limit = headerobj_size(source); int widetag = widetag_of(source); - scan_limit = sizetab[widetag](source); switch (widetag) { case INSTANCE_WIDETAG: case FUNCALLABLE_INSTANCE_WIDETAG: @@ -526,8 +526,7 @@ static lispobj trace1(lispobj object, if (hopscotch_containsp(visited, (lispobj)ptr)) fprintf(stderr, "%p ", ptr); else { - lispobj word = *ptr; - int nwords = OBJECT_SIZE(word, ptr); + int nwords = object_size(ptr); fprintf(stderr, "%p+%d ", ptr, nwords); } list1 = cell[1]; @@ -720,7 +719,7 @@ static uword_t build_refs(lispobj* where, lispobj* end, boolean count_only = !ss->record_ptrs; for ( ; where < end ; where += nwords ) { if (ss->ignored_objects && ignorep(where, ss->ignored_objects)) { - nwords = OBJECT_SIZE(*where, where); + nwords = object_size(where); continue; } ++n_objects; @@ -731,8 +730,8 @@ static uword_t build_refs(lispobj* where, lispobj* end, check_ptr(where[1]); continue; } + nwords = scan_limit = headerobj_size2(where, word); int widetag = header_widetag(word); - nwords = scan_limit = sizetab[widetag](where); switch (widetag) { case INSTANCE_WIDETAG: case FUNCALLABLE_INSTANCE_WIDETAG: diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index cac36ea197..dd670552cc 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -305,7 +305,7 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state /* Technically we should wait until after performing the widetag validity * tests before calling the sizer. Otherwise the lossage message would * not be as good as it could be. I guess that failure doesn't happen much */ - long nwords = OBJECT_SIZE(*where,where); + long nwords = object_size(where); state->object_addr = where; state->object_header = is_cons_half(*where) ? 0 : *where; if (state->flags & VERIFYING_GENERATIONAL) { @@ -494,7 +494,7 @@ __attribute__((unused)) static void dump_immobile(lispobj* where, lispobj* end, { while (where < end) { fprintf(f, "%"OBJ_FMTX": %"OBJ_FMTX"\n", (uword_t)where, *where); - where += OBJECT_SIZE(*where, where); + where += object_size(where); } } static int dump_completely_p(lispobj* obj, struct verify_state* state) @@ -549,7 +549,7 @@ void hexdump_spaces(struct verify_state* state, char *reason) fprintf(f, ")\n"); lispobj *where = base; while (where<limit){ - int nwords = OBJECT_SIZE(*where,where); + int nwords = object_size(where); /* If your'e having trouble with a subset of objects, and you can get * a reliable reproducer, this predicate can decide which objects to * output in full. Generally you don't need that much output */ From c4788e9ce6a507fdf95b8ec4eaaf020963f9234d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 12 May 2022 19:31:22 +0300 Subject: [PATCH 3322/4023] Transform (string= (simple-string 1) (simple-string 2)) to NIL. --- src/compiler/seqtran.lisp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index f60a49f129..0f53441da0 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -995,6 +995,26 @@ ,'index nil))) +(deftransforms (string=* simple-base-string= + simple-character-string=) + ((string1 string2 start1 end1 start2 end2) + (t t (constant-arg t) (constant-arg t) (constant-arg t) (constant-arg t))) + (let* ((start1 (lvar-value start1)) + (length1 (vector-type-length (lvar-type string1))) + (end1 (or (lvar-value end1) + length1)) + (start2 (lvar-value start2)) + (length2 (vector-type-length (lvar-type string2))) + (end2 (or (lvar-value end2) + length2))) + (if (and length1 length2 + (<= start1 end1 length1) + (<= start2 end2 length2) + (/= (- end1 start1) + (- end2 start2))) + nil + (give-up-ir1-transform)))) + (deftransform string/=* ((str1 str2 start1 end1 start2 end2) * * :node node :important nil) ;; An IF node doesn't care about the mismatch index. From d692ebfd674f8dd43b9eb8df2da51eb214b2298f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 12 May 2022 13:59:56 -0400 Subject: [PATCH 3323/4023] Disable :mach-exception-handler for x86-64 darwin Per https://groups.google.com/g/sbcl-devel/c/-bFBJJPFgww/m/NpPqWZvQBQAJ --- make-config.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/make-config.sh b/make-config.sh index 6053658c23..6ad1b9bb7c 100755 --- a/make-config.sh +++ b/make-config.sh @@ -558,7 +558,6 @@ case "$sbcl_os" in printf ' :mach-exception-handler' >> $ltf fi if [ $sbcl_arch = "x86-64" ]; then - printf ' :mach-exception-handler' >> $ltf darwin_version=`uname -r` darwin_version_major=${DARWIN_VERSION_MAJOR:-${darwin_version%%.*}} From 6c4cf32d074bf3e4d1e13cf333f874c10135b92d Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Thu, 12 May 2022 11:07:32 -0700 Subject: [PATCH 3324/4023] Fix typo. --- src/compiler/ir1-translators.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 027420c552..071aa4542c 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -542,7 +542,7 @@ Return VALUE without evaluating it." (when context (list :in context)))) -;;;; FUNCTION and NAMED-LAMBgDA +;;;; FUNCTION and NAMED-LAMBDA ;;; `(NAMED-LAMBDA ,NAME ,@REST) is like `(FUNCTION (LAMBDA ,@REST)), ;;; except that the value of NAME is passed to the compiler for use in From f1bce35eee8fe03cdcd5ae7034b16ea8124c3248 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Thu, 12 May 2022 11:23:38 -0700 Subject: [PATCH 3325/4023] Document an important aspect of the ir1 namespace. --- src/cold/build-order.lisp-expr | 2 +- src/compiler/early-c.lisp | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index a281bd27a3..27e7cfdf55 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -348,7 +348,7 @@ ("src/compiler/disassem") ("src/compiler/assem") - ;; Compiling this requires fop definitions from code/fop.lisp and + ;; Compiling this requires fop definitions from code/load.lisp. ("src/compiler/dump") ("src/compiler/target-dump" :not-host) ; needs stuff from compiler/dump.lisp diff --git a/src/compiler/early-c.lisp b/src/compiler/early-c.lisp index dfc2f97df5..f2ecfa6e5a 100644 --- a/src/compiler/early-c.lisp +++ b/src/compiler/early-c.lisp @@ -41,12 +41,20 @@ (expansion nil :read-only t)) (declaim (freeze-type dxable-args)) +;;; FREE-VARS translates from the names of variables referenced +;;; globally to the LEAF structures for them. FREE-FUNS is like +;;; FREE-VARS, only it deals with function names. +;;; +;;; We must preserve the property that a proclamation for a global +;;; thing only affects the code after it. This takes some work, since +;;; a proclamation may appear in the middle of a block being +;;; compiled. If there are references before the proclaim, then we +;;; copy the current entry before modifying it. Code converted before +;;; the proclaim sees the old Leaf, while code after it sees the new +;;; LEAF. (defstruct (ir1-namespace (:conc-name "") (:copier nil) (:predicate nil)) - ;; FREE-VARS translates from the names of variables referenced - ;; globally to the LEAF structures for them. (free-vars (make-hash-table :test 'eq) :read-only t :type hash-table) - ;; FREE-FUNS is like FREE-VARS, only it deals with function names. - (free-funs (make-hash-table :test 'equal) :read-only t :type hash-table) + (free-funs (make-hash-table :test #'equal) :read-only t :type hash-table) ;; These hashtables translate from constants to the LEAFs that ;; represent them. ;; Table 1: one entry per named constant From a1b01295960e1680bbef4d3ae2ac2c452e29a188 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 12 May 2022 14:37:24 -0400 Subject: [PATCH 3326/4023] Improve atomic logging Rule #1 for logging during signal handling is never call anything in the printf() family of functions, as they might malloc or otherwise be somehow nonreentrant. i.e. FSHOW is just wrong. (And the second rule is never do something to induce so much delay as to make the problem you're investigating irreproducible) --- src/runtime/atomiclog.inc | 49 ++++++++++++++++++++---- src/runtime/backtrace.c | 2 +- src/runtime/interrupt.c | 78 ++++++++++++++++++++++++++------------- src/runtime/thread.c | 27 +++++++++++++- 4 files changed, 120 insertions(+), 36 deletions(-) diff --git a/src/runtime/atomiclog.inc b/src/runtime/atomiclog.inc index 9a46962ffe..d698edc3d4 100644 --- a/src/runtime/atomiclog.inc +++ b/src/runtime/atomiclog.inc @@ -1,31 +1,51 @@ /* -*- Mode: C -*- */ -#define EVENTBUFMAX 10000 +#ifndef ATOMIC_LOGGING +#define event0(fmt) +#define event1(fmt,a) +#define event2(fmt,a,b) +#define event3(fmt,a,b,c) +#define event4(fmt,a,b,c,d) +#define event5(fmt,a,b,c,d,e) +#define event6(fmt,a,b,c,d,e,f) +#else + +#define EVENTBUFMAX 40000 extern uword_t *eventdata; extern int n_logevents; /// eventN = record event with N parameters + +/// NOTE 1: The buffer is oversized by enough to ensure that i_+7 does not +/// overrun the buffer. So we don't need to adjust the comparison of 'i_ <' +/// by the number of additional arguments. + +/// NOTE 2: Assume that pthread_self() can be cast to 'uword_t', which is +/// pretty much true everywhere, and that the low 3 bits are 0 +/// (which may not be true for 32-bit, but almost surely is for 64-bit). +/// So we can stuff the low 3 bits with something. + #define event0(fmt) \ { int i_ = __sync_fetch_and_add(&n_logevents, 2); if (i_ < EVENTBUFMAX) { \ - eventdata[i_ ] = 2; \ + eventdata[i_ ] = (uword_t)pthread_self(); \ eventdata[i_+1] = (uword_t)fmt; } } #define event1(fmt, arg1) \ { int i_ = __sync_fetch_and_add(&n_logevents, 3); if (i_ < EVENTBUFMAX) { \ - eventdata[i_ ] = 3; \ + eventdata[i_ ] = 1|(uword_t)pthread_self(); \ eventdata[i_+1] = (uword_t)fmt; \ eventdata[i_+2] = (uword_t)arg1; } } #define event2(fmt, arg1, arg2) \ - { int i_ = __sync_fetch_and_add(&n_logevents, 4); if (i_ < EVENTBUFMAX) { \ - eventdata[i_ ] = 4; \ + { int i_ = __sync_fetch_and_add(&n_logevents, 4); if (i_+3 < EVENTBUFMAX) { \ + eventdata[i_ ] = 2|(uword_t)pthread_self(); \ eventdata[i_+1] = (uword_t)fmt; \ eventdata[i_+2] = (uword_t)arg1; \ eventdata[i_+3] = (uword_t)arg2; } } #define event3(fmt, arg1, arg2, arg3) \ { int i_ = __sync_fetch_and_add(&n_logevents, 5); if (i_ < EVENTBUFMAX) { \ - eventdata[i_ ] = 5; \ + eventdata[i_ ] = 3|(uword_t)pthread_self(); \ eventdata[i_+1] = (uword_t)fmt; \ eventdata[i_+2] = (uword_t)arg1; \ eventdata[i_+3] = (uword_t)arg2; \ @@ -33,7 +53,7 @@ extern int n_logevents; #define event4(fmt, arg1, arg2, arg3, arg4) \ { int i_ = __sync_fetch_and_add(&n_logevents, 6); if (i_ < EVENTBUFMAX) { \ - eventdata[i_ ] = 6; \ + eventdata[i_ ] = 4|(uword_t)pthread_self(); \ eventdata[i_+1] = (uword_t)fmt; \ eventdata[i_+2] = (uword_t)arg1; \ eventdata[i_+3] = (uword_t)arg2; \ @@ -42,10 +62,23 @@ extern int n_logevents; #define event5(fmt, arg1, arg2, arg3, arg4, arg5) \ { int i_ = __sync_fetch_and_add(&n_logevents, 7); if (i_ < EVENTBUFMAX) { \ - eventdata[i_ ] = 7; \ + eventdata[i_ ] = 5|(uword_t)pthread_self(); \ eventdata[i_+1] = (uword_t)fmt; \ eventdata[i_+2] = (uword_t)arg1; \ eventdata[i_+3] = (uword_t)arg2; \ eventdata[i_+4] = (uword_t)arg3; \ eventdata[i_+5] = (uword_t)arg4; \ eventdata[i_+6] = (uword_t)arg5; } } + +#define event6(fmt, arg1, arg2, arg3, arg4, arg5, arg6) \ + { int i_ = __sync_fetch_and_add(&n_logevents, 8); if (i_ < EVENTBUFMAX) { \ + eventdata[i_ ] = 6|(uword_t)pthread_self(); \ + eventdata[i_+1] = (uword_t)fmt; \ + eventdata[i_+2] = (uword_t)arg1; \ + eventdata[i_+3] = (uword_t)arg2; \ + eventdata[i_+4] = (uword_t)arg3; \ + eventdata[i_+5] = (uword_t)arg4; \ + eventdata[i_+6] = (uword_t)arg5; \ + eventdata[i_+7] = (uword_t)arg6; } } + +#endif diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index d00d97d39e..7359ab1f22 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -719,7 +719,7 @@ void backtrace_lisp_threads(int __attribute__((unused)) signal, struct thread* this_thread = get_sb_vm_thread(); #ifdef LISP_FEATURE_SB_THREAD if (backtrace_completion_pipe[1] >= 0) { - libunwind_backtrace(current_thread, context); + libunwind_backtrace(get_sb_vm_thread(), context); write(backtrace_completion_pipe[1], context /* any random byte */, 1); return; } diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 05d13f6f2b..66def239ba 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -68,9 +68,9 @@ #include "genesis/simple-fun.h" #include "genesis/cons.h" #include "genesis/vector.h" +#include "atomiclog.inc" #ifdef ATOMIC_LOGGING -#include "atomiclog.inc" uword_t *eventdata; int n_logevents; #endif @@ -299,25 +299,49 @@ void dump_eventlog() { int i = 0; uword_t *e = eventdata; + char buf[1024]; + int nc, nc1; // number of chars in buffer + // Define buflen to be smaller than 'buf' so that we can prefix it + // with thread pointer and suffix it with a newline + // without too much hassle. +#define buflen (sizeof buf-20) + nc = snprintf(buf, buflen, "Event log: used %d elements of %d max\n", n_logevents, EVENTBUFMAX); + write(2, buf, nc); while (i<n_logevents) { char *fmt = (char*)e[i+1]; - switch (e[i]) { + uword_t prefix = e[i]; + int nargs = prefix & 7; + void* thread_pointer = (void*)(prefix & ~7); + extern char* thread_name_from_pthread(void*); + char* name = thread_name_from_pthread(thread_pointer); + if (name) nc = sprintf(buf, "%s: ", name); else nc = sprintf(buf, "%p: ", thread_pointer); + switch (nargs) { default: printf("busted event log"); return; - case 2: printf(fmt); break; - case 3: printf(fmt,e[i+2]); break; - case 4: printf(fmt,e[i+2],e[i+3]); break; - case 5: printf(fmt,e[i+2],e[i+3],e[i+4]); break; - case 6: printf(fmt,e[i+2],e[i+3],e[i+4],e[i+5]); break; - case 7: printf(fmt,e[i+2],e[i+3],e[i+4],e[i+5],e[i+6]); break; + case 0: nc1 = snprintf(buf+nc, buflen, fmt, 0); break; // the 0 inhibits a warning + case 1: nc1 = snprintf(buf+nc, buflen, fmt, e[i+2]); break; + case 2: nc1 = snprintf(buf+nc, buflen, fmt, e[i+2], e[i+3]); break; + case 3: nc1 = snprintf(buf+nc, buflen, fmt, e[i+2], e[i+3], e[i+4]); break; + case 4: nc1 = snprintf(buf+nc, buflen, fmt, e[i+2], e[i+3], e[i+4], e[i+5]); break; + case 5: nc1 = snprintf(buf+nc, buflen, fmt, e[i+2], e[i+3], e[i+4], e[i+5], e[i+6]); break; + case 6: nc1 = snprintf(buf+nc, buflen, fmt, e[i+2], e[i+3], e[i+4], e[i+5], e[i+6], + e[i+7]); break; } - putchar('\n'); - i += e[i]; +#undef buflen + buf[nc+nc1] = '\n'; + write(2, buf, 1+nc+nc1); + i += nargs + 2; } } +void sigdump_eventlog(int __attribute__((unused)) signal, + siginfo_t __attribute__((unused)) *info, + os_context_t *context) +{ + dump_eventlog(); +} + static void record_signal(int sig, void* context) { - event3("sig%d @%p in %d", sig, (void*)os_context_pc(context), - (int)get_sb_vm_thread()->os_kernel_tid); + event2("got signal %d @ pc=%p", sig, os_context_pc(context)); } #define RECORD_SIGNAL(sig,ctxt) if(sig!=SIGSEGV)record_signal(sig,ctxt); #else @@ -1339,10 +1363,8 @@ can_handle_now(void *handler, struct interrupt_data *data, */ if ((read_TLS(INTERRUPTS_ENABLED,thread) == NIL) || in_leaving_without_gcing_race_p(thread)) { - FSHOW_SIGNAL((stderr, - "/can_handle_now(%p,%d): deferred (RACE=%d)\n", - handler,signal, - in_leaving_without_gcing_race_p(thread))); + event3("can_handle_now(%p,%d): deferred (RACE=%d)", handler, signal, + in_leaving_without_gcing_race_p(thread)); store_signal_data_for_later(data,handler,signal,info,context); write_TLS(INTERRUPT_PENDING, T,thread); answer = 0; @@ -1351,9 +1373,7 @@ can_handle_now(void *handler, struct interrupt_data *data, * actually use its argument for anything on x86, so this branch * may succeed even when context is null (gencgc alloc()) */ else if (arch_pseudo_atomic_atomic(context)) { - FSHOW_SIGNAL((stderr, - "/can_handle_now(%p,%d): deferred(PA)\n", - handler,signal)); + event2("can_handle_now(%p,%d): deferred (PA)", handler, signal); store_signal_data_for_later(data,handler,signal,info,context); arch_set_pseudo_atomic_interrupted(context); answer = 0; @@ -1395,11 +1415,11 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, /* Test for GC_INHIBIT _first_, else we'd trap on every single * pseudo atomic until gc is finally allowed. */ if (read_TLS(GC_INHIBIT,thread) != NIL) { - FSHOW_SIGNAL((stderr, "sig_stop_for_gc deferred (*GC-INHIBIT*)\n")); + event0("stop_for_gc deferred for *GC-INHIBIT*"); write_TLS(STOP_FOR_GC_PENDING,T,thread); return; } else if (arch_pseudo_atomic_atomic(context)) { - FSHOW_SIGNAL((stderr,"sig_stop_for_gc deferred (PA)\n")); + event0("stop_for_gc deferred for PA"); write_TLS(STOP_FOR_GC_PENDING,T,thread); arch_set_pseudo_atomic_interrupted(context); maybe_save_gc_mask_and_block_deferrables @@ -1407,7 +1427,7 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, return; } - FSHOW_SIGNAL((stderr, "/sig_stop_for_gc_handler\n")); + event0("stop_for_gc"); /* Not PA and GC not inhibited -- we can stop now. */ @@ -1432,7 +1452,7 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, * GC. GC_BLOCKED_DEFERRABLES is also left at 1. So let's tidy it * up. */ if (thread_interrupt_data(thread).gc_blocked_deferrables) { - FSHOW_SIGNAL((stderr,"cleaning up after gc_blocked_deferrables\n")); + event0("cleaning up after gc_blocked_deferrables"); clear_pseudo_atomic_interrupted(thread); struct interrupt_data *interrupt_data = &thread_interrupt_data(thread); sigcopyset(os_context_sigmask_addr(context), &interrupt_data->pending_mask); @@ -1450,7 +1470,7 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, * occurs below at thread_wait_until_not(STATE_STOPPED). Note that sem_post() * is expressly permitted in signal handlers, and set_thread_state uses it */ set_thread_state(thread, STATE_STOPPED, 0); - FSHOW_SIGNAL((stderr,"suspended\n")); + event0("suspended"); /* While waiting for gc to finish occupy ourselves with zeroing * the unused portion of the control stack to reduce conservatism. @@ -1485,7 +1505,7 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, int my_state = thread_wait_until_not(STATE_STOPPED, thread); #endif - FSHOW_SIGNAL((stderr,"resumed\n")); + event0("resumed"); /* The state can't go from STOPPED to DEAD because it's this thread is reading * its own state, hence it must be running. @@ -2008,7 +2028,13 @@ void interrupt_init(void) { #ifdef ATOMIC_LOGGING - eventdata = calloc(EVENTBUFMAX, N_WORD_BYTES); + // If fetch_and_add gives us an index that is less than EVENTBUFMAX, + // we assume that there is room to record an event with up to 8 arguments + // which means the prefix, the format string, and the arguments. + eventdata = calloc(EVENTBUFMAX+10, N_WORD_BYTES); + void sigdump_eventlog(int, siginfo_t*, os_context_t*); + // pick anything not used. SIGPWR is also a good choice + ll_install_handler(SIGINFO, sigdump_eventlog); #endif int __attribute__((unused)) i; SHOW("entering interrupt_init()"); diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 6ddcb20c77..725948b197 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -50,6 +50,7 @@ #include "pseudo-atomic.h" #include "interrupt.h" #include "lispregs.h" +#include "atomiclog.inc" #ifdef LISP_FEATURE_SB_THREAD @@ -307,6 +308,22 @@ void reset_gc_stats() { // after sb-posix:fork } #endif +#ifdef ATOMIC_LOGGING +#define THREAD_NAME_MAP_MAX 20 /* KLUDGE */ +struct { + pthread_t thread; + char *name; // strdup'ed +} thread_name_map[THREAD_NAME_MAP_MAX]; +int thread_name_map_count; + +char* thread_name_from_pthread(pthread_t pointer){ + int i; + for(i=0; i<thread_name_map_count; ++i) + if (thread_name_map[i].thread == pointer) return thread_name_map[i].name; + return 0; +} +#endif + void create_main_lisp_thread(lispobj function) { #ifdef LISP_FEATURE_WIN32 InitializeCriticalSection(&all_threads_lock); @@ -552,6 +569,14 @@ void* new_thread_trampoline(void* arg) #endif } +#ifdef ATOMIC_LOGGING + char* string = strdup((char*)VECTOR(name)->data); + int index = __sync_fetch_and_add(&thread_name_map_count, 1); + gc_assert(index < THREAD_NAME_MAP_MAX); + thread_name_map[index].thread = pthread_self(); + thread_name_map[index].name = string; +#endif + struct vector* startup_info = VECTOR(lispthread->startup_info); // 'lispthread' is pinned gc_assert(header_widetag(startup_info->header) == SIMPLE_VECTOR_WIDETAG); lispobj startfun = startup_info->data[0]; // 'startup_info' is pinned @@ -1196,7 +1221,7 @@ void gc_stop_the_world() gc_assert(state != STATE_RUNNING); } } - FSHOW_SIGNAL((stderr,"/gc_stop_the_world:end\n")); + event0("/gc_stop_the_world:end"); #ifdef COLLECT_GC_STATS clock_gettime(CLOCK_MONOTONIC, &stw_end_time); stw_elapsed = (stw_end_time.tv_sec - stw_begin_time.tv_sec)*1000000000L From bc9071a375e6a6d860ada91ddee5a0d6b2c7e931 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 12 May 2022 14:49:29 -0400 Subject: [PATCH 3327/4023] Fix English double-negative --- src/runtime/interrupt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 66def239ba..41c598c29a 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1230,7 +1230,7 @@ interrupt_handle_pending(os_context_t *context) lose("pseudo_atomic_interrupted after interrupt_handle_pending"); #endif /* It is possible that the end of this function was reached - * without never actually doing anything, the tests in Lisp for + * without actually doing anything, the tests in Lisp for * when to call receive-pending-interrupt are not exact. */ FSHOW_SIGNAL((stderr, "/exiting interrupt_handle_pending\n")); } From e61b98dc5f979d1c0fbf0587d3cdea02ad5d8a89 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 12 May 2022 15:18:13 -0400 Subject: [PATCH 3328/4023] Remove QSHOW_SIGNALS and FSHOW_SIGNAL And all remarks about enabling those. Worst advice ever. The comments even say they cause more problems. ("Yo dawg, I herd u like locks so I added extra locks so you can deadlock while u deadlock") I don't know what QSHOW_SAFE was either. --- doc/internals/signals.texinfo | 5 ++- doc/manual/support-and-bugs.texinfo | 4 +-- src/cold/base-target-features.lisp-expr | 2 +- src/runtime/bsd-os.c | 2 -- src/runtime/interrupt.c | 11 ------ src/runtime/print.c | 7 ++-- src/runtime/runtime.h | 48 ++----------------------- src/runtime/safepoint.c | 10 ------ src/runtime/x86-bsd-os.c | 3 -- src/runtime/x86-darwin-os.c | 3 -- src/runtime/x86-sunos-os.c | 3 -- 11 files changed, 9 insertions(+), 89 deletions(-) diff --git a/doc/internals/signals.texinfo b/doc/internals/signals.texinfo index 9c80adb966..b0105e1a6d 100644 --- a/doc/internals/signals.texinfo +++ b/doc/internals/signals.texinfo @@ -174,7 +174,7 @@ is dangerous and best avoided. @section Debugging It is not easy to debug signal problems. The best bet probably is to -enable @code{QSHOW} and @code{QSHOW_SIGNALS} in runtime.h and once +enable @code{QSHOW} in runtime.h and once SBCL runs into problems attach gdb. A simple @code{thread apply all ba} is already tremendously useful. Another possibility is to send a SIGABRT to SBCL to provoke landing in LDB, if it's compiled with it @@ -182,5 +182,4 @@ and it has not yet done so on its own. Note, that fprintf used by QSHOW is not reentrant and at least on x86 linux it is known to cause deadlocks, so place SHOW and co carefully, -ideally to places where blockable signals are blocked. Use -@code{QSHOW_SAFE} if you like. +ideally to places where blockable signals are blocked. diff --git a/doc/manual/support-and-bugs.texinfo b/doc/manual/support-and-bugs.texinfo index b8d695b658..627871ceb7 100644 --- a/doc/manual/support-and-bugs.texinfo +++ b/doc/manual/support-and-bugs.texinfo @@ -115,9 +115,7 @@ send a useful bug report then: @item @cindex ldb Compile SBCL with ldb enabled (feature @code{:sb-ldb}, see -@file{base-target-features.lisp-expr}) and change @code{#define -QSHOW_SIGNAL 0} to @code{#define QSHOW_SIGNAL 1} in -@file{src/runtime/runtime.h}. +@file{base-target-features.lisp-expr}). @item Isolate a smallish test case, run it. diff --git a/src/cold/base-target-features.lisp-expr b/src/cold/base-target-features.lisp-expr index 804e33b2f1..a753f3c3fe 100644 --- a/src/cold/base-target-features.lisp-expr +++ b/src/cold/base-target-features.lisp-expr @@ -110,7 +110,7 @@ ; :sb-show-assem ;; Compile the C runtime with support for low-level debugging output - ;; through FSHOW and FSHOW_SIGNAL. If enabled, this feature allows + ;; through FSHOW. If enabled, this feature allows ;; users to turn on such debugging output using environment variables at ;; run-time. ; :sb-qshow diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index a7e09146dd..dbae160e1c 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -264,8 +264,6 @@ memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context) void *fault_addr = arch_get_bad_addr(signal, siginfo, context); #if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT) - FSHOW_SIGNAL((stderr, "/ TLS: restoring fs: %p in memory_fault_handler\n", - *CONTEXT_ADDR_FROM_STEM(fs))); os_restore_tls_segment_register(context); #endif diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 41c598c29a..336560a6b3 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -714,7 +714,6 @@ maybe_save_gc_mask_and_block_deferrables(sigset_t *sigset) #endif if ((!data->pending_handler) && (!data->gc_blocked_deferrables)) { - FSHOW_SIGNAL((stderr,"/setting gc_blocked_deferrables\n")); data->gc_blocked_deferrables = 1; if (sigset) { /* This is the sigmask of some context. */ @@ -1083,8 +1082,6 @@ interrupt_handle_pending(os_context_t *context) lose("Handling pending interrupt in pseudo atomic."); } - FSHOW_SIGNAL((stderr, "/entering interrupt_handle_pending\n")); - assert_blockables_blocked(); #ifndef LISP_FEATURE_SB_SAFEPOINT /* @@ -1232,7 +1229,6 @@ interrupt_handle_pending(os_context_t *context) /* It is possible that the end of this function was reached * without actually doing anything, the tests in Lisp for * when to call receive-pending-interrupt are not exact. */ - FSHOW_SIGNAL((stderr, "/exiting interrupt_handle_pending\n")); } @@ -1275,8 +1271,6 @@ interrupt_handle_now(int signal, siginfo_t *info, os_context_t *context) DX_ALLOC_SAP(context_sap, context); DX_ALLOC_SAP(info_sap, info); - FSHOW_SIGNAL((stderr,"/calling Lisp-level handler\n")); - funcall3(handler, make_fixnum(signal), info_sap, @@ -1305,7 +1299,6 @@ run_deferred_handler(struct interrupt_data *data, os_context_t *context) data->pending_handler; data->pending_handler=0; - FSHOW_SIGNAL((stderr, "/running deferred handler %p\n", pending_handler)); (*pending_handler)(data->pending_signal,&(data->pending_info), context); } @@ -1612,10 +1605,6 @@ arrange_return_to_c_function(os_context_t *context, #if defined(LISP_FEATURE_DARWIN) uint32_t *register_save_area = (uint32_t *)os_allocate(0x40); - FSHOW_SIGNAL((stderr, "/arrange_return_to_lisp_function: preparing to go to function %x, sp: %x\n", function, - *os_context_register_addr(context,reg_ESP))); - FSHOW_SIGNAL((stderr, "/arrange_return_to_lisp_function: context: %x, &context %x\n", context, &context)); - /* 1. os_validate (malloc/mmap) register_save_block * 2. copy register state into register_save_block * 3. put a pointer to register_save_block in a register in the context diff --git a/src/runtime/print.c b/src/runtime/print.c index 1dce6255aa..3417f64356 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -40,14 +40,14 @@ * * If enabled at all, environment variables control whether calls of the * form odxprint(name, ...) are enabled at run-time, e.g. using - * SBCL_DYNDEBUG="fshow fshow_signal safepoints". + * SBCL_DYNDEBUG="fshow safepoints". * - * In the case of FSHOW and FSHOW_SIGNAL, old-style code from runtime.h + * In the case of FSHOW, old-style code from runtime.h * can also be used to enable or disable these more aggressively. */ struct dyndebug_config dyndebug_config = { - QSHOW == 2, QSHOW_SIGNALS == 2 + QSHOW == 2, }; void @@ -68,7 +68,6 @@ dyndebug_init() int *ptrs[DYNDEBUG_NFLAGS]; dyndebug_init1(fshow, "FSHOW"); - dyndebug_init1(fshow_signal, "FSHOW_SIGNAL"); dyndebug_init1(gencgc_verbose, "GENCGC_VERBOSE"); dyndebug_init1(safepoints, "SAFEPOINTS"); dyndebug_init1(seh, "SEH"); diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 00d84040ce..39e006d77f 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -88,48 +88,12 @@ void gc_state_unlock(); * you are a developer and want to affect FSHOW behaviour. */ -/* Enable extra-verbose low-level debugging output for signals? (You - * probably don't want this unless you're trying to debug very early - * cold boot on a new machine, or one where you've just messed up - * signal handling.) - * - * Note: It may be that doing this is fundamentally unsound, since it - * causes output from signal handlers, and the i/o libraries aren't - * necessarily reentrant. But it can still be very convenient for - * figuring out what's going on when you have a signal handling - * problem. - * - * Possible values are: - * 0 -- Never show signal-related output. There is absolutely no - * run-time overhead from FSHOW_SIGNAL in this case. - * - * 1 -- (recommended) - * Show signal-related output only if selected at run-time - * (otherwise almost no run-time overhead). - * - * 2 -- Unconditionally show signal-related output. - * Very significant overhead. - * - * For reasons of tradition, we default to 0 on POSIX and 1 on Windows - * through :SB-QSHOW. - * - * With option 1, set up environment variable SBCL_DYNDEBUG to include - * "fshow" or "fshow_signal" before starting SBCL to enable output. - * - * There is no particular advantage to option 2 except that you do not - * need to set environment variables in this case. - */ #ifdef LISP_FEATURE_SB_QSHOW -# define QSHOW_SIGNALS 1 +# define QSHOW 1 #else -# define QSHOW_SIGNALS 0 +# define QSHOW 0 #endif -/* Enable low-level debugging output, if not zero. Defaults to enabled - * if QSHOW_SIGNALS, disabled otherwise. Change it to 1 or 2 if you want - * low-level debugging output but not the whole signal mess. */ -#define QSHOW QSHOW_SIGNALS - /* * Configuration options end here -- the following defines do not * generally need customization. @@ -148,7 +112,6 @@ void fshow_fun(void *ignored, const char *fmt, ...); * declaration and definition. */ extern struct dyndebug_config { int dyndebug_fshow; - int dyndebug_fshow_signal; int dyndebug_gencgc_verbose; int dyndebug_safepoints; int dyndebug_seh; @@ -181,13 +144,6 @@ void dyndebug_init(void); # define SHOW(string) #endif -#if QSHOW_SIGNALS -# define FSHOW_SIGNAL(args) \ - do if (dyndebug_config.dyndebug_fshow_signal) fshow_fun args; while (0) -#else -# define FSHOW_SIGNAL(args) -#endif - #ifdef _WIN64 #define AMD64_SYSV_ABI __attribute__((sysv_abi)) #else diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index bc7a485334..600926f37c 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -1000,11 +1000,6 @@ void wake_thread_impl(struct thread_instance *lispthread) void* os_get_csp(struct thread* th) { - FSHOW_SIGNAL((stderr, "Thread %p has CSP %p, stack [%p,%p]\n", - th, - (void*)csp_around_foreign_call(th), - th->control_stack_start, - th->control_stack_end)); return (void*)csp_around_foreign_call(th); } @@ -1052,11 +1047,6 @@ handle_safepoint_violation(os_context_t *ctx, os_vm_address_t fault_address) { struct thread *self = get_sb_vm_thread(); - FSHOW_SIGNAL((stderr, "fault_address = %p, sp = %p, &csp = %p\n", - fault_address, - GC_SAFEPOINT_TRAP_ADDR, csp_around_foreign_call(self))); - - if (fault_address == (os_vm_address_t) GC_SAFEPOINT_TRAP_ADDR) { #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK /* We're on the altstack and don't want to run Lisp code. */ diff --git a/src/runtime/x86-bsd-os.c b/src/runtime/x86-bsd-os.c index db25111ef0..2d1bac9a2e 100644 --- a/src/runtime/x86-bsd-os.c +++ b/src/runtime/x86-bsd-os.c @@ -176,7 +176,6 @@ int arch_os_thread_init(struct thread *thread) { perror("i386_set_ldt"); lose("unexpected i386_set_ldt(..) failure"); } - FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n)); thread->tls_cookie=n; arch_os_load_ldt(thread); #endif @@ -204,8 +203,6 @@ int arch_os_thread_cleanup(struct thread *thread) { /* Set the %%fs register back to 0 and free the ldt by setting it * to NULL. */ - FSHOW_SIGNAL((stderr, "/ TLS: Freeing LDT %x\n", n)); - __asm__ __volatile__ ("mov %0, %%fs" : : "r"(0)); i386_set_ldt(n, NULL, 1); #endif diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index aee13b2965..bba95e3185 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -78,7 +78,6 @@ int arch_os_thread_init(struct thread *thread) { } ignore_value(mutex_release(&modify_ldt_lock)); - FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", n)); thread->tls_cookie=n; arch_os_load_ldt(thread); #endif @@ -105,8 +104,6 @@ int arch_os_thread_cleanup(struct thread *thread) { /* Set the %%fs register back to 0 and free the ldt by setting it * to NULL. */ - FSHOW_SIGNAL((stderr, "/ TLS: Freeing LDT %x\n", n)); - __asm__ __volatile__ ("mov %0, %%fs" : : "r"(0)); ignore_value(mutex_acquire(&modify_ldt_lock)); i386_set_ldt(n, NULL, 1); diff --git a/src/runtime/x86-sunos-os.c b/src/runtime/x86-sunos-os.c index 8de1c4b474..1c6562f02c 100644 --- a/src/runtime/x86-sunos-os.c +++ b/src/runtime/x86-sunos-os.c @@ -95,7 +95,6 @@ int arch_os_thread_init(struct thread *thread) { #ifdef LISP_FEATURE_SB_THREAD int sel = install_segment((unsigned long) thread, dynamic_values_bytes); - FSHOW_SIGNAL((stderr, "/ TLS: Allocated LDT %x\n", sel)); __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel)); thread->tls_cookie = sel; @@ -121,8 +120,6 @@ int arch_os_thread_cleanup(struct thread *thread) { /* Set the %%fs register back to 0 and free the ldt by setting it * to NULL. */ - FSHOW_SIGNAL((stderr, "/ TLS: Freeing LDT %x\n", n)); - __asm__ __volatile__ ("mov %0, %%fs" : : "r"(0)); ignore_value(mutex_acquire(&modify_ldt_lock)); From 0153f2af7d4314c1093881e19a2313e064eb2796 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Thu, 12 May 2022 13:32:52 -0700 Subject: [PATCH 3329/4023] Mark passing test as passing. It actually does work right now, because we resolve self calls with early-binding semantics still even though we have a non-simple lexical environment. Then environment analysis will just work. --- tests/block-compile.impure.lisp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index c7212616e3..24e833cb34 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -217,10 +217,9 @@ ;; Test that we can call ourselves. (assert (= (self-call 9) 36))) -(with-test (:name :block-compile-top-level-closures.self-call.local-calls - :fails-on :sbcl) +(with-test (:name :block-compile-top-level-closures.self-call.local-calls) ;; Test that we can local call ourselves in the same environment despite - ;; being a top level closure. (Not implemented yet.) + ;; being a top level closure. (assert (not (member #'self-call (ctu:find-named-callees #'self-call))))) (with-test (:name :block-compile-top-level-closures.same-environment) From 444af7833ddc3e640b3447678e9a1479b3b3f5fa Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 13 May 2022 11:09:41 -0400 Subject: [PATCH 3330/4023] Generalize generation-of-fdefn test It can pass when pages are not pseudostatic, and doesn't really depend on presence of immobile-space. --- tests/gc.impure.lisp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index f768e79581..a84be137f6 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -147,11 +147,12 @@ ;; (assert (not (nth-value 1 (sb-kernel:make-lisp-obj (third *some-object-handles*) nil)))) (assert (string= (sb-kernel:%simple-fun-name fun) "two potayto")))) -#+immobile-space (with-test (:name :generation-of-fdefn) - ;; generation-of broke when fdefns stopped storing a generation in word 0 + ;; GENERATION-OF broke when fdefns stopped storing a generation in word 0. + ;; Normally we expect to see SB-VM:+PSEUDO-STATIC-GENERATION+ + ;; but allow for varied definition of CORE_PAGE_GENERATION. (assert (= (sb-kernel:generation-of (sb-int:find-fdefn 'car)) - sb-vm:+pseudo-static-generation+))) + (sb-kernel:generation-of #'car)))) (with-test (:name :static-fdefn-space) (sb-int:dovector (name sb-vm:+static-fdefns+) From 9410e43291b6b625ae70acf111f68ff3ae76f7bc Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 13 May 2022 11:13:40 -0400 Subject: [PATCH 3331/4023] Simplify configuration When testing x86-64 without immobile-space you now only have to remove that one feature, and the dependennt features are disabled automatically. --- make-config.sh | 2 +- src/cold/shared.lisp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/make-config.sh b/make-config.sh index 6ad1b9bb7c..b161690cff 100755 --- a/make-config.sh +++ b/make-config.sh @@ -638,7 +638,7 @@ case "$sbcl_arch" in printf ' :sb-simd-pack :sb-simd-pack-256 :avx2' >> $ltf # not mandatory case "$sbcl_os" in linux | darwin | *bsd) - printf ' :immobile-space :immobile-code :compact-instance-header' >> $ltf + printf ' :immobile-space' >> $ltf esac ;; ppc) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 17f074b499..855fe0af1a 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -281,6 +281,9 @@ ;; Win32 conditionally adds :sb-futex in grovel-features.sh (when (target-featurep '(:and :sb-thread (:or :linux :freebsd))) (pushnew :sb-futex sb-xc:*features*)) + (when (target-featurep :immobile-space) + (pushnew :compact-instance-header sb-xc:*features*) + (pushnew :immobile-code sb-xc:*features*)) (when (target-featurep :64-bit) (push :compact-symbol sb-xc:*features*)) (when (target-featurep '(:and :sb-thread (:not :win32))) From 77ef9080de16c606876d0a3e5f1bd9ba0cd5e570 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 13 May 2022 19:05:54 +0300 Subject: [PATCH 3332/4023] Correct REDUCE type derivation for singleton sequences. When it doesn't call the function. Reported by Eric Marsden. --- src/compiler/seqtran.lisp | 117 +++++++++++++++++++++----------------- tests/seq.pure.lisp | 43 ++++++++++++++ 2 files changed, 108 insertions(+), 52 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 0f53441da0..c94c215e5a 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -2820,56 +2820,69 @@ &key initial-value key + start + end &allow-other-keys)) - (let (result) - (multiple-value-bind (fun-type name) (lvar-fun-type fun) - (when (fun-type-p fun-type) - (let ((initial-value-type (and initial-value - (lvar-type initial-value)))) - ;; Calling the type deriver would be more universal, but - ;; type derivers expect a combination, but even then there's - ;; not a lot of standard functions which are usually used - ;; with REDUCE and which benefit from improved type - ;; derivation. - (when (eq name '+) - (let* ((sequence-type (lvar-type sequence)) - (element-type - (cond ((and key - (multiple-value-bind (key-type name) (lvar-fun-type key) - (cond ((eq name 'identity) - nil) - ((fun-type-p key-type) - (single-value-type (fun-type-returns key-type))) - (t - *universal-type*))))) - ((csubtypep sequence-type (specifier-type 'array)) - (array-type-upgraded-element-type sequence-type))))) - - (when (and element-type - (neq element-type *wild-type*)) - (let* ((non-empty (typep (vector-type-length sequence-type) '(integer 1))) - (identity-p (and (not initial-value) - (not non-empty)))) - (labels ((try (type) - (let ((type (specifier-type type))) - (when (csubtypep element-type type) - (setf result - (cond (identity-p - (type-union type - (specifier-type '(eql 0)))) - (initial-value - (let ((contagion (numeric-contagion type initial-value-type - :rational nil - :unsigned t))) - (if non-empty - contagion - (type-union contagion initial-value-type)))) - (t - type))))))) - (some #'try '(double-float single-float float unsigned-byte integer rational real))))))) - (unless result - (setf result (single-value-type (fun-type-returns fun-type))) - (if initial-value-type - (type-union result initial-value-type) - result))))) - result)) + (multiple-value-bind (fun-type name) (lvar-fun-type fun) + (when (fun-type-p fun-type) + (let* ((initial-value-type (and initial-value + (lvar-type initial-value))) + (sequence-type (lvar-type sequence)) + (element-type + (cond ((and key + (multiple-value-bind (key-type name) (lvar-fun-type key) + (cond ((eq name 'identity) + nil) + ((fun-type-p key-type) + (single-value-type (fun-type-returns key-type))) + (t + *universal-type*))))) + ((csubtypep sequence-type (specifier-type 'array)) + (array-type-upgraded-element-type sequence-type)))) + (end (if end + (and (constant-lvar-p end) + (or (lvar-value end) + (vector-type-length sequence-type))) + (vector-type-length sequence-type))) + (start (if start + (and (constant-lvar-p start) + (lvar-value start)) + 0)) + (length (and start end + (- end start)))) + ;; Calling the type deriver would be more universal, but + ;; type derivers expect a combination, but even then there's + ;; not a lot of standard functions which are usually used + ;; with REDUCE and which benefit from improved type + ;; derivation. + (or + (when (and (eq name '+) + element-type + (neq element-type *wild-type*) + (neq element-type *universal-type*)) + (let* ((non-empty (typep length '(integer 1))) + (identity-p (and (not initial-value) + (not non-empty)))) + (labels ((try (type) + (let ((type (specifier-type type))) + (when (csubtypep element-type type) + (cond (identity-p + (type-union type + (specifier-type '(eql 0)))) + (initial-value + (let ((contagion (numeric-contagion type initial-value-type + :rational nil + :unsigned t))) + (if non-empty + contagion + (type-union contagion initial-value-type)))) + (t + type)))))) + (some #'try '(double-float single-float float unsigned-byte integer rational real))))) + (let ((fun-result (single-value-type (fun-type-returns fun-type)))) + (cond (initial-value-type + (type-union initial-value-type fun-result)) + ((typep length '(integer 2)) + fun-result) + (element-type + (type-union fun-result element-type))))))))) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index dfe4ad2f02..d288ca623f 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -611,3 +611,46 @@ `(lambda (v s) (replace (the simple-vector v) #() :start1 s)) ((#(1) 0) #(1) :test #'equalp))) + +(with-test (:name :reduce-type-derive) + (macrolet + ((check (fun expected) + `(assert + (equal (second + (third + (sb-kernel:%simple-fun-type + (checked-compile '(lambda (x) + ,fun))))) + ',expected)))) + (check (reduce '+ x) + t) + (check (reduce '+ x :end 10) + number) + (check (reduce '+ x :initial-value 10) + number) + (check (reduce '+ (the (simple-array t (1)) x)) + t) + (check (reduce '+ (the (simple-array t (2)) x)) + number) + (check (reduce '+ (the (simple-array t (10)) x) :end 1) + t) + (check (reduce '+ (the (simple-array fixnum (*)) x)) + integer) + (check (reduce '+ (the (simple-array (unsigned-byte 8) (*)) x)) + unsigned-byte) + (check (reduce '+ (the (simple-array (unsigned-byte 8) (*)) x) :initial-value -1) + integer) + (check (reduce '+ (the (simple-array double-float (*)) x) :initial-value 1) + (or double-float (integer 1 1))) + (check (reduce '+ (the (simple-array double-float (*)) x) :initial-value 1d0) + double-float) + (check (reduce '+ (the (simple-array double-float (*)) x)) + (or double-float (integer 0 0))) + (check (reduce '+ (the (simple-array double-float (10)) x)) + double-float) + (check (reduce '+ (the (simple-array double-float (1)) x)) + double-float) + (check (reduce '+ x :key #'length) + unsigned-byte) + (check (reduce '+ x :key #'length :initial-value -1) + integer))) From acf48042ad1c6624d7a4e4d9e4d70b0d665cc0dd Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 13 May 2022 13:30:07 -0400 Subject: [PATCH 3333/4023] Fix :pseudostatic-large-objects test for 32-bit I distinctly recall that at the time I commited a change causing failure, a fix would have demanded conditionalization for #+cheneygc which I didn't want to do. But now we don't care about cheneygc. --- src/runtime/cheneygc.c | 2 +- src/runtime/gc-common.c | 31 +++++++++++------ src/runtime/gc-private.h | 4 +-- src/runtime/gencgc.c | 6 ++-- tests/allocator.pure.lisp | 70 ++++++++++++++------------------------- 5 files changed, 51 insertions(+), 62 deletions(-) diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index 8906c2d90b..baa7395ddb 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -85,7 +85,7 @@ gc_general_alloc(__attribute__((unused)) void* ignore, lispobj copy_unboxed_object(lispobj object, sword_t nwords) { return gc_copy_object(object, nwords, 0, 0); } -lispobj copy_possibly_large_object(lispobj object, sword_t nwords, +lispobj copy_potential_large_object(lispobj object, sword_t nwords, __attribute__((unused)) void* region, __attribute__((unused)) int page_type) { return gc_copy_object(object, nwords, 0, 0); diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index e2b69fd684..b3da81e5db 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -364,15 +364,24 @@ trans_code(struct code *code) gc_dcheck(widetag_of(&code->header) == CODE_HEADER_WIDETAG); /* prepare to transport the code vector */ + long nwords = code_total_nwords(code); +#ifndef LISP_FEATURE_64_BIT + /* 32-bit can allocate large code to ordinary (small object) pages + * because it uses code regions larger than LARGE_OBJECT_SIZE. + * This makes large code accidentally fit into the region. + * We can correct that problem here by closing the code region. + * This is simpler than (or more abstract than) calling gc_alloc_large() + * because whatever post-copying actions gc_copy_object() performs, + * we still want, such as the NOTE_TRANSPORTING macro invocation */ + long nbytes = nwords << WORD_SHIFT; + if (nbytes >= LARGE_OBJECT_SIZE && !page_single_obj_p(find_page_index(code))) + ensure_region_closed(code_region, PAGE_TYPE_CODE); +#endif lispobj l_code = make_lispobj(code, OTHER_POINTER_LOWTAG); - lispobj l_new_code = copy_possibly_large_object(l_code, - code_total_nwords(code), - code_region, PAGE_TYPE_CODE); + lispobj l_new_code + = copy_potential_large_object(l_code, nwords, code_region, PAGE_TYPE_CODE); -#ifdef LISP_FEATURE_GENCGC - if (l_new_code == l_code) - return code; -#endif + if (l_new_code == l_code) return code; set_forwarding_pointer((lispobj *)code, l_new_code); @@ -716,7 +725,7 @@ scav_other_pointer(lispobj *where, lispobj object) // If the object was large, then instead of transporting it, // gencgc might simply promote the pages and return the same pointer. - // That decision is made in copy_possibly_large_object(). + // That decision is made in copy_potential_large_object(). if (copy != object) { set_forwarding_pointer(first_pointer, copy); *where = copy; @@ -970,7 +979,7 @@ static sword_t scav_bignum(lispobj __attribute__((unused)) *where, lispobj heade static lispobj trans_bignum(lispobj object) { gc_dcheck(lowtag_of(object) == OTHER_POINTER_LOWTAG); - return copy_possibly_large_object(object, bignum_nwords(*native_pointer(object)), + return copy_potential_large_object(object, bignum_nwords(*native_pointer(object)), unboxed_region, PAGE_TYPE_UNBOXED); } @@ -1058,7 +1067,7 @@ trans_vector_t(lispobj object) page_type = PAGE_TYPE_UNBOXED, region = unboxed_region; else if (v->header & mask) page_type = PAGE_TYPE_SMALL_MIXED, region = small_mixed_region; - return copy_possibly_large_object(object, ALIGN_UP(length + 2, 2), region, page_type); + return copy_potential_large_object(object, ALIGN_UP(length + 2, 2), region, page_type); } static sword_t @@ -1118,7 +1127,7 @@ static inline void check_shadow_bits(__attribute((unused)) lispobj* v) { static lispobj __attribute__((unused)) trans_##name(lispobj object) { \ gc_dcheck(lowtag_of(object) == OTHER_POINTER_LOWTAG); \ sword_t length = vector_len(VECTOR(object)); \ - return copy_possibly_large_object(object, ALIGN_UP(nwords + 2, 2), \ + return copy_potential_large_object(object, ALIGN_UP(nwords + 2, 2), \ SPECIALIZED_VECTOR_ARGS); \ } \ static sword_t __attribute__((unused)) size_##name(lispobj *where) { \ diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index aa5bea8856..2236d115a4 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -34,11 +34,11 @@ gc_general_alloc(struct alloc_region* region, sword_t nbytes, int page_type) } return collector_alloc_fallback(region, nbytes, page_type); } -lispobj copy_possibly_large_object(lispobj object, sword_t nwords, +lispobj copy_potential_large_object(lispobj object, sword_t nwords, struct alloc_region*, int page_type); #else void *gc_general_alloc(void*,sword_t,int); -lispobj copy_possibly_large_object(lispobj object, sword_t nwords, +lispobj copy_potential_large_object(lispobj object, sword_t nwords, void*, int page_type); #endif diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 5a0fbf6781..9fb4516e1c 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1601,7 +1601,7 @@ void *collector_alloc_fallback(struct alloc_region* region, sword_t nbytes, int * Possibly assign different 'gen' and 'allocated' values. * * maybe_adjust_large_object() specifies 'from_space' for 'new_gen' - * and copy_possibly_large_object() specifies 'new_space' + * and copy_potential_large_object() specifies 'new_space' */ static uword_t adjust_obj_ptes(page_index_t first_page, @@ -1732,7 +1732,7 @@ static uword_t adjust_obj_ptes(page_index_t first_page, * */ lispobj -copy_possibly_large_object(lispobj object, sword_t nwords, +copy_potential_large_object(lispobj object, sword_t nwords, struct alloc_region* region, int page_type) { page_index_t first_page; @@ -3258,7 +3258,7 @@ scavenge_newspace(generation_index_t generation) * Thence: * - scavenge_newspace_full_scan visits page 1000 * - assigns 'record_new_regions_below' = 1001 - * - traces slots of FOO, calls copy_possibly_large_object(v) + * - traces slots of FOO, calls copy_potential_large_object(v) * - 'v' is promoted into gen3 * - call add_new_area on page 1300..1305 * - 1300 exceeds 1001 so we skip this area diff --git a/tests/allocator.pure.lisp b/tests/allocator.pure.lisp index 2d97229ffb..a891719d27 100644 --- a/tests/allocator.pure.lisp +++ b/tests/allocator.pure.lisp @@ -1,6 +1,6 @@ #+gencgc (progn -(defun large-object-p (x) +(defun on-large-page-p (x) (and (eq (sb-ext:heap-allocated-p x) :dynamic) (let ((flags (sb-sys:with-pinned-objects (x) @@ -10,47 +10,27 @@ 'sb-vm::flags)))) (logbitp 4 ; SINGLE_OBJECT_FLAG (ldb (byte 6 (+ #+big-endian 2)) flags))))) -(compile 'large-object-p) +(compile 'on-large-page-p) ;;; Pseudo-static large objects should retain the single-object flag -;;; This test fails on certain 32-bit architectures depending on GENCGC-CARD-BYTES. -;;; The failure stems from the line of code in gc_find_freeish_pages() -;;; at the remark "Increase the region size to avoid excessive fragmentation" -;;; as well as the order of operations in the fast version of gc_general_alloc() -;;; which always tries the currently open region before trying a large allocation. -;;; It's a harmless failure, and a solution for it is worse than allowing failure. -;;; The fix would entail some combination of three (or more) ideas: -;;; - region sizes must never be larger than LARGE-OBJECT-SIZE so that inline -;;; allocation is never "accidentally" succesful on a large object, OR -;;; - the fast path of gc_general_alloc() would always have to check object size -;;; before comparing the request against the open region, so that for objects -;;; deemed large, we ignore the open region even if it is contains enough space, -;;; and so we go straight to gc_alloc_large(), OR -;;; - code allocation can use something other than gc_general_alloc(). -;;; The last suggestion is probably the best, but I don't care to do it. -;;; The second idea slows down the fast path, and the first increases fragmentation. -;;; In the pristine core image for x68, I observed the following code page counts -;;; with and without the first fix applied: -;;; 2124 small + 55 large = 2168 total (before rev 3b137be6) -;;; 2147 small + 35 large = 2182 total (after, without either "fix") -;;; 2177 small + 55 large = 2232 total (after, with putative "fix") -;;; So as expected, we can force large code blobs to get placed on large-object pages -;;; as they should, but with no commensurate decrease in use of small-object pages. -;;; In fact the total usage goes up. This is understandable, because code blobs tend -;;; to be among the larger heap objects, making it relatively more likely that the -;;; allocator abandons the tail part of an open region and begins a new contiguous block. -;;; Larger regions are generally worse for root scavenging, so all other things equal -;;; it may be better to have more discontiguous regions versus larger regions. -;;; Or in other words, forcing the heap_scavenge() function to operate on larger ranges -;;; by opening a region of 16 pages at a time makes card marking less exact. -;;; So a failure here seems to be preferable to strict large/small separation, -;;; despite it being not very aesthetically pleasing to have the nondeterminism -;;; that sometimes puts potential large objects on non-large-object pages. -;;; The 32-bit architectures that use GENCGC-PAGE-BYTES = 65536 are unaffected -;;; by the change that took the size test out of the allocator fast path. - -(with-test (:name :pseudostatic-large-objects :fails-on (or :mips :x86)) +;;; Prior to change 3b137be67217 ("speed up trans_list"), +;;; gc_general_alloc() would always test whether it was allocating a large +;;; object via "if (nbytes >= LARGE_OBJECT_SIZE)" and in that case it would +;;; call gc_alloc_large(). It was not overwhelmingly necessary to perform the +;;; size test - which is an extra branch for almost no reason - because large +;;; objects should end up in the slow path by default. (So we only make the +;;; slow path a little slower, and speed up the fast path) +;;; However, 32-bit machines with small page size (4Kb) have a sufficiently small +;;; "large" object size that many more objects ought to be characterized as large. +;;; In conjunction with the fact that code allocation always opens allocations +;;; regions of at least 64k (= 16 pages), we find that code blobs end up in the +;;; open region by accident. This doesn't happen for the 32-bit architectures +;;; where the GENCGC-PAGE-BYTES is defined as 64KB because the minimum +;;; of 64KB is only 1 page, but a "large" object is 4 pages or more. +;;; So the fix is for trans_code() to do the size test, and then we don't +;;; slow down the general case of gc_general_alloc. +(with-test (:name :pseudostatic-large-objects) (sb-vm:map-allocated-objects (lambda (obj type size) (declare (ignore type size)) @@ -58,7 +38,7 @@ (let* ((addr (sb-kernel:get-lisp-obj-address obj)) (pte (deref sb-vm:page-table (sb-vm:find-page-index addr)))) (when (eq (slot pte 'sb-vm::gen) sb-vm:+pseudo-static-generation+) - (assert (large-object-p obj)))))) + (assert (on-large-page-p obj)))))) :dynamic)) (eval-when (:compile-toplevel :load-toplevel :execute) @@ -72,11 +52,11 @@ ;; Decreasing by 1 word isn't enough, because of padding, so decrease by 2 words (not-large-vector (make-array (- large-n-words 4)))) ;; Verify the edge case for LARGE-OBJECT-P - (assert (large-object-p definitely-large-vector)) - (assert (not (large-object-p not-large-vector))) - (assert (not (large-object-p (list 1 2))))) + (assert (on-large-page-p definitely-large-vector)) + (assert (not (on-large-page-p not-large-vector))) + (assert (not (on-large-page-p (list 1 2))))) (let ((fun (checked-compile '(lambda (&rest params) params)))) - (assert (not (large-object-p (apply fun (make-list large-n-conses))))))) + (assert (not (on-large-page-p (apply fun (make-list large-n-conses))))))) ;;; MIPS either: (1) runs for 10 minutes just in COMPILE and then croaks in the assembler ;;; due to an overly large displacement in an instruction, (2) crashes with heap exhaustion. @@ -100,4 +80,4 @@ (macrolet ((expand (n) `(list ,@(loop for i from 1 to n collect i)))) (expand #.large-n-conses))))) (list (funcall fun))) - (assert (not (large-object-p list))))) + (assert (not (on-large-page-p list))))) From fe26f25d333034b5f48931dcb17b1cdd76555a04 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 13 May 2022 14:45:50 -0400 Subject: [PATCH 3334/4023] Hand-pick the mapping from widetag symbol to string --- src/compiler/generic/early-objdef.lisp | 57 ++++++++++++++++++++++++++ src/compiler/generic/genesis.lisp | 10 +++-- src/runtime/gencgc.c | 36 ++++++++++------ 3 files changed, 88 insertions(+), 15 deletions(-) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 1185d54610..1eec5d7bea 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -290,6 +290,63 @@ unused-array-widetag ; F2 FD EA F5 )) +;;; Map each widetag symbol to a string to go in 'tagnames.h'. +;;; I didn't want to mess with the formatting of the table above. +(defparameter *widetag-string-alist* + `((bignum-widetag "bignum") + (ratio-widetag "ratio") + (single-float-widetag "sfloat") + (double-float-widetag "dfloat") + (complex-widetag "cplxnum") + (complex-single-float-widetag "cplx-sfloat") + (complex-double-float-widetag "cplx-dfloat") + (symbol-widetag "symbol") + (instance-widetag "instance") + (funcallable-instance-widetag "funinstance") + (simple-fun-widetag "simplefun") + (closure-widetag "closure") + (code-header-widetag "codeblob") + (return-pc-widetag "LRA") + (value-cell-widetag "value-cell") + (character-widetag "char") + (sap-widetag "sap") + (unbound-marker-widetag "unbound-marker") + (weak-pointer-widetag "weakptr") + (fdefn-widetag "fdefn") + (no-tls-value-marker-widetag "no-TLS-val") + (simd-pack-widetag "SIMD-pack") + (simd-pack-256-widetag "SIMD-pack256") + (filler-widetag "filler") + (simple-array-widetag "simple-array") + (simple-array-nil-widetag "simple-array-NIL") + (simple-vector-widetag "simple-vec") + (simple-bit-vector-widetag "simple-bit-vec") + (simple-array-fixnum-widetag "fixnum-vec") + (simple-array-unsigned-fixnum-widetag "Ufixnum-vec") + ;; Autogenerate the arrays. Not all values of N are used, but it's OK + ,@(loop for n in '("2" "4" "7" "8" "15" "16" "31" "32" "63" "64") + append `((,(symbolicate "SIMPLE-ARRAY-UNSIGNED-BYTE-" n "-WIDETAG") + ,(concatenate 'string "UB" n "-vec")) + (,(symbolicate "SIMPLE-ARRAY-SIGNED-BYTE-" n "-WIDETAG") + ,(concatenate 'string "SB" n "-vec")))) + (simple-array-single-float-widetag "sfloat-vec") + (simple-array-double-float-widetag "dfloat-vec") + (simple-array-complex-single-float-widetag "cplx-sfloat-vec") + (simple-array-complex-double-float-widetag "cplx-dfloat-vec") + (simple-base-string-widetag "simple-base-str") + (simple-character-string-widetag "simple-char-str") + ;; I proposed on sbcl-devel some years ago to rename "complex" to "fancy" + ;; to avoid confusion with complex numbers. That never gained traction. + (complex-base-string-widetag "fancy-base-str") + (complex-character-string-widetag "fancy-char-str") + (complex-bit-vector-widetag "fancy-bit-vec") + (complex-vector-widetag "fancy-vec") + (complex-array-widetag "fancy-array"))) + +(defun widetag-string-name (symbol) + ;; Asserting found + (the string (second (assoc symbol *widetag-string-alist*)))) + ;;; Check that INSTANCE and FUNCALLABLE-INSTANCE differ at exactly 1 bit. (eval-when (:compile-toplevel) #-64-bit (assert (= (logxor instance-widetag funcallable-instance-widetag) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 71c10e10db..56c5e8a2c3 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3189,13 +3189,17 @@ Legal values for OFFSET are -4, -8, -12, ..." collect symbol into tags finally (return (sort tags #'< :key #'symbol-value)))) (write-tags (visibility kind limit ash-count) + ;; KIND is the string "-LOWTAG" or "-WIDETAG" (format out "~%~Aconst char *~(~A~)_names[] = {~%" visibility (subseq kind 1)) (let ((tags (list-sorted-tags kind))) (dotimes (i limit) - (if (eql i (ash (or (symbol-value (first tags)) -1) ash-count)) - (format out " \"~A\"" (pretty-name (pop tags) kind)) - (format out " \"unknown [~D]\"" i)) + (let ((known (eql i (ash (or (symbol-value (first tags)) -1) ash-count)))) + (if known + (if (string= kind "-WIDETAG") + (format out " ~S" (sb-vm::widetag-string-name (pop tags))) + (format out " \"~A\"" (pretty-name (pop tags) kind))) + (format out " \"unknown [~D]\"" i))) (unless (eql i (1- limit)) (write-string "," out)) (terpri out))) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 9fb4516e1c..9a1b985e4e 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2122,19 +2122,31 @@ static void refine_ambiguous_roots() count = new_index; } gc_pin_count = count; -#if 0 - fprintf(stderr, "Sorted pin list (%d):\n", count); - for (index = 0; index < count; ++index) { - lispobj* obj = native_pointer(workspace[index]); - lispobj word = *obj; - int widetag = header_widetag(word); - if (is_header(word)) - fprintf(stderr, "%p: %d words (%s)\n", obj, - (int)sizetab[widetag](obj), widetag_names[widetag>>2]); - else - fprintf(stderr, "%p: (cons)\n", obj); + if (gencgc_verbose & 4) { + // Print in multiple columns to fit more on a screen + // and sort like 'ls' (down varying fastest) + char description[24]; + fprintf(stderr, "Sorted pin list (%d):\n", count); + const int ncolumns = 4; + int nrows = ALIGN_UP(count,ncolumns) / ncolumns; + int row, col; + for (row = 0; row < nrows; ++row) { + for (col = 0; col < ncolumns; ++col) { + int index = col * nrows + row; + if (index < count) { + lispobj* obj = native_pointer(workspace[index]); + lispobj word = *obj; + strcpy(description, "cons"); + if (is_header(word)) + snprintf(description, sizeof description, "%s,%ldw", + widetag_names[header_widetag(word)>>2], + (long)object_size(obj)); + fprintf(stderr, " %"OBJ_FMTX": %-24s", (uword_t)obj, description); + } + } + putc('\n', stderr); + } } -#endif } /* After scavenging of the roots is done, we go back to the pinned objects From e8b83622e5f8870ed381be658eb580391cd6a97f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 13 May 2022 16:06:15 -0400 Subject: [PATCH 3335/4023] x86-64: Remove remnants of MACH_EXCEPTION_HANDLER Disabled in git revision d692ebfd --- src/runtime/x86-64-arch.c | 4 +- src/runtime/x86-64-bsd-os.c | 4 - src/runtime/x86-64-darwin-os.c | 384 +-------------------------------- 3 files changed, 2 insertions(+), 390 deletions(-) diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index c8f53a4dc8..5e1e7c7936 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -421,7 +421,6 @@ sigill_handler(int __attribute__((unused)) signal, siginfo_t __attribute__((unused)) *siginfo, os_context_t *context) { unsigned char* pc = (void*)OS_CONTEXT_PC(context); -#ifndef LISP_FEATURE_MACH_EXCEPTION_HANDLER if (*(unsigned short *)pc == UD2_INST) { OS_CONTEXT_PC(context) += 2; return sigtrap_handler(signal, siginfo, context); @@ -431,7 +430,6 @@ sigill_handler(int __attribute__((unused)) signal, OS_CONTEXT_PC(context) += 1; return sigtrap_handler(signal, siginfo, context); } -#endif fake_foreign_function_call(context); #ifdef LISP_FEATURE_LINUX @@ -509,7 +507,7 @@ arch_install_interrupt_handlers() * OS I haven't tested on?) and we have to go back to the old CMU * CL way, I hope there will at least be a comment to explain * why.. -- WHN 2001-06-07 */ -#if !defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) && !defined(LISP_FEATURE_WIN32) +#ifndef LISP_FEATURE_WIN32 ll_install_handler(SIGILL , sigill_handler); ll_install_handler(SIGTRAP, sigtrap_handler); #endif diff --git a/src/runtime/x86-64-bsd-os.c b/src/runtime/x86-64-bsd-os.c index 3d7380516c..f18e391b62 100644 --- a/src/runtime/x86-64-bsd-os.c +++ b/src/runtime/x86-64-bsd-os.c @@ -137,9 +137,6 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length) } int arch_os_thread_init(struct thread *thread) { -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - mach_lisp_thread_init(thread); -#elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) /* Signal handlers are run on the control stack, so if it is exhausted * we had better use an alternate stack for whatever signal tells us * we've exhausted it */ @@ -148,7 +145,6 @@ int arch_os_thread_init(struct thread *thread) { sigstack.ss_flags = 0; sigstack.ss_size = calc_altstack_size(thread); sigaltstack(&sigstack,0); -#endif return 1; /* success */ } diff --git a/src/runtime/x86-64-darwin-os.c b/src/runtime/x86-64-darwin-os.c index 83e67a4247..3a8816330f 100644 --- a/src/runtime/x86-64-darwin-os.c +++ b/src/runtime/x86-64-darwin-os.c @@ -1,36 +1,10 @@ -#ifdef LISP_FEATURE_SB_THREAD -#include <mach/mach_init.h> -#endif - +// Not sure which headers ared really needed ... #include "thread.h" -#include "validate.h" -#include "runtime.h" -#include "interrupt.h" -#include "x86-64-darwin-os.h" -#include "x86-64-arch.h" -#include "genesis/fdefn.h" -#include "gc-internal.h" -#include "arch.h" - -#include <mach/mach.h> -#include <mach/mach_error.h> -#include <mach/mach_types.h> -#include <mach/sync_policy.h> -#include <mach/machine/thread_state.h> -#include <mach/machine/thread_status.h> #include <sys/_types.h> #include <sys/ucontext.h> -#include <pthread.h> -#include <assert.h> -#include <stdlib.h> -#include <stdio.h> #if __DARWIN_UNIX03 #include <sys/_structs.h> -#endif - -#if __DARWIN_UNIX03 - typedef struct __darwin_ucontext darwin_ucontext; #define rip __rip @@ -59,362 +33,6 @@ typedef struct ucontext darwin_ucontext; #endif -#ifdef x86_AVX_STATE64_COUNT -typedef _STRUCT_MCONTEXT_AVX64 darwin_mcontext; -#else -typedef _STRUCT_MCONTEXT64 darwin_mcontext; -#endif - -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - -void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context); -void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context); -void memory_fault_handler(int signal, siginfo_t *siginfo, - os_context_t *context); - -void -undefined_alien_handler(int signal, siginfo_t *siginfo, os_context_t *context) { - arrange_return_to_lisp_function - (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); -} - -/* This executes in the faulting thread as part of the signal - * emulation. It is passed a context with the uc_mcontext field - * pointing to a valid block of memory. */ -void build_fake_signal_context(darwin_ucontext *context, - x86_thread_state64_t *thread_state, - x86_float_state64_t *float_state) { - block_blockable_signals(&context->uc_sigmask); - context->uc_mcontext->ss = *thread_state; - context->uc_mcontext->fs = *float_state; -} - -/* This executes in the faulting thread as part of the signal - * emulation. It is effectively the inverse operation from above. */ -void update_thread_state_from_context(x86_thread_state64_t *thread_state, - x86_float_state64_t *float_state, - darwin_ucontext *context) { - *thread_state = context->uc_mcontext->ss; - *float_state = context->uc_mcontext->fs; - thread_sigmask(SIG_SETMASK, &context->uc_sigmask, NULL); -} - -boolean will_exhaust_stack(struct thread * th, x86_thread_state64_t *context, int size) { - __uint64_t sp = context->rsp - size; - - if(sp < (__uint64_t)(CONTROL_STACK_HARD_GUARD_PAGE(th) + os_vm_page_size)) { - lose("Control stack exhausted during signal emulation: PC: %llx", - context->rip); - } - - if(sp < (__uint64_t)(CONTROL_STACK_GUARD_PAGE(th) + os_vm_page_size) && - th->state_word.control_stack_guard_page_protected) { - /* We hit the end of the control stack: disable guard page - * protection so the error handler has some headroom, protect the - * previous page so that we can catch returns from the guard page - * and restore it. */ - lower_thread_control_stack_guard_page(th); - context->rsp = (__uint64_t)(CONTROL_STACK_GUARD_PAGE(th) + os_vm_page_size); - return 1; - } - return 0; -} - -/* Modify a context to push new data on its stack. */ -void push_context(uint64_t data, x86_thread_state64_t *context) -{ - uint64_t* stack_pointer = (uint64_t*)context->rsp - 1; - - context->rsp = (__uint64_t) stack_pointer; - *stack_pointer = data; -} - -void align_context_stack(x86_thread_state64_t *context) -{ - /* 16-byte align the stack. */ - context->rsp &= ~15; -} - -void *stack_allocate(struct thread * th, x86_thread_state64_t *context, size_t size) -{ - - context->rsp = context->rsp - size; - return (void*)context->rsp; -} - -void signal_emulation_wrapper(darwin_mcontext *mcontext, - int signal, - os_vm_address_t addr, - void (*handler)(int, siginfo_t *, void *)) -{ - siginfo_t siginfo; - darwin_ucontext context; - - siginfo.si_signo = signal; - siginfo.si_addr = addr; - - context.uc_mcontext = (_STRUCT_MCONTEXT64 *)mcontext; - - /* when BSD signals are fired, they mask they signals in sa_mask - which always seem to be the blockable_sigset, for us, so we - need to: - 1) save the current sigmask - 2) block blockable signals - 3) call the signal handler - 4) restore the sigmask */ - - block_blockable_signals(&context.uc_sigmask); - - handler(signal, &siginfo, &context); - - thread_sigmask(SIG_SETMASK, &context.uc_sigmask, NULL); - - /* Trap to restore the signal context. */ - asm volatile (".quad 0xffffffffffff0b0f" - : : "a" (mcontext)); -} - -void call_signal_emulator_in_context(x86_thread_state64_t *context, - darwin_mcontext *mcontext, - int signal, - os_vm_address_t addr, - void* handler) -{ - - align_context_stack(context); - push_context(context->rip, context); - context->rdi = (uint64_t) mcontext; - context->rsi = signal; - context->rdx = (uint64_t) addr; - context->rcx = (uint64_t) handler; - - context->rip = (uint64_t) signal_emulation_wrapper; -} - -/* Call CONTROL_STACK_EXHAUSTED_ERROR directly, without emulating - signals. It doesn't need any signal contexts and it's better to use - as little stack as possible. */ -void call_stack_exhausted_in_context(x86_thread_state64_t *context) -{ - align_context_stack(context); - push_context(context->rip, context); - context->rdi = (uint64_t) StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR); - context->rip = (uint64_t) funcall0; -} - -#if defined DUMP_CONTEXT -void dump_context(x86_thread_state64_t *context) -{ - int i; - uint64_t *stack_pointer; - - printf("rax: %08lx rcx: %08lx rdx: %08lx rbx: %08lx\n", - context->rax, context->rcx, context->rdx, context->rbx); - printf("rsp: %08lx rbp: %08lx rsi: %08lx rdi: %08lx\n", - context->rsp, context->rbp, context->rsi, context->rdi); - printf("rip: %08lx eflags: %08lx\n", - context->rip, context->rflags); - printf("cs: %04hx ds: %04hx es: %04hx " - "ss: %04hx fs: %04hx gs: %04hx\n", - context->cs, context->ds, context->rs, - context->ss, context->fs, context->gs); - - stack_pointer = (uint64_t *)context->rsp; - for (i = 0; i < 48; i+=4) { - printf("%08x: %08x %08x %08x %08x\n", - context->rsp + (i * 4), - stack_pointer[i], - stack_pointer[i+1], - stack_pointer[i+2], - stack_pointer[i+3]); - } -} -#endif - -kern_return_t -catch_exception_raise(mach_port_t exception_port, - mach_port_t thread, - mach_port_t task, - exception_type_t exception, - exception_data_t code_vector, - mach_msg_type_number_t code_count) -{ - kern_return_t ret = KERN_SUCCESS, dealloc_ret; - int signal, rip_offset = 0; - void (*handler)(int, siginfo_t *, os_context_t *); - - x86_thread_state64_t thread_state; - mach_msg_type_number_t thread_state_count = x86_THREAD_STATE64_COUNT; - -#ifdef x86_AVX_STATE64_COUNT - mach_msg_type_number_t float_state_count = avx_supported? x86_AVX_STATE64_COUNT : x86_FLOAT_STATE64_COUNT; - int float_state_flavor = avx_supported? x86_AVX_STATE64 : x86_FLOAT_STATE64; -#else - mach_msg_type_number_t float_state_count = x86_FLOAT_STATE64_COUNT; - int float_state_flavor = x86_FLOAT_STATE64; -#endif - - x86_exception_state64_t exception_state; - mach_msg_type_number_t exception_state_count = x86_EXCEPTION_STATE64_COUNT; - - x86_thread_state64_t backup_thread_state; - - os_vm_address_t addr; - - thread_get_state(thread, x86_EXCEPTION_STATE64, - (thread_state_t)&exception_state, &exception_state_count); - - if (code_count && exception == EXC_BAD_ACCESS && code_vector[0] == EXC_I386_GPFLT) { - /* This can happen for addresses larger than 48 bits, - resulting in bogus faultvaddr. */ - addr = NULL; - } else { - addr = (void*)exception_state.faultvaddr; - } - - /* Just need to unprotect the page and do some bookkeeping, no need - * to run it from the faulting thread. - * And because the GC uses signals to stop the world it might - * interfere with that bookkeeping, because there's a window - * before block_blockable_signals is performed. */ - if (exception == EXC_BAD_ACCESS && gencgc_handle_wp_violation(addr)) { - goto do_not_handle; - } - - struct thread *th; - - FSHOW((stderr,"/entering catch_exception_raise with exception: %d\n", exception)); - if (mach_port_get_context(mach_task_self(), exception_port, (mach_vm_address_t *)&th) - != KERN_SUCCESS) { - lose("Can't find the thread for an exception %u", exception_port); - } - thread_get_state(thread, x86_THREAD_STATE64, - (thread_state_t)&thread_state, &thread_state_count); - - boolean stack_unprotected = 0; - - switch (exception) { - - case EXC_BAD_ACCESS: - signal = SIGBUS; - - if(addr >= CONTROL_STACK_RETURN_GUARD_PAGE(th) && - addr < CONTROL_STACK_RETURN_GUARD_PAGE(th) + os_vm_page_size) { - /* We're returning from the guard page: reprotect it, and - * unprotect this one. This works even if we somehow missed - * the return-guard-page, and hit it on our way to new - * exhaustion instead. */ - reset_thread_control_stack_guard_page(th); - goto do_not_handle; - } - - /* note the os_context hackery here. When the signal handler returns, - * it won't go back to what it was doing ... */ - if(addr >= CONTROL_STACK_GUARD_PAGE(th) && - addr < CONTROL_STACK_GUARD_PAGE(th) + os_vm_page_size) { - /* We hit the end of the control stack: disable guard page - * protection so the error handler has some headroom, protect the - * previous page so that we can catch returns from the guard page - * and restore it. */ - lower_thread_control_stack_guard_page(th); - stack_unprotected = 1; - } - else if (addr >= undefined_alien_address && - addr < undefined_alien_address + os_vm_page_size) { - handler = undefined_alien_handler; - } else { - handler = memory_fault_handler; - } - break; - case EXC_BAD_INSTRUCTION: - - if (*((uint64_t *)thread_state.rip) == 0xffffffffffff0b0f) { - /* Fake sigreturn. See the end of signal_emulation_wrapper() */ - - /* Apply any modifications done to the context, */ - - darwin_mcontext *mcontext = (darwin_mcontext *) thread_state.rax; - - thread_set_state(thread, x86_THREAD_STATE64, - (thread_state_t) &mcontext->ss, thread_state_count); - thread_set_state(thread, float_state_flavor, - (thread_state_t) &mcontext->fs, float_state_count); - goto do_not_handle; - } else if (*((unsigned short *)thread_state.rip) == 0x0b0f) { - signal = SIGTRAP; - rip_offset = 2; - handler = sigtrap_handler; - } else { - signal = SIGILL; - handler = sigill_handler; - } - - break; - case EXC_BREAKPOINT: - if (single_stepping) { - signal = SIGTRAP; - /* Clear TF or the signal emulation wrapper won't proceed - with single stepping enabled. */ - thread_state.rflags &= ~0x100; - handler = sigtrap_handler; - break; - } else if (*(unsigned char*)(thread_state.rip-1) == 0xCC) { - signal = SIGTRAP; - handler = sigtrap_handler; - break; - } - default: - ret = KERN_INVALID_RIGHT; - goto do_not_handle; - } - - backup_thread_state = thread_state; - - /* The ABI has a 128-byte red zone. */ - stack_allocate(th, &thread_state, 128); - - if (will_exhaust_stack(th, &thread_state, - /* Won't be passing much to stack_exhausted_error */ - stack_unprotected ? N_WORD_BYTES*4 : - ALIGN_UP(sizeof(darwin_mcontext) + - N_WORD_BYTES, /* return address */ - N_WORD_BYTES*2)) - || stack_unprotected) { - call_stack_exhausted_in_context(&thread_state); - } else { - - darwin_mcontext *mcontext = stack_allocate(th, &thread_state, sizeof(darwin_mcontext)); - - backup_thread_state.rip += rip_offset; - mcontext->ss = backup_thread_state; - - thread_get_state(thread, float_state_flavor, (thread_state_t) &mcontext->fs, &float_state_count); - - call_signal_emulator_in_context(&thread_state, - mcontext, - signal, - addr, - handler); - } - - thread_set_state(thread, x86_THREAD_STATE64, - (thread_state_t)&thread_state, thread_state_count); - do_not_handle: - - dealloc_ret = mach_port_deallocate (mach_task_self(), thread); - if (dealloc_ret) { - lose("mach_port_deallocate (thread) failed with return_code %d", dealloc_ret); - } - - dealloc_ret = mach_port_deallocate (mach_task_self(), task); - if (dealloc_ret) { - lose("mach_port_deallocate (task) failed with return_code %d", dealloc_ret); - } - - return ret; -} -#endif - void set_thread_stack(void *address) { /* KLUDGE: There is no interface to change the stack location of the initial thread, and without that backtrace(3) returns zero From 2a371029b32bbee89f768dc9e2f9c974d18d0fdf Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 14 May 2022 01:29:37 +0300 Subject: [PATCH 3336/4023] Fix darwin-x86-64-no-sb-thread build. --- src/runtime/x86-64-darwin-os.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime/x86-64-darwin-os.c b/src/runtime/x86-64-darwin-os.c index 3a8816330f..2179472827 100644 --- a/src/runtime/x86-64-darwin-os.c +++ b/src/runtime/x86-64-darwin-os.c @@ -1,7 +1,8 @@ -// Not sure which headers ared really needed ... +// Not sure which headers are really needed ... #include "thread.h" #include <sys/_types.h> #include <sys/ucontext.h> +#include <pthread.h> #if __DARWIN_UNIX03 #include <sys/_structs.h> From 4dd9243ff10dd184de05b41f1b51fe963e079fdb Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 13 May 2022 21:53:29 -0400 Subject: [PATCH 3337/4023] Skip a type-check --- src/code/symbol.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index c8deed30bd..32339838b0 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -204,9 +204,11 @@ distinct from the global value. Can also be SETF." (defun symbol-plist (symbol) "Return SYMBOL's property list." (let ((list (symbol-%info symbol))) + ;; The compiler can't possibly know that the CAR of LIST + ;; is also a list (if LIST is a LIST), so force it with a TRULY-THE. ;; See the comments above UPDATE-SYMBOL-INFO for a ;; reminder as to why this logic is right. - (if (%instancep list) nil (car list)))) + (if (%instancep list) nil (truly-the list (car list))))) (declaim (ftype (sfunction (symbol t) cons) %ensure-plist-holder) (inline %ensure-plist-holder)) From 99c0a8b68fedaed46b58432b0908614611042f8f Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Fri, 13 May 2022 20:27:03 -0700 Subject: [PATCH 3338/4023] Fix typo. --- src/compiler/ir1tran.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index f1304b8139..28fd9ff263 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1873,7 +1873,7 @@ (old (gethash name free-vars))) (when old (ecase (global-var-kind old) - (:special :global) + ((:special :global)) (:unknown (setf (gethash name free-vars) (make-global-var :%source-name name :type (leaf-type old) From 1f243c889499a0f22237a5cf99760b428995c82b Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Fri, 13 May 2022 21:14:46 -0700 Subject: [PATCH 3339/4023] Turn on disassemble annotate by default. It is incredibly useful if even just to see where basic blocks are delineated. Bcause the variable is not documented in the manual, it is not discoverable by default for users unless we turn it on by default. --- src/compiler/target-disassem.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index 45e035342f..80f84480e7 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -1797,7 +1797,7 @@ )))) (no-debug-blocks () nil))))) -(defvar *disassemble-annotate* nil +(defvar *disassemble-annotate* t "Annotate DISASSEMBLE output with source code.") (defun add-debugging-hooks (segment debug-fun &optional sfcache) From 51b1b2d12b4b4d7f63f9931fef296d01eed3c4f4 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 14 May 2022 00:06:04 -0700 Subject: [PATCH 3340/4023] Fix variable type proclamation scoping with block compilation. To do this, we need to start IR1 converting all special variable references into REFs again. We changed this in the past to avoid eliding the boundp check, but this can be simply done by making sure not to flush references to potentially unbound variables while flushing dead code, since that's the only place we can in fact flush dead code. That obviates the need to have separate SYMEVAL and SYM-GLOBAL-VAL aliases, so remove them as well. --- src/cold/exports.lisp | 2 - src/compiler/arm/cell.lisp | 8 +- src/compiler/arm64/cell.lisp | 10 +-- src/compiler/fndb.lisp | 8 +- src/compiler/ir1opt.lisp | 5 +- src/compiler/ir1tran.lisp | 115 +++++++++++++++-------------- src/compiler/ir1util.lisp | 9 +++ src/compiler/ir2opt.lisp | 18 ++--- src/compiler/ir2tran.lisp | 16 ++-- src/compiler/knownfun.lisp | 4 +- src/compiler/mips/cell.lisp | 8 +- src/compiler/ppc/cell.lisp | 12 +-- src/compiler/ppc64/cell.lisp | 8 +- src/compiler/riscv/cell.lisp | 10 +-- src/compiler/sparc/cell.lisp | 8 +- src/compiler/srctran.lisp | 13 ++-- src/compiler/x86-64/cell.lisp | 10 +-- src/compiler/x86/cell.lisp | 12 +-- src/compiler/xref.lisp | 2 +- src/interpreter/special-forms.lisp | 3 - tests/block-compile.impure.lisp | 40 ++++++---- tests/compiler-2.pure.lisp | 2 +- 22 files changed, 175 insertions(+), 148 deletions(-) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 0be97a7777..c5f91bd2bd 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2310,8 +2310,6 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "SUB-GC" "SYMBOL-TLS-INDEX" "SYMBOLS-DESIGNATOR" - "SYMEVAL" - "SYM-GLOBAL-VAL" "%INSTANCE-LENGTH" "%INSTANCE-REF" "%INSTANCE-REF-EQ" "%INSTANCE-SET" diff --git a/src/compiler/arm/cell.lisp b/src/compiler/arm/cell.lisp index 1add9a551b..681328b423 100644 --- a/src/compiler/arm/cell.lisp +++ b/src/compiler/arm/cell.lisp @@ -51,7 +51,7 @@ ;;; With Symbol-Value, we check that the value isn't the trap object. ;;; (define-vop (symbol-value checked-cell-ref) - (:translate symeval) + (:translate symbol-value) (:generator 9 (move obj-temp object) (loadw value obj-temp symbol-value-slot other-pointer-lowtag) @@ -75,7 +75,7 @@ (define-vop (fast-symbol-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate symeval)) + (:translate symbol-value)) (define-vop (symbol-hash) (:policy :fast-safe) @@ -95,9 +95,9 @@ ;;; On unithreaded builds these are just copies of the non-global versions. (define-vop (%set-symbol-global-value set)) (define-vop (symbol-global-value symbol-value) - (:translate sym-global-val)) + (:translate symbol-global-value)) (define-vop (fast-symbol-global-value fast-symbol-value) - (:translate sym-global-val)) + (:translate symbol-global-value)) ;;;; Fdefinition (fdefn) objects. diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 1902ba86db..0a8cd703b6 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -87,7 +87,7 @@ DONE)) (define-vop (symbol-value checked-cell-ref) - (:translate symeval) + (:translate symbol-value) (:args (symbol :scs (descriptor-reg) :to :save :load-if (not (and (sc-is symbol constant) (or (symbol-always-has-tls-value-p (tn-value symbol)) @@ -140,7 +140,7 @@ (define-vop (set cell-set) (:variant symbol-value-slot other-pointer-lowtag)) (define-vop (symbol-value checked-cell-ref) - (:translate symeval) + (:translate symbol-value) (:generator 9 (loadw value object symbol-value-slot other-pointer-lowtag) (let ((err-lab (generate-error-code vop 'unbound-symbol-error object))) @@ -149,7 +149,7 @@ (define-vop (fast-symbol-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate symeval))) + (:translate symbol-value))) (define-vop (boundp) (:args (object :scs (descriptor-reg))) @@ -180,11 +180,11 @@ (define-vop (fast-symbol-global-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate sym-global-val)) + (:translate symbol-global-value)) (define-vop (symbol-global-value) (:policy :fast-safe) - (:translate sym-global-val) + (:translate symbol-global-value) (:args (object :scs (descriptor-reg) :to (:result 1))) (:results (value :scs (descriptor-reg any-reg))) (:vop-var vop) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 23e1084b1b..899d58b96f 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -111,8 +111,8 @@ ;;; This is not FLUSHABLE, since it's required to signal an error if ;;; unbound. -(defknown (symbol-value symeval) (symbol) t () - :derive-type #'symeval-derive-type) +(defknown symbol-value (symbol) t () + :derive-type #'symbol-value-derive-type) (defknown about-to-modify-symbol-value (symbol t &optional t t) null ()) ;;; From CLHS, "If the symbol is globally defined as a macro or a @@ -1791,8 +1791,8 @@ ;;;; miscellaneous extensions -(defknown (symbol-global-value sym-global-val) (symbol) t () - :derive-type #'symeval-derive-type) +(defknown symbol-global-value (symbol) t () + :derive-type #'symbol-value-derive-type) (defknown set-symbol-global-value (symbol t) t () :derive-type #'result-type-last-arg) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index dfc66e68d8..fa0245f568 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -575,8 +575,9 @@ (delete-lvar-use other-node))) (typecase node (ref - (delete-ref node) - (unlink-node node)) + (when (flushable-reference-p node) + (delete-ref node) + (unlink-node node))) (combination (when (and (not (node-tail-p node)) (flushable-combination-p node)) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 28fd9ff263..6a1ffe3d71 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -693,50 +693,39 @@ (defun ir1-convert-var (start next result name) (declare (type ctran start next) (type (or lvar null) result) (symbol name)) (let ((var (or (lexenv-find name vars) (find-free-var name)))) - (if (and (global-var-p var) (not (always-boundp name))) - ;; KLUDGE: If the variable may be unbound, convert using SYMEVAL - ;; which is not flushable, so that unbound dead variables signal an - ;; error (bug 412, lp#722734): checking for null RESULT is not enough, - ;; since variables can become dead due to later optimizations. - (ir1-convert start next result - (case (global-var-kind var) - (:global `(sym-global-val ',name)) - (:unknown - (when (not (deprecated-thing-p 'variable name)) - (note-undefined-reference name :variable)) - `(symeval ',name)) - (t - `(symeval ',name)))) - (etypecase var - (leaf - (cond - ((lambda-var-p var) - (let ((home (ctran-home-lambda-or-null start))) - (when (and home (neq (lambda-var-home var) home)) - (sset-adjoin var (lambda-calls-or-closes home)))) - (when (lambda-var-ignorep var) - ;; (ANSI's specification for the IGNORE declaration requires - ;; that this be a STYLE-WARNING, not a full WARNING.) - #-sb-xc-host - (compiler-style-warn "reading an ignored variable: ~S" name) - ;; there's no need for us to accept ANSI's lameness when - ;; processing our own code, though. - #+sb-xc-host - (warn "reading an ignored variable: ~S" name)))) - (reference-leaf start next result var name)) - ((cons (eql macro)) ; symbol-macro - ;; FIXME: the following comment is probably wrong now. - ;; If we warn here on :early and :late deprecation - ;; then we get an extra warning somehow. - ;; This case signals {EARLY,LATE,FINAL}-DEPRECATION-WARNING - ;; for symbol-macros. Includes variables, constants, - ;; etc. in :FINAL deprecation. - (when (eq (deprecated-thing-p 'variable name) :final) - (check-deprecated-thing 'variable name)) - ;; FIXME: [Free] type declarations. -- APD, 2002-01-26 - (ir1-convert start next result (cdr var))) - (heap-alien-info - (ir1-convert start next result `(%heap-alien ',var)))))) + (etypecase var + (leaf + (when (lambda-var-p var) + (let ((home (ctran-home-lambda-or-null start))) + (when (and home (neq (lambda-var-home var) home)) + (sset-adjoin var (lambda-calls-or-closes home)))) + (when (lambda-var-ignorep var) + ;; (ANSI's specification for the IGNORE declaration requires + ;; that this be a STYLE-WARNING, not a full WARNING.) + #-sb-xc-host + (compiler-style-warn "reading an ignored variable: ~S" name) + ;; there's no need for us to accept ANSI's lameness when + ;; processing our own code, though. + #+sb-xc-host + (warn "reading an ignored variable: ~S" name))) + (when (and (global-var-p var) + (eq (global-var-kind var) :unknown) + (not (deprecated-thing-p 'variable name))) + (note-undefined-reference name :variable)) + (reference-leaf start next result var name)) + ((cons (eql macro)) ; symbol-macro + ;; FIXME: the following comment is probably wrong now. + ;; If we warn here on :early and :late deprecation + ;; then we get an extra warning somehow. + ;; This case signals {EARLY,LATE,FINAL}-DEPRECATION-WARNING + ;; for symbol-macros. Includes variables, constants, + ;; etc. in :FINAL deprecation. + (when (eq (deprecated-thing-p 'variable name) :final) + (check-deprecated-thing 'variable name)) + ;; FIXME: [Free] type declarations. -- APD, 2002-01-26 + (ir1-convert start next result (cdr var))) + (heap-alien-info + (ir1-convert start next result `(%heap-alien ',var))))) (values)) ;;; Find a compiler-macro for a form, taking FUNCALL into account. @@ -944,19 +933,13 @@ ;;; instrumentation for? (defun step-form-p (form) (flet ((step-symbol-p (symbol) - ;; Consistent treatment of *FOO* vs (SYMBOL-VALUE '*FOO*): - ;; we insert calls to SYMEVAL for most non-lexical - ;; variable references in order to avoid them being elided - ;; if the value is unused. - (if (member symbol '(symeval sym-global-val)) - (not (constantp (second form))) - (not (member (sb-xc:symbol-package symbol) - (load-time-value - ;; KLUDGE: packages we're not interested in - ;; stepping. - (mapcar #'find-package '(sb-c sb-int sb-impl - sb-kernel sb-pcl)) - t)))))) + (not (member (sb-xc:symbol-package symbol) + (load-time-value + ;; KLUDGE: packages we're not interested in + ;; stepping. + (mapcar #'find-package '(sb-c sb-int sb-impl + sb-kernel sb-pcl)) + t))))) (and *allow-instrumenting* (policy *lexenv* (= insert-step-conditions 3)) (listp form) @@ -1843,6 +1826,21 @@ (dolist (name names) (process-1-ftype-proclamation name type)))) +;;; Replace each old var entry with one having the new type. +(defun process-type-proclamation (spec names) + (declare (list names)) + (let ((free-vars (free-vars *ir1-namespace*)) + (type (specifier-type spec))) + (dolist (name names) + (let ((var (gethash name free-vars))) + (etypecase var + (null) + (global-var + (setf (gethash name free-vars) + (make-global-var :%source-name name + :type type :where-from :declared + :kind (global-var-kind var))))))))) + ;;; Similar in effect to FTYPE, but change the :INLINEP. Copying the ;;; global-var ensures that when we substitute a functional for a ;;; global var (i.e. for DEFUN) that we won't clobber any uses @@ -1887,5 +1885,8 @@ (ftype (destructuring-bind (spec &rest args) args (process-ftype-proclamation spec args))) + (type + (destructuring-bind (spec &rest args) args + (process-type-proclamation spec args))) ((inline notinline maybe-inline) (process-inline-proclamation kind args)))) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 2f6897f921..645c24dd0b 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -625,6 +625,15 @@ (awhen (node-lvar node) (lvar-dynamic-extent it))) +;; If there's a possibility the variable might be unbound, then its +;; references are unflushable. +(defun flushable-reference-p (node) + (let ((leaf (ref-leaf node))) + (not (and (global-var-p leaf) + (member (global-var-kind leaf) + '(:special :global :unknown)) + (not (always-boundp (leaf-source-name leaf))))))) + (defun flushable-callable-arg-p (name arg-count) (typecase name (null diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index a7ee65ccd4..bd33e6212c 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -608,20 +608,20 @@ (let* ((successors (ir2block-successors (vop-block next))) (info (vop-codegen-info next)) (label-block (gethash (car info) *2block-info*)) - (symeval-vop + (symbol-value-vop (ir2-block-start-vop (cond ((eq (second info) nil) label-block) ; not negated test. ;; When negated, the BOUNDP case goes to the "other" successor ;; block, i.e. whichever is not started by the #<label>. ((eq label-block (first successors)) (second successors)) (t (first successors)))))) - (when (and symeval-vop - (or (eq (vop-name symeval-vop) 'symbol-value) + (when (and symbol-value-vop + (or (eq (vop-name symbol-value-vop) 'symbol-value) ;; Expect SYMBOL-GLOBAL-VALUE only for variables of kind :GLOBAL. - (and (eq (vop-name symeval-vop) 'symbol-global-value) + (and (eq (vop-name symbol-value-vop) 'symbol-global-value) (constant-tn-p sym) (eq (info :variable :kind (tn-value sym)) :global))) - (eq sym (tn-ref-tn (vop-args symeval-vop))) + (eq sym (tn-ref-tn (vop-args symbol-value-vop))) ;; If the symbol is either a compile-time known symbol, ;; or can only be the same thing for both vops, ;; then we're fine to combine. @@ -632,11 +632,11 @@ ;; Technically we could split the IR2 block and peel off the SYMBOL-VALUE, ;; and if coming from the BRANCH-IF, jump to the block that contained ;; everything else except the SYMBOL-VALUE vop. - (not (cdr (ir2block-predecessors (vop-block symeval-vop))))) - (let ((replacement (if (eq (vop-name symeval-vop) 'symbol-global-value) + (not (cdr (ir2block-predecessors (vop-block symbol-value-vop))))) + (let ((replacement (if (eq (vop-name symbol-value-vop) 'symbol-global-value) 'fast-symbol-global-value 'fast-symbol-value)) - (result-tn (tn-ref-tn (vop-results symeval-vop)))) + (result-tn (tn-ref-tn (vop-results symbol-value-vop)))) (emit-and-insert-vop (vop-node vop) (vop-block vop) (template-or-lose replacement) (reference-tn sym nil) (reference-tn result-tn t) next) @@ -649,7 +649,7 @@ ;; BRANCH-IF test is automagically correct after substitution. ;; Of course, this is machine-dependent. (delete-vop vop) - (delete-vop symeval-vop) + (delete-vop symbol-value-vop) next))))) ;;; Optimize (if x ... nil) to reuse the NIL coming from X. diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index a18cede47b..f3b6430bff 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -2331,11 +2331,17 @@ not stack-allocated LVAR ~S." source-lvar))))) (do-nodes (node lvar block) (etypecase node (ref - (when lvar - (let ((2lvar (lvar-info lvar))) - ;; function REF in a local call is not annotated - (when (and 2lvar (not (eq (ir2-lvar-kind 2lvar) :delayed))) - (ir2-convert-ref node 2block))))) + (if lvar + (let ((2lvar (lvar-info lvar))) + ;; function REF in a local call is not annotated + (when (and 2lvar (not (eq (ir2-lvar-kind 2lvar) :delayed))) + (ir2-convert-ref node 2block))) + (when (not (flushable-reference-p node)) + (aver (global-var-p (ref-leaf node))) + ;; convert for effect only + (ir2-convert-global-var node 2block (ref-leaf node) + (make-normal-tn + *backend-t-primitive-type*))))) (combination (let ((kind (basic-combination-kind node))) (ecase kind diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index fd47f6764d..1fae224f5b 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -274,10 +274,10 @@ ;;;; generic type inference methods -(defun symeval-derive-type (node &aux (args (basic-combination-args node)) +(defun symbol-value-derive-type (node &aux (args (basic-combination-args node)) (lvar (pop args))) (unless (and lvar (endp args)) - (return-from symeval-derive-type)) + (return-from symbol-value-derive-type)) (if (constant-lvar-p lvar) (let* ((sym (lvar-value lvar)) (var (maybe-find-free-var sym)) diff --git a/src/compiler/mips/cell.lisp b/src/compiler/mips/cell.lisp index 787645df5c..0b8a447e6f 100644 --- a/src/compiler/mips/cell.lisp +++ b/src/compiler/mips/cell.lisp @@ -55,7 +55,7 @@ ;;; With Symbol-Value, we check that the value isn't the trap object. ;;; (define-vop (symbol-value checked-cell-ref) - (:translate symeval) + (:translate symbol-value) (:generator 9 (move obj-temp object) (loadw value obj-temp symbol-value-slot other-pointer-lowtag) @@ -84,7 +84,7 @@ (define-vop (fast-symbol-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate symeval)) + (:translate symbol-value)) (define-vop (symbol-hash) (:policy :fast-safe) @@ -105,9 +105,9 @@ ;;; On unithreaded builds these are just copies of the non-global versions. (define-vop (%set-symbol-global-value set)) (define-vop (symbol-global-value symbol-value) - (:translate sym-global-val)) + (:translate symbol-global-value)) (define-vop (fast-symbol-global-value fast-symbol-value) - (:translate sym-global-val)) + (:translate symbol-global-value)) ;;;; Fdefinition (fdefn) objects. diff --git a/src/compiler/ppc/cell.lisp b/src/compiler/ppc/cell.lisp index 89ad7b64c9..4bd9d1a353 100644 --- a/src/compiler/ppc/cell.lisp +++ b/src/compiler/ppc/cell.lisp @@ -107,7 +107,7 @@ ;;; With SYMBOL-VALUE, we check that the value isn't the trap object. (define-vop (symbol-global-value checked-cell-ref) - (:translate sym-global-val) + (:translate symbol-global-value) (:generator 9 (move obj-temp object) (loadw value obj-temp symbol-value-slot other-pointer-lowtag) @@ -118,7 +118,7 @@ (define-vop (fast-symbol-global-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate sym-global-val)) + (:translate symbol-global-value)) #+sb-thread (progn @@ -139,7 +139,7 @@ ;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value) - (:translate symeval) + (:translate symbol-value) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:result 1))) (:results (value :scs (descriptor-reg any-reg))) @@ -162,7 +162,7 @@ ;; unbound", which is used in the implementation of COPY-SYMBOL. -- ;; CSR, 2003-04-22 (:policy :fast) - (:translate symeval) + (:translate symbol-value) (:generator 8 (loadw value object symbol-tls-index-slot other-pointer-lowtag) (inst lwzx value thread-base-tn value) @@ -175,9 +175,9 @@ #-sb-thread (progn (define-vop (symbol-value symbol-global-value) - (:translate symeval)) + (:translate symbol-value)) (define-vop (fast-symbol-value fast-symbol-global-value) - (:translate symeval)) + (:translate symbol-value)) (define-vop (set %set-symbol-global-value))) ;;; Like CHECKED-CELL-REF, only we are a predicate to see if the cell diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index 16526d5d23..65b59cc491 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -161,7 +161,7 @@ ;;; With SYMBOL-VALUE, we check that the value isn't the trap object. (define-vop (symbol-global-value checked-cell-ref) - (:translate sym-global-val) + (:translate symbol-global-value) (:generator 9 ;; TODO: can this be made branchless somehow? (inst cmpld object null-tn) @@ -179,7 +179,7 @@ (define-vop (fast-symbol-global-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate sym-global-val) + (:translate symbol-global-value) (:ignore offset lowtag) (:generator 7 (inst cmpld object null-tn) @@ -210,7 +210,7 @@ ;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value) - (:translate symeval) + (:translate symbol-value) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:result 1))) (:results (value :scs (descriptor-reg any-reg))) @@ -239,7 +239,7 @@ ;; unbound", which is used in the implementation of COPY-SYMBOL. -- ;; CSR, 2003-04-22 (:policy :fast) - (:translate symeval) + (:translate symbol-value) (:generator 8 (inst cmpld object null-tn) (inst beq NULL) diff --git a/src/compiler/riscv/cell.lisp b/src/compiler/riscv/cell.lisp index 6f570edf53..e0700b0e84 100644 --- a/src/compiler/riscv/cell.lisp +++ b/src/compiler/riscv/cell.lisp @@ -121,7 +121,7 @@ ;;; With Symbol-Value, we check that the value isn't the trap object. #+sb-thread (define-vop (symbol-value checked-cell-ref) - (:translate symeval) + (:translate symbol-value) (:temporary (:scs (interior-reg)) lip) (:variant-vars check-boundp) (:variant t) @@ -140,7 +140,7 @@ #-sb-thread (define-vop (symbol-value checked-cell-ref) - (:translate symeval) + (:translate symbol-value) (:generator 9 (loadw value object symbol-value-slot other-pointer-lowtag) (let ((err-lab (generate-error-code vop 'unbound-symbol-error object))) @@ -188,14 +188,14 @@ (define-vop (fast-symbol-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate symeval)) + (:translate symbol-value)) ;;; On unithreaded builds these are just copies of the non-global versions. (define-vop (%set-symbol-global-value set)) (define-vop (symbol-global-value symbol-value) - (:translate sym-global-val)) + (:translate symbol-global-value)) (define-vop (fast-symbol-global-value fast-symbol-value) - (:translate sym-global-val)) + (:translate symbol-global-value)) (define-vop (symbol-hash) (:policy :fast-safe) diff --git a/src/compiler/sparc/cell.lisp b/src/compiler/sparc/cell.lisp index 2f22a4a938..4b712916da 100644 --- a/src/compiler/sparc/cell.lisp +++ b/src/compiler/sparc/cell.lisp @@ -47,7 +47,7 @@ ;;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value checked-cell-ref) - (:translate symeval) + (:translate symbol-value) (:generator 9 (move obj-temp object) (loadw value obj-temp symbol-value-slot other-pointer-lowtag) @@ -74,7 +74,7 @@ (define-vop (fast-symbol-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate symeval)) + (:translate symbol-value)) (define-vop (symbol-hash) (:policy :fast-safe) @@ -95,9 +95,9 @@ ;;; On unithreaded builds these are just copies of the non-global versions. (define-vop (%set-symbol-global-value set)) (define-vop (symbol-global-value symbol-value) - (:translate sym-global-val)) + (:translate symbol-global-value)) (define-vop (fast-symbol-global-value fast-symbol-value) - (:translate sym-global-val)) + (:translate symbol-global-value)) ;;;; FDEFINITION (fdefn) objects. (define-vop (fdefn-fun cell-ref) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 8599e7e472..4d437e0209 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -5076,7 +5076,7 @@ (base-char `(sb-impl::%make-base-string-ostream)) (t (give-up-ir1-transform)))) -(flet ((xform (symbol match-kind fallback) +(flet ((xform (symbol match-kind) (when (constant-lvar-p symbol) (let* ((symbol (lvar-value symbol)) (kind (info :variable :kind symbol)) @@ -5103,14 +5103,15 @@ (boundp symbol) (typep (symbol-value symbol) '(or character symbol fixnum #+64-bit single-float)))) - (return-from xform symbol)))) - fallback)) + symbol))))) (deftransform symbol-global-value ((symbol)) - (xform symbol :global `(sym-global-val symbol))) + (or (xform symbol :global) + (give-up-ir1-transform))) (deftransform symbol-value ((symbol)) - (xform symbol :special `(symeval symbol)))) + (or (xform symbol :special) + (give-up-ir1-transform)))) -(deftransform symeval ((symbol) ((constant-arg symbol))) +(deftransform symbol-value ((symbol) ((constant-arg symbol))) (let* ((symbol (lvar-value symbol)) (kind (info :variable :kind symbol))) (if (and (eq kind :constant) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 1173a949e7..eb5f846fc0 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -100,7 +100,7 @@ (:args (object :scs (descriptor-reg immediate))) (:results (value :scs (descriptor-reg any-reg))) (:policy :fast) - (:translate sym-global-val) + (:translate symbol-global-value) (:generator 4 (cond ((sc-is object immediate) (inst mov value (symbol-slot-ea (tn-value object) symbol-value-slot))) @@ -109,7 +109,7 @@ (define-vop (symbol-global-value) (:policy :fast-safe) - (:translate sym-global-val) + (:translate symbol-global-value) (:args (object :scs (descriptor-reg) :to (:result 1))) (:results (value :scs (descriptor-reg any-reg))) (:vop-var vop) @@ -302,7 +302,7 @@ ;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value) - (:translate symeval) + (:translate symbol-value) (:policy :fast-safe) (:args (symbol :scs (descriptor-reg constant immediate) :to (:result 1))) ;; TODO: use no temp if the symbol is known to be thread-local @@ -348,9 +348,9 @@ #-sb-thread (progn (define-vop (symbol-value symbol-global-value) - (:translate symeval)) + (:translate symbol-value)) (define-vop (fast-symbol-value fast-symbol-global-value) - (:translate symeval)) + (:translate symbol-value)) (define-vop (set %set-symbol-global-value)) (define-vop (boundp) (:translate boundp) diff --git a/src/compiler/x86/cell.lisp b/src/compiler/x86/cell.lisp index 26238a2cf8..fdd7fe7d6d 100644 --- a/src/compiler/x86/cell.lisp +++ b/src/compiler/x86/cell.lisp @@ -93,11 +93,11 @@ (define-vop (fast-symbol-global-value cell-ref) (:variant symbol-value-slot other-pointer-lowtag) (:policy :fast) - (:translate sym-global-val)) + (:translate symbol-global-value)) (define-vop (symbol-global-value) (:policy :fast-safe) - (:translate sym-global-val) + (:translate symbol-global-value) (:args (object :scs (descriptor-reg) :to (:result 1))) (:results (value :scs (descriptor-reg any-reg))) (:vop-var vop) @@ -129,7 +129,7 @@ ;; With Symbol-Value, we check that the value isn't the trap object. (define-vop (symbol-value) - (:translate symeval) + (:translate symbol-value) (:policy :fast-safe) (:args (object :scs (descriptor-reg) :to (:result 1))) (:results (value :scs (descriptor-reg any-reg))) @@ -157,7 +157,7 @@ ;; unbound", which is used in the implementation of COPY-SYMBOL. -- ;; CSR, 2003-04-22 (:policy :fast) - (:translate symeval) + (:translate symbol-value) (:generator 8 (let ((ret-lab (gen-label))) (loadw value object symbol-tls-index-slot other-pointer-lowtag) @@ -171,9 +171,9 @@ #-sb-thread (progn (define-vop (symbol-value symbol-global-value) - (:translate symeval)) + (:translate symbol-value)) (define-vop (fast-symbol-value fast-symbol-global-value) - (:translate symeval)) + (:translate symbol-value)) (define-vop (set %set-symbol-global-value))) #+sb-thread diff --git a/src/compiler/xref.lisp b/src/compiler/xref.lisp index a71dfcf4ea..ec814f3537 100644 --- a/src/compiler/xref.lisp +++ b/src/compiler/xref.lisp @@ -84,7 +84,7 @@ ;; Record references to globals made using SYMBOL-VALUE. (let ((fun (principal-lvar-use (combination-fun node))) (arg (car (combination-args node)))) - (when (and (ref-p fun) (eq 'symeval (leaf-%source-name (ref-leaf fun))) + (when (and (ref-p fun) (eq 'symbol-value (leaf-%source-name (ref-leaf fun))) (constant-lvar-p arg) (symbolp (lvar-value arg))) (record-xref :references (lvar-value arg) context node nil)))) (ref diff --git a/src/interpreter/special-forms.lisp b/src/interpreter/special-forms.lisp index 578d0221cf..b48b47a5a9 100644 --- a/src/interpreter/special-forms.lisp +++ b/src/interpreter/special-forms.lisp @@ -9,9 +9,6 @@ (in-package "SB-INTERPRETER") -(eval-when (:compile-toplevel :load-toplevel :execute) - (shadow "SYMEVAL")) - ;;; Return a THE form that wraps EXPRESSION, but if CTYPE is NIL, ;;; just return EXPRESSION. (defun cast-to (ctype expression) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index 24e833cb34..624085fc6f 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -123,6 +123,33 @@ :load t) (assert (= 0 (first (third (third (symbol-value '*backq-stuff*))))))) +(with-test (:name :block-compile-ftype-proclamation) + (ctu:file-compile + `((declaim (ftype function zoo)) + (defun bar1 (x) (zoo x)) + + (declaim (ftype (function (t) (values integer &optional)) bar1)) + + (defun foo1 (z) (bar1 z))) + :block-compile t + :load t) + (assert (ctype= (caddr (sb-kernel::%simple-fun-type (fdefinition 'foo1))) + '(values integer &optional)))) + +(with-test (:name :block-compile-variable-type-proclamation) + (ctu:file-compile + `((defvar *foo*) + (declaim (type integer *foo*)) + (defun integer-type () *foo*) + (declaim (type character *foo*)) + (defun character-type () *foo*)) + :block-compile t + :load t) + (assert (ctype= (caddr (sb-kernel::%simple-fun-type (fdefinition 'integer-type))) + '(values integer &optional))) + (assert (ctype= (caddr (sb-kernel::%simple-fun-type (fdefinition 'character-type))) + '(values character &optional)))) + (with-test (:name :block-compile-same-block-references-functional) (ctu:file-compile `((declaim (inline bar)) @@ -141,19 +168,6 @@ ;; the (simple) function objects directly. (assert (null (ctu:find-named-callees #'foo)))) -(with-test (:name :block-compile-ftype-proclamation) - (ctu:file-compile - `((declaim (ftype function zoo)) - (defun bar1 (x) (zoo x)) - - (declaim (ftype (function (t) (values integer &optional)) bar1)) - - (defun foo1 (z) (bar1 z))) - :block-compile t - :load t) - (assert (ctype= (caddr (sb-kernel::%simple-fun-type (fdefinition 'foo1))) - '(values integer &optional)))) - (with-test (:name :block-compile-top-level-closures) (ctu:file-compile `(;; test forward reference diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 9b0d57afa4..aa063075a8 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -1016,7 +1016,7 @@ (checked-compile-and-assert () `(lambda () - (sb-kernel:symeval nil)) + (symbol-value nil)) (() nil))) (with-test (:name (:environment-analyze :deleted-lambda)) From fb1602229e48ab8945d263290461c86c0fd9b46b Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 14 May 2022 00:18:24 -0700 Subject: [PATCH 3341/4023] Fix broken tests. Yep, we in fact parse disassembly... --- tests/compiler.pure.lisp | 13 +++++++------ tests/interface.pure.lisp | 27 ++++++++++++++------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index fcfdf27250..c812caed7a 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -5111,12 +5111,13 @@ :skipped-on (:not (:or :x86 :x86-64))) (flet ((approx-lines-of-assembly-code (type-expr) (count #\Newline - (with-output-to-string (s) - (disassemble - `(lambda (x) - (declare (optimize (sb-c:verify-arg-count 0))) - (typep x ',type-expr)) - :stream s))))) + (let ((sb-ext:*disassemble-annotate* nil)) + (with-output-to-string (s) + (disassemble + `(lambda (x) + (declare (optimize (sb-c:verify-arg-count 0))) + (typep x ',type-expr)) + :stream s)))))) ;; These are fragile, but less bad than the possibility of messing up ;; any vops, especially since the generic code in 'vm-type' checks for ;; a vop by its name in a place that would otherwise be agnostic of the diff --git a/tests/interface.pure.lisp b/tests/interface.pure.lisp index 2414fc6ea1..d141cdf3de 100644 --- a/tests/interface.pure.lisp +++ b/tests/interface.pure.lisp @@ -211,19 +211,20 @@ ;; if address printing is turned off. Should work on any backend, I think. (with-test (:name (disassemble :without-addresses)) (flet ((disassembly-text (lambda-expr) - (let ((string - (let ((sb-disassem::*disassem-location-column-width* 0) - (*print-pretty* nil)) ; prevent function name wraparound - (with-output-to-string (s) - (disassemble lambda-expr :stream s))))) - ;; Return all except the first two lines. This is subject to change - ;; any time we muck with the layout unfortunately. - (subseq string - (1+ (position #\Newline string - :start (1+ (position #\Newline string)))))))) - (let ((string1 (disassembly-text '(lambda (x) (car x)))) - (string2 (disassembly-text '(lambda (y) (car y))))) - (assert (string= string1 string2))))) + (let ((string + (let ((sb-disassem::*disassem-location-column-width* 0) + (sb-ext:*disassemble-annotate* nil) + (*print-pretty* nil)) ; prevent function name wraparound + (with-output-to-string (s) + (disassemble lambda-expr :stream s))))) + ;; Return all except the first two lines. This is subject to change + ;; any time we muck with the layout unfortunately. + (subseq string + (1+ (position #\Newline string + :start (1+ (position #\Newline string)))))))) + (let ((string1 (disassembly-text '(lambda (x) (car x)))) + (string2 (disassembly-text '(lambda (y) (car y))))) + (assert (string= string1 string2))))) (with-test (:name :disassemble-assembly-routine) (disassemble sb-fasl:*assembler-routines* :stream (make-broadcast-stream))) From bde67035669901f18534d0b8e3d7940a5fa7849e Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 14 May 2022 00:35:49 -0700 Subject: [PATCH 3342/4023] Kill a FIXME. --- src/compiler/assem.lisp | 4 ++-- src/compiler/early-assem.lisp | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index 3a6ad89e49..c79d4f593b 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -342,8 +342,8 @@ ;; can print "in the {x} section" whenever it changes. (tracing-state (list nil nil) :read-only t)) ; segment and vop (declaim (freeze-type asmstream)) -;;; FIXME: suboptimal since *asmstream* was declaimed earlier because reasons. -;;; (so we're missing uses of the known type even though the special var is known) + +(defvar *asmstream*) (declaim (type asmstream *asmstream*)) (defun get-allocation-points (asmstream) diff --git a/src/compiler/early-assem.lisp b/src/compiler/early-assem.lisp index 3ae82133e7..a9641812ff 100644 --- a/src/compiler/early-assem.lisp +++ b/src/compiler/early-assem.lisp @@ -11,8 +11,6 @@ (in-package "SB-ASSEM") -(defvar *asmstream*) - ;;; common supertype for all the different kinds of annotations (defstruct (annotation (:constructor nil) (:copier nil)) From 448db1bf3a72e275c3e533ffcf86e1191b197754 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 14 May 2022 01:03:40 -0700 Subject: [PATCH 3343/4023] Remove and move some stuff out of early-c. * A bunch of specials were redundantly declared. * PACK-TLF-NUM+OFFSET is dead code. --- src/assembly/assemfile.lisp | 2 +- src/code/debug-info.lisp | 9 -- src/cold/build-order.lisp-expr | 6 +- src/compiler/codegen.lisp | 1 + src/compiler/debug-dump.lisp | 1 + src/compiler/dump.lisp | 1 + src/compiler/early-c.lisp | 52 ------- src/compiler/generic/type-error.lisp | 2 +- src/compiler/generic/utils.lisp | 23 +++ src/compiler/ir1report.lisp | 85 +++++------ src/compiler/ir1tran-lambda.lisp | 2 + src/compiler/ir1tran.lisp | 7 + src/compiler/main.lisp | 212 ++++++++++++++------------- src/compiler/x86-64/vm.lisp | 5 +- 14 files changed, 196 insertions(+), 212 deletions(-) diff --git a/src/assembly/assemfile.lisp b/src/assembly/assemfile.lisp index 3da7c39fc4..18b967c07f 100644 --- a/src/assembly/assemfile.lisp +++ b/src/assembly/assemfile.lisp @@ -31,7 +31,7 @@ (won nil) (asmstream (make-asmstream)) (*asmstream* asmstream) - (*adjustable-vectors* nil)) + (sb-vm::*adjustable-vectors* nil)) (unwind-protect (let ((sb-xc:*features* (cons :sb-assembling sb-xc:*features*)) (*readtable* sb-cold:*xc-readtable*)) diff --git a/src/code/debug-info.lisp b/src/code/debug-info.lisp index 063bcacc7d..7039f8f8d0 100644 --- a/src/code/debug-info.lisp +++ b/src/code/debug-info.lisp @@ -423,15 +423,6 @@ ;; SB-DI::COMPILED-DEBUG-FUN instances. Null when unassigned. (memo-cell nil :type list)) -;;; The TLF-NUMBER and CHAR-OFFSET of a compiled-debug-info can each be NIL, -;;; but aren't often. However, to allow that, convert NIL to 0 and non-nil -;;; value N to N+1. -(defun pack-tlf-num+offset (tlf-number char-offset) - (with-adjustable-vector (v) - (write-var-integer (if tlf-number (1+ tlf-number) 0) v) - (write-var-integer (if char-offset (1+ char-offset) 0) v) - (integer-from-octets v))) - ;;;; file reading ;;;; ;;;; When reading from a file, we have to keep track of some source diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 27e7cfdf55..97632b7dbb 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -345,6 +345,9 @@ #+(and os-provides-dlopen (not win32)) ("src/code/unix-foreign-load" :not-host) #+(and os-provides-dlopen win32) ("src/code/win32-foreign-load" :not-host) + #+sb-dyncount ("src/compiler/dyncount") + #+sb-dyncount ("src/code/dyncount") + ("src/compiler/disassem") ("src/compiler/assem") @@ -468,9 +471,6 @@ ("src/compiler/codegen") ("src/compiler/debug") - #+sb-dyncount ("src/compiler/dyncount") - #+sb-dyncount ("src/code/dyncount") - ("src/code/format-time" :not-host) ;; needed by various unhappy-path cases in the cross-compiler diff --git a/src/compiler/codegen.lisp b/src/compiler/codegen.lisp index 298596c4e4..f3b8ba4e86 100644 --- a/src/compiler/codegen.lisp +++ b/src/compiler/codegen.lisp @@ -276,6 +276,7 @@ (let ((*print-pretty* nil)) ; force 1 line (format *compiler-trace-output* "~|~%assembly code for ~S~2%" component))) (let* ((prev-env nil) + (sb-vm::*adjustable-vectors* nil) ;; The first function's alignment word is zero-filled, but subsequent ;; ones can use a NOP which helps the disassembler not lose sync. (filler-pattern 0) diff --git a/src/compiler/debug-dump.lisp b/src/compiler/debug-dump.lisp index b5bdef111e..068735d014 100644 --- a/src/compiler/debug-dump.lisp +++ b/src/compiler/debug-dump.lisp @@ -18,6 +18,7 @@ (defvar *contexts*) (declaim (type (vector t) *contexts*)) (defvar *local-call-context*) +(defvar *location-context* nil) ;;;; debug blocks diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index b99443675d..13e4424a5d 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -164,6 +164,7 @@ ;; Unlike EQUAL-HASH, we never call EQ-HASH, because there is generally no reason ;; to try to look up an object that lacks a content-based hash value. (defun similar-hash (x) + (declare (special sb-c::*compile-object*)) (named-let recurse ((x x)) ;; There is no depth cutoff - X must not be circular, ;; which was already determined as a precondition to calling this, diff --git a/src/compiler/early-c.lisp b/src/compiler/early-c.lisp index f2ecfa6e5a..f7d894ffe6 100644 --- a/src/compiler/early-c.lisp +++ b/src/compiler/early-c.lisp @@ -80,51 +80,23 @@ (defvar *allow-instrumenting*) ;;; miscellaneous forward declarations -#+sb-dyncount (defvar *collect-dynamic-statistics*) (defvar *component-being-compiled*) (defvar *compiler-error-context*) -(defvar *compiler-error-count*) -(defvar *compiler-warning-count*) -(defvar *compiler-style-warning-count*) -(defvar *compiler-note-count*) ;;; Bind this to a stream to capture various internal debugging output. (defvar *compiler-trace-output* nil) ;;; These are the default, but the list can also include ;;; :pre-ir2-optimize, :symbolic-asm, and :sb-graph. (defvar *compile-trace-targets* '(:ir1 :ir2 :vop :symbolic-asm :disassemble)) -(defvar *constraint-universe*) (defvar *current-path*) (defvar *current-component*) -#+sb-dyncount -(defvar *dynamic-counts-tn*) (defvar *elsewhere-label*) -(defvar *event-note-threshold*) -(defvar *failure-p*) (defvar *source-info*) (defvar *source-plist*) (defvar *source-namestring*) -(defvar *undefined-warnings*) -(defvar *warnings-p*) -(defvar *lambda-conversions*) -(defvar *compile-object* nil) -(defvar *location-context* nil) (defvar *handled-conditions* nil) (defvar *disabled-package-locks* nil) -(defvar *stack-allocate-dynamic-extent* t - "If true (the default), the compiler respects DYNAMIC-EXTENT declarations -and stack allocates otherwise inaccessible parts of the object whenever -possible. Potentially long (over one page in size) vectors are, however, not -stack allocated except in zero SAFETY code, as such a vector could overflow -the stack without triggering overflow protection.") - -;;; *BLOCK-COMPILE-ARGUMENT* holds the original value of the :BLOCK-COMPILE -;;; argument, which overrides any internal declarations. -(defvar *block-compile-argument*) -(declaim (type (member nil t :specified) - *block-compile-default* *block-compile-argument*)) - ;;;; miscellaneous utilities @@ -189,30 +161,6 @@ the stack without triggering overflow protection.") #-immobile-code (defmacro code-immobile-p (thing) `(progn ,thing nil)) -;;; Various error-code generating helpers -(defvar *adjustable-vectors*) - -(defmacro with-adjustable-vector ((var) &rest body) - `(let ((,var (or (pop *adjustable-vectors*) - (make-array 16 - :element-type '(unsigned-byte 8) - :fill-pointer 0 - :adjustable t)))) - ;; Don't declare the length - if it gets adjusted and pushed back - ;; onto the freelist, it's anyone's guess whether it was expanded. - ;; This code was wrong for >12 years, so nobody must have needed - ;; more than 16 elements. Maybe we should make it nonadjustable? - (declare (type (vector (unsigned-byte 8)) ,var)) - (setf (fill-pointer ,var) 0) - ;; No UNWIND-PROTECT here - semantics are unaffected by nonlocal exit, - ;; and this macro is about speeding up the compiler, not slowing it down. - ;; GC will clean up any debris, and since the vector does not point - ;; to anything, even an accidental promotion to a higher generation - ;; will not cause transitive garbage retention. - (prog1 (progn ,@body) - (push ,var *adjustable-vectors*)))) - - ;;; The allocation quantum for boxed code header words. ;;; 2 implies an even length boxed header; 1 implies no restriction. (defconstant code-boxed-words-align (+ 2 #+(or x86 x86-64) -1)) diff --git a/src/compiler/generic/type-error.lisp b/src/compiler/generic/type-error.lisp index 55be4a9178..ca7671f32d 100644 --- a/src/compiler/generic/type-error.lisp +++ b/src/compiler/generic/type-error.lisp @@ -128,7 +128,7 @@ (encode-internal-error-args values)) (defun encode-internal-error-args (values) - (sb-c::with-adjustable-vector (vector) + (with-adjustable-vector (vector) (dolist (where values) (write-var-integer ;; WHERE can be either a TN or a packed SC number + offset diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 7f3ac9eb6a..9e7eec1193 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -90,6 +90,29 @@ (- other-pointer-lowtag) (* fdefn-raw-addr-slot n-word-bytes))) +;;; Various error-code generating helpers +(defvar *adjustable-vectors*) + +(defmacro with-adjustable-vector ((var) &rest body) + `(let ((,var (or (pop *adjustable-vectors*) + (make-array 16 + :element-type '(unsigned-byte 8) + :fill-pointer 0 + :adjustable t)))) + ;; Don't declare the length - if it gets adjusted and pushed back + ;; onto the freelist, it's anyone's guess whether it was expanded. + ;; This code was wrong for >12 years, so nobody must have needed + ;; more than 16 elements. Maybe we should make it nonadjustable? + (declare (type (vector (unsigned-byte 8)) ,var)) + (setf (fill-pointer ,var) 0) + ;; No UNWIND-PROTECT here - semantics are unaffected by nonlocal exit, + ;; and this macro is about speeding up the compiler, not slowing it down. + ;; GC will clean up any debris, and since the vector does not point + ;; to anything, even an accidental promotion to a higher generation + ;; will not cause transitive garbage retention. + (prog1 (progn ,@body) + (push ,var *adjustable-vectors*)))) + ;;;; interfaces to IR2 conversion ;;; Return a wired TN describing the N'th full call argument passing diff --git a/src/compiler/ir1report.lisp b/src/compiler/ir1report.lisp index 04c9a9af0f..fb597178d5 100644 --- a/src/compiler/ir1report.lisp +++ b/src/compiler/ir1report.lisp @@ -477,48 +477,6 @@ has written, having proved that it is unreachable.")) (compiler-macro-application-missed-warning-count condition) (compiler-macro-application-missed-warning-function condition))))) -(macrolet ((with-condition ((condition datum args) &body body) - (with-unique-names (block) - `(block ,block - (let ((,condition - (apply #'coerce-to-condition ,datum - 'simple-compiler-note 'with-condition - ,args))) - (restart-case - (signal ,condition) - (muffle-warning () - (return-from ,block (values)))) - ,@body - (values)))))) - - (defun compiler-notify (datum &rest args) - (unless (if *compiler-error-context* - (policy (if (ctran-p *compiler-error-context*) - (ctran-next *compiler-error-context*) - *compiler-error-context*) - (= inhibit-warnings 3)) - (policy *lexenv* (= inhibit-warnings 3))) - (with-condition (condition datum args) - (incf *compiler-note-count*) - (print-compiler-message - *error-output* - (format nil "note: ~~A") - (list (princ-to-string condition))))) - (values)) - - ;; Issue a note when we might or might not be in the compiler. - (defun maybe-compiler-notify (datum &rest args) - (if (boundp '*lexenv*) ; if we're in the compiler - (apply #'compiler-notify datum args) - (with-condition (condition datum args) - (let ((stream *error-output*)) - (pprint-logical-block (stream nil :per-line-prefix ";") - (format stream " note: ~3I~_") - (pprint-logical-block (stream nil) - (format stream "~A" condition))) - ;; (outside logical block, no per-line-prefix) - (fresh-line stream)))))) - ;;; The politically correct way to print out progress messages and ;;; such like. We clear the current error context so that we know that ;;; it needs to be reprinted, and we also FORCE-OUTPUT so that the @@ -588,6 +546,49 @@ has written, having proved that it is unreachable.")) (setf *warnings-p* t) (print-compiler-condition condition) (muffle-warning condition)) + +(macrolet ((with-condition ((condition datum args) &body body) + (with-unique-names (block) + `(block ,block + (let ((,condition + (apply #'coerce-to-condition ,datum + 'simple-compiler-note 'with-condition + ,args))) + (restart-case + (signal ,condition) + (muffle-warning () + (return-from ,block (values)))) + ,@body + (values)))))) + + (defun compiler-notify (datum &rest args) + (unless (if *compiler-error-context* + (policy (if (ctran-p *compiler-error-context*) + (ctran-next *compiler-error-context*) + *compiler-error-context*) + (= inhibit-warnings 3)) + (policy *lexenv* (= inhibit-warnings 3))) + (with-condition (condition datum args) + (incf *compiler-note-count*) + (print-compiler-message + *error-output* + (format nil "note: ~~A") + (list (princ-to-string condition))))) + (values)) + + ;; Issue a note when we might or might not be in the compiler. + (defun maybe-compiler-notify (datum &rest args) + (if (boundp '*lexenv*) ; if we're in the compiler + (apply #'compiler-notify datum args) + (with-condition (condition datum args) + (let ((stream *error-output*)) + (pprint-logical-block (stream nil :per-line-prefix ";") + (format stream " note: ~3I~_") + (pprint-logical-block (stream nil) + (format stream "~A" condition))) + ;; (outside logical block, no per-line-prefix) + (fresh-line stream)))))) + ;;;; undefined warnings diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index fce0aa4168..bbdd6b8a6c 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -871,6 +871,8 @@ res)) +(defvar *lambda-conversions*) + ;;; Convert a LAMBDA form into a LAMBDA leaf or an OPTIONAL-DISPATCH leaf. (defun ir1-convert-lambda (form &key (source-name '.anonymous.) debug-name maybe-add-debug-catch diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 6a1ffe3d71..b31b465a1b 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1453,6 +1453,13 @@ (setf (lambda-var-ignorep var) t))))) (values)) +(defvar *stack-allocate-dynamic-extent* t + "If true (the default), the compiler respects DYNAMIC-EXTENT declarations +and stack allocates otherwise inaccessible parts of the object whenever +possible. Potentially long (over one page in size) vectors are, however, not +stack allocated except in zero SAFETY code, as such a vector could overflow +the stack without triggering overflow protection.") + (defun process-extent-decl (names vars fvars kind) (let ((extent (ecase kind diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 53c2c6a006..03da51efdc 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -14,6 +14,12 @@ (defvar *block-compile-default* nil "The default value for the :Block-Compile argument to COMPILE-FILE.") +;;; *BLOCK-COMPILE-ARGUMENT* holds the original value of the :BLOCK-COMPILE +;;; argument, which overrides any internal declarations. +(defvar *block-compile-argument*) +(declaim (type (member nil t :specified) + *block-compile-default* *block-compile-argument*)) + (defvar *entry-points-argument*) (declaim (type list *entry-points-argument*)) @@ -62,6 +68,8 @@ (deftype object () '(or fasl-output core-object null)) + +(defvar *compile-object* nil) (declaim (type object *compile-object*)) (defvar *emit-cfasl* nil) @@ -559,125 +567,125 @@ necessary, since type inference may take arbitrarily long to converge.") (eq (component-mem-space component) :immobile)))) (defun %compile-component (component) - (let ((*adjustable-vectors* nil)) ; Needed both by codegen and fasl writer - (maybe-mumble "GTN ") - (gtn-analyze component) - (maybe-mumble "LTN ") - (ltn-analyze component) - (dfo-as-needed component) - - (maybe-mumble "Control ") - (control-analyze component) - - (report-code-deletion) - - (when (or (ir2-component-values-receivers (component-info component)) - (component-dx-lvars component)) - (maybe-mumble "Stack ") - ;; STACK only uses dominance information for DX LVAR back - ;; propagation (see BACK-PROPAGATE-ONE-DX-LVAR). - (when (component-dx-lvars component) - (clear-dominators component) - (find-dominators component)) - (stack-analyze component) - ;; Assign BLOCK-NUMBER for any cleanup blocks introduced by - ;; stack analysis. There shouldn't be any unreachable code after - ;; control, so this won't delete anything. - (dfo-as-needed component)) - - (maybe-mumble "IR2Tran ") - (entry-analyze component) + (maybe-mumble "GTN ") + (gtn-analyze component) + (maybe-mumble "LTN ") + (ltn-analyze component) + (dfo-as-needed component) + + (maybe-mumble "Control ") + (control-analyze component) + + (report-code-deletion) + + (when (or (ir2-component-values-receivers (component-info component)) + (component-dx-lvars component)) + (maybe-mumble "Stack ") + ;; STACK only uses dominance information for DX LVAR back + ;; propagation (see BACK-PROPAGATE-ONE-DX-LVAR). + (when (component-dx-lvars component) + (clear-dominators component) + (find-dominators component)) + (stack-analyze component) + ;; Assign BLOCK-NUMBER for any cleanup blocks introduced by + ;; stack analysis. There shouldn't be any unreachable code after + ;; control, so this won't delete anything. + (dfo-as-needed component)) + + (maybe-mumble "IR2Tran ") + (entry-analyze component) ;; For on-demand recalculation of dominators, the previously ;; computed results may be stale. - (clear-dominators component) - (ir2-convert component) + (clear-dominators component) + + (ir2-convert component) - (when (policy *lexenv* (>= speed compilation-speed)) - (maybe-mumble "Copy ") - (copy-propagate component)) + (when (policy *lexenv* (>= speed compilation-speed)) + (maybe-mumble "Copy ") + (copy-propagate component)) - (ir2-optimize component) + (ir2-optimize component) - (select-representations component) + (select-representations component) ;; Try to combine consecutive uses of %INSTANCE-SET. ;; This can't be done prior to selecting representations ;; because SELECT-REPRESENTATIONS might insert some ;; things like MOVE-FROM-DOUBLE which makes the ;; "consecutive" vops no longer consecutive. - (ir2-optimize-stores component) - (when *check-consistency* - (maybe-mumble "Check2 ") - (check-ir2-consistency component)) - - (delete-unreferenced-tns component) + (ir2-optimize-stores component) - (maybe-mumble "Life ") - (lifetime-analyze component) + (when *check-consistency* + (maybe-mumble "Check2 ") + (check-ir2-consistency component)) - (when *compile-progress* - (compiler-mumble "") ; Sync before doing more output. - (pre-pack-tn-stats component *standard-output*)) + (delete-unreferenced-tns component) - (when *check-consistency* - (maybe-mumble "CheckL ") - (check-life-consistency component)) + (maybe-mumble "Life ") + (lifetime-analyze component) - (maybe-mumble "Pack ") - (sb-regalloc:pack component) - - (when *check-consistency* - (maybe-mumble "CheckP ") - (check-pack-consistency component)) - - (delete-no-op-vops component) - (ir2-optimize-jumps component) - (optimize-constant-loads component) - (when *compiler-trace-output* - (when (memq :ir1 *compile-trace-targets*) - (describe-component component *compiler-trace-output*)) - (when (memq :ir2 *compile-trace-targets*) - (describe-ir2-component component *compiler-trace-output*))) - - (maybe-mumble "Code ") - (multiple-value-bind (segment text-length fun-table - elsewhere-label fixup-notes alloc-points) - (let ((*compiler-trace-output* - (and (memq :vop *compile-trace-targets*) - *compiler-trace-output*))) - (generate-code component)) - (declare (ignorable text-length fun-table)) - - (let ((bytes (sb-assem:segment-contents-as-vector segment)) - (object *compile-object*) - (*elsewhere-label* elsewhere-label)) ; KLUDGE - - #-sb-xc-host - (when (and *compiler-trace-output* - (memq :disassemble *compile-trace-targets*)) - (let ((ranges - (maplist (lambda (list) - (cons (+ (car list) - (ash sb-vm:simple-fun-insts-offset - sb-vm:word-shift)) - (or (cadr list) text-length))) - fun-table))) - (format *compiler-trace-output* - "~|~%Disassembly of code for ~S~2%" component) - (sb-disassem:disassemble-assem-segment - bytes ranges *compiler-trace-output*))) - - (funcall (etypecase object - (fasl-output (maybe-mumble "FASL") #'fasl-dump-component) - #-sb-xc-host ; no compiling to core - (core-object (maybe-mumble "Core") #'make-core-component) - (null (lambda (&rest dummies) - (declare (ignore dummies))))) - component segment (length bytes) - fixup-notes alloc-points - object)))) + (when *compile-progress* + (compiler-mumble "") ; Sync before doing more output. + (pre-pack-tn-stats component *standard-output*)) + + (when *check-consistency* + (maybe-mumble "CheckL ") + (check-life-consistency component)) + + (maybe-mumble "Pack ") + (sb-regalloc:pack component) + + (when *check-consistency* + (maybe-mumble "CheckP ") + (check-pack-consistency component)) + + (delete-no-op-vops component) + (ir2-optimize-jumps component) + (optimize-constant-loads component) + (when *compiler-trace-output* + (when (memq :ir1 *compile-trace-targets*) + (describe-component component *compiler-trace-output*)) + (when (memq :ir2 *compile-trace-targets*) + (describe-ir2-component component *compiler-trace-output*))) + + (maybe-mumble "Code ") + (multiple-value-bind (segment text-length fun-table + elsewhere-label fixup-notes alloc-points) + (let ((*compiler-trace-output* + (and (memq :vop *compile-trace-targets*) + *compiler-trace-output*))) + (generate-code component)) + (declare (ignorable text-length fun-table)) + + (let ((bytes (sb-assem:segment-contents-as-vector segment)) + (object *compile-object*) + (*elsewhere-label* elsewhere-label)) ; KLUDGE + #-sb-xc-host + (when (and *compiler-trace-output* + (memq :disassemble *compile-trace-targets*)) + (let ((ranges + (maplist (lambda (list) + (cons (+ (car list) + (ash sb-vm:simple-fun-insts-offset + sb-vm:word-shift)) + (or (cadr list) text-length))) + fun-table))) + (format *compiler-trace-output* + "~|~%Disassembly of code for ~S~2%" component) + (sb-disassem:disassemble-assem-segment + bytes ranges *compiler-trace-output*))) + + (funcall (etypecase object + (fasl-output (maybe-mumble "FASL") #'fasl-dump-component) + #-sb-xc-host ; no compiling to core + (core-object (maybe-mumble "Core") #'make-core-component) + (null (lambda (&rest dummies) + (declare (ignore dummies))))) + component segment (length bytes) + fixup-notes alloc-points + object))) ;; We're done, so don't bother keeping anything around. (setf (component-info component) :dead) diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index 0d31e1de5c..9db7765645 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -485,8 +485,9 @@ ;; is used to determine whether it's immediate. #+(and (not sb-xc-host) immobile-space (not immobile-symbols)) (or (logbitp +initial-core-symbol-bit+ (get-header-data value)) - (and (sb-c::core-object-p sb-c::*compile-object*) - (immobile-space-obj-p value))) + (locally (declare (notinline sb-c::producing-fasl-file)) + (and (not (sb-c::producing-fasl-file)) + (immobile-space-obj-p value)))) (static-symbol-p value)) immediate-sc-number)) From dfbd2f7cb1f0fbca276c8db3383d9b147725a49c Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Sat, 14 May 2022 11:41:01 +0100 Subject: [PATCH 3344/4023] Fix REDUCE type-deriver on (vector *) types Reported by _death on #sbcl IRC. --- src/compiler/seqtran.lisp | 6 +++++- tests/compiler-2.impure.lisp | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index c94c215e5a..7aa589ee75 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -2838,7 +2838,11 @@ (t *universal-type*))))) ((csubtypep sequence-type (specifier-type 'array)) - (array-type-upgraded-element-type sequence-type)))) + (let ((upgraded-type + (array-type-upgraded-element-type sequence-type))) + (if (eq upgraded-type *wild-type*) + *universal-type* + upgraded-type))))) (end (if end (and (constant-lvar-p end) (or (lvar-value end) diff --git a/tests/compiler-2.impure.lisp b/tests/compiler-2.impure.lisp index 0f83a9442e..20545967fc 100644 --- a/tests/compiler-2.impure.lisp +++ b/tests/compiler-2.impure.lisp @@ -80,3 +80,10 @@ (test '(lambda (x) (macrolet ((baz (arg) `(- ,arg))) (list (baz x))))) ;; Test 2: inline a function that captured a macrolet (test '(lambda (x) (make-mystruct :a x))))) + +(with-test (:name (reduce :type-deriver :wild-array-upgraded-type)) + (checked-compile-and-assert + () + `(lambda (x) (declare (type vector x)) (reduce #'+ x)) + ((#(1 2 3)) 6) + (((make-array 3 :element-type '(unsigned-byte 8) :initial-contents '(4 5 6))) 15))) From 23e6c82640367a0ebee9e0a97f40a43f320e6d9a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 14 May 2022 17:01:07 +0300 Subject: [PATCH 3345/4023] Disable *disassemble-annotate* again. E.g. it shows useless ;;; [4] (LOOP REPEAT N DO ...) ; CA0: L0: 4B0080D2 MOVZ R1, #2 ; CA4: EA0310AA MOV R0, R6 Or ; Size: 276 bytes. Origin: #x700352C7DC ; LIST* ; 7DC: C30000B5 CBNZ NL3, L1 ;;; [6] (COND ((= LENGTH 0) ARG) ((= LENGTH 1) (CONS ARG (FAST-&REST-NTH 0 OTHERS))) (T ..)) ; 7E0: EA0311AA MOV R0, R7 ; 7E4: L0: FB031AAA MOV CSP, CFP ; 7E8: 5A7B40A9 LDP CFP, LR, [CFP] ; 7EC: BF0300F1 CMP NULL, #0 ; 7F0: C0035FD6 RET And it doesn't work with slime's C-c C-c, grabbing the wrong form, or when a file is modified. I.e. it produces more confusion than anything useful. --- src/compiler/target-disassem.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index 80f84480e7..1d351fbd9b 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -1797,7 +1797,9 @@ )))) (no-debug-blocks () nil))))) -(defvar *disassemble-annotate* t +;;; Disabled because it produces poor annotations, especially around +;;; macros. +(defvar *disassemble-annotate* nil "Annotate DISASSEMBLE output with source code.") (defun add-debugging-hooks (segment debug-fun &optional sfcache) From 876826fba06b70d30879532d98020c78f70a2f06 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 14 May 2022 11:17:09 -0400 Subject: [PATCH 3346/4023] Move some machine-dependent disassembler logic --- src/compiler/target-disassem.lisp | 27 +------- src/compiler/x86-64/insts.lisp | 7 +- src/compiler/x86-64/target-insts.lisp | 92 +++++++++++++++++++++++---- tests/x86-64-codegen.impure.lisp | 5 ++ 4 files changed, 91 insertions(+), 40 deletions(-) diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index 1d351fbd9b..32fe6fa33b 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -2534,32 +2534,7 @@ (dovector (symbol sb-vm:+static-symbols+) (when (= (get-lisp-obj-address symbol) address) (return-from found symbol)))) - ;; Guess whether 'address' is an immobile-space symbol by looking at - ;; code header constants. If it matches any constant, assume that it - ;; is a use of the constant. This has false positives of course, - ;; as does MAYBE-NOTE-STATIC-SYMBOL in general - any random immediate - ;; used in an unboxed context, such as an ADD instruction, - ;; might be wrongly construed as an address. - #+immobile-space - (let ((code (seg-code (dstate-segment dstate)))) - (when code - (loop for i downfrom (1- (code-header-words code)) - to sb-vm:code-constants-offset - for const = (code-header-ref code i) - when (eql (get-lisp-obj-address const) address) - do (return-from found const)) - ;; Kludge: layout of STREAM, FILE-STREAM, and STRING-STREAM can be used - ;; as immediate operands without a corresponding boxed header constant. - ;; I think we always elide the boxed constant for builtin layouts, - ;; but these three have some slightly unusual codegen that causes a PUSH - ;; instruction to need some help to show its operand as a lisp object. - (dolist (thing (load-time-value (list (find-layout 'stream) - (find-layout 'file-stream) - (find-layout 'string-stream)) - t)) - (when (eql (get-lisp-obj-address thing) address) - (return-from found thing))))) - (return-from maybe-note-static-symbol)))) + (return-from maybe-note-static-symbol)))) (note (lambda (s) (prin1 symbol s)) dstate))) (defun get-internal-error-name (errnum) diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index 01b12c571a..bf962f4df8 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -190,8 +190,11 @@ value)) :printer (lambda (value stream dstate) (cond (stream + ;; This use of MAYBE-NOTE-STATIC-LISPOBJ gets us the + ;; code blob called using canonical 'CALL rel32' form. (or #+immobile-space - (and (integerp value) (maybe-note-lisp-callee value dstate)) + (and (integerp value) + (maybe-note-static-lispobj value dstate)) (maybe-note-assembler-routine value nil dstate)) (print-label value stream dstate)) (t @@ -248,7 +251,7 @@ ;; if it is in a location corresponding to an absolute code fixup. (if (and (memq size '(:dword :qword)) (memq opcode '(mov cmp push)) - (maybe-note-static-symbol value dstate)) + (maybe-note-static-lispobj value dstate t)) (princ16 value stream) (princ value stream)))))) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index de14564c16..50cffef3b8 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -206,24 +206,85 @@ (print-mem-ref :ref value nil stream dstate) (print-xmmreg value stream dstate))) -;;; Find the Lisp object, if any, called by a "CALL rel32offs" -;;; instruction format and add it as an end-of-line comment. -;;; Alternatively, the value might be an immediate operand to MOV, -;;; which in general decodes as a signed integer. So ignore it -;;; unless it looks like an address. -#+immobile-space -(defun maybe-note-lisp-callee (value dstate) +;;; Guess whether VALUE is an immobile-space symbol or code blob by looking +;;; at all code header constants. If it matches any constant, assume that it +;;; is a use of the constant. This has false positives of course, +;;; as does MAYBE-NOTE-STATIC-SYMBOL and friends. Any random immediate value +;;; used in an unboxed context, such as an ADD instruction, +;;; can be wrongly construed as an address. +;;; Note that for symbols we can match either the tagged pointer to it +;;; OR the untagged address of the SYMBOL-VALUE slot. +;;; +;;; "static" in this usage implies "at a fixed address" - it could be +;;; in static space or immobile space. +;;; +;;; TODO: probably should take an &OPTIONAL for ALLOW-INTERIOR-PTR to +;;; reject false positives from instructions that don't access an object +;;; except through a tagged pointer. +(defun maybe-note-static-lispobj (value dstate &optional quote) + (when (maybe-note-static-symbol value dstate) + ;; Returning T prints VALUE using base 16 + ;; (see the SIGNED-IMM-DATA printer, PRINT-IMM/ASM-ROUTINE) + ;; This should probably pass through the QUOTE option but it's not critical. + (return-from maybe-note-static-lispobj t)) + (let ((code (seg-code (dstate-segment dstate))) + (adjusted-val (logior (- value (ash sb-vm:symbol-value-slot sb-vm:word-shift)) + sb-vm:other-pointer-lowtag)) + (found-const) + (slot)) + (when code + (loop for i downfrom (1- (code-header-words code)) to sb-vm:code-constants-offset + for const = (code-header-ref code i) + do (when (symbolp const) + (let ((addr (get-lisp-obj-address const))) + (cond ((eql addr value) + (return (setq found-const const))) + ((eql addr adjusted-val) + (return (setq found-const const + slot sb-vm:symbol-value-slot))))))) + (unless found-const ; try static symbol's value slots + (dovector (symbol sb-vm:+static-symbols+) + (when (= (get-lisp-obj-address symbol) adjusted-val) + (return (setq found-const symbol + slot sb-vm:symbol-value-slot))))) + (when found-const + (note (cond (slot + (lambda (s) (format s "(SYMBOL-VALUE '~S)" found-const))) + ((and (symbolp found-const) quote) + (lambda (s) (write-char #\' s) (prin1 found-const s))) + (t + (lambda (s) (prin1 found-const s)))) + dstate) + ;; Returning T prints in base 16 (see PRINT-IMM/ASM-ROUTINE) + (return-from maybe-note-static-lispobj t)))) + #| This mysterious code seems to have no regression tests. + Comenting it out until I can figure out why it was in target-disassem + ;; Kludge: layout of STREAM, FILE-STREAM, and STRING-STREAM can be used + ;; as immediate operands without a corresponding boxed header constant. + ;; I think we always elide the boxed constant for builtin layouts, + ;; but these three have some slightly unusual codegen that causes a PUSH + ;; instruction to need some help to show its operand as a lisp object. + (dolist (thing (load-time-value (list (find-layout 'stream) + (find-layout 'file-stream) + (find-layout 'string-stream)) + t)) + (when (eql (get-lisp-obj-address thing) address) + (return-from found thing))))) |# (awhen (and (typep value 'word) (sb-disassem::find-code-constant-from-interior-pointer value dstate)) (note (lambda (stream) (princ it stream)) dstate))) +;;; Immobile symbols are heuristically detected with MAYBE-NOTE-STATIC-LISPOBJ +;;; so that moving the tagged pointer to a symbol is shown thusly: +;;; "; BACF003C50 MOV EDX, #x503C00CF ; '*MYVAR*" +;;; (defun print-imm/asm-routine (value stream dstate) (cond ((not stream) (operand value dstate)) - ((or #+immobile-space (maybe-note-lisp-callee value dstate) - (maybe-note-assembler-routine value nil dstate) - (maybe-note-static-symbol value dstate)) + ((or (maybe-note-assembler-routine value nil dstate) + (maybe-note-static-lispobj value dstate t)) (princ16 value stream)) - (t (princ value stream)))) + (t + (princ value stream)))) ;;; Return an instance of REG or MACHINE-EA. ;;; MOD and R/M are the extracted bits from the instruction's ModRM byte. @@ -352,8 +413,9 @@ ;; absolute address as would be used for asm routines and static symbols. (or (minusp disp) (maybe-note-assembler-routine disp nil dstate) + ;; (FIXME: what does this comment mean?) ;; Static symbols coming from CELL-REF - (maybe-note-static-symbol (+ disp (- other-pointer-lowtag n-word-bytes)) + (maybe-note-static-lispobj (+ disp (- other-pointer-lowtag n-word-bytes)) dstate))) (t (princ disp stream)))) @@ -382,6 +444,12 @@ (case width (:qword (unboxed-constant-ref dstate addr disp)))) dstate)))))) + ;; FIXME: is this extra case necessary? The disassembler is too confusing for mere mortals. + ;; ;; If no base and no index, then it could be a SYMBOL-VALUE slot: + ;; ;; 48891425D0003C50 MOV [#x503C00D0], RDX ; (SYMBOL-VALUE '*MYVAR*) + ;; (when (and (null base-reg) (null index-reg)) + ;; (when (maybe-note-static-lispobj disp dstate) + ;; (return-from print-mem-ref))) #+sb-thread (flet ((guess-symbol (predicate) (binding* ((code-header (seg-code (dstate-segment dstate)) :exit-if-null) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 13b668ea67..3dffa2c05f 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1160,3 +1160,8 @@ (assert (search ", 2" (nth (+ start 1) lines))) (assert (search ", 4" (nth (+ start 2) lines))) (assert (search ", 6" (nth (+ start 3) lines))))) + +(defglobal *myglobalvar* 3) +(with-test (:name :disassemble-symbol-global-value) + (assert (loop for line in (disassembly-lines '(lambda () *myglobalvar*)) + thereis (search "(SYMBOL-VALUE '*MYGLOBALVAR*)" line)))) From 6251ca76966dc76cfc69df21f21a715ec325aea1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 14 May 2022 12:12:06 -0400 Subject: [PATCH 3347/4023] x86-64: Untangle print-mem-ref a bit I hoped to gain some consistency in how references to the symbol's value slot is printed, but boy is this code weird. Sometimes it prints (SYMBOL-VALUE '*G*) and sometimes it prints just *G*. The newest bug was that we got two end-of-line notes about one symbol with an intervening newline, because of code guarded by #+sb-thread that shouldn't have been, so when I added "another" note, two notes came out for #+sb-thread. --- src/compiler/x86-64/target-insts.lisp | 45 +++++++++++++-------------- tests/x86-64-codegen.impure.lisp | 2 +- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index 50cffef3b8..cff9c1d453 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -374,9 +374,12 @@ (type (member nil :byte :word :dword :qword) width) (type (or null stream) stream) (type disassem-state dstate)) + ;; If disassembling into the dstate, print nothing; just stash the operand. (when (null stream) (return-from print-mem-ref (operand (cons value width) dstate))) + + ;; Unpack and print the pieces of the machine EA. (let ((base-reg (machine-ea-base value)) (disp (machine-ea-disp value)) (index-reg (machine-ea-index value)) @@ -409,19 +412,20 @@ (princ disp stream)) (firstp (princ16 disp stream) - ;; Avoid the MAYBE-NOTE- calls if we can. A negative offset is never an + ;; Avoid the MAYBE-NOTE call if we can. A negative offset is never an ;; absolute address as would be used for asm routines and static symbols. - (or (minusp disp) - (maybe-note-assembler-routine disp nil dstate) - ;; (FIXME: what does this comment mean?) - ;; Static symbols coming from CELL-REF - (maybe-note-static-lispobj (+ disp (- other-pointer-lowtag n-word-bytes)) - dstate))) + ;; FIRSTP implies lack of a base and index register. + (unless (minusp disp) + (maybe-note-assembler-routine disp nil dstate))) (t (princ disp stream)))) (write-char #\] stream) + + ;; Always try to add an end-of-line comment about the EA. + ;; Assembler routines were already handled above (not really sure why) + ;; so now we have to figure out everything else. + (when (and (eq (machine-ea-base value) :rip) (neq mode :compute)) - ;; Always try to print the EA as a note (block nil (binding* ((seg (dstate-segment dstate)) (code (seg-code seg) :exit-if-null) @@ -444,13 +448,7 @@ (case width (:qword (unboxed-constant-ref dstate addr disp)))) dstate)))))) - ;; FIXME: is this extra case necessary? The disassembler is too confusing for mere mortals. - ;; ;; If no base and no index, then it could be a SYMBOL-VALUE slot: - ;; ;; 48891425D0003C50 MOV [#x503C00D0], RDX ; (SYMBOL-VALUE '*MYVAR*) - ;; (when (and (null base-reg) (null index-reg)) - ;; (when (maybe-note-static-lispobj disp dstate) - ;; (return-from print-mem-ref))) - #+sb-thread + (flet ((guess-symbol (predicate) (binding* ((code-header (seg-code (dstate-segment dstate)) :exit-if-null) (header-n-words (code-header-words code-header))) @@ -458,7 +456,15 @@ for obj = (code-header-ref code-header word-num) when (and (symbolp obj) (funcall predicate obj)) do (return obj))))) + (when (and (not base-reg) (not index-reg) disp) + (let ((addr (+ disp ; guess that DISP points to a symbol-value slot + (- (ash sb-vm:symbol-value-slot sb-vm:word-shift)) + sb-vm:other-pointer-lowtag))) + (awhen (guess-symbol (lambda (s) (= (get-lisp-obj-address s) addr))) + (note (lambda (stream) (prin1 it stream)) dstate) + (return-from print-mem-ref)))) ;; Try to reverse-engineer which thread-local binding this is + #+sb-thread (cond ((and disp ; Test whether disp looks aligned to an object header (not (logtest (- disp 4) sb-vm:lowtag-mask)) (not base-reg) (not index-reg)) @@ -466,8 +472,7 @@ (symbol (guess-symbol (lambda (s) (= (get-lisp-obj-address s) addr))))) (when symbol - ;; Q: what's the difference between "tls_index:" and "tls:" (below)? - (note (lambda (stream) (format stream "tls_index: ~S" symbol)) + (note (lambda (stream) (format stream "tls: ~S" symbol)) dstate)))) ;; thread slots ((and (eql base-reg sb-vm::thread-reg) @@ -491,12 +496,6 @@ (return-from print-mem-ref (note (lambda (stream) (format stream "tls: ~S" symbol)) dstate))))) - ((and (not base-reg) (not index-reg) disp) - (let ((addr (+ disp ; guess that DISP points to a symbol-value slot - (- (ash sb-vm:symbol-value-slot sb-vm:word-shift)) - sb-vm:other-pointer-lowtag))) - (awhen (guess-symbol (lambda (s) (= (get-lisp-obj-address s) addr))) - (note (lambda (stream) (format stream "~A" it)) dstate)))) )))) (defun lea-compute-label (value dstate) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 3dffa2c05f..f0f05c37db 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1164,4 +1164,4 @@ (defglobal *myglobalvar* 3) (with-test (:name :disassemble-symbol-global-value) (assert (loop for line in (disassembly-lines '(lambda () *myglobalvar*)) - thereis (search "(SYMBOL-VALUE '*MYGLOBALVAR*)" line)))) + thereis (search "*MYGLOBALVAR*" line)))) From b9dafd56312a5f012f52e65bcbf60aa93438c51c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 14 May 2022 22:50:11 -0400 Subject: [PATCH 3348/4023] x86-64: Improve SET and CAS-SYMBOL-VALUE * Accept immediate SCs for various operands * Avoiding touching GC card mark if symbol is in immobile space (which uses physical protection) or if writing into TLS * Skip BOUNDP check for unsafe CAS --- src/compiler/x86-64/cell.lisp | 210 ++++++++++++++++---------- src/compiler/x86-64/target-insts.lisp | 5 +- tests/x86-64-codegen.impure.lisp | 50 +++--- 3 files changed, 164 insertions(+), 101 deletions(-) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index eb5f846fc0..304aa93c5b 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -83,19 +83,94 @@ (:generator 1 (inst mov result (unbound-marker-bits)))) +(defmacro emit-symbol-write-barrier (sym &rest rest) + ;; IMMEDIATE sc means that the symbol is static or immobile. + ;; Static symbols are roots, and immobile symbols use page fault handling. + `(unless (sc-is ,sym immediate) (emit-gc-store-barrier ,sym ,@rest))) + (define-vop (%set-symbol-global-value) - (:args (object :scs (descriptor-reg immediate)) + (:args (symbol :scs (descriptor-reg immediate)) (value :scs (descriptor-reg any-reg immediate))) (:policy :fast-safe) (:temporary (:sc unsigned-reg) val-temp) (:vop-var vop) (:generator 4 - (emit-gc-store-barrier object nil val-temp (vop-nth-arg 1 vop) value) - (gen-cell-set (if (sc-is object immediate) - (symbol-slot-ea (tn-value object) symbol-value-slot) - (object-slot-ea object symbol-value-slot other-pointer-lowtag)) + (emit-symbol-write-barrier symbol nil val-temp (vop-nth-arg 1 vop) value) + (gen-cell-set (if (sc-is symbol immediate) + (symbol-slot-ea (tn-value symbol) symbol-value-slot) + (object-slot-ea symbol symbol-value-slot other-pointer-lowtag)) value val-temp))) +;;; This does not resolve the TLS-INDEX at load-time, because we don't want to +;;; waste TLS indices for symbols that may never get thread-locally bound. +;;; So instead we make a fixup to the address of the 4-byte TLS field in the symbol. +(defun symbol-tls-index-ea (symbol) + (ea (make-fixup (tn-value symbol) :immobile-symbol (- 4 other-pointer-lowtag)))) + +(defun get-symbol-value-slot-ea (ea-tn symbol) + (if (sc-is symbol immediate) + (inst mov ea-tn (make-fixup (tn-value symbol) :immobile-symbol + (- (ash symbol-value-slot word-shift) other-pointer-lowtag))) + (inst lea ea-tn (object-slot-ea symbol symbol-value-slot other-pointer-lowtag)))) + +;;; As implemented for x86-64, SET performs at most one conditional branch and no +;;; unconditional jump, contrasting with the other common approach of branching around +;;; a store to either the TLS or the global value, followed by an unconditional jump +;;; out, and in the middle doing the opposite of whichever store was jumped over. +;;; (see the arm64, ppc64, and riscv implementations) +;;; I would surmise that one unconditional branch is preferable. +;;; Slightly in favor of that claim is that if you run this through a C compiler: +;;; void f1(long val, int test, long *a, long *b) { +;;; if (test) *a = val; else *b = val; +;;; } +;;; it generates the same code as if you had written "*(test?a:b) = val;" +;;; So while that's not 100% analagous to this situation here, it does imply +;;; slight favoritism for branch-free code. It might be possible to use CMOV +;;; if we don't need to emit the GC barrier such as when storing a fixnum. +;;; On the other hand, Torvalds has ranted against writing branchless code +;;; for its own sake (https://yarchive.net/comp/linux/cmov.html) +;;; +;;; FIXME: quite likely this vop should exist in several variants, for a known +;;; symbol, variable symbol, etc. As it stands, we can see that a symbol is +;;; always-thread-local only if immobile-space is in use, wherein the symbol's SC +;;; is immediate. +#+sb-thread +(define-vop (set) + (:args (symbol :scs (descriptor-reg immediate)) + (value :scs (descriptor-reg any-reg immediate))) + (:temporary (:sc unsigned-reg) val-temp cell) + #+gs-seg (:temporary (:sc unsigned-reg) thread-temp) + (:vop-var vop) + (:generator 4 + (if (and (sc-is symbol immediate) + (eq (info :variable :wired-tls (tn-value symbol)) :always-thread-local)) + ;; We never need the GC barrier for TLS. I think it would be preferable + ;; to resolve this in IR1, maybe turning it into SET-TLS-VALUE. + (gen-cell-set (ea (make-fixup (tn-value symbol) :symbol-tls-index) thread-tn) + value val-temp) + (let ((store (gen-label))) + (cond ((and (sc-is symbol immediate) + (info :variable :wired-tls (tn-value symbol))) + ;; The TLS index is arbitrary but known to be nonzero, + ;; so we can resolve the displacement of the thread-local value + ;; at load-time, saving one instruction over the general case. + (inst lea cell (ea (make-fixup (tn-value symbol) :symbol-tls-index) + thread-tn))) + (t + ;; These MOVs look the same, but when the symbol is immediate, this is + ;; a load from an absolute address. Needless to say, the names of these + ;; accessor macros are arbitrary - the difference is not very apparent. + (inst mov :dword cell (if (sc-is symbol immediate) + (symbol-tls-index-ea symbol) + (tls-index-of symbol))) + (inst add cell thread-tn))) + (inst cmp :dword (ea cell) no-tls-value-marker-widetag) + (inst jmp :ne STORE) + (emit-symbol-write-barrier symbol nil val-temp (vop-nth-arg 1 vop) value) + (get-symbol-value-slot-ea cell symbol) + (emit-label STORE) + (gen-cell-set (ea cell) value val-temp))))) + (define-vop (fast-symbol-global-value) (:args (object :scs (descriptor-reg immediate))) (:results (value :scs (descriptor-reg any-reg))) @@ -132,34 +207,40 @@ `(%cas-symbol-global-value symbol old new) (sb-c::give-up-ir1-transform))) -(macrolet (;; Logic common to thread-aware SET and CAS. CELL is assigned - ;; to the location that should be accessed to modify SYMBOL's - ;; value either in the TLS or the symbol's value slot as follows: - ;; (1) make it look as if the TLS cell were a symbol by biasing - ;; upward by other-pointer-lowtag less 1 word. - ;; (2) conditionally make CELL point to the symbol itself - (compute-virtual-symbol () - `(progn - (inst mov :dword cell (tls-index-of symbol)) - #+gs-seg (inst rdgsbase thread-temp) - (inst lea cell - (ea (- other-pointer-lowtag (ash symbol-value-slot word-shift)) - #+gs-seg thread-temp - #-gs-seg thread-tn - cell)) - (inst cmp :dword (symbol-value-slot-ea cell) ; TLS reference - no-tls-value-marker-widetag) - (inst cmov :e cell symbol))) ; now possibly get the symbol - (access-wired-tls-val (sym) ; SYM is a symbol +(macrolet ((access-wired-tls-val (sym) ; SYM is a symbol `(thread-tls-ea (load-time-tls-offset ,sym))) (symbol-value-slot-ea (sym) ; SYM is a TN `(ea (- (* symbol-value-slot n-word-bytes) other-pointer-lowtag) - ,sym))) + ,sym)) + (load-oldval () + `(if (sc-is old immediate) + (inst mov rax (encode-value-if-immediate old)) + (move rax old)))) + +(define-vop (%cas-symbol-global-value) + (:translate %cas-symbol-global-value) + (:args (symbol :scs (descriptor-reg immediate) :to (:result 0)) + (old :scs (descriptor-reg any-reg constant immediate)) + (new :scs (descriptor-reg any-reg))) + ;; RAX is the temp for computing the card mark, so it has to conflict + ;; with OLD and therefore the default lifetime spec is fine + (:temporary (:sc descriptor-reg :offset rax-offset :to (:result 0)) rax) + (:results (result :scs (descriptor-reg any-reg))) + (:policy :fast-safe) + (:vop-var vop) + (:generator 10 + (emit-symbol-write-barrier symbol nil rax (vop-nth-arg 2 vop) new) + (load-oldval) + (inst cmpxchg :lock (if (sc-is symbol immediate) + (symbol-slot-ea (tn-value symbol) symbol-value-slot) + (symbol-value-slot-ea symbol)) + new) + (move result rax))) - (define-vop (%compare-and-swap-symbol-value) +(define-vop (%compare-and-swap-symbol-value) (:translate %compare-and-swap-symbol-value) - (:args (symbol :scs (descriptor-reg) :to (:result 0)) - (old :scs (descriptor-reg any-reg) :target rax) + (:args (symbol :scs (descriptor-reg immediate) :to (:result 0)) + (old :scs (descriptor-reg any-reg constant immediate) :target rax) (new :scs (descriptor-reg any-reg))) (:temporary (:sc descriptor-reg :offset rax-offset :from (:argument 1) :to (:result 0)) rax) @@ -168,6 +249,7 @@ (:results (result :scs (descriptor-reg any-reg))) (:policy :fast-safe) (:vop-var vop) + (:node-var node) (:generator 15 ;; This code has two pathological cases: NO-TLS-VALUE-MARKER ;; or UNBOUND-MARKER as NEW: in either case we would end up @@ -175,63 +257,31 @@ ;; Even worse: don't supply old=NO-TLS-VALUE with a symbol whose ;; tls-index=0, because that would succeed, assigning NEW to each ;; symbol in existence having otherwise no thread-local value. - ;; Possible optimization: don't frob the card mark when storing into TLS - (emit-gc-store-barrier symbol nil cell (vop-nth-arg 2 vop) new) - (let ((unbound (generate-error-code vop 'unbound-symbol-error symbol))) - #+sb-thread (progn (compute-virtual-symbol) - (move rax old) - (inst cmpxchg :lock (symbol-value-slot-ea cell) new)) - #-sb-thread (progn (move rax old) - ;; is the :LOCK is necessary? - (inst cmpxchg :lock (symbol-value-slot-ea symbol) new)) + #+sb-thread (progn + (inst mov :dword cell (if (sc-is symbol immediate) + (symbol-tls-index-ea symbol) + (tls-index-of symbol))) + (inst add cell thread-tn) + (inst cmp :dword (ea cell) no-tls-value-marker-widetag) + (inst jmp :ne CAS)) + ;; GLOBAL. All logic that follows is for both + and - sb-thread + (emit-symbol-write-barrier symbol nil cell (vop-nth-arg 2 vop) new) + (get-symbol-value-slot-ea cell symbol) + CAS + (load-oldval) + (inst cmpxchg :lock (ea cell) new) + ;; FIXME: if :ALWAYS-BOUND then elide the BOUNDP check. + ;; But we don't accept a constant or immediate, so how to know + ;; what symbol is being CASed? I kind of feel like whether to perform + ;; the check ought to be supplied as codegen info so that we don't + ;; conflate storage-class of an arg with whether we could elide the check. + (unless (policy node (= safety 0)) (inst cmp :byte rax unbound-marker-widetag) - (inst jmp :e unbound) - (move result rax)))) - - (define-vop (%cas-symbol-global-value) - (:translate %cas-symbol-global-value) - (:args (symbol :scs (descriptor-reg immediate) :to (:result 0)) - (old :scs (descriptor-reg any-reg) #|:target rax|#) - (new :scs (descriptor-reg any-reg))) - ;; if OLD were LOCATION= to RAX then we'd clobber OLD - ;; while computing the EA for the barrier. - (:temporary (:sc descriptor-reg :offset rax-offset - #|:from (:argument 1)|# :to (:result 0)) rax) - (:results (result :scs (descriptor-reg any-reg))) - (:policy :fast-safe) - (:vop-var vop) - (:generator 10 - (emit-gc-store-barrier symbol nil rax (vop-nth-arg 2 vop) new) - (move rax old) - (inst cmpxchg :lock - (if (sc-is symbol immediate) - (symbol-slot-ea (tn-value symbol) symbol-value-slot) - (symbol-value-slot-ea symbol)) - new) + (inst jmp :e (generate-error-code vop 'unbound-symbol-error symbol))) (move result rax))) #+sb-thread (progn - ;; TODO: SET could be shorter for any known wired-tls symbol. - ;; Note that the 32-bit x86 code prefers to use branching code here, where it accesses - ;; either the symbol's slot or the segment-relative absolute displacement to the TLS. - ;; This prefers CMOV, which means we always need the thread's address in a GPR. - (define-vop (set) - (:args (symbol :scs (descriptor-reg)) - (value :scs (descriptor-reg any-reg immediate))) - (:temporary (:sc descriptor-reg) cell) - (:temporary (:sc unsigned-reg) val-temp) - #+gs-seg (:temporary (:sc unsigned-reg) thread-temp) - (:vop-var vop) - (:generator 4 - ;; Possible optimization: don't frob the card mark when storing into TLS - (emit-gc-store-barrier symbol nil val-temp (vop-nth-arg 1 vop) value) - ;; Compute the address into which to store. CMOV can only move into - ;; a register, so we can't conditionally move into the TLS and - ;; conditionally move in the opposite flag sense to the symbol. - (compute-virtual-symbol) - (gen-cell-set (symbol-value-slot-ea cell) value val-temp))) - ;; This code is tested by 'codegen.impure.lisp' (defun emit-symeval (value symbol symbol-reg check-boundp vop) (let* ((known-symbol-p (sc-is symbol constant immediate)) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index cff9c1d453..8a139c0e6f 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -472,7 +472,9 @@ (symbol (guess-symbol (lambda (s) (= (get-lisp-obj-address s) addr))))) (when symbol - (note (lambda (stream) (format stream "tls: ~S" symbol)) + ;; "tls_index:" is access to the half-sized slot within the + ;; symbol header that provides an offset into TLS. + (note (lambda (stream) (format stream "tls_index: ~S" symbol)) dstate)))) ;; thread slots ((and (eql base-reg sb-vm::thread-reg) @@ -494,6 +496,7 @@ :key #'symbol-tls-index)))) (when symbol (return-from print-mem-ref + ;; "tls:" refers to the current value of the symbol in TLS (note (lambda (stream) (format stream "tls: ~S" symbol)) dstate))))) )))) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index f0f05c37db..5b3e915784 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -63,16 +63,8 @@ '(lambda () (sb-sys:%primitive tryme)))) thereis (search "MOV BYTE PTR GS:[RAX]" line)))) -(defun disasm (safety expr &optional (remove-epilogue t)) - ;; This lambda has a name because if it doesn't, then the name - ;; is something stupid like (lambda () in ...) which pretty-prints - ;; on a random number of lines. - (let ((fun (compile nil - `(sb-int:named-lambda test () - (declare (optimize (debug 0) (safety ,safety) - (sb-c:verify-arg-count 0))) - ,expr)))) - (let ((lines (disassembly-lines fun))) +(defun strip-assem-junk (fun &optional (remove-epilogue t)) + (let ((lines (disassembly-lines (compile nil fun)))) ;; For human-readability, kill the whitespace (setq lines (mapcar (lambda (x) (string-left-trim " ;" x)) lines)) (when (string= (car (last lines)) "") @@ -87,16 +79,34 @@ '("MOV RSP, RBP" "CLC" "POP RBP" "RET") (subseq lines (- (length lines) 4)))) (butlast lines 4) - lines)))) + lines))) +(defun disasm-load (safety symbol) + ;; This lambda has a name because if it doesn't, then the name + ;; is something stupid like (lambda () in ...) which pretty-prints + ;; on a random number of lines. + (strip-assem-junk `(sb-int:named-lambda test () + (declare (optimize (debug 0) (safety ,safety) + (sb-c:verify-arg-count 0))) + ,symbol))) +(defun disasm-store (sexpr) + (strip-assem-junk `(sb-int:named-lambda test (x) + (declare (ignorable x)) + (declare (optimize (debug 0) + (sb-c:verify-arg-count 0))) + ,sexpr))) (with-test (:name :symeval-known-thread-local :skipped-on (not :sb-thread)) ;; It should take 1 instruction to read a known thread-local var - (assert (= (length (disasm 1 'sb-thread:*current-thread*)) 1)) - (assert (= (length (disasm 1 'sb-sys:*interrupt-pending*)) 1)) - (assert (= (length (disasm 1 'sb-kernel:*gc-inhibit*)) 1)) - (assert (= (length (disasm 1 'sb-kernel:*restart-clusters*)) 1)) - (assert (= (length (disasm 1 'sb-kernel:*handler-clusters*)) 1))) + (assert (= (length (disasm-load 1 'sb-thread:*current-thread*)) 1)) + (assert (= (length (disasm-load 1 'sb-sys:*interrupt-pending*)) 1)) + (assert (= (length (disasm-load 1 'sb-kernel:*gc-inhibit*)) 1)) + (assert (= (length (disasm-load 1 'sb-kernel:*restart-clusters*)) 1)) + (assert (= (length (disasm-load 1 'sb-kernel:*handler-clusters*)) 1))) + +(with-test (:name :set-known-thread-local :skipped-on (not :sb-thread)) + ;; It should take 1 instruction to write a known thread-local var + (assert (= (length (disasm-store '(setq sb-kernel:*gc-inhibit* x))) 1))) ;; Lack of earmuffs on this symbol allocates it in dynamic space (defvar foo) @@ -113,7 +123,7 @@ ;; 83FA61 CMP EDX, 97 ;; 480F44142538F94B20 CMOVEQ RDX, [#x204BF938] ; *PRINT-BASE* ;; (TODO: could use "CMOVEQ RDX, [RIP-n]" in immobile code) - (let ((text (disasm 0 '*print-base*))) + (let ((text (disasm-load 0 '*print-base*))) (assert (= (length text) 3)) ; number of lines ;; two lines should be annotated with *PRINT-BASE* (assert (= (loop for line in text count (search "*PRINT-BASE*" line)) 2))) @@ -123,7 +133,7 @@ ;; 488B059EFFFFFF MOV RAX, [RIP-98] ; 'FOO ;; 83FA61 CMP EDX, 97 ;; 480F4450F9 CMOVEQ RDX, [RAX-7] - (let ((text (disasm 0 'foo))) + (let ((text (disasm-load 0 'foo))) (assert (= (length text) 4)) ;; two lines should be annotated with FOO (assert (= (loop for line in text count (search "FOO" line)) 2)))) @@ -142,7 +152,7 @@ ;; 83FA61 CMP EDX, 97 ;; 480F44142518A24C20 CMOVEQ RDX, [#x204CA218] ; *BLUB* ;; (TODO: could use "CMOVEQ RDX, [RIP-n]" in immobile code) - (let ((text (disasm 0 '*blub*))) + (let ((text (disasm-load 0 '*blub*))) (assert (= (length text) 4)) ;; two lines should be annotated with *BLUB* (assert (= (loop for line in text count (search "*BLUB*" line)) 2))) @@ -153,7 +163,7 @@ ;; 4A8B142A MOV RDX, [RDX+R13] ;; 83FA61 CMP EDX, 97 ;; 480F4450F9 CMOVEQ RDX, [RAX-7] - (assert (= (length (disasm 0 'blub)) 5))) + (assert (= (length (disasm-load 0 'blub)) 5))) (with-test (:name :object-not-type-error-encoding) ;; There should not be a "MOV Rnn, #xSYMBOL" instruction From c5a796443dc746cd1f28d83b36d5178f7d32c013 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 00:11:16 +0300 Subject: [PATCH 3349/4023] line/col-from-charpos: handle no form-start-char-pos. If there's a character encoding error it might be NIL. --- src/code/fd-stream.lisp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index c088517acc..6fc3343f78 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -209,18 +209,22 @@ (defun line/col-from-charpos (stream &optional (charpos (ansi-stream-input-char-pos stream))) - (let* ((newlines (form-tracking-stream-newlines stream)) - (index (position charpos newlines :test #'>= :from-end t))) - ;; Line numbers traditionally begin at 1, columns at 0. - (if index - ;; INDEX is 1 less than the number of newlines seen - ;; up to and including this startpos. - ;; e.g. index=0 => 1 newline seen => line=2 - (cons (+ index 2) - ;; 1 char after the newline = column 0 - (- charpos (aref newlines index) 1)) - ;; zero newlines were seen - (cons 1 charpos)))) + (let ((newlines (form-tracking-stream-newlines stream))) + (if charpos + (let ((index (position charpos newlines :test #'>= :from-end t))) + ;; Line numbers traditionally begin at 1, columns at 0. + (if index + ;; INDEX is 1 less than the number of newlines seen + ;; up to and including this startpos. + ;; e.g. index=0 => 1 newline seen => line=2 + (cons (+ index 2) + ;; 1 char after the newline = column 0 + (- charpos (aref newlines index) 1)) + ;; zero newlines were seen + (cons 1 charpos))) + ;; No charpos means the error is before reading the first char + ;; e.g. an encoding error. Take the last Newline. + (cons (1+ (length newlines)) 0)))) ;;;; CORE OUTPUT FUNCTIONS From 0d7bfe720144b539fb434834f27a85705eda8f31 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 00:15:18 +0300 Subject: [PATCH 3350/4023] Skip x86-64-codegen.impure/set-known-thread-local on -immobile-space. --- tests/x86-64-codegen.impure.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 5b3e915784..e8dc26ab46 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -104,7 +104,8 @@ (assert (= (length (disasm-load 1 'sb-kernel:*restart-clusters*)) 1)) (assert (= (length (disasm-load 1 'sb-kernel:*handler-clusters*)) 1))) -(with-test (:name :set-known-thread-local :skipped-on (not :sb-thread)) +(with-test (:name :set-known-thread-local :skipped-on (or (not :immobile-space) + (not :sb-thread))) ;; It should take 1 instruction to write a known thread-local var (assert (= (length (disasm-store '(setq sb-kernel:*gc-inhibit* x))) 1))) From 17b20d9d05cb350b1a7ea6c2c134c2312ea57cd0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 01:26:42 +0300 Subject: [PATCH 3351/4023] make-fd-stream: stop auto-close from doing anything. The finalizer closes over the FD, but the stream may have been already closed and the FD recycled for another stream, producing really bad results. Disable it until a proper solution is devised. --- src/code/fd-stream.lisp | 17 ++++++++++------- tests/run-program.impure.lisp | 4 ++-- tests/save9.test.sh | 1 + 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index 6fc3343f78..ea92a2e78a 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -2310,13 +2310,16 @@ (set-fd-stream-routines stream element-type external-format input output input-buffer-p) (when auto-close - (finalize stream - (lambda () - (sb-unix:unix-close fd) - #+sb-show - (format *terminal-io* "** closed file descriptor ~W **~%" - fd)) - :dont-save t)) + ;; FIXME: this is broken + ;; the fd may have already been recycled for another stream. + ;; (finalize stream + ;; (lambda () + ;; (sb-unix:unix-close fd) + ;; #+sb-show + ;; (format *terminal-io* "** closed file descriptor ~W **~%" + ;; fd)) + ;; :dont-save t) + ) stream)) ;;; Pick a name to use for the backup file for the :IF-EXISTS diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index 9e4c86558d..a121f6212b 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -19,8 +19,8 @@ (length initially-open-fds))) (with-test (:name (run-program :autoclose-streams) - :skipped-on (:or :sbcl ;; not reliable enough - (:not :linux))) + :broken-on :sbcl ;; not reliable enough + :skipped-on (not :linux)) (let ((n-initially-open-fds (bin-pwd-ignoring-result))) (gc) (sb-sys:scrub-control-stack) ; Make sure we're not referencing the #<process> diff --git a/tests/save9.test.sh b/tests/save9.test.sh index 695eda9ada..4c5a48427f 100755 --- a/tests/save9.test.sh +++ b/tests/save9.test.sh @@ -1,3 +1,4 @@ +exit 104 # Don't try to run sbcl from /tmp on openbsd as it's unlikely to be # mounted with wxallowed if [ "$SBCL_SOFTWARE_TYPE" != OpenBSD ]; then From 3906d4d49542299f9d1ddd4f727e817873148487 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 03:08:18 +0300 Subject: [PATCH 3352/4023] arm64: handle symbol-always-has-tls-value-p in SET. --- src/compiler/arm64/cell.lisp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 0a8cd703b6..9f06e711d9 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -72,19 +72,26 @@ #+sb-thread (progn (define-vop (set) - (:args (object :scs (descriptor-reg)) + (:args (object :scs (descriptor-reg) + :load-if (not (and (sc-is object constant) + (symbol-always-has-tls-value-p (tn-value object))))) (value :scs (descriptor-reg any-reg zero))) (:temporary (:sc any-reg) tls-index) (:generator 4 - (inst ldr (32-bit-reg tls-index) (tls-index-of object)) - (inst ldr tmp-tn (@ thread-tn tls-index)) - (inst cmp tmp-tn no-tls-value-marker-widetag) - (inst b :ne LOCAL) - (storew value object symbol-value-slot other-pointer-lowtag) - (inst b DONE) - LOCAL - (inst str value (@ thread-tn tls-index)) - DONE)) + (sc-case object + (constant + (inst str value (@ thread-tn (make-fixup (tn-value object) :symbol-tls-index)))) + (t + (assemble () + (inst ldr (32-bit-reg tls-index) (tls-index-of object)) + (inst ldr tmp-tn (@ thread-tn tls-index)) + (inst cmp tmp-tn no-tls-value-marker-widetag) + (inst b :ne LOCAL) + (storew value object symbol-value-slot other-pointer-lowtag) + (inst b DONE) + LOCAL + (inst str value (@ thread-tn tls-index)) + DONE))))) (define-vop (symbol-value checked-cell-ref) (:translate symbol-value) From 59b0bf1d3bb25b50b47d5fe4dbf46386f217833e Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 16 May 2022 00:41:27 -0700 Subject: [PATCH 3353/4023] Conditionalize out some metaspace code. This stuff is not used in normal builds. #+metaspace also has never seemed to work (looks like it was accidentally committed to master rather than a branch of its own?), so this dead code was doubly confusing when trying to refactor genesis.x --- src/compiler/generic/genesis.lisp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 56c5e8a2c3..e1b618fcc6 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -211,6 +211,7 @@ (code-free-ranges (list nil)) (non-code-free-ranges (list nil)) ;; for metaspace + #+metaspace current-slab ;; Address of every object created in this space. (objects (or #+sb-devel (make-array 700000 :fill-pointer 0 :adjustable t))) @@ -356,6 +357,7 @@ ;;; If the current slab (at the head of METASPACE-SLABS) ;;; has room, then use it. Otherwise allocate a new slab ;;; at a lower address. +#+metaspace (defun allocate-metaspace-layout (gspace nbytes) (assert (= nbytes (* 8 sb-vm:n-word-bytes))) (let ((slab (gspace-current-slab gspace))) @@ -391,13 +393,15 @@ ;;; is needed, we grow the GSPACE. The descriptor returned is a ;;; pointer of type LOWTAG. (defun allocate-cold-descriptor (gspace length lowtag &optional (page-type :mixed)) - (let ((des - (if (and (eq gspace *read-only*) (eq lowtag sb-vm:instance-pointer-lowtag)) - (allocate-metaspace-layout gspace length) - (let* ((relative-ptr (ash (gspace-claim-n-bytes gspace length page-type) - sb-vm:word-shift)) - (ptr (+ (gspace-byte-address gspace) relative-ptr))) - (make-descriptor (logior ptr lowtag) gspace relative-ptr))))) + (let* ((relative-ptr (ash (gspace-claim-n-bytes gspace length page-type) + sb-vm:word-shift)) + (ptr (+ (gspace-byte-address gspace) relative-ptr)) + (des (if (and (eq gspace *read-only*) (eq lowtag sb-vm:instance-pointer-lowtag)) + #+metaspace + (allocate-metaspace-layout gspace length) + #-metaspace + (error "Shouldn't happen.") + (make-descriptor (logior ptr lowtag) gspace relative-ptr)))) (awhen (gspace-objects gspace) (vector-push-extend des it)) des)) From aee85265cfa8a73ff3713f23b52ebf7168f1e38c Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 16 May 2022 01:03:41 -0700 Subject: [PATCH 3354/4023] Delete completely useless definition of DECLAIM. It odesn't do anything now since START-BLOCK resolves to SB-EXT, and not whatever the symbol on the host is. --- src/code/cross-early.lisp | 10 ---------- src/cold/set-up-cold-packages.lisp | 4 ---- 2 files changed, 14 deletions(-) diff --git a/src/code/cross-early.lisp b/src/code/cross-early.lisp index 8c95e2d1c5..b1b20be9fe 100644 --- a/src/code/cross-early.lisp +++ b/src/code/cross-early.lisp @@ -11,16 +11,6 @@ (in-package "SB-IMPL") -(defmacro sb-xc:declaim (&rest declaration-specifiers) - #+sb-devel - (setq declaration-specifiers - (remove-if (lambda (declaration-specifier) - (member (first declaration-specifier) - '(#+sb-devel start-block - #+sb-devel end-block))) - declaration-specifiers)) - `(cl:declaim ,@declaration-specifiers)) - (declaim (declaration truly-dynamic-extent)) ;;; MAYBE-INLINE, FREEZE-TYPE, and block compilation declarations can be safely ignored diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index c8ad44d673..4f8a617a68 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -292,10 +292,6 @@ "UPGRADED-ARRAY-ELEMENT-TYPE" "UPGRADED-COMPLEX-PART-TYPE" "WITH-COMPILATION-UNIT" - - ;; For debugging purposes, we want to be able to intercept inline - ;; and block compilation declamations in the host. - "DECLAIM" )) ;;; A symbol in the "dual personality" list refers to the symbol in CL unless From cee387b263930f58921d2c919a51c20d675ebfb4 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 16 May 2022 01:18:10 -0700 Subject: [PATCH 3355/4023] Simplify target package creation. Just use DEFPACKAGE* instead of creating backend assembly packages manually. --- src/cold/exports.lisp | 7 +++++++ src/cold/set-up-cold-packages.lisp | 29 +---------------------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index c5f91bd2bd..97058840c8 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2730,6 +2730,13 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "BRANCH" "FLUSHABLE")) +(defpackage* #.(backend-asm-package-name) + (:documentation "private: backend-specific assembler mnemonics") + (:use "CL" "SB-ASSEM" "SB-DISASSEM" + "SB-INT" "SB-EXT" "SB-KERNEL" "SB-VM" + "SB-SYS" "SB-C") + (:shadow "SEGMENT" "MAKE-SEGMENT")) + (defpackage* "SB-THREAD" (:documentation "public (but low-level): native thread support") (:use "CL" "SB-ALIEN" "SB-INT" "SB-SYS" "SB-KERNEL") diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 4f8a617a68..afff89e514 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -492,35 +492,8 @@ (dolist (name (apply #'append (read data))) (setf (gethash name *undefined-fun-allowlist*) t))))) -(defvar *asm-package-use-list* - '("SB-ASSEM" "SB-DISASSEM" - "SB-INT" "SB-EXT" "SB-KERNEL" "SB-VM" - "SB-SYS" ; for SAP accessors - ;; Dependence of the assembler on the compiler feels a bit backwards, - ;; but assembly needs TN-SC, TN-OFFSET, etc. because the compiler - ;; doesn't speak the assembler's language. Rather vice-versa. - "SB-C")) -(defun make-assembler-package (pkg-name) - (when (find-package pkg-name) - (delete-package pkg-name)) - (let ((pkg (make-package pkg-name - :use (cons "XC-STRICT-CL" (cddr *asm-package-use-list*))))) - ;; Both SB-ASSEM and SB-DISASSEM export these two symbols. - ;; Neither is shadowing-imported. If you need one, package-qualify it. - (shadow '("SEGMENT" "MAKE-SEGMENT") pkg) - (use-package '("SB-ASSEM" "SB-DISASSEM") pkg) - pkg)) - -;; Each backend should have a different package for its instruction set -;; so that they can co-exist. -(make-assembler-package (backend-asm-package-name)) - (defun package-list-for-genesis () - (append *package-data-list* - (let ((asm-package (backend-asm-package-name))) - (list (make-package-data :name asm-package - :use (list* "CL" *asm-package-use-list*) - :documentation nil))))) + *package-data-list*) ;;; Not all things shown by this are actually unused. Some get removed ;;; by the tree-shaker as intended. From 71146c59430e7cf10ba2f8f5bf74d23742983b2a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 16 May 2022 11:40:16 -0400 Subject: [PATCH 3356/4023] Cancel stream finalizer before UNIX-CLOSE Otherwise, the close() would make the fd available again; then another thread could open() a file, but then GC could schedule the finalizer that wasn't removed before we got to cancel it. --- src/code/fd-stream.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index ea92a2e78a..ea47139c25 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -1935,9 +1935,9 @@ ;; us with a dangling finalizer (that would close the same ;; --possibly reassigned-- FD again), or a stream with a closed ;; FD that appears open. + (cancel-finalization fd-stream) (sb-unix:unix-close (fd-stream-fd fd-stream)) - (set-closed-flame fd-stream) - (cancel-finalization fd-stream)) + (set-closed-flame fd-stream)) ;; On error unwind from WITHOUT-INTERRUPTS. (serious-condition (e) (error e))) From e8b5fb7d81ed2d8c92268fdea15c576fc65a413c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Mon, 16 May 2022 17:09:02 +0100 Subject: [PATCH 3357/4023] Refactor filesys tests using new macro WITH-TEST-DIRECTORY Regrets about having tests write into the source directory are now centralised into this new utility. In addition to abstracting the existing pattern of creating then cleaning up a test directory based on the TEST_DIRECTORY environment variable, WITH-TEST-DIRECTORY also interacts with CHECK-MANIFEST to avoid hardcoding the names of temporary files within the test directory. (a.txt and b.lisp in particular are only being touched and could be opened with :DIRECTION :OUTPUT instead to avoid tripping on CHECK-MANIFEST. But this behaviour will be useful in a future test.) --- tests/filesys.pure.lisp | 85 ++++++++++++++++++----------------------- tests/run-tests.lisp | 8 +++- tests/test-util.lisp | 23 +++++++++++ 3 files changed, 66 insertions(+), 50 deletions(-) diff --git a/tests/filesys.pure.lisp b/tests/filesys.pure.lisp index ee7f8d8fc0..78f7732ec7 100644 --- a/tests/filesys.pure.lisp +++ b/tests/filesys.pure.lisp @@ -88,38 +88,32 @@ (directory "*/")))))) (with-test (:name (directory *default-pathname-defaults* :bug-1740563)) - ;; FIXME: this writes into the source directory depending on whether - ;; TEST_DIRECTORY has been made to point elsewhere or not. - (let ((test-directory (concatenate 'string (sb-ext:posix-getenv "TEST_DIRECTORY") "/"))) - (ensure-directories-exist test-directory) - (close (open (merge-pathnames "a.txt" test-directory) :if-does-not-exist :create)) - (close (open (merge-pathnames "b.lisp" test-directory) :if-does-not-exist :create)) - (unwind-protect - (flet ((directory* (pattern &rest d-p-d-components) - (let ((*default-pathname-defaults* - (apply #'make-pathname - :defaults *default-pathname-defaults* - d-p-d-components))) - (directory pattern)))) - (let* ((*default-pathname-defaults* (pathname test-directory)) - (expected-wild (directory "*.*")) - (expected-one-file (directory "a.txt")) - (cases '((:name nil :type "txt") - (:name nil :type :wild) - (:name "a" :type nil) - (:name "a" :type "txt") - (:name "a" :type :wild) - (:name :wild :type nil) - (:name :wild :type :wild) - (:name :wild :type "txt")))) - (dolist (components cases) - (assert (equal (apply #'directory* "*.*" components) - expected-wild)) - (assert (equal (apply #'directory* "a.txt" components) - expected-one-file))) - (assert (equal (directory* "" :name :wild :type :wild) - expected-wild)))) - (delete-directory test-directory :recursive t)))) + (with-test-directory () + (close (open "a.txt" :if-does-not-exist :create)) + (close (open "b.lisp" :if-does-not-exist :create)) + (flet ((directory* (pattern &rest d-p-d-components) + (let ((*default-pathname-defaults* + (apply #'make-pathname + :defaults *default-pathname-defaults* + d-p-d-components))) + (directory pattern)))) + (let* ((expected-wild (directory "*.*")) + (expected-one-file (directory "a.txt")) + (cases '((:name nil :type "txt") + (:name nil :type :wild) + (:name "a" :type nil) + (:name "a" :type "txt") + (:name "a" :type :wild) + (:name :wild :type nil) + (:name :wild :type :wild) + (:name :wild :type "txt")))) + (dolist (components cases) + (assert (equal (apply #'directory* "*.*" components) + expected-wild)) + (assert (equal (apply #'directory* "a.txt" components) + expected-one-file))) + (assert (equal (directory* "" :name :wild :type :wild) + expected-wild)))))) ;;;; OPEN @@ -404,22 +398,17 @@ (append (when namep '(:name :unspecific)) (when typep '(:type :unspecific))))) (test (as-file as-directory) - (let* ((test-directory (concatenate - 'string - (sb-ext:posix-getenv "TEST_DIRECTORY") "/")) - (delete-directory (merge-pathnames - (typecase as-file - (string (prepare as-file)) - (pathname as-file)) - test-directory))) - (ensure-directories-exist (merge-pathnames - (prepare as-directory) - test-directory)) - (unwind-protect - (progn - (delete-directory delete-directory) - (assert (not (probe-file (prepare as-directory))))) - (delete-directory test-directory :recursive t))))) + (with-test-directory (test-directory) + (let ((delete-directory (merge-pathnames + (typecase as-file + (string (prepare as-file)) + (pathname as-file)) + test-directory))) + (ensure-directories-exist (merge-pathnames + (prepare as-directory) + test-directory)) + (delete-directory delete-directory) + (assert (not (probe-file (prepare as-directory)))))))) ;; Name component present #-win32 (test "aE?b" "aE?b/") #-win32 (test "aE*b" "aE*b/") diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index 0013fbfadc..fa22be2593 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -159,7 +159,10 @@ (stem= (a b) (string= (stem-of a) (stem-of b))) (starts-with-p (string prefix) - (= (mismatch string prefix) (length prefix)))) + (= (mismatch string prefix) (length prefix))) + (within-directory-p (path directory) + (starts-with-p (namestring (merge-pathnames path)) + (namestring directory)))) (unless (eq (pathname-host filename) sb-impl::*physical-host*) (return-from check-manifest)) (let ((string (namestring filename))) @@ -174,9 +177,10 @@ (starts-with-p string "/tmp/") (starts-with-p string "/var/tmp/") (starts-with-p string "/private/var/folders/") + (and (boundp '*test-directory*) + (within-directory-p filename *test-directory*)) (string= string "exists") (member (stem-of filename) '("compiler-test-util.lisp" - "a.txt" "b.lisp" "no-such-file") :test #'string=) (string= (pathname-name filename) "i-am-not") ; any extension diff --git a/tests/test-util.lisp b/tests/test-util.lisp index 1f00de7ae1..0765b162e5 100644 --- a/tests/test-util.lisp +++ b/tests/test-util.lisp @@ -34,6 +34,8 @@ #:scratch-file-name #:*scratch-file-prefix* #:with-scratch-file + #:with-test-directory + #:*test-directory* #:opaque-identity #:runtime #:split-string #:integer-sequence #:shuffle)) @@ -884,6 +886,27 @@ (let ((,var ,tempname)) ,@forms) ; rebind, as test might asssign into VAR (ignore-errors (delete-file ,tempname)))))) +(defvar *test-directory*) + +(defun call-with-test-directory (fn) + ;; FIXME: this writes into the source directory depending on whether + ;; TEST_DIRECTORY has been made to point elsewhere or not. + (let ((test-directory (parse-native-namestring (posix-getenv "TEST_DIRECTORY") + nil *default-pathname-defaults* + :as-directory t))) + (ensure-directories-exist test-directory) + (unwind-protect + (let ((*default-pathname-defaults* test-directory) + (*test-directory* test-directory)) + (funcall fn test-directory)) + (delete-directory test-directory :recursive t)))) + +(defmacro with-test-directory ((&optional (test-directory-var (gensym))) + &body body) + `(call-with-test-directory (lambda (,test-directory-var) + (declare (ignorable ,test-directory-var)) + ,@body))) + ;;; Take a list of lists and assemble them as though they are ;;; instructions inside the body of a vop. There is no need ;;; to use the INST macro in front of each list. From 87f72d9e2758e25d07b7d6ca3bda6e2597388efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Mon, 16 May 2022 17:09:02 +0100 Subject: [PATCH 3358/4023] win32: make RENAME-FILE overwrite its target file This is consistent with what we do on other platforms (as evidenced by the newly added unit test) and it is also consistent with what other implementations (namely Allegro CL and Lispworks) do on Windows. --- NEWS | 2 ++ src/code/win32.lisp | 6 ++++-- tests/filesys.pure.lisp | 11 +++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 31bf1bd594..57b39e4c17 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ changes relative to sbcl-2.2.4: means that function calls will strictly only use type information from proclaimed ftypes. The previous behavior (still the default) of using derived type information from the same file is specified with :SAME-FILE. + * minor incompatible change: RENAME-FILE now overwrites the target file on + Windows too, making its behaviour consistent with other platforms. * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. * enhancement: debug source locations now work correctly for top level forms diff --git a/src/code/win32.lisp b/src/code/win32.lisp index 07525715d3..9d7dc62f35 100644 --- a/src/code/win32.lisp +++ b/src/code/win32.lisp @@ -316,11 +316,13 @@ (values result (if result 0 (get-last-error))) name nil)) +(defconstant +movefile-replace-existing+ 1) + (defun sb-unix:unix-rename (name1 name2) (declare (type sb-unix:unix-pathname name1 name2)) - (syscall (("MoveFile" t) lispbool system-string system-string) + (syscall (("MoveFileEx" t) lispbool system-string system-string dword) (values result (if result 0 (get-last-error))) - name1 name2)) + name1 name2 +movefile-replace-existing+)) (defun sb-unix::posix-getenv (name) (declare (type simple-string name)) diff --git a/tests/filesys.pure.lisp b/tests/filesys.pure.lisp index 78f7732ec7..5ea7b4313f 100644 --- a/tests/filesys.pure.lisp +++ b/tests/filesys.pure.lisp @@ -429,3 +429,14 @@ (test (make-unspecific nil t) "foo/") (test (make-unspecific t nil) "foo/") (test (make-unspecific t t) "foo/"))) + +(with-test (:name (rename-file :overwrite)) + (with-test-directory () + (with-open-file (s "a" :direction :output) + (write-line "a" s)) + (with-open-file (s "b" :direction :output) + (write-line "b" s)) + (rename-file "a" "b") + (assert (null (probe-file "a"))) + (with-open-file (s "b") + (assert (equal "a" (read-line s)))))) From b6732ebc2e495cc8bafbeb0364aea2f364045c01 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 20:46:27 +0300 Subject: [PATCH 3359/4023] Fix run-program closing streams and restore fd-stream finalizers. Don't call unix-close on fds for which an fd-stream is created. --- src/code/fd-stream.lisp | 17 ++++++-------- src/code/run-program.lisp | 49 +++++++++++++++++++++------------------ tests/save9.test.sh | 1 - 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index ea47139c25..b84b17cd9f 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -2310,16 +2310,13 @@ (set-fd-stream-routines stream element-type external-format input output input-buffer-p) (when auto-close - ;; FIXME: this is broken - ;; the fd may have already been recycled for another stream. - ;; (finalize stream - ;; (lambda () - ;; (sb-unix:unix-close fd) - ;; #+sb-show - ;; (format *terminal-io* "** closed file descriptor ~W **~%" - ;; fd)) - ;; :dont-save t) - ) + (finalize stream + (lambda () + (sb-unix:unix-close fd) + #+sb-show + (format *terminal-io* "** closed file descriptor ~W **~%" + fd)) + :dont-save t)) stream)) ;;; Pick a name to use for the backup file for the :IF-EXISTS diff --git a/src/code/run-program.lisp b/src/code/run-program.lisp index 5ed0e1fa38..1ede70f930 100644 --- a/src/code/run-program.lisp +++ b/src/code/run-program.lisp @@ -406,8 +406,11 @@ status slot." ;;;; RUN-PROGRAM and close friends -;;; list of file descriptors to close when RUN-PROGRAM exits due to an error -(defvar *close-on-error* nil) +;;; list of file descriptors and streams to close when RUN-PROGRAM +;;; exits due to an error +(defvar *close-fds-on-error* nil) +;;; Separate from fds to ensure the finalizer and all the buffers are cleared too. +(defvar *close-streams-on-error* nil) ;;; list of file descriptors to close when RUN-PROGRAM returns in the parent (defvar *close-in-parent* nil) @@ -493,13 +496,13 @@ status slot." (multiple-value-bind (master slave name) (find-a-pty) - (push master *close-on-error*) + (push master *close-fds-on-error*) (push slave *close-in-parent*) (when (streamp pty) (multiple-value-bind (new-fd errno) (sb-unix:unix-dup master) (unless new-fd (error "couldn't SB-UNIX:UNIX-DUP ~W: ~A" master (strerror errno))) - (push new-fd *close-on-error*) + (push new-fd *close-fds-on-error*) (copy-descriptor-to-stream new-fd pty cookie external-format))) (values name (make-fd-stream master :input t :output t @@ -837,7 +840,7 @@ Users Manual for details about the PROCESS structure. (error "can't specify :ENV and :ENVIRONMENT simultaneously")) (let* (;; Clear various specials used by GET-DESCRIPTOR-FOR to ;; communicate cleanup info. - *close-on-error* + *close-fds-on-error* *close-in-parent* *handlers-installed* ;; Establish PROC at this level so that we can return it. @@ -967,8 +970,10 @@ Users Manual for details about the PROCESS structure. (dolist (fd *close-in-parent*) (sb-unix:unix-close fd)) (unless proc - (dolist (fd *close-on-error*) + (dolist (fd *close-fds-on-error*) (sb-unix:unix-close fd)) + (dolist (stream *close-streams-on-error*) + (close stream :abort t)) #-win32 (dolist (handler *handlers-installed*) (remove-fd-handler handler))) @@ -1184,26 +1189,26 @@ Users Manual for details about the PROCESS structure. (eq direction :output)) (case direction (:input - (push read-fd *close-in-parent*) - (push write-fd *close-on-error*) - (let ((stream (make-fd-stream write-fd :output t + (push read-fd *close-in-parent*) + (let ((stream (make-fd-stream write-fd :output t :element-type :default :external-format external-format :auto-close t))) - (values read-fd stream))) + (push stream *close-streams-on-error*) + (values read-fd stream))) (:output - (push read-fd *close-on-error*) - (push write-fd *close-in-parent*) - (let ((stream (make-fd-stream read-fd :input t - :element-type :default - :external-format external-format - :auto-close t))) - (values write-fd stream))) + (push write-fd *close-in-parent*) + (let ((stream (make-fd-stream read-fd :input t + :element-type :default + :external-format external-format + :auto-close t))) + (push stream *close-streams-on-error*) + (values write-fd stream))) (t - (sb-unix:unix-close read-fd) - (sb-unix:unix-close write-fd) - (fail "Direction must be either :INPUT or :OUTPUT, not ~S." - direction))))) + (sb-unix:unix-close read-fd) + (sb-unix:unix-close write-fd) + (fail "Direction must be either :INPUT or :OUTPUT, not ~S." + direction))))) ((or (pathnamep object) (stringp object)) ;; GET-DESCRIPTOR-FOR uses &allow-other-keys, so rather ;; than munge the &rest list for OPEN, just disable keyword @@ -1317,7 +1322,7 @@ Users Manual for details about the PROCESS structure. (setf (sb-win32::inheritable-handle-p write-fd) t) (copy-descriptor-to-stream read-fd object cookie external-format) - (push read-fd *close-on-error*) + (push read-fd *close-fds-on-error*) (push write-fd *close-in-parent*) (return (values write-fd nil))))))) (t diff --git a/tests/save9.test.sh b/tests/save9.test.sh index 4c5a48427f..695eda9ada 100755 --- a/tests/save9.test.sh +++ b/tests/save9.test.sh @@ -1,4 +1,3 @@ -exit 104 # Don't try to run sbcl from /tmp on openbsd as it's unlikely to be # mounted with wxallowed if [ "$SBCL_SOFTWARE_TYPE" != OpenBSD ]; then From 044aa765cdaa7701574c916a642ce1d19489076b Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 16 May 2022 10:51:10 -0700 Subject: [PATCH 3360/4023] Revert "Simplify target package creation." This reverts commit cee387b263930f58921d2c919a51c20d675ebfb4. Breaks chill. --- src/cold/exports.lisp | 7 ------- src/cold/set-up-cold-packages.lisp | 29 ++++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 97058840c8..c5f91bd2bd 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2730,13 +2730,6 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "BRANCH" "FLUSHABLE")) -(defpackage* #.(backend-asm-package-name) - (:documentation "private: backend-specific assembler mnemonics") - (:use "CL" "SB-ASSEM" "SB-DISASSEM" - "SB-INT" "SB-EXT" "SB-KERNEL" "SB-VM" - "SB-SYS" "SB-C") - (:shadow "SEGMENT" "MAKE-SEGMENT")) - (defpackage* "SB-THREAD" (:documentation "public (but low-level): native thread support") (:use "CL" "SB-ALIEN" "SB-INT" "SB-SYS" "SB-KERNEL") diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index afff89e514..4f8a617a68 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -492,8 +492,35 @@ (dolist (name (apply #'append (read data))) (setf (gethash name *undefined-fun-allowlist*) t))))) +(defvar *asm-package-use-list* + '("SB-ASSEM" "SB-DISASSEM" + "SB-INT" "SB-EXT" "SB-KERNEL" "SB-VM" + "SB-SYS" ; for SAP accessors + ;; Dependence of the assembler on the compiler feels a bit backwards, + ;; but assembly needs TN-SC, TN-OFFSET, etc. because the compiler + ;; doesn't speak the assembler's language. Rather vice-versa. + "SB-C")) +(defun make-assembler-package (pkg-name) + (when (find-package pkg-name) + (delete-package pkg-name)) + (let ((pkg (make-package pkg-name + :use (cons "XC-STRICT-CL" (cddr *asm-package-use-list*))))) + ;; Both SB-ASSEM and SB-DISASSEM export these two symbols. + ;; Neither is shadowing-imported. If you need one, package-qualify it. + (shadow '("SEGMENT" "MAKE-SEGMENT") pkg) + (use-package '("SB-ASSEM" "SB-DISASSEM") pkg) + pkg)) + +;; Each backend should have a different package for its instruction set +;; so that they can co-exist. +(make-assembler-package (backend-asm-package-name)) + (defun package-list-for-genesis () - *package-data-list*) + (append *package-data-list* + (let ((asm-package (backend-asm-package-name))) + (list (make-package-data :name asm-package + :use (list* "CL" *asm-package-use-list*) + :documentation nil))))) ;;; Not all things shown by this are actually unused. Some get removed ;;; by the tree-shaker as intended. From 466b60972b725a187312d6637f40b8b82687f6ca Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 20:58:49 +0300 Subject: [PATCH 3361/4023] Avoid calling unix-close multiple times from concurrent CLOSEs. Write -1 to fd-stream-fd. --- src/code/fd-stream.lisp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/code/fd-stream.lisp b/src/code/fd-stream.lisp index b84b17cd9f..6d1e432ace 100644 --- a/src/code/fd-stream.lisp +++ b/src/code/fd-stream.lisp @@ -1936,7 +1936,10 @@ ;; --possibly reassigned-- FD again), or a stream with a closed ;; FD that appears open. (cancel-finalization fd-stream) - (sb-unix:unix-close (fd-stream-fd fd-stream)) + (let ((fd (fd-stream-fd fd-stream))) + (when (and (/= fd -1) + (eq (cas (fd-stream-fd fd-stream) fd -1) fd)) + (sb-unix:unix-close fd))) (set-closed-flame fd-stream)) ;; On error unwind from WITHOUT-INTERRUPTS. (serious-condition (e) From dbf90ac812093569657e6aaa9aca702764e35704 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 21:28:59 +0300 Subject: [PATCH 3362/4023] Add %raw-instance-cas/signed-word to x86oids. For CAS to work on fd-stream-fd on Windows. --- src/code/cas.lisp | 2 +- src/code/macros.lisp | 2 +- src/compiler/generic/vm-fndb.lisp | 2 +- src/compiler/x86-64/cell.lisp | 4 ++++ src/compiler/x86-64/macros.lisp | 2 +- src/compiler/x86/cell.lisp | 5 +++++ 6 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/code/cas.lisp b/src/code/cas.lisp index 096f4e185f..5e3e3084e8 100644 --- a/src/code/cas.lisp +++ b/src/code/cas.lisp @@ -35,7 +35,7 @@ (def %raw-instance-cas/word (instance index) %raw-instance-ref/word %raw-instance-set/word) - #+riscv + #+(or riscv x86 x86-64) (def %raw-instance-cas/signed-word (instance index) %raw-instance-ref/signed-word %raw-instance-set/signed-word) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 238ea6e597..dbea6a5006 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -1932,7 +1932,7 @@ symbol-case giving up: case=((V U) (F)) ((t) '%instance-cas) #+(or arm64 ppc ppc64 riscv x86 x86-64) ((word) '%raw-instance-cas/word) - #+riscv + #+(or riscv x86 x86-64) ((signed-word) '%raw-instance-cas/signed-word)))) (unless casser (error "Cannot use COMPARE-AND-SWAP with structure accessor ~ diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 34f07643ad..4ee831308f 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -242,7 +242,7 @@ #+(or arm64 ppc ppc64 riscv x86 x86-64) (defknown %raw-instance-cas/word (instance index sb-vm:word sb-vm:word) sb-vm:word ()) -#+riscv +#+(or riscv x86 x86-64) (defknown %raw-instance-cas/signed-word (instance index sb-vm:signed-word sb-vm:signed-word) sb-vm:signed-word ()) (defknown %raw-instance-xchg/word (instance index sb-vm:word) sb-vm:word ()) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 304aa93c5b..3f168b0351 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -880,6 +880,10 @@ (define-full-compare-and-swap %raw-instance-cas/word instance instance-slots-offset instance-pointer-lowtag (unsigned-reg) unsigned-num %raw-instance-cas/word) +(define-full-compare-and-swap %raw-instance-cas/signed-word instance + instance-slots-offset instance-pointer-lowtag + (signed-reg) signed-num %raw-instance-cas/signed-word) + (define-vop () (:translate %raw-instance-xchg/word) (:policy :fast-safe) diff --git a/src/compiler/x86-64/macros.lisp b/src/compiler/x86-64/macros.lisp index 4434874874..6687f23dff 100644 --- a/src/compiler/x86-64/macros.lisp +++ b/src/compiler/x86-64/macros.lisp @@ -291,7 +291,7 @@ (%instance-cas ;; store barrier affects only the object's base address '((emit-gc-store-barrier object nil rax (vop-nth-arg 3 vop) new-value))) - (%raw-instance-cas/word)) + ((%raw-instance-cas/word %raw-instance-cas/signed-word))) (move rax old-value) (inst cmpxchg :lock ea new-value) (move value rax)))))) diff --git a/src/compiler/x86/cell.lisp b/src/compiler/x86/cell.lisp index fdd7fe7d6d..2994b3b755 100644 --- a/src/compiler/x86/cell.lisp +++ b/src/compiler/x86/cell.lisp @@ -454,6 +454,11 @@ (define-full-compare-and-swap %raw-instance-cas/word instance instance-slots-offset instance-pointer-lowtag (unsigned-reg) unsigned-num %raw-instance-cas/word) + +(define-full-compare-and-swap %raw-instance-cas/signed-word instance + instance-slots-offset instance-pointer-lowtag + (signed-reg) signed-num %raw-instance-cas/signed-word) + ;;;; code object frobbing From 6ba8480e8eb4ea582fe7f2b09958b4b77949c39b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 16 May 2022 14:41:24 -0400 Subject: [PATCH 3363/4023] Assert that fd-stream finalizers run --- tests/autoclose-stream.impure.lisp | 35 ++++++++++++++++++++++++++++++ tests/input-manifest.lisp-expr | 1 + 2 files changed, 36 insertions(+) create mode 100644 tests/autoclose-stream.impure.lisp diff --git a/tests/autoclose-stream.impure.lisp b/tests/autoclose-stream.impure.lisp new file mode 100644 index 0000000000..52f9c628ad --- /dev/null +++ b/tests/autoclose-stream.impure.lisp @@ -0,0 +1,35 @@ +;;; This is in its own file to avoid being the recipient +;;; of unanticipated effects on the file descriptor space +;;; due to co-located tests. + +;;; don't know how to check validity of a HANDLE in the win32 api +#-unix (sb-ext:exit :code 104) + +(defvar *streams* + (let (l) + (dotimes (i 6 l) + (setq l (nconc (list (open "test-util.lisp") + (open "assertoid.lisp")) + l))))) +(defvar *fds* (mapcar 'sb-impl::fd-stream-fd *streams*)) +(dolist (fd *fds*) + (let ((errno (nth-value 1 (sb-unix:unix-lseek fd 0 sb-unix:l_incr)))) + (assert (zerop errno)))) +(setq *streams* nil) +(sb-sys:scrub-control-stack) +(gc) +;;; The file descriptors should cease to be valid. +;;; Obviously it wouldn't do any good to hold on to the lisp streams +;;; to check that the FD slot gets clobbered once and only once, +;;; but perhaps someone could rig up a test involving strace of the +;;; close() system call. +(with-test (:name :finalizer-closes-fdstream) + (let ((countbad 0)) + (dolist (fd *fds*) + (let ((errno (nth-value 1 (sb-unix:unix-lseek fd 0 sb-unix:l_incr)))) + (unless (= errno 0) + (assert (= errno sb-unix:ebadf)) + (incf countbad)))) + ;; I'm seeing all descriptors opened in this test get closed, but ymmv. + ;; Let's say 90% of them is passing. + (assert (>= countbad 10)))) diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 5a4246b5ae..3d2242c2c8 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -4,6 +4,7 @@ (("aprof.impure.lisp" "src/code/aprof.lisp" "src/code/shaketree.lisp") + ("autoclose-stream.impure.lisp" "tests/test-util.lisp" "tests/assertoid.lisp") ("avltree.pure.lisp" "tests/bbtree-test-util.lisp") ("bit-vector.impure.lisp" "contrib/sb-posix.fasl") ("brothertree.impure.lisp" From db6fcb167c12de4450ef4ee52072a1567416c8ca Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 21:45:46 +0300 Subject: [PATCH 3364/4023] Actually support CAS on signed-word slots. By using the right symbol. --- src/code/macros.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index dbea6a5006..3f43e1e552 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -1933,7 +1933,7 @@ symbol-case giving up: case=((V U) (F)) #+(or arm64 ppc ppc64 riscv x86 x86-64) ((word) '%raw-instance-cas/word) #+(or riscv x86 x86-64) - ((signed-word) '%raw-instance-cas/signed-word)))) + ((sb-vm:signed-word) '%raw-instance-cas/signed-word)))) (unless casser (error "Cannot use COMPARE-AND-SWAP with structure accessor ~ for a typed slot: ~S" From b1074f91e1e88d280a286569eb5e939de2438aee Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 16 May 2022 21:40:11 +0300 Subject: [PATCH 3365/4023] arm64: add %raw-instance-cas/signed-word. --- src/code/cas.lisp | 2 +- src/code/macros.lisp | 2 +- src/compiler/arm64/cell.lisp | 10 ++++++++++ src/compiler/generic/vm-fndb.lisp | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/code/cas.lisp b/src/code/cas.lisp index 5e3e3084e8..ea6e0e6ea7 100644 --- a/src/code/cas.lisp +++ b/src/code/cas.lisp @@ -35,7 +35,7 @@ (def %raw-instance-cas/word (instance index) %raw-instance-ref/word %raw-instance-set/word) - #+(or riscv x86 x86-64) + #+(or arm64 riscv x86 x86-64) (def %raw-instance-cas/signed-word (instance index) %raw-instance-ref/signed-word %raw-instance-set/signed-word) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 3f43e1e552..a4ddb94577 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -1932,7 +1932,7 @@ symbol-case giving up: case=((V U) (F)) ((t) '%instance-cas) #+(or arm64 ppc ppc64 riscv x86 x86-64) ((word) '%raw-instance-cas/word) - #+(or riscv x86 x86-64) + #+(or arm64 riscv x86 x86-64) ((sb-vm:signed-word) '%raw-instance-cas/signed-word)))) (unless casser (error "Cannot use COMPARE-AND-SWAP with structure accessor ~ diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 9f06e711d9..fd67277ddf 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -569,6 +569,16 @@ (:result-types unsigned-num) (:translate %raw-instance-cas/word)) +(define-vop (%raw-instance-cas/signed-word %instance-cas) + (:args (object) + (index) + (old-value :scs (signed-reg)) + (new-value :scs (signed-reg))) + (:arg-types * tagged-num signed-num signed-num) + (:results (result :scs (signed-reg) :from :load)) + (:result-types signed-num) + (:translate %raw-instance-cas/signed-word)) + ;;;; Code object frobbing. diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 4ee831308f..5eaf593d32 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -242,7 +242,7 @@ #+(or arm64 ppc ppc64 riscv x86 x86-64) (defknown %raw-instance-cas/word (instance index sb-vm:word sb-vm:word) sb-vm:word ()) -#+(or riscv x86 x86-64) +#+(or arm64 riscv x86 x86-64) (defknown %raw-instance-cas/signed-word (instance index sb-vm:signed-word sb-vm:signed-word) sb-vm:signed-word ()) (defknown %raw-instance-xchg/word (instance index sb-vm:word) sb-vm:word ()) From d645ae97adf4c163aa99f4f9a7b0fca563206e28 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 17 May 2022 00:00:53 +0300 Subject: [PATCH 3366/4023] OPEN.IO.23 OPEN.IO.22 OPEN.OUTPUT.23 no longer fail on Windows. --- tests/ansi-tests.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/ansi-tests.sh b/tests/ansi-tests.sh index a979b94cb7..958c2b5e1a 100755 --- a/tests/ansi-tests.sh +++ b/tests/ansi-tests.sh @@ -44,16 +44,16 @@ rm -fr sandbox/scratch "SXHASH.17" "SXHASH.18" "SXHASH.19" "PRINT-STRUCTURE.1" (append #+win32 (list "EXP.ERROR.7" "EXPT.ERROR.4" "EXPT.ERROR.5" "EXPT.ERROR.6" "EXPT.ERROR.7" - "PROBE-FILE.4" "OPEN.OUTPUT.23" "OPEN.IO.22" "OPEN.IO.23") + "PROBE-FILE.4") #+arm64 (list "EXP.ERROR.4" "EXP.ERROR.5" "EXP.ERROR.6" "EXP.ERROR.7" "EXPT.ERROR.4" "EXPT.ERROR.5" "EXPT.ERROR.6" "EXPT.ERROR.7") #-sb-unicode (list "MISC.638") (if (member :sb-fasteval sb-impl:+internal-features+) - (list "INTERSECTION.FOLD.1" "UNION.FOLD.1" "SET-DIFFERENCE.FOLD.1" - "SET-EXCLUSIVE-OR.FOLD.1" "ASH.ERROR.5" + (list "INTERSECTION.FOLD.1" "UNION.FOLD.1" "SET-DIFFERENCE.FOLD.1" + "SET-EXCLUSIVE-OR.FOLD.1" "ASH.ERROR.5" "ALL-STRUCTURE-CLASSES-ARE-SUBTYPES-OF-STRUCTURE-OBJECT.2" "TRACE.8") (list "MAP.48")) - + #+sb-unicode (list "BOTH-CASE-P.2" "CHAR-DOWNCASE.2" "CHAR-UPCASE.2")))) (failing (remove "FORMAT.E.26" (mapcar (function string) regression-test:*failed-tests*) From 329349f15ee4439c549647e12dc1799469cff1e3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 18 May 2022 01:30:05 +0300 Subject: [PATCH 3367/4023] Warn about bad indices for string comparison functions. --- src/compiler/seqtran.lisp | 58 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 7aa589ee75..772d111bf4 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1024,6 +1024,64 @@ `(if (string=* str1 str2 start1 end1 start2 end2) nil 0) (give-up-ir1-transform))) +(defun check-string-ranges (string1 string2 start1 end1 start2 end2 node) + (flet ((check (i string start end) + (let* ((type (lvar-type string)) + (length (vector-type-length type))) + (when length + (flet ((check (index name length-type) + (when index + (let ((index-type (lvar-type index))) + (unless (types-equal-or-intersect index-type + (specifier-type length-type)) + (let ((*compiler-error-context* node)) + (compiler-warn "Bad :~a~s ~a for string~s of type ~a" + name i + (type-specifier index-type) + i + (type-specifier type)))))))) + (check start "start" `(integer 0 ,length)) + (check end "end" `(or null (integer 0 ,length))))) + (when (and start end) + (let* ((start-type (lvar-type start)) + (start-interval (type-approximate-interval start-type)) + (end-type (lvar-type end)) + (end-interval (type-approximate-interval end-type))) + (when (and (interval-p start-interval) + (interval-p end-interval) + (interval-< end-interval start-interval)) + (let ((*compiler-error-context* node)) + (compiler-warn ":start~a ~a is greater than :end~a ~a" + i + (type-specifier start-type) + i + (type-specifier end-type))))))))) + (check 1 string1 start1 end1) + (check 2 string2 start2 end2))) + +(macrolet ((def (name) + `(defoptimizer (,name ir2-hook) ((string1 string2 start1 end1 start2 end2) node block) + (declare (ignore block)) + (check-string-ranges string1 string2 start1 end1 start2 end2 node)))) + (def string=*) + (def string<*) + (def string>*) + (def string<=*) + (def string>=*) + (def %sp-string-compare) + (def simple-base-string=) + #+sb-unicode + (def simple-character-string=)) + +(macrolet ((def (name) + `(defoptimizer (,name ir2-hook) ((string1 string2 &key start1 end1 start2 end2) node block) + (declare (ignore block)) + (check-string-ranges string1 string2 start1 end1 start2 end2 node)))) + (def string-equal) + (def string-not-equal) + (def string-greaterp) + (def string-lessp)) + (deftransform string ((x) (symbol)) '(symbol-name x)) (deftransform string ((x) (string)) '(progn x)) From 55bb8a37df38b71652ae1e1c19b471d73813f0f5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 18 May 2022 02:00:58 +0300 Subject: [PATCH 3368/4023] Fix a build order inlining failure. --- src/cold/build-order.lisp-expr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 97632b7dbb..8f95a8028e 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -371,7 +371,6 @@ ("src/compiler/constraint") ("src/compiler/equality-constraints") ("src/compiler/array-tran") - ("src/compiler/seqtran") ("src/compiler/saptran") ("src/compiler/modarith") ("src/compiler/sxhash") @@ -418,6 +417,7 @@ ;; This is a terrible name for a file that contains type derivers ;; and IR1 transforms. Maybe split it up into more appropriately named pieces. ("src/compiler/srctran") + ("src/compiler/seqtran") ("src/compiler/typetran") ("src/compiler/generic/vm-typetran") ("src/code/cross-modular" :not-target) From 796aad2ab7c2ab3e2f3f5ee42fd81a7bf5c5af27 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 17 May 2022 22:16:06 -0400 Subject: [PATCH 3369/4023] Make autoclose test pass in evaluator-mode interpret --- tests/autoclose-stream.impure.lisp | 84 +++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 12 deletions(-) diff --git a/tests/autoclose-stream.impure.lisp b/tests/autoclose-stream.impure.lisp index 52f9c628ad..2f36882939 100644 --- a/tests/autoclose-stream.impure.lisp +++ b/tests/autoclose-stream.impure.lisp @@ -5,18 +5,77 @@ ;;; don't know how to check validity of a HANDLE in the win32 api #-unix (sb-ext:exit :code 104) -(defvar *streams* - (let (l) - (dotimes (i 6 l) - (setq l (nconc (list (open "test-util.lisp") - (open "assertoid.lisp")) - l))))) -(defvar *fds* (mapcar 'sb-impl::fd-stream-fd *streams*)) -(dolist (fd *fds*) +(defun fd-has-finalizer-p (fd) + ;; Finalizer function can be: + ;; 1. a function - finalizer that was not created with :DONT-SAVE. + ;; 2. a single list of a function - a finalizer that was created with :DONT-SAVE + ;; 3. a vector - more than one finalizer, each being form 1 or form 2. + (flet ((checkit (thing) + (when (and (sb-kernel:closurep thing) + (eql (sb-kernel:%closure-index-ref thing 0) fd)) + (let ((underlying (sb-kernel:%closure-fun thing))) + (when (and (sb-kernel:simple-fun-p underlying) + (equal (sb-kernel:%simple-fun-name underlying) + '(lambda () :in sb-sys:make-fd-stream))) + (return-from fd-has-finalizer-p t)))))) + (let ((v sb-impl::**finalizer-store**)) + (loop for i from 3 below (length v) + do + (let ((entry (aref v i))) + (typecase entry + (list (checkit (car entry))) + (function (checkit entry)) + (vector + (sb-int:dovector (entry entry) + (checkit (if (listp entry) (car entry) entry)))))))))) + +(defvar *fds*) +(defun threadfun () + (let (streams) + (dotimes (i 6) + (setq streams (nconc (list (open "test-util.lisp") + (open "assertoid.lisp")) + streams))) + (dolist (stream streams) + (assert (fd-has-finalizer-p (sb-impl::fd-stream-fd stream)))) + (setq *fds* + (mapcar (lambda (x) + (cons (sb-impl::fd-stream-fd x) (make-weak-pointer x))) + streams)) + (dolist (fd *fds*) + (let ((errno (nth-value 1 (sb-unix:unix-lseek (car fd) 0 sb-unix:l_incr)))) + (assert (zerop errno)))))) + +(defun assert-invalid-file-descriptor (fd) (let ((errno (nth-value 1 (sb-unix:unix-lseek fd 0 sb-unix:l_incr)))) - (assert (zerop errno)))) -(setq *streams* nil) -(sb-sys:scrub-control-stack) + (assert (= errno sb-unix:ebadf)))) + +;;; A separate thread should always leave this thread with +;;; a clean stack. But the interpreter might retain garbage. +;;; So if we think garbage might be retained, don't require +;;; that finalization happened, but do check that if the weak-pointer +;;; to a stream got smashed, then the FD is invalid. +#+(or :interpreter (not :sb-thread)) +(progn (threadfun) + ;; This FMAKUNBOUND definitely seems to be needed + ;; for sb-fasteval. + (fmakunbound 'threadfun) + (sb-sys:scrub-control-stack) + (gc) + ;; I have no idea how this write-to-string is helping, + ;; but without it the test becomes unreliable. + (write-to-string *fds*) + (dolist (entry *fds*) + (let ((fd (car entry)) + (wp (cdr entry))) + (unless (weak-pointer-value wp) + (assert-invalid-file-descriptor fd)))) + (sb-ext:exit :code 104)) + +(compile 'threadfun) + +(let ((thread (sb-thread:make-thread #'threadfun))) + (sb-thread:join-thread thread)) (gc) ;;; The file descriptors should cease to be valid. ;;; Obviously it wouldn't do any good to hold on to the lisp streams @@ -26,7 +85,8 @@ (with-test (:name :finalizer-closes-fdstream) (let ((countbad 0)) (dolist (fd *fds*) - (let ((errno (nth-value 1 (sb-unix:unix-lseek fd 0 sb-unix:l_incr)))) + (let ((errno (nth-value 1 (sb-unix:unix-lseek (car fd) + 0 sb-unix:l_incr)))) (unless (= errno 0) (assert (= errno sb-unix:ebadf)) (incf countbad)))) From 007d9c227ad9692d76389c2e1d077374c8be9a56 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 18 May 2022 09:27:55 +0300 Subject: [PATCH 3370/4023] Add run-pending-finalizers to autoclose-stream.impure. Otherwise it's not known if the finalizers have finished running in the finalizer thread. --- tests/autoclose-stream.impure.lisp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/autoclose-stream.impure.lisp b/tests/autoclose-stream.impure.lisp index 2f36882939..0d7fd3250c 100644 --- a/tests/autoclose-stream.impure.lisp +++ b/tests/autoclose-stream.impure.lisp @@ -77,6 +77,8 @@ (let ((thread (sb-thread:make-thread #'threadfun))) (sb-thread:join-thread thread)) (gc) +(sb-kernel:run-pending-finalizers) + ;;; The file descriptors should cease to be valid. ;;; Obviously it wouldn't do any good to hold on to the lisp streams ;;; to check that the FD slot gets clobbered once and only once, From a0719446401a0170ef3d7fb761be03288040501a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 18 May 2022 18:54:35 +0300 Subject: [PATCH 3371/4023] Typo. --- contrib/sb-cltl2/env.lisp | 2 +- src/code/early-impl.lisp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/sb-cltl2/env.lisp b/contrib/sb-cltl2/env.lisp index 4d922174a7..1dd2211ad6 100644 --- a/contrib/sb-cltl2/env.lisp +++ b/contrib/sb-cltl2/env.lisp @@ -443,7 +443,7 @@ appear." (info :variable :deprecated name)) (extra-pairs :variable name var *lexenv*))))) -;;; Unlike policy-related declarations which the interpeter itself needs +;;; Unlike policy-related declarations which the interpreter itself needs ;;; for correct operation of some macros, muffled conditions are irrelevant, ;;; since warnings are not signaled much, if at all. ;;; This is even more useless than env-package-locks. diff --git a/src/code/early-impl.lisp b/src/code/early-impl.lisp index 096c3b99f9..7aa23d549b 100644 --- a/src/code/early-impl.lisp +++ b/src/code/early-impl.lisp @@ -59,7 +59,7 @@ (declaim (type cons sb-kernel::*gc-epoch*)) (define-load-time-global sb-kernel::*gc-epoch* '(nil . nil)) -;;; Default evaluator mode (interpeter / compiler) +;;; Default evaluator mode (interpreter / compiler) (declaim (type (member :compile #+(or sb-eval sb-fasteval) :interpret) *evaluator-mode*)) From 8b247c76aa59b495d42aaa5daedaed51918d072f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 18 May 2022 12:02:32 -0400 Subject: [PATCH 3372/4023] Take another stab at testing stream finalization We didn't have a run-pending-finalizers in the #-sb-thread case which meant it might have failed if #+(and interpreter sb-thread). The test is now more lenient - we expect closing if and only if the weak-pointer is also smashed. I'm seeing either 11 or 12 streams get autoclosed, which is a pass. --- tests/autoclose-stream.impure.lisp | 58 ++++++++---------------------- 1 file changed, 14 insertions(+), 44 deletions(-) diff --git a/tests/autoclose-stream.impure.lisp b/tests/autoclose-stream.impure.lisp index 0d7fd3250c..7e092a27c0 100644 --- a/tests/autoclose-stream.impure.lisp +++ b/tests/autoclose-stream.impure.lisp @@ -30,7 +30,7 @@ (checkit (if (listp entry) (car entry) entry)))))))))) (defvar *fds*) -(defun threadfun () +(defun make-streams () (let (streams) (dotimes (i 6) (setq streams (nconc (list (open "test-util.lisp") @@ -50,48 +50,18 @@ (let ((errno (nth-value 1 (sb-unix:unix-lseek fd 0 sb-unix:l_incr)))) (assert (= errno sb-unix:ebadf)))) -;;; A separate thread should always leave this thread with -;;; a clean stack. But the interpreter might retain garbage. -;;; So if we think garbage might be retained, don't require -;;; that finalization happened, but do check that if the weak-pointer -;;; to a stream got smashed, then the FD is invalid. -#+(or :interpreter (not :sb-thread)) -(progn (threadfun) - ;; This FMAKUNBOUND definitely seems to be needed - ;; for sb-fasteval. - (fmakunbound 'threadfun) - (sb-sys:scrub-control-stack) - (gc) - ;; I have no idea how this write-to-string is helping, - ;; but without it the test becomes unreliable. - (write-to-string *fds*) - (dolist (entry *fds*) - (let ((fd (car entry)) - (wp (cdr entry))) - (unless (weak-pointer-value wp) - (assert-invalid-file-descriptor fd)))) - (sb-ext:exit :code 104)) +(compile 'make-streams) -(compile 'threadfun) - -(let ((thread (sb-thread:make-thread #'threadfun))) - (sb-thread:join-thread thread)) -(gc) -(sb-kernel:run-pending-finalizers) - -;;; The file descriptors should cease to be valid. -;;; Obviously it wouldn't do any good to hold on to the lisp streams -;;; to check that the FD slot gets clobbered once and only once, -;;; but perhaps someone could rig up a test involving strace of the -;;; close() system call. (with-test (:name :finalizer-closes-fdstream) - (let ((countbad 0)) - (dolist (fd *fds*) - (let ((errno (nth-value 1 (sb-unix:unix-lseek (car fd) - 0 sb-unix:l_incr)))) - (unless (= errno 0) - (assert (= errno sb-unix:ebadf)) - (incf countbad)))) - ;; I'm seeing all descriptors opened in this test get closed, but ymmv. - ;; Let's say 90% of them is passing. - (assert (>= countbad 10)))) + (make-streams) + (gc) + (sb-kernel:run-pending-finalizers) + (sb-sys:scrub-control-stack) + (let ((nsmashed 0)) + (dolist (entry *fds*) + (let ((fd (car entry)) + (wp (cdr entry))) + (unless (weak-pointer-value wp) + (incf nsmashed) + (assert-invalid-file-descriptor fd)))) + (format t "::: INFO: ~d streams closed~%" nsmashed))) From f72426f5d45f9245aad6268ab9d4940cc14fd998 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 18 May 2022 17:02:50 -0400 Subject: [PATCH 3373/4023] Fix C warning --- src/runtime/os-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 95c7499d82..34ede0769e 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -295,7 +295,7 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm fail = 1; } if (fail) - lose("load_core_bytes(%d,%p,%p,%zx) failed", fd, (void*)offset, addr, len); + lose("load_core_bytes(%d,%p,%p,%zx) failed", fd, (void*)(uintptr_t)offset, addr, len); return (void*)actual; } From cee3f22c13c17f42c07199c42441b5899b587058 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 18 May 2022 17:04:24 -0400 Subject: [PATCH 3374/4023] Stop defining ALIEN_STACK_GROWS_DOWNWARD The one and only use of UPWARD was deleted in git rev 4dcb4ac2bf. Also correct a fencepost error with the initial pointer where it suggested a convention of pointing at an available stack word instead of 1 word beyond it. --- src/runtime/arm-arch.h | 1 - src/runtime/arm64-arch.h | 1 - src/runtime/mips-arch.h | 2 -- src/runtime/ppc-arch.h | 1 - src/runtime/ppc64-arch.h | 1 - src/runtime/riscv-arch.h | 2 -- src/runtime/sparc-arch.h | 1 - src/runtime/thread.c | 14 ++++++++++---- src/runtime/validate.h | 6 ++---- src/runtime/x86-64-arch.h | 1 - src/runtime/x86-arch.h | 1 - 11 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/runtime/arm-arch.h b/src/runtime/arm-arch.h index f4c01872e4..8f07238a46 100644 --- a/src/runtime/arm-arch.h +++ b/src/runtime/arm-arch.h @@ -1,7 +1,6 @@ #ifndef _ARM_ARCH_H #define _ARM_ARCH_H -#define ALIEN_STACK_GROWS_DOWNWARD #define ARCH_HAS_LINK_REGISTER #endif /* _ARM_ARCH_H */ diff --git a/src/runtime/arm64-arch.h b/src/runtime/arm64-arch.h index 9e9546770a..731c402492 100644 --- a/src/runtime/arm64-arch.h +++ b/src/runtime/arm64-arch.h @@ -1,7 +1,6 @@ #ifndef _ARM64_ARCH_H #define _ARM64_ARCH_H -#define ALIEN_STACK_GROWS_DOWNWARD #define ARCH_HAS_LINK_REGISTER #endif /* _ARM64_ARCH_H */ diff --git a/src/runtime/mips-arch.h b/src/runtime/mips-arch.h index 9fbbb392ce..32bfb568ca 100644 --- a/src/runtime/mips-arch.h +++ b/src/runtime/mips-arch.h @@ -1,8 +1,6 @@ #ifndef _MIPS_ARCH_H #define _MIPS_ARCH_H -#define ALIEN_STACK_GROWS_DOWNWARD - unsigned int arch_get_fp_control(void); void arch_set_fp_control(unsigned int fp); diff --git a/src/runtime/ppc-arch.h b/src/runtime/ppc-arch.h index e701b65667..a4b464342b 100644 --- a/src/runtime/ppc-arch.h +++ b/src/runtime/ppc-arch.h @@ -2,7 +2,6 @@ #define _PPC_ARCH_H #define ARCH_HAS_LINK_REGISTER -#define ALIEN_STACK_GROWS_DOWNWARD extern void ppc_flush_icache(os_vm_address_t address, os_vm_size_t length); diff --git a/src/runtime/ppc64-arch.h b/src/runtime/ppc64-arch.h index 1fc7018a78..77b0504559 100644 --- a/src/runtime/ppc64-arch.h +++ b/src/runtime/ppc64-arch.h @@ -2,7 +2,6 @@ #define _PPC64_ARCH_H #define ARCH_HAS_LINK_REGISTER -#define ALIEN_STACK_GROWS_DOWNWARD extern void ppc_flush_icache(os_vm_address_t address, os_vm_size_t length); diff --git a/src/runtime/riscv-arch.h b/src/runtime/riscv-arch.h index b7fabc392f..bc508937f2 100644 --- a/src/runtime/riscv-arch.h +++ b/src/runtime/riscv-arch.h @@ -1,6 +1,4 @@ #ifndef _RISCV_ARCH_H #define _RISCV_ARCH_H -#define ALIEN_STACK_GROWS_DOWNWARD - #endif /* _RISCV_ARCH_H */ diff --git a/src/runtime/sparc-arch.h b/src/runtime/sparc-arch.h index 8fdea43195..b75247d996 100644 --- a/src/runtime/sparc-arch.h +++ b/src/runtime/sparc-arch.h @@ -2,6 +2,5 @@ #define _SPARC_ARCH_H #define ARCH_HAS_NPC_REGISTER -#define ALIEN_STACK_GROWS_DOWNWARD #endif /* _SPARC_ARCH_H */ diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 725948b197..c66664d36a 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -1006,11 +1006,17 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { th->state_word.sprof_enable = 0; th->state_word.user_thread_p = 1; -#ifdef ALIEN_STACK_GROWS_DOWNWARD - th->alien_stack_pointer=(lispobj*)((char*)th->alien_stack_start - + ALIEN_STACK_SIZE-N_WORD_BYTES); + lispobj* alien_stack_end = (lispobj*)((char*)th->alien_stack_start + ALIEN_STACK_SIZE); +#ifdef ALIEN_STACK_GROWS_UPWARD + th->alien_stack_pointer = alien_stack_start; +#elif defined LISP_FEATURE_X86 || defined LISP_FEATURE_X86_64 + /* It is not necessary to subtract a word from the starting stack pointer + * because consuming C stack space pre-decrements before using the pointer. + * So this choice has nothing to do with saving a word of memory, and everything + * to do with my lack of understanding of the conventions for non-x86. */ + th->alien_stack_pointer = alien_stack_end; #else - th->alien_stack_pointer=(lispobj*)((char*)th->alien_stack_start); + th->alien_stack_pointer = alien_stack_end - 1; #endif #ifdef HAVE_THREAD_PSEUDO_ATOMIC_BITS_SLOT diff --git a/src/runtime/validate.h b/src/runtime/validate.h index ebf78c6834..b181d29db4 100644 --- a/src/runtime/validate.h +++ b/src/runtime/validate.h @@ -58,7 +58,7 @@ #endif -#ifdef ALIEN_STACK_GROWS_DOWNWARD +#ifndef ALIEN_STACK_GROWS_UPWARD #define ALIEN_STACK_HARD_GUARD_PAGE(th) \ ((os_vm_address_t)(th->alien_stack_start)) @@ -67,7 +67,7 @@ #define ALIEN_STACK_RETURN_GUARD_PAGE(th) \ (ALIEN_STACK_GUARD_PAGE(th) + os_vm_page_size) -#elif defined(ALIEN_STACK_GROWS_UPWARD) +#else #define ALIEN_STACK_HARD_GUARD_PAGE(th) \ (((os_vm_address_t)th->alien_stack_start) + ALIEN_STACK_SIZE - \ @@ -77,8 +77,6 @@ #define ALIEN_STACK_RETURN_GUARD_PAGE(th) \ (ALIEN_STACK_GUARD_PAGE(th) - os_vm_page_size) -#else -#error ALIEN_STACK_GROWS_DOWNWARD or ALIEN_STACK_GROWS_UPWARD has to be defined #endif #define BINDING_STACK_HARD_GUARD_PAGE(th) \ diff --git a/src/runtime/x86-64-arch.h b/src/runtime/x86-64-arch.h index 528fa53ead..992176fddf 100644 --- a/src/runtime/x86-64-arch.h +++ b/src/runtime/x86-64-arch.h @@ -6,7 +6,6 @@ #define _X86_64_ARCH_H #define ARCH_HAS_STACK_POINTER -#define ALIEN_STACK_GROWS_DOWNWARD extern int avx_supported, avx2_supported; extern unsigned int cpuid_fn1_ecx; diff --git a/src/runtime/x86-arch.h b/src/runtime/x86-arch.h index 05db5aba2e..1dc800f6a5 100644 --- a/src/runtime/x86-arch.h +++ b/src/runtime/x86-arch.h @@ -14,7 +14,6 @@ #include "interr.h" /* for declaration of lose() */ #define ARCH_HAS_STACK_POINTER -#define ALIEN_STACK_GROWS_DOWNWARD /* When single stepping, single_stepping holds the original instruction * PC location. */ From 5d798d95f322f8a8b3d330ff584070b1d9f2313c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 18 May 2022 21:39:57 -0400 Subject: [PATCH 3375/4023] Remove two arguments from gc_alloc_large - It doesn't really use an alloc_region; it's confusing to supply one. - It can figure out whether to use a mutex based on gc_active_p. - Rearrange lisp_alloc so that if calling alloc_large it's a tail call. - Fix busted GC tests (Why are they still not run with the test suite?) As part of the change though only tangentially related: when sb-sprof is run in allocation profiling mode, don't record a trace for PAGE_TYPE_CODE because there's only one code region which messes up the per-thread stats. --- src/runtime/GNUmakefile | 2 +- src/runtime/gc-unit-tests.c | 7 +- src/runtime/gencgc.c | 142 +++++++++++++++++++---------------- src/runtime/private-cons.inc | 5 +- 4 files changed, 84 insertions(+), 72 deletions(-) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index 5ed0dffcf9..41d1c009a0 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -107,7 +107,7 @@ heap-reloc-test: ../../tests/heap-reloc/fake-mman.c $(OBJS) # Enable compiling gencgc with even more assertions and/or # data collection, with COMPILING_TESTS. Not really used yet. -gc-unit-tests.o: CFLAGS=-DCOMPILING_TESTS +gc-unit-tests.o: CFLAGS=-g -DCOMPILING_TESTS unit-tests: gc-unit-tests.o libsbcl.a cc -g -no-pie -o $@ $^ -ldl -lpthread -lm diff --git a/src/runtime/gc-unit-tests.c b/src/runtime/gc-unit-tests.c index 72ff3e762e..5d6aaed7ee 100644 --- a/src/runtime/gc-unit-tests.c +++ b/src/runtime/gc-unit-tests.c @@ -92,7 +92,6 @@ void test_adjust_obj_ptes() // and pick the generation. gc_init_region(&test_region); RESET_ALLOC_START_PAGES(); - test_region.last_page = -1; gc_alloc_generation = SCRATCH_GENERATION; // Wipe out the page table and the allocation counts, @@ -102,7 +101,7 @@ void test_adjust_obj_ptes() for (gen=0; gen < NUM_GENERATIONS; ++gen) generations[gen].bytes_allocated = 0; bytes_allocated = 0; - void *result = gc_alloc_large(request, PAGE_TYPE_UNBOXED, &test_region, 0); + void *result = gc_alloc_large(request, PAGE_TYPE_UNBOXED); // Assert some things about the reference object. gc_assert(result == (void*)DYNAMIC_SPACE_START); @@ -141,12 +140,12 @@ void shrink_obj_test(int ending_size, int initial_type, if (initial_size >= ending_size) { gc_init_region(&test_region); RESET_ALLOC_START_PAGES(); - test_region.last_page = -1; // Start with a fresh page table page_table = calloc(1+page_table_pages, sizeof(struct page)); + gc_page_pins = calloc(page_table_pages, 1); from_space = gc_alloc_generation = 2; - void *result = gc_alloc_large(initial_size, initial_type, &test_region, 0); + void *result = gc_alloc_large(initial_size, initial_type); // We're in trouble if pages other than expected were gotten gc_assert(result == (void*)DYNAMIC_SPACE_START); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 9a1b985e4e..554e39a3ee 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -836,8 +836,18 @@ struct alloc_region gc_alloc_region[6]; static page_index_t alloc_start_pages[8], // one for each value of PAGE_TYPE_x - gencgc_alloc_start_page; // initializer for the preceding array - + gencgc_alloc_start_page, // initializer for the preceding array + max_alloc_start_page; // the largest of any array element + +/* Each 'start_page' informs the region-opening logic where it should + * attempt to continue allocating after closing a region associated + * with a particular page type. We aren't very clever about this - + * either the start_page has space remaining or it doesn't, and when it + * doesn't, then we should hop over *all* allocated pages regardless of + * type that intercede between the page we couldn't use up to next_free_page. + * It's kind of dumb that there is one start_page per type, + * other than it serves its purpose for picking up where it left off + * on a partially full page during GC */ #define RESET_ALLOC_START_PAGES() \ alloc_start_pages[0] = gencgc_alloc_start_page; \ alloc_start_pages[1] = gencgc_alloc_start_page; \ @@ -846,20 +856,22 @@ static page_index_t alloc_start_pages[4] = gencgc_alloc_start_page; \ alloc_start_pages[5] = gencgc_alloc_start_page; \ alloc_start_pages[6] = gencgc_alloc_start_page; \ - alloc_start_pages[7] = gencgc_alloc_start_page; + alloc_start_pages[7] = gencgc_alloc_start_page; \ + max_alloc_start_page = gencgc_alloc_start_page; static inline page_index_t -alloc_start_page(unsigned int page_type, int large) +get_alloc_start_page(unsigned int page_type) { if (page_type > 7) lose("bad page_type: %d", page_type); - return alloc_start_pages[large ? 0 : page_type]; + return alloc_start_pages[page_type]; } static inline void -set_alloc_start_page(unsigned int page_type, int large, page_index_t page) +set_alloc_start_page(unsigned int page_type, page_index_t page) { if (page_type > 7) lose("bad page_type: %d", page_type); - alloc_start_pages[large ? 0 : page_type] = page; + if (page > max_alloc_start_page) max_alloc_start_page = page; + alloc_start_pages[page_type] = page; } #include "private-cons.inc" @@ -1027,7 +1039,7 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re return alloc_region->free_pointer; } - page_index_t first_page = alloc_start_page(page_type, 0), last_page; + page_index_t first_page = get_alloc_start_page(page_type), last_page; INSTRUMENTING( last_page = gc_find_freeish_pages(&first_page, nbytes, @@ -1242,7 +1254,7 @@ gc_close_region(struct alloc_region *alloc_region, int page_type) generations[gc_alloc_generation].bytes_allocated += region_size; /* Set the alloc restart page to the last page of the region. */ - set_alloc_start_page(page_type, 0, next_page-1); + set_alloc_start_page(page_type, next_page-1); /* Add the region to the new_areas if requested. */ if (boxed_type_p(page_type)) @@ -1264,32 +1276,28 @@ gc_close_region(struct alloc_region *alloc_region, int page_type) } /* Allocate a possibly large object. */ -void * -gc_alloc_large(sword_t nbytes, int page_type, struct alloc_region *alloc_region, int unlock) +void *gc_alloc_large(sword_t nbytes, int page_type) { page_index_t first_page, last_page; // Large BOXED would serve no purpose beyond MIXED, and "small large" is illogical. if (page_type == PAGE_TYPE_BOXED || page_type == PAGE_TYPE_SMALL_MIXED) page_type = PAGE_TYPE_MIXED; - first_page = alloc_start_page(page_type, 1); - // FIXME: really we want to try looking for space following the highest of - // the last page of all other small object regions. That's impossible - there's - // not enough information. At best we can skip some work in only the case where - // the supplied region was the one most recently created. To do this right - // would entail a malloc-like allocator at the page granularity. - page_index_t min = find_page_index(alloc_region->end_addr); - if (first_page < min) first_page = min; + int locked = !gc_active_p; + if (locked) { + int __attribute__((unused)) ret = mutex_acquire(&free_pages_lock); + gc_assert(ret); + } + first_page = max_alloc_start_page; INSTRUMENTING( last_page = gc_find_freeish_pages(&first_page, nbytes, SINGLE_OBJECT_FLAG | page_type, gc_alloc_generation), et_find_freeish_page); - // FIXME: Should this be 1+last_page ? - // (Doesn't matter too much since it'll be skipped on restart if unusable) - set_alloc_start_page(page_type, 1, last_page); + // No need to check whether last_page > old max; it's gotta be. + max_alloc_start_page = last_page; /* Set up the pages. */ page_index_t page; @@ -1310,10 +1318,10 @@ gc_alloc_large(sword_t nbytes, int page_type, struct alloc_region *alloc_region, // Anyway it's best if the new page resembles a valid object ASAP. uword_t nwords = nbytes >> WORD_SHIFT; lispobj* addr = (lispobj*)page_address(first_page); - if (unlock) + if (locked) THREAD_JIT(0); *addr = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; - if (unlock) // avoid enabling while GCing + if (locked) // avoid enabling while GCing THREAD_JIT(1); os_vm_size_t scan_start_offset = 0; @@ -1330,7 +1338,7 @@ gc_alloc_large(sword_t nbytes, int page_type, struct alloc_region *alloc_region, bytes_allocated += nbytes; generations[gc_alloc_generation].bytes_allocated += nbytes; - if (unlock) { + if (locked) { int __attribute__((unused)) ret = mutex_release(&free_pages_lock); gc_assert(ret); } @@ -1525,7 +1533,7 @@ void *collector_alloc_fallback(struct alloc_region* region, sword_t nbytes, int * because genesis does not use large-object pages. So cold-init could fail, * depending on whether objects in the cold core are sufficiently large that * they ought to have gone on large object pages if they could have. */ - if (nbytes >= LARGE_OBJECT_SIZE) return gc_alloc_large(nbytes, page_type, region, 0); + if (nbytes >= LARGE_OBJECT_SIZE) return gc_alloc_large(nbytes, page_type); if (page_type != PAGE_TYPE_SMALL_MIXED) return new_region(region, nbytes, page_type); @@ -4842,10 +4850,14 @@ lisp_alloc(int largep, struct alloc_region *region, sword_t nbytes, region->free_pointer = new_free_pointer; #if defined LISP_FEATURE_MIPS || defined LISP_FEATURE_PPC || \ defined LISP_FEATURE_PPC64 || defined LISP_FEATURE_X86_64 - // Most allocations should never get here, but two page types are special. + /* Most allocations should never get here, but two page types are special. + * - CODE always comes through here. + * - CONS can come through here because when overflow occurs in lisp, + * the fallback logic will call lisp_alloc one or more times, + * obtaining possibly discontiguous pages of conses */ gc_assert(page_type == PAGE_TYPE_CONS || page_type == PAGE_TYPE_CODE); #endif - return(new_obj); /* yup */ + return new_obj; } /* We don't want to count nbytes against auto_gc_trigger unless we @@ -4887,49 +4899,51 @@ lisp_alloc(int largep, struct alloc_region *region, sword_t nbytes, } } } - int __attribute__((unused)) ret = mutex_acquire(&free_pages_lock); - gc_assert(ret); - if (largep) - new_obj = gc_alloc_large(nbytes, page_type, region, 1); - else { - ensure_region_closed(region, page_type); - // hold the lock after alloc_new_region if a cons page - int release = page_type != PAGE_TYPE_CONS; - new_obj = gc_alloc_new_region(nbytes, page_type, region, release); - region->free_pointer = (char*)new_obj + nbytes; - // addr_diff asserts that 'end' >= 'free_pointer' - int remaining = addr_diff(region->end_addr, region->free_pointer); - // Try to avoid the next Lisp -> C -> Lisp round-trip by possibly - // requesting yet another region. - if (page_type == PAGE_TYPE_CONS) { - if (remaining <= CONS_SIZE * N_WORD_BYTES) { // Refill now if <= 1 more cons to go - gc_close_region(region, page_type); - // Request > 2 words, forcing a new page to be claimed. - gc_alloc_new_region(4 * N_WORD_BYTES, page_type, region, 0); // don't release - } - ret = mutex_release(&free_pages_lock); - gc_assert(ret); - } else if (remaining <= 4 * N_WORD_BYTES - && TryEnterCriticalSection(&free_pages_lock)) { - gc_close_region(region, page_type); - // Request > 4 words, forcing a new page to be claimed. - gc_alloc_new_region(6 * N_WORD_BYTES, page_type, region, 1); // do release - } - } + /* For the architectures which do NOT use a trap instruction for allocation, + * overflow, record a backtrace now if statistical profiling is enabled. + * The ones which use a trap will backtrace from the signal handler. + * Code allocations are ignored, because every code allocation + * comes through lisp_alloc() which makes this not a statistical + * sample. Also the trapping ones don't trap for code. + * #+win32 doesn't seem to work, but neither does CPU profiling */ #if !(defined LISP_FEATURE_PPC || defined LISP_FEATURE_PPC64 \ || defined LISP_FEATURE_SPARC || defined LISP_FEATURE_WIN32) - // Architectures which utilize a trap instruction to invoke the overflow - // handler use the signal context from which to record a backtrace. - // That's reliable, but access_control_frame_pointer(thread) isn't. - // x86[-64] use the ABI frame pointer register which seems not to work - // for win32, but sb-sprof never did work there anyway. extern void allocator_record_backtrace(void*, struct thread*); - if (gencgc_alloc_profiler && thread->state_word.sprof_enable) + if (page_type != PAGE_TYPE_CODE && gencgc_alloc_profiler + && thread->state_word.sprof_enable) allocator_record_backtrace(__builtin_frame_address(0), thread); #endif - return (new_obj); + if (largep) return gc_alloc_large(nbytes, page_type); + + int __attribute__((unused)) ret = mutex_acquire(&free_pages_lock); + gc_assert(ret); + ensure_region_closed(region, page_type); + // hold the lock after alloc_new_region if a cons page + int release = page_type != PAGE_TYPE_CONS; + new_obj = gc_alloc_new_region(nbytes, page_type, region, release); + region->free_pointer = (char*)new_obj + nbytes; + // addr_diff asserts that 'end' >= 'free_pointer' + int remaining = addr_diff(region->end_addr, region->free_pointer); + // Try to avoid the next Lisp -> C -> Lisp round-trip by possibly + // requesting yet another region. + if (page_type == PAGE_TYPE_CONS) { + if (remaining <= CONS_SIZE * N_WORD_BYTES) { // Refill now if <= 1 more cons to go + gc_close_region(region, page_type); + // Request > 2 words, forcing a new page to be claimed. + gc_alloc_new_region(4 * N_WORD_BYTES, page_type, region, 0); // don't release + } + ret = mutex_release(&free_pages_lock); + gc_assert(ret); + } else if (remaining <= 4 * N_WORD_BYTES + && TryEnterCriticalSection(&free_pages_lock)) { + gc_close_region(region, page_type); + // Request > 4 words, forcing a new page to be claimed. + gc_alloc_new_region(6 * N_WORD_BYTES, page_type, region, 1); // do release + } + + return new_obj; } // Code allocation is always serialized diff --git a/src/runtime/private-cons.inc b/src/runtime/private-cons.inc index 4c41021d74..563d26c756 100644 --- a/src/runtime/private-cons.inc +++ b/src/runtime/private-cons.inc @@ -73,13 +73,12 @@ static struct cons* private_cons_impl() if (page >= 0 && (bytes_used = page_bytes_used(page)) < GENCGC_PAGE_BYTES) { cons = (struct cons*)(page_address(page) + bytes_used); } else { - page = alloc_start_page(PAGE_TYPE_UNBOXED, 0); + page = get_alloc_start_page(PAGE_TYPE_UNBOXED); page_index_t last_page __attribute__((unused)) = gc_find_freeish_pages(&page, GENCGC_PAGE_BYTES, SINGLE_OBJECT_FLAG | PAGE_TYPE_UNBOXED, GC_PRIVATE_CONS_GENERATION); - // See question about last_page in gc_alloc_large - set_alloc_start_page(PAGE_TYPE_UNBOXED, 0, page); + set_alloc_start_page(PAGE_TYPE_UNBOXED, page); struct cons* page_header = (struct cons*)page_address(page); if (PRIVATE_CONS_DEBUG) From 48fb6246d17586a3cb0bb04b43eff4ff4a5d1f40 Mon Sep 17 00:00:00 2001 From: Thomas Fitzsimmons <fitzsim@fitzsim.org> Date: Wed, 18 May 2022 00:23:39 -0400 Subject: [PATCH 3376/4023] Fix single-stepping on ppc64 --- src/code/debug-int.lisp | 7 +++++++ tests/step.pure.lisp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index c7a0834466..c9ee8bbe05 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -3847,6 +3847,10 @@ register." ;; something like GET-FDEFN-FOR-SINGLE-STEP (+ (sap-ref-32 (context-pc context) 1) -2 other-pointer-lowtag)) (t + #+ppc64 + (logior (context-register context callee-register-offset) + sb-vm:other-pointer-lowtag) + #-ppc64 (context-register context callee-register-offset))))) (step-info (single-step-info-from-context context))) ;; If there was not enough debug information available, there's no @@ -3910,6 +3914,9 @@ register." (sb-vm::incf-context-pc context 5)) (t (setf (context-register context callee-register-offset) + #+ppc64 + (logandc2 (get-lisp-obj-address new-callee) sb-vm:lowtag-mask) + #-ppc64 (get-lisp-obj-address new-callee)))))))) ;;; Given a signal context, fetch the step-info that's been stored in diff --git a/tests/step.pure.lisp b/tests/step.pure.lisp index 668f63dd04..bca9917797 100644 --- a/tests/step.pure.lisp +++ b/tests/step.pure.lisp @@ -12,7 +12,7 @@ ;;;; more information. ;; No stepper support on some platforms. -#+(or interpreter ppc64 riscv) (invoke-restart 'run-tests::skip-file) +#+(or interpreter riscv) (invoke-restart 'run-tests::skip-file) ;; These tests should either with code in dynamic space ;; or immobile space, but they only accidentally worked From 20b48b83aeffa7e4dcba0ffd6802cb3dec49fdd9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 19 May 2022 09:15:54 -0400 Subject: [PATCH 3377/4023] Fix extremely bothersome semantics of zero_dirty_pages() There were two problems with this function: 1. The implication of the name is that would leave each page with need_to_zero as false after clearing, but it actually marked the zeroed pages as needing zeroing. So just on the surface of it, that's highly counterintuitive. 2. Recently it acquired a new aspect of not doing anything on certain pages, because GC-use pages (as opposed to mutator-use pages) can generally be utilized without ever prezeroing them. Had the dubious function been instead named "prepare_page_for_use" it might have at least not been a complete lie. But both problems can be fixed while making it more efficient too. Need_to_zero is relevant only if the page is free, and about to become used, and had been used before. Therefore, only when freeing from_space pages must it be recorded that a page was ever dirty. And when shrinking an object which is basically the same as freeing from_space. The revised behavior confers a slight advantage in this scenario: - suppose 3 consecutive pages start as clean (need_to_zero == 0) - a new region spans those pages, then we allocate to the first page. - close the region. - two pages are still untouched, so their need_to_zero stays as 0. - reset_page_flags on the last 2 pages: still not-need-to-zero. This really happens. The old behavior would have put all 3 pages in the newly opened region into need_to_zero state simply because they became part of a region. --- src/runtime/fullcgc.c | 10 ++-- src/runtime/gencgc-private.h | 2 +- src/runtime/gencgc.c | 90 +++++++++++++++++++++++++--------- src/runtime/private-cons.inc | 7 ++- tests/private-cons.impure.lisp | 2 - 5 files changed, 78 insertions(+), 33 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index d40719e66e..626944ad82 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -92,7 +92,7 @@ static void* get_free_page() { lose("Needed more space to GC"); page_table[free_page].type = PAGE_TYPE_UNBOXED; char* mem = page_address(free_page); - zero_dirty_pages(free_page, free_page, 0); + zeroize_pages_if_needed(free_page, free_page, 0); return mem; } @@ -673,8 +673,8 @@ void execute_full_sweep_phase() if (sweeplog) fflush(sweeplog); - free_page = next_free_page; - while (free_page < page_table_pages) { - page_table[free_page++].type = FREE_PAGE_FLAG; - } + for (free_page = next_free_page; free_page < page_table_pages; ++free_page) { + set_page_need_to_zero(free_page, 1); + page_table[free_page].type = FREE_PAGE_FLAG; + } } diff --git a/src/runtime/gencgc-private.h b/src/runtime/gencgc-private.h index bcefb0e181..41e1e5297d 100644 --- a/src/runtime/gencgc-private.h +++ b/src/runtime/gencgc-private.h @@ -12,7 +12,7 @@ #ifndef _GENCGC_PRIVATE_H_ #define _GENCGC_PRIVATE_H_ -void zero_dirty_pages(page_index_t start, page_index_t end, int page_type); +void zeroize_pages_if_needed(page_index_t start, page_index_t end, int page_type); typedef unsigned int page_bytes_t; #define page_words_used(index) page_table[index].words_used_ diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 554e39a3ee..aff5d3da74 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -258,7 +258,7 @@ page_ends_contiguous_block_p(page_index_t page_index, /* We maintain the invariant that pages with FREE_PAGE_FLAG have * scan_start of zero, to optimize page_ends_contiguous_block_p(). * Clear all the flags that don't pertain to a free page. - * Particularly the 'need_zerofill' bit has to remain unchanged */ + * Particularly the 'need_zerofill' bit MUST remain as-is */ static inline void reset_page_flags(page_index_t page) { page_table[page].scan_start_offset_ = 0; page_table[page].type = 0; @@ -750,13 +750,14 @@ __attribute__((unused)) static const char * const page_type_description[8] = {0, "unboxed", "boxed", "mixed", "sm_mix", "cons", "?", "code"}; /* Zero the pages from START to END (inclusive), except for those - * pages that are known to already zeroed. Mark all pages in the - * ranges as non-zeroed. + * pages which: (a) don't require pre-clearing, or (b) do but are already clear. + * For each page in the range that got cleared right now, change the + * page's need_to_zero flag to 0; otherwise, leave that flag alone. */ #if defined LISP_FEATURE_RISCV && defined LISP_FEATURE_LINUX // KLUDGE int mmap_does_not_zero; #endif -void zero_dirty_pages(page_index_t start, page_index_t end, int page_type) { +void zeroize_pages_if_needed(page_index_t start, page_index_t end, int page_type) { // If allocating mixed pages to gen0 (or scratch which becomes gen0) then // this allocation is potentially going to be extended by lisp (if it happens to // pick up the tail of the page as its next available region) @@ -770,18 +771,22 @@ void zero_dirty_pages(page_index_t start, page_index_t end, int page_type) { /* Must always zero, as it may need changing the protection bits. */ boolean any_need_to_zero = 0; for (i = start; i <= end; i++) any_need_to_zero |= page_need_to_zero(i); - if (any_need_to_zero) zero_pages(start, end); + if (any_need_to_zero) { + zero_pages(start, end); + for (i = start; i <= end; i++) set_page_need_to_zero(i, 0); + } #else boolean usable_by_lisp = gc_alloc_generation == 0 || (gc_alloc_generation == SCRATCH_GENERATION && from_space == 0); if ((page_type == PAGE_TYPE_MIXED && usable_by_lisp) || page_type == 0) { for (i = start; i <= end; i++) - if (page_need_to_zero(i)) zero_pages(i, i); + if (page_need_to_zero(i)) { + zero_pages(i, i); + set_page_need_to_zero(i, 0); + } } #endif - - for (i = start; i <= end; i++) set_page_need_to_zero(i, 1); } @@ -993,6 +998,31 @@ static page_index_t find_single_page(int page_type, sword_t nbytes, generation_i gc_heap_exhausted_error_or_lose(bytes_avail, nbytes); } +/* CONS pages have a subrange (about 1/128th or 1/64th of the page) + * that demands prezeroing, but the bulk of the page does not require zeroing. + * We can't accurately represent the need_to_zero state on a part of the page. + * So if the page is in need_to_zero state, clear that subrange, + * but KEEP the need_to_zero state, because overall it is in that state. */ +static inline void ensure_cons_markbits_clear(page_index_t page) +{ + // If and only if the page was already completely zeroed, skip this + if (page_need_to_zero(page)) { + char *trailer = page_address(page) + CONS_PAGE_USABLE_BYTES; + memset(trailer, 0, GENCGC_PAGE_BYTES - CONS_PAGE_USABLE_BYTES); + } +} + +#if 0 +boolean page_is_zeroed(page_index_t page) +{ + int nwords_per_page = GENCGC_PAGE_BYTES/N_WORD_BYTES; + uword_t *pagebase = (void*)page_address(page); + int i; + for (i=0; i<nwords_per_page; ++i) if (pagebase[i]) return 0; + return 1; +} +#endif + static void* gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_region, int unlock) { @@ -1013,17 +1043,11 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re #ifdef LISP_FEATURE_DARWIN_JIT if (!page_words_used(page)) /* May need to be remapped from PAGE_TYPE_CODE */ - zero_dirty_pages(page, page, page_type); - else - set_page_need_to_zero(page, 1); -#else - if (page_type == PAGE_TYPE_CONS && page_need_to_zero(page) && !page_words_used(page)) { - // Zero the trailing data (the cons cell mark bits) - char *trailer = page_address(page) + CONS_PAGE_USABLE_BYTES; - memset(trailer, 0, GENCGC_PAGE_BYTES - CONS_PAGE_USABLE_BYTES); - } - set_page_need_to_zero(page, 1); // would normally be set in zero_dirty_pages() + zeroize_pages_if_needed(page, page, page_type); #endif + // TODO: move this out of the mutex scope + if (page_type == PAGE_TYPE_CONS && !page_words_used(page)) + ensure_cons_markbits_clear(page); // Don't need to set the scan_start_offset because free pages have it 0 // (and each of these page types starts a new contiguous block) gc_dcheck(page_table[page].scan_start_offset_ == 0); @@ -1086,7 +1110,7 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re first_page++; } - INSTRUMENTING(zero_dirty_pages(first_page, last_page, page_type), et_bzeroing); + INSTRUMENTING(zeroize_pages_if_needed(first_page, last_page, page_type), et_bzeroing); #ifdef LISP_FEATURE_DARWIN_JIT if (page_type == PAGE_TYPE_CODE) { @@ -1184,6 +1208,17 @@ add_new_area(page_index_t first_page, size_t offset, size_t size) * * This is the internal implementation of ensure_region_closed(), * and not to be invoked as the interface to closing a region. + * + * Note that in no case will closing a region alter the need_to_zero bit + * on any page in the region. It is legal to set that bit as late as possible, + * because we only have to know just-in-time - when changing the page + * (at some point later) from FREE to non-free - whether to zeroize it. + * Therefore, we can set the need_to_zero bit only when there is otherwise + * no way to detect that it ever held nonzero data, namely immediately + * before doing reset_page_flags() or setting the words_used to 0. + * Reflecting the words_used into that bit each time we update words_used + * from a region's free pointer would be redundant (newspace scavenging + * can open/close/open/close a region several times on the same page). */ void gc_close_region(struct alloc_region *alloc_region, int page_type) @@ -1342,7 +1377,7 @@ void *gc_alloc_large(sword_t nbytes, int page_type) int __attribute__((unused)) ret = mutex_release(&free_pages_lock); gc_assert(ret); } - INSTRUMENTING(zero_dirty_pages(first_page, last_page, page_type), et_bzeroing); + INSTRUMENTING(zeroize_pages_if_needed(first_page, last_page, page_type), et_bzeroing); /* Add the region to the new_areas if requested. */ if (boxed_type_p(page_type)) add_new_area(first_page, 0, nbytes); @@ -1610,6 +1645,13 @@ void *collector_alloc_fallback(struct alloc_region* region, sword_t nbytes, int * * maybe_adjust_large_object() specifies 'from_space' for 'new_gen' * and copy_potential_large_object() specifies 'new_space' + * + * Note that creating a large object might not affect the 'need_to_zero' + * flag on any of pages consumed (it would if the page type demands prezeroing + * and wasn't zero), but freeing the unused pages of a shrunken object DOES + * set the need_to_zero bit unconditionally. We have to suppose that the object + * constructor wrote bytes on each of its pages, and we don't know whether the tail + * of the object got zeroed versus bashed into FILLER_WIDETAG + random bits. */ static uword_t adjust_obj_ptes(page_index_t first_page, @@ -1710,6 +1752,7 @@ static uword_t adjust_obj_ptes(page_index_t first_page, #endif /* It checks out OK, free the page. */ prev_bytes_used = page_bytes_used(page); + set_page_need_to_zero(page, 1); set_page_bytes_used(page, 0); reset_page_flags(page); bytes_freed += prev_bytes_used; @@ -3359,9 +3402,11 @@ static void free_oldspace(void) /* Should already be unprotected by unprotect_oldspace(). */ gc_dcheck(page_cards_all_marked_nonsticky(last_page)); /* Free the page. */ - bytes_freed += page_bytes_used(page); - reset_page_flags(page); + int used = page_words_used(page); + if (used) set_page_need_to_zero(page, 1); set_page_bytes_used(page, 0); + reset_page_flags(page); + bytes_freed += used << WORD_SHIFT; } } generations[from_space].bytes_allocated -= bytes_freed; @@ -5559,7 +5604,6 @@ void gc_load_corefile_ptes(int card_table_nbits, page_table[page].words_used_ = pte.words_used; set_page_scan_start_offset(page, pte.sso & ~0x07); page_table[page].gen = gen; - set_page_need_to_zero(page, 1); } bytes_allocated += pte.words_used << WORD_SHIFT; } diff --git a/src/runtime/private-cons.inc b/src/runtime/private-cons.inc index 563d26c756..6e8c440cb4 100644 --- a/src/runtime/private-cons.inc +++ b/src/runtime/private-cons.inc @@ -82,12 +82,14 @@ static struct cons* private_cons_impl() struct cons* page_header = (struct cons*)page_address(page); if (PRIVATE_CONS_DEBUG) - fprintf(stderr, "GC-private page @ %p\n", page_header); + fprintf(stderr, "GC-private page %"PAGE_INDEX_FMT" @ %p\n", page, page_header); gc_assert(last_page == page); gc_dcheck(page_cards_all_marked_nonsticky(page)); page_table[page].gen = GC_PRIVATE_CONS_GENERATION; page_table[page].type = PAGE_TYPE_UNBOXED; - zero_dirty_pages(page, page, 0); + /* I'm surprised that the GC needs to prezero private conses. + * Was I just not thinking clearly? */ + zeroize_pages_if_needed(page, page, 0); page_index_t tail = private_cons_page_chain; page_header->car = 0; // unused page_header->cdr = (lispobj)(tail >= 0 ? page_address(tail) : 0); @@ -110,6 +112,7 @@ static void release_pages_impl() if (PRIVATE_CONS_DEBUG) fprintf(stderr, "Freeing GC-private page @ %p (index %ld)\n", list, (long)index); + set_page_need_to_zero(index, 1); set_page_bytes_used(index, 0); reset_page_flags(index); } diff --git a/tests/private-cons.impure.lisp b/tests/private-cons.impure.lisp index 368efe0d77..ea48445d31 100644 --- a/tests/private-cons.impure.lisp +++ b/tests/private-cons.impure.lisp @@ -51,9 +51,7 @@ (push index pages) (assert (= cons (+ base-address (* 2 sb-vm:n-word-bytes)))) ;; words-used should be 4, for 2 conses, - ;; and the need_zerofill bit should be 1. (assert (= (slot (deref sb-vm::page-table index) 'sb-vm::words-used) 4)) - (assert (page-need-to-zero index)) (dotimes (i (1- conses-per-page)) (setq final (private-list (incf counter)))) (assert (= final (+ base-address sb-vm:gencgc-page-bytes From 58e883f4b7c1a7518eac2aaecadf6129ba5eb13c Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 19 May 2022 16:53:09 +0300 Subject: [PATCH 3378/4023] Don't check for (array nil) in nstring-upcase. These are no longer strings. --- src/code/string.lisp | 76 +++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 47 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index dc9e556e60..41a74f8675 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -504,28 +504,19 @@ new string COUNT long filled with the fill character." (declaim (maybe-inline nstring-upcase)) (defun nstring-upcase (string &key (start 0) end) - (declare (explicit-check)) - (if (typep string '(array nil (*))) - (if (zerop (length string)) - string - (data-nil-vector-ref string 0)) - (locally - (declare ((or base-string - (array character (*))) - string)) - (with-one-string (string start end) - (do ((index start (1+ index)) - (cases +character-cases+)) - ((>= index end)) - (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (let ((char (schar string index))) - (with-case-info (char case-index cases - :cases cases) - (let ((code (aref cases (1+ case-index)))) - (unless (zerop code) - (setf (schar string index) - (code-char (truly-the char-code code))))))))) - string))) + (with-one-string (string start end) + (do ((index start (1+ index)) + (cases +character-cases+)) + ((>= index end)) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (let ((char (schar string index))) + (with-case-info (char case-index cases + :cases cases) + (let ((code (aref cases (1+ case-index)))) + (unless (zerop code) + (setf (schar string index) + (code-char (truly-the char-code code))))))))) + string) (defun string-upcase (string &key (start 0) end) (declare (explicit-check) @@ -534,31 +525,22 @@ new string COUNT long filled with the fill character." (declaim (maybe-inline nstring-downcase)) (defun nstring-downcase (string &key (start 0) end) - (declare (explicit-check)) - (if (typep string '(array nil (*))) - (if (zerop (length string)) - string - (data-nil-vector-ref string 0)) - (locally - (declare ((or base-string - (array character (*))) - string)) - (with-one-string (string start end) - (do ((index start (1+ index)) - (cases #.+character-cases+)) - ((>= index end)) - (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (let ((char (schar (truly-the (or simple-base-string - simple-character-string) - string) - index))) - (with-case-info (char case-index cases - :cases cases) - (let ((code (aref cases case-index))) - (unless (zerop code) - (setf (schar string index) - (code-char (truly-the char-code code))))))))) - string))) + (with-one-string (string start end) + (do ((index start (1+ index)) + (cases #.+character-cases+)) + ((>= index end)) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (let ((char (schar (truly-the (or simple-base-string + simple-character-string) + string) + index))) + (with-case-info (char case-index cases + :cases cases) + (let ((code (aref cases case-index))) + (unless (zerop code) + (setf (schar string index) + (code-char (truly-the char-code code))))))))) + string) (defun string-downcase (string &key (start 0) end) (declare (explicit-check) From f8dbe9b9909c025ce84074626d3bd890cb8c5e9d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 19 May 2022 17:02:30 +0300 Subject: [PATCH 3379/4023] Derive the type of %with-array-data for STRING. --- src/code/string.lisp | 5 +---- src/compiler/array-tran.lisp | 12 +++++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 41a74f8675..592a2f3924 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -530,10 +530,7 @@ new string COUNT long filled with the fill character." (cases #.+character-cases+)) ((>= index end)) (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (let ((char (schar (truly-the (or simple-base-string - simple-character-string) - string) - index))) + (let ((char (schar string index))) (with-case-info (char case-index cases :cases cases) (let ((code (aref cases case-index))) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index 7db34d47ac..d80aeb544d 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -255,11 +255,13 @@ ;;; element type. (defun derive-%with-array-data/mumble-type (array) (let ((atype (lvar-type array))) - (when (array-type-p atype) - (specifier-type - `(simple-array ,(type-specifier - (array-type-specialized-element-type atype)) - (*)))))) + (cond ((array-type-p atype) + (specifier-type + `(simple-array ,(type-specifier + (array-type-specialized-element-type atype)) + (*)))) + ((csubtypep atype (specifier-type 'string)) + (specifier-type 'simple-string))))) (defoptimizer (%with-array-data derive-type) ((array start end)) (declare (ignore start end)) (derive-%with-array-data/mumble-type array)) From b63dca0b026211e6af63e034ae03d20bf4191bbd Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 19 May 2022 18:03:46 +0300 Subject: [PATCH 3380/4023] Remove a redundant statement in gc_alloc_new_region. --- src/runtime/gencgc.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index aff5d3da74..6c50b8160c 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1114,12 +1114,8 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re #ifdef LISP_FEATURE_DARWIN_JIT if (page_type == PAGE_TYPE_CODE) { - page_index_t first = first_page; - if (page_words_used(first) != 0) { - first++; - } - if (last_page >= first) { - os_protect(page_address(first), npage_bytes(1+last_page-first), OS_VM_PROT_ALL); + if (last_page >= first_page) { + os_protect(page_address(first_page), npage_bytes(1+last_page-first_page), OS_VM_PROT_ALL); } } #endif From 4e9f99a8e6c976a52b1cbd1126f36881a8468d3c Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 20 May 2022 11:41:01 +0100 Subject: [PATCH 3381/4023] NEWS in preparation for sbcl-2.2.5 freeze --- NEWS | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 57b39e4c17..4b1000ffbb 100644 --- a/NEWS +++ b/NEWS @@ -1,21 +1,35 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.2.4: - * slightly incompatible change: SB-EXT:*DERIVE-FUNCTION-TYPES* being NIL now + * minor incompatible change: SB-EXT:*DERIVE-FUNCTION-TYPES* being NIL now means that function calls will strictly only use type information from proclaimed ftypes. The previous behavior (still the default) of using derived type information from the same file is specified with :SAME-FILE. + (lp#1393302) * minor incompatible change: RENAME-FILE now overwrites the target file on Windows too, making its behaviour consistent with other platforms. + * platform support: + ** single-stepping is now supported on 64-bit PowerPC platforms. (thanks + to Thomas Fitzsimmons) * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. + * optimization: improved type derivation of REDUCE with some known reducing + functions. * enhancement: debug source locations now work correctly for top level forms with policy DEBUG = 1, as well as for block compiled files. + * enhancement: TRACE now supports tracing macro functions, compiler-macro + functions, individual methods and local functions. See the user manual for + more details. (lp#375314) + * bug fix: fix integer comparisons on x86-64 and arm64 (lp#1971088, reported + by Guillaume LE VAILLANT) * bug fix: coverage instrumentation behaves correctly with respect to non-local exits. * bug fix: ftype proclamations now take effect immediately during block compilation. - * bug fix: block compilation of top-level closures now work. + * bug fix: block compilation of top-level closures now work. (lp#1931730, + reported by Sean Maher) + * bug fix: streams opened from RUN-PROGRAM but left unclosed because of a + non-local exit no longer cause unrelated streams to be closed later. changes in sbcl-2.2.4 relative to sbcl-2.2.3: * enhancement: better constraint propagation in the compiler. Specifically, From 1844ec7a8050e05ed023b32eeb635e81cb3b0e43 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 20 May 2022 15:55:31 +0300 Subject: [PATCH 3382/4023] Restore FIND, POSITION type derivation. Which is lost after they are transformed to %find-position. --- src/compiler/seqtran.lisp | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 772d111bf4..a35e3968d9 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1761,10 +1761,7 @@ (multiple-value-bind (min max) (index-into-sequence-derive-type sequence1 start1 end1) (specifier-type `(or (integer ,min ,max) null)))) -(defoptimizer (position derive-type) ((item sequence - &key start end - key test test-not - &allow-other-keys)) +(defun position-derive-type (item sequence start end key test test-not) (multiple-value-bind (min max) (index-into-sequence-derive-type sequence start end :inclusive nil) (let ((integer-range `(integer ,min ,max)) @@ -1793,6 +1790,21 @@ integer-range `(or ,integer-range null)))))) +(defoptimizer (position derive-type) ((item sequence + &key start end + key test test-not + &allow-other-keys)) + (position-derive-type item sequence start end key test test-not)) + +(defoptimizer (%find-position derive-type) ((item sequence from-end start end key test)) + (declare (ignore from-end)) + (let ((find (find-derive-type item sequence start end key test nil)) + (position (position-derive-type item sequence start end key test nil))) + (when (or find position) + (make-values-type :required + (list (or find *universal-type*) + (or position *universal-type*)))))) + (defoptimizer (position-if derive-type) ((function sequence &key start end &allow-other-keys)) @@ -2101,8 +2113,7 @@ ;;;; FIND, POSITION, and their -IF and -IF-NOT variants -(defoptimizer (find derive-type) ((item sequence &key key test - start end from-end)) +(defun find-derive-type (item sequence key test start end from-end) (declare (ignore sequence start end from-end)) (let ((key-fun (or (and key (lvar-fun-name* key)) 'identity))) ;; If :KEY is a known function, then regardless of the :TEST, @@ -2113,12 +2124,12 @@ (unless (eq key-fun 'identity) (acond ((info :function :info key-fun) (let ((type (info :function :type key-fun))) - (return-from find-derive-type-optimizer + (return-from find-derive-type (awhen (and (fun-type-p type) (fun-type-required type)) (type-union (first it) (specifier-type 'null)))))) ((structure-instance-accessor-p key-fun) - (return-from find-derive-type-optimizer + (return-from find-derive-type (specifier-type `(or ,(dd-name (car it)) null))))))) ;; Otherwise maybe FIND returns ITEM itself (or an EQL number). ;; :TEST is allowed only if EQ or EQL (where NIL means EQL). @@ -2131,6 +2142,10 @@ (lvar-value-is-nil key))) (type-union (lvar-type item) (specifier-type 'null)))) +(defoptimizer (find derive-type) ((item sequence &key key test + start end from-end)) + (find-derive-type item sequence key test start end from-end)) + ;;; We want to make sure that %FIND-POSITION is inline-expanded into ;;; %FIND-POSITION-IF only when %FIND-POSITION-IF has an inline ;;; expansion, so we factor out the condition into this function. From a4a84c50afb1548f7fc206b01b3c6141ccc6d2b2 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 20 May 2022 17:06:36 +0300 Subject: [PATCH 3383/4023] Remove unused functions. --- src/compiler/knownfun.lisp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index 1fae224f5b..0a7625eef1 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -459,16 +459,6 @@ (max-dim (lvar-type lvar)) (values max min)))))) -(defun position-derive-type (call) - (let ((dim (sequence-lvar-dimensions (second (combination-args call))))) - (when (integerp dim) - (specifier-type `(or (integer 0 (,dim)) null))))) - -(defun count-derive-type (call) - (let ((dim (sequence-lvar-dimensions (second (combination-args call))))) - (when (integerp dim) - (specifier-type `(integer 0 ,dim))))) - ;;; This used to be done in DEFOPTIMIZER DERIVE-TYPE, but ;;; ASSERT-CALL-TYPE already asserts the ARRAY type, so it gets an extra ;;; assertion that may not get eliminated and requires extra work. From 47182c499f6015fe180a32169e70c3f5d63d7b17 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 20 May 2022 18:40:43 +0300 Subject: [PATCH 3384/4023] Improve FIND type derivation. Take the sequence type into account. --- src/compiler/seqtran.lisp | 62 +++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index a35e3968d9..42faaa7262 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1797,8 +1797,7 @@ (position-derive-type item sequence start end key test test-not)) (defoptimizer (%find-position derive-type) ((item sequence from-end start end key test)) - (declare (ignore from-end)) - (let ((find (find-derive-type item sequence start end key test nil)) + (let ((find (find-derive-type item sequence key test start end from-end)) (position (position-derive-type item sequence start end key test nil))) (when (or find position) (make-values-type :required @@ -2114,33 +2113,38 @@ ;;;; FIND, POSITION, and their -IF and -IF-NOT variants (defun find-derive-type (item sequence key test start end from-end) - (declare (ignore sequence start end from-end)) - (let ((key-fun (or (and key (lvar-fun-name* key)) 'identity))) - ;; If :KEY is a known function, then regardless of the :TEST, - ;; FIND returns an object of the type that KEY accepts, or nil. - ;; If LVAR-FUN-NAME can't be determined, it returns NIL. - ;; :KEY NIL is valid, and means #'IDENTITY. - ;; So either way, we get IDENTITY which skips this code. - (unless (eq key-fun 'identity) - (acond ((info :function :info key-fun) - (let ((type (info :function :type key-fun))) - (return-from find-derive-type - (awhen (and (fun-type-p type) - (fun-type-required type)) - (type-union (first it) (specifier-type 'null)))))) - ((structure-instance-accessor-p key-fun) - (return-from find-derive-type - (specifier-type `(or ,(dd-name (car it)) null))))))) - ;; Otherwise maybe FIND returns ITEM itself (or an EQL number). - ;; :TEST is allowed only if EQ or EQL (where NIL means EQL). - ;; :KEY is allowed only if IDENTITY or NIL. - (when (and (or (not test) - (lvar-fun-is test '(eq eql)) - (lvar-value-is-nil test)) - (or (not key) - (lvar-fun-is key '(identity)) - (lvar-value-is-nil key))) - (type-union (lvar-type item) (specifier-type 'null)))) + (declare (ignore start end from-end)) + (let ((type *universal-type*) + (key-identity-p (or (not key) + (lvar-value-is-nil key) + (lvar-fun-is key '(identity))))) + (flet ((fun-accepts-type (fun-lvar argument) + (when fun-lvar + (let ((fun-type (lvar-fun-type fun-lvar))) + (when (fun-type-p fun-type) + (let ((arg (nth argument (fun-type-n-arg-types (1+ argument) fun-type)))) + (when arg + (setf type + (type-intersection type arg))))))))) + (when (and key-identity-p + (or (not test) + (lvar-fun-is test '(eq eql char= char-equal)) + (lvar-value-is-nil test))) + ;; Maybe FIND returns ITEM itself (or an EQL number). + (setf type (lvar-type item))) + ;; Should return something the functions can accept + (if key-identity-p + (fun-accepts-type test 1) + (fun-accepts-type key 0))) + (when (csubtypep (lvar-type sequence) (specifier-type 'array)) + (let ((upgraded-type + (array-type-upgraded-element-type (lvar-type sequence)))) + (unless (eq upgraded-type *wild-type*) + (setf type + (type-intersection type upgraded-type))))) + (unless (eq type *empty-type*) + (type-union type + (specifier-type 'null))))) (defoptimizer (find derive-type) ((item sequence &key key test start end from-end)) From 58a8d2d4ba30a9771c9c03a65fcca4455336e0b2 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 20 May 2022 18:53:32 +0300 Subject: [PATCH 3385/4023] Add type derivers for %find-position-if/-not --- src/compiler/seqtran.lisp | 112 ++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 47 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 42faaa7262..f13b2dd09e 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1772,7 +1772,8 @@ ;; (1+ (position (the (member :x :y) item) #(:foo :bar :x :y))). ;; In that example, a more exact bound could be determined too. (cond ((or (not (constant-lvar-p sequence)) - start end key test test-not)) + start end key test test-not + (not item))) (t (let ((const-seq (lvar-value sequence)) (item-type (lvar-type item))) @@ -1790,20 +1791,51 @@ integer-range `(or ,integer-range null)))))) +(defun find-derive-type (item sequence key test start end from-end) + (declare (ignore start end from-end)) + (let ((type *universal-type*) + (key-identity-p (or (not key) + (lvar-value-is-nil key) + (lvar-fun-is key '(identity))))) + (flet ((fun-accepts-type (fun-lvar argument) + (when fun-lvar + (let ((fun-type (lvar-fun-type fun-lvar))) + (when (fun-type-p fun-type) + (let ((arg (nth argument (fun-type-n-arg-types (1+ argument) fun-type)))) + (when arg + (setf type + (type-intersection type arg))))))))) + (when (and item + key-identity-p + (or (not test) + (lvar-fun-is test '(eq eql char= char-equal)) + (lvar-value-is-nil test))) + ;; Maybe FIND returns ITEM itself (or an EQL number). + (setf type (lvar-type item))) + ;; Should return something the functions can accept + (if key-identity-p + (fun-accepts-type test (if item 1 0)) ;; the -if variants. + (fun-accepts-type key 0))) + (when (csubtypep (lvar-type sequence) (specifier-type 'array)) + (let ((upgraded-type + (array-type-upgraded-element-type (lvar-type sequence)))) + (unless (eq upgraded-type *wild-type*) + (setf type + (type-intersection type upgraded-type))))) + (unless (eq type *empty-type*) + (type-union type + (specifier-type 'null))))) + +(defoptimizer (find derive-type) ((item sequence &key key test + start end from-end)) + (find-derive-type item sequence key test start end from-end)) + (defoptimizer (position derive-type) ((item sequence &key start end key test test-not &allow-other-keys)) (position-derive-type item sequence start end key test test-not)) -(defoptimizer (%find-position derive-type) ((item sequence from-end start end key test)) - (let ((find (find-derive-type item sequence key test start end from-end)) - (position (position-derive-type item sequence start end key test nil))) - (when (or find position) - (make-values-type :required - (list (or find *universal-type*) - (or position *universal-type*)))))) - (defoptimizer (position-if derive-type) ((function sequence &key start end &allow-other-keys)) @@ -1820,6 +1852,30 @@ (index-into-sequence-derive-type sequence start end :inclusive nil) (specifier-type `(or (integer ,min ,max) null)))) +(defoptimizer (%find-position derive-type) ((item sequence from-end start end key test)) + (let ((find (find-derive-type item sequence key test start end from-end)) + (position (position-derive-type item sequence start end key test nil))) + (when (or find position) + (make-values-type :required + (list (or find *universal-type*) + (or position *universal-type*)))))) + +(defoptimizer (%find-position-if derive-type) ((predicate sequence from-end start end key)) + (let ((find (find-derive-type nil sequence key predicate start end from-end)) + (position (position-derive-type nil sequence start end key predicate nil))) + (when (or find position) + (make-values-type :required + (list (or find *universal-type*) + (or position *universal-type*)))))) + +(defoptimizer (%find-position-if-not derive-type) ((predicate sequence from-end start end key)) + (let ((find (find-derive-type nil sequence key predicate start end from-end)) + (position (position-derive-type nil sequence start end key predicate nil))) + (when (or find position) + (make-values-type :required + (list (or find *universal-type*) + (or position *universal-type*)))))) + (defoptimizer (count derive-type) ((item sequence &key start end &allow-other-keys)) @@ -2112,44 +2168,6 @@ ;;;; FIND, POSITION, and their -IF and -IF-NOT variants -(defun find-derive-type (item sequence key test start end from-end) - (declare (ignore start end from-end)) - (let ((type *universal-type*) - (key-identity-p (or (not key) - (lvar-value-is-nil key) - (lvar-fun-is key '(identity))))) - (flet ((fun-accepts-type (fun-lvar argument) - (when fun-lvar - (let ((fun-type (lvar-fun-type fun-lvar))) - (when (fun-type-p fun-type) - (let ((arg (nth argument (fun-type-n-arg-types (1+ argument) fun-type)))) - (when arg - (setf type - (type-intersection type arg))))))))) - (when (and key-identity-p - (or (not test) - (lvar-fun-is test '(eq eql char= char-equal)) - (lvar-value-is-nil test))) - ;; Maybe FIND returns ITEM itself (or an EQL number). - (setf type (lvar-type item))) - ;; Should return something the functions can accept - (if key-identity-p - (fun-accepts-type test 1) - (fun-accepts-type key 0))) - (when (csubtypep (lvar-type sequence) (specifier-type 'array)) - (let ((upgraded-type - (array-type-upgraded-element-type (lvar-type sequence)))) - (unless (eq upgraded-type *wild-type*) - (setf type - (type-intersection type upgraded-type))))) - (unless (eq type *empty-type*) - (type-union type - (specifier-type 'null))))) - -(defoptimizer (find derive-type) ((item sequence &key key test - start end from-end)) - (find-derive-type item sequence key test start end from-end)) - ;;; We want to make sure that %FIND-POSITION is inline-expanded into ;;; %FIND-POSITION-IF only when %FIND-POSITION-IF has an inline ;;; expansion, so we factor out the condition into this function. From 661e3619098225fef9f317b4cb8e72889168cd4d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 23 May 2022 01:14:57 +0300 Subject: [PATCH 3386/4023] Fix %sp-string-compare parameter order. To be like the rest of the two-string functions, so that the shared optimizers work correctly. Reported by _death. --- src/code/mipsstrops.lisp | 4 ++-- src/code/string.lisp | 8 ++++---- src/compiler/generic/vm-fndb.lisp | 4 ++-- src/compiler/seqtran.lisp | 4 ++-- tests/string.pure.lisp | 8 ++++++++ 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/code/mipsstrops.lisp b/src/code/mipsstrops.lisp index 5616f2fcd7..6e9e48161b 100644 --- a/src/code/mipsstrops.lisp +++ b/src/code/mipsstrops.lisp @@ -14,7 +14,7 @@ ;;; Compare the substrings specified by STRING1 and STRING2 and return ;;; two values, the last index and the difference between the last characters -(defun %sp-string-compare (string1 start1 end1 string2 start2 end2) +(defun %sp-string-compare (string1 string2 start1 end1 start2 end2) (let* ((end1 (or end1 (length string1))) (end2 (or end2 @@ -59,7 +59,7 @@ (char-code char2))))))))))) ;;; Doesn't need to return a mismatch index -(defun %sp-string= (string1 start1 end1 string2 start2 end2) +(defun %sp-string= (string1 string2 start1 end1 start2 end2) (let* ((end1 (or end1 (length string1))) (end2 (or end2 diff --git a/src/code/string.lisp b/src/code/string.lisp index 592a2f3924..c61086c8bc 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -176,7 +176,7 @@ t))) (char-loop character base-char)))))) #-sb-unicode - (%sp-string= string1 start1 end1 string2 start2 end2))) + (%sp-string= string1 string2 start1 end1 start2 end2))) (defun simple-base-string= (string1 string2 start1 end1 start2 end2) (with-two-strings string1 string2 start1 end1 nil start2 end2 @@ -206,7 +206,7 @@ (defun string/=* (string1 string2 start1 end1 start2 end2) (with-two-strings string1 string2 start1 end1 offset1 start2 end2 (multiple-value-bind (index diff) - (%sp-string-compare string1 start1 end1 string2 start2 end2) + (%sp-string-compare string1 string2 start1 end1 start2 end2) (if (zerop diff) nil (- index offset1))))) @@ -214,8 +214,8 @@ (defmacro string<>=*-body (test index) `(with-two-strings string1 string2 start1 end1 offset1 start2 end2 (multiple-value-bind (index diff) - (%sp-string-compare string1 start1 end1 - string2 start2 end2) + (%sp-string-compare string1 string2 + start1 end1 start2 end2) (if (,test diff 0) ,(if index '(- index offset1) nil) ,(if index nil '(- index offset1)))))) diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 5eaf593d32..cab59312f1 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -95,11 +95,11 @@ (defknown pointer-hash (t) fixnum (flushable)) (defknown %sp-string-compare - (simple-string index (or null index) simple-string index (or null index)) + (simple-string simple-string index (or null index) index (or null index)) (values index fixnum) (foldable flushable no-verify-arg-count)) (defknown %sp-string= - (simple-string index (or null index) simple-string index (or null index)) + (simple-string simple-string index (or null index) index (or null index)) boolean (foldable flushable no-verify-arg-count)) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index f13b2dd09e..5586e967a9 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -936,7 +936,7 @@ `(deftransform ,name ((string1 string2 start1 end1 start2 end2) (simple-string simple-string t t t t) *) `(multiple-value-bind (index diff) - (%sp-string-compare string1 start1 end1 string2 start2 end2) + (%sp-string-compare string1 string2 start1 end1 start2 end2) (if ,',test ,,(if index ''index 'nil) ,,(if index 'nil ''index)))))) @@ -989,7 +989,7 @@ (deftransform string/=* ((string1 string2 start1 end1 start2 end2) (simple-string simple-string t t t t) *) `(multiple-value-bind (index diff) - (%sp-string-compare string1 start1 end1 string2 start2 end2) + (%sp-string-compare string1 string2 start1 end1 start2 end2) (declare (ignorable index)) (if (,'/= diff 0) ,'index diff --git a/tests/string.pure.lisp b/tests/string.pure.lisp index 1a61ade474..a411c76dd1 100644 --- a/tests/string.pure.lisp +++ b/tests/string.pure.lisp @@ -278,3 +278,11 @@ claim that any particular result from these edge cases constitutes a bug. (assert-error (funcall (opaque-identity 'make-string) 10 :element-type '(member #\a #\b #\c) :initial-element #\x))) + +(with-test (:name :%sp-string-compare-argument-order) + (checked-compile-and-assert + () + `(lambda (x) + (string/= "_" (the simple-string x))) + (("_") nil) + (("a") 0))) From 0df74311cd12310c7d2fb27b64422a72958b33c3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 23 May 2022 11:20:53 -0400 Subject: [PATCH 3387/4023] Fix editcore It was trying to perform a type-check a target-core layout which as far as the host can tell doesn't have layout-of-layout. I'll have to figure out how to regression test this. Any test will need layouts to be arranged differently, and heap-address fuzzing. --- tools-for-build/editcore.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index f9a8b0ad5a..f3169e4053 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1538,7 +1538,7 @@ (return-from scan-obj)) (case widetag (#.instance-widetag - (let ((type (translate (%instance-layout obj) spaces))) + (let ((type (truly-the layout (translate (%instance-layout obj) spaces)))) (do-layout-bitmap (i taggedp type (%instance-length obj)) (when taggedp (scanptr vaddr obj (1+ i))))) From b61bc3233f733220c675d4685678687b1ab30c08 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 23 May 2022 17:48:05 -0400 Subject: [PATCH 3388/4023] Assign IDs to deferred packages --- src/code/target-package.lisp | 34 ++++++++++++++++++++-------------- tests/input-manifest.lisp-expr | 1 + tests/packages.impure.lisp | 10 ++++++++++ 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 048fa72c1e..75da8304d3 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -836,6 +836,26 @@ Experimental: interface subject to change." ;;; list of a package) into TABLE (the hashtable in *PACKAGE-NAMES*), ;;; taking care to adjust the count of phantom entries. (defun %register-package (table name object) + ;; Registration ensures a non-null id if it can (even for a "deferred" package) + (let ((package (if (listp object) (car object) object))) + (unless (package-id package) + ;; manipulation of the id->package vector is hard to do lock-freeely + ;; and it's not really a bottleneck, so just grab a lock. + (with-package-names (dummy) + (let* ((vector *id->package*) + ;; 30 is an arbitrary constant exceeding the number of builtin packages + (new-id (position nil vector :start 30))) + (when (and (null new-id) (< (length vector) +package-id-overflow+)) + (let* ((current-length (length vector)) + (new-length (min (+ current-length 10) +package-id-overflow+)) + (new-vector (make-array new-length :initial-element nil))) + (replace new-vector vector) + (setf *id->package* new-vector) + (setf new-id current-length + vector new-vector))) + (when new-id + (setf (package-id package) new-id + (aref vector new-id) package)))))) (let ((oldval (info-gethash name table))) (unless oldval ; if any value existed, no new physical cell is claimed (when (> (info-env-tombstones table) @@ -1034,20 +1054,6 @@ implementation it is ~S." *!default-package-use-list*) ;; other MAKE-PACKAGE operations, but we need the additional lock ;; so that it synchronizes with RENAME-PACKAGE. (with-package-names (table) - (let* ((vector *id->package*) - ;; 30 is an arbitrary constant exceeding the number of builtin packages - (new-id (position nil vector :start 30))) - (when (and (null new-id) (< (length vector) +package-id-overflow+)) - (let* ((current-length (length vector)) - (new-length (min (+ current-length 10) +package-id-overflow+)) - (new-vector (make-array new-length :initial-element nil))) - (replace new-vector vector) - (setf *id->package* new-vector) - (setf new-id current-length - vector new-vector))) - (when new-id - (setf (package-id package) new-id - (aref vector new-id) package))) (%register-package table name package)) (atomic-incf *package-names-cookie*) (return package)) diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 3d2242c2c8..8dafc375e4 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -67,6 +67,7 @@ ("octets.pure.lisp" "tests/data/compile-file-pos.lisp" "tests/data/compile-file-pos-utf16be.lisp") + ("packages.impure.lisp" "contrib/sb-md5.fasl" "contrib/sb-rotate-byte.fasl") ("redblack.pure.lisp" "tests/bbtree-test-util.lisp") ("run-program.impure.lisp" "contrib/sb-posix.fasl") ("sb-graph.impure.lisp" "contrib/sb-graph.fasl" "contrib/uiop.fasl") diff --git a/tests/packages.impure.lisp b/tests/packages.impure.lisp index 13d34c29ab..1e3618d51d 100644 --- a/tests/packages.impure.lisp +++ b/tests/packages.impure.lisp @@ -11,6 +11,16 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. +(require :sb-md5) +#+64-bit +(progn + (defun spid (x) (sb-impl::symbol-package-id (the symbol x))) ; no stub? + (compile 'spid) + (let ((n 0)) + (do-all-symbols (s) + (when (> (spid s) 100) (incf n))) + (assert (= n 0)))) + (defun set-bad-package (x) (declare (optimize (safety 0))) (setq *package* x)) From 208c124ea76b883425719a3d17f312aeb7aa631d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 24 May 2022 10:53:18 -0400 Subject: [PATCH 3389/4023] Depend only on self as input to test Simplifies automatic translation from sexprs to other syntax such as https://bazel.build/reference/be/shell#sh_test because all tests are presumed to depend on test-util and assertoid, and duplicate filenames in deps= will produce an error. --- tests/autoclose-stream.impure.lisp | 4 +--- tests/input-manifest.lisp-expr | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/autoclose-stream.impure.lisp b/tests/autoclose-stream.impure.lisp index 7e092a27c0..79ee7b0d7a 100644 --- a/tests/autoclose-stream.impure.lisp +++ b/tests/autoclose-stream.impure.lisp @@ -33,9 +33,7 @@ (defun make-streams () (let (streams) (dotimes (i 6) - (setq streams (nconc (list (open "test-util.lisp") - (open "assertoid.lisp")) - streams))) + (push (open "autoclose-stream.impure.lisp") streams)) (dolist (stream streams) (assert (fd-has-finalizer-p (sb-impl::fd-stream-fd stream)))) (setq *fds* diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 8dafc375e4..b6371f3764 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -4,7 +4,6 @@ (("aprof.impure.lisp" "src/code/aprof.lisp" "src/code/shaketree.lisp") - ("autoclose-stream.impure.lisp" "tests/test-util.lisp" "tests/assertoid.lisp") ("avltree.pure.lisp" "tests/bbtree-test-util.lisp") ("bit-vector.impure.lisp" "contrib/sb-posix.fasl") ("brothertree.impure.lisp" From 4069c144f59dae6d96ac53c8980697eb6bda5455 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 24 May 2022 19:32:04 +0300 Subject: [PATCH 3390/4023] Add tests for find, position type derivation. --- tests/seq.pure.lisp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index d288ca623f..d2d4018df5 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -654,3 +654,41 @@ unsigned-byte) (check (reduce '+ x :key #'length :initial-value -1) integer))) + +(with-test (:name :find-type-derive) + (macrolet + ((check (fun expected) + `(assert + (equal (second + (third + (sb-kernel:%simple-fun-type + (checked-compile '(lambda (x y) + (declare (ignorable x y)) + ,fun))))) + ',expected)))) + (check (find x y) t) + (check (find 1 y) (or (integer 1 1) null)) + (check (find x y :key #'car) list) + (check (find x y :test #'=) (or number null)) + (check (find x y :key #'car :test #'=) list) + (check (find x (the vector y) :key #'car) list) + ;; (check (find-if #'evenp y) (or integer null)) + (check (find-if #'evenp (the list y) :key #'car) list) + (check (find x (the simple-base-string y)) (or base-char null)))) + +(with-test (:name :position-type-derive) + (macrolet + ((check (fun expected) + `(assert + (ctype= (second + (third + (sb-kernel:%simple-fun-type + (checked-compile '(lambda (x y) + (declare (ignorable x y)) + ,fun))))) + ',expected)))) + (check (position x y) (or (integer 0 (#.(1- array-dimension-limit))) null)) + (check (position x (the (simple-string 10) y)) (or (mod 10) null)) + (check (position x y :end 10) (or (mod 10) null)) + (check (position x (the cons y) :start 5 :end 10) (or (integer 5 9) null)) + (check (position-if x y :end 10) (or (mod 10) null)))) From 0dd7ed7875d1fd444b39071ea4dbb3777db154b5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 24 May 2022 20:13:53 +0300 Subject: [PATCH 3391/4023] Fix a test for -sb-unicode. --- tests/seq.pure.lisp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index d2d4018df5..95e9fe1f9e 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -672,9 +672,12 @@ (check (find x y :test #'=) (or number null)) (check (find x y :key #'car :test #'=) list) (check (find x (the vector y) :key #'car) list) - ;; (check (find-if #'evenp y) (or integer null)) + #-sbcl + (check (find-if #'evenp y) (or integer null)) (check (find-if #'evenp (the list y) :key #'car) list) - (check (find x (the simple-base-string y)) (or base-char null)))) + (check (find x (the (simple-array character (*)) y)) (or character null)) + #-sbcl + (check (find x (the simple-string y)) (or character null)))) (with-test (:name :position-type-derive) (macrolet From 967edab83312773a96afd32990a67d1354b44015 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 24 May 2022 13:49:18 -0700 Subject: [PATCH 3392/4023] Don't do FDEFN elision for DEFKNOWN of non-internal symbols. Users shouldn't know or rely on this behavior, (they shouldn't be using DEFKNOWN at all, really), but if they did, without this change, redefinition would break without a NOTINLINE, and more perspicuously, deferred tll evaluation during fasloading doesn't work, as DEFKNOWN tells the compiler that the function definition will in fact always have been defined. So disable this for non-internal functions. I think in general, FDEFN elision is probably only warranted in very few situations, if at all. DEFKNOWN really tells the compiler: This is what the compiler is allowed to assume about calls to functions, not that the definition of the function can never change or that the definition of the function will even always be defined. --- src/compiler/ir2tran.lisp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index f3b6430bff..e01985bea5 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -130,10 +130,13 @@ ;; will eventually be defined. If that's untrue, e.g. if we referred ;; to #'DESCRIBE during cold-load, we'd just fix it locally by declaring ;; DESCRIBE notinline. - ;; But in the target, more caution is warranted because users might - ;; DEFKNOWN a function but fail to define it. And they shouldn't be - ;; expected to understand the failure mode and the remedy. - (cond ((and #-sb-xc-host (find-fdefn name) + ;; But don't do this for non-internal packages, because users + ;; might DEFKNOWN a function but fail to define it, or they + ;; might try to redefine it and get the old definition. And + ;; they shouldn't be expected to understand the failure mode + ;; and the remedy. + (cond ((and (internal-name-p name) + #-sb-xc-host (find-fdefn name) (info :function :info name) (let ((*lexenv* (node-lexenv node))) (not (fun-lexically-notinline-p name)))) From 5c27a431430a3087b084c57c7f5bed39b170a4c8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 25 May 2022 07:17:25 +0300 Subject: [PATCH 3393/4023] Don't DX otherwise inaccessible LET vars. I.e. don't DX the X list in (let* ((x (list 1)) (y (list (list x)))) (declare (dynamic-extent y))) Code in the wild is not ready for this standard behavior (and probably will never be). --- src/compiler/envanal.lisp | 3 ++- src/compiler/ir1util.lisp | 4 ++++ src/compiler/locall.lisp | 13 +++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/compiler/envanal.lisp b/src/compiler/envanal.lisp index d2859179ab..c5f474cbcf 100644 --- a/src/compiler/envanal.lisp +++ b/src/compiler/envanal.lisp @@ -400,7 +400,8 @@ (setf (cleanup-nlx-info cleanup) (list lvar))) (push lvar (component-dx-lvars component))))))))) (dolist (entry (lambda-entries lambda)) - (let ((cleanup (entry-cleanup entry))) + (let* ((cleanup (entry-cleanup entry)) + (*dx-lexenv* (node-lexenv (cleanup-mess-up cleanup)))) (when (eq (cleanup-kind cleanup) :dynamic-extent) (let ((real-dx-lvars '())) (dolist (what (cleanup-nlx-info cleanup)) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 645c24dd0b..ef309c217e 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -914,6 +914,8 @@ (every #'trivial-lambda-var-ref-p (lambda-var-refs (lvar-lambda-var lvar)))))))) +(defvar *dx-lexenv*) + (defun trivial-lambda-var-ref-p (use) (and (ref-p use) (let ((var (ref-leaf use))) @@ -925,6 +927,8 @@ ;; bound by a non-XEP lambda, no other REFS that aren't ;; DX-SAFE, or are result-args when the result is discarded. (when (and (neq :external (lambda-kind home)) + (or (lambda-system-lambda-p home) + (lexenv-contains-lambda home *dx-lexenv*)) (dolist (ref refs t) (unless (or (eq use ref) (ref-good-for-dx-p ref)) diff --git a/src/compiler/locall.lisp b/src/compiler/locall.lisp index 210b7cf84f..6a5c78cb41 100644 --- a/src/compiler/locall.lisp +++ b/src/compiler/locall.lisp @@ -67,12 +67,13 @@ ;; The block may end up being deleted due to cast optimization ;; caused by USE-GOOD-FOR-DX-P (unless (node-to-be-deleted-p call) - (let ((dx-lvars - (loop for arg in (basic-combination-args call) - for var in (lambda-vars fun) - for dx = (leaf-dynamic-extent var) - when (and dx arg (not (lvar-dynamic-extent arg))) - append (handle-nested-dynamic-extent-lvars dx arg)))) + (let* ((*dx-lexenv* (node-lexenv call)) + (dx-lvars + (loop for arg in (basic-combination-args call) + for var in (lambda-vars fun) + for dx = (leaf-dynamic-extent var) + when (and dx arg (not (lvar-dynamic-extent arg))) + append (handle-nested-dynamic-extent-lvars dx arg)))) (when dx-lvars (let* ((entry (with-ir1-environment-from-node call (make-entry))) From e4e94c91e4b2e81c05ace49204a95408f25e855c Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 24 May 2022 21:45:14 -0700 Subject: [PATCH 3394/4023] Don't use XREF's INTERNAL-NAME-P. For some reason the internal-name-p in xref has feature conditionals. --- src/compiler/ir2tran.lisp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index e01985bea5..b51d9de8ff 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -135,7 +135,16 @@ ;; might try to redefine it and get the old definition. And ;; they shouldn't be expected to understand the failure mode ;; and the remedy. - (cond ((and (internal-name-p name) + (cond ((and (labels ((internal-name-p (what) + (typecase what + (list + (every #'internal-name-p what)) + (symbol + (let ((pkg (sb-xc:symbol-package what))) + (or (and pkg (system-package-p pkg)) + (eq pkg *cl-package*)))) + (t t)))) + (internal-name-p name)) #-sb-xc-host (find-fdefn name) (info :function :info name) (let ((*lexenv* (node-lexenv node))) From b1072cb2310f1cedd7cf730a55ad4613f29da53a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 26 May 2022 00:32:55 +0300 Subject: [PATCH 3395/4023] Fix CMOV conversion when there's a BRANCH. Normally BRANCH-IF is followed by a fall-through, but when jumping to loops there may be a BRANCH. Delete it as well as the BRANCH-IF. --- src/compiler/ir2opt.lisp | 4 ++++ tests/compiler-2.pure.lisp | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index bd33e6212c..8751dc678a 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -152,6 +152,10 @@ vop node 2block &aux (prev (vop-prev vop))) (delete-vop vop) + (let ((last (ir2-block-last-vop 2block))) + (when (and last + (eq (vop-name last) 'branch)) + (delete-vop last))) (cond ((and (constant-tn-p arg-if) (constant-tn-p arg-else) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index aa063075a8..b4fd1634f1 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3667,3 +3667,15 @@ nil)) ((-1) nil) (((- (expt 2 300))) t))) + +(with-test (:name :cmov-branch) + (checked-compile-and-assert + () + `(lambda (x y) + (assert + (let ((res nil)) + (when x (setf res (not res))) + (when y (setf res (not res))) + (not res)))) + ((1 2) nil) + ((nil nil) nil))) From 686e5ac4138aeeb378fa9db437ad74866b893009 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 25 May 2022 19:23:53 -0400 Subject: [PATCH 3396/4023] Fix defstruct regression And a virtually identical bug in MUTABLE-LAYOUT-P as exposed by the new AVER that prevents misuse of WRAPPER-BITMAP. --- src/code/class.lisp | 4 +++- src/code/defstruct.lisp | 2 +- src/code/early-classoid.lisp | 33 ++++++++++++++++++++++++++++----- src/code/load.lisp | 1 + src/code/target-defstruct.lisp | 1 + tests/fwdref-layout.impure.lisp | 26 ++++++++++++++++++++++++++ 6 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 tests/fwdref-layout.impure.lisp diff --git a/src/code/class.lisp b/src/code/class.lisp index d115e1b42c..46dc954d75 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -218,7 +218,9 @@ old-context old-length context length) t)) - (let ((old-bitmap (wrapper-bitmap old-layout))) + ;; The "%" accessor reads the bitmap from the layout, + ;; not from its related defstruct-description. + (let ((old-bitmap (%layout-bitmap old-layout))) (unless (= old-bitmap bitmap) (warn "change in placement of raw slots of class ~S ~ between the ~A definition and the ~A definition" diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 82c7bd8480..63acafa8b4 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -1524,7 +1524,7 @@ or they must be declared locally notinline at each call site.~@:>" (declare (type wrapper old-layout new-layout)) (if (wrapper-info old-layout) (let ((old-bitmap (wrapper-bitmap old-layout)) - (new-bitmap (wrapper-bitmap new-layout))) + (new-bitmap (%layout-bitmap new-layout))) ;; The number of extra ID words has to match, as does the number of bitmap ;; words, or else GC will croak when parsing the bitmap. (and (= (calculate-extra-id-words (wrapper-depthoid old-layout)) diff --git a/src/code/early-classoid.lisp b/src/code/early-classoid.lisp index 1bcc4b6b67..5a52e42408 100644 --- a/src/code/early-classoid.lisp +++ b/src/code/early-classoid.lisp @@ -327,7 +327,9 @@ ;; that has this bitmap we can use the layout of T. ((eq wrapper (find-layout t)) 0) (t - +layout-all-tagged+)))) + +layout-all-tagged+))) + (defun %layout-bitmap (layout) (wrapper-bitmap layout)) +) ; end PROGN #+sb-xc-host (defun equalp-err (a b) (bug "EQUALP ~S ~S" a b)) @@ -400,8 +402,27 @@ #+64-bit (defun wrapper-depthoid (wrapper) (layout-depthoid (wrapper-friend wrapper))) +;;; Extract the bitmap from 1 or more words of bits that have the same format +;;; as a BIGNUM - least-significant word first, native bit order within each word, +;;; all but the last are unsigned, and the last is signed. +(defun %layout-bitmap (wrapper) + (declare (type wrapper wrapper)) + (do ((accumulator 0) + (shift 0) + (index (bitmap-start wrapper) (1+ index)) + (last (1- (%instance-length wrapper)))) + ((> index last) accumulator) + (setf accumulator (logior accumulator + (ash (if (= index last) + (%raw-instance-ref/signed-word wrapper index) + (%raw-instance-ref/word wrapper index)) + shift))) + (incf shift sb-vm:n-word-bits))) + (defun wrapper-bitmap (wrapper) (declare (type wrapper wrapper)) + ;; Whenever we call WRAPPER-BITMAP on a structure-object subtype, + ;; it's supposed to have the INFO slot populated, linking it to a defstruct-description. (acond ((wrapper-info wrapper) (dd-bitmap it)) ;; Instances lacking DD-INFO are CLOS objects, which can't generally have ;; raw slots, except that funcallable-instances may have 2 raw slots - @@ -409,14 +430,16 @@ ;; on the platform, and the layout is tagged but a special case. ;; In any event, the bitmap is always 1 word, and there are no "extra ID" ;; words preceding it. - (t (the fixnum - (%raw-instance-ref/signed-word (wrapper-friend wrapper) - (type-dd-length sb-vm:layout)))))) + (t + (aver (not (logtest +structure-layout-flag+ (wrapper-flags wrapper)))) + (the fixnum + (%raw-instance-ref/signed-word (wrapper-friend wrapper) + (type-dd-length sb-vm:layout)))))) #+64-bit (defmacro wrapper-length (wrapper) ; SETFable `(ldb (byte 16 16) (layout-flags (wrapper-friend ,wrapper)))) -) ; end PROGN +) ; end PROGN #-sb-xc-host ;;; True of STANDARD-OBJECT, which include generic functions. (declaim (inline layout-for-pcl-obj-p)) diff --git a/src/code/load.lisp b/src/code/load.lisp index ef9079d8be..458bff4d0e 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -759,6 +759,7 @@ (n-data-words (- size sb-vm:instance-data-start))) (with-fop-stack ((stack (operand-stack)) ptr n-data-words) (declare (type index ptr)) + ;; FIXME: this is basically DO-LAYOUT-BITMAP, but probably not as efficient. (let ((bitmap (wrapper-bitmap layout))) ;; Values on the stack are in the same order as in the structure itself. (do ((i sb-vm:instance-data-start (1+ i))) diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index 0b0176961d..13f0af751c 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -79,6 +79,7 @@ (dotimes (i bitmap-words) (%raw-instance-set/word layout (+ bitmap-base i) (ldb (byte sb-vm:n-word-bits (* i sb-vm:n-word-bits)) bitmap)))) + (aver (= (%layout-bitmap layout) bitmap)) ; verify it reads back the same ;; It's not terribly important that we recycle layout IDs, but I have some other ;; changes planned that warrant a finalizer per layout. ;; FIXME: structure IDs should never be recycled because code blobs referencing diff --git a/tests/fwdref-layout.impure.lisp b/tests/fwdref-layout.impure.lisp new file mode 100644 index 0000000000..856dcdeacc --- /dev/null +++ b/tests/fwdref-layout.impure.lisp @@ -0,0 +1,26 @@ + +;;; Regression test for bug cited in +;;; https://groups.google.com/g/sbcl-devel/c/4XTJ9hEUngM/m/B5-iQxdTAAAJ +;;; where referencing a layout and then defining the structure +;;; could fail if there are raw slots. +(with-test (:name :no-spurious-redef-warning) + (with-scratch-file (srcname "lisp") + (with-scratch-file (fasl "fasl") + (with-open-file (src srcname :direction :output) + (let ((defstruct + `(defstruct (big (:predicate nil)) + (first t) + ,@(loop for i below sb-vm:n-word-bits + collect `(,(sb-int:symbolicate "RAW" (write-to-string i)) + 0 :type cl:double-float)) + ,@(loop for i below 5 + collect `(,(sb-int:symbolicate "MORE" (write-to-string i)) nil))))) + (print '(in-package "STRUCT") src) + (print `(eval-when (:compile-toplevel) ,defstruct) src) ; for compiling a type-check + (print `(defun bigp (x) (typep x 'big)) src) + (print defstruct src))) + (make-package "STRUCT" :use '("CL")) + (compile-file srcname :output-file fasl) + (delete-package "STRUCT") + (make-package "STRUCT" :use '("CL")) + (load fasl)))) From 8fd06a6699b0e3114c5040a7cd97b872ddbae085 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Thu, 26 May 2022 00:02:11 -0700 Subject: [PATCH 3397/4023] Fix DELETE-PACKAGE interaction with optimistic symbol loading. Instead of NILing out the symbol packages of symbols inside deleted packages while fasloading, install a cookie that gets upgraded into a real package if the package gets redefined again. Since DELETE-PACKAGE causes SYMBOL-PACKAGE of the package's symbols to be an implementation-defined value, it's OK to install something non-NIL. If the cookie doesn't get upgraded to a real package by the end of the load, it will get GC'd when the rehoming package graph goes out of scope. --- src/code/load.lisp | 2 +- src/code/package.lisp | 4 +- src/code/target-package.lisp | 66 +++++++++++++++++++++++++-------- src/cold/exports.lisp | 2 +- tests/block-compile.impure.lisp | 19 ++++++++++ 5 files changed, 74 insertions(+), 19 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 458bff4d0e..56148c7f97 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -716,7 +716,7 @@ (error "attempt to load an empty FASL file:~% ~S" (namestring stream))) (maybe-announce-load stream verbose) (let ((fasl-input (make-fasl-input stream print))) - (with-deferred-package-names + (with-loader-package-names (unwind-protect (loop while (load-fasl-group fasl-input)) ;; Nuke the table and stack to avoid keeping garbage on diff --git a/src/code/package.lisp b/src/code/package.lisp index ed9354f25d..2df550c1d2 100644 --- a/src/code/package.lisp +++ b/src/code/package.lisp @@ -121,11 +121,11 @@ (defmacro package-lock (package) `(logbitp 0 (package-%bits ,package))) -(defmacro with-deferred-package-names (&body body) +(defmacro with-loader-package-names (&body body) #+sb-xc-host `(progn ,@body) #-sb-xc-host - `(call-with-deferred-package-names (lambda () ,@body))) + `(call-with-loader-package-names (lambda () ,@body))) ;;;; IN-PACKAGE (proclaim '(special *package*)) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 75da8304d3..cfebd683b6 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -1021,6 +1021,7 @@ implementation it is ~S." *!default-package-use-list*) (nicks (stringify-string-designators nicknames)) (package (or (resolve-deferred-package name) + (resolve-rehoming-package name) (%make-package (make-package-hashtable internal-symbols) (make-package-hashtable external-symbols)))) clobber) @@ -1184,12 +1185,14 @@ implementation it is ~S." *!default-package-use-list*) (dolist (used (package-use-list package)) (unuse-package used package)) (setf (package-%local-nicknames package) nil) - (flet ((nullify-home (symbols) - (dovector (x (package-hashtable-cells symbols)) - (when (and (symbolp x) (eq (symbol-package x) package)) - (%set-symbol-package x nil))))) - (nullify-home (package-internal-symbols package)) - (nullify-home (package-external-symbols package))) + (let ((rehoming-package (make-rehoming-package package))) + (flet ((nullify-home (symbols) + (dovector (x (package-hashtable-cells symbols)) + (when (and (symbolp x) + (eq (symbol-package x) package)) + (%set-symbol-package x rehoming-package))))) + (nullify-home (package-internal-symbols package)) + (nullify-home (package-external-symbols package)))) (with-package-names (table) (awhen (package-id package) (setf (aref *id->package* it) nil (package-id package) nil)) @@ -2120,8 +2123,8 @@ PACKAGE." ;; cookie. i.e. a cached NIL is correct until the next cache invalidation. (or (null pkg) (and (packagep pkg) (package-%name pkg))))) - -;;;; deferred package handling + +;;;; special package hacks for the loader (defvar *deferred-package-names*) @@ -2150,8 +2153,8 @@ PACKAGE." (setf (package-%name package) name) package))))) -;;; Return the deferred package object for NAME if it exists, -;;; otherwise return NIL. +;;; Return the deferred package object for NAME if it exists, otherwise +;;; return NIL. (defun resolve-deferred-package (name) (and (boundp '*deferred-package-names*) *deferred-package-names* @@ -2161,13 +2164,46 @@ PACKAGE." (setf (info-gethash name *deferred-package-names*) :deleted)) package))) -;;; Bind the deferred package name table and test to see if the -;;; deferred package table still has any unresolved entries after -;;; FUNCTION is called. -(defun call-with-deferred-package-names (function) +(defvar *rehoming-package-names*) + +;;; When we are in the loader, DELETE-PACKAGE installs a rehoming +;;; package in the SYMBOL-PACKAGE of its internal symbols. This has +;;; the effect that when a package of the same name is newly redefined +;;; later in the compiled file, the package gets updated and those +;;; internal symbols get rehomed properly. +(defun make-rehoming-package (package) + (and (boundp '*rehoming-package-names*) + (let ((name (package-%name package))) + (unless *rehoming-package-names* ; bind on demand + (setq *rehoming-package-names* + (make-info-hashtable :comparator #'pkg-name= + :hash-function #'sxhash))) + (aver (not (%get-package name *rehoming-package-names*))) + (let ((package (%make-package (package-internal-symbols package) + (package-external-symbols package)))) + (%register-package *rehoming-package-names* name package) + (setf (package-%name package) name) + package)))) + +;;; Return the rehoming object for NAME if it exists, otherwise return +;;; NIL. +(defun resolve-rehoming-package (name) + (and (boundp '*rehoming-package-names*) + *rehoming-package-names* + (let ((package (%get-package name *rehoming-package-names*))) + (when package + ;; To simulate remhash. + (setf (info-gethash name *rehoming-package-names*) :deleted)) + package))) + +;;; Bind the deferred and rehoming package name tables and test to see +;;; if the deferred package table still has any unresolved entries +;;; after FUNCTION is called. +(defun call-with-loader-package-names (function) (let* ((boundp (boundp '*deferred-package-names*)) ;; bind on demand - (*deferred-package-names* (if boundp *deferred-package-names* nil))) + (*deferred-package-names* (if boundp *deferred-package-names* nil)) + (*rehoming-package-names* (if boundp *rehoming-package-names* nil))) (funcall function) (when (and (not boundp) *deferred-package-names*) (info-maphash diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index c5f91bd2bd..495683d45d 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1209,7 +1209,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") (:use "CL" "SB-ALIEN" "SB-ASSEM" "SB-BIGNUM" "SB-C" "SB-EXT" "SB-INT" "SB-KERNEL" "SB-SYS") (:import-from "SB-VM" "+FIXUP-KINDS+") - (:import-from "SB-IMPL" "FIND-OR-MAYBE-MAKE-DEFERRED-PACKAGE" "WITH-DEFERRED-PACKAGE-NAMES") + (:import-from "SB-IMPL" "FIND-OR-MAYBE-MAKE-DEFERRED-PACKAGE" "WITH-LOADER-PACKAGE-NAMES") (:export "*ASSEMBLER-ROUTINES*" "GET-ASM-ROUTINE" "+BACKEND-FASL-FILE-IMPLEMENTATION+" diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index 624085fc6f..5dca3a77b8 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -63,6 +63,25 @@ (assert (not (eq (fdefinition (find-symbol "+" "BLOCK-DEFPACKAGE2")) #'cl:+)))) +(defpackage block-defpackage3 + (:use :cl)) + +(with-test (:name :block-defpackage-delete-package-redefpackage) + (ctu:file-compile + `((when (find-package '#:block-defpackage3) + (delete-package '#:block-defpackage3)) + (defpackage block-defpackage3 + (:use :cl)) + (in-package block-defpackage3) + ;; This can barf if, for example, F loses its package because + ;; DELETE-PACKAGE and never gets it back when the package gets + ;; defined again. + (export '(block-defpackage3::f))) + :block-compile t + :load t) + (assert (eq (nth-value 1 (find-symbol "F" "BLOCK-DEFPACKAGE3")) + :external))) + (with-test (:name :block-defconstant-then-load-fasl) (ctu:file-compile ;; test a non-EQL-comparable constant. From 3954d97a5adf320ea3c1539cbbef768c9f5e5fbc Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 26 May 2022 13:23:28 -0400 Subject: [PATCH 3398/4023] Fix another defstruct problem I think this problem is new as of this month but I'm less sure about it than with the spurious redef warning. If the compiler knew about a structure type, as it must have in order to dump a literal of the type, then it must have processed a %DEFSTRUCT, but possibly not caused the effect of that defstruct to happen at load-time by the time that FOP-STRUCT is invoked. --- src/code/load.lisp | 2 +- tests/fwdref-layout.impure.lisp | 35 ++++++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 56148c7f97..c781258349 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -760,7 +760,7 @@ (with-fop-stack ((stack (operand-stack)) ptr n-data-words) (declare (type index ptr)) ;; FIXME: this is basically DO-LAYOUT-BITMAP, but probably not as efficient. - (let ((bitmap (wrapper-bitmap layout))) + (let ((bitmap (sb-kernel::%layout-bitmap layout))) ;; Values on the stack are in the same order as in the structure itself. (do ((i sb-vm:instance-data-start (1+ i))) ((>= i size)) diff --git a/tests/fwdref-layout.impure.lisp b/tests/fwdref-layout.impure.lisp index 856dcdeacc..2c14147825 100644 --- a/tests/fwdref-layout.impure.lisp +++ b/tests/fwdref-layout.impure.lisp @@ -1,8 +1,32 @@ -;;; Regression test for bug cited in +;;; Regression tests for bugs cited in ;;; https://groups.google.com/g/sbcl-devel/c/4XTJ9hEUngM/m/B5-iQxdTAAAJ -;;; where referencing a layout and then defining the structure -;;; could fail if there are raw slots. + +;;; 1. loading an externalized literal prior to seeing a %DEFSTRUCT +;;; and %TARGET-DEFSTRUCT for the type. +;; Presence of raw slots is irrelevant. +(with-test (:name :literal-before-defstruct) + (with-scratch-file (srcname "lisp") + (with-scratch-file (fasl "fasl") + (with-open-file (src srcname :direction :output) + (print '(in-package "STRUCT") src) + (print '(eval-when (:compile-toplevel :load-toplevel) + (defstruct charstruc (c #\a :type character))) + src) + (print '(eval-when (:compile-toplevel) + (defmethod make-load-form ((x charstruc) &optional e) + (make-load-form-saving-slots x :environment e))) + src) + ;; Write as a string because #S() won't work until CHARSTRUC is compiled + (write-string "(defparameter *s* #s(charstruc :c #\\z))" src)) + (make-package "STRUCT" :use '("CL")) + (compile-file srcname :output-file fasl :verbose nil) + (delete-package "STRUCT") + (make-package "STRUCT" :use '("CL")) + (load fasl)))) + +;;; 2. referencing a layout and then defining the structure +;;; could fail if there are raw slots. (with-test (:name :no-spurious-redef-warning) (with-scratch-file (srcname "lisp") (with-scratch-file (fasl "fasl") @@ -19,8 +43,9 @@ (print `(eval-when (:compile-toplevel) ,defstruct) src) ; for compiling a type-check (print `(defun bigp (x) (typep x 'big)) src) (print defstruct src))) - (make-package "STRUCT" :use '("CL")) - (compile-file srcname :output-file fasl) + ;; Reusing the same package as from test #1 + ;; (make-package "STRUCT" :use '("CL")) + (compile-file srcname :output-file fasl :verbose nil) (delete-package "STRUCT") (make-package "STRUCT" :use '("CL")) (load fasl)))) From a9433507bc24b278816d18ea30e9fe433796a8b7 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 27 May 2022 16:44:16 +0300 Subject: [PATCH 3399/4023] Add a test for string= type derivation. --- tests/string.pure.lisp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/string.pure.lisp b/tests/string.pure.lisp index a411c76dd1..f32a33cc0e 100644 --- a/tests/string.pure.lisp +++ b/tests/string.pure.lisp @@ -286,3 +286,21 @@ claim that any particular result from these edge cases constitutes a bug. (string/= "_" (the simple-string x))) (("_") nil) (("a") 0))) + +(with-test (:name :string=-derive-type) + (macrolet + ((check (fun expected) + `(assert + (equal (second + (third + (sb-kernel:%simple-fun-type + (checked-compile '(lambda (x y) + (declare (ignorable x y)) + ,fun))))) + ',expected)))) + (check (string= (the (simple-string 1) x) + (the (simple-string 2) y)) null) + (check (string= (the (simple-base-string 1) x) + (the (simple-base-string 2) y)) null) + (check (string= (the (simple-array character (1)) x) + (the (simple-array character (2)) y)) null))) From 25c8e92ebc99e8fdea67f5398238bac0460a959f Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sat, 28 May 2022 10:58:49 -0700 Subject: [PATCH 3400/4023] Set SB-C::TOP-LEVEL-LAMBDA-MAX = 0 for now. To work around incorrect interactions between RENAME-PACKAGE and fasloading in time for the release. Background is in this thread: https://sourceforge.net/p/sbcl/mailman/message/37659523/ --- NEWS | 2 -- make-target-2.sh | 4 ++++ tests/block-compile.impure.lisp | 39 +++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 4b1000ffbb..a5c06b4bfc 100644 --- a/NEWS +++ b/NEWS @@ -11,8 +11,6 @@ changes relative to sbcl-2.2.4: * platform support: ** single-stepping is now supported on 64-bit PowerPC platforms. (thanks to Thomas Fitzsimmons) - * optimization: fasl files are now usually smaller (up to 10% on default - policy) and may load faster, especially on high debug. * optimization: improved type derivation of REDUCE with some known reducing functions. * enhancement: debug source locations now work correctly for top level forms diff --git a/make-target-2.sh b/make-target-2.sh index b37d85d0ed..d5e833dae0 100755 --- a/make-target-2.sh +++ b/make-target-2.sh @@ -67,6 +67,10 @@ echo //doing warm init - load and dump phase (setf sb-c::*merge-pathnames* t) ;;; and for storing pathname namestrings in fasls too. (setq sb-c::*name-context-file-path-selector* 'truename) +;;; FIXME: Workaround for possible incorrect RENAME-PACKAGE behavior +;;; with top-level-lambda merging. Remove this when the tests +;;; :block-defpackage-rename-package etc works. +(setq sb-c::top-level-lambda-max 0) (let ((sb-ext:*invoke-debugger-hook* (prog1 sb-ext:*invoke-debugger-hook* (sb-ext:enable-debugger)))) (sb-ext:save-lisp-and-die "output/sbcl.core")) EOF diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index 5dca3a77b8..d76205a5e9 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -82,6 +82,45 @@ (assert (eq (nth-value 1 (find-symbol "F" "BLOCK-DEFPACKAGE3")) :external))) +;;; Similar to the above test case, but with RENAME-PACKAGE. +(with-test (:name :block-defpackage-rename-package-redefpackage + :fails-on :sbcl) + (ctu:file-compile + `((eval-when (:compile-toplevel :load-toplevel :execute) + (when (find-package "BLOCK-DEFPACKAGE4") + (rename-package "BLOCK-DEFPACKAGE4" "OLD-BLOCK-DEFPACKAGE4"))) + (defpackage "BLOCK-DEFPACKAGE4" + (:use :cl)) + (in-package "BLOCK-DEFPACKAGE4") + (eval-when (:compile-toplevel :load-toplevel :execute) + (export '(f)))) + :block-compile t + :load t) + (assert (eq (nth-value 1 (find-symbol "F" "BLOCK-DEFPACKAGE4")) + :external))) + +;;; Doesn't work yet. +(with-test (:name :block-defpackage-rename-package + :fails-on :sbcl) + (ctu:file-compile + `((eval-when (:compile-toplevel :load-toplevel :execute) + (cond + ((find-package "BLOCK-DEFPACKAGE-FOO") + (rename-package "BLOCK-DEFPACKAGE-FOO" + "BLOCK-DEFPACKAGE-BAR")) + ((not (find-package "BLOCK-DEFPACKAGE-BAR")) + (make-package "BLOCK-DEFPACKAGE-BAR" :use '("CL"))))) + + (in-package "BLOCK-DEFPACKAGE-BAR") + + (defun stable-union (bar) bar)) + :block-compile t + :before-load (lambda () + (delete-package "BLOCK-DEFPACKAGE-BAR") + (defpackage block-defpackage-foo (:use :cl))) + :load t) + (assert (find-symbol "STABLE-UNION" "BLOCK-DEFPACKAGE-BAR"))) + (with-test (:name :block-defconstant-then-load-fasl) (ctu:file-compile ;; test a non-EQL-comparable constant. From b6919c0aabda4894eb401cce08a48520dc208dc5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 28 May 2022 16:14:51 -0400 Subject: [PATCH 3401/4023] Fix some bugs in fullcgc - A bignum must be ignored if embedded in raw bytes of *ASSEMBLER-ROUTINES* - Visit all the static roots hiding in C variables --- src/code/room.lisp | 2 ++ src/runtime/fullcgc.c | 6 ++++++ tests/debug.pure.lisp | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/code/room.lisp b/src/code/room.lisp index 23a196bfc9..793f2b0465 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -416,6 +416,8 @@ We could try a few things to mitigate this: (when (and (logbitp (logand (slot (deref page-table start-page) 'gen) 7) generation-mask) (= (logand flags page-type-mask) page-type-constraint)) + ;; FIXME: should exclude (0 . 0) conses on PAGE_TYPE_{BOXED,UNBOXED} + ;; resulting from zeroing the tail of a bignum or vector etc. (map-objects-in-range fun (%make-lisp-obj (sap-int start)) (%make-lisp-obj (sap-int end)) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 626944ad82..3ddf0a5790 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -52,6 +52,8 @@ #define BIGNUM_MARK_BIT MARK_BIT #endif +extern lispobj lisp_init_function, gc_object_watcher; + static inline uword_t boxedobj_widetag_to_markbit(int widetag) { return (widetag == FDEFN_WIDETAG || widetag == WEAK_POINTER_WIDETAG) ? FDEFN_MARK_BIT : MARK_BIT; @@ -212,6 +214,7 @@ void __mark_obj(lispobj pointer) lispobj header = *base; int widetag = header_widetag(header); if (widetag == BIGNUM_WIDETAG) { + if (points_to_asm_code_p(pointer)) return; *base |= BIGNUM_MARK_BIT; return; // don't enqueue - no pointers } else { @@ -450,6 +453,9 @@ void execute_full_mark_phase() } #endif gc_mark_obj(lisp_package_vector); + gc_mark_obj(lisp_init_function); + gc_mark_obj(gc_object_watcher); + gc_mark_obj(alloc_profile_data); do { lispobj ptr = gc_dequeue(); gc_dcheck(ptr != 0); diff --git a/tests/debug.pure.lisp b/tests/debug.pure.lisp index 4de4867e42..1f8db58cb3 100644 --- a/tests/debug.pure.lisp +++ b/tests/debug.pure.lisp @@ -45,7 +45,9 @@ (sb-alien:slot (sb-alien:deref sb-vm::page-table index) 'sb-vm::flags)))) ;; mask off the SINGLE_OBJECT and OPEN_REGION bits - (when (eq (logand type 7) 2) ; PAGE_TYPE_BOXED + (when (and (eq (logand type 7) 2) ; PAGE_TYPE_BOXED + ;; Cons cells on boxed pags are page filler + (not (listp obj))) (push (cons obj size) list)))) :dynamic) (dolist (cell list) From 53a5d06215a07cef7df54a7a93445d1f6d067f53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Borges=20de=20Oliveira?= <lbo@siscog.pt> Date: Sun, 29 May 2022 10:17:41 +0100 Subject: [PATCH 3402/4023] Document that DEBUG=3 inhibits local function inlining --- NEWS | 1 + doc/manual/debugger.texinfo | 3 +++ src/code/ntrace.lisp | 2 ++ 3 files changed, 6 insertions(+) diff --git a/NEWS b/NEWS index a5c06b4bfc..a4a1b46f46 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,7 @@ changes relative to sbcl-2.2.4: (lp#1393302) * minor incompatible change: RENAME-FILE now overwrites the target file on Windows too, making its behaviour consistent with other platforms. + * minor change: inlining of local function is inhibited if policy DEBUG = 3. * platform support: ** single-stepping is now supported on 64-bit PowerPC platforms. (thanks to Thomas Fitzsimmons) diff --git a/doc/manual/debugger.texinfo b/doc/manual/debugger.texinfo index 76b315ba01..42ed6af63f 100644 --- a/doc/manual/debugger.texinfo +++ b/doc/manual/debugger.texinfo @@ -825,6 +825,9 @@ that all variable values are available at any known location within the scope of the binding. This has a speed penalty in addition to the obvious space penalty. +Inlining of local functions is inhibited so that they may be +@code{trace}d. + @item > (max speed space) If @code{debug} is greater than both @code{speed} and @code{space}, the command @command{return} can be used to continue execution by diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index b28708f262..691d1e9957 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -584,6 +584,8 @@ The NAMEs are not evaluated. Each may be one of the following: * (LABELS FNAME :IN OUTER-NAME) or (FLET FNAME :IN OUTER-NAME) denoting a local function where OUTER-NAME may be any of the previous names for functions, macros, methods or compiler macros. + Tracing local functions may require DEBUG policy 3 to inhibit + inlining. * STRING denoting all functions fbound to symbols whose home package is the package with the given name. From c572acdb76541d355fc339ea6a80c524308b3445 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 30 May 2022 01:09:40 +0300 Subject: [PATCH 3403/4023] defconstant: ignore equivalent SAPs. SAPs behave like numbers or characters and can be copied at any time, yet EQL doesn't work on them. Making EQL work on SAPs is fairly complicated and there are many implicit assumptions about what can be compared with EQ or EQL. And it's unclear how significant a deviation from the standard that would be. And nobody will notice that the constant will not be EQ to its previous value, as it already can be copied at any time. Reported by Bart Botta. --- src/code/macros.lisp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index a4ddb94577..f3d8f24274 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -232,7 +232,15 @@ tree structure resulting from the evaluation of EXPRESSION." ;; Non-continuable error. (about-to-modify-symbol-value name 'defconstant) (let ((old (symbol-value name))) - (unless (eql value old) + (unless (or (eql value old) + ;; SAPs behave like numbers but yet EQL doesn't work on them, + ;; special case it. + ;; Nobody will notices that the constant + ;; is not EQ, since it can be copied at + ;; any time anyway. + (and (system-area-pointer-p old) + (system-area-pointer-p value) + (sap= old value))) (multiple-value-bind (ignore aborted) (with-simple-restart (abort "Keep the old value.") (cerror "Go ahead and change the value." From 3b18e5c939c170a3f618d82930249d7ef56d668b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 30 May 2022 01:57:37 +0300 Subject: [PATCH 3404/4023] A bootstrap problem. --- src/code/macros.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index f3d8f24274..83c64ee057 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -238,6 +238,7 @@ tree structure resulting from the evaluation of EXPRESSION." ;; Nobody will notices that the constant ;; is not EQ, since it can be copied at ;; any time anyway. + #-sb-xc-host (and (system-area-pointer-p old) (system-area-pointer-p value) (sap= old value))) From b74acc27b222529f59dbcea390454e36ebf3c716 Mon Sep 17 00:00:00 2001 From: Thomas Fitzsimmons <fitzsim@fitzsim.org> Date: Fri, 20 May 2022 21:03:24 -0400 Subject: [PATCH 3405/4023] Enable sb-linkable-runtime on ppc and ppc64 --- NEWS | 5 ++++- src/cold/shared.lisp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index a4a1b46f46..cd4ea8787d 100644 --- a/NEWS +++ b/NEWS @@ -8,10 +8,13 @@ changes relative to sbcl-2.2.4: (lp#1393302) * minor incompatible change: RENAME-FILE now overwrites the target file on Windows too, making its behaviour consistent with other platforms. - * minor change: inlining of local function is inhibited if policy DEBUG = 3. + * minor incompatible change: inlining of local function is inhibited if + policy DEBUG = 3. * platform support: ** single-stepping is now supported on 64-bit PowerPC platforms. (thanks to Thomas Fitzsimmons) + ** the :SB-LINKABLE-RUNTIME feature is now supported on 32-bit and 64-bit + PowerPC platforms. (thanks to Thomas Fitzsimmons) * optimization: improved type derivation of REDUCE with some known reducing functions. * enhancement: debug source locations now work correctly for top level forms diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 855fe0af1a..b8ce82702c 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -344,7 +344,7 @@ ("(not (or elf mach-o win32))" "No execute object file format feature defined") ("(and cons-profiling (not sb-thread))" ":CONS-PROFILING requires :SB-THREAD") - ("(and sb-linkable-runtime (not (or arm arm64 x86 x86-64)))" + ("(and sb-linkable-runtime (not (or arm arm64 x86 x86-64 ppc ppc64)))" ":SB-LINKABLE-RUNTIME not supported on selected architecture") ("(and sb-linkable-runtime (not (or darwin freebsd linux win32)))" ":SB-LINKABLE-RUNTIME not supported on selected operating system") From 7b1e569ec8352b0cc72b25ec1ab169b3494c1301 Mon Sep 17 00:00:00 2001 From: Robert Smith <rssmith@hrl.com> Date: Sun, 29 May 2022 12:59:15 -0700 Subject: [PATCH 3406/4023] define SB-MPFR:CEILING --- contrib/sb-mpfr/mpfr.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/sb-mpfr/mpfr.lisp b/contrib/sb-mpfr/mpfr.lisp index 5ab5430b6c..893734254c 100644 --- a/contrib/sb-mpfr/mpfr.lisp +++ b/contrib/sb-mpfr/mpfr.lisp @@ -1730,7 +1730,7 @@ ,@defines)))) (define-onearg-no-rnd-mpfr-funs - ((ceil mpfr_ceil) + ((ceiling mpfr_ceil) (floor mpfr_floor) (round mpfr_round) (truncate mpfr_trunc))) From d72c9e2ebc08a15397bf9ee2aeba7ede5d01a55f Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 30 May 2022 14:27:16 +0100 Subject: [PATCH 3407/4023] 2.2.5: will be tagged as "sbcl-2.2.5" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index cd4ea8787d..65423f3b29 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.2.4: +changes in sbcl-2.2.5 relative to sbcl-2.2.4: * minor incompatible change: SB-EXT:*DERIVE-FUNCTION-TYPES* being NIL now means that function calls will strictly only use type information from proclaimed ftypes. The previous behavior (still the default) of using From 5548796ea3a822aa68b4912e89f90e15e60612ae Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 31 May 2022 17:06:15 +0300 Subject: [PATCH 3408/4023] Derive (find x string) as (or character null). With better use of array-type-upgraded-element-type. --- src/compiler/array-tran.lisp | 11 ++++-- src/compiler/seqtran.lisp | 66 ++++++++++++++---------------------- src/compiler/srctran.lisp | 26 ++++++-------- tests/seq.pure.lisp | 3 +- 4 files changed, 45 insertions(+), 61 deletions(-) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index d80aeb544d..7e53a9bc50 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -113,6 +113,13 @@ ;; 2002-08-21 (values *wild-type* nil)))) +(defun type-array-element-type (type) + (if (csubtypep type (specifier-type 'array)) + (multiple-value-bind (upgraded other) + (array-type-upgraded-element-type type) + (or other upgraded)) + *wild-type*)) + (defun declared-array-element-type (type) (if (array-type-p type) (array-type-element-type type) @@ -140,9 +147,7 @@ ;;;; DERIVE-TYPE optimizers (defun derive-aref-type (array) - (multiple-value-bind (uaet other) - (array-type-upgraded-element-type (lvar-type array)) - (or other uaet))) + (type-array-element-type (lvar-type array))) (deftransform array-in-bounds-p ((array &rest subscripts)) (block nil diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 5586e967a9..05acde54e0 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1208,32 +1208,26 @@ (defoptimizer (replace ir2-hook) ((seq1 seq2 &key &allow-other-keys) node block) (declare (ignore block)) (flet ((element-type (lvar) - (let ((type (lvar-type lvar))) - (when (csubtypep type (specifier-type 'array)) - (multiple-value-bind (upgraded other) - (array-type-upgraded-element-type type) - (or other upgraded)))))) + (type-array-element-type (lvar-type lvar)))) (let ((type1 (element-type seq1)) (type2 (element-type seq2))) - (when (and type1 - (neq type1 *wild-type*)) - (if type2 - (unless (or (eq type2 *wild-type*) - (types-equal-or-intersect type1 type2)) - (let ((*compiler-error-context* node)) - (compiler-warn "Incompatible array element types: ~a and ~a" - (type-specifier type1) - (type-specifier type2)))) - (when (constant-lvar-p seq2) - (map nil (lambda (x) - (unless (ctypep x type1) - (let ((*compiler-error-context* node)) - (compiler-warn "The source sequence has an element ~s incompatible with the target array element type ~a." - x - (type-specifier type1))) - (return-from replace-ir2-hook-optimizer)) - x) - (lvar-value seq2)))))))) + (cond ((eq type1 *wild-type*)) + ((eq type2 *wild-type*) + (when (constant-lvar-p seq2) + (map nil (lambda (x) + (unless (ctypep x type1) + (let ((*compiler-error-context* node)) + (compiler-warn "The source sequence has an element ~s incompatible with the target array element type ~a." + x + (type-specifier type1))) + (return-from replace-ir2-hook-optimizer)) + x) + (lvar-value seq2)))) + ((not (types-equal-or-intersect type1 type2)) + (let ((*compiler-error-context* node)) + (compiler-warn "Incompatible array element types: ~a and ~a" + (type-specifier type1) + (type-specifier type2)))))))) (defoptimizer (%make-array ir2-hook) ((dimensions widetag n-bits &key initial-contents &allow-other-keys) node block) @@ -1244,12 +1238,7 @@ :key #'sb-vm:saetp-typecode)) (element-type (sb-vm:saetp-ctype saetp)) (initial-contents-type (lvar-type initial-contents)) - (initial-contents-element-type - (if (csubtypep initial-contents-type (specifier-type 'array)) - (multiple-value-bind (upgraded other) - (array-type-upgraded-element-type initial-contents-type) - (or other upgraded)) - *wild-type*))) + (initial-contents-element-type (type-array-element-type initial-contents-type))) (cond ((not (or (eq initial-contents-element-type *wild-type*) (types-equal-or-intersect element-type initial-contents-element-type))) (let ((*compiler-error-context* node)) @@ -1270,11 +1259,8 @@ (defun check-sequence-item (item seq node format-string) (let ((seq-type (lvar-type seq)) (item-type (lvar-type item))) - (when (and (neq item-type *wild-type*) - (csubtypep seq-type (specifier-type 'array))) - (let ((element-type (multiple-value-bind (upgraded other) - (array-type-upgraded-element-type seq-type) - (or other upgraded)))) + (when (neq item-type *wild-type*) + (let ((element-type (type-array-element-type seq-type))) (unless (or (eq element-type *wild-type*) (types-equal-or-intersect item-type element-type)) (let ((*compiler-error-context* node)) @@ -1816,12 +1802,10 @@ (if key-identity-p (fun-accepts-type test (if item 1 0)) ;; the -if variants. (fun-accepts-type key 0))) - (when (csubtypep (lvar-type sequence) (specifier-type 'array)) - (let ((upgraded-type - (array-type-upgraded-element-type (lvar-type sequence)))) - (unless (eq upgraded-type *wild-type*) - (setf type - (type-intersection type upgraded-type))))) + (let ((upgraded-type (type-array-element-type (lvar-type sequence)))) + (unless (eq upgraded-type *wild-type*) + (setf type + (type-intersection type upgraded-type)))) (unless (eq type *empty-type*) (type-union type (specifier-type 'null))))) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 4d437e0209..5d73fa5b41 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -3678,21 +3678,17 @@ ;; and not adjustable, because #() and "" are equal. (or (array-type-non-empty-p x-type) (array-type-non-empty-p y-type)) - (flet ((upgraded-et (type) - (multiple-value-bind (specialized supetype) - (array-type-upgraded-element-type type) - (or supetype specialized)))) - (let ((number-ctype (specifier-type 'number)) - (x-et (upgraded-et x-type)) - (y-et (upgraded-et y-type))) - (and (neq x-et *wild-type*) - (neq y-et *wild-type*) - (cond ((types-equal-or-intersect x-et y-et) - nil) - ((csubtypep x-et number-ctype) - (not (types-equal-or-intersect y-et number-ctype))) - ((types-equal-or-intersect y-et number-ctype) - (not (types-equal-or-intersect x-et number-ctype)))))))) + (let ((number-ctype (specifier-type 'number)) + (x-et (type-array-element-type x-type)) + (y-et (type-array-element-type y-type))) + (and (neq x-et *wild-type*) + (neq y-et *wild-type*) + (cond ((types-equal-or-intersect x-et y-et) + nil) + ((csubtypep x-et number-ctype) + (not (types-equal-or-intersect y-et number-ctype))) + ((types-equal-or-intersect y-et number-ctype) + (not (types-equal-or-intersect x-et number-ctype))))))) nil) ((types-equal-or-intersect x-type y-type) (if (and (types-equal-or-intersect x-type combination-type) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index 95e9fe1f9e..3b995c47eb 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -676,8 +676,7 @@ (check (find-if #'evenp y) (or integer null)) (check (find-if #'evenp (the list y) :key #'car) list) (check (find x (the (simple-array character (*)) y)) (or character null)) - #-sbcl - (check (find x (the simple-string y)) (or character null)))) + (check (find x (the string y)) (or character null)))) (with-test (:name :position-type-derive) (macrolet From 2145157c723815947235632b1adeb7ece931bf6f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 31 May 2022 17:08:59 +0300 Subject: [PATCH 3409/4023] Add type derivers for FIND-IF/NOT. --- src/compiler/seqtran.lisp | 6 ++++++ tests/seq.pure.lisp | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 05acde54e0..3f9e33ca0e 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1814,6 +1814,12 @@ start end from-end)) (find-derive-type item sequence key test start end from-end)) +(defoptimizer (find-if derive-type) ((predicate sequence &key key start end from-end)) + (find-derive-type nil sequence key predicate start end from-end)) + +(defoptimizer (find-if-not derive-type) ((predicate sequence &key key start end from-end)) + (find-derive-type nil sequence key predicate start end from-end)) + (defoptimizer (position derive-type) ((item sequence &key start end key test test-not diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index 3b995c47eb..66c29079fb 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -672,7 +672,6 @@ (check (find x y :test #'=) (or number null)) (check (find x y :key #'car :test #'=) list) (check (find x (the vector y) :key #'car) list) - #-sbcl (check (find-if #'evenp y) (or integer null)) (check (find-if #'evenp (the list y) :key #'car) list) (check (find x (the (simple-array character (*)) y)) (or character null)) From 6c9ed5aeea32d979fded0b22349abc45c819dd07 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 31 May 2022 17:10:35 +0300 Subject: [PATCH 3410/4023] jump-over-move-coercion: treat constant->descriptor as compatible. --- src/compiler/represent.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/represent.lisp b/src/compiler/represent.lisp index c8e2066f94..82df287c81 100644 --- a/src/compiler/represent.lisp +++ b/src/compiler/represent.lisp @@ -694,7 +694,9 @@ (eq (car (vop-codegen-info last)) (ir2-block-%label dest-block)) (setf branch last))))) (let ((dest (tn-ref-tn (vop-results dest-vop)))) - (when (and (eq (tn-sc x) (tn-sc dest)) + (when (and (or (eq (tn-sc x) (tn-sc dest)) + (and (eq (sc-number (tn-sc x)) sb-vm:constant-sc-number) + (eq (sc-number (tn-sc dest)) sb-vm:descriptor-reg-sc-number))) (eq (find-move-vop x nil (tn-sc dest) (tn-primitive-type dest) #'sc-move-vops) (vop-info vop))) (let ((new-block (split-ir2-block dest-vop)) From ee329f162bcdc27114026b7a6f1aba4805904884 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 31 May 2022 11:25:51 -0400 Subject: [PATCH 3411/4023] x86-64: Permit boxed constant refs from assembly routines Specifically, fix GENERIC-NEGATE not to point at an embedded bignum. That was a bad idea because: - valid_lisp_pointer_p() returned false for it - a weak hash-table entry would not see it as a live object --- src/assembly/x86-64/arith.lisp | 19 ++++++------------ src/assembly/x86-64/support.lisp | 4 ++-- src/compiler/codegen.lisp | 32 +++++++++++++++---------------- src/compiler/generic/genesis.lisp | 26 +++++++++++++++---------- src/runtime/fullcgc.c | 1 - src/runtime/immobile-space.c | 3 --- 6 files changed, 39 insertions(+), 46 deletions(-) diff --git a/src/assembly/x86-64/arith.lisp b/src/assembly/x86-64/arith.lisp index 7875346fac..38c7e56956 100644 --- a/src/assembly/x86-64/arith.lisp +++ b/src/assembly/x86-64/arith.lisp @@ -155,19 +155,12 @@ (inst jmp :nz GENERIC) (move res x) (inst neg res) ; (- most-negative-fixnum) is BIGNUM - (inst jmp :no FIXNUM) - ;; "inline constants" are quite wonky in terms of how we express the desired - ;; alignment and how we compute a pointer to the value - ;; (each backend being different in the implementation thereof is no help). - ;; The easiest thing to do is make this bignum an :OWORD and OR in a lowtag. - ;; Unfortunately this constant is not a valid argument to MAKE-LISP-OBJ. - ;; I don't think asm routines are allowed to reference boxed constants - ;; in dynamic space, are they? We could put it in static space maybe. - (let ((bignum (register-inline-constant - :oword (logior (ash (- most-negative-fixnum) 64) - (bignum-header-for-length 1))))) - (inst lea res (rip-relative-ea (ea-disp bignum) other-pointer-lowtag))) - FIXNUM + ;; This constant isn't really a fixup, but it's easiest for me to think about it + ;; that way for now. It should reall do whatever EMIT-EA does for a CONSTANT. + (inst cmov :o res (ea (make-fixup nil :code-object + (+ (ash code-constants-offset word-shift) + (- other-pointer-lowtag))) + rip-tn)) (inst clc) (inst ret) GENERIC (tail-call-static-fun '%negate 1)) diff --git a/src/assembly/x86-64/support.lisp b/src/assembly/x86-64/support.lisp index 6633cc9df0..e54e2a76db 100644 --- a/src/assembly/x86-64/support.lisp +++ b/src/assembly/x86-64/support.lisp @@ -93,7 +93,7 @@ ;; KLUDGE: index of FPR-SAVE is 4 ;; (inst call (ea (make-fixup 'fpr-save :assembly-routine*))) (inst call (ea (make-fixup nil :code-object - (+ (ash code-constants-offset word-shift) + (+ (component-header-length) (* 4 sb-vm:n-word-bytes) (- other-pointer-lowtag))) rip-tn)) @@ -103,7 +103,7 @@ ;; KLUDGE: index of FPR-RESTORE is 6 ;; (inst call (ea (make-fixup 'fpr-restore :assembly-routine*))) (inst call (ea (make-fixup nil :code-object - (+ (ash code-constants-offset word-shift) + (+ (component-header-length) (* 6 sb-vm:n-word-bytes) (- other-pointer-lowtag))) rip-tn)) diff --git a/src/compiler/codegen.lisp b/src/compiler/codegen.lisp index f3b8ba4e86..7fcf1536d1 100644 --- a/src/compiler/codegen.lisp +++ b/src/compiler/codegen.lisp @@ -16,24 +16,22 @@ ;;;; utilities used during code generation +;;; KLUDGE: the assembler can not emit backpatches comprising jump tables without +;;; knowing the boxed code header length. But there is no compiler IR2 metaobject, +;;; for SB-FASL:*ASSEMBLER-ROUTINES*. We have to return a fixed answer for that. +(defun asm-routines-boxed-header-nwords () + (align-up (+ sb-vm:code-constants-offset + #+x86-64 1) ; KLUDGE: make room for 1 boxed constant + 2)) ;;; the number of bytes used by the code object header - -(macrolet ((header-length-in-bytes (comp) - `(let* ((2comp (component-info ,comp)) - (constants (ir2-component-constants 2comp))) - (ash (align-up (length constants) code-boxed-words-align) - sb-vm:word-shift)))) - #-sb-xc-host - (defun component-header-length (&optional (component *component-being-compiled*)) - (header-length-in-bytes component)) - ;; KLUDGE: the assembler can not emit backpatches comprising jump tables without - ;; knowing the boxed code header length. But there is no compiler IR2 metaobject, - ;; for SB-FASL:*ASSEMBLER-ROUTINES*. We have to return a fixed answer for that. - #+sb-xc-host - (defun component-header-length () - (if (boundp '*component-being-compiled*) - (header-length-in-bytes *component-being-compiled*) - (* sb-vm:n-word-bytes (align-up sb-vm:code-constants-offset 2))))) +(defun component-header-length () + (cond #+sb-xc-host ((not (boundp '*component-being-compiled*)) + (* sb-vm:n-word-bytes (asm-routines-boxed-header-nwords))) + (t + (let* ((2comp (component-info *component-being-compiled*)) + (constants (ir2-component-constants 2comp))) + (ash (align-up (length constants) code-boxed-words-align) + sb-vm:word-shift))))) (defun component-n-jump-table-entries (&optional (component *component-being-compiled*)) (ir2-component-n-jump-table-entries (component-info component))) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index e1b618fcc6..7721e616e0 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -877,15 +877,15 @@ core and return a descriptor to it." (+ start index) (logand remainder sb-ext:most-positive-word)))) -(defun bignum-to-core (n) +(defun bignum-to-core (n &optional (space *dynamic*)) "Copy a bignum to the cold core." (let* ((words (ceiling (1+ (integer-length n)) sb-vm:n-word-bits)) (handle - #-bignum-assertions (allocate-otherptr *dynamic* (1+ words) sb-vm:bignum-widetag) + #-bignum-assertions (allocate-otherptr space (1+ words) sb-vm:bignum-widetag) #+bignum-assertions (let* ((aligned-words (1+ (logior words 1))) ; round to odd, slap on a header (physical-words (* aligned-words 2)) - (handle (allocate-otherptr *dynamic* physical-words sb-vm:bignum-widetag))) + (handle (allocate-otherptr space physical-words sb-vm:bignum-widetag))) ;; rewrite the header to indicate the logical size (write-wordindexed/raw handle 0 (logior (ash words 8) sb-vm:bignum-widetag)) handle))) @@ -2788,10 +2788,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (n-routines (read-word-arg (fasl-input-stream))) (n-fixups (read-word-arg (fasl-input-stream))) (rounded-length (round-up length (* 2 sb-vm:n-word-bytes))) - (header-n-words - ;; Note: we round the number of constants up to ensure that - ;; the code vector will be properly aligned. - (round-up sb-vm:code-constants-offset 2)) + (header-n-words (sb-c::asm-routines-boxed-header-nwords)) (space (or #+(and immobile-code (not metaspace)) *immobile-varyobj* ;; If there is a read-only space, use it, else use static space. (if (> sb-vm:read-only-space-end sb-vm:read-only-space-start) @@ -2800,7 +2797,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (asm-code (allocate-cold-descriptor space - (+ (ash header-n-words sb-vm:word-shift) length) + (+ (ash header-n-words sb-vm:word-shift) rounded-length) sb-vm:other-pointer-lowtag))) (setf *cold-assembler-obj* asm-code) (write-code-header-words asm-code header-n-words rounded-length 0) @@ -2810,6 +2807,12 @@ Legal values for OFFSET are -4, -8, -12, ..." (fasl-input-stream) :start start :end (+ start length))) + ;; Write a bignum reference into the boxed constants. + ;; All the backends should do this, as its avoids consing in GENERIC-NEGATE + ;; when the argument is MOST-NEGATIVE-FIXNUM. + #+x86-64 (write-wordindexed asm-code sb-vm:code-constants-offset + (bignum-to-core (- most-negative-fixnum) + #-immobile-space *static*)) ;; Update the name -> address table. (let (table) (dotimes (i n-routines) @@ -3886,8 +3889,11 @@ III. initially undefined function references (alphabetically): ;; Load all assembler code (flet ((assembler-file-p (name) (tailwise-equal (namestring name) ".assem-obj"))) - (dolist (file-name (remove-if-not #'assembler-file-p object-file-names)) - (cold-load file-name verbose)) + (let ((files (remove-if-not #'assembler-file-p object-file-names))) + ;; There should be exactly 1 assembler file, and 1 code object in it. + (when files ; But it's present only in 2nd genesis. + (assert (singleton-p files)) + (cold-load (car files) verbose))) (setf object-file-names (remove-if #'assembler-file-p object-file-names))) (mapc 'funcall *deferred-undefined-tramp-refs*) (makunbound '*deferred-undefined-tramp-refs*) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 3ddf0a5790..d6497f90df 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -214,7 +214,6 @@ void __mark_obj(lispobj pointer) lispobj header = *base; int widetag = header_widetag(header); if (widetag == BIGNUM_WIDETAG) { - if (points_to_asm_code_p(pointer)) return; *base |= BIGNUM_MARK_BIT; return; // don't enqueue - no pointers } else { diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index c81a5a5438..95e24f56a6 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -384,9 +384,6 @@ enliven_immobile_obj(lispobj *ptr, int rescan) // a native pointer { gc_assert(widetag_of(ptr) != SIMPLE_FUN_WIDETAG); // can't enliven interior pointer gc_assert(immobile_obj_gen_bits(ptr) == from_space); - // KLUDGE: disregard embedded objects in SB-FASL:*ASSEMBLER-ROUTINES* - if (points_to_asm_code_p((uword_t)ptr) - && (uword_t)native_pointer((uword_t)ptr) != asm_routines_start) return; int pointerish = !leaf_obj_widetag_p(widetag_of(ptr)); int bits = (pointerish ? 0 : IMMOBILE_OBJ_VISITED_FLAG); // enlivening makes the object appear as if written, so that From 7a70dbadb1cc407606671ef344e576cce74cd2cb Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 31 May 2022 15:49:53 -0400 Subject: [PATCH 3412/4023] Run typep golden file test in more configurations Require #+immobile-space but not #+sb-devel --- tests/typep-golden-data.txt | 4 -- tests/x86-64-codegen.impure.lisp | 71 +++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/tests/typep-golden-data.txt b/tests/typep-golden-data.txt index b5b5729ad5..b1ba92f435 100644 --- a/tests/typep-golden-data.txt +++ b/tests/typep-golden-data.txt @@ -584,10 +584,8 @@ 14 (SIGNED-BYTE 64) 15 (SIGNED-BYTE 8) 16 (SIMD-PACK DOUBLE-FLOAT) - 16 (SIMD-PACK INTEGER) 16 (SIMD-PACK SINGLE-FLOAT) 16 (SIMD-PACK-256 DOUBLE-FLOAT) - 16 (SIMD-PACK-256 INTEGER) 16 (SIMD-PACK-256 SINGLE-FLOAT) 12 (SIMPLE-ARRAY (COMPLEX DOUBLE-FLOAT) (*)) 12 (SIMPLE-ARRAY (COMPLEX SINGLE-FLOAT) (*)) @@ -680,9 +678,7 @@ 13 RATIO 15 RATIONAL 17 REAL - 21 SB-C::EQ-COMPARABLE-TYPE 9 SB-C::POLICY-QUALITY - 12 SB-DEBUG::TRACE-REPORT-TYPE 24 SB-DISASSEM::ADDRESS 12 SB-IMPL::ABSENT-PATHNAME-COMPONENT 14 DEPRECATION-STATE diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index e8dc26ab46..9f4d0c2375 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -904,7 +904,24 @@ ;; and some range-based testing rather than just 2 EQ tests. (check-integerp-cmp-opcodes 2 '(integer 1 2))) -(defun typep-asm-code-length (type) +(defun show-pretty-lines (type lines) + (format t ";;;; Type: ~s~%" type) + (dolist (line lines) + (when (plusp (length line)) + (let* ((label + (if (char= (char line 0) #\L) + (subseq line 0 (1+ (position #\: line))) + "")) + (opcode-bytes + (progn + (setq line (string-left-trim " " (subseq line (length label)))) + (subseq line 0 (position #\Space line))))) + (setq line (string-left-trim " " (subseq line (length opcode-bytes)))) + (format t "; ~4a~20a~a~%" + label opcode-bytes line)))) + (terpri)) + +(defun typep-asm-code-length (type &optional print) (let* ((lines (disassembly-lines (compile nil @@ -915,6 +932,7 @@ (some (lambda (x) (or (search "#<FUNCTION" x) (search "#<FDEFN" x))) lines))) + (when print (show-pretty-lines type lines)) (values (length lines) callp))) ;;; Counting instructions of assembly is sort of a very rough guess @@ -940,7 +958,48 @@ (write-golden-typep-data "../interesting-types.lisp-expr" "typep-golden-data.txt") -(defun compare-to-golden-typep-data (pathname) +;;; FIXME: Some time after the MANY-INTERESTING-ARRAY-TYPES test +;;; got disabled, the code size changed either due to a regression, +;;; or more aggressive inlining of ">=" and "<=" +;;; which now causes these warnings. Figure out the new baseline. +;; +;; WARNING: (AND INTEGER (NOT (SIGNED-BYTE 31))) was 32 is 38 +;; WARNING: (AND INTEGER (NOT (SIGNED-BYTE 32))) was 32 is 38 +;; WARNING: (INTEGER (0) *) was 18 is 22 +;; WARNING: (INTEGER * -1) was 18 is 22 +;; WARNING: (INTEGER * -1000000) was 18 is 22 +;; WARNING: (INTEGER * -1073741825) was 18 is 23 +;; WARNING: (INTEGER * -12) was 18 is 22 +;; WARNING: (INTEGER * -14) was 18 is 22 +;; WARNING: (INTEGER * -17) was 18 is 22 +;; WARNING: (INTEGER * -2) was 18 is 22 +;; WARNING: (INTEGER * -2147483649) was 18 is 23 +;; WARNING: (INTEGER * -4611686018427387901) was 18 is 23 +;; WARNING: (INTEGER * -54043195528445951) was 18 is 23 +;; WARNING: (INTEGER * -541073411) was 18 is 22 +;; WARNING: (INTEGER * -6) was 18 is 22 +;; WARNING: (INTEGER * -9) was 18 is 22 +;; WARNING: (INTEGER * 0) was 24 is 22 +;; WARNING: (INTEGER * 20) was 18 is 22 +;; WARNING: (INTEGER * 2047) was 18 is 22 +;; WARNING: (INTEGER * 2147483647) was 18 is 23 +;; WARNING: (INTEGER * 4611686018427387900) was 18 is 23 +;; WARNING: (INTEGER * 576460752303423487) was 18 is 23 +;; WARNING: (INTEGER * 65535) was 18 is 22 +;; WARNING: (INTEGER -1) was 18 is 22 +;; WARNING: (INTEGER 1) was 18 is 22 +;; WARNING: (INTEGER 1073741824) was 18 is 23 +;; WARNING: (INTEGER 1152921504606846961) was 18 is 23 +;; WARNING: (INTEGER 1899) was 18 is 22 +;; WARNING: (INTEGER 2) was 18 is 22 +;; WARNING: (INTEGER 2147483648) was 18 is 23 +;; WARNING: (INTEGER 2305843009214) was 18 is 23 +;; WARNING: (INTEGER 4611686018427387900) was 18 is 23 +;; WARNING: (INTEGER 4611686018427387901) was 18 is 23 +;; WARNING: (INTEGER 4611686018427387902) was 18 is 23 +;; WARNING: (INTEGER 4611686018427387903) was 18 is 23 +;; WARNING: (INTEGER 63) was 18 is 22 +(defun compare-to-golden-typep-data (pathname &optional print) (with-open-file (input pathname) (let ((*package* (find-package "SB-KERNEL"))) (loop (let ((line (read-line input nil input))) @@ -948,13 +1007,15 @@ (with-input-from-string (stream line :start 2) (let ((expect-n (read stream)) (type (read stream))) - (multiple-value-bind (linecount callp) (typep-asm-code-length type) + (multiple-value-bind (linecount callp) + (typep-asm-code-length type print) (declare (ignore callp)) (when (/= linecount expect-n) (warn "~S was ~d is ~d" type expect-n linecount)))))))))) -(with-test (:name :many-interesting-array-types :skipped-on (or (:not :sb-unicode) - (not :sb-devel))) +(with-test (:name :many-interesting-array-types + :skipped-on (:or (:not :sb-unicode) + (:not :immobile-space))) (compare-to-golden-typep-data "typep-golden-data.txt")) (with-test (:name :integerp->bignump-strength-reduction) From dc61f667c85602d1ca6c14e5eb9a243ccf15cfa7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 31 May 2022 17:12:09 -0400 Subject: [PATCH 3413/4023] x86-64: improve (typep x '(cons (eql <sym>))) --- src/cold/exports.lisp | 1 + src/compiler/generic/vm-fndb.lisp | 2 + src/compiler/typetran.lisp | 100 ++++++++++++++++------------- src/compiler/x86-64/type-vops.lisp | 18 ++++++ tests/typep-golden-data.txt | 88 +++++++++++++------------ 5 files changed, 118 insertions(+), 91 deletions(-) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 495683d45d..027ba75866 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1994,6 +1994,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "BOGUS-ARG-TO-VALUES-LIST-ERROR" "BOOLE-CODE" "BOUNDING-INDICES-BAD-ERROR" "BYTE-SPECIFIER" "%BYTE-BLT" "FUNCTION-DESIGNATOR" + "CAR-EQ-IF-LISTP" "CASE-BODY-ERROR" "CHARACTER-SET" "CHARACTER-SET-TYPE" "CHARACTER-SET-TYPE-PAIRS" diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index cab59312f1..281f4748cc 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -74,6 +74,8 @@ non-null-symbol-p) (t) boolean (movable foldable flushable)) +(defknown car-eq-if-listp (t t) boolean (movable foldable flushable)) + (defknown #.(loop for (name) in *vector-without-complex-typecode-infos* collect name) (t) boolean (movable foldable flushable)) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 0fb07b2cb8..d4df26c26e 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -563,52 +563,60 @@ (intersection-type-types type)))) ;;; If necessary recurse to check the cons type. -(defun source-transform-cons-typep (object type) - (let* ((car-type (cons-type-car-type type)) - (cdr-type (cons-type-cdr-type type)) - (car-test-p (not (type= car-type *universal-type*))) - (cdr-test-p (not (type= cdr-type *universal-type*)))) - (if (and (not car-test-p) (not cdr-test-p)) - `(consp ,object) - ;; CONSP can be safely weakened to LISTP if either of the CAR - ;; or CDR test (or both) can distinguish LIST from CONS - ;; by never returning T when given an input of NIL. - (labels ((safely-weakened (ctype) - (typecase ctype - (member-type - (not (member nil (member-type-members ctype)))) - (classoid - ;; can't weaken if the specifier is (CONS SYMBOL) - (not (ctypep nil ctype))) - ;; these are disjoint from NIL - ((or cons-type numeric-type array-type character-set-type) - t) - (intersection-type - ;; at least one of them must not spuriously return T - (some #'safely-weakened (compound-type-types ctype))) - (union-type - ;; require that none spuriously return T - (every #'safely-weakened (compound-type-types ctype))) - (hairy-type - ;; hack - (CONS KEYWORD) is weakenable - ;; because NIL is not a keyword. - (equal (hairy-type-specifier ctype) - '(satisfies keywordp)))))) - (let ((car-test - (and car-test-p - `((typep (car ,object) ',(type-specifier car-type))))) - (cdr-test - (and cdr-test-p - `((typep (cdr ,object) ',(type-specifier cdr-type)))))) - ;; Being paranoid, perform the safely weakenable test first - ;; so that the other part doesn't execute on an object that - ;; it would not have gotten, were the CONSP test not weakened. - (cond ((and car-test-p (safely-weakened car-type)) - `(and (listp ,object) ,@car-test ,@cdr-test)) - ((and cdr-test-p (safely-weakened cdr-type)) - `(and (listp ,object) ,@cdr-test ,@car-test)) - (t - `(and (consp ,object) ,@car-test ,@cdr-test)))))))) +(defun source-transform-cons-typep + (object type &aux (car-type (cons-type-car-type type)) + (cdr-type (cons-type-cdr-type type)) + (car-test-p (not (type= car-type *universal-type*))) + (cdr-test-p (not (type= cdr-type *universal-type*)))) + ;; CONSP can be safely weakened to LISTP if either of the CAR + ;; or CDR test (or both) can distinguish LIST from CONS + ;; by never returning T when given an input of NIL. + (labels ((safely-weakened (ctype) + (typecase ctype + (member-type + (not (member nil (member-type-members ctype)))) + (classoid + ;; can't weaken if the specifier is (CONS SYMBOL) + (not (ctypep nil ctype))) + ;; these are disjoint from NIL + ((or cons-type numeric-type array-type character-set-type) + t) + (intersection-type + ;; at least one of them must not spuriously return T + (some #'safely-weakened (compound-type-types ctype))) + (union-type + ;; require that none spuriously return T + (every #'safely-weakened (compound-type-types ctype))) + (hairy-type + ;; hack - (CONS KEYWORD) is weakenable + ;; because NIL is not a keyword. + (equal (hairy-type-specifier ctype) + '(satisfies keywordp)))))) + (cond + ((and (not car-test-p) (not cdr-test-p)) + `(consp ,object)) + ((and (not cdr-test-p) + (member-type-p car-type) + (vop-existsp :translate car-eq-if-listp) + (type-singleton-p car-type) + (typep (first (member-type-members car-type)) '(and symbol (not null)))) + `(car-eq-if-listp ,object ',(first (member-type-members car-type)))) + (t + (let ((car-test + (and car-test-p + `((typep (car ,object) ',(type-specifier car-type))))) + (cdr-test + (and cdr-test-p + `((typep (cdr ,object) ',(type-specifier cdr-type)))))) + ;; Being paranoid, perform the safely weakenable test first + ;; so that the other part doesn't execute on an object that + ;; it would not have gotten, were the CONSP test not weakened. + (cond ((and car-test-p (safely-weakened car-type)) + `(and (listp ,object) ,@car-test ,@cdr-test)) + ((and cdr-test-p (safely-weakened cdr-type)) + `(and (listp ,object) ,@cdr-test ,@car-test)) + (t + `(and (consp ,object) ,@car-test ,@cdr-test)))))))) (defun source-transform-character-set-typep (object type) (let ((pairs (character-set-type-pairs type))) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index f840eab242..06338540be 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -499,6 +499,24 @@ (:translate non-null-symbol-p) (:generator 3 (test-other-ptr value args symbol-widetag temp out) out)) +;;; It would be far better if we could recognize the IR1 for +;;; (AND (CONSP X) (EQ (CAR X) 'FOO)) +;;; rather than treating (TYPEP X '(CONS (EQL FOO))) as a special case, +;;; but hey at least this provides the IR2 support for it. +(define-vop (car-eq-if-listp) + (:args (value :scs (descriptor-reg)) + (obj :scs (immediate any-reg descriptor-reg))) + (:temporary (:sc unsigned-reg) temp) + (:conditional :z) + (:policy :fast-safe) + (:translate car-eq-if-listp) + (:generator 3 + (inst lea temp (ea (- list-pointer-lowtag) value)) + (inst test :byte temp lowtag-mask) + (inst jmp :nz out) + (inst cmp :qword (ea temp) (encode-value-if-immediate obj)) + out)) + (eval-when (:compile-toplevel) (aver (= sb-impl::package-id-bits 16))) (define-vop (keywordp symbolp) (:translate keywordp) diff --git a/tests/typep-golden-data.txt b/tests/typep-golden-data.txt index b1ba92f435..c089d4ae80 100644 --- a/tests/typep-golden-data.txt +++ b/tests/typep-golden-data.txt @@ -31,84 +31,83 @@ 13 (COMPLEX SINGLE-FLOAT) 21 (CONS (MEMBER FUNCTION FUNCTION-DESIGNATOR SB-C::MODIFYING SB-C::INHIBIT-FLUSHING) T) 37 (CONS (AND SYMBOL (NOT NULL)) (OR NULL (CONS STRING NULL))) - 21 (CONS (CONS (MEMBER LAMBDA) T) NULL) + 20 (CONS (CONS (MEMBER LAMBDA) T) NULL) 38 (CONS (CONS (MEMBER QUOTE) (CONS SYMBOL NULL)) NULL) 21 (CONS (CONS * (MOD 65536)) NULL) 17 (CONS (EQL *) NULL) - 21 (CONS (EQL :ABSOLUTE) (CONS (EQL :HOME))) - 14 (CONS (EQL :AFTER-SC-SELECTION)) - 14 (CONS (EQL :BEGIN-FILE)) - 14 (CONS (EQL :CHARACTER-SET)) - 14 (CONS (EQL :CONDITIONAL)) - 14 (CONS (EQL :CONTEXT)) + 20 (CONS (EQL :ABSOLUTE) (CONS (EQL :HOME))) + 12 (CONS (EQL :AFTER-SC-SELECTION)) + 12 (CONS (EQL :BEGIN-FILE)) + 12 (CONS (EQL :CHARACTER-SET)) + 12 (CONS (EQL :CONDITIONAL)) + 12 (CONS (EQL :CONTEXT)) 29 (CONS (EQL :HOME) (CONS STRING NULL)) 23 (CONS (EQL :INITIAL-ELEMENT) (CONS T NULL)) - 14 (CONS (EQL :LOAD-TIME-VALUE)) - 14 (CONS (EQL :LOAD-TIME-VALUE-FIXUP)) - 14 (CONS (EQL :STRUCT-READ)) + 12 (CONS (EQL :LOAD-TIME-VALUE)) + 12 (CONS (EQL :LOAD-TIME-VALUE-FIXUP)) + 12 (CONS (EQL :STRUCT-READ)) 23 (CONS (EQL :TEST) (CONS T NULL)) 64 (CONS (EQL BYTE) (AND (NOT (CONS INTEGER (CONS INTEGER))) (CONS T (CONS T NULL)))) 23 (CONS (EQL CLASS) (CONS T NULL)) 23 (CONS (EQL EQL) (CONS T NULL)) - 14 (CONS (EQL EQL)) + 12 (CONS (EQL EQL)) 45 (CONS (EQL FIND-CLASS) (CONS (CONS (EQL QUOTE) (CONS SYMBOL NULL)) NULL)) - 28 (CONS (EQL FUNCTION) (CONS (CONS (EQL LAMBDA)) NULL)) + 27 (CONS (EQL FUNCTION) (CONS (CONS (EQL LAMBDA)) NULL)) 23 (CONS (EQL FUNCTION) (CONS * NULL)) 31 (CONS (EQL FUNCTION) (CONS SYMBOL NULL)) 23 (CONS (EQL FUNCTION) (CONS T NULL)) - 14 (CONS (EQL FUNCTION)) + 12 (CONS (EQL FUNCTION)) 24 (CONS (EQL LAMBDA) (CONS LIST)) - 14 (CONS (EQL LAMBDA)) - 14 (CONS (EQL LIST)) + 12 (CONS (EQL LAMBDA)) + 12 (CONS (EQL LIST)) 20 (CONS (EQL LIST*) CONS) 18 (CONS (EQL LIST*) LIST) - 14 (CONS (EQL LOAD-TIME-VALUE)) + 12 (CONS (EQL LOAD-TIME-VALUE)) 23 (CONS (EQL MULTIPLE-VALUE-LIST) (CONS T NULL)) 16 (CONS (EQL NIL)) - 14 (CONS (EQL NOT)) - 14 (CONS (EQL OR)) + 12 (CONS (EQL NOT)) + 12 (CONS (EQL OR)) 23 (CONS (EQL QUOTE) (CONS T NULL)) - 14 (CONS (EQL QUOTE)) + 12 (CONS (EQL QUOTE)) 23 (CONS (EQL SATISFIES) (CONS T NULL)) - 14 (CONS (EQL SATISFIES)) - 14 (CONS (EQL SB-APROF::EA)) - 14 (CONS (EQL SB-C::COVERAGE-MAP)) + 12 (CONS (EQL SATISFIES)) + 12 (CONS (EQL SB-C::COVERAGE-MAP)) 23 (CONS (EQL SB-C::LAMBDA-LIST) (CONS T NULL)) - 14 (CONS (EQL SB-C::LOCAL-OPTIMIZE)) - 14 (CONS (EQL SB-C::SOURCE-FORM)) - 14 (CONS (EQL SB-C::VOP-OPTIMIZE)) - 14 (CONS (EQL SB-C:LAMBDA-WITH-LEXENV)) - 14 (CONS (EQL EXPLICIT-CHECK)) + 12 (CONS (EQL SB-C::LOCAL-OPTIMIZE)) + 12 (CONS (EQL SB-C::SOURCE-FORM)) + 12 (CONS (EQL SB-C::VOP-OPTIMIZE)) + 12 (CONS (EQL SB-C:LAMBDA-WITH-LEXENV)) + 12 (CONS (EQL EXPLICIT-CHECK)) 23 (CONS (EQL QUASIQUOTE) (CONS T NULL)) - 14 (CONS (EQL SB-PCL::.PV.)) + 12 (CONS (EQL SB-PCL::.PV.)) 23 (CONS (EQL SB-PCL::CLASS-EQ) (CONS T NULL)) - 14 (CONS (EQL SB-PCL::FAST-METHOD)) + 12 (CONS (EQL SB-PCL::FAST-METHOD)) 23 (CONS (EQL SB-PCL::PROTOTYPE) (CONS T NULL)) - 14 (CONS (EQL SB-PCL::SLOT-ACCESSOR)) - 14 (CONS (EQL MACRO)) + 12 (CONS (EQL SB-PCL::SLOT-ACCESSOR)) + 12 (CONS (EQL MACRO)) 31 (CONS (EQL SETF) (CONS SYMBOL NULL)) 20 (CONS (EQL SETF) CONS) - 14 (CONS (EQL SETF)) + 12 (CONS (EQL SETF)) 35 (CONS (EQL SETQ) (CONS SYMBOL (CONS T NULL))) - 14 (CONS (EQL TERPRI)) + 12 (CONS (EQL TERPRI)) 27 (CONS (EQL THE) (CONS T (CONS T NULL))) 28 (CONS (EQL VALUES) (CONS T (CONS (EQL &OPTIONAL) NULL))) - 14 (CONS (EQL VALUES)) + 12 (CONS (EQL VALUES)) 17 (CONS (MEMBER &OPTIONAL) NULL) 22 (CONS (MEMBER :CHARACTER-SET) STRING) - 14 (CONS (MEMBER :HOME) T) - 14 (CONS (MEMBER :MULTIPLE) T) + 12 (CONS (MEMBER :HOME) T) + 12 (CONS (MEMBER :MULTIPLE) T) 17 (CONS (MEMBER AND INTERSECTION)) 26 (CONS (MEMBER AND OR) (CONS T NULL)) 34 (CONS (MEMBER FUNCTION QUOTE) (CONS SYMBOL NULL)) 26 (CONS (MEMBER FUNCTION QUOTE) (CONS T NULL)) 26 (CONS (MEMBER FUNCTION SB-C::GLOBAL-FUNCTION) (CONS T NULL)) ! 35 (CONS (MEMBER FUNCTION) (CONS (SATISFIES LEGAL-FUN-NAME-P) NULL)) - 14 (CONS (MEMBER FUNCTION) T) + 12 (CONS (MEMBER FUNCTION) T) 19 (CONS (MEMBER LAMBDA NAMED-LAMBDA SB-C:LAMBDA-WITH-LEXENV)) 19 (CONS (MEMBER LAMBDA NAMED-LAMBDA SB-IMPL::LAMBDA-WITH-LEXENV)) 17 (CONS (MEMBER LAMBDA NAMED-LAMBDA) T) - 14 (CONS (MEMBER LAMBDA) T) + 12 (CONS (MEMBER LAMBDA) T) 17 (CONS (MEMBER LIST VECTOR)) 17 (CONS (MEMBER OR UNION)) 31 (CONS (MEMBER QUOTE) (CONS SYMBOL NULL)) @@ -322,7 +321,6 @@ 9 (MEMBER OR) 9 (MEMBER QUOTE) 9 (MEMBER SATISFIES) - 9 (MEMBER SB-APROF::EA) 9 (MEMBER SB-C::COVERAGE-MAP) 9 (MEMBER SB-C::LAMBDA-LIST) 9 (MEMBER SB-C::LOCAL-OPTIMIZE) @@ -380,15 +378,15 @@ 15 (NOT VECTOR) 31 (OR (CONS (MEMBER FUNCTION FUNCTION-DESIGNATOR SB-C::MODIFYING SB-C::INHIBIT-FLUSHING)) (MEMBER TYPE-SPECIFIER SB-C::PROPER-SEQUENCE SB-C::PROPER-LIST SB-C::PROPER-OR-DOTTED-LIST SB-C::PROPER-OR-CIRCULAR-LIST)) 21 (OR (ALIEN SB-UNIX:UNIX-OFFSET) (MEMBER NIL :START :END)) - 21 (OR (CONS (EQL DECLARE)) STRING) -! 67 (OR (CONS (EQL FUNCTION) (CONS (SATISFIES LEGAL-FUN-NAME-P) NULL)) (CONS (EQL QUOTE) (CONS SYMBOL NULL)) (CONS (EQL LAMBDA))) - 14 (OR (CONS (MEMBER DECLARE) T)) + 20 (OR (CONS (EQL DECLARE)) STRING) +! 66 (OR (CONS (EQL FUNCTION) (CONS (SATISFIES LEGAL-FUN-NAME-P) NULL)) (CONS (EQL QUOTE) (CONS SYMBOL NULL)) (CONS (EQL LAMBDA))) + 12 (OR (CONS (MEMBER DECLARE) T)) 31 (OR (CONS (MEMBER FUNCTION) (CONS SYMBOL NULL))) 22 (OR (CONS (MEMBER LAMBDA NAMED-LAMBDA)) INTERPRETED-FUNCTION) 57 (OR (CONS (NOT INTEGER) (CONS T NULL)) (CONS INTEGER (CONS (NOT INTEGER) NULL))) 12 (OR (EQL :ALWAYS-THREAD-LOCAL) FIXNUM) - 17 (OR (EQL :HOME) (CONS (EQL :HOME))) - 17 (OR (EQL :MULTIPLE) (CONS (EQL :MULTIPLE))) + 15 (OR (EQL :HOME) (CONS (EQL :HOME))) + 15 (OR (EQL :MULTIPLE) (CONS (EQL :MULTIPLE))) 16 (OR (EQL :WILD) SB-IMPL::PATTERN) 12 (OR (INTEGER -4611686018427387904 4611686018427387903) CHARACTER) 18 (OR (INTEGER 1 15) SB-X86-64-ASM::REG) @@ -457,7 +455,7 @@ 23 (OR FIXNUM SYMBOL HASH-TABLE) 30 (OR FLOAT (COMPLEX FLOAT) BIGNUM SIMD-PACK SIMD-PACK-256 SYSTEM-AREA-POINTER) 17 (OR FLOAT RATIONAL) - 18 (OR FUNCTION (CONS (EQL FUNCTION))) + 16 (OR FUNCTION (CONS (EQL FUNCTION))) 13 (OR FUNCTION NULL) 15 (OR INTEGER (MEMBER)) 15 (OR INTEGER) From 41a853b359a7b40a07073e0776afcdc006afbb3f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 31 May 2022 17:23:38 -0400 Subject: [PATCH 3414/4023] Compile SB-VM:HEXDUMP in make-host-2 --- src/code/gc.lisp | 42 ++++++++++++++++++++++++++++++++++++++++++ src/code/room.lisp | 41 ----------------------------------------- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 381046a533..978aa4b596 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -94,6 +94,48 @@ and submit it as a patch." (with-alien ((sizer (function unsigned unsigned) :extern "primitive_object_size")) (with-pinned-objects (object) (alien-funcall sizer (get-lisp-obj-address object))))))) + +(defun sb-vm:hexdump (thing &optional (n-words nil wordsp) + ;; pass NIL explicitly if T crashes on you + (decode t)) + (multiple-value-bind (obj addr count) + (if (typep thing 'word) ; ambiguous in the edge case, but assume it's + ;; an address (though you might be trying to dump a bignum's data) + (values nil thing (if wordsp n-words 1)) + (values + thing + (logandc2 (get-lisp-obj-address thing) sb-vm:lowtag-mask) + (if wordsp + n-words + (if (and (typep thing 'code-component) (plusp (code-n-entries thing))) + ;; Display up through the first fun header + (+ (code-header-words thing) + (ash (%code-fun-offset thing 0) (- sb-vm:word-shift)) + sb-vm:simple-fun-insts-offset) + ;; at most 16 words + (min 16 (ash (primitive-object-size thing) (- sb-vm:word-shift))))))) + (with-pinned-objects (obj) + (dotimes (i count) + (let ((word (sap-ref-word (int-sap addr) (ash i sb-vm:word-shift)))) + (multiple-value-bind (lispobj ok fmt) + (cond ((and (typep thing 'code-component) + (< 1 i (code-header-words thing))) + (values (code-header-ref thing i) t)) + #+compact-symbol + ((and (typep thing '(and symbol (not null))) + (= i sb-vm:symbol-name-slot)) + (values (list (sb-impl::symbol-package-id thing) + (symbol-name thing)) + t + "{~{~A,~S~}}")) + (decode + (make-lisp-obj word nil))) + (let ((*print-lines* 1) + (*print-pretty* t)) + (format t "~x: ~v,'0x~:[~; = ~@?~]~%" + (+ addr (ash i sb-vm:word-shift)) + (* 2 sb-vm:n-word-bytes) + word ok (or fmt "~S") lispobj)))))))) ;;;; GC hooks diff --git a/src/code/room.lisp b/src/code/room.lisp index 793f2b0465..315ff311de 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -1255,47 +1255,6 @@ We could try a few things to mitigate this: ;;; this is a valid test that genesis separated code and data. (!ensure-genesis-code/data-separation) -(defun hexdump (thing &optional (n-words nil wordsp) - ;; pass NIL explicitly if T crashes on you - (decode t)) - (multiple-value-bind (obj addr count) - (if (typep thing 'word) ; ambiguous in the edge case, but assume it's - ;; an address (though you might be trying to dump a bignum's data) - (values nil thing (if wordsp n-words 1)) - (values - thing - (logandc2 (get-lisp-obj-address thing) lowtag-mask) - (if wordsp - n-words - (if (and (typep thing 'code-component) (plusp (code-n-entries thing))) - ;; Display up through the first fun header - (+ (code-header-words thing) - (ash (%code-fun-offset thing 0) (- word-shift)) - simple-fun-insts-offset) - ;; at most 16 words - (min 16 (ash (primitive-object-size thing) (- word-shift))))))) - (with-pinned-objects (obj) - (dotimes (i count) - (let ((word (sap-ref-word (int-sap addr) (ash i word-shift)))) - (multiple-value-bind (lispobj ok fmt) - (cond ((and (typep thing 'code-component) - (< 1 i (code-header-words thing))) - (values (code-header-ref thing i) t)) - #+compact-symbol - ((and (typep thing '(and symbol (not null))) - (= i symbol-name-slot)) - (values (list (sb-impl::symbol-package-id thing) - (symbol-name thing)) - t - "{~{~A,~S~}}")) - (decode - (make-lisp-obj word nil))) - (let ((*print-lines* 1) - (*print-pretty* t)) - (format t "~x: ~v,'0x~:[~; = ~@?~]~%" - (+ addr (ash i word-shift)) - (* 2 n-word-bytes) - word ok (or fmt "~S") lispobj)))))))) #+sb-thread (defun show-tls-map () (let ((list From d1477a8778256a784081b1d82219db43e578610e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 31 May 2022 18:19:56 -0400 Subject: [PATCH 3415/4023] Add C binary search with ineqeuality --- src/runtime/search.c | 23 +++++++++++++++++++++++ tests/bsearch.pure.lisp | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 tests/bsearch.pure.lisp diff --git a/src/runtime/search.c b/src/runtime/search.c index ec50001c6d..0e43d5f2c7 100644 --- a/src/runtime/search.c +++ b/src/runtime/search.c @@ -223,3 +223,26 @@ uword_t brothertree_find_lesseql(uword_t key, lispobj tree) } return best; } + + +/* Binary search a sorted vector (of code base addresses). + * This might be useful for generations other than 0, + * because we only need to rebuild the vector in GC, which is + * easily done; and it's much denser than a tree */ +int bsearch_lesseql(uword_t item, uword_t* array, int nelements) +{ + int low = 0; + int high = nelements - 1; + while (low <= high) { + // Many authors point out that this is a bug if overflow occurs + // and it can be avoided by using low+(high-low)/2 or similar. + // But we will never have so many code blobs that overflow occurs. + int mid = (low + high) / 2; + uword_t probe = array[mid]; + if (probe < item) low = mid + 1; + else if (probe > item) high = mid - 1; + else return mid; + } + if (high >= 0 && array[high] < item) return high; + return -1; +} diff --git a/tests/bsearch.pure.lisp b/tests/bsearch.pure.lisp new file mode 100644 index 0000000000..4cee67ab0e --- /dev/null +++ b/tests/bsearch.pure.lisp @@ -0,0 +1,37 @@ +(defun test-c-bsearch-sorted-vector () + (flet ((bsearch<= (item array) + (sb-sys:with-pinned-objects (array) + (let ((answer + (alien-funcall + (extern-alien "bsearch_lesseql" + (function int unsigned system-area-pointer int)) + item (sb-sys:vector-sap array) (length array)))) + (unless (eql answer -1) answer))))) + (loop for vector-len from 1 to 40 + do + (let ((maxval 10000) + (a (make-array vector-len :initial-element 0 + :element-type 'sb-vm:word))) + (dotimes (i vector-len) + (let ((val (1+ (random maxval)))) + (loop while (find val a) ; repeat until unique + do (setq val (1+ (random maxval)))) + (setf (aref a i) val))) + (setq a (sort a #'<)) + (map-into a (lambda (x) (* x 5)) a) + ;; Keys less than the lowest in the array should not be found + (assert (not (bsearch<= 0 a))) + (assert (not (bsearch<= (1- (aref a 0)) a))) + (dotimes (i vector-len) + (let ((k (aref a i))) + (assert (= (bsearch<= k a) i)) ; exact match + ;; Any key between K up to but excluding K[i+1] should find I + (assert (= (bsearch<= (1+ k) a) i)) + (let ((higher (if (< (1+ i) vector-len) + (1- (aref a (1+ i))) + (+ k 10000)))) + (assert (= (bsearch<= higher a) i))))))))) +(compile 'test-c-bsearch-sorted-vector) + +(with-test (:name :c-bsearch-sorted-vector) + (test-c-bsearch-sorted-vector)) From 1801e07478fa4b1bd041b80e3f3a295d5a48440c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 31 May 2022 19:16:33 -0400 Subject: [PATCH 3416/4023] x86-64: improve type test for (signed-byte {8|16|32}) Sign-extend a chopped value into a full register and see if the result is identical to the input. --- src/cold/exports.lisp | 1 + src/compiler/generic/vm-fndb.lisp | 9 +++----- src/compiler/typetran.lisp | 13 +++++++++++ src/compiler/x86-64/type-vops.lisp | 37 ++++++++++++++++++++++++++++++ tests/typep-golden-data.txt | 10 ++++---- 5 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 027ba75866..92839f4d54 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2270,6 +2270,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "TEST-HEADER-DATA-BIT" "SHIFT-TOWARDS-END" "SHIFT-TOWARDS-START" "SHRINK-VECTOR" "%SHRINK-VECTOR" + "SIGNED-BYTE-8-P" "SIGNED-BYTE-16-P" "SIGNED-BYTE-32-P" "SIGNED-BYTE-64-P" "SIMPLE-RANK-1-ARRAY-*-P" "SIMPLE-ARRAY-COMPLEX-DOUBLE-FLOAT-P" diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index 281f4748cc..e775847226 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -56,14 +56,11 @@ #+long-float simple-array-complex-long-float-p simple-rank-1-array-*-p system-area-pointer-p realp - ;; #-64-bit + signed-byte-8-p signed-byte-16-p unsigned-byte-32-p - ;; #-64-bit signed-byte-32-p - #+64-bit - unsigned-byte-64-p - #+64-bit - signed-byte-64-p + #+64-bit unsigned-byte-64-p + #+64-bit signed-byte-64-p weak-pointer-p code-component-p lra-p sb-int:unbound-marker-p pointerp diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index d4df26c26e..7b6578abcc 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -326,6 +326,19 @@ ;; in %SOURCE-TRANSFORM-TYPEP, but even if it wasn't, ;; the OR will drop out due to constraint propagation. `(or (eq ,object ,low) (eq ,object ,high))) + ((and (eq type (specifier-type '(signed-byte 8))) + (vop-existsp :translate signed-byte-8-p)) + `(signed-byte-8-p ,object)) + ((and (eq type (specifier-type '(signed-byte 16))) + (vop-existsp :translate signed-byte-16-p)) + `(signed-byte-16-p ,object)) + ;; On 32-bit backends (SIGNED-BYTE 32) is primitive. + ;; I think it would have already been recognized + ;; and turned into a call to the right predicate. + #+64-bit + ((and (eq type (specifier-type '(signed-byte 32))) + (vop-existsp :translate signed-byte-32-p)) + `(signed-byte-32-p ,object)) #+(or x86 x86-64 arm arm64) ;; Not implemented elsewhere yet ((and (eql (numeric-type-class type) 'integer) (or (eql low 0) (eql low 1)) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 06338540be..65e7de8761 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -313,6 +313,43 @@ (:generator 5 (inst test value value))) +(macrolet ((define (name src-size) + `(progn + (define-vop (,name) + (:translate ,name) + (:args (value :scs (any-reg descriptor-reg))) + (:conditional :z) + (:args-var arg-ref) + (:policy :fast-safe) + (:temporary (:sc unsigned-reg) temp temp2) + (:generator 6 + ;; Optimistically assume that the argument is a fixnum. + ;; If it is, then we're shifting out the tag bit, otherwise + ;; putting random bits in the low byte, which is harmless. + (move temp value) + (inst sar temp n-fixnum-tag-bits) + (inst movsx '(,src-size :qword) temp2 temp) + (inst cmp temp2 temp) + ;; If the input wasn't known to be a fixnum, and it passed + ;; the sign-extension test, then check FIXNUMP now. + (unless (csubtypep (tn-ref-type arg-ref) (specifier-type 'fixnum)) + (inst jmp :nz OUT) ; did NOT pass the sign-extension test + (inst test :byte value fixnum-tag-mask)) + OUT)) + (define-vop (,(symbolicate name "/SIGNED")) + (:translate ,name) + (:args (value :scs (signed-reg))) + (:arg-types signed-num) + (:conditional :z) + (:policy :fast-safe) + (:temporary (:sc unsigned-reg) temp) + (:generator 2 + (inst movsx '(,src-size :qword) temp value) + (inst cmp temp value)))))) + (define signed-byte-8-p :byte) + (define signed-byte-16-p :word) + (define signed-byte-32-p :dword)) + ;;; Sign bit and fixnum tag bit. (defconstant non-negative-fixnum-mask-constant #x8000000000000001) diff --git a/tests/typep-golden-data.txt b/tests/typep-golden-data.txt index c089d4ae80..a95d7d7a5f 100644 --- a/tests/typep-golden-data.txt +++ b/tests/typep-golden-data.txt @@ -413,8 +413,8 @@ 24 (OR (RATIONAL 0 (32))) 65 (OR (UNBOXED-ARRAY (*)) NUMBER SYMBOL INSTANCE CHARACTER) 53 (OR (UNBOXED-ARRAY (*)) NUMBER) - 23 (OR (SIGNED-BYTE 32) SB-C:FIXUP) - 23 (OR (SIGNED-BYTE 32) SB-C:TN) + 20 (OR (SIGNED-BYTE 32) SB-C:FIXUP) + 20 (OR (SIGNED-BYTE 32) SB-C:TN) ! 17 (OR (SIMPLE-ARRAY * (*)) EXTENDED-SEQUENCE (MEMBER)) 15 (OR (SIMPLE-ARRAY CHARACTER (*)) SIMPLE-BASE-STRING) 15 (OR (UNSIGNED-BYTE 32) SB-C:FIXUP) @@ -577,10 +577,10 @@ 12 (SATISFIES SIMPLE-FUN-P) 15 (SIMPLE-UNBOXED-ARRAY (*)) 43 (UNBOXED-ARRAY (*)) - 16 (SIGNED-BYTE 32) + 14 (SIGNED-BYTE 32) 9 (SIGNED-BYTE 63) 14 (SIGNED-BYTE 64) - 15 (SIGNED-BYTE 8) + 14 (SIGNED-BYTE 8) 16 (SIMD-PACK DOUBLE-FLOAT) 16 (SIMD-PACK SINGLE-FLOAT) 16 (SIMD-PACK-256 DOUBLE-FLOAT) @@ -698,7 +698,7 @@ ! 6 SB-PCL::CLASS-EQ-SPECIALIZER ! 6 SB-PCL::FIND-METHOD-LENGTH-MISMATCH ! 6 SB-PCL:SYSTEM-CLASS - 16 EXIT-CODE + 14 EXIT-CODE 9 SB-VM:FINITE-SC-OFFSET 9 SB-VM:SC-OFFSET 14 SB-VM:SIGNED-WORD From a73445b84db91f890214a744deaaeec89ebae2da Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 31 May 2022 17:35:42 -0700 Subject: [PATCH 3417/4023] Make test BLOCK-DEFPACKAGE-RENAME-PACKAGE work. Do this by rehoming already existing symbols during loading into the new package of that name (which already existed under a different name). --- src/code/target-package.lisp | 47 +++++++++++++++++++++++++++------ tests/block-compile.impure.lisp | 4 +-- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index cfebd683b6..ddc05299ef 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -989,6 +989,19 @@ Experimental: interface subject to change." "~S is already a nickname for ~S." nickname (package-%name found))))))) +;;; Set the home package of each symbol in package OLD to NEW. NEW may +;;; be NULL to indicate deletion. +(defun rehome-package-symbols (old new) + (declare (type package old) + (type (or null package) new)) + (flet ((rehome (symbols) + (dovector (x (package-hashtable-cells symbols)) + (when (and (symbolp x) + (eq (symbol-package x) old)) + (%set-symbol-package x new))))) + (rehome (package-internal-symbols old)) + (rehome (package-external-symbols old)))) + ;;; ANSI specifies that: ;;; (1) MAKE-PACKAGE and DEFPACKAGE use the same default package-use-list ;;; (2) that it (as an implementation-defined value) should be documented, @@ -1122,6 +1135,31 @@ implementation it is ~S." *!default-package-use-list*) (assert-package-unlocked package "renaming as ~A~@[ with nickname~*~P ~1@*~{~A~^, ~}~]" name nicks (length nicks))) + ;; If a loader package exists, resolve it and have the + ;; package-to-be renamed take on the resolved packages + ;; symbols, so that it gets cleaned up. + (let ((loader-package + (or (resolve-deferred-package name) + (resolve-rehoming-package name)))) + (when loader-package + (let ((loader-internals (package-internal-symbols + loader-package)) + (loader-externals (package-external-symbols + loader-package)) + (package-internals (package-internal-symbols + package)) + (package-externals (package-external-symbols + package))) + ;; FIXME: What should/can we do with conflicts? + (dovector (x (package-hashtable-cells loader-internals)) + (when (and (symbolp x) + (eq (symbol-package x) loader-package)) + (add-symbol package-internals x))) + (dovector (x (package-hashtable-cells loader-externals)) + (when (and (symbolp x) + (eq (symbol-package x) loader-package)) + (add-symbol package-externals x)))) + (rehome-package-symbols loader-package package))) (with-package-names (table) ;; Check for race conditions now that we have the lock. (unless (eq package (find-package package-designator)) @@ -1185,14 +1223,7 @@ implementation it is ~S." *!default-package-use-list*) (dolist (used (package-use-list package)) (unuse-package used package)) (setf (package-%local-nicknames package) nil) - (let ((rehoming-package (make-rehoming-package package))) - (flet ((nullify-home (symbols) - (dovector (x (package-hashtable-cells symbols)) - (when (and (symbolp x) - (eq (symbol-package x) package)) - (%set-symbol-package x rehoming-package))))) - (nullify-home (package-internal-symbols package)) - (nullify-home (package-external-symbols package)))) + (rehome-package-symbols package (make-rehoming-package package)) (with-package-names (table) (awhen (package-id package) (setf (aref *id->package* it) nil (package-id package) nil)) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index d76205a5e9..aea210ca13 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -99,9 +99,7 @@ (assert (eq (nth-value 1 (find-symbol "F" "BLOCK-DEFPACKAGE4")) :external))) -;;; Doesn't work yet. -(with-test (:name :block-defpackage-rename-package - :fails-on :sbcl) +(with-test (:name :block-defpackage-rename-package) (ctu:file-compile `((eval-when (:compile-toplevel :load-toplevel :execute) (cond From 1bdc85ab9dfbd9f2fafda57e51aafcedbf71c005 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 31 May 2022 17:50:24 -0700 Subject: [PATCH 3418/4023] Work around remaining RENAME-PACKAGE issue for tll smashing. Simply force compilation of queued lambdas when a DEFPACKAGE/MAKE-PACKAGE is seen at compile time, thereby avoiding issues with RENAME-PACKAGE. Set TOP-LEVEL-LAMBDA-MAX back to 20. This is for the case which I think is not conforming code, but nevertheless causes behavioral change. It's not worth trying to solve this to save a few bytes off of fasls in the case where we have random package hackery going on, something which doesn't apply to the majority of code. --- NEWS | 4 ++++ make-target-2.sh | 4 ---- src/code/target-package.lisp | 8 ++++++++ tests/block-compile.impure.lisp | 5 ++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 65423f3b29..3cd79b3006 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,9 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- +changes relative to sbcl-2.2.5: + * optimization: fasl files are now usually smaller (up to 10% on default + policy) and may load faster, especially on high debug. + changes in sbcl-2.2.5 relative to sbcl-2.2.4: * minor incompatible change: SB-EXT:*DERIVE-FUNCTION-TYPES* being NIL now means that function calls will strictly only use type information from diff --git a/make-target-2.sh b/make-target-2.sh index d5e833dae0..b37d85d0ed 100755 --- a/make-target-2.sh +++ b/make-target-2.sh @@ -67,10 +67,6 @@ echo //doing warm init - load and dump phase (setf sb-c::*merge-pathnames* t) ;;; and for storing pathname namestrings in fasls too. (setq sb-c::*name-context-file-path-selector* 'truename) -;;; FIXME: Workaround for possible incorrect RENAME-PACKAGE behavior -;;; with top-level-lambda merging. Remove this when the tests -;;; :block-defpackage-rename-package etc works. -(setq sb-c::top-level-lambda-max 0) (let ((sb-ext:*invoke-debugger-hook* (prog1 sb-ext:*invoke-debugger-hook* (sb-ext:enable-debugger)))) (sb-ext:save-lisp-and-die "output/sbcl.core")) EOF diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index ddc05299ef..c865f5e7a6 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -1046,6 +1046,14 @@ implementation it is ~S." *!default-package-use-list*) "Clobber existing package." "A package named ~S already exists" name) (setf clobber t)) + ;; Force pending top-level lambdas at compile time, to prevent a + ;; potentially observable behavioral change with + ;; RENAME-PACKAGE. See test + ;; :BLOCK-DEFPACKAGE-RENAME-PACKAGE-REDEFPACKAGE which shows the + ;; failing scenario. Forcing top-level lambdas like this does not + ;; apply to block compilation. + (when (boundp 'sb-c::*compilation*) + (sb-c::compile-toplevel-lambdas '() t)) (with-package-graph () ;; Check for race, signal the error outside the lock. (when (and (not clobber) (find-package name)) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index aea210ca13..d4b0819f67 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -82,7 +82,10 @@ (assert (eq (nth-value 1 (find-symbol "F" "BLOCK-DEFPACKAGE3")) :external))) -;;; Similar to the above test case, but with RENAME-PACKAGE. +;;; Similar to the above test case, but with RENAME-PACKAGE. This is +;;; probably, strictly speaking, non-conforming code according to ANSI +;;; 3.2.4.4 under item 1 for symbol, taking package "same"ness to mean +;;; EQness. We don't expect this to work under block compilation. (with-test (:name :block-defpackage-rename-package-redefpackage :fails-on :sbcl) (ctu:file-compile From 21a42e4d080db623136b9fc8a8826e6ee9956fe7 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 31 May 2022 18:28:31 -0700 Subject: [PATCH 3419/4023] Fix win32. For whatever reason Windows doesn't like this stuff because maybe it does weak pointers wrong somehow. --- src/code/target-package.lisp | 1 + tests/block-compile.impure.lisp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index c865f5e7a6..0eed27bc07 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -1146,6 +1146,7 @@ implementation it is ~S." *!default-package-use-list*) ;; If a loader package exists, resolve it and have the ;; package-to-be renamed take on the resolved packages ;; symbols, so that it gets cleaned up. + #-win32 ; This leaves dangling weak pointers on win32... bug? (let ((loader-package (or (resolve-deferred-package name) (resolve-rehoming-package name)))) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index d4b0819f67..e3e6024191 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -102,7 +102,8 @@ (assert (eq (nth-value 1 (find-symbol "F" "BLOCK-DEFPACKAGE4")) :external))) -(with-test (:name :block-defpackage-rename-package) +(with-test (:name :block-defpackage-rename-package + :fails-on :win32) (ctu:file-compile `((eval-when (:compile-toplevel :load-toplevel :execute) (cond From 8f85ef4880c0168843ae369d9e3a4ea865ca831a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 1 Jun 2022 15:32:45 +0300 Subject: [PATCH 3420/4023] Derive the type of (nth x '(constant list)) --- src/compiler/seqtran.lisp | 21 +++++++++++++++++++++ src/compiler/srctran.lisp | 7 +++++++ 2 files changed, 28 insertions(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 3f9e33ca0e..b0fa670663 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -2975,3 +2975,24 @@ fun-result) (element-type (type-union fun-result element-type))))))))) + +(defoptimizer (nth derive-type) ((n list)) + (when (constant-lvar-p list) + (let* ((list (lvar-value list)) + (rest list) + type + (seen (list list))) + (loop for element = (pop rest) + do (setf type + (if type + (type-union (ctype-of element) type) + (ctype-of element))) + until (or (memq rest seen) + (atom rest)) + do (push rest seen) + finally (unless (or rest + (let ((n-int (type-approximate-interval (lvar-type n)))) + (and n-int + (interval<n n-int (length list))))) + (setf type (type-union (specifier-type 'null) type)))) + type))) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 5d73fa5b41..eacd139a0a 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -1106,6 +1106,13 @@ (defun interval-sqr (x) (declare (type interval x)) (interval-func (lambda (x) (sb-xc:* x x)) (interval-abs x))) + +(defun interval<n (interval n) + (let ((high (interval-high interval))) + (and high + (if (consp high) + (<= (car high) n) + (< high n))))) ;;;; numeric DERIVE-TYPE methods From ec4f8817c497cd1b525105793f3247815387e719 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 1 Jun 2022 09:08:45 -0400 Subject: [PATCH 3421/4023] Remove a lot of #+- from generic/type-vops I didn't like the amount of architecture-specific code in the generic file such as SIMPLE-TYPE-PREDICATE which is specific to x86-64. Now we define the architecture-specific type-vops first, then the fallback definitions, and avoid overwriting any definition with a fallback if there was alread something there. It's not required to explicitly avoid making the generic definition, it'll do the right thing. (In fact it may never have been "required" to have the conditionals as evidenced by the typo at "#-arm-64". We'd just stomp on the generic definition with the one from the backend, which is onfusing in itself) --- src/cold/build-order.lisp-expr | 3 +- src/compiler/generic/type-vops.lisp | 247 ++-------------------------- src/compiler/type-vop-macros.lisp | 216 ++++++++++++++++++++++++ src/compiler/x86-64/type-vops.lisp | 37 ++++- src/compiler/x86/type-vops.lisp | 4 + tests/typep-golden-data.txt | 16 +- 6 files changed, 276 insertions(+), 247 deletions(-) create mode 100644 src/compiler/type-vop-macros.lisp diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 8f95a8028e..be48433b79 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -411,8 +411,9 @@ ("src/compiler/float-tran") ("src/compiler/ir1final") ("src/compiler/generic/vm-tran") - ("src/compiler/generic/type-vops") + ("src/compiler/type-vop-macros") ("src/compiler/{arch}/type-vops") + ("src/compiler/generic/type-vops") ;; This is a terrible name for a file that contains type derivers ;; and IR1 transforms. Maybe split it up into more appropriately named pieces. diff --git a/src/compiler/generic/type-vops.lisp b/src/compiler/generic/type-vops.lisp index f5a3d397ce..1306ec1d81 100644 --- a/src/compiler/generic/type-vops.lisp +++ b/src/compiler/generic/type-vops.lisp @@ -10,248 +10,33 @@ ;;;; files for more information. (in-package "SB-VM") - -(defconstant-eqx +immediate-types+ - `(,unbound-marker-widetag ,character-widetag #+64-bit ,single-float-widetag) - #'equal) - -;; Given a list of widetags in HEADERS, compress into a minimal list of ranges -;; and/or singletons that should be tested. -;; FIXME: At present the "is it effectively a one-sided test" is re-implemented -;; in an ad-hoc way by each backend. The range convention should be -;; changed to indicate explicitly when either limit needn't be checked. -;; (Use NIL or * as a bound perhaps) -(eval-when (:compile-toplevel :load-toplevel :execute) - -(defun canonicalize-widetags (headers) - (collect ((results)) - (let ((start nil) - (prev nil) - (delta widetag-spacing)) - (flet ((emit-test () - (results (if (= start prev) - start - (cons start prev))))) - ;; COPY-LIST because the argument may come from immutable source code - (dolist (header (sort (copy-list headers) #'<)) - (cond ((null start) - (setf start header) - (setf prev header)) - ((= header (+ prev delta)) - (setf prev header)) - (t - (emit-test) - (setf start header) - (setf prev header)))) - (emit-test))) - (results))) - -;; If WIDETAGS is comprised of two ranges that are nearly adjacent, -;; return a single range spanning both original ranges, -;; and as a second value the widetag(s) to exclude; -;; or return the unmodified ranges and NIL. -;; This could be generalized: three ranges that collapse to one with at most -;; two exceptions, or three collapsing to two with one exception, etc. -(defun canonicalize-widetags+exceptions (widetags) - (let ((ranges (canonicalize-widetags widetags))) - (flet ((begin (x) (if (listp x) (car x) x)) - (end (x) (if (listp x) (cdr x) x))) - (when (and (cdr ranges) (endp (cddr ranges))) ; 2 ranges - (let* ((range-1 (first ranges)) - (range-2 (second ranges)) - (begin-1 (begin range-1)) - (end-1 (end range-1)) - (begin-2 (begin range-2)) - (end-2 (end range-2)) - (delta widetag-spacing)) - (when (and (= (+ end-1 (* 2 delta)) begin-2) - ;; Don't return {X} - {Y} if {X} spans only 3 widetags, - ;; because clearly we can just test the 2 members of X. - ;; fencepost: 3 delta is 4 widetags. - (>= (- end-2 begin-1) (* 3 delta))) - (return-from canonicalize-widetags+exceptions - (values `((,begin-1 . ,end-2)) - `(,(+ end-1 delta)))))))) ; the excluded value - (values ranges nil))) -) ; EVAL-WHEN - -(defmacro test-type (value temp target not-p - (&rest type-codes) - &rest other-args - &key &allow-other-keys) - ;; Determine what interesting combinations we need to test for. - (let* ((type-codes (mapcar #'eval type-codes)) - (fixnump (and (every (lambda (lowtag) - (member lowtag type-codes)) - '#.(mapcar #'symbol-value fixnum-lowtags)) - t)) - ;; On 64-bit, UNBOUND-MARKER-WIDETAG may be smaller than LOWTAG-LIMIT - ;; but it is not a lowtag. - (lowtags (remove unbound-marker-widetag - (remove lowtag-limit type-codes :test #'<))) - (extended (remove-if (lambda (x) - (and (< x lowtag-limit) - (/= x unbound-marker-widetag))) - type-codes)) - (immediates (intersection extended +immediate-types+ :test #'eql)) - ;; To collapse the range of widetags comprising real numbers on 64-bit - ;; machines, consider SHORT-FLOAT-WIDETAG both a header and immediate. - ;; No OTHER-POINTER-LOWTAG object can ever have that header tag. - ;; But only do so if there would otherwise be a discontinuity - ;; in the set of headers. - ;; Another approach would have been to flip DOUBLE- and SINGLE- float, - ;; but that would not help NUMBERP, only REALP. Putting SINGLE- - ;; after the complex widetags would work but harm 32-bit machines. - (headers (set-difference - extended - (if (and (= n-word-bits 64) - (member (- single-float-widetag 4) extended) - (member (+ single-float-widetag 4) extended)) - (remove single-float-widetag +immediate-types+) - +immediate-types+) - :test #'eql)) - (function-p (if (intersection headers +function-widetags+) - (if (subsetp headers +function-widetags+) - t - (error "can't test for mix of function subtypes ~ - and other header types")) - nil))) - (unless type-codes - (error "At least one type must be supplied for TEST-TYPE.")) - (unless headers - (remf other-args :value-tn-ref)) - (cond - (fixnump - (when (remove-if (lambda (x) - (member x '#.(mapcar #'symbol-value fixnum-lowtags))) - lowtags) - (error "can't mix fixnum testing with other lowtags")) - (when function-p - (error "can't mix fixnum testing with function subtype testing")) - (cond - ((and (= n-word-bits 64) immediates headers) - `(%test-fixnum-immediate-and-headers ,value ,temp ,target ,not-p - ,(car immediates) - ',(canonicalize-widetags - headers) - ,@other-args)) - (immediates - (if (= n-word-bits 64) - `(%test-fixnum-and-immediate ,value ,temp ,target ,not-p - ,(car immediates) - ,@other-args) - (error "can't mix fixnum testing with other immediates"))) - (headers - `(%test-fixnum-and-headers ,value ,temp ,target ,not-p - ',(canonicalize-widetags headers) - ,@other-args)) - (t - `(%test-fixnum ,value ,temp ,target ,not-p - ,@other-args)))) - (immediates - (cond - (headers - (if (= n-word-bits 64) - `(%test-immediate-and-headers ,value ,temp ,target ,not-p - ,(car immediates) - ',(canonicalize-widetags headers) - ,@other-args) - (error "can't mix testing of immediates with testing of headers"))) - (lowtags - (error "can't mix testing of immediates with testing of lowtags")) - ((cdr immediates) - (error "can't test multiple immediates at the same time")) - (t - `(%test-immediate ,value ,temp ,target ,not-p ,(car immediates) - ,@other-args)))) - (lowtags - (when (cdr lowtags) - (error "can't test multiple lowtags at the same time")) - (when headers - (error "can't test non-fixnum lowtags and headers at the same time")) - `(%test-lowtag ,value ,temp ,target ,not-p ,(car lowtags) ,@other-args)) - (headers - `(%test-headers ,value ,temp ,target ,not-p ,function-p - ',(canonicalize-widetags headers) - ,@other-args)) - (t - (error "nothing to test?"))))) - -;;; FIXME: backend-specific junk doesn't belong in compiler/generic. - -#+(or x86 x86-64) -(progn -(define-vop (type-predicate) - (:args (value :scs (any-reg descriptor-reg))) - ;; x86 code has to avoid 'esi' and 'edi' for the temp - ;; since they can't be accessed as an 8-bit byte. - ;; x86-64 being more regular, any reg can serve as the temp. - ;; In all likelihood, it'll get rax anyway just because. - (:temporary (:sc unsigned-reg #+x86 :offset #+x86 eax-offset) temp) - (:conditional) - (:info target not-p) - (:args-var args) - (:policy :fast-safe)) -(define-vop (simple-type-predicate) - (:args (value :scs (any-reg descriptor-reg control-stack))) - (:conditional) - (:info target not-p) - (:args-var args) - (:policy :fast-safe)) -;; A vop that accepts a computed set of widetags. -(define-vop (%other-pointer-subtype-p type-predicate) - (:translate %other-pointer-subtype-p) - (:info target not-p widetags) - (:arg-types * (:constant t)) ; voodoo - 'target' and 'not-p' are absent - (:generator 15 ; arbitrary - (multiple-value-bind (headers except) (canonicalize-widetags+exceptions widetags) - (%test-headers value temp target not-p nil headers :except except - :value-tn-ref args))))) - -#-(or x86 x86-64) -(progn -(define-vop (type-predicate) - (:args (value :scs (any-reg descriptor-reg))) - (:temporary (:sc non-descriptor-reg) temp) - (:conditional) - (:info target not-p) - (:args-var args) - (:policy :fast-safe)) -;; A vop that accepts a computed set of widetags. -(define-vop (%other-pointer-subtype-p type-predicate) - (:translate %other-pointer-subtype-p) - (:info target not-p widetags) - (:arg-types * (:constant t)) ; voodoo - 'target' and 'not-p' are absent - (:args-var args) - (:generator 15 ; arbitrary - (%test-headers value temp target not-p nil (canonicalize-widetags widetags) - :value-tn-ref args)))) - -(defmacro define-type-vop (pred-name type-codes - &optional (inherit 'type-predicate)) +;;; We use a default definition of the vop for PRED-NAME only if it was not +;;; already defined by the backend in {arch}/type-vops. DEFINE-VOP has a compile-time +;;; effect of storing the vop name in *BACKEND-PARSED-VOPS*, so it's correct to +;;; look in that hash-table at macroexpansion time here. +;;; But due to multiple processing passes, the vop could exist in the table +;;; from its default definition, so that's gotta be allowed, or else make-host-2 +;;; would produce a null expansion for every type-vop. +(defmacro define-type-vop (pred-name type-codes) + (awhen (gethash pred-name sb-c::*backend-parsed-vops*) + (unless (string= (sb-c::vop-parse-note it) "defaulted") + (return-from define-type-vop))) (let ((cost (if (> (reduce #'max type-codes :key #'eval) lowtag-limit) 7 4))) - `(define-vop (,pred-name ,inherit) + `(define-vop (,pred-name type-predicate) (:translate ,pred-name) + (:note "defaulted") (:generator ,cost - (test-type value - ,(if (eq inherit 'simple-type-predicate) nil 'temp) - target not-p ,type-codes - :value-tn-ref args))))) + (test-type value temp target not-p ,type-codes :value-tn-ref args))))) -#-x86-64 ; defined in compiler/x86-64/type-vops for x86-64 -(progn (define-type-vop unbound-marker-p (unbound-marker-widetag)) (define-type-vop characterp (character-widetag)) -#-arm-64 (define-type-vop single-float-p (single-float-widetag)) -(define-type-vop fixnump - #.fixnum-lowtags - #+(or x86) simple-type-predicate) ;; save a register +(define-type-vop fixnump #.fixnum-lowtags) (define-type-vop functionp (fun-pointer-lowtag)) @@ -268,7 +53,6 @@ (define-type-vop simple-fun-p (simple-fun-widetag)) (define-type-vop funcallable-instance-p (funcallable-instance-widetag)) -) ; end PROGN (define-type-vop bignump (bignum-widetag)) @@ -294,7 +78,6 @@ (#+sb-unicode simple-character-string-widetag simple-base-string-widetag)) -#-x86-64 (macrolet ((define-simple-array-type-vops () `(progn diff --git a/src/compiler/type-vop-macros.lisp b/src/compiler/type-vop-macros.lisp new file mode 100644 index 0000000000..c8062f80ff --- /dev/null +++ b/src/compiler/type-vop-macros.lisp @@ -0,0 +1,216 @@ +;;;; generic type testing and checking VOPs + +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. +(in-package "SB-VM") + +(defconstant-eqx +immediate-types+ + `(,unbound-marker-widetag ,character-widetag #+64-bit ,single-float-widetag) + #'equal) + +;; Given a list of widetags in HEADERS, compress into a minimal list of ranges +;; and/or singletons that should be tested. +;; FIXME: At present the "is it effectively a one-sided test" is re-implemented +;; in an ad-hoc way by each backend. The range convention should be +;; changed to indicate explicitly when either limit needn't be checked. +;; (Use NIL or * as a bound perhaps) +(defun canonicalize-widetags (headers) + (collect ((results)) + (let ((start nil) + (prev nil) + (delta widetag-spacing)) + (flet ((emit-test () + (results (if (= start prev) + start + (cons start prev))))) + ;; COPY-LIST because the argument may come from immutable source code + (dolist (header (sort (copy-list headers) #'<)) + (cond ((null start) + (setf start header) + (setf prev header)) + ((= header (+ prev delta)) + (setf prev header)) + (t + (emit-test) + (setf start header) + (setf prev header)))) + (emit-test))) + (results))) + +;; If WIDETAGS is comprised of two ranges that are nearly adjacent, +;; return a single range spanning both original ranges, +;; and as a second value the widetag(s) to exclude; +;; or return the unmodified ranges and NIL. +;; This could be generalized: three ranges that collapse to one with at most +;; two exceptions, or three collapsing to two with one exception, etc. +(defun canonicalize-widetags+exceptions (widetags) + (let ((ranges (canonicalize-widetags widetags))) + (flet ((begin (x) (if (listp x) (car x) x)) + (end (x) (if (listp x) (cdr x) x))) + (when (and (cdr ranges) (endp (cddr ranges))) ; 2 ranges + (let* ((range-1 (first ranges)) + (range-2 (second ranges)) + (begin-1 (begin range-1)) + (end-1 (end range-1)) + (begin-2 (begin range-2)) + (end-2 (end range-2)) + (delta widetag-spacing)) + (when (and (= (+ end-1 (* 2 delta)) begin-2) + ;; Don't return {X} - {Y} if {X} spans only 3 widetags, + ;; because clearly we can just test the 2 members of X. + ;; fencepost: 3 delta is 4 widetags. + (>= (- end-2 begin-1) (* 3 delta))) + (return-from canonicalize-widetags+exceptions + (values `((,begin-1 . ,end-2)) + `(,(+ end-1 delta)))))))) ; the excluded value + (values ranges nil))) + +(defmacro test-type (value temp target not-p + (&rest type-codes) + &rest other-args + &key &allow-other-keys) + ;; Determine what interesting combinations we need to test for. + (let* ((type-codes (mapcar #'eval type-codes)) + (fixnump (and (every (lambda (lowtag) + (member lowtag type-codes)) + '#.(mapcar #'symbol-value fixnum-lowtags)) + t)) + ;; On 64-bit, UNBOUND-MARKER-WIDETAG may be smaller than LOWTAG-LIMIT + ;; but it is not a lowtag. + (lowtags (remove unbound-marker-widetag + (remove lowtag-limit type-codes :test #'<))) + (extended (remove-if (lambda (x) + (and (< x lowtag-limit) + (/= x unbound-marker-widetag))) + type-codes)) + (immediates (intersection extended +immediate-types+ :test #'eql)) + ;; To collapse the range of widetags comprising real numbers on 64-bit + ;; machines, consider SHORT-FLOAT-WIDETAG both a header and immediate. + ;; No OTHER-POINTER-LOWTAG object can ever have that header tag. + ;; But only do so if there would otherwise be a discontinuity + ;; in the set of headers. + ;; Another approach would have been to flip DOUBLE- and SINGLE- float, + ;; but that would not help NUMBERP, only REALP. Putting SINGLE- + ;; after the complex widetags would work but harm 32-bit machines. + (headers (set-difference + extended + (if (and (= n-word-bits 64) + (member (- single-float-widetag 4) extended) + (member (+ single-float-widetag 4) extended)) + (remove single-float-widetag +immediate-types+) + +immediate-types+) + :test #'eql)) + (function-p (if (intersection headers +function-widetags+) + (if (subsetp headers +function-widetags+) + t + (error "can't test for mix of function subtypes ~ + and other header types")) + nil))) + (unless type-codes + (error "At least one type must be supplied for TEST-TYPE.")) + (unless headers + (remf other-args :value-tn-ref)) + (cond + (fixnump + (when (remove-if (lambda (x) + (member x '#.(mapcar #'symbol-value fixnum-lowtags))) + lowtags) + (error "can't mix fixnum testing with other lowtags")) + (when function-p + (error "can't mix fixnum testing with function subtype testing")) + (cond + ((and (= n-word-bits 64) immediates headers) + `(%test-fixnum-immediate-and-headers ,value ,temp ,target ,not-p + ,(car immediates) + ',(canonicalize-widetags + headers) + ,@other-args)) + (immediates + (if (= n-word-bits 64) + `(%test-fixnum-and-immediate ,value ,temp ,target ,not-p + ,(car immediates) + ,@other-args) + (error "can't mix fixnum testing with other immediates"))) + (headers + `(%test-fixnum-and-headers ,value ,temp ,target ,not-p + ',(canonicalize-widetags headers) + ,@other-args)) + (t + `(%test-fixnum ,value ,temp ,target ,not-p + ,@other-args)))) + (immediates + (cond + (headers + (if (= n-word-bits 64) + `(%test-immediate-and-headers ,value ,temp ,target ,not-p + ,(car immediates) + ',(canonicalize-widetags headers) + ,@other-args) + (error "can't mix testing of immediates with testing of headers"))) + (lowtags + (error "can't mix testing of immediates with testing of lowtags")) + ((cdr immediates) + (error "can't test multiple immediates at the same time")) + (t + `(%test-immediate ,value ,temp ,target ,not-p ,(car immediates) + ,@other-args)))) + (lowtags + (when (cdr lowtags) + (error "can't test multiple lowtags at the same time")) + (when headers + (error "can't test non-fixnum lowtags and headers at the same time")) + `(%test-lowtag ,value ,temp ,target ,not-p ,(car lowtags) ,@other-args)) + (headers + `(%test-headers ,value ,temp ,target ,not-p ,function-p + ',(canonicalize-widetags headers) + ,@other-args)) + (t + (error "nothing to test?"))))) + +#+(or x86 x86-64) +(progn +(define-vop (type-predicate) + (:args (value :scs (any-reg descriptor-reg))) + ;; x86 code has to avoid 'esi' and 'edi' for the temp + ;; since they can't be accessed as an 8-bit byte. + ;; x86-64 being more regular, any reg can serve as the temp. + ;; In all likelihood, it'll get rax anyway just because. + (:temporary (:sc unsigned-reg #+x86 :offset #+x86 eax-offset) temp) + (:conditional) + (:info target not-p) + (:args-var args) + (:policy :fast-safe)) +;; A vop that accepts a computed set of widetags. +(define-vop (%other-pointer-subtype-p type-predicate) + (:translate %other-pointer-subtype-p) + (:info target not-p widetags) + (:arg-types * (:constant t)) ; voodoo - 'target' and 'not-p' are absent + (:generator 15 ; arbitrary + (multiple-value-bind (headers except) (canonicalize-widetags+exceptions widetags) + (%test-headers value temp target not-p nil headers :except except + :value-tn-ref args))))) + +#-(or x86 x86-64) +(progn +(define-vop (type-predicate) + (:args (value :scs (any-reg descriptor-reg))) + (:temporary (:sc non-descriptor-reg) temp) + (:conditional) + (:info target not-p) + (:args-var args) + (:policy :fast-safe)) +;; A vop that accepts a computed set of widetags. +(define-vop (%other-pointer-subtype-p type-predicate) + (:translate %other-pointer-subtype-p) + (:info target not-p widetags) + (:arg-types * (:constant t)) ; voodoo - 'target' and 'not-p' are absent + (:args-var args) + (:generator 15 ; arbitrary + (%test-headers value temp target not-p nil (canonicalize-widetags widetags) + :value-tn-ref args)))) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 65e7de8761..7832f365ab 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -231,12 +231,17 @@ ;;;; other integer ranges +(define-vop (simple-type-predicate) + (:args (value :scs (any-reg descriptor-reg control-stack))) + (:conditional) + (:args-var args) + (:policy :fast-safe)) + (define-vop (fixnump/unsigned-byte-64 simple-type-predicate) (:args (value :scs (unsigned-reg))) (:arg-types unsigned-num) (:translate fixnump) (:temporary (:sc unsigned-reg :from (:argument 0)) tmp) - (:info) (:conditional :z) (:generator 3 (move tmp value) @@ -245,7 +250,6 @@ #-#.(cl:if (cl:= sb-vm:n-fixnum-tag-bits 1) '(:and) '(:or)) (define-vop (fixnump/signed-byte-64 simple-type-predicate) (:args (value :scs (signed-reg))) - (:info) (:conditional :z) (:temporary (:sc unsigned-reg) temp) (:arg-types signed-num) @@ -262,7 +266,6 @@ #+#.(cl:if (cl:= sb-vm:n-fixnum-tag-bits 1) '(:and) '(:or)) (define-vop (fixnump/signed-byte-64 simple-type-predicate) (:args (value :scs (signed-reg) :target temp)) - (:info) (:conditional :no) (:temporary (:sc unsigned-reg :from (:argument 0)) temp) (:arg-types signed-num) @@ -469,7 +472,6 @@ (macrolet ((define (name widetag) `(define-vop (,name simple-type-predicate) (:translate ,name) - (:info) (:conditional :z) (:generator 1 (inst cmp :byte value ,widetag))))) (define single-float-p single-float-widetag) @@ -490,10 +492,11 @@ (define %instancep instance-pointer-lowtag) (define %other-pointer-p other-pointer-lowtag)) +;;; Function subtypes produce a flag result (macrolet ((define (name widetag) `(define-vop (,name type-predicate) (:translate ,name) - (:info) + (:info) ; nullify the info (:conditional :z) (:generator 4 (inst lea temp (ea (- fun-pointer-lowtag) value)) @@ -504,12 +507,35 @@ (define closurep closure-widetag) (define simple-fun-p simple-fun-widetag) (define funcallable-instance-p funcallable-instance-widetag)) +;;; Various OTHER-POINTER objects produce a flag result. +;;; The parens around widetag are from copy&paste of generic/type-vops +(macrolet ((define (name (widetag)) + `(define-vop (,name type-predicate) + (:translate ,name) + (:info) ; nullify the info + (:conditional :z) + (:generator 4 + (test-other-ptr value args ,widetag temp out) + out)))) + (define bignump (bignum-widetag)) + (define ratiop (ratio-widetag)) + (define complex-rational-p (complex-widetag)) + (define complex-single-float-p (complex-single-float-widetag)) + (define complex-double-float-p (complex-double-float-widetag)) + (define double-float-p (double-float-widetag)) + (define system-area-pointer-p (sap-widetag)) + (define weak-pointer-p (weak-pointer-widetag)) + (define code-component-p (code-header-widetag)) + (define fdefn-p (fdefn-widetag)) + (define simple-array-header-p (simple-array-widetag)) + (define complex-vector-p (complex-vector-widetag))) ;;;; list/symbol types ;;; ;;; symbolp (or symbol (eq nil)) ;;; consp (and list (not (eq nil))) +;;; Test whether ARG is an other-pointer to WIDETAG, setting the Z flag if so (defun test-other-ptr (arg arg-ref widetag temp label) (inst cmp :byte (cond ((other-pointer-tn-ref-p arg-ref) @@ -665,7 +691,6 @@ (:translate fixnump) (:args-var arg-ref) (:args (value :scs (any-reg descriptor-reg) :load-if (tn-ref-memory-access arg-ref))) - (:info) (:conditional :z) ;; the compiler is very sensitive to this cost here as regards boxing. DON'T TOUCH !!! (:generator 3 diff --git a/src/compiler/x86/type-vops.lisp b/src/compiler/x86/type-vops.lisp index 45af6da7b0..6e6b10d375 100644 --- a/src/compiler/x86/type-vops.lisp +++ b/src/compiler/x86/type-vops.lisp @@ -169,6 +169,10 @@ ;;;; other integer ranges +(define-vop (fixnump simple-type-predicate) + (:translate fixnump) + (:generator 4 (%test-fixnum value nil target not-p))) + (define-vop (fixnump/unsigned-byte-32 simple-type-predicate) (:args (value :scs (unsigned-reg))) (:info) diff --git a/tests/typep-golden-data.txt b/tests/typep-golden-data.txt index a95d7d7a5f..cbaf1bbee5 100644 --- a/tests/typep-golden-data.txt +++ b/tests/typep-golden-data.txt @@ -26,9 +26,9 @@ 27 (ARRAY NIL) 27 (ARRAY T *) 27 (ARRAY T) - 13 (COMPLEX DOUBLE-FLOAT) - 13 (COMPLEX RATIONAL) - 13 (COMPLEX SINGLE-FLOAT) + 12 (COMPLEX DOUBLE-FLOAT) + 12 (COMPLEX RATIONAL) + 12 (COMPLEX SINGLE-FLOAT) 21 (CONS (MEMBER FUNCTION FUNCTION-DESIGNATOR SB-C::MODIFYING SB-C::INHIBIT-FLUSHING) T) 37 (CONS (AND SYMBOL (NOT NULL)) (OR NULL (CONS STRING NULL))) 20 (CONS (CONS (MEMBER LAMBDA) T) NULL) @@ -491,7 +491,7 @@ 37 (OR PATHNAME SYNONYM-STREAM FILE-STREAM BOOLEAN) 35 (OR PATHNAME SYNONYM-STREAM FILE-STREAM NULL) 32 (OR PATHNAME SYNONYM-STREAM FILE-STREAM) - 13 (OR RATIO) + 12 (OR RATIO) 17 (OR RATIONAL FLOAT) 17 (OR RATIONAL SINGLE-FLOAT) 15 (OR RATIONAL) @@ -652,7 +652,7 @@ 13 ATOM 10 BASE-CHAR 15 BASE-STRING - 13 BIGNUM + 12 BIGNUM 9 BIT 16 BIT-VECTOR 12 BOOLEAN @@ -661,7 +661,7 @@ 13 COMPILED-FUNCTION 15 COMPLEX 13 CONS - 13 DOUBLE-FLOAT + 12 DOUBLE-FLOAT 13 EXTENDED-CHAR 9 FIXNUM 15 FLOAT @@ -669,11 +669,11 @@ 15 INTEGER 14 KEYWORD 10 LIST - 13 LONG-FLOAT + 12 LONG-FLOAT ! 6 METHOD-COMBINATION 9 NULL 17 NUMBER - 13 RATIO + 12 RATIO 15 RATIONAL 17 REAL 9 SB-C::POLICY-QUALITY From a7b603ff3985aafd06486f5b7c5334436da67829 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 1 Jun 2022 10:31:26 -0400 Subject: [PATCH 3422/4023] Assign widetags with less variability Make the FUNCTION subtypes the same for +-64-bit and add some unused widetags for #-sb-unicode. --- src/compiler/generic/early-objdef.lisp | 191 ++++++++++++------------- src/compiler/generic/type-vops.lisp | 5 + src/runtime/gc-private.h | 10 +- 3 files changed, 100 insertions(+), 106 deletions(-) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 1eec5d7bea..94046e6d71 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -180,114 +180,104 @@ ;; a long, horrible death. --njf, 2004-08-09 :start #.(+ (ash 1 n-lowtag-bits) other-immediate-0-lowtag) :step 4) - ; +unicode -unicode -;; Word bits ; 32 | 64 32 | 64 - ;------------------ - ; [ all numbers are hex ] - bignum-widetag ; 0A 11 0A 11 \ - ratio-widetag ; 0E 15 0E 15 | - single-float-widetag ; 12 19 12 19 | - double-float-widetag ; 16 1D 16 1D | EQL-hash picks off this - complex-widetag ; 1A 21 1A 21 | range of widetags - complex-single-float-widetag ; 1E 25 1E 25 | - complex-double-float-widetag ; 22 29 22 29 | - ; | - symbol-widetag ; 26 2D 26 2D / - - #-64-bit instance-widetag ; 2A 2A - #-64-bit funcallable-instance-widetag ; 2E 2E - #-64-bit simple-fun-widetag ; 32 32 - #-64-bit closure-widetag ; 36 36 - #-64-bit code-header-widetag ; 3A 3A - - #+64-bit code-header-widetag ; 31 31 - #+64-bit instance-widetag ; 35 35 - #+64-bit simple-fun-widetag ; 39 39 - #+64-bit funcallable-instance-widetag ; 3D 3D - #+64-bit closure-widetag ; 41 41 - - ;; x86[-64] does not have objects with this widetag, - #-(or x86 x86-64 arm64 riscv) return-pc-widetag ; 3E 45 3E 45 +;; Word bits ; 32 | 64 + ;--------- + ; [ all numbers are hex ] + + ;; NOTE: If changing the widetags bracketed by the comment about EQL-hash, + ;; check that the definition of stable_eql_hash_p() in gc-common is correct. + ;; FIXME: EQL-HASH should treat SAP like a number + ;; -- start of numeric widetags -- + bignum-widetag ; 0A 11 \ + ratio-widetag ; 0E 15 | + single-float-widetag ; 12 19 | + double-float-widetag ; 16 1D | EQL-hash picks off this + complex-widetag ; 1A 21 | range of widetags. + complex-single-float-widetag ; 1E 25 | + complex-double-float-widetag ; 22 29 | + ;; -- end of numeric widetags -- | + symbol-widetag ; 26 2D / + sap-widetag ; 2A 31 + + code-header-widetag ; 2E 35 + instance-widetag ; 32 39 + funcallable-instance-widetag ; 36 3D + simple-fun-widetag ; 3A 41 + closure-widetag ; 3E 45 + + #-(or x86 x86-64 arm64 riscv) return-pc-widetag ; 42 49 #+(or x86 x86-64 arm64 riscv) lra-widetag-notused - value-cell-widetag ; 42 49 42 49 - character-widetag ; 46 4D 46 4D - sap-widetag ; 4A 51 4A 51 - #-64-bit unbound-marker-widetag ; 4E 55 4E 55 + value-cell-widetag ; 46 4D + character-widetag ; 4A 51 + #-64-bit unbound-marker-widetag ; 4E 55 #+64-bit unused00-widetag - weak-pointer-widetag ; 52 59 52 59 - fdefn-widetag ; 56 5D 56 5D - - no-tls-value-marker-widetag ; 5A 61 5A 61 - #+sb-simd-pack simd-pack-widetag ; 65 65 - #-sb-simd-pack unused01-widetag ; 5E 5E - #+sb-simd-pack-256 simd-pack-256-widetag ; 62 69 62 69 - #-sb-simd-pack-256 unused03-widetag ; 62 69 62 69 - filler-widetag ; 66 6D 66 6D - unused04-widetag ; 6A 71 6A 71 - unused05-widetag ; 6E 75 6E 75 - unused06-widetag ; 72 79 72 79 - unused07-widetag ; 76 7D 76 7D - #-64-bit unused08-widetag ; 7A 7A - #-64-bit unused09-widetag ; 7E 7E - - simple-array-widetag ; 82 81 82 81 + weak-pointer-widetag ; 52 59 + fdefn-widetag ; 56 5D + + no-tls-value-marker-widetag ; 5A 61 + #+sb-simd-pack simd-pack-widetag ; 65 + #-sb-simd-pack unused01-widetag ; 5E + #+sb-simd-pack-256 simd-pack-256-widetag ; 69 + #-sb-simd-pack-256 unused03-widetag ; 62 + filler-widetag ; 66 6D + unused04-widetag ; 6A 71 + unused05-widetag ; 6E 75 + unused06-widetag ; 72 79 + unused07-widetag ; 76 7D + #-64-bit unused08-widetag ; 7A + #-64-bit unused09-widetag ; 7E + + simple-array-widetag ; 82 81 ;; NIL element type is not in the contiguous range of widetags ;; corresponding to SIMPLE-UNBOXED-ARRAY - simple-array-nil-widetag + simple-array-nil-widetag ; 86 ;; IF YOU CHANGE THIS ORDER, THEN MANUALLY VERIFY CORRECTNESS OF: ;; - leaf_obj_widetag_p() ;; - conservative_root_p() ;; - anything else I forgot to mention - simple-vector-widetag ; - simple-bit-vector-widetag ; - simple-array-unsigned-byte-2-widetag ; - simple-array-unsigned-byte-4-widetag ; - simple-array-unsigned-byte-7-widetag ; - simple-array-unsigned-byte-8-widetag ; - simple-array-unsigned-byte-15-widetag ; - simple-array-unsigned-byte-16-widetag ; - - #-64-bit - simple-array-unsigned-fixnum-widetag ; - simple-array-unsigned-byte-31-widetag ; - simple-array-unsigned-byte-32-widetag ; - #+64-bit - simple-array-unsigned-fixnum-widetag ; - #+64-bit - simple-array-unsigned-byte-63-widetag ; - #+64-bit - simple-array-unsigned-byte-64-widetag ; - simple-array-signed-byte-8-widetag ; - simple-array-signed-byte-16-widetag ; - #-64-bit - simple-array-fixnum-widetag ; - simple-array-signed-byte-32-widetag ; - #+64-bit - simple-array-fixnum-widetag ; - #+64-bit - simple-array-signed-byte-64-widetag ; - simple-array-single-float-widetag ; - simple-array-double-float-widetag ; - simple-array-complex-single-float-widetag ; - simple-array-complex-double-float-widetag ; + simple-vector-widetag ; 8A + simple-bit-vector-widetag ; 8E + simple-array-unsigned-byte-2-widetag ; 92 + simple-array-unsigned-byte-4-widetag ; 96 + simple-array-unsigned-byte-7-widetag ; 9A + simple-array-unsigned-byte-8-widetag ; 9E + simple-array-unsigned-byte-15-widetag ; A2 + simple-array-unsigned-byte-16-widetag ; A6 + + #-64-bit simple-array-unsigned-fixnum-widetag ; + simple-array-unsigned-byte-31-widetag ; + simple-array-unsigned-byte-32-widetag ; + #+64-bit simple-array-unsigned-fixnum-widetag ; + #+64-bit simple-array-unsigned-byte-63-widetag ; + #+64-bit simple-array-unsigned-byte-64-widetag ; + simple-array-signed-byte-8-widetag ; + simple-array-signed-byte-16-widetag ; + #-64-bit simple-array-fixnum-widetag ; + simple-array-signed-byte-32-widetag ; + #+64-bit simple-array-fixnum-widetag ; + #+64-bit simple-array-signed-byte-64-widetag ; + simple-array-single-float-widetag ; + simple-array-double-float-widetag ; + simple-array-complex-single-float-widetag ; + simple-array-complex-double-float-widetag ; ;; WARNING: If you change the order of anything here, ;; be sure to examine COMPUTE-OBJECT-HEADER to see that it works ;; properly for all non-simple array headers. - simple-base-string-widetag ; D6 E1 D6 E1 \ - #+sb-unicode ; | - simple-character-string-widetag ; DA E5 | Strings - ;; From here down commence the non-simple array types | - complex-base-string-widetag ; DE E9 DA E5 | - #+sb-unicode ; | - complex-character-string-widetag ; E2 ED / - - complex-bit-vector-widetag ; E6 F1 DE E9 - complex-vector-widetag ; EA F5 E2 ED - complex-array-widetag ; EE F9 E6 F1 - unused-array-widetag ; F2 FD EA F5 + simple-base-string-widetag ; D6 E1 \ + #+sb-unicode simple-character-string-widetag ; DA E5 | Strings + #-sb-unicode unused-simple-char-string ; | + ;; From here down commence the non-simple array types | + complex-base-string-widetag ; DE E9 | + #+sb-unicode complex-character-string-widetag ; E2 ED / + #-sb-unicode unused-complex-char-string + + complex-bit-vector-widetag ; E6 F1 + complex-vector-widetag ; EA F5 + complex-array-widetag ; EE F9 + unused-array-widetag ; F2 FD )) ;;; Map each widetag symbol to a string to go in 'tagnames.h'. @@ -347,12 +337,15 @@ ;; Asserting found (the string (second (assoc symbol *widetag-string-alist*)))) -;;; Check that INSTANCE and FUNCALLABLE-INSTANCE differ at exactly 1 bit. +;;; Check that INSTANCE and FUNCALLABLE-INSTANCE differ at exactly 1 bit +;;; and that FUNCALLABLE-INSTANCE is the larger of the two widetags. (eval-when (:compile-toplevel) - #-64-bit (assert (= (logxor instance-widetag funcallable-instance-widetag) - #b0100)) - #+64-bit (assert (= (logxor instance-widetag funcallable-instance-widetag) - #b1000))) + (assert (= (logcount (logand (logxor instance-widetag funcallable-instance-widetag) + lowtag-mask)) + 1)) + ;; Note: you must adjust FUNINSTANCE_SELECTOR_BIT_NUMBER (= 2) if the widetags change + (assert (= funcallable-instance-widetag + (logior instance-widetag (ash 1 2))))) (defconstant-eqx +function-widetags+ '#.(list funcallable-instance-widetag simple-fun-widetag closure-widetag) diff --git a/src/compiler/generic/type-vops.lisp b/src/compiler/generic/type-vops.lisp index 1306ec1d81..453e4e4ff7 100644 --- a/src/compiler/generic/type-vops.lisp +++ b/src/compiler/generic/type-vops.lisp @@ -163,6 +163,11 @@ (define-type-vop arrayp (simple-array-widetag + ;; TEST-TYPE can't figure out how to generate the most efficient code + ;; if there are gaps in the range of widetags. + ;; Hack it by stuffing in the "unused" widetags for #-sb-unicode. + #-sb-unicode unused-simple-char-string + #-sb-unicode unused-complex-char-string complex-array-widetag complex-vector-widetag . #.(append diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index 2236d115a4..75cc1d5357 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -444,13 +444,9 @@ static inline int instance_length(lispobj header) return (((unsigned int)header >> INSTANCE_LENGTH_SHIFT) & 0x3FFF) + extra; } -// One bit differentiates FUNCALLABLE_INSTANCE_WIDETAG from INSTANCE_WIDETAG. -// This is index of that bit. -#ifdef LISP_FEATURE_64_BIT -# define FUNINSTANCE_SELECTOR_BIT_NUMBER 3 -#else -# define FUNINSTANCE_SELECTOR_BIT_NUMBER 2 -#endif +// This is index of the bit that differentiates FUNCALLABLE_INSTANCE_WIDETAG +// from INSTANCE_WIDETAG. +#define FUNINSTANCE_SELECTOR_BIT_NUMBER 2 static inline boolean instanceoid_widetag_p(unsigned char widetag) { return (widetag | (1<<FUNINSTANCE_SELECTOR_BIT_NUMBER)) == FUNCALLABLE_INSTANCE_WIDETAG; } From 41eccddd438f2df21dd71272ba594af889c57fa6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 1 Jun 2022 13:24:31 -0400 Subject: [PATCH 3423/4023] Revert "Fix win32." This reverts commit 21a42e4d080db623136b9fc8a8826e6ee9956fe7. --- src/code/target-package.lisp | 1 - tests/block-compile.impure.lisp | 3 +-- tests/packages.impure.lisp | 10 ++++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 0eed27bc07..c865f5e7a6 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -1146,7 +1146,6 @@ implementation it is ~S." *!default-package-use-list*) ;; If a loader package exists, resolve it and have the ;; package-to-be renamed take on the resolved packages ;; symbols, so that it gets cleaned up. - #-win32 ; This leaves dangling weak pointers on win32... bug? (let ((loader-package (or (resolve-deferred-package name) (resolve-rehoming-package name)))) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index e3e6024191..d4b0819f67 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -102,8 +102,7 @@ (assert (eq (nth-value 1 (find-symbol "F" "BLOCK-DEFPACKAGE4")) :external))) -(with-test (:name :block-defpackage-rename-package - :fails-on :win32) +(with-test (:name :block-defpackage-rename-package) (ctu:file-compile `((eval-when (:compile-toplevel :load-toplevel :execute) (cond diff --git a/tests/packages.impure.lisp b/tests/packages.impure.lisp index 1e3618d51d..14cfb89220 100644 --- a/tests/packages.impure.lisp +++ b/tests/packages.impure.lisp @@ -1093,6 +1093,16 @@ if a restart was invoked." ;;; But not a global name of any package (assert-error (find-symbol "ZOOK" "SP")) (delete-package "SOMEPACKAGE") + ;; Assert that the local nickname vector has not yet removed the + ;; deleted package. DELETE-PACKAGE does not scan all packages to adjust + ;; their local nicknames. (There's no "locally nicknamed by" accessor so it + ;; definitely would need to visit all packages which I didn't like. + ;; It wouldn't be the worst thing, but I opted not to store a reverse lookup) + ;; Rather interestingly, this operation overwrites a words of the control stack + ;; that might otherwise randomly contain the very package that got deleted. + (assert (= (length (cdr (sb-impl::package-%local-nicknames + (find-package "MYPKG")))) + 2)) (sb-sys:scrub-control-stack) (gc :full t) (assert (not (weak-pointer-value *the-weak-ptr*))) From 670f18ce5e446d90397612359d504ee0ebbee244 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 1 Jun 2022 16:44:50 -0400 Subject: [PATCH 3424/4023] x86-64: convert more type-vops to flag setters --- src/compiler/generic/type-vops.lisp | 48 ++++------------------------- src/compiler/type-vop-macros.lisp | 43 ++++++++++++++++++++++++++ src/compiler/x86-64/type-vops.lisp | 46 +++++++++++++++++++++++++++ tests/typep-golden-data.txt | 30 +++++++++--------- 4 files changed, 110 insertions(+), 57 deletions(-) diff --git a/src/compiler/generic/type-vops.lisp b/src/compiler/generic/type-vops.lisp index 453e4e4ff7..2715e41b18 100644 --- a/src/compiler/generic/type-vops.lisp +++ b/src/compiler/generic/type-vops.lisp @@ -90,12 +90,8 @@ *specialized-array-element-type-properties*)))) (define-simple-array-type-vops)) -(macrolet - ((def () - `(define-type-vop simple-rank-1-array-*-p - ,(map 'list #'saetp-typecode - *specialized-array-element-type-properties*)))) - (def)) ; simple-rank-1-array-*-p +;;; Stupid name for this because SIMPLE-VECTOR means something else. +(define-type-vop simple-rank-1-array-*-p #.+simple-rank-1-array-widetags+) (define-type-vop system-area-pointer-p (sap-widetag)) @@ -117,10 +113,7 @@ (define-type-vop simple-array-header-p (simple-array-widetag)) -(define-type-vop stringp - (#+sb-unicode simple-character-string-widetag - #+sb-unicode complex-character-string-widetag - simple-base-string-widetag complex-base-string-widetag)) +(define-type-vop stringp #.+string-widetags+) (define-type-vop base-string-p (simple-base-string-widetag complex-base-string-widetag)) @@ -132,16 +125,7 @@ (define-type-vop character-string-p (simple-character-string-widetag complex-character-string-widetag)) -(define-type-vop vectorp - (complex-vector-widetag . - #.(append - (map 'list - #'saetp-typecode - *specialized-array-element-type-properties*) - (mapcan (lambda (saetp) - (when (saetp-complex-typecode saetp) - (list (saetp-complex-typecode saetp)))) - (coerce *specialized-array-element-type-properties* 'list))))) +(define-type-vop vectorp #.+vector-widetags+) ;;; Note that this "type VOP" is sort of an oddball; it doesn't so ;;; much test for a Lisp-level type as just expose a low-level type @@ -155,29 +139,9 @@ ;;; ordinary type VOPs. (define-type-vop complex-vector-p (complex-vector-widetag)) -(define-type-vop simple-array-p - (simple-array-widetag . - #.(map 'list - #'saetp-typecode - *specialized-array-element-type-properties*))) +(define-type-vop simple-array-p #.+simple-array-widetags+) -(define-type-vop arrayp - (simple-array-widetag - ;; TEST-TYPE can't figure out how to generate the most efficient code - ;; if there are gaps in the range of widetags. - ;; Hack it by stuffing in the "unused" widetags for #-sb-unicode. - #-sb-unicode unused-simple-char-string - #-sb-unicode unused-complex-char-string - complex-array-widetag - complex-vector-widetag . - #.(append - (map 'list - #'saetp-typecode - *specialized-array-element-type-properties*) - (mapcan (lambda (saetp) - (when (saetp-complex-typecode saetp) - (list (saetp-complex-typecode saetp)))) - (coerce *specialized-array-element-type-properties* 'list))))) +(define-type-vop arrayp #.+array-widetags+) (define-type-vop numberp (bignum-widetag diff --git a/src/compiler/type-vop-macros.lisp b/src/compiler/type-vop-macros.lisp index c8062f80ff..d17c5b670d 100644 --- a/src/compiler/type-vop-macros.lisp +++ b/src/compiler/type-vop-macros.lisp @@ -14,6 +14,49 @@ `(,unbound-marker-widetag ,character-widetag #+64-bit ,single-float-widetag) #'equal) +(defconstant-eqx +simple-rank-1-array-widetags+ + (map 'list #'saetp-typecode *specialized-array-element-type-properties*) + #'equal) + +(defconstant-eqx +vector-widetags+ + `(,complex-vector-widetag + #-sb-unicode ,unused-simple-char-string ; because of the contiguity assertion + #-sb-unicode ,unused-complex-char-string + ,@(append + (map 'list #'saetp-typecode *specialized-array-element-type-properties*) + (mapcan (lambda (saetp) + (when (saetp-complex-typecode saetp) + (list (saetp-complex-typecode saetp)))) + (coerce *specialized-array-element-type-properties* 'list)))) + #'equal) + +(defconstant-eqx +simple-array-widetags+ + `(,simple-array-widetag ,@+simple-rank-1-array-widetags+) + #'equal) + +(defconstant-eqx +array-widetags+ + `(,simple-array-widetag ,complex-array-widetag ,@+vector-widetags+) + #'equal) + +(defconstant-eqx +string-widetags+ + `(#+sb-unicode ,simple-character-string-widetag + #+sb-unicode ,complex-character-string-widetag + ,simple-base-string-widetag ,complex-base-string-widetag) + #'equal) + +#+sb-xc-host +(flet ((check (list) + ;; Assert that LIST is a contiguous range of widetags + (let* ((sorted (sort (copy-list list) #'<)) + (min (first sorted)) + (max (car (last sorted)))) + (assert (equal sorted (loop for w from min to max by 4 collect w)))))) + (check +simple-rank-1-array-widetags+) + (check +vector-widetags+) + (check +simple-array-widetags+) + (check +array-widetags+) + #+sb-unicode (check +string-widetags+)) ; they're discontiguous if #-sb-unicode + ;; Given a list of widetags in HEADERS, compress into a minimal list of ranges ;; and/or singletons that should be tested. ;; FIXME: At present the "is it effectively a one-sided test" is re-implemented diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 7832f365ab..85915d9520 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -529,6 +529,52 @@ (define fdefn-p (fdefn-widetag)) (define simple-array-header-p (simple-array-widetag)) (define complex-vector-p (complex-vector-widetag))) + +(macrolet ((fail-if-not-otherptr () + `(cond ((other-pointer-tn-ref-p value-tn-ref) + (inst mov :byte temp (ea (- other-pointer-lowtag) value))) + (t + (inst lea temp (ea (- other-pointer-lowtag) value)) + (inst test :byte temp lowtag-mask) + ;; TEST clears the Carry, so if this jump occurs, + ;; it returns the correct answer for the vops that return + ;; their result in Z or C. + (inst jmp :nz out) + (inst mov :byte temp (ea temp)))))) + #+sb-unicode + (macrolet ((define (name (simple nonsimple)) + (aver (= (logior 8 (symbol-value simple)) (symbol-value nonsimple))) + `(define-vop (,name type-predicate) + (:translate ,name) + (:info) ; nullify the info + (:conditional :z) + (:args-var value-tn-ref) + (:generator 4 + (fail-if-not-otherptr) + (inst or :byte temp 8) + (inst cmp :byte temp ,nonsimple) + out)))) + (define base-string-p (simple-base-string-widetag complex-base-string-widetag)) + (define character-string-p + (simple-character-string-widetag complex-character-string-widetag))) + (macrolet ((define (name widetags) + (let* ((widetags (symbol-value widetags)) + (min (reduce #'min widetags)) + (max (reduce #'max widetags))) + `(define-vop (,name type-predicate) + (:translate ,name) + (:info) + (:conditional :c) ; Carry flag = "below" (unsigned) + (:args-var value-tn-ref) + (:generator 4 + (fail-if-not-otherptr) + (inst sub :byte temp ,min) + (inst cmp :byte temp ,(1+ (- max min))) + OUT))))) + (define simple-rank-1-array-*-p +simple-rank-1-array-widetags+) + (define vectorp +vector-widetags+) + (define simple-array-p +simple-array-widetags+) + #+sb-unicode (define stringp +string-widetags+))) ;;;; list/symbol types ;;; diff --git a/tests/typep-golden-data.txt b/tests/typep-golden-data.txt index cbaf1bbee5..8889338c4d 100644 --- a/tests/typep-golden-data.txt +++ b/tests/typep-golden-data.txt @@ -357,8 +357,8 @@ 9 (NOT (MEMBER T)) 14 (NOT (SATISFIES KEYWORDP)) ! 16 (NOT (SATISFIES LEGAL-FUN-NAME-P)) - 15 (NOT (VECTOR CHARACTER)) - 15 (NOT BASE-STRING) + 14 (NOT (VECTOR CHARACTER)) + 14 (NOT BASE-STRING) 16 (NOT BIT-VECTOR) 9 (NOT CHARACTER) 13 (NOT COMPILED-FUNCTION) @@ -371,11 +371,11 @@ 10 (NOT INSTANCE) 13 (NOT INTERPRETED-FUNCTION) ! 16 (NOT REDEFINITION-WARNING) - 15 (NOT SIMPLE-ARRAY) + 14 (NOT SIMPLE-ARRAY) 12 (NOT SIMPLE-VECTOR) - 15 (NOT STRING) + 14 (NOT STRING) 14 (NOT SYMBOL) - 15 (NOT VECTOR) + 14 (NOT VECTOR) 31 (OR (CONS (MEMBER FUNCTION FUNCTION-DESIGNATOR SB-C::MODIFYING SB-C::INHIBIT-FLUSHING)) (MEMBER TYPE-SPECIFIER SB-C::PROPER-SEQUENCE SB-C::PROPER-LIST SB-C::PROPER-OR-DOTTED-LIST SB-C::PROPER-OR-CIRCULAR-LIST)) 21 (OR (ALIEN SB-UNIX:UNIX-OFFSET) (MEMBER NIL :START :END)) 20 (OR (CONS (EQL DECLARE)) STRING) @@ -420,14 +420,14 @@ 15 (OR (UNSIGNED-BYTE 32) SB-C:FIXUP) 24 (OR (UNSIGNED-BYTE 64)) 17 (OR (VECTOR CHARACTER) BASE-STRING (MEMBER :WILD)) - 15 (OR (VECTOR CHARACTER) BASE-STRING (MEMBER)) + 14 (OR (VECTOR CHARACTER) BASE-STRING (MEMBER)) 22 (OR (VECTOR CHARACTER) BASE-STRING CHARACTER PACKAGE) 17 (OR (VECTOR CHARACTER) BASE-STRING CHARACTER) 32 (OR (VECTOR CHARACTER) BASE-STRING NUMBER BIT-VECTOR PATHNAME) 21 (OR (VECTOR CHARACTER) BASE-STRING PATHNAME) 23 (OR (VECTOR CHARACTER) BASE-STRING HOST (MEMBER :UNSPECIFIC)) 35 (OR ARRAY CONS NUMBER CHARACTER STRUCTURE-OBJECT) - 15 (OR BASE-STRING (VECTOR CHARACTER)) + 14 (OR BASE-STRING (VECTOR CHARACTER)) 18 (OR BIGNUM RATIO) 19 (OR BOOLEAN KEYWORD) 12 (OR BOOLEAN) @@ -556,7 +556,7 @@ 28 (OR SYMBOL NUMBER STRING) 20 (OR SYMBOL WRAPPER) 22 (OR UNSIGNED-BYTE) - 15 (OR VECTOR (MEMBER)) + 14 (OR VECTOR (MEMBER)) ! 23 (OR WARNING ERROR) 24 (OR WORD SB-VM:SIGNED-WORD) 6 (OR) @@ -605,9 +605,9 @@ 12 (SIMPLE-ARRAY (UNSIGNED-BYTE 8) (*)) 16 (SIMPLE-ARRAY (UNSIGNED-BYTE 8) (512)) 29 (SIMPLE-ARRAY (UNSIGNED-BYTE 8)) - 15 (SIMPLE-ARRAY * (*)) + 14 (SIMPLE-ARRAY * (*)) 23 (SIMPLE-ARRAY * (0)) - 15 (SIMPLE-ARRAY * 1) + 14 (SIMPLE-ARRAY * 1) 12 (SIMPLE-ARRAY BASE-CHAR (*)) 12 (SIMPLE-ARRAY CHARACTER (*)) 16 (SIMPLE-ARRAY CHARACTER (512)) @@ -646,12 +646,12 @@ 9 (UNSIGNED-BYTE 8) 22 (UNSIGNED-BYTE) 27 (VECTOR * 0) - 15 (VECTOR CHARACTER) + 14 (VECTOR CHARACTER) ! 5 (VECTOR T) 13 ARRAY 13 ATOM 10 BASE-CHAR - 15 BASE-STRING + 14 BASE-STRING 12 BIGNUM 9 BIT 16 BIT-VECTOR @@ -706,7 +706,7 @@ 9 SHORT-FLOAT 13 SIMD-PACK 13 SIMD-PACK-256 - 15 SIMPLE-ARRAY + 14 SIMPLE-ARRAY 12 SIMPLE-BASE-STRING 12 SIMPLE-BIT-VECTOR 15 SIMPLE-STRING @@ -715,9 +715,9 @@ ! 5 STANDARD-CHAR ! 6 STANDARD-CLASS ! 6 STANDARD-GENERIC-FUNCTION - 15 STRING + 14 STRING ! 6 STRUCTURE-CLASS 6 T 22 UNSIGNED-BYTE - 15 VECTOR + 14 VECTOR 24 WORD From df539fc60259daf3683221677205cbe9d62f318c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 1 Jun 2022 18:37:43 -0400 Subject: [PATCH 3425/4023] Make murmur3-fmix easier to use Don't require all the +/- based on word size. --- src/code/string-hash.lisp | 26 +++++++++++++++++++------- src/code/target-sxhash.lisp | 20 ++------------------ tests/hash.pure.lisp | 25 +++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/code/string-hash.lisp b/src/code/string-hash.lisp index 0d47bccabb..c28c95977b 100644 --- a/src/code/string-hash.lisp +++ b/src/code/string-hash.lisp @@ -142,24 +142,37 @@ ;;; Please excuse the C-like syle. #-64-bit (progn -(declaim (maybe-inline murmur3-fmix32)) +(declaim (inline murmur3-fmix32)) (defun murmur3-fmix32 (h) - (declare (type (unsigned-byte 32) h)) + (declare (type sb-vm:word h)) (setq h (logxor h (ash h -16))) (setq h (logand (* h #x85ebca6b) #.most-positive-word)) (setq h (logxor h (ash h -13))) (setq h (logand (* h #xc2b2ae35) #.most-positive-word)) - (logxor h (ash h -16)))) + (logxor h (ash h -16))) +(defmacro murmur3-fmix-word (x) `(murmur3-fmix32 ,x))) #+64-bit (progn -(declaim (maybe-inline murmur3-fmix64)) +(declaim (inline murmur3-fmix64)) (defun murmur3-fmix64 (k) + (declare (type sb-vm:word k)) (setq k (logxor k (ash k -33))) (setq k (logand (* k #xff51afd7ed558ccd) most-positive-word)) (setq k (logxor k (ash k -33))) (setq k (logand (* k #xc4ceb9fe1a85ec53) most-positive-word)) - (logxor k (ash k -33)))) + (logxor k (ash k -33))) +(defmacro murmur3-fmix-word (x) `(murmur3-fmix64 ,x))) + +(defun murmur-fmix-word (x) + (murmur3-fmix-word (truly-the sb-vm:word x))) +(export 'murmur-fmix-word) ; for unit testing vs C code + +;;; The "good" hash function on sb-vm:word returns a fixnum, does not cons, +;;; and has better avalanche behavior then SXHASH - changing any one input bit +;;; should affect each bit of output with equal chance. +(defun good-hash-word->fixnum (x) + (logand (murmur3-fmix-word (truly-the sb-vm:word x)) most-positive-fixnum)) ;;;; support for the hash values used by CLOS when working with LAYOUTs @@ -188,8 +201,7 @@ (let ((limit (1+ (ash most-positive-fixnum -1)))) (declare (notinline random)) (logior (if (typep name '(and symbol (not null))) - (flet ((improve-hash (x) - (#+64-bit murmur3-fmix64 #-64-bit murmur3-fmix32 x))) + (flet ((improve-hash (x) (murmur3-fmix-word x))) (mix (logand (improve-hash (sb-impl::%sxhash-simple-string (symbol-name name))) most-positive-fixnum) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 28cba5a89e..291771cea7 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -90,8 +90,6 @@ ;;; that's what I'm going with. ;;; (defun %instance-sxhash (instance) - ;; to avoid consing in fmix - (declare (inline #+64-bit murmur3-fmix64 #-64-bit murmur3-fmix32)) ;; LAYOUT must not acquire an extra slot for the stable hash, ;; because the bitmap length is derived from the instance length. ;; It would probably be simple to eliminate this as a special case @@ -113,8 +111,7 @@ #+sb-thread (%primitive sb-vm::set-instance-hashed instance)) (get-lisp-obj-address instance)))) ;; perturb the address - (logand (#+64-bit murmur3-fmix64 #-64-bit murmur3-fmix32 addr) - most-positive-fixnum))) + (logand (murmur3-fmix-word addr) most-positive-fixnum))) (declaim (inline instance-sxhash)) (defun instance-sxhash (instance) @@ -297,8 +294,7 @@ ;; so we should pick off SYMBOL sooner than INSTANCE as well. ;; * INSTANCE (except for PATHNAME) doesn't recurse anyway - in fact ;; it is particularly dumb (by design), so performing that test later - ;; doesn't incur much of a penalty. And our users probably know that - ;; SXHASH on instance doesn't really do anything. + ;; doesn't incur much of a penalty. ;; Anyway, afaiu, the code below was previously ordered by gut feeling ;; rather than than actual measurement, so having any rationale for ordering ;; is better than having no rationale. And as a further comment observes, @@ -590,18 +586,6 @@ (recurse (cdr x) (1- depthoid))))))) (traverse 0 name 10)))) -;;; These "good" hashers act on sb-vm:word, returning a fixnum, do not cons, -;;; and have better avalanche behavior then SXHASH - changing any one input bit -;;; should affect each bit of output with equal chance. -#+64-bit -(defun good-hash-word->fixnum (x) - (declare (inline murmur3-fmix64)) - (logand (murmur3-fmix64 (truly-the sb-vm:word x)) most-positive-fixnum)) -#-64-bit -(defun good-hash-word->fixnum (x) - (declare (inline murmur3-fmix32)) - (logand (murmur3-fmix32 (truly-the sb-vm:word x)) most-positive-fixnum)) - ;;; Not needed post-build (clear-info :function :inlining-data '%sxhash-simple-substring) diff --git a/tests/hash.pure.lisp b/tests/hash.pure.lisp index e27aef3710..9e13ad35ab 100644 --- a/tests/hash.pure.lisp +++ b/tests/hash.pure.lisp @@ -478,3 +478,28 @@ (setq combined (logand combined hash)))) (sb-kernel:classoid-subclasses (sb-kernel:find-classoid 't))) (assert (/= 0 combined)))) + +(defun c-murmur-fmix (word) + (declare (type sb-vm:word word)) + (alien-funcall (extern-alien #+64-bit "murmur3_fmix64" + #-64-bit "murmur3_fmix32" + (function unsigned unsigned)) + word)) +(compile 'c-murmur-fmix) +;;; Assert that the Lisp translation of the C murmur hash matches. +;;; This is slightly redundant with the :ADDRESS-BASED-SXHASH-GCING test, +;;; though this one is a strictly a unit test of the hashing function, +;;; and the other is a test that GC does the right thing. +;;; So it's not a bad idea to have both. +(defun murmur-compare (random-state n-iter) + (let ((limit (1+ sb-ext:most-positive-word))) + (loop repeat (the fixnum n-iter) + do + (let* ((n (random limit random-state)) + (lisp-hash (sb-impl::murmur-fmix-word n)) + (c-hash (c-murmur-fmix n))) + (assert (= lisp-hash c-hash)))))) +(compile 'murmur-compare) + +(with-test (:name :mumur-hash-compare) + (murmur-compare (make-random-state t) 100000)) From a4ea196d4814a67403ddcbee874748a72646705c Mon Sep 17 00:00:00 2001 From: Robert Smith <rssmith@hrl.com> Date: Thu, 26 May 2022 21:00:42 -0700 Subject: [PATCH 3426/4023] improve SB-GMP and SB-MPFR This patch makes the following improvements: - Added a more descriptive warning when MPFR cannot be loaded - libmpfr.so.6 is added to the options, since that is on recent Linuxes - SB-MPFR:COERCE now allows MPFR-FLOATs to be converted to a Lisp RATIONAL - Convenient utility functions are added for internal use for converting from GMP/MPFR representations to Lisp representations easily - Starts with SB-RT tests of SB-MPFR --- contrib/sb-gmp/gmp.lisp | 23 +++++++++++++++++++++++ contrib/sb-mpfr/mpfr.lisp | 23 ++++++++++++++++++++--- contrib/sb-mpfr/sb-mpfr.asd | 2 +- contrib/sb-mpfr/tests.lisp | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 4 deletions(-) diff --git a/contrib/sb-gmp/gmp.lisp b/contrib/sb-gmp/gmp.lisp index 1a4ad4505b..681d299ba3 100644 --- a/contrib/sb-gmp/gmp.lisp +++ b/contrib/sb-gmp/gmp.lisp @@ -428,6 +428,16 @@ pre-allocated bignum. The allocated bignum-length must be (1+ COUNT)." ,@clears (values ,@results))))))) +(defun mpz->bignum (z) + "Convert a GMP MPZ Z into a Lisp BIGNUM." + (let* ((size (abs (sb-alien:slot z 'mp_size))) + (neg? (minusp (sb-alien:slot z 'mp_size))) + (bigint (allocate-bignum (1+ size)))) + (sb-sys:with-pinned-objects (bigint) + (* (if neg? -1 1) + (gmp-z-to-bignum (slot z 'mp_d) bigint size))))) + + ;;; function definition and foreign function relationships (defmacro defgmpfun (name args &body body) `(progn @@ -766,6 +776,19 @@ pre-allocated bignum. The allocated bignum-length must be (1+ COUNT)." (bignum-data-sap ad)) ,@body)))))) +(defun mpq->rational (q) + "Convert a GMP MPQ into a Lisp RATIONAL." + (sb-kernel:build-ratio (mpz->bignum (slot q 'mp_num)) + (mpz->bignum (slot q 'mp_den)))) + +(declaim (inline __gmpq_init)) +(define-alien-routine __gmpq_init void + (x (* (struct gmprat)))) + +(declaim (inline __gmpq_clear)) +(define-alien-routine __gmpq_clear void + (x (* (struct gmprat)))) + (defmacro defmpqfun (name gmpfun) `(progn (declaim (sb-ext:maybe-inline ,name)) diff --git a/contrib/sb-mpfr/mpfr.lisp b/contrib/sb-mpfr/mpfr.lisp index 893734254c..3aa89d4a83 100644 --- a/contrib/sb-mpfr/mpfr.lisp +++ b/contrib/sb-mpfr/mpfr.lisp @@ -198,10 +198,11 @@ (defun %load-mpfr () (or (some #'try-load-shared-object - #-(or win32 darwin) '("libmpfr.so" "libmpfr.so.4") - #+darwin '("libmpfr.dylib" "libmpfr.4.dylib") + #-(or win32 darwin) '("libmpfr.so" "libmpfr.so.4" "libmpfr.so.6") + #+darwin '("libmpfr.dylib" "libmpfr.4.dylib" "libmpfr.6.dylib") #+win32 '("mpfr.dll")) - (warn "MPFR not loaded."))) + (warn "MPFR was not loaded. This is likely because the shared library ~ + was not found."))) (defun load-mpfr (&key (persistently t)) (setf *mpfr-version* nil @@ -1783,6 +1784,19 @@ (x (* (struct mpfrfloat))) (rnd mpfr_rnd_enum)) +(declaim (inline mpfr_get_q)) +(define-alien-routine mpfr_get_q void + (rop (* (struct sb-gmp::gmprat))) + (op (* (struct mpfrfloat)))) + +(defun mpfrfloat->rational (f) + "Convert a raw MPFRFLOAT F into a CL:RATIONAL." + (with-alien ((q (struct sb-gmp::gmprat))) + (sb-gmp::__gmpq_init (addr q)) + (mpfr_get_q (addr q) f) + (prog1 (sb-gmp::mpq->rational q) + (sb-gmp::__gmpq_clear (addr q))))) + (defun coerce (x type &optional (round *mpfr-rnd*)) (cond ((typep x 'mpfr-float) @@ -1792,6 +1806,9 @@ (mpfr_get_flt x-ref round)) (double-float (mpfr_get_d x-ref round)) + (rational + ;; this will always be exact + (mpfrfloat->rational x-ref)) (mpfr-float (let ((result (make-mpfr-float))) (mpfr_set (mpfr-float-ref result) x-ref round) diff --git a/contrib/sb-mpfr/sb-mpfr.asd b/contrib/sb-mpfr/sb-mpfr.asd index 867722a9de..b4e98f23ba 100644 --- a/contrib/sb-mpfr/sb-mpfr.asd +++ b/contrib/sb-mpfr/sb-mpfr.asd @@ -19,7 +19,7 @@ (if (not (member :sb-mpfr *features*)) (warn "unable to test sb-mpfr: libmpfr unavailable") (multiple-value-bind (soft strict pending) - (funcall (intern "DO-TESTS" (find-package "SB-RT"))) + (funcall (find-symbol "DO-TESTS" "SB-RT")) (declare (ignorable pending)) (fresh-line) (unless strict diff --git a/contrib/sb-mpfr/tests.lisp b/contrib/sb-mpfr/tests.lisp index 700b996d23..171c435bf1 100644 --- a/contrib/sb-mpfr/tests.lisp +++ b/contrib/sb-mpfr/tests.lisp @@ -26,3 +26,36 @@ (defun sample-pi () (sb-mpfr:set-precision 400) (sb-mpfr:const-pi)) + + +;;; Test that (sb-mpfr:coerce * 'rational) works + +(defvar *roundtrip-precision* 100) + +(defun rational-roundtrip (rat) + (sb-mpfr:with-precision *roundtrip-precision* + (let* ((f (sb-mpfr:coerce rat 'sb-mpfr:mpfr-float)) + (frat (sb-mpfr:coerce f 'rational))) + frat))) + +(macrolet ((%write-out-idempotence-tests (&rest rationals) + `(progn + ,@(loop :for rat :in rationals + :collect `(deftest + ;; name + ,(intern (format nil "TEST-RATIONALIZE-~A" rat)) + ;; form to test + (<= (abs (- ,rat (rational-roundtrip ,rat))) + (expt 2 (- *roundtrip-precision*))) + ;; result + t))))) + (%write-out-idempotence-tests + 1/2 + 1/4 + 1/8 + 1/16 + (+ 1/2 1/4 1/8) + 355/113 + pi + (exp 1) + (sqrt 2))) From 7cd0417b6f98b660813f97173e41aa6dbb0df660 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 2 Jun 2022 15:38:37 +0300 Subject: [PATCH 3427/4023] Add type derivers for string inequality functions. --- src/compiler/seqtran.lisp | 51 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index b0fa670663..bd8e55dccf 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1082,6 +1082,57 @@ (def string-greaterp) (def string-lessp)) +(defun string-cmp-deriver (string1 string2 start1 end1 start2 end2) + (flet ((dims (string start end) + (let* ((type (lvar-type string)) + (length (vector-type-length type)) + (start (cond ((not start) + 0) + ((constant-lvar-p start) + (lvar-value start)))) + (end (or (if (and end + (constant-lvar-p end)) + (lvar-value end)) + length))) + (values + start + end + (and start end + (- end start)))))) + (multiple-value-bind (start1 end1) + (dims string1 start1 end1) + (let (low + high + (length2 (nth-value 2 (dims string2 start2 end2)))) + (when start1 + (setf low start1)) + (when end1 + (setf high end1)) + (when (and length2 start1) + (let ((high2 (1- (+ start1 length2)))) + (when (or (not high) + (> high high2)) + (setf high high2)))) + (when (or low high) + (specifier-type `(or (integer ,(or low '*) + ,(or high '*)) + null))))))) + +(macrolet ((def (name) + `(defoptimizer (,name derive-type) ((string1 string2 start1 end1 start2 end2)) + (string-cmp-deriver string1 string2 start1 end1 start2 end2)))) + (def string<*) + (def string>*) + (def string<=*) + (def string>=*) + (def %sp-string-compare)) + +(macrolet ((def (name) + `(defoptimizer (,name derive-type) ((string1 string2 &key start1 end1 start2 end2)) + (string-cmp-deriver string1 string2 start1 end1 start2 end2)))) + (def string-greaterp) + (def string-lessp)) + (deftransform string ((x) (symbol)) '(symbol-name x)) (deftransform string ((x) (string)) '(progn x)) From b6e5cd1c308a1ae1f23834b1416a280c0839bb8b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 2 Jun 2022 16:17:58 +0300 Subject: [PATCH 3428/4023] Add type derivers for string/= string-not-equal. --- src/compiler/seqtran.lisp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index bd8e55dccf..0d05261437 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1082,7 +1082,7 @@ (def string-greaterp) (def string-lessp)) -(defun string-cmp-deriver (string1 string2 start1 end1 start2 end2) +(defun string-cmp-deriver (string1 string2 start1 end1 start2 end2 &optional equality) (flet ((dims (string start end) (let* ((type (lvar-type string)) (length (vector-type-length type)) @@ -1099,7 +1099,7 @@ end (and start end (- end start)))))) - (multiple-value-bind (start1 end1) + (multiple-value-bind (start1 end1 length1) (dims string1 start1 end1) (let (low high @@ -1114,24 +1114,32 @@ (> high high2)) (setf high high2)))) (when (or low high) - (specifier-type `(or (integer ,(or low '*) - ,(or high '*)) - null))))))) - -(macrolet ((def (name) + (let ((type (make-numeric-type :class 'integer :high high :low low))) + (if (and equality length1 length2 + (/= length1 length2)) + (if (eq equality '%sp-string-compare) + (make-values-type :required + (list type + (specifier-type '(and integer (not (eql 0)))))) + type) + (type-union type + (specifier-type 'null))))))))) + +(macrolet ((def (name &optional equality) `(defoptimizer (,name derive-type) ((string1 string2 start1 end1 start2 end2)) - (string-cmp-deriver string1 string2 start1 end1 start2 end2)))) + (string-cmp-deriver string1 string2 start1 end1 start2 end2 ,equality)))) (def string<*) (def string>*) (def string<=*) (def string>=*) - (def %sp-string-compare)) + (def %sp-string-compare '%sp-string-compare)) -(macrolet ((def (name) +(macrolet ((def (name &optional equality) `(defoptimizer (,name derive-type) ((string1 string2 &key start1 end1 start2 end2)) - (string-cmp-deriver string1 string2 start1 end1 start2 end2)))) + (string-cmp-deriver string1 string2 start1 end1 start2 end2 ,equality)))) (def string-greaterp) - (def string-lessp)) + (def string-lessp) + (def string-not-equal t)) (deftransform string ((x) (symbol)) '(symbol-name x)) (deftransform string ((x) (string)) '(progn x)) From d758feba0ee8d5e8cd13639dddfdc6008bb8c68a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 2 Jun 2022 16:26:16 +0300 Subject: [PATCH 3429/4023] Add derive-type for string-case functions. --- src/compiler/fndb.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 899d58b96f..c27d81f88f 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -1260,7 +1260,8 @@ (string-designator &key (:start (inhibit-flushing index 0)) (:end (inhibit-flushing sequence-end nil))) - simple-string (flushable)) + simple-string (flushable) + :derive-type (sequence-result-nth-arg 1 :preserve-dimensions t)) (defknown (nstring-upcase nstring-downcase nstring-capitalize) ((modifying string) &key (:start index) (:end sequence-end)) From e694b42ed7b8b6cc3cf6c5aca3cbadce35cbc917 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 2 Jun 2022 16:33:10 +0300 Subject: [PATCH 3430/4023] Make the nth-arg functions in fndb use zero-based offsets. Just like nth. How did it even make sense before? --- src/compiler/fndb.lisp | 36 ++++++++++++++++++------------------ src/compiler/knownfun.lisp | 6 +++--- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index c27d81f88f..8020268148 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -19,7 +19,7 @@ ;; Note: ;; This is not FLUSHABLE because it's defined to signal errors. (movable) - ;; :DERIVE-TYPE RESULT-TYPE-SPEC-NTH-ARG 2 ? Nope... (COERCE 1 'COMPLEX) + ;; :DERIVE-TYPE RESULT-TYPE-SPEC-NTH-ARG 1 ? Nope... (COERCE 1 'COMPLEX) ;; returns REAL/INTEGER, not COMPLEX. ) ;; These each check their input sequence for type-correctness, @@ -517,15 +517,15 @@ (flushable)) (defknown copy-seq (proper-sequence) consed-sequence (flushable) - :derive-type (sequence-result-nth-arg 1 :preserve-dimensions t)) + :derive-type (sequence-result-nth-arg 0 :preserve-dimensions t)) (defknown length (proper-sequence) index (foldable flushable dx-safe)) (defknown reverse (proper-sequence) consed-sequence (flushable) - :derive-type (sequence-result-nth-arg 1 :preserve-dimensions t)) + :derive-type (sequence-result-nth-arg 0 :preserve-dimensions t)) (defknown nreverse ((modifying sequence)) sequence (important-result) - :derive-type (sequence-result-nth-arg 1 :preserve-dimensions t + :derive-type (sequence-result-nth-arg 0 :preserve-dimensions t :preserve-vector-type t)) (defknown make-sequence (type-specifier index @@ -533,10 +533,10 @@ (:initial-element t)) consed-sequence (movable) - :derive-type (creation-result-type-specifier-nth-arg 1)) + :derive-type (creation-result-type-specifier-nth-arg 0)) (defknown concatenate (type-specifier &rest proper-sequence) consed-sequence () - :derive-type (creation-result-type-specifier-nth-arg 1)) + :derive-type (creation-result-type-specifier-nth-arg 0)) (defknown %concatenate-to-string (&rest sequence) simple-string (flushable no-verify-arg-count)) @@ -633,7 +633,7 @@ (:key (function-designator ((nth-arg 1 :sequence t))))) consed-sequence (flushable call) - :derive-type (sequence-result-nth-arg 2)) + :derive-type (sequence-result-nth-arg 1)) (defknown substitute (t t proper-sequence &rest t &key (:from-end t) @@ -645,7 +645,7 @@ (:key (function-designator ((nth-arg 2 :sequence t))))) consed-sequence (flushable call) - :derive-type (sequence-result-nth-arg 3)) + :derive-type (sequence-result-nth-arg 2)) (defknown (remove-if remove-if-not) ((function-designator ((nth-arg 1 :sequence t :key :key))) proper-sequence @@ -656,7 +656,7 @@ (:key (function-designator ((nth-arg 1 :sequence t))))) consed-sequence (flushable call) - :derive-type (sequence-result-nth-arg 2)) + :derive-type (sequence-result-nth-arg 1)) (defknown (substitute-if substitute-if-not) (t (function-designator ((nth-arg 2 :sequence t :key :key))) proper-sequence @@ -667,7 +667,7 @@ (:key (function-designator ((nth-arg 2 :sequence t))))) consed-sequence (flushable call) - :derive-type (sequence-result-nth-arg 3)) + :derive-type (sequence-result-nth-arg 2)) (defknown delete (t (modifying sequence) &rest t &key (:from-end t) @@ -678,7 +678,7 @@ (:key (function-designator ((nth-arg 1 :sequence t))))) sequence (call important-result) - :derive-type (sequence-result-nth-arg 2)) + :derive-type (sequence-result-nth-arg 1)) (defknown nsubstitute (t t (modifying sequence) &rest t &key (:from-end t) @@ -689,7 +689,7 @@ (:key (function-designator ((nth-arg 2 :sequence t))))) sequence (call) - :derive-type (sequence-result-nth-arg 3)) + :derive-type (sequence-result-nth-arg 2)) (defknown (delete-if delete-if-not) ((function-designator ((nth-arg 1 :sequence t :key :key))) (modifying sequence) @@ -698,7 +698,7 @@ (:key (function-designator ((nth-arg 1 :sequence t))))) sequence (call important-result) - :derive-type (sequence-result-nth-arg 2)) + :derive-type (sequence-result-nth-arg 1)) (defknown (nsubstitute-if nsubstitute-if-not) (t (function-designator ((nth-arg 2 :sequence t :key :key))) (modifying sequence) @@ -707,7 +707,7 @@ (:key (function-designator ((nth-arg 2 :sequence t))))) sequence (call) - :derive-type (sequence-result-nth-arg 3)) + :derive-type (sequence-result-nth-arg 2)) (defknown remove-duplicates (proper-sequence &rest t &key @@ -721,7 +721,7 @@ (:key (function-designator ((nth-arg 0 :sequence t))))) consed-sequence (flushable call) - :derive-type (sequence-result-nth-arg 1)) + :derive-type (sequence-result-nth-arg 0)) (defknown delete-duplicates ((modifying sequence) @@ -735,7 +735,7 @@ (:key (function-designator ((nth-arg 0 :sequence t))))) sequence (call important-result) - :derive-type (sequence-result-nth-arg 1)) + :derive-type (sequence-result-nth-arg 0)) (defknown find (t proper-sequence &rest t &key @@ -857,7 +857,7 @@ (nth-arg 2 :sequence t)))))) sequence (call important-result) - :derive-type (creation-result-type-specifier-nth-arg 1)) + :derive-type (creation-result-type-specifier-nth-arg 0)) (defknown read-sequence ((modifying sequence) stream &key @@ -1261,7 +1261,7 @@ (:start (inhibit-flushing index 0)) (:end (inhibit-flushing sequence-end nil))) simple-string (flushable) - :derive-type (sequence-result-nth-arg 1 :preserve-dimensions t)) + :derive-type (sequence-result-nth-arg 0 :preserve-dimensions t)) (defknown (nstring-upcase nstring-downcase nstring-capitalize) ((modifying string) &key (:start index) (:end sequence-end)) diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index 0a7625eef1..a43a65317b 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -327,7 +327,7 @@ preserve-vector-type) (lambda (call) (declare (type combination call)) - (let ((lvar (nth (1- n) (combination-args call)))) + (let ((lvar (nth n (combination-args call)))) (when lvar (let ((type (lvar-type lvar))) (cond ((simplify-list-type type @@ -349,7 +349,7 @@ (defun result-type-specifier-nth-arg (n) (lambda (call) (declare (type combination call)) - (let ((lvar (nth (1- n) (combination-args call)))) + (let ((lvar (nth n (combination-args call)))) (when (and lvar (constant-lvar-p lvar)) (careful-specifier-type (lvar-value lvar)))))) @@ -367,7 +367,7 @@ (defun creation-result-type-specifier-nth-arg (n) (lambda (call) (declare (type combination call)) - (let ((lvar (nth (1- n) (combination-args call)))) + (let ((lvar (nth n (combination-args call)))) (when (and lvar (constant-lvar-p lvar)) (let* ((specifier (lvar-value lvar)) (lspecifier (if (atom specifier) (list specifier) specifier))) From 3965dabb1411a54bbacd7fdfad336c2ddffd29d4 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 2 Jun 2022 19:29:07 +0300 Subject: [PATCH 3431/4023] Add stubs for signed-byte-8-32-p. --- src/code/pred.lisp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/code/pred.lisp b/src/code/pred.lisp index 720c2bad86..f58edc7878 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -126,10 +126,15 @@ (def-type-predicate-wrapper system-area-pointer-p) (def-type-predicate-wrapper unbound-marker-p) (def-type-predicate-wrapper weak-pointer-p) - #-64-bit - (progn - (def-type-predicate-wrapper unsigned-byte-32-p) + + (sb-c::when-vop-existsp (:translate signed-byte-8-p) + (def-type-predicate-wrapper signed-byte-8-p)) + (sb-c::when-vop-existsp (:translate signed-byte-16-p) + (def-type-predicate-wrapper signed-byte-16-p)) + (sb-c::when-vop-existsp (:translate signed-byte-32-p) (def-type-predicate-wrapper signed-byte-32-p)) + #-64-bit + (def-type-predicate-wrapper unsigned-byte-32-p) #+64-bit (progn (def-type-predicate-wrapper unsigned-byte-64-p) From 1c380f824234561e257377337353e1d7c9994237 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 2 Jun 2022 19:29:34 +0300 Subject: [PATCH 3432/4023] Transform to signed-byte-8-32-p via define-type-predicate. --- src/compiler/generic/vm-typetran.lisp | 10 ++++++++-- src/compiler/typetran.lisp | 13 ------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/compiler/generic/vm-typetran.lisp b/src/compiler/generic/vm-typetran.lisp index 5d5f7c309e..130997e05d 100644 --- a/src/compiler/generic/vm-typetran.lisp +++ b/src/compiler/generic/vm-typetran.lisp @@ -97,10 +97,16 @@ #+sb-unicode (define-type-predicate simple-character-string-p (simple-array character (*))) (define-type-predicate system-area-pointer-p system-area-pointer) + +(when-vop-existsp (:translate signed-byte-8-p) + (define-type-predicate signed-byte-8-p (signed-byte 8))) +(when-vop-existsp (:translate signed-byte-16-p) + (define-type-predicate signed-byte-16-p (signed-byte 16))) + #-64-bit (define-type-predicate unsigned-byte-32-p (unsigned-byte 32)) -#-64-bit -(define-type-predicate signed-byte-32-p (signed-byte 32)) +(when-vop-existsp (:translate signed-byte-32-p) + (define-type-predicate signed-byte-32-p (signed-byte 32))) #+64-bit (define-type-predicate unsigned-byte-64-p (unsigned-byte 64)) #+64-bit diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 7b6578abcc..d4df26c26e 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -326,19 +326,6 @@ ;; in %SOURCE-TRANSFORM-TYPEP, but even if it wasn't, ;; the OR will drop out due to constraint propagation. `(or (eq ,object ,low) (eq ,object ,high))) - ((and (eq type (specifier-type '(signed-byte 8))) - (vop-existsp :translate signed-byte-8-p)) - `(signed-byte-8-p ,object)) - ((and (eq type (specifier-type '(signed-byte 16))) - (vop-existsp :translate signed-byte-16-p)) - `(signed-byte-16-p ,object)) - ;; On 32-bit backends (SIGNED-BYTE 32) is primitive. - ;; I think it would have already been recognized - ;; and turned into a call to the right predicate. - #+64-bit - ((and (eq type (specifier-type '(signed-byte 32))) - (vop-existsp :translate signed-byte-32-p)) - `(signed-byte-32-p ,object)) #+(or x86 x86-64 arm arm64) ;; Not implemented elsewhere yet ((and (eql (numeric-type-class type) 'integer) (or (eql low 0) (eql low 1)) From dd911e00794a976aa590f5c458a9c3ae4d0bb6fa Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 2 Jun 2022 13:31:22 -0400 Subject: [PATCH 3433/4023] Use INVOKE-RESTART, not EXIT, to bail out of test files --- tests/aprof.impure.lisp | 2 +- tests/autoclose-stream.impure.lisp | 2 +- tests/brothertree.impure.lisp | 2 +- tests/callback.impure.lisp | 2 +- tests/classoid-typep.impure.lisp | 2 +- tests/clos-typechecking.impure.lisp | 2 +- tests/clos.impure.lisp | 2 +- tests/compiler.impure.lisp | 2 +- tests/concurrent-syscalls.impure.lisp | 2 +- tests/deadlock.impure.lisp | 2 +- tests/debug.impure.lisp | 2 +- tests/exhaust.impure.lisp | 2 +- tests/exit-hang.impure.lisp | 3 +-- tests/fast-eval.impure.lisp | 3 +-- tests/fcb-threads.impure.lisp | 4 ++-- tests/filecompile.impure.lisp | 2 +- tests/finalize.impure.lisp | 3 +-- tests/full-eval.impure.lisp | 3 +-- tests/gc-search.impure.lisp | 2 +- tests/gc-threads.impure.lisp | 2 +- tests/gethash-concurrency.impure.lisp | 2 +- tests/immobile-space.impure.lisp | 2 +- tests/interrupt-atomic-incf.impure.lisp | 2 +- tests/interrupt-consing.impure.lisp | 2 +- tests/interrupted-sleep.impure.lisp | 2 +- tests/kill-non-lisp-thread.impure.lisp | 3 +-- tests/mutex.impure.lisp | 2 +- tests/package-locks.impure.lisp | 2 +- tests/session.impure.lisp | 2 +- tests/sprof.impure.lisp | 2 +- tests/style-warnings.impure.lisp | 2 +- tests/system.impure.lisp | 2 +- tests/threads.impure.lisp | 2 +- tests/timer.impure.lisp | 2 +- tests/traceroot.impure.lisp | 2 +- tests/unwind-to-frame-and-call.impure.lisp | 2 +- tests/win32-foreign-stack-unwind.impure.lisp | 4 ++-- tests/win32.impure.lisp | 2 +- tests/win64-exceptions.impure.lisp | 2 +- tests/x86-64-codegen.impure.lisp | 2 +- 40 files changed, 42 insertions(+), 47 deletions(-) diff --git a/tests/aprof.impure.lisp b/tests/aprof.impure.lisp index a99d5bc051..8d8305d10b 100644 --- a/tests/aprof.impure.lisp +++ b/tests/aprof.impure.lisp @@ -9,7 +9,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-(and x86-64 sb-thread (not win32)) (sb-ext:exit :code 104) ;; not implemented elsewhere +#-(and x86-64 sb-thread (not win32)) (invoke-restart 'run-tests::skip-file) ;; not implemented elsewhere (defstruct fruitbasket x y z) (with-test (:name :aprof-smoketest-struct diff --git a/tests/autoclose-stream.impure.lisp b/tests/autoclose-stream.impure.lisp index 79ee7b0d7a..d51a60153a 100644 --- a/tests/autoclose-stream.impure.lisp +++ b/tests/autoclose-stream.impure.lisp @@ -3,7 +3,7 @@ ;;; due to co-located tests. ;;; don't know how to check validity of a HANDLE in the win32 api -#-unix (sb-ext:exit :code 104) +#-unix (invoke-restart 'run-tests::skip-file) (defun fd-has-finalizer-p (fd) ;; Finalizer function can be: diff --git a/tests/brothertree.impure.lisp b/tests/brothertree.impure.lisp index 3b84c613b4..837b79fef6 100644 --- a/tests/brothertree.impure.lisp +++ b/tests/brothertree.impure.lisp @@ -1,4 +1,4 @@ -#+interpreter (sb-ext:exit :code 104) +#+interpreter (invoke-restart 'run-tests::skip-file) (let ((*evaluator-mode* :compile)) (load "../src/code/brothertree.lisp")) diff --git a/tests/callback.impure.lisp b/tests/callback.impure.lisp index f6ac36a2ac..29e93c8400 100644 --- a/tests/callback.impure.lisp +++ b/tests/callback.impure.lisp @@ -18,7 +18,7 @@ ;;; and :alien-callbacks is almost everywhere defined. ;;; However mips doesn't seem to correctly implement them, ;;; making the feature indicator somewhat useless) -#+(or (not alien-callbacks) mips) (exit :code 104) +#+(or (not alien-callbacks) mips) (invoke-restart 'run-tests::skip-file) ;;; simple callback for a function diff --git a/tests/classoid-typep.impure.lisp b/tests/classoid-typep.impure.lisp index b22c8810ba..ae37fb9dd3 100644 --- a/tests/classoid-typep.impure.lisp +++ b/tests/classoid-typep.impure.lisp @@ -9,7 +9,7 @@ ;;;; absoluely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) ;;; Using a fresh package as a namespace for classes is a quick-and-dirty ;;; way to create a class hierarchy without anonymous classes. diff --git a/tests/clos-typechecking.impure.lisp b/tests/clos-typechecking.impure.lisp index e8e3e212cf..46f9a8638c 100644 --- a/tests/clos-typechecking.impure.lisp +++ b/tests/clos-typechecking.impure.lisp @@ -13,7 +13,7 @@ ;;;; more information. ;;; Typechecking should be working, but it isn't. -#+interpreter (sb-ext:exit :code 104) +#+interpreter (invoke-restart 'run-tests::skip-file) (shadow 'slot) diff --git a/tests/clos.impure.lisp b/tests/clos.impure.lisp index 6c9877a3c6..af87c01443 100644 --- a/tests/clos.impure.lisp +++ b/tests/clos.impure.lisp @@ -11,7 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#+interpreter (sb-ext:exit :code 104) +#+interpreter (invoke-restart 'run-tests::skip-file) (load "compiler-test-util.lisp") (defpackage "CLOS-IMPURE" diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index 0178e1af95..5b0c15a5b4 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -20,7 +20,7 @@ ;; or actually reasonable things to test. (when (and (eq sb-ext:*evaluator-mode* :interpret) (not (member :sb-fasteval *features*))) - (sb-ext:exit :code 104)) + (invoke-restart 'run-tests::skip-file)) (load "compiler-test-util.lisp") diff --git a/tests/concurrent-syscalls.impure.lisp b/tests/concurrent-syscalls.impure.lisp index fce8c3942f..6de1638624 100644 --- a/tests/concurrent-syscalls.impure.lisp +++ b/tests/concurrent-syscalls.impure.lisp @@ -1,4 +1,4 @@ -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (use-package "SB-THREAD") (defun exercise-syscall (fn reference-errno) diff --git a/tests/deadlock.impure.lisp b/tests/deadlock.impure.lisp index a74a8b9bef..95100d00f6 100644 --- a/tests/deadlock.impure.lisp +++ b/tests/deadlock.impure.lisp @@ -1,4 +1,4 @@ -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (import '(sb-thread:join-thread sb-thread:make-mutex diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 03b278c38a..4dbccdbf6a 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -17,7 +17,7 @@ ;;; The debugger doesn't have any native knowledge of the interpreter (when (eq sb-ext:*evaluator-mode* :interpret) - (sb-ext:exit :code 104)) + (invoke-restart 'run-tests::skip-file)) #+(or x86 x86-64) (with-test (:name :legal-bpt-lra-object) diff --git a/tests/exhaust.impure.lisp b/tests/exhaust.impure.lisp index 32a938513d..9ae2646c49 100644 --- a/tests/exhaust.impure.lisp +++ b/tests/exhaust.impure.lisp @@ -11,7 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#+interpreter (sb-ext:exit :code 104) +#+interpreter (invoke-restart 'run-tests::skip-file) (test-util::disable-profiling) diff --git a/tests/exit-hang.impure.lisp b/tests/exit-hang.impure.lisp index b1ec24284d..d88cb789e8 100644 --- a/tests/exit-hang.impure.lisp +++ b/tests/exit-hang.impure.lisp @@ -1,4 +1,4 @@ -#+(or (not sb-thread) win32) (sb-ext:exit :code 104) +#+(or (not sb-thread) win32) (invoke-restart 'run-tests::skip-file) ;;; Not an exactly an "exit hang" test, but there was a different hang ;;; regarding concurrent JOIN-THREAD on 1 thread. @@ -74,4 +74,3 @@ ;;; Give ourselves 3 seconds to exit. (alien-funcall (extern-alien "prepare_exit_test" (function void int)) 3) (setq sb-ext:*forcibly-terminate-threads-on-exit* nil) -(exit :code 104) diff --git a/tests/fast-eval.impure.lisp b/tests/fast-eval.impure.lisp index 946e508b3e..4ac68f3bea 100644 --- a/tests/fast-eval.impure.lisp +++ b/tests/fast-eval.impure.lisp @@ -11,8 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-sb-fasteval -(sb-ext:exit :code 104) +#-sb-fasteval (invoke-restart 'run-tests::skip-file) (setf sb-ext:*evaluator-mode* :interpret) diff --git a/tests/fcb-threads.impure.lisp b/tests/fcb-threads.impure.lisp index 110beb14b8..a2c47a21b3 100644 --- a/tests/fcb-threads.impure.lisp +++ b/tests/fcb-threads.impure.lisp @@ -15,7 +15,7 @@ ;;; - garbage_collect: no SP known for thread 0x802bea000 (OS 34367133952) ;;; - failed AVER: (NOT (SB-THREAD::AVL-FIND ADDR SB-THREAD::OLD)) -#+(or (not sb-thread) freebsd) (sb-ext:exit :code 104) +#+(or (not sb-thread) freebsd) (invoke-restart 'run-tests::skip-file) (setf (generation-number-of-gcs-before-promotion 0) 5) (setf (generation-number-of-gcs-before-promotion 1) 3) @@ -157,7 +157,7 @@ (f 5 5 200 t)) ;;; The next test hasn't been made to run on windows, but should. -#+win32 (exit :code 104) +#+win32 (invoke-restart 'run-tests::skip-file) ;;; Check that you get an error trying to join a foreign thread (defglobal *my-foreign-thread* nil) diff --git a/tests/filecompile.impure.lisp b/tests/filecompile.impure.lisp index 07f45e013b..9604f5e85c 100644 --- a/tests/filecompile.impure.lisp +++ b/tests/filecompile.impure.lisp @@ -9,7 +9,7 @@ (scratch-file-name "fasl"))))) (assert (search expect err-string)))))) -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (unlock-package "SB-INT") (unlock-package "SB-IMPL") diff --git a/tests/finalize.impure.lisp b/tests/finalize.impure.lisp index 947ac21c4f..85b5cfb350 100644 --- a/tests/finalize.impure.lisp +++ b/tests/finalize.impure.lisp @@ -1,5 +1,4 @@ -#+interpreter (sb-ext:exit :code 104) -#+sb-safepoint (sb-ext:exit :code 104) ; tends to hang +#+(or sb-safepoint interpreter) (invoke-restart 'run-tests::skip-file) (defvar *tmp* 0.0) ; don't remove - used by the setq below (defglobal *count* 0) diff --git a/tests/full-eval.impure.lisp b/tests/full-eval.impure.lisp index c7717d31e4..515c6be59e 100644 --- a/tests/full-eval.impure.lisp +++ b/tests/full-eval.impure.lisp @@ -11,8 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-(or sb-eval sb-fasteval) -(sb-ext:exit :code 104) +#-(or sb-eval sb-fasteval) (invoke-restart 'run-tests::skip-file) (setf sb-ext:*evaluator-mode* :interpret) diff --git a/tests/gc-search.impure.lisp b/tests/gc-search.impure.lisp index d0548435f8..696479f1f4 100644 --- a/tests/gc-search.impure.lisp +++ b/tests/gc-search.impure.lisp @@ -1,5 +1,5 @@ -#-immobile-space (sb-ext:exit :code 104) +#-immobile-space (invoke-restart 'run-tests::skip-file) (defun make-page-full-of-fdefns () ;; Make a bunch of fdefns until we're aligned at a page boundary. diff --git a/tests/gc-threads.impure.lisp b/tests/gc-threads.impure.lisp index d298212db3..a2bf0e58cb 100644 --- a/tests/gc-threads.impure.lisp +++ b/tests/gc-threads.impure.lisp @@ -1,4 +1,4 @@ -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (with-test (:name (:two-threads-running-gc) :broken-on :sb-safepoint) diff --git a/tests/gethash-concurrency.impure.lisp b/tests/gethash-concurrency.impure.lisp index b2091293e4..68adca249f 100644 --- a/tests/gethash-concurrency.impure.lisp +++ b/tests/gethash-concurrency.impure.lisp @@ -1,6 +1,6 @@ ;;; HASH TABLES -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (use-package "SB-THREAD") (use-package "SB-SYS") diff --git a/tests/immobile-space.impure.lisp b/tests/immobile-space.impure.lisp index 5ff003cf9f..604b353eca 100644 --- a/tests/immobile-space.impure.lisp +++ b/tests/immobile-space.impure.lisp @@ -1,5 +1,5 @@ -#-immobile-space (sb-ext:exit :code 104) +#-immobile-space (invoke-restart 'run-tests::skip-file) ;;; If an instance was allocated but its layout not stored yet ;;; it could crash diff --git a/tests/interrupt-atomic-incf.impure.lisp b/tests/interrupt-atomic-incf.impure.lisp index 76fa70e5cb..83fe986184 100644 --- a/tests/interrupt-atomic-incf.impure.lisp +++ b/tests/interrupt-atomic-incf.impure.lisp @@ -1,4 +1,4 @@ -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (use-package "SB-THREAD") diff --git a/tests/interrupt-consing.impure.lisp b/tests/interrupt-consing.impure.lisp index d47ef337c1..7e4d7ed37a 100644 --- a/tests/interrupt-consing.impure.lisp +++ b/tests/interrupt-consing.impure.lisp @@ -1,4 +1,4 @@ -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (use-package "SB-THREAD") diff --git a/tests/interrupted-sleep.impure.lisp b/tests/interrupted-sleep.impure.lisp index 162561ad86..72b4d3176d 100644 --- a/tests/interrupted-sleep.impure.lisp +++ b/tests/interrupted-sleep.impure.lisp @@ -1,4 +1,4 @@ -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) ;; test that SLEEP actually sleeps for at least the given time, even ;; if interrupted by another thread exiting/a gc/anything diff --git a/tests/kill-non-lisp-thread.impure.lisp b/tests/kill-non-lisp-thread.impure.lisp index c3ca816ce1..11fe79eb66 100644 --- a/tests/kill-non-lisp-thread.impure.lisp +++ b/tests/kill-non-lisp-thread.impure.lisp @@ -11,8 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#+(or :win32 (not :sb-thread)) -(sb-ext:exit :code 104) +#+(or :win32 (not :sb-thread)) (invoke-restart 'run-tests::skip-file) (use-package :sb-alien) diff --git a/tests/mutex.impure.lisp b/tests/mutex.impure.lisp index 0e687edd05..917237cfe6 100644 --- a/tests/mutex.impure.lisp +++ b/tests/mutex.impure.lisp @@ -1,4 +1,4 @@ -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (use-package "SB-THREAD") diff --git a/tests/package-locks.impure.lisp b/tests/package-locks.impure.lisp index 7c6f2bc98f..75b011cb7b 100644 --- a/tests/package-locks.impure.lisp +++ b/tests/package-locks.impure.lisp @@ -11,7 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#+sb-devel (sb-ext:exit :code 104) ; packages are not locked for devs +#+sb-devel (invoke-restart 'run-tests::skip-file) ; packages are not locked for devs (load "compiler-test-util.lisp") diff --git a/tests/session.impure.lisp b/tests/session.impure.lisp index 01626cca6f..76f8c4b5e8 100644 --- a/tests/session.impure.lisp +++ b/tests/session.impure.lisp @@ -11,7 +11,7 @@ ;;;; absoluely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) (setf sb-unix::*on-dangerous-wait* :error) diff --git a/tests/sprof.impure.lisp b/tests/sprof.impure.lisp index 0335388a58..bc7835d0a8 100644 --- a/tests/sprof.impure.lisp +++ b/tests/sprof.impure.lisp @@ -5,7 +5,7 @@ ;;; but I need to try to see it behaving badly (if it does), ;;; and there's really no other way than to watch for bad output. -#+win32 (sb-ext:exit :code 104) +#+win32 (invoke-restart 'run-tests::skip-file) (require :sb-sprof) (load "../contrib/sb-sprof/test.lisp") diff --git a/tests/style-warnings.impure.lisp b/tests/style-warnings.impure.lisp index 08cc46605c..ea75f83fb2 100644 --- a/tests/style-warnings.impure.lisp +++ b/tests/style-warnings.impure.lisp @@ -17,7 +17,7 @@ ;;;; more information. ;; These tests don't work unless compiling -#+interpreter (sb-ext:exit :code 104) +#+interpreter (invoke-restart 'run-tests::skip-file) (defun f-with-macro (arg) (list arg)) (defun f2-with-macro (a b) (list a b)) diff --git a/tests/system.impure.lisp b/tests/system.impure.lisp index c3b9437263..e00df4c76e 100644 --- a/tests/system.impure.lisp +++ b/tests/system.impure.lisp @@ -11,7 +11,7 @@ (in-package "SB-VM") -#-(and (or x86 x86-64) (not interpreter)) (sb-ext:exit :code 104) +#-(and (or x86 x86-64) (not interpreter)) (invoke-restart 'run-tests::skip-file) (test-util:with-test (:name :basic-cpuid) (flet ((to-ascii (bits) diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 28122cb0bf..14cb2db47b 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -70,7 +70,7 @@ (process-all-interrupts)) (check-deferrables-unblocked-or-lose 0)) -#-sb-thread (sb-ext:exit :code 104) +#-sb-thread (invoke-restart 'run-tests::skip-file) ;;;; Now the real tests... diff --git a/tests/timer.impure.lisp b/tests/timer.impure.lisp index 34eea64efb..04caf6ae2e 100644 --- a/tests/timer.impure.lisp +++ b/tests/timer.impure.lisp @@ -9,7 +9,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#+interpreter (sb-ext:exit :code 104) +#+interpreter (invoke-restart 'run-tests::skip-file) (with-test (:name :heap) (let* ((size 1000) diff --git a/tests/traceroot.impure.lisp b/tests/traceroot.impure.lisp index 394cd48948..3ba7624e7f 100644 --- a/tests/traceroot.impure.lisp +++ b/tests/traceroot.impure.lisp @@ -18,7 +18,7 @@ ;;;; And also sb-safepoint gets a crash in C. #-(and gencgc sb-thread (not sb-safepoint) (or (and arm64 (not darwin)) ppc64 x86-64)) -(sb-ext:exit :code 104) +(invoke-restart 'run-tests::skip-file) (setq sb-ext:*evaluator-mode* :compile) (defvar *fred*) diff --git a/tests/unwind-to-frame-and-call.impure.lisp b/tests/unwind-to-frame-and-call.impure.lisp index fc1c5c4646..171c5fb603 100644 --- a/tests/unwind-to-frame-and-call.impure.lisp +++ b/tests/unwind-to-frame-and-call.impure.lisp @@ -14,7 +14,7 @@ ;;; The debugger doesn't have any native knowledge of the interpreter (when (eq sb-ext:*evaluator-mode* :interpret) - (sb-ext:exit :code 104)) + (invoke-restart 'run-tests::skip-file)) (declaim (optimize debug)) diff --git a/tests/win32-foreign-stack-unwind.impure.lisp b/tests/win32-foreign-stack-unwind.impure.lisp index 6749150740..dfb87d4a60 100644 --- a/tests/win32-foreign-stack-unwind.impure.lisp +++ b/tests/win32-foreign-stack-unwind.impure.lisp @@ -11,8 +11,8 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-win32 (exit :code 104) ;; This is extremely win32-specific. -#-x86 (exit :code 104) ;; And our AMD64 backend does not aim to support it. +#-win32 (invoke-restart 'run-tests::skip-file) ;; This is extremely win32-specific. +#-x86 (invoke-restart 'run-tests::skip-file) ;; And our AMD64 backend does not aim to support it. (use-package :sb-alien) diff --git a/tests/win32.impure.lisp b/tests/win32.impure.lisp index e3006d6615..1de4ef8d36 100644 --- a/tests/win32.impure.lisp +++ b/tests/win32.impure.lisp @@ -9,7 +9,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-win32 (exit :code 104) +#-win32 (invoke-restart 'run-tests::skip-file) (with-test (:name :dbg-print-exception-c) (handler-case diff --git a/tests/win64-exceptions.impure.lisp b/tests/win64-exceptions.impure.lisp index a0a42bf6a0..ab73699620 100644 --- a/tests/win64-exceptions.impure.lisp +++ b/tests/win64-exceptions.impure.lisp @@ -11,7 +11,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-(and win32 x86-64) (exit :code 104) ;; This is extremely win64-specific. +#-(and win32 x86-64) (invoke-restart 'run-tests::skip-file) ;; This is extremely win64-specific. (with-scratch-file (dll "dll") (run-program "gcc" `("-shared" "-o" ,dll "win64-exceptions.c") diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 9f4d0c2375..dcf423abec 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -9,7 +9,7 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -#-x86-64 (sb-ext:exit :code 104) +#-x86-64 (invoke-restart 'run-tests::skip-file) ;;; This trivial function failed to compile due to rev 88d078fe (defun foo (&key k) From 6cedbe79342365afff6c2c9702a0fcf673c684c0 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Thu, 2 Jun 2022 14:07:22 -0700 Subject: [PATCH 3434/4023] Bump required MPFR version. --- contrib/sb-mpfr/mpfr.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/sb-mpfr/mpfr.lisp b/contrib/sb-mpfr/mpfr.lisp index 3aa89d4a83..499ccfddfd 100644 --- a/contrib/sb-mpfr/mpfr.lisp +++ b/contrib/sb-mpfr/mpfr.lisp @@ -218,8 +218,8 @@ (alien-funcall (extern-alien "mpfr_get_version" (function c-string))))) (cond ((null *mpfr-version*)) - ((string<= *mpfr-version* "3.1") - (warn "SB-MPFR requires at least MPFR version 3.1") + ((string<= *mpfr-version* "4.0.0") + (warn "SB-MPFR requires at least MPFR version 4.0.0") (setf success nil)) (t (setf +mpfr-precision+ From 83fab7316893ae7079f833c36642b72c0a47af9c Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 3 Jun 2022 03:40:31 +0300 Subject: [PATCH 3435/4023] Avoid copying in string-down/upcase. Copy only when :start/:end are supplied. --- src/code/string.lisp | 63 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index c61086c8bc..72f3603f55 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -502,7 +502,6 @@ new string COUNT long filled with the fill character." (when initial-element (fill string initial-element)) string))))) -(declaim (maybe-inline nstring-upcase)) (defun nstring-upcase (string &key (start 0) end) (with-one-string (string start end) (do ((index start (1+ index)) @@ -518,12 +517,6 @@ new string COUNT long filled with the fill character." (code-char (truly-the char-code code))))))))) string) -(defun string-upcase (string &key (start 0) end) - (declare (explicit-check) - (inline nstring-upcase)) - (nstring-upcase (copy-seq (%string string)) :start start :end end)) - -(declaim (maybe-inline nstring-downcase)) (defun nstring-downcase (string &key (start 0) end) (with-one-string (string start end) (do ((index start (1+ index)) @@ -534,15 +527,63 @@ new string COUNT long filled with the fill character." (with-case-info (char case-index cases :cases cases) (let ((code (aref cases case-index))) + (declare (optimize (safety 0))) ;; avoid checking for base-char (unless (zerop code) (setf (schar string index) - (code-char (truly-the char-code code))))))))) + (code-char code)))))))) string) +(defmacro string-case (case-index) + `(let ((string (%string string))) + (with-array-data ((string-data string :offset-var offset) + (s-start start) + (s-end end) + :check-fill-pointer t) + (let* ((length (length string)) + (new (cond #+sb-unicode + ((simple-base-string-p string-data) + (make-string length :element-type 'base-char)) + (t + (make-string length))))) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (when (> start 0) + (loop for d-i below start + for s-i from offset + do + (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (when (and end + (< end length)) + (loop for d-i from end below length + for s-i from s-end + do (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (do ((s-i s-start (truly-the index (1+ s-i))) + (d-i start (truly-the index (1+ d-i))) + (cases #.+character-cases+)) + ((>= s-i s-end)) + (declare (index d-i)) + (let* ((char (schar string-data s-i)) + (cased (with-case-info (char case-index cases + :cases cases + :miss-value char) + (let ((code (aref cases ,case-index))) + (if (zerop code) + char + (code-char (truly-the char-code code))))))) + (locally (declare (optimize (safety 0))) ;; avoid checking for base-char + (setf (schar new d-i) cased)))) + new)))) + +(defun string-upcase (string &key (start 0) end) + (declare (explicit-check)) + (string-case (1+ case-index))) + (defun string-downcase (string &key (start 0) end) - (declare (explicit-check) - (inline nstring-downcase)) - (nstring-downcase (copy-seq (%string string)) :start start :end end)) + (declare (explicit-check)) + (string-case case-index)) (flet ((%capitalize (string start end) (declare (string string) (index start) (type sequence-end end)) From 3d71e628f14db95a6855d5d4a8bae47022d5abb9 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Thu, 2 Jun 2022 21:34:27 -0700 Subject: [PATCH 3436/4023] Add failing tests. --- tests/block-compile.impure.lisp | 30 ++++++++++++++++++++++++++++++ tests/input-manifest.lisp-expr | 5 +++++ tests/package-test-1.lisp | 8 ++++++++ tests/package-test-2.lisp | 13 +++++++++++++ tests/package-test-3.lisp | 11 +++++++++++ tests/package-test-4.lisp | 13 +++++++++++++ 6 files changed, 80 insertions(+) create mode 100644 tests/package-test-1.lisp create mode 100644 tests/package-test-2.lisp create mode 100644 tests/package-test-3.lisp create mode 100644 tests/package-test-4.lisp diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index d4b0819f67..8b8d5ee446 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -122,6 +122,36 @@ :load t) (assert (find-symbol "STABLE-UNION" "BLOCK-DEFPACKAGE-BAR"))) +(with-test (:name :block-defpackage-rename-package-symbol-conflict + :fails-on :sbcl) + (with-scratch-file (fasl2 "fasl") + (compile-file "package-test-2.lisp" :output-file fasl2 + :block-compile t) + (delete-package "BAR") + (with-scratch-file (fasl1 "fasl") + (compile-file "package-test-1.lisp" :output-file fasl1 + :block-compile t) + (load fasl2))) + (assert (eq (symbol-package (find-symbol "BAZ" "BAR")) + (find-package "BAR"))) + (assert (eq (funcall (find-symbol "BAZ" "BAR")) + :good)) + (delete-package "BAR")) + +(with-test (:name :block-defpackage-rename-package-preserve-externals + :fails-on :sbcl) + (with-scratch-file (fasl4 "fasl") + (compile-file "package-test-4.lisp" :output-file fasl4 + :block-compile t) + (delete-package "FOO-NEW") + (with-scratch-file (fasl3 "fasl") + (compile-file "package-test-3.lisp" :output-file fasl3 + :block-compile t) + (load fasl4))) + (assert (eq (nth-value 1 (find-symbol "BAR" "FOO-NEW")) + :external)) + (delete-package "FOO-NEW")) + (with-test (:name :block-defconstant-then-load-fasl) (ctu:file-compile ;; test a non-EQL-comparable constant. diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index b6371f3764..830d3b54f7 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -40,6 +40,11 @@ "tests/block-compile-test-4.lisp" "tests/block-compile-test-5.lisp") ("debug.impure.lisp" "tests/bug-414.lisp") + ("block-compile.impure.lisp" + "tests/package-test-1.lisp" + "tests/package-test-2.lisp" + "tests/package-test-3.lisp" + "tests/package-test-4.lisp") ("defstruct.impure-cload.lisp" "tests/block-compile-defstruct-test.lisp") ("elfcore.test.sh" "src/runtime/shrinkwrap-sbcl") ("exit-hang.impure.lisp" "tests/fcb-threads.so") diff --git a/tests/package-test-1.lisp b/tests/package-test-1.lisp new file mode 100644 index 0000000000..e4106ccab0 --- /dev/null +++ b/tests/package-test-1.lisp @@ -0,0 +1,8 @@ +(defpackage "FOO" + (:use "CL")) + +(in-package "FOO") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun baz () + :bad)) diff --git a/tests/package-test-2.lisp b/tests/package-test-2.lisp new file mode 100644 index 0000000000..b2dc5b2ee8 --- /dev/null +++ b/tests/package-test-2.lisp @@ -0,0 +1,13 @@ +(eval-when (:compile-toplevel :load-toplevel :execute) + (cond + ((find-package "FOO") + (rename-package "FOO" "BAR" '("FOO"))) + ((not (find-package "BAR")) + (make-package "BAR" :use '("CL") :nicknames '("FOO")) + (export (list (intern "BAZ" "BAR")) "BAR")))) + +(in-package "BAR") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun baz () + :good)) diff --git a/tests/package-test-3.lisp b/tests/package-test-3.lisp new file mode 100644 index 0000000000..2b0a2557e1 --- /dev/null +++ b/tests/package-test-3.lisp @@ -0,0 +1,11 @@ +(defpackage "FOO" + (:use "CL") + (:export "BAR" "BAZ")) + +(in-package "FOO") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun baz () + 1) + (defmacro bar (&rest args) + `(baz ,@args))) diff --git a/tests/package-test-4.lisp b/tests/package-test-4.lisp new file mode 100644 index 0000000000..75dbb837ab --- /dev/null +++ b/tests/package-test-4.lisp @@ -0,0 +1,13 @@ +(eval-when (:compile-toplevel :load-toplevel :execute) + (cond + ((find-package "FOO") + (rename-package "FOO" "FOO-NEW" '("FOO"))) + ((not (find-package "FOO-NEW")) + (make-package "FOO-NEW" :use '("CL") :nicknames '("FOO")) + (export (list (intern "BAR" "FOO-NEW") (intern "BAZ" "FOO-NEW")) "FOO-NEW")))) + +(in-package "FOO-NEW") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defmacro bar (&rest args) + `(baz ,@args))) From 113d4823142cfbde43727e803eac8d7ffd6df2be Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Thu, 2 Jun 2022 22:16:01 -0700 Subject: [PATCH 3437/4023] Revert "Make test BLOCK-DEFPACKAGE-RENAME-PACKAGE work." This reverts commit a73445b84db91f890214a744deaaeec89ebae2da. It doesn't handle symbol conflicts properly. --- src/code/target-package.lisp | 47 ++++++--------------------------- tests/block-compile.impure.lisp | 4 ++- 2 files changed, 11 insertions(+), 40 deletions(-) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index c865f5e7a6..9cfd571cbb 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -989,19 +989,6 @@ Experimental: interface subject to change." "~S is already a nickname for ~S." nickname (package-%name found))))))) -;;; Set the home package of each symbol in package OLD to NEW. NEW may -;;; be NULL to indicate deletion. -(defun rehome-package-symbols (old new) - (declare (type package old) - (type (or null package) new)) - (flet ((rehome (symbols) - (dovector (x (package-hashtable-cells symbols)) - (when (and (symbolp x) - (eq (symbol-package x) old)) - (%set-symbol-package x new))))) - (rehome (package-internal-symbols old)) - (rehome (package-external-symbols old)))) - ;;; ANSI specifies that: ;;; (1) MAKE-PACKAGE and DEFPACKAGE use the same default package-use-list ;;; (2) that it (as an implementation-defined value) should be documented, @@ -1143,31 +1130,6 @@ implementation it is ~S." *!default-package-use-list*) (assert-package-unlocked package "renaming as ~A~@[ with nickname~*~P ~1@*~{~A~^, ~}~]" name nicks (length nicks))) - ;; If a loader package exists, resolve it and have the - ;; package-to-be renamed take on the resolved packages - ;; symbols, so that it gets cleaned up. - (let ((loader-package - (or (resolve-deferred-package name) - (resolve-rehoming-package name)))) - (when loader-package - (let ((loader-internals (package-internal-symbols - loader-package)) - (loader-externals (package-external-symbols - loader-package)) - (package-internals (package-internal-symbols - package)) - (package-externals (package-external-symbols - package))) - ;; FIXME: What should/can we do with conflicts? - (dovector (x (package-hashtable-cells loader-internals)) - (when (and (symbolp x) - (eq (symbol-package x) loader-package)) - (add-symbol package-internals x))) - (dovector (x (package-hashtable-cells loader-externals)) - (when (and (symbolp x) - (eq (symbol-package x) loader-package)) - (add-symbol package-externals x)))) - (rehome-package-symbols loader-package package))) (with-package-names (table) ;; Check for race conditions now that we have the lock. (unless (eq package (find-package package-designator)) @@ -1231,7 +1193,14 @@ implementation it is ~S." *!default-package-use-list*) (dolist (used (package-use-list package)) (unuse-package used package)) (setf (package-%local-nicknames package) nil) - (rehome-package-symbols package (make-rehoming-package package)) + (let ((rehoming-package (make-rehoming-package package))) + (flet ((nullify-home (symbols) + (dovector (x (package-hashtable-cells symbols)) + (when (and (symbolp x) + (eq (symbol-package x) package)) + (%set-symbol-package x rehoming-package))))) + (nullify-home (package-internal-symbols package)) + (nullify-home (package-external-symbols package)))) (with-package-names (table) (awhen (package-id package) (setf (aref *id->package* it) nil (package-id package) nil)) diff --git a/tests/block-compile.impure.lisp b/tests/block-compile.impure.lisp index 8b8d5ee446..55e3065955 100644 --- a/tests/block-compile.impure.lisp +++ b/tests/block-compile.impure.lisp @@ -102,7 +102,9 @@ (assert (eq (nth-value 1 (find-symbol "F" "BLOCK-DEFPACKAGE4")) :external))) -(with-test (:name :block-defpackage-rename-package) +;;; Doesn't work yet. +(with-test (:name :block-defpackage-rename-package + :fails-on :sbcl) (ctu:file-compile `((eval-when (:compile-toplevel :load-toplevel :execute) (cond From 8edb290281e8e9db8adec97ca9bd82565de11591 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Fri, 3 Jun 2022 00:25:44 -0700 Subject: [PATCH 3438/4023] Fix even more package renaming issues. By extending the workaround of forcing top level lambdas. --- src/code/target-package.lisp | 14 ++++---- src/compiler/early-c.lisp | 6 +++- src/compiler/main.lisp | 8 +++-- tests/input-manifest.lisp-expr | 8 ++++- tests/packages.impure.lisp | 64 ++++++++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 13 deletions(-) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 9cfd571cbb..6528c91a66 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -1033,14 +1033,6 @@ implementation it is ~S." *!default-package-use-list*) "Clobber existing package." "A package named ~S already exists" name) (setf clobber t)) - ;; Force pending top-level lambdas at compile time, to prevent a - ;; potentially observable behavioral change with - ;; RENAME-PACKAGE. See test - ;; :BLOCK-DEFPACKAGE-RENAME-PACKAGE-REDEFPACKAGE which shows the - ;; failing scenario. Forcing top-level lambdas like this does not - ;; apply to block compilation. - (when (boundp 'sb-c::*compilation*) - (sb-c::compile-toplevel-lambdas '() t)) (with-package-graph () ;; Check for race, signal the error outside the lock. (when (and (not clobber) (find-package name)) @@ -1065,6 +1057,8 @@ implementation it is ~S." *!default-package-use-list*) (with-package-names (table) (%register-package table name package)) (atomic-incf *package-names-cookie*) + (when (boundp 'sb-c::*compilation*) + (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) (return package)) (bug "never"))) @@ -1152,6 +1146,8 @@ implementation it is ~S." *!default-package-use-list*) ;; not ideal to hold the lock for the entire duration. (%enter-new-nicknames package nicks)) (atomic-incf *package-names-cookie*) + (when (boundp 'sb-c::*compilation*) + (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) (return package)))) (defun delete-package (package-designator) @@ -1213,6 +1209,8 @@ implementation it is ~S." *!default-package-use-list*) ;; for tidiness and to help the GC. (package-%nicknames package) nil)) (atomic-incf *package-names-cookie*) + (when (boundp 'sb-c::*compilation*) + (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) (setf (package-%use-list package) nil (package-tables package) #() (package-%shadowing-symbols package) nil diff --git a/src/compiler/early-c.lisp b/src/compiler/early-c.lisp index f7d894ffe6..378d993ba3 100644 --- a/src/compiler/early-c.lisp +++ b/src/compiler/early-c.lisp @@ -223,7 +223,11 @@ ;; We build a list of top-level lambdas, and then periodically smash them ;; together into a single component and compile it. (pending-toplevel-lambdas nil :type list) - + ;; We record whether the package environment has changed during the + ;; compilation of some sequence top level forms. This allows the + ;; compiler to dump symbols in such a way that the loader can + ;; reconstruct them in the correct package. + (package-environment-changed nil :type boolean) ;; Bidrectional map between IR1/IR2/assembler abstractions and a corresponding ;; small integer or string identifier. One direction could be done by adding ;; the ID as slot to each object, but we want both directions. diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 03da51efdc..1f3549e5d7 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1620,7 +1620,7 @@ necessary, since type inference may take arbitrarily long to converge.") (core-object (core-call-toplevel-lambda tll object)) (null)))) -;;; Add LAMBDAS to the pending lambdas. If this leaves more than +;;; Add LAMBDAS to the pending lambdas. If this leaves more than ;;; TOP-LEVEL-LAMBDA-MAX lambdas in the list, or if FORCE-P is true, ;;; then smash the lambdas into a single component, compile it, and ;;; arrange for the resulting function to be called. @@ -1632,13 +1632,15 @@ necessary, since type inference may take arbitrarily long to converge.") (let ((pending (pending-toplevel-lambdas compilation))) (when (and pending (or (> (length pending) top-level-lambda-max) - force-p)) + force-p + (package-environment-changed compilation))) (multiple-value-bind (component tll) (merge-toplevel-lambdas pending) (setf (pending-toplevel-lambdas compilation) ()) (compile-component component) (clear-ir1-info component) - (object-call-toplevel-lambda tll))))) + (object-call-toplevel-lambda tll)) + (setf (package-environment-changed compilation) nil)))) (values)) ;;; Compile top level code and call the top level lambdas. We pick off diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 830d3b54f7..7fbfe2c126 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -71,7 +71,13 @@ ("octets.pure.lisp" "tests/data/compile-file-pos.lisp" "tests/data/compile-file-pos-utf16be.lisp") - ("packages.impure.lisp" "contrib/sb-md5.fasl" "contrib/sb-rotate-byte.fasl") + ("packages.impure.lisp" + "contrib/sb-md5.fasl" + "contrib/sb-rotate-byte.fasl" + "tests/package-test-1.lisp" + "tests/package-test-2.lisp" + "tests/package-test-3.lisp" + "tests/package-test-4.lisp") ("redblack.pure.lisp" "tests/bbtree-test-util.lisp") ("run-program.impure.lisp" "contrib/sb-posix.fasl") ("sb-graph.impure.lisp" "contrib/sb-graph.fasl" "contrib/uiop.fasl") diff --git a/tests/packages.impure.lisp b/tests/packages.impure.lisp index 14cfb89220..6fe5931191 100644 --- a/tests/packages.impure.lisp +++ b/tests/packages.impure.lisp @@ -11,6 +11,8 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. +(load "compiler-test-util.lisp") + (require :sb-md5) #+64-bit (progn @@ -1109,3 +1111,65 @@ if a restart was invoked." (assert-error (let ((*package* (find-package "MYPKG"))) ;; the nickname magically went away! (find-symbol "ZOOK" "SP")))) + +;;; This is probably, strictly speaking, non-conforming code according +;;; to ANSI 3.2.4.4 under item 1 for symbol, taking package "same"ness +;;; to mean EQness. +(with-test (:name :defpackage-rename-package-redefpackage) + (ctu:file-compile + `((eval-when (:compile-toplevel :load-toplevel :execute) + (when (find-package "DEFPACKAGE4") + (rename-package "DEFPACKAGE4" "DEFPACKAGE4"))) + (defpackage "DEFPACKAGE4" + (:use :cl)) + (in-package "DEFPACKAGE4") + (eval-when (:compile-toplevel :load-toplevel :execute) + (export '(f)))) + :load t) + (assert (eq (nth-value 1 (find-symbol "F" "DEFPACKAGE4")) + :external))) + +(with-test (:name :defpackage-rename-package) + (delete-package "BAR") + (ctu:file-compile + `((eval-when (:compile-toplevel :load-toplevel :execute) + (cond + ((find-package "FOO") + (rename-package "FOO" + "BAR")) + ((not (find-package "BAR")) + (make-package "BAR" :use '("CL"))))) + + (in-package "BAR") + + (defun stable-union (bar) bar)) + :before-load (lambda () + (delete-package "BAR") + (defpackage foo (:use :cl))) + :load t) + (assert (find-symbol "STABLE-UNION" "BAR")) + (delete-package "BAR")) + +(with-test (:name :defpackage-rename-package-symbol-conflict) + (with-scratch-file (fasl2 "fasl") + (compile-file "package-test-2.lisp" :output-file fasl2) + (delete-package "BAR") + (with-scratch-file (fasl1 "fasl") + (compile-file "package-test-1.lisp" :output-file fasl1) + (load fasl2))) + (assert (eq (symbol-package (find-symbol "BAZ" "BAR")) + (find-package "BAR"))) + (assert (eq (funcall (find-symbol "BAZ" "BAR")) + :good)) + (delete-package "BAR")) + +(with-test (:name :defpackage-rename-package-preserve-externals) + (with-scratch-file (fasl4 "fasl") + (compile-file "package-test-4.lisp" :output-file fasl4) + (delete-package "FOO-NEW") + (with-scratch-file (fasl3 "fasl") + (compile-file "package-test-3.lisp" :output-file fasl3) + (load fasl4))) + (assert (eq (nth-value 1 (find-symbol "BAR" "FOO-NEW")) + :external)) + (delete-package "FOO-NEW")) From c9b4458fd5f895222bfe9ade306d0d62827d4d7a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 3 Jun 2022 13:34:08 +0300 Subject: [PATCH 3439/4023] Fix string-comparison type derivation. Off by one. Reported by Eric Marsden. --- src/compiler/seqtran.lisp | 2 +- tests/seq.pure.lisp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 0d05261437..7ca2588c9e 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1109,7 +1109,7 @@ (when end1 (setf high end1)) (when (and length2 start1) - (let ((high2 (1- (+ start1 length2)))) + (let ((high2 (+ start1 length2))) (when (or (not high) (> high high2)) (setf high high2)))) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index 66c29079fb..8c3af3ed13 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -693,3 +693,17 @@ (check (position x y :end 10) (or (mod 10) null)) (check (position x (the cons y) :start 5 :end 10) (or (integer 5 9) null)) (check (position-if x y :end 10) (or (mod 10) null)))) + +(with-test (:name :string-cmp) + (macrolet + ((check (fun expected) + `(assert + (ctype= (second + (third + (sb-kernel:%simple-fun-type + (checked-compile '(lambda (x y) + (declare (ignorable x y)) + ,fun))))) + ',expected)))) + (check (string/= (the simple-string x) (the simple-string y) :end2 0) + (or (integer 0 0) null)))) From d442ea2c2447b3b946427ceb9af68b11b0d6ad96 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 3 Jun 2022 13:38:44 +0300 Subject: [PATCH 3440/4023] Add a derive for string/=*. It's not always transformed to %sp-string-compare. --- src/compiler/seqtran.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 7ca2588c9e..b0a6f3272c 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1132,6 +1132,7 @@ (def string>*) (def string<=*) (def string>=*) + (def string/=* t) (def %sp-string-compare '%sp-string-compare)) (macrolet ((def (name &optional equality) From 2c1b26e4e3ba446e3f5c0d710c4f4b7845fac19b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 3 Jun 2022 18:54:23 +0300 Subject: [PATCH 3441/4023] Warn about bad indices for string-case functions. --- src/compiler/seqtran.lisp | 84 ++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index b0a6f3272c..a95a7dade1 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1024,45 +1024,45 @@ `(if (string=* str1 str2 start1 end1 start2 end2) nil 0) (give-up-ir1-transform))) -(defun check-string-ranges (string1 string2 start1 end1 start2 end2 node) - (flet ((check (i string start end) - (let* ((type (lvar-type string)) - (length (vector-type-length type))) - (when length - (flet ((check (index name length-type) - (when index - (let ((index-type (lvar-type index))) - (unless (types-equal-or-intersect index-type - (specifier-type length-type)) - (let ((*compiler-error-context* node)) - (compiler-warn "Bad :~a~s ~a for string~s of type ~a" - name i - (type-specifier index-type) - i - (type-specifier type)))))))) - (check start "start" `(integer 0 ,length)) - (check end "end" `(or null (integer 0 ,length))))) - (when (and start end) - (let* ((start-type (lvar-type start)) - (start-interval (type-approximate-interval start-type)) - (end-type (lvar-type end)) - (end-interval (type-approximate-interval end-type))) - (when (and (interval-p start-interval) - (interval-p end-interval) - (interval-< end-interval start-interval)) - (let ((*compiler-error-context* node)) - (compiler-warn ":start~a ~a is greater than :end~a ~a" - i - (type-specifier start-type) - i - (type-specifier end-type))))))))) - (check 1 string1 start1 end1) - (check 2 string2 start2 end2))) +(defun check-string-ranges (string start end node &optional (suffix "")) + (let* ((type (lvar-type string)) + (length (vector-type-length type))) + (when length + (flet ((check (index name length-type) + (when index + (let ((index-type (lvar-type index))) + (unless (types-equal-or-intersect index-type + (specifier-type length-type)) + (let ((*compiler-error-context* node)) + (compiler-warn "Bad :~a~a ~a for~a ~a" + name suffix + (type-specifier index-type) + (if (equal suffix "") + suffix + (format nil " for string~a of type" suffix)) + (type-specifier type)))))))) + (check start "start" `(integer 0 ,length)) + (check end "end" `(or null (integer 0 ,length))))) + (when (and start end) + (let* ((start-type (lvar-type start)) + (start-interval (type-approximate-interval start-type)) + (end-type (lvar-type end)) + (end-interval (type-approximate-interval end-type))) + (when (and (interval-p start-interval) + (interval-p end-interval) + (interval-< end-interval start-interval)) + (let ((*compiler-error-context* node)) + (compiler-warn ":start~a ~a is greater than :end~a ~a" + suffix + (type-specifier start-type) + suffix + (type-specifier end-type)))))))) (macrolet ((def (name) `(defoptimizer (,name ir2-hook) ((string1 string2 start1 end1 start2 end2) node block) (declare (ignore block)) - (check-string-ranges string1 string2 start1 end1 start2 end2 node)))) + (check-string-ranges string1 start1 end1 node 1) + (check-string-ranges string2 start2 end2 node 2)))) (def string=*) (def string<*) (def string>*) @@ -1076,12 +1076,24 @@ (macrolet ((def (name) `(defoptimizer (,name ir2-hook) ((string1 string2 &key start1 end1 start2 end2) node block) (declare (ignore block)) - (check-string-ranges string1 string2 start1 end1 start2 end2 node)))) + (check-string-ranges string1 start1 end1 node 1) + (check-string-ranges string2 start2 end2 node 2)))) (def string-equal) (def string-not-equal) (def string-greaterp) (def string-lessp)) +(macrolet ((def (name) + `(defoptimizer (,name ir2-hook) ((string &key start end) node block) + (declare (ignore block)) + (check-string-ranges string start end node)))) + (def string-downcase) + (def string-upcase) + (def nstring-downcase) + (def nstring-upcase) + (def string-capitalize) + (def nstring-capitalize)) + (defun string-cmp-deriver (string1 string2 start1 end1 start2 end2 &optional equality) (flet ((dims (string start end) (let* ((type (lvar-type string)) From d66997f85ee65ae5e6fd4cefd259e1f05cdc90e8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 3 Jun 2022 12:04:25 -0400 Subject: [PATCH 3442/4023] Fix arm --- src/compiler/arm/insts.lisp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/compiler/arm/insts.lisp b/src/compiler/arm/insts.lisp index df4aa3c7e1..3afb611888 100644 --- a/src/compiler/arm/insts.lisp +++ b/src/compiler/arm/insts.lisp @@ -1205,7 +1205,7 @@ (:vop-var vop) (:emitter (emit-back-patch - segment 12 + segment 16 (lambda (segment position) (assemble (segment vop) ;; Calculate the address of the code component. This is an @@ -1221,11 +1221,9 @@ other-pointer-lowtag))) ;; Next, we read the function header. (inst ldr temp (@ lip (- other-pointer-lowtag))) + (inst bic temp temp widetag-mask) ;; And finally we use the header value (a count in words), - ;; plus the fact that the top two bits of the widetag are - ;; clear (SIMPLE-FUN-WIDETAG is #x2A and - ;; RETURN-PC-WIDETAG is #x36) to compute the boxed - ;; address of the code component. + ;; to compute the boxed address of the code component. (inst sub code lip (lsr temp (- 8 word-shift)))))))) ;;; Compute the address of a nearby LRA object by dead reckoning from From 28d6850188045db82c05519495592aae65a7f1fb Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 3 Jun 2022 22:33:50 +0300 Subject: [PATCH 3443/4023] Warn about bad :start/:end for more sequence functions. --- src/compiler/seqtran.lisp | 113 +++++++++++++++++++++++++------------- tests/seq.pure.lisp | 2 +- 2 files changed, 76 insertions(+), 39 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index a95a7dade1..a3dd5ad716 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1024,7 +1024,7 @@ `(if (string=* str1 str2 start1 end1 start2 end2) nil 0) (give-up-ir1-transform))) -(defun check-string-ranges (string start end node &optional (suffix "")) +(defun check-sequence-ranges (string start end node &optional (suffix "") sequence-name) (let* ((type (lvar-type string)) (length (vector-type-length type))) (when length @@ -1037,9 +1037,9 @@ (compiler-warn "Bad :~a~a ~a for~a ~a" name suffix (type-specifier index-type) - (if (equal suffix "") - suffix - (format nil " for string~a of type" suffix)) + (if sequence-name + (format nil " for ~a of type" sequence-name) + suffix) (type-specifier type)))))))) (check start "start" `(integer 0 ,length)) (check end "end" `(or null (integer 0 ,length))))) @@ -1061,8 +1061,8 @@ (macrolet ((def (name) `(defoptimizer (,name ir2-hook) ((string1 string2 start1 end1 start2 end2) node block) (declare (ignore block)) - (check-string-ranges string1 start1 end1 node 1) - (check-string-ranges string2 start2 end2 node 2)))) + (check-sequence-ranges string1 start1 end1 node 1 'string1) + (check-sequence-ranges string2 start2 end2 node 2 'string2)))) (def string=*) (def string<*) (def string>*) @@ -1076,8 +1076,8 @@ (macrolet ((def (name) `(defoptimizer (,name ir2-hook) ((string1 string2 &key start1 end1 start2 end2) node block) (declare (ignore block)) - (check-string-ranges string1 start1 end1 node 1) - (check-string-ranges string2 start2 end2 node 2)))) + (check-sequence-ranges string1 start1 end1 node 1 'string1) + (check-sequence-ranges string2 start2 end2 node 2 'string2)))) (def string-equal) (def string-not-equal) (def string-greaterp) @@ -1086,7 +1086,7 @@ (macrolet ((def (name) `(defoptimizer (,name ir2-hook) ((string &key start end) node block) (declare (ignore block)) - (check-string-ranges string start end node)))) + (check-sequence-ranges string start end node)))) (def string-downcase) (def string-upcase) (def nstring-downcase) @@ -1094,6 +1094,55 @@ (def string-capitalize) (def nstring-capitalize)) +(macrolet ((def (name &optional no-arg) + `(defoptimizer (,name ir2-hook) ((,@(unless no-arg '(x)) sequence &key start end &allow-other-keys) node block) + (declare (ignore ,@(unless no-arg '(x)) block)) + (check-sequence-ranges sequence start end node)))) + (def find) + (def find-if) + (def find-if-not) + (def position) + (def position-if) + (def position-if-not) + (def remove) + (def remove-if) + (def remove-if-not) + (def delete) + (def delete-if) + (def delete-if-not) + (def count) + (def count-if) + (def count-if-not) + (def reduce) + (def remove-duplicates t) + (def delete-duplicates t)) + +(defoptimizer (%find-position ir2-hook) ((item sequence from-end start end key test) node block) + (declare (ignore item from-end key test block)) + (check-sequence-ranges sequence start end node)) + +(defoptimizer (%find-position-if ir2-hook) ((predicate sequence from-end start end key) node block) + (declare (ignore predicate from-end key block)) + (check-sequence-ranges sequence start end node)) + +(defoptimizer (%find-position-if-not ir2-hook) ((predicate sequence from-end start end key) node block) + (declare (ignore predicate from-end key block)) + (check-sequence-ranges sequence start end node)) + +(defoptimizer (fill ir2-hook) ((sequence item &key start end) node block) + (declare (ignore item block)) + (check-sequence-ranges sequence start end node)) + +(defoptimizer (search ir2-hook) ((sub-sequence1 main-sequence2 &key start1 end1 start2 end2 &allow-other-keys) node block) + (declare (ignore block)) + (check-sequence-ranges sub-sequence1 start1 end1 node 1 'sub-sequence1) + (check-sequence-ranges main-sequence2 start2 end2 node 2 'main-sequence2)) + +(defoptimizer (mismatch ir2-hook) ((sequence1 sequence2 &key start1 end1 start2 end2 &allow-other-keys) node block) + (declare (ignore block)) + (check-sequence-ranges sequence1 start1 end1 node 1 'sequence1) + (check-sequence-ranges sequence2 start2 end2 node 2 'sequence2)) + (defun string-cmp-deriver (string1 string2 start1 end1 start2 end2 &optional equality) (flet ((dims (string start end) (let* ((type (lvar-type string)) @@ -1277,12 +1326,14 @@ :node node) (transform-replace nil node))) -(defoptimizer (replace ir2-hook) ((seq1 seq2 &key &allow-other-keys) node block) +(defoptimizer (replace ir2-hook) ((seq1 seq2 &key start1 end1 start2 end2) node block) (declare (ignore block)) (flet ((element-type (lvar) (type-array-element-type (lvar-type lvar)))) (let ((type1 (element-type seq1)) (type2 (element-type seq2))) + (check-sequence-ranges seq1 start1 end1 node 1 'target-sequence1) + (check-sequence-ranges seq2 start2 end2 node 2 'source-sequence2) (cond ((eq type1 *wild-type*)) ((eq type2 *wild-type*) (when (constant-lvar-p seq2) @@ -1340,35 +1391,21 @@ (type-specifier item-type) (type-specifier seq-type)))))))) -(defun check-substitute-args (new seq node) - (check-sequence-item new seq node "Can't substitute ~a into ~a")) - -(defoptimizer (substitute ir2-hook) ((new old seq &key &allow-other-keys) node block) - (declare (ignore old block)) - (check-substitute-args new seq node)) - -(defoptimizer (substitute-if ir2-hook) ((new predicate seq &key &allow-other-keys) node block) - (declare (ignore predicate block)) - (check-substitute-args new seq node)) - -(defoptimizer (substitute-if-not ir2-hook) ((new predicate seq &key &allow-other-keys) node block) - (declare (ignore predicate block)) - (check-substitute-args new seq node)) - -(defoptimizer (nsubstitute ir2-hook) ((new old seq &key &allow-other-keys) node block) - (declare (ignore old block)) - (check-substitute-args new seq node)) - -(defoptimizer (nsubstitute-if ir2-hook) ((new predicate seq &key &allow-other-keys) node block) - (declare (ignore predicate block)) - (check-substitute-args new seq node)) - -(defoptimizer (nsubstitute-if-not ir2-hook) ((new predicate seq &key &allow-other-keys) node block) - (declare (ignore predicate block)) - (check-substitute-args new seq node)) - -(defoptimizer (vector-fill* ir2-hook) ((seq item &key &allow-other-keys) node block) +(macrolet ((def (name) + `(defoptimizer (,name ir2-hook) ((new x seq &key start end &allow-other-keys) node block) + (declare (ignore x block)) + (check-sequence-ranges seq start end node) + (check-sequence-item new seq node "Can't substitute ~a into ~a")))) + (def substitute) + (def substitute-if) + (def substitute-if-not) + (def nsubstitute) + (def nsubstitute-if) + (def nsubstitute-if-not)) + +(defoptimizer (vector-fill* ir2-hook) ((seq item start end) node block) (declare (ignore block)) + (check-sequence-ranges seq start end node) (check-sequence-item item seq node "Can't fill ~a into ~a")) (defoptimizer (vector-push ir2-hook) ((item vector) node block) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index 8c3af3ed13..230f10ac1d 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -299,7 +299,7 @@ (declare (simple-vector x)) (search x #(t t t) :key k)) ((#() nil) 0)) - (checked-compile-and-assert (:optimize :safe) + (checked-compile-and-assert (:optimize :safe :allow-warnings 'warning) `(lambda (x) (declare (simple-vector x)) (search x #(t t t) :start2 1 :end2 0 :end1 0)) From 067a56e336ad3423cd85bbdf6ede4844d4e49418 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 3 Jun 2022 23:14:41 +0300 Subject: [PATCH 3444/4023] Warn about (concatenate 'bit-vector (the string x)) --- src/compiler/seqtran.lisp | 44 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index a3dd5ad716..169e7e8c0f 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1416,6 +1416,50 @@ (declare (ignore block min-extension)) (check-sequence-item item vector node "Can't push ~a into ~a")) +(defun check-concatenate (type sequences node &optional (description "concatenate")) + (let ((result-element-type (if (ctype-p type) + type + (type-array-element-type (specifier-type type))))) + (unless (or (eq result-element-type *wild-type*) + (eq result-element-type *universal-type*)) + (loop for i from 0 + for sequence in sequences + for sequence-type = (lvar-type sequence) + for element-type = (type-array-element-type sequence-type) + do (unless (or (eq element-type *wild-type*) + (types-equal-or-intersect element-type result-element-type)) + (let ((*compiler-error-context* node)) + (compiler-warn "Can't ~a ~s into ~s" + description + (type-specifier sequence-type) + (if (ctype-p type) + (type-specifier (make-array-type '(*) + :specialized-element-type type + :element-type type)) + type)))))))) + +(defoptimizer (%concatenate-to-string ir2-hook) ((&rest args) node block) + (declare (ignore block)) + (check-concatenate 'string args node)) + +(defoptimizer (%concatenate-to-base-string ir2-hook) ((&rest args) node block) + (declare (ignore block)) + (check-concatenate 'base-string args node)) + +(defoptimizer (%concatenate-to-vector ir2-hook) ((widetag &rest args) node block) + (declare (ignore block)) + (when (constant-lvar-p widetag) + (check-concatenate (sb-vm:saetp-ctype + (find (lvar-value widetag) + sb-vm:*specialized-array-element-type-properties* + :key #'sb-vm:saetp-typecode)) + args node))) + +(defoptimizer (merge ir2-hook) ((type sequence1 sequence2 predicate &key &allow-other-keys) node block) + (declare (ignore predicate block)) + (when (constant-lvar-p type) + (check-concatenate (lvar-value type) (list sequence1 sequence2) node "merge"))) + ;;; Expand simple cases of UB<SIZE>-BASH-COPY inline. "simple" is ;;; defined as those cases where we are doing word-aligned copies from ;;; both the source and the destination and we are copying from the same From 720e8ac197ea02013f14ae92032b810e28925bbe Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 3 Jun 2022 16:26:06 -0400 Subject: [PATCH 3445/4023] Hash SAPs better under sxhash Seems better than hashing them all to the same number. --- src/code/target-hash-table.lisp | 6 ++++++ src/code/target-sxhash.lisp | 6 ++++++ tests/hash.pure.lisp | 11 +++++++++++ 3 files changed, 23 insertions(+) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index dd575cf3fd..476e0ba320 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -66,6 +66,12 @@ (values (pointer-hash key) (sb-vm:is-lisp-pointer (get-lisp-obj-address key)))) +;;; Note: We could somewhat easily add SAP-WIDETAG into the list of types +;;; that get a stable hash for EQL tables (via SAP-HASH), however: +;;; - we don't compare SAPs with SAP= when the table's test is EQL, +;;; so there is no real advantage (nor requirement) to have a hash +;;; derived from the object's contents. +;;; - I don't imagine that users often store SAPs in hash-tables. (declaim (inline eql-hash eql-hash-no-memoize)) (macrolet ((define-eql-hash (name symbol-hash-fun) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 291771cea7..047e3bfcb8 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -277,6 +277,11 @@ ;;; To avoid "note: Return type not fixed values ..." (declaim (ftype (sfunction (t) hash-code) pathname-sxhash)) +(defun sap-hash (x) + ;; toss in a LOGNOT so that (the word a) and (int-sap a) hash differently + (let ((w (logand (lognot (sap-int x)) most-positive-word))) + (logand (murmur3-fmix-word w) most-positive-fixnum))) + (defun sxhash (x) ;; profiling SXHASH is hard, but we might as well try to make it go ;; fast, in case it is the bottleneck somewhere. -- CSR, 2003-03-14 @@ -344,6 +349,7 @@ (fsc-instance-hash x) ;; funcallable structure, not funcallable-standard-object 9550684)) + (system-area-pointer (sap-hash x)) (t 42)))) (sxhash-recurse x +max-hash-depthoid+))) diff --git a/tests/hash.pure.lisp b/tests/hash.pure.lisp index 9e13ad35ab..f2800f411c 100644 --- a/tests/hash.pure.lisp +++ b/tests/hash.pure.lisp @@ -503,3 +503,14 @@ (with-test (:name :mumur-hash-compare) (murmur-compare (make-random-state t) 100000)) + +(with-test (:name :sap-hash) + (assert (/= (sxhash (sb-sys:int-sap #x1000)) + (sxhash (sb-sys:int-sap 0)))) + (let ((list-of-saps + (loop for i below 1000 collect (sb-sys:int-sap i)))) + (ctu:assert-no-consing + (opaque-identity + (let ((foo 0)) + (dolist (sap list-of-saps foo) + (setq foo (logxor foo (sxhash sap))))))))) From 7005960fb8965250f8fb862a6248aa679d4daf99 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 4 Jun 2022 00:33:58 +0300 Subject: [PATCH 3446/4023] Disable a test on :interpreter. --- tests/hash.pure.lisp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/hash.pure.lisp b/tests/hash.pure.lisp index f2800f411c..ac4462bcf2 100644 --- a/tests/hash.pure.lisp +++ b/tests/hash.pure.lisp @@ -507,10 +507,11 @@ (with-test (:name :sap-hash) (assert (/= (sxhash (sb-sys:int-sap #x1000)) (sxhash (sb-sys:int-sap 0)))) + #-interpreter (let ((list-of-saps - (loop for i below 1000 collect (sb-sys:int-sap i)))) + (loop for i below 1000 collect (sb-sys:int-sap i)))) (ctu:assert-no-consing - (opaque-identity - (let ((foo 0)) - (dolist (sap list-of-saps foo) - (setq foo (logxor foo (sxhash sap))))))))) + (opaque-identity + (let ((foo 0)) + (dolist (sap list-of-saps foo) + (setq foo (logxor foo (sxhash sap))))))))) From 70941ae4ccf1bd2d85130f0b7c244be9fceb5087 Mon Sep 17 00:00:00 2001 From: Philipp Marek <philipp@marek.priv.at> Date: Thu, 2 Jun 2022 11:47:35 +0200 Subject: [PATCH 3447/4023] NTH type derivation: also take the index type into consideration. Works eg. with this: (defconstant +c-l+ (load-time-value (alexandria:circular-list 1 3 5 7 9 11))) (defun NNN (x) (declare (type (integer 1 4) x)) (values (nth x '(2 3 1 4 "bar" "foo" "baz")) (nth x +c-l+))) --- src/compiler/seqtran.lisp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 169e7e8c0f..edce331489 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -3131,11 +3131,16 @@ (defoptimizer (nth derive-type) ((n list)) (when (constant-lvar-p list) - (let* ((list (lvar-value list)) + (let* ((index-range (type-approximate-interval (lvar-type n))) + (index-from (max 0 (interval-low index-range))) + (index-to (or (interval-high index-range) + array-dimension-limit)) + (list (nthcdr index-from (lvar-value list))) (rest list) type (seen (list list))) - (loop for element = (pop rest) + (loop repeat (- index-to index-from) + for element = (pop rest) do (setf type (if type (type-union (ctype-of element) type) From e662449b9880ec9f56304150618a0347e9a48c80 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 23 May 2022 21:35:00 -0700 Subject: [PATCH 3448/4023] Add :not-host to some fop definitions. To make it clear they are not used for cold-load. --- src/code/load.lisp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index c781258349..1ba14b638f 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1238,9 +1238,9 @@ ,@(mapcar (lambda (spec) `((,(cadr spec)) ,(car spec))) specs))) ,@(mapcar (lambda (spec) - `(define-fop ,(car spec) - (,(symbolicate "FOP-LAYOUT-OF-" - (cadr spec))) + `(define-fop ,(car spec) :not-host + (,(symbolicate "FOP-LAYOUT-OF-" + (cadr spec))) ,(find-layout (cadr spec)))) specs)))) (frob (#x68 t) From a05a258b8c6056a0eb3f610bd540ce7b2b123ecc Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 23 May 2022 23:36:01 -0700 Subject: [PATCH 3449/4023] Simplify cold FOP-FUNCALL. No need to grovel %FASL-INPUT-STACK manually anymore. --- src/compiler/generic/genesis.lisp | 37 +++++++++++++------------------ 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 7721e616e0..11592e33bf 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2553,27 +2553,22 @@ Legal values for OFFSET are -4, -8, -12, ..." (defvar *load-time-value-counter*) -(flet ((pop-args (argc fasl-input) - (let ((args) - (stack (%fasl-input-stack fasl-input))) - (dotimes (i argc (values (pop-fop-stack stack) args)) - (push (pop-fop-stack stack) args))))) - (define-cold-fop (fop-funcall (n)) - (multiple-value-bind (fun args) (pop-args n (fasl-input)) - (if args - (case fun - (values-specifier-type - (let* ((des (first args)) - (spec (if (descriptor-p des) (host-object-from-core des) des))) - (ctype-to-core spec (if (eq spec '*) - *wild-type* - (funcall fun spec))))) - (t (error "Can't FOP-FUNCALL with function ~S in cold load." fun))) - (let ((counter *load-time-value-counter*)) - (push (cold-list (cold-intern :load-time-value) fun - (number-to-core counter)) *!cold-toplevels*) - (setf *load-time-value-counter* (1+ counter)) - (make-ltv-patch counter)))))) +(define-cold-fop (fop-funcall (n)) + (if (= n 0) + (let ((counter *load-time-value-counter*)) + (push (cold-list (cold-intern :load-time-value) + (pop-stack) + (number-to-core counter)) *!cold-toplevels*) + (setf *load-time-value-counter* (1+ counter)) + (make-ltv-patch counter)) + (let ((des (pop-stack))) + (unless (and (= n 1) + (eq (pop-stack) 'values-specifier-type)) + (error "Can't FOP-FUNCALL random stuff in cold load.")) + (let ((spec (if (descriptor-p des) (host-object-from-core des) des))) + (ctype-to-core spec (if (eq spec '*) + *wild-type* + (values-specifier-type spec))))))) (defun finalize-load-time-value-noise () (cold-set '*!load-time-values* From 84d6794ab715537cb8bb1bc53554f6b154ef97db Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 3 Jun 2022 22:17:50 -0400 Subject: [PATCH 3450/4023] Fix debugger crash due to another omission from rev a7b603ff39 Would it kill us to put compile-time AVERs about widetag requirements? Considering that the comment removed was my own, I'm slightly to blame though I didn't author the code that made the assumption. --- src/compiler/arm/debug.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/arm/debug.lisp b/src/compiler/arm/debug.lisp index 4d16efb816..7c7e88dc95 100644 --- a/src/compiler/arm/debug.lisp +++ b/src/compiler/arm/debug.lisp @@ -56,7 +56,7 @@ (:variant-vars lowtag) (:generator 5 (loadw temp thing 0 lowtag) - ;; SLEAZY ASSUMPTION: THE WIDETAG HAS TWO HIGH ZERO BITS + (inst bic temp temp widetag-mask) (inst mov temp (lsr temp (- n-widetag-bits word-shift))) (inst cmp temp 0) (unless (= lowtag other-pointer-lowtag) From 2beff7ab6292e41e20fa30da1b67cfc2e4c4b80c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 3 Jun 2022 23:11:39 -0400 Subject: [PATCH 3451/4023] Skip failing tests They already had a :skipped-on but it's inadequate --- tests/debug.impure.lisp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 4dbccdbf6a..fb343fd2b7 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -445,6 +445,7 @@ (flet ((body () 42)) (body)))))) +#-(or ppc ppc64) (with-test (:name (trace :compiler-macro :redefined) . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces ((compiler-macro fn-with-cmac) @@ -544,6 +545,7 @@ (labels ((fact (x) (if (zerop x) 1 (* x (fact (1- x)))))) (fact x))))))) +#-(or ppc ppc64) (with-test (:name (trace :macro :redefined) . #.*breakpoint-tracing-expectations*) (assert (equal (collecting-traces (macro-fact From 203a0e958a4b42ec9bd80f5df8ddef58ae248cf3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 3 Jun 2022 23:41:16 -0400 Subject: [PATCH 3452/4023] Perform colonectomy --- src/code/debug-int.lisp | 214 +++++++++++++++++++--------------------- 1 file changed, 101 insertions(+), 113 deletions(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index c9ee8bbe05..471c1925f4 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -369,7 +369,7 @@ ;; This is the byte offset into the component. (offset nil :type index :read-only t) ;; The original instruction replaced by the breakpoint. - (instruction nil :type (or null sb-vm:word)) + (instruction nil :type (or null word)) ;; A list of user breakpoints at this location. (breakpoints nil :type list)) (defmethod print-object ((obj breakpoint-data) str) @@ -526,7 +526,7 @@ ;;; "#define REAL_LRA_SLOT" in breakpoint.c. These have unfortunately ;;; different values, because this slot is relative to the object base ;;; address, whereas the one in C is an index into code->constants. -(defconstant real-lra-slot sb-vm:code-constants-offset) +(defconstant real-lra-slot code-constants-offset) (declaim (inline control-stack-pointer-valid-p)) (defun control-stack-pointer-valid-p (x &optional (aligned t)) @@ -541,12 +541,12 @@ (and (sap< x (current-sp)) (sap<= control-stack-start x) (or (not aligned) (zerop (logand (sap-int x) - (1- (ash 1 sb-vm:word-shift)))))) + (1- (ash 1 word-shift)))))) #+stack-grows-downward-not-upward (and (sap>= x (current-sp)) (sap> control-stack-end x) (or (not aligned) (zerop (logand (sap-int x) - (1- (ash 1 sb-vm:word-shift)))))))) + (1- (ash 1 word-shift)))))))) (declaim (inline valid-lisp-pointer-p)) (sb-alien:define-alien-routine valid-lisp-pointer-p sb-alien:int @@ -631,9 +631,8 @@ (function sb-alien:unsigned system-area-pointer)) (etypecase pc (system-area-pointer pc) - (sb-vm:word (int-sap pc)))))) - (unless (= base-ptr 0) - (%make-lisp-obj (logior base-ptr sb-vm:other-pointer-lowtag)))))) + (word (int-sap pc)))))) + (unless (= base-ptr 0) (%make-lisp-obj (logior base-ptr other-pointer-lowtag)))))) ;;;; (OR X86 X86-64) support @@ -883,7 +882,7 @@ (if code (values code (* (1+ (- word-offset (code-header-words code))) - sb-vm:n-word-bytes) + n-word-bytes) nil) (values :foreign-function 0 @@ -997,11 +996,11 @@ (defun nth-interrupt-context (n) (declare (muffle-conditions compiler-note)) - (declare (type (mod #.sb-vm:max-interrupts) n) + (declare (type (mod #.max-interrupts) n) (optimize (speed 3) (safety 0))) (let ((tls-words (ash (sb-alien:extern-alien "dynamic_values_bytes" (sb-alien:unsigned 32)) - (- sb-vm:word-shift)))) + (- word-shift)))) (sb-alien:sap-alien (sb-vm::current-thread-offset-sap (+ tls-words n)) (* os-context-t)))) @@ -1145,10 +1144,9 @@ For some architectures (such as PPC) this will not be the $LRA register." (with-pinned-objects (code) (let ((return-machine-address (sb-vm::return-machine-address scp)) - (code-header-len (* (code-header-words code) sb-vm:n-word-bytes))) + (code-header-len (* (code-header-words code) n-word-bytes))) (values (- return-machine-address - (- (get-lisp-obj-address code) - sb-vm:other-pointer-lowtag) + (- (get-lisp-obj-address code) other-pointer-lowtag) code-header-len) return-machine-address)))) @@ -1211,9 +1209,9 @@ register." (normalize-candidate #+ppc64 (let ((code (context-register context sb-vm::code-offset))) - (%make-lisp-obj (if (logtest sb-vm:lowtag-mask code) + (%make-lisp-obj (if (logtest lowtag-mask code) code - (logior code sb-vm:other-pointer-lowtag)))) + (logior code other-pointer-lowtag)))) #-ppc64 (boxed-context-register context sb-vm::code-offset))) (let ((candidate @@ -1407,7 +1405,7 @@ register." (let* ((fun (%fun-fun function)) (code (fun-code-header fun))) (- (%fun-code-offset fun) - (* (code-header-words code) sb-vm:n-word-bytes)))) + (* (code-header-words code) n-word-bytes)))) ;;; Return the object of type FUNCTION associated with the DEBUG-FUN, ;;; or NIL if the function is unavailable or is non-existent as a user @@ -2374,15 +2372,15 @@ register." (defun make-lisp-obj (val &optional (errorp t)) (if (or ;; fixnum - (zerop (logand val sb-vm:fixnum-tag-mask)) + (zerop (logand val fixnum-tag-mask)) ;; immediate single float, 64-bit only #+64-bit - (= (logand val #xff) sb-vm:single-float-widetag) + (= (logand val #xff) single-float-widetag) ;; character (and (zerop (logandc2 val #x1fffffff)) ; Top bits zero - (= (logand val #xff) sb-vm:character-widetag)) ; char tag + (= (logand val #xff) character-widetag)) ; char tag ;; unbound marker - (= val sb-vm:unbound-marker-widetag)) + (= val unbound-marker-widetag)) (values (%make-lisp-obj val) t) ;; To mitigate the danger of GC running in between testing pointer ;; validity and returning the object, we must pin a potentially @@ -2414,8 +2412,7 @@ register." ;; highlight its brokenness. (macrolet ((with-escaped-value ((var) &body forms) `(if escaped - (let ((,var (sb-vm:context-register - escaped + (let ((,var (context-register escaped (sb-c:sc+offset-offset sc+offset)))) ,@forms) :invalid-value-for-unescaped-register-storage)) @@ -2427,8 +2424,7 @@ register." :invalid-value-for-unescaped-register-storage)) (escaped-float-value (format) `(if escaped - (sb-vm:context-float-register - escaped + (context-float-register escaped (sb-c:sc+offset-offset sc+offset) ',format) :invalid-value-for-unescaped-register-storage)) (with-nfp ((var) &body body) @@ -2440,41 +2436,39 @@ register." #-c-stack-is-control-stack `(let ((,var (if escaped (int-sap - (sb-vm:context-register escaped - sb-vm::nfp-offset)) - (sap-ref-sap fp (* nfp-save-offset - sb-vm:n-word-bytes))))) + (context-register escaped sb-vm::nfp-offset)) + (sap-ref-sap fp (* nfp-save-offset n-word-bytes))))) ,@body)) (number-stack-offset (&optional (offset 0)) #+(or x86 x86-64) `(+ (sb-vm::frame-byte-offset (sb-c:sc+offset-offset sc+offset)) ,offset) #-(or x86 x86-64) - `(+ (* (sb-c:sc+offset-offset sc+offset) sb-vm:n-word-bytes) + `(+ (* (sb-c:sc+offset-offset sc+offset) n-word-bytes) ,offset))) (ecase (sb-c:sc+offset-scn sc+offset) - ((#.sb-vm:any-reg-sc-number - #.sb-vm:descriptor-reg-sc-number) + ((#.any-reg-sc-number + #.descriptor-reg-sc-number) (escaped-boxed-value)) - (#.sb-vm:character-reg-sc-number + (#.character-reg-sc-number (with-escaped-value (val) (code-char val))) - (#.sb-vm:sap-reg-sc-number + (#.sap-reg-sc-number (with-escaped-value (val) (int-sap val))) - (#.sb-vm:signed-reg-sc-number + (#.signed-reg-sc-number (with-escaped-value (val) - (if (logbitp (1- sb-vm:n-word-bits) val) - (logior val (ash -1 sb-vm:n-word-bits)) + (if (logbitp (1- n-word-bits) val) + (logior val (ash -1 n-word-bits)) val))) - (#.sb-vm:unsigned-reg-sc-number + (#.unsigned-reg-sc-number (with-escaped-value (val) val)) #-(or x86 x86-64) - (#.sb-vm:non-descriptor-reg-sc-number + (#.non-descriptor-reg-sc-number (error "Local non-descriptor register access?")) #-(or x86 x86-64 arm64) - (#.sb-vm:interior-reg-sc-number + (#.interior-reg-sc-number (error "Local interior register access?")) #+sb-simd-pack ((#.sb-vm::sse-reg-sc-number #.sb-vm::int-sse-reg-sc-number) @@ -2542,65 +2536,65 @@ register." (sap-ref-double nfp (number-stack-offset 8)) (sap-ref-double nfp (number-stack-offset 16)) (sap-ref-double nfp (number-stack-offset 24))))) - (#.sb-vm:single-reg-sc-number + (#.single-reg-sc-number (escaped-float-value single-float)) - (#.sb-vm:double-reg-sc-number + (#.double-reg-sc-number (escaped-float-value double-float)) #+long-float - (#.sb-vm:long-reg-sc-number + (#.long-reg-sc-number (escaped-float-value long-float)) - (#.sb-vm:complex-single-reg-sc-number + (#.complex-single-reg-sc-number (escaped-float-value complex-single-float)) - (#.sb-vm:complex-double-reg-sc-number + (#.complex-double-reg-sc-number (escaped-float-value complex-double-float)) #+long-float - (#.sb-vm:complex-long-reg-sc-number + (#.complex-long-reg-sc-number (escaped-float-value sb-kernel::complex-long-float)) - (#.sb-vm:single-stack-sc-number + (#.single-stack-sc-number (with-nfp (nfp) (sap-ref-single nfp (number-stack-offset)))) - (#.sb-vm:double-stack-sc-number + (#.double-stack-sc-number (with-nfp (nfp) (sap-ref-double nfp (number-stack-offset)))) #+long-float - (#.sb-vm:long-stack-sc-number + (#.long-stack-sc-number (with-nfp (nfp) (sap-ref-long nfp (number-stack-offset)))) - (#.sb-vm:complex-single-stack-sc-number + (#.complex-single-stack-sc-number (with-nfp (nfp) (complex (sap-ref-single nfp (number-stack-offset)) (sap-ref-single nfp (number-stack-offset 4))))) - (#.sb-vm:complex-double-stack-sc-number + (#.complex-double-stack-sc-number (with-nfp (nfp) (complex (sap-ref-double nfp (number-stack-offset)) (sap-ref-double nfp (number-stack-offset 8))))) #+long-float - (#.sb-vm:complex-long-stack-sc-number + (#.complex-long-stack-sc-number (with-nfp (nfp) (complex (sap-ref-long nfp (number-stack-offset)) (sap-ref-long nfp (number-stack-offset #+sparc 4 #+(or x86 x86-64) 3))))) - (#.sb-vm:control-stack-sc-number + (#.control-stack-sc-number (stack-ref fp (sb-c:sc+offset-offset sc+offset))) - (#.sb-vm:character-stack-sc-number + (#.character-stack-sc-number (with-nfp (nfp) (code-char (sap-ref-word nfp (number-stack-offset))))) - (#.sb-vm:unsigned-stack-sc-number + (#.unsigned-stack-sc-number (with-nfp (nfp) (sap-ref-word nfp (number-stack-offset)))) - (#.sb-vm:signed-stack-sc-number + (#.signed-stack-sc-number (with-nfp (nfp) (signed-sap-ref-word nfp (number-stack-offset)))) - (#.sb-vm:sap-stack-sc-number + (#.sap-stack-sc-number (with-nfp (nfp) (sap-ref-sap nfp (number-stack-offset)))) (#.constant-sc-number (if escaped - (let ((code (code-header-from-pc (sb-vm:context-pc escaped)))) + (let ((code (code-header-from-pc (context-pc escaped)))) (if code (code-header-ref code (sb-c:sc+offset-offset sc+offset)) :invalid-code-object-at-pc)) @@ -2654,8 +2648,7 @@ register." ;; systems. (macrolet ((set-escaped-value (val) `(if escaped - (setf (sb-vm:context-register - escaped + (setf (context-register escaped (sb-c:sc+offset-offset sc+offset)) ,val) value)) @@ -2668,8 +2661,7 @@ register." value)) (set-escaped-float-value (format val) `(if escaped - (setf (sb-vm:context-float-register - escaped + (setf (context-float-register escaped (sb-c:sc+offset-offset sc+offset) ',format) ,val) @@ -2682,37 +2674,33 @@ register." ,@body) #-c-stack-is-control-stack `(let ((,var (if escaped - (int-sap - (sb-vm:context-register escaped - sb-vm::nfp-offset)) - (sap-ref-sap fp - (* nfp-save-offset - sb-vm:n-word-bytes))))) + (int-sap (context-register escaped sb-vm::nfp-offset)) + (sap-ref-sap fp (* nfp-save-offset n-word-bytes))))) ,@body)) (number-stack-offset (&optional (offset 0)) #+(or x86 x86-64) `(+ (sb-vm::frame-byte-offset (sb-c:sc+offset-offset sc+offset)) ,offset) #-(or x86 x86-64) - `(+ (* (sb-c:sc+offset-offset sc+offset) sb-vm:n-word-bytes) + `(+ (* (sb-c:sc+offset-offset sc+offset) n-word-bytes) ,offset))) (ecase (sb-c:sc+offset-scn sc+offset) - ((#.sb-vm:any-reg-sc-number - #.sb-vm:descriptor-reg-sc-number) + ((#.any-reg-sc-number + #.descriptor-reg-sc-number) (set-escaped-boxed-value value)) - (#.sb-vm:character-reg-sc-number + (#.character-reg-sc-number (set-escaped-value (char-code value))) - (#.sb-vm:sap-reg-sc-number + (#.sap-reg-sc-number (set-escaped-value (sap-int value))) - (#.sb-vm:signed-reg-sc-number + (#.signed-reg-sc-number (set-escaped-value (logand value most-positive-word))) - (#.sb-vm:unsigned-reg-sc-number + (#.unsigned-reg-sc-number (set-escaped-value value)) #-(or x86 x86-64) - (#.sb-vm:non-descriptor-reg-sc-number + (#.non-descriptor-reg-sc-number (error "Local non-descriptor register access?")) #-(or x86 x86-64 arm64) - (#.sb-vm:interior-reg-sc-number + (#.interior-reg-sc-number (error "Local interior register access?")) #+sb-simd-pack ((#.sb-vm::sse-reg-sc-number #.sb-vm::int-sse-reg-sc-number) @@ -2780,35 +2768,35 @@ register." (sap-ref-double nfp (number-stack-offset 8)) b (sap-ref-double nfp (number-stack-offset 16)) c (sap-ref-double nfp (number-stack-offset 24)) d)))) - (#.sb-vm:single-reg-sc-number + (#.single-reg-sc-number #-(or x86 x86-64) ;; don't have escaped floats. (set-escaped-float-value single-float value)) - (#.sb-vm:double-reg-sc-number + (#.double-reg-sc-number (set-escaped-float-value double-float value)) #+long-float - (#.sb-vm:long-reg-sc-number + (#.long-reg-sc-number (set-escaped-float-value long-float value)) - (#.sb-vm:complex-single-reg-sc-number + (#.complex-single-reg-sc-number (set-escaped-float-value complex-single-float value)) - (#.sb-vm:complex-double-reg-sc-number + (#.complex-double-reg-sc-number (set-escaped-float-value complex-double-float value)) #+long-float - (#.sb-vm:complex-long-reg-sc-number + (#.complex-long-reg-sc-number (set-escaped-float-value complex-long-float)) - (#.sb-vm:single-stack-sc-number + (#.single-stack-sc-number (with-nfp (nfp) (setf (sap-ref-single nfp (number-stack-offset)) (the single-float value)))) - (#.sb-vm:double-stack-sc-number + (#.double-stack-sc-number (with-nfp (nfp) (setf (sap-ref-double nfp (number-stack-offset)) (the double-float value)))) #+long-float - (#.sb-vm:long-stack-sc-number + (#.long-stack-sc-number (with-nfp (nfp) (setf (sap-ref-long nfp (number-stack-offset)) (the long-float value)))) - (#.sb-vm:complex-single-stack-sc-number + (#.complex-single-stack-sc-number (with-nfp (nfp) (setf (sap-ref-single nfp (number-stack-offset)) #+(or x86 x86-64) @@ -2820,7 +2808,7 @@ register." (imagpart (the (complex single-float) value)) #-(or x86 x86-64) (the single-float (realpart value))))) - (#.sb-vm:complex-double-stack-sc-number + (#.complex-double-stack-sc-number (with-nfp (nfp) (setf (sap-ref-double nfp (number-stack-offset)) #+(or x86 x86-64) @@ -2833,7 +2821,7 @@ register." #-(or x86 x86-64) (the double-float (realpart value))))) #+long-float - (#.sb-vm:complex-long-stack-sc-number + (#.complex-long-stack-sc-number (with-nfp (nfp) (setf (sap-ref-long nfp (number-stack-offset)) @@ -2848,21 +2836,21 @@ register." (imagpart (the (complex long-float) value)) #-(or x86 x86-64) (the long-float (realpart value))))) - (#.sb-vm:control-stack-sc-number + (#.control-stack-sc-number (%set-stack-ref fp (sb-c:sc+offset-offset sc+offset) value) value) ; I doubt that the return value matters, but who knows ... - (#.sb-vm:character-stack-sc-number + (#.character-stack-sc-number (with-nfp (nfp) (setf (sap-ref-word nfp (number-stack-offset 0)) (char-code (the character value))))) - (#.sb-vm:unsigned-stack-sc-number + (#.unsigned-stack-sc-number (with-nfp (nfp) (setf (sap-ref-word nfp (number-stack-offset 0)) (the word value)))) - (#.sb-vm:signed-stack-sc-number + (#.signed-stack-sc-number (with-nfp (nfp) (setf (signed-sap-ref-word nfp (number-stack-offset)) (the signed-word value)))) - (#.sb-vm:sap-stack-sc-number + (#.sap-stack-sc-number (with-nfp (nfp) (setf (sap-ref-sap nfp (number-stack-offset)) (the system-area-pointer value))))))) @@ -2872,7 +2860,7 @@ register." ;;; indirection cell. (defun indirect-value-cell-p (x) (and (%other-pointer-p x) - (eql (%other-pointer-widetag x) sb-vm:value-cell-widetag))) + (eql (%other-pointer-widetag x) value-cell-widetag))) ;;; Return three values reflecting the validity of DEBUG-VAR's value ;;; at BASIC-CODE-LOCATION: @@ -3387,7 +3375,7 @@ register." :unknown-return-partner) (eq (compiled-code-location-kind loc) :single-value-return)) - sb-vm:single-value-return-byte-offset + single-value-return-byte-offset 0)))))) (defun activate-compiled-fun-start-breakpoint (breakpoint) @@ -3637,12 +3625,12 @@ register." (defun signal-context-frame (signal-context) (let* ((scp (sb-alien:sap-alien signal-context (* os-context-t))) - (cfp (int-sap (sb-vm:context-register scp sb-vm::cfp-offset)))) + (cfp (int-sap (context-register scp sb-vm::cfp-offset)))) (compute-calling-frame cfp ;; KLUDGE: This argument is ignored on ;; x86oids in this scenario, but is ;; declared to be a SAP. - #+(or x86 x86-64) (sb-vm:context-pc scp) + #+(or x86 x86-64) (context-pc scp) #-(or x86 x86-64) nil nil))) @@ -3676,7 +3664,7 @@ register." cookie)))) (defun get-fun-end-breakpoint-values (scp) - (let ((ocfp (int-sap (sb-vm:context-register + (let ((ocfp (int-sap (context-register scp #-(or x86 x86-64) sb-vm::ocfp-offset #+x86-64 sb-vm::rbx-offset @@ -3723,19 +3711,19 @@ register." ;; For x86[-64]: one boxed constant holds the code object to which ;; to return, and one holds the displacement into that object. ;; Ensure required boxed header alignment. - (align-up (+ sb-vm:code-constants-offset 1 #+(or x86-64 x86) 1) + (align-up (+ code-constants-offset 1 #+(or x86-64 x86) 1) sb-c::code-boxed-words-align) (+ length - sb-vm:n-word-bytes ; Jump Table prefix word + n-word-bytes ; Jump Table prefix word ;; Alignment padding, LRA header - #-(or x86 x86-64) (* 2 sb-vm:n-word-bytes) + #-(or x86 x86-64) (* 2 n-word-bytes) ;; 2 extra raw bytes represent CODE-N-ENTRIES (which is zero) 2)))) (setf (%code-debug-info code-object) :bpt-lra) (with-pinned-objects (code-object) #+(or x86 x86-64 arm64) (let ((instructions ; Don't touch the jump table prefix word - (sap+ (code-instructions code-object) sb-vm:n-word-bytes))) + (sap+ (code-instructions code-object) n-word-bytes))) (multiple-value-bind (offset code) (compute-lra-data-from-pc real-lra) (setf (code-header-ref code-object real-lra-slot) code (code-header-ref code-object (1+ real-lra-slot)) offset) @@ -3745,25 +3733,25 @@ register." ;; to return a SAP to the instructions. ;; TRAP-OFFSET is the distance from CODE-INSTRUCTIONS to the trapping ;; opcode, for which we have to account for the jump table prefix word. - (values instructions code-object (+ (trap-offset) sb-vm:n-word-bytes)))) + (values instructions code-object (+ (trap-offset) n-word-bytes)))) #-(or x86 x86-64 arm64) (let* ((lra-header-addr ;; Skip over the jump table prefix, and align properly for LRA header - (sap+ (code-instructions code-object) (* 2 sb-vm:n-word-bytes))) + (sap+ (code-instructions code-object) (* 2 n-word-bytes))) ;; Compute the LRA->code backpointer in words (delta (ash (sap- lra-header-addr (int-sap (logandc2 (get-lisp-obj-address code-object) - sb-vm:lowtag-mask))) - (- sb-vm:word-shift)))) + lowtag-mask))) + (- word-shift)))) (setf (code-header-ref code-object real-lra-slot) real-lra) (setf (sap-ref-word lra-header-addr 0) - (logior (ash delta sb-vm:n-widetag-bits) sb-vm:return-pc-widetag)) + (logior (ash delta n-widetag-bits) return-pc-widetag)) (system-area-ub8-copy (int-sap src-start) 0 - (sap+ lra-header-addr sb-vm:n-word-bytes) + (sap+ lra-header-addr n-word-bytes) 0 length) - (values (%make-lisp-obj (logior (sap-int lra-header-addr) sb-vm:other-pointer-lowtag)) - (sb-vm:sanctify-for-execution code-object) - (+ (trap-offset) (* 3 sb-vm:n-word-bytes)))))))) + (values (%make-lisp-obj (logior (sap-int lra-header-addr) other-pointer-lowtag)) + (sanctify-for-execution code-object) + (+ (trap-offset) (* 3 n-word-bytes)))))))) ;;;; miscellaneous @@ -3849,7 +3837,7 @@ register." (t #+ppc64 (logior (context-register context callee-register-offset) - sb-vm:other-pointer-lowtag) + other-pointer-lowtag) #-ppc64 (context-register context callee-register-offset))))) (step-info (single-step-info-from-context context))) @@ -3915,7 +3903,7 @@ register." (t (setf (context-register context callee-register-offset) #+ppc64 - (logandc2 (get-lisp-obj-address new-callee) sb-vm:lowtag-mask) + (logandc2 (get-lisp-obj-address new-callee) lowtag-mask) #-ppc64 (get-lisp-obj-address new-callee)))))))) From 1a1cf9c51f46bcb01909e6b330d029f0bbcc9373 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 4 Jun 2022 00:27:40 -0700 Subject: [PATCH 3453/4023] Revert "NTH type derivation: also take the index type into consideration." This reverts commit 70941ae4ccf1bd2d85130f0b7c244be9fceb5087. It breaks a few tests in the ansi-test suite. --- src/compiler/seqtran.lisp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index edce331489..169e7e8c0f 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -3131,16 +3131,11 @@ (defoptimizer (nth derive-type) ((n list)) (when (constant-lvar-p list) - (let* ((index-range (type-approximate-interval (lvar-type n))) - (index-from (max 0 (interval-low index-range))) - (index-to (or (interval-high index-range) - array-dimension-limit)) - (list (nthcdr index-from (lvar-value list))) + (let* ((list (lvar-value list)) (rest list) type (seen (list list))) - (loop repeat (- index-to index-from) - for element = (pop rest) + (loop for element = (pop rest) do (setf type (if type (type-union (ctype-of element) type) From 40c2ad71cd64661f668007c170e778bc8c79671a Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Fri, 3 Jun 2022 22:26:41 -0700 Subject: [PATCH 3454/4023] genesis: Create cold packages "on demand". By creating packages on demand only for those symbols that actually get loaded during genesis, we no longer create packages in the target that aren't needed. This makes cross-compilation and cold loading custom builds with stuff added or removed more flexible. It also allows us to create packages normally without the extra indirection of making package data objects in the future. This also centralizes the creation of the packages COMMON-LISP, COMMON-LISP-USER, and KEYWORD, allowing docstrings to be initialized all in one place. We also define a cross compiler version of PACKAGE-NAME that returns COMMON-LISP for the XC-STRICT-CL and SB-XC packages, since this could potentially get confusing. --- make-target-2-load.lisp | 14 +- src/code/cross-misc.lisp | 10 +- src/code/cross-type.lisp | 2 +- src/code/debug-int.lisp | 4 +- src/code/defbangstruct.lisp | 2 +- src/code/defstruct.lisp | 4 +- src/code/string-hash.lisp | 2 +- src/cold/set-up-cold-packages.lisp | 11 +- src/compiler/dump.lisp | 2 +- src/compiler/generic/genesis.lisp | 216 ++++++++++++++--------------- tools-for-build/corefile.lisp | 5 +- 11 files changed, 129 insertions(+), 143 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index 05538ff51b..14f56d68d3 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -218,16 +218,10 @@ Please check that all strings which were not recognizable to the compiler (as the first argument to WARN, etc.) are wrapped in SB-FORMAT:TOKENS")) wps))) -;;; Either set some more package docstrings, or remove any and all docstrings -;;; that snuck in (as can happen with any file compiled in warm load) -;;; depending on presence of the :sb-doc internal feature. -(if (member :sb-doc sb-impl:+internal-features+) - (setf (documentation (find-package "COMMON-LISP") t) - "public: home of symbols defined by the ANSI language specification" - (documentation (find-package "COMMON-LISP-USER") t) - "public: the default package for user code and data" - (documentation (find-package "KEYWORD") t) - "public: home of keywords") +;;; If the SB-DOC internal feature is not present, remove any and all +;;; docstrings that snuck in (as can happen with any file compiled in +;;; warm load). +(unless (member :sb-doc sb-impl:+internal-features+) (let ((count 0)) (macrolet ((clear-it (place) `(when ,place diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index 90a1e551af..25be3f86ac 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -200,10 +200,18 @@ (declaim (declaration enable-package-locks disable-package-locks)) +;;; The XC-STRICT-CL and SB-XC packages are called COMMON-LISP in the +;;; target image. +(defun sb-xc:package-name (package) + (if (or (eq package #.(find-package "SB-XC")) + (eq package #.(find-package "XC-STRICT-CL"))) + "COMMON-LISP" + (cl:package-name package))) + ;; Nonstandard accessor for when you know you have a valid package in hand. ;; This avoids double lookup in *PACKAGE-NAMES* in a few places. ;; But portably we have to just fallback to PACKAGE-NAME. -(defun package-%name (x) (package-name x)) +(defun package-%name (x) (sb-xc:package-name x)) ;;; This definition collapses SB-XC back into COMMON-LISP. ;;; Use CL:SYMBOL-PACKAGE if that's not the behavior you want. diff --git a/src/code/cross-type.lisp b/src/code/cross-type.lisp index 4afd2e8ffe..861bbace67 100644 --- a/src/code/cross-type.lisp +++ b/src/code/cross-type.lisp @@ -69,7 +69,7 @@ ;;; Defined here so that CROSS-TYPEP can use it. ;;; The target variant of this is in src/code/package. (defmacro system-package-p (package) - `(eql (mismatch "SB-" (package-name ,package)) 3)) + `(eql (mismatch "SB-" (cl:package-name ,package)) 3)) ;;; This is like TYPEP, except that it asks whether OBJ (a host object acting ;;; as a proxy for some logically equivalent object in the target sytem) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 471c1925f4..3fd196b13b 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -1544,7 +1544,7 @@ register." (defun debug-fun-symbol-vars (debug-fun symbol) (let ((vars (ambiguous-debug-vars debug-fun (symbol-name symbol))) (package (and (sb-xc:symbol-package symbol) - (package-name (sb-xc:symbol-package symbol))))) + (sb-xc:package-name (sb-xc:symbol-package symbol))))) (delete-if (if (stringp package) (lambda (var) (let ((p (debug-var-package-name var))) @@ -2276,7 +2276,7 @@ register." ;;; be acceptable to have NIL returned, or that it's only called on ;;; DEBUG-VARs whose symbols have non-NIL packages. (defun debug-var-package-name (debug-var) - (package-name (sb-xc:symbol-package (debug-var-symbol debug-var)))) + (sb-xc:package-name (sb-xc:symbol-package (debug-var-symbol debug-var)))) ;;; Return the value stored for DEBUG-VAR in frame, or if the value is ;;; not :VALID, then signal an INVALID-VALUE error. diff --git a/src/code/defbangstruct.lisp b/src/code/defbangstruct.lisp index c69784bffb..7dba5d8572 100644 --- a/src/code/defbangstruct.lisp +++ b/src/code/defbangstruct.lisp @@ -22,7 +22,7 @@ (defstruct (delayed-defstruct (:constructor make-delayed-defstruct (args))) (args nil :type cons) ;; because the expansion autogenerates slot names based on current package - (package (package-name *package*) :type string)) + (package (cl:package-name *package*) :type string)) ;; a list of DELAYED-DEFSTRUCTs stored until we get SB-XC:DEFSTRUCT ;; working fully so that we can apply it to them then. After ;; SB-XC:DEFSTRUCT is made to work fully, this list is processed, then diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 63acafa8b4..b2ed579b46 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -2350,8 +2350,8 @@ or they must be declared locally notinline at each call site.~@:>" (flet ((pred (x y) (or (string< x y) (and (string= x y) - (let ((xpn (package-name (cl:symbol-package x))) - (ypn (package-name (cl:symbol-package y)))) + (let ((xpn (cl:package-name (cl:symbol-package x))) + (ypn (cl:package-name (cl:symbol-package y)))) (string< xpn ypn)))))) (sort (%hash-table-alist subclassoids) #'pred diff --git a/src/code/string-hash.lisp b/src/code/string-hash.lisp index c28c95977b..b1bacf22ee 100644 --- a/src/code/string-hash.lisp +++ b/src/code/string-hash.lisp @@ -213,7 +213,7 @@ ;; host happens to have standard symbols homed elsewhere. (cond #+sb-xc ((eq package *cl-package*) "COMMON-LISP") ((not package) "uninterned") - (t (package-name package))))))) + (t (sb-xc:package-name package))))))) ;; This L-T-V form has to remain out of the common path, ;; or else cheneygc will crash in cold-init. ;; Cold-init calls HASH-LAYOUT-NAME many times *before* the L-T-V diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 4f8a617a68..0867991423 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -328,6 +328,7 @@ ;;; see by default, so that using them by accident fails. (defparameter *undefineds* '("SYMBOL-PACKAGE" + "PACKAGE-NAME" ;; Float decoding: don't want to see these used either. "DECODE-FLOAT" "INTEGER-DECODE-FLOAT" "FLOAT-DIGITS" "FLOAT-PRECISION" "FLOAT-RADIX" @@ -403,7 +404,8 @@ (dolist (string (package-data-shadow package-data)) (shadow string package)) (dolist (string (package-data-export package-data)) - (export (intern string package) package)))) + (export (intern string package) package)) + (setf (documentation package t) (package-data-documentation package-data)))) ;; Now that all packages exist, we can set up package-package ;; references. (dolist (package-data package-data-list) @@ -515,13 +517,6 @@ ;; so that they can co-exist. (make-assembler-package (backend-asm-package-name)) -(defun package-list-for-genesis () - (append *package-data-list* - (let ((asm-package (backend-asm-package-name))) - (list (make-package-data :name asm-package - :use (list* "CL" *asm-package-use-list*) - :documentation nil))))) - ;;; Not all things shown by this are actually unused. Some get removed ;;; by the tree-shaker as intended. #+nil diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 13e4424a5d..84509d8404 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -726,7 +726,7 @@ (declare (inline assoc)) (cond ((cdr (assoc pkg (fasl-output-packages file) :test #'eq))) (t - (let ((s (package-name pkg))) + (let ((s (sb-xc:package-name pkg))) (dump-fop 'fop-named-package-save file (length s)) ;; Package names are always dumped as varint-encoded character strings ;; except on non-unicode builds. diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 11592e33bf..989f79801b 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -673,7 +673,7 @@ (descriptor-bits ;; If we're passed a symbol as a value then it needs to be interned. (cond ((symbolp value) (cold-intern value)) - ((packagep value) (cdr (cold-find-package-info (package-name value)))) + ((packagep value) (cdr (cold-find-package-info (sb-xc:package-name value)))) (t value))))))) (defun write-wordindexed/raw (address index bits) @@ -1457,9 +1457,94 @@ core and return a descriptor to it." (defvar *cold-package-symbols*) (declaim (type hash-table *cold-package-symbols*)) +;;; preincrement on use. the first non-preassigned ID is 5 +(defvar *package-id-count* 4) + +;;; Initialize the cold package named by NAME. The information is +;;; usually derived from the host package of the same name, except +;;; where the host package does not reflect the target package +;;; information, as for COMMON-LISP, KEYWORD, and COMMON-LISP-USER. +(defun initialize-cold-package (cold-package name) + (multiple-value-bind (nicknames docstring id shadow use-list) + (cond ((string= name "COMMON-LISP") + (values '("CL") + "public: home of symbols defined by the ANSI language specification" + sb-impl::+package-id-lisp+ + '() + '())) + ((string= name "KEYWORD") + (values '() + "public: home of keywords" + sb-impl::+package-id-keyword+ + '() + '())) + ((string= name "COMMON-LISP-USER") + (values '("CL-USER") + "public: the default package for user code and data" + sb-impl::+package-id-user+ + '() + ;; ANSI encourages us to put extension packages in + ;; the USE list of COMMON-LISP-USER. + '("COMMON-LISP" "SB-ALIEN" "SB-DEBUG" + "SB-EXT" "SB-GRAY" "SB-PROFILE"))) + (t + (let ((package (find-package name))) + ;; 'exports' contains no nicknames. + ;; (See comment in 'set-up-cold-packages') + (aver (null (package-nicknames package))) + (values (package-nicknames package) + (documentation package t) + (if (string= name "SB-KERNEL") + sb-impl::+package-id-kernel+ + (incf *package-id-count*)) + (sort (package-shadowing-symbols package) #'string<) + ;; SB-COREFILE is not actually part of + ;; the use list for SB-FASL. It's + ;; just needed for Genesis. + (if (string= name "SB-FASL") + (remove (find-package "SB-COREFILE") + (package-use-list package)) + (package-use-list package)))))) + (write-slots cold-package + :id (make-fixnum-descriptor id) + :%name (set-readonly + (base-string-to-core name)) + :%nicknames (list-to-core + (mapcar #'base-string-to-core nicknames)) + :%bits (make-fixnum-descriptor + (if (system-package-p name) + sb-impl::+initial-package-bits+ + 0)) + :doc-string (if (and docstring #-sb-doc nil) + (set-readonly + (base-string-to-core docstring)) + *nil-descriptor*) + :%use-list (list-to-core + (mapcar (lambda (use) + (cdr (cold-find-package-info + (sb-xc:package-name use)))) + use-list))) + (dolist (use use-list) + ;; Push onto the "used-by" list. + (let ((cold (cdr (cold-find-package-info (sb-xc:package-name use))))) + (write-slots cold + :%used-by-list (cold-cons cold-package + (read-slot cold :%used-by-list))))) + ;; COLD-INTERN AVERs that the package has an ID, so delay writing + ;; the shadowing-symbols until the package is ready. + (write-slots cold-package + :%shadowing-symbols (list-to-core + (mapcar 'cold-intern shadow))))) + (defun cold-find-package-info (package-name) + ;; Create package info on demand. (or (gethash package-name *cold-package-symbols*) - (error "Genesis could not find a target package named ~S" package-name))) + (let* ((cold-package (allocate-struct-of-type 'package)) + (info (cons (cons nil nil) cold-package))) + (write-slots cold-package :%used-by-list *nil-descriptor*) + (setf (gethash package-name *cold-package-symbols*) info) + (initialize-cold-package cold-package package-name) + info))) (defvar *classoid-cells*) (defun cold-find-classoid-cell (name &key create) @@ -1482,102 +1567,6 @@ core and return a descriptor to it." sb-vm:array-flags-position))) vector) -(defun initialize-packages () - (let ((package-data-list - ;; docstrings are set in src/cold/warm. It would work to do it here, - ;; but seems preferable not to saddle Genesis with such responsibility. - (list* (sb-cold:make-package-data :name "COMMON-LISP" :documentation nil) - (sb-cold:make-package-data :name "KEYWORD" :documentation nil) - ;; ANSI encourages us to put extension packages - ;; in the USE list of COMMON-LISP-USER. - (sb-cold:make-package-data - :name "COMMON-LISP-USER" :documentation nil - :use '("COMMON-LISP" "SB-ALIEN" "SB-DEBUG" "SB-EXT" "SB-GRAY" "SB-PROFILE")) - (sb-cold::package-list-for-genesis))) - (target-pkg-list nil)) - (labels ((init-cold-package (id name shadow &optional docstring) - (let ((cold-package (allocate-struct-of-type 'package))) - (setf (gethash name *cold-package-symbols*) - (cons (cons nil nil) cold-package)) - ;; Initialize string slots - (write-slots cold-package - :id (make-fixnum-descriptor id) - :%name (set-readonly - (base-string-to-core name)) - :%nicknames (chill-nicknames name) - :%bits (make-fixnum-descriptor - (if (system-package-p name) - sb-impl::+initial-package-bits+ 0)) - :doc-string (if docstring - (set-readonly - (base-string-to-core docstring)) - *nil-descriptor*) - :%use-list *nil-descriptor*) - ;; COLD-INTERN AVERs that the package has an ID, so delay writing - ;; the shadowing-symbols until the package is ready. - (write-slots cold-package - :%shadowing-symbols (list-to-core (mapcar 'cold-intern shadow))) - ;; the cddr of this will accumulate the 'used-by' package list - (push (list name cold-package) target-pkg-list))) - (chill-nicknames (pkg-name) - ;; Make the package nickname lists for the standard packages - ;; be the minimum specified by ANSI, regardless of what value - ;; the cross-compilation host happens to use. - ;; For packages other than the standard packages, the nickname - ;; list was specified by our package setup code, and we can just - ;; propagate the current state into the target. - (list-to-core - (mapcar #'base-string-to-core - (cond ((string= pkg-name "COMMON-LISP") '("CL")) - ((string= pkg-name "COMMON-LISP-USER") - '("CL-USER")) - ((string= pkg-name "KEYWORD") '()) - (t - ;; 'package-data-list' contains no nicknames. - ;; (See comment in 'set-up-cold-packages') - (aver (null (package-nicknames - (find-package pkg-name)))) - nil))))) - (find-cold-package (name) - (cadr (find-package-cell name))) - (find-package-cell (name) - (or (assoc (if (string= name "CL") "COMMON-LISP" name) - target-pkg-list :test #'string=) - (error "No cold package named ~S" name)))) - ;; pass 1: make all proto-packages - (let ((count 4)) ; preincrement on use. the first non-preassigned ID is 5 - (dolist (pd package-data-list) - ;; Shadowing symbols include those specified in exports.lisp - ;; plus those added in by MAKE-ASSEMBLER-PACKAGE. - (let* ((name (sb-cold:package-data-name pd)) - (id (cond ((string= name "KEYWORD") sb-impl::+package-id-keyword+) - ((string= name "COMMON-LISP") sb-impl::+package-id-lisp+) - ((string= name "COMMON-LISP-USER") - sb-impl::+package-id-user+) - ((string= name "SB-KERNEL") sb-impl::+package-id-kernel+) - (t (incf count)))) - (shadows (when (eql (mismatch name "SB-") 3) - (sort (package-shadowing-symbols (find-package name)) - #'string<)))) - (init-cold-package id name shadows - #+sb-doc (sb-cold::package-data-documentation pd))))) - ;; pass 2: set the 'use' lists and collect the 'used-by' lists - (dolist (pd package-data-list) - (let ((this (find-cold-package (sb-cold:package-data-name pd))) - (use nil)) - (dolist (that (sb-cold:package-data-use pd)) - (let ((cell (find-package-cell that))) - (push (cadr cell) use) - (push this (cddr cell)))) - (write-slots this :%use-list (list-to-core (nreverse use))))) - ;; pass 3: set the 'used-by' lists - (dolist (cell target-pkg-list) - (write-slots (cadr cell) :%used-by-list (list-to-core (cddr cell)))) - ;; finally, assign *PACKAGE* since it supposed to be always-bound - ;; and various things assume that it is. e.g. FIND-PACKAGE has an - ;; (IF (BOUNDP '*PACKAGE*)) test which the compiler elides. - (cold-set '*package* (find-cold-package "COMMON-LISP-USER"))))) - (defvar *uninterned-symbol-table* (make-hash-table :test #'equal)) ;; This coalesces references to uninterned symbols, which is allowed because ;; "similar-as-constant" is defined by string comparison, and since we only have @@ -1643,7 +1632,7 @@ core and return a descriptor to it." (cond ((eq package *cl-package*) (setq symbol (find-symbol name (canonical-home-package name)))) ((not (or (eq package *keyword-package*) - (= (mismatch (package-name package) "SB-") 3))) + (= (mismatch (cl:package-name package) "SB-") 3))) (bug "~S in bad package for target: ~A" symbol package))) (or (get symbol 'cold-intern-info) @@ -1653,7 +1642,7 @@ core and return a descriptor to it." ;; doesn't exist, as long as only a deferred interpreter processor is used ;; and not an immediate processor. (let* ((pkg-info - (when core-file-name (cold-find-package-info (package-name package)))) + (when core-file-name (cold-find-package-info (sb-xc:package-name package)))) (handle (allocate-symbol (if (or (eq (info :function :kind symbol) :special-form) (member symbol '(sb-sys:with-pinned-objects))) @@ -1762,14 +1751,14 @@ core and return a descriptor to it." (defun initialize-static-space (tls-init) "Initialize the cold load symbol-hacking data structures." (declare (ignorable tls-init)) - ;; NIL did not have its package assigned. Do that now. - (let ((target-cl-pkg-info (gethash "COMMON-LISP" *cold-package-symbols*))) - ;; -1 is magic having to do with nil-as-cons vs. nil-as-symbol - #-compact-symbol - (write-wordindexed *nil-descriptor* (- sb-vm:symbol-package-id-slot 1) - (make-fixnum-descriptor sb-impl::+package-id-lisp+)) - (when core-file-name - (record-accessibility :external target-cl-pkg-info *nil-descriptor*))) + ;; -1 is magic having to do with nil-as-cons vs. nil-as-symbol + #-compact-symbol + (write-wordindexed *nil-descriptor* (- sb-vm:symbol-package-id-slot 1) + (make-fixnum-descriptor sb-impl::+package-id-lisp+)) + (when core-file-name + ;; NIL did not have its package assigned. Do that now. + (record-accessibility :external (cold-find-package-info "COMMON-LISP") + *nil-descriptor*)) ;; Intern the others. (dovector (symbol sb-vm:+static-symbols+) (let* ((des (cold-intern symbol :gspace *static*)) @@ -1958,6 +1947,11 @@ core and return a descriptor to it." (sort (%hash-table-alist *cold-package-symbols*) #'string< :key #'car))))) ; Sort by package-name + ;; assign *PACKAGE* since it supposed to be always-bound + ;; and various things assume that it is. e.g. FIND-PACKAGE has an + ;; (IF (BOUNDP '*PACKAGE*)) test which the compiler elides. + (cold-set '*package* (cdr (cold-find-package-info "COMMON-LISP-USER"))) + (dump-symbol-infos (attach-fdefinitions-to-symbols (attach-classoid-cells-to-symbols (make-hash-table :test #'eq)))) @@ -3504,8 +3498,8 @@ III. initially undefined function references (alphabetically): ========== ====~:{~%~10,'0X ~S~}~%" *boilerplate-text* (sort undefs - (lambda (a b &aux (pkg-a (package-name (sb-xc:symbol-package a))) - (pkg-b (package-name (sb-xc:symbol-package b)))) + (lambda (a b &aux (pkg-a (sb-xc:package-name (sb-xc:symbol-package a))) + (pkg-b (sb-xc:package-name (sb-xc:symbol-package b)))) (cond ((string< pkg-a pkg-b) t) ((string> pkg-a pkg-b) nil) (t (string< a b)))) @@ -3877,8 +3871,6 @@ III. initially undefined function references (alphabetically): (read-structure-definitions defstruct-descriptions)) ;; Prepare for cold load. (initialize-layouts) - (when core-file-name - (initialize-packages)) (initialize-static-space tls-init) (cold-set 'sb-c::*!cold-allocation-patch-point* *nil-descriptor*) diff --git a/tools-for-build/corefile.lisp b/tools-for-build/corefile.lisp index 96981a56d8..356a19a6d7 100644 --- a/tools-for-build/corefile.lisp +++ b/tools-for-build/corefile.lisp @@ -1,7 +1,4 @@ - -;;; This package name does not persist after the build is complete, -;;; so it does not have an "!" in it. -;;; It it needed by genesis and SB-EDITCORE +;;; This is needed by genesis and SB-EDITCORE (defpackage "SB-COREFILE" (:use "CL") (:export #:core-magic From 7e03b3b1e99e91777119c585b1b0a58694c5de26 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Fri, 3 Jun 2022 22:34:58 -0700 Subject: [PATCH 3455/4023] Declare package nicknames declaratively. For some reason PACKAGE-DATA has never supported nicknames, I think since back in the day package stuff still hadn't been wrangled out yet. But now it's really straightforward to support nicknames from the get-go without hacking it up in warm init. (And hence the nicknames are available right away.) Also, if there was a comment in set-up-cold-packages about nicknames somewhere, it had ceased to exist. --- src/code/defpackage.lisp | 13 ------------- src/cold/exports.lisp | 7 +++++++ src/cold/set-up-cold-packages.lisp | 10 +++++++--- src/compiler/generic/genesis.lisp | 3 --- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/code/defpackage.lisp b/src/code/defpackage.lisp index 26899a6846..586c281c38 100644 --- a/src/code/defpackage.lisp +++ b/src/code/defpackage.lisp @@ -416,16 +416,3 @@ specifies to signal a warning if SWANK package is in variance, and an error othe ;; standard packages are effectively constant objects, otherwise ;; we have to invoke the find function. (if constp form `(sb-impl::cached-find-package ,form)))) - -;;;; package hacking - -;;; FIXME: This nickname is a deprecated hack for backwards -;;; compatibility with code which assumed the CMU-CL-style -;;; SB-ALIEN/SB-C-CALL split. That split went away and was deprecated -;;; in 0.7.0, so we should get rid of this nickname after a while. -(let ((package (find-package "SB-ALIEN"))) - (rename-package package package - (cons "SB-C-CALL" (package-nicknames package)))) - -(let ((package (find-package "SB-SEQUENCE"))) - (rename-package package package (list "SEQUENCE"))) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 92839f4d54..49f408760b 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -244,6 +244,7 @@ SBCL itself") "SB-FASL" "SB-GRAY" "SB-INT" "SB-KERNEL" "SB-SYS")) (defpackage* "SB-SEQUENCE" + (:nicknames "SEQUENCE") (:documentation "semi-public: implements something which might eventually be submitted as a CDR") (:export "PROTOCOL-UNIMPLEMENTED" @@ -1651,6 +1652,11 @@ SB-KERNEL) have been undone, but probably more remain.") "WITH-INTERRUPT-BINDINGS")) (defpackage* "SB-ALIEN" + ;; FIXME: This nickname is a deprecated hack for backwards + ;; compatibility with code which assumed the CMU-CL-style + ;; SB-ALIEN/SB-C-CALL split. That split went away and was deprecated + ;; in 0.7.0, so we should get rid of this nickname after a while. + (:nicknames "SB-C-CALL") (:documentation "public: the ALIEN foreign function interface (If you're porting CMU CL code, note that this package corresponds roughly to a union of the packages ALIEN and C-CALL at the time of the SBCL fork. SB-C-CALL @@ -1746,6 +1752,7 @@ of SBCL which maintained the CMU-CL-style split into two packages.)") "NOTE-LOCAL-ALIEN-TYPE" "PARSE-ALIEN-TYPE" "UNPARSE-ALIEN-TYPE")) +#+(and x86-64 sb-thread) (defpackage* "SB-APROF" (:documentation "public: the interface to the deterministic consing profiler") (:use "CL" "SB-EXT" "SB-INT" "SB-KERNEL" "SB-ALIEN" "SB-SYS")) diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 0867991423..2c4875dd68 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -148,6 +148,8 @@ (name (error "missing PACKAGE-DATA-NAME datum")) ;; a doc string (documentation (error "missing PACKAGE-DOCUMENATION datum")) + ;; a list of nicknames + nicknames ;; a list of string designators for shadowing symbols shadow ;; a list of string designators for exported symbols which'll be set @@ -400,7 +402,9 @@ ;; Build all packages that we need, and initialize them as far as we ;; can without referring to any other packages. (dolist (package-data package-data-list) - (let ((package (make-package (package-data-name package-data) :use nil))) + (let ((package (make-package (package-data-name package-data) + :use nil + :nicknames (package-data-nicknames package-data)))) (dolist (string (package-data-shadow package-data)) (shadow string package)) (dolist (string (package-data-export package-data)) @@ -467,8 +471,8 @@ (let ((flattened-options '())) (dolist (option options) (destructuring-bind (kind . args) option - (case kind - ((:use :export :reexport :shadow) + (ecase kind + ((:use :export :reexport :shadow :nicknames) (let ((existing-option (assoc kind flattened-options))) (if existing-option (setf (second (second existing-option)) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 989f79801b..4d600588d0 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1489,9 +1489,6 @@ core and return a descriptor to it." "SB-EXT" "SB-GRAY" "SB-PROFILE"))) (t (let ((package (find-package name))) - ;; 'exports' contains no nicknames. - ;; (See comment in 'set-up-cold-packages') - (aver (null (package-nicknames package))) (values (package-nicknames package) (documentation package t) (if (string= name "SB-KERNEL") From 710f52cd68b4c7ea93c948479ff06af22a3d031a Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Fri, 3 Jun 2022 21:42:23 -0700 Subject: [PATCH 3456/4023] Don't read common-lisp-exports.lisp-expr unnecessarily. We can get the exported symbol names during genesis just from introspection of XC-STRICT-CL (which was created using the information in common-lisp-exports.lisp-expr). --- src/compiler/generic/genesis.lisp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 4d600588d0..df12df2a14 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3895,17 +3895,10 @@ III. initially undefined function references (alphabetically): (init-runtime-routines)) ;; Initialize the *COLD-SYMBOLS* system with the information - ;; from common-lisp-exports.lisp-expr. - ;; Packages whose names match SB-THING were set up on the host according - ;; to "package-data-list.lisp-expr" which expresses the desired target - ;; package configuration, so we can just mirror the host into the target. - ;; But by waiting to observe calls to COLD-INTERN that occur during the - ;; loading of the cross-compiler's outputs, it is possible to rid the - ;; target of accidental leftover symbols, not that it wouldn't also be - ;; a good idea to clean up package-data-list once in a while. - (dolist (exported-name - (sb-cold:read-from-file "^common-lisp-exports.lisp-expr")) - (cold-intern (intern exported-name *cl-package*) :access :external)) + ;; from XC-STRICT-CL. + (do-external-symbols (symbol (find-package "XC-STRICT-CL")) + (cold-intern (intern (symbol-name symbol) *cl-package*) + :access :external)) ;; Make LOGICALLY-READONLYIZE no longer a no-op (setf (symbol-function 'logically-readonlyize) @@ -3913,7 +3906,8 @@ III. initially undefined function references (alphabetically): ;; Cold load. (dolist (file-name object-file-names) - (push (cold-cons :begin-file (base-string-to-core file-name)) *!cold-toplevels*) + (push (cold-cons :begin-file (base-string-to-core file-name)) + *!cold-toplevels*) (cold-load file-name verbose)) (sb-cold::check-no-new-cl-symbols) From 0e824004154286dc3c7805969f177afae69d2286 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Fri, 3 Jun 2022 23:03:24 -0700 Subject: [PATCH 3457/4023] Remove unneeded exports. --- src/cold/set-up-cold-packages.lisp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 2c4875dd68..97f313d7ec 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -135,14 +135,7 @@ ;;; ;;; We make no attempt to be fully general; our table doesn't need to be ;;; able to express features which we don't happen to use. -(export '(genesis - package-data - make-package-data - package-data-name - package-data-export - package-data-reexport - package-data-import-from - package-data-use)) +(export '(genesis)) (defstruct package-data ;; a string designator for the package name (name (error "missing PACKAGE-DATA-NAME datum")) From c7722f1bb758a923be3ac7eb25a3add3f0eefbb1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 4 Jun 2022 09:18:43 -0400 Subject: [PATCH 3458/4023] Random fix for #+sb-show --- src/code/pred.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/pred.lisp b/src/code/pred.lisp index f58edc7878..371a644387 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -523,6 +523,7 @@ length and have identical components. Other arrays must be EQ to be EQUAL." (t (array-equalp x y))))) (t nil))) +#-sb-show ;; I don't know why these tests crash with #+sb-show (let ((test-cases `(($0.0 $-0.0 t) ($0.0 $1.0 nil) ;; There is no cross-compiler #C reader macro. From 51830af5d0b6bce1d8d6ed858324aebcf2a1b42c Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sat, 4 Jun 2022 10:57:25 -0700 Subject: [PATCH 3459/4023] riscv: Fix some disassembler definitions. Now building the instruction space works again. --- src/compiler/riscv/insts.lisp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/compiler/riscv/insts.lisp b/src/compiler/riscv/insts.lisp index c7ef8f0606..01704ce108 100644 --- a/src/compiler/riscv/insts.lisp +++ b/src/compiler/riscv/insts.lisp @@ -1255,7 +1255,7 @@ (define-rvc-sp-load-instruction c.lwsp #b010 emit-ci-load-32-inst) #+64-bit (define-rvc-sp-load-instruction c.ldsp #b011 emit-ci-load-64-inst) - #-(and 64-bit soft-doubles) + #+(and (not 64-bit) soft-doubles) (define-rvc-sp-load-instruction c.flwsp #b011 emit-ci-load-32-inst) (define-rvc-sp-load-instruction c.fldsp #b001 emit-ci-load-64-inst)) @@ -1274,7 +1274,7 @@ (define-rvc-sp-store-instruction c.swsp #b110 32) #+64-bit (define-rvc-sp-store-instruction c.sdsp #b111 64) - #-(and 64-bit soft-doubles) + #+(and (not 64-bit) soft-doubles) (define-rvc-sp-store-instruction c.fswsp #b111 32) (define-rvc-sp-store-instruction c.fsdsp #b101 64)) @@ -1292,13 +1292,13 @@ (define-rvc-load/store-instruction c.lw #b010 32 rd*) #+64-bit (define-rvc-load/store-instruction c.ld #b011 64 rd*) - #-(and 64-bit soft-doubles) + #+(and (not 64-bit) soft-doubles) (define-rvc-load/store-instruction c.flw #b011 32 rd*) (define-rvc-load/store-instruction c.fld #b001 64 rd*) (define-rvc-load/store-instruction c.sw #b110 32 rs2*) #+64-bit (define-rvc-load/store-instruction c.sd #b111 64 rs2*) - #-(and 64-bit soft-doubles) + #+(and (not 64-bit) soft-doubles) (define-rvc-load/store-instruction c.fsw #b111 32 rs2*) (define-rvc-load/store-instruction c.fsd #b101 64 rs2*)) @@ -1317,7 +1317,8 @@ `(define-instruction ,name (segment rs1) (:printer cr ((funct4 ,funct4) - (opcode #b10))) + (opcode #b10) + (rs2 0))) (:emitter (%emit-cr-inst segment ,funct4 (reg-tn-encoding rs1) 0 #b10))))) (define-rvc-cr-jump-instruction c.jr #b1000) @@ -1354,7 +1355,7 @@ (define-rvc-ci-arith-instruction c.addi #b000 #b01) #+64-bit (define-rvc-ci-arith-instruction c.addiw #b001 #b01) - (define-rvc-ci-arith-instruction c.slli #b001 #b10)) + (define-rvc-ci-arith-instruction c.slli #b000 #b10)) (define-instruction c.addisp16 (segment imm) (:emitter From 08c9c11ea3f012b2742bdc474d8985836f49bacc Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 4 Jun 2022 11:55:58 -0700 Subject: [PATCH 3460/4023] Fix a FIXME and delete some obsolete comments. Because we now have CLASS available as a known type earlier, some of these issues are now fixed. --- src/code/defpackage.lisp | 52 +++++++++++----------------------- src/code/target-package.lisp | 8 ++++++ src/cold/build-order.lisp-expr | 3 -- 3 files changed, 24 insertions(+), 39 deletions(-) diff --git a/src/code/defpackage.lisp b/src/code/defpackage.lisp index 586c281c38..65ddadaec3 100644 --- a/src/code/defpackage.lisp +++ b/src/code/defpackage.lisp @@ -11,31 +11,25 @@ (in-package "SB-IMPL") -;;; FIXME: figure out why a full call to FORMAT this early in warm load -;;; says that CLASS is not a known type. (Obviously it needs to parse -;;; a type spec, but then why it is only a style-warning and not an error?) -;;; Weirder still, why does it depend on the target architecture? - (defmacro defpackage (package &rest options) - #.(locally (declare (notinline format)) - (format nil - "Defines a new package called PACKAGE. Each of OPTIONS should be one of the + #.(format nil + "Defines a new package called PACKAGE. Each of OPTIONS should be one of the following: ~{~&~4T~A~} All options except ~{~A, ~}and :DOCUMENTATION can be used multiple times." - '((:use "{package-name}*") - (:export "{symbol-name}*") - (:import-from "<package-name> {symbol-name}*") - (:shadow "{symbol-name}*") - (:shadowing-import-from "<package-name> {symbol-name}*") - (:local-nicknames "{(local-nickname actual-package-name)}*") - (:lock "boolean") - (:implement "{package-name}*") - (:documentation "doc-string") - (:intern "{symbol-name}*") - (:size "<integer>") - (:nicknames "{package-name}*")) - '(:size :lock))) + '((:use "{package-name}*") + (:export "{symbol-name}*") + (:import-from "<package-name> {symbol-name}*") + (:shadow "{symbol-name}*") + (:shadowing-import-from "<package-name> {symbol-name}*") + (:local-nicknames "{(local-nickname actual-package-name)}*") + (:lock "boolean") + (:implement "{package-name}*") + (:documentation "doc-string") + (:intern "{symbol-name}*") + (:size "<integer>") + (:nicknames "{package-name}*")) + '(:size :lock)) (let ((nicknames nil) (local-nicknames nil) (size nil) @@ -64,7 +58,7 @@ (%program-error "can't specify ~S more than once." optname)) (unless (typep optval '(cons t null)) (%program-error "~S expects a single argument. Got ~S" - (car option) (cdr option))) + (car option) (cdr option))) (push optname seen) (setq optval (car optval)))) (case optname @@ -402,17 +396,3 @@ specifies to signal a warning if SWANK package is in variance, and an error othe :format-control "no symbol named ~S in ~S" :format-arguments (list name (package-name package)))) (intern name package))))) - -;;;; One more package-related transform. I'm unsure why this can't be installed -;;;; sooner, but it can't. It's a symptom of our build weirdness involving -;;;; the lack of a class definition for the class CLASS, but I can't see what -;;;; that's got to do with anything. -(in-package "SB-C") - -;;; As for the INTERN transform, you could be screwed if you use any of the -;;; standard package names as a local nickname of a random package. -(deftransform find-package ((name) ((constant-arg string-designator))) - (multiple-value-bind (form constp) (find-package-xform name) - ;; standard packages are effectively constant objects, otherwise - ;; we have to invoke the find function. - (if constp form `(sb-impl::cached-find-package ,form)))) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 6528c91a66..3548426aea 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -2255,3 +2255,11 @@ PACKAGE." (deftransform find-symbol ((name package-name) (t (constant-arg string-designator))) `(sb-impl::find-symbol2 name ,(find-package-xform package-name))) + +;;; As for the INTERN transform, you could be screwed if you use any of the +;;; standard package names as a local nickname of a random package. +(deftransform find-package ((name) ((constant-arg string-designator))) + (multiple-value-bind (form constp) (find-package-xform name) + ;; standard packages are effectively constant objects, otherwise + ;; we have to invoke the find function. + (if constp form `(sb-impl::cached-find-package ,form)))) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index be48433b79..cf48e7a794 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -618,9 +618,6 @@ ;; The definition in cold-error is good enough for self-build. "src/code/warm-error" "src/code/icf" - ;; We re-nickname SB-SEQUENCE as SEQUENCE now. - ;; It could be done in genesis, but not earlier, - ;; since the host has a package of that name. "src/code/defpackage" "src/code/target-lflist") From a4b200a8ab4d98a0556d330d5a4f8d071f6bca12 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 4 Jun 2022 13:21:06 -0700 Subject: [PATCH 3461/4023] Make GENSYM always refer to SB-XC:GENSYM. Since now we bind SB-XC:*GENSYM-COUNTER* to 0 around the processing of every top-level form, this effectively insulates the effect of macroexpansion using the host compiler on the counter. --- src/code/cross-misc.lisp | 2 ++ src/cold/set-up-cold-packages.lisp | 2 +- src/compiler/main.lisp | 4 +--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index 25be3f86ac..24de4a832f 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -125,6 +125,8 @@ (or (not (typep x 'simple-array)) (/= (array-rank x) 1)))) +;;; We maintain a separate GENSYM counter since the host is allowed to +;;; mutate its counter however it wishes. (defvar sb-xc:*gensym-counter* 0) (defun sb-xc:gensym (&optional (thing "G")) diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 97f313d7ec..5f8faa4e14 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -275,6 +275,7 @@ "COMPILER-MACRO-FUNCTION" "CONSTANTP" "GET-SETF-EXPANSION" + "GENSYM" "*GENSYM-COUNTER*" "LISP-IMPLEMENTATION-TYPE" "LISP-IMPLEMENTATION-VERSION" "MACRO-FUNCTION" @@ -343,7 +344,6 @@ (dolist (name '("*READ-DEFAULT-FLOAT-FORMAT*" "ARRAY-ELEMENT-TYPE" "DEFMACRO" "DEFSTRUCT" "DEFTYPE" - "GENSYM" "MAKE-ARRAY" "SIMPLE-VECTOR" "TYPEP" diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index 1f3549e5d7..c06b6c966e 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1801,7 +1801,6 @@ necessary, since type inference may take arbitrarily long to converge.") (declare (ignore error)) (return-from sub-compile-file (values t t t)))) (*current-path* nil) - (*gensym-counter* 0) (sb-impl::*eval-source-info* nil) (sb-impl::*eval-tlf-index* nil) (sb-impl::*eval-source-context* nil)) @@ -1816,9 +1815,8 @@ necessary, since type inference may take arbitrarily long to converge.") 'input-error-in-compile-file) (clrhash *source-paths*) (find-source-paths form current-index) + (note-top-level-form form) (let ((*gensym-counter* 0)) - (when *compile-print* - (note-top-level-form form)) (process-toplevel-form form `(original-source-start 0 ,current-index) nil))) (finish-block-compilation) From e9ac66bc6fa18e8fb7c3522c212d7808a978baa6 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Sat, 4 Jun 2022 14:52:42 -0700 Subject: [PATCH 3462/4023] Always spell SB-XC:GENSYM as GENSYM. Since GENSYM by default now refers to SB-XC:GENSYM. This makes it so people don't have to figure out which one to use. --- src/code/cmacros.lisp | 2 +- src/code/debug-int.lisp | 2 +- src/code/debug.lisp | 2 +- src/code/defsetfs.lisp | 2 +- src/code/early-extensions.lisp | 4 +-- src/code/error.lisp | 2 +- src/code/format.lisp | 14 ++++----- src/code/loop.lisp | 6 ++-- src/code/macros.lisp | 36 ++++++++++++------------ src/code/pprint.lisp | 2 +- src/code/primordial-extensions.lisp | 8 +++--- src/code/print.lisp | 2 +- src/code/quantifiers.lisp | 6 ++-- src/code/restart.lisp | 4 +-- src/code/setf.lisp | 2 +- src/code/sysmacs.lisp | 6 ++-- src/code/target-alieneval.lisp | 6 ++-- src/code/target-format.lisp | 4 +-- src/code/target-package.lisp | 2 +- src/compiler/aliencomp.lisp | 2 +- src/compiler/arm64/c-call.lisp | 4 +-- src/compiler/assem.lisp | 4 +-- src/compiler/generic/pinned-objects.lisp | 2 +- src/compiler/info-vector.lisp | 2 +- src/compiler/ir1opt.lisp | 2 +- src/compiler/ir1tran-lambda.lisp | 26 ++++++++--------- src/compiler/ir1tran.lisp | 2 +- src/compiler/locall.lisp | 4 +-- src/compiler/macros.lisp | 10 +++---- src/compiler/meta-vmdef.lisp | 8 +++--- src/compiler/pack.lisp | 2 +- src/compiler/parse-lambda-list.lisp | 6 ++-- src/compiler/seqtran.lisp | 2 +- src/compiler/srctran.lisp | 2 +- src/compiler/typetran.lisp | 8 +++--- src/compiler/x86-64/c-call.lisp | 4 +-- 36 files changed, 101 insertions(+), 101 deletions(-) diff --git a/src/code/cmacros.lisp b/src/code/cmacros.lisp index 51bc96d5c3..64643dd26f 100644 --- a/src/code/cmacros.lisp +++ b/src/code/cmacros.lisp @@ -69,7 +69,7 @@ (:preserve-whitespace 2) (otherwise (return-from read-from-string form)))) (var (if (logbitp index seen) - (let ((x (sb-xc:gensym "IGNORE"))) + (let ((x (gensym "IGNORE"))) (push x ignore) x) (setf seen (logior (ash 1 index) seen) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 3fd196b13b..21f0fc4895 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -1375,7 +1375,7 @@ register." ;;; DEBUG-BLOCK information. (defmacro do-debug-fun-blocks ((block-var debug-fun &optional result) &body body) - (let ((blocks (sb-xc:gensym)) + (let ((blocks (gensym)) (i (gensym))) `(let ((,blocks (debug-fun-debug-blocks ,debug-fun))) (declare (simple-vector ,blocks)) diff --git a/src/code/debug.lisp b/src/code/debug.lisp index 3d582db3ab..5eda12adfb 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -147,7 +147,7 @@ Other commands: deeply nested input syntax, and now the reader is confused.)") (defmacro with-debug-io-syntax (() &body body) - (let ((thunk (sb-xc:gensym "THUNK"))) + (let ((thunk (gensym "THUNK"))) `(dx-flet ((,thunk () ,@body)) (funcall-with-debug-io-syntax #',thunk)))) diff --git a/src/code/defsetfs.lisp b/src/code/defsetfs.lisp index 11dec63145..8536513502 100644 --- a/src/code/defsetfs.lisp +++ b/src/code/defsetfs.lisp @@ -306,7 +306,7 @@ place with bits from the low-order end of the new value." (byte (if (cdr byte-args) (cons 'byte byte-args) (car byte-args))) ((place-tempvars place-tempvals stores setter getter) (get-setf-expansion place env)) - (newval (sb-xc:gensym "NEW")) + (newval (gensym "NEW")) (new-int `(,store-fun ,(if (eq load-fun 'logbitp) `(if ,newval 1 0) newval) ,byte ,getter))) diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index 65bc0b11a0..e015ad1128 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -590,7 +590,7 @@ NOTE: This interface is experimental and subject to change." (let* ,(case (length temps) (2 `((,(first temps) (car ,entry)) (,(second temps) (cdr ,entry)))) - (3 (let ((arg-temp (sb-xc:gensym "ARGS"))) + (3 (let ((arg-temp (gensym "ARGS"))) `((,arg-temp (cdr ,entry)) (,(first temps) (car ,entry)) (,(second temps) @@ -827,7 +827,7 @@ NOTE: This interface is experimental and subject to change." (let* ((name (first spec)) (exp-temp (gensym "ONCE-ONLY"))) `(let ((,exp-temp ,(second spec)) - (,name (sb-xc:gensym ,(symbol-name name)))) + (,name (gensym ,(symbol-name name)))) `(let ((,,name ,,exp-temp)) ,,(frob (rest specs) body)))))))) diff --git a/src/code/error.lisp b/src/code/error.lisp index b039b02c32..41c6bed029 100644 --- a/src/code/error.lisp +++ b/src/code/error.lisp @@ -173,7 +173,7 @@ handler (let* ((name (let ((*gensym-counter* (length (cluster-entries)))) - (sb-xc:gensym "H"))) + (gensym "H"))) (lexpr (typecase handler ;; These two are merely expansion prettifiers, diff --git a/src/code/format.lisp b/src/code/format.lisp index dd528b9d3f..fbeae9f5b4 100644 --- a/src/code/format.lisp +++ b/src/code/format.lisp @@ -469,7 +469,7 @@ (collect ((expander-bindings) (runtime-bindings)) (dolist (spec specs) (destructuring-bind (var default) spec - (let ((symbol (sb-xc:gensym "FVAR"))) + (let ((symbol (gensym "FVAR"))) (expander-bindings `(,var ',symbol)) (runtime-bindings @@ -504,8 +504,8 @@ (let ((defun-name (intern (format nil "~:@(~:C~)-FORMAT-DIRECTIVE-EXPANDER" char))) - (directive (sb-xc:gensym "DIRECTIVE")) - (directives (if lambda-list (car (last lambda-list)) (sb-xc:gensym "DIRECTIVES")))) + (directive (gensym "DIRECTIVE")) + (directives (if lambda-list (car (last lambda-list)) (gensym "DIRECTIVES")))) `(progn (defun ,defun-name (,directive ,directives) ,@(if lambda-list @@ -519,7 +519,7 @@ (%set-format-directive-expander ,char #',defun-name)))) (defmacro def-format-directive (char lambda-list &body body) - (let ((directives (sb-xc:gensym "DIRECTIVES")) + (let ((directives (gensym "DIRECTIVES")) (declarations nil) (body-without-decls body)) (loop @@ -592,7 +592,7 @@ (def-format-directive #\C (colonp atsignp params string end) (expand-bind-defaults () params - (let ((n-arg (sb-xc:gensym "ARG"))) + (let ((n-arg (gensym "ARG"))) `(let ((,n-arg ,(expand-next-arg))) (unless (typep ,n-arg 'character) (format-error-at ,string ,(1- end) @@ -646,7 +646,7 @@ ((base nil) (mincol 0) (padchar #\space) (commachar #\,) (commainterval 3)) params - (let ((n-arg (sb-xc:gensym "ARG"))) + (let ((n-arg (gensym "ARG"))) `(let ((,n-arg ,(expand-next-arg))) (unless (or ,base (integerp ,n-arg)) @@ -1336,7 +1336,7 @@ (collect ((param-names) (bindings)) (dolist (param-and-offset params) (let ((param (cdr param-and-offset))) - (let ((param-name (sb-xc:gensym "PARAM"))) + (let ((param-name (gensym "PARAM"))) (param-names param-name) (bindings `(,param-name ,(case param diff --git a/src/code/loop.lisp b/src/code/loop.lisp index 831760fdef..380100767e 100644 --- a/src/code/loop.lisp +++ b/src/code/loop.lisp @@ -1368,7 +1368,7 @@ code to be loaded. (defun loop-for-across (var val data-type) (loop-make-var var nil data-type) - (let ((vector-var (sb-xc:gensym "LOOP-ACROSS-VECTOR-")) + (let ((vector-var (gensym "LOOP-ACROSS-VECTOR-")) (index-var (gensym "LOOP-ACROSS-INDEX-"))) (multiple-value-bind (vector-form constantp vector-value) (loop-constant-fold-if-possible val 'vector) @@ -1650,14 +1650,14 @@ code to be loaded. (setq endform (if limit-constantp `',limit-value (loop-make-var - (sb-xc:gensym "LOOP-LIMIT-") form + (gensym "LOOP-LIMIT-") form `(and ,indexv-type real))))) (:by (multiple-value-setq (form stepby-constantp stepby) (loop-constant-fold-if-possible form `(and ,indexv-type (real (0))))) (unless stepby-constantp - (loop-make-var (setq stepby (sb-xc:gensym "LOOP-STEP-BY-")) + (loop-make-var (setq stepby (gensym "LOOP-STEP-BY-")) form `(and ,indexv-type (real (0))) t))) diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 83c64ee057..3bd5768b6a 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -438,7 +438,7 @@ evaluated as a PROGN." (prog-expansion-from-let varlist body-decls 'let*))) (sb-xc:defmacro prog1 (result &body body) - (let ((n-result (sb-xc:gensym))) + (let ((n-result (gensym))) `(let ((,n-result ,result)) (progn ,@body @@ -478,7 +478,7 @@ evaluated as a PROGN." ;; Preserve non-toplevelness of the form! (let ((car (car forms))) (if nested car `(the t ,car)))) (t - (let ((n-result (sb-xc:gensym))) + (let ((n-result (gensym))) `(let ((,n-result ,(first forms))) (if ,n-result ,n-result @@ -502,7 +502,7 @@ evaluated as a PROGN." ;; Certainly for the evaluator it's preferable. `(let ((,(car vars) ,value-form)) ,@body) - (let ((ignore (sb-xc:gensym))) + (let ((ignore (gensym))) `(multiple-value-call #'(lambda (&optional ,@(mapcar #'list vars) &rest ,ignore) (declare (ignore ,ignore)) @@ -537,7 +537,7 @@ evaluated as a PROGN." 1000 10))) ; Arbitrary limit. (let ((dummy-list (make-gensym-list val)) - (keeper (sb-xc:gensym "KEEPER"))) + (keeper (gensym "KEEPER"))) `(multiple-value-bind (,@dummy-list ,keeper) ,form (declare (ignore ,@dummy-list)) ,keeper)) @@ -670,7 +670,7 @@ invoked. In that case it will store into PLACE and start over." (setf ,place (check-type-error ',place ,place ',type ,@(and type-string `(,type-string))))) - (let ((value (sb-xc:gensym))) + (let ((value (gensym))) `(do ((,value ,place ,place)) ((typep ,value ',type)) (setf ,place @@ -1151,9 +1151,9 @@ symbol-case giving up: case=((V U) (F)) (clause->bins (make-array (length clauses) :initial-element nil)) (table-nbits (byte-size (if (vectorp byte) (elt byte 0) byte))) (bins (make-array (ash 1 table-nbits) :initial-element 0)) - (symbol (sb-xc:gensym "S")) - (hash (sb-xc:gensym "H")) - (vector (sb-xc:gensym "V")) + (symbol (gensym "S")) + (hash (gensym "H")) + (vector (gensym "V")) (is-hashable ;; For x86-64, any non-immediate object is considered hashable, ;; so we only do a lowtag test on the object, though the correct hash @@ -1355,7 +1355,7 @@ symbol-case giving up: case=((V U) (F)) ;; Produce a COND only if the backend supports the multiway branch vop. #+(or x86 x86-64) - (let ((block (sb-xc:gensym "B")) + (let ((block (gensym "B")) (unused-bins)) ;; Take note of the unused bins (dotimes (i (length bins)) @@ -1407,7 +1407,7 @@ symbol-case giving up: case=((V U) (F)) (defun case-body (name keyform cases multi-p test errorp proceedp needcasesp) (unless (or cases (not needcasesp)) (warn "no clauses in ~S" name)) - (let ((keyform-value (sb-xc:gensym)) + (let ((keyform-value (gensym)) (clauses ()) (keys ()) (keys-seen (make-hash-table :test #'eql))) @@ -1643,7 +1643,7 @@ symbol-case giving up: case=((V U) (F)) ;;; only for strings, hence the name. Renaming it to something more ;;; generic might not be a bad idea. (sb-xc:defmacro string-dispatch ((&rest types) var &body body) - (let ((fun (sb-xc:gensym "STRING-DISPATCH-FUN"))) + (let ((fun (gensym "STRING-DISPATCH-FUN"))) `(flet ((,fun (,var) ,@body)) (declare (inline ,fun)) @@ -1666,7 +1666,7 @@ symbol-case giving up: case=((V U) (F)) (sb-xc:defmacro with-open-file ((stream filespec &rest options) &body body) (multiple-value-bind (forms decls) (parse-body body nil) - (let ((abortp (sb-xc:gensym))) + (let ((abortp (gensym))) `(let ((,stream (open ,filespec ,@options)) (,abortp t)) ,@decls @@ -1710,7 +1710,7 @@ symbol-case giving up: case=((V U) (F)) var name)))) varlist)))) (multiple-value-bind (code decls) (parse-body decls-and-code nil) - (let ((label-1 (sb-xc:gensym)) (label-2 (sb-xc:gensym))) + (let ((label-1 (gensym)) (label-2 (gensym))) `(block ,block (,bind ,inits ,@decls @@ -1726,7 +1726,7 @@ symbol-case giving up: case=((V U) (F)) ;; This is like DO, except it has no implicit NIL block. (sb-xc:defmacro do-anonymous (varlist endlist &rest body) - (frob-do-body varlist endlist body 'let 'psetq 'do-anonymous (sb-xc:gensym))) + (frob-do-body varlist endlist body 'let 'psetq 'do-anonymous (gensym))) (sb-xc:defmacro do (varlist endlist &body body) "DO ({(Var [Init] [Step])}*) (Test Exit-Form*) Declaration* Form* @@ -1753,7 +1753,7 @@ symbol-case giving up: case=((V U) (F)) (sb-xc:defmacro dotimes ((var count &optional (result nil)) &body body) ;; A nice optimization would be that if VAR is never referenced, ;; it's slightly more efficient to count backwards, but that's tricky. - (let ((c (if (integerp count) count (sb-xc:gensym)))) + (let ((c (if (integerp count) count (gensym)))) `(do ((,var 0 (1+ ,var)) ,@(if (symbolp c) `((,c (the integer ,count))))) ((>= ,var ,c) ,result) @@ -1770,8 +1770,8 @@ symbol-case giving up: case=((V U) (F)) ;; since we don't want to use IGNORABLE on what might be a special ;; var. (binding* (((forms decls) (parse-body body nil)) - (n-list (sb-xc:gensym "LIST")) - (start (sb-xc:gensym "START")) + (n-list (gensym "LIST")) + (start (gensym "START")) ((clist members clist-ok) (with-current-source-form (list) (cond @@ -1862,7 +1862,7 @@ symbol-case giving up: case=((V U) (F)) (cons (eql quote) (cons symbol null)) (cons (eql lambda)))) (values nil `(funcall ,funarg . ,arg-forms)) - (let ((fn-sym (sb-xc:gensym))) ; for ONCE-ONLY-ish purposes + (let ((fn-sym (gensym))) ; for ONCE-ONLY-ish purposes (values `((,fn-sym (%coerce-callable-to-fun ,funarg))) `(sb-c::%funcall ,fn-sym . ,arg-forms))))) diff --git a/src/code/pprint.lisp b/src/code/pprint.lisp index 1a4aee1a26..91ffe10d6e 100644 --- a/src/code/pprint.lisp +++ b/src/code/pprint.lisp @@ -1398,7 +1398,7 @@ line break." (defmacro with-pretty-stream ((stream-var &optional (stream-expression stream-var)) &body body) - (let ((flet-name (sb-xc:gensym "WITH-PRETTY-STREAM"))) + (let ((flet-name (gensym "WITH-PRETTY-STREAM"))) `(flet ((,flet-name (,stream-var) ,@body)) (let ((stream ,stream-expression)) diff --git a/src/code/primordial-extensions.lisp b/src/code/primordial-extensions.lisp index 39a426cdb1..de168d1554 100644 --- a/src/code/primordial-extensions.lisp +++ b/src/code/primordial-extensions.lisp @@ -61,7 +61,7 @@ (stem (if (every #'alpha-char-p symbol-name) symbol-name (string (gensymify* symbol-name "-"))))) - `(,symbol (sb-xc:gensym ,stem)))) + `(,symbol (gensym ,stem)))) symbols) ,@body)) @@ -69,7 +69,7 @@ ;;; macros and other code-manipulating code.) (defun make-gensym-list (n &optional name) (let ((arg (if name (string name) "G"))) - (loop repeat n collect (sb-xc:gensym arg)))) + (loop repeat n collect (gensym arg)))) ;;;; miscellany @@ -92,8 +92,8 @@ (defun gensymify (x) (if (symbolp x) - (sb-xc:gensym (symbol-name x)) - (sb-xc:gensym))) + (gensym (symbol-name x)) + (gensym))) (eval-when (:load-toplevel :execute #+sb-xc-host :compile-toplevel) (labels ((symbol-concat (package &rest things) diff --git a/src/code/print.lisp b/src/code/print.lisp index b0847567c2..46752f8d55 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -465,7 +465,7 @@ variable: an unreadable object representing the error is printed instead.") ;;; Automatically handle *PRINT-LEVEL* abbreviation. If we are too ;;; deep, then a #\# is printed to STREAM and BODY is ignored. (defmacro descend-into ((stream) &body body) - (let ((flet-name (sb-xc:gensym "DESCEND"))) + (let ((flet-name (gensym "DESCEND"))) `(flet ((,flet-name () ,@body)) (cond ((and (null *print-readably*) diff --git a/src/code/quantifiers.lisp b/src/code/quantifiers.lisp index f571d805f9..8061118659 100644 --- a/src/code/quantifiers.lisp +++ b/src/code/quantifiers.lisp @@ -19,9 +19,9 @@ (return-from expand (values nil t))) ; give up (binding* ((elements (make-gensym-list (length sequences))) ((bind-fun call-it) (funarg-bind/call-forms pred elements)) - (blockname (sb-xc:gensym "BLOCK")) - (wrapper (sb-xc:gensym "WRAPPER")) - (value (sb-xc:gensym "VAL"))) + (blockname (gensym "BLOCK")) + (wrapper (gensym "WRAPPER")) + (value (gensym "VAL"))) (let ((form `(block ,blockname ;; Does DX actually help? INLINE should win anyway. diff --git a/src/code/restart.lisp b/src/code/restart.lisp index 5c76abb55e..8816281b2b 100644 --- a/src/code/restart.lisp +++ b/src/code/restart.lisp @@ -124,7 +124,7 @@ ;; for HANDLER-BIND ;; * MAKE-APPLY-AND-RETURN which generates TAGBODY entries executing ;; the respective BODY. - (let ((block-tag (sb-xc:gensym "BLOCK")) + (let ((block-tag (gensym "BLOCK")) (temp-var (gensym))) (labels ((parse-keywords-and-body (keywords-and-body source-form) (do ((form keywords-and-body (cddr form)) @@ -219,7 +219,7 @@ If restart-name is not invoked, then all values returned by forms are returned. If control is transferred to this restart, it immediately returns the values NIL and T." - (let ((stream (sb-xc:gensym "STREAM"))) + (let ((stream (gensym "STREAM"))) `(restart-case ;; If there's just one body form, then don't use PROGN. This allows ;; RESTART-CASE to "see" calls to ERROR, etc. diff --git a/src/code/setf.lisp b/src/code/setf.lisp index 89b48057f9..e560191818 100644 --- a/src/code/setf.lisp +++ b/src/code/setf.lisp @@ -217,7 +217,7 @@ (thunk (cdr mv-bindings) (cdr getters) setters)) setters))) (let ((outputs (loop for i below (length (car (mv-bindings))) - collect (sb-xc:gensym "OUT")))) + collect (gensym "OUT")))) (car (gen-let* (reduce #'nconc (let*-bindings)) (gen-mv-bind outputs (car (getters)) (thunk (mv-bindings) (cdr (getters)) diff --git a/src/code/sysmacs.lisp b/src/code/sysmacs.lisp index d87f5fd3ca..d3f740782a 100644 --- a/src/code/sysmacs.lisp +++ b/src/code/sysmacs.lisp @@ -85,7 +85,7 @@ maintained." ;;; ;;; FIXME: Shouldn't these be functions instead of macros? (defmacro in-stream-from-designator (stream) - (let ((svar (sb-xc:gensym))) + (let ((svar (gensym))) `(let ((,svar ,stream)) (cond ((null ,svar) *standard-input*) ((eq ,svar t) *terminal-io*) @@ -110,7 +110,7 @@ maintained." (t (return x)))))) |# (defmacro out-stream-from-designator (stream) - (let ((svar (sb-xc:gensym))) + (let ((svar (gensym))) `(let ((,svar ,stream)) (cond ((null ,svar) *standard-output*) ((eq ,svar t) *terminal-io*) @@ -234,7 +234,7 @@ maintained." &body body) ;; If the &REST arg never needs to be reified, this is slightly quicker ;; than using a DX list. - (let ((index (sb-xc:gensym "INDEX"))) + (let ((index (gensym "INDEX"))) `(let ((,index ,start)) (loop (cond ((< (truly-the index ,index) (length ,rest-var)) diff --git a/src/code/target-alieneval.lisp b/src/code/target-alieneval.lisp index 4854ad1deb..cf3f3e4615 100644 --- a/src/code/target-alieneval.lisp +++ b/src/code/target-alieneval.lisp @@ -155,8 +155,8 @@ This is SETFable." (foreign-symbol-sap ,initial-value ,datap) 0 ,alien-type))) ,@body))) (:local - (let* ((var (sb-xc:gensym "VAR")) - (initval (if initial-value (sb-xc:gensym "INITVAL"))) + (let* ((var (gensym "VAR")) + (initval (if initial-value (gensym "INITVAL"))) (info (make-local-alien-info :type alien-type)) (inner-body `((note-local-alien-type ',info ,var) @@ -715,7 +715,7 @@ type specifies the argument and result types." (let ((stub (alien-fun-type-stub type))) (unless stub (setf stub - (let ((fun (sb-xc:gensym "FUN")) + (let ((fun (gensym "FUN")) (parms (make-gensym-list (length args)))) (compile nil `(lambda (,fun ,@parms) diff --git a/src/code/target-format.lisp b/src/code/target-format.lisp index 8f472e2223..0612a1194c 100644 --- a/src/code/target-format.lisp +++ b/src/code/target-format.lisp @@ -185,7 +185,7 @@ "~:@(~:C~)-FORMAT-DIRECTIVE-INTERPRETER" char))) (directive '.directive) ; expose this var to the lambda. it's easiest - (directives (if lambda-list (car (last lambda-list)) (sb-xc:gensym "DIRECTIVES")))) + (directives (if lambda-list (car (last lambda-list)) (gensym "DIRECTIVES")))) `(!cold-init-forms (setf (aref *format-directive-interpreters* ,(char-code (char-upcase char))) @@ -201,7 +201,7 @@ ,@body))))))) (defmacro def-format-interpreter (char lambda-list &body body) - (let ((directives (sb-xc:gensym "DIRECTIVES"))) + (let ((directives (gensym "DIRECTIVES"))) `(def-complex-format-interpreter ,char (,@lambda-list ,directives) ,@body ,directives))) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 3548426aea..51fe0d0734 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -911,7 +911,7 @@ Experimental: interface subject to change." ;;; of STRING. ENTRY-HASH is the entry-hash of the string and length. ;;; If the symbol is found, then FORMS are executed; otherwise not. -(defmacro with-symbol (((symbol-var &optional (index-var (sb-xc:gensym))) table +(defmacro with-symbol (((symbol-var &optional (index-var (gensym))) table string length sxhash) &body forms) (with-unique-names (vec len h2 probed-thing name) `(let* ((,vec (package-hashtable-cells ,table)) diff --git a/src/compiler/aliencomp.lisp b/src/compiler/aliencomp.lisp index 0209908a91..3569d8541f 100644 --- a/src/compiler/aliencomp.lisp +++ b/src/compiler/aliencomp.lisp @@ -219,7 +219,7 @@ (give-up-ir1-transform "Element alignment is unknown.")) (if (null dims) (values nil 0 element-type) - (let* ((arg (sb-xc:gensym)) + (let* ((arg (gensym)) (args (list arg)) (offsetexpr arg)) (dolist (dim (cdr dims)) diff --git a/src/compiler/arm64/c-call.lisp b/src/compiler/arm64/c-call.lisp index 32cb2aab0d..bee27d8d81 100644 --- a/src/compiler/arm64/c-call.lisp +++ b/src/compiler/arm64/c-call.lisp @@ -270,10 +270,10 @@ (append (loop for gpr in gprs collect `(:temporary (:sc any-reg :offset ,gpr :from :eval :to :result) - ,(car (push (sb-xc:gensym) vars)))) + ,(car (push (gensym) vars)))) (loop for float to 31 collect `(:temporary (:sc single-reg :offset ,float :from :eval :to :result) - ,(car (push (sb-xc:gensym) vars)))) + ,(car (push (gensym) vars)))) `((:ignore ,@vars)))))) (define-vop (call-out) diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index c79d4f593b..ce68086094 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -1741,12 +1741,12 @@ total-bits assembly-unit-bits)) quo)) (bytes (make-array num-bytes :initial-element nil)) - (segment-arg (sb-xc:gensym "SEGMENT-"))) + (segment-arg (gensym "SEGMENT-"))) (dolist (byte-spec-expr byte-specs) (let* ((byte-spec (eval byte-spec-expr)) (byte-size (byte-size byte-spec)) (byte-posn (byte-position byte-spec)) - (arg (sb-xc:gensym (format nil "~:@(ARG-FOR-~S-~)" byte-spec-expr)))) + (arg (gensym (format nil "~:@(ARG-FOR-~S-~)" byte-spec-expr)))) (when (ldb-test (byte byte-size byte-posn) overall-mask) (error "The byte spec ~S either overlaps another byte spec, or ~ extends past the end." diff --git a/src/compiler/generic/pinned-objects.lisp b/src/compiler/generic/pinned-objects.lisp index 5fa9aba7dc..0587c07fa8 100644 --- a/src/compiler/generic/pinned-objects.lisp +++ b/src/compiler/generic/pinned-objects.lisp @@ -27,7 +27,7 @@ garbage collection." #+(and gencgc (or x86 x86-64)) (if objects (let ((pins (make-gensym-list (length objects))) - (wpo (sb-xc:gensym "WITH-PINNED-OBJECTS-THUNK"))) + (wpo (gensym "WITH-PINNED-OBJECTS-THUNK"))) ;; BODY is stuffed in a function to preserve the lexical ;; environment. `(flet ((,wpo () (progn ,@body))) diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index 2c394b99d6..e6a49609a0 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -254,7 +254,7 @@ ;; Iterate over PACKED-INFO, binding DATA-INDEX to the index of each aux-key in turn. ;; TOTAL-N-FIELDS is deliberately exposed to invoking code. ;; -(defmacro do-packed-info-aux-key ((packed-info &optional (data-index (sb-xc:gensym))) +(defmacro do-packed-info-aux-key ((packed-info &optional (data-index (gensym))) step-form &optional result-form) (with-unique-names (descriptor-idx field-idx info) `(let* ((,info ,packed-info) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index fa0245f568..22b23b3958 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -1080,7 +1080,7 @@ (make-gensym-list (length (combination-args node)))) (setq passed-args (copy-list received-args))) (let ((tempname (let ((*gensym-counter* (length dx-flets))) - (sb-xc:gensym "LAMBDA"))) + (gensym "LAMBDA"))) (original-lambda (functional-inline-expansion (lambda-entry-fun (ref-leaf use))))) diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index bbdd6b8a6c..aeea5dfaae 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -309,7 +309,7 @@ (dolist (default defaults) (if (constantp default) (default-vals default) - (let ((var (sb-xc:gensym))) + (let ((var (gensym))) (default-bindings `(,var ,default)) (default-vals var)))) (let ((bindings (default-bindings)) @@ -449,10 +449,10 @@ :type (leaf-type var) :where-from (leaf-where-from var)))) - (let* ((n-context (sb-xc:gensym "N-CONTEXT-")) + (let* ((n-context (gensym "N-CONTEXT-")) (context-temp (make-lambda-var :%source-name n-context :arg-info (make-arg-info :kind :more-context))) - (n-count (sb-xc:gensym "N-COUNT-")) + (n-count (gensym "N-COUNT-")) (count-temp (make-lambda-var :%source-name n-count :type (specifier-type 'index) :arg-info (make-arg-info :kind :more-count)))) @@ -472,11 +472,11 @@ ;; and take advantage of the base+index+displacement addressing ;; mode on x86oids.) (when (optional-dispatch-keyp res) - (let ((n-index (sb-xc:gensym "N-INDEX-")) - (n-key (sb-xc:gensym "N-KEY-")) - (n-value-temp (sb-xc:gensym "N-VALUE-TEMP-")) - (n-allowp (sb-xc:gensym "N-ALLOWP-")) - (n-lose (sb-xc:gensym "N-LOSE-")) + (let ((n-index (gensym "N-INDEX-")) + (n-key (gensym "N-KEY-")) + (n-value-temp (gensym "N-VALUE-TEMP-")) + (n-allowp (gensym "N-ALLOWP-")) + (n-lose (gensym "N-LOSE-")) (allowp (or (optional-dispatch-allowp res) (policy *lexenv* (zerop safety)))) (found-allow-p nil)) @@ -500,9 +500,9 @@ (keyword (arg-info-key info)) (supplied-p (arg-info-supplied-p info)) (supplied-used-p (arg-info-supplied-used-p info)) - (n-value (sb-xc:gensym "N-VALUE-")) + (n-value (gensym "N-VALUE-")) (clause (cond (supplied-p - (let ((n-supplied (sb-xc:gensym "N-SUPPLIED-"))) + (let ((n-supplied (gensym "N-SUPPLIED-"))) (temps (list n-supplied (if supplied-used-p nil @@ -629,10 +629,10 @@ ;; Make up two extra variables, and squirrel them away in ;; ARG-INFO-DEFAULT for transforming (VALUES-LIST REST) into ;; (%MORE-ARG-VALUES CONTEXT 0 COUNT) when possible. - (let* ((context-name (sb-xc:gensym "REST-CONTEXT-")) + (let* ((context-name (gensym "REST-CONTEXT-")) (context (make-lambda-var :%source-name context-name :arg-info (make-arg-info :kind :more-context))) - (count-name (sb-xc:gensym "REST-COUNT-")) + (count-name (gensym "REST-COUNT-")) (count (make-lambda-var :%source-name count-name :arg-info (make-arg-info :kind :more-count) :type (specifier-type 'index)))) @@ -660,7 +660,7 @@ (main-vars val-temp) (bind-vars key) (cond ((or hairy-default supplied-p) - (let* ((n-supplied (sb-xc:gensym "N-SUPPLIED-")) + (let* ((n-supplied (gensym "N-SUPPLIED-")) (supplied-temp (make-lambda-var :%source-name n-supplied))) (unless supplied-p diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index b31b465a1b..02dc52306b 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1735,7 +1735,7 @@ the stack without triggering overflow protection.") &body forms) (declare (symbol ctran lvar)) (let ((post-binding-lexenv-p (not (null post-binding-lexenv))) - (post-binding-lexenv (or post-binding-lexenv (sb-xc:gensym "LEXENV")))) + (post-binding-lexenv (or post-binding-lexenv (gensym "LEXENV")))) `(%processing-decls ,decls ,vars ,fvars ,ctran ,lvar ,post-binding-lexenv-p (lambda (,ctran ,lvar ,post-binding-lexenv) diff --git a/src/compiler/locall.lisp b/src/compiler/locall.lisp index 6a5c78cb41..d7f61b3f90 100644 --- a/src/compiler/locall.lisp +++ b/src/compiler/locall.lisp @@ -176,7 +176,7 @@ (declare (type functional fun)) (etypecase fun (clambda - (let* ((n-supplied (sb-xc:gensym)) + (let* ((n-supplied (gensym)) (nargs (length (lambda-vars fun))) (temps (make-gensym-list nargs))) `(lambda (,n-supplied ,@temps) @@ -189,7 +189,7 @@ (let* ((min (optional-dispatch-min-args fun)) (max (optional-dispatch-max-args fun)) (more (optional-dispatch-more-entry fun)) - (n-supplied (sb-xc:gensym)) + (n-supplied (gensym)) (temps (make-gensym-list max)) (main (optional-dispatch-main-entry fun)) (optional-vars (nthcdr min (lambda-vars main))) diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index 94beef4db3..59611ae1f5 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -380,7 +380,7 @@ ;;; methods are passed an additional POLICY argument, and IR2-CONVERT ;;; methods are passed an additional IR2-BLOCK argument. (defmacro defoptimizer (what (lambda-list - &optional (node (sb-xc:gensym) node-p) + &optional (node (gensym) node-p) &rest vars) &body body) (let ((name (flet ((function-name (name) @@ -448,7 +448,7 @@ (defmacro do-blocks ((block-var component &optional ends result) &body body) (unless (member ends '(nil :head :tail :both)) (error "losing ENDS value: ~S" ends)) - (let ((n-component (sb-xc:gensym)) + (let ((n-component (gensym)) (n-tail (gensym))) `(let* ((,n-component ,component) (,n-tail ,(if (member ends '(:both :tail)) @@ -464,7 +464,7 @@ (defmacro do-blocks-backwards ((block-var component &optional ends result) &body body) (unless (member ends '(nil :head :tail :both)) (error "losing ENDS value: ~S" ends)) - (let ((n-component (sb-xc:gensym)) + (let ((n-component (gensym)) (n-head (gensym))) `(let* ((,n-component ,component) (,n-head ,(if (member ends '(:both :head)) @@ -695,8 +695,8 @@ #-sb-xc-host get-setf-expansion place env) (when (cdr stores) (error "multiple store variables for ~S" place)) - (let ((newval (sb-xc:gensym)) - (n-place (sb-xc:gensym)) + (let ((newval (gensym)) + (n-place (gensym)) (mask (encode-attribute-mask attributes ,vector))) (values `(,@temps ,n-place) `(,@values ,getter) diff --git a/src/compiler/meta-vmdef.lisp b/src/compiler/meta-vmdef.lisp index 608a8f4de4..d36d2a61d1 100644 --- a/src/compiler/meta-vmdef.lisp +++ b/src/compiler/meta-vmdef.lisp @@ -1874,8 +1874,8 @@ (result-count (length (vop-parse-results parse))) (info-count (length (vop-parse-info-args parse))) (noperands (+ arg-count result-count info-count)) - (n-node (sb-xc:gensym)) - (n-block (sb-xc:gensym)) + (n-node (gensym)) + (n-block (gensym)) (n-template (gensym))) (when (or (vop-parse-more-args parse) (vop-parse-more-results parse)) @@ -1892,7 +1892,7 @@ (collect ((ibinds) (ivars)) (dolist (info (subseq operands arg-count (+ arg-count info-count))) - (let ((temp (sb-xc:gensym))) + (let ((temp (gensym))) (ibinds `(,temp ,info)) (ivars temp))) @@ -1934,7 +1934,7 @@ (fixed-args (butlast args)) (fixed-results (butlast results)) (n-node (gensym)) - (n-block (sb-xc:gensym)) + (n-block (gensym)) (n-template (gensym))) (unless (or (vop-parse-more-args parse) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index e35aaba9b2..d40ebcec63 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -1342,7 +1342,7 @@ &rest keys &key limit reads writes) &body body) (declare (ignore limit reads writes)) - (let ((callback (sb-xc:gensym "CALLBACK"))) + (let ((callback (gensym "CALLBACK"))) `(flet ((,callback (,target-variable) ,@body)) (declare (dynamic-extent #',callback)) diff --git a/src/compiler/parse-lambda-list.lisp b/src/compiler/parse-lambda-list.lisp index 95a3346759..3553c9c1ce 100644 --- a/src/compiler/parse-lambda-list.lisp +++ b/src/compiler/parse-lambda-list.lisp @@ -807,7 +807,7 @@ (if sup-p-var `(values ,def nil) def)))) (cond ((not sup-p-var) (bind-pat var vals)) ((not (symbolp var)) - (let ((var-temp (sb-xc:gensym)) + (let ((var-temp (gensym)) (sup-p-temp (copy-symbol suppliedp))) (bind `((,var-temp ,sup-p-temp) ,vals)) (descend var var-temp) @@ -830,7 +830,7 @@ ;; in theory, (MULTIPLE-VALUE-BIND () (EXPR) ...) ;; but in practice it becomes a binding of an ignored gensym. (let* ((bindings-p (or whole required opt rest keys)) - (temp (and bindings-p (sb-xc:gensym)))) + (temp (and bindings-p (gensym)))) (bind `(,temp ,(cond ((or emit-pre-test (ll-kwds-keyp llks)) (emit-ds-bind-check parsed-lambda-list input @@ -880,7 +880,7 @@ (dolist (elt keys) (multiple-value-bind (keyword var def sup-p-var) (parse-key-arg-spec elt default-default) - (let ((temp (sb-xc:gensym))) + (let ((temp (gensym))) (bind `(,temp (ds-getf ,input ',keyword))) (bind-if :not `(eql ,temp 0) `(car (truly-the cons ,temp)) var sup-p-var def)))) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 169e7e8c0f..631b891d1b 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -56,7 +56,7 @@ (collect ((do-clauses) (args-to-fn) (tests)) - (let ((n-first (sb-xc:gensym))) + (let ((n-first (gensym))) (dolist (a (if accumulate arglists `(,n-first ,@(rest arglists)))) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index eacd139a0a..61ecfc44ce 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -3915,7 +3915,7 @@ (t (do* ((i (1- nargs) (1- i)) (last nil current) - (current (sb-xc:gensym) (sb-xc:gensym)) + (current (gensym) (gensym)) (vars (list current) (cons current vars)) (result t (if not-p `(if (,predicate ,current ,last) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index d4df26c26e..04f8f28639 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -628,7 +628,7 @@ `(base-char-p ,object)) ((= (cdar pairs) (1- char-code-limit)) `(characterp ,object)))) - (let ((n-code (sb-xc:gensym "CODE"))) + (let ((n-code (gensym "CODE"))) `(and (characterp ,object) (let ((,n-code (char-code ,object))) (or @@ -640,7 +640,7 @@ (defun source-transform-simd-pack-typep (object type) (if (type= type (specifier-type 'simd-pack)) `(simd-pack-p ,object) - (let ((n-tag (sb-xc:gensym "TAG"))) + (let ((n-tag (gensym "TAG"))) `(and (simd-pack-p ,object) (let ((,n-tag (%simd-pack-tag ,object))) @@ -654,7 +654,7 @@ (defun source-transform-simd-pack-256-typep (object type) (if (type= type (specifier-type 'simd-pack-256)) `(simd-pack-256-p ,object) - (let ((n-tag (sb-xc:gensym "TAG"))) + (let ((n-tag (gensym "TAG"))) `(and (simd-pack-256-p ,object) (let ((,n-tag (%simd-pack-256-tag ,object))) @@ -1060,7 +1060,7 @@ (defun source-transform-typep (object type) (when (typep type 'type-specifier) (check-deprecated-type type)) - (let ((name (sb-xc:gensym "OBJECT"))) + (let ((name (gensym "OBJECT"))) (multiple-value-bind (transform error) (%source-transform-typep name type) (if error diff --git a/src/compiler/x86-64/c-call.lisp b/src/compiler/x86-64/c-call.lisp index b7f84b49e8..8860761529 100644 --- a/src/compiler/x86-64/c-call.lisp +++ b/src/compiler/x86-64/c-call.lisp @@ -264,10 +264,10 @@ (append (loop for gpr in gprs collect `(:temporary (:sc any-reg :offset ,gpr :from :eval :to :result) - ,(car (push (sb-xc:gensym) vars)))) + ,(car (push (gensym) vars)))) (loop for float to 15 collect `(:temporary (:sc single-reg :offset ,float :from :eval :to :result) - ,(car (push (sb-xc:gensym) vars)))) + ,(car (push (gensym) vars)))) `((:ignore ,@vars)))))) (define-vop (call-out) From 768af00d33ab65d2fc27f181143a1190e8b609d3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 6 Jun 2022 17:33:33 +0300 Subject: [PATCH 3463/4023] Split base and character string loops in string-case functions. Instead of branching on each character. --- src/code/string.lisp | 158 +++++++++++++++++++++++++------------------ 1 file changed, 94 insertions(+), 64 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 72f3603f55..4ef48f021f 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -502,88 +502,118 @@ new string COUNT long filled with the fill character." (when initial-element (fill string initial-element)) string))))) +(defmacro nstring-case (case-index a z) + (declare (ignorable a z)) + `(with-one-string (string start end) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (cond ((simple-base-string-p string) + (do ((index start (1+ index))) + ((>= index end)) + (let ((char (char-code (schar string index)))) + (setf (schar string index) + (truly-the base-char + (code-char + (truly-the + char-code + (if (<= (char-code ,a) char (char-code ,z)) + (logxor char #x20) + char)))))))) + (t + (do ((index start (1+ index)) + (cases #.+character-cases+)) + ((>= index end)) + (let ((char (schar string index))) + (with-case-info (char case-index cases + :cases cases) + (let ((code (aref cases ,case-index))) + (unless (zerop code) + (setf (schar string index) + (code-char (truly-the char-code code)))))))))))) + (defun nstring-upcase (string &key (start 0) end) - (with-one-string (string start end) - (do ((index start (1+ index)) - (cases +character-cases+)) - ((>= index end)) - (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (let ((char (schar string index))) - (with-case-info (char case-index cases - :cases cases) - (let ((code (aref cases (1+ case-index)))) - (unless (zerop code) - (setf (schar string index) - (code-char (truly-the char-code code))))))))) + (nstring-case (1+ case-index) #\a #\z) string) (defun nstring-downcase (string &key (start 0) end) - (with-one-string (string start end) - (do ((index start (1+ index)) - (cases #.+character-cases+)) - ((>= index end)) - (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (let ((char (schar string index))) - (with-case-info (char case-index cases - :cases cases) - (let ((code (aref cases case-index))) - (declare (optimize (safety 0))) ;; avoid checking for base-char - (unless (zerop code) - (setf (schar string index) - (code-char code)))))))) + (nstring-case case-index #\A #\Z) string) -(defmacro string-case (case-index) +(defmacro string-case (case-index a z) + (declare (ignorable a z)) `(let ((string (%string string))) (with-array-data ((string-data string :offset-var offset) (s-start start) (s-end end) :check-fill-pointer t) - (let* ((length (length string)) - (new (cond #+sb-unicode - ((simple-base-string-p string-data) - (make-string length :element-type 'base-char)) - (t - (make-string length))))) - (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (when (> start 0) - (loop for d-i below start - for s-i from offset - do - (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (when (and end - (< end length)) - (loop for d-i from end below length - for s-i from s-end - do (locally (declare (optimize (safety 0))) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (let ((length (length string))) + (cond #+sb-unicode + ((simple-base-string-p string-data) + (let* ((new (make-string length :element-type 'base-char))) + (when (> start 0) + (loop for d-i below start + for s-i from offset + do + (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (when (and end + (< end length)) + (loop for d-i from end below length + for s-i from s-end + do (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (do ((s-i s-start (truly-the index (1+ s-i))) + (d-i start (truly-the index (1+ d-i)))) + ((>= s-i s-end)) + (declare (index d-i)) + (let ((char (char-code (schar string-data s-i)))) (setf (schar new d-i) - (schar string-data s-i))))) - (do ((s-i s-start (truly-the index (1+ s-i))) - (d-i start (truly-the index (1+ d-i))) - (cases #.+character-cases+)) - ((>= s-i s-end)) - (declare (index d-i)) - (let* ((char (schar string-data s-i)) - (cased (with-case-info (char case-index cases - :cases cases - :miss-value char) - (let ((code (aref cases ,case-index))) - (if (zerop code) - char - (code-char (truly-the char-code code))))))) - (locally (declare (optimize (safety 0))) ;; avoid checking for base-char - (setf (schar new d-i) cased)))) - new)))) + (code-char + (if (<= (char-code ,a) char (char-code ,z)) + (truly-the char-code (logxor char #x20)) + char))))) + new)) + (t + (let ((new (make-string length))) + (when (> start 0) + (loop for d-i below start + for s-i from offset + do + (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (when (and end + (< end length)) + (loop for d-i from end below length + for s-i from s-end + do (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (do ((s-i s-start (truly-the index (1+ s-i))) + (d-i start (truly-the index (1+ d-i))) + (cases #.+character-cases+)) + ((>= s-i s-end)) + (declare (index d-i)) + (let* ((char (schar string-data s-i)) + (cased (with-case-info (char case-index cases + :cases cases + :miss-value char) + (let ((code (aref cases ,case-index))) + (if (zerop code) + char + (code-char (truly-the char-code code))))))) + (setf (schar new d-i) cased))) + new))))))) (defun string-upcase (string &key (start 0) end) (declare (explicit-check)) - (string-case (1+ case-index))) + (string-case (1+ case-index) #\a #\z)) (defun string-downcase (string &key (start 0) end) (declare (explicit-check)) - (string-case case-index)) + (string-case case-index #\A #\Z)) (flet ((%capitalize (string start end) (declare (string string) (index start) (type sequence-end end)) From 15686cfc6f135293775562ef0fb6bef5be614e1c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 6 Jun 2022 11:35:17 -0400 Subject: [PATCH 3464/4023] x86-64: Flip the order of tests in SYMBOLP vop The probability of a "random" symbol being NIL is tiny. Granted the actual runtime distribution of SYMBOLP invocations isn't random, but it certainly suggests that testing for NIL first is suboptimal. --- src/compiler/x86-64/type-vops.lisp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 85915d9520..b4f40d4997 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -598,10 +598,17 @@ (:info) (:conditional :z) (:generator 5 - ;; SYMBOLP would have been IR1-transformed to NON-NULL-SYMBOL-P when possible + ;; If the VALUE were known to be an OTHER-POINTER, the the IR1 lvar type + ;; can't intersect NULL. So the IR1 should have been transformed to NON-NULL-SYMBOL-P. + ;; Hence this must *not* be known to be an OTHER-POINTER. + (aver (not (other-pointer-tn-ref-p args))) + (%lea-for-lowtag-test temp value other-pointer-lowtag :qword) + (inst test :byte temp lowtag-mask) + (inst jmp :e compare-widetag) (inst cmp value nil-value) - (inst jmp :e out) - (test-other-ptr value args symbol-widetag temp out) + (inst jmp out) + compare-widetag + (inst cmp :byte (ea temp) symbol-widetag) out)) (define-vop (non-null-symbol-p symbolp) From bd0d6c30fbd8d9e72cf63be44b659e54bf72141a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 6 Jun 2022 11:36:18 -0400 Subject: [PATCH 3465/4023] Use all 1s for NO-TLS-VALUE So that TLS can be initialized using memset(ptr,0xff,size). In making this change I discovered that scavenge_control_stack() was slightly inefficient - if (is_lisp_pointer() && !from_space_p()) there is no need to check the scavtab[] entry. Also the text in 'objects-in-memory' was wrong- no-tls-value marker never appears "in" a symbol's TLS field, only on the binding stack. --- doc/internals/objects-in-memory.texinfo | 4 +-- src/code/array.lisp | 2 +- src/code/debug-int.lisp | 13 ++++++---- src/code/print.lisp | 9 ++++++- src/code/room.lisp | 2 +- src/code/target-thread.lisp | 25 +++++++++--------- src/cold/exports.lisp | 2 +- src/compiler/arm64/cell.lisp | 14 ++++++---- src/compiler/generic/early-objdef.lisp | 8 ++++-- src/compiler/generic/late-objdef.lisp | 2 -- src/compiler/generic/objdef.lisp | 2 +- src/compiler/ppc/cell.lisp | 10 ++++---- src/compiler/ppc64/cell.lisp | 10 ++++---- src/compiler/riscv/cell.lisp | 8 +++--- src/compiler/riscv/insts.lisp | 7 ++++- src/compiler/x86-64/cell.lisp | 10 ++++---- src/compiler/x86-64/macros.lisp | 2 +- src/compiler/x86-64/memory.lisp | 3 +-- src/compiler/x86/cell.lisp | 10 ++++---- src/runtime/coreparse.c | 1 - src/runtime/gc-common.c | 34 +++++++++---------------- src/runtime/gc-unit-tests.c | 4 +-- src/runtime/thread.c | 10 ++++---- src/runtime/thread.h | 8 +++--- src/runtime/verify.inc | 2 +- tests/threads.impure.lisp | 4 +-- 26 files changed, 108 insertions(+), 98 deletions(-) diff --git a/doc/internals/objects-in-memory.texinfo b/doc/internals/objects-in-memory.texinfo index 6154c8edcf..f1117b2c42 100644 --- a/doc/internals/objects-in-memory.texinfo +++ b/doc/internals/objects-in-memory.texinfo @@ -217,8 +217,8 @@ value for the symbol (based on the symbol name), which avoids having to recompute the hash from the name every time it is required. The other additional slot, on threaded systems only, is the TLS index, -which is either @code{no-tls-value-marker-widetag} or an unboxed byte -offset within the TLS area to the TLS slot associated with the symbol. +which is a byte offset within the TLS area to the TLS slot associated +with the symbol. Because the unboxed offset is aligned to a word boundary it appears as a @code{fixnum} when viewed as boxed data. It is not, in general, safe to increment this value as a @code{fixnum}, however, in case diff --git a/src/code/array.lisp b/src/code/array.lisp index 11b2a10659..1851c4d5b2 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -528,7 +528,7 @@ (vector-extra-data vector)) (ash (sap-ref-word (current-fp) n-word-bytes) 3)) ; XXX: magic (cond ((= widetag simple-vector-widetag) - (fill vector (%make-lisp-obj no-tls-value-marker-widetag))) + (fill vector (%make-lisp-obj unwritten-vector-element-marker))) ((array-may-contain-random-bits-p widetag) ;; Leave the last word alone for base-string, ;; in case the mandatory trailing null is part of a data word. diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 21f0fc4895..7d9b9f14c1 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -711,6 +711,8 @@ (when saved-fp (compute-calling-frame saved-fp saved-pc up-frame t)))) +#+c-stack-is-control-stack +(progn (defun walk-binding-stack (symbol function) (let* (#+sb-thread (tls-index (symbol-tls-index symbol)) @@ -719,8 +721,10 @@ (sap-ref-lispobj (sb-thread::current-thread-sap) tls-index) #-sb-thread (symbol-value symbol))) - (unless (eq (get-lisp-obj-address current-value) - no-tls-value-marker-widetag) + ;; This is slightly dangerous - the right thing would be + ;; to access using SAP-REF-WORD and compare like a few lines below. + ;; Why does #-sb-thread even check for this at all? + (unless (eql (get-lisp-obj-address current-value) no-tls-value-marker) (funcall function current-value) (loop for start = (descriptor-sap *binding-stack-start*) for pointer = (descriptor-sap sb-vm::*binding-stack-pointer*) @@ -730,13 +734,11 @@ #+sb-thread (eq (sap-ref-word pointer (* n-word-bytes -1)) tls-index) #-sb-thread (eq (sap-ref-lispobj pointer (* n-word-bytes -1)) symbol) do (unless (or #+sb-thread - (= (sap-ref-word pointer (* n-word-bytes -2)) - no-tls-value-marker-widetag)) + (= (sap-ref-word pointer (* n-word-bytes -2)) no-tls-value-marker)) (funcall function (sap-ref-lispobj pointer (* n-word-bytes -2)))))))) -#+c-stack-is-control-stack (defun find-saved-fp-and-pc (fp) (block nil (walk-binding-stack @@ -756,6 +758,7 @@ (sap-ref-sap saved-fp (sb-vm::frame-byte-offset return-pc-save-offset))))))))))) +) ; end PROGN (defun return-pc-offset-for-location (debug-fun location) (declare (ignorable debug-fun location)) diff --git a/src/code/print.lisp b/src/code/print.lisp index 46752f8d55..0644227bc4 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -2043,7 +2043,14 @@ variable: an unreadable object representing the error is printed instead.") ;; as opposed to any other unbound marker. (print-unreadable-object (object stream) (write-string "unbound" stream)) (return-from print-object)) - (when (eql (get-lisp-obj-address object) sb-vm:no-tls-value-marker-widetag) + ;; NO-TLS-VALUE was added here as a printable object type for #+ubsan which, + ;; among other things, detects read-before-write on a per-array-element basis. + ;; Git rev 22d8038118 caused uninitialized SIMPLE-VECTORs to get prefilled + ;; with NO_TLS_VALUE_MARKER, but a better choice would be + ;; (logior (mask-field (byte (- n-word-bits 8) 8) -1) unbound-marker-widetag). + ;; #+ubsan has probably bitrotted for other reasons, so this is untested. + #+ubsan + (when (eql (get-lisp-obj-address object) unwritten-vector-element-marker) (print-unreadable-object (object stream) (write-string "novalue" stream)) (return-from print-object)) (print-unreadable-object (object stream :identity t) diff --git a/src/code/room.lisp b/src/code/room.lisp index 315ff311de..8059ec4aec 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -1362,7 +1362,7 @@ We could try a few things to mitigate this: (when (dotimes (i (length v)) (declare (optimize (sb-c::aref-trapping 0))) (let ((val (svref v i))) - (when (= (get-lisp-obj-address val) no-tls-value-marker-widetag) + (when (= (get-lisp-obj-address val) unwritten-vector-element-marker) (return t)))) (push (make-weak-pointer v) result) (let* ((origin (vector-extra-data v)) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index a801303242..35e38742aa 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1859,7 +1859,7 @@ session." (function system-area-pointer system-area-pointer unsigned)) (or reuse (int-sap 0)) - sb-vm:no-tls-value-marker-widetag))) + sb-vm:no-tls-value-marker))) (when (and (not reuse) (/= (sap-int thread-sap) 0)) ;; these would have been done already if reusing the memory ;; of a completed thread. @@ -2427,14 +2427,16 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (progn (sb-ext:define-load-time-global sb-vm::*free-tls-index* 0) - (defun %symbol-value-in-thread (symbol thread) + (defun %symbol-value-in-thread (symbol thread &aux (tlsindex (symbol-tls-index symbol))) (with-deathlok (thread c-thread) (if (/= c-thread 0) - (let ((val (sap-ref-lispobj (int-sap c-thread) (symbol-tls-index symbol)))) - (case (get-lisp-obj-address val) - (#.sb-vm:no-tls-value-marker-widetag (values nil :no-tls-value)) - (#.sb-vm:unbound-marker-widetag (values nil :unbound-in-thread)) - (t (values val :ok)))) + ;; Avoid loading not-really-an-object markers into a descriptor register. + (macrolet ((read-using (reader) `(,reader (int-sap c-thread) tlsindex))) + (let ((bits (read-using sap-ref-word))) + (cond ((eql bits sb-vm:no-tls-value-marker) (values nil :no-tls-value)) + ((eql (logand bits sb-vm:widetag-mask) sb-vm:unbound-marker-widetag) + (values nil :unbound-in-thread)) + (t (values (read-using sap-ref-lispobj) :ok))))) (values nil :thread-dead)))) (defun %set-symbol-value-in-thread (symbol thread value) @@ -2602,11 +2604,10 @@ mechanism for inter-thread communication." (loop for slot across slots do (setf (aref names (sb-vm::slot-offset slot)) (sb-vm::slot-name slot))) - (flet ((safely-read (sap offset) - (let ((word (sap-ref-word sap offset))) - (cond ((= word sb-vm:no-tls-value-marker-widetag) :no-tls-value) - ((= word sb-vm:unbound-marker-widetag) :unbound) - (t (sap-ref-lispobj sap offset))))) + (flet ((safely-read (sap offset &aux (bits (sap-ref-word sap offset))) + (cond ((eql bits sb-vm:no-tls-value-marker) :no-tls-value) + ((eql (logand bits sb-vm:widtag-mask) sb-vm:unbound-marker-widetag) :unbound) + (t (sap-ref-lispobj sap offset)))) (show (sym val) (let ((*print-right-margin* 128) (*print-lines* 4)) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 49f408760b..8bf49ee2eb 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -605,7 +605,7 @@ structure representations") "INSTANCE-LENGTH-MASK" "UNBOUND-MARKER-WIDETAG" "UNDEFINED-FUNCTION-TRAP" - "NO-TLS-VALUE-MARKER-WIDETAG" + "NO-TLS-VALUE-MARKER" "UNSIGNED-REG-SC-NUMBER" "UNSIGNED-STACK-SC-NUMBER" "UNWIND-BLOCK-CODE-SLOT" "UNWIND-BLOCK-CFP-SLOT" "UNWIND-BLOCK-UWP-SLOT" "UNWIND-BLOCK-ENTRY-PC-SLOT" diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index fd67277ddf..465750d71b 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -71,6 +71,10 @@ ;;; With Symbol-Value, we check that the value isn't the trap object. #+sb-thread (progn + (eval-when (:compile-toplevel) + ;; Assert that "CMN reg, 1" is the same as "CMP reg, NO-TLS-VALUE-MARKER" + (aver (= (ldb (byte 64 0) -1) no-tls-value-marker))) + (defmacro compare-to-no-tls-value-marker (x) `(inst cmn ,x 1)) (define-vop (set) (:args (object :scs (descriptor-reg) :load-if (not (and (sc-is object constant) @@ -85,7 +89,7 @@ (assemble () (inst ldr (32-bit-reg tls-index) (tls-index-of object)) (inst ldr tmp-tn (@ thread-tn tls-index)) - (inst cmp tmp-tn no-tls-value-marker-widetag) + (compare-to-no-tls-value-marker tmp-tn) (inst b :ne LOCAL) (storew value object symbol-value-slot other-pointer-lowtag) (inst b DONE) @@ -122,7 +126,7 @@ (inst ldr value (@ thread-tn tls-index)))) (assemble () - (inst cmp value no-tls-value-marker-widetag) + (compare-to-no-tls-value-marker value) (inst b :ne LOCAL) (when known-symbol (load-constant vop symbol (setf symbol (tn-ref-load-tn symbol-tn-ref)))) @@ -169,7 +173,7 @@ (:generator 9 (inst ldr (32-bit-reg value) (tls-index-of object)) (inst ldr value (@ thread-tn value)) - (inst cmp value no-tls-value-marker-widetag) + (compare-to-no-tls-value-marker value) (inst b :ne LOCAL) (loadw value object symbol-value-slot other-pointer-lowtag) LOCAL @@ -260,7 +264,7 @@ (inst str new (@ thread-tn tls-index)) DONT-STORE-TLS - (inst cmp result no-tls-value-marker-widetag) + (compare-to-no-tls-value-marker result) (inst b :ne CHECK-UNBOUND)) (inst add-sub lip symbol (- (* symbol-value-slot n-word-bytes) other-pointer-lowtag)) @@ -302,7 +306,7 @@ (inst str new (@ thread-tn tls-index)) DONT-STORE-TLS - (inst cmp result no-tls-value-marker-widetag) + (compare-to-no-tls-value-marker result) (inst b :ne CHECK-UNBOUND)) (inst add-sub lip symbol (- (* symbol-value-slot n-word-bytes) other-pointer-lowtag)) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 94046e6d71..25eae20122 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -215,7 +215,7 @@ weak-pointer-widetag ; 52 59 fdefn-widetag ; 56 5D - no-tls-value-marker-widetag ; 5A 61 + unused-widetag ; 5A 61 #+sb-simd-pack simd-pack-widetag ; 65 #-sb-simd-pack unused01-widetag ; 5E #+sb-simd-pack-256 simd-pack-256-widetag ; 69 @@ -280,6 +280,11 @@ unused-array-widetag ; F2 FD )) +;;; A filler cons whose first word is all 1s looks like this marker pattern, +;;; but there's no ambiguity, because no-tls-value can't appear in an object +;;; on the heap. +(defconstant no-tls-value-marker most-positive-word) + ;;; Map each widetag symbol to a string to go in 'tagnames.h'. ;;; I didn't want to mess with the formatting of the table above. (defparameter *widetag-string-alist* @@ -303,7 +308,6 @@ (unbound-marker-widetag "unbound-marker") (weak-pointer-widetag "weakptr") (fdefn-widetag "fdefn") - (no-tls-value-marker-widetag "no-TLS-val") (simd-pack-widetag "SIMD-pack") (simd-pack-256-widetag "SIMD-pack256") (filler-widetag "filler") diff --git a/src/compiler/generic/late-objdef.lisp b/src/compiler/generic/late-objdef.lisp index ef3cb0edb6..d2104acc9a 100644 --- a/src/compiler/generic/late-objdef.lisp +++ b/src/compiler/generic/late-objdef.lisp @@ -81,8 +81,6 @@ (instance "instance" "lose" "instance") (fdefn "fdefn") - (no-tls-value-marker "immediate") - #+sb-simd-pack (simd-pack "unboxed") #+sb-simd-pack-256 (simd-pack-256 "unboxed") (filler "unboxed") diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index f39d17740f..eafe46494d 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -491,7 +491,7 @@ during backtrace. (define-primitive-object (thread :size primitive-thread-object-length) ;; no_tls_value_marker is borrowed very briefly at thread startup to ;; pass the address of the start routine into new_thread_trampoline. - ;; tls[0] = NO_TLS_VALUE_MARKER_WIDETAG because a the tls index slot + ;; tls[0] = NO_TLS_VALUE_MARKER because a the tls index slot ;; of a symbol is initialized to zero (no-tls-value-marker) diff --git a/src/compiler/ppc/cell.lisp b/src/compiler/ppc/cell.lisp index 4bd9d1a353..92555ecbb2 100644 --- a/src/compiler/ppc/cell.lisp +++ b/src/compiler/ppc/cell.lisp @@ -75,7 +75,7 @@ (inst stwx new thread-base-tn temp) DONT-STORE-TLS - (inst cmpwi result no-tls-value-marker-widetag) + (inst cmpwi result no-tls-value-marker) (inst bne CHECK-UNBOUND)) (inst li temp (- (* symbol-value-slot n-word-bytes) @@ -129,7 +129,7 @@ (:generator 4 (loadw tls-slot symbol symbol-tls-index-slot other-pointer-lowtag) (inst lwzx temp thread-base-tn tls-slot) - (inst cmpwi temp no-tls-value-marker-widetag) + (inst cmpwi temp no-tls-value-marker) (inst beq GLOBAL-VALUE) (inst stwx value thread-base-tn tls-slot) (inst b DONE) @@ -148,7 +148,7 @@ (:generator 9 (loadw value object symbol-tls-index-slot other-pointer-lowtag) (inst lwzx value thread-base-tn value) - (inst cmpwi value no-tls-value-marker-widetag) + (inst cmpwi value no-tls-value-marker) (inst bne CHECK-UNBOUND) (loadw value object symbol-value-slot other-pointer-lowtag) CHECK-UNBOUND @@ -166,7 +166,7 @@ (:generator 8 (loadw value object symbol-tls-index-slot other-pointer-lowtag) (inst lwzx value thread-base-tn value) - (inst cmpwi value no-tls-value-marker-widetag) + (inst cmpwi value no-tls-value-marker) (inst bne DONE) (loadw value object symbol-value-slot other-pointer-lowtag) DONE))) @@ -193,7 +193,7 @@ (:generator 9 (loadw value object symbol-tls-index-slot other-pointer-lowtag) (inst lwzx value thread-base-tn value) - (inst cmpwi value no-tls-value-marker-widetag) + (inst cmpwi value no-tls-value-marker) (inst bne CHECK-UNBOUND) (loadw value object symbol-value-slot other-pointer-lowtag) CHECK-UNBOUND diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index 65b59cc491..c29fe76323 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -129,7 +129,7 @@ (inst bne DONT-STORE-TLS) (inst stdx new thread-base-tn temp) DONT-STORE-TLS - (inst cmpdi result no-tls-value-marker-widetag) + (inst cmpdi result no-tls-value-marker) (inst bne CHECK-UNBOUND) (inst li temp (- (* symbol-value-slot n-word-bytes) @@ -199,7 +199,7 @@ (:generator 4 (load-tls-index tls-slot symbol) (inst ldx temp thread-base-tn tls-slot) - (inst cmpdi temp no-tls-value-marker-widetag) + (inst cmpdi temp no-tls-value-marker) (inst beq GLOBAL-VALUE) (inst stdx value thread-base-tn tls-slot) (inst b DONE) @@ -221,7 +221,7 @@ (inst beq NULL) (load-tls-index value object) (inst ldx value thread-base-tn value) - (inst cmpdi value no-tls-value-marker-widetag) + (inst cmpdi value no-tls-value-marker) (inst bne CHECK-UNBOUND) (loadw value object symbol-value-slot other-pointer-lowtag) CHECK-UNBOUND @@ -245,7 +245,7 @@ (inst beq NULL) (load-tls-index value object) (inst ldx value thread-base-tn value) - (inst cmpdi value no-tls-value-marker-widetag) + (inst cmpdi value no-tls-value-marker) (inst bne DONE) (loadw value object symbol-value-slot other-pointer-lowtag) (inst b DONE) @@ -267,7 +267,7 @@ (inst beq (if not-p out target)) (load-tls-index value object) (inst ldx value thread-base-tn value) - (inst cmpdi value no-tls-value-marker-widetag) + (inst cmpdi value no-tls-value-marker) (inst bne CHECK-UNBOUND) (loadw value object symbol-value-slot other-pointer-lowtag) CHECK-UNBOUND diff --git a/src/compiler/riscv/cell.lisp b/src/compiler/riscv/cell.lisp index e0700b0e84..baf935395a 100644 --- a/src/compiler/riscv/cell.lisp +++ b/src/compiler/riscv/cell.lisp @@ -70,7 +70,7 @@ (inst bne result old DONT-STORE-TLS) (storew new lip) DONT-STORE-TLS - (inst xori temp result no-tls-value-marker-widetag) + (inst xori temp result no-tls-value-marker) (inst bne temp zero-tn CHECK-UNBOUND)) (inst addi lip symbol (- (* symbol-value-slot n-word-bytes) @@ -97,7 +97,7 @@ (load-tls-index tls-slot symbol) (inst add lip thread-base-tn tls-slot) (loadw temp lip) - (inst xori temp temp no-tls-value-marker-widetag) + (inst xori temp temp no-tls-value-marker) (inst bne temp zero-tn TLS-VALUE) (storew value symbol symbol-value-slot other-pointer-lowtag) (inst j DONE) @@ -129,7 +129,7 @@ (load-tls-index value object) (inst add lip thread-base-tn value) (loadw value lip) - (inst xori temp value no-tls-value-marker-widetag) + (inst xori temp value no-tls-value-marker) (inst bne temp zero-tn CHECK-UNBOUND) (loadw value object symbol-value-slot other-pointer-lowtag) CHECK-UNBOUND @@ -162,7 +162,7 @@ (load-tls-index value object) (inst add lip thread-base-tn value) (loadw value lip) - (inst xori temp value no-tls-value-marker-widetag) + (inst xori temp value no-tls-value-marker) (inst bne temp zero-tn CHECK-UNBOUND) (loadw value object symbol-value-slot other-pointer-lowtag) CHECK-UNBOUND diff --git a/src/compiler/riscv/insts.lisp b/src/compiler/riscv/insts.lisp index 01704ce108..b547a70d3e 100644 --- a/src/compiler/riscv/insts.lisp +++ b/src/compiler/riscv/insts.lisp @@ -351,7 +351,12 @@ (:printer i ((funct3 ,funct3) (opcode #b0010011))) (:emitter - (emit-i-inst segment imm rs ,funct3 rd #b0010011))) + ,(if (eq name 'xori) + ;; Use something like PLAUSIBLE-SIGNED-IMM32-OPERAND-P in the amd64 assembler. + ;; This is totally ad-hoc and just enough to emit a logical NOT instruction. + `(flet ((cast-to-imm (x) (if (= x most-positive-word) -1 x))) + (emit-i-inst segment (cast-to-imm imm) rs ,funct3 rd #b0010011)) + `(emit-i-inst segment imm rs ,funct3 rd #b0010011)))) ,(when word-name #+64-bit `(define-instruction ,word-name (segment rd rs imm) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 3f168b0351..3903879947 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -164,7 +164,7 @@ (symbol-tls-index-ea symbol) (tls-index-of symbol))) (inst add cell thread-tn))) - (inst cmp :dword (ea cell) no-tls-value-marker-widetag) + (inst cmp :qword (ea cell) no-tls-value-marker) (inst jmp :ne STORE) (emit-symbol-write-barrier symbol nil val-temp (vop-nth-arg 1 vop) value) (get-symbol-value-slot-ea cell symbol) @@ -262,7 +262,7 @@ (symbol-tls-index-ea symbol) (tls-index-of symbol))) (inst add cell thread-tn) - (inst cmp :dword (ea cell) no-tls-value-marker-widetag) + (inst cmp :qword (ea cell) no-tls-value-marker) (inst jmp :ne CAS)) ;; GLOBAL. All logic that follows is for both + and - sb-thread (emit-symbol-write-barrier symbol nil cell (vop-nth-arg 2 vop) new) @@ -323,7 +323,7 @@ (setq symbol-reg symbol))) ;; Load the global value if the TLS value didn't exist - (inst cmp :dword value no-tls-value-marker-widetag) + (inst cmp :qword value no-tls-value-marker) (inst cmov :e value (if (and known-symbol-p (sc-is symbol immediate)) (symbol-slot-ea known-symbol symbol-value-slot) ; MOV Rxx, imm32 @@ -388,8 +388,8 @@ (:temporary (:sc unsigned-reg) temp) (:generator 9 (inst mov :dword temp (tls-index-of object)) - (inst mov :dword temp (thread-tls-ea temp)) - (inst cmp :dword temp no-tls-value-marker-widetag) + (inst mov :qword temp (thread-tls-ea temp)) + (inst cmp :qword temp no-tls-value-marker) (inst cmov :dword :e temp (symbol-value-slot-ea object)) (inst cmp :byte temp unbound-marker-widetag)))) diff --git a/src/compiler/x86-64/macros.lisp b/src/compiler/x86-64/macros.lisp index 6687f23dff..e2281af7f0 100644 --- a/src/compiler/x86-64/macros.lisp +++ b/src/compiler/x86-64/macros.lisp @@ -358,7 +358,7 @@ (when (memq name '(data-vector-ref-with-offset/simple-vector data-vector-ref-with-offset/simple-vector-c)) `((when (sb-c::policy (sb-c::vop-node vop) (> sb-c::aref-trapping 0)) - (inst cmp :byte ea no-tls-value-marker-widetag) + (inst cmp :byte ea unwritten-vector-element-marker) (inst jmp :e (generate-error-code vop 'uninitialized-element-error object ,index-to-encode))))))) diff --git a/src/compiler/x86-64/memory.lisp b/src/compiler/x86-64/memory.lisp index ebf7c53344..ca1e830e92 100644 --- a/src/compiler/x86-64/memory.lisp +++ b/src/compiler/x86-64/memory.lisp @@ -204,14 +204,13 @@ (defmacro compute-splat-bits (value) ;; :SAFE-DEFAULT means any unspecific value that is safely a default. ;; Heap allocation uses 0 since that costs nothing. - ;; Stack allocation pick no-tls-value-marker even though it differs from the heap. ;; If the user wanted a specific value, it could have been explicitly given. `(if (typep ,value 'sb-vm:word) ,value (case ,value (:unbound (unbound-marker-bits)) ((nil) (bug "Should not see SPLAT NIL")) - (t #+ubsan no-tls-value-marker-widetag + (t #+ubsan unwritten-vector-element-marker #-ubsan 0)))) ;;; This logic was formerly in ALLOCATE-VECTOR-ON-STACK. diff --git a/src/compiler/x86/cell.lisp b/src/compiler/x86/cell.lisp index 2994b3b755..64c348f9ac 100644 --- a/src/compiler/x86/cell.lisp +++ b/src/compiler/x86/cell.lisp @@ -75,7 +75,7 @@ ;; Thread-local area, no LOCK needed. (with-tls-ea (EA :base tls :base-already-live-p t) (inst cmpxchg EA new :maybe-fs)) - (inst cmp eax no-tls-value-marker-widetag) + (inst cmp eax no-tls-value-marker) (inst jmp :ne check) (move eax old)) (inst cmpxchg (make-ea :dword :base symbol @@ -119,7 +119,7 @@ (done (gen-label))) (loadw tls symbol symbol-tls-index-slot other-pointer-lowtag) (with-tls-ea (EA :base tls :base-already-live-p t) - (inst cmp EA no-tls-value-marker-widetag :maybe-fs) + (inst cmp EA no-tls-value-marker :maybe-fs) (inst jmp :z global-val) (inst mov EA value :maybe-fs)) (inst jmp done) @@ -142,7 +142,7 @@ (loadw value object symbol-tls-index-slot other-pointer-lowtag) (with-tls-ea (EA :base value :base-already-live-p t) (inst mov value EA :maybe-fs)) - (inst cmp value no-tls-value-marker-widetag) + (inst cmp value no-tls-value-marker) (inst jmp :ne check-unbound-label) (loadw value object symbol-value-slot other-pointer-lowtag) (emit-label check-unbound-label) @@ -163,7 +163,7 @@ (loadw value object symbol-tls-index-slot other-pointer-lowtag) (with-tls-ea (EA :base value :base-already-live-p t) (inst mov value EA :maybe-fs)) - (inst cmp value no-tls-value-marker-widetag) + (inst cmp value no-tls-value-marker) (inst jmp :ne ret-lab) (loadw value object symbol-value-slot other-pointer-lowtag) (emit-label ret-lab))))) @@ -188,7 +188,7 @@ (loadw value object symbol-tls-index-slot other-pointer-lowtag) (with-tls-ea (EA :base value :base-already-live-p t) (inst mov value EA :maybe-fs)) - (inst cmp value no-tls-value-marker-widetag) + (inst cmp value no-tls-value-marker) (inst jmp :ne check-unbound-label) (loadw value object symbol-value-slot other-pointer-lowtag) (emit-label check-unbound-label) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 5b1769feff..809040ec82 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -1375,7 +1375,6 @@ static void sanity_check_loaded_core(lispobj initial_function) ((strncmp(widetag_names[i], "unk", 3) && (i != CHARACTER_WIDETAG>>2) && (i != SIMPLE_FUN_WIDETAG>>2) - && (i != NO_TLS_VALUE_MARKER_WIDETAG>>2) && (i != UNBOUND_MARKER_WIDETAG>>2)))) { int mismatch = v[0].headers[i].count != v[1].headers[i].count; printf("%8d %11d | %8d %11d | %s%s\n", diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index b3da81e5db..0de1275724 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -2362,35 +2362,25 @@ scavenge_control_stack(struct thread *th) * the compiler isn't allowed to store unboxed objects on the * control stack. -- AB, 2011-Dec-02 */ - /* FIXME: I believe that this loop could be replaced by scavenge(), - * as it can not "... blow past the end" on header words, - * the way that heap_scavenge() might */ for (object_ptr = th->control_stack_start; object_ptr < access_control_stack_pointer(th); object_ptr++) { - - lispobj object = *object_ptr; -#ifdef LISP_FEATURE_GENCGC - if (forwarding_pointer_p(object_ptr)) + lispobj word = *object_ptr; + if (word == FORWARDING_HEADER) lose("unexpected forwarding pointer in scavenge_control_stack: %p, start=%p, end=%p", object_ptr, th->control_stack_start, access_control_stack_pointer(th)); + else if (is_lisp_pointer(word)) { scav1(object_ptr, word); } +#ifdef LISP_FEATURE_PPC64 + /* For ppc64, ~0 does not satisfy is_lisp_pointer() or is_lisp_immediate(), + * but it can be ignored. It nominally satisfies is_lisp_pointer() on other + * architectures, and gets ignored because it does not point to the heap. */ + else if (is_lisp_immediate(word) || word == ~(uword_t)0) { } // ignore +#else + else if (is_lisp_immediate(word)) { } // ignore #endif - if (is_lisp_pointer(object) && from_space_p(object)) { - /* It currently points to old space. Check for a - * forwarding pointer. */ - lispobj *ptr = native_pointer(object); - if (forwarding_pointer_p(ptr)) { - /* Yes, there's a forwarding pointer. */ - *object_ptr = forwarding_pointer_value(ptr); - } else { - /* Scavenge that pointer. */ - long n_words_scavenged = - (scavtab[header_widetag(object)])(object_ptr, object); - gc_assert(n_words_scavenged == 1); - } - } else if (scavtab[header_widetag(object)] == scav_lose) { + else if (scavtab[header_widetag(word)] == scav_lose) { lose("unboxed object in scavenge_control_stack: %p->%"OBJ_FMTX", start=%p, end=%p", - object_ptr, object, th->control_stack_start, access_control_stack_pointer(th)); + object_ptr, word, th->control_stack_start, access_control_stack_pointer(th)); } } } diff --git a/src/runtime/gc-unit-tests.c b/src/runtime/gc-unit-tests.c index 5d6aaed7ee..be38d17588 100644 --- a/src/runtime/gc-unit-tests.c +++ b/src/runtime/gc-unit-tests.c @@ -197,9 +197,7 @@ void run_gencgc_tests() for(i=0; i<256; ++i) if (fixnump(i)) gc_assert(!is_header(i)); gc_assert(!is_header(CHARACTER_WIDETAG)); gc_assert(!is_header(UNBOUND_MARKER_WIDETAG)); -#ifdef NO_TLS_VALUE_MARKER_WIDETAG - gc_assert(!is_header(NO_TLS_VALUE_MARKER_WIDETAG)); -#endif + gc_assert(!is_header(NO_TLS_VALUE_MARKER & WIDETAG_MASK)); #ifdef LISP_FEATURE_64_BIT gc_assert(!is_header(SINGLE_FLOAT_WIDETAG)); #endif diff --git a/src/runtime/thread.c b/src/runtime/thread.c index c66664d36a..fb82fda929 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -330,7 +330,7 @@ void create_main_lisp_thread(lispobj function) { InitializeCriticalSection(&recyclebin_lock); InitializeCriticalSection(&in_gc_lock); #endif - struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER_WIDETAG); + struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER); if (!th || arch_os_thread_init(th)==0 || !init_shared_attr_object()) lose("can't create initial thread"); th->state_word.sprof_enable = 1; @@ -621,7 +621,7 @@ void* new_thread_trampoline(void* arg) init_thread_data scribble; lispobj function = th->no_tls_value_marker; - th->no_tls_value_marker = NO_TLS_VALUE_MARKER_WIDETAG; + th->no_tls_value_marker = NO_TLS_VALUE_MARKER; init_new_thread(th, &scribble, GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK); funcall0(function); @@ -688,8 +688,7 @@ static void attach_os_thread(init_thread_data *scribble) block_deferrable_signals(&scribble->oldset); #endif void* recycled_memory = get_recyclebin_item(); - struct thread *th = alloc_thread_struct(recycled_memory, - NO_TLS_VALUE_MARKER_WIDETAG); + struct thread *th = alloc_thread_struct(recycled_memory, NO_TLS_VALUE_MARKER); #ifndef LISP_FEATURE_SB_SAFEPOINT /* new-lisp-thread-trampoline doesn't like when the GC signal is blocked */ @@ -921,9 +920,10 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { memset(th, 0, sizeof *th); lispobj* ptr = (lispobj*)(th + 1); lispobj* end = (lispobj*)((char*)th + dynamic_values_bytes); - while (ptr < end) *ptr++ = NO_TLS_VALUE_MARKER_WIDETAG; + memset(ptr, NO_TLS_VALUE_MARKER & 0xFF, (char*)end-(char*)ptr); th->tls_size = dynamic_values_bytes; #endif + __attribute((unused)) lispobj* tls = (lispobj*)th; #ifdef THREAD_T_NIL_CONSTANTS_SLOT tls[THREAD_T_NIL_CONSTANTS_SLOT] = (NIL << 32) | T; diff --git a/src/runtime/thread.h b/src/runtime/thread.h index a7e39d957d..8d7e0e15a3 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -157,13 +157,15 @@ tls_index_of(struct symbol *symbol) // untagged pointer # define per_thread_value(sym,th) *(lispobj*)(tls_index_of(sym) + (char*)th) #endif +#define NO_TLS_VALUE_MARKER (~(uword_t)0) + static inline lispobj SymbolValue(lispobj tagged_symbol_pointer, void *thread) { struct symbol *sym = SYMBOL(tagged_symbol_pointer); - if(thread && tls_index_of(sym)) { + if (thread && tls_index_of(sym)) { lispobj r = per_thread_value(sym, thread); - if(r!=NO_TLS_VALUE_MARKER_WIDETAG) return r; + if (r != NO_TLS_VALUE_MARKER) return r; } return sym->value; } @@ -173,7 +175,7 @@ SetSymbolValue(lispobj tagged_symbol_pointer,lispobj val, void *thread) { struct symbol *sym = SYMBOL(tagged_symbol_pointer); if(thread && tls_index_of(sym)) { - if (per_thread_value(sym, thread) != NO_TLS_VALUE_MARKER_WIDETAG) { + if (per_thread_value(sym, thread) != NO_TLS_VALUE_MARKER) { per_thread_value(sym, thread) = val; return; } diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index dd670552cc..89f6788d9b 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -292,7 +292,7 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state } if ((state->flags & VERIFYING_UNFORMATTED)) { while (where < end) { - if (*where != NO_TLS_VALUE_MARKER_WIDETAG) { + if (*where != NO_TLS_VALUE_MARKER) { int result = verify_pointer(*where, where, state); if (result) return result; } diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 14cb2db47b..7bbba543b3 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -670,7 +670,7 @@ (let* ((i (sb-kernel:symbol-tls-index mysym)) (j (+ i sb-vm:n-word-bytes))) (assert (eql (sap-ref-word (sb-thread::current-thread-sap) j) - sb-vm:no-tls-value-marker-widetag)) + sb-vm:no-tls-value-marker)) (setf (sap-ref-lispobj (sb-thread::current-thread-sap) i) fool1 (sap-ref-lispobj (sb-thread::current-thread-sap) j) fool2) ;; assert that my pointer arithmetic worked as expected @@ -681,7 +681,7 @@ (assert (not (member fool2 list)))) ;; repair the TLS entry that was corrupted by the test (setf (sap-ref-word (sb-thread::current-thread-sap) j) - sb-vm:no-tls-value-marker-widetag))))) + sb-vm:no-tls-value-marker))))) #| ;; a cll post from eric marsden From e58fc29744e9f70299637981a273a555cc738809 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 6 Jun 2022 18:55:48 +0300 Subject: [PATCH 3466/4023] nstring-case: don't store if the case doesn't change. --- src/code/string.lisp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 4ef48f021f..26b334e65b 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -510,14 +510,9 @@ new string COUNT long filled with the fill character." (do ((index start (1+ index))) ((>= index end)) (let ((char (char-code (schar string index)))) - (setf (schar string index) - (truly-the base-char - (code-char - (truly-the - char-code - (if (<= (char-code ,a) char (char-code ,z)) - (logxor char #x20) - char)))))))) + (when (<= (char-code ,a) char (char-code ,z)) + (setf (schar string index) + (code-char (truly-the char-code (logxor char #x20)))))))) (t (do ((index start (1+ index)) (cases #.+character-cases+)) From 2ac55539e3eb20faead2523a286e3d4d7179a3e1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 6 Jun 2022 23:21:24 +0300 Subject: [PATCH 3467/4023] Typo. --- src/code/target-thread.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 35e38742aa..7cd4a38ee6 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -2606,7 +2606,7 @@ mechanism for inter-thread communication." (setf (aref names (sb-vm::slot-offset slot)) (sb-vm::slot-name slot))) (flet ((safely-read (sap offset &aux (bits (sap-ref-word sap offset))) (cond ((eql bits sb-vm:no-tls-value-marker) :no-tls-value) - ((eql (logand bits sb-vm:widtag-mask) sb-vm:unbound-marker-widetag) :unbound) + ((eql (logand bits sb-vm:widetag-mask) sb-vm:unbound-marker-widetag) :unbound) (t (sap-ref-lispobj sap offset)))) (show (sym val) (let ((*print-right-margin* 128) From 303c4b1b328b284903434f7cf274c947e5d45828 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 7 Jun 2022 00:39:59 +0300 Subject: [PATCH 3468/4023] Use SWAR for casing simple-base-strings. When :start 0 :end nil. --- src/code/string.lisp | 207 +++++++++++++++++++++++++------------------ 1 file changed, 121 insertions(+), 86 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 26b334e65b..550796b6e6 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -504,26 +504,43 @@ new string COUNT long filled with the fill character." (defmacro nstring-case (case-index a z) (declare (ignorable a z)) - `(with-one-string (string start end) - (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (cond ((simple-base-string-p string) - (do ((index start (1+ index))) - ((>= index end)) - (let ((char (char-code (schar string index)))) - (when (<= (char-code ,a) char (char-code ,z)) - (setf (schar string index) - (code-char (truly-the char-code (logxor char #x20)))))))) - (t - (do ((index start (1+ index)) - (cases #.+character-cases+)) - ((>= index end)) - (let ((char (schar string index))) - (with-case-info (char case-index cases - :cases cases) - (let ((code (aref cases ,case-index))) - (unless (zerop code) - (setf (schar string index) - (code-char (truly-the char-code code)))))))))))) + `(cond #+sb-unicode + ((and (zerop start) + (not end) + (simple-base-string-p string)) + (flet ((%case (bits) + (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) + (a (+ bits (* (- 128 (char-code ,a)) repeat))) + (z (+ bits (* (- 127 (char-code ,z)) repeat)))) + (logxor bits (ash (logand (logxor a z) + (* 128 repeat)) + -2))))) + (loop for i below (ceiling (length string) sb-vm:n-word-bytes) + do + (setf (%vector-raw-bits string i) + (%case (%vector-raw-bits string i)))) + string)) + (t + (with-one-string (string start end) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (cond ((simple-base-string-p string) + (do ((index start (1+ index))) + ((>= index end)) + (let ((char (char-code (schar string index)))) + (when (<= (char-code ,a) char (char-code ,z)) + (setf (schar string index) + (code-char (truly-the char-code (logxor char #x20)))))))) + (t + (do ((index start (1+ index)) + (cases #.+character-cases+)) + ((>= index end)) + (let ((char (schar string index))) + (with-case-info (char case-index cases + :cases cases) + (let ((code (aref cases ,case-index))) + (unless (zerop code) + (setf (schar string index) + (code-char (truly-the char-code code)))))))))))))) (defun nstring-upcase (string &key (start 0) end) (nstring-case (1+ case-index) #\a #\z) @@ -535,72 +552,90 @@ new string COUNT long filled with the fill character." (defmacro string-case (case-index a z) (declare (ignorable a z)) - `(let ((string (%string string))) - (with-array-data ((string-data string :offset-var offset) - (s-start start) - (s-end end) - :check-fill-pointer t) - (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (let ((length (length string))) - (cond #+sb-unicode - ((simple-base-string-p string-data) - (let* ((new (make-string length :element-type 'base-char))) - (when (> start 0) - (loop for d-i below start - for s-i from offset - do - (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (when (and end - (< end length)) - (loop for d-i from end below length - for s-i from s-end - do (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (do ((s-i s-start (truly-the index (1+ s-i))) - (d-i start (truly-the index (1+ d-i)))) - ((>= s-i s-end)) - (declare (index d-i)) - (let ((char (char-code (schar string-data s-i)))) - (setf (schar new d-i) - (code-char - (if (<= (char-code ,a) char (char-code ,z)) - (truly-the char-code (logxor char #x20)) - char))))) - new)) - (t - (let ((new (make-string length))) - (when (> start 0) - (loop for d-i below start - for s-i from offset - do - (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (when (and end - (< end length)) - (loop for d-i from end below length - for s-i from s-end - do (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (do ((s-i s-start (truly-the index (1+ s-i))) - (d-i start (truly-the index (1+ d-i))) - (cases #.+character-cases+)) - ((>= s-i s-end)) - (declare (index d-i)) - (let* ((char (schar string-data s-i)) - (cased (with-case-info (char case-index cases - :cases cases - :miss-value char) - (let ((code (aref cases ,case-index))) - (if (zerop code) - char - (code-char (truly-the char-code code))))))) - (setf (schar new d-i) cased))) - new))))))) + `(let* ((string (%string string)) + (length (length string))) + (cond #+sb-unicode + ((and (eql start 0) + (not end) + (simple-base-string-p string)) + (flet ((%case (bits) + (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) + (a (+ bits (* (- 128 (char-code ,a)) repeat))) + (z (+ bits (* (- 127 (char-code ,z)) repeat)))) + (logxor bits (ash (logand (logxor a z) + (* 128 repeat)) + -2))))) + (let ((new (make-string length :element-type 'base-char))) + (loop for i below (ceiling (length string) sb-vm:n-word-bytes) + do + (setf (%vector-raw-bits new i) + (%case (%vector-raw-bits string i)))) + new))) + (t + (with-array-data ((string-data string :offset-var offset) + (s-start start) + (s-end end) + :check-fill-pointer t) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (cond #+sb-unicode + ((simple-base-string-p string-data) + (let* ((new (make-string length :element-type 'base-char))) + (when (> start 0) + (loop for d-i below start + for s-i from offset + do + (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (when (and end + (< end length)) + (loop for d-i from end below length + for s-i from s-end + do (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (do ((s-i s-start (truly-the index (1+ s-i))) + (d-i start (truly-the index (1+ d-i)))) + ((>= s-i s-end)) + (declare (index d-i)) + (let ((char (char-code (schar string-data s-i)))) + (setf (schar new d-i) + (code-char + (if (<= (char-code ,a) char (char-code ,z)) + (truly-the char-code (logxor char #x20)) + char))))) + new)) + (t + (let ((new (make-string length))) + (when (> start 0) + (loop for d-i below start + for s-i from offset + do + (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (when (and end + (< end length)) + (loop for d-i from end below length + for s-i from s-end + do (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (do ((s-i s-start (truly-the index (1+ s-i))) + (d-i start (truly-the index (1+ d-i))) + (cases #.+character-cases+)) + ((>= s-i s-end)) + (declare (index d-i)) + (let* ((char (schar string-data s-i)) + (cased (with-case-info (char case-index cases + :cases cases + :miss-value char) + (let ((code (aref cases ,case-index))) + (if (zerop code) + char + (code-char (truly-the char-code code))))))) + (setf (schar new d-i) cased))) + new)))))))) (defun string-upcase (string &key (start 0) end) (declare (explicit-check)) From 6280103d9f1b1fcda3d5ee2bce52de7025b30260 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Mon, 6 Jun 2022 14:07:53 -0700 Subject: [PATCH 3469/4023] Add a case for CONSTANT in PROCESS-TYPE-PROCLAMATION. Fixes underlying cause for https://bugs.launchpad.net/sbcl/+bug/1977726. --- src/compiler/ir1tran.lisp | 4 ++++ tests/compiler-2.pure.lisp | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 02dc52306b..e36af9dc92 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -1842,6 +1842,10 @@ the stack without triggering overflow protection.") (let ((var (gethash name free-vars))) (etypecase var (null) + ;; Constants cannot be redefined, and we already give the + ;; constant object the tightest type possible. We will error + ;; if the type is incompatible. + (constant) (global-var (setf (gethash name free-vars) (make-global-var :%source-name name diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index b4fd1634f1..aec8c87374 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3679,3 +3679,13 @@ (not res)))) ((1 2) nil) ((nil nil) nil))) + +(with-test (:name :constant-type-proclamation) + (ctu:file-compile + `((defconstant +foo+ 4) + + (defun bar () +foo+) + + (declaim (type integer +foo+))) + :load t) + (assert (eq (funcall 'bar) 4))) From fd9ae2d77086e6750da794056da5dd1344fd38fa Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 6 Jun 2022 23:10:03 -0400 Subject: [PATCH 3470/4023] Remove obsolete test (added in git rev 402958f925) --- tests/threads.impure.lisp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 7bbba543b3..a3396a68e5 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -727,11 +727,6 @@ (mapc #'join-thread threads) (assert (not deadline-handler-run-twice?)))) -(with-test (:name (:mutex :finalization)) - (let ((a nil)) - (dotimes (i 500000) - (setf a (make-mutex))))) - ;; You have to shoehorn this arbitrary sexpr into a feature expression ;; to have the test summary show that a test was disabled. #+gencgc From fab25613500690f3e49ecaf57dd391d137650ba5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 00:54:59 -0400 Subject: [PATCH 3471/4023] Exclude no-TLS-value-marker from %thread-local-references --- src/code/target-thread.lisp | 13 ++++++++----- tests/threads.impure.lisp | 2 ++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 7cd4a38ee6..1d95681a86 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -2468,11 +2468,14 @@ assume that unknown code can safely be terminated using TERMINATE-THREAD." (list)) ((< index (ash sb-vm::primitive-thread-object-length sb-vm:word-shift)) list) - (let ((obj (sap-ref-lispobj sap index))) - (when (and obj ; don't bother returning NIL - (sb-vm:is-lisp-pointer (get-lisp-obj-address obj)) - (not (memq obj list))) - (push obj list)))))) + ;; NO-TLS-VALUE-MARKER may or may not satisfy IS-LISP-POINTER, + ;; so be sure to exclude it in case it does. + (unless (eql (sap-ref-word sap index) sb-vm:no-tls-value-marker) + (let ((obj (sap-ref-lispobj sap index))) + (when (and obj ; don't bother returning NIL + (sb-vm:is-lisp-pointer (get-lisp-obj-address obj)) + (not (memq obj list))) + (push obj list))))))) (defun symbol-value-in-thread (symbol thread &optional (errorp t)) "Return the local value of SYMBOL in THREAD, and a secondary value of T diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index a3396a68e5..46729d40c7 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -677,6 +677,8 @@ (assert (eq (symbol-value mysym) fool1)) ;; assert that FOOL1 is found by the TLS scan and that FOOL2 is not. (let ((list (sb-thread::%thread-local-references))) + (assert (not (find sb-vm:no-tls-value-marker list + :key #'sb-kernel:get-lisp-obj-address))) (assert (member fool1 list)) (assert (not (member fool2 list)))) ;; repair the TLS entry that was corrupted by the test From e8d225d3cbf09dcb3ad4c768fea45481cf3993c6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 01:39:47 -0400 Subject: [PATCH 3472/4023] Perform less zero-filling of GC-private pages There are three uses for private pages: - lists of weak objects are stored in private conses. The car and cdr are always assigned when constructing such lists. - fullcgc uses whole pages for its scan queue. These pages don't need zeroing. There was a long-standing bug which assumed that queue blocks gotten from the internal recycle list were zeroed. - fullcgc uses private unboxed pages for tracking cons cell liveness (unless #+use-cons-region) and those ranges *do* need prezeroing. --- src/runtime/fullcgc.c | 58 ++++++++++++++++++++++++++++-------- src/runtime/gencgc.c | 5 ++++ src/runtime/monitor.c | 2 +- src/runtime/private-cons.inc | 15 ++++++++-- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index d6497f90df..0622118a9e 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -88,13 +88,16 @@ static page_index_t free_page; * If it collides with 'next_free_page', then you lose. * TODO: It would be reasonably simple to have this request more memory from * the OS instead of failing on overflow */ -static void* get_free_page() { +static void* get_free_page(boolean prezero) { --free_page; if (free_page < next_free_page) lose("Needed more space to GC"); page_table[free_page].type = PAGE_TYPE_UNBOXED; char* mem = page_address(free_page); - zeroize_pages_if_needed(free_page, free_page, 0); +#ifdef LISP_FEATURE_DARWIN_JIT + prezero = 1; // Might need to alter MMU-based protection +#endif + if (prezero) zeroize_pages_if_needed(free_page, free_page, 0); return mem; } @@ -112,10 +115,10 @@ static inline uword_t compute_page_key(lispobj cons) { static void* allocate_cons_mark_bits() { int nbytes = GENCGC_PAGE_BYTES / (2 * N_WORD_BYTES) / 8; if (suballocator_free_ptr + nbytes > suballocator_end_ptr) { - suballocator_free_ptr = get_free_page(); + suballocator_free_ptr = get_free_page(1); suballocator_end_ptr = suballocator_free_ptr + GENCGC_PAGE_BYTES; } - void* mem = suballocator_free_ptr; + char* mem = suballocator_free_ptr; suballocator_free_ptr += nbytes; return mem; } @@ -130,13 +133,14 @@ static void gc_enqueue(lispobj object) next = scav_queue.recycler; if (next) { scav_queue.recycler = next->next; - next->next = 0; dprintf(("Popped recycle list\n")); } else { - next = (struct Qblock*)get_free_page(); + next = (struct Qblock*)get_free_page(0); dprintf(("Alloc'd new block\n")); } block = block->next = next; + block->next = 0; + block->tail = block->count = 0; scav_queue.tail_block = block; } block->elements[block->tail] = object; @@ -204,6 +208,28 @@ static inline int pointer_survived_gc_yet(lispobj pointer) return (header & MARK_BIT) != 0; } +extern page_index_t contiguous_block_final_page(page_index_t); +void dump_marked_objects() { + fprintf(stderr, "Marked objects:\n"); + page_index_t first = 0; + int n = 0; + while (first < next_free_page) { + page_index_t last = contiguous_block_final_page(first); + lispobj* where = (lispobj*)page_address(first); + lispobj* limit = (lispobj*)page_address(last) + page_words_used(last); + while (where < limit) { + lispobj obj = compute_lispobj(where); + if (pointer_survived_gc_yet(obj)) { + ++n; + fprintf(stderr, " %"OBJ_FMTX"\n", obj); + } + where += object_size(where); + } + first = 1 + last; + } + fprintf(stderr, "Total: %d\n", n); +} + void __mark_obj(lispobj pointer) { gc_dcheck(is_lisp_pointer(pointer)); @@ -420,12 +446,13 @@ void prepare_for_full_mark_phase() free_page = page_table_pages; suballocator_free_ptr = suballocator_end_ptr = 0; - struct Qblock* block = (struct Qblock*)get_free_page(); + struct Qblock* block = (struct Qblock*)get_free_page(0); dprintf(("Queue block holds %d objects\n", (int)QBLOCK_CAPACITY)); scav_queue.head_block = block; scav_queue.tail_block = block; scav_queue.recycler = 0; - gc_assert(!scav_queue.head_block->count); + block->next = 0; + block->tail = block->count = 0; } void execute_full_mark_phase() @@ -578,6 +605,7 @@ static void sweep_fixedobj_pages(long *zeroed) * unlike deposit_filler() which tries to be efficient */ static void clobber_headered_object(lispobj* addr, sword_t nwords) { + // FIXME: clobbering an object on single-object pages should free entire pages page_index_t page = find_page_index(addr); if (page < 0) { // code space struct code* code = (struct code*)addr; @@ -587,7 +615,7 @@ static void clobber_headered_object(lispobj* addr, sword_t nwords) | CODE_HEADER_WIDETAG; memset(addr+2, 0, (nwords - 2) * N_WORD_BYTES); } - } else if (page_table[page].type == PAGE_TYPE_CODE) { + } else if ((SINGLE_OBJECT_FLAG|page_table[page].type) == (SINGLE_OBJECT_FLAG|PAGE_TYPE_CODE)) { // Code pages don't want (0 . 0) fillers, otherwise heap checking // gets an error: "object @ 0x..... is non-code on code page" addr[0] = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; @@ -662,8 +690,9 @@ void execute_full_sweep_phase() fprintf(stderr, "%ld%s", words_zeroed[i], i?"+":""); fprintf(stderr, " words zeroed]\n"); } -#ifdef LISP_FEATURE_USE_CONS_REGION page_index_t page; +#ifdef LISP_FEATURE_USE_CONS_REGION + // Clear all cons mark bits for (page = 0; page < next_free_page; ++page) if (page_table[page].type == PAGE_TYPE_CONS) { char* base = page_address(page); @@ -678,8 +707,11 @@ void execute_full_sweep_phase() if (sweeplog) fflush(sweeplog); - for (free_page = next_free_page; free_page < page_table_pages; ++free_page) { - set_page_need_to_zero(free_page, 1); - page_table[free_page].type = FREE_PAGE_FLAG; + // Give back all private-use pages and indicate need-to-zero + for (page = free_page; page < page_table_pages; ++page) { + gc_assert((page_table[page].type & PAGE_TYPE_MASK) == PAGE_TYPE_UNBOXED); + gc_assert(!page_bytes_used(page)); + set_page_need_to_zero(page, 1); + page_table[page].type = FREE_PAGE_FLAG; } } diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 6c50b8160c..41aed95d83 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -254,6 +254,11 @@ page_ends_contiguous_block_p(page_index_t page_index, #endif return answer; } +page_index_t contiguous_block_final_page(page_index_t first) { + page_index_t last = first; + while (!page_ends_contiguous_block_p(last, page_table[first].gen)) ++last; + return last; +} /* We maintain the invariant that pages with FREE_PAGE_FLAG have * scan_start of zero, to optimize page_ends_contiguous_block_p(). diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 1ce9a9cfa2..c3d4664d9d 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -237,12 +237,12 @@ static void unsuspend_other_threads() { } static int save_cmd(char **ptr) { -#if defined LISP_FEATURE_X86_64 && defined LISP_FEATURE_SB_THREAD char *name = parse_token(ptr); if (!name) { fprintf(stderr, "Need filename\n"); return 1; } +#if defined LISP_FEATURE_X86_64 && defined LISP_FEATURE_SB_THREAD suspend_other_threads(); save_gc_crashdump(name, (uword_t)__builtin_frame_address(0)); unsuspend_other_threads(); diff --git a/src/runtime/private-cons.inc b/src/runtime/private-cons.inc index 6e8c440cb4..2d15bc22e0 100644 --- a/src/runtime/private-cons.inc +++ b/src/runtime/private-cons.inc @@ -87,9 +87,11 @@ static struct cons* private_cons_impl() gc_dcheck(page_cards_all_marked_nonsticky(page)); page_table[page].gen = GC_PRIVATE_CONS_GENERATION; page_table[page].type = PAGE_TYPE_UNBOXED; - /* I'm surprised that the GC needs to prezero private conses. - * Was I just not thinking clearly? */ - zeroize_pages_if_needed(page, page, 0); +#ifdef LISP_FEATURE_DARWIN_JIT + // UNBOXED pages do not generally required zero-fill. + // arm64+Darwin might perform zeroing to alter MMU-based protection. + zeroize_pages_if_needed(page, page, PAGE_TYPE_UNBOXED); +#endif page_index_t tail = private_cons_page_chain; page_header->car = 0; // unused page_header->cdr = (lispobj)(tail >= 0 ? page_address(tail) : 0); @@ -133,12 +135,19 @@ uword_t gc_private_cons(uword_t car, uword_t cdr) cons = private_cons_impl(); cons->car = car; cons->cdr = cdr; +#if PRIVATE_CONS_DEBUG + if (cdr) fprintf(stderr, "private_cons(%p,%p)=%p\n", (void*)car, (void*)cdr, cons); +#endif return (uword_t)cons; } /* Push all the conses in 'list' onto the recycle list. */ void gc_private_free(struct cons* list) { +#if PRIVATE_CONS_DEBUG + { int n = 0; struct cons* tail = list; while(tail) ++n, tail = (void*)tail->cdr; + if (n>1) fprintf(stderr, "private_free(%p){%d}\n", list, n); } +#endif struct cons* head = list; while (list->cdr) list = (struct cons*)list->cdr; From c88bdf9086f3d88b54228e24a343d93156430832 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 02:09:14 -0400 Subject: [PATCH 3473/4023] Exercise fullcgc more in regression run --- tests/parallel-exec.sh | 1 + tests/run-tests.lisp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 1989e1469a..9ed971a159 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -201,6 +201,7 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (format t "~2&Allocator histogram:~%") (funcall (intern "PRINT-ALLOCATOR-HISTOGRAM" "SB-THREAD"))) (sb-sprof:report :type :flat) + (gc :gen 7) (exit :code (if (unexpected-failures) 1 104))))) (format t "~A: pid ~d~@[ (trial ~d)~]~%" (car file) pid (cdr file)) (incf subprocess-count) diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index fa22be2593..afd4970bea 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -470,6 +470,10 @@ sb-kernel::%compiler-defclass)) (sb-int:unencapsulate symbol 'defblah-guard))))) (makunbound '*allowed-inputs*) + ;; fullcgc doesn't get tested much + ;; (and we usually only find problems when save-lisp-and-die fails) + ;; so just run it once now. + (gc :gen 7) ;; after all the files are done (append-failures))) From 6b67638df1b9613dd979e29d11bf4cd41a53bc34 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 02:35:34 -0400 Subject: [PATCH 3474/4023] Improve heap verifier and crash dumper - Capture the stack pointer of the current thread exactly once so that we use the same value for verify_heap(), conservative_stack_scan(), and save_gc_crashdump() - Include thread stacks in textual dump format - Support binary crash dump format on 32-bit x86 --- src/runtime/GNUmakefile | 4 +- src/runtime/gc.h | 6 +-- src/runtime/gencgc.c | 81 +++++++++++++++++++++++------------------ src/runtime/monitor.c | 26 +++++++------ src/runtime/verify.inc | 66 ++++++++++++++++++++++++--------- tests/gc-testlib.c | 2 +- 6 files changed, 115 insertions(+), 70 deletions(-) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index 41d1c009a0..d895ef5e7b 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -94,7 +94,9 @@ targets: $(TARGET) $(OBJTARGET) sbcl.mk LDB_OBJS = $(filter-out main.o runtime.o monitor.o save.o thread.o,$(OBJS)) ldb: $(LIBSBCL) - $(CC) -DSTANDALONE_LDB -I. -o ldb monitor.c thread.c $(LDB_OBJS) $(LIBS) + $(CC) -g $(CFLAGS) -DSTANDALONE_LDB -I. -c -o standalone-monitor.o monitor.c + $(CC) -g $(CFLAGS) -DSTANDALONE_LDB -I. -c -o standalone-thread.o thread.c + $(CC) $(LINKFLAGS) -o ldb standalone-monitor.o standalone-thread.o $(LDB_OBJS) $(LIBS) $(TARGET): $(LIBSBCL) $(CC) ${LINKFLAGS} -o $@ $(USE_LIBSBCL) $(LIBS) diff --git a/src/runtime/gc.h b/src/runtime/gc.h index c6f46317ca..adbdd0f819 100644 --- a/src/runtime/gc.h +++ b/src/runtime/gc.h @@ -66,7 +66,6 @@ extern os_vm_size_t bytes_consed_between_gcs; * lisp signal handler array, or other similar array */ #define VERIFYING_UNFORMATTED 512 -#ifdef LISP_FEATURE_GENCGC #define MAX_ERR_OBJS 5 struct verify_state { lispobj* object_addr; @@ -78,9 +77,8 @@ struct verify_state { lispobj err_objs[5]; }; void hexdump_spaces(struct verify_state*, char *reason); -int verify_heap(int flags); -int hexdump_and_verify_heap(int flags); -#endif +int verify_heap(lispobj*, int flags); +int hexdump_and_verify_heap(lispobj*, int flags); page_index_t gc_find_freeish_pages(page_index_t *restart_page_ptr, sword_t nbytes, int page_type, generation_index_t gen); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 41aed95d83..a59802b315 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2174,30 +2174,29 @@ static void refine_ambiguous_roots() count = new_index; } gc_pin_count = count; - if (gencgc_verbose & 4) { - // Print in multiple columns to fit more on a screen - // and sort like 'ls' (down varying fastest) - char description[24]; - fprintf(stderr, "Sorted pin list (%d):\n", count); - const int ncolumns = 4; - int nrows = ALIGN_UP(count,ncolumns) / ncolumns; - int row, col; - for (row = 0; row < nrows; ++row) { - for (col = 0; col < ncolumns; ++col) { - int index = col * nrows + row; - if (index < count) { - lispobj* obj = native_pointer(workspace[index]); - lispobj word = *obj; - strcpy(description, "cons"); - if (is_header(word)) - snprintf(description, sizeof description, "%s,%ldw", - widetag_names[header_widetag(word)>>2], - (long)object_size(obj)); - fprintf(stderr, " %"OBJ_FMTX": %-24s", (uword_t)obj, description); - } + if (!(gencgc_verbose & 4)) return; + // Print in multiple columns to fit more on a screen + // and sort like 'ls' (down varying fastest) + char description[24]; + fprintf(stderr, "Sorted pin list (%d):\n", count); + const int ncolumns = 4; + int nrows = ALIGN_UP(count,ncolumns) / ncolumns; + int row, col; + for (row = 0; row < nrows; ++row) { + for (col = 0; col < ncolumns; ++col) { + int index = col * nrows + row; + if (index < count) { + lispobj* obj = native_pointer(workspace[index]); + lispobj word = *obj; + strcpy(description, "cons"); + if (is_header(word)) + snprintf(description, sizeof description, "%s,%ldw", + widetag_names[header_widetag(word)>>2], + (long)object_size(obj)); + fprintf(stderr, " %"OBJ_FMTX": %-24s", (uword_t)obj, description); } - putc('\n', stderr); } + putc('\n', stderr); } } @@ -3722,7 +3721,7 @@ static void pin_call_chain_and_boxed_registers(struct thread* th) { static void NO_SANITIZE_ADDRESS NO_SANITIZE_MEMORY conservative_stack_scan(struct thread* th, __attribute__((unused)) generation_index_t gen, - void* stack_hot_end) + lispobj* cur_thread_approx_stackptr) { /* there are potentially two stacks for each thread: the main * stack, which may contain Lisp pointers, and the alternate stack. @@ -3774,6 +3773,10 @@ conservative_stack_scan(struct thread* th, # endif # elif defined(LISP_FEATURE_SB_THREAD) int i; + /* fprintf(stderr, "Thread %p, ici=%d stack[%p:%p] (%dw)", + th, fixnum_value(read_TLS(FREE_INTERRUPT_CONTEXT_INDEX,th)), + th->control_stack_start, th->control_stack_end, + th->control_stack_end - th->control_stack_start); */ for (i = fixnum_value(read_TLS(FREE_INTERRUPT_CONTEXT_INDEX,th))-1; i>=0; i--) { os_context_t *c = nth_interrupt_context(i, th); preserve_context_registers(context_method, c); @@ -3782,14 +3785,16 @@ conservative_stack_scan(struct thread* th, esp = esp1; } if (th == get_sb_vm_thread()) { - lispobj* esp1 = PTR_ALIGN_DOWN(stack_hot_end, N_WORD_BYTES); - if ((void*)esp1 < esp) esp = esp1; + if ((void*)cur_thread_approx_stackptr < esp) esp = cur_thread_approx_stackptr; } # else - esp = PTR_ALIGN_DOWN(stack_hot_end, N_WORD_BYTES); + esp = cur_thread_approx_stackptr; # endif if (!esp || esp == (void*) -1) UNKNOWN_STACK_POINTER_ERROR("garbage_collect", th); + /* fprintf(stderr, " SP=%p (%dw)%s\n", + esp, (int)(th->control_stack_end - (lispobj*)esp), + (th == get_sb_vm_thread()) ? " CURRENT":""); */ // Words on the stack which point into the stack are likely // frame pointers or alien or DX object pointers. In any case @@ -3864,7 +3869,7 @@ int show_gc_generation_throughput = 0; * generation are not raised to the next generation. */ void NO_SANITIZE_ADDRESS NO_SANITIZE_MEMORY garbage_collect_generation(generation_index_t generation, int raise, - void* approximate_stackptr) + void* cur_thread_approx_stackptr) { struct thread *th; @@ -3969,7 +3974,7 @@ garbage_collect_generation(generation_index_t generation, int raise, /* Pin everything in fromspace with a stack root, and also set the * sticky card mark on any page (in any generation) * referenced from the stack. */ - conservative_stack_scan(th, generation, approximate_stackptr); + conservative_stack_scan(th, generation, cur_thread_approx_stackptr); #elif defined LISP_FEATURE_MIPS || defined LISP_FEATURE_PPC64 // Pin code if needed semiconservative_pin_stack(th, generation); @@ -4039,8 +4044,10 @@ garbage_collect_generation(generation_index_t generation, int raise, * inserted rather than at each insertion */ refine_ambiguous_roots(); - if (gencgc_verbose > 1) - show_pinnedobj_count(); + if (gencgc_verbose > 1) { + extern void dump_marked_objects(); + if (compacting_p()) show_pinnedobj_count(); else dump_marked_objects(); + } /* Now that all of the pinned pages are known, and * before we start to scavenge (and thus relocate) objects, @@ -4328,7 +4335,8 @@ garbage_collect_generation(generation_index_t generation, int raise, * in terms of inability to find objects in the SIGPROF handler etc */ SYMBOL(CODEBLOB_TREE)->value = NIL; if (generation >= verify_gens) - verify_heap(VERIFY_POST_GC | (generation<<16)); + hexdump_and_verify_heap(cur_thread_approx_stackptr, VERIFY_POST_GC | (generation<<16)); + extern int n_unboxed_instances; n_unboxed_instances = 0; } @@ -4494,16 +4502,19 @@ collect_garbage(generation_index_t last_gen) (not touched on every object allocation) so do it now */ update_immobile_nursery_bits(); + lispobj* cur_thread_approx_stackptr = + (lispobj*)ALIGN_DOWN((uword_t)&last_gen, N_WORD_BYTES); /* Verify the new objects created by Lisp code. */ if (pre_verify_gen_0) - verify_heap(VERIFY_PRE_GC); + hexdump_and_verify_heap(cur_thread_approx_stackptr, VERIFY_PRE_GC); if (gencgc_verbose > 1) print_generation_stats(); page_index_t initial_nfp = next_free_page; if (gc_mark_only) { - garbage_collect_generation(PSEUDO_STATIC_GENERATION, 0, &last_gen); + garbage_collect_generation(PSEUDO_STATIC_GENERATION, 0, + cur_thread_approx_stackptr); goto finish; } @@ -4538,7 +4549,7 @@ collect_garbage(generation_index_t last_gen) memset(n_scav_calls, 0, sizeof n_scav_calls); memset(n_scav_skipped, 0, sizeof n_scav_skipped); - garbage_collect_generation(gen, raise, &last_gen); + garbage_collect_generation(gen, raise, cur_thread_approx_stackptr); if (gencgc_verbose) fprintf(stderr, @@ -5498,7 +5509,7 @@ gc_and_save(char *filename, boolean prepend_runtime, /* All global allocation regions should be empty */ ASSERT_REGIONS_CLOSED(); // Enforce (rather, warn for lack of) self-containedness of the heap - verify_heap(VERIFY_FINAL | VERIFY_QUICK); + verify_heap(0, VERIFY_FINAL | VERIFY_QUICK); if (verbose) printf(" done]\n"); diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index c3d4664d9d..12d9cf25d6 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -85,7 +85,7 @@ struct crash_thread_preamble { const int CRASH_PREAMBLE_SIGNATURE = (sizeof (struct crash_preamble) << 16) | sizeof (struct crash_thread_preamble); -#if defined LISP_FEATURE_X86_64 // un-tested elsewhere +#if defined LISP_FEATURE_X86 || defined LISP_FEATURE_X86_64 // un-tested elsewhere #include <errno.h> static void checked_write(int fd, void* buf, long nbytes) { @@ -95,7 +95,7 @@ static void checked_write(int fd, void* buf, long nbytes) #include "immobile-space.h" void save_gc_crashdump(char *pathname, - uword_t approx_stackptr_at_gc_start) + lispobj* cur_thread_approx_stackptr) { extern int pin_all_dynamic_space_code; int fd = open(pathname, O_WRONLY|O_CREAT, 0666); @@ -177,7 +177,7 @@ void save_gc_crashdump(char *pathname, _exit(1); } #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK - sp = approx_stackptr_at_gc_start; + sp = (uword_t)cur_thread_approx_stackptr; #else sp = access_control_stack_pointer(th); #endif @@ -242,9 +242,9 @@ static int save_cmd(char **ptr) { fprintf(stderr, "Need filename\n"); return 1; } -#if defined LISP_FEATURE_X86_64 && defined LISP_FEATURE_SB_THREAD +#if (defined LISP_FEATURE_X86 || defined LISP_FEATURE_X86_64) && defined LISP_FEATURE_SB_THREAD suspend_other_threads(); - save_gc_crashdump(name, (uword_t)__builtin_frame_address(0)); + save_gc_crashdump(name, (lispobj*)__builtin_frame_address(0)); unsuspend_other_threads(); #else fprintf(stderr, "Unimplemented\n"); @@ -265,7 +265,7 @@ static int threads_cmd(char __attribute__((unused)) **ptr) { static int verify_cmd(char __attribute__((unused)) **ptr) { gencgc_verbose = 1; suspend_other_threads(); - verify_heap(0); + verify_heap(0, 0); unsuspend_other_threads(); return 0; } @@ -826,8 +826,8 @@ int load_gc_crashdump(char* pathname) struct crash_preamble preamble; struct crash_thread_preamble thread_preamble; checked_read(fd, &preamble, sizeof preamble); - printf("static=%lx nbytes=%x\n", preamble.static_start, (int)preamble.static_nbytes); - printf("heap_start=%lx npages=%d\n", preamble.dynspace_start, (int)preamble.dynspace_npages); + printf("static=%"OBJ_FMTX" nbytes=%x\n", preamble.static_start, (int)preamble.static_nbytes); + printf("heap_start=%"OBJ_FMTX" npages=%d\n", preamble.dynspace_start, (int)preamble.dynspace_npages); // pin_dynspace_code is for display only. It gets recomputed as the // logical OR of all threads' values of *GC-PIN-CODE-PAGES*. printf("sprof_enabled=%d pin_dynspace_code=%d packages=%p\n", @@ -836,8 +836,8 @@ int load_gc_crashdump(char* pathname) lisp_package_vector = preamble.lisp_package_vector; sb_sprof_enabled = preamble.sprof_enabled; if (preamble.signature != CRASH_PREAMBLE_SIGNATURE) - lose("Can't load crashdump: bad header (have %lx, expect %lx)", - preamble.signature, (long)CRASH_PREAMBLE_SIGNATURE); + lose("Can't load crashdump: bad header (have %"OBJ_FMTX", expect %"OBJ_FMTX")", + preamble.signature, (uword_t)CRASH_PREAMBLE_SIGNATURE); if (preamble.card_size != GENCGC_CARD_BYTES) lose("Can't load crashdump: memory parameters differ"); gc_card_table_nbits = preamble.card_table_nbits; @@ -853,7 +853,7 @@ int load_gc_crashdump(char* pathname) lose("Didn't map dynamic space where expected: %p vs %p", dynspace, (char*)preamble.dynspace_start); checked_read(fd, (char*)DYNAMIC_SPACE_START, dynspace_nbytes); - fprintf(stderr, "snapshot: %ld pages in use (%ld bytes)\n", + fprintf(stderr, "snapshot: %"PRIdPTR" pages in use (%ld bytes)\n", next_free_page, dynspace_nbytes); checked_read(fd, page_table, sizeof (struct page) * next_free_page); recompute_gen_bytes_allocated(); @@ -906,6 +906,10 @@ int load_gc_crashdump(char* pathname) } #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK *os_context_sp_addr(context) = (uword_t)stackptr; +#ifdef LISP_FEATURE_X86 + *os_context_register_addr(context,reg_SP) = (os_context_register_t)stackptr; +#endif + gc_assert(*os_context_register_addr(context,reg_SP) == (os_context_register_t)stackptr); #else *os_context_register_addr(context, reg_CSP) = (uword_t)stackptr; #endif diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index 89f6788d9b..f60654065f 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -374,12 +374,12 @@ static int verify(lispobj start, lispobj* end, struct verify_state* state, int f return result; } -extern void save_gc_crashdump(char *, uword_t); +extern void save_gc_crashdump(char *, lispobj*); /* Return the number of verification errors found. * You might want to use that as a deciding factor for dump the heap * to a file (which takes time, and generally isn't needed). * But if a particular verification fails, then do dump it */ -int verify_heap(int flags) +int verify_heap(lispobj* cur_thread_approx_stackptr, int flags) { int verbose = gencgc_verbose | ((flags & VERIFY_VERBOSE) != 0); @@ -489,7 +489,7 @@ void gc_show_pte(lispobj obj) #include <stdio.h> -static int n_dumps; +static int hexdump_counter; __attribute__((unused)) static void dump_immobile(lispobj* where, lispobj* end, FILE*f) { while (where < end) { @@ -509,13 +509,42 @@ static int dump_completely_p(lispobj* obj, struct verify_state* state) if (state->err_objs[i] == (uword_t)obj) return 1; return 0; } +static void hexdump_control_stacks(__attribute__((unused)) void* approximate_stackptr, + __attribute__((unused)) FILE *stream) +{ +#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK + struct thread* th; + for_each_thread(th) { + if (th->state_word.state == STATE_DEAD) continue; + lispobj* stackptr; + if (th == get_sb_vm_thread()) { + stackptr = approximate_stackptr; + } else { + int ici = fixnum_value(read_TLS(FREE_INTERRUPT_CONTEXT_INDEX,th))-1; + os_context_t *c = nth_interrupt_context(ici, th); + stackptr = (lispobj*) *os_context_register_addr(c,reg_SP); + } + gc_assert(((uword_t)stackptr & (LOWTAG_MASK>>1)) == 0); // lispword-aligned + lispobj* where = th->control_stack_end; + fprintf(stream, "\nThread @ %p\n", th); + for (--where; where >= stackptr; --where) { + lispobj word = *where; + if (!fixnump(word) && gc_managed_addr_p(word)) + fprintf(stream, " %p: %"OBJ_FMTX"\n", where, word); + } + } +#endif +} + +#define HEXDUMP_PATH_TEMPLATE "/var/tmp/heap-%d-%d.txt" + /* Dump spaces as human-readable text (hexadecimal) */ void hexdump_spaces(struct verify_state* state, char *reason) { char path[100]; - ++n_dumps; - sprintf(path, "heap-%d-%d.txt", getpid(), n_dumps); + ++hexdump_counter; + sprintf(path, HEXDUMP_PATH_TEMPLATE, getpid(), hexdump_counter); FILE *f = fopen(path, "w"); #ifdef LISP_FEATURE_IMMOBILE_SPACE @@ -604,24 +633,25 @@ void hexdump_spaces(struct verify_state* state, char *reason) fprintf(f,"--\n"); firstpage = 1+lastpage; } + hexdump_control_stacks(&reason, f); fclose(f); fprintf(stderr, "%s: wrote [%s]\n", reason, path); } -int hexdump_and_verify_heap(int flags) +int hexdump_enabled = 0; + +int hexdump_and_verify_heap(lispobj* cur_thread_approx_stackptr, int flags) { - if (gencgc_verbose>1) { - hexdump_spaces(0, flags & VERIFY_POST_GC ? "post-GC" : "pre-GC"); + if (hexdump_enabled) hexdump_spaces(0, flags & VERIFY_POST_GC ? "post-GC" : "pre-GC"); #if 0 - if (n_gcs == snapshot_this_gc_cycle) { - char pathname[128]; - sprintf(pathname, "gc-%d-%d-%d-%s.bin", - getpid(), n_gcs, from_space, - flags & VERIFY_POST_GC ? "post" : "pre"); - save_gc_crashdump(pathname, (uword_t)__builtin_frame_address(0)); - fprintf(stderr, "Wrote [%s]\n", pathname); - } -#endif + if (hexdump_counter >= 9) { + char pathname[128]; + sprintf(pathname, "gc-%d-%d-%d-%s.bin", + getpid(), n_gcs, from_space, + flags & VERIFY_POST_GC ? "post" : "pre"); + save_gc_crashdump(pathname, cur_thread_approx_stackptr); + fprintf(stderr, "Wrote [%s]\n", pathname); } - return verify_heap(flags); +#endif + return verify_heap(cur_thread_approx_stackptr, flags); } diff --git a/tests/gc-testlib.c b/tests/gc-testlib.c index 18eb3ae495..b43f953354 100644 --- a/tests/gc-testlib.c +++ b/tests/gc-testlib.c @@ -72,7 +72,7 @@ static void perform_gc(lispobj* stackptr) gc_close_collector_regions(0); // TODO: should be THREAD_PAGE_FLAG close_current_thread_tlab(); update_immobile_nursery_bits(); - verify_heap(VERIFY_PRE_GC); + verify_heap(stackptr, VERIFY_PRE_GC); garbage_collect_generation(0, 0, stackptr); gc_active_p = 0; } From 40cc380724047c8845fe0dc7998eb228b578ed65 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 10:27:47 -0400 Subject: [PATCH 3475/4023] Save/restore gc_alloc_generation in collect_generation Fixes the gc-cardmark test when run under parallel-exec. perform_gc() in gc-testlib can't reset the static variable in gencgc. I could have changed that variable to external, but it seems preferable to preserve it. run-tests.sh on impure tests doesn't invoke fullcgc, but if it did, it too would have seen the identical gc_assert failure about bytes_allocated being wrong in SCRATCH_GENERATION. --- src/runtime/gencgc.c | 9 +++------ src/runtime/verify.inc | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index a59802b315..96d4cb497c 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3915,6 +3915,8 @@ garbage_collect_generation(generation_index_t generation, int raise, #endif /* Set the global src and dest. generations */ + generation_index_t original_alloc_generation = gc_alloc_generation; + if (generation < PSEUDO_STATIC_GENERATION) { from_space = generation; @@ -4339,6 +4341,7 @@ garbage_collect_generation(generation_index_t generation, int raise, extern int n_unboxed_instances; n_unboxed_instances = 0; + gc_alloc_generation = original_alloc_generation; } static page_index_t @@ -4611,12 +4614,6 @@ collect_garbage(generation_index_t last_gen) } #endif - /* Set gc_alloc() back to generation 0. The global regions were - * already asserted to be closed after each generation's collection. - * i.e. no more allocations can accidentally occur to any other - * generation than 0 */ - gc_alloc_generation = 0; - /* Save the high-water mark before updating next_free_page */ if (next_free_page > high_water_mark) high_water_mark = next_free_page; diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index f60654065f..5b8604f3a3 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -379,7 +379,8 @@ extern void save_gc_crashdump(char *, lispobj*); * You might want to use that as a deciding factor for dump the heap * to a file (which takes time, and generally isn't needed). * But if a particular verification fails, then do dump it */ -int verify_heap(lispobj* cur_thread_approx_stackptr, int flags) +int verify_heap(__attribute__((unused)) lispobj* cur_thread_approx_stackptr, + int flags) { int verbose = gencgc_verbose | ((flags & VERIFY_VERBOSE) != 0); From 542e03d70564e0e94208dd804cb982a3fe14ce25 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 15:47:59 -0400 Subject: [PATCH 3476/4023] Add new timing wrapper for parallelized test suite parallel-exec uses sb-aprof and sb-sprof and collects data about vops used, and injects extra GCs, which is not a a fair test of whether code generation got better; and if the compiler gets slower, it also makes the test suite take longer. Those facts made it difficult to get a sense of whether the suite is executing faster. To this end, 'benchmark.sh' does the same thing as parallel-exec, but less of it, and also subtracts time spent in the compiler. Take out the GC that I recently added to PURE-RUNNER, same reason. --- src/code/save.lisp | 2 + src/compiler/main.lisp | 34 ++++++ src/compiler/target-main.lisp | 7 +- tests/benchmark.lisp | 185 +++++++++++++++++++++++++++++++++ tests/benchmark.sh | 36 +++++++ tests/input-manifest.lisp-expr | 3 +- tests/run-tests.lisp | 6 +- 7 files changed, 266 insertions(+), 7 deletions(-) create mode 100644 tests/benchmark.lisp create mode 100755 tests/benchmark.sh diff --git a/src/code/save.lisp b/src/code/save.lisp index 0b66123744..9652f719ed 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -357,6 +357,8 @@ sufficiently motivated to do lengthy fixes." (finalizers-deinit) ;; Do this last, to have some hope of printing if we need to. (stream-deinit) + (setf sb-c::*compile-elapsed-time* 0 + sb-c::*compile-file-elapsed-time* 0) (setf * nil ** nil *** nil - nil + nil ++ nil +++ nil /// nil // nil / nil)) diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index c06b6c966e..5af0c01d59 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -1902,6 +1902,37 @@ necessary, since type inference may take arbitrarily long to converge.") (source-info-start-real-time source-info)))) (values)) +(defglobal *compile-elapsed-time* 0) ; nanoseconds +(defglobal *compile-file-elapsed-time* 0) ; nanoseconds +(defun get-thread-virtual-time () + #+(and linux (not sb-xc-host)) + (multiple-value-bind (sec nsec) + (sb-unix::clock-gettime sb-unix:clock-thread-cputime-id) + (cons sec nsec)) + #-(and linux (not sb-xc-host)) + '(0 . 0)) + +(defun accumulate-compiler-time (symbol start) + (declare (ignorable symbol start)) + #+(and linux (not sb-xc-host)) + (destructuring-bind (sec-after . nsec-after) (get-thread-virtual-time) + (destructuring-bind (sec-before . nsec-before) start + (let* ((sec-diff (- sec-after sec-before)) + (nsec-diff (- nsec-after nsec-before)) + (total-nsec-diff (+ (* sec-diff (* 1000 1000 1000)) + nsec-diff)) + (old (symbol-global-value symbol))) + (loop + ;; FIXME: should we define #'(CAS SYMBOL-GLOBAL-VALUE) ? + ;; Probably want to get it working everywhere first. + (let ((new (+ old total-nsec-diff))) + (when (eq old (setq old + #-x86-64 + (cas (symbol-value symbol) old new) + #+x86-64 + (%cas-symbol-global-value symbol old new))) + (return)))))))) + ;;; Open some files and call SUB-COMPILE-FILE. If something unwinds ;;; out of the compile, then abort the writing of the output file, so ;;; that we don't overwrite it with known garbage. @@ -1977,6 +2008,7 @@ returning its filename. (abort-p t) (warnings-p nil) (failure-p t) ; T in case error keeps this from being set later + (clock-start (get-thread-virtual-time)) (input-pathname (verify-source-file input-file)) (source-info (make-file-source-info input-pathname external-format @@ -2036,6 +2068,8 @@ returning its filename. (when (and trace-file (not (streamp trace-file))) (close *compiler-trace-output*))) + (accumulate-compiler-time '*compile-file-elapsed-time* clock-start) + ;; CLHS says that the first value is NIL if the "file could not ;; be created". We interpret this to mean "a valid fasl could not ;; be created" -- which can happen if the compilation is aborted diff --git a/src/compiler/target-main.lisp b/src/compiler/target-main.lisp index 4486aefd85..15c881333c 100644 --- a/src/compiler/target-main.lisp +++ b/src/compiler/target-main.lisp @@ -136,7 +136,9 @@ WARNING occur during the compilation, and NIL otherwise. Tertiary value is true if any conditions of type ERROR, or WARNING that are not STYLE-WARNINGs occur during compilation, and NIL otherwise. " - (multiple-value-bind (compiled-definition warnings-p failure-p) + (binding* + ((clock-start (get-thread-virtual-time)) + ((compiled-definition warnings-p failure-p) ;; TODO: generic functions with any interpreted methods ;; should compile the methods and reinstall them. (if (compiled-function-p definition) @@ -146,7 +148,8 @@ not STYLE-WARNINGs occur during compilation, and NIL otherwise. (values (the cons definition) (make-null-lexenv)) #+(or sb-eval sb-fasteval) (prepare-for-compile definition)) - (compile-in-lexenv sexpr lexenv name nil nil nil nil))) + (compile-in-lexenv sexpr lexenv name nil nil nil nil))))) + (accumulate-compiler-time '*compile-elapsed-time* clock-start) (values (cond (name (if (and (symbolp name) (macro-function name)) (setf (macro-function name) compiled-definition) diff --git a/tests/benchmark.lisp b/tests/benchmark.lisp new file mode 100644 index 0000000000..1c0ac30136 --- /dev/null +++ b/tests/benchmark.lisp @@ -0,0 +1,185 @@ + +(let ((*evaluator-mode* :compile)) + (with-compilation-unit () (load"run-tests"))) + +(in-package run-tests) +(pop *posix-argv*) +(defvar *logdir* (pop *posix-argv*)) +(defvar *njobs* (parse-integer (pop *posix-argv*))) +(require :sb-posix) + +(import '(sb-alien:alien-funcall sb-alien:extern-alien + sb-alien:int sb-alien:c-string sb-alien:unsigned)) + +;;; Ordered approximately in descending order by running time +(defvar *slow-tests* '("threads.impure" + "seq.impure" + "threads.pure" + "compiler.pure" + "timer.impure" + "bug-1180102.impure" + "gethash-concurrency.impure" + "arith-slow.pure")) + +(defvar *filter* nil) +(defun choose-order (tests) + (when *filter* + (let (strings) + (with-open-file (file *filter*) + (loop (let ((line (read-line file nil))) + (if line (push line strings) (return))))) + (setq tests (remove-if (lambda (x) (not (find x strings :test #'string=))) + tests)))) + (sort tests + (lambda (a b) + (let ((posn-a (or (position a *slow-tests* :test #'string=) + most-positive-fixnum)) + (posn-b (or (position b *slow-tests* :test #'string=) + most-positive-fixnum))) + (cond ((< posn-a posn-b) t) + ((> posn-a posn-b) nil) + (t (string< a b))))))) + +(defun output-metrics (c1 c2 c3 c4 testfile comment metricsfile) + (let ((summary + ;; FORMAT NIL produces simple-base-string when it can + (format nil "(~10d ~10d ~10d ~10d ~s ~s)~%" + c1 + c2 + c3 + c4 + testfile + comment))) + (sb-unix:unix-write metricsfile summary 0 (length summary)))) + +;; Conversion factor from nanoseconds to internal-time-units +(defconstant divisor (/ 1000000000 internal-time-units-per-second)) + +(defun sort-metrics (filename) + (let (original-list) + (with-open-file (f (make-pathname :type "lisp-expr" :defaults filename)) + (loop (let ((expr (read f nil))) + (unless expr (return)) + (destructuring-bind (a b c d name pf) expr + (let ((vt-less-compiler (- d (round (+ a b) divisor)))) + (push (cons vt-less-compiler expr) original-list)))))) + (with-open-file (f (make-pathname :type "txt" :defaults filename) + :direction :output :if-exists :supersede) + (format f " +; Version: ~A +; Parallelism: ~D +; Files: ~D +; +; COMPILE- COMPILE GC Total Less +; FILE compiler +; (thread) (thread) (process) +; virtual virtual real virtual virtual +; --------- ---------- -------- ---------- ---------- +" (lisp-implementation-version) *njobs* (length original-list)) + + (let ((c1 0) (c2 0) (c3 0) (c4 0) (c5 0)) + (dolist (line (sort original-list #'> :key #'car)) + (destructuring-bind (net cfile compile gc process filename pf) line + ;; get-internal-run-time returns microseconds + ;; but we've collected the compiler time in nanoseconds + (setq cfile (round cfile divisor) + compile (round compile divisor)) + (format f "~11d~12d~10d~12d~12d ~A~A~%" + cfile compile gc process net filename (if (eql pf :fail) " FAIL" "")) + (incf c1 cfile) + (incf c2 compile) + (incf c3 gc) + (incf c4 process) + (incf c5 net))) + (format f "~11d~12d~10d~12d~12d TOTAL~%" + c1 c2 c3 c4 c5))))) + +(defun parallel-execute-tests (files &optional (max-jobs *njobs*)) + (format t "Using ~D processes~%" max-jobs) + (let* ((subprocess-count 0) + (subprocess-list nil) + ;; Start timing only after all the DIRECTORY calls are done (above) + (start-time (get-internal-real-time)) + (missing-usage) + (losing) + (metricsfilename (format nil "~A/performance" *logdir*)) + (metricsfile + (sb-unix:unix-open (namestring (make-pathname :type "lisp-expr" + :defaults metricsfilename)) + (logior sb-unix:o_creat sb-unix:o_wronly sb-unix:o_append) + #o666))) + (labels ((wait () + ;; Though far from elegant, this is an easy way to figure out + ;; which tests are getting stuck, if any are. + #+nil (format t "Runner is waiting on: ~S~%" subprocess-list) + (multiple-value-bind (pid status) (sb-posix:wait) + (decf subprocess-count) + (let ((process (assoc pid subprocess-list)) + (code (ash status -8)) + (et)) + (unless process + (warn "Whoa! Process ~D is an unexpected child" pid) + (return-from wait (wait))) + (setq subprocess-list (delete process subprocess-list)) + (destructuring-bind ((filename . iteration) start-time) (cdr process) + (setq et (elapsed-time-from start-time)) + (cond ((eq code 104) + (format t "~A: success (~d µsec)~%" filename et)) + (t + (format t "~A~@[[~d]~]: status ~D (~d µsec)~%" + filename iteration code et) + (push (list filename iteration pid) losing))))))) + (elapsed-time-from (when) ; return value in microseconds + (round (- (get-internal-real-time) when) + (/ internal-time-units-per-second 1000000)))) + (dolist (file files) + (when (>= subprocess-count max-jobs) + (wait)) + (let ((pid (sb-posix:fork))) + (when (zerop pid) + ;; FILE is (filename . test-iteration) + (with-open-file (stream (format nil "~A/~a~@[-~d~]" + *logdir* (car file) (cdr file)) + :direction :output :if-exists :supersede) + (alien-funcall (extern-alien "dup2" (function int int int)) + (sb-sys:fd-stream-fd stream) 1) + (alien-funcall (extern-alien "dup2" (function int int int)) 1 2)) + (setq file (car file)) + ;; Send this to the log file, not the terminal + (setq *debug-io* (make-two-way-stream (make-concatenated-stream) + *error-output*)) + (let ((*features* (cons :parallel-test-runner *features*)) + (run-time-start (get-internal-run-time))) + (pure-runner (list (concatenate 'string file ".lisp")) + (if (search "-cload" file) 'cload-test 'load-test) + (make-broadcast-stream)) + (output-metrics sb-c::*compile-file-elapsed-time* + sb-c::*compile-elapsed-time* + *gc-run-time* + (- (get-internal-run-time) run-time-start) + file + (if (unexpected-failures) :fail :pass) + metricsfile) + (exit :code (if (unexpected-failures) 1 104)))) + (format t "~A: pid ~d~@[ (trial ~d)~]~%" (car file) pid (cdr file)) + (incf subprocess-count) + (push (list pid file (get-internal-real-time)) subprocess-list))) + (loop (if (plusp subprocess-count) (wait) (return))) + (format t "~&Total realtime: ~,,-6f sec~%" (elapsed-time-from start-time)) + (sb-unix:unix-close metricsfile) + (sort-metrics metricsfilename) + (when losing + (format t "~&Failing files:~%") + (dolist (filename losing) + (format t "~A~%" filename)) + (format t "==== Logs are in ~A ====~%" *logdir*) + (exit :code 1))))) + +(parallel-execute-tests + (mapcar #'list + (choose-order + (mapcar #'pathname-name + (append (pure-load-files) + (pure-cload-files) + (impure-load-files) + (impure-cload-files)))))) diff --git a/tests/benchmark.sh b/tests/benchmark.sh new file mode 100755 index 0000000000..ea7af9f68b --- /dev/null +++ b/tests/benchmark.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# This is copy-and-pasted from parallel-exec, removing: +# - use of SB-APROF, SB-SPROF +# - vop usage counts, GC stop-the-world timing +# - shell tests +# - anything else extraneous to running the tests. +# Obviously it would be better if some of this +# logic could be shared, especially the +# CHOOSE-ORDER function. + +if [ $# -ne 1 ] +then + echo $0: Need arg + exit 1 +fi + +logdir=${SBCL_PAREXEC_TMP:-$HOME}/sbcl-test-logs-$$ +echo ==== Writing logs to $logdir ==== +junkdir=${SBCL_PAREXEC_TMP:-/tmp}/junk +mkdir -p $junkdir $logdir + +case `uname` in + CYGWIN* | WindowsNT | MINGW* | MSYS*) + echo ";; Using -j$1" + echo "LOGDIR=$logdir" >$logdir/Makefile + ../run-sbcl.sh --script genmakefile.lisp >>$logdir/Makefile + exec $GNUMAKE -k -j $1 -f $logdir/Makefile + ;; +esac + +export TEST_DIRECTORY SBCL_HOME +TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ + --noinform --core ../output/sbcl.core \ + --no-userinit --no-sysinit --noprint --disable-debugger $logdir $* \ + < benchmark.lisp diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 7fbfe2c126..d28dbd2d35 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -83,7 +83,8 @@ ("sb-graph.impure.lisp" "contrib/sb-graph.fasl" "contrib/uiop.fasl") ("signals.impure.lisp" "contrib/sb-posix.fasl") ("stream.impure.lisp" "contrib/sb-posix.fasl") - ("sprof.impure.lisp" "../contrib/sb-sprof/test.lisp" "../contrib/sb-sprof/graph.lisp") + ("sprof.impure.lisp" "contrib/sb-sprof.fasl" + "../contrib/sb-sprof/test.lisp" "../contrib/sb-sprof/graph.lisp") ("threads.impure.lisp" "tests/alloca.so" "tests/threads-foreign.so") diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index afd4970bea..2b19c5bf7c 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -196,6 +196,8 @@ (flet ((maybe (p s) (and (find-package p) (find-symbol s p)))) `(sb-c::*code-serialno* + sb-c::*compile-elapsed-time* + sb-c::*compile-file-elapsed-time* sb-impl::*package-names-cookie* sb-impl::*available-buffers* sb-impl::*token-buf-pool* @@ -470,10 +472,6 @@ sb-kernel::%compiler-defclass)) (sb-int:unencapsulate symbol 'defblah-guard))))) (makunbound '*allowed-inputs*) - ;; fullcgc doesn't get tested much - ;; (and we usually only find problems when save-lisp-and-die fails) - ;; so just run it once now. - (gc :gen 7) ;; after all the files are done (append-failures))) From 938320b20997f2b32217c17cabab8648f764ec1b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 16:23:47 -0400 Subject: [PATCH 3477/4023] Remove need_zerofill bit from page table It suffices to indicate in the first word of each free page whether it ever held data before. After zeroing the page there is no other bit to affect, since zeroing clears the logical "need_zerofill" flag. This change was made possible by git rev 20b48b83aeff. --- contrib/sb-introspect/introspect.lisp | 4 +--- src/code/room.lisp | 12 ++++------ src/runtime/fullcgc.c | 2 +- src/runtime/gencgc-internal.h | 14 +++++------ src/runtime/gencgc-private.h | 6 ++--- src/runtime/gencgc.c | 34 +++++++-------------------- src/runtime/private-cons.inc | 2 +- tests/allocator.pure.lisp | 3 +-- tests/debug.pure.lisp | 5 ++-- tests/gc-testlib.c | 1 - tests/private-cons.impure.lisp | 4 ++-- 11 files changed, 31 insertions(+), 56 deletions(-) diff --git a/contrib/sb-introspect/introspect.lisp b/contrib/sb-introspect/introspect.lisp index 3bbffc3465..565acd1dd8 100644 --- a/contrib/sb-introspect/introspect.lisp +++ b/contrib/sb-introspect/introspect.lisp @@ -829,9 +829,7 @@ Experimental: interface subject to change." (let* ((wp (page-protected-p object)) (index (sb-vm:find-page-index (get-lisp-obj-address object))) - (flags (sb-alien:slot page 'sb-vm::flags)) - (type #+little-endian (ldb (byte 6 0) flags) - #+big-endian (ldb (byte 6 2) flags))) + (type (sb-alien:slot page 'sb-vm::flags))) (list :space space :generation (sb-alien:slot page 'sb-vm::gen) :write-protected wp diff --git a/src/code/room.lisp b/src/code/room.lisp index 8059ec4aec..6405030893 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -405,10 +405,7 @@ We could try a few things to mitigate this: end-page-bytes-used) most-positive-word))))) (when (sap> end start) - ;; The bits in the 6-bit 'type' field have fixed positions, - ;; but the position of the field itself depends on endianness. - (let ((flags (ldb (byte 6 (+ #+big-endian 2)) - (slot (deref page-table start-page) 'flags)))) + (let ((flags (slot (deref page-table start-page) 'flags))) ;; The GEN slot is declared as (SIGNED 8) which does not satisfy the ;; type restriction on the first argument to LOGBITP. ;; Masking it to 3 bits fixes that, and allows using the other 5 bits @@ -1157,8 +1154,8 @@ We could try a few things to mitigate this: (setq page-num next-page seen-filler nil)))))))) (let ((i 0)) (loop while (< i total-pages) - do (let ((type (ldb (byte 2 0) (slot (deref page-table i) 'flags)))) - (if (= type 3) + do (let ((type (slot (deref page-table i) 'flags))) + (if (= (logand type 7) 7) (setq i (dump-page i)) (incf i))))) (let* ((n-pages (count 1 pages)) @@ -1227,8 +1224,7 @@ We could try a few things to mitigate this: ;; gen0 conses on MIXED pages, but even that is not enough- pinned conses ;; will promote but keep their MIXED page type. So don't bother with this. #+use-cons-region - (let* ((flags (slot (deref page-table (find-page-index obj-addr)) 'flags)) - (type (ldb (byte 6 (+ #+big-endian 2)) flags)) + (let* ((type (slot (deref page-table (find-page-index obj-addr)) 'flags)) (ok (if (consp obj) (or (= type #b101) ; PAGE_TYPE_CONS (and (eq (car obj) 0) (eq (cdr obj) 0))) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 0622118a9e..3d2ba96b87 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -711,7 +711,7 @@ void execute_full_sweep_phase() for (page = free_page; page < page_table_pages; ++page) { gc_assert((page_table[page].type & PAGE_TYPE_MASK) == PAGE_TYPE_UNBOXED); gc_assert(!page_bytes_used(page)); - set_page_need_to_zero(page, 1); + set_page_needs_zerofill(page); page_table[page].type = FREE_PAGE_FLAG; } } diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 63fa955146..fd192809e8 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -30,7 +30,12 @@ #endif #define GENCGC_PAGE_WORDS (GENCGC_PAGE_BYTES/N_WORD_BYTES) -extern char *page_address(page_index_t); + +/* Calculate the start address for the given page number. */ +static inline char *page_address(page_index_t page_num) { + return (void*)(DYNAMIC_SPACE_START + (page_num * GENCGC_PAGE_BYTES)); +} + int gencgc_handle_wp_violation(void *); @@ -121,7 +126,6 @@ struct page { // !!! If bit positions are changed, be sure to reflect the changes into // page_extensible_p() as well as ALLOCATION-INFORMATION in sb-introspect // and WALK-DYNAMIC-SPACE. - unsigned char /* * The 4 low bits of 'type' are defined by PAGE_TYPE_x constants. * 0000 free @@ -130,11 +134,7 @@ struct page { * ?011 mixed boxed/unboxed non-code objects * ?111 code * The next two bits are SINGLE_OBJECT and OPEN_REGION */ - type :6, - /* Whether the page was used at all. This is the only bit that can - * be 1 on a free page */ - need_zerofill :1, - dontuse :1; + unsigned char type; /* the generation that this page belongs to. This should be valid * for all pages that may have objects allocated, even current diff --git a/src/runtime/gencgc-private.h b/src/runtime/gencgc-private.h index 41e1e5297d..e3e0f4d523 100644 --- a/src/runtime/gencgc-private.h +++ b/src/runtime/gencgc-private.h @@ -18,12 +18,12 @@ typedef unsigned int page_bytes_t; #define page_words_used(index) page_table[index].words_used_ #define page_bytes_used(index) ((page_bytes_t)page_table[index].words_used_<<WORD_SHIFT) #if defined LISP_FEATURE_RISCV && defined LISP_FEATURE_LINUX // KLUDGE -#define page_need_to_zero(index) (mmap_does_not_zero || page_table[index].need_zerofill) +#define page_need_to_zero(index) (mmap_does_not_zero || (*(uword_t*)page_address(index) != 0)) #else -#define page_need_to_zero(index) page_table[index].need_zerofill +#define page_need_to_zero(index) (*(uword_t*)page_address(index) != 0) #endif #define set_page_bytes_used(index,val) page_table[index].words_used_ = ((val)>>WORD_SHIFT) -#define set_page_need_to_zero(index,val) page_table[index].need_zerofill = val +#define set_page_needs_zerofill(index) *(uword_t*)page_address(index) = 0xBADBAD #if !CONDENSED_PAGE_TABLE diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 96d4cb497c..510a508b04 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -193,12 +193,6 @@ static inline boolean protect_page_p(page_index_t page, generation_index_t gener } #endif -/* Calculate the start address for the given page number. */ -inline char *page_address(page_index_t page_num) -{ - return (void*)(DYNAMIC_SPACE_START + (page_num * GENCGC_PAGE_BYTES)); -} - /* Calculate the address where the allocation region associated with * the page starts. */ static inline void * @@ -262,12 +256,10 @@ page_index_t contiguous_block_final_page(page_index_t first) { /* We maintain the invariant that pages with FREE_PAGE_FLAG have * scan_start of zero, to optimize page_ends_contiguous_block_p(). - * Clear all the flags that don't pertain to a free page. - * Particularly the 'need_zerofill' bit MUST remain as-is */ + * Clear all the flags that don't pertain to a free page. */ static inline void reset_page_flags(page_index_t page) { page_table[page].scan_start_offset_ = 0; page_table[page].type = 0; - page_table[page].dontuse = 0; gc_page_pins[page] = 0; // Why can't the 'gen' get cleared? It caused failures. THIS MAKES NO SENSE!!! // page_table[page].gen = 0; @@ -778,7 +770,7 @@ void zeroize_pages_if_needed(page_index_t start, page_index_t end, int page_type for (i = start; i <= end; i++) any_need_to_zero |= page_need_to_zero(i); if (any_need_to_zero) { zero_pages(start, end); - for (i = start; i <= end; i++) set_page_need_to_zero(i, 0); + // Zeroing the page clears the need-to-zerofill status implicitly } #else boolean usable_by_lisp = @@ -788,7 +780,7 @@ void zeroize_pages_if_needed(page_index_t start, page_index_t end, int page_type for (i = start; i <= end; i++) if (page_need_to_zero(i)) { zero_pages(i, i); - set_page_need_to_zero(i, 0); + // Zeroing the page clears the need-to-zerofill status implicitly } } #endif @@ -939,18 +931,11 @@ page_extensible_p(page_index_t index, generation_index_t gen, int type) { && page_table[index].gen == gen && !gc_page_pins[index]; #else - /* Test the three conditions above as a single comparison. - * - * pin -\ - * v vvvvvv -- type - * #b11111111_10111111 - * ^ - * need_zerofill (ignored) - * - * The flags reside at 1 byte prior to 'gen' in the page structure. + /* Test 'gen' and 'type' as one comparison. + * The type is at 1 byte prior to 'gen' in the page structure. */ int attributes_match = - (*(int16_t*)(&page_table[index].gen-1) & 0xFFBF) == ((gen<<8)|type); + *(int16_t*)(&page_table[index].gen-1) == ((gen<<8)|type); #endif #ifdef LISP_FEATURE_SOFT_CARD_MARKS return attributes_match && page_cards_all_marked_nonsticky(index); @@ -1753,7 +1738,7 @@ static uword_t adjust_obj_ptes(page_index_t first_page, #endif /* It checks out OK, free the page. */ prev_bytes_used = page_bytes_used(page); - set_page_need_to_zero(page, 1); + set_page_needs_zerofill(page); set_page_bytes_used(page, 0); reset_page_flags(page); bytes_freed += prev_bytes_used; @@ -3403,7 +3388,7 @@ static void free_oldspace(void) gc_dcheck(page_cards_all_marked_nonsticky(last_page)); /* Free the page. */ int used = page_words_used(page); - if (used) set_page_need_to_zero(page, 1); + if (used) set_page_needs_zerofill(page); set_page_bytes_used(page, 0); reset_page_flags(page); bytes_freed += used << WORD_SHIFT; @@ -4401,8 +4386,7 @@ remap_page_range (page_index_t from, page_index_t to) zero_pages(from, to); } #endif - page_index_t i; - for (i = from; i <= to; i++) set_page_need_to_zero(i, 0); + // Zeroing the range clears the need-to-zerofill status implicitly } static void diff --git a/src/runtime/private-cons.inc b/src/runtime/private-cons.inc index 2d15bc22e0..4f748c9ae0 100644 --- a/src/runtime/private-cons.inc +++ b/src/runtime/private-cons.inc @@ -114,7 +114,7 @@ static void release_pages_impl() if (PRIVATE_CONS_DEBUG) fprintf(stderr, "Freeing GC-private page @ %p (index %ld)\n", list, (long)index); - set_page_need_to_zero(index, 1); + set_page_needs_zerofill(index); set_page_bytes_used(index, 0); reset_page_flags(index); } diff --git a/tests/allocator.pure.lisp b/tests/allocator.pure.lisp index a891719d27..5afa5fb954 100644 --- a/tests/allocator.pure.lisp +++ b/tests/allocator.pure.lisp @@ -8,8 +8,7 @@ (sb-vm:find-page-index (sb-kernel:get-lisp-obj-address x))) 'sb-vm::flags)))) - (logbitp 4 ; SINGLE_OBJECT_FLAG - (ldb (byte 6 (+ #+big-endian 2)) flags))))) + (logbitp 4 flags)))) ; SINGLE_OBJECT_FLAG (compile 'on-large-page-p) ;;; Pseudo-static large objects should retain the single-object flag diff --git a/tests/debug.pure.lisp b/tests/debug.pure.lisp index 1f8db58cb3..9d20bfdaeb 100644 --- a/tests/debug.pure.lisp +++ b/tests/debug.pure.lisp @@ -41,9 +41,8 @@ (declare (ignore widetag)) (let* ((index (sb-vm::find-page-index (sb-kernel:get-lisp-obj-address obj))) - (type (ldb (byte 6 (+ #+big-endian 2)) - (sb-alien:slot (sb-alien:deref sb-vm::page-table index) - 'sb-vm::flags)))) + (type (sb-alien:slot (sb-alien:deref sb-vm::page-table index) + 'sb-vm::flags))) ;; mask off the SINGLE_OBJECT and OPEN_REGION bits (when (and (eq (logand type 7) 2) ; PAGE_TYPE_BOXED ;; Cons cells on boxed pags are page filler diff --git a/tests/gc-testlib.c b/tests/gc-testlib.c index b43f953354..a24984cce6 100644 --- a/tests/gc-testlib.c +++ b/tests/gc-testlib.c @@ -24,7 +24,6 @@ static void make_instances(int page_type, generation_index_t gen, lispobj result page_table[page].gen = 1; gc_assert(page_table[page].scan_start_offset_ == 0); page_table[page].words_used_ = (2 * GENCGC_CARD_BYTES) >> WORD_SHIFT; - page_table[page].need_zerofill = 1; bytes_allocated += 2 * GENCGC_CARD_BYTES; generations[gen].bytes_allocated += 2 * GENCGC_CARD_BYTES; diff --git a/tests/private-cons.impure.lisp b/tests/private-cons.impure.lisp index ea48445d31..9f3e365604 100644 --- a/tests/private-cons.impure.lisp +++ b/tests/private-cons.impure.lisp @@ -34,8 +34,8 @@ #+gencgc (progn (defun page-need-to-zero (index) - (logbitp #+little-endian 6 #+big-endian 1 - (slot (deref sb-vm::page-table index) 'sb-vm::flags))) + (let ((addr (+ sb-vm:dynamic-space-start (* index sb-vm:gencgc-page-bytes)))) + (/= 0 (sb-sys:sap-ref-word (sb-sys:int-sap addr) 0)))) (defun test-private-consing () (let ((conses-per-page ; subtract one for the page header cons (1- (/ sb-vm:gencgc-page-bytes (* 2 sb-vm:n-word-bytes)))) From 765b089d43c6f6edc485c518a25c7f6a8fa5309e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 17:25:42 -0400 Subject: [PATCH 3478/4023] Provide more info in mmap failure message --- src/runtime/linux-mman.c | 6 +++++- src/runtime/os-common.c | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/runtime/linux-mman.c b/src/runtime/linux-mman.c index 2ca8e93c73..05481bdbad 100644 --- a/src/runtime/linux-mman.c +++ b/src/runtime/linux-mman.c @@ -24,7 +24,11 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, #endif actual = sbcl_mmap(addr, len, protection, flags, -1, 0); if (actual == MAP_FAILED) { - perror("mmap"); + if (errno == ENOMEM) + fprintf(stderr, "os_validate(%d,%p,%lx) failed with ENOMEM\n", + attributes, addr, len); + else + perror("mmap"); return 0; /* caller should check this */ } diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 34ede0769e..789bc4b553 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -289,7 +289,10 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm MAP_PRIVATE | (addr ? MAP_FIXED : 0), fd, (off_t) offset); if (actual == MAP_FAILED) { - perror("mmap"); + if (errno == ENOMEM) + fprintf(stderr, "load_core_bytes: mmap(%p,%lx,...) failed with ENOMEM\n", addr, len); + else + perror("mmap"); fail = 1; } else if (addr && (addr != actual)) { fail = 1; From 050e84e26565942e596ebe666649569f7c11ff90 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 7 Jun 2022 17:45:41 -0400 Subject: [PATCH 3479/4023] Add missing constant --- .../backends/sparc/stuff-groveled-from-headers.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/crossbuild-runner/backends/sparc/stuff-groveled-from-headers.lisp b/crossbuild-runner/backends/sparc/stuff-groveled-from-headers.lisp index 21895c9885..4d96c2e81e 100644 --- a/crossbuild-runner/backends/sparc/stuff-groveled-from-headers.lisp +++ b/crossbuild-runner/backends/sparc/stuff-groveled-from-headers.lisp @@ -134,6 +134,7 @@ (defconstant clock-process-cputime-id 2) ; #x2 (defconstant clock-monotonic-coarse 6) ; #x6 +(defconstant clock-thread-cputime-id 3) ; #x3 ;;; structures (define-alien-type nil From 0e675ee740df8774e0b21b3350cf0bf31c73d16b Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Tue, 7 Jun 2022 15:48:22 -0700 Subject: [PATCH 3480/4023] Use zstd for core compression instead of zlib. It is much faster, and compression level 1 with zstd (whose max level goes up to 22) produces smaller cores than compression level 9 with zlib. The default value of 9 for zstd compression level was chosen because it compresses a fresh warm core better than the old zlib default of 1 while doing it faster. --- NEWS | 1 + src/code/save.lisp | 10 +-- src/cold/base-target-features.lisp-expr | 4 +- src/runtime/Config.arm-android | 2 +- src/runtime/Config.arm-bsd | 2 +- src/runtime/Config.arm-linux | 2 +- src/runtime/Config.arm64-bsd | 2 +- src/runtime/Config.arm64-darwin | 2 +- src/runtime/Config.arm64-linux | 2 +- src/runtime/Config.mips-linux | 2 +- src/runtime/Config.ppc-linux | 2 +- src/runtime/Config.ppc-netbsd | 2 +- src/runtime/Config.ppc-openbsd | 2 +- src/runtime/Config.ppc64-linux | 2 +- src/runtime/Config.riscv-linux | 2 +- src/runtime/Config.sparc-linux | 2 +- src/runtime/Config.sparc-netbsd | 2 +- src/runtime/Config.sparc-sunos | 2 +- src/runtime/Config.x86-64-bsd | 2 +- src/runtime/Config.x86-64-darwin | 2 +- src/runtime/Config.x86-64-linux | 2 +- src/runtime/Config.x86-64-sunos | 2 +- src/runtime/Config.x86-64-win32 | 2 +- src/runtime/Config.x86-bsd | 2 +- src/runtime/Config.x86-darwin | 2 +- src/runtime/Config.x86-linux | 2 +- src/runtime/Config.x86-sunos | 2 +- src/runtime/Config.x86-win32 | 2 +- src/runtime/coreparse.c | 91 ++++++++++--------------- src/runtime/save.c | 62 ++++++++++------- tests/elfcore.test.sh | 2 +- tests/heap-reloc/build-test-sbcl | 2 +- 32 files changed, 106 insertions(+), 116 deletions(-) diff --git a/NEWS b/NEWS index 3cd79b3006..3ecb1b85ce 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.2.5: + * enhancement: core compression now uses zstd instead of zlib. * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. diff --git a/src/code/save.lisp b/src/code/save.lisp index 9652f719ed..b4060e8bfd 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -166,8 +166,8 @@ The following &KEY arguments are defined: This is only meaningful if the runtime was built with the :SB-CORE-COMPRESSION feature enabled. If NIL (the default), saves to uncompressed core files. If :SB-CORE-COMPRESSION was enabled at build-time, the argument may also be - an integer from -1 to 9, corresponding to zlib compression levels, or T - (which is equivalent to the default compression level, -1). + an integer from -7 to 22, corresponding to zstd compression levels, or T + (which is equivalent to the default compression level, 9). :APPLICATION-TYPE Present only on Windows and is meaningful only with :EXECUTABLE T. @@ -214,10 +214,10 @@ sufficiently motivated to do lengthy fixes." (let ((toplevel (%coerce-callable-to-fun toplevel)) *streams-closed-by-slad*) #+sb-core-compression - (check-type compression (or boolean (integer -1 9))) + (check-type compression (or boolean (integer -7 22))) #-sb-core-compression (when compression - (error "Unable to save compressed core: this runtime was not built with zlib support")) + (error "Unable to save compressed core: this runtime was not built with zstd support")) (when *dribble-stream* (restart-case (error "Dribbling to ~s is enabled." (pathname *dribble-stream*)) (continue () @@ -227,7 +227,7 @@ sufficiently motivated to do lengthy fixes." :report "Abort saving the core." (return-from save-lisp-and-die)))) (when (eql t compression) - (setf compression -1)) + (setf compression 9)) (flet ((foreign-bool (value) (if value 1 0))) (let ((name (native-namestring (physicalize-pathname core-file-name) diff --git a/src/cold/base-target-features.lisp-expr b/src/cold/base-target-features.lisp-expr index a753f3c3fe..2fab7ac39c 100644 --- a/src/cold/base-target-features.lisp-expr +++ b/src/cold/base-target-features.lisp-expr @@ -277,9 +277,9 @@ ;; foreign code that uses a 32-bit off_t. ; :largefile - ;; SBCL has optional support for zlib-based compressed core files. Enable + ;; SBCL has optional support for zstd-based compressed core files. Enable ;; this feature to compile it in. Obviously, doing so adds a dependency - ;; on zlib. + ;; on zstd. ; :sb-core-compression ;; On certain thread-enabled platforms, synchronization between threads diff --git a/src/runtime/Config.arm-android b/src/runtime/Config.arm-android index 3cdacae0a7..c532cb1420 100644 --- a/src/runtime/Config.arm-android +++ b/src/runtime/Config.arm-android @@ -27,7 +27,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef LISP_FEATURE_LARGEFILE CFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 diff --git a/src/runtime/Config.arm-bsd b/src/runtime/Config.arm-bsd index 8469bd788e..34fdc6ecdb 100644 --- a/src/runtime/Config.arm-bsd +++ b/src/runtime/Config.arm-bsd @@ -18,5 +18,5 @@ ifdef LISP_FEATURE_GENCGC GC_SRC = fullcgc.c gencgc.c traceroot.c endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif diff --git a/src/runtime/Config.arm-linux b/src/runtime/Config.arm-linux index 01ac685c63..df4e18bf67 100644 --- a/src/runtime/Config.arm-linux +++ b/src/runtime/Config.arm-linux @@ -25,7 +25,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef LISP_FEATURE_LARGEFILE CFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 diff --git a/src/runtime/Config.arm64-bsd b/src/runtime/Config.arm64-bsd index 01f27a184d..6cbcd344bf 100644 --- a/src/runtime/Config.arm64-bsd +++ b/src/runtime/Config.arm64-bsd @@ -18,5 +18,5 @@ ifdef LISP_FEATURE_GENCGC GC_SRC = fullcgc.c gencgc.c traceroot.c endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif diff --git a/src/runtime/Config.arm64-darwin b/src/runtime/Config.arm64-darwin index c5cccac5ae..3e07234f89 100644 --- a/src/runtime/Config.arm64-darwin +++ b/src/runtime/Config.arm64-darwin @@ -22,7 +22,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME LIBSBCL = libsbcl.a diff --git a/src/runtime/Config.arm64-linux b/src/runtime/Config.arm64-linux index ff709f334a..601626e0d3 100644 --- a/src/runtime/Config.arm64-linux +++ b/src/runtime/Config.arm64-linux @@ -23,7 +23,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif CFLAGS += -std=gnu99 ifdef LISP_FEATURE_LARGEFILE diff --git a/src/runtime/Config.mips-linux b/src/runtime/Config.mips-linux index 50e44677b1..5eb04d0582 100644 --- a/src/runtime/Config.mips-linux +++ b/src/runtime/Config.mips-linux @@ -25,7 +25,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif GC_SRC = gencgc.c fullcgc.c traceroot.c diff --git a/src/runtime/Config.ppc-linux b/src/runtime/Config.ppc-linux index c99c289d7d..00b35dd572 100644 --- a/src/runtime/Config.ppc-linux +++ b/src/runtime/Config.ppc-linux @@ -24,5 +24,5 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif diff --git a/src/runtime/Config.ppc-netbsd b/src/runtime/Config.ppc-netbsd index 6138779115..524c7f2931 100644 --- a/src/runtime/Config.ppc-netbsd +++ b/src/runtime/Config.ppc-netbsd @@ -18,7 +18,7 @@ ARCH_SRC = ppc-arch.c OS_SRC = bsd-os.c ppc-bsd-os.c OS_LIBS = # -ldl ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif GC_SRC = fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/Config.ppc-openbsd b/src/runtime/Config.ppc-openbsd index 568af96c04..7839badf6d 100644 --- a/src/runtime/Config.ppc-openbsd +++ b/src/runtime/Config.ppc-openbsd @@ -19,7 +19,7 @@ ARCH_SRC = ppc-arch.c OS_SRC = bsd-os.c ppc-bsd-os.c ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif GC_SRC = fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/Config.ppc64-linux b/src/runtime/Config.ppc64-linux index 9d856d64fd..8f68d26156 100644 --- a/src/runtime/Config.ppc64-linux +++ b/src/runtime/Config.ppc64-linux @@ -26,5 +26,5 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif diff --git a/src/runtime/Config.riscv-linux b/src/runtime/Config.riscv-linux index 81e2f434a2..d8b33d1d18 100644 --- a/src/runtime/Config.riscv-linux +++ b/src/runtime/Config.riscv-linux @@ -17,7 +17,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif LINKFLAGS += -Wl,--export-dynamic DISABLE_PIE=no diff --git a/src/runtime/Config.sparc-linux b/src/runtime/Config.sparc-linux index 65ab25bfb6..132b29a70a 100644 --- a/src/runtime/Config.sparc-linux +++ b/src/runtime/Config.sparc-linux @@ -19,7 +19,7 @@ ARCH_SRC = sparc-arch.c OS_SRC = linux-os.c linux-mman.c sparc-linux-os.c OS_LIBS = -ldl ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif GC_SRC = fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/Config.sparc-netbsd b/src/runtime/Config.sparc-netbsd index 86af69ba56..b0ae9ad56d 100644 --- a/src/runtime/Config.sparc-netbsd +++ b/src/runtime/Config.sparc-netbsd @@ -19,7 +19,7 @@ ARCH_SRC = sparc-arch.c OS_SRC = bsd-os.c sparc-bsd-os.c OS_LIBS = # -ldl ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif GC_SRC = fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/Config.sparc-sunos b/src/runtime/Config.sparc-sunos index ca1154ae8a..7e77198a28 100644 --- a/src/runtime/Config.sparc-sunos +++ b/src/runtime/Config.sparc-sunos @@ -24,7 +24,7 @@ ARCH_SRC = sparc-arch.c OS_SRC = sunos-os.c sparc-sunos-os.c OS_LIBS = -ldl -lsocket -lnsl -lrt ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif GC_SRC = fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/Config.x86-64-bsd b/src/runtime/Config.x86-64-bsd index 299898b154..c2d3b07c8e 100644 --- a/src/runtime/Config.x86-64-bsd +++ b/src/runtime/Config.x86-64-bsd @@ -16,7 +16,7 @@ ARCH_SRC = x86-64-arch.c OS_SRC = bsd-os.c x86-64-bsd-os.c OS_LIBS = # -ldl ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef HAVE_LIBUNWIND OS_LIBS += -lunwind diff --git a/src/runtime/Config.x86-64-darwin b/src/runtime/Config.x86-64-darwin index d392af6fc3..2d9e7a6692 100644 --- a/src/runtime/Config.x86-64-darwin +++ b/src/runtime/Config.x86-64-darwin @@ -29,7 +29,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME LIBSBCL = libsbcl.a diff --git a/src/runtime/Config.x86-64-linux b/src/runtime/Config.x86-64-linux index 4aecff4bf4..230c5ac798 100644 --- a/src/runtime/Config.x86-64-linux +++ b/src/runtime/Config.x86-64-linux @@ -37,7 +37,7 @@ ifdef LISP_FEATURE_SB_THREAD endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef HAVE_LIBUNWIND diff --git a/src/runtime/Config.x86-64-sunos b/src/runtime/Config.x86-64-sunos index b8edccb658..174a4a3fcc 100644 --- a/src/runtime/Config.x86-64-sunos +++ b/src/runtime/Config.x86-64-sunos @@ -14,7 +14,7 @@ ARCH_SRC = x86-64-arch.c OS_SRC = sunos-os.c x86-64-sunos-os.c OS_LIBS= -ldl -lsocket -lnsl -lrt ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef LISP_FEATURE_IMMOBILE_SPACE diff --git a/src/runtime/Config.x86-64-win32 b/src/runtime/Config.x86-64-win32 index 3f8e1bfb83..b758a14bde 100644 --- a/src/runtime/Config.x86-64-win32 +++ b/src/runtime/Config.x86-64-win32 @@ -38,7 +38,7 @@ __LDFLAGS__ = OS_LIBS = -l ws2_32 -ladvapi32 ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef LISP_FEATURE_SB_FUTEX OS_LIBS += -lSynchronization diff --git a/src/runtime/Config.x86-bsd b/src/runtime/Config.x86-bsd index 0370924fe3..8887943cb6 100644 --- a/src/runtime/Config.x86-bsd +++ b/src/runtime/Config.x86-bsd @@ -18,7 +18,7 @@ LINKFLAGS += -Wl,--export-dynamic OS_SRC = bsd-os.c x86-bsd-os.c OS_LIBS = # -ldl ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif GC_SRC = fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/Config.x86-darwin b/src/runtime/Config.x86-darwin index 90d8484637..7978c53fc4 100644 --- a/src/runtime/Config.x86-darwin +++ b/src/runtime/Config.x86-darwin @@ -32,7 +32,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME LIBSBCL = libsbcl.a diff --git a/src/runtime/Config.x86-linux b/src/runtime/Config.x86-linux index bb50d7645d..b5f1355c01 100644 --- a/src/runtime/Config.x86-linux +++ b/src/runtime/Config.x86-linux @@ -39,7 +39,7 @@ ifdef LISP_FEATURE_SB_THREAD OS_LIBS += -lpthread endif ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef HAVE_LIBUNWIND OS_LIBS += -lunwind diff --git a/src/runtime/Config.x86-sunos b/src/runtime/Config.x86-sunos index db27bf69b7..33c963e76d 100644 --- a/src/runtime/Config.x86-sunos +++ b/src/runtime/Config.x86-sunos @@ -20,7 +20,7 @@ OS_SRC = sunos-os.c x86-sunos-os.c OS_LIBS= -ldl -lsocket -lnsl -lrt ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif GC_SRC= fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/Config.x86-win32 b/src/runtime/Config.x86-win32 index 251767e01d..806971313b 100644 --- a/src/runtime/Config.x86-win32 +++ b/src/runtime/Config.x86-win32 @@ -40,7 +40,7 @@ __LDFLAGS__ = OS_LIBS = -l ws2_32 -ladvapi32 ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lz + OS_LIBS += -lzstd endif ifdef LISP_FEATURE_SB_FUTEX OS_LIBS += -lSynchronization diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 809040ec82..d7d6e0f6a7 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -45,7 +45,7 @@ #include <errno.h> #ifdef LISP_FEATURE_SB_CORE_COMPRESSION -# include <zlib.h> +# include <zstd.h> #endif /* build_id must match between the C code and .core file because a core @@ -169,74 +169,53 @@ search_for_embedded_core(char *filename, struct memsize_options *memsize_options #ifndef LISP_FEATURE_SB_CORE_COMPRESSION # define inflate_core_bytes(fd,offset,addr,len) \ - lose("This runtime was not built with zlib-compressed core support... aborting") + lose("This runtime was not built with zstd-compressed core support... aborting") #else -# define ZLIB_BUFFER_SIZE (1u<<16) static void inflate_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, int len) { - z_stream stream; - unsigned char* buf = successful_malloc(ZLIB_BUFFER_SIZE); - int ret; - # ifdef LISP_FEATURE_WIN32 - /* Ensure the memory is committed so zlib doesn't segfault trying to - inflate. */ + /* Ensure the memory is committed so zstd doesn't segfault trying + to inflate. */ os_commit_memory(addr, len); # endif - - if (-1 == lseek(fd, offset, SEEK_SET)) { + if (-1 == lseek(fd, offset, SEEK_SET)) lose("Unable to lseek() on corefile"); - } - stream.zalloc = NULL; - stream.zfree = NULL; - stream.opaque = NULL; - stream.avail_in = 0; - stream.next_in = buf; - - ret = inflateInit(&stream); - if (ret != Z_OK) - lose("zlib error %i", ret); - - stream.next_out = (void*)addr; - stream.avail_out = len; + int ret; + size_t buf_size = ZSTD_DStreamInSize(); + unsigned char* buf = successful_malloc(buf_size); + ZSTD_inBuffer input; + input.src = buf; + input.pos = 0; + + ZSTD_outBuffer output; + output.dst = (void*)addr; + output.size = len; + output.pos = 0; + + ZSTD_DStream *stream = ZSTD_createDStream(); + if (stream == NULL) + lose("unable to create zstd decompression context"); + ret = ZSTD_initDStream(stream); + if (ZSTD_isError(ret)) + lose("ZSTD_initDStream failed with error: %s", ZSTD_getErrorName(ret)); + + /* Read in exactly one frame. */ do { - ssize_t count = read(fd, buf, ZLIB_BUFFER_SIZE); + ssize_t count = read(fd, buf, buf_size); if (count < 0) lose("unable to read core file (errno = %i)", errno); - stream.next_in = buf; - stream.avail_in = count; - if (count == 0) break; - ret = inflate(&stream, Z_NO_FLUSH); - switch (ret) { - case Z_STREAM_END: - break; - case Z_OK: - if (stream.avail_out == 0) - lose("Runaway gzipped core directory... aborting"); - if (stream.avail_in > 0) - lose("zlib inflate returned without fully" - "using up input buffer... aborting"); - break; - default: - lose("zlib inflate error: %i", ret); - break; - } - } while (ret != Z_STREAM_END); - - if (stream.avail_out > 0) { - if (stream.avail_out >= os_vm_page_size) - fprintf(stderr, "Warning: gzipped core directory significantly" - "shorter than expected (%lu bytes)", (unsigned long)stream.avail_out); - /* Is this needed? */ - memset(stream.next_out, 0, stream.avail_out); - } - - inflateEnd(&stream); - free(buf); + input.size = count; + input.pos = 0; + ret = ZSTD_decompressStream(stream, &output, &input); + if (ZSTD_isError(ret)) + lose("ZSTD_decompressStream failed with error: %s", + ZSTD_getErrorName(ret)); + } while (ret != 0); + + ZSTD_freeDStream(stream); } -# undef ZLIB_BUFFER_SIZE #endif #define DYNAMIC_SPACE_ADJ_INDEX 0 diff --git a/src/runtime/save.c b/src/runtime/save.c index 27f603c101..520b1e0f7b 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -42,7 +42,7 @@ #include "search.h" #ifdef LISP_FEATURE_SB_CORE_COMPRESSION -# include <zlib.h> +# include <zstd.h> #endif #define GENERAL_WRITE_FAILURE_MSG "error writing to core file" @@ -91,31 +91,42 @@ write_bytes_to_file(FILE * file, char *addr, size_t bytes, int compression) } } #ifdef LISP_FEATURE_SB_CORE_COMPRESSION - } else if ((compression >= -1) && (compression <= 9)) { -# define ZLIB_BUFFER_SIZE (1u<<16) - z_stream stream; - unsigned char* buf = successful_malloc(ZLIB_BUFFER_SIZE); + } else if ((compression >= -7) && (compression <= 22)) { + int ret; + ZSTD_inBuffer input; + input.src = addr; + input.size = bytes; + input.pos = 0; + + size_t buf_size = ZSTD_CStreamOutSize(); + unsigned char* buf = successful_malloc(buf_size); + ZSTD_outBuffer output; + output.dst = buf; + output.size = buf_size; + unsigned char * written, * end; long total_written = 0; - int ret; - stream.zalloc = NULL; - stream.zfree = NULL; - stream.opaque = NULL; - stream.avail_in = bytes; - stream.next_in = (void*)addr; - ret = deflateInit(&stream, compression); - if (ret != Z_OK) - lose("deflateInit: %i", ret); + ZSTD_CStream *stream = ZSTD_createCStream(); + if (stream == NULL) + lose("failed to create zstd compression context"); + ret = ZSTD_initCStream(stream, compression); + if (ZSTD_isError(ret)) + lose("ZSTD_initCStream failed with error: %s", + ZSTD_getErrorName(ret)); do { - stream.avail_out = ZLIB_BUFFER_SIZE; - stream.next_out = buf; - ret = deflate(&stream, Z_FINISH); - if (ret < 0) lose("zlib deflate error: %i... exiting", ret); + output.pos = 0; + if (input.pos < bytes) + ret = ZSTD_compressStream(stream, &output, &input); + else + ret = ZSTD_endStream(stream, &output); + if (ZSTD_isError(ret)) + lose("ZSTD_compressStream2 failed with error: %s", + ZSTD_getErrorName(ret)); written = buf; - end = buf+ZLIB_BUFFER_SIZE-stream.avail_out; - total_written += end - written; + end = buf + output.pos; + total_written += output.pos; while (written < end) { - long count = fwrite(written, 1, end-written, file); + long count = fwrite(written, 1, output.pos, file); if (count > 0) { written += count; } else { @@ -123,18 +134,17 @@ write_bytes_to_file(FILE * file, char *addr, size_t bytes, int compression) lose("core file is incomplete or corrupt"); } } - } while (stream.avail_out == 0); - deflateEnd(&stream); - free(buf); + } while (ret != 0); printf("compressed %lu bytes into %lu at level %i\n", bytes, total_written, compression); -# undef ZLIB_BUFFER_SIZE + + ZSTD_freeCStream(stream); #endif } else { #ifdef LISP_FEATURE_SB_CORE_COMPRESSION lose("Unknown core compression level %i, exiting", compression); #else - lose("zlib-compressed core support not built in this runtime"); + lose("zstd-compressed core support not built in this runtime"); #endif } diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index eefdb4b697..6237c44603 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -86,7 +86,7 @@ run_sbcl <<EOF (save-lisp-and-die "${tmpcore}") EOF -m_arg=`run_sbcl --eval '(progn #+sb-core-compression (princ " -lz") #+x86 (princ " -m32"))' --quit` +m_arg=`run_sbcl --eval '(progn #+sb-core-compression (princ " -lzstd") #+x86 (princ " -m32"))' --quit` (cd $SBCL_PWD/../src/runtime ; rm -f libsbcl.a; make libsbcl.a) run_sbcl --script ../tools-for-build/editcore.lisp split \ diff --git a/tests/heap-reloc/build-test-sbcl b/tests/heap-reloc/build-test-sbcl index 599b82ba71..61e984abfa 100644 --- a/tests/heap-reloc/build-test-sbcl +++ b/tests/heap-reloc/build-test-sbcl @@ -2,7 +2,7 @@ lisp="../../run-sbcl.sh $SBCL_ARGS" m_arg=`$lisp --eval '(progn #+x86 (princ " -m32"))' --quit` -libs=`$lisp --eval '(progn #+sb-core-compression (princ " -lz"))' --quit` +libs=`$lisp --eval '(progn #+sb-core-compression (princ " -lzstd"))' --quit` # Insert CFLAGS in case they contain -fsanitize=memory, for example. # Specify that some symbols are undefined so that the complete From 171437b40ded41db86c095d056a26d36caea24de Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 8 Jun 2022 11:31:22 -0700 Subject: [PATCH 3481/4023] zlib => zstd in INSTALL. --- INSTALL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index fdb1e00dea..81225f8022 100644 --- a/INSTALL +++ b/INSTALL @@ -179,7 +179,7 @@ INSTALLING SBCL :SB-CORE-COMPRESSION (--with-sb-core-compression) - Adds zlib as a build-dependency, and makes SBCL able to save + Adds zstd as a build-dependency, and makes SBCL able to save compressed cores. Not enabled by default. :SB-XREF-FOR-INTERNALS (--with-sb-xref-for-internals) From 790a25fa494b45c714b5b6fb74750c91d81df4cb Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 8 Jun 2022 22:15:08 +0300 Subject: [PATCH 3482/4023] Optionally don't propagate constants to VOPs. Even when a constant is in a LET a constant VOP can be selected based on the type of the LVAR. --- src/compiler/ir1opt.lisp | 5 +++-- src/compiler/ltn.lisp | 8 +++++++- src/compiler/policies.lisp | 4 ++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 22b23b3958..08abb972fb 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -37,13 +37,14 @@ ;; check for EQL types and singleton numeric types (values (type-singleton-p type))))) -(defun constant-lvar-ignore-types-p (lvar) +(defun constant-lvar-ignore-types-p (lvar &optional (singleton-types t)) (declare (type lvar lvar)) (let ((use (principal-lvar-use lvar))) (or (and (ref-p use) (constant-p (ref-leaf use))) ;; check for EQL types and singleton numeric types - (values (type-singleton-p (lvar-type lvar)))))) + (and singleton-types + (values (type-singleton-p (lvar-type lvar))))))) ;;; Are all the uses constant? (defun constant-lvar-uses-p (lvar) diff --git a/src/compiler/ltn.lisp b/src/compiler/ltn.lisp index 4001272f2c..c2c0469580 100644 --- a/src/compiler/ltn.lisp +++ b/src/compiler/ltn.lisp @@ -556,7 +556,13 @@ (funcall (second type) value) (sb-xc:typep value type)))) (cond (lvar - (and (constant-lvar-p lvar) + (and (if (policy (let ((uses (lvar-uses lvar))) + (if (consp uses) + (car uses) + uses)) + (= preserve-constants 3)) + (constant-lvar-ignore-types-p lvar nil) + (constant-lvar-p lvar)) (type-p (lvar-value lvar) (cdr restr)))) (tn (and (eq (tn-kind tn) :constant) diff --git a/src/compiler/policies.lisp b/src/compiler/policies.lisp index 21e2d623ed..54945bf089 100644 --- a/src/compiler/policies.lisp +++ b/src/compiler/policies.lisp @@ -123,6 +123,10 @@ optimizations. When enabled, the variable is preserved and can be seen in the debugger.") +(define-optimization-quality preserve-constants + 0 + ("no" "no" "no" "yes")) + (define-optimization-quality insert-array-bounds-checks (if (= safety 0) 0 3) ("no" "yes" "yes" "yes")) From c0d834ab8f26eef4e08e391b9e555f9cb6dff5c4 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 8 Jun 2022 22:16:28 +0300 Subject: [PATCH 3483/4023] string-xcase: load the constant masks before the loop. Instead of on each iteration. Produces significant speed ups both on arm64 and x86-64. --- src/code/string.lisp | 52 ++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 550796b6e6..d35ac2df99 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -508,18 +508,23 @@ new string COUNT long filled with the fill character." ((and (zerop start) (not end) (simple-base-string-p string)) - (flet ((%case (bits) - (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) - (a (+ bits (* (- 128 (char-code ,a)) repeat))) - (z (+ bits (* (- 127 (char-code ,z)) repeat)))) - (logxor bits (ash (logand (logxor a z) - (* 128 repeat)) - -2))))) - (loop for i below (ceiling (length string) sb-vm:n-word-bytes) - do - (setf (%vector-raw-bits string i) - (%case (%vector-raw-bits string i)))) - string)) + (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) + (a-mask (* (- 128 (char-code ,a)) repeat)) + (z-mask (* (- 127 (char-code ,z)) repeat)) + (7-mask (* 128 repeat))) + (declare (optimize sb-c::preserve-single-use-debug-variables + sb-c::preserve-constants)) + (flet ((%case (bits) + (logxor bits (ash (logand (logxor (+ bits a-mask) + (+ bits z-mask)) + 7-mask) + -2)))) + (declare (inline %case)) + (loop for i below (ceiling (length string) sb-vm:n-word-bytes) + do + (setf (%vector-raw-bits string i) + (%case (%vector-raw-bits string i)))) + string))) (t (with-one-string (string start end) (declare (optimize (sb-c:insert-array-bounds-checks 0))) @@ -558,19 +563,24 @@ new string COUNT long filled with the fill character." ((and (eql start 0) (not end) (simple-base-string-p string)) - (flet ((%case (bits) - (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) - (a (+ bits (* (- 128 (char-code ,a)) repeat))) - (z (+ bits (* (- 127 (char-code ,z)) repeat)))) - (logxor bits (ash (logand (logxor a z) - (* 128 repeat)) - -2))))) - (let ((new (make-string length :element-type 'base-char))) + (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) + (a-mask (* (- 128 (char-code ,a)) repeat)) + (z-mask (* (- 127 (char-code ,z)) repeat)) + (7-mask (* 128 repeat))) + (declare (optimize sb-c::preserve-single-use-debug-variables + sb-c::preserve-constants)) + (flet ((%case (bits) + (logxor bits (ash (logand (logxor (+ bits a-mask) + (+ bits z-mask)) + 7-mask) + -2)))) + (declare (inline %case)) + (let ((new (make-string length :element-type 'base-char))) (loop for i below (ceiling (length string) sb-vm:n-word-bytes) do (setf (%vector-raw-bits new i) (%case (%vector-raw-bits string i)))) - new))) + new)))) (t (with-array-data ((string-data string :offset-var offset) (s-start start) From cc70ec8aec296ef0337a2a84bcffd8ce5c5f3f35 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 9 Jun 2022 00:50:43 +0300 Subject: [PATCH 3484/4023] Fix arm. --- src/compiler/arm/move.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/arm/move.lisp b/src/compiler/arm/move.lisp index c938b5b9ee..0b16a52c79 100644 --- a/src/compiler/arm/move.lisp +++ b/src/compiler/arm/move.lisp @@ -20,7 +20,7 @@ ;;; This should be put into composite-immediate-instruction, but that ;;; macro is too scary. (defun load-repeating-pattern (dest val) - (declare (type (signed-byte 32) val)) + (declare (type (unsigned-byte 32) val)) (inst mov dest (ldb (byte 8 0) val)) (inst orr dest dest (mask-field (byte 8 8) val)) (inst orr dest dest (lsl dest 16))) From 9b8137e165b321bf6519bd67b2b6c21ab3c9910d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 8 Jun 2022 22:26:12 -0400 Subject: [PATCH 3485/4023] Fix arm64 darwin --- src/runtime/gencgc.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 510a508b04..82cc71d408 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1087,28 +1087,31 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re set_page_scan_start_offset(i, addr_diff(page_address(i), alloc_region->start_addr)); } +#ifdef LISP_FEATURE_DARWIN_JIT + if (page_type == PAGE_TYPE_CODE) { + /* Remap before releasing the mutex so that no other thread can manipulate + * this range of code until it has been correctly set up. If page(s) were + * previously utilized for code, this is not necessary, but there's no way + * to know that. If the first page was already in use, remapping would trash + * what's there, so don't do that */ + int remap_from = first_page + (page_words_used(first_page)?1:0); + if (last_page >= remap_from) { + long len = npage_bytes(1+last_page-remap_from); + os_invalidate(page_address(remap_from), len); + mmap(page_address(remap_from), len, + OS_VM_PROT_ALL, MAP_ANON|MAP_PRIVATE|MAP_JIT, -1, 0); + } + } +#endif if (unlock) { int __attribute__((unused)) ret = mutex_release(&free_pages_lock); gc_assert(ret); } - /* If the first page was only partial, don't check whether it's - * zeroed (it won't be) and don't zero it (since the parts that - * we're interested in are guaranteed to be zeroed). - */ - if (page_words_used(first_page)) { - first_page++; - } + // Like above: if first page was in use, don't zeroize + INSTRUMENTING(zeroize_pages_if_needed(first_page+(page_words_used(first_page)?1:0), + last_page, page_type), et_bzeroing); - INSTRUMENTING(zeroize_pages_if_needed(first_page, last_page, page_type), et_bzeroing); - -#ifdef LISP_FEATURE_DARWIN_JIT - if (page_type == PAGE_TYPE_CODE) { - if (last_page >= first_page) { - os_protect(page_address(first_page), npage_bytes(1+last_page-first_page), OS_VM_PROT_ALL); - } - } -#endif return alloc_region->free_pointer; } @@ -1877,7 +1880,8 @@ static inline int immune_set_memberp(page_index_t page) (w==BIGNUM_WIDETAG || w==CODE_HEADER_WIDETAG || \ (w>=SIMPLE_VECTOR_WIDETAG && w < COMPLEX_BASE_STRING_WIDETAG)) -static inline int lowtag_ok_for_page_type(__attribute__((unused)) lispobj ptr, +static inline __attribute__((unused)) +int lowtag_ok_for_page_type(__attribute__((unused)) lispobj ptr, __attribute__((unused)) int page_type) { // If the young generation goes to mixed-region, this filter is not valid #ifdef LISP_FEATURE_USE_CONS_REGION From e4f0e534a31659cbdc035544bd31401096258718 Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 8 Jun 2022 22:11:31 -0700 Subject: [PATCH 3486/4023] Do :EXPORT clauses in the right order when setting up cold packages. i.e. after IMPORT-FROM, just like as prescribed for DEFPACKAGE. This makes the behavior of DEFPACKAGE* less surprising. Some unnecessary uses of REEXPORT came from this mistake. --- src/cold/set-up-cold-packages.lisp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index 5f8faa4e14..c0730fd4df 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -400,8 +400,6 @@ :nicknames (package-data-nicknames package-data)))) (dolist (string (package-data-shadow package-data)) (shadow string package)) - (dolist (string (package-data-export package-data)) - (export (intern string package) package)) (setf (documentation package t) (package-data-documentation package-data)))) ;; Now that all packages exist, we can set up package-package ;; references. @@ -414,7 +412,10 @@ (let ((from-package (first sublist))) (import (mapcar (lambda (name) (intern name from-package)) (rest sublist)) - (package-data-name package-data))))) + (package-data-name package-data)))) + (dolist (string (package-data-export package-data)) + (export (intern string (package-data-name package-data)) + (package-data-name package-data)))) (unhide-host-format-funs) From 0a26d935b516f54f0d0e41cfeed877d345a70a0e Mon Sep 17 00:00:00 2001 From: Charles Zhang <czhang@hrl.com> Date: Wed, 8 Jun 2022 22:31:11 -0700 Subject: [PATCH 3487/4023] Remove REEXPORT clause from PACKAGE-DATA. We needed them since the beginning of SBCL because EXPORT clauses inside package data were just not handled in the right order. But now they are, so we don't need to use :REEXPORT most of the time, we can just use normal DEFPACKGE machinery. For the cases where REEXPORT was just an abbreviation for IMPORT-FROM, then EXPORT, we can just write out the exports again manually. If we don't want to repeat this we could also define a function REEXPORT to do this. The idea is that we want the package definitions forms used to set up cold packages truly look the same as normal DEFPACKAGE. Also massively simplifies the actual creation of packages. This also makes SB-C:SLOT a different symbol from SB-ALIEN:SLOT. It didn't make sense to conflate them given they don't share any commonality in terms of semantics or definitions. --- src/cold/exports.lisp | 142 +++++++++++++++++------------ src/cold/set-up-cold-packages.lisp | 55 +++-------- 2 files changed, 93 insertions(+), 104 deletions(-) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 8bf49ee2eb..c9cb478c04 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -52,8 +52,6 @@ user. This package only tries to implement what happens to be needed by the current implementation of SBCL, and makes no guarantees of interface stability.") (:use "CL" "SB-ALIEN" "SB-EXT" "SB-INT" "SB-SYS") - (:reexport "OFF-T" - "SIZE-T") (:export ;; wrappers around Unix stuff to give just what Lisp needs "NANOSLEEP" @@ -64,6 +62,8 @@ interface stability.") "UNIX-OFFSET" "FD-TYPE" + "SIZE-T" + "OFF-T" ;; Most of this is random detritus worthy of deletion, ;; and the ordering is not alphabetical or anything sane. @@ -283,7 +283,6 @@ be submitted as a CDR") (defpackage* "SB-EVAL" (:documentation "internal: the evaluator implementation used to execute code without compiling it.") (:use "CL" "SB-KERNEL" "SB-EXT" "SB-INT") - (:reexport "*EVAL-CALLS*") (:export "INTERPRETED-FUNCTION-NAME" "INTERPRETED-FUNCTION-DEBUG-NAME" "INTERPRETED-FUNCTION-LAMBDA-LIST" @@ -332,7 +331,6 @@ structure representations") (:use "CL" "SB-ALIEN" "SB-ALIEN-INTERNALS" "SB-ASSEM" "SB-C" "SB-EXT" "SB-FASL" "SB-INT" "SB-KERNEL" "SB-SYS" "SB-UNIX") (:import-from "SB-C" "VOP-ARGS" "VOP-RESULTS") - (:reexport "WORD") (:export "*PRIMITIVE-OBJECTS*" "+HIGHEST-NORMAL-GENERATION+" "+PSEUDO-STATIC-GENERATION+" @@ -620,7 +618,7 @@ structure representations") "WEAK-POINTER-SIZE" "WEAK-POINTER-WIDETAG" "WEAK-POINTER-VALUE-SLOT" "N-WORD-BITS" "N-WORD-BYTES" "N-MACHINE-WORD-BITS" "N-MACHINE-WORD-BYTES" - "WORD-REG-SC-NUMBER" "WORD-SHIFT" + "WORD" "WORD-REG-SC-NUMBER" "WORD-SHIFT" #+win32 "CONTEXT-RESTORE-TRAP" "ZERO-SC-NUMBER") #+immobile-space @@ -710,11 +708,11 @@ basic stuff like BACKTRACE and ARG. For now, the actual supported interface is still mixed indiscriminately with low-level internal implementation stuff like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") (:use "CL" "SB-EXT" "SB-INT" "SB-SYS" "SB-KERNEL" "SB-DI") - (:reexport "*DEBUG-PRINT-VARIABLE-ALIST*") (:export "*BACKTRACE-FRAME-COUNT*" "*DEBUG-BEGINNER-HELP-P*" "*DEBUG-CONDITION*" "*DEBUG-READTABLE*" "*DEBUG-HELP-STRING*" + "*DEBUG-PRINT-VARIABLE-ALIST*" "*FLUSH-DEBUG-ERRORS*" "*IN-THE-DEBUGGER*" "*METHOD-FRAME-STYLE*" "*TRACE-INDENTATION-STEP*" "*MAX-TRACE-INDENTATION*" @@ -735,6 +733,8 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") (defpackage* "SB-EXT" (:documentation "public: miscellaneous supported extensions to the ANSI Lisp spec") (:use "CL" "SB-ALIEN" "SB-INT" "SB-SYS" "SB-GRAY") + (:import-from "SB-VM" "WORD") + (:import-from "SB-DEBUG" "*DEBUG-PRINT-VARIABLE-ALIST*") (:export ;; Information about how the program was invoked is ;; nonstandard but very useful. @@ -1147,15 +1147,11 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") (:documentation "private: primitives used to write debuggers") (:use "CL" "SB-EXT" "SB-INT" "SB-KERNEL" "SB-SYS" "SB-VM") (:import-from "SB-C" - "DEBUG-SOURCE-NAMESTRING" - "DEBUG-SOURCE-CREATED" + "DEBUG-SOURCE" "DEBUG-SOURCE-NAMESTRING" + "DEBUG-SOURCE-CREATED" "DEBUG-SOURCE-P" "DEBUG-SOURCE-START-POSITIONS" "MAKE-DEBUG-SOURCE" - "DEBUG-SOURCE" "DEBUG-SOURCE-P" "CORE-DEBUG-SOURCE" "CORE-DEBUG-SOURCE-P" "CORE-DEBUG-SOURCE-FORM") - (:reexport "DEBUG-SOURCE-NAMESTRING" - "DEBUG-SOURCE-START-POSITIONS" "DEBUG-SOURCE-CREATED" - "DEBUG-SOURCE" "DEBUG-SOURCE-P") (:export "ACTIVATE-BREAKPOINT" "AMBIGUOUS-DEBUG-VARS" "AMBIGUOUS-VAR-NAME" "BREAKPOINT" "BREAKPOINT-ACTIVE-P" "BREAKPOINT-HOOK-FUN" "BREAKPOINT-INFO" @@ -1170,7 +1166,9 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "DEBUG-FUN" "DEBUG-FUN-FUN" "DEBUG-FUN-KIND" "DEBUG-FUN-LAMBDA-LIST" "DEBUG-FUN-NAME" "DEBUG-FUN-CLOSURE-NAME" "DEBUG-FUN-P" "DEBUG-FUN-START-LOCATION" - "DEBUG-FUN-SYMBOL-VARS" + "DEBUG-FUN-SYMBOL-VARS" "DEBUG-SOURCE" + "DEBUG-SOURCE-CREATED" "DEBUG-SOURCE-NAMESTRING" + "DEBUG-SOURCE-P" "DEBUG-SOURCE-START-POSITIONS" "DEBUG-VAR" "DEBUG-VAR-ID" "DEBUG-VAR-INFO-AVAILABLE" "DEBUG-VAR-SYMBOL-NAME" "DEBUG-VAR-P" "DEBUG-VAR-PACKAGE-NAME" "DEBUG-VAR-SYMBOL" "DEBUG-VAR-VALID-VALUE" @@ -1247,8 +1245,6 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") (:use "CL" "SB-ALIEN-INTERNALS" "SB-ALIEN" "SB-ASSEM" "SB-BIGNUM" #+sb-dyncount "SB-DYNCOUNT" "SB-EXT" "SB-FASL" "SB-INT" "SB-KERNEL" "SB-SYS") - ;; But why do we need SLOT re-exported? - (:reexport "SLOT" "FLUSHABLE") (:export "%ALIEN-FUNCALL" "%CATCH-BREAKUP" "%CONTINUE-UNWIND" "%UNWIND" "%LISTIFY-REST-ARGS" "%MORE-ARG" "%MORE-ARG-VALUES" @@ -1280,6 +1276,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "ANY" "ASSEMBLE-FILE" "ATTRIBUTES" "ATTRIBUTES-INTERSECTION" "ATTRIBUTES-UNION" "ATTRIBUTES=" + "BRANCH" "CALL" "CALL-LOCAL" "CALL-NAMED" "CALL-VARIABLE" "CALL-OUT" "CALL-OUT-NAMED" "CALLEE-NFP-TN" "CALLEE-RETURN-PC-TN" @@ -1325,7 +1322,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "FIXUP-NOTE-KIND" "FIXUP-NOTE-FIXUP" "FIXUP-NOTE-POSITION" - "FOLDABLE" + "FLUSHABLE" "FOLDABLE" "FORCE-TN-TO-STACK" "FUN-INFO-DERIVE-TYPE" "FUN-INFO-IR2-CONVERT" "FUN-INFO-LTN-ANNOTATE" "FUN-INFO-OPTIMIZER" @@ -1411,6 +1408,7 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*.") "XEP-SETUP-SP" "LABEL-ID" "FIXUP" "FIXUP-FLAVOR" "FIXUP-NAME" "FIXUP-OFFSET" "FIXUP-P" "MAKE-FIXUP" + "SLOT" "DEF-ALLOC" "VAR-ALLOC" "SAFE-FDEFN-FUN" @@ -1663,37 +1661,36 @@ of the packages ALIEN and C-CALL at the time of the SBCL fork. SB-C-CALL is a deprecated nickname to help ease the transition from older versions of SBCL which maintained the CMU-CL-style split into two packages.)") (:use "CL" "SB-EXT" "SB-INT" "SB-SYS" "SB-ALIEN-INTERNALS") - (:reexport "ARRAY" - "BOOLEAN" "CHAR" "DOUBLE-FLOAT" - "FLOAT" "FUNCTION" "INTEGER" "LONG-FLOAT" - "SINGLE-FLOAT" - ;; FIXME: Do we really want to reexport - ;; SYSTEM-AREA-POINTER here? Why? - "SYSTEM-AREA-POINTER" - "UNION" "VALUES" "*") - (:export "ADDR" - "ALIEN" - "ALIEN-FUNCALL" "ALIEN-SAP" "ALIEN-SIZE" - "CAST" "C-STRING" + (:import-from "CL" "*" "ARRAY" "CHAR" "DOUBLE-FLOAT" "FLOAT" "FUNCTION" + "BOOLEAN" "INTEGER" "LONG-FLOAT" "SINGLE-FLOAT" "UNION" "VALUES") + (:import-from "SB-SYS" "SYSTEM-AREA-POINTER") + (:import-from "SB-UNIX" "OFF-T" "SIZE-T") + (:export "*" "ADDR" "ALIEN" "ALIEN-FUNCALL" "ALIEN-SAP" + "ALIEN-SIZE" "ARRAY" "BOOLEAN" "CAST" "CHAR" "C-STRING" "DEFINE-ALIEN-ROUTINE" "DEFINE-ALIEN-TYPE" "DEFINE-ALIEN-VARIABLE" - "DEREF" "DOUBLE" - "ENUM" "EXTERN-ALIEN" - "FREE-ALIEN" + "DEREF" "DOUBLE-FLOAT" "DOUBLE" "ENUM" "EXTERN-ALIEN" + "FLOAT" "FREE-ALIEN" "FUNCTION" + "LONG-FLOAT" "GET-ERRNO" "INT" + "INTEGER" "LOAD-1-FOREIGN" "LOAD-FOREIGN" "LOAD-SHARED-OBJECT" "LONG" "LONG-LONG" "MAKE-ALIEN" "MAKE-ALIEN-STRING" "NULL-ALIEN" "OFF-T" "SAP-ALIEN" "SHORT" "SIGNED" + "SINGLE-FLOAT" "SIZE-T" "SSIZE-T" "SLOT" "STRUCT" + "SYSTEM-AREA-POINTER" "UNDEFINED-ALIEN-ERROR" + "UNION" "UNLOAD-SHARED-OBJECT" "UNSIGNED" "UNSIGNED-CHAR" "UNSIGNED-INT" "UNSIGNED-LONG" "UNSIGNED-LONG-LONG" "UNSIGNED-SHORT" "UTF8-STRING" + "VALUES" "VOID" "WITH-ALIEN")) @@ -1794,16 +1791,17 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") (:use "CL" "SB-ALIEN" "SB-ALIEN-INTERNALS" "SB-BIGNUM" "SB-EXT" "SB-FASL" "SB-INT" "SB-SYS" "SB-GRAY") #+sb-simd-pack - (:reexport "SIMD-PACK" - "SIMD-PACK-P" - "%MAKE-SIMD-PACK-UB32" - "%MAKE-SIMD-PACK-UB64" - "%MAKE-SIMD-PACK-DOUBLE" - "%MAKE-SIMD-PACK-SINGLE" - "%SIMD-PACK-UB32S" - "%SIMD-PACK-UB64S" - "%SIMD-PACK-DOUBLES" - "%SIMD-PACK-SINGLES") + (:import-from "SB-EXT" + "SIMD-PACK" + "SIMD-PACK-P" + "%MAKE-SIMD-PACK-UB32" + "%MAKE-SIMD-PACK-UB64" + "%MAKE-SIMD-PACK-DOUBLE" + "%MAKE-SIMD-PACK-SINGLE" + "%SIMD-PACK-UB32S" + "%SIMD-PACK-UB64S" + "%SIMD-PACK-DOUBLES" + "%SIMD-PACK-SINGLES") (:export "%%DATA-VECTOR-REFFERS%%" "%%DATA-VECTOR-SETTERS%%" "%ACOS" @@ -2660,6 +2658,17 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "%RPLACD" "%RPLACA" "%PUT" "%CHARSET" "%WITH-OUTPUT-TO-STRING") #+sb-simd-pack + (:export "SIMD-PACK" + "SIMD-PACK-P" + "%MAKE-SIMD-PACK-UB32" + "%MAKE-SIMD-PACK-UB64" + "%MAKE-SIMD-PACK-DOUBLE" + "%MAKE-SIMD-PACK-SINGLE" + "%SIMD-PACK-UB32S" + "%SIMD-PACK-UB64S" + "%SIMD-PACK-DOUBLES" + "%SIMD-PACK-SINGLES") + #+sb-simd-pack (:export "%SIMD-PACK-TAG" "%SIMD-PACK-LOW" "%SIMD-PACK-HIGH") @@ -2688,6 +2697,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") (defpackage* "SB-ASSEM" (:documentation "private: the assembler, used by the compiler") (:use "CL" "SB-EXT" "SB-INT") + (:import-from "SB-C" "BRANCH" "FLUSHABLE") (:export "ASSEMBLY-UNIT" "ASSEMBLY-UNIT-BITS" "+INST-ALIGNMENT-BYTES+" @@ -2729,15 +2739,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "STMT-PREV" "STMT-NEXT" "ADD-STMT-LABELS" "DELETE-STMT" "LABELED-STATEMENT-P" - "DEFPATTERN" - - ;; FIXME: These are in the SB-ASSEM package now, but - ;; (left over from CMU CL) are defined in files which - ;; are IN-PACKAGE SB-C. It would probably be cleaner - ;; to move at least most of them to files which are - ;; IN-PACKAGE SB-ASSEM. - - "BRANCH" "FLUSHABLE")) + "DEFPATTERN")) (defpackage* "SB-THREAD" (:documentation "public (but low-level): native thread support") @@ -3420,28 +3422,35 @@ possibly temporarily, because it might be used internally.") The Art of the Metaobject Protocol, by Kiczales, des Rivieres and Bobrow: ISBN 0-262-61074-4, with exceptions as noted in the User Manual.") (:use "CL") - (:reexport "ADD-METHOD" - "ALLOCATE-INSTANCE" - "CLASS-NAME" "COMPUTE-APPLICABLE-METHODS" - "ENSURE-GENERIC-FUNCTION" "MAKE-INSTANCE" - "METHOD-QUALIFIERS" "REMOVE-METHOD" - "BUILT-IN-CLASS" "CLASS" - "FUNCTION" "GENERIC-FUNCTION" - "METHOD" "METHOD-COMBINATION" - "STANDARD-CLASS" "STANDARD-GENERIC-FUNCTION" - "STANDARD-METHOD" "STANDARD-OBJECT" "T") + (:import-from "CL" + "ADD-METHOD" + "ALLOCATE-INSTANCE" + "CLASS-NAME" "COMPUTE-APPLICABLE-METHODS" + "ENSURE-GENERIC-FUNCTION" "MAKE-INSTANCE" + "METHOD-QUALIFIERS" "REMOVE-METHOD" + "BUILT-IN-CLASS" "CLASS" + "FUNCTION" "GENERIC-FUNCTION" + "METHOD" "METHOD-COMBINATION" + "STANDARD-CLASS" "STANDARD-GENERIC-FUNCTION" + "STANDARD-METHOD" "STANDARD-OBJECT" "T") (:export "ADD-DEPENDENT" "ADD-DIRECT-METHOD" "ADD-DIRECT-SUBCLASS" + "ADD-METHOD" + "ALLOCATE-INSTANCE" + "BUILT-IN-CLASS" + "CLASS" "CLASS-DEFAULT-INITARGS" "CLASS-DIRECT-DEFAULT-INITARGS" "CLASS-DIRECT-SLOTS" "CLASS-DIRECT-SUBCLASSES" "CLASS-DIRECT-SUPERCLASSES" "CLASS-FINALIZED-P" + "CLASS-NAME" "CLASS-PRECEDENCE-LIST" "CLASS-PROTOTYPE" "CLASS-SLOTS" + "COMPUTE-APPLICABLE-METHODS" "COMPUTE-APPLICABLE-METHODS-USING-CLASSES" "COMPUTE-CLASS-PRECEDENCE-LIST" "COMPUTE-DEFAULT-INITARGS" @@ -3455,6 +3464,7 @@ ISBN 0-262-61074-4, with exceptions as noted in the User Manual.") "EFFECTIVE-SLOT-DEFINITION-CLASS" "ENSURE-CLASS" "ENSURE-CLASS-USING-CLASS" + "ENSURE-GENERIC-FUNCTION" "ENSURE-GENERIC-FUNCTION-USING-CLASS" "EQL-SPECIALIZER" "EQL-SPECIALIZER-OBJECT" @@ -3466,7 +3476,9 @@ ISBN 0-262-61074-4, with exceptions as noted in the User Manual.") "FUNCALLABLE-STANDARD-CLASS" "FUNCALLABLE-STANDARD-INSTANCE-ACCESS" "FUNCALLABLE-STANDARD-OBJECT" + "FUNCTION" "GENERIC-FUNCTION-ARGUMENT-PRECEDENCE-ORDER" + "GENERIC-FUNCTION" "GENERIC-FUNCTION-DECLARATIONS" "GENERIC-FUNCTION-LAMBDA-LIST" "GENERIC-FUNCTION-METHOD-CLASS" @@ -3474,18 +3486,23 @@ ISBN 0-262-61074-4, with exceptions as noted in the User Manual.") "GENERIC-FUNCTION-METHODS" "GENERIC-FUNCTION-NAME" "INTERN-EQL-SPECIALIZER" + "MAKE-INSTANCE" "MAKE-METHOD-LAMBDA" "MAP-DEPENDENTS" "METAOBJECT" + "METHOD" + "METHOD-COMBINATION" "METHOD-FUNCTION" "METHOD-GENERIC-FUNCTION" "METHOD-LAMBDA-LIST" + "METHOD-QUALIFIERS" "METHOD-SPECIALIZERS" "ACCESSOR-METHOD-SLOT-DEFINITION" "READER-METHOD-CLASS" "REMOVE-DEPENDENT" "REMOVE-DIRECT-METHOD" "REMOVE-DIRECT-SUBCLASS" + "REMOVE-METHOD" "SET-FUNCALLABLE-INSTANCE-FUNCTION" "SLOT-BOUNDP-USING-CLASS" "SLOT-DEFINITION" @@ -3504,12 +3521,17 @@ ISBN 0-262-61074-4, with exceptions as noted in the User Manual.") "SPECIALIZER-DIRECT-GENERIC-FUNCTIONS" "SPECIALIZER-DIRECT-METHODS" "STANDARD-ACCESSOR-METHOD" + "STANDARD-CLASS" "STANDARD-DIRECT-SLOT-DEFINITION" "STANDARD-EFFECTIVE-SLOT-DEFINITION" + "STANDARD-GENERIC-FUNCTION" "STANDARD-INSTANCE-ACCESS" + "STANDARD-METHOD" + "STANDARD-OBJECT" "STANDARD-READER-METHOD" "STANDARD-SLOT-DEFINITION" "STANDARD-WRITER-METHOD" + "T" "UPDATE-DEPENDENT" "VALIDATE-SUPERCLASS" "WRITER-METHOD-CLASS")) diff --git a/src/cold/set-up-cold-packages.lisp b/src/cold/set-up-cold-packages.lisp index c0730fd4df..d69a013e8d 100644 --- a/src/cold/set-up-cold-packages.lisp +++ b/src/cold/set-up-cold-packages.lisp @@ -148,10 +148,6 @@ ;; a list of string designators for exported symbols which'll be set ;; up at package creation time. export - ;; a list of string designators for exported symbols which don't necessarily - ;; originate in this package (so their EXPORT operations should be handled - ;; after USE operations have been done, so that duplicates aren't created) - reexport ;; a list of sublists describing imports. Each sublist has the format as an ;; IMPORT-FROM list in DEFPACKAGE: the first element is the name of the ;; package to import from, and the remaining elements are the names of @@ -408,8 +404,14 @@ (package-data-use package-data) :test 'string=) (package-data-name package-data)) + ;; Note: Unlike plain-old DEFPACKAGE, this IMPORT-FROM does + ;; potentially intern NAME into the FROM-PACKAGE to make forward + ;; references work. (dolist (sublist (package-data-import-from package-data)) - (let ((from-package (first sublist))) + (let* ((from-package (first sublist)) + (from-package (if (string= from-package "CL") + "XC-STRICT-CL" + from-package))) (import (mapcar (lambda (name) (intern name from-package)) (rest sublist)) (package-data-name package-data)))) @@ -417,56 +419,21 @@ (export (intern string (package-data-name package-data)) (package-data-name package-data)))) - (unhide-host-format-funs) - - ;; Now that all package-package references exist, we can handle - ;; REEXPORT operations. (We have to wait until now because they - ;; interact with USE operations.) This code handles dependencies - ;; properly, but is somewhat ugly. - (let (done) - (labels - ((reexport (package-data) - (let ((package (find-package (package-data-name package-data)))) - (cond - ((member package done)) - ((null (package-data-reexport package-data)) - (push package done)) - (t - (mapcar #'reexport - (remove-if-not - (lambda (x) - (member x (package-data-use package-data) - :test #'string=)) - package-data-list - :key #'package-data-name)) - (dolist (symbol-name (package-data-reexport package-data)) - (multiple-value-bind (symbol status) - (find-symbol symbol-name package) - (unless status - (error "No symbol named ~S is accessible in ~S." - symbol-name package)) - (when (eq (symbol-package symbol) package) - (error - "~S is not inherited/imported, but native to ~S." - symbol-name package)) - (export symbol package))) - (push package done)))))) - (dolist (x package-data-list) - (reexport x)) - (assert (= (length done) (length package-data-list)))))) + (unhide-host-format-funs)) (export '*undefined-fun-allowlist*) (defvar *undefined-fun-allowlist* (make-hash-table :test 'equal)) (defparameter *package-data-list* '()) -;;; Like DEFPACKAGE, but can handle :REEXPORT. +;;; Like DEFPACKAGE, but does some special stuff to make forward +;;; references work. (defmacro defpackage* (name &rest options) (let ((flattened-options '())) (dolist (option options) (destructuring-bind (kind . args) option (ecase kind - ((:use :export :reexport :shadow :nicknames) + ((:use :export :shadow :nicknames) (let ((existing-option (assoc kind flattened-options))) (if existing-option (setf (second (second existing-option)) From 99b34efb60ffdea1c60008c7a59d8efaa1431efb Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 9 Jun 2022 21:13:08 +0300 Subject: [PATCH 3488/4023] Remove unneeded (clear-info :function :inlinep ..) These functions are no longer inlined. --- src/code/string.lisp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index d35ac2df99..b0ba2a29a4 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -742,8 +742,3 @@ new string COUNT long filled with the fill character." sb-vm:+vector-shareable+ sb-vm:+vector-shareable-nonstd+))) vector) - -(clear-info :function :inlining-data 'nstring-upcase) -(clear-info :function :inlinep 'nstring-upcase) -(clear-info :function :inlining-data 'nstring-downcase) -(clear-info :function :inlinep 'nstring-downcase) From 7c37b544072fa7b69d03fe53df7f29fb431075e7 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 10 Jun 2022 20:16:15 +0300 Subject: [PATCH 3489/4023] Make variables in defoptimizer ignorable. Just like in deftransform. --- src/compiler/aliencomp.lisp | 10 +---- src/compiler/array-tran.lisp | 16 +------ src/compiler/generic/vm-ir2tran.lisp | 45 +++++++------------- src/compiler/ir2tran.lisp | 16 ++----- src/compiler/ltn.lisp | 20 +++------ src/compiler/macros.lisp | 23 +++++----- src/compiler/modarith.lisp | 1 - src/compiler/seqtran.lisp | 63 +++++++++------------------- src/compiler/srctran.lisp | 15 +------ src/compiler/typetran.lisp | 4 +- src/compiler/x86-64/c-call.lisp | 1 - 11 files changed, 60 insertions(+), 154 deletions(-) diff --git a/src/compiler/aliencomp.lisp b/src/compiler/aliencomp.lisp index 3569d8541f..2c4de45129 100644 --- a/src/compiler/aliencomp.lisp +++ b/src/compiler/aliencomp.lisp @@ -236,7 +236,6 @@ #+nil ;; Shouldn't be necessary. (defoptimizer (deref derive-type) ((alien &rest noise)) - (declare (ignore noise)) (block nil (catch 'give-up-ir1-transform (return (make-alien-type-type (find-deref-element-type alien)))) @@ -252,7 +251,6 @@ #+nil ;; ### Again, the value might be coerced. (defoptimizer (%set-deref derive-type) ((alien value &rest noise)) - (declare (ignore noise)) (block nil (catch 'give-up-ir1-transform (let ((type (make-alien-type-type @@ -272,7 +270,6 @@ value)))) (defoptimizer (%deref-addr derive-type) ((alien &rest noise)) - (declare (ignore noise)) (block nil (catch 'give-up-ir1-transform (return (make-alien-type-type @@ -414,7 +411,6 @@ '(error "This should be eliminated as dead code.")))) (defoptimizer (%local-alien-addr derive-type) ((info var)) - (declare (ignore var)) (if (constant-lvar-p info) (let* ((info (lvar-value info)) (alien-type (local-alien-info-type info))) @@ -433,7 +429,6 @@ ;;;; %CAST (defoptimizer (%cast derive-type) ((alien type)) - (declare (ignore alien)) (or (when (constant-lvar-p type) (let ((alien-type (lvar-value type))) (when (alien-type-p alien-type) @@ -466,7 +461,6 @@ (give-up-ir1-transform))))) (defoptimizer (%sap-alien derive-type) ((sap type)) - (declare (ignore sap)) (if (constant-lvar-p type) (make-alien-type-type (lvar-value type)) *wild-type*)) @@ -594,7 +588,6 @@ ,body))))))) (defoptimizer (%alien-funcall derive-type) ((function type &rest args)) - (declare (ignore function args)) (unless (and (constant-lvar-p type) (alien-fun-type-p (lvar-value type))) (error "Something is broken.")) @@ -604,8 +597,7 @@ (if (eq spec '*) *wild-type* (values-specifier-type spec)))) (defoptimizer (%alien-funcall ltn-annotate) - ((function type &rest args) node ltn-policy) - (declare (ignore type ltn-policy)) + ((function type &rest args) node) (setf (basic-combination-info node) :funny) (setf (node-tail-p node) nil) (unless (and (constant-lvar-p function) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index 7e53a9bc50..dce40e8931 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -224,16 +224,13 @@ (give-up)))))))) (defoptimizer (aref derive-type) ((array &rest subscripts)) - (declare (ignore subscripts)) (derive-aref-type array)) (defoptimizer ((setf aref) derive-type) ((new-value array &rest subscripts)) - (declare (ignore subscripts)) (assert-new-value-type new-value array)) (macrolet ((define (name) `(defoptimizer (,name derive-type) ((array index)) - (declare (ignore index)) (derive-aref-type array)))) (define hairy-data-vector-ref) (define hairy-data-vector-ref/check-bounds) @@ -241,7 +238,6 @@ #+(or x86 x86-64) (defoptimizer (data-vector-ref-with-offset derive-type) ((array index offset)) - (declare (ignore index offset)) (derive-aref-type array)) (defoptimizer (vector-pop derive-type) ((array)) @@ -249,7 +245,6 @@ (macrolet ((define (name) `(defoptimizer (,name derive-type) ((array index new-value)) - (declare (ignore index)) (assert-new-value-type new-value array)))) (define hairy-data-vector-set) (define hairy-data-vector-set/check-bounds) @@ -268,18 +263,14 @@ ((csubtypep atype (specifier-type 'string)) (specifier-type 'simple-string))))) (defoptimizer (%with-array-data derive-type) ((array start end)) - (declare (ignore start end)) (derive-%with-array-data/mumble-type array)) (defoptimizer (%with-array-data/fp derive-type) ((array start end)) - (declare (ignore start end)) (derive-%with-array-data/mumble-type array)) (defoptimizer (row-major-aref derive-type) ((array index)) - (declare (ignore index)) (derive-aref-type array)) (defoptimizer (%set-row-major-aref derive-type) ((array index new-value)) - (declare (ignore index)) (assert-new-value-type new-value array)) (defun check-array-dimensions (dims node) @@ -358,7 +349,6 @@ ((dims widetag n-bits &key adjustable fill-pointer displaced-to &allow-other-keys) node) - (declare (ignore n-bits)) (let ((saetp (and (constant-lvar-p widetag) (find (lvar-value widetag) sb-vm:*specialized-array-element-type-properties* @@ -1995,13 +1985,11 @@ nil))))))) (defoptimizer (array-header-p constraint-propagate-if) - ((array) node gen) - (declare (ignore gen)) + ((array)) (values array (specifier-type '(and array (not (simple-array * (*))))))) ;;; If ARRAY-HAS-FILL-POINTER-P returns true, then ARRAY ;;; is of the specified type. (defoptimizer (array-has-fill-pointer-p constraint-propagate-if) - ((array) node gen) - (declare (ignore gen)) + ((array)) (values array (specifier-type '(and vector (not simple-array))))) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index 601ed26d04..dee667cd49 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -16,8 +16,7 @@ sb-vm:instance-widetag sb-vm:instance-pointer-lowtag nil) (defoptimizer (%make-structure-instance stack-allocate-result) - ((defstruct-description &rest args) node dx) - (declare (ignore args dx)) + ((defstruct-description &rest args)) (aver (constant-lvar-p defstruct-description)) ;; A structure instance can be stack-allocated if it has no raw ;; slots, or if we're on a target with a conservatively-scavenged @@ -29,14 +28,11 @@ (not (dd-has-raw-slot-p (lvar-value defstruct-description))))) (defoptimizer (%make-instance stack-allocate-result) ((n) node dx) - (declare (ignore n)) (eq dx 'truly-dynamic-extent)) #+(and gencgc c-stack-is-control-stack) (defoptimizer (%make-instance/mixed stack-allocate-result) ((n) node dx) - (declare (ignore n)) (eq dx 'truly-dynamic-extent)) (defoptimizer (%make-funcallable-instance stack-allocate-result) ((n) node dx) - (declare (ignore n)) (eq dx 'truly-dynamic-extent)) (defoptimizer ir2-convert-reffer ((object) node block name offset lowtag) @@ -195,8 +191,7 @@ (move-lvar-result node block locs lvar))) (defoptimizer ir2-convert-structure-allocation - ((dd slot-specs &rest args) node block name words type lowtag inits) - (declare (ignore inits)) + ((dd slot-specs &rest args) node block name words type lowtag) (let* ((lvar (node-lvar node)) (locs (lvar-result-tns lvar (list *universal-type*))) (result (first locs))) @@ -346,12 +341,10 @@ node block (list value-tn) (node-lvar node)))))))) ;;; Stack allocation optimizers per platform support -(defoptimizer (make-array-header* stack-allocate-result) ((&rest args) node dx) - args dx - t) +(defoptimizer (make-array-header* stack-allocate-result) ((&rest args)) + t) (defoptimizer (allocate-vector stack-allocate-result) ((#+ubsan poisoned type length words) node dx) - (declare (ignorable #+ubsan poisoned type length)) (and ;; Can't put unboxed data on the stack unless we scavenge it ;; conservatively. @@ -371,7 +364,6 @@ sb-vm:vector-data-offset))))))) (defoptimizer (allocate-vector ltn-annotate) ((#+ubsan poisoned type length words) call ltn-policy) - (declare (ignore #+ubsan poisoned type length words)) (vectorish-ltn-annotate-helper call ltn-policy (if (sb-c:msan-unpoison sb-c:*compilation*) 'sb-vm::allocate-vector-on-stack+msan-unpoison @@ -394,30 +386,24 @@ (annotate-1-value-lvar arg)))) ;;; ...lists -(progn - (defoptimizer (list stack-allocate-result) ((&rest args) node dx) - (declare (ignore dx)) - (not (null args))) - (defoptimizer (list* stack-allocate-result) ((&rest args) node dx) - (declare (ignore dx)) - (not (null (rest args)))) - (defoptimizer (%listify-rest-args stack-allocate-result) ((&rest args) node dx) - (declare (ignore args dx)) - t)) + +(defoptimizer (list stack-allocate-result) ((&rest args)) + (not (null args))) +(defoptimizer (list* stack-allocate-result) ((&rest args)) + (not (null (rest args)))) +(defoptimizer (%listify-rest-args stack-allocate-result) ((&rest args)) + t) ;;; ...conses -(defoptimizer (cons stack-allocate-result) ((&rest args) node dx) - (declare (ignore args dx)) - t) -(defoptimizer (%make-complex stack-allocate-result) ((&rest args) node dx) - (declare (ignore args dx)) - t) +(defoptimizer (cons stack-allocate-result) ((&rest args)) + t) +(defoptimizer (%make-complex stack-allocate-result) ((&rest args)) + t) ;;; MAKE-LIST optimizations #+x86-64 (progn (defoptimizer (%make-list stack-allocate-result) ((length element) node dx) - (declare (ignore element)) (or (eq dx 'truly-dynamic-extent) (zerop (policy node safety)) ;; At most one page (this is more paranoid than %listify-rest-args). @@ -429,7 +415,6 @@ (specifier-type `(integer 0 ,(/ +backend-page-bytes+ sb-vm:n-word-bytes 2)))))) (defoptimizer (%make-list ltn-annotate) ((length element) call ltn-policy) - (declare (ignore length element)) (vectorish-ltn-annotate-helper call ltn-policy 'sb-vm::allocate-list-on-stack 'sb-vm::allocate-list-on-heap))) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index b51d9de8ff..942f83a07a 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -563,8 +563,7 @@ (ir2-lvar-locs 2value) (ir2-lvar-locs 2lvar))))))) -(defoptimizer (%check-bound ir2-hook) ((array bound index) node block) - (declare (ignore block)) +(defoptimizer (%check-bound ir2-hook) ((array bound index) node) (let* ((bound-type (lvar-type bound)) (bound-type (specifier-type `(integer 0 @@ -780,7 +779,6 @@ ;;; case of IR2-CONVERT-TEMPLATE is that there can be codegen-info ;;; arguments. (defoptimizer (%%primitive ir2-convert) ((template info &rest args) call block) - (declare (ignore args)) (let* ((template (lvar-value template)) (info (lvar-value info)) (lvar (node-lvar call)) @@ -801,7 +799,6 @@ (values)) (defoptimizer (%%primitive derive-type) ((template info &rest args)) - (declare (ignore info args)) (let* ((template (lvar-value template)) (type (template-type template))) (cond ((zerop (vop-info-num-results template)) @@ -1841,7 +1838,6 @@ not stack-allocated LVAR ~S." source-lvar))))) (emit-constant name)))))) (defoptimizer (%special-unbind ir2-convert) ((&rest symbols) node block) - (declare (ignorable symbols)) (if-vop-existsp (:named sb-c:unbind-n) (vop unbind-n node block (mapcar #'lvar-value symbols)) (vop unbind node block))) @@ -1919,7 +1915,7 @@ not stack-allocated LVAR ~S." source-lvar))))) ;;; %CLEANUP-POINT doesn't do anything except prevent the body from ;;; being entirely deleted. -(defoptimizer (%cleanup-point ir2-convert) ((&rest args) node block) args node block) +(defoptimizer (%cleanup-point ir2-convert) ((&rest args))) ;;; This function invalidates a lexical exit on exiting from the ;;; dynamic extent. This is done by storing 0 into the indirect value @@ -2005,7 +2001,6 @@ not stack-allocated LVAR ~S." source-lvar))))) (check-catch-tag-type tag) (emit-nlx-start node block (lvar-value info-lvar) tag)) (defoptimizer (%unwind-protect ir2-convert) ((info-lvar cleanup) node block) - (declare (ignore cleanup)) (emit-nlx-start node block (lvar-value info-lvar) nil)) ;;; Emit the entry code for a non-local exit. We receive values and @@ -2186,7 +2181,6 @@ not stack-allocated LVAR ~S." source-lvar))))) (defoptimizer (%compile-time-type-error ir2-convert) ((objects atype dtype detail code-context cast-context) node block) - (declare (ignore objects code-context)) ;; Remove %COMPILE-TIME-TYPE-ERROR bits (setf (node-source-path node) (cdr (node-source-path node))) @@ -2198,8 +2192,7 @@ not stack-allocated LVAR ~S." source-lvar))))) (ir2-convert-full-call node block)) (defoptimizer (%compile-time-type-style-warn ir2-convert) - ((objects atype dtype detail code-context cast-context) node block) - (declare (ignore objects code-context block)) + ((objects atype dtype detail code-context cast-context) node) ;; Remove %COMPILE-TIME-TYPE-ERROR bits (setf (node-source-path node) (cddr (node-source-path node))) @@ -2211,8 +2204,7 @@ not stack-allocated LVAR ~S." source-lvar))))) :condition 'type-style-warning)) #-sb-xc-host ;; package-lock-violation-p is not present yet -(defoptimizer (set ir2-hook) ((symbol value) node block) - (declare (ignore value block)) +(defoptimizer (set ir2-hook) ((symbol value) node) (when (constant-lvar-p symbol) (let* ((symbol (lvar-value symbol)) (kind (info :variable :kind symbol))) diff --git a/src/compiler/ltn.lisp b/src/compiler/ltn.lisp index c2c0469580..8d33059cbe 100644 --- a/src/compiler/ltn.lisp +++ b/src/compiler/ltn.lisp @@ -162,8 +162,7 @@ (values)) #+call-symbol -(defoptimizer (%coerce-callable-for-call ltn-annotate) ((fun) node ltn-policy) - (declare (ignore ltn-policy)) +(defoptimizer (%coerce-callable-for-call ltn-annotate) ((fun) node) (multiple-value-bind (dest dest-lvar) (and (node-lvar node) (principal-lvar-dest-and-lvar (node-lvar node))) @@ -500,24 +499,17 @@ ;;; (The default is o.k. for %CATCH, since environment analysis ;;; converted the reference to the escape function into a constant ;;; reference to the NLX-INFO.) -(defoptimizer (%unwind-protect ltn-annotate) ((escape cleanup) - node - ltn-policy) - (declare (ignore escape cleanup ltn-policy)) +(defoptimizer (%unwind-protect ltn-annotate) ((escape cleanup) node) (setf (basic-combination-info node) :funny) (setf (node-tail-p node) nil)) ;;; Make sure that arguments of magic functions are not annotated. ;;; (Otherwise the compiler may dump its internal structures as ;;; constants :-() -(defoptimizer (%pop-values ltn-annotate) ((%lvar) node ltn-policy) - (declare (ignore %lvar node ltn-policy))) -(defoptimizer (%dummy-dx-alloc ltn-annotate) ((target source) node ltn-policy) - (declare (ignore target source node ltn-policy))) - -(defoptimizer (%nip-values ltn-annotate) ((&rest lvars) - node ltn-policy) - (declare (ignore node ltn-policy)) +(defoptimizer (%pop-values ltn-annotate) ((%lvar))) +(defoptimizer (%dummy-dx-alloc ltn-annotate) ((target source))) + +(defoptimizer (%nip-values ltn-annotate) ((&rest lvars)) ;; Undo the optimization performed by LTN-ANALYZE-MV-CALL, ;; which only uses the CSP of the first argument. (loop for lvar-lvar in lvars diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index 59611ae1f5..83f3342ce0 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -380,7 +380,7 @@ ;;; methods are passed an additional POLICY argument, and IR2-CONVERT ;;; methods are passed an additional IR2-BLOCK argument. (defmacro defoptimizer (what (lambda-list - &optional (node (gensym) node-p) + &optional (node (gensym)) &rest vars) &body body) (let ((name (flet ((function-name (name) @@ -405,28 +405,25 @@ `(set-vop-optimizer (template-or-lose ',vop-name) #',name))) (binding* (((forms decls) (parse-body body nil)) ((var-decls more-decls) (extract-var-decls decls vars)) - ;; In case the BODY declares IGNORE of the formal NODE var, - ;; we rebind it from N-NODE and never reference it from BINDS. - (n-node (make-symbol "NODE")) - ((binds lambda-vars gensyms) - (parse-deftransform lambda-list n-node + ((binds lambda-vars) + (parse-deftransform lambda-list node `(return-from ,name ,(if (and (consp what) (eq (second what) 'equality-constraint)) :give-up - nil))))) + nil)))) + (args (gensym))) (declare (ignore lambda-vars)) `(progn ;; We can't stuff the BINDS as &AUX vars into the lambda list ;; because there can be a RETURN-FROM in there. - (defun ,name (,n-node ,@vars) + (defun ,name (,node ,@vars &rest ,args) + (declare (ignorable ,node ,@(butlast vars)) + (ignore ,args)) ,@(if var-decls (list var-decls)) - (let* (,@binds ,@(if node-p `((,node ,n-node)))) - ;; Syntax requires naming NODE even if undesired if VARS - ;; are present, so in that case make NODE ignorable. - (declare (ignorable ,@(if (and vars node-p) `(,node)) - ,@gensyms)) + (let* (,@binds) + (declare (ignorable ,@(mapcar #'car binds))) ,@more-decls ,@forms)) ,@(when (consp what) `((setf (,(let ((*package* (sb-xc:symbol-package 'fun-info))) diff --git a/src/compiler/modarith.lisp b/src/compiler/modarith.lisp index 488d2ff221..cfc9c3b70b 100644 --- a/src/compiler/modarith.lisp +++ b/src/compiler/modarith.lisp @@ -395,7 +395,6 @@ ))))))) (defoptimizer (mask-signed-field optimizer) ((width x) node) - (declare (ignore width)) (let ((result-type (single-value-type (node-derived-type node)))) (multiple-value-bind (low high) (integer-type-numeric-bounds result-type) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 631b891d1b..9f38a87879 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1059,8 +1059,7 @@ (type-specifier end-type)))))))) (macrolet ((def (name) - `(defoptimizer (,name ir2-hook) ((string1 string2 start1 end1 start2 end2) node block) - (declare (ignore block)) + `(defoptimizer (,name ir2-hook) ((string1 string2 start1 end1 start2 end2) node) (check-sequence-ranges string1 start1 end1 node 1 'string1) (check-sequence-ranges string2 start2 end2 node 2 'string2)))) (def string=*) @@ -1074,8 +1073,7 @@ (def simple-character-string=)) (macrolet ((def (name) - `(defoptimizer (,name ir2-hook) ((string1 string2 &key start1 end1 start2 end2) node block) - (declare (ignore block)) + `(defoptimizer (,name ir2-hook) ((string1 string2 &key start1 end1 start2 end2) node) (check-sequence-ranges string1 start1 end1 node 1 'string1) (check-sequence-ranges string2 start2 end2 node 2 'string2)))) (def string-equal) @@ -1084,8 +1082,7 @@ (def string-lessp)) (macrolet ((def (name) - `(defoptimizer (,name ir2-hook) ((string &key start end) node block) - (declare (ignore block)) + `(defoptimizer (,name ir2-hook) ((string &key start end) node) (check-sequence-ranges string start end node)))) (def string-downcase) (def string-upcase) @@ -1095,8 +1092,7 @@ (def nstring-capitalize)) (macrolet ((def (name &optional no-arg) - `(defoptimizer (,name ir2-hook) ((,@(unless no-arg '(x)) sequence &key start end &allow-other-keys) node block) - (declare (ignore ,@(unless no-arg '(x)) block)) + `(defoptimizer (,name ir2-hook) ((,@(unless no-arg '(x)) sequence &key start end &allow-other-keys) node) (check-sequence-ranges sequence start end node)))) (def find) (def find-if) @@ -1117,29 +1113,23 @@ (def remove-duplicates t) (def delete-duplicates t)) -(defoptimizer (%find-position ir2-hook) ((item sequence from-end start end key test) node block) - (declare (ignore item from-end key test block)) +(defoptimizer (%find-position ir2-hook) ((item sequence from-end start end key test) node) (check-sequence-ranges sequence start end node)) -(defoptimizer (%find-position-if ir2-hook) ((predicate sequence from-end start end key) node block) - (declare (ignore predicate from-end key block)) +(defoptimizer (%find-position-if ir2-hook) ((predicate sequence from-end start end key) node) (check-sequence-ranges sequence start end node)) -(defoptimizer (%find-position-if-not ir2-hook) ((predicate sequence from-end start end key) node block) - (declare (ignore predicate from-end key block)) +(defoptimizer (%find-position-if-not ir2-hook) ((predicate sequence from-end start end key) node) (check-sequence-ranges sequence start end node)) -(defoptimizer (fill ir2-hook) ((sequence item &key start end) node block) - (declare (ignore item block)) +(defoptimizer (fill ir2-hook) ((sequence item &key start end) node) (check-sequence-ranges sequence start end node)) -(defoptimizer (search ir2-hook) ((sub-sequence1 main-sequence2 &key start1 end1 start2 end2 &allow-other-keys) node block) - (declare (ignore block)) +(defoptimizer (search ir2-hook) ((sub-sequence1 main-sequence2 &key start1 end1 start2 end2 &allow-other-keys) node) (check-sequence-ranges sub-sequence1 start1 end1 node 1 'sub-sequence1) (check-sequence-ranges main-sequence2 start2 end2 node 2 'main-sequence2)) -(defoptimizer (mismatch ir2-hook) ((sequence1 sequence2 &key start1 end1 start2 end2 &allow-other-keys) node block) - (declare (ignore block)) +(defoptimizer (mismatch ir2-hook) ((sequence1 sequence2 &key start1 end1 start2 end2 &allow-other-keys) node) (check-sequence-ranges sequence1 start1 end1 node 1 'sequence1) (check-sequence-ranges sequence2 start2 end2 node 2 'sequence2)) @@ -1326,8 +1316,7 @@ :node node) (transform-replace nil node))) -(defoptimizer (replace ir2-hook) ((seq1 seq2 &key start1 end1 start2 end2) node block) - (declare (ignore block)) +(defoptimizer (replace ir2-hook) ((seq1 seq2 &key start1 end1 start2 end2) node) (flet ((element-type (lvar) (type-array-element-type (lvar-type lvar)))) (let ((type1 (element-type seq1)) @@ -1352,9 +1341,7 @@ (type-specifier type1) (type-specifier type2)))))))) -(defoptimizer (%make-array ir2-hook) ((dimensions widetag n-bits &key initial-contents &allow-other-keys) - node block) - (declare (ignore dimensions n-bits block)) +(defoptimizer (%make-array ir2-hook) ((dimensions widetag n-bits &key initial-contents &allow-other-keys) node) (when (and (constant-lvar-p widetag) initial-contents) (let* ((saetp (find (lvar-value widetag) sb-vm:*specialized-array-element-type-properties* @@ -1392,8 +1379,7 @@ (type-specifier seq-type)))))))) (macrolet ((def (name) - `(defoptimizer (,name ir2-hook) ((new x seq &key start end &allow-other-keys) node block) - (declare (ignore x block)) + `(defoptimizer (,name ir2-hook) ((new x seq &key start end &allow-other-keys) node) (check-sequence-ranges seq start end node) (check-sequence-item new seq node "Can't substitute ~a into ~a")))) (def substitute) @@ -1403,17 +1389,14 @@ (def nsubstitute-if) (def nsubstitute-if-not)) -(defoptimizer (vector-fill* ir2-hook) ((seq item start end) node block) - (declare (ignore block)) +(defoptimizer (vector-fill* ir2-hook) ((seq item start end) node) (check-sequence-ranges seq start end node) (check-sequence-item item seq node "Can't fill ~a into ~a")) -(defoptimizer (vector-push ir2-hook) ((item vector) node block) - (declare (ignore block)) +(defoptimizer (vector-push ir2-hook) ((item vector) node) (check-sequence-item item vector node "Can't push ~a into ~a")) -(defoptimizer (vector-push-extend ir2-hook) ((item vector &optional min-extension) node block) - (declare (ignore block min-extension)) +(defoptimizer (vector-push-extend ir2-hook) ((item vector &optional min-extension) node) (check-sequence-item item vector node "Can't push ~a into ~a")) (defun check-concatenate (type sequences node &optional (description "concatenate")) @@ -1438,16 +1421,13 @@ :element-type type)) type)))))))) -(defoptimizer (%concatenate-to-string ir2-hook) ((&rest args) node block) - (declare (ignore block)) +(defoptimizer (%concatenate-to-string ir2-hook) ((&rest args) node) (check-concatenate 'string args node)) -(defoptimizer (%concatenate-to-base-string ir2-hook) ((&rest args) node block) - (declare (ignore block)) +(defoptimizer (%concatenate-to-base-string ir2-hook) ((&rest args) node) (check-concatenate 'base-string args node)) -(defoptimizer (%concatenate-to-vector ir2-hook) ((widetag &rest args) node block) - (declare (ignore block)) +(defoptimizer (%concatenate-to-vector ir2-hook) ((widetag &rest args) node) (when (constant-lvar-p widetag) (check-concatenate (sb-vm:saetp-ctype (find (lvar-value widetag) @@ -1455,8 +1435,7 @@ :key #'sb-vm:saetp-typecode)) args node))) -(defoptimizer (merge ir2-hook) ((type sequence1 sequence2 predicate &key &allow-other-keys) node block) - (declare (ignore predicate block)) +(defoptimizer (merge ir2-hook) ((type sequence1 sequence2 predicate &key &allow-other-keys) node) (when (constant-lvar-p type) (check-concatenate (lvar-value type) (list sequence1 sequence2) node "merge"))) @@ -2972,7 +2951,6 @@ (give-up-ir1-transform))))) (defoptimizer (union derive-type) ((list1 list2 &rest args)) - (declare (ignore args)) (let ((cons-type (specifier-type 'cons))) (if (or (csubtypep (lvar-type list1) cons-type) (csubtypep (lvar-type list2) cons-type)) @@ -2980,7 +2958,6 @@ (specifier-type 'list)))) (defoptimizer (nunion derive-type) ((list1 list2 &rest args)) - (declare (ignore args)) (let ((cons-type (specifier-type 'cons))) (if (or (csubtypep (lvar-type list1) cons-type) (csubtypep (lvar-type list2) cons-type)) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 61ecfc44ce..7aca09265e 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -1457,7 +1457,6 @@ #'sb-xc:*)) (defoptimizer (%multiply-high derive-type) ((x y) node) - (declare (ignore x y)) (%signed-multiply-high-derive-type-optimizer node)) (defun /-derive-type-aux (x y same-arg) @@ -2224,7 +2223,6 @@ (t `(,high)))))) (defoptimizer (random derive-type) ((bound &optional state)) - (declare (ignore state)) (one-arg-derive-type bound #'random-derive-type-aux nil)) ;;;; miscellaneous derive-type methods @@ -2419,7 +2417,6 @@ (xform spec env int '%deposit-field newbyte))) (defoptimizer (%ldb derive-type) ((size posn num)) - (declare (ignore posn num)) (let ((size (lvar-type size))) (if (and (numeric-type-p size) (csubtypep size (specifier-type 'integer))) @@ -2430,7 +2427,6 @@ *universal-type*))) (defoptimizer (%mask-field derive-type) ((size posn num)) - (declare (ignore num)) (let ((size (lvar-type size)) (posn (lvar-type posn))) (if (and (numeric-type-p size) @@ -2477,11 +2473,9 @@ `(unsigned-byte* ,raw-bit-count))))))))) (defoptimizer (%dpb derive-type) ((newbyte size posn int)) - (declare (ignore newbyte)) (%deposit-field-derive-type-aux size posn int)) (defoptimizer (%deposit-field derive-type) ((newbyte size posn int)) - (declare (ignore newbyte)) (%deposit-field-derive-type-aux size posn int)) (deftransform %ldb ((size posn int) (fixnum fixnum integer) word) @@ -2531,7 +2525,6 @@ (logand int (lognot mask))))) (defoptimizer (mask-signed-field derive-type) ((size x)) - (declare (ignore x)) (let ((size (lvar-type size))) (if (numeric-type-p size) (let ((size-high (numeric-type-high size))) @@ -2914,7 +2907,6 @@ (defoptimizer (truncate constraint-propagate) ((x y) node gen) - (declare (ignore node x)) (when (csubtypep (lvar-type y) (specifier-type 'rational)) (let ((var (ok-lvar-lambda-var y gen))) (when var @@ -2922,7 +2914,6 @@ (defoptimizer (/ constraint-propagate) ((x y) node gen) - (declare (ignore node x)) (when (csubtypep (lvar-type y) (specifier-type 'rational)) (let ((var (ok-lvar-lambda-var y gen))) (when var @@ -4640,7 +4631,6 @@ (lambda (node) (check-format-args node fun arg-n nil))))) (defoptimizer (format derive-type) ((dest control &rest args)) - (declare (ignore control args)) (when (lvar-value-is-nil dest) (specifier-type 'simple-string))) @@ -4840,7 +4830,6 @@ result-typeoid)))))) (defoptimizer (compile derive-type) ((nameoid function)) - (declare (ignore function)) (when (csubtypep (lvar-type nameoid) (specifier-type 'null)) (values-specifier-type '(values function boolean boolean)))) @@ -5032,8 +5021,7 @@ ;;; Can fold only when time-zone is supplied. (defoptimizer (encode-universal-time optimizer) - (#1=(second minute hour date month year time-zone) node) - (declare (ignore . #1#)) + ((second minute hour date month year time-zone) node) (when (every #'constant-lvar-p (basic-combination-args node)) (constant-fold-call node) t)) @@ -5149,7 +5137,6 @@ #+sb-thread (progn (defoptimizer (sb-thread::call-with-mutex derive-type) ((function mutex waitp timeout)) - (declare (ignore mutex)) (let ((type (lvar-fun-type function))) (when (fun-type-p type) (let ((null-p (not (and (constant-lvar-p waitp) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 04f8f28639..3966bf7977 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -140,8 +140,7 @@ (error "Class not yet defined: ~S" name)))) (defoptimizer (%typep-wrapper constraint-propagate-if) - ((test-value variable type) node gen) - (declare (ignore test-value gen)) + ((test-value variable type) node) (aver (constant-lvar-p type)) (let ((type (lvar-value type))) (values variable (if (ctype-p type) @@ -174,7 +173,6 @@ nil) (defoptimizer (%type-constraint constraint-propagate) ((x type) node gen) - (declare (ignore node)) (let ((var (ok-lvar-lambda-var x gen))) (when var (let ((type (lvar-value type))) diff --git a/src/compiler/x86-64/c-call.lisp b/src/compiler/x86-64/c-call.lisp index 8860761529..a711d3a190 100644 --- a/src/compiler/x86-64/c-call.lisp +++ b/src/compiler/x86-64/c-call.lisp @@ -201,7 +201,6 @@ (foldable flushable movable)) (defoptimizer (sign-extend derive-type) ((x size)) - (declare (ignore x)) (when (sb-c:constant-lvar-p size) (specifier-type `(signed-byte ,(sb-c:lvar-value size))))) From 9805803bce57f987de2e12c5d25b890ae2863998 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 10 Jun 2022 20:45:06 +0300 Subject: [PATCH 3490/4023] Add DEFOPTIMIZERS for defining optimizers for multiple names. Instead of using MACROLET, and it shares the function. --- src/compiler/array-tran.lisp | 24 ++++---- src/compiler/macros.lisp | 18 ++++++ src/compiler/seqtran.lisp | 109 +++++++++++++---------------------- 3 files changed, 70 insertions(+), 81 deletions(-) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index dce40e8931..32ab5e06f5 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -229,12 +229,11 @@ (defoptimizer ((setf aref) derive-type) ((new-value array &rest subscripts)) (assert-new-value-type new-value array)) -(macrolet ((define (name) - `(defoptimizer (,name derive-type) ((array index)) - (derive-aref-type array)))) - (define hairy-data-vector-ref) - (define hairy-data-vector-ref/check-bounds) - (define data-vector-ref)) +(defoptimizers derive-type + (hairy-data-vector-ref hairy-data-vector-ref/check-bounds + data-vector-ref) + ((array index)) + (derive-aref-type array)) #+(or x86 x86-64) (defoptimizer (data-vector-ref-with-offset derive-type) ((array index offset)) @@ -243,13 +242,12 @@ (defoptimizer (vector-pop derive-type) ((array)) (derive-aref-type array)) -(macrolet ((define (name) - `(defoptimizer (,name derive-type) ((array index new-value)) - (assert-new-value-type new-value array)))) - (define hairy-data-vector-set) - (define hairy-data-vector-set/check-bounds) - ;; DATA-VECTOR-SET is never used for value, so it doesn't need a type deriver. - ) +(defoptimizers derive-type + (hairy-data-vector-set + hairy-data-vector-set/check-bounds) + ;; DATA-VECTOR-SET is never used for value, so it doesn't need a type deriver. + ((array index new-value)) + (assert-new-value-type new-value array)) ;;; Figure out the type of the data vector if we know the argument ;;; element type. diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index 83f3342ce0..24ba69cfe3 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -430,6 +430,24 @@ (symbolicate "FUN-INFO-" (second what))) (fun-info-or-lose ',(first what))) #',name)))))))) + +(defmacro defoptimizers (kind names (lambda-list + &optional (node (gensym)) + &rest vars) + &body body) + (let ((optimizer-name (symbolicate (car names) + "-" + kind + "-OPTIMIZER"))) + `(progn + (defoptimizer ,optimizer-name + (,lambda-list ,node ,@vars) + ,@body) + ,@(loop for name in names + collect `(setf (,(let ((*package* (sb-xc:symbol-package 'fun-info))) + (symbolicate "FUN-INFO-" kind)) + (fun-info-or-lose ',name)) + #',optimizer-name))))) ;;;; IR groveling macros diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 9f38a87879..e7cb2cb837 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1057,69 +1057,46 @@ (type-specifier start-type) suffix (type-specifier end-type)))))))) +(defoptimizers ir2-hook + (string=* string<* string>* string<=* string>=* + %sp-string-compare simple-base-string= + #+sb-unicode simple-character-string=) + ((string1 string2 start1 end1 start2 end2) node) + (check-sequence-ranges string1 start1 end1 node 1 'string1) + (check-sequence-ranges string2 start2 end2 node 2 'string2)) + +(defoptimizers ir2-hook + (string-equal string-not-equal string-greaterp string-lessp) + ((string1 string2 &key start1 end1 start2 end2) node) + (check-sequence-ranges string1 start1 end1 node 1 'string1) + (check-sequence-ranges string2 start2 end2 node 2 'string2)) + +(defoptimizers ir2-hook + (string-downcase string-upcase + nstring-downcase nstring-upcase + string-capitalize nstring-capitalize) + ((string &key start end) node) + (check-sequence-ranges string start end node)) + +(defoptimizers ir2-hook + (find find-if find-if-not position position-if position-if-not + remove remove-if remove-if-not delete delete-if delete-if-not + count count-if count-if-not reduce + remove-duplicates delete-duplicates) + ((x sequence &key start end &allow-other-keys) node) + (check-sequence-ranges sequence start end node)) -(macrolet ((def (name) - `(defoptimizer (,name ir2-hook) ((string1 string2 start1 end1 start2 end2) node) - (check-sequence-ranges string1 start1 end1 node 1 'string1) - (check-sequence-ranges string2 start2 end2 node 2 'string2)))) - (def string=*) - (def string<*) - (def string>*) - (def string<=*) - (def string>=*) - (def %sp-string-compare) - (def simple-base-string=) - #+sb-unicode - (def simple-character-string=)) - -(macrolet ((def (name) - `(defoptimizer (,name ir2-hook) ((string1 string2 &key start1 end1 start2 end2) node) - (check-sequence-ranges string1 start1 end1 node 1 'string1) - (check-sequence-ranges string2 start2 end2 node 2 'string2)))) - (def string-equal) - (def string-not-equal) - (def string-greaterp) - (def string-lessp)) - -(macrolet ((def (name) - `(defoptimizer (,name ir2-hook) ((string &key start end) node) - (check-sequence-ranges string start end node)))) - (def string-downcase) - (def string-upcase) - (def nstring-downcase) - (def nstring-upcase) - (def string-capitalize) - (def nstring-capitalize)) - -(macrolet ((def (name &optional no-arg) - `(defoptimizer (,name ir2-hook) ((,@(unless no-arg '(x)) sequence &key start end &allow-other-keys) node) - (check-sequence-ranges sequence start end node)))) - (def find) - (def find-if) - (def find-if-not) - (def position) - (def position-if) - (def position-if-not) - (def remove) - (def remove-if) - (def remove-if-not) - (def delete) - (def delete-if) - (def delete-if-not) - (def count) - (def count-if) - (def count-if-not) - (def reduce) - (def remove-duplicates t) - (def delete-duplicates t)) - -(defoptimizer (%find-position ir2-hook) ((item sequence from-end start end key test) node) +(defoptimizers ir2-hook + (remove-duplicates delete-duplicates) + ((sequence &key start end &allow-other-keys) node) (check-sequence-ranges sequence start end node)) -(defoptimizer (%find-position-if ir2-hook) ((predicate sequence from-end start end key) node) +(defoptimizer (%find-position ir2-hook) ((item sequence from-end start end key test) node) (check-sequence-ranges sequence start end node)) -(defoptimizer (%find-position-if-not ir2-hook) ((predicate sequence from-end start end key) node) +(defoptimizers ir2-hook + (%find-position-if %find-position-if-not) + ((predicate sequence from-end start end key) node) (check-sequence-ranges sequence start end node)) (defoptimizer (fill ir2-hook) ((sequence item &key start end) node) @@ -1378,16 +1355,12 @@ (type-specifier item-type) (type-specifier seq-type)))))))) -(macrolet ((def (name) - `(defoptimizer (,name ir2-hook) ((new x seq &key start end &allow-other-keys) node) - (check-sequence-ranges seq start end node) - (check-sequence-item new seq node "Can't substitute ~a into ~a")))) - (def substitute) - (def substitute-if) - (def substitute-if-not) - (def nsubstitute) - (def nsubstitute-if) - (def nsubstitute-if-not)) +(defoptimizers ir2-hook + (substitute substitute-if substitute-if-not + nsubstitute nsubstitute-if nsubstitute-if-not) + ((new x seq &key start end &allow-other-keys) node) + (check-sequence-ranges seq start end node) + (check-sequence-item new seq node "Can't substitute ~a into ~a")) (defoptimizer (vector-fill* ir2-hook) ((seq item start end) node) (check-sequence-ranges seq start end node) From 978db15c80d97ef85577c9cd573e66ccfd77521c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 10 Jun 2022 22:04:45 -0400 Subject: [PATCH 3491/4023] Avoid dumping a fixup name for nameless fixups The nameless ones are :GC-BARRIER and :CODE-OBJECT. Additionally, for :ASSEMBLY-ROUTINE fixups, use a small numeric id so that the name does not need to be dumped as a symbol. --- src/code/load.lisp | 36 +++++---- src/code/target-load.lisp | 7 +- src/compiler/dump.lisp | 74 ++++++++++------- src/compiler/generic/genesis.lisp | 110 ++++++++++++++------------ src/compiler/generic/target-core.lisp | 43 ++++++---- 5 files changed, 154 insertions(+), 116 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 1ba14b638f..985eaa1ffc 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -136,6 +136,11 @@ (partial-source-info nil :type (or null sb-c::debug-source))) (declaim (freeze-type fasl-input)) +;;; Lisp assembler routines are named by Lisp symbols, not strings, +;;; and so can be compared by EQ. +(define-load-time-global *assembler-routines* nil) +#-sb-xc-host (declaim (code-component *assembler-routines*)) + ;;; Output the current number of semicolons after a fresh-line. ;;; FIXME: non-mnemonic name (defun load-fresh-line () @@ -439,7 +444,8 @@ (when (functionp function) (let ((oname (nth-value 2 (function-lambda-expression function)))) (when (and oname (not (eq oname name))) - (error "fop ~S with opcode ~D conflicts with fop ~S." + (cerror "Define it anyway" + "fop ~S with opcode ~D conflicts with fop ~S." name opcode oname)))) (let ((existing-opcode (get name 'opcode))) (when (and existing-opcode (/= existing-opcode opcode)) @@ -1082,13 +1088,16 @@ ;;; fasl file header.) (define-load-time-global *show-new-code* nil) -(define-fop 17 :not-host (fop-load-code ((:operands header n-code-bytes n-fixups))) +(define-fop 17 :not-host (fop-load-code ((:operands header n-code-bytes n-fixup-elts))) + ;; The stack looks like: + ;; ... | constant0 constant1 ... constantN | DEBUG-INFO | FIXUPS-ITEMS .... || + ;; | <--------- n-constants ---------> | | <-- n-fixup-elts -> || (let* ((n-simple-funs (read-unsigned-byte-32-arg (fasl-input-stream))) (n-named-calls (read-unsigned-byte-32-arg (fasl-input-stream))) (n-boxed-words (ash header -1)) - (n-constants (- n-boxed-words sb-vm:code-constants-offset))) - ;; stack has (at least) N-CONSTANTS words plus debug-info - (with-fop-stack ((stack (operand-stack)) ptr (1+ n-constants)) + (n-constants (- n-boxed-words sb-vm:code-constants-offset)) + (stack-elts-consumed (+ n-constants 1 n-fixup-elts))) + (with-fop-stack ((stack (operand-stack)) ptr stack-elts-consumed) ;; We've already ensured that all FDEFNs the code uses exist. ;; This happened by virtue of calling fop-fdefn for each. (let ((stack-index (+ ptr (* n-simple-funs sb-vm:code-slots-per-simple-fun)))) @@ -1116,9 +1125,10 @@ ;; so we can't assign serial# until after all raw bytes are copied in. (sb-c::assign-code-serialno code) (sb-thread:barrier (:write)) - ;; Assign debug-info last. A code object that has no debug-info will never + ;; Assign debug-info. A code object that has no debug-info will never ;; have its fun table accessed in conservative_root_p() or pin_object(). (setf (%code-debug-info code) (svref stack (+ ptr n-constants))) + (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts) (setf (sb-c::debug-info-source (%code-debug-info code)) (%fasl-input-partial-source-info (fasl-input))) ;; Boxed constants can be assigned only after figuring out where the range @@ -1127,11 +1137,10 @@ (let* ((header-index sb-vm:code-constants-offset) (stack-index ptr)) (declare (type index header-index stack-index)) - (dotimes (n n-simple-funs) - (dotimes (i sb-vm:code-slots-per-simple-fun) - (setf (code-header-ref code header-index) (svref stack stack-index)) - (incf header-index) - (incf stack-index))) + (dotimes (n (* n-simple-funs sb-vm:code-slots-per-simple-fun)) + (setf (code-header-ref code header-index) (svref stack stack-index)) + (incf header-index) + (incf stack-index)) (dotimes (i n-named-calls) (sb-c::set-code-fdefn code header-index (svref stack stack-index)) (incf header-index) @@ -1139,13 +1148,10 @@ (do () ((>= header-index n-boxed-words)) (setf (code-header-ref code header-index) (svref stack stack-index)) (incf header-index) - (incf stack-index))) - ;; Now apply fixups. The fixups to perform are popped from the fasl stack. - (sb-c::apply-fasl-fixups stack code n-fixups)) + (incf stack-index)))) (when *show-new-code* (let ((*print-pretty* nil)) (format t "~&New code(~Db,load): ~A~%" (code-object-size code) code))) - #-sb-xc-host (when (typep (code-header-ref code (1- n-boxed-words)) '(cons (eql sb-c::coverage-map))) ;; Record this in the global list of coverage-instrumented code. diff --git a/src/code/target-load.lisp b/src/code/target-load.lisp index ca3cb26b57..fddd86e51d 100644 --- a/src/code/target-load.lisp +++ b/src/code/target-load.lisp @@ -351,11 +351,6 @@ ;;;; linkage fixups -;;; Lisp assembler routines are named by Lisp symbols, not strings, -;;; and so can be compared by EQ. -(define-load-time-global *assembler-routines* nil) -(declaim (code-component *assembler-routines*)) - (defun calc-asm-routine-bounds () (loop for v being each hash-value of (%code-debug-info *assembler-routines*) minimize (car v) into min @@ -383,9 +378,11 @@ (count (length vector)) (ht (make-hash-table))) ; keys are symbols (rplaca (%code-debug-info code) ht) + (setf *asm-routine-index-to-name* (make-array (1+ (length vector)))) (dotimes (i count) (destructuring-bind (name . offset) (svref vector i) (let ((next-offset (if (< (1+ i) count) (cdr (svref vector (1+ i))) size))) + (setf (aref *asm-routine-index-to-name* (1+ i)) name) ;; Must be in ascending order, but one address can have more than one name. (aver (>= next-offset offset)) ;; store inclusive bounds on PC offset range and the function index diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 84509d8404..4bbf27078f 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1042,39 +1042,56 @@ #'equalp) ;;; Pack the aspects of a fixup into an integer. +;;; DATA is for asm routine fixups. The routine can be represented in 7 bits, +;;; so the fixup can be reduced to one word instead of an integer and a symbol. (declaim (inline !pack-fixup-info)) -(defun !pack-fixup-info (offset kind flavor) +(defun !pack-fixup-info (offset kind flavor data) ;; ARM gets "error during constant folding" #+arm (declare (notinline position)) - (logior (ash (the (mod 16) (or (position flavor +fixup-flavors+) - (error "Bad fixup flavor ~s" flavor))) - 3) + (logior ;; 3 bits (the (mod 8) (or (position kind +fixup-kinds+) (error "Bad fixup kind ~s" kind))) - (ash offset 7))) + ;; 4 bits + (ash (the (mod 16) (or (position flavor +fixup-flavors+) + (error "Bad fixup flavor ~s" flavor))) + 3) + ;; 7 bits + (ash (the (mod 128) data) 7) + ;; whatever it needs + (ash offset 14))) ;;; Unpack an integer from DUMP-FIXUPs. Shared by genesis and target fasloader (declaim (inline !unpack-fixup-info)) -(defun !unpack-fixup-info (packed-info) ; Return (VALUES offset kind flavor) +(defun !unpack-fixup-info (packed-info) ; Return (VALUES offset kind flavor data) ;; ARM gets "error during constant folding" #+arm (declare (notinline aref)) - (values (ash packed-info -7) + (values (ash packed-info -14) (aref +fixup-kinds+ (ldb (byte 3 0) packed-info)) - (aref +fixup-flavors+ (ldb (byte 4 3) packed-info)))) + (aref +fixup-flavors+ (ldb (byte 4 3) packed-info)) + (ldb (byte 7 7) packed-info))) ;;; Dump all the fixups. ;;; - foreign (C) symbols: named by a string ;;; - code object references: don't need a name. ;;; - everything else: a symbol for the name. -(defun dump-fixups (fixups fasl-output &aux (n 0)) +(defun dump-fixups (fixups alloc-points fasl-output &aux (nwords 1)) (declare (list fixups) (type fasl-output fasl-output)) - (dolist (note fixups n) + (dump-object alloc-points fasl-output) + (dolist (note fixups nwords) (let* ((fixup (fixup-note-fixup note)) (name (fixup-name fixup)) (flavor (fixup-flavor fixup)) - (info (!pack-fixup-info (fixup-note-position note) - (fixup-note-kind note) - flavor)) + (named (not (member flavor '(:code-object :gc-barrier)))) + (data + (or #-sb-xc-host ; ASM routine indices aren't known to the cross-compiler + (when (member flavor '(:assembly-routine :assembly-routine*)) + (setq named nil) + (the (integer 1 *) ; data can't be 0 + (cddr (gethash name (%code-debug-info *assembler-routines*))))) + 0)) + (info + (!pack-fixup-info (fixup-note-position note) (fixup-note-kind note) + flavor data)) (operand (ecase flavor ((:code-object :gc-barrier) (the null name)) @@ -1098,9 +1115,9 @@ (the symbol name)) ((:foreign :foreign-dataref) (the string name)) ((:named-call :static-call) name)))) - (dump-object operand fasl-output) - (dump-integer info fasl-output)) - (incf n))) + (dump-object info fasl-output) + (incf nwords (cond (named (dump-object operand fasl-output) 2) + (t 1)))))) ;;; Dump out the constant pool and code-vector for component, push the ;;; result in the table, and return the offset. @@ -1118,12 +1135,10 @@ (declare (type component component) (type index code-length) (type fasl-output fasl-output)) - (let* ((n-fixups (dump-fixups fixups fasl-output)) - (2comp (component-info component)) + (let* ((2comp (component-info component)) (constants (sb-c:ir2-component-constants 2comp)) (header-length (length constants)) (n-named-calls 0)) - (dump-object alloc-points fasl-output) (collect ((patches) (named-constants)) ;; Dump the constants, noting any :ENTRY constants that have to @@ -1178,10 +1193,12 @@ (push (dump-to-table fasl-output) (fasl-output-debug-info fasl-output))) - (dump-fop 'fop-load-code fasl-output - (logior (ash header-length 1) - (if (sb-c::code-immobile-p component) 1 0)) - code-length n-fixups) + (let ((n-fixup-elts (dump-fixups fixups alloc-points fasl-output))) + (dump-fop 'fop-load-code fasl-output + (logior (ash header-length 1) + (if (sb-c::code-immobile-p component) 1 0)) + code-length + n-fixup-elts)) ;; Fasl dumper/loader convention allows at most 3 integer args. ;; Others have to be written with explicit calls. (dump-integer-as-n-bytes (length (sb-c::ir2-component-entries 2comp)) @@ -1206,8 +1223,7 @@ ;;; This is only called from assemfile, which doesn't exist in the target. #+sb-xc-host (defun dump-assembler-routines (code-segment octets fixups alloc-points routines file) - (let ((n-fixups (dump-fixups fixups file))) - (dump-object alloc-points file) + (let ((n-fixup-elts (dump-fixups fixups alloc-points file))) ;; The name -> address table has to be created before applying fixups ;; because a fixup may refer to an entry point in the same code component. ;; So these go on the stack last, i.e. nearest the top. @@ -1215,12 +1231,12 @@ ;; except possibly when there are multiple entry points to one routine (dolist (routine (reverse routines)) (dump-object (car routine) file) - (dump-integer (+ (label-position (cadr routine)) - (caddr routine)) + (dump-integer (+ (label-position (cadr routine)) (caddr routine)) file)) (dump-fop 'fop-assembler-code file) - (dolist (word (list (length octets) (length routines) n-fixups)) - (dump-word word file)) + (dump-word (length routines) file) + (dump-word (length octets) file) + (dump-word n-fixup-elts file) (write-segment-contents code-segment (fasl-output-stream file)) (dump-pop file))) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index df12df2a14..5c333b128e 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1042,6 +1042,7 @@ core and return a descriptor to it." (declaim (inline cold-svref)) (defun cold-svref (vector i) (declare (type index i)) + (aver (< i (cold-vector-len vector))) (read-wordindexed vector (+ i sb-vm:vector-data-offset))) (defun vector-from-core (descriptor &optional (transform #'identity)) (let* ((len (cold-vector-len descriptor)) @@ -1606,8 +1607,10 @@ core and return a descriptor to it." ;; Look up the target's descriptor for #'FUN where FUN is a host symbol. (defun cold-symbol-function (symbol &optional (errorp t)) - (declare (symbol symbol)) - (let ((f (cold-fdefn-fun (ensure-cold-fdefn symbol)))) + (let* ((symbol (if (symbolp symbol) + symbol + (warm-symbol symbol))) + (f (cold-fdefn-fun (ensure-cold-fdefn symbol)))) (cond ((not (cold-null f)) f) (errorp (error "Expected a definition for ~S in cold load" symbol)) (t nil)))) @@ -2676,30 +2679,34 @@ Legal values for OFFSET are -4, -8, -12, ..." sb-vm:other-pointer-lowtag)) #-untagged-fdefns (write-wordindexed code index fdefn)) -(define-cold-fop (fop-load-code (header code-size n-fixups)) - (let* ((n-entries (read-unsigned-byte-32-arg (fasl-input-stream))) +(define-cold-fop (fop-load-code (header n-code-bytes n-fixup-elts)) + (let* ((n-simple-funs (read-unsigned-byte-32-arg (fasl-input-stream))) (n-named-calls (read-unsigned-byte-32-arg (fasl-input-stream))) + (n-boxed-words (ash header -1)) + (n-constants (- n-boxed-words sb-vm:code-constants-offset)) + (stack-elts-consumed (+ n-constants 1 n-fixup-elts)) (immobile (oddp header)) ; decode the representation used by dump ;; The number of constants is rounded up to even (if required) ;; to ensure that the code vector will be properly aligned. - (n-boxed-words (ash header -1)) (aligned-n-boxed-words (align-up n-boxed-words sb-c::code-boxed-words-align)) - (debug-info (pop-stack)) + (stack (%fasl-input-stack (fasl-input))) + (stack-index (fop-stack-pop-n stack stack-elts-consumed)) (des (allocate-cold-descriptor (or #+immobile-code (and immobile *immobile-varyobj*) *dynamic*) - (+ (ash aligned-n-boxed-words sb-vm:word-shift) code-size) + (+ (ash aligned-n-boxed-words sb-vm:word-shift) n-code-bytes) sb-vm:other-pointer-lowtag :code))) (declare (ignorable immobile)) - (write-code-header-words des aligned-n-boxed-words code-size n-named-calls) - (write-wordindexed des sb-vm:code-debug-info-slot debug-info) + (write-code-header-words des aligned-n-boxed-words n-code-bytes n-named-calls) + (write-wordindexed des sb-vm:code-debug-info-slot + (svref stack (+ stack-index n-constants))) (let* ((start (+ (descriptor-byte-offset des) (ash aligned-n-boxed-words sb-vm:word-shift))) - (end (+ start code-size))) + (end (+ start n-code-bytes))) (read-bigvec-as-sequence-or-die (descriptor-mem des) (fasl-input-stream) :start start :end end) - (aver (= (code-n-entries des) n-entries)) + (aver (= (code-n-entries des) n-simple-funs)) (let ((jumptable-word (read-bits-wordindexed des aligned-n-boxed-words))) (aver (zerop (ash jumptable-word -14))) ;; assign serialno @@ -2710,7 +2717,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (when *show-pre-fixup-code-p* (format *trace-output* "~&LOAD-CODE: ~d header words, ~d code bytes.~%" - n-boxed-words code-size) + n-boxed-words n-code-bytes) (do ((i start (+ i sb-vm:n-word-bytes))) ((>= i end)) (format *trace-output* @@ -2719,10 +2726,8 @@ Legal values for OFFSET are -4, -8, -12, ..." (* 2 sb-vm:n-word-bytes) (bvref-word (descriptor-mem des) i))))) - (let* ((header-index sb-vm:code-constants-offset) - (stack (%fasl-input-stack (fasl-input))) - (n-constants (- n-boxed-words sb-vm:code-constants-offset)) - (stack-index (fop-stack-pop-n stack n-constants))) + (apply-fixups des stack (+ stack-index (1+ n-constants)) n-fixup-elts) + (let ((header-index sb-vm:code-constants-offset)) (declare (type index header-index stack-index)) (dotimes (fun-index (code-n-entries des)) (let ((fn (%code-entry-point des fun-index))) @@ -2752,8 +2757,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (write-wordindexed des header-index constant)))) (incf header-index) (incf stack-index))) - - (apply-fixups (%fasl-input-stack (fasl-input)) des n-fixups))) + des)) (defun resolve-deferred-known-funs () (dolist (item *deferred-known-fun-refs*) @@ -2770,9 +2774,9 @@ Legal values for OFFSET are -4, -8, -12, ..." (define-cold-fop (fop-assembler-code) (aver (not *cold-assembler-obj*)) - (let* ((length (read-word-arg (fasl-input-stream))) - (n-routines (read-word-arg (fasl-input-stream))) - (n-fixups (read-word-arg (fasl-input-stream))) + (let* ((n-routines (read-word-arg (fasl-input-stream))) + (length (read-word-arg (fasl-input-stream))) + (n-fixup-elts (read-word-arg (fasl-input-stream))) (rounded-length (round-up length (* 2 sb-vm:n-word-bytes))) (header-n-words (sb-c::asm-routines-boxed-header-nwords)) (space (or #+(and immobile-code (not metaspace)) *immobile-varyobj* @@ -2809,14 +2813,15 @@ Legal values for OFFSET are -4, -8, -12, ..." ;; at assembly time, they can all be sorted at this point. ;; We used to combine them with some magic in genesis. (setq *cold-assembler-routines* (sort table #'< :key #'cdr))) + (let ((stack (%fasl-input-stack (fasl-input)))) + (apply-fixups asm-code stack (fop-stack-pop-n stack n-fixup-elts) n-fixup-elts)) #+(or x86 x86-64) ; fill in the indirect call table (let ((index (code-header-words asm-code))) (dolist (item *cold-assembler-routines*) ;; Preincrement because we skip 1 word for the word containing ;; the number of absolute fixups that follow. (write-wordindexed/raw asm-code (incf index) - (lookup-assembler-reference (car item))))) - (apply-fixups (%fasl-input-stack (fasl-input)) asm-code n-fixups))) + (lookup-assembler-reference (car item))))))) ;; The partial source info is not needed during the cold load, since ;; it can't be interrupted. @@ -2827,48 +2832,53 @@ Legal values for OFFSET are -4, -8, -12, ..." (values)) ;;; Target variant of this is defined in 'target-load' -(defun apply-fixups (fop-stack code-obj n-fixups) - (let ((alloc-points (pop-fop-stack fop-stack))) - (when alloc-points - (cold-set 'sb-c::*!cold-allocation-patch-point* - (cold-cons (cold-cons code-obj alloc-points) - (cold-symbol-value 'sb-c::*!cold-allocation-patch-point*))))) - (dotimes (i n-fixups code-obj) - (binding* ((info (descriptor-fixnum (pop-fop-stack fop-stack))) - (sym (pop-fop-stack fop-stack)) - ((offset kind flavor) (!unpack-fixup-info info))) +(defun apply-fixups (code-obj fixups index count &aux (end (1- (+ index count)))) + (binding* ((alloc-points (svref fixups index) :exit-if-null)) + (cold-set 'sb-c::*!cold-allocation-patch-point* + (cold-cons (cold-cons code-obj alloc-points) + (cold-symbol-value (cold-intern + 'sb-c::*!cold-allocation-patch-point*))))) + (loop + (when (>= index end) (return)) + (binding* (((offset kind flavor) + (!unpack-fixup-info (descriptor-fixnum (svref fixups (incf index))))) + (name (cond ((member flavor '(:code-object :gc-barrier)) nil) + (t (svref fixups (incf index))))) + (string + (when (descriptor-p name) + (let ((widetag (logand (read-bits-wordindexed name 0) sb-vm:widetag-mask))) + (when (= widetag sb-vm:simple-base-string-widetag) + (base-string-from-core name)))))) (if (eq flavor :static-call) - (push (list sym kind code-obj offset) *cold-static-call-fixups*) + (push (list name kind code-obj offset) *cold-static-call-fixups*) (cold-fixup code-obj offset (ecase flavor - (:assembly-routine (lookup-assembler-reference sym)) - (:assembly-routine* (lookup-assembler-reference sym :indirect)) + (:assembly-routine (lookup-assembler-reference name)) + (:assembly-routine* (lookup-assembler-reference name :indirect)) (:asm-routine-nil-offset - (- (lookup-assembler-reference sym) sb-vm:nil-value)) - (:foreign - (linkage-table-note-symbol (base-string-from-core sym) nil)) - (:foreign-dataref - (linkage-table-note-symbol (base-string-from-core sym) t)) + (- (lookup-assembler-reference name) sb-vm:nil-value)) + (:foreign (linkage-table-note-symbol string nil)) + (:foreign-dataref (linkage-table-note-symbol string t)) (:code-object (descriptor-bits code-obj)) #+sb-thread ; ENSURE-SYMBOL-TLS-INDEX isn't defined otherwise - (:symbol-tls-index (ensure-symbol-tls-index sym)) - (:layout (cold-layout-descriptor-bits sym)) + (:symbol-tls-index (ensure-symbol-tls-index name)) + (:layout (cold-layout-descriptor-bits name)) (:layout-id ; SYM is a #<WRAPPER> - (cold-layout-id (gethash (descriptor-bits (->layout sym)) + (cold-layout-id (gethash (descriptor-bits (->layout name)) *cold-layout-by-addr*))) ;; The machine-dependent code decides how to patch in 'nbits' #+gencgc (:gc-barrier sb-vm::gencgc-card-table-index-nbits) (:immobile-symbol ;; an interned symbol is represented by its host symbol, ;; but an uninterned symbol is a descriptor. - (descriptor-bits (if (symbolp sym) (cold-intern sym) sym))) - (:symbol-value - (descriptor-bits (cold-symbol-value sym))) + (descriptor-bits (if (symbolp name) (cold-intern name) name))) + (:symbol-value (descriptor-bits (cold-symbol-value name))) (:named-call - (+ (descriptor-bits (ensure-cold-fdefn sym)) - (- 2 sb-vm:other-pointer-lowtag)))) - kind flavor))))) + (+ (descriptor-bits (ensure-cold-fdefn name)) + (- 2 sb-vm:other-pointer-lowtag)))) ; wtf? + kind flavor)))) + code-obj) ;;;; sanity checking space layouts diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index c0ce00b8e9..eaa43d2149 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -71,6 +71,9 @@ (* sb-vm:simple-fun-self-slot sb-vm:n-word-bytes)) (get-lisp-obj-address self)))) +(define-load-time-global sb-fasl::*asm-routine-index-to-name* #()) +(declaim (simple-vector sb-fasl::*asm-routine-index-to-name*)) + (flet ((fixup (code-obj offset name kind flavor preserved-lists statically-link-p) (declare (ignorable statically-link-p)) ;; NAME depends on the kind and flavor of fixup. @@ -144,18 +147,24 @@ ;; Return fixups amenable to static linking (aref preserved-lists 0))) - (defun apply-fasl-fixups (fop-stack code-obj n-fixups &aux (top (svref fop-stack 0))) + (defun apply-fasl-fixups (code-obj fixups index count &aux (end (1- (+ index count)))) (dx-let ((preserved (make-array 5 :initial-element nil))) - (macrolet ((pop-fop-stack () `(prog1 (svref fop-stack top) (decf top)))) - (binding* ((alloc-points (pop-fop-stack) :exit-if-null)) - (setf (gethash code-obj *allocation-patch-points*) alloc-points)) - (dotimes (i n-fixups (setf (svref fop-stack 0) top)) - (multiple-value-bind (offset kind flavor) - (sb-fasl::!unpack-fixup-info (pop-fop-stack)) - (fixup code-obj offset (pop-fop-stack) kind flavor preserved nil)))) + (awhen (svref fixups index) + (setf (gethash code-obj *allocation-patch-points*) it)) + (loop + (when (>= index end) (return)) + (binding* (((offset kind flavor data) + (sb-fasl::!unpack-fixup-info (svref fixups (incf index)))) + (name + (cond ((member flavor '(:code-object :gc-barrier)) nil) + ((and (plusp data) + (member flavor '(:assembly-routine :assembly-routine*))) + (aref sb-fasl::*asm-routine-index-to-name* data)) + (t (svref fixups (incf index)))))) + (fixup code-obj offset name kind flavor preserved nil))) (finish-fixups code-obj preserved))) - (defun apply-core-fixups (fixup-notes code-obj) + (defun apply-core-fixups (code-obj fixup-notes) (declare (list fixup-notes)) (dx-let ((preserved (make-array 5 :initial-element nil))) (dolist (note fixup-notes) @@ -291,16 +300,16 @@ (when (eq kind :named-call) (incf count))))))) (code-obj (allocate-code-object (component-mem-space component) n-named-calls nboxed length)) - (named-call-fixups + (bytes + (the (simple-array assembly-unit 1) (segment-contents-as-vector segment))) + (named-call-fixups)) ;; The following operations need the code pinned: ;; 1. copying into code-instructions (a SAP) ;; 2. apply-core-fixups and sanctify-for-execution ;; A very specific store order is necessary to allow using uninitialized memory ;; pages for code. Storing of the debug-info slot does not need the code pinned, ;; but that store must occur between steps 1 and 2. - (with-pinned-objects (code-obj) - (let ((bytes (the (simple-array assembly-unit 1) - (segment-contents-as-vector segment)))) + (with-pinned-objects (code-obj) ;; Note that this does not have to take care to ensure atomicity ;; of the store to the final word of unboxed data. Even if BYTE-BLT were ;; interrupted in between the store of any individual byte, this code @@ -313,9 +322,6 @@ (with-pinned-objects (bytes) (sb-vm::jit-memcpy (code-instructions code-obj) (vector-sap bytes) (length bytes))) - ;; Serial# shares a word with the jump-table word count, - ;; so we can't assign serial# until after all raw bytes are copied in. - (assign-code-serialno code-obj)) ;; Enforce that the final unboxed data word is published to memory ;; before the debug-info is set. (sb-thread:barrier (:write)) @@ -326,7 +332,10 @@ ;; is valid. This store must occur prior to calling %CODE-ENTRY-POINT, and ;; applying fixups calls %CODE-ENTRY-POINT, so we have to do this before that. (setf (%code-debug-info code-obj) debug-info) - (apply-core-fixups fixup-notes code-obj)))) + (setq named-call-fixups (apply-core-fixups code-obj fixup-notes)) + ;; Serial# shares a word with the jump-table word count, + ;; so we can't assign serial# until after all raw bytes are copied in. + (assign-code-serialno code-obj)) (when alloc-points #+(and x86-64 sb-thread) From 70d627da6e9c7cb81b96d928c3c9771f3cf131a9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 10 Jun 2022 22:35:44 -0400 Subject: [PATCH 3492/4023] Fix 32-bit --- src/compiler/generic/genesis.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 5c333b128e..33cf227cf1 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2841,7 +2841,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (loop (when (>= index end) (return)) (binding* (((offset kind flavor) - (!unpack-fixup-info (descriptor-fixnum (svref fixups (incf index))))) + (!unpack-fixup-info (descriptor-integer (svref fixups (incf index))))) (name (cond ((member flavor '(:code-object :gc-barrier)) nil) (t (svref fixups (incf index))))) (string From 10cc928ac15df09b47c8f9b7675ab65825beaf19 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 10 Jun 2022 22:38:05 -0400 Subject: [PATCH 3493/4023] Fix "ignoring return value" warnings --- src/runtime/gencgc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 82cc71d408..078f028073 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -434,7 +434,7 @@ void gc_gen_report_to_file(int filedes, FILE *file) #endif #define OUTPUT(str, len) \ - {if (file) fwrite(str, 1, len, file); if (filedes>=0) write(filedes, str, len);} + {if (file) fwrite(str, 1, len, file); if (filedes>=0) ignore_value(write(filedes, str, len));} /* Print the heap stats. */ char header[] = From 60b572be2f0428ea486089652d0ffa440072d833 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 10 Jun 2022 22:43:47 -0400 Subject: [PATCH 3494/4023] Remove workaround for mystery problem Added in 29dd1ca859 but I tried building that now and didn't see the error. Probably an issue with the host at that revision. --- src/compiler/dump.lisp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 4bbf27078f..3516cc386b 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1046,8 +1046,6 @@ ;;; so the fixup can be reduced to one word instead of an integer and a symbol. (declaim (inline !pack-fixup-info)) (defun !pack-fixup-info (offset kind flavor data) - ;; ARM gets "error during constant folding" - #+arm (declare (notinline position)) (logior ;; 3 bits (the (mod 8) (or (position kind +fixup-kinds+) (error "Bad fixup kind ~s" kind))) @@ -1063,8 +1061,6 @@ ;;; Unpack an integer from DUMP-FIXUPs. Shared by genesis and target fasloader (declaim (inline !unpack-fixup-info)) (defun !unpack-fixup-info (packed-info) ; Return (VALUES offset kind flavor data) - ;; ARM gets "error during constant folding" - #+arm (declare (notinline aref)) (values (ash packed-info -14) (aref +fixup-kinds+ (ldb (byte 3 0) packed-info)) (aref +fixup-flavors+ (ldb (byte 4 3) packed-info)) From 337bbbf03bf16028870410ea195167a863d6c4a6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 11 Jun 2022 20:33:37 -0400 Subject: [PATCH 3495/4023] Provide signal context to gencgc_handle_wp_violation if relevant --- src/runtime/bsd-os.c | 2 +- src/runtime/gencgc-internal.h | 2 +- src/runtime/gencgc.c | 7 ++++--- src/runtime/haiku-os.c | 2 +- src/runtime/linux-os.c | 2 +- src/runtime/sunos-os.c | 2 +- src/runtime/win32-os.c | 2 +- src/runtime/x86-darwin-os.c | 2 +- 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index dbae160e1c..7981ced278 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -273,7 +273,7 @@ memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context) if (handle_safepoint_violation(context, fault_addr)) return; #endif - if (gencgc_handle_wp_violation(fault_addr)) return; + if (gencgc_handle_wp_violation(context, fault_addr)) return; if (!handle_guard_page_triggered(context,fault_addr)) lisp_memory_fault_error(context, fault_addr); diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index fd192809e8..73ec6a1633 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -36,7 +36,7 @@ static inline char *page_address(page_index_t page_num) { return (void*)(DYNAMIC_SPACE_START + (page_num * GENCGC_PAGE_BYTES)); } -int gencgc_handle_wp_violation(void *); +int gencgc_handle_wp_violation(void*, void*); #if N_WORD_BITS == 64 diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 078f028073..34d9f10d19 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5237,7 +5237,7 @@ boolean ignore_memoryfaults_on_unprotected_pages = 0; extern boolean continue_after_memoryfault_on_unprotected_pages; boolean continue_after_memoryfault_on_unprotected_pages = 0; -int gencgc_handle_wp_violation(void* fault_addr) +int gencgc_handle_wp_violation(void* context, void* fault_addr) { page_index_t page_index = find_page_index(fault_addr); @@ -5291,10 +5291,11 @@ int gencgc_handle_wp_violation(void* fault_addr) void lisp_backtrace(int frames); lisp_backtrace(10); fprintf(stderr, - "Fault @ %p, page %"PAGE_INDEX_FMT" (~WP) mark=%#x\n" + "Fault @ %p, PC=%p, page %"PAGE_INDEX_FMT" (~WP) mark=%#x gc_active=%d\n" " mixed_region=%p:%p\n" " page.scan_start: %p .words_used: %u .type: %d .gen: %d\n", - fault_addr, page_index, mark, + fault_addr, (void*)(context?os_context_pc(context):-1), page_index, + mark, gc_active_p, mixed_region->start_addr, mixed_region->end_addr, page_scan_start(page_index), page_words_used(page_index), diff --git a/src/runtime/haiku-os.c b/src/runtime/haiku-os.c index 796c8663c7..b4687ba64d 100644 --- a/src/runtime/haiku-os.c +++ b/src/runtime/haiku-os.c @@ -61,7 +61,7 @@ sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) /*fprintf(stderr, "SIGSEGV: pc=%p addr=%p\n", context->uc_mcontext.rip, info->si_addr);*/ os_vm_address_t addr = arch_get_bad_addr(signal, info, context); - if (gencgc_handle_wp_violation(addr)) return; + if (gencgc_handle_wp_violation(context, addr)) return; if (!handle_guard_page_triggered(context, addr)) interrupt_handle_now(signal, info, context); diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 12f82d7da1..3a5371be89 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -389,7 +389,7 @@ sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) #endif #ifdef LISP_FEATURE_GENCGC - if (gencgc_handle_wp_violation(addr)) return; + if (gencgc_handle_wp_violation(context, addr)) return; #else if (cheneygc_handle_wp_violation(context, addr)) return; #endif diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c index 98d9e6843a..8e23a82f17 100644 --- a/src/runtime/sunos-os.c +++ b/src/runtime/sunos-os.c @@ -66,7 +66,7 @@ sigsegv_handler(int signal, siginfo_t *info, os_context_t *context) { void* fault_addr = (void*)info->si_addr; - if (gencgc_handle_wp_violation(fault_addr)) return; + if (gencgc_handle_wp_violation(context, fault_addr)) return; if (!handle_guard_page_triggered(context, fault_addr)) lisp_memory_fault_error(context, fault_addr); diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index cc7e56803a..d04c1b8f3e 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -1140,7 +1140,7 @@ handle_access_violation(os_context_t *ctx, os_vm_page_size); return 0; } - if (gencgc_handle_wp_violation(fault_address)) { + if (gencgc_handle_wp_violation(ctx, fault_address)) { return 0; } diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c index bba95e3185..d7ab566ea3 100644 --- a/src/runtime/x86-darwin-os.c +++ b/src/runtime/x86-darwin-os.c @@ -404,7 +404,7 @@ catch_exception_raise(mach_port_t exception_port, * And because the GC uses signals to stop the world it might * interfere with that bookkeeping, because there's a window * before block_blockable_signals is performed. */ - if (gencgc_handle_wp_violation(addr)) + if (gencgc_handle_wp_violation(0, addr)) goto do_not_handle; /* Undefined alien */ From 377972ad76ac2f40d50e6eedbf2c99dfdfb5ffad Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sun, 12 Jun 2022 15:41:59 +0300 Subject: [PATCH 3496/4023] inline-vop. --- src/cold/exports.lisp | 3 +- src/compiler/copyprop.lisp | 2 +- src/compiler/ir1-translators.lisp | 29 +++++ src/compiler/meta-vmdef.lisp | 205 +++++++++++++++++++----------- src/compiler/vmdef.lisp | 10 +- 5 files changed, 167 insertions(+), 82 deletions(-) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index c9cb478c04..de5bd2b5b8 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2656,7 +2656,8 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "%SET-ROW-MAJOR-AREF" "%SET-FILL-POINTER" "%SET-FDEFINITION" "%SCHARSET" "%RPLACD" "%RPLACA" "%PUT" "%CHARSET" - "%WITH-OUTPUT-TO-STRING") + "%WITH-OUTPUT-TO-STRING" + "INLINE-VOP") #+sb-simd-pack (:export "SIMD-PACK" "SIMD-PACK-P" diff --git a/src/compiler/copyprop.lisp b/src/compiler/copyprop.lisp index 5380aab26f..c38e83ef9d 100644 --- a/src/compiler/copyprop.lisp +++ b/src/compiler/copyprop.lisp @@ -101,7 +101,7 @@ (or (not (cl:symbol-package (leaf-debug-name leaf))) (policy (vop-node vop) - (or (= speed 3) (< debug 2)))) + (= preserve-single-use-debug-variables 0))) ;; arguments of local functions have hidden write (not (and (lambda-var-p leaf) (memq (functional-kind (lambda-var-home leaf)) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 071aa4542c..5903baf116 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -468,6 +468,35 @@ body, references to a NAME will effectively be replaced with the EXPANSION." (subseq args required min)) ,@(subseq args 0 required) ,@(subseq args min))))) + +(defmacro inline-%primitive (template &rest args) + (let* ((required (length (template-arg-types template))) + (info (template-info-arg-count template)) + (min (+ required info)) + (nargs (length args))) + (if (template-more-args-type template) + (when (< nargs min) + (bug "Primitive was called with ~R argument~:P, ~ + but wants at least ~R." + nargs + min)) + (unless (= nargs min) + (bug "Primitive was called with ~R argument~:P, ~ + but wants exactly ~R." + nargs + min))) + + (when (template-conditional-p template) + (bug "%PRIMITIVE was used with a conditional template.")) + + (when (template-more-results-type template) + (bug "%PRIMITIVE was used with an unknown values template.")) + + `(%%primitive ',template + ',(eval-info-args + (subseq args required min)) + ,@(subseq args 0 required) + ,@(subseq args min)))) ;;;; QUOTE diff --git a/src/compiler/meta-vmdef.lisp b/src/compiler/meta-vmdef.lisp index d36d2a61d1..50a9e846ff 100644 --- a/src/compiler/meta-vmdef.lisp +++ b/src/compiler/meta-vmdef.lisp @@ -1632,6 +1632,9 @@ ;;; Indicates if and how the more args should be moved into a ;;; different frame. (defmacro define-vop ((&optional name inherits) &body specs) + (%define-vop name inherits specs t)) + +(defun %define-vop (name inherits specs set) (declare (type symbol name)) ;; Parse the syntax into a VOP-PARSE structure, and then expand into ;; code that creates the appropriate VOP-INFO structure at load time. @@ -1647,8 +1650,9 @@ (let ((clause (assoc :translate specs))) (when (singleton-p (cdr clause)) (setf name (cadr clause))))) - (aver (typep name '(and symbol (not null)))) - (setf (vop-parse-name parse) name) + (when set + (aver (typep name '(and symbol (not null)))) + (setf (vop-parse-name parse) name)) (setf (vop-parse-inherits parse) inherits) (parse-define-vop parse specs) @@ -1663,79 +1667,131 @@ (vop-parse-more-results parse) (vop-parse-result-types parse) nil) - `(progn - (eval-when (:compile-toplevel) - (setf (gethash ',name *backend-parsed-vops*) ',parse)) - (register-vop-parse - ,@(macrolet - ((quotify-slots () - (collect ((forms)) - (dolist (x vop-parse-slot-names (cons 'list (forms))) - (let ((reader (package-symbolicate (sb-xc:symbol-package 'vop-parse) - "VOP-PARSE-" x))) - (forms - (case x - (source-location ''(source-location)) - ((temps args results) `(quotify-list (,reader parse))) - ((more-args more-results) `(quotify (,reader parse))) - (t `(list 'quote (,reader parse)))))))))) - (labels ((quotify (operand-or-nil) - (when operand-or-nil - (list 'quote (quotify-1 operand-or-nil)))) - (quotify-list (operands) - (list 'quote (mapcar #'quotify-1 operands))) - (quotify-1 (x) ; Return everything except the KIND, quoted - `(,(operand-parse-name x) - ,(operand-parse-target x) ,(operand-parse-temp x) - ,(operand-parse-born x) ,(operand-parse-dies x) - ,(operand-parse-load-tn x) ,(operand-parse-load x) - ,(operand-parse-scs x) ,(operand-parse-offset x)))) - (quotify-slots)))) - ,@(unless (eq (vop-parse-body parse) :unspecified) - `((let ((,n-res ,(set-up-vop-info inherited-parse parse))) - (store-vop-info ,n-res) - ,@(set-up-fun-translation parse n-res)))) - ',name))) + (if set + `(progn + (eval-when (:compile-toplevel) + (setf (gethash ',name *backend-parsed-vops*) ',parse)) + (register-vop-parse + ,@(macrolet + ((quotify-slots () + (collect ((forms)) + (dolist (x vop-parse-slot-names (cons 'list (forms))) + (let ((reader (package-symbolicate (sb-xc:symbol-package 'vop-parse) + "VOP-PARSE-" x))) + (forms + (case x + (source-location ''(source-location)) + ((temps args results) `(quotify-list (,reader parse))) + ((more-args more-results) `(quotify (,reader parse))) + (t `(list 'quote (,reader parse)))))))))) + (labels ((quotify (operand-or-nil) + (when operand-or-nil + (list 'quote (quotify-1 operand-or-nil)))) + (quotify-list (operands) + (list 'quote (mapcar #'quotify-1 operands))) + (quotify-1 (x) ; Return everything except the KIND, quoted + `(,(operand-parse-name x) + ,(operand-parse-target x) ,(operand-parse-temp x) + ,(operand-parse-born x) ,(operand-parse-dies x) + ,(operand-parse-load-tn x) ,(operand-parse-load x) + ,(operand-parse-scs x) ,(operand-parse-offset x)))) + (quotify-slots)))) + ,@(unless (eq (vop-parse-body parse) :unspecified) + `((let ((,n-res ,(set-up-vop-info inherited-parse parse))) + (store-vop-info ,n-res) + ,@(set-up-fun-translation parse n-res)))) + ',name) + `(let ((info ,(set-up-vop-info inherited-parse parse))) + (setf (vop-info-type info) + (specifier-type (template-type-specifier info))) + info)))) + +;;; (inline-vop +;;; (((param unsigned-reg unsigned-num :to :save) arg) +;;; ((temp unsigned-reg unsigned-num)) +;;; ((temp2))) ;; will reuse the previous specifications +;;; ((result unsigned-reg unsigned-num)) +;;; (inst x result temp param)) +(defmacro inline-vop (vars results &body body) + (collect ((input) + (args) + (arg-types) + (temps) + (results) + (result-types)) + (loop for (var arg) in vars + for (name this-sc) = var + for (nil sc type . rest) = (if this-sc + var + prev) + for prev = (if this-sc + var + prev) + do (cond (arg + (input arg) + (args (list* name :scs (list sc) rest)) + (arg-types (or type '*))) + (t + (temps `(:temporary (:sc ,sc ,@rest) + ,name))))) + (loop for (name sc type . rest) in results + do (results (list* name :scs (list sc) rest)) + (result-types (or type '*))) + `(inline-%primitive + ,(eval (%define-vop nil nil + (delete nil + (list* (and (args) + (list* :args (args))) + (and (arg-types) + (list* :arg-types (arg-types))) + (and (results) + (list* :results (results))) + (and (result-types) + (list* :result-types (result-types))) + (list* :generator 0 body) + (temps))) + nil)) + ,@(input)))) (macrolet - ((def () - `(defun register-vop-parse ,vop-parse-slot-names - ;; Try to share each OPERAND-PARSE structure with a similar existing one. - (labels ((share-list (operand-specs accessor kind) - (let ((new (mapcar (lambda (x) (share x kind)) operand-specs))) - (dohash ((key parse) *backend-parsed-vops* :result new) - (declare (ignore key)) - (when (equal (funcall accessor parse) new) - (return (funcall accessor parse)))))) - (share (operand-spec kind) - ;; OPERAND-PARSE structures are immutable. Scan all vops for one - ;; with an operand matching OPERAND-SPEC, and use that if found. - (destructuring-bind (name targ temp born dies load-tn load scs offs) - operand-spec - (let ((op (make-operand-parse - :name name :kind kind :target targ :temp temp - :born born :dies dies :load-tn load-tn :load load - :scs scs :offset offs))) - (dohash ((key parse) *backend-parsed-vops* :result op) - (declare (ignore key)) - (awhen (find op (vop-parse-operands parse) :test #'operand=) - (return it)))))) - (operand= (a b) - ;; EQUALP is too weak a comparator for arbitrary sexprs, - ;; since (EQUALP "foo" #(#\F #\O #\O)) is T, not that - ;; we expect such weirdness in the LOAD-IF expression. - (and (equal (operand-parse-load a) (operand-parse-load b)) - (equalp a b)))) - (setq temps (share-list temps #'vop-parse-temps :temporary) - args (share-list args #'vop-parse-args :argument) - results (share-list results #'vop-parse-results :result)) - (when more-args (setq more-args (share more-args :more-argument))) - (when more-results (setq more-results (share more-results :more-result)))) - (let ((parse - (make-vop-parse ,@(mapcan (lambda (x) (list (keywordicate x) x)) - vop-parse-slot-names)))) - (set-vop-parse-operands parse) - (setf (gethash name *backend-parsed-vops*) parse))))) + ((def () + `(defun register-vop-parse ,vop-parse-slot-names + ;; Try to share each OPERAND-PARSE structure with a similar existing one. + (labels ((share-list (operand-specs accessor kind) + (let ((new (mapcar (lambda (x) (share x kind)) operand-specs))) + (dohash ((key parse) *backend-parsed-vops* :result new) + (declare (ignore key)) + (when (equal (funcall accessor parse) new) + (return (funcall accessor parse)))))) + (share (operand-spec kind) + ;; OPERAND-PARSE structures are immutable. Scan all vops for one + ;; with an operand matching OPERAND-SPEC, and use that if found. + (destructuring-bind (name targ temp born dies load-tn load scs offs) + operand-spec + (let ((op (make-operand-parse + :name name :kind kind :target targ :temp temp + :born born :dies dies :load-tn load-tn :load load + :scs scs :offset offs))) + (dohash ((key parse) *backend-parsed-vops* :result op) + (declare (ignore key)) + (awhen (find op (vop-parse-operands parse) :test #'operand=) + (return it)))))) + (operand= (a b) + ;; EQUALP is too weak a comparator for arbitrary sexprs, + ;; since (EQUALP "foo" #(#\F #\O #\O)) is T, not that + ;; we expect such weirdness in the LOAD-IF expression. + (and (equal (operand-parse-load a) (operand-parse-load b)) + (equalp a b)))) + (setq temps (share-list temps #'vop-parse-temps :temporary) + args (share-list args #'vop-parse-args :argument) + results (share-list results #'vop-parse-results :result)) + (when more-args (setq more-args (share more-args :more-argument))) + (when more-results (setq more-results (share more-results :more-result)))) + (let ((parse + (make-vop-parse ,@(mapcan (lambda (x) (list (keywordicate x) x)) + vop-parse-slot-names)))) + (set-vop-parse-operands parse) + (setf (gethash name *backend-parsed-vops*) parse))))) (def)) (defun store-vop-info (vop-info) @@ -1752,7 +1808,8 @@ (setf (vop-info-type vop-info) (vop-info-type other)) (return-from found t))) *backend-template-names*)) - (setf (vop-info-type vop-info) (specifier-type my-type-spec)))) + (setf (vop-info-type vop-info) (specifier-type my-type-spec))) + vop-info) (flet ((find-equalp (accessor) ;; Read the slot from VOP-INFO and try to find any other vop-info ;; that has an EQUALP value in that slot, returning that value. diff --git a/src/compiler/vmdef.lisp b/src/compiler/vmdef.lisp index d19844c7c1..382f2a503b 100644 --- a/src/compiler/vmdef.lisp +++ b/src/compiler/vmdef.lisp @@ -222,13 +222,11 @@ (results (if (template-conditional-p template) '(boolean) (convert result-restr - (cond ((template-more-results-type template)) - ((/= (length result-restr) 1) '*) - (t nil)))))) + (template-more-results-type template))))) `(function ,args - ,(if (= (length results) 1) - (first results) - `(values ,@results)))))) + (values ,@results + ,@(unless (template-more-results-type template) + '(&optional))))))) (defun template-translates-arg-p (function argument type) (let ((primitive-type (primitive-type (specifier-type type)))) From cc7f048301eb405ed6a1b2698875cf74ddfc966a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 12 Jun 2022 17:34:46 -0400 Subject: [PATCH 3497/4023] arm64: use fewer callls to pthread_jit_write_protect_np - apply fixups to a temporary copy of new code, then copy it back - copy all boxed objects to the header using only one memcpy --- src/code/alloc.lisp | 10 +- src/code/arm64-vm.lisp | 35 +----- src/code/load.lisp | 40 +++++-- src/code/ntrace.lisp | 8 +- src/compiler/arm64/insts.lisp | 12 +- src/compiler/generic/early-vm.lisp | 25 +--- src/compiler/generic/genesis.lisp | 18 +-- src/compiler/generic/target-core.lisp | 164 +++++++++++++++----------- src/runtime/arm64-darwin-os.c | 62 +++++++--- src/runtime/gencgc.c | 15 ++- src/runtime/os-common.c | 11 ++ 11 files changed, 218 insertions(+), 182 deletions(-) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index 7dd829461f..915e0aa452 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -516,13 +516,15 @@ ;; value in the boxed word count because otherwise it looks like ;; an immobile space page filler. So don't do any more zeroing there. ;; (Could dead immobile objects be converted to use FILLER-WIDETAG instead?) + ;; For #+darwin-jit the entire object (other than first word) is cleared in C. + #-darwin-jit (unless (immobile-space-obj-p code) ;; Before writing the boxed word count, zeroize up to and including 1 word ;; after the boxed header so that all pointers can be safely read by GC, ;; and so that the jump table count word is 0. (loop for byte-index from (ash boxed word-shift) downto (ash 2 word-shift) by n-word-bytes - do (setf (sap-ref-word-jit sap byte-index) 0))) + do (setf (sap-ref-word sap byte-index) 0))) ;; The 1st slot beyond the header stores the boxed header size in bytes ;; as an untagged number, which has the same representation as a tagged ;; value denoting a word count if WORD-SHIFT = N-FIXNUM-TAG-BITS. @@ -543,10 +545,4 @@ ;; But what about other things that create code objects? ;; It could be a subtle source of nondeterministic core images. - ;; FIXME: Sort out 64-bit and cheneygc. - #+(and 64-bit cheneygc) - (setf (code-header-ref code 0) - (%make-lisp-obj - (logior (ash total-words 32) - sb-vm:code-header-widetag))) code)) diff --git a/src/code/arm64-vm.lisp b/src/code/arm64-vm.lisp index e46241d12c..a1b2f9f0d7 100644 --- a/src/code/arm64-vm.lisp +++ b/src/code/arm64-vm.lisp @@ -124,45 +124,20 @@ (value unsigned) (index unsigned)) - (define-alien-routine jit-patch-int - void - (address unsigned) - (value int)) - - (define-alien-routine jit-patch-uint - void - (address unsigned) - (value unsigned-int)) - - (define-alien-routine jit-patch-uchar - void - (address unsigned) - (value unsigned-char)) - (define-alien-routine jit-memcpy void (dst (* char)) (src (* char)) (char signed)) + (define-alien-routine jit-copy-code-constants + void + (dst unsigned) + (src unsigned)) + (defun (setf sap-ref-word-jit) (value sap offset) (jit-patch (+ (sap-int sap) offset) value)) - (defun (setf signed-sap-ref-32-jit) (value sap offset) - (jit-patch-int (+ (sap-int sap) offset) value)) - - (defun signed-sap-ref-32-jit (sap offset) - (signed-sap-ref-32 sap offset)) - - (defun (setf sap-ref-32-jit) (value sap offset) - (jit-patch-uint (+ (sap-int sap) offset) value)) - - (defun sap-ref-32-jit (sap offset) - (sap-ref-32 sap offset)) - - (defun (setf sap-ref-8-jit) (value sap offset) - (jit-patch-uchar (+ (sap-int sap) offset) value)) - (defun (setf code-header-ref) (value code index) (with-pinned-objects (code value) (jit-patch-code (get-lisp-obj-address code) diff --git a/src/code/load.lisp b/src/code/load.lisp index 985eaa1ffc..26d96d6f09 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1087,6 +1087,26 @@ ;;; putting the implementation and version in required fields in the ;;; fasl file header.) +;;; Caution: don't try to "test" WITH-WRITABLE-CODE-INSTRUCTIONS on any architecture +;;; where fixup application cares what the address of the code actually is. +;;; This means x86 is disqualified. You're just wasting your time if you try, as I did. +(defmacro with-writable-code-instructions ((code-var debug-info-var) &body body) + (declare (ignorable debug-info-var)) + #+darwin-jit + `(with-pinned-objects (,code-var ,debug-info-var) + (let* ((temp-copy (alien-funcall (extern-alien "duplicate_codeblob_offheap" + (function unsigned unsigned)) + (get-lisp-obj-address ,code-var))) + (aligned (+ temp-copy (logand temp-copy sb-vm:n-word-bytes)))) + ;; Rebind CODE-VAR to the replica, then execute BODY + (let ((,code-var (%make-lisp-obj (logior aligned sb-vm:other-pointer-lowtag)))) ,@body) + ;; Copy back, and fixup the simple-funs in the managed object + (alien-funcall (extern-alien "jit_copy_code_insts" (function void unsigned unsigned)) + (get-lisp-obj-address ,code-var) + temp-copy))) + #-darwin-jit + `(with-pinned-objects (,code-var) ,@body)) + (define-load-time-global *show-new-code* nil) (define-fop 17 :not-host (fop-load-code ((:operands header n-code-bytes n-fixup-elts))) ;; The stack looks like: @@ -1108,18 +1128,13 @@ (if (oddp header) :immobile :dynamic) n-named-calls (align-up n-boxed-words sb-c::code-boxed-words-align) - n-code-bytes))) - (with-pinned-objects (code) + n-code-bytes)) + (debug-info (svref stack (+ ptr n-constants)))) + (with-writable-code-instructions (code debug-info) ;; * DO * NOT * SEPARATE * THESE * STEPS * ;; For a full explanation, refer to the comment above MAKE-CORE-COMPONENT ;; concerning the corresponding use therein of WITH-PINNED-OBJECTS etc. - #-darwin-jit (read-n-bytes (fasl-input-stream) (code-instructions code) 0 n-code-bytes) - #+darwin-jit - (let ((buf (make-array n-code-bytes :element-type '(unsigned-byte 8)))) - (read-n-bytes (fasl-input-stream) buf 0 n-code-bytes) - (with-pinned-objects (buf) - (sb-vm::jit-memcpy (code-instructions code) (vector-sap buf) n-code-bytes))) (aver (= (code-n-entries code) n-simple-funs)) ;; Serial# shares a word with the jump-table word count, ;; so we can't assign serial# until after all raw bytes are copied in. @@ -1127,13 +1142,18 @@ (sb-thread:barrier (:write)) ;; Assign debug-info. A code object that has no debug-info will never ;; have its fun table accessed in conservative_root_p() or pin_object(). - (setf (%code-debug-info code) (svref stack (+ ptr n-constants))) - (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts) + (setf (%code-debug-info code) debug-info) + (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts)) + ;; Don't need the code pinned from here on + (progn (setf (sb-c::debug-info-source (%code-debug-info code)) (%fasl-input-partial-source-info (fasl-input))) ;; Boxed constants can be assigned only after figuring out where the range ;; of implicitly tagged words is, which requires knowing how many functions ;; are in the code component, which requires reading the code trailer. + #+darwin-jit (sb-c::assign-code-constants + code (subseq stack ptr (+ ptr n-constants))) + #-darwin-jit (let* ((header-index sb-vm:code-constants-offset) (stack-index ptr)) (declare (type index header-index stack-index)) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 691d1e9957..596a387178 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -747,13 +747,15 @@ functions when called with no arguments." (defun set-tracing-bit (code bit) (declare (ignorable code bit)) - #+64-bit ; there are no bits to spare in a 32-bit header word + ;; there are no bits to spare in a 32-bit header word, + ;; and with darwin-jit it's not worth the extra complexity + #+(and 64-bit (not darwin-jit)) (with-pinned-objects (code) (let ((sap (int-sap (get-lisp-obj-address code)))) ;; NB: This is not threadsafe on machines that don't promise that ;; stores to single bytes are atomic. - (setf (sb-vm::sap-ref-8-jit sap #+little-endian (- 1 sb-vm:other-pointer-lowtag) - #+big-endian (- 6 sb-vm:other-pointer-lowtag)) + (setf (sap-ref-8 sap #+little-endian (- 1 sb-vm:other-pointer-lowtag) + #+big-endian (- 6 sb-vm:other-pointer-lowtag)) bit) ;; touch the card mark (setf (code-header-ref code 1) (code-header-ref code 1))))) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index d7ae1ac4c0..2996aaee20 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -3014,21 +3014,21 @@ (let ((sap (code-instructions code))) (ecase kind (:absolute - (setf (sb-vm::sap-ref-word-jit sap offset) value)) + (setf (sap-ref-word sap offset) value)) (:layout-id - (setf (sb-vm::signed-sap-ref-32-jit sap offset) value)) + (setf (signed-sap-ref-32 sap offset) value)) (:cond-branch - (setf (ldb (byte 19 5) (sb-vm::sap-ref-32-jit sap offset)) + (setf (ldb (byte 19 5) (sap-ref-32 sap offset)) (ash (- value (+ (sap-int sap) offset)) -2))) (:uncond-branch - (setf (ldb (byte 26 0) (sb-vm::sap-ref-32-jit sap offset)) + (setf (ldb (byte 26 0) (sap-ref-32 sap offset)) (ash (- value (+ (sap-int sap) offset)) -2))) (:ldr-str - (setf (ldb (byte 12 10) (sb-vm::sap-ref-32-jit sap offset)) + (setf (ldb (byte 12 10) (sap-ref-32 sap offset)) (ash (the (unsigned-byte #.(+ 12 word-shift)) value) (- word-shift)))) (:move-wide - (setf (ldb (byte 16 5) (sb-vm::sap-ref-32-jit sap offset)) + (setf (ldb (byte 16 5) (sap-ref-32 sap offset)) (the (unsigned-byte 16) value))))) nil) diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index 5743eaead4..d751dc56b9 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -216,30 +216,9 @@ #-darwin-jit (progn - (declaim (inline (setf sap-ref-word-jit) - (setf signed-sap-ref-32-jit) - signed-sap-ref-32-jit - (setf sap-ref-32-jit) - sap-ref-32-jit - (setf sap-ref-8-jit))) + (declaim (inline (setf sap-ref-word-jit))) (defun (setf sap-ref-word-jit) (value sap offset) - (setf (sap-ref-word sap offset) value)) - - (defun (setf signed-sap-ref-32-jit) (value sap offset) - (setf (signed-sap-ref-32 sap offset) value)) - - (defun signed-sap-ref-32-jit (sap offset) - (signed-sap-ref-32 sap offset)) - - (defun (setf sap-ref-32-jit) (value sap offset) - (setf (sap-ref-32 sap offset) value)) - - (defun sap-ref-32-jit (sap offset) - (sap-ref-32 sap offset)) - - #-sb-xc-host - (defun (setf sap-ref-8-jit) (value sap offset) - (setf (sap-ref-8 sap offset) value))) + (setf (sap-ref-word sap offset) value))) ;;; Supporting code for LAYOUT allocated in metadata space a/k/a "metaspace". ;;; These objects are manually allocated and freed. diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 33cf227cf1..2616573ee8 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -280,23 +280,7 @@ (defun (setf signed-sap-ref-32) (newval sap offset) (setf (access bvref-32) (ldb (byte 32 0) (the (signed-byte 32) newval)))) (defun (setf sap-ref-64) (newval sap offset) - (setf (access bvref-64) newval)) - #+darwin-jit - (progn - (defun (setf sb-vm::sap-ref-word-jit) (value sap offset) - (setf (sap-ref-64 sap offset) value)) - - (defun (setf sb-vm::signed-sap-ref-32-jit) (value sap offset) - (setf (signed-sap-ref-32 sap offset) value)) - - (defun sb-vm::signed-sap-ref-32-jit (sap offset) - (signed-sap-ref-32 sap offset)) - - (defun (setf sb-vm::sap-ref-32-jit) (value sap offset) - (setf (sap-ref-32 sap offset) value)) - - (defun sb-vm::sap-ref-32-jit (sap offset) - (sap-ref-32 sap offset)))) + (setf (access bvref-64) newval))) ;;;; representation of descriptors diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index eaa43d2149..d247b6497f 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -132,7 +132,9 @@ (setf (sb-vm::%code-fixups code-obj) (sb-c:pack-code-fixup-locs abs-fixups rel-fixups gc-barrier-fixups)))) - ;; Assign all SIMPLE-FUN-SELF slots + ;; Assign all SIMPLE-FUN-SELF slots unless #+darwin-jit in which case the simple-funs + ;; are assigned by jit_memcpy_codeblob() + #-darwin-jit (dotimes (i (code-n-entries code-obj)) (let ((fun (%code-entry-point code-obj i))) (assign-simple-fun-self fun) @@ -142,8 +144,10 @@ (- 4 sb-vm:fun-pointer-lowtag)) (truly-the (unsigned-byte 32) (get-lisp-obj-address (wrapper-friend #.(find-layout 'function))))))) - ;; And finally, make the memory range executable - #-(or x86 x86-64) (sb-vm:sanctify-for-execution code-obj) + ;; And finally, make the memory range executable. + ;; x86 doesn't need it, and darwin-jit doesn't do it because the + ;; temporary object is not executable. + #-(or x86 x86-64 darwin-jit) (sb-vm:sanctify-for-execution code-obj) ;; Return fixups amenable to static linking (aref preserved-lists 0))) @@ -220,20 +224,25 @@ (setf (gethash info (core-object-entry-table object)) function) (values)) -;;; Stick a reference to the function FUN in CODE-OBJECT at index I. If the -;;; function hasn't been compiled yet, make a note in the patch table. -(defun reference-core-fun (code-obj i fun object) - (declare (type core-object object) (type functional fun) - (type index i)) +;;; Stick a reference to the function FUN in CODEBLOB-OR-VECTOR at index I. +;;; The function has to have been compiled already. (This wasn't always the case I guess?) +(defun reference-core-fun (codeblob-or-vector i fun core-object) + (declare (type (or simple-vector code-component) codeblob-or-vector) + (type index i) + (type functional fun) + (type core-object object)) (let* ((info (leaf-info fun)) - (found (gethash info (core-object-entry-table object)))) - ;; A core component should not have cross-component references. + (found (gethash info (core-object-entry-table core-object)))) + ;; A core component can't have any cross-component references. ;; If it could, then the entries would have placed into one component. - (aver found) - (if found - (setf (code-header-ref code-obj i) found) - (push (cons code-obj i) - (gethash info (core-object-patch-table object))))) + (cond (found + (if (simple-vector-p codeblob-or-vector) + (setf (svref codeblob-or-vector (- i sb-vm:code-constants-offset)) found) + (setf (code-header-ref codeblob-or-vector i) found))) + (t + (bug "Forward-reference to core function can't occur") + ;; Was: (push (cons code-obj i) (gethash info (core-object-patch-table object))) + ))) (values)) ;;; Dump a component to core. We pass in the assembler fixups, code @@ -267,10 +276,17 @@ (insts (code-instructions code-obj)) (jumptable-word (sap-ref-word insts 0))) (aver (zerop (ash jumptable-word -14))) - (setf (sb-vm::sap-ref-word-jit insts 0) ; insert serialno + (setf (sap-ref-word insts 0) ; insert serialno (logior (ash serialno (byte-position sb-vm::code-serialno-byte)) jumptable-word)))) +#+darwin-jit +(defun assign-code-constants (code data) + (let* ((sb-vm::*pinned-objects* ; Pin DATA plus every element of it. + (list* code data (nconc (coerce data 'list) sb-vm::*pinned-objects*)))) + (sb-vm::jit-copy-code-constants (get-lisp-obj-address code) + (get-lisp-obj-address data)))) + (defun make-core-component (component segment length fixup-notes alloc-points object) (declare (type component component) (type segment segment) @@ -280,7 +296,13 @@ (let* ((debug-info (debug-info-for-component component)) (2comp (component-info component)) (constants (ir2-component-constants 2comp)) - (nboxed (align-up (length constants) sb-c::code-boxed-words-align)) + (nboxed (align-up (length constants) code-boxed-words-align)) + (boxed-data + ;; <header, boxed_size, debug_info, fixups> are absent from the simple-vector + #+darwin-jit + (make-array (- nboxed sb-vm:code-constants-offset) + :initial-element (%make-lisp-obj (logior #xff00 + sb-vm:unbound-marker-widetag)))) (n-named-calls ;; Pre-scan for fdefinitions to ensure their existence. ;; Doing so guarantees that storing them into the boxed header now @@ -309,19 +331,17 @@ ;; A very specific store order is necessary to allow using uninitialized memory ;; pages for code. Storing of the debug-info slot does not need the code pinned, ;; but that store must occur between steps 1 and 2. - (with-pinned-objects (code-obj) + (sb-fasl::with-writable-code-instructions (code-obj debug-info) ;; Note that this does not have to take care to ensure atomicity ;; of the store to the final word of unboxed data. Even if BYTE-BLT were ;; interrupted in between the store of any individual byte, this code ;; is GC-safe because we no longer need to know where simple-funs are embedded ;; within the object to trace pointers. We *do* need to know where the funs ;; are when transporting the object, but it's currently pinned. - #-darwin-jit - (%byte-blt bytes 0 (code-instructions code-obj) 0 (length bytes)) - #+darwin-jit - (with-pinned-objects (bytes) - (sb-vm::jit-memcpy (code-instructions code-obj) (vector-sap bytes) (length bytes))) - + (%byte-blt bytes 0 (code-instructions code-obj) 0 (length bytes)) + ;; Serial# shares a word with the jump-table word count, + ;; so we can't assign serial# until after all raw bytes are copied in. + (assign-code-serialno code-obj) ;; Enforce that the final unboxed data word is published to memory ;; before the debug-info is set. (sb-thread:barrier (:write)) @@ -332,10 +352,7 @@ ;; is valid. This store must occur prior to calling %CODE-ENTRY-POINT, and ;; applying fixups calls %CODE-ENTRY-POINT, so we have to do this before that. (setf (%code-debug-info code-obj) debug-info) - (setq named-call-fixups (apply-core-fixups code-obj fixup-notes)) - ;; Serial# shares a word with the jump-table word count, - ;; so we can't assign serial# until after all raw bytes are copied in. - (assign-code-serialno code-obj)) + (setq named-call-fixups (apply-core-fixups code-obj fixup-notes))) (when alloc-points #+(and x86-64 sb-thread) @@ -343,49 +360,58 @@ (setf (gethash code-obj *allocation-patch-points*) alloc-points) (funcall 'sb-aprof::patch-code code-obj alloc-points))) - ;; Don't need code pinned now - ;; (It will implicitly be pinned on the conservatively scavenged backends) - (let* ((entries (ir2-component-entries 2comp)) - (fun-index (length entries))) - (dolist (entry-info entries) - (let ((fun (%code-entry-point code-obj (decf fun-index))) - (w (+ sb-vm:code-constants-offset - (* sb-vm:code-slots-per-simple-fun fun-index)))) - (aver (functionp fun)) ; in case %CODE-ENTRY-POINT returns NIL - (setf (code-header-ref code-obj (+ w sb-vm:simple-fun-name-slot)) - (entry-info-name entry-info) - (code-header-ref code-obj (+ w sb-vm:simple-fun-arglist-slot)) - (entry-info-arguments entry-info) - (code-header-ref code-obj (+ w sb-vm:simple-fun-source-slot)) - (entry-info-form/doc entry-info) - (code-header-ref code-obj (+ w sb-vm:simple-fun-info-slot)) - (entry-info-type/xref entry-info)) - (note-fun entry-info fun object)))) - (push debug-info (core-object-debug-info object)) - (do ((index (+ sb-vm:code-constants-offset - (* (length (ir2-component-entries 2comp)) - sb-vm:code-slots-per-simple-fun)) - (1+ index))) - ((>= index (length constants))) - (let* ((const (aref constants index)) - (kind (if (listp const) (car const) const))) - (case kind - (:entry - (reference-core-fun code-obj index (cadr const) object)) - ((nil)) - (t - (let ((referent - (etypecase kind - ((member :named-call :fdefinition) (cadr const)) - ((eql :known-fun) - (%coerce-name-to-fun (cadr const))) - (constant - (constant-value const))))) - (if (eq kind :named-call) - (set-code-fdefn code-obj index referent) - (setf (code-header-ref code-obj index) referent))))))) + ;; Don't need code pinned now + ;; (It will implicitly be pinned on the conservatively scavenged backends) + (macrolet ((set-boxed-word (i val &optional fdefnp) + (declare (ignorable fdefnp)) + ;; Thankfully we don't mix untagged fdefns with darwin-jit + #+darwin-jit + `(setf (svref boxed-data (- ,i ,sb-vm:code-constants-offset)) ,val) + #-darwin-jit + (if (not fdefnp) ; statically not an fdefn + `(setf (code-header-ref code-obj ,i) ,val) + `(if ,fdefnp ; else choose which setter to use + (set-code-fdefn code-obj ,i ,val) + (setf (code-header-ref code-obj ,i) ,val))))) + + (let* ((entries (ir2-component-entries 2comp)) + (fun-index (length entries))) + (dolist (entry-info entries) + (let ((fun (%code-entry-point code-obj (decf fun-index))) + (w (+ sb-vm:code-constants-offset + (* sb-vm:code-slots-per-simple-fun fun-index)))) + (aver (functionp fun)) ; in case %CODE-ENTRY-POINT returns NIL + (set-boxed-word (+ w sb-vm:simple-fun-name-slot) (entry-info-name entry-info)) + (set-boxed-word (+ w sb-vm:simple-fun-arglist-slot) (entry-info-arguments entry-info)) + (set-boxed-word (+ w sb-vm:simple-fun-source-slot) (entry-info-form/doc entry-info)) + (set-boxed-word (+ w sb-vm:simple-fun-info-slot) (entry-info-type/xref entry-info)) + (note-fun entry-info fun object)))) + + (do ((index (+ sb-vm:code-constants-offset + (* (length (ir2-component-entries 2comp)) + sb-vm:code-slots-per-simple-fun)) + (1+ index))) + ((>= index (length constants))) + (let* ((const (aref constants index)) + (kind (if (listp const) (car const) const))) + (case kind + (:entry + (reference-core-fun (or boxed-data code-obj) index (cadr const) object)) + ((nil)) + (t + (let ((referent + (etypecase kind + ((member :named-call :fdefinition) (cadr const)) + ((eql :known-fun) + (%coerce-name-to-fun (cadr const))) + (constant + (constant-value const))))) + (set-boxed-word index referent (eq kind :named-call))))))) + + #+darwin-jit (assign-code-constants code-obj boxed-data)) + (when named-call-fixups (sb-vm::statically-link-code-obj code-obj named-call-fixups)) (when sb-fasl::*show-new-code* diff --git a/src/runtime/arm64-darwin-os.c b/src/runtime/arm64-darwin-os.c index 0cd5c3502c..34e7883294 100644 --- a/src/runtime/arm64-darwin-os.c +++ b/src/runtime/arm64-darwin-os.c @@ -25,21 +25,37 @@ void jit_patch(lispobj* address, lispobj value) { THREAD_JIT(1); } -void jit_patch_int(int* address, int value) { - THREAD_JIT(0); - *address = value; - THREAD_JIT(1); -} - -void jit_patch_uint(unsigned* address, unsigned value) { +void jit_copy_code_insts(lispobj dst, lispobj* src) +{ + lispobj* aligned_src = (lispobj*)(src + ((uword_t)src & N_WORD_BYTES)); // align up + struct code* code = (struct code*)(dst-OTHER_POINTER_LOWTAG); + int nwords = code_total_nwords(code); + gc_assert(code_total_nwords((struct code*)aligned_src)); THREAD_JIT(0); - *address = value; + memcpy(code, aligned_src, nwords<<WORD_SHIFT); + for_each_simple_fun(i, fun, code, 1, { fun->self = fun_self_from_baseptr(fun); }) THREAD_JIT(1); + free(src); + // FINISH-FIXUPS didn't call SB-VM:SANCTIFY-FOR-EXECUTION + // because the copy of the code on which it operates was only temporary. + __clear_cache(code, (lispobj*)code + nwords); } -void jit_patch_uchar(unsigned char* address, unsigned char value) { +void jit_copy_code_constants(lispobj lispcode, lispobj constants) +{ + struct code* code = (void*)(lispcode - OTHER_POINTER_LOWTAG); + gc_assert(header_widetag(code->header) == CODE_HEADER_WIDETAG); + struct vector* v = VECTOR(constants); + gc_assert(header_widetag(v->header) == SIMPLE_VECTOR_WIDETAG); + gc_assert(find_page_index((void*)code) >= 0); THREAD_JIT(0); - *address = value; + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIG_STOP_FOR_GC); + thread_sigmask(SIG_BLOCK, &mask, 0); + SET_WRITTEN_FLAG((lispobj*)code); + memcpy(&code->constants, v->data, vector_len(v) * N_WORD_BYTES); + thread_sigmask(SIG_UNBLOCK, &mask, 0); THREAD_JIT(1); } @@ -48,12 +64,28 @@ void jit_memcpy(void* dst, void* src, size_t n) { memcpy(dst, src, n); THREAD_JIT(1); } + void jit_patch_code(lispobj code, lispobj value, unsigned long index) { - THREAD_JIT(0); - gc_card_mark[addr_to_card_index(code)] = 1; // CARD_MARKED - SET_WRITTEN_FLAG(native_pointer(code)); - native_pointer(code)[index] = value; - THREAD_JIT(1); + /* It is critical that we NOT touch the mark table if the object is off-heap. + * With soft protection, it's doesn't matter - it's merely suboptimal - but arm64 + * uses physical protection for now, and a page fault on a page that is erroneously + * marked (i.e. not write-protected, allegedly) would be an error. + * Disallow GC in between setting the WRITTEN flag and doing the assigmment */ + if (find_page_index((void*)code) >= 0) { + THREAD_JIT(0); + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIG_STOP_FOR_GC); + thread_sigmask(SIG_BLOCK, &mask, 0); + gc_card_mark[addr_to_card_index(code)] = CARD_MARKED; + SET_WRITTEN_FLAG(native_pointer(code)); + native_pointer(code)[index] = value; + thread_sigmask(SIG_UNBLOCK, &mask, 0); + THREAD_JIT(1); + } else { // Off-heap code objects can't be executed (or GC'd) + SET_WRITTEN_FLAG(native_pointer(code)); + native_pointer(code)[index] = value; + } } diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 34d9f10d19..b3d9122531 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -259,6 +259,11 @@ page_index_t contiguous_block_final_page(page_index_t first) { * Clear all the flags that don't pertain to a free page. */ static inline void reset_page_flags(page_index_t page) { page_table[page].scan_start_offset_ = 0; +#ifdef LISP_FEATURE_DARWIN_JIT + // Whenever a page was mapped as code, it potentially needs to be remapped on the next use. + // This avoids any affect of pthread_jit_write_protect_np when next used. + if (page_table[page].type == PAGE_TYPE_CODE) set_page_needs_zerofill(page); +#endif page_table[page].type = 0; gc_page_pins[page] = 0; // Why can't the 'gen' get cleared? It caused failures. THIS MAKES NO SENSE!!! @@ -5032,11 +5037,17 @@ lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words) THREAD_JIT(0); code->header = ((uword_t)total_words << CODE_HEADER_SIZE_SHIFT) | CODE_HEADER_WIDETAG; +#ifdef LISP_FEATURE_DARWIN_JIT + // Zeroize everything so that lisp doesn't have to. + // One memcpy is cheaper than 2 system calls per boxed word. + memset(&code->boxed_size, 0, nbytes - N_WORD_BYTES); +#else // Code pages are not prezeroed, so these assignments are essential to prevent GC // from seeing bad pointers if it runs as soon as the mutator allows GC. code->boxed_size = 0; code->debug_info = 0; ((lispobj*)code)[total_words-1] = 0; // zeroize the simple-fun table count +#endif THREAD_JIT(1); return make_lispobj(code, OTHER_POINTER_LOWTAG); @@ -5237,7 +5248,7 @@ boolean ignore_memoryfaults_on_unprotected_pages = 0; extern boolean continue_after_memoryfault_on_unprotected_pages; boolean continue_after_memoryfault_on_unprotected_pages = 0; -int gencgc_handle_wp_violation(void* context, void* fault_addr) +int gencgc_handle_wp_violation(__attribute__((unused)) void* context, void* fault_addr) { page_index_t page_index = find_page_index(fault_addr); @@ -5763,7 +5774,7 @@ sword_t scav_code_blob(lispobj *object, lispobj header) } #endif -#ifdef LISP_FEATURE_64_BIT +#if defined LISP_FEATURE_64_BIT && !defined LISP_FEATURE_DARWIN_JIT /* If any function in this code object redirects to a function outside * the object, then scavenge all entry points. Otherwise there is no need, * as trans_code() made necessary adjustments to internal entry points. diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 789bc4b553..b752aae80e 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -398,3 +398,14 @@ os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) } } #endif + +lispobj* duplicate_codeblob_offheap(lispobj code) +{ + int nwords = code_total_nwords((struct code*)(code-OTHER_POINTER_LOWTAG)); + lispobj* mem = malloc((nwords+1) * N_WORD_BYTES); + if ((uword_t)mem & LOWTAG_MASK) lose("this is unexpected\n"); + // add 1 word if not dualword aligned + lispobj* copy = (lispobj*)((uword_t)mem + ((uword_t)mem & N_WORD_BYTES)); + memcpy(copy, (char*)code-OTHER_POINTER_LOWTAG, nwords<<WORD_SHIFT); + return mem; +} From 71d41f016e8bbff9e4cd2eb1173b0965d64f2016 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 13 Jun 2022 02:43:34 +0300 Subject: [PATCH 3498/4023] Optimize string-xcase using SSE2. --- NEWS | 1 + src/code/simd-fndb.lisp | 16 +++ src/code/string.lisp | 248 +++++++++++++++++++-------------- src/code/x86-64-simd.lisp | 86 ++++++++++++ src/cold/build-order.lisp-expr | 4 + src/compiler/meta-vmdef.lisp | 20 ++- 6 files changed, 264 insertions(+), 111 deletions(-) create mode 100644 src/code/simd-fndb.lisp create mode 100644 src/code/x86-64-simd.lisp diff --git a/NEWS b/NEWS index 3ecb1b85ce..6822a3e1f0 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ changes relative to sbcl-2.2.5: * enhancement: core compression now uses zstd instead of zlib. * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. + * optimization: faster [n]string-down/upcase. changes in sbcl-2.2.5 relative to sbcl-2.2.4: * minor incompatible change: SB-EXT:*DERIVE-FUNCTION-TYPES* being NIL now diff --git a/src/code/simd-fndb.lisp b/src/code/simd-fndb.lisp new file mode 100644 index 0000000000..421ced06a5 --- /dev/null +++ b/src/code/simd-fndb.lisp @@ -0,0 +1,16 @@ +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. + +(in-package "SB-VM") + +(defknown vector-ref-128 (t index) (simd-pack (unsigned-byte 32)) + (flushable)) + +(defknown (setf vector-ref-128) (simd-pack t index) (values) + ()) diff --git a/src/code/string.lisp b/src/code/string.lisp index b0ba2a29a4..42abef2596 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -504,27 +504,43 @@ new string COUNT long filled with the fill character." (defmacro nstring-case (case-index a z) (declare (ignorable a z)) - `(cond #+sb-unicode - ((and (zerop start) + `(cond ((and (zerop start) (not end) - (simple-base-string-p string)) - (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) - (a-mask (* (- 128 (char-code ,a)) repeat)) - (z-mask (* (- 127 (char-code ,z)) repeat)) - (7-mask (* 128 repeat))) - (declare (optimize sb-c::preserve-single-use-debug-variables - sb-c::preserve-constants)) - (flet ((%case (bits) - (logxor bits (ash (logand (logxor (+ bits a-mask) - (+ bits z-mask)) - 7-mask) - -2)))) - (declare (inline %case)) - (loop for i below (ceiling (length string) sb-vm:n-word-bytes) - do - (setf (%vector-raw-bits string i) - (%case (%vector-raw-bits string i)))) - string))) + (cond #+sb-unicode + ((simple-base-string-p string) + (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) + (a-mask (* (- 128 (char-code ,a)) repeat)) + (z-mask (* (- 127 (char-code ,z)) repeat)) + (7-mask (* 128 repeat))) + (declare (optimize sb-c::preserve-single-use-debug-variables + sb-c::preserve-constants)) + (flet ((%case (bits) + (logxor bits (ash (logand (logxor (+ bits a-mask) + (+ bits z-mask)) + 7-mask) + -2)))) + (declare (inline %case)) + (loop for i below (ceiling (length string) sb-vm:n-word-bytes) + do + (setf (%vector-raw-bits string i) + (%case (%vector-raw-bits string i)))))) + string) + #+x86-64 + ((simple-character-string-p string) + (let ((length (length string))) + (sb-vm::simd-case ,a string string + i + (do ((index i (1+ index)) + (cases +character-cases+)) + ((>= index length)) + (let ((char (schar string index))) + (with-case-info (char case-index cases + :cases cases) + (let ((code (aref cases ,case-index))) + (unless (zerop code) + (setf (schar string index) + (code-char (truly-the char-code code)))))))))) + string)))) (t (with-one-string (string start end) (declare (optimize (sb-c:insert-array-bounds-checks 0))) @@ -537,7 +553,7 @@ new string COUNT long filled with the fill character." (code-char (truly-the char-code (logxor char #x20)))))))) (t (do ((index start (1+ index)) - (cases #.+character-cases+)) + (cases +character-cases+)) ((>= index end)) (let ((char (schar string index))) (with-case-info (char case-index cases @@ -559,93 +575,111 @@ new string COUNT long filled with the fill character." (declare (ignorable a z)) `(let* ((string (%string string)) (length (length string))) - (cond #+sb-unicode - ((and (eql start 0) - (not end) - (simple-base-string-p string)) - (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) - (a-mask (* (- 128 (char-code ,a)) repeat)) - (z-mask (* (- 127 (char-code ,z)) repeat)) - (7-mask (* 128 repeat))) - (declare (optimize sb-c::preserve-single-use-debug-variables - sb-c::preserve-constants)) - (flet ((%case (bits) - (logxor bits (ash (logand (logxor (+ bits a-mask) - (+ bits z-mask)) - 7-mask) - -2)))) - (declare (inline %case)) - (let ((new (make-string length :element-type 'base-char))) - (loop for i below (ceiling (length string) sb-vm:n-word-bytes) - do - (setf (%vector-raw-bits new i) - (%case (%vector-raw-bits string i)))) - new)))) - (t - (with-array-data ((string-data string :offset-var offset) - (s-start start) - (s-end end) - :check-fill-pointer t) - (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (cond #+sb-unicode - ((simple-base-string-p string-data) - (let* ((new (make-string length :element-type 'base-char))) - (when (> start 0) - (loop for d-i below start - for s-i from offset - do - (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (when (and end - (< end length)) - (loop for d-i from end below length - for s-i from s-end - do (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (do ((s-i s-start (truly-the index (1+ s-i))) - (d-i start (truly-the index (1+ d-i)))) - ((>= s-i s-end)) - (declare (index d-i)) - (let ((char (char-code (schar string-data s-i)))) + (or + (and (eql start 0) + (not end) + (cond #+sb-unicode + ((simple-base-string-p string) + (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) + (a-mask (* (- 128 (char-code ,a)) repeat)) + (z-mask (* (- 127 (char-code ,z)) repeat)) + (7-mask (* 128 repeat))) + (declare (optimize sb-c::preserve-single-use-debug-variables + sb-c::preserve-constants)) + (flet ((%case (bits) + (logxor bits (ash (logand (logxor (+ bits a-mask) + (+ bits z-mask)) + 7-mask) + -2)))) + (declare (inline %case)) + (let ((new (make-string length :element-type 'base-char))) + (loop for i below (ceiling (length string) sb-vm:n-word-bytes) + do + (setf (%vector-raw-bits new i) + (%case (%vector-raw-bits string i)))) + new)))) + #+x86-64 + ((simple-character-string-p string) + (let ((new (make-string length))) + (sb-vm::simd-case ,a string new + i + (do ((index i (1+ index)) + (cases +character-cases+)) + ((>= index length)) + (let* ((char (schar string index)) + (cased (with-case-info (char case-index cases + :cases cases + :miss-value char) + (let ((code (aref cases ,case-index))) + (if (zerop code) + char + (code-char (truly-the char-code code))))))) + (setf (schar new index) cased)))) + new)))) + (with-array-data ((string-data string :offset-var offset) + (s-start start) + (s-end end) + :check-fill-pointer t) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (cond #+sb-unicode + ((simple-base-string-p string-data) + (let* ((new (make-string length :element-type 'base-char))) + (when (> start 0) + (loop for d-i below start + for s-i from offset + do + (locally (declare (optimize (safety 0))) (setf (schar new d-i) - (code-char - (if (<= (char-code ,a) char (char-code ,z)) - (truly-the char-code (logxor char #x20)) - char))))) - new)) - (t - (let ((new (make-string length))) - (when (> start 0) - (loop for d-i below start - for s-i from offset - do - (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (when (and end - (< end length)) - (loop for d-i from end below length - for s-i from s-end - do (locally (declare (optimize (safety 0))) - (setf (schar new d-i) - (schar string-data s-i))))) - (do ((s-i s-start (truly-the index (1+ s-i))) - (d-i start (truly-the index (1+ d-i))) - (cases #.+character-cases+)) - ((>= s-i s-end)) - (declare (index d-i)) - (let* ((char (schar string-data s-i)) - (cased (with-case-info (char case-index cases - :cases cases - :miss-value char) - (let ((code (aref cases ,case-index))) - (if (zerop code) - char - (code-char (truly-the char-code code))))))) - (setf (schar new d-i) cased))) - new)))))))) + (schar string-data s-i))))) + (when (and end + (< end length)) + (loop for d-i from end below length + for s-i from s-end + do (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (do ((s-i s-start (truly-the index (1+ s-i))) + (d-i start (truly-the index (1+ d-i)))) + ((>= s-i s-end)) + (declare (index d-i)) + (let ((char (char-code (schar string-data s-i)))) + (setf (schar new d-i) + (code-char + (if (<= (char-code ,a) char (char-code ,z)) + (truly-the char-code (logxor char #x20)) + char))))) + new)) + (t + (let ((new (make-string length))) + (when (> start 0) + (loop for d-i below start + for s-i from offset + do + (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (when (and end + (< end length)) + (loop for d-i from end below length + for s-i from s-end + do (locally (declare (optimize (safety 0))) + (setf (schar new d-i) + (schar string-data s-i))))) + (do ((s-i s-start (truly-the index (1+ s-i))) + (d-i start (truly-the index (1+ d-i))) + (cases +character-cases+)) + ((>= s-i s-end)) + (declare (index d-i)) + (let* ((char (schar string-data s-i)) + (cased (with-case-info (char case-index cases + :cases cases + :miss-value char) + (let ((code (aref cases ,case-index))) + (if (zerop code) + char + (code-char (truly-the char-code code))))))) + (setf (schar new d-i) cased))) + new))))))) (defun string-upcase (string &key (start 0) end) (declare (explicit-check)) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp new file mode 100644 index 0000000000..5f2d6c6ac5 --- /dev/null +++ b/src/code/x86-64-simd.lisp @@ -0,0 +1,86 @@ +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. + +(in-package "SB-VM") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (define-vop () + (:translate vector-ref-128) + (:args (vector :scs (descriptor-reg)) + (index :scs (any-reg))) + (:arg-types * tagged-num) + (:results (res :scs (int-sse-reg))) + (:result-types simd-pack-ub32) + (:policy :fast-safe) + (:generator 3 + (inst movdqa res + (ea (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) + vector + index + (index-scale (* n-word-bytes 2) index))))) + + (define-vop (set-vector-ref-128) + (:translate (setf vector-ref-128)) + (:args (value :scs (int-sse-reg)) + (vector :scs (descriptor-reg)) + (index :scs (any-reg))) + (:arg-types simd-pack-ub32 * tagged-num) + (:policy :fast-safe) + (:generator 3 + (inst movdqa (ea (- (* vector-data-offset n-word-bytes) other-pointer-lowtag) + vector + index + (index-scale (* n-word-bytes 2) index)) + value)))) + +;;; Cross compilation doesn't understand simd-pack constants. +(defmacro simd-mask (value) + `(inline-vop + (((:info value) ,(logior value + (ash value 32) + (ash value 64) + (ash value 96)))) + ((res int-sse-reg simd-pack-ub32)) + (inst movdqa res (register-inline-constant :sse value)))) + +(defmacro simd-case (a source destination index fallback) + `(macrolet ((mask (ub32) + `(%make-simd-pack-ub32 ,ub32 ,ub32 ,ub32 ,ub32))) + (let ((ascii-p (simd-mask 192)) + (a-mask (simd-mask ,(+ (expt 2 31) (char-code a)))) + (z-mask (simd-mask ,(+ (expt 2 31) 25))) + (flip (simd-mask #x20))) + (declare (optimize speed + sb-c::preserve-single-use-debug-variables)) + (loop for ,index below (ceiling length (/ 128 32)) + do + (let ((bits (vector-ref-128 ,source ,index))) + (unless (zerop (inline-vop + (((bits int-sse-reg simd-pack-ub32 :target temp) bits) + ((ascii-p int-sse-reg simd-pack-ub32 :to :save) ascii-p) + ((temp))) + ((res unsigned-reg unsigned-num)) + (move temp bits) + (inst pcmpgtd temp ascii-p) + (inst pmovmskb res temp))) + (return ,fallback)) + (setf (vector-ref-128 ,destination ,index) + (inline-vop + (((bits int-sse-reg simd-pack-ub32 :target res) bits) + ((a-mask int-sse-reg simd-pack-ub32 :to :save) a-mask) + ((z-mask) z-mask) + ((flip) flip) + ((temp))) + ((res int-sse-reg simd-pack-ub32)) + (move temp bits) + (inst psubd temp a-mask) + (inst pcmpgtd temp z-mask) + (inst pandn temp flip) + (move res bits) + (inst pxor res temp)))))))) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index cf48e7a794..fc65b96b70 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -483,6 +483,10 @@ ;; compiled as part of the compiler ("src/code/macroexpand") + #+sb-simd-pack + ("src/code/simd-fndb") + #+x86-64 + ("src/code/x86-64-simd" :not-host) ("src/code/target-unicode" :not-host) ("src/code/mipsstrops" :not-host) ("src/code/string" :not-host) diff --git a/src/compiler/meta-vmdef.lisp b/src/compiler/meta-vmdef.lisp index 50a9e846ff..b4572c1485 100644 --- a/src/compiler/meta-vmdef.lisp +++ b/src/compiler/meta-vmdef.lisp @@ -1716,6 +1716,7 @@ (collect ((input) (args) (arg-types) + (infos) (temps) (results) (result-types)) @@ -1727,14 +1728,24 @@ for prev = (if this-sc var prev) - do (cond (arg + do (cond ((eq name :info) + (infos this-sc) + (input arg)) + (arg (input arg) (args (list* name :scs (list sc) rest)) (arg-types (or type '*))) (t (temps `(:temporary (:sc ,sc ,@rest) ,name))))) - (loop for (name sc type . rest) in results + (loop for result in results + for (name this-sc) = result + for (nil sc type . rest) = (if this-sc + result + prev) + for prev = (if this-sc + result + prev) do (results (list* name :scs (list sc) rest)) (result-types (or type '*))) `(inline-%primitive @@ -1748,6 +1759,8 @@ (list* :results (results))) (and (result-types) (list* :result-types (result-types))) + (and (infos) + (list* :info (infos))) (list* :generator 0 body) (temps))) nil)) @@ -1808,8 +1821,7 @@ (setf (vop-info-type vop-info) (vop-info-type other)) (return-from found t))) *backend-template-names*)) - (setf (vop-info-type vop-info) (specifier-type my-type-spec))) - vop-info) + (setf (vop-info-type vop-info) (specifier-type my-type-spec)))) (flet ((find-equalp (accessor) ;; Read the slot from VOP-INFO and try to find any other vop-info ;; that has an EQUALP value in that slot, returning that value. From a97efeae357f0cf2d61a6272bd80d042b62c27dd Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 13 Jun 2022 03:14:20 +0300 Subject: [PATCH 3499/4023] Fix win32 --- src/runtime/os-common.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index b752aae80e..20fcd44a94 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -28,6 +28,7 @@ #include "arch.h" #include "interr.h" #include "immobile-space.h" +#include "code.h" #if defined(LISP_FEATURE_OS_PROVIDES_DLOPEN) && !defined(LISP_FEATURE_WIN32) # include <dlfcn.h> #endif From af07ae340cf81a415c21b60688015bca9d2c4332 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 13 Jun 2022 02:51:39 +0300 Subject: [PATCH 3500/4023] Remove an unused macrolet. --- src/code/x86-64-simd.lisp | 65 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 5f2d6c6ac5..b536948668 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -50,37 +50,34 @@ (inst movdqa res (register-inline-constant :sse value)))) (defmacro simd-case (a source destination index fallback) - `(macrolet ((mask (ub32) - `(%make-simd-pack-ub32 ,ub32 ,ub32 ,ub32 ,ub32))) - (let ((ascii-p (simd-mask 192)) - (a-mask (simd-mask ,(+ (expt 2 31) (char-code a)))) - (z-mask (simd-mask ,(+ (expt 2 31) 25))) - (flip (simd-mask #x20))) - (declare (optimize speed - sb-c::preserve-single-use-debug-variables)) - (loop for ,index below (ceiling length (/ 128 32)) - do - (let ((bits (vector-ref-128 ,source ,index))) - (unless (zerop (inline-vop - (((bits int-sse-reg simd-pack-ub32 :target temp) bits) - ((ascii-p int-sse-reg simd-pack-ub32 :to :save) ascii-p) - ((temp))) - ((res unsigned-reg unsigned-num)) - (move temp bits) - (inst pcmpgtd temp ascii-p) - (inst pmovmskb res temp))) - (return ,fallback)) - (setf (vector-ref-128 ,destination ,index) - (inline-vop - (((bits int-sse-reg simd-pack-ub32 :target res) bits) - ((a-mask int-sse-reg simd-pack-ub32 :to :save) a-mask) - ((z-mask) z-mask) - ((flip) flip) - ((temp))) - ((res int-sse-reg simd-pack-ub32)) - (move temp bits) - (inst psubd temp a-mask) - (inst pcmpgtd temp z-mask) - (inst pandn temp flip) - (move res bits) - (inst pxor res temp)))))))) + `(let ((ascii-p (simd-mask 192)) + (a-mask (simd-mask ,(+ (expt 2 31) (char-code a)))) + (z-mask (simd-mask ,(+ (expt 2 31) 25))) + (flip (simd-mask #x20))) + (declare (optimize sb-c::preserve-single-use-debug-variables)) + (loop for ,index below (ceiling length (/ 128 32)) + do + (let ((bits (vector-ref-128 ,source ,index))) + (unless (zerop (inline-vop + (((bits int-sse-reg simd-pack-ub32 :target temp) bits) + ((ascii-p int-sse-reg simd-pack-ub32 :to :save) ascii-p) + ((temp))) + ((res unsigned-reg unsigned-num)) + (move temp bits) + (inst pcmpgtd temp ascii-p) + (inst pmovmskb res temp))) + (return ,fallback)) + (setf (vector-ref-128 ,destination ,index) + (inline-vop + (((bits int-sse-reg simd-pack-ub32 :target res) bits) + ((a-mask int-sse-reg simd-pack-ub32 :to :save) a-mask) + ((z-mask) z-mask) + ((flip) flip) + ((temp))) + ((res int-sse-reg simd-pack-ub32)) + (move temp bits) + (inst psubd temp a-mask) + (inst pcmpgtd temp z-mask) + (inst pandn temp flip) + (move res bits) + (inst pxor res temp))))))) From 2ccd71738eae452dbe21295cc7bba5dd3a424991 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 13 Jun 2022 03:32:19 +0300 Subject: [PATCH 3501/4023] Fix -sb-unicode. No simple-character-string-p there. --- src/code/string.lisp | 146 ++++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 72 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 42abef2596..dd14ffab5c 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -506,41 +506,42 @@ new string COUNT long filled with the fill character." (declare (ignorable a z)) `(cond ((and (zerop start) (not end) - (cond #+sb-unicode - ((simple-base-string-p string) - (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) - (a-mask (* (- 128 (char-code ,a)) repeat)) - (z-mask (* (- 127 (char-code ,z)) repeat)) - (7-mask (* 128 repeat))) - (declare (optimize sb-c::preserve-single-use-debug-variables - sb-c::preserve-constants)) - (flet ((%case (bits) - (logxor bits (ash (logand (logxor (+ bits a-mask) - (+ bits z-mask)) - 7-mask) - -2)))) - (declare (inline %case)) - (loop for i below (ceiling (length string) sb-vm:n-word-bytes) - do - (setf (%vector-raw-bits string i) - (%case (%vector-raw-bits string i)))))) - string) - #+x86-64 - ((simple-character-string-p string) - (let ((length (length string))) - (sb-vm::simd-case ,a string string - i - (do ((index i (1+ index)) - (cases +character-cases+)) - ((>= index length)) - (let ((char (schar string index))) - (with-case-info (char case-index cases - :cases cases) - (let ((code (aref cases ,case-index))) - (unless (zerop code) - (setf (schar string index) - (code-char (truly-the char-code code)))))))))) - string)))) + (typecase string + #+sb-unicode + (simple-base-string + (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) + (a-mask (* (- 128 (char-code ,a)) repeat)) + (z-mask (* (- 127 (char-code ,z)) repeat)) + (7-mask (* 128 repeat))) + (declare (optimize sb-c::preserve-single-use-debug-variables + sb-c::preserve-constants)) + (flet ((%case (bits) + (logxor bits (ash (logand (logxor (+ bits a-mask) + (+ bits z-mask)) + 7-mask) + -2)))) + (declare (inline %case)) + (loop for i below (ceiling (length string) sb-vm:n-word-bytes) + do + (setf (%vector-raw-bits string i) + (%case (%vector-raw-bits string i)))))) + string) + #+x86-64 + ((simple-array character) + (let ((length (length string))) + (sb-vm::simd-case ,a string string + i + (do ((index i (1+ index)) + (cases +character-cases+)) + ((>= index length)) + (let ((char (schar string index))) + (with-case-info (char case-index cases + :cases cases) + (let ((code (aref cases ,case-index))) + (unless (zerop code) + (setf (schar string index) + (code-char (truly-the char-code code)))))))))) + string)))) (t (with-one-string (string start end) (declare (optimize (sb-c:insert-array-bounds-checks 0))) @@ -578,44 +579,45 @@ new string COUNT long filled with the fill character." (or (and (eql start 0) (not end) - (cond #+sb-unicode - ((simple-base-string-p string) - (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) - (a-mask (* (- 128 (char-code ,a)) repeat)) - (z-mask (* (- 127 (char-code ,z)) repeat)) - (7-mask (* 128 repeat))) - (declare (optimize sb-c::preserve-single-use-debug-variables - sb-c::preserve-constants)) - (flet ((%case (bits) - (logxor bits (ash (logand (logxor (+ bits a-mask) - (+ bits z-mask)) - 7-mask) - -2)))) - (declare (inline %case)) - (let ((new (make-string length :element-type 'base-char))) - (loop for i below (ceiling (length string) sb-vm:n-word-bytes) - do - (setf (%vector-raw-bits new i) - (%case (%vector-raw-bits string i)))) - new)))) - #+x86-64 - ((simple-character-string-p string) - (let ((new (make-string length))) - (sb-vm::simd-case ,a string new - i - (do ((index i (1+ index)) - (cases +character-cases+)) - ((>= index length)) - (let* ((char (schar string index)) - (cased (with-case-info (char case-index cases - :cases cases - :miss-value char) - (let ((code (aref cases ,case-index))) - (if (zerop code) - char - (code-char (truly-the char-code code))))))) - (setf (schar new index) cased)))) + (typecase string + #+sb-unicode + (simple-base-string + (let* ((repeat (ldb (byte sb-vm:n-word-bits 0) #x0101010101010101)) + (a-mask (* (- 128 (char-code ,a)) repeat)) + (z-mask (* (- 127 (char-code ,z)) repeat)) + (7-mask (* 128 repeat))) + (declare (optimize sb-c::preserve-single-use-debug-variables + sb-c::preserve-constants)) + (flet ((%case (bits) + (logxor bits (ash (logand (logxor (+ bits a-mask) + (+ bits z-mask)) + 7-mask) + -2)))) + (declare (inline %case)) + (let ((new (make-string length :element-type 'base-char))) + (loop for i below (ceiling (length string) sb-vm:n-word-bytes) + do + (setf (%vector-raw-bits new i) + (%case (%vector-raw-bits string i)))) new)))) + #+x86-64 + ((simple-array character) + (let ((new (make-string length))) + (sb-vm::simd-case ,a string new + i + (do ((index i (1+ index)) + (cases +character-cases+)) + ((>= index length)) + (let* ((char (schar string index)) + (cased (with-case-info (char case-index cases + :cases cases + :miss-value char) + (let ((code (aref cases ,case-index))) + (if (zerop code) + char + (code-char (truly-the char-code code))))))) + (setf (schar new index) cased)))) + new)))) (with-array-data ((string-data string :offset-var offset) (s-start start) (s-end end) From 7d0a1f1da476eb6557a44f038db188b8423fac66 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 12 Jun 2022 21:12:03 -0400 Subject: [PATCH 3502/4023] Reduce conditionalization --- src/assembly/x86-64/assem-rtns.lisp | 6 ++++-- src/code/alloc.lisp | 25 +++---------------------- src/runtime/gencgc.c | 17 +++++++---------- 3 files changed, 14 insertions(+), 34 deletions(-) diff --git a/src/assembly/x86-64/assem-rtns.lisp b/src/assembly/x86-64/assem-rtns.lisp index 9aecb1ec61..5179e0181e 100644 --- a/src/assembly/x86-64/assem-rtns.lisp +++ b/src/assembly/x86-64/assem-rtns.lisp @@ -463,10 +463,12 @@ ;;; However the WITH-REGISTERS-PRESERVED macro seems to think that it is utilized ;;; only by asm code in *ASSEMBLER-ROUTINES*. I had trouble with it otherwise. (define-assembly-routine (alloc-code (:return-style :raw)) - ((:arg arg (signed-reg) rdx-offset) + ((:arg c-arg1 (signed-reg) rdi-offset) + (:arg c-arg2 (signed-reg) rsi-offset) (:res res (descriptor-reg) rdx-offset)) + (progn c-arg1 c-arg2) ; "use" the args + ;; Don't preserve the register which holds the lisp return value (with-registers-preserved (c :except rdx-tn) - (inst mov rdi-tn arg) (pseudo-atomic () (inst call (make-fixup "alloc_code_object" :foreign))) (move res rax-tn))) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index 915e0aa452..d353820bf7 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -488,19 +488,13 @@ (eq space :immobile))) ;; x86-64 has a vop which wraps pseudo-atomic around the foreign call, ;; as is the custom for allocation trampolines. - #+x86-64 (%primitive sb-vm::alloc-code total-words) + #+x86-64 (%primitive sb-vm::alloc-code total-words boxed) #-x86-64 (without-gcing (%make-lisp-obj (alien-funcall (extern-alien "alloc_code_object" - (function unsigned (unsigned 32))) - total-words)))) - #+cheneygc - (%primitive var-alloc total-words 'alloc-code - ;; subtract 1 because var-alloc always adds 1 word - ;; for the header, which is not right for code objects. - -1 code-header-widetag other-pointer-lowtag nil))) - + (function unsigned (unsigned 32) (unsigned 32))) + total-words boxed)))))) (with-pinned-objects (code) (let ((sap (sap+ (int-sap (get-lisp-obj-address code)) (- other-pointer-lowtag)))) @@ -512,19 +506,6 @@ (unless (eq (generation-of code) 0) (return)) (let ((oldval (cas *codeblob-tree* tree newtree))) (if (eq oldval tree) (return) (setq tree oldval)))))) - ;; The immobile space allocator pre-zeroes, and also it needs a nonzero - ;; value in the boxed word count because otherwise it looks like - ;; an immobile space page filler. So don't do any more zeroing there. - ;; (Could dead immobile objects be converted to use FILLER-WIDETAG instead?) - ;; For #+darwin-jit the entire object (other than first word) is cleared in C. - #-darwin-jit - (unless (immobile-space-obj-p code) - ;; Before writing the boxed word count, zeroize up to and including 1 word - ;; after the boxed header so that all pointers can be safely read by GC, - ;; and so that the jump table count word is 0. - (loop for byte-index from (ash boxed word-shift) downto (ash 2 word-shift) - by n-word-bytes - do (setf (sap-ref-word sap byte-index) 0))) ;; The 1st slot beyond the header stores the boxed header size in bytes ;; as an untagged number, which has the same representation as a tagged ;; value denoting a word count if WORD-SHIFT = N-FIXNUM-TAG-BITS. diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index b3d9122531..70b9131d50 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5016,7 +5016,7 @@ DEFINE_LISP_ENTRYPOINT(alloc_list, 0, cons, PAGE_TYPE_CONS) DEFINE_LISP_ENTRYPOINT(alloc_list, 0, mixed, PAGE_TYPE_MIXED) #endif -lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words) +lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words, unsigned boxed) { struct thread *th = get_sb_vm_thread(); // x86-64 uses pseudo-atomic. Others should too, but instead use WITHOUT-GCING @@ -5037,17 +5037,14 @@ lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words) THREAD_JIT(0); code->header = ((uword_t)total_words << CODE_HEADER_SIZE_SHIFT) | CODE_HEADER_WIDETAG; -#ifdef LISP_FEATURE_DARWIN_JIT - // Zeroize everything so that lisp doesn't have to. - // One memcpy is cheaper than 2 system calls per boxed word. - memset(&code->boxed_size, 0, nbytes - N_WORD_BYTES); -#else - // Code pages are not prezeroed, so these assignments are essential to prevent GC - // from seeing bad pointers if it runs as soon as the mutator allows GC. - code->boxed_size = 0; + code->boxed_size = 0; // gets reassigned from lisp code->debug_info = 0; + code->fixups = 0; + lispobj* p = &code->constants[0], *end = (lispobj*)code + boxed; + /* Must intialize to an arbitrary non-pointer value so that GC doesn't crash after the + * size is assigned (at some point prior to storing the constants) */ + for ( ; p < end ; ++p) *p = UNBOUND_MARKER_WIDETAG; ((lispobj*)code)[total_words-1] = 0; // zeroize the simple-fun table count -#endif THREAD_JIT(1); return make_lispobj(code, OTHER_POINTER_LOWTAG); From 7ec3d58d7baefd214930b6420b9324e206ca0be5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 13 Jun 2022 09:20:46 -0400 Subject: [PATCH 3503/4023] Fix failing debug.impure test (Quite likely this doesn't matter any more if nothing else failed?) --- src/runtime/gencgc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 70b9131d50..793c972d22 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5044,6 +5044,7 @@ lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words, unsigned boxed) /* Must intialize to an arbitrary non-pointer value so that GC doesn't crash after the * size is assigned (at some point prior to storing the constants) */ for ( ; p < end ; ++p) *p = UNBOUND_MARKER_WIDETAG; + *p = 0; // 'p' now points to the jump table count word which must be 0 ((lispobj*)code)[total_words-1] = 0; // zeroize the simple-fun table count THREAD_JIT(1); From 06e290c66d885f8155d1d98232db8424670ef82d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 13 Jun 2022 18:49:29 +0300 Subject: [PATCH 3504/4023] Add more NEON instructions. --- src/compiler/arm64/insts.lisp | 168 +++++++++++++++------------ src/compiler/arm64/macros.lisp | 6 +- src/compiler/arm64/target-insts.lisp | 25 +++- 3 files changed, 119 insertions(+), 80 deletions(-) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 2996aaee20..8071765150 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -2517,8 +2517,14 @@ 3)))))) (one-instruction-emitter (segment position) (emit-ldr-literal segment - (if (sc-is dest 32-bit-reg) #b00 #b01) - 0 + (sc-case dest + (32-bit-reg #b00) + (sb-vm::complex-double-reg + #b10) + (t #b01)) + (if (fp-register-p dest) + 1 + 0) (ldb (byte 19 0) (ash (compute-delta position) -2)) (reg-offset dest))) @@ -2623,26 +2629,22 @@ (rn :fields (list (byte 1 30) (byte 5 5)) :type 'simd-reg) (rd :fields (list (byte 1 30) (byte 5 0)) :type 'simd-reg)) -(defun decode-vector-size (size) - (ecase size - (:8b 0) - (:16b 1))) +(define-instruction-format (simd-three-same-sized 32 + :include simd-three-same + :default-printer '(:name :tab rd ", " rn ", " rm)) + (rm :fields (list (byte 1 30) (byte 2 22) (byte 5 16)) :type 'simd-reg) + (rn :fields (list (byte 1 30) (byte 2 22) (byte 5 5)) :type 'simd-reg) + (rd :fields (list (byte 1 30) (byte 2 22) (byte 5 0)) :type 'simd-reg)) -(define-instruction s-orr (segment rd rn rm &optional (size :16b)) - (:printer simd-three-same ((u #b0) (size #b10) (op #b00011)) - '((:cond - ((rn :same-as rm) 'mov) - (t 'orr)) - :tab rd ", " rn (:unless (:same-as rn) "," rm))) - (:emitter - (emit-simd-three-same segment - (decode-vector-size size) - #b0 - #b10 - (reg-offset rm) - #b00011 - (reg-offset rn) - (reg-offset rd)))) +(defun encode-vector-size (size) + (ecase size + (:8b (values 0 0)) + (:16b (values 1 0)) + (:4h (values 0 #b01)) + (:8h (values 1 #b01)) + (:2s (values 0 #b10)) + (:4s (values 1 #b10)) + (:2d (values 1 #b11)))) (define-instruction-macro s-mov (rd rn &optional (size :16b)) `(let ((rd ,rd) @@ -2650,6 +2652,44 @@ (size ,size)) (inst s-orr rd rn rn size))) +(macrolet ((def (name u size op &rest printer) + `(define-instruction ,name (segment rd rn rm &optional (size :16b)) + (:printer simd-three-same ((u ,u) (size ,size) (op ,op)) + ,@printer) + (:emitter + (emit-simd-three-same segment + (encode-vector-size size) + ,u + ,size + (reg-offset rm) + ,op + (reg-offset rn) + (reg-offset rd)))))) + (def s-orr #b0 #b10 #b00011 + '((:cond + ((rn :same-as rm) 'mov) + (t 'orr)) + :tab rd ", " rn (:unless (:same-as rn) ", " rm))) + (def s-and #b0 #b00 #b00011) + (def s-eor #b1 #b00 #b00011)) + +(macrolet ((def (name u op) + `(define-instruction ,name (segment rd rn rm &optional (size :16b)) + (:printer simd-three-same-sized ((u ,u) (op ,op))) + (:emitter + (multiple-value-bind (q size) (encode-vector-size size) + (emit-simd-three-same segment + q + ,u + size + (reg-offset rm) + ,op + (reg-offset rn) + (reg-offset rd))))))) + (def s-sub #b1 #b10000) + (def cmeq #b1 #b10001) + (def cmgt #b0 #b00110)) + (def-emitter simd-scalar-three-same (#b01 2 30) (u 1 29) @@ -2675,26 +2715,10 @@ (rn :fields (list (byte 1 30) (byte 5 5)) :type 'simd-reg) (rd :fields (list (byte 1 30) (byte 5 0)) :type 'simd-reg)) -(define-instruction cmeq (segment rd rn rm &optional size) - (:printer simd-three-same ((u #b1) (op #b10001))) - (:emitter - (multiple-value-bind (size q) - (ecase size - (:8b (values 0 0)) - (:16b (values 0 1))) - (emit-simd-three-same segment - q - 1 - size - (reg-offset rm) - #b10001 - (reg-offset rn) - (reg-offset rd))))) - ;;; (def-emitter simd-extract - (#b0 1 31) + (#b0 1 31) (q 1 30) (#b101110000 9 21) (rm 5 16) @@ -2707,7 +2731,7 @@ (define-instruction ext (segment rd rn rm index &optional (size :16b)) (:emitter (emit-simd-extract segment - (decode-vector-size size) + (encode-vector-size size) (reg-offset rm) index (reg-offset rn) @@ -2794,7 +2818,7 @@ (op2 :field (byte 5 24) :value #b01110) (size :field (byte 2 22)) (op3 :field (byte 5 17) :value #b11000) - (op :field (byte 4 12)) + (op :field (byte 5 12)) (op4 :field (byte 2 10) :value #b10) (rn :fields (list (byte 1 30) (byte 2 22) (byte 5 5)) :type 'vx.t) (rd :fields (list (byte 2 22) (byte 5 0)) :type 'vbhs)) @@ -2853,26 +2877,22 @@ (reg-offset rn) (reg-offset rd)))) -(define-instruction uminv (segment rd sized rn sizen) - (:printer simd-across-lanes ((u 1) (op #b11010) - (rd nil :type 'vhsd))) - (:emitter - (emit-simd-across-lanes - segment - (ecase sizen - (:8b 0) - (:16b 1) - (:4h 0) - (:8h 1) - (:4s 1)) - 1 - (ecase sized - (:b 0) - (:h 1) - (:s #b10)) - #b11010 - (reg-offset rn) - (reg-offset rd)))) +(macrolet ((def (name u op) + `(define-instruction ,name (segment rd rn size) + (:printer simd-across-lanes ((u ,u) (op ,op) + (rd nil :type 'vhsd))) + (:emitter + (multiple-value-bind (q size) (encode-vector-size size) + (emit-simd-across-lanes + segment + q + ,u + size + ,op + (reg-offset rn) + (reg-offset rd))))))) + (def uminv 1 #b11010) + (def umaxv 1 #b01010)) (define-instruction-format (simd-two-misc 32 :default-printer '(:name :tab rd ", " rn)) @@ -2887,18 +2907,20 @@ (rn :fields (list (byte 1 30) (byte 5 5)) :type 'simd-reg) (rd :fields (list (byte 1 30) (byte 5 0)) :type 'simd-reg)) -(define-instruction cnt (segment rd rn size) - (:printer simd-two-misc ((u 0) (op #b00101))) - (:emitter - (emit-simd-two-misc segment - (ecase size - (:8b 0) - (:16b 1)) - 0 - 00 - #b00101 - (reg-offset rn) - (reg-offset rd)))) +(macrolet + ((def (name u size op) + `(define-instruction ,name (segment rd rn &optional (size :16b)) + (:printer simd-two-misc ((u ,u) (size ,size) (op ,op))) + (:emitter + (emit-simd-two-misc segment + (encode-vector-size size) + ,u + ,size + ,op + (reg-offset rn) + (reg-offset rd)))))) + (def cnt #b0 #b00 #b00101) + (def s-mvn #b1 #b00 #b00101)) ;;; Inline constants (defun canonicalize-inline-constant (constant) @@ -2926,7 +2948,7 @@ (setf constant (list :complex-double-float first))))) (destructuring-bind (type value) constant (ecase type - ((:byte :word :dword :qword) + ((:byte :word :dword :qword :oword) (etypecase value ((or integer (cons (eql :layout-id))) (cons type value)))) diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp index bf38c3890d..e3c02ba730 100644 --- a/src/compiler/arm64/macros.lisp +++ b/src/compiler/arm64/macros.lisp @@ -465,10 +465,10 @@ (inst ,op ,value (@ lip (- (* ,offset n-word-bytes) ,lowtag)))))))))))) -(defun load-inline-constant (dst value) - (destructuring-bind (size . label) (register-inline-constant value) +(defun load-inline-constant (dst &rest constant-descriptor) + (destructuring-bind (size . label) (apply #'register-inline-constant constant-descriptor) (ecase size - (:qword + ((:qword :oword) (inst load-from-label dst label))))) ;;; diff --git a/src/compiler/arm64/target-insts.lisp b/src/compiler/arm64/target-insts.lisp index 2fca1c3875..019591fc79 100644 --- a/src/compiler/arm64/target-insts.lisp +++ b/src/compiler/arm64/target-insts.lisp @@ -237,13 +237,30 @@ "S") value))) +(defun decode-vector-size (q size) + (case q + (0 + (case size + (#b00 "8B") + (#b01 "4H") + (#b10 "2S"))) + (1 + (case size + (#b00 "16B") + (#b01 "8H") + (#b10 "4S") + (#b11 "2D"))))) + (defun print-simd-reg (value stream dstate) (declare (ignore dstate)) - (destructuring-bind (size offset) value + (multiple-value-bind (q size offset) + (if (= (length value) 3) + (destructuring-bind (q size offset) value + (values q size offset)) + (destructuring-bind (q offset) value + (values q 0 offset))) (format stream "V~d.~a" offset - (if (zerop size) - "8B" - "16B")))) + (decode-vector-size q size)))) (defun print-vbhs (value stream dstate) (declare (ignore dstate)) From bf0095a00b83d93a39a157bec19fe74f17a76d91 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 13 Jun 2022 20:07:19 +0300 Subject: [PATCH 3505/4023] Add a NEON variant of simd-string-case. --- src/code/arm64-simd.lisp | 79 ++++++++++++++++++++++++++++++++++ src/code/simd-fndb.lisp | 10 +++-- src/code/string.lisp | 34 +++++++-------- src/code/x86-64-simd.lisp | 2 +- src/cold/build-order.lisp-expr | 4 +- src/compiler/arm64/insts.lisp | 5 ++- 6 files changed, 111 insertions(+), 23 deletions(-) create mode 100644 src/code/arm64-simd.lisp diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp new file mode 100644 index 0000000000..4fd7bfe9fe --- /dev/null +++ b/src/code/arm64-simd.lisp @@ -0,0 +1,79 @@ +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. + +(in-package "SB-VM") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (define-vop () + (:translate vector-ref-128) + (:args (vector :scs (descriptor-reg) :to :result) + (index :scs (any-reg))) + (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) + (:arg-types * tagged-num) + (:results (res :scs (complex-double-reg))) + (:result-types complex-double-float) + (:policy :fast-safe) + (:generator 3 + (inst lsl offset index (1+ (- word-shift n-fixnum-tag-bits))) + (inst add offset offset (- (* vector-data-offset n-word-bytes) + other-pointer-lowtag)) + (inst ldr res (@ vector offset)))) + + (define-vop (set-vector-ref-128) + (:translate (setf vector-ref-128)) + (:args (value :scs (complex-double-reg)) + (vector :scs (descriptor-reg) :to :result) + (index :scs (any-reg))) + (:temporary (:scs (non-descriptor-reg) :from (:argument 2)) offset) + (:arg-types complex-double-float * tagged-num) + (:policy :fast-safe) + (:generator 3 + (inst lsl offset index (1+ (- word-shift n-fixnum-tag-bits))) + (inst add offset offset (- (* vector-data-offset n-word-bytes) + other-pointer-lowtag)) + (inst str value (@ vector offset))))) + +(defmacro simd-mask (value) + `(inline-vop + (((:info value) ,(logior value + (ash value 32) + (ash value 64) + (ash value 96)))) + ((res complex-double-reg complex-double-float)) + (load-inline-constant res :oword value))) + +(defmacro simd-string-case (a source destination index fallback) + `(let ((ascii-p (simd-mask 192)) + (a-mask (simd-mask ,(char-code a))) + (z-mask (simd-mask 25)) + (flip (simd-mask #x20))) + (declare (optimize sb-c::preserve-single-use-debug-variables)) + (loop for ,index below (ceiling length (/ 128 32)) + do + (let ((bits (vector-ref-128 ,source ,index))) + (unless (zerop (inline-vop + (((bits complex-double-reg complex-double-float :target temp) bits) + ((ascii-p complex-double-reg complex-double-float :to :save) ascii-p) + ((temp))) + ((res unsigned-reg unsigned-num)) + (inst cmgt temp bits ascii-p :4s) + (inst umaxv temp temp :4s) + (inst umov res temp 0 :s))) + (return ,fallback)) + (setf (vector-ref-128 ,destination ,index) + (inline-vop (((bits complex-double-reg complex-double-float :target res) bits) + ((a-mask complex-double-reg complex-double-float :to :save) a-mask) + ((z-mask) z-mask) + ((flip) flip) + ((temp))) + ((res complex-double-reg complex-double-float)) + (inst s-sub temp bits a-mask :4s) + (inst cmhs temp z-mask temp :4s) + (inst s-and temp temp flip) + (inst s-eor res bits temp))))))) diff --git a/src/code/simd-fndb.lisp b/src/code/simd-fndb.lisp index 421ced06a5..856f898a4e 100644 --- a/src/code/simd-fndb.lisp +++ b/src/code/simd-fndb.lisp @@ -9,8 +9,12 @@ (in-package "SB-VM") -(defknown vector-ref-128 (t index) (simd-pack (unsigned-byte 32)) - (flushable)) +(deftype 128-element () + #+x86-64 '(simd-pack (unsigned-byte 32)) + #+arm64 'complex-double-float) -(defknown (setf vector-ref-128) (simd-pack t index) (values) +(defknown vector-ref-128 (t index) 128-element + (flushable)) + +(defknown (setf vector-ref-128) (128-element t index) (values) ()) diff --git a/src/code/string.lisp b/src/code/string.lisp index dd14ffab5c..f0eab7e68b 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -526,10 +526,10 @@ new string COUNT long filled with the fill character." (setf (%vector-raw-bits string i) (%case (%vector-raw-bits string i)))))) string) - #+x86-64 + #+(or x86-64 arm64) ((simple-array character) (let ((length (length string))) - (sb-vm::simd-case ,a string string + (sb-vm::simd-string-case ,a string string i (do ((index i (1+ index)) (cases +character-cases+)) @@ -600,23 +600,23 @@ new string COUNT long filled with the fill character." (setf (%vector-raw-bits new i) (%case (%vector-raw-bits string i)))) new)))) - #+x86-64 + #+(or x86-64 arm64) ((simple-array character) (let ((new (make-string length))) - (sb-vm::simd-case ,a string new - i - (do ((index i (1+ index)) - (cases +character-cases+)) - ((>= index length)) - (let* ((char (schar string index)) - (cased (with-case-info (char case-index cases - :cases cases - :miss-value char) - (let ((code (aref cases ,case-index))) - (if (zerop code) - char - (code-char (truly-the char-code code))))))) - (setf (schar new index) cased)))) + (sb-vm::simd-string-case ,a string new + i + (do ((index i (1+ index)) + (cases +character-cases+)) + ((>= index length)) + (let* ((char (schar string index)) + (cased (with-case-info (char case-index cases + :cases cases + :miss-value char) + (let ((code (aref cases ,case-index))) + (if (zerop code) + char + (code-char (truly-the char-code code))))))) + (setf (schar new index) cased)))) new)))) (with-array-data ((string-data string :offset-var offset) (s-start start) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index b536948668..7b26f90947 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -49,7 +49,7 @@ ((res int-sse-reg simd-pack-ub32)) (inst movdqa res (register-inline-constant :sse value)))) -(defmacro simd-case (a source destination index fallback) +(defmacro simd-string-case (a source destination index fallback) `(let ((ascii-p (simd-mask 192)) (a-mask (simd-mask ,(+ (expt 2 31) (char-code a)))) (z-mask (simd-mask ,(+ (expt 2 31) 25))) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index fc65b96b70..9d2be1a6f0 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -483,10 +483,12 @@ ;; compiled as part of the compiler ("src/code/macroexpand") - #+sb-simd-pack + #+(or arm64 x86-64) ("src/code/simd-fndb") #+x86-64 ("src/code/x86-64-simd" :not-host) + #+arm64 + ("src/code/arm64-simd" :not-host) ("src/code/target-unicode" :not-host) ("src/code/mipsstrops" :not-host) ("src/code/string" :not-host) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 8071765150..50d8c3a296 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -2688,7 +2688,10 @@ (reg-offset rd))))))) (def s-sub #b1 #b10000) (def cmeq #b1 #b10001) - (def cmgt #b0 #b00110)) + (def cmgt #b0 #b00110) + (def cmge #b0 #b00111) + (def cmhi #b1 #b00110) + (def cmhs #b1 #b00111)) (def-emitter simd-scalar-three-same (#b01 2 30) From 202799b04313451b082a449ce4591a7c9e894fd9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 13 Jun 2022 20:49:17 +0300 Subject: [PATCH 3506/4023] Fill the constant vector alignment word with 0 on darwin-jit again. Just as it is everywhere else, and that way ctu:find-code-constants doesn't get confused. --- src/compiler/generic/target-core.lisp | 4 +--- src/runtime/gencgc.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index d247b6497f..d0e22a4c24 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -300,9 +300,7 @@ (boxed-data ;; <header, boxed_size, debug_info, fixups> are absent from the simple-vector #+darwin-jit - (make-array (- nboxed sb-vm:code-constants-offset) - :initial-element (%make-lisp-obj (logior #xff00 - sb-vm:unbound-marker-widetag)))) + (make-array (- nboxed sb-vm:code-constants-offset) :initial-element 0)) (n-named-calls ;; Pre-scan for fdefinitions to ensure their existence. ;; Doing so guarantees that storing them into the boxed header now diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 793c972d22..eec196b8a6 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5043,7 +5043,7 @@ lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words, unsigned boxed) lispobj* p = &code->constants[0], *end = (lispobj*)code + boxed; /* Must intialize to an arbitrary non-pointer value so that GC doesn't crash after the * size is assigned (at some point prior to storing the constants) */ - for ( ; p < end ; ++p) *p = UNBOUND_MARKER_WIDETAG; + for ( ; p < end ; ++p) *p = 0; *p = 0; // 'p' now points to the jump table count word which must be 0 ((lispobj*)code)[total_words-1] = 0; // zeroize the simple-fun table count THREAD_JIT(1); From df08dae00bfde7e1f9454b50fce3e18635477480 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 13 Jun 2022 14:37:39 -0400 Subject: [PATCH 3507/4023] Fix {mips,ppc64} variant of conservative_root_p Never return a filler. Also skip fillers if DEBUG_CORE_LOADING is defined. --- src/runtime/coreparse.c | 4 ++++ src/runtime/gencgc.c | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index d7d6e0f6a7..a6ea7be62f 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -1289,6 +1289,10 @@ static uword_t visit(lispobj* where, lispobj* limit, uword_t arg) struct visitor* v = (struct visitor*)arg; lispobj* obj = where; while (obj < limit) { + if (widetag_of(obj) == FILLER_WIDETAG) { + obj += object_size(obj); + continue; + } lispobj ptr = compute_lispobj(obj); tally(ptr, v); if (!hopscotch_get(v->reached, ptr, 0)) printf("unreachable: %p\n", (void*)ptr); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index eec196b8a6..3c27b434ac 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2051,8 +2051,18 @@ static lispobj conservative_root_p(lispobj addr, page_index_t addr_page_index) || is_code(page->type)) return make_lispobj(object_start, OTHER_POINTER_LOWTAG); + /* Take special care not to return fillers. A real-world example: + * - a boxed register contains 0x528b4000 + * - the object formerly at 0x528b4000 is a filler + * - compute_lispobj(0x528b4000) returns 0x528b4000 because LOWTAG_FOR_WIDETAG + * says that FILLER_WIDTAG has a 0 lowtag. + * compute_lispobj simply ORs in the 0 which gives back the original address + * and that of course satisfies the equality test. */ + // Correctly tagged pointer: ok - if (addr == compute_lispobj(object_start)) return addr; + if (addr == compute_lispobj(object_start) + && widetag_of(object_start) != FILLER_WIDETAG) + return addr; return 0; } #endif From 193895ed991b5feb461123328f2e0ad8c8decead Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 13 Jun 2022 14:43:28 -0400 Subject: [PATCH 3508/4023] Make *runtime-options* constant --- src/code/toplevel.lisp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/code/toplevel.lisp b/src/code/toplevel.lisp index a8903b2da9..83432d7ea8 100644 --- a/src/code/toplevel.lisp +++ b/src/code/toplevel.lisp @@ -403,11 +403,12 @@ any non-negative real number." (exit :code 1)) -(defvar *runtime-options* +(defconstant-eqx +runtime-options+ #("--noinform" "--core" "--help" "--version" "--dynamic-space-size" "--control-stack-size" "--tls" "--debug-environment" "--disable-ldb" "--lose-on-corruption" - "--end-runtime-options" "--merge-core-pages" "--no-merge-core-pages")) + "--end-runtime-options" "--merge-core-pages" "--no-merge-core-pages") + #'equalp) ;;; the default system top level function (defun toplevel-init () @@ -504,7 +505,7 @@ any non-negative real number." ((string= option "--end-toplevel-options") (pop-option) (return)) - ((find option *runtime-options* :test #'string=) + ((find option +runtime-options+ :test #'string=) (startup-error "C runtime option ~a in the middle of Lisp options." option)) (t From e7dabe2d0381848cfd73ff9a5197de382a139e2d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 13 Jun 2022 15:39:34 -0400 Subject: [PATCH 3509/4023] Try to avoid SB-DI::*FUN-END-COOKIES* Tried to fix it on ppc but failed, presumably due to the instructions around the comment saying "I have literally no idea why this constant is -24" in ppc-assem.S. Some of the others have MAKE-BPT-LRA signaling an error. So at least a few architectures pass the tests in debug.impure with the modified code. --- src/code/debug-int.lisp | 43 ++++++++++++++++++++++++++++------------- src/code/gc.lisp | 1 + src/runtime/gencgc.c | 2 +- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 7d9b9f14c1..83b4d1c6e2 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -527,6 +527,20 @@ ;;; different values, because this slot is relative to the object base ;;; address, whereas the one in C is an index into code->constants. (defconstant real-lra-slot code-constants-offset) +(eval-when (:compile-toplevel :execute) + #+(or mips x86 x86-64) (pushnew :have-cookie-slot sb-xc:*features*)) +#+have-cookie-slot +(defconstant cookie-slot (+ code-constants-offset 1 #+(or x86 x86-64) 1)) +(defconstant bpt-lra-boxed-nwords + ;; * For non-x86: a single boxed constant holds the true LRA. + ;; Additionally, MIPS gets a boxed slot for the cookie + ;; that formerly went in a weak hash-table. + ;; * For x86[-64]: one boxed constant holds the code object to which + ;; to return, one holds the displacement into that object, + ;; and one holds the cookie + (+ code-constants-offset 1 + #+(or x86-64 x86) 1 + #+have-cookie-slot 1)) (declaim (inline control-stack-pointer-valid-p)) (defun control-stack-pointer-valid-p (x &optional (aligned t)) @@ -3270,9 +3284,11 @@ register." ;;; This maps bpt-lra objects to cookies, so that ;;; HANDLE-FUN-END-BREAKPOINT can find the appropriate cookie for the ;;; breakpoint hook. -;;; FIXME: assuming the preceding comment is correct, this seems an incredibly bad -;;; way to store the data. Why not just allocate an additional boxed slot in every -;;; bpt-lra object to store its cookies? Why use a hash table? +;;; FIXME: this is an inefficient way to store the data - each hit of the +;;; breakpoint requires removing a key from a synchronized weak hash-table. +;;; The problem is that most of the architectures have a terribly constraining +;;; layout of the so-called bpt-lra. +#-have-cookie-slot (define-load-time-global *fun-end-cookies* (make-hash-table :test 'eq :synchronized t)) @@ -3289,16 +3305,17 @@ register." (lambda (frame breakpoint) (declare (ignore breakpoint) (type frame frame)) - (multiple-value-bind (lra component offset) + (multiple-value-bind (lra bpt-codeblob offset) (make-bpt-lra (frame-saved-lra frame debug-fun)) (setf (frame-saved-lra frame debug-fun) lra) (let ((end-bpts (breakpoint-%info starter-bpt))) - (let ((data (breakpoint-data component offset))) + (let ((data (breakpoint-data bpt-codeblob offset))) (setf (breakpoint-data-breakpoints data) end-bpts) (dolist (bpt end-bpts) (setf (breakpoint-internal-data bpt) data))) (let ((cookie (make-fun-end-cookie lra debug-fun))) - (setf (gethash component *fun-end-cookies*) cookie) + #+have-cookie-slot (setf (code-header-ref bpt-codeblob cookie-slot) cookie) + #-have-cookie-slot (setf (gethash bpt-codeblob *fun-end-cookies*) cookie) (dolist (bpt end-bpts) (let ((fun (breakpoint-cookie-fun bpt))) (when fun (funcall fun frame cookie))))))))) @@ -3658,8 +3675,9 @@ register." (let* ((scp (sb-alien:sap-alien signal-context (* os-context-t))) (frame (signal-context-frame signal-context)) (component (breakpoint-data-component data)) - (cookie (gethash component *fun-end-cookies*))) - (remhash component *fun-end-cookies*) + (cookie #+have-cookie-slot (code-header-ref component cookie-slot) + #-have-cookie-slot (gethash component *fun-end-cookies*))) + #-have-cookie-slot (remhash component *fun-end-cookies*) (dolist (bpt breakpoints) (funcall (breakpoint-hook-fun bpt) frame bpt @@ -3685,6 +3703,9 @@ register." ;;;; MAKE-BPT-LRA (used for :FUN-END breakpoints) +;;; FIXME: why does this imply that it makes an LRA when it actually makes +;;; a code blob? Despite the rename in git rev 2437d7f139 apparently I took a cue +;;; from the former name ("MAKE-BOGUS-LRA") as if that spoke the truth. ;;; Make a breakpoint LRA object that signals a breakpoint trap when returned to. ;;; If the breakpoint trap handler returns, REAL-LRA is returned to. ;;; Three values are returned: the new LRA object, the code component it is part of, @@ -3710,12 +3731,8 @@ register." (code-object (sb-c:allocate-code-object nil 0 - ;; For non-x86: a single boxed constant holds the true LRA. - ;; For x86[-64]: one boxed constant holds the code object to which - ;; to return, and one holds the displacement into that object. ;; Ensure required boxed header alignment. - (align-up (+ code-constants-offset 1 #+(or x86-64 x86) 1) - sb-c::code-boxed-words-align) + (align-up bpt-lra-boxed-nwords sb-c::code-boxed-words-align) (+ length n-word-bytes ; Jump Table prefix word ;; Alignment padding, LRA header diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 978aa4b596..05528dd7bc 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -90,6 +90,7 @@ and submit it as a patch." (cond ((not (sb-vm:is-lisp-pointer (get-lisp-obj-address object))) 0) ((eq object nil) (ash sb-vm::sizeof-nil-in-words sb-vm:word-shift)) ((simple-fun-p object) (code-object-size (fun-code-header object))) + #-(or x86 x86-64 arm64 riscv) ((lra-p object) 1) (t (with-alien ((sizer (function unsigned unsigned) :extern "primitive_object_size")) (with-pinned-objects (object) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 3c27b434ac..1ec4be2c8d 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5313,7 +5313,7 @@ int gencgc_handle_wp_violation(__attribute__((unused)) void* context, void* faul "Fault @ %p, PC=%p, page %"PAGE_INDEX_FMT" (~WP) mark=%#x gc_active=%d\n" " mixed_region=%p:%p\n" " page.scan_start: %p .words_used: %u .type: %d .gen: %d\n", - fault_addr, (void*)(context?os_context_pc(context):-1), page_index, + fault_addr, (void*)(context?os_context_pc(context):(uword_t)-1), page_index, mark, gc_active_p, mixed_region->start_addr, mixed_region->end_addr, page_scan_start(page_index), From 49baba3888ad3bab999db925e1272e67a2c44c0f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 13 Jun 2022 15:46:27 -0400 Subject: [PATCH 3510/4023] Define copy-code-object only where it works --- src/code/ntrace.lisp | 22 +++++++++++++++ src/compiler/generic/target-core.lisp | 40 +++++++++++++-------------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 596a387178..bf58f89283 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -764,6 +764,28 @@ functions when called with no arguments." (eval-when (:compile-toplevel :load-toplevel) (export 'sb-int::encapsulate-funobj 'sb-int)) +;;; Suppose you want to trace function #'FOO no matter how a caller +;;; references it (maybe capturing #'FOO in a variable before asking +;;; to trace FOO). We can do that without resorting to breakpoints, +;;; by replacing the simple-fun entry point in the header of the code +;;; that contains FOO such that it points to a different simple-fun +;;; outside of itself. That other simple-fun calls the tracing routine +;;; and then the real FOO. An entry point can't be replaced with a +;;; closure, because CLOSURE and SIMPLE-FUN are not fungible. +;;; +;;; +-------------------------+ +--------------------+ +;;; | codeblob foo | | codeblob "TRACER" | +;;; | ... | | | +;;; | ... boxed data ... | | boxed word: #'foo | -> the "real" FOO +;;; | ... | | | +;;; | ... unboxed data ... | | | +;;; | ... | +--------------------+ +;;; | simple-fun-header #'foo | --> | call trace helper | +;;; | redirected entry point | --/ +--------------------+ +;;; | instructions of #'FOO | +;;; | ... | +;;; +-------------------------+ + (defun compile-funobj-encapsulation (wrapper info actual-fun) #+(or x86 x86-64) (let ((code diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index d0e22a4c24..9b54ffe233 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -53,23 +53,19 @@ ;;; Point FUN's 'self' slot to FUN. ;;; FUN must be pinned when calling this. -(declaim (inline assign-simple-fun-self)) -(defun assign-simple-fun-self (fun) - (let ((self ;; x86 backends store the address of the entrypoint in 'self' - #+(or x86 x86-64 arm64) - (%make-lisp-obj - (truly-the word (+ (get-lisp-obj-address fun) - (ash sb-vm:simple-fun-insts-offset sb-vm:word-shift) - (- sb-vm:fun-pointer-lowtag)))) - ;; non-x86 backends store the function itself (what else?) in 'self' - #-(or x86 x86-64 arm64) fun)) - #-darwin-jit - (setf (sb-vm::%simple-fun-self fun) self) - #+darwin-jit - (sb-vm::jit-patch (+ (get-lisp-obj-address fun) - (- sb-vm:fun-pointer-lowtag) - (* sb-vm:simple-fun-self-slot sb-vm:n-word-bytes)) - (get-lisp-obj-address self)))) +#-darwin-jit ; done entirely by C for #+darwin-jit +(defmacro assign-simple-fun-self (fun) + `(let* ((fun ,fun) + (self + ;; a few architectures store the untagged address of the entrypoint in 'self' + #+(or x86 x86-64 arm64) + (%make-lisp-obj + (truly-the word (+ (get-lisp-obj-address fun) + (ash sb-vm:simple-fun-insts-offset sb-vm:word-shift) + (- sb-vm:fun-pointer-lowtag)))) + ;; all others store the function itself (what else?) in 'self' + #-(or x86 x86-64 arm64) fun)) + (setf (sb-vm::%simple-fun-self fun) self))) (define-load-time-global sb-fasl::*asm-routine-index-to-name* #()) (declaim (simple-vector sb-fasl::*asm-routine-index-to-name*)) @@ -181,7 +177,12 @@ preserved t))) (finish-fixups code-obj preserved)))) -;;; Return a behaviorally identical copy of CODE. +;;; Return a behaviorally identical copy of CODE which is used for TRACE +;;; in "funobj encapsulation" mode where we just switch an entry point +;;; so that it jumps to a tracing routine and then back again. +;;; The code that gets copied is just the tracing wrapper. +;;; See the example at COMPILE-FUNOBJ-ENCAPSULATION in ntrace +#+(or x86 x86-64) (defun copy-code-object (code) ;; Must have one simple-fun (aver (= (code-n-entries code) 1)) @@ -197,10 +198,7 @@ (copy (allocate-code-object :dynamic (code-n-named-calls code) boxed unboxed))) (with-pinned-objects (code copy) - #-darwin-jit (%byte-blt (code-instructions code) 0 (code-instructions copy) 0 unboxed) - #+darwin-jit - (sb-vm::jit-memcpy (code-instructions copy) (code-instructions code) unboxed) ;; copy boxed constants so that the fixup step (if needed) sees the 'fixups' ;; slot from the new object. (loop for i from 2 below boxed From d6303cff581a868c6c0525300d0b84d63f1fdb06 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 13 Jun 2022 20:58:37 -0400 Subject: [PATCH 3511/4023] Adjust TRACE :encapsulate nil expectations - works on sparc without the *fun-end-cookie* hash-table entry - doesn't work at all on 32-bit arm as evident from the self-proclaimed "random garbage" in arm-assem --- src/code/debug-int.lisp | 2 +- src/runtime/arm-assem.S | 2 +- tests/debug.impure.lisp | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 83b4d1c6e2..3dae4df89d 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -528,7 +528,7 @@ ;;; address, whereas the one in C is an index into code->constants. (defconstant real-lra-slot code-constants-offset) (eval-when (:compile-toplevel :execute) - #+(or mips x86 x86-64) (pushnew :have-cookie-slot sb-xc:*features*)) + #+(or sparc mips x86 x86-64) (pushnew :have-cookie-slot sb-xc:*features*)) #+have-cookie-slot (defconstant cookie-slot (+ code-constants-offset 1 #+(or x86 x86-64) 1)) (defconstant bpt-lra-boxed-nwords diff --git a/src/runtime/arm-assem.S b/src/runtime/arm-assem.S index 0eb92a1f5c..e118eb6eab 100644 --- a/src/runtime/arm-assem.S +++ b/src/runtime/arm-assem.S @@ -287,7 +287,7 @@ fun_end_breakpoint_trap: fun_end_breakpoint_end: @@ FIXME: writing this as a lisp assembly routine would eliminate all the -@@ preprocessor noise. There's no reasom it can't be done, but we lack +@@ preprocessor noise. There's no reason it can't be done, but we lack @@ instruction encoders for: stmfd, ldmfd, stmea, ldmea, fstmfdd, fldfdd. #define DEFINE_TRAMPOLINE(name, entry) \ diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index fb343fd2b7..adb61a87df 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -15,6 +15,9 @@ (cl:in-package :cl-user) +#+(and (or sparc mips x86 x86-64) (not sb-devel)) +(assert (not (find-symbol "*FUN-END-COOKIES*" "SB-DI"))) + ;;; The debugger doesn't have any native knowledge of the interpreter (when (eq sb-ext:*evaluator-mode* :interpret) (invoke-restart 'run-tests::skip-file)) @@ -132,7 +135,7 @@ (declare (ignore f stuff)))))) (defparameter *breakpoint-tracing-expectations* - '(:fails-on (or (and :ppc (not :linux)) :arm64) + '(:fails-on (or (and :ppc (not :linux)) :arm :arm64) :broken-on :freebsd)) ;;; bug 379 From 94459f78d4d7b04524ee4d7918c73843e6a765aa Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 14 Jun 2022 12:09:48 -0400 Subject: [PATCH 3512/4023] Disable tests of breakpoint-based tracing on ppc and ppc64 We hadn't one regression test of multiple-value returns with breakpoints, so I added one, which failed on ppc. We know already that breakpoints don't work on freebsd, so just stop testing them entirely. Even though single-value returns seemed to work, the debugger is healthier by not having to cater to already-on-life-support logic. Specifically, we can remove one variation on mapping a fun-end breakpoint to its metadata: we don't need the *FUN-END-COOKIES* table because the so-called bpt-LRA (formerly "bogus LRA") can have as many slots as you like; but as git rev e7dabe2d said, I couldn't figure it out for ppc. --- src/code/debug-int.lisp | 35 +++++++++++------------------------ tests/debug.impure.lisp | 30 +++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 3dae4df89d..ac7101d001 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -526,11 +526,6 @@ ;;; "#define REAL_LRA_SLOT" in breakpoint.c. These have unfortunately ;;; different values, because this slot is relative to the object base ;;; address, whereas the one in C is an index into code->constants. -(defconstant real-lra-slot code-constants-offset) -(eval-when (:compile-toplevel :execute) - #+(or sparc mips x86 x86-64) (pushnew :have-cookie-slot sb-xc:*features*)) -#+have-cookie-slot -(defconstant cookie-slot (+ code-constants-offset 1 #+(or x86 x86-64) 1)) (defconstant bpt-lra-boxed-nwords ;; * For non-x86: a single boxed constant holds the true LRA. ;; Additionally, MIPS gets a boxed slot for the cookie @@ -538,9 +533,9 @@ ;; * For x86[-64]: one boxed constant holds the code object to which ;; to return, one holds the displacement into that object, ;; and one holds the cookie - (+ code-constants-offset 1 - #+(or x86-64 x86) 1 - #+have-cookie-slot 1)) + (+ code-constants-offset 2 #+(or x86-64 x86) 1)) +(defconstant real-lra-slot code-constants-offset) +(defconstant cookie-slot (+ code-constants-offset 1 #+(or x86 x86-64) 1)) (declaim (inline control-stack-pointer-valid-p)) (defun control-stack-pointer-valid-p (x &optional (aligned t)) @@ -3281,17 +3276,6 @@ register." ;; the DEBUG-FUN associated with this cookie (debug-fun nil :read-only t)) -;;; This maps bpt-lra objects to cookies, so that -;;; HANDLE-FUN-END-BREAKPOINT can find the appropriate cookie for the -;;; breakpoint hook. -;;; FIXME: this is an inefficient way to store the data - each hit of the -;;; breakpoint requires removing a key from a synchronized weak hash-table. -;;; The problem is that most of the architectures have a terribly constraining -;;; layout of the so-called bpt-lra. -#-have-cookie-slot -(define-load-time-global *fun-end-cookies* - (make-hash-table :test 'eq :synchronized t)) - ;;; This returns a hook function for the start helper breakpoint ;;; associated with a :FUN-END breakpoint. The returned function ;;; makes a fake LRA that all returns go through, and this piece of @@ -3314,8 +3298,7 @@ register." (dolist (bpt end-bpts) (setf (breakpoint-internal-data bpt) data))) (let ((cookie (make-fun-end-cookie lra debug-fun))) - #+have-cookie-slot (setf (code-header-ref bpt-codeblob cookie-slot) cookie) - #-have-cookie-slot (setf (gethash bpt-codeblob *fun-end-cookies*) cookie) + (setf (code-header-ref bpt-codeblob cookie-slot) cookie) (dolist (bpt end-bpts) (let ((fun (breakpoint-cookie-fun bpt))) (when fun (funcall fun frame cookie))))))))) @@ -3532,6 +3515,11 @@ register." ;;;; breakpoint handlers (layer between C and exported interface) ;;; This maps components to a mapping of offsets to BREAKPOINT-DATAs. +;;; FIXME: these data should hang off of the component itself. +;;; We already have a thin wrapper on %CODE-DEBUG-INFO which allows it to +;;; hold both the compiler-generated metadata and the debugger's data. +;;; It might be preferable not to write to code if #+darwin-jit +;;; but I don't think so - the hash-table entails far more overhead. (define-load-time-global *component-breakpoint-offsets* (make-hash-table :test 'eq :synchronized t)) @@ -3675,9 +3663,7 @@ register." (let* ((scp (sb-alien:sap-alien signal-context (* os-context-t))) (frame (signal-context-frame signal-context)) (component (breakpoint-data-component data)) - (cookie #+have-cookie-slot (code-header-ref component cookie-slot) - #-have-cookie-slot (gethash component *fun-end-cookies*))) - #-have-cookie-slot (remhash component *fun-end-cookies*) + (cookie (code-header-ref component cookie-slot))) (dolist (bpt breakpoints) (funcall (breakpoint-hook-fun bpt) frame bpt @@ -3771,6 +3757,7 @@ register." 0 length) (values (%make-lisp-obj (logior (sap-int lra-header-addr) other-pointer-lowtag)) (sanctify-for-execution code-object) + ;; FIXME: what does "3" represent in this formula? (+ (trap-offset) (* 3 n-word-bytes)))))))) ;;;; miscellaneous diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index adb61a87df..a0dab1f8c9 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -15,9 +15,6 @@ (cl:in-package :cl-user) -#+(and (or sparc mips x86 x86-64) (not sb-devel)) -(assert (not (find-symbol "*FUN-END-COOKIES*" "SB-DI"))) - ;;; The debugger doesn't have any native knowledge of the interpreter (when (eq sb-ext:*evaluator-mode* :interpret) (invoke-restart 'run-tests::skip-file)) @@ -100,6 +97,12 @@ (declare (ignore arg)) 'ok) +(defun mv-trace-this (&optional arg) + (case arg + (2 (values 'ok "hi")) + (3 (values 'ok "hi" :foo)) + (4 (values 'ok "hi" :foo :bar)))) + (defun trace-fact (n) (if (zerop n) 1 @@ -135,8 +138,8 @@ (declare (ignore f stuff)))))) (defparameter *breakpoint-tracing-expectations* - '(:fails-on (or (and :ppc (not :linux)) :arm :arm64) - :broken-on :freebsd)) + '(:fails-on (or :arm :arm64) + :broken-on (or :ppc :ppc64))) ;;; bug 379 (with-test (:name (trace :encapsulate nil) @@ -146,6 +149,23 @@ (assert (search "TRACE-THIS" output)) (assert (search "returned OK" output)))) +(with-test (:name :breakpoint-trace-multival . #.*breakpoint-tracing-expectations*) + (let ((output (with-traced-function (mv-trace-this :encapsulate nil) + (assert (equal (multiple-value-list (mv-trace-this 2)) + '(ok "hi")))))) + (assert (search "MV-TRACE-THIS" output)) + (assert (search "returned OK" output))) + (let ((output (with-traced-function (mv-trace-this :encapsulate nil) + (assert (equal (multiple-value-list (mv-trace-this 3)) + '(ok "hi" :foo)))))) + (assert (search "MV-TRACE-THIS" output)) + (assert (search "returned OK" output))) + (let ((output (with-traced-function (mv-trace-this :encapsulate nil) + (assert (equal (multiple-value-list (mv-trace-this 4)) + '(ok "hi" :foo :bar)))))) + (assert (search "MV-TRACE-THIS" output)) + (assert (search "returned OK" output)))) + (with-test (:name (trace :encapsulate nil :recursive) . #.*breakpoint-tracing-expectations*) (let ((output (with-traced-function (trace-fact :encapsulate nil) From 7e3ea269be6b830d5966c13a187de5167f59f753 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 14 Jun 2022 22:24:41 +0300 Subject: [PATCH 3513/4023] arm64: add simd rev* instructions. And support more modes of ordinary rev instructions. --- src/compiler/arm64/insts.lisp | 77 +++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 50d8c3a296..d67b4f852e 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -1103,25 +1103,53 @@ (define-instruction-format (data-processing-1 32 :default-printer '(:name :tab rd ", " rn)) + (size :field (byte 1 31)) (op2 :field (byte 18 13) :value #b101101011000000000) (op :field (byte 3 10)) (rn :field (byte 5 5) :type 'reg) (rd :field (byte 5 0) :type 'reg)) -(defmacro def-data-processing-1 (name opc) +(defmacro def-data-processing-1 (name opc &optional 32-bit-opcode) `(define-instruction ,name (segment rd rn) (:printer data-processing-1 ((op ,opc))) (:emitter - (emit-data-processing-1 segment +64-bit-size+ - ,opc (reg-offset rn) (reg-offset rd))))) + (emit-data-processing-1 segment + (reg-size rd) + ,(if 32-bit-opcode + `(sc-case rd + (32-bit-reg + ,32-bit-opcode) + (t + ,opc)) + opc) + (reg-offset rn) + (reg-offset rd))))) (def-data-processing-1 rbit #b000) (def-data-processing-1 rev16 #b001) -(def-data-processing-1 rev32 #b010) -(def-data-processing-1 rev #b011) (def-data-processing-1 clz #b100) (def-data-processing-1 cls #b101) +(define-instruction rev32 (segment rd rn) + (:printer data-processing-1 ((size 1) (op #b10))) + (:emitter + (emit-data-processing-1 segment + (reg-size rd) + #b10 + (reg-offset rn) + (reg-offset rd)))) + +(define-instruction rev (segment rd rn) + (:printer data-processing-1 ((size #b1) (op #b11))) + (:printer data-processing-1 ((size #b0) (op #b10))) + (:emitter + (emit-data-processing-1 segment (reg-size rd) + (sc-case rd + (32-bit-reg #b10) + (t #b11)) + (reg-offset rn) + (reg-offset rd)))) + ;;; (def-emitter data-processing-2 @@ -2721,7 +2749,7 @@ ;;; (def-emitter simd-extract - (#b0 1 31) + (#b0 1 31) (q 1 30) (#b101110000 9 21) (rm 5 16) @@ -2731,7 +2759,17 @@ (rn 5 5) (rd 5 0)) +(define-instruction-format (simd-scalar-three-same 32 + :default-printer '(:name :tab rd ", " rn ", " rm)) + (op3 :field (byte 1 31) :value #b0) + (op4 :field (byte 9 21) :value #b101110000) + (rm :fields (list (byte 1 30) (byte 5 16)) :type 'simd-reg) + (op6 :field (byte 1 15) :value #b0) + (rn :fields (list (byte 1 30) (byte 5 5)) :type 'simd-reg) + (rd :fields (list (byte 1 30) (byte 5 0)) :type 'simd-reg)) + (define-instruction ext (segment rd rn rm index &optional (size :16b)) + (:printer simd-scalar-three-same ()) (:emitter (emit-simd-extract segment (encode-vector-size size) @@ -2911,19 +2949,24 @@ (rd :fields (list (byte 1 30) (byte 5 0)) :type 'simd-reg)) (macrolet - ((def (name u size op) + ((def (name u op &optional (sizes '(:8b :16b))) `(define-instruction ,name (segment rd rn &optional (size :16b)) - (:printer simd-two-misc ((u ,u) (size ,size) (op ,op))) + (:printer simd-two-misc ((u ,u) (op ,op))) (:emitter - (emit-simd-two-misc segment - (encode-vector-size size) - ,u - ,size - ,op - (reg-offset rn) - (reg-offset rd)))))) - (def cnt #b0 #b00 #b00101) - (def s-mvn #b1 #b00 #b00101)) + (check-type size (member ,@sizes)) + (multiple-value-bind (q size) (encode-vector-size size) + (emit-simd-two-misc segment + q + ,u + size + ,op + (reg-offset rn) + (reg-offset rd))))))) + (def cnt #b0 #b00101) + (def s-mvn #b1 #b00101) + (def s-rev16 #b0 #b00001) + (def s-rev32 #b1 #b00000 (:8b :16b :4h :8h)) + (def rev64 #b0 #b00000 (:8b :16b :4h :8h :2s :4s))) ;;; Inline constants (defun canonicalize-inline-constant (constant) From bf1d521f1300769f24ce9c31554f4ce2fa525da5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 15 Jun 2022 18:23:34 +0300 Subject: [PATCH 3514/4023] arm64, emit-load-store: allow any shift amount. --- src/compiler/arm64/insts.lisp | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index d67b4f852e..2ee6650169 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -1398,22 +1398,19 @@ ((and (eq mode :offset) (or (register-p offset) (extend-p offset))) - (let* ((register (if (extend-p offset) - (extend-register offset) - offset)) - (shift (cond ((extend-p offset) - (aver (or (= (extend-operand offset) 0) - (= (extend-operand offset) 3))) - (ash (extend-operand offset) -1)) - (t - 0))) - (extend (if (extend-p offset) - (ecase (extend-kind offset) - (:uxtw #b010) - (:lsl #b011) - (:sxtw #b110) - (:sxtx #b111)) - #b011))) + (multiple-value-bind + (register shift extend) + (if (extend-p offset) + (values (extend-register offset) + (if (> (extend-operand offset) 0) + 1 + 0) + (ecase (extend-kind offset) + (:uxtw #b010) + (:lsl #b011) + (:sxtw #b110) + (:sxtx #b111))) + (values offset 0 #b011)) (emit-ldr-str-reg segment size v opc (reg-offset register) From 8efdfb89977f724ab0fadaa591ecde36d12e5f09 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 15 Jun 2022 11:50:34 -0400 Subject: [PATCH 3515/4023] ppc64: Fix GC failures from fullcgc changes Conses overwritten with (uword_t)-1 have to be ignored. Other architectures worked fine, but due to different tagging, not ppc64. --- src/compiler/generic/late-objdef.lisp | 2 ++ src/runtime/fullcgc.c | 3 +++ src/runtime/gc-common.c | 16 ++++++++++++++++ src/runtime/verify.inc | 9 +++++++++ 4 files changed, 30 insertions(+) diff --git a/src/compiler/generic/late-objdef.lisp b/src/compiler/generic/late-objdef.lisp index d2104acc9a..6ec982b439 100644 --- a/src/compiler/generic/late-objdef.lisp +++ b/src/compiler/generic/late-objdef.lisp @@ -212,6 +212,8 @@ static inline lispobj compute_lispobj(lispobj* base_addr) { #+ppc64 (progn (fill ptrtab "scav_lose") + (setf (aref scavtab #xff) "consfiller" + (aref sizetab #xff) "consfiller") (setf (nth instance-pointer-lowtag ptrtab) "scav_instance_pointer" (nth list-pointer-lowtag ptrtab) "scav_list_pointer" (nth fun-pointer-lowtag ptrtab) "scav_fun_pointer" diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 3d2ba96b87..22a9629f71 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -641,6 +641,9 @@ static uword_t sweep(lispobj* where, lispobj* end, } else { nwords = 2; livep = cons_markedp((lispobj)where); + /* This bit pattern indicates unambiguously that a cons cell + * has gotten clobbered. Using (0 . 0) leaves open to question + * whether the cons is actually live */ if (!livep) where[0] = where[1] = (uword_t)-1; } } diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 0de1275724..a20566e662 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -767,6 +767,22 @@ scav_immediate(lispobj *where, lispobj object) return 2; } +#ifdef LISP_FEATURE_PPC64 +/* Dead conses are clobbered to contain all 1s. The first word of such a cons + * does NOT look like a valid cons half due to unusual lowtag arrangement */ +static sword_t scav_consfiller(lispobj *where, lispobj object) +{ + gc_assert(object == (uword_t)-1); + gc_assert(where[1] == (uword_t)-1); + return 2; +} +static sword_t size_consfiller(lispobj *where) +{ + gc_assert(where[0] == (uword_t)-1 && where[1] == (uword_t)-1); + return 2; +} +#endif + //// General boxed object scav/trans/size functions #define DEF_SCAV_BOXED(suffix, sizer) \ diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index 5b8604f3a3..f3b01c0f4e 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -312,6 +312,15 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state page_index_t pg = find_page_index(where); state->object_gen = pg >= 0 ? page_table[pg].gen : gc_gen_of((lispobj)where, ARTIFICIALLY_HIGH_GEN); +#ifdef LISP_FEATURE_PPC64 + // Cons fillers (two words of all 1s) cause failure of + // the default verification logic, so brute-force skip them + // regardless of whether the page type is PAGE_TYPE_CONS. + if (*where == (uword_t)-1 && where[1] == (uword_t)-1) { + where +=2; + continue; + } +#endif // FIXME: should not have code acting as filler if (widetag != FILLER_WIDETAG && !filler_obj_p(where)) { // Any page can have a filler on it From f5d69e6adc204189c824881e60f6671451e22007 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 15 Jun 2022 12:31:41 -0400 Subject: [PATCH 3516/4023] ppc64: skip failing and/or slow tests --- tests/compare-and-swap.impure.lisp | 13 ++++++++----- tests/external-format.pure.lisp | 11 +++++++++++ tests/gc.impure.lisp | 3 ++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/tests/compare-and-swap.impure.lisp b/tests/compare-and-swap.impure.lisp index 0945b3e61c..0ae716e436 100644 --- a/tests/compare-and-swap.impure.lisp +++ b/tests/compare-and-swap.impure.lisp @@ -665,14 +665,17 @@ (assert (= (sap-ref-32 sap 0) (* n-threads n-increments)))))))) (define-alien-variable "small_generation_limit" (signed 8)) -#+(or x86-64 ppc64) +;; PPC64 shouldn't fail, but depending on the CPU revision it might not +;; have the needed instruction, and I don't know how to test for it. +;; And surely it doesn't really depend on endian-ness, but the machine +;; that I'm testing on which is little-endian passes the test. +#+(and sb-thread (or x86-64 (and ppc64 little-endian))) +(progn (defun cas-an-alien-byte (x y) (cas small-generation-limit x y)) -#+(or x86-64 ppc64) (compile 'cas-an-alien-byte) -(test-util:with-test (:name :cas-alien - :skipped-on (not (and :sb-thread (or :ppc64 :x86-64)))) +(test-util:with-test (:name :cas-alien) (assert (= small-generation-limit 1)) (assert (= (cas-an-alien-byte 0 5) 1)) (assert (= (cas-an-alien-byte 1 6) 1)) (assert (= small-generation-limit 6)) - (setf small-generation-limit 1)) + (setf small-generation-limit 1))) diff --git a/tests/external-format.pure.lisp b/tests/external-format.pure.lisp index 669e30ebbe..76e0589793 100644 --- a/tests/external-format.pure.lisp +++ b/tests/external-format.pure.lisp @@ -15,6 +15,17 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. +;;; I have absolutely no idea what's going on with ppc64 little-endian, +;;; but this file's realtime is just ridiculous on the test machine +;;; and it totally dominates the time taken in parallel-exec: +;;; big-endian: real 0m3.265s +;;; little-endian: real 2m53.039s +;;; Whereas, with this one file eliminated on ppc64le, the total wallclock +;;; time for parallel-exec (with 12 workers) is approximately 94 seconds +;;; on either machine. What is so horrible about our external-format codecs +;;; that it antagonizes the little-endian CPU so badly? +#+(and ppc64 little-endian) (invoke-restart 'run-tests::skip-file) + (defmacro do-external-formats ((xf) &body body) (let ((nxf (gensym))) `(sb-int:dovector (,nxf sb-impl::*external-formats*) diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index a84be137f6..3edc26a74f 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -457,7 +457,8 @@ (/ sb-vm:large-object-size sb-vm:n-word-bytes))) (gc) #+gencgc -(with-test (:name :page-protected-p :broken-on :x86) +(with-test (:name :page-protected-p :broken-on :x86 + :fails-on (and :big-endian :ppc64)) (if (= (sb-kernel:generation-of *vvv*) 0) (gc)) (assert (= (sb-kernel:generation-of *vvv*) 1)) (assert (sb-kernel:page-protected-p *vvv*)) From bcdd8bac895e82203be9998e70fb355de7368daa Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 15 Jun 2022 16:23:12 -0400 Subject: [PATCH 3517/4023] Keep only failing logs for "--runs_per_test huge-num" so that if you're trying to hammer on a particular test, you can more easily examine only the failures. "huge-num" is defined arbitrarily as >= 100. --- tests/parallel-exec.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 9ed971a159..6aae708e98 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -45,6 +45,7 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ "gethash-concurrency.impure" "arith-slow.pure")) (defvar *filter* nil) +(defglobal *delete-logs* nil) (defun choose-order (tests) (when *filter* (let (strings) @@ -154,12 +155,12 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (wait)) (let ((pid (sb-posix:fork))) (when (zerop pid) + (let ((mylog (format nil "$logdir/~a~@[-~d~]" (car file) (cdr file)))) #+(and linux sb-thread 64-bit) (sb-alien:alien-funcall (sb-alien:extern-alien "reset_gc_stats" (function sb-alien:void))) ;; FILE is (filename . test-iteration) - (with-open-file (stream (format nil "$logdir/~a~@[-~d~]" (car file) (cdr file)) - :direction :output :if-exists :supersede) + (with-open-file (stream mylog :direction :output :if-exists :supersede) (alien-funcall (extern-alien "dup2" (function int int int)) (sb-sys:fd-stream-fd stream) 1) (alien-funcall (extern-alien "dup2" (function int int int)) 1 2)) @@ -202,7 +203,8 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (funcall (intern "PRINT-ALLOCATOR-HISTOGRAM" "SB-THREAD"))) (sb-sprof:report :type :flat) (gc :gen 7) - (exit :code (if (unexpected-failures) 1 104))))) + (when (and (not (unexpected-failures)) *delete-logs*) (delete-file mylog)) + (exit :code (if (unexpected-failures) 1 104)))))) (format t "~A: pid ~d~@[ (trial ~d)~]~%" (car file) pid (cdr file)) (incf subprocess-count) (push (list pid file (get-internal-real-time)) subprocess-list))) @@ -261,6 +263,9 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ argv (cddr argv))) (t (return)))) + (when (>= runs-per-test 10) + (format t "~&Note: will not keep logs of passing runs~%") + (setq *delete-logs* t)) (setq argv (mapcar (lambda (file) (probe-file file) ; for effect From 20d471a0102ef2448f43470e544db4bf8b01c69d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 15 Jun 2022 16:27:04 -0400 Subject: [PATCH 3518/4023] Fix data race in optimized PCL constructors (lp#1951341) Prior to this change, with the one failing test in a file by itself, I was able to elicit a 1% failure rate on ppc64 using --runs_per_test 1000 and a .5% failure rate on arm64. After the fix, 0 failures in 10,000 runs. --- src/pcl/ctor.lisp | 59 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/src/pcl/ctor.lisp b/src/pcl/ctor.lisp index ace2507484..ab1169eee9 100644 --- a/src/pcl/ctor.lisp +++ b/src/pcl/ctor.lisp @@ -143,20 +143,59 @@ ;;; Reset CTOR to use a default function that will compute an ;;; optimized constructor function when called. +;;; +;;; Note that lp#1951341 saw a very rare failure which suggested +;;; a memory ordering issue. Indeed, here is what happened: +;;; - thread A allocates a CTOR +;;; CTOR -> +-------------------------------+ +;;; | word 0: funinstance header | +;;; | word 1: trampline | +;;; | word 2: layout-of-CTOR | +;;; | word 3: funinstance function | +;;; | ... more slots ... | +;;; +-------------------------------+ +;;; +;;; - thread A creates a lambda that captures CTOR +;;; CLOSURE -> +------------------------------+ +;;; | word 0: closure header | +;;; | word 1: underlying function | +;;; | word 2: CTOR | +;;; +------------------------------+ +;;; +;;; - thread A stores CLOSURE into word 3 of CTOR +;;; by way of (SETF (%FUNCALLABLE-INSTANCE-FUN CTOR) ...) +;;; +;;; - thread B gets ahold of CTOR - how? I'm not clear +;;; on the protocol, but I guess it was already installed +;;; as the class's constructor +;;; +;;; - thread B reads word 3 out of the CTOR and calls +;;; the CLOSURE (successfully entering into its instructions) +;;; +;;; - CLOSURE's code loads CTOR from itself and calls +;;; INSTALL-OPTIMIZED-CONSTRUCTOR with an argument of 0 +;;; because B did not observe a store into word 2 +;;; of CLOSURE +;;; +;;; The fix is to use properly paired barriers. (defun install-initial-constructor (ctor &optional force-p) (when (or force-p (ctor-class ctor)) (setf (ctor-class ctor) nil (ctor-state ctor) 'initial) - (setf (%funcallable-instance-fun ctor) - (ecase (ctor-type ctor) - (ctor - (lambda (&rest args) - (install-optimized-constructor ctor) - (apply ctor args))) - (allocator - (lambda () - (install-optimized-allocator ctor) - (funcall ctor))))))) + (let ((closure + (ecase (ctor-type ctor) + (ctor + (lambda (&rest args) + (sb-thread:barrier (:read)) + (install-optimized-constructor ctor) + (apply ctor args))) + (allocator + (lambda () + (sb-thread:barrier (:read)) + (install-optimized-allocator ctor) + (funcall ctor)))))) + (sb-thread:barrier (:write)) + (setf (%funcallable-instance-fun ctor) closure)))) (defun make-ctor-function-name (class-name initargs safe-code-p) (labels ((arg-name (x) From 2a965171a191485e20ecafd6b58cad0a3c4d93b6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 15 Jun 2022 17:14:36 -0400 Subject: [PATCH 3519/4023] Fix whitespace --- tests/external-format.pure.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/external-format.pure.lisp b/tests/external-format.pure.lisp index 76e0589793..920f6e0938 100644 --- a/tests/external-format.pure.lisp +++ b/tests/external-format.pure.lisp @@ -18,8 +18,8 @@ ;;; I have absolutely no idea what's going on with ppc64 little-endian, ;;; but this file's realtime is just ridiculous on the test machine ;;; and it totally dominates the time taken in parallel-exec: -;;; big-endian: real 0m3.265s -;;; little-endian: real 2m53.039s +;;; big-endian: real 0m3.265s +;;; little-endian: real 2m53.039s ;;; Whereas, with this one file eliminated on ppc64le, the total wallclock ;;; time for parallel-exec (with 12 workers) is approximately 94 seconds ;;; on either machine. What is so horrible about our external-format codecs From 7bd2ec99c78875130d3b022479dbd0fe9a6c0e26 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 15 Jun 2022 17:16:44 -0400 Subject: [PATCH 3520/4023] Fail early in make-config on unbuildable x86+darwin If this change draws no objections during freeze/testing, all the obsolete files can be pruned for the release after this month's. --- NEWS | 1 + make-config.sh | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 6822a3e1f0..30085ea411 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.2.5: + * minor incompatible change: support for 32-bit x86 on macOS has been removed. * enhancement: core compression now uses zstd instead of zlib. * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. diff --git a/make-config.sh b/make-config.sh index b161690cff..66f41a1b0e 100755 --- a/make-config.sh +++ b/make-config.sh @@ -387,6 +387,7 @@ if [ "$sbcl_os" = "sunos" ] && [ `isainfo -k` = "amd64" ]; then fi # Under Darwin, uname -m returns "i386" even if CPU is x86_64. +# (I suspect this is not true any more - it reports "x86_64 for me) if [ "$sbcl_os" = "darwin" ] && [ "`/usr/sbin/sysctl -n hw.optional.x86_64`" = "1" ]; then guessed_sbcl_arch=x86-64 fi @@ -554,9 +555,6 @@ case "$sbcl_os" in ;; darwin) printf ' :unix :bsd :darwin :mach-o' >> $ltf - if [ $sbcl_arch = "x86" ]; then - printf ' :mach-exception-handler' >> $ltf - fi if [ $sbcl_arch = "x86-64" ]; then darwin_version=`uname -r` darwin_version_major=${DARWIN_VERSION_MAJOR:-${darwin_version%%.*}} @@ -624,6 +622,10 @@ cd "$original_dir" case "$sbcl_arch" in x86) + if [ "$sbcl_os" = "darwin" ]; then + echo "Unsupported configuration" + exit 1 + fi if [ "$sbcl_os" = "win32" ]; then # of course it doesn't provide dlopen, but there is # roughly-equivalent magic nevertheless. From 42d29b172ff63304a352146ac81765c4d3acae7f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 15 Jun 2022 17:30:09 -0400 Subject: [PATCH 3521/4023] Remove an argument from ALLOCATE-CODE-OBJECT And fix the comment about why untagged FDEFNs are useful, which seems to have been written prior to the actual implementation of same. --- contrib/sb-introspect/test-driver.lisp | 2 +- src/code/alloc.lisp | 22 ++++++---------------- src/code/debug-int.lisp | 2 +- src/code/load.lisp | 22 ++++++++++++++++------ src/code/x86-64-vm.lisp | 2 +- src/compiler/generic/early-vm.lisp | 6 ------ src/compiler/generic/target-core.lisp | 12 ++++++------ src/compiler/represent.lisp | 11 +++++------ src/runtime/gencgc.c | 4 +++- tests/x86-64-codegen.impure.lisp | 2 +- 10 files changed, 40 insertions(+), 45 deletions(-) diff --git a/contrib/sb-introspect/test-driver.lisp b/contrib/sb-introspect/test-driver.lisp index 6346fb75e1..5b8ef87978 100644 --- a/contrib/sb-introspect/test-driver.lisp +++ b/contrib/sb-introspect/test-driver.lisp @@ -462,7 +462,7 @@ ;; but the large object size can be as small as 16K. ;; 16K might fit in the free space of an open region, ;; and by accident would not go on a large object page. - (sb-c:allocate-code-object nil 0 0 + (sb-c:allocate-code-object nil 0 (max (* 4 sb-vm:gencgc-page-bytes) #-64-bit 65536)))) (declare (notinline format)) (format (make-string-output-stream) "~%") diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index d353820bf7..5a2b0d8311 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -458,18 +458,19 @@ ;;; Enforce limit on boxed words based on maximum total number of words ;;; that can be indicated in the header for 32-bit words. ;;; 22 bits = 4MiB, quite generous for one code object. +;;; (I think the reasoning behind 22 is that after adding 8 for the widetag, +;;; it's 30, and the other 2 bits are the fixnum tag) ;;; 25 bits is the maximum unboxed size expressed in bytes, ;;; if n-word-bytes = 8 and almost the entire code object is unboxed ;;; which is, practically speaking, not really possible. -(declaim (ftype (sfunction (t (unsigned-byte 16) (unsigned-byte 22) (unsigned-byte 25)) - code-component) +(declaim (ftype (sfunction (t (unsigned-byte 22) (unsigned-byte 25)) code-component) allocate-code-object)) ;;; Allocate a code component with BOXED words in the header ;;; followed by UNBOXED bytes of raw data. ;;; BOXED must be the exact count of boxed words desired. No adjustments ;;; are made for alignment considerations or the fixed slots. -(defun allocate-code-object (space n-named-calls boxed unboxed) - (declare (ignorable space n-named-calls)) +(defun allocate-code-object (space boxed unboxed) + (declare (ignorable space)) (let* ((total-words (the (unsigned-byte 22) ; Enforce limit on total words as well (align-up (+ boxed (ceiling unboxed n-word-bytes)) 2))) @@ -505,18 +506,7 @@ ;; (very unlikely, but certainly possible). (unless (eq (generation-of code) 0) (return)) (let ((oldval (cas *codeblob-tree* tree newtree))) - (if (eq oldval tree) (return) (setq tree oldval)))))) - ;; The 1st slot beyond the header stores the boxed header size in bytes - ;; as an untagged number, which has the same representation as a tagged - ;; value denoting a word count if WORD-SHIFT = N-FIXNUM-TAG-BITS. - ;; This boxed-size MUST be 0 prior to writing any pointers into the object - ;; because the boxed words will not necessarily have been pre-zeroed; - ;; scavenging them prior to zeroing them out would see wild pointers. - (setf (sap-ref-word-jit sap (ash code-boxed-size-slot word-shift)) - ;; For 32-bit words, we'll have to add another primitive-object slot. - ;; But so far nothing makes use of the n-named-calls value. - (logior #+64-bit (ash n-named-calls 32) - (ash boxed word-shift))))) + (if (eq oldval tree) (return) (setq tree oldval)))))))) ;; FIXME: there may be random values in the unboxed payload and it's not obvious ;; that all callers of ALLOCATE-CODE-OBJECT always write all raw bytes. diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index ac7101d001..d7315c333a 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -3716,7 +3716,7 @@ register." src-start))) (code-object (sb-c:allocate-code-object - nil 0 + nil ;; Ensure required boxed header alignment. (align-up bpt-lra-boxed-nwords sb-c::code-boxed-words-align) (+ length diff --git a/src/code/load.lisp b/src/code/load.lisp index 26d96d6f09..9a902e62d9 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1087,13 +1087,24 @@ ;;; putting the implementation and version in required fields in the ;;; fasl file header.) -;;; Caution: don't try to "test" WITH-WRITABLE-CODE-INSTRUCTIONS on any architecture -;;; where fixup application cares what the address of the code actually is. +;;; Caution: don't try to "test" WITH-WRITABLE-CODE-INSTRUCTIONS in copy-in/out mode +;;; on any architecture where fixup application cares what the address of the code actually is. ;;; This means x86 is disqualified. You're just wasting your time if you try, as I did. -(defmacro with-writable-code-instructions ((code-var debug-info-var) &body body) - (declare (ignorable debug-info-var)) +(defmacro with-writable-code-instructions ((code-var debug-info-var n-fdefns) &body body) + (declare (ignorable debug-info-var n-fdefns)) + ;; N-FDEFNS is important for PPC64, slightly important for X86-64, not important for + ;; any others, and doesn't even have a place to store it if lispwords are 32 bits. + ;; The :DEDUPLICATED-FDEFNS test in compiler-2.pure asserts that the value is valid + #+64-bit + (push `(setf (sap-ref-32 (int-sap (get-lisp-obj-address ,code-var)) + (+ (ash sb-vm:code-boxed-size-slot sb-vm:word-shift) #+little-endian 4 + (- sb-vm:other-pointer-lowtag))) + ,n-fdefns) + body) #+darwin-jit `(with-pinned-objects (,code-var ,debug-info-var) + ;; DEBUG-INFO is pinned so that after assigning it into the temporary + ;; block of memory, the off-heap word which is invisible to GC remains valid. (let* ((temp-copy (alien-funcall (extern-alien "duplicate_codeblob_offheap" (function unsigned unsigned)) (get-lisp-obj-address ,code-var))) @@ -1126,11 +1137,10 @@ (incf stack-index))) (let ((code (sb-c:allocate-code-object (if (oddp header) :immobile :dynamic) - n-named-calls (align-up n-boxed-words sb-c::code-boxed-words-align) n-code-bytes)) (debug-info (svref stack (+ ptr n-constants)))) - (with-writable-code-instructions (code debug-info) + (with-writable-code-instructions (code debug-info n-named-calls) ;; * DO * NOT * SEPARATE * THESE * STEPS * ;; For a full explanation, refer to the comment above MAKE-CORE-COMPONENT ;; concerning the corresponding use therein of WITH-PINNED-OBJECTS etc. diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index 0ea7d70706..a623465d94 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -210,7 +210,7 @@ (defconstant trampoline-entry-offset n-word-bytes) (defun make-simplifying-trampoline (fun) (let ((code (truly-the (values code-component &optional) - (allocate-code-object :dynamic 0 3 24)))) ; KLUDGE + (allocate-code-object :dynamic 3 24)))) ; KLUDGE (setf (%code-debug-info code) fun) (let ((sap (sap+ (code-instructions code) trampoline-entry-offset)) (ea (+ (logandc2 (get-lisp-obj-address code) lowtag-mask) diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index d751dc56b9..2a2656a7b0 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -214,12 +214,6 @@ #+sb-xc-host (deftype sb-xc:fixnum () `(signed-byte ,n-fixnum-bits)) -#-darwin-jit -(progn - (declaim (inline (setf sap-ref-word-jit))) - (defun (setf sap-ref-word-jit) (value sap offset) - (setf (sap-ref-word sap offset) value))) - ;;; Supporting code for LAYOUT allocated in metadata space a/k/a "metaspace". ;;; These objects are manually allocated and freed. ;;; Tracts are the unit of allocation requested from the OS. diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index 9b54ffe233..ef33fb1895 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -192,11 +192,11 @@ #+x86-64 (aver (not (nth-value 1 (sb-c:unpack-code-fixup-locs (sb-vm::%code-fixups code))))) + (aver (zerop (code-n-named-calls code))) (let* ((nbytes (code-object-size code)) (boxed (code-header-words code)) ; word count (unboxed (- nbytes (ash boxed sb-vm:word-shift))) ; byte count - (copy (allocate-code-object - :dynamic (code-n-named-calls code) boxed unboxed))) + (copy (allocate-code-object :dynamic boxed unboxed))) (with-pinned-objects (code copy) (%byte-blt (code-instructions code) 0 (code-instructions copy) 0 unboxed) ;; copy boxed constants so that the fixup step (if needed) sees the 'fixups' @@ -317,17 +317,17 @@ (setf (second const) (find-or-create-fdefn (second const))) (when (eq kind :named-call) (incf count))))))) (code-obj (allocate-code-object (component-mem-space component) - n-named-calls nboxed length)) + nboxed length)) (bytes (the (simple-array assembly-unit 1) (segment-contents-as-vector segment))) (named-call-fixups)) + (declare (ignorable n-named-calls)) ;; The following operations need the code pinned: ;; 1. copying into code-instructions (a SAP) ;; 2. apply-core-fixups and sanctify-for-execution ;; A very specific store order is necessary to allow using uninitialized memory - ;; pages for code. Storing of the debug-info slot does not need the code pinned, - ;; but that store must occur between steps 1 and 2. - (sb-fasl::with-writable-code-instructions (code-obj debug-info) + ;; pages for code. Storing of the debug-info slot must occur between steps 1 and 2. + (sb-fasl::with-writable-code-instructions (code-obj debug-info n-named-calls) ;; Note that this does not have to take care to ensure atomicity ;; of the store to the final word of unboxed data. Even if BYTE-BLT were ;; interrupted in between the store of any individual byte, this code diff --git a/src/compiler/represent.lisp b/src/compiler/represent.lisp index 82df287c81..12085f5b7f 100644 --- a/src/compiler/represent.lisp +++ b/src/compiler/represent.lisp @@ -778,12 +778,11 @@ ;;; Arrange boxed constants so that all :NAMED-CALL constants are first, ;;; then constant leaves, and finally LOAD-TIME-VALUE constants. ;;; There exist a few reasons for placing all the FDEFNs first: -;;; * FDEFNs which are referenced for lisp call - as opposed to referenced -;;; in #'FUN syntax - could be stored as untagged pointers which would -;;; benefit the PPC64 architecture by removing a few instructions from each -;;; use of such fdefn by not having to subtract its lowtag prior to loading -;;; from both the fun and raw-fun slots. GC would need to be aware of the -;;; untagged pointer convention. +;;; * FDEFNs which are referenced for call (versus for value as in #'FUN) +;;; may be stored in the code header as untagged pointers. This benefits PPC64 +;;; because lowtag subtraction can't be had "for free" due to the architectural +;;; requirement that lispword-aligned loads need a displacement that is +;;; a multiple of 4, which OTHER-POINTER-LOWTAG does not satisfy. ;;; * In the current approach for so-called "static" linking of immobile code, ;;; we change code instruction bytes so that they call into a simple-fun ;;; directly rather than through an fdefn, but the approach is subject to a diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 1ec4be2c8d..a4d1a75097 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5047,7 +5047,9 @@ lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words, unsigned boxed) THREAD_JIT(0); code->header = ((uword_t)total_words << CODE_HEADER_SIZE_SHIFT) | CODE_HEADER_WIDETAG; - code->boxed_size = 0; // gets reassigned from lisp + // 'boxed_size' is an untagged word expressing the number of *bytes* in the boxed section + // (so CODE-INSTRUCTIONS can simply add rather than shift and add). + code->boxed_size = boxed * N_WORD_BYTES; code->debug_info = 0; code->fixups = 0; lispobj* p = &code->constants[0], *end = (lispobj*)code + boxed; diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index dcf423abec..e16b7bfebe 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -403,7 +403,7 @@ (assert (thing-ref-thing-ref (make-thing :x (make-thing :x 3)) 'foo))) (with-test (:name :huge-code :skipped-on (not :immobile-code)) - (sb-vm::allocate-code-object :immobile 0 4 (* 2 1024 1024))) + (sb-vm::allocate-code-object :immobile 4 (* 2 1024 1024))) (defun bbb (x y z) ;; I don't want the number of expected comparisons to depend on whether From e7835b36d0104c5a0658f67c54c091ab372cbc55 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 16 Jun 2022 00:35:23 +0300 Subject: [PATCH 3522/4023] arm64: nreverse byte-vectors using SIMD. I.e. base-char and [un]signed-byte-8 vectors. --- src/code/arm64-simd.lisp | 71 ++++++++++++++++++++++++++++++++++++++++ src/code/seq.lisp | 5 +++ 2 files changed, 76 insertions(+) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 4fd7bfe9fe..b8d9795036 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -77,3 +77,74 @@ (inst cmhs temp z-mask temp :4s) (inst s-and temp temp flip) (inst s-eor res bits temp))))))) + +(defun simd-nreverse8 (vector start end) + (declare ((simple-array * (*)) vector) + (fixnum start end) + (optimize speed (safety 0))) + (let* ((sap (vector-sap vector))) + (inline-vop (((left sap-reg t) sap) + ((start any-reg tagged-num) start) + ((end) end) + ((right signed-reg signed-num)) + ((vl complex-double-reg complex-double-float)) + ((vr)) + ((gl signed-reg signed-num)) + ((gr))) + () + (inst add right left (lsr end 1)) + (inst add left left (lsr start 1)) + (inst sub gl right left) + (inst cmp gl (fixnumize 32)) + (inst b :lt WORD) + (inst sub right right 16) + + LOOP + (inst ldr vl (@ left)) + (inst ldr vr (@ right)) + + (inst rev64 vl vl) + (inst ext vl vl vl 8) + (inst rev64 vr vr) + (inst ext vr vr vr 8) + + (inst str vr (@ left 16 :post-index)) + (inst str vl (@ right -16 :post-index)) + (inst cmp left right) + (inst b :lt loop) + + (inst add right right 16) + (inst sub tmp-tn right left) + (inst cmp tmp-tn 1) + (inst b :le DONE) + + WORD + (inst sub tmp-tn right left) + (inst cmp tmp-tn 16) + (inst b :lt BYTE) + + (inst ldr gl (@ left)) + (inst ldr gr (@ right -8 :pre-index)) + (inst rev gl gl) + (inst rev gr gr) + (inst str gr (@ left 8 :post-index)) + (inst str gl (@ right)) + + BYTE + (inst sub right right 1) + (inst cmp right left) + (inst b :lt DONE) + + ;; After the 16-element copy above there are at most 15 + ;; elements, have to swap 14 elements with one staying in the + ;; middle. + (loop repeat 7 + do + (inst ldrb gl (@ left)) + (inst ldrb gr (@ right)) + (inst strb gr (@ left 1 :post-index)) + (inst strb gl (@ right -1 :post-index)) + (inst cmp left right) + (inst b :ge DONE)) + DONE)) + vector) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 036165b447..d2445bcc9d 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -964,6 +964,11 @@ many elements are copied." (svref vector right-index) left)))) ((word-specialized-vector-tag-p tag) (nreverse-word-specialized-vector vector start end)) + #+arm64 + ((typep vector '(or (simple-array base-char (*)) + (simple-array (signed-byte 8) (*)) + (simple-array (unsigned-byte 8) (*)))) + (sb-vm::simd-nreverse8 vector start end)) (t (let* ((getter (the function (svref %%data-vector-reffers%% tag))) (setter (the function (svref %%data-vector-setters%% tag)))) From 942679ba9d7cb6f0533d1aa824780a707daf7c75 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 16 Jun 2022 02:17:58 +0300 Subject: [PATCH 3523/4023] arm64: nreverse 32-bit vectors using SIMD. I.e. character, [un]signed-byte-32, single-float vectors. --- src/code/arm64-simd.lisp | 63 +++++++++++++++++++++++++++++++++-- src/code/seq.lisp | 7 ++++ src/compiler/arm64/insts.lisp | 4 +-- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index b8d9795036..985e6e764a 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -82,7 +82,7 @@ (declare ((simple-array * (*)) vector) (fixnum start end) (optimize speed (safety 0))) - (let* ((sap (vector-sap vector))) + (let ((sap (vector-sap vector))) (inline-vop (((left sap-reg t) sap) ((start any-reg tagged-num) start) ((end) end) @@ -95,7 +95,7 @@ (inst add right left (lsr end 1)) (inst add left left (lsr start 1)) (inst sub gl right left) - (inst cmp gl (fixnumize 32)) + (inst cmp gl 32) (inst b :lt WORD) (inst sub right right 16) @@ -148,3 +148,62 @@ (inst b :ge DONE)) DONE)) vector) + +(defun simd-nreverse32 (vector start end) + (declare ((simple-array * (*)) vector) + (fixnum start end) + (optimize speed (safety 0))) + (let ((sap (vector-sap vector))) + (inline-vop (((left sap-reg t) sap) + ((start any-reg tagged-num) start) + ((end) end) + ((right signed-reg signed-num)) + ((vl complex-double-reg complex-double-float)) + ((vr)) + ((gl signed-reg signed-num)) + ((gr))) + () + (inst add right left (lsl end 1)) + (inst add left left (lsl start 1)) + (inst sub gl right left) + (inst cmp gl 32) + (inst b :lt SCALAR) + (inst sub right right 16) + + LOOP + (inst ldr vl (@ left)) + (inst ldr vr (@ right)) + + (inst rev64 vl vl :4s) + (inst ext vl vl vl 8) + (inst rev64 vr vr :4s) + (inst ext vr vr vr 8) + + (inst str vr (@ left 16 :post-index)) + (inst str vl (@ right -16 :post-index)) + (inst cmp left right) + (inst b :lt loop) + + (inst add right right 16) + (inst sub tmp-tn right left) + (inst cmp tmp-tn 1) + (inst b :le DONE) + + SCALAR + (inst sub right right 4) + (inst cmp right left) + (inst b :lt DONE) + (setf gl (32-bit-reg gl) + gr (32-bit-reg gr)) + + (loop repeat 3 + do + (inst ldr gl (@ left)) + (inst ldr gr (@ right)) + (inst str gr (@ left 4 :post-index)) + (inst str gl (@ right -4 :post-index)) + (inst cmp left right) + (inst b :ge DONE)) + DONE)) + vector) + diff --git a/src/code/seq.lisp b/src/code/seq.lisp index d2445bcc9d..0285f7364a 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -969,6 +969,13 @@ many elements are copied." (simple-array (signed-byte 8) (*)) (simple-array (unsigned-byte 8) (*)))) (sb-vm::simd-nreverse8 vector start end)) + #+arm64 + ((typep vector '(or #+sb-unicode + (simple-array character (*)) + (simple-array (signed-byte 32) (*)) + (simple-array (unsigned-byte 32) (*)) + (simple-array single-float (*)))) + (sb-vm::simd-nreverse32 vector start end)) (t (let* ((getter (the function (svref %%data-vector-reffers%% tag))) (setter (the function (svref %%data-vector-setters%% tag)))) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 2ee6650169..02ec8ee1b1 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -2942,8 +2942,8 @@ (op3 :field (byte 5 17) :value #b10000) (op :field (byte 4 12)) (op4 :field (byte 2 10) :value #b10) - (rn :fields (list (byte 1 30) (byte 5 5)) :type 'simd-reg) - (rd :fields (list (byte 1 30) (byte 5 0)) :type 'simd-reg)) + (rn :fields (list (byte 1 30) (byte 2 22) (byte 5 5)) :type 'simd-reg) + (rd :fields (list (byte 1 30) (byte 2 22) (byte 5 0)) :type 'simd-reg)) (macrolet ((def (name u op &optional (sizes '(:8b :16b))) From 2ef551b9d2a667698cd942c21583b973a44d8ed0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 16 Jun 2022 16:34:56 +0300 Subject: [PATCH 3524/4023] arm64: reverse byte-vectors using SIMD. --- src/code/arm64-simd.lisp | 67 ++++++++++++++++++++++++++++++++++++---- src/code/seq.lisp | 6 +++- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 985e6e764a..1f427aed19 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -87,10 +87,10 @@ ((start any-reg tagged-num) start) ((end) end) ((right signed-reg signed-num)) + ((gl)) + ((gr)) ((vl complex-double-reg complex-double-float)) - ((vr)) - ((gl signed-reg signed-num)) - ((gr))) + ((vr))) () (inst add right left (lsr end 1)) (inst add left left (lsr start 1)) @@ -158,10 +158,10 @@ ((start any-reg tagged-num) start) ((end) end) ((right signed-reg signed-num)) + ((gl)) + ((gr)) ((vl complex-double-reg complex-double-float)) - ((vr)) - ((gl signed-reg signed-num)) - ((gr))) + ((vr))) () (inst add right left (lsl end 1)) (inst add left left (lsl start 1)) @@ -207,3 +207,58 @@ DONE)) vector) +(defun simd-reverse8 (source start length target) + (declare ((simple-array * (*)) vector target) + (fixnum start length) + (optimize speed (safety 0))) + (let ((source (vector-sap source)) + (target (vector-sap target))) + (inline-vop (((source sap-reg t) source) + ((target sap-reg t) target) + ((start any-reg tagged-num) start) + ((length) length) + ((s-i signed-reg signed-num)) + ((t-i)) + ((g)) + ((v complex-double-reg complex-double-float))) + () + (inst add source source (lsr start 1)) + (inst mov t-i 0) + (inst lsr s-i length 1) + (inst cmp s-i 15) + (inst b :lt WORD) + (inst sub s-i s-i 16) + + LOOP + (inst ldr v (@ source s-i)) + + (inst rev64 v v) + (inst ext v v v 8) + (inst str v (@ target t-i)) + + (inst add t-i t-i 16) + (inst subs s-i s-i 16) + (inst b :ge LOOP) + (inst add s-i s-i 16) + + WORD + (inst cmp s-i 7) + (inst b :lt BYTE) + (inst sub s-i s-i 8) + (inst ldr g (@ source s-i)) + (inst rev g g) + (inst str g (@ target t-i)) + (inst add t-i t-i 8) + + BYTE + (inst sub s-i s-i 1) + + (loop repeat 7 + do + (inst ldrb g (@ source s-i)) + (inst strb g (@ target t-i)) + (inst add t-i t-i 1) + (inst subs s-i s-i 1) + (inst b :lt DONE)) + DONE)) + target) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 0285f7364a..3f96e20ce7 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -899,7 +899,6 @@ many elements are copied." (let ((length (length vector))) (with-array-data ((vector vector) (start) (end) :check-fill-pointer t) - (declare (ignore start)) (let* ((tag (%other-pointer-widetag vector)) (new-vector (sb-vm::allocate-vector-with-widetag #+ubsan nil tag length @@ -914,6 +913,11 @@ many elements are copied." (svref vector right-index)))) ((word-specialized-vector-tag-p tag) (reverse-word-specialized-vector vector new-vector end)) + #+arm64 + ((typep vector '(or (simple-array base-char (*)) + (simple-array (signed-byte 8) (*)) + (simple-array (unsigned-byte 8) (*)))) + (sb-vm::simd-reverse8 vector start length new-vector)) (t (let ((getter (the function (svref %%data-vector-reffers%% tag))) (setter (the function (svref %%data-vector-setters%% tag)))) From 490586f0889556ce0bac35d9cec644d4fc972264 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 16 Jun 2022 16:41:33 +0300 Subject: [PATCH 3525/4023] Add IGNORABLE. --- src/code/seq.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 3f96e20ce7..81cf91b78e 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -899,6 +899,7 @@ many elements are copied." (let ((length (length vector))) (with-array-data ((vector vector) (start) (end) :check-fill-pointer t) + (declare (ignorable start)) (let* ((tag (%other-pointer-widetag vector)) (new-vector (sb-vm::allocate-vector-with-widetag #+ubsan nil tag length From 0adb50da297c18ba93af6484601bc7b3d02ad59f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 16 Jun 2022 17:24:41 -0400 Subject: [PATCH 3526/4023] Fix call to alloc-immobile-code It's been wrong for a long time, but apparently the re-assignment to code->boxed_size used to correct it before the wrong value was ever noticed by the GC or anything else. --- src/code/alloc.lisp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index 5a2b0d8311..7a8d2c7f4f 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -482,11 +482,11 @@ ;; Indicate that there are initially 2 boxed words, otherwise ;; immobile space GC thinks this object is freeable. (alloc-immobile-code (ash total-words word-shift) - (logior (ash total-words code-header-size-shift) - code-header-widetag) - (ash 2 n-fixnum-tag-bits) - other-pointer-lowtag - (eq space :immobile))) + (logior (ash total-words code-header-size-shift) + code-header-widetag) + (* boxed n-word-bytes) + other-pointer-lowtag + (eq space :immobile))) ;; x86-64 has a vop which wraps pseudo-atomic around the foreign call, ;; as is the custom for allocation trampolines. #+x86-64 (%primitive sb-vm::alloc-code total-words boxed) From be2b6a70ffd5407db3fa8eb64ef98a1d6b3322ff Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 17 Jun 2022 00:28:26 +0300 Subject: [PATCH 3527/4023] arm64: reverse 32-bit vectors using SIMD. --- src/code/arm64-simd.lisp | 54 ++++++++++++++++++++++++++++++++++++++-- src/code/seq.lisp | 7 ++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 1f427aed19..f96666a7e9 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -225,7 +225,7 @@ (inst add source source (lsr start 1)) (inst mov t-i 0) (inst lsr s-i length 1) - (inst cmp s-i 15) + (inst cmp s-i 16) (inst b :lt WORD) (inst sub s-i s-i 16) @@ -251,7 +251,8 @@ (inst add t-i t-i 8) BYTE - (inst sub s-i s-i 1) + (inst subs s-i s-i 1) + (inst b :lt DONE) (loop repeat 7 do @@ -262,3 +263,52 @@ (inst b :lt DONE)) DONE)) target) + +(defun simd-reverse32 (source start length target) + (declare ((simple-array * (*)) vector target) + (fixnum start length) + (optimize speed (safety 0))) + (let ((source (vector-sap source)) + (target (vector-sap target))) + (inline-vop (((source sap-reg t) source) + ((target sap-reg t) target) + ((start any-reg tagged-num) start) + ((length) length) + ((s-i signed-reg signed-num)) + ((t-i)) + ((g)) + ((v complex-double-reg complex-double-float))) + () + (inst add source source (lsl start 1)) + (inst mov t-i 0) + (inst lsl s-i length 1) + (inst cmp s-i 16) + (inst b :lt SCALAR) + (inst sub s-i s-i 16) + + LOOP + (inst ldr v (@ source s-i)) + + (inst rev64 v v :4s) + (inst ext v v v 8) + (inst str v (@ target t-i)) + + (inst add t-i t-i 16) + (inst subs s-i s-i 16) + (inst b :ge LOOP) + (inst add s-i s-i 16) + + SCALAR + (inst subs s-i s-i 4) + (inst b :lt DONE) + + (setf g (32-bit-reg g)) + (loop repeat 3 + do + (inst ldr g (@ source s-i)) + (inst str g (@ target t-i)) + (inst add t-i t-i 4) + (inst subs s-i s-i 4) + (inst b :lt DONE)) + DONE)) + target) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 81cf91b78e..76644e22fe 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -919,6 +919,13 @@ many elements are copied." (simple-array (signed-byte 8) (*)) (simple-array (unsigned-byte 8) (*)))) (sb-vm::simd-reverse8 vector start length new-vector)) + #+arm64 + ((typep vector '(or #+sb-unicode + (simple-array character (*)) + (simple-array (signed-byte 32) (*)) + (simple-array (unsigned-byte 32) (*)) + (simple-array single-float (*)))) + (sb-vm::simd-reverse32 vector start length new-vector)) (t (let ((getter (the function (svref %%data-vector-reffers%% tag))) (setter (the function (svref %%data-vector-setters%% tag)))) From b18f2c2ff0fd7151b0ef330e69dda77ba8ae4fd0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 17 Jun 2022 01:02:14 +0300 Subject: [PATCH 3528/4023] Re-disable breakpoint tests on freebsd. --- tests/debug.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index a0dab1f8c9..7b058a0d63 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -139,7 +139,7 @@ (defparameter *breakpoint-tracing-expectations* '(:fails-on (or :arm :arm64) - :broken-on (or :ppc :ppc64))) + :broken-on (or :freebsd :ppc :ppc64))) ;;; bug 379 (with-test (:name (trace :encapsulate nil) From 2dfa7d26cf61dda6e1d8071b68cb247a82e7972d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 17 Jun 2022 02:45:05 +0300 Subject: [PATCH 3529/4023] x86-64: nreverse byte-vectors using bswap. --- NEWS | 2 ++ src/code/seq.lisp | 2 +- src/code/x86-64-simd.lisp | 58 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 30085ea411..2061a0d739 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,8 @@ changes relative to sbcl-2.2.5: * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. * optimization: faster [n]string-down/upcase. + * optimization: faster [n]reverse for 8- and 32-bit element vectors on + arm64, x86-64. changes in sbcl-2.2.5 relative to sbcl-2.2.4: * minor incompatible change: SB-EXT:*DERIVE-FUNCTION-TYPES* being NIL now diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 76644e22fe..0a4a286767 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -976,7 +976,7 @@ many elements are copied." (svref vector right-index) left)))) ((word-specialized-vector-tag-p tag) (nreverse-word-specialized-vector vector start end)) - #+arm64 + #+(or arm64 x86-64) ((typep vector '(or (simple-array base-char (*)) (simple-array (signed-byte 8) (*)) (simple-array (unsigned-byte 8) (*)))) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 7b26f90947..a943065f9b 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -81,3 +81,61 @@ (inst pandn temp flip) (move res bits) (inst pxor res temp))))))) + +(defun simd-nreverse8 (vector start end) + (declare ((simple-array * (*)) vector) + (fixnum start end) + (optimize speed (safety 0))) + (let ((sap (vector-sap vector))) + (inline-vop (((left sap-reg t) sap) + ((start any-reg tagged-num) start) + ((end) end) + ((right signed-reg signed-num)) + ((l)) + ((r))) + () + (inst shr end 1) + (inst shr start 1) + (inst lea right (ea left end)) + (inst add left start) + (inst mov l right) + (inst sub l left) + (inst cmp l 16) + (inst jmp :b BYTE) + (inst sub right 8) + + LOOP + (inst mov l (ea left)) + (inst mov r (ea right)) + (inst bswap l) + (inst bswap r) + (inst mov (ea left) r) + (inst mov (ea right) l) + (inst add left 8) + (inst sub right 8) + (inst cmp left right) + (inst jmp :b LOOP) + + (inst add right 8) + + BYTE + (inst sub right 1) + (inst cmp right left) + (inst jmp :b DONE) + + ;; After the 16-element copy above there are at most 15 + ;; elements, have to swap 14 elements with one staying in the + ;; middle. + (loop repeat 7 + do + (inst mov :byte l (ea left)) + (inst mov :byte r (ea right)) + (inst mov :byte (ea left) r) + (inst mov :byte (ea right) l) + (inst add left 1) + (inst sub right 1) + (inst cmp left right) + (inst jmp :ge DONE)) + DONE)) + vector) + From 4f85ebce1b670de062fd3e0b898b3de9f5d38551 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 17 Jun 2022 02:58:03 +0300 Subject: [PATCH 3530/4023] arm64: nreverse 32-bit vectors using ROR. --- src/code/seq.lisp | 2 +- src/code/x86-64-simd.lisp | 47 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 0a4a286767..f03a96092f 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -981,7 +981,7 @@ many elements are copied." (simple-array (signed-byte 8) (*)) (simple-array (unsigned-byte 8) (*)))) (sb-vm::simd-nreverse8 vector start end)) - #+arm64 + #+(or arm64 x86-64) ((typep vector '(or #+sb-unicode (simple-array character (*)) (simple-array (signed-byte 32) (*)) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index a943065f9b..256584f73b 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -139,3 +139,50 @@ DONE)) vector) +(defun simd-nreverse32 (vector start end) + (declare ((simple-array * (*)) vector) + (fixnum start end) + (optimize speed (safety 0))) + (let ((sap (vector-sap vector))) + (inline-vop (((left sap-reg t) sap) + ((start any-reg tagged-num) start) + ((end) end) + ((right signed-reg signed-num)) + ((l)) + ((r))) + () + (inst shl end 1) + (inst shl start 1) + (inst lea right (ea left end)) + (inst add left start) + (inst mov l right) + (inst sub l left) + (inst cmp l 16) + (inst jmp :b BYTE) + (inst sub right 8) + + LOOP + (inst mov l (ea left)) + (inst mov r (ea right)) + (inst ror l 32) + (inst ror r 32) + (inst mov (ea left) r) + (inst mov (ea right) l) + (inst add left 8) + (inst sub right 8) + (inst cmp left right) + (inst jmp :b LOOP) + + (inst add right 8) + + BYTE + (inst sub right 4) + (inst cmp right left) + (inst jmp :b DONE) + + (inst mov :dword l (ea left)) + (inst mov :dword r (ea right)) + (inst mov :dword (ea left) r) + (inst mov :dword (ea right) l) + DONE)) + vector) From 7717a442f7c87e59b5d429a9ad4393d1a50dafbf Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 17 Jun 2022 15:24:45 +0300 Subject: [PATCH 3531/4023] x86-64: reverse byte-vectors using bswap. --- src/code/seq.lisp | 2 +- src/code/x86-64-simd.lisp | 51 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index f03a96092f..948940b101 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -914,7 +914,7 @@ many elements are copied." (svref vector right-index)))) ((word-specialized-vector-tag-p tag) (reverse-word-specialized-vector vector new-vector end)) - #+arm64 + #+(or arm64 x86-64) ((typep vector '(or (simple-array base-char (*)) (simple-array (signed-byte 8) (*)) (simple-array (unsigned-byte 8) (*)))) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 256584f73b..e4365e698a 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -158,7 +158,7 @@ (inst mov l right) (inst sub l left) (inst cmp l 16) - (inst jmp :b BYTE) + (inst jmp :b SCALAR) (inst sub right 8) LOOP @@ -175,7 +175,7 @@ (inst add right 8) - BYTE + SCALAR (inst sub right 4) (inst cmp right left) (inst jmp :b DONE) @@ -186,3 +186,50 @@ (inst mov :dword (ea right) l) DONE)) vector) + +(defun simd-reverse8 (source start length target) + (declare ((simple-array * (*)) vector target) + (fixnum start length) + (optimize speed (safety 0))) + (let ((source (vector-sap source)) + (target (vector-sap target))) + (inline-vop (((source sap-reg t) source) + ((target sap-reg t) target) + ((start any-reg tagged-num) start) + ((length) length) + ((s-i signed-reg signed-num)) + ((t-i)) + ((g))) + () + (inst shr start 1) + (inst add source start) + (zeroize t-i) + (inst mov s-i length) + (inst shr s-i 1) + (inst cmp s-i 8) + (inst jmp :b SCALAR) + (inst sub s-i 8) + + LOOP + (inst mov g (ea source s-i)) + (inst bswap g) + (inst mov (ea target t-i) g) + + (inst add t-i 8) + (inst sub s-i 8) + (inst jmp :ge LOOP) + (inst add s-i 8) + + SCALAR + (inst sub s-i 1) + (inst jmp :b DONE) + + (loop repeat 7 + do + (inst mov :byte g (ea source s-i)) + (inst mov :byte (ea target t-i) g) + (inst add t-i 1) + (inst sub s-i 1) + (inst jmp :b DONE)) + DONE)) + target) From 50c6b02c5f17c86a5ea20c75d7fc7f617793ee65 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 17 Jun 2022 15:47:40 +0300 Subject: [PATCH 3532/4023] x86-64: reverse 32-bit vectors using ROR. --- src/code/seq.lisp | 2 +- src/code/x86-64-simd.lisp | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 948940b101..a2cef5d589 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -919,7 +919,7 @@ many elements are copied." (simple-array (signed-byte 8) (*)) (simple-array (unsigned-byte 8) (*)))) (sb-vm::simd-reverse8 vector start length new-vector)) - #+arm64 + #+(or arm64 x86-64) ((typep vector '(or #+sb-unicode (simple-array character (*)) (simple-array (signed-byte 32) (*)) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index e4365e698a..d6793c1f33 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -233,3 +233,45 @@ (inst jmp :b DONE)) DONE)) target) + +(defun simd-reverse32 (source start length target) + (declare ((simple-array * (*)) vector target) + (fixnum start length) + (optimize speed (safety 0))) + (let ((source (vector-sap source)) + (target (vector-sap target))) + (inline-vop (((source sap-reg t) source) + ((target sap-reg t) target) + ((start any-reg tagged-num) start) + ((length) length) + ((s-i signed-reg signed-num)) + ((t-i)) + ((g))) + () + (inst shl start 1) + (inst add source start) + (zeroize t-i) + (inst mov s-i length) + (inst shl s-i 1) + (inst cmp s-i 8) + (inst jmp :b SCALAR) + (inst sub s-i 8) + + LOOP + (inst mov g (ea source s-i)) + (inst ror g 32) + (inst mov (ea target t-i) g) + + (inst add t-i 8) + (inst sub s-i 8) + (inst jmp :ge LOOP) + (inst add s-i 8) + + SCALAR + (inst sub s-i 4) + (inst jmp :b DONE) + + (inst mov :dword g (ea source s-i)) + (inst mov :dword (ea target t-i) g) + DONE)) + target) From 36c1bc5ffa5e466150355ef82a1d0c5476e37a63 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 17 Jun 2022 09:21:44 -0400 Subject: [PATCH 3533/4023] Alter representation of filler objects * Store the complete size in words including the header. * For 64-bit, shift size leftward into the high bytes of the header. This makes it so that walking immobile code can use the same calculation on any object (code or filler) to get its size, and then code-as-filler can be eliminated in lieu of using actual fillers. Change the "scav" method to scav_lose as should have been done long ago. --- src/code/array.lisp | 8 ++++++-- src/code/room.lisp | 2 +- src/compiler/generic/late-objdef.lisp | 4 ++-- src/runtime/fullcgc.c | 2 +- src/runtime/gc-common.c | 12 +++++++++--- src/runtime/gc-private.h | 8 ++++++++ src/runtime/gencgc.c | 9 ++++----- tests/gc-testlib.c | 4 ++-- 8 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index 1851c4d5b2..00d555d98d 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -1383,6 +1383,11 @@ of specialized arrays is supported." ;;; where GC reads the objects on the page just after the filler ;;; because it doesn't know not to. ;;; +(defmacro make-filler (n) + `(logior (ash ,n #+64-bit 32 #-64-bit ,n-widetag-bits) filler-widetag)) +(defmacro filler-nwords (header) + `(ash ,header #+64-bit -32 #-64-bit ,(- n-widetag-bits))) + (defun %shrink-vector (vector new-length &aux (old-length (length vector)) (new-length* new-length)) @@ -1432,8 +1437,7 @@ of specialized arrays is supported." ;; if GC sees this bit pattern prior to setting the new length; ;; but even for SIMPLE-VECTOR, it's OK, it turns out. (setf (sap-ref-word data (ash aligned-new word-shift)) - (logior (ash (1- diff) n-widetag-bits) - filler-widetag))))))))))) + (make-filler diff))))))))))) ;; Only arrays have fill-pointers, but vectors have their length ;; parameter in the same place. (setf (%array-fill-pointer vector) new-length) diff --git a/src/code/room.lisp b/src/code/room.lisp index 6405030893..d0179cb876 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -190,7 +190,7 @@ (let ((word (sap-ref-word start 0))) (cond ((= (logand word widetag-mask) filler-widetag) ; pseudo-object - (let ((size (+ (* (ash word -8) n-word-bytes) n-word-bytes))) + (let ((size (ash (filler-nwords word) word-shift))) (setq start (sap+ start size)))) ((= word most-positive-word) ;; has to be a pseudo-cons resulting from removing an insignificant diff --git a/src/compiler/generic/late-objdef.lisp b/src/compiler/generic/late-objdef.lisp index 6ec982b439..5e129ebbf7 100644 --- a/src/compiler/generic/late-objdef.lisp +++ b/src/compiler/generic/late-objdef.lisp @@ -83,7 +83,7 @@ #+sb-simd-pack (simd-pack "unboxed") #+sb-simd-pack-256 (simd-pack-256 "unboxed") - (filler "unboxed") + (filler "filler" "lose" "filler") (simple-array "array") (simple-array-unsigned-byte-2 "vector_unsigned_byte_2") @@ -142,7 +142,7 @@ min (ldb (byte 32 32) bits)) ;; Union in the bits for other unboxed object types. (dolist (entry *scav/trans/size*) - (when (member (second entry) '("bignum" "unboxed") :test 'string=) + (when (member (second entry) '("bignum" "unboxed" "filler") :test 'string=) (setf bits (logior bits (ash 1 (ash (car entry) -2)))))) (format stream "static inline int leaf_obj_widetag_p(unsigned char widetag) {~%") #+64-bit (format stream " return (0x~XLU >> (widetag>>2)) & 1;" bits) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 22a9629f71..9fdf8dd7e8 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -618,7 +618,7 @@ static void clobber_headered_object(lispobj* addr, sword_t nwords) } else if ((SINGLE_OBJECT_FLAG|page_table[page].type) == (SINGLE_OBJECT_FLAG|PAGE_TYPE_CODE)) { // Code pages don't want (0 . 0) fillers, otherwise heap checking // gets an error: "object @ 0x..... is non-code on code page" - addr[0] = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; + addr[0] = make_filler_header(nwords); addr[1] = 0; } else { memset(addr, 0, nwords * N_WORD_BYTES); diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index a20566e662..0f644297d5 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -284,9 +284,10 @@ int descriptors_scavenge(lispobj *start, lispobj* end, goto immobile_obj; #endif else { - // Advancing by the filler payload count causes 'where' to be exactly - // at the next object after the loop increments it as usual. - if (header_widetag(ptr) == FILLER_WIDETAG) where += ptr >> N_WIDETAG_BITS; + // Advancing by the filler payload count (= total - 1) causes 'where' to + // align exactly to the next object after the loop steps by 1 as usual. + if (header_widetag(ptr) == FILLER_WIDETAG) + where += filler_total_nwords(ptr)-1; continue; } // Dear lord, I hate the numbering scheme with SCRATCH_GENERATION higher than everything @@ -738,6 +739,11 @@ scav_other_pointer(lispobj *where, lispobj object) * immediate, boxed, and unboxed objects */ +static sword_t size_filler(lispobj *where) { return filler_total_nwords(*where); } +static sword_t scav_filler(__attribute__((unused)) lispobj *where, lispobj object) { + return filler_total_nwords(object); +} + /* The immediate object scavenger basically wants to be "scav_cons", * and so returns 2. To see why it's right, observe that scavenge() will * not invoke a scavtab entry on any object except for one satisfying diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index 75cc1d5357..e4accf15ae 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -565,4 +565,12 @@ static inline boolean plausible_tag_p(lispobj addr) && lowtag_of(addr) == LOWTAG_FOR_WIDETAG(widetag); } +#ifdef LISP_FEATURE_64_BIT +# define make_filler_header(n) (((uword_t)(n)<<32)|FILLER_WIDETAG) +# define filler_total_nwords(header) ((header)>>32) +#else +# define make_filler_header(n) (((n)<<N_WIDETAG_BITS)|FILLER_WIDETAG) +# define filler_total_nwords(header) ((header)>>N_WIDETAG_BITS) +#endif + #endif /* _GC_PRIVATE_H_ */ diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index a4d1a75097..5062f17720 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1349,7 +1349,7 @@ void *gc_alloc_large(sword_t nbytes, int page_type) lispobj* addr = (lispobj*)page_address(first_page); if (locked) THREAD_JIT(0); - *addr = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; + *addr = make_filler_header(nwords); if (locked) // avoid enabling while GCing THREAD_JIT(1); @@ -1615,8 +1615,7 @@ void *collector_alloc_fallback(struct alloc_region* region, sword_t nbytes, int * Never insert that much filler */ if (fill_nwords >= SMALL_MIXED_NWORDS_LIMIT) return new_region(mixed_region, nbytes, PAGE_TYPE_MIXED); - *(lispobj*)region->free_pointer = - (fill_nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; + *(lispobj*)region->free_pointer = make_filler_header(fill_nwords); } region->free_pointer = next_card; region->end_addr = next_card + GENCGC_CARD_BYTES; @@ -2333,7 +2332,7 @@ void deposit_filler(char* from, char* to) { gc_assert((nwords - 1) <= 0x7FFFFF); page_index_t page = find_page_index(from); gc_assert(find_page_index(to-1) == page); - *(lispobj*)from = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; + *(lispobj*)from = make_filler_header(nwords); long unsigned last_card; switch (page_table[page].type) { case PAGE_TYPE_BOXED: @@ -2343,7 +2342,7 @@ void deposit_filler(char* from, char* to) { while (addr_to_card_index(from) != last_card) { from = PTR_ALIGN_DOWN(from, GENCGC_CARD_BYTES) + GENCGC_CARD_BYTES; nwords = (to - from) >> WORD_SHIFT; - *(lispobj*)from = (nwords - 1) << N_WIDETAG_BITS | FILLER_WIDETAG; + *(lispobj*)from = make_filler_header(nwords); } } } diff --git a/tests/gc-testlib.c b/tests/gc-testlib.c index a24984cce6..636fcec039 100644 --- a/tests/gc-testlib.c +++ b/tests/gc-testlib.c @@ -35,7 +35,7 @@ static void make_instances(int page_type, generation_index_t gen, lispobj result // Fill to the end of the card int filler_nwords = (GENCGC_CARD_BYTES >> WORD_SHIFT) - 2; - *where = ((filler_nwords - 1) << N_WIDETAG_BITS) | FILLER_WIDETAG; + *where = make_filler_header(filler_nwords); // Assert that no tagged pointer can point to the filler // fprintf(stderr, "Filler @ %p: %"OBJ_FMTX"\n", where, *where); @@ -55,7 +55,7 @@ static void make_instances(int page_type, generation_index_t gen, lispobj result // Fill to the end of the card filler_nwords = (GENCGC_CARD_BYTES >> WORD_SHIFT) - 6; - *where = ((filler_nwords - 1) << N_WIDETAG_BITS) | FILLER_WIDETAG; + *where = make_filler_header(filler_nwords); where += filler_nwords; result[0] = instance; From 2cae23e4036e31a4f5d6f296c355814d0e77f43e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 17 Jun 2022 21:58:03 +0300 Subject: [PATCH 3534/4023] statically-link-core: omit NOTINLINE functions. They should be more easily redefinable. --- src/code/immobile-space.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/code/immobile-space.lisp b/src/code/immobile-space.lisp index e4011ab7a7..68414a344a 100644 --- a/src/code/immobile-space.lisp +++ b/src/code/immobile-space.lisp @@ -133,7 +133,9 @@ ;; within the same code object (unless (and (<= code-begin target) (< target code-end)) (let ((fdefn (sb-vm::find-called-object target))) - (when (fdefn-p fdefn) + (when (and (fdefn-p fdefn) + (neq (info :function :inlinep (fdefn-name fdefn)) + 'notinline)) (push (cons (+ (sap- sap code-insts) (sb-disassem:dstate-cur-offs dstate) 1) From 1e31a3565a0a569156ac6074d2fda35dcc752687 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 17 Jun 2022 20:49:07 +0300 Subject: [PATCH 3535/4023] x86-64: nreverse 8-bit vectors using AVX2. Detect AVX2 on startup. --- src/code/cold-init.lisp | 3 +- src/code/save.lisp | 1 + src/code/share-vm.lisp | 41 +++++++++++++ src/code/x86-64-simd.lisp | 107 +++++++++++++++++++++++++++++++++ src/code/x86-64-vm.lisp | 3 + src/cold/build-order.lisp-expr | 19 +++--- 6 files changed, 164 insertions(+), 10 deletions(-) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index 3fd213284e..7bbbb12dd6 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -408,7 +408,8 @@ process to continue normally." (when (eq *invoke-debugger-hook* 'sb-debug::debugger-disabled-hook) (sb-debug::disable-debugger)) (call-hooks "initialization" *init-hooks*) - #+sb-thread (finalizer-thread-start)) + #+sb-thread (finalizer-thread-start) + (sb-vm::setup-cpu-specific-routines)) ;;;; some support for any hapless wretches who end up debugging cold ;;;; init code diff --git a/src/code/save.lisp b/src/code/save.lisp index b4060e8bfd..0b5b33021f 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -355,6 +355,7 @@ sufficiently motivated to do lengthy fixes." #+immobile-code (sb-vm::statically-link-core) (invalidate-fd-streams) (finalizers-deinit) + (sb-vm::restore-cpu-specific-routines) ;; Do this last, to have some hope of printing if we need to. (stream-deinit) (setf sb-c::*compile-elapsed-time* 0 diff --git a/src/code/share-vm.lisp b/src/code/share-vm.lisp index 06087f17e9..0c4fd5d10d 100644 --- a/src/code/share-vm.lisp +++ b/src/code/share-vm.lisp @@ -137,3 +137,44 @@ ;;; change our notion of what we think they are. (declaim (inline descriptor-sap)) (defun descriptor-sap (x) (int-sap (get-lisp-obj-address x))) + + + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defparameter *cpu-features* nil)) + +(defmacro def-cpu-feature (name detect) + ;; eval-when doesn't work correctly in the XC + (setf (getf *cpu-features* name) detect) + `(progn + (defglobal ,(symbolicate '+ name '-routines+) ()) + (setf (getf *cpu-features* ',name) ',detect))) + +(defmacro def-variant (name cpu-feature lambda-list &body body) + (let ((variant (symbolicate name '- cpu-feature))) + `(progn + (defun ,variant ,lambda-list + ,@body) + ;; Avoid STATICALLY-LINK-CORE from making it harder to redefine. + (proclaim '(notinline ,name)) + (setf (getf ,(symbolicate '+ cpu-feature '-routines+) (find-fdefn ',name)) + #',variant)))) + +(defvar *previous-cpu-routines* nil) + +(defmacro setup-cpu-specific-routines () + `(progn + ,@(loop for (feature detect) on *cpu-features* by #'cddr + collect + `(when ,detect + (loop for (fdefn definition) on ,(package-symbolicate :sb-vm '+ feature '-routines+) + by #'cddr + do + (push (cons fdefn (fdefn-fun fdefn)) + *previous-cpu-routines*) + (setf (fdefn-fun fdefn) definition)))))) + +(defun restore-cpu-specific-routines () + (loop for (fdefn . fun) in *previous-cpu-routines* + do (setf (fdefn-fun fdefn) fun)) + (setf *previous-cpu-routines* nil)) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index d6793c1f33..975a963c28 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -139,6 +139,113 @@ DONE)) vector) +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun concat-ub8 (ub8s) + (let ((result 0)) + (loop for ub8 in ub8s + do (setf result (logior (ash result 8) ub8))) + result))) + +(def-variant simd-nreverse8 :avx2 (vector start end) + (declare ((simple-array * (*)) vector) + (fixnum start end) + (optimize speed (safety 0))) + (let ((sap (vector-sap vector))) + (inline-vop (((left sap-reg t) sap) + ((start any-reg tagged-num) start) + ((end) end) + ((right signed-reg signed-num)) + ((l)) + ((r)) + ((vl int-avx2-reg)) + ((vr)) + ((reverse-mask)) + ((reverse-mask-xmm int-sse-reg)) + ((vl-xmm)) + ((vr-xmm))) + () + (let ((reverse-mask-c (register-inline-constant :avx2 (concat-ub8 (loop for i below 32 collect i))))) + (assemble () + (inst shr end 1) + (inst shr start 1) + (inst lea right (ea left end)) + (inst add left start) + (inst mov l right) + (inst sub l left) + (inst cmp l 64) + (inst jmp :b XMM) + (inst sub right 32) + + (inst vmovdqu reverse-mask reverse-mask-c) + LOOP + (inst vmovdqu vl (ea left)) + (inst vmovdqu vr (ea right)) + (inst vperm2i128 vl vl vl 1) + (inst vperm2i128 vr vr vr 1) + (inst vpshufb vl vl reverse-mask) + (inst vpshufb vr vr reverse-mask) + (inst vmovdqu (ea left) vr) + (inst vmovdqu (ea right) vl) + (inst add left 32) + (inst sub right 32) + (inst cmp left right) + (inst jmp :b LOOP) + + (inst vzeroupper) + (inst add right 32) + + XMM + (inst mov r right) + (inst sub r 32) + (inst cmp r left) + (inst jmp :b WORD) + + (inst sub right 16) + (inst vmovdqu reverse-mask-xmm reverse-mask-c) + (inst vmovdqu vl-xmm (ea left)) + (inst vmovdqu vr-xmm (ea right)) + (inst vpshufb vl-xmm vl-xmm reverse-mask-c) + (inst vpshufb vr-xmm vr-xmm reverse-mask-c) + (inst vmovdqu (ea left) vr-xmm) + (inst vmovdqu (ea right) vl-xmm) + (inst add left 16) + + WORD + + (inst mov r right) + (inst sub r 16) + (inst cmp r left) + (inst jmp :b BYTE) + + (inst sub right 8) + (inst mov l (ea left)) + (inst mov r (ea right)) + (inst bswap l) + (inst bswap r) + (inst mov (ea left) r) + (inst mov (ea right) l) + (inst add left 8) + + + BYTE + (inst sub right 1) + (inst cmp right left) + (inst jmp :b DONE) + + (loop repeat 7 + do + (inst mov :byte l (ea left)) + (inst mov :byte r (ea right)) + (inst mov :byte (ea left) r) + (inst mov :byte (ea right) l) + (inst add left 1) + (inst sub right 1) + (inst cmp left right) + (inst jmp :ge DONE)) + + DONE)))) + vector) + (defun simd-nreverse32 (vector start end) (declare ((simple-array * (*)) vector) (fixnum start end) diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index a623465d94..fae363a521 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -490,3 +490,6 @@ (let ((flags (context-flags context))) (values (logbitp of-bit flags) (logbitp cf-bit flags))))) + +(def-cpu-feature :avx2 + (plusp (sb-alien:extern-alien "avx2_supported" int))) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 9d2be1a6f0..83204529b6 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -483,15 +483,6 @@ ;; compiled as part of the compiler ("src/code/macroexpand") - #+(or arm64 x86-64) - ("src/code/simd-fndb") - #+x86-64 - ("src/code/x86-64-simd" :not-host) - #+arm64 - ("src/code/arm64-simd" :not-host) - ("src/code/target-unicode" :not-host) - ("src/code/mipsstrops" :not-host) - ("src/code/string" :not-host) ("src/code/funutils" :not-host) #+win32 ("src/code/win32" :not-host) @@ -515,6 +506,16 @@ #+arm64 ("src/code/arm64-vm" :not-host) #+riscv ("src/code/riscv-vm" :not-host) + #+(or arm64 x86-64) + ("src/code/simd-fndb") + #+x86-64 + ("src/code/x86-64-simd" :not-host) + #+arm64 + ("src/code/arm64-simd" :not-host) + ("src/code/target-unicode" :not-host) + ("src/code/mipsstrops" :not-host) + ("src/code/string" :not-host) + ("src/code/target-signal-common" :not-host) #+unix ("src/code/target-signal" :not-host) ; needs OS-CONTEXT-T from share-vm #+win32 ("src/code/target-exception" :not-host) From 0ed28dbbd93582ed2efaaee28775227f3f411bbe Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 17 Jun 2022 16:12:53 -0400 Subject: [PATCH 3536/4023] linux: Never release a reserved memory range Give back memory to the OS without ever calling unmap. This logic remains fragile for all the other POSIXish OSes we support. --- doc/internals-notes/zero-with-mmap-bug.txt | 48 ++++++++++++++++++++++ src/runtime/gencgc.c | 27 ++++++------ 2 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 doc/internals-notes/zero-with-mmap-bug.txt diff --git a/doc/internals-notes/zero-with-mmap-bug.txt b/doc/internals-notes/zero-with-mmap-bug.txt new file mode 100644 index 0000000000..8caa3365af --- /dev/null +++ b/doc/internals-notes/zero-with-mmap-bug.txt @@ -0,0 +1,48 @@ +zero_range_with_mmap is not threadsafe if using unmap/remap +----------------------------------------------------------- + +Consider a case where SBCL is not able to get its default heap address +of 0x1000000000 (x86-64 linux) +Instead it gets something way up high where there are all sorts of other +memory mappings (from malloc and shared libraries, etc). + +At the time of failure, the lisp heap was "almost" covered by 6 lines +from /proc/self/maps which we output to stderr in os_validate on failure. +(Excerpt below) +In this lisp process, unmap/remap had already happened several times +as evident from the multiple lines. The kernel hadn't re-combined those +distinct ranges yet. It may do so at its leisure. + + ... many other mappings + range 7F3D0851F000 7F3D08520000 rwxp size 1000 + range 7F3D08520000 7F3D09918000 rwxp size 13F8000 + range 7F3D09930000 7F3D09938000 rwxp size 8000 + range 7F3D09938000 7F3D09948000 rwxp size 10000 + range 7F3D09948000 7F3D15710000 rwxp size BDC8000 + range 7F3D15710000 7F410851F000 rwxp size 3F2E0F000 + ... many other mappings + +Our lisp heap size is exactly (- #x7F410851F000 #x7F3D0851F000) +which is 16 GiB. + +So unfortunately we then saw a failure +"mmap: wanted 98304 bytes at 0x7f3d09918000, actually mapped at 0x7f3d044da000" +which precisely corresponds to the missing range between the second +and third line of the fragment above. +(98304 = 3 x sb-vm:gencgc-page-bytes) + +In light of the postmortem dump of /proc/self/maps not being an atomic snapshot, +one of two things must have happened: +- the kernel randomly decided to be adversarial and not give back + an address that was just a moment ago unmapped by this thread +- some other thread intruded between os_invalidate() and os_validate(). + +As a matter of fact there were about 20 non-lisp threads in the lisp process +which did not participate in the stop-for-GC protocol. +Any of them could have gotten this memory at just the right moment to interfere +with the unmap+remap technique. + +The fix is actually easy for linux - if MADV_DONTNEED is inapplicable, +then use memset. Since that case is not expected to occur often +(an entire page of file-backed data should not often become dead) +this does not add additional overhead except after running a fullcgc. diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 5062f17720..b5c8523349 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -641,7 +641,9 @@ report_heap_exhaustion(long available, long requested, struct thread *th) */ static void __attribute__((unused)) zero_range_with_mmap(os_vm_address_t addr, os_vm_size_t length) { -#ifdef LISP_FEATURE_LINUX +#ifdef LISP_FEATURE_WIN32 + os_revalidate_bzero(addr, length); +#elif defined LISP_FEATURE_LINUX // We use MADV_DONTNEED only on Linux due to differing semantics from BSD. // Linux treats it as a demand that the memory be 0-filled, or refreshed // from a file that backs the range. BSD takes it as a hint that you don't @@ -655,19 +657,18 @@ zero_range_with_mmap(os_vm_address_t addr, os_vm_size_t length) { if ((os_vm_address_t)addr >= anon_dynamic_space_start) { if (madvise(addr, length, MADV_DONTNEED) != 0) lose("madvise failed"); - } else -#endif -#ifdef LISP_FEATURE_WIN32 - os_revalidate_bzero(addr, length); + } else { // See doc/internals-notes/zero-with-mmap-bug.txt + // Trying to see how often this happens. + // fprintf(stderr, "zero_range_with_mmap: fallback to memset()\n"); + memset(addr, 0, length); + } #else - { - void *new_addr; - os_invalidate(addr, length); - new_addr = os_validate(NOT_MOVABLE, addr, length, 0, 1); - if (new_addr == NULL || new_addr != addr) { - lose("remap_free_pages: page moved, %p ==> %p", - addr, new_addr); - } + void *new_addr; + os_invalidate(addr, length); + new_addr = os_validate(NOT_MOVABLE, addr, length, 0, 1); + if (new_addr == NULL || new_addr != addr) { + lose("remap_free_pages: page moved, %p ==> %p", + addr, new_addr); } #endif } From e2b5504160930606a6d2cb82c0f5a5c7d6fc7b3f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 18 Jun 2022 01:21:07 +0300 Subject: [PATCH 3537/4023] x86-64: add vpermd. --- src/compiler/x86-64/avx2-insts.lisp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/compiler/x86-64/avx2-insts.lisp b/src/compiler/x86-64/avx2-insts.lisp index 2b13a55030..c60762bd0f 100644 --- a/src/compiler/x86-64/avx2-insts.lisp +++ b/src/compiler/x86-64/avx2-insts.lisp @@ -995,18 +995,21 @@ :remaining-bytes 1) (emit-byte segment imm))))) (def vpermpd #x66 #x01) - (def vpermpq #x66 #x00)) + (def vpermq #x66 #x00)) -(define-instruction vpermps (segment dst src src2) - (:emitter - (emit-avx2-inst segment src2 dst #x66 #x16 - :opcode-prefix #x0f38 - :vvvv src - :w 0 :l 1)) - . #.(avx2-inst-printer-list 'ymm-ymm/mem #x66 #x16 - :w 0 :l 1 - :nds t - :opcode-prefix #x0f38)) +(macrolet ((def (name op) + `(define-instruction ,name (segment dst src src2) + ,@(avx2-inst-printer-list 'ymm-ymm/mem #x66 op + :w 0 :l 1 + :nds t + :opcode-prefix #x0f38) + (:emitter + (emit-avx2-inst segment src2 dst #x66 ,op + :opcode-prefix #x0f38 + :vvvv src + :w 0 :l 1))))) + (def vpermps #x16) + (def vpermd #x36)) (macrolet ((def (name op op-imm) `(define-instruction ,name (segment dst src src2/imm) From a2c39d4933d8da2f20c49bed952b33858e8bdbb5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 18 Jun 2022 01:21:26 +0300 Subject: [PATCH 3538/4023] x86-64: add avx2 variants to the remaining reverse functions. --- src/code/x86-64-simd.lisp | 237 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 975a963c28..3dc8280266 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -144,6 +144,12 @@ (let ((result 0)) (loop for ub8 in ub8s do (setf result (logior (ash result 8) ub8))) + result)) + + (defun concat-ub32 (ub32s) + (let ((result 0)) + (loop for ub32 in ub32s + do (setf result (logior (ash result 32) ub32))) result))) (def-variant simd-nreverse8 :avx2 (vector start end) @@ -294,6 +300,93 @@ DONE)) vector) +(def-variant simd-nreverse32 :avx2 (vector start end) + (declare ((simple-array * (*)) vector) + (fixnum start end) + (optimize speed (safety 0))) + (let ((sap (vector-sap vector))) + (inline-vop (((left sap-reg t) sap) + ((start any-reg tagged-num) start) + ((end) end) + ((right signed-reg signed-num)) + ((l)) + ((r)) + ((vl int-avx2-reg)) + ((vr)) + ((reverse-mask)) + ((vl-xmm int-sse-reg)) + ((vr-xmm))) + () + (inst shl end 1) + (inst shl start 1) + (inst lea right (ea left end)) + (inst add left start) + (inst mov l right) + (inst sub l left) + (inst cmp l 64) + (inst jmp :b XMM) + (inst sub right 32) + + (inst vmovdqu reverse-mask (register-inline-constant :avx2 (concat-ub32 (loop for i to 7 collect i)))) + LOOP + (inst vmovdqu vl (ea left)) + (inst vmovdqu vr (ea right)) + (inst vpermd vl reverse-mask vl) + (inst vpermd vr reverse-mask vr) + + (inst vmovdqu (ea left) vr) + (inst vmovdqu (ea right) vl) + (inst add left 32) + (inst sub right 32) + (inst cmp left right) + (inst jmp :b LOOP) + + (inst vzeroupper) + (inst add right 32) + + XMM + (inst mov r right) + (inst sub r 32) + (inst cmp r left) + (inst jmp :b WORD) + + (inst sub right 16) + (inst vmovdqu vl-xmm (ea left)) + (inst vmovdqu vr-xmm (ea right)) + (inst vpshufd vl-xmm vl-xmm 27) + (inst vpshufd vr-xmm vr-xmm 27) + (inst vmovdqu (ea left) vr-xmm) + (inst vmovdqu (ea right) vl-xmm) + (inst add left 16) + + WORD + + (inst mov r right) + (inst sub r 16) + (inst cmp r left) + (inst jmp :b SCALAR) + + (inst sub right 8) + (inst mov l (ea left)) + (inst mov r (ea right)) + (inst ror l 32) + (inst ror r 32) + (inst mov (ea left) r) + (inst mov (ea right) l) + (inst add left 8) + + SCALAR + (inst sub right 4) + (inst cmp right left) + (inst jmp :b DONE) + + (inst mov :dword l (ea left)) + (inst mov :dword r (ea right)) + (inst mov :dword (ea left) r) + (inst mov :dword (ea right) l) + DONE)) + vector) + (defun simd-reverse8 (source start length target) (declare ((simple-array * (*)) vector target) (fixnum start length) @@ -341,6 +434,82 @@ DONE)) target) +(def-variant simd-reverse8 :avx2 (source start length target) + (declare ((simple-array * (*)) vector target) + (fixnum start length) + (optimize speed (safety 0))) + (let ((source (vector-sap source)) + (target (vector-sap target))) + (inline-vop (((source sap-reg t) source) + ((target sap-reg t) target) + ((start any-reg tagged-num) start) + ((length) length) + ((s-i signed-reg signed-num)) + ((t-i)) + ((g)) + ((v int-avx2-reg)) + ((reverse-mask)) + ((reverse-mask-xmm int-sse-reg)) + ((v-xmm))) + () + (let ((reverse-mask-c (register-inline-constant :avx2 (concat-ub8 (loop for i below 32 collect i))))) + (assemble () + (inst shr start 1) + (inst add source start) + (zeroize t-i) + (inst mov s-i length) + (inst shr s-i 1) + (inst cmp s-i 32) + (inst jmp :b XMM) + (inst sub s-i 32) + + (inst vmovdqu reverse-mask reverse-mask-c) + LOOP + (inst vmovdqu v (ea source s-i)) + (inst vperm2i128 v v v 1) + (inst vpshufb v v reverse-mask) + (inst vmovdqu (ea target t-i) v) + (inst add t-i 32) + (inst sub s-i 32) + (inst jmp :ge LOOP) + (inst vzeroupper) + (inst add s-i 32) + + XMM + (inst cmp s-i 16) + (inst jmp :b WORD) + + (inst sub s-i 16) + (inst vmovdqu reverse-mask-xmm reverse-mask-c) + (inst vmovdqu v-xmm (ea source s-i)) + (inst vpshufb v-xmm v-xmm reverse-mask-c) + (inst vmovdqu (ea target t-i) v-xmm) + (inst add t-i 16) + + WORD + (inst cmp s-i 8) + (inst jmp :b BYTE) + + (inst sub s-i 8) + (inst mov g (ea source s-i)) + (inst bswap g) + (inst mov (ea target t-i) g) + (inst add t-i 8) + + BYTE + (inst sub s-i 1) + (inst jmp :b DONE) + + (loop repeat 7 + do + (inst mov :byte g (ea source s-i)) + (inst mov :byte (ea target t-i) g) + (inst add t-i 1) + (inst sub s-i 1) + (inst jmp :b DONE)) + DONE)))) + target) + (defun simd-reverse32 (source start length target) (declare ((simple-array * (*)) vector target) (fixnum start length) @@ -382,3 +551,71 @@ (inst mov :dword (ea target t-i) g) DONE)) target) + + +(def-variant simd-reverse32 :avx2 (source start length target) + (declare ((simple-array * (*)) vector target) + (fixnum start length) + (optimize speed (safety 0))) + (let ((source (vector-sap source)) + (target (vector-sap target))) + (inline-vop (((source sap-reg t) source) + ((target sap-reg t) target) + ((start any-reg tagged-num) start) + ((length) length) + ((s-i signed-reg signed-num)) + ((t-i)) + ((g)) + ((v int-avx2-reg)) + ((reverse-mask)) + ((reverse-mask-xmm int-sse-reg)) + ((v-xmm))) + () + (inst shl start 1) + (inst add source start) + (zeroize t-i) + (inst mov s-i length) + (inst shl s-i 1) + (inst cmp s-i 32) + (inst jmp :b XMM) + (inst sub s-i 32) + + (inst vmovdqu reverse-mask (register-inline-constant :avx2 (concat-ub32 (loop for i to 7 collect i)))) + LOOP + (inst vmovdqu v (ea source s-i)) + (inst vpermd v reverse-mask v) + (inst vmovdqu (ea target t-i) v) + (inst add t-i 32) + (inst sub s-i 32) + (inst jmp :ge LOOP) + (inst vzeroupper) + (inst add s-i 32) + + XMM + (inst cmp s-i 16) + (inst jmp :b WORD) + + (inst sub s-i 16) + (inst vmovdqu v-xmm (ea source s-i)) + (inst vpshufd v-xmm v-xmm 27) + (inst vmovdqu (ea target t-i) v-xmm) + (inst add t-i 16) + + WORD + (inst cmp s-i 8) + (inst jmp :b SCALAR) + + (inst sub s-i 8) + (inst mov g (ea source s-i)) + (inst ror g 32) + (inst mov (ea target t-i) g) + (inst add t-i 8) + + SCALAR + (inst sub s-i 4) + (inst jmp :b DONE) + + (inst mov :dword g (ea source s-i)) + (inst mov :dword (ea target t-i) g) + DONE)) + target) From 1cbf9ae52b780af90194f1d9297af5cfab303c63 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 18 Jun 2022 01:40:49 +0300 Subject: [PATCH 3539/4023] Unused variable. --- src/code/x86-64-simd.lisp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 3dc8280266..01cd482658 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -568,8 +568,7 @@ ((g)) ((v int-avx2-reg)) ((reverse-mask)) - ((reverse-mask-xmm int-sse-reg)) - ((v-xmm))) + ((v-xmm int-sse-reg))) () (inst shl start 1) (inst add source start) From 6e8f8ee4272ee42d41ac2b970c0810ea7571806d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 18 Jun 2022 17:47:55 -0400 Subject: [PATCH 3540/4023] Add more output columns to print_generation_stats --- src/runtime/gencgc.c | 78 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 12 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index b5c8523349..8cc14804fc 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -427,6 +427,36 @@ extern void fpu_restore(void *); #define PAGE_INDEX_FMT PRIdPTR +int count_immobile_objects(int gen, int res[5]) +{ +#ifdef LISP_FEATURE_IMMOBILE_SPACE + lispobj* where = (lispobj*)FIXEDOBJ_SPACE_START; + lispobj* end = fixedobj_free_pointer; + while (where < end) { + if (immobile_obj_generation(where) == gen) { + switch (widetag_of(where)) { + case FUNCALLABLE_INSTANCE_WIDETAG: ++res[0]; break; + case INSTANCE_WIDETAG: ++res[1]; break; + case FDEFN_WIDETAG: ++res[2]; break; + case SYMBOL_WIDETAG: ++res[3]; break; + } + } + where += object_size(where); + } + where = (lispobj*)VARYOBJ_SPACE_START; + end = varyobj_free_pointer; + while (where < end) { + if (immobile_obj_generation(where) == gen + && widetag_of(where) == CODE_HEADER_WIDETAG + // don't count filler code + && ((struct code*)where)->boxed_size) + ++res[4]; + where += object_size(where); + } +#endif + return (res[0] | res[1] | res[2] | res[3] | res[4]) != 0; +} + // You can call this with 0 and NULL to perform its assertions silently void gc_gen_report_to_file(int filedes, FILE *file) { @@ -442,20 +472,36 @@ void gc_gen_report_to_file(int filedes, FILE *file) {if (file) fwrite(str, 1, len, file); if (filedes>=0) ignore_value(write(filedes, str, len));} /* Print the heap stats. */ - char header[] = - " Gen Boxed Cons Raw Code SmMix Mixed LgRaw LgCode LgMix" + char header1[] = + " Immobile Object Counts\n"; + OUTPUT(header1, sizeof header1-1); + char header2[] = + " Gen GF type fdefn symbol code Boxed Cons Raw Code SmMix Mixed LgRaw LgCode LgMix" " Waste% Alloc Trig Dirty GCs Mem-age\n"; - OUTPUT(header, sizeof header-1); + OUTPUT(header2, sizeof header2-1); generation_index_t gen_num, begin, end; + int immobile_matrix[8][5], have_immobile_obj = 0; + int immobile_totals[5]; + memset(immobile_matrix, 0, sizeof immobile_matrix); + memset(immobile_totals, 0, sizeof immobile_totals); + for (gen_num = 0; gen_num <= 6; ++gen_num) { + if (count_immobile_objects(gen_num, immobile_matrix[gen_num])) + have_immobile_obj |= 1 << gen_num; + immobile_totals[0] += immobile_matrix[gen_num][0]; + immobile_totals[1] += immobile_matrix[gen_num][1]; + immobile_totals[2] += immobile_matrix[gen_num][2]; + immobile_totals[3] += immobile_matrix[gen_num][3]; + immobile_totals[4] += immobile_matrix[gen_num][4]; + } // Print from the lowest gen that has any allocated pages. for (begin = 0; begin <= PSEUDO_STATIC_GENERATION; ++begin) - if (generations[begin].bytes_allocated) break; + if ((have_immobile_obj>>begin)&1 || generations[begin].bytes_allocated) break; // Print up to and including the highest gen that has any allocated pages. for (end = SCRATCH_GENERATION; end >= 0; --end) if (generations[end].bytes_allocated) break; - char linebuf[144]; + char linebuf[180]; page_index_t coltot[9]; uword_t eden_words_allocated = 0; page_index_t eden_pages = 0; @@ -463,7 +509,7 @@ void gc_gen_report_to_file(int filedes, FILE *file) for (gen_num = begin; gen_num <= end; gen_num++) { page_index_t page; page_index_t pagect[9]; - + int *objct = immobile_matrix[gen_num]; memset(pagect, 0, sizeof pagect); if (gen_num == 0) { // Count the eden pages for (page = 0; page < next_free_page; page++) @@ -486,9 +532,10 @@ void gc_gen_report_to_file(int filedes, FILE *file) (double)waste / (double)npage_bytes(eden_pages) * 100 : 0.0; if (eden_pages) { int linelen = snprintf(linebuf, sizeof linebuf, - " E %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%14"PAGE_INDEX_FMT + " E %5d %4d %6d %6d %6d %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%14"PAGE_INDEX_FMT "%14"PAGE_INDEX_FMT "%28.1f %11"OS_VM_SIZE_FMT"\n", + objct[0], objct[1], objct[2], objct[3], objct[4], pagect[0], pagect[1], pagect[3], pagect[5], pct_waste, eden_words_allocated<<WORD_SHIFT); OUTPUT(linebuf, linelen); @@ -532,10 +579,11 @@ void gc_gen_report_to_file(int filedes, FILE *file) (double)waste / (double)npage_bytes(tot_pages) * 100 : 0.0; int linelen = snprintf(linebuf, sizeof linebuf, - " %d %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT + " %d %5d %4d %6d %6d %6d" + "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT" %6.1f %11"OS_VM_SIZE_FMT" %11"OS_VM_SIZE_FMT, - gen_num, + gen_num, objct[0], objct[1], objct[2], objct[3], objct[4], pagect[0], pagect[1], pagect[2], pagect[3], pagect[4], pagect[5], pagect[6], pagect[7], pagect[8], pct_waste, words_allocated<<WORD_SHIFT, @@ -552,12 +600,15 @@ void gc_gen_report_to_file(int filedes, FILE *file) uword_t waste = npage_bytes(tot_pages) - bytes_allocated; double pct_waste = (double)waste / (double)npage_bytes(tot_pages) * 100; double heap_use_frac = 100 * (double)bytes_allocated / (double)dynamic_space_size; + int *objct = immobile_totals; int linelen = snprintf(linebuf, sizeof linebuf, - "Tot %7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT + "Tot %5d %4d %6d %6d %6d" + "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT"%7"PAGE_INDEX_FMT "%7"PAGE_INDEX_FMT" %6.1f%12"OS_VM_SIZE_FMT " [%.1f%% of %"OS_VM_SIZE_FMT" max]\n", + objct[0], objct[1], objct[2], objct[3], objct[4], coltot[0], coltot[1], coltot[2], coltot[3], coltot[4], coltot[5], coltot[6], coltot[7], coltot[8], pct_waste, (uintptr_t)bytes_allocated, heap_use_frac, (uintptr_t)dynamic_space_size); @@ -4052,7 +4103,7 @@ garbage_collect_generation(generation_index_t generation, int raise, if (gencgc_verbose > 1) { extern void dump_marked_objects(); - if (compacting_p()) show_pinnedobj_count(); else dump_marked_objects(); + if (compacting_p()) show_pinnedobj_count(); /*else dump_marked_objects();*/ } /* Now that all of the pinned pages are known, and @@ -4514,8 +4565,10 @@ collect_garbage(generation_index_t last_gen) if (pre_verify_gen_0) hexdump_and_verify_heap(cur_thread_approx_stackptr, VERIFY_PRE_GC); - if (gencgc_verbose > 1) + if (gencgc_verbose > 1) { + fprintf(stderr, "Pre-GC:\n"); print_generation_stats(); + } page_index_t initial_nfp = next_free_page; if (gc_mark_only) { @@ -4567,6 +4620,7 @@ collect_garbage(generation_index_t last_gen) generations[gen].cum_sum_bytes_allocated = 0; if (gencgc_verbose > 1) { + fprintf(stderr, "Post-GC(gen=%d):\n", gen); print_generation_stats(); } From 6e8e88d178b70c9e47ec0c5aeb5f396b7eaa0793 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 00:07:53 +0300 Subject: [PATCH 3541/4023] Move the touch-object VOP to generic/ As it is generic. --- src/compiler/fndb.lisp | 1 - src/compiler/generic/utils.lisp | 8 ++++++++ src/compiler/x86-64/c-call.lisp | 11 ----------- src/compiler/x86/c-call.lisp | 11 ----------- 4 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 8020268148..925a1eb731 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -2023,7 +2023,6 @@ (defknown %alien-funcall ((or string system-area-pointer) alien-type &rest t) *) ;; Used by WITH-PINNED-OBJECTS -#+(or x86 x86-64) (defknown sb-vm::touch-object (t) (values) (always-translatable)) diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 9e7eec1193..68442042e7 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -357,3 +357,11 @@ (defmacro id-bits-offset () (let ((slot (get-dsd-index layout sb-kernel::id-word0))) (ash (+ sb-vm:instance-slots-offset slot) sb-vm:word-shift))) + +(define-vop (touch-object) + (:translate touch-object) + (:args (object)) + (:ignore object) + (:policy :fast-safe) + (:arg-types t) + (:generator 0)) diff --git a/src/compiler/x86-64/c-call.lisp b/src/compiler/x86-64/c-call.lisp index a711d3a190..eddf9f0d4d 100644 --- a/src/compiler/x86-64/c-call.lisp +++ b/src/compiler/x86-64/c-call.lisp @@ -419,17 +419,6 @@ (inst sub :qword (alien-stack-ptr) delta))) (inst mov result (alien-stack-ptr))))) -;;; not strictly part of the c-call convention, but needed for the -;;; WITH-PINNED-OBJECTS macro used for "locking down" lisp objects so -;;; that GC won't move them while foreign functions go to work. -(define-vop (touch-object) - (:translate touch-object) - (:args (object)) - (:ignore object) - (:policy :fast-safe) - (:arg-types t) - (:generator 0)) - ;;; Callbacks #-sb-xc-host diff --git a/src/compiler/x86/c-call.lisp b/src/compiler/x86/c-call.lisp index 27c8e8265f..4b8cca1b1c 100644 --- a/src/compiler/x86/c-call.lisp +++ b/src/compiler/x86/c-call.lisp @@ -379,17 +379,6 @@ delta))) (load-symbol-value result *alien-stack-pointer*))) -;;; not strictly part of the c-call convention, but needed for the -;;; WITH-PINNED-OBJECTS macro used for "locking down" lisp objects so -;;; that GC won't move them while foreign functions go to work. -(define-vop (touch-object) - (:translate touch-object) - (:args (object)) - (:ignore object) - (:policy :fast-safe) - (:arg-types t) - (:generator 0)) - #-sb-xc-host (defun alien-callback-accessor-form (type sp offset) `(deref (sap-alien (sap+ ,sp ,offset) (* ,type)))) From 2f913f9b6be5b14db4305e6bd6666645a70609ad Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 00:08:24 +0300 Subject: [PATCH 3542/4023] arm64: add ushll, ushll2 instructions. --- src/compiler/arm64/insts.lisp | 76 ++++++++++++++++++++++++++-- src/compiler/arm64/target-insts.lisp | 26 ++++++++++ src/compiler/disassem.lisp | 2 +- 3 files changed, 99 insertions(+), 5 deletions(-) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 02ec8ee1b1..69f470b323 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -112,6 +112,8 @@ (define-arg-type simd-copy-reg :printer #'print-simd-copy-reg) + (define-arg-type simd-immh-reg :printer #'print-simd-immh-reg) + (define-arg-type sys-reg :printer #'print-sys-reg) (define-arg-type cond :printer #'print-cond) @@ -295,7 +297,7 @@ ;;;; Data-processing instructions -(defmacro def-emitter (name &rest specs) +(defmacro def-emitter (name &body specs) (collect ((arg-names) (arg-types)) (let* ((total-bits 32) (overall-mask (ash -1 total-bits)) @@ -2756,7 +2758,7 @@ (rn 5 5) (rd 5 0)) -(define-instruction-format (simd-scalar-three-same 32 +(define-instruction-format (simd-extract 32 :default-printer '(:name :tab rd ", " rn ", " rm)) (op3 :field (byte 1 31) :value #b0) (op4 :field (byte 9 21) :value #b101110000) @@ -2766,7 +2768,7 @@ (rd :fields (list (byte 1 30) (byte 5 0)) :type 'simd-reg)) (define-instruction ext (segment rd rn rm index &optional (size :16b)) - (:printer simd-scalar-three-same ()) + (:printer simd-extract ()) (:emitter (emit-simd-extract segment (encode-vector-size size) @@ -2960,11 +2962,77 @@ (reg-offset rn) (reg-offset rd))))))) (def cnt #b0 #b00101) - (def s-mvn #b1 #b00101) (def s-rev16 #b0 #b00001) (def s-rev32 #b1 #b00000 (:8b :16b :4h :8h)) (def rev64 #b0 #b00000 (:8b :16b :4h :8h :2s :4s))) + + +(def-emitter simd-shift-by-imm + (#b0 1 31) + (q 1 30) + (u 1 29) + (#b011110 6 23) + (immh 4 19) + (immb 3 16) + (op 5 11) + (#b1 1 10) + (rn 5 5) + (rd 5 0)) + +(define-instruction-format (simd-shift-by-imm 32 + :default-printer '(:name :tab rd ", " rn)) + (o1 :field (byte 1 31) :value #b0) + (q :field (byte 1 30)) + (u :field (byte 1 29)) + (op2 :field (byte 6 23) :value #b011110) + (immh :field (byte 4 19)) + (immb :field (byte 3 16)) + (op :field (byte 5 11)) + (op3 :field (byte 1 10) :value #b1) + (rn :fields (list (byte 1 30) (byte 4 19) (byte 5 5)) :type 'simd-immh-reg) + (rd :fields (list (byte 4 19) (byte 5 0)) :type 'simd-immh-reg)) + +(macrolet + ((def (name q u op) + `(define-instruction ,name (segment rd sized rn sizen shift) + (:printer simd-shift-by-imm ((q ,q) (u ,u) (op ,op))) + (:emitter + (let ((immh 0) + (immb 0)) + (ecase sized + (:8h + (aver (eq sizen + (if (zerop ,q) + :8B + :16B))) + (setf immh #b1)) + (:4s + (aver (eq sizen + (if (zerop ,q) + :4H + :8H))) + (setf immh #b10) + (setf (ldb (byte 1 0) immh) (ldb (byte 1 3) shift))) + (:2d + (aver (eq sizen + (if (zerop ,q) + :2S + :4S))) + (setf immh #b100) + (setf (ldb (byte 2 0) immh) (ldb (byte 2 3) shift)))) + (setf immb (ldb (byte 3 0) shift)) + (emit-simd-shift-by-imm segment + ,q + ,u + immh + immb + ,op + (reg-offset rn) + (reg-offset rd))))))) + (def ushll #b0 #b1 #b10100) + (def ushll2 #b1 #b1 #b10100)) + ;;; Inline constants (defun canonicalize-inline-constant (constant) (let ((first (car constant)) diff --git a/src/compiler/arm64/target-insts.lisp b/src/compiler/arm64/target-insts.lisp index 019591fc79..a0e489bd0a 100644 --- a/src/compiler/arm64/target-insts.lisp +++ b/src/compiler/arm64/target-insts.lisp @@ -262,6 +262,32 @@ (format stream "V~d.~a" offset (decode-vector-size q size)))) +(defun print-simd-immh-reg (value stream dstate) + (declare (ignore dstate)) + (if (= (length value) 2) + (destructuring-bind (immh offset) value + (format stream "V~d.~a" offset + (cond ((logbitp 0 immh) + "8H") + ((logbitp 1 immh) + "4S") + ((logbitp 2 immh) + "2D")))) + (destructuring-bind (q immh offset) value + (format stream "V~d.~a" offset + (cond ((logbitp 0 immh) + (if (zerop q) + "8B" + "16B")) + ((logbitp 1 immh) + (if (zerop q) + "4H" + "8H")) + ((logbitp 2 immh) + (if (zerop q) + "2S" + "4S"))))))) + (defun print-vbhs (value stream dstate) (declare (ignore dstate)) (destructuring-bind (size offset) value diff --git a/src/compiler/disassem.lisp b/src/compiler/disassem.lisp index b7cd6f351d..237ab8afd8 100644 --- a/src/compiler/disassem.lisp +++ b/src/compiler/disassem.lisp @@ -240,7 +240,7 @@ (defmacro define-instruction-format ((format-name length-in-bits &key default-printer include) - &rest arg-specs) + &body arg-specs) #+sb-xc-host (declare (ignore default-printer)) "DEFINE-INSTRUCTION-FORMAT (Name Length {Format-Key Value}*) Arg-Def* Define an instruction format NAME for the disassembler's use. LENGTH is From 0b8828f61d407a554b2b32489ace1a8e00a26fe3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 00:12:56 +0300 Subject: [PATCH 3543/4023] arm64: optimize string=* using SIMD. --- src/code/arm64-simd.lisp | 108 ++++++++++++++++++++++++++++++++++++++- src/code/string.lisp | 70 +++++++++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index f96666a7e9..54915546d2 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -37,7 +37,12 @@ (inst lsl offset index (1+ (- word-shift n-fixnum-tag-bits))) (inst add offset offset (- (* vector-data-offset n-word-bytes) other-pointer-lowtag)) - (inst str value (@ vector offset))))) + (inst str value (@ vector offset)))) + + (defun reg-in-sc (tn sc) + (make-random-tn :kind :normal + :sc (sc-or-lose sc) + :offset (tn-offset tn)))) (defmacro simd-mask (value) `(inline-vop @@ -312,3 +317,104 @@ (inst b :lt DONE)) DONE)) target) + +;;; Basically like the x86 with-pinned-object, +;;; but here only the boxed registers are pinned. +;;; This doesn't prevent the var from going to the stack, but none of +;;; the routines should do that. +(defmacro with-pinned-objects-in-registers (vars &body body) + `(multiple-value-prog1 ,@body + ,@(loop for var in vars + collect `(touch-object ,var)))) + +(defun simd-cmp-8-32 (byte-array 32-bit-array) + (declare ((simple-array * (*)) byte-array 32-bit-array) + (optimize speed (safety 0))) + (with-pinned-objects-in-registers (byte-array 32-bit-array) + (inline-vop (((byte-array sap-reg t) (vector-sap byte-array)) + ((32-bit-array sap-reg t) (vector-sap 32-bit-array)) + ((length any-reg) (length byte-array)) + ((32-bits complex-double-reg)) + ((bytes single-reg)) + ((cmp unsigned-reg)) + ((end))) + ((res descriptor-reg t :from :load)) + (load-symbol res t) + (inst cbz length DONE) + (inst add end byte-array (lsr length 1)) + LOOP + (inst ldr bytes (@ byte-array 4 :post-index)) + (inst ldr 32-bits (@ 32-bit-array 16 :post-index)) + (setf bytes (reg-in-sc bytes 'complex-double-reg)) + + (inst ushll bytes :8h bytes :8b 0) + (inst ushll bytes :4s bytes :4h 0) + + (inst cmeq bytes bytes 32-bits :4s) + (inst uminv bytes bytes :4s) + (inst umov cmp bytes 0 :s) + (inst cbz cmp FALSE) + (inst cmp byte-array end) + (inst b :lt LOOP) + (inst b DONE) + FALSE + (inst mov res null-tn) + DONE))) + +(defun simd-cmp-8-8 (a b) + (declare ((simple-array * (*)) a b) + (optimize speed (safety 0))) + (with-pinned-objects-in-registers (a b) + (inline-vop (((a-array sap-reg t) (vector-sap a)) + ((b-array sap-reg t) (vector-sap b)) + ((length any-reg) (length a)) + ((a complex-double-reg)) + ((b)) + ((cmp unsigned-reg)) + ((end))) + ((res descriptor-reg t :from :load)) + (load-symbol res t) + (inst cbz length DONE) + (inst add end a-array (lsr length 1)) + LOOP + (inst ldr a (@ a-array 16 :post-index)) + (inst ldr b (@ b-array 16 :post-index)) + (inst cmeq a a b :16b) + (inst uminv a a :16b) + (inst umov cmp a 0 :b) + (inst cbz cmp FALSE) + (inst cmp a-array end) + (inst b :lt LOOP) + (inst b DONE) + FALSE + (inst mov res null-tn) + DONE))) + +(defun simd-cmp-32-32 (a b) + (declare ((simple-array * (*)) a b) + (optimize speed (safety 0))) + (with-pinned-objects-in-registers (a b) + (inline-vop (((a-array sap-reg t) (vector-sap a)) + ((b-array sap-reg t) (vector-sap b)) + ((length any-reg) (length a)) + ((a complex-double-reg)) + ((b)) + ((cmp unsigned-reg)) + ((end))) + ((res descriptor-reg t :from :load)) + (load-symbol res t) + (inst cbz length DONE) + (inst add end a-array (lsl length 1)) + LOOP + (inst ldr a (@ a-array 16 :post-index)) + (inst ldr b (@ b-array 16 :post-index)) + (inst cmeq a a b :4s) + (inst uminv a a :4s) + (inst umov cmp a 0 :s) + (inst cbz cmp FALSE) + (inst cmp a-array end) + (inst b :lt LOOP) + (inst b DONE) + FALSE + (inst mov res null-tn) + DONE))) diff --git a/src/code/string.lisp b/src/code/string.lisp index f0eab7e68b..44c0b2044e 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -127,6 +127,54 @@ (return nil)))))) (defun string=* (string1 string2 start1 end1 start2 end2) + #+arm64 + (when (and (zerop start1) + (zerop start2) + (not end1) + (not end2)) + ;; With the range spanning the whole string it can be compared + ;; 128 bits at a time without the need to process any leftover + ;; bits. + (prog ((string1 string1) + (string2 string2)) + (cond ((simple-base-string-p string1) + (cond #+sb-unicode + ((simple-character-string-p string2) + (go 8-32)) + #+arm64 + ((simple-base-string-p string2) + (go 8-8)) + (t + (go normal)))) + #+sb-unicode + ((simple-character-string-p string1) + (cond ((simple-base-string-p string2) + (rotatef string1 string2) + (go 8-32)) + #+arm64 + ((simple-character-string-p string2) + (go 32-32)) + (t + (go normal)))) + (t + (go normal))) + 8-32 + (return-from string=* + (and (= (length string1) + (length string2)) + (sb-vm::simd-cmp-8-32 string1 string2))) + 8-8 + (return-from string=* + (and (= (length string1) + (length string2)) + (sb-vm::simd-cmp-8-8 string1 string2))) + + 32-32 + (return-from string=* + (and (= (length string1) + (length string2)) + (sb-vm::simd-cmp-32-32 string1 string2))) + normal)) (with-two-strings string1 string2 start1 end1 nil start2 end2 (let ((len (- end1 start1))) (unless (= len (- end2 start2)) ; trivial @@ -179,6 +227,17 @@ (%sp-string= string1 string2 start1 end1 start2 end2))) (defun simple-base-string= (string1 string2 start1 end1 start2 end2) + #+arm64 + (when (and (zerop start1) + (zerop start2) + (not end1) + (not end2) + (simple-base-string-p string1) + (simple-base-string-p string2)) + (return-from simple-base-string= + (and (= (length string1) + (length string2)) + (sb-vm::simd-cmp-8-8 string1 string2)))) (with-two-strings string1 string2 start1 end1 nil start2 end2 (let ((len (- end1 start1))) (cond ((/= len (- end2 start2)) @@ -192,6 +251,17 @@ #+sb-unicode (defun simple-character-string= (string1 string2 start1 end1 start2 end2) + #+arm64 + (when (and (zerop start1) + (zerop start2) + (not end1) + (not end2) + (simple-character-string-p string1) + (simple-character-string-p string2)) + (return-from simple-character-string= + (and (= (length string1) + (length string2)) + (sb-vm::simd-cmp-32-32 string1 string2)))) (with-two-strings string1 string2 start1 end1 nil start2 end2 (let ((len (- end1 start1))) (cond ((/= len (- end2 start2)) From f816b9b4f5f3e6222559ffe86851ee033da64214 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 00:15:56 +0300 Subject: [PATCH 3544/4023] x86-64: fix MOVD XMM, MEM. --- src/compiler/x86-64/insts.lisp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index bf962f4df8..b63c4b3520 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -2773,10 +2773,14 @@ (setq dst (sized-thing dst size) src (sized-thing src size)) (cond ((xmm-register-p dst) - (emit-sse-inst segment dst src #x66 #x6e)) + (emit-sse-inst segment dst src #x66 #x6e + :operand-size (and (ea-p src) + :do-not-set))) (t (aver (xmm-register-p src)) - (emit-sse-inst segment src dst #x66 #x7e))))) + (emit-sse-inst segment src dst #x66 #x7e + :operand-size (and (ea-p dst) + :do-not-set)))))) (define-instruction movd (segment dst src) (:emitter (move-xmm<->gpr segment dst src :dword)) . #.(append (sse-inst-printer 'xmm-reg/mem #x66 #x6e From 486bd88a167e1231a42086f4b9324ed7cee60c4f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 00:45:13 +0300 Subject: [PATCH 3545/4023] x86-64: compare simple-base- to simple-character-string with SSE2. As that can't be fed to memcmp() --- src/code/string.lisp | 8 ++++++-- src/code/x86-64-simd.lisp | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 44c0b2044e..42c27ec001 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -127,7 +127,7 @@ (return nil)))))) (defun string=* (string1 string2 start1 end1 start2 end2) - #+arm64 + #+(or arm64 (and x86-64 sb-unicode)) (when (and (zerop start1) (zerop start2) (not end1) @@ -162,14 +162,18 @@ (return-from string=* (and (= (length string1) (length string2)) - (sb-vm::simd-cmp-8-32 string1 string2))) + (let ((x (sb-vm::simd-cmp-8-32 string1 string2))) + (aver (eq x (string=* (coerce string1 'simple-character-string) string2 start1 end1 start2 end2))) + x))) 8-8 + #+arm64 (return-from string=* (and (= (length string1) (length string2)) (sb-vm::simd-cmp-8-8 string1 string2))) 32-32 + #+arm64 (return-from string=* (and (= (length string1) (length string2)) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 01cd482658..ed3b00fa31 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -618,3 +618,45 @@ (inst mov :dword (ea target t-i) g) DONE)) target) + +(defun simd-cmp-8-32 (byte-array 32-bit-array) + (declare ((simple-array * (*)) byte-array 32-bit-array) + (optimize speed (safety 0))) + (inline-vop (((byte-array sap-reg t) (vector-sap byte-array)) + ((32-bit-array sap-reg t) (vector-sap 32-bit-array)) + ((end)) + ((length any-reg) (length byte-array)) + ((cmp unsigned-reg)) + ((bytes int-sse-reg)) + ((32-bits)) + ((zero))) + ((res descriptor-reg t :from :load)) + (load-symbol res t) + (inst test length length) + (inst jmp :z DONE) + (inst pxor zero zero) + (inst shr length 1) + (inst lea end (ea length byte-array)) + + LOOP + (inst movd bytes (ea byte-array)) + (inst movdqa 32-bits (ea 32-bit-array)) + (inst add byte-array 4) + (inst add 32-bit-array 16) + ;; Interleaving with zero widens bytes to halfwords, and then + ;; again to words. + ;; PMOVZXBD from SSE4.1 doesn't seem to be faster. + (inst punpcklbw bytes zero) + (inst punpcklwd bytes zero) + (inst pcmpeqd bytes 32-bits) + (inst pmovmskb cmp bytes) + (inst cmp :dword cmp #xFFFF) + (inst jmp :ne FALSE) + + (inst cmp byte-array end) + (inst jmp :b LOOP) + (inst jmp DONE) + + FALSE + (load-symbol res nil) + DONE)) From 3a5eacb5d335b3ba7953f40c0b423ecb0f07b86a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 01:00:00 +0300 Subject: [PATCH 3546/4023] Move touch-object to a file without :c-headers. Or some tests fail when built with sb-fasteval. --- src/compiler/generic/utils.lisp | 8 -------- src/compiler/generic/vm-ir2tran.lisp | 8 ++++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 68442042e7..9e7eec1193 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -357,11 +357,3 @@ (defmacro id-bits-offset () (let ((slot (get-dsd-index layout sb-kernel::id-word0))) (ash (+ sb-vm:instance-slots-offset slot) sb-vm:word-shift))) - -(define-vop (touch-object) - (:translate touch-object) - (:args (object)) - (:ignore object) - (:policy :fast-safe) - (:arg-types t) - (:generator 0)) diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index dee667cd49..dc654a50d4 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -478,3 +478,11 @@ (primitive-object-slots (primitive-object 'array))) '(fill-pointer elements data displacement displaced-p displaced-from dimensions))) + +(define-vop (touch-object) + (:translate touch-object) + (:args (object)) + (:ignore object) + (:policy :fast-safe) + (:arg-types t) + (:generator 0)) From bbb7939c93c98bf3633fa2c3ff0ecee55f39ec65 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 19 Jun 2022 18:20:28 -0400 Subject: [PATCH 3547/4023] Remove core-object-patch-table slot --- src/compiler/generic/core.lisp | 4 -- src/compiler/generic/target-core.lisp | 73 +++++++-------------------- 2 files changed, 17 insertions(+), 60 deletions(-) diff --git a/src/compiler/generic/core.lisp b/src/compiler/generic/core.lisp index 93664a768e..7cdb00cb17 100644 --- a/src/compiler/generic/core.lisp +++ b/src/compiler/generic/core.lisp @@ -29,10 +29,6 @@ ;; A hashtable translating ENTRY-INFO structures to the corresponding actual ;; FUNCTIONs for functions in this compilation. (entry-table (make-hash-table :test 'eq) :type hash-table) - ;; A hashtable translating ENTRY-INFO structures to a list of pairs - ;; (<code object> . <offset>) describing the places that need to be - ;; backpatched to point to the function for ENTRY-INFO. - (patch-table (make-hash-table :test 'eq) :type hash-table) ;; A list of all the DEBUG-INFO objects created, kept so that we can ;; backpatch with the source info. (debug-info () :type list)) diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index ef33fb1895..f8acbc9a1e 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -211,38 +211,6 @@ (assign-simple-fun-self (%code-entry-point copy 0))) copy)) -;;; Note the existence of FUNCTION. -(defun note-fun (info function object) - (declare (type function function) - (type core-object object)) - (let ((patch-table (core-object-patch-table object))) - (dolist (patch (gethash info patch-table)) - (setf (code-header-ref (car patch) (the index (cdr patch))) function)) - (remhash info patch-table)) - (setf (gethash info (core-object-entry-table object)) function) - (values)) - -;;; Stick a reference to the function FUN in CODEBLOB-OR-VECTOR at index I. -;;; The function has to have been compiled already. (This wasn't always the case I guess?) -(defun reference-core-fun (codeblob-or-vector i fun core-object) - (declare (type (or simple-vector code-component) codeblob-or-vector) - (type index i) - (type functional fun) - (type core-object object)) - (let* ((info (leaf-info fun)) - (found (gethash info (core-object-entry-table core-object)))) - ;; A core component can't have any cross-component references. - ;; If it could, then the entries would have placed into one component. - (cond (found - (if (simple-vector-p codeblob-or-vector) - (setf (svref codeblob-or-vector (- i sb-vm:code-constants-offset)) found) - (setf (code-header-ref codeblob-or-vector i) found))) - (t - (bug "Forward-reference to core function can't occur") - ;; Was: (push (cons code-obj i) (gethash info (core-object-patch-table object))) - ))) - (values)) - ;;; Dump a component to core. We pass in the assembler fixups, code ;;; vector and node info. @@ -299,16 +267,16 @@ ;; <header, boxed_size, debug_info, fixups> are absent from the simple-vector #+darwin-jit (make-array (- nboxed sb-vm:code-constants-offset) :initial-element 0)) + (const-patch-start-index + (+ sb-vm:code-constants-offset (* (length (ir2-component-entries 2comp)) + sb-vm:code-slots-per-simple-fun))) (n-named-calls ;; Pre-scan for fdefinitions to ensure their existence. ;; Doing so guarantees that storing them into the boxed header now ;; can't create any old->young pointer, which is important since gencgc ;; does not deal with untagged pointers when looking for old->young. (do ((count 0) - (index (+ sb-vm:code-constants-offset - (* (length (ir2-component-entries 2comp)) - sb-vm:code-slots-per-simple-fun)) - (1+ index))) + (index const-patch-start-index (1+ index))) ((>= index (length constants)) count) (let* ((const (aref constants index)) (kind (if (listp const) (car const) const))) @@ -321,7 +289,7 @@ (bytes (the (simple-array assembly-unit 1) (segment-contents-as-vector segment))) (named-call-fixups)) - (declare (ignorable n-named-calls)) + (declare (ignorable n-named-calls boxed-data)) ;; The following operations need the code pinned: ;; 1. copying into code-instructions (a SAP) ;; 2. apply-core-fixups and sanctify-for-execution @@ -383,28 +351,22 @@ (set-boxed-word (+ w sb-vm:simple-fun-arglist-slot) (entry-info-arguments entry-info)) (set-boxed-word (+ w sb-vm:simple-fun-source-slot) (entry-info-form/doc entry-info)) (set-boxed-word (+ w sb-vm:simple-fun-info-slot) (entry-info-type/xref entry-info)) - (note-fun entry-info fun object)))) + (setf (gethash entry-info (core-object-entry-table object)) fun)))) - (do ((index (+ sb-vm:code-constants-offset - (* (length (ir2-component-entries 2comp)) - sb-vm:code-slots-per-simple-fun)) - (1+ index))) + (do ((index const-patch-start-index (1+ index))) ((>= index (length constants))) (let* ((const (aref constants index)) (kind (if (listp const) (car const) const))) - (case kind - (:entry - (reference-core-fun (or boxed-data code-obj) index (cadr const) object)) - ((nil)) - (t - (let ((referent - (etypecase kind - ((member :named-call :fdefinition) (cadr const)) - ((eql :known-fun) - (%coerce-name-to-fun (cadr const))) - (constant - (constant-value const))))) - (set-boxed-word index referent (eq kind :named-call))))))) + (set-boxed-word + index + (etypecase kind + ((eql :entry) + (the function (gethash (leaf-info (cadr const)) + (core-object-entry-table object)))) + ((member :named-call :fdefinition) (cadr const)) + ((eql :known-fun) (%coerce-name-to-fun (cadr const))) + (constant (constant-value const))) + (eq kind :named-call)))) #+darwin-jit (assign-code-constants code-obj boxed-data)) @@ -430,7 +392,6 @@ (defun fix-core-source-info (info object &optional function) (declare (type core-object object)) (declare (type (or null function) function)) - (aver (zerop (hash-table-count (core-object-patch-table object)))) (let ((source (debug-source-for-info info :function function))) (dolist (info (core-object-debug-info object)) (setf (debug-info-source info) source))) From 580ca267c2dd0e3c561da9d1d653770fa171a5a0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 01:34:21 +0300 Subject: [PATCH 3548/4023] Remove debugging code. --- src/code/string.lisp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 42c27ec001..ef2e186f6b 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -162,9 +162,7 @@ (return-from string=* (and (= (length string1) (length string2)) - (let ((x (sb-vm::simd-cmp-8-32 string1 string2))) - (aver (eq x (string=* (coerce string1 'simple-character-string) string2 start1 end1 start2 end2))) - x))) + (sb-vm::simd-cmp-8-32 string1 string2))) 8-8 #+arm64 (return-from string=* From bc60a830326eeb162f2c926f7e67a8b664a20a72 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 19 Jun 2022 21:49:09 -0400 Subject: [PATCH 3549/4023] Refactor for better sharing --- src/code/load.lisp | 95 ++++++++++++++++----------- src/compiler/generic/target-core.lisp | 34 ++-------- src/runtime/arm64-darwin-os.c | 3 +- 3 files changed, 65 insertions(+), 67 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 9a902e62d9..2a04feb0d9 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1090,33 +1090,62 @@ ;;; Caution: don't try to "test" WITH-WRITABLE-CODE-INSTRUCTIONS in copy-in/out mode ;;; on any architecture where fixup application cares what the address of the code actually is. ;;; This means x86 is disqualified. You're just wasting your time if you try, as I did. -(defmacro with-writable-code-instructions ((code-var debug-info-var n-fdefns) &body body) - (declare (ignorable debug-info-var n-fdefns)) +(defmacro with-writable-code-instructions ((code-var debug-info-var n-fdefns n-funs) + &key copy fixup) + (declare (ignorable n-fdefns)) ;; N-FDEFNS is important for PPC64, slightly important for X86-64, not important for ;; any others, and doesn't even have a place to store it if lispwords are 32 bits. ;; The :DEDUPLICATED-FDEFNS test in compiler-2.pure asserts that the value is valid - #+64-bit - (push `(setf (sap-ref-32 (int-sap (get-lisp-obj-address ,code-var)) - (+ (ash sb-vm:code-boxed-size-slot sb-vm:word-shift) #+little-endian 4 - (- sb-vm:other-pointer-lowtag))) - ,n-fdefns) - body) - #+darwin-jit - `(with-pinned-objects (,code-var ,debug-info-var) - ;; DEBUG-INFO is pinned so that after assigning it into the temporary - ;; block of memory, the off-heap word which is invisible to GC remains valid. - (let* ((temp-copy (alien-funcall (extern-alien "duplicate_codeblob_offheap" - (function unsigned unsigned)) - (get-lisp-obj-address ,code-var))) - (aligned (+ temp-copy (logand temp-copy sb-vm:n-word-bytes)))) - ;; Rebind CODE-VAR to the replica, then execute BODY - (let ((,code-var (%make-lisp-obj (logior aligned sb-vm:other-pointer-lowtag)))) ,@body) - ;; Copy back, and fixup the simple-funs in the managed object - (alien-funcall (extern-alien "jit_copy_code_insts" (function void unsigned unsigned)) - (get-lisp-obj-address ,code-var) - temp-copy))) - #-darwin-jit - `(with-pinned-objects (,code-var) ,@body)) + (let ((body + ;; The following operations need the code pinned: + ;; 1. copying into code-instructions (a SAP) + ;; 2. apply-core-fixups and sanctify-for-execution + ;; A very specific store order is necessary to allow using uninitialized memory + ;; pages for code. Storing of the debug-info slot must occur between steps 1 and 2. + ;; Note that this does not have to take care to ensure atomicity + ;; of the store to the final word of unboxed data. Even if BYTE-BLT were + ;; interrupted in between the store of any individual byte, this code + ;; is GC-safe because we no longer need to know where simple-funs are embedded + ;; within the object to trace pointers. We *do* need to know where the funs + ;; are when transporting the object, but it's pinned within the body forms. + `(,copy + #+64-bit + (setf (sap-ref-32 (int-sap (get-lisp-obj-address ,code-var)) + (+ (ash sb-vm:code-boxed-size-slot sb-vm:word-shift) #+little-endian 4 + (- sb-vm:other-pointer-lowtag))) + ,n-fdefns) + ;; Check that the code trailer matches our expectation on number of embedded simple-funs + (aver (= (code-n-entries ,code-var) ,n-funs)) + ;; Serial# shares a word with the jump-table word count, + ;; so we can't assign serial# until after all raw bytes are copied in. + #-sb-xc-host (sb-c::assign-code-serialno ,code-var) + ;; Enforce that the final unboxed data word is published to memory + ;; before the debug-info is set. + (sb-thread:barrier (:write)) + ;; Until debug-info is assigned, it is illegal to create a simple-fun pointer + ;; into this object, because the C code assumes that the fun table is in an + ;; invalid/incomplete state (i.e. can't be read) until the code has debug-info. + ;; That is, C code can't deal with an interior code pointer until the fun-table + ;; is valid. This store must occur prior to calling %CODE-ENTRY-POINT, and + ;; applying fixups calls %CODE-ENTRY-POINT, so we have to do this before that. + (setf (%code-debug-info ,code-var) ,debug-info-var) + ,fixup))) + #+darwin-jit + `(with-pinned-objects (,code-var ,debug-info-var) + ;; DEBUG-INFO is pinned so that after assigning it into the temporary + ;; block of memory, the off-heap word which is invisible to GC remains valid. + (let* ((temp-copy (alien-funcall (extern-alien "duplicate_codeblob_offheap" + (function unsigned unsigned)) + (get-lisp-obj-address ,code-var))) + (aligned (+ temp-copy (logand temp-copy sb-vm:n-word-bytes)))) + ;; Rebind CODE-VAR to the replica, then execute BODY + (let ((,code-var (%make-lisp-obj (logior aligned sb-vm:other-pointer-lowtag)))) ,@body) + ;; Copy back, and fixup the simple-funs in the managed object + (alien-funcall (extern-alien "jit_copy_code_insts" (function void unsigned unsigned)) + (get-lisp-obj-address ,code-var) + temp-copy))) + #-darwin-jit + `(with-pinned-objects (,code-var) ,@body))) (define-load-time-global *show-new-code* nil) (define-fop 17 :not-host (fop-load-code ((:operands header n-code-bytes n-fixup-elts))) @@ -1140,20 +1169,9 @@ (align-up n-boxed-words sb-c::code-boxed-words-align) n-code-bytes)) (debug-info (svref stack (+ ptr n-constants)))) - (with-writable-code-instructions (code debug-info n-named-calls) - ;; * DO * NOT * SEPARATE * THESE * STEPS * - ;; For a full explanation, refer to the comment above MAKE-CORE-COMPONENT - ;; concerning the corresponding use therein of WITH-PINNED-OBJECTS etc. - (read-n-bytes (fasl-input-stream) (code-instructions code) 0 n-code-bytes) - (aver (= (code-n-entries code) n-simple-funs)) - ;; Serial# shares a word with the jump-table word count, - ;; so we can't assign serial# until after all raw bytes are copied in. - (sb-c::assign-code-serialno code) - (sb-thread:barrier (:write)) - ;; Assign debug-info. A code object that has no debug-info will never - ;; have its fun table accessed in conservative_root_p() or pin_object(). - (setf (%code-debug-info code) debug-info) - (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts)) + (with-writable-code-instructions (code debug-info n-named-calls n-simple-funs) + :copy (read-n-bytes (fasl-input-stream) (code-instructions code) 0 n-code-bytes) + :fixup (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts)) ;; Don't need the code pinned from here on (progn (setf (sb-c::debug-info-source (%code-debug-info code)) @@ -1334,4 +1352,3 @@ (dolist (m times) (format t "~30S: ~6,2F~%" (car m) (/ (float (cdr m)) 60.0)))))) |# - diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index f8acbc9a1e..036a84c224 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -237,6 +237,8 @@ ;;; Similar considerations pertain to x86[-64] fixups within the machine code. (defun assign-code-serialno (code-obj) + ;; Do we need unique IDs on the various strange kind of code blobs? These would + ;; include code from MAKE-SIMPLIFYING-TRAMPOLINE, ENCAPSULATE-FUNOBJ, MAKE-BPT-LRA. (let* ((serialno (ldb (byte (byte-size sb-vm::code-serialno-byte) 0) (atomic-incf *code-serialno*))) (insts (code-instructions code-obj)) @@ -288,35 +290,13 @@ nboxed length)) (bytes (the (simple-array assembly-unit 1) (segment-contents-as-vector segment))) + (n-simple-funs (length (ir2-component-entries 2comp))) (named-call-fixups)) (declare (ignorable n-named-calls boxed-data)) - ;; The following operations need the code pinned: - ;; 1. copying into code-instructions (a SAP) - ;; 2. apply-core-fixups and sanctify-for-execution - ;; A very specific store order is necessary to allow using uninitialized memory - ;; pages for code. Storing of the debug-info slot must occur between steps 1 and 2. - (sb-fasl::with-writable-code-instructions (code-obj debug-info n-named-calls) - ;; Note that this does not have to take care to ensure atomicity - ;; of the store to the final word of unboxed data. Even if BYTE-BLT were - ;; interrupted in between the store of any individual byte, this code - ;; is GC-safe because we no longer need to know where simple-funs are embedded - ;; within the object to trace pointers. We *do* need to know where the funs - ;; are when transporting the object, but it's currently pinned. - (%byte-blt bytes 0 (code-instructions code-obj) 0 (length bytes)) - ;; Serial# shares a word with the jump-table word count, - ;; so we can't assign serial# until after all raw bytes are copied in. - (assign-code-serialno code-obj) - ;; Enforce that the final unboxed data word is published to memory - ;; before the debug-info is set. - (sb-thread:barrier (:write)) - ;; Until debug-info is assigned, it is illegal to create a simple-fun pointer - ;; into this object, because the C code assumes that the fun table is in an - ;; invalid/incomplete state (i.e. can't be read) until the code has debug-info. - ;; That is, C code can't deal with an interior code pointer until the fun-table - ;; is valid. This store must occur prior to calling %CODE-ENTRY-POINT, and - ;; applying fixups calls %CODE-ENTRY-POINT, so we have to do this before that. - (setf (%code-debug-info code-obj) debug-info) - (setq named-call-fixups (apply-core-fixups code-obj fixup-notes))) + (sb-fasl::with-writable-code-instructions (code-obj debug-info + n-named-calls n-simple-funs) + :copy (%byte-blt bytes 0 (code-instructions code-obj) 0 (length bytes)) + :fixup (setq named-call-fixups (apply-core-fixups code-obj fixup-notes))) (when alloc-points #+(and x86-64 sb-thread) diff --git a/src/runtime/arm64-darwin-os.c b/src/runtime/arm64-darwin-os.c index 34e7883294..3473074bcf 100644 --- a/src/runtime/arm64-darwin-os.c +++ b/src/runtime/arm64-darwin-os.c @@ -32,7 +32,8 @@ void jit_copy_code_insts(lispobj dst, lispobj* src) int nwords = code_total_nwords(code); gc_assert(code_total_nwords((struct code*)aligned_src)); THREAD_JIT(0); - memcpy(code, aligned_src, nwords<<WORD_SHIFT); + // Leave the header word alone + memcpy(&code->boxed_size, aligned_src + 1, (nwords-1)<<WORD_SHIFT); for_each_simple_fun(i, fun, code, 1, { fun->self = fun_self_from_baseptr(fun); }) THREAD_JIT(1); free(src); From fbd3109d691196fb5d6a9d96c3ce61066db17c23 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 15:09:40 +0300 Subject: [PATCH 3550/4023] arm64: SIMD case-insensitive comparison of base-strings. With base-strings and character-strings. --- src/code/arm64-simd.lisp | 136 ++++++++++++++++++++++++++++++++-- src/code/string.lisp | 36 +++++++++ src/compiler/arm64/insts.lisp | 5 +- 3 files changed, 168 insertions(+), 9 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 54915546d2..9d27476e02 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -9,6 +9,8 @@ (in-package "SB-VM") +(assert (= base-char-code-limit 128)) + (eval-when (:compile-toplevel :load-toplevel :execute) (define-vop () (:translate vector-ref-128) @@ -42,9 +44,21 @@ (defun reg-in-sc (tn sc) (make-random-tn :kind :normal :sc (sc-or-lose sc) - :offset (tn-offset tn)))) + :offset (tn-offset tn))) + + (defun concat-ub8 (ub8s) + (let ((result 0)) + (loop for ub8 in ub8s + do (setf result (logior (ash result 8) ub8))) + result)) -(defmacro simd-mask (value) + (defun concat-ub8-repeat (n ub8) + (let ((result 0)) + (loop repeat n + do (setf result (logior (ash result 8) ub8))) + result))) + +(defmacro simd-mask-32 (value) `(inline-vop (((:info value) ,(logior value (ash value 32) @@ -53,11 +67,17 @@ ((res complex-double-reg complex-double-float)) (load-inline-constant res :oword value))) +(defmacro simd-mask-8 (value) + `(inline-vop + (((:info value) ,(concat-ub8-repeat 16 value))) + ((res complex-double-reg complex-double-float)) + (load-inline-constant res :oword value))) + (defmacro simd-string-case (a source destination index fallback) - `(let ((ascii-p (simd-mask 192)) - (a-mask (simd-mask ,(char-code a))) - (z-mask (simd-mask 25)) - (flip (simd-mask #x20))) + `(let ((ascii-p (simd-mask-32 192)) + (a-mask (simd-mask-32 ,(char-code a))) + (z-mask (simd-mask-32 25)) + (flip (simd-mask-32 #x20))) (declare (optimize sb-c::preserve-single-use-debug-variables)) (loop for ,index below (ceiling length (/ 128 32)) do @@ -418,3 +438,107 @@ FALSE (inst mov res null-tn) DONE))) + +(defun simd-base-string-equal (a b) + (declare (simple-base-string a b) + (optimize speed (safety 0))) + (with-pinned-objects-in-registers (a b) + (inline-vop (((a-array sap-reg t) (vector-sap a)) + ((b-array sap-reg t) (vector-sap b)) + ((length any-reg) (length a)) + ((a complex-double-reg)) + ((b)) + ((cmp unsigned-reg)) + ((end)) + ((a-mask complex-double-reg complex-double-float) + (simd-mask-8 #.(char-code #\a))) + ((z-mask) (simd-mask-8 25)) + ((flip) (simd-mask-8 #x20)) + ((temp)) + ((temp2))) + ((res descriptor-reg t :from :load)) + (load-symbol res t) + (inst cbz length DONE) + (inst add end a-array (lsr length 1)) + LOOP + (inst ldr a (@ a-array 16 :post-index)) + (inst ldr b (@ b-array 16 :post-index)) + + ;; Upcase a + (inst s-sub temp a a-mask) + (inst cmhs temp z-mask temp) + (inst s-and temp temp flip) + (inst s-eor a a temp) + + ;; Upcase b + (inst s-sub temp2 b a-mask) + (inst cmhs temp2 z-mask temp2) + (inst s-and temp2 temp2 flip) + (inst s-eor b b temp2) + + (inst cmeq a a b) + (inst uminv a a :16b) + (inst umov cmp a 0 :b) + (inst cbz cmp FALSE) + + (inst cmp a-array end) + (inst b :lt LOOP) + (inst b DONE) + FALSE + (inst mov res null-tn) + DONE))) + +#+sb-unicode +(defun simd-base-character-string-equal (base-string character-string) + (declare ((simple-array * (*)) base-string character-string) + (optimize speed (safety 0))) + (with-pinned-objects-in-registers (base-string character-string) + (inline-vop (((base-string sap-reg t) (vector-sap base-string)) + ((character-string sap-reg t) (vector-sap character-string)) + ((length any-reg) (length base-string)) + ((characters complex-double-reg)) + ((base-chars single-reg)) + ((cmp unsigned-reg)) + ((end)) + ((a-mask complex-double-reg complex-double-float) + (simd-mask-32 #.(char-code #\a))) + ((z-mask) (simd-mask-32 25)) + ((flip) (simd-mask-32 #x20)) + ((temp)) + ((temp2))) + ((res descriptor-reg t :from :load)) + (load-symbol res t) + (inst cbz length DONE) + (inst add end base-string (lsr length 1)) + LOOP + (inst ldr base-chars (@ base-string 4 :post-index)) + (inst ldr characters (@ character-string 16 :post-index)) + (setf base-chars (reg-in-sc base-chars 'complex-double-reg)) + + ;; Upcase 32-bit wide characters + (inst s-sub temp characters a-mask :4s) + (inst cmhs temp z-mask temp :4s) + (inst s-and temp temp flip) + (inst s-eor characters characters temp) + + ;; Widen 8-bit wide characters to 32-bits + (inst ushll base-chars :8h base-chars :8b 0) + (inst ushll base-chars :4s base-chars :4h 0) + + ;; And upcase them too + (inst s-sub temp2 base-chars a-mask :4s) + (inst cmhs temp2 z-mask temp2 :4s) + (inst s-and temp2 temp2 flip) + (inst s-eor base-chars base-chars temp2) + + (inst cmeq base-chars base-chars characters :4s) + (inst uminv base-chars base-chars :4s) + (inst umov cmp base-chars 0 :s) + (inst cbz cmp FALSE) + + (inst cmp base-string end) + (inst b :lt LOOP) + (inst b DONE) + FALSE + (inst mov res null-tn) + DONE))) diff --git a/src/code/string.lisp b/src/code/string.lisp index ef2e186f6b..f71a4ec945 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -405,6 +405,42 @@ (string-not-equal-loop 1 t nil))))) (defun two-arg-string-equal (string1 string2) + #+arm64 + (prog ((string1 string1) + (string2 string2)) + (cond ((simple-base-string-p string1) + (cond #+sb-unicode + ((simple-character-string-p string2) + (go 8-32)) + ((simple-base-string-p string2) + (go 8-8)) + (t + (go normal)))) + #+sb-unicode + ((simple-character-string-p string1) + (cond ((simple-base-string-p string2) + (rotatef string1 string2) + (go 8-32)) + #+(or) + ((simple-character-string-p string2) + (go 32-32)) + (t + (go normal)))) + (t + (go normal))) + 8-32 + #+sb-unicode + (return-from two-arg-string-equal + (and (= (length string1) + (length string2)) + (sb-vm::simd-base-character-string-equal string1 string2))) + 8-8 + (return-from two-arg-string-equal + (and (= (length string1) + (length string2)) + (sb-vm::simd-base-string-equal string1 string2))) + 32-32 + normal) (with-two-arg-strings string1 string2 start1 end1 nil start2 end2 (let ((slen1 (- (the fixnum end1) start1)) (slen2 (- (the fixnum end2) start2))) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 69f470b323..80cd78820a 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -2964,9 +2964,8 @@ (def cnt #b0 #b00101) (def s-rev16 #b0 #b00001) (def s-rev32 #b1 #b00000 (:8b :16b :4h :8h)) - (def rev64 #b0 #b00000 (:8b :16b :4h :8h :2s :4s))) - - + (def rev64 #b0 #b00000 (:8b :16b :4h :8h :2s :4s)) + (def not #b1 #b00101)) (def-emitter simd-shift-by-imm (#b0 1 31) From 0c9b0d32f0c881c0133534e3c534a8bbd6342993 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 19 Jun 2022 20:59:13 -0400 Subject: [PATCH 3551/4023] ppc: skip crashing test Works on ppc64 but not pcc32 with threads. Not sure how and when this came to be, but it's been a while (nothing to do with the recent change to make-bpt-lra) --- tests/debug.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/debug.impure.lisp b/tests/debug.impure.lisp index 7b058a0d63..bad4ca2289 100644 --- a/tests/debug.impure.lisp +++ b/tests/debug.impure.lisp @@ -869,7 +869,7 @@ "(FUNCALL CONT (1- X) CONT)" "1]")) -(with-test (:name (:debugger :bogus-debug-fun :source)) +(with-test (:name (:debugger :bogus-debug-fun :source) :skipped-on :ppc) (test-debugger "d debugger-test-done!" From e1c1ffd8dd983271113dc4d14eb089753c8e27f3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 22:10:29 +0300 Subject: [PATCH 3552/4023] arm64: encode some variants of the MOVI instruction. --- src/compiler/arm64/insts.lisp | 61 +++++++++++++++++++++++++++- src/compiler/arm64/target-insts.lisp | 25 ++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 80cd78820a..febca4d0cd 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -113,6 +113,8 @@ (define-arg-type simd-copy-reg :printer #'print-simd-copy-reg) (define-arg-type simd-immh-reg :printer #'print-simd-immh-reg) + (define-arg-type simd-modified-imm :printer #'print-simd-modified-imm) + (define-arg-type simd-reg-cmode :printer #'print-simd-reg-cmode) (define-arg-type sys-reg :printer #'print-sys-reg) @@ -2315,7 +2317,7 @@ (fp-data-processing-3 32 :include fp-data-processing :default-printer '(:name :tab rd ", " rn ", " rm ", " ra)) - (op4 :field (byte 9 23) :value #b000011110) + (op4 :field (byte 9 23) :value #b000111110) (op1 :field (byte 1 21)) (op2 :field (byte 1 15)) (rm :field (byte 5 16) :type 'float-reg) @@ -3032,6 +3034,63 @@ (def ushll #b0 #b1 #b10100) (def ushll2 #b1 #b1 #b10100)) +(def-emitter simd-modified-imm + (#b0 1 31) + (q 1 30) + (op 1 29) + (#b0111100000 10 19) + (abc 3 16) + (cmode 4 12) + (o2 1 11) + (#b1 1 10) + (defgh 5 5) + (rd 5 0)) + +(define-instruction-format (simd-modified-imm 32 + :default-printer '(:name :tab rd ", " imm)) + (o1 :field (byte 1 31) :value #b0) + (q :field (byte 1 30)) + (op :field (byte 1 29)) + (op2 :field (byte 10 19) :value #b0111100000) + (cmode :field (byte 4 12)) + (o2 :field (byte 1 11)) + (op3 :field (byte 1 10) :value #b1) + (imm :fields (list (byte 3 16) (byte 4 12) (byte 5 5)) :type 'simd-modified-imm) + (rd :fields (list (byte 1 30) (byte 4 12) (byte 5 0)) :type 'simd-reg-cmode)) + +(macrolet + ((def (name o2) + `(define-instruction ,name (segment rd imm size &optional (shift 0)) + ;; 8-bit + (:printer simd-modified-imm ((o2 ,o2) (op 0))) + (:emitter + (let ((abc 0) + (defgh 0) + (cmode 0) + (op 0)) + (setf abc (ldb (byte 3 5) imm) + defgh (ldb (byte 5 0) imm)) + (ecase size + ((:8b :16b) + (setf cmode #b1110)) + ((:2s :4s) + (setf cmode + (ash (ecase shift + (0 0) + (8 1) + (16 2) + (24 3)) + 1)))) + (emit-simd-modified-imm segment + (encode-vector-size size) + op + abc + cmode + ,o2 + defgh + (reg-offset rd))))))) + (def movi 0)) + ;;; Inline constants (defun canonicalize-inline-constant (constant) (let ((first (car constant)) diff --git a/src/compiler/arm64/target-insts.lisp b/src/compiler/arm64/target-insts.lisp index a0e489bd0a..699cae5112 100644 --- a/src/compiler/arm64/target-insts.lisp +++ b/src/compiler/arm64/target-insts.lisp @@ -288,6 +288,31 @@ "2S" "4S"))))))) +(defun print-simd-reg-cmode (value stream dstate) + (declare (ignore dstate)) + (destructuring-bind (q cmode offset) value + (format stream "V~d.~a" offset + (cond ((eq cmode #b1110) + (if (zerop q) + "8B" + "16B")) + ((zerop (logand cmode #b1001)) + (if (zerop q) + "2S" + "4S")))))) + +(defun print-simd-modified-imm (value stream dstate) + (declare (ignore dstate)) + (destructuring-bind (abc cmode defgh) value + (let ((shift + (cond ((eq cmode #b1110) + 0) + ((zerop (logand cmode #b1001)) + (ash cmode 2))))) + (princ (dpb abc (byte 3 5) defgh) stream) + (when (plusp shift) + (format t ", LSL #~d" shift))))) + (defun print-vbhs (value stream dstate) (declare (ignore dstate)) (destructuring-bind (size offset) value From 4f621c5398a1cb8c44ff8a61dc6d1bbe8ea9ab93 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 20 Jun 2022 22:11:07 +0300 Subject: [PATCH 3553/4023] arm64-simd: use MOVI for generating masks. Instead of loading them from inline constants. --- src/code/arm64-simd.lisp | 45 +++++++++++++++------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 9d27476e02..5e19bb5da9 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -44,34 +44,19 @@ (defun reg-in-sc (tn sc) (make-random-tn :kind :normal :sc (sc-or-lose sc) - :offset (tn-offset tn))) - - (defun concat-ub8 (ub8s) - (let ((result 0)) - (loop for ub8 in ub8s - do (setf result (logior (ash result 8) ub8))) - result)) - - (defun concat-ub8-repeat (n ub8) - (let ((result 0)) - (loop repeat n - do (setf result (logior (ash result 8) ub8))) - result))) + :offset (tn-offset tn)))) (defmacro simd-mask-32 (value) `(inline-vop - (((:info value) ,(logior value - (ash value 32) - (ash value 64) - (ash value 96)))) + (((:info value) ,value)) ((res complex-double-reg complex-double-float)) - (load-inline-constant res :oword value))) + (inst movi res value :4s))) (defmacro simd-mask-8 (value) `(inline-vop - (((:info value) ,(concat-ub8-repeat 16 value))) + (((:info value) ,value)) ((res complex-double-reg complex-double-float)) - (load-inline-constant res :oword value))) + (inst movi res value :16b))) (defmacro simd-string-case (a source destination index fallback) `(let ((ascii-p (simd-mask-32 192)) @@ -450,16 +435,18 @@ ((b)) ((cmp unsigned-reg)) ((end)) - ((a-mask complex-double-reg complex-double-float) - (simd-mask-8 #.(char-code #\a))) - ((z-mask) (simd-mask-8 25)) - ((flip) (simd-mask-8 #x20)) + ((a-mask complex-double-reg complex-double-float)) + ((z-mask)) + ((flip)) ((temp)) ((temp2))) ((res descriptor-reg t :from :load)) (load-symbol res t) (inst cbz length DONE) (inst add end a-array (lsr length 1)) + (inst movi a-mask (char-code #\a) :16b) + (inst movi z-mask 25 :16b) + (inst movi flip #x20 :16b) LOOP (inst ldr a (@ a-array 16 :post-index)) (inst ldr b (@ b-array 16 :post-index)) @@ -500,16 +487,18 @@ ((base-chars single-reg)) ((cmp unsigned-reg)) ((end)) - ((a-mask complex-double-reg complex-double-float) - (simd-mask-32 #.(char-code #\a))) - ((z-mask) (simd-mask-32 25)) - ((flip) (simd-mask-32 #x20)) + ((a-mask complex-double-reg complex-double-float)) + ((z-mask)) + ((flip)) ((temp)) ((temp2))) ((res descriptor-reg t :from :load)) (load-symbol res t) (inst cbz length DONE) (inst add end base-string (lsr length 1)) + (inst movi a-mask (char-code #\a) :4s) + (inst movi z-mask 25 :4s) + (inst movi flip #x20 :4s) LOOP (inst ldr base-chars (@ base-string 4 :post-index)) (inst ldr characters (@ character-string 16 :post-index)) From 13be61e19c8b30940e6f820856b5226653bde837 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 20 Jun 2022 15:53:56 -0400 Subject: [PATCH 3554/4023] Make ASSEMBLE-SECTIONS more efficient Or at least make the code more readable. Emulate SAPs only in the host; use native SAP operators in the target. --- src/code/cross-misc.lisp | 36 +++++++++++++++++++++++ src/cold/compile-cold-sbcl.lisp | 7 +++++ src/compiler/assem.lisp | 52 +++++++++++---------------------- 3 files changed, 60 insertions(+), 35 deletions(-) diff --git a/src/code/cross-misc.lisp b/src/code/cross-misc.lisp index 24de4a832f..d18cebbc70 100644 --- a/src/code/cross-misc.lisp +++ b/src/code/cross-misc.lisp @@ -280,6 +280,42 @@ (defmacro sap-ref-word (sap offset) `(#+64-bit sap-ref-64 #-64-bit sap-ref-32 ,sap ,offset)) +;;; Needed for assembler. +(defstruct (asm-sap-wrapper (:constructor vector-sap (vector))) + (vector (missing-arg) :type (simple-array (unsigned-byte 8) (*)))) +(defmacro with-pinned-objects (list &body body) + (declare (ignore list)) + `(progn ,@body)) +;;; The assembler does not USE-PACKAGE sb-sys, which works to our advantage +;;; in that we can define SAP-REF-16 and -32 as macros in the ASM package +;;; which avoids conflict with genesis. Genesis has its own SAP emulations in SB-SYS +;;; so all the definitions of FIXUP-CODE-OBJECT using the native accessors +;;; can transparently operate on genesis's model of target code blobs. +(defsetf sb-assem::sap-ref-16 sb-assem::asm-set-sap-ref-16) +(defsetf sb-assem::sap-ref-32 sb-assem::asm-set-sap-ref-32) +(defun sb-assem::asm-set-sap-ref-16 (sap index val) + (declare (type asm-sap-wrapper sap)) + (multiple-value-bind (b0 b1) + #+little-endian (values (ldb (byte 8 0) val) (ldb (byte 8 8) val)) + #+big-endian (values (ldb (byte 8 8) val) (ldb (byte 8 0) val)) + (let ((octets (asm-sap-wrapper-vector sap))) + (setf (aref octets (+ index 0)) b0 + (aref octets (+ index 1)) b1))) + val) +(defun sb-assem::asm-set-sap-ref-32 (sap index val) + (declare (type asm-sap-wrapper sap)) + (multiple-value-bind (b0 b1 b2 b3) + #+little-endian (values (ldb (byte 8 0) val) (ldb (byte 8 8) val) + (ldb (byte 8 16) val) (ldb (byte 8 24) val)) + #+big-endian (values (ldb (byte 8 24) val) (ldb (byte 8 16) val) + (ldb (byte 8 8) val) (ldb (byte 8 0) val)) + (let ((octets (asm-sap-wrapper-vector sap))) + (setf (aref octets (+ index 0)) b0 + (aref octets (+ index 1)) b1 + (aref octets (+ index 2)) b2 + (aref octets (+ index 3)) b3))) + val) + (defun logically-readonlyize (x) x) ;;; Mainly for the fasl loader diff --git a/src/cold/compile-cold-sbcl.lisp b/src/cold/compile-cold-sbcl.lisp index 5ceb7b0928..52367d64ed 100644 --- a/src/cold/compile-cold-sbcl.lisp +++ b/src/cold/compile-cold-sbcl.lisp @@ -109,6 +109,13 @@ (setq sb-c::*track-full-called-fnames* :minimal) ; Change this as desired +;;; Need to get access these sb-sys symbols unqualified from sb-assem +;;; during make-host-2. Make-host-1 would have already converted its +;;; code via DEFSETF so it should be insensitive to this substitution. +(unintern 'sb-assem::sap-ref-16 'sb-assem) +(unintern 'sb-assem::sap-ref-32 'sb-assem) +(import '(sb-sys:sap-ref-16 sb-sys:sap-ref-32) 'sb-assem) + (read-undefined-fun-allowlist) (defun parallel-make-host-2 (max-jobs) (let ((subprocess-count 0) diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index ce68086094..9a55ac887d 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -1513,32 +1513,14 @@ `(.skip ,trailer-len) `(.align ,sb-vm:n-lowtag-bits)) section))) - (octets (segment-buffer (%assemble segment combined)))) - (flet ((store-ub16 (index val) - (multiple-value-bind (b0 b1) - #+little-endian - (values (ldb (byte 8 0) val) (ldb (byte 8 8) val)) - #+big-endian - (values (ldb (byte 8 8) val) (ldb (byte 8 0) val)) - (setf (aref octets (+ index 0)) b0 - (aref octets (+ index 1)) b1))) - (store-ub32 (index val) - (multiple-value-bind (b0 b1 b2 b3) - #+little-endian - (values (ldb (byte 8 0) val) (ldb (byte 8 8) val) - (ldb (byte 8 16) val) (ldb (byte 8 24) val)) - #+big-endian - (values (ldb (byte 8 24) val) (ldb (byte 8 16) val) - (ldb (byte 8 8) val) (ldb (byte 8 0) val)) - (setf (aref octets (+ index 0)) b0 - (aref octets (+ index 1)) b1 - (aref octets (+ index 2)) b2 - (aref octets (+ index 3)) b3)))) - (let ((index (length octets)) - (fun-offsets)) - ;; Total size of the code object must be multiple of 2 lispwords - (aver (not (logtest (+ (segment-header-skew segment) index) - sb-vm:lowtag-mask))) + (fun-offsets) + (octets (segment-buffer (%assemble segment combined))) + (index (length octets))) + ;; Total size of the code object must be multiple of 2 lispwords + (aver (not (logtest (+ (segment-header-skew segment) index) + sb-vm:lowtag-mask))) + (sb-sys:with-pinned-objects (octets) + (let ((sap (sb-sys:vector-sap octets))) ;; TODO: as the comment in GENERATE-CODE suggests, we would like to align ;; code objects to 16 bytes for 32-bit x86. That's simple - all we have to do ;; is ensure that each code blob is a multiple of 16 bytes in size. @@ -1552,8 +1534,8 @@ (typep n-entries '(unsigned-byte 12)) (typep padding '(unsigned-byte 4))) (bug "Oversized code component?")) - (store-ub16 (- index 2) trailer-len) - (store-ub16 (- index 4) (logior (ash n-entries 4) padding))) + (setf (sap-ref-16 sap (- index 2)) trailer-len) + (setf (sap-ref-16 sap (- index 4)) (logior (ash n-entries 4) padding))) (decf index trailer-len) ;; Iteration over label positions occurs from numerically highest ;; to lowest, which is right because the 0th indexed simple-fun @@ -1565,13 +1547,13 @@ (dolist (label simple-fun-labels) (let ((val (label-position label))) (push val fun-offsets) - (store-ub32 index val) - (incf index 4))) - (aver (= index (- (length octets) 4))) - (values segment - (label-position end-text) - (segment-fixup-notes segment) - fun-offsets))))) + (setf (sap-ref-32 sap index) val) + (incf index 4))))) + (aver (= index (- (length octets) 4))) + (values segment + (label-position end-text) + (segment-fixup-notes segment) + fun-offsets))) ;;; Most backends do not convert register TNs into a different type of ;;; internal object prior to handing the operands off to the emitter. From 3682420df7d9c7c35149b992ff55861ab017f9af Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 20 Jun 2022 16:00:20 -0400 Subject: [PATCH 3555/4023] Give more flexibility to the code allocator This change will lend itself to an improvement in the immobile code allocator by allowing it to oversize a new object in case it is unable to split a hole whose size is below a threshold. Assume that it can split a hole with 4 words left over (not that those can be used), but will NOT split leaving just 2 words. In that case, the code object absorbs 2 words. The overage has to be accounted for in the new object since there is no other place to store a physical size. --- src/code/alloc.lisp | 5 +- src/code/load.lisp | 21 +++----- src/code/simple-fun.lisp | 13 ++--- src/compiler/assem.lisp | 7 ++- src/compiler/generic/genesis.lisp | 2 +- src/compiler/generic/target-core.lisp | 77 ++++++++++++++++++++------- src/runtime/code.h | 2 +- 7 files changed, 82 insertions(+), 45 deletions(-) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index 7a8d2c7f4f..4aafbf2270 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -463,7 +463,8 @@ ;;; 25 bits is the maximum unboxed size expressed in bytes, ;;; if n-word-bytes = 8 and almost the entire code object is unboxed ;;; which is, practically speaking, not really possible. -(declaim (ftype (sfunction (t (unsigned-byte 22) (unsigned-byte 25)) code-component) +(declaim (ftype (sfunction (t (unsigned-byte 22) (unsigned-byte 25)) + (values code-component (integer 0))) allocate-code-object)) ;;; Allocate a code component with BOXED words in the header ;;; followed by UNBOXED bytes of raw data. @@ -516,4 +517,4 @@ ;; But what about other things that create code objects? ;; It could be a subtle source of nondeterministic core images. - code)) + (values code total-words))) diff --git a/src/code/load.lisp b/src/code/load.lisp index 2a04feb0d9..56adb026a7 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1090,7 +1090,8 @@ ;;; Caution: don't try to "test" WITH-WRITABLE-CODE-INSTRUCTIONS in copy-in/out mode ;;; on any architecture where fixup application cares what the address of the code actually is. ;;; This means x86 is disqualified. You're just wasting your time if you try, as I did. -(defmacro with-writable-code-instructions ((code-var debug-info-var n-fdefns n-funs) +(defmacro with-writable-code-instructions ((code-var total-nwords debug-info-var + n-fdefns n-funs) &key copy fixup) (declare (ignorable n-fdefns)) ;; N-FDEFNS is important for PPC64, slightly important for X86-64, not important for @@ -1109,19 +1110,9 @@ ;; within the object to trace pointers. We *do* need to know where the funs ;; are when transporting the object, but it's pinned within the body forms. `(,copy - #+64-bit - (setf (sap-ref-32 (int-sap (get-lisp-obj-address ,code-var)) - (+ (ash sb-vm:code-boxed-size-slot sb-vm:word-shift) #+little-endian 4 - (- sb-vm:other-pointer-lowtag))) - ,n-fdefns) + (sb-c::code-header/trailer-adjust ,code-var ,total-nwords ,n-fdefns) ;; Check that the code trailer matches our expectation on number of embedded simple-funs (aver (= (code-n-entries ,code-var) ,n-funs)) - ;; Serial# shares a word with the jump-table word count, - ;; so we can't assign serial# until after all raw bytes are copied in. - #-sb-xc-host (sb-c::assign-code-serialno ,code-var) - ;; Enforce that the final unboxed data word is published to memory - ;; before the debug-info is set. - (sb-thread:barrier (:write)) ;; Until debug-info is assigned, it is illegal to create a simple-fun pointer ;; into this object, because the C code assumes that the fun table is in an ;; invalid/incomplete state (i.e. can't be read) until the code has debug-info. @@ -1164,12 +1155,14 @@ (dotimes (i n-named-calls) (aver (typep (svref stack stack-index) 'fdefn)) (incf stack-index))) - (let ((code (sb-c:allocate-code-object + (binding* (((code total-nwords) + (sb-c:allocate-code-object (if (oddp header) :immobile :dynamic) (align-up n-boxed-words sb-c::code-boxed-words-align) n-code-bytes)) (debug-info (svref stack (+ ptr n-constants)))) - (with-writable-code-instructions (code debug-info n-named-calls n-simple-funs) + (with-writable-code-instructions + (code total-nwords debug-info n-named-calls n-simple-funs) :copy (read-n-bytes (fasl-input-stream) (code-instructions code) 0 n-code-bytes) :fixup (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts)) ;; Don't need the code pinned from here on diff --git a/src/code/simple-fun.lisp b/src/code/simple-fun.lisp index 3210d60154..d69d0fc3e4 100644 --- a/src/code/simple-fun.lisp +++ b/src/code/simple-fun.lisp @@ -416,8 +416,9 @@ ;;; The fun-table-count is a uint16_t immediately preceding the trailer length ;;; containing two subfields: -;;; 12 bits for the number of simple-funs in the code component -;;; 4 bits for the number of pad bytes added to align the fun-offset-table +;;; 11 bits for the number of simple-funs in the code component +;;; 5 bits for the number of pad bytes added to align the fun-offset-table +;;; See also code_n_funs() in code.h (declaim (inline code-fun-table-count)) (defun code-fun-table-count (code-obj) (if (eql (code-trailer-len code-obj) 0) @@ -431,7 +432,7 @@ ;;; Keep in sync with C function code_n_funs() (defun code-n-entries (code-obj) (declare (type code-component code-obj)) - (ash (code-fun-table-count code-obj) -4)) + (ash (code-fun-table-count code-obj) -5)) ;;; Index to start of named-call fdefns ;;; FIXME: Naming symmetry between this and code-n-named-calls might be nice. @@ -450,7 +451,7 @@ ;;; to its FUN-INDEXth function. (declaim (inline %code-fun-offset)) (defun %code-fun-offset (code-obj fun-index) - (declare ((unsigned-byte 12) fun-index)) + (declare ((unsigned-byte 11) fun-index)) (code-trailer-ref code-obj (* -4 (+ fun-index 2)))) ;;; Subtract from %CODE-CODE-SIZE the number of trailing data bytes which aren't @@ -468,8 +469,8 @@ (defun %code-text-size (code-obj) (- (%code-code-size code-obj) (code-trailer-len code-obj) - ;; Subtract between 0 and 15 bytes of padding - (logand (code-fun-table-count code-obj) #xf))) + ;; Subtract between 0 and 31 bytes of padding + (logand (code-fun-table-count code-obj) #x1f))) (defun %code-entry-point (code-obj fun-index) (declare (type (unsigned-byte 16) fun-index)) diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index 9a55ac887d..76e371a1c6 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -1516,6 +1516,9 @@ (fun-offsets) (octets (segment-buffer (%assemble segment combined))) (index (length octets))) + ;; N-ENTRIES is packed into a uint16 with 5 other bits + (declare (type (unsigned-byte 11) n-entries)) + ;; Total size of the code object must be multiple of 2 lispwords (aver (not (logtest (+ (segment-header-skew segment) index) sb-vm:lowtag-mask))) @@ -1532,10 +1535,12 @@ (- index trailer-len (label-position end-text))))) (unless (and (typep trailer-len '(unsigned-byte 16)) (typep n-entries '(unsigned-byte 12)) + ;; Padding must be representable in 4 bits at assembly time, + ;; but CODE-HEADER/TRAILER-ADJUST can increase the padding. (typep padding '(unsigned-byte 4))) (bug "Oversized code component?")) (setf (sap-ref-16 sap (- index 2)) trailer-len) - (setf (sap-ref-16 sap (- index 4)) (logior (ash n-entries 4) padding))) + (setf (sap-ref-16 sap (- index 4)) (logior (ash n-entries 5) padding))) (decf index trailer-len) ;; Iteration over label positions occurs from numerically highest ;; to lowest, which is right because the 0th indexed simple-fun diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 2616573ee8..0f712a5d58 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2209,7 +2209,7 @@ Legal values for OFFSET are -4, -8, -12, ..." ;;; TODO: Maybe put them somewhere that gets defined for both? ;;; (Minor problem of CODE-COMPONENT not being a primitive type though) (defun code-n-entries (code) - (ash (code-fun-table-count code) -4)) + (ash (code-fun-table-count code) -5)) (defun %code-fun-offset (code fun-index) ;; The 4-byte quantity at "END" - 4 is the trailer count, the word at -8 is ;; the offset to the 0th simple-fun, -12 is the next, etc... diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index 036a84c224..ac1bb1c679 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -236,7 +236,10 @@ ;;; are 0, so the jump table count is 0. ;;; Similar considerations pertain to x86[-64] fixups within the machine code. -(defun assign-code-serialno (code-obj) +(defun code-header/trailer-adjust (code-obj expected-nwords n-fdefns) + (declare (ignorable expected-nwords n-fdefns)) + ;; Serial# shares a word with the jump-table word count, + ;; so we can't assign serial# until after all raw bytes are copied in. ;; Do we need unique IDs on the various strange kind of code blobs? These would ;; include code from MAKE-SIMPLIFYING-TRAMPOLINE, ENCAPSULATE-FUNOBJ, MAKE-BPT-LRA. (let* ((serialno (ldb (byte (byte-size sb-vm::code-serialno-byte) 0) @@ -246,7 +249,39 @@ (aver (zerop (ash jumptable-word -14))) (setf (sap-ref-word insts 0) ; insert serialno (logior (ash serialno (byte-position sb-vm::code-serialno-byte)) - jumptable-word)))) + jumptable-word))) + #+64-bit + (let ((base (sap+ (int-sap (get-lisp-obj-address code-obj)) (- sb-vm:other-pointer-lowtag))) + (physical-nwords ; upper 4 bytes of the header word + (ash (get-header-data code-obj) -24))) + (setf (sap-ref-32 base (+ (ash sb-vm:code-boxed-size-slot sb-vm:word-shift) + #+little-endian 4)) + n-fdefns) + (when (/= physical-nwords expected-nwords) + ;; Oversized allocation must be exactly 2 words more than requested + (aver (= (- physical-nwords 2) expected-nwords)) + ;; Point just beyond the trailer word (physically and where it should be) + (let* ((new-trailer (sap+ base (ash physical-nwords sb-vm:word-shift))) + (old-trailer (sap+ base (ash (- physical-nwords 2) sb-vm:word-shift))) + (trailer-length (sap-ref-16 old-trailer -2)) ; in bytes + (trailer-nelements (floor trailer-length 4))) + ;; this is a memmove() and memset() + (dotimes (i trailer-nelements) + ;; Transfer 4 bytes per element (uint32_t), highest address first + ;; since we're moving upward in memory. + (let ((offset (* (1+ i) -4))) + (setf (sap-ref-32 new-trailer offset) (sap-ref-32 old-trailer offset) ))) + ;; Zeroize at most 4 elements in the "old" trailer. These will be the + ;; items at the lowest addresses (the highest indices in negative order). + ;; If there are fewer than 4 elements, then only zeroize that many. + (loop for offset from (* trailer-nelements -4) by 4 + repeat (min trailer-nelements 4) + do (setf (sap-ref-32 old-trailer offset) 0)) + ;; Increase the trailer length by 2 lispwords + (incf (sap-ref-16 new-trailer -2) (* 2 sb-vm:n-word-bytes))))) + ;; Enforce that the final unboxed data word is published to memory + ;; before the debug-info is set. + (sb-thread:barrier (:write))) #+darwin-jit (defun assign-code-constants (code data) @@ -261,14 +296,15 @@ (type index length) (list fixup-notes) (type core-object object)) - (let* ((debug-info (debug-info-for-component component)) + (binding* + ((debug-info (debug-info-for-component component)) (2comp (component-info component)) (constants (ir2-component-constants 2comp)) - (nboxed (align-up (length constants) code-boxed-words-align)) + (n-boxed-words (length constants)) (boxed-data ;; <header, boxed_size, debug_info, fixups> are absent from the simple-vector - #+darwin-jit - (make-array (- nboxed sb-vm:code-constants-offset) :initial-element 0)) + (or #+darwin-jit + (make-array (- n-boxed-words sb-vm:code-constants-offset) :initial-element 0))) (const-patch-start-index (+ sb-vm:code-constants-offset (* (length (ir2-component-entries 2comp)) sb-vm:code-slots-per-simple-fun))) @@ -279,22 +315,23 @@ ;; does not deal with untagged pointers when looking for old->young. (do ((count 0) (index const-patch-start-index (1+ index))) - ((>= index (length constants)) count) - (let* ((const (aref constants index)) - (kind (if (listp const) (car const) const))) - (case kind - ((member :named-call :fdefinition) - (setf (second const) (find-or-create-fdefn (second const))) - (when (eq kind :named-call) (incf count))))))) - (code-obj (allocate-code-object (component-mem-space component) - nboxed length)) + ((>= index n-boxed-words) count) + (let ((const (aref constants index))) + (when (and (listp const) (case (car const) + (:named-call (incf count)) + (:fdefinition t))) + (setf (second const) (find-or-create-fdefn (second const))))))) + ((code-obj total-nwords) + (allocate-code-object (component-mem-space component) + (align-up n-boxed-words code-boxed-words-align) + length)) (bytes (the (simple-array assembly-unit 1) (segment-contents-as-vector segment))) (n-simple-funs (length (ir2-component-entries 2comp))) - (named-call-fixups)) - (declare (ignorable n-named-calls boxed-data)) - (sb-fasl::with-writable-code-instructions (code-obj debug-info - n-named-calls n-simple-funs) + (named-call-fixups nil)) + (declare (ignorable boxed-data)) + (sb-fasl::with-writable-code-instructions + (code-obj total-nwords debug-info n-named-calls n-simple-funs) :copy (%byte-blt bytes 0 (code-instructions code-obj) 0 (length bytes)) :fixup (setq named-call-fixups (apply-core-fixups code-obj fixup-notes))) @@ -334,7 +371,7 @@ (setf (gethash entry-info (core-object-entry-table object)) fun)))) (do ((index const-patch-start-index (1+ index))) - ((>= index (length constants))) + ((>= index n-boxed-words)) (let* ((const (aref constants index)) (kind (if (listp const) (car const) const))) (set-boxed-word diff --git a/src/runtime/code.h b/src/runtime/code.h index 8dfee4619d..fc90d8a221 100644 --- a/src/runtime/code.h +++ b/src/runtime/code.h @@ -65,7 +65,7 @@ static inline unsigned short code_n_funs(struct code* code) { // Do not attempt to read the fun table size from a code object with no trailer. // If there is a nonzero trailer length, assume it is at least enough to store // the length of the fun table. - return !code_trailer_len(code) ? 0 : *(unsigned short*)code_fun_table(code) >> 4; + return !code_trailer_len(code) ? 0 : *(unsigned short*)code_fun_table(code) >> 5; } static inline char* code_text_start(struct code* code) { From 27d56363fcc8d00efa7fec3feb04e320032c8fe7 Mon Sep 17 00:00:00 2001 From: Marco Heisig <marco.heisig@fau.de> Date: Sun, 19 Jun 2022 16:20:21 +0200 Subject: [PATCH 3556/4023] Contribs can now be disabled individually with --without-CONTRIB. This mechanism allows developers to selectively disable the build of certain contribs. Each --without-CONTRIB flag supplied to make.sh ends up in the CONTRIB_BLOCKLIST variable that is part of the build configuration. Each contrib that is mentioned in that blocklist is neither built nor tested. I hope this mechanism makes the enormous compile times of my sb-simd contrib a bit more tolerable :) --- contrib/Makefile | 15 +++++++++++---- make-config.sh | 12 ++++++++++++ make-target-contrib.sh | 22 ++++++++++++++++++---- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/contrib/Makefile b/contrib/Makefile index 578ab206b6..ad11703ff9 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -1,9 +1,16 @@ vpath %.fasl ../obj/sbcl-home/contrib/ -all: asdf.fasl sb-posix.fasl sb-bsd-sockets.fasl sb-introspect.fasl sb-cltl2.fasl \ - sb-aclrepl.fasl sb-sprof.fasl sb-capstone.fasl sb-md5.fasl sb-capstone.fasl \ - sb-executable.fasl sb-gmp.fasl sb-mpfr.fasl sb-queue.fasl sb-rotate-byte.fasl \ - sb-simple-streams.fasl sb-concurrency.fasl sb-cover.fasl sb-graph.fasl +contribs = asdf sb-posix sb-bsd-sockets sb-introspect sb-cltl2 sb-aclrepl \ + sb-sprof sb-capstone sb-md5 sb-capstone sb-executable sb-gmp sb-mpfr \ + sb-queue sb-rotate-byte sb-simple-streams sb-concurrency sb-cover \ + sb-graph + +active_contribs = $(filter-out $(CONTRIB_BLOCKLIST),$(contribs)) + +fasls = $(active_contribs:=.fasl) + +all: $(fasls) + asdf.fasl: sh ./build-contrib $(basename $(@F)) sb-grovel.fasl: asdf.fasl diff --git a/make-config.sh b/make-config.sh index 66f41a1b0e..6149ce2b2f 100755 --- a/make-config.sh +++ b/make-config.sh @@ -37,6 +37,13 @@ bad_option() { WITH_FEATURES="" WITHOUT_FEATURES="" FANCY_FEATURES=":sb-core-compression :sb-xref-for-internals :sb-after-xc-core" +CONTRIBS="" +for dir in `cd contrib ; echo *`; do + if [ -d "contrib/$dir" -a -f "contrib/$dir/Makefile" ]; then + CONTRIBS="$CONTRIBS ${dir}" + fi +done +CONTRIB_BLOCKLIST="" perform_host_lisp_check=no fancy=false @@ -88,6 +95,10 @@ do ;; --without) WITHOUT_FEATURES="$WITHOUT_FEATURES :$optarg" + case $CONTRIBS + in *"$optarg"*) + CONTRIB_BLOCKLIST="$CONTRIB_BLOCKLIST $optarg" + ;; esac ;; --fancy) WITH_FEATURES="$WITH_FEATURES $FANCY_FEATURES" @@ -260,6 +271,7 @@ find_gnumake echo "GNUMAKE=\"$GNUMAKE\"; export GNUMAKE" >> output/build-config echo "SBCL_XC_HOST=\"$SBCL_XC_HOST\"; export SBCL_XC_HOST" >> output/build-config +echo "CONTRIB_BLOCKLIST=\"$CONTRIB_BLOCKLIST\"; export CONTRIB_BLOCKLIST" >> output/build-config if [ -n "$SBCL_HOST_LOCATION" ]; then echo "SBCL_HOST_LOCATION=\"$SBCL_HOST_LOCATION\"; export SBCL_HOST_LOCATION" >> output/build-config fi diff --git a/make-target-contrib.sh b/make-target-contrib.sh index f0e9ec07a2..c69a6e8f3c 100755 --- a/make-target-contrib.sh +++ b/make-target-contrib.sh @@ -90,17 +90,31 @@ EOF done if [ -z "$*" ]; then - contribs_to_build="`cd ./contrib ; echo *`" + contrib_candidates="`cd ./contrib ; echo *`" else - contribs_to_build="$*" + contrib_candidates=="$*" fi +# Filter out candidates that are not actually contribs and skip those that +# have been blocked explicitly with a --without-CONTRIB argument to +# make.sh. +contrib_dirs="" +for candidate in $contrib_candidates +do + if [ -d "contrib/$candidate" -a -f "contrib/$candidate/Makefile" ]; then + case $CONTRIB_BLOCKLIST in + *"$candidate"*) ;; + *) contrib_dirs="$contrib_dirs $candidate" ;; + esac + fi +done + # Sometimes people used to see the "No tests failed." output from the last # DEFTEST in contrib self-tests and think that's all that is. So... HEADER_HAS_BEEN_PRINTED=false -for dir in $contribs_to_build +for dir in $contrib_dirs do - if [ -d "contrib/$dir" -a -f "contrib/$dir/Makefile" -a ! -f "obj/asdf-cache/$dir/test-passed.test-report" ]; then + if [ ! -f "obj/asdf-cache/$dir/test-passed.test-report" ]; then if $HEADER_HAS_BEEN_PRINTED; then echo > /dev/null else From 724690647ba5011f98afbea6243eb95627a0663e Mon Sep 17 00:00:00 2001 From: Marco Heisig <marco.heisig@fau.de> Date: Tue, 21 Jun 2022 07:53:01 +0200 Subject: [PATCH 3557/4023] Merge sb-simd. This commit contains the sb-simd contrib in its most recent form. The original sb-simd repository will be archived, and development of sb-simd will now be a part of the regular SBCL development. Thanks for everyone who made this work possible! --- contrib/Makefile | 4 +- contrib/sb-simd/CREDITS | 8 + contrib/sb-simd/Makefile | 2 + contrib/sb-simd/code/constants.lisp | 50 + contrib/sb-simd/code/cpu-identification.lisp | 72 + contrib/sb-simd/code/define-arefs.lisp | 179 ++ contrib/sb-simd/code/define-associatives.lisp | 58 + contrib/sb-simd/code/define-comparisons.lisp | 47 + contrib/sb-simd/code/define-custom-vops.lisp | 167 ++ contrib/sb-simd/code/define-fake-vops.lisp | 1718 ++++++++++++++ contrib/sb-simd/code/define-ifs.lisp | 28 + .../sb-simd/code/define-instruction-vops.lisp | 181 ++ contrib/sb-simd/code/define-instructions.lisp | 30 + .../sb-simd/code/define-modify-macros.lisp | 142 ++ contrib/sb-simd/code/define-reducers.lisp | 37 + contrib/sb-simd/code/define-reffers.lisp | 44 + contrib/sb-simd/code/define-rounders.lisp | 75 + contrib/sb-simd/code/define-scalar-casts.lisp | 78 + contrib/sb-simd/code/define-simd-casts.lisp | 92 + contrib/sb-simd/code/define-types.lisp | 10 + contrib/sb-simd/code/define-unequals.lisp | 46 + .../sb-simd/code/define-vop-functions.lisp | 68 + contrib/sb-simd/code/define-vref-vops.lisp | 97 + contrib/sb-simd/code/define-vrefs.lisp | 44 + .../sb-simd/code/instruction-set-case.lisp | 106 + contrib/sb-simd/code/instruction-set.lisp | 152 ++ .../sb-simd/code/instruction-sets/avx.lisp | 911 ++++++++ .../sb-simd/code/instruction-sets/avx2.lisp | 523 +++++ .../sb-simd/code/instruction-sets/fma.lisp | 38 + .../code/instruction-sets/sb-simd.lisp | 391 ++++ .../sb-simd/code/instruction-sets/sse.lisp | 105 + .../sb-simd/code/instruction-sets/sse2.lisp | 459 ++++ .../sb-simd/code/instruction-sets/sse3.lisp | 11 + .../sb-simd/code/instruction-sets/sse4-1.lisp | 125 ++ .../sb-simd/code/instruction-sets/sse4-2.lisp | 26 + .../sb-simd/code/instruction-sets/ssse3.lisp | 31 + .../sb-simd/code/instruction-sets/x86-64.lisp | 13 + contrib/sb-simd/code/missing-instruction.lisp | 35 + contrib/sb-simd/code/packages.lisp | 1985 +++++++++++++++++ contrib/sb-simd/code/printable.lisp | 24 + contrib/sb-simd/code/record.lisp | 1025 +++++++++ contrib/sb-simd/code/sb-simd.asd | 50 + contrib/sb-simd/code/utilities.lisp | 106 + contrib/sb-simd/examples/benchmarks.lisp | 281 +++ contrib/sb-simd/examples/simd-dot.lisp | 20 + contrib/sb-simd/examples/simd-sum.lisp | 15 + contrib/sb-simd/sb-simd.texinfo | 230 ++ contrib/sb-simd/test-suite/numbers.lisp | 28 + contrib/sb-simd/test-suite/packages.lisp | 15 + .../sb-simd/test-suite/sb-simd-test-suite.asd | 21 + contrib/sb-simd/test-suite/test-arefs.lisp | 92 + .../test-suite/test-hairy-simd-functions.lisp | 9 + .../test-suite/test-horizontal-functions.lisp | 76 + contrib/sb-simd/test-suite/test-packages.lisp | 16 + .../test-simple-simd-functions.lisp | 543 +++++ contrib/sb-simd/test-suite/test-suite.lisp | 157 ++ contrib/sb-simd/test-suite/utilities.lisp | 174 ++ doc/manual/contrib-modules.texinfo | 4 +- make-config.sh | 8 +- 59 files changed, 11079 insertions(+), 3 deletions(-) create mode 100644 contrib/sb-simd/CREDITS create mode 100644 contrib/sb-simd/Makefile create mode 100644 contrib/sb-simd/code/constants.lisp create mode 100644 contrib/sb-simd/code/cpu-identification.lisp create mode 100644 contrib/sb-simd/code/define-arefs.lisp create mode 100644 contrib/sb-simd/code/define-associatives.lisp create mode 100644 contrib/sb-simd/code/define-comparisons.lisp create mode 100644 contrib/sb-simd/code/define-custom-vops.lisp create mode 100644 contrib/sb-simd/code/define-fake-vops.lisp create mode 100644 contrib/sb-simd/code/define-ifs.lisp create mode 100644 contrib/sb-simd/code/define-instruction-vops.lisp create mode 100644 contrib/sb-simd/code/define-instructions.lisp create mode 100644 contrib/sb-simd/code/define-modify-macros.lisp create mode 100644 contrib/sb-simd/code/define-reducers.lisp create mode 100644 contrib/sb-simd/code/define-reffers.lisp create mode 100644 contrib/sb-simd/code/define-rounders.lisp create mode 100644 contrib/sb-simd/code/define-scalar-casts.lisp create mode 100644 contrib/sb-simd/code/define-simd-casts.lisp create mode 100644 contrib/sb-simd/code/define-types.lisp create mode 100644 contrib/sb-simd/code/define-unequals.lisp create mode 100644 contrib/sb-simd/code/define-vop-functions.lisp create mode 100644 contrib/sb-simd/code/define-vref-vops.lisp create mode 100644 contrib/sb-simd/code/define-vrefs.lisp create mode 100644 contrib/sb-simd/code/instruction-set-case.lisp create mode 100644 contrib/sb-simd/code/instruction-set.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/avx.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/avx2.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/fma.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/sb-simd.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/sse.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/sse2.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/sse3.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/sse4-1.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/sse4-2.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/ssse3.lisp create mode 100644 contrib/sb-simd/code/instruction-sets/x86-64.lisp create mode 100644 contrib/sb-simd/code/missing-instruction.lisp create mode 100644 contrib/sb-simd/code/packages.lisp create mode 100644 contrib/sb-simd/code/printable.lisp create mode 100644 contrib/sb-simd/code/record.lisp create mode 100644 contrib/sb-simd/code/sb-simd.asd create mode 100644 contrib/sb-simd/code/utilities.lisp create mode 100755 contrib/sb-simd/examples/benchmarks.lisp create mode 100644 contrib/sb-simd/examples/simd-dot.lisp create mode 100755 contrib/sb-simd/examples/simd-sum.lisp create mode 100644 contrib/sb-simd/sb-simd.texinfo create mode 100644 contrib/sb-simd/test-suite/numbers.lisp create mode 100644 contrib/sb-simd/test-suite/packages.lisp create mode 100644 contrib/sb-simd/test-suite/sb-simd-test-suite.asd create mode 100644 contrib/sb-simd/test-suite/test-arefs.lisp create mode 100644 contrib/sb-simd/test-suite/test-hairy-simd-functions.lisp create mode 100644 contrib/sb-simd/test-suite/test-horizontal-functions.lisp create mode 100644 contrib/sb-simd/test-suite/test-packages.lisp create mode 100644 contrib/sb-simd/test-suite/test-simple-simd-functions.lisp create mode 100644 contrib/sb-simd/test-suite/test-suite.lisp create mode 100644 contrib/sb-simd/test-suite/utilities.lisp diff --git a/contrib/Makefile b/contrib/Makefile index ad11703ff9..c189c9705c 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -3,7 +3,7 @@ vpath %.fasl ../obj/sbcl-home/contrib/ contribs = asdf sb-posix sb-bsd-sockets sb-introspect sb-cltl2 sb-aclrepl \ sb-sprof sb-capstone sb-md5 sb-capstone sb-executable sb-gmp sb-mpfr \ sb-queue sb-rotate-byte sb-simple-streams sb-concurrency sb-cover \ - sb-graph + sb-graph sb-simd active_contribs = $(filter-out $(CONTRIB_BLOCKLIST),$(contribs)) @@ -51,3 +51,5 @@ sb-simple-streams.fasl: asdf.fasl sb-posix.fasl sb-bsd-sockets.fasl sb-rt.fasl sh ./build-contrib $(basename $(@F)) sb-graph.fasl: asdf.fasl sb-rt.fasl sh ./build-contrib $(basename $(@F)) +sb-simd.fasl: asdf.fasl + sh ./build-contrib $(basename $(@F)) diff --git a/contrib/sb-simd/CREDITS b/contrib/sb-simd/CREDITS new file mode 100644 index 0000000000..f6a7a451d5 --- /dev/null +++ b/contrib/sb-simd/CREDITS @@ -0,0 +1,8 @@ +sb-simd was developed by: + +Marco Heisig +Bela Pecsek +Tomas Wain +Stas Boukarev + +The detailed project history is archived at github.com/marcoheisig/sb-simd diff --git a/contrib/sb-simd/Makefile b/contrib/sb-simd/Makefile new file mode 100644 index 0000000000..96ad88feb5 --- /dev/null +++ b/contrib/sb-simd/Makefile @@ -0,0 +1,2 @@ +SYSTEM=sb-simd +include ../asdf-module.mk diff --git a/contrib/sb-simd/code/constants.lisp b/contrib/sb-simd/code/constants.lisp new file mode 100644 index 0000000000..6027fe53e9 --- /dev/null +++ b/contrib/sb-simd/code/constants.lisp @@ -0,0 +1,50 @@ +(in-package #:sb-simd-internals) + +(defconstant most-positive-f32 most-positive-single-float) +(defconstant most-negative-f32 most-negative-single-float) +(defconstant most-positive-f64 most-positive-double-float) +(defconstant most-negative-f64 most-negative-double-float) + +(defconstant most-positive-u1 (1- (expt 2 1))) +(defconstant most-positive-u2 (1- (expt 2 2))) +(defconstant most-positive-u4 (1- (expt 2 4))) +(defconstant most-positive-u8 (1- (expt 2 8))) +(defconstant most-positive-u16 (1- (expt 2 16))) +(defconstant most-positive-u32 (1- (expt 2 32))) +(defconstant most-positive-u64 (1- (expt 2 64))) + +(defconstant +u8-true+ most-positive-u8) +(defconstant +u16-true+ most-positive-u16) +(defconstant +u32-true+ most-positive-u32) +(defconstant +u64-true+ most-positive-u64) + +(defconstant +u8-false+ 0) +(defconstant +u16-false+ 0) +(defconstant +u32-false+ 0) +(defconstant +u64-false+ 0) + +(defconstant most-positive-s8 (1- (expt 2 (1- 8)))) +(defconstant most-positive-s16 (1- (expt 2 (1- 16)))) +(defconstant most-positive-s32 (1- (expt 2 (1- 32)))) +(defconstant most-positive-s64 (1- (expt 2 (1- 64)))) + +(defconstant most-negative-s8 (- (expt 2 (1- 8)))) +(defconstant most-negative-s16 (- (expt 2 (1- 16)))) +(defconstant most-negative-s32 (- (expt 2 (1- 32)))) +(defconstant most-negative-s64 (- (expt 2 (1- 64)))) + +(defconstant +s8-true+ -1) +(defconstant +s16-true+ -1) +(defconstant +s32-true+ -1) +(defconstant +s64-true+ -1) + +(defconstant +s8-false+ 0) +(defconstant +s16-false+ 0) +(defconstant +s32-false+ 0) +(defconstant +s64-false+ 0) + +(defconstant +f32-true+ (sb-kernel:make-single-float +s32-true+)) +(defconstant +f64-true+ (sb-kernel:make-double-float +s32-true+ +u32-true+)) + +(defconstant +f32-false+ (sb-kernel:make-single-float +s32-false+)) +(defconstant +f64-false+ (sb-kernel:make-double-float +s32-false+ +u32-false+)) diff --git a/contrib/sb-simd/code/cpu-identification.lisp b/contrib/sb-simd/code/cpu-identification.lisp new file mode 100644 index 0000000000..2981f29f5e --- /dev/null +++ b/contrib/sb-simd/code/cpu-identification.lisp @@ -0,0 +1,72 @@ +(in-package #:sb-simd-internals) + +#+x86-64 +(progn + (defun cpuid (eax &optional (ecx 0)) + (declare (type (unsigned-byte 32) eax ecx)) + (sb-vm::%cpu-identification eax ecx)) + + (defun sse-supported-p () + (and (>= (cpuid 0) 1) + (logbitp 25 (nth-value 3 (cpuid 1))))) + + (defun sse2-supported-p () + (and (>= (cpuid 0) 1) + (logbitp 26 (nth-value 3 (cpuid 1))))) + + (defun sse3-supported-p () + (and (>= (cpuid 0) 1) + (logbitp 0 (nth-value 2 (cpuid 1))))) + + (defun ssse3-supported-p () + (and (>= (cpuid 0) 1) + (logbitp 9 (nth-value 2 (cpuid 1))))) + + (defun sse4.1-supported-p () + (and (>= (cpuid 0) 1) + (logbitp 19 (nth-value 2 (cpuid 1))))) + + (defun sse4.2-supported-p () + (and (>= (cpuid 0) 1) + (logbitp 20 (nth-value 2 (cpuid 1))))) + + (defun avx-supported-p () + (and (>= (cpuid 0) 1) + (logbitp 28 (nth-value 2 (cpuid 1))))) + + (defun avx2-supported-p () + (and (>= (cpuid 0) 7) + (logbitp 5 (nth-value 1 (cpuid 7))))) + + (defun fma-supported-p () + (and (>= (cpuid 0) 1) + (logbitp 12 (nth-value 2 (cpuid 1)))))) + +#-x86-64 +(progn + (defun sse-supported-p () + nil) + + (defun sse2-supported-p () + nil) + + (defun sse3-supported-p () + nil) + + (defun ssse3-supported-p () + nil) + + (defun sse4.1-supported-p () + nil) + + (defun sse4.2-supported-p () + nil) + + (defun avx-supported-p () + nil) + + (defun avx2-supported-p () + nil) + + (defun fma-supported-p () + nil)) diff --git a/contrib/sb-simd/code/define-arefs.lisp b/contrib/sb-simd/code/define-arefs.lisp new file mode 100644 index 0000000000..4cf42304be --- /dev/null +++ b/contrib/sb-simd/code/define-arefs.lisp @@ -0,0 +1,179 @@ +(in-package #:sb-simd-internals) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Auxiliary Functions and Macros + +(declaim (notinline wrong-number-of-subscripts)) +(defun wrong-number-of-subscripts (array number-of-subscripts) + (error "Wrong number of subcripts, ~S, for an array of rank ~S." + number-of-subscripts + (array-rank array))) + +(declaim (notinline invalid-subscript)) +(defun invalid-subscript (subscript array axis limit) + (declare (ignore array)) + (error "Invalid array subscript ~S for axis ~S, ~ + should be a non-negative integer below ~S." + subscript axis limit)) + +;; This function doesn't have to be particularly fast, because all index +;; computations where the number of subscripts is known at compile time are +;; expanded by compiler macros and WITH-ROW-MAJOR-SIMD-INDEX. The only way +;; to reach this function is when an array indexing function is supplied as +;; the first argument to APPLY or FUNCALL. +(defun array-row-major-simd-index (array simd-width &rest subscripts) + (let ((rank (array-rank array)) + (length (length subscripts))) + (unless (= rank length) + (wrong-number-of-subscripts array length)) + (let ((stride 1) + (index 0)) + (declare (index stride index)) + (loop for axis from (1- rank) downto 0 + for subscript = (nth axis subscripts) + for dimension = (array-dimension array axis) + for width = simd-width then 1 do + (unless (<= -1 subscript (- dimension width)) + (invalid-subscript subscript array axis (1+ (- dimension width)))) + (incf index (* stride subscript)) + (setf stride (* stride dimension))) + index))) + +(defmacro with-row-major-simd-index + ((index array simd-width &rest indices) &body body &environment env) + (check-type index symbol) + (check-type array symbol) + (check-type simd-width (integer 1)) + (dolist (index indices) + (check-type index symbol)) + (let* ((length (length indices)) + (rank-binding `(,(gensym "RANK") (array-rank ,array))) + (rank (first rank-binding)) + (dimension-bindings + (loop for axis below length + collect `(,(gensym "DIMENSION") (array-dimension ,array ,axis)))) + (dimensions (mapcar #'first dimension-bindings)) + (stride-bindings + (loop for axis from (- length 2) downto 0 + for old-stride = nil then new-stride + for new-stride = (gensym "STRIDE") + for stride-binding = `(,new-stride ,(nth axis dimensions)) + then `(,new-stride (index* ,(nth axis dimensions) ,old-stride)) + collect stride-binding)) + (strides (reverse (mapcar #'first stride-bindings))) + (index-form + `(index+ + ,@(loop for stride in strides + for index in indices + collect `(index* ,stride ,index)) + ,(first (last indices))))) + `(let (,rank-binding) + (unless (= ,rank ,length) + (wrong-number-of-subscripts ,array ,length)) + (let (,@dimension-bindings) + (declare (ignorable ,@dimensions)) + ,@(when (sb-c:policy env (plusp sb-c::insert-array-bounds-checks)) + (loop for axis from 0 + for dimension in dimensions + for index in indices + for limit = (if (= axis (1- length)) `(- ,dimension ,(1- simd-width)) dimension) + collect `(unless (< -1 ,index ,limit) + (invalid-subscript ,index ,array ,axis ,limit)))) + (let* (,@stride-bindings) + (let ((,index ,index-form)) + ,@body)))))) + +(defun setf-row-major-aref (v a i) + (setf (row-major-aref a i) v)) + +(define-compiler-macro setf-row-major-aref (v a i) + (let* ((v-binding `(,(gensym "VALUE") ,v)) + (v (first v-binding))) + `(let (,v-binding) + (setf (row-major-aref ,a ,i) ,v)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Array Load and Store Instructions + +(macrolet + ((define-aref (load-record-name) + (with-accessors ((load load-record-name) + (aref load-record-aref) + (row-major-aref load-record-row-major-aref) + (value-record load-record-value-record) + (vector-record load-record-vector-record)) + (find-function-record load-record-name) + (let ((simd-width (value-record-simd-width value-record)) + (element-type + (second + (value-record-type vector-record)))) + `(progn + (define-inline ,row-major-aref (array index) + (declare (type (array ,element-type) array) + (index index)) + (,load array index)) + (defun ,aref (array &rest indices) + (declare (type (array ,element-type) array)) + (,load + array + (apply #'array-row-major-simd-index array ,simd-width indices))) + (define-compiler-macro ,aref (array &rest indices) + (let* ((index (gensym "INDEX")) + (array-binding `(,(gensym "ARRAY") ,array)) + (index-bindings + (loop for index-form in indices + collect `(,(gensym "INDEX") ,index-form))) + (array (first array-binding)) + (indices (mapcar #'first index-bindings))) + `(let (,array-binding ,@index-bindings) + (declare (type (array ,',element-type) ,array)) + (with-row-major-simd-index (,index ,array ,',simd-width ,@indices) + (,',load ,array ,index))))))))) + (define-setf-aref (store-record-name) + (with-accessors ((store store-record-name) + (aref store-record-aref) + (row-major-aref store-record-row-major-aref) + (value-record store-record-value-record) + (vector-record store-record-vector-record)) + (find-function-record store-record-name) + (let ((value-type (value-record-name value-record)) + (simd-width (value-record-simd-width value-record)) + (element-type + (second + (value-record-type vector-record)))) + `(progn + (define-inline (setf ,row-major-aref) (value array index) + (declare (type (array ,element-type) array) + (index index)) + (,store (,value-type value) array index)) + (defun (setf ,aref) (value array &rest indices) + (declare (type (array ,element-type) array)) + (,store + (,value-type value) + array + (apply #'array-row-major-simd-index array ,simd-width indices))) + (define-compiler-macro (setf ,aref) (value array &rest indices) + (let* ((value-binding `(,(gensym "VALUE") ,value)) + (array-binding `(,(gensym "ARRAY") ,array)) + (index-bindings + (loop for index-form in indices + collect `(,(gensym "INDEX") ,index-form))) + (indices (mapcar #'first index-bindings)) + (value (first value-binding)) + (array (first array-binding)) + (index (gensym "INDEX"))) + `(let (,value-binding ,array-binding ,@index-bindings) + (declare (type (array ,',element-type) ,array)) + (with-row-major-simd-index (,index ,array ,',simd-width ,@indices) + (,',store (,',value-type ,value) ,array ,index))))))))) + (define-arefs () + `(progn + ,@(loop for load-record in (filter-function-records #'load-record-p) + for name = (load-record-name load-record) + collect `(define-aref ,name)) + ,@(loop for store-record in (filter-function-records #'store-record-p) + for name = (store-record-name store-record) + collect `(define-setf-aref ,name))))) + (define-arefs)) diff --git a/contrib/sb-simd/code/define-associatives.lisp b/contrib/sb-simd/code/define-associatives.lisp new file mode 100644 index 0000000000..48825e8945 --- /dev/null +++ b/contrib/sb-simd/code/define-associatives.lisp @@ -0,0 +1,58 @@ +(in-package #:sb-simd-internals) + +(macrolet + ((define-associative (associative-record-name) + (with-accessors ((name associative-record-name) + (binary-operation associative-record-binary-operation) + (identity-element associative-record-identity-element)) + (find-function-record associative-record-name) + (with-accessors ((binary-operation instruction-record-name) + (result-records instruction-record-result-records) + (argument-records instruction-record-argument-records) + (associative instruction-record-associative)) binary-operation + (assert associative) + (destructuring-bind ((value-record) (arg1-record arg2-record)) + (list result-records argument-records) + (assert (eq value-record arg1-record)) + (assert (eq value-record arg2-record)) + (let ((type (value-record-name value-record))) + (if (not identity-element) + `(progn + (defun ,name (arg &rest more-args) + (let ((result (,type arg))) + (declare (,type result)) + (loop for arg in more-args + do (setf result (,binary-operation result (,type arg)))) + result)) + (define-compiler-macro ,name (&whole whole &rest args) + (let ((n (length args))) + (case n + (0 whole) + (1 `(,',type ,(first args))) + (otherwise + `(,',binary-operation + (,',name ,@(subseq args 0 (floor n 2))) + (,',name ,@(subseq args (floor n 2))))))))) + `(progn + (defun ,name (&rest args) + (if (null args) + (,type ,identity-element) + (let ((result (,type (first args)))) + (declare (,type result)) + (loop for arg in (rest args) + do (setf result (,binary-operation result (,type arg)))) + result))) + (define-compiler-macro ,name (&rest args) + (let ((n (length args))) + (case n + (0 `(,',type ,,identity-element)) + (1 `(,',type ,(first args))) + (otherwise + `(,',binary-operation + (,',name ,@(subseq args 0 (floor n 2))) + (,',name ,@(subseq args (floor n 2))))))))))))))) + (define-associatives () + `(progn + ,@(loop for associative-record in (filter-function-records #'associative-record-p) + collect `(define-associative ,(associative-record-name associative-record)))))) + (define-associatives)) diff --git a/contrib/sb-simd/code/define-comparisons.lisp b/contrib/sb-simd/code/define-comparisons.lisp new file mode 100644 index 0000000000..58b336bc1c --- /dev/null +++ b/contrib/sb-simd/code/define-comparisons.lisp @@ -0,0 +1,47 @@ +(in-package #:sb-simd-internals) + +(macrolet + ((define-comparison (comparision-record-name) + (with-accessors ((name comparison-record-name) + (cmp comparison-record-cmp) + (and comparison-record-and) + (truth comparison-record-truth)) + (find-function-record comparision-record-name) + (with-accessors ((cmp instruction-record-name) + (result-records instruction-record-result-records) + (argument-records instruction-record-argument-records)) cmp + (destructuring-bind ((result-record) (argument-record other-argument-record)) + (list result-records argument-records) + (assert (eq argument-record other-argument-record)) + (let ((and (function-record-name and)) + (result-type (value-record-name result-record)) + (argument-type (value-record-name argument-record))) + `(progn + (defun ,name (arg &rest more-args) + (if (null more-args) + (progn (,argument-type arg) (,result-type ,truth)) + (let* ((a (,argument-type arg)) + (b (,argument-type (first more-args))) + (result (,cmp a b))) + (declare (,argument-type a b) + (,result-type result)) + (loop for elt in (rest more-args) + do (shiftf a b (,argument-type elt)) + do (setf result (,and result (,cmp a b)))) + result))) + (define-compiler-macro ,name (arg &rest more-args) + (if (null more-args) + `(progn (,',argument-type ,arg) (,',result-type ,',truth)) + (let ((bindings + (loop for arg in (list* arg more-args) + collect + (list (gensym "ARG") (list ',argument-type arg))))) + `(let ,bindings + (,',and ,@(loop for ((a nil) (b nil) . rest) on bindings + collect `(,',cmp ,a ,b) + until (null rest))))))))))))) + (define-comparisons () + `(progn + ,@(loop for comparison-record in (filter-function-records #'comparison-record-p) + collect `(define-comparison ,(comparison-record-name comparison-record)))))) + (define-comparisons)) diff --git a/contrib/sb-simd/code/define-custom-vops.lisp b/contrib/sb-simd/code/define-custom-vops.lisp new file mode 100644 index 0000000000..0fd034ebd7 --- /dev/null +++ b/contrib/sb-simd/code/define-custom-vops.lisp @@ -0,0 +1,167 @@ +(in-package #:sb-vm) + +(macrolet + ((define-custom-vop (name &body clauses) + (with-accessors ((name sb-simd-internals:instruction-record-name) + (vop sb-simd-internals:instruction-record-vop) + (argument-records sb-simd-internals:instruction-record-argument-records) + (result-records sb-simd-internals:instruction-record-result-records) + (cost sb-simd-internals:instruction-record-cost) + (encoding sb-simd-internals:instruction-record-encoding)) + (sb-simd-internals:find-function-record name) + (assert (eq encoding :custom)) + (labels ((find-clauses (key) + (remove key clauses :test-not #'eq :key #'first)) + (find-clause (key) + (let ((found (find-clauses key))) + (assert (= 1 (length found))) + (rest (first found))))) + `(sb-c:define-vop (,vop) + (:translate ,vop) + (:policy :fast-safe) + (:arg-types ,@(mapcar #'sb-simd-internals:value-record-primitive-type argument-records)) + (:result-types ,@(mapcar #'sb-simd-internals:value-record-primitive-type result-records)) + (:args + ,@(loop for arg in (find-clause :args) + for argument-record in argument-records + collect `(,@arg :scs ,(sb-simd-internals:value-record-scs argument-record)))) + ,@(find-clauses :info) + ,@(find-clauses :temporary) + (:results + ,@(loop for result in (find-clause :results) + for result-record in result-records + collect `(,@result :scs ,(sb-simd-internals:value-record-scs result-record)))) + (:generator ,cost ,@(find-clause :generator))))))) + ;; SSE + (macrolet ((def (name cmp) + `(define-custom-vop ,name + (:args (a :target tmp) (b)) + (:temporary (:sc single-reg :from (:argument 0)) tmp) + (:results (dst)) + (:generator + (unless (location= a tmp) + (inst xorps tmp tmp) + (inst movss tmp a)) + (inst cmpss ,cmp tmp b) + (inst movq dst tmp))))) + (def sb-simd-sse::two-arg-f32= :eq) + (def sb-simd-sse::two-arg-f32/= :neq) + (def sb-simd-sse::two-arg-f32< :lt) + (def sb-simd-sse::two-arg-f32<= :le) + (def sb-simd-sse::two-arg-f32> :nle) + (def sb-simd-sse::two-arg-f32>= :nlt)) + (define-custom-vop sb-simd-sse::f32-from-s64 + (:args (src)) + (:results (dst)) + (:generator + (inst xorps dst dst) + (inst cvtsi2ss dst src))) + (define-custom-vop sb-simd-sse::f32!-from-p128 + (:args (src :target dst)) + (:temporary (:sc single-sse-reg :from (:argument 0)) tmp) + (:results (dst)) + (:generator + (move tmp src) + (inst xorps dst dst) + (inst movss dst tmp))) + ;; SSE2 + (macrolet ((def (name cmp) + `(define-custom-vop ,name + (:args (a :target tmp) (b)) + (:temporary (:sc single-reg :from (:argument 0)) tmp) + (:results (dst)) + (:generator + (unless (location= a tmp) + (inst xorpd tmp tmp) + (inst movsd tmp a)) + (inst cmpsd ,cmp tmp b) + (inst movq dst tmp))))) + (def sb-simd-sse2::two-arg-f64= :eq) + (def sb-simd-sse2::two-arg-f64/= :neq) + (def sb-simd-sse2::two-arg-f64< :lt) + (def sb-simd-sse2::two-arg-f64<= :le) + (def sb-simd-sse2::two-arg-f64> :nle) + (def sb-simd-sse2::two-arg-f64>= :nlt)) + (define-custom-vop sb-simd-sse2::f64-from-s64 + (:args (src)) + (:results (dst)) + (:generator + (inst xorpd dst dst) + (inst cvtsi2sd dst src))) + (define-custom-vop sb-simd-sse2::f64!-from-p128 + (:args (src :target tmp)) + (:temporary (:sc double-sse-reg :from (:argument 0)) tmp) + (:results (dst)) + (:generator + (move tmp src) + (inst xorpd dst dst) + (inst movsd dst tmp))) + ;; AVX + (macrolet ((def (name cmp) + `(define-custom-vop ,name + (:args (a :target tmp) (b)) + (:temporary (:sc single-reg :from (:argument 0)) tmp) + (:results (dst)) + (:generator + (unless (location= a tmp) + (inst vxorps tmp tmp tmp)) + (inst vcmpss ,cmp tmp a b) + (inst vmovq dst tmp))))) + (def sb-simd-avx::two-arg-f32= :eq) + (def sb-simd-avx::two-arg-f32/= :neq) + (def sb-simd-avx::two-arg-f32< :lt) + (def sb-simd-avx::two-arg-f32<= :le) + (def sb-simd-avx::two-arg-f32> :nle) + (def sb-simd-avx::two-arg-f32>= :nlt)) + (macrolet ((def (name cmp) + `(define-custom-vop ,name + (:args (a :target tmp) (b)) + (:temporary (:sc single-reg :from (:argument 0)) tmp) + (:results (dst)) + (:generator + (unless (location= a tmp) + (inst vxorpd tmp tmp tmp)) + (inst vcmpsd ,cmp tmp a b) + (inst vmovq dst tmp))))) + (def sb-simd-avx::two-arg-f64= :eq) + (def sb-simd-avx::two-arg-f64/= :neq) + (def sb-simd-avx::two-arg-f64< :lt) + (def sb-simd-avx::two-arg-f64<= :le) + (def sb-simd-avx::two-arg-f64> :nle) + (def sb-simd-avx::two-arg-f64>= :nlt)) + (define-custom-vop sb-simd-avx::f32-from-s64 + (:args (src :to :save)) + (:results (dst)) + (:generator + (inst vxorpd dst dst dst) + (inst vcvtsi2ss dst dst src))) + (define-custom-vop sb-simd-avx::f64-from-s64 + (:args (src :to :save)) + (:results (dst)) + (:generator + (inst vxorpd dst dst dst) + (inst vcvtsi2sd dst dst src))) + (define-custom-vop sb-simd-avx::f32!-from-p128 + (:args (src :to :save)) + (:results (dst)) + (:generator + (inst vxorps dst dst dst) + (inst movss dst src))) + (define-custom-vop sb-simd-avx::f32!-from-p256 + (:args (src :to :save)) + (:results (dst)) + (:generator + (inst vxorps dst dst dst) + (inst movss dst src))) + (define-custom-vop sb-simd-avx::f64!-from-p128 + (:args (src :to :save)) + (:results (dst)) + (:generator + (inst vxorpd dst dst dst) + (inst movsd dst src))) + (define-custom-vop sb-simd-avx::f64!-from-p256 + (:args (src :to :save)) + (:results (dst)) + (:generator + (inst vxorpd dst dst dst) + (inst movsd dst src)))) diff --git a/contrib/sb-simd/code/define-fake-vops.lisp b/contrib/sb-simd/code/define-fake-vops.lisp new file mode 100644 index 0000000000..4432791c4d --- /dev/null +++ b/contrib/sb-simd/code/define-fake-vops.lisp @@ -0,0 +1,1718 @@ +(in-package #:sb-simd-internals) + +;;; Primitives with a :NONE encoding do not define a VOP. Instead, we +;;; define a fake VOP - a regular function that has the name of the VOP +;;; that would have been generated if the encoding wasn't :NONE. Fake VOPs +;;; are useful for defining instructions that we would like to have in the +;;; instruction set, and that can be expressed easily in terms of the other +;;; VOPs. + +(defmacro define-fake-vop (name lambda-list &body body) + (with-accessors ((vop instruction-record-vop) + (result-records instruction-record-result-records) + (argument-records instruction-record-argument-records) + (instruction-set instruction-record-instruction-set)) + (find-function-record name) + (assert (= (length lambda-list) + (length argument-records))) + (assert (null (intersection lambda-list lambda-list-keywords))) + (when (instruction-set-available-p instruction-set) + `(define-inline ,vop ,lambda-list + (declare (optimize (safety 0) (debug 0))) + (declare + ,@(loop for argument-record in argument-records + for argument in lambda-list + collect `(type ,(value-record-name argument-record) ,argument))) + (the (values ,@(mapcar #'value-record-name result-records) &optional) + (progn ,@body)))))) + +(defmacro define-trivial-fake-vop (name operator &key key result-key) + (let* ((record (find-function-record name)) + (arity (length (instruction-record-argument-records record))) + (args (prefixed-symbols "ARG" arity))) + (assert (= 1 (length (instruction-record-result-records record)))) + (flet ((wrap (key expr) + (if (null key) expr `(,key ,expr)))) + `(define-fake-vop ,name ,args + ,(wrap result-key `(,operator ,@(loop for arg in args collect (wrap key arg)))))))) + +(in-package #:sb-simd) + +(macrolet ((define-u64-packer (name scalar-record-name) + (with-accessors ((type value-record-name) + (bits value-record-bits)) + (find-value-record scalar-record-name) + (let ((args (prefixed-symbols "ARG" (the integer (/ 64 bits))))) + `(define-fake-vop ,name ,args + (logior + ,@(loop for arg in args + for position from 0 by bits + collect `(dpb ,arg (byte ,bits ,position) 0)))))))) + (define-u64-packer u64-from-u8s u8) + (define-u64-packer u64-from-u16s u16) + (define-u64-packer u64-from-u32s u32) + (define-u64-packer u64-from-s8s s8) + (define-u64-packer u64-from-s16s s16) + (define-u64-packer u64-from-s32s s32) + (define-u64-packer u64-from-s64 s64)) + +(macrolet ((define-u64-unpacker (name scalar-record-name) + (with-accessors ((type value-record-name) + (bits value-record-bits)) + (find-value-record scalar-record-name) + `(define-fake-vop ,name (x) + (values + ,@ (loop repeat (/ 64 bits) + for position from 0 by bits + collect + (if (subtypep type 'unsigned-byte) + `(ldb (byte ,bits ,position) x) + `(- (mod (+ (ldb (byte ,bits ,position) x) + ,(expt 2 (1- bits))) + ,(expt 2 bits)) + ,(expt 2 (1- bits)))))))))) + + (define-u64-unpacker u8s-from-u64 u8) + (define-u64-unpacker u16s-from-u64 u16) + (define-u64-unpacker u32s-from-u64 u32) + (define-u64-unpacker s8s-from-u64 s8) + (define-u64-unpacker s16s-from-u64 s16) + (define-u64-unpacker s32s-from-u64 s32) + (define-u64-unpacker s64-from-u64 s64)) + +(macrolet ((define-deboolifier (name true false) + `(define-inline ,name (expr) (if expr ,true ,false)))) + (define-deboolifier u8-from-boolean +u8-true+ +u8-false+) + (define-deboolifier u16-from-boolean +u16-true+ +u16-false+) + (define-deboolifier u32-from-boolean +u32-true+ +u32-false+) + (define-deboolifier u64-from-boolean +u64-true+ +u64-false+)) + +(defun u16-odd-bits (x) + (declare (type (unsigned-byte 16) x)) + (setf x (logand (ash x -1) #x5555)) + (setf x (logand (logior (ash x -1) x) #x3333)) + (setf x (logand (logior (ash x -2) x) #x0F0F)) + (setf x (logand (logior (ash x -4) x) #x00FF)) + x) + +(defun u32-odd-bits (x) + (declare (type (unsigned-byte 32) x)) + (setf x (logand (ash x -1) #x55555555)) + (setf x (logand (logior (ash x -1) x) #x33333333)) + (setf x (logand (logior (ash x -2) x) #x0F0F0F0F)) + (setf x (logand (logior (ash x -4) x) #x00FF00FF)) + (setf x (logand (logior (ash x -8) x) #x0000FFFF)) + x) + +;;; f32 + +(define-fake-vop f32-if (mask a b) + (if (logbitp 31 mask) a b)) + +(macrolet ((def (name op &rest keywords) `(define-trivial-fake-vop ,name ,op ,@keywords))) + (def two-arg-f32-and logand :key sb-kernel:single-float-bits :result-key sb-kernel:make-single-float) + (def two-arg-f32-or logior :key sb-kernel:single-float-bits :result-key sb-kernel:make-single-float) + (def two-arg-f32-xor logxor :key sb-kernel:single-float-bits :result-key sb-kernel:make-single-float) + (def f32-andc1 logandc1 :key sb-kernel:single-float-bits :result-key sb-kernel:make-single-float) + (def f32-not lognot :key sb-kernel:single-float-bits :result-key sb-kernel:make-single-float) + (def two-arg-f32-min min) + (def two-arg-f32-max max) + (def two-arg-f32+ +) + (def two-arg-f32- -) + (def two-arg-f32* *) + (def two-arg-f32/ /) + #+(or) + (def f32-reciprocal reciprocal) + #+(or) + (def f32-rsqrt rsqrt) + (def f32-sqrt sqrt) + (def two-arg-f32= = :result-key u32-from-boolean) + (def two-arg-f32/= /= :result-key u32-from-boolean) + (def two-arg-f32< < :result-key u32-from-boolean) + (def two-arg-f32<= <= :result-key u32-from-boolean) + (def two-arg-f32> > :result-key u32-from-boolean) + (def two-arg-f32>= >= :result-key u32-from-boolean)) + +;;; f64 + +(define-fake-vop f64-if (mask a b) + (if (logbitp 63 mask) a b)) + +(macrolet ((def (name logical-operation) + (let* ((record (find-function-record name)) + (arity (length (instruction-record-argument-records record))) + (args (prefixed-symbols "ARG" arity))) + `(define-fake-vop ,name ,args + (let ((bits + (,logical-operation + ,@(loop for arg in args + collect `(sb-kernel:double-float-bits ,arg))))) + (sb-kernel:make-double-float + (ash bits -32) + (ldb (byte 32 0) bits))))))) + (def two-arg-f64-and logand) + (def two-arg-f64-or logior) + (def two-arg-f64-xor logxor) + (def f64-andc1 logandc1) + (def f64-not lognot)) + +(macrolet ((def (name op &rest keywords) `(define-trivial-fake-vop ,name ,op ,@keywords))) + (def two-arg-f64-min min) + (def two-arg-f64-max max) + (def two-arg-f64+ +) + (def two-arg-f64- -) + (def two-arg-f64* *) + (def two-arg-f64/ /) + #+(or) + (def f64-reciprocal reciprocal) + #+(or) + (def f64-rsqrt rsqrt) + (def f64-sqrt sqrt) + (def two-arg-f64= = :result-key u64-from-boolean) + (def two-arg-f64/= /= :result-key u64-from-boolean) + (def two-arg-f64< < :result-key u64-from-boolean) + (def two-arg-f64<= <= :result-key u64-from-boolean) + (def two-arg-f64> > :result-key u64-from-boolean) + (def two-arg-f64>= >= :result-key u64-from-boolean)) + +;;; integer operations + +;;; In contrast to the floating-point conditional selection operations, +;;; those for integers always operate with byte granularity. +(macrolet ((def (name maskbits) + `(define-fake-vop ,name (mask a b) + (logior + ,@(loop for offset from 0 by 8 below maskbits + collect + `(if (logbitp ,(+ offset 7) mask) + (mask-field (byte 8 ,offset) a) + (mask-field (byte 8 ,offset) b))))))) + (def u8-if 8) + (def u16-if 16) + (def u32-if 32) + (def u64-if 64)) + +(macrolet ((def (name bits u-if) + `(define-fake-vop ,name (mask a b) + (let ((u (,u-if mask (dpb a (byte ,bits 0) 0) (dpb b (byte ,bits 0) 0)))) + (- (mod (+ (ldb (byte ,bits 0) u) ,(expt 2 (1- bits))) + ,(expt 2 bits)) + ,(expt 2 (1- bits))))))) + (def s8-if 8 %u8-if) + (def s16-if 16 %u16-if) + (def s32-if 32 %u32-if) + (def s64-if 64 %u64-if)) + +(macrolet ((def (name bits) + `(define-inline ,name (integer) + (declare (integer integer)) + (mod integer ,(expt 2 bits))))) + (def u8-wrap 8) + (def u16-wrap 16) + (def u32-wrap 32) + (def u64-wrap 64)) + +(macrolet ((def (name bits) + (let ((offset (expt 2 (1- bits)))) + `(define-inline ,name (integer) + (declare (integer integer)) + (- (mod (+ integer ,offset) ,(expt 2 bits)) + ,offset))))) + (def s8-wrap 8) + (def s16-wrap 16) + (def s32-wrap 32) + (def s64-wrap 64)) + +(macrolet ((def (name op &rest keywords) `(define-trivial-fake-vop ,name ,op ,@keywords))) + ;; u8 + (def two-arg-u8-and logand) + (def two-arg-u8-or logior) + (def two-arg-u8-xor logxor) + (def two-arg-u8-max max) + (def two-arg-u8-min min) + (def two-arg-u8+ + :result-key u8-wrap) + (def two-arg-u8- - :result-key u8-wrap) + (def two-arg-u8= = :result-key u8-from-boolean) + (def two-arg-u8/= /= :result-key u8-from-boolean) + (def two-arg-u8< < :result-key u8-from-boolean) + (def two-arg-u8<= <= :result-key u8-from-boolean) + (def two-arg-u8> > :result-key u8-from-boolean) + (def two-arg-u8>= >= :result-key u8-from-boolean) + (def u8-andc1 logandc1) + (def u8-not lognot :result-key u8-wrap) + ;; u16 + (def two-arg-u16-and logand) + (def two-arg-u16-or logior) + (def two-arg-u16-xor logxor) + (def two-arg-u16-max max) + (def two-arg-u16-min min) + (def two-arg-u16+ + :result-key u16-wrap) + (def two-arg-u16- - :result-key u16-wrap) + (def two-arg-u16= = :result-key u16-from-boolean) + (def two-arg-u16/= /= :result-key u16-from-boolean) + (def two-arg-u16< < :result-key u16-from-boolean) + (def two-arg-u16<= <= :result-key u16-from-boolean) + (def two-arg-u16> > :result-key u16-from-boolean) + (def two-arg-u16>= >= :result-key u16-from-boolean) + (def u16-andc1 logandc1) + (def u16-not lognot :result-key u16-wrap) + ;; u32 + (def two-arg-u32-and logand) + (def two-arg-u32-or logior) + (def two-arg-u32-xor logxor) + (def two-arg-u32-max max) + (def two-arg-u32-min min) + (def two-arg-u32+ + :result-key u32-wrap) + (def two-arg-u32- - :result-key u32-wrap) + (def two-arg-u32= = :result-key u32-from-boolean) + (def two-arg-u32/= /= :result-key u32-from-boolean) + (def two-arg-u32< < :result-key u32-from-boolean) + (def two-arg-u32<= <= :result-key u32-from-boolean) + (def two-arg-u32> > :result-key u32-from-boolean) + (def two-arg-u32>= >= :result-key u32-from-boolean) + (def u32-andc1 logandc1) + (def u32-not lognot :result-key u32-wrap) + ;; u64 + (def two-arg-u64-and logand) + (def two-arg-u64-or logior) + (def two-arg-u64-xor logxor) + (def two-arg-u64-max max) + (def two-arg-u64-min min) + (def two-arg-u64+ + :result-key u64-wrap) + (def two-arg-u64- - :result-key u64-wrap) + (def two-arg-u64= = :result-key u64-from-boolean) + (def two-arg-u64/= /= :result-key u64-from-boolean) + (def two-arg-u64< < :result-key u64-from-boolean) + (def two-arg-u64<= <= :result-key u64-from-boolean) + (def two-arg-u64> > :result-key u64-from-boolean) + (def two-arg-u64>= >= :result-key u64-from-boolean) + (def u64-andc1 logandc1) + (def u64-not lognot :result-key u64-wrap) + ;; s8 + (def two-arg-s8-and logand) + (def two-arg-s8-or logior) + (def two-arg-s8-xor logxor) + (def two-arg-s8-max max) + (def two-arg-s8-min min) + (def two-arg-s8+ + :result-key s8-wrap) + (def two-arg-s8- - :result-key s8-wrap) + (def two-arg-s8= = :result-key u8-from-boolean) + (def two-arg-s8/= /= :result-key u8-from-boolean) + (def two-arg-s8< < :result-key u8-from-boolean) + (def two-arg-s8<= <= :result-key u8-from-boolean) + (def two-arg-s8> > :result-key u8-from-boolean) + (def two-arg-s8>= >= :result-key u8-from-boolean) + (def s8-andc1 logandc1) + (def s8-not lognot :result-key s8-wrap) + ;; s16 + (def two-arg-s16-and logand) + (def two-arg-s16-or logior) + (def two-arg-s16-xor logxor) + (def two-arg-s16-max max) + (def two-arg-s16-min min) + (def two-arg-s16+ + :result-key s16-wrap) + (def two-arg-s16- - :result-key s16-wrap) + (def two-arg-s16= = :result-key u16-from-boolean) + (def two-arg-s16/= /= :result-key u16-from-boolean) + (def two-arg-s16< < :result-key u16-from-boolean) + (def two-arg-s16<= <= :result-key u16-from-boolean) + (def two-arg-s16> > :result-key u16-from-boolean) + (def two-arg-s16>= >= :result-key u16-from-boolean) + (def s16-andc1 logandc1) + (def s16-not lognot :result-key s16-wrap) + ;; s32 + (def two-arg-s32-and logand) + (def two-arg-s32-or logior) + (def two-arg-s32-xor logxor) + (def two-arg-s32-max max) + (def two-arg-s32-min min) + (def two-arg-s32+ + :result-key s32-wrap) + (def two-arg-s32- - :result-key s32-wrap) + (def two-arg-s32= = :result-key u32-from-boolean) + (def two-arg-s32/= /= :result-key u32-from-boolean) + (def two-arg-s32< < :result-key u32-from-boolean) + (def two-arg-s32<= <= :result-key u32-from-boolean) + (def two-arg-s32> > :result-key u32-from-boolean) + (def two-arg-s32>= >= :result-key u32-from-boolean) + (def s32-andc1 logandc1) + (def s32-not lognot :result-key s32-wrap) + ;; s64 + (def two-arg-s64-and logand) + (def two-arg-s64-or logior) + (def two-arg-s64-xor logxor) + (def two-arg-s64-max max) + (def two-arg-s64-min min) + (def two-arg-s64+ + :result-key s64-wrap) + (def two-arg-s64- - :result-key s64-wrap) + (def two-arg-s64= = :result-key u64-from-boolean) + (def two-arg-s64/= /= :result-key u64-from-boolean) + (def two-arg-s64< < :result-key u64-from-boolean) + (def two-arg-s64<= <= :result-key u64-from-boolean) + (def two-arg-s64> > :result-key u64-from-boolean) + (def two-arg-s64>= >= :result-key u64-from-boolean) + (def s64-andc1 logandc1) + (def s64-not lognot :result-key s64-wrap)) + +(in-package #:sb-simd-sse) + +(define-fake-vop f32-not (a) + (%f32-andc1 a +f32-true+)) + +(define-fake-vop make-f32.4 (a b c d) + (%f32.4-unpacklo + (%f32.4-unpacklo + (%f32.4!-from-f32 a) + (%f32.4!-from-f32 c)) + (%f32.4-unpacklo + (%f32.4!-from-f32 b) + (%f32.4!-from-f32 d)))) + +(define-fake-vop f32.4-values (x) + (let* ((zero (sb-ext:%make-simd-pack-single 0f0 0f0 0f0 0f0)) + (a0b0 (%f32.4-unpacklo x zero)) + (c0d0 (%f32.4-unpackhi x zero))) + (values + (%f32!-from-p128 (%f32.4-unpacklo a0b0 zero)) + (%f32!-from-p128 (%f32.4-unpackhi a0b0 zero)) + (%f32!-from-p128 (%f32.4-unpacklo c0d0 zero)) + (%f32!-from-p128 (%f32.4-unpackhi c0d0 zero))))) + +(define-fake-vop f32.4-broadcast (x) + (let ((v (%f32.4!-from-f32 x))) + (%f32.4-shuffle v v 0))) + +(define-fake-vop f32.4-not (a) + (%f32.4-andc1 + a + (%make-f32.4 +f32-true+ +f32-true+ +f32-true+ +f32-true+))) + +(macrolet ((def (name op) + `(define-fake-vop ,name (x) + (let ((y (,op x (%f32.4-shuffle x x #4r2301)))) + (f32! (,op y (%f32.4-shuffle y y #4r1032))))))) + (def f32.4-horizontal-and %two-arg-f32.4-and) + (def f32.4-horizontal-or %two-arg-f32.4-or) + (def f32.4-horizontal-xor %two-arg-f32.4-xor) + (def f32.4-horizontal-max %two-arg-f32.4-max) + (def f32.4-horizontal-min %two-arg-f32.4-min) + (def f32.4-horizontal+ %two-arg-f32.4+) + (def f32.4-horizontal* %two-arg-f32.4*)) + +(in-package #:sb-simd-sse2) + +(define-fake-vop u8!-from-p128 (x) + (logand #xff (%u64!-from-p128 x))) + +(define-fake-vop u16!-from-p128 (x) + (logand #xffff (%u64!-from-p128 x))) + +(define-fake-vop u32!-from-p128 (x) + (logand #xffffffff (%u64!-from-p128 x))) + +(define-fake-vop f64-not (a) + (%f64-andc1 a +f64-true+)) + +(define-fake-vop make-f64.2 (a b) + (%f64.2-unpacklo + (%f64.2!-from-f64 a) + (%f64.2!-from-f64 b))) + +(define-fake-vop f64.2-values (x) + (values + (%f64!-from-p128 x) + (%f64!-from-p128 (%f64.2-shuffle x 1)))) + +(define-fake-vop f64.2-broadcast (x) + (let ((v (%f64.2!-from-f64 x))) + (%f64.2-unpacklo v v))) + +(define-fake-vop f64.2-not (a) + (%f64.2-andc1 + a + (%make-f64.2 +f64-true+ +f64-true+))) + +(macrolet ((def (name op) + `(define-fake-vop ,name (x) + (multiple-value-bind (a b) (%f64.2-values x) + (,op a b))))) + (def f64.2-horizontal-and %two-arg-f64-and) + (def f64.2-horizontal-or %two-arg-f64-or) + (def f64.2-horizontal-xor %two-arg-f64-xor) + (def f64.2-horizontal-max %two-arg-f64-max) + (def f64.2-horizontal-min %two-arg-f64-min) + (def f64.2-horizontal+ %two-arg-f64+) + (def f64.2-horizontal* %two-arg-f64*)) + +(define-fake-vop make-u8.16 (a b c d e f g h i j k l m n o p) + (%u8.16-unpacklo + (%u8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u8s a c e g i k m o))) + (%u8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u8s b d f h j l n p))))) + +(define-fake-vop u8.16-values (x) + (multiple-value-call #'values + (sb-simd::%u8s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%u8s-from-u64 (%u64!-from-p128 (%u32.4-shuffle (%u32.4!-from-p128 x) #b00001110))))) + +(define-fake-vop u8.16-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-u8s x x x x x x x x)))) + (%u8.16!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop u8.16-not (a) + (let* ((x +u8-true+) + (v (%make-u8.16 x x x x x x x x x x x x x x x x))) + (%u8.16-andc1 a v))) + +(define-fake-vop two-arg-u8.16/= (a b) + (%u8.16-not + (%two-arg-u8.16= a b))) + +(define-fake-vop two-arg-u8.16> (a b) + (let* ((x (expt 2 7)) + (v (%make-u8.16 x x x x x x x x x x x x x x x x))) + (%two-arg-u8.16>~ (%two-arg-u8.16- a v) + (%two-arg-u8.16- b v)))) + +(define-fake-vop two-arg-u8.16< (a b) + (%two-arg-u8.16> b a)) + +(define-fake-vop two-arg-u8.16>= (a b) + (%u8.16-not + (%two-arg-u8.16< a b))) + +(define-fake-vop two-arg-u8.16<= (a b) + (%u8.16-not + (%two-arg-u8.16> a b))) + +(define-fake-vop make-u16.8 (a b c d e f g h) + (%u16.8-unpacklo + (%u16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u16s a c e g))) + (%u16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u16s b d f h))))) + +(define-fake-vop u16.8-values (x) + (multiple-value-call #'values + (sb-simd::%u16s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%u16s-from-u64 (%u64!-from-p128 (%u32.4-shuffle (%u32.4!-from-p128 x) #b00001110))))) + +(define-fake-vop u16.8-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-u16s x x x x)))) + (%u16.8!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop u16.8-not (a) + (%u16.8-andc1 + a + (%make-u16.8 +u16-true+ +u16-true+ +u16-true+ +u16-true+ + +u16-true+ +u16-true+ +u16-true+ +u16-true+))) + +(define-fake-vop two-arg-u16.8/= (a b) + (%u16.8-not + (%two-arg-u16.8= a b))) + +(define-fake-vop two-arg-u16.8> (a b) + (let* ((x (expt 2 15)) + (v (%make-u16.8 x x x x x x x x))) + (%two-arg-u16.8>~ (%two-arg-u16.8- a v) + (%two-arg-u16.8- b v)))) + +(define-fake-vop two-arg-u16.8< (a b) + (%two-arg-u16.8> b a)) + +(define-fake-vop two-arg-u16.8>= (a b) + (%u16.8-not + (%two-arg-u16.8< a b))) + +(define-fake-vop two-arg-u16.8<= (a b) + (%u16.8-not + (%two-arg-u16.8> a b))) + +(define-fake-vop u16.8-movemask (a) + (u16-odd-bits + (%u8.16-movemask + (%u8.16!-from-p128 a)))) + +(define-fake-vop make-u32.4 (a b c d) + (%u32.4-unpacklo + (%u32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u32s a c))) + (%u32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u32s b d))))) + +(define-fake-vop u32.4-values (x) + (multiple-value-call #'values + (sb-simd::%u32s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%u32s-from-u64 (%u64!-from-p128 (%u32.4-shuffle (%u32.4!-from-p128 x) #b00001110))))) + +(define-fake-vop u32.4-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-u32s x x)))) + (%u32.4!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop u32.4-not (a) + (%u32.4-andc1 + a + (%make-u32.4 +u32-true+ +u32-true+ +u32-true+ +u32-true+))) + +(define-fake-vop two-arg-u32.4/= (a b) + (%u32.4-not + (%two-arg-u32.4= a b))) + +(define-fake-vop two-arg-u32.4> (a b) + (let* ((x (expt 2 31)) + (v (%make-u32.4 x x x x))) + (%two-arg-u32.4>~ (%two-arg-u32.4- a v) + (%two-arg-u32.4- b v)))) + +(define-fake-vop two-arg-u32.4< (a b) + (%two-arg-u32.4> b a)) + +(define-fake-vop two-arg-u32.4>= (a b) + (%u32.4-not + (%two-arg-u32.4< a b))) + +(define-fake-vop two-arg-u32.4<= (a b) + (%u32.4-not + (%two-arg-u32.4> a b))) + +(define-fake-vop make-u64.2 (a b) + (%u64.2-unpacklo + (%u64.2!-from-u64 a) + (%u64.2!-from-u64 b))) + +(define-fake-vop u64.2-values (x) + (values + (%u64!-from-p128 x) + (%u64!-from-p128 (%u32.4-shuffle (%u32.4!-from-p128 x) #b00001110)))) + +(define-fake-vop u64.2-broadcast (x) + (let ((v (%u64.2!-from-u64 x))) + (%u64.2-unpacklo v v))) + +(define-fake-vop u64.2-not (a) + (%u64.2-andc1 + a + (%make-u64.2 +u64-true+ +u64-true+))) + +(define-fake-vop s8.16!-from-s8 (x) + (%s8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s8s x 0 0 0 0 0 0 0)))) + +(define-fake-vop make-s8.16 (a b c d e f g h i j k l m n o p) + (%s8.16-unpacklo + (%s8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s8s a c e g i k m o))) + (%s8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s8s b d f h j l n p))))) + +(define-fake-vop s8.16-values (x) + (multiple-value-call #'values + (sb-simd::%s8s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%s8s-from-u64 (%u64!-from-p128 (%u32.4-shuffle (%u32.4!-from-p128 x) #b00001110))))) + +(define-fake-vop s8.16-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-s8s x x x x x x x x)))) + (%s8.16!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop s8.16-not (a) + (%s8.16-andc1 + a + (%make-s8.16 +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+))) + +(define-fake-vop two-arg-s8.16/= (a b) + (%u8.16-not + (%two-arg-s8.16= a b))) + +(define-fake-vop two-arg-s8.16< (a b) + (%two-arg-s8.16> b a)) + +(define-fake-vop two-arg-s8.16>= (a b) + (%u8.16-not + (%two-arg-s8.16< a b))) + +(define-fake-vop two-arg-s8.16<= (a b) + (%u8.16-not + (%two-arg-s8.16> a b))) + +(define-fake-vop s16.8!-from-s16 (x) + (%s16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s16s x 0 0 0)))) + +(define-fake-vop make-s16.8 (a b c d e f g h) + (%s16.8-unpacklo + (%s16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s16s a c e g))) + (%s16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s16s b d f h))))) + +(define-fake-vop s16.8-values (x) + (multiple-value-call #'values + (sb-simd::%s16s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%s16s-from-u64 (%u64!-from-p128 (%u32.4-shuffle (%u32.4!-from-p128 x) #b00001110))))) + +(define-fake-vop s16.8-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-s16s x x x x)))) + (%s16.8!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop s16.8-not (a) + (%s16.8-andc1 + a + (%make-s16.8 +s16-true+ +s16-true+ +s16-true+ +s16-true+ + +s16-true+ +s16-true+ +s16-true+ +s16-true+))) + +(define-fake-vop two-arg-s16.8/= (a b) + (%u16.8-not + (%two-arg-s16.8= a b))) + +(define-fake-vop two-arg-s16.8< (a b) + (%two-arg-s16.8> b a)) + +(define-fake-vop two-arg-s16.8>= (a b) + (%u16.8-not + (%two-arg-s16.8< a b))) + +(define-fake-vop two-arg-s16.8<= (a b) + (%u16.8-not + (%two-arg-s16.8> a b))) + +(define-fake-vop s16.8-movemask (a) + (u16-odd-bits + (%u8.16-movemask + (%u8.16!-from-p128 a)))) + +(define-fake-vop s32.4!-from-s32 (x) + (%s32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s32s x 0)))) + +(define-fake-vop make-s32.4 (a b c d) + (%s32.4-unpacklo + (%s32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s32s a c))) + (%s32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s32s b d))))) + +(define-fake-vop s32.4-values (x) + (multiple-value-call #'values + (sb-simd::%s32s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%s32s-from-u64 (%u64!-from-p128 (%u32.4-shuffle (%u32.4!-from-p128 x) #b00001110))))) + +(define-fake-vop s32.4-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-s32s x x)))) + (%s32.4!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop s32.4-not (a) + (%s32.4-andc1 + a + (%make-s32.4 +s32-true+ +s32-true+ +s32-true+ +s32-true+))) + +(define-fake-vop two-arg-s32.4/= (a b) + (%u32.4-not + (%two-arg-s32.4= a b))) + +(define-fake-vop two-arg-s32.4< (a b) + (%two-arg-s32.4> b a)) + +(define-fake-vop two-arg-s32.4>= (a b) + (%u32.4-not + (%two-arg-s32.4< a b))) + +(define-fake-vop two-arg-s32.4<= (a b) + (%u32.4-not + (%two-arg-s32.4> a b))) + +(define-fake-vop s64.2!-from-s64 (x) + (%s64.2!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s64 x)))) + +(define-fake-vop make-s64.2 (a b) + (%s64.2-unpacklo + (%s64.2!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s64 a))) + (%s64.2!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s64 b))))) + +(define-fake-vop s64.2-values (x) + (values + (sb-simd::%s64-from-u64 (%u64!-from-p128 x)) + (sb-simd::%s64-from-u64 (%u64!-from-p128 (%u32.4-shuffle (%u32.4!-from-p128 x) #b00001110))))) + +(define-fake-vop s64.2-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-s64 x)))) + (%s64.2!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop s64.2-not (a) + (%s64.2-andc1 + a + (%make-s64.2 +s64-true+ +s64-true+))) + +(in-package #:sb-simd-sse4.1) + +(define-fake-vop two-arg-u64.2/= (a b) + (sb-simd-sse2::%u64.2-not + (%two-arg-u64.2= a b))) + +(define-fake-vop two-arg-s64.2/= (a b) + (sb-simd-sse2::%u64.2-not + (%two-arg-s64.2= a b))) + +(in-package #:sb-simd-sse4.2) + +(define-fake-vop two-arg-u64.2> (a b) + (let* ((x (expt 2 63)) + (v (sb-simd-sse2::%make-u64.2 x x))) + (%two-arg-u64.2>~ (sb-simd-sse2::%two-arg-u64.2- a v) + (sb-simd-sse2::%two-arg-u64.2- b v)))) + +(define-fake-vop two-arg-u64.2< (a b) + (%two-arg-u64.2> b a)) + +(define-fake-vop two-arg-u64.2>= (a b) + (sb-simd-sse2::%u64.2-not + (%two-arg-u64.2< a b))) + +(define-fake-vop two-arg-u64.2<= (a b) + (sb-simd-sse2::%u64.2-not + (%two-arg-u64.2> a b))) + +(define-fake-vop two-arg-s64.2< (a b) + (%two-arg-s64.2> b a)) + +(define-fake-vop two-arg-s64.2>= (a b) + (sb-simd-sse2::%u64.2-not + (%two-arg-s64.2< a b))) + +(define-fake-vop two-arg-s64.2<= (a b) + (sb-simd-sse2::%u64.2-not + (%two-arg-s64.2> a b))) + +(in-package #:sb-simd-avx) + +(define-fake-vop u8!-from-p128 (x) + (logand #xff (%u64!-from-p128 x))) + +(define-fake-vop u8!-from-p256 (x) + (logand #xff (%u64!-from-p256 x))) + +(define-fake-vop u16!-from-p128 (x) + (logand #xffff (%u64!-from-p128 x))) + +(define-fake-vop u16!-from-p256 (x) + (logand #xffff (%u64!-from-p256 x))) + +(define-fake-vop u32!-from-p128 (x) + (logand #xffffffff (%u64!-from-p128 x))) + +(define-fake-vop u32!-from-p256 (x) + (logand #xffffffff (%u64!-from-p256 x))) + +(define-fake-vop f32-not (a) + (%f32-andc1 a +f32-true+)) + +(define-fake-vop f64-not (a) + (%f64-andc1 a +f64-true+)) + +(define-fake-vop make-f32.4 (a b c d) + (%f32.4-unpacklo + (%f32.4-unpacklo + (%f32.4!-from-f32 a) + (%f32.4!-from-f32 c)) + (%f32.4-unpacklo + (%f32.4!-from-f32 b) + (%f32.4!-from-f32 d)))) + +(define-fake-vop f32.4-values (x) + (values + (%f32!-from-p128 x) + (%f32!-from-p128 (%f32.4-permute x 1)) + (%f32!-from-p128 (%f32.4-permute x 2)) + (%f32!-from-p128 (%f32.4-permute x 3)))) + +(define-fake-vop f32.4-not (a) + (%f32.4-andc1 + a + (%make-f32.4 +f32-true+ +f32-true+ +f32-true+ +f32-true+))) + +(macrolet ((def (name op) + `(define-fake-vop ,name (x) + (let ((y (,op x (%f32.4-shuffle x x #4r2301)))) + (f32! (,op y (%f32.4-shuffle y y #4r1032))))))) + (def f32.4-horizontal-and %two-arg-f32.4-and) + (def f32.4-horizontal-or %two-arg-f32.4-or) + (def f32.4-horizontal-xor %two-arg-f32.4-xor) + (def f32.4-horizontal-max %two-arg-f32.4-max) + (def f32.4-horizontal-min %two-arg-f32.4-min) + (def f32.4-horizontal+ %two-arg-f32.4+) + (def f32.4-horizontal* %two-arg-f32.4*)) + +(define-fake-vop make-f64.2 (a b) + (%f64.2-unpacklo + (%f64.2!-from-f64 a) + (%f64.2!-from-f64 b))) + +(define-fake-vop f64.2-values (x) + (values + (%f64!-from-p128 x) + (%f64!-from-p128 (%f64.2-permute x 1)))) + +(define-fake-vop f64.2-not (a) + (%f64.2-andc1 + a + (%make-f64.2 +f64-true+ +f64-true+))) + +(macrolet ((def (name op) + `(define-fake-vop ,name (x) + (multiple-value-bind (a b) (%f64.2-values x) + (,op a b))))) + (def f64.2-horizontal-and %two-arg-f64-and) + (def f64.2-horizontal-or %two-arg-f64-or) + (def f64.2-horizontal-xor %two-arg-f64-xor) + (def f64.2-horizontal-max %two-arg-f64-max) + (def f64.2-horizontal-min %two-arg-f64-min) + (def f64.2-horizontal+ %two-arg-f64+) + (def f64.2-horizontal* %two-arg-f64*)) + +(define-fake-vop make-f32.8 (a b c d e f g h) + (let ((lo (%make-f32.4 a b c d)) + (hi (%make-f32.4 e f g h))) + (%f32.8-insert-f32.4 (%f32.8!-from-p128 lo) hi 1))) + +(define-fake-vop f32.8-values (x) + (multiple-value-call #'values + (%f32.4-values (%f32.4!-from-p256 x)) + (%f32.4-values (%f32.4-from-f32.8 x 1)))) + +(define-fake-vop f32.8-not (a) + (%f32.8-andc1 + a + (%make-f32.8 +f32-true+ +f32-true+ +f32-true+ +f32-true+ + +f32-true+ +f32-true+ +f32-true+ +f32-true+))) + +(macrolet ((def (name op) + `(define-fake-vop ,name (x) + (let* ((x (,op x (%f32.8-dupodd x))) + (x (,op x (%f32.8-permute x #4r0202))) + (x (,op x (%f32.8-permute128 x x #4r01)))) + (%f32!-from-p256 x))))) + (def f32.8-horizontal-and %two-arg-f32.8-and) + (def f32.8-horizontal-or %two-arg-f32.8-or) + (def f32.8-horizontal-xor %two-arg-f32.8-xor) + (def f32.8-horizontal-max %two-arg-f32.8-max) + (def f32.8-horizontal-min %two-arg-f32.8-min) + (def f32.8-horizontal+ %two-arg-f32.8+) + (def f32.8-horizontal* %two-arg-f32.8*)) + +(define-fake-vop make-f64.4 (a b c d) + (let ((lo (%make-f64.2 a b)) + (hi (%make-f64.2 c d))) + (%f64.4-insert-f64.2 (%f64.4!-from-p128 lo) hi 1))) + +(define-fake-vop f64.4-values (x) + (multiple-value-call #'values + (%f64.2-values (%f64.2!-from-p256 x)) + (%f64.2-values (%f64.2-from-f64.4 x 1)))) + +(define-fake-vop f64.4-not (a) + (%f64.4-andc1 + a + (%make-f64.4 +f64-true+ +f64-true+ +f64-true+ +f64-true+))) + +(macrolet ((def (name op ) + `(define-fake-vop ,name (x) + (let* ((y (,op x (%f64.4-permute x #b0101))) + (z (,op y (%f64.4-permute128 y y #4r01)))) + (%f64!-from-p256 z))))) + (def f64.4-horizontal-and %two-arg-f64.4-and) + (def f64.4-horizontal-or %two-arg-f64.4-or) + (def f64.4-horizontal-xor %two-arg-f64.4-xor) + (def f64.4-horizontal-max %two-arg-f64.4-max) + (def f64.4-horizontal-min %two-arg-f64.4-min) + (def f64.4-horizontal+ %two-arg-f64.4+) + (def f64.4-horizontal* %two-arg-f64.4*)) + +(define-fake-vop make-u8.16 (a b c d e f g h i j k l m n o p) + (%u8.16-unpacklo + (%u8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u8s a c e g i k m o))) + (%u8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u8s b d f h j l n p))))) + +(define-fake-vop u8.16-values (x) + (multiple-value-call #'values + (sb-simd::%u8s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%u8s-from-u64 (%u64!-from-p128 (%u64.2-permute (%u64.2!-from-p128 x) 1))))) + +(define-fake-vop u8.16-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-u8s x x x x x x x x)))) + (%u8.16!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop u8.16-not (a) + (%u8.16-andc1 + a + (%make-u8.16 +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+))) + +(define-fake-vop two-arg-u8.16/= (a b) + (%u8.16-not + (%two-arg-u8.16= a b))) + +(define-fake-vop two-arg-u8.16> (a b) + (let* ((x (expt 2 7)) + (v (%make-u8.16 x x x x x x x x x x x x x x x x))) + (%two-arg-u8.16>~ (%two-arg-u8.16- a v) + (%two-arg-u8.16- b v)))) + +(define-fake-vop two-arg-u8.16< (a b) + (%two-arg-u8.16> b a)) + +(define-fake-vop two-arg-u8.16>= (a b) + (%u8.16-not + (%two-arg-u8.16< a b))) + +(define-fake-vop two-arg-u8.16<= (a b) + (%u8.16-not + (%two-arg-u8.16> a b))) + +(define-fake-vop make-u16.8 (a b c d e f g h) + (%u16.8-unpacklo + (%u16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u16s a c e g))) + (%u16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u16s b d f h))))) + +(define-fake-vop u16.8-values (x) + (multiple-value-call #'values + (sb-simd::%u16s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%u16s-from-u64 (%u64!-from-p128 (%u64.2-permute (%u64.2!-from-p128 x) 1))))) + +(define-fake-vop u16.8-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-u16s x x x x)))) + (%u16.8!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop u16.8-not (a) + (%u16.8-andc1 + a + (%make-u16.8 +u16-true+ +u16-true+ +u16-true+ +u16-true+ + +u16-true+ +u16-true+ +u16-true+ +u16-true+))) + +(define-fake-vop two-arg-u16.8/= (a b) + (%u16.8-not + (%two-arg-u16.8= a b))) + +(define-fake-vop two-arg-u16.8> (a b) + (let* ((x (expt 2 15)) + (v (%make-u16.8 x x x x x x x x))) + (%two-arg-u16.8>~ (%two-arg-u16.8- a v) + (%two-arg-u16.8- b v)))) + +(define-fake-vop two-arg-u16.8< (a b) + (%two-arg-u16.8> b a)) + +(define-fake-vop two-arg-u16.8>= (a b) + (%u16.8-not + (%two-arg-u16.8< a b))) + +(define-fake-vop two-arg-u16.8<= (a b) + (%u16.8-not + (%two-arg-u16.8> a b))) + +(define-fake-vop u16.8-movemask (a) + (u16-odd-bits + (%u8.16-movemask + (%u8.16!-from-p128 a)))) + +(define-fake-vop make-u32.4 (a b c d) + (%u32.4-unpacklo + (%u32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u32s a c))) + (%u32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-u32s b d))))) + +(define-fake-vop u32.4-values (x) + (multiple-value-call #'values + (sb-simd::%u32s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%u32s-from-u64 (%u64!-from-p128 (%u64.2-permute (%u64.2!-from-p128 x) 1))))) + +(define-fake-vop u32.4-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-u32s x x)))) + (%u32.4!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop u32.4-not (a) + (%u32.4-andc1 + a + (%make-u32.4 +u32-true+ +u32-true+ +u32-true+ +u32-true+))) + +(define-fake-vop two-arg-u32.4/= (a b) + (%u32.4-not + (%two-arg-u32.4= a b))) + +(define-fake-vop two-arg-u32.4> (a b) + (let* ((x (expt 2 31)) + (v (%make-u32.4 x x x x))) + (%two-arg-u32.4>~ (%two-arg-u32.4- a v) + (%two-arg-u32.4- b v)))) + +(define-fake-vop two-arg-u32.4< (a b) + (%two-arg-u32.4> b a)) + +(define-fake-vop two-arg-u32.4>= (a b) + (%u32.4-not + (%two-arg-u32.4< a b))) + +(define-fake-vop two-arg-u32.4<= (a b) + (%u32.4-not + (%two-arg-u32.4> a b))) + +(define-fake-vop make-u64.2 (a b) + (%u64.2-unpacklo + (%u64.2!-from-u64 a) + (%u64.2!-from-u64 b))) + +(define-fake-vop u64.2-values (x) + (multiple-value-call #'values + (%u64!-from-p128 x) + (%u64!-from-p128 (%u64.2-permute (%u64.2!-from-p128 x) 1)))) + +(define-fake-vop u64.2-broadcast (x) + (let ((v (%u64.2!-from-u64 x))) + (%u64.2-unpacklo v v))) + +(define-fake-vop u64.2-not (a) + (%u64.2-andc1 + a + (%make-u64.2 +u64-true+ +u64-true+))) + +(define-fake-vop two-arg-u64.2/= (a b) + (%u64.2-not + (%two-arg-u64.2= a b))) + +(define-fake-vop two-arg-u64.2> (a b) + (let* ((x (expt 2 63)) + (v (%make-u64.2 x x))) + (%two-arg-u64.2>~ (%two-arg-u64.2- a v) + (%two-arg-u64.2- b v)))) + +(define-fake-vop two-arg-u64.2< (a b) + (%two-arg-u64.2> b a)) + +(define-fake-vop two-arg-u64.2>= (a b) + (sb-simd-avx::%u64.2-not + (%two-arg-u64.2< a b))) + +(define-fake-vop two-arg-u64.2<= (a b) + (sb-simd-avx::%u64.2-not + (%two-arg-u64.2> a b))) + +(define-fake-vop make-u8.32 + (u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16 u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32) + (let ((lo (%make-u8.16 u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16)) + (hi (%make-u8.16 u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32))) + (%u8.32-insert-u8.16 (%u8.32!-from-p128 lo) hi 1))) + +(define-fake-vop u8.32-values (x) + (multiple-value-call #'values + (%u8.16-values (%u8.16!-from-p256 x)) + (%u8.16-values (%u8.16-from-u8.32 x 1)))) + +(define-fake-vop u8.32-broadcast (x) + (let ((v (%u8.16-broadcast x))) + (%u8.32-insert-u8.16 (%u8.32!-from-p128 v) v 1))) + +(define-fake-vop make-u16.16 (a b c d e f g h i j k l m n o p) + (let ((lo (%make-u16.8 a b c d e f g h)) + (hi (%make-u16.8 i j k l m n o p))) + (%u16.16-insert-u16.8 (%u16.16!-from-p128 lo) hi 1))) + +(define-fake-vop u16.16-values (x) + (multiple-value-call #'values + (%u16.8-values (%u16.8!-from-p256 x)) + (%u16.8-values (%u16.8-from-u16.16 x 1)))) + +(define-fake-vop u16.16-broadcast (x) + (let ((v (%u16.8-broadcast x))) + (%u16.16-insert-u16.8 (%u16.16!-from-p128 v) v 1))) + +(define-fake-vop make-u32.8 (a b c d e f g h) + (let ((lo (%make-u32.4 a b c d)) + (hi (%make-u32.4 e f g h))) + (%u32.8-insert-u32.4 (%u32.8!-from-p128 lo) hi 1))) + +(define-fake-vop u32.8-values (x) + (multiple-value-call #'values + (%u32.4-values (%u32.4!-from-p256 x)) + (%u32.4-values (%u32.4-from-u32.8 x 1)))) + +(define-fake-vop u32.8-broadcast (x) + (let ((v (%u32.4-broadcast x))) + (%u32.8-insert-u32.4 (%u32.8!-from-p128 v) v 1))) + +(define-fake-vop make-u64.4 (a b c d) + (let ((lo (%make-u64.2 a b)) + (hi (%make-u64.2 c d))) + (%u64.4-insert-u64.2 (%u64.4!-from-p128 lo) hi 1))) + +(define-fake-vop u64.4-values (x) + (multiple-value-call #'values + (%u64.2-values (%u64.2!-from-p256 x)) + (%u64.2-values (%u64.2-from-u64.4 x 1)))) + +(define-fake-vop u64.4-broadcast (x) + (let ((v (%u64.2-broadcast x))) + (%u64.4-insert-u64.2 (%u64.4!-from-p128 v) v 1))) + +(define-fake-vop s8.16!-from-s8 (x) + (%s8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s8s x 0 0 0 0 0 0 0)))) + +(define-fake-vop make-s8.16 (a b c d e f g h i j k l m n o p) + (%s8.16-unpacklo + (%s8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s8s a c e g i k m o))) + (%s8.16!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s8s b d f h j l n p))))) + +(define-fake-vop s8.16-values (x) + (multiple-value-call #'values + (sb-simd::%s8s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%s8s-from-u64 (%u64!-from-p128 (%u64.2-permute (%u64.2!-from-p128 x) 1))))) + +(define-fake-vop s8.16-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-s8s x x x x x x x x)))) + (%s8.16!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop s8.16-not (a) + (%s8.16-andc1 + a + (%make-s8.16 +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+))) + +(define-fake-vop two-arg-s8.16/= (a b) + (%u8.16-not + (%two-arg-s8.16= a b))) + +(define-fake-vop two-arg-s8.16< (a b) + (%two-arg-s8.16> b a)) + +(define-fake-vop two-arg-s8.16>= (a b) + (%u8.16-not + (%two-arg-s8.16< a b))) + +(define-fake-vop two-arg-s8.16<= (a b) + (%u8.16-not + (%two-arg-s8.16> a b))) + +(define-fake-vop s16.8!-from-s16 (x) + (%s16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s16s x 0 0 0)))) + +(define-fake-vop make-s16.8 (a b c d e f g h) + (%s16.8-unpacklo + (%s16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s16s a c e g))) + (%s16.8!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s16s b d f h))))) + +(define-fake-vop s16.8-values (x) + (multiple-value-call #'values + (sb-simd::%s16s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%s16s-from-u64 (%u64!-from-p128 (%u64.2-permute (%u64.2!-from-p128 x) 1))))) + +(define-fake-vop s16.8-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-s16s x x x x)))) + (%s16.8!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop s16.8-not (a) + (%s16.8-andc1 + a + (%make-s16.8 +s16-true+ +s16-true+ +s16-true+ +s16-true+ + +s16-true+ +s16-true+ +s16-true+ +s16-true+))) + +(define-fake-vop two-arg-s16.8/= (a b) + (%u16.8-not + (%two-arg-s16.8= a b))) + +(define-fake-vop two-arg-s16.8< (a b) + (%two-arg-s16.8> b a)) + +(define-fake-vop two-arg-s16.8>= (a b) + (%u16.8-not + (%two-arg-s16.8< a b))) + +(define-fake-vop two-arg-s16.8<= (a b) + (%u16.8-not + (%two-arg-s16.8> a b))) + +(define-fake-vop s16.8-movemask (a) + (u16-odd-bits + (%u8.16-movemask + (%u8.16!-from-p128 a)))) + +(define-fake-vop s32.4!-from-s32 (x) + (%s32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s32s x 0)))) + +(define-fake-vop make-s32.4 (a b c d) + (%s32.4-unpacklo + (%s32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s32s a c))) + (%s32.4!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s32s b d))))) + +(define-fake-vop s32.4-values (x) + (multiple-value-call #'values + (sb-simd::%s32s-from-u64 (%u64!-from-p128 x)) + (sb-simd::%s32s-from-u64 (%u64!-from-p128 (%u64.2-permute (%u64.2!-from-p128 x) 1))))) + +(define-fake-vop s32.4-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-s32s x x)))) + (%s32.4!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop s32.4-not (a) + (%s32.4-andc1 + a + (%make-s32.4 +s32-true+ +s32-true+ +s32-true+ +s32-true+))) + +(define-fake-vop two-arg-s32.4/= (a b) + (%u32.4-not + (%two-arg-s32.4= a b))) + +(define-fake-vop two-arg-s32.4< (a b) + (%two-arg-s32.4> b a)) + +(define-fake-vop two-arg-s32.4>= (a b) + (%u32.4-not + (%two-arg-s32.4< a b))) + +(define-fake-vop two-arg-s32.4<= (a b) + (%u32.4-not + (%two-arg-s32.4> a b))) + +(define-fake-vop s64.2!-from-s64 (x) + (%s64.2!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s64 x)))) + +(define-fake-vop make-s64.2 (a b) + (%s64.2-unpacklo + (%s64.2!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s64 a))) + (%s64.2!-from-p128 (%u64.2!-from-u64 (sb-simd::%u64-from-s64 b))))) + +(define-fake-vop s64.2-values (x) + (multiple-value-call #'values + (sb-simd::%s64-from-u64 (%u64!-from-p128 x)) + (sb-simd::%s64-from-u64 (%u64!-from-p128 (%u64.2-permute (%u64.2!-from-p128 x) 1))))) + +(define-fake-vop s64.2-broadcast (x) + (let ((v (%u64.2!-from-u64 (sb-simd::%u64-from-s64 x)))) + (%s64.2!-from-p128 (%u64.2-unpacklo v v)))) + +(define-fake-vop s64.2-not (a) + (%s64.2-andc1 + a + (%make-s64.2 +s64-true+ +s64-true+))) + +(define-fake-vop two-arg-s64.2/= (a b) + (%u64.2-not + (%two-arg-s64.2= a b))) + +(define-fake-vop two-arg-s64.2< (a b) + (%two-arg-s64.2> b a)) + +(define-fake-vop two-arg-s64.2>= (a b) + (sb-simd-avx::%u64.2-not + (%two-arg-s64.2< a b))) + +(define-fake-vop two-arg-s64.2<= (a b) + (sb-simd-avx::%u64.2-not + (%two-arg-s64.2> a b))) + +(define-fake-vop s8.32!-from-s8 (x) + (%s8.32!-from-p256 (%u64.4!-from-u64 (sb-simd::%u64-from-s8s x 0 0 0 0 0 0 0)))) + +(define-fake-vop make-s8.32 + (s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 s32) + (let ((lo (%make-s8.16 s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16)) + (hi (%make-s8.16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 s32))) + (%s8.32-insert-s8.16 (%s8.32!-from-p128 lo) hi 1))) + +(define-fake-vop s8.32-values (x) + (multiple-value-call #'values + (%s8.16-values (%s8.16!-from-p256 x)) + (%s8.16-values (%s8.16-from-s8.32 x 1)))) + +(define-fake-vop s8.32-broadcast (x) + (let ((v (%s8.16-broadcast x))) + (%s8.32-insert-s8.16 (%s8.32!-from-p128 v) v 1))) + +(define-fake-vop s16.16!-from-s16 (x) + (%s16.16!-from-p256 (%u64.4!-from-u64 (sb-simd::%u64-from-s16s x 0 0 0)))) + +(define-fake-vop make-s16.16 (a b c d e f g h i j k l m n o p) + (let ((lo (%make-s16.8 a b c d e f g h)) + (hi (%make-s16.8 i j k l m n o p))) + (%s16.16-insert-s16.8 (%s16.16!-from-p128 lo) hi 1))) + +(define-fake-vop s16.16-values (x) + (multiple-value-call #'values + (%s16.8-values (%s16.8!-from-p256 x)) + (%s16.8-values (%s16.8-from-s16.16 x 1)))) + +(define-fake-vop s16.16-broadcast (x) + (let ((v (%s16.8-broadcast x))) + (%s16.16-insert-s16.8 (%s16.16!-from-p128 v) v 1))) + +(define-fake-vop s32.8!-from-s32 (x) + (%s32.8!-from-p256 (%u64.4!-from-u64 (sb-simd::%u64-from-s32s x 0)))) + +(define-fake-vop make-s32.8 (a b c d e f g h) + (let ((lo (%make-s32.4 a b c d)) + (hi (%make-s32.4 e f g h))) + (%s32.8-insert-s32.4 (%s32.8!-from-p128 lo) hi 1))) + +(define-fake-vop s32.8-values (x) + (multiple-value-call #'values + (%s32.4-values (%s32.4!-from-p256 x)) + (%s32.4-values (%s32.4-from-s32.8 x 1)))) + +(define-fake-vop s32.8-broadcast (x) + (let ((v (%s32.4-broadcast x))) + (%s32.8-insert-s32.4 (%s32.8!-from-p128 v) v 1))) + +(define-fake-vop s64.4!-from-s64 (x) + (%s64.4!-from-p256 (%u64.4!-from-u64 (sb-simd::%u64-from-s64 x)))) + +(define-fake-vop make-s64.4 (a b c d) + (let ((lo (%make-s64.2 a b)) + (hi (%make-s64.2 c d))) + (%s64.4-insert-s64.2 (%s64.4!-from-p128 lo) hi 1))) + +(define-fake-vop s64.4-values (x) + (multiple-value-call #'values + (%s64.2-values (%s64.2!-from-p256 x)) + (%s64.2-values (%s64.2-from-s64.4 x 1)))) + +(define-fake-vop s64.4-broadcast (x) + (let ((v (%s64.2-broadcast x))) + (%s64.4-insert-s64.2 (%s64.4!-from-p128 v) v 1))) + +(in-package #:sb-simd-avx2) + +(define-fake-vop u8.16-broadcast (x) + (%u8.16-broadcastvec (sb-simd-avx::%u8.16!-from-u8 x))) + +(define-fake-vop u16.8-broadcast (x) + (%u16.8-broadcastvec (sb-simd-avx::%u16.8!-from-u16 x))) + +(define-fake-vop u32.4-broadcast (x) + (%u32.4-broadcastvec (sb-simd-avx::%u32.4!-from-u32 x))) + +(define-fake-vop u64.2-broadcast (x) + (%u64.2-broadcastvec (sb-simd-avx::%u64.2!-from-u64 x))) + +(define-fake-vop s8.16-broadcast (x) + (%s8.16-broadcastvec (sb-simd-avx::%s8.16!-from-s8 x))) + +(define-fake-vop s16.8-broadcast (x) + (%s16.8-broadcastvec (sb-simd-avx::%s16.8!-from-s16 x))) + +(define-fake-vop s32.4-broadcast (x) + (%s32.4-broadcastvec (sb-simd-avx::%s32.4!-from-s32 x))) + +(define-fake-vop s64.2-broadcast (x) + (%s64.2-broadcastvec (sb-simd-avx::%s64.2!-from-s64 x))) + +(define-fake-vop make-u8.32 + (u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16 u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32) + (let ((lo (sb-simd-avx::%make-u8.16 u01 u02 u03 u04 u05 u06 u07 u08 u09 u10 u11 u12 u13 u14 u15 u16)) + (hi (sb-simd-avx::%make-u8.16 u17 u18 u19 u20 u21 u22 u23 u24 u25 u26 u27 u28 u29 u30 u31 u32))) + (%u8.32-insert-u8.16 (sb-simd-avx::%u8.32!-from-p128 lo) hi 1))) + +(define-fake-vop u8.32-values (x) + (multiple-value-call #'values + (sb-simd-avx::%u8.16-values (sb-simd-avx::%u8.16!-from-p256 x)) + (sb-simd-avx::%u8.16-values (%u8.16-from-u8.32 x 1)))) + +(define-fake-vop u8.32-broadcast (x) + (%u8.32-broadcastvec (sb-simd-avx::%u8.32!-from-u8 x))) + +(define-fake-vop u8.32-not (a) + (%u8.32-andc1 + a + (%make-u8.32 +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+ + +u8-true+ +u8-true+ +u8-true+ +u8-true+))) + +(define-fake-vop two-arg-u8.32/= (a b) + (%u8.32-not + (%two-arg-u8.32= a b))) + +(define-fake-vop two-arg-u8.32> (a b) + (let* ((x (expt 2 7)) + (v (%make-u8.32 x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x))) + (%two-arg-u8.32>~ (%two-arg-u8.32- a v) + (%two-arg-u8.32- b v)))) + +(define-fake-vop two-arg-u8.32< (a b) + (%two-arg-u8.32> b a)) + +(define-fake-vop two-arg-u8.32>= (a b) + (%u8.32-not + (%two-arg-u8.32< a b))) + +(define-fake-vop two-arg-u8.32<= (a b) + (%u8.32-not + (%two-arg-u8.32> a b))) + +(define-fake-vop make-u16.16 (a b c d e f g h i j k l m n o p) + (let ((lo (sb-simd-avx::%make-u16.8 a b c d e f g h)) + (hi (sb-simd-avx::%make-u16.8 i j k l m n o p))) + (%u16.16-insert-u16.8 (sb-simd-avx::%u16.16!-from-p128 lo) hi 1))) + +(define-fake-vop u16.16-values (x) + (multiple-value-call #'values + (sb-simd-avx::%u16.8-values (sb-simd-avx::%u16.8!-from-p256 x)) + (sb-simd-avx::%u16.8-values (%u16.8-from-u16.16 x 1)))) + +(define-fake-vop u16.16-broadcast (x) + (%u16.16-broadcastvec (sb-simd-avx::%u16.16!-from-u16 x))) + +(define-fake-vop u16.16-not (a) + (%u16.16-andc1 + a + (%make-u16.16 +u16-true+ +u16-true+ +u16-true+ +u16-true+ + +u16-true+ +u16-true+ +u16-true+ +u16-true+ + +u16-true+ +u16-true+ +u16-true+ +u16-true+ + +u16-true+ +u16-true+ +u16-true+ +u16-true+))) + +(define-fake-vop two-arg-u16.16/= (a b) + (%u16.16-not + (%two-arg-u16.16= a b))) + +(define-fake-vop two-arg-u16.16> (a b) + (let* ((x (expt 2 15)) + (v (%make-u16.16 x x x x x x x x x x x x x x x x))) + (%two-arg-u16.16>~ (%two-arg-u16.16- a v) + (%two-arg-u16.16- b v)))) + +(define-fake-vop two-arg-u16.16< (a b) + (%two-arg-u16.16> b a)) + +(define-fake-vop two-arg-u16.16>= (a b) + (%u16.16-not + (%two-arg-u16.16< a b))) + +(define-fake-vop two-arg-u16.16<= (a b) + (%u16.16-not + (%two-arg-u16.16> a b))) + +(define-fake-vop u16.16-movemask (a) + (u32-odd-bits + (%u8.32-movemask + (sb-simd-avx::%u8.32!-from-p256 a)))) + +(define-fake-vop make-u32.8 (a b c d e f g h) + (let ((lo (sb-simd-avx::%make-u32.4 a b c d)) + (hi (sb-simd-avx::%make-u32.4 e f g h))) + (%u32.8-insert-u32.4 (sb-simd-avx::%u32.8!-from-p128 lo) hi 1))) + +(define-fake-vop u32.8-values (x) + (multiple-value-call #'values + (sb-simd-avx::%u32.4-values (sb-simd-avx::%u32.4!-from-p256 x)) + (sb-simd-avx::%u32.4-values (%u32.4-from-u32.8 x 1)))) + +(define-fake-vop u32.8-broadcast (x) + (%u32.8-broadcastvec (sb-simd-avx::%u32.8!-from-u32 x))) + +(define-fake-vop u32.8-not (a) + (%u32.8-andc1 + a + (%make-u32.8 +u32-true+ +u32-true+ +u32-true+ +u32-true+ + +u32-true+ +u32-true+ +u32-true+ +u32-true+))) + +(define-fake-vop two-arg-u32.8/= (a b) + (%u32.8-not + (%two-arg-u32.8= a b))) + +(define-fake-vop two-arg-u32.8> (a b) + (let* ((x (expt 2 31)) + (v (%make-u32.8 x x x x x x x x))) + (%two-arg-u32.8>~ (%two-arg-u32.8- a v) + (%two-arg-u32.8- b v)))) + +(define-fake-vop two-arg-u32.8< (a b) + (%two-arg-u32.8> b a)) + +(define-fake-vop two-arg-u32.8>= (a b) + (%u32.8-not + (%two-arg-u32.8< a b))) + +(define-fake-vop two-arg-u32.8<= (a b) + (%u32.8-not + (%two-arg-u32.8> a b))) + +(define-fake-vop make-u64.4 (a b c d) + (let ((lo (sb-simd-avx::%make-u64.2 a b)) + (hi (sb-simd-avx::%make-u64.2 c d))) + (%u64.4-insert-u64.2 (sb-simd-avx::%u64.4!-from-p128 lo) hi 1))) + +(define-fake-vop u64.4-values (x) + (multiple-value-call #'values + (sb-simd-avx::%u64.2-values (sb-simd-avx::%u64.2!-from-p256 x)) + (sb-simd-avx::%u64.2-values (%u64.2-from-u64.4 x 1)))) + +(define-fake-vop u64.4-broadcast (x) + (%u64.4-broadcastvec (sb-simd-avx::%u64.4!-from-u64 x))) + +(define-fake-vop u64.4-not (a) + (%u64.4-andc1 + a + (%make-u64.4 +u64-true+ +u64-true+ +u64-true+ +u64-true+))) + +(define-fake-vop two-arg-u64.4/= (a b) + (%u64.4-not + (%two-arg-u64.4= a b))) + +(define-fake-vop two-arg-u64.4> (a b) + (let* ((x (expt 2 63)) + (v (%make-u64.4 x x x x))) + (%two-arg-u64.4>~ (%two-arg-u64.4- a v) + (%two-arg-u64.4- b v)))) + +(define-fake-vop two-arg-u64.4< (a b) + (%two-arg-u64.4> b a)) + +(define-fake-vop two-arg-u64.4>= (a b) + (%u64.4-not + (%two-arg-u64.4< a b))) + +(define-fake-vop two-arg-u64.4<= (a b) + (%u64.4-not + (%two-arg-u64.4> a b))) + +(define-fake-vop make-s8.32 + (s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 s32) + (let ((lo (sb-simd-avx::%make-s8.16 s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16)) + (hi (sb-simd-avx::%make-s8.16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 s32))) + (%s8.32-insert-s8.16 (sb-simd-avx::%s8.32!-from-p128 lo) hi 1))) + +(define-fake-vop s8.32-values (x) + (multiple-value-call #'values + (sb-simd-avx::%s8.16-values (sb-simd-avx::%s8.16!-from-p256 x)) + (sb-simd-avx::%s8.16-values (%s8.16-from-s8.32 x 1)))) + +(define-fake-vop s8.32-broadcast (x) + (%s8.32-broadcastvec (sb-simd-avx::%s8.32!-from-s8 x))) + +(define-fake-vop s8.32-not (a) + (%s8.32-andc1 + a + (%make-s8.32 +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+ + +s8-true+ +s8-true+ +s8-true+ +s8-true+))) + +(define-fake-vop two-arg-s8.32/= (a b) + (%u8.32-not + (%two-arg-s8.32= a b))) + +(define-fake-vop two-arg-s8.32< (a b) + (%two-arg-s8.32> b a)) + +(define-fake-vop two-arg-s8.32>= (a b) + (%u8.32-not + (%two-arg-s8.32< a b))) + +(define-fake-vop two-arg-s8.32<= (a b) + (%u8.32-not + (%two-arg-s8.32> a b))) + +(define-fake-vop make-s16.16 (a b c d e f g h i j k l m n o p) + (let ((lo (sb-simd-avx::%make-s16.8 a b c d e f g h)) + (hi (sb-simd-avx::%make-s16.8 i j k l m n o p))) + (%s16.16-insert-s16.8 (sb-simd-avx::%s16.16!-from-p128 lo) hi 1))) + +(define-fake-vop s16.16-values (x) + (multiple-value-call #'values + (sb-simd-avx::%s16.8-values (sb-simd-avx::%s16.8!-from-p256 x)) + (sb-simd-avx::%s16.8-values (sb-simd-avx::%s16.8-from-s16.16 x 1)))) + +(define-fake-vop s16.16-broadcast (x) + (%s16.16-broadcastvec (sb-simd-avx::%s16.16!-from-s16 x))) + +(define-fake-vop s16.16-not (a) + (%s16.16-andc1 + a + (%make-s16.16 +s16-true+ +s16-true+ +s16-true+ +s16-true+ + +s16-true+ +s16-true+ +s16-true+ +s16-true+ + +s16-true+ +s16-true+ +s16-true+ +s16-true+ + +s16-true+ +s16-true+ +s16-true+ +s16-true+))) + +(define-fake-vop two-arg-s16.16/= (a b) + (%u16.16-not + (%two-arg-s16.16= a b))) + +(define-fake-vop two-arg-s16.16< (a b) + (%two-arg-s16.16> b a)) + +(define-fake-vop two-arg-s16.16>= (a b) + (%u16.16-not + (%two-arg-s16.16< a b))) + +(define-fake-vop two-arg-s16.16<= (a b) + (%u16.16-not + (%two-arg-s16.16> a b))) + +(define-fake-vop s16.16-movemask (a) + (u32-odd-bits + (%u8.32-movemask + (sb-simd-avx::%u8.32!-from-p256 a)))) + +(define-fake-vop make-s32.8 (a b c d e f g h) + (let ((lo (sb-simd-avx::%make-s32.4 a b c d)) + (hi (sb-simd-avx::%make-s32.4 e f g h))) + (%s32.8-insert-s32.4 (sb-simd-avx::%s32.8!-from-p128 lo) hi 1))) + +(define-fake-vop s32.8-values (x) + (multiple-value-call #'values + (sb-simd-avx::%s32.4-values (sb-simd-avx::%s32.4!-from-p256 x)) + (sb-simd-avx::%s32.4-values (sb-simd-avx::%s32.4-from-s32.8 x 1)))) + +(define-fake-vop s32.8-broadcast (x) + (%s32.8-broadcastvec (sb-simd-avx::%s32.8!-from-s32 x))) + +(define-fake-vop s32.8-not (a) + (%s32.8-andc1 + a + (%make-s32.8 +s32-true+ +s32-true+ +s32-true+ +s32-true+ + +s32-true+ +s32-true+ +s32-true+ +s32-true+))) + +(define-fake-vop two-arg-s32.8/= (a b) + (%u32.8-not + (%two-arg-s32.8= a b))) + +(define-fake-vop two-arg-s32.8< (a b) + (%two-arg-s32.8> b a)) + +(define-fake-vop two-arg-s32.8>= (a b) + (%u32.8-not + (%two-arg-s32.8< a b))) + +(define-fake-vop two-arg-s32.8<= (a b) + (%u32.8-not + (%two-arg-s32.8> a b))) + +(define-fake-vop make-s64.4 (a b c d) + (let ((lo (sb-simd-avx::%make-s64.2 a b)) + (hi (sb-simd-avx::%make-s64.2 c d))) + (%s64.4-insert-s64.2 (sb-simd-avx::%s64.4!-from-p128 lo) hi 1))) + +(define-fake-vop s64.4-values (x) + (multiple-value-call #'values + (sb-simd-avx::%s64.2-values (sb-simd-avx::%s64.2!-from-p256 x)) + (sb-simd-avx::%s64.2-values (%s64.2-from-s64.4 x 1)))) + +(define-fake-vop s64.4-broadcast (x) + (%s64.4-broadcastvec (sb-simd-avx::%s64.4!-from-s64 x))) + +(define-fake-vop s64.4-not (a) + (%s64.4-andc1 + a + (%make-s64.4 +s64-true+ +s64-true+ +s64-true+ +s64-true+))) + +(define-fake-vop two-arg-s64.4/= (a b) + (%u64.4-not + (%two-arg-s64.4= a b))) + +(define-fake-vop two-arg-s64.4< (a b) + (%two-arg-s64.4> b a)) + +(define-fake-vop two-arg-s64.4>= (a b) + (%u64.4-not + (%two-arg-s64.4< a b))) + +(define-fake-vop two-arg-s64.4<= (a b) + (%u64.4-not + (%two-arg-s64.4> a b))) + +(define-fake-vop f64.4-reverse (a) + (%f64.4-permute4x64 a #b00011011)) diff --git a/contrib/sb-simd/code/define-ifs.lisp b/contrib/sb-simd/code/define-ifs.lisp new file mode 100644 index 0000000000..c41e7cb604 --- /dev/null +++ b/contrib/sb-simd/code/define-ifs.lisp @@ -0,0 +1,28 @@ +(in-package #:sb-simd-internals) + +(macrolet + ((define-if (if-record-name) + (with-accessors ((name if-record-name) + (blend if-record-blend)) + (find-function-record if-record-name) + (with-accessors ((blend instruction-record-name) + (result-records instruction-record-result-records) + (argument-records instruction-record-argument-records)) blend + (destructuring-bind (a-record b-record mask-record) argument-records + (assert (eq a-record b-record)) + (assert (= (value-record-bits a-record) + (value-record-bits mask-record))) + (destructuring-bind (result-record) result-records + (assert (eq result-record a-record)) + (let ((value-type (value-record-name a-record)) + (mask-type (value-record-name mask-record))) + `(define-inline ,name (mask a b) + (the ,value-type + (,blend (,value-type b) + (,value-type a) + (,mask-type mask)))))))))) + (define-ifs () + `(progn + ,@(loop for if-record in (filter-function-records #'if-record-p) + collect `(define-if ,(if-record-name if-record)))))) + (define-ifs)) diff --git a/contrib/sb-simd/code/define-instruction-vops.lisp b/contrib/sb-simd/code/define-instruction-vops.lisp new file mode 100644 index 0000000000..03e9ce207d --- /dev/null +++ b/contrib/sb-simd/code/define-instruction-vops.lisp @@ -0,0 +1,181 @@ +(in-package #:sb-vm) + +(macrolet + ((define-instruction-vop (instruction-record-name) + (with-accessors ((name sb-simd-internals:instruction-record-name) + (vop sb-simd-internals:instruction-record-vop) + (mnemonic sb-simd-internals:instruction-record-mnemonic) + (argument-records sb-simd-internals:instruction-record-argument-records) + (result-records sb-simd-internals:instruction-record-result-records) + (cost sb-simd-internals:instruction-record-cost) + (pure sb-simd-internals:instruction-record-pure) + (always-translatable sb-simd-internals:instruction-record-always-translatable) + (associative sb-simd-internals:instruction-record-associative) + (prefix sb-simd-internals:instruction-record-prefix) + (suffix sb-simd-internals:instruction-record-suffix) + (encoding sb-simd-internals:instruction-record-encoding)) + (sb-simd-internals:find-function-record instruction-record-name) + (let* ((asyms (sb-simd-internals:prefixed-symbols "A" (length argument-records))) + (rsyms (sb-simd-internals:prefixed-symbols "R" (length result-records))) + (defknown + `(defknown ,vop + (,@(mapcar #'sb-simd-internals:value-record-name argument-records)) + (values ,@(mapcar #'sb-simd-internals:value-record-name result-records) &optional) + (,@(when (and always-translatable (not (eq encoding :fake-vop))) + '(always-translatable)) + ,@(when pure '(foldable flushable movable))) + :overwrite-fndb-silently t)) + (arg-types + (mapcar #'sb-simd-internals:value-record-primitive-type argument-records)) + (result-types + (mapcar #'sb-simd-internals:value-record-primitive-type result-records)) + (args + (loop for asym in asyms + for argument-record in argument-records + when (symbolp (sb-simd-internals:value-record-primitive-type argument-record)) + collect `(,asym :scs ,(sb-simd-internals:value-record-scs argument-record)))) + (info + (loop for asym in asyms + for argument-record in argument-records + unless (symbolp (sb-simd-internals:value-record-primitive-type argument-record)) + collect asym)) + (results + (loop for rsym in rsyms + for result-record in result-records + collect `(,rsym :scs ,(sb-simd-internals:value-record-scs result-record))))) + (ecase encoding + ((:fake-vop :custom) + `(progn ,defknown)) + (:standard + (assert mnemonic) + `(progn + ,defknown + (define-vop (,vop) + (:translate ,vop) + (:policy :fast-safe) + (:args ,@args) + (:info ,@info) + (:results ,@results) + (:arg-types ,@arg-types) + (:result-types ,@result-types) + (:generator + ,cost + (inst ,mnemonic ,@prefix ,@rsyms ,@asyms ,@suffix))))) + (:move + (assert mnemonic) + (let ((src (first asyms)) + (dst (first rsyms))) + `(progn + ,defknown + (define-vop (,vop) + (:translate ,vop) + (:policy :fast-safe) + (:args (,@(first args) :target ,dst) ,@(rest args)) + (:info ,@info) + (:results ,@results) + (:arg-types ,@arg-types) + (:result-types ,@result-types) + (:generator + ,cost + (unless (location= ,dst ,src) + (inst ,mnemonic ,@prefix ,@rsyms ,@asyms ,@suffix))))))) + (:sse + (assert mnemonic) + (let ((x (first asyms)) + (y (second asyms)) + (rest (rest (rest asyms))) + (r (first rsyms))) + `(progn + ,defknown + (define-vop (,vop) + (:translate ,vop) + (:policy :fast-safe) + (:args (,@(first args) :target ,r) ,@(rest args)) + (:temporary (:sc ,(first (sb-simd-internals:value-record-scs (first argument-records)))) tmp) + (:info ,@info) + (:results ,@results) + (:arg-types ,@arg-types) + (:result-types ,@result-types) + (:generator + ,cost + (cond ((location= ,x ,r) + (inst ,mnemonic ,@prefix ,r ,y ,@rest ,@suffix)) + ((or (not (tn-p ,y)) + (not (location= ,y ,r))) + (move ,r ,x) + (inst ,mnemonic ,@prefix ,r ,y ,@rest ,@suffix)) + (t + (move tmp ,x) + (inst ,mnemonic ,@prefix tmp ,y ,@rest ,@suffix) + (move ,r tmp)))))))) + (:sse+xmm0 + (assert mnemonic) + (let ((x (first asyms)) + (y (second asyms)) + (z (third asyms)) + (r (first rsyms))) + `(progn + ,defknown + (define-vop (,vop) + (:translate ,vop) + (:policy :fast-safe) + (:args (,@(first args) :target ,r) ,(second args) (,@(third args) :target xmm0)) + (:temporary (:sc ,(first (sb-simd-internals:value-record-scs (first argument-records)))) tmp) + (:temporary (:sc ,(first (sb-simd-internals:value-record-scs (second argument-records))) + :from (:argument 0) :to :result :offset 0) xmm0) + (:info ,@info) + (:results ,@results) + (:arg-types ,@arg-types) + (:result-types ,@result-types) + (:generator + ,cost + (move xmm0 ,z) + (cond ((location= ,x ,r) + (inst ,mnemonic ,@prefix ,r ,y xmm0 ,@suffix)) + ((or (not (tn-p ,y)) + (not (location= ,y ,r))) + (move ,r ,x) + (inst ,mnemonic ,@prefix ,r ,y xmm0 ,@suffix)) + (t + (move tmp ,x) + (inst ,mnemonic ,@prefix tmp ,y xmm0 ,@suffix) + (move ,r tmp)))))))) + (:fma + (assert mnemonic) + (let ((x (first asyms)) + (y (second asyms)) + (z (third asyms)) + (rest (rest (rest (rest asyms)))) + (r (first rsyms))) + `(progn + ,defknown + (define-vop (,vop) + (:translate ,vop) + (:policy :fast-safe) + (:args (,@(first args) :target ,r) ,@(rest args)) + (:temporary (:sc ,(first (sb-simd-internals:value-record-scs (first argument-records)))) tmp) + (:info ,@info) + (:results ,@results) + (:arg-types ,@arg-types) + (:result-types ,@result-types) + (:generator + ,cost + (cond ((location= ,x ,r) + (inst ,mnemonic ,@prefix ,r ,y ,z ,@rest ,@suffix)) + ((and (or (not (tn-p ,y)) + (not (location= ,y ,r))) + (or (not (tn-p ,z)) + (not (location= ,z ,r)))) + (move ,r ,x) + (inst ,mnemonic ,@prefix ,r ,y ,z ,@rest ,@suffix)) + (t + (move tmp ,x) + (inst ,mnemonic ,@prefix tmp ,y ,z ,@rest ,@suffix) + (move ,r tmp)))))))))))) + (define-instruction-vops () + `(progn + ,@(loop for instruction-record + in (sb-simd-internals:filter-available-function-records + #'sb-simd-internals:instruction-record-p) + collect `(define-instruction-vop ,(sb-simd-internals:instruction-record-name instruction-record)))))) + (define-instruction-vops)) diff --git a/contrib/sb-simd/code/define-instructions.lisp b/contrib/sb-simd/code/define-instructions.lisp new file mode 100644 index 0000000000..5cb846d791 --- /dev/null +++ b/contrib/sb-simd/code/define-instructions.lisp @@ -0,0 +1,30 @@ +(in-package #:sb-simd-internals) + +(macrolet + ((define-instruction (name) + (with-accessors ((name instruction-record-name) + (vop instruction-record-vop) + (argument-records instruction-record-argument-records) + (encoding instruction-record-encoding) + (instruction-set instruction-record-instruction-set)) + (find-function-record name) + (let ((argument-record-names (mapcar #'record-name argument-records)) + (argument-symbols (prefixed-symbols "ARGUMENT-" (length argument-records)))) + (if (not (instruction-set-available-p instruction-set)) + `(define-missing-instruction ,name + :required-arguments ,argument-symbols) + ;; Define the actual instruction as a wrapper around the VOP + ;; that attempts to cast all arguments to the correct types. + `(define-inline ,name ,argument-symbols + (let ,(loop for argument-symbol in argument-symbols + for type in (mapcar #'value-record-name argument-records) + collect `(,argument-symbol (,type ,argument-symbol))) + (with-primitive-arguments + ,(mapcar #'list argument-symbols argument-record-names) + (,vop ,@argument-symbols)))))))) + (define-instructions () + `(progn + ,@(loop for instruction-record in (filter-function-records #'instruction-record-p) + for name = (instruction-record-name instruction-record) + collect `(define-instruction ,name))))) + (define-instructions)) diff --git a/contrib/sb-simd/code/define-modify-macros.lisp b/contrib/sb-simd/code/define-modify-macros.lisp new file mode 100644 index 0000000000..141a285324 --- /dev/null +++ b/contrib/sb-simd/code/define-modify-macros.lisp @@ -0,0 +1,142 @@ +(in-package #:sb-simd) + +(define-modify-macro f32-incf (&optional (num 1f0)) two-arg-f32+) +(define-modify-macro f32-decf (&optional (num 1f0)) two-arg-f32-) + +(define-modify-macro f64-incf (&optional (num 1d0)) two-arg-f64+) +(define-modify-macro f64-decf (&optional (num 1d0)) two-arg-f64-) + +(define-modify-macro u8-incf (&optional (num 1)) two-arg-u8+) +(define-modify-macro u8-decf (&optional (num 1)) two-arg-u8-) + +(define-modify-macro u16-incf (&optional (num 1)) two-arg-u16+) +(define-modify-macro u16-decf (&optional (num 1)) two-arg-u16-) + +(define-modify-macro u32-incf (&optional (num 1)) two-arg-u32+) +(define-modify-macro u32-decf (&optional (num 1)) two-arg-u32-) + +(define-modify-macro u64-incf (&optional (num 1)) two-arg-u64+) +(define-modify-macro u64-decf (&optional (num 1)) two-arg-u64-) + +(define-modify-macro s8-incf (&optional (num 1)) two-arg-s8+) +(define-modify-macro s8-decf (&optional (num 1)) two-arg-s8-) + +(define-modify-macro s16-incf (&optional (num 1)) two-arg-s16+) +(define-modify-macro s16-decf (&optional (num 1)) two-arg-s16-) + +(define-modify-macro s32-incf (&optional (num 1)) two-arg-s32+) +(define-modify-macro s32-decf (&optional (num 1)) two-arg-s32-) + +(define-modify-macro s64-incf (&optional (num 1)) two-arg-s64+) +(define-modify-macro s64-decf (&optional (num 1)) two-arg-s64-) + +(in-package #:sb-simd-sse) + +(define-modify-macro f32-incf (&optional (num 1f0)) two-arg-f32+) +(define-modify-macro f32-decf (&optional (num 1f0)) two-arg-f32-) + +(define-modify-macro f32.4-incf (&optional (num 1f0)) two-arg-f32.4+) +(define-modify-macro f32.4-decf (&optional (num 1f0)) two-arg-f32.4-) + +(in-package #:sb-simd-sse2) + +(define-modify-macro f64-incf (&optional (num 1d0)) two-arg-f64+) +(define-modify-macro f64-decf (&optional (num 1d0)) two-arg-f64-) + +(define-modify-macro f64.2-incf (&optional (num 1d0)) two-arg-f64.2+) +(define-modify-macro f64.2-decf (&optional (num 1d0)) two-arg-f64.2-) + +(define-modify-macro u8.16-incf (&optional (num 1)) two-arg-u8.16+) +(define-modify-macro u8.16-decf (&optional (num 1)) two-arg-u8.16-) + +(define-modify-macro u16.8-incf (&optional (num 1)) two-arg-u16.8+) +(define-modify-macro u16.8-decf (&optional (num 1)) two-arg-u16.8-) + +(define-modify-macro u32.4-incf (&optional (num 1)) two-arg-u32.4+) +(define-modify-macro u32.4-decf (&optional (num 1)) two-arg-u32.4-) + +(define-modify-macro u64.2-incf (&optional (num 1)) two-arg-u64.2+) +(define-modify-macro u64.2-decf (&optional (num 1)) two-arg-u64.2-) + +(define-modify-macro s8.16-incf (&optional (num 1)) two-arg-s8.16+) +(define-modify-macro s8.16-decf (&optional (num 1)) two-arg-s8.16-) + +(define-modify-macro s16.8-incf (&optional (num 1)) two-arg-s16.8+) +(define-modify-macro s16.8-decf (&optional (num 1)) two-arg-s16.8-) + +(define-modify-macro s32.4-incf (&optional (num 1)) two-arg-s32.4+) +(define-modify-macro s32.4-decf (&optional (num 1)) two-arg-s32.4-) + +(define-modify-macro s64.2-incf (&optional (num 1)) two-arg-s64.2+) +(define-modify-macro s64.2-decf (&optional (num 1)) two-arg-s64.2-) + +(in-package #:sb-simd-avx) + +(define-modify-macro f32-incf (&optional (num 1f0)) two-arg-f32+) +(define-modify-macro f32-decf (&optional (num 1f0)) two-arg-f32-) + +(define-modify-macro f64-incf (&optional (num 1d0)) two-arg-f64+) +(define-modify-macro f64-decf (&optional (num 1d0)) two-arg-f64-) + +(define-modify-macro f32.4-incf (&optional (num 1f0)) two-arg-f32.4+) +(define-modify-macro f32.4-decf (&optional (num 1f0)) two-arg-f32.4-) + +(define-modify-macro f32.8-incf (&optional (num 1f0)) two-arg-f32.8+) +(define-modify-macro f32.8-decf (&optional (num 1f0)) two-arg-f32.8-) + +(define-modify-macro f64.2-incf (&optional (num 1d0)) two-arg-f64.2+) +(define-modify-macro f64.2-decf (&optional (num 1d0)) two-arg-f64.2-) + +(define-modify-macro f64.4-incf (&optional (num 1d0)) two-arg-f64.4+) +(define-modify-macro f64.4-decf (&optional (num 1d0)) two-arg-f64.4-) + +(define-modify-macro u8.16-incf (&optional (num 1)) two-arg-u8.16+) +(define-modify-macro u8.16-decf (&optional (num 1)) two-arg-u8.16-) + +(define-modify-macro u16.8-incf (&optional (num 1)) two-arg-u16.8+) +(define-modify-macro u16.8-decf (&optional (num 1)) two-arg-u16.8-) + +(define-modify-macro u32.4-incf (&optional (num 1)) two-arg-u32.4+) +(define-modify-macro u32.4-decf (&optional (num 1)) two-arg-u32.4-) + +(define-modify-macro u64.2-incf (&optional (num 1)) two-arg-u64.2+) +(define-modify-macro u64.2-decf (&optional (num 1)) two-arg-u64.2-) + +(define-modify-macro s8.16-incf (&optional (num 1)) two-arg-s8.16+) +(define-modify-macro s8.16-decf (&optional (num 1)) two-arg-s8.16-) + +(define-modify-macro s16.8-incf (&optional (num 1)) two-arg-s16.8+) +(define-modify-macro s16.8-decf (&optional (num 1)) two-arg-s16.8-) + +(define-modify-macro s32.4-incf (&optional (num 1)) two-arg-s32.4+) +(define-modify-macro s32.4-decf (&optional (num 1)) two-arg-s32.4-) + +(define-modify-macro s64.2-incf (&optional (num 1)) two-arg-s64.2+) +(define-modify-macro s64.2-decf (&optional (num 1)) two-arg-s64.2-) + +(in-package #:sb-simd-avx2) + +(define-modify-macro u8.32-incf (&optional (num 1)) two-arg-u8.32+) +(define-modify-macro u8.32-decf (&optional (num 1)) two-arg-u8.32-) + +(define-modify-macro u16.16-incf (&optional (num 1)) two-arg-u16.16+) +(define-modify-macro u16.16-decf (&optional (num 1)) two-arg-u16.16-) + +(define-modify-macro u32.8-incf (&optional (num 1)) two-arg-u32.8+) +(define-modify-macro u32.8-decf (&optional (num 1)) two-arg-u32.8-) + +(define-modify-macro u64.4-incf (&optional (num 1)) two-arg-u64.4+) +(define-modify-macro u64.4-decf (&optional (num 1)) two-arg-u64.4-) + +(define-modify-macro s8.32-incf (&optional (num 1)) two-arg-s8.32+) +(define-modify-macro s8.32-decf (&optional (num 1)) two-arg-s8.32-) + +(define-modify-macro s16.16-incf (&optional (num 1)) two-arg-s16.16+) +(define-modify-macro s16.16-decf (&optional (num 1)) two-arg-s16.16-) + +(define-modify-macro s32.8-incf (&optional (num 1)) two-arg-s32.8+) +(define-modify-macro s32.8-decf (&optional (num 1)) two-arg-s32.8-) + +(define-modify-macro s64.4-incf (&optional (num 1)) two-arg-s64.4+) +(define-modify-macro s64.4-decf (&optional (num 1)) two-arg-s64.4-) + diff --git a/contrib/sb-simd/code/define-reducers.lisp b/contrib/sb-simd/code/define-reducers.lisp new file mode 100644 index 0000000000..eeb09bf9d5 --- /dev/null +++ b/contrib/sb-simd/code/define-reducers.lisp @@ -0,0 +1,37 @@ +(in-package #:sb-simd-internals) + +(macrolet + ((define-reducer (reducer-record-name) + (with-accessors ((name reducer-record-name) + (binary-operation reducer-record-binary-operation) + (initial-element reducer-record-initial-element)) + (find-function-record reducer-record-name) + (with-accessors ((binary-operation instruction-record-name) + (result-records instruction-record-result-records) + (argument-records instruction-record-argument-records)) binary-operation + (destructuring-bind ((value-record) (arg1-record arg2-record)) + (list result-records argument-records) + (assert (eq value-record arg1-record)) + (assert (eq value-record arg2-record)) + (let ((type (value-record-name value-record))) + `(progn + (defun ,name (arg &rest more-args) + (if (null more-args) + (,binary-operation (,type ,initial-element) (,type arg)) + (let ((result (,type arg))) + (declare (,type result)) + (loop for arg in more-args + do (setf result (,binary-operation result (,type arg)))) + result))) + (define-compiler-macro ,name (arg &rest more-args) + (cond ((null more-args) + `(,',binary-operation ,',initial-element (,',type ,arg))) + (t (reduce + (lambda (a b) `(,',binary-operation (,',type ,a) (,',type ,b))) + more-args + :initial-value `(,',type ,arg))))))))))) + (define-reducers () + `(progn + ,@(loop for reducer-record in (filter-function-records #'reducer-record-p) + collect `(define-reducer ,(reducer-record-name reducer-record)))))) + (define-reducers)) diff --git a/contrib/sb-simd/code/define-reffers.lisp b/contrib/sb-simd/code/define-reffers.lisp new file mode 100644 index 0000000000..d6261cb062 --- /dev/null +++ b/contrib/sb-simd/code/define-reffers.lisp @@ -0,0 +1,44 @@ +(in-package #:sb-simd-internals) + +;;; In this file, we define reffers for scalars that can be defined in +;;; terms of built-in Common Lisp functions. +(macrolet + ((define-reffers () + `(progn + ,@(loop for record in (filter-function-records + (lambda (function-record) + (eq (symbol-package + (parse-function-name + (function-record-name function-record))) + (find-package "SB-SIMD")))) + for name = (function-record-name record) + for value-record = (first (function-record-result-records record)) + for type = (value-record-name value-record) + when (aref-record-p record) collect + `(progn + (defun ,name (array &rest subscripts) + (declare (type (array ,type) array)) + (apply #'aref array subscripts)) + (define-compiler-macro ,name (array &rest subscripts) + `(aref (the (array ,',type) ,array) ,@subscripts))) + when (setf-aref-record-p record) collect + `(progn + (defun ,name (value array &rest subscripts) + (declare (type ,type value) + (type (array ,type) array)) + (setf (apply #'aref array subscripts) value)) + (define-compiler-macro ,name (value array &rest subscripts) + (let ((v (gensym "VALUE"))) + `(let ((,v ,value)) + (setf (aref (the (array ,',type) ,array) ,@subscripts) + ,v))))) + when (row-major-aref-record-p record) collect + `(define-inline ,name (array index) + (declare (type (array ,type) array)) + (row-major-aref array index)) + when (setf-row-major-aref-record-p record) collect + `(define-inline ,name (value array index) + (declare (type ,type value) + (type (array ,type) array)) + (setf (row-major-aref array index) value)))))) + (define-reffers)) diff --git a/contrib/sb-simd/code/define-rounders.lisp b/contrib/sb-simd/code/define-rounders.lisp new file mode 100644 index 0000000000..48ab85890e --- /dev/null +++ b/contrib/sb-simd/code/define-rounders.lisp @@ -0,0 +1,75 @@ +(in-package #:sb-simd-sse4.1) + +(define-inline f32.4-round (x) + (f32.4-%round x #b00)) + +(define-inline f32.4-floor (x) + (f32.4-%round x #b01)) + +(define-inline f32.4-ceiling (x) + (f32.4-%round x #b10)) + +(define-inline f32.4-truncate (x) + (f32.4-%round x #b11)) + +(define-inline f64.2-round (x) + (f64.2-%round x #b00)) + +(define-inline f64.2-floor (x) + (f64.2-%round x #b01)) + +(define-inline f64.2-ceiling (x) + (f64.2-%round x #b10)) + +(define-inline f64.2-truncate (x) + (f64.2-%round x #b11)) + +(in-package #:sb-simd-avx) + +(define-inline f32.4-round (x) + (f32.4-%round x #b00)) + +(define-inline f32.4-floor (x) + (f32.4-%round x #b01)) + +(define-inline f32.4-ceiling (x) + (f32.4-%round x #b10)) + +(define-inline f32.4-truncate (x) + (f32.4-%round x #b11)) + +(define-inline f64.2-round (x) + (f64.2-%round x #b00)) + +(define-inline f64.2-floor (x) + (f64.2-%round x #b01)) + +(define-inline f64.2-ceiling (x) + (f64.2-%round x #b10)) + +(define-inline f64.2-truncate (x) + (f64.2-%round x #b11)) + +(define-inline f32.8-round (x) + (f32.8-%round x #b00)) + +(define-inline f32.8-floor (x) + (f32.8-%round x #b01)) + +(define-inline f32.8-ceiling (x) + (f32.8-%round x #b10)) + +(define-inline f32.8-truncate (x) + (f32.8-%round x #b11)) + +(define-inline f64.4-round (x) + (f64.4-%round x #b00)) + +(define-inline f64.4-floor (x) + (f64.4-%round x #b01)) + +(define-inline f64.4-ceiling (x) + (f64.4-%round x #b10)) + +(define-inline f64.4-truncate (x) + (f64.4-%round x #b11)) diff --git a/contrib/sb-simd/code/define-scalar-casts.lisp b/contrib/sb-simd/code/define-scalar-casts.lisp new file mode 100644 index 0000000000..45cb30a735 --- /dev/null +++ b/contrib/sb-simd/code/define-scalar-casts.lisp @@ -0,0 +1,78 @@ +(in-package #:sb-simd-internals) + +;;; For each value record we define a function of the same name that will +;;; either suitably convert its argument to that value record's type, or +;;; signal an error. + +(macrolet + ((define-scalar-cast (scalar-cast-record-name) + (with-accessors ((name scalar-cast-record-name)) + (find-function-record scalar-cast-record-name) + (let ((err (mksym (symbol-package name) "CANNOT-CONVERT-TO-" name))) + `(progn + (define-notinline ,err (x) + (error "Cannot convert ~S to ~S." x ',name)) + (sb-c:defknown ,name (t) (values ,name &optional) + (sb-c:foldable) + :overwrite-fndb-silently t) + (sb-c:deftransform ,name ((x) (,name) *) + 'x) + ,@(case name + (sb-simd:f32 + `((sb-c:deftransform ,name ((x) (double-float) *) + '(coerce x 'single-float)))) + (sb-simd:f64 + `((sb-c:deftransform ,name ((x) (single-float) *) + '(coerce x 'double-float)))) + (sb-simd-sse:f32 + `((sb-c:deftransform ,name ((x) (double-float) *) + '(sb-kernel:%single-float x)) + (sb-c:deftransform ,name ((x) ((signed-byte 64)) *) + '(sb-simd-sse::f32-from-s64 x)))) + (sb-simd-sse2:f64 + `((sb-c:deftransform ,name ((x) (single-float) *) + '(sb-simd-sse2::f64-from-f32 x)) + (sb-c:deftransform ,name ((x) ((signed-byte 64)) *) + '(sb-simd-sse2::f64-from-s64 x)))) + (sb-simd-avx:f32 + `((sb-c:deftransform ,name ((x) (double-float) *) + '(sb-simd-avx::f32-from-f64 x)) + (sb-c:deftransform ,name ((x) ((signed-byte 64)) *) + '(sb-simd-avx::f32-from-s64 x)))) + (sb-simd-avx:f64 + `((sb-c:deftransform ,name ((x) (single-float) *) + '(sb-simd-avx::f64-from-f32 x)) + (sb-c:deftransform ,name ((x) ((signed-byte 64)) *) + '(sb-simd-avx::f64-from-s64 x))))) + (defun ,name (x) + (typecase x + (,name x) + ,@(case name + (sb-simd:f32 + `((double-float (coerce x 'single-float)) + (real (coerce x ',name)))) + (sb-simd:f64 + `((sb-simd-sse2:f32 (coerce x 'double-float)) + (real (coerce x ',name)))) + (sb-simd-sse:f32 + `((double-float (sb-kernel:%single-float x)) + (sb-simd-sse:s64 (sb-simd-sse::%f32-from-s64 x)) + (real (coerce x ',name)))) + (sb-simd-sse2:f64 + `((sb-simd-sse2:f32 (sb-simd-sse2::%f64-from-f32 x)) + (sb-simd-sse2:s64 (sb-simd-sse2::%f64-from-s64 x)) + (real (coerce x ',name)))) + (sb-simd-avx:f32 + `((sb-simd-avx:f64 (sb-simd-avx::%f32-from-f64 x)) + (sb-simd-avx:s64 (sb-simd-avx::%f32-from-s64 x)) + (real (coerce x ',name)))) + (sb-simd-avx:f64 + `((sb-simd-avx:f32 (sb-simd-avx::%f64-from-f32 x)) + (sb-simd-avx:s64 (sb-simd-avx::%f64-from-s64 x)) + (real (coerce x ',name))))) + (otherwise (,err x)))))))) + (define-scalar-casts () + `(progn + ,@(loop for scalar-cast-record in (filter-function-records #'scalar-cast-record-p) + collect `(define-scalar-cast ,(function-record-name scalar-cast-record)))))) + (define-scalar-casts)) diff --git a/contrib/sb-simd/code/define-simd-casts.lisp b/contrib/sb-simd/code/define-simd-casts.lisp new file mode 100644 index 0000000000..c1d49e6a69 --- /dev/null +++ b/contrib/sb-simd/code/define-simd-casts.lisp @@ -0,0 +1,92 @@ +(in-package #:sb-simd-internals) + +;;; For each SIMD data type X.Y, define two functions: +;;; +;;; 1. A function named X.Y that ensures that an object is either of the +;;; type X.Y, or a scalar that can be broadcast to the type X.Y. +;;; +;;; 2. A function named X.Y! that reinterprets the bits of another SIMD +;;; pack or suitable scalar as an X.Y. If the supplied argument has +;;; more bits than the target data type, the excess bits are discarded. +;;; If the supplied argument has less bits than the target data types, +;;; the remaining bits are set to zero. + +;;; The pXXX SIMD types are special - we define their 'cast' function +;;; manually. +(define-inline sb-simd-sse:p128 (x) (the sb-simd-sse:p128 x)) +(define-inline sb-simd-avx:p128 (x) (the sb-simd-avx:p128 x)) +(define-inline sb-simd-avx:p256 (x) (the sb-simd-avx:p256 x)) + +(macrolet + (;; We cannot call known functions directly in the definition of a + ;; cast, only their VOPs. The reason is that each known function + ;; definition uses casts to automatically upgrade its arguments, and + ;; we don't want to end up with a circular dependency. + (call-vop (instruction-record-name &rest arguments) + (with-accessors ((instruction-set instruction-record-instruction-set) + (vop instruction-record-vop)) + (find-function-record instruction-record-name) + (if (instruction-set-available-p instruction-set) + `(,vop ,@arguments) + `(progn + (missing-instruction + (load-time-value + (find-function-record ',instruction-record-name))) + (touch ,@arguments))))) + (define-simd-cast (simd-cast-record-name) + (with-accessors ((name simd-cast-record-name) + (instruction-set simd-cast-record-instruction-set) + (broadcast-record simd-cast-record-broadcast)) + (find-function-record simd-cast-record-name) + (let* ((broadcast (function-record-name broadcast-record)) + (simd-record (function-record-result-record broadcast-record)) + (real-record (simd-record-scalar-record simd-record)) + (simd-type (value-record-name simd-record)) + (real-type (value-record-name real-record)) + (package (instruction-set-package instruction-set)) + (err (mksym package "CANNOT-CONVERT-TO-" name))) + `(progn + (define-notinline ,err (x) + (error "Cannot convert ~S to ~S." x ',name)) + (sb-c:defknown ,name (t) (values ,name &optional) + (sb-c:foldable) + :overwrite-fndb-silently t) + (sb-c:deftransform ,name ((x) (,simd-type) *) + 'x) + (sb-c:deftransform ,name ((x) (real) *) + '(,broadcast (,real-type x))) + (defun ,name (x) + (typecase x + (,simd-type x) + (real (call-vop ,broadcast (,real-type x))) + (otherwise (,err x)))))))) + (define-reinterpret-cast (reinterpret-cast-record) + (with-accessors ((name reinterpret-cast-record-name) + (instruction-set reinterpret-cast-record-instruction-set) + (reinterpreters reinterpret-cast-record-reinterpreters)) + (find-function-record reinterpret-cast-record) + (let* ((package (instruction-set-package instruction-set)) + (err (mksym package "CANNOT-REINTERPRET-AS-" name))) + `(progn + (define-notinline ,err (x) + (error "Cannot reinterpret ~S as ~S." x ',name)) + (defun ,name (x) + (typecase x + ,@(loop for reinterpreter in reinterpreters + for argument-record = (first (function-record-required-argument-records reinterpreter)) + collect + `(,(value-record-name argument-record) + (call-vop ,(function-record-name reinterpreter) x))) + (otherwise (,err x)))))))) + (define-simd-casts () + `(progn + ,@(loop for simd-cast-record in (filter-function-records #'simd-cast-record-p) + collect + `(define-simd-cast ,(simd-cast-record-name simd-cast-record))))) + (define-reinterpret-casts () + `(progn + ,@(loop for reinterpret-cast-record in (filter-function-records #'reinterpret-cast-record-p) + collect + `(define-reinterpret-cast ,(reinterpret-cast-record-name reinterpret-cast-record)))))) + (define-simd-casts) + (define-reinterpret-casts)) diff --git a/contrib/sb-simd/code/define-types.lisp b/contrib/sb-simd/code/define-types.lisp new file mode 100644 index 0000000000..4812b86299 --- /dev/null +++ b/contrib/sb-simd/code/define-types.lisp @@ -0,0 +1,10 @@ +(in-package #:sb-simd-internals) + +(macrolet + ((define-types () + `(progn + ,@(loop for value-record being the hash-values of *value-records* + collect + `(deftype ,(value-record-name value-record) () + ',(value-record-type value-record)))))) + (define-types)) diff --git a/contrib/sb-simd/code/define-unequals.lisp b/contrib/sb-simd/code/define-unequals.lisp new file mode 100644 index 0000000000..23a0d9553b --- /dev/null +++ b/contrib/sb-simd/code/define-unequals.lisp @@ -0,0 +1,46 @@ +(in-package #:sb-simd-internals) + +(macrolet + ((define-unequal (unequal-record-name) + (with-accessors ((name unequal-record-name) + (neq unequal-record-neq) + (and unequal-record-and) + (truth unequal-record-truth)) + (find-function-record unequal-record-name) + (with-accessors ((neq instruction-record-name) + (result-records instruction-record-result-records) + (argument-records instruction-record-argument-records)) neq + (destructuring-bind ((result-record) (argument-record other-argument-record)) + (list result-records argument-records) + (assert (eq argument-record other-argument-record)) + (let ((and (function-record-name and)) + (result-type (value-record-name result-record)) + (argument-type (value-record-name argument-record))) + `(progn + (defun ,name (arg &rest more-args) + (let ((args (list* (,argument-type arg) (mapcar #',argument-type more-args))) + (result (,result-type ,truth))) + (declare (,result-type result)) + (loop for (a . rest) on args do + (loop for b in rest do + (setf result (,and result (,neq a b))))) + result)) + (define-compiler-macro ,name (arg &rest more-args) + (if (null more-args) + `(progn (,',argument-type ,arg) (,',result-type ,',truth)) + (let ((bindings + (loop for arg in (list* arg more-args) + collect + (list (gensym "ARG") (list ',argument-type arg))))) + `(let ,bindings + (,',and + ,@(loop for ((a nil) . rest) on bindings + append + (loop for (b nil) in rest + collect `(,',neq ,a ,b)))))))))))))) + (define-unequals () + `(progn + ,@(loop for unequal-record in (filter-function-records #'unequal-record-p) + collect + `(define-unequal ,(unequal-record-name unequal-record)))))) + (define-unequals)) diff --git a/contrib/sb-simd/code/define-vop-functions.lisp b/contrib/sb-simd/code/define-vop-functions.lisp new file mode 100644 index 0000000000..614243bb24 --- /dev/null +++ b/contrib/sb-simd/code/define-vop-functions.lisp @@ -0,0 +1,68 @@ +(in-package #:sb-simd-internals) + +;;; For constant folding, SBCL needs functions of the same name as the VOP. +;;; In this file, we define these functions. Because some VOPs cannot +;;; translate the full range of arguments supported by such a function, +;;; e.g., because one argument is expected to be a constant, we also need +;;; some macrology to have each function dispatch only to calls that can be +;;; translated. + +(defmacro with-primitive-arguments (alist &body body) + ;; Each entry in ALIST is of the form (VARIABLE VALUE-RECORD-NAME). + (if (null alist) + `(progn ,@body) + `(with-primitive-argument ,(first alist) + (with-primitive-arguments ,(rest alist) + ,@body)))) + +(defmacro with-primitive-argument ((symbol value-record) &body body) + (with-accessors ((primitive-type value-record-primitive-type) + (simd-p simd-record-p)) + (find-value-record value-record) + (etypecase primitive-type + ;; Case 1: A symbol denoting a primitive type. + (symbol + (let ((alias (find primitive-type sb-c::*backend-primitive-type-aliases* :key #'car))) + ;; ALIAS is either null or a list of the form (:OR PRIMITIVE-TYPE*) + (if (or (not simd-p) (not alias)) + `(progn ,@body) + `(etypecase ,symbol + ,@(loop for pt in (rest (rest alias)) + for type = (sb-c::primitive-type-specifier (sb-c:primitive-type-or-lose pt)) + collect `(,type ,@body)))))) + ;; Case 2: A list of the form (:CONSTANT TYPE), where TYPE is either + ;; of the form (SIGNED-BYTE N) or (UNSIGNED-BYTE N) for some positive + ;; integer N. + ((cons (eql :constant) (cons type-specifier null)) + (multiple-value-bind (low high) + (integer-type-specifier-inclusive-bounds (second primitive-type)) + `(ecase ,symbol + ,@(loop for value from low to high + collect `(,value (symbol-macrolet ((,symbol ,value)) ,@body))))))))) + +(macrolet + ((define-vop-function (name) + (with-accessors ((name instruction-record-name) + (vop instruction-record-vop) + (argument-records instruction-record-argument-records) + (encoding instruction-record-encoding) + (instruction-set instruction-record-instruction-set)) + (find-function-record name) + (let* ((argument-record-names (mapcar #'record-name argument-records)) + (argument-symbols (prefixed-symbols "ARGUMENT-" (length argument-records)))) + (unless (or (eq encoding :fake-vop) + (not (instruction-set-available-p instruction-set))) + `(defun ,vop (,@argument-symbols) + (declare + ,@(loop for argument-symbol in argument-symbols + for argument-record in argument-records + collect `(type ,(value-record-name argument-record) ,argument-symbol))) + (with-primitive-arguments ,(mapcar #'list argument-symbols argument-record-names) + (,vop ,@argument-symbols))))))) + + (define-vop-functions () + `(progn + ,@(loop for instruction-record in (filter-function-records #'instruction-record-p) + for name = (instruction-record-name instruction-record) + collect `(define-vop-function ,name))))) + (define-vop-functions)) diff --git a/contrib/sb-simd/code/define-vref-vops.lisp b/contrib/sb-simd/code/define-vref-vops.lisp new file mode 100644 index 0000000000..b68cd8f165 --- /dev/null +++ b/contrib/sb-simd/code/define-vref-vops.lisp @@ -0,0 +1,97 @@ +(in-package #:sb-vm) + +;;; Both load- and store VOPs are augmented with an auxiliary last argument +;;; that is a constant addend for the address calculation. This addend is +;;; zero by default, but we can sometimes transform the code for the index +;;; calculation such that we have a nonzero addend. We also generate two +;;; variants of the VOP - one for the general case, and one for the case +;;; where the index is a compile-time constant. + +(macrolet + ((define-vref-vop (vref-record-name) + (with-accessors ((name sb-simd-internals:vref-record-name) + (vop sb-simd-internals:vref-record-vop) + (vop-c sb-simd-internals:vref-record-vop-c) + (mnemonic sb-simd-internals:vref-record-mnemonic) + (value-record sb-simd-internals:vref-record-value-record) + (vector-record sb-simd-internals:vref-record-vector-record) + (store sb-simd-internals:store-record-p)) + (sb-simd-internals:find-function-record vref-record-name) + (let* ((vector-type (sb-simd-internals:value-record-type vector-record)) + (vector-primitive-type (sb-simd-internals:value-record-primitive-type vector-record)) + (value-scs (sb-simd-internals:value-record-scs value-record)) + (value-type (sb-simd-internals:value-record-type value-record)) + (value-primitive-type (sb-simd-internals:value-record-primitive-type value-record)) + (scalar-record + (etypecase value-record + (sb-simd-internals:simd-record (sb-simd-internals:simd-record-scalar-record value-record)) + (sb-simd-internals:value-record value-record))) + (bits-per-element (sb-simd-internals:value-record-bits scalar-record)) + (bytes-per-element (ceiling bits-per-element 8)) + (displacement + (multiple-value-bind (lo hi) + (displacement-bounds other-pointer-lowtag bits-per-element vector-data-offset) + `(integer ,lo ,hi)))) + (multiple-value-bind (index-scs scale) + (if (>= bytes-per-element (ash 1 n-fixnum-tag-bits)) + (values '(any-reg signed-reg unsigned-reg) `(index-scale ,bytes-per-element index)) + (values '(signed-reg unsigned-reg) bytes-per-element)) + `(progn + (defknown ,vop (,@(when store `(,value-type)) ,vector-type index ,displacement) + (values ,value-type &optional) + (always-translatable) + :overwrite-fndb-silently t) + (define-vop (,vop) + (:translate ,vop) + (:policy :fast-safe) + (:args + ,@(when store `((value :scs ,value-scs :target result))) + (vector :scs (descriptor-reg)) + (index :scs ,index-scs)) + (:info addend) + (:arg-types + ,@(when store `(,value-primitive-type)) + ,vector-primitive-type + positive-fixnum + (:constant ,displacement)) + (:results (result :scs ,value-scs)) + (:result-types ,value-primitive-type) + (:generator + 2 + ,@(let ((ea `(ea (+ (* vector-data-offset n-word-bytes) + (* addend ,bytes-per-element) + (- other-pointer-lowtag)) + vector index ,scale))) + (if store + `((inst ,mnemonic ,ea value) + (move result value)) + `((inst ,mnemonic result ,ea)))))) + (define-vop (,vop-c) + (:translate ,vop) + (:policy :fast-safe) + (:args ,@(when store `((value :scs ,value-scs :target result))) + (vector :scs (descriptor-reg))) + (:info index addend) + (:arg-types ,@(when store `(,value-primitive-type)) + ,vector-primitive-type + (:constant low-index) + (:constant ,displacement)) + (:results (result :scs ,value-scs)) + (:result-types ,value-primitive-type) + (:generator + 1 + ,@(let ((ea `(ea (+ (* vector-data-offset n-word-bytes) + (* ,bytes-per-element (+ index addend)) + (- other-pointer-lowtag)) + vector))) + (if store + `((inst ,mnemonic ,ea value) + (move result value)) + `((inst ,mnemonic result ,ea))))))))))) + (define-vref-vops () + `(progn + ,@(loop for vref-record + in (sb-simd-internals:filter-available-function-records + #'sb-simd-internals:vref-record-p) + collect `(define-vref-vop ,(sb-simd-internals:vref-record-name vref-record)))))) + (define-vref-vops)) diff --git a/contrib/sb-simd/code/define-vrefs.lisp b/contrib/sb-simd/code/define-vrefs.lisp new file mode 100644 index 0000000000..7ad8a43081 --- /dev/null +++ b/contrib/sb-simd/code/define-vrefs.lisp @@ -0,0 +1,44 @@ +(in-package #:sb-simd-internals) + +(macrolet + ((define-vref (name kind) + (with-accessors ((name vref-record-name) + (instruction-set vref-record-instruction-set) + (value-record vref-record-value-record) + (vector-record vref-record-vector-record) + (vop vref-record-vop)) + (find-function-record name) + (let* ((simd-width (value-record-simd-width value-record)) + (element-type + (second + (value-record-type vector-record)))) + (ecase kind + (:load + `(define-inline ,name (array index) + (declare (type (array ,element-type) array) + (index index)) + (multiple-value-bind (vector index) + (sb-kernel:%data-vector-and-index + array + (sb-kernel:check-bound array (- (array-total-size array) ,(1- simd-width)) index)) + (declare (type (simple-array ,element-type (*)) vector)) + (,vop vector index 0)))) + (:store + `(define-inline ,name (value array index) + (declare (type (array ,element-type) array) + (index index)) + (multiple-value-bind (vector index) + (sb-kernel:%data-vector-and-index + array + (sb-kernel:check-bound array (- (array-total-size array) ,(1- simd-width)) index)) + (declare (type (simple-array ,element-type (*)) vector)) + (,vop (,(value-record-name value-record) value) vector index 0)))))))) + (define-vrefs () + `(progn + ,@(loop for load-record in (filter-function-records #'load-record-p) + for name = (load-record-name load-record) + collect `(define-vref ,name :load)) + ,@(loop for store-record in (filter-function-records #'store-record-p) + for name = (store-record-name store-record) + collect `(define-vref ,name :store))))) + (define-vrefs)) diff --git a/contrib/sb-simd/code/instruction-set-case.lisp b/contrib/sb-simd/code/instruction-set-case.lisp new file mode 100644 index 0000000000..b2c54d7ad1 --- /dev/null +++ b/contrib/sb-simd/code/instruction-set-case.lisp @@ -0,0 +1,106 @@ +(in-package #:sb-simd-internals) + +;;; Lisp supports an image-based workflow, so it is entirely possible that +;;; a program is transferred from one machine to another one that supports +;;; different instructions. For example, a video game developer might +;;; create a game on a machine supporting x86 instructions up to AVX2, +;;; create an image-based executable, and ship it to a customer whose +;;; machine supports only x86 instructions up to SSE4.1. +;;; +;;; This file defines a macro for conditionally executing code based on the +;;; available instructions. Special care was taken to make this +;;; conditional selection as efficient as possible. On x86, it should +;;; compile to a jump table whose index is computed only at load time and +;;; whenever the image is restarted. + +;;; For each instruction-set-case macro appearing in source code, we +;;; register an IDISPATCH structure that tracks the available clauses, and +;;; the index of the currently active clause. Whenever the Lisp image is +;;; restarted, we traverse all IDISPATCH structures and recompute the index +;;; of the currently active clause. +(defparameter *idispatch-table* + (make-hash-table :weakness :key :synchronized t)) + +(defstruct (idispatch + (:constructor %make-idispatch) + (:predicate idispatchp)) + ;; The clauses supplied to the instruction-set-case macro. + (clauses nil :type list :read-only t) + ;; A list of lists of instruction sets - one for each clause. + (isets nil :type list :read-only t) + ;; The index of the currently active clause. + (index 0 :type (unsigned-byte 8))) + +(defun make-idispatch (isets clauses) + (let ((idispatch (%make-idispatch + :clauses clauses + :isets isets))) + (update-idispatch-index idispatch) + (setf (gethash idispatch *idispatch-table*) t) + idispatch)) + +(defun update-idispatch-index (idispatch) + (loop for index from 0 + for instruction-sets in (idispatch-isets idispatch) + when (every #'instruction-set-available-p instruction-sets) do + (setf (idispatch-index idispatch) index) + (return-from update-idispatch-index) + finally + (warn "None of the idispatch clauses in ~@ + ~{~S~%~}is available on this machine." + (idispatch-clauses idispatch)) + (setf (idispatch-index idispatch) + (length (idispatch-isets idispatch))))) + +(defun update-idispatch-indices () + (loop for idispatch being the hash-keys of *idispatch-table* do + (update-idispatch-index idispatch))) + +(pushnew 'update-idispatch-indices sb-ext:*init-hooks*) + +(defmacro instruction-set-case (&body clauses) + "Execute the first clause whose instruction sets are available at run +time, or signal an error if no clause could be run. + +Each clause has to start with an instruction set name, or a list of +instruction set names, followed by a list of statements. + +Example: + + (instruction-set-case + (:sse2 (foo)) + (:avx (bar)) + ((:avx2 :fma) (baz))) +" + (sb-int:with-unique-names (idispatch) + (multiple-value-bind (isets bodies) + (parse-instruction-set-case-clauses clauses) + `(let ((,idispatch (load-time-value (make-idispatch ',isets ',clauses)))) + (declare (idispatch ,idispatch)) + (case (idispatch-index ,idispatch) + ,@(loop for iset in isets + for body in bodies + for index from 0 + collect `(,index ,@body)) + (,(length clauses) + (idispatch-no-applicable-clause ,idispatch))))))) + +(defun parse-instruction-set-case-clauses (clauses) + (flet ((clause-iset (clause) + (unless (consp clause) + (error "Not a valid instruction-set-case clause: ~S" + clause)) + (let ((head (first clause))) + (if (listp head) + (mapcar #'find-instruction-set head) + (list (find-instruction-set head))))) + (clause-body (clause) + (rest clause))) + (values + (mapcar #'clause-iset clauses) + (mapcar #'clause-body clauses)))) + +(defun idispatch-no-applicable-clause (idispatch) + (error "None of the idispatch clauses in ~@ + ~{~S~%~}is available on this machine." + (idispatch-clauses idispatch))) diff --git a/contrib/sb-simd/code/instruction-set.lisp b/contrib/sb-simd/code/instruction-set.lisp new file mode 100644 index 0000000000..ae73d92369 --- /dev/null +++ b/contrib/sb-simd/code/instruction-set.lisp @@ -0,0 +1,152 @@ +(in-package #:sb-simd-internals) + +;;; An instruction set is a description for a set of data types and +;;; functions in a particular package. + +(defclass instruction-set (printable) + (;; The instruction set's name. + (%name + :type keyword + :initarg :name + :initform (required-argument :name) + :reader instruction-set-name) + ;; The package that holds the instruction set's symbols. + (%package + :type package + :initarg :package + :initform (required-argument :package) + :reader instruction-set-package) + ;; A thunk, returning whether the instruction set is currently available. + ;; Such a run time check is needed in the case where an executable is + ;; created on one machine and run on another machine. In that case, some + ;; of the instructions sets available on the former might not be available + ;; on the latter. + (%test + :type function + :initarg :test :initform (required-argument :test) + :reader instruction-set-test) + ;; A list of instruction sets included by this one. + (%includes + :type list + :initarg :includes + :initform '() + :reader instruction-set-includes) + ;; A hash table, mapping from function records of scalar functions to + ;; lists of function records of SIMD functions. + (%vectorizer-table + :type hash-table + :initform (make-hash-table :test #'eq) + :reader instruction-set-vectorizer-table))) + +(defmethod printable-slot-plist append ((instruction-set instruction-set)) + (list :name (instruction-set-name instruction-set) + :package (instruction-set-package instruction-set))) + +(defun instruction-set-p (x) + (typep x 'instruction-set)) + +(defun instruction-set-available-p (instruction-set) + (funcall (instruction-set-test instruction-set))) + +;;; Returns a list containing the name of the supplied instruction set, and +;;; the names of all instruction sets that are directly or indirectly +;;; included by it. +(defun included-instruction-sets (instruction-set) + (let ((result '())) + (labels ((scan (instruction-set) + (with-accessors ((includes instruction-set-includes)) instruction-set + (unless (member instruction-set result) + (push instruction-set result) + (mapcar #'scan includes))))) + (scan instruction-set) + (nreverse result)))) + +(defun register-vectorizer (X-record X.Y-record) + (assert (scalar-function-record-p X-record)) + (assert (simd-function-record-p X.Y-record)) + (with-accessors ((vectorizer-table instruction-set-vectorizer-table)) + (function-record-instruction-set X.Y-record) + (pushnew X.Y-record (gethash X-record vectorizer-table '())))) + +(defun instruction-set-vectorizers (instruction-set X-record) + (loop for instruction-set in (included-instruction-sets instruction-set) + append + (gethash X-record (instruction-set-vectorizer-table instruction-set) '()))) + +;;; A hash table, mapping from instruction set names or packages to +;;; instruction sets. +(defparameter *instruction-sets* (make-hash-table :test #'eq)) + +(defun find-instruction-set (designator &optional (errorp t)) + (or (gethash designator *instruction-sets*) + (when errorp + (typecase designator + (symbol (error "There is no instruction set with the name ~S." designator)) + (package (error "There is not instruction set with the package ~S" designator)) + (otherwise (error "Not a valid instruction set designator: ~S" designator)))))) + +(defmethod make-load-form ((instruction-set instruction-set) &optional env) + (declare (ignore env)) + `(find-instruction-set ',(instruction-set-name instruction-set))) + +(defmethod shared-initialize :after + ((instruction-set instruction-set) slot-names &key &allow-other-keys) + (setf (gethash (instruction-set-name instruction-set) *instruction-sets*) + instruction-set) + (setf (gethash (instruction-set-package instruction-set) *instruction-sets*) + instruction-set) + instruction-set) + +;;; The currently active instruction set. +(defvar *instruction-set*) + +;;; Defining Instruction Sets + +(defparameter *instruction-set-options* + '(:include :test :scalars :simd-packs :simd-casts :reinterpret-casts + :instructions :loads :stores :reffers + :associatives :reducers :comparisons :unequals :ifs)) + +(defgeneric decode-record-definition (record-name expr)) + +(defmacro define-instruction-set (name &body options) + ;; Ensure that only valid options are supplied. + (dolist (option options) + (unless (and (listp option) + (member (first option) *instruction-set-options*)) + (error "Not a valid instruction set option:~% ~S" option))) + (flet ((decode (keyword decoder) + (loop for (key . exprs) in options + when (eq key keyword) + append (mapcar decoder exprs))) + (decode-include (expr) + `(find-instruction-set ',expr)) + (record-decoder (record-name) + (lambda (x) + (decode-record-definition record-name x)))) + ;; The macro expansion of an instruction set is a very large expression + ;; that is evaluated exactly once, so compiling it would be a waste of + ;; resources. Instead, we use SBCL's built-in interpreter. + `(let ((sb-ext:*evaluator-mode* :interpret)) + (eval + '(let ((*instruction-set* + (make-instance 'instruction-set + :name ',name + :package ,(if (eq name :sb-simd) + (find-package "SB-SIMD") + (find-package (concatenate 'string "SB-SIMD-" (string name)))) + :test (lambda () (and ,@(decode :test #'identity))) + :includes (list ,@(decode :include #'decode-include))))) + ,@(decode :scalars (record-decoder 'value-record)) + ,@(decode :simd-packs (record-decoder 'simd-record)) + ,@(decode :instructions (record-decoder 'instruction-record)) + ,@(decode :loads (record-decoder 'load-record)) + ,@(decode :stores (record-decoder 'store-record)) + ,@(decode :reffers (record-decoder 'reffer-record)) + ,@(decode :associatives (record-decoder 'associative-record)) + ,@(decode :reducers (record-decoder 'reducer-record)) + ,@(decode :comparisons (record-decoder 'comparison-record)) + ,@(decode :unequals (record-decoder 'unequal-record)) + ,@(decode :ifs (record-decoder 'if-record)) + ,@(decode :simd-casts (record-decoder 'simd-cast-record)) + ,@(decode :reinterpret-casts (record-decoder 'reinterpret-cast-record))))))) diff --git a/contrib/sb-simd/code/instruction-sets/avx.lisp b/contrib/sb-simd/code/instruction-sets/avx.lisp new file mode 100644 index 0000000000..e51f075992 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/avx.lisp @@ -0,0 +1,911 @@ +(in-package #:sb-simd-avx) + +(define-instruction-set :avx + (:test (avx-supported-p)) + (:include :x86-64) + (:scalars + (f32 32 single-float #:single-float (#:single-reg)) + (f64 64 double-float #:double-float (#:double-reg))) + (:simd-packs + (p128 nil 128 #:simd-pack (#:int-sse-reg #:double-sse-reg #:single-sse-reg)) + (f32.4 f32 128 #:simd-pack-single (#:single-sse-reg)) + (f64.2 f64 128 #:simd-pack-double (#:double-sse-reg)) + (u8.16 u8 128 #:simd-pack-ub8 (#:int-sse-reg)) + (u16.8 u16 128 #:simd-pack-ub16 (#:int-sse-reg)) + (u32.4 u32 128 #:simd-pack-ub32 (#:int-sse-reg)) + (u64.2 u64 128 #:simd-pack-ub64 (#:int-sse-reg)) + (s8.16 s8 128 #:simd-pack-sb8 (#:int-sse-reg)) + (s16.8 s16 128 #:simd-pack-sb16 (#:int-sse-reg)) + (s32.4 s32 128 #:simd-pack-sb32 (#:int-sse-reg)) + (s64.2 s64 128 #:simd-pack-sb64 (#:int-sse-reg)) + (p256 nil 256 #:simd-pack-256 (#:int-avx2-reg #:double-avx2-reg #:single-avx2-reg)) + (f32.8 f32 256 #:simd-pack-256-single (#:single-avx2-reg)) + (f64.4 f64 256 #:simd-pack-256-double (#:double-avx2-reg)) + (u8.32 u8 256 #:simd-pack-256-ub8 (#:int-avx2-reg)) + (u16.16 u16 256 #:simd-pack-256-ub16 (#:int-avx2-reg)) + (u32.8 u32 256 #:simd-pack-256-ub32 (#:int-avx2-reg)) + (u64.4 u64 256 #:simd-pack-256-ub64 (#:int-avx2-reg)) + (s8.32 s8 256 #:simd-pack-256-sb8 (#:int-avx2-reg)) + (s16.16 s16 256 #:simd-pack-256-sb16 (#:int-avx2-reg)) + (s32.8 s32 256 #:simd-pack-256-sb32 (#:int-avx2-reg)) + (s64.4 s64 256 #:simd-pack-256-sb64 (#:int-avx2-reg))) + (:simd-casts + (f32.4 f32.4-broadcast) + (f64.2 f64.2-broadcast) + (f32.8 f32.8-broadcast) + (f64.4 f64.4-broadcast) + (u8.16 u8.16-broadcast) + (u16.8 u16.8-broadcast) + (u32.4 u32.4-broadcast) + (u64.2 u64.2-broadcast) + (u8.32 u8.32-broadcast) + (u16.16 u16.16-broadcast) + (u32.8 u32.8-broadcast) + (u64.4 u64.4-broadcast) + (s8.16 s8.16-broadcast) + (s16.8 s16.8-broadcast) + (s32.4 s32.4-broadcast) + (s64.2 s64.2-broadcast) + (s8.32 s8.32-broadcast) + (s16.16 s16.16-broadcast) + (s32.8 s32.8-broadcast) + (s64.4 s64.4-broadcast)) + (:reinterpret-casts + (f32! f32!-from-p128 f32!-from-p256) + (f64! f64!-from-p128 f64!-from-p256) + (u8! u8!-from-p128 u8!-from-p256) + (u16! u16!-from-p128 u16!-from-p256) + (u32! u32!-from-p128 u32!-from-p256) + (u64! u64!-from-p128 u64!-from-p256) + (f32.4! f32.4!-from-f32 f32.4!-from-p256) + (f64.2! f64.2!-from-f64 f64.2!-from-p128) + (f32.8! f32.8!-from-f32 f32.8!-from-p128 f32.8!-from-p256) + (f64.4! f64.4!-from-f64 f64.4!-from-p128 f64.4!-from-p256) + (u8.16! u8.16!-from-u8 u8.16!-from-p128 u8.16!-from-p256) + (u16.8! u16.8!-from-u16 u16.8!-from-p128 u16.8!-from-p256) + (u32.4! u32.4!-from-u32 u32.4!-from-p128 u32.4!-from-p256) + (u64.2! u64.2!-from-u64 u64.2!-from-p128 u64.2!-from-p256) + (u8.32! u8.32!-from-u8 u8.32!-from-p128 u8.32!-from-p256) + (u16.16! u16.16!-from-u16 u16.16!-from-p128 u16.16!-from-p256) + (u32.8! u32.8!-from-u32 u32.8!-from-p128 u32.8!-from-p256) + (u64.4! u64.4!-from-u64 u64.4!-from-p128 u64.4!-from-p256) + (s8.16! s8.16!-from-s8 s8.16!-from-p128 s8.16!-from-p256) + (s16.8! s16.8!-from-s16 s16.8!-from-p128 s16.8!-from-p256) + (s32.4! s32.4!-from-s32 s32.4!-from-p128 s32.4!-from-p256) + (s64.2! s64.2!-from-s64 s64.2!-from-p128 s64.2!-from-p256) + (s8.32! s8.32!-from-s8 s8.32!-from-p128 s8.32!-from-p256) + (s16.16! s16.16!-from-s16 s16.16!-from-p128 s16.16!-from-p256) + (s32.8! s32.8!-from-s32 s32.8!-from-p128 s32.8!-from-p256) + (s64.4! s64.4!-from-s64 s64.4!-from-p128 s64.4!-from-p256)) + (:instructions + (vzeroupper #:vzeroupper () () :cost 1 :pure nil) + (vzeroall #:vzeroall () () :cost 1 :pure nil) + ;; f32 + (f32-from-f64 #:vcvtsd2ss (f32) (f64) :cost 5) + (f32-from-s64 nil (f32) (s64) :cost 5 :encoding :custom) + (f32!-from-p128 nil (f32) (p128) :cost 1 :encoding :custom :always-translatable nil) + (f32!-from-p256 nil (f32) (p256) :cost 1 :encoding :custom :always-translatable nil) + (two-arg-f32-and #:vandps (f32) (f32 f32) :cost 1 :associative t) + (two-arg-f32-or #:vorps (f32) (f32 f32) :cost 1 :associative t) + (two-arg-f32-xor #:vxorps (f32) (f32 f32) :cost 1 :associative t) + (two-arg-f32-max #:vmaxss (f32) (f32 f32) :cost 1 :associative t) + (two-arg-f32-min #:vminss (f32) (f32 f32) :cost 1 :associative t) + (two-arg-f32+ #:vaddss (f32) (f32 f32) :cost 1 :associative t) + (two-arg-f32- #:vsubss (f32) (f32 f32) :cost 2) + (two-arg-f32* #:vmulss (f32) (f32 f32) :cost 2 :associative t) + (two-arg-f32/ #:vdivss (f32) (f32 f32) :cost 8) + (two-arg-f32= #:vcmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:eq) :associative t) + (two-arg-f32/= #:vcmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:neq) :associative t) + (two-arg-f32< #:vcmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:lt)) + (two-arg-f32<= #:vcmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:le)) + (two-arg-f32> #:vcmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:nle)) + (two-arg-f32>= #:vcmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:nlt)) + (f32-andc1 #:vandnps (f32) (f32 f32) :cost 1) + (f32-not nil (f32) (f32) :cost 1 :encoding :fake-vop) + (f32-reciprocal #:vrcpss (f32) (f32) :cost 5) + (f32-rsqrt #:vrsqrtss (f32) (f32) :cost 5) + (f32-sqrt #:vsqrtss (f32) (f32) :cost 15) + ;; f64 + (f64-from-f32 #:vcvtss2sd (f64) (f32) :cost 5) + (f64-from-s64 nil (f64) (s64) :cost 5 :encoding :custom) + (f64!-from-p128 nil (f64) (p128) :cost 1 :encoding :custom :always-translatable nil) + (f64!-from-p256 nil (f64) (p256) :cost 1 :encoding :custom :always-translatable nil) + (two-arg-f64-and #:vandpd (f64) (f64 f64) :cost 1 :associative t) + (two-arg-f64-or #:vorpd (f64) (f64 f64) :cost 1 :associative t) + (two-arg-f64-xor #:vxorpd (f64) (f64 f64) :cost 1 :associative t) + (two-arg-f64-max #:vmaxsd (f64) (f64 f64) :cost 1 :associative t) + (two-arg-f64-min #:vminsd (f64) (f64 f64) :cost 1 :associative t) + (two-arg-f64+ #:vaddsd (f64) (f64 f64) :cost 1 :associative t) + (two-arg-f64- #:vsubsd (f64) (f64 f64) :cost 2) + (two-arg-f64* #:vmulsd (f64) (f64 f64) :cost 2 :associative t) + (two-arg-f64/ #:vdivsd (f64) (f64 f64) :cost 8) + (two-arg-f64= #:vcmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:eq) :associative t) + (two-arg-f64/= #:vcmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:neq) :associative t) + (two-arg-f64< #:vcmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:lt)) + (two-arg-f64<= #:vcmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:le)) + (two-arg-f64> #:vcmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:nle)) + (two-arg-f64>= #:vcmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:nlt)) + (f64-andc1 #:vandnpd (f64) (f64 f64) :cost 1) + (f64-not nil (f64) (f64) :cost 1 :encoding :fake-vop) + (f64-sqrt #:vsqrtsd (f64) (f64) :cost 15) + ;; scalar reinterpret casts + ( u8!-from-p128 nil (u8) (p128) :cost 1 :encoding :fake-vop) + ( u8!-from-p256 nil (u8) (p256) :cost 1 :encoding :fake-vop) + (u16!-from-p128 nil (u16) (p128) :cost 1 :encoding :fake-vop) + (u16!-from-p256 nil (u16) (p256) :cost 1 :encoding :fake-vop) + (u32!-from-p128 nil (u32) (p128) :cost 1 :encoding :fake-vop) + (u32!-from-p256 nil (u32) (p256) :cost 1 :encoding :fake-vop) + (u64!-from-p128 #:movq (u64) (p128) :cost 1 :always-translatable nil) + (u64!-from-p256 #:movq (u64) (p256) :cost 1 :always-translatable nil) + ;; f32.4 + (f32.4-from-s32.4 #:vcvtdq2ps (f32.4) (s32.4) :cost 5) + (f32.4!-from-f32 #:vmovups (f32.4) (f32) :cost 1 :encoding :move) + (f32.4!-from-p128 #:vmovups (f32.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (f32.4!-from-p256 #:vextractf128 (f32.4) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-f32.4 nil (f32.4) (f32 f32 f32 f32) :cost 1 :encoding :fake-vop) + (f32.4-values nil (f32 f32 f32 f32) (f32.4) :cost 1 :encoding :fake-vop) + (f32.4-broadcast #:vbroadcastss (f32.4) (f32) :cost 1) + (f32.4-from-f64.4 #:vcvtpd2ps (f32.4) (f64.4) :cost 5) ;; wrong code is generated VCVTPD2PS XMM0, XMM0 + (f32.4-blend #:vblendvps (f32.4) (f32.4 f32.4 u32.4) :cost 1) + (f32.4-blendc #:vblendps (f32.4) (f32.4 f32.4 imm4) :cost 1) + (two-arg-f32.4-and #:vandps (f32.4) (f32.4 f32.4) :cost 1 :associative t) + (two-arg-f32.4-or #:vorps (f32.4) (f32.4 f32.4) :cost 1 :associative t) + (two-arg-f32.4-xor #:vxorps (f32.4) (f32.4 f32.4) :cost 1 :associative t) + (two-arg-f32.4-max #:vmaxps (f32.4) (f32.4 f32.4) :cost 3 :associative t) + (two-arg-f32.4-min #:vminps (f32.4) (f32.4 f32.4) :cost 3 :associative t) + (f32.4-andc1 #:vandnps (f32.4) (f32.4 f32.4) :cost 1) + (f32.4-not nil (f32.4) (f32.4) :cost 1 :encoding :fake-vop) + (two-arg-f32.4+ #:vaddps (f32.4) (f32.4 f32.4) :cost 2 :associative t) + (two-arg-f32.4- #:vsubps (f32.4) (f32.4 f32.4) :cost 2) + (two-arg-f32.4* #:vmulps (f32.4) (f32.4 f32.4) :cost 2 :associative t) + (two-arg-f32.4/ #:vdivps (f32.4) (f32.4 f32.4) :cost 8) + (two-arg-f32.4= #:vcmpps (u32.4) (f32.4 f32.4) :cost 4 :prefix '(:eq) :associative t) + (two-arg-f32.4/= #:vcmpps (u32.4) (f32.4 f32.4) :cost 4 :prefix '(:neq) :associative t) + (two-arg-f32.4< #:vcmpps (u32.4) (f32.4 f32.4) :cost 4 :prefix '(:lt)) + (two-arg-f32.4<= #:vcmpps (u32.4) (f32.4 f32.4) :cost 4 :prefix '(:le)) + (two-arg-f32.4> #:vcmpps (u32.4) (f32.4 f32.4) :cost 4 :prefix '(:gt)) + (two-arg-f32.4>= #:vcmpps (u32.4) (f32.4 f32.4) :cost 4 :prefix '(:ge)) + (f32.4-horizontal-and nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal-or nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal-xor nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal-max nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal-min nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal+ nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal* nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-dupeven #:vmovsldup (f32.4) (f32.4) :cost 1) + (f32.4-dupodd #:vmovshdup (f32.4) (f32.4) :cost 1) + (f32.4-addsub #:vaddsubps (f32.4) (f32.4 f32.4) :cost 3) + (f32.4-hadd #:vhaddps (f32.4) (f32.4 f32.4) :cost 6) + (f32.4-hsub #:vhsubps (f32.4) (f32.4 f32.4) :cost 6) + (f32.4-reciprocal #:vrcpps (f32.4) (f32.4) :cost 5) + (f32.4-rsqrt #:vrsqrtps (f32.4) (f32.4) :cost 5) + (f32.4-sqrt #:vsqrtps (f32.4) (f32.4) :cost 15) + (f32.4-unpackhi #:vunpckhps (f32.4) (f32.4 f32.4) :cost 1) + (f32.4-unpacklo #:vunpcklps (f32.4) (f32.4 f32.4) :cost 1) + (f32.4-movemask #:vmovmskps (u4) (f32.4) :cost 1) + (f32.4-%round #:vroundps (f32.4) (f32.4 imm3) :cost 2) + (f32.4-permute #:vpermilps (f32.4) (f32.4 imm8) :cost 1) + (f32.4-shuffle #:vshufps (f32.4) (f32.4 f32.4 imm8) :cost 1) + (f32.4-movemask #:vmovmskps (u4) (f32.4) :cost 1) + ;; f64.2 + (f64.2!-from-f64 #:vmovupd (f64.2) (f64) :cost 1 :encoding :move) + (f64.2!-from-p128 #:vmovupd (f64.2) (p128) :cost 1 :encoding :move :always-translatable nil) + (f64.2!-from-p256 #:vextractf128 (f64.2) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-f64.2 nil (f64.2) (f64 f64) :cost 1 :encoding :fake-vop) + (f64.2-values nil (f64 f64) (f64.2) :cost 1 :encoding :fake-vop) + (f64.2-broadcast #:vmovddup (f64.2) (f64) :cost 1) + (f64.2-blend #:vblendvpd (f64.2) (f64.2 f64.2 u64.2) :cost 1) + (f64.2-blendc #:vblendpd (f64.2) (f64.2 f64.2 imm2) :cost 1) + (two-arg-f64.2-and #:vandpd (f64.2) (f64.2 f64.2) :cost 1 :associative t) + (two-arg-f64.2-or #:vorpd (f64.2) (f64.2 f64.2) :cost 1 :associative t) + (two-arg-f64.2-xor #:vxorpd (f64.2) (f64.2 f64.2) :cost 1 :associative t) + (two-arg-f64.2-max #:vmaxpd (f64.2) (f64.2 f64.2) :cost 3 :associative t) + (two-arg-f64.2-min #:vminpd (f64.2) (f64.2 f64.2) :cost 3 :associative t) + (two-arg-f64.2+ #:vaddpd (f64.2) (f64.2 f64.2) :cost 2 :associative t) + (f64.2-andc1 #:vandnpd (f64.2) (f64.2 f64.2) :cost 1) + (f64.2-not nil (f64.2) (f64.2) :cost 1 :encoding :fake-vop) + (two-arg-f64.2- #:vsubpd (f64.2) (f64.2 f64.2) :cost 2) + (two-arg-f64.2* #:vmulpd (f64.2) (f64.2 f64.2) :cost 2 :associative t) + (two-arg-f64.2/ #:vdivpd (f64.2) (f64.2 f64.2) :cost 8) + (two-arg-f64.2= #:vcmppd (u64.2) (f64.2 f64.2) :cost 4 :prefix '(:eq) :associative t) + (two-arg-f64.2/= #:vcmppd (u64.2) (f64.2 f64.2) :cost 4 :prefix '(:neq) :associative t) + (two-arg-f64.2< #:vcmppd (u64.2) (f64.2 f64.2) :cost 4 :prefix '(:lt)) + (two-arg-f64.2<= #:vcmppd (u64.2) (f64.2 f64.2) :cost 4 :prefix '(:le)) + (two-arg-f64.2> #:vcmppd (u64.2) (f64.2 f64.2) :cost 4 :prefix '(:gt)) + (two-arg-f64.2>= #:vcmppd (u64.2) (f64.2 f64.2) :cost 4 :prefix '(:ge)) + (f64.2-horizontal-and nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal-or nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal-xor nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal-max nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal-min nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal+ nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal* nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-addsub #:vaddsubpd (f64.2) (f64.2 f64.2) :cost 3) + (f64.2-hadd #:vhaddpd (f64.2) (f64.2 f64.2) :cost 6) + (f64.2-hsub #:vhsubpd (f64.2) (f64.2 f64.2) :cost 6) + (f64.2-sqrt #:vsqrtpd (f64.2) (f64.2) :cost 20) + (f64.2-unpackhi #:vunpckhpd (f64.2) (f64.2 f64.2) :cost 1) + (f64.2-unpacklo #:vunpcklpd (f64.2) (f64.2 f64.2) :cost 1) + (f64.2-movemask #:vmovmskpd (u2) (f64.2) :cost 1) + (f64.2-%round #:vroundpd (f64.2) (f64.2 imm3) :cost 2) + (f64.2-permute #:vpermilpd (f64.2) (f64.2 imm2) :cost 1) + (f64.2-shuffle #:vshufpd (f64.2) (f64.2 f64.2 imm1) :cost 1) + (f64.2-movemask #:vmovmskpd (u2) (f64.2) :cost 1) + ;; f32.8 + (f32.8-from-s32.8 #:vcvtdq2ps (f32.8) (s32.8) :cost 5) + (f32.8!-from-f32 #:vmovups (f32.8) (f32) :cost 1 :encoding :move) + (f32.8!-from-p128 #:vmovups (f32.8) (p128) :cost 1 :encoding :move :always-translatable nil) + (f32.8!-from-p256 #:vmovups (f32.8) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-f32.8 nil (f32.8) (f32 f32 f32 f32 f32 f32 f32 f32) :cost 1 :encoding :fake-vop) + (f32.8-values nil (f32 f32 f32 f32 f32 f32 f32 f32) (f32.8) :cost 1 :encoding :fake-vop) + (f32.8-broadcast #:vbroadcastss (f32.8) (f32) :cost 1) + (f32.8-from-u32.8 #:vcvtdq2ps (f32.8) (u32.8) :cost 5) + (f32.8-blend #:vblendvps (f32.8) (f32.8 f32.8 u32.8) :cost 1) + (f32.8-blendc #:vblendps (f32.8) (f32.8 f32.8 imm8) :cost 1) + (two-arg-f32.8-and #:vandps (f32.8) (f32.8 f32.8) :cost 1 :associative t) + (two-arg-f32.8-or #:vorps (f32.8) (f32.8 f32.8) :cost 1 :associative t) + (two-arg-f32.8-xor #:vxorps (f32.8) (f32.8 f32.8) :cost 1 :associative t) + (two-arg-f32.8-max #:vmaxps (f32.8) (f32.8 f32.8) :cost 3 :associative t) + (two-arg-f32.8-min #:vminps (f32.8) (f32.8 f32.8) :cost 3 :associative t) + (f32.8-andc1 #:vandnps (f32.8) (f32.8 f32.8) :cost 1) + (f32.8-not nil (f32.8) (f32.8) :cost 1 :encoding :fake-vop) + (two-arg-f32.8+ #:vaddps (f32.8) (f32.8 f32.8) :cost 2 :associative t) + (two-arg-f32.8- #:vsubps (f32.8) (f32.8 f32.8) :cost 2) + (two-arg-f32.8* #:vmulps (f32.8) (f32.8 f32.8) :cost 2 :associative t) + (two-arg-f32.8/ #:vdivps (f32.8) (f32.8 f32.8) :cost 8) + (two-arg-f32.8= #:vcmpps (u32.8) (f32.8 f32.8) :cost 4 :prefix '(:eq) :associative t) + (two-arg-f32.8/= #:vcmpps (u32.8) (f32.8 f32.8) :cost 4 :prefix '(:neq) :associative t) + (two-arg-f32.8< #:vcmpps (u32.8) (f32.8 f32.8) :cost 4 :prefix '(:lt)) + (two-arg-f32.8<= #:vcmpps (u32.8) (f32.8 f32.8) :cost 4 :prefix '(:le)) + (two-arg-f32.8> #:vcmpps (u32.8) (f32.8 f32.8) :cost 4 :prefix '(:gt)) + (two-arg-f32.8>= #:vcmpps (u32.8) (f32.8 f32.8) :cost 4 :prefix '(:ge)) + (f32.8-horizontal-and nil (f32) (f32.8) :cost 5 :encoding :fake-vop) + (f32.8-horizontal-or nil (f32) (f32.8) :cost 5 :encoding :fake-vop) + (f32.8-horizontal-xor nil (f32) (f32.8) :cost 5 :encoding :fake-vop) + (f32.8-horizontal-max nil (f32) (f32.8) :cost 5 :encoding :fake-vop) + (f32.8-horizontal-min nil (f32) (f32.8) :cost 5 :encoding :fake-vop) + (f32.8-horizontal+ nil (f32) (f32.8) :cost 5 :encoding :fake-vop) + (f32.8-horizontal* nil (f32) (f32.8) :cost 5 :encoding :fake-vop) + (f32.8-dupeven #:vmovsldup (f32.8) (f32.8) :cost 1) + (f32.8-dupodd #:vmovshdup (f32.8) (f32.8) :cost 1) + (f32.8-hadd #:vhaddps (f32.8) (f32.8 f32.8) :cost 6) + (f32.8-hsub #:vhsubps (f32.8) (f32.8 f32.8) :cost 6) + (f32.8-reciprocal #:vrcpps (f32.8) (f32.8) :cost 5) + (f32.8-rsqrt #:vrsqrtps (f32.8) (f32.8) :cost 5) + (f32.8-sqrt #:vsqrtps (f32.8) (f32.8) :cost 15) + (f32.8-unpackhi #:vunpckhps (f32.8) (f32.8 f32.8) :cost 1) + (f32.8-unpacklo #:vunpcklps (f32.8) (f32.8 f32.8) :cost 1) + (f32.8-movemask #:vmovmskps (u8) (f32.8) :cost 1) + (f32.8-%round #:vroundps (f32.8) (f32.8 imm3) :cost 2) + (f32.8-permute #:vpermilps (f32.8) (f32.8 imm8) :cost 1) + (f32.8-permute128 #:vperm2f128 (f32.8) (f32.8 f32.8 imm8) :cost 1) + (f32.8-shuffle #:vshufps (f32.8) (f32.8 f32.8 imm8) :cost 1) + (f32.4-from-f32.8 #:vextractf128 (f32.4) (f32.8 imm1) :cost 1) + (f32.8-insert-f32.4 #:vinsertf128 (f32.8) (f32.8 f32.4 imm1) :cost 1) + (f32.8-movemask #:vmovmskps (u8) (f32.8) :cost 1) + ;; f64.4 + (f64.4!-from-f64 #:vmovupd (f64.4) (f64) :cost 1 :encoding :move) + (f64.4!-from-p128 #:vmovupd (f64.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (f64.4!-from-p256 #:vmovupd (f64.4) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-f64.4 nil (f64.4) (f64 f64 f64 f64) :cost 1 :encoding :fake-vop) + (f64.4-values nil (f64 f64 f64 f64) (f64.4) :cost 1 :encoding :fake-vop) + (f64.4-broadcast #:vbroadcastsd (f64.4) (f64) :cost 1) + (f64.4-from-f32.4 #:vcvtps2pd (f64.4) (f32.4) :cost 5) + (f64.4-from-u32.4 #:vcvtdq2pd (f64.4) (u32.4) :cost 5) + (f64.4-from-s32.4 #:vcvtdq2pd (f64.4) (s32.4) :cost 5) + (f64.4-blend #:vblendvpd (f64.4) (f64.4 f64.4 u64.4) :cost 1) + (f64.4-blendc #:vblendpd (f64.4) (f64.4 f64.4 imm4) :cost 1) + (two-arg-f64.4-and #:vandpd (f64.4) (f64.4 f64.4) :cost 1 :associative t) + (two-arg-f64.4-or #:vorpd (f64.4) (f64.4 f64.4) :cost 1 :associative t) + (two-arg-f64.4-xor #:vxorpd (f64.4) (f64.4 f64.4) :cost 1 :associative t) + (two-arg-f64.4-max #:vmaxpd (f64.4) (f64.4 f64.4) :cost 3 :associative t) + (two-arg-f64.4-min #:vminpd (f64.4) (f64.4 f64.4) :cost 3 :associative t) + (two-arg-f64.4+ #:vaddpd (f64.4) (f64.4 f64.4) :cost 2 :associative t) + (two-arg-f64.4- #:vsubpd (f64.4) (f64.4 f64.4) :cost 2) + (two-arg-f64.4* #:vmulpd (f64.4) (f64.4 f64.4) :cost 2 :associative t) + (two-arg-f64.4/ #:vdivpd (f64.4) (f64.4 f64.4) :cost 8) + (two-arg-f64.4= #:vcmppd (u64.4) (f64.4 f64.4) :cost 4 :prefix '(:eq) :associative t) + (two-arg-f64.4/= #:vcmppd (u64.4) (f64.4 f64.4) :cost 4 :prefix '(:neq) :associative t) + (two-arg-f64.4< #:vcmppd (u64.4) (f64.4 f64.4) :cost 4 :prefix '(:lt)) + (two-arg-f64.4<= #:vcmppd (u64.4) (f64.4 f64.4) :cost 4 :prefix '(:le)) + (two-arg-f64.4> #:vcmppd (u64.4) (f64.4 f64.4) :cost 4 :prefix '(:gt)) + (two-arg-f64.4>= #:vcmppd (u64.4) (f64.4 f64.4) :cost 4 :prefix '(:ge)) + (f64.4-horizontal-and nil (f64) (f64.4) :cost 3 :encoding :fake-vop) + (f64.4-horizontal-or nil (f64) (f64.4) :cost 3 :encoding :fake-vop) + (f64.4-horizontal-xor nil (f64) (f64.4) :cost 3 :encoding :fake-vop) + (f64.4-horizontal-max nil (f64) (f64.4) :cost 3 :encoding :fake-vop) + (f64.4-horizontal-min nil (f64) (f64.4) :cost 3 :encoding :fake-vop) + (f64.4-horizontal+ nil (f64) (f64.4) :cost 3 :encoding :fake-vop) + (f64.4-horizontal* nil (f64) (f64.4) :cost 3 :encoding :fake-vop) + (f64.4-andc1 #:vandnpd (f64.4) (f64.4 f64.4) :cost 1) + (f64.4-not nil (f64.4) (f64.4) :cost 1 :encoding :fake-vop) + (f64.4-dupeven #:vmovddup (f64.4) (f64.4) :cost 1) + (f64.4-hadd #:vhaddpd (f64.4) (f64.4 f64.4) :cost 6) + (f64.4-hsub #:vhsubpd (f64.4) (f64.4 f64.4) :cost 6) + (f64.4-sqrt #:vsqrtpd (f64.4) (f64.4) :cost 20) + (f64.4-unpackhi #:vunpckhpd (f64.4) (f64.4 f64.4) :cost 1) + (f64.4-unpacklo #:vunpcklpd (f64.4) (f64.4 f64.4) :cost 1) + (f64.4-movemask #:vmovmskpd (u4) (f64.4) :cost 1) + (f64.4-%round #:vroundpd (f64.4) (f64.4 imm3) :cost 2) + (f64.4-permute #:vpermilpd (f64.4) (f64.4 imm4) :cost 1) + (f64.4-permute128 #:vperm2f128 (f64.4) (f64.4 f64.4 imm8) :cost 1) + (f64.4-shuffle #:vshufpd (f64.4) (f64.4 f64.4 imm2) :cost 1) + (f64.4-reverse #:vpermilpd (f64.4) (f64.4) :cost 2 :encoding :fake-vop) + (f64.2-from-f64.4 #:vextractf128 (f64.2) (f64.4 imm1) :cost 1) + (f64.4-insert-f64.2 #:vinsertf128 (f64.4) (f64.4 f64.2 imm1) :cost 1) + (f64.4-set128 #:vinsertf128 (f64.4) (f64.2 f64.2 imm1) :cost 1) + (f64.4-movemask #:vmovmskpd (u4) (f64.4) :cost 1) + ;; u8.16 + (u8.16!-from-u8 #:movq (u8.16) (u8) :cost 1) + (u8.16!-from-p128 #:vmovdqu (u8.16) (p128) :cost 1 :encoding :move :always-translatable nil) + (u8.16!-from-p256 #:vextractf128 (u8.16) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-u8.16 nil (u8.16) (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) :cost 1 :encoding :fake-vop) + (u8.16-values nil (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) (u8.16) :cost 1 :encoding :fake-vop) + (u8.16-broadcast nil (u8.16) (u8) :cost 1 :encoding :fake-vop) + (u8.16-blend #:vpblendvb (u8.16) (u8.16 u8.16 u8.16) :cost 1) + (two-arg-u8.16-and #:vpand (u8.16) (u8.16 u8.16) :cost 1 :associative t) + (two-arg-u8.16-or #:vpor (u8.16) (u8.16 u8.16) :cost 1 :associative t) + (two-arg-u8.16-xor #:vpxor (u8.16) (u8.16 u8.16) :cost 1 :associative t) + (u8.16-andc1 #:vpandn (u8.16) (u8.16 u8.16) :cost 1) + (u8.16-not nil (u8.16) (u8.16) :cost 1 :encoding :fake-vop) + (two-arg-u8.16+ #:vpaddb (u8.16) (u8.16 u8.16) :cost 2 :associative t) + (two-arg-u8.16- #:vpsubb (u8.16) (u8.16 u8.16) :cost 2) + (two-arg-u8.16= #:vpcmpeqb (u8.16) (u8.16 u8.16) :cost 1 :associative t) + (two-arg-u8.16/= nil (u8.16) (u8.16 u8.16) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u8.16>~ #:vpcmpgtb (u8.16) (u8.16 u8.16) :cost 1) + (two-arg-u8.16> nil (u8.16) (u8.16 u8.16) :cost 1 :encoding :fake-vop) + (two-arg-u8.16< nil (u8.16) (u8.16 u8.16) :cost 1 :encoding :fake-vop) + (two-arg-u8.16>= nil (u8.16) (u8.16 u8.16) :cost 2 :encoding :fake-vop) + (two-arg-u8.16<= nil (u8.16) (u8.16 u8.16) :cost 2 :encoding :fake-vop) + (u8.16-unpackhi #:vpunpckhbw (u8.16) (u8.16 u8.16) :cost 1) + (u8.16-unpacklo #:vpunpcklbw (u8.16) (u8.16 u8.16) :cost 1) + (u8.16-movemask #:vpmovmskb (u16) (u8.16) :cost 1) + (u8.16-shuffle #:vpshufb (u8.16) (u8.16 u8.16) :cost 1) ;; TODO missing imm + ;; u16.8 + (u16.8!-from-u16 #:movq (u16.8) (u16) :cost 1) + (u16.8!-from-p128 #:vmovdqu (u16.8) (p128) :cost 1 :encoding :move :always-translatable nil) + (u16.8!-from-p256 #:vextractf128 (u16.8) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-u16.8 nil (u16.8) (u16 u16 u16 u16 u16 u16 u16 u16) :cost 1 :encoding :fake-vop) + (u16.8-values nil (u16 u16 u16 u16 u16 u16 u16 u16) (u16.8) :cost 1 :encoding :fake-vop) + (u16.8-broadcast nil (u16.8) (u16) :cost 1 :encoding :fake-vop) + (u16.8-blend #:vpblendvb (u16.8) (u16.8 u16.8 u16.8) :cost 1) + (two-arg-u16.8-and #:vpand (u16.8) (u16.8 u16.8) :cost 1 :associative t) + (two-arg-u16.8-or #:vpor (u16.8) (u16.8 u16.8) :cost 1 :associative t) + (two-arg-u16.8-xor #:vpxor (u16.8) (u16.8 u16.8) :cost 1 :associative t) + (u16.8-andc1 #:vpandn (u16.8) (u16.8 u16.8) :cost 1) + (u16.8-not nil (u16.8) (u16.8) :cost 1 :encoding :fake-vop) + (two-arg-u16.8+ #:vpaddw (u16.8) (u16.8 u16.8) :cost 2 :associative t) + (two-arg-u16.8- #:vpsubw (u16.8) (u16.8 u16.8) :cost 2) + (two-arg-u16.8= #:vpcmpeqw (u16.8) (u16.8 u16.8) :cost 1 :associative t) + (two-arg-u16.8/= nil (u16.8) (u16.8 u16.8) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u16.8>~ #:vpcmpgtw (u16.8) (u16.8 u16.8) :cost 1) + (two-arg-u16.8> nil (u16.8) (u16.8 u16.8) :cost 1 :encoding :fake-vop) + (two-arg-u16.8< nil (u16.8) (u16.8 u16.8) :cost 1 :encoding :fake-vop) + (two-arg-u16.8>= nil (u16.8) (u16.8 u16.8) :cost 2 :encoding :fake-vop) + (two-arg-u16.8<= nil (u16.8) (u16.8 u16.8) :cost 2 :encoding :fake-vop) + (u16.8-shiftl #:vpsllw (u16.8) (u16.8 u16.8) :cost 1) + (u16.8-shiftr #:vpsrlw (u16.8) (u16.8 u16.8) :cost 1) + (u16.8-unpackhi #:vpunpckhwd (u16.8) (u16.8 u16.8) :cost 1) + (u16.8-unpacklo #:vpunpcklwd (u16.8) (u16.8 u16.8) :cost 1) + (u16.8-movemask nil (u8) (u16.8) :cost 1 :encoding :fake-vop) + (u16.8-shufflehi #:vpshufhw (u16.8) (u16.8 imm8) :cost 1) + (u16.8-shufflelo #:vpshuflw (u16.8) (u16.8 imm8) :cost 1) + ;; u32.4 + (u32.4!-from-u32 #:movq (u32.4) (u32) :cost 1) + (u32.4!-from-p128 #:vmovdqu (u32.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (u32.4!-from-p256 #:vextractf128 (u32.4) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-u32.4 nil (u32.4) (u32 u32 u32 u32) :cost 1 :encoding :fake-vop) + (u32.4-values nil (u32 u32 u32 u32) (u32.4) :cost 1 :encoding :fake-vop) + (u32.4-broadcast nil (u32.4) (u32) :cost 1 :encoding :fake-vop) + (u32.4-blend #:vpblendvb (u32.4) (u32.4 u32.4 u32.4) :cost 1) + (two-arg-u32.4-and #:vpand (u32.4) (u32.4 u32.4) :cost 1 :associative t) + (two-arg-u32.4-or #:vpor (u32.4) (u32.4 u32.4) :cost 1 :associative t) + (two-arg-u32.4-xor #:vpxor (u32.4) (u32.4 u32.4) :cost 1 :associative t) + (u32.4-andc1 #:vpandn (u32.4) (u32.4 u32.4) :cost 1) + (u32.4-not nil (u32.4) (u32.4) :cost 1 :encoding :fake-vop) + (two-arg-u32.4+ #:vpaddd (u32.4) (u32.4 u32.4) :cost 2 :associative t) + (two-arg-u32.4- #:vpsubd (u32.4) (u32.4 u32.4) :cost 2) + (two-arg-u32.4= #:vpcmpeqd (u32.4) (u32.4 u32.4) :cost 1 :associative t) + (two-arg-u32.4/= nil (u32.4) (u32.4 u32.4) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u32.4>~ #:vpcmpgtd (u32.4) (u32.4 u32.4) :cost 1) + (two-arg-u32.4> nil (u32.4) (u32.4 u32.4) :cost 1 :encoding :fake-vop) + (two-arg-u32.4< nil (u32.4) (u32.4 u32.4) :cost 1 :encoding :fake-vop) + (two-arg-u32.4>= nil (u32.4) (u32.4 u32.4) :cost 2 :encoding :fake-vop) + (two-arg-u32.4<= nil (u32.4) (u32.4 u32.4) :cost 2 :encoding :fake-vop) + (u32.4-unpackhi #:vpunpckhdq (u32.4) (u32.4 u32.4) :cost 1) + (u32.4-unpacklo #:vpunpckldq (u32.4) (u32.4 u32.4) :cost 1) + (u32.4-movemask #:vmovmskps (u4) (u32.4) :cost 1) + (u32.4-permute #:vpermilps (u32.4) (u32.4 imm8) :cost 1) + ;; u64.2 + (u64.2!-from-u64 #:movq (u64.2) (u64) :cost 1) + (u64.2!-from-p128 #:vmovdqu (u64.2) (p128) :cost 1 :encoding :move :always-translatable nil) + (u64.2!-from-p256 #:vextractf128 (u64.2) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-u64.2 nil (u64.2) (u64 u64) :cost 1 :encoding :fake-vop) + (u64.2-values nil (u64 u64) (u64.2) :cost 1 :encoding :fake-vop) + (u64.2-broadcast nil (u64.2) (u64) :cost 1 :encoding :fake-vop) + (u64.2-from-u64 #:movq (u64.2) (u64) :cost 1) + (u64.2-blend #:vpblendvb (u64.2) (u64.2 u64.2 u64.2) :cost 1) + (two-arg-u64.2-and #:vpand (u64.2) (u64.2 u64.2) :cost 1 :associative t) + (two-arg-u64.2-or #:vpor (u64.2) (u64.2 u64.2) :cost 1 :associative t) + (two-arg-u64.2-xor #:vpxor (u64.2) (u64.2 u64.2) :cost 1 :associative t) + (u64.2-andc1 #:vpandn (u64.2) (u64.2 u64.2) :cost 1) + (u64.2-not nil (u64.2) (u64.2) :cost 1 :encoding :fake-vop) + (two-arg-u64.2+ #:vpaddq (u64.2) (u64.2 u64.2) :cost 2 :associative t) + (two-arg-u64.2- #:vpsubq (u64.2) (u64.2 u64.2) :cost 2) + (two-arg-u64.2= #:vpcmpeqq (u64.2) (u64.2 u64.2) :cost 1 :associative t) + (two-arg-u64.2/= nil (u64.2) (u64.2 u64.2) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u64.2>~ #:vpcmpgtq (u64.2) (u64.2 u64.2) :cost 1) + (two-arg-u64.2> nil (u64.2) (u64.2 u64.2) :cost 1 :encoding :fake-vop) + (two-arg-u64.2< nil (u64.2) (u64.2 u64.2) :cost 1 :encoding :fake-vop) + (two-arg-u64.2>= nil (u64.2) (u64.2 u64.2) :cost 2 :encoding :fake-vop) + (two-arg-u64.2<= nil (u64.2) (u64.2 u64.2) :cost 2 :encoding :fake-vop) + (u64.2-unpackhi #:vpunpckhqdq (u64.2) (u64.2 u64.2) :cost 1) + (u64.2-unpacklo #:vpunpcklqdq (u64.2) (u64.2 u64.2) :cost 1) + (u64.2-movemask #:vmovmskpd (u2) (u64.2) :cost 1) + (u64.2-permute #:vpermilpd (u64.2) (u64.2 imm8) :cost 1) + ;; u8.32 + (u8.32!-from-u8 #:movq (u8.32) (u8) :cost 1) + (u8.32!-from-p128 #:vmovdqu (u8.32) (p128) :cost 1 :encoding :move :always-translatable nil) + (u8.32!-from-p256 #:vmovdqu (u8.32) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-u8.32 nil (u8.32) (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) :cost 1 :encoding :fake-vop) + (u8.32-values nil (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) (u8.32) :cost 1 :encoding :fake-vop) + (u8.32-broadcast nil (u8.32) (u8) :cost 1 :encoding :fake-vop) + (u8.16-from-u8.32 #:vextractf128 (u8.16) (u8.32 imm1) :cost 1) + (u8.32-insert-u8.16 #:vinsertf128 (u8.32) (u8.32 u8.16 imm1) :cost 1) + ;; u16.16 + (u16.16!-from-u16 #:movq (u16.16) (u16) :cost 1) + (u16.16!-from-p128 #:vmovdqu (u16.16) (p128) :cost 1 :encoding :move :always-translatable nil) + (u16.16!-from-p256 #:vmovdqu (u16.16) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-u16.16 nil (u16.16) (u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16) :cost 1 :encoding :fake-vop) + (u16.16-values nil (u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16) (u16.16) :cost 1 :encoding :fake-vop) + (u16.16-broadcast nil (u16.16) (u16) :cost 1 :encoding :fake-vop) + (u16.8-from-u16.16 #:vextractf128 (u16.8) (u16.16 imm1) :cost 1) + (u16.16-insert-u16.8 #:vinsertf128 (u16.16) (u16.16 u16.8 imm1) :cost 1) + ;; u32.8 + (u32.8!-from-u32 #:movq (u32.8) (u32) :cost 1) + (u32.8!-from-p128 #:vmovdqu (u32.8) (p128) :cost 1 :encoding :move :always-translatable nil) + (u32.8!-from-p256 #:vmovdqu (u32.8) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-u32.8 nil (u32.8) (u32 u32 u32 u32 u32 u32 u32 u32) :cost 1 :encoding :fake-vop) + (two-arg-u32.8-and #:vandps (u32.8) (u32.8 u32.8) :cost 1 :associative t) + (u32.8-values nil (u32 u32 u32 u32 u32 u32 u32 u32) (u32.8) :cost 1 :encoding :fake-vop) + (u32.8-broadcast nil (u32.8) (u32) :cost 1 :encoding :fake-vop) + (u32.8-permute #:vpermilps (u32.8) (u32.4 imm8) :cost 1) + (u32.4-from-u32.8 #:vextractf128 (u32.4) (u32.8 imm1) :cost 1) + (u32.8-insert-u32.4 #:vinsertf128 (u32.8) (u32.8 u32.4 imm1) :cost 1) + ;; u64.4 + (u64.4!-from-u64 #:movq (u64.4) (u64) :cost 1) + (u64.4!-from-p128 #:vmovdqu (u64.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (u64.4!-from-p256 #:vmovdqu (u64.4) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-u64.4 nil (u64.4) (u64 u64 u64 u64) :cost 1 :encoding :fake-vop) + (two-arg-u64.4-and #:vandpd (u64.4) (u64.4 u64.4) :cost 1 :associative t) + (u64.4-values nil (u64 u64 u64 u64) (u64.4) :cost 1 :encoding :fake-vop) + (u64.4-broadcast nil (u64.4) (u64) :cost 1 :encoding :fake-vop) + (u64.4-permute #:vpermilpd (u64.4) (u64.4 imm8) :cost 1) + (u64.2-from-u64.4 #:vextractf128 (u64.2) (u64.4 imm1) :cost 1) + (u64.4-insert-u64.2 #:vinsertf128 (u64.4) (u64.4 u64.2 imm1) :cost 1) + ;; s8.16 + (s8.16!-from-s8 nil (s8.16) (s8) :cost 1 :encoding :fake-vop) + (s8.16!-from-p128 #:vmovdqu (s8.16) (p128) :cost 1 :encoding :move :always-translatable nil) + (s8.16!-from-p256 #:vextractf128 (s8.16) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-s8.16 nil (s8.16) (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) :cost 1 :encoding :fake-vop) + (s8.16-values nil (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) (s8.16) :cost 1 :encoding :fake-vop) + (s8.16-broadcast nil (s8.16) (s8) :cost 1 :encoding :fake-vop) + (s8.16-blend #:vpblendvb (s8.16) (s8.16 s8.16 u8.16) :cost 1) + (two-arg-s8.16-and #:vpand (s8.16) (s8.16 s8.16) :cost 1 :associative t) + (two-arg-s8.16-or #:vpor (s8.16) (s8.16 s8.16) :cost 1 :associative t) + (two-arg-s8.16-xor #:vpxor (s8.16) (s8.16 s8.16) :cost 1 :associative t) + (s8.16-andc1 #:vpandn (s8.16) (s8.16 s8.16) :cost 1) + (s8.16-not nil (s8.16) (s8.16) :cost 1 :encoding :fake-vop) + (two-arg-s8.16+ #:vpaddb (s8.16) (s8.16 s8.16) :cost 2 :associative t) + (two-arg-s8.16- #:vpsubb (s8.16) (s8.16 s8.16) :cost 2) + (two-arg-s8.16= #:vpcmpeqb (u8.16) (s8.16 s8.16) :cost 1 :associative t) + (two-arg-s8.16/= nil (u8.16) (s8.16 s8.16) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s8.16> #:vpcmpgtb (u8.16) (s8.16 s8.16) :cost 1) + (two-arg-s8.16< nil (u8.16) (s8.16 s8.16) :cost 1 :encoding :fake-vop) + (two-arg-s8.16>= nil (u8.16) (s8.16 s8.16) :cost 2 :encoding :fake-vop) + (two-arg-s8.16<= nil (u8.16) (s8.16 s8.16) :cost 2 :encoding :fake-vop) + (s8.16-unpackhi #:vpunpckhbw (s8.16) (s8.16 s8.16) :cost 1) + (s8.16-unpacklo #:vpunpcklbw (s8.16) (s8.16 s8.16) :cost 1) + (s8.16-movemask #:vpmovmskb (u16) (s8.16) :cost 1) + (s8.16-shuffle #:vpshufb (s8.16) (s8.16 u8.16) :cost 1) + ;; s16.8 + (s16.8!-from-s16 nil (s16.8) (s16) :cost 1 :encoding :fake-vop) + (s16.8!-from-p128 #:vmovdqu (s16.8) (p128) :cost 1 :encoding :move :always-translatable nil) + (s16.8!-from-p256 #:vextractf128 (s16.8) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-s16.8 nil (s16.8) (s16 s16 s16 s16 s16 s16 s16 s16) :cost 1 :encoding :fake-vop) + (s16.8-values nil (s16 s16 s16 s16 s16 s16 s16 s16) (s16.8) :cost 1 :encoding :fake-vop) + (s16.8-broadcast nil (s16.8) (s16) :cost 1 :encoding :fake-vop) + (s16.8-blend #:vpblendvb (s16.8) (s16.8 s16.8 u16.8) :cost 1) + (two-arg-s16.8-and #:vpand (s16.8) (s16.8 s16.8) :cost 1 :associative t) + (two-arg-s16.8-or #:vpor (s16.8) (s16.8 s16.8) :cost 1 :associative t) + (two-arg-s16.8-xor #:vpxor (s16.8) (s16.8 s16.8) :cost 1 :associative t) + (s16.8-andc1 #:vpandn (s16.8) (s16.8 s16.8) :cost 1) + (s16.8-not nil (s16.8) (s16.8) :cost 1 :encoding :fake-vop) + (two-arg-s16.8+ #:vpaddw (s16.8) (s16.8 s16.8) :cost 2 :associative t) + (two-arg-s16.8- #:vpsubw (s16.8) (s16.8 s16.8) :cost 2) + (two-arg-s16.8-mullo #:vpmullw (s16.8) (s16.8 s16.8) :cost 2 :associative t) + (s16.8-shiftl #:vpsllq (s16.8) (s16.8 s16.8) :cost 1) + (s16.8-shiftr #:vpsrlq (s16.8) (s16.8 s16.8) :cost 1) + (two-arg-s16.8= #:vpcmpeqw (u16.8) (s16.8 s16.8) :cost 1 :associative t) + (two-arg-s16.8/= nil (u16.8) (s16.8 s16.8) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s16.8> #:vpcmpgtw (u16.8) (s16.8 s16.8) :cost 1) + (two-arg-s16.8< nil (u16.8) (s16.8 s16.8) :cost 1 :encoding :fake-vop) + (two-arg-s16.8>= nil (u16.8) (s16.8 s16.8) :cost 2 :encoding :fake-vop) + (two-arg-s16.8<= nil (u16.8) (s16.8 s16.8) :cost 2 :encoding :fake-vop) + (s16.8-shiftl #:vpsllw (s16.8) (s16.8 s16.8) :cost 1) + (s16.8-shiftr #:vpsrlw (s16.8) (s16.8 s16.8) :cost 1) + (s16.8-unpackhi #:vpunpckhwd (s16.8) (s16.8 s16.8) :cost 1) + (s16.8-unpacklo #:vpunpcklwd (s16.8) (s16.8 s16.8) :cost 1) + (s16.8-movemask nil (u8) (s16.8) :cost 1 :encoding :fake-vop) + (s16.8-shufflehi #:vpshufhw (s16.8) (s16.8 imm8) :cost 1) + (s16.8-shufflelo #:vpshuflw (s16.8) (s16.8 imm8) :cost 1) + (two-arg-s16.8-mullo #:vpmullw (s16.8) (s16.8 s16.8) :cost 2 :associative t) + ;; s32.4 + (s32.4!-from-s32 nil (s32.4) (s32) :cost 1 :encoding :fake-vop) + (s32.4!-from-p128 #:vmovdqu (s32.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (s32.4!-from-p256 #:vextractf128 (s32.4) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-s32.4 nil (s32.4) (s32 s32 s32 s32) :cost 1 :encoding :fake-vop) + (s32.4-values nil (s32 s32 s32 s32) (s32.4) :cost 1 :encoding :fake-vop) + (s32.4-broadcast nil (s32.4) (s32) :cost 1 :encoding :fake-vop) + (s32.4-blend #:vpblendvb (s32.4) (s32.4 s32.4 u32.4) :cost 1) + (s32.4-from-f64.4 #:vcvtpd2dq (s32.4) (f64.4) :cost 5) ;; wrong code is generated VCVTPD2DQ XMM0, XMM0. 3rd and 4th elements are 0s + (s32.4-from-f32.4 #:vcvtps2dq (s32.4) (f32.4) :cost 5) + (two-arg-s32.4-and #:vpand (s32.4) (s32.4 s32.4) :cost 1 :associative t) + (two-arg-s32.4-or #:vpor (s32.4) (s32.4 s32.4) :cost 1 :associative t) + (two-arg-s32.4-xor #:vpxor (s32.4) (s32.4 s32.4) :cost 1 :associative t) + (s32.4-andc1 #:vpandn (s32.4) (s32.4 s32.4) :cost 1) + (s32.4-not nil (s32.4) (s32.4) :cost 1 :encoding :fake-vop) + (two-arg-s32.4+ #:vpaddd (s32.4) (s32.4 s32.4) :cost 2 :associative t) + (two-arg-s32.4- #:vpsubd (s32.4) (s32.4 s32.4) :cost 2) + (two-arg-s32.4-mullo #:vpmulld (s32.4) (s32.4 s32.4) :cost 2 :associative t) + (two-arg-s32.4= #:vpcmpeqd (u32.4) (s32.4 s32.4) :cost 1 :associative t) + (two-arg-s32.4/= nil (u32.4) (s32.4 s32.4) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s32.4> #:vpcmpgtd (u32.4) (s32.4 s32.4) :cost 1) + (two-arg-s32.4< nil (u32.4) (s32.4 s32.4) :cost 1 :encoding :fake-vop) + (two-arg-s32.4>= nil (u32.4) (s32.4 s32.4) :cost 2 :encoding :fake-vop) + (two-arg-s32.4<= nil (u32.4) (s32.4 s32.4) :cost 2 :encoding :fake-vop) + (s32.4-unpackhi #:vpunpckhdq (s32.4) (s32.4 s32.4) :cost 1) + (s32.4-unpacklo #:vpunpckldq (s32.4) (s32.4 s32.4) :cost 1) + (s32.4-movemask #:vmovmskps (u4) (s32.4) :cost 1) + (s32.4-permute #:vpermilps (s32.4) (s32.4 imm8) :cost 1) + ;; s64.2 + (s64.2!-from-s64 nil (s64.2) (s64) :cost 1 :encoding :fake-vop) + (s64.2!-from-p128 #:vmovdqu (s64.2) (p128) :cost 1 :encoding :move :always-translatable nil) + (s64.2!-from-p256 #:vextractf128 (s64.2) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (make-s64.2 nil (s64.2) (s64 s64) :cost 1 :encoding :fake-vop) + (s64.2-values nil (s64 s64) (s64.2) :cost 1 :encoding :fake-vop) + (s64.2-broadcast nil (s64.2) (s64) :cost 1 :encoding :fake-vop) + (s64.2-blend #:vpblendvb (s64.2) (s64.2 s64.2 u64.2) :cost 1) + (two-arg-s64.2-and #:vpand (s64.2) (s64.2 s64.2) :cost 1 :associative t) + (two-arg-s64.2-or #:vpor (s64.2) (s64.2 s64.2) :cost 1 :associative t) + (two-arg-s64.2-xor #:vpxor (s64.2) (s64.2 s64.2) :cost 1 :associative t) + (s64.2-andc1 #:vpandn (s64.2) (s64.2 s64.2) :cost 1) + (s64.2-not nil (s64.2) (s64.2) :cost 1 :encoding :fake-vop) + (two-arg-s64.2+ #:vpaddq (s64.2) (s64.2 s64.2) :cost 2 :associative t) + (two-arg-s64.2- #:vpsubq (s64.2) (s64.2 s64.2) :cost 2) + (s64.2-shiftl #:vpsllq (s64.2) (s64.2 s64.2) :cost 1) + (s64.2-shiftr #:vpsrlq (s64.2) (s64.2 s64.2) :cost 1) + (two-arg-s64.2= #:vpcmpeqq (u64.2) (s64.2 s64.2) :cost 1 :associative t) + (two-arg-s64.2/= nil (u64.2) (s64.2 s64.2) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s64.2> #:vpcmpgtq (u64.2) (s64.2 s64.2) :cost 1) + (two-arg-s64.2< nil (u64.2) (s64.2 s64.2) :cost 1 :encoding :fake-vop) + (two-arg-s64.2>= nil (u64.2) (s64.2 s64.2) :cost 2 :encoding :fake-vop) + (two-arg-s64.2<= nil (u64.2) (s64.2 s64.2) :cost 2 :encoding :fake-vop) + (s64.2-unpackhi #:vpunpckhqdq (s64.2) (s64.2 s64.2) :cost 1) + (s64.2-unpacklo #:vpunpcklqdq (s64.2) (s64.2 s64.2) :cost 1) + (s64.2-movemask #:vmovmskpd (u2) (s64.2) :cost 1) + (s64.2-permute #:vpermilpd (s64.2) (s64.2 imm8) :cost 1) + ;; s8.32 + (s8.32!-from-s8 nil (s8.32) (s8) :cost 1 :encoding :fake-vop) + (s8.32!-from-p128 #:vmovdqu (s8.32) (p128) :cost 1 :encoding :move :always-translatable nil) + (s8.32!-from-p256 #:vmovdqu (s8.32) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-s8.32 nil (s8.32) (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) :cost 1 :encoding :fake-vop) + (s8.32-values nil (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) (s8.32) :cost 1 :encoding :fake-vop) + (s8.32-broadcast nil (s8.32) (s8) :cost 1 :encoding :fake-vop) + (s8.16-from-s8.32 #:vextractf128 (s8.16) (s8.32 imm1) :cost 1) + (s8.32-insert-s8.16 #:vinsertf128 (s8.32) (s8.32 s8.16 imm1) :cost 1) + (s8.32-permute128 #:vperm2f128 (s8.32) (s8.32 s8.32 imm8) :cost 1) + ;; s16.16 + (s16.16!-from-s16 nil (s16.16) (s16) :cost 1 :encoding :fake-vop) + (s16.16!-from-p128 #:vmovdqu (s16.16) (p128) :cost 1 :encoding :move :always-translatable nil) + (s16.16!-from-p256 #:vmovdqu (s16.16) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-s16.16 nil (s16.16) (s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16) :cost 1 :encoding :fake-vop) + (s16.16-values nil (s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16) (s16.16) :cost 1 :encoding :fake-vop) + (s16.16-broadcast nil (s16.16) (s16) :cost 1 :encoding :fake-vop) + (s16.8-from-s16.16 #:vextractf128 (s16.8) (s16.16 imm1) :cost 1) + (s16.16-insert-s16.8 #:vinsertf128 (s16.16) (s16.16 s16.8 imm1) :cost 1) + (s16.16-permute128 #:vperm2f128 (s16.16) (s16.16 s16.16 imm8) :cost 1) + ;; s32.8 + (s32.8!-from-s32 nil (s32.8) (s32) :cost 1 :encoding :fake-vop) + (s32.8!-from-p128 #:vmovdqu (s32.8) (p128) :cost 1 :encoding :move :always-translatable nil) + (s32.8!-from-p256 #:vmovdqu (s32.8) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-s32.8 nil (s32.8) (s32 s32 s32 s32 s32 s32 s32 s32) :cost 1 :encoding :fake-vop) + (s32.8-values nil (s32 s32 s32 s32 s32 s32 s32 s32) (s32.8) :cost 1 :encoding :fake-vop) + (s32.8-broadcast nil (s32.8) (s32) :cost 1 :encoding :fake-vop) + (s32.8-from-f32.8 #:vcvtps2dq (s32.8) (f32.8) :cost 4) + (s32.8-permute #:vpermilps (s32.8) (s32.4 imm8) :cost 1) + (s32.4-from-s32.8 #:vextractf128 (s32.4) (s32.8 imm1) :cost 1) + (s32.8-insert-s32.4 #:vinsertf128 (s32.8) (s32.8 s32.4 imm1) :cost 1) + (s32.8-permute128 #:vperm2f128 (s32.8) (s32.8 s32.8 imm8) :cost 1) + ;; s64.4 + (s64.4!-from-s64 nil (s64.4) (s64) :cost 1 :encoding :fake-vop) + (s64.4!-from-p128 #:vmovdqu (s64.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (s64.4!-from-p256 #:vmovdqu (s64.4) (p256) :cost 1 :encoding :move :always-translatable nil) + (make-s64.4 nil (s64.4) (s64 s64 s64 s64) :cost 1 :encoding :fake-vop) + (s64.4-values nil (s64 s64 s64 s64) (s64.4) :cost 1 :encoding :fake-vop) + (s64.4-broadcast nil (s64.4) (s64) :cost 1 :encoding :fake-vop) + (s64.4-permute #:vpermilpd (s64.4) (s64.4 imm8) :cost 1) + (s64.2-from-s64.4 #:vextractf128 (s64.2) (s64.4 imm1) :cost 1) + (s64.4-insert-s64.2 #:vinsertf128 (s64.4) (s64.4 s64.2 imm1) :cost 1) + (s64.4-permute128 #:vperm2f128 (s64.4) (s64.4 s64.4 imm8) :cost 1)) + (:loads + (u32.4-load-from-string #:vmovdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref) + (u32.8-load-from-string #:vmovdqu u32.8 charvec char-array u32.8-string-ref u32.8-row-major-string-ref) + (f32-load #:vmovss f32 f32vec f32-array f32-aref f32-row-major-aref) + (f64-load #:vmovsd f64 f64vec f64-array f64-aref f64-row-major-aref) + (f32.4-load #:vmovups f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref) + (f64.2-load #:vmovupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref) + (f32.8-load #:vmovups f32.8 f32vec f32-array f32.8-aref f32.8-row-major-aref) + (f64.4-load #:vmovupd f64.4 f64vec f64-array f64.4-aref f64.4-row-major-aref) + (u8.16-load #:vmovdqu u8.16 u8vec u8-array u8.16-aref u8.16-row-major-aref) + (u16.8-load #:vmovdqu u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref) + (u32.4-load #:vmovdqu u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref) + (u64.2-load #:vmovdqu u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref) + (u8.32-load #:vmovdqu u8.32 u8vec u8-array u8.32-aref u8.32-row-major-aref) + (u16.16-load #:vmovdqu u16.16 u16vec u16-array u16.16-aref u16.16-row-major-aref) + (u32.8-load #:vmovdqu u32.8 u32vec u32-array u32.8-aref u32.8-row-major-aref) + (u64.4-load #:vmovdqu u64.4 u64vec u64-array u64.4-aref u64.4-row-major-aref) + (s8.16-load #:vmovdqu s8.16 s8vec s8-array s8.16-aref s8.16-row-major-aref) + (s16.8-load #:vmovdqu s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref) + (s32.4-load #:vmovdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref) + (s64.2-load #:vmovdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref) + (s8.32-load #:vmovdqu s8.32 s8vec s8-array s8.32-aref s8.32-row-major-aref) + (s16.16-load #:vmovdqu s16.16 s16vec s16-array s16.16-aref s16.16-row-major-aref) + (s32.8-load #:vmovdqu s32.8 s32vec s32-array s32.8-aref s32.8-row-major-aref) + (s64.4-load #:vmovdqu s64.4 s64vec s64-array s64.4-aref s64.4-row-major-aref)) + (:stores + (u32.4-store-into-string #:vmovdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref) + (u32.8-store-into-string #:vmovdqu u32.8 charvec char-array u32.8-string-ref u32.8-row-major-string-ref) + (f32-store #:vmovss f32 f32vec f32-array f32-aref f32-row-major-aref) + (f64-store #:vmovsd f64 f64vec f64-array f64-aref f64-row-major-aref) + (f32.4-store #:vmovups f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref) + (f64.2-store #:vmovupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref) + (f32.8-store #:vmovups f32.8 f32vec f32-array f32.8-aref f32.8-row-major-aref) + (f64.4-store #:vmovupd f64.4 f64vec f64-array f64.4-aref f64.4-row-major-aref) + (u8.16-store #:vmovdqu u8.16 u8vec u8-array u8.16-aref u8.16-row-major-aref) + (u16.8-store #:vmovdqu u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref) + (u32.4-store #:vmovdqu u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref) + (u64.2-store #:vmovdqu u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref) + (s8.16-store #:vmovdqu s8.16 s8vec s8-array s8.16-aref s8.16-row-major-aref) + (s16.8-store #:vmovdqu s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref) + (s32.4-store #:vmovdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref) + (s64.2-store #:vmovdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref) + (u8.32-store #:vmovdqu u8.32 u8vec u8-array u8.32-aref u8.32-row-major-aref) + (u16.16-store #:vmovdqu u16.16 u16vec u16-array u16.16-aref u16.16-row-major-aref) + (u32.8-store #:vmovdqu u32.8 u32vec u32-array u32.8-aref u32.8-row-major-aref) + (u64.4-store #:vmovdqu u64.4 u64vec u64-array u64.4-aref u64.4-row-major-aref) + (s8.32-store #:vmovdqu s8.32 s8vec s8-array s8.32-aref s8.32-row-major-aref) + (s16.16-store #:vmovdqu s16.16 s16vec s16-array s16.16-aref s16.16-row-major-aref) + (s32.8-store #:vmovdqu s32.8 s32vec s32-array s32.8-aref s32.8-row-major-aref) + (s64.4-store #:vmovdqu s64.4 s64vec s64-array s64.4-aref s64.4-row-major-aref) + (f32.4-ntstore #:vmovntps f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref) + (f64.2-ntstore #:vmovntpd f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref) + (f32.8-ntstore #:vmovntps f32.8 f32vec f32-array f32.8-non-temporal-aref f32.8-non-temporal-row-major-aref) + (f64.4-ntstore #:vmovntpd f64.4 f64vec f64-array f64.4-non-temporal-aref f64.4-non-temporal-row-major-aref) + (u8.16-ntstore #:vmovntdq u8.16 u8vec u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref) + (u16.8-ntstore #:vmovntdq u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref) + (u32.4-ntstore #:vmovntdq u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref) + (u64.2-ntstore #:vmovntdq u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref) + (s8.16-ntstore #:vmovntdq s8.16 s8vec s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref) + (s16.8-ntstore #:vmovntdq s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref) + (s32.4-ntstore #:vmovntdq s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref) + (s64.2-ntstore #:vmovntdq s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref) + (u8.32-ntstore #:vmovntdq u8.32 u8vec u8-array u8.32-non-temporal-aref u8.32-non-temporal-row-major-aref) + (u16.16-ntstore #:vmovntdq u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref) + (u32.8-ntstore #:vmovntdq u32.8 u32vec u32-array u32.8-non-temporal-aref u32.8-non-temporal-row-major-aref) + (u64.4-ntstore #:vmovntdq u64.4 u64vec u64-array u64.4-non-temporal-aref u64.4-non-temporal-row-major-aref) + (s8.32-ntstore #:vmovntdq s8.32 s8vec s8-array s8.32-non-temporal-aref s8.32-non-temporal-row-major-aref) + (s16.16-ntstore #:vmovntdq s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref) + (s32.8-ntstore #:vmovntdq s32.8 s32vec s32-array s32.8-non-temporal-aref s32.8-non-temporal-row-major-aref) + (s64.4-ntstore #:vmovntdq s64.4 s64vec s64-array s64.4-non-temporal-aref s64.4-non-temporal-row-major-aref)) + (:associatives + (f32-and two-arg-f32-and +f32-true+) + (f32-or two-arg-f32-or +f32-false+) + (f32-xor two-arg-f32-xor +f32-false+) + (f32-max two-arg-f32-max nil) + (f32-min two-arg-f32-min nil) + (f32+ two-arg-f32+ 0f0) + (f32* two-arg-f32* 1f0) + (f64-and two-arg-f64-and +f64-true+) + (f64-or two-arg-f64-or +f64-false+) + (f64-xor two-arg-f64-xor +f64-false+) + (f64-max two-arg-f64-max nil) + (f64-min two-arg-f64-min nil) + (f64+ two-arg-f64+ 0d0) + (f64* two-arg-f64* 1d0) + (f32.4-and two-arg-f32.4-and +f32-true+) + (f32.4-or two-arg-f32.4-or +f32-false+) + (f32.4-xor two-arg-f32.4-xor +f32-false+) + (f32.4-max two-arg-f32.4-max nil) + (f32.4-min two-arg-f32.4-min nil) + (f32.4+ two-arg-f32.4+ 0f0) + (f32.4* two-arg-f32.4* 1f0) + (f64.2-and two-arg-f64.2-and +f64-true+) + (f64.2-or two-arg-f64.2-or +f64-false+) + (f64.2-xor two-arg-f64.2-xor +f64-false+) + (f64.2-max two-arg-f64.2-max nil) + (f64.2-min two-arg-f64.2-min nil) + (f64.2+ two-arg-f64.2+ 0d0) + (f64.2* two-arg-f64.2* 1d0) + (f32.8-and two-arg-f32.8-and +f32-true+) + (f32.8-or two-arg-f32.8-or +f32-false+) + (f32.8-xor two-arg-f32.8-xor +f32-false+) + (f32.8-max two-arg-f32.8-max nil) + (f32.8-min two-arg-f32.8-min nil) + (f32.8+ two-arg-f32.8+ 0f0) + (f32.8* two-arg-f32.8* 1f0) + (f64.4-and two-arg-f64.4-and +f64-true+) + (f64.4-or two-arg-f64.4-or +f64-false+) + (f64.4-xor two-arg-f64.4-xor +f64-false+) + (f64.4-max two-arg-f64.4-max nil) + (f64.4-min two-arg-f64.4-min nil) + (f64.4+ two-arg-f64.4+ 0d0) + (f64.4* two-arg-f64.4* 1d0) + (u8.16-and two-arg-u8.16-and +u8-true+) + (u8.16-or two-arg-u8.16-or +u8-false+) + (u8.16-xor two-arg-u8.16-xor +u8-false+) + (u8.16+ two-arg-u8.16+ 0) + (u16.8-and two-arg-u16.8-and +u16-true+) + (u16.8-or two-arg-u16.8-or +u16-false+) + (u16.8-xor two-arg-u16.8-xor +u16-false+) + (u16.8+ two-arg-u16.8+ 0) + (u32.4-and two-arg-u32.4-and +u32-true+) + (u32.4-or two-arg-u32.4-or +u32-false+) + (u32.4-xor two-arg-u32.4-xor +u32-false+) + (u32.4+ two-arg-u32.4+ 0) + (u64.2-and two-arg-u64.2-and +u64-true+) + (u64.2-or two-arg-u64.2-or +u64-false+) + (u64.2-xor two-arg-u64.2-xor +u64-false+) + (u64.2+ two-arg-u64.2+ 0) + (s8.16-and two-arg-s8.16-and +s8-true+) + (s8.16-or two-arg-s8.16-or +s8-false+) + (s8.16-xor two-arg-s8.16-xor +s8-false+) + (s8.16+ two-arg-s8.16+ 0) + (s16.8-and two-arg-s16.8-and +s16-true+) + (s16.8-or two-arg-s16.8-or +s16-false+) + (s16.8-xor two-arg-s16.8-xor +s16-false+) + (s16.8+ two-arg-s16.8+ 0) + (s16.8-mullo two-arg-s16.8-mullo 1) + (s32.4-and two-arg-s32.4-and +s32-true+) + (s32.4-or two-arg-s32.4-or +s32-false+) + (s32.4-xor two-arg-s32.4-xor +s32-false+) + (s32.4+ two-arg-s32.4+ 0) + (s32.4-mullo two-arg-s32.4-mullo 1) + (s64.2-and two-arg-s64.2-and +s64-true+) + (s64.2-or two-arg-s64.2-or +s64-false+) + (s64.2-xor two-arg-s64.2-xor +s64-false+) + (s64.2+ two-arg-s64.2+ 0) + ;; The next two functions are only required for implementing + ;; floating-point comparisons and unequals. + (u32.8-and two-arg-u32.8-and +u32-true+) + (u64.4-and two-arg-u64.4-and +u64-true+)) + (:comparisons + (f32= two-arg-f32= u32-and +u32-true+) + (f32< two-arg-f32< u32-and +u32-true+) + (f32<= two-arg-f32<= u32-and +u32-true+) + (f32> two-arg-f32> u32-and +u32-true+) + (f32>= two-arg-f32>= u32-and +u32-true+) + (f64= two-arg-f64= u64-and +u64-true+) + (f64< two-arg-f64< u64-and +u64-true+) + (f64<= two-arg-f64<= u64-and +u64-true+) + (f64> two-arg-f64> u64-and +u64-true+) + (f64>= two-arg-f64>= u64-and +u64-true+) + (f32.4= two-arg-f32.4= u32.4-and +u32-true+) + (f32.4< two-arg-f32.4< u32.4-and +u32-true+) + (f32.4<= two-arg-f32.4<= u32.4-and +u32-true+) + (f32.4> two-arg-f32.4> u32.4-and +u32-true+) + (f32.4>= two-arg-f32.4>= u32.4-and +u32-true+) + (f64.2= two-arg-f64.2= u64.2-and +u64-true+) + (f64.2< two-arg-f64.2< u64.2-and +u64-true+) + (f64.2<= two-arg-f64.2<= u64.2-and +u64-true+) + (f64.2> two-arg-f64.2> u64.2-and +u64-true+) + (f64.2>= two-arg-f64.2>= u64.2-and +u64-true+) + (f32.8= two-arg-f32.8= u32.8-and +u32-true+) + (f32.8< two-arg-f32.8< u32.8-and +u32-true+) + (f32.8<= two-arg-f32.8<= u32.8-and +u32-true+) + (f32.8> two-arg-f32.8> u32.8-and +u32-true+) + (f32.8>= two-arg-f32.8>= u32.8-and +u32-true+) + (f64.4= two-arg-f64.4= u64.4-and +u64-true+) + (f64.4< two-arg-f64.4< u64.4-and +u64-true+) + (f64.4<= two-arg-f64.4<= u64.4-and +u64-true+) + (f64.4> two-arg-f64.4> u64.4-and +u64-true+) + (f64.4>= two-arg-f64.4>= u64.4-and +u64-true+) + (u8.16= two-arg-u8.16= u8.16-and +u8-true+) + (u8.16< two-arg-u8.16< u8.16-and +u8-true+) + (u8.16<= two-arg-u8.16<= u8.16-and +u8-true+) + (u8.16> two-arg-u8.16> u8.16-and +u8-true+) + (u8.16>= two-arg-u8.16>= u8.16-and +u8-true+) + (u16.8= two-arg-u16.8= u16.8-and +u16-true+) + (u16.8< two-arg-u16.8< u16.8-and +u16-true+) + (u16.8<= two-arg-u16.8<= u16.8-and +u16-true+) + (u16.8> two-arg-u16.8> u16.8-and +u16-true+) + (u16.8>= two-arg-u16.8>= u16.8-and +u16-true+) + (u32.4= two-arg-u32.4= u32.4-and +u32-true+) + (u32.4< two-arg-u32.4< u32.4-and +u32-true+) + (u32.4<= two-arg-u32.4<= u32.4-and +u32-true+) + (u32.4> two-arg-u32.4> u32.4-and +u32-true+) + (u32.4>= two-arg-u32.4>= u32.4-and +u32-true+) + (u64.2= two-arg-u64.2= u64.2-and +u64-true+) + (u64.2< two-arg-u64.2< u64.2-and +u64-true+) + (u64.2<= two-arg-u64.2<= u64.2-and +u64-true+) + (u64.2> two-arg-u64.2> u64.2-and +u64-true+) + (u64.2>= two-arg-u64.2>= u64.2-and +u64-true+) + (s8.16= two-arg-s8.16= u8.16-and +u8-true+) + (s8.16< two-arg-s8.16< u8.16-and +u8-true+) + (s8.16<= two-arg-s8.16<= u8.16-and +u8-true+) + (s8.16> two-arg-s8.16> u8.16-and +u8-true+) + (s8.16>= two-arg-s8.16>= u8.16-and +u8-true+) + (s16.8= two-arg-s16.8= u16.8-and +u16-true+) + (s16.8< two-arg-s16.8< u16.8-and +u16-true+) + (s16.8<= two-arg-s16.8<= u16.8-and +u16-true+) + (s16.8> two-arg-s16.8> u16.8-and +u16-true+) + (s16.8>= two-arg-s16.8>= u16.8-and +u16-true+) + (s32.4= two-arg-s32.4= u32.4-and +u32-true+) + (s32.4< two-arg-s32.4< u32.4-and +u32-true+) + (s32.4<= two-arg-s32.4<= u32.4-and +u32-true+) + (s32.4> two-arg-s32.4> u32.4-and +u32-true+) + (s32.4>= two-arg-s32.4>= u32.4-and +u32-true+) + (s64.2= two-arg-s64.2= u64.2-and +u64-true+) + (s64.2< two-arg-s64.2< u64.2-and +u64-true+) + (s64.2<= two-arg-s64.2<= u64.2-and +u64-true+) + (s64.2> two-arg-s64.2> u64.2-and +u64-true+) + (s64.2>= two-arg-s64.2>= u64.2-and +u64-true+)) + (:ifs + (f32.4-if f32.4-blend) + (f32.8-if f32.8-blend) + (f64.2-if f64.2-blend) + (f64.4-if f64.4-blend) + (u8.16-if u8.16-blend) + (u16.8-if u16.8-blend) + (u32.4-if u32.4-blend) + (u64.2-if u64.2-blend) + (s8.16-if s8.16-blend) + (s16.8-if s16.8-blend) + (s32.4-if s32.4-blend) + (s64.2-if s64.2-blend)) + (:reducers + (f32- two-arg-f32- 0f0) + (f32/ two-arg-f32/ 1f0) + (f64- two-arg-f64- 0d0) + (f64/ two-arg-f64/ 1d0) + (f32.4- two-arg-f32.4- 0f0) + (f32.4/ two-arg-f32.4/ 1f0) + (f64.2- two-arg-f64.2- 0d0) + (f64.2/ two-arg-f64.2/ 1d0) + (f32.8- two-arg-f32.8- 0f0) + (f32.8/ two-arg-f32.8/ 1f0) + (f64.4- two-arg-f64.4- 0d0) + (f64.4/ two-arg-f64.4/ 1d0) + (u8.16- two-arg-u8.16- 0) + (u16.8- two-arg-u16.8- 0) + (u32.4- two-arg-u32.4- 0) + (u64.2- two-arg-u64.2- 0) + (s8.16- two-arg-s8.16- 0) + (s16.8- two-arg-s16.8- 0) + (s32.4- two-arg-s32.4- 0) + (s64.2- two-arg-s64.2- 0)) + (:unequals + (f32/= two-arg-f32/= u32-and +u32-true+) + (f64/= two-arg-f64/= u64-and +u64-true+) + (f32.4/= two-arg-f32.4/= u32.4-and +u32-true+) + (f64.2/= two-arg-f64.2/= u64.2-and +u64-true+) + (f32.8/= two-arg-f32.8/= u32.8-and +u32-true+) + (f64.4/= two-arg-f64.4/= u64.4-and +u64-true+) + (u8.16/= two-arg-u8.16/= u8.16-and +u8-true+) + (u16.8/= two-arg-u16.8/= u16.8-and +u16-true+) + (u32.4/= two-arg-u32.4/= u32.4-and +u32-true+) + (u64.2/= two-arg-u64.2/= u64.2-and +u64-true+) + (s8.16/= two-arg-s8.16/= u8.16-and +u8-true+) + (s16.8/= two-arg-s16.8/= u16.8-and +u16-true+) + (s32.4/= two-arg-s32.4/= u32.4-and +u32-true+) + (s64.2/= two-arg-s64.2/= u64.2-and +u64-true+))) diff --git a/contrib/sb-simd/code/instruction-sets/avx2.lisp b/contrib/sb-simd/code/instruction-sets/avx2.lisp new file mode 100644 index 0000000000..a0f50c2ea6 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/avx2.lisp @@ -0,0 +1,523 @@ +(in-package #:sb-simd-avx2) + +(define-instruction-set :avx2 + (:include :avx) + (:test (avx2-supported-p)) + (:simd-packs + ;; You may wonder why we define these SIMD packs twice both for AVX and + ;; AVX2. The reason is that each of these instruction sets provides its + ;; own version of the constructor for integer SIMD packs. And since the + ;; constructor has the same name as the pack, AVX2 cannot inherit them + ;; from AVX. Luckily, defining SIMD records is cheap, so we can simply + ;; define them again with a different name (or rather, with the same + ;; name but in a different package). + (u8.32 u8 256 #:simd-pack-256-ub8 (#:int-avx2-reg)) + (u16.16 u16 256 #:simd-pack-256-ub16 (#:int-avx2-reg)) + (u32.8 u32 256 #:simd-pack-256-ub32 (#:int-avx2-reg)) + (u64.4 u64 256 #:simd-pack-256-ub64 (#:int-avx2-reg)) + (s8.32 s8 256 #:simd-pack-256-sb8 (#:int-avx2-reg)) + (s16.16 s16 256 #:simd-pack-256-sb16 (#:int-avx2-reg)) + (s32.8 s32 256 #:simd-pack-256-sb32 (#:int-avx2-reg)) + (s64.4 s64 256 #:simd-pack-256-sb64 (#:int-avx2-reg))) + (:simd-casts + (u8.32 u8.32-broadcast) + (u16.16 u16.16-broadcast) + (u32.8 u32.8-broadcast) + (u64.4 u64.4-broadcast) + (s8.32 s8.32-broadcast) + (s16.16 s16.16-broadcast) + (s32.8 s32.8-broadcast) + (s64.4 s64.4-broadcast)) + (:reinterpret-casts + (u8.16! sb-simd-avx::u8.16!-from-u8 sb-simd-avx::u8.16!-from-p128 u8.16!-from-p256) + (u16.8! sb-simd-avx::u16.8!-from-u16 sb-simd-avx::u16.8!-from-p128 u16.8!-from-p256) + (u32.4! sb-simd-avx::u32.4!-from-u32 sb-simd-avx::u32.4!-from-p128 u32.4!-from-p256) + (u64.2! sb-simd-avx::u64.2!-from-u64 sb-simd-avx::u64.2!-from-p128 u64.2!-from-p256) + (s8.16! sb-simd-avx::s8.16!-from-s8 sb-simd-avx::s8.16!-from-p128 s8.16!-from-p256) + (s16.8! sb-simd-avx::s16.8!-from-s16 sb-simd-avx::s16.8!-from-p128 s16.8!-from-p256) + (s32.4! sb-simd-avx::s32.4!-from-s32 sb-simd-avx::s32.4!-from-p128 s32.4!-from-p256) + (s64.2! sb-simd-avx::s64.2!-from-s64 sb-simd-avx::s64.2!-from-p128 s64.2!-from-p256)) + (:instructions + ;; f64.4 + (f64.4-permute4x64 #:vpermpd (f64.4) (f64.4 imm8) :cost 1) + (f64.4-reverse nil (f64.4) (f64.4) :cost 2 :encoding :fake-vop) + ;; u8.16 + (u8.16!-from-p256 #:vextracti128 (u8.16) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (u8.16-broadcast nil (u8.16) (u8) :cost 1 :encoding :fake-vop) + (u8.16-broadcastvec #:vpbroadcastb (u8.16) (u8.16) :cost 1) + ;; u16.8 + (u16.8!-from-p256 #:vextracti128 (u16.8) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (u16.8-broadcast nil (u16.16) (u16) :cost 1 :encoding :fake-vop) + (u16.8-broadcastvec #:vpbroadcastw (u16.16) (u16.8) :cost 1) + ;; u32.4 + (u32.4!-from-p256 #:vextracti128 (u32.4) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (u32.4-broadcast nil (u32.4) (u32) :cost 1 :encoding :fake-vop) + (u32.4-broadcastvec #:vpbroadcastd (u32.4) (u32.4) :cost 1) + (u32.4-shiftl #:vpsllvd (u32.4) (u32.4 u32.4) :cost 1) + (u32.4-shiftr #:vpsrlvd (u32.4) (u32.4 u32.4) :cost 1) + ;; u64.2 + (u64.2!-from-p256 #:vextracti128 (u64.2) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (u64.2-broadcast nil (u64.2) (u64) :cost 1 :encoding :fake-vop) + (u64.2-broadcastvec #:vpbroadcastq (u64.2) (u64.2) :cost 1) + (u64.2-shiftl #:vpsllvd (u64.2) (u64.2 u64.2) :cost 1) + (u64.2-shiftr #:vpsrlvd (u64.2) (u64.2 u64.2) :cost 1) + ;; s8.16 + (s8.16!-from-p256 #:vextracti128 (s8.16) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (s8.16-broadcast nil (s8.16) (s8) :cost 1 :encoding :fake-vop) + (s8.16-broadcastvec #:vpbroadcastb (s8.16) (s8.16) :cost 1) + ;; s16.8 + (s16.8!-from-p256 #:vextracti128 (s16.8) (p256) :cost 1 :suffix '(1) :always-translatable nil) + (s16.8-broadcast nil (s16.16) (s16) :cost 1 :encoding :fake-vop) + (s16.8-broadcastvec #:vpbroadcastw (s16.16) (s16.8) :cost 1) + ;; s32.4 + (s32.4!-from-p256 #:vextracti128 (s32.4) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (s32.4-broadcast nil (s32.4) (s32) :cost 1 :encoding :fake-vop) + (s32.4-broadcastvec #:vpbroadcastd (s32.4) (s32.4) :cost 1) + (s32.4-shiftl #:vpsllvq (s32.4) (s32.4 s32.4) :cost 1) + (s32.4-shiftr #:vpsrlvq (s32.4) (s32.4 s32.4) :cost 1) + ;; s64.2 + (s64.2!-from-p256 #:vextracti128 (s64.2) (p256) :cost 1 :suffix '(0) :always-translatable nil) + (s64.2-broadcast nil (s64.2) (s64) :cost 1 :encoding :fake-vop) + (s64.2-broadcastvec #:vpbroadcastq (s64.2) (s64.2) :cost 1) + (s64.2-shiftl #:vpsllvq (s64.2) (s64.2 s64.2) :cost 1) + (s64.2-shiftr #:vpsrlvq (s64.2) (s64.2 s64.2) :cost 1) + ;; u8.32 + (make-u8.32 nil (u8.32) (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) :cost 1 :encoding :fake-vop) + (u8.32-values nil (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) (u8.32) :cost 1 :encoding :fake-vop) + (u8.32-broadcast nil (u8.32) (u8) :cost 1 :encoding :fake-vop) + (u8.32-broadcastvec #:vpbroadcastb (u8.32) (u8.32) :cost 1) + (u8.32-blend #:vpblendvb (u8.32) (u8.32 u8.32 u8.32) :cost 1) + (two-arg-u8.32-and #:vpand (u8.32) (u8.32 u8.32) :cost 1 :associative t) + (two-arg-u8.32-or #:vpor (u8.32) (u8.32 u8.32) :cost 1 :associative t) + (two-arg-u8.32-xor #:vpxor (u8.32) (u8.32 u8.32) :cost 1 :associative t) + (u8.32-andc1 #:vpandn (u8.32) (u8.32 u8.32) :cost 1) + (u8.32-not nil (u8.32) (u8.32) :cost 1 :encoding :fake-vop) + (two-arg-u8.32-max #:vpmaxub (u8.32) (u8.32 u8.32) :cost 2 :associative t) + (two-arg-u8.32-min #:vpminub (u8.32) (u8.32 u8.32) :cost 2 :associative t) + (two-arg-u8.32+ #:vpaddb (u8.32) (u8.32 u8.32) :cost 2 :associative t) + (two-arg-u8.32- #:vpsubb (u8.32) (u8.32 u8.32) :cost 2) + (two-arg-u8.32= #:vpcmpeqb (u8.32) (u8.32 u8.32) :cost 1 :associative t) + (two-arg-u8.32/= nil (u8.32) (u8.32 u8.32) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u8.32>~ #:vpcmpgtb (u8.32) (u8.32 u8.32) :cost 1) + (two-arg-u8.32> nil (u8.32) (u8.32 u8.32) :cost 1 :encoding :fake-vop) + (two-arg-u8.32< nil (u8.32) (u8.32 u8.32) :cost 1 :encoding :fake-vop) + (two-arg-u8.32>= nil (u8.32) (u8.32 u8.32) :cost 2 :encoding :fake-vop) + (two-arg-u8.32<= nil (u8.32) (u8.32 u8.32) :cost 2 :encoding :fake-vop) + (u8.32-avg #:vpavgb (u8.32) (u8.32 u8.32) :cost 2) + (u8.32-packus #:vpackuswb (u8.32) (u16.16 u16.16) :cost 2) + (u8.32-unpackhi #:vpunpckhbw (u8.32) (u8.32 u8.32) :cost 1) + (u8.32-unpacklo #:vpunpcklbw (u8.32) (u8.32 u8.32) :cost 1) + (u8.32-movemask #:vpmovmskb (u32) (u8.32) :cost 1) + (u8.32-shuffle #:vpshufb (u8.32) (u8.32 u8.32) :cost 1) + (u8.32-insert-u8.16 #:vinserti128 (u8.32) (u8.32 u8.16 imm8) :cost 1) + (u8.16-from-u8.32 #:vextracti128 (u8.16) (u8.32 imm1) :cost 1) + (u8.32-permute128 #:vperm2i128 (u8.32) (u8.32 u8.32 imm8) :cost 1) + ;; u16.16 + (make-u16.16 nil (u16.16) (u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16) :cost 1 :encoding :fake-vop) + (u16.16-values nil (u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16 u16) (u16.16) :cost 1 :encoding :fake-vop) + (u16.16-broadcast nil (u16.16) (u16) :cost 1 :encoding :fake-vop) + (u16.16-broadcastvec #:vpbroadcastw (u16.16) (u16.16) :cost 1) + (u16.16-blend #:vpblendvb (u16.16) (u16.16 u16.16 u16.16) :cost 1) + (u16.16-from-u8.16 #:vpmovzxbw (u16.16) (u8.16) :cost 5) + (two-arg-u16.16-and #:vpand (u16.16) (u16.16 u16.16) :cost 1 :associative t) + (two-arg-u16.16-or #:vpor (u16.16) (u16.16 u16.16) :cost 1 :associative t) + (two-arg-u16.16-xor #:vpxor (u16.16) (u16.16 u16.16) :cost 1 :associative t) + (u16.16-andc1 #:vpandn (u16.16) (u16.16 u16.16) :cost 1) + (u16.16-not nil (u16.16) (u16.16) :cost 1 :encoding :fake-vop) + (two-arg-u16.16-max #:vpmaxuw (u16.16) (u16.16 u16.16) :cost 2 :associative t) + (two-arg-u16.16-min #:vpminuw (u16.16) (u16.16 u16.16) :cost 2 :associative t) + (two-arg-u16.16+ #:vpaddw (u16.16) (u16.16 u16.16) :cost 2 :associative t) + (two-arg-u16.16- #:vpsubw (u16.16) (u16.16 u16.16) :cost 2) + (two-arg-u16.16= #:vpcmpeqw (u16.16) (u16.16 u16.16) :cost 1 :associative t) + (two-arg-u16.16/= nil (u16.16) (u16.16 u16.16) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u16.16>~ #:vpcmpgtw (u16.16) (u16.16 u16.16) :cost 1) + (two-arg-u16.16> nil (u16.16) (u16.16 u16.16) :cost 1 :encoding :fake-vop) + (two-arg-u16.16< nil (u16.16) (u16.16 u16.16) :cost 1 :encoding :fake-vop) + (two-arg-u16.16>= nil (u16.16) (u16.16 u16.16) :cost 2 :encoding :fake-vop) + (two-arg-u16.16<= nil (u16.16) (u16.16 u16.16) :cost 2 :encoding :fake-vop) + (u16.16-shiftl #:vpsllw (u16.16) (u16.16 u16.8) :cost 2) + (u16.16-shiftr #:vpsrlw (u16.16) (u16.16 u16.8) :cost 2) + (u16.16-avg #:vpavgw (u16.16) (u16.16 u16.16) :cost 1) + (u16.16-packus #:vpackusdw (u16.16) (u32.8 u32.8) :cost 1) + (u16.16-unpackhi #:vpunpckhwd (u16.16) (u16.16 u16.16) :cost 1) + (u16.16-unpacklo #:vpunpcklwd (u16.16) (u16.16 u16.16) :cost 1) + (u16.16-movemask nil (u16) (u16.16) :cost 1 :encoding :fake-vop) + (u16.16-shufflehi #:vpshufhw (u16.16) (u16.16 imm8) :cost 1) + (u16.16-shufflelo #:vpshuflw (u16.16) (u16.16 imm8) :cost 1) + (u16.8-from-u16.16 #:vextracti128 (u16.8) (u16.16 imm1) :cost 1) + (u16.16-insert-u16.8 #:vinserti128 (u16.16) (u16.16 u16.8 imm1) :cost 1) + (u16.16-permute128 #:vperm2i128 (u16.16) (u16.16 u16.16 imm8) :cost 1) + ;; u32.8 + (make-u32.8 nil (u32.8) (u32 u32 u32 u32 u32 u32 u32 u32) :cost 1 :encoding :fake-vop) + (u32.8-values nil (u32 u32 u32 u32 u32 u32 u32 u32) (u32.8) :cost 1 :encoding :fake-vop) + (u32.8-broadcast nil (u32.8) (u32) :cost 1 :encoding :fake-vop) + (u32.8-broadcastvec #:vpbroadcastd (u32.8) (u32.8) :cost 1) + (u32.8-blend #:vpblendvb (u32.8) (u32.8 u32.8 u32.8) :cost 1) + (u32.8-from-u16.8 #:vpmovzxwd (u32.8) (u16.8) :cost 5) + (u32.8-from-u8.16 #:vpmovzxbd (u32.8) (u8.16) :cost 5) + (two-arg-u32.8-and #:vpand (u32.8) (u32.8 u32.8) :cost 1 :associative t) + (two-arg-u32.8-or #:vpor (u32.8) (u32.8 u32.8) :cost 1 :associative t) + (two-arg-u32.8-xor #:vpxor (u32.8) (u32.8 u32.8) :cost 1 :associative t) + (u32.8-andc1 #:vpandn (u32.8) (u32.8 u32.8) :cost 1) + (u32.8-not nil (u32.8) (u32.8) :cost 1 :encoding :fake-vop) + (two-arg-u32.8-max #:vpmaxud (u32.8) (u32.8 u32.8) :cost 2 :associative t) + (two-arg-u32.8-min #:vpminud (u32.8) (u32.8 u32.8) :cost 2 :associative t) + (two-arg-u32.8+ #:vpaddd (u32.8) (u32.8 u32.8) :cost 2 :associative t) + (two-arg-u32.8- #:vpsubd (u32.8) (u32.8 u32.8) :cost 2) + (two-arg-u32.8= #:vpcmpeqd (u32.8) (u32.8 u32.8) :cost 1 :associative t) + (two-arg-u32.8/= nil (u32.8) (u32.8 u32.8) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u32.8>~ #:vpcmpgtd (u32.8) (u32.8 u32.8) :cost 1) + (two-arg-u32.8> nil (u32.8) (u32.8 u32.8) :cost 1 :encoding :fake-vop) + (two-arg-u32.8< nil (u32.8) (u32.8 u32.8) :cost 1 :encoding :fake-vop) + (two-arg-u32.8>= nil (u32.8) (u32.8 u32.8) :cost 2 :encoding :fake-vop) + (two-arg-u32.8<= nil (u32.8) (u32.8 u32.8) :cost 2 :encoding :fake-vop) + (u32.8-shiftl #:vpsllvd (u32.8) (u32.8 u32.8) :cost 1) + (u32.8-shiftr #:vpsrlvd (u32.8) (u32.8 u32.8) :cost 1) + (u32.8-unpackhi #:vpunpckhdq (u32.8) (u32.8 u32.8) :cost 1) + (u32.8-unpacklo #:vpunpckldq (u32.8) (u32.8 u32.8) :cost 1) + (u32.8-movemask #:vmovmskps (u8) (u32.8) :cost 1) + (u32.4-from-u32.8 #:vextracti128 (u32.4) (u32.8 imm1) :cost 1) + (u32.8-insert-u32.4 #:vinserti128 (u32.8) (u32.8 u32.4 imm1) :cost 1) + (u32.8-permute128 #:vperm2i128 (u32.8) (u32.8 u32.8 imm8) :cost 1) + ;; u64.4 + (make-u64.4 nil (u64.4) (u64 u64 u64 u64) :cost 1 :encoding :fake-vop) + (u64.4-values nil (u64 u64 u64 u64) (u64.4) :cost 1 :encoding :fake-vop) + (u64.4-broadcast nil (u64.4) (u64) :cost 1 :encoding :fake-vop) + (u64.4-broadcastvec #:vpbroadcastq (u64.4) (u64.4) :cost 1) + (u64.4-blend #:vpblendvb (u64.4) (u64.4 u64.4 u64.4) :cost 1) + (u64.4-from-u16.8 #:vpmovzxwq (u64.4) (u16.8) :cost 5) + (u64.4-from-u32.4 #:vpmovzxdq (u64.4) (u32.4) :cost 5) + (u64.4-from-u8.16 #:vpmovzxbq (u64.4) (u8.16) :cost 5) + (two-arg-u64.4-and #:vpand (u64.4) (u64.4 u64.4) :cost 1 :associative t) + (two-arg-u64.4-or #:vpor (u64.4) (u64.4 u64.4) :cost 1 :associative t) + (two-arg-u64.4-xor #:vpxor (u64.4) (u64.4 u64.4) :cost 1 :associative t) + (u64.4-andc1 #:vpandn (u64.4) (u64.4 u64.4) :cost 1) + (u64.4-not nil (u64.4) (u64.4) :cost 1 :encoding :fake-vop) + (two-arg-u64.4+ #:vpaddq (u64.4) (u64.4 u64.4) :cost 2 :associative t) + (two-arg-u64.4- #:vpsubq (u64.4) (u64.4 u64.4) :cost 2) + (two-arg-u64.4-mul #:vpmuludq (u64.4) (u64.4 u64.4) :cost 1 :associative t) + (two-arg-u64.4= #:vpcmpeqq (u64.4) (u64.4 u64.4) :cost 1 :associative t) + (two-arg-u64.4/= nil (u64.4) (u64.4 u64.4) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u64.4>~ #:vpcmpgtq (u64.4) (u64.4 u64.4) :cost 1) + (two-arg-u64.4> nil (u64.4) (u64.4 u64.4) :cost 1 :encoding :fake-vop) + (two-arg-u64.4< nil (u64.4) (u64.4 u64.4) :cost 1 :encoding :fake-vop) + (two-arg-u64.4>= nil (u64.4) (u64.4 u64.4) :cost 2 :encoding :fake-vop) + (two-arg-u64.4<= nil (u64.4) (u64.4 u64.4) :cost 2 :encoding :fake-vop) + (u64.4-shiftl #:vpsllvq (u64.4) (u64.4 u64.4) :cost 1) + (u64.4-shiftr #:vpsrlvq (u64.4) (u64.4 u64.4) :cost 1) + (u64.4-unpackhi #:vpunpckhqdq (u64.4) (u64.4 u64.4) :cost 1) + (u64.4-unpacklo #:vpunpcklqdq (u64.4) (u64.4 u64.4) :cost 1) + (u64.4-movemask #:vmovmskpd (u4) (u64.4) :cost 1) + (u64.2-from-u64.4 #:vextracti128 (u64.2) (u64.4 imm1) :cost 1) + (u64.4-insert-u64.2 #:vinserti128 (u64.4) (u64.4 u64.2 imm1) :cost 1) + (u64.4-permute128 #:vperm2i128 (u64.4) (u64.4 u64.4 imm8) :cost 1) + ;; s8.32 + (make-s8.32 nil (s8.32) (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) :cost 1 :encoding :fake-vop) + (s8.32-values nil (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) (s8.32) :cost 1 :encoding :fake-vop) + (s8.32-broadcast nil (s8.32) (s8) :cost 1 :encoding :fake-vop) + (s8.32-broadcastvec #:vpbroadcastb (s8.32) (s8.32) :cost 1) + (s8.32-blend #:vpblendvb (s8.32) (s8.32 s8.32 u8.32) :cost 1) + (two-arg-s8.32-and #:vpand (s8.32) (s8.32 s8.32) :cost 1 :associative t) + (two-arg-s8.32-or #:vpor (s8.32) (s8.32 s8.32) :cost 1 :associative t) + (two-arg-s8.32-xor #:vpxor (s8.32) (s8.32 s8.32) :cost 1 :associative t) + (s8.32-andc1 #:vpandn (s8.32) (s8.32 s8.32) :cost 1) + (s8.32-not nil (s8.32) (s8.32) :cost 1 :encoding :fake-vop) + (two-arg-s8.32-max #:vpmaxsb (s8.32) (s8.32 s8.32) :cost 2 :associative t) + (two-arg-s8.32-min #:vpminsb (s8.32) (s8.32 s8.32) :cost 2 :associative t) + (two-arg-s8.32+ #:vpaddb (s8.32) (s8.32 s8.32) :cost 2 :associative t) + (two-arg-s8.32- #:vpsubb (s8.32) (s8.32 s8.32) :cost 2) + (two-arg-s8.32= #:vpcmpeqb (u8.32) (s8.32 s8.32) :cost 1 :associative t) + (two-arg-s8.32/= nil (u8.32) (s8.32 s8.32) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s8.32> #:vpcmpgtb (u8.32) (s8.32 s8.32) :cost 1) + (two-arg-s8.32< nil (u8.32) (s8.32 s8.32) :cost 1 :encoding :fake-vop) + (two-arg-s8.32>= nil (u8.32) (s8.32 s8.32) :cost 2 :encoding :fake-vop) + (two-arg-s8.32<= nil (u8.32) (s8.32 s8.32) :cost 2 :encoding :fake-vop) + (s8.32-abs #:vpabsb (s8.32) (s8.32) :cost 2) + (s8.32-packs #:vpacksswb (s8.32) (s16.16 s16.16) :cost 2) + (s8.32-unpackhi #:vpunpckhbw (s8.32) (s8.32 s8.32) :cost 1) + (s8.32-unpacklo #:vpunpcklbw (s8.32) (s8.32 s8.32) :cost 1) + (s8.32-movemask #:vpmovmskb (u32) (s8.32) :cost 1) + (s8.32-shuffle #:vpshufb (s8.32) (s8.32 u8.32) :cost 1) + (s8.32-sign #:vpsignb (s8.32) (s8.32 s8.32) :cost 1) + (s8.32-broadcastvec #:vpbroadcastb (s8.32) (s8.32) :cost 1) + (s8.16-from-s8.32 #:vextracti128 (s8.16) (s8.32 imm1) :cost 1) + (s8.32-insert-s8.16 #:vinserti128 (s8.32) (s8.32 s8.16 imm1) :cost 1) + (s8.32-permute128 #:vperm2i128 (s8.32) (s8.32 s8.32 imm8) :cost 1) + ;; s16.16 + (make-s16.16 nil (s16.16) (s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16) :cost 1 :encoding :fake-vop) + (s16.16-values nil (s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16 s16) (s16.16) :cost 1 :encoding :fake-vop) + (s16.16-broadcast nil (s16.16) (s16) :cost 1 :encoding :fake-vop) + (s16.16-broadcastvec #:vpbroadcastw (s16.16) (s16.16) :cost 1) + (s16.16-blend #:vpblendvb (s16.16) (s16.16 s16.16 u16.16) :cost 1) + (s16.16-from-s8.16 #:vpmovsxbw (s16.16) (s8.16) :cost 5) + (s16.16-from-u8.16 #:vpmovsxbw (s16.16) (u8.16) :cost 5) + (two-arg-s16.16-and #:vpand (s16.16) (s16.16 s16.16) :cost 1 :associative t) + (two-arg-s16.16-or #:vpor (s16.16) (s16.16 s16.16) :cost 1 :associative t) + (two-arg-s16.16-xor #:vpxor (s16.16) (s16.16 s16.16) :cost 1 :associative t) + (s16.16-andc1 #:vpandn (s16.16) (s16.16 s16.16) :cost 1) + (s16.16-not nil (s16.16) (s16.16) :cost 1 :encoding :fake-vop) + (two-arg-s16.16-max #:vpmaxsw (s16.16) (s16.16 s16.16) :cost 2 :associative t) + (two-arg-s16.16-min #:vpminsw (s16.16) (s16.16 s16.16) :cost 2 :associative t) + (two-arg-s16.16+ #:vpaddw (s16.16) (s16.16 s16.16) :cost 2 :associative t) + (two-arg-s16.16- #:vpsubw (s16.16) (s16.16 s16.16) :cost 2) + (two-arg-s16.16-mulhi #:vpmulhw (s16.16) (s16.16 s16.16) :cost 1 :associative t) + (two-arg-s16.16-mullo #:vpmullw (s16.16) (s16.16 s16.16) :cost 1 :associative t) + (two-arg-s16.16-mulhrs #:vpmulhrsw (s16.16) (s16.16 s16.16) :cost 1 :associative t) + (two-arg-s16.16= #:vpcmpeqw (u16.16) (s16.16 s16.16) :cost 1 :associative t) + (two-arg-s16.16/= nil (u16.16) (s16.16 s16.16) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s16.16> #:vpcmpgtw (u16.16) (s16.16 s16.16) :cost 1) + (two-arg-s16.16< nil (u16.16) (s16.16 s16.16) :cost 1 :encoding :fake-vop) + (two-arg-s16.16>= nil (u16.16) (s16.16 s16.16) :cost 2 :encoding :fake-vop) + (two-arg-s16.16<= nil (u16.16) (s16.16 s16.16) :cost 2 :encoding :fake-vop) + (s16.16-abs #:vpabsw (s16.16) (s16.16) :cost 2) + (s16.16-hadd #:vphaddw (s16.16) (s16.16 s16.16) :cost 2) + (s16.16-hadds #:vphaddsw (s16.16) (s16.16 s16.16) :cost 2) + (s16.16-madd #:vpmaddwd (s16.16) (s16.16 s16.16) :cost 2) + (s16.16-maddubs #:vpmaddubsw (s16.16) (u8.32 s8.32) :cost 2) + (s16.16-hsub #:vphsubw (s16.16) (s16.16 s16.16) :cost 2) + (s16.16-hsubs #:vphsubsw (s16.16) (s16.16 s16.16) :cost 2) + (s16.16-packs #:vpackssdw (s16.16) (s32.8 s32.8) :cost 1) + (s16.16-unpackhi #:vpunpckhwd (s16.16) (s16.16 s16.16) :cost 1) + (s16.16-unpacklo #:vpunpcklwd (s16.16) (s16.16 s16.16) :cost 1) + (s16.16-movemask nil (u16) (s16.16) :cost 1 :encoding :fake-vop) + (s16.16-shufflehi #:vpshufhw (s16.16) (s16.16 imm8) :cost 1) + (s16.16-shufflelo #:vpshuflw (s16.16) (s16.16 imm8) :cost 1) + (s16.16-shiftl #:vpsllw (s16.16) (s16.16 s16.8) :cost 2) + (s16.16-shiftr #:vpsrlw (s16.16) (s16.16 s16.8) :cost 2) + (s16.16-sign #:vpsignw (s16.16) (s16.16 s16.16) :cost 2) + (s16.8-from-s16.16 #:vextracti128 (s16.8) (s16.16 imm1) :cost 1) + (s16.16-insert-s16.8 #:vinserti128 (s16.16) (s16.16 s16.8 imm1) :cost 1) + (s16.16-permute128 #:vperm2i128 (s16.16) (s16.16 s16.16 imm8) :cost 1) + ;; s32.8 + (make-s32.8 nil (s32.8) (s32 s32 s32 s32 s32 s32 s32 s32) :cost 1 :encoding :fake-vop) + (s32.8-values nil (s32 s32 s32 s32 s32 s32 s32 s32) (s32.8) :cost 1 :encoding :fake-vop) + (s32.8-broadcast nil (s32.8) (s32) :cost 1 :encoding :fake-vop) + (s32.8-broadcastvec #:vpbroadcastd (s32.8) (s32.8) :cost 1) + (s32.8-blend #:vpblendvb (s32.8) (s32.8 s32.8 u32.8) :cost 1) + (s32.8-from-s16.8 #:vpmovsxwd (s32.8) (s16.8) :cost 5) + (s32.8-from-u16.8 #:vpmovsxwd (s32.8) (u16.8) :cost 5) + (s32.8-from-s8.16 #:vpmovsxbd (s32.8) (s8.16) :cost 5) + (s32.8-from-u8.16 #:vpmovsxbd (s32.8) (u8.16) :cost 5) + (two-arg-s32.8-and #:vpand (s32.8) (s32.8 s32.8) :cost 1 :associative t) + (two-arg-s32.8-or #:vpor (s32.8) (s32.8 s32.8) :cost 1 :associative t) + (two-arg-s32.8-xor #:vpxor (s32.8) (s32.8 s32.8) :cost 1 :associative t) + (s32.8-andc1 #:vpandn (s32.8) (s32.8 s32.8) :cost 1) + (s32.8-not nil (s32.8) (s32.8) :cost 1 :encoding :fake-vop) + (two-arg-s32.8-max #:vpmaxsd (s32.8) (s32.8 s32.8) :cost 2 :associative t) + (two-arg-s32.8-min #:vpminsd (s32.8) (s32.8 s32.8) :cost 2 :associative t) + (two-arg-s32.8+ #:vpaddd (s32.8) (s32.8 s32.8) :cost 2 :associative t) + (two-arg-s32.8- #:vpsubd (s32.8) (s32.8 s32.8) :cost 2) + (two-arg-s32.8-mullo #:vpmulld (s32.8) (s32.8 s32.8) :cost 2 :associative t) + (two-arg-s32.8= #:vpcmpeqd (u32.8) (s32.8 s32.8) :cost 1 :associative t) + (two-arg-s32.8/= nil (u32.8) (s32.8 s32.8) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s32.8> #:vpcmpgtd (u32.8) (s32.8 s32.8) :cost 1) + (two-arg-s32.8< nil (u32.8) (s32.8 s32.8) :cost 1 :encoding :fake-vop) + (two-arg-s32.8>= nil (u32.8) (s32.8 s32.8) :cost 2 :encoding :fake-vop) + (two-arg-s32.8<= nil (u32.8) (s32.8 s32.8) :cost 2 :encoding :fake-vop) + (s32.8-abs #:vpabsd (s32.8) (s32.8) :cost 2) + (s32.8-hadd #:vphaddd (s32.8) (s32.8 s32.8) :cost 1) + (s32.8-hsub #:vphsubd (s32.8) (s32.8 s32.8) :cost 1) + (s32.8-shiftl #:vpsllvd (s32.8) (s32.8 s32.8) :cost 1) + (s32.8-shiftr #:vpsrlvd (s32.8) (s32.8 s32.8) :cost 1) + (s32.8-unpackhi #:vpunpckhdq (s32.8) (s32.8 s32.8) :cost 1) + (s32.8-unpacklo #:vpunpckldq (s32.8) (s32.8 s32.8) :cost 1) + (s32.8-movemask #:vmovmskps (u8) (s32.8) :cost 1) + (s32.8-sign #:vpsignd (s32.8) (s32.8 s32.8) :cost 1) + (s32.4-from-s32.8 #:vextracti128 (s32.4) (s32.8 imm1) :cost 1) + (s32.8-insert-s32.4 #:vinserti128 (s32.8) (s32.8 s32.4 imm1) :cost 1) + (s32.8-permute128 #:vperm2i128 (s32.8) (s32.8 s32.8 imm8) :cost 1) + ;; s64.4 + (make-s64.4 nil (s64.4) (s64 s64 s64 s64) :cost 1 :encoding :fake-vop) + (s64.4-values nil (s64 s64 s64 s64) (s64.4) :cost 1 :encoding :fake-vop) + (s64.4-broadcast nil (s64.4) (s64) :cost 1 :encoding :fake-vop) + (s64.4-broadcastvec #:vpbroadcastq (s64.4) (s64.4) :cost 1) + (s64.4-blend #:vpblendvb (s64.4) (s64.4 s64.4 u64.4) :cost 1) + (s64.4-from-s16.8 #:vpmovsxwq (s64.4) (s16.8) :cost 5) + (s64.4-from-u16.8 #:vpmovsxwq (s64.4) (u16.8) :cost 5) + (s64.4-from-s32.4 #:vpmovsxdq (s64.4) (s32.4) :cost 5) + (s64.4-from-u32.4 #:vpmovsxdq (s64.4) (u32.4) :cost 5) + (s64.4-from-s8.16 #:vpmovsxbq (s64.4) (s8.16) :cost 5) + (s64.4-from-u8.16 #:vpmovsxbq (s64.4) (u8.16) :cost 5) + (two-arg-s64.4-and #:vpand (s64.4) (s64.4 s64.4) :cost 1 :associative t) + (two-arg-s64.4-or #:vpor (s64.4) (s64.4 s64.4) :cost 1 :associative t) + (two-arg-s64.4-xor #:vpxor (s64.4) (s64.4 s64.4) :cost 1 :associative t) + (s64.4-andc1 #:vandnpd (s64.4) (s64.4 s64.4) :cost 1) + (s64.4-not nil (s64.4) (s64.4) :cost 1 :encoding :fake-vop) + (two-arg-s64.4+ #:vpaddq (s64.4) (s64.4 s64.4) :cost 1 :associative t) + (two-arg-s64.4- #:vpsubq (s64.4) (s64.4 s64.4) :cost 1) + (two-arg-s64.4-mul #:vpmuldq (s64.4) (s64.4 s64.4) :cost 1 :associative t) + (two-arg-s64.4= #:vpcmpeqq (u64.4) (s64.4 s64.4) :cost 1 :associative t) + (two-arg-s64.4/= nil (u64.4) (s64.4 s64.4) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s64.4> #:vpcmpgtq (u64.4) (s64.4 s64.4) :cost 1) + (two-arg-s64.4< nil (u64.4) (s64.4 s64.4) :cost 1 :encoding :fake-vop) + (two-arg-s64.4>= nil (u64.4) (s64.4 s64.4) :cost 2 :encoding :fake-vop) + (two-arg-s64.4<= nil (u64.4) (s64.4 s64.4) :cost 2 :encoding :fake-vop) + (s64.4-shiftl #:vpsllvq (s64.4) (s64.4 s64.4) :cost 1) + (s64.4-shiftr #:vpsrlvq (s64.4) (s64.4 s64.4) :cost 1) + (s64.4-unpackhi #:vpunpckhqdq (s64.4) (s64.4 s64.4) :cost 1) + (s64.4-unpacklo #:vpunpcklqdq (s64.4) (s64.4 s64.4) :cost 1) + (s64.4-movemask #:vmovmskpd (u4) (s64.4) :cost 1) + (s64.2-from-s64.4 #:vextracti128 (s64.2) (s64.4 imm1) :cost 1) + (s64.4-insert-s64.2 #:vinserti128 (s64.4) (s64.4 s64.2 imm1) :cost 1) + (s64.4-permute128 #:vperm2i128 (s64.4) (s64.4 s64.4 imm8) :cost 1)) + (:loads + (f32.4-ntload #:vmovntdqa f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref) + (f64.2-ntload #:vmovntdqa f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref) + (f32.8-ntload #:vmovntdqa f32.8 f32vec f32-array f32.8-non-temporal-aref f32.8-non-temporal-row-major-aref) + (f64.4-ntload #:vmovntdqa f64.4 f64vec f64-array f64.4-non-temporal-aref f64.4-non-temporal-row-major-aref) + (u8.16-ntload #:vmovntdqa u8.16 u8vec u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref) + (u16.8-ntload #:vmovntdqa u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref) + (u32.4-ntload #:vmovntdqa u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref) + (u64.2-ntload #:vmovntdqa u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref) + (s8.16-ntload #:vmovntdqa s8.16 s8vec s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref) + (s16.8-ntload #:vmovntdqa s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref) + (s32.4-ntload #:vmovntdqa s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref) + (s64.2-ntload #:vmovntdqa s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref) + (u8.32-ntload #:vmovntdqa u8.32 u8vec u8-array u8.32-non-temporal-aref u8.32-non-temporal-row-major-aref) + (u16.16-ntload #:vmovntdqa u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref) + (u32.8-ntload #:vmovntdqa u32.8 u32vec u32-array u32.8-non-temporal-aref u32.8-non-temporal-row-major-aref) + (u64.4-ntload #:vmovntdqa u64.4 u64vec u64-array u64.4-non-temporal-aref u64.4-non-temporal-row-major-aref) + (s8.32-ntload #:vmovntdqa s8.32 s8vec s8-array s8.32-non-temporal-aref s8.32-non-temporal-row-major-aref) + (s16.16-ntload #:vmovntdqa s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref) + (s32.8-ntload #:vmovntdqa s32.8 s32vec s32-array s32.8-non-temporal-aref s32.8-non-temporal-row-major-aref) + (s64.4-ntload #:vmovntdqa s64.4 s64vec s64-array s64.4-non-temporal-aref s64.4-non-temporal-row-major-aref)) + (:stores + (f32.4-ntstore #:vmovntps f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref) + (f64.2-ntstore #:vmovntpd f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref) + (f32.8-ntstore #:vmovntps f32.8 f32vec f32-array f32.8-non-temporal-aref f32.8-non-temporal-row-major-aref) + (f64.4-ntstore #:vmovntpd f64.4 f64vec f64-array f64.4-non-temporal-aref f64.4-non-temporal-row-major-aref) + (u8.16-ntstore #:vmovntdq u8.16 u8vec u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref) + (u16.8-ntstore #:vmovntdq u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref) + (u32.4-ntstore #:vmovntdq u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref) + (u64.2-ntstore #:vmovntdq u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref) + (s8.16-ntstore #:vmovntdq s8.16 s8vec s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref) + (s16.8-ntstore #:vmovntdq s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref) + (s32.4-ntstore #:vmovntdq s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref) + (s64.2-ntstore #:vmovntdq s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref) + (u8.32-ntstore #:vmovntdq u8.32 u8vec u8-array u8.32-non-temporal-aref u8.32-non-temporal-row-major-aref) + (u16.16-ntstore #:vmovntdq u16.16 u16vec u16-array u16.16-non-temporal-aref u16.16-non-temporal-row-major-aref) + (u32.8-ntstore #:vmovntdq u32.8 u32vec u32-array u32.8-non-temporal-aref u32.8-non-temporal-row-major-aref) + (u64.4-ntstore #:vmovntdq u64.4 u64vec u64-array u64.4-non-temporal-aref u64.4-non-temporal-row-major-aref) + (s8.32-ntstore #:vmovntdq s8.32 s8vec s8-array s8.32-non-temporal-aref s8.32-non-temporal-row-major-aref) + (s16.16-ntstore #:vmovntdq s16.16 s16vec s16-array s16.16-non-temporal-aref s16.16-non-temporal-row-major-aref) + (s32.8-ntstore #:vmovntdq s32.8 s32vec s32-array s32.8-non-temporal-aref s32.8-non-temporal-row-major-aref) + (s64.4-ntstore #:vmovntdq s64.4 s64vec s64-array s64.4-non-temporal-aref s64.4-non-temporal-row-major-aref)) + (:associatives + (u8.32-and two-arg-u8.32-and +u8-true+) + (u8.32-or two-arg-u8.32-or +u8-false+) + (u8.32-xor two-arg-u8.32-xor +u8-false+) + (u8.32-max two-arg-u8.32-max nil) + (u8.32-min two-arg-u8.32-min nil) + (u8.32+ two-arg-u8.32+ 0) + (u16.16-and two-arg-u16.16-and +u16-true+) + (u16.16-or two-arg-u16.16-or +u16-false+) + (u16.16-xor two-arg-u16.16-xor +u16-false+) + (u16.16-max two-arg-u16.16-max nil) + (u16.16-min two-arg-u16.16-min nil) + (u16.16+ two-arg-u16.16+ 0) + (u32.8-and two-arg-u32.8-and +u32-true+) + (u32.8-or two-arg-u32.8-or +u32-false+) + (u32.8-xor two-arg-u32.8-xor +u32-false+) + (u32.8-max two-arg-u32.8-max nil) + (u32.8-min two-arg-u32.8-min nil) + (u32.8+ two-arg-u32.8+ 0) + (u64.4-and two-arg-u64.4-and +u64-true+) + (u64.4-or two-arg-u64.4-or +u64-false+) + (u64.4-xor two-arg-u64.4-xor +u64-false+) + (u64.4+ two-arg-u64.4+ 0) + (u64.4-mul two-arg-u64.4-mul 1) + (s8.32-and two-arg-s8.32-and +s8-true+) + (s8.32-or two-arg-s8.32-or +s8-false+) + (s8.32-xor two-arg-s8.32-xor +s8-false+) + (s8.32-max two-arg-s8.32-max nil) + (s8.32-min two-arg-s8.32-min nil) + (s8.32+ two-arg-s8.32+ 0) + (s16.16-and two-arg-s16.16-and +s16-true+) + (s16.16-or two-arg-s16.16-or +s16-false+) + (s16.16-xor two-arg-s16.16-xor +s16-false+) + (s16.16-max two-arg-s16.16-max nil) + (s16.16-min two-arg-s16.16-min nil) + (s16.16+ two-arg-s16.16+ 0) + (s16.16-mulhi two-arg-s16.16-mulhi 1) + (s16.16-mullo two-arg-s16.16-mullo 1) + (s16.16-mulhrs two-arg-s16.16-mulhrs 1) + (s32.8-and two-arg-s32.8-and +s32-true+) + (s32.8-or two-arg-s32.8-or +s32-false+) + (s32.8-xor two-arg-s32.8-xor +s32-false+) + (s32.8-max two-arg-s32.8-max nil) + (s32.8-min two-arg-s32.8-min nil) + (s32.8+ two-arg-s32.8+ 0) + (s32.8-mullo two-arg-s32.8-mullo 1) + (s64.4-and two-arg-s64.4-and +s64-true+) + (s64.4-or two-arg-s64.4-or +s64-false+) + (s64.4-xor two-arg-s64.4-xor +s64-false+) + (s64.4+ two-arg-s64.4+ 0) + (s64.4-mul two-arg-s64.4-mul 1)) + (:comparisons + (u8.32= two-arg-u8.32= u8.32-and +u8-true+) + (u8.32< two-arg-u8.32< u8.32-and +u8-true+) + (u8.32<= two-arg-u8.32<= u8.32-and +u8-true+) + (u8.32> two-arg-u8.32> u8.32-and +u8-true+) + (u8.32>= two-arg-u8.32>= u8.32-and +u8-true+) + (u16.16= two-arg-u16.16= u16.16-and +u16-true+) + (u16.16< two-arg-u16.16< u16.16-and +u16-true+) + (u16.16<= two-arg-u16.16<= u16.16-and +u16-true+) + (u16.16> two-arg-u16.16> u16.16-and +u16-true+) + (u16.16>= two-arg-u16.16>= u16.16-and +u16-true+) + (u32.8= two-arg-u32.8= u32.8-and +u32-true+) + (u32.8< two-arg-u32.8< u32.8-and +u32-true+) + (u32.8<= two-arg-u32.8<= u32.8-and +u32-true+) + (u32.8> two-arg-u32.8> u32.8-and +u32-true+) + (u32.8>= two-arg-u32.8>= u32.8-and +u32-true+) + (u64.4= two-arg-u64.4= u64.4-and +u64-true+) + (u64.4< two-arg-u64.4< u64.4-and +u64-true+) + (u64.4<= two-arg-u64.4<= u64.4-and +u64-true+) + (u64.4> two-arg-u64.4> u64.4-and +u64-true+) + (u64.4>= two-arg-u64.4>= u64.4-and +u64-true+) + (s8.32= two-arg-s8.32= u8.32-and +u8-true+) + (s8.32< two-arg-s8.32< u8.32-and +u8-true+) + (s8.32<= two-arg-s8.32<= u8.32-and +u8-true+) + (s8.32> two-arg-s8.32> u8.32-and +u8-true+) + (s8.32>= two-arg-s8.32>= u8.32-and +u8-true+) + (s16.16= two-arg-s16.16= u16.16-and +u16-true+) + (s16.16< two-arg-s16.16< u16.16-and +u16-true+) + (s16.16<= two-arg-s16.16<= u16.16-and +u16-true+) + (s16.16> two-arg-s16.16> u16.16-and +u16-true+) + (s16.16>= two-arg-s16.16>= u16.16-and +u16-true+) + (s32.8= two-arg-s32.8= u32.8-and +u32-true+) + (s32.8< two-arg-s32.8< u32.8-and +u32-true+) + (s32.8<= two-arg-s32.8<= u32.8-and +u32-true+) + (s32.8> two-arg-s32.8> u32.8-and +u32-true+) + (s32.8>= two-arg-s32.8>= u32.8-and +u32-true+) + (s64.4= two-arg-s64.4= u64.4-and +u64-true+) + (s64.4< two-arg-s64.4< u64.4-and +u64-true+) + (s64.4<= two-arg-s64.4<= u64.4-and +u64-true+) + (s64.4> two-arg-s64.4> u64.4-and +u64-true+) + (s64.4>= two-arg-s64.4>= u64.4-and +u64-true+)) + (:ifs + (u8.32-if u8.32-blend) + (u16.16-if u16.16-blend) + (u32.8-if u32.8-blend) + (u64.4-if u64.4-blend) + (s8.32-if s8.32-blend) + (s16.16-if s16.16-blend) + (s32.8-if s32.8-blend) + (s64.4-if s64.4-blend)) + (:reducers + (u8.32- two-arg-u8.32- 0) + (u16.16- two-arg-u16.16- 0) + (u32.8- two-arg-u32.8- 0) + (u64.4- two-arg-u64.4- 0) + (s8.32- two-arg-s8.32- 0) + (s16.16- two-arg-s16.16- 0) + (s32.8- two-arg-s32.8- 0) + (s64.4- two-arg-s64.4- 0)) + (:unequals + (u8.32/= two-arg-u8.32/= u8.32-and +u8-true+) + (u16.16/= two-arg-u16.16/= u16.16-and +u16-true+) + (u32.8/= two-arg-u32.8/= u32.8-and +u32-true+) + (u64.4/= two-arg-u64.4/= u64.4-and +u64-true+) + (s8.32/= two-arg-s8.32/= u8.32-and +u8-true+) + (s16.16/= two-arg-s16.16/= u16.16-and +u16-true+) + (s32.8/= two-arg-s32.8/= u32.8-and +u32-true+) + (s64.4/= two-arg-s64.4/= u64.4-and +u64-true+))) diff --git a/contrib/sb-simd/code/instruction-sets/fma.lisp b/contrib/sb-simd/code/instruction-sets/fma.lisp new file mode 100644 index 0000000000..cbeeaed24c --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/fma.lisp @@ -0,0 +1,38 @@ +(in-package #:sb-simd-fma) + +(define-instruction-set :fma + (:test (fma-supported-p)) + (:include :avx2) + (:instructions + ;; f32 + (f32-fmadd #:vfmadd213ss (f32) (f32 f32 f32) :cost 1 :encoding :fma) + (f32-fnmadd #:vfnmadd213ss (f32) (f32 f32 f32) :cost 1 :encoding :fma) + (f32-fmsub #:vfmsub213ss (f32) (f32 f32 f32) :cost 1 :encoding :fma) + ;; f64 + (f64-fmadd #:vfmadd213sd (f64) (f64 f64 f64) :cost 1 :encoding :fma) + (f64-fnmadd #:vfnmadd213sd (f64) (f64 f64 f64) :cost 1 :encoding :fma) + (f64-fmsub #:vfmsub213sd (f64) (f64 f64 f64) :cost 1 :encoding :fma) + ;; f32.4 + (f32.4-fmadd #:vfmadd213ps (f32.4) (f32.4 f32.4 f32.4) :cost 1 :encoding :fma) + (f32.4-fnmadd #:vfnmadd213ps (f32.4) (f32.4 f32.4 f32.4) :cost 1 :encoding :fma) + (f32.4-fmsub #:vfmsub213ps (f32.4) (f32.4 f32.4 f32.4) :cost 1 :encoding :fma) + (f32.4-fmaddsub #:vfmaddsub213ps (f32.4) (f32.4 f32.4 f32.4) :cost 1 :encoding :fma) + (f32.4-fmsubadd #:vfmsubadd213ps (f32.4) (f32.4 f32.4 f32.4) :cost 1 :encoding :fma) + ;; f32.8 + (f32.8-fmadd #:vfmadd213ps (f32.8) (f32.8 f32.8 f32.8) :cost 1 :encoding :fma) + (f32.8-fnmadd #:vfnmadd213ps (f32.8) (f32.8 f32.8 f32.8) :cost 1 :encoding :fma) + (f32.8-fmsub #:vfmsub213ps (f32.8) (f32.8 f32.8 f32.8) :cost 1 :encoding :fma) + (f32.8-fmaddsub #:vfmaddsub213ps (f32.8) (f32.8 f32.8 f32.8) :cost 1 :encoding :fma) + (f32.8-fmsubadd #:vfmsubadd213ps (f32.8) (f32.8 f32.8 f32.8) :cost 1 :encoding :fma) + ;; f64.2 + (f64.2-fmadd #:vfmadd213pd (f64.2) (f64.2 f64.2 f64.2) :cost 1 :encoding :fma) + (f64.2-fnmadd #:vfnmadd213pd (f64.2) (f64.2 f64.2 f64.2) :cost 1 :encoding :fma) + (f64.2-fmsub #:vfmsub213pd (f64.2) (f64.2 f64.2 f64.2) :cost 1 :encoding :fma) + (f64.2-fmaddsub #:vfmaddsub213pd (f64.2) (f64.2 f64.2 f64.2) :cost 1 :encoding :fma) + (f64.2-fmsubadd #:vfmsubadd213pd (f64.2) (f64.2 f64.2 f64.2) :cost 1 :encoding :fma) + ;; f64.4 + (f64.4-fmadd #:vfmadd213pd (f64.4) (f64.4 f64.4 f64.4) :cost 1 :encoding :fma) + (f64.4-fnmadd #:vfnmadd213pd (f64.4) (f64.4 f64.4 f64.4) :cost 1 :encoding :fma) + (f64.4-fmsub #:vfmsub213pd (f64.4) (f64.4 f64.4 f64.4) :cost 1 :encoding :fma) + (f64.4-fmaddsub #:vfmaddsub213pd (f64.4) (f64.4 f64.4 f64.4) :cost 1 :encoding :fma) + (f64.4-fmsubadd #:vfmsubadd213pd (f64.4) (f64.4 f64.4 f64.4) :cost 1 :encoding :fma))) diff --git a/contrib/sb-simd/code/instruction-sets/sb-simd.lisp b/contrib/sb-simd/code/instruction-sets/sb-simd.lisp new file mode 100644 index 0000000000..5595a0e0b2 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/sb-simd.lisp @@ -0,0 +1,391 @@ +(in-package #:sb-simd) + +(define-instruction-set :sb-simd + (:scalars + (any 64 t #:t) + ;; Numbers + (index 64 sb-simd-internals::index #:signed-num (#:signed-reg)) + (u1 1 (unsigned-byte 1) #:unsigned-num (#:unsigned-reg)) + (u2 2 (unsigned-byte 2) #:unsigned-num (#:unsigned-reg)) + (u4 4 (unsigned-byte 4) #:unsigned-num (#:unsigned-reg)) + (u8 8 (unsigned-byte 8) #:unsigned-num (#:unsigned-reg)) + (u16 16 (unsigned-byte 16) #:unsigned-num (#:unsigned-reg)) + (u32 32 (unsigned-byte 32) #:unsigned-num (#:unsigned-reg)) + (u64 64 (unsigned-byte 64) #:unsigned-num (#:unsigned-reg)) + (s8 8 (signed-byte 8) #:signed-num (#:signed-reg)) + (s16 16 (signed-byte 16) #:signed-num (#:signed-reg)) + (s32 32 (signed-byte 32) #:signed-num (#:signed-reg)) + (s64 64 (signed-byte 64) #:signed-num (#:signed-reg)) + (f32 32 single-float #:single-float (#:single-reg)) + (f64 64 double-float #:double-float (#:double-reg)) + ;; Vectors + (charvec 64 (simple-array character (*)) #:simple-character-string) + ( u8vec 64 (simple-array (unsigned-byte 8) (*)) #:simple-array-unsigned-byte-8) + (u16vec 64 (simple-array (unsigned-byte 16) (*)) #:simple-array-unsigned-byte-16) + (u32vec 64 (simple-array (unsigned-byte 32) (*)) #:simple-array-unsigned-byte-32) + (u64vec 64 (simple-array (unsigned-byte 64) (*)) #:simple-array-unsigned-byte-64) + ( s8vec 64 (simple-array (signed-byte 8) (*)) #:simple-array-signed-byte-8) + (s16vec 64 (simple-array (signed-byte 16) (*)) #:simple-array-signed-byte-16) + (s32vec 64 (simple-array (signed-byte 32) (*)) #:simple-array-signed-byte-32) + (s64vec 64 (simple-array (signed-byte 64) (*)) #:simple-array-signed-byte-64) + (f32vec 64 (simple-array single-float (*)) #:simple-array-single-float) + (f64vec 64 (simple-array double-float (*)) #:simple-array-double-float) + ;; Arrays + (char-array 64 (array character)) + ( u8-array 64 (array (unsigned-byte 8))) + (u16-array 64 (array (unsigned-byte 16))) + (u32-array 64 (array (unsigned-byte 32))) + (u64-array 64 (array (unsigned-byte 64))) + ( s8-array 64 (array (signed-byte 8))) + (s16-array 64 (array (signed-byte 16))) + (s32-array 64 (array (signed-byte 32))) + (s64-array 64 (array (signed-byte 64))) + (f32-array 64 (array single-float)) + (f64-array 64 (array double-float))) + (:instructions + ;; ub64 packers and unpackers + (u64-from-f32 nil (u64) (f32 f32) :encoding :fake-vop) + (u64-from-f64 nil (u64) (f64) :encoding :fake-vop) + (u64-from-u8s nil (u64) (u8 u8 u8 u8 u8 u8 u8 u8) :encoding :fake-vop) + (u64-from-u16s nil (u64) (u16 u16 u16 u16) :encoding :fake-vop) + (u64-from-u32s nil (u64) (u32 u32) :encoding :fake-vop) + (u64-from-s8s nil (u64) (s8 s8 s8 s8 s8 s8 s8 s8) :encoding :fake-vop) + (u64-from-s16s nil (u64) (s16 s16 s16 s16) :encoding :fake-vop) + (u64-from-s32s nil (u64) (s32 s32) :encoding :fake-vop) + (u64-from-s64 nil (u64) (s64) :encoding :fake-vop) + ( u8s-from-u64 nil (u8 u8 u8 u8 u8 u8 u8 u8) (u64) :encoding :fake-vop) + (u16s-from-u64 nil (u16 u16 u16 u16) (u64) :encoding :fake-vop) + (u32s-from-u64 nil (u32 u32) (u64) :encoding :fake-vop) + ( s8s-from-u64 nil (s8 s8 s8 s8 s8 s8 s8 s8) (u64) :encoding :fake-vop) + (s16s-from-u64 nil (s16 s16 s16 s16) (u64) :encoding :fake-vop) + (s32s-from-u64 nil (s32 s32) (u64) :encoding :fake-vop) + ( s64-from-u64 nil (s64) (u64) :encoding :fake-vop) + ;; f32 + (f32-if nil (f32) (u32 f32 f32) :encoding :fake-vop) + (two-arg-f32-and nil (f32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32-or nil (f32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32-xor nil (f32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32-max nil (f32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32-min nil (f32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32+ nil (f32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32- nil (f32) (f32 f32) :encoding :fake-vop) + (two-arg-f32* nil (f32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32/ nil (f32) (f32 f32) :encoding :fake-vop) + (two-arg-f32= nil (u32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32/= nil (u32) (f32 f32) :encoding :fake-vop :associative t) + (two-arg-f32< nil (u32) (f32 f32) :encoding :fake-vop) + (two-arg-f32<= nil (u32) (f32 f32) :encoding :fake-vop) + (two-arg-f32> nil (u32) (f32 f32) :encoding :fake-vop) + (two-arg-f32>= nil (u32) (f32 f32) :encoding :fake-vop) + (f32-andc1 nil (f32) (f32 f32) :encoding :fake-vop) + (f32-not nil (f32) (f32) :encoding :fake-vop) + (f32-reciprocal nil (f32) (f32) :encoding :fake-vop) + (f32-rsqrt nil (f32) (f32) :encoding :fake-vop) + (f32-sqrt nil (f32) (f32) :encoding :fake-vop) + ;; f64 + (f64-if nil (f64) (u64 f64 f64) :encoding :fake-vop) + (two-arg-f64-and nil (f64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64-or nil (f64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64-xor nil (f64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64-max nil (f64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64-min nil (f64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64+ nil (f64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64- nil (f64) (f64 f64) :encoding :fake-vop) + (two-arg-f64* nil (f64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64/ nil (f64) (f64 f64) :encoding :fake-vop) + (two-arg-f64= nil (u64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64/= nil (u64) (f64 f64) :encoding :fake-vop :associative t) + (two-arg-f64< nil (u64) (f64 f64) :encoding :fake-vop) + (two-arg-f64<= nil (u64) (f64 f64) :encoding :fake-vop) + (two-arg-f64> nil (u64) (f64 f64) :encoding :fake-vop) + (two-arg-f64>= nil (u64) (f64 f64) :encoding :fake-vop) + (f64-andc1 nil (f64) (f64 f64) :encoding :fake-vop) + (f64-not nil (f64) (f64) :encoding :fake-vop) + (f64-reciprocal nil (f64) (f64) :encoding :fake-vop) + (f64-rsqrt nil (f64) (f64) :encoding :fake-vop) + (f64-sqrt nil (f64) (f64) :encoding :fake-vop) + ;; u8 + (u8-if nil (u8) (u8 u8 u8) :encoding :fake-vop) + (two-arg-u8-and nil (u8) (u8 u8) :encoding :fake-vop :associative t) + (two-arg-u8-or nil (u8) (u8 u8) :encoding :fake-vop :associative t) + (two-arg-u8-xor nil (u8) (u8 u8) :encoding :fake-vop :associative t) + (two-arg-u8-max nil (u8) (u8 u8) :encoding :fake-vop :associative t) + (two-arg-u8-min nil (u8) (u8 u8) :encoding :fake-vop :associative t) + (two-arg-u8+ nil (u8) (u8 u8) :encoding :fake-vop :associative t) + (two-arg-u8- nil (u8) (u8 u8) :encoding :fake-vop) + (two-arg-u8= nil (u8) (u8 u8) :encoding :fake-vop :associative t) + (two-arg-u8/= nil (u8) (u8 u8) :encoding :fake-vop :associative t) + (two-arg-u8< nil (u8) (u8 u8) :encoding :fake-vop) + (two-arg-u8<= nil (u8) (u8 u8) :encoding :fake-vop) + (two-arg-u8> nil (u8) (u8 u8) :encoding :fake-vop) + (two-arg-u8>= nil (u8) (u8 u8) :encoding :fake-vop) + (u8-andc1 nil (u8) (u8 u8) :encoding :fake-vop) + (u8-not nil (u8) (u8) :encoding :fake-vop) + ;; u16 + (u16-if nil (u16) (u16 u16 u16) :encoding :fake-vop) + (two-arg-u16-and nil (u16) (u16 u16) :encoding :fake-vop :associative t) + (two-arg-u16-or nil (u16) (u16 u16) :encoding :fake-vop :associative t) + (two-arg-u16-xor nil (u16) (u16 u16) :encoding :fake-vop :associative t) + (two-arg-u16-max nil (u16) (u16 u16) :encoding :fake-vop :associative t) + (two-arg-u16-min nil (u16) (u16 u16) :encoding :fake-vop :associative t) + (two-arg-u16+ nil (u16) (u16 u16) :encoding :fake-vop :associative t) + (two-arg-u16- nil (u16) (u16 u16) :encoding :fake-vop) + (two-arg-u16= nil (u16) (u16 u16) :encoding :fake-vop :associative t) + (two-arg-u16/= nil (u16) (u16 u16) :encoding :fake-vop :associative t) + (two-arg-u16< nil (u16) (u16 u16) :encoding :fake-vop) + (two-arg-u16<= nil (u16) (u16 u16) :encoding :fake-vop) + (two-arg-u16> nil (u16) (u16 u16) :encoding :fake-vop) + (two-arg-u16>= nil (u16) (u16 u16) :encoding :fake-vop) + (u16-andc1 nil (u16) (u16 u16) :encoding :fake-vop) + (u16-not nil (u16) (u16) :encoding :fake-vop) + ;; u32 + (u32-if nil (u32) (u32 u32 u32) :encoding :fake-vop) + (two-arg-u32-and nil (u32) (u32 u32) :encoding :fake-vop :associative t) + (two-arg-u32-or nil (u32) (u32 u32) :encoding :fake-vop :associative t) + (two-arg-u32-xor nil (u32) (u32 u32) :encoding :fake-vop :associative t) + (two-arg-u32-max nil (u32) (u32 u32) :encoding :fake-vop :associative t) + (two-arg-u32-min nil (u32) (u32 u32) :encoding :fake-vop :associative t) + (two-arg-u32+ nil (u32) (u32 u32) :encoding :fake-vop :associative t) + (two-arg-u32- nil (u32) (u32 u32) :encoding :fake-vop) + (two-arg-u32= nil (u32) (u32 u32) :encoding :fake-vop :associative t) + (two-arg-u32/= nil (u32) (u32 u32) :encoding :fake-vop :associative t) + (two-arg-u32< nil (u32) (u32 u32) :encoding :fake-vop) + (two-arg-u32<= nil (u32) (u32 u32) :encoding :fake-vop) + (two-arg-u32> nil (u32) (u32 u32) :encoding :fake-vop) + (two-arg-u32>= nil (u32) (u32 u32) :encoding :fake-vop) + (u32-andc1 nil (u32) (u32 u32) :encoding :fake-vop) + (u32-not nil (u32) (u32) :encoding :fake-vop) + ;; u64 + (u64-if nil (u64) (u64 u64 u64) :encoding :fake-vop) + (two-arg-u64-and nil (u64) (u64 u64) :encoding :fake-vop :associative t) + (two-arg-u64-or nil (u64) (u64 u64) :encoding :fake-vop :associative t) + (two-arg-u64-xor nil (u64) (u64 u64) :encoding :fake-vop :associative t) + (two-arg-u64-max nil (u64) (u64 u64) :encoding :fake-vop :associative t) + (two-arg-u64-min nil (u64) (u64 u64) :encoding :fake-vop :associative t) + (two-arg-u64+ nil (u64) (u64 u64) :encoding :fake-vop :associative t) + (two-arg-u64- nil (u64) (u64 u64) :encoding :fake-vop) + (two-arg-u64= nil (u64) (u64 u64) :encoding :fake-vop :associative t) + (two-arg-u64/= nil (u64) (u64 u64) :encoding :fake-vop :associative t) + (two-arg-u64< nil (u64) (u64 u64) :encoding :fake-vop) + (two-arg-u64<= nil (u64) (u64 u64) :encoding :fake-vop) + (two-arg-u64> nil (u64) (u64 u64) :encoding :fake-vop) + (two-arg-u64>= nil (u64) (u64 u64) :encoding :fake-vop) + (u64-andc1 nil (u64) (u64 u64) :encoding :fake-vop) + (u64-not nil (u64) (u64) :encoding :fake-vop) + ;; s8 + (s8-if nil (s8) (u8 s8 s8) :encoding :fake-vop) + (two-arg-s8-and nil (s8) (s8 s8) :encoding :fake-vop :associative t) + (two-arg-s8-or nil (s8) (s8 s8) :encoding :fake-vop :associative t) + (two-arg-s8-xor nil (s8) (s8 s8) :encoding :fake-vop :associative t) + (two-arg-s8-max nil (s8) (s8 s8) :encoding :fake-vop :associative t) + (two-arg-s8-min nil (s8) (s8 s8) :encoding :fake-vop :associative t) + (two-arg-s8+ nil (s8) (s8 s8) :encoding :fake-vop :associative t) + (two-arg-s8- nil (s8) (s8 s8) :encoding :fake-vop) + (two-arg-s8= nil (u8) (s8 s8) :encoding :fake-vop :associative t) + (two-arg-s8/= nil (u8) (s8 s8) :encoding :fake-vop :associative t) + (two-arg-s8< nil (u8) (s8 s8) :encoding :fake-vop) + (two-arg-s8<= nil (u8) (s8 s8) :encoding :fake-vop) + (two-arg-s8> nil (u8) (s8 s8) :encoding :fake-vop) + (two-arg-s8>= nil (u8) (s8 s8) :encoding :fake-vop) + (s8-andc1 nil (s8) (s8 s8) :encoding :fake-vop) + (s8-not nil (s8) (s8) :encoding :fake-vop) + ;; s16 + (s16-if nil (s16) (u16 s16 s16) :encoding :fake-vop) + (two-arg-s16-and nil (s16) (s16 s16) :encoding :fake-vop :associative t) + (two-arg-s16-or nil (s16) (s16 s16) :encoding :fake-vop :associative t) + (two-arg-s16-xor nil (s16) (s16 s16) :encoding :fake-vop :associative t) + (two-arg-s16-max nil (s16) (s16 s16) :encoding :fake-vop :associative t) + (two-arg-s16-min nil (s16) (s16 s16) :encoding :fake-vop :associative t) + (two-arg-s16+ nil (s16) (s16 s16) :encoding :fake-vop :associative t) + (two-arg-s16- nil (s16) (s16 s16) :encoding :fake-vop) + (two-arg-s16= nil (u16) (s16 s16) :encoding :fake-vop :associative t) + (two-arg-s16/= nil (u16) (s16 s16) :encoding :fake-vop :associative t) + (two-arg-s16< nil (u16) (s16 s16) :encoding :fake-vop) + (two-arg-s16<= nil (u16) (s16 s16) :encoding :fake-vop) + (two-arg-s16> nil (u16) (s16 s16) :encoding :fake-vop) + (two-arg-s16>= nil (u16) (s16 s16) :encoding :fake-vop) + (s16-andc1 nil (s16) (s16 s16) :encoding :fake-vop) + (s16-not nil (s16) (s16) :encoding :fake-vop) + ;; s32 + (s32-if nil (s32) (u32 s32 s32) :encoding :fake-vop) + (two-arg-s32-and nil (s32) (s32 s32) :encoding :fake-vop :associative t) + (two-arg-s32-or nil (s32) (s32 s32) :encoding :fake-vop :associative t) + (two-arg-s32-xor nil (s32) (s32 s32) :encoding :fake-vop :associative t) + (two-arg-s32-max nil (s32) (s32 s32) :encoding :fake-vop :associative t) + (two-arg-s32-min nil (s32) (s32 s32) :encoding :fake-vop :associative t) + (two-arg-s32+ nil (s32) (s32 s32) :encoding :fake-vop :associative t) + (two-arg-s32- nil (s32) (s32 s32) :encoding :fake-vop) + (two-arg-s32= nil (u32) (s32 s32) :encoding :fake-vop :associative t) + (two-arg-s32/= nil (u32) (s32 s32) :encoding :fake-vop :associative t) + (two-arg-s32< nil (u32) (s32 s32) :encoding :fake-vop) + (two-arg-s32<= nil (u32) (s32 s32) :encoding :fake-vop) + (two-arg-s32> nil (u32) (s32 s32) :encoding :fake-vop) + (two-arg-s32>= nil (u32) (s32 s32) :encoding :fake-vop) + (s32-andc1 nil (s32) (s32 s32) :encoding :fake-vop) + (s32-not nil (s32) (s32) :encoding :fake-vop) + ;; s64 + (s64-if nil (s64) (u64 s64 s64) :encoding :fake-vop) + (two-arg-s64-and nil (s64) (s64 s64) :encoding :fake-vop :associative t) + (two-arg-s64-or nil (s64) (s64 s64) :encoding :fake-vop :associative t) + (two-arg-s64-xor nil (s64) (s64 s64) :encoding :fake-vop :associative t) + (two-arg-s64-max nil (s64) (s64 s64) :encoding :fake-vop :associative t) + (two-arg-s64-min nil (s64) (s64 s64) :encoding :fake-vop :associative t) + (two-arg-s64+ nil (s64) (s64 s64) :encoding :fake-vop :associative t) + (two-arg-s64- nil (s64) (s64 s64) :encoding :fake-vop) + (two-arg-s64= nil (u64) (s64 s64) :encoding :fake-vop :associative t) + (two-arg-s64/= nil (u64) (s64 s64) :encoding :fake-vop :associative t) + (two-arg-s64< nil (u64) (s64 s64) :encoding :fake-vop) + (two-arg-s64<= nil (u64) (s64 s64) :encoding :fake-vop) + (two-arg-s64> nil (u64) (s64 s64) :encoding :fake-vop) + (two-arg-s64>= nil (u64) (s64 s64) :encoding :fake-vop) + (s64-andc1 nil (s64) (s64 s64) :encoding :fake-vop) + (s64-not nil (s64) (s64) :encoding :fake-vop)) + (:reffers + (f32 f32-array f32-aref f32-row-major-aref) + (f64 f64-array f64-aref f64-row-major-aref) + ( u8 u8-array u8-aref u8-row-major-aref) + (u16 u16-array u16-aref u16-row-major-aref) + (u32 u32-array u32-aref u32-row-major-aref) + (u64 u64-array u64-aref u64-row-major-aref) + ( s8 s8-array s8-aref s8-row-major-aref) + (s16 s16-array s16-aref s16-row-major-aref) + (s32 s32-array s32-aref s32-row-major-aref) + (s64 s64-array s64-aref s64-row-major-aref)) + (:associatives + (f32-and two-arg-f32-and +f32-true+) + (f32-or two-arg-f32-or +f32-false+) + (f32-xor two-arg-f32-xor +f32-false+) + (f32-max two-arg-f32-max nil) + (f32-min two-arg-f32-min nil) + (f32+ two-arg-f32+ 0f0) + (f32* two-arg-f32* 1f0) + (f64-and two-arg-f64-and +f64-true+) + (f64-or two-arg-f64-or +f64-false+) + (f64-xor two-arg-f64-xor +f64-false+) + (f64-max two-arg-f64-max nil) + (f64-min two-arg-f64-min nil) + (f64+ two-arg-f64+ 0d0) + (f64* two-arg-f64* 1d0) + ( u8-and two-arg-u8-and +u8-true+) + ( u8-or two-arg-u8-or +u8-false+) + ( u8-xor two-arg-u8-xor +u8-false+) + ( u8-max two-arg-u8-max nil) + ( u8-min two-arg-u8-min nil) + ( u8+ two-arg-u8+ 0) + (u16-and two-arg-u16-and +u16-true+) + (u16-or two-arg-u16-or +u16-false+) + (u16-xor two-arg-u16-xor +u16-false+) + (u16-max two-arg-u16-max nil) + (u16-min two-arg-u16-min nil) + (u16+ two-arg-u16+ 0) + (u32-and two-arg-u32-and +u32-true+) + (u32-or two-arg-u32-or +u32-false+) + (u32-xor two-arg-u32-xor +u32-false+) + (u32-max two-arg-u32-max nil) + (u32-min two-arg-u32-min nil) + (u32+ two-arg-u32+ 0) + (u64-and two-arg-u64-and +u64-true+) + (u64-or two-arg-u64-or +u64-false+) + (u64-xor two-arg-u64-xor +u64-false+) + (u64-max two-arg-u64-max nil) + (u64-min two-arg-u64-min nil) + (u64+ two-arg-u64+ 0) + ( s8-and two-arg-s8-and +s8-true+) + ( s8-or two-arg-s8-or +s8-false+) + ( s8-xor two-arg-s8-xor +s8-false+) + ( s8-max two-arg-s8-max nil) + ( s8-min two-arg-s8-min nil) + ( s8+ two-arg-s8+ 0) + (s16-and two-arg-s16-and +s16-true+) + (s16-or two-arg-s16-or +s16-false+) + (s16-xor two-arg-s16-xor +s16-false+) + (s16-max two-arg-s16-max nil) + (s16-min two-arg-s16-min nil) + (s16+ two-arg-s16+ 0) + (s32-and two-arg-s32-and +s32-true+) + (s32-or two-arg-s32-or +s32-false+) + (s32-xor two-arg-s32-xor +s32-false+) + (s32-max two-arg-s32-max nil) + (s32-min two-arg-s32-min nil) + (s32+ two-arg-s32+ 0) + (s64-and two-arg-s64-and +s64-true+) + (s64-or two-arg-s64-or +s64-false+) + (s64-xor two-arg-s64-xor +s64-false+) + (s64-max two-arg-s64-max nil) + (s64-min two-arg-s64-min nil) + (s64+ two-arg-s64+ 0)) + (:comparisons + (f32= two-arg-f32= u32-and +u32-true+) + (f32< two-arg-f32< u32-and +u32-true+) + (f32<= two-arg-f32<= u32-and +u32-true+) + (f32> two-arg-f32> u32-and +u32-true+) + (f32>= two-arg-f32>= u32-and +u32-true+) + (f64= two-arg-f64= u64-and +u64-true+) + (f64< two-arg-f64< u64-and +u64-true+) + (f64<= two-arg-f64<= u64-and +u64-true+) + (f64> two-arg-f64> u64-and +u64-true+) + (f64>= two-arg-f64>= u64-and +u64-true+) + (u8= two-arg-u8= u8-and +u8-true+) + (u8< two-arg-u8< u8-and +u8-true+) + (u8<= two-arg-u8<= u8-and +u8-true+) + (u8> two-arg-u8> u8-and +u8-true+) + (u8>= two-arg-u8>= u8-and +u8-true+) + (u16= two-arg-u16= u16-and +u16-true+) + (u16< two-arg-u16< u16-and +u16-true+) + (u16<= two-arg-u16<= u16-and +u16-true+) + (u16> two-arg-u16> u16-and +u16-true+) + (u16>= two-arg-u16>= u16-and +u16-true+) + (u32= two-arg-u32= u32-and +u32-true+) + (u32< two-arg-u32< u32-and +u32-true+) + (u32<= two-arg-u32<= u32-and +u32-true+) + (u32> two-arg-u32> u32-and +u32-true+) + (u32>= two-arg-u32>= u32-and +u32-true+) + (u64= two-arg-u64= u64-and +u64-true+) + (u64< two-arg-u64< u64-and +u64-true+) + (u64<= two-arg-u64<= u64-and +u64-true+) + (u64> two-arg-u64> u64-and +u64-true+) + (u64>= two-arg-u64>= u64-and +u64-true+) + (s8= two-arg-s8= u8-and +u8-true+) + (s8< two-arg-s8< u8-and +u8-true+) + (s8<= two-arg-s8<= u8-and +u8-true+) + (s8> two-arg-s8> u8-and +u8-true+) + (s8>= two-arg-s8>= u8-and +u8-true+) + (s16= two-arg-s16= u16-and +u16-true+) + (s16< two-arg-s16< u16-and +u16-true+) + (s16<= two-arg-s16<= u16-and +u16-true+) + (s16> two-arg-s16> u16-and +u16-true+) + (s16>= two-arg-s16>= u16-and +u16-true+) + (s32= two-arg-s32= u32-and +u32-true+) + (s32< two-arg-s32< u32-and +u32-true+) + (s32<= two-arg-s32<= u32-and +u32-true+) + (s32> two-arg-s32> u32-and +u32-true+) + (s32>= two-arg-s32>= u32-and +u32-true+) + (s64= two-arg-s64= u64-and +u64-true+) + (s64< two-arg-s64< u64-and +u64-true+) + (s64<= two-arg-s64<= u64-and +u64-true+) + (s64> two-arg-s64> u64-and +u64-true+) + (s64>= two-arg-s64>= u64-and +u64-true+)) + (:reducers + (f32- two-arg-f32- 0f0) + (f32/ two-arg-f32/ 1f0) + (f64- two-arg-f64- 0d0) + (f64/ two-arg-f64/ 1d0) + (u8- two-arg-u8- 0) + (u16- two-arg-u16- 0) + (u32- two-arg-u32- 0) + (u64- two-arg-u64- 0) + (s8- two-arg-s8- 0) + (s16- two-arg-s16- 0) + (s32- two-arg-s32- 0) + (s64- two-arg-s64- 0)) + (:unequals + (f32/= two-arg-f32/= u32-and +u32-true+) + (f64/= two-arg-f64/= u64-and +u64-true+) + (u8/= two-arg-u8/= u8-and +u8-true+) + (u16/= two-arg-u16/= u16-and +u16-true+) + (u32/= two-arg-u32/= u32-and +u32-true+) + (u64/= two-arg-u64/= u64-and +u64-true+) + (s8/= two-arg-s8/= u8-and +u8-true+) + (s16/= two-arg-s16/= u16-and +u16-true+) + (s32/= two-arg-s32/= u32-and +u32-true+) + (s64/= two-arg-s64/= u64-and +u64-true+))) diff --git a/contrib/sb-simd/code/instruction-sets/sse.lisp b/contrib/sb-simd/code/instruction-sets/sse.lisp new file mode 100644 index 0000000000..01914ed505 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/sse.lisp @@ -0,0 +1,105 @@ +(in-package #:sb-simd-sse) + +(define-instruction-set :sse + (:test (sse-supported-p)) + (:include :x86-64) + (:scalars + (f32 32 single-float #:single-float (#:single-reg))) + (:simd-packs + (p128 nil 128 #:simd-pack (#:int-sse-reg #:double-sse-reg #:single-sse-reg)) + (f32.4 f32 128 #:simd-pack-single (#:single-sse-reg))) + (:simd-casts + (f32.4 f32.4-broadcast)) + (:reinterpret-casts + (f32! f32!-from-p128) + (f32.4! f32.4!-from-f32)) + (:instructions + ;; f32 + (f32-from-s64 nil (f32) (s64) :cost 5 :encoding :custom) + (f32!-from-p128 nil (f32) (p128) :cost 1 :encoding :custom :always-translatable nil) + (two-arg-f32-and #:andps (f32) (f32 f32) :cost 1 :encoding :sse :associative t) + (two-arg-f32-or #:orps (f32) (f32 f32) :cost 1 :encoding :sse :associative t) + (two-arg-f32-xor #:xorps (f32) (f32 f32) :cost 1 :encoding :sse :associative t) + (two-arg-f32-max #:maxss (f32) (f32 f32) :cost 1 :encoding :sse :associative t) + (two-arg-f32-min #:minss (f32) (f32 f32) :cost 1 :encoding :sse :associative t) + (two-arg-f32+ #:addss (f32) (f32 f32) :cost 1 :encoding :sse :associative t) + (two-arg-f32- #:subss (f32) (f32 f32) :cost 2 :encoding :sse) + (two-arg-f32* #:mulss (f32) (f32 f32) :cost 2 :encoding :sse :associative t) + (two-arg-f32/ #:divss (f32) (f32 f32) :cost 8 :encoding :sse) + (two-arg-f32= #:cmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:eq) :associative t) + (two-arg-f32/= #:cmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:neq) :associative t) + (two-arg-f32< #:cmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:lt)) + (two-arg-f32<= #:cmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:le)) + (two-arg-f32> #:cmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:nle)) + (two-arg-f32>= #:cmpss (u32) (f32 f32) :cost 4 :encoding :custom :prefix '(:nlt)) + (f32-andc1 #:andnps (f32) (f32 f32) :cost 1 :encoding :sse) + (f32-not nil (f32) (f32) :cost 1 :encoding :fake-vop) + (f32-reciprocal #:rcpss (f32) (f32) :cost 5) + (f32-rsqrt #:rsqrtss (f32) (f32) :cost 5) + (f32-sqrt #:sqrtss (f32) (f32) :cost 15) + ;; f32.4 + (f32.4!-from-f32 #:movups (f32.4) (f32) :cost 1 :encoding :move) + (make-f32.4 nil (f32.4) (f32 f32 f32 f32) :cost 1 :encoding :fake-vop) + (f32.4-values nil (f32 f32 f32 f32) (f32.4) :cost 1 :encoding :fake-vop) + (f32.4-broadcast nil (f32.4) (f32) :cost 1 :encoding :fake-vop) + (two-arg-f32.4-and #:andps (f32.4) (f32.4 f32.4) :cost 1 :encoding :sse :associative t) + (two-arg-f32.4-or #:orps (f32.4) (f32.4 f32.4) :cost 1 :encoding :sse :associative t) + (two-arg-f32.4-xor #:xorps (f32.4) (f32.4 f32.4) :cost 1 :encoding :sse :associative t) + (two-arg-f32.4-max #:maxps (f32.4) (f32.4 f32.4) :cost 3 :encoding :sse :associative t) + (two-arg-f32.4-min #:minps (f32.4) (f32.4 f32.4) :cost 3 :encoding :sse :associative t) + (two-arg-f32.4+ #:addps (f32.4) (f32.4 f32.4) :cost 2 :encoding :sse :associative t) + (two-arg-f32.4- #:subps (f32.4) (f32.4 f32.4) :cost 2 :encoding :sse) + (two-arg-f32.4* #:mulps (f32.4) (f32.4 f32.4) :cost 2 :encoding :sse :associative t) + (two-arg-f32.4/ #:divps (f32.4) (f32.4 f32.4) :cost 8 :encoding :sse) + (f32.4-horizontal-and nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal-or nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal-xor nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal-max nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal-min nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal+ nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-horizontal* nil (f32) (f32.4) :cost 5 :encoding :fake-vop) + (f32.4-andc1 #:andnps (f32.4) (f32.4 f32.4) :cost 1 :encoding :sse) + (f32.4-not nil (f32.4) (f32.4) :cost 1 :encoding :fake-vop) + (f32.4-reciprocal #:rcpps (f32.4) (f32.4) :cost 5) + (f32.4-rsqrt #:rsqrtps (f32.4) (f32.4) :cost 5) + (f32.4-sqrt #:sqrtps (f32.4) (f32.4) :cost 15) + (f32.4-shuffle #:shufps (f32.4) (f32.4 f32.4 sb-simd-x86-64::imm8) :cost 1 :encoding :sse) + (f32.4-unpacklo #:unpcklps (f32.4) (f32.4 f32.4) :cost 1 :encoding :sse) + (f32.4-unpackhi #:unpckhps (f32.4) (f32.4 f32.4) :cost 1 :encoding :sse) + (f32.4-movemask #:movmskps (u4) (f32.4) :cost 1)) + (:loads + (f32-load #:movss f32 f32vec f32-array f32-aref f32-row-major-aref) + (f32.4-load #:movups f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref)) + (:stores + (f32-store #:movss f32 f32vec f32-array f32-aref f32-row-major-aref) + (f32.4-store #:movups f32.4 f32vec f32-array f32.4-aref f32.4-row-major-aref) + (f32.4-ntstore #:movntps f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref)) + (:associatives + (f32-and two-arg-f32-and +f32-true+) + (f32-or two-arg-f32-or +f32-false+) + (f32-xor two-arg-f32-xor +f32-false+) + (f32-max two-arg-f32-max nil) + (f32-min two-arg-f32-min nil) + (f32+ two-arg-f32+ 0f0) + (f32* two-arg-f32* 1f0) + (f32.4-and two-arg-f32.4-and +f32-true+) + (f32.4-or two-arg-f32.4-or +f32-false+) + (f32.4-xor two-arg-f32.4-xor +f32-false+) + (f32.4-max two-arg-f32.4-max nil) + (f32.4-min two-arg-f32.4-min nil) + (f32.4+ two-arg-f32.4+ 0f0) + (f32.4* two-arg-f32.4* 1f0)) + (:comparisons + (f32= two-arg-f32= u32-and +u32-true+) + (f32< two-arg-f32< u32-and +u32-true+) + (f32<= two-arg-f32<= u32-and +u32-true+) + (f32> two-arg-f32> u32-and +u32-true+) + (f32>= two-arg-f32>= u32-and +u32-true+)) + (:reducers + (f32- two-arg-f32- 0f0) + (f32/ two-arg-f32/ 1f0) + (f32.4- two-arg-f32.4- 0f0) + (f32.4/ two-arg-f32.4/ 1f0)) + (:unequals + (f32/= two-arg-f32/= u32-and +u32-true+))) + diff --git a/contrib/sb-simd/code/instruction-sets/sse2.lisp b/contrib/sb-simd/code/instruction-sets/sse2.lisp new file mode 100644 index 0000000000..f40c67e4b2 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/sse2.lisp @@ -0,0 +1,459 @@ +(in-package #:sb-simd-sse2) + +(define-instruction-set :sse2 + (:include :sse) + (:test (sse2-supported-p)) + (:scalars + (f64 64 double-float #:double-float (#:double-reg))) + (:simd-packs + (f64.2 f64 128 #:simd-pack-double (#:double-sse-reg)) + (u8.16 u8 128 #:simd-pack-ub8 (#:int-sse-reg)) + (u16.8 u16 128 #:simd-pack-ub16 (#:int-sse-reg)) + (u32.4 u32 128 #:simd-pack-ub32 (#:int-sse-reg)) + (u64.2 u64 128 #:simd-pack-ub64 (#:int-sse-reg)) + (s8.16 s8 128 #:simd-pack-sb8 (#:int-sse-reg)) + (s16.8 s16 128 #:simd-pack-sb16 (#:int-sse-reg)) + (s32.4 s32 128 #:simd-pack-sb32 (#:int-sse-reg)) + (s64.2 s64 128 #:simd-pack-sb64 (#:int-sse-reg))) + (:simd-casts + (f64.2 f64.2-broadcast) + (u8.16 u8.16-broadcast) + (u16.8 u16.8-broadcast) + (u32.4 u32.4-broadcast) + (u64.2 u64.2-broadcast) + (s8.16 s8.16-broadcast) + (s16.8 s16.8-broadcast) + (s32.4 s32.4-broadcast) + (s64.2 s64.2-broadcast)) + (:reinterpret-casts + (f64! f64!-from-p128) + (u8! u8!-from-p128) + (u16! u16!-from-p128) + (u32! u32!-from-p128) + (u64! u64!-from-p128) + (f64.2! f64.2!-from-f64 f64.2!-from-p128) + (u8.16! u8.16!-from-u8 u8.16!-from-p128) + (u16.8! u16.8!-from-u16 u16.8!-from-p128) + (u32.4! u32.4!-from-u32 u32.4!-from-p128) + (u64.2! u64.2!-from-u64 u64.2!-from-p128) + (s8.16! s8.16!-from-s8 s8.16!-from-p128) + (s16.8! s16.8!-from-s16 s16.8!-from-p128) + (s32.4! s32.4!-from-s32 s32.4!-from-p128) + (s64.2! s64.2!-from-s64 s64.2!-from-p128)) + (:instructions + ;; f32 + (f32-from-f64 #:cvtsd2ss (f32) (f64) :cost 5) + ;; f64 + (f64-from-f32 #:cvtss2sd (f64) (f32) :cost 5) + (f64-from-s64 nil (f64) (s64) :cost 5 :encoding :custom) + (f64!-from-p128 nil (f64) (p128) :cost 1 :encoding :custom :always-translatable nil) + (two-arg-f64-and #:andpd (f64) (f64 f64) :cost 1 :encoding :sse :associative t) + (two-arg-f64-or #:orpd (f64) (f64 f64) :cost 1 :encoding :sse :associative t) + (two-arg-f64-xor #:xorpd (f64) (f64 f64) :cost 1 :encoding :sse :associative t) + (two-arg-f64-max #:maxsd (f64) (f64 f64) :cost 1 :encoding :sse :associative t) + (two-arg-f64-min #:minsd (f64) (f64 f64) :cost 1 :encoding :sse :associative t) + (two-arg-f64+ #:addsd (f64) (f64 f64) :cost 1 :encoding :sse :associative t) + (two-arg-f64- #:subsd (f64) (f64 f64) :cost 2 :encoding :sse) + (two-arg-f64* #:mulsd (f64) (f64 f64) :cost 2 :encoding :sse :associative t) + (two-arg-f64/ #:divsd (f64) (f64 f64) :cost 8 :encoding :sse) + (two-arg-f64= #:cmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:eq) :associative t) + (two-arg-f64/= #:cmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:neq) :associative t) + (two-arg-f64< #:cmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:lt)) + (two-arg-f64<= #:cmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:le)) + (two-arg-f64> #:cmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:nle)) + (two-arg-f64>= #:cmpsd (u64) (f64 f64) :cost 4 :encoding :custom :prefix '(:nlt)) + (f64-andc1 #:andnpd (f64) (f64 f64) :cost 1 :encoding :sse) + (f64-not nil (f64) (f64) :cost 1 :encoding :fake-vop) + (f64.2-hsum nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-hprod nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64-sqrt #:sqrtsd (f64) (f64) :cost 15) + ;; scalar reinterpret casts + ( u8!-from-p128 nil (u8) (p128) :cost 1 :encoding :fake-vop) + (u16!-from-p128 nil (u16) (p128) :cost 1 :encoding :fake-vop) + (u32!-from-p128 nil (u32) (p128) :cost 1 :encoding :fake-vop) + (u64!-from-p128 #:movq (u64) (p128) :cost 1 :always-translatable nil) + ;; f32.4 + (f32.4-from-s32.4 #:cvtdq2ps (f32.4) (s32.4) :cost 5) + (f32.4!-from-p128 #:movups (f32.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (two-arg-f32.4= #:cmpps (u32.4) (f32.4 f32.4) :cost 4 :encoding :sse :prefix '(:eq) :associative t) + (two-arg-f32.4/= #:cmpps (u32.4) (f32.4 f32.4) :cost 4 :encoding :sse :prefix '(:neq) :associative t) + (two-arg-f32.4< #:cmpps (u32.4) (f32.4 f32.4) :cost 4 :encoding :sse :prefix '(:lt)) + (two-arg-f32.4<= #:cmpps (u32.4) (f32.4 f32.4) :cost 4 :encoding :sse :prefix '(:le)) + (two-arg-f32.4> #:cmpps (u32.4) (f32.4 f32.4) :cost 4 :encoding :sse :prefix '(:nle)) + (two-arg-f32.4>= #:cmpps (u32.4) (f32.4 f32.4) :cost 4 :encoding :sse :prefix '(:nlt)) + ;; f64.2 + (f64.2!-from-f64 #:movupd (f64.2) (f64) :cost 1 :encoding :move) + (f64.2!-from-p128 #:movupd (f64.2) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-f64.2 nil (f64.2) (f64 f64) :cost 1 :encoding :fake-vop) + (f64.2-values nil (f64 f64) (f64.2) :cost 1 :encoding :fake-vop) + (f64.2-broadcast nil (f64.2) (f64) :cost 1 :encoding :fake-vop) + (two-arg-f64.2-and #:andpd (f64.2) (f64.2 f64.2) :cost 1 :encoding :sse :associative t) + (two-arg-f64.2-or #:orpd (f64.2) (f64.2 f64.2) :cost 1 :encoding :sse :associative t) + (two-arg-f64.2-xor #:xorpd (f64.2) (f64.2 f64.2) :cost 1 :encoding :sse :associative t) + (two-arg-f64.2-max #:maxpd (f64.2) (f64.2 f64.2) :cost 3 :encoding :sse :associative t) + (two-arg-f64.2-min #:minpd (f64.2) (f64.2 f64.2) :cost 3 :encoding :sse :associative t) + (two-arg-f64.2+ #:addpd (f64.2) (f64.2 f64.2) :cost 2 :encoding :sse :associative t) + (two-arg-f64.2- #:subpd (f64.2) (f64.2 f64.2) :cost 2 :encoding :sse) + (two-arg-f64.2* #:mulpd (f64.2) (f64.2 f64.2) :cost 2 :encoding :sse :associative t) + (two-arg-f64.2/ #:divpd (f64.2) (f64.2 f64.2) :cost 8 :encoding :sse) + (two-arg-f64.2= #:cmppd (u64.2) (f64.2 f64.2) :cost 4 :encoding :sse :prefix '(:eq) :associative t) + (two-arg-f64.2/= #:cmppd (u64.2) (f64.2 f64.2) :cost 4 :encoding :sse :prefix '(:neq) :associative t) + (two-arg-f64.2< #:cmppd (u64.2) (f64.2 f64.2) :cost 4 :encoding :sse :prefix '(:lt)) + (two-arg-f64.2<= #:cmppd (u64.2) (f64.2 f64.2) :cost 4 :encoding :sse :prefix '(:le)) + (two-arg-f64.2> #:cmppd (u64.2) (f64.2 f64.2) :cost 4 :encoding :sse :prefix '(:nle)) + (two-arg-f64.2>= #:cmppd (u64.2) (f64.2 f64.2) :cost 4 :encoding :sse :prefix '(:nlt)) + (f64.2-horizontal-and nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal-or nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal-xor nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal-max nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal-min nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal+ nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-horizontal* nil (f64) (f64.2) :cost 3 :encoding :fake-vop) + (f64.2-andc1 #:andnpd (f64.2) (f64.2 f64.2) :cost 1 :encoding :sse) + (f64.2-not nil (f64.2) (f64.2) :cost 1 :encoding :fake-vop) + (f64.2-sqrt #:sqrtpd (f64.2) (f64.2) :cost 20) + (f64.2-unpackhi #:unpckhpd (f64.2) (f64.2 f64.2) :cost 1 :encoding :sse) + (f64.2-unpacklo #:unpcklpd (f64.2) (f64.2 f64.2) :cost 1 :encoding :sse) + (f64.2-shuffle #:shufpd (f64.2) (f64.2 imm2) :cost 1) + (f64.2-movemask #:movmskpd (u2) (f64.2) :cost 1) + ;; u8.16 + (u8.16!-from-u8 #:movq (u8.16) (u8) :cost 1) + (u8.16!-from-p128 #:movdqu (u8.16) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-u8.16 nil (u8.16) (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) :cost 1 :encoding :fake-vop) + (u8.16-values nil (u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8 u8) (u8.16) :cost 1 :encoding :fake-vop) + (u8.16-broadcast nil (u8.16) (u8) :cost 1 :encoding :fake-vop) + (two-arg-u8.16-and #:pand (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse :associative t) + (two-arg-u8.16-or #:por (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse :associative t) + (two-arg-u8.16-xor #:pxor (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse :associative t) + (u8.16-andc1 #:pandn (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse) + (u8.16-not nil (u8.16) (u8.16) :cost 1 :encoding :fake-vop) + (two-arg-u8.16+ #:paddb (u8.16) (u8.16 u8.16) :cost 2 :encoding :sse :associative t) + (two-arg-u8.16- #:psubb (u8.16) (u8.16 u8.16) :cost 2 :encoding :sse) + (two-arg-u8.16= #:pcmpeqb (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse) + (two-arg-u8.16/= nil (u8.16) (u8.16 u8.16) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u8.16>~ #:pcmpgtb (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse) + (two-arg-u8.16> nil (u8.16) (u8.16 u8.16) :cost 1 :encoding :fake-vop) + (two-arg-u8.16< nil (u8.16) (u8.16 u8.16) :cost 1 :encoding :fake-vop) + (two-arg-u8.16>= nil (u8.16) (u8.16 u8.16) :cost 2 :encoding :fake-vop) + (two-arg-u8.16<= nil (u8.16) (u8.16 u8.16) :cost 2 :encoding :fake-vop) + (u8.16-average #:pavgw (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse) + (u8.16-unpackhi #:punpckhbw (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse) + (u8.16-unpacklo #:punpcklbw (u8.16) (u8.16 u8.16) :cost 1 :encoding :sse) + (u8.16-movemask #:pmovmskb (u16) (u8.16) :cost 1) + ;; u16.8 + (u16.8!-from-u16 #:movq (u16.8) (u16) :cost 1) + (u16.8!-from-p128 #:movdqu (u16.8) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-u16.8 nil (u16.8) (u16 u16 u16 u16 u16 u16 u16 u16) :cost 1 :encoding :fake-vop) + (u16.8-values nil (u16 u16 u16 u16 u16 u16 u16 u16) (u16.8) :cost 1 :encoding :fake-vop) + (u16.8-broadcast nil (u16.8) (u16) :cost 1 :encoding :fake-vop) + (two-arg-u16.8-and #:pand (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse :associative t) + (two-arg-u16.8-or #:por (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse :associative t) + (two-arg-u16.8-xor #:pxor (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse :associative t) + (u16.8-andc1 #:pandn (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse) + (u16.8-not nil (u16.8) (u16.8) :cost 1 :encoding :fake-vop) + (two-arg-u16.8+ #:paddw (u16.8) (u16.8 u16.8) :cost 2 :encoding :sse :associative t) + (two-arg-u16.8- #:psubw (u16.8) (u16.8 u16.8) :cost 2 :encoding :sse) + (two-arg-u16.8= #:pcmpeqw (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse) + (two-arg-u16.8/= nil (u16.8) (u16.8 u16.8) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u16.8>~ #:pcmpgtw (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse) + (two-arg-u16.8> nil (u16.8) (u16.8 u16.8) :cost 1 :encoding :fake-vop) + (two-arg-u16.8< nil (u16.8) (u16.8 u16.8) :cost 1 :encoding :fake-vop) + (two-arg-u16.8>= nil (u16.8) (u16.8 u16.8) :cost 2 :encoding :fake-vop) + (two-arg-u16.8<= nil (u16.8) (u16.8 u16.8) :cost 2 :encoding :fake-vop) + (u16.8-average #:pavgb (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse) + (u16.8-unpackhi #:punpckhwd (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse) + (u16.8-unpacklo #:punpcklwd (u16.8) (u16.8 u16.8) :cost 1 :encoding :sse) + (u16.8-movemask nil (u8) (u16.8) :cost 1 :encoding :fake-vop) + (u16.8-elt #:pextrw (u16) (u16.8 imm3) :cost 1) + (u16.8-shufflehi #:pshufhw (u16.8) (u16.8 imm8) :cost 1) + (u16.8-shufflelo #:pshuflw (u16.8) (u16.8 imm8) :cost 1) + (u16.8-shiftl #:psllw-imm (u16.8) (u16.8 imm4) :cost 1 :encoding :sse) + (u16.8-shiftr #:psrlw-imm (u16.8) (u16.8 imm4) :cost 1 :encoding :sse) + ;; u32.4 + (u32.4!-from-u32 #:movq (u32.4) (u16) :cost 1) + (u32.4!-from-p128 #:movdqu (u32.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-u32.4 nil (u32.4) (u32 u32 u32 u32) :cost 1 :encoding :fake-vop) + (u32.4-values nil (u32 u32 u32 u32) (u32.4) :cost 1 :encoding :fake-vop) + (u32.4-broadcast nil (u32.4) (u32) :cost 1 :encoding :fake-vop) + (two-arg-u32.4-and #:pand (u32.4) (u32.4 u32.4) :cost 1 :encoding :sse :associative t) + (two-arg-u32.4-or #:por (u32.4) (u32.4 u32.4) :cost 1 :encoding :sse :associative t) + (two-arg-u32.4-xor #:pxor (u32.4) (u32.4 u32.4) :cost 1 :encoding :sse :associative t) + (u32.4-andc1 #:pandn (u32.4) (u32.4 u32.4) :cost 1 :encoding :sse) + (u32.4-not nil (u32.4) (u32.4) :cost 1 :encoding :fake-vop) + (two-arg-u32.4+ #:paddd (u32.4) (u32.4 u32.4) :cost 2 :encoding :sse :associative t) + (two-arg-u32.4- #:psubd (u32.4) (u32.4 u32.4) :cost 2 :encoding :sse) + (two-arg-u32.4= #:pcmpeqd (u32.4) (u32.4 u32.4) :cost 1 :encoding :sse) + (two-arg-u32.4/= nil (u32.4) (u32.4 u32.4) :cost 2 :associative t :encoding :fake-vop) + (two-arg-u32.4>~ #:pcmpgtd (u32.4) (u32.4 u32.4) :cost 1 :encoding :sse) + (two-arg-u32.4> nil (u32.4) (u32.4 u32.4) :cost 1 :encoding :fake-vop) + (two-arg-u32.4< nil (u32.4) (u32.4 u32.4) :cost 1 :encoding :fake-vop) + (two-arg-u32.4>= nil (u32.4) (u32.4 u32.4) :cost 2 :encoding :fake-vop) + (two-arg-u32.4<= nil (u32.4) (u32.4 u32.4) :cost 2 :encoding :fake-vop) + (u32.4-unpackhi #:punpckhdq (u32.4) (u32.4 u32.4) :cost 1 :encoding :sse) + (u32.4-unpacklo #:punpckldq (u32.4) (u32.4 u32.4) :cost 1 :encoding :sse) + (u32.4-movemask #:movmskps (u4) (u32.4) :cost 1) + (u32.4-shuffle #:pshufd (u32.4) (u32.4 imm8) :cost 1) + (u32.4-shiftl #:pslld-imm (u32.4) (u32.4 imm5) :cost 1 :encoding :sse) + (u32.4-shiftr #:psrld-imm (u32.4) (u32.4 imm5) :cost 1 :encoding :sse) + ;; u64.2 + (u64.2!-from-u64 #:movq (u64.2) (u64) :cost 1) + (u64.2!-from-p128 #:movdqu (u64.2) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-u64.2 nil (u64.2) (u64 u64) :cost 1 :encoding :fake-vop) + (u64.2-values nil (u64 u64) (u64.2) :cost 1 :encoding :fake-vop) + (u64.2-broadcast nil (u64.2) (u64) :cost 1 :encoding :fake-vop) + (two-arg-u64.2-and #:pand (u64.2) (u64.2 u64.2) :cost 1 :encoding :sse :associative t) + (two-arg-u64.2-or #:por (u64.2) (u64.2 u64.2) :cost 1 :encoding :sse :associative t) + (two-arg-u64.2-xor #:pxor (u64.2) (u64.2 u64.2) :cost 1 :encoding :sse :associative t) + (u64.2-andc1 #:pandn (u64.2) (u64.2 u64.2) :cost 1 :encoding :sse) + (u64.2-not nil (u64.2) (u64.2) :cost 1 :encoding :fake-vop) + (two-arg-u64.2+ #:paddq (u64.2) (u64.2 u64.2) :cost 2 :encoding :sse :associative t) + (two-arg-u64.2- #:psubq (u64.2) (u64.2 u64.2) :cost 2 :encoding :sse) + (u64.2-unpackhi #:punpckhqdq (u64.2) (u64.2 u64.2) :cost 1 :encoding :sse) + (u64.2-unpacklo #:punpcklqdq (u64.2) (u64.2 u64.2) :cost 1 :encoding :sse) + (u64.2-movemask #:movmskpd (u2) (u64.2) :cost 1) + (u64.2-shiftl #:psllq-imm (u64.2) (u64.2 imm6) :cost 1 :encoding :sse) + (u64.2-shiftr #:psrlq-imm (u64.2) (u64.2 imm6) :cost 1 :encoding :sse) + ;; s8.16 + (s8.16!-from-s8 nil (s8.16) (s8) :cost 1 :encoding :fake-vop) + (s8.16!-from-p128 #:movdqu (s8.16) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-s8.16 nil (s8.16) (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) :cost 1 :encoding :fake-vop) + (s8.16-values nil (s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8 s8) (s8.16) :cost 1 :encoding :fake-vop) + (s8.16-broadcast nil (s8.16) (s8) :cost 1 :encoding :fake-vop) + (two-arg-s8.16-and #:pand (s8.16) (s8.16 s8.16) :cost 1 :encoding :sse :associative t) + (two-arg-s8.16-or #:por (s8.16) (s8.16 s8.16) :cost 1 :encoding :sse :associative t) + (two-arg-s8.16-xor #:pxor (s8.16) (s8.16 s8.16) :cost 1 :encoding :sse :associative t) + (s8.16-andc1 #:pandn (s8.16) (s8.16 s8.16) :cost 1 :encoding :sse) + (s8.16-not nil (s8.16) (s8.16) :cost 1 :encoding :fake-vop) + (two-arg-s8.16+ #:paddb (s8.16) (s8.16 s8.16) :cost 2 :encoding :sse :associative t) + (two-arg-s8.16- #:psubb (s8.16) (s8.16 s8.16) :cost 2 :encoding :sse) + (two-arg-s8.16= #:pcmpeqb (u8.16) (s8.16 s8.16) :cost 1 :encoding :sse) + (two-arg-s8.16/= nil (u8.16) (s8.16 s8.16) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s8.16> #:pcmpgtb (u8.16) (s8.16 s8.16) :cost 1 :encoding :sse) + (two-arg-s8.16< nil (u8.16) (s8.16 s8.16) :cost 1 :encoding :fake-vop) + (two-arg-s8.16>= nil (u8.16) (s8.16 s8.16) :cost 2 :encoding :fake-vop) + (two-arg-s8.16<= nil (u8.16) (s8.16 s8.16) :cost 2 :encoding :fake-vop) + (s8.16-unpackhi #:punpckhbw (s8.16) (s8.16 s8.16) :cost 1 :encoding :sse) + (s8.16-unpacklo #:punpcklbw (s8.16) (s8.16 s8.16) :cost 1 :encoding :sse) + (s8.16-movemask #:pmovmskb (u16) (s8.16) :cost 1) + ;; s16.8 + (s16.8!-from-s16 nil (s16.8) (s16) :cost 1 :encoding :fake-vop) + (s16.8!-from-p128 #:movdqu (s16.8) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-s16.8 nil (s16.8) (s16 s16 s16 s16 s16 s16 s16 s16) :cost 1 :encoding :fake-vop) + (s16.8-values nil (s16 s16 s16 s16 s16 s16 s16 s16) (s16.8) :cost 1 :encoding :fake-vop) + (s16.8-broadcast nil (s16.8) (s16) :cost 1 :encoding :fake-vop) + (two-arg-s16.8-and #:pand (s16.8) (s16.8 s16.8) :cost 1 :encoding :sse :associative t) + (two-arg-s16.8-or #:por (s16.8) (s16.8 s16.8) :cost 1 :encoding :sse :associative t) + (two-arg-s16.8-xor #:pxor (s16.8) (s16.8 s16.8) :cost 1 :encoding :sse :associative t) + (s16.8-andc1 #:pandn (s16.8) (s16.8 s16.8) :cost 1 :encoding :sse) + (s16.8-not nil (s16.8) (s16.8) :cost 1 :encoding :fake-vop) + (two-arg-s16.8+ #:paddw (s16.8) (s16.8 s16.8) :cost 2 :encoding :sse :associative t) + (two-arg-s16.8- #:psubw (s16.8) (s16.8 s16.8) :cost 2 :encoding :sse) + (two-arg-s16.8= #:pcmpeqw (u16.8) (s16.8 s16.8) :cost 1 :encoding :sse) + (two-arg-s16.8/= nil (u16.8) (s16.8 s16.8) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s16.8> #:pcmpgtw (u16.8) (s16.8 s16.8) :cost 1 :encoding :sse) + (two-arg-s16.8< nil (u16.8) (s16.8 s16.8) :cost 1 :encoding :fake-vop) + (two-arg-s16.8>= nil (u16.8) (s16.8 s16.8) :cost 2 :encoding :fake-vop) + (two-arg-s16.8<= nil (u16.8) (s16.8 s16.8) :cost 2 :encoding :fake-vop) + (s16.8-unpackhi #:punpckhwd (s16.8) (s16.8 s16.8) :cost 1 :encoding :sse) + (s16.8-unpacklo #:punpcklwd (s16.8) (s16.8 s16.8) :cost 1 :encoding :sse) + (s16.8-movemask nil (u8) (s16.8) :cost 1 :encoding :fake-vop) + (s16.8-mullo #:pmullw (s16.8) (s16.8 s16.8) :cost 1 :encoding :sse) + (s16.8-elt #:pextrw (s16) (s16.8 imm3) :cost 1) + (s16.8-shufflehi #:pshufhw (s16.8) (s16.8 imm8) :cost 1) + (s16.8-shufflelo #:pshuflw (s16.8) (s16.8 imm8) :cost 1) + (s16.8-shiftl #:psllw-imm (s16.8) (s16.8 imm4) :cost 1 :encoding :sse) + (s16.8-shiftr #:psrlw-imm (s16.8) (s16.8 imm4) :cost 1 :encoding :sse) + ;; s32.4 + (s32.4!-from-s32 nil (s32.4) (s32) :cost 1 :encoding :fake-vop) + (s32.4!-from-p128 #:movdqu (s32.4) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-s32.4 nil (s32.4) (s32 s32 s32 s32) :cost 1 :encoding :fake-vop) + (s32.4-values nil (s32 s32 s32 s32) (s32.4) :cost 1 :encoding :fake-vop) + (s32.4-broadcast nil (s32.4) (s32) :cost 1 :encoding :fake-vop) + (s32.4-from-f32.4 #:cvtps2dq (s32.4) (f32.4) :cost 5) + (s32.4-from-f64.2 #:cvtpd2dq (s32.4) (f64.2) :cost 1) + (two-arg-s32.4-and #:pand (s32.4) (s32.4 s32.4) :cost 1 :encoding :sse :associative t) + (two-arg-s32.4-or #:por (s32.4) (s32.4 s32.4) :cost 1 :encoding :sse :associative t) + (two-arg-s32.4-xor #:pxor (s32.4) (s32.4 s32.4) :cost 1 :encoding :sse :associative t) + (s32.4-andc1 #:pandn (s32.4) (s32.4 s32.4) :cost 1 :encoding :sse) + (s32.4-not nil (s32.4) (s32.4) :cost 1 :encoding :fake-vop) + (two-arg-s32.4+ #:paddd (s32.4) (s32.4 s32.4) :cost 2 :encoding :sse :associative t) + (two-arg-s32.4- #:psubd (s32.4) (s32.4 s32.4) :cost 2 :encoding :sse) + (two-arg-s32.4= #:pcmpeqd (u32.4) (s32.4 s32.4) :cost 1 :encoding :sse) + (two-arg-s32.4/= nil (u32.4) (s32.4 s32.4) :cost 2 :associative t :encoding :fake-vop) + (two-arg-s32.4> #:pcmpgtd (u32.4) (s32.4 s32.4) :cost 1 :encoding :sse) + (two-arg-s32.4< nil (u32.4) (s32.4 s32.4) :cost 1 :encoding :fake-vop) + (two-arg-s32.4>= nil (u32.4) (s32.4 s32.4) :cost 2 :encoding :fake-vop) + (two-arg-s32.4<= nil (u32.4) (s32.4 s32.4) :cost 2 :encoding :fake-vop) + (s32.4-unpackhi #:punpckhdq (s32.4) (s32.4 s32.4) :cost 1 :encoding :sse) + (s32.4-unpacklo #:punpckldq (s32.4) (s32.4 s32.4) :cost 1 :encoding :sse) + (s32.4-movemask #:movmskps (u4) (s32.4) :cost 1) + (s32.4-shuffle #:pshufd (s32.4) (s32.4 imm8) :cost 1) + (s32.4-shiftl #:pslld-imm (s32.4) (s32.4 imm5) :cost 1 :encoding :sse) + (s32.4-shiftr #:psrld-imm (s32.4) (s32.4 imm5) :cost 1 :encoding :sse) + ;; s64.2 + (s64.2!-from-s64 nil (s64.2) (s64) :cost 1 :encoding :fake-vop) + (s64.2!-from-p128 #:movdqu (s64.2) (p128) :cost 1 :encoding :move :always-translatable nil) + (make-s64.2 nil (s64.2) (s64 s64) :cost 1 :encoding :fake-vop) + (s64.2-values nil (s64 s64) (s64.2) :cost 1 :encoding :fake-vop) + (s64.2-broadcast nil (s64.2) (s64) :cost 1 :encoding :fake-vop) + (two-arg-s64.2-and #:pand (s64.2) (s64.2 s64.2) :cost 1 :encoding :sse :associative t) + (two-arg-s64.2-or #:por (s64.2) (s64.2 s64.2) :cost 1 :encoding :sse :associative t) + (two-arg-s64.2-xor #:pxor (s64.2) (s64.2 s64.2) :cost 1 :encoding :sse :associative t) + (s64.2-andc1 #:pandn (s64.2) (s64.2 s64.2) :cost 1 :encoding :sse) + (s64.2-not nil (s64.2) (s64.2) :cost 1 :encoding :fake-vop) + (two-arg-s64.2+ #:paddq (s64.2) (s64.2 s64.2) :cost 2 :encoding :sse :associative t) + (two-arg-s64.2- #:psubq (s64.2) (s64.2 s64.2) :cost 2 :encoding :sse) + (s64.2-unpackhi #:punpckhqdq (s64.2) (s64.2 s64.2) :cost 1 :encoding :sse) + (s64.2-unpacklo #:punpcklqdq (s64.2) (s64.2 s64.2) :cost 1 :encoding :sse) + (s64.2-movemask #:movmskpd (u2) (s64.2) :cost 1) + (s64.2-shiftl #:psllq-imm (s64.2) (s64.2 imm6) :cost 1 :encoding :sse) + (s64.2-shiftr #:psrlq-imm (s64.2) (s64.2 imm6) :cost 1 :encoding :sse)) + (:loads + (u32.4-load-from-string #:movdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref) + (f64-load #:movsd f64 f64vec f64-array f64-aref f64-row-major-aref) + (f64.2-load #:movupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref) + (u8.16-load #:movdqu u8.16 u8vec u8-array u8.16-aref u8.16-row-major-aref) + (u16.8-load #:movdqu u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref) + (u32.4-load #:movdqu u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref) + (u64.2-load #:movdqu u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref) + (s8.16-load #:movdqu s8.16 s8vec s8-array s8.16-aref s8.16-row-major-aref) + (s16.8-load #:movdqu s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref) + (s32.4-load #:movdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref) + (s64.2-load #:movdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref)) + (:stores + (u32.4-store-into-string #:movdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref) + (f64-store #:movsd f64 f64vec f64-array f64-aref f64-row-major-aref) + (f64.2-store #:movupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref) + (u8.16-store #:movdqu u8.16 u8vec u8-array u8.16-aref u8.16-row-major-aref) + (u16.8-store #:movdqu u16.8 u16vec u16-array u16.8-aref u16.8-row-major-aref) + (u32.4-store #:movdqu u32.4 u32vec u32-array u32.4-aref u32.4-row-major-aref) + (u64.2-store #:movdqu u64.2 u64vec u64-array u64.2-aref u64.2-row-major-aref) + (s8.16-store #:movdqu s8.16 s8vec s8-array s8.16-aref s8.16-row-major-aref) + (s16.8-store #:movdqu s16.8 s16vec s16-array s16.8-aref s16.8-row-major-aref) + (s32.4-store #:movdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref) + (s64.2-store #:movdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref) + (f64.2-ntstore #:movntpd f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref) + (u8.16-ntstore #:movntdq u8.16 u8vec u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref) + (u16.8-ntstore #:movntdq u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref) + (u32.4-ntstore #:movntdq u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref) + (u64.2-ntstore #:movntdq u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref) + (s8.16-ntstore #:movntdq s8.16 s8vec s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref) + (s16.8-ntstore #:movntdq s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref) + (s32.4-ntstore #:movntdq s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref) + (s64.2-ntstore #:movntdq s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref)) + (:associatives + (f64-and two-arg-f64-and +f64-true+) + (f64-or two-arg-f64-or +f64-false+) + (f64-xor two-arg-f64-xor +f64-false+) + (f64-max two-arg-f64-max nil) + (f64-min two-arg-f64-min nil) + (f64+ two-arg-f64+ 0d0) + (f64* two-arg-f64* 1d0) + (f64.2-and two-arg-f64.2-and +f64-true+) + (f64.2-or two-arg-f64.2-or +f64-false+) + (f64.2-xor two-arg-f64.2-xor +f64-false+) + (f64.2-max two-arg-f64.2-max nil) + (f64.2-min two-arg-f64.2-min nil) + (f64.2+ two-arg-f64.2+ 0d0) + (f64.2* two-arg-f64.2* 1d0) + (u8.16-and two-arg-u8.16-and +u8-true+) + (u8.16-or two-arg-u8.16-or +u8-false+) + (u8.16-xor two-arg-u8.16-xor +u8-false+) + (u8.16+ two-arg-u8.16+ 0) + (u16.8-and two-arg-u16.8-and +u16-true+) + (u16.8-or two-arg-u16.8-or +u16-false+) + (u16.8-xor two-arg-u16.8-xor +u16-false+) + (u16.8+ two-arg-u16.8+ 0) + (u32.4-and two-arg-u32.4-and +u32-true+) + (u32.4-or two-arg-u32.4-or +u32-false+) + (u32.4-xor two-arg-u32.4-xor +u32-false+) + (u32.4+ two-arg-u32.4+ 0) + (u64.2-and two-arg-u64.2-and +u64-true+) + (u64.2-or two-arg-u64.2-or +u64-false+) + (u64.2-xor two-arg-u64.2-xor +u64-false+) + (u64.2+ two-arg-u64.2+ 0) + (s8.16-and two-arg-s8.16-and +s8-true+) + (s8.16-or two-arg-s8.16-or +s8-false+) + (s8.16-xor two-arg-s8.16-xor +s8-false+) + (s8.16+ two-arg-s8.16+ 0) + (s16.8-and two-arg-s16.8-and +s16-true+) + (s16.8-or two-arg-s16.8-or +s16-false+) + (s16.8-xor two-arg-s16.8-xor +s16-false+) + (s16.8+ two-arg-s16.8+ 0) + (s32.4-and two-arg-s32.4-and +s32-true+) + (s32.4-or two-arg-s32.4-or +s32-false+) + (s32.4-xor two-arg-s32.4-xor +s32-false+) + (s32.4+ two-arg-s32.4+ 0) + (s64.2-and two-arg-s64.2-and +s64-true+) + (s64.2-or two-arg-s64.2-or +s64-false+) + (s64.2-xor two-arg-s64.2-xor +s64-false+) + (s64.2+ two-arg-s64.2+ 0)) + (:comparisons + (f64= two-arg-f64= u64-and +u64-true+) + (f64< two-arg-f64< u64-and +u64-true+) + (f64<= two-arg-f64<= u64-and +u64-true+) + (f64> two-arg-f64> u64-and +u64-true+) + (f64>= two-arg-f64>= u64-and +u64-true+) + (f32.4= two-arg-f32.4= u32.4-and +u32-true+) + (f32.4< two-arg-f32.4< u32.4-and +u32-true+) + (f32.4<= two-arg-f32.4<= u32.4-and +u32-true+) + (f32.4> two-arg-f32.4> u32.4-and +u32-true+) + (f32.4>= two-arg-f32.4>= u32.4-and +u32-true+) + (f64.2= two-arg-f64.2= u64.2-and +u64-true+) + (f64.2< two-arg-f64.2< u64.2-and +u64-true+) + (f64.2<= two-arg-f64.2<= u64.2-and +u64-true+) + (f64.2> two-arg-f64.2> u64.2-and +u64-true+) + (f64.2>= two-arg-f64.2>= u64.2-and +u64-true+) + (u8.16= two-arg-u8.16= u8.16-and +u8-true+) + (u8.16< two-arg-u8.16< u8.16-and +u8-true+) + (u8.16<= two-arg-u8.16<= u8.16-and +u8-true+) + (u8.16> two-arg-u8.16> u8.16-and +u8-true+) + (u8.16>= two-arg-u8.16>= u8.16-and +u8-true+) + (u16.8= two-arg-u16.8= u16.8-and +u16-true+) + (u16.8< two-arg-u16.8< u16.8-and +u16-true+) + (u16.8<= two-arg-u16.8<= u16.8-and +u16-true+) + (u16.8> two-arg-u16.8> u16.8-and +u16-true+) + (u16.8>= two-arg-u16.8>= u16.8-and +u16-true+) + (u32.4= two-arg-u32.4= u32.4-and +u32-true+) + (u32.4< two-arg-u32.4< u32.4-and +u32-true+) + (u32.4<= two-arg-u32.4<= u32.4-and +u32-true+) + (u32.4> two-arg-u32.4> u32.4-and +u32-true+) + (u32.4>= two-arg-u32.4>= u32.4-and +u32-true+) + (s8.16= two-arg-s8.16= u8.16-and +u8-true+) + (s8.16< two-arg-s8.16< u8.16-and +u8-true+) + (s8.16<= two-arg-s8.16<= u8.16-and +u8-true+) + (s8.16> two-arg-s8.16> u8.16-and +u8-true+) + (s8.16>= two-arg-s8.16>= u8.16-and +u8-true+) + (s16.8= two-arg-s16.8= u16.8-and +u16-true+) + (s16.8< two-arg-s16.8< u16.8-and +u16-true+) + (s16.8<= two-arg-s16.8<= u16.8-and +u16-true+) + (s16.8> two-arg-s16.8> u16.8-and +u16-true+) + (s16.8>= two-arg-s16.8>= u16.8-and +u16-true+) + (s32.4= two-arg-s32.4= u32.4-and +u32-true+) + (s32.4< two-arg-s32.4< u32.4-and +u32-true+) + (s32.4<= two-arg-s32.4<= u32.4-and +u32-true+) + (s32.4> two-arg-s32.4> u32.4-and +u32-true+) + (s32.4>= two-arg-s32.4>= u32.4-and +u32-true+)) + (:reducers + (f64- two-arg-f64- 0d0) + (f64/ two-arg-f64/ 1d0) + (f64.2- two-arg-f64.2- 0d0) + (f64.2/ two-arg-f64.2/ 1d0) + (u8.16- two-arg-u8.16- 0) + (u16.8- two-arg-u16.8- 0) + (u32.4- two-arg-u32.4- 0) + (u64.2- two-arg-u64.2- 0) + (s8.16- two-arg-s8.16- 0) + (s16.8- two-arg-s16.8- 0) + (s32.4- two-arg-s32.4- 0) + (s64.2- two-arg-s64.2- 0)) + (:unequals + (f64/= two-arg-f64/= u64-and +u64-true+) + (f32.4/= two-arg-f32.4/= sb-simd-sse2:u32.4-and +u32-true+) + (f64.2/= two-arg-f64.2/= u64.2-and +u64-true+) + (u8.16/= two-arg-u8.16/= u8.16-and +u8-true+) + (u16.8/= two-arg-u16.8/= u16.8-and +u16-true+) + (u32.4/= two-arg-u32.4/= u32.4-and +u32-true+) + (s8.16/= two-arg-s8.16/= u8.16-and +u8-true+) + (s16.8/= two-arg-s16.8/= u16.8-and +u16-true+) + (s32.4/= two-arg-s32.4/= u32.4-and +u32-true+))) diff --git a/contrib/sb-simd/code/instruction-sets/sse3.lisp b/contrib/sb-simd/code/instruction-sets/sse3.lisp new file mode 100644 index 0000000000..4ac046c5a7 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/sse3.lisp @@ -0,0 +1,11 @@ +(in-package #:sb-simd-sse3) + +(define-instruction-set :sse3 + (:include :sse2) + (:test (sse3-supported-p)) + (:instructions + (f32.4-hadd #:haddps (f32.4) (f32.4 f32.4) :cost 1 :encoding :sse) + (f32.4-hdup #:movshdup (f32.4) (f32.4) :cost 1) + (f32.4-ldup #:movsldup (f32.4) (f32.4) :cost 1) + (f64.2-hadd #:haddpd (f64.2) (f64.2 f64.2) :cost 1 :encoding :sse))) + diff --git a/contrib/sb-simd/code/instruction-sets/sse4-1.lisp b/contrib/sb-simd/code/instruction-sets/sse4-1.lisp new file mode 100644 index 0000000000..ee82bfdae7 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/sse4-1.lisp @@ -0,0 +1,125 @@ +(in-package #:sb-simd-sse4.1) + +(define-instruction-set :sse4.1 + (:include :ssse3) + (:test (sse4.1-supported-p)) + (:instructions + ;; f32.4 + (f32.4-blend #:blendvps (f32.4) (f32.4 f32.4 u32.4) :cost 1 :encoding :sse+xmm0) + (f32.4-blendc #:blendps (f32.4) (f32.4 f32.4 imm4) :cost 1 :encoding :sse) + (f32.4-%round #:roundps (f32.4) (f32.4 imm3) :cost 2) + #+(or) ;; TODO: Broken in SBCL + (f32.4-elt #:extractps (f32) (f32.4 imm2) :cost 1) + (f32.4-insert #:insertps (f32.4) (f32.4 f32.4 imm8) :cost 1 :encoding :sse) + ;; f64.2 + (f64.2-blend #:blendvpd (f64.2) (f64.2 f64.2 u64.2) :cost 1 :encoding :sse+xmm0) + (f64.2-blendc #:blendpd (f64.2) (f64.2 f64.2 imm2) :cost 1 :encoding :sse) + (f64.2-%round #:roundpd (f64.2) (f64.2 imm3) :cost 2) + ;; u8.16 + (u8.16-blend #:pblendvb (u8.16) (u8.16 u8.16 u8.16) :cost 1 :encoding :sse+xmm0) + (u8.16-elt #:pextrb (u8) (u8.16 imm4) :cost 1) + (u8.16-insert #:pinsrb (u8.16) (u8.16 u8 imm4) :cost 1 :encoding :sse) + ;; u16.8 + (u16.8-blend #:pblendvb (u16.8) (u16.8 u16.8 u16.8) :cost 1 :encoding :sse+xmm0) + (two-arg-u16.8-max #:pmaxuw (u16.8) (u16.8 u16.8) :cost 2 :encoding :sse :associative t) + (two-arg-u16.8-min #:pminuw (u16.8) (u16.8 u16.8) :cost 2 :encoding :sse :associative t) + (u16.8-minpos #:pminuw (u16.8) (u16.8) :cost 5) + ;; u32.4 + (u32.4-blend #:pblendvb (u32.4) (u32.4 u32.4 u32.4) :cost 1 :encoding :sse+xmm0) + (two-arg-u32.4-max #:pmaxud (u32.4) (u32.4 u32.4) :cost 2 :encoding :sse :associative t) + (two-arg-u32.4-min #:pminud (u32.4) (u32.4 u32.4) :cost 2 :encoding :sse :associative t) + (u32.4-elt #:pextrd (u32) (u32.4 imm2) :cost 1) + (u32.4-insert #:pinsrd (u32.4) (u32.4 u32 imm2) :cost 1 :encoding :sse) + ;; u64.2 + (u64.2-blend #:pblendvb (u64.2) (u64.2 u64.2 u64.2) :cost 1 :encoding :sse+xmm0) + (two-arg-u64.2= #:pcmpeqq (u64.2) (u64.2 u64.2) :cost 1 :encoding :sse :associative t) + (two-arg-u64.2/= nil (u64.2) (u64.2 u64.2) :cost 2 :encoding :fake-vop :associative t) + (u64.2-elt #:pextrq (u64) (u64.2 imm1) :cost 1) + #+(or) ;; TODO: PINSRQ is currently missing in SBCL. + (u64.2-insert #:pinsrq (u64.2) (u64.2 u64 imm1) :cost 1 :encoding :sse) + ;; s8.16 + (s8.16-blend #:pblendvb (s8.16) (s8.16 s8.16 u8.16) :cost 1 :encoding :sse+xmm0) + (two-arg-s8.16-max #:pmaxsb (s8.16) (s8.16 s8.16) :cost 2 :encoding :sse :associative t) + (two-arg-s8.16-min #:pminsb (s8.16) (s8.16 s8.16) :cost 2 :encoding :sse :associative t) + (s8.16-elt #:pextrb (s8) (s8.16 imm4) :cost 1) + (s8.16-insert #:pinsrb (s8.16) (s8.16 s8 imm4) :cost 1 :encoding :sse) + ;; s16.8 + (s16.8-blend #:pblendvb (s16.8) (s16.8 s16.8 u16.8) :cost 1 :encoding :sse+xmm0) + (s16.8-from-u8.16 #:pmovsxbw (s16.8) (u8.16) :cost 5) + (s16.8-from-s8.16 #:pmovsxbw (s16.8) (s8.16) :cost 5) + (s16.8-pack #:packusdw (s16.8) (s32.4 s32.4) :cost 1 :encoding :sse) + ;; s32.4 + (s32.4-blend #:pblendvb (s32.4) (s32.4 s32.4 u32.4) :cost 1 :encoding :sse+xmm0) + (two-arg-s32.4-max #:pmaxsd (s32.4) (s32.4 s32.4) :cost 2 :encoding :sse :associative t) + (two-arg-s32.4-min #:pminsd (s32.4) (s32.4 s32.4) :cost 2 :encoding :sse :associative t) + (s32.4-from-u8.16 #:pmovsxbd (s32.4) (u8.16) :cost 5) + (s32.4-from-s8.16 #:pmovsxbd (s32.4) (s8.16) :cost 5) + (s32.4-from-u16.8 #:pmovsxwd (s32.4) (u16.8) :cost 5) + (s32.4-from-s16.8 #:pmovsxwd (s32.4) (s16.8) :cost 5) + (two-arg-s32.4-mullo #:pmulld (s32.4) (s32.4 s32.4) :cost 1 :encoding :sse :associative t) + (s32.4-elt #:pextrd (s32) (s32.4 imm2) :cost 1) + (s32.4-insert #:pinsrd (s32.4) (s32.4 s32 imm2) :cost 1 :encoding :sse) + ;; s64.2 + (s64.2-blend #:pblendvb (s64.2) (s64.2 s64.2 u64.2) :cost 1 :encoding :sse+xmm0) + (s64.2-from-u8.16 #:pmovsxbq (s64.2) (u8.16) :cost 5) + (s64.2-from-s8.16 #:pmovsxbq (s64.2) (s8.16) :cost 5) + (s64.2-from-u16.8 #:pmovsxwq (s64.2) (u16.8) :cost 5) + (s64.2-from-s16.8 #:pmovsxwq (s64.2) (s16.8) :cost 5) + (s64.2-from-u32.4 #:pmovsxdq (s64.2) (u32.4) :cost 5) + (s64.2-from-s32.4 #:pmovsxdq (s64.2) (s32.4) :cost 5) + (two-arg-s64.2-mul #:pmuldq (s64.2) (s64.2 s64.2) :cost 2 :encoding :sse :associative t) + (two-arg-s64.2= #:pcmpeqq (u64.2) (s64.2 s64.2) :cost 1 :encoding :sse :associative t) + (two-arg-s64.2/= nil (u64.2) (s64.2 s64.2) :cost 2 :encoding :fake-vop :associative t) + (s64.2-elt #:pextrq (s64) (s64.2 imm1) :cost 1) + #+(or) ;; TODO: PINSRQ is currently missing in SBCL. + (s64.2-insert #:pinsrq (s64.2) (s64.2 s64 imm1) :cost 1 :encoding :sse)) + (:loads + (f32.4-ntload #:movntdqa f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref) + (f64.2-ntload #:movntdqa f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref) + (u8.16-ntload #:movntdqa u8.16 u8vec u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref) + (u16.8-ntload #:movntdqa u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref) + (u32.4-ntload #:movntdqa u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref) + (u64.2-ntload #:movntdqa u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref) + (s8.16-ntload #:movntdqa s8.16 s8vec s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref) + (s16.8-ntload #:movntdqa s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref) + (s32.4-ntload #:movntdqa s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref) + (s64.2-ntload #:movntdqa s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref)) + (:stores + (f32.4-ntstore #:movntps f32.4 f32vec f32-array f32.4-non-temporal-aref f32.4-non-temporal-row-major-aref) + (f64.2-ntstore #:movntpd f64.2 f64vec f64-array f64.2-non-temporal-aref f64.2-non-temporal-row-major-aref) + (u8.16-ntstore #:movntdq u8.16 u8vec u8-array u8.16-non-temporal-aref u8.16-non-temporal-row-major-aref) + (u16.8-ntstore #:movntdq u16.8 u16vec u16-array u16.8-non-temporal-aref u16.8-non-temporal-row-major-aref) + (u32.4-ntstore #:movntdq u32.4 u32vec u32-array u32.4-non-temporal-aref u32.4-non-temporal-row-major-aref) + (u64.2-ntstore #:movntdq u64.2 u64vec u64-array u64.2-non-temporal-aref u64.2-non-temporal-row-major-aref) + (s8.16-ntstore #:movntdq s8.16 s8vec s8-array s8.16-non-temporal-aref s8.16-non-temporal-row-major-aref) + (s16.8-ntstore #:movntdq s16.8 s16vec s16-array s16.8-non-temporal-aref s16.8-non-temporal-row-major-aref) + (s32.4-ntstore #:movntdq s32.4 s32vec s32-array s32.4-non-temporal-aref s32.4-non-temporal-row-major-aref) + (s64.2-ntstore #:movntdq s64.2 s64vec s64-array s64.2-non-temporal-aref s64.2-non-temporal-row-major-aref)) + (:associatives + (u16.8-max two-arg-u16.8-max nil) + (u16.8-min two-arg-u16.8-min nil) + (u32.4-max two-arg-u32.4-max nil) + (u32.4-min two-arg-u32.4-min nil) + (s8.16-max two-arg-s8.16-max nil) + (s8.16-min two-arg-s8.16-min nil) + (s32.4-max two-arg-s32.4-max nil) + (s32.4-min two-arg-s32.4-min nil) + (s32.4-mullo two-arg-s32.4-mullo 1) + (s64.2-mul two-arg-s64.2-mul 1)) + (:comparisons + (u64.2= two-arg-u64.2= u64.2-and +u64-true+) + (s64.2= two-arg-s64.2= u64.2-and +u64-true+)) + (:ifs + (f32.4-if f32.4-blend) + (f64.2-if f64.2-blend) + (u8.16-if u8.16-blend) + (u16.8-if u16.8-blend) + (u32.4-if u32.4-blend) + (u64.2-if u64.2-blend) + (s8.16-if s8.16-blend) + (s16.8-if s16.8-blend) + (s32.4-if s32.4-blend) + (s64.2-if s64.2-blend)) + (:unequals + (u64.2/= two-arg-u64.2/= u64.2-and +u64-true+) + (s64.2/= two-arg-s64.2/= u64.2-and +u64-true+))) diff --git a/contrib/sb-simd/code/instruction-sets/sse4-2.lisp b/contrib/sb-simd/code/instruction-sets/sse4-2.lisp new file mode 100644 index 0000000000..9eb83ca8b9 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/sse4-2.lisp @@ -0,0 +1,26 @@ +(in-package #:sb-simd-sse4.2) + +(define-instruction-set :sse4.2 + (:include :sse4.1) + (:test (sse4.2-supported-p)) + (:instructions + ;; u64.2 + (two-arg-u64.2>~ #:pcmpgtq (u64.2) (u64.2 u64.2) :cost 3 :encoding :sse) + (two-arg-u64.2> nil (u64.2) (u64.2 u64.2) :cost 3 :encoding :fake-vop) + (two-arg-u64.2>= nil (u64.2) (u64.2 u64.2) :cost 4 :encoding :fake-vop) + (two-arg-u64.2< nil (u64.2) (u64.2 u64.2) :cost 3 :encoding :fake-vop) + (two-arg-u64.2<= nil (u64.2) (u64.2 u64.2) :cost 4 :encoding :fake-vop) + ;; s64.2 + (two-arg-s64.2> #:pcmpgtq (u64.2) (s64.2 s64.2) :cost 3 :encoding :sse) + (two-arg-s64.2>= nil (u64.2) (s64.2 s64.2) :cost 4 :encoding :fake-vop) + (two-arg-s64.2< nil (u64.2) (s64.2 s64.2) :cost 3 :encoding :fake-vop) + (two-arg-s64.2<= nil (u64.2) (s64.2 s64.2) :cost 4 :encoding :fake-vop)) + (:comparisons + (u64.2< two-arg-u64.2< u64.2-and +u64-true+) + (u64.2<= two-arg-u64.2<= u64.2-and +u64-true+) + (u64.2> two-arg-u64.2> u64.2-and +u64-true+) + (u64.2>= two-arg-u64.2>= u64.2-and +u64-true+) + (s64.2< two-arg-s64.2< u64.2-and +u64-true+) + (s64.2<= two-arg-s64.2<= u64.2-and +u64-true+) + (s64.2> two-arg-s64.2> u64.2-and +u64-true+) + (s64.2>= two-arg-s64.2>= u64.2-and +u64-true+))) diff --git a/contrib/sb-simd/code/instruction-sets/ssse3.lisp b/contrib/sb-simd/code/instruction-sets/ssse3.lisp new file mode 100644 index 0000000000..9dbc932f1e --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/ssse3.lisp @@ -0,0 +1,31 @@ +(in-package #:sb-simd-ssse3) + +(define-instruction-set :ssse3 + (:include :sse3) + (:test (ssse3-supported-p)) + (:instructions + ;; u16.8 + (u16.8-hadd #:phaddw (u16.8) (u16.8 u16.8) :cost 3 :encoding :sse) + (u16.8-hsub #:phsubw (u16.8) (u16.8 u16.8) :cost 3 :encoding :sse) + ;; u32.4 + (u32.4-hadd #:phaddd (u32.4) (u32.4 u32.4) :cost 3 :encoding :sse) + (u32.4-hsub #:phsubd (u32.4) (u32.4 u32.4) :cost 3 :encoding :sse) + ;; s8.16 + (s8.16-shuffle #:pshufb (s8.16) (s8.16 s8.16) :cost 1 :encoding :sse) + (s8.16-abs #:pabsb (s8.16) (s8.16) :cost 2) + (s8.16-sign #:psignb (s8.16) (s8.16 s8.16) :cost 1 :encoding :sse) + ;; s16.8 + (two-arg-s16.8-mulhrs #:pmulhrsw (s16.8) (s16.8 s16.8) :cost 1 :encoding :sse :associative t) + (s16.8-abs #:pabsw (s16.8) (s16.8) :cost 2) + (s16.8-maddubs #:pmaddubsw (s16.8) (u16.8 s16.8) :cost 2 :encoding :sse) + (s16.8-sign #:psignw (s16.8) (s16.8 s16.8) :cost 2 :encoding :sse) + ;; s16.8 + (s16.8-hadd #:phaddw (s16.8) (s16.8 s16.8) :cost 3 :encoding :sse) + (s16.8-hsub #:phsubw (s16.8) (s16.8 s16.8) :cost 3 :encoding :sse) + ;; s32.4 + (s32.4-abs #:pabsd (s32.4) (s32.4) :cost 2) + (s32.4-sign #:psignd (s32.4) (s32.4 s32.4) :cost 3 :encoding :sse) + (s32.4-hadd #:phaddd (s32.4) (s32.4 s32.4) :cost 3 :encoding :sse) + (s32.4-hsub #:phsubd (s32.4) (s32.4 s32.4) :cost 3 :encoding :sse)) + (:associatives + (s16.8-mulhrs two-arg-s16.8-mulhrs 1))) diff --git a/contrib/sb-simd/code/instruction-sets/x86-64.lisp b/contrib/sb-simd/code/instruction-sets/x86-64.lisp new file mode 100644 index 0000000000..5ddbdf2f25 --- /dev/null +++ b/contrib/sb-simd/code/instruction-sets/x86-64.lisp @@ -0,0 +1,13 @@ +(in-package #:sb-simd-x86-64) + +(define-instruction-set :x86-64 + (:include :sb-simd) + (:scalars + (imm1 1 (unsigned-byte 1) (:constant (unsigned-byte 1))) + (imm2 2 (unsigned-byte 2) (:constant (unsigned-byte 2))) + (imm3 3 (unsigned-byte 3) (:constant (unsigned-byte 3))) + (imm4 4 (unsigned-byte 4) (:constant (unsigned-byte 4))) + (imm5 5 (unsigned-byte 5) (:constant (unsigned-byte 5))) + (imm6 6 (unsigned-byte 6) (:constant (unsigned-byte 6))) + (imm7 7 (unsigned-byte 7) (:constant (unsigned-byte 7))) + (imm8 8 (unsigned-byte 8) (:constant (unsigned-byte 8))))) diff --git a/contrib/sb-simd/code/missing-instruction.lisp b/contrib/sb-simd/code/missing-instruction.lisp new file mode 100644 index 0000000000..85acff491c --- /dev/null +++ b/contrib/sb-simd/code/missing-instruction.lisp @@ -0,0 +1,35 @@ +(in-package #:sb-simd-internals) + +;;; Our library always defines all instruction sets and instructions, but +;;; usually, only a subset of them are actually available. All the +;;; remaining instructions are replaced by functions that signal a suitable +;;; error message. + +(define-condition missing-instruction (error) + ((%record + :initarg :record + :reader missing-instruction-record)) + (:report + (lambda (c s) + (with-accessors ((instruction-set instruction-record-instruction-set) + (instruction-name instruction-record-name)) + (missing-instruction-record c) + (format s "Missing ~S instruction ~S." + (instruction-set-name instruction-set) + instruction-name))))) + +(defun missing-instruction (instruction-record) + (error 'missing-instruction :record instruction-record)) + +(defmacro define-missing-instruction + (name &key (required-arguments '()) (optional-arguments '()) (rest-argument nil)) + (assert (find-function-record name)) + `(defun ,name (,@required-arguments + ,@optional-arguments + ,@(when rest-argument `(&rest ,rest-argument))) + (declare (ignore ,@required-arguments + ,@optional-arguments + ,@(when rest-argument `(,rest-argument)))) + (missing-instruction + (load-time-value + (find-function-record ',name))))) diff --git a/contrib/sb-simd/code/packages.lisp b/contrib/sb-simd/code/packages.lisp new file mode 100644 index 0000000000..07859f740b --- /dev/null +++ b/contrib/sb-simd/code/packages.lisp @@ -0,0 +1,1985 @@ +(in-package #:cl-user) + +(defpackage #:sb-simd-internals + (:use #:common-lisp) + (:export + ;; constants.lisp + #:most-positive-f32 + #:most-negative-f32 + #:most-positive-f64 + #:most-negative-f64 + #:most-positive-u1 + #:most-positive-u2 + #:most-positive-u4 + #:most-positive-u8 + #:most-positive-u16 + #:most-positive-u32 + #:most-positive-u64 + #:most-positive-s8 + #:most-negative-s8 + #:most-positive-s16 + #:most-negative-s16 + #:most-positive-s32 + #:most-negative-s32 + #:most-positive-s64 + #:most-negative-s64 + #:+u8-true+ + #:+u16-true+ + #:+u32-true+ + #:+u64-true+ + #:+u8-false+ + #:+u16-false+ + #:+u32-false+ + #:+u64-false+ + #:+s8-true+ + #:+s16-true+ + #:+s32-true+ + #:+s64-true+ + #:+s8-false+ + #:+s16-false+ + #:+s32-false+ + #:+s64-false+ + #:+f32-true+ + #:+f64-true+ + #:+f32-false+ + #:+f64-false+ + ;; utilities.lisp + #:type-specifier + #:non-nil-symbol + #:function-name + #:index+ + #:index- + #:index* + #:ensure-package + #:mksym + #:prefixed-symbols + #:touch + #:required-argument + #:macroexpand-all + #:ensure-list + #:lambda-expression-p + #:parse-function-name + #:define-inline + #:define-notinline + ;; printable.lisp + #:printable + #:printable-slot-plist + ;; instruction-set.lisp + #:*instruction-sets* + #:instruction-set + #:instruction-set-p + #:instruction-set-name + #:instruction-set-package + #:instruction-set-includes + #:instruction-set-available-p + #:find-instruction-set + #:included-instruction-sets + #:define-instruction-set + #:instruction-set-vectorizers + ;; record.lisp + #:record + #:record-p + #:record-name + #:record-instruction-set + #:value-record + #:value-record-p + #:value-record-name + #:value-record-instruction-set + #:value-record-type + #:value-record-primitive-type + #:value-record-bits + #:value-record-scs + #:value-record-simd-width + #:value-record-cast-record + #:find-value-record + #:filter-value-records + #:simd-record + #:simd-record-p + #:scalar-record-p + #:simd-record-name + #:simd-record-instruction-set + #:simd-record-type + #:simd-record-primitive-type + #:simd-record-bits + #:simd-record-scs + #:simd-record-scalar-record + #:function-record + #:function-record-p + #:function-record-name + #:function-record-instruction-set + #:function-record-result-records + #:function-record-result-record + #:function-record-required-argument-records + #:function-record-rest-argument-record + #:function-record-simd-width + #:function-record-scalar-variant + #:find-function-record + #:filter-function-records + #:filter-available-function-records + #:scalar-function-record-p + #:simd-function-record-p + #:aref-record + #:aref-record-p + #:setf-aref-record + #:setf-aref-record-p + #:row-major-aref-record + #:row-major-aref-record-p + #:setf-row-major-aref-record + #:setf-row-major-aref-record-p + #:instruction-record + #:instruction-record-p + #:instruction-record-name + #:instruction-record-instruction-set + #:instruction-record-vop + #:instruction-record-mnemonic + #:instruction-record-result-records + #:instruction-record-argument-records + #:instruction-record-cost + #:instruction-record-pure + #:instruction-record-always-translatable + #:instruction-record-associative + #:instruction-record-encoding + #:instruction-record-prefix + #:instruction-record-suffix + #:vref-record + #:vref-record-p + #:vref-record-name + #:vref-record-instruction-set + #:vref-record-vop + #:vref-record-vop-c + #:vref-record-mnemonic + #:vref-record-value-record + #:vref-record-vector-record + #:vref-record-aref + #:vref-record-row-major-aref + #:load-record + #:load-record-p + #:load-record-name + #:load-record-instruction-set + #:load-record-vop + #:load-record-vop-c + #:load-record-mnemonic + #:load-record-value-record + #:load-record-vector-record + #:load-record-aref + #:load-record-row-major-aref + #:store-record + #:store-record-p + #:store-record-name + #:store-record-instruction-set + #:store-record-vop + #:store-record-vop-c + #:store-record-mnemonic + #:store-record-value-record + #:store-record-vector-record + #:store-record-aref + #:store-record-row-major-aref + #:reffer-record + #:reffer-record-p + #:reffer-record-name + #:reffer-record-instruction-set + #:reffer-record-array-record + #:reffer-record-primitive + #:associative-record + #:associative-record-p + #:associative-record-name + #:associative-record-instruction-set + #:associative-record-binary-operation + #:associative-record-identity-element + #:reducer-record + #:reducer-record-p + #:reducer-record-name + #:reducer-record-instruction-set + #:reducer-record-binary-operation + #:reducer-record-initial-element + #:comparison-record + #:comparison-record-p + #:comparison-record-name + #:comparison-record-instruction-set + #:comparison-record-cmp + #:comparison-record-and + #:comparison-record-truth + #:unequal-record + #:unequal-record-p + #:unequal-record-name + #:unequal-record-instruction-set + #:unequal-record-neq + #:unequal-record-and + #:unequal-record-truth + #:if-record + #:if-record-p + #:if-record-name + #:if-record-instruction-set + #:if-record-blend + #:cast-record + #:cast-record-p + #:cast-record-name + #:cast-record-instruction-set + #:scalar-cast-record + #:scalar-cast-record-p + #:scalar-cast-record-name + #:scalar-cast-record-instruction-set + #:simd-cast-record + #:simd-cast-record-p + #:simd-cast-record-name + #:simd-cast-record-instruction-set + #:simd-cast-record-broadcast + #:reinterpret-cast-record + #:reinterpret-cast-record-p + #:reinterpret-cast-record-name + #:reinterpret-cast-record-instruction-set + #:reinterpret-cast-record-reinterpreters + ;; Macros + #:define-fake-vop + #:define-trivial-fake-vop + #:with-primitive-arguments + #:with-primitive-argument + #:instruction-set-case + ;; CPU Identification + #:sse-supported-p + #:sse2-supported-p + #:sse3-supported-p + #:ssse3-supported-p + #:sse4.1-supported-p + #:sse4.2-supported-p + #:avx-supported-p + #:avx2-supported-p + #:fma-supported-p)) + +(progn + (defpackage #:sb-simd + (:use #:common-lisp #:sb-simd-internals) + #0= + (:export + ;; Re-exports from sb-simd-internals. + #:most-positive-f32 + #:most-negative-f32 + #:most-positive-f64 + #:most-negative-f64 + #:most-positive-u1 + #:most-positive-u2 + #:most-positive-u4 + #:most-positive-u8 + #:most-positive-u16 + #:most-positive-u32 + #:most-positive-u64 + #:most-positive-s8 + #:most-negative-s8 + #:most-positive-s16 + #:most-negative-s16 + #:most-positive-s32 + #:most-negative-s32 + #:most-positive-s64 + #:most-negative-s64 + #:+u8-true+ + #:+u16-true+ + #:+u32-true+ + #:+u64-true+ + #:+u8-false+ + #:+u16-false+ + #:+u32-false+ + #:+u64-false+ + #:+s8-true+ + #:+s16-true+ + #:+s32-true+ + #:+s64-true+ + #:+s8-false+ + #:+s16-false+ + #:+s32-false+ + #:+s64-false+ + #:+f32-true+ + #:+f64-true+ + #:+f32-false+ + #:+f64-false+ + #:index + #:index+ + #:index- + #:index* + ;; Macros + #:define-inline + #:instruction-set-case + ;; f32 + #:f32 + #:f32vec + #:f32-array + #:f32-if + #:f32-and + #:f32-or + #:f32-xor + #:f32-andc1 + #:f32-not + #:f32-max + #:f32-min + #:f32+ + #:f32- + #:f32* + #:f32/ + #:f32= + #:f32/= + #:f32< + #:f32<= + #:f32> + #:f32>= + #:f32-incf + #:f32-decf + #:f32-aref + #:f32-row-major-aref + ;; f64 + #:f64 + #:f64vec + #:f64-array + #:f64-if + #:f64-and + #:f64-or + #:f64-xor + #:f64-andc1 + #:f64-not + #:f64-max + #:f64-min + #:f64+ + #:f64- + #:f64* + #:f64/ + #:f64= + #:f64/= + #:f64< + #:f64<= + #:f64> + #:f64>= + #:f64-incf + #:f64-decf + #:f64-aref + #:f64-row-major-aref + ;; u1 + #:u1 + ;; u2 + #:u2 + ;; u4 + #:u4 + ;; u8 + #:u8 + #:u8vec + #:u8-array + #:u8-if + #:u8-and + #:u8-or + #:u8-xor + #:u8-andc1 + #:u8-not + #:u8-max + #:u8-min + #:u8+ + #:u8- + #:u8= + #:u8/= + #:u8< + #:u8<= + #:u8> + #:u8>= + #:u8-incf + #:u8-decf + #:u8-aref + #:u8-row-major-aref + ;; u16 + #:u16 + #:u16vec + #:u16-array + #:u16-if + #:u16-and + #:u16-or + #:u16-xor + #:u16-andc1 + #:u16-not + #:u16-max + #:u16-min + #:u16+ + #:u16- + #:u16= + #:u16/= + #:u16< + #:u16<= + #:u16> + #:u16>= + #:u16-incf + #:u16-decf + #:u16-aref + #:u16-row-major-aref + ;; u32 + #:u32 + #:u32vec + #:u32-array + #:u32-if + #:u32-and + #:u32-or + #:u32-xor + #:u32-andc1 + #:u32-not + #:u32-max + #:u32-min + #:u32+ + #:u32- + #:u32= + #:u32/= + #:u32< + #:u32<= + #:u32> + #:u32>= + #:u32-incf + #:u32-decf + #:u32-aref + #:u32-row-major-aref + ;; u64 + #:u64 + #:u64vec + #:u64-array + #:u64-if + #:u64-and + #:u64-or + #:u64-xor + #:u64-andc1 + #:u64-not + #:u64-max + #:u64-min + #:u64+ + #:u64- + #:u64= + #:u64/= + #:u64< + #:u64<= + #:u64> + #:u64>= + #:u64-incf + #:u64-decf + #:u64-aref + #:u64-row-major-aref + ;; s8 + #:s8 + #:s8vec + #:s8-array + #:s8-if + #:s8-and + #:s8-or + #:s8-xor + #:s8-andc1 + #:s8-not + #:s8-max + #:s8-min + #:s8+ + #:s8- + #:s8= + #:s8/= + #:s8< + #:s8<= + #:s8> + #:s8>= + #:s8-incf + #:s8-decf + #:s8-aref + #:s8-row-major-aref + ;; s16 + #:s16 + #:s16vec + #:s16-array + #:s16-if + #:s16-and + #:s16-or + #:s16-xor + #:s16-andc1 + #:s16-not + #:s16-max + #:s16-min + #:s16+ + #:s16- + #:s16= + #:s16/= + #:s16< + #:s16<= + #:s16> + #:s16>= + #:s16-incf + #:s16-decf + #:s16-aref + #:s16-row-major-aref + ;; s32 + #:s32 + #:s32vec + #:s32-array + #:s32-if + #:s32-and + #:s32-or + #:s32-xor + #:s32-andc1 + #:s32-not + #:s32-max + #:s32-min + #:s32+ + #:s32- + #:s32= + #:s32/= + #:s32< + #:s32<= + #:s32> + #:s32>= + #:s32-incf + #:s32-decf + #:s32-aref + #:s32-row-major-aref + ;; s64 + #:s64 + #:s64vec + #:s64-array + #:s64-if + #:s64-and + #:s64-or + #:s64-xor + #:s64-andc1 + #:s64-not + #:s64-max + #:s64-min + #:s64+ + #:s64- + #:s64= + #:s64/= + #:s64< + #:s64<= + #:s64> + #:s64>= + #:s64-incf + #:s64-decf + #:s64-aref + #:s64-row-major-aref + ;; Simple Strings + #:charvec + #:char-array + ;; Integer Packers + #:u64-from-u8s + #:u64-from-u16s + #:u64-from-u32s + #:u64-from-s8s + #:u64-from-s16s + #:u64-from-s32s + #:u64-from-s64 + ;; Integer Unpackers + #:u8s-from-u64 + #:u16s-from-u64 + #:u32s-from-u64 + #:s8s-from-u64 + #:s16s-from-u64 + #:s32s-from-u64 + #:s64-from-u64 + ;; Boolean Conversion + #:u8-from-boolean + #:u16-from-boolean + #:u32-from-boolean + #:u64-from-boolean + ;; Odd Bits + #:u16-odd-bits + #:u32-odd-bits)) + + (defpackage #:sb-simd-x86-64 + (:use #:common-lisp #:sb-simd-internals #:sb-simd) + #0# + #1= + (:export #:imm1 #:imm2 #:imm3 #:imm4 #:imm5 #:imm6 #:imm7 #:imm8)) + + (defpackage #:sb-simd-sse + (:use #:common-lisp #:sb-simd-internals #:sb-simd-x86-64) + (:shadow + ;; f32 + #:f32 + #:f32-and + #:f32-or + #:f32-xor + #:f32-andc1 + #:f32-not + #:f32-max + #:f32-min + #:f32+ + #:f32- + #:f32* + #:f32/ + #:f32= + #:f32/= + #:f32< + #:f32<= + #:f32> + #:f32>= + #:f32-incf + #:f32-decf + #:f32-aref + #:f32-row-major-aref) + #0# + #1# + #2= + (:export + #:f32! + #:p128 + ;; f32.4 + #:make-f32.4 + #:f32.4 + #:f32.4! + #:f32.4-values + #:f32.4-broadcast + #:f32.4!-from-f32 + #:f32.4-and + #:f32.4-or + #:f32.4-xor + #:f32.4-max + #:f32.4-min + #:f32.4+ + #:f32.4- + #:f32.4* + #:f32.4/ + #:f32.4-horizontal-and + #:f32.4-horizontal-or + #:f32.4-horizontal-xor + #:f32.4-horizontal-max + #:f32.4-horizontal-min + #:f32.4-horizontal+ + #:f32.4-horizontal* + #:f32.4-andc1 + #:f32.4-not + #:f32.4-reciprocal + #:f32.4-rsqrt + #:f32.4-sqrt + #:f32.4-movemask + #:f32.4-shuffle + #:f32.4-incf + #:f32.4-decf + #:f32.4-aref #:f32.4-row-major-aref + #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref)) + + (defpackage #:sb-simd-sse2 + (:use #:common-lisp #:sb-simd-internals #:sb-simd-sse) + (:shadow + ;; f64 + #:f64 + #:f64-and + #:f64-or + #:f64-xor + #:f64-andc1 + #:f64-not + #:f64-max + #:f64-min + #:f64+ + #:f64- + #:f64* + #:f64/ + #:f64= + #:f64/= + #:f64< + #:f64<= + #:f64> + #:f64>= + #:f64-incf + #:f64-decf + #:f64-aref + #:f64-row-major-aref) + #0# + #1# + #2# + #3= + (:export + #:f64! + #:u8! + #:u16! + #:u32! + #:u64! + ;; f32.4 + #:f32.4= + #:f32.4/= + #:f32.4< + #:f32.4<= + #:f32.4> + #:f32.4>= + ;; f64.2 + #:make-f64.2 + #:f64.2 + #:f64.2! + #:f64.2-values + #:f64.2-broadcast + #:f64.2-and + #:f64.2-or + #:f64.2-xor + #:f64.2-max + #:f64.2-min + #:f64.2+ + #:f64.2- + #:f64.2* + #:f64.2/ + #:f64.2= + #:f64.2/= + #:f64.2< + #:f64.2<= + #:f64.2> + #:f64.2>= + #:f64.2-horizontal-and + #:f64.2-horizontal-or + #:f64.2-horizontal-xor + #:f64.2-horizontal-max + #:f64.2-horizontal-min + #:f64.2-horizontal+ + #:f64.2-horizontal* + #:f64.2-andc1 + #:f64.2-not + #:f64.2-sqrt + #:f64.2-shuffle + #:f64.2-unpackhi + #:f64.2-unpacklo + #:f64.2-movemask + #:f64.2-incf + #:f64.2-decf + #:f64.2-aref #:f64.2-row-major-aref + #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref + ;; u8.16 + #:make-u8.16 + #:u8.16 + #:u8.16! + #:u8.16-values + #:u8.16-broadcast + #:u8.16-and + #:u8.16-or + #:u8.16-xor + #:u8.16-andc1 + #:u8.16-not + #:u8.16+ + #:u8.16- + #:u8.16= + #:u8.16-unpackhi + #:u8.16-unpacklo + #:u8.16-movemask + #:u8.16-average + ;; TODO Having 8-bit shifts would be nice, but there is no instruction + ;; for that. But they could be implemented as a fake VOP. + ;; #:u8.16-shiftl + ;; #:u8.16-shiftr + #:u8.16-incf + #:u8.16-decf + #:u8.16-aref #:u8.16-row-major-aref + #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref + ;; u16.8 + #:make-u16.8 + #:u16.8 + #:u16.8! + #:u16.8-values + #:u16.8-broadcast + #:u16.8-and + #:u16.8-or + #:u16.8-xor + #:u16.8-andc1 + #:u16.8-not + #:u16.8+ + #:u16.8- + #:u16.8= + #:u16.8-unpackhi + #:u16.8-unpacklo + #:u16.8-movemask + #:u16.8-average + #:u16.8-shiftl + #:u16.8-shiftr + #:u16.8-incf + #:u16.8-decf + #:u16.8-aref #:u16.8-row-major-aref + #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref + ;; u32.4 + #:make-u32.4 + #:u32.4 + #:u32.4! + #:u32.4-values + #:u32.4-broadcast + #:u32.4-and + #:u32.4-or + #:u32.4-xor + #:u32.4-andc1 + #:u32.4-not + #:u32.4+ + #:u32.4- + #:u32.4= + #:u32.4-unpackhi + #:u32.4-unpacklo + #:u32.4-movemask + #:u32.4-shuffle + #:u32.4-shiftl + #:u32.4-shiftr + #:u32.4-incf + #:u32.4-decf + #:u32.4-aref #:u32.4-row-major-aref + #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref + #:u32.4-string-ref #:u32.4-row-major-string-ref + ;; u64.2 + #:make-u64.2 + #:u64.2 + #:u64.2! + #:u64.2-values + #:u64.2-broadcast + #:u64.2-and + #:u64.2-or + #:u64.2-xor + #:u64.2-andc1 + #:u64.2-not + #:u64.2+ + #:u64.2- + #:u64.2-unpackhi + #:u64.2-unpacklo + #:u64.2-movemask + #:u64.2-shiftl + #:u64.2-shiftr + #:u64.2-incf + #:u64.2-decf + #:u64.2-aref #:u64.2-row-major-aref + #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref + ;; s8.16 + #:make-s8.16 + #:s8.16 + #:s8.16! + #:s8.16-values + #:s8.16-broadcast + #:s8.16-and + #:s8.16-or + #:s8.16-xor + #:s8.16-andc1 + #:s8.16-not + #:s8.16+ + #:s8.16- + #:s8.16= + #:s8.16-unpackhi + #:s8.16-unpacklo + #:s8.16-movemask + #:s8.16-aref #:s8.16-row-major-aref + #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref + ;; s16.8 + #:make-s16.8 + #:s16.8 + #:s16.8! + #:s16.8-values + #:s16.8-broadcast + #:s16.8-and + #:s16.8-or + #:s16.8-xor + #:s16.8-andc1 + #:s16.8-not + #:s16.8+ + #:s16.8- + #:s16.8= + #:s16.8-unpackhi + #:s16.8-unpacklo + #:s16.8-movemask + #:s16.8-mullo + #:s16.8-elt + #:s16.8-shufflehi + #:s16.8-shufflelo + #:s16.8-shiftl + #:s16.8-shiftr + #:s16.8-aref #:s16.8-row-major-aref + #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref + ;; s32.4 + #:make-s32.4 + #:s32.4 + #:s32.4! + #:s32.4-values + #:s32.4-broadcast + #:s32.4-and + #:s32.4-or + #:s32.4-xor + #:s32.4-andc1 + #:s32.4-not + #:s32.4+ + #:s32.4- + #:s32.4= + #:s32.4-unpackhi + #:s32.4-unpacklo + #:s32.4-movemask + #:s32.4-shuffle + #:s32.4-shiftl + #:s32.4-shiftr + #:s32.4-aref #:s32.4-row-major-aref + #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref + ;; s64.2 + #:make-s64.2 + #:s64.2 + #:s64.2! + #:s64.2-values + #:s64.2-broadcast + #:s64.2-and + #:s64.2-or + #:s64.2-xor + #:s64.2-andc1 + #:s64.2-not + #:s64.2+ + #:s64.2- + #:s64.2-unpackhi + #:s64.2-unpacklo + #:s64.2-movemask + #:s64.2-shiftl + #:s64.2-shiftr + #:s64.2-aref #:s64.2-row-major-aref + #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref)) + + (defpackage #:sb-simd-sse3 + (:use #:common-lisp #:sb-simd-internals #:sb-simd-sse2) + #0# + #1# + #2# + #3# + #4= + (:export + #:f32.4-hadd + #:f32.4-hdup + #:f32.4-ldup)) + + (defpackage #:sb-simd-ssse3 + (:use #:common-lisp #:sb-simd-internals #:sb-simd-sse3) + #0# + #1# + #2# + #3# + #4# + #5= + (:export + #:s16.8-mulhrs + #:u16.8-hadd + #:u32.4-hadd + #:u16.8-hsub + #:u32.4-hsub + #:s8.16-shuffle + #:s8.16-abs + #:s8.16-sign + #:s16.8-abs + #:s16.8-maddubs + #:s16.8-sign + #:s16.8-hadd + #:s16.8-hsub + #:s32.4-abs + #:s32.4-sign + #:s32.4-hadd + #:s32.4-hsub)) + + (defpackage #:sb-simd-sse4.1 + (:use #:common-lisp #:sb-simd-internals #:sb-simd-ssse3) + (:shadow + #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref + #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref + #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref + #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref + #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref + #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref + #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref + #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref + #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref + #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref) + #0# + #1# + #2# + #3# + #4# + #5# + #6= + (:export + #:f32.4-if + #:f32.4-round + #:f32.4-floor + #:f32.4-ceiling + #:f32.4-truncate + ;; #:f32.4-elt ;; TODO + #:f32.4-insert + #:f64.2-if + #:f64.2-round + #:f64.2-floor + #:f64.2-ceiling + #:f64.2-truncate + #:u8.16-if + #:u8.16-elt + #:u8.16-insert + #:u16.8-if + #:u16.8-max + #:u16.8-min + #:u16.8-minpos + #:u32.4-if + #:u32.4-max + #:u32.4-min + #:u32.4-elt + #:u32.4-insert + #:u64.2-if + #:u64.2= + #:u64.2/= + #:u64.2-elt + #:s8.16-if + #:s8.16-max + #:s8.16-min + #:s8.16-elt + #:s8.16-insert + #:s16.8-if + #:s16.8-from-u8.16 + #:s16.8-from-s8.16 + #:s16.8-pack + #:s32.4-if + #:s32.4-max + #:s32.4-min + #:s32.4-from-u8.16 + #:s32.4-from-s8.16 + #:s32.4-from-u16.8 + #:s32.4-from-s16.8 + #:s32.4-mullo + #:s32.4-elt + #:s32.4-insert + #:s64.2-if + #:s64.2-from-u8.16 + #:s64.2-from-s8.16 + #:s64.2-from-u16.8 + #:s64.2-from-s16.8 + #:s64.2-from-u32.4 + #:s64.2-from-s32.4 + #:s64.2= + #:s64.2/= + #:s64.2-elt)) + + (defpackage #:sb-simd-sse4.2 + (:use #:common-lisp #:sb-simd-internals #:sb-simd-sse4.1) + #0# + #1# + #2# + #3# + #4# + #5# + #6# + #7= + (:export + #:u64.2> + #:u64.2>= + #:u64.2< + #:u64.2<=)) + + (defpackage #:sb-simd-avx + (:use #:common-lisp #:sb-simd-internals #:sb-simd-x86-64) + #0# + #1# + (:shadow + ;; f32 + #:f32 + #:f32-and + #:f32-or + #:f32-xor + #:f32-andc1 + #:f32-not + #:f32-max + #:f32-min + #:f32+ + #:f32- + #:f32* + #:f32/ + #:f32= + #:f32/= + #:f32< + #:f32<= + #:f32> + #:f32>= + #:f32-incf + #:f32-decf + #:f32-aref + #:f32-row-major-aref + ;; f64 + #:f64 + #:f64-and + #:f64-or + #:f64-xor + #:f64-andc1 + #:f64-not + #:f64-max + #:f64-min + #:f64+ + #:f64- + #:f64* + #:f64/ + #:f64= + #:f64/= + #:f64< + #:f64<= + #:f64> + #:f64>= + #:f64-incf + #:f64-decf + #:f64-aref + #:f64-row-major-aref) + #8= + (:export + #:p128 + #:p256 + #:vzeroupper + #:vzeroall + ;; f32.4 + #:make-f32.4 + #:f32.4 + #:f32.4! + #:f32.4-values + #:f32.4-broadcast + #:f32.4-if + #:f32.4-from-f64.4 + #:f32.4-and + #:f32.4-or + #:f32.4-xor + #:f32.4-andc1 + #:f32.4-not + #:f32.4-max + #:f32.4-min + #:f32.4+ + #:f32.4- + #:f32.4* + #:f32.4/ + #:f32.4-horizontal-and + #:f32.4-horizontal-or + #:f32.4-horizontal-xor + #:f32.4-horizontal-max + #:f32.4-horizontal-min + #:f32.4-horizontal+ + #:f32.4-horizontal* + #:f32.4= + #:f32.4/= + #:f32.4< + #:f32.4<= + #:f32.4> + #:f32.4>= + #:f32.4-addsub + #:f32.4-hadd + #:f32.4-hsub + #:f32.4-reciprocal + #:f32.4-rsqrt + #:f32.4-sqrt + #:f32.4-unpackhi + #:f32.4-unpacklo + #:f32.4-round + #:f32.4-floor + #:f32.4-ceiling + #:f32.4-truncate + #:f32.4-permute + #:f32.4-shuffle + #:f32.4-movemask + #:f32.4-incf + #:f32.4-decf + #:f32.4-aref #:f32.4-row-major-aref + #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref + ;; f64.2 + #:make-f64.2 + #:f64.2 + #:f64.2! + #:f64.2-values + #:f64.2-broadcast + #:f64.2-if + #:f64.2-and + #:f64.2-or + #:f64.2-xor + #:f64.2-andc1 + #:f64.2-not + #:f64.2-max + #:f64.2-min + #:f64.2+ + #:f64.2- + #:f64.2* + #:f64.2/ + #:f64.2-horizontal-and + #:f64.2-horizontal-or + #:f64.2-horizontal-xor + #:f64.2-horizontal-max + #:f64.2-horizontal-min + #:f64.2-horizontal+ + #:f64.2-horizontal* + #:f64.2= + #:f64.2/= + #:f64.2< + #:f64.2<= + #:f64.2> + #:f64.2>= + #:f64.2-addsub + #:f64.2-hadd + #:f64.2-hsub + #:f64.2-sqrt + #:f64.2-unpackhi + #:f64.2-unpacklo + #:f64.2-round + #:f64.2-floor + #:f64.2-ceiling + #:f64.2-truncate + #:f64.2-permute + #:f64.2-shuffle + #:f64.2-movemask + #:f64.2-incf + #:f64.2-decf + #:f64.2-aref #:f64.2-row-major-aref + #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref + ;; f32.8 + #:make-f32.8 + #:f32.8 + #:f32.8! + #:f32.8-values + #:f32.8-broadcast + #:f32.8-if + #:f32.8-from-u32.8 + #:f32.8-and + #:f32.8-or + #:f32.8-xor + #:f32.8-andc1 + #:f32.8-not + #:f32.8-max + #:f32.8-min + #:f32.8+ + #:f32.8- + #:f32.8* + #:f32.8/ + #:f32.8-horizontal-and + #:f32.8-horizontal-or + #:f32.8-horizontal-xor + #:f32.8-horizontal-max + #:f32.8-horizontal-min + #:f32.8-horizontal+ + #:f32.8-horizontal* + #:f32.8= + #:f32.8/= + #:f32.8< + #:f32.8<= + #:f32.8> + #:f32.8>= + #:f32.8-dupeven + #:f32.8-dupodd + #:f32.8-hadd + #:f32.8-hsub + #:f32.8-reciprocal + #:f32.8-rsqrt + #:f32.8-sqrt + #:f32.8-unpackhi + #:f32.8-unpacklo + #:f32.8-round + #:f32.8-floor + #:f32.8-ceiling + #:f32.8-truncate + #:f32.8-permute + #:f32.8-permute128 + #:f32.8-shuffle + #:f32.8-movemask + #:f32.4-from-f32.8 + #:f32.8-insert-f32.4 + #:f32.8-round + #:f32.8-incf + #:f32.8-decf + #:f32.8-aref #:f32.8-row-major-aref + #:f32.8-non-temporal-aref #:f32.8-non-temporal-row-major-aref + ;; f64.4 + #:make-f64.4 + #:f64.4 + #:f64.4! + #:f64.4-values + #:f64.4-broadcast + #:f64.4-if + #:f64.4-from-f32.4 + #:f64.4-from-u32.4 + #:f64.4-from-s32.4 + #:f64.4-and + #:f64.4-or + #:f64.4-xor + #:f64.4-andc1 + #:f64.4-not + #:f64.4-max + #:f64.4-min + #:f64.4+ + #:f64.4- + #:f64.4* + #:f64.4/ + #:f64.4-horizontal-and + #:f64.4-horizontal-or + #:f64.4-horizontal-xor + #:f64.4-horizontal-max + #:f64.4-horizontal-min + #:f64.4-horizontal+ + #:f64.4-horizontal* + #:f64.4= + #:f64.4/= + #:f64.4< + #:f64.4<= + #:f64.4> + #:f64.4>= + #:f64.4-dupeven + #:f64.4-hadd + #:f64.4-hsub + #:f64.4-sqrt + #:f64.4-unpackhi + #:f64.4-unpacklo + #:f64.4-ceiling + #:f64.4-permute + #:f64.4-permute128 + #:f64.4-shuffle + #:f64.4-movemask + #:f64.4-reverse + #:f64.2-from-f64.4 + #:f64.4-insert-f64.2 + #:f64.4-set128 + #:f64.4-round + #:f64.4-incf + #:f64.4-decf + #:f64.4-aref #:f64.4-row-major-aref + #:f64.4-non-temporal-aref #:f64.4-non-temporal-row-major-aref + ;; u8.16 + #:make-u8.16 + #:u8.16 + #:u8.16! + #:u8.16-values + #:u8.16-broadcast + #:u8.16-if + #:u8.16-and + #:u8.16-or + #:u8.16-xor + #:u8.16-andc1 + #:u8.16-not + #:u8.16+ + #:u8.16- + #:u8.16= + #:u8.16/= + #:u8.16> + #:u8.16< + #:u8.16>= + #:u8.16<= + #:u8.16-unpackhi + #:u8.16-unpacklo + #:u8.16-movemask + #:u8.16-aref #:u8.16-row-major-aref + #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref + ;; u16.8 + #:make-u16.8 + #:u16.8 + #:u16.8! + #:u16.8-values + #:u16.8-broadcast + #:u16.8-if + #:u16.8-and + #:u16.8-or + #:u16.8-xor + #:u16.8-andc1 + #:u16.8-not + #:u16.8+ + #:u16.8- + #:u16.8= + #:u16.8/= + #:u16.8> + #:u16.8< + #:u16.8>= + #:u16.8<= + #:u16.8-shiftl + #:u16.8-shiftr + #:u16.8-unpackhi + #:u16.8-unpacklo + #:u16.8-movemask + #:u16.8-aref #:u16.8-row-major-aref + #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref + ;; u32.4 + #:make-u32.4 + #:u32.4 + #:u32.4! + #:u32.4-values + #:u32.4-broadcast + #:u32.4-if + #:u32.4-and + #:u32.4-or + #:u32.4-xor + #:u32.4-andc1 + #:u32.4-not + #:u32.4+ + #:u32.4- + #:u32.4= + #:u32.4/= + #:u32.4> + #:u32.4< + #:u32.4>= + #:u32.4<= + #:u32.4-unpackhi + #:u32.4-unpacklo + #:u32.4-movemask + #:u32.4-permute + #:u32.4-aref #:u32.4-row-major-aref + #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref + #:u32.4-string-ref #:u32.4-row-major-string-ref + ;; u64.2 + #:make-u64.2 + #:u64.2 + #:u64.2! + #:u64.2-values + #:u64.2-broadcast + #:u64.2-if + #:u64.2-and + #:u64.2-or + #:u64.2-xor + #:u64.2-andc1 + #:u64.2-not + #:u64.2+ + #:u64.2- + #:u64.2= + #:u64.2/= + #:u64.2> + #:u64.2< + #:u64.2>= + #:u64.2<= + #:u64.2-unpackhi + #:u64.2-unpacklo + #:u64.2-movemask + #:u64.2-permute + #:u64.2-aref #:u64.2-row-major-aref + #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref + ;; u8.32 + #:make-u8.32 + #:u8.32 + #:u8.32! + #:u8.32-values + #:u8.32-broadcast + #:u8.16-from-u8.32 + #:u8.32-insert-u8.16 + #:u8.32-aref #:u8.32-row-major-aref + #:u8.32-non-temporal-aref #:u8.32-non-temporal-row-major-aref + ;; u16.16 + #:make-u16.16 + #:u16.16 + #:u16.16! + #:u16.16-values + #:u16.16-broadcast + #:u16.8-from-u16.16 + #:u16.16-insert-u16.8 + #:u16.16-aref #:u16.16-row-major-aref + #:u16.16-non-temporal-aref #:u16.16-non-temporal-row-major-aref + ;; u32.8 + #:make-u32.8 + #:u32.8 + #:u32.8! + #:u32.8-values + #:u32.8-broadcast + #:u32.8-permute + #:u32.8-insert-u32.4 + #:u32.8-aref #:u32.8-row-major-aref + #:u32.8-non-temporal-aref #:u32.8-non-temporal-row-major-aref + #:u32.8-string-ref #:u32.8-row-major-string-ref + ;; u64.4 + #:make-u64.4 + #:u64.4 + #:u64.4! + #:u64.4-values + #:u64.4-broadcast + #:u64.4-permute + #:u64.2-from-u64.4 + #:u64.4-insert-u64.2 + #:u64.4-aref #:u64.4-row-major-aref + #:u64.4-non-temporal-aref #:u64.4-non-temporal-row-major-aref + ;; s8.16 + #:make-s8.16 + #:s8.16 + #:s8.16! + #:s8.16-values + #:s8.16-broadcast + #:s8.16-if + #:s8.16-and + #:s8.16-or + #:s8.16-xor + #:s8.16-andc1 + #:s8.16-not + #:s8.16+ + #:s8.16- + #:s8.16= + #:s8.16/= + #:s8.16> + #:s8.16< + #:s8.16>= + #:s8.16<= + #:s8.16-unpackhi + #:s8.16-unpacklo + #:s8.16-movemask + #:s8.16-aref #:s8.16-row-major-aref + #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref + ;; s16.8 + #:make-s16.8 + #:s16.8 + #:s16.8! + #:s16.8-values + #:s16.8-broadcast + #:s16.8-if + #:s16.8-and + #:s16.8-or + #:s16.8-xor + #:s16.8-andc1 + #:s16.8-not + #:s16.8+ + #:s16.8- + #:s16.8-mullo + #:s16.8= + #:s16.8/= + #:s16.8> + #:s16.8< + #:s16.8>= + #:s16.8<= + #:s16.8-mullo + #:s16.8-shiftl + #:s16.8-shiftr + #:s16.8-unpackhi + #:s16.8-unpacklo + #:s16.8-movemask + #:s16.8-aref #:s16.8-row-major-aref + #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref + ;; s32.4 + #:make-s32.4 + #:s32.4 + #:s32.4! + #:s32.4-values + #:s32.4-broadcast + #:s32.4-if + #:s32.4-from-f64.4 + #:s32.4-and + #:s32.4-or + #:s32.4-xor + #:s32.4-andc1 + #:s32.4-not + #:s32.4+ + #:s32.4- + #:s32.4-mullo + #:s32.4= + #:s32.4/= + #:s32.4> + #:s32.4< + #:s32.4>= + #:s32.4<= + #:s32.4-mullo + #:s32.4-unpackhi + #:s32.4-unpacklo + #:s32.4-movemask + #:s32.4-permute + #:s32.4-aref #:s32.4-row-major-aref + #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref + ;; s64.2 + #:s64.2 + #:make-s64.2 + #:s64.2 + #:s64.2! + #:s64.2-values + #:s64.2-broadcast + #:s64.2-if + #:s64.2-and + #:s64.2-or + #:s64.2-xor + #:s64.2-andc1 + #:s64.2-not + #:s64.2+ + #:s64.2- + #:s64.2= + #:s64.2/= + #:s64.2> + #:s64.2< + #:s64.2>= + #:s64.2<= + #:s64.2-shiftl + #:s64.2-shiftr + #:s64.2-unpackhi + #:s64.2-unpacklo + #:s64.2-movemask + #:s64.2-permute + #:s64.2-aref #:s64.2-row-major-aref + #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref + ;; s8.32 + #:make-s8.32 + #:s8.32 + #:s8.32! + #:s8.32-values + #:s8.32-broadcast + #:s8.16-from-s8.32 + #:s8.32-insert-s8.16 + #:s8.32-permute128 + #:s8.32-aref #:s8.32-row-major-aref + #:s8.32-non-temporal-aref #:s8.32-non-temporal-row-major-aref + ;; s16.16 + #:make-s16.16 + #:s16.16 + #:s16.16! + #:s16.16-values + #:s16.16-broadcast + #:s16.8-from-s16.16 + #:s16.16-insert-s16.8 + #:s16.16-permute128 + #:s16.16-aref #:s16.16-row-major-aref + #:s16.16-non-temporal-aref #:s16.16-non-temporal-row-major-aref + ;; s32.8 + #:make-s32.8 + #:s32.8 + #:s32.8! + #:s32.8-values + #:s32.8-broadcast + #:s32.4-from-s32.8 + #:s32.8-insert-s32.4 + #:s32.8-permute128 + #:s32.8-aref #:s32.8-row-major-aref + #:s32.8-non-temporal-aref #:s32.8-non-temporal-row-major-aref + ;; s64.4 + #:make-s64.4 + #:s64.4 + #:s64.4! + #:s64.4-values + #:s64.4-broadcast + #:s64.2-from-s64.4 + #:s64.4-insert-s64.2 + #:s64.4-permute + #:s64.4-permute128 + #:s64.4-aref #:s64.4-row-major-aref + #:s64.4-non-temporal-aref #:s64.4-non-temporal-row-major-aref)) + + (defpackage #:sb-simd-avx2 + (:use #:common-lisp #:sb-simd-internals #:sb-simd-avx) + (:shadow + #:u8.16!-from-p256 #:u16.8!-from-p256 #:u32.4!-from-p256 #:u64.2!-from-p256 + #:s8.16!-from-p256 #:s16.8!-from-p256 #:s32.4!-from-p256 #:s64.2!-from-p256 + #:u8.16! #:u16.8! #:u32.4! #:u64.2! + #:s8.16! #:s16.8! #:s32.4! #:s64.2! + #:make-u8.32 #:make-u16.16 #:make-u32.8 #:make-u64.4 + #:make-s8.32 #:make-s16.16 #:make-s32.8 #:make-s64.4 + #:u8.32 #:u16.16 #:u32.8 #:u64.4 + #:s8.32 #:s16.16 #:s32.8 #:s64.4 + #:u8.32-values #:u16.16-values #:u32.8-values #:u64.4-values + #:s8.32-values #:s16.16-values #:s32.8-values #:s64.4-values + #:u8.16-from-u8.32 #:u16.8-from-u16.16 #:u32.4-from-u32.8 #:u64.2-from-u64.4 + #:s8.16-from-s8.32 #:s16.8-from-s16.16 #:s32.4-from-s32.8 #:s64.2-from-s64.4 + #:u8.32-insert-u8.16 #:u16.16-insert-u16.8 #:u32.8-insert-u32.4 #:u64.4-insert-u64.2 + #:s8.32-insert-s8.16 #:s16.16-insert-s16.8 #:s32.8-insert-s32.4 #:s64.4-insert-s64.2 + #:u8.16-broadcast #:u16.8-broadcast #:u32.4-broadcast #:u64.2-broadcast + #:s8.16-broadcast #:s16.8-broadcast #:s32.4-broadcast #:s64.2-broadcast + #:u8.32-broadcast #:u16.16-broadcast #:u32.8-broadcast #:u64.4-broadcast + #:s8.32-broadcast #:s16.16-broadcast #:s32.8-broadcast #:s64.4-broadcast + #:u8.32-permute128 #:s8.32-permute128 + #:u32.8-permute128 #:s32.8-permute128 + #:s16.16-permute128 + #:s64.4-permute128 + #:f64.4-reverse + #:s64.2-shiftl + #:s64.2-shiftr + #:f32.4-non-temporal-aref #:f32.4-non-temporal-row-major-aref + #:f64.2-non-temporal-aref #:f64.2-non-temporal-row-major-aref + #:f32.8-non-temporal-aref #:f32.8-non-temporal-row-major-aref + #:f64.4-non-temporal-aref #:f64.4-non-temporal-row-major-aref + #:u8.16-non-temporal-aref #:u8.16-non-temporal-row-major-aref + #:u16.8-non-temporal-aref #:u16.8-non-temporal-row-major-aref + #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref + #:u64.2-non-temporal-aref #:u64.2-non-temporal-row-major-aref + #:s8.16-non-temporal-aref #:s8.16-non-temporal-row-major-aref + #:s16.8-non-temporal-aref #:s16.8-non-temporal-row-major-aref + #:s32.4-non-temporal-aref #:s32.4-non-temporal-row-major-aref + #:s64.2-non-temporal-aref #:s64.2-non-temporal-row-major-aref + #:u8.32-non-temporal-aref #:u8.32-non-temporal-row-major-aref + #:u16.16-non-temporal-aref #:u16.16-non-temporal-row-major-aref + #:u32.8-non-temporal-aref #:u32.8-non-temporal-row-major-aref + #:u64.4-non-temporal-aref #:u64.4-non-temporal-row-major-aref + #:s8.32-non-temporal-aref #:s8.32-non-temporal-row-major-aref + #:s16.16-non-temporal-aref #:s16.16-non-temporal-row-major-aref + #:s32.8-non-temporal-aref #:s32.8-non-temporal-row-major-aref + #:s64.4-non-temporal-aref #:s64.4-non-temporal-row-major-aref) + #0# + #1# + #8# + #9= + (:export + ;; f32.8 + ;; f64.4 + #:f64.4-reverse + ;; u8.16 + ;; u16.8 + ;; u32.4 + #:u32.4-shiftl + #:u32.4-shiftr + ;; u64.2 + #:u64.2-shiftl + #:u64.2-shiftr + ;; s8.16 + ;; s16.8 + ;; s32.4 + #:s32.4-shiftl + #:s32.4-shiftr + ;; s64.2 + #:s64.2-shiftl + #:s64.2-shiftr + ;; u8.32 + #:u8.32-if + #:u8.32-and + #:u8.32-or + #:u8.32-xor + #:u8.32-andc1 + #:u8.32-not + #:u8.32-max + #:u8.32-min + #:u8.32+ + #:u8.32- + #:u8.32= + #:u8.32/= + #:u8.32> + #:u8.32< + #:u8.32>= + #:u8.32<= + #:u8.32-avg + #:u8.32-packus + #:u8.32-unpackhi + #:u8.32-unpacklo + #:u8.32-movemask + #:u8.32-permute128 + #:u8.16-from-u8.32 + #:u8.32-insert-u8.16 + ;; u16.16 + #:u16.16-from-u8.16 + #:u16.16-if + #:u16.16-and + #:u16.16-or + #:u16.16-xor + #:u16.16-andc1 + #:u16.16-not + #:u16.16-max + #:u16.16-min + #:u16.16+ + #:u16.16- + #:s16.16-mulhi + #:u16.16= + #:u16.16/= + #:u16.16> + #:u16.16< + #:u16.16>= + #:u16.16<= + #:u16.16-shiftl + #:u16.16-shiftr + #:u16.16-avg + #:u16.16-packus + #:u16.16-unpacklo + #:u16.16-unpackhi + #:u16.16-movemask + #:u16.8-from-u16.16 + #:u16.16-insert-u16.8 + #:u16.16-permute128 + ;; u32.8 + #:u32.8-from-u16.8 + #:u32.8-from-u8.16 + #:u32.8-if + #:u32.8-and + #:u32.8-or + #:u32.8-xor + #:u32.8-andc1 + #:u32.8-not + #:u32.8-max + #:u32.8-min + #:u32.8+ + #:u32.8- + #:u32.8= + #:u32.8/= + #:u32.8> + #:u32.8< + #:u32.8>= + #:u32.8<= + #:u32.8-shiftl + #:u32.8-shiftr + #:u32.8-unpacklo + #:u32.8-unpackhi + #:u32.8-movemask + #:u32.4-from-u32.8 + #:u32.8-insert-u32.4 + #:u32.8-permute128 + #:u32.8-incf + #:u32.8-decf + ;; u64.4 + #:u64.4-from-u16.8 + #:u64.4-from-u32.4 + #:u64.4-from-u8.16 + #:u64.4-if + #:u64.4-and + #:u64.4-or + #:u64.4-xor + #:u64.4-andc1 + #:u64.4-not + #:u64.4+ + #:u64.4- + #:u64.4-mul + #:u64.4= + #:u64.4/= + #:u64.4> + #:u64.4< + #:u64.4>= + #:u64.4<= + #:u64.4-shiftl + #:u64.4-shiftr + #:u64.4-unpacklo + #:u64.4-unpackhi + #:u64.4-movemask + #:u64.2-from-u64.4 + #:u64.4-insert-u64.2 + #:u64.4-permute128 + #:u64.4-incf + #:u64.4-decf + ;; s8.32 + #:s8.32-if + #:s8.32-and + #:s8.32-or + #:s8.32-xor + #:s8.32-andc1 + #:s8.32-not + #:s8.32-max + #:s8.32-max + #:s8.32+ + #:s8.32- + #:s32.8-mullo + #:s8.32= + #:s8.32/= + #:s8.32> + #:s8.32< + #:s8.32>= + #:s8.32<= + #:s8.32-abs + #:s8.32-packs + #:s8.32-unpacklo + #:s8.32-unpackhi + #:s8.32-movemask + #:s8.32-shuffle + #:s8.32-sign + #:s8.16-from-s8.32 + #:s8.32-insert-s8.16 + #:s8.32-permute128 + ;; s16.16 + #:s16.16-from-s8.16 + #:s16.16-from-u8.16 + #:s16.16-if + #:s16.16-and + #:s16.16-or + #:s16.16-xor + #:s16.16-andc1 + #:s16.16-not + #:s16.16-max + #:s16.16-min + #:s16.16+ + #:s16.16- + #:s16.16-mulhi + #:s16.16-mullo + #:s16.16-mulhrs + #:s16.16= + #:s16.16/= + #:s16.16> + #:s16.16< + #:s16.16>= + #:s16.16<= + #:s16.16-abs + #:s16.16-hadd + #:s16.16-hadds + #:s16.16-madd + #:s16.16-maddubs + #:s16.16-hsub + #:s16.16-hsubs + #:s16.16-packs + #:s16.16-unpackhi + #:s16.16-unpacklo + #:s16.16-movemask + #:s16.16-shiftl + #:s16.16-shiftr + #:s16.16-sign + #:s16.8-from-s16.16 + #:s16.16-insert-s16.8 + #:s16.16-permute128 + ;; s32.8 + #:s32.8-from-s16.8 + #:s32.8-from-u16.8 + #:s32.8-from-s8.16 + #:s32.8-from-u8.16 + #:s32.8-if + #:s32.8-and + #:s32.8-or + #:s32.8-xor + #:s32.8-andc1 + #:s32.8-not + #:s32.8-max + #:s32.8-min + #:s32.8+ + #:s32.8- + #:s32.8-mullo + #:s32.8= + #:s32.8/= + #:s32.8> + #:s32.8< + #:s32.8>= + #:s32.8<= + #:s32.8-abs + #:s32.8-hadd + #:s32.8-hsub + #:s32.8-shiftl + #:s32.8-shiftr + #:s32.8-sign + #:s32.8-unpacklo + #:s32.8-unpackhi + #:s32.8-movemask + #:s32.4-from-s32.8 + #:s32.8-insert-s32.4 + #:s32.8-permute128 + #:s32.8-incf + #:s32.8-decf + ;; s64.4 + #:s64.4-from-s16.8 + #:s64.4-from-u16.8 + #:s64.4-from-s32.4 + #:s64.4-from-u32.4 + #:s64.4-from-s8.16 + #:s64.4-from-u8.16 + #:s64.4-if + #:s64.4-and + #:s64.4-or + #:s64.4-xor + #:s64.4-andc1 + #:s64.4-not + #:s64.4+ + #:s64.4- + #:s64.4= + #:s64.4/= + #:s64.4> + #:s64.4< + #:s64.4>= + #:s64.4<= + #:s64.4-shiftl + #:s64.4-shiftr + #:s64.4-unpackhi + #:s64.4-unpacklo + #:s64.4-movemask + #:s64.2-from-s64.4 + #:s64.4-insert-s64.2 + #:s64.4-permute128 + #:s64.4-incf + #:s64.4-decf)) + + (defpackage #:sb-simd-fma + (:use #:common-lisp #:sb-simd-internals #:sb-simd-avx2) + #0# + #1# + #8# + #9# + #10= + (:export + ;; f32 + #:f32-fmadd + #:f32-fnmadd + #:f32-fmsub + #:f32-fmaddsub + #:f32-fmsubadd + ;; f64 + #:f64-fmadd + #:f64-fnmadd + #:f64-fmsub + #:f64-fmaddsub + #:f64-fmsubadd + ;; f32.4 + #:f32.4-fmadd + #:f32.4-fnmadd + #:f32.4-fmsub + #:f32.4-fmaddsub + #:f32.4-fmsubadd + ;; f32.8 + #:f32.8-fmadd + #:f32.8-fnmadd + #:f32.8-fmsub + #:f32.8-fmaddsub + #:f32.8-fmsubadd + ;; f64.2 + #:f64.2-fmadd + #:f64.2-fnmadd + #:f64.2-fmsub + #:f64.2-fmaddsub + #:f64.2-fmsubadd + ;; f64.4 + #:f64.4-fmadd + #:f64.4-fnmadd + #:f64.4-fmsub + #:f64.4-fmaddsub + #:f64.4-fmsubadd))) diff --git a/contrib/sb-simd/code/printable.lisp b/contrib/sb-simd/code/printable.lisp new file mode 100644 index 0000000000..dfed99d81b --- /dev/null +++ b/contrib/sb-simd/code/printable.lisp @@ -0,0 +1,24 @@ +(in-package #:sb-simd-internals) + +(defclass printable () ()) + +;;; Gather a plist of all class slots. We use this plist to conveniently +;;; define PRINT-OBJECT. +(defgeneric printable-slot-plist (printable) + (:method-combination append :most-specific-last)) + +(defmethod printable-slot-plist append (printable) + '()) + +(defmethod print-object ((printable printable) stream) + (print-unreadable-object (printable stream :type t) + (pprint-logical-block (stream (printable-slot-plist printable)) + (loop + (pprint-exit-if-list-exhausted) + (write (pprint-pop) :stream stream) + (pprint-exit-if-list-exhausted) + (write-char #\space stream) + (write (pprint-pop) :stream stream) + (pprint-exit-if-list-exhausted) + (write-char #\space stream) + (pprint-newline :linear stream))))) diff --git a/contrib/sb-simd/code/record.lisp b/contrib/sb-simd/code/record.lisp new file mode 100644 index 0000000000..02160e38aa --- /dev/null +++ b/contrib/sb-simd/code/record.lisp @@ -0,0 +1,1025 @@ +(in-package #:sb-simd-internals) + +;;; A record describes a particular function or data type. Macros later +;;; use the information stored in these records to generate most of the +;;; code of this library. + +(defclass record (printable) + ((%name + :type (or non-nil-symbol function-name) + :initarg :name + :initform (required-argument :name) + :reader record-name) + (%instruction-set + :type instruction-set + :initarg :instruction-set + :initform *instruction-set* + :reader record-instruction-set))) + +(defun record-p (x) + (typep x 'record)) + +;;; Ensure that the home package of the name of the record is the same as +;;; the package of its instruction set. +(defmethod shared-initialize :after + ((record record) slot-names &key &allow-other-keys) + (with-accessors ((name record-name) + (instruction-set record-instruction-set)) record + (let ((package (etypecase name + (symbol (symbol-package name)) + (function-name (symbol-package (second name)))))) + (unless (eq package (instruction-set-package instruction-set)) + (error "Wrong home package ~S for ~S record ~S." + (package-name package) + (instruction-set-name instruction-set) + name))))) + +(defmethod printable-slot-plist append ((record record)) + (list :name (record-name record) + :instruction-set (record-instruction-set record))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Value Record +;;; +;;; A value record describes a specialized set of Common Lisp objects. +;;; Each value record consists of a Common Lisp type specifier, a +;;; corresponding primitive type specifier used by SBCL's VM, the number of +;;; bits required to represent all such objects, and a list of storage +;;; classes in which such objects can be stored. + +(defclass value-record (record) + (;; Define aliases for inherited slots. + (%name :reader value-record-name) + (%instruction-set :reader value-record-instruction-set) + ;; The Common Lisp type of this value. + (%type + :type type-specifier + :initarg :type + :initform (required-argument :type) + :reader value-record-type) + ;; The primitive type of this value as used by SBCL's VM. + (%primitive-type + :type type-specifier + :initarg :primitive-type + :initform (required-argument :primitive-type) + :reader value-record-primitive-type) + ;; The number of bits that are necessary to represent this value in + ;; memory. + (%bits + :type unsigned-byte + :initarg :bits + :initform (required-argument :bits) + :reader value-record-bits) + ;; A list of storage classes where this value can be placed. + (%scs + :type list + :initarg :scs + :initform (required-argument :scs) + :reader value-record-scs))) + +(defun value-record-p (x) + (typep x 'value-record)) + +(defmethod printable-slot-plist append ((value-record value-record)) + (list :type (value-record-type value-record) + :primitive-type (value-record-primitive-type value-record) + :bits (value-record-bits value-record) + :scs (value-record-scs value-record))) + +;;; A hash table, mapping from value record names to value records. +(declaim (hash-table *value-records*)) +(defparameter *value-records* (make-hash-table :test #'eq)) + +(defun find-value-record (name &optional (errorp t)) + (or (gethash name *value-records*) + (when errorp + (error "There is no value record with the name ~S." + name)))) + +(defmethod make-load-form ((value-record value-record) &optional env) + (declare (ignore env)) + `(find-value-record ',(value-record-name value-record))) + +(defun filter-value-records (predicate) + (loop for value-record being the hash-values of *value-records* + when (funcall predicate value-record) + collect value-record)) + +;;; Ensure that each value record is registered in the *VALUE-RECORDS* hash +;;; table. +(defmethod shared-initialize :after + ((value-record value-record) slot-names &key &allow-other-keys) + (setf (gethash (value-record-name value-record) *value-records*) + value-record)) + +;; Interns a string designator into the SB-VM package, while gracefully +;; handling the case where the symbol is not present. +(defun find-sc (sc) + (or (find-symbol (string sc) "SB-VM") + 'sb-vm::descriptor-reg)) + +;; Intern all symbols and strings in EXPR that have no home package in the +;; SB-VM package. +(defun find-primitive-type (expr) + (etypecase expr + (string (find-symbol expr "SB-VM")) + (symbol (if (null (symbol-package expr)) + (find-primitive-type (symbol-name expr)) + expr)) + (integer expr) + (list (mapcar #'find-primitive-type expr)))) + +(defmethod decode-record-definition ((_ (eql 'value-record)) expr) + (destructuring-bind (name bits type &optional (primitive-type 't) (scs '(#:descriptor-reg))) expr + `(let ((.value-record. + (make-instance 'value-record + :name ',name + :bits ,bits + :type ',type + :primitive-type ',(find-primitive-type primitive-type) + :scs ',(mapcar #'find-sc scs)))) + (make-instance 'scalar-cast-record + :name ',name + :result-record .value-record.)))) + +(defgeneric value-record-simd-width (value-record) + (:method ((value-record value-record)) 1)) + +(defgeneric value-record-cast-record (value-record) + (:method ((value-record value-record)) + (find-function-record (value-record-name value-record)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; SIMD Record + +(defclass simd-record (value-record) + (;; Define aliases for inherited slots. + (%name :reader simd-record-name) + (%instruction-set :reader simd-record-instruction-set) + (%type :reader simd-record-type) + (%primitive-type :reader simd-record-primitive-type) + (%bits :reader simd-record-bits) + (%scs :reader simd-record-scs) + ;; The scalar record of the elements of this SIMD pack. + (%scalar-record + :type value-record + :initarg :scalar-record + :initform (required-argument :scalar-record) + :reader simd-record-scalar-record) + ;; The number of scalar elements in this SIMD pack. + (%width + :type unsigned-byte + :initarg :width + :initform (required-argument :width) + :reader value-record-simd-width))) + +(defun simd-record-p (x) + (typep x 'simd-record)) + +(defun scalar-record-p (x) + (typep x '(and value-record (not simd-record)))) + +(defmethod decode-record-definition ((_ (eql 'simd-record)) expr):w + (destructuring-bind (name scalar-record-name bits primitive-type scs) expr + (let ((simd-pack-type + (let ((base-type + (ecase bits + (128 (find-symbol "SIMD-PACK" "SB-EXT")) + (256 (find-symbol "SIMD-PACK-256" "SB-EXT"))))) + (cond ((not base-type) 't) + ((not scalar-record-name) base-type) + (t `(,base-type ,scalar-record-name)))))) + `(let ((.scalar-record. (find-value-record ',(or scalar-record-name (find-symbol "U64"))))) + (make-instance 'simd-record + :name ',name + :scalar-record .scalar-record. + :bits ',bits + :width (the unsigned-byte (/ ,bits (value-record-bits .scalar-record.))) + :type ',simd-pack-type + :primitive-type ',(find-primitive-type primitive-type) + :scs ',(mapcar #'find-sc scs)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Function Record +;;; +;;; A function record describes one or more Common Lisp functions. +;;; Depending on its attributes, the function record will later be used to +;;; define zero or more VOPs, defknowns, deftransforms, defuns and compiler +;;; macros. + +(defclass function-record (record) + (;; Define aliases for inherited slots. + (%name :reader function-record-name) + (%instruction-set :reader function-record-instruction-set) + ;; The scalar function that is applied element-wise by the SIMD function + ;; denoted by this record, or NIL if the record doesn't denote such a + ;; SIMD function. + (%scalar-variant + :type (or function-record null) + :initarg :scalar-variant + :initform nil + :reader function-record-scalar-variant))) + +(defun function-record-p (x) + (typep x 'function-record)) + +(defgeneric function-record-result-records (function-record)) + +(defgeneric function-record-required-argument-records (function-record)) + +(defgeneric function-record-rest-argument-record (function-record) + (:method ((function-record function-record)) + nil)) + +(defgeneric function-record-result-record (function-record) + (:method ((function-record function-record)) + (let ((result-records (function-record-result-records function-record))) + (when (null result-records) + (error "Attempt to access the result record of a function that produces zero values.")) + (first result-records)))) + +(defun function-record-simd-width (function-record) + (value-record-simd-width + (function-record-result-record function-record))) + +(defmethod printable-slot-plist append ((function-record function-record)) + (list :argument-types + (let ((mandatory (function-record-required-argument-records function-record)) + (rest (function-record-rest-argument-record function-record))) + (if (not rest) + (mapcar #'value-record-name mandatory) + `(,@(mapcar #'value-record-name mandatory) &rest (value-record-name rest)))) + :result-records (function-record-result-records function-record))) + +(defun scalar-function-record-p (x) + (and (function-record-p x) + (not (null (function-record-result-records x))) + (notany #'simd-record-p (function-record-result-records x)))) + +(defun simd-function-record-p (x) + (and (function-record-p x) + (not (null (function-record-result-records x))) + (every #'simd-record-p (function-record-result-records x)))) + +;;; Automatically derive the :SCALAR-VARIANT keyword. +(defmethod shared-initialize :around + ((function-record function-record) slot-names &rest rest &key name &allow-other-keys) + (flet ((give-up () + (return-from shared-initialize (call-next-method)))) + (multiple-value-bind (symbol setf-p) (parse-function-name name) + (let* ((string (symbol-name symbol)) + (package (symbol-package symbol)) + (prefix-end (or (position #\. string) (give-up))) + (suffix-end (length string)) + (suffix-start (or (position-if-not #'digit-char-p string :start (1+ prefix-end)) suffix-end)) + (prefix (subseq string 0 prefix-end)) + (suffix (subseq string suffix-start suffix-end)) + (symbol (or (find-symbol (concatenate 'string prefix suffix) package) (give-up))) + (function-name (if setf-p `(setf ,symbol) symbol)) + (scalar-variant-record (or (find-function-record function-name nil) (give-up)))) + (apply #'call-next-method function-record slot-names + :scalar-variant scalar-variant-record + rest))))) + +;;; A hash table, mapping from instruction names to instruction records. +(declaim (hash-table *function-records*)) +(defparameter *function-records* (make-hash-table :test #'equal)) + +(defun find-function-record (name &optional (errorp t)) + (or (gethash name *function-records*) + (when errorp + (error "There is no function with the name ~S." + name)))) + +(defmethod make-load-form ((function-record function-record) &optional env) + (declare (ignore env)) + `(find-function-record ',(function-record-name function-record))) + +;;; Ensure that each function record is registered in *FUNCTION-RECORDS*, +;;; and that vectorizing functions are registered in their instruction set. +(defmethod shared-initialize :after + ((function-record function-record) slot-names &key &allow-other-keys) + (let ((scalar-variant (function-record-scalar-variant function-record))) + (unless (null scalar-variant) + (register-vectorizer scalar-variant function-record))) + (setf (gethash (function-record-name function-record) *function-records*) + function-record)) + +(defun filter-function-records (predicate) + (loop for function-record being the hash-values of *function-records* + when (funcall predicate function-record) + collect function-record)) + +(defun filter-available-function-records (predicate) + (filter-function-records + (lambda (function-record) + (and (instruction-set-available-p (function-record-instruction-set function-record)) + (funcall predicate function-record))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Reffer Records + +(defclass reffer-record (function-record) + ((%name :reader reffer-record-name) + (%instruction-set :reader reffer-record-instruction-set) + ;; A value record, describing which kinds of objects are loaded or stored. + (%result-records + :type list + :initarg :result-records + :initform (required-argument :result-records) + :reader function-record-result-records) + ;; A value record, describing what kind of array is being referenced. + (%array-record + :type value-record + :initarg :array-record + :initform (required-argument :array-record) + :reader reffer-record-array-record) + ;; A function record, denoting the underlying primitive load or store + ;; operation of that record. This primitive always accepts a + ;; one-dimensional array and a single row-major index as arguments. + (%primitive + :type (or function-record null) + :initarg :primitive + :initform nil + :reader reffer-record-primitive))) + +(defun reffer-record-p (x) + (typep x 'reffer-record)) + +(defmethod printable-slot-plist append ((reffer-record reffer-record)) + (list :array-record (reffer-record-array-record reffer-record))) + +(defclass aref-record (reffer-record) + (;; Define aliases for inherited slots. + (%name :reader aref-record-name) + (%instruction-set :reader aref-record-instruction-set))) + +(defun aref-record-p (x) + (typep x 'aref-record)) + +(defmethod function-record-required-argument-records + ((aref-record aref-record)) + (list (reffer-record-array-record aref-record))) + +(defmethod function-record-rest-argument-record + ((aref-record aref-record)) + (find-value-record 'sb-simd:index)) + +(defclass row-major-aref-record (reffer-record) + (;; Define aliases for inherited slots. + (%name :reader row-major-aref-record-name) + (%instruction-set :reader row-major-aref-record-instruction-set))) + +(defun row-major-aref-record-p (x) + (typep x 'row-major-aref-record)) + +(defmethod function-record-required-argument-records + ((row-major-aref-record row-major-aref-record)) + (list (reffer-record-array-record row-major-aref-record) + (find-value-record 'sb-simd:index))) + +(defclass setf-aref-record (reffer-record) + (;; Define aliases for inherited slots. + (%name :reader setf-aref-record-name) + (%instruction-set :reader setf-aref-record-instruction-set))) + +(defun setf-aref-record-p (x) + (typep x 'setf-aref-record)) + +(defmethod function-record-required-argument-records + ((setf-aref-record setf-aref-record)) + (list (function-record-result-record setf-aref-record) + (reffer-record-array-record setf-aref-record))) + +(defmethod function-record-rest-argument-record + ((setf-aref-record setf-aref-record)) + (find-value-record 'sb-simd:index)) + +(defclass setf-row-major-aref-record (reffer-record) + (;; Define aliases for inherited slots. + (%name :reader setf-row-major-aref-record-name) + (%instruction-set :reader setf-row-major-aref-record-instruction-set))) + +(defun setf-row-major-aref-record-p (x) + (typep x 'setf-row-major-aref-record)) + +(defmethod function-record-required-argument-records + ((setf-row-major-aref-record setf-row-major-aref-record)) + (list (function-record-result-record setf-row-major-aref-record) + (reffer-record-array-record setf-row-major-aref-record) + (find-value-record 'sb-simd:index))) + +(defmethod decode-record-definition ((_ (eql 'reffer-record)) expr) + (destructuring-bind (type array-type aref row-major-aref) expr + `(let ((.value-record. (find-value-record ',type)) + (.array-record. (find-value-record ',array-type))) + (let ((.primitive. (make-instance 'row-major-aref-record + :name ',row-major-aref + :array-record .array-record. + :result-records (list .value-record.)))) + (make-instance 'aref-record + :name ',aref + :array-record .array-record. + :primitive .primitive. + :result-records (list .value-record.))) + (let ((.primitive. (make-instance 'setf-row-major-aref-record + :name '(setf ,row-major-aref) + :array-record .array-record. + :result-records (list .value-record.)))) + (make-instance 'setf-aref-record + :name '(setf ,aref) + :array-record .array-record. + :primitive .primitive. + :result-records (list .value-record.)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Instruction Record +;;; +;;; An instruction record describes a function that can more or less +;;; directly be expressed as a single assembler instruction. + +(defclass instruction-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader instruction-record-name) + (%instruction-set :reader instruction-record-instruction-set) + ;; The name of the VOP that translates this instruction. + (%vop + :type non-nil-symbol + :initarg :vop + :initform (required-argument :vop) + :reader instruction-record-vop) + ;; The mnemonic that is used within the VOP to emit this instruction. + (%mnemonic + :type symbol + :initarg :mnemonic + :initform (required-argument :mnemonic) + :reader instruction-record-mnemonic) + ;; A list of value records - one for each result. + (%result-records + :type list + :initarg :result-records + :initform (required-argument :result-records) + :reader instruction-record-result-records + :reader function-record-result-records) + ;; A list of value records - one for each argument. + (%argument-records + :type list + :initarg :argument-records + :initform (required-argument :argument-records) + :reader function-record-required-argument-records + :reader instruction-record-argument-records) + ;; A rough estimate of the cost of executing that instruction. + (%cost + :type unsigned-byte + :initarg :cost + :initform 1 + :reader instruction-record-cost) + ;; Whether this instruction satisfies (INST a b) = (INST b a). + (%associative + :type boolean + :initarg :associative + :initform nil + :reader instruction-record-associative) + ;; Whether this instruction is free of side-effects. + (%pure + :type boolean + :initarg :pure + :initform t + :reader instruction-record-pure) + ;; Whether this instruction can always be translated into a VOP. + (%always-translatable + :type boolean + :initarg :always-translatable + :initform t + :reader instruction-record-always-translatable) + ;; How the instruction is turned into a VOP. + (%encoding + :type (member :standard :sse :sse+xmm0 :custom :fake-vop :move :fma) + :initarg :encoding + :initform :standard + :reader instruction-record-encoding) + ;; A list that, if provided, supplies the first arguments to the + ;; mnemonic. + (%prefix + :type list + :initarg :prefix + :initform '() + :reader instruction-record-prefix) + ;; A list that, if provided, supplies the last arguments to the + ;; mnemonic. + (%suffix + :type list + :initarg :suffix + :initform '() + :reader instruction-record-suffix))) + +(defun instruction-record-p (x) + (typep x 'instruction-record)) + +(defmethod printable-slot-plist append ((instruction-record instruction-record)) + (list :vop (instruction-record-vop instruction-record) + :mnemonic (instruction-record-mnemonic instruction-record) + :pure (instruction-record-pure instruction-record) + :always-translatable (instruction-record-always-translatable instruction-record) + :encoding (instruction-record-encoding instruction-record) + :prefix (instruction-record-prefix instruction-record) + :suffix (instruction-record-suffix instruction-record))) + +(defmethod decode-record-definition ((_ (eql 'instruction-record)) expr) + (destructuring-bind (name mnemonic result-record-names argument-record-names &rest rest) expr + `(make-instance 'instruction-record + :name ',name + :vop ',(mksym (symbol-package name) "%" name) + :mnemonic ',(find-symbol (string mnemonic) sb-assem::*backend-instruction-set-package*) + :result-records (mapcar #'find-value-record ',result-record-names) + :argument-records (mapcar #'find-value-record ',argument-record-names) + ,@rest))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Vref Record +;;; +;;; A vref record describes either a load or store instruction. + +(defclass vref-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader vref-record-name) + (%instruction-set :reader vref-record-instruction-set) + ;; The name of the VOP that translates this instruction. + (%vop + :type non-nil-symbol + :initarg :vop + :initform (required-argument :vop) + :reader vref-record-vop) + ;; The name of the VOP that translates this instruction when the + ;; supplied index is a constant. + (%vop-c + :type non-nil-symbol + :initarg :vop-c + :initform (required-argument :vop-c) + :reader vref-record-vop-c) + ;; The mnemonic that is used within the VOP to emit this instruction. + (%mnemonic + :type symbol + :initarg :mnemonic + :initform (required-argument :mnemonic) + :reader vref-record-mnemonic) + ;; A value record, describing which kinds of objects are loaded or stored. + (%value-record + :type value-record + :initarg :value-record + :initform (required-argument :value-record) + :reader vref-record-value-record) + ;; A value record, describing the vector being read from or written to. + (%vector-record + :type value-record + :initarg :vector-record + :initform (required-argument :vector-record) + :reader vref-record-vector-record) + ;; The name of the n-dimensional accessor to be generated. + (%aref + :type function-name + :initarg :aref + :initform (required-argument :aref) + :reader vref-record-aref) + ;; The name of the vector accessor to be generated. + (%row-major-aref + :type function-name + :initarg :row-major-aref + :initform (required-argument :row-major-aref) + :reader vref-record-row-major-aref))) + +(defun vref-record-p (x) + (typep x 'vref-record)) + +(defmethod printable-slot-plist append ((vref-record vref-record)) + (list :vop (vref-record-vop vref-record) + :vop-c (vref-record-vop-c vref-record) + :mnemonic (vref-record-mnemonic vref-record) + :vector-record (vref-record-vector-record vref-record) + :aref (vref-record-aref vref-record) + :row-major-aref (vref-record-row-major-aref vref-record))) + +(defmethod function-record-result-records ((vref-record vref-record)) + (list + (vref-record-value-record vref-record))) + +(defun decode-vref-record-definition (expr instance) + (destructuring-bind (name mnemonic value-type vector-type array-type aref row-major-aref &rest rest) expr + `(let* ((.value-record. (find-value-record ',value-type)) + (.vector-record. (find-value-record ',vector-type)) + (.array-record. (find-value-record ',array-type)) + (.primitive. + (make-instance ',instance + :name ',name + :vop ',(mksym (symbol-package name) "%" name) + :vop-c ',(mksym (symbol-package name) "%" name "-C") + :mnemonic ',(find-symbol (string mnemonic) sb-assem::*backend-instruction-set-package*) + :value-record .value-record. + :vector-record .vector-record. + :aref ',aref + :row-major-aref ',row-major-aref + ,@rest))) + ,(if (eq instance 'load-record) + `(make-instance 'row-major-aref-record + :name ',row-major-aref + :array-record .array-record. + :primitive .primitive. + :result-records (list .value-record.)) + `(make-instance 'setf-row-major-aref-record + :name '(setf ,row-major-aref) + :array-record .array-record. + :primitive .primitive. + :result-records (list .value-record.))) + ,(if (eq instance 'load-record) + `(make-instance 'aref-record + :name ',aref + :array-record .array-record. + :primitive .primitive. + :result-records (list .value-record.)) + `(make-instance 'setf-aref-record + :name '(setf ,aref) + :array-record .array-record. + :primitive .primitive. + :result-records (list .value-record.)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Load Record + +(defclass load-record (vref-record) + (;; Define aliases for inherited slots. + (%name :reader load-record-name) + (%instruction-set :reader load-record-instruction-set) + (%vop :reader load-record-vop) + (%vop-c :reader load-record-vop-c) + (%mnemonic :reader load-record-mnemonic) + (%value-record :reader load-record-value-record) + (%vector-record :reader load-record-vector-record) + (%aref :reader load-record-aref) + (%row-major-aref :reader load-record-row-major-aref))) + +(defun load-record-p (x) + (typep x 'load-record)) + +(defmethod function-record-required-argument-records ((load-record load-record)) + (list (load-record-vector-record load-record) + (find-value-record 'sb-simd:index))) + +(defmethod decode-record-definition ((_ (eql 'load-record)) expr) + (decode-vref-record-definition expr 'load-record)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Store Record + +(defclass store-record (vref-record) + (;; Define aliases for inherited slots. + (%name :reader store-record-name) + (%instruction-set :reader store-record-instruction-set) + (%vop :reader store-record-vop) + (%vop-c :reader store-record-vop-c) + (%mnemonic :reader store-record-mnemonic) + (%value-record :reader store-record-value-record) + (%vector-record :reader store-record-vector-record) + (%aref :reader store-record-aref) + (%row-major-aref :reader store-record-row-major-aref))) + +(defun store-record-p (x) + (typep x 'store-record)) + +(defmethod function-record-required-argument-records ((store-record store-record)) + (list (store-record-value-record store-record) + (store-record-vector-record store-record) + (find-value-record 'sb-simd:index))) + +(defmethod decode-record-definition ((_ (eql 'store-record)) expr) + (decode-vref-record-definition expr 'store-record)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Associative Record + +(defclass associative-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader associative-record-name) + (%instruction-set :reader associative-record-instruction-set) + ;; The binary operation used to combine the arguments. + (%binary-operation + :initarg :binary-operation + :initform (required-argument :binary-operation) + :reader associative-record-binary-operation) + ;; The identity for that operation, or NIL if there is none. + (%identity-element + :initarg :identity-element + :initform (required-argument :identity-element) + :reader associative-record-identity-element))) + +(defun associative-record-p (x) + (typep x 'associative-record)) + +(defmethod function-record-result-records ((associative-record associative-record)) + (function-record-result-records + (associative-record-binary-operation associative-record))) + +(defmethod function-record-required-argument-records ((associative-record associative-record)) + (if (not (associative-record-identity-element associative-record)) + (list (function-record-rest-argument-record associative-record)) + (list))) + +(defmethod function-record-rest-argument-record ((associative-record associative-record)) + (first (function-record-required-argument-records + (associative-record-binary-operation associative-record)))) + +(defmethod decode-record-definition ((_ (eql 'associative-record)) expr) + (destructuring-bind (name binary-operation identity-element &rest rest) expr + `(let* ((.binary-operation. (find-function-record ',binary-operation)) + (.value-record. (function-record-result-record .binary-operation.))) + (make-instance 'associative-record + :name ',name + :binary-operation .binary-operation. + ;; We can safely use NIL to denote the case where no identity + ;; element is supplied, because our associative functions operate on + ;; numbers only. + :identity-element ,identity-element + ,@rest)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Reducer Record + +(defclass reducer-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader reducer-record-name) + (%instruction-set :reader reducer-record-instruction-set) + ;; The binary operation used to reduce the arguments. + (%binary-operation + :initarg :binary-operation + :initform (required-argument :binary-operation) + :reader reducer-record-binary-operation) + ;; The initial element for the reduction. + (%initial-element + :initarg :initial-element + :initform (required-argument :initial-element) + :reader reducer-record-initial-element))) + +(defun reducer-record-p (x) + (typep x 'reducer-record)) + +(defmethod function-record-result-records ((reducer-record reducer-record)) + (function-record-result-records + (reducer-record-binary-operation reducer-record))) + +(defmethod function-record-required-argument-records ((reducer-record reducer-record)) + (list (function-record-rest-argument-record reducer-record))) + +(defmethod function-record-rest-argument-record ((reducer-record reducer-record)) + (first (function-record-required-argument-records + (reducer-record-binary-operation reducer-record)))) + +(defmethod decode-record-definition ((_ (eql 'reducer-record)) expr) + (destructuring-bind (name binary-operation initial-element &rest rest) expr + `(make-instance 'reducer-record + :name ',name + :binary-operation (find-function-record ',binary-operation) + :initial-element ,initial-element + ,@rest))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Comparison Record + +(defclass comparison-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader comparison-record-name) + (%instruction-set :reader comparison-record-instruction-set) + ;; The binary comparison function. + (%cmp + :type instruction-record + :initarg :cmp + :initform (required-argument :cmp) + :reader comparison-record-cmp) + ;; The function for combining the results of some comparisons. + (%and + :type function-record + :initarg :and + :initform (required-argument :and) + :reader comparison-record-and) + ;; The truth value returned for an empty comparison. + (%truth + :initarg :truth + :initform (required-argument :truth) + :reader comparison-record-truth))) + +(defun comparison-record-p (x) + (typep x 'comparison-record)) + +(defmethod function-record-result-records ((comparison-record comparison-record)) + (function-record-result-records + (comparison-record-and comparison-record))) + +(defmethod function-record-required-argument-records ((comparison-record comparison-record)) + (list (function-record-rest-argument-record comparison-record))) + +(defmethod function-record-rest-argument-record ((comparison-record comparison-record)) + (first (function-record-required-argument-records (comparison-record-cmp comparison-record)))) + +(defmethod decode-record-definition ((_ (eql 'comparison-record)) expr) + (destructuring-bind (name cmp and truth &rest rest) expr + `(make-instance 'comparison-record + :name ',name + :cmp (find-function-record ',cmp) + :and (find-function-record ',and) + :truth ,truth + ,@rest))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Unequal Record + +(defclass unequal-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader unequal-record-name) + (%instruction-set :reader unequal-record-instruction-set) + ;; The binary unequal function. + (%neq + :type instruction-record + :initarg :neq + :initform (required-argument :neq) + :reader unequal-record-neq) + ;; The function for combining the results of some unequals. + (%and + :type function-record + :initarg :and + :initform (required-argument :and) + :reader unequal-record-and) + ;; The truth value returned for an empty unequal. + (%truth + :initarg :truth + :initform (required-argument :truth) + :reader unequal-record-truth))) + +(defun unequal-record-p (x) + (typep x 'unequal-record)) + +(defmethod function-record-result-records ((unequal-record unequal-record)) + (function-record-result-records + (unequal-record-and unequal-record))) + +(defmethod function-record-required-argument-records ((unequal-record unequal-record)) + (list (function-record-rest-argument-record unequal-record))) + +(defmethod function-record-rest-argument-record ((unequal-record unequal-record)) + (first (function-record-required-argument-records (unequal-record-neq unequal-record)))) + +(defmethod decode-record-definition ((_ (eql 'unequal-record)) expr) + (destructuring-bind (name neq and truth &rest rest) expr + `(make-instance 'unequal-record + :name ',name + :neq (find-function-record ',neq) + :and (find-function-record ',and) + :truth ,truth + ,@rest))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; If Record + +(defclass if-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader if-record-name) + (%instruction-set :reader if-record-instruction-set) + ;; The blend instruction used to implement this function + (%blend + :type instruction-record + :initarg :blend + :initform (required-argument :blend) + :reader if-record-blend))) + +(defun if-record-p (x) + (typep x 'if-record)) + +(defmethod function-record-result-records ((if-record if-record)) + (function-record-result-records + (if-record-blend if-record))) + +(defmethod function-record-required-argument-records ((if-record if-record)) + (destructuring-bind (a b mask) + (function-record-required-argument-records (if-record-blend if-record)) + (list mask a b))) + +(defmethod decode-record-definition ((_ (eql 'if-record)) expr) + (destructuring-bind (name blend &rest rest) expr + `(make-instance 'if-record + :name ',name + :blend (find-function-record ',blend) + ,@rest))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Cast Record + +(defclass cast-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader cast-record-name) + (%instruction-set :reader cast-record-instruction-set) + ;; A value record describing the result of the cast. + (%result-record + :type value-record + :initarg :result-record + :initform (required-argument :result-record) + :reader cast-record-result-record + :reader function-record-result-record))) + +(defun cast-record-p (x) + (typep x 'cast-record)) + +(defmethod function-record-result-records ((cast-record cast-record)) + (list (cast-record-result-record cast-record))) + +(defmethod function-record-required-argument-records ((cast-record cast-record)) + (list (find-value-record 'sb-simd::any))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Scalar Cast Record + +(defclass scalar-cast-record (cast-record) + (;; Define aliases for inherited slots. + (%name :reader scalar-cast-record-name) + (%instruction-set :reader scalar-cast-record-instruction-set))) + +(defun scalar-cast-record-p (x) + (typep x 'scalar-cast-record)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; SIMD Cast Record + +(defclass simd-cast-record (cast-record) + (;; Define aliases for inherited slots. + (%name :reader simd-cast-record-name) + (%instruction-set :reader simd-cast-record-instruction-set) + ;; The broadcast instruction used to implement this function + (%broadcast + :type instruction-record + :initarg :broadcast + :initform (required-argument :broadcast) + :reader simd-cast-record-broadcast))) + +(defun simd-cast-record-p (x) + (typep x 'simd-cast-record)) + +(defmethod function-record-result-records ((simd-cast-record simd-cast-record)) + (function-record-result-records + (simd-cast-record-broadcast simd-cast-record))) + +(defmethod function-record-required-argument-records ((simd-cast-record simd-cast-record)) + (list (find-value-record 'sb-simd::any))) + +(defmethod decode-record-definition ((_ (eql 'simd-cast-record)) expr) + (destructuring-bind (name broadcast) expr + `(let ((.broadcast. (find-function-record ',broadcast))) + (make-instance 'simd-cast-record + :name ',name + :result-record (function-record-result-record .broadcast.) + :broadcast .broadcast.)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Reinterpret Cast Record + +(defclass reinterpret-cast-record (function-record) + (;; Define aliases for inherited slots. + (%name :reader reinterpret-cast-record-name) + (%instruction-set :reader reinterpret-cast-record-instruction-set) + (%reinterpreters + :type list + :initarg :reinterpreters + :initform (required-argument :reinterpreters) + :reader reinterpret-cast-record-reinterpreters))) + +(defun reinterpret-cast-record-p (x) + (typep x 'reinterpret-cast-record)) + +(defmethod function-record-result-records ((reinterpret-cast-record reinterpret-cast-record)) + (function-record-result-records + (first + (reinterpret-cast-record-reinterpreters reinterpret-cast-record)))) + +(defmethod function-record-required-argument-records ((reinterpret-cast-record reinterpret-cast-record)) + (list (find-value-record 'sb-simd::any))) + +(defmethod decode-record-definition ((_ (eql 'reinterpret-cast-record)) expr) + (destructuring-bind (name &rest reinterpreters) expr + `(make-instance 'reinterpret-cast-record + :name ',name + :reinterpreters + (list + ,@(loop for reinterpreter in reinterpreters + collect `(find-function-record ',reinterpreter)))))) diff --git a/contrib/sb-simd/code/sb-simd.asd b/contrib/sb-simd/code/sb-simd.asd new file mode 100644 index 0000000000..b419e38197 --- /dev/null +++ b/contrib/sb-simd/code/sb-simd.asd @@ -0,0 +1,50 @@ +(defsystem #:sb-simd + :description "A convenient SIMD interface for SBCL." + :author "Marco Heisig <marco.heisig@fau.de>" + :license "MIT" + + :in-order-to ((test-op (test-op "sb-simd-test-suite"))) + + :serial t + :components + ((:file "packages") + (:file "constants") + (:file "utilities") + (:file "printable") + (:file "cpu-identification") + (:file "instruction-set") + (:file "instruction-set-case") + (:file "record") + (:file "missing-instruction") + (:module "instruction-sets" + :components + ((:file "sb-simd") + (:file "x86-64") + (:file "sse") + (:file "sse2") + (:file "sse3") + (:file "ssse3") + (:file "sse4-1") + (:file "sse4-2") + (:file "avx") + (:file "avx2") + (:file "fma"))) + (:file "define-types") + (:file "define-instruction-vops") + (:file "define-vref-vops") + (:file "define-custom-vops") + (:file "define-vop-functions") + (:file "define-scalar-casts") + (:file "define-fake-vops") + (:file "define-simd-casts") + (:file "define-instructions") + (:file "define-vrefs") + (:file "define-reffers") + (:file "define-arefs") + (:file "define-ifs") + (:file "define-associatives") + (:file "define-reducers") + (:file "define-comparisons") + (:file "define-unequals") + (:file "define-rounders") + (:file "define-modify-macros"))) diff --git a/contrib/sb-simd/code/utilities.lisp b/contrib/sb-simd/code/utilities.lisp new file mode 100644 index 0000000000..bec5a53310 --- /dev/null +++ b/contrib/sb-simd/code/utilities.lisp @@ -0,0 +1,106 @@ +(in-package #:sb-simd-internals) + +;;; Types + +(deftype type-specifier () + '(or symbol cons)) + +(deftype non-nil-symbol () + '(and symbol (not null))) + +(deftype function-name () + '(or non-nil-symbol (cons (eql setf) (cons non-nil-symbol null)))) + +(deftype index () + '(integer + (#.(- (1- array-total-size-limit))) + (#.(1- array-total-size-limit)))) + +;;; Functions + +(defun index+ (&rest indices) + (the index (apply #'+ indices))) + +(define-compiler-macro index+ (&rest indices) + `(the index (+ ,@(loop for index in indices collect `(the index ,index))))) + +(defun index- (index &rest more-indices) + (the index (apply #'- index more-indices))) + +(define-compiler-macro index- (index &rest more-indices) + `(the index (- (the index ,index) ,@(loop for index in more-indices collect `(the index ,index))))) + +(defun index* (&rest indices) + (the index (apply #'* indices))) + +(define-compiler-macro index* (&rest indices) + `(the index (* ,@(loop for index in indices collect `(the index ,index))))) + +(defun ensure-package (name) + (or (find-package name) + (make-package name))) + +(defun mksym (package &rest string-designators) + (intern + (apply #'concatenate 'string (mapcar #'string string-designators)) + package)) + +(defun prefixed-symbols (prefix n &optional (package *package*)) + (loop for index below n + collect + (mksym package prefix (format nil "~D" index)))) + +(declaim (notinline touch)) +(defun touch (&rest arguments &aux value) + (declare (ignore arguments)) + (declare (special value)) + (values-list (loop repeat (random 100) collect value))) + +(defun required-argument (initarg) + (error "Required argument: ~S" initarg)) + +(defun macroexpand-all (form &optional env) + (let ((sb-walker::*walk-form-expand-macros-p* t)) + (sb-walker:walk-form form env))) + +(defun ensure-list (x) + (if (listp x) + x + (list x))) + +(defun lambda-expression-p (x) + (and (listp x) + (> (list-length x) 1) + (eq (first x) 'lambda) + (listp (second x)))) + +(defun parse-function-name (function-name) + (typecase function-name + (non-nil-symbol + (values function-name nil)) + ((cons (eql setf) (cons non-nil-symbol null)) + (values (second function-name) t)) + (otherwise + (error "Not a valid function name: ~S" function-name)))) + +;;; Macros + +(defmacro define-inline (name lambda-list &body body) + `(progn + (declaim (inline ,name)) + (defun ,name ,lambda-list ,@body))) + +(defmacro define-notinline (name lambda-list &body body) + `(progn + (declaim (notinline ,name)) + (defun ,name ,lambda-list ,@body))) + +(defun integer-type-specifier-inclusive-bounds (type-specifier) + (assert (= 2 (length type-specifier))) + (let ((bits (the (integer 1) (second type-specifier)))) + (ecase (first type-specifier) + (unsigned-byte + (values 0 (1- (expt 2 bits)))) + (signed-byte + (values (- (expt 2 (1- bits))) + (1- (expt 2 (1- bits)))))))) diff --git a/contrib/sb-simd/examples/benchmarks.lisp b/contrib/sb-simd/examples/benchmarks.lisp new file mode 100755 index 0000000000..6859206ef9 --- /dev/null +++ b/contrib/sb-simd/examples/benchmarks.lisp @@ -0,0 +1,281 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Benchmarking code +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(asdf:load-system :sb-simd) +(ql:quickload :alexandria :silent t) +(use-package :sb-simd-avx) + +(defmacro time-total (n &body body) + "N-average the execution time of BODY in seconds" + (declare (optimize (speed 0))) + (alexandria:with-gensyms (start end) + `(let (,start ,end) + (sb-ext:gc :full t) + (setf ,start (get-internal-real-time)) + (loop for i below ,n + do ,@body) + (setf ,end (get-internal-real-time)) + (coerce (/ (- ,end ,start) internal-time-units-per-second) + 'float)))) + +(defun simd-sum (array &aux (n (array-total-size array))) + (declare (type f64vec array) + (optimize speed (safety 0))) + (do ((index 0 (the (integer 0 #.(- array-total-size-limit 16)) (+ index 16))) + (acc1 (f64.4 0) (f64.4+ acc1 (f64.4-aref array (+ index 0)))) + (acc2 (f64.4 0) (f64.4+ acc2 (f64.4-aref array (+ index 4)))) + (acc3 (f64.4 0) (f64.4+ acc3 (f64.4-aref array (+ index 8)))) + (acc4 (f64.4 0) (f64.4+ acc4 (f64.4-aref array (+ index 12))))) + ((> index (- n 16)) + (do ((result (multiple-value-call #'+ (f64.4-values (f64.4+ acc1 acc2 acc3 acc4))) + (+ result (row-major-aref array index))) + (index index (1+ index))) + ((>= index n) result))))) + +(defun simd-vdot (array1 array2 &aux (n (min (array-total-size array1) (array-total-size array2)))) + (declare (type f64vec array1 array2) + (optimize speed (safety 0))) + (do ((index 0 (the (integer 0 #.(- array-total-size-limit 16)) (+ index 16))) + (acc1 (f64.4 0) (f64.4-incf acc1 (f64.4* (f64.4-aref array1 (+ index 0)) + (f64.4-aref array2 (+ index 0))))) + (acc2 (f64.4 0) (f64.4-incf acc2 (f64.4* (f64.4-aref array1 (+ index 4)) + (f64.4-aref array2 (+ index 4))))) + (acc3 (f64.4 0) (f64.4-incf acc3 (f64.4* (f64.4-aref array1 (+ index 8)) + (f64.4-aref array2 (+ index 8))))) + (acc4 (f64.4 0) (f64.4-incf acc4 (f64.4* (f64.4-aref array1 (+ index 12)) + (f64.4-aref array2 (+ index 12)))))) + ((> index (- n 16)) + (do ((result (multiple-value-call #'+ (f64.4-values (f64.4+ acc1 acc2 acc3 acc4))) + (+ result (* (row-major-aref array1 index) + (row-major-aref array2 index)))) + (index index (1+ index))) + ((>= index n) result))))) + +;; For some reasons it floating-point-overflows +(defun fma-vdot (array1 array2 &aux (n (min (array-total-size array1) (array-total-size array2)))) + (declare (type f64vec array1 array2) + (optimize speed (safety 0))) + (do ((index 0 (the (integer 0 #.(- array-total-size-limit 16)) (+ index 16))) + (acc1 (f64.4 0) (setf acc1 (sb-simd-avx2:f64.4-fmadd acc1 (f64.4-aref array1 (+ index 0)) + (f64.4-aref array2 (+ index 0))))) + (acc2 (f64.4 0) (setf acc2 (sb-simd-avx2:f64.4-fmadd acc2 (f64.4-aref array1 (+ index 4)) + (f64.4-aref array2 (+ index 4))))) + (acc3 (f64.4 0) (setf acc3 (sb-simd-avx2:f64.4-fmadd acc3 (f64.4-aref array1 (+ index 8)) + (f64.4-aref array2 (+ index 8))))) + (acc4 (f64.4 0) (setf acc4 (sb-simd-avx2:f64.4-fmadd acc4 (f64.4-aref array1 (+ index 12)) + (f64.4-aref array2 (+ index 12)))))) + ((> index (- n 16)) + (do ((result (f64.4-hsum (f64.4+ acc1 acc2 acc3 acc4)) + (+ result (* (row-major-aref array1 index) + (row-major-aref array2 index)))) + (index index (1+ index))) + ((>= index n) result))))) + +(declaim (inline f64.4-fma-vdot)) +(defun f64.4-fma-vdot (array1 array2 &aux (n (min (array-total-size array1) + (array-total-size array2)))) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (type f64vec array1 array2)) + (let ((n0 (- n (mod n 16)))) + (+ (loop with acc1 of-type f64.4 = (f64.4 0) + with acc2 of-type f64.4 = (f64.4 0) + with acc3 of-type f64.4 = (f64.4 0) + with acc4 of-type f64.4 = (f64.4 0) + for i of-type fixnum below n0 by 16 + do (let ((array1-i0 (f64.4-aref array1 (+ i 0))) + (array1-i4 (f64.4-aref array1 (+ i 4))) + (array1-i8 (f64.4-aref array1 (+ i 8))) + (array1-i12 (f64.4-aref array1 (+ i 12)))) + (setf acc1 (sb-simd-avx2:f64.4-fmadd acc1 array1-i0 + (f64.4-aref array2 (+ i 0))) + acc2 (sb-simd-avx2:f64.4-fmadd acc2 array1-i4 + (f64.4-aref array2 (+ i 4))) + acc3 (sb-simd-avx2:f64.4-fmadd acc3 array1-i8 + (f64.4-aref array2 (+ i 8))) + acc4 (sb-simd-avx2:f64.4-fmadd acc4 array1-i12 + (f64.4-aref array2 (+ i 12))))) + finally (return (f64.4-hsum (f64.4+ acc1 acc2 acc3 acc4)))) + (loop for i of-type fixnum from n0 below n + summing (* (aref array1 i) (aref array2 i)) + into sum of-type double-float + finally (return sum))))) + +(defun benchmark-f64.4-vdot-double (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline sb-simd-avx2:f64.4-vdot)) + (loop for len in v-lengths + do (format t "Doing dot product of two ~A long double float vectors 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1d0)) + (alexandria:iota len)))) + (v (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.2d0)) + (alexandria:iota len))))) + (declare (type f64vec u v)) + (time-total 1e6 (sb-simd-avx2::f64.4-vdot u v))))) + +(defun benchmark-f64.4-vdot2-double (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline sb-simd-avx2:f64.4-vdot2)) + (loop for len in v-lengths + do (format t "Doing dot product of two ~A long double float vectors 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1d0)) + (alexandria:iota len)))) + (v (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.2d0)) + (alexandria:iota len))))) + (declare (type f64vec u v)) + (time-total 1e6 (sb-simd-avx2::f64.4-vdot2 u v))))) + +(defun benchmark-f64.4-fma-vdot-double (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline f64.4-fma-vdot)) + (loop for len in v-lengths + do (format t "Doing dot product of two ~A long double float vectors 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1d0)) + (alexandria:iota len)))) + (v (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.2d0)) + (alexandria:iota len))))) + (declare (type f64vec u v)) + (time-total 1e6 (f64.4-fma-vdot u v))))) + +(defun benchmark-simd-vdot-double (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline f64.4-vdot)) + (loop for len in v-lengths + do (format t "Doing dot product of two ~A long double float vectors 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1d0)) + (alexandria:iota len)))) + (v (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.2d0)) + (alexandria:iota len))))) + (declare (type f64vec u v)) + (time-total 1e6 (simd-vdot u v))))) + +(defun benchmark-fma-vdot-double (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline fma-vdot)) + (loop for len in v-lengths + do (format t "Doing dot product of two ~A long double float vectors 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1d0)) + (alexandria:iota len)))) + (v (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.2d0)) + (alexandria:iota len))))) + (declare (type f64vec u v)) + (time-total 1e6 (fma-vdot u v))))) + +(defun benchmark-avx-single (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline f32.8-vdot)) + (loop for len in v-lengths + do (format t "Doing dot product of two ~A long single float vectors 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'single-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1f0)) + (alexandria:iota len)))) + (v (make-array len :element-type 'single-float + :initial-contents + (mapcar (lambda (i) (+ i 0.2f0)) + (alexandria:iota len))))) + (declare (type f32vec u v)) + (time-total 1e6 (f32.8-vdot u v))))) + +(defun benchmark-sse-double (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline f64.2-vdot)) + (loop for len in v-lengths + do (format t "Doing dot product of two ~A long double float vectors 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1d0)) + (alexandria:iota len)))) + (v (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.2d0)) + (alexandria:iota len))))) + (declare (type f32vec u v)) + (time-total 1e6 (f64.2-vdot u v))))) + +(defun benchmark-sse-single (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline f32.4-vdot)) + (loop for len in v-lengths + do (format t "Doing dot product of two ~A long single float vectors 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'single-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1f0)) + (alexandria:iota len)))) + (v (make-array len :element-type 'single-float + :initial-contents + (mapcar (lambda (i) (+ i 0.2f0)) + (alexandria:iota len))))) + (declare (type f32vec u v)) + (time-total 1e6 (f32.4-vdot u v))))) + +(defun benchmark-vsum-double (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline f64.4-vsum)) + (loop for len in v-lengths + do (format t "Doing sum of a ~A long double float vector 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1d0)) + (alexandria:iota len))))) + (declare (type f64vec u)) + (time-total 1e6 (f64.4-vsum u))))) + +(defun benchmark-simd-sum-double (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline simd-sum)) + (loop for len in v-lengths + do (format t "Doing sum of a ~A long double float vector 1e6 times~%" len) + collect (let ((u (make-array len :element-type 'double-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1d0)) + (alexandria:iota len))))) + (declare (type f64vec u)) + (time-total 1e6 (simd-sum u))))) + +(defun benchmark-vsum-single (&rest v-lengths) + (declare (optimize (speed 3) (safety 0) (debug 0)) + (notinline f32.8-vsum)) + (loop for len in v-lengths + do (format t "Doing sum of a ~A long single float vector 1e6 x~%" len) + collect (let ((u (make-array len :element-type 'single-float + :initial-contents + (mapcar (lambda (i) (+ i 0.1f0)) + (alexandria:iota len))))) + (declare (type f32vec u)) + (time-total 1e6 (f32.8-vsum u))))) +#+(or) +(benchmark-f64.4-vdot-double 10 100 200 400 800 1200 2400 4800 9600) +#+(or) +(benchmark-f64.4-vdot2-double 10 100 200 400 800 1200 2400 4800 9600) +#+(or) +(benchmark-avx-single 10 100 200 400 800 1200 2400 4800 9600) +#+(or) +(benchmark-sse-double 10 100 200 400 800 1200 2400 4800 9600) +#+(or) +(benchmark-sse-single 10 100 200 400 800 1200 2400 4800 9600) +#+(or) +(benchmark-vsum-double 10 100 200 400 800 1200 2400 4800 9600) +#+(or) +(benchmark-vsum-single 10 100 200 400 800 1200 2400 4800 9600) +#+(or) +(apply 'benchmark-avx-double (loop for i from 1 to 10 collect (* 1000 i))) diff --git a/contrib/sb-simd/examples/simd-dot.lisp b/contrib/sb-simd/examples/simd-dot.lisp new file mode 100644 index 0000000000..7664aadada --- /dev/null +++ b/contrib/sb-simd/examples/simd-dot.lisp @@ -0,0 +1,20 @@ +(in-package :sb-simd-avx) + +(defun simd-dot (array1 array2 &aux (n (min (array-total-size array1) (array-total-size array2)))) + (declare (type (simple-array double-float 1) array1 array2) + (optimize speed (safety 0))) + (do ((index 0 (the (integer 0 #.(- array-total-size-limit 16)) (+ index 16))) + (acc1 (f64.4 0) (f64.4+ acc1 (f64.4* (f64.4-row-major-aref array1 (+ index 0)) + (f64.4-row-major-aref array2 (+ index 0))))) + (acc2 (f64.4 0) (f64.4+ acc2 (f64.4* (f64.4-row-major-aref array1 (+ index 4)) + (f64.4-row-major-aref array2 (+ index 4))))) + (acc3 (f64.4 0) (f64.4+ acc3 (f64.4* (f64.4-row-major-aref array1 (+ index 8)) + (f64.4-row-major-aref array2 (+ index 8))))) + (acc4 (f64.4 0) (f64.4+ acc4 (f64.4* (f64.4-row-major-aref array1 (+ index 12)) + (f64.4-row-major-aref array2 (+ index 12)))))) + ((>= index (- n 16)) + (do ((result (f64.4-horizontal+ (f64.4+ acc1 acc2 acc3 acc4)) + (+ result (* (row-major-aref array1 index) + (row-major-aref array2 index)))) + (index index (1+ index))) + ((>= index n) result))))) diff --git a/contrib/sb-simd/examples/simd-sum.lisp b/contrib/sb-simd/examples/simd-sum.lisp new file mode 100755 index 0000000000..1a197185d6 --- /dev/null +++ b/contrib/sb-simd/examples/simd-sum.lisp @@ -0,0 +1,15 @@ +(in-package :sb-simd-avx) + +(defun simd-sum (array &aux (n (array-total-size array))) + (declare (type (simple-array double-float (*)) array) + (optimize speed (safety 0))) + (do ((index 0 (the (integer 0 #.(- array-total-size-limit 16)) (+ index 16))) + (acc1 (f64.4 0) (f64.4+ acc1 (f64.4-aref array (+ index 0)))) + (acc2 (f64.4 0) (f64.4+ acc2 (f64.4-aref array (+ index 4)))) + (acc3 (f64.4 0) (f64.4+ acc3 (f64.4-aref array (+ index 8)))) + (acc4 (f64.4 0) (f64.4+ acc4 (f64.4-aref array (+ index 12))))) + ((>= index (- n 16)) + (do ((result (f64.4-horizontal+ (f64.4+ acc1 acc2 acc3 acc4)) + (+ result (row-major-aref array index))) + (index index (1+ index))) + ((>= index n) result))))) diff --git a/contrib/sb-simd/sb-simd.texinfo b/contrib/sb-simd/sb-simd.texinfo new file mode 100644 index 0000000000..2e7acb83e6 --- /dev/null +++ b/contrib/sb-simd/sb-simd.texinfo @@ -0,0 +1,230 @@ +@node sb-simd +@section sb-simd +@cindex SIMD + +The @code{sb-simd} module provides a convenient interface for SIMD +programming in SBCL. It provides one package per SIMD instruction set, +plus functions and macros for querying whether an instruction set is +available and what functions and data types it exports. + +@subsection Data Types + +The central data type in @code{sb-simd} is the SIMD pack. A SIMD pack +is very similar to a specialized vector, except that its length must be +a particular power of two that depends on its element type and the +underlying hardware. The set of element types that are supported for +SIMD packs is similar to that of SBCL's specialized array element types, +except that there is currently no support for SIMD packs of complex +numbers or characters. + +The supported scalar types are @code{f32}, @code{f64}, @code{sN}, and +@code{uN}, where @code{N} is either 8, 16, 32, or 64. These scalar +types are abbreviations for the Common Lisp types @code{single-float}, +@code{double-float}, @code{signed-byte}, and @code{unsigned-byte}, +respectively. For each scalar data type @code{X}, there exists one or +more SIMD data type @code{X.Y} with @code{Y} elements. For example, in +AVX there are two supported SIMD data types with element type +@code{f64}, namely @code{f64.2} (128 bit) and @code{f64.4} (256 bit). + +SIMD packs are regular Common Lisp objects that have a type, a class, +and can be passed as function arguments. The price for this is that +SIMD packs have both a boxed and an unboxed representation. The unboxed +representation of a SIMD pack has zero overhead and fits into a CPU +register, but can only be used within a function and when the compiler +can statically determine the SIMD pack's type. Otherwise, the SIMD pack +is boxed, i.e., spilled to the heap together with its type information. +In practice, boxing of SIMD packs can usually be avoided via inlining, +or by loading and storing them to specialized arrays instead of passing +them around as function arguments. + +@subsection Casts + +For each scalar data type @code{X}, there is a function named @code{X} +that is equivalent to @code{(lambda (v) (coerce v 'X))}. For each SIMD +data type @code{X.Y}, there is a function named @code{X.Y} that ensures +that its argument is of type @code{X.Y}, or, if the argument is a number, +calls the cast function of @code{X} and broadcasts the result. + +All functions provided by @code{sb-simd} (apart from the casts +themselves) implicitly cast each argument to its expected type. So to +add the number five to each single float in a SIMD pack @code{x} of type +@code{f32.8}, it is sufficient to write @code{(f32.8+ x 5)}. We don't +mention this implicit conversion explicitly in the following sections, +so if any function description states that an argument must be of type +@code{X.Y}, the argument can actually be of any type that is a suitable +argument of the cast function named @code{X.Y}. + +@subsection Constructors + +For each SIMD data type @code{X.Y}, there is a constructor named +@code{make-X.Y} that takes @code{Y} arguments of type @code{X} and +returns a SIMD pack whose elements are the supplied values. + +@subsection Unpackers + +For each SIMD data type @code{X.Y}, there is a function named +@code{X.Y-values} that returns, as @code{Y} multiple values, the +elements of the supplied SIMD pack of type @code{X.Y}. + +@subsection Reinterpret Casts + +For each SIMD data type @code{X.Y}, there is a function named +@code{X.Y!} that takes any SIMD pack or scalar datum and interprets its +bits as a SIMD pack of type @code{X.Y}. If the supplied datum has more +bits than the resulting value, the excess bits are discarded. If the +supplied datum has less bits than the resulting value, the missing bits are +assumed to be zero. + +@subsection Associatives + +For each associative binary function, e.g., @code{two-arg-X.Y-OP}, there +is a function @code{X.Y-OP} that takes any number of arguments and +combines them with this binary function in a tree-like fashion. If the +binary function has an identity element, it is possible to call the +function with zero arguments, in which case the identity element is +returned. If there is no identity element, the function must receive at +least one argument. + +Examples of associative functions are @code{f32.8+}, for summing any +number of 256 bit packs of single floats, and @code{u8.32-max}, for +computing the element-wise maximum of one or more 256 bit packs of 8 bit +integers. + +@subsection Reducers + +For binary functions @code{two-arg-X.Y-OP} that are not associative, but +that have a neutral element, there are functions @code{X.Y-OP} that take +any positive number of arguments and return the reduction of all +arguments with the binary function. In the special case of a single +supplied argument, the binary function is invoked on the neutral element +and that argument. Reducers have been introduced to generate Lisp-style +subtraction and division functions. + +Examples of reducers are @code{f32.8/}, for successively dividing a pack +of 32 bit single floats by all further supplied packs of 32 bit single +floats, or @code{u32.8-} for subtracting any number of supplied packs of +32 bit unsigned integers from the first supplied one, except in the case +of a single argument, where @code{u32.8-} simply negates all values in +the pack. + +@subsection Rounding + +For each floating-point SIMD data type @code{X.Y} there are several +functions that round the values of a supplied SIMD pack to nearby +floating-point values whose fractional digits are all zero. Those +functions are @code{X.Y-round}, @code{X.Y-floor}, @code{X.Y-ceiling}, +and @code{X.Y-truncate}, and they have the same semantics as the one +argument versions of @code{cl:round}, @code{cl:floor}, +@code{cl:ceiling}, and @code{cl:truncate}, respectively. + +@subsection Comparisons + +For each SIMD data type @code{X.Y}, there exist conversion functions +@code{X.Y<}, @code{X.Y<=}, @code{X.Y>}, @code{X.Y>=}, and +@code{X.Y=} that check whether the supplied arguments are strictly +monotonically increasing, monotonically increasing, strictly monotonically +decreasing, monotonically decreasing, equal, or nowhere equal, +respectively. In contrast to the Common Lisp functions @code{<}, +@code{<=}, @code{>}, @code{>=}, @code{=}, and @code{/=} the SIMD +comparison functions don't return a generalized boolean, but a SIMD pack of +unsigned integers with @code{Y} elements. The bits of each unsigned +integer are either all one, if the values of the arguments at that position +satisfy the test, or all zero, if they don't. We call a SIMD packs of such +unsigned integers a mask. + +@subsection Conditionals + +The SIMD paradigm is inherently incompatible with fine-grained control +flow. A piece of code containing an @code{if} special form cannot be +vectorized in a straightforward way, because doing so would require as +many instruction pointers and processor states as there are values in +the desired SIMD data type. Instead, most SIMD instruction sets provide +an operator for selecting values from one of two supplied SIMD packs +based on a mask. The mask is a SIMD pack with as many elements as the +other two arguments, but whose elements are unsigned integers whose bits +must be either all zeros or all ones. This selection mechanism can be +used to emulate the effect of an @code{if} special form, at the price +that both operands have to be computed each time. + +In @code{sb-simd}, all conditional operations and comparisons emit +suitable mask fields, and there is a @code{X.Y-if} function for each +SIMD data type with element type @code{X} and number of elements +@code{Y} whose first arguments must be a suitable mask, whose second and +third argument must be objects that can be converted to the SIMD data +type @code{X.Y}, and that returns a value of type @code{X.Y} where each +element is from the second operand if the corresponding mask bits are +set, and from the third operand if the corresponding mask bits are not +set. + +@subsection Loads and Stores + +In practice, a SIMD pack @code{X.Y} is usually not constructed by +calling its constructor, but by loading @code{Y} consecutive elements +from a specialized array with element type @code{X}. The functions for +doing so are called @code{X.Y-aref} and @code{X.Y-row-major-aref}, and +have similar semantics as Common Lisp's @code{aref} and +@code{row-major-aref}. In addition to that, some instruction sets +provide the functions @code{X.Y-non-temporal-aref} and +@code{X.Y-non-temporal-row-major-aref}, for accessing a memory location +without loading the referenced values into the CPU's cache. + +For each function @code{X.Y-foo} for loading SIMD packs from an array, +there also exists a corresponding function @code{(setf X.Y-foo)} for +storing a SIMD pack in the specified memory location. An exception to +this rule is that some instruction sets (e.g., SSE) only provide +functions for non-temporal stores, but not for the corresponding +non-temporal loads. + +One difficulty when treating the data of a Common Lisp array as a SIMD +pack is that some hardware instructions require a particular alignment +of the address being referenced. Luckily, most architectures provide +instructions for unaligned loads and stores that are, at least on modern +CPUs, not slower than their aligned equivalents. So by default we +translate all array references as unaligned loads and stores. An +exception are the instructions for non-temporal loads and stores, that +always require a certain alignment. We do not handle this case +specially, so without special handling by the user, non-temporal loads +and stores will only work on certain array indices that depend on the +actual placement of that array in memory. + +@subsection Specialized Scalar Operations + +Finally, for each SIMD function @code{X.Y-OP} that applies a certain +operation @code{OP} element-wise to the @code{Y} elements of type +@code{X}, there exists also a functions @code{X-OP} for applying that +operation only to a single element. For example, the SIMD function +@code{f64.4+} has a corresponding function @code{f64+} that differs from +@code{cl:+} in that it only accepts arguments of type double float, and +that it adds its supplied arguments in a fixed order that is the same as +the one used by @code{f64.4}. + +There are good reasons for exporting scalar functions from a SIMD +library, too. The most obvious one is that they obey the same naming +convention and hence make it easier to locate the correct functions. +Another benefit is that the semantics of each scalar operation is +precisely the same as that of the corresponding SIMD function, so they +can be used to write reference implementations for testing. A final +reason is that these scalar functions can be used to simplify the life +of tools for automatic vectorization. + +@subsection Instruction Set Dispatch + +One challenge that is unique to image-based programming systems such as +Lisp is that a program can run on one machine, be dumped as an image, +and then resumed on another machine. While nobody expects this feature +to work across machines with different architectures, it is quite likely +that the machine where the image is dumped and the one where execution +is resumed provide different instruction set extensions. + +As a practical example, consider a game developer that develops software +on an x86-64 machine with all SIMD extensions up to AVX2, but then dumps +it as an image and ships it to a customer whose machine only supports +SIMD extensions up to SSE2. Ideally, the image should contain multiple +optimized versions of all crucial functions, and dynamically select the +most appropriate version based on the instruction set extensions that +are actually available. + +This kind of run time instruction set dispatch is explicitly supported +by means of the @code{instruction-set-case} macro. The code resulting +from an invocation of this macro compiles to an efficient jump table +whose index is recomputed on each startup of the Lisp image. diff --git a/contrib/sb-simd/test-suite/numbers.lisp b/contrib/sb-simd/test-suite/numbers.lisp new file mode 100644 index 0000000000..93dabca7ee --- /dev/null +++ b/contrib/sb-simd/test-suite/numbers.lisp @@ -0,0 +1,28 @@ +(in-package #:sb-simd-test-suite) + +(defparameter *numbers* + (remove-duplicates + `(,most-positive-double-float + ,most-negative-double-float + ,least-positive-normalized-double-float + ,least-negative-normalized-double-float + ,least-positive-double-float + ,least-negative-double-float + ,most-positive-single-float + ,most-negative-single-float + ,least-positive-normalized-single-float + ,least-negative-normalized-single-float + ,least-positive-single-float + ,least-negative-single-float + ,@(loop for type in '(single-float double-float integer) + append (loop for i from 0 to 64 + for n = (expt 2 i) + collect (coerce n type) + collect (coerce (- n) type) + collect (coerce (1- n) type) + collect (coerce (1+ n) type) + collect (coerce (1- (- n)) type) + collect (coerce (1+ (- n)) type)))))) + +(defun numbers-of-type (type) + (remove-if-not (lambda (x) (typep x type)) *numbers*)) diff --git a/contrib/sb-simd/test-suite/packages.lisp b/contrib/sb-simd/test-suite/packages.lisp new file mode 100644 index 0000000000..e589ebd8f3 --- /dev/null +++ b/contrib/sb-simd/test-suite/packages.lisp @@ -0,0 +1,15 @@ +(cl:in-package #:common-lisp-user) + +(defpackage #:sb-simd-test-suite + (:use #:common-lisp #:sb-simd-internals) + (:export + #:run-test-suite + #:define-test + #:is + #:signals + #:all-tests + #:check-package + #:run-tests + #:define-simple-simd-test + #:define-horizontal-test + #:define-aref-test)) diff --git a/contrib/sb-simd/test-suite/sb-simd-test-suite.asd b/contrib/sb-simd/test-suite/sb-simd-test-suite.asd new file mode 100644 index 0000000000..53133f6b18 --- /dev/null +++ b/contrib/sb-simd/test-suite/sb-simd-test-suite.asd @@ -0,0 +1,21 @@ +(defsystem "sb-simd-test-suite" + :description "The sb-simd test suite." + :author "Marco Heisig <marco.heisig@fau.de>" + :license "MIT" + + :depends-on ("sb-simd") + + :perform + (test-op (o c) (symbol-call '#:sb-simd-test-suite '#:run-test-suite)) + + :serial t + :components + ((:file "packages") + (:file "numbers") + (:file "utilities") + (:file "test-suite") + (:file "test-arefs") + (:file "test-simple-simd-functions") + (:file "test-horizontal-functions") + (:file "test-hairy-simd-functions") + (:file "test-packages"))) diff --git a/contrib/sb-simd/test-suite/test-arefs.lisp b/contrib/sb-simd/test-suite/test-arefs.lisp new file mode 100644 index 0000000000..7f1926997b --- /dev/null +++ b/contrib/sb-simd/test-suite/test-arefs.lisp @@ -0,0 +1,92 @@ +(in-package #:sb-simd-test-suite) + +(defmacro define-aref-test (aref element-type simd-width &optional (unpacker 'identity)) + (let ((value-symbols (prefixed-symbols "V" simd-width)) + (zero (coerce 0 element-type)) + (one (coerce 1 element-type))) + `(define-test ,aref + ;; Create an array of zeros and successively replace zeros with + ;; ones. After each replacement, check whether a load still + ;; produces the expected result. + (let ((array (make-array '(,simd-width) + :element-type ',element-type + :initial-element ,zero))) + (multiple-value-bind ,value-symbols (,unpacker (,aref array 0)) + ,@(loop for value-symbol in value-symbols + collect `(is (= ,value-symbol ,zero)))) + (loop for index below ,simd-width do + (setf (aref array index) ,one) + (loop for number in (multiple-value-list (,unpacker (,aref array 0))) + for position from 0 + do (if (<= position index) + (is (= number ,one)) + (is (= number ,zero)))))) + ;; Create an array with twice as many elements as the width of the + ;; SIMD data type, and whose lower half consists of all zeros and + ;; whose upper half consists of all ones. Check that all valid + ;; loads from this array have the expected state. + (let ((array (make-array '(,(* 2 simd-width)) + :element-type ',element-type + :initial-contents + (append (make-list ,simd-width :initial-element ,zero) + (make-list ,simd-width :initial-element ,one))))) + (loop for index below ,simd-width do + (multiple-value-bind ,value-symbols + (,unpacker (,aref array index)) + ,@(loop for value-symbol in value-symbols + for position from 0 + collect `(if (< (+ ,position index) ,simd-width) + (is (= ,value-symbol ,zero)) + (is (= ,value-symbol ,one)))))))))) + +(in-package #:sb-simd) + +(sb-simd-test-suite:define-aref-test u8-aref (unsigned-byte 8) 1) +(sb-simd-test-suite:define-aref-test u16-aref (unsigned-byte 16) 1) +(sb-simd-test-suite:define-aref-test u32-aref (unsigned-byte 32) 1) +(sb-simd-test-suite:define-aref-test u64-aref (unsigned-byte 64) 1) +(sb-simd-test-suite:define-aref-test s8-aref (signed-byte 8) 1) +(sb-simd-test-suite:define-aref-test s16-aref (signed-byte 16) 1) +(sb-simd-test-suite:define-aref-test s32-aref (signed-byte 32) 1) +(sb-simd-test-suite:define-aref-test s64-aref (signed-byte 64) 1) +(sb-simd-test-suite:define-aref-test f32-aref single-float 1) +(sb-simd-test-suite:define-aref-test f64-aref double-float 1) + +(in-package #:sb-simd-sse) + +(sb-simd-test-suite:define-aref-test f32.4-aref single-float 4 f32.4-values) + +(in-package #:sb-simd-sse2) + +(sb-simd-test-suite:define-aref-test f64.2-aref double-float 2 f64.2-values) +(sb-simd-test-suite:define-aref-test u8.16-aref (unsigned-byte 8) 16 u8.16-values) +(sb-simd-test-suite:define-aref-test u16.8-aref (unsigned-byte 16) 8 u16.8-values) +(sb-simd-test-suite:define-aref-test u32.4-aref (unsigned-byte 32) 4 u32.4-values) +(sb-simd-test-suite:define-aref-test u64.2-aref (unsigned-byte 64) 2 u64.2-values) +(sb-simd-test-suite:define-aref-test s8.16-aref (signed-byte 8) 16 s8.16-values) +(sb-simd-test-suite:define-aref-test s16.8-aref (signed-byte 16) 8 s16.8-values) +(sb-simd-test-suite:define-aref-test s32.4-aref (signed-byte 32) 4 s32.4-values) +(sb-simd-test-suite:define-aref-test s64.2-aref (signed-byte 64) 2 s64.2-values) + +(in-package #:sb-simd-avx) + +(sb-simd-test-suite:define-aref-test f32.4-aref single-float 4 f32.4-values) +(sb-simd-test-suite:define-aref-test f32.8-aref single-float 8 f32.8-values) +(sb-simd-test-suite:define-aref-test f64.2-aref double-float 2 f64.2-values) +(sb-simd-test-suite:define-aref-test f64.4-aref double-float 4 f64.4-values) +(sb-simd-test-suite:define-aref-test u8.16-aref (unsigned-byte 8) 16 u8.16-values) +(sb-simd-test-suite:define-aref-test u16.8-aref (unsigned-byte 16) 8 u16.8-values) +(sb-simd-test-suite:define-aref-test u32.4-aref (unsigned-byte 32) 4 u32.4-values) +(sb-simd-test-suite:define-aref-test u64.2-aref (unsigned-byte 64) 2 u64.2-values) +(sb-simd-test-suite:define-aref-test s8.16-aref (signed-byte 8) 16 s8.16-values) +(sb-simd-test-suite:define-aref-test s16.8-aref (signed-byte 16) 8 s16.8-values) +(sb-simd-test-suite:define-aref-test s32.4-aref (signed-byte 32) 4 s32.4-values) +(sb-simd-test-suite:define-aref-test s64.2-aref (signed-byte 64) 2 s64.2-values) +(sb-simd-test-suite:define-aref-test u8.32-aref (unsigned-byte 8) 32 u8.32-values) +(sb-simd-test-suite:define-aref-test u16.16-aref (unsigned-byte 16) 16 u16.16-values) +(sb-simd-test-suite:define-aref-test u32.8-aref (unsigned-byte 32) 8 u32.8-values) +(sb-simd-test-suite:define-aref-test u64.4-aref (unsigned-byte 64) 4 u64.4-values) +(sb-simd-test-suite:define-aref-test s8.32-aref (signed-byte 8) 32 s8.32-values) +(sb-simd-test-suite:define-aref-test s16.16-aref (signed-byte 16) 16 s16.16-values) +(sb-simd-test-suite:define-aref-test s32.8-aref (signed-byte 32) 8 s32.8-values) +(sb-simd-test-suite:define-aref-test s64.4-aref (signed-byte 64) 4 s64.4-values) diff --git a/contrib/sb-simd/test-suite/test-hairy-simd-functions.lisp b/contrib/sb-simd/test-suite/test-hairy-simd-functions.lisp new file mode 100644 index 0000000000..24e36c71b7 --- /dev/null +++ b/contrib/sb-simd/test-suite/test-hairy-simd-functions.lisp @@ -0,0 +1,9 @@ +(in-package #:sb-simd-test-suite) + +(in-package #:sb-simd-sse) + +(in-package #:sb-simd-sse2) + +(in-package #:sb-simd-avx) + +(in-package #:sb-simd-avx2) diff --git a/contrib/sb-simd/test-suite/test-horizontal-functions.lisp b/contrib/sb-simd/test-suite/test-horizontal-functions.lisp new file mode 100644 index 0000000000..3557e38d06 --- /dev/null +++ b/contrib/sb-simd/test-suite/test-horizontal-functions.lisp @@ -0,0 +1,76 @@ +(in-package #:sb-simd-test-suite) + +(defmacro define-horizontal-test (horizontal-fn scalar-fn) + (let* ((horizontal-record (find-function-record horizontal-fn)) + (scalar-record (find-function-record scalar-fn)) + (argument-record (first (function-record-required-argument-records horizontal-record))) + (result-record (function-record-result-record horizontal-record)) + (width (value-record-simd-width argument-record)) + (args (loop repeat width collect (gensym))) + (pack (third (simd-info (value-record-name argument-record))))) + (assert (eq (function-record-result-record scalar-record) result-record)) + `(define-test ,horizontal-fn + (let ((generator (find-generator ',(value-record-name result-record)))) + (loop repeat 99 do + (let ,(loop for arg in args collect `(,arg (funcall generator))) + (handler-case + (assert (bitwise= (,horizontal-fn (,pack ,@args)) + (,scalar-fn ,@args))) + (floating-point-overflow ()) + (floating-point-overflow ())))))))) + +(in-package #:sb-simd-sse) + +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-and f32-and) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-or f32-or) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-xor f32-xor) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-max f32-max) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-min f32-min) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal+ f32+) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal* f32*) + +(in-package #:sb-simd-sse2) + +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-and f64-and) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-or f64-or) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-xor f64-xor) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-max f64-max) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-min f64-min) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal+ f64+) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal* f64*) + +(in-package #:sb-simd-avx) + +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-and f32-and) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-or f32-or) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-xor f32-xor) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-max f32-max) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal-min f32-min) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal+ f32+) +(sb-simd-test-suite:define-horizontal-test f32.4-horizontal* f32*) + +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-and f64-and) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-or f64-or) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-xor f64-xor) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-max f64-max) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal-min f64-min) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal+ f64+) +(sb-simd-test-suite:define-horizontal-test f64.2-horizontal* f64*) + +(sb-simd-test-suite:define-horizontal-test f32.8-horizontal-and f32-and) +(sb-simd-test-suite:define-horizontal-test f32.8-horizontal-or f32-or) +(sb-simd-test-suite:define-horizontal-test f32.8-horizontal-xor f32-xor) +(sb-simd-test-suite:define-horizontal-test f32.8-horizontal-max f32-max) +(sb-simd-test-suite:define-horizontal-test f32.8-horizontal-min f32-min) +(sb-simd-test-suite:define-horizontal-test f32.8-horizontal+ f32+) +(sb-simd-test-suite:define-horizontal-test f32.8-horizontal* f32*) + +(sb-simd-test-suite:define-horizontal-test f64.4-horizontal-and f64-and) +(sb-simd-test-suite:define-horizontal-test f64.4-horizontal-or f64-or) +(sb-simd-test-suite:define-horizontal-test f64.4-horizontal-xor f64-xor) +(sb-simd-test-suite:define-horizontal-test f64.4-horizontal-max f64-max) +(sb-simd-test-suite:define-horizontal-test f64.4-horizontal-min f64-min) +(sb-simd-test-suite:define-horizontal-test f64.4-horizontal+ f64+) +(sb-simd-test-suite:define-horizontal-test f64.4-horizontal* f64*) + +(in-package #:sb-simd-avx2) diff --git a/contrib/sb-simd/test-suite/test-packages.lisp b/contrib/sb-simd/test-suite/test-packages.lisp new file mode 100644 index 0000000000..13f475db9e --- /dev/null +++ b/contrib/sb-simd/test-suite/test-packages.lisp @@ -0,0 +1,16 @@ +(in-package #:sb-simd-test-suite) + +(define-test packages) + +(define-test packages + (check-package '#:sb-simd-internals) + (check-package '#:sb-simd) + (check-package '#:sb-simd-x86-64) + (check-package '#:sb-simd-sse) + (check-package '#:sb-simd-sse2) + (check-package '#:sb-simd-sse3) + (check-package '#:sb-simd-ssse3) + (check-package '#:sb-simd-sse4.1) + (check-package '#:sb-simd-sse4.2) + (check-package '#:sb-simd-avx) + (check-package '#:sb-simd-avx2)) diff --git a/contrib/sb-simd/test-suite/test-simple-simd-functions.lisp b/contrib/sb-simd/test-suite/test-simple-simd-functions.lisp new file mode 100644 index 0000000000..9cbbd5b032 --- /dev/null +++ b/contrib/sb-simd/test-suite/test-simple-simd-functions.lisp @@ -0,0 +1,543 @@ +(in-package #:sb-simd-test-suite) + +(defmacro define-simple-simd-test (simd-foo result-types argtypes foo) + `(define-test ,simd-foo + ,@(loop for argtype-variant in (argtypes-variants argtypes) + collect `(test-simple-simd-function ,simd-foo ,result-types ,argtype-variant ,foo)))) + +(defmacro test-simple-simd-function (simd-foo result-types simplified-argtypes foo) + (let* ((result-infos (mapcar #'simd-info result-types)) + (argument-infos (mapcar #'simd-info simplified-argtypes)) + (argument-symbols (prefixed-symbols "ARGUMENT-" (length argument-infos))) + (result-symbols (prefixed-symbols "RESULT-" (length result-infos))) + (output-symbols (prefixed-symbols "OUTPUT-" (length result-infos))) + (simd-width (the integer (second (first result-infos))))) + (assert (apply #'= (append (mapcar #'second result-infos) (mapcar #'second argument-infos)))) + `(loop repeat ,(min (expt 99 (length argument-infos)) 10000) do + (multiple-value-bind (inputs outputs) + (find-valid-simd-call + (lambda ,argument-symbols + (declare ,@(loop for argument-symbol in argument-symbols + for argument-type in (mapcar #'first argument-infos) + collect `(type ,argument-type ,argument-symbol))) + (,foo ,@argument-symbols)) + ',(mapcar #'find-generator (mapcar #'first argument-infos)) + ,simd-width + ',(mapcar #'third argument-infos) + ',(mapcar #'third result-infos)) + (destructuring-bind ,argument-symbols inputs + (destructuring-bind ,output-symbols outputs + (multiple-value-bind ,result-symbols (,simd-foo ,@argument-symbols) + ,@(loop for result-type in result-types + for result-symbol in result-symbols + for output-symbol in output-symbols + collect + `(is (simd= ,result-symbol ,output-symbol)))))))))) + +(in-package #:sb-simd-sse) + +(sb-simd-test-suite:define-simple-simd-test f32.4-and (f32.4) (&rest f32.4) f32-and) +(sb-simd-test-suite:define-simple-simd-test f32.4-or (f32.4) (&rest f32.4) f32-or) +(sb-simd-test-suite:define-simple-simd-test f32.4-xor (f32.4) (&rest f32.4) f32-xor) +(sb-simd-test-suite:define-simple-simd-test f32.4-andc1 (f32.4) (f32.4 f32.4) f32-andc1) +(sb-simd-test-suite:define-simple-simd-test f32.4-not (f32.4) (f32.4) f32-not) +(sb-simd-test-suite:define-simple-simd-test f32.4-max (f32.4) (f32.4 &rest f32.4) f32-max) +(sb-simd-test-suite:define-simple-simd-test f32.4-min (f32.4) (f32.4 &rest f32.4) f32-min) +(sb-simd-test-suite:define-simple-simd-test f32.4+ (f32.4) (&rest f32.4) f32+) +(sb-simd-test-suite:define-simple-simd-test f32.4- (f32.4) (f32.4 &rest f32.4) f32-) +(sb-simd-test-suite:define-simple-simd-test f32.4* (f32.4) (&rest f32.4) f32*) +(sb-simd-test-suite:define-simple-simd-test f32.4/ (f32.4) (f32.4 &rest f32.4) f32/) + +(in-package #:sb-simd-sse2) + +(sb-simd-test-suite:define-simple-simd-test f32.4= (u32.4) (f32.4 &rest f32.4) f32=) +(sb-simd-test-suite:define-simple-simd-test f32.4/= (u32.4) (f32.4 &rest f32.4) f32/=) +(sb-simd-test-suite:define-simple-simd-test f32.4< (u32.4) (f32.4 &rest f32.4) f32<) +(sb-simd-test-suite:define-simple-simd-test f32.4<= (u32.4) (f32.4 &rest f32.4) f32<=) +(sb-simd-test-suite:define-simple-simd-test f32.4> (u32.4) (f32.4 &rest f32.4) f32>) +(sb-simd-test-suite:define-simple-simd-test f32.4>= (u32.4) (f32.4 &rest f32.4) f32>=) + +(sb-simd-test-suite:define-simple-simd-test f64.2-and (f64.2) (&rest f64.2) f64-and) +(sb-simd-test-suite:define-simple-simd-test f64.2-or (f64.2) (&rest f64.2) f64-or) +(sb-simd-test-suite:define-simple-simd-test f64.2-xor (f64.2) (&rest f64.2) f64-xor) +(sb-simd-test-suite:define-simple-simd-test f64.2-andc1 (f64.2) (f64.2 f64.2) f64-andc1) +(sb-simd-test-suite:define-simple-simd-test f64.2-not (f64.2) (f64.2) f64-not) +(sb-simd-test-suite:define-simple-simd-test f64.2-max (f64.2) (f64.2 &rest f64.2) f64-max) +(sb-simd-test-suite:define-simple-simd-test f64.2-min (f64.2) (f64.2 &rest f64.2) f64-min) +(sb-simd-test-suite:define-simple-simd-test f64.2+ (f64.2) (&rest f64.2) f64+) +(sb-simd-test-suite:define-simple-simd-test f64.2- (f64.2) (f64.2 &rest f64.2) f64-) +(sb-simd-test-suite:define-simple-simd-test f64.2* (f64.2) (&rest f64.2) f64*) +(sb-simd-test-suite:define-simple-simd-test f64.2/ (f64.2) (f64.2 &rest f64.2) f64/) +(sb-simd-test-suite:define-simple-simd-test f64.2= (u64.2) (f64.2 &rest f64.2) f64=) +(sb-simd-test-suite:define-simple-simd-test f64.2/= (u64.2) (f64.2 &rest f64.2) f64/=) +(sb-simd-test-suite:define-simple-simd-test f64.2< (u64.2) (f64.2 &rest f64.2) f64<) +(sb-simd-test-suite:define-simple-simd-test f64.2<= (u64.2) (f64.2 &rest f64.2) f64<=) +(sb-simd-test-suite:define-simple-simd-test f64.2> (u64.2) (f64.2 &rest f64.2) f64>) +(sb-simd-test-suite:define-simple-simd-test f64.2>= (u64.2) (f64.2 &rest f64.2) f64>=) + +(sb-simd-test-suite:define-simple-simd-test u8.16-and (u8.16) (&rest u8.16) u8-and) +(sb-simd-test-suite:define-simple-simd-test u8.16-or (u8.16) (&rest u8.16) u8-or) +(sb-simd-test-suite:define-simple-simd-test u8.16-xor (u8.16) (&rest u8.16) u8-xor) +(sb-simd-test-suite:define-simple-simd-test u8.16-andc1 (u8.16) (u8.16 u8.16) u8-andc1) +(sb-simd-test-suite:define-simple-simd-test u8.16-not (u8.16) (u8.16) u8-not) +(sb-simd-test-suite:define-simple-simd-test u8.16+ (u8.16) (&rest u8.16) u8+) +(sb-simd-test-suite:define-simple-simd-test u8.16- (u8.16) (u8.16 &rest u8.16) u8-) +(sb-simd-test-suite:define-simple-simd-test u8.16= (u8.16) (u8.16 &rest u8.16) u8=) +(sb-simd-test-suite:define-simple-simd-test u8.16/= (u8.16) (u8.16 &rest u8.16) u8/=) +(sb-simd-test-suite:define-simple-simd-test u8.16< (u8.16) (u8.16 &rest u8.16) u8<) +(sb-simd-test-suite:define-simple-simd-test u8.16<= (u8.16) (u8.16 &rest u8.16) u8<=) +(sb-simd-test-suite:define-simple-simd-test u8.16> (u8.16) (u8.16 &rest u8.16) u8>) +(sb-simd-test-suite:define-simple-simd-test u8.16>= (u8.16) (u8.16 &rest u8.16) u8>=) + +(sb-simd-test-suite:define-simple-simd-test u16.8-and (u16.8) (&rest u16.8) u16-and) +(sb-simd-test-suite:define-simple-simd-test u16.8-or (u16.8) (&rest u16.8) u16-or) +(sb-simd-test-suite:define-simple-simd-test u16.8-xor (u16.8) (&rest u16.8) u16-xor) +(sb-simd-test-suite:define-simple-simd-test u16.8-andc1 (u16.8) (u16.8 u16.8) u16-andc1) +(sb-simd-test-suite:define-simple-simd-test u16.8-not (u16.8) (u16.8) u16-not) +(sb-simd-test-suite:define-simple-simd-test u16.8+ (u16.8) (&rest u16.8) u16+) +(sb-simd-test-suite:define-simple-simd-test u16.8- (u16.8) (u16.8 &rest u16.8) u16-) +(sb-simd-test-suite:define-simple-simd-test u16.8= (u16.8) (u16.8 &rest u16.8) u16=) +(sb-simd-test-suite:define-simple-simd-test u16.8/= (u16.8) (u16.8 &rest u16.8) u16/=) +(sb-simd-test-suite:define-simple-simd-test u16.8< (u16.8) (u16.8 &rest u16.8) u16<) +(sb-simd-test-suite:define-simple-simd-test u16.8<= (u16.8) (u16.8 &rest u16.8) u16<=) +(sb-simd-test-suite:define-simple-simd-test u16.8> (u16.8) (u16.8 &rest u16.8) u16>) +(sb-simd-test-suite:define-simple-simd-test u16.8>= (u16.8) (u16.8 &rest u16.8) u16>=) + +(sb-simd-test-suite:define-simple-simd-test u32.4-and (u32.4) (&rest u32.4) u32-and) +(sb-simd-test-suite:define-simple-simd-test u32.4-or (u32.4) (&rest u32.4) u32-or) +(sb-simd-test-suite:define-simple-simd-test u32.4-xor (u32.4) (&rest u32.4) u32-xor) +(sb-simd-test-suite:define-simple-simd-test u32.4-andc1 (u32.4) (u32.4 u32.4) u32-andc1) +(sb-simd-test-suite:define-simple-simd-test u32.4-not (u32.4) (u32.4) u32-not) +(sb-simd-test-suite:define-simple-simd-test u32.4+ (u32.4) (&rest u32.4) u32+) +(sb-simd-test-suite:define-simple-simd-test u32.4- (u32.4) (u32.4 &rest u32.4) u32-) +(sb-simd-test-suite:define-simple-simd-test u32.4= (u32.4) (u32.4 &rest u32.4) u32=) +(sb-simd-test-suite:define-simple-simd-test u32.4/= (u32.4) (u32.4 &rest u32.4) u32/=) +(sb-simd-test-suite:define-simple-simd-test u32.4< (u32.4) (u32.4 &rest u32.4) u32<) +(sb-simd-test-suite:define-simple-simd-test u32.4<= (u32.4) (u32.4 &rest u32.4) u32<=) +(sb-simd-test-suite:define-simple-simd-test u32.4> (u32.4) (u32.4 &rest u32.4) u32>) +(sb-simd-test-suite:define-simple-simd-test u32.4>= (u32.4) (u32.4 &rest u32.4) u32>=) + +(sb-simd-test-suite:define-simple-simd-test u64.2-and (u64.2) (&rest u64.2) u64-and) +(sb-simd-test-suite:define-simple-simd-test u64.2-or (u64.2) (&rest u64.2) u64-or) +(sb-simd-test-suite:define-simple-simd-test u64.2-xor (u64.2) (&rest u64.2) u64-xor) +(sb-simd-test-suite:define-simple-simd-test u64.2-andc1 (u64.2) (u64.2 u64.2) u64-andc1) +(sb-simd-test-suite:define-simple-simd-test u64.2-not (u64.2) (u64.2) u64-not) +(sb-simd-test-suite:define-simple-simd-test u64.2+ (u64.2) (&rest u64.2) u64+) +(sb-simd-test-suite:define-simple-simd-test u64.2- (u64.2) (u64.2 &rest u64.2) u64-) + +(sb-simd-test-suite:define-simple-simd-test s8.16-and (s8.16) (&rest s8.16) s8-and) +(sb-simd-test-suite:define-simple-simd-test s8.16-or (s8.16) (&rest s8.16) s8-or) +(sb-simd-test-suite:define-simple-simd-test s8.16-xor (s8.16) (&rest s8.16) s8-xor) +(sb-simd-test-suite:define-simple-simd-test s8.16-andc1 (s8.16) (s8.16 s8.16) s8-andc1) +(sb-simd-test-suite:define-simple-simd-test s8.16-not (s8.16) (s8.16) s8-not) +(sb-simd-test-suite:define-simple-simd-test s8.16+ (s8.16) (&rest s8.16) s8+) +(sb-simd-test-suite:define-simple-simd-test s8.16- (s8.16) (s8.16 &rest s8.16) s8-) +(sb-simd-test-suite:define-simple-simd-test s8.16= (u8.16) (s8.16 &rest s8.16) s8=) +(sb-simd-test-suite:define-simple-simd-test s8.16/= (u8.16) (s8.16 &rest s8.16) s8/=) +(sb-simd-test-suite:define-simple-simd-test s8.16< (u8.16) (s8.16 &rest s8.16) s8<) +(sb-simd-test-suite:define-simple-simd-test s8.16<= (u8.16) (s8.16 &rest s8.16) s8<=) +(sb-simd-test-suite:define-simple-simd-test s8.16> (u8.16) (s8.16 &rest s8.16) s8>) +(sb-simd-test-suite:define-simple-simd-test s8.16>= (u8.16) (s8.16 &rest s8.16) s8>=) + +(sb-simd-test-suite:define-simple-simd-test s16.8-and (s16.8) (&rest s16.8) s16-and) +(sb-simd-test-suite:define-simple-simd-test s16.8-or (s16.8) (&rest s16.8) s16-or) +(sb-simd-test-suite:define-simple-simd-test s16.8-xor (s16.8) (&rest s16.8) s16-xor) +(sb-simd-test-suite:define-simple-simd-test s16.8-andc1 (s16.8) (s16.8 s16.8) s16-andc1) +(sb-simd-test-suite:define-simple-simd-test s16.8-not (s16.8) (s16.8) s16-not) +(sb-simd-test-suite:define-simple-simd-test s16.8+ (s16.8) (&rest s16.8) s16+) +(sb-simd-test-suite:define-simple-simd-test s16.8- (s16.8) (s16.8 &rest s16.8) s16-) +(sb-simd-test-suite:define-simple-simd-test s16.8= (u16.8) (s16.8 &rest s16.8) s16=) +(sb-simd-test-suite:define-simple-simd-test s16.8/= (u16.8) (s16.8 &rest s16.8) s16/=) +(sb-simd-test-suite:define-simple-simd-test s16.8< (u16.8) (s16.8 &rest s16.8) s16<) +(sb-simd-test-suite:define-simple-simd-test s16.8<= (u16.8) (s16.8 &rest s16.8) s16<=) +(sb-simd-test-suite:define-simple-simd-test s16.8> (u16.8) (s16.8 &rest s16.8) s16>) +(sb-simd-test-suite:define-simple-simd-test s16.8>= (u16.8) (s16.8 &rest s16.8) s16>=) + +(sb-simd-test-suite:define-simple-simd-test s32.4-and (s32.4) (&rest s32.4) s32-and) +(sb-simd-test-suite:define-simple-simd-test s32.4-or (s32.4) (&rest s32.4) s32-or) +(sb-simd-test-suite:define-simple-simd-test s32.4-xor (s32.4) (&rest s32.4) s32-xor) +(sb-simd-test-suite:define-simple-simd-test s32.4-andc1 (s32.4) (s32.4 s32.4) s32-andc1) +(sb-simd-test-suite:define-simple-simd-test s32.4-not (s32.4) (s32.4) s32-not) +(sb-simd-test-suite:define-simple-simd-test s32.4+ (s32.4) (&rest s32.4) s32+) +(sb-simd-test-suite:define-simple-simd-test s32.4- (s32.4) (s32.4 &rest s32.4) s32-) +(sb-simd-test-suite:define-simple-simd-test s32.4= (u32.4) (s32.4 &rest s32.4) s32=) +(sb-simd-test-suite:define-simple-simd-test s32.4/= (u32.4) (s32.4 &rest s32.4) s32/=) +(sb-simd-test-suite:define-simple-simd-test s32.4< (u32.4) (s32.4 &rest s32.4) s32<) +(sb-simd-test-suite:define-simple-simd-test s32.4<= (u32.4) (s32.4 &rest s32.4) s32<=) +(sb-simd-test-suite:define-simple-simd-test s32.4> (u32.4) (s32.4 &rest s32.4) s32>) +(sb-simd-test-suite:define-simple-simd-test s32.4>= (u32.4) (s32.4 &rest s32.4) s32>=) + +(sb-simd-test-suite:define-simple-simd-test s64.2-and (s64.2) (&rest s64.2) s64-and) +(sb-simd-test-suite:define-simple-simd-test s64.2-or (s64.2) (&rest s64.2) s64-or) +(sb-simd-test-suite:define-simple-simd-test s64.2-xor (s64.2) (&rest s64.2) s64-xor) +(sb-simd-test-suite:define-simple-simd-test s64.2-andc1 (s64.2) (s64.2 s64.2) s64-andc1) +(sb-simd-test-suite:define-simple-simd-test s64.2-not (s64.2) (s64.2) s64-not) +(sb-simd-test-suite:define-simple-simd-test s64.2+ (s64.2) (&rest s64.2) s64+) +(sb-simd-test-suite:define-simple-simd-test s64.2- (s64.2) (s64.2 &rest s64.2) s64-) + +(in-package #:sb-simd-sse4.1) + +(sb-simd-test-suite:define-simple-simd-test f32.4-if (f32.4) (u32.4 f32.4 f32.4) f32-if) +(sb-simd-test-suite:define-simple-simd-test f64.2-if (f64.2) (u64.2 f64.2 f64.2) f64-if) +(sb-simd-test-suite:define-simple-simd-test u8.16-if (u8.16) (u8.16 u8.16 u8.16) u8-if) +(sb-simd-test-suite:define-simple-simd-test u16.8-if (u16.8) (u16.8 u16.8 u16.8) u16-if) +(sb-simd-test-suite:define-simple-simd-test u32.4-if (u32.4) (u32.4 u32.4 u32.4) u32-if) +(sb-simd-test-suite:define-simple-simd-test u64.2-if (u64.2) (u64.2 u64.2 u64.2) u64-if) +(sb-simd-test-suite:define-simple-simd-test s8.16-if (s8.16) (u8.16 s8.16 s8.16) s8-if) +(sb-simd-test-suite:define-simple-simd-test s16.8-if (s16.8) (u16.8 s16.8 s16.8) s16-if) +(sb-simd-test-suite:define-simple-simd-test s32.4-if (s32.4) (u32.4 s32.4 s32.4) s32-if) +(sb-simd-test-suite:define-simple-simd-test s64.2-if (s64.2) (u64.2 s64.2 s64.2) s64-if) + +(sb-simd-test-suite:define-simple-simd-test u64.2= (u64.2) (u64.2 &rest u64.2) u64=) +(sb-simd-test-suite:define-simple-simd-test u64.2/= (u64.2) (u64.2 &rest u64.2) u64/=) + +(sb-simd-test-suite:define-simple-simd-test s64.2= (u64.2) (s64.2 &rest s64.2) s64=) +(sb-simd-test-suite:define-simple-simd-test s64.2/= (u64.2) (s64.2 &rest s64.2) s64/=) + +(in-package #:sb-simd-sse4.2) + +(sb-simd-test-suite:define-simple-simd-test u64.2< (u64.2) (u64.2 &rest u64.2) u64<) +(sb-simd-test-suite:define-simple-simd-test u64.2<= (u64.2) (u64.2 &rest u64.2) u64<=) +(sb-simd-test-suite:define-simple-simd-test u64.2> (u64.2) (u64.2 &rest u64.2) u64>) +(sb-simd-test-suite:define-simple-simd-test u64.2>= (u64.2) (u64.2 &rest u64.2) u64>=) + +(sb-simd-test-suite:define-simple-simd-test s64.2< (u64.2) (s64.2 &rest s64.2) s64<) +(sb-simd-test-suite:define-simple-simd-test s64.2<= (u64.2) (s64.2 &rest s64.2) s64<=) +(sb-simd-test-suite:define-simple-simd-test s64.2> (u64.2) (s64.2 &rest s64.2) s64>) +(sb-simd-test-suite:define-simple-simd-test s64.2>= (u64.2) (s64.2 &rest s64.2) s64>=) + +(in-package #:sb-simd-avx) + +(sb-simd-test-suite:define-simple-simd-test f32.4-if (f32.4) (u32.4 f32.4 f32.4) f32-if) +(sb-simd-test-suite:define-simple-simd-test f32.4-and (f32.4) (&rest f32.4) f32-and) +(sb-simd-test-suite:define-simple-simd-test f32.4-or (f32.4) (&rest f32.4) f32-or) +(sb-simd-test-suite:define-simple-simd-test f32.4-xor (f32.4) (&rest f32.4) f32-xor) +(sb-simd-test-suite:define-simple-simd-test f32.4-andc1 (f32.4) (f32.4 f32.4) f32-andc1) +(sb-simd-test-suite:define-simple-simd-test f32.4-not (f32.4) (f32.4) f32-not) +(sb-simd-test-suite:define-simple-simd-test f32.4-max (f32.4) (f32.4 &rest f32.4) f32-max) +(sb-simd-test-suite:define-simple-simd-test f32.4-min (f32.4) (f32.4 &rest f32.4) f32-min) +(sb-simd-test-suite:define-simple-simd-test f32.4+ (f32.4) (&rest f32.4) f32+) +(sb-simd-test-suite:define-simple-simd-test f32.4- (f32.4) (f32.4 &rest f32.4) f32-) +(sb-simd-test-suite:define-simple-simd-test f32.4* (f32.4) (&rest f32.4) f32*) +(sb-simd-test-suite:define-simple-simd-test f32.4/ (f32.4) (f32.4 &rest f32.4) f32/) +(sb-simd-test-suite:define-simple-simd-test f32.4= (u32.4) (f32.4 &rest f32.4) f32=) +(sb-simd-test-suite:define-simple-simd-test f32.4/= (u32.4) (f32.4 &rest f32.4) f32/=) +(sb-simd-test-suite:define-simple-simd-test f32.4< (u32.4) (f32.4 &rest f32.4) f32<) +(sb-simd-test-suite:define-simple-simd-test f32.4<= (u32.4) (f32.4 &rest f32.4) f32<=) +(sb-simd-test-suite:define-simple-simd-test f32.4> (u32.4) (f32.4 &rest f32.4) f32>) +(sb-simd-test-suite:define-simple-simd-test f32.4>= (u32.4) (f32.4 &rest f32.4) f32>=) + +(sb-simd-test-suite:define-simple-simd-test f32.8-if (f32.8) (u32.8 f32.8 f32.8) f32-if) +(sb-simd-test-suite:define-simple-simd-test f32.8-and (f32.8) (&rest f32.8) f32-and) +(sb-simd-test-suite:define-simple-simd-test f32.8-or (f32.8) (&rest f32.8) f32-or) +(sb-simd-test-suite:define-simple-simd-test f32.8-xor (f32.8) (&rest f32.8) f32-xor) +(sb-simd-test-suite:define-simple-simd-test f32.8-andc1 (f32.8) (f32.8 f32.8) f32-andc1) +(sb-simd-test-suite:define-simple-simd-test f32.8-not (f32.8) (f32.8) f32-not) +(sb-simd-test-suite:define-simple-simd-test f32.8-max (f32.8) (f32.8 &rest f32.8) f32-max) +(sb-simd-test-suite:define-simple-simd-test f32.8-min (f32.8) (f32.8 &rest f32.8) f32-min) +(sb-simd-test-suite:define-simple-simd-test f32.8+ (f32.8) (&rest f32.8) f32+) +(sb-simd-test-suite:define-simple-simd-test f32.8- (f32.8) (f32.8 &rest f32.8) f32-) +(sb-simd-test-suite:define-simple-simd-test f32.8* (f32.8) (&rest f32.8) f32*) +(sb-simd-test-suite:define-simple-simd-test f32.8/ (f32.8) (f32.8 &rest f32.8) f32/) +(sb-simd-test-suite:define-simple-simd-test f32.8= (u32.8) (f32.8 &rest f32.8) f32=) +(sb-simd-test-suite:define-simple-simd-test f32.8/= (u32.8) (f32.8 &rest f32.8) f32/=) +(sb-simd-test-suite:define-simple-simd-test f32.8< (u32.8) (f32.8 &rest f32.8) f32<) +(sb-simd-test-suite:define-simple-simd-test f32.8<= (u32.8) (f32.8 &rest f32.8) f32<=) +(sb-simd-test-suite:define-simple-simd-test f32.8> (u32.8) (f32.8 &rest f32.8) f32>) +(sb-simd-test-suite:define-simple-simd-test f32.8>= (u32.8) (f32.8 &rest f32.8) f32>=) + +(sb-simd-test-suite:define-simple-simd-test f64.2-if (f64.2) (u64.2 f64.2 f64.2) f64-if) +(sb-simd-test-suite:define-simple-simd-test f64.2-and (f64.2) (&rest f64.2) f64-and) +(sb-simd-test-suite:define-simple-simd-test f64.2-or (f64.2) (&rest f64.2) f64-or) +(sb-simd-test-suite:define-simple-simd-test f64.2-xor (f64.2) (&rest f64.2) f64-xor) +(sb-simd-test-suite:define-simple-simd-test f64.2-andc1 (f64.2) (f64.2 f64.2) f64-andc1) +(sb-simd-test-suite:define-simple-simd-test f64.2-not (f64.2) (f64.2) f64-not) +(sb-simd-test-suite:define-simple-simd-test f64.2-max (f64.2) (f64.2 &rest f64.2) f64-max) +(sb-simd-test-suite:define-simple-simd-test f64.2-min (f64.2) (f64.2 &rest f64.2) f64-min) +(sb-simd-test-suite:define-simple-simd-test f64.2+ (f64.2) (&rest f64.2) f64+) +(sb-simd-test-suite:define-simple-simd-test f64.2- (f64.2) (f64.2 &rest f64.2) f64-) +(sb-simd-test-suite:define-simple-simd-test f64.2* (f64.2) (&rest f64.2) f64*) +(sb-simd-test-suite:define-simple-simd-test f64.2/ (f64.2) (f64.2 &rest f64.2) f64/) +(sb-simd-test-suite:define-simple-simd-test f64.2= (u64.2) (f64.2 &rest f64.2) f64=) +(sb-simd-test-suite:define-simple-simd-test f64.2/= (u64.2) (f64.2 &rest f64.2) f64/=) +(sb-simd-test-suite:define-simple-simd-test f64.2< (u64.2) (f64.2 &rest f64.2) f64<) +(sb-simd-test-suite:define-simple-simd-test f64.2<= (u64.2) (f64.2 &rest f64.2) f64<=) +(sb-simd-test-suite:define-simple-simd-test f64.2> (u64.2) (f64.2 &rest f64.2) f64>) +(sb-simd-test-suite:define-simple-simd-test f64.2>= (u64.2) (f64.2 &rest f64.2) f64>=) + +(sb-simd-test-suite:define-simple-simd-test f64.4-if (f64.4) (u64.4 f64.4 f64.4) f64-if) +(sb-simd-test-suite:define-simple-simd-test f64.4-and (f64.4) (&rest f64.4) f64-and) +(sb-simd-test-suite:define-simple-simd-test f64.4-or (f64.4) (&rest f64.4) f64-or) +(sb-simd-test-suite:define-simple-simd-test f64.4-xor (f64.4) (&rest f64.4) f64-xor) +(sb-simd-test-suite:define-simple-simd-test f64.4-andc1 (f64.4) (f64.4 f64.4) f64-andc1) +(sb-simd-test-suite:define-simple-simd-test f64.4-not (f64.4) (f64.4) f64-not) +(sb-simd-test-suite:define-simple-simd-test f64.4-max (f64.4) (f64.4 &rest f64.4) f64-max) +(sb-simd-test-suite:define-simple-simd-test f64.4-min (f64.4) (f64.4 &rest f64.4) f64-min) +(sb-simd-test-suite:define-simple-simd-test f64.4+ (f64.4) (&rest f64.4) f64+) +(sb-simd-test-suite:define-simple-simd-test f64.4- (f64.4) (f64.4 &rest f64.4) f64-) +(sb-simd-test-suite:define-simple-simd-test f64.4* (f64.4) (&rest f64.4) f64*) +(sb-simd-test-suite:define-simple-simd-test f64.4/ (f64.4) (f64.4 &rest f64.4) f64/) +(sb-simd-test-suite:define-simple-simd-test f64.4= (u64.4) (f64.4 &rest f64.4) f64=) +(sb-simd-test-suite:define-simple-simd-test f64.4/= (u64.4) (f64.4 &rest f64.4) f64/=) +(sb-simd-test-suite:define-simple-simd-test f64.4< (u64.4) (f64.4 &rest f64.4) f64<) +(sb-simd-test-suite:define-simple-simd-test f64.4<= (u64.4) (f64.4 &rest f64.4) f64<=) +(sb-simd-test-suite:define-simple-simd-test f64.4> (u64.4) (f64.4 &rest f64.4) f64>) +(sb-simd-test-suite:define-simple-simd-test f64.4>= (u64.4) (f64.4 &rest f64.4) f64>=) + +(sb-simd-test-suite:define-simple-simd-test u8.16-if (u8.16) (u8.16 u8.16 u8.16) u8-if) +(sb-simd-test-suite:define-simple-simd-test u8.16-and (u8.16) (&rest u8.16) u8-and) +(sb-simd-test-suite:define-simple-simd-test u8.16-or (u8.16) (&rest u8.16) u8-or) +(sb-simd-test-suite:define-simple-simd-test u8.16-xor (u8.16) (&rest u8.16) u8-xor) +(sb-simd-test-suite:define-simple-simd-test u8.16-andc1 (u8.16) (u8.16 u8.16) u8-andc1) +(sb-simd-test-suite:define-simple-simd-test u8.16-not (u8.16) (u8.16) u8-not) +(sb-simd-test-suite:define-simple-simd-test u8.16+ (u8.16) (&rest u8.16) u8+) +(sb-simd-test-suite:define-simple-simd-test u8.16- (u8.16) (u8.16 &rest u8.16) u8-) +(sb-simd-test-suite:define-simple-simd-test u8.16= (u8.16) (u8.16 &rest u8.16) u8=) +(sb-simd-test-suite:define-simple-simd-test u8.16/= (u8.16) (u8.16 &rest u8.16) u8/=) +(sb-simd-test-suite:define-simple-simd-test u8.16< (u8.16) (u8.16 &rest u8.16) u8<) +(sb-simd-test-suite:define-simple-simd-test u8.16<= (u8.16) (u8.16 &rest u8.16) u8<=) +(sb-simd-test-suite:define-simple-simd-test u8.16> (u8.16) (u8.16 &rest u8.16) u8>) +(sb-simd-test-suite:define-simple-simd-test u8.16>= (u8.16) (u8.16 &rest u8.16) u8>=) + +(sb-simd-test-suite:define-simple-simd-test u16.8-if (u16.8) (u16.8 u16.8 u16.8) u16-if) +(sb-simd-test-suite:define-simple-simd-test u16.8-and (u16.8) (&rest u16.8) u16-and) +(sb-simd-test-suite:define-simple-simd-test u16.8-or (u16.8) (&rest u16.8) u16-or) +(sb-simd-test-suite:define-simple-simd-test u16.8-xor (u16.8) (&rest u16.8) u16-xor) +(sb-simd-test-suite:define-simple-simd-test u16.8-andc1 (u16.8) (u16.8 u16.8) u16-andc1) +(sb-simd-test-suite:define-simple-simd-test u16.8-not (u16.8) (u16.8) u16-not) +(sb-simd-test-suite:define-simple-simd-test u16.8+ (u16.8) (&rest u16.8) u16+) +(sb-simd-test-suite:define-simple-simd-test u16.8- (u16.8) (u16.8 &rest u16.8) u16-) +(sb-simd-test-suite:define-simple-simd-test u16.8= (u16.8) (u16.8 &rest u16.8) u16=) +(sb-simd-test-suite:define-simple-simd-test u16.8/= (u16.8) (u16.8 &rest u16.8) u16/=) +(sb-simd-test-suite:define-simple-simd-test u16.8< (u16.8) (u16.8 &rest u16.8) u16<) +(sb-simd-test-suite:define-simple-simd-test u16.8<= (u16.8) (u16.8 &rest u16.8) u16<=) +(sb-simd-test-suite:define-simple-simd-test u16.8> (u16.8) (u16.8 &rest u16.8) u16>) +(sb-simd-test-suite:define-simple-simd-test u16.8>= (u16.8) (u16.8 &rest u16.8) u16>=) + +(sb-simd-test-suite:define-simple-simd-test u32.4-if (u32.4) (u32.4 u32.4 u32.4) u32-if) +(sb-simd-test-suite:define-simple-simd-test u32.4-and (u32.4) (&rest u32.4) u32-and) +(sb-simd-test-suite:define-simple-simd-test u32.4-or (u32.4) (&rest u32.4) u32-or) +(sb-simd-test-suite:define-simple-simd-test u32.4-xor (u32.4) (&rest u32.4) u32-xor) +(sb-simd-test-suite:define-simple-simd-test u32.4-andc1 (u32.4) (u32.4 u32.4) u32-andc1) +(sb-simd-test-suite:define-simple-simd-test u32.4-not (u32.4) (u32.4) u32-not) +(sb-simd-test-suite:define-simple-simd-test u32.4+ (u32.4) (&rest u32.4) u32+) +(sb-simd-test-suite:define-simple-simd-test u32.4- (u32.4) (u32.4 &rest u32.4) u32-) +(sb-simd-test-suite:define-simple-simd-test u32.4= (u32.4) (u32.4 &rest u32.4) u32=) +(sb-simd-test-suite:define-simple-simd-test u32.4/= (u32.4) (u32.4 &rest u32.4) u32/=) +(sb-simd-test-suite:define-simple-simd-test u32.4< (u32.4) (u32.4 &rest u32.4) u32<) +(sb-simd-test-suite:define-simple-simd-test u32.4<= (u32.4) (u32.4 &rest u32.4) u32<=) +(sb-simd-test-suite:define-simple-simd-test u32.4> (u32.4) (u32.4 &rest u32.4) u32>) +(sb-simd-test-suite:define-simple-simd-test u32.4>= (u32.4) (u32.4 &rest u32.4) u32>=) + +(sb-simd-test-suite:define-simple-simd-test u64.2-if (u64.2) (u64.2 u64.2 u64.2) u64-if) +(sb-simd-test-suite:define-simple-simd-test u64.2-and (u64.2) (&rest u64.2) u64-and) +(sb-simd-test-suite:define-simple-simd-test u64.2-or (u64.2) (&rest u64.2) u64-or) +(sb-simd-test-suite:define-simple-simd-test u64.2-xor (u64.2) (&rest u64.2) u64-xor) +(sb-simd-test-suite:define-simple-simd-test u64.2-andc1 (u64.2) (u64.2 u64.2) u64-andc1) +(sb-simd-test-suite:define-simple-simd-test u64.2-not (u64.2) (u64.2) u64-not) +(sb-simd-test-suite:define-simple-simd-test u64.2+ (u64.2) (&rest u64.2) u64+) +(sb-simd-test-suite:define-simple-simd-test u64.2- (u64.2) (u64.2 &rest u64.2) u64-) +(sb-simd-test-suite:define-simple-simd-test u64.2= (u64.2) (u64.2 &rest u64.2) u64=) +(sb-simd-test-suite:define-simple-simd-test u64.2/= (u64.2) (u64.2 &rest u64.2) u64/=) +(sb-simd-test-suite:define-simple-simd-test u64.2< (u64.2) (u64.2 &rest u64.2) u64<) +(sb-simd-test-suite:define-simple-simd-test u64.2<= (u64.2) (u64.2 &rest u64.2) u64<=) +(sb-simd-test-suite:define-simple-simd-test u64.2> (u64.2) (u64.2 &rest u64.2) u64>) +(sb-simd-test-suite:define-simple-simd-test u64.2>= (u64.2) (u64.2 &rest u64.2) u64>=) + +(sb-simd-test-suite:define-simple-simd-test s8.16-if (s8.16) (u8.16 s8.16 s8.16) s8-if) +(sb-simd-test-suite:define-simple-simd-test s8.16-and (s8.16) (&rest s8.16) s8-and) +(sb-simd-test-suite:define-simple-simd-test s8.16-or (s8.16) (&rest s8.16) s8-or) +(sb-simd-test-suite:define-simple-simd-test s8.16-xor (s8.16) (&rest s8.16) s8-xor) +(sb-simd-test-suite:define-simple-simd-test s8.16-andc1 (s8.16) (s8.16 s8.16) s8-andc1) +(sb-simd-test-suite:define-simple-simd-test s8.16-not (s8.16) (s8.16) s8-not) +(sb-simd-test-suite:define-simple-simd-test s8.16+ (s8.16) (&rest s8.16) s8+) +(sb-simd-test-suite:define-simple-simd-test s8.16- (s8.16) (s8.16 &rest s8.16) s8-) +(sb-simd-test-suite:define-simple-simd-test s8.16= (u8.16) (s8.16 &rest s8.16) s8=) +(sb-simd-test-suite:define-simple-simd-test s8.16/= (u8.16) (s8.16 &rest s8.16) s8/=) +(sb-simd-test-suite:define-simple-simd-test s8.16< (u8.16) (s8.16 &rest s8.16) s8<) +(sb-simd-test-suite:define-simple-simd-test s8.16<= (u8.16) (s8.16 &rest s8.16) s8<=) +(sb-simd-test-suite:define-simple-simd-test s8.16> (u8.16) (s8.16 &rest s8.16) s8>) +(sb-simd-test-suite:define-simple-simd-test s8.16>= (u8.16) (s8.16 &rest s8.16) s8>=) + +(sb-simd-test-suite:define-simple-simd-test s16.8-if (s16.8) (u16.8 s16.8 s16.8) s16-if) +(sb-simd-test-suite:define-simple-simd-test s16.8-and (s16.8) (&rest s16.8) s16-and) +(sb-simd-test-suite:define-simple-simd-test s16.8-or (s16.8) (&rest s16.8) s16-or) +(sb-simd-test-suite:define-simple-simd-test s16.8-xor (s16.8) (&rest s16.8) s16-xor) +(sb-simd-test-suite:define-simple-simd-test s16.8-andc1 (s16.8) (s16.8 s16.8) s16-andc1) +(sb-simd-test-suite:define-simple-simd-test s16.8-not (s16.8) (s16.8) s16-not) +(sb-simd-test-suite:define-simple-simd-test s16.8+ (s16.8) (&rest s16.8) s16+) +(sb-simd-test-suite:define-simple-simd-test s16.8- (s16.8) (s16.8 &rest s16.8) s16-) +(sb-simd-test-suite:define-simple-simd-test s16.8= (u16.8) (s16.8 &rest s16.8) s16=) +(sb-simd-test-suite:define-simple-simd-test s16.8/= (u16.8) (s16.8 &rest s16.8) s16/=) +(sb-simd-test-suite:define-simple-simd-test s16.8< (u16.8) (s16.8 &rest s16.8) s16<) +(sb-simd-test-suite:define-simple-simd-test s16.8<= (u16.8) (s16.8 &rest s16.8) s16<=) +(sb-simd-test-suite:define-simple-simd-test s16.8> (u16.8) (s16.8 &rest s16.8) s16>) +(sb-simd-test-suite:define-simple-simd-test s16.8>= (u16.8) (s16.8 &rest s16.8) s16>=) + +(sb-simd-test-suite:define-simple-simd-test s32.4-if (s32.4) (u32.4 s32.4 s32.4) s32-if) +(sb-simd-test-suite:define-simple-simd-test s32.4-and (s32.4) (&rest s32.4) s32-and) +(sb-simd-test-suite:define-simple-simd-test s32.4-or (s32.4) (&rest s32.4) s32-or) +(sb-simd-test-suite:define-simple-simd-test s32.4-xor (s32.4) (&rest s32.4) s32-xor) +(sb-simd-test-suite:define-simple-simd-test s32.4-andc1 (s32.4) (s32.4 s32.4) s32-andc1) +(sb-simd-test-suite:define-simple-simd-test s32.4-not (s32.4) (s32.4) s32-not) +(sb-simd-test-suite:define-simple-simd-test s32.4+ (s32.4) (&rest s32.4) s32+) +(sb-simd-test-suite:define-simple-simd-test s32.4- (s32.4) (s32.4 &rest s32.4) s32-) +(sb-simd-test-suite:define-simple-simd-test s32.4= (u32.4) (s32.4 &rest s32.4) s32=) +(sb-simd-test-suite:define-simple-simd-test s32.4/= (u32.4) (s32.4 &rest s32.4) s32/=) +(sb-simd-test-suite:define-simple-simd-test s32.4< (u32.4) (s32.4 &rest s32.4) s32<) +(sb-simd-test-suite:define-simple-simd-test s32.4<= (u32.4) (s32.4 &rest s32.4) s32<=) +(sb-simd-test-suite:define-simple-simd-test s32.4> (u32.4) (s32.4 &rest s32.4) s32>) +(sb-simd-test-suite:define-simple-simd-test s32.4>= (u32.4) (s32.4 &rest s32.4) s32>=) + +(sb-simd-test-suite:define-simple-simd-test s64.2-if (s64.2) (u64.2 s64.2 s64.2) s64-if) +(sb-simd-test-suite:define-simple-simd-test s64.2-and (s64.2) (&rest s64.2) s64-and) +(sb-simd-test-suite:define-simple-simd-test s64.2-or (s64.2) (&rest s64.2) s64-or) +(sb-simd-test-suite:define-simple-simd-test s64.2-xor (s64.2) (&rest s64.2) s64-xor) +(sb-simd-test-suite:define-simple-simd-test s64.2-andc1 (s64.2) (s64.2 s64.2) s64-andc1) +(sb-simd-test-suite:define-simple-simd-test s64.2-not (s64.2) (s64.2) s64-not) +(sb-simd-test-suite:define-simple-simd-test s64.2+ (s64.2) (&rest s64.2) s64+) +(sb-simd-test-suite:define-simple-simd-test s64.2- (s64.2) (s64.2 &rest s64.2) s64-) +(sb-simd-test-suite:define-simple-simd-test s64.2= (u64.2) (s64.2 &rest s64.2) s64=) +(sb-simd-test-suite:define-simple-simd-test s64.2< (u64.2) (s64.2 &rest s64.2) s64<) +(sb-simd-test-suite:define-simple-simd-test s64.2<= (u64.2) (s64.2 &rest s64.2) s64<=) +(sb-simd-test-suite:define-simple-simd-test s64.2> (u64.2) (s64.2 &rest s64.2) s64>) +(sb-simd-test-suite:define-simple-simd-test s64.2>= (u64.2) (s64.2 &rest s64.2) s64>=) + +(in-package #:sb-simd-avx2) + +(sb-simd-test-suite:define-simple-simd-test u8.32-if (u8.32) (u8.32 u8.32 u8.32) u8-if) +(sb-simd-test-suite:define-simple-simd-test u8.32-and (u8.32) (&rest u8.32) u8-and) +(sb-simd-test-suite:define-simple-simd-test u8.32-or (u8.32) (&rest u8.32) u8-or) +(sb-simd-test-suite:define-simple-simd-test u8.32-xor (u8.32) (&rest u8.32) u8-xor) +(sb-simd-test-suite:define-simple-simd-test u8.32-andc1 (u8.32) (u8.32 u8.32) u8-andc1) +(sb-simd-test-suite:define-simple-simd-test u8.32-not (u8.32) (u8.32) u8-not) +(sb-simd-test-suite:define-simple-simd-test u8.32+ (u8.32) (&rest u8.32) u8+) +(sb-simd-test-suite:define-simple-simd-test u8.32- (u8.32) (u8.32 &rest u8.32) u8-) +(sb-simd-test-suite:define-simple-simd-test u8.32= (u8.32) (u8.32 &rest u8.32) u8=) +(sb-simd-test-suite:define-simple-simd-test u8.32/= (u8.32) (u8.32 &rest u8.32) u8/=) +(sb-simd-test-suite:define-simple-simd-test u8.32< (u8.32) (u8.32 &rest u8.32) u8<) +(sb-simd-test-suite:define-simple-simd-test u8.32<= (u8.32) (u8.32 &rest u8.32) u8<=) +(sb-simd-test-suite:define-simple-simd-test u8.32> (u8.32) (u8.32 &rest u8.32) u8>) +(sb-simd-test-suite:define-simple-simd-test u8.32>= (u8.32) (u8.32 &rest u8.32) u8>=) + +(sb-simd-test-suite:define-simple-simd-test u16.16-if (u16.16) (u16.16 u16.16 u16.16) u16-if) +(sb-simd-test-suite:define-simple-simd-test u16.16-and (u16.16) (&rest u16.16) u16-and) +(sb-simd-test-suite:define-simple-simd-test u16.16-or (u16.16) (&rest u16.16) u16-or) +(sb-simd-test-suite:define-simple-simd-test u16.16-xor (u16.16) (&rest u16.16) u16-xor) +(sb-simd-test-suite:define-simple-simd-test u16.16-andc1 (u16.16) (u16.16 u16.16) u16-andc1) +(sb-simd-test-suite:define-simple-simd-test u16.16-not (u16.16) (u16.16) u16-not) +(sb-simd-test-suite:define-simple-simd-test u16.16+ (u16.16) (&rest u16.16) u16+) +(sb-simd-test-suite:define-simple-simd-test u16.16- (u16.16) (u16.16 &rest u16.16) u16-) +(sb-simd-test-suite:define-simple-simd-test u16.16= (u16.16) (u16.16 &rest u16.16) u16=) +(sb-simd-test-suite:define-simple-simd-test u16.16/= (u16.16) (u16.16 &rest u16.16) u16/=) +(sb-simd-test-suite:define-simple-simd-test u16.16< (u16.16) (u16.16 &rest u16.16) u16<) +(sb-simd-test-suite:define-simple-simd-test u16.16<= (u16.16) (u16.16 &rest u16.16) u16<=) +(sb-simd-test-suite:define-simple-simd-test u16.16> (u16.16) (u16.16 &rest u16.16) u16>) +(sb-simd-test-suite:define-simple-simd-test u16.16>= (u16.16) (u16.16 &rest u16.16) u16>=) + +(sb-simd-test-suite:define-simple-simd-test u32.8-if (u32.8) (u32.8 u32.8 u32.8) u32-if) +(sb-simd-test-suite:define-simple-simd-test u32.8-and (u32.8) (&rest u32.8) u32-and) +(sb-simd-test-suite:define-simple-simd-test u32.8-or (u32.8) (&rest u32.8) u32-or) +(sb-simd-test-suite:define-simple-simd-test u32.8-xor (u32.8) (&rest u32.8) u32-xor) +(sb-simd-test-suite:define-simple-simd-test u32.8-andc1 (u32.8) (u32.8 u32.8) u32-andc1) +(sb-simd-test-suite:define-simple-simd-test u32.8-not (u32.8) (u32.8) u32-not) +(sb-simd-test-suite:define-simple-simd-test u32.8+ (u32.8) (&rest u32.8) u32+) +(sb-simd-test-suite:define-simple-simd-test u32.8- (u32.8) (u32.8 &rest u32.8) u32-) +(sb-simd-test-suite:define-simple-simd-test u32.8= (u32.8) (u32.8 &rest u32.8) u32=) +(sb-simd-test-suite:define-simple-simd-test u32.8/= (u32.8) (u32.8 &rest u32.8) u32/=) +(sb-simd-test-suite:define-simple-simd-test u32.8< (u32.8) (u32.8 &rest u32.8) u32<) +(sb-simd-test-suite:define-simple-simd-test u32.8<= (u32.8) (u32.8 &rest u32.8) u32<=) +(sb-simd-test-suite:define-simple-simd-test u32.8> (u32.8) (u32.8 &rest u32.8) u32>) +(sb-simd-test-suite:define-simple-simd-test u32.8>= (u32.8) (u32.8 &rest u32.8) u32>=) + +(sb-simd-test-suite:define-simple-simd-test u64.4-if (u64.4) (u64.4 u64.4 u64.4) u64-if) +(sb-simd-test-suite:define-simple-simd-test u64.4-and (u64.4) (&rest u64.4) u64-and) +(sb-simd-test-suite:define-simple-simd-test u64.4-or (u64.4) (&rest u64.4) u64-or) +(sb-simd-test-suite:define-simple-simd-test u64.4-xor (u64.4) (&rest u64.4) u64-xor) +(sb-simd-test-suite:define-simple-simd-test u64.4-andc1 (u64.4) (u64.4 u64.4) u64-andc1) +(sb-simd-test-suite:define-simple-simd-test u64.4-not (u64.4) (u64.4) u64-not) +(sb-simd-test-suite:define-simple-simd-test u64.4+ (u64.4) (&rest u64.4) u64+) +(sb-simd-test-suite:define-simple-simd-test u64.4- (u64.4) (u64.4 &rest u64.4) u64-) +(sb-simd-test-suite:define-simple-simd-test u64.4= (u64.4) (u64.4 &rest u64.4) u64=) +(sb-simd-test-suite:define-simple-simd-test u64.4/= (u64.4) (u64.4 &rest u64.4) u64/=) +(sb-simd-test-suite:define-simple-simd-test u64.4< (u64.4) (u64.4 &rest u64.4) u64<) +(sb-simd-test-suite:define-simple-simd-test u64.4<= (u64.4) (u64.4 &rest u64.4) u64<=) +(sb-simd-test-suite:define-simple-simd-test u64.4> (u64.4) (u64.4 &rest u64.4) u64>) +(sb-simd-test-suite:define-simple-simd-test u64.4>= (u64.4) (u64.4 &rest u64.4) u64>=) + +(sb-simd-test-suite:define-simple-simd-test s8.32-if (s8.32) (u8.32 s8.32 s8.32) s8-if) +(sb-simd-test-suite:define-simple-simd-test s8.32-and (s8.32) (&rest s8.32) s8-and) +(sb-simd-test-suite:define-simple-simd-test s8.32-or (s8.32) (&rest s8.32) s8-or) +(sb-simd-test-suite:define-simple-simd-test s8.32-xor (s8.32) (&rest s8.32) s8-xor) +(sb-simd-test-suite:define-simple-simd-test s8.32-andc1 (s8.32) (s8.32 s8.32) s8-andc1) +(sb-simd-test-suite:define-simple-simd-test s8.32-not (s8.32) (s8.32) s8-not) +(sb-simd-test-suite:define-simple-simd-test s8.32+ (s8.32) (&rest s8.32) s8+) +(sb-simd-test-suite:define-simple-simd-test s8.32- (s8.32) (s8.32 &rest s8.32) s8-) +(sb-simd-test-suite:define-simple-simd-test s8.32= (u8.32) (s8.32 &rest s8.32) s8=) +(sb-simd-test-suite:define-simple-simd-test s8.32/= (u8.32) (s8.32 &rest s8.32) s8/=) +(sb-simd-test-suite:define-simple-simd-test s8.32< (u8.32) (s8.32 &rest s8.32) s8<) +(sb-simd-test-suite:define-simple-simd-test s8.32<= (u8.32) (s8.32 &rest s8.32) s8<=) +(sb-simd-test-suite:define-simple-simd-test s8.32> (u8.32) (s8.32 &rest s8.32) s8>) +(sb-simd-test-suite:define-simple-simd-test s8.32>= (u8.32) (s8.32 &rest s8.32) s8>=) + +(sb-simd-test-suite:define-simple-simd-test s16.16-if (s16.16) (u16.16 s16.16 s16.16) s16-if) +(sb-simd-test-suite:define-simple-simd-test s16.16-and (s16.16) (&rest s16.16) s16-and) +(sb-simd-test-suite:define-simple-simd-test s16.16-or (s16.16) (&rest s16.16) s16-or) +(sb-simd-test-suite:define-simple-simd-test s16.16-xor (s16.16) (&rest s16.16) s16-xor) +(sb-simd-test-suite:define-simple-simd-test s16.16-andc1 (s16.16) (s16.16 s16.16) s16-andc1) +(sb-simd-test-suite:define-simple-simd-test s16.16-not (s16.16) (s16.16) s16-not) +(sb-simd-test-suite:define-simple-simd-test s16.16+ (s16.16) (&rest s16.16) s16+) +(sb-simd-test-suite:define-simple-simd-test s16.16- (s16.16) (s16.16 &rest s16.16) s16-) +(sb-simd-test-suite:define-simple-simd-test s16.16= (u16.16) (s16.16 &rest s16.16) s16=) +(sb-simd-test-suite:define-simple-simd-test s16.16/= (u16.16) (s16.16 &rest s16.16) s16/=) +(sb-simd-test-suite:define-simple-simd-test s16.16< (u16.16) (s16.16 &rest s16.16) s16<) +(sb-simd-test-suite:define-simple-simd-test s16.16<= (u16.16) (s16.16 &rest s16.16) s16<=) +(sb-simd-test-suite:define-simple-simd-test s16.16> (u16.16) (s16.16 &rest s16.16) s16>) +(sb-simd-test-suite:define-simple-simd-test s16.16>= (u16.16) (s16.16 &rest s16.16) s16>=) + +(sb-simd-test-suite:define-simple-simd-test s32.8-if (s32.8) (u32.8 s32.8 s32.8) s32-if) +(sb-simd-test-suite:define-simple-simd-test s32.8-and (s32.8) (&rest s32.8) s32-and) +(sb-simd-test-suite:define-simple-simd-test s32.8-or (s32.8) (&rest s32.8) s32-or) +(sb-simd-test-suite:define-simple-simd-test s32.8-xor (s32.8) (&rest s32.8) s32-xor) +(sb-simd-test-suite:define-simple-simd-test s32.8-andc1 (s32.8) (s32.8 s32.8) s32-andc1) +(sb-simd-test-suite:define-simple-simd-test s32.8-not (s32.8) (s32.8) s32-not) +(sb-simd-test-suite:define-simple-simd-test s32.8+ (s32.8) (&rest s32.8) s32+) +(sb-simd-test-suite:define-simple-simd-test s32.8- (s32.8) (s32.8 &rest s32.8) s32-) +(sb-simd-test-suite:define-simple-simd-test s32.8= (u32.8) (s32.8 &rest s32.8) s32=) +(sb-simd-test-suite:define-simple-simd-test s32.8/= (u32.8) (s32.8 &rest s32.8) s32/=) +(sb-simd-test-suite:define-simple-simd-test s32.8< (u32.8) (s32.8 &rest s32.8) s32<) +(sb-simd-test-suite:define-simple-simd-test s32.8<= (u32.8) (s32.8 &rest s32.8) s32<=) +(sb-simd-test-suite:define-simple-simd-test s32.8> (u32.8) (s32.8 &rest s32.8) s32>) +(sb-simd-test-suite:define-simple-simd-test s32.8>= (u32.8) (s32.8 &rest s32.8) s32>=) + +(sb-simd-test-suite:define-simple-simd-test s64.4-if (s64.4) (u64.4 s64.4 s64.4) s64-if) +(sb-simd-test-suite:define-simple-simd-test s64.4-and (s64.4) (&rest s64.4) s64-and) +(sb-simd-test-suite:define-simple-simd-test s64.4-or (s64.4) (&rest s64.4) s64-or) +(sb-simd-test-suite:define-simple-simd-test s64.4-xor (s64.4) (&rest s64.4) s64-xor) +(sb-simd-test-suite:define-simple-simd-test s64.4-andc1 (s64.4) (s64.4 s64.4) s64-andc1) +(sb-simd-test-suite:define-simple-simd-test s64.4-not (s64.4) (s64.4) s64-not) +(sb-simd-test-suite:define-simple-simd-test s64.4+ (s64.4) (&rest s64.4) s64+) +(sb-simd-test-suite:define-simple-simd-test s64.4- (s64.4) (s64.4 &rest s64.4) s64-) +(sb-simd-test-suite:define-simple-simd-test s64.4= (u64.4) (s64.4 &rest s64.4) s64=) +(sb-simd-test-suite:define-simple-simd-test s64.4< (u64.4) (s64.4 &rest s64.4) s64<) +(sb-simd-test-suite:define-simple-simd-test s64.4<= (u64.4) (s64.4 &rest s64.4) s64<=) +(sb-simd-test-suite:define-simple-simd-test s64.4> (u64.4) (s64.4 &rest s64.4) s64>) +(sb-simd-test-suite:define-simple-simd-test s64.4>= (u64.4) (s64.4 &rest s64.4) s64>=) + +(in-package #:sb-simd-fma) + +(sb-simd-test-suite:define-simple-simd-test f32.4-fmadd (f32.4) (f32.4 f32.4 f32.4) f32-fmadd) +(sb-simd-test-suite:define-simple-simd-test f32.4-fnmadd (f32.4) (f32.4 f32.4 f32.4) f32-fnmadd) +(sb-simd-test-suite:define-simple-simd-test f32.4-fmsub (f32.4) (f32.4 f32.4 f32.4) f32-fmsub) + +(sb-simd-test-suite:define-simple-simd-test f32.8-fmadd (f32.8) (f32.8 f32.8 f32.8) f32-fmadd) +(sb-simd-test-suite:define-simple-simd-test f32.8-fnmadd (f32.8) (f32.8 f32.8 f32.8) f32-fnmadd) +(sb-simd-test-suite:define-simple-simd-test f32.8-fmsub (f32.8) (f32.8 f32.8 f32.8) f32-fmsub) + +(sb-simd-test-suite:define-simple-simd-test f64.2-fmadd (f64.2) (f64.2 f64.2 f64.2) f64-fmadd) +(sb-simd-test-suite:define-simple-simd-test f64.2-fnmadd (f64.2) (f64.2 f64.2 f64.2) f64-fnmadd) +(sb-simd-test-suite:define-simple-simd-test f64.2-fmsub (f64.2) (f64.2 f64.2 f64.2) f64-fmsub) + +(sb-simd-test-suite:define-simple-simd-test f64.4-fmadd (f64.4) (f64.4 f64.4 f64.4) f64-fmadd) +(sb-simd-test-suite:define-simple-simd-test f64.4-fnmadd (f64.4) (f64.4 f64.4 f64.4) f64-fnmadd) +(sb-simd-test-suite:define-simple-simd-test f64.4-fmsub (f64.4) (f64.4 f64.4 f64.4) f64-fmsub) diff --git a/contrib/sb-simd/test-suite/test-suite.lisp b/contrib/sb-simd/test-suite/test-suite.lisp new file mode 100644 index 0000000000..79fba2e9f9 --- /dev/null +++ b/contrib/sb-simd/test-suite/test-suite.lisp @@ -0,0 +1,157 @@ +(in-package #:sb-simd-test-suite) + +;; A list of the names of all tests defined with the TEST macro. +(defparameter *tests* '()) + +;; The value of *RANDOM-STATE* when the test suite encountered the most +;; recent error, or NIL, if there have been no recent errors. +(defvar *failed-random-state* nil) + +;; The number of tests that have been run so far. +(defvar *test-count*) + +;; The number of successful checks that have been performed so far. +(defvar *pass-count*) + +;; The number of checks that have been performed in the current test. +(defvar *check-count* 0) + +(defun call-with-random-state (thunk) + (let ((*random-state* + (if (not *failed-random-state*) + (load-time-value (make-random-state t)) + *failed-random-state*))) + (setf *failed-random-state* (make-random-state *random-state*)) + (multiple-value-prog1 (funcall thunk) + (setf *failed-random-state* nil)))) + +(defmacro with-random-state (&body body) + `(call-with-random-state (lambda () ,@body))) + +(defun call-with-test-harness (thunk) + (if (and (boundp '*test-count*) + (boundp '*pass-count*)) + (funcall thunk) + (let* ((*test-count* 0) + (*pass-count* 0)) + (with-random-state (funcall thunk)) + (report *test-count* *pass-count*)))) + +(defmacro with-test-harness (&body body) + `(call-with-test-harness (lambda () ,@body))) + +(defun report (test-count pass-count) + (format t "~&Success: ~s test~:p, ~s check~:p.~%" test-count pass-count) + (finish-output)) + +;;; Ensure that DEFINE-TEST never overwrites function names in other +;;; packages. +(defun intern-test-name (test-name) + (let ((test-suite-package #.*package*) + (name (symbol-name test-name)) + (package (symbol-package test-name))) + (cond ((eq package test-suite-package) + test-name) + ((eq (nth-value 1 (find-symbol name package)) :external) + (intern (format nil "~A:~A" (package-name package) name) test-suite-package)) + (t + (intern (format nil "~A:~A" (package-name package) name) test-suite-package))))) + +(defmacro define-test (test-name &body body) + "Define a test function and add it to *TESTS*." + (let ((name (intern-test-name test-name))) + `(prog1 ',name + (defun ,name () + (declare (optimize (debug 3) (safety 3))) + (with-test-harness + (enter-test ',name) + ,@body)) + (pushnew ',name *tests*)))) + +(defun enter-test (test-name) + (incf *test-count*) + (setf *check-count* 0) + (format t "~&~A" (string test-name)) + (finish-output)) + +(defun pass () + (incf *pass-count*) + (when (zerop (logand *check-count* (incf *check-count*))) + (write-char #\.)) + (values)) + +(defmacro is (test-form) + "Assert that TEST-FORM evaluates to true." + `(progn + (assert ,test-form) + (pass))) + +(defun expect-condition (expected thunk) + (block nil + (flet ((handler (condition) + (cond ((typep condition expected) + (pass) + (return)) + (t (error "Expected to signal ~s, but got ~s:~%~a" + expected (type-of condition) condition))))) + (handler-bind ((condition #'handler)) + (funcall thunk))) + (error "Expected to signal ~s, but got nothing." expected))) + +(defmacro signals (condition &body body) + "Assert that `body' signals a condition of type `condition'." + `(expect-condition ',condition (lambda () ,@body))) + +(defun all-tests () + *tests*) + +;;; This function catches particularly hideous bugs - exported symbols with +;;; no attached definition. In case some exported symbols are +;;; intentionally without definition, they can be excluded via the SKIP +;;; argument. +(defun check-package (package &key skip) + (let ((skip (loop for name in skip collect (intern (string name) package)))) + (do-external-symbols (symbol package) + (unless (member symbol skip) + (unless (symbol-defined-p symbol) + (error "~@<The package ~A exports the symbol ~A, ~ + which does not have an attached definition.~:@>" + (package-name package) + (symbol-name symbol)))))) + (pass)) + +(defun symbol-defined-p (symbol) + (or (find-class symbol nil) + (boundp symbol) + (fboundp symbol) + (fboundp `(setf ,symbol)) + (macro-function symbol) + (special-operator-p symbol) + (type-specifier-p symbol))) + +(defun type-specifier-p (object) + (ignore-errors (typep 42 object) t)) + +(defun run-tests (&rest tests) + (with-test-harness (mapc #'funcall (shuffle tests))) + (values)) + +(defun run-test-suite () + (format t "== Testing SB-SIMD ==~%") + (format t "The library exports ~D functions." + (length (all-exported-functions))) + (apply #'run-tests (all-tests))) + +(defun all-instruction-sets () + (remove-duplicates + (loop for iset being the hash-values of sb-simd-internals:*instruction-sets* + collect iset))) + +(defun all-exported-functions () + (remove-duplicates + (loop for iset in (all-instruction-sets) + for package = (instruction-set-package iset) + append + (loop for symbol being the external-symbols of package + when (fboundp symbol) + collect symbol)))) diff --git a/contrib/sb-simd/test-suite/utilities.lisp b/contrib/sb-simd/test-suite/utilities.lisp new file mode 100644 index 0000000000..7e77ef3ea7 --- /dev/null +++ b/contrib/sb-simd/test-suite/utilities.lisp @@ -0,0 +1,174 @@ +(in-package #:sb-simd-test-suite) + +(defun shuffle (list) + (let ((result (copy-seq list))) + (loop for tail on result + for tail-length from (length result) downto 2 + do (rotatef (first tail) + (nth (random tail-length) tail))) + result)) + +(defun simd-info (name) + "Returns, as list: + + 1. The element type of the SIMD pack. + + 2. The number of elements of the SIMD pack. + + 3. The name of the function for creating the SIMD pack from individual + elements. + + 4. The name of the function for returning the elements of the SIMD pack as + multiple values." + (with-accessors ((scalar-record simd-record-scalar-record) + (width value-record-simd-width)) + (find-value-record name) + (list + (value-record-name scalar-record) + width + (or (find-symbol (format nil "MAKE-~A" (symbol-name name)) + (symbol-package name)) + (error "No constructor found for ~S." name)) + (or (find-symbol (format nil "~A-VALUES" (symbol-name name)) + (symbol-package name)) + (error "No unpacker found for ~S." name))))) + +(defun simd= (a b) + (typecase a + (sb-ext:simd-pack + (when (sb-ext:simd-pack-p b) + (multiple-value-bind (a0 a1) (sb-ext:%simd-pack-ub64s a) + (multiple-value-bind (b0 b1) (sb-ext:%simd-pack-ub64s b) + (and (= a0 b0) (= a1 b1)))))) + (sb-ext:simd-pack-256 + (when (sb-ext:simd-pack-256-p b) + (multiple-value-bind (a0 a1 a2 a3) (sb-ext:%simd-pack-256-ub64s a) + (multiple-value-bind (b0 b1 b2 b3) (sb-ext:%simd-pack-256-ub64s b) + (and (= a0 b0) (= a1 b1) (= a2 b2) (= a3 b3)))))) + (otherwise nil))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Argument Type Specifications + +(defun parse-argtypes (argtypes) + "Returns, as multiple values: + + 1. The list of mandatory argtypes. + + 2. The list of optional argtypes. + + 3. The argtype of the rest argument, or NIL if there is no &rest argtype." + (labels ((fail () + (error "Malformed argtypes list: ~S" argtypes)) + (process-mandatory (argtypes mandatory) + (if (null argtypes) + (values (reverse mandatory) '() nil) + (case (first argtypes) + ((&optional) + (process-optional (rest argtypes) mandatory '())) + ((&rest) + (process-rest (rest argtypes) mandatory '())) + (#.(set-difference lambda-list-keywords '(&optional &rest)) + (fail)) + (otherwise + (process-mandatory (rest argtypes) (cons (first argtypes) mandatory)))))) + (process-optional (argtypes mandatory optional) + (if (null argtypes) + (values (reverse mandatory) (reverse optional) nil) + (case (first argtypes) + ((&rest) + (process-rest (rest argtypes) mandatory optional)) + (#.(set-difference lambda-list-keywords '(&rest)) + (fail)) + (otherwise + (process-optional (rest argtypes) mandatory (cons (first argtypes) optional)))))) + (process-rest (argtypes mandatory optional) + (if (or (endp argtypes) + (not (endp (rest argtypes)))) + (fail) + (values (reverse mandatory) (reverse optional) (first argtypes))))) + (process-mandatory argtypes '()))) + +(defun argtypes-variants (argtypes) + "Returns a list of lists of type specifiers such that each list of type +specifiers satisfies the argument type specification given by ARGTYPES." + (multiple-value-bind (mandatory optional rest) + (parse-argtypes argtypes) + (let ((result '())) + (loop for n-optional to (length optional) do + (loop for n-rest from 0 to (if (not rest) 0 3) do + (push (append mandatory + (subseq optional 0 n-optional) + (make-list n-rest :initial-element rest)) + result))) + (reverse result)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Generators + +(defun find-generator (type) + (intern (format nil "RANDOM-~A" (symbol-name type)) + #.*package*)) + +(macrolet ((define-generators () + `(progn + ,@(loop for (type name) + in '((sb-simd:f32 random-f32) + (sb-simd:f64 random-f64) + (sb-simd:u8 random-u8) + (sb-simd:u16 random-u16) + (sb-simd:u32 random-u32) + (sb-simd:u64 random-u64) + (sb-simd:s8 random-s8) + (sb-simd:s16 random-s16) + (sb-simd:s32 random-s32) + (sb-simd:s64 random-s64)) + collect + (let ((numbers (numbers-of-type type))) + `(defun ,name () + (aref ,(coerce numbers `(simple-array ,type (*))) + (random ,(length numbers))))))))) + (define-generators)) + +(defun find-valid-simd-call (scalar-function input-generators simd-width + input-constructors output-constructors) + (let ((inputs-list '()) + (outputs-list '())) + (loop repeat simd-width do + (multiple-value-bind (inputs outputs) + (find-valid-scalar-call scalar-function input-generators) + (push inputs inputs-list) + (push outputs outputs-list))) + (values + (apply #'mapcar #'funcall input-constructors inputs-list) + (apply #'mapcar #'funcall output-constructors outputs-list)))) + +(defun find-valid-scalar-call (scalar-function input-generators) + (let ((attempts 0)) + (loop + (let ((inputs (mapcar #'funcall input-generators))) + (handler-case (return (values inputs (multiple-value-list (apply scalar-function inputs)))) + (condition () + (incf attempts) + (when (> attempts 1000) + (error "Failed to find a valid call to ~S." scalar-function)))))))) + +(defun bitwise= (a b) + (etypecase a + (rational + (when (rationalp b) + (= a b))) + (single-float + (when (typep b 'single-float) + (= (sb-kernel:single-float-bits a) + (sb-kernel:single-float-bits b)))) + (double-float + (when (typep b 'double-float) + (= (sb-kernel:double-float-bits a) + (sb-kernel:double-float-bits b)))) + (complex + (when (typep b 'complex) + (bitwise= (realpart a) (realpart b)) + (bitwise= (imagpart a) (imagpart b)))))) diff --git a/doc/manual/contrib-modules.texinfo b/doc/manual/contrib-modules.texinfo index 43f82e3b72..7862d70155 100644 --- a/doc/manual/contrib-modules.texinfo +++ b/doc/manual/contrib-modules.texinfo @@ -17,6 +17,7 @@ contributed modules. * sb-posix:: * sb-queue:: * sb-rotate-byte:: +* sb-simd:: @end menu @page @@ -43,4 +44,5 @@ contributed modules. @page @include sb-rotate-byte/sb-rotate-byte.texinfo - +@page +@include sb-simd/sb-simd.texinfo diff --git a/make-config.sh b/make-config.sh index 6149ce2b2f..7cfe5987be 100755 --- a/make-config.sh +++ b/make-config.sh @@ -271,7 +271,6 @@ find_gnumake echo "GNUMAKE=\"$GNUMAKE\"; export GNUMAKE" >> output/build-config echo "SBCL_XC_HOST=\"$SBCL_XC_HOST\"; export SBCL_XC_HOST" >> output/build-config -echo "CONTRIB_BLOCKLIST=\"$CONTRIB_BLOCKLIST\"; export CONTRIB_BLOCKLIST" >> output/build-config if [ -n "$SBCL_HOST_LOCATION" ]; then echo "SBCL_HOST_LOCATION=\"$SBCL_HOST_LOCATION\"; export SBCL_HOST_LOCATION" >> output/build-config fi @@ -492,6 +491,13 @@ echo ';;;; Please do not edit it by hand.' >> $ltf echo ';;;; See make-config.sh.' >> $ltf echo "(lambda (features) (set-difference (union features (list :${sbcl_arch}$WITH_FEATURES " >> $ltf +# Automatically block sb-simd on non-x86 platforms, at least for now. +case "$sbcl_arch" in + x86-64) ;; *) CONTRIB_BLOCKLIST="$CONTRIB_BLOCKLIST sb-simd" ;; +esac + +echo "CONTRIB_BLOCKLIST=\"$CONTRIB_BLOCKLIST\"; export CONTRIB_BLOCKLIST" >> output/build-config + echo //setting up OS-dependent information original_dir=`pwd` From 3189adf43f90a8cb7a99d952caa6cd60017ee466 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 21 Jun 2022 13:59:06 +0300 Subject: [PATCH 3558/4023] Rename CONTRIB_BLOCKLIST to SBCL_CONTRIB_BLOCKLIST. And read its value in make-config.sh --- contrib/Makefile | 2 +- make-config.sh | 10 ++++++---- make-target-contrib.sh | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/contrib/Makefile b/contrib/Makefile index c189c9705c..5c9fb76693 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -5,7 +5,7 @@ contribs = asdf sb-posix sb-bsd-sockets sb-introspect sb-cltl2 sb-aclrepl \ sb-queue sb-rotate-byte sb-simple-streams sb-concurrency sb-cover \ sb-graph sb-simd -active_contribs = $(filter-out $(CONTRIB_BLOCKLIST),$(contribs)) +active_contribs = $(filter-out $(SBCL_CONTRIB_BLOCKLIST),$(contribs)) fasls = $(active_contribs:=.fasl) diff --git a/make-config.sh b/make-config.sh index 7cfe5987be..8360567152 100755 --- a/make-config.sh +++ b/make-config.sh @@ -43,7 +43,9 @@ for dir in `cd contrib ; echo *`; do CONTRIBS="$CONTRIBS ${dir}" fi done -CONTRIB_BLOCKLIST="" +SBCL_CONTRIB_BLOCKLIST=${SBCL_CONTRIB_BLOCKLIST:-""} + +echo $SBCL_CONTRIB_BLOCKLIST perform_host_lisp_check=no fancy=false @@ -97,7 +99,7 @@ do WITHOUT_FEATURES="$WITHOUT_FEATURES :$optarg" case $CONTRIBS in *"$optarg"*) - CONTRIB_BLOCKLIST="$CONTRIB_BLOCKLIST $optarg" + SBCL_CONTRIB_BLOCKLIST="$SBCL_CONTRIB_BLOCKLIST $optarg" ;; esac ;; --fancy) @@ -493,10 +495,10 @@ echo "(lambda (features) (set-difference (union features (list :${sbcl_arch}$WIT # Automatically block sb-simd on non-x86 platforms, at least for now. case "$sbcl_arch" in - x86-64) ;; *) CONTRIB_BLOCKLIST="$CONTRIB_BLOCKLIST sb-simd" ;; + x86-64) ;; *) SBCL_CONTRIB_BLOCKLIST="$SBCL_CONTRIB_BLOCKLIST sb-simd" ;; esac -echo "CONTRIB_BLOCKLIST=\"$CONTRIB_BLOCKLIST\"; export CONTRIB_BLOCKLIST" >> output/build-config +echo "SBCL_CONTRIB_BLOCKLIST=\"$SBCL_CONTRIB_BLOCKLIST\"; export SBCL_CONTRIB_BLOCKLIST" >> output/build-config echo //setting up OS-dependent information diff --git a/make-target-contrib.sh b/make-target-contrib.sh index c69a6e8f3c..941ecc0116 100755 --- a/make-target-contrib.sh +++ b/make-target-contrib.sh @@ -102,7 +102,7 @@ contrib_dirs="" for candidate in $contrib_candidates do if [ -d "contrib/$candidate" -a -f "contrib/$candidate/Makefile" ]; then - case $CONTRIB_BLOCKLIST in + case $SBCL_CONTRIB_BLOCKLIST in *"$candidate"*) ;; *) contrib_dirs="$contrib_dirs $candidate" ;; esac From 28261d411772e25f11e4b457182abb0a6ceb5dad Mon Sep 17 00:00:00 2001 From: Marco Heisig <marco.heisig@fau.de> Date: Tue, 21 Jun 2022 14:21:58 +0200 Subject: [PATCH 3559/4023] Ensure that sb-simd builds without sb-unicode. --- contrib/sb-simd/code/instruction-sets/avx.lisp | 4 ++++ .../sb-simd/code/instruction-sets/sb-simd.lisp | 1 + contrib/sb-simd/code/instruction-sets/sse2.lisp | 2 ++ contrib/sb-simd/code/packages.lisp | 16 +++++++++++++--- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/contrib/sb-simd/code/instruction-sets/avx.lisp b/contrib/sb-simd/code/instruction-sets/avx.lisp index e51f075992..aa422c56ca 100644 --- a/contrib/sb-simd/code/instruction-sets/avx.lisp +++ b/contrib/sb-simd/code/instruction-sets/avx.lisp @@ -639,7 +639,9 @@ (s64.4-insert-s64.2 #:vinsertf128 (s64.4) (s64.4 s64.2 imm1) :cost 1) (s64.4-permute128 #:vperm2f128 (s64.4) (s64.4 s64.4 imm8) :cost 1)) (:loads + #+sb-unicode (u32.4-load-from-string #:vmovdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref) + #+sb-unicode (u32.8-load-from-string #:vmovdqu u32.8 charvec char-array u32.8-string-ref u32.8-row-major-string-ref) (f32-load #:vmovss f32 f32vec f32-array f32-aref f32-row-major-aref) (f64-load #:vmovsd f64 f64vec f64-array f64-aref f64-row-major-aref) @@ -664,7 +666,9 @@ (s32.8-load #:vmovdqu s32.8 s32vec s32-array s32.8-aref s32.8-row-major-aref) (s64.4-load #:vmovdqu s64.4 s64vec s64-array s64.4-aref s64.4-row-major-aref)) (:stores + #+sb-unicode (u32.4-store-into-string #:vmovdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref) + #+sb-unicode (u32.8-store-into-string #:vmovdqu u32.8 charvec char-array u32.8-string-ref u32.8-row-major-string-ref) (f32-store #:vmovss f32 f32vec f32-array f32-aref f32-row-major-aref) (f64-store #:vmovsd f64 f64vec f64-array f64-aref f64-row-major-aref) diff --git a/contrib/sb-simd/code/instruction-sets/sb-simd.lisp b/contrib/sb-simd/code/instruction-sets/sb-simd.lisp index 5595a0e0b2..2743243e8e 100644 --- a/contrib/sb-simd/code/instruction-sets/sb-simd.lisp +++ b/contrib/sb-simd/code/instruction-sets/sb-simd.lisp @@ -19,6 +19,7 @@ (f32 32 single-float #:single-float (#:single-reg)) (f64 64 double-float #:double-float (#:double-reg)) ;; Vectors + #+sb-unicode (charvec 64 (simple-array character (*)) #:simple-character-string) ( u8vec 64 (simple-array (unsigned-byte 8) (*)) #:simple-array-unsigned-byte-8) (u16vec 64 (simple-array (unsigned-byte 16) (*)) #:simple-array-unsigned-byte-16) diff --git a/contrib/sb-simd/code/instruction-sets/sse2.lisp b/contrib/sb-simd/code/instruction-sets/sse2.lisp index f40c67e4b2..3984ec3d45 100644 --- a/contrib/sb-simd/code/instruction-sets/sse2.lisp +++ b/contrib/sb-simd/code/instruction-sets/sse2.lisp @@ -309,6 +309,7 @@ (s64.2-shiftl #:psllq-imm (s64.2) (s64.2 imm6) :cost 1 :encoding :sse) (s64.2-shiftr #:psrlq-imm (s64.2) (s64.2 imm6) :cost 1 :encoding :sse)) (:loads + #+sb-unicode (u32.4-load-from-string #:movdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref) (f64-load #:movsd f64 f64vec f64-array f64-aref f64-row-major-aref) (f64.2-load #:movupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref) @@ -321,6 +322,7 @@ (s32.4-load #:movdqu s32.4 s32vec s32-array s32.4-aref s32.4-row-major-aref) (s64.2-load #:movdqu s64.2 s64vec s64-array s64.2-aref s64.2-row-major-aref)) (:stores + #+sb-unicode (u32.4-store-into-string #:movdqu u32.4 charvec char-array u32.4-string-ref u32.4-row-major-string-ref) (f64-store #:movsd f64 f64vec f64-array f64-aref f64-row-major-aref) (f64.2-store #:movupd f64.2 f64vec f64-array f64.2-aref f64.2-row-major-aref) diff --git a/contrib/sb-simd/code/packages.lisp b/contrib/sb-simd/code/packages.lisp index 07859f740b..a3dea97699 100644 --- a/contrib/sb-simd/code/packages.lisp +++ b/contrib/sb-simd/code/packages.lisp @@ -549,6 +549,7 @@ #:s64-aref #:s64-row-major-aref ;; Simple Strings + #+sb-unicode #:charvec #:char-array ;; Integer Packers @@ -805,7 +806,10 @@ #:u32.4-decf #:u32.4-aref #:u32.4-row-major-aref #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref - #:u32.4-string-ref #:u32.4-row-major-string-ref + #+sb-unicode + #:u32.4-string-ref + #+sb-unicode + #:u32.4-row-major-string-ref ;; u64.2 #:make-u64.2 #:u64.2 @@ -1393,7 +1397,10 @@ #:u32.4-permute #:u32.4-aref #:u32.4-row-major-aref #:u32.4-non-temporal-aref #:u32.4-non-temporal-row-major-aref - #:u32.4-string-ref #:u32.4-row-major-string-ref + #+sb-unicode + #:u32.4-string-ref + #+sb-unicode + #:u32.4-row-major-string-ref ;; u64.2 #:make-u64.2 #:u64.2 @@ -1450,7 +1457,10 @@ #:u32.8-insert-u32.4 #:u32.8-aref #:u32.8-row-major-aref #:u32.8-non-temporal-aref #:u32.8-non-temporal-row-major-aref - #:u32.8-string-ref #:u32.8-row-major-string-ref + #+sb-unicode + #:u32.8-string-ref + #+sb-unicode + #:u32.8-row-major-string-ref ;; u64.4 #:make-u64.4 #:u64.4 From 286a16d6d4b325c4bc45ef3087f1ebbb7d2976b8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 21 Jun 2022 15:27:41 +0300 Subject: [PATCH 3560/4023] ppc64: fix overflow when compiling subtraction of negative constants. Can't turn subtraction into addition in that case. Reported by Eric Marsden. --- src/compiler/ppc64/arith.lisp | 19 ++++++++++++++++--- tests/arith.pure.lisp | 8 ++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/compiler/ppc64/arith.lisp b/src/compiler/ppc64/arith.lisp index 79654c0927..4bdd487bfb 100644 --- a/src/compiler/ppc64/arith.lisp +++ b/src/compiler/ppc64/arith.lisp @@ -190,13 +190,26 @@ `(progn (define-vop (,(symbolicate 'fast- translate '-c/fixnum=>fixnum) fast-fixnum-binop-c) (:translate ,translate) - (:generator 1 (generate-fast-+-c r x (fixnumize (,translate y))))) + (:generator 1 + (cond ((and (eq ',translate '-) + (= y most-negative-fixnum)) + (inst lr temp-reg-tn (fixnumize y)) + (inst sub r x temp-reg-tn)) + (t + (generate-fast-+-c r x (fixnumize (,translate y))))))) (define-vop (,(symbolicate 'fast- translate '-c/signed=>signed) fast-signed-binop-c) (:translate ,translate) - (:generator ,untagged-penalty (generate-fast-+-c r x (,translate y)))) + (:generator ,untagged-penalty + (cond ((and (eq ',translate '-) + (= y (- (expt 2 (1- n-word-bits))))) + (inst lr temp-reg-tn y) + (inst sub r x temp-reg-tn)) + (t + (generate-fast-+-c r x (,translate y)))))) (define-vop (,(symbolicate 'fast- translate '-c/unsigned=>unsigned) fast-unsigned-binop-c) (:translate ,translate) - (:generator ,untagged-penalty (generate-fast-+-c r x (,translate y))))))) + (:generator ,untagged-penalty + (generate-fast-+-c r x (,translate y))))))) (define-const-binop + 4) (define-const-binop - 4)) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index 04747e2a17..d9b6bfb517 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -1062,3 +1062,11 @@ (truly-the sb-vm:signed-word (ash a b))) ((-44 (- (expt 2 (1- sb-vm:n-word-bits)))) -1) ((44 2) 176))) + +(with-test (:name :-constant-mnf) + (checked-compile-and-assert + () + `(lambda (a) + (logand most-positive-fixnum + (- (the fixnum a) most-negative-fixnum))) + ((10) 10))) From 9bf8ab85e66494668bf44949ea805cdfc9da705f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 21 Jun 2022 16:59:13 +0300 Subject: [PATCH 3561/4023] Don't build sb-simd if the host doesn't support AVX2. --- .gitignore | 1 + make-config.sh | 12 ++++++++---- tools-for-build/avx2.c | 4 ++++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 tools-for-build/avx2.c diff --git a/.gitignore b/.gitignore index 9332c14882..e654f02068 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ tests/*.so tests/run-tests-* tests/last-random-state.lisp-expr tests/ansi-test/ +tools-for-build/avx2* tools-for-build/determine-endianness tools-for-build/determine-endianness.exe tools-for-build/grovel-headers diff --git a/make-config.sh b/make-config.sh index 8360567152..3915c16e62 100755 --- a/make-config.sh +++ b/make-config.sh @@ -45,8 +45,6 @@ for dir in `cd contrib ; echo *`; do done SBCL_CONTRIB_BLOCKLIST=${SBCL_CONTRIB_BLOCKLIST:-""} -echo $SBCL_CONTRIB_BLOCKLIST - perform_host_lisp_check=no fancy=false some_options=false @@ -498,8 +496,6 @@ case "$sbcl_arch" in x86-64) ;; *) SBCL_CONTRIB_BLOCKLIST="$SBCL_CONTRIB_BLOCKLIST sb-simd" ;; esac -echo "SBCL_CONTRIB_BLOCKLIST=\"$SBCL_CONTRIB_BLOCKLIST\"; export SBCL_CONTRIB_BLOCKLIST" >> output/build-config - echo //setting up OS-dependent information original_dir=`pwd` @@ -658,6 +654,12 @@ case "$sbcl_arch" in ;; x86-64) printf ' :sb-simd-pack :sb-simd-pack-256 :avx2' >> $ltf # not mandatory + + $GNUMAKE -C tools-for-build avx2 + if tools-for-build/avx2; then + SBCL_CONTRIB_BLOCKLIST="$SBCL_CONTRIB_BLOCKLIST sb-simd" + fi + case "$sbcl_os" in linux | darwin | *bsd) printf ' :immobile-space' >> $ltf @@ -709,6 +711,8 @@ echo //finishing $ltf printf " %s" "`cat crossbuild-runner/backends/${sbcl_arch}/features`" >> $ltf echo ")) (list$WITHOUT_FEATURES)))" >> $ltf +echo "SBCL_CONTRIB_BLOCKLIST=\"$SBCL_CONTRIB_BLOCKLIST\"; export SBCL_CONTRIB_BLOCKLIST" >> output/build-config + # FIXME: The version system should probably be redone along these lines: # # echo //setting up version information. diff --git a/tools-for-build/avx2.c b/tools-for-build/avx2.c new file mode 100644 index 0000000000..b16956fb23 --- /dev/null +++ b/tools-for-build/avx2.c @@ -0,0 +1,4 @@ +int main () { + __builtin_cpu_init(); + return __builtin_cpu_supports("avx2") != 0; +} From 1bfe99e3747658fef2e64ad816cced3b2955350b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 21 Jun 2022 10:54:36 -0400 Subject: [PATCH 3562/4023] Fix genesis bug from 978db15c80 --- src/compiler/generic/genesis.lisp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 0f712a5d58..a01e14320a 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2820,8 +2820,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (binding* ((alloc-points (svref fixups index) :exit-if-null)) (cold-set 'sb-c::*!cold-allocation-patch-point* (cold-cons (cold-cons code-obj alloc-points) - (cold-symbol-value (cold-intern - 'sb-c::*!cold-allocation-patch-point*))))) + (cold-symbol-value 'sb-c::*!cold-allocation-patch-point*)))) (loop (when (>= index end) (return)) (binding* (((offset kind flavor) From f764e96bad2bc5c954968311805bfdc782ce6477 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 13 May 2022 14:51:50 +0100 Subject: [PATCH 3563/4023] Move generated data files to output/ Keeping them in obj/ makes for hard-to-interpret reports of differences between cross-compiler hosts, because of different interpretations of *print-readably* with (hopefully) no effect on the final artifacts. --- make-genesis-2.lisp | 7 ++----- src/code/target-thread.lisp | 3 +-- src/cold/compile-cold-sbcl.lisp | 3 +-- src/cold/shared.lisp | 3 +-- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/make-genesis-2.lisp b/make-genesis-2.lisp index cb17160e1a..75b9f5202f 100644 --- a/make-genesis-2.lisp +++ b/make-genesis-2.lisp @@ -14,11 +14,8 @@ (push (stem-object-path stem flags :target-compile) list))) (nreverse list)) - :defstruct-descriptions (stem-object-path - "defstructs.lisp-expr" '(:extra-artifact) :target-compile) - :tls-init (read-from-file - (stem-object-path "tls-init.lisp-expr" - '(:extra-artifact) :target-compile)) + :defstruct-descriptions (find-bootstrap-file "output/defstructs.lisp-expr") + :tls-init (read-from-file "output/tls-init.lisp-expr") :c-header-dir-name "output/genesis-2" :symbol-table-file-name "src/runtime/sbcl.nm" :core-file-name "output/cold-sbcl.core" diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index 1d95681a86..bb1c8ac88f 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -2571,8 +2571,7 @@ mechanism for inter-thread communication." (eval-when (:compile-toplevel) ;; Inform genesis of the index <-> symbol mapping made by DEFINE-THREAD-LOCAL - (with-open-file (output (sb-cold:stem-object-path "tls-init.lisp-expr" - '(:extra-artifact) :target-compile) + (with-open-file (output (sb-cold:find-bootstrap-file "output/tls-init.lisp-expr") :direction :output :if-exists :supersede) (let ((list (mapcar (lambda (x &aux (symbol (car x))) (cons (info :variable :wired-tls symbol) symbol)) diff --git a/src/cold/compile-cold-sbcl.lisp b/src/cold/compile-cold-sbcl.lisp index 52367d64ed..8f23455042 100644 --- a/src/cold/compile-cold-sbcl.lisp +++ b/src/cold/compile-cold-sbcl.lisp @@ -224,5 +224,4 @@ (format t "~&~50t ~f~%" total-time)) (sb-c::dump/restore-interesting-types 'write))) (sb-kernel::write-structure-definitions-as-text - (sb-cold:stem-object-path "defstructs.lisp-expr" - '(:extra-artifact) :target-compile))))) + (sb-cold:find-bootstrap-file "output/defstructs.lisp-expr"))))) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index b8ce82702c..2866bd21b1 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -484,8 +484,7 @@ (pathname-type (compile-file-pathname stem))))) (:target-compile (values *target-obj-prefix* - (cond ((find :extra-artifact flags) "") - ((find :assem flags) *target-assem-obj-suffix*) + (cond ((find :assem flags) *target-assem-obj-suffix*) (t *target-obj-suffix*))))) (concatenate 'string obj-prefix (stem-remap-target stem) obj-suffix))) (compile 'stem-object-path) From 2dfe932d0a86eea307e1b51a9401e95d70b41736 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 16 May 2022 11:23:35 +0100 Subject: [PATCH 3564/4023] Make explicit which generated sources are build-dependent (For example because of different build-time options) --- make-genesis-2.lisp | 4 ++-- src/code/target-thread.lisp | 2 +- src/cold/compile-cold-sbcl.lisp | 2 +- src/cold/shared.lisp | 17 +++++++++++------ src/cold/slam.lisp | 2 +- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/make-genesis-2.lisp b/make-genesis-2.lisp index 75b9f5202f..2b68e997ae 100644 --- a/make-genesis-2.lisp +++ b/make-genesis-2.lisp @@ -14,8 +14,8 @@ (push (stem-object-path stem flags :target-compile) list))) (nreverse list)) - :defstruct-descriptions (find-bootstrap-file "output/defstructs.lisp-expr") - :tls-init (read-from-file "output/tls-init.lisp-expr") + :defstruct-descriptions (find-bootstrap-file "output/defstructs.lisp-expr" t) + :tls-init (read-from-file "output/tls-init.lisp-expr" :build-dependent t) :c-header-dir-name "output/genesis-2" :symbol-table-file-name "src/runtime/sbcl.nm" :core-file-name "output/cold-sbcl.core" diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index bb1c8ac88f..ef861bedff 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -2571,7 +2571,7 @@ mechanism for inter-thread communication." (eval-when (:compile-toplevel) ;; Inform genesis of the index <-> symbol mapping made by DEFINE-THREAD-LOCAL - (with-open-file (output (sb-cold:find-bootstrap-file "output/tls-init.lisp-expr") + (with-open-file (output (sb-cold:find-bootstrap-file "output/tls-init.lisp-expr" t) :direction :output :if-exists :supersede) (let ((list (mapcar (lambda (x &aux (symbol (car x))) (cons (info :variable :wired-tls symbol) symbol)) diff --git a/src/cold/compile-cold-sbcl.lisp b/src/cold/compile-cold-sbcl.lisp index 8f23455042..7ff723b491 100644 --- a/src/cold/compile-cold-sbcl.lisp +++ b/src/cold/compile-cold-sbcl.lisp @@ -224,4 +224,4 @@ (format t "~&~50t ~f~%" total-time)) (sb-c::dump/restore-interesting-types 'write))) (sb-kernel::write-structure-definitions-as-text - (sb-cold:find-bootstrap-file "output/defstructs.lisp-expr"))))) + (sb-cold:find-bootstrap-file "output/defstructs.lisp-expr" t))))) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 2866bd21b1..4c1f919d45 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -169,13 +169,15 @@ (compile 'rename-file-a-la-unix) (export '(*target-sbcl-version* *generated-sources-root* + *build-dependent-generated-sources-root* stem-source-path find-bootstrap-file read-from-file)) (defvar *sources-root* "") (defvar *generated-sources-root* "") +(defvar *build-dependent-generated-sources-root* "") (defvar *src-cold-shared-pathname* *load-pathname*) ;;; See remark in COMPILE-STEM about strings vs. The Common Lisp Way -(defun find-bootstrap-file (namestring) +(defun find-bootstrap-file (namestring &optional build-dependent) (cond ((char= (char namestring 0) #\^) ;; If it starts with a "^" then it means "src/cold/..." (let ((this *src-cold-shared-pathname*) @@ -190,7 +192,9 @@ ;; in the tree as checked in, or generated by a prior build step. (concatenate 'string (if (eql (mismatch "output/" namestring) 7) ; a generated source - *generated-sources-root* + (if build-dependent + *build-dependent-generated-sources-root* + *generated-sources-root*) *sources-root*) namestring)) (t @@ -201,9 +205,10 @@ ;;; Return an expression read from the file named NAMESTRING. ;;; For user-supplied inputs, protect against more than one expression -;;; appearing in the file. For in-tree inputs we needn't bother. -(defun read-from-file (namestring &optional (enforce-single-expr t)) - (with-open-file (s (find-bootstrap-file namestring)) +;;; appearing in the file. (Our ^build-order.lisp-expr file has more than +;;; one expression in it, so we need to be able to not enforce.) +(defun read-from-file (namestring &key (enforce-single-expr t) build-dependent) + (with-open-file (s (find-bootstrap-file namestring build-dependent)) (let* ((result (read s)) (eof-result (cons nil nil))) (unless enforce-single-expr @@ -505,7 +510,7 @@ ;; to produce warnings as a bug workaround. (let ((cl:*features* (cons feature cl:*features*)) (*readtable* *xc-readtable*)) - (read-from-file "^build-order.lisp-expr" nil)))) + (read-from-file "^build-order.lisp-expr" :enforce-single-expr nil)))) (setf *stems-and-flags* (cons build-phase list))) ;; Now check for duplicate stems and bogus flags. (let ((stems (make-hash-table :test 'equal))) diff --git a/src/cold/slam.lisp b/src/cold/slam.lisp index d2df9e99f8..c954d915f9 100644 --- a/src/cold/slam.lisp +++ b/src/cold/slam.lisp @@ -46,7 +46,7 @@ ;;; :trace-file as a flag. (setf *stems-and-flags* (let ((*readtable* *xc-readtable*)) - (read-from-file "^build-order.lisp-expr" nil))) + (read-from-file "^build-order.lisp-expr" :enforce-single-expr nil))) ;;; Don't care about deftransforms that get redefined. ;;; The target condition is defined in 'condition' which is a :not-host file. From 0dc473d42b014cb0cdc57b504998ecae08fbd466 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 13 May 2022 14:59:32 +0100 Subject: [PATCH 3565/4023] Perform fasl comparisons for clisp and cmucl too They (probably) don't actually produce binary-identical fasls all the time yet, so don't check for failure, but do produce the artifacts for debugging purposes. --- .github/workflows/cl-host.yml | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cl-host.yml b/.github/workflows/cl-host.yml index 35abf02650..327feb4445 100644 --- a/.github/workflows/cl-host.yml +++ b/.github/workflows/cl-host.yml @@ -48,11 +48,20 @@ jobs: - name: instal host clisp run: | sudo apt-get -qq update | true - sudo apt-get -qq install clisp + sudo apt-get -qq install clisp git-restore-mtime - name: build env: SBCL_MAKE_TARGET_2_OPTIONS: --disable-ldb --disable-debugger - run: ./make.sh --xc-host='clisp -on-error exit' + run: | + git restore-mtime + ./make.sh --xc-host='clisp -on-error exit' + - name: archive clisp-xc fasls + run: tar --transform 's,^,clisp-host/,' -cf clisp-host-fasls.tgz obj/from-xc/ + - name: upload clisp-xc archive + uses: actions/upload-artifact@v3 + with: + name: xc-host-fasls + path: clisp-host-fasls.tgz ccl: @@ -95,11 +104,22 @@ jobs: wget -q https://github.com/sbcl/sbcl/releases/download/sbcl-1.4.14/cmucl.tar.bz2 tar xf cmucl.tar.bz2 echo '(setf ext:*gc-verbose* nil)' > ~/.cmucl-init.lisp + sudo apt-get -qq update | true + sudo apt-get -qq install git-restore-mtime working-directory: /tmp/ - name: build env: SBCL_MAKE_TARGET_2_OPTIONS: --disable-ldb --disable-debugger - run: ./make.sh --xc-host='/tmp/cmucl/bin/lisp -batch' + run: | + git restore-mtime + ./make.sh --xc-host='/tmp/cmucl/bin/lisp -batch' + - name: archive cmucl-xc fasls + run: tar --transform 's,^,cmucl-host/,' -cf cmucl-host-fasls.tgz obj/from-xc/ + - name: upload cmucl-xc archive + uses: actions/upload-artifact@v3 + with: + name: xc-host-fasls + path: cmucl-host-fasls.tgz sbcl: @@ -130,7 +150,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 - needs: [ccl, sbcl] + needs: [ccl, sbcl, cmucl, clisp] steps: - name: download xc-host fasls @@ -141,5 +161,10 @@ jobs: run: | tar xf ccl-host-fasls.tgz tar xf sbcl-host-fasls.tgz + tar xf clisp-host-fasls.tgz + tar xf cmucl-host-fasls.tgz - name: compare xc-host fasls - run: diff -ur sbcl-host/ ccl-host/ + run: | + diff -ur sbcl-host/ ccl-host/ + diff -ur sbcl-host/ clisp-host/ || true + diff -ur sbcl-host/ cmucl-host/ || true From ac59b7b217c29c78972e4ed194c33ee11d77fa55 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Tue, 21 Jun 2022 20:50:24 +0100 Subject: [PATCH 3566/4023] Add some NEWS items --- NEWS | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 2061a0d739..9eace98232 100644 --- a/NEWS +++ b/NEWS @@ -1,13 +1,26 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.2.5: - * minor incompatible change: support for 32-bit x86 on macOS has been removed. + * minor incompatible change: support for 32-bit x86 on macOS has been + removed. + * new contrib: sb-simd, to provide a convenient interface for SIMD + programming. (Thanks to Marco Heisig and other sb-simd contributors) * enhancement: core compression now uses zstd instead of zlib. + * enhancement: provide compiler warnings for specialized array type + mismatches in CONCATENATE. + * enhancement: provide compiler warnings for bad sequence bounding index + designator arguments to sequence functions. + * enhancement: The sb-mpfr contrib now allows coercion from MPFR-FLOATs + to CL:RATIONAL. (Thanks to Robert Smith) + * bug fix: fix compilation failure related to declaiming types of constants. + (lp#1977726, reported by Pierre Neidhardt) * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. - * optimization: faster [n]string-down/upcase. + * optimization: faster string comparisons on arm64, x86-64. + * optimization: faster [n]string-down/upcase on arm64, x86-64. * optimization: faster [n]reverse for 8- and 32-bit element vectors on arm64, x86-64. + * optimization: faster type tests for (CONS (EQL symbol)) on x86-64. changes in sbcl-2.2.5 relative to sbcl-2.2.4: * minor incompatible change: SB-EXT:*DERIVE-FUNCTION-TYPES* being NIL now From c785170d4049bfd7a3fceb7779a3b2674d4dd7bc Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Tue, 21 Jun 2022 20:55:35 +0100 Subject: [PATCH 3567/4023] One more NEWS item for sbcl-2.2.6 --- NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9eace98232..13ecb19d6c 100644 --- a/NEWS +++ b/NEWS @@ -5,7 +5,7 @@ changes relative to sbcl-2.2.5: removed. * new contrib: sb-simd, to provide a convenient interface for SIMD programming. (Thanks to Marco Heisig and other sb-simd contributors) - * enhancement: core compression now uses zstd instead of zlib. + * enhancement: core compression now uses zstd instead of zlib. (lp#1881089) * enhancement: provide compiler warnings for specialized array type mismatches in CONCATENATE. * enhancement: provide compiler warnings for bad sequence bounding index @@ -14,6 +14,7 @@ changes relative to sbcl-2.2.5: to CL:RATIONAL. (Thanks to Robert Smith) * bug fix: fix compilation failure related to declaiming types of constants. (lp#1977726, reported by Pierre Neidhardt) + * bug fix: fix race condition in CLOS optimized constructors. (lp#1951341) * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. * optimization: faster string comparisons on arm64, x86-64. From 4fda4643e2ba55ea1b9bcca1c2be1d5ed305dc30 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 22 Jun 2022 00:25:28 +0300 Subject: [PATCH 3568/4023] arm64: correctly disassemble SBCS. --- src/compiler/arm64/insts.lisp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index febca4d0cd..1c263db3ed 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -603,7 +603,7 @@ :default-printer '(:name :tab rd ", " rn ", " rm)) (op2 :field (byte 8 21) :value #b11010000) (rm :field (byte 5 16) :type 'reg) - (op :field (byte 6 10) :value 0) + (op3 :field (byte 6 10) :value 0) (rn :type 'reg) (rd :type 'reg)) @@ -611,7 +611,9 @@ `(define-instruction ,name (segment rd rn rm) (:printer add-sub-carry ((op ,opc))) (:emitter - (emit-add-sub-carry segment +64-bit-size+ ,opc + (emit-add-sub-carry segment + (reg-size rd) + ,opc (reg-offset rm) (reg-offset rn) (reg-offset rd))))) (def-add-sub-carry adc #b00) @@ -1221,7 +1223,9 @@ (:printer data-processing-3 ((op31 ,op31) (o0 ,o0))) ,@printers (:emitter - (emit-data-processing-3 segment +64-bit-size+ ,op31 + (emit-data-processing-3 segment + (reg-size rd) + ,op31 (reg-offset rm) ,o0 (reg-offset ra) (reg-offset rn) (reg-offset rd))))) @@ -1247,14 +1251,14 @@ (:printer data-processing-3 ((op31 #b010) (o0 0) (ra 31)) '(:name :tab rd ", " rn ", " rm)) (:emitter - (emit-data-processing-3 segment +64-bit-size+ #b010 (reg-offset rm) + (emit-data-processing-3 segment (reg-size rd) #b010 (reg-offset rm) 0 31 (reg-offset rn) (reg-offset rd)))) (define-instruction umulh (segment rd rn rm) (:printer data-processing-3 ((op31 #b110) (o0 0) (ra 31)) '(:name :tab rd ", " rn ", " rm)) (:emitter - (emit-data-processing-3 segment +64-bit-size+ #b110 (reg-offset rm) + (emit-data-processing-3 segment (reg-size rd) #b110 (reg-offset rm) 0 31 (reg-offset rn) (reg-offset rd)))) ;;; From aa82518b13a3b8a5bfea42149b0e02a4487b8f20 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 22 Jun 2022 15:36:42 +0300 Subject: [PATCH 3569/4023] Split bignum-truncate-single-digit from bignum-truncate. No need to create a small bignum. --- src/code/bignum.lisp | 350 +++++++++++++++++++++++------------------- src/code/numbers.lisp | 11 +- src/cold/exports.lisp | 2 +- 3 files changed, 197 insertions(+), 166 deletions(-) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index f577d80f6b..4a4757e3c4 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -1675,118 +1675,67 @@ (declare (muffle-conditions compiler-note)) ; returns lispobj, so what. (let (truncate-x truncate-y) (labels - ;;; Divide X by Y when Y is a single bignum digit. BIGNUM-TRUNCATE - ;;; fixes up the quotient and remainder with respect to sign and - ;;; normalization. - ;;; - ;;; We don't have to worry about shifting Y to make its most - ;;; significant digit sufficiently large for %BIGFLOOR to return - ;;; digit-size quantities for the q-digit and r-digit. If Y is - ;;; a single digit bignum, it is already large enough for - ;;; %BIGFLOOR. That is, it has some bits on pretty high in the - ;;; digit. - ((bignum-truncate-single-digit (x len-x y) - (declare (type bignum-length len-x)) - (let ((y (%bignum-ref y 0))) - (declare (type bignum-element-type y)) - (if (not (logtest y (1- y))) - ;; Y is a power of two. - ;; SHIFT-RIGHT-UNALIGNED won't do the right thing - ;; with a shift count of 0 or -1, so special case this. - (cond ((= y 0) - (error 'division-by-zero :operation 'truncate - :operands (list x y))) - ((= y 1) - ;; We could probably get away with (VALUES X 0) - ;; here, but it's not clear that some of the - ;; normalization logic further down would avoid - ;; mutilating X. Just go ahead and cons, consing's - ;; cheap. - (values (copy-bignum x len-x) 0)) - (t - (let ((n-bits (1- (integer-length y)))) - (values - (shift-right-unaligned x 0 n-bits len-x - ((= j res-len-1) - (setf (%bignum-ref res j) - (%ashr (%bignum-ref x i) n-bits)) - res) - res) - (logand (%bignum-ref x 0) (1- y)))))) - (do ((i (1- len-x) (1- i)) - (q (%allocate-bignum len-x)) - (r 0)) - ((minusp i) - (let ((rem (%allocate-bignum 1))) - (setf (%bignum-ref rem 0) r) - (values q rem))) - (declare (type bignum-element-type r)) - (multiple-value-bind (q-digit r-digit) - (%bigfloor r (%bignum-ref x i) y) - (declare (type bignum-element-type q-digit r-digit)) - (setf (%bignum-ref q i) q-digit) - (setf r r-digit)))))) - ;;; This returns a guess for the next division step. Y1 is the - ;;; highest y digit, and y2 is the second to highest y - ;;; digit. The x... variables are the three highest x digits - ;;; for the next division step. - ;;; - ;;; From Knuth, our guess is either all ones or x-i and x-i-1 - ;;; divided by y1, depending on whether x-i and y1 are the - ;;; same. We test this guess by determining whether guess*y2 - ;;; is greater than the three high digits of x minus guess*y1 - ;;; shifted left one digit: - ;;; ------------------------------ - ;;; | x-i | x-i-1 | x-i-2 | - ;;; ------------------------------ - ;;; ------------------------------ - ;;; - | g*y1 high | g*y1 low | 0 | - ;;; ------------------------------ - ;;; ... < guess*y2 ??? - ;;; If guess*y2 is greater, then we decrement our guess by one - ;;; and try again. This returns a guess that is either - ;;; correct or one too large. - (bignum-truncate-guess (y1 y2 x-i x-i-1 x-i-2) + ;; This returns a guess for the next division step. Y1 is the + ;; highest y digit, and y2 is the second to highest y + ;; digit. The x... variables are the three highest x digits + ;; for the next division step. + ;; + ;; From Knuth, our guess is either all ones or x-i and x-i-1 + ;; divided by y1, depending on whether x-i and y1 are the + ;; same. We test this guess by determining whether guess*y2 + ;; is greater than the three high digits of x minus guess*y1 + ;; shifted left one digit: + ;; ------------------------------ + ;; | x-i | x-i-1 | x-i-2 | + ;; ------------------------------ + ;; ------------------------------ + ;; - | g*y1 high | g*y1 low | 0 | + ;; ------------------------------ + ;; ... < guess*y2 ??? + ;; If guess*y2 is greater, then we decrement our guess by one + ;; and try again. This returns a guess that is either + ;; correct or one too large. + ((bignum-truncate-guess (y1 y2 x-i x-i-1 x-i-2) (declare (type bignum-element-type y1 y2 x-i x-i-1 x-i-2)) (let ((guess (if (= x-i y1) all-ones-digit (%bigfloor x-i x-i-1 y1)))) (declare (type bignum-element-type guess)) (loop - (multiple-value-bind (high-guess*y1 low-guess*y1) - (%multiply guess y1) - (declare (type bignum-element-type low-guess*y1 - high-guess*y1)) - (multiple-value-bind (high-guess*y2 low-guess*y2) - (%multiply guess y2) - (declare (type bignum-element-type high-guess*y2 - low-guess*y2)) - (multiple-value-bind (middle-digit borrow) - (%subtract-with-borrow x-i-1 low-guess*y1 1) - (declare (type bignum-element-type middle-digit) - (fixnum borrow)) - ;; Supplying borrow of 1 means there was no - ;; borrow, and we know x-i-2 minus 0 requires - ;; no borrow. - (let ((high-digit (%subtract-with-borrow x-i - high-guess*y1 - borrow))) - (declare (type bignum-element-type high-digit)) - (if (and (= high-digit 0) - (or (> high-guess*y2 middle-digit) - (and (= middle-digit high-guess*y2) - (> low-guess*y2 x-i-2)))) - (setf guess (%subtract-with-borrow guess 1 1)) - (return guess))))))))) - ;;; Divide TRUNCATE-X by TRUNCATE-Y, returning the quotient - ;;; and destructively modifying TRUNCATE-X so that it holds - ;;; the remainder. - ;;; - ;;; LEN-X and LEN-Y tell us how much of the buffers we care about. - ;;; - ;;; TRUNCATE-X definitely has at least three digits, and it has one - ;;; more than TRUNCATE-Y. This keeps i, i-1, i-2, and low-x-digit - ;;; happy. Thanks to SHIFT-AND-STORE-TRUNCATE-BUFFERS. + (multiple-value-bind (high-guess*y1 low-guess*y1) + (%multiply guess y1) + (declare (type bignum-element-type low-guess*y1 + high-guess*y1)) + (multiple-value-bind (high-guess*y2 low-guess*y2) + (%multiply guess y2) + (declare (type bignum-element-type high-guess*y2 + low-guess*y2)) + (multiple-value-bind (middle-digit borrow) + (%subtract-with-borrow x-i-1 low-guess*y1 1) + (declare (type bignum-element-type middle-digit) + (fixnum borrow)) + ;; Supplying borrow of 1 means there was no + ;; borrow, and we know x-i-2 minus 0 requires + ;; no borrow. + (let ((high-digit (%subtract-with-borrow x-i + high-guess*y1 + borrow))) + (declare (type bignum-element-type high-digit)) + (if (and (= high-digit 0) + (or (> high-guess*y2 middle-digit) + (and (= middle-digit high-guess*y2) + (> low-guess*y2 x-i-2)))) + (setf guess (%subtract-with-borrow guess 1 1)) + (return guess))))))))) + ;; Divide TRUNCATE-X by TRUNCATE-Y, returning the quotient + ;; and destructively modifying TRUNCATE-X so that it holds + ;; the remainder. + ;; + ;; LEN-X and LEN-Y tell us how much of the buffers we care about. + ;; + ;; TRUNCATE-X definitely has at least three digits, and it has one + ;; more than TRUNCATE-Y. This keeps i, i-1, i-2, and low-x-digit + ;; happy. Thanks to SHIFT-AND-STORE-TRUNCATE-BUFFERS. (return-quotient-leaving-remainder (len-x len-y) (declare (type bignum-length len-x len-y)) (let* ((len-q (- len-x len-y)) @@ -1805,31 +1754,31 @@ ;; DO NOT ASSUME THAT %ALLOCATE-BIGNUM PREZEROS (setf (%bignum-ref q len-q) 0) (loop - (setf (%bignum-ref q k) - (try-bignum-truncate-guess - ;; This modifies TRUNCATE-X. Must access - ;; elements each pass. - (bignum-truncate-guess y1 y2 - (%bignum-ref truncate-x i) - (%bignum-ref truncate-x i-1) - (%bignum-ref truncate-x i-2)) - len-y low-x-digit)) - (cond ((zerop k) (return)) - (t (decf k) - (decf low-x-digit) - (shiftf i i-1 i-2 (1- i-2))))) + (setf (%bignum-ref q k) + (try-bignum-truncate-guess + ;; This modifies TRUNCATE-X. Must access + ;; elements each pass. + (bignum-truncate-guess y1 y2 + (%bignum-ref truncate-x i) + (%bignum-ref truncate-x i-1) + (%bignum-ref truncate-x i-2)) + len-y low-x-digit)) + (cond ((zerop k) (return)) + (t (decf k) + (decf low-x-digit) + (shiftf i i-1 i-2 (1- i-2))))) q)) - ;;; This takes a digit guess, multiplies it by TRUNCATE-Y for a - ;;; result one greater in length than LEN-Y, and subtracts this result - ;;; from TRUNCATE-X. LOW-X-DIGIT is the first digit of X to start - ;;; the subtraction, and we know X is long enough to subtract a LEN-Y - ;;; plus one length bignum from it. Next we check the result of the - ;;; subtraction, and if the high digit in X became negative, then our - ;;; guess was one too big. In this case, return one less than GUESS - ;;; passed in, and add one value of Y back into X to account for - ;;; subtracting one too many. Knuth shows that the guess is wrong on - ;;; the order of 3/b, where b is the base (2 to the digit-size power) - ;;; -- pretty rarely. + ;; This takes a digit guess, multiplies it by TRUNCATE-Y for a + ;; result one greater in length than LEN-Y, and subtracts this result + ;; from TRUNCATE-X. LOW-X-DIGIT is the first digit of X to start + ;; the subtraction, and we know X is long enough to subtract a LEN-Y + ;; plus one length bignum from it. Next we check the result of the + ;; subtraction, and if the high digit in X became negative, then our + ;; guess was one too big. In this case, return one less than GUESS + ;; passed in, and add one value of Y back into X to account for + ;; subtracting one too many. Knuth shows that the guess is wrong on + ;; the order of 3/b, where b is the base (2 to the digit-size power) + ;; -- pretty rarely. (try-bignum-truncate-guess (guess len-y low-x-digit) (declare (type bignum-index low-x-digit) (type bignum-length len-y) @@ -1884,33 +1833,33 @@ (%add-with-carry (%bignum-ref truncate-x i) 0 carry))) (%subtract-with-borrow guess 1 1))))) - ;;; This returns the amount to shift y to place a one in the - ;;; second highest bit. Y must be positive. If the last digit - ;;; of y is zero, then y has a one in the previous digit's - ;;; sign bit, so we know it will take one less than digit-size - ;;; to get a one where we want. Otherwise, we count how many - ;;; right shifts it takes to get zero; subtracting this value - ;;; from digit-size tells us how many high zeros there are - ;;; which is one more than the shift amount sought. - ;;; - ;;; Note: This is exactly the same as one less than the - ;;; integer-length of the last digit subtracted from the - ;;; digit-size. - ;;; - ;;; We shift y to make it sufficiently large that doing the - ;;; 2*digit-size by digit-size %BIGFLOOR calls ensures the quotient and - ;;; remainder fit in digit-size. + ;; This returns the amount to shift y to place a one in the + ;; second highest bit. Y must be positive. If the last digit + ;; of y is zero, then y has a one in the previous digit's + ;; sign bit, so we know it will take one less than digit-size + ;; to get a one where we want. Otherwise, we count how many + ;; right shifts it takes to get zero; subtracting this value + ;; from digit-size tells us how many high zeros there are + ;; which is one more than the shift amount sought. + ;; + ;; Note: This is exactly the same as one less than the + ;; integer-length of the last digit subtracted from the + ;; digit-size. + ;; + ;; We shift y to make it sufficiently large that doing the + ;; 2*digit-size by digit-size %BIGFLOOR calls ensures the quotient and + ;; remainder fit in digit-size. (shift-y-for-truncate (y) (let* ((len (%bignum-length y)) (last (%bignum-ref y (1- len)))) (declare (type bignum-length len) (type bignum-element-type last)) (- digit-size (integer-length last) 1))) - ;;; Stores two bignums into the truncation bignum buffers, - ;;; shifting them on the way in. This assumes x and y are - ;;; positive and at least two in length, and it assumes - ;;; truncate-x and truncate-y are one digit longer than x and - ;;; y. + ;; Stores two bignums into the truncation bignum buffers, + ;; shifting them on the way in. This assumes x and y are + ;; positive and at least two in length, and it assumes + ;; truncate-x and truncate-y are one digit longer than x and + ;; y. (shift-and-store-truncate-buffers (x len-x y len-y shift) (declare (type bignum-length len-x len-y) (type (integer 0 (#.digit-size)) shift)) @@ -1922,13 +1871,13 @@ truncate-x) (bignum-ashift-left-unaligned y 0 shift (1+ len-y) truncate-y))))) ;; LABELS - ;;; Divide X by Y returning the quotient and remainder. In the - ;;; general case, we shift Y to set up for the algorithm, and we - ;;; use two buffers to save consing intermediate values. X gets - ;;; destructively modified to become the remainder, and we have - ;;; to shift it to account for the initial Y shift. After we - ;;; multiple bind q and r, we first fix up the signs and then - ;;; return the normalized results. + ;; Divide X by Y returning the quotient and remainder. In the + ;; general case, we shift Y to set up for the algorithm, and we + ;; use two buffers to save consing intermediate values. X gets + ;; destructively modified to become the remainder, and we have + ;; to shift it to account for the initial Y shift. After we + ;; multiple bind q and r, we first fix up the signs and then + ;; return the normalized results. (let* ((x-plusp (bignum-plus-p x)) (y-plusp (bignum-plus-p y)) (x (if x-plusp x (negate-bignum x nil))) @@ -1936,9 +1885,7 @@ (len-x (%bignum-length x)) (len-y (%bignum-length y))) (multiple-value-bind (q r) - (cond ((< len-y 2) - (bignum-truncate-single-digit x len-x y)) - ((plusp (bignum-compare y x)) + (cond ((plusp (bignum-compare y x)) (let ((res (%allocate-bignum len-x))) (dotimes (i len-x) (setf (%bignum-ref res i) (%bignum-ref x i))) @@ -1984,6 +1931,87 @@ (if (typep rem 'fixnum) rem (%normalize-bignum rem (%bignum-length rem)))))))))) + +;;; Divide X by Y when Y is a single bignum digit. +;;; We don't have to worry about shifting Y to make its most +;;; significant digit sufficiently large for %BIGFLOOR to return +;;; digit-size quantities for the q-digit and r-digit. If Y is +;;; a single digit bignum, it is already large enough for +;;; %BIGFLOOR. That is, it has some bits on pretty high in the +;;; digit. +(defun bignum-truncate-single-digit (x y) + (declare (type bignum x) + (type (or word sb-vm:signed-word) y) + (optimize (safety 0))) + (declare (muffle-conditions compiler-note)) ; returns lispobj, so what. + (labels + ((bignum-truncate-single-digit (x len-x y) + (declare (type bignum-length len-x) + (type word y)) + (if (not (logtest y (1- y))) + ;; Y is a power of two. + ;; SHIFT-RIGHT-UNALIGNED won't do the right thing + ;; with a shift count of 0 or -1, so special case this. + (cond ((= y 0) + (error 'division-by-zero :operation 'truncate + :operands (list x y))) + ((= y 1) + ;; We could probably get away with (VALUES X 0) + ;; here, but it's not clear that some of the + ;; normalization logic further down would avoid + ;; mutilating X. Just go ahead and cons, consing's + ;; cheap. + (values (copy-bignum x len-x) 0)) + (t + (let ((n-bits (1- (integer-length y)))) + (values + (shift-right-unaligned x 0 n-bits len-x + ((= j res-len-1) + (setf (%bignum-ref res j) + (%ashr (%bignum-ref x i) n-bits)) + res) + res) + (logand (%bignum-ref x 0) (1- y)))))) + (do ((i (1- len-x) (1- i)) + (q (%allocate-bignum len-x)) + (r 0)) + ((minusp i) + (values q r)) + (declare (type bignum-element-type r)) + (multiple-value-bind (q-digit r-digit) + (%bigfloor r (%bignum-ref x i) y) + (declare (type bignum-element-type q-digit r-digit)) + (setf (%bignum-ref q i) q-digit) + (setf r r-digit)))))) + (let* ((x-plusp (bignum-plus-p x)) + (y-plusp t) + (x (if x-plusp x (negate-bignum x nil))) + (y (typecase y + (fixnum + (cond ((minusp y) + (setf y-plusp nil) + (- y)) + (t + y))) + (sb-vm:signed-word + (cond ((minusp y) + (setf y-plusp nil) + (the word (- y))) + (t + y))) + (t + y))) + (len-x (%bignum-length x))) + (declare (word y)) + (multiple-value-bind (q r) + (bignum-truncate-single-digit x len-x y) + (let ((quotient (cond ((eq x-plusp y-plusp) q) + (t (negate-bignum-in-place q)))) + (rem (cond (x-plusp r) + ((typep r 'fixnum) (the fixnum (- r))) + (t (- r))))) + (values (%normalize-bignum quotient (%bignum-length quotient)) + rem)))))) ;;;; hashing diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index b710b9ffee..ff4e1789fd 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -330,16 +330,19 @@ (numerator divisor)) (values quot (/ rem (denominator divisor)))))) ((fixnum bignum) - (bignum-truncate (make-small-bignum number) divisor)) + (if (typep divisor '(or word sb-vm:signed-word)) + (bignum-truncate-single-digit (make-small-bignum number) divisor) + (bignum-truncate (make-small-bignum number) divisor))) ((ratio (or float rational)) (let ((q (truncate (numerator number) (* (denominator number) divisor)))) (values q (- number (* q divisor))))) ((bignum fixnum) - (bignum-truncate number (make-small-bignum divisor))) + (bignum-truncate-single-digit number divisor)) ((bignum bignum) - (bignum-truncate number divisor)) - + (if (typep divisor '(or word sb-vm:signed-word)) + (bignum-truncate-single-digit number divisor) + (bignum-truncate number divisor))) (((foreach single-float double-float #+long-float long-float) (or rational single-float)) (if (eql divisor 1) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index de5bd2b5b8..0b95170131 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -204,7 +204,7 @@ SBCL itself") "BIGNUM-LOGCOUNT" "BIGNUM-LOGICAL-AND" "BIGNUM-LOGICAL-IOR" "BIGNUM-LOGICAL-NOT" "BIGNUM-LOGICAL-XOR" "BIGNUM-PLUS-P" - "BIGNUM-TO-FLOAT" "BIGNUM-TRUNCATE" + "BIGNUM-TO-FLOAT" "BIGNUM-TRUNCATE" "BIGNUM-TRUNCATE-SINGLE-DIGIT" "MAKE-SMALL-BIGNUM" "MULTIPLY-BIGNUM-AND-FIXNUM" "MULTIPLY-BIGNUMS" "MULTIPLY-FIXNUMS" "NEGATE-BIGNUM" From 6ae34a6a7d2561f972fa185295354e52816065b3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 22 Jun 2022 15:43:18 +0300 Subject: [PATCH 3570/4023] Use two TYPEPs instead of (typep a '(or word sb-vm:signed-word)) Produces better code. --- src/code/numbers.lisp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index ff4e1789fd..f032f373f8 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -330,7 +330,8 @@ (numerator divisor)) (values quot (/ rem (denominator divisor)))))) ((fixnum bignum) - (if (typep divisor '(or word sb-vm:signed-word)) + (if (or (typep divisor 'word) + (typep divisor 'sb-vm:signed-word)) (bignum-truncate-single-digit (make-small-bignum number) divisor) (bignum-truncate (make-small-bignum number) divisor))) ((ratio (or float rational)) @@ -340,7 +341,8 @@ ((bignum fixnum) (bignum-truncate-single-digit number divisor)) ((bignum bignum) - (if (typep divisor '(or word sb-vm:signed-word)) + (if (or (typep divisor 'word) + (typep divisor 'sb-vm:signed-word)) (bignum-truncate-single-digit number divisor) (bignum-truncate number divisor))) (((foreach single-float double-float #+long-float long-float) From 56ebe22877fa5a2f4047b2f132b6e8707bc08982 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 22 Jun 2022 18:00:19 +0300 Subject: [PATCH 3571/4023] Fix truncate on backends without a native %bigfloor. (sb-bignum:%bigfloor 1 0 (1- (expt 2 n-word-bits))) returns 0, 0 there. Limit bignum-truncate-single-digit to (1- n-word-bits) divisors there. --- src/code/numbers.lisp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index f032f373f8..96746b08d2 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -319,7 +319,18 @@ (res (%unary-truncate (/ number float-div)))) (values res (- number - (* (coerce res ',rtype) float-div)))))) + (* (coerce res ',rtype) float-div))))) + (single-digit-bignum-p (x) + #+(or x86-64 x86 ppc64) + `(or (typep ,x 'word) + (typep ,x 'sb-vm:signed-word)) + ;; Other backends don't have native double-word/word division, + ;; and their bigfloor implementation doesn't handle + ;; full-width divisors. + #-(or x86-64 x86 ppc64) + `(or (typep ,x '(unsigned-byte ,(1- sb-vm:n-word-bits))) + (typep ,x '(integer ,(- 1 (expt 2 (- sb-vm:n-word-bits 1))) + ,(1- (expt 2 (- sb-vm:n-word-bits 1)))))))) (number-dispatch ((number real) (divisor real)) ((fixnum fixnum) (truncate number divisor)) (((foreach fixnum bignum) ratio) @@ -330,8 +341,7 @@ (numerator divisor)) (values quot (/ rem (denominator divisor)))))) ((fixnum bignum) - (if (or (typep divisor 'word) - (typep divisor 'sb-vm:signed-word)) + (if (single-digit-bignum-p divisor) (bignum-truncate-single-digit (make-small-bignum number) divisor) (bignum-truncate (make-small-bignum number) divisor))) ((ratio (or float rational)) @@ -341,8 +351,7 @@ ((bignum fixnum) (bignum-truncate-single-digit number divisor)) ((bignum bignum) - (if (or (typep divisor 'word) - (typep divisor 'sb-vm:signed-word)) + (if (single-digit-bignum-p divisor) (bignum-truncate-single-digit number divisor) (bignum-truncate number divisor))) (((foreach single-float double-float #+long-float long-float) From e7405f6e0615d470dd7199bc59d633315da753ca Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 22 Jun 2022 02:58:58 +0300 Subject: [PATCH 3572/4023] arm64: optimize (truncate bignum 32-bit-integer). It doesn't have a 128 bit by 64 bit division instruction, but the 64/64 division can handle 64/32. --- src/code/bignum.lisp | 36 ++++++++---- src/cold/exports.lisp | 47 ++++++++------- src/compiler/arm64/arith.lisp | 29 +++++++++- src/compiler/arm64/macros.lisp | 92 +++++++++++++++++------------- src/compiler/generic/early-vm.lisp | 3 + src/compiler/generic/vm-fndb.lisp | 36 ++++++++---- src/compiler/generic/vm-type.lisp | 4 ++ 7 files changed, 158 insertions(+), 89 deletions(-) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index 4a4757e3c4..a0180e5d68 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -1972,17 +1972,31 @@ res) res) (logand (%bignum-ref x 0) (1- y)))))) - (do ((i (1- len-x) (1- i)) - (q (%allocate-bignum len-x)) - (r 0)) - ((minusp i) - (values q r)) - (declare (type bignum-element-type r)) - (multiple-value-bind (q-digit r-digit) - (%bigfloor r (%bignum-ref x i) y) - (declare (type bignum-element-type q-digit r-digit)) - (setf (%bignum-ref q i) q-digit) - (setf r r-digit)))))) + (cond ((sb-c::when-vop-existsp (:translate %half-bigfloor) + (typep y 'half-bignum-element-type)) + (do ((i (1- (* len-x 2)) (1- i)) + (q (%allocate-bignum len-x)) + (r 0)) + ((minusp i) + (values q r)) + (declare (type half-bignum-element-type r)) + (multiple-value-bind (q-digit r-digit) + (%half-bigfloor r (%half-bignum-ref x i) y) + (declare (type half-bignum-element-type q-digit r-digit)) + (setf (%half-bignum-ref q i) q-digit) + (setf r r-digit)))) + (t + (do ((i (1- len-x) (1- i)) + (q (%allocate-bignum len-x)) + (r 0)) + ((minusp i) + (values q r)) + (declare (type bignum-element-type r)) + (multiple-value-bind (q-digit r-digit) + (%bigfloor r (%bignum-ref x i) y) + (declare (type bignum-element-type q-digit r-digit)) + (setf (%bignum-ref q i) q-digit) + (setf r r-digit)))))))) (let* ((x-plusp (bignum-plus-p x)) (y-plusp t) (x (if x-plusp x (negate-bignum x nil))) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 0b95170131..989103d417 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -187,28 +187,31 @@ SBCL itself") (:export "%ADD-WITH-CARRY" "%ALLOCATE-BIGNUM" "%ASHL" "%ASHR" "%BIGNUM-LENGTH" "%BIGNUM-REF" "%BIGNUM-REF-WITH-OFFSET" - "%BIGNUM-SET" #+bignum-assertions "%%BIGNUM-SET" - "%BIGNUM-SET-LENGTH" "%DIGIT-0-OR-PLUSP" - "%DIGIT-LOGICAL-SHIFT-RIGHT" - "%FIXNUM-DIGIT-WITH-CORRECT-SIGN" "%FIXNUM-TO-DIGIT" - "%BIGFLOOR" "%LOGAND" "%LOGIOR" "%LOGNOT" "%LOGXOR" - "%MULTIPLY" "%MULTIPLY-AND-ADD" - "%SUBTRACT-WITH-BORROW" "ADD-BIGNUMS" - "BIGNUM-ASHIFT-LEFT" "BIGNUM-ASHIFT-LEFT-FIXNUM" - "BIGNUM-ASHIFT-RIGHT" - "BIGNUM-COMPARE" - "BIGNUM-ELEMENT-TYPE" "BIGNUM-GCD" "BIGNUM-INDEX" - "BIGNUM-LENGTH" - "BIGNUM-INTEGER-LENGTH" - "BIGNUM-LOGBITP" - "BIGNUM-LOGCOUNT" "BIGNUM-LOGICAL-AND" - "BIGNUM-LOGICAL-IOR" "BIGNUM-LOGICAL-NOT" - "BIGNUM-LOGICAL-XOR" "BIGNUM-PLUS-P" - "BIGNUM-TO-FLOAT" "BIGNUM-TRUNCATE" "BIGNUM-TRUNCATE-SINGLE-DIGIT" - "MAKE-SMALL-BIGNUM" - "MULTIPLY-BIGNUM-AND-FIXNUM" "MULTIPLY-BIGNUMS" - "MULTIPLY-FIXNUMS" "NEGATE-BIGNUM" - "%RANDOM-BIGNUM" "SUBTRACT-BIGNUM" "SXHASH-BIGNUM")) + "%BIGNUM-SET" + #+bignum-assertions "%%BIGNUM-SET" + "%BIGNUM-SET-LENGTH" "%DIGIT-0-OR-PLUSP" + "%DIGIT-LOGICAL-SHIFT-RIGHT" + "%FIXNUM-DIGIT-WITH-CORRECT-SIGN" "%FIXNUM-TO-DIGIT" + "%BIGFLOOR" "%LOGAND" "%LOGIOR" "%LOGNOT" "%LOGXOR" + "%MULTIPLY" "%MULTIPLY-AND-ADD" + "%SUBTRACT-WITH-BORROW" "ADD-BIGNUMS" + "BIGNUM-ASHIFT-LEFT" "BIGNUM-ASHIFT-LEFT-FIXNUM" + "BIGNUM-ASHIFT-RIGHT" + "BIGNUM-COMPARE" + "BIGNUM-ELEMENT-TYPE" "BIGNUM-GCD" "BIGNUM-INDEX" + "BIGNUM-LENGTH" + "BIGNUM-INTEGER-LENGTH" + "BIGNUM-LOGBITP" + "BIGNUM-LOGCOUNT" "BIGNUM-LOGICAL-AND" + "BIGNUM-LOGICAL-IOR" "BIGNUM-LOGICAL-NOT" + "BIGNUM-LOGICAL-XOR" "BIGNUM-PLUS-P" + "BIGNUM-TO-FLOAT" "BIGNUM-TRUNCATE" "BIGNUM-TRUNCATE-SINGLE-DIGIT" + "MAKE-SMALL-BIGNUM" + "MULTIPLY-BIGNUM-AND-FIXNUM" "MULTIPLY-BIGNUMS" + "MULTIPLY-FIXNUMS" "NEGATE-BIGNUM" + "%RANDOM-BIGNUM" "SUBTRACT-BIGNUM" "SXHASH-BIGNUM" + "HALF-BIGNUM-ELEMENT-TYPE" "HALF-BIGNUM-INDEX" "HALF-BIGNUM-LENGTH" + "%HALF-BIGNUM-REF" "%HALF-BIGFLOOR")) ;; This package is a grab bag for things which used to be internal ;; symbols in package COMMON-LISP. Lots of these symbols are accessed diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 3a8c8e5feb..94dc683f8c 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -1179,6 +1179,17 @@ (define-full-setter bignum-set * bignum-digits-offset other-pointer-lowtag (unsigned-reg) unsigned-num sb-bignum:%bignum-set) +(define-partial-reffer sb-c::%half-bignum-ref bignum + :word nil bignum-digits-offset other-pointer-lowtag (unsigned-reg signed-reg) + positive-fixnum + sb-bignum:%half-bignum-ref) + +(define-partial-setter sb-c::%half-bignum-set bignum + :word bignum-digits-offset other-pointer-lowtag (unsigned-reg signed-reg) + positive-fixnum + (setf sb-bignum:%half-bignum-ref)) + + (define-vop (digit-0-or-plus) (:translate sb-bignum:%digit-0-or-plusp) (:policy :fast-safe) @@ -1187,8 +1198,8 @@ (:conditional) (:info target not-p) (:generator 2 - (inst cmp digit 0) - (inst b (if not-p :lt :ge) target))) + (inst cmp digit 0) + (inst b (if not-p :lt :ge) target))) (define-vop (add-w/carry) (:translate sb-bignum:%add-with-carry) @@ -1222,7 +1233,7 @@ (inst cmp c 1) ;; Set carry if (fixnum 0 or 1) c=0, else clear. (inst sbcs result a b) (unless (eq (tn-kind borrow) :unused) - (inst cset borrow :cs)))) + (inst cset borrow :cs)))) (define-vop (bignum-mult-and-add-3-arg) (:translate sb-bignum:%multiply-and-add) @@ -1333,6 +1344,18 @@ (unless (= i 64) (inst adc rem rem rem)))))) +(define-vop (half-bignum-floor bignum-floor) + (:translate sb-bignum:%half-bigfloor) + (:args (div-high :scs (unsigned-reg) :to :save) + (div-low :scs (unsigned-reg) :target x) + (divisor :scs (unsigned-reg) :to (:result 1))) + (:temporary (:sc unsigned-reg :from (:argument 1)) x) + (:generator 30 + (move x div-low) + (inst bfm x div-high 32 31) + (inst udiv quo x divisor) + (inst msub rem quo divisor x))) + (define-vop (signify-digit) (:translate sb-bignum:%fixnum-digit-with-correct-sign) (:policy :fast-safe) diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp index e3c02ba730..365c2b1dbd 100644 --- a/src/compiler/arm64/macros.lisp +++ b/src/compiler/arm64/macros.lisp @@ -423,47 +423,57 @@ (defmacro define-partial-setter (name type size offset lowtag scs el-type &optional translate) - `(define-vop (,name) - ,@(when translate - `((:translate ,translate))) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg unsigned-reg immediate)) - (value :scs ,scs - :load-if (not (and (sc-is value immediate) - (eql (tn-value value) 0))))) - (:arg-types ,type tagged-num ,el-type) - (:temporary (:scs (non-descriptor-reg)) lip) - (:generator 5 - (when (sc-is value immediate) - (setf value zr-tn)) - ,@(multiple-value-bind (op shift) - (ecase size - (:byte - (values 'strb 0)) - (:short - (values 'strh 1)) - (:word - (values 'str 2))) - (let ((value (if (eq size :word) - '(32-bit-reg value) - 'value))) - `((sc-case index - (immediate - (inst ,op ,value (@ object (load-store-offset - (+ - (ash (tn-value index) ,shift) - (- (* ,offset n-word-bytes) ,lowtag)))))) - (t - (let ((shift ,shift)) - (sc-case index - (any-reg - (decf shift n-fixnum-tag-bits))) - (inst add lip object (if (minusp shift) - (asr index (- shift)) - (lsl index shift))) - (inst ,op - ,value (@ lip (- (* ,offset n-word-bytes) ,lowtag)))))))))))) + (let ((value `((value :scs ,scs + :load-if (not (and (sc-is value immediate) + (eql (tn-value value) 0)))))) + (setf-p (typep translate '(cons (eql setf))))) + `(define-vop (,name) + ,@(when translate + `((:translate ,translate))) + (:policy :fast-safe) + (:args ,@(when setf-p + value) + (object :scs (descriptor-reg)) + (index :scs (any-reg unsigned-reg immediate)) + ,@(unless setf-p + value)) + (:arg-types ,@(when setf-p + `(,el-type)) + ,type + tagged-num + ,@(unless setf-p + `(,el-type))) + (:temporary (:scs (non-descriptor-reg)) lip) + (:generator 5 + (when (sc-is value immediate) + (setf value zr-tn)) + ,@(multiple-value-bind (op shift) + (ecase size + (:byte + (values 'strb 0)) + (:short + (values 'strh 1)) + (:word + (values 'str 2))) + (let ((value (if (eq size :word) + '(32-bit-reg value) + 'value))) + `((sc-case index + (immediate + (inst ,op ,value (@ object (load-store-offset + (+ + (ash (tn-value index) ,shift) + (- (* ,offset n-word-bytes) ,lowtag)))))) + (t + (let ((shift ,shift)) + (sc-case index + (any-reg + (decf shift n-fixnum-tag-bits))) + (inst add lip object (if (minusp shift) + (asr index (- shift)) + (lsl index shift))) + (inst ,op + ,value (@ lip (- (* ,offset n-word-bytes) ,lowtag))))))))))))) (defun load-inline-constant (dst &rest constant-descriptor) (destructuring-bind (size . label) (apply #'register-inline-constant constant-descriptor) diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index 2a2656a7b0..8a96635ccb 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -78,6 +78,9 @@ ;; I haven't exercised our math routines to anywhere near that limit. #+64-bit #xFFFFFFFF) +(defconstant maximum-half-bignum-length + #+64-bit (* #xFFFFFFFF 2)) + ;;; The ANSI-specified minimum is 8. ;;; Since the array rank is stored as rank-1 in the array header, ;;; having it stop at 128 ensures that adding 1 produces an unsigned diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index e775847226..bc3d237439 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -546,6 +546,7 @@ (defknown %bignum-ref (bignum bignum-index) bignum-element-type (flushable #-bignum-assertions always-translatable)) + #+(or x86 x86-64) (defknown %bignum-ref-with-offset (bignum fixnum (signed-byte 24)) bignum-element-type (flushable always-translatable)) @@ -554,18 +555,25 @@ (values) (#-bignum-assertions always-translatable)) +(defknown %half-bignum-ref (bignum sb-kernel::half-bignum-index) sb-kernel::half-bignum-element-type + (flushable #-bignum-assertions always-translatable)) + +(defknown (setf %half-bignum-ref) (sb-kernel::half-bignum-element-type bignum sb-kernel::half-bignum-index) + (values) + (#-bignum-assertions always-translatable)) + ;;; Return T if digit is positive, or NIL if negative. (defknown %digit-0-or-plusp (bignum-element-type) boolean - (foldable flushable movable always-translatable)) + (foldable flushable movable always-translatable)) ;;; %ADD-WITH-CARRY returns a bignum digit and a carry resulting from adding ;;; together a, b, and an incoming carry. ;;; %SUBTRACT-WITH-BOROW returns a bignum digit and a borrow resulting from ;;; subtracting b from a, and subtracting a possible incoming borrow. (defknown (%add-with-carry %subtract-with-borrow) - (bignum-element-type bignum-element-type (mod 2)) - (values bignum-element-type (mod 2)) - (foldable flushable movable always-translatable)) + (bignum-element-type bignum-element-type (mod 2)) + (values bignum-element-type (mod 2)) + (foldable flushable movable always-translatable)) ;;; This multiplies x-digit and y-digit, producing high and low digits ;;; manifesting the result. Then it adds the low digit, res-digit, and @@ -578,19 +586,19 @@ ;;; accumulating partial results which is where the res-digit comes ;;; from. (defknown %multiply-and-add - (bignum-element-type bignum-element-type bignum-element-type - &optional bignum-element-type) - (values bignum-element-type bignum-element-type) - (foldable flushable movable always-translatable)) + (bignum-element-type bignum-element-type bignum-element-type + &optional bignum-element-type) + (values bignum-element-type bignum-element-type) + (foldable flushable movable always-translatable)) ;;; Multiply two digit-size numbers, returning a 2*digit-size result ;;; split into two digit-size quantities. (defknown %multiply (bignum-element-type bignum-element-type) - (values bignum-element-type bignum-element-type) - (foldable flushable movable always-translatable)) + (values bignum-element-type bignum-element-type) + (foldable flushable movable always-translatable)) (defknown %lognot (bignum-element-type) bignum-element-type - (foldable flushable movable always-translatable)) + (foldable flushable movable always-translatable)) (defknown (%logand %logior %logxor) (bignum-element-type bignum-element-type) bignum-element-type @@ -605,11 +613,15 @@ (values bignum-element-type bignum-element-type) (foldable flushable movable always-translatable)) +(defknown %half-bigfloor (half-bignum-element-type half-bignum-element-type half-bignum-element-type) + (values half-bignum-element-type half-bignum-element-type) + (foldable flushable movable always-translatable)) + ;;; Convert the input, a BIGNUM-ELEMENT-TYPE, to a signed word. ;;; FIXME: considering that both the input and output have N-WORD-BITS significant bits, ;;; this is really a bad name for the operation. (defknown %fixnum-digit-with-correct-sign (bignum-element-type) sb-vm:signed-word - (foldable flushable movable always-translatable)) + (foldable flushable movable always-translatable)) ;;; %ASHR- take a digit-size quantity and shift it to the left, ;;; returning a digit-size quantity. diff --git a/src/compiler/generic/vm-type.lisp b/src/compiler/generic/vm-type.lisp index 56ccc96f9d..6ac2df32a5 100644 --- a/src/compiler/generic/vm-type.lisp +++ b/src/compiler/generic/vm-type.lisp @@ -63,6 +63,10 @@ (sb-xc:deftype bignum-index () `(mod ,maximum-bignum-length)) (sb-xc:deftype bignum-length () `(mod ,(1+ maximum-bignum-length))) +(sb-xc:deftype half-bignum-element-type () `(unsigned-byte ,(/ sb-vm:n-word-bits 2))) +(sb-xc:deftype half-bignum-index () `(mod ,sb-vm::maximum-half-bignum-length)) +(sb-xc:deftype half-bignum-length () `(mod ,(1+ sb-vm::maximum-half-bignum-length))) + ;;; an index into an integer (sb-xc:deftype bit-index () `(integer 0 ,(* (1- (ash 1 (- sb-vm:n-word-bits sb-vm:n-widetag-bits))) From c9dc0d8784db7dfe8c68dbe493a67edcb845e825 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 22 Jun 2022 11:10:06 -0400 Subject: [PATCH 3573/4023] Possibly shorten asm code for forwarding_pointer_p() x86-64 doesn't need a REX prefix except for the upper registers. --- src/runtime/forwarding-ptr.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/runtime/forwarding-ptr.h b/src/runtime/forwarding-ptr.h index d6d75f12ef..2fe3f38a59 100644 --- a/src/runtime/forwarding-ptr.h +++ b/src/runtime/forwarding-ptr.h @@ -12,10 +12,15 @@ in_gc_p(void) { inline static boolean forwarding_pointer_p(lispobj *pointer) { - lispobj first_word=*pointer; #ifdef LISP_FEATURE_GENCGC - return (first_word == FORWARDING_HEADER); +# ifdef LISP_FEATURE_LITTLE_ENDIAN + // no need to compare the entire word + return *(char*)pointer == 1; +# else + return (*pointer == FORWARDING_HEADER); +#endif #else + lispobj first_word=*pointer; // FIXME: change 5c0d71f92c371769f911e6a2ac60b2dd9fbde349 added // an extra test here, which theoretically slowed things down. // This was in response to 044e22192c25578efceedba042554dc9a96124c6 From 1cbf75c8daa3143344c84d9c8801ea7690dae88b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 22 Jun 2022 18:41:45 +0300 Subject: [PATCH 3574/4023] Fix 32-bit builds. --- src/compiler/generic/early-vm.lisp | 3 --- src/compiler/generic/vm-type.lisp | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index 8a96635ccb..2a2656a7b0 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -78,9 +78,6 @@ ;; I haven't exercised our math routines to anywhere near that limit. #+64-bit #xFFFFFFFF) -(defconstant maximum-half-bignum-length - #+64-bit (* #xFFFFFFFF 2)) - ;;; The ANSI-specified minimum is 8. ;;; Since the array rank is stored as rank-1 in the array header, ;;; having it stop at 128 ensures that adding 1 produces an unsigned diff --git a/src/compiler/generic/vm-type.lisp b/src/compiler/generic/vm-type.lisp index 6ac2df32a5..30d04d2778 100644 --- a/src/compiler/generic/vm-type.lisp +++ b/src/compiler/generic/vm-type.lisp @@ -64,8 +64,8 @@ (sb-xc:deftype bignum-length () `(mod ,(1+ maximum-bignum-length))) (sb-xc:deftype half-bignum-element-type () `(unsigned-byte ,(/ sb-vm:n-word-bits 2))) -(sb-xc:deftype half-bignum-index () `(mod ,sb-vm::maximum-half-bignum-length)) -(sb-xc:deftype half-bignum-length () `(mod ,(1+ sb-vm::maximum-half-bignum-length))) +(sb-xc:deftype half-bignum-index () `(mod ,(* maximum-bignum-length 2))) +(sb-xc:deftype half-bignum-length () `(mod ,(1+ (* maximum-bignum-length 2)))) ;;; an index into an integer (sb-xc:deftype bit-index () From fcc2568b82024eefbb9794217b84cb52f4c4d164 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 22 Jun 2022 11:47:38 -0400 Subject: [PATCH 3575/4023] Add more tools (not used yet) for finding code --- src/code/brothertree.lisp | 33 ++++++++----- src/runtime/search.c | 72 +++++++++++++++++++++++++++-- tests/benchmark.lisp | 1 - tests/brothertree.impure.lisp | 74 +++++++++++++++++------------ tests/bsearch.pure.lisp | 87 ++++++++++++++++++++++------------- 5 files changed, 188 insertions(+), 79 deletions(-) diff --git a/src/code/brothertree.lisp b/src/code/brothertree.lisp index c241a3d43f..002a3cd954 100644 --- a/src/code/brothertree.lisp +++ b/src/code/brothertree.lisp @@ -321,15 +321,24 @@ (defun find<= (key tree) (declare (keytype key)) - (when tree - (named-let recurse ((node tree) (best nil)) - (if (unary-node-p (truly-the sb-kernel:instance node)) - (if (child node) (recurse (child node) best) best) - (let ((node (truly-the binary-node node))) - (cond ((= key (binary-node-key node)) node) - ((fringe-binary-node-p node) - (if (< (binary-node-key node) key) node best)) - ((< key (binary-node-key node)) - (recurse (binary-node-%left node) best)) - (t - (recurse (binary-node-%right node) node)))))))) + (named-let recurse ((node tree) (best nil)) + (typecase node + (binary-node + (multiple-value-bind (left node-key right) (binary-node-parts node) + (cond ((< key node-key) (recurse left best)) + ((< node-key key) (recurse right node)) + (t node)))) + (unary-node (recurse (child node) best)) + (t best)))) + +(defun find>= (key tree) + (declare (keytype key)) + (named-let recurse ((node tree) (best nil)) + (typecase node + (binary-node + (multiple-value-bind (left node-key right) (binary-node-parts node) + (cond ((< key node-key) (recurse left node)) + ((< node-key key) (recurse right best)) + (t node)))) + (unary-node (recurse (child node) best)) + (t best)))) diff --git a/src/runtime/search.c b/src/runtime/search.c index 0e43d5f2c7..b5a359a197 100644 --- a/src/runtime/search.c +++ b/src/runtime/search.c @@ -23,6 +23,7 @@ #include "genesis/hash-table.h" #include "genesis/package.h" #include "brothertree.h" +#include "forwarding-ptr.h" lispobj * search_read_only_space(void *pointer) @@ -203,27 +204,73 @@ lispobj* find_symbol(char* symbol_name, lispobj package, unsigned int* hint) return package ? search_package_symbols(package, symbol_name, hint) : 0; } +static inline boolean fringe_node_p(struct binary_node* node) +{ + int len = ((unsigned int)node->header >> INSTANCE_LENGTH_SHIFT) & INSTANCE_LENGTH_MASK; + return len <= (int)(1+INSTANCE_DATA_START); +} + +/* I anticipate using the brothertree search algorithms to find code + * while GC has already potentially moved some of the tree nodes, + * thus the use of follow_fp() before dereferencing a node pointer */ +uword_t brothertree_find_eql(uword_t key, lispobj tree) +{ + while (tree != NIL) { + tree = follow_fp(tree); + lispobj layout = follow_fp(instance_layout(INSTANCE(tree))); + if (layout_depth2_id(LAYOUT(layout)) == BROTHERTREE_UNARY_NODE_LAYOUT_ID) { + tree = ((struct unary_node*)INSTANCE(tree))->child; + } else { + struct binary_node* node = (void*)INSTANCE(tree); + if (node->key == key) return tree; + lispobj l = NIL, r = NIL; + // unless a fringe node, read the left and right pointers + if (!fringe_node_p(node)) l = node->left, r = node->right; + if (key < node->key) tree = l; else tree = r; + } + } + return 0; +} + uword_t brothertree_find_lesseql(uword_t key, lispobj tree) { lispobj best = NIL; while (tree != NIL) { - lispobj layout = instance_layout(INSTANCE(tree)); + tree = follow_fp(tree); + lispobj layout = follow_fp(instance_layout(INSTANCE(tree))); if (layout_depth2_id(LAYOUT(layout)) == BROTHERTREE_UNARY_NODE_LAYOUT_ID) { tree = ((struct unary_node*)INSTANCE(tree))->child; } else { struct binary_node* node = (void*)INSTANCE(tree); if (node->key == key) return tree; lispobj l = NIL, r = NIL; - int len = ((unsigned int)node->header >> INSTANCE_LENGTH_SHIFT) - & INSTANCE_LENGTH_MASK; // unless a fringe node, read the left and right pointers - if (len > (int)(1+INSTANCE_DATA_START)) l = node->left, r = node->right; + if (!fringe_node_p(node)) l = node->left, r = node->right; if (key < node->key) tree = l; else { best = tree; tree = r; } } } return best; } +uword_t brothertree_find_greatereql(uword_t key, lispobj tree) +{ + lispobj best = NIL; + while (tree != NIL) { + tree = follow_fp(tree); + lispobj layout = follow_fp(instance_layout(INSTANCE(tree))); + if (layout_depth2_id(LAYOUT(layout)) == BROTHERTREE_UNARY_NODE_LAYOUT_ID) { + tree = ((struct unary_node*)INSTANCE(tree))->child; + } else { + struct binary_node* node = (void*)INSTANCE(tree); + if (node->key == key) return tree; + lispobj l = NIL, r = NIL; + // unless a fringe node, read the left and right pointers + if (!fringe_node_p(node)) l = node->left, r = node->right; + if (key > node->key) tree = r; else { best = tree; tree = l; } + } + } + return best; +} /* Binary search a sorted vector (of code base addresses). * This might be useful for generations other than 0, @@ -243,6 +290,21 @@ int bsearch_lesseql(uword_t item, uword_t* array, int nelements) else if (probe > item) high = mid - 1; else return mid; } - if (high >= 0 && array[high] < item) return high; + if (high >= 0) return high; + return -1; +} + +int bsearch_greatereql(uword_t item, uword_t* array, int nelements) +{ + int low = 0; + int high = nelements - 1; + while (low <= high) { + int mid = (low + high) / 2; + uword_t probe = array[mid]; + if (probe < item) low = mid + 1; + else if (probe > item) high = mid - 1; + else return mid; + } + if (low < nelements) return low; return -1; } diff --git a/tests/benchmark.lisp b/tests/benchmark.lisp index 1c0ac30136..7807b27e19 100644 --- a/tests/benchmark.lisp +++ b/tests/benchmark.lisp @@ -100,7 +100,6 @@ (subprocess-list nil) ;; Start timing only after all the DIRECTORY calls are done (above) (start-time (get-internal-real-time)) - (missing-usage) (losing) (metricsfilename (format nil "~A/performance" *logdir*)) (metricsfile diff --git a/tests/brothertree.impure.lisp b/tests/brothertree.impure.lisp index 837b79fef6..1053b7bc1a 100644 --- a/tests/brothertree.impure.lisp +++ b/tests/brothertree.impure.lisp @@ -1,7 +1,8 @@ #+interpreter (invoke-restart 'run-tests::skip-file) (let ((*evaluator-mode* :compile)) - (load "../src/code/brothertree.lisp")) + (handler-bind ((warning #'muffle-warning)) + (load "../src/code/brothertree.lisp"))) (in-package sb-brothertree) @@ -240,35 +241,50 @@ (assert (null tree)) )) -(defun c-find<= (key tree) - (declare (sb-vm:word key)) - (sb-sys:with-pinned-objects (tree) - (let ((result - (sb-alien:alien-funcall - (sb-alien:extern-alien "brothertree_find_lesseql" - (function sb-alien:unsigned sb-alien:unsigned - sb-alien:unsigned)) - key - (sb-kernel:get-lisp-obj-address tree)))) - (unless (eql result sb-vm:nil-value) - (sb-kernel:make-lisp-obj result))))) +(macrolet ((define-c-wrapper (lisp-name c-name) + `(defun ,lisp-name (key tree) + (declare (sb-vm:word key)) + (sb-sys:with-pinned-objects (tree) + (let ((result + (sb-alien:alien-funcall + (sb-alien:extern-alien ,c-name + (function sb-alien:unsigned sb-alien:unsigned + sb-alien:unsigned)) + key + (sb-kernel:get-lisp-obj-address tree)))) + (unless (eql result sb-vm:nil-value) + (sb-kernel:make-lisp-obj result))))))) + (define-c-wrapper c-find<= "brothertree_find_lesseql") + (define-c-wrapper c-find>= "brothertree_find_greatereql")) -(test-util:with-test (:name :find<=) - (let* ((list (test-util:shuffle (loop for i from 100 by 100 repeat 25 collect i))) - (tree (tree-from-list list))) - (assert (not (find<= 99 tree))) - (assert (not (c-find<= 99 tree))) - (loop for key from 100 by 100 repeat 25 - do - (let ((node (find<= key tree))) - (assert (= (binary-node-key node) key)) - (assert (eq (c-find<= key tree) node))) - (let ((node (find<= (1+ key) tree))) - (assert (= (binary-node-key node) key)) - (assert (eq (c-find<= (1+ key) tree) node))) - (let ((node (find<= (+ key 99) tree))) - (assert (= (binary-node-key node) key)) - (assert (eq (c-find<= (+ key 99) tree) node)))))) +(test-util:with-test (:name :find-inequality) + (dotimes (i 10) ; try with various trees resulting from different shuffles + (let* ((list (test-util:shuffle (loop for i from 100 by 100 repeat 25 collect i))) + (tree (tree-from-list list))) + (assert (not (find<= 99 tree))) + (assert (not (c-find<= 99 tree))) + (assert (not (find>= 10000 tree))) + (assert (not (c-find>= 10000 tree))) + (loop for key from 100 by 100 repeat 25 + do + (let ((node (find<= key tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find<= key tree) node))) + (let ((node (find>= key tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find>= key tree) node))) + (let ((node (find<= (1+ key) tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find<= (1+ key) tree) node))) + (let ((node (find>= (1- key) tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find>= (1- key) tree) node))) + (let ((node (find<= (+ key 99) tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find<= (+ key 99) tree) node))) + (let ((node (find>= (- key 99) tree))) + (assert (= (binary-node-key node) key)) + (assert (eq (c-find>= (- key 99) tree) node))))))) (test-util:with-test (:name :insert-delete) (try-delete-everything (tree-from-list (random-big-list 2500)))) diff --git a/tests/bsearch.pure.lisp b/tests/bsearch.pure.lisp index 4cee67ab0e..9d885bc466 100644 --- a/tests/bsearch.pure.lisp +++ b/tests/bsearch.pure.lisp @@ -1,36 +1,59 @@ +(macrolet ((define-c-wrapper (lisp-name c-name) + `(defun ,lisp-name (key array) + (declare (sb-vm:word key)) + (sb-sys:with-pinned-objects (array) + (let ((result + (sb-alien:alien-funcall + (sb-alien:extern-alien ,c-name + (function int sb-alien:unsigned + system-area-pointer int)) + key + (sb-sys:vector-sap array) (length array)))) + (unless (eql result -1) + (values result (aref array result)))))))) + (define-c-wrapper c-bsearch<= "bsearch_lesseql") + (define-c-wrapper c-bsearch>= "bsearch_greatereql")) + (defun test-c-bsearch-sorted-vector () - (flet ((bsearch<= (item array) - (sb-sys:with-pinned-objects (array) - (let ((answer - (alien-funcall - (extern-alien "bsearch_lesseql" - (function int unsigned system-area-pointer int)) - item (sb-sys:vector-sap array) (length array)))) - (unless (eql answer -1) answer))))) - (loop for vector-len from 1 to 40 - do - (let ((maxval 10000) - (a (make-array vector-len :initial-element 0 - :element-type 'sb-vm:word))) - (dotimes (i vector-len) - (let ((val (1+ (random maxval)))) - (loop while (find val a) ; repeat until unique - do (setq val (1+ (random maxval)))) - (setf (aref a i) val))) - (setq a (sort a #'<)) - (map-into a (lambda (x) (* x 5)) a) - ;; Keys less than the lowest in the array should not be found - (assert (not (bsearch<= 0 a))) - (assert (not (bsearch<= (1- (aref a 0)) a))) - (dotimes (i vector-len) - (let ((k (aref a i))) - (assert (= (bsearch<= k a) i)) ; exact match - ;; Any key between K up to but excluding K[i+1] should find I - (assert (= (bsearch<= (1+ k) a) i)) - (let ((higher (if (< (1+ i) vector-len) - (1- (aref a (1+ i))) - (+ k 10000)))) - (assert (= (bsearch<= higher a) i))))))))) + (dotimes (vector-len 51) ; test the edge case of an empty vector + (let ((maxval 10000) + (a (make-array vector-len :initial-element 0 + :element-type 'sb-vm:word))) + (dotimes (i vector-len) + (let ((val (1+ (random maxval)))) + (loop while (find val a) ; repeat until unique + do (setq val (1+ (random maxval)))) + (setf (aref a i) val))) + (setq a (sort a #'<)) + (map-into a (lambda (x) (* x 5)) a) + ;; Keys less than the lowest in the array should not be found by <= + (assert (not (c-bsearch<= 0 a))) + (when (plusp vector-len) + (assert (not (c-bsearch<= (1- (aref a 0)) a)))) + ;; Keys larger than the largest item should not be found by >= + (assert (not (c-bsearch>= most-positive-fixnum a))) + (assert (not (c-bsearch>= most-positive-word a))) + (when (plusp vector-len) + (let ((greatest (aref a (1- vector-len)))) + (loop for i from 1 to 20 + do (assert (not (c-bsearch>= (+ greatest i) a)))))) + (dotimes (i vector-len) + (let ((k (aref a i))) + (assert (= (c-bsearch<= k a) i)) ; exact match + (assert (= (c-bsearch>= k a) i)) ; exact match + ;; Any key between K up to but excluding A[i+1] should find I by <= + (assert (= (c-bsearch<= (1+ k) a) i)) + (let ((higher (if (< (1+ i) vector-len) + (1- (aref a (1+ i))) + (+ k 10000)))) + (assert (= (c-bsearch<= higher a) i))) + ;; Any key down to A[i-1] should find I by >= + (assert (= (c-bsearch>= (1- k) a) i)) + (let ((lower (if (>= (1- i) 0) + (1+ (aref a (1- i))) + 0))) + (assert (= (c-bsearch>= lower a) i)))))))) + (compile 'test-c-bsearch-sorted-vector) (with-test (:name :c-bsearch-sorted-vector) From cb27dae0a999eefa50c0c95d5cec7ac5113dfec2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 22 Jun 2022 12:31:02 -0400 Subject: [PATCH 3576/4023] Remove package qualifier --- src/code/alloc.lisp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index 4aafbf2270..d72bc160ae 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -46,8 +46,7 @@ (let ((v (%make-lisp-obj (sap-int (sap+ pointer other-pointer-lowtag))))) (setf (%array-fill-pointer v) length ;; then store the widetag - (sap-ref-8 pointer #+big-endian (1- sb-vm:n-word-bytes) - #+little-endian 0) + (sap-ref-8 pointer (+ #+big-endian (1- n-word-bytes))) widetag) v) (error 'simple-storage-condition @@ -118,7 +117,7 @@ ;; provided that no zero bits would be right-shifted out. (aver (zerop (logand newval lowtag-mask))) (setf (deref varyobj-pages index) - (logior (ash newval (- 8 (1+ sb-vm:word-shift))) + (logior (ash newval (- 8 (1+ word-shift))) (logand (deref varyobj-pages index) #xFF))) newval) @@ -225,7 +224,7 @@ (- (nth-value 1 (ceiling free-ptr immobile-card-bytes))))) (setf (sap-ref-word (int-sap free-ptr) 0) simple-array-fixnum-widetag (%array-fill-pointer - (%make-lisp-obj (logior free-ptr sb-vm:other-pointer-lowtag))) + (%make-lisp-obj (logior free-ptr other-pointer-lowtag))) ;; Convert bytes to words, subtract the header and vector length. (- (ash n-trailing-bytes (- word-shift)) 2))))) @@ -432,10 +431,8 @@ (logior (ash (1- symbol-size) n-widetag-bits) symbol-widetag))))) ;; symbol-hash was initialized to 0 (%set-symbol-global-value symbol (make-unbound-marker)) - (%primitive sb-vm::set-slot symbol nil - 'make-symbol sb-vm:symbol-info-slot sb-vm:other-pointer-lowtag) - (%primitive sb-vm::set-slot symbol name - 'make-symbol sb-vm:symbol-name-slot sb-vm:other-pointer-lowtag) + (%primitive set-slot symbol nil 'make-symbol symbol-info-slot other-pointer-lowtag) + (%primitive set-slot symbol name 'make-symbol symbol-name-slot other-pointer-lowtag) (%set-symbol-package symbol nil) symbol)) @@ -490,7 +487,7 @@ (eq space :immobile))) ;; x86-64 has a vop which wraps pseudo-atomic around the foreign call, ;; as is the custom for allocation trampolines. - #+x86-64 (%primitive sb-vm::alloc-code total-words boxed) + #+x86-64 (%primitive alloc-code total-words boxed) #-x86-64 (without-gcing (%make-lisp-obj From 4160b16eb4b03b9215ac0dd72621d6f047e46bb2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 22 Jun 2022 12:54:14 -0400 Subject: [PATCH 3577/4023] Revert "Possibly shorten asm code for forwarding_pointer_p()" This reverts commit c9dc0d8784db7dfe8c68dbe493a67edcb845e825. --- src/runtime/forwarding-ptr.h | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/runtime/forwarding-ptr.h b/src/runtime/forwarding-ptr.h index 2fe3f38a59..d6d75f12ef 100644 --- a/src/runtime/forwarding-ptr.h +++ b/src/runtime/forwarding-ptr.h @@ -12,15 +12,10 @@ in_gc_p(void) { inline static boolean forwarding_pointer_p(lispobj *pointer) { + lispobj first_word=*pointer; #ifdef LISP_FEATURE_GENCGC -# ifdef LISP_FEATURE_LITTLE_ENDIAN - // no need to compare the entire word - return *(char*)pointer == 1; -# else - return (*pointer == FORWARDING_HEADER); -#endif + return (first_word == FORWARDING_HEADER); #else - lispobj first_word=*pointer; // FIXME: change 5c0d71f92c371769f911e6a2ac60b2dd9fbde349 added // an extra test here, which theoretically slowed things down. // This was in response to 044e22192c25578efceedba042554dc9a96124c6 From 1fd9a6daeacc48b6b066d729c1ff1d4598bce3d0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 23 Jun 2022 00:00:07 +0300 Subject: [PATCH 3578/4023] Add defknowns for the simd routines. So that their results are not type checked and they can be tail called. --- src/code/simd-fndb.lisp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/code/simd-fndb.lisp b/src/code/simd-fndb.lisp index 856f898a4e..d20a62005f 100644 --- a/src/code/simd-fndb.lisp +++ b/src/code/simd-fndb.lisp @@ -18,3 +18,17 @@ (defknown (setf vector-ref-128) (128-element t index) (values) ()) + +(defknown (simd-nreverse8 simd-nreverse32) ((simple-array * (*)) fixnum fixnum) + (simple-array * (*)) + (sb-c::no-verify-arg-count)) + +(defknown (simd-reverse8 simd-reverse32) ((simple-array * (*)) fixnum fixnum (simple-array * (*))) + (simple-array * (*)) + (sb-c::no-verify-arg-count)) + +(defknown (simd-cmp-8-8 simd-cmp-8-32 simd-cmp-32-32 simd-base-string-equal + simd-base-character-string-equal) + ((simple-array * (*)) (simple-array * (*))) + (boolean) + (sb-c::no-verify-arg-count)) From dd43d5fbb81527827ff6654f049b36f7895d8efa Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 23 Jun 2022 23:16:58 +0300 Subject: [PATCH 3579/4023] Remove a wrong comment. The Y in bignum-truncate-single-digit doesn't have high bits set, as it can be a small fixnum too. But it doesn't overflow anyway. --- src/code/bignum.lisp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index a0180e5d68..0abffd9f92 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -1932,13 +1932,7 @@ rem (%normalize-bignum rem (%bignum-length rem)))))))))) -;;; Divide X by Y when Y is a single bignum digit. -;;; We don't have to worry about shifting Y to make its most -;;; significant digit sufficiently large for %BIGFLOOR to return -;;; digit-size quantities for the q-digit and r-digit. If Y is -;;; a single digit bignum, it is already large enough for -;;; %BIGFLOOR. That is, it has some bits on pretty high in the -;;; digit. +;;; Divide X by Y when Y fits in a word. (defun bignum-truncate-single-digit (x y) (declare (type bignum x) (type (or word sb-vm:signed-word) y) From 01bf3eb4325d653c808fa8f91219e5ffeef63c7c Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 24 Jun 2022 20:56:23 +0300 Subject: [PATCH 3580/4023] Add a test for reverse on specialized vectors. --- tests/seq.pure.lisp | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index 230f10ac1d..79024ab20e 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -707,3 +707,52 @@ ',expected)))) (check (string/= (the simple-string x) (the simple-string y) :end2 0) (or (integer 0 0) null)))) + +(with-test (:name :reverse-specialized-arrays) + (loop for saetp across sb-vm:*specialized-array-element-type-properties* + for type = (sb-kernel:type-specifier (sb-vm:saetp-ctype saetp)) + when type + do + (let ((value-transformer (cond ((eq type 'base-char) + (lambda (x) + (code-char + (if (>= x sb-int:base-char-code-limit) + (random sb-int:base-char-code-limit) + x)))) + #+sb-unicode + ((eq type 'character) + (lambda (x) + (code-char x))) + ((eq type 'bit) + (lambda (x) + x + (random 2))) + ((subtypep type 'integer) + (if (eq type 'fixnum) + #'identity + (let* ((signed (eq (car type) 'signed-byte)) + (width (second type)) + (mod (expt 2 (- width + (if signed + 1 + 0))))) + (if (< mod 1300) + (lambda (x) + (if (>= x mod) + (random mod) + x)) + (lambda (x) + x))))) + (t + (lambda (x) + (coerce x type)))))) + (loop for i to (floor 1300 + (ceiling (sb-vm:saetp-n-bits saetp) sb-vm:n-word-bytes)) + for list = (loop for j from 1 to i + collect (funcall value-transformer j)) + for reverse = (reverse list) + for vector = (make-array i :element-type type + :initial-contents list) + do + (assert (equal reverse (coerce (reverse vector) 'list))) + (assert (equal reverse (coerce (nreverse vector) 'list))))))) From 9c3c6bc09e372e593e3103636b2c5991b365a328 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 24 Jun 2022 21:52:47 +0300 Subject: [PATCH 3581/4023] Make a test #-sb-unicode compatible. --- tests/seq.pure.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index 79024ab20e..3b6561785a 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -713,7 +713,8 @@ for type = (sb-kernel:type-specifier (sb-vm:saetp-ctype saetp)) when type do - (let ((value-transformer (cond ((eq type 'base-char) + (let ((value-transformer (cond ((eq type #+sb-unicode 'base-char + #-sb-unicode 'character) (lambda (x) (code-char (if (>= x sb-int:base-char-code-limit) From 4010c12d39a021cb7bfcb464863c4afd16017d67 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 27 Jun 2022 14:40:07 +0300 Subject: [PATCH 3582/4023] Add a test for reverse on non-simple specialized vectors. --- tests/seq.pure.lisp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index 3b6561785a..cb0fac666e 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -215,7 +215,7 @@ ;;; a proper sequence". (with-test (:name (copy-seq type-error)) (locally (declare (optimize safety)) - (multiple-value-bind (seq err) (ignore-errors (copy-seq '(1 2 3 . 4))) + (multiple-value-bind (seq err) (ignore-errors (copy-seq (opaque-identity '(1 2 3 . 4)))) (assert (not seq)) (assert (typep err 'type-error))))) @@ -755,5 +755,21 @@ for vector = (make-array i :element-type type :initial-contents list) do + (let* ((offset (1+ (random 120))) + (prefix (loop for j from 1 to offset + collect (funcall value-transformer j))) + (suffix (loop for j from 1 to (- 128 offset) + collect (funcall value-transformer j))) + (contents (concatenate 'list prefix list suffix)) + (source (make-array (+ i 128) :element-type type + :initial-contents contents)) + (displaced (make-array i :element-type type + :displaced-to source + :displaced-index-offset offset + :fill-pointer i))) + (assert (equal reverse (coerce (reverse displaced) 'list))) + (assert (equal reverse (coerce (nreverse displaced) 'list))) + (assert (equal prefix (coerce (subseq source 0 offset) 'list))) + (assert (equal suffix (coerce (subseq source (+ offset i)) 'list)))) (assert (equal reverse (coerce (reverse vector) 'list))) (assert (equal reverse (coerce (nreverse vector) 'list))))))) From 83060cd6eab5c53ab58d3beb4db95fa9cb109e0f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 27 Jun 2022 15:51:53 +0300 Subject: [PATCH 3583/4023] x86-64, simd-cmp-8-32: add a missing with-pinned-objects. --- src/code/x86-64-simd.lisp | 77 ++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index ed3b00fa31..caa2003dcb 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -622,41 +622,42 @@ (defun simd-cmp-8-32 (byte-array 32-bit-array) (declare ((simple-array * (*)) byte-array 32-bit-array) (optimize speed (safety 0))) - (inline-vop (((byte-array sap-reg t) (vector-sap byte-array)) - ((32-bit-array sap-reg t) (vector-sap 32-bit-array)) - ((end)) - ((length any-reg) (length byte-array)) - ((cmp unsigned-reg)) - ((bytes int-sse-reg)) - ((32-bits)) - ((zero))) - ((res descriptor-reg t :from :load)) - (load-symbol res t) - (inst test length length) - (inst jmp :z DONE) - (inst pxor zero zero) - (inst shr length 1) - (inst lea end (ea length byte-array)) - - LOOP - (inst movd bytes (ea byte-array)) - (inst movdqa 32-bits (ea 32-bit-array)) - (inst add byte-array 4) - (inst add 32-bit-array 16) - ;; Interleaving with zero widens bytes to halfwords, and then - ;; again to words. - ;; PMOVZXBD from SSE4.1 doesn't seem to be faster. - (inst punpcklbw bytes zero) - (inst punpcklwd bytes zero) - (inst pcmpeqd bytes 32-bits) - (inst pmovmskb cmp bytes) - (inst cmp :dword cmp #xFFFF) - (inst jmp :ne FALSE) - - (inst cmp byte-array end) - (inst jmp :b LOOP) - (inst jmp DONE) - - FALSE - (load-symbol res nil) - DONE)) + (with-pinned-objects (byte-array 32-bit-array) + (inline-vop (((byte-array sap-reg t) (vector-sap byte-array)) + ((32-bit-array sap-reg t) (vector-sap 32-bit-array)) + ((end)) + ((length any-reg) (length byte-array)) + ((cmp unsigned-reg)) + ((bytes int-sse-reg)) + ((32-bits)) + ((zero))) + ((res descriptor-reg t :from :load)) + (load-symbol res t) + (inst test length length) + (inst jmp :z DONE) + (inst pxor zero zero) + (inst shr length 1) + (inst lea end (ea length byte-array)) + + LOOP + (inst movd bytes (ea byte-array)) + (inst movdqa 32-bits (ea 32-bit-array)) + (inst add byte-array 4) + (inst add 32-bit-array 16) + ;; Interleaving with zero widens bytes to halfwords, and then + ;; again to words. + ;; PMOVZXBD from SSE4.1 doesn't seem to be faster. + (inst punpcklbw bytes zero) + (inst punpcklwd bytes zero) + (inst pcmpeqd bytes 32-bits) + (inst pmovmskb cmp bytes) + (inst cmp :dword cmp #xFFFF) + (inst jmp :ne FALSE) + + (inst cmp byte-array end) + (inst jmp :b LOOP) + (inst jmp DONE) + + FALSE + (load-symbol res nil) + DONE))) From c5f95cc50c7a2cf06c21509a29d59fee4f49419e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 27 Jun 2022 22:15:08 +0300 Subject: [PATCH 3584/4023] set-slot-old-p: ignore values that can be boxed. The time of boxing is not known at IR1 level. --- src/compiler/ir1util.lisp | 49 ++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index ef309c217e..5d49a30572 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -435,27 +435,34 @@ (values (car (last args 2)) (car (last args))) (values (first args) (second args))) - (let ((allocator (principal-lvar-ref-use object-lvar)) - (value-ref (principal-lvar-ref value-lvar)) - (uses (lvar-uses value-lvar))) - (when (and (combination-p allocator) - (lvar-fun-is (combination-fun allocator) '(list* list - %make-instance - %make-funcallable-instance))) - - (when value-ref - (let ((var (ref-leaf value-ref))) - (when (and (lambda-var-p (ref-leaf value-ref)) - (not (lambda-var-sets (ref-leaf value-ref)))) - (when (member (functional-kind (lambda-var-home var)) - '(:external :optional)) - (return-from set-slot-old-p t)) - (setf uses (principal-lvar-ref-use value-lvar))))) - (when uses - (if (consp uses) - (loop for use in uses - always (node-dominates-p use allocator)) - (node-dominates-p uses allocator)))))))) + (when (and (lvar-info value-lvar) + ;; Can this lvar be boxed after the allocator? + (let ((prim-type (ir2-lvar-primitive-type (lvar-info value-lvar)))) + (and prim-type + (or (singleton-p (primitive-type-scs prim-type)) + (not (member sb-vm:descriptor-reg-sc-number + (primitive-type-scs prim-type))))))) + (let ((allocator (principal-lvar-ref-use object-lvar)) + (value-ref (principal-lvar-ref value-lvar)) + (uses (lvar-uses value-lvar))) + (when (and (combination-p allocator) + (lvar-fun-is (combination-fun allocator) '(list* list + %make-instance + %make-funcallable-instance))) + + (when value-ref + (let ((var (ref-leaf value-ref))) + (when (and (lambda-var-p (ref-leaf value-ref)) + (not (lambda-var-sets (ref-leaf value-ref)))) + (when (member (functional-kind (lambda-var-home var)) + '(:external :optional)) + (return-from set-slot-old-p t)) + (setf uses (principal-lvar-ref-use value-lvar))))) + (when uses + (if (consp uses) + (loop for use in uses + always (node-dominates-p use allocator)) + (node-dominates-p uses allocator))))))))) ;;;; block starting/creation From 9b417e65d3a82b620617650b4f5ce99aab844015 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 28 Jun 2022 03:08:12 +0300 Subject: [PATCH 3585/4023] set-slot: check for boxed tns before checking for :allocator. --- src/compiler/ir1util.lisp | 49 +++++++++++++++-------------------- src/compiler/x86-64/cell.lisp | 18 ++++++++++--- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index 5d49a30572..ef309c217e 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -435,34 +435,27 @@ (values (car (last args 2)) (car (last args))) (values (first args) (second args))) - (when (and (lvar-info value-lvar) - ;; Can this lvar be boxed after the allocator? - (let ((prim-type (ir2-lvar-primitive-type (lvar-info value-lvar)))) - (and prim-type - (or (singleton-p (primitive-type-scs prim-type)) - (not (member sb-vm:descriptor-reg-sc-number - (primitive-type-scs prim-type))))))) - (let ((allocator (principal-lvar-ref-use object-lvar)) - (value-ref (principal-lvar-ref value-lvar)) - (uses (lvar-uses value-lvar))) - (when (and (combination-p allocator) - (lvar-fun-is (combination-fun allocator) '(list* list - %make-instance - %make-funcallable-instance))) - - (when value-ref - (let ((var (ref-leaf value-ref))) - (when (and (lambda-var-p (ref-leaf value-ref)) - (not (lambda-var-sets (ref-leaf value-ref)))) - (when (member (functional-kind (lambda-var-home var)) - '(:external :optional)) - (return-from set-slot-old-p t)) - (setf uses (principal-lvar-ref-use value-lvar))))) - (when uses - (if (consp uses) - (loop for use in uses - always (node-dominates-p use allocator)) - (node-dominates-p uses allocator))))))))) + (let ((allocator (principal-lvar-ref-use object-lvar)) + (value-ref (principal-lvar-ref value-lvar)) + (uses (lvar-uses value-lvar))) + (when (and (combination-p allocator) + (lvar-fun-is (combination-fun allocator) '(list* list + %make-instance + %make-funcallable-instance))) + + (when value-ref + (let ((var (ref-leaf value-ref))) + (when (and (lambda-var-p (ref-leaf value-ref)) + (not (lambda-var-sets (ref-leaf value-ref)))) + (when (member (functional-kind (lambda-var-home var)) + '(:external :optional)) + (return-from set-slot-old-p t)) + (setf uses (principal-lvar-ref-use value-lvar))))) + (when uses + (if (consp uses) + (loop for use in uses + always (node-dominates-p use allocator)) + (node-dominates-p uses allocator)))))))) ;;;; block starting/creation diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 3903879947..0aced72bb5 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -39,6 +39,7 @@ (:results) (:vop-var vop) (:node-var node) + (:args-var args) (:temporary (:sc unsigned-reg) val-temp) (:generator 1 (cond #+ubsan @@ -50,10 +51,19 @@ (inst mov :dword (vector-len-ea object) (or (encode-value-if-immediate value) value))) (t - ;; gencgc does not need to emit the barrier for constructors - (unless (or (eq name :allocator) - (sb-c::set-slot-old-p node)) - (emit-gc-store-barrier object nil val-temp (vop-nth-arg 1 vop) value)) + (let* ((value-tn (tn-ref-tn (tn-ref-across args))) + (prim-type (sb-c::tn-primitive-type value-tn)) + (scs (and prim-type + (sb-c::primitive-type-scs prim-type)))) + (unless (and + ;; Can this TN be boxed after the allocator? + (or (singleton-p scs) + (not (member descriptor-reg-sc-number scs))) + (or + ;; gencgc does not need to emit the barrier for constructors + (eq name :allocator) + (sb-c::set-slot-old-p node))) + (emit-gc-store-barrier object nil val-temp (vop-nth-arg 1 vop) value))) (gen-cell-set (object-slot-ea object offset lowtag) value val-temp))))) (define-vop (compare-and-swap-slot) From b64db4286a0ba7e30e6620c6dbcbebea59ab3fc1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 28 Jun 2022 11:19:37 -0400 Subject: [PATCH 3586/4023] x86-64: conditionally emit GC barrier in closure-init And a minimal fix to ppc64 and mips - always emit the barrier no matter what. --- src/compiler/mips/cell.lisp | 5 +++- src/compiler/ppc64/cell.lisp | 7 +++-- src/compiler/x86-64/cell.lisp | 12 +++++++-- tests/x86-64-codegen.impure.lisp | 45 ++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/compiler/mips/cell.lisp b/src/compiler/mips/cell.lisp index 0b8a447e6f..16b8feb4a6 100644 --- a/src/compiler/mips/cell.lisp +++ b/src/compiler/mips/cell.lisp @@ -264,8 +264,11 @@ (:args (object :scs (descriptor-reg)) (value :scs (descriptor-reg any-reg))) (:info offset) + (:temporary (:scs (non-descriptor-reg)) temp) (:generator 4 - (storew value object (+ closure-info-offset offset) fun-pointer-lowtag))) + (without-scheduling () + (emit-gc-store-barrier object nil temp) + (storew value object (+ closure-info-offset offset) fun-pointer-lowtag)))) (define-vop (closure-init-from-fp) (:args (object :scs (descriptor-reg))) diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index c29fe76323..a35a7d470a 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -79,10 +79,7 @@ (:temporary (:scs (non-descriptor-reg)) t1) (:vop-var vop) (:generator 1 - ;; gencgc does not need to emit the barrier for constructors - (unless (member name '(%make-structure-instance make-weak-pointer - %make-ratio %make-complex)) - (emit-gc-store-barrier object nil (list t1) (vop-nth-arg 1 vop) value)) + (emit-gc-store-barrier object nil (list t1) (vop-nth-arg 1 vop) value) (storew value object offset lowtag))) (define-vop (compare-and-swap-slot) @@ -459,7 +456,9 @@ (:args (object :scs (descriptor-reg)) (value :scs (descriptor-reg any-reg))) (:info offset) + (:temporary (:scs (non-descriptor-reg)) temp) (:generator 4 + (emit-gc-store-barrier object nil (list temp)) (storew value object (+ closure-info-offset offset) fun-pointer-lowtag))) (define-vop (closure-init-from-fp) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 0aced72bb5..dd13ecea58 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -764,15 +764,23 @@ (:args (object :scs (descriptor-reg)) (value :scs (descriptor-reg any-reg))) (:info offset) + (:vop-var vop) + ;; temp is wasted if we don't need a barrier, which we almost never do + (:temporary (:sc unsigned-reg) temp) (:generator 4 - ;; TODO: gencgc does not need EMIT-GC-STORE-BARRIER here, but other other GC strategies might. + (let* ((value-tn (tn-ref-tn (tn-ref-across (vop-args vop)))) + (prim-type (sb-c::tn-primitive-type value-tn)) + (scs (and prim-type (sb-c::primitive-type-scs prim-type)))) + (when (and (not (singleton-p scs)) + (member descriptor-reg-sc-number scs)) + (emit-gc-store-barrier object nil temp (vop-nth-arg 1 vop) value))) (storew value object (+ closure-info-offset offset) fun-pointer-lowtag))) (define-vop (closure-init-from-fp) (:args (object :scs (descriptor-reg))) (:info offset) (:generator 4 - ;; TODO: gencgc does not need EMIT-GC-STORE-BARRIER here, but other other GC strategies might. + ;; RBP-TN looks like a fixnum (non-pointer) so no barrier (storew rbp-tn object (+ closure-info-offset offset) fun-pointer-lowtag))) ;;;; value cell hackery diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index e16b7bfebe..8de729f55a 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1237,3 +1237,48 @@ (with-test (:name :disassemble-symbol-global-value) (assert (loop for line in (disassembly-lines '(lambda () *myglobalvar*)) thereis (search "*MYGLOBALVAR*" line)))) + +(defun compiler-trace-output-lines (lexpr) + (let ((string-stream (make-string-output-stream))) + (let ((sb-c::*compiler-trace-output* string-stream) + (sb-c::*compile-trace-targets* '(:vop)) + (*print-pretty* nil)) + (compile nil lexpr)) + (split-string (get-output-stream-string string-stream) + #\newline))) + +(defun assert-has-gc-barrier (match-string lines) + (let (found) +;; Look for something like this in the trace output: +;; "VOP CLOSURE-INIT t9[RBX(d)] :NORMAL t13[RSI(d)] :NORMAL {0} " +;; " MOV 0, #<TN t14[RAX(u)] :NORMAL>, #<TN t9[RBX(d)] :NORMAL>" +;; " SHR 0, #<TN t14[RAX(u)] :NORMAL>, 10" +;; " AND 6, #<TN t14[RAX(u)] :NORMAL>, #S(FIXUP :NAME NIL :FLAVOR GC-BARRIER :OFFSET 0)" +;; " MOV 4, PTR [R12+RAX+0], 0" +;; " MOV 7, PTR [RBX+5], #<TN t13[RSI(d)] :NORMAL>" + (loop (when (search match-string (car lines)) + (setq found t) + (let ((barrier-fixup-line (nth 3 lines))) + (assert (search ":FLAVOR GC-BARRIER" barrier-fixup-line)) + (return))) + (pop lines)) + ;; Fail if we didn't find the sentinel CLOSURE-INIT + (assert found))) + +(with-test (:name :closure-init-gc-barrier) + (let ((lines + (compiler-trace-output-lines + '(lambda (address) + (declare (sb-vm:word address)) + (let ((sap (sb-sys:int-sap address))) + (lambda () sap)))))) + (assert-has-gc-barrier "CLOSURE-INIT" lines))) + +(defstruct (point (:constructor make-point (x))) x (y 0) (z 0)) +(with-test (:name :structure-init-gc-barrier) + (let ((lines + (compiler-trace-output-lines + '(lambda (val) + (declare (double-float val) (inline make-point)) + (let ((neg (- val))) (make-point neg)))))) + (assert-has-gc-barrier "SET-SLOT" lines))) From 095688a0dadc99808ed9c8b98dfdaa3fbc5246d0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 28 Jun 2022 11:41:59 -0400 Subject: [PATCH 3587/4023] Fix style-warning --- src/compiler/ppc64/cell.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index a35a7d470a..1ad7a4d72d 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -78,6 +78,7 @@ (:info name offset lowtag) (:temporary (:scs (non-descriptor-reg)) t1) (:vop-var vop) + (:ignore name) (:generator 1 (emit-gc-store-barrier object nil (list t1) (vop-nth-arg 1 vop) value) (storew value object offset lowtag))) From 238ab67f7baf8fd92d8f624df671faabb203acc8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 29 Jun 2022 02:16:41 +0300 Subject: [PATCH 3588/4023] Fix a test for #-compact-instance-header --- tests/x86-64-codegen.impure.lisp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 8de729f55a..f7eab46bc4 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1247,7 +1247,8 @@ (split-string (get-output-stream-string string-stream) #\newline))) -(defun assert-has-gc-barrier (match-string lines) +(defun assert-has-gc-barrier (match-string lines &optional (skip 0)) + (let (found) ;; Look for something like this in the trace output: ;; "VOP CLOSURE-INIT t9[RBX(d)] :NORMAL t13[RSI(d)] :NORMAL {0} " @@ -1256,7 +1257,10 @@ ;; " AND 6, #<TN t14[RAX(u)] :NORMAL>, #S(FIXUP :NAME NIL :FLAVOR GC-BARRIER :OFFSET 0)" ;; " MOV 4, PTR [R12+RAX+0], 0" ;; " MOV 7, PTR [RBX+5], #<TN t13[RSI(d)] :NORMAL>" - (loop (when (search match-string (car lines)) + (loop while lines + do + (when (and (search match-string (car lines)) + (minusp (decf skip))) (setq found t) (let ((barrier-fixup-line (nth 3 lines))) (assert (search ":FLAVOR GC-BARRIER" barrier-fixup-line)) @@ -1277,8 +1281,9 @@ (defstruct (point (:constructor make-point (x))) x (y 0) (z 0)) (with-test (:name :structure-init-gc-barrier) (let ((lines - (compiler-trace-output-lines - '(lambda (val) + (compiler-trace-output-lines + '(lambda (val) (declare (double-float val) (inline make-point)) - (let ((neg (- val))) (make-point neg)))))) - (assert-has-gc-barrier "SET-SLOT" lines))) + (let ((neg (- val))) (make-point neg)))))) + (assert-has-gc-barrier "SET-SLOT" lines + #-compact-instance-header 1))) From f98d226feab8e29ea06446e77cdb4c6526d1abac Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Thu, 30 Jun 2022 08:26:00 +0100 Subject: [PATCH 3589/4023] Adjust NEWS for freeze-period bug fixes --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 13ecb19d6c..55c9376d59 100644 --- a/NEWS +++ b/NEWS @@ -4,7 +4,8 @@ changes relative to sbcl-2.2.5: * minor incompatible change: support for 32-bit x86 on macOS has been removed. * new contrib: sb-simd, to provide a convenient interface for SIMD - programming. (Thanks to Marco Heisig and other sb-simd contributors) + programming on x86-64. (Thanks to Marco Heisig and other sb-simd + contributors) * enhancement: core compression now uses zstd instead of zlib. (lp#1881089) * enhancement: provide compiler warnings for specialized array type mismatches in CONCATENATE. @@ -15,6 +16,8 @@ changes relative to sbcl-2.2.5: * bug fix: fix compilation failure related to declaiming types of constants. (lp#1977726, reported by Pierre Neidhardt) * bug fix: fix race condition in CLOS optimized constructors. (lp#1951341) + * bug fix: fix too-eager elision of allocation barriers when initializing + closure and structure objects. * optimization: fasl files are now usually smaller (up to 10% on default policy) and may load faster, especially on high debug. * optimization: faster string comparisons on arm64, x86-64. From 4b8ada202db5c0066bc9e14c80bb7e4635c4c7e4 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Thu, 30 Jun 2022 08:26:54 +0100 Subject: [PATCH 3590/4023] 2.2.6: will be tagged as "sbcl-2.2.6" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 55c9376d59..40382fee07 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.2.5: +changes in sbcl-2.2.6 relative to sbcl-2.2.5: * minor incompatible change: support for 32-bit x86 on macOS has been removed. * new contrib: sb-simd, to provide a convenient interface for SIMD From ef8ec7f838c92b06a59b6238b70211c39bffeb2e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 30 Jun 2022 15:02:55 +0300 Subject: [PATCH 3591/4023] Don't use AVX for loading simd-pack-256 constants. simd-pack-256-x are only used internally, just access the slots from the boxed object without going through YMM. Fixes lp#1928097 --- src/compiler/x86-64/simd-pack-256.lisp | 35 ++++++-------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/src/compiler/x86-64/simd-pack-256.lisp b/src/compiler/x86-64/simd-pack-256.lisp index 4d6f600f8e..b9233c6c66 100644 --- a/src/compiler/x86-64/simd-pack-256.lisp +++ b/src/compiler/x86-64/simd-pack-256.lisp @@ -162,47 +162,28 @@ (define-vop (%simd-pack-256-0) (:translate %simd-pack-256-0) - (:args (x :scs (int-avx2-reg double-avx2-reg single-avx2-reg))) + (:args (x :scs (descriptor-reg))) (:arg-types simd-pack-256) (:results (dst :scs (unsigned-reg))) (:result-types unsigned-num) (:policy :fast-safe) (:generator 3 - (inst vmovq dst x))) + (loadw dst x simd-pack-256-p0-slot other-pointer-lowtag))) -(define-vop (%simd-pack-256-1) +(define-vop (%simd-pack-256-1 %simd-pack-256-0) (:translate %simd-pack-256-1) - (:args (x :scs (int-avx2-reg double-avx2-reg single-avx2-reg))) - (:arg-types simd-pack-256) - (:results (dst :scs (unsigned-reg))) - (:result-types unsigned-num) - (:policy :fast-safe) (:generator 3 - (inst vpextrq dst x 1))) + (loadw dst x simd-pack-256-p1-slot other-pointer-lowtag))) -(define-vop (%simd-pack-256-2) +(define-vop (%simd-pack-256-2 %simd-pack-256-0) (:translate %simd-pack-256-2) - (:args (x :scs (int-avx2-reg double-avx2-reg single-avx2-reg))) - (:arg-types simd-pack-256) - (:temporary (:sc ymm-reg :from (:argument 1)) tmp) - (:results (dst :scs (unsigned-reg))) - (:result-types unsigned-num) - (:policy :fast-safe) (:generator 3 - (inst vextracti128 tmp x 1) - (inst vmovq dst tmp))) + (loadw dst x simd-pack-256-p2-slot other-pointer-lowtag))) -(define-vop (%simd-pack-256-3) +(define-vop (%simd-pack-256-3 %simd-pack-256-0) (:translate %simd-pack-256-3) - (:args (x :scs (int-avx2-reg double-avx2-reg single-avx2-reg))) - (:arg-types simd-pack-256) - (:temporary (:sc ymm-reg :from (:argument 1)) tmp) - (:results (dst :scs (unsigned-reg))) - (:result-types unsigned-num) - (:policy :fast-safe) (:generator 3 - (inst vextracti128 tmp x 1) - (inst vpextrq dst tmp 1))) + (loadw dst x simd-pack-256-p3-slot other-pointer-lowtag))) (define-vop (%make-simd-pack-256) (:translate %make-simd-pack-256) From 86ba3c6123ef622d77dcf82ade5bb506cecf8828 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 30 Jun 2022 15:39:37 +0300 Subject: [PATCH 3592/4023] Don't preserve CONS types passed to sequence functions. The result of (sort (the (cons (eql 0)) x) y) is not (cons (eql 0)). Fixes lp#1980292 --- src/compiler/fndb.lisp | 12 ++++++++---- tests/seq.pure.lisp | 14 ++++++++++++++ tests/test-util.lisp | 1 - 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 925a1eb731..490b135bed 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -570,7 +570,8 @@ &rest proper-sequence) sequence (call) - :derive-type #'result-type-first-arg) + :derive-type (sequence-result-nth-arg 0 :preserve-dimensions t + :preserve-vector-type t)) (defknown #.(loop for info across sb-vm:*specialized-array-element-type-properties* collect @@ -601,7 +602,8 @@ (defknown fill ((modifying sequence) t &rest t &key (:start index) (:end sequence-end)) sequence () - :derive-type #'result-type-first-arg + :derive-type (sequence-result-nth-arg 0 :preserve-dimensions t + :preserve-vector-type t) :result-arg 0) ;;; Like FILL but with no keyword argument parsing (defknown quickfill ((modifying (simple-array * 1)) t) (simple-array * 1) () @@ -620,7 +622,8 @@ (defknown replace ((modifying sequence) proper-sequence &rest t &key (:start1 index) (:end1 sequence-end) (:start2 index) (:end2 sequence-end)) sequence () - :derive-type #'result-type-first-arg + :derive-type (sequence-result-nth-arg 0 :preserve-dimensions t + :preserve-vector-type t) :result-arg 0) (defknown remove @@ -833,7 +836,8 @@ &key (:key (function-designator ((nth-arg 0 :sequence t))))) sequence (call) - :derive-type #'result-type-first-arg) + :derive-type (sequence-result-nth-arg 0 :preserve-dimensions t + :preserve-vector-type t)) (defknown sb-impl::stable-sort-list (list function function) list (call important-result no-verify-arg-count)) (defknown sb-impl::sort-vector (vector index index function (or function null)) diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index cb0fac666e..76095da19e 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -773,3 +773,17 @@ (assert (equal suffix (coerce (subseq source (+ offset i)) 'list)))) (assert (equal reverse (coerce (reverse vector) 'list))) (assert (equal reverse (coerce (nreverse vector) 'list))))))) + +(with-test (:name :list-derived-type) + (macrolet + ((check (fun expected) + `(assert + (ctype= (second + (third + (sb-kernel:%simple-fun-type + (checked-compile '(lambda (x y) + (declare (ignorable x y)) + ,fun))))) + ',expected)))) + (check (sort (the (cons (eql 0)) x) y) + cons))) diff --git a/tests/test-util.lisp b/tests/test-util.lisp index 0765b162e5..ee4f9f1e47 100644 --- a/tests/test-util.lisp +++ b/tests/test-util.lisp @@ -87,7 +87,6 @@ ;; To actually exercise the type operation, remove the memoized parse. (sb-int:drop-all-hash-caches) (let ((b (sb-kernel:values-specifier-type right))) - (assert (not (eq a b))) (sb-kernel:type= a b)))) (defmacro assert-tri-eq (expected-result expected-certainp form) From e4cc7265a57631654a2903f960a698386a996235 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 30 Jun 2022 15:52:45 +0300 Subject: [PATCH 3593/4023] Remove an unnecessary type-check in list-nreverse. --- src/code/seq.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index a2cef5d589..4117d09a36 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -941,7 +941,7 @@ many elements are copied." ;;;; NREVERSE (defun list-nreverse (list) - (do ((1st (cdr list) (if (endp 1st) 1st (cdr 1st))) + (do ((1st (cdr (truly-the list list)) (cdr 1st)) (2nd list 1st) (3rd '() 2nd)) ((atom 2nd) 3rd) From 183220d13b7e751ed5ecb89fe4a22e9d3867dc2d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 30 Jun 2022 12:46:39 -0400 Subject: [PATCH 3594/4023] Use DEC reg instead of ADD reg,-1 --- src/code/aprof.lisp | 2 +- src/compiler/x86-64/alloc.lisp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/code/aprof.lisp b/src/code/aprof.lisp index 013aab2533..be6624c6de 100644 --- a/src/code/aprof.lisp +++ b/src/code/aprof.lisp @@ -158,7 +158,7 @@ (cmp :qword ?end :tlab-limit) (jmp :nbe ?_) (mov :qword :tlab-freeptr ?end) - (add ?end ?bias) + (:or (add ?end ?bias) (dec ?end)) (mov ?_ (ea ?_ ?end) ?header)) (var-array diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index 40bc4bbce7..961403db46 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -255,7 +255,8 @@ (t ;; SUB can compute the result and tagify it. ;; The fallback also has to tagify. - (inst add alloc-tn (+ (- size) lowtag)) + (let ((bias (+ (- size) lowtag))) + (if (= bias -1) (inst dec alloc-tn) (inst add alloc-tn bias))) (emit-label DONE))))) (assemble (:elsewhere) (emit-label NOT-INLINE) From 730108cb39032410a8529efbeba387e40e59eb8d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 30 Jun 2022 12:48:23 -0400 Subject: [PATCH 3595/4023] Shorten make-closure by 1 byte --- src/compiler/x86-64/alloc.lisp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index 961403db46..08414ce7a3 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -822,11 +822,16 @@ (allocation nil bytes fun-pointer-lowtag result node temp thread-tn)) (storew* #-immobile-space header ; write the widetag and size #+immobile-space ; ... plus the layout pointer - (progn (inst mov temp header) - (inst or temp #-sb-thread (static-symbol-value-ea 'function-layout) - #+sb-thread - (thread-slot-ea thread-function-layout-slot)) - temp) + (let ((layout #-sb-thread (static-symbol-value-ea 'function-layout) + #+sb-thread (thread-slot-ea thread-function-layout-slot))) + (cond ((typep header '(unsigned-byte 16)) + (inst mov temp layout) + ;; emit a 2-byte constant, the low 4 of TEMP were zeroed + (inst mov :word temp header)) + (t + (inst mov temp header) + (inst or temp layout))) + temp) result 0 fun-pointer-lowtag (not stack-allocate-p))) ;; Finished with the pseudo-atomic instructions ;; TODO: gencgc does not need EMIT-GC-STORE-BARRIER here, but other other GC strategies might. From be6166284fda02feb969dde76363c9febd37ad41 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 30 Jun 2022 23:52:10 +0300 Subject: [PATCH 3596/4023] %unary-truncate: negate before shifting left. While the number is not a bignum yet. --- src/code/float.lisp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index 55ed788b7c..5bfffa61b3 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -560,11 +560,11 @@ (if (and (<= (float most-negative-fixnum number) number) (< number (float most-positive-fixnum number))) (truly-the fixnum (%unary-truncate number)) - (multiple-value-bind (bits exp) (integer-decode-float number) - (let ((res (ash bits exp))) - (if (minusp number) - (- res) - res))))))) + (multiple-value-bind (bits exp sign) (integer-decode-float number) + (ash (if (minusp sign) + (- bits) + bits) + exp)))))) ;;; Specialized versions for floats. (macrolet ((def (type name) From 1b5de544d8b2f07aabb9eafb997398472ba41044 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 1 Jul 2022 01:20:42 +0300 Subject: [PATCH 3597/4023] Transform (TRUNCATE x 1) to a function computing both values. Instead of transforming into %unary-truncate and then computing the remainder. The remainder can be more efficiently computed when the type is known. --- src/code/float.lisp | 35 ++++++++++++++++++++++++++++ src/code/target-sxhash.lisp | 5 ++-- src/cold/exports.lisp | 5 +++- src/compiler/float-tran.lisp | 45 +++++++++++++++++++++++------------- src/compiler/fndb.lisp | 6 +++++ src/compiler/srctran.lisp | 16 +++++++++++++ tests/compiler.pure.lisp | 21 ++++++++--------- 7 files changed, 103 insertions(+), 30 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index 5bfffa61b3..12463aae9c 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -566,6 +566,41 @@ bits) exp)))))) +;;; Produce both values, unlike %unary-truncate +(defun unary-truncate (number) + (number-dispatch ((number real)) + ((integer) (values number 0)) + ((ratio) + (let ((truncated (truncate (numerator number) (denominator number)))) + (values truncated + (- number truncated)))) + (((foreach single-float double-float #+long-float long-float)) + (if (and (<= (float most-negative-fixnum number) number) + (< number (float most-positive-fixnum number))) + (let* ((truncated (truly-the fixnum (%unary-truncate number)))) + (values truncated + (- number + (coerce truncated '(dispatch-type number))))) + (multiple-value-bind (bits exp sign) (integer-decode-float number) + (values + (ash (if (minusp sign) + (- bits) + bits) + exp) + (coerce 0 '(dispatch-type number)))))))) + +(macrolet ((def (type) + `(defun ,(symbolicate '%unary-truncate/ type '-to-bignum) (number) + (multiple-value-bind (bits exp sign) (integer-decode-float number) + (values + (ash (if (minusp sign) + (- bits) + bits) + exp) + (coerce 0 ',type)))))) + (def double-float) + (def single-float)) + ;;; Specialized versions for floats. (macrolet ((def (type name) `(defun ,name (number) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 047e3bfcb8..1bd42e9f19 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -361,9 +361,10 @@ (let ((lo (coerce most-negative-fixnum type)) (hi (coerce most-positive-fixnum type))) `(let ((key ,key)) - (cond ( ;; This clause allows FIXNUM-sized integer + (cond (;; This clause allows FIXNUM-sized integer ;; values to be handled without consing. - (<= ,lo key ,hi) + (and (<= ,lo key) + (< key ,hi)) (multiple-value-bind (q r) (floor (the (,type ,lo ,hi) key)) (if (zerop (the ,type r)) (sxhash q) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 989103d417..5efeac4284 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1956,10 +1956,13 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "%SXHASH-SIMPLE-SUBSTRING" "%TAN" "%TAN-QUICK" "%TANH" "THE*" "%UNARY-ROUND" - "%UNARY-TRUNCATE" + "%UNARY-TRUNCATE" "UNARY-TRUNCATE" "%UNARY-TRUNCATE/SINGLE-FLOAT" "%UNARY-TRUNCATE/DOUBLE-FLOAT" "%UNARY-FTRUNCATE" + "UNARY-TRUNCATE-SINGLE-FLOAT-TO-BIGNUM" + "UNARY-TRUNCATE-DOUBLE-FLOAT-TO-BIGNUM" + "%WITH-ARRAY-DATA" "%WITH-ARRAY-DATA/FP" "%WITH-ARRAY-DATA-MACRO" diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 7421fdfbbd..de29518110 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1553,23 +1553,40 @@ ;;;; TRUNCATE, FLOOR, CEILING, and ROUND - -(macrolet ((define-frobs (fun ufun) - `(deftransform ,fun ((x &optional by) - (t &optional (constant-arg (member 1)))) - '(let ((res (,ufun x))) - (values res (locally - (declare (flushable %single-float - %double-float)) - (- x res))))))) - (define-frobs truncate %unary-truncate) - (define-frobs round %unary-round)) +(deftransform truncate ((x &optional by) + (t &optional (constant-arg (member 1)))) + '(unary-truncate x)) + +(deftransform round ((x &optional by) + (t &optional (constant-arg (member 1)))) + '(let ((res (%unary-round x))) + (values res (locally + (declare (flushable %single-float + %double-float)) + (- x res))))) (deftransform %unary-truncate ((x) (single-float)) `(%unary-truncate/single-float x)) (deftransform %unary-truncate ((x) (double-float)) `(%unary-truncate/double-float x)) +(deftransform unary-truncate ((x) * * :result result) + (if (lvar-single-value-p result) + `(values (%unary-truncate x) x) + (give-up-ir1-transform))) + +(macrolet ((def (type) + `(deftransform unary-truncate ((number) (,type)) + '(if (and (<= (float most-negative-fixnum number) number) + (< number (float most-positive-fixnum number))) + (let ((truncated (truly-the fixnum (%unary-truncate number)))) + (values truncated + (- number + (coerce truncated ',type)))) + (,(symbolicate 'unary-truncate- type '-to-bignum) number))))) + (def single-float) + (def double-float)) + ;;; Convert (TRUNCATE x y) to the obvious implementation. ;;; ;;; ...plus hair: Insert explicit coercions to appropriate float types: Python @@ -1596,11 +1613,7 @@ (if (or (not y) (and (constant-lvar-p y) (= 1 (lvar-value y)))) (if compute-all - `(let ((res (,',unary x))) - (values res (- x (locally - ;; Can be flushed as it will produce no errors. - (declare (flushable ,',coerce)) - (,',coerce res))))) + `(unary-truncate x) `(let ((res (,',unary x))) ;; Dummy secondary value! (values res x))) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 490b135bed..eb461d7174 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -344,6 +344,12 @@ (real &optional real) (values integer real) (movable foldable flushable recursive)) +(defknown unary-truncate (real) (values integer real) + (movable foldable flushable)) + +(defknown unary-truncate-single-float-to-bignum (single-float) (values bignum (eql $0f0))) +(defknown unary-truncate-double-float-to-bignum (double-float) (values bignum (eql $0d0))) + (defknown %multiply-high (word word) word (movable foldable flushable)) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 7aca09265e..53a293405c 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -1720,6 +1720,22 @@ (one-arg-derive-type number #'%unary-truncate-derive-type-aux #'%unary-truncate)) + +(defoptimizer (unary-truncate derive-type) ((number)) + (let* ((one (specifier-type '(integer 1 1))) + (quot (one-arg-derive-type number + (lambda (x) + (truncate-derive-type-quot-aux x one nil)) + #'truncate)) + (rem (one-arg-derive-type number + (lambda (x) (truncate-derive-type-rem-aux x one nil)) + #'rem))) + (when (and quot rem) + (make-values-type :required (list quot rem))))) + +(deftransform unary-truncate ((number) (integer)) + '(values number 0)) + #-round-float (progn (defun ftruncate-derive-type-quot (number-type divisor-type) diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index c812caed7a..0a1adfd57b 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -4280,17 +4280,16 @@ (((cons 1.0 2.0) :test '=) t))) (with-test (:name (compile truncate :wild-values)) - (let ((sb-c::*check-consistency* t)) - (checked-compile-and-assert () - `(lambda (a) - (declare (type (member 1d0 2d0) a)) - (block return-value-tag - (funcall - (the function - (catch 'debug-catch-tag - (return-from return-value-tag - (progn (truncate a)))))))) - ((2d0) (values 2 0d0))))) + (checked-compile-and-assert () + `(lambda (a) + (declare (type (member 1d0 2d0) a)) + (block return-value-tag + (funcall + (the function + (catch 'debug-catch-tag + (return-from return-value-tag + (progn (truncate a)))))))) + ((2d0) (values 2 0d0)))) (with-test (:name (compile :boxed-fp-constant-for-full-call)) (let ((fun (checked-compile From 1409947798349325b1d1408691f3d9b2ad69d148 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 1 Jul 2022 02:43:46 +0300 Subject: [PATCH 3598/4023] Fix names. --- float-math.lisp-expr | 5 +++++ src/code/float.lisp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 04b528f4a2..28b2212518 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -569,6 +569,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) +(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5F000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) @@ -761,6 +762,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x3FB99999 #x9999999A) #.(MAKE-DOUBLE-FLOAT #x3FB99999 #x9999999A)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) @@ -2002,6 +2004,7 @@ (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) @@ -3144,6 +3147,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) @@ -3373,6 +3377,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x1FFFFF #xFFFFFFFE)) NIL) diff --git a/src/code/float.lisp b/src/code/float.lisp index 12463aae9c..0da2450b57 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -590,7 +590,7 @@ (coerce 0 '(dispatch-type number)))))))) (macrolet ((def (type) - `(defun ,(symbolicate '%unary-truncate/ type '-to-bignum) (number) + `(defun ,(symbolicate 'unary-truncate- type '-to-bignum) (number) (multiple-value-bind (bits exp sign) (integer-decode-float number) (values (ash (if (minusp sign) From 67168aa8269d144812988062eb74452062443f8d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 1 Jul 2022 03:47:58 +0300 Subject: [PATCH 3599/4023] Fix unary-truncate on 32-bit targets. Non-integer floats can be bignum there. --- src/code/float.lisp | 34 ++++++++++++++++++++++------------ src/compiler/fndb.lisp | 3 ++- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index 0da2450b57..732037ecbf 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -582,22 +582,32 @@ (- number (coerce truncated '(dispatch-type number))))) (multiple-value-bind (bits exp sign) (integer-decode-float number) - (values - (ash (if (minusp sign) - (- bits) - bits) - exp) - (coerce 0 '(dispatch-type number)))))))) + (let ((truncated (ash (if (minusp sign) + (- bits) + bits) + exp))) + (values + truncated + #+64-bit + (coerce 0 '(dispatch-type number)) + #-64-bit + (if (eq '(dispatch-type number) 'single-float) + (coerce 0 '(dispatch-type number)) + (- number (coerce truncated '(dispatch-type number))))))))))) (macrolet ((def (type) `(defun ,(symbolicate 'unary-truncate- type '-to-bignum) (number) (multiple-value-bind (bits exp sign) (integer-decode-float number) - (values - (ash (if (minusp sign) - (- bits) - bits) - exp) - (coerce 0 ',type)))))) + (let ((truncated (if (minusp sign) + (- bits) + bits))) + (values + (ash truncated exp) + ,(case type + ((single-float #+64-bit double-float) + `(coerce 0 ',type)) + (t + `(- number (coerce truncated ',type)))))))))) (def double-float) (def single-float)) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index eb461d7174..f3b2b79d1b 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -348,7 +348,8 @@ (movable foldable flushable)) (defknown unary-truncate-single-float-to-bignum (single-float) (values bignum (eql $0f0))) -(defknown unary-truncate-double-float-to-bignum (double-float) (values bignum (eql $0d0))) +(defknown unary-truncate-double-float-to-bignum (double-float) (values bignum #+64-bit (eql $0d0) + #-64-bit double-float)) (defknown %multiply-high (word word) word (movable foldable flushable)) From 2528bf828e481995d6e0117759c370da408ddd28 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 1 Jul 2022 04:03:34 +0300 Subject: [PATCH 3600/4023] Fix a copy-paste error. --- src/code/float.lisp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index 732037ecbf..62dfc3ed5f 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -598,11 +598,12 @@ (macrolet ((def (type) `(defun ,(symbolicate 'unary-truncate- type '-to-bignum) (number) (multiple-value-bind (bits exp sign) (integer-decode-float number) - (let ((truncated (if (minusp sign) - (- bits) - bits))) + (let ((truncated (ash (if (minusp sign) + (- bits) + bits) + exp))) (values - (ash truncated exp) + truncated ,(case type ((single-float #+64-bit double-float) `(coerce 0 ',type)) From 09ab9398e26c9dda35dc02291e8f271b37acb5d0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 1 Jul 2022 09:09:07 -0400 Subject: [PATCH 3601/4023] Compute list of retained fixups at compile-time, not load-time Thereby removing some architecture-dependent fixup logic from generic files. --- float-math.lisp-expr | 22 ++++++++++ src/compiler/dump.lisp | 17 ++++++-- src/compiler/fixup.lisp | 8 ++-- src/compiler/generic/early-vm.lisp | 29 ------------- src/compiler/generic/genesis.lisp | 29 ++----------- src/compiler/generic/target-core.lisp | 40 +++++++----------- src/compiler/mips/insts.lisp | 10 ++++- src/compiler/ppc64/insts.lisp | 10 ++++- src/compiler/x86-64/insts.lisp | 36 +++++++++------- src/compiler/x86/insts.lisp | 60 ++++++++++++++++----------- 10 files changed, 130 insertions(+), 131 deletions(-) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 28b2212518..24b4ab41cf 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -520,6 +520,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x0)) T) @@ -595,6 +596,8 @@ (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) +(< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) @@ -715,6 +718,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -829,7 +833,9 @@ (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) @@ -1027,6 +1033,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) @@ -1210,6 +1217,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5F000000) #x0) NIL) @@ -1319,6 +1327,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -1553,6 +1562,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -2003,8 +2013,10 @@ (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) @@ -2146,8 +2158,10 @@ (= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) +(= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) T) @@ -2526,6 +2540,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x-368BDC10) #.(MAKE-SINGLE-FLOAT #x497423F0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) @@ -2642,6 +2657,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x447A0000) #.(MAKE-SINGLE-FLOAT #x447A0000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x49742400) #.(MAKE-SINGLE-FLOAT #x49742400)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) @@ -2673,6 +2689,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) T) +(> (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x5F000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x5F800000)) NIL) @@ -2775,6 +2792,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) @@ -2950,6 +2968,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) @@ -2968,6 +2987,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43F00000 #x0)) NIL) @@ -3095,6 +3115,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) @@ -3318,6 +3339,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) T) diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 3516cc386b..603edc5ac8 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1066,14 +1066,23 @@ (aref +fixup-flavors+ (ldb (byte 4 3) packed-info)) (ldb (byte 7 7) packed-info))) +#+(or arm arm64 riscv sparc) ; these don't have any retained packed fixups (yet) +(defun sb-c::pack-retained-fixups (fixup-notes) + (declare (ignore fixup-notes)) + 0) ; as if from PACK-CODE-FIXUP-LOCS + ;;; Dump all the fixups. ;;; - foreign (C) symbols: named by a string ;;; - code object references: don't need a name. ;;; - everything else: a symbol for the name. -(defun dump-fixups (fixups alloc-points fasl-output &aux (nwords 1)) +(defun dump-fixups (fixup-notes alloc-points fasl-output &aux (nelements 2)) (declare (list fixups) (type fasl-output fasl-output)) + ;; "retained" fixups are those whose offset in the code needs to be + ;; remembered for subsequent reapplication by the garbage collector, + ;; or in some cases, on core startup. + (dump-object (sb-c::pack-retained-fixups fixup-notes) fasl-output) (dump-object alloc-points fasl-output) - (dolist (note fixups nwords) + (dolist (note fixup-notes nelements) (let* ((fixup (fixup-note-fixup note)) (name (fixup-name fixup)) (flavor (fixup-flavor fixup)) @@ -1112,8 +1121,8 @@ ((:foreign :foreign-dataref) (the string name)) ((:named-call :static-call) name)))) (dump-object info fasl-output) - (incf nwords (cond (named (dump-object operand fasl-output) 2) - (t 1)))))) + (incf nelements (cond (named (dump-object operand fasl-output) 2) + (t 1)))))) ;;; Dump out the constant pool and code-vector for component, push the ;;; result in the table, and return the offset. diff --git a/src/compiler/fixup.lisp b/src/compiler/fixup.lisp index 307b86d9bd..7f138f4e69 100644 --- a/src/compiler/fixup.lisp +++ b/src/compiler/fixup.lisp @@ -35,10 +35,12 @@ (offset 0 :type (or sb-vm:signed-word label) :read-only t)) +;;; A FIXUP-NOTE tells you where the assembly patch is to be performed (defstruct (fixup-note (:constructor make-fixup-note (kind fixup position)) (:copier nil)) - kind - fixup - position) + ;; KIND is architecture-dependent (see the various 'vm' files) + (kind nil :type symbol) + (fixup (missing-arg) :type fixup) + (position 0 :type fixnum)) (declaim (freeze-type fixup fixup-note)) diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index 2a2656a7b0..bc65bb196c 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -178,35 +178,6 @@ (and (integerp x) (<= most-negative-fixnum x most-positive-fixnum))) -;;; Helper macro for defining FIXUP-CODE-OBJECT with emulation of SAP -;;; accessors so that the host and target can use the same fixup logic. -#+(or x86 x86-64) -(defmacro with-code-instructions ((sap-var code-var) &body body) - #+sb-xc-host - `(macrolet ((self-referential-code-fixup-p (value self) - `(let* ((base (sb-fasl::descriptor-base-address ,self)) - (limit (+ base (1- (code-object-size ,self))))) - (<= base ,value limit))) - (containing-memory-space (code) - `(sb-fasl::descriptor-gspace-name ,code))) - (let ((,sap-var (code-instructions ,code-var))) - ,@body)) - #-sb-xc-host - `(macrolet ((self-referential-code-fixup-p (value self) - ;; Using SAPs keeps all the arithmetic machine-word-sized. - ;; Otherwise it would potentially involve bignums on 32-bit - ;; if code starts at #x20000000 and up. - `(let* ((base (sap+ (int-sap (get-lisp-obj-address ,self)) - (- sb-vm:lowtag-mask))) - (limit (sap+ base (1- (code-object-size ,self)))) - (value-sap (int-sap ,value))) - (and (sap>= value-sap base) (sap<= value-sap limit)))) - (containing-memory-space (code) - (declare (ignore code)) - :dynamic)) - (let ((,sap-var (code-instructions ,code-var))) - ,@body))) - #+sb-safepoint ;;; The offset from the fault address reported to the runtime to the ;;; END of the global safepoint page. diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a01e14320a..7256968c48 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2233,10 +2233,6 @@ Legal values for OFFSET are -4, -8, -12, ..." ;;; Unlike in the target, FOP-KNOWN-FUN sometimes has to backpatch. (defvar *deferred-known-fun-refs*) -;;; In case we need to store code fixups in code objects. -;;; At present only the x86 backends use this -(defvar *code-fixup-notes*) - (defun code-jump-table-words (code) (ldb (byte 14 0) (read-bits-wordindexed code (code-header-words code)))) @@ -2246,11 +2242,7 @@ Legal values for OFFSET are -4, -8, -12, ..." descriptor) cold-fixup)) (defun cold-fixup (code-object after-header value kind flavor) - (let ((classification - (sb-vm:fixup-code-object code-object after-header value kind flavor))) - (when classification - (push (cons classification after-header) - (gethash (descriptor-bits code-object) *code-fixup-notes*)))) + (sb-vm:fixup-code-object code-object after-header value kind flavor) code-object) (defun resolve-static-call-fixups () @@ -2260,18 +2252,6 @@ Legal values for OFFSET are -4, -8, -12, ..." (cold-fun-entry-addr (cold-symbol-function name)) kind :static-call)))) -;;; Save packed lists of fixups. -;;; (cf. FINISH-FIXUPS in generic/target-core.) -(defun repack-fixups (list) - (collect ((immediate) (relative) (absolute)) - (dolist (item list) - (ecase (car item) - ;; There should be no absolute64 fixups to preserve - (:immediate (immediate (cdr item))) - (:relative (relative (cdr item))) - (:absolute (absolute (cdr item))))) - (number-to-core (sb-c:pack-code-fixup-locs (absolute) (relative) (immediate))))) - (defun linkage-table-note-symbol (symbol-name datap) "Register a symbol and return its address in proto-linkage-table." (sb-vm::linkage-table-entry-address @@ -2817,6 +2797,9 @@ Legal values for OFFSET are -4, -8, -12, ..." ;;; Target variant of this is defined in 'target-load' (defun apply-fixups (code-obj fixups index count &aux (end (1- (+ index count)))) + (let ((retained-fixups (svref fixups index))) + (write-wordindexed code-obj sb-vm::code-fixups-slot retained-fixups) + (incf index)) (binding* ((alloc-points (svref fixups index) :exit-if-null)) (cold-set 'sb-c::*!cold-allocation-patch-point* (cold-cons (cold-cons code-obj alloc-points) @@ -3851,7 +3834,6 @@ III. initially undefined function references (alphabetically): *cold-assembler-routines* *cold-assembler-obj* *deferred-undefined-tramp-refs* - (*code-fixup-notes* (make-hash-table)) (*deferred-known-fun-refs* nil)) (make-nil-descriptor) @@ -3918,9 +3900,6 @@ III. initially undefined function references (alphabetically): (resolve-deferred-known-funs) (resolve-static-call-fixups) (foreign-symbols-to-core) - (dolist (pair (sort (%hash-table-alist *code-fixup-notes*) #'< :key #'car)) - (write-wordindexed (make-random-descriptor (car pair)) - sb-vm::code-fixups-slot (repack-fixups (cdr pair)))) (when core-file-name (finish-symbols)) (finalize-load-time-value-noise) diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index ac1bb1c679..a282f31c86 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -71,15 +71,14 @@ (declaim (simple-vector sb-fasl::*asm-routine-index-to-name*)) (flet ((fixup (code-obj offset name kind flavor preserved-lists statically-link-p) - (declare (ignorable statically-link-p)) + (declare (ignorable statically-link-p preserved-lists)) ;; NAME depends on the kind and flavor of fixup. ;; PRESERVED-LISTS is a vector of lists of locations (by kind) ;; at which fixup must be re-applied after code movement. ;; CODE-OBJ must already be pinned in order to legally call this. ;; One call site that reaches here is below at MAKE-CORE-COMPONENT ;; and the other is LOAD-CODE, both of which pin the code. - (ecase - (sb-vm:fixup-code-object + (sb-vm:fixup-code-object code-obj offset (ecase flavor ((:assembly-routine :assembly-routine* :asm-routine-nil-offset) @@ -105,29 +104,10 @@ (when statically-link-p (push (cons offset (find-fdefn name)) (elt preserved-lists 0))))) #+immobile-code (:static-call (sb-vm::function-raw-address name))) - kind flavor) - ((nil)) ; don't need to save it in the code-fixups, otherwise do - (:relative (push offset (elt preserved-lists 1))) - (:absolute (push offset (elt preserved-lists 2))) - (:immediate (push offset (elt preserved-lists 3))) - (:absolute64 (push offset (elt preserved-lists 4))))) + kind flavor)) (finish-fixups (code-obj preserved-lists) - (declare (ignorable code-obj preserved-lists)) - ;; PRESERVED-LISTS are somewhat backend-dependent, but essentially - ;; you get to store three lists that might as well have been named - ;; Larry, Moe, and Curly. - (let ((rel-fixups (elt preserved-lists 1)) - (abs-fixups (elt preserved-lists 2)) - (gc-barrier-fixups (elt preserved-lists 3)) - (abs64-fixups (elt preserved-lists 4))) - ;; the fixup list packer only preserves at most 3 lists. - ;; And it's not clear that this is the best way to represent them. - (aver (not abs64-fixups)) - (when (or abs-fixups rel-fixups gc-barrier-fixups) - (setf (sb-vm::%code-fixups code-obj) - (sb-c:pack-code-fixup-locs abs-fixups rel-fixups gc-barrier-fixups)))) - + (declare (ignorable code-obj)) ;; Assign all SIMPLE-FUN-SELF slots unless #+darwin-jit in which case the simple-funs ;; are assigned by jit_memcpy_codeblob() #-darwin-jit @@ -149,6 +129,10 @@ (defun apply-fasl-fixups (code-obj fixups index count &aux (end (1- (+ index count)))) (dx-let ((preserved (make-array 5 :initial-element nil))) + (let ((retained-fixups (svref fixups index))) + (incf index) + (unless (eql retained-fixups 0) + (setf (sb-vm::%code-fixups code-obj) retained-fixups))) (awhen (svref fixups index) (setf (gethash code-obj *allocation-patch-points*) it)) (loop @@ -164,8 +148,10 @@ (fixup code-obj offset name kind flavor preserved nil))) (finish-fixups code-obj preserved))) - (defun apply-core-fixups (code-obj fixup-notes) + (defun apply-core-fixups (code-obj fixup-notes retained-fixups) (declare (list fixup-notes)) + (unless (eql retained-fixups 0) + (setf (sb-vm::%code-fixups code-obj) retained-fixups)) (dx-let ((preserved (make-array 5 :initial-element nil))) (dolist (note fixup-notes) (let ((fixup (fixup-note-fixup note)) @@ -321,6 +307,7 @@ (:named-call (incf count)) (:fdefinition t))) (setf (second const) (find-or-create-fdefn (second const))))))) + (retained-fixups (pack-retained-fixups fixup-notes)) ((code-obj total-nwords) (allocate-code-object (component-mem-space component) (align-up n-boxed-words code-boxed-words-align) @@ -333,7 +320,8 @@ (sb-fasl::with-writable-code-instructions (code-obj total-nwords debug-info n-named-calls n-simple-funs) :copy (%byte-blt bytes 0 (code-instructions code-obj) 0 (length bytes)) - :fixup (setq named-call-fixups (apply-core-fixups code-obj fixup-notes))) + :fixup (setq named-call-fixups + (apply-core-fixups code-obj fixup-notes retained-fixups))) (when alloc-points #+(and x86-64 sb-thread) diff --git a/src/compiler/mips/insts.lisp b/src/compiler/mips/insts.lisp index a9609ce3cf..fc2a659978 100644 --- a/src/compiler/mips/insts.lisp +++ b/src/compiler/mips/insts.lisp @@ -1449,8 +1449,7 @@ (= (ldb (byte 10 11) next) (logior (ash rd 5) rd)) (= (ldb (byte 6 0) next) #b000010))) (setf (sap-ref-32 sap offset) (dpb left-shamt (byte 5 6) inst)) - (setf (sap-ref-32 sap (+ offset 4)) (dpb right-shamt (byte 5 6) next)) - (return-from fixup-code-object :immediate))) + (setf (sap-ref-32 sap (+ offset 4)) (dpb right-shamt (byte 5 6) next)))) (:jump (aver (zerop (ash value -28))) (setf (ldb (byte 26 0) (sap-ref-32 sap offset)) @@ -1463,6 +1462,13 @@ (ldb (byte 16 0) value))))) nil) +(defun sb-c::pack-retained-fixups (fixup-notes) + (let (result) + (dolist (note fixup-notes (sb-c:pack-code-fixup-locs nil nil result)) + (let ((fixup (fixup-note-fixup note))) + (when (eq (fixup-flavor fixup) :gc-barrier) + (push (fixup-note-position note) result)))))) + (define-instruction store-coverage-mark (segment mark-index) ;; Don't need to annotate the dependence on code-tn, I think? (:dependencies (writes :memory)) diff --git a/src/compiler/ppc64/insts.lisp b/src/compiler/ppc64/insts.lisp index bcbea3cfa1..8441a65589 100644 --- a/src/compiler/ppc64/insts.lisp +++ b/src/compiler/ppc64/insts.lisp @@ -2409,8 +2409,7 @@ (setf (signed-sap-ref-32 sap offset) (the layout-id value))) (:rldic-m ; This is the M (mask) immediate operand to RLDIC{L,R} which ;; appears in (byte 6 5) of the instruction. See EMIT-MD-FORM-INST. - (setf (ldb (byte 6 5) (sap-ref-32 sap offset)) (encode-mask6 (- 64 value))) - (return-from fixup-code-object :immediate)) + (setf (ldb (byte 6 5) (sap-ref-32 sap offset)) (encode-mask6 (- 64 value)))) (:b (error "Can't deal with CALL fixups, yet.")) (:ba @@ -2432,6 +2431,13 @@ (ldb (byte 16 0) value))))) nil) +(defun sb-c::pack-retained-fixups (fixup-notes) + (let (result) + (dolist (note fixup-notes (sb-c:pack-code-fixup-locs nil nil result)) + (let ((fixup (fixup-note-fixup note))) + (when (eq (fixup-flavor fixup) :gc-barrier) + (push (fixup-note-position note) result)))))) + (define-instruction store-coverage-mark (segment mark-index temp) (:emitter ;; No backpatch is needed to compute the offset into the code header diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index b63c4b3520..5d596f767d 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -3326,11 +3326,11 @@ ;;; The code object we're fixing up is pinned whenever this is called. (defun fixup-code-object (code offset value kind flavor) (declare (type index offset)) - (sb-vm::with-code-instructions (sap code) + (let ((sap (code-instructions code))) (when (eq flavor :gc-barrier) ;; the VALUE is nbits, so convert it to an AND mask (setf (sap-ref-32 sap offset) (1- (ash 1 value))) - (return-from fixup-code-object :immediate)) + (return-from fixup-code-object)) ;; All x86-64 fixup locations contain an implicit addend at the location ;; to be fixed up. The addend is always zero for certain <KIND,FLAVOR> pairs, ;; but we don't need to assert that. @@ -3353,13 +3353,13 @@ (error "Can't compute fixup relative to movable object ~S" code)) (setf (signed-sap-ref-32 sap offset) (- value (+ (sap-int sap) offset 4)))) (:absolute64 - ;; These are used for jump tables and are not recorded in code fixups. + ;; These are used for jump tables and are not recorded in %code-fixups. ;; GC knows to adjust the values if code is moved. (setf (sap-ref-64 sap offset) value)))) - #-immobile-code - ;; Change asm routine indirect calls to not store the fixup, - ;; because the indirect address is in static space. - (when (and (eq flavor :assembly-routine*) (eq kind :absolute)) (setq kind :static)) + nil) + +(defun sb-c::pack-retained-fixups (fixup-notes) + (let (abs-fixups rel-fixups imm-fixups) ;; An absolute fixup is stored in the code header's %FIXUPS slot if it ;; references an immobile-space (but not static-space) object. ;; Note that: @@ -3369,19 +3369,23 @@ ;; and therefore might change in displacement from the call site ;; if the immobile code space is relocated on startup. ;; (2) :STATIC-CALL fixups point to immobile space, not static space. - #+immobile-space - (return-from fixup-code-object - (case flavor - ((:named-call :layout :immobile-symbol :symbol-value ; -> fixedobj subspace - :assembly-routine :assembly-routine* :static-call) ; -> varyobj subspace - (if (eq kind :absolute) :absolute)) - (:foreign + (dolist (note fixup-notes (sb-c:pack-code-fixup-locs abs-fixups rel-fixups imm-fixups)) + (let* ((fixup (fixup-note-fixup note)) + (offset (fixup-note-position note)) + (kind (fixup-note-kind note)) + (flavor (fixup-flavor fixup))) + (cond ((eq flavor :gc-barrier) (push offset imm-fixups)) + ((and (memq flavor + '(:named-call :layout :immobile-symbol :symbol-value ; -> fixedobj subspace + :assembly-routine :assembly-routine* :static-call)) ; -> varyobj subspace + (eq kind :absolute)) + #+immobile-space (push offset abs-fixups)) + ((and (eq flavor :foreign) (eq kind :relative)) ;; linkage-table calls using the "CALL rel32" format need to be saved, ;; because the linkage table resides at a fixed address. ;; Space defragmentation can handle the fixup automatically, ;; but core relocation can't - it can't find all the call sites. - (if (eq kind :relative) :relative)))) - nil) ; non-immobile-space builds never record code fixups + #+immobile-space (push offset rel-fixups))))))) ;;; Coverage support diff --git a/src/compiler/x86/insts.lisp b/src/compiler/x86/insts.lisp index 2066f0fdcd..d60865c635 100644 --- a/src/compiler/x86/insts.lisp +++ b/src/compiler/x86/insts.lisp @@ -2406,32 +2406,21 @@ ;;; This gets called by LOAD to resolve newly positioned objects ;;; with things (like code instructions) that have to refer to them. -;;; Return T if and only if the fixup needs to be recorded in %CODE-FIXUPS (defun fixup-code-object (code offset value kind flavor) (declare (type index offset)) - #+sb-xc-host (declare (notinline code-object-size)) ; forward ref - (sb-vm::with-code-instructions (sap code) - (when (eq flavor :gc-barrier) - ;; the VALUE is nbits, so convert it to an AND mask - (setf (sap-ref-32 sap offset) (1- (ash 1 value))) - (return-from fixup-code-object :immediate)) + (let ((sap (code-instructions code))) (ecase kind (:absolute (case flavor (:layout-id - (setf (signed-sap-ref-32 sap offset) value) - nil) ; do not record this + (setf (signed-sap-ref-32 sap offset) value)) + (:gc-barrier + ;; the VALUE is nbits, so convert it to an AND mask + (setf (sap-ref-32 sap offset) (1- (ash 1 value)))) (t - ;; Word at sap + offset contains a value to be replaced by - ;; adding that value to fixup. - (let ((final-val (+ value (sap-ref-32 sap offset)))) - (setf (sap-ref-32 sap offset) final-val) - ;; Record absolute fixups that point into CODE itself, with one - ;; exception: fixups within the range of unboxed words containing - ;; jump tables are automatically adjusted if the code moves. - (and (sb-vm::self-referential-code-fixup-p final-val code) - (>= offset (ash (code-jump-table-words code) word-shift)) - :absolute))))) + ;; 32-bit quantity at SAP + offset contains an + ;; addend to be replaced by adding it to VALUE. + (setf (sap-ref-32 sap offset) (+ value (sap-ref-32 sap offset)))))) (:relative ;; VALUE is the actual address wanted. ;; Replace word with displacement to get there. @@ -2443,11 +2432,34 @@ ;; The CPU calculates based off the next instruction. (rel-val (ldb (byte 32 0) (- value loc-sap 4)))) (declare (type (unsigned-byte 32) loc-sap rel-val)) - (setf (sap-ref-32 sap offset) rel-val)) - ;; Record relative fixups pointing outside of this object. - (when (eq (sb-vm::containing-memory-space code) :dynamic) - (aver (not (sb-vm::self-referential-code-fixup-p value code))) - :relative))))) + (setf (sap-ref-32 sap offset) rel-val))))) + nil) + +(defun sb-c::pack-retained-fixups (fixup-notes) + (let (abs-fixups rel-fixups imm-fixups) + (dolist (note fixup-notes) + (let* ((fixup (fixup-note-fixup note)) + (offset (fixup-note-position note)) + (kind (fixup-note-kind note)) + (flavor (fixup-flavor fixup))) + (cond ((and (eq kind :absolute) (eq flavor :code-object)) + ;; If there are N jump table entries, then any code-object fixups occurring + ;; at offsets 4, 8, 12, ..., 4*N are to patch in the jump vectors, and + ;; do need need to be explicitly retained. GC knows how to fix them again. + ;; (Offset 0 is the jump table count word) + ;; We care where the patch occurs, and NOT where the patch points to. + (unless (<= offset (* sb-vm:n-word-bytes (sb-c::component-n-jump-table-entries))) + (push offset abs-fixups))) + ((and (eq kind :relative) (member flavor '(:assembly-routine :foreign))) + (push offset rel-fixups)) + ((eq flavor :gc-barrier) + (push offset imm-fixups)) + ((or (and (eq kind :absolute) + (member flavor '(:assembly-routine :foreign :foreign-dataref))) + (member flavor '(:layout-id :symbol-tls-index)))) ; discard + (t + (bug "Unexpected fixup"))))) + (sb-c:pack-code-fixup-locs abs-fixups rel-fixups imm-fixups))) ;;; Coverage support From 2ef3e244fe347a2fbddf3ef3169ca471edfe371d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 1 Jul 2022 10:04:38 -0400 Subject: [PATCH 3602/4023] Fix bug in alloc_immobile_fixedobj() The page hint wasn't getting stored when successful --- src/code/alloc.lisp | 14 +++---- src/compiler/x86-64/alloc.lisp | 71 +++++++++++++++++++++++++++++++++- src/runtime/gencgc-internal.h | 4 +- src/runtime/immobile-space.c | 28 ++++++++------ 4 files changed, 96 insertions(+), 21 deletions(-) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index d72bc160ae..f3e060edb4 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -426,14 +426,14 @@ (defun make-immobile-symbol (name) (let ((symbol (truly-the symbol - (alloc-immobile-fixedobj - symbol-size - (logior (ash (1- symbol-size) n-widetag-bits) symbol-widetag))))) - ;; symbol-hash was initialized to 0 - (%set-symbol-global-value symbol (make-unbound-marker)) - (%primitive set-slot symbol nil 'make-symbol symbol-info-slot other-pointer-lowtag) + (or (%primitive fast-alloc-immobile-symbol) + (alloc-immobile-fixedobj + symbol-size + (logior (ash (1- symbol-size) n-widetag-bits) symbol-widetag)))))) + ;; symbol-hash and package ID start out as 0 (%primitive set-slot symbol name 'make-symbol symbol-name-slot other-pointer-lowtag) - (%set-symbol-package symbol nil) + (%primitive set-slot symbol nil 'make-symbol symbol-info-slot other-pointer-lowtag) + (%set-symbol-global-value symbol (make-unbound-marker)) symbol)) ) ; end PROGN diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index 08414ce7a3..ef63327126 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -962,11 +962,11 @@ (allocation nil bytes lowtag result node alloc-temp thread-tn) (storew header result 0 lowtag)))))) +#+immobile-space (macrolet ((c-call (name) `(let ((c-fun (make-fixup ,name :foreign))) (inst call (cond ((sb-c::code-immobile-p node) c-fun) (t (progn (inst mov rax c-fun) rax))))))) -#+immobile-space (define-vop (alloc-immobile-fixedobj) (:args (size-class :scs (any-reg) :target c-arg1) (nwords :scs (any-reg) :target c-arg2) @@ -988,4 +988,73 @@ (c-call "alloc_immobile_fixedobj") (move result rax)))) +;;; Timing test: +;;; Dynamic-space allocation: +;;; * (defun f (n) (dotimes (i n) (make-symbol "b"))) +;;; * (time (f 500000)) +;;; Evaluation took: 0.004 seconds of real time +;;; Immobile-space: +;;; * (defun f (n) (dotimes (i n) (sb-vm::make-immobile-symbol "b"))) +;;; Evaluation took: 0.043 seconds of real time +;;; With vop: 0.028 seconds of real time + +(define-vop (fast-alloc-immobile-symbol) + (:results (result :scs (descriptor-reg))) + (:temporary (:sc unsigned-reg :offset rax-offset) rax) + (:temporary (:sc unsigned-reg :offset rbx-offset) rbx) + (:temporary (:sc unsigned-reg :offset rcx-offset) rcx) + (:temporary (:sc unsigned-reg) header) + (:generator 1 + ;; fixedobj_pages linkage entry: 1 PTE per page, 12-byte struct + (inst mov rbx (ea (make-fixup "fixedobj_pages" :foreign-dataref))) + ;; fixedobj_page_hint: 1 hint per sizeclass. C type = uint32_t + (inst mov rax (ea (make-fixup "fixedobj_page_hint" :foreign-dataref))) + (inst mov rbx (ea rbx)) ; get the base of the fixedobj_pages array + ;; This has to be pseudoatomic as soon as the page hint is loaded. + ;; Consider the situation where there is exactly one symbol on a page that + ;; is almost all free, and the symbol page hint points to that page. + ;; If GC occurs, it might dispose that symbol, resetting the page attributes + ;; and page hint. It would be an error to allocate to that page + ;; because it is no longer a page of symbols but rather a free page. + ;; There is no way to inform GC that we are currently looking at a page + ;; in anticipation of allocating to it. + (pseudo-atomic () + (assemble () + (inst mov :dword rax (ea 4 rax)) ; rax := fixedobj_page_hint[1] (sizeclass=SYMBOL) + (inst test :dword rax rax) + (inst jmp :z FAIL) ; fail if hint page is 0 + (inst lea rcx (ea rax rax 2)) ; rcx := rax * 3 + (inst lea rbx (ea rbx rcx 4)) ; rbx := &fixedobj_pages[hint].free_index + ;; compute fixedobj_page_address(hint) into RAX + (inst mov rcx (ea (make-fixup "FIXEDOBJ_SPACE_START" :foreign-dataref))) + (inst shl rax (integer-length (1- immobile-card-bytes))) + (inst add rax (ea rcx)) + ;; load the page's free pointer + (inst mov :dword rcx (ea rbx)) ; rcx := fixedobj_pages[hint].free_index + ;; fail if set_page_full() was invoked on the page + (inst cmp :dword rcx immobile-card-bytes) + (inst jmp :ae FAIL) + ;; compute address of the allegedly free memory block into RESULT + (inst lea result (ea rcx rax)) ; free_index + page_base + ;; read the potential symbol header + (inst mov rax (ea result)) + (inst test :dword rax 1) + (inst jmp :nz FAIL) ; not a fixnum implies already taken + ;; try to claim this word of memory + (inst mov header (logior (ash (1- symbol-size) n-widetag-bits) symbol-widetag)) + (inst cmpxchg :lock (ea result) header) + (inst jmp :ne FAIL) ; already taken + ;; compute new free_index = spacing + old header + free_index + (inst lea :dword rax (ea (* symbol-size n-word-bytes) rax rcx)) + (inst cmp :dword rax ; don't store if it's not a valid object index + (- immobile-card-bytes (rem immobile-card-bytes (* symbol-size n-word-bytes)))) + (inst jmp :ae NO-WRITEBACK) + (inst mov :dword (ea rbx) rax) ; store new free_index + NO-WRITEBACK + (inst or :byte result other-pointer-lowtag) ; make_lispobj() + (inst jmp OUT) + FAIL + (inst mov result nil-value) + OUT)))) + ) ; end MACROLET diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 73ec6a1633..4f2596d9fb 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -333,6 +333,7 @@ static boolean __attribute__((unused)) new_space_p(lispobj obj) #ifdef LISP_FEATURE_IMMOBILE_SPACE struct fixedobj_page { // 12 bytes per page + unsigned int free_index; // index is in bytes. 4 bytes union immobile_page_attr { int packed; struct { @@ -343,8 +344,7 @@ struct fixedobj_page { // 12 bytes per page unsigned char gens_; // a bitmap } parts; } attr; - int free_index; // index is in bytes. 4 bytes - short int prior_gc_free_word_index; // index is in words. 2 bytes + unsigned short int prior_gc_free_word_index; // index is in words. 2 bytes /* page index of next page with same attributes */ short int page_link; // 2 bytes }; diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 95e24f56a6..0703cfeb6e 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -235,7 +235,7 @@ static int get_freeish_page(int hint_page, int attributes) /// Size class is specified by lisp now #define MAX_ALLOCATOR_SIZE_CLASSES 10 -long fixedobj_page_hint[MAX_ALLOCATOR_SIZE_CLASSES]; +uint32_t fixedobj_page_hint[MAX_ALLOCATOR_SIZE_CLASSES]; // Unused, but possibly will be for some kind of collision-avoidance scheme // on claiming of new free pages. @@ -268,15 +268,18 @@ alloc_immobile_fixedobj(int size_class, int spacing_words, uword_t header) spacing_words = fixnum_value(spacing_words); header = fixnum_value(header); - int page; + unsigned int page; lispobj word; - char * page_data, * obj_ptr, * next_obj_ptr, * limit, * next_free; int page_attributes = MAKE_ATTR(spacing_words); int spacing_in_bytes = spacing_words << WORD_SHIFT; const int npages = FIXEDOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; page = fixedobj_page_hint[size_class]; - if (!page) page = get_freeish_page(0, page_attributes); + if (!page) { + page = get_freeish_page(0, page_attributes); + __sync_val_compare_and_swap(&fixedobj_page_hint[size_class], 0, page); + } + /* BUG: This assertion is itself buggy and has to be commented out * if running with extra debug assertions. * It's only OK in single-threaded code, but consider two threads: @@ -297,24 +300,27 @@ alloc_immobile_fixedobj(int size_class, int spacing_words, uword_t header) * 5. pass the dcheck */ // gc_dcheck(fixedobj_page_address(page) < (void*)fixedobj_free_pointer); do { - page_data = fixedobj_page_address(page); - obj_ptr = page_data + fixedobj_pages[page].free_index; - limit = page_data + IMMOBILE_CARD_BYTES - spacing_in_bytes; + char *page_data = fixedobj_page_address(page); + char *limit = page_data + IMMOBILE_CARD_BYTES - spacing_in_bytes; + char *obj_ptr = page_data + fixedobj_pages[page].free_index; + gc_assert(obj_ptr <= limit || (char*)obj_ptr == (page_data + IMMOBILE_CARD_BYTES)); while (obj_ptr <= limit) { word = *(lispobj*)obj_ptr; - next_obj_ptr = obj_ptr + spacing_in_bytes; + char *next_obj_ptr = obj_ptr + spacing_in_bytes; if (fixnump(word) // a fixnum marks free space && __sync_bool_compare_and_swap((lispobj*)obj_ptr, word, header)) { // The value formerly in the header word was the offset to // the next hole. Use it to update the freelist pointer. - // Just slam it in. - fixedobj_pages[page].free_index = next_obj_ptr + word - page_data; + // Just slam it in, unless too large to use for the next object. + int new_free_index = next_obj_ptr + word - page_data; + if (new_free_index + spacing_in_bytes <= (int)IMMOBILE_CARD_BYTES) + fixedobj_pages[page].free_index = new_free_index; return compute_lispobj((lispobj*)obj_ptr); } // If some other thread updated the free_index // to a larger value, use that. (See example below) - next_free = page_data + fixedobj_pages[page].free_index; + char *next_free = page_data + fixedobj_pages[page].free_index; obj_ptr = next_free > next_obj_ptr ? next_free : next_obj_ptr; } set_page_full(page); From 52f10e1b462033cef1aa410015fd4c61bac0679f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 1 Jul 2022 11:06:00 -0400 Subject: [PATCH 3603/4023] Fix typo --- src/compiler/dump.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 603edc5ac8..81532bf914 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1076,7 +1076,7 @@ ;;; - code object references: don't need a name. ;;; - everything else: a symbol for the name. (defun dump-fixups (fixup-notes alloc-points fasl-output &aux (nelements 2)) - (declare (list fixups) (type fasl-output fasl-output)) + (declare (list fixups-notes) (type fasl-output fasl-output)) ;; "retained" fixups are those whose offset in the code needs to be ;; remembered for subsequent reapplication by the garbage collector, ;; or in some cases, on core startup. From c4d1769188139ddf882ef033603ed361d7ec968c Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 1 Jul 2022 16:11:46 +0100 Subject: [PATCH 3604/4023] Fix typo (for real) --- src/compiler/dump.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 81532bf914..e09fc6f2fc 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1076,7 +1076,7 @@ ;;; - code object references: don't need a name. ;;; - everything else: a symbol for the name. (defun dump-fixups (fixup-notes alloc-points fasl-output &aux (nelements 2)) - (declare (list fixups-notes) (type fasl-output fasl-output)) + (declare (type list fixup-notes) (type fasl-output fasl-output)) ;; "retained" fixups are those whose offset in the code needs to be ;; remembered for subsequent reapplication by the garbage collector, ;; or in some cases, on core startup. From 4f05f640323a91d69da943aea88382852a95fe52 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 27 Jun 2022 11:52:12 +0100 Subject: [PATCH 3605/4023] Fix a typo in unicode collation key computation The BBBB value is sensitive only to the lower 15 bits of the code point (not 19). --- src/code/target-unicode.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 7735995176..7c56e9f88e 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -1345,7 +1345,7 @@ it defaults to 80 characters" (t #xFB80))) (a (+ base (ash cp -15))) - (b (logior #.(ash 1 15) (logand cp #x7FFFF)))) + (b (logior #.(ash 1 15) (logand cp #x7FFF)))) (list (list a #x20 #x2) (list b 0 0)))))))) (defun sort-key (string) From 8166509b156be3484a516a690a307693f042e8c0 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 27 Jun 2022 12:14:03 +0100 Subject: [PATCH 3606/4023] Reorder clauses in COLLATION-KEY In preparation for an update to Unicode 9.0, which extends the set of characters with implicit collation key weights. --- src/code/target-unicode.lisp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 7c56e9f88e..09d66c92e1 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -1327,25 +1327,21 @@ it defaults to 80 characters" (t ;; There are never more than three characters in a contraction, right? (return-from collation-key nil))) - (let ((packed-key (gethash (pack-3-codepoints - (char-code char1) - (char-code char2) - (char-code char3)) - **character-collations**))) + (let* ((code1 (char-code char1)) + (packed-key (gethash (pack-3-codepoints code1 (char-code char2) (char-code char3)) + **character-collations**))) (if packed-key (unpack-collation-key packed-key) (when (char= (code-char 0) char2 char3) - (let* ((cp (char-code char1)) + (let* ((unified-ideograph-p (proplist-p char1 :unified-ideograph)) (base - (cond ((not (proplist-p char1 :unified-ideograph)) - #xFBC0) - ((or (<= #x4E00 cp #x9FFF) - (<= #xF900 cp #xFAFF)) + (cond ((and unified-ideograph-p + (or (<= #x4E00 code1 #x9FFF) (<= #xF900 code1 #xFAFF))) #xFB40) - (t - #xFB80))) - (a (+ base (ash cp -15))) - (b (logior #.(ash 1 15) (logand cp #x7FFF)))) + (unified-ideograph-p #xFB80) + (t #xFBC0))) + (a (+ base (ash code1 -15))) + (b (logior #.(ash 1 15) (logand code1 #x7FFF)))) (list (list a #x20 #x2) (list b 0 0)))))))) (defun sort-key (string) From 2e3015028ded6927c399e3698936f4d5c2091260 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 27 Jun 2022 12:39:41 +0100 Subject: [PATCH 3607/4023] Build using unmodified allkeys.txt UCA data file --- tools-for-build/allkeys.txt | 60134 +++++++++++++++++----------------- tools-for-build/ucd.lisp | 9 +- 2 files changed, 30081 insertions(+), 30062 deletions(-) diff --git a/tools-for-build/allkeys.txt b/tools-for-build/allkeys.txt index a0892568c5..e1c34b8fee 100644 --- a/tools-for-build/allkeys.txt +++ b/tools-for-build/allkeys.txt @@ -1,30058 +1,30076 @@ -# allkeys.txt from Unicode 8.0.0 (comments removed) -0000 ; [.0000.0000.0000] -0001 ; [.0000.0000.0000] -0002 ; [.0000.0000.0000] -0003 ; [.0000.0000.0000] -0004 ; [.0000.0000.0000] -0005 ; [.0000.0000.0000] -0006 ; [.0000.0000.0000] -0007 ; [.0000.0000.0000] -0008 ; [.0000.0000.0000] -000E ; [.0000.0000.0000] -000F ; [.0000.0000.0000] -0010 ; [.0000.0000.0000] -0011 ; [.0000.0000.0000] -0012 ; [.0000.0000.0000] -0013 ; [.0000.0000.0000] -0014 ; [.0000.0000.0000] -0015 ; [.0000.0000.0000] -0016 ; [.0000.0000.0000] -0017 ; [.0000.0000.0000] -0018 ; [.0000.0000.0000] -0019 ; [.0000.0000.0000] -001A ; [.0000.0000.0000] -001B ; [.0000.0000.0000] -001C ; [.0000.0000.0000] -001D ; [.0000.0000.0000] -001E ; [.0000.0000.0000] -001F ; [.0000.0000.0000] -007F ; [.0000.0000.0000] -0080 ; [.0000.0000.0000] -0081 ; [.0000.0000.0000] -0082 ; [.0000.0000.0000] -0083 ; [.0000.0000.0000] -0084 ; [.0000.0000.0000] -0086 ; [.0000.0000.0000] -0087 ; [.0000.0000.0000] -0088 ; [.0000.0000.0000] -0089 ; [.0000.0000.0000] -008A ; [.0000.0000.0000] -008B ; [.0000.0000.0000] -008C ; [.0000.0000.0000] -008D ; [.0000.0000.0000] -008E ; [.0000.0000.0000] -008F ; [.0000.0000.0000] -0090 ; [.0000.0000.0000] -0091 ; [.0000.0000.0000] -0092 ; [.0000.0000.0000] -0093 ; [.0000.0000.0000] -0094 ; [.0000.0000.0000] -0095 ; [.0000.0000.0000] -0096 ; [.0000.0000.0000] -0097 ; [.0000.0000.0000] -0098 ; [.0000.0000.0000] -0099 ; [.0000.0000.0000] -009A ; [.0000.0000.0000] -009B ; [.0000.0000.0000] -009C ; [.0000.0000.0000] -009D ; [.0000.0000.0000] -009E ; [.0000.0000.0000] -009F ; [.0000.0000.0000] -00AD ; [.0000.0000.0000] -061C ; [.0000.0000.0000] -070F ; [.0000.0000.0000] -180B ; [.0000.0000.0000] -180C ; [.0000.0000.0000] -180D ; [.0000.0000.0000] -180E ; [.0000.0000.0000] -200B ; [.0000.0000.0000] -200C ; [.0000.0000.0000] -200D ; [.0000.0000.0000] -200E ; [.0000.0000.0000] -200F ; [.0000.0000.0000] -202A ; [.0000.0000.0000] -202B ; [.0000.0000.0000] -202C ; [.0000.0000.0000] -202D ; [.0000.0000.0000] -202E ; [.0000.0000.0000] -2060 ; [.0000.0000.0000] -2066 ; [.0000.0000.0000] -2067 ; [.0000.0000.0000] -2068 ; [.0000.0000.0000] -2069 ; [.0000.0000.0000] -206A ; [.0000.0000.0000] -206B ; [.0000.0000.0000] -206C ; [.0000.0000.0000] -206D ; [.0000.0000.0000] -206E ; [.0000.0000.0000] -206F ; [.0000.0000.0000] -FE00 ; [.0000.0000.0000] -FE01 ; [.0000.0000.0000] -FE02 ; [.0000.0000.0000] -FE03 ; [.0000.0000.0000] -FE04 ; [.0000.0000.0000] -FE05 ; [.0000.0000.0000] -FE06 ; [.0000.0000.0000] -FE07 ; [.0000.0000.0000] -FE08 ; [.0000.0000.0000] -FE09 ; [.0000.0000.0000] -FE0A ; [.0000.0000.0000] -FE0B ; [.0000.0000.0000] -FE0C ; [.0000.0000.0000] -FE0D ; [.0000.0000.0000] -FE0E ; [.0000.0000.0000] -FE0F ; [.0000.0000.0000] -FEFF ; [.0000.0000.0000] -FFF9 ; [.0000.0000.0000] -FFFA ; [.0000.0000.0000] -FFFB ; [.0000.0000.0000] -1BCA0 ; [.0000.0000.0000] -1BCA1 ; [.0000.0000.0000] -1BCA2 ; [.0000.0000.0000] -1BCA3 ; [.0000.0000.0000] -1D173 ; [.0000.0000.0000] -1D174 ; [.0000.0000.0000] -1D175 ; [.0000.0000.0000] -1D176 ; [.0000.0000.0000] -1D177 ; [.0000.0000.0000] -1D178 ; [.0000.0000.0000] -1D179 ; [.0000.0000.0000] -1D17A ; [.0000.0000.0000] -E0001 ; [.0000.0000.0000] -E0020 ; [.0000.0000.0000] -E0021 ; [.0000.0000.0000] -E0022 ; [.0000.0000.0000] -E0023 ; [.0000.0000.0000] -E0024 ; [.0000.0000.0000] -E0025 ; [.0000.0000.0000] -E0026 ; [.0000.0000.0000] -E0027 ; [.0000.0000.0000] -E0028 ; [.0000.0000.0000] -E0029 ; [.0000.0000.0000] -E002A ; [.0000.0000.0000] -E002B ; [.0000.0000.0000] -E002C ; [.0000.0000.0000] -E002D ; [.0000.0000.0000] -E002E ; [.0000.0000.0000] -E002F ; [.0000.0000.0000] -E0030 ; [.0000.0000.0000] -E0031 ; [.0000.0000.0000] -E0032 ; [.0000.0000.0000] -E0033 ; [.0000.0000.0000] -E0034 ; [.0000.0000.0000] -E0035 ; [.0000.0000.0000] -E0036 ; [.0000.0000.0000] -E0037 ; [.0000.0000.0000] -E0038 ; [.0000.0000.0000] -E0039 ; [.0000.0000.0000] -E003A ; [.0000.0000.0000] -E003B ; [.0000.0000.0000] -E003C ; [.0000.0000.0000] -E003D ; [.0000.0000.0000] -E003E ; [.0000.0000.0000] -E003F ; [.0000.0000.0000] -E0040 ; [.0000.0000.0000] -E0041 ; [.0000.0000.0000] -E0042 ; [.0000.0000.0000] -E0043 ; [.0000.0000.0000] -E0044 ; [.0000.0000.0000] -E0045 ; [.0000.0000.0000] -E0046 ; [.0000.0000.0000] -E0047 ; [.0000.0000.0000] -E0048 ; [.0000.0000.0000] -E0049 ; [.0000.0000.0000] -E004A ; [.0000.0000.0000] -E004B ; [.0000.0000.0000] -E004C ; [.0000.0000.0000] -E004D ; [.0000.0000.0000] -E004E ; [.0000.0000.0000] -E004F ; [.0000.0000.0000] -E0050 ; [.0000.0000.0000] -E0051 ; [.0000.0000.0000] -E0052 ; [.0000.0000.0000] -E0053 ; [.0000.0000.0000] -E0054 ; [.0000.0000.0000] -E0055 ; [.0000.0000.0000] -E0056 ; [.0000.0000.0000] -E0057 ; [.0000.0000.0000] -E0058 ; [.0000.0000.0000] -E0059 ; [.0000.0000.0000] -E005A ; [.0000.0000.0000] -E005B ; [.0000.0000.0000] -E005C ; [.0000.0000.0000] -E005D ; [.0000.0000.0000] -E005E ; [.0000.0000.0000] -E005F ; [.0000.0000.0000] -E0060 ; [.0000.0000.0000] -E0061 ; [.0000.0000.0000] -E0062 ; [.0000.0000.0000] -E0063 ; [.0000.0000.0000] -E0064 ; [.0000.0000.0000] -E0065 ; [.0000.0000.0000] -E0066 ; [.0000.0000.0000] -E0067 ; [.0000.0000.0000] -E0068 ; [.0000.0000.0000] -E0069 ; [.0000.0000.0000] -E006A ; [.0000.0000.0000] -E006B ; [.0000.0000.0000] -E006C ; [.0000.0000.0000] -E006D ; [.0000.0000.0000] -E006E ; [.0000.0000.0000] -E006F ; [.0000.0000.0000] -E0070 ; [.0000.0000.0000] -E0071 ; [.0000.0000.0000] -E0072 ; [.0000.0000.0000] -E0073 ; [.0000.0000.0000] -E0074 ; [.0000.0000.0000] -E0075 ; [.0000.0000.0000] -E0076 ; [.0000.0000.0000] -E0077 ; [.0000.0000.0000] -E0078 ; [.0000.0000.0000] -E0079 ; [.0000.0000.0000] -E007A ; [.0000.0000.0000] -E007B ; [.0000.0000.0000] -E007C ; [.0000.0000.0000] -E007D ; [.0000.0000.0000] -E007E ; [.0000.0000.0000] -E007F ; [.0000.0000.0000] -E0100 ; [.0000.0000.0000] -E0101 ; [.0000.0000.0000] -E0102 ; [.0000.0000.0000] -E0103 ; [.0000.0000.0000] -E0104 ; [.0000.0000.0000] -E0105 ; [.0000.0000.0000] -E0106 ; [.0000.0000.0000] -E0107 ; [.0000.0000.0000] -E0108 ; [.0000.0000.0000] -E0109 ; [.0000.0000.0000] -E010A ; [.0000.0000.0000] -E010B ; [.0000.0000.0000] -E010C ; [.0000.0000.0000] -E010D ; [.0000.0000.0000] -E010E ; [.0000.0000.0000] -E010F ; [.0000.0000.0000] -E0110 ; [.0000.0000.0000] -E0111 ; [.0000.0000.0000] -E0112 ; [.0000.0000.0000] -E0113 ; [.0000.0000.0000] -E0114 ; [.0000.0000.0000] -E0115 ; [.0000.0000.0000] -E0116 ; [.0000.0000.0000] -E0117 ; [.0000.0000.0000] -E0118 ; [.0000.0000.0000] -E0119 ; [.0000.0000.0000] -E011A ; [.0000.0000.0000] -E011B ; [.0000.0000.0000] -E011C ; [.0000.0000.0000] -E011D ; [.0000.0000.0000] -E011E ; [.0000.0000.0000] -E011F ; [.0000.0000.0000] -E0120 ; [.0000.0000.0000] -E0121 ; [.0000.0000.0000] -E0122 ; [.0000.0000.0000] -E0123 ; [.0000.0000.0000] -E0124 ; [.0000.0000.0000] -E0125 ; [.0000.0000.0000] -E0126 ; [.0000.0000.0000] -E0127 ; [.0000.0000.0000] -E0128 ; [.0000.0000.0000] -E0129 ; [.0000.0000.0000] -E012A ; [.0000.0000.0000] -E012B ; [.0000.0000.0000] -E012C ; [.0000.0000.0000] -E012D ; [.0000.0000.0000] -E012E ; [.0000.0000.0000] -E012F ; [.0000.0000.0000] -E0130 ; [.0000.0000.0000] -E0131 ; [.0000.0000.0000] -E0132 ; [.0000.0000.0000] -E0133 ; [.0000.0000.0000] -E0134 ; [.0000.0000.0000] -E0135 ; [.0000.0000.0000] -E0136 ; [.0000.0000.0000] -E0137 ; [.0000.0000.0000] -E0138 ; [.0000.0000.0000] -E0139 ; [.0000.0000.0000] -E013A ; [.0000.0000.0000] -E013B ; [.0000.0000.0000] -E013C ; [.0000.0000.0000] -E013D ; [.0000.0000.0000] -E013E ; [.0000.0000.0000] -E013F ; [.0000.0000.0000] -E0140 ; [.0000.0000.0000] -E0141 ; [.0000.0000.0000] -E0142 ; [.0000.0000.0000] -E0143 ; [.0000.0000.0000] -E0144 ; [.0000.0000.0000] -E0145 ; [.0000.0000.0000] -E0146 ; [.0000.0000.0000] -E0147 ; [.0000.0000.0000] -E0148 ; [.0000.0000.0000] -E0149 ; [.0000.0000.0000] -E014A ; [.0000.0000.0000] -E014B ; [.0000.0000.0000] -E014C ; [.0000.0000.0000] -E014D ; [.0000.0000.0000] -E014E ; [.0000.0000.0000] -E014F ; [.0000.0000.0000] -E0150 ; [.0000.0000.0000] -E0151 ; [.0000.0000.0000] -E0152 ; [.0000.0000.0000] -E0153 ; [.0000.0000.0000] -E0154 ; [.0000.0000.0000] -E0155 ; [.0000.0000.0000] -E0156 ; [.0000.0000.0000] -E0157 ; [.0000.0000.0000] -E0158 ; [.0000.0000.0000] -E0159 ; [.0000.0000.0000] -E015A ; [.0000.0000.0000] -E015B ; [.0000.0000.0000] -E015C ; [.0000.0000.0000] -E015D ; [.0000.0000.0000] -E015E ; [.0000.0000.0000] -E015F ; [.0000.0000.0000] -E0160 ; [.0000.0000.0000] -E0161 ; [.0000.0000.0000] -E0162 ; [.0000.0000.0000] -E0163 ; [.0000.0000.0000] -E0164 ; [.0000.0000.0000] -E0165 ; [.0000.0000.0000] -E0166 ; [.0000.0000.0000] -E0167 ; [.0000.0000.0000] -E0168 ; [.0000.0000.0000] -E0169 ; [.0000.0000.0000] -E016A ; [.0000.0000.0000] -E016B ; [.0000.0000.0000] -E016C ; [.0000.0000.0000] -E016D ; [.0000.0000.0000] -E016E ; [.0000.0000.0000] -E016F ; [.0000.0000.0000] -E0170 ; [.0000.0000.0000] -E0171 ; [.0000.0000.0000] -E0172 ; [.0000.0000.0000] -E0173 ; [.0000.0000.0000] -E0174 ; [.0000.0000.0000] -E0175 ; [.0000.0000.0000] -E0176 ; [.0000.0000.0000] -E0177 ; [.0000.0000.0000] -E0178 ; [.0000.0000.0000] -E0179 ; [.0000.0000.0000] -E017A ; [.0000.0000.0000] -E017B ; [.0000.0000.0000] -E017C ; [.0000.0000.0000] -E017D ; [.0000.0000.0000] -E017E ; [.0000.0000.0000] -E017F ; [.0000.0000.0000] -E0180 ; [.0000.0000.0000] -E0181 ; [.0000.0000.0000] -E0182 ; [.0000.0000.0000] -E0183 ; [.0000.0000.0000] -E0184 ; [.0000.0000.0000] -E0185 ; [.0000.0000.0000] -E0186 ; [.0000.0000.0000] -E0187 ; [.0000.0000.0000] -E0188 ; [.0000.0000.0000] -E0189 ; [.0000.0000.0000] -E018A ; [.0000.0000.0000] -E018B ; [.0000.0000.0000] -E018C ; [.0000.0000.0000] -E018D ; [.0000.0000.0000] -E018E ; [.0000.0000.0000] -E018F ; [.0000.0000.0000] -E0190 ; [.0000.0000.0000] -E0191 ; [.0000.0000.0000] -E0192 ; [.0000.0000.0000] -E0193 ; [.0000.0000.0000] -E0194 ; [.0000.0000.0000] -E0195 ; [.0000.0000.0000] -E0196 ; [.0000.0000.0000] -E0197 ; [.0000.0000.0000] -E0198 ; [.0000.0000.0000] -E0199 ; [.0000.0000.0000] -E019A ; [.0000.0000.0000] -E019B ; [.0000.0000.0000] -E019C ; [.0000.0000.0000] -E019D ; [.0000.0000.0000] -E019E ; [.0000.0000.0000] -E019F ; [.0000.0000.0000] -E01A0 ; [.0000.0000.0000] -E01A1 ; [.0000.0000.0000] -E01A2 ; [.0000.0000.0000] -E01A3 ; [.0000.0000.0000] -E01A4 ; [.0000.0000.0000] -E01A5 ; [.0000.0000.0000] -E01A6 ; [.0000.0000.0000] -E01A7 ; [.0000.0000.0000] -E01A8 ; [.0000.0000.0000] -E01A9 ; [.0000.0000.0000] -E01AA ; [.0000.0000.0000] -E01AB ; [.0000.0000.0000] -E01AC ; [.0000.0000.0000] -E01AD ; [.0000.0000.0000] -E01AE ; [.0000.0000.0000] -E01AF ; [.0000.0000.0000] -E01B0 ; [.0000.0000.0000] -E01B1 ; [.0000.0000.0000] -E01B2 ; [.0000.0000.0000] -E01B3 ; [.0000.0000.0000] -E01B4 ; [.0000.0000.0000] -E01B5 ; [.0000.0000.0000] -E01B6 ; [.0000.0000.0000] -E01B7 ; [.0000.0000.0000] -E01B8 ; [.0000.0000.0000] -E01B9 ; [.0000.0000.0000] -E01BA ; [.0000.0000.0000] -E01BB ; [.0000.0000.0000] -E01BC ; [.0000.0000.0000] -E01BD ; [.0000.0000.0000] -E01BE ; [.0000.0000.0000] -E01BF ; [.0000.0000.0000] -E01C0 ; [.0000.0000.0000] -E01C1 ; [.0000.0000.0000] -E01C2 ; [.0000.0000.0000] -E01C3 ; [.0000.0000.0000] -E01C4 ; [.0000.0000.0000] -E01C5 ; [.0000.0000.0000] -E01C6 ; [.0000.0000.0000] -E01C7 ; [.0000.0000.0000] -E01C8 ; [.0000.0000.0000] -E01C9 ; [.0000.0000.0000] -E01CA ; [.0000.0000.0000] -E01CB ; [.0000.0000.0000] -E01CC ; [.0000.0000.0000] -E01CD ; [.0000.0000.0000] -E01CE ; [.0000.0000.0000] -E01CF ; [.0000.0000.0000] -E01D0 ; [.0000.0000.0000] -E01D1 ; [.0000.0000.0000] -E01D2 ; [.0000.0000.0000] -E01D3 ; [.0000.0000.0000] -E01D4 ; [.0000.0000.0000] -E01D5 ; [.0000.0000.0000] -E01D6 ; [.0000.0000.0000] -E01D7 ; [.0000.0000.0000] -E01D8 ; [.0000.0000.0000] -E01D9 ; [.0000.0000.0000] -E01DA ; [.0000.0000.0000] -E01DB ; [.0000.0000.0000] -E01DC ; [.0000.0000.0000] -E01DD ; [.0000.0000.0000] -E01DE ; [.0000.0000.0000] -E01DF ; [.0000.0000.0000] -E01E0 ; [.0000.0000.0000] -E01E1 ; [.0000.0000.0000] -E01E2 ; [.0000.0000.0000] -E01E3 ; [.0000.0000.0000] -E01E4 ; [.0000.0000.0000] -E01E5 ; [.0000.0000.0000] -E01E6 ; [.0000.0000.0000] -E01E7 ; [.0000.0000.0000] -E01E8 ; [.0000.0000.0000] -E01E9 ; [.0000.0000.0000] -E01EA ; [.0000.0000.0000] -E01EB ; [.0000.0000.0000] -E01EC ; [.0000.0000.0000] -E01ED ; [.0000.0000.0000] -E01EE ; [.0000.0000.0000] -E01EF ; [.0000.0000.0000] -0009 ; [*0201.0020.0002] -000A ; [*0202.0020.0002] -000B ; [*0203.0020.0002] -000C ; [*0204.0020.0002] -000D ; [*0205.0020.0002] -0020 ; [*0209.0020.0002] -0021 ; [*025F.0020.0002] -0022 ; [*0305.0020.0002] -0023 ; [*0391.0020.0002] -0025 ; [*0392.0020.0002] -0026 ; [*038F.0020.0002] -0027 ; [*02FE.0020.0002] -0028 ; [*0310.0020.0002] -0029 ; [*0311.0020.0002] -002A ; [*0388.0020.0002] -002B ; [*05F6.0020.0002] -002C ; [*0221.0020.0002] -002D ; [*020D.0020.0002] -002E ; [*0274.0020.0002] -002F ; [*038D.0020.0002] -003A ; [*0238.0020.0002] -003B ; [*0233.0020.0002] -003C ; [*05FA.0020.0002] -003D ; [*05FB.0020.0002] -003E ; [*05FC.0020.0002] -003F ; [*0264.0020.0002] -0040 ; [*0387.0020.0002] -005B ; [*0312.0020.0002] -005C ; [*038E.0020.0002] -005D ; [*0313.0020.0002] -005E ; [*0466.0020.0002] -005F ; [*020B.0020.0002] -0060 ; [*0463.0020.0002] -007B ; [*0314.0020.0002] -007C ; [*05FE.0020.0002] -007D ; [*0315.0020.0002] -007E ; [*0600.0020.0002] -0085 ; [*0206.0020.0002] -00A0 ; [*0209.0020.001B] -00A1 ; [*0260.0020.0002] -00A6 ; [*05FF.0020.0002] -00A7 ; [*0382.0020.0002] -00A8 ; [*046A.0020.0002] -00A9 ; [*0564.0020.0002] -00AB ; [*030E.0020.0002] -00AC ; [*05FD.0020.0002] -00AE ; [*0565.0020.0002] -00AF ; [*0467.0020.0002] -00B0 ; [*04D7.0020.0002] -00B1 ; [*05F7.0020.0002] -00B4 ; [*0464.0020.0002] -00B6 ; [*0384.0020.0002] -00B7 ; [*0288.0020.0002] -00B8 ; [*046D.0020.0002] -00BB ; [*030F.0020.0002] -00BF ; [*0265.0020.0002] -00D7 ; [*05F9.0020.0002] -00F7 ; [*05F8.0020.0002] -02B9 ; [*0474.0020.0002] -02BA ; [*0476.0020.0002] -02C2 ; [*0477.0020.0002] -02C3 ; [*0478.0020.0002] -02C4 ; [*0479.0020.0002] -02C5 ; [*047A.0020.0002] -02C6 ; [*047B.0020.0002] -02C7 ; [*047C.0020.0002] -02C8 ; [*047D.0020.0002] -02C9 ; [*047E.0020.0002] -02CA ; [*047F.0020.0002] -02CB ; [*0480.0020.0002] -02CC ; [*0481.0020.0002] -02CD ; [*0482.0020.0002] -02CE ; [*0483.0020.0002] -02CF ; [*0484.0020.0002] -02D2 ; [*0485.0020.0002] -02D3 ; [*0486.0020.0002] -02D4 ; [*0487.0020.0002] -02D5 ; [*0488.0020.0002] -02D6 ; [*0489.0020.0002] -02D7 ; [*048A.0020.0002] -02D8 ; [*0468.0020.0002] -02D9 ; [*0469.0020.0002] -02DA ; [*046B.0020.0002] -02DB ; [*046E.0020.0002] -02DC ; [*0465.0020.0002] -02DD ; [*046C.0020.0002] -02DE ; [*048B.0020.0002] -02DF ; [*048C.0020.0002] -02E5 ; [*048D.0020.0002] -02E6 ; [*048E.0020.0002] -02E7 ; [*048F.0020.0002] -02E8 ; [*0490.0020.0002] -02E9 ; [*0491.0020.0002] -02EA ; [*0492.0020.0002] -02EB ; [*0493.0020.0002] -02EC ; [*0494.0020.0002] -02ED ; [*0495.0020.0002] -02EF ; [*0496.0020.0002] -02F0 ; [*0497.0020.0002] -02F1 ; [*0498.0020.0002] -02F2 ; [*0499.0020.0002] -02F3 ; [*049A.0020.0002] -02F4 ; [*049B.0020.0002] -02F5 ; [*049C.0020.0002] -02F6 ; [*049D.0020.0002] -02F7 ; [*049E.0020.0002] -02F8 ; [*049F.0020.0002] -02F9 ; [*04A0.0020.0002] -02FA ; [*04A1.0020.0002] -02FB ; [*04A2.0020.0002] -02FC ; [*04A3.0020.0002] -02FD ; [*04A4.0020.0002] -02FE ; [*04A5.0020.0002] -02FF ; [*04A6.0020.0002] -034F ; [.0000.0000.0000] -0374 ; [*0474.0020.0002] -0375 ; [*0475.0020.0002] -037E ; [*0233.0020.0002] -0384 ; [*0464.0020.0002] -0385 ; [*046A.0020.0002][.0000.0024.0002] -0387 ; [*0288.0020.0002] -03F6 ; [*05F1.0020.0002] -0482 ; [*04D8.0020.0002] -0488 ; [.0000.0000.0000] -0489 ; [.0000.0000.0000] -055A ; [*03C3.0020.0002] -055B ; [*03C4.0020.0002] -055C ; [*0261.0020.0002] -055D ; [*0225.0020.0002] -055E ; [*0267.0020.0002] -055F ; [*03C5.0020.0002] -0589 ; [*0239.0020.0002] -058A ; [*020E.0020.0002] -058D ; [*04D9.0020.0002] -058E ; [*04DA.0020.0002] -0591 ; [.0000.0000.0000] -0592 ; [.0000.0000.0000] -0593 ; [.0000.0000.0000] -0594 ; [.0000.0000.0000] -0595 ; [.0000.0000.0000] -0596 ; [.0000.0000.0000] -0597 ; [.0000.0000.0000] -0598 ; [.0000.0000.0000] -0599 ; [.0000.0000.0000] -059A ; [.0000.0000.0000] -059B ; [.0000.0000.0000] -059C ; [.0000.0000.0000] -059D ; [.0000.0000.0000] -059E ; [.0000.0000.0000] -059F ; [.0000.0000.0000] -05A0 ; [.0000.0000.0000] -05A1 ; [.0000.0000.0000] -05A2 ; [.0000.0000.0000] -05A3 ; [.0000.0000.0000] -05A4 ; [.0000.0000.0000] -05A5 ; [.0000.0000.0000] -05A6 ; [.0000.0000.0000] -05A7 ; [.0000.0000.0000] -05A8 ; [.0000.0000.0000] -05A9 ; [.0000.0000.0000] -05AA ; [.0000.0000.0000] -05AB ; [.0000.0000.0000] -05AC ; [.0000.0000.0000] -05AD ; [.0000.0000.0000] -05AE ; [.0000.0000.0000] -05AF ; [.0000.0000.0000] -05BD ; [.0000.0000.0000] -05BE ; [*03C6.0020.0002] -05C0 ; [*03C7.0020.0002] -05C3 ; [*03C8.0020.0002] -05C4 ; [.0000.0000.0000] -05C5 ; [.0000.0000.0000] -05C6 ; [*03C9.0020.0002] -05F3 ; [*03CA.0020.0002] -05F4 ; [*03CB.0020.0002] -0600 ; [.0000.0000.0000] -0601 ; [.0000.0000.0000] -0602 ; [.0000.0000.0000] -0603 ; [.0000.0000.0000] -0604 ; [.0000.0000.0000] -0605 ; [.0000.0000.0000] -0606 ; [*060D.0020.0002] -0607 ; [*060F.0020.0002] -0608 ; [*04DB.0020.0002] -0609 ; [*0395.0020.0002] -060A ; [*0397.0020.0002] -060C ; [*0226.0020.0002] -060D ; [*0227.0020.0002] -060E ; [*04DE.0020.0002] -060F ; [*04DF.0020.0002] -0610 ; [.0000.0000.0000] -0611 ; [.0000.0000.0000] -0612 ; [.0000.0000.0000] -0613 ; [.0000.0000.0000] -0614 ; [.0000.0000.0000] -0615 ; [.0000.0000.0000] -0616 ; [.0000.0000.0000] -0617 ; [.0000.0000.0000] -0618 ; [.0000.0000.0000] -0619 ; [.0000.0000.0000] -061A ; [.0000.0000.0000] -061B ; [*0234.0020.0002] -061E ; [*023A.0020.0002] -061F ; [*0268.0020.0002] -0640 ; [.0000.0000.0000] -066A ; [*0393.0020.0002] -066B ; [*0228.0020.0002] -066C ; [*0229.0020.0002] -066D ; [*038B.0020.0002] -06D4 ; [*0276.0020.0002] -06D6 ; [.0000.0000.0000] -06D7 ; [.0000.0000.0000] -06D8 ; [.0000.0000.0000] -06D9 ; [.0000.0000.0000] -06DA ; [.0000.0000.0000] -06DB ; [.0000.0000.0000] -06DC ; [.0000.0000.0000] -06DD ; [.0000.0000.0000] -06DE ; [*04E0.0020.0002] -06DF ; [.0000.0000.0000] -06E0 ; [.0000.0000.0000] -06E1 ; [.0000.0000.0000] -06E2 ; [.0000.0000.0000] -06E3 ; [.0000.0000.0000] -06E4 ; [.0000.0000.0000] -06E7 ; [.0000.0000.0000] -06E8 ; [.0000.0000.0000] -06E9 ; [*04E1.0020.0002] -06EA ; [.0000.0000.0000] -06EB ; [.0000.0000.0000] -06EC ; [.0000.0000.0000] -06ED ; [.0000.0000.0000] -0700 ; [*02BD.0020.0002] -0701 ; [*0277.0020.0002] -0702 ; [*0278.0020.0002] -0703 ; [*023B.0020.0002] -0704 ; [*023C.0020.0002] -0705 ; [*023D.0020.0002] -0706 ; [*023E.0020.0002] -0707 ; [*023F.0020.0002] -0708 ; [*0240.0020.0002] -0709 ; [*0269.0020.0002] -070A ; [*03CC.0020.0002] -070B ; [*03CD.0020.0002] -070C ; [*03CE.0020.0002] -070D ; [*03CF.0020.0002] -0740 ; [.0000.0000.0000] -0743 ; [.0000.0000.0000] -0744 ; [.0000.0000.0000] -0747 ; [.0000.0000.0000] -0748 ; [.0000.0000.0000] -0749 ; [.0000.0000.0000] -074A ; [.0000.0000.0000] -07F6 ; [*04F3.0020.0002] -07F7 ; [*02BE.0020.0002] -07F8 ; [*022A.0020.0002] -07F9 ; [*0262.0020.0002] -07FA ; [.0000.0000.0000] -0830 ; [*0241.0020.0002] -0831 ; [*0242.0020.0002] -0832 ; [*0243.0020.0002] -0833 ; [*0244.0020.0002] -0834 ; [*0245.0020.0002] -0835 ; [*0246.0020.0002] -0836 ; [*0247.0020.0002] -0837 ; [*0248.0020.0002] -0838 ; [*0249.0020.0002] -0839 ; [*024A.0020.0002] -083A ; [*024B.0020.0002] -083B ; [*024C.0020.0002] -083C ; [*024D.0020.0002] -083D ; [*024E.0020.0002] -083E ; [*024F.0020.0002] -085E ; [*03D0.0020.0002] -08EA ; [.0000.0000.0000] -08EB ; [.0000.0000.0000] -08EC ; [.0000.0000.0000] -08ED ; [.0000.0000.0000] -08EE ; [.0000.0000.0000] -08EF ; [.0000.0000.0000] -08F3 ; [.0000.0000.0000] -0951 ; [.0000.0000.0000] -0952 ; [.0000.0000.0000] -0964 ; [*028B.0020.0002] -0965 ; [*028C.0020.0002] -0970 ; [*03D2.0020.0002] -09F4 ; [*1A26.0020.0002] -09F5 ; [*1A27.0020.0002] -09F6 ; [*1A28.0020.0002] -09F7 ; [*1A29.0020.0002] -09F8 ; [*1A2A.0020.0002] -09F9 ; [*1A2B.0020.0002] -09FA ; [*04F4.0020.0002] -0AF0 ; [*03D7.0020.0002] -0B70 ; [*04F5.0020.0002] -0B72 ; [*1A2C.0020.0002] -0B73 ; [*1A2D.0020.0002] -0B74 ; [*1A2E.0020.0002] -0B75 ; [*1A2F.0020.0002] -0B76 ; [*1A30.0020.0002] -0B77 ; [*1A31.0020.0002] -0BF0 ; [*1A38.0020.0002] -0BF1 ; [*1A39.0020.0002] -0BF2 ; [*1A3A.0020.0002] -0BF3 ; [*04F6.0020.0002] -0BF4 ; [*04F7.0020.0002] -0BF5 ; [*04F8.0020.0002] -0BF6 ; [*04F9.0020.0002] -0BF7 ; [*04FA.0020.0002] -0BF8 ; [*04FB.0020.0002] -0BFA ; [*04FC.0020.0002] -0C7F ; [*04FD.0020.0002] -0D70 ; [*1A3B.0020.0002] -0D71 ; [*1A3C.0020.0002] -0D72 ; [*1A3D.0020.0002] -0D73 ; [*1A3E.0020.0002] -0D74 ; [*1A3F.0020.0002] -0D75 ; [*1A40.0020.0002] -0D79 ; [*04FE.0020.0002] -0DF4 ; [*03D8.0020.0002] -0E4F ; [*03D9.0020.0002] -0E5A ; [*03DA.0020.0002] -0E5B ; [*03DB.0020.0002] -0F01 ; [*0506.0020.0002] -0F02 ; [*0507.0020.0002] -0F03 ; [*0508.0020.0002] -0F04 ; [*03DE.0020.0002] -0F05 ; [*03DF.0020.0002] -0F06 ; [*03E0.0020.0002] -0F07 ; [*03E1.0020.0002] -0F08 ; [*03E2.0020.0002] -0F09 ; [*03E3.0020.0002] -0F0A ; [*03E4.0020.0002] -0F0B ; [*03E7.0020.0002] -0F0C ; [*03E7.0020.001B] -0F0D ; [*03E8.0020.0002] -0F0E ; [*03E9.0020.0002] -0F0F ; [*03EA.0020.0002] -0F10 ; [*03EB.0020.0002] -0F11 ; [*03EC.0020.0002] -0F12 ; [*03ED.0020.0002] -0F13 ; [*0509.0020.0002] -0F14 ; [*0257.0020.0002] -0F15 ; [*050A.0020.0002] -0F16 ; [*050B.0020.0002] -0F17 ; [*050C.0020.0002] -0F18 ; [.0000.0000.0000] -0F19 ; [.0000.0000.0000] -0F1A ; [*050D.0020.0002] -0F1B ; [*050E.0020.0002] -0F1C ; [*050F.0020.0002] -0F1D ; [*0510.0020.0002] -0F1E ; [*0511.0020.0002] -0F1F ; [*0512.0020.0002] -0F34 ; [*0513.0020.0002] -0F35 ; [.0000.0000.0000] -0F36 ; [*0514.0020.0002] -0F37 ; [.0000.0000.0000] -0F38 ; [*0515.0020.0002] -0F3A ; [*0316.0020.0002] -0F3B ; [*0317.0020.0002] -0F3C ; [*0318.0020.0002] -0F3D ; [*0319.0020.0002] -0F3E ; [.0000.0000.0000] -0F3F ; [.0000.0000.0000] -0F82 ; [.0000.0000.0000] -0F83 ; [.0000.0000.0000] -0F85 ; [*03EE.0020.0002] -0F86 ; [.0000.0000.0000] -0F87 ; [.0000.0000.0000] -0FBE ; [*0516.0020.0002] -0FBF ; [*0517.0020.0002] -0FC0 ; [*0518.0020.0002] -0FC1 ; [*0519.0020.0002] -0FC2 ; [*051A.0020.0002] -0FC3 ; [*051B.0020.0002] -0FC4 ; [*051C.0020.0002] -0FC5 ; [*051D.0020.0002] -0FC6 ; [.0000.0000.0000] -0FC7 ; [*051E.0020.0002] -0FC8 ; [*051F.0020.0002] -0FC9 ; [*0520.0020.0002] -0FCA ; [*0521.0020.0002] -0FCB ; [*0522.0020.0002] -0FCC ; [*0523.0020.0002] -0FCE ; [*0524.0020.0002] -0FCF ; [*0525.0020.0002] -0FD0 ; [*03E5.0020.0002] -0FD1 ; [*03E6.0020.0002] -0FD2 ; [*03EF.0020.0002] -0FD3 ; [*03F0.0020.0002] -0FD4 ; [*03F1.0020.0002] -0FD5 ; [*0526.0020.0002] -0FD6 ; [*0527.0020.0002] -0FD7 ; [*0528.0020.0002] -0FD8 ; [*0529.0020.0002] -0FD9 ; [*03F2.0020.0002] -0FDA ; [*03F3.0020.0002] -104A ; [*0296.0020.0002] -104B ; [*0297.0020.0002] -104C ; [*03F7.0020.0002] -104D ; [*03F8.0020.0002] -104E ; [*03F9.0020.0002] -104F ; [*03FA.0020.0002] -109E ; [*052B.0020.0002] -109F ; [*052C.0020.0002] -10FB ; [*02BF.0020.0002] -1360 ; [*02C0.0020.0002] -1361 ; [*0250.0020.0002] -1362 ; [*0279.0020.0002] -1363 ; [*0251.0020.0002] -1364 ; [*0252.0020.0002] -1365 ; [*0253.0020.0002] -1366 ; [*0254.0020.0002] -1367 ; [*026A.0020.0002] -1368 ; [*02C1.0020.0002] -1372 ; [*1A41.0020.0002] -1373 ; [*1A42.0020.0002] -1374 ; [*1A43.0020.0002] -1375 ; [*1A44.0020.0002] -1376 ; [*1A45.0020.0002] -1377 ; [*1A46.0020.0002] -1378 ; [*1A47.0020.0002] -1379 ; [*1A48.0020.0002] -137A ; [*1A49.0020.0002] -137B ; [*1A4A.0020.0002] -137C ; [*1A4B.0020.0002] -1390 ; [*04A7.0020.0002] -1391 ; [*04A8.0020.0002] -1392 ; [*04A9.0020.0002] -1393 ; [*04AA.0020.0002] -1394 ; [*04AB.0020.0002] -1395 ; [*04AC.0020.0002] -1396 ; [*04AD.0020.0002] -1397 ; [*04AE.0020.0002] -1398 ; [*04AF.0020.0002] -1399 ; [*04B0.0020.0002] -1400 ; [*020F.0020.0002] -166D ; [*0407.0020.0002] -166E ; [*027C.0020.0002] -1680 ; [*0209.0020.0004] -169B ; [*031A.0020.0002] -169C ; [*031B.0020.0002] -16EB ; [*025B.0020.0002] -16EC ; [*025C.0020.0002] -16ED ; [*025D.0020.0002] -1735 ; [*0293.0020.0002] -1736 ; [*0294.0020.0002] -17B4 ; [.0000.0000.0000] -17B5 ; [.0000.0000.0000] -17D3 ; [.0000.0000.0000] -17D4 ; [*0298.0020.0002] -17D5 ; [*0299.0020.0002] -17D6 ; [*0258.0020.0002] -17D8 ; [*03FB.0020.0002] -17D9 ; [*03FC.0020.0002] -17DA ; [*03FD.0020.0002] -1800 ; [*03D1.0020.0002] -1801 ; [*0275.0020.0002] -1802 ; [*022B.0020.0002] -1803 ; [*027A.0020.0002] -1804 ; [*0255.0020.0002] -1805 ; [*0256.0020.0002] -1806 ; [*0211.0020.0002] -1807 ; [*0212.0020.0002] -1808 ; [*022C.0020.0002] -1809 ; [*027B.0020.0002] -180A ; [.0000.0000.0000] -1940 ; [*052A.0020.0002] -1944 ; [*0263.0020.0002] -1945 ; [*026B.0020.0002] -19E0 ; [*0531.0020.0002] -19E1 ; [*0532.0020.0002] -19E2 ; [*0533.0020.0002] -19E3 ; [*0534.0020.0002] -19E4 ; [*0535.0020.0002] -19E5 ; [*0536.0020.0002] -19E6 ; [*0537.0020.0002] -19E7 ; [*0538.0020.0002] -19E8 ; [*0539.0020.0002] -19E9 ; [*053A.0020.0002] -19EA ; [*053B.0020.0002] -19EB ; [*053C.0020.0002] -19EC ; [*053D.0020.0002] -19ED ; [*053E.0020.0002] -19EE ; [*053F.0020.0002] -19EF ; [*0540.0020.0002] -19F0 ; [*0541.0020.0002] -19F1 ; [*0542.0020.0002] -19F2 ; [*0543.0020.0002] -19F3 ; [*0544.0020.0002] -19F4 ; [*0545.0020.0002] -19F5 ; [*0546.0020.0002] -19F6 ; [*0547.0020.0002] -19F7 ; [*0548.0020.0002] -19F8 ; [*0549.0020.0002] -19F9 ; [*054A.0020.0002] -19FA ; [*054B.0020.0002] -19FB ; [*054C.0020.0002] -19FC ; [*054D.0020.0002] -19FD ; [*054E.0020.0002] -19FE ; [*054F.0020.0002] -19FF ; [*0550.0020.0002] -1A1E ; [*02C2.0020.0002] -1A1F ; [*02C3.0020.0002] -1A7F ; [.0000.0000.0000] -1AA0 ; [*03FE.0020.0002] -1AA1 ; [*03FF.0020.0002] -1AA2 ; [*0400.0020.0002] -1AA3 ; [*0401.0020.0002] -1AA4 ; [*0402.0020.0002] -1AA5 ; [*0403.0020.0002] -1AA6 ; [*0404.0020.0002] -1AA8 ; [*029A.0020.0002] -1AA9 ; [*029B.0020.0002] -1AAA ; [*029C.0020.0002] -1AAB ; [*029D.0020.0002] -1AAC ; [*0405.0020.0002] -1AAD ; [*0406.0020.0002] -1B5A ; [*02C4.0020.0002] -1B5B ; [*02C5.0020.0002] -1B5C ; [*027D.0020.0002] -1B5D ; [*0259.0020.0002] -1B5E ; [*029E.0020.0002] -1B5F ; [*029F.0020.0002] -1B60 ; [*0210.0020.0002] -1B61 ; [*0551.0020.0002] -1B62 ; [*0552.0020.0002] -1B63 ; [*0553.0020.0002] -1B64 ; [*0554.0020.0002] -1B65 ; [*0555.0020.0002] -1B66 ; [*0556.0020.0002] -1B67 ; [*0557.0020.0002] -1B68 ; [*0558.0020.0002] -1B69 ; [*0559.0020.0002] -1B6A ; [*055A.0020.0002] -1B6B ; [.0000.0000.0000] -1B6C ; [.0000.0000.0000] -1B6D ; [.0000.0000.0000] -1B6E ; [.0000.0000.0000] -1B6F ; [.0000.0000.0000] -1B70 ; [.0000.0000.0000] -1B71 ; [.0000.0000.0000] -1B72 ; [.0000.0000.0000] -1B73 ; [.0000.0000.0000] -1B74 ; [*055B.0020.0002] -1B75 ; [*055C.0020.0002] -1B76 ; [*055D.0020.0002] -1B77 ; [*055E.0020.0002] -1B78 ; [*055F.0020.0002] -1B79 ; [*0560.0020.0002] -1B7A ; [*0561.0020.0002] -1B7B ; [*0562.0020.0002] -1B7C ; [*0563.0020.0002] -1BFC ; [*0413.0020.0002] -1BFD ; [*0414.0020.0002] -1BFE ; [*0415.0020.0002] -1BFF ; [*0416.0020.0002] -1C3B ; [*028F.0020.0002] -1C3C ; [*0290.0020.0002] -1C3D ; [*03F4.0020.0002] -1C3E ; [*03F5.0020.0002] -1C3F ; [*03F6.0020.0002] -1C7E ; [*02BB.0020.0002] -1C7F ; [*02BC.0020.0002] -1CC0 ; [*0408.0020.0002] -1CC1 ; [*0409.0020.0002] -1CC2 ; [*040A.0020.0002] -1CC3 ; [*040B.0020.0002] -1CC4 ; [*040C.0020.0002] -1CC5 ; [*040D.0020.0002] -1CC6 ; [*040E.0020.0002] -1CC7 ; [*040F.0020.0002] -1CD0 ; [.0000.0000.0000] -1CD1 ; [.0000.0000.0000] -1CD2 ; [.0000.0000.0000] -1CD3 ; [.0000.0000.0000] -1CD4 ; [.0000.0000.0000] -1CD5 ; [.0000.0000.0000] -1CD6 ; [.0000.0000.0000] -1CD7 ; [.0000.0000.0000] -1CD8 ; [.0000.0000.0000] -1CD9 ; [.0000.0000.0000] -1CDA ; [.0000.0000.0000] -1CDB ; [.0000.0000.0000] -1CDC ; [.0000.0000.0000] -1CDD ; [.0000.0000.0000] -1CDE ; [.0000.0000.0000] -1CDF ; [.0000.0000.0000] -1CE0 ; [.0000.0000.0000] -1CE1 ; [.0000.0000.0000] -1CE2 ; [.0000.0000.0000] -1CE3 ; [.0000.0000.0000] -1CE4 ; [.0000.0000.0000] -1CE5 ; [.0000.0000.0000] -1CE6 ; [.0000.0000.0000] -1CE7 ; [.0000.0000.0000] -1CE8 ; [.0000.0000.0000] -1CF4 ; [.0000.0000.0000] -1CF8 ; [.0000.0000.0000] -1CF9 ; [.0000.0000.0000] -1FBD ; [*046F.0020.0002] -1FBF ; [*046F.0020.0002] -1FC0 ; [*0471.0020.0002] -1FC1 ; [*046A.0020.0002][.0000.002A.0002] -1FCD ; [*046F.0020.0002][.0000.0025.0002] -1FCE ; [*046F.0020.0002][.0000.0024.0002] -1FCF ; [*046F.0020.0002][.0000.002A.0002] -1FDD ; [*0470.0020.0002][.0000.0025.0002] -1FDE ; [*0470.0020.0002][.0000.0024.0002] -1FDF ; [*0470.0020.0002][.0000.002A.0002] -1FED ; [*046A.0020.0002][.0000.0025.0002] -1FEE ; [*046A.0020.0002][.0000.0024.0002] -1FEF ; [*0463.0020.0002] -1FFD ; [*0464.0020.0002] -1FFE ; [*0470.0020.0002] -2000 ; [*0209.0020.0004] -2001 ; [*0209.0020.0004] -2002 ; [*0209.0020.0004] -2003 ; [*0209.0020.0004] -2004 ; [*0209.0020.0004] -2005 ; [*0209.0020.0004] -2006 ; [*0209.0020.0004] -2007 ; [*0209.0020.001B] -2008 ; [*0209.0020.0004] -2009 ; [*0209.0020.0004] -200A ; [*0209.0020.0004] -2010 ; [*0213.0020.0002] -2011 ; [*0213.0020.001B] -2012 ; [*0214.0020.0002] -2013 ; [*0215.0020.0002] -2014 ; [*0216.0020.0002] -2015 ; [*0217.0020.0002] -2016 ; [*037C.0020.0002] -2017 ; [*020C.0020.0002] -2018 ; [*02FF.0020.0002] -2019 ; [*0300.0020.0002] -201A ; [*0301.0020.0002] -201B ; [*0302.0020.0002] -201C ; [*0306.0020.0002] -201D ; [*0307.0020.0002] -201E ; [*0308.0020.0002] -201F ; [*0309.0020.0002] -2020 ; [*0398.0020.0002] -2021 ; [*0399.0020.0002] -2022 ; [*039D.0020.0002] -2023 ; [*039E.0020.0002] -2024 ; [*0274.0020.0004] -2025 ; [*0274.0020.0004][*0274.0020.0004] -2026 ; [*0274.0020.0004][*0274.0020.0004][*0274.0020.0004] -2027 ; [*039F.0020.0002] -2028 ; [*0207.0020.0002] -2029 ; [*0208.0020.0002] -202F ; [*0209.0020.001B] -2030 ; [*0394.0020.0002] -2031 ; [*0396.0020.0002] -2032 ; [*03A3.0020.0002] -2033 ; [*03A3.0020.0004][*03A3.0020.0004] -2034 ; [*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004] -2035 ; [*03A4.0020.0002] -2036 ; [*03A4.0020.0004][*03A4.0020.0004] -2037 ; [*03A4.0020.0004][*03A4.0020.0004][*03A4.0020.0004] -2038 ; [*03A7.0020.0002] -2039 ; [*0303.0020.0002] -203A ; [*0304.0020.0002] -203B ; [*03A8.0020.0002] -203C ; [*025F.0020.0004][*025F.0020.0004] -203D ; [*0272.0020.0002] -203E ; [*020A.0020.0002] -203F ; [*03A9.0020.0002] -2040 ; [*03AB.0020.0002] -2041 ; [*03AD.0020.0002] -2042 ; [*03AE.0020.0002] -2043 ; [*03A0.0020.0002] -2044 ; [*0606.0020.0002] -2045 ; [*031C.0020.0002] -2046 ; [*031D.0020.0002] -2047 ; [*0264.0020.0004][*0264.0020.0004] -2048 ; [*0264.0020.0004][*025F.0020.0004] -2049 ; [*025F.0020.0004][*0264.0020.0004] -204A ; [*0390.0020.0002] -204B ; [*0385.0020.0002] -204C ; [*03A1.0020.0002] -204D ; [*03A2.0020.0002] -204E ; [*0389.0020.0002] -204F ; [*0235.0020.0002] -2050 ; [*03AC.0020.0002] -2051 ; [*038A.0020.0002] -2052 ; [*0602.0020.0002] -2053 ; [*021A.0020.0002] -2054 ; [*03AA.0020.0002] -2055 ; [*02E1.0020.0002] -2056 ; [*02E2.0020.0002] -2057 ; [*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004] -2058 ; [*02E3.0020.0002] -2059 ; [*02E4.0020.0002] -205A ; [*02E5.0020.0002] -205B ; [*02E6.0020.0002] -205C ; [*02E7.0020.0002] -205D ; [*02E8.0020.0002] -205E ; [*02E9.0020.0002] -205F ; [*0209.0020.0004] -2061 ; [.0000.0000.0000] -2062 ; [.0000.0000.0000] -2063 ; [.0000.0000.0000] -2064 ; [.0000.0000.0000] -207A ; [*05F6.0020.0014] -207B ; [*0601.0020.0014] -207C ; [*05FB.0020.0014] -207D ; [*0310.0020.0014] -207E ; [*0311.0020.0014] -208A ; [*05F6.0020.0015] -208B ; [*0601.0020.0015] -208C ; [*05FB.0020.0015] -208D ; [*0310.0020.0015] -208E ; [*0311.0020.0015] -2104 ; [*0566.0020.0002] -2108 ; [*0567.0020.0002] -2114 ; [*0568.0020.0002] -2117 ; [*0569.0020.0002] -2118 ; [*056A.0020.0002] -211E ; [*056B.0020.0002] -211F ; [*056C.0020.0002] -2123 ; [*056D.0020.0002] -2125 ; [*056E.0020.0002] -2127 ; [*056F.0020.0002] -2129 ; [*0570.0020.0002] -212E ; [*0571.0020.0002] -213A ; [*0572.0020.0002] -2140 ; [*05F5.0020.0005] -2141 ; [*0573.0020.0002] -2142 ; [*0574.0020.0002] -2143 ; [*0575.0020.0002] -2144 ; [*0576.0020.0002] -214A ; [*0577.0020.0002] -214B ; [*0691.0020.0002] -214C ; [*0578.0020.0002] -214F ; [*0579.0020.0002] -2180 ; [*1A4C.0020.0002] -2181 ; [*1A4D.0020.0002] -2182 ; [*1A4E.0020.0002] -2186 ; [*1A4F.0020.0002] -2187 ; [*1A50.0020.0002] -2188 ; [*1A51.0020.0002] -218A ; [*057A.0020.0002] -218B ; [*057B.0020.0002] -2190 ; [*057C.0020.0002] -2191 ; [*057E.0020.0002] -2192 ; [*057D.0020.0002] -2193 ; [*057F.0020.0002] -2194 ; [*0580.0020.0002] -2195 ; [*0581.0020.0002] -2196 ; [*0582.0020.0002] -2197 ; [*0583.0020.0002] -2198 ; [*0584.0020.0002] -2199 ; [*0585.0020.0002] -219A ; [*057C.0020.0002][.0000.002F.0002] -219B ; [*057D.0020.0002][.0000.002F.0002] -219C ; [*0586.0020.0002] -219D ; [*0587.0020.0002] -219E ; [*0588.0020.0002] -219F ; [*0589.0020.0002] -21A0 ; [*058A.0020.0002] -21A1 ; [*058B.0020.0002] -21A2 ; [*058C.0020.0002] -21A3 ; [*058D.0020.0002] -21A4 ; [*058E.0020.0002] -21A5 ; [*058F.0020.0002] -21A6 ; [*0590.0020.0002] -21A7 ; [*0591.0020.0002] -21A8 ; [*0592.0020.0002] -21A9 ; [*0593.0020.0002] -21AA ; [*0594.0020.0002] -21AB ; [*0595.0020.0002] -21AC ; [*0596.0020.0002] -21AD ; [*0597.0020.0002] -21AE ; [*0580.0020.0002][.0000.002F.0002] -21AF ; [*0598.0020.0002] -21B0 ; [*0599.0020.0002] -21B1 ; [*059A.0020.0002] -21B2 ; [*059B.0020.0002] -21B3 ; [*059C.0020.0002] -21B4 ; [*059D.0020.0002] -21B5 ; [*059E.0020.0002] -21B6 ; [*059F.0020.0002] -21B7 ; [*05A0.0020.0002] -21B8 ; [*05A1.0020.0002] -21B9 ; [*05A2.0020.0002] -21BA ; [*05A3.0020.0002] -21BB ; [*05A4.0020.0002] -21BC ; [*05A5.0020.0002] -21BD ; [*05A6.0020.0002] -21BE ; [*05A7.0020.0002] -21BF ; [*05A8.0020.0002] -21C0 ; [*05A9.0020.0002] -21C1 ; [*05AA.0020.0002] -21C2 ; [*05AB.0020.0002] -21C3 ; [*05AC.0020.0002] -21C4 ; [*05AD.0020.0002] -21C5 ; [*05AE.0020.0002] -21C6 ; [*05AF.0020.0002] -21C7 ; [*05B0.0020.0002] -21C8 ; [*05B1.0020.0002] -21C9 ; [*05B2.0020.0002] -21CA ; [*05B3.0020.0002] -21CB ; [*05B4.0020.0002] -21CC ; [*05B5.0020.0002] -21CD ; [*05B6.0020.0002][.0000.002F.0002] -21CE ; [*05BA.0020.0002][.0000.002F.0002] -21CF ; [*05B8.0020.0002][.0000.002F.0002] -21D0 ; [*05B6.0020.0002] -21D1 ; [*05B7.0020.0002] -21D2 ; [*05B8.0020.0002] -21D3 ; [*05B9.0020.0002] -21D4 ; [*05BA.0020.0002] -21D5 ; [*05BB.0020.0002] -21D6 ; [*05BC.0020.0002] -21D7 ; [*05BD.0020.0002] -21D8 ; [*05BE.0020.0002] -21D9 ; [*05BF.0020.0002] -21DA ; [*05C0.0020.0002] -21DB ; [*05C1.0020.0002] -21DC ; [*05C2.0020.0002] -21DD ; [*05C3.0020.0002] -21DE ; [*05C4.0020.0002] -21DF ; [*05C5.0020.0002] -21E0 ; [*05C6.0020.0002] -21E1 ; [*05C7.0020.0002] -21E2 ; [*05C8.0020.0002] -21E3 ; [*05C9.0020.0002] -21E4 ; [*05CA.0020.0002] -21E5 ; [*05CB.0020.0002] -21E6 ; [*05CC.0020.0002] -21E7 ; [*05CD.0020.0002] -21E8 ; [*05CE.0020.0002] -21E9 ; [*05CF.0020.0002] -21EA ; [*05D0.0020.0002] -21EB ; [*05D1.0020.0002] -21EC ; [*05D2.0020.0002] -21ED ; [*05D3.0020.0002] -21EE ; [*05D4.0020.0002] -21EF ; [*05D5.0020.0002] -21F0 ; [*05D6.0020.0002] -21F1 ; [*05D7.0020.0002] -21F2 ; [*05D8.0020.0002] -21F3 ; [*05D9.0020.0002] -21F4 ; [*05DA.0020.0002] -21F5 ; [*05DB.0020.0002] -21F6 ; [*05DC.0020.0002] -21F7 ; [*05DD.0020.0002] -21F8 ; [*05DE.0020.0002] -21F9 ; [*05DF.0020.0002] -21FA ; [*05E0.0020.0002] -21FB ; [*05E1.0020.0002] -21FC ; [*05E2.0020.0002] -21FD ; [*05E3.0020.0002] -21FE ; [*05E4.0020.0002] -21FF ; [*05E5.0020.0002] -2200 ; [*05E6.0020.0002] -2201 ; [*05E7.0020.0002] -2202 ; [*05E8.0020.0002] -2203 ; [*05E9.0020.0002] -2204 ; [*05E9.0020.0002][.0000.002F.0002] -2205 ; [*05EA.0020.0002] -2206 ; [*05EB.0020.0002] -2207 ; [*05EC.0020.0002] -2208 ; [*05ED.0020.0002] -2209 ; [*05ED.0020.0002][.0000.002F.0002] -220A ; [*05EE.0020.0002] -220B ; [*05EF.0020.0002] -220C ; [*05EF.0020.0002][.0000.002F.0002] -220D ; [*05F0.0020.0002] -220E ; [*05F2.0020.0002] -220F ; [*05F3.0020.0002] -2210 ; [*05F4.0020.0002] -2211 ; [*05F5.0020.0002] -2212 ; [*0601.0020.0002] -2213 ; [*0603.0020.0002] -2214 ; [*0604.0020.0002] -2215 ; [*0605.0020.0002] -2216 ; [*0607.0020.0002] -2217 ; [*0608.0020.0002] -2218 ; [*0609.0020.0002] -2219 ; [*060A.0020.0002] -221A ; [*060B.0020.0002] -221B ; [*060C.0020.0002] -221C ; [*060E.0020.0002] -221D ; [*0610.0020.0002] -221E ; [*0611.0020.0002] -221F ; [*0612.0020.0002] -2220 ; [*0613.0020.0002] -2221 ; [*0614.0020.0002] -2222 ; [*0615.0020.0002] -2223 ; [*0616.0020.0002] -2224 ; [*0616.0020.0002][.0000.002F.0002] -2225 ; [*0617.0020.0002] -2226 ; [*0617.0020.0002][.0000.002F.0002] -2227 ; [*0618.0020.0002] -2228 ; [*0619.0020.0002] -2229 ; [*061A.0020.0002] -222A ; [*061B.0020.0002] -222B ; [*061C.0020.0002] -222C ; [*061C.0020.0004][*061C.0020.0004] -222D ; [*061C.0020.0004][*061C.0020.0004][*061C.0020.0004] -222E ; [*061D.0020.0002] -222F ; [*061D.0020.0004][*061D.0020.0004] -2230 ; [*061D.0020.0004][*061D.0020.0004][*061D.0020.0004] -2231 ; [*061E.0020.0002] -2232 ; [*061F.0020.0002] -2233 ; [*0620.0020.0002] -2234 ; [*0621.0020.0002] -2235 ; [*0622.0020.0002] -2236 ; [*0623.0020.0002] -2237 ; [*0624.0020.0002] -2238 ; [*0625.0020.0002] -2239 ; [*0626.0020.0002] -223A ; [*0627.0020.0002] -223B ; [*0628.0020.0002] -223C ; [*0629.0020.0002] -223D ; [*062A.0020.0002] -223E ; [*062B.0020.0002] -223F ; [*062C.0020.0002] -2240 ; [*062D.0020.0002] -2241 ; [*0629.0020.0002][.0000.002F.0002] -2242 ; [*062E.0020.0002] -2243 ; [*062F.0020.0002] -2244 ; [*062F.0020.0002][.0000.002F.0002] -2245 ; [*0630.0020.0002] -2246 ; [*0631.0020.0002] -2247 ; [*0630.0020.0002][.0000.002F.0002] -2248 ; [*0632.0020.0002] -2249 ; [*0632.0020.0002][.0000.002F.0002] -224A ; [*0633.0020.0002] -224B ; [*0634.0020.0002] -224C ; [*0635.0020.0002] -224D ; [*0636.0020.0002] -224E ; [*0637.0020.0002] -224F ; [*0638.0020.0002] -2250 ; [*0639.0020.0002] -2251 ; [*063A.0020.0002] -2252 ; [*063B.0020.0002] -2253 ; [*063C.0020.0002] -2254 ; [*063D.0020.0002] -2255 ; [*063E.0020.0002] -2256 ; [*063F.0020.0002] -2257 ; [*0640.0020.0002] -2258 ; [*0641.0020.0002] -2259 ; [*0642.0020.0002] -225A ; [*0643.0020.0002] -225B ; [*0644.0020.0002] -225C ; [*0645.0020.0002] -225D ; [*0646.0020.0002] -225E ; [*0647.0020.0002] -225F ; [*0648.0020.0002] -2260 ; [*05FB.0020.0002][.0000.002F.0002] -2261 ; [*0649.0020.0002] -2262 ; [*0649.0020.0002][.0000.002F.0002] -2263 ; [*064A.0020.0002] -2264 ; [*064B.0020.0002] -2265 ; [*064C.0020.0002] -2266 ; [*064D.0020.0002] -2267 ; [*064E.0020.0002] -2268 ; [*064F.0020.0002] -2269 ; [*0650.0020.0002] -226A ; [*0651.0020.0002] -226B ; [*0652.0020.0002] -226C ; [*0653.0020.0002] -226D ; [*0636.0020.0002][.0000.002F.0002] -226E ; [*05FA.0020.0002][.0000.002F.0002] -226F ; [*05FC.0020.0002][.0000.002F.0002] -2270 ; [*064B.0020.0002][.0000.002F.0002] -2271 ; [*064C.0020.0002][.0000.002F.0002] -2272 ; [*0654.0020.0002] -2273 ; [*0655.0020.0002] -2274 ; [*0654.0020.0002][.0000.002F.0002] -2275 ; [*0655.0020.0002][.0000.002F.0002] -2276 ; [*0656.0020.0002] -2277 ; [*0657.0020.0002] -2278 ; [*0656.0020.0002][.0000.002F.0002] -2279 ; [*0657.0020.0002][.0000.002F.0002] -227A ; [*0658.0020.0002] -227B ; [*0659.0020.0002] -227C ; [*065A.0020.0002] -227D ; [*065B.0020.0002] -227E ; [*065C.0020.0002] -227F ; [*065D.0020.0002] -2280 ; [*0658.0020.0002][.0000.002F.0002] -2281 ; [*0659.0020.0002][.0000.002F.0002] -2282 ; [*065E.0020.0002] -2283 ; [*065F.0020.0002] -2284 ; [*065E.0020.0002][.0000.002F.0002] -2285 ; [*065F.0020.0002][.0000.002F.0002] -2286 ; [*0660.0020.0002] -2287 ; [*0661.0020.0002] -2288 ; [*0660.0020.0002][.0000.002F.0002] -2289 ; [*0661.0020.0002][.0000.002F.0002] -228A ; [*0662.0020.0002] -228B ; [*0663.0020.0002] -228C ; [*0664.0020.0002] -228D ; [*0665.0020.0002] -228E ; [*0666.0020.0002] -228F ; [*0667.0020.0002] -2290 ; [*0668.0020.0002] -2291 ; [*0669.0020.0002] -2292 ; [*066A.0020.0002] -2293 ; [*066B.0020.0002] -2294 ; [*066C.0020.0002] -2295 ; [*066D.0020.0002] -2296 ; [*066E.0020.0002] -2297 ; [*066F.0020.0002] -2298 ; [*0670.0020.0002] -2299 ; [*0671.0020.0002] -229A ; [*0672.0020.0002] -229B ; [*0673.0020.0002] -229C ; [*0674.0020.0002] -229D ; [*0675.0020.0002] -229E ; [*0676.0020.0002] -229F ; [*0677.0020.0002] -22A0 ; [*0678.0020.0002] -22A1 ; [*0679.0020.0002] -22A2 ; [*067A.0020.0002] -22A3 ; [*067B.0020.0002] -22A4 ; [*067C.0020.0002] -22A5 ; [*067D.0020.0002] -22A6 ; [*067E.0020.0002] -22A7 ; [*067F.0020.0002] -22A8 ; [*0680.0020.0002] -22A9 ; [*0681.0020.0002] -22AA ; [*0682.0020.0002] -22AB ; [*0683.0020.0002] -22AC ; [*067A.0020.0002][.0000.002F.0002] -22AD ; [*0680.0020.0002][.0000.002F.0002] -22AE ; [*0681.0020.0002][.0000.002F.0002] -22AF ; [*0683.0020.0002][.0000.002F.0002] -22B0 ; [*0684.0020.0002] -22B1 ; [*0685.0020.0002] -22B2 ; [*0686.0020.0002] -22B3 ; [*0687.0020.0002] -22B4 ; [*0688.0020.0002] -22B5 ; [*0689.0020.0002] -22B6 ; [*068A.0020.0002] -22B7 ; [*068B.0020.0002] -22B8 ; [*068C.0020.0002] -22B9 ; [*068D.0020.0002] -22BA ; [*068E.0020.0002] -22BB ; [*068F.0020.0002] -22BC ; [*0690.0020.0002] -22BD ; [*0692.0020.0002] -22BE ; [*0693.0020.0002] -22BF ; [*0694.0020.0002] -22C0 ; [*0695.0020.0002] -22C1 ; [*0696.0020.0002] -22C2 ; [*0697.0020.0002] -22C3 ; [*0698.0020.0002] -22C4 ; [*0699.0020.0002] -22C5 ; [*069A.0020.0002] -22C6 ; [*069B.0020.0002] -22C7 ; [*069C.0020.0002] -22C8 ; [*069D.0020.0002] -22C9 ; [*069E.0020.0002] -22CA ; [*069F.0020.0002] -22CB ; [*06A0.0020.0002] -22CC ; [*06A1.0020.0002] -22CD ; [*06A2.0020.0002] -22CE ; [*06A3.0020.0002] -22CF ; [*06A4.0020.0002] -22D0 ; [*06A5.0020.0002] -22D1 ; [*06A6.0020.0002] -22D2 ; [*06A7.0020.0002] -22D3 ; [*06A8.0020.0002] -22D4 ; [*06A9.0020.0002] -22D5 ; [*06AA.0020.0002] -22D6 ; [*06AB.0020.0002] -22D7 ; [*06AC.0020.0002] -22D8 ; [*06AD.0020.0002] -22D9 ; [*06AE.0020.0002] -22DA ; [*06AF.0020.0002] -22DB ; [*06B0.0020.0002] -22DC ; [*06B1.0020.0002] -22DD ; [*06B2.0020.0002] -22DE ; [*06B3.0020.0002] -22DF ; [*06B4.0020.0002] -22E0 ; [*065A.0020.0002][.0000.002F.0002] -22E1 ; [*065B.0020.0002][.0000.002F.0002] -22E2 ; [*0669.0020.0002][.0000.002F.0002] -22E3 ; [*066A.0020.0002][.0000.002F.0002] -22E4 ; [*06B5.0020.0002] -22E5 ; [*06B6.0020.0002] -22E6 ; [*06B7.0020.0002] -22E7 ; [*06B8.0020.0002] -22E8 ; [*06B9.0020.0002] -22E9 ; [*06BA.0020.0002] -22EA ; [*0686.0020.0002][.0000.002F.0002] -22EB ; [*0687.0020.0002][.0000.002F.0002] -22EC ; [*0688.0020.0002][.0000.002F.0002] -22ED ; [*0689.0020.0002][.0000.002F.0002] -22EE ; [*06BB.0020.0002] -22EF ; [*06BC.0020.0002] -22F0 ; [*06BD.0020.0002] -22F1 ; [*06BE.0020.0002] -22F2 ; [*06BF.0020.0002] -22F3 ; [*06C0.0020.0002] -22F4 ; [*06C1.0020.0002] -22F5 ; [*06C2.0020.0002] -22F6 ; [*06C3.0020.0002] -22F7 ; [*06C4.0020.0002] -22F8 ; [*06C5.0020.0002] -22F9 ; [*06C6.0020.0002] -22FA ; [*06C7.0020.0002] -22FB ; [*06C8.0020.0002] -22FC ; [*06C9.0020.0002] -22FD ; [*06CA.0020.0002] -22FE ; [*06CB.0020.0002] -22FF ; [*06CC.0020.0002] -2300 ; [*06CD.0020.0002] -2301 ; [*06CE.0020.0002] -2302 ; [*06CF.0020.0002] -2303 ; [*06D0.0020.0002] -2304 ; [*06D1.0020.0002] -2305 ; [*06D2.0020.0002] -2306 ; [*06D3.0020.0002] -2307 ; [*06D4.0020.0002] -2308 ; [*031E.0020.0002] -2309 ; [*031F.0020.0002] -230A ; [*0320.0020.0002] -230B ; [*0321.0020.0002] -230C ; [*06D5.0020.0002] -230D ; [*06D6.0020.0002] -230E ; [*06D7.0020.0002] -230F ; [*06D8.0020.0002] -2310 ; [*06D9.0020.0002] -2311 ; [*06DA.0020.0002] -2312 ; [*06DB.0020.0002] -2313 ; [*06DC.0020.0002] -2314 ; [*06DD.0020.0002] -2315 ; [*06DE.0020.0002] -2316 ; [*06DF.0020.0002] -2317 ; [*06E0.0020.0002] -2318 ; [*06E1.0020.0002] -2319 ; [*06E2.0020.0002] -231A ; [*06E3.0020.0002] -231B ; [*06E4.0020.0002] -231C ; [*06E5.0020.0002] -231D ; [*06E6.0020.0002] -231E ; [*06E7.0020.0002] -231F ; [*06E8.0020.0002] -2320 ; [*06E9.0020.0002] -2321 ; [*06EA.0020.0002] -2322 ; [*06EB.0020.0002] -2323 ; [*06EC.0020.0002] -2324 ; [*06ED.0020.0002] -2325 ; [*06EE.0020.0002] -2326 ; [*06EF.0020.0002] -2327 ; [*06F0.0020.0002] -2328 ; [*06F1.0020.0002] -2329 ; [*0368.0020.0002] -232A ; [*0369.0020.0002] -232B ; [*06F2.0020.0002] -232C ; [*06F3.0020.0002] -232D ; [*06F4.0020.0002] -232E ; [*06F5.0020.0002] -232F ; [*06F6.0020.0002] -2330 ; [*06F7.0020.0002] -2331 ; [*06F8.0020.0002] -2332 ; [*06F9.0020.0002] -2333 ; [*06FA.0020.0002] -2334 ; [*06FB.0020.0002] -2335 ; [*06FC.0020.0002] -2336 ; [*06FD.0020.0002] -2337 ; [*06FE.0020.0002] -2338 ; [*06FF.0020.0002] -2339 ; [*0700.0020.0002] -233A ; [*0701.0020.0002] -233B ; [*0702.0020.0002] -233C ; [*0703.0020.0002] -233D ; [*0704.0020.0002] -233E ; [*0705.0020.0002] -233F ; [*0706.0020.0002] -2340 ; [*0707.0020.0002] -2341 ; [*0708.0020.0002] -2342 ; [*0709.0020.0002] -2343 ; [*070A.0020.0002] -2344 ; [*070B.0020.0002] -2345 ; [*070C.0020.0002] -2346 ; [*070D.0020.0002] -2347 ; [*070E.0020.0002] -2348 ; [*070F.0020.0002] -2349 ; [*0710.0020.0002] -234A ; [*0711.0020.0002] -234B ; [*0712.0020.0002] -234C ; [*0713.0020.0002] -234D ; [*0714.0020.0002] -234E ; [*0715.0020.0002] -234F ; [*0716.0020.0002] -2350 ; [*0717.0020.0002] -2351 ; [*0718.0020.0002] -2352 ; [*0719.0020.0002] -2353 ; [*071A.0020.0002] -2354 ; [*071B.0020.0002] -2355 ; [*071C.0020.0002] -2356 ; [*071D.0020.0002] -2357 ; [*071E.0020.0002] -2358 ; [*071F.0020.0002] -2359 ; [*0720.0020.0002] -235A ; [*0721.0020.0002] -235B ; [*0722.0020.0002] -235C ; [*0723.0020.0002] -235D ; [*0724.0020.0002] -235E ; [*0725.0020.0002] -235F ; [*0726.0020.0002] -2360 ; [*0727.0020.0002] -2361 ; [*0728.0020.0002] -2362 ; [*0729.0020.0002] -2363 ; [*072A.0020.0002] -2364 ; [*072B.0020.0002] -2365 ; [*072C.0020.0002] -2366 ; [*072D.0020.0002] -2367 ; [*072E.0020.0002] -2368 ; [*072F.0020.0002] -2369 ; [*0730.0020.0002] -236A ; [*0731.0020.0002] -236B ; [*0732.0020.0002] -236C ; [*0733.0020.0002] -236D ; [*0734.0020.0002] -236E ; [*0735.0020.0002] -236F ; [*0736.0020.0002] -2370 ; [*0737.0020.0002] -2371 ; [*0738.0020.0002] -2372 ; [*0739.0020.0002] -2373 ; [*073A.0020.0002] -2374 ; [*073B.0020.0002] -2375 ; [*073C.0020.0002] -2376 ; [*073D.0020.0002] -2377 ; [*073E.0020.0002] -2378 ; [*073F.0020.0002] -2379 ; [*0740.0020.0002] -237A ; [*0741.0020.0002] -237B ; [*0742.0020.0002] -237C ; [*0743.0020.0002] -237D ; [*0744.0020.0002] -237E ; [*0745.0020.0002] -237F ; [*0746.0020.0002] -2380 ; [*0747.0020.0002] -2381 ; [*0748.0020.0002] -2382 ; [*0749.0020.0002] -2383 ; [*074A.0020.0002] -2384 ; [*074B.0020.0002] -2385 ; [*074C.0020.0002] -2386 ; [*074D.0020.0002] -2387 ; [*074E.0020.0002] -2388 ; [*074F.0020.0002] -2389 ; [*0750.0020.0002] -238A ; [*0751.0020.0002] -238B ; [*0752.0020.0002] -238C ; [*0753.0020.0002] -238D ; [*0754.0020.0002] -238E ; [*0755.0020.0002] -238F ; [*0756.0020.0002] -2390 ; [*0757.0020.0002] -2391 ; [*0758.0020.0002] -2392 ; [*0759.0020.0002] -2393 ; [*075A.0020.0002] -2394 ; [*075B.0020.0002] -2395 ; [*075C.0020.0002] -2396 ; [*075D.0020.0002] -2397 ; [*075E.0020.0002] -2398 ; [*075F.0020.0002] -2399 ; [*0760.0020.0002] -239A ; [*0761.0020.0002] -239B ; [*0762.0020.0002] -239C ; [*0763.0020.0002] -239D ; [*0764.0020.0002] -239E ; [*0765.0020.0002] -239F ; [*0766.0020.0002] -23A0 ; [*0767.0020.0002] -23A1 ; [*0768.0020.0002] -23A2 ; [*0769.0020.0002] -23A3 ; [*076A.0020.0002] -23A4 ; [*076B.0020.0002] -23A5 ; [*076C.0020.0002] -23A6 ; [*076D.0020.0002] -23A7 ; [*076E.0020.0002] -23A8 ; [*076F.0020.0002] -23A9 ; [*0770.0020.0002] -23AA ; [*0771.0020.0002] -23AB ; [*0772.0020.0002] -23AC ; [*0773.0020.0002] -23AD ; [*0774.0020.0002] -23AE ; [*0775.0020.0002] -23AF ; [*0776.0020.0002] -23B0 ; [*0777.0020.0002] -23B1 ; [*0778.0020.0002] -23B2 ; [*0779.0020.0002] -23B3 ; [*077A.0020.0002] -23B4 ; [*077B.0020.0002] -23B5 ; [*077C.0020.0002] -23B6 ; [*077D.0020.0002] -23B7 ; [*077E.0020.0002] -23B8 ; [*077F.0020.0002] -23B9 ; [*0780.0020.0002] -23BA ; [*0781.0020.0002] -23BB ; [*0782.0020.0002] -23BC ; [*0783.0020.0002] -23BD ; [*0784.0020.0002] -23BE ; [*0785.0020.0002] -23BF ; [*0786.0020.0002] -23C0 ; [*0787.0020.0002] -23C1 ; [*0788.0020.0002] -23C2 ; [*0789.0020.0002] -23C3 ; [*078A.0020.0002] -23C4 ; [*078B.0020.0002] -23C5 ; [*078C.0020.0002] -23C6 ; [*078D.0020.0002] -23C7 ; [*078E.0020.0002] -23C8 ; [*078F.0020.0002] -23C9 ; [*0790.0020.0002] -23CA ; [*0791.0020.0002] -23CB ; [*0792.0020.0002] -23CC ; [*0793.0020.0002] -23CD ; [*0794.0020.0002] -23CE ; [*0795.0020.0002] -23CF ; [*0796.0020.0002] -23D0 ; [*0797.0020.0002] -23D1 ; [*0798.0020.0002] -23D2 ; [*0799.0020.0002] -23D3 ; [*079A.0020.0002] -23D4 ; [*079B.0020.0002] -23D5 ; [*079C.0020.0002] -23D6 ; [*079D.0020.0002] -23D7 ; [*079E.0020.0002] -23D8 ; [*079F.0020.0002] -23D9 ; [*07A0.0020.0002] -23DA ; [*07A1.0020.0002] -23DB ; [*07A2.0020.0002] -23DC ; [*07A3.0020.0002] -23DD ; [*07A4.0020.0002] -23DE ; [*07A5.0020.0002] -23DF ; [*07A6.0020.0002] -23E0 ; [*07A7.0020.0002] -23E1 ; [*07A8.0020.0002] -23E2 ; [*07A9.0020.0002] -23E3 ; [*07AA.0020.0002] -23E4 ; [*07AB.0020.0002] -23E5 ; [*07AC.0020.0002] -23E6 ; [*07AD.0020.0002] -23E7 ; [*07AE.0020.0002] -23E8 ; [*07AF.0020.0002] -23E9 ; [*07B0.0020.0002] -23EA ; [*07B1.0020.0002] -23EB ; [*07B2.0020.0002] -23EC ; [*07B3.0020.0002] -23ED ; [*07B4.0020.0002] -23EE ; [*07B5.0020.0002] -23EF ; [*07B6.0020.0002] -23F0 ; [*07B7.0020.0002] -23F1 ; [*07B8.0020.0002] -23F2 ; [*07B9.0020.0002] -23F3 ; [*07BA.0020.0002] -23F4 ; [*07BB.0020.0002] -23F5 ; [*07BC.0020.0002] -23F6 ; [*07BD.0020.0002] -23F7 ; [*07BE.0020.0002] -23F8 ; [*07BF.0020.0002] -23F9 ; [*07C0.0020.0002] -23FA ; [*07C1.0020.0002] -2400 ; [*07C2.0020.0002] -2401 ; [*07C3.0020.0002] -2402 ; [*07C4.0020.0002] -2403 ; [*07C5.0020.0002] -2404 ; [*07C6.0020.0002] -2405 ; [*07C7.0020.0002] -2406 ; [*07C8.0020.0002] -2407 ; [*07C9.0020.0002] -2408 ; [*07CA.0020.0002] -2409 ; [*07CB.0020.0002] -240A ; [*07CC.0020.0002] -240B ; [*07CD.0020.0002] -240C ; [*07CE.0020.0002] -240D ; [*07CF.0020.0002] -240E ; [*07D0.0020.0002] -240F ; [*07D1.0020.0002] -2410 ; [*07D2.0020.0002] -2411 ; [*07D3.0020.0002] -2412 ; [*07D4.0020.0002] -2413 ; [*07D5.0020.0002] -2414 ; [*07D6.0020.0002] -2415 ; [*07D7.0020.0002] -2416 ; [*07D8.0020.0002] -2417 ; [*07D9.0020.0002] -2418 ; [*07DA.0020.0002] -2419 ; [*07DB.0020.0002] -241A ; [*07DC.0020.0002] -241B ; [*07DD.0020.0002] -241C ; [*07DE.0020.0002] -241D ; [*07DF.0020.0002] -241E ; [*07E0.0020.0002] -241F ; [*07E1.0020.0002] -2420 ; [*07E2.0020.0002] -2421 ; [*07E3.0020.0002] -2422 ; [*07E4.0020.0002] -2423 ; [*07E5.0020.0002] -2424 ; [*07E6.0020.0002] -2425 ; [*07E7.0020.0002] -2426 ; [*07E8.0020.0002] -2440 ; [*07E9.0020.0002] -2441 ; [*07EA.0020.0002] -2442 ; [*07EB.0020.0002] -2443 ; [*07EC.0020.0002] -2444 ; [*07ED.0020.0002] -2445 ; [*07EE.0020.0002] -2446 ; [*07EF.0020.0002] -2447 ; [*07F0.0020.0002] -2448 ; [*07F1.0020.0002] -2449 ; [*07F2.0020.0002] -244A ; [*07F3.0020.0002] -2500 ; [*07F4.0020.0002] -2501 ; [*07F5.0020.0002] -2502 ; [*07F6.0020.0002] -2503 ; [*07F7.0020.0002] -2504 ; [*07F8.0020.0002] -2505 ; [*07F9.0020.0002] -2506 ; [*07FA.0020.0002] -2507 ; [*07FB.0020.0002] -2508 ; [*07FC.0020.0002] -2509 ; [*07FD.0020.0002] -250A ; [*07FE.0020.0002] -250B ; [*07FF.0020.0002] -250C ; [*0800.0020.0002] -250D ; [*0801.0020.0002] -250E ; [*0802.0020.0002] -250F ; [*0803.0020.0002] -2510 ; [*0804.0020.0002] -2511 ; [*0805.0020.0002] -2512 ; [*0806.0020.0002] -2513 ; [*0807.0020.0002] -2514 ; [*0808.0020.0002] -2515 ; [*0809.0020.0002] -2516 ; [*080A.0020.0002] -2517 ; [*080B.0020.0002] -2518 ; [*080C.0020.0002] -2519 ; [*080D.0020.0002] -251A ; [*080E.0020.0002] -251B ; [*080F.0020.0002] -251C ; [*0810.0020.0002] -251D ; [*0811.0020.0002] -251E ; [*0812.0020.0002] -251F ; [*0813.0020.0002] -2520 ; [*0814.0020.0002] -2521 ; [*0815.0020.0002] -2522 ; [*0816.0020.0002] -2523 ; [*0817.0020.0002] -2524 ; [*0818.0020.0002] -2525 ; [*0819.0020.0002] -2526 ; [*081A.0020.0002] -2527 ; [*081B.0020.0002] -2528 ; [*081C.0020.0002] -2529 ; [*081D.0020.0002] -252A ; [*081E.0020.0002] -252B ; [*081F.0020.0002] -252C ; [*0820.0020.0002] -252D ; [*0821.0020.0002] -252E ; [*0822.0020.0002] -252F ; [*0823.0020.0002] -2530 ; [*0824.0020.0002] -2531 ; [*0825.0020.0002] -2532 ; [*0826.0020.0002] -2533 ; [*0827.0020.0002] -2534 ; [*0828.0020.0002] -2535 ; [*0829.0020.0002] -2536 ; [*082A.0020.0002] -2537 ; [*082B.0020.0002] -2538 ; [*082C.0020.0002] -2539 ; [*082D.0020.0002] -253A ; [*082E.0020.0002] -253B ; [*082F.0020.0002] -253C ; [*0830.0020.0002] -253D ; [*0831.0020.0002] -253E ; [*0832.0020.0002] -253F ; [*0833.0020.0002] -2540 ; [*0834.0020.0002] -2541 ; [*0835.0020.0002] -2542 ; [*0836.0020.0002] -2543 ; [*0837.0020.0002] -2544 ; [*0838.0020.0002] -2545 ; [*0839.0020.0002] -2546 ; [*083A.0020.0002] -2547 ; [*083B.0020.0002] -2548 ; [*083C.0020.0002] -2549 ; [*083D.0020.0002] -254A ; [*083E.0020.0002] -254B ; [*083F.0020.0002] -254C ; [*0840.0020.0002] -254D ; [*0841.0020.0002] -254E ; [*0842.0020.0002] -254F ; [*0843.0020.0002] -2550 ; [*0844.0020.0002] -2551 ; [*0845.0020.0002] -2552 ; [*0846.0020.0002] -2553 ; [*0847.0020.0002] -2554 ; [*0848.0020.0002] -2555 ; [*0849.0020.0002] -2556 ; [*084A.0020.0002] -2557 ; [*084B.0020.0002] -2558 ; [*084C.0020.0002] -2559 ; [*084D.0020.0002] -255A ; [*084E.0020.0002] -255B ; [*084F.0020.0002] -255C ; [*0850.0020.0002] -255D ; [*0851.0020.0002] -255E ; [*0852.0020.0002] -255F ; [*0853.0020.0002] -2560 ; [*0854.0020.0002] -2561 ; [*0855.0020.0002] -2562 ; [*0856.0020.0002] -2563 ; [*0857.0020.0002] -2564 ; [*0858.0020.0002] -2565 ; [*0859.0020.0002] -2566 ; [*085A.0020.0002] -2567 ; [*085B.0020.0002] -2568 ; [*085C.0020.0002] -2569 ; [*085D.0020.0002] -256A ; [*085E.0020.0002] -256B ; [*085F.0020.0002] -256C ; [*0860.0020.0002] -256D ; [*0861.0020.0002] -256E ; [*0862.0020.0002] -256F ; [*0863.0020.0002] -2570 ; [*0864.0020.0002] -2571 ; [*0865.0020.0002] -2572 ; [*0866.0020.0002] -2573 ; [*0867.0020.0002] -2574 ; [*0868.0020.0002] -2575 ; [*0869.0020.0002] -2576 ; [*086A.0020.0002] -2577 ; [*086B.0020.0002] -2578 ; [*086C.0020.0002] -2579 ; [*086D.0020.0002] -257A ; [*086E.0020.0002] -257B ; [*086F.0020.0002] -257C ; [*0870.0020.0002] -257D ; [*0871.0020.0002] -257E ; [*0872.0020.0002] -257F ; [*0873.0020.0002] -2580 ; [*0874.0020.0002] -2581 ; [*0875.0020.0002] -2582 ; [*0876.0020.0002] -2583 ; [*0877.0020.0002] -2584 ; [*0878.0020.0002] -2585 ; [*0879.0020.0002] -2586 ; [*087A.0020.0002] -2587 ; [*087B.0020.0002] -2588 ; [*087C.0020.0002] -2589 ; [*087D.0020.0002] -258A ; [*087E.0020.0002] -258B ; [*087F.0020.0002] -258C ; [*0880.0020.0002] -258D ; [*0881.0020.0002] -258E ; [*0882.0020.0002] -258F ; [*0883.0020.0002] -2590 ; [*0884.0020.0002] -2591 ; [*0885.0020.0002] -2592 ; [*0886.0020.0002] -2593 ; [*0887.0020.0002] -2594 ; [*0888.0020.0002] -2595 ; [*0889.0020.0002] -2596 ; [*088A.0020.0002] -2597 ; [*088B.0020.0002] -2598 ; [*088C.0020.0002] -2599 ; [*088D.0020.0002] -259A ; [*088E.0020.0002] -259B ; [*088F.0020.0002] -259C ; [*0890.0020.0002] -259D ; [*0891.0020.0002] -259E ; [*0892.0020.0002] -259F ; [*0893.0020.0002] -25A0 ; [*0894.0020.0002] -25A1 ; [*0895.0020.0002] -25A2 ; [*0896.0020.0002] -25A3 ; [*0897.0020.0002] -25A4 ; [*0898.0020.0002] -25A5 ; [*0899.0020.0002] -25A6 ; [*089A.0020.0002] -25A7 ; [*089B.0020.0002] -25A8 ; [*089C.0020.0002] -25A9 ; [*089D.0020.0002] -25AA ; [*089E.0020.0002] -25AB ; [*089F.0020.0002] -25AC ; [*08A0.0020.0002] -25AD ; [*08A1.0020.0002] -25AE ; [*08A2.0020.0002] -25AF ; [*08A3.0020.0002] -25B0 ; [*08A4.0020.0002] -25B1 ; [*08A5.0020.0002] -25B2 ; [*08A6.0020.0002] -25B3 ; [*08A7.0020.0002] -25B4 ; [*08A8.0020.0002] -25B5 ; [*08A9.0020.0002] -25B6 ; [*08AA.0020.0002] -25B7 ; [*08AB.0020.0002] -25B8 ; [*08AC.0020.0002] -25B9 ; [*08AD.0020.0002] -25BA ; [*08AE.0020.0002] -25BB ; [*08AF.0020.0002] -25BC ; [*08B0.0020.0002] -25BD ; [*08B1.0020.0002] -25BE ; [*08B2.0020.0002] -25BF ; [*08B3.0020.0002] -25C0 ; [*08B4.0020.0002] -25C1 ; [*08B5.0020.0002] -25C2 ; [*08B6.0020.0002] -25C3 ; [*08B7.0020.0002] -25C4 ; [*08B8.0020.0002] -25C5 ; [*08B9.0020.0002] -25C6 ; [*08BA.0020.0002] -25C7 ; [*08BB.0020.0002] -25C8 ; [*08BC.0020.0002] -25C9 ; [*08BD.0020.0002] -25CA ; [*08BE.0020.0002] -25CB ; [*08BF.0020.0002] -25CC ; [*08C0.0020.0002] -25CD ; [*08C1.0020.0002] -25CE ; [*08C2.0020.0002] -25CF ; [*08C3.0020.0002] -25D0 ; [*08C4.0020.0002] -25D1 ; [*08C5.0020.0002] -25D2 ; [*08C6.0020.0002] -25D3 ; [*08C7.0020.0002] -25D4 ; [*08C8.0020.0002] -25D5 ; [*08C9.0020.0002] -25D6 ; [*08CA.0020.0002] -25D7 ; [*08CB.0020.0002] -25D8 ; [*08CC.0020.0002] -25D9 ; [*08CD.0020.0002] -25DA ; [*08CE.0020.0002] -25DB ; [*08CF.0020.0002] -25DC ; [*08D0.0020.0002] -25DD ; [*08D1.0020.0002] -25DE ; [*08D2.0020.0002] -25DF ; [*08D3.0020.0002] -25E0 ; [*08D4.0020.0002] -25E1 ; [*08D5.0020.0002] -25E2 ; [*08D6.0020.0002] -25E3 ; [*08D7.0020.0002] -25E4 ; [*08D8.0020.0002] -25E5 ; [*08D9.0020.0002] -25E6 ; [*08DA.0020.0002] -25E7 ; [*08DB.0020.0002] -25E8 ; [*08DC.0020.0002] -25E9 ; [*08DD.0020.0002] -25EA ; [*08DE.0020.0002] -25EB ; [*08DF.0020.0002] -25EC ; [*08E0.0020.0002] -25ED ; [*08E1.0020.0002] -25EE ; [*08E2.0020.0002] -25EF ; [*08E3.0020.0002] -25F0 ; [*08E4.0020.0002] -25F1 ; [*08E5.0020.0002] -25F2 ; [*08E6.0020.0002] -25F3 ; [*08E7.0020.0002] -25F4 ; [*08E8.0020.0002] -25F5 ; [*08E9.0020.0002] -25F6 ; [*08EA.0020.0002] -25F7 ; [*08EB.0020.0002] -25F8 ; [*08EC.0020.0002] -25F9 ; [*08ED.0020.0002] -25FA ; [*08EE.0020.0002] -25FB ; [*08EF.0020.0002] -25FC ; [*08F0.0020.0002] -25FD ; [*08F1.0020.0002] -25FE ; [*08F2.0020.0002] -25FF ; [*08F3.0020.0002] -2600 ; [*08F4.0020.0002] -2601 ; [*08F5.0020.0002] -2602 ; [*08F6.0020.0002] -2603 ; [*08F7.0020.0002] -2604 ; [*08F8.0020.0002] -2605 ; [*08F9.0020.0002] -2606 ; [*08FA.0020.0002] -2607 ; [*08FB.0020.0002] -2608 ; [*08FC.0020.0002] -2609 ; [*08FD.0020.0002] -260A ; [*08FE.0020.0002] -260B ; [*08FF.0020.0002] -260C ; [*0900.0020.0002] -260D ; [*0901.0020.0002] -260E ; [*0902.0020.0002] -260F ; [*0903.0020.0002] -2610 ; [*0904.0020.0002] -2611 ; [*0905.0020.0002] -2612 ; [*0906.0020.0002] -2613 ; [*0907.0020.0002] -2614 ; [*0908.0020.0002] -2615 ; [*0909.0020.0002] -2616 ; [*090A.0020.0002] -2617 ; [*090B.0020.0002] -2618 ; [*090C.0020.0002] -2619 ; [*090D.0020.0002] -261A ; [*090E.0020.0002] -261B ; [*090F.0020.0002] -261C ; [*0910.0020.0002] -261D ; [*0911.0020.0002] -261E ; [*0912.0020.0002] -261F ; [*0913.0020.0002] -2620 ; [*0914.0020.0002] -2621 ; [*0915.0020.0002] -2622 ; [*0916.0020.0002] -2623 ; [*0917.0020.0002] -2624 ; [*0918.0020.0002] -2625 ; [*0919.0020.0002] -2626 ; [*091A.0020.0002] -2627 ; [*091B.0020.0002] -2628 ; [*091C.0020.0002] -2629 ; [*091D.0020.0002] -262A ; [*091E.0020.0002] -262B ; [*091F.0020.0002] -262C ; [*0920.0020.0002] -262D ; [*0921.0020.0002] -262E ; [*0922.0020.0002] -262F ; [*0923.0020.0002] -2630 ; [*0E7E.0020.0002] -2631 ; [*0E7F.0020.0002] -2632 ; [*0E80.0020.0002] -2633 ; [*0E81.0020.0002] -2634 ; [*0E82.0020.0002] -2635 ; [*0E83.0020.0002] -2636 ; [*0E84.0020.0002] -2637 ; [*0E85.0020.0002] -2638 ; [*0924.0020.0002] -2639 ; [*0925.0020.0002] -263A ; [*0926.0020.0002] -263B ; [*0927.0020.0002] -263C ; [*0928.0020.0002] -263D ; [*0929.0020.0002] -263E ; [*092A.0020.0002] -263F ; [*092B.0020.0002] -2640 ; [*092C.0020.0002] -2641 ; [*092D.0020.0002] -2642 ; [*092E.0020.0002] -2643 ; [*092F.0020.0002] -2644 ; [*0930.0020.0002] -2645 ; [*0931.0020.0002] -2646 ; [*0932.0020.0002] -2647 ; [*0933.0020.0002] -2648 ; [*0934.0020.0002] -2649 ; [*0935.0020.0002] -264A ; [*0936.0020.0002] -264B ; [*0937.0020.0002] -264C ; [*0938.0020.0002] -264D ; [*0939.0020.0002] -264E ; [*093A.0020.0002] -264F ; [*093B.0020.0002] -2650 ; [*093C.0020.0002] -2651 ; [*093D.0020.0002] -2652 ; [*093E.0020.0002] -2653 ; [*093F.0020.0002] -2654 ; [*0940.0020.0002] -2655 ; [*0941.0020.0002] -2656 ; [*0942.0020.0002] -2657 ; [*0943.0020.0002] -2658 ; [*0944.0020.0002] -2659 ; [*0945.0020.0002] -265A ; [*0946.0020.0002] -265B ; [*0947.0020.0002] -265C ; [*0948.0020.0002] -265D ; [*0949.0020.0002] -265E ; [*094A.0020.0002] -265F ; [*094B.0020.0002] -2660 ; [*094C.0020.0002] -2661 ; [*094D.0020.0002] -2662 ; [*094E.0020.0002] -2663 ; [*094F.0020.0002] -2664 ; [*0950.0020.0002] -2665 ; [*0951.0020.0002] -2666 ; [*0952.0020.0002] -2667 ; [*0953.0020.0002] -2668 ; [*0954.0020.0002] -2669 ; [*0955.0020.0002] -266A ; [*0956.0020.0002] -266B ; [*0957.0020.0002] -266C ; [*0958.0020.0002] -266D ; [*10CD.0020.0002] -266E ; [*10CE.0020.0002] -266F ; [*10CF.0020.0002] -2670 ; [*0959.0020.0002] -2671 ; [*095A.0020.0002] -2672 ; [*095B.0020.0002] -2673 ; [*095C.0020.0002] -2674 ; [*095D.0020.0002] -2675 ; [*095E.0020.0002] -2676 ; [*095F.0020.0002] -2677 ; [*0960.0020.0002] -2678 ; [*0961.0020.0002] -2679 ; [*0962.0020.0002] -267A ; [*0963.0020.0002] -267B ; [*0964.0020.0002] -267C ; [*0965.0020.0002] -267D ; [*0966.0020.0002] -267E ; [*0967.0020.0002] -267F ; [*0968.0020.0002] -2680 ; [*0969.0020.0002] -2681 ; [*096A.0020.0002] -2682 ; [*096B.0020.0002] -2683 ; [*096C.0020.0002] -2684 ; [*096D.0020.0002] -2685 ; [*096E.0020.0002] -2686 ; [*096F.0020.0002] -2687 ; [*0970.0020.0002] -2688 ; [*0971.0020.0002] -2689 ; [*0972.0020.0002] -268A ; [*0E78.0020.0002] -268B ; [*0E79.0020.0002] -268C ; [*0E7A.0020.0002] -268D ; [*0E7B.0020.0002] -268E ; [*0E7C.0020.0002] -268F ; [*0E7D.0020.0002] -2690 ; [*0973.0020.0002] -2691 ; [*0974.0020.0002] -2692 ; [*0975.0020.0002] -2693 ; [*0976.0020.0002] -2694 ; [*0977.0020.0002] -2695 ; [*0978.0020.0002] -2696 ; [*0979.0020.0002] -2697 ; [*097A.0020.0002] -2698 ; [*097B.0020.0002] -2699 ; [*097C.0020.0002] -269A ; [*097D.0020.0002] -269B ; [*097E.0020.0002] -269C ; [*097F.0020.0002] -269D ; [*0980.0020.0002] -269E ; [*0981.0020.0002] -269F ; [*0982.0020.0002] -26A0 ; [*0983.0020.0002] -26A1 ; [*0984.0020.0002] -26A2 ; [*0985.0020.0002] -26A3 ; [*0986.0020.0002] -26A4 ; [*0987.0020.0002] -26A5 ; [*0988.0020.0002] -26A6 ; [*0989.0020.0002] -26A7 ; [*098A.0020.0002] -26A8 ; [*098B.0020.0002] -26A9 ; [*098C.0020.0002] -26AA ; [*098D.0020.0002] -26AB ; [*098E.0020.0002] -26AC ; [*098F.0020.0002] -26AD ; [*0990.0020.0002] -26AE ; [*0991.0020.0002] -26AF ; [*0992.0020.0002] -26B0 ; [*0993.0020.0002] -26B1 ; [*0994.0020.0002] -26B2 ; [*0995.0020.0002] -26B3 ; [*0996.0020.0002] -26B4 ; [*0997.0020.0002] -26B5 ; [*0998.0020.0002] -26B6 ; [*0999.0020.0002] -26B7 ; [*099A.0020.0002] -26B8 ; [*099B.0020.0002] -26B9 ; [*099C.0020.0002] -26BA ; [*099D.0020.0002] -26BB ; [*099E.0020.0002] -26BC ; [*099F.0020.0002] -26BD ; [*09A0.0020.0002] -26BE ; [*09A1.0020.0002] -26BF ; [*09A2.0020.0002] -26C0 ; [*09A3.0020.0002] -26C1 ; [*09A4.0020.0002] -26C2 ; [*09A5.0020.0002] -26C3 ; [*09A6.0020.0002] -26C4 ; [*09A7.0020.0002] -26C5 ; [*09A8.0020.0002] -26C6 ; [*09A9.0020.0002] -26C7 ; [*09AA.0020.0002] -26C8 ; [*09AB.0020.0002] -26C9 ; [*09AC.0020.0002] -26CA ; [*09AD.0020.0002] -26CB ; [*09AE.0020.0002] -26CC ; [*09AF.0020.0002] -26CD ; [*09B0.0020.0002] -26CE ; [*09B1.0020.0002] -26CF ; [*09B2.0020.0002] -26D0 ; [*09B3.0020.0002] -26D1 ; [*09B4.0020.0002] -26D2 ; [*09B5.0020.0002] -26D3 ; [*09B6.0020.0002] -26D4 ; [*09B7.0020.0002] -26D5 ; [*09B8.0020.0002] -26D6 ; [*09B9.0020.0002] -26D7 ; [*09BA.0020.0002] -26D8 ; [*09BB.0020.0002] -26D9 ; [*09BC.0020.0002] -26DA ; [*09BD.0020.0002] -26DB ; [*09BE.0020.0002] -26DC ; [*09BF.0020.0002] -26DD ; [*09C0.0020.0002] -26DE ; [*09C1.0020.0002] -26DF ; [*09C2.0020.0002] -26E0 ; [*09C3.0020.0002] -26E1 ; [*09C4.0020.0002] -26E2 ; [*09C5.0020.0002] -26E3 ; [*09C6.0020.0002] -26E4 ; [*09C7.0020.0002] -26E5 ; [*09C8.0020.0002] -26E6 ; [*09C9.0020.0002] -26E7 ; [*09CA.0020.0002] -26E8 ; [*09CB.0020.0002] -26E9 ; [*09CC.0020.0002] -26EA ; [*09CD.0020.0002] -26EB ; [*09CE.0020.0002] -26EC ; [*09CF.0020.0002] -26ED ; [*09D0.0020.0002] -26EE ; [*09D1.0020.0002] -26EF ; [*09D2.0020.0002] -26F0 ; [*09D3.0020.0002] -26F1 ; [*09D4.0020.0002] -26F2 ; [*09D5.0020.0002] -26F3 ; [*09D6.0020.0002] -26F4 ; [*09D7.0020.0002] -26F5 ; [*09D8.0020.0002] -26F6 ; [*09D9.0020.0002] -26F7 ; [*09DA.0020.0002] -26F8 ; [*09DB.0020.0002] -26F9 ; [*09DC.0020.0002] -26FA ; [*09DD.0020.0002] -26FB ; [*09DE.0020.0002] -26FC ; [*09DF.0020.0002] -26FD ; [*09E0.0020.0002] -26FE ; [*09E1.0020.0002] -26FF ; [*09E2.0020.0002] -2700 ; [*09FD.0020.0002] -2701 ; [*09FE.0020.0002] -2702 ; [*09FF.0020.0002] -2703 ; [*0A00.0020.0002] -2704 ; [*0A01.0020.0002] -2705 ; [*0A02.0020.0002] -2706 ; [*0A03.0020.0002] -2707 ; [*0A04.0020.0002] -2708 ; [*0A05.0020.0002] -2709 ; [*0A06.0020.0002] -270A ; [*0A07.0020.0002] -270B ; [*0A08.0020.0002] -270C ; [*0A09.0020.0002] -270D ; [*0A0A.0020.0002] -270E ; [*0A0B.0020.0002] -270F ; [*0A0C.0020.0002] -2710 ; [*0A0D.0020.0002] -2711 ; [*0A0E.0020.0002] -2712 ; [*0A0F.0020.0002] -2713 ; [*0A10.0020.0002] -2714 ; [*0A11.0020.0002] -2715 ; [*0A12.0020.0002] -2716 ; [*0A13.0020.0002] -2717 ; [*0A14.0020.0002] -2718 ; [*0A15.0020.0002] -2719 ; [*0A16.0020.0002] -271A ; [*0A17.0020.0002] -271B ; [*0A18.0020.0002] -271C ; [*0A19.0020.0002] -271D ; [*0A1A.0020.0002] -271E ; [*0A1B.0020.0002] -271F ; [*0A1C.0020.0002] -2720 ; [*0A1D.0020.0002] -2721 ; [*0A1E.0020.0002] -2722 ; [*0A1F.0020.0002] -2723 ; [*0A20.0020.0002] -2724 ; [*0A21.0020.0002] -2725 ; [*0A22.0020.0002] -2726 ; [*0A23.0020.0002] -2727 ; [*0A24.0020.0002] -2728 ; [*0A25.0020.0002] -2729 ; [*0A26.0020.0002] -272A ; [*0A27.0020.0002] -272B ; [*0A28.0020.0002] -272C ; [*0A29.0020.0002] -272D ; [*0A2A.0020.0002] -272E ; [*0A2B.0020.0002] -272F ; [*0A2C.0020.0002] -2730 ; [*0A2D.0020.0002] -2731 ; [*0A2E.0020.0002] -2732 ; [*0A2F.0020.0002] -2733 ; [*0A30.0020.0002] -2734 ; [*0A31.0020.0002] -2735 ; [*0A32.0020.0002] -2736 ; [*0A33.0020.0002] -2737 ; [*0A34.0020.0002] -2738 ; [*0A35.0020.0002] -2739 ; [*0A36.0020.0002] -273A ; [*0A37.0020.0002] -273B ; [*0A38.0020.0002] -273C ; [*0A39.0020.0002] -273D ; [*0A3A.0020.0002] -273E ; [*0A3B.0020.0002] -273F ; [*0A3C.0020.0002] -2740 ; [*0A3D.0020.0002] -2741 ; [*0A3E.0020.0002] -2742 ; [*0A3F.0020.0002] -2743 ; [*0A40.0020.0002] -2744 ; [*0A41.0020.0002] -2745 ; [*0A42.0020.0002] -2746 ; [*0A43.0020.0002] -2747 ; [*0A44.0020.0002] -2748 ; [*0A45.0020.0002] -2749 ; [*0A46.0020.0002] -274A ; [*0A47.0020.0002] -274B ; [*0A48.0020.0002] -274C ; [*0A49.0020.0002] -274D ; [*0A4A.0020.0002] -274E ; [*0A4B.0020.0002] -274F ; [*0A4C.0020.0002] -2750 ; [*0A4D.0020.0002] -2751 ; [*0A4E.0020.0002] -2752 ; [*0A4F.0020.0002] -2753 ; [*0A50.0020.0002] -2754 ; [*0A51.0020.0002] -2755 ; [*0A52.0020.0002] -2756 ; [*0A53.0020.0002] -2757 ; [*0A54.0020.0002] -2758 ; [*0A55.0020.0002] -2759 ; [*0A56.0020.0002] -275A ; [*0A57.0020.0002] -275B ; [*0A58.0020.0002] -275C ; [*0A59.0020.0002] -275D ; [*0A5A.0020.0002] -275E ; [*0A5B.0020.0002] -275F ; [*0A5C.0020.0002] -2760 ; [*0A5D.0020.0002] -2761 ; [*0A5E.0020.0002] -2762 ; [*0A5F.0020.0002] -2763 ; [*0A60.0020.0002] -2764 ; [*0A61.0020.0002] -2765 ; [*0A62.0020.0002] -2766 ; [*0A63.0020.0002] -2767 ; [*0A64.0020.0002] -2768 ; [*0346.0020.0002] -2769 ; [*0347.0020.0002] -276A ; [*0348.0020.0002] -276B ; [*0349.0020.0002] -276C ; [*034A.0020.0002] -276D ; [*034B.0020.0002] -276E ; [*034C.0020.0002] -276F ; [*034D.0020.0002] -2770 ; [*034E.0020.0002] -2771 ; [*034F.0020.0002] -2772 ; [*0350.0020.0002] -2773 ; [*0351.0020.0002] -2774 ; [*0352.0020.0002] -2775 ; [*0353.0020.0002] -2794 ; [*0A65.0020.0002] -2795 ; [*0A66.0020.0002] -2796 ; [*0A67.0020.0002] -2797 ; [*0A68.0020.0002] -2798 ; [*0A69.0020.0002] -2799 ; [*0A6A.0020.0002] -279A ; [*0A6B.0020.0002] -279B ; [*0A6C.0020.0002] -279C ; [*0A6D.0020.0002] -279D ; [*0A6E.0020.0002] -279E ; [*0A6F.0020.0002] -279F ; [*0A70.0020.0002] -27A0 ; [*0A71.0020.0002] -27A1 ; [*0A72.0020.0002] -27A2 ; [*0A73.0020.0002] -27A3 ; [*0A74.0020.0002] -27A4 ; [*0A75.0020.0002] -27A5 ; [*0A76.0020.0002] -27A6 ; [*0A77.0020.0002] -27A7 ; [*0A78.0020.0002] -27A8 ; [*0A79.0020.0002] -27A9 ; [*0A7A.0020.0002] -27AA ; [*0A7B.0020.0002] -27AB ; [*0A7C.0020.0002] -27AC ; [*0A7D.0020.0002] -27AD ; [*0A7E.0020.0002] -27AE ; [*0A7F.0020.0002] -27AF ; [*0A80.0020.0002] -27B0 ; [*0A81.0020.0002] -27B1 ; [*0A82.0020.0002] -27B2 ; [*0A83.0020.0002] -27B3 ; [*0A84.0020.0002] -27B4 ; [*0A85.0020.0002] -27B5 ; [*0A86.0020.0002] -27B6 ; [*0A87.0020.0002] -27B7 ; [*0A88.0020.0002] -27B8 ; [*0A89.0020.0002] -27B9 ; [*0A8A.0020.0002] -27BA ; [*0A8B.0020.0002] -27BB ; [*0A8C.0020.0002] -27BC ; [*0A8D.0020.0002] -27BD ; [*0A8E.0020.0002] -27BE ; [*0A8F.0020.0002] -27BF ; [*0A90.0020.0002] -27C0 ; [*0A91.0020.0002] -27C1 ; [*0A92.0020.0002] -27C2 ; [*0A93.0020.0002] -27C3 ; [*0A94.0020.0002] -27C4 ; [*0A95.0020.0002] -27C5 ; [*033A.0020.0002] -27C6 ; [*033B.0020.0002] -27C7 ; [*0A96.0020.0002] -27C8 ; [*0A97.0020.0002] -27C9 ; [*0A98.0020.0002] -27CA ; [*0A99.0020.0002] -27CB ; [*0A9A.0020.0002] -27CC ; [*0A9B.0020.0002] -27CD ; [*0A9C.0020.0002] -27CE ; [*0A9D.0020.0002] -27CF ; [*0A9E.0020.0002] -27D0 ; [*0A9F.0020.0002] -27D1 ; [*0AA0.0020.0002] -27D2 ; [*0AA1.0020.0002] -27D3 ; [*0AA2.0020.0002] -27D4 ; [*0AA3.0020.0002] -27D5 ; [*0AA4.0020.0002] -27D6 ; [*0AA5.0020.0002] -27D7 ; [*0AA6.0020.0002] -27D8 ; [*0AA7.0020.0002] -27D9 ; [*0AA8.0020.0002] -27DA ; [*0AA9.0020.0002] -27DB ; [*0AAA.0020.0002] -27DC ; [*0AAB.0020.0002] -27DD ; [*0AAC.0020.0002] -27DE ; [*0AAD.0020.0002] -27DF ; [*0AAE.0020.0002] -27E0 ; [*0AAF.0020.0002] -27E1 ; [*0AB0.0020.0002] -27E2 ; [*0AB1.0020.0002] -27E3 ; [*0AB2.0020.0002] -27E4 ; [*0AB3.0020.0002] -27E5 ; [*0AB4.0020.0002] -27E6 ; [*033C.0020.0002] -27E7 ; [*033D.0020.0002] -27E8 ; [*033E.0020.0002] -27E9 ; [*033F.0020.0002] -27EA ; [*0340.0020.0002] -27EB ; [*0341.0020.0002] -27EC ; [*0342.0020.0002] -27ED ; [*0343.0020.0002] -27EE ; [*0344.0020.0002] -27EF ; [*0345.0020.0002] -27F0 ; [*0AB5.0020.0002] -27F1 ; [*0AB6.0020.0002] -27F2 ; [*0AB7.0020.0002] -27F3 ; [*0AB8.0020.0002] -27F4 ; [*0AB9.0020.0002] -27F5 ; [*0ABA.0020.0002] -27F6 ; [*0ABB.0020.0002] -27F7 ; [*0ABC.0020.0002] -27F8 ; [*0ABD.0020.0002] -27F9 ; [*0ABE.0020.0002] -27FA ; [*0ABF.0020.0002] -27FB ; [*0AC0.0020.0002] -27FC ; [*0AC1.0020.0002] -27FD ; [*0AC2.0020.0002] -27FE ; [*0AC3.0020.0002] -27FF ; [*0AC4.0020.0002] -2800 ; [*0D78.0020.0002] -2801 ; [*0D79.0020.0002] -2802 ; [*0D7A.0020.0002] -2803 ; [*0D7B.0020.0002] -2804 ; [*0D7C.0020.0002] -2805 ; [*0D7D.0020.0002] -2806 ; [*0D7E.0020.0002] -2807 ; [*0D7F.0020.0002] -2808 ; [*0D80.0020.0002] -2809 ; [*0D81.0020.0002] -280A ; [*0D82.0020.0002] -280B ; [*0D83.0020.0002] -280C ; [*0D84.0020.0002] -280D ; [*0D85.0020.0002] -280E ; [*0D86.0020.0002] -280F ; [*0D87.0020.0002] -2810 ; [*0D88.0020.0002] -2811 ; [*0D89.0020.0002] -2812 ; [*0D8A.0020.0002] -2813 ; [*0D8B.0020.0002] -2814 ; [*0D8C.0020.0002] -2815 ; [*0D8D.0020.0002] -2816 ; [*0D8E.0020.0002] -2817 ; [*0D8F.0020.0002] -2818 ; [*0D90.0020.0002] -2819 ; [*0D91.0020.0002] -281A ; [*0D92.0020.0002] -281B ; [*0D93.0020.0002] -281C ; [*0D94.0020.0002] -281D ; [*0D95.0020.0002] -281E ; [*0D96.0020.0002] -281F ; [*0D97.0020.0002] -2820 ; [*0D98.0020.0002] -2821 ; [*0D99.0020.0002] -2822 ; [*0D9A.0020.0002] -2823 ; [*0D9B.0020.0002] -2824 ; [*0D9C.0020.0002] -2825 ; [*0D9D.0020.0002] -2826 ; [*0D9E.0020.0002] -2827 ; [*0D9F.0020.0002] -2828 ; [*0DA0.0020.0002] -2829 ; [*0DA1.0020.0002] -282A ; [*0DA2.0020.0002] -282B ; [*0DA3.0020.0002] -282C ; [*0DA4.0020.0002] -282D ; [*0DA5.0020.0002] -282E ; [*0DA6.0020.0002] -282F ; [*0DA7.0020.0002] -2830 ; [*0DA8.0020.0002] -2831 ; [*0DA9.0020.0002] -2832 ; [*0DAA.0020.0002] -2833 ; [*0DAB.0020.0002] -2834 ; [*0DAC.0020.0002] -2835 ; [*0DAD.0020.0002] -2836 ; [*0DAE.0020.0002] -2837 ; [*0DAF.0020.0002] -2838 ; [*0DB0.0020.0002] -2839 ; [*0DB1.0020.0002] -283A ; [*0DB2.0020.0002] -283B ; [*0DB3.0020.0002] -283C ; [*0DB4.0020.0002] -283D ; [*0DB5.0020.0002] -283E ; [*0DB6.0020.0002] -283F ; [*0DB7.0020.0002] -2840 ; [*0DB8.0020.0002] -2841 ; [*0DB9.0020.0002] -2842 ; [*0DBA.0020.0002] -2843 ; [*0DBB.0020.0002] -2844 ; [*0DBC.0020.0002] -2845 ; [*0DBD.0020.0002] -2846 ; [*0DBE.0020.0002] -2847 ; [*0DBF.0020.0002] -2848 ; [*0DC0.0020.0002] -2849 ; [*0DC1.0020.0002] -284A ; [*0DC2.0020.0002] -284B ; [*0DC3.0020.0002] -284C ; [*0DC4.0020.0002] -284D ; [*0DC5.0020.0002] -284E ; [*0DC6.0020.0002] -284F ; [*0DC7.0020.0002] -2850 ; [*0DC8.0020.0002] -2851 ; [*0DC9.0020.0002] -2852 ; [*0DCA.0020.0002] -2853 ; [*0DCB.0020.0002] -2854 ; [*0DCC.0020.0002] -2855 ; [*0DCD.0020.0002] -2856 ; [*0DCE.0020.0002] -2857 ; [*0DCF.0020.0002] -2858 ; [*0DD0.0020.0002] -2859 ; [*0DD1.0020.0002] -285A ; [*0DD2.0020.0002] -285B ; [*0DD3.0020.0002] -285C ; [*0DD4.0020.0002] -285D ; [*0DD5.0020.0002] -285E ; [*0DD6.0020.0002] -285F ; [*0DD7.0020.0002] -2860 ; [*0DD8.0020.0002] -2861 ; [*0DD9.0020.0002] -2862 ; [*0DDA.0020.0002] -2863 ; [*0DDB.0020.0002] -2864 ; [*0DDC.0020.0002] -2865 ; [*0DDD.0020.0002] -2866 ; [*0DDE.0020.0002] -2867 ; [*0DDF.0020.0002] -2868 ; [*0DE0.0020.0002] -2869 ; [*0DE1.0020.0002] -286A ; [*0DE2.0020.0002] -286B ; [*0DE3.0020.0002] -286C ; [*0DE4.0020.0002] -286D ; [*0DE5.0020.0002] -286E ; [*0DE6.0020.0002] -286F ; [*0DE7.0020.0002] -2870 ; [*0DE8.0020.0002] -2871 ; [*0DE9.0020.0002] -2872 ; [*0DEA.0020.0002] -2873 ; [*0DEB.0020.0002] -2874 ; [*0DEC.0020.0002] -2875 ; [*0DED.0020.0002] -2876 ; [*0DEE.0020.0002] -2877 ; [*0DEF.0020.0002] -2878 ; [*0DF0.0020.0002] -2879 ; [*0DF1.0020.0002] -287A ; [*0DF2.0020.0002] -287B ; [*0DF3.0020.0002] -287C ; [*0DF4.0020.0002] -287D ; [*0DF5.0020.0002] -287E ; [*0DF6.0020.0002] -287F ; [*0DF7.0020.0002] -2880 ; [*0DF8.0020.0002] -2881 ; [*0DF9.0020.0002] -2882 ; [*0DFA.0020.0002] -2883 ; [*0DFB.0020.0002] -2884 ; [*0DFC.0020.0002] -2885 ; [*0DFD.0020.0002] -2886 ; [*0DFE.0020.0002] -2887 ; [*0DFF.0020.0002] -2888 ; [*0E00.0020.0002] -2889 ; [*0E01.0020.0002] -288A ; [*0E02.0020.0002] -288B ; [*0E03.0020.0002] -288C ; [*0E04.0020.0002] -288D ; [*0E05.0020.0002] -288E ; [*0E06.0020.0002] -288F ; [*0E07.0020.0002] -2890 ; [*0E08.0020.0002] -2891 ; [*0E09.0020.0002] -2892 ; [*0E0A.0020.0002] -2893 ; [*0E0B.0020.0002] -2894 ; [*0E0C.0020.0002] -2895 ; [*0E0D.0020.0002] -2896 ; [*0E0E.0020.0002] -2897 ; [*0E0F.0020.0002] -2898 ; [*0E10.0020.0002] -2899 ; [*0E11.0020.0002] -289A ; [*0E12.0020.0002] -289B ; [*0E13.0020.0002] -289C ; [*0E14.0020.0002] -289D ; [*0E15.0020.0002] -289E ; [*0E16.0020.0002] -289F ; [*0E17.0020.0002] -28A0 ; [*0E18.0020.0002] -28A1 ; [*0E19.0020.0002] -28A2 ; [*0E1A.0020.0002] -28A3 ; [*0E1B.0020.0002] -28A4 ; [*0E1C.0020.0002] -28A5 ; [*0E1D.0020.0002] -28A6 ; [*0E1E.0020.0002] -28A7 ; [*0E1F.0020.0002] -28A8 ; [*0E20.0020.0002] -28A9 ; [*0E21.0020.0002] -28AA ; [*0E22.0020.0002] -28AB ; [*0E23.0020.0002] -28AC ; [*0E24.0020.0002] -28AD ; [*0E25.0020.0002] -28AE ; [*0E26.0020.0002] -28AF ; [*0E27.0020.0002] -28B0 ; [*0E28.0020.0002] -28B1 ; [*0E29.0020.0002] -28B2 ; [*0E2A.0020.0002] -28B3 ; [*0E2B.0020.0002] -28B4 ; [*0E2C.0020.0002] -28B5 ; [*0E2D.0020.0002] -28B6 ; [*0E2E.0020.0002] -28B7 ; [*0E2F.0020.0002] -28B8 ; [*0E30.0020.0002] -28B9 ; [*0E31.0020.0002] -28BA ; [*0E32.0020.0002] -28BB ; [*0E33.0020.0002] -28BC ; [*0E34.0020.0002] -28BD ; [*0E35.0020.0002] -28BE ; [*0E36.0020.0002] -28BF ; [*0E37.0020.0002] -28C0 ; [*0E38.0020.0002] -28C1 ; [*0E39.0020.0002] -28C2 ; [*0E3A.0020.0002] -28C3 ; [*0E3B.0020.0002] -28C4 ; [*0E3C.0020.0002] -28C5 ; [*0E3D.0020.0002] -28C6 ; [*0E3E.0020.0002] -28C7 ; [*0E3F.0020.0002] -28C8 ; [*0E40.0020.0002] -28C9 ; [*0E41.0020.0002] -28CA ; [*0E42.0020.0002] -28CB ; [*0E43.0020.0002] -28CC ; [*0E44.0020.0002] -28CD ; [*0E45.0020.0002] -28CE ; [*0E46.0020.0002] -28CF ; [*0E47.0020.0002] -28D0 ; [*0E48.0020.0002] -28D1 ; [*0E49.0020.0002] -28D2 ; [*0E4A.0020.0002] -28D3 ; [*0E4B.0020.0002] -28D4 ; [*0E4C.0020.0002] -28D5 ; [*0E4D.0020.0002] -28D6 ; [*0E4E.0020.0002] -28D7 ; [*0E4F.0020.0002] -28D8 ; [*0E50.0020.0002] -28D9 ; [*0E51.0020.0002] -28DA ; [*0E52.0020.0002] -28DB ; [*0E53.0020.0002] -28DC ; [*0E54.0020.0002] -28DD ; [*0E55.0020.0002] -28DE ; [*0E56.0020.0002] -28DF ; [*0E57.0020.0002] -28E0 ; [*0E58.0020.0002] -28E1 ; [*0E59.0020.0002] -28E2 ; [*0E5A.0020.0002] -28E3 ; [*0E5B.0020.0002] -28E4 ; [*0E5C.0020.0002] -28E5 ; [*0E5D.0020.0002] -28E6 ; [*0E5E.0020.0002] -28E7 ; [*0E5F.0020.0002] -28E8 ; [*0E60.0020.0002] -28E9 ; [*0E61.0020.0002] -28EA ; [*0E62.0020.0002] -28EB ; [*0E63.0020.0002] -28EC ; [*0E64.0020.0002] -28ED ; [*0E65.0020.0002] -28EE ; [*0E66.0020.0002] -28EF ; [*0E67.0020.0002] -28F0 ; [*0E68.0020.0002] -28F1 ; [*0E69.0020.0002] -28F2 ; [*0E6A.0020.0002] -28F3 ; [*0E6B.0020.0002] -28F4 ; [*0E6C.0020.0002] -28F5 ; [*0E6D.0020.0002] -28F6 ; [*0E6E.0020.0002] -28F7 ; [*0E6F.0020.0002] -28F8 ; [*0E70.0020.0002] -28F9 ; [*0E71.0020.0002] -28FA ; [*0E72.0020.0002] -28FB ; [*0E73.0020.0002] -28FC ; [*0E74.0020.0002] -28FD ; [*0E75.0020.0002] -28FE ; [*0E76.0020.0002] -28FF ; [*0E77.0020.0002] -2900 ; [*0AC5.0020.0002] -2901 ; [*0AC6.0020.0002] -2902 ; [*0AC7.0020.0002] -2903 ; [*0AC8.0020.0002] -2904 ; [*0AC9.0020.0002] -2905 ; [*0ACA.0020.0002] -2906 ; [*0ACB.0020.0002] -2907 ; [*0ACC.0020.0002] -2908 ; [*0ACD.0020.0002] -2909 ; [*0ACE.0020.0002] -290A ; [*0ACF.0020.0002] -290B ; [*0AD0.0020.0002] -290C ; [*0AD1.0020.0002] -290D ; [*0AD2.0020.0002] -290E ; [*0AD3.0020.0002] -290F ; [*0AD4.0020.0002] -2910 ; [*0AD5.0020.0002] -2911 ; [*0AD6.0020.0002] -2912 ; [*0AD7.0020.0002] -2913 ; [*0AD8.0020.0002] -2914 ; [*0AD9.0020.0002] -2915 ; [*0ADA.0020.0002] -2916 ; [*0ADB.0020.0002] -2917 ; [*0ADC.0020.0002] -2918 ; [*0ADD.0020.0002] -2919 ; [*0ADE.0020.0002] -291A ; [*0ADF.0020.0002] -291B ; [*0AE0.0020.0002] -291C ; [*0AE1.0020.0002] -291D ; [*0AE2.0020.0002] -291E ; [*0AE3.0020.0002] -291F ; [*0AE4.0020.0002] -2920 ; [*0AE5.0020.0002] -2921 ; [*0AE6.0020.0002] -2922 ; [*0AE7.0020.0002] -2923 ; [*0AE8.0020.0002] -2924 ; [*0AE9.0020.0002] -2925 ; [*0AEA.0020.0002] -2926 ; [*0AEB.0020.0002] -2927 ; [*0AEC.0020.0002] -2928 ; [*0AED.0020.0002] -2929 ; [*0AEE.0020.0002] -292A ; [*0AEF.0020.0002] -292B ; [*0AF0.0020.0002] -292C ; [*0AF1.0020.0002] -292D ; [*0AF2.0020.0002] -292E ; [*0AF3.0020.0002] -292F ; [*0AF4.0020.0002] -2930 ; [*0AF5.0020.0002] -2931 ; [*0AF6.0020.0002] -2932 ; [*0AF7.0020.0002] -2933 ; [*0AF8.0020.0002] -2934 ; [*0AF9.0020.0002] -2935 ; [*0AFA.0020.0002] -2936 ; [*0AFB.0020.0002] -2937 ; [*0AFC.0020.0002] -2938 ; [*0AFD.0020.0002] -2939 ; [*0AFE.0020.0002] -293A ; [*0AFF.0020.0002] -293B ; [*0B00.0020.0002] -293C ; [*0B01.0020.0002] -293D ; [*0B02.0020.0002] -293E ; [*0B03.0020.0002] -293F ; [*0B04.0020.0002] -2940 ; [*0B05.0020.0002] -2941 ; [*0B06.0020.0002] -2942 ; [*0B07.0020.0002] -2943 ; [*0B08.0020.0002] -2944 ; [*0B09.0020.0002] -2945 ; [*0B0A.0020.0002] -2946 ; [*0B0B.0020.0002] -2947 ; [*0B0C.0020.0002] -2948 ; [*0B0D.0020.0002] -2949 ; [*0B0E.0020.0002] -294A ; [*0B0F.0020.0002] -294B ; [*0B10.0020.0002] -294C ; [*0B11.0020.0002] -294D ; [*0B12.0020.0002] -294E ; [*0B13.0020.0002] -294F ; [*0B14.0020.0002] -2950 ; [*0B15.0020.0002] -2951 ; [*0B16.0020.0002] -2952 ; [*0B17.0020.0002] -2953 ; [*0B18.0020.0002] -2954 ; [*0B19.0020.0002] -2955 ; [*0B1A.0020.0002] -2956 ; [*0B1B.0020.0002] -2957 ; [*0B1C.0020.0002] -2958 ; [*0B1D.0020.0002] -2959 ; [*0B1E.0020.0002] -295A ; [*0B1F.0020.0002] -295B ; [*0B20.0020.0002] -295C ; [*0B21.0020.0002] -295D ; [*0B22.0020.0002] -295E ; [*0B23.0020.0002] -295F ; [*0B24.0020.0002] -2960 ; [*0B25.0020.0002] -2961 ; [*0B26.0020.0002] -2962 ; [*0B27.0020.0002] -2963 ; [*0B28.0020.0002] -2964 ; [*0B29.0020.0002] -2965 ; [*0B2A.0020.0002] -2966 ; [*0B2B.0020.0002] -2967 ; [*0B2C.0020.0002] -2968 ; [*0B2D.0020.0002] -2969 ; [*0B2E.0020.0002] -296A ; [*0B2F.0020.0002] -296B ; [*0B30.0020.0002] -296C ; [*0B31.0020.0002] -296D ; [*0B32.0020.0002] -296E ; [*0B33.0020.0002] -296F ; [*0B34.0020.0002] -2970 ; [*0B35.0020.0002] -2971 ; [*0B36.0020.0002] -2972 ; [*0B37.0020.0002] -2973 ; [*0B38.0020.0002] -2974 ; [*0B39.0020.0002] -2975 ; [*0B3A.0020.0002] -2976 ; [*0B3B.0020.0002] -2977 ; [*0B3C.0020.0002] -2978 ; [*0B3D.0020.0002] -2979 ; [*0B3E.0020.0002] -297A ; [*0B3F.0020.0002] -297B ; [*0B40.0020.0002] -297C ; [*0B41.0020.0002] -297D ; [*0B42.0020.0002] -297E ; [*0B43.0020.0002] -297F ; [*0B44.0020.0002] -2980 ; [*0B45.0020.0002] -2981 ; [*0B46.0020.0002] -2982 ; [*0B47.0020.0002] -2983 ; [*0324.0020.0002] -2984 ; [*0325.0020.0002] -2985 ; [*0326.0020.0002] -2986 ; [*0327.0020.0002] -2987 ; [*0328.0020.0002] -2988 ; [*0329.0020.0002] -2989 ; [*032A.0020.0002] -298A ; [*032B.0020.0002] -298B ; [*032C.0020.0002] -298C ; [*032D.0020.0002] -298D ; [*032E.0020.0002] -298E ; [*032F.0020.0002] -298F ; [*0330.0020.0002] -2990 ; [*0331.0020.0002] -2991 ; [*0332.0020.0002] -2992 ; [*0333.0020.0002] -2993 ; [*0334.0020.0002] -2994 ; [*0335.0020.0002] -2995 ; [*0336.0020.0002] -2996 ; [*0337.0020.0002] -2997 ; [*0338.0020.0002] -2998 ; [*0339.0020.0002] -2999 ; [*0B48.0020.0002] -299A ; [*0B49.0020.0002] -299B ; [*0B4A.0020.0002] -299C ; [*0B4B.0020.0002] -299D ; [*0B4C.0020.0002] -299E ; [*0B4D.0020.0002] -299F ; [*0B4E.0020.0002] -29A0 ; [*0B4F.0020.0002] -29A1 ; [*0B50.0020.0002] -29A2 ; [*0B51.0020.0002] -29A3 ; [*0B52.0020.0002] -29A4 ; [*0B53.0020.0002] -29A5 ; [*0B54.0020.0002] -29A6 ; [*0B55.0020.0002] -29A7 ; [*0B56.0020.0002] -29A8 ; [*0B57.0020.0002] -29A9 ; [*0B58.0020.0002] -29AA ; [*0B59.0020.0002] -29AB ; [*0B5A.0020.0002] -29AC ; [*0B5B.0020.0002] -29AD ; [*0B5C.0020.0002] -29AE ; [*0B5D.0020.0002] -29AF ; [*0B5E.0020.0002] -29B0 ; [*0B5F.0020.0002] -29B1 ; [*0B60.0020.0002] -29B2 ; [*0B61.0020.0002] -29B3 ; [*0B62.0020.0002] -29B4 ; [*0B63.0020.0002] -29B5 ; [*0B64.0020.0002] -29B6 ; [*0B65.0020.0002] -29B7 ; [*0B66.0020.0002] -29B8 ; [*0B67.0020.0002] -29B9 ; [*0B68.0020.0002] -29BA ; [*0B69.0020.0002] -29BB ; [*0B6A.0020.0002] -29BC ; [*0B6B.0020.0002] -29BD ; [*0B6C.0020.0002] -29BE ; [*0B6D.0020.0002] -29BF ; [*0B6E.0020.0002] -29C0 ; [*0B6F.0020.0002] -29C1 ; [*0B70.0020.0002] -29C2 ; [*0B71.0020.0002] -29C3 ; [*0B72.0020.0002] -29C4 ; [*0B73.0020.0002] -29C5 ; [*0B74.0020.0002] -29C6 ; [*0B75.0020.0002] -29C7 ; [*0B76.0020.0002] -29C8 ; [*0B77.0020.0002] -29C9 ; [*0B78.0020.0002] -29CA ; [*0B79.0020.0002] -29CB ; [*0B7A.0020.0002] -29CC ; [*0B7B.0020.0002] -29CD ; [*0B7C.0020.0002] -29CE ; [*0B7D.0020.0002] -29CF ; [*0B7E.0020.0002] -29D0 ; [*0B7F.0020.0002] -29D1 ; [*0B80.0020.0002] -29D2 ; [*0B81.0020.0002] -29D3 ; [*0B82.0020.0002] -29D4 ; [*0B83.0020.0002] -29D5 ; [*0B84.0020.0002] -29D6 ; [*0B85.0020.0002] -29D7 ; [*0B86.0020.0002] -29D8 ; [*037E.0020.0002] -29D9 ; [*037F.0020.0002] -29DA ; [*0380.0020.0002] -29DB ; [*0381.0020.0002] -29DC ; [*0B87.0020.0002] -29DD ; [*0B88.0020.0002] -29DE ; [*0B89.0020.0002] -29DF ; [*0B8A.0020.0002] -29E0 ; [*0B8B.0020.0002] -29E1 ; [*0B8C.0020.0002] -29E2 ; [*0B8D.0020.0002] -29E3 ; [*0B8E.0020.0002] -29E4 ; [*0B8F.0020.0002] -29E5 ; [*0B90.0020.0002] -29E6 ; [*0B91.0020.0002] -29E7 ; [*0B92.0020.0002] -29E8 ; [*0B93.0020.0002] -29E9 ; [*0B94.0020.0002] -29EA ; [*0B95.0020.0002] -29EB ; [*0B96.0020.0002] -29EC ; [*0B97.0020.0002] -29ED ; [*0B98.0020.0002] -29EE ; [*0B99.0020.0002] -29EF ; [*0B9A.0020.0002] -29F0 ; [*0B9B.0020.0002] -29F1 ; [*0B9C.0020.0002] -29F2 ; [*0B9D.0020.0002] -29F3 ; [*0B9E.0020.0002] -29F4 ; [*0B9F.0020.0002] -29F5 ; [*0BA0.0020.0002] -29F6 ; [*0BA1.0020.0002] -29F7 ; [*0BA2.0020.0002] -29F8 ; [*0BA3.0020.0002] -29F9 ; [*0BA4.0020.0002] -29FA ; [*0BA5.0020.0002] -29FB ; [*0BA6.0020.0002] -29FC ; [*0322.0020.0002] -29FD ; [*0323.0020.0002] -29FE ; [*0BA7.0020.0002] -29FF ; [*0BA8.0020.0002] -2A00 ; [*0BA9.0020.0002] -2A01 ; [*0BAA.0020.0002] -2A02 ; [*0BAB.0020.0002] -2A03 ; [*0BAC.0020.0002] -2A04 ; [*0BAD.0020.0002] -2A05 ; [*0BAE.0020.0002] -2A06 ; [*0BAF.0020.0002] -2A07 ; [*0BB0.0020.0002] -2A08 ; [*0BB1.0020.0002] -2A09 ; [*0BB2.0020.0002] -2A0A ; [*0BB3.0020.0002] -2A0B ; [*0BB4.0020.0002] -2A0C ; [*061C.0020.0004][*061C.0020.0004][*061C.0020.0004][*061C.0020.0004] -2A0D ; [*0BB5.0020.0002] -2A0E ; [*0BB6.0020.0002] -2A0F ; [*0BB7.0020.0002] -2A10 ; [*0BB8.0020.0002] -2A11 ; [*0BB9.0020.0002] -2A12 ; [*0BBA.0020.0002] -2A13 ; [*0BBB.0020.0002] -2A14 ; [*0BBC.0020.0002] -2A15 ; [*0BBD.0020.0002] -2A16 ; [*0BBE.0020.0002] -2A17 ; [*0BBF.0020.0002] -2A18 ; [*0BC0.0020.0002] -2A19 ; [*0BC1.0020.0002] -2A1A ; [*0BC2.0020.0002] -2A1B ; [*0BC3.0020.0002] -2A1C ; [*0BC4.0020.0002] -2A1D ; [*0BC5.0020.0002] -2A1E ; [*0BC6.0020.0002] -2A1F ; [*0BC7.0020.0002] -2A20 ; [*0BC8.0020.0002] -2A21 ; [*0BC9.0020.0002] -2A22 ; [*0BCA.0020.0002] -2A23 ; [*0BCB.0020.0002] -2A24 ; [*0BCC.0020.0002] -2A25 ; [*0BCD.0020.0002] -2A26 ; [*0BCE.0020.0002] -2A27 ; [*0BCF.0020.0002] -2A28 ; [*0BD0.0020.0002] -2A29 ; [*0BD1.0020.0002] -2A2A ; [*0BD2.0020.0002] -2A2B ; [*0BD3.0020.0002] -2A2C ; [*0BD4.0020.0002] -2A2D ; [*0BD5.0020.0002] -2A2E ; [*0BD6.0020.0002] -2A2F ; [*0BD7.0020.0002] -2A30 ; [*0BD8.0020.0002] -2A31 ; [*0BD9.0020.0002] -2A32 ; [*0BDA.0020.0002] -2A33 ; [*0BDB.0020.0002] -2A34 ; [*0BDC.0020.0002] -2A35 ; [*0BDD.0020.0002] -2A36 ; [*0BDE.0020.0002] -2A37 ; [*0BDF.0020.0002] -2A38 ; [*0BE0.0020.0002] -2A39 ; [*0BE1.0020.0002] -2A3A ; [*0BE2.0020.0002] -2A3B ; [*0BE3.0020.0002] -2A3C ; [*0BE4.0020.0002] -2A3D ; [*0BE5.0020.0002] -2A3E ; [*0BE6.0020.0002] -2A3F ; [*0BE7.0020.0002] -2A40 ; [*0BE8.0020.0002] -2A41 ; [*0BE9.0020.0002] -2A42 ; [*0BEA.0020.0002] -2A43 ; [*0BEB.0020.0002] -2A44 ; [*0BEC.0020.0002] -2A45 ; [*0BED.0020.0002] -2A46 ; [*0BEE.0020.0002] -2A47 ; [*0BEF.0020.0002] -2A48 ; [*0BF0.0020.0002] -2A49 ; [*0BF1.0020.0002] -2A4A ; [*0BF2.0020.0002] -2A4B ; [*0BF3.0020.0002] -2A4C ; [*0BF4.0020.0002] -2A4D ; [*0BF5.0020.0002] -2A4E ; [*0BF6.0020.0002] -2A4F ; [*0BF7.0020.0002] -2A50 ; [*0BF8.0020.0002] -2A51 ; [*0BF9.0020.0002] -2A52 ; [*0BFA.0020.0002] -2A53 ; [*0BFB.0020.0002] -2A54 ; [*0BFC.0020.0002] -2A55 ; [*0BFD.0020.0002] -2A56 ; [*0BFE.0020.0002] -2A57 ; [*0BFF.0020.0002] -2A58 ; [*0C00.0020.0002] -2A59 ; [*0C01.0020.0002] -2A5A ; [*0C02.0020.0002] -2A5B ; [*0C03.0020.0002] -2A5C ; [*0C04.0020.0002] -2A5D ; [*0C05.0020.0002] -2A5E ; [*0C06.0020.0002] -2A5F ; [*0C07.0020.0002] -2A60 ; [*0C08.0020.0002] -2A61 ; [*0C09.0020.0002] -2A62 ; [*0C0A.0020.0002] -2A63 ; [*0C0B.0020.0002] -2A64 ; [*0C0C.0020.0002] -2A65 ; [*0C0D.0020.0002] -2A66 ; [*0C0E.0020.0002] -2A67 ; [*0C0F.0020.0002] -2A68 ; [*0C10.0020.0002] -2A69 ; [*0C11.0020.0002] -2A6A ; [*0C12.0020.0002] -2A6B ; [*0C13.0020.0002] -2A6C ; [*0C14.0020.0002] -2A6D ; [*0C15.0020.0002] -2A6E ; [*0C16.0020.0002] -2A6F ; [*0C17.0020.0002] -2A70 ; [*0C18.0020.0002] -2A71 ; [*0C19.0020.0002] -2A72 ; [*0C1A.0020.0002] -2A73 ; [*0C1B.0020.0002] -2A74 ; [*0238.0020.0004][*0238.0020.0004][*05FB.0020.0004] -2A75 ; [*05FB.0020.0004][*05FB.0020.0004] -2A76 ; [*05FB.0020.0004][*05FB.0020.0004][*05FB.0020.0004] -2A77 ; [*0C1C.0020.0002] -2A78 ; [*0C1D.0020.0002] -2A79 ; [*0C1E.0020.0002] -2A7A ; [*0C1F.0020.0002] -2A7B ; [*0C20.0020.0002] -2A7C ; [*0C21.0020.0002] -2A7D ; [*0C22.0020.0002] -2A7E ; [*0C23.0020.0002] -2A7F ; [*0C24.0020.0002] -2A80 ; [*0C25.0020.0002] -2A81 ; [*0C26.0020.0002] -2A82 ; [*0C27.0020.0002] -2A83 ; [*0C28.0020.0002] -2A84 ; [*0C29.0020.0002] -2A85 ; [*0C2A.0020.0002] -2A86 ; [*0C2B.0020.0002] -2A87 ; [*0C2C.0020.0002] -2A88 ; [*0C2D.0020.0002] -2A89 ; [*0C2E.0020.0002] -2A8A ; [*0C2F.0020.0002] -2A8B ; [*0C30.0020.0002] -2A8C ; [*0C31.0020.0002] -2A8D ; [*0C32.0020.0002] -2A8E ; [*0C33.0020.0002] -2A8F ; [*0C34.0020.0002] -2A90 ; [*0C35.0020.0002] -2A91 ; [*0C36.0020.0002] -2A92 ; [*0C37.0020.0002] -2A93 ; [*0C38.0020.0002] -2A94 ; [*0C39.0020.0002] -2A95 ; [*0C3A.0020.0002] -2A96 ; [*0C3B.0020.0002] -2A97 ; [*0C3C.0020.0002] -2A98 ; [*0C3D.0020.0002] -2A99 ; [*0C3E.0020.0002] -2A9A ; [*0C3F.0020.0002] -2A9B ; [*0C40.0020.0002] -2A9C ; [*0C41.0020.0002] -2A9D ; [*0C42.0020.0002] -2A9E ; [*0C43.0020.0002] -2A9F ; [*0C44.0020.0002] -2AA0 ; [*0C45.0020.0002] -2AA1 ; [*0C46.0020.0002] -2AA2 ; [*0C47.0020.0002] -2AA3 ; [*0C48.0020.0002] -2AA4 ; [*0C49.0020.0002] -2AA5 ; [*0C4A.0020.0002] -2AA6 ; [*0C4B.0020.0002] -2AA7 ; [*0C4C.0020.0002] -2AA8 ; [*0C4D.0020.0002] -2AA9 ; [*0C4E.0020.0002] -2AAA ; [*0C4F.0020.0002] -2AAB ; [*0C50.0020.0002] -2AAC ; [*0C51.0020.0002] -2AAD ; [*0C52.0020.0002] -2AAE ; [*0C53.0020.0002] -2AAF ; [*0C54.0020.0002] -2AB0 ; [*0C55.0020.0002] -2AB1 ; [*0C56.0020.0002] -2AB2 ; [*0C57.0020.0002] -2AB3 ; [*0C58.0020.0002] -2AB4 ; [*0C59.0020.0002] -2AB5 ; [*0C5A.0020.0002] -2AB6 ; [*0C5B.0020.0002] -2AB7 ; [*0C5C.0020.0002] -2AB8 ; [*0C5D.0020.0002] -2AB9 ; [*0C5E.0020.0002] -2ABA ; [*0C5F.0020.0002] -2ABB ; [*0C60.0020.0002] -2ABC ; [*0C61.0020.0002] -2ABD ; [*0C62.0020.0002] -2ABE ; [*0C63.0020.0002] -2ABF ; [*0C64.0020.0002] -2AC0 ; [*0C65.0020.0002] -2AC1 ; [*0C66.0020.0002] -2AC2 ; [*0C67.0020.0002] -2AC3 ; [*0C68.0020.0002] -2AC4 ; [*0C69.0020.0002] -2AC5 ; [*0C6A.0020.0002] -2AC6 ; [*0C6B.0020.0002] -2AC7 ; [*0C6C.0020.0002] -2AC8 ; [*0C6D.0020.0002] -2AC9 ; [*0C6E.0020.0002] -2ACA ; [*0C6F.0020.0002] -2ACB ; [*0C70.0020.0002] -2ACC ; [*0C71.0020.0002] -2ACD ; [*0C72.0020.0002] -2ACE ; [*0C73.0020.0002] -2ACF ; [*0C74.0020.0002] -2AD0 ; [*0C75.0020.0002] -2AD1 ; [*0C76.0020.0002] -2AD2 ; [*0C77.0020.0002] -2AD3 ; [*0C78.0020.0002] -2AD4 ; [*0C79.0020.0002] -2AD5 ; [*0C7A.0020.0002] -2AD6 ; [*0C7B.0020.0002] -2AD7 ; [*0C7C.0020.0002] -2AD8 ; [*0C7D.0020.0002] -2AD9 ; [*0C7E.0020.0002] -2ADA ; [*0C7F.0020.0002] -2ADB ; [*0C80.0020.0002] -2ADC ; [*0C81.0020.0002][.0000.002F.0002] -2ADD ; [*0C81.0020.0002] -2ADE ; [*0C82.0020.0002] -2ADF ; [*0C83.0020.0002] -2AE0 ; [*0C84.0020.0002] -2AE1 ; [*0C85.0020.0002] -2AE2 ; [*0C86.0020.0002] -2AE3 ; [*0C87.0020.0002] -2AE4 ; [*0C88.0020.0002] -2AE5 ; [*0C89.0020.0002] -2AE6 ; [*0C8A.0020.0002] -2AE7 ; [*0C8B.0020.0002] -2AE8 ; [*0C8C.0020.0002] -2AE9 ; [*0C8D.0020.0002] -2AEA ; [*0C8E.0020.0002] -2AEB ; [*0C8F.0020.0002] -2AEC ; [*0C90.0020.0002] -2AED ; [*0C91.0020.0002] -2AEE ; [*0C92.0020.0002] -2AEF ; [*0C93.0020.0002] -2AF0 ; [*0C94.0020.0002] -2AF1 ; [*0C95.0020.0002] -2AF2 ; [*0C96.0020.0002] -2AF3 ; [*0C97.0020.0002] -2AF4 ; [*0C98.0020.0002] -2AF5 ; [*0C99.0020.0002] -2AF6 ; [*0C9A.0020.0002] -2AF7 ; [*0C9B.0020.0002] -2AF8 ; [*0C9C.0020.0002] -2AF9 ; [*0C9D.0020.0002] -2AFA ; [*0C9E.0020.0002] -2AFB ; [*0C9F.0020.0002] -2AFC ; [*0CA0.0020.0002] -2AFD ; [*0CA1.0020.0002] -2AFE ; [*0CA2.0020.0002] -2AFF ; [*0CA3.0020.0002] -2B00 ; [*0CA4.0020.0002] -2B01 ; [*0CA5.0020.0002] -2B02 ; [*0CA6.0020.0002] -2B03 ; [*0CA7.0020.0002] -2B04 ; [*0CA8.0020.0002] -2B05 ; [*0CA9.0020.0002] -2B06 ; [*0CAA.0020.0002] -2B07 ; [*0CAB.0020.0002] -2B08 ; [*0CAC.0020.0002] -2B09 ; [*0CAD.0020.0002] -2B0A ; [*0CAE.0020.0002] -2B0B ; [*0CAF.0020.0002] -2B0C ; [*0CB0.0020.0002] -2B0D ; [*0CB1.0020.0002] -2B0E ; [*0CB2.0020.0002] -2B0F ; [*0CB3.0020.0002] -2B10 ; [*0CB4.0020.0002] -2B11 ; [*0CB5.0020.0002] -2B12 ; [*0CB6.0020.0002] -2B13 ; [*0CB7.0020.0002] -2B14 ; [*0CB8.0020.0002] -2B15 ; [*0CB9.0020.0002] -2B16 ; [*0CBA.0020.0002] -2B17 ; [*0CBB.0020.0002] -2B18 ; [*0CBC.0020.0002] -2B19 ; [*0CBD.0020.0002] -2B1A ; [*0CBE.0020.0002] -2B1B ; [*0CBF.0020.0002] -2B1C ; [*0CC0.0020.0002] -2B1D ; [*0CC1.0020.0002] -2B1E ; [*0CC2.0020.0002] -2B1F ; [*0CC3.0020.0002] -2B20 ; [*0CC4.0020.0002] -2B21 ; [*0CC5.0020.0002] -2B22 ; [*0CC6.0020.0002] -2B23 ; [*0CC7.0020.0002] -2B24 ; [*0CC8.0020.0002] -2B25 ; [*0CC9.0020.0002] -2B26 ; [*0CCA.0020.0002] -2B27 ; [*0CCB.0020.0002] -2B28 ; [*0CCC.0020.0002] -2B29 ; [*0CCD.0020.0002] -2B2A ; [*0CCE.0020.0002] -2B2B ; [*0CCF.0020.0002] -2B2C ; [*0CD0.0020.0002] -2B2D ; [*0CD1.0020.0002] -2B2E ; [*0CD2.0020.0002] -2B2F ; [*0CD3.0020.0002] -2B30 ; [*0CD4.0020.0002] -2B31 ; [*0CD5.0020.0002] -2B32 ; [*0CD6.0020.0002] -2B33 ; [*0CD7.0020.0002] -2B34 ; [*0CD8.0020.0002] -2B35 ; [*0CD9.0020.0002] -2B36 ; [*0CDA.0020.0002] -2B37 ; [*0CDB.0020.0002] -2B38 ; [*0CDC.0020.0002] -2B39 ; [*0CDD.0020.0002] -2B3A ; [*0CDE.0020.0002] -2B3B ; [*0CDF.0020.0002] -2B3C ; [*0CE0.0020.0002] -2B3D ; [*0CE1.0020.0002] -2B3E ; [*0CE2.0020.0002] -2B3F ; [*0CE3.0020.0002] -2B40 ; [*0CE4.0020.0002] -2B41 ; [*0CE5.0020.0002] -2B42 ; [*0CE6.0020.0002] -2B43 ; [*0CE7.0020.0002] -2B44 ; [*0CE8.0020.0002] -2B45 ; [*0CE9.0020.0002] -2B46 ; [*0CEA.0020.0002] -2B47 ; [*0CEB.0020.0002] -2B48 ; [*0CEC.0020.0002] -2B49 ; [*0CED.0020.0002] -2B4A ; [*0CEE.0020.0002] -2B4B ; [*0CEF.0020.0002] -2B4C ; [*0CF0.0020.0002] -2B4D ; [*0CF1.0020.0002] -2B4E ; [*0CF2.0020.0002] -2B4F ; [*0CF3.0020.0002] -2B50 ; [*0CF4.0020.0002] -2B51 ; [*0CF5.0020.0002] -2B52 ; [*0CF6.0020.0002] -2B53 ; [*0CF7.0020.0002] -2B54 ; [*0CF8.0020.0002] -2B55 ; [*0CF9.0020.0002] -2B56 ; [*0CFA.0020.0002] -2B57 ; [*0CFB.0020.0002] -2B58 ; [*0CFC.0020.0002] -2B59 ; [*0CFD.0020.0002] -2B5A ; [*0CFE.0020.0002] -2B5B ; [*0CFF.0020.0002] -2B5C ; [*0D00.0020.0002] -2B5D ; [*0D01.0020.0002] -2B5E ; [*0D02.0020.0002] -2B5F ; [*0D03.0020.0002] -2B60 ; [*0D04.0020.0002] -2B61 ; [*0D05.0020.0002] -2B62 ; [*0D06.0020.0002] -2B63 ; [*0D07.0020.0002] -2B64 ; [*0D08.0020.0002] -2B65 ; [*0D09.0020.0002] -2B66 ; [*0D0A.0020.0002] -2B67 ; [*0D0B.0020.0002] -2B68 ; [*0D0C.0020.0002] -2B69 ; [*0D0D.0020.0002] -2B6A ; [*0D0E.0020.0002] -2B6B ; [*0D0F.0020.0002] -2B6C ; [*0D10.0020.0002] -2B6D ; [*0D11.0020.0002] -2B6E ; [*0D12.0020.0002] -2B6F ; [*0D13.0020.0002] -2B70 ; [*0D14.0020.0002] -2B71 ; [*0D15.0020.0002] -2B72 ; [*0D16.0020.0002] -2B73 ; [*0D17.0020.0002] -2B76 ; [*0D18.0020.0002] -2B77 ; [*0D19.0020.0002] -2B78 ; [*0D1A.0020.0002] -2B79 ; [*0D1B.0020.0002] -2B7A ; [*0D1C.0020.0002] -2B7B ; [*0D1D.0020.0002] -2B7C ; [*0D1E.0020.0002] -2B7D ; [*0D1F.0020.0002] -2B7E ; [*0D20.0020.0002] -2B7F ; [*0D21.0020.0002] -2B80 ; [*0D22.0020.0002] -2B81 ; [*0D23.0020.0002] -2B82 ; [*0D24.0020.0002] -2B83 ; [*0D25.0020.0002] -2B84 ; [*0D26.0020.0002] -2B85 ; [*0D27.0020.0002] -2B86 ; [*0D28.0020.0002] -2B87 ; [*0D29.0020.0002] -2B88 ; [*0D2A.0020.0002] -2B89 ; [*0D2B.0020.0002] -2B8A ; [*0D2C.0020.0002] -2B8B ; [*0D2D.0020.0002] -2B8C ; [*0D2E.0020.0002] -2B8D ; [*0D2F.0020.0002] -2B8E ; [*0D30.0020.0002] -2B8F ; [*0D31.0020.0002] -2B90 ; [*0D32.0020.0002] -2B91 ; [*0D33.0020.0002] -2B92 ; [*0D34.0020.0002] -2B93 ; [*0D35.0020.0002] -2B94 ; [*0D36.0020.0002] -2B95 ; [*0D37.0020.0002] -2B98 ; [*0D38.0020.0002] -2B99 ; [*0D39.0020.0002] -2B9A ; [*0D3A.0020.0002] -2B9B ; [*0D3B.0020.0002] -2B9C ; [*0D3C.0020.0002] -2B9D ; [*0D3D.0020.0002] -2B9E ; [*0D3E.0020.0002] -2B9F ; [*0D3F.0020.0002] -2BA0 ; [*0D40.0020.0002] -2BA1 ; [*0D41.0020.0002] -2BA2 ; [*0D42.0020.0002] -2BA3 ; [*0D43.0020.0002] -2BA4 ; [*0D44.0020.0002] -2BA5 ; [*0D45.0020.0002] -2BA6 ; [*0D46.0020.0002] -2BA7 ; [*0D47.0020.0002] -2BA8 ; [*0D48.0020.0002] -2BA9 ; [*0D49.0020.0002] -2BAA ; [*0D4A.0020.0002] -2BAB ; [*0D4B.0020.0002] -2BAC ; [*0D4C.0020.0002] -2BAD ; [*0D4D.0020.0002] -2BAE ; [*0D4E.0020.0002] -2BAF ; [*0D4F.0020.0002] -2BB0 ; [*0D50.0020.0002] -2BB1 ; [*0D51.0020.0002] -2BB2 ; [*0D52.0020.0002] -2BB3 ; [*0D53.0020.0002] -2BB4 ; [*0D54.0020.0002] -2BB5 ; [*0D55.0020.0002] -2BB6 ; [*0D56.0020.0002] -2BB7 ; [*0D57.0020.0002] -2BB8 ; [*0D58.0020.0002] -2BB9 ; [*0D59.0020.0002] -2BBD ; [*0D5A.0020.0002] -2BBE ; [*0D5B.0020.0002] -2BBF ; [*0D5C.0020.0002] -2BC0 ; [*0D5D.0020.0002] -2BC1 ; [*0D5E.0020.0002] -2BC2 ; [*0D5F.0020.0002] -2BC3 ; [*0D60.0020.0002] -2BC4 ; [*0D61.0020.0002] -2BC5 ; [*0D62.0020.0002] -2BC6 ; [*0D63.0020.0002] -2BC7 ; [*0D64.0020.0002] -2BC8 ; [*0D65.0020.0002] -2BCA ; [*0D66.0020.0002] -2BCB ; [*0D67.0020.0002] -2BCC ; [*0D68.0020.0002] -2BCD ; [*0D69.0020.0002] -2BCE ; [*0D6A.0020.0002] -2BCF ; [*0D6B.0020.0002] -2BD0 ; [*0D6C.0020.0002] -2BD1 ; [*0D6D.0020.0002] -2BEC ; [*0D6E.0020.0002] -2BED ; [*0D6F.0020.0002] -2BEE ; [*0D70.0020.0002] -2BEF ; [*0D71.0020.0002] -2CE5 ; [*0D72.0020.0002] -2CE6 ; [*0D73.0020.0002] -2CE7 ; [*0D74.0020.0002] -2CE8 ; [*0D75.0020.0002] -2CE9 ; [*0D76.0020.0002] -2CEA ; [*0D77.0020.0002] -2CF9 ; [*027E.0020.0002] -2CFA ; [*026C.0020.0002] -2CFB ; [*026D.0020.0002] -2CFC ; [*02EF.0020.0002] -2CFD ; [*1A68.0020.0002] -2CFE ; [*027F.0020.0002] -2CFF ; [*02F0.0020.0002] -2D70 ; [*0410.0020.0002] -2D7F ; [.0000.0000.0000] -2E00 ; [*03AF.0020.0002] -2E01 ; [*03B0.0020.0002] -2E02 ; [*0354.0020.0002] -2E03 ; [*0355.0020.0002] -2E04 ; [*0356.0020.0002] -2E05 ; [*0357.0020.0002] -2E06 ; [*03B1.0020.0002] -2E07 ; [*03B2.0020.0002] -2E08 ; [*03B3.0020.0002] -2E09 ; [*0358.0020.0002] -2E0A ; [*0359.0020.0002] -2E0B ; [*03B4.0020.0002] -2E0C ; [*035A.0020.0002] -2E0D ; [*035B.0020.0002] -2E0E ; [*03B5.0020.0002] -2E0F ; [*03B6.0020.0002] -2E10 ; [*03B7.0020.0002] -2E11 ; [*03B8.0020.0002] -2E12 ; [*03B9.0020.0002] -2E13 ; [*03BA.0020.0002] -2E14 ; [*03BB.0020.0002] -2E15 ; [*03BC.0020.0002] -2E16 ; [*03BD.0020.0002] -2E17 ; [*021B.0020.0002] -2E18 ; [*0273.0020.0002] -2E19 ; [*02F1.0020.0002] -2E1A ; [*03BE.0020.0002] -2E1B ; [*03BF.0020.0002] -2E1C ; [*035C.0020.0002] -2E1D ; [*035D.0020.0002] -2E1E ; [*03C0.0020.0002] -2E1F ; [*03C1.0020.0002] -2E20 ; [*035E.0020.0002] -2E21 ; [*035F.0020.0002] -2E22 ; [*0360.0020.0002] -2E23 ; [*0361.0020.0002] -2E24 ; [*0362.0020.0002] -2E25 ; [*0363.0020.0002] -2E26 ; [*0364.0020.0002] -2E27 ; [*0365.0020.0002] -2E28 ; [*0366.0020.0002] -2E29 ; [*0367.0020.0002] -2E2A ; [*02EA.0020.0002] -2E2B ; [*02EB.0020.0002] -2E2C ; [*02EC.0020.0002] -2E2D ; [*02ED.0020.0002] -2E2E ; [*0266.0020.0002] -2E30 ; [*0280.0020.0002] -2E31 ; [*0289.0020.0002] -2E32 ; [*0223.0020.0002] -2E33 ; [*028A.0020.0002] -2E34 ; [*0222.0020.0002] -2E35 ; [*0236.0020.0002] -2E36 ; [*039A.0020.0002] -2E37 ; [*039B.0020.0002] -2E38 ; [*039C.0020.0002] -2E39 ; [*0383.0020.0002] -2E3A ; [*0218.0020.0002] -2E3B ; [*0219.0020.0002] -2E3C ; [*0281.0020.0002] -2E3D ; [*02EE.0020.0002] -2E3E ; [*037D.0020.0002] -2E3F ; [*0386.0020.0002] -2E40 ; [*021C.0020.0002] -2E41 ; [*0224.0020.0002] -2E42 ; [*030A.0020.0002] -2FF0 ; [*19EB.0020.0002] -2FF1 ; [*19EC.0020.0002] -2FF2 ; [*19ED.0020.0002] -2FF3 ; [*19EE.0020.0002] -2FF4 ; [*19EF.0020.0002] -2FF5 ; [*19F0.0020.0002] -2FF6 ; [*19F1.0020.0002] -2FF7 ; [*19F2.0020.0002] -2FF8 ; [*19F3.0020.0002] -2FF9 ; [*19F4.0020.0002] -2FFA ; [*19F5.0020.0002] -2FFB ; [*19F6.0020.0002] -3000 ; [*0209.0020.0003] -3001 ; [*0230.0020.0002] -3002 ; [*0287.0020.0002] -3003 ; [*03A5.0020.0002] -3004 ; [*1A1B.0020.0002] -3008 ; [*0368.0020.0002] -3009 ; [*0369.0020.0002] -300A ; [*036A.0020.0002] -300B ; [*036B.0020.0002] -300C ; [*036C.0020.0002] -300D ; [*036D.0020.0002] -300E ; [*036E.0020.0002] -300F ; [*036F.0020.0002] -3010 ; [*0370.0020.0002] -3011 ; [*0371.0020.0002] -3012 ; [*1A1C.0020.0002] -3013 ; [*1A1D.0020.0002] -3014 ; [*0372.0020.0002] -3015 ; [*0373.0020.0002] -3016 ; [*0374.0020.0002] -3017 ; [*0375.0020.0002] -3018 ; [*0376.0020.0002] -3019 ; [*0377.0020.0002] -301A ; [*0378.0020.0002] -301B ; [*0379.0020.0002] -301C ; [*021D.0020.0002] -301D ; [*030B.0020.0002] -301E ; [*030C.0020.0002] -301F ; [*030D.0020.0002] -3020 ; [*1A1E.0020.0002] -3030 ; [*021E.0020.0002] -3036 ; [*1A1C.0020.0004] -3037 ; [*1A1F.0020.0002] -303D ; [*03A6.0020.0002] -303E ; [*1A20.0020.0002] -303F ; [*1A21.0020.0002] -309B ; [*0472.0020.0002] -309C ; [*0473.0020.0002] -30A0 ; [*021F.0020.0002] -30FB ; [*0220.0020.0002] -3190 ; [*1A22.0020.0002] -3191 ; [*1A23.0020.0002] -31C0 ; [*19F7.0020.0002] -31C1 ; [*19F8.0020.0002] -31C2 ; [*19F9.0020.0002] -31C3 ; [*19FA.0020.0002] -31C4 ; [*19FB.0020.0002] -31C5 ; [*19FC.0020.0002] -31C6 ; [*19FD.0020.0002] -31C7 ; [*19FE.0020.0002] -31C8 ; [*19FF.0020.0002] -31C9 ; [*1A00.0020.0002] -31CA ; [*1A01.0020.0002] -31CB ; [*1A02.0020.0002] -31CC ; [*1A03.0020.0002] -31CD ; [*1A04.0020.0002] -31CE ; [*1A05.0020.0002] -31CF ; [*1A06.0020.0002] -31D0 ; [*1A07.0020.0002] -31D1 ; [*1A08.0020.0002] -31D2 ; [*1A09.0020.0002] -31D3 ; [*1A0A.0020.0002] -31D4 ; [*1A0B.0020.0002] -31D5 ; [*1A0C.0020.0002] -31D6 ; [*1A0D.0020.0002] -31D7 ; [*1A0E.0020.0002] -31D8 ; [*1A0F.0020.0002] -31D9 ; [*1A10.0020.0002] -31DA ; [*1A11.0020.0002] -31DB ; [*1A12.0020.0002] -31DC ; [*1A13.0020.0002] -31DD ; [*1A14.0020.0002] -31DE ; [*1A15.0020.0002] -31DF ; [*1A16.0020.0002] -31E0 ; [*1A17.0020.0002] -31E1 ; [*1A18.0020.0002] -31E2 ; [*1A19.0020.0002] -31E3 ; [*1A1A.0020.0002] -327F ; [*1A24.0020.0002] -4DC0 ; [*0E86.0020.0002] -4DC1 ; [*0E87.0020.0002] -4DC2 ; [*0E88.0020.0002] -4DC3 ; [*0E89.0020.0002] -4DC4 ; [*0E8A.0020.0002] -4DC5 ; [*0E8B.0020.0002] -4DC6 ; [*0E8C.0020.0002] -4DC7 ; [*0E8D.0020.0002] -4DC8 ; [*0E8E.0020.0002] -4DC9 ; [*0E8F.0020.0002] -4DCA ; [*0E90.0020.0002] -4DCB ; [*0E91.0020.0002] -4DCC ; [*0E92.0020.0002] -4DCD ; [*0E93.0020.0002] -4DCE ; [*0E94.0020.0002] -4DCF ; [*0E95.0020.0002] -4DD0 ; [*0E96.0020.0002] -4DD1 ; [*0E97.0020.0002] -4DD2 ; [*0E98.0020.0002] -4DD3 ; [*0E99.0020.0002] -4DD4 ; [*0E9A.0020.0002] -4DD5 ; [*0E9B.0020.0002] -4DD6 ; [*0E9C.0020.0002] -4DD7 ; [*0E9D.0020.0002] -4DD8 ; [*0E9E.0020.0002] -4DD9 ; [*0E9F.0020.0002] -4DDA ; [*0EA0.0020.0002] -4DDB ; [*0EA1.0020.0002] -4DDC ; [*0EA2.0020.0002] -4DDD ; [*0EA3.0020.0002] -4DDE ; [*0EA4.0020.0002] -4DDF ; [*0EA5.0020.0002] -4DE0 ; [*0EA6.0020.0002] -4DE1 ; [*0EA7.0020.0002] -4DE2 ; [*0EA8.0020.0002] -4DE3 ; [*0EA9.0020.0002] -4DE4 ; [*0EAA.0020.0002] -4DE5 ; [*0EAB.0020.0002] -4DE6 ; [*0EAC.0020.0002] -4DE7 ; [*0EAD.0020.0002] -4DE8 ; [*0EAE.0020.0002] -4DE9 ; [*0EAF.0020.0002] -4DEA ; [*0EB0.0020.0002] -4DEB ; [*0EB1.0020.0002] -4DEC ; [*0EB2.0020.0002] -4DED ; [*0EB3.0020.0002] -4DEE ; [*0EB4.0020.0002] -4DEF ; [*0EB5.0020.0002] -4DF0 ; [*0EB6.0020.0002] -4DF1 ; [*0EB7.0020.0002] -4DF2 ; [*0EB8.0020.0002] -4DF3 ; [*0EB9.0020.0002] -4DF4 ; [*0EBA.0020.0002] -4DF5 ; [*0EBB.0020.0002] -4DF6 ; [*0EBC.0020.0002] -4DF7 ; [*0EBD.0020.0002] -4DF8 ; [*0EBE.0020.0002] -4DF9 ; [*0EBF.0020.0002] -4DFA ; [*0EC0.0020.0002] -4DFB ; [*0EC1.0020.0002] -4DFC ; [*0EC2.0020.0002] -4DFD ; [*0EC3.0020.0002] -4DFE ; [*0EC4.0020.0002] -4DFF ; [*0EC5.0020.0002] -A490 ; [*0F1D.0020.0002] -A491 ; [*0F1E.0020.0002] -A492 ; [*0F1F.0020.0002] -A493 ; [*0F20.0020.0002] -A494 ; [*0F21.0020.0002] -A495 ; [*0F22.0020.0002] -A496 ; [*0F23.0020.0002] -A497 ; [*0F24.0020.0002] -A498 ; [*0F25.0020.0002] -A499 ; [*0F26.0020.0002] -A49A ; [*0F27.0020.0002] -A49B ; [*0F28.0020.0002] -A49C ; [*0F29.0020.0002] -A49D ; [*0F2A.0020.0002] -A49E ; [*0F2B.0020.0002] -A49F ; [*0F2C.0020.0002] -A4A0 ; [*0F2D.0020.0002] -A4A1 ; [*0F2E.0020.0002] -A4A2 ; [*0F2F.0020.0002] -A4A3 ; [*0F30.0020.0002] -A4A4 ; [*0F31.0020.0002] -A4A5 ; [*0F32.0020.0002] -A4A6 ; [*0F33.0020.0002] -A4A7 ; [*0F34.0020.0002] -A4A8 ; [*0F35.0020.0002] -A4A9 ; [*0F36.0020.0002] -A4AA ; [*0F37.0020.0002] -A4AB ; [*0F38.0020.0002] -A4AC ; [*0F39.0020.0002] -A4AD ; [*0F3A.0020.0002] -A4AE ; [*0F3B.0020.0002] -A4AF ; [*0F3C.0020.0002] -A4B0 ; [*0F3D.0020.0002] -A4B1 ; [*0F3E.0020.0002] -A4B2 ; [*0F3F.0020.0002] -A4B3 ; [*0F40.0020.0002] -A4B4 ; [*0F41.0020.0002] -A4B5 ; [*0F42.0020.0002] -A4B6 ; [*0F43.0020.0002] -A4B7 ; [*0F44.0020.0002] -A4B8 ; [*0F45.0020.0002] -A4B9 ; [*0F46.0020.0002] -A4BA ; [*0F47.0020.0002] -A4BB ; [*0F48.0020.0002] -A4BC ; [*0F49.0020.0002] -A4BD ; [*0F4A.0020.0002] -A4BE ; [*0F4B.0020.0002] -A4BF ; [*0F4C.0020.0002] -A4C0 ; [*0F4D.0020.0002] -A4C1 ; [*0F4E.0020.0002] -A4C2 ; [*0F4F.0020.0002] -A4C3 ; [*0F50.0020.0002] -A4C4 ; [*0F51.0020.0002] -A4C5 ; [*0F52.0020.0002] -A4C6 ; [*0F53.0020.0002] -A4FE ; [*022D.0020.0002] -A4FF ; [*0282.0020.0002] -A60D ; [*022E.0020.0002] -A60E ; [*0283.0020.0002] -A60F ; [*026E.0020.0002] -A670 ; [.0000.0000.0000] -A671 ; [.0000.0000.0000] -A672 ; [.0000.0000.0000] -A673 ; [*038C.0020.0002] -A67E ; [*03C2.0020.0002] -A6F2 ; [*02D0.0020.0002] -A6F3 ; [*0284.0020.0002] -A6F4 ; [*025E.0020.0002] -A6F5 ; [*022F.0020.0002] -A6F6 ; [*0237.0020.0002] -A6F7 ; [*026F.0020.0002] -A700 ; [*04B1.0020.0002] -A701 ; [*04B2.0020.0002] -A702 ; [*04B3.0020.0002] -A703 ; [*04B4.0020.0002] -A704 ; [*04B5.0020.0002] -A705 ; [*04B6.0020.0002] -A706 ; [*04B7.0020.0002] -A707 ; [*04B8.0020.0002] -A708 ; [*04B9.0020.0002] -A709 ; [*04BA.0020.0002] -A70A ; [*04BB.0020.0002] -A70B ; [*04BC.0020.0002] -A70C ; [*04BD.0020.0002] -A70D ; [*04BE.0020.0002] -A70E ; [*04BF.0020.0002] -A70F ; [*04C0.0020.0002] -A710 ; [*04C1.0020.0002] -A711 ; [*04C2.0020.0002] -A712 ; [*04C3.0020.0002] -A713 ; [*04C4.0020.0002] -A714 ; [*04C5.0020.0002] -A715 ; [*04C6.0020.0002] -A716 ; [*04C7.0020.0002] -A717 ; [*04C8.0020.0002] -A718 ; [*04C9.0020.0002] -A719 ; [*04CA.0020.0002] -A71A ; [*04CB.0020.0002] -A71B ; [*04CC.0020.0002] -A71C ; [*04CD.0020.0002] -A71D ; [*04CE.0020.0002] -A71E ; [*04CF.0020.0002] -A71F ; [*04D0.0020.0002] -A720 ; [*04D1.0020.0002] -A721 ; [*04D2.0020.0002] -A788 ; [*04D3.0020.0002] -A789 ; [*04D4.0020.0002] -A78A ; [*04D5.0020.0002] -A828 ; [*04FF.0020.0002] -A829 ; [*0500.0020.0002] -A82A ; [*0501.0020.0002] -A82B ; [*0502.0020.0002] -A830 ; [*1A32.0020.0002] -A831 ; [*1A33.0020.0002] -A832 ; [*1A34.0020.0002] -A833 ; [*1A35.0020.0002] -A834 ; [*1A36.0020.0002] -A835 ; [*1A37.0020.0002] -A836 ; [*0503.0020.0002] -A837 ; [*0504.0020.0002] -A839 ; [*0505.0020.0002] -A874 ; [*0411.0020.0002] -A875 ; [*0412.0020.0002] -A876 ; [*0291.0020.0002] -A877 ; [*0292.0020.0002] -A8CE ; [*028D.0020.0002] -A8CF ; [*028E.0020.0002] -A8E0 ; [.0000.0000.0000] -A8E1 ; [.0000.0000.0000] -A8E2 ; [.0000.0000.0000] -A8E3 ; [.0000.0000.0000] -A8E4 ; [.0000.0000.0000] -A8E5 ; [.0000.0000.0000] -A8E6 ; [.0000.0000.0000] -A8E7 ; [.0000.0000.0000] -A8E8 ; [.0000.0000.0000] -A8E9 ; [.0000.0000.0000] -A8EA ; [.0000.0000.0000] -A8EB ; [.0000.0000.0000] -A8EC ; [.0000.0000.0000] -A8ED ; [.0000.0000.0000] -A8EE ; [.0000.0000.0000] -A8EF ; [.0000.0000.0000] -A8F0 ; [.0000.0000.0000] -A8F1 ; [.0000.0000.0000] -A8F8 ; [*03D3.0020.0002] -A8F9 ; [*03D4.0020.0002] -A8FA ; [*03D5.0020.0002] -A8FC ; [*03D6.0020.0002] -A92E ; [*0417.0020.0002] -A92F ; [*0295.0020.0002] -A95F ; [*02D1.0020.0002] -A9C1 ; [*02C6.0020.0002] -A9C2 ; [*02C7.0020.0002] -A9C3 ; [*02C8.0020.0002] -A9C4 ; [*02C9.0020.0002] -A9C5 ; [*02CA.0020.0002] -A9C6 ; [*02CB.0020.0002] -A9C7 ; [*025A.0020.0002] -A9C8 ; [*02A0.0020.0002] -A9C9 ; [*02A1.0020.0002] -A9CA ; [*02CC.0020.0002] -A9CB ; [*02CD.0020.0002] -A9CC ; [*02CE.0020.0002] -A9CD ; [*02CF.0020.0002] -A9DE ; [*0418.0020.0002] -A9DF ; [*0419.0020.0002] -AA5C ; [*041A.0020.0002] -AA5D ; [*02A2.0020.0002] -AA5E ; [*02A3.0020.0002] -AA5F ; [*02A4.0020.0002] -AA77 ; [*052D.0020.0002] -AA78 ; [*052E.0020.0002] -AA79 ; [*052F.0020.0002] -AADE ; [*03DC.0020.0002] -AADF ; [*03DD.0020.0002] -AAF0 ; [*02A5.0020.0002] -AAF1 ; [*0270.0020.0002] -AB5B ; [*04D6.0020.0002] -ABEB ; [*02A6.0020.0002] -FB29 ; [*05F6.0020.0005] -FBB2 ; [*04E3.0020.0002] -FBB3 ; [*04E4.0020.0002] -FBB4 ; [*04E5.0020.0002] -FBB5 ; [*04E6.0020.0002] -FBB6 ; [*04E7.0020.0002] -FBB7 ; [*04E8.0020.0002] -FBB8 ; [*04E9.0020.0002] -FBB9 ; [*04EA.0020.0002] -FBBA ; [*04EB.0020.0002] -FBBB ; [*04EC.0020.0002] -FBBC ; [*04ED.0020.0002] -FBBD ; [*04EE.0020.0002] -FBBE ; [*04EF.0020.0002] -FBBF ; [*04F0.0020.0002] -FBC0 ; [*04F1.0020.0002] -FBC1 ; [*04F2.0020.0002] -FD3E ; [*037A.0020.0002] -FD3F ; [*037B.0020.0002] -FDFD ; [*04E2.0020.0002] -FE10 ; [*0221.0020.0016] -FE11 ; [*0230.0020.0016] -FE12 ; [*0287.0020.0016] -FE13 ; [*0238.0020.0016] -FE14 ; [*0233.0020.0016] -FE15 ; [*025F.0020.0016] -FE16 ; [*0264.0020.0016] -FE17 ; [*0374.0020.0016] -FE18 ; [*0375.0020.0016] -FE19 ; [*0274.0020.0016][*0274.0020.0016][*0274.0020.0016] -FE21 ; [.0000.0000.0000] -FE23 ; [.0000.0000.0000] -FE24 ; [.0000.0000.0000] -FE25 ; [.0000.0000.0000] -FE26 ; [.0000.0000.0000] -FE28 ; [.0000.0000.0000] -FE2A ; [.0000.0000.0000] -FE2B ; [.0000.0000.0000] -FE2C ; [.0000.0000.0000] -FE2D ; [.0000.0000.0000] -FE2F ; [.0000.0000.0000] -FE30 ; [*0274.0020.0016][*0274.0020.0016] -FE31 ; [*0216.0020.0016] -FE32 ; [*0215.0020.0016] -FE33 ; [*020B.0020.0016] -FE34 ; [*020B.0020.0016] -FE35 ; [*0310.0020.0016] -FE36 ; [*0311.0020.0016] -FE37 ; [*0314.0020.0016] -FE38 ; [*0315.0020.0016] -FE39 ; [*0372.0020.0016] -FE3A ; [*0373.0020.0016] -FE3B ; [*0370.0020.0016] -FE3C ; [*0371.0020.0016] -FE3D ; [*036A.0020.0016] -FE3E ; [*036B.0020.0016] -FE3F ; [*0368.0020.0016] -FE40 ; [*0369.0020.0016] -FE41 ; [*036C.0020.0016] -FE42 ; [*036D.0020.0016] -FE43 ; [*036E.0020.0016] -FE44 ; [*036F.0020.0016] -FE45 ; [*0231.0020.0002] -FE46 ; [*0232.0020.0002] -FE47 ; [*0312.0020.0016] -FE48 ; [*0313.0020.0016] -FE49 ; [*020A.0020.0004] -FE4A ; [*020A.0020.0004] -FE4B ; [*020A.0020.0004] -FE4C ; [*020A.0020.0004] -FE4D ; [*020B.0020.0004] -FE4E ; [*020B.0020.0004] -FE4F ; [*020B.0020.0004] -FE50 ; [*0221.0020.000F] -FE51 ; [*0230.0020.000F] -FE52 ; [*0274.0020.000F] -FE54 ; [*0233.0020.000F] -FE55 ; [*0238.0020.000F] -FE56 ; [*0264.0020.000F] -FE57 ; [*025F.0020.000F] -FE58 ; [*0216.0020.000F] -FE59 ; [*0310.0020.000F] -FE5A ; [*0311.0020.000F] -FE5B ; [*0314.0020.000F] -FE5C ; [*0315.0020.000F] -FE5D ; [*0372.0020.000F] -FE5E ; [*0373.0020.000F] -FE5F ; [*0391.0020.000F] -FE60 ; [*038F.0020.000F] -FE61 ; [*0388.0020.000F] -FE62 ; [*05F6.0020.000F] -FE63 ; [*020D.0020.000F] -FE64 ; [*05FA.0020.000F] -FE65 ; [*05FC.0020.000F] -FE66 ; [*05FB.0020.000F] -FE68 ; [*038E.0020.000F] -FE6A ; [*0392.0020.000F] -FE6B ; [*0387.0020.000F] -FE73 ; [.0000.0000.0000] -FF01 ; [*025F.0020.0003] -FF02 ; [*0305.0020.0003] -FF03 ; [*0391.0020.0003] -FF05 ; [*0392.0020.0003] -FF06 ; [*038F.0020.0003] -FF07 ; [*02FE.0020.0003] -FF08 ; [*0310.0020.0003] -FF09 ; [*0311.0020.0003] -FF0A ; [*0388.0020.0003] -FF0B ; [*05F6.0020.0003] -FF0C ; [*0221.0020.0003] -FF0D ; [*020D.0020.0003] -FF0E ; [*0274.0020.0003] -FF0F ; [*038D.0020.0003] -FF1A ; [*0238.0020.0003] -FF1B ; [*0233.0020.0003] -FF1C ; [*05FA.0020.0003] -FF1D ; [*05FB.0020.0003] -FF1E ; [*05FC.0020.0003] -FF1F ; [*0264.0020.0003] -FF20 ; [*0387.0020.0003] -FF3B ; [*0312.0020.0003] -FF3C ; [*038E.0020.0003] -FF3D ; [*0313.0020.0003] -FF3E ; [*0466.0020.0003] -FF3F ; [*020B.0020.0003] -FF40 ; [*0463.0020.0003] -FF5B ; [*0314.0020.0003] -FF5C ; [*05FE.0020.0003] -FF5D ; [*0315.0020.0003] -FF5E ; [*0600.0020.0003] -FF5F ; [*0326.0020.0003] -FF60 ; [*0327.0020.0003] -FF61 ; [*0287.0020.0012] -FF62 ; [*036C.0020.0012] -FF63 ; [*036D.0020.0012] -FF64 ; [*0230.0020.0012] -FF65 ; [*0220.0020.0012] -FFE2 ; [*05FD.0020.0003] -FFE3 ; [*0467.0020.0003] -FFE4 ; [*05FF.0020.0003] -FFE8 ; [*07F6.0020.0012] -FFE9 ; [*057C.0020.0012] -FFEA ; [*057E.0020.0012] -FFEB ; [*057D.0020.0012] -FFEC ; [*057F.0020.0012] -FFED ; [*0894.0020.0012] -FFEE ; [*08BF.0020.0012] -FFFC ; [*1A25.0020.0002] -10100 ; [*02F3.0020.0002] -10101 ; [*02F4.0020.0002] -10102 ; [*02F5.0020.0002] -10110 ; [*1A6F.0020.0002] -10111 ; [*1A70.0020.0002] -10112 ; [*1A71.0020.0002] -10113 ; [*1A72.0020.0002] -10114 ; [*1A73.0020.0002] -10115 ; [*1A74.0020.0002] -10116 ; [*1A75.0020.0002] -10117 ; [*1A76.0020.0002] -10118 ; [*1A77.0020.0002] -10119 ; [*1A78.0020.0002] -1011A ; [*1A79.0020.0002] -1011B ; [*1A7A.0020.0002] -1011C ; [*1A7B.0020.0002] -1011D ; [*1A7C.0020.0002] -1011E ; [*1A7D.0020.0002] -1011F ; [*1A7E.0020.0002] -10120 ; [*1A7F.0020.0002] -10121 ; [*1A80.0020.0002] -10122 ; [*1A81.0020.0002] -10123 ; [*1A82.0020.0002] -10124 ; [*1A83.0020.0002] -10125 ; [*1A84.0020.0002] -10126 ; [*1A85.0020.0002] -10127 ; [*1A86.0020.0002] -10128 ; [*1A87.0020.0002] -10129 ; [*1A88.0020.0002] -1012A ; [*1A89.0020.0002] -1012B ; [*1A8A.0020.0002] -1012C ; [*1A8B.0020.0002] -1012D ; [*1A8C.0020.0002] -1012E ; [*1A8D.0020.0002] -1012F ; [*1A8E.0020.0002] -10130 ; [*1A8F.0020.0002] -10131 ; [*1A90.0020.0002] -10132 ; [*1A91.0020.0002] -10133 ; [*1A92.0020.0002] -10137 ; [*0F54.0020.0002] -10138 ; [*0F55.0020.0002] -10139 ; [*0F56.0020.0002] -1013A ; [*0F57.0020.0002] -1013B ; [*0F58.0020.0002] -1013C ; [*0F59.0020.0002] -1013D ; [*0F5A.0020.0002] -1013E ; [*0F5B.0020.0002] -1013F ; [*0F5C.0020.0002] -10140 ; [*1A93.0020.0002] -10141 ; [*1A94.0020.0002] -10144 ; [*1A95.0020.0002] -10145 ; [*1A96.0020.0002] -10146 ; [*1A97.0020.0002] -10147 ; [*1A98.0020.0002] -10149 ; [*1A99.0020.0002] -1014A ; [*1A9A.0020.0002] -1014B ; [*1A9B.0020.0002] -1014C ; [*1A9C.0020.0002] -1014D ; [*1A9D.0020.0002] -1014E ; [*1A9E.0020.0002] -10150 ; [*1A9F.0020.0002] -10151 ; [*1AA0.0020.0002] -10152 ; [*1AA1.0020.0002] -10153 ; [*1AA2.0020.0002] -10154 ; [*1AA3.0020.0002] -10155 ; [*1AA4.0020.0002] -10156 ; [*1AA5.0020.0002] -10157 ; [*1AA6.0020.0002] -10160 ; [*1AA7.0020.0002] -10161 ; [*1AA8.0020.0002] -10162 ; [*1AA9.0020.0002] -10163 ; [*1AAA.0020.0002] -10164 ; [*1AAB.0020.0002] -10165 ; [*1AAC.0020.0002] -10166 ; [*1AAD.0020.0002] -10167 ; [*1AAE.0020.0002] -10168 ; [*1AAF.0020.0002] -10169 ; [*1AB0.0020.0002] -1016A ; [*1AB1.0020.0002] -1016B ; [*1AB2.0020.0002] -1016C ; [*1AB3.0020.0002] -1016D ; [*1AB4.0020.0002] -1016E ; [*1AB5.0020.0002] -1016F ; [*1AB6.0020.0002] -10170 ; [*1AB7.0020.0002] -10171 ; [*1AB8.0020.0002] -10172 ; [*1AB9.0020.0002] -10174 ; [*1ABA.0020.0002] -10175 ; [*1ABB.0020.0002] -10176 ; [*1ABC.0020.0002] -10177 ; [*1ABD.0020.0002] -10178 ; [*1ABE.0020.0002] -10179 ; [*0F5D.0020.0002] -1017A ; [*0F5E.0020.0002] -1017B ; [*0F5F.0020.0002] -1017C ; [*0F60.0020.0002] -1017D ; [*0F61.0020.0002] -1017E ; [*0F62.0020.0002] -1017F ; [*0F63.0020.0002] -10180 ; [*0F64.0020.0002] -10181 ; [*0F65.0020.0002] -10182 ; [*0F66.0020.0002] -10183 ; [*0F67.0020.0002] -10184 ; [*0F68.0020.0002] -10185 ; [*0F69.0020.0002] -10186 ; [*0F6A.0020.0002] -10187 ; [*0F6B.0020.0002] -10188 ; [*0F6C.0020.0002] -10189 ; [*0F6D.0020.0002] -1018B ; [*1ABF.0020.0002] -1018C ; [*0F6E.0020.0002] -10190 ; [*0F6F.0020.0002] -10191 ; [*0F70.0020.0002] -10192 ; [*0F71.0020.0002] -10193 ; [*0F72.0020.0002] -10194 ; [*0F73.0020.0002] -10195 ; [*0F74.0020.0002] -10196 ; [*0F75.0020.0002] -10197 ; [*0F76.0020.0002] -10198 ; [*0F77.0020.0002] -10199 ; [*0F78.0020.0002] -1019A ; [*0F79.0020.0002] -1019B ; [*0F7A.0020.0002] -101A0 ; [*0F7B.0020.0002] -101D0 ; [*0F7C.0020.0002] -101D1 ; [*0F7D.0020.0002] -101D2 ; [*0F7E.0020.0002] -101D3 ; [*0F7F.0020.0002] -101D4 ; [*0F80.0020.0002] -101D5 ; [*0F81.0020.0002] -101D6 ; [*0F82.0020.0002] -101D7 ; [*0F83.0020.0002] -101D8 ; [*0F84.0020.0002] -101D9 ; [*0F85.0020.0002] -101DA ; [*0F86.0020.0002] -101DB ; [*0F87.0020.0002] -101DC ; [*0F88.0020.0002] -101DD ; [*0F89.0020.0002] -101DE ; [*0F8A.0020.0002] -101DF ; [*0F8B.0020.0002] -101E0 ; [*0F8C.0020.0002] -101E1 ; [*0F8D.0020.0002] -101E2 ; [*0F8E.0020.0002] -101E3 ; [*0F8F.0020.0002] -101E4 ; [*0F90.0020.0002] -101E5 ; [*0F91.0020.0002] -101E6 ; [*0F92.0020.0002] -101E7 ; [*0F93.0020.0002] -101E8 ; [*0F94.0020.0002] -101E9 ; [*0F95.0020.0002] -101EA ; [*0F96.0020.0002] -101EB ; [*0F97.0020.0002] -101EC ; [*0F98.0020.0002] -101ED ; [*0F99.0020.0002] -101EE ; [*0F9A.0020.0002] -101EF ; [*0F9B.0020.0002] -101F0 ; [*0F9C.0020.0002] -101F1 ; [*0F9D.0020.0002] -101F2 ; [*0F9E.0020.0002] -101F3 ; [*0F9F.0020.0002] -101F4 ; [*0FA0.0020.0002] -101F5 ; [*0FA1.0020.0002] -101F6 ; [*0FA2.0020.0002] -101F7 ; [*0FA3.0020.0002] -101F8 ; [*0FA4.0020.0002] -101F9 ; [*0FA5.0020.0002] -101FA ; [*0FA6.0020.0002] -101FB ; [*0FA7.0020.0002] -101FC ; [*0FA8.0020.0002] -102E0 ; [.0000.0000.0000] -102EA ; [*1AC0.0020.0002] -102EB ; [*1AC1.0020.0002] -102EC ; [*1AC2.0020.0002] -102ED ; [*1AC3.0020.0002] -102EE ; [*1AC4.0020.0002] -102EF ; [*1AC5.0020.0002] -102F0 ; [*1AC6.0020.0002] -102F1 ; [*1AC7.0020.0002] -102F2 ; [*1AC8.0020.0002] -102F3 ; [*1AC9.0020.0002] -102F4 ; [*1ACA.0020.0002] -102F5 ; [*1ACB.0020.0002] -102F6 ; [*1ACC.0020.0002] -102F7 ; [*1ACD.0020.0002] -102F8 ; [*1ACE.0020.0002] -102F9 ; [*1ACF.0020.0002] -102FA ; [*1AD0.0020.0002] -102FB ; [*1AD1.0020.0002] -10322 ; [*1A69.0020.0002] -10323 ; [*1A6A.0020.0002] -1039F ; [*02F6.0020.0002] -103D0 ; [*02F7.0020.0002] -103D3 ; [*1AD2.0020.0002] -103D4 ; [*1AD3.0020.0002] -103D5 ; [*1AD4.0020.0002] -1056F ; [*041B.0020.0002] -10857 ; [*02D2.0020.0002] -1085B ; [*1AE4.0020.0002] -1085C ; [*1AE5.0020.0002] -1085D ; [*1AE6.0020.0002] -1085E ; [*1AE7.0020.0002] -1085F ; [*1AE8.0020.0002] -10877 ; [*0FA9.0020.0002] -10878 ; [*0FAA.0020.0002] -1087E ; [*1AD5.0020.0002] -1087F ; [*1AD6.0020.0002] -108AD ; [*1AD7.0020.0002] -108AE ; [*1AD8.0020.0002] -108AF ; [*1AD9.0020.0002] -108FD ; [*1ADA.0020.0002] -108FE ; [*1ADB.0020.0002] -108FF ; [*1ADC.0020.0002] -10917 ; [*1AE1.0020.0002] -10918 ; [*1AE2.0020.0002] -10919 ; [*1AE3.0020.0002] -1091F ; [*02F8.0020.0002] -1093F ; [*02F2.0020.0002] -109BC ; [*1B59.0020.0002] -109BD ; [*1B4E.0020.0002] -109C9 ; [*1B23.0020.0002] -109CA ; [*1B24.0020.0002] -109CB ; [*1B25.0020.0002] -109CC ; [*1B26.0020.0002] -109CD ; [*1B27.0020.0002] -109CE ; [*1B28.0020.0002] -109CF ; [*1B29.0020.0002] -109D2 ; [*1B2A.0020.0002] -109D3 ; [*1B2B.0020.0002] -109D4 ; [*1B2C.0020.0002] -109D5 ; [*1B2D.0020.0002] -109D6 ; [*1B2E.0020.0002] -109D7 ; [*1B2F.0020.0002] -109D8 ; [*1B30.0020.0002] -109D9 ; [*1B31.0020.0002] -109DA ; [*1B32.0020.0002] -109DB ; [*1B33.0020.0002] -109DC ; [*1B34.0020.0002] -109DD ; [*1B35.0020.0002] -109DE ; [*1B36.0020.0002] -109DF ; [*1B37.0020.0002] -109E0 ; [*1B38.0020.0002] -109E1 ; [*1B39.0020.0002] -109E2 ; [*1B3A.0020.0002] -109E3 ; [*1B3B.0020.0002] -109E4 ; [*1B3C.0020.0002] -109E5 ; [*1B3D.0020.0002] -109E6 ; [*1B3E.0020.0002] -109E7 ; [*1B3F.0020.0002] -109E8 ; [*1B40.0020.0002] -109E9 ; [*1B41.0020.0002] -109EA ; [*1B42.0020.0002] -109EB ; [*1B43.0020.0002] -109EC ; [*1B44.0020.0002] -109ED ; [*1B45.0020.0002] -109EE ; [*1B46.0020.0002] -109EF ; [*1B47.0020.0002] -109F0 ; [*1B48.0020.0002] -109F1 ; [*1B49.0020.0002] -109F2 ; [*1B4A.0020.0002] -109F3 ; [*1B4B.0020.0002] -109F4 ; [*1B4C.0020.0002] -109F5 ; [*1B4D.0020.0002] -109F6 ; [*1B4F.0020.0002] -109F7 ; [*1B50.0020.0002] -109F8 ; [*1B51.0020.0002] -109F9 ; [*1B52.0020.0002] -109FA ; [*1B53.0020.0002] -109FB ; [*1B54.0020.0002] -109FC ; [*1B55.0020.0002] -109FD ; [*1B56.0020.0002] -109FE ; [*1B57.0020.0002] -109FF ; [*1B58.0020.0002] -10A44 ; [*1B04.0020.0002] -10A45 ; [*1B05.0020.0002] -10A46 ; [*1B06.0020.0002] -10A47 ; [*1B07.0020.0002] -10A50 ; [*0421.0020.0002] -10A51 ; [*0422.0020.0002] -10A52 ; [*0423.0020.0002] -10A53 ; [*0424.0020.0002] -10A54 ; [*0425.0020.0002] -10A55 ; [*0426.0020.0002] -10A56 ; [*02A7.0020.0002] -10A57 ; [*02A8.0020.0002] -10A58 ; [*0427.0020.0002] -10A7E ; [*1ADD.0020.0002] -10A7F ; [*1ADE.0020.0002] -10A9E ; [*1ADF.0020.0002] -10A9F ; [*1AE0.0020.0002] -10AED ; [*1AE9.0020.0002] -10AEE ; [*1AEA.0020.0002] -10AEF ; [*1AEB.0020.0002] -10AF0 ; [*0429.0020.0002] -10AF1 ; [*042A.0020.0002] -10AF2 ; [*042B.0020.0002] -10AF3 ; [*042C.0020.0002] -10AF4 ; [*042D.0020.0002] -10AF5 ; [*042E.0020.0002] -10AF6 ; [*042F.0020.0002] -10B39 ; [*0428.0020.0002] -10B3A ; [*02D3.0020.0002] -10B3B ; [*02D4.0020.0002] -10B3C ; [*02D5.0020.0002] -10B3D ; [*02D6.0020.0002] -10B3E ; [*02D7.0020.0002] -10B3F ; [*02D8.0020.0002] -10B5C ; [*1AEC.0020.0002] -10B5D ; [*1AED.0020.0002] -10B5E ; [*1AEE.0020.0002] -10B5F ; [*1AEF.0020.0002] -10B7C ; [*1AF0.0020.0002] -10B7D ; [*1AF1.0020.0002] -10B7E ; [*1AF2.0020.0002] -10B7F ; [*1AF3.0020.0002] -10B99 ; [*0430.0020.0002] -10B9A ; [*0431.0020.0002] -10B9B ; [*0432.0020.0002] -10B9C ; [*0433.0020.0002] -10BAD ; [*1AF4.0020.0002] -10BAE ; [*1AF5.0020.0002] -10BAF ; [*1AF6.0020.0002] -10CFC ; [*1A6B.0020.0002] -10CFD ; [*1A6C.0020.0002] -10CFE ; [*1A6D.0020.0002] -10CFF ; [*1A6E.0020.0002] -10E69 ; [*1A52.0020.0002] -10E6A ; [*1A53.0020.0002] -10E6B ; [*1A54.0020.0002] -10E6C ; [*1A55.0020.0002] -10E6D ; [*1A56.0020.0002] -10E6E ; [*1A57.0020.0002] -10E6F ; [*1A58.0020.0002] -10E70 ; [*1A59.0020.0002] -10E71 ; [*1A5A.0020.0002] -10E72 ; [*1A5B.0020.0002] -10E73 ; [*1A5C.0020.0002] -10E74 ; [*1A5D.0020.0002] -10E75 ; [*1A5E.0020.0002] -10E76 ; [*1A5F.0020.0002] -10E77 ; [*1A60.0020.0002] -10E78 ; [*1A61.0020.0002] -10E79 ; [*1A62.0020.0002] -10E7A ; [*1A63.0020.0002] -10E7B ; [*1A64.0020.0002] -10E7C ; [*1A65.0020.0002] -10E7D ; [*1A66.0020.0002] -10E7E ; [*1A67.0020.0002] -11047 ; [*02A9.0020.0002] -11048 ; [*02AA.0020.0002] -11049 ; [*041C.0020.0002] -1104A ; [*041D.0020.0002] -1104B ; [*041E.0020.0002] -1104C ; [*041F.0020.0002] -1104D ; [*0420.0020.0002] -1105B ; [*1AF9.0020.0002] -1105C ; [*1AFA.0020.0002] -1105D ; [*1AFB.0020.0002] -1105E ; [*1AFC.0020.0002] -1105F ; [*1AFD.0020.0002] -11060 ; [*1AFE.0020.0002] -11061 ; [*1AFF.0020.0002] -11062 ; [*1B00.0020.0002] -11063 ; [*1B01.0020.0002] -11064 ; [*1B02.0020.0002] -11065 ; [*1B03.0020.0002] -110BB ; [*0434.0020.0002] -110BC ; [*0435.0020.0002] -110BD ; [.0000.0000.0000] -110BE ; [*02D9.0020.0002] -110BF ; [*02DA.0020.0002] -110C0 ; [*02AB.0020.0002] -110C1 ; [*02AC.0020.0002] -11140 ; [*02DB.0020.0002] -11141 ; [*02AD.0020.0002] -11142 ; [*02AE.0020.0002] -11143 ; [*0271.0020.0002] -11174 ; [*0436.0020.0002] -11175 ; [*0437.0020.0002] -111C5 ; [*02AF.0020.0002] -111C6 ; [*02B0.0020.0002] -111C7 ; [*0439.0020.0002] -111C8 ; [*02DC.0020.0002] -111C9 ; [*043A.0020.0002] -111CD ; [*0438.0020.0002] -111DB ; [*043B.0020.0002] -111DD ; [*043C.0020.0002] -111DE ; [*02DD.0020.0002] -111DF ; [*02DE.0020.0002] -111EA ; [*1B08.0020.0002] -111EB ; [*1B09.0020.0002] -111EC ; [*1B0A.0020.0002] -111ED ; [*1B0B.0020.0002] -111EE ; [*1B0C.0020.0002] -111EF ; [*1B0D.0020.0002] -111F0 ; [*1B0E.0020.0002] -111F1 ; [*1B0F.0020.0002] -111F2 ; [*1B10.0020.0002] -111F3 ; [*1B11.0020.0002] -111F4 ; [*1B12.0020.0002] -11238 ; [*02B1.0020.0002] -11239 ; [*02B2.0020.0002] -1123A ; [*043D.0020.0002] -1123B ; [*043E.0020.0002] -1123C ; [*043F.0020.0002] -1123D ; [*0440.0020.0002] -112A9 ; [*02DF.0020.0002] -11366 ; [.0000.0000.0000] -11367 ; [.0000.0000.0000] -11368 ; [.0000.0000.0000] -11369 ; [.0000.0000.0000] -1136A ; [.0000.0000.0000] -1136B ; [.0000.0000.0000] -1136C ; [.0000.0000.0000] -11370 ; [.0000.0000.0000] -11371 ; [.0000.0000.0000] -11372 ; [.0000.0000.0000] -11373 ; [.0000.0000.0000] -11374 ; [.0000.0000.0000] -114C6 ; [*0441.0020.0002] -115C1 ; [*0442.0020.0002] -115C2 ; [*02B3.0020.0002] -115C3 ; [*02B4.0020.0002] -115C4 ; [*0443.0020.0002] -115C5 ; [*0444.0020.0002] -115C6 ; [*0445.0020.0002] -115C7 ; [*0446.0020.0002] -115C8 ; [*0447.0020.0002] -115C9 ; [*0448.0020.0002] -115CA ; [*0449.0020.0002] -115CB ; [*044A.0020.0002] -115CC ; [*044B.0020.0002] -115CD ; [*044C.0020.0002] -115CE ; [*044D.0020.0002] -115CF ; [*044E.0020.0002] -115D0 ; [*044F.0020.0002] -115D1 ; [*0450.0020.0002] -115D2 ; [*0451.0020.0002] -115D3 ; [*0452.0020.0002] -115D4 ; [*0453.0020.0002] -115D5 ; [*0454.0020.0002] -115D6 ; [*0455.0020.0002] -115D7 ; [*0456.0020.0002] -11641 ; [*02B5.0020.0002] -11642 ; [*02B6.0020.0002] -11643 ; [*0457.0020.0002] -1173A ; [*1AF7.0020.0002] -1173B ; [*1AF8.0020.0002] -1173C ; [*02B7.0020.0002] -1173D ; [*02B8.0020.0002] -1173E ; [*02E0.0020.0002] -1173F ; [*0530.0020.0002] -118EA ; [*1B13.0020.0002] -118EB ; [*1B14.0020.0002] -118EC ; [*1B15.0020.0002] -118ED ; [*1B16.0020.0002] -118EE ; [*1B17.0020.0002] -118EF ; [*1B18.0020.0002] -118F0 ; [*1B19.0020.0002] -118F1 ; [*1B1A.0020.0002] -118F2 ; [*1B1B.0020.0002] -12432 ; [*1B5A.0020.0002] -12433 ; [*1B5B.0020.0002] -1245A ; [*1B5C.0020.0002] -1245B ; [*1B5D.0020.0002] -1245C ; [*1B5E.0020.0002] -1245D ; [*1B5F.0020.0002] -1245E ; [*1B60.0020.0002] -1245F ; [*1B61.0020.0002] -12460 ; [*1B62.0020.0002] -12461 ; [*1B63.0020.0002] -12462 ; [*1B64.0020.0002] -12463 ; [*1B65.0020.0002] -12464 ; [*1B66.0020.0002] -12465 ; [*1B67.0020.0002] -12466 ; [*1B68.0020.0002] -12467 ; [*1B69.0020.0002] -12468 ; [*1B6A.0020.0002] -12470 ; [*02F9.0020.0002] -12471 ; [*02FA.0020.0002] -12472 ; [*02FB.0020.0002] -12473 ; [*02FC.0020.0002] -12474 ; [*02FD.0020.0002] -16A6E ; [*02B9.0020.0002] -16A6F ; [*02BA.0020.0002] -16AF5 ; [*0285.0020.0002] -16B37 ; [*0458.0020.0002] -16B38 ; [*0459.0020.0002] -16B39 ; [*045A.0020.0002] -16B3A ; [*045B.0020.0002] -16B3B ; [*045C.0020.0002] -16B3C ; [*0FAB.0020.0002] -16B3D ; [*0FAC.0020.0002] -16B3E ; [*0FAD.0020.0002] -16B3F ; [*0FAE.0020.0002] -16B44 ; [*045D.0020.0002] -16B45 ; [*0FAF.0020.0002] -16B5B ; [*1B1C.0020.0002] -16B5C ; [*1B1D.0020.0002] -16B5D ; [*1B1E.0020.0002] -16B5E ; [*1B1F.0020.0002] -16B5F ; [*1B20.0020.0002] -16B60 ; [*1B21.0020.0002] -16B61 ; [*1B22.0020.0002] -1BC9C ; [*11A0.0020.0002] -1BC9F ; [*0286.0020.0002] -1D000 ; [*0FB0.0020.0002] -1D001 ; [*0FB1.0020.0002] -1D002 ; [*0FB2.0020.0002] -1D003 ; [*0FB3.0020.0002] -1D004 ; [*0FB4.0020.0002] -1D005 ; [*0FB5.0020.0002] -1D006 ; [*0FB6.0020.0002] -1D007 ; [*0FB7.0020.0002] -1D008 ; [*0FB8.0020.0002] -1D009 ; [*0FB9.0020.0002] -1D00A ; [*0FBA.0020.0002] -1D00B ; [*0FBB.0020.0002] -1D00C ; [*0FBC.0020.0002] -1D00D ; [*0FBD.0020.0002] -1D00E ; [*0FBE.0020.0002] -1D00F ; [*0FBF.0020.0002] -1D010 ; [*0FC0.0020.0002] -1D011 ; [*0FC1.0020.0002] -1D012 ; [*0FC2.0020.0002] -1D013 ; [*0FC3.0020.0002] -1D014 ; [*0FC4.0020.0002] -1D015 ; [*0FC5.0020.0002] -1D016 ; [*0FC6.0020.0002] -1D017 ; [*0FC7.0020.0002] -1D018 ; [*0FC8.0020.0002] -1D019 ; [*0FC9.0020.0002] -1D01A ; [*0FCA.0020.0002] -1D01B ; [*0FCB.0020.0002] -1D01C ; [*0FCC.0020.0002] -1D01D ; [*0FCD.0020.0002] -1D01E ; [*0FCE.0020.0002] -1D01F ; [*0FCF.0020.0002] -1D020 ; [*0FD0.0020.0002] -1D021 ; [*0FD1.0020.0002] -1D022 ; [*0FD2.0020.0002] -1D023 ; [*0FD3.0020.0002] -1D024 ; [*0FD4.0020.0002] -1D025 ; [*0FD5.0020.0002] -1D026 ; [*0FD6.0020.0002] -1D027 ; [*0FD7.0020.0002] -1D028 ; [*0FD8.0020.0002] -1D029 ; [*0FD9.0020.0002] -1D02A ; [*0FDA.0020.0002] -1D02B ; [*0FDB.0020.0002] -1D02C ; [*0FDC.0020.0002] -1D02D ; [*0FDD.0020.0002] -1D02E ; [*0FDE.0020.0002] -1D02F ; [*0FDF.0020.0002] -1D030 ; [*0FE0.0020.0002] -1D031 ; [*0FE1.0020.0002] -1D032 ; [*0FE2.0020.0002] -1D033 ; [*0FE3.0020.0002] -1D034 ; [*0FE4.0020.0002] -1D035 ; [*0FE5.0020.0002] -1D036 ; [*0FE6.0020.0002] -1D037 ; [*0FE7.0020.0002] -1D038 ; [*0FE8.0020.0002] -1D039 ; [*0FE9.0020.0002] -1D03A ; [*0FEA.0020.0002] -1D03B ; [*0FEB.0020.0002] -1D03C ; [*0FEC.0020.0002] -1D03D ; [*0FED.0020.0002] -1D03E ; [*0FEE.0020.0002] -1D03F ; [*0FEF.0020.0002] -1D040 ; [*0FF0.0020.0002] -1D041 ; [*0FF1.0020.0002] -1D042 ; [*0FF2.0020.0002] -1D043 ; [*0FF3.0020.0002] -1D044 ; [*0FF4.0020.0002] -1D045 ; [*0FF5.0020.0002] -1D046 ; [*0FF6.0020.0002] -1D047 ; [*0FF7.0020.0002] -1D048 ; [*0FF8.0020.0002] -1D049 ; [*0FF9.0020.0002] -1D04A ; [*0FFA.0020.0002] -1D04B ; [*0FFB.0020.0002] -1D04C ; [*0FFC.0020.0002] -1D04D ; [*0FFD.0020.0002] -1D04E ; [*0FFE.0020.0002] -1D04F ; [*0FFF.0020.0002] -1D050 ; [*1000.0020.0002] -1D051 ; [*1001.0020.0002] -1D052 ; [*1002.0020.0002] -1D053 ; [*1003.0020.0002] -1D054 ; [*1004.0020.0002] -1D055 ; [*1005.0020.0002] -1D056 ; [*1006.0020.0002] -1D057 ; [*1007.0020.0002] -1D058 ; [*1008.0020.0002] -1D059 ; [*1009.0020.0002] -1D05A ; [*100A.0020.0002] -1D05B ; [*100B.0020.0002] -1D05C ; [*100C.0020.0002] -1D05D ; [*100D.0020.0002] -1D05E ; [*100E.0020.0002] -1D05F ; [*100F.0020.0002] -1D060 ; [*1010.0020.0002] -1D061 ; [*1011.0020.0002] -1D062 ; [*1012.0020.0002] -1D063 ; [*1013.0020.0002] -1D064 ; [*1014.0020.0002] -1D065 ; [*1015.0020.0002] -1D066 ; [*1016.0020.0002] -1D067 ; [*1017.0020.0002] -1D068 ; [*1018.0020.0002] -1D069 ; [*1019.0020.0002] -1D06A ; [*101A.0020.0002] -1D06B ; [*101B.0020.0002] -1D06C ; [*101C.0020.0002] -1D06D ; [*101D.0020.0002] -1D06E ; [*101E.0020.0002] -1D06F ; [*101F.0020.0002] -1D070 ; [*1020.0020.0002] -1D071 ; [*1021.0020.0002] -1D072 ; [*1022.0020.0002] -1D073 ; [*1023.0020.0002] -1D074 ; [*1024.0020.0002] -1D075 ; [*1025.0020.0002] -1D076 ; [*1026.0020.0002] -1D077 ; [*1027.0020.0002] -1D078 ; [*1028.0020.0002] -1D079 ; [*1029.0020.0002] -1D07A ; [*102A.0020.0002] -1D07B ; [*102B.0020.0002] -1D07C ; [*102C.0020.0002] -1D07D ; [*102D.0020.0002] -1D07E ; [*102E.0020.0002] -1D07F ; [*102F.0020.0002] -1D080 ; [*1030.0020.0002] -1D081 ; [*1031.0020.0002] -1D082 ; [*1032.0020.0002] -1D083 ; [*1033.0020.0002] -1D084 ; [*1034.0020.0002] -1D085 ; [*1035.0020.0002] -1D086 ; [*1036.0020.0002] -1D087 ; [*1037.0020.0002] -1D088 ; [*1038.0020.0002] -1D089 ; [*1039.0020.0002] -1D08A ; [*103A.0020.0002] -1D08B ; [*103B.0020.0002] -1D08C ; [*103C.0020.0002] -1D08D ; [*103D.0020.0002] -1D08E ; [*103E.0020.0002] -1D08F ; [*103F.0020.0002] -1D090 ; [*1040.0020.0002] -1D091 ; [*1041.0020.0002] -1D092 ; [*1042.0020.0002] -1D093 ; [*1043.0020.0002] -1D094 ; [*1044.0020.0002] -1D095 ; [*1045.0020.0002] -1D096 ; [*1046.0020.0002] -1D097 ; [*1047.0020.0002] -1D098 ; [*1048.0020.0002] -1D099 ; [*1049.0020.0002] -1D09A ; [*104A.0020.0002] -1D09B ; [*104B.0020.0002] -1D09C ; [*104C.0020.0002] -1D09D ; [*104D.0020.0002] -1D09E ; [*104E.0020.0002] -1D09F ; [*104F.0020.0002] -1D0A0 ; [*1050.0020.0002] -1D0A1 ; [*1051.0020.0002] -1D0A2 ; [*1052.0020.0002] -1D0A3 ; [*1053.0020.0002] -1D0A4 ; [*1054.0020.0002] -1D0A5 ; [*1055.0020.0002] -1D0A6 ; [*1056.0020.0002] -1D0A7 ; [*1057.0020.0002] -1D0A8 ; [*1058.0020.0002] -1D0A9 ; [*1059.0020.0002] -1D0AA ; [*105A.0020.0002] -1D0AB ; [*105B.0020.0002] -1D0AC ; [*105C.0020.0002] -1D0AD ; [*105D.0020.0002] -1D0AE ; [*105E.0020.0002] -1D0AF ; [*105F.0020.0002] -1D0B0 ; [*1060.0020.0002] -1D0B1 ; [*1061.0020.0002] -1D0B2 ; [*1062.0020.0002] -1D0B3 ; [*1063.0020.0002] -1D0B4 ; [*1064.0020.0002] -1D0B5 ; [*1065.0020.0002] -1D0B6 ; [*1066.0020.0002] -1D0B7 ; [*1067.0020.0002] -1D0B8 ; [*1068.0020.0002] -1D0B9 ; [*1069.0020.0002] -1D0BA ; [*106A.0020.0002] -1D0BB ; [*106B.0020.0002] -1D0BC ; [*106C.0020.0002] -1D0BD ; [*106D.0020.0002] -1D0BE ; [*106E.0020.0002] -1D0BF ; [*106F.0020.0002] -1D0C0 ; [*1070.0020.0002] -1D0C1 ; [*1071.0020.0002] -1D0C2 ; [*1072.0020.0002] -1D0C3 ; [*1073.0020.0002] -1D0C4 ; [*1074.0020.0002] -1D0C5 ; [*1075.0020.0002] -1D0C6 ; [*1076.0020.0002] -1D0C7 ; [*1077.0020.0002] -1D0C8 ; [*1078.0020.0002] -1D0C9 ; [*1079.0020.0002] -1D0CA ; [*107A.0020.0002] -1D0CB ; [*107B.0020.0002] -1D0CC ; [*107C.0020.0002] -1D0CD ; [*107D.0020.0002] -1D0CE ; [*107E.0020.0002] -1D0CF ; [*107F.0020.0002] -1D0D0 ; [*1080.0020.0002] -1D0D1 ; [*1081.0020.0002] -1D0D2 ; [*1082.0020.0002] -1D0D3 ; [*1083.0020.0002] -1D0D4 ; [*1084.0020.0002] -1D0D5 ; [*1085.0020.0002] -1D0D6 ; [*1086.0020.0002] -1D0D7 ; [*1087.0020.0002] -1D0D8 ; [*1088.0020.0002] -1D0D9 ; [*1089.0020.0002] -1D0DA ; [*108A.0020.0002] -1D0DB ; [*108B.0020.0002] -1D0DC ; [*108C.0020.0002] -1D0DD ; [*108D.0020.0002] -1D0DE ; [*108E.0020.0002] -1D0DF ; [*108F.0020.0002] -1D0E0 ; [*1090.0020.0002] -1D0E1 ; [*1091.0020.0002] -1D0E2 ; [*1092.0020.0002] -1D0E3 ; [*1093.0020.0002] -1D0E4 ; [*1094.0020.0002] -1D0E5 ; [*1095.0020.0002] -1D0E6 ; [*1096.0020.0002] -1D0E7 ; [*1097.0020.0002] -1D0E8 ; [*1098.0020.0002] -1D0E9 ; [*1099.0020.0002] -1D0EA ; [*109A.0020.0002] -1D0EB ; [*109B.0020.0002] -1D0EC ; [*109C.0020.0002] -1D0ED ; [*109D.0020.0002] -1D0EE ; [*109E.0020.0002] -1D0EF ; [*109F.0020.0002] -1D0F0 ; [*10A0.0020.0002] -1D0F1 ; [*10A1.0020.0002] -1D0F2 ; [*10A2.0020.0002] -1D0F3 ; [*10A3.0020.0002] -1D0F4 ; [*10A4.0020.0002] -1D0F5 ; [*10A5.0020.0002] -1D100 ; [*10A6.0020.0002] -1D101 ; [*10A7.0020.0002] -1D102 ; [*10A8.0020.0002] -1D103 ; [*10A9.0020.0002] -1D104 ; [*10AA.0020.0002] -1D105 ; [*10AB.0020.0002] -1D106 ; [*10AC.0020.0002] -1D107 ; [*10AD.0020.0002] -1D108 ; [*10AE.0020.0002] -1D109 ; [*10AF.0020.0002] -1D10A ; [*10B0.0020.0002] -1D10B ; [*10B1.0020.0002] -1D10C ; [*10B2.0020.0002] -1D10D ; [*10B3.0020.0002] -1D10E ; [*10B4.0020.0002] -1D10F ; [*10B5.0020.0002] -1D110 ; [*10B6.0020.0002] -1D111 ; [*10B7.0020.0002] -1D112 ; [*10B8.0020.0002] -1D113 ; [*10B9.0020.0002] -1D114 ; [*10BA.0020.0002] -1D115 ; [*10BB.0020.0002] -1D116 ; [*10BC.0020.0002] -1D117 ; [*10BD.0020.0002] -1D118 ; [*10BE.0020.0002] -1D119 ; [*10BF.0020.0002] -1D11A ; [*10C0.0020.0002] -1D11B ; [*10C1.0020.0002] -1D11C ; [*10C2.0020.0002] -1D11D ; [*10C3.0020.0002] -1D11E ; [*10C4.0020.0002] -1D11F ; [*10C5.0020.0002] -1D120 ; [*10C6.0020.0002] -1D121 ; [*10C7.0020.0002] -1D122 ; [*10C8.0020.0002] -1D123 ; [*10C9.0020.0002] -1D124 ; [*10CA.0020.0002] -1D125 ; [*10CB.0020.0002] -1D126 ; [*10CC.0020.0002] -1D129 ; [*10E0.0020.0002] -1D12A ; [*10D0.0020.0002] -1D12B ; [*10D1.0020.0002] -1D12C ; [*10D2.0020.0002] -1D12D ; [*10D3.0020.0002] -1D12E ; [*10D4.0020.0002] -1D12F ; [*10D5.0020.0002] -1D130 ; [*10D6.0020.0002] -1D131 ; [*10D7.0020.0002] -1D132 ; [*10D8.0020.0002] -1D133 ; [*10D9.0020.0002] -1D134 ; [*10DA.0020.0002] -1D135 ; [*10DB.0020.0002] -1D136 ; [*10DC.0020.0002] -1D137 ; [*10DD.0020.0002] -1D138 ; [*10DE.0020.0002] -1D139 ; [*10DF.0020.0002] -1D13A ; [*10E1.0020.0002] -1D13B ; [*10E2.0020.0002] -1D13C ; [*10E3.0020.0002] -1D13D ; [*10E4.0020.0002] -1D13E ; [*10E5.0020.0002] -1D13F ; [*10E6.0020.0002] -1D140 ; [*10E7.0020.0002] -1D141 ; [*10E8.0020.0002] -1D142 ; [*10E9.0020.0002] -1D143 ; [*10EA.0020.0002] -1D144 ; [*10EB.0020.0002] -1D145 ; [*10EC.0020.0002] -1D146 ; [*10ED.0020.0002] -1D147 ; [*10EE.0020.0002] -1D148 ; [*10EF.0020.0002] -1D149 ; [*10F0.0020.0002] -1D14A ; [*10F1.0020.0002] -1D14B ; [*10F2.0020.0002] -1D14C ; [*10F3.0020.0002] -1D14D ; [*10F4.0020.0002] -1D14E ; [*10F5.0020.0002] -1D14F ; [*10F6.0020.0002] -1D150 ; [*10F7.0020.0002] -1D151 ; [*10F8.0020.0002] -1D152 ; [*10F9.0020.0002] -1D153 ; [*10FA.0020.0002] -1D154 ; [*10FB.0020.0002] -1D155 ; [*10FC.0020.0002] -1D156 ; [*10FD.0020.0002] -1D157 ; [*10FE.0020.0002] -1D158 ; [*10FF.0020.0002] -1D159 ; [*1100.0020.0002] -1D15A ; [*1101.0020.0002] -1D15B ; [*1102.0020.0002] -1D15C ; [*1103.0020.0002] -1D15D ; [*1104.0020.0002] -1D15E ; [*10FE.0020.0002][.0000.0000.0000] -1D15F ; [*10FF.0020.0002][.0000.0000.0000] -1D160 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D161 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D162 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D163 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D164 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D165 ; [.0000.0000.0000] -1D166 ; [.0000.0000.0000] -1D167 ; [.0000.0000.0000] -1D168 ; [.0000.0000.0000] -1D169 ; [.0000.0000.0000] -1D16A ; [*1105.0020.0002] -1D16B ; [*1106.0020.0002] -1D16C ; [*1107.0020.0002] -1D16D ; [.0000.0000.0000] -1D16E ; [.0000.0000.0000] -1D16F ; [.0000.0000.0000] -1D170 ; [.0000.0000.0000] -1D171 ; [.0000.0000.0000] -1D172 ; [.0000.0000.0000] -1D17B ; [.0000.0000.0000] -1D17C ; [.0000.0000.0000] -1D17D ; [.0000.0000.0000] -1D17E ; [.0000.0000.0000] -1D17F ; [.0000.0000.0000] -1D180 ; [.0000.0000.0000] -1D181 ; [.0000.0000.0000] -1D182 ; [.0000.0000.0000] -1D183 ; [*1108.0020.0002] -1D184 ; [*1109.0020.0002] -1D185 ; [.0000.0000.0000] -1D186 ; [.0000.0000.0000] -1D187 ; [.0000.0000.0000] -1D188 ; [.0000.0000.0000] -1D189 ; [.0000.0000.0000] -1D18A ; [.0000.0000.0000] -1D18B ; [.0000.0000.0000] -1D18C ; [*110A.0020.0002] -1D18D ; [*110B.0020.0002] -1D18E ; [*110C.0020.0002] -1D18F ; [*110D.0020.0002] -1D190 ; [*110E.0020.0002] -1D191 ; [*110F.0020.0002] -1D192 ; [*1110.0020.0002] -1D193 ; [*1111.0020.0002] -1D194 ; [*1112.0020.0002] -1D195 ; [*1113.0020.0002] -1D196 ; [*1114.0020.0002] -1D197 ; [*1115.0020.0002] -1D198 ; [*1116.0020.0002] -1D199 ; [*1117.0020.0002] -1D19A ; [*1118.0020.0002] -1D19B ; [*1119.0020.0002] -1D19C ; [*111A.0020.0002] -1D19D ; [*111B.0020.0002] -1D19E ; [*111C.0020.0002] -1D19F ; [*111D.0020.0002] -1D1A0 ; [*111E.0020.0002] -1D1A1 ; [*111F.0020.0002] -1D1A2 ; [*1120.0020.0002] -1D1A3 ; [*1121.0020.0002] -1D1A4 ; [*1122.0020.0002] -1D1A5 ; [*1123.0020.0002] -1D1A6 ; [*1124.0020.0002] -1D1A7 ; [*1125.0020.0002] -1D1A8 ; [*1126.0020.0002] -1D1A9 ; [*1127.0020.0002] -1D1AA ; [.0000.0000.0000] -1D1AB ; [.0000.0000.0000] -1D1AC ; [.0000.0000.0000] -1D1AD ; [.0000.0000.0000] -1D1AE ; [*1128.0020.0002] -1D1AF ; [*1129.0020.0002] -1D1B0 ; [*112A.0020.0002] -1D1B1 ; [*112B.0020.0002] -1D1B2 ; [*112C.0020.0002] -1D1B3 ; [*112D.0020.0002] -1D1B4 ; [*112E.0020.0002] -1D1B5 ; [*112F.0020.0002] -1D1B6 ; [*1130.0020.0002] -1D1B7 ; [*1131.0020.0002] -1D1B8 ; [*1132.0020.0002] -1D1B9 ; [*1133.0020.0002] -1D1BA ; [*1134.0020.0002] -1D1BB ; [*1133.0020.0002][.0000.0000.0000] -1D1BC ; [*1134.0020.0002][.0000.0000.0000] -1D1BD ; [*1133.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D1BE ; [*1134.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D1BF ; [*1133.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D1C0 ; [*1134.0020.0002][.0000.0000.0000][.0000.0000.0000] -1D1C1 ; [*1135.0020.0002] -1D1C2 ; [*1136.0020.0002] -1D1C3 ; [*1137.0020.0002] -1D1C4 ; [*1138.0020.0002] -1D1C5 ; [*1139.0020.0002] -1D1C6 ; [*113A.0020.0002] -1D1C7 ; [*113B.0020.0002] -1D1C8 ; [*113C.0020.0002] -1D1C9 ; [*113D.0020.0002] -1D1CA ; [*113E.0020.0002] -1D1CB ; [*113F.0020.0002] -1D1CC ; [*1140.0020.0002] -1D1CD ; [*1141.0020.0002] -1D1CE ; [*1142.0020.0002] -1D1CF ; [*1143.0020.0002] -1D1D0 ; [*1144.0020.0002] -1D1D1 ; [*1145.0020.0002] -1D1D2 ; [*1146.0020.0002] -1D1D3 ; [*1147.0020.0002] -1D1D4 ; [*1148.0020.0002] -1D1D5 ; [*1149.0020.0002] -1D1D6 ; [*114A.0020.0002] -1D1D7 ; [*114B.0020.0002] -1D1D8 ; [*114C.0020.0002] -1D1D9 ; [*114D.0020.0002] -1D1DA ; [*114E.0020.0002] -1D1DB ; [*114F.0020.0002] -1D1DC ; [*1150.0020.0002] -1D1DD ; [*1151.0020.0002] -1D1DE ; [*1152.0020.0002] -1D1DF ; [*1153.0020.0002] -1D1E0 ; [*1154.0020.0002] -1D1E1 ; [*1155.0020.0002] -1D1E2 ; [*1156.0020.0002] -1D1E3 ; [*1157.0020.0002] -1D1E4 ; [*1158.0020.0002] -1D1E5 ; [*1159.0020.0002] -1D1E6 ; [*115A.0020.0002] -1D1E7 ; [*115B.0020.0002] -1D1E8 ; [*115C.0020.0002] -1D200 ; [*115D.0020.0002] -1D201 ; [*115E.0020.0002] -1D202 ; [*115F.0020.0002] -1D203 ; [*1160.0020.0002] -1D204 ; [*1161.0020.0002] -1D205 ; [*1162.0020.0002] -1D206 ; [*1163.0020.0002] -1D207 ; [*1164.0020.0002] -1D208 ; [*1165.0020.0002] -1D209 ; [*1166.0020.0002] -1D20A ; [*1167.0020.0002] -1D20B ; [*1168.0020.0002] -1D20C ; [*1169.0020.0002] -1D20D ; [*116A.0020.0002] -1D20E ; [*116B.0020.0002] -1D20F ; [*116C.0020.0002] -1D210 ; [*116D.0020.0002] -1D211 ; [*116E.0020.0002] -1D212 ; [*116F.0020.0002] -1D213 ; [*1170.0020.0002] -1D214 ; [*1171.0020.0002] -1D215 ; [*1172.0020.0002] -1D216 ; [*1173.0020.0002] -1D217 ; [*1174.0020.0002] -1D218 ; [*1175.0020.0002] -1D219 ; [*1176.0020.0002] -1D21A ; [*1177.0020.0002] -1D21B ; [*1178.0020.0002] -1D21C ; [*1179.0020.0002] -1D21D ; [*117A.0020.0002] -1D21E ; [*117B.0020.0002] -1D21F ; [*117C.0020.0002] -1D220 ; [*117D.0020.0002] -1D221 ; [*117E.0020.0002] -1D222 ; [*117F.0020.0002] -1D223 ; [*1180.0020.0002] -1D224 ; [*1181.0020.0002] -1D225 ; [*1182.0020.0002] -1D226 ; [*1183.0020.0002] -1D227 ; [*1184.0020.0002] -1D228 ; [*1185.0020.0002] -1D229 ; [*1186.0020.0002] -1D22A ; [*1187.0020.0002] -1D22B ; [*1188.0020.0002] -1D22C ; [*1189.0020.0002] -1D22D ; [*118A.0020.0002] -1D22E ; [*118B.0020.0002] -1D22F ; [*118C.0020.0002] -1D230 ; [*118D.0020.0002] -1D231 ; [*118E.0020.0002] -1D232 ; [*118F.0020.0002] -1D233 ; [*1190.0020.0002] -1D234 ; [*1191.0020.0002] -1D235 ; [*1192.0020.0002] -1D236 ; [*1193.0020.0002] -1D237 ; [*1194.0020.0002] -1D238 ; [*1195.0020.0002] -1D239 ; [*1196.0020.0002] -1D23A ; [*1197.0020.0002] -1D23B ; [*1198.0020.0002] -1D23C ; [*1199.0020.0002] -1D23D ; [*119A.0020.0002] -1D23E ; [*119B.0020.0002] -1D23F ; [*119C.0020.0002] -1D240 ; [*119D.0020.0002] -1D241 ; [*119E.0020.0002] -1D242 ; [.0000.0000.0000] -1D243 ; [.0000.0000.0000] -1D244 ; [.0000.0000.0000] -1D245 ; [*119F.0020.0002] -1D300 ; [*0EC6.0020.0002] -1D301 ; [*0EC7.0020.0002] -1D302 ; [*0EC8.0020.0002] -1D303 ; [*0EC9.0020.0002] -1D304 ; [*0ECA.0020.0002] -1D305 ; [*0ECB.0020.0002] -1D306 ; [*0ECC.0020.0002] -1D307 ; [*0ECD.0020.0002] -1D308 ; [*0ECE.0020.0002] -1D309 ; [*0ECF.0020.0002] -1D30A ; [*0ED0.0020.0002] -1D30B ; [*0ED1.0020.0002] -1D30C ; [*0ED2.0020.0002] -1D30D ; [*0ED3.0020.0002] -1D30E ; [*0ED4.0020.0002] -1D30F ; [*0ED5.0020.0002] -1D310 ; [*0ED6.0020.0002] -1D311 ; [*0ED7.0020.0002] -1D312 ; [*0ED8.0020.0002] -1D313 ; [*0ED9.0020.0002] -1D314 ; [*0EDA.0020.0002] -1D315 ; [*0EDB.0020.0002] -1D316 ; [*0EDC.0020.0002] -1D317 ; [*0EDD.0020.0002] -1D318 ; [*0EDE.0020.0002] -1D319 ; [*0EDF.0020.0002] -1D31A ; [*0EE0.0020.0002] -1D31B ; [*0EE1.0020.0002] -1D31C ; [*0EE2.0020.0002] -1D31D ; [*0EE3.0020.0002] -1D31E ; [*0EE4.0020.0002] -1D31F ; [*0EE5.0020.0002] -1D320 ; [*0EE6.0020.0002] -1D321 ; [*0EE7.0020.0002] -1D322 ; [*0EE8.0020.0002] -1D323 ; [*0EE9.0020.0002] -1D324 ; [*0EEA.0020.0002] -1D325 ; [*0EEB.0020.0002] -1D326 ; [*0EEC.0020.0002] -1D327 ; [*0EED.0020.0002] -1D328 ; [*0EEE.0020.0002] -1D329 ; [*0EEF.0020.0002] -1D32A ; [*0EF0.0020.0002] -1D32B ; [*0EF1.0020.0002] -1D32C ; [*0EF2.0020.0002] -1D32D ; [*0EF3.0020.0002] -1D32E ; [*0EF4.0020.0002] -1D32F ; [*0EF5.0020.0002] -1D330 ; [*0EF6.0020.0002] -1D331 ; [*0EF7.0020.0002] -1D332 ; [*0EF8.0020.0002] -1D333 ; [*0EF9.0020.0002] -1D334 ; [*0EFA.0020.0002] -1D335 ; [*0EFB.0020.0002] -1D336 ; [*0EFC.0020.0002] -1D337 ; [*0EFD.0020.0002] -1D338 ; [*0EFE.0020.0002] -1D339 ; [*0EFF.0020.0002] -1D33A ; [*0F00.0020.0002] -1D33B ; [*0F01.0020.0002] -1D33C ; [*0F02.0020.0002] -1D33D ; [*0F03.0020.0002] -1D33E ; [*0F04.0020.0002] -1D33F ; [*0F05.0020.0002] -1D340 ; [*0F06.0020.0002] -1D341 ; [*0F07.0020.0002] -1D342 ; [*0F08.0020.0002] -1D343 ; [*0F09.0020.0002] -1D344 ; [*0F0A.0020.0002] -1D345 ; [*0F0B.0020.0002] -1D346 ; [*0F0C.0020.0002] -1D347 ; [*0F0D.0020.0002] -1D348 ; [*0F0E.0020.0002] -1D349 ; [*0F0F.0020.0002] -1D34A ; [*0F10.0020.0002] -1D34B ; [*0F11.0020.0002] -1D34C ; [*0F12.0020.0002] -1D34D ; [*0F13.0020.0002] -1D34E ; [*0F14.0020.0002] -1D34F ; [*0F15.0020.0002] -1D350 ; [*0F16.0020.0002] -1D351 ; [*0F17.0020.0002] -1D352 ; [*0F18.0020.0002] -1D353 ; [*0F19.0020.0002] -1D354 ; [*0F1A.0020.0002] -1D355 ; [*0F1B.0020.0002] -1D356 ; [*0F1C.0020.0002] -1D369 ; [*1B6B.0020.0002] -1D36A ; [*1B6C.0020.0002] -1D36B ; [*1B6D.0020.0002] -1D36C ; [*1B6E.0020.0002] -1D36D ; [*1B6F.0020.0002] -1D36E ; [*1B70.0020.0002] -1D36F ; [*1B71.0020.0002] -1D370 ; [*1B72.0020.0002] -1D371 ; [*1B73.0020.0002] -1D6C1 ; [*05EC.0020.0005] -1D6DB ; [*05E8.0020.0005] -1D6FB ; [*05EC.0020.0005] -1D715 ; [*05E8.0020.0005] -1D735 ; [*05EC.0020.0005] -1D74F ; [*05E8.0020.0005] -1D76F ; [*05EC.0020.0005] -1D789 ; [*05E8.0020.0005] -1D7A9 ; [*05EC.0020.0005] -1D7C3 ; [*05E8.0020.0005] -1D800 ; [*17CF.0020.0002] -1D801 ; [*17D0.0020.0002] -1D802 ; [*17D1.0020.0002] -1D803 ; [*17D2.0020.0002] -1D804 ; [*17D3.0020.0002] -1D805 ; [*17D4.0020.0002] -1D806 ; [*17D5.0020.0002] -1D807 ; [*17D6.0020.0002] -1D808 ; [*17D7.0020.0002] -1D809 ; [*17D8.0020.0002] -1D80A ; [*17D9.0020.0002] -1D80B ; [*17DA.0020.0002] -1D80C ; [*17DB.0020.0002] -1D80D ; [*17DC.0020.0002] -1D80E ; [*17DD.0020.0002] -1D80F ; [*17DE.0020.0002] -1D810 ; [*17DF.0020.0002] -1D811 ; [*17E0.0020.0002] -1D812 ; [*17E1.0020.0002] -1D813 ; [*17E2.0020.0002] -1D814 ; [*17E3.0020.0002] -1D815 ; [*17E4.0020.0002] -1D816 ; [*17E5.0020.0002] -1D817 ; [*17E6.0020.0002] -1D818 ; [*17E7.0020.0002] -1D819 ; [*17E8.0020.0002] -1D81A ; [*17E9.0020.0002] -1D81B ; [*17EA.0020.0002] -1D81C ; [*17EB.0020.0002] -1D81D ; [*17EC.0020.0002] -1D81E ; [*17ED.0020.0002] -1D81F ; [*17EE.0020.0002] -1D820 ; [*17EF.0020.0002] -1D821 ; [*17F0.0020.0002] -1D822 ; [*17F1.0020.0002] -1D823 ; [*17F2.0020.0002] -1D824 ; [*17F3.0020.0002] -1D825 ; [*17F4.0020.0002] -1D826 ; [*17F5.0020.0002] -1D827 ; [*17F6.0020.0002] -1D828 ; [*17F7.0020.0002] -1D829 ; [*17F8.0020.0002] -1D82A ; [*17F9.0020.0002] -1D82B ; [*17FA.0020.0002] -1D82C ; [*17FB.0020.0002] -1D82D ; [*17FC.0020.0002] -1D82E ; [*17FD.0020.0002] -1D82F ; [*17FE.0020.0002] -1D830 ; [*17FF.0020.0002] -1D831 ; [*1800.0020.0002] -1D832 ; [*1801.0020.0002] -1D833 ; [*1802.0020.0002] -1D834 ; [*1803.0020.0002] -1D835 ; [*1804.0020.0002] -1D836 ; [*1805.0020.0002] -1D837 ; [*1806.0020.0002] -1D838 ; [*1807.0020.0002] -1D839 ; [*1808.0020.0002] -1D83A ; [*1809.0020.0002] -1D83B ; [*180A.0020.0002] -1D83C ; [*180B.0020.0002] -1D83D ; [*180C.0020.0002] -1D83E ; [*180D.0020.0002] -1D83F ; [*180E.0020.0002] -1D840 ; [*180F.0020.0002] -1D841 ; [*1810.0020.0002] -1D842 ; [*1811.0020.0002] -1D843 ; [*1812.0020.0002] -1D844 ; [*1813.0020.0002] -1D845 ; [*1814.0020.0002] -1D846 ; [*1815.0020.0002] -1D847 ; [*1816.0020.0002] -1D848 ; [*1817.0020.0002] -1D849 ; [*1818.0020.0002] -1D84A ; [*1819.0020.0002] -1D84B ; [*181A.0020.0002] -1D84C ; [*181B.0020.0002] -1D84D ; [*181C.0020.0002] -1D84E ; [*181D.0020.0002] -1D84F ; [*181E.0020.0002] -1D850 ; [*181F.0020.0002] -1D851 ; [*1820.0020.0002] -1D852 ; [*1821.0020.0002] -1D853 ; [*1822.0020.0002] -1D854 ; [*1823.0020.0002] -1D855 ; [*1824.0020.0002] -1D856 ; [*1825.0020.0002] -1D857 ; [*1826.0020.0002] -1D858 ; [*1827.0020.0002] -1D859 ; [*1828.0020.0002] -1D85A ; [*1829.0020.0002] -1D85B ; [*182A.0020.0002] -1D85C ; [*182B.0020.0002] -1D85D ; [*182C.0020.0002] -1D85E ; [*182D.0020.0002] -1D85F ; [*182E.0020.0002] -1D860 ; [*182F.0020.0002] -1D861 ; [*1830.0020.0002] -1D862 ; [*1831.0020.0002] -1D863 ; [*1832.0020.0002] -1D864 ; [*1833.0020.0002] -1D865 ; [*1834.0020.0002] -1D866 ; [*1835.0020.0002] -1D867 ; [*1836.0020.0002] -1D868 ; [*1837.0020.0002] -1D869 ; [*1838.0020.0002] -1D86A ; [*1839.0020.0002] -1D86B ; [*183A.0020.0002] -1D86C ; [*183B.0020.0002] -1D86D ; [*183C.0020.0002] -1D86E ; [*183D.0020.0002] -1D86F ; [*183E.0020.0002] -1D870 ; [*183F.0020.0002] -1D871 ; [*1840.0020.0002] -1D872 ; [*1841.0020.0002] -1D873 ; [*1842.0020.0002] -1D874 ; [*1843.0020.0002] -1D875 ; [*1844.0020.0002] -1D876 ; [*1845.0020.0002] -1D877 ; [*1846.0020.0002] -1D878 ; [*1847.0020.0002] -1D879 ; [*1848.0020.0002] -1D87A ; [*1849.0020.0002] -1D87B ; [*184A.0020.0002] -1D87C ; [*184B.0020.0002] -1D87D ; [*184C.0020.0002] -1D87E ; [*184D.0020.0002] -1D87F ; [*184E.0020.0002] -1D880 ; [*184F.0020.0002] -1D881 ; [*1850.0020.0002] -1D882 ; [*1851.0020.0002] -1D883 ; [*1852.0020.0002] -1D884 ; [*1853.0020.0002] -1D885 ; [*1854.0020.0002] -1D886 ; [*1855.0020.0002] -1D887 ; [*1856.0020.0002] -1D888 ; [*1857.0020.0002] -1D889 ; [*1858.0020.0002] -1D88A ; [*1859.0020.0002] -1D88B ; [*185A.0020.0002] -1D88C ; [*185B.0020.0002] -1D88D ; [*185C.0020.0002] -1D88E ; [*185D.0020.0002] -1D88F ; [*185E.0020.0002] -1D890 ; [*185F.0020.0002] -1D891 ; [*1860.0020.0002] -1D892 ; [*1861.0020.0002] -1D893 ; [*1862.0020.0002] -1D894 ; [*1863.0020.0002] -1D895 ; [*1864.0020.0002] -1D896 ; [*1865.0020.0002] -1D897 ; [*1866.0020.0002] -1D898 ; [*1867.0020.0002] -1D899 ; [*1868.0020.0002] -1D89A ; [*1869.0020.0002] -1D89B ; [*186A.0020.0002] -1D89C ; [*186B.0020.0002] -1D89D ; [*186C.0020.0002] -1D89E ; [*186D.0020.0002] -1D89F ; [*186E.0020.0002] -1D8A0 ; [*186F.0020.0002] -1D8A1 ; [*1870.0020.0002] -1D8A2 ; [*1871.0020.0002] -1D8A3 ; [*1872.0020.0002] -1D8A4 ; [*1873.0020.0002] -1D8A5 ; [*1874.0020.0002] -1D8A6 ; [*1875.0020.0002] -1D8A7 ; [*1876.0020.0002] -1D8A8 ; [*1877.0020.0002] -1D8A9 ; [*1878.0020.0002] -1D8AA ; [*1879.0020.0002] -1D8AB ; [*187A.0020.0002] -1D8AC ; [*187B.0020.0002] -1D8AD ; [*187C.0020.0002] -1D8AE ; [*187D.0020.0002] -1D8AF ; [*187E.0020.0002] -1D8B0 ; [*187F.0020.0002] -1D8B1 ; [*1880.0020.0002] -1D8B2 ; [*1881.0020.0002] -1D8B3 ; [*1882.0020.0002] -1D8B4 ; [*1883.0020.0002] -1D8B5 ; [*1884.0020.0002] -1D8B6 ; [*1885.0020.0002] -1D8B7 ; [*1886.0020.0002] -1D8B8 ; [*1887.0020.0002] -1D8B9 ; [*1888.0020.0002] -1D8BA ; [*1889.0020.0002] -1D8BB ; [*188A.0020.0002] -1D8BC ; [*188B.0020.0002] -1D8BD ; [*188C.0020.0002] -1D8BE ; [*188D.0020.0002] -1D8BF ; [*188E.0020.0002] -1D8C0 ; [*188F.0020.0002] -1D8C1 ; [*1890.0020.0002] -1D8C2 ; [*1891.0020.0002] -1D8C3 ; [*1892.0020.0002] -1D8C4 ; [*1893.0020.0002] -1D8C5 ; [*1894.0020.0002] -1D8C6 ; [*1895.0020.0002] -1D8C7 ; [*1896.0020.0002] -1D8C8 ; [*1897.0020.0002] -1D8C9 ; [*1898.0020.0002] -1D8CA ; [*1899.0020.0002] -1D8CB ; [*189A.0020.0002] -1D8CC ; [*189B.0020.0002] -1D8CD ; [*189C.0020.0002] -1D8CE ; [*189D.0020.0002] -1D8CF ; [*189E.0020.0002] -1D8D0 ; [*189F.0020.0002] -1D8D1 ; [*18A0.0020.0002] -1D8D2 ; [*18A1.0020.0002] -1D8D3 ; [*18A2.0020.0002] -1D8D4 ; [*18A3.0020.0002] -1D8D5 ; [*18A4.0020.0002] -1D8D6 ; [*18A5.0020.0002] -1D8D7 ; [*18A6.0020.0002] -1D8D8 ; [*18A7.0020.0002] -1D8D9 ; [*18A8.0020.0002] -1D8DA ; [*18A9.0020.0002] -1D8DB ; [*18AA.0020.0002] -1D8DC ; [*18AB.0020.0002] -1D8DD ; [*18AC.0020.0002] -1D8DE ; [*18AD.0020.0002] -1D8DF ; [*18AE.0020.0002] -1D8E0 ; [*18AF.0020.0002] -1D8E1 ; [*18B0.0020.0002] -1D8E2 ; [*18B1.0020.0002] -1D8E3 ; [*18B2.0020.0002] -1D8E4 ; [*18B3.0020.0002] -1D8E5 ; [*18B4.0020.0002] -1D8E6 ; [*18B5.0020.0002] -1D8E7 ; [*18B6.0020.0002] -1D8E8 ; [*18B7.0020.0002] -1D8E9 ; [*18B8.0020.0002] -1D8EA ; [*18B9.0020.0002] -1D8EB ; [*18BA.0020.0002] -1D8EC ; [*18BB.0020.0002] -1D8ED ; [*18BC.0020.0002] -1D8EE ; [*18BD.0020.0002] -1D8EF ; [*18BE.0020.0002] -1D8F0 ; [*18BF.0020.0002] -1D8F1 ; [*18C0.0020.0002] -1D8F2 ; [*18C1.0020.0002] -1D8F3 ; [*18C2.0020.0002] -1D8F4 ; [*18C3.0020.0002] -1D8F5 ; [*18C4.0020.0002] -1D8F6 ; [*18C5.0020.0002] -1D8F7 ; [*18C6.0020.0002] -1D8F8 ; [*18C7.0020.0002] -1D8F9 ; [*18C8.0020.0002] -1D8FA ; [*18C9.0020.0002] -1D8FB ; [*18CA.0020.0002] -1D8FC ; [*18CB.0020.0002] -1D8FD ; [*18CC.0020.0002] -1D8FE ; [*18CD.0020.0002] -1D8FF ; [*18CE.0020.0002] -1D900 ; [*18CF.0020.0002] -1D901 ; [*18D0.0020.0002] -1D902 ; [*18D1.0020.0002] -1D903 ; [*18D2.0020.0002] -1D904 ; [*18D3.0020.0002] -1D905 ; [*18D4.0020.0002] -1D906 ; [*18D5.0020.0002] -1D907 ; [*18D6.0020.0002] -1D908 ; [*18D7.0020.0002] -1D909 ; [*18D8.0020.0002] -1D90A ; [*18D9.0020.0002] -1D90B ; [*18DA.0020.0002] -1D90C ; [*18DB.0020.0002] -1D90D ; [*18DC.0020.0002] -1D90E ; [*18DD.0020.0002] -1D90F ; [*18DE.0020.0002] -1D910 ; [*18DF.0020.0002] -1D911 ; [*18E0.0020.0002] -1D912 ; [*18E1.0020.0002] -1D913 ; [*18E2.0020.0002] -1D914 ; [*18E3.0020.0002] -1D915 ; [*18E4.0020.0002] -1D916 ; [*18E5.0020.0002] -1D917 ; [*18E6.0020.0002] -1D918 ; [*18E7.0020.0002] -1D919 ; [*18E8.0020.0002] -1D91A ; [*18E9.0020.0002] -1D91B ; [*18EA.0020.0002] -1D91C ; [*18EB.0020.0002] -1D91D ; [*18EC.0020.0002] -1D91E ; [*18ED.0020.0002] -1D91F ; [*18EE.0020.0002] -1D920 ; [*18EF.0020.0002] -1D921 ; [*18F0.0020.0002] -1D922 ; [*18F1.0020.0002] -1D923 ; [*18F2.0020.0002] -1D924 ; [*18F3.0020.0002] -1D925 ; [*18F4.0020.0002] -1D926 ; [*18F5.0020.0002] -1D927 ; [*18F6.0020.0002] -1D928 ; [*18F7.0020.0002] -1D929 ; [*18F8.0020.0002] -1D92A ; [*18F9.0020.0002] -1D92B ; [*18FA.0020.0002] -1D92C ; [*18FB.0020.0002] -1D92D ; [*18FC.0020.0002] -1D92E ; [*18FD.0020.0002] -1D92F ; [*18FE.0020.0002] -1D930 ; [*18FF.0020.0002] -1D931 ; [*1900.0020.0002] -1D932 ; [*1901.0020.0002] -1D933 ; [*1902.0020.0002] -1D934 ; [*1903.0020.0002] -1D935 ; [*1904.0020.0002] -1D936 ; [*1905.0020.0002] -1D937 ; [*1906.0020.0002] -1D938 ; [*1907.0020.0002] -1D939 ; [*1908.0020.0002] -1D93A ; [*1909.0020.0002] -1D93B ; [*190A.0020.0002] -1D93C ; [*190B.0020.0002] -1D93D ; [*190C.0020.0002] -1D93E ; [*190D.0020.0002] -1D93F ; [*190E.0020.0002] -1D940 ; [*190F.0020.0002] -1D941 ; [*1910.0020.0002] -1D942 ; [*1911.0020.0002] -1D943 ; [*1912.0020.0002] -1D944 ; [*1913.0020.0002] -1D945 ; [*1914.0020.0002] -1D946 ; [*1915.0020.0002] -1D947 ; [*1916.0020.0002] -1D948 ; [*1917.0020.0002] -1D949 ; [*1918.0020.0002] -1D94A ; [*1919.0020.0002] -1D94B ; [*191A.0020.0002] -1D94C ; [*191B.0020.0002] -1D94D ; [*191C.0020.0002] -1D94E ; [*191D.0020.0002] -1D94F ; [*191E.0020.0002] -1D950 ; [*191F.0020.0002] -1D951 ; [*1920.0020.0002] -1D952 ; [*1921.0020.0002] -1D953 ; [*1922.0020.0002] -1D954 ; [*1923.0020.0002] -1D955 ; [*1924.0020.0002] -1D956 ; [*1925.0020.0002] -1D957 ; [*1926.0020.0002] -1D958 ; [*1927.0020.0002] -1D959 ; [*1928.0020.0002] -1D95A ; [*1929.0020.0002] -1D95B ; [*192A.0020.0002] -1D95C ; [*192B.0020.0002] -1D95D ; [*192C.0020.0002] -1D95E ; [*192D.0020.0002] -1D95F ; [*192E.0020.0002] -1D960 ; [*192F.0020.0002] -1D961 ; [*1930.0020.0002] -1D962 ; [*1931.0020.0002] -1D963 ; [*1932.0020.0002] -1D964 ; [*1933.0020.0002] -1D965 ; [*1934.0020.0002] -1D966 ; [*1935.0020.0002] -1D967 ; [*1936.0020.0002] -1D968 ; [*1937.0020.0002] -1D969 ; [*1938.0020.0002] -1D96A ; [*1939.0020.0002] -1D96B ; [*193A.0020.0002] -1D96C ; [*193B.0020.0002] -1D96D ; [*193C.0020.0002] -1D96E ; [*193D.0020.0002] -1D96F ; [*193E.0020.0002] -1D970 ; [*193F.0020.0002] -1D971 ; [*1940.0020.0002] -1D972 ; [*1941.0020.0002] -1D973 ; [*1942.0020.0002] -1D974 ; [*1943.0020.0002] -1D975 ; [*1944.0020.0002] -1D976 ; [*1945.0020.0002] -1D977 ; [*1946.0020.0002] -1D978 ; [*1947.0020.0002] -1D979 ; [*1948.0020.0002] -1D97A ; [*1949.0020.0002] -1D97B ; [*194A.0020.0002] -1D97C ; [*194B.0020.0002] -1D97D ; [*194C.0020.0002] -1D97E ; [*194D.0020.0002] -1D97F ; [*194E.0020.0002] -1D980 ; [*194F.0020.0002] -1D981 ; [*1950.0020.0002] -1D982 ; [*1951.0020.0002] -1D983 ; [*1952.0020.0002] -1D984 ; [*1953.0020.0002] -1D985 ; [*1954.0020.0002] -1D986 ; [*1955.0020.0002] -1D987 ; [*1956.0020.0002] -1D988 ; [*1957.0020.0002] -1D989 ; [*1958.0020.0002] -1D98A ; [*1959.0020.0002] -1D98B ; [*195A.0020.0002] -1D98C ; [*195B.0020.0002] -1D98D ; [*195C.0020.0002] -1D98E ; [*195D.0020.0002] -1D98F ; [*195E.0020.0002] -1D990 ; [*195F.0020.0002] -1D991 ; [*1960.0020.0002] -1D992 ; [*1961.0020.0002] -1D993 ; [*1962.0020.0002] -1D994 ; [*1963.0020.0002] -1D995 ; [*1964.0020.0002] -1D996 ; [*1965.0020.0002] -1D997 ; [*1966.0020.0002] -1D998 ; [*1967.0020.0002] -1D999 ; [*1968.0020.0002] -1D99A ; [*1969.0020.0002] -1D99B ; [*196A.0020.0002] -1D99C ; [*196B.0020.0002] -1D99D ; [*196C.0020.0002] -1D99E ; [*196D.0020.0002] -1D99F ; [*196E.0020.0002] -1D9A0 ; [*196F.0020.0002] -1D9A1 ; [*1970.0020.0002] -1D9A2 ; [*1971.0020.0002] -1D9A3 ; [*1972.0020.0002] -1D9A4 ; [*1973.0020.0002] -1D9A5 ; [*1974.0020.0002] -1D9A6 ; [*1975.0020.0002] -1D9A7 ; [*1976.0020.0002] -1D9A8 ; [*1977.0020.0002] -1D9A9 ; [*1978.0020.0002] -1D9AA ; [*1979.0020.0002] -1D9AB ; [*197A.0020.0002] -1D9AC ; [*197B.0020.0002] -1D9AD ; [*197C.0020.0002] -1D9AE ; [*197D.0020.0002] -1D9AF ; [*197E.0020.0002] -1D9B0 ; [*197F.0020.0002] -1D9B1 ; [*1980.0020.0002] -1D9B2 ; [*1981.0020.0002] -1D9B3 ; [*1982.0020.0002] -1D9B4 ; [*1983.0020.0002] -1D9B5 ; [*1984.0020.0002] -1D9B6 ; [*1985.0020.0002] -1D9B7 ; [*1986.0020.0002] -1D9B8 ; [*1987.0020.0002] -1D9B9 ; [*1988.0020.0002] -1D9BA ; [*1989.0020.0002] -1D9BB ; [*198A.0020.0002] -1D9BC ; [*198B.0020.0002] -1D9BD ; [*198C.0020.0002] -1D9BE ; [*198D.0020.0002] -1D9BF ; [*198E.0020.0002] -1D9C0 ; [*198F.0020.0002] -1D9C1 ; [*1990.0020.0002] -1D9C2 ; [*1991.0020.0002] -1D9C3 ; [*1992.0020.0002] -1D9C4 ; [*1993.0020.0002] -1D9C5 ; [*1994.0020.0002] -1D9C6 ; [*1995.0020.0002] -1D9C7 ; [*1996.0020.0002] -1D9C8 ; [*1997.0020.0002] -1D9C9 ; [*1998.0020.0002] -1D9CA ; [*1999.0020.0002] -1D9CB ; [*199A.0020.0002] -1D9CC ; [*199B.0020.0002] -1D9CD ; [*199C.0020.0002] -1D9CE ; [*199D.0020.0002] -1D9CF ; [*199E.0020.0002] -1D9D0 ; [*199F.0020.0002] -1D9D1 ; [*19A0.0020.0002] -1D9D2 ; [*19A1.0020.0002] -1D9D3 ; [*19A2.0020.0002] -1D9D4 ; [*19A3.0020.0002] -1D9D5 ; [*19A4.0020.0002] -1D9D6 ; [*19A5.0020.0002] -1D9D7 ; [*19A6.0020.0002] -1D9D8 ; [*19A7.0020.0002] -1D9D9 ; [*19A8.0020.0002] -1D9DA ; [*19A9.0020.0002] -1D9DB ; [*19AA.0020.0002] -1D9DC ; [*19AB.0020.0002] -1D9DD ; [*19AC.0020.0002] -1D9DE ; [*19AD.0020.0002] -1D9DF ; [*19AE.0020.0002] -1D9E0 ; [*19AF.0020.0002] -1D9E1 ; [*19B0.0020.0002] -1D9E2 ; [*19B1.0020.0002] -1D9E3 ; [*19B2.0020.0002] -1D9E4 ; [*19B3.0020.0002] -1D9E5 ; [*19B4.0020.0002] -1D9E6 ; [*19B5.0020.0002] -1D9E7 ; [*19B6.0020.0002] -1D9E8 ; [*19B7.0020.0002] -1D9E9 ; [*19B8.0020.0002] -1D9EA ; [*19B9.0020.0002] -1D9EB ; [*19BA.0020.0002] -1D9EC ; [*19BB.0020.0002] -1D9ED ; [*19BC.0020.0002] -1D9EE ; [*19BD.0020.0002] -1D9EF ; [*19BE.0020.0002] -1D9F0 ; [*19BF.0020.0002] -1D9F1 ; [*19C0.0020.0002] -1D9F2 ; [*19C1.0020.0002] -1D9F3 ; [*19C2.0020.0002] -1D9F4 ; [*19C3.0020.0002] -1D9F5 ; [*19C4.0020.0002] -1D9F6 ; [*19C5.0020.0002] -1D9F7 ; [*19C6.0020.0002] -1D9F8 ; [*19C7.0020.0002] -1D9F9 ; [*19C8.0020.0002] -1D9FA ; [*19C9.0020.0002] -1D9FB ; [*19CA.0020.0002] -1D9FC ; [*19CB.0020.0002] -1D9FD ; [*19CC.0020.0002] -1D9FE ; [*19CD.0020.0002] -1D9FF ; [*19CE.0020.0002] -1DA00 ; [.0000.0000.0000] -1DA01 ; [.0000.0000.0000] -1DA02 ; [.0000.0000.0000] -1DA03 ; [.0000.0000.0000] -1DA04 ; [.0000.0000.0000] -1DA05 ; [.0000.0000.0000] -1DA06 ; [.0000.0000.0000] -1DA07 ; [.0000.0000.0000] -1DA08 ; [.0000.0000.0000] -1DA09 ; [.0000.0000.0000] -1DA0A ; [.0000.0000.0000] -1DA0B ; [.0000.0000.0000] -1DA0C ; [.0000.0000.0000] -1DA0D ; [.0000.0000.0000] -1DA0E ; [.0000.0000.0000] -1DA0F ; [.0000.0000.0000] -1DA10 ; [.0000.0000.0000] -1DA11 ; [.0000.0000.0000] -1DA12 ; [.0000.0000.0000] -1DA13 ; [.0000.0000.0000] -1DA14 ; [.0000.0000.0000] -1DA15 ; [.0000.0000.0000] -1DA16 ; [.0000.0000.0000] -1DA17 ; [.0000.0000.0000] -1DA18 ; [.0000.0000.0000] -1DA19 ; [.0000.0000.0000] -1DA1A ; [.0000.0000.0000] -1DA1B ; [.0000.0000.0000] -1DA1C ; [.0000.0000.0000] -1DA1D ; [.0000.0000.0000] -1DA1E ; [.0000.0000.0000] -1DA1F ; [.0000.0000.0000] -1DA20 ; [.0000.0000.0000] -1DA21 ; [.0000.0000.0000] -1DA22 ; [.0000.0000.0000] -1DA23 ; [.0000.0000.0000] -1DA24 ; [.0000.0000.0000] -1DA25 ; [.0000.0000.0000] -1DA26 ; [.0000.0000.0000] -1DA27 ; [.0000.0000.0000] -1DA28 ; [.0000.0000.0000] -1DA29 ; [.0000.0000.0000] -1DA2A ; [.0000.0000.0000] -1DA2B ; [.0000.0000.0000] -1DA2C ; [.0000.0000.0000] -1DA2D ; [.0000.0000.0000] -1DA2E ; [.0000.0000.0000] -1DA2F ; [.0000.0000.0000] -1DA30 ; [.0000.0000.0000] -1DA31 ; [.0000.0000.0000] -1DA32 ; [.0000.0000.0000] -1DA33 ; [.0000.0000.0000] -1DA34 ; [.0000.0000.0000] -1DA35 ; [.0000.0000.0000] -1DA36 ; [.0000.0000.0000] -1DA37 ; [*19CF.0020.0002] -1DA38 ; [*19D0.0020.0002] -1DA39 ; [*19D1.0020.0002] -1DA3A ; [*19D2.0020.0002] -1DA3B ; [.0000.0000.0000] -1DA3C ; [.0000.0000.0000] -1DA3D ; [.0000.0000.0000] -1DA3E ; [.0000.0000.0000] -1DA3F ; [.0000.0000.0000] -1DA40 ; [.0000.0000.0000] -1DA41 ; [.0000.0000.0000] -1DA42 ; [.0000.0000.0000] -1DA43 ; [.0000.0000.0000] -1DA44 ; [.0000.0000.0000] -1DA45 ; [.0000.0000.0000] -1DA46 ; [.0000.0000.0000] -1DA47 ; [.0000.0000.0000] -1DA48 ; [.0000.0000.0000] -1DA49 ; [.0000.0000.0000] -1DA4A ; [.0000.0000.0000] -1DA4B ; [.0000.0000.0000] -1DA4C ; [.0000.0000.0000] -1DA4D ; [.0000.0000.0000] -1DA4E ; [.0000.0000.0000] -1DA4F ; [.0000.0000.0000] -1DA50 ; [.0000.0000.0000] -1DA51 ; [.0000.0000.0000] -1DA52 ; [.0000.0000.0000] -1DA53 ; [.0000.0000.0000] -1DA54 ; [.0000.0000.0000] -1DA55 ; [.0000.0000.0000] -1DA56 ; [.0000.0000.0000] -1DA57 ; [.0000.0000.0000] -1DA58 ; [.0000.0000.0000] -1DA59 ; [.0000.0000.0000] -1DA5A ; [.0000.0000.0000] -1DA5B ; [.0000.0000.0000] -1DA5C ; [.0000.0000.0000] -1DA5D ; [.0000.0000.0000] -1DA5E ; [.0000.0000.0000] -1DA5F ; [.0000.0000.0000] -1DA60 ; [.0000.0000.0000] -1DA61 ; [.0000.0000.0000] -1DA62 ; [.0000.0000.0000] -1DA63 ; [.0000.0000.0000] -1DA64 ; [.0000.0000.0000] -1DA65 ; [.0000.0000.0000] -1DA66 ; [.0000.0000.0000] -1DA67 ; [.0000.0000.0000] -1DA68 ; [.0000.0000.0000] -1DA69 ; [.0000.0000.0000] -1DA6A ; [.0000.0000.0000] -1DA6B ; [.0000.0000.0000] -1DA6C ; [.0000.0000.0000] -1DA6D ; [*19D3.0020.0002] -1DA6E ; [*19D4.0020.0002] -1DA6F ; [*19D5.0020.0002] -1DA70 ; [*19D6.0020.0002] -1DA71 ; [*19D7.0020.0002] -1DA72 ; [*19D8.0020.0002] -1DA73 ; [*19D9.0020.0002] -1DA74 ; [*19DA.0020.0002] -1DA75 ; [.0000.0000.0000] -1DA76 ; [*19DB.0020.0002] -1DA77 ; [*19DC.0020.0002] -1DA78 ; [*19DD.0020.0002] -1DA79 ; [*19DE.0020.0002] -1DA7A ; [*19DF.0020.0002] -1DA7B ; [*19E0.0020.0002] -1DA7C ; [*19E1.0020.0002] -1DA7D ; [*19E2.0020.0002] -1DA7E ; [*19E3.0020.0002] -1DA7F ; [*19E4.0020.0002] -1DA80 ; [*19E5.0020.0002] -1DA81 ; [*19E6.0020.0002] -1DA82 ; [*19E7.0020.0002] -1DA83 ; [*19E8.0020.0002] -1DA84 ; [.0000.0000.0000] -1DA85 ; [*19E9.0020.0002] -1DA86 ; [*19EA.0020.0002] -1DA87 ; [*045E.0020.0002] -1DA88 ; [*045F.0020.0002] -1DA89 ; [*0460.0020.0002] -1DA8A ; [*0461.0020.0002] -1DA8B ; [*0462.0020.0002] -1DA9B ; [.0000.0000.0000] -1DA9C ; [.0000.0000.0000] -1DA9D ; [.0000.0000.0000] -1DA9E ; [.0000.0000.0000] -1DA9F ; [.0000.0000.0000] -1DAA1 ; [.0000.0000.0000] -1DAA2 ; [.0000.0000.0000] -1DAA3 ; [.0000.0000.0000] -1DAA4 ; [.0000.0000.0000] -1DAA5 ; [.0000.0000.0000] -1DAA6 ; [.0000.0000.0000] -1DAA7 ; [.0000.0000.0000] -1DAA8 ; [.0000.0000.0000] -1DAA9 ; [.0000.0000.0000] -1DAAA ; [.0000.0000.0000] -1DAAB ; [.0000.0000.0000] -1DAAC ; [.0000.0000.0000] -1DAAD ; [.0000.0000.0000] -1DAAE ; [.0000.0000.0000] -1DAAF ; [.0000.0000.0000] -1E8D0 ; [.0000.0000.0000] -1E8D1 ; [.0000.0000.0000] -1E8D2 ; [.0000.0000.0000] -1E8D3 ; [.0000.0000.0000] -1E8D4 ; [.0000.0000.0000] -1E8D5 ; [.0000.0000.0000] -1E8D6 ; [.0000.0000.0000] -1EEF0 ; [*04DC.0020.0002] -1EEF1 ; [*04DD.0020.0002] -1F000 ; [*11A1.0020.0002] -1F001 ; [*11A2.0020.0002] -1F002 ; [*11A3.0020.0002] -1F003 ; [*11A4.0020.0002] -1F004 ; [*11A5.0020.0002] -1F005 ; [*11A6.0020.0002] -1F006 ; [*11A7.0020.0002] -1F007 ; [*11A8.0020.0002] -1F008 ; [*11A9.0020.0002] -1F009 ; [*11AA.0020.0002] -1F00A ; [*11AB.0020.0002] -1F00B ; [*11AC.0020.0002] -1F00C ; [*11AD.0020.0002] -1F00D ; [*11AE.0020.0002] -1F00E ; [*11AF.0020.0002] -1F00F ; [*11B0.0020.0002] -1F010 ; [*11B1.0020.0002] -1F011 ; [*11B2.0020.0002] -1F012 ; [*11B3.0020.0002] -1F013 ; [*11B4.0020.0002] -1F014 ; [*11B5.0020.0002] -1F015 ; [*11B6.0020.0002] -1F016 ; [*11B7.0020.0002] -1F017 ; [*11B8.0020.0002] -1F018 ; [*11B9.0020.0002] -1F019 ; [*11BA.0020.0002] -1F01A ; [*11BB.0020.0002] -1F01B ; [*11BC.0020.0002] -1F01C ; [*11BD.0020.0002] -1F01D ; [*11BE.0020.0002] -1F01E ; [*11BF.0020.0002] -1F01F ; [*11C0.0020.0002] -1F020 ; [*11C1.0020.0002] -1F021 ; [*11C2.0020.0002] -1F022 ; [*11C3.0020.0002] -1F023 ; [*11C4.0020.0002] -1F024 ; [*11C5.0020.0002] -1F025 ; [*11C6.0020.0002] -1F026 ; [*11C7.0020.0002] -1F027 ; [*11C8.0020.0002] -1F028 ; [*11C9.0020.0002] -1F029 ; [*11CA.0020.0002] -1F02A ; [*11CB.0020.0002] -1F02B ; [*11CC.0020.0002] -1F030 ; [*11CD.0020.0002] -1F031 ; [*11CE.0020.0002] -1F032 ; [*11CF.0020.0002] -1F033 ; [*11D0.0020.0002] -1F034 ; [*11D1.0020.0002] -1F035 ; [*11D2.0020.0002] -1F036 ; [*11D3.0020.0002] -1F037 ; [*11D4.0020.0002] -1F038 ; [*11D5.0020.0002] -1F039 ; [*11D6.0020.0002] -1F03A ; [*11D7.0020.0002] -1F03B ; [*11D8.0020.0002] -1F03C ; [*11D9.0020.0002] -1F03D ; [*11DA.0020.0002] -1F03E ; [*11DB.0020.0002] -1F03F ; [*11DC.0020.0002] -1F040 ; [*11DD.0020.0002] -1F041 ; [*11DE.0020.0002] -1F042 ; [*11DF.0020.0002] -1F043 ; [*11E0.0020.0002] -1F044 ; [*11E1.0020.0002] -1F045 ; [*11E2.0020.0002] -1F046 ; [*11E3.0020.0002] -1F047 ; [*11E4.0020.0002] -1F048 ; [*11E5.0020.0002] -1F049 ; [*11E6.0020.0002] -1F04A ; [*11E7.0020.0002] -1F04B ; [*11E8.0020.0002] -1F04C ; [*11E9.0020.0002] -1F04D ; [*11EA.0020.0002] -1F04E ; [*11EB.0020.0002] -1F04F ; [*11EC.0020.0002] -1F050 ; [*11ED.0020.0002] -1F051 ; [*11EE.0020.0002] -1F052 ; [*11EF.0020.0002] -1F053 ; [*11F0.0020.0002] -1F054 ; [*11F1.0020.0002] -1F055 ; [*11F2.0020.0002] -1F056 ; [*11F3.0020.0002] -1F057 ; [*11F4.0020.0002] -1F058 ; [*11F5.0020.0002] -1F059 ; [*11F6.0020.0002] -1F05A ; [*11F7.0020.0002] -1F05B ; [*11F8.0020.0002] -1F05C ; [*11F9.0020.0002] -1F05D ; [*11FA.0020.0002] -1F05E ; [*11FB.0020.0002] -1F05F ; [*11FC.0020.0002] -1F060 ; [*11FD.0020.0002] -1F061 ; [*11FE.0020.0002] -1F062 ; [*11FF.0020.0002] -1F063 ; [*1200.0020.0002] -1F064 ; [*1201.0020.0002] -1F065 ; [*1202.0020.0002] -1F066 ; [*1203.0020.0002] -1F067 ; [*1204.0020.0002] -1F068 ; [*1205.0020.0002] -1F069 ; [*1206.0020.0002] -1F06A ; [*1207.0020.0002] -1F06B ; [*1208.0020.0002] -1F06C ; [*1209.0020.0002] -1F06D ; [*120A.0020.0002] -1F06E ; [*120B.0020.0002] -1F06F ; [*120C.0020.0002] -1F070 ; [*120D.0020.0002] -1F071 ; [*120E.0020.0002] -1F072 ; [*120F.0020.0002] -1F073 ; [*1210.0020.0002] -1F074 ; [*1211.0020.0002] -1F075 ; [*1212.0020.0002] -1F076 ; [*1213.0020.0002] -1F077 ; [*1214.0020.0002] -1F078 ; [*1215.0020.0002] -1F079 ; [*1216.0020.0002] -1F07A ; [*1217.0020.0002] -1F07B ; [*1218.0020.0002] -1F07C ; [*1219.0020.0002] -1F07D ; [*121A.0020.0002] -1F07E ; [*121B.0020.0002] -1F07F ; [*121C.0020.0002] -1F080 ; [*121D.0020.0002] -1F081 ; [*121E.0020.0002] -1F082 ; [*121F.0020.0002] -1F083 ; [*1220.0020.0002] -1F084 ; [*1221.0020.0002] -1F085 ; [*1222.0020.0002] -1F086 ; [*1223.0020.0002] -1F087 ; [*1224.0020.0002] -1F088 ; [*1225.0020.0002] -1F089 ; [*1226.0020.0002] -1F08A ; [*1227.0020.0002] -1F08B ; [*1228.0020.0002] -1F08C ; [*1229.0020.0002] -1F08D ; [*122A.0020.0002] -1F08E ; [*122B.0020.0002] -1F08F ; [*122C.0020.0002] -1F090 ; [*122D.0020.0002] -1F091 ; [*122E.0020.0002] -1F092 ; [*122F.0020.0002] -1F093 ; [*1230.0020.0002] -1F0A0 ; [*1231.0020.0002] -1F0A1 ; [*1232.0020.0002] -1F0A2 ; [*1233.0020.0002] -1F0A3 ; [*1234.0020.0002] -1F0A4 ; [*1235.0020.0002] -1F0A5 ; [*1236.0020.0002] -1F0A6 ; [*1237.0020.0002] -1F0A7 ; [*1238.0020.0002] -1F0A8 ; [*1239.0020.0002] -1F0A9 ; [*123A.0020.0002] -1F0AA ; [*123B.0020.0002] -1F0AB ; [*123C.0020.0002] -1F0AC ; [*123D.0020.0002] -1F0AD ; [*123E.0020.0002] -1F0AE ; [*123F.0020.0002] -1F0B1 ; [*1240.0020.0002] -1F0B2 ; [*1241.0020.0002] -1F0B3 ; [*1242.0020.0002] -1F0B4 ; [*1243.0020.0002] -1F0B5 ; [*1244.0020.0002] -1F0B6 ; [*1245.0020.0002] -1F0B7 ; [*1246.0020.0002] -1F0B8 ; [*1247.0020.0002] -1F0B9 ; [*1248.0020.0002] -1F0BA ; [*1249.0020.0002] -1F0BB ; [*124A.0020.0002] -1F0BC ; [*124B.0020.0002] -1F0BD ; [*124C.0020.0002] -1F0BE ; [*124D.0020.0002] -1F0BF ; [*124E.0020.0002] -1F0C1 ; [*124F.0020.0002] -1F0C2 ; [*1250.0020.0002] -1F0C3 ; [*1251.0020.0002] -1F0C4 ; [*1252.0020.0002] -1F0C5 ; [*1253.0020.0002] -1F0C6 ; [*1254.0020.0002] -1F0C7 ; [*1255.0020.0002] -1F0C8 ; [*1256.0020.0002] -1F0C9 ; [*1257.0020.0002] -1F0CA ; [*1258.0020.0002] -1F0CB ; [*1259.0020.0002] -1F0CC ; [*125A.0020.0002] -1F0CD ; [*125B.0020.0002] -1F0CE ; [*125C.0020.0002] -1F0CF ; [*125D.0020.0002] -1F0D1 ; [*125E.0020.0002] -1F0D2 ; [*125F.0020.0002] -1F0D3 ; [*1260.0020.0002] -1F0D4 ; [*1261.0020.0002] -1F0D5 ; [*1262.0020.0002] -1F0D6 ; [*1263.0020.0002] -1F0D7 ; [*1264.0020.0002] -1F0D8 ; [*1265.0020.0002] -1F0D9 ; [*1266.0020.0002] -1F0DA ; [*1267.0020.0002] -1F0DB ; [*1268.0020.0002] -1F0DC ; [*1269.0020.0002] -1F0DD ; [*126A.0020.0002] -1F0DE ; [*126B.0020.0002] -1F0DF ; [*126C.0020.0002] -1F0E0 ; [*126D.0020.0002] -1F0E1 ; [*126E.0020.0002] -1F0E2 ; [*126F.0020.0002] -1F0E3 ; [*1270.0020.0002] -1F0E4 ; [*1271.0020.0002] -1F0E5 ; [*1272.0020.0002] -1F0E6 ; [*1273.0020.0002] -1F0E7 ; [*1274.0020.0002] -1F0E8 ; [*1275.0020.0002] -1F0E9 ; [*1276.0020.0002] -1F0EA ; [*1277.0020.0002] -1F0EB ; [*1278.0020.0002] -1F0EC ; [*1279.0020.0002] -1F0ED ; [*127A.0020.0002] -1F0EE ; [*127B.0020.0002] -1F0EF ; [*127C.0020.0002] -1F0F0 ; [*127D.0020.0002] -1F0F1 ; [*127E.0020.0002] -1F0F2 ; [*127F.0020.0002] -1F0F3 ; [*1280.0020.0002] -1F0F4 ; [*1281.0020.0002] -1F0F5 ; [*1282.0020.0002] -1F1E6 ; [*09E3.0020.0002] -1F1E7 ; [*09E4.0020.0002] -1F1E8 ; [*09E5.0020.0002] -1F1E9 ; [*09E6.0020.0002] -1F1EA ; [*09E7.0020.0002] -1F1EB ; [*09E8.0020.0002] -1F1EC ; [*09E9.0020.0002] -1F1ED ; [*09EA.0020.0002] -1F1EE ; [*09EB.0020.0002] -1F1EF ; [*09EC.0020.0002] -1F1F0 ; [*09ED.0020.0002] -1F1F1 ; [*09EE.0020.0002] -1F1F2 ; [*09EF.0020.0002] -1F1F3 ; [*09F0.0020.0002] -1F1F4 ; [*09F1.0020.0002] -1F1F5 ; [*09F2.0020.0002] -1F1F6 ; [*09F3.0020.0002] -1F1F7 ; [*09F4.0020.0002] -1F1F8 ; [*09F5.0020.0002] -1F1F9 ; [*09F6.0020.0002] -1F1FA ; [*09F7.0020.0002] -1F1FB ; [*09F8.0020.0002] -1F1FC ; [*09F9.0020.0002] -1F1FD ; [*09FA.0020.0002] -1F1FE ; [*09FB.0020.0002] -1F1FF ; [*09FC.0020.0002] -1F300 ; [*1283.0020.0002] -1F301 ; [*1284.0020.0002] -1F302 ; [*1285.0020.0002] -1F303 ; [*1286.0020.0002] -1F304 ; [*1287.0020.0002] -1F305 ; [*1288.0020.0002] -1F306 ; [*1289.0020.0002] -1F307 ; [*128A.0020.0002] -1F308 ; [*128B.0020.0002] -1F309 ; [*128C.0020.0002] -1F30A ; [*128D.0020.0002] -1F30B ; [*128E.0020.0002] -1F30C ; [*128F.0020.0002] -1F30D ; [*1290.0020.0002] -1F30E ; [*1291.0020.0002] -1F30F ; [*1292.0020.0002] -1F310 ; [*1293.0020.0002] -1F311 ; [*1294.0020.0002] -1F312 ; [*1295.0020.0002] -1F313 ; [*1296.0020.0002] -1F314 ; [*1297.0020.0002] -1F315 ; [*1298.0020.0002] -1F316 ; [*1299.0020.0002] -1F317 ; [*129A.0020.0002] -1F318 ; [*129B.0020.0002] -1F319 ; [*129C.0020.0002] -1F31A ; [*129D.0020.0002] -1F31B ; [*129E.0020.0002] -1F31C ; [*129F.0020.0002] -1F31D ; [*12A0.0020.0002] -1F31E ; [*12A1.0020.0002] -1F31F ; [*12A2.0020.0002] -1F320 ; [*12A3.0020.0002] -1F321 ; [*12A4.0020.0002] -1F322 ; [*12A5.0020.0002] -1F323 ; [*12A6.0020.0002] -1F324 ; [*12A7.0020.0002] -1F325 ; [*12A8.0020.0002] -1F326 ; [*12A9.0020.0002] -1F327 ; [*12AA.0020.0002] -1F328 ; [*12AB.0020.0002] -1F329 ; [*12AC.0020.0002] -1F32A ; [*12AD.0020.0002] -1F32B ; [*12AE.0020.0002] -1F32C ; [*12AF.0020.0002] -1F32D ; [*12B0.0020.0002] -1F32E ; [*12B1.0020.0002] -1F32F ; [*12B2.0020.0002] -1F330 ; [*12B3.0020.0002] -1F331 ; [*12B4.0020.0002] -1F332 ; [*12B5.0020.0002] -1F333 ; [*12B6.0020.0002] -1F334 ; [*12B7.0020.0002] -1F335 ; [*12B8.0020.0002] -1F336 ; [*12B9.0020.0002] -1F337 ; [*12BA.0020.0002] -1F338 ; [*12BB.0020.0002] -1F339 ; [*12BC.0020.0002] -1F33A ; [*12BD.0020.0002] -1F33B ; [*12BE.0020.0002] -1F33C ; [*12BF.0020.0002] -1F33D ; [*12C0.0020.0002] -1F33E ; [*12C1.0020.0002] -1F33F ; [*12C2.0020.0002] -1F340 ; [*12C3.0020.0002] -1F341 ; [*12C4.0020.0002] -1F342 ; [*12C5.0020.0002] -1F343 ; [*12C6.0020.0002] -1F344 ; [*12C7.0020.0002] -1F345 ; [*12C8.0020.0002] -1F346 ; [*12C9.0020.0002] -1F347 ; [*12CA.0020.0002] -1F348 ; [*12CB.0020.0002] -1F349 ; [*12CC.0020.0002] -1F34A ; [*12CD.0020.0002] -1F34B ; [*12CE.0020.0002] -1F34C ; [*12CF.0020.0002] -1F34D ; [*12D0.0020.0002] -1F34E ; [*12D1.0020.0002] -1F34F ; [*12D2.0020.0002] -1F350 ; [*12D3.0020.0002] -1F351 ; [*12D4.0020.0002] -1F352 ; [*12D5.0020.0002] -1F353 ; [*12D6.0020.0002] -1F354 ; [*12D7.0020.0002] -1F355 ; [*12D8.0020.0002] -1F356 ; [*12D9.0020.0002] -1F357 ; [*12DA.0020.0002] -1F358 ; [*12DB.0020.0002] -1F359 ; [*12DC.0020.0002] -1F35A ; [*12DD.0020.0002] -1F35B ; [*12DE.0020.0002] -1F35C ; [*12DF.0020.0002] -1F35D ; [*12E0.0020.0002] -1F35E ; [*12E1.0020.0002] -1F35F ; [*12E2.0020.0002] -1F360 ; [*12E3.0020.0002] -1F361 ; [*12E4.0020.0002] -1F362 ; [*12E5.0020.0002] -1F363 ; [*12E6.0020.0002] -1F364 ; [*12E7.0020.0002] -1F365 ; [*12E8.0020.0002] -1F366 ; [*12E9.0020.0002] -1F367 ; [*12EA.0020.0002] -1F368 ; [*12EB.0020.0002] -1F369 ; [*12EC.0020.0002] -1F36A ; [*12ED.0020.0002] -1F36B ; [*12EE.0020.0002] -1F36C ; [*12EF.0020.0002] -1F36D ; [*12F0.0020.0002] -1F36E ; [*12F1.0020.0002] -1F36F ; [*12F2.0020.0002] -1F370 ; [*12F3.0020.0002] -1F371 ; [*12F4.0020.0002] -1F372 ; [*12F5.0020.0002] -1F373 ; [*12F6.0020.0002] -1F374 ; [*12F7.0020.0002] -1F375 ; [*12F8.0020.0002] -1F376 ; [*12F9.0020.0002] -1F377 ; [*12FA.0020.0002] -1F378 ; [*12FB.0020.0002] -1F379 ; [*12FC.0020.0002] -1F37A ; [*12FD.0020.0002] -1F37B ; [*12FE.0020.0002] -1F37C ; [*12FF.0020.0002] -1F37D ; [*1300.0020.0002] -1F37E ; [*1301.0020.0002] -1F37F ; [*1302.0020.0002] -1F380 ; [*1303.0020.0002] -1F381 ; [*1304.0020.0002] -1F382 ; [*1305.0020.0002] -1F383 ; [*1306.0020.0002] -1F384 ; [*1307.0020.0002] -1F385 ; [*1308.0020.0002] -1F386 ; [*1309.0020.0002] -1F387 ; [*130A.0020.0002] -1F388 ; [*130B.0020.0002] -1F389 ; [*130C.0020.0002] -1F38A ; [*130D.0020.0002] -1F38B ; [*130E.0020.0002] -1F38C ; [*130F.0020.0002] -1F38D ; [*1310.0020.0002] -1F38E ; [*1311.0020.0002] -1F38F ; [*1312.0020.0002] -1F390 ; [*1313.0020.0002] -1F391 ; [*1314.0020.0002] -1F392 ; [*1315.0020.0002] -1F393 ; [*1316.0020.0002] -1F394 ; [*1317.0020.0002] -1F395 ; [*1318.0020.0002] -1F396 ; [*1319.0020.0002] -1F397 ; [*131A.0020.0002] -1F398 ; [*131B.0020.0002] -1F399 ; [*131C.0020.0002] -1F39A ; [*131D.0020.0002] -1F39B ; [*131E.0020.0002] -1F39C ; [*131F.0020.0002] -1F39D ; [*1320.0020.0002] -1F39E ; [*1321.0020.0002] -1F39F ; [*1322.0020.0002] -1F3A0 ; [*1323.0020.0002] -1F3A1 ; [*1324.0020.0002] -1F3A2 ; [*1325.0020.0002] -1F3A3 ; [*1326.0020.0002] -1F3A4 ; [*1327.0020.0002] -1F3A5 ; [*1328.0020.0002] -1F3A6 ; [*1329.0020.0002] -1F3A7 ; [*132A.0020.0002] -1F3A8 ; [*132B.0020.0002] -1F3A9 ; [*132C.0020.0002] -1F3AA ; [*132D.0020.0002] -1F3AB ; [*132E.0020.0002] -1F3AC ; [*132F.0020.0002] -1F3AD ; [*1330.0020.0002] -1F3AE ; [*1331.0020.0002] -1F3AF ; [*1332.0020.0002] -1F3B0 ; [*1333.0020.0002] -1F3B1 ; [*1334.0020.0002] -1F3B2 ; [*1335.0020.0002] -1F3B3 ; [*1336.0020.0002] -1F3B4 ; [*1337.0020.0002] -1F3B5 ; [*1338.0020.0002] -1F3B6 ; [*1339.0020.0002] -1F3B7 ; [*133A.0020.0002] -1F3B8 ; [*133B.0020.0002] -1F3B9 ; [*133C.0020.0002] -1F3BA ; [*133D.0020.0002] -1F3BB ; [*133E.0020.0002] -1F3BC ; [*133F.0020.0002] -1F3BD ; [*1340.0020.0002] -1F3BE ; [*1341.0020.0002] -1F3BF ; [*1342.0020.0002] -1F3C0 ; [*1343.0020.0002] -1F3C1 ; [*1344.0020.0002] -1F3C2 ; [*1345.0020.0002] -1F3C3 ; [*1346.0020.0002] -1F3C4 ; [*1347.0020.0002] -1F3C5 ; [*1348.0020.0002] -1F3C6 ; [*1349.0020.0002] -1F3C7 ; [*134A.0020.0002] -1F3C8 ; [*134B.0020.0002] -1F3C9 ; [*134C.0020.0002] -1F3CA ; [*134D.0020.0002] -1F3CB ; [*134E.0020.0002] -1F3CC ; [*134F.0020.0002] -1F3CD ; [*1350.0020.0002] -1F3CE ; [*1351.0020.0002] -1F3CF ; [*1352.0020.0002] -1F3D0 ; [*1353.0020.0002] -1F3D1 ; [*1354.0020.0002] -1F3D2 ; [*1355.0020.0002] -1F3D3 ; [*1356.0020.0002] -1F3D4 ; [*1357.0020.0002] -1F3D5 ; [*1358.0020.0002] -1F3D6 ; [*1359.0020.0002] -1F3D7 ; [*135A.0020.0002] -1F3D8 ; [*135B.0020.0002] -1F3D9 ; [*135C.0020.0002] -1F3DA ; [*135D.0020.0002] -1F3DB ; [*135E.0020.0002] -1F3DC ; [*135F.0020.0002] -1F3DD ; [*1360.0020.0002] -1F3DE ; [*1361.0020.0002] -1F3DF ; [*1362.0020.0002] -1F3E0 ; [*1363.0020.0002] -1F3E1 ; [*1364.0020.0002] -1F3E2 ; [*1365.0020.0002] -1F3E3 ; [*1366.0020.0002] -1F3E4 ; [*1367.0020.0002] -1F3E5 ; [*1368.0020.0002] -1F3E6 ; [*1369.0020.0002] -1F3E7 ; [*136A.0020.0002] -1F3E8 ; [*136B.0020.0002] -1F3E9 ; [*136C.0020.0002] -1F3EA ; [*136D.0020.0002] -1F3EB ; [*136E.0020.0002] -1F3EC ; [*136F.0020.0002] -1F3ED ; [*1370.0020.0002] -1F3EE ; [*1371.0020.0002] -1F3EF ; [*1372.0020.0002] -1F3F0 ; [*1373.0020.0002] -1F3F1 ; [*1374.0020.0002] -1F3F2 ; [*1375.0020.0002] -1F3F3 ; [*1376.0020.0002] -1F3F4 ; [*1377.0020.0002] -1F3F5 ; [*1378.0020.0002] -1F3F6 ; [*1379.0020.0002] -1F3F7 ; [*137A.0020.0002] -1F3F8 ; [*137B.0020.0002] -1F3F9 ; [*137C.0020.0002] -1F3FA ; [*137D.0020.0002] -1F3FB ; [*137E.0020.0002] -1F3FC ; [*137F.0020.0002] -1F3FD ; [*1380.0020.0002] -1F3FE ; [*1381.0020.0002] -1F3FF ; [*1382.0020.0002] -1F400 ; [*1383.0020.0002] -1F401 ; [*1384.0020.0002] -1F402 ; [*1385.0020.0002] -1F403 ; [*1386.0020.0002] -1F404 ; [*1387.0020.0002] -1F405 ; [*1388.0020.0002] -1F406 ; [*1389.0020.0002] -1F407 ; [*138A.0020.0002] -1F408 ; [*138B.0020.0002] -1F409 ; [*138C.0020.0002] -1F40A ; [*138D.0020.0002] -1F40B ; [*138E.0020.0002] -1F40C ; [*138F.0020.0002] -1F40D ; [*1390.0020.0002] -1F40E ; [*1391.0020.0002] -1F40F ; [*1392.0020.0002] -1F410 ; [*1393.0020.0002] -1F411 ; [*1394.0020.0002] -1F412 ; [*1395.0020.0002] -1F413 ; [*1396.0020.0002] -1F414 ; [*1397.0020.0002] -1F415 ; [*1398.0020.0002] -1F416 ; [*1399.0020.0002] -1F417 ; [*139A.0020.0002] -1F418 ; [*139B.0020.0002] -1F419 ; [*139C.0020.0002] -1F41A ; [*139D.0020.0002] -1F41B ; [*139E.0020.0002] -1F41C ; [*139F.0020.0002] -1F41D ; [*13A0.0020.0002] -1F41E ; [*13A1.0020.0002] -1F41F ; [*13A2.0020.0002] -1F420 ; [*13A3.0020.0002] -1F421 ; [*13A4.0020.0002] -1F422 ; [*13A5.0020.0002] -1F423 ; [*13A6.0020.0002] -1F424 ; [*13A7.0020.0002] -1F425 ; [*13A8.0020.0002] -1F426 ; [*13A9.0020.0002] -1F427 ; [*13AA.0020.0002] -1F428 ; [*13AB.0020.0002] -1F429 ; [*13AC.0020.0002] -1F42A ; [*13AD.0020.0002] -1F42B ; [*13AE.0020.0002] -1F42C ; [*13AF.0020.0002] -1F42D ; [*13B0.0020.0002] -1F42E ; [*13B1.0020.0002] -1F42F ; [*13B2.0020.0002] -1F430 ; [*13B3.0020.0002] -1F431 ; [*13B4.0020.0002] -1F432 ; [*13B5.0020.0002] -1F433 ; [*13B6.0020.0002] -1F434 ; [*13B7.0020.0002] -1F435 ; [*13B8.0020.0002] -1F436 ; [*13B9.0020.0002] -1F437 ; [*13BA.0020.0002] -1F438 ; [*13BB.0020.0002] -1F439 ; [*13BC.0020.0002] -1F43A ; [*13BD.0020.0002] -1F43B ; [*13BE.0020.0002] -1F43C ; [*13BF.0020.0002] -1F43D ; [*13C0.0020.0002] -1F43E ; [*13C1.0020.0002] -1F43F ; [*13C2.0020.0002] -1F440 ; [*13C3.0020.0002] -1F441 ; [*13C4.0020.0002] -1F442 ; [*13C5.0020.0002] -1F443 ; [*13C6.0020.0002] -1F444 ; [*13C7.0020.0002] -1F445 ; [*13C8.0020.0002] -1F446 ; [*13C9.0020.0002] -1F447 ; [*13CA.0020.0002] -1F448 ; [*13CB.0020.0002] -1F449 ; [*13CC.0020.0002] -1F44A ; [*13CD.0020.0002] -1F44B ; [*13CE.0020.0002] -1F44C ; [*13CF.0020.0002] -1F44D ; [*13D0.0020.0002] -1F44E ; [*13D1.0020.0002] -1F44F ; [*13D2.0020.0002] -1F450 ; [*13D3.0020.0002] -1F451 ; [*13D4.0020.0002] -1F452 ; [*13D5.0020.0002] -1F453 ; [*13D6.0020.0002] -1F454 ; [*13D7.0020.0002] -1F455 ; [*13D8.0020.0002] -1F456 ; [*13D9.0020.0002] -1F457 ; [*13DA.0020.0002] -1F458 ; [*13DB.0020.0002] -1F459 ; [*13DC.0020.0002] -1F45A ; [*13DD.0020.0002] -1F45B ; [*13DE.0020.0002] -1F45C ; [*13DF.0020.0002] -1F45D ; [*13E0.0020.0002] -1F45E ; [*13E1.0020.0002] -1F45F ; [*13E2.0020.0002] -1F460 ; [*13E3.0020.0002] -1F461 ; [*13E4.0020.0002] -1F462 ; [*13E5.0020.0002] -1F463 ; [*13E6.0020.0002] -1F464 ; [*13E7.0020.0002] -1F465 ; [*13E8.0020.0002] -1F466 ; [*13E9.0020.0002] -1F467 ; [*13EA.0020.0002] -1F468 ; [*13EB.0020.0002] -1F469 ; [*13EC.0020.0002] -1F46A ; [*13ED.0020.0002] -1F46B ; [*13EE.0020.0002] -1F46C ; [*13EF.0020.0002] -1F46D ; [*13F0.0020.0002] -1F46E ; [*13F1.0020.0002] -1F46F ; [*13F2.0020.0002] -1F470 ; [*13F3.0020.0002] -1F471 ; [*13F4.0020.0002] -1F472 ; [*13F5.0020.0002] -1F473 ; [*13F6.0020.0002] -1F474 ; [*13F7.0020.0002] -1F475 ; [*13F8.0020.0002] -1F476 ; [*13F9.0020.0002] -1F477 ; [*13FA.0020.0002] -1F478 ; [*13FB.0020.0002] -1F479 ; [*13FC.0020.0002] -1F47A ; [*13FD.0020.0002] -1F47B ; [*13FE.0020.0002] -1F47C ; [*13FF.0020.0002] -1F47D ; [*1400.0020.0002] -1F47E ; [*1401.0020.0002] -1F47F ; [*1402.0020.0002] -1F480 ; [*1403.0020.0002] -1F481 ; [*1404.0020.0002] -1F482 ; [*1405.0020.0002] -1F483 ; [*1406.0020.0002] -1F484 ; [*1407.0020.0002] -1F485 ; [*1408.0020.0002] -1F486 ; [*1409.0020.0002] -1F487 ; [*140A.0020.0002] -1F488 ; [*140B.0020.0002] -1F489 ; [*140C.0020.0002] -1F48A ; [*140D.0020.0002] -1F48B ; [*140E.0020.0002] -1F48C ; [*140F.0020.0002] -1F48D ; [*1410.0020.0002] -1F48E ; [*1411.0020.0002] -1F48F ; [*1412.0020.0002] -1F490 ; [*1413.0020.0002] -1F491 ; [*1414.0020.0002] -1F492 ; [*1415.0020.0002] -1F493 ; [*1416.0020.0002] -1F494 ; [*1417.0020.0002] -1F495 ; [*1418.0020.0002] -1F496 ; [*1419.0020.0002] -1F497 ; [*141A.0020.0002] -1F498 ; [*141B.0020.0002] -1F499 ; [*141C.0020.0002] -1F49A ; [*141D.0020.0002] -1F49B ; [*141E.0020.0002] -1F49C ; [*141F.0020.0002] -1F49D ; [*1420.0020.0002] -1F49E ; [*1421.0020.0002] -1F49F ; [*1422.0020.0002] -1F4A0 ; [*1423.0020.0002] -1F4A1 ; [*1424.0020.0002] -1F4A2 ; [*1425.0020.0002] -1F4A3 ; [*1426.0020.0002] -1F4A4 ; [*1427.0020.0002] -1F4A5 ; [*1428.0020.0002] -1F4A6 ; [*1429.0020.0002] -1F4A7 ; [*142A.0020.0002] -1F4A8 ; [*142B.0020.0002] -1F4A9 ; [*142C.0020.0002] -1F4AA ; [*142D.0020.0002] -1F4AB ; [*142E.0020.0002] -1F4AC ; [*142F.0020.0002] -1F4AD ; [*1430.0020.0002] -1F4AE ; [*1431.0020.0002] -1F4AF ; [*1432.0020.0002] -1F4B0 ; [*1433.0020.0002] -1F4B1 ; [*1434.0020.0002] -1F4B2 ; [*1435.0020.0002] -1F4B3 ; [*1436.0020.0002] -1F4B4 ; [*1437.0020.0002] -1F4B5 ; [*1438.0020.0002] -1F4B6 ; [*1439.0020.0002] -1F4B7 ; [*143A.0020.0002] -1F4B8 ; [*143B.0020.0002] -1F4B9 ; [*143C.0020.0002] -1F4BA ; [*143D.0020.0002] -1F4BB ; [*143E.0020.0002] -1F4BC ; [*143F.0020.0002] -1F4BD ; [*1440.0020.0002] -1F4BE ; [*1441.0020.0002] -1F4BF ; [*1442.0020.0002] -1F4C0 ; [*1443.0020.0002] -1F4C1 ; [*1444.0020.0002] -1F4C2 ; [*1445.0020.0002] -1F4C3 ; [*1446.0020.0002] -1F4C4 ; [*1447.0020.0002] -1F4C5 ; [*1448.0020.0002] -1F4C6 ; [*1449.0020.0002] -1F4C7 ; [*144A.0020.0002] -1F4C8 ; [*144B.0020.0002] -1F4C9 ; [*144C.0020.0002] -1F4CA ; [*144D.0020.0002] -1F4CB ; [*144E.0020.0002] -1F4CC ; [*144F.0020.0002] -1F4CD ; [*1450.0020.0002] -1F4CE ; [*1451.0020.0002] -1F4CF ; [*1452.0020.0002] -1F4D0 ; [*1453.0020.0002] -1F4D1 ; [*1454.0020.0002] -1F4D2 ; [*1455.0020.0002] -1F4D3 ; [*1456.0020.0002] -1F4D4 ; [*1457.0020.0002] -1F4D5 ; [*1458.0020.0002] -1F4D6 ; [*1459.0020.0002] -1F4D7 ; [*145A.0020.0002] -1F4D8 ; [*145B.0020.0002] -1F4D9 ; [*145C.0020.0002] -1F4DA ; [*145D.0020.0002] -1F4DB ; [*145E.0020.0002] -1F4DC ; [*145F.0020.0002] -1F4DD ; [*1460.0020.0002] -1F4DE ; [*1461.0020.0002] -1F4DF ; [*1462.0020.0002] -1F4E0 ; [*1463.0020.0002] -1F4E1 ; [*1464.0020.0002] -1F4E2 ; [*1465.0020.0002] -1F4E3 ; [*1466.0020.0002] -1F4E4 ; [*1467.0020.0002] -1F4E5 ; [*1468.0020.0002] -1F4E6 ; [*1469.0020.0002] -1F4E7 ; [*146A.0020.0002] -1F4E8 ; [*146B.0020.0002] -1F4E9 ; [*146C.0020.0002] -1F4EA ; [*146D.0020.0002] -1F4EB ; [*146E.0020.0002] -1F4EC ; [*146F.0020.0002] -1F4ED ; [*1470.0020.0002] -1F4EE ; [*1471.0020.0002] -1F4EF ; [*1472.0020.0002] -1F4F0 ; [*1473.0020.0002] -1F4F1 ; [*1474.0020.0002] -1F4F2 ; [*1475.0020.0002] -1F4F3 ; [*1476.0020.0002] -1F4F4 ; [*1477.0020.0002] -1F4F5 ; [*1478.0020.0002] -1F4F6 ; [*1479.0020.0002] -1F4F7 ; [*147A.0020.0002] -1F4F8 ; [*147B.0020.0002] -1F4F9 ; [*147C.0020.0002] -1F4FA ; [*147D.0020.0002] -1F4FB ; [*147E.0020.0002] -1F4FC ; [*147F.0020.0002] -1F4FD ; [*1480.0020.0002] -1F4FE ; [*1481.0020.0002] -1F4FF ; [*1482.0020.0002] -1F500 ; [*1483.0020.0002] -1F501 ; [*1484.0020.0002] -1F502 ; [*1485.0020.0002] -1F503 ; [*1486.0020.0002] -1F504 ; [*1487.0020.0002] -1F505 ; [*1488.0020.0002] -1F506 ; [*1489.0020.0002] -1F507 ; [*148A.0020.0002] -1F508 ; [*148B.0020.0002] -1F509 ; [*148C.0020.0002] -1F50A ; [*148D.0020.0002] -1F50B ; [*148E.0020.0002] -1F50C ; [*148F.0020.0002] -1F50D ; [*1490.0020.0002] -1F50E ; [*1491.0020.0002] -1F50F ; [*1492.0020.0002] -1F510 ; [*1493.0020.0002] -1F511 ; [*1494.0020.0002] -1F512 ; [*1495.0020.0002] -1F513 ; [*1496.0020.0002] -1F514 ; [*1497.0020.0002] -1F515 ; [*1498.0020.0002] -1F516 ; [*1499.0020.0002] -1F517 ; [*149A.0020.0002] -1F518 ; [*149B.0020.0002] -1F519 ; [*149C.0020.0002] -1F51A ; [*149D.0020.0002] -1F51B ; [*149E.0020.0002] -1F51C ; [*149F.0020.0002] -1F51D ; [*14A0.0020.0002] -1F51E ; [*14A1.0020.0002] -1F51F ; [*14A2.0020.0002] -1F520 ; [*14A3.0020.0002] -1F521 ; [*14A4.0020.0002] -1F522 ; [*14A5.0020.0002] -1F523 ; [*14A6.0020.0002] -1F524 ; [*14A7.0020.0002] -1F525 ; [*14A8.0020.0002] -1F526 ; [*14A9.0020.0002] -1F527 ; [*14AA.0020.0002] -1F528 ; [*14AB.0020.0002] -1F529 ; [*14AC.0020.0002] -1F52A ; [*14AD.0020.0002] -1F52B ; [*14AE.0020.0002] -1F52C ; [*14AF.0020.0002] -1F52D ; [*14B0.0020.0002] -1F52E ; [*14B1.0020.0002] -1F52F ; [*14B2.0020.0002] -1F530 ; [*14B3.0020.0002] -1F531 ; [*14B4.0020.0002] -1F532 ; [*14B5.0020.0002] -1F533 ; [*14B6.0020.0002] -1F534 ; [*14B7.0020.0002] -1F535 ; [*14B8.0020.0002] -1F536 ; [*14B9.0020.0002] -1F537 ; [*14BA.0020.0002] -1F538 ; [*14BB.0020.0002] -1F539 ; [*14BC.0020.0002] -1F53A ; [*14BD.0020.0002] -1F53B ; [*14BE.0020.0002] -1F53C ; [*14BF.0020.0002] -1F53D ; [*14C0.0020.0002] -1F53E ; [*14C1.0020.0002] -1F53F ; [*14C2.0020.0002] -1F540 ; [*14C3.0020.0002] -1F541 ; [*14C4.0020.0002] -1F542 ; [*14C5.0020.0002] -1F543 ; [*14C6.0020.0002] -1F544 ; [*14C7.0020.0002] -1F545 ; [*14C8.0020.0002] -1F546 ; [*14C9.0020.0002] -1F547 ; [*14CA.0020.0002] -1F548 ; [*14CB.0020.0002] -1F549 ; [*14CC.0020.0002] -1F54A ; [*14CD.0020.0002] -1F54B ; [*14CE.0020.0002] -1F54C ; [*14CF.0020.0002] -1F54D ; [*14D0.0020.0002] -1F54E ; [*14D1.0020.0002] -1F54F ; [*14D2.0020.0002] -1F550 ; [*14D3.0020.0002] -1F551 ; [*14D4.0020.0002] -1F552 ; [*14D5.0020.0002] -1F553 ; [*14D6.0020.0002] -1F554 ; [*14D7.0020.0002] -1F555 ; [*14D8.0020.0002] -1F556 ; [*14D9.0020.0002] -1F557 ; [*14DA.0020.0002] -1F558 ; [*14DB.0020.0002] -1F559 ; [*14DC.0020.0002] -1F55A ; [*14DD.0020.0002] -1F55B ; [*14DE.0020.0002] -1F55C ; [*14DF.0020.0002] -1F55D ; [*14E0.0020.0002] -1F55E ; [*14E1.0020.0002] -1F55F ; [*14E2.0020.0002] -1F560 ; [*14E3.0020.0002] -1F561 ; [*14E4.0020.0002] -1F562 ; [*14E5.0020.0002] -1F563 ; [*14E6.0020.0002] -1F564 ; [*14E7.0020.0002] -1F565 ; [*14E8.0020.0002] -1F566 ; [*14E9.0020.0002] -1F567 ; [*14EA.0020.0002] -1F568 ; [*14EB.0020.0002] -1F569 ; [*14EC.0020.0002] -1F56A ; [*14ED.0020.0002] -1F56B ; [*14EE.0020.0002] -1F56C ; [*14EF.0020.0002] -1F56D ; [*14F0.0020.0002] -1F56E ; [*14F1.0020.0002] -1F56F ; [*14F2.0020.0002] -1F570 ; [*14F3.0020.0002] -1F571 ; [*14F4.0020.0002] -1F572 ; [*14F5.0020.0002] -1F573 ; [*14F6.0020.0002] -1F574 ; [*14F7.0020.0002] -1F575 ; [*14F8.0020.0002] -1F576 ; [*14F9.0020.0002] -1F577 ; [*14FA.0020.0002] -1F578 ; [*14FB.0020.0002] -1F579 ; [*14FC.0020.0002] -1F57B ; [*14FD.0020.0002] -1F57C ; [*14FE.0020.0002] -1F57D ; [*14FF.0020.0002] -1F57E ; [*1500.0020.0002] -1F57F ; [*1501.0020.0002] -1F580 ; [*1502.0020.0002] -1F581 ; [*1503.0020.0002] -1F582 ; [*1504.0020.0002] -1F583 ; [*1505.0020.0002] -1F584 ; [*1506.0020.0002] -1F585 ; [*1507.0020.0002] -1F586 ; [*1508.0020.0002] -1F587 ; [*1509.0020.0002] -1F588 ; [*150A.0020.0002] -1F589 ; [*150B.0020.0002] -1F58A ; [*150C.0020.0002] -1F58B ; [*150D.0020.0002] -1F58C ; [*150E.0020.0002] -1F58D ; [*150F.0020.0002] -1F58E ; [*1510.0020.0002] -1F58F ; [*1511.0020.0002] -1F590 ; [*1512.0020.0002] -1F591 ; [*1513.0020.0002] -1F592 ; [*1514.0020.0002] -1F593 ; [*1515.0020.0002] -1F594 ; [*1516.0020.0002] -1F595 ; [*1517.0020.0002] -1F596 ; [*1518.0020.0002] -1F597 ; [*1519.0020.0002] -1F598 ; [*151A.0020.0002] -1F599 ; [*151B.0020.0002] -1F59A ; [*151C.0020.0002] -1F59B ; [*151D.0020.0002] -1F59C ; [*151E.0020.0002] -1F59D ; [*151F.0020.0002] -1F59E ; [*1520.0020.0002] -1F59F ; [*1521.0020.0002] -1F5A0 ; [*1522.0020.0002] -1F5A1 ; [*1523.0020.0002] -1F5A2 ; [*1524.0020.0002] -1F5A3 ; [*1525.0020.0002] -1F5A5 ; [*1526.0020.0002] -1F5A6 ; [*1527.0020.0002] -1F5A7 ; [*1528.0020.0002] -1F5A8 ; [*1529.0020.0002] -1F5A9 ; [*152A.0020.0002] -1F5AA ; [*152B.0020.0002] -1F5AB ; [*152C.0020.0002] -1F5AC ; [*152D.0020.0002] -1F5AD ; [*152E.0020.0002] -1F5AE ; [*152F.0020.0002] -1F5AF ; [*1530.0020.0002] -1F5B0 ; [*1531.0020.0002] -1F5B1 ; [*1532.0020.0002] -1F5B2 ; [*1533.0020.0002] -1F5B3 ; [*1534.0020.0002] -1F5B4 ; [*1535.0020.0002] -1F5B5 ; [*1536.0020.0002] -1F5B6 ; [*1537.0020.0002] -1F5B7 ; [*1538.0020.0002] -1F5B8 ; [*1539.0020.0002] -1F5B9 ; [*153A.0020.0002] -1F5BA ; [*153B.0020.0002] -1F5BB ; [*153C.0020.0002] -1F5BC ; [*153D.0020.0002] -1F5BD ; [*153E.0020.0002] -1F5BE ; [*153F.0020.0002] -1F5BF ; [*1540.0020.0002] -1F5C0 ; [*1541.0020.0002] -1F5C1 ; [*1542.0020.0002] -1F5C2 ; [*1543.0020.0002] -1F5C3 ; [*1544.0020.0002] -1F5C4 ; [*1545.0020.0002] -1F5C5 ; [*1546.0020.0002] -1F5C6 ; [*1547.0020.0002] -1F5C7 ; [*1548.0020.0002] -1F5C8 ; [*1549.0020.0002] -1F5C9 ; [*154A.0020.0002] -1F5CA ; [*154B.0020.0002] -1F5CB ; [*154C.0020.0002] -1F5CC ; [*154D.0020.0002] -1F5CD ; [*154E.0020.0002] -1F5CE ; [*154F.0020.0002] -1F5CF ; [*1550.0020.0002] -1F5D0 ; [*1551.0020.0002] -1F5D1 ; [*1552.0020.0002] -1F5D2 ; [*1553.0020.0002] -1F5D3 ; [*1554.0020.0002] -1F5D4 ; [*1555.0020.0002] -1F5D5 ; [*1556.0020.0002] -1F5D6 ; [*1557.0020.0002] -1F5D7 ; [*1558.0020.0002] -1F5D8 ; [*1559.0020.0002] -1F5D9 ; [*155A.0020.0002] -1F5DA ; [*155B.0020.0002] -1F5DB ; [*155C.0020.0002] -1F5DC ; [*155D.0020.0002] -1F5DD ; [*155E.0020.0002] -1F5DE ; [*155F.0020.0002] -1F5DF ; [*1560.0020.0002] -1F5E0 ; [*1561.0020.0002] -1F5E1 ; [*1562.0020.0002] -1F5E2 ; [*1563.0020.0002] -1F5E3 ; [*1564.0020.0002] -1F5E4 ; [*1565.0020.0002] -1F5E5 ; [*1566.0020.0002] -1F5E6 ; [*1567.0020.0002] -1F5E7 ; [*1568.0020.0002] -1F5E8 ; [*1569.0020.0002] -1F5E9 ; [*156A.0020.0002] -1F5EA ; [*156B.0020.0002] -1F5EB ; [*156C.0020.0002] -1F5EC ; [*156D.0020.0002] -1F5ED ; [*156E.0020.0002] -1F5EE ; [*156F.0020.0002] -1F5EF ; [*1570.0020.0002] -1F5F0 ; [*1571.0020.0002] -1F5F1 ; [*1572.0020.0002] -1F5F2 ; [*1573.0020.0002] -1F5F3 ; [*1574.0020.0002] -1F5F4 ; [*1575.0020.0002] -1F5F5 ; [*1576.0020.0002] -1F5F6 ; [*1577.0020.0002] -1F5F7 ; [*1578.0020.0002] -1F5F8 ; [*1579.0020.0002] -1F5F9 ; [*157A.0020.0002] -1F5FA ; [*157B.0020.0002] -1F5FB ; [*157C.0020.0002] -1F5FC ; [*157D.0020.0002] -1F5FD ; [*157E.0020.0002] -1F5FE ; [*157F.0020.0002] -1F5FF ; [*1580.0020.0002] -1F600 ; [*1590.0020.0002] -1F601 ; [*1591.0020.0002] -1F602 ; [*1592.0020.0002] -1F603 ; [*1593.0020.0002] -1F604 ; [*1594.0020.0002] -1F605 ; [*1595.0020.0002] -1F606 ; [*1596.0020.0002] -1F607 ; [*1597.0020.0002] -1F608 ; [*1598.0020.0002] -1F609 ; [*1599.0020.0002] -1F60A ; [*159A.0020.0002] -1F60B ; [*159B.0020.0002] -1F60C ; [*159C.0020.0002] -1F60D ; [*159D.0020.0002] -1F60E ; [*159E.0020.0002] -1F60F ; [*159F.0020.0002] -1F610 ; [*15A0.0020.0002] -1F611 ; [*15A1.0020.0002] -1F612 ; [*15A2.0020.0002] -1F613 ; [*15A3.0020.0002] -1F614 ; [*15A4.0020.0002] -1F615 ; [*15A5.0020.0002] -1F616 ; [*15A6.0020.0002] -1F617 ; [*15A7.0020.0002] -1F618 ; [*15A8.0020.0002] -1F619 ; [*15A9.0020.0002] -1F61A ; [*15AA.0020.0002] -1F61B ; [*15AB.0020.0002] -1F61C ; [*15AC.0020.0002] -1F61D ; [*15AD.0020.0002] -1F61E ; [*15AE.0020.0002] -1F61F ; [*15AF.0020.0002] -1F620 ; [*15B0.0020.0002] -1F621 ; [*15B1.0020.0002] -1F622 ; [*15B2.0020.0002] -1F623 ; [*15B3.0020.0002] -1F624 ; [*15B4.0020.0002] -1F625 ; [*15B5.0020.0002] -1F626 ; [*15B6.0020.0002] -1F627 ; [*15B7.0020.0002] -1F628 ; [*15B8.0020.0002] -1F629 ; [*15B9.0020.0002] -1F62A ; [*15BA.0020.0002] -1F62B ; [*15BB.0020.0002] -1F62C ; [*15BC.0020.0002] -1F62D ; [*15BD.0020.0002] -1F62E ; [*15BE.0020.0002] -1F62F ; [*15BF.0020.0002] -1F630 ; [*15C0.0020.0002] -1F631 ; [*15C1.0020.0002] -1F632 ; [*15C2.0020.0002] -1F633 ; [*15C3.0020.0002] -1F634 ; [*15C4.0020.0002] -1F635 ; [*15C5.0020.0002] -1F636 ; [*15C6.0020.0002] -1F637 ; [*15C7.0020.0002] -1F638 ; [*15C8.0020.0002] -1F639 ; [*15C9.0020.0002] -1F63A ; [*15CA.0020.0002] -1F63B ; [*15CB.0020.0002] -1F63C ; [*15CC.0020.0002] -1F63D ; [*15CD.0020.0002] -1F63E ; [*15CE.0020.0002] -1F63F ; [*15CF.0020.0002] -1F640 ; [*15D0.0020.0002] -1F641 ; [*15D1.0020.0002] -1F642 ; [*15D2.0020.0002] -1F643 ; [*15D3.0020.0002] -1F644 ; [*15D4.0020.0002] -1F645 ; [*15D5.0020.0002] -1F646 ; [*15D6.0020.0002] -1F647 ; [*15D7.0020.0002] -1F648 ; [*15D8.0020.0002] -1F649 ; [*15D9.0020.0002] -1F64A ; [*15DA.0020.0002] -1F64B ; [*15DB.0020.0002] -1F64C ; [*15DC.0020.0002] -1F64D ; [*15DD.0020.0002] -1F64E ; [*15DE.0020.0002] -1F64F ; [*15DF.0020.0002] -1F650 ; [*15E0.0020.0002] -1F651 ; [*15E1.0020.0002] -1F652 ; [*15E2.0020.0002] -1F653 ; [*15E3.0020.0002] -1F654 ; [*15E4.0020.0002] -1F655 ; [*15E5.0020.0002] -1F656 ; [*15E6.0020.0002] -1F657 ; [*15E7.0020.0002] -1F658 ; [*15E8.0020.0002] -1F659 ; [*15E9.0020.0002] -1F65A ; [*15EA.0020.0002] -1F65B ; [*15EB.0020.0002] -1F65C ; [*15EC.0020.0002] -1F65D ; [*15ED.0020.0002] -1F65E ; [*15EE.0020.0002] -1F65F ; [*15EF.0020.0002] -1F660 ; [*15F0.0020.0002] -1F661 ; [*15F1.0020.0002] -1F662 ; [*15F2.0020.0002] -1F663 ; [*15F3.0020.0002] -1F664 ; [*15F4.0020.0002] -1F665 ; [*15F5.0020.0002] -1F666 ; [*15F6.0020.0002] -1F667 ; [*15F7.0020.0002] -1F668 ; [*15F8.0020.0002] -1F669 ; [*15F9.0020.0002] -1F66A ; [*15FA.0020.0002] -1F66B ; [*15FB.0020.0002] -1F66C ; [*15FC.0020.0002] -1F66D ; [*15FD.0020.0002] -1F66E ; [*15FE.0020.0002] -1F66F ; [*15FF.0020.0002] -1F670 ; [*1600.0020.0002] -1F671 ; [*1601.0020.0002] -1F672 ; [*1602.0020.0002] -1F673 ; [*1603.0020.0002] -1F674 ; [*1604.0020.0002] -1F675 ; [*1605.0020.0002] -1F676 ; [*1606.0020.0002] -1F677 ; [*1607.0020.0002] -1F678 ; [*1608.0020.0002] -1F679 ; [*1609.0020.0002] -1F67A ; [*160A.0020.0002] -1F67B ; [*160B.0020.0002] -1F67C ; [*160C.0020.0002] -1F67D ; [*160D.0020.0002] -1F67E ; [*160E.0020.0002] -1F67F ; [*160F.0020.0002] -1F680 ; [*1610.0020.0002] -1F681 ; [*1611.0020.0002] -1F682 ; [*1612.0020.0002] -1F683 ; [*1613.0020.0002] -1F684 ; [*1614.0020.0002] -1F685 ; [*1615.0020.0002] -1F686 ; [*1616.0020.0002] -1F687 ; [*1617.0020.0002] -1F688 ; [*1618.0020.0002] -1F689 ; [*1619.0020.0002] -1F68A ; [*161A.0020.0002] -1F68B ; [*161B.0020.0002] -1F68C ; [*161C.0020.0002] -1F68D ; [*161D.0020.0002] -1F68E ; [*161E.0020.0002] -1F68F ; [*161F.0020.0002] -1F690 ; [*1620.0020.0002] -1F691 ; [*1621.0020.0002] -1F692 ; [*1622.0020.0002] -1F693 ; [*1623.0020.0002] -1F694 ; [*1624.0020.0002] -1F695 ; [*1625.0020.0002] -1F696 ; [*1626.0020.0002] -1F697 ; [*1627.0020.0002] -1F698 ; [*1628.0020.0002] -1F699 ; [*1629.0020.0002] -1F69A ; [*162A.0020.0002] -1F69B ; [*162B.0020.0002] -1F69C ; [*162C.0020.0002] -1F69D ; [*162D.0020.0002] -1F69E ; [*162E.0020.0002] -1F69F ; [*162F.0020.0002] -1F6A0 ; [*1630.0020.0002] -1F6A1 ; [*1631.0020.0002] -1F6A2 ; [*1632.0020.0002] -1F6A3 ; [*1633.0020.0002] -1F6A4 ; [*1634.0020.0002] -1F6A5 ; [*1635.0020.0002] -1F6A6 ; [*1636.0020.0002] -1F6A7 ; [*1637.0020.0002] -1F6A8 ; [*1638.0020.0002] -1F6A9 ; [*1639.0020.0002] -1F6AA ; [*163A.0020.0002] -1F6AB ; [*163B.0020.0002] -1F6AC ; [*163C.0020.0002] -1F6AD ; [*163D.0020.0002] -1F6AE ; [*163E.0020.0002] -1F6AF ; [*163F.0020.0002] -1F6B0 ; [*1640.0020.0002] -1F6B1 ; [*1641.0020.0002] -1F6B2 ; [*1642.0020.0002] -1F6B3 ; [*1643.0020.0002] -1F6B4 ; [*1644.0020.0002] -1F6B5 ; [*1645.0020.0002] -1F6B6 ; [*1646.0020.0002] -1F6B7 ; [*1647.0020.0002] -1F6B8 ; [*1648.0020.0002] -1F6B9 ; [*1649.0020.0002] -1F6BA ; [*164A.0020.0002] -1F6BB ; [*164B.0020.0002] -1F6BC ; [*164C.0020.0002] -1F6BD ; [*164D.0020.0002] -1F6BE ; [*164E.0020.0002] -1F6BF ; [*164F.0020.0002] -1F6C0 ; [*1650.0020.0002] -1F6C1 ; [*1651.0020.0002] -1F6C2 ; [*1652.0020.0002] -1F6C3 ; [*1653.0020.0002] -1F6C4 ; [*1654.0020.0002] -1F6C5 ; [*1655.0020.0002] -1F6C6 ; [*1656.0020.0002] -1F6C7 ; [*1657.0020.0002] -1F6C8 ; [*1658.0020.0002] -1F6C9 ; [*1659.0020.0002] -1F6CA ; [*165A.0020.0002] -1F6CB ; [*165B.0020.0002] -1F6CC ; [*165C.0020.0002] -1F6CD ; [*165D.0020.0002] -1F6CE ; [*165E.0020.0002] -1F6CF ; [*165F.0020.0002] -1F6D0 ; [*1660.0020.0002] -1F6E0 ; [*1661.0020.0002] -1F6E1 ; [*1662.0020.0002] -1F6E2 ; [*1663.0020.0002] -1F6E3 ; [*1664.0020.0002] -1F6E4 ; [*1665.0020.0002] -1F6E5 ; [*1666.0020.0002] -1F6E6 ; [*1667.0020.0002] -1F6E7 ; [*1668.0020.0002] -1F6E8 ; [*1669.0020.0002] -1F6E9 ; [*166A.0020.0002] -1F6EA ; [*166B.0020.0002] -1F6EB ; [*166C.0020.0002] -1F6EC ; [*166D.0020.0002] -1F6F0 ; [*166E.0020.0002] -1F6F1 ; [*166F.0020.0002] -1F6F2 ; [*1670.0020.0002] -1F6F3 ; [*1671.0020.0002] -1F700 ; [*1672.0020.0002] -1F701 ; [*1673.0020.0002] -1F702 ; [*1674.0020.0002] -1F703 ; [*1675.0020.0002] -1F704 ; [*1676.0020.0002] -1F705 ; [*1677.0020.0002] -1F706 ; [*1678.0020.0002] -1F707 ; [*1679.0020.0002] -1F708 ; [*167A.0020.0002] -1F709 ; [*167B.0020.0002] -1F70A ; [*167C.0020.0002] -1F70B ; [*167D.0020.0002] -1F70C ; [*167E.0020.0002] -1F70D ; [*167F.0020.0002] -1F70E ; [*1680.0020.0002] -1F70F ; [*1681.0020.0002] -1F710 ; [*1682.0020.0002] -1F711 ; [*1683.0020.0002] -1F712 ; [*1684.0020.0002] -1F713 ; [*1685.0020.0002] -1F714 ; [*1686.0020.0002] -1F715 ; [*1687.0020.0002] -1F716 ; [*1688.0020.0002] -1F717 ; [*1689.0020.0002] -1F718 ; [*168A.0020.0002] -1F719 ; [*168B.0020.0002] -1F71A ; [*168C.0020.0002] -1F71B ; [*168D.0020.0002] -1F71C ; [*168E.0020.0002] -1F71D ; [*168F.0020.0002] -1F71E ; [*1690.0020.0002] -1F71F ; [*1691.0020.0002] -1F720 ; [*1692.0020.0002] -1F721 ; [*1693.0020.0002] -1F722 ; [*1694.0020.0002] -1F723 ; [*1695.0020.0002] -1F724 ; [*1696.0020.0002] -1F725 ; [*1697.0020.0002] -1F726 ; [*1698.0020.0002] -1F727 ; [*1699.0020.0002] -1F728 ; [*169A.0020.0002] -1F729 ; [*169B.0020.0002] -1F72A ; [*169C.0020.0002] -1F72B ; [*169D.0020.0002] -1F72C ; [*169E.0020.0002] -1F72D ; [*169F.0020.0002] -1F72E ; [*16A0.0020.0002] -1F72F ; [*16A1.0020.0002] -1F730 ; [*16A2.0020.0002] -1F731 ; [*16A3.0020.0002] -1F732 ; [*16A4.0020.0002] -1F733 ; [*16A5.0020.0002] -1F734 ; [*16A6.0020.0002] -1F735 ; [*16A7.0020.0002] -1F736 ; [*16A8.0020.0002] -1F737 ; [*16A9.0020.0002] -1F738 ; [*16AA.0020.0002] -1F739 ; [*16AB.0020.0002] -1F73A ; [*16AC.0020.0002] -1F73B ; [*16AD.0020.0002] -1F73C ; [*16AE.0020.0002] -1F73D ; [*16AF.0020.0002] -1F73E ; [*16B0.0020.0002] -1F73F ; [*16B1.0020.0002] -1F740 ; [*16B2.0020.0002] -1F741 ; [*16B3.0020.0002] -1F742 ; [*16B4.0020.0002] -1F743 ; [*16B5.0020.0002] -1F744 ; [*16B6.0020.0002] -1F745 ; [*16B7.0020.0002] -1F746 ; [*16B8.0020.0002] -1F747 ; [*16B9.0020.0002] -1F748 ; [*16BA.0020.0002] -1F749 ; [*16BB.0020.0002] -1F74A ; [*16BC.0020.0002] -1F74B ; [*16BD.0020.0002] -1F74C ; [*16BE.0020.0002] -1F74D ; [*16BF.0020.0002] -1F74E ; [*16C0.0020.0002] -1F74F ; [*16C1.0020.0002] -1F750 ; [*16C2.0020.0002] -1F751 ; [*16C3.0020.0002] -1F752 ; [*16C4.0020.0002] -1F753 ; [*16C5.0020.0002] -1F754 ; [*16C6.0020.0002] -1F755 ; [*16C7.0020.0002] -1F756 ; [*16C8.0020.0002] -1F757 ; [*16C9.0020.0002] -1F758 ; [*16CA.0020.0002] -1F759 ; [*16CB.0020.0002] -1F75A ; [*16CC.0020.0002] -1F75B ; [*16CD.0020.0002] -1F75C ; [*16CE.0020.0002] -1F75D ; [*16CF.0020.0002] -1F75E ; [*16D0.0020.0002] -1F75F ; [*16D1.0020.0002] -1F760 ; [*16D2.0020.0002] -1F761 ; [*16D3.0020.0002] -1F762 ; [*16D4.0020.0002] -1F763 ; [*16D5.0020.0002] -1F764 ; [*16D6.0020.0002] -1F765 ; [*16D7.0020.0002] -1F766 ; [*16D8.0020.0002] -1F767 ; [*16D9.0020.0002] -1F768 ; [*16DA.0020.0002] -1F769 ; [*16DB.0020.0002] -1F76A ; [*16DC.0020.0002] -1F76B ; [*16DD.0020.0002] -1F76C ; [*16DE.0020.0002] -1F76D ; [*16DF.0020.0002] -1F76E ; [*16E0.0020.0002] -1F76F ; [*16E1.0020.0002] -1F770 ; [*16E2.0020.0002] -1F771 ; [*16E3.0020.0002] -1F772 ; [*16E4.0020.0002] -1F773 ; [*16E5.0020.0002] -1F780 ; [*16E6.0020.0002] -1F781 ; [*16E7.0020.0002] -1F782 ; [*16E8.0020.0002] -1F783 ; [*16E9.0020.0002] -1F784 ; [*16EA.0020.0002] -1F785 ; [*16EB.0020.0002] -1F786 ; [*16EC.0020.0002] -1F787 ; [*16ED.0020.0002] -1F788 ; [*16EE.0020.0002] -1F789 ; [*16EF.0020.0002] -1F78A ; [*16F0.0020.0002] -1F78B ; [*16F1.0020.0002] -1F78C ; [*16F2.0020.0002] -1F78D ; [*16F3.0020.0002] -1F78E ; [*16F4.0020.0002] -1F78F ; [*16F5.0020.0002] -1F790 ; [*16F6.0020.0002] -1F791 ; [*16F7.0020.0002] -1F792 ; [*16F8.0020.0002] -1F793 ; [*16F9.0020.0002] -1F794 ; [*16FA.0020.0002] -1F795 ; [*16FB.0020.0002] -1F796 ; [*16FC.0020.0002] -1F797 ; [*16FD.0020.0002] -1F798 ; [*16FE.0020.0002] -1F799 ; [*16FF.0020.0002] -1F79A ; [*1700.0020.0002] -1F79B ; [*1701.0020.0002] -1F79C ; [*1702.0020.0002] -1F79D ; [*1703.0020.0002] -1F79E ; [*1704.0020.0002] -1F79F ; [*1705.0020.0002] -1F7A0 ; [*1706.0020.0002] -1F7A1 ; [*1707.0020.0002] -1F7A2 ; [*1708.0020.0002] -1F7A3 ; [*1709.0020.0002] -1F7A4 ; [*170A.0020.0002] -1F7A5 ; [*170B.0020.0002] -1F7A6 ; [*170C.0020.0002] -1F7A7 ; [*170D.0020.0002] -1F7A8 ; [*170E.0020.0002] -1F7A9 ; [*170F.0020.0002] -1F7AA ; [*1710.0020.0002] -1F7AB ; [*1711.0020.0002] -1F7AC ; [*1712.0020.0002] -1F7AD ; [*1713.0020.0002] -1F7AE ; [*1714.0020.0002] -1F7AF ; [*1715.0020.0002] -1F7B0 ; [*1716.0020.0002] -1F7B1 ; [*1717.0020.0002] -1F7B2 ; [*1718.0020.0002] -1F7B3 ; [*1719.0020.0002] -1F7B4 ; [*171A.0020.0002] -1F7B5 ; [*171B.0020.0002] -1F7B6 ; [*171C.0020.0002] -1F7B7 ; [*171D.0020.0002] -1F7B8 ; [*171E.0020.0002] -1F7B9 ; [*171F.0020.0002] -1F7BA ; [*1720.0020.0002] -1F7BB ; [*1721.0020.0002] -1F7BC ; [*1722.0020.0002] -1F7BD ; [*1723.0020.0002] -1F7BE ; [*1724.0020.0002] -1F7BF ; [*1725.0020.0002] -1F7C0 ; [*1726.0020.0002] -1F7C1 ; [*1727.0020.0002] -1F7C2 ; [*1728.0020.0002] -1F7C3 ; [*1729.0020.0002] -1F7C4 ; [*172A.0020.0002] -1F7C5 ; [*172B.0020.0002] -1F7C6 ; [*172C.0020.0002] -1F7C7 ; [*172D.0020.0002] -1F7C8 ; [*172E.0020.0002] -1F7C9 ; [*172F.0020.0002] -1F7CA ; [*1730.0020.0002] -1F7CB ; [*1731.0020.0002] -1F7CC ; [*1732.0020.0002] -1F7CD ; [*1733.0020.0002] -1F7CE ; [*1734.0020.0002] -1F7CF ; [*1735.0020.0002] -1F7D0 ; [*1736.0020.0002] -1F7D1 ; [*1737.0020.0002] -1F7D2 ; [*1738.0020.0002] -1F7D3 ; [*1739.0020.0002] -1F7D4 ; [*173A.0020.0002] -1F800 ; [*173B.0020.0002] -1F801 ; [*173C.0020.0002] -1F802 ; [*173D.0020.0002] -1F803 ; [*173E.0020.0002] -1F804 ; [*173F.0020.0002] -1F805 ; [*1740.0020.0002] -1F806 ; [*1741.0020.0002] -1F807 ; [*1742.0020.0002] -1F808 ; [*1743.0020.0002] -1F809 ; [*1744.0020.0002] -1F80A ; [*1745.0020.0002] -1F80B ; [*1746.0020.0002] -1F810 ; [*1747.0020.0002] -1F811 ; [*1748.0020.0002] -1F812 ; [*1749.0020.0002] -1F813 ; [*174A.0020.0002] -1F814 ; [*174B.0020.0002] -1F815 ; [*174C.0020.0002] -1F816 ; [*174D.0020.0002] -1F817 ; [*174E.0020.0002] -1F818 ; [*174F.0020.0002] -1F819 ; [*1750.0020.0002] -1F81A ; [*1751.0020.0002] -1F81B ; [*1752.0020.0002] -1F81C ; [*1753.0020.0002] -1F81D ; [*1754.0020.0002] -1F81E ; [*1755.0020.0002] -1F81F ; [*1756.0020.0002] -1F820 ; [*1757.0020.0002] -1F821 ; [*1758.0020.0002] -1F822 ; [*1759.0020.0002] -1F823 ; [*175A.0020.0002] -1F824 ; [*175B.0020.0002] -1F825 ; [*175C.0020.0002] -1F826 ; [*175D.0020.0002] -1F827 ; [*175E.0020.0002] -1F828 ; [*175F.0020.0002] -1F829 ; [*1760.0020.0002] -1F82A ; [*1761.0020.0002] -1F82B ; [*1762.0020.0002] -1F82C ; [*1763.0020.0002] -1F82D ; [*1764.0020.0002] -1F82E ; [*1765.0020.0002] -1F82F ; [*1766.0020.0002] -1F830 ; [*1767.0020.0002] -1F831 ; [*1768.0020.0002] -1F832 ; [*1769.0020.0002] -1F833 ; [*176A.0020.0002] -1F834 ; [*176B.0020.0002] -1F835 ; [*176C.0020.0002] -1F836 ; [*176D.0020.0002] -1F837 ; [*176E.0020.0002] -1F838 ; [*176F.0020.0002] -1F839 ; [*1770.0020.0002] -1F83A ; [*1771.0020.0002] -1F83B ; [*1772.0020.0002] -1F83C ; [*1773.0020.0002] -1F83D ; [*1774.0020.0002] -1F83E ; [*1775.0020.0002] -1F83F ; [*1776.0020.0002] -1F840 ; [*1777.0020.0002] -1F841 ; [*1778.0020.0002] -1F842 ; [*1779.0020.0002] -1F843 ; [*177A.0020.0002] -1F844 ; [*177B.0020.0002] -1F845 ; [*177C.0020.0002] -1F846 ; [*177D.0020.0002] -1F847 ; [*177E.0020.0002] -1F850 ; [*177F.0020.0002] -1F851 ; [*1780.0020.0002] -1F852 ; [*1781.0020.0002] -1F853 ; [*1782.0020.0002] -1F854 ; [*1783.0020.0002] -1F855 ; [*1784.0020.0002] -1F856 ; [*1785.0020.0002] -1F857 ; [*1786.0020.0002] -1F858 ; [*1787.0020.0002] -1F859 ; [*1788.0020.0002] -1F860 ; [*1789.0020.0002] -1F861 ; [*178A.0020.0002] -1F862 ; [*178B.0020.0002] -1F863 ; [*178C.0020.0002] -1F864 ; [*178D.0020.0002] -1F865 ; [*178E.0020.0002] -1F866 ; [*178F.0020.0002] -1F867 ; [*1790.0020.0002] -1F868 ; [*1791.0020.0002] -1F869 ; [*1792.0020.0002] -1F86A ; [*1793.0020.0002] -1F86B ; [*1794.0020.0002] -1F86C ; [*1795.0020.0002] -1F86D ; [*1796.0020.0002] -1F86E ; [*1797.0020.0002] -1F86F ; [*1798.0020.0002] -1F870 ; [*1799.0020.0002] -1F871 ; [*179A.0020.0002] -1F872 ; [*179B.0020.0002] -1F873 ; [*179C.0020.0002] -1F874 ; [*179D.0020.0002] -1F875 ; [*179E.0020.0002] -1F876 ; [*179F.0020.0002] -1F877 ; [*17A0.0020.0002] -1F878 ; [*17A1.0020.0002] -1F879 ; [*17A2.0020.0002] -1F87A ; [*17A3.0020.0002] -1F87B ; [*17A4.0020.0002] -1F87C ; [*17A5.0020.0002] -1F87D ; [*17A6.0020.0002] -1F87E ; [*17A7.0020.0002] -1F87F ; [*17A8.0020.0002] -1F880 ; [*17A9.0020.0002] -1F881 ; [*17AA.0020.0002] -1F882 ; [*17AB.0020.0002] -1F883 ; [*17AC.0020.0002] -1F884 ; [*17AD.0020.0002] -1F885 ; [*17AE.0020.0002] -1F886 ; [*17AF.0020.0002] -1F887 ; [*17B0.0020.0002] -1F890 ; [*17B1.0020.0002] -1F891 ; [*17B2.0020.0002] -1F892 ; [*17B3.0020.0002] -1F893 ; [*17B4.0020.0002] -1F894 ; [*17B5.0020.0002] -1F895 ; [*17B6.0020.0002] -1F896 ; [*17B7.0020.0002] -1F897 ; [*17B8.0020.0002] -1F898 ; [*17B9.0020.0002] -1F899 ; [*17BA.0020.0002] -1F89A ; [*17BB.0020.0002] -1F89B ; [*17BC.0020.0002] -1F89C ; [*17BD.0020.0002] -1F89D ; [*17BE.0020.0002] -1F89E ; [*17BF.0020.0002] -1F89F ; [*17C0.0020.0002] -1F8A0 ; [*17C1.0020.0002] -1F8A1 ; [*17C2.0020.0002] -1F8A2 ; [*17C3.0020.0002] -1F8A3 ; [*17C4.0020.0002] -1F8A4 ; [*17C5.0020.0002] -1F8A5 ; [*17C6.0020.0002] -1F8A6 ; [*17C7.0020.0002] -1F8A7 ; [*17C8.0020.0002] -1F8A8 ; [*17C9.0020.0002] -1F8A9 ; [*17CA.0020.0002] -1F8AA ; [*17CB.0020.0002] -1F8AB ; [*17CC.0020.0002] -1F8AC ; [*17CD.0020.0002] -1F8AD ; [*17CE.0020.0002] -1F910 ; [*1581.0020.0002] -1F911 ; [*1582.0020.0002] -1F912 ; [*1583.0020.0002] -1F913 ; [*1584.0020.0002] -1F914 ; [*1585.0020.0002] -1F915 ; [*1586.0020.0002] -1F916 ; [*1587.0020.0002] -1F917 ; [*1588.0020.0002] -1F918 ; [*1589.0020.0002] -1F980 ; [*158A.0020.0002] -1F981 ; [*158B.0020.0002] -1F982 ; [*158C.0020.0002] -1F983 ; [*158D.0020.0002] -1F984 ; [*158E.0020.0002] -1F9C0 ; [*158F.0020.0002] -0332 ; [.0000.0021.0002] -0313 ; [.0000.0022.0002] -0343 ; [.0000.0022.0002] -0486 ; [.0000.0022.0002] -2CF1 ; [.0000.0022.0002] -0314 ; [.0000.0023.0002] -0485 ; [.0000.0023.0002] -2CF0 ; [.0000.0023.0002] -0301 ; [.0000.0024.0002] -0341 ; [.0000.0024.0002] -0954 ; [.0000.0024.0002] -0300 ; [.0000.0025.0002] -0340 ; [.0000.0025.0002] -0953 ; [.0000.0025.0002] -0306 ; [.0000.0026.0002] -0302 ; [.0000.0027.0002] -030C ; [.0000.0028.0002] -030A ; [.0000.0029.0002] -0342 ; [.0000.002A.0002] -0308 ; [.0000.002B.0002] -0344 ; [.0000.002B.0002][.0000.0024.0002] -030B ; [.0000.002C.0002] -0303 ; [.0000.002D.0002] -0307 ; [.0000.002E.0002] -0338 ; [.0000.002F.0002] -0327 ; [.0000.0030.0002] -0328 ; [.0000.0031.0002] -0304 ; [.0000.0032.0002] -030D ; [.0000.0033.0002] -030E ; [.0000.0033.0002] -0312 ; [.0000.0033.0002] -0315 ; [.0000.0033.0002] -031A ; [.0000.0033.0002] -033D ; [.0000.0033.0002] -033E ; [.0000.0033.0002] -033F ; [.0000.0033.0002] -0346 ; [.0000.0033.0002] -034A ; [.0000.0033.0002] -034B ; [.0000.0033.0002] -034C ; [.0000.0033.0002] -0350 ; [.0000.0033.0002] -0351 ; [.0000.0033.0002] -0352 ; [.0000.0033.0002] -0357 ; [.0000.0033.0002] -035B ; [.0000.0033.0002] -035D ; [.0000.0033.0002] -035E ; [.0000.0033.0002] -0484 ; [.0000.0033.0002] -0487 ; [.0000.0033.0002] -0741 ; [.0000.0033.0002] -0745 ; [.0000.0033.0002] -17CB ; [.0000.0033.0002] -17CC ; [.0000.0033.0002] -17CD ; [.0000.0033.0002] -17CE ; [.0000.0033.0002] -17CF ; [.0000.0033.0002] -17D0 ; [.0000.0033.0002] -17D1 ; [.0000.0033.0002] -17DD ; [.0000.0033.0002] -1AB0 ; [.0000.0033.0002] -1AB1 ; [.0000.0033.0002] -1AB2 ; [.0000.0033.0002] -1AB3 ; [.0000.0033.0002] -1AB4 ; [.0000.0033.0002] -1ABB ; [.0000.0033.0002] -1ABC ; [.0000.0033.0002] -1DC0 ; [.0000.0033.0002] -1DC1 ; [.0000.0033.0002] -1DC3 ; [.0000.0033.0002] -1DC4 ; [.0000.0033.0002] -1DC5 ; [.0000.0033.0002] -1DC6 ; [.0000.0033.0002] -1DC7 ; [.0000.0033.0002] -1DC8 ; [.0000.0033.0002] -1DC9 ; [.0000.0033.0002] -1DCB ; [.0000.0033.0002] -1DCC ; [.0000.0033.0002] -1DCD ; [.0000.0033.0002] -1DCE ; [.0000.0033.0002] -1DD1 ; [.0000.0033.0002] -1DF5 ; [.0000.0033.0002] -1DFE ; [.0000.0033.0002] -20F0 ; [.0000.0033.0002] -2CEF ; [.0000.0033.0002] -A67C ; [.0000.0033.0002] -A67D ; [.0000.0033.0002] -10AE5 ; [.0000.0033.0002] -1BC9D ; [.0000.0033.0002] -0316 ; [.0000.0034.0002] -0317 ; [.0000.0034.0002] -0318 ; [.0000.0034.0002] -0319 ; [.0000.0034.0002] -031C ; [.0000.0034.0002] -031D ; [.0000.0034.0002] -031E ; [.0000.0034.0002] -031F ; [.0000.0034.0002] -0320 ; [.0000.0034.0002] -0329 ; [.0000.0034.0002] -032A ; [.0000.0034.0002] -032B ; [.0000.0034.0002] -032C ; [.0000.0034.0002] -032F ; [.0000.0034.0002] -0333 ; [.0000.0034.0002] -033A ; [.0000.0034.0002] -033B ; [.0000.0034.0002] -033C ; [.0000.0034.0002] -0347 ; [.0000.0034.0002] -0348 ; [.0000.0034.0002] -0349 ; [.0000.0034.0002] -034D ; [.0000.0034.0002] -034E ; [.0000.0034.0002] -0353 ; [.0000.0034.0002] -0354 ; [.0000.0034.0002] -0355 ; [.0000.0034.0002] -0356 ; [.0000.0034.0002] -0359 ; [.0000.0034.0002] -035A ; [.0000.0034.0002] -035C ; [.0000.0034.0002] -035F ; [.0000.0034.0002] -0362 ; [.0000.0034.0002] -0742 ; [.0000.0034.0002] -0746 ; [.0000.0034.0002] -0859 ; [.0000.0034.0002] -085A ; [.0000.0034.0002] -085B ; [.0000.0034.0002] -1AB5 ; [.0000.0034.0002] -1AB6 ; [.0000.0034.0002] -1AB7 ; [.0000.0034.0002] -1AB8 ; [.0000.0034.0002] -1AB9 ; [.0000.0034.0002] -1ABA ; [.0000.0034.0002] -1ABD ; [.0000.0034.0002] -1DC2 ; [.0000.0034.0002] -1DCF ; [.0000.0034.0002] -1DD0 ; [.0000.0034.0002] -1DFC ; [.0000.0034.0002] -1DFD ; [.0000.0034.0002] -1DFF ; [.0000.0034.0002] -20EC ; [.0000.0034.0002] -20ED ; [.0000.0034.0002] -20EE ; [.0000.0034.0002] -20EF ; [.0000.0034.0002] -FE27 ; [.0000.0034.0002] -10A0D ; [.0000.0034.0002] -10AE6 ; [.0000.0034.0002] -0336 ; [.0000.0035.0002] -0337 ; [.0000.0035.0002] -20D8 ; [.0000.0035.0002] -20D9 ; [.0000.0035.0002] -20DA ; [.0000.0035.0002] -20E5 ; [.0000.0035.0002] -20EA ; [.0000.0035.0002] -20EB ; [.0000.0035.0002] -1BC9E ; [.0000.0035.0002] -1ABE ; [.0000.0036.0002] -20DD ; [.0000.0036.0002] -20DE ; [.0000.0036.0002] -20DF ; [.0000.0036.0002] -20E0 ; [.0000.0036.0002] -20E2 ; [.0000.0036.0002] -20E3 ; [.0000.0036.0002] -20E4 ; [.0000.0036.0002] -3099 ; [.0000.0037.0002] -FF9E ; [.0000.0037.0012] -309A ; [.0000.0038.0002] -FF9F ; [.0000.0038.0012] -0335 ; [.0000.0039.0002] -0305 ; [.0000.003A.0002] -0309 ; [.0000.003B.0002] -030F ; [.0000.003C.0002] -0310 ; [.0000.003D.0002] -0311 ; [.0000.003E.0002] -031B ; [.0000.003F.0002] -0321 ; [.0000.0040.0002] -0322 ; [.0000.0041.0002] -0323 ; [.0000.0042.0002] -0324 ; [.0000.0043.0002] -0325 ; [.0000.0044.0002] -0326 ; [.0000.0045.0002] -032D ; [.0000.0046.0002] -032E ; [.0000.0047.0002] -0330 ; [.0000.0048.0002] -0331 ; [.0000.0049.0002] -0334 ; [.0000.004A.0002] -0339 ; [.0000.004B.0002] -0345 ; [.0000.004C.0002] -0358 ; [.0000.004D.0002] -0360 ; [.0000.004E.0002] -FE22 ; [.0000.004E.0002] -FE29 ; [.0000.004E.0002] -0361 ; [.0000.004F.0002] -FE20 ; [.0000.004F.0002] -0483 ; [.0000.0050.0002] -FE2E ; [.0000.0050.0002] -A66F ; [.0000.0051.0002] -05B0 ; [.0000.0052.0002] -05B1 ; [.0000.0053.0002] -05B2 ; [.0000.0054.0002] -05B3 ; [.0000.0055.0002] -05B4 ; [.0000.0056.0002] -05B5 ; [.0000.0057.0002] -05B6 ; [.0000.0058.0002] -05B7 ; [.0000.0059.0002] -05B8 ; [.0000.005A.0002] -05C7 ; [.0000.005A.0002] -05B9 ; [.0000.005B.0002] -05BA ; [.0000.005B.0002] -05BB ; [.0000.005C.0002] -05C2 ; [.0000.005D.0002] -05C1 ; [.0000.005E.0002] -05BC ; [.0000.005F.0002] -05BF ; [.0000.0060.0002] -FB1E ; [.0000.0061.0002] -081C ; [.0000.0062.0002] -081D ; [.0000.0062.0002] -081E ; [.0000.0063.0002] -081F ; [.0000.0063.0002] -0820 ; [.0000.0063.0002] -0821 ; [.0000.0064.0002] -0822 ; [.0000.0064.0002] -0823 ; [.0000.0064.0002] -0824 ; [.0000.0065.0002] -0825 ; [.0000.0065.0002] -0826 ; [.0000.0066.0002] -0827 ; [.0000.0066.0002] -0828 ; [.0000.0067.0002] -0829 ; [.0000.0067.0002] -082A ; [.0000.0067.0002] -082B ; [.0000.0068.0002] -082C ; [.0000.0069.0002] -0818 ; [.0000.006A.0002] -0819 ; [.0000.006B.0002] -082D ; [.0000.006C.0002] -064B ; [.0000.006D.0002] -FE71 ; [.0000.006D.0018] -FE70 ; [.0000.006D.001A] -08F0 ; [.0000.006E.0002] -08E7 ; [.0000.006F.0002] -064C ; [.0000.0070.0002] -FE72 ; [.0000.0070.001A] -FC5E ; [.0000.0070.001A][.0000.0080.001A] -08F1 ; [.0000.0071.0002] -08E8 ; [.0000.0072.0002] -064D ; [.0000.0073.0002] -FE74 ; [.0000.0073.001A] -FC5F ; [.0000.0073.001A][.0000.0080.001A] -08F2 ; [.0000.0074.0002] -08E9 ; [.0000.0075.0002] -064E ; [.0000.0076.0002] -FE77 ; [.0000.0076.0018] -FE76 ; [.0000.0076.001A] -FCF2 ; [.0000.0076.0018][.0000.0080.0018] -FC60 ; [.0000.0076.001A][.0000.0080.001A] -08E4 ; [.0000.0077.0002] -08F4 ; [.0000.0078.0002] -08F5 ; [.0000.0079.0002] -064F ; [.0000.007A.0002] -FE79 ; [.0000.007A.0018] -FE78 ; [.0000.007A.001A] -FCF3 ; [.0000.007A.0018][.0000.0080.0018] -FC61 ; [.0000.007A.001A][.0000.0080.001A] -08E5 ; [.0000.007B.0002] -08FE ; [.0000.007C.0002] -0650 ; [.0000.007D.0002] -FE7B ; [.0000.007D.0018] -FE7A ; [.0000.007D.001A] -FCF4 ; [.0000.007D.0018][.0000.0080.0018] -FC62 ; [.0000.007D.001A][.0000.0080.001A] -08E6 ; [.0000.007E.0002] -08F6 ; [.0000.007F.0002] -0651 ; [.0000.0080.0002] -11237 ; [.0000.0080.0002] -FE7D ; [.0000.0080.0018] -FE7C ; [.0000.0080.001A] -FC63 ; [.0000.0080.001A][.0000.0098.001A] -0652 ; [.0000.0081.0002] -FE7F ; [.0000.0081.0018] -FE7E ; [.0000.0081.001A] -0653 ; [.0000.0082.0002] -0654 ; [.0000.0083.0002] -0655 ; [.0000.0084.0002] -065F ; [.0000.0085.0002] -0656 ; [.0000.0086.0002] -0657 ; [.0000.0087.0002] -0658 ; [.0000.0088.0002] -08FF ; [.0000.0089.0002] -0659 ; [.0000.008A.0002] -065A ; [.0000.008B.0002] -065B ; [.0000.008C.0002] -065C ; [.0000.008D.0002] -065D ; [.0000.008E.0002] -065E ; [.0000.008F.0002] -08E3 ; [.0000.0090.0002] -08F7 ; [.0000.0091.0002] -08F8 ; [.0000.0092.0002] -08FD ; [.0000.0093.0002] -08FB ; [.0000.0094.0002] -08FC ; [.0000.0095.0002] -08F9 ; [.0000.0096.0002] -08FA ; [.0000.0097.0002] -0670 ; [.0000.0098.0002] -0711 ; [.0000.0099.0002] -0730 ; [.0000.009A.0002] -0731 ; [.0000.009B.0002] -0732 ; [.0000.009C.0002] -0733 ; [.0000.009D.0002] -0734 ; [.0000.009E.0002] -0735 ; [.0000.009F.0002] -0736 ; [.0000.00A0.0002] -0737 ; [.0000.00A1.0002] -0738 ; [.0000.00A2.0002] -0739 ; [.0000.00A3.0002] -073A ; [.0000.00A4.0002] -073B ; [.0000.00A5.0002] -073C ; [.0000.00A6.0002] -073D ; [.0000.00A7.0002] -073E ; [.0000.00A8.0002] -073F ; [.0000.00A9.0002] -07EB ; [.0000.00AA.0002] -07EC ; [.0000.00AB.0002] -07ED ; [.0000.00AC.0002] -07EE ; [.0000.00AD.0002] -07EF ; [.0000.00AE.0002] -07F0 ; [.0000.00AF.0002] -07F1 ; [.0000.00B0.0002] -07F2 ; [.0000.00B1.0002] -07F3 ; [.0000.00B2.0002] -135F ; [.0000.00B3.0002] -135E ; [.0000.00B4.0002] -135D ; [.0000.00B5.0002] -A6F0 ; [.0000.00B6.0002] -A6F1 ; [.0000.00B7.0002] -16AF0 ; [.0000.00B8.0002] -16AF1 ; [.0000.00B9.0002] -16AF2 ; [.0000.00BA.0002] -16AF3 ; [.0000.00BB.0002] -16AF4 ; [.0000.00BC.0002] -093C ; [.0000.00BD.0002] -09BC ; [.0000.00BD.0002] -0A3C ; [.0000.00BD.0002] -0ABC ; [.0000.00BD.0002] -0B3C ; [.0000.00BD.0002] -0CBC ; [.0000.00BD.0002] -1B34 ; [.0000.00BD.0002] -1BE6 ; [.0000.00BD.0002] -1C37 ; [.0000.00BD.0002] -A9B3 ; [.0000.00BD.0002] -110BA ; [.0000.00BD.0002] -11173 ; [.0000.00BD.0002] -111CA ; [.0000.00BD.0002] -11236 ; [.0000.00BD.0002] -112E9 ; [.0000.00BD.0002] -1133C ; [.0000.00BD.0002] -114C3 ; [.0000.00BD.0002] -115C0 ; [.0000.00BD.0002] -116B7 ; [.0000.00BD.0002] -0900 ; [.0000.00BE.0002] -0901 ; [.0000.00BE.0002] -0981 ; [.0000.00BE.0002] -0A01 ; [.0000.00BE.0002] -0A81 ; [.0000.00BE.0002] -0B01 ; [.0000.00BE.0002] -0C00 ; [.0000.00BE.0002] -0C01 ; [.0000.00BE.0002] -0C81 ; [.0000.00BE.0002] -0D01 ; [.0000.00BE.0002] -1B00 ; [.0000.00BE.0002] -1B01 ; [.0000.00BE.0002] -A980 ; [.0000.00BE.0002] -11000 ; [.0000.00BE.0002] -11080 ; [.0000.00BE.0002] -11100 ; [.0000.00BE.0002] -11180 ; [.0000.00BE.0002] -11301 ; [.0000.00BE.0002] -114BF ; [.0000.00BE.0002] -115BC ; [.0000.00BE.0002] -11640 ; [.0000.00BE.0002] -0902 ; [.0000.00BF.0002] -0982 ; [.0000.00BF.0002] -0A02 ; [.0000.00BF.0002] -0A82 ; [.0000.00BF.0002] -0B02 ; [.0000.00BF.0002] -0B82 ; [.0000.00BF.0002] -0C02 ; [.0000.00BF.0002] -0C82 ; [.0000.00BF.0002] -0D02 ; [.0000.00BF.0002] -0D82 ; [.0000.00BF.0002] -0F7E ; [.0000.00BF.0002] -1036 ; [.0000.00BF.0002] -17C6 ; [.0000.00BF.0002] -1A74 ; [.0000.00BF.0002] -1B02 ; [.0000.00BF.0002] -1B80 ; [.0000.00BF.0002] -1CED ; [.0000.00BF.0002] -A80B ; [.0000.00BF.0002] -A880 ; [.0000.00BF.0002] -A981 ; [.0000.00BF.0002] -10A0E ; [.0000.00BF.0002] -11001 ; [.0000.00BF.0002] -11081 ; [.0000.00BF.0002] -11101 ; [.0000.00BF.0002] -11181 ; [.0000.00BF.0002] -11234 ; [.0000.00BF.0002] -112DF ; [.0000.00BF.0002] -11300 ; [.0000.00BF.0002] -11302 ; [.0000.00BF.0002] -114C0 ; [.0000.00BF.0002] -115BD ; [.0000.00BF.0002] -1163D ; [.0000.00BF.0002] -116AB ; [.0000.00BF.0002] -0903 ; [.0000.00C0.0002] -0983 ; [.0000.00C0.0002] -0A03 ; [.0000.00C0.0002] -0A83 ; [.0000.00C0.0002] -0B03 ; [.0000.00C0.0002] -0C03 ; [.0000.00C0.0002] -0C83 ; [.0000.00C0.0002] -0D03 ; [.0000.00C0.0002] -0D83 ; [.0000.00C0.0002] -0F7F ; [.0000.00C0.0002] -1038 ; [.0000.00C0.0002] -17C7 ; [.0000.00C0.0002] -1B04 ; [.0000.00C0.0002] -1B82 ; [.0000.00C0.0002] -1CF2 ; [.0000.00C0.0002] -1CF3 ; [.0000.00C0.0002] -A881 ; [.0000.00C0.0002] -A983 ; [.0000.00C0.0002] -10A0F ; [.0000.00C0.0002] -11002 ; [.0000.00C0.0002] -11082 ; [.0000.00C0.0002] -11102 ; [.0000.00C0.0002] -11182 ; [.0000.00C0.0002] -11303 ; [.0000.00C0.0002] -114C1 ; [.0000.00C0.0002] -115BE ; [.0000.00C0.0002] -1163E ; [.0000.00C0.0002] -116AC ; [.0000.00C0.0002] -0A70 ; [.0000.00C1.0002] -0A71 ; [.0000.00C2.0002] -1B03 ; [.0000.00C3.0002] -A982 ; [.0000.00C4.0002] -1B81 ; [.0000.00C5.0002] -ABEC ; [.0000.00C6.0002] -10A38 ; [.0000.00C7.0002] -10A39 ; [.0000.00C8.0002] -10A3A ; [.0000.00C9.0002] -111CB ; [.0000.00CA.0002] -111CC ; [.0000.00CB.0002] -0E4E ; [.0000.00CC.0002] -0E47 ; [.0000.00CD.0002] -0E48 ; [.0000.00CE.0002] -0E49 ; [.0000.00CF.0002] -0E4A ; [.0000.00D0.0002] -0E4B ; [.0000.00D1.0002] -0E4C ; [.0000.00D2.0002] -0E4D ; [.0000.00D3.0002] -0EC8 ; [.0000.00D4.0002] -0EC9 ; [.0000.00D5.0002] -0ECA ; [.0000.00D6.0002] -0ECB ; [.0000.00D7.0002] -0ECC ; [.0000.00D8.0002] -0ECD ; [.0000.00D9.0002] -AABF ; [.0000.00DA.0002] -AAC1 ; [.0000.00DB.0002] -0F39 ; [.0000.00DC.0002] -A92B ; [.0000.00DD.0002] -A92C ; [.0000.00DE.0002] -A92D ; [.0000.00DF.0002] -1037 ; [.0000.00E0.0002] -17C8 ; [.0000.00E1.0002] -17C9 ; [.0000.00E2.0002] -17CA ; [.0000.00E3.0002] -1A75 ; [.0000.00E4.0002] -1A76 ; [.0000.00E5.0002] -1A77 ; [.0000.00E6.0002] -1A78 ; [.0000.00E7.0002] -1A79 ; [.0000.00E8.0002] -1A7A ; [.0000.00E9.0002] -1A7B ; [.0000.00EA.0002] -1A7C ; [.0000.00EB.0002] -1939 ; [.0000.00EC.0002] -193A ; [.0000.00ED.0002] -193B ; [.0000.00EE.0002] -16B30 ; [.0000.00EF.0002] -16B31 ; [.0000.00F0.0002] -16B32 ; [.0000.00F1.0002] -16B33 ; [.0000.00F2.0002] -16B34 ; [.0000.00F3.0002] -16B35 ; [.0000.00F4.0002] -16B36 ; [.0000.00F5.0002] -302A ; [.0000.00F6.0002] -302B ; [.0000.00F7.0002] -302C ; [.0000.00F8.0002] -302D ; [.0000.00F9.0002] -302E ; [.0000.00FA.0002] -302F ; [.0000.00FB.0002] -20D0 ; [.0000.00FC.0002] -20D1 ; [.0000.00FD.0002] -20D2 ; [.0000.00FE.0002] -20D3 ; [.0000.00FE.0002] -20D4 ; [.0000.00FF.0002] -20D5 ; [.0000.0100.0002] -20D6 ; [.0000.0101.0002] -20D7 ; [.0000.0102.0002] -20DB ; [.0000.0103.0002] -20DC ; [.0000.0104.0002] -20E1 ; [.0000.0105.0002] -20E6 ; [.0000.0106.0002] -20E7 ; [.0000.0107.0002] -20E8 ; [.0000.0108.0002] -20E9 ; [.0000.0109.0002] -101FD ; [.0000.010A.0002] -02D0 ; [.1B74.0020.0002] -02D1 ; [.1B75.0020.0002] -0971 ; [.1B76.0020.0002] -0E46 ; [.1B77.0020.0002] -0EC6 ; [.1B78.0020.0002] -17D7 ; [.1B79.0020.0002] -1AA7 ; [.1B7A.0020.0002] -A9CF ; [.1B7B.0020.0002] -A9E6 ; [.1B7C.0020.0002] -AA70 ; [.1B7D.0020.0002] -AADD ; [.1B7E.0020.0002] -AAF3 ; [.1B7F.0020.0002] -AAF4 ; [.1B80.0020.0002] -16B42 ; [.1B81.0020.0002] -16B43 ; [.1B82.0020.0002] -3005 ; [.1B83.0020.0002] -303B ; [.1B84.0020.0002] -3031 ; [.1B85.0020.0002] -3032 ; [.1B85.0020.0002][.0000.0037.0002] -3033 ; [.1B86.0020.0002] -3034 ; [.1B86.0020.0002][.0000.0037.0002] -3035 ; [.1B87.0020.0002] -309D ; [.1B88.0020.0002] -309E ; [.1B88.0020.0002][.0000.0037.0002] -30FC ; [.1B89.0020.0002] -FF70 ; [.1B89.0020.0012] -30FD ; [.1B8A.0020.0002] -30FE ; [.1B8A.0020.0002][.0000.0037.0002] -00A4 ; [.1B8B.0020.0002] -00A2 ; [.1B8C.0020.0002] -FFE0 ; [.1B8C.0020.0003] -0024 ; [.1B8D.0020.0002] -FF04 ; [.1B8D.0020.0003] -FE69 ; [.1B8D.0020.000F] -00A3 ; [.1B8E.0020.0002] -FFE1 ; [.1B8E.0020.0003] -00A5 ; [.1B8F.0020.0002] -FFE5 ; [.1B8F.0020.0003] -058F ; [.1B90.0020.0002] -060B ; [.1B91.0020.0002] -09F2 ; [.1B92.0020.0002] -09F3 ; [.1B93.0020.0002] -09FB ; [.1B94.0020.0002] -0AF1 ; [.1B95.0020.0002] -A838 ; [.1B96.0020.0002] -0BF9 ; [.1B97.0020.0002] -0E3F ; [.1B98.0020.0002] -17DB ; [.1B99.0020.0002] -20A0 ; [.1B9A.0020.0002] -20A1 ; [.1B9B.0020.0002] -20A2 ; [.1B9C.0020.0002] -20A3 ; [.1B9D.0020.0002] -20A4 ; [.1B9E.0020.0002] -20A5 ; [.1B9F.0020.0002] -20A6 ; [.1BA0.0020.0002] -20A7 ; [.1BA1.0020.0002] -20A9 ; [.1BA2.0020.0002] -FFE6 ; [.1BA2.0020.0003] -20AA ; [.1BA3.0020.0002] -20AB ; [.1BA4.0020.0002] -20AC ; [.1BA5.0020.0002] -20AD ; [.1BA6.0020.0002] -20AE ; [.1BA7.0020.0002] -20AF ; [.1BA8.0020.0002] -20B0 ; [.1BA9.0020.0002] -20B1 ; [.1BAA.0020.0002] -20B2 ; [.1BAB.0020.0002] -20B3 ; [.1BAC.0020.0002] -20B4 ; [.1BAD.0020.0002] -20B5 ; [.1BAE.0020.0002] -20B6 ; [.1BAF.0020.0002] -20B7 ; [.1BB0.0020.0002] -20B8 ; [.1BB1.0020.0002] -20B9 ; [.1BB2.0020.0002] -20BA ; [.1BB3.0020.0002] -20BB ; [.1BB4.0020.0002] -20BC ; [.1BB5.0020.0002] -20BD ; [.1BB6.0020.0002] -20BE ; [.1BB7.0020.0002] -0030 ; [.1BB8.0020.0002] -0660 ; [.1BB8.0020.0002] -06F0 ; [.1BB8.0020.0002] -07C0 ; [.1BB8.0020.0002] -0966 ; [.1BB8.0020.0002] -09E6 ; [.1BB8.0020.0002] -0A66 ; [.1BB8.0020.0002] -0AE6 ; [.1BB8.0020.0002] -0B66 ; [.1BB8.0020.0002] -0BE6 ; [.1BB8.0020.0002] -0C66 ; [.1BB8.0020.0002] -0C78 ; [.1BB8.0020.0002] -0CE6 ; [.1BB8.0020.0002] -0D66 ; [.1BB8.0020.0002] -0DE6 ; [.1BB8.0020.0002] -0E50 ; [.1BB8.0020.0002] -0ED0 ; [.1BB8.0020.0002] -0F20 ; [.1BB8.0020.0002] -1040 ; [.1BB8.0020.0002] -1090 ; [.1BB8.0020.0002] -17E0 ; [.1BB8.0020.0002] -17F0 ; [.1BB8.0020.0002] -1810 ; [.1BB8.0020.0002] -1946 ; [.1BB8.0020.0002] -19D0 ; [.1BB8.0020.0002] -1A80 ; [.1BB8.0020.0002] -1A90 ; [.1BB8.0020.0002] -1B50 ; [.1BB8.0020.0002] -1BB0 ; [.1BB8.0020.0002] -1C40 ; [.1BB8.0020.0002] -1C50 ; [.1BB8.0020.0002] -3007 ; [.1BB8.0020.0002] -A620 ; [.1BB8.0020.0002] -A8D0 ; [.1BB8.0020.0002] -A900 ; [.1BB8.0020.0002] -A9D0 ; [.1BB8.0020.0002] -A9F0 ; [.1BB8.0020.0002] -AA50 ; [.1BB8.0020.0002] -ABF0 ; [.1BB8.0020.0002] -1018A ; [.1BB8.0020.0002] -104A0 ; [.1BB8.0020.0002] -11066 ; [.1BB8.0020.0002] -110F0 ; [.1BB8.0020.0002] -11136 ; [.1BB8.0020.0002] -111D0 ; [.1BB8.0020.0002] -112F0 ; [.1BB8.0020.0002] -114D0 ; [.1BB8.0020.0002] -11650 ; [.1BB8.0020.0002] -116C0 ; [.1BB8.0020.0002] -11730 ; [.1BB8.0020.0002] -118E0 ; [.1BB8.0020.0002] -16A60 ; [.1BB8.0020.0002] -16B50 ; [.1BB8.0020.0002] -FF10 ; [.1BB8.0020.0003] -0F33 ; [.1BB8.0020.0004] -1F100 ; [.1BB8.0020.0004][*0274.0020.0004] -1F101 ; [.1BB8.0020.0004][*0221.0020.0004] -1D7CE ; [.1BB8.0020.0005] -1D7D8 ; [.1BB8.0020.0005] -1D7E2 ; [.1BB8.0020.0005] -1D7EC ; [.1BB8.0020.0005] -1D7F6 ; [.1BB8.0020.0005] -24EA ; [.1BB8.0020.0006] -24FF ; [.1BB8.0020.0006] -1F10B ; [.1BB8.0020.0006] -1F10C ; [.1BB8.0020.0006] -2070 ; [.1BB8.0020.0014] -2080 ; [.1BB8.0020.0015] -2189 ; [.1BB8.0020.001E][*0606.0020.001E][.1BBB.0020.001E] -3358 ; [.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0031 ; [.1BB9.0020.0002] -0661 ; [.1BB9.0020.0002] -06F1 ; [.1BB9.0020.0002] -07C1 ; [.1BB9.0020.0002] -0967 ; [.1BB9.0020.0002] -09E7 ; [.1BB9.0020.0002] -0A67 ; [.1BB9.0020.0002] -0AE7 ; [.1BB9.0020.0002] -0B67 ; [.1BB9.0020.0002] -0BE7 ; [.1BB9.0020.0002] -0C67 ; [.1BB9.0020.0002] -0C79 ; [.1BB9.0020.0002] -0C7C ; [.1BB9.0020.0002] -0CE7 ; [.1BB9.0020.0002] -0D67 ; [.1BB9.0020.0002] -0DE7 ; [.1BB9.0020.0002] -0E51 ; [.1BB9.0020.0002] -0ED1 ; [.1BB9.0020.0002] -0F21 ; [.1BB9.0020.0002] -1041 ; [.1BB9.0020.0002] -1091 ; [.1BB9.0020.0002] -1369 ; [.1BB9.0020.0002] -17E1 ; [.1BB9.0020.0002] -17F1 ; [.1BB9.0020.0002] -1811 ; [.1BB9.0020.0002] -1947 ; [.1BB9.0020.0002] -19D1 ; [.1BB9.0020.0002] -19DA ; [.1BB9.0020.0002] -1A81 ; [.1BB9.0020.0002] -1A91 ; [.1BB9.0020.0002] -1B51 ; [.1BB9.0020.0002] -1BB1 ; [.1BB9.0020.0002] -1C41 ; [.1BB9.0020.0002] -1C51 ; [.1BB9.0020.0002] -3021 ; [.1BB9.0020.0002] -A621 ; [.1BB9.0020.0002] -A8D1 ; [.1BB9.0020.0002] -A901 ; [.1BB9.0020.0002] -A9D1 ; [.1BB9.0020.0002] -A9F1 ; [.1BB9.0020.0002] -AA51 ; [.1BB9.0020.0002] -ABF1 ; [.1BB9.0020.0002] -10107 ; [.1BB9.0020.0002] -10142 ; [.1BB9.0020.0002] -10158 ; [.1BB9.0020.0002] -10159 ; [.1BB9.0020.0002] -1015A ; [.1BB9.0020.0002] -102E1 ; [.1BB9.0020.0002] -10320 ; [.1BB9.0020.0002] -103D1 ; [.1BB9.0020.0002] -104A1 ; [.1BB9.0020.0002] -10858 ; [.1BB9.0020.0002] -10879 ; [.1BB9.0020.0002] -108A7 ; [.1BB9.0020.0002] -108FB ; [.1BB9.0020.0002] -10916 ; [.1BB9.0020.0002] -109C0 ; [.1BB9.0020.0002] -10A40 ; [.1BB9.0020.0002] -10A7D ; [.1BB9.0020.0002] -10A9D ; [.1BB9.0020.0002] -10AEB ; [.1BB9.0020.0002] -10B58 ; [.1BB9.0020.0002] -10B78 ; [.1BB9.0020.0002] -10BA9 ; [.1BB9.0020.0002] -10CFA ; [.1BB9.0020.0002] -10E60 ; [.1BB9.0020.0002] -11052 ; [.1BB9.0020.0002] -11067 ; [.1BB9.0020.0002] -110F1 ; [.1BB9.0020.0002] -11137 ; [.1BB9.0020.0002] -111D1 ; [.1BB9.0020.0002] -111E1 ; [.1BB9.0020.0002] -112F1 ; [.1BB9.0020.0002] -114D1 ; [.1BB9.0020.0002] -11651 ; [.1BB9.0020.0002] -116C1 ; [.1BB9.0020.0002] -11731 ; [.1BB9.0020.0002] -118E1 ; [.1BB9.0020.0002] -12415 ; [.1BB9.0020.0002] -1241E ; [.1BB9.0020.0002] -1242C ; [.1BB9.0020.0002] -12434 ; [.1BB9.0020.0002] -1244F ; [.1BB9.0020.0002] -12458 ; [.1BB9.0020.0002] -16A61 ; [.1BB9.0020.0002] -16B51 ; [.1BB9.0020.0002] -1D360 ; [.1BB9.0020.0002] -1E8C7 ; [.1BB9.0020.0002] -FF11 ; [.1BB9.0020.0003] -0F2A ; [.1BB9.0020.0004] -2474 ; [*0310.0020.0004][.1BB9.0020.0004][*0311.0020.0004] -2488 ; [.1BB9.0020.0004][*0274.0020.0004] -1F102 ; [.1BB9.0020.0004][*0221.0020.0004] -1D7CF ; [.1BB9.0020.0005] -1D7D9 ; [.1BB9.0020.0005] -1D7E3 ; [.1BB9.0020.0005] -1D7ED ; [.1BB9.0020.0005] -1D7F7 ; [.1BB9.0020.0005] -2460 ; [.1BB9.0020.0006] -24F5 ; [.1BB9.0020.0006] -2776 ; [.1BB9.0020.0006] -2780 ; [.1BB9.0020.0006] -278A ; [.1BB9.0020.0006] -00B9 ; [.1BB9.0020.0014] -2081 ; [.1BB9.0020.0015] -215F ; [.1BB9.0020.001E][*0606.0020.001E] -247D ; [*0310.0020.0004][.1BB9.0020.0004][.1BB8.0020.0004][*0311.0020.0004] -2491 ; [.1BB9.0020.0004][.1BB8.0020.0004][*0274.0020.0004] -2469 ; [.1BB9.0020.0006][.1BB8.0020.0006] -24FE ; [.1BB9.0020.0006][.1BB8.0020.0006] -277F ; [.1BB9.0020.0006][.1BB8.0020.0006] -2789 ; [.1BB9.0020.0006][.1BB8.0020.0006] -2793 ; [.1BB9.0020.0006][.1BB8.0020.0006] -3248 ; [.1BB9.0020.0006][.1BB8.0020.0006] -33E9 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C9 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E708.0000.0000] -3362 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -247E ; [*0310.0020.0004][.1BB9.0020.0004][.1BB9.0020.0004][*0311.0020.0004] -2492 ; [.1BB9.0020.0004][.1BB9.0020.0004][*0274.0020.0004] -246A ; [.1BB9.0020.0006][.1BB9.0020.0006] -24EB ; [.1BB9.0020.0006][.1BB9.0020.0006] -2152 ; [.1BB9.0020.001E][*0606.0020.001E][.1BB9.0020.001E][.1BB8.0020.001E] -33EA ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32CA ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E708.0000.0000] -3363 ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -247F ; [*0310.0020.0004][.1BB9.0020.0004][.1BBA.0020.0004][*0311.0020.0004] -2493 ; [.1BB9.0020.0004][.1BBA.0020.0004][*0274.0020.0004] -246B ; [.1BB9.0020.0006][.1BBA.0020.0006] -24EC ; [.1BB9.0020.0006][.1BBA.0020.0006] -00BD ; [.1BB9.0020.001E][*0606.0020.001E][.1BBA.0020.001E] -33EB ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32CB ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E708.0000.0000] -3364 ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -2480 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBB.0020.0004][*0311.0020.0004] -2494 ; [.1BB9.0020.0004][.1BBB.0020.0004][*0274.0020.0004] -246C ; [.1BB9.0020.0006][.1BBB.0020.0006] -24ED ; [.1BB9.0020.0006][.1BBB.0020.0006] -2153 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBB.0020.001E] -33EC ; [.1BB9.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3365 ; [.1BB9.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -2481 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBC.0020.0004][*0311.0020.0004] -2495 ; [.1BB9.0020.0004][.1BBC.0020.0004][*0274.0020.0004] -246D ; [.1BB9.0020.0006][.1BBC.0020.0006] -24EE ; [.1BB9.0020.0006][.1BBC.0020.0006] -00BC ; [.1BB9.0020.001E][*0606.0020.001E][.1BBC.0020.001E] -33ED ; [.1BB9.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3366 ; [.1BB9.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -2482 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBD.0020.0004][*0311.0020.0004] -2496 ; [.1BB9.0020.0004][.1BBD.0020.0004][*0274.0020.0004] -246E ; [.1BB9.0020.0006][.1BBD.0020.0006] -24EF ; [.1BB9.0020.0006][.1BBD.0020.0006] -2155 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBD.0020.001E] -33EE ; [.1BB9.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3367 ; [.1BB9.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -2483 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBE.0020.0004][*0311.0020.0004] -2497 ; [.1BB9.0020.0004][.1BBE.0020.0004][*0274.0020.0004] -246F ; [.1BB9.0020.0006][.1BBE.0020.0006] -24F0 ; [.1BB9.0020.0006][.1BBE.0020.0006] -2159 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBE.0020.001E] -33EF ; [.1BB9.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3368 ; [.1BB9.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -2484 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBF.0020.0004][*0311.0020.0004] -2498 ; [.1BB9.0020.0004][.1BBF.0020.0004][*0274.0020.0004] -2470 ; [.1BB9.0020.0006][.1BBF.0020.0006] -24F1 ; [.1BB9.0020.0006][.1BBF.0020.0006] -2150 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBF.0020.001E] -33F0 ; [.1BB9.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3369 ; [.1BB9.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -2485 ; [*0310.0020.0004][.1BB9.0020.0004][.1BC0.0020.0004][*0311.0020.0004] -2499 ; [.1BB9.0020.0004][.1BC0.0020.0004][*0274.0020.0004] -2471 ; [.1BB9.0020.0006][.1BC0.0020.0006] -24F2 ; [.1BB9.0020.0006][.1BC0.0020.0006] -215B ; [.1BB9.0020.001E][*0606.0020.001E][.1BC0.0020.001E] -33F1 ; [.1BB9.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -336A ; [.1BB9.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -2486 ; [*0310.0020.0004][.1BB9.0020.0004][.1BC1.0020.0004][*0311.0020.0004] -249A ; [.1BB9.0020.0004][.1BC1.0020.0004][*0274.0020.0004] -2472 ; [.1BB9.0020.0006][.1BC1.0020.0006] -24F3 ; [.1BB9.0020.0006][.1BC1.0020.0006] -2151 ; [.1BB9.0020.001E][*0606.0020.001E][.1BC1.0020.001E] -33F2 ; [.1BB9.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -336B ; [.1BB9.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -33E0 ; [.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C0 ; [.1BB9.0020.0004][.FB40.0020.0004][.E708.0000.0000] -3359 ; [.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0032 ; [.1BBA.0020.0002] -0662 ; [.1BBA.0020.0002] -06F2 ; [.1BBA.0020.0002] -07C2 ; [.1BBA.0020.0002] -0968 ; [.1BBA.0020.0002] -09E8 ; [.1BBA.0020.0002] -0A68 ; [.1BBA.0020.0002] -0AE8 ; [.1BBA.0020.0002] -0B68 ; [.1BBA.0020.0002] -0BE8 ; [.1BBA.0020.0002] -0C68 ; [.1BBA.0020.0002] -0C7A ; [.1BBA.0020.0002] -0C7D ; [.1BBA.0020.0002] -0CE8 ; [.1BBA.0020.0002] -0D68 ; [.1BBA.0020.0002] -0DE8 ; [.1BBA.0020.0002] -0E52 ; [.1BBA.0020.0002] -0ED2 ; [.1BBA.0020.0002] -0F22 ; [.1BBA.0020.0002] -1042 ; [.1BBA.0020.0002] -1092 ; [.1BBA.0020.0002] -136A ; [.1BBA.0020.0002] -17E2 ; [.1BBA.0020.0002] -17F2 ; [.1BBA.0020.0002] -1812 ; [.1BBA.0020.0002] -1948 ; [.1BBA.0020.0002] -19D2 ; [.1BBA.0020.0002] -1A82 ; [.1BBA.0020.0002] -1A92 ; [.1BBA.0020.0002] -1B52 ; [.1BBA.0020.0002] -1BB2 ; [.1BBA.0020.0002] -1C42 ; [.1BBA.0020.0002] -1C52 ; [.1BBA.0020.0002] -3022 ; [.1BBA.0020.0002] -A622 ; [.1BBA.0020.0002] -A8D2 ; [.1BBA.0020.0002] -A902 ; [.1BBA.0020.0002] -A9D2 ; [.1BBA.0020.0002] -A9F2 ; [.1BBA.0020.0002] -AA52 ; [.1BBA.0020.0002] -ABF2 ; [.1BBA.0020.0002] -10108 ; [.1BBA.0020.0002] -1015B ; [.1BBA.0020.0002] -1015C ; [.1BBA.0020.0002] -1015D ; [.1BBA.0020.0002] -1015E ; [.1BBA.0020.0002] -102E2 ; [.1BBA.0020.0002] -103D2 ; [.1BBA.0020.0002] -104A2 ; [.1BBA.0020.0002] -10859 ; [.1BBA.0020.0002] -1087A ; [.1BBA.0020.0002] -108A8 ; [.1BBA.0020.0002] -1091A ; [.1BBA.0020.0002] -109C1 ; [.1BBA.0020.0002] -10A41 ; [.1BBA.0020.0002] -10B59 ; [.1BBA.0020.0002] -10B79 ; [.1BBA.0020.0002] -10BAA ; [.1BBA.0020.0002] -10E61 ; [.1BBA.0020.0002] -11053 ; [.1BBA.0020.0002] -11068 ; [.1BBA.0020.0002] -110F2 ; [.1BBA.0020.0002] -11138 ; [.1BBA.0020.0002] -111D2 ; [.1BBA.0020.0002] -111E2 ; [.1BBA.0020.0002] -112F2 ; [.1BBA.0020.0002] -114D2 ; [.1BBA.0020.0002] -11652 ; [.1BBA.0020.0002] -116C2 ; [.1BBA.0020.0002] -11732 ; [.1BBA.0020.0002] -118E2 ; [.1BBA.0020.0002] -12400 ; [.1BBA.0020.0002] -12416 ; [.1BBA.0020.0002] -1241F ; [.1BBA.0020.0002] -12423 ; [.1BBA.0020.0002] -1242D ; [.1BBA.0020.0002] -12435 ; [.1BBA.0020.0002] -1244A ; [.1BBA.0020.0002] -12450 ; [.1BBA.0020.0002] -12456 ; [.1BBA.0020.0002] -12459 ; [.1BBA.0020.0002] -16A62 ; [.1BBA.0020.0002] -16B52 ; [.1BBA.0020.0002] -1D361 ; [.1BBA.0020.0002] -1E8C8 ; [.1BBA.0020.0002] -FF12 ; [.1BBA.0020.0003] -0F2B ; [.1BBA.0020.0004] -2475 ; [*0310.0020.0004][.1BBA.0020.0004][*0311.0020.0004] -2489 ; [.1BBA.0020.0004][*0274.0020.0004] -1F103 ; [.1BBA.0020.0004][*0221.0020.0004] -1D7D0 ; [.1BBA.0020.0005] -1D7DA ; [.1BBA.0020.0005] -1D7E4 ; [.1BBA.0020.0005] -1D7EE ; [.1BBA.0020.0005] -1D7F8 ; [.1BBA.0020.0005] -2461 ; [.1BBA.0020.0006] -24F6 ; [.1BBA.0020.0006] -2777 ; [.1BBA.0020.0006] -2781 ; [.1BBA.0020.0006] -278B ; [.1BBA.0020.0006] -00B2 ; [.1BBA.0020.0014] -2082 ; [.1BBA.0020.0015] -2487 ; [*0310.0020.0004][.1BBA.0020.0004][.1BB8.0020.0004][*0311.0020.0004] -249B ; [.1BBA.0020.0004][.1BB8.0020.0004][*0274.0020.0004] -2473 ; [.1BBA.0020.0006][.1BB8.0020.0006] -24F4 ; [.1BBA.0020.0006][.1BB8.0020.0006] -3249 ; [.1BBA.0020.0006][.1BB8.0020.0006] -33F3 ; [.1BBA.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -336C ; [.1BBA.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -3251 ; [.1BBA.0020.0006][.1BB9.0020.0006] -33F4 ; [.1BBA.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -336D ; [.1BBA.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -3252 ; [.1BBA.0020.0006][.1BBA.0020.0006] -33F5 ; [.1BBA.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -336E ; [.1BBA.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -3253 ; [.1BBA.0020.0006][.1BBB.0020.0006] -2154 ; [.1BBA.0020.001E][*0606.0020.001E][.1BBB.0020.001E] -33F6 ; [.1BBA.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -336F ; [.1BBA.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -3254 ; [.1BBA.0020.0006][.1BBC.0020.0006] -33F7 ; [.1BBA.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3370 ; [.1BBA.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -3255 ; [.1BBA.0020.0006][.1BBD.0020.0006] -2156 ; [.1BBA.0020.001E][*0606.0020.001E][.1BBD.0020.001E] -33F8 ; [.1BBA.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3256 ; [.1BBA.0020.0006][.1BBE.0020.0006] -33F9 ; [.1BBA.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3257 ; [.1BBA.0020.0006][.1BBF.0020.0006] -33FA ; [.1BBA.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3258 ; [.1BBA.0020.0006][.1BC0.0020.0006] -33FB ; [.1BBA.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -3259 ; [.1BBA.0020.0006][.1BC1.0020.0006] -33FC ; [.1BBA.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -33E1 ; [.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C1 ; [.1BBA.0020.0004][.FB40.0020.0004][.E708.0000.0000] -335A ; [.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0033 ; [.1BBB.0020.0002] -0663 ; [.1BBB.0020.0002] -06F3 ; [.1BBB.0020.0002] -07C3 ; [.1BBB.0020.0002] -0969 ; [.1BBB.0020.0002] -09E9 ; [.1BBB.0020.0002] -0A69 ; [.1BBB.0020.0002] -0AE9 ; [.1BBB.0020.0002] -0B69 ; [.1BBB.0020.0002] -0BE9 ; [.1BBB.0020.0002] -0C69 ; [.1BBB.0020.0002] -0C7B ; [.1BBB.0020.0002] -0C7E ; [.1BBB.0020.0002] -0CE9 ; [.1BBB.0020.0002] -0D69 ; [.1BBB.0020.0002] -0DE9 ; [.1BBB.0020.0002] -0E53 ; [.1BBB.0020.0002] -0ED3 ; [.1BBB.0020.0002] -0F23 ; [.1BBB.0020.0002] -1043 ; [.1BBB.0020.0002] -1093 ; [.1BBB.0020.0002] -136B ; [.1BBB.0020.0002] -17E3 ; [.1BBB.0020.0002] -17F3 ; [.1BBB.0020.0002] -1813 ; [.1BBB.0020.0002] -1949 ; [.1BBB.0020.0002] -19D3 ; [.1BBB.0020.0002] -1A83 ; [.1BBB.0020.0002] -1A93 ; [.1BBB.0020.0002] -1B53 ; [.1BBB.0020.0002] -1BB3 ; [.1BBB.0020.0002] -1C43 ; [.1BBB.0020.0002] -1C53 ; [.1BBB.0020.0002] -3023 ; [.1BBB.0020.0002] -A623 ; [.1BBB.0020.0002] -A8D3 ; [.1BBB.0020.0002] -A903 ; [.1BBB.0020.0002] -A9D3 ; [.1BBB.0020.0002] -A9F3 ; [.1BBB.0020.0002] -AA53 ; [.1BBB.0020.0002] -ABF3 ; [.1BBB.0020.0002] -10109 ; [.1BBB.0020.0002] -102E3 ; [.1BBB.0020.0002] -104A3 ; [.1BBB.0020.0002] -1085A ; [.1BBB.0020.0002] -1087B ; [.1BBB.0020.0002] -108A9 ; [.1BBB.0020.0002] -1091B ; [.1BBB.0020.0002] -109C2 ; [.1BBB.0020.0002] -10A42 ; [.1BBB.0020.0002] -10B5A ; [.1BBB.0020.0002] -10B7A ; [.1BBB.0020.0002] -10BAB ; [.1BBB.0020.0002] -10E62 ; [.1BBB.0020.0002] -11054 ; [.1BBB.0020.0002] -11069 ; [.1BBB.0020.0002] -110F3 ; [.1BBB.0020.0002] -11139 ; [.1BBB.0020.0002] -111D3 ; [.1BBB.0020.0002] -111E3 ; [.1BBB.0020.0002] -112F3 ; [.1BBB.0020.0002] -114D3 ; [.1BBB.0020.0002] -11653 ; [.1BBB.0020.0002] -116C3 ; [.1BBB.0020.0002] -11733 ; [.1BBB.0020.0002] -118E3 ; [.1BBB.0020.0002] -12401 ; [.1BBB.0020.0002] -12408 ; [.1BBB.0020.0002] -12417 ; [.1BBB.0020.0002] -12420 ; [.1BBB.0020.0002] -12424 ; [.1BBB.0020.0002] -12425 ; [.1BBB.0020.0002] -1242E ; [.1BBB.0020.0002] -1242F ; [.1BBB.0020.0002] -12436 ; [.1BBB.0020.0002] -12437 ; [.1BBB.0020.0002] -1243A ; [.1BBB.0020.0002] -1243B ; [.1BBB.0020.0002] -1244B ; [.1BBB.0020.0002] -12451 ; [.1BBB.0020.0002] -12457 ; [.1BBB.0020.0002] -16A63 ; [.1BBB.0020.0002] -16B53 ; [.1BBB.0020.0002] -1D362 ; [.1BBB.0020.0002] -1E8C9 ; [.1BBB.0020.0002] -FF13 ; [.1BBB.0020.0003] -0F2C ; [.1BBB.0020.0004] -2476 ; [*0310.0020.0004][.1BBB.0020.0004][*0311.0020.0004] -248A ; [.1BBB.0020.0004][*0274.0020.0004] -1F104 ; [.1BBB.0020.0004][*0221.0020.0004] -1D7D1 ; [.1BBB.0020.0005] -1D7DB ; [.1BBB.0020.0005] -1D7E5 ; [.1BBB.0020.0005] -1D7EF ; [.1BBB.0020.0005] -1D7F9 ; [.1BBB.0020.0005] -2462 ; [.1BBB.0020.0006] -24F7 ; [.1BBB.0020.0006] -2778 ; [.1BBB.0020.0006] -2782 ; [.1BBB.0020.0006] -278C ; [.1BBB.0020.0006] -00B3 ; [.1BBB.0020.0014] -2083 ; [.1BBB.0020.0015] -324A ; [.1BBB.0020.0006][.1BB8.0020.0006] -325A ; [.1BBB.0020.0006][.1BB8.0020.0006] -33FD ; [.1BBB.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -325B ; [.1BBB.0020.0006][.1BB9.0020.0006] -33FE ; [.1BBB.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -325C ; [.1BBB.0020.0006][.1BBA.0020.0006] -325D ; [.1BBB.0020.0006][.1BBB.0020.0006] -325E ; [.1BBB.0020.0006][.1BBC.0020.0006] -00BE ; [.1BBB.0020.001E][*0606.0020.001E][.1BBC.0020.001E] -325F ; [.1BBB.0020.0006][.1BBD.0020.0006] -2157 ; [.1BBB.0020.001E][*0606.0020.001E][.1BBD.0020.001E] -32B1 ; [.1BBB.0020.0006][.1BBE.0020.0006] -32B2 ; [.1BBB.0020.0006][.1BBF.0020.0006] -32B3 ; [.1BBB.0020.0006][.1BC0.0020.0006] -215C ; [.1BBB.0020.001E][*0606.0020.001E][.1BC0.0020.001E] -32B4 ; [.1BBB.0020.0006][.1BC1.0020.0006] -33E2 ; [.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C2 ; [.1BBB.0020.0004][.FB40.0020.0004][.E708.0000.0000] -335B ; [.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0034 ; [.1BBC.0020.0002] -0664 ; [.1BBC.0020.0002] -06F4 ; [.1BBC.0020.0002] -07C4 ; [.1BBC.0020.0002] -096A ; [.1BBC.0020.0002] -09EA ; [.1BBC.0020.0002] -0A6A ; [.1BBC.0020.0002] -0AEA ; [.1BBC.0020.0002] -0B6A ; [.1BBC.0020.0002] -0BEA ; [.1BBC.0020.0002] -0C6A ; [.1BBC.0020.0002] -0CEA ; [.1BBC.0020.0002] -0D6A ; [.1BBC.0020.0002] -0DEA ; [.1BBC.0020.0002] -0E54 ; [.1BBC.0020.0002] -0ED4 ; [.1BBC.0020.0002] -0F24 ; [.1BBC.0020.0002] -1044 ; [.1BBC.0020.0002] -1094 ; [.1BBC.0020.0002] -136C ; [.1BBC.0020.0002] -17E4 ; [.1BBC.0020.0002] -17F4 ; [.1BBC.0020.0002] -1814 ; [.1BBC.0020.0002] -194A ; [.1BBC.0020.0002] -19D4 ; [.1BBC.0020.0002] -1A84 ; [.1BBC.0020.0002] -1A94 ; [.1BBC.0020.0002] -1B54 ; [.1BBC.0020.0002] -1BB4 ; [.1BBC.0020.0002] -1C44 ; [.1BBC.0020.0002] -1C54 ; [.1BBC.0020.0002] -3024 ; [.1BBC.0020.0002] -A624 ; [.1BBC.0020.0002] -A8D4 ; [.1BBC.0020.0002] -A904 ; [.1BBC.0020.0002] -A9D4 ; [.1BBC.0020.0002] -A9F4 ; [.1BBC.0020.0002] -AA54 ; [.1BBC.0020.0002] -ABF4 ; [.1BBC.0020.0002] -1010A ; [.1BBC.0020.0002] -102E4 ; [.1BBC.0020.0002] -104A4 ; [.1BBC.0020.0002] -1087C ; [.1BBC.0020.0002] -108AA ; [.1BBC.0020.0002] -108AB ; [.1BBC.0020.0002] -109C3 ; [.1BBC.0020.0002] -10A43 ; [.1BBC.0020.0002] -10B5B ; [.1BBC.0020.0002] -10B7B ; [.1BBC.0020.0002] -10BAC ; [.1BBC.0020.0002] -10E63 ; [.1BBC.0020.0002] -11055 ; [.1BBC.0020.0002] -1106A ; [.1BBC.0020.0002] -110F4 ; [.1BBC.0020.0002] -1113A ; [.1BBC.0020.0002] -111D4 ; [.1BBC.0020.0002] -111E4 ; [.1BBC.0020.0002] -112F4 ; [.1BBC.0020.0002] -114D4 ; [.1BBC.0020.0002] -11654 ; [.1BBC.0020.0002] -116C4 ; [.1BBC.0020.0002] -11734 ; [.1BBC.0020.0002] -118E4 ; [.1BBC.0020.0002] -12402 ; [.1BBC.0020.0002] -12409 ; [.1BBC.0020.0002] -1240F ; [.1BBC.0020.0002] -12418 ; [.1BBC.0020.0002] -12421 ; [.1BBC.0020.0002] -12426 ; [.1BBC.0020.0002] -12430 ; [.1BBC.0020.0002] -12438 ; [.1BBC.0020.0002] -1243C ; [.1BBC.0020.0002] -1243D ; [.1BBC.0020.0002] -1243E ; [.1BBC.0020.0002] -1243F ; [.1BBC.0020.0002] -1244C ; [.1BBC.0020.0002] -12452 ; [.1BBC.0020.0002] -12453 ; [.1BBC.0020.0002] -12469 ; [.1BBC.0020.0002] -16A64 ; [.1BBC.0020.0002] -16B54 ; [.1BBC.0020.0002] -1D363 ; [.1BBC.0020.0002] -1E8CA ; [.1BBC.0020.0002] -FF14 ; [.1BBC.0020.0003] -0F2D ; [.1BBC.0020.0004] -2477 ; [*0310.0020.0004][.1BBC.0020.0004][*0311.0020.0004] -248B ; [.1BBC.0020.0004][*0274.0020.0004] -1F105 ; [.1BBC.0020.0004][*0221.0020.0004] -1D7D2 ; [.1BBC.0020.0005] -1D7DC ; [.1BBC.0020.0005] -1D7E6 ; [.1BBC.0020.0005] -1D7F0 ; [.1BBC.0020.0005] -1D7FA ; [.1BBC.0020.0005] -2463 ; [.1BBC.0020.0006] -24F8 ; [.1BBC.0020.0006] -2779 ; [.1BBC.0020.0006] -2783 ; [.1BBC.0020.0006] -278D ; [.1BBC.0020.0006] -2074 ; [.1BBC.0020.0014] -2084 ; [.1BBC.0020.0015] -324B ; [.1BBC.0020.0006][.1BB8.0020.0006] -32B5 ; [.1BBC.0020.0006][.1BB8.0020.0006] -32B6 ; [.1BBC.0020.0006][.1BB9.0020.0006] -32B7 ; [.1BBC.0020.0006][.1BBA.0020.0006] -32B8 ; [.1BBC.0020.0006][.1BBB.0020.0006] -32B9 ; [.1BBC.0020.0006][.1BBC.0020.0006] -32BA ; [.1BBC.0020.0006][.1BBD.0020.0006] -2158 ; [.1BBC.0020.001E][*0606.0020.001E][.1BBD.0020.001E] -32BB ; [.1BBC.0020.0006][.1BBE.0020.0006] -32BC ; [.1BBC.0020.0006][.1BBF.0020.0006] -32BD ; [.1BBC.0020.0006][.1BC0.0020.0006] -32BE ; [.1BBC.0020.0006][.1BC1.0020.0006] -33E3 ; [.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C3 ; [.1BBC.0020.0004][.FB40.0020.0004][.E708.0000.0000] -335C ; [.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0035 ; [.1BBD.0020.0002] -0665 ; [.1BBD.0020.0002] -06F5 ; [.1BBD.0020.0002] -07C5 ; [.1BBD.0020.0002] -096B ; [.1BBD.0020.0002] -09EB ; [.1BBD.0020.0002] -0A6B ; [.1BBD.0020.0002] -0AEB ; [.1BBD.0020.0002] -0B6B ; [.1BBD.0020.0002] -0BEB ; [.1BBD.0020.0002] -0C6B ; [.1BBD.0020.0002] -0CEB ; [.1BBD.0020.0002] -0D6B ; [.1BBD.0020.0002] -0DEB ; [.1BBD.0020.0002] -0E55 ; [.1BBD.0020.0002] -0ED5 ; [.1BBD.0020.0002] -0F25 ; [.1BBD.0020.0002] -1045 ; [.1BBD.0020.0002] -1095 ; [.1BBD.0020.0002] -136D ; [.1BBD.0020.0002] -17E5 ; [.1BBD.0020.0002] -17F5 ; [.1BBD.0020.0002] -1815 ; [.1BBD.0020.0002] -194B ; [.1BBD.0020.0002] -19D5 ; [.1BBD.0020.0002] -1A85 ; [.1BBD.0020.0002] -1A95 ; [.1BBD.0020.0002] -1B55 ; [.1BBD.0020.0002] -1BB5 ; [.1BBD.0020.0002] -1C45 ; [.1BBD.0020.0002] -1C55 ; [.1BBD.0020.0002] -3025 ; [.1BBD.0020.0002] -A625 ; [.1BBD.0020.0002] -A8D5 ; [.1BBD.0020.0002] -A905 ; [.1BBD.0020.0002] -A9D5 ; [.1BBD.0020.0002] -A9F5 ; [.1BBD.0020.0002] -AA55 ; [.1BBD.0020.0002] -ABF5 ; [.1BBD.0020.0002] -1010B ; [.1BBD.0020.0002] -10143 ; [.1BBD.0020.0002] -10148 ; [.1BBD.0020.0002] -1014F ; [.1BBD.0020.0002] -1015F ; [.1BBD.0020.0002] -10173 ; [.1BBD.0020.0002] -102E5 ; [.1BBD.0020.0002] -10321 ; [.1BBD.0020.0002] -104A5 ; [.1BBD.0020.0002] -1087D ; [.1BBD.0020.0002] -108AC ; [.1BBD.0020.0002] -108FC ; [.1BBD.0020.0002] -109C4 ; [.1BBD.0020.0002] -10AEC ; [.1BBD.0020.0002] -10CFB ; [.1BBD.0020.0002] -10E64 ; [.1BBD.0020.0002] -11056 ; [.1BBD.0020.0002] -1106B ; [.1BBD.0020.0002] -110F5 ; [.1BBD.0020.0002] -1113B ; [.1BBD.0020.0002] -111D5 ; [.1BBD.0020.0002] -111E5 ; [.1BBD.0020.0002] -112F5 ; [.1BBD.0020.0002] -114D5 ; [.1BBD.0020.0002] -11655 ; [.1BBD.0020.0002] -116C5 ; [.1BBD.0020.0002] -11735 ; [.1BBD.0020.0002] -118E5 ; [.1BBD.0020.0002] -12403 ; [.1BBD.0020.0002] -1240A ; [.1BBD.0020.0002] -12410 ; [.1BBD.0020.0002] -12419 ; [.1BBD.0020.0002] -12422 ; [.1BBD.0020.0002] -12427 ; [.1BBD.0020.0002] -12431 ; [.1BBD.0020.0002] -12439 ; [.1BBD.0020.0002] -1244D ; [.1BBD.0020.0002] -12454 ; [.1BBD.0020.0002] -12455 ; [.1BBD.0020.0002] -1246A ; [.1BBD.0020.0002] -16A65 ; [.1BBD.0020.0002] -16B55 ; [.1BBD.0020.0002] -1D364 ; [.1BBD.0020.0002] -1E8CB ; [.1BBD.0020.0002] -FF15 ; [.1BBD.0020.0003] -0F2E ; [.1BBD.0020.0004] -2478 ; [*0310.0020.0004][.1BBD.0020.0004][*0311.0020.0004] -248C ; [.1BBD.0020.0004][*0274.0020.0004] -1F106 ; [.1BBD.0020.0004][*0221.0020.0004] -1D7D3 ; [.1BBD.0020.0005] -1D7DD ; [.1BBD.0020.0005] -1D7E7 ; [.1BBD.0020.0005] -1D7F1 ; [.1BBD.0020.0005] -1D7FB ; [.1BBD.0020.0005] -2464 ; [.1BBD.0020.0006] -24F9 ; [.1BBD.0020.0006] -277A ; [.1BBD.0020.0006] -2784 ; [.1BBD.0020.0006] -278E ; [.1BBD.0020.0006] -2075 ; [.1BBD.0020.0014] -2085 ; [.1BBD.0020.0015] -324C ; [.1BBD.0020.0006][.1BB8.0020.0006] -32BF ; [.1BBD.0020.0006][.1BB8.0020.0006] -215A ; [.1BBD.0020.001E][*0606.0020.001E][.1BBE.0020.001E] -215D ; [.1BBD.0020.001E][*0606.0020.001E][.1BC0.0020.001E] -33E4 ; [.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C4 ; [.1BBD.0020.0004][.FB40.0020.0004][.E708.0000.0000] -335D ; [.1BBD.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0036 ; [.1BBE.0020.0002] -0666 ; [.1BBE.0020.0002] -06F6 ; [.1BBE.0020.0002] -07C6 ; [.1BBE.0020.0002] -096C ; [.1BBE.0020.0002] -09EC ; [.1BBE.0020.0002] -0A6C ; [.1BBE.0020.0002] -0AEC ; [.1BBE.0020.0002] -0B6C ; [.1BBE.0020.0002] -0BEC ; [.1BBE.0020.0002] -0C6C ; [.1BBE.0020.0002] -0CEC ; [.1BBE.0020.0002] -0D6C ; [.1BBE.0020.0002] -0DEC ; [.1BBE.0020.0002] -0E56 ; [.1BBE.0020.0002] -0ED6 ; [.1BBE.0020.0002] -0F26 ; [.1BBE.0020.0002] -1046 ; [.1BBE.0020.0002] -1096 ; [.1BBE.0020.0002] -136E ; [.1BBE.0020.0002] -17E6 ; [.1BBE.0020.0002] -17F6 ; [.1BBE.0020.0002] -1816 ; [.1BBE.0020.0002] -194C ; [.1BBE.0020.0002] -19D6 ; [.1BBE.0020.0002] -1A86 ; [.1BBE.0020.0002] -1A96 ; [.1BBE.0020.0002] -1B56 ; [.1BBE.0020.0002] -1BB6 ; [.1BBE.0020.0002] -1C46 ; [.1BBE.0020.0002] -1C56 ; [.1BBE.0020.0002] -2185 ; [.1BBE.0020.0002] -3026 ; [.1BBE.0020.0002] -A626 ; [.1BBE.0020.0002] -A8D6 ; [.1BBE.0020.0002] -A906 ; [.1BBE.0020.0002] -A9D6 ; [.1BBE.0020.0002] -A9F6 ; [.1BBE.0020.0002] -AA56 ; [.1BBE.0020.0002] -ABF6 ; [.1BBE.0020.0002] -1010C ; [.1BBE.0020.0002] -102E6 ; [.1BBE.0020.0002] -104A6 ; [.1BBE.0020.0002] -109C5 ; [.1BBE.0020.0002] -10E65 ; [.1BBE.0020.0002] -11057 ; [.1BBE.0020.0002] -1106C ; [.1BBE.0020.0002] -110F6 ; [.1BBE.0020.0002] -1113C ; [.1BBE.0020.0002] -111D6 ; [.1BBE.0020.0002] -111E6 ; [.1BBE.0020.0002] -112F6 ; [.1BBE.0020.0002] -114D6 ; [.1BBE.0020.0002] -11656 ; [.1BBE.0020.0002] -116C6 ; [.1BBE.0020.0002] -11736 ; [.1BBE.0020.0002] -118E6 ; [.1BBE.0020.0002] -12404 ; [.1BBE.0020.0002] -1240B ; [.1BBE.0020.0002] -12411 ; [.1BBE.0020.0002] -1241A ; [.1BBE.0020.0002] -12428 ; [.1BBE.0020.0002] -12440 ; [.1BBE.0020.0002] -1244E ; [.1BBE.0020.0002] -1246B ; [.1BBE.0020.0002] -16A66 ; [.1BBE.0020.0002] -16B56 ; [.1BBE.0020.0002] -1D365 ; [.1BBE.0020.0002] -1E8CC ; [.1BBE.0020.0002] -FF16 ; [.1BBE.0020.0003] -0F2F ; [.1BBE.0020.0004] -2479 ; [*0310.0020.0004][.1BBE.0020.0004][*0311.0020.0004] -248D ; [.1BBE.0020.0004][*0274.0020.0004] -1F107 ; [.1BBE.0020.0004][*0221.0020.0004] -1D7D4 ; [.1BBE.0020.0005] -1D7DE ; [.1BBE.0020.0005] -1D7E8 ; [.1BBE.0020.0005] -1D7F2 ; [.1BBE.0020.0005] -1D7FC ; [.1BBE.0020.0005] -2465 ; [.1BBE.0020.0006] -24FA ; [.1BBE.0020.0006] -277B ; [.1BBE.0020.0006] -2785 ; [.1BBE.0020.0006] -278F ; [.1BBE.0020.0006] -2076 ; [.1BBE.0020.0014] -2086 ; [.1BBE.0020.0015] -324D ; [.1BBE.0020.0006][.1BB8.0020.0006] -33E5 ; [.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C5 ; [.1BBE.0020.0004][.FB40.0020.0004][.E708.0000.0000] -335E ; [.1BBE.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0037 ; [.1BBF.0020.0002] -0667 ; [.1BBF.0020.0002] -06F7 ; [.1BBF.0020.0002] -07C7 ; [.1BBF.0020.0002] -096D ; [.1BBF.0020.0002] -09ED ; [.1BBF.0020.0002] -0A6D ; [.1BBF.0020.0002] -0AED ; [.1BBF.0020.0002] -0B6D ; [.1BBF.0020.0002] -0BED ; [.1BBF.0020.0002] -0C6D ; [.1BBF.0020.0002] -0CED ; [.1BBF.0020.0002] -0D6D ; [.1BBF.0020.0002] -0DED ; [.1BBF.0020.0002] -0E57 ; [.1BBF.0020.0002] -0ED7 ; [.1BBF.0020.0002] -0F27 ; [.1BBF.0020.0002] -1047 ; [.1BBF.0020.0002] -1097 ; [.1BBF.0020.0002] -136F ; [.1BBF.0020.0002] -17E7 ; [.1BBF.0020.0002] -17F7 ; [.1BBF.0020.0002] -1817 ; [.1BBF.0020.0002] -194D ; [.1BBF.0020.0002] -19D7 ; [.1BBF.0020.0002] -1A87 ; [.1BBF.0020.0002] -1A97 ; [.1BBF.0020.0002] -1B57 ; [.1BBF.0020.0002] -1BB7 ; [.1BBF.0020.0002] -1C47 ; [.1BBF.0020.0002] -1C57 ; [.1BBF.0020.0002] -3027 ; [.1BBF.0020.0002] -A627 ; [.1BBF.0020.0002] -A8D7 ; [.1BBF.0020.0002] -A907 ; [.1BBF.0020.0002] -A9D7 ; [.1BBF.0020.0002] -A9F7 ; [.1BBF.0020.0002] -AA57 ; [.1BBF.0020.0002] -ABF7 ; [.1BBF.0020.0002] -1010D ; [.1BBF.0020.0002] -102E7 ; [.1BBF.0020.0002] -104A7 ; [.1BBF.0020.0002] -109C6 ; [.1BBF.0020.0002] -10E66 ; [.1BBF.0020.0002] -11058 ; [.1BBF.0020.0002] -1106D ; [.1BBF.0020.0002] -110F7 ; [.1BBF.0020.0002] -1113D ; [.1BBF.0020.0002] -111D7 ; [.1BBF.0020.0002] -111E7 ; [.1BBF.0020.0002] -112F7 ; [.1BBF.0020.0002] -114D7 ; [.1BBF.0020.0002] -11657 ; [.1BBF.0020.0002] -116C7 ; [.1BBF.0020.0002] -11737 ; [.1BBF.0020.0002] -118E7 ; [.1BBF.0020.0002] -12405 ; [.1BBF.0020.0002] -1240C ; [.1BBF.0020.0002] -12412 ; [.1BBF.0020.0002] -1241B ; [.1BBF.0020.0002] -12429 ; [.1BBF.0020.0002] -12441 ; [.1BBF.0020.0002] -12442 ; [.1BBF.0020.0002] -12443 ; [.1BBF.0020.0002] -1246C ; [.1BBF.0020.0002] -16A67 ; [.1BBF.0020.0002] -16B57 ; [.1BBF.0020.0002] -1D366 ; [.1BBF.0020.0002] -1E8CD ; [.1BBF.0020.0002] -FF17 ; [.1BBF.0020.0003] -0F30 ; [.1BBF.0020.0004] -247A ; [*0310.0020.0004][.1BBF.0020.0004][*0311.0020.0004] -248E ; [.1BBF.0020.0004][*0274.0020.0004] -1F108 ; [.1BBF.0020.0004][*0221.0020.0004] -1D7D5 ; [.1BBF.0020.0005] -1D7DF ; [.1BBF.0020.0005] -1D7E9 ; [.1BBF.0020.0005] -1D7F3 ; [.1BBF.0020.0005] -1D7FD ; [.1BBF.0020.0005] -2466 ; [.1BBF.0020.0006] -24FB ; [.1BBF.0020.0006] -277C ; [.1BBF.0020.0006] -2786 ; [.1BBF.0020.0006] -2790 ; [.1BBF.0020.0006] -2077 ; [.1BBF.0020.0014] -2087 ; [.1BBF.0020.0015] -324E ; [.1BBF.0020.0006][.1BB8.0020.0006] -215E ; [.1BBF.0020.001E][*0606.0020.001E][.1BC0.0020.001E] -33E6 ; [.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C6 ; [.1BBF.0020.0004][.FB40.0020.0004][.E708.0000.0000] -335F ; [.1BBF.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0038 ; [.1BC0.0020.0002] -0668 ; [.1BC0.0020.0002] -06F8 ; [.1BC0.0020.0002] -07C8 ; [.1BC0.0020.0002] -096E ; [.1BC0.0020.0002] -09EE ; [.1BC0.0020.0002] -0A6E ; [.1BC0.0020.0002] -0AEE ; [.1BC0.0020.0002] -0B6E ; [.1BC0.0020.0002] -0BEE ; [.1BC0.0020.0002] -0C6E ; [.1BC0.0020.0002] -0CEE ; [.1BC0.0020.0002] -0D6E ; [.1BC0.0020.0002] -0DEE ; [.1BC0.0020.0002] -0E58 ; [.1BC0.0020.0002] -0ED8 ; [.1BC0.0020.0002] -0F28 ; [.1BC0.0020.0002] -1048 ; [.1BC0.0020.0002] -1098 ; [.1BC0.0020.0002] -1370 ; [.1BC0.0020.0002] -17E8 ; [.1BC0.0020.0002] -17F8 ; [.1BC0.0020.0002] -1818 ; [.1BC0.0020.0002] -194E ; [.1BC0.0020.0002] -19D8 ; [.1BC0.0020.0002] -1A88 ; [.1BC0.0020.0002] -1A98 ; [.1BC0.0020.0002] -1B58 ; [.1BC0.0020.0002] -1BB8 ; [.1BC0.0020.0002] -1C48 ; [.1BC0.0020.0002] -1C58 ; [.1BC0.0020.0002] -3028 ; [.1BC0.0020.0002] -A628 ; [.1BC0.0020.0002] -A8D8 ; [.1BC0.0020.0002] -A908 ; [.1BC0.0020.0002] -A9D8 ; [.1BC0.0020.0002] -A9F8 ; [.1BC0.0020.0002] -AA58 ; [.1BC0.0020.0002] -ABF8 ; [.1BC0.0020.0002] -1010E ; [.1BC0.0020.0002] -102E8 ; [.1BC0.0020.0002] -104A8 ; [.1BC0.0020.0002] -109C7 ; [.1BC0.0020.0002] -10E67 ; [.1BC0.0020.0002] -11059 ; [.1BC0.0020.0002] -1106E ; [.1BC0.0020.0002] -110F8 ; [.1BC0.0020.0002] -1113E ; [.1BC0.0020.0002] -111D8 ; [.1BC0.0020.0002] -111E8 ; [.1BC0.0020.0002] -112F8 ; [.1BC0.0020.0002] -114D8 ; [.1BC0.0020.0002] -11658 ; [.1BC0.0020.0002] -116C8 ; [.1BC0.0020.0002] -11738 ; [.1BC0.0020.0002] -118E8 ; [.1BC0.0020.0002] -12406 ; [.1BC0.0020.0002] -1240D ; [.1BC0.0020.0002] -12413 ; [.1BC0.0020.0002] -1241C ; [.1BC0.0020.0002] -1242A ; [.1BC0.0020.0002] -12444 ; [.1BC0.0020.0002] -12445 ; [.1BC0.0020.0002] -1246D ; [.1BC0.0020.0002] -16A68 ; [.1BC0.0020.0002] -16B58 ; [.1BC0.0020.0002] -1D367 ; [.1BC0.0020.0002] -1E8CE ; [.1BC0.0020.0002] -FF18 ; [.1BC0.0020.0003] -0F31 ; [.1BC0.0020.0004] -247B ; [*0310.0020.0004][.1BC0.0020.0004][*0311.0020.0004] -248F ; [.1BC0.0020.0004][*0274.0020.0004] -1F109 ; [.1BC0.0020.0004][*0221.0020.0004] -1D7D6 ; [.1BC0.0020.0005] -1D7E0 ; [.1BC0.0020.0005] -1D7EA ; [.1BC0.0020.0005] -1D7F4 ; [.1BC0.0020.0005] -1D7FE ; [.1BC0.0020.0005] -2467 ; [.1BC0.0020.0006] -24FC ; [.1BC0.0020.0006] -277D ; [.1BC0.0020.0006] -2787 ; [.1BC0.0020.0006] -2791 ; [.1BC0.0020.0006] -2078 ; [.1BC0.0020.0014] -2088 ; [.1BC0.0020.0015] -324F ; [.1BC0.0020.0006][.1BB8.0020.0006] -33E7 ; [.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C7 ; [.1BC0.0020.0004][.FB40.0020.0004][.E708.0000.0000] -3360 ; [.1BC0.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0039 ; [.1BC1.0020.0002] -0669 ; [.1BC1.0020.0002] -06F9 ; [.1BC1.0020.0002] -07C9 ; [.1BC1.0020.0002] -096F ; [.1BC1.0020.0002] -09EF ; [.1BC1.0020.0002] -0A6F ; [.1BC1.0020.0002] -0AEF ; [.1BC1.0020.0002] -0B6F ; [.1BC1.0020.0002] -0BEF ; [.1BC1.0020.0002] -0C6F ; [.1BC1.0020.0002] -0CEF ; [.1BC1.0020.0002] -0D6F ; [.1BC1.0020.0002] -0DEF ; [.1BC1.0020.0002] -0E59 ; [.1BC1.0020.0002] -0ED9 ; [.1BC1.0020.0002] -0F29 ; [.1BC1.0020.0002] -1049 ; [.1BC1.0020.0002] -1099 ; [.1BC1.0020.0002] -1371 ; [.1BC1.0020.0002] -17E9 ; [.1BC1.0020.0002] -17F9 ; [.1BC1.0020.0002] -1819 ; [.1BC1.0020.0002] -194F ; [.1BC1.0020.0002] -19D9 ; [.1BC1.0020.0002] -1A89 ; [.1BC1.0020.0002] -1A99 ; [.1BC1.0020.0002] -1B59 ; [.1BC1.0020.0002] -1BB9 ; [.1BC1.0020.0002] -1C49 ; [.1BC1.0020.0002] -1C59 ; [.1BC1.0020.0002] -3029 ; [.1BC1.0020.0002] -A629 ; [.1BC1.0020.0002] -A8D9 ; [.1BC1.0020.0002] -A909 ; [.1BC1.0020.0002] -A9D9 ; [.1BC1.0020.0002] -A9F9 ; [.1BC1.0020.0002] -AA59 ; [.1BC1.0020.0002] -ABF9 ; [.1BC1.0020.0002] -1010F ; [.1BC1.0020.0002] -102E9 ; [.1BC1.0020.0002] -104A9 ; [.1BC1.0020.0002] -109C8 ; [.1BC1.0020.0002] -10E68 ; [.1BC1.0020.0002] -1105A ; [.1BC1.0020.0002] -1106F ; [.1BC1.0020.0002] -110F9 ; [.1BC1.0020.0002] -1113F ; [.1BC1.0020.0002] -111D9 ; [.1BC1.0020.0002] -111E9 ; [.1BC1.0020.0002] -112F9 ; [.1BC1.0020.0002] -114D9 ; [.1BC1.0020.0002] -11659 ; [.1BC1.0020.0002] -116C9 ; [.1BC1.0020.0002] -11739 ; [.1BC1.0020.0002] -118E9 ; [.1BC1.0020.0002] -12407 ; [.1BC1.0020.0002] -1240E ; [.1BC1.0020.0002] -12414 ; [.1BC1.0020.0002] -1241D ; [.1BC1.0020.0002] -1242B ; [.1BC1.0020.0002] -12446 ; [.1BC1.0020.0002] -12447 ; [.1BC1.0020.0002] -12448 ; [.1BC1.0020.0002] -12449 ; [.1BC1.0020.0002] -1246E ; [.1BC1.0020.0002] -16A69 ; [.1BC1.0020.0002] -16B59 ; [.1BC1.0020.0002] -1D368 ; [.1BC1.0020.0002] -1E8CF ; [.1BC1.0020.0002] -FF19 ; [.1BC1.0020.0003] -0F32 ; [.1BC1.0020.0004] -247C ; [*0310.0020.0004][.1BC1.0020.0004][*0311.0020.0004] -2490 ; [.1BC1.0020.0004][*0274.0020.0004] -1F10A ; [.1BC1.0020.0004][*0221.0020.0004] -1D7D7 ; [.1BC1.0020.0005] -1D7E1 ; [.1BC1.0020.0005] -1D7EB ; [.1BC1.0020.0005] -1D7F5 ; [.1BC1.0020.0005] -1D7FF ; [.1BC1.0020.0005] -2468 ; [.1BC1.0020.0006] -24FD ; [.1BC1.0020.0006] -277E ; [.1BC1.0020.0006] -2788 ; [.1BC1.0020.0006] -2792 ; [.1BC1.0020.0006] -2079 ; [.1BC1.0020.0014] -2089 ; [.1BC1.0020.0015] -33E8 ; [.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] -32C8 ; [.1BC1.0020.0004][.FB40.0020.0004][.E708.0000.0000] -3361 ; [.1BC1.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] -0061 ; [.1BC2.0020.0002] -FF41 ; [.1BC2.0020.0003] -0363 ; [.1BC2.0020.0004] -249C ; [*0310.0020.0004][.1BC2.0020.0004][*0311.0020.0004] -1D41A ; [.1BC2.0020.0005] -1D44E ; [.1BC2.0020.0005] -1D482 ; [.1BC2.0020.0005] -1D4B6 ; [.1BC2.0020.0005] -1D4EA ; [.1BC2.0020.0005] -1D51E ; [.1BC2.0020.0005] -1D552 ; [.1BC2.0020.0005] -1D586 ; [.1BC2.0020.0005] -1D5BA ; [.1BC2.0020.0005] -1D5EE ; [.1BC2.0020.0005] -1D622 ; [.1BC2.0020.0005] -1D656 ; [.1BC2.0020.0005] -1D68A ; [.1BC2.0020.0005] -24D0 ; [.1BC2.0020.0006] -0041 ; [.1BC2.0020.0008] -FF21 ; [.1BC2.0020.0009] -1F110 ; [*0310.0020.0004][.1BC2.0020.000A][*0311.0020.0004] -1D400 ; [.1BC2.0020.000B] -1D434 ; [.1BC2.0020.000B] -1D468 ; [.1BC2.0020.000B] -1D49C ; [.1BC2.0020.000B] -1D4D0 ; [.1BC2.0020.000B] -1D504 ; [.1BC2.0020.000B] -1D538 ; [.1BC2.0020.000B] -1D56C ; [.1BC2.0020.000B] -1D5A0 ; [.1BC2.0020.000B] -1D5D4 ; [.1BC2.0020.000B] -1D608 ; [.1BC2.0020.000B] -1D63C ; [.1BC2.0020.000B] -1D670 ; [.1BC2.0020.000B] -24B6 ; [.1BC2.0020.000C] -1F150 ; [.1BC2.0020.000C] -00AA ; [.1BC2.0020.0014] -1D43 ; [.1BC2.0020.0014] -2090 ; [.1BC2.0020.0015] -1D2C ; [.1BC2.0020.001D] -1F130 ; [.1BC2.0020.001D] -1F170 ; [.1BC2.0020.001D] -00E1 ; [.1BC2.0020.0002][.0000.0024.0002] -00C1 ; [.1BC2.0020.0008][.0000.0024.0002] -00E0 ; [.1BC2.0020.0002][.0000.0025.0002] -00C0 ; [.1BC2.0020.0008][.0000.0025.0002] -0103 ; [.1BC2.0020.0002][.0000.0026.0002] -0102 ; [.1BC2.0020.0008][.0000.0026.0002] -1EAF ; [.1BC2.0020.0002][.0000.0026.0002][.0000.0024.0002] -1EAE ; [.1BC2.0020.0008][.0000.0026.0002][.0000.0024.0002] -1EB1 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.0025.0002] -1EB0 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.0025.0002] -1EB5 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.002D.0002] -1EB4 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.002D.0002] -1EB3 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.003B.0002] -1EB2 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.003B.0002] -00E2 ; [.1BC2.0020.0002][.0000.0027.0002] -00C2 ; [.1BC2.0020.0008][.0000.0027.0002] -1EA5 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.0024.0002] -1EA4 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.0024.0002] -1EA7 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.0025.0002] -1EA6 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.0025.0002] -1EAB ; [.1BC2.0020.0002][.0000.0027.0002][.0000.002D.0002] -1EAA ; [.1BC2.0020.0008][.0000.0027.0002][.0000.002D.0002] -1EA9 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.003B.0002] -1EA8 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.003B.0002] -01CE ; [.1BC2.0020.0002][.0000.0028.0002] -01CD ; [.1BC2.0020.0008][.0000.0028.0002] -00E5 ; [.1BC2.0020.0002][.0000.0029.0002] -00C5 ; [.1BC2.0020.0008][.0000.0029.0002] -212B ; [.1BC2.0020.0008][.0000.0029.0002] -01FB ; [.1BC2.0020.0002][.0000.0029.0002][.0000.0024.0002] -01FA ; [.1BC2.0020.0008][.0000.0029.0002][.0000.0024.0002] -00E4 ; [.1BC2.0020.0002][.0000.002B.0002] -1DF2 ; [.1BC2.0020.0004][.0000.002B.0004] -A79B ; [.1BC2.0020.0004][.0000.002B.0004] -00C4 ; [.1BC2.0020.0008][.0000.002B.0002] -A79A ; [.1BC2.0020.000A][.0000.002B.0004] -01DF ; [.1BC2.0020.0002][.0000.002B.0002][.0000.0032.0002] -01DE ; [.1BC2.0020.0008][.0000.002B.0002][.0000.0032.0002] -00E3 ; [.1BC2.0020.0002][.0000.002D.0002] -00C3 ; [.1BC2.0020.0008][.0000.002D.0002] -0227 ; [.1BC2.0020.0002][.0000.002E.0002] -0226 ; [.1BC2.0020.0008][.0000.002E.0002] -01E1 ; [.1BC2.0020.0002][.0000.002E.0002][.0000.0032.0002] -01E0 ; [.1BC2.0020.0008][.0000.002E.0002][.0000.0032.0002] -0105 ; [.1BC2.0020.0002][.0000.0031.0002] -0104 ; [.1BC2.0020.0008][.0000.0031.0002] -0101 ; [.1BC2.0020.0002][.0000.0032.0002] -0100 ; [.1BC2.0020.0008][.0000.0032.0002] -1EA3 ; [.1BC2.0020.0002][.0000.003B.0002] -1EA2 ; [.1BC2.0020.0008][.0000.003B.0002] -0201 ; [.1BC2.0020.0002][.0000.003C.0002] -0200 ; [.1BC2.0020.0008][.0000.003C.0002] -0203 ; [.1BC2.0020.0002][.0000.003E.0002] -0202 ; [.1BC2.0020.0008][.0000.003E.0002] -1EA1 ; [.1BC2.0020.0002][.0000.0042.0002] -1EA0 ; [.1BC2.0020.0008][.0000.0042.0002] -1EB7 ; [.1BC2.0020.0002][.0000.0042.0002][.0000.0026.0002] -1EB6 ; [.1BC2.0020.0008][.0000.0042.0002][.0000.0026.0002] -1EAD ; [.1BC2.0020.0002][.0000.0042.0002][.0000.0027.0002] -1EAC ; [.1BC2.0020.0008][.0000.0042.0002][.0000.0027.0002] -1E01 ; [.1BC2.0020.0002][.0000.0044.0002] -1E00 ; [.1BC2.0020.0008][.0000.0044.0002] -1DD3 ; [.1BC2.0020.0004][.0000.010B.0004] -A733 ; [.1BC2.0020.0004][.1BC2.0020.0004] -A732 ; [.1BC2.0020.000A][.1BC2.0020.000A] -1F18E ; [.1BC2.0020.001D][.1BDB.0020.001D] -2100 ; [.1BC2.0020.0004][*038D.0020.0004][.1BF5.0020.0004] -00E6 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004] -1DD4 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004] -00C6 ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A] -1D2D ; [.1BC2.0020.0014][.0000.010B.0014][.1C25.0020.0014] -01FD ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004][.0000.0024.0002] -01FC ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A][.0000.0024.0002] -01E3 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004][.0000.0032.0002] -01E2 ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A][.0000.0032.0002] -33C2 ; [.1BC2.0020.001C][*0274.0020.001C][.1D25.0020.001C][*0274.0020.001C] -33DF ; [.1BC2.0020.001D][*0605.0020.001C][.1D25.0020.001C] -1DD5 ; [.1BC2.0020.0004][.1D58.0020.0004] -A735 ; [.1BC2.0020.0004][.1D58.0020.0004] -A734 ; [.1BC2.0020.000A][.1D58.0020.000A] -2101 ; [.1BC2.0020.0004][*038D.0020.0004][.1DEC.0020.0004] -214D ; [.1BC2.0020.000A][*038D.0020.0004][.1DEC.0020.000A] -A737 ; [.1BC2.0020.0004][.1E30.0020.0004] -A736 ; [.1BC2.0020.000A][.1E30.0020.000A] -3373 ; [.1BC2.0020.001D][.1E30.0020.001D] -1DD6 ; [.1BC2.0020.0004][.1E5E.0020.0004] -A739 ; [.1BC2.0020.0004][.1E5E.0020.0004] -A738 ; [.1BC2.0020.000A][.1E5E.0020.000A] -A73B ; [.1BC2.0020.0004][.0000.010B.0004][.1E5E.0020.0004] -A73A ; [.1BC2.0020.000A][.0000.010B.0004][.1E5E.0020.000A] -A73D ; [.1BC2.0020.0004][.1E86.0020.0004] -A73C ; [.1BC2.0020.000A][.1E86.0020.000A] -1E9A ; [.1BC2.0020.0004][.1EFB.0020.0004] -1D00 ; [.1BC6.0020.0002] -2C65 ; [.1BC7.0020.0002] -023A ; [.1BC7.0020.0008] -1D8F ; [.1BC8.0020.0002] -1D01 ; [.1BC9.0020.0002] -1D02 ; [.1BCA.0020.0002] -1D46 ; [.1BCA.0020.0014] -AB31 ; [.1BCB.0020.0002] -0250 ; [.1BCC.0020.0002] -2C6F ; [.1BCC.0020.0008] -1D44 ; [.1BCC.0020.0014] -0251 ; [.1BD0.0020.0002] -1DE7 ; [.1BD0.0020.0004] -2C6D ; [.1BD0.0020.0008] -1D45 ; [.1BD0.0020.0014] -AB30 ; [.1BD4.0020.0002] -1D90 ; [.1BD5.0020.0002] -0252 ; [.1BD6.0020.0002] -2C70 ; [.1BD6.0020.0008] -1D9B ; [.1BD6.0020.0014] -AB64 ; [.1BDA.0020.0002] -0062 ; [.1BDB.0020.0002] -FF42 ; [.1BDB.0020.0003] -1DE8 ; [.1BDB.0020.0004] -249D ; [*0310.0020.0004][.1BDB.0020.0004][*0311.0020.0004] -1D41B ; [.1BDB.0020.0005] -1D44F ; [.1BDB.0020.0005] -1D483 ; [.1BDB.0020.0005] -1D4B7 ; [.1BDB.0020.0005] -1D4EB ; [.1BDB.0020.0005] -1D51F ; [.1BDB.0020.0005] -1D553 ; [.1BDB.0020.0005] -1D587 ; [.1BDB.0020.0005] -1D5BB ; [.1BDB.0020.0005] -1D5EF ; [.1BDB.0020.0005] -1D623 ; [.1BDB.0020.0005] -1D657 ; [.1BDB.0020.0005] -1D68B ; [.1BDB.0020.0005] -24D1 ; [.1BDB.0020.0006] -0042 ; [.1BDB.0020.0008] -FF22 ; [.1BDB.0020.0009] -1F111 ; [*0310.0020.0004][.1BDB.0020.000A][*0311.0020.0004] -212C ; [.1BDB.0020.000B] -1D401 ; [.1BDB.0020.000B] -1D435 ; [.1BDB.0020.000B] -1D469 ; [.1BDB.0020.000B] -1D4D1 ; [.1BDB.0020.000B] -1D505 ; [.1BDB.0020.000B] -1D539 ; [.1BDB.0020.000B] -1D56D ; [.1BDB.0020.000B] -1D5A1 ; [.1BDB.0020.000B] -1D5D5 ; [.1BDB.0020.000B] -1D609 ; [.1BDB.0020.000B] -1D63D ; [.1BDB.0020.000B] -1D671 ; [.1BDB.0020.000B] -24B7 ; [.1BDB.0020.000C] -1F151 ; [.1BDB.0020.000C] -1D47 ; [.1BDB.0020.0014] -1D2E ; [.1BDB.0020.001D] -1F131 ; [.1BDB.0020.001D] -1F171 ; [.1BDB.0020.001D] -1E03 ; [.1BDB.0020.0002][.0000.002E.0002] -1E02 ; [.1BDB.0020.0008][.0000.002E.0002] -1E05 ; [.1BDB.0020.0002][.0000.0042.0002] -1E04 ; [.1BDB.0020.0008][.0000.0042.0002] -1E07 ; [.1BDB.0020.0002][.0000.0049.0002] -1E06 ; [.1BDB.0020.0008][.0000.0049.0002] -3374 ; [.1BDB.0020.001C][.1BC2.0020.001C][.1DAE.0020.001C] -33C3 ; [.1BDB.0020.001D][.1D9C.0020.001C] -0299 ; [.1BDF.0020.0002] -0180 ; [.1BE3.0020.0002] -0243 ; [.1BE3.0020.0008] -1D2F ; [.1BE7.0020.0002] -1D03 ; [.1BE8.0020.0002] -1D6C ; [.1BE9.0020.0002] -A797 ; [.1BEA.0020.0002] -A796 ; [.1BEA.0020.0008] -1D80 ; [.1BEB.0020.0002] -0253 ; [.1BEC.0020.0002] -0181 ; [.1BEC.0020.0008] -0183 ; [.1BF0.0020.0002] -0182 ; [.1BF0.0020.0008] -A7B5 ; [.1BF4.0020.0002] -1DE9 ; [.1BF4.0020.0004] -A7B4 ; [.1BF4.0020.0008] -0063 ; [.1BF5.0020.0002] -FF43 ; [.1BF5.0020.0003] -0368 ; [.1BF5.0020.0004] -217D ; [.1BF5.0020.0004] -249E ; [*0310.0020.0004][.1BF5.0020.0004][*0311.0020.0004] -1D41C ; [.1BF5.0020.0005] -1D450 ; [.1BF5.0020.0005] -1D484 ; [.1BF5.0020.0005] -1D4B8 ; [.1BF5.0020.0005] -1D4EC ; [.1BF5.0020.0005] -1D520 ; [.1BF5.0020.0005] -1D554 ; [.1BF5.0020.0005] -1D588 ; [.1BF5.0020.0005] -1D5BC ; [.1BF5.0020.0005] -1D5F0 ; [.1BF5.0020.0005] -1D624 ; [.1BF5.0020.0005] -1D658 ; [.1BF5.0020.0005] -1D68C ; [.1BF5.0020.0005] -24D2 ; [.1BF5.0020.0006] -0043 ; [.1BF5.0020.0008] -FF23 ; [.1BF5.0020.0009] -2103 ; [*04D7.0020.0004][.1BF5.0020.000A] -216D ; [.1BF5.0020.000A] -1F112 ; [*0310.0020.0004][.1BF5.0020.000A][*0311.0020.0004] -2102 ; [.1BF5.0020.000B] -212D ; [.1BF5.0020.000B] -1D402 ; [.1BF5.0020.000B] -1D436 ; [.1BF5.0020.000B] -1D46A ; [.1BF5.0020.000B] -1D49E ; [.1BF5.0020.000B] -1D4D2 ; [.1BF5.0020.000B] -1D56E ; [.1BF5.0020.000B] -1D5A2 ; [.1BF5.0020.000B] -1D5D6 ; [.1BF5.0020.000B] -1D60A ; [.1BF5.0020.000B] -1D63E ; [.1BF5.0020.000B] -1D672 ; [.1BF5.0020.000B] -24B8 ; [.1BF5.0020.000C] -1F12B ; [.1BF5.0020.000C] -1F152 ; [.1BF5.0020.000C] -1D9C ; [.1BF5.0020.0014] -1F132 ; [.1BF5.0020.001D] -1F172 ; [.1BF5.0020.001D] -0107 ; [.1BF5.0020.0002][.0000.0024.0002] -0106 ; [.1BF5.0020.0008][.0000.0024.0002] -0109 ; [.1BF5.0020.0002][.0000.0027.0002] -0108 ; [.1BF5.0020.0008][.0000.0027.0002] -010D ; [.1BF5.0020.0002][.0000.0028.0002] -010C ; [.1BF5.0020.0008][.0000.0028.0002] -010B ; [.1BF5.0020.0002][.0000.002E.0002] -010A ; [.1BF5.0020.0008][.0000.002E.0002] -00E7 ; [.1BF5.0020.0002][.0000.0030.0002] -1DD7 ; [.1BF5.0020.0004][.0000.0030.0004] -00C7 ; [.1BF5.0020.0008][.0000.0030.0002] -1E09 ; [.1BF5.0020.0002][.0000.0030.0002][.0000.0024.0002] -1E08 ; [.1BF5.0020.0008][.0000.0030.0002][.0000.0024.0002] -3388 ; [.1BF5.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] -33C4 ; [.1BF5.0020.001C][.1BF5.0020.001C] -1F12D ; [.1BF5.0020.000C][.1C0A.0020.000C] -33C5 ; [.1BF5.0020.001C][.1C0A.0020.001C] -33C6 ; [.1BF5.0020.001D][*0605.0020.001C][.1CE0.0020.001C][.1C6F.0020.001C] -1F191 ; [.1BF5.0020.001D][.1CF2.0020.001D] -339D ; [.1BF5.0020.001C][.1D25.0020.001C] -33A0 ; [.1BF5.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] -33A4 ; [.1BF5.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] -2105 ; [.1BF5.0020.0004][*038D.0020.0004][.1D58.0020.0004] -33C7 ; [.1BF5.0020.001D][.1D58.0020.001C][*0274.0020.001C] -1F192 ; [.1BF5.0020.001D][.1D58.0020.001D][.1D58.0020.001D][.1CF2.0020.001D] -2106 ; [.1BF5.0020.0004][*038D.0020.0004][.1E30.0020.0004] -1D04 ; [.1BF9.0020.0002] -023C ; [.1BFA.0020.0002] -023B ; [.1BFA.0020.0008] -A793 ; [.1BFE.0020.0002] -A792 ; [.1BFE.0020.0008] -A794 ; [.1BFF.0020.0002] -0188 ; [.1C00.0020.0002] -0187 ; [.1C00.0020.0008] -0255 ; [.1C04.0020.0002] -1D9D ; [.1C04.0020.0014] -2184 ; [.1C08.0020.0002] -2183 ; [.1C08.0020.0008] -A73F ; [.1C09.0020.0002] -A73E ; [.1C09.0020.0008] -0064 ; [.1C0A.0020.0002] -FF44 ; [.1C0A.0020.0003] -0369 ; [.1C0A.0020.0004] -217E ; [.1C0A.0020.0004] -249F ; [*0310.0020.0004][.1C0A.0020.0004][*0311.0020.0004] -2146 ; [.1C0A.0020.0005] -1D41D ; [.1C0A.0020.0005] -1D451 ; [.1C0A.0020.0005] -1D485 ; [.1C0A.0020.0005] -1D4B9 ; [.1C0A.0020.0005] -1D4ED ; [.1C0A.0020.0005] -1D521 ; [.1C0A.0020.0005] -1D555 ; [.1C0A.0020.0005] -1D589 ; [.1C0A.0020.0005] -1D5BD ; [.1C0A.0020.0005] -1D5F1 ; [.1C0A.0020.0005] -1D625 ; [.1C0A.0020.0005] -1D659 ; [.1C0A.0020.0005] -1D68D ; [.1C0A.0020.0005] -24D3 ; [.1C0A.0020.0006] -0044 ; [.1C0A.0020.0008] -FF24 ; [.1C0A.0020.0009] -216E ; [.1C0A.0020.000A] -1F113 ; [*0310.0020.0004][.1C0A.0020.000A][*0311.0020.0004] -2145 ; [.1C0A.0020.000B] -1D403 ; [.1C0A.0020.000B] -1D437 ; [.1C0A.0020.000B] -1D46B ; [.1C0A.0020.000B] -1D49F ; [.1C0A.0020.000B] -1D4D3 ; [.1C0A.0020.000B] -1D507 ; [.1C0A.0020.000B] -1D53B ; [.1C0A.0020.000B] -1D56F ; [.1C0A.0020.000B] -1D5A3 ; [.1C0A.0020.000B] -1D5D7 ; [.1C0A.0020.000B] -1D60B ; [.1C0A.0020.000B] -1D63F ; [.1C0A.0020.000B] -1D673 ; [.1C0A.0020.000B] -24B9 ; [.1C0A.0020.000C] -1F153 ; [.1C0A.0020.000C] -1D48 ; [.1C0A.0020.0014] -1D30 ; [.1C0A.0020.001D] -1F133 ; [.1C0A.0020.001D] -1F173 ; [.1C0A.0020.001D] -010F ; [.1C0A.0020.0002][.0000.0028.0002] -010E ; [.1C0A.0020.0008][.0000.0028.0002] -1E0B ; [.1C0A.0020.0002][.0000.002E.0002] -1E0A ; [.1C0A.0020.0008][.0000.002E.0002] -1E11 ; [.1C0A.0020.0002][.0000.0030.0002] -1E10 ; [.1C0A.0020.0008][.0000.0030.0002] -0111 ; [.1C0A.0020.0002][.0000.0039.0002] -0110 ; [.1C0A.0020.0008][.0000.0039.0002] -1E0D ; [.1C0A.0020.0002][.0000.0042.0002] -1E0C ; [.1C0A.0020.0008][.0000.0042.0002] -1E13 ; [.1C0A.0020.0002][.0000.0046.0002] -1E12 ; [.1C0A.0020.0008][.0000.0046.0002] -1E0F ; [.1C0A.0020.0002][.0000.0049.0002] -1E0E ; [.1C0A.0020.0008][.0000.0049.0002] -00F0 ; [.1C0A.0020.0004][.0000.010B.0004] -1DD9 ; [.1C0A.0020.0004][.0000.010B.0004] -00D0 ; [.1C0A.0020.000A][.0000.010B.0004] -1D9E ; [.1C0A.0020.0014][.0000.010B.0014] -1DD8 ; [.1C0A.0020.0004][.0000.010C.0004] -A77A ; [.1C0A.0020.0004][.0000.010C.0004] -A779 ; [.1C0A.0020.000A][.0000.010C.0004] -3372 ; [.1C0A.0020.001C][.1BC2.0020.001C] -0238 ; [.1C0A.0020.0004][.1BDB.0020.0004] -33C8 ; [.1C0A.0020.001C][.1BDB.0020.001D] -1F190 ; [.1C0A.0020.001D][.1CC7.0020.001D] -3397 ; [.1C0A.0020.001C][.1CF2.0020.001C] -3377 ; [.1C0A.0020.001C][.1D25.0020.001C] -3378 ; [.1C0A.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] -3379 ; [.1C0A.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] -01F3 ; [.1C0A.0020.0004][.1E9C.0020.0004] -02A3 ; [.1C0A.0020.0004][.1E9C.0020.0004] -01F2 ; [.1C0A.0020.000A][.1E9C.0020.0004] -01F1 ; [.1C0A.0020.000A][.1E9C.0020.000A] -01C6 ; [.1C0A.0020.0004][.1E9C.0020.0004][.0000.0028.0004] -01C5 ; [.1C0A.0020.000A][.1E9C.0020.0004][.0000.0028.0004] -01C4 ; [.1C0A.0020.000A][.1E9C.0020.000A][.0000.0028.0004] -02A5 ; [.1C0A.0020.0004][.1EAF.0020.0004] -02A4 ; [.1C0A.0020.0004][.1EB9.0020.0004] -1D05 ; [.1C0E.0020.0002] -1D06 ; [.1C0F.0020.0002] -1D6D ; [.1C10.0020.0002] -1D81 ; [.1C11.0020.0002] -0256 ; [.1C12.0020.0002] -0189 ; [.1C12.0020.0008] -0257 ; [.1C16.0020.0002] -018A ; [.1C16.0020.0008] -1D91 ; [.1C1A.0020.0002] -018C ; [.1C1B.0020.0002] -018B ; [.1C1B.0020.0008] -0221 ; [.1C1F.0020.0002] -A771 ; [.1C23.0020.0002] -1E9F ; [.1C24.0020.0002] -0065 ; [.1C25.0020.0002] -FF45 ; [.1C25.0020.0003] -0364 ; [.1C25.0020.0004] -24A0 ; [*0310.0020.0004][.1C25.0020.0004][*0311.0020.0004] -212F ; [.1C25.0020.0005] -2147 ; [.1C25.0020.0005] -1D41E ; [.1C25.0020.0005] -1D452 ; [.1C25.0020.0005] -1D486 ; [.1C25.0020.0005] -1D4EE ; [.1C25.0020.0005] -1D522 ; [.1C25.0020.0005] -1D556 ; [.1C25.0020.0005] -1D58A ; [.1C25.0020.0005] -1D5BE ; [.1C25.0020.0005] -1D5F2 ; [.1C25.0020.0005] -1D626 ; [.1C25.0020.0005] -1D65A ; [.1C25.0020.0005] -1D68E ; [.1C25.0020.0005] -24D4 ; [.1C25.0020.0006] -0045 ; [.1C25.0020.0008] -FF25 ; [.1C25.0020.0009] -1F114 ; [*0310.0020.0004][.1C25.0020.000A][*0311.0020.0004] -2130 ; [.1C25.0020.000B] -1D404 ; [.1C25.0020.000B] -1D438 ; [.1C25.0020.000B] -1D46C ; [.1C25.0020.000B] -1D4D4 ; [.1C25.0020.000B] -1D508 ; [.1C25.0020.000B] -1D53C ; [.1C25.0020.000B] -1D570 ; [.1C25.0020.000B] -1D5A4 ; [.1C25.0020.000B] -1D5D8 ; [.1C25.0020.000B] -1D60C ; [.1C25.0020.000B] -1D640 ; [.1C25.0020.000B] -1D674 ; [.1C25.0020.000B] -24BA ; [.1C25.0020.000C] -1F154 ; [.1C25.0020.000C] -1D49 ; [.1C25.0020.0014] -2091 ; [.1C25.0020.0015] -1D31 ; [.1C25.0020.001D] -1F134 ; [.1C25.0020.001D] -1F174 ; [.1C25.0020.001D] -00E9 ; [.1C25.0020.0002][.0000.0024.0002] -00C9 ; [.1C25.0020.0008][.0000.0024.0002] -00E8 ; [.1C25.0020.0002][.0000.0025.0002] -00C8 ; [.1C25.0020.0008][.0000.0025.0002] -0115 ; [.1C25.0020.0002][.0000.0026.0002] -0114 ; [.1C25.0020.0008][.0000.0026.0002] -00EA ; [.1C25.0020.0002][.0000.0027.0002] -00CA ; [.1C25.0020.0008][.0000.0027.0002] -1EBF ; [.1C25.0020.0002][.0000.0027.0002][.0000.0024.0002] -1EBE ; [.1C25.0020.0008][.0000.0027.0002][.0000.0024.0002] -1EC1 ; [.1C25.0020.0002][.0000.0027.0002][.0000.0025.0002] -1EC0 ; [.1C25.0020.0008][.0000.0027.0002][.0000.0025.0002] -1EC5 ; [.1C25.0020.0002][.0000.0027.0002][.0000.002D.0002] -1EC4 ; [.1C25.0020.0008][.0000.0027.0002][.0000.002D.0002] -1EC3 ; [.1C25.0020.0002][.0000.0027.0002][.0000.003B.0002] -1EC2 ; [.1C25.0020.0008][.0000.0027.0002][.0000.003B.0002] -011B ; [.1C25.0020.0002][.0000.0028.0002] -011A ; [.1C25.0020.0008][.0000.0028.0002] -00EB ; [.1C25.0020.0002][.0000.002B.0002] -00CB ; [.1C25.0020.0008][.0000.002B.0002] -1EBD ; [.1C25.0020.0002][.0000.002D.0002] -1EBC ; [.1C25.0020.0008][.0000.002D.0002] -0117 ; [.1C25.0020.0002][.0000.002E.0002] -0116 ; [.1C25.0020.0008][.0000.002E.0002] -0229 ; [.1C25.0020.0002][.0000.0030.0002] -0228 ; [.1C25.0020.0008][.0000.0030.0002] -1E1D ; [.1C25.0020.0002][.0000.0030.0002][.0000.0026.0002] -1E1C ; [.1C25.0020.0008][.0000.0030.0002][.0000.0026.0002] -0119 ; [.1C25.0020.0002][.0000.0031.0002] -0118 ; [.1C25.0020.0008][.0000.0031.0002] -0113 ; [.1C25.0020.0002][.0000.0032.0002] -0112 ; [.1C25.0020.0008][.0000.0032.0002] -1E17 ; [.1C25.0020.0002][.0000.0032.0002][.0000.0024.0002] -1E16 ; [.1C25.0020.0008][.0000.0032.0002][.0000.0024.0002] -1E15 ; [.1C25.0020.0002][.0000.0032.0002][.0000.0025.0002] -1E14 ; [.1C25.0020.0008][.0000.0032.0002][.0000.0025.0002] -1EBB ; [.1C25.0020.0002][.0000.003B.0002] -1EBA ; [.1C25.0020.0008][.0000.003B.0002] -0205 ; [.1C25.0020.0002][.0000.003C.0002] -0204 ; [.1C25.0020.0008][.0000.003C.0002] -0207 ; [.1C25.0020.0002][.0000.003E.0002] -0206 ; [.1C25.0020.0008][.0000.003E.0002] -1EB9 ; [.1C25.0020.0002][.0000.0042.0002] -1EB8 ; [.1C25.0020.0008][.0000.0042.0002] -1EC7 ; [.1C25.0020.0002][.0000.0042.0002][.0000.0027.0002] -1EC6 ; [.1C25.0020.0008][.0000.0042.0002][.0000.0027.0002] -1E19 ; [.1C25.0020.0002][.0000.0046.0002] -1E18 ; [.1C25.0020.0008][.0000.0046.0002] -1E1B ; [.1C25.0020.0002][.0000.0048.0002] -1E1A ; [.1C25.0020.0008][.0000.0048.0002] -32CD ; [.1C25.0020.001C][.1DAE.0020.001C][.1C6F.0020.001C] -32CE ; [.1C25.0020.001C][.1E5E.0020.001D] -1D07 ; [.1C29.0020.0002] -AB32 ; [.1C2A.0020.0002] -AB33 ; [.1C2B.0020.0002] -0247 ; [.1C2C.0020.0002] -0246 ; [.1C2C.0020.0008] -1D92 ; [.1C30.0020.0002] -AB34 ; [.1C31.0020.0002] -2C78 ; [.1C32.0020.0002] -01DD ; [.1C33.0020.0002] -018E ; [.1C33.0020.0008] -1D32 ; [.1C33.0020.001D] -2C7B ; [.1C37.0020.0002] -0259 ; [.1C38.0020.0002] -1DEA ; [.1C38.0020.0004] -018F ; [.1C38.0020.0008] -1D4A ; [.1C38.0020.0014] -2094 ; [.1C38.0020.0015] -1D95 ; [.1C3C.0020.0002] -025B ; [.1C3D.0020.0002] -0190 ; [.1C3D.0020.0008] -2107 ; [.1C3D.0020.000A] -1D4B ; [.1C3D.0020.0014] -1D93 ; [.1C41.0020.0002] -0258 ; [.1C42.0020.0002] -025A ; [.1C46.0020.0002] -025C ; [.1C4A.0020.0002] -A7AB ; [.1C4A.0020.0008] -1D9F ; [.1C4A.0020.0014] -1D94 ; [.1C4E.0020.0002] -1D08 ; [.1C4F.0020.0002] -1D4C ; [.1C4F.0020.0014] -025D ; [.1C50.0020.0002] -025E ; [.1C54.0020.0002] -029A ; [.1C58.0020.0002] -0264 ; [.1C5C.0020.0002] -0066 ; [.1C60.0020.0002] -FF46 ; [.1C60.0020.0003] -1DEB ; [.1C60.0020.0004] -24A1 ; [*0310.0020.0004][.1C60.0020.0004][*0311.0020.0004] -1D41F ; [.1C60.0020.0005] -1D453 ; [.1C60.0020.0005] -1D487 ; [.1C60.0020.0005] -1D4BB ; [.1C60.0020.0005] -1D4EF ; [.1C60.0020.0005] -1D523 ; [.1C60.0020.0005] -1D557 ; [.1C60.0020.0005] -1D58B ; [.1C60.0020.0005] -1D5BF ; [.1C60.0020.0005] -1D5F3 ; [.1C60.0020.0005] -1D627 ; [.1C60.0020.0005] -1D65B ; [.1C60.0020.0005] -1D68F ; [.1C60.0020.0005] -24D5 ; [.1C60.0020.0006] -0046 ; [.1C60.0020.0008] -FF26 ; [.1C60.0020.0009] -2109 ; [*04D7.0020.0004][.1C60.0020.000A] -1F115 ; [*0310.0020.0004][.1C60.0020.000A][*0311.0020.0004] -2131 ; [.1C60.0020.000B] -1D405 ; [.1C60.0020.000B] -1D439 ; [.1C60.0020.000B] -1D46D ; [.1C60.0020.000B] -1D4D5 ; [.1C60.0020.000B] -1D509 ; [.1C60.0020.000B] -1D53D ; [.1C60.0020.000B] -1D571 ; [.1C60.0020.000B] -1D5A5 ; [.1C60.0020.000B] -1D5D9 ; [.1C60.0020.000B] -1D60D ; [.1C60.0020.000B] -1D641 ; [.1C60.0020.000B] -1D675 ; [.1C60.0020.000B] -24BB ; [.1C60.0020.000C] -1F155 ; [.1C60.0020.000C] -1DA0 ; [.1C60.0020.0014] -1F135 ; [.1C60.0020.001D] -1F175 ; [.1C60.0020.001D] -1E1F ; [.1C60.0020.0002][.0000.002E.0002] -1E1E ; [.1C60.0020.0008][.0000.002E.0002] -A77C ; [.1C60.0020.0004][.0000.010C.0004] -A77B ; [.1C60.0020.000A][.0000.010C.0004] -213B ; [.1C60.0020.000A][.1BC2.0020.000A][.1E7A.0020.000A] -FB00 ; [.1C60.0020.0004][.1C60.0020.0004] -FB03 ; [.1C60.0020.0004][.1C60.0020.0004][.1CAD.0020.0004] -FB04 ; [.1C60.0020.0004][.1C60.0020.0004][.1CF2.0020.0004] -FB01 ; [.1C60.0020.0004][.1CAD.0020.0004] -FB02 ; [.1C60.0020.0004][.1CF2.0020.0004] -3399 ; [.1C60.0020.001C][.1D25.0020.001C] -02A9 ; [.1C60.0020.0004][.1D53.0020.0004] -1F193 ; [.1C60.0020.001D][.1DAE.0020.001D][.1C25.0020.001D][.1C25.0020.001D] -A730 ; [.1C64.0020.0002] -AB35 ; [.1C65.0020.0002] -A799 ; [.1C66.0020.0002] -A798 ; [.1C66.0020.0008] -1D6E ; [.1C67.0020.0002] -1D82 ; [.1C68.0020.0002] -0192 ; [.1C69.0020.0002] -0191 ; [.1C69.0020.0008] -214E ; [.1C6D.0020.0002] -2132 ; [.1C6D.0020.0008] -A7FB ; [.1C6E.0020.0002] -0067 ; [.1C6F.0020.0002] -FF47 ; [.1C6F.0020.0003] -1DDA ; [.1C6F.0020.0004] -24A2 ; [*0310.0020.0004][.1C6F.0020.0004][*0311.0020.0004] -210A ; [.1C6F.0020.0005] -1D420 ; [.1C6F.0020.0005] -1D454 ; [.1C6F.0020.0005] -1D488 ; [.1C6F.0020.0005] -1D4F0 ; [.1C6F.0020.0005] -1D524 ; [.1C6F.0020.0005] -1D558 ; [.1C6F.0020.0005] -1D58C ; [.1C6F.0020.0005] -1D5C0 ; [.1C6F.0020.0005] -1D5F4 ; [.1C6F.0020.0005] -1D628 ; [.1C6F.0020.0005] -1D65C ; [.1C6F.0020.0005] -1D690 ; [.1C6F.0020.0005] -24D6 ; [.1C6F.0020.0006] -0047 ; [.1C6F.0020.0008] -FF27 ; [.1C6F.0020.0009] -1F116 ; [*0310.0020.0004][.1C6F.0020.000A][*0311.0020.0004] -1D406 ; [.1C6F.0020.000B] -1D43A ; [.1C6F.0020.000B] -1D46E ; [.1C6F.0020.000B] -1D4A2 ; [.1C6F.0020.000B] -1D4D6 ; [.1C6F.0020.000B] -1D50A ; [.1C6F.0020.000B] -1D53E ; [.1C6F.0020.000B] -1D572 ; [.1C6F.0020.000B] -1D5A6 ; [.1C6F.0020.000B] -1D5DA ; [.1C6F.0020.000B] -1D60E ; [.1C6F.0020.000B] -1D642 ; [.1C6F.0020.000B] -1D676 ; [.1C6F.0020.000B] -24BC ; [.1C6F.0020.000C] -1F156 ; [.1C6F.0020.000C] -1D4D ; [.1C6F.0020.0014] -1D33 ; [.1C6F.0020.001D] -1F136 ; [.1C6F.0020.001D] -1F176 ; [.1C6F.0020.001D] -01F5 ; [.1C6F.0020.0002][.0000.0024.0002] -01F4 ; [.1C6F.0020.0008][.0000.0024.0002] -011F ; [.1C6F.0020.0002][.0000.0026.0002] -011E ; [.1C6F.0020.0008][.0000.0026.0002] -011D ; [.1C6F.0020.0002][.0000.0027.0002] -011C ; [.1C6F.0020.0008][.0000.0027.0002] -01E7 ; [.1C6F.0020.0002][.0000.0028.0002] -01E6 ; [.1C6F.0020.0008][.0000.0028.0002] -0121 ; [.1C6F.0020.0002][.0000.002E.0002] -0120 ; [.1C6F.0020.0008][.0000.002E.0002] -0123 ; [.1C6F.0020.0002][.0000.0030.0002] -0122 ; [.1C6F.0020.0008][.0000.0030.0002] -1E21 ; [.1C6F.0020.0002][.0000.0032.0002] -1E20 ; [.1C6F.0020.0008][.0000.0032.0002] -A7A1 ; [.1C6F.0020.0004][.0000.0035.0004] -A7A0 ; [.1C6F.0020.000A][.0000.0035.0004] -1D79 ; [.1C6F.0020.0004][.0000.010C.0004] -A77D ; [.1C6F.0020.000A][.0000.010C.0004] -33FF ; [.1C6F.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] -3387 ; [.1C6F.0020.001D][.1BDB.0020.001D] -3393 ; [.1C6F.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] -33AC ; [.1C6F.0020.001D][.1D87.0020.001D][.1BC2.0020.001C] -33C9 ; [.1C6F.0020.001D][.1E86.0020.001C] -0261 ; [.1C73.0020.0002] -A7AC ; [.1C73.0020.0008] -1DA2 ; [.1C73.0020.0014] -AB36 ; [.1C77.0020.0002] -0262 ; [.1C78.0020.0002] -1DDB ; [.1C78.0020.0004] -01E5 ; [.1C7C.0020.0002] -01E4 ; [.1C7C.0020.0008] -1D83 ; [.1C80.0020.0002] -0260 ; [.1C81.0020.0002] -0193 ; [.1C81.0020.0008] -029B ; [.1C85.0020.0002] -1D77 ; [.1C89.0020.0002] -A77F ; [.1C8A.0020.0002] -A77E ; [.1C8A.0020.0008] -0263 ; [.1C8B.0020.0002] -0194 ; [.1C8B.0020.0008] -02E0 ; [.1C8B.0020.0014] -01A3 ; [.1C8F.0020.0002] -01A2 ; [.1C8F.0020.0008] -0068 ; [.1C93.0020.0002] -FF48 ; [.1C93.0020.0003] -036A ; [.1C93.0020.0004] -24A3 ; [*0310.0020.0004][.1C93.0020.0004][*0311.0020.0004] -210E ; [.1C93.0020.0005] -1D421 ; [.1C93.0020.0005] -1D489 ; [.1C93.0020.0005] -1D4BD ; [.1C93.0020.0005] -1D4F1 ; [.1C93.0020.0005] -1D525 ; [.1C93.0020.0005] -1D559 ; [.1C93.0020.0005] -1D58D ; [.1C93.0020.0005] -1D5C1 ; [.1C93.0020.0005] -1D5F5 ; [.1C93.0020.0005] -1D629 ; [.1C93.0020.0005] -1D65D ; [.1C93.0020.0005] -1D691 ; [.1C93.0020.0005] -24D7 ; [.1C93.0020.0006] -0048 ; [.1C93.0020.0008] -FF28 ; [.1C93.0020.0009] -1F117 ; [*0310.0020.0004][.1C93.0020.000A][*0311.0020.0004] -210B ; [.1C93.0020.000B] -210C ; [.1C93.0020.000B] -210D ; [.1C93.0020.000B] -1D407 ; [.1C93.0020.000B] -1D43B ; [.1C93.0020.000B] -1D46F ; [.1C93.0020.000B] -1D4D7 ; [.1C93.0020.000B] -1D573 ; [.1C93.0020.000B] -1D5A7 ; [.1C93.0020.000B] -1D5DB ; [.1C93.0020.000B] -1D60F ; [.1C93.0020.000B] -1D643 ; [.1C93.0020.000B] -1D677 ; [.1C93.0020.000B] -24BD ; [.1C93.0020.000C] -1F157 ; [.1C93.0020.000C] -02B0 ; [.1C93.0020.0014] -2095 ; [.1C93.0020.0015] -1D34 ; [.1C93.0020.001D] -1F137 ; [.1C93.0020.001D] -1F177 ; [.1C93.0020.001D] -0125 ; [.1C93.0020.0002][.0000.0027.0002] -0124 ; [.1C93.0020.0008][.0000.0027.0002] -021F ; [.1C93.0020.0002][.0000.0028.0002] -021E ; [.1C93.0020.0008][.0000.0028.0002] -1E27 ; [.1C93.0020.0002][.0000.002B.0002] -1E26 ; [.1C93.0020.0008][.0000.002B.0002] -1E23 ; [.1C93.0020.0002][.0000.002E.0002] -1E22 ; [.1C93.0020.0008][.0000.002E.0002] -1E29 ; [.1C93.0020.0002][.0000.0030.0002] -1E28 ; [.1C93.0020.0008][.0000.0030.0002] -0127 ; [.1C93.0020.0002][.0000.0039.0002] -210F ; [.1C93.0020.0002][.0000.0039.0002] -0126 ; [.1C93.0020.0008][.0000.0039.0002] -A7F8 ; [.1C93.0020.0014][.0000.0039.0014] -1E25 ; [.1C93.0020.0002][.0000.0042.0002] -1E24 ; [.1C93.0020.0008][.0000.0042.0002] -1E2B ; [.1C93.0020.0002][.0000.0047.0002] -1E2A ; [.1C93.0020.0008][.0000.0047.0002] -1E96 ; [.1C93.0020.0002][.0000.0049.0002] -33CA ; [.1C93.0020.001C][.1BC2.0020.001C] -32CC ; [.1C93.0020.001D][.1C6F.0020.001C] -33CB ; [.1C93.0020.001D][.1D87.0020.001D] -3371 ; [.1C93.0020.001C][.1D87.0020.001D][.1BC2.0020.001C] -1F14A ; [.1C93.0020.001D][.1E5E.0020.001D] -3390 ; [.1C93.0020.001D][.1E9C.0020.001C] -029C ; [.1C97.0020.0002] -0195 ; [.1C9B.0020.0002] -01F6 ; [.1C9B.0020.0008] -A795 ; [.1C9F.0020.0002] -0266 ; [.1CA0.0020.0002] -A7AA ; [.1CA0.0020.0008] -02B1 ; [.1CA0.0020.0014] -2C68 ; [.1CA4.0020.0002] -2C67 ; [.1CA4.0020.0008] -2C76 ; [.1CA5.0020.0002] -2C75 ; [.1CA5.0020.0008] -A727 ; [.1CA6.0020.0002] -A726 ; [.1CA6.0020.0008] -AB5C ; [.1CA6.0020.0014] -0267 ; [.1CA7.0020.0002] -02BB ; [.1CAB.0020.0002] -02BD ; [.1CAC.0020.0002] -0069 ; [.1CAD.0020.0002] -FF49 ; [.1CAD.0020.0003] -0365 ; [.1CAD.0020.0004] -2170 ; [.1CAD.0020.0004] -24A4 ; [*0310.0020.0004][.1CAD.0020.0004][*0311.0020.0004] -2139 ; [.1CAD.0020.0005] -2148 ; [.1CAD.0020.0005] -1D422 ; [.1CAD.0020.0005] -1D456 ; [.1CAD.0020.0005] -1D48A ; [.1CAD.0020.0005] -1D4BE ; [.1CAD.0020.0005] -1D4F2 ; [.1CAD.0020.0005] -1D526 ; [.1CAD.0020.0005] -1D55A ; [.1CAD.0020.0005] -1D58E ; [.1CAD.0020.0005] -1D5C2 ; [.1CAD.0020.0005] -1D5F6 ; [.1CAD.0020.0005] -1D62A ; [.1CAD.0020.0005] -1D65E ; [.1CAD.0020.0005] -1D692 ; [.1CAD.0020.0005] -24D8 ; [.1CAD.0020.0006] -0049 ; [.1CAD.0020.0008] -FF29 ; [.1CAD.0020.0009] -2160 ; [.1CAD.0020.000A] -1F118 ; [*0310.0020.0004][.1CAD.0020.000A][*0311.0020.0004] -2110 ; [.1CAD.0020.000B] -2111 ; [.1CAD.0020.000B] -1D408 ; [.1CAD.0020.000B] -1D43C ; [.1CAD.0020.000B] -1D470 ; [.1CAD.0020.000B] -1D4D8 ; [.1CAD.0020.000B] -1D540 ; [.1CAD.0020.000B] -1D574 ; [.1CAD.0020.000B] -1D5A8 ; [.1CAD.0020.000B] -1D5DC ; [.1CAD.0020.000B] -1D610 ; [.1CAD.0020.000B] -1D644 ; [.1CAD.0020.000B] -1D678 ; [.1CAD.0020.000B] -24BE ; [.1CAD.0020.000C] -1F158 ; [.1CAD.0020.000C] -2071 ; [.1CAD.0020.0014] -1D62 ; [.1CAD.0020.0015] -1D35 ; [.1CAD.0020.001D] -1F138 ; [.1CAD.0020.001D] -1F178 ; [.1CAD.0020.001D] -00ED ; [.1CAD.0020.0002][.0000.0024.0002] -00CD ; [.1CAD.0020.0008][.0000.0024.0002] -00EC ; [.1CAD.0020.0002][.0000.0025.0002] -00CC ; [.1CAD.0020.0008][.0000.0025.0002] -012D ; [.1CAD.0020.0002][.0000.0026.0002] -012C ; [.1CAD.0020.0008][.0000.0026.0002] -00EE ; [.1CAD.0020.0002][.0000.0027.0002] -00CE ; [.1CAD.0020.0008][.0000.0027.0002] -01D0 ; [.1CAD.0020.0002][.0000.0028.0002] -01CF ; [.1CAD.0020.0008][.0000.0028.0002] -00EF ; [.1CAD.0020.0002][.0000.002B.0002] -00CF ; [.1CAD.0020.0008][.0000.002B.0002] -1E2F ; [.1CAD.0020.0002][.0000.002B.0002][.0000.0024.0002] -1E2E ; [.1CAD.0020.0008][.0000.002B.0002][.0000.0024.0002] -0129 ; [.1CAD.0020.0002][.0000.002D.0002] -0128 ; [.1CAD.0020.0008][.0000.002D.0002] -0130 ; [.1CAD.0020.0008][.0000.002E.0002] -012F ; [.1CAD.0020.0002][.0000.0031.0002] -012E ; [.1CAD.0020.0008][.0000.0031.0002] -012B ; [.1CAD.0020.0002][.0000.0032.0002] -012A ; [.1CAD.0020.0008][.0000.0032.0002] -1EC9 ; [.1CAD.0020.0002][.0000.003B.0002] -1EC8 ; [.1CAD.0020.0008][.0000.003B.0002] -0209 ; [.1CAD.0020.0002][.0000.003C.0002] -0208 ; [.1CAD.0020.0008][.0000.003C.0002] -020B ; [.1CAD.0020.0002][.0000.003E.0002] -020A ; [.1CAD.0020.0008][.0000.003E.0002] -1ECB ; [.1CAD.0020.0002][.0000.0042.0002] -1ECA ; [.1CAD.0020.0008][.0000.0042.0002] -1E2D ; [.1CAD.0020.0002][.0000.0048.0002] -1E2C ; [.1CAD.0020.0008][.0000.0048.0002] -1F18B ; [.1CAD.0020.001D][.1BF5.0020.001D] -1F194 ; [.1CAD.0020.001D][.1C0A.0020.001D] -2171 ; [.1CAD.0020.0004][.1CAD.0020.0004] -2161 ; [.1CAD.0020.000A][.1CAD.0020.000A] -2172 ; [.1CAD.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] -2162 ; [.1CAD.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] -0133 ; [.1CAD.0020.0004][.1CC7.0020.0004] -0132 ; [.1CAD.0020.000A][.1CC7.0020.000A] -33CC ; [.1CAD.0020.001C][.1D34.0020.001C] -337A ; [.1CAD.0020.001D][.1E30.0020.001D] -2173 ; [.1CAD.0020.0004][.1E5E.0020.0004] -2163 ; [.1CAD.0020.000A][.1E5E.0020.000A] -2178 ; [.1CAD.0020.0004][.1E7A.0020.0004] -2168 ; [.1CAD.0020.000A][.1E7A.0020.000A] -0131 ; [.1CB1.0020.0002] -1D6A4 ; [.1CB1.0020.0005] -026A ; [.1CB5.0020.0002] -1DA6 ; [.1CB5.0020.0014] -A7FE ; [.1CB9.0020.0002] -A7F7 ; [.1CBA.0020.0002] -1D09 ; [.1CBB.0020.0002] -1D4E ; [.1CBB.0020.0014] -0268 ; [.1CBC.0020.0002] -0197 ; [.1CBC.0020.0008] -1DA4 ; [.1CBC.0020.0014] -1D7B ; [.1CC0.0020.0002] -1DA7 ; [.1CC0.0020.0014] -1D96 ; [.1CC1.0020.0002] -0269 ; [.1CC2.0020.0002] -0196 ; [.1CC2.0020.0008] -1DA5 ; [.1CC2.0020.0014] -1D7C ; [.1CC6.0020.0002] -006A ; [.1CC7.0020.0002] -FF4A ; [.1CC7.0020.0003] -24A5 ; [*0310.0020.0004][.1CC7.0020.0004][*0311.0020.0004] -2149 ; [.1CC7.0020.0005] -1D423 ; [.1CC7.0020.0005] -1D457 ; [.1CC7.0020.0005] -1D48B ; [.1CC7.0020.0005] -1D4BF ; [.1CC7.0020.0005] -1D4F3 ; [.1CC7.0020.0005] -1D527 ; [.1CC7.0020.0005] -1D55B ; [.1CC7.0020.0005] -1D58F ; [.1CC7.0020.0005] -1D5C3 ; [.1CC7.0020.0005] -1D5F7 ; [.1CC7.0020.0005] -1D62B ; [.1CC7.0020.0005] -1D65F ; [.1CC7.0020.0005] -1D693 ; [.1CC7.0020.0005] -24D9 ; [.1CC7.0020.0006] -004A ; [.1CC7.0020.0008] -FF2A ; [.1CC7.0020.0009] -1F119 ; [*0310.0020.0004][.1CC7.0020.000A][*0311.0020.0004] -1D409 ; [.1CC7.0020.000B] -1D43D ; [.1CC7.0020.000B] -1D471 ; [.1CC7.0020.000B] -1D4A5 ; [.1CC7.0020.000B] -1D4D9 ; [.1CC7.0020.000B] -1D50D ; [.1CC7.0020.000B] -1D541 ; [.1CC7.0020.000B] -1D575 ; [.1CC7.0020.000B] -1D5A9 ; [.1CC7.0020.000B] -1D5DD ; [.1CC7.0020.000B] -1D611 ; [.1CC7.0020.000B] -1D645 ; [.1CC7.0020.000B] -1D679 ; [.1CC7.0020.000B] -24BF ; [.1CC7.0020.000C] -1F159 ; [.1CC7.0020.000C] -02B2 ; [.1CC7.0020.0014] -2C7C ; [.1CC7.0020.0015] -1D36 ; [.1CC7.0020.001D] -1F139 ; [.1CC7.0020.001D] -1F179 ; [.1CC7.0020.001D] -0135 ; [.1CC7.0020.0002][.0000.0027.0002] -0134 ; [.1CC7.0020.0008][.0000.0027.0002] -01F0 ; [.1CC7.0020.0002][.0000.0028.0002] -0237 ; [.1CCB.0020.0002] -1D6A5 ; [.1CCB.0020.0005] -1D0A ; [.1CCF.0020.0002] -0249 ; [.1CD0.0020.0002] -0248 ; [.1CD0.0020.0008] -029D ; [.1CD4.0020.0002] -A7B2 ; [.1CD4.0020.0008] -1DA8 ; [.1CD4.0020.0014] -025F ; [.1CD8.0020.0002] -1DA1 ; [.1CD8.0020.0014] -0284 ; [.1CDC.0020.0002] -006B ; [.1CE0.0020.0002] -FF4B ; [.1CE0.0020.0003] -1DDC ; [.1CE0.0020.0004] -24A6 ; [*0310.0020.0004][.1CE0.0020.0004][*0311.0020.0004] -1D424 ; [.1CE0.0020.0005] -1D458 ; [.1CE0.0020.0005] -1D48C ; [.1CE0.0020.0005] -1D4C0 ; [.1CE0.0020.0005] -1D4F4 ; [.1CE0.0020.0005] -1D528 ; [.1CE0.0020.0005] -1D55C ; [.1CE0.0020.0005] -1D590 ; [.1CE0.0020.0005] -1D5C4 ; [.1CE0.0020.0005] -1D5F8 ; [.1CE0.0020.0005] -1D62C ; [.1CE0.0020.0005] -1D660 ; [.1CE0.0020.0005] -1D694 ; [.1CE0.0020.0005] -24DA ; [.1CE0.0020.0006] -004B ; [.1CE0.0020.0008] -212A ; [.1CE0.0020.0008] -FF2B ; [.1CE0.0020.0009] -1F11A ; [*0310.0020.0004][.1CE0.0020.000A][*0311.0020.0004] -1D40A ; [.1CE0.0020.000B] -1D43E ; [.1CE0.0020.000B] -1D472 ; [.1CE0.0020.000B] -1D4A6 ; [.1CE0.0020.000B] -1D4DA ; [.1CE0.0020.000B] -1D50E ; [.1CE0.0020.000B] -1D542 ; [.1CE0.0020.000B] -1D576 ; [.1CE0.0020.000B] -1D5AA ; [.1CE0.0020.000B] -1D5DE ; [.1CE0.0020.000B] -1D612 ; [.1CE0.0020.000B] -1D646 ; [.1CE0.0020.000B] -1D67A ; [.1CE0.0020.000B] -24C0 ; [.1CE0.0020.000C] -1F15A ; [.1CE0.0020.000C] -1D4F ; [.1CE0.0020.0014] -2096 ; [.1CE0.0020.0015] -1D37 ; [.1CE0.0020.001D] -1F13A ; [.1CE0.0020.001D] -1F17A ; [.1CE0.0020.001D] -1E31 ; [.1CE0.0020.0002][.0000.0024.0002] -1E30 ; [.1CE0.0020.0008][.0000.0024.0002] -01E9 ; [.1CE0.0020.0002][.0000.0028.0002] -01E8 ; [.1CE0.0020.0008][.0000.0028.0002] -0137 ; [.1CE0.0020.0002][.0000.0030.0002] -0136 ; [.1CE0.0020.0008][.0000.0030.0002] -A7A3 ; [.1CE0.0020.0004][.0000.0035.0004] -A7A2 ; [.1CE0.0020.000A][.0000.0035.0004] -1E33 ; [.1CE0.0020.0002][.0000.0042.0002] -1E32 ; [.1CE0.0020.0008][.0000.0042.0002] -1E35 ; [.1CE0.0020.0002][.0000.0049.0002] -1E34 ; [.1CE0.0020.0008][.0000.0049.0002] -3384 ; [.1CE0.0020.001C][.1BC2.0020.001D] -3385 ; [.1CE0.0020.001D][.1BDB.0020.001D] -3389 ; [.1CE0.0020.001C][.1BF5.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] -338F ; [.1CE0.0020.001C][.1C6F.0020.001C] -3391 ; [.1CE0.0020.001C][.1C93.0020.001D][.1E9C.0020.001C] -33CD ; [.1CE0.0020.001D][.1CE0.0020.001D] -3398 ; [.1CE0.0020.001C][.1CF2.0020.001C] -339E ; [.1CE0.0020.001C][.1D25.0020.001C] -33CE ; [.1CE0.0020.001D][.1D25.0020.001D] -33A2 ; [.1CE0.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] -33A6 ; [.1CE0.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] -33AA ; [.1CE0.0020.001C][.1D87.0020.001D][.1BC2.0020.001C] -33CF ; [.1CE0.0020.001C][.1E10.0020.001C] -33B8 ; [.1CE0.0020.001C][.1E5E.0020.001D] -33BE ; [.1CE0.0020.001C][.1E70.0020.001D] -33C0 ; [.1CE0.0020.001C][.1F5C.0020.001D] -1D0B ; [.1CE4.0020.0002] -1D84 ; [.1CE5.0020.0002] -0199 ; [.1CE6.0020.0002] -0198 ; [.1CE6.0020.0008] -2C6A ; [.1CEA.0020.0002] -2C69 ; [.1CEA.0020.0008] -A741 ; [.1CEB.0020.0002] -A740 ; [.1CEB.0020.0008] -A743 ; [.1CEC.0020.0002] -A742 ; [.1CEC.0020.0008] -A745 ; [.1CED.0020.0002] -A744 ; [.1CED.0020.0008] -029E ; [.1CEE.0020.0002] -A7B0 ; [.1CEE.0020.0008] -006C ; [.1CF2.0020.0002] -FF4C ; [.1CF2.0020.0003] -1DDD ; [.1CF2.0020.0004] -217C ; [.1CF2.0020.0004] -24A7 ; [*0310.0020.0004][.1CF2.0020.0004][*0311.0020.0004] -2113 ; [.1CF2.0020.0005] -1D425 ; [.1CF2.0020.0005] -1D459 ; [.1CF2.0020.0005] -1D48D ; [.1CF2.0020.0005] -1D4C1 ; [.1CF2.0020.0005] -1D4F5 ; [.1CF2.0020.0005] -1D529 ; [.1CF2.0020.0005] -1D55D ; [.1CF2.0020.0005] -1D591 ; [.1CF2.0020.0005] -1D5C5 ; [.1CF2.0020.0005] -1D5F9 ; [.1CF2.0020.0005] -1D62D ; [.1CF2.0020.0005] -1D661 ; [.1CF2.0020.0005] -1D695 ; [.1CF2.0020.0005] -24DB ; [.1CF2.0020.0006] -004C ; [.1CF2.0020.0008] -FF2C ; [.1CF2.0020.0009] -216C ; [.1CF2.0020.000A] -1F11B ; [*0310.0020.0004][.1CF2.0020.000A][*0311.0020.0004] -2112 ; [.1CF2.0020.000B] -1D40B ; [.1CF2.0020.000B] -1D43F ; [.1CF2.0020.000B] -1D473 ; [.1CF2.0020.000B] -1D4DB ; [.1CF2.0020.000B] -1D50F ; [.1CF2.0020.000B] -1D543 ; [.1CF2.0020.000B] -1D577 ; [.1CF2.0020.000B] -1D5AB ; [.1CF2.0020.000B] -1D5DF ; [.1CF2.0020.000B] -1D613 ; [.1CF2.0020.000B] -1D647 ; [.1CF2.0020.000B] -1D67B ; [.1CF2.0020.000B] -24C1 ; [.1CF2.0020.000C] -1F15B ; [.1CF2.0020.000C] -02E1 ; [.1CF2.0020.0014] -2097 ; [.1CF2.0020.0015] -1D38 ; [.1CF2.0020.001D] -1F13B ; [.1CF2.0020.001D] -1F17B ; [.1CF2.0020.001D] -013A ; [.1CF2.0020.0002][.0000.0024.0002] -0139 ; [.1CF2.0020.0008][.0000.0024.0002] -013E ; [.1CF2.0020.0002][.0000.0028.0002] -013D ; [.1CF2.0020.0008][.0000.0028.0002] -013C ; [.1CF2.0020.0002][.0000.0030.0002] -013B ; [.1CF2.0020.0008][.0000.0030.0002] -0142 ; [.1CF2.0020.0002][.0000.0039.0002] -0141 ; [.1CF2.0020.0008][.0000.0039.0002] -1E37 ; [.1CF2.0020.0002][.0000.0042.0002] -1E36 ; [.1CF2.0020.0008][.0000.0042.0002] -1E39 ; [.1CF2.0020.0002][.0000.0042.0002][.0000.0032.0002] -1E38 ; [.1CF2.0020.0008][.0000.0042.0002][.0000.0032.0002] -1E3D ; [.1CF2.0020.0002][.0000.0046.0002] -1E3C ; [.1CF2.0020.0008][.0000.0046.0002] -1E3B ; [.1CF2.0020.0002][.0000.0049.0002] -1E3A ; [.1CF2.0020.0008][.0000.0049.0002] -0140 ; [.1CF2.0020.0002][.0000.010B.0002] -006C 00B7 ; [.1CF2.0020.0002][.0000.010B.0002] -006C 0387 ; [.1CF2.0020.0002][.0000.010B.0002] -013F ; [.1CF2.0020.0008][.0000.010B.0002] -004C 00B7 ; [.1CF2.0020.0008][.0000.010B.0002] -004C 0387 ; [.1CF2.0020.0008][.0000.010B.0002] -01C9 ; [.1CF2.0020.0004][.1CC7.0020.0004] -01C8 ; [.1CF2.0020.000A][.1CC7.0020.0004] -01C7 ; [.1CF2.0020.000A][.1CC7.0020.000A] -1EFB ; [.1CF2.0020.0004][.1CF2.0020.0004] -1EFA ; [.1CF2.0020.000A][.1CF2.0020.000A] -33D0 ; [.1CF2.0020.001C][.1D25.0020.001C] -33D1 ; [.1CF2.0020.001C][.1D34.0020.001C] -33D2 ; [.1CF2.0020.001C][.1D58.0020.001C][.1C6F.0020.001C] -02AA ; [.1CF2.0020.0004][.1DEC.0020.0004] -32CF ; [.1CF2.0020.001D][.1E10.0020.001D][.1C0A.0020.001D] -33D3 ; [.1CF2.0020.001C][.1E7A.0020.001C] -02AB ; [.1CF2.0020.0004][.1E9C.0020.0004] -029F ; [.1CF6.0020.0002] -1DDE ; [.1CF6.0020.0004] -1DAB ; [.1CF6.0020.0014] -A747 ; [.1CFA.0020.0002] -A746 ; [.1CFA.0020.0008] -1D0C ; [.1CFB.0020.0002] -A749 ; [.1CFC.0020.0002] -A748 ; [.1CFC.0020.0008] -019A ; [.1CFD.0020.0002] -023D ; [.1CFD.0020.0008] -2C61 ; [.1D01.0020.0002] -2C60 ; [.1D01.0020.0008] -026B ; [.1D02.0020.0002] -2C62 ; [.1D02.0020.0008] -AB5E ; [.1D02.0020.0014] -AB38 ; [.1D06.0020.0002] -1DEC ; [.1D06.0020.0004] -AB39 ; [.1D07.0020.0002] -026C ; [.1D08.0020.0002] -A7AD ; [.1D08.0020.0008] -AB37 ; [.1D0C.0020.0002] -AB5D ; [.1D0C.0020.0014] -1D85 ; [.1D0D.0020.0002] -1DAA ; [.1D0D.0020.0014] -026D ; [.1D0E.0020.0002] -1DA9 ; [.1D0E.0020.0014] -A78E ; [.1D12.0020.0002] -0234 ; [.1D13.0020.0002] -A772 ; [.1D17.0020.0002] -026E ; [.1D18.0020.0002] -A781 ; [.1D1C.0020.0002] -A780 ; [.1D1C.0020.0008] -019B ; [.1D1D.0020.0002] -028E ; [.1D21.0020.0002] -006D ; [.1D25.0020.0002] -FF4D ; [.1D25.0020.0003] -036B ; [.1D25.0020.0004] -217F ; [.1D25.0020.0004] -24A8 ; [*0310.0020.0004][.1D25.0020.0004][*0311.0020.0004] -1D426 ; [.1D25.0020.0005] -1D45A ; [.1D25.0020.0005] -1D48E ; [.1D25.0020.0005] -1D4C2 ; [.1D25.0020.0005] -1D4F6 ; [.1D25.0020.0005] -1D52A ; [.1D25.0020.0005] -1D55E ; [.1D25.0020.0005] -1D592 ; [.1D25.0020.0005] -1D5C6 ; [.1D25.0020.0005] -1D5FA ; [.1D25.0020.0005] -1D62E ; [.1D25.0020.0005] -1D662 ; [.1D25.0020.0005] -1D696 ; [.1D25.0020.0005] -24DC ; [.1D25.0020.0006] -004D ; [.1D25.0020.0008] -FF2D ; [.1D25.0020.0009] -216F ; [.1D25.0020.000A] -1F11C ; [*0310.0020.0004][.1D25.0020.000A][*0311.0020.0004] -2133 ; [.1D25.0020.000B] -1D40C ; [.1D25.0020.000B] -1D440 ; [.1D25.0020.000B] -1D474 ; [.1D25.0020.000B] -1D4DC ; [.1D25.0020.000B] -1D510 ; [.1D25.0020.000B] -1D544 ; [.1D25.0020.000B] -1D578 ; [.1D25.0020.000B] -1D5AC ; [.1D25.0020.000B] -1D5E0 ; [.1D25.0020.000B] -1D614 ; [.1D25.0020.000B] -1D648 ; [.1D25.0020.000B] -1D67C ; [.1D25.0020.000B] -24C2 ; [.1D25.0020.000C] -1F15C ; [.1D25.0020.000C] -1D50 ; [.1D25.0020.0014] -2098 ; [.1D25.0020.0015] -1D39 ; [.1D25.0020.001D] -1F13C ; [.1D25.0020.001D] -1F17C ; [.1D25.0020.001D] -1E3F ; [.1D25.0020.0002][.0000.0024.0002] -1E3E ; [.1D25.0020.0008][.0000.0024.0002] -1E41 ; [.1D25.0020.0002][.0000.002E.0002] -1E40 ; [.1D25.0020.0008][.0000.002E.0002] -1E43 ; [.1D25.0020.0002][.0000.0042.0002] -1E42 ; [.1D25.0020.0008][.0000.0042.0002] -33A1 ; [.1D25.0020.001C][.1BBA.0020.001C] -33A5 ; [.1D25.0020.001C][.1BBB.0020.001C] -3383 ; [.1D25.0020.001C][.1BC2.0020.001D] -33D4 ; [.1D25.0020.001C][.1BDB.0020.001C] -3386 ; [.1D25.0020.001D][.1BDB.0020.001D] -1F16A ; [.1D25.0020.0014][.1BF5.0020.0014] -1F16B ; [.1D25.0020.0014][.1C0A.0020.0014] -338E ; [.1D25.0020.001C][.1C6F.0020.001C] -3392 ; [.1D25.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] -33D5 ; [.1D25.0020.001C][.1CAD.0020.001C][.1CF2.0020.001C] -3396 ; [.1D25.0020.001C][.1CF2.0020.001C] -339C ; [.1D25.0020.001C][.1D25.0020.001C] -339F ; [.1D25.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] -33A3 ; [.1D25.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] -33D6 ; [.1D25.0020.001C][.1D58.0020.001C][.1CF2.0020.001C] -33AB ; [.1D25.0020.001D][.1D87.0020.001D][.1BC2.0020.001C] -33A7 ; [.1D25.0020.001C][*0605.0020.001C][.1DEC.0020.001C] -33B3 ; [.1D25.0020.001C][.1DEC.0020.001C] -33A8 ; [.1D25.0020.001C][*0605.0020.001C][.1DEC.0020.001C][.1BBA.0020.001C] -33B7 ; [.1D25.0020.001C][.1E5E.0020.001D] -33B9 ; [.1D25.0020.001D][.1E5E.0020.001D] -1F14B ; [.1D25.0020.001D][.1E5E.0020.001D] -33BD ; [.1D25.0020.001C][.1E70.0020.001D] -33BF ; [.1D25.0020.001D][.1E70.0020.001D] -33C1 ; [.1D25.0020.001D][.1F5C.0020.001D] -1D0D ; [.1D29.0020.0002] -1DDF ; [.1D29.0020.0004] -1D6F ; [.1D2A.0020.0002] -1D86 ; [.1D2B.0020.0002] -0271 ; [.1D2C.0020.0002] -2C6E ; [.1D2C.0020.0008] -1DAC ; [.1D2C.0020.0014] -AB3A ; [.1D30.0020.0002] -A7FD ; [.1D31.0020.0002] -A7FF ; [.1D32.0020.0002] -A773 ; [.1D33.0020.0002] -006E ; [.1D34.0020.0002] -FF4E ; [.1D34.0020.0003] -1DE0 ; [.1D34.0020.0004] -24A9 ; [*0310.0020.0004][.1D34.0020.0004][*0311.0020.0004] -1D427 ; [.1D34.0020.0005] -1D45B ; [.1D34.0020.0005] -1D48F ; [.1D34.0020.0005] -1D4C3 ; [.1D34.0020.0005] -1D4F7 ; [.1D34.0020.0005] -1D52B ; [.1D34.0020.0005] -1D55F ; [.1D34.0020.0005] -1D593 ; [.1D34.0020.0005] -1D5C7 ; [.1D34.0020.0005] -1D5FB ; [.1D34.0020.0005] -1D62F ; [.1D34.0020.0005] -1D663 ; [.1D34.0020.0005] -1D697 ; [.1D34.0020.0005] -24DD ; [.1D34.0020.0006] -004E ; [.1D34.0020.0008] -FF2E ; [.1D34.0020.0009] -1F11D ; [*0310.0020.0004][.1D34.0020.000A][*0311.0020.0004] -2115 ; [.1D34.0020.000B] -1D40D ; [.1D34.0020.000B] -1D441 ; [.1D34.0020.000B] -1D475 ; [.1D34.0020.000B] -1D4A9 ; [.1D34.0020.000B] -1D4DD ; [.1D34.0020.000B] -1D511 ; [.1D34.0020.000B] -1D579 ; [.1D34.0020.000B] -1D5AD ; [.1D34.0020.000B] -1D5E1 ; [.1D34.0020.000B] -1D615 ; [.1D34.0020.000B] -1D649 ; [.1D34.0020.000B] -1D67D ; [.1D34.0020.000B] -24C3 ; [.1D34.0020.000C] -1F15D ; [.1D34.0020.000C] -207F ; [.1D34.0020.0014] -2099 ; [.1D34.0020.0015] -1D3A ; [.1D34.0020.001D] -1F13D ; [.1D34.0020.001D] -1F17D ; [.1D34.0020.001D] -0144 ; [.1D34.0020.0002][.0000.0024.0002] -0143 ; [.1D34.0020.0008][.0000.0024.0002] -01F9 ; [.1D34.0020.0002][.0000.0025.0002] -01F8 ; [.1D34.0020.0008][.0000.0025.0002] -0148 ; [.1D34.0020.0002][.0000.0028.0002] -0147 ; [.1D34.0020.0008][.0000.0028.0002] -00F1 ; [.1D34.0020.0002][.0000.002D.0002] -00D1 ; [.1D34.0020.0008][.0000.002D.0002] -1E45 ; [.1D34.0020.0002][.0000.002E.0002] -1E44 ; [.1D34.0020.0008][.0000.002E.0002] -0146 ; [.1D34.0020.0002][.0000.0030.0002] -0145 ; [.1D34.0020.0008][.0000.0030.0002] -A7A5 ; [.1D34.0020.0004][.0000.0035.0004] -A7A4 ; [.1D34.0020.000A][.0000.0035.0004] -1E47 ; [.1D34.0020.0002][.0000.0042.0002] -1E46 ; [.1D34.0020.0008][.0000.0042.0002] -1E4B ; [.1D34.0020.0002][.0000.0046.0002] -1E4A ; [.1D34.0020.0008][.0000.0046.0002] -1E49 ; [.1D34.0020.0002][.0000.0049.0002] -1E48 ; [.1D34.0020.0008][.0000.0049.0002] -3381 ; [.1D34.0020.001C][.1BC2.0020.001D] -1F195 ; [.1D34.0020.001D][.1C25.0020.001D][.1E70.0020.001D] -338B ; [.1D34.0020.001C][.1C60.0020.001D] -1F196 ; [.1D34.0020.001D][.1C6F.0020.001D] -01CC ; [.1D34.0020.0004][.1CC7.0020.0004] -01CB ; [.1D34.0020.000A][.1CC7.0020.0004] -01CA ; [.1D34.0020.000A][.1CC7.0020.000A] -339A ; [.1D34.0020.001C][.1D25.0020.001C] -2116 ; [.1D34.0020.000A][.1D58.0020.0004] -33B1 ; [.1D34.0020.001C][.1DEC.0020.001C] -33B5 ; [.1D34.0020.001C][.1E5E.0020.001D] -33BB ; [.1D34.0020.001C][.1E70.0020.001D] -0274 ; [.1D38.0020.0002] -1DE1 ; [.1D38.0020.0004] -1DB0 ; [.1D38.0020.0014] -1D3B ; [.1D3C.0020.0002] -1D0E ; [.1D3D.0020.0002] -1D70 ; [.1D3E.0020.0002] -0272 ; [.1D3F.0020.0002] -019D ; [.1D3F.0020.0008] -1DAE ; [.1D3F.0020.0014] -019E ; [.1D43.0020.0002] -0220 ; [.1D43.0020.0008] -A791 ; [.1D47.0020.0002] -A790 ; [.1D47.0020.0008] -1D87 ; [.1D48.0020.0002] -0273 ; [.1D49.0020.0002] -1DAF ; [.1D49.0020.0014] -0235 ; [.1D4D.0020.0002] -AB3B ; [.1D51.0020.0002] -A774 ; [.1D52.0020.0002] -014B ; [.1D53.0020.0002] -014A ; [.1D53.0020.0008] -1D51 ; [.1D53.0020.0014] -AB3C ; [.1D57.0020.0002] -006F ; [.1D58.0020.0002] -FF4F ; [.1D58.0020.0003] -0366 ; [.1D58.0020.0004] -24AA ; [*0310.0020.0004][.1D58.0020.0004][*0311.0020.0004] -2134 ; [.1D58.0020.0005] -1D428 ; [.1D58.0020.0005] -1D45C ; [.1D58.0020.0005] -1D490 ; [.1D58.0020.0005] -1D4F8 ; [.1D58.0020.0005] -1D52C ; [.1D58.0020.0005] -1D560 ; [.1D58.0020.0005] -1D594 ; [.1D58.0020.0005] -1D5C8 ; [.1D58.0020.0005] -1D5FC ; [.1D58.0020.0005] -1D630 ; [.1D58.0020.0005] -1D664 ; [.1D58.0020.0005] -1D698 ; [.1D58.0020.0005] -24DE ; [.1D58.0020.0006] -004F ; [.1D58.0020.0008] -FF2F ; [.1D58.0020.0009] -1F11E ; [*0310.0020.0004][.1D58.0020.000A][*0311.0020.0004] -1D40E ; [.1D58.0020.000B] -1D442 ; [.1D58.0020.000B] -1D476 ; [.1D58.0020.000B] -1D4AA ; [.1D58.0020.000B] -1D4DE ; [.1D58.0020.000B] -1D512 ; [.1D58.0020.000B] -1D546 ; [.1D58.0020.000B] -1D57A ; [.1D58.0020.000B] -1D5AE ; [.1D58.0020.000B] -1D5E2 ; [.1D58.0020.000B] -1D616 ; [.1D58.0020.000B] -1D64A ; [.1D58.0020.000B] -1D67E ; [.1D58.0020.000B] -24C4 ; [.1D58.0020.000C] -1F15E ; [.1D58.0020.000C] -00BA ; [.1D58.0020.0014] -1D52 ; [.1D58.0020.0014] -2092 ; [.1D58.0020.0015] -1D3C ; [.1D58.0020.001D] -1F13E ; [.1D58.0020.001D] -1F17E ; [.1D58.0020.001D] -00F3 ; [.1D58.0020.0002][.0000.0024.0002] -00D3 ; [.1D58.0020.0008][.0000.0024.0002] -00F2 ; [.1D58.0020.0002][.0000.0025.0002] -00D2 ; [.1D58.0020.0008][.0000.0025.0002] -014F ; [.1D58.0020.0002][.0000.0026.0002] -014E ; [.1D58.0020.0008][.0000.0026.0002] -00F4 ; [.1D58.0020.0002][.0000.0027.0002] -00D4 ; [.1D58.0020.0008][.0000.0027.0002] -1ED1 ; [.1D58.0020.0002][.0000.0027.0002][.0000.0024.0002] -1ED0 ; [.1D58.0020.0008][.0000.0027.0002][.0000.0024.0002] -1ED3 ; [.1D58.0020.0002][.0000.0027.0002][.0000.0025.0002] -1ED2 ; [.1D58.0020.0008][.0000.0027.0002][.0000.0025.0002] -1ED7 ; [.1D58.0020.0002][.0000.0027.0002][.0000.002D.0002] -1ED6 ; [.1D58.0020.0008][.0000.0027.0002][.0000.002D.0002] -1ED5 ; [.1D58.0020.0002][.0000.0027.0002][.0000.003B.0002] -1ED4 ; [.1D58.0020.0008][.0000.0027.0002][.0000.003B.0002] -01D2 ; [.1D58.0020.0002][.0000.0028.0002] -01D1 ; [.1D58.0020.0008][.0000.0028.0002] -00F6 ; [.1D58.0020.0002][.0000.002B.0002] -1DF3 ; [.1D58.0020.0004][.0000.002B.0004] -A79D ; [.1D58.0020.0004][.0000.002B.0004] -00D6 ; [.1D58.0020.0008][.0000.002B.0002] -A79C ; [.1D58.0020.000A][.0000.002B.0004] -022B ; [.1D58.0020.0002][.0000.002B.0002][.0000.0032.0002] -022A ; [.1D58.0020.0008][.0000.002B.0002][.0000.0032.0002] -0151 ; [.1D58.0020.0002][.0000.002C.0002] -0150 ; [.1D58.0020.0008][.0000.002C.0002] -00F5 ; [.1D58.0020.0002][.0000.002D.0002] -00D5 ; [.1D58.0020.0008][.0000.002D.0002] -1E4D ; [.1D58.0020.0002][.0000.002D.0002][.0000.0024.0002] -1E4C ; [.1D58.0020.0008][.0000.002D.0002][.0000.0024.0002] -1E4F ; [.1D58.0020.0002][.0000.002D.0002][.0000.002B.0002] -1E4E ; [.1D58.0020.0008][.0000.002D.0002][.0000.002B.0002] -022D ; [.1D58.0020.0002][.0000.002D.0002][.0000.0032.0002] -022C ; [.1D58.0020.0008][.0000.002D.0002][.0000.0032.0002] -022F ; [.1D58.0020.0002][.0000.002E.0002] -022E ; [.1D58.0020.0008][.0000.002E.0002] -0231 ; [.1D58.0020.0002][.0000.002E.0002][.0000.0032.0002] -0230 ; [.1D58.0020.0008][.0000.002E.0002][.0000.0032.0002] -00F8 ; [.1D58.0020.0002][.0000.002F.0002] -00D8 ; [.1D58.0020.0008][.0000.002F.0002] -01FF ; [.1D58.0020.0002][.0000.002F.0002][.0000.0024.0002] -01FE ; [.1D58.0020.0008][.0000.002F.0002][.0000.0024.0002] -01EB ; [.1D58.0020.0002][.0000.0031.0002] -01EA ; [.1D58.0020.0008][.0000.0031.0002] -01ED ; [.1D58.0020.0002][.0000.0031.0002][.0000.0032.0002] -01EC ; [.1D58.0020.0008][.0000.0031.0002][.0000.0032.0002] -014D ; [.1D58.0020.0002][.0000.0032.0002] -014C ; [.1D58.0020.0008][.0000.0032.0002] -1E53 ; [.1D58.0020.0002][.0000.0032.0002][.0000.0024.0002] -1E52 ; [.1D58.0020.0008][.0000.0032.0002][.0000.0024.0002] -1E51 ; [.1D58.0020.0002][.0000.0032.0002][.0000.0025.0002] -1E50 ; [.1D58.0020.0008][.0000.0032.0002][.0000.0025.0002] -1DED ; [.1D58.0020.0004][.0000.0034.0004] -1ECF ; [.1D58.0020.0002][.0000.003B.0002] -1ECE ; [.1D58.0020.0008][.0000.003B.0002] -020D ; [.1D58.0020.0002][.0000.003C.0002] -020C ; [.1D58.0020.0008][.0000.003C.0002] -020F ; [.1D58.0020.0002][.0000.003E.0002] -020E ; [.1D58.0020.0008][.0000.003E.0002] -01A1 ; [.1D58.0020.0002][.0000.003F.0002] -01A0 ; [.1D58.0020.0008][.0000.003F.0002] -1EDB ; [.1D58.0020.0002][.0000.003F.0002][.0000.0024.0002] -1EDA ; [.1D58.0020.0008][.0000.003F.0002][.0000.0024.0002] -1EDD ; [.1D58.0020.0002][.0000.003F.0002][.0000.0025.0002] -1EDC ; [.1D58.0020.0008][.0000.003F.0002][.0000.0025.0002] -1EE1 ; [.1D58.0020.0002][.0000.003F.0002][.0000.002D.0002] -1EE0 ; [.1D58.0020.0008][.0000.003F.0002][.0000.002D.0002] -1EDF ; [.1D58.0020.0002][.0000.003F.0002][.0000.003B.0002] -1EDE ; [.1D58.0020.0008][.0000.003F.0002][.0000.003B.0002] -1EE3 ; [.1D58.0020.0002][.0000.003F.0002][.0000.0042.0002] -1EE2 ; [.1D58.0020.0008][.0000.003F.0002][.0000.0042.0002] -1ECD ; [.1D58.0020.0002][.0000.0042.0002] -1ECC ; [.1D58.0020.0008][.0000.0042.0002] -1ED9 ; [.1D58.0020.0002][.0000.0042.0002][.0000.0027.0002] -1ED8 ; [.1D58.0020.0008][.0000.0042.0002][.0000.0027.0002] -0153 ; [.1D58.0020.0004][.0000.010B.0004][.1C25.0020.0004] -0152 ; [.1D58.0020.000A][.0000.010B.0004][.1C25.0020.000A] -A7F9 ; [.1D58.0020.0014][.0000.010B.0014][.1C25.0020.0014] -1F197 ; [.1D58.0020.001D][.1CE0.0020.001D] -A74F ; [.1D58.0020.0004][.1D58.0020.0004] -A74E ; [.1D58.0020.000A][.1D58.0020.000A] -3375 ; [.1D58.0020.001C][.1E5E.0020.001D] -1D0F ; [.1D5C.0020.0002] -1D11 ; [.1D5D.0020.0002] -AB3D ; [.1D5E.0020.0002] -0276 ; [.1D5F.0020.0002] -1D14 ; [.1D63.0020.0002] -AB41 ; [.1D64.0020.0002] -AB42 ; [.1D65.0020.0002] -AB40 ; [.1D66.0020.0002] -AB43 ; [.1D67.0020.0002] -AB44 ; [.1D68.0020.0002] -1D13 ; [.1D69.0020.0002] -AB3E ; [.1D6A.0020.0002] -0254 ; [.1D6B.0020.0002] -0186 ; [.1D6B.0020.0008] -1D53 ; [.1D6B.0020.0014] -1D10 ; [.1D6F.0020.0002] -1D12 ; [.1D70.0020.0002] -AB3F ; [.1D71.0020.0002] -1D97 ; [.1D72.0020.0002] -AB62 ; [.1D73.0020.0002] -A74D ; [.1D74.0020.0002] -A74C ; [.1D74.0020.0008] -1D16 ; [.1D75.0020.0002] -1D54 ; [.1D75.0020.0014] -1D17 ; [.1D76.0020.0002] -1D55 ; [.1D76.0020.0014] -2C7A ; [.1D77.0020.0002] -0275 ; [.1D78.0020.0002] -019F ; [.1D78.0020.0008] -1DB1 ; [.1D78.0020.0014] -A74B ; [.1D7C.0020.0002] -A74A ; [.1D7C.0020.0008] -0277 ; [.1D7D.0020.0002] -A7B7 ; [.1D81.0020.0002] -A7B6 ; [.1D81.0020.0008] -0223 ; [.1D82.0020.0002] -0222 ; [.1D82.0020.0008] -1D3D ; [.1D82.0020.001D] -1D15 ; [.1D86.0020.0002] -0070 ; [.1D87.0020.0002] -FF50 ; [.1D87.0020.0003] -1DEE ; [.1D87.0020.0004] -24AB ; [*0310.0020.0004][.1D87.0020.0004][*0311.0020.0004] -1D429 ; [.1D87.0020.0005] -1D45D ; [.1D87.0020.0005] -1D491 ; [.1D87.0020.0005] -1D4C5 ; [.1D87.0020.0005] -1D4F9 ; [.1D87.0020.0005] -1D52D ; [.1D87.0020.0005] -1D561 ; [.1D87.0020.0005] -1D595 ; [.1D87.0020.0005] -1D5C9 ; [.1D87.0020.0005] -1D5FD ; [.1D87.0020.0005] -1D631 ; [.1D87.0020.0005] -1D665 ; [.1D87.0020.0005] -1D699 ; [.1D87.0020.0005] -24DF ; [.1D87.0020.0006] -0050 ; [.1D87.0020.0008] -FF30 ; [.1D87.0020.0009] -1F11F ; [*0310.0020.0004][.1D87.0020.000A][*0311.0020.0004] -2119 ; [.1D87.0020.000B] -1D40F ; [.1D87.0020.000B] -1D443 ; [.1D87.0020.000B] -1D477 ; [.1D87.0020.000B] -1D4AB ; [.1D87.0020.000B] -1D4DF ; [.1D87.0020.000B] -1D513 ; [.1D87.0020.000B] -1D57B ; [.1D87.0020.000B] -1D5AF ; [.1D87.0020.000B] -1D5E3 ; [.1D87.0020.000B] -1D617 ; [.1D87.0020.000B] -1D64B ; [.1D87.0020.000B] -1D67F ; [.1D87.0020.000B] -24C5 ; [.1D87.0020.000C] -1F15F ; [.1D87.0020.000C] -1D56 ; [.1D87.0020.0014] -209A ; [.1D87.0020.0015] -1D3E ; [.1D87.0020.001D] -1F13F ; [.1D87.0020.001D] -1F17F ; [.1D87.0020.001D] -1F18A ; [.1D87.0020.001D] -1E55 ; [.1D87.0020.0002][.0000.0024.0002] -1E54 ; [.1D87.0020.0008][.0000.0024.0002] -1E57 ; [.1D87.0020.0002][.0000.002E.0002] -1E56 ; [.1D87.0020.0008][.0000.002E.0002] -3380 ; [.1D87.0020.001C][.1BC2.0020.001D] -33A9 ; [.1D87.0020.001D][.1BC2.0020.001C] -1F18C ; [.1D87.0020.001D][.1BC2.0020.001D] -3376 ; [.1D87.0020.001C][.1BF5.0020.001C] -338A ; [.1D87.0020.001C][.1C60.0020.001D] -33D7 ; [.1D87.0020.001D][.1C93.0020.001D] -33D8 ; [.1D87.0020.001C][*0274.0020.001C][.1D25.0020.001C][*0274.0020.001C] -33D9 ; [.1D87.0020.001D][.1D87.0020.001D][.1D25.0020.001D] -1F14E ; [.1D87.0020.001D][.1D87.0020.001D][.1E5E.0020.001D] -33DA ; [.1D87.0020.001D][.1DAE.0020.001D] -33B0 ; [.1D87.0020.001C][.1DEC.0020.001C] -3250 ; [.1D87.0020.001D][.1E10.0020.001D][.1C25.0020.001D] -33B4 ; [.1D87.0020.001C][.1E5E.0020.001D] -33BA ; [.1D87.0020.001C][.1E70.0020.001D] -1D18 ; [.1D8B.0020.0002] -1D7D ; [.1D8C.0020.0002] -2C63 ; [.1D8C.0020.0008] -A751 ; [.1D8D.0020.0002] -A750 ; [.1D8D.0020.0008] -1D71 ; [.1D8E.0020.0002] -1D88 ; [.1D8F.0020.0002] -01A5 ; [.1D90.0020.0002] -01A4 ; [.1D90.0020.0008] -A753 ; [.1D94.0020.0002] -A752 ; [.1D94.0020.0008] -A755 ; [.1D95.0020.0002] -A754 ; [.1D95.0020.0008] -A7FC ; [.1D96.0020.0002] -0278 ; [.1D97.0020.0002] -1DB2 ; [.1D97.0020.0014] -2C77 ; [.1D9B.0020.0002] -0071 ; [.1D9C.0020.0002] -FF51 ; [.1D9C.0020.0003] -24AC ; [*0310.0020.0004][.1D9C.0020.0004][*0311.0020.0004] -1D42A ; [.1D9C.0020.0005] -1D45E ; [.1D9C.0020.0005] -1D492 ; [.1D9C.0020.0005] -1D4C6 ; [.1D9C.0020.0005] -1D4FA ; [.1D9C.0020.0005] -1D52E ; [.1D9C.0020.0005] -1D562 ; [.1D9C.0020.0005] -1D596 ; [.1D9C.0020.0005] -1D5CA ; [.1D9C.0020.0005] -1D5FE ; [.1D9C.0020.0005] -1D632 ; [.1D9C.0020.0005] -1D666 ; [.1D9C.0020.0005] -1D69A ; [.1D9C.0020.0005] -24E0 ; [.1D9C.0020.0006] -0051 ; [.1D9C.0020.0008] -FF31 ; [.1D9C.0020.0009] -1F120 ; [*0310.0020.0004][.1D9C.0020.000A][*0311.0020.0004] -211A ; [.1D9C.0020.000B] -1D410 ; [.1D9C.0020.000B] -1D444 ; [.1D9C.0020.000B] -1D478 ; [.1D9C.0020.000B] -1D4AC ; [.1D9C.0020.000B] -1D4E0 ; [.1D9C.0020.000B] -1D514 ; [.1D9C.0020.000B] -1D57C ; [.1D9C.0020.000B] -1D5B0 ; [.1D9C.0020.000B] -1D5E4 ; [.1D9C.0020.000B] -1D618 ; [.1D9C.0020.000B] -1D64C ; [.1D9C.0020.000B] -1D680 ; [.1D9C.0020.000B] -24C6 ; [.1D9C.0020.000C] -1F160 ; [.1D9C.0020.000C] -1F140 ; [.1D9C.0020.001D] -1F180 ; [.1D9C.0020.001D] -0239 ; [.1D9C.0020.0004][.1D87.0020.0004] -A757 ; [.1DA0.0020.0002] -A756 ; [.1DA0.0020.0008] -A759 ; [.1DA1.0020.0002] -A758 ; [.1DA1.0020.0008] -02A0 ; [.1DA2.0020.0002] -024B ; [.1DA6.0020.0002] -024A ; [.1DA6.0020.0008] -0138 ; [.1DAA.0020.0002] -0072 ; [.1DAE.0020.0002] -FF52 ; [.1DAE.0020.0003] -036C ; [.1DAE.0020.0004] -1DCA ; [.1DAE.0020.0004] -24AD ; [*0310.0020.0004][.1DAE.0020.0004][*0311.0020.0004] -1D42B ; [.1DAE.0020.0005] -1D45F ; [.1DAE.0020.0005] -1D493 ; [.1DAE.0020.0005] -1D4C7 ; [.1DAE.0020.0005] -1D4FB ; [.1DAE.0020.0005] -1D52F ; [.1DAE.0020.0005] -1D563 ; [.1DAE.0020.0005] -1D597 ; [.1DAE.0020.0005] -1D5CB ; [.1DAE.0020.0005] -1D5FF ; [.1DAE.0020.0005] -1D633 ; [.1DAE.0020.0005] -1D667 ; [.1DAE.0020.0005] -1D69B ; [.1DAE.0020.0005] -24E1 ; [.1DAE.0020.0006] -0052 ; [.1DAE.0020.0008] -FF32 ; [.1DAE.0020.0009] -1F121 ; [*0310.0020.0004][.1DAE.0020.000A][*0311.0020.0004] -211B ; [.1DAE.0020.000B] -211C ; [.1DAE.0020.000B] -211D ; [.1DAE.0020.000B] -1D411 ; [.1DAE.0020.000B] -1D445 ; [.1DAE.0020.000B] -1D479 ; [.1DAE.0020.000B] -1D4E1 ; [.1DAE.0020.000B] -1D57D ; [.1DAE.0020.000B] -1D5B1 ; [.1DAE.0020.000B] -1D5E5 ; [.1DAE.0020.000B] -1D619 ; [.1DAE.0020.000B] -1D64D ; [.1DAE.0020.000B] -1D681 ; [.1DAE.0020.000B] -24C7 ; [.1DAE.0020.000C] -1F12C ; [.1DAE.0020.000C] -1F161 ; [.1DAE.0020.000C] -02B3 ; [.1DAE.0020.0014] -1D63 ; [.1DAE.0020.0015] -1D3F ; [.1DAE.0020.001D] -1F141 ; [.1DAE.0020.001D] -1F181 ; [.1DAE.0020.001D] -0155 ; [.1DAE.0020.0002][.0000.0024.0002] -0154 ; [.1DAE.0020.0008][.0000.0024.0002] -0159 ; [.1DAE.0020.0002][.0000.0028.0002] -0158 ; [.1DAE.0020.0008][.0000.0028.0002] -1E59 ; [.1DAE.0020.0002][.0000.002E.0002] -1E58 ; [.1DAE.0020.0008][.0000.002E.0002] -0157 ; [.1DAE.0020.0002][.0000.0030.0002] -0156 ; [.1DAE.0020.0008][.0000.0030.0002] -A7A7 ; [.1DAE.0020.0004][.0000.0035.0004] -A7A6 ; [.1DAE.0020.000A][.0000.0035.0004] -0211 ; [.1DAE.0020.0002][.0000.003C.0002] -0210 ; [.1DAE.0020.0008][.0000.003C.0002] -0213 ; [.1DAE.0020.0002][.0000.003E.0002] -0212 ; [.1DAE.0020.0008][.0000.003E.0002] -1E5B ; [.1DAE.0020.0002][.0000.0042.0002] -1E5A ; [.1DAE.0020.0008][.0000.0042.0002] -1E5D ; [.1DAE.0020.0002][.0000.0042.0002][.0000.0032.0002] -1E5C ; [.1DAE.0020.0008][.0000.0042.0002][.0000.0032.0002] -1E5F ; [.1DAE.0020.0002][.0000.0049.0002] -1E5E ; [.1DAE.0020.0008][.0000.0049.0002] -A783 ; [.1DAE.0020.0004][.0000.010C.0004] -A782 ; [.1DAE.0020.000A][.0000.010C.0004] -33AD ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C] -33AE ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C][*0605.0020.001C][.1DEC.0020.001C] -33AF ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C][*0605.0020.001C][.1DEC.0020.001C][.1BBA.0020.001C] -20A8 ; [.1DAE.0020.000A][.1DEC.0020.0004] -AB45 ; [.1DB2.0020.0002] -0280 ; [.1DB3.0020.0002] -1DE2 ; [.1DB3.0020.0004] -01A6 ; [.1DB3.0020.0008] -AB46 ; [.1DB7.0020.0002] -A75B ; [.1DB8.0020.0002] -1DE3 ; [.1DB8.0020.0004] -A75A ; [.1DB8.0020.0008] -1D19 ; [.1DB9.0020.0002] -024D ; [.1DBA.0020.0002] -024C ; [.1DBA.0020.0008] -1D72 ; [.1DBE.0020.0002] -0279 ; [.1DBF.0020.0002] -02B4 ; [.1DBF.0020.0014] -1D1A ; [.1DC3.0020.0002] -027A ; [.1DC4.0020.0002] -1D89 ; [.1DC8.0020.0002] -027B ; [.1DC9.0020.0002] -02B5 ; [.1DC9.0020.0014] -2C79 ; [.1DCD.0020.0002] -027C ; [.1DCE.0020.0002] -027D ; [.1DD2.0020.0002] -2C64 ; [.1DD2.0020.0008] -AB49 ; [.1DD6.0020.0002] -027E ; [.1DD7.0020.0002] -1D73 ; [.1DDB.0020.0002] -027F ; [.1DDC.0020.0002] -AB47 ; [.1DE0.0020.0002] -AB48 ; [.1DE1.0020.0002] -AB4A ; [.1DE2.0020.0002] -AB4B ; [.1DE3.0020.0002] -AB4C ; [.1DE4.0020.0002] -0281 ; [.1DE5.0020.0002] -02B6 ; [.1DE5.0020.0014] -A775 ; [.1DE9.0020.0002] -A776 ; [.1DEA.0020.0002] -A75D ; [.1DEB.0020.0002] -A75C ; [.1DEB.0020.0008] -0073 ; [.1DEC.0020.0002] -FF53 ; [.1DEC.0020.0003] -1DE4 ; [.1DEC.0020.0004] -24AE ; [*0310.0020.0004][.1DEC.0020.0004][*0311.0020.0004] -1D42C ; [.1DEC.0020.0005] -1D460 ; [.1DEC.0020.0005] -1D494 ; [.1DEC.0020.0005] -1D4C8 ; [.1DEC.0020.0005] -1D4FC ; [.1DEC.0020.0005] -1D530 ; [.1DEC.0020.0005] -1D564 ; [.1DEC.0020.0005] -1D598 ; [.1DEC.0020.0005] -1D5CC ; [.1DEC.0020.0005] -1D600 ; [.1DEC.0020.0005] -1D634 ; [.1DEC.0020.0005] -1D668 ; [.1DEC.0020.0005] -1D69C ; [.1DEC.0020.0005] -24E2 ; [.1DEC.0020.0006] -0053 ; [.1DEC.0020.0008] -FF33 ; [.1DEC.0020.0009] -1F122 ; [*0310.0020.0004][.1DEC.0020.000A][*0311.0020.0004] -1F12A ; [*0372.0020.0004][.1DEC.0020.000A][*0373.0020.0004] -1D412 ; [.1DEC.0020.000B] -1D446 ; [.1DEC.0020.000B] -1D47A ; [.1DEC.0020.000B] -1D4AE ; [.1DEC.0020.000B] -1D4E2 ; [.1DEC.0020.000B] -1D516 ; [.1DEC.0020.000B] -1D54A ; [.1DEC.0020.000B] -1D57E ; [.1DEC.0020.000B] -1D5B2 ; [.1DEC.0020.000B] -1D5E6 ; [.1DEC.0020.000B] -1D61A ; [.1DEC.0020.000B] -1D64E ; [.1DEC.0020.000B] -1D682 ; [.1DEC.0020.000B] -24C8 ; [.1DEC.0020.000C] -1F162 ; [.1DEC.0020.000C] -02E2 ; [.1DEC.0020.0014] -209B ; [.1DEC.0020.0015] -1F142 ; [.1DEC.0020.001D] -1F182 ; [.1DEC.0020.001D] -015B ; [.1DEC.0020.0002][.0000.0024.0002] -015A ; [.1DEC.0020.0008][.0000.0024.0002] -1E65 ; [.1DEC.0020.0002][.0000.0024.0002][.0000.002E.0002] -1E64 ; [.1DEC.0020.0008][.0000.0024.0002][.0000.002E.0002] -015D ; [.1DEC.0020.0002][.0000.0027.0002] -015C ; [.1DEC.0020.0008][.0000.0027.0002] -0161 ; [.1DEC.0020.0002][.0000.0028.0002] -0160 ; [.1DEC.0020.0008][.0000.0028.0002] -1E67 ; [.1DEC.0020.0002][.0000.0028.0002][.0000.002E.0002] -1E66 ; [.1DEC.0020.0008][.0000.0028.0002][.0000.002E.0002] -1E61 ; [.1DEC.0020.0002][.0000.002E.0002] -1E60 ; [.1DEC.0020.0008][.0000.002E.0002] -015F ; [.1DEC.0020.0002][.0000.0030.0002] -015E ; [.1DEC.0020.0008][.0000.0030.0002] -A7A9 ; [.1DEC.0020.0004][.0000.0035.0004] -A7A8 ; [.1DEC.0020.000A][.0000.0035.0004] -1E63 ; [.1DEC.0020.0002][.0000.0042.0002] -1E62 ; [.1DEC.0020.0008][.0000.0042.0002] -1E69 ; [.1DEC.0020.0002][.0000.0042.0002][.0000.002E.0002] -1E68 ; [.1DEC.0020.0008][.0000.0042.0002][.0000.002E.0002] -0219 ; [.1DEC.0020.0002][.0000.0045.0002] -0218 ; [.1DEC.0020.0008][.0000.0045.0002] -017F ; [.1DEC.0020.0004][.0000.010C.0004] -1DE5 ; [.1DEC.0020.0004][.0000.010C.0004] -A785 ; [.1DEC.0020.0004][.0000.010C.0004] -A784 ; [.1DEC.0020.000A][.0000.010C.0004] -1E9B ; [.1DEC.0020.0004][.0000.010C.0004][.0000.002E.0002] -1F18D ; [.1DEC.0020.001D][.1BC2.0020.001D] -1F14C ; [.1DEC.0020.001D][.1C0A.0020.001D] -2120 ; [.1DEC.0020.0014][.1D25.0020.0014] -1F198 ; [.1DEC.0020.001D][.1D58.0020.001D][.1DEC.0020.001D] -33DB ; [.1DEC.0020.001C][.1DAE.0020.001C] -1F14D ; [.1DEC.0020.001D][.1DEC.0020.001D] -00DF ; [.1DEC.0020.0004][.0000.010B.0004][.1DEC.0020.0004] -1E9E ; [.1DEC.0020.000A][.0000.010B.0004][.1DEC.0020.000A] -FB06 ; [.1DEC.0020.0004][.1E10.0020.0004] -FB05 ; [.1DEC.0020.0004][.0000.010C.0004][.1E10.0020.0004] -33DC ; [.1DEC.0020.001D][.1E5E.0020.001C] -A731 ; [.1DF0.0020.0002] -1D74 ; [.1DF1.0020.0002] -1D8A ; [.1DF2.0020.0002] -0282 ; [.1DF3.0020.0002] -1DB3 ; [.1DF3.0020.0014] -023F ; [.1DF7.0020.0002] -2C7E ; [.1DF7.0020.0008] -1E9C ; [.1DFB.0020.0002] -1E9D ; [.1DFC.0020.0002] -0283 ; [.1DFD.0020.0002] -1DEF ; [.1DFD.0020.0004] -01A9 ; [.1DFD.0020.0008] -1DB4 ; [.1DFD.0020.0014] -AB4D ; [.1E01.0020.0002] -1D8B ; [.1E02.0020.0002] -01AA ; [.1E03.0020.0002] -0285 ; [.1E07.0020.0002] -1D98 ; [.1E0B.0020.0002] -0286 ; [.1E0C.0020.0002] -0074 ; [.1E10.0020.0002] -FF54 ; [.1E10.0020.0003] -036D ; [.1E10.0020.0004] -24AF ; [*0310.0020.0004][.1E10.0020.0004][*0311.0020.0004] -1D42D ; [.1E10.0020.0005] -1D461 ; [.1E10.0020.0005] -1D495 ; [.1E10.0020.0005] -1D4C9 ; [.1E10.0020.0005] -1D4FD ; [.1E10.0020.0005] -1D531 ; [.1E10.0020.0005] -1D565 ; [.1E10.0020.0005] -1D599 ; [.1E10.0020.0005] -1D5CD ; [.1E10.0020.0005] -1D601 ; [.1E10.0020.0005] -1D635 ; [.1E10.0020.0005] -1D669 ; [.1E10.0020.0005] -1D69D ; [.1E10.0020.0005] -24E3 ; [.1E10.0020.0006] -0054 ; [.1E10.0020.0008] -FF34 ; [.1E10.0020.0009] -1F123 ; [*0310.0020.0004][.1E10.0020.000A][*0311.0020.0004] -1D413 ; [.1E10.0020.000B] -1D447 ; [.1E10.0020.000B] -1D47B ; [.1E10.0020.000B] -1D4AF ; [.1E10.0020.000B] -1D4E3 ; [.1E10.0020.000B] -1D517 ; [.1E10.0020.000B] -1D54B ; [.1E10.0020.000B] -1D57F ; [.1E10.0020.000B] -1D5B3 ; [.1E10.0020.000B] -1D5E7 ; [.1E10.0020.000B] -1D61B ; [.1E10.0020.000B] -1D64F ; [.1E10.0020.000B] -1D683 ; [.1E10.0020.000B] -24C9 ; [.1E10.0020.000C] -1F163 ; [.1E10.0020.000C] -1D57 ; [.1E10.0020.0014] -209C ; [.1E10.0020.0015] -1D40 ; [.1E10.0020.001D] -1F143 ; [.1E10.0020.001D] -1F183 ; [.1E10.0020.001D] -0165 ; [.1E10.0020.0002][.0000.0028.0002] -0164 ; [.1E10.0020.0008][.0000.0028.0002] -1E97 ; [.1E10.0020.0002][.0000.002B.0002] -1E6B ; [.1E10.0020.0002][.0000.002E.0002] -1E6A ; [.1E10.0020.0008][.0000.002E.0002] -0163 ; [.1E10.0020.0002][.0000.0030.0002] -0162 ; [.1E10.0020.0008][.0000.0030.0002] -1E6D ; [.1E10.0020.0002][.0000.0042.0002] -1E6C ; [.1E10.0020.0008][.0000.0042.0002] -021B ; [.1E10.0020.0002][.0000.0045.0002] -021A ; [.1E10.0020.0008][.0000.0045.0002] -1E71 ; [.1E10.0020.0002][.0000.0046.0002] -1E70 ; [.1E10.0020.0008][.0000.0046.0002] -1E6F ; [.1E10.0020.0002][.0000.0049.0002] -1E6E ; [.1E10.0020.0008][.0000.0049.0002] -A787 ; [.1E10.0020.0004][.0000.010C.0004] -A786 ; [.1E10.0020.000A][.0000.010C.0004] -02A8 ; [.1E10.0020.0004][.1C04.0020.0004] -2121 ; [.1E10.0020.000A][.1C25.0020.000A][.1CF2.0020.000A] -1D7A ; [.1E10.0020.0004][.0000.010B.0004][.1C93.0020.0004] -3394 ; [.1E10.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] -2122 ; [.1E10.0020.0014][.1D25.0020.0014] -01BE ; [.1E10.0020.0004][.1DEC.0020.0004] -02A6 ; [.1E10.0020.0004][.1DEC.0020.0004] -02A7 ; [.1E10.0020.0004][.1DFD.0020.0004] -A729 ; [.1E10.0020.0004][.1E9C.0020.0004] -A728 ; [.1E10.0020.000A][.1E9C.0020.0004] -1D1B ; [.1E14.0020.0002] -0167 ; [.1E15.0020.0002] -0166 ; [.1E15.0020.0008] -2C66 ; [.1E19.0020.0002] -023E ; [.1E19.0020.0008] -1D75 ; [.1E1A.0020.0002] -01AB ; [.1E1B.0020.0002] -1DB5 ; [.1E1B.0020.0014] -01AD ; [.1E1F.0020.0002] -01AC ; [.1E1F.0020.0008] -0288 ; [.1E23.0020.0002] -01AE ; [.1E23.0020.0008] -0236 ; [.1E27.0020.0002] -A777 ; [.1E2B.0020.0002] -0287 ; [.1E2C.0020.0002] -A7B1 ; [.1E2C.0020.0008] -0075 ; [.1E30.0020.0002] -FF55 ; [.1E30.0020.0003] -0367 ; [.1E30.0020.0004] -24B0 ; [*0310.0020.0004][.1E30.0020.0004][*0311.0020.0004] -1D42E ; [.1E30.0020.0005] -1D462 ; [.1E30.0020.0005] -1D496 ; [.1E30.0020.0005] -1D4CA ; [.1E30.0020.0005] -1D4FE ; [.1E30.0020.0005] -1D532 ; [.1E30.0020.0005] -1D566 ; [.1E30.0020.0005] -1D59A ; [.1E30.0020.0005] -1D5CE ; [.1E30.0020.0005] -1D602 ; [.1E30.0020.0005] -1D636 ; [.1E30.0020.0005] -1D66A ; [.1E30.0020.0005] -1D69E ; [.1E30.0020.0005] -24E4 ; [.1E30.0020.0006] -0055 ; [.1E30.0020.0008] -FF35 ; [.1E30.0020.0009] -1F124 ; [*0310.0020.0004][.1E30.0020.000A][*0311.0020.0004] -1D414 ; [.1E30.0020.000B] -1D448 ; [.1E30.0020.000B] -1D47C ; [.1E30.0020.000B] -1D4B0 ; [.1E30.0020.000B] -1D4E4 ; [.1E30.0020.000B] -1D518 ; [.1E30.0020.000B] -1D54C ; [.1E30.0020.000B] -1D580 ; [.1E30.0020.000B] -1D5B4 ; [.1E30.0020.000B] -1D5E8 ; [.1E30.0020.000B] -1D61C ; [.1E30.0020.000B] -1D650 ; [.1E30.0020.000B] -1D684 ; [.1E30.0020.000B] -24CA ; [.1E30.0020.000C] -1F164 ; [.1E30.0020.000C] -1D58 ; [.1E30.0020.0014] -1D64 ; [.1E30.0020.0015] -1D41 ; [.1E30.0020.001D] -1F144 ; [.1E30.0020.001D] -1F184 ; [.1E30.0020.001D] -00FA ; [.1E30.0020.0002][.0000.0024.0002] -00DA ; [.1E30.0020.0008][.0000.0024.0002] -00F9 ; [.1E30.0020.0002][.0000.0025.0002] -00D9 ; [.1E30.0020.0008][.0000.0025.0002] -016D ; [.1E30.0020.0002][.0000.0026.0002] -016C ; [.1E30.0020.0008][.0000.0026.0002] -00FB ; [.1E30.0020.0002][.0000.0027.0002] -00DB ; [.1E30.0020.0008][.0000.0027.0002] -01D4 ; [.1E30.0020.0002][.0000.0028.0002] -01D3 ; [.1E30.0020.0008][.0000.0028.0002] -016F ; [.1E30.0020.0002][.0000.0029.0002] -016E ; [.1E30.0020.0008][.0000.0029.0002] -00FC ; [.1E30.0020.0002][.0000.002B.0002] -1DF4 ; [.1E30.0020.0004][.0000.002B.0004] -A79F ; [.1E30.0020.0004][.0000.002B.0004] -00DC ; [.1E30.0020.0008][.0000.002B.0002] -A79E ; [.1E30.0020.000A][.0000.002B.0004] -01D8 ; [.1E30.0020.0002][.0000.002B.0002][.0000.0024.0002] -01D7 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0024.0002] -01DC ; [.1E30.0020.0002][.0000.002B.0002][.0000.0025.0002] -01DB ; [.1E30.0020.0008][.0000.002B.0002][.0000.0025.0002] -01DA ; [.1E30.0020.0002][.0000.002B.0002][.0000.0028.0002] -01D9 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0028.0002] -01D6 ; [.1E30.0020.0002][.0000.002B.0002][.0000.0032.0002] -01D5 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0032.0002] -0171 ; [.1E30.0020.0002][.0000.002C.0002] -0170 ; [.1E30.0020.0008][.0000.002C.0002] -0169 ; [.1E30.0020.0002][.0000.002D.0002] -0168 ; [.1E30.0020.0008][.0000.002D.0002] -1E79 ; [.1E30.0020.0002][.0000.002D.0002][.0000.0024.0002] -1E78 ; [.1E30.0020.0008][.0000.002D.0002][.0000.0024.0002] -0173 ; [.1E30.0020.0002][.0000.0031.0002] -0172 ; [.1E30.0020.0008][.0000.0031.0002] -016B ; [.1E30.0020.0002][.0000.0032.0002] -016A ; [.1E30.0020.0008][.0000.0032.0002] -1E7B ; [.1E30.0020.0002][.0000.0032.0002][.0000.002B.0002] -1E7A ; [.1E30.0020.0008][.0000.0032.0002][.0000.002B.0002] -1DF0 ; [.1E30.0020.0004][.0000.0034.0004] -1EE7 ; [.1E30.0020.0002][.0000.003B.0002] -1EE6 ; [.1E30.0020.0008][.0000.003B.0002] -0215 ; [.1E30.0020.0002][.0000.003C.0002] -0214 ; [.1E30.0020.0008][.0000.003C.0002] -0217 ; [.1E30.0020.0002][.0000.003E.0002] -0216 ; [.1E30.0020.0008][.0000.003E.0002] -01B0 ; [.1E30.0020.0002][.0000.003F.0002] -01AF ; [.1E30.0020.0008][.0000.003F.0002] -1EE9 ; [.1E30.0020.0002][.0000.003F.0002][.0000.0024.0002] -1EE8 ; [.1E30.0020.0008][.0000.003F.0002][.0000.0024.0002] -1EEB ; [.1E30.0020.0002][.0000.003F.0002][.0000.0025.0002] -1EEA ; [.1E30.0020.0008][.0000.003F.0002][.0000.0025.0002] -1EEF ; [.1E30.0020.0002][.0000.003F.0002][.0000.002D.0002] -1EEE ; [.1E30.0020.0008][.0000.003F.0002][.0000.002D.0002] -1EED ; [.1E30.0020.0002][.0000.003F.0002][.0000.003B.0002] -1EEC ; [.1E30.0020.0008][.0000.003F.0002][.0000.003B.0002] -1EF1 ; [.1E30.0020.0002][.0000.003F.0002][.0000.0042.0002] -1EF0 ; [.1E30.0020.0008][.0000.003F.0002][.0000.0042.0002] -1EE5 ; [.1E30.0020.0002][.0000.0042.0002] -1EE4 ; [.1E30.0020.0008][.0000.0042.0002] -1E73 ; [.1E30.0020.0002][.0000.0043.0002] -1E72 ; [.1E30.0020.0008][.0000.0043.0002] -1E77 ; [.1E30.0020.0002][.0000.0046.0002] -1E76 ; [.1E30.0020.0008][.0000.0046.0002] -1E75 ; [.1E30.0020.0002][.0000.0048.0002] -1E74 ; [.1E30.0020.0008][.0000.0048.0002] -1F199 ; [.1E30.0020.001D][.1D87.0020.001D][*025F.0020.001C] -1D1C ; [.1E34.0020.0002] -1DB8 ; [.1E34.0020.0014] -AB4E ; [.1E35.0020.0002] -1D1D ; [.1E36.0020.0002] -1D59 ; [.1E36.0020.0014] -1D1E ; [.1E37.0020.0002] -1D6B ; [.1E38.0020.0002] -AB50 ; [.1E39.0020.0002] -AB51 ; [.1E3A.0020.0002] -0289 ; [.1E3B.0020.0002] -0244 ; [.1E3B.0020.0008] -1DB6 ; [.1E3B.0020.0014] -AB4F ; [.1E3F.0020.0002] -1D7E ; [.1E40.0020.0002] -1D99 ; [.1E41.0020.0002] -AB52 ; [.1E42.0020.0002] -AB5F ; [.1E42.0020.0014] -0265 ; [.1E43.0020.0002] -A78D ; [.1E43.0020.0008] -1DA3 ; [.1E43.0020.0014] -02AE ; [.1E47.0020.0002] -02AF ; [.1E4B.0020.0002] -026F ; [.1E4F.0020.0002] -019C ; [.1E4F.0020.0008] -1D5A ; [.1E4F.0020.0014] -A7FA ; [.1E53.0020.0002] -1D1F ; [.1E54.0020.0002] -0270 ; [.1E55.0020.0002] -1DAD ; [.1E55.0020.0014] -028A ; [.1E59.0020.0002] -01B1 ; [.1E59.0020.0008] -1DB7 ; [.1E59.0020.0014] -1D7F ; [.1E5D.0020.0002] -0076 ; [.1E5E.0020.0002] -FF56 ; [.1E5E.0020.0003] -036E ; [.1E5E.0020.0004] -2174 ; [.1E5E.0020.0004] -24B1 ; [*0310.0020.0004][.1E5E.0020.0004][*0311.0020.0004] -1D42F ; [.1E5E.0020.0005] -1D463 ; [.1E5E.0020.0005] -1D497 ; [.1E5E.0020.0005] -1D4CB ; [.1E5E.0020.0005] -1D4FF ; [.1E5E.0020.0005] -1D533 ; [.1E5E.0020.0005] -1D567 ; [.1E5E.0020.0005] -1D59B ; [.1E5E.0020.0005] -1D5CF ; [.1E5E.0020.0005] -1D603 ; [.1E5E.0020.0005] -1D637 ; [.1E5E.0020.0005] -1D66B ; [.1E5E.0020.0005] -1D69F ; [.1E5E.0020.0005] -24E5 ; [.1E5E.0020.0006] -0056 ; [.1E5E.0020.0008] -FF36 ; [.1E5E.0020.0009] -2164 ; [.1E5E.0020.000A] -1F125 ; [*0310.0020.0004][.1E5E.0020.000A][*0311.0020.0004] -1D415 ; [.1E5E.0020.000B] -1D449 ; [.1E5E.0020.000B] -1D47D ; [.1E5E.0020.000B] -1D4B1 ; [.1E5E.0020.000B] -1D4E5 ; [.1E5E.0020.000B] -1D519 ; [.1E5E.0020.000B] -1D54D ; [.1E5E.0020.000B] -1D581 ; [.1E5E.0020.000B] -1D5B5 ; [.1E5E.0020.000B] -1D5E9 ; [.1E5E.0020.000B] -1D61D ; [.1E5E.0020.000B] -1D651 ; [.1E5E.0020.000B] -1D685 ; [.1E5E.0020.000B] -24CB ; [.1E5E.0020.000C] -1F165 ; [.1E5E.0020.000C] -1D5B ; [.1E5E.0020.0014] -1D65 ; [.1E5E.0020.0015] -2C7D ; [.1E5E.0020.001D] -1F145 ; [.1E5E.0020.001D] -1F185 ; [.1E5E.0020.001D] -1E7D ; [.1E5E.0020.0002][.0000.002D.0002] -1E7C ; [.1E5E.0020.0008][.0000.002D.0002] -1E7F ; [.1E5E.0020.0002][.0000.0042.0002] -1E7E ; [.1E5E.0020.0008][.0000.0042.0002] -2175 ; [.1E5E.0020.0004][.1CAD.0020.0004] -2165 ; [.1E5E.0020.000A][.1CAD.0020.000A] -2176 ; [.1E5E.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] -2166 ; [.1E5E.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] -2177 ; [.1E5E.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] -2167 ; [.1E5E.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] -33DE ; [.1E5E.0020.001D][*0605.0020.001C][.1D25.0020.001C] -1F19A ; [.1E5E.0020.001D][.1DEC.0020.001D] -A761 ; [.1E5E.0020.0004][.1E86.0020.0004] -A760 ; [.1E5E.0020.000A][.1E86.0020.000A] -1D20 ; [.1E62.0020.0002] -A75F ; [.1E63.0020.0002] -A75E ; [.1E63.0020.0008] -1D8C ; [.1E64.0020.0002] -028B ; [.1E65.0020.0002] -01B2 ; [.1E65.0020.0008] -1DB9 ; [.1E65.0020.0014] -2C71 ; [.1E69.0020.0002] -2C74 ; [.1E6A.0020.0002] -1EFD ; [.1E6B.0020.0002] -1EFC ; [.1E6B.0020.0008] -028C ; [.1E6C.0020.0002] -0245 ; [.1E6C.0020.0008] -1DBA ; [.1E6C.0020.0014] -0077 ; [.1E70.0020.0002] -FF57 ; [.1E70.0020.0003] -1DF1 ; [.1E70.0020.0004] -24B2 ; [*0310.0020.0004][.1E70.0020.0004][*0311.0020.0004] -1D430 ; [.1E70.0020.0005] -1D464 ; [.1E70.0020.0005] -1D498 ; [.1E70.0020.0005] -1D4CC ; [.1E70.0020.0005] -1D500 ; [.1E70.0020.0005] -1D534 ; [.1E70.0020.0005] -1D568 ; [.1E70.0020.0005] -1D59C ; [.1E70.0020.0005] -1D5D0 ; [.1E70.0020.0005] -1D604 ; [.1E70.0020.0005] -1D638 ; [.1E70.0020.0005] -1D66C ; [.1E70.0020.0005] -1D6A0 ; [.1E70.0020.0005] -24E6 ; [.1E70.0020.0006] -0057 ; [.1E70.0020.0008] -FF37 ; [.1E70.0020.0009] -1F126 ; [*0310.0020.0004][.1E70.0020.000A][*0311.0020.0004] -1D416 ; [.1E70.0020.000B] -1D44A ; [.1E70.0020.000B] -1D47E ; [.1E70.0020.000B] -1D4B2 ; [.1E70.0020.000B] -1D4E6 ; [.1E70.0020.000B] -1D51A ; [.1E70.0020.000B] -1D54E ; [.1E70.0020.000B] -1D582 ; [.1E70.0020.000B] -1D5B6 ; [.1E70.0020.000B] -1D5EA ; [.1E70.0020.000B] -1D61E ; [.1E70.0020.000B] -1D652 ; [.1E70.0020.000B] -1D686 ; [.1E70.0020.000B] -24CC ; [.1E70.0020.000C] -1F166 ; [.1E70.0020.000C] -02B7 ; [.1E70.0020.0014] -1D42 ; [.1E70.0020.001D] -1F146 ; [.1E70.0020.001D] -1F186 ; [.1E70.0020.001D] -1E83 ; [.1E70.0020.0002][.0000.0024.0002] -1E82 ; [.1E70.0020.0008][.0000.0024.0002] -1E81 ; [.1E70.0020.0002][.0000.0025.0002] -1E80 ; [.1E70.0020.0008][.0000.0025.0002] -0175 ; [.1E70.0020.0002][.0000.0027.0002] -0174 ; [.1E70.0020.0008][.0000.0027.0002] -1E98 ; [.1E70.0020.0002][.0000.0029.0002] -1E85 ; [.1E70.0020.0002][.0000.002B.0002] -1E84 ; [.1E70.0020.0008][.0000.002B.0002] -1E87 ; [.1E70.0020.0002][.0000.002E.0002] -1E86 ; [.1E70.0020.0008][.0000.002E.0002] -1E89 ; [.1E70.0020.0002][.0000.0042.0002] -1E88 ; [.1E70.0020.0008][.0000.0042.0002] -33DD ; [.1E70.0020.001D][.1BDB.0020.001C] -1F14F ; [.1E70.0020.001D][.1BF5.0020.001D] -1F18F ; [.1E70.0020.001D][.1BF5.0020.001D] -1F12E ; [.1E70.0020.000C][.1E9C.0020.000C] -1D21 ; [.1E74.0020.0002] -2C73 ; [.1E75.0020.0002] -2C72 ; [.1E75.0020.0008] -028D ; [.1E76.0020.0002] -0078 ; [.1E7A.0020.0002] -FF58 ; [.1E7A.0020.0003] -036F ; [.1E7A.0020.0004] -2179 ; [.1E7A.0020.0004] -24B3 ; [*0310.0020.0004][.1E7A.0020.0004][*0311.0020.0004] -1D431 ; [.1E7A.0020.0005] -1D465 ; [.1E7A.0020.0005] -1D499 ; [.1E7A.0020.0005] -1D4CD ; [.1E7A.0020.0005] -1D501 ; [.1E7A.0020.0005] -1D535 ; [.1E7A.0020.0005] -1D569 ; [.1E7A.0020.0005] -1D59D ; [.1E7A.0020.0005] -1D5D1 ; [.1E7A.0020.0005] -1D605 ; [.1E7A.0020.0005] -1D639 ; [.1E7A.0020.0005] -1D66D ; [.1E7A.0020.0005] -1D6A1 ; [.1E7A.0020.0005] -24E7 ; [.1E7A.0020.0006] -0058 ; [.1E7A.0020.0008] -FF38 ; [.1E7A.0020.0009] -2169 ; [.1E7A.0020.000A] -1F127 ; [*0310.0020.0004][.1E7A.0020.000A][*0311.0020.0004] -1D417 ; [.1E7A.0020.000B] -1D44B ; [.1E7A.0020.000B] -1D47F ; [.1E7A.0020.000B] -1D4B3 ; [.1E7A.0020.000B] -1D4E7 ; [.1E7A.0020.000B] -1D51B ; [.1E7A.0020.000B] -1D54F ; [.1E7A.0020.000B] -1D583 ; [.1E7A.0020.000B] -1D5B7 ; [.1E7A.0020.000B] -1D5EB ; [.1E7A.0020.000B] -1D61F ; [.1E7A.0020.000B] -1D653 ; [.1E7A.0020.000B] -1D687 ; [.1E7A.0020.000B] -24CD ; [.1E7A.0020.000C] -1F167 ; [.1E7A.0020.000C] -02E3 ; [.1E7A.0020.0014] -2093 ; [.1E7A.0020.0015] -1F147 ; [.1E7A.0020.001D] -1F187 ; [.1E7A.0020.001D] -1E8D ; [.1E7A.0020.0002][.0000.002B.0002] -1E8C ; [.1E7A.0020.0008][.0000.002B.0002] -1E8B ; [.1E7A.0020.0002][.0000.002E.0002] -1E8A ; [.1E7A.0020.0008][.0000.002E.0002] -217A ; [.1E7A.0020.0004][.1CAD.0020.0004] -216A ; [.1E7A.0020.000A][.1CAD.0020.000A] -217B ; [.1E7A.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] -216B ; [.1E7A.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] -1D8D ; [.1E7E.0020.0002] -AB56 ; [.1E7F.0020.0002] -AB57 ; [.1E80.0020.0002] -AB58 ; [.1E81.0020.0002] -AB59 ; [.1E82.0020.0002] -AB53 ; [.1E83.0020.0002] -A7B3 ; [.1E83.0020.0008] -AB54 ; [.1E84.0020.0002] -AB55 ; [.1E85.0020.0002] -0079 ; [.1E86.0020.0002] -FF59 ; [.1E86.0020.0003] -24B4 ; [*0310.0020.0004][.1E86.0020.0004][*0311.0020.0004] -1D432 ; [.1E86.0020.0005] -1D466 ; [.1E86.0020.0005] -1D49A ; [.1E86.0020.0005] -1D4CE ; [.1E86.0020.0005] -1D502 ; [.1E86.0020.0005] -1D536 ; [.1E86.0020.0005] -1D56A ; [.1E86.0020.0005] -1D59E ; [.1E86.0020.0005] -1D5D2 ; [.1E86.0020.0005] -1D606 ; [.1E86.0020.0005] -1D63A ; [.1E86.0020.0005] -1D66E ; [.1E86.0020.0005] -1D6A2 ; [.1E86.0020.0005] -24E8 ; [.1E86.0020.0006] -0059 ; [.1E86.0020.0008] -FF39 ; [.1E86.0020.0009] -1F128 ; [*0310.0020.0004][.1E86.0020.000A][*0311.0020.0004] -1D418 ; [.1E86.0020.000B] -1D44C ; [.1E86.0020.000B] -1D480 ; [.1E86.0020.000B] -1D4B4 ; [.1E86.0020.000B] -1D4E8 ; [.1E86.0020.000B] -1D51C ; [.1E86.0020.000B] -1D550 ; [.1E86.0020.000B] -1D584 ; [.1E86.0020.000B] -1D5B8 ; [.1E86.0020.000B] -1D5EC ; [.1E86.0020.000B] -1D620 ; [.1E86.0020.000B] -1D654 ; [.1E86.0020.000B] -1D688 ; [.1E86.0020.000B] -24CE ; [.1E86.0020.000C] -1F168 ; [.1E86.0020.000C] -02B8 ; [.1E86.0020.0014] -1F148 ; [.1E86.0020.001D] -1F188 ; [.1E86.0020.001D] -00FD ; [.1E86.0020.0002][.0000.0024.0002] -00DD ; [.1E86.0020.0008][.0000.0024.0002] -1EF3 ; [.1E86.0020.0002][.0000.0025.0002] -1EF2 ; [.1E86.0020.0008][.0000.0025.0002] -0177 ; [.1E86.0020.0002][.0000.0027.0002] -0176 ; [.1E86.0020.0008][.0000.0027.0002] -1E99 ; [.1E86.0020.0002][.0000.0029.0002] -00FF ; [.1E86.0020.0002][.0000.002B.0002] -0178 ; [.1E86.0020.0008][.0000.002B.0002] -1EF9 ; [.1E86.0020.0002][.0000.002D.0002] -1EF8 ; [.1E86.0020.0008][.0000.002D.0002] -1E8F ; [.1E86.0020.0002][.0000.002E.0002] -1E8E ; [.1E86.0020.0008][.0000.002E.0002] -0233 ; [.1E86.0020.0002][.0000.0032.0002] -0232 ; [.1E86.0020.0008][.0000.0032.0002] -1EF7 ; [.1E86.0020.0002][.0000.003B.0002] -1EF6 ; [.1E86.0020.0008][.0000.003B.0002] -1EF5 ; [.1E86.0020.0002][.0000.0042.0002] -1EF4 ; [.1E86.0020.0008][.0000.0042.0002] -028F ; [.1E8A.0020.0002] -024F ; [.1E8E.0020.0002] -024E ; [.1E8E.0020.0008] -01B4 ; [.1E92.0020.0002] -01B3 ; [.1E92.0020.0008] -1EFF ; [.1E96.0020.0002] -1EFE ; [.1E96.0020.0008] -AB5A ; [.1E97.0020.0002] -021D ; [.1E98.0020.0002] -021C ; [.1E98.0020.0008] -007A ; [.1E9C.0020.0002] -FF5A ; [.1E9C.0020.0003] -1DE6 ; [.1E9C.0020.0004] -24B5 ; [*0310.0020.0004][.1E9C.0020.0004][*0311.0020.0004] -1D433 ; [.1E9C.0020.0005] -1D467 ; [.1E9C.0020.0005] -1D49B ; [.1E9C.0020.0005] -1D4CF ; [.1E9C.0020.0005] -1D503 ; [.1E9C.0020.0005] -1D537 ; [.1E9C.0020.0005] -1D56B ; [.1E9C.0020.0005] -1D59F ; [.1E9C.0020.0005] -1D5D3 ; [.1E9C.0020.0005] -1D607 ; [.1E9C.0020.0005] -1D63B ; [.1E9C.0020.0005] -1D66F ; [.1E9C.0020.0005] -1D6A3 ; [.1E9C.0020.0005] -24E9 ; [.1E9C.0020.0006] -005A ; [.1E9C.0020.0008] -FF3A ; [.1E9C.0020.0009] -1F129 ; [*0310.0020.0004][.1E9C.0020.000A][*0311.0020.0004] -2124 ; [.1E9C.0020.000B] -2128 ; [.1E9C.0020.000B] -1D419 ; [.1E9C.0020.000B] -1D44D ; [.1E9C.0020.000B] -1D481 ; [.1E9C.0020.000B] -1D4B5 ; [.1E9C.0020.000B] -1D4E9 ; [.1E9C.0020.000B] -1D585 ; [.1E9C.0020.000B] -1D5B9 ; [.1E9C.0020.000B] -1D5ED ; [.1E9C.0020.000B] -1D621 ; [.1E9C.0020.000B] -1D655 ; [.1E9C.0020.000B] -1D689 ; [.1E9C.0020.000B] -24CF ; [.1E9C.0020.000C] -1F169 ; [.1E9C.0020.000C] -1DBB ; [.1E9C.0020.0014] -1F149 ; [.1E9C.0020.001D] -1F189 ; [.1E9C.0020.001D] -017A ; [.1E9C.0020.0002][.0000.0024.0002] -0179 ; [.1E9C.0020.0008][.0000.0024.0002] -1E91 ; [.1E9C.0020.0002][.0000.0027.0002] -1E90 ; [.1E9C.0020.0008][.0000.0027.0002] -017E ; [.1E9C.0020.0002][.0000.0028.0002] -017D ; [.1E9C.0020.0008][.0000.0028.0002] -017C ; [.1E9C.0020.0002][.0000.002E.0002] -017B ; [.1E9C.0020.0008][.0000.002E.0002] -1E93 ; [.1E9C.0020.0002][.0000.0042.0002] -1E92 ; [.1E9C.0020.0008][.0000.0042.0002] -1E95 ; [.1E9C.0020.0002][.0000.0049.0002] -1E94 ; [.1E9C.0020.0008][.0000.0049.0002] -018D ; [.1E9C.0020.0004][.1E70.0020.0004] -1D22 ; [.1EA0.0020.0002] -01B6 ; [.1EA1.0020.0002] -01B5 ; [.1EA1.0020.0008] -1D76 ; [.1EA5.0020.0002] -1D8E ; [.1EA6.0020.0002] -0225 ; [.1EA7.0020.0002] -0224 ; [.1EA7.0020.0008] -0290 ; [.1EAB.0020.0002] -1DBC ; [.1EAB.0020.0014] -0291 ; [.1EAF.0020.0002] -1DBD ; [.1EAF.0020.0014] -0240 ; [.1EB3.0020.0002] -2C7F ; [.1EB3.0020.0008] -2C6C ; [.1EB7.0020.0002] -2C6B ; [.1EB7.0020.0008] -A763 ; [.1EB8.0020.0002] -A762 ; [.1EB8.0020.0008] -0292 ; [.1EB9.0020.0002] -01B7 ; [.1EB9.0020.0008] -1DBE ; [.1EB9.0020.0014] -01EF ; [.1EB9.0020.0002][.0000.0028.0002] -01EE ; [.1EB9.0020.0008][.0000.0028.0002] -1D23 ; [.1EBD.0020.0002] -01B9 ; [.1EBE.0020.0002] -01B8 ; [.1EBE.0020.0008] -1D9A ; [.1EC2.0020.0002] -01BA ; [.1EC3.0020.0002] -0293 ; [.1EC7.0020.0002] -00FE ; [.1ECB.0020.0002] -00DE ; [.1ECB.0020.0008] -A765 ; [.1ECF.0020.0002] -A764 ; [.1ECF.0020.0008] -A767 ; [.1ED0.0020.0002] -A766 ; [.1ED0.0020.0008] -01BF ; [.1ED1.0020.0002] -01F7 ; [.1ED1.0020.0008] -A769 ; [.1ED5.0020.0002] -A768 ; [.1ED5.0020.0008] -AB60 ; [.1ED6.0020.0002] -AB61 ; [.1ED7.0020.0002] -AB63 ; [.1ED8.0020.0002] -A76B ; [.1ED9.0020.0002] -A76A ; [.1ED9.0020.0008] -A76D ; [.1EDA.0020.0002] -A76C ; [.1EDA.0020.0008] -A76F ; [.1EDB.0020.0002] -1DD2 ; [.1EDB.0020.0004] -A76E ; [.1EDB.0020.0008] -A770 ; [.1EDB.0020.0014] -A778 ; [.1EDC.0020.0002] -01BB ; [.1EDD.0020.0002] -A72B ; [.1EE1.0020.0002] -A72A ; [.1EE1.0020.0008] -A72D ; [.1EE2.0020.0002] -A72C ; [.1EE2.0020.0008] -A72F ; [.1EE3.0020.0002] -A72E ; [.1EE3.0020.0008] -01A8 ; [.1EE4.0020.0002] -01A7 ; [.1EE4.0020.0008] -01BD ; [.1EE8.0020.0002] -01BC ; [.1EE8.0020.0008] -0185 ; [.1EEC.0020.0002] -0184 ; [.1EEC.0020.0008] -0294 ; [.1EF0.0020.0002] -0242 ; [.1EF4.0020.0002] -0241 ; [.1EF4.0020.0008] -02C0 ; [.1EF8.0020.0002] -02BC ; [.1EF9.0020.0002] -0149 ; [.1EF9.0020.0004][.1D34.0020.0004] -02EE ; [.1EFA.0020.0002] -02BE ; [.1EFB.0020.0002] -A723 ; [.1EFC.0020.0002] -A722 ; [.1EFC.0020.0008] -A78C ; [.1EFD.0020.0002] -A78B ; [.1EFD.0020.0008] -A78F ; [.1EFE.0020.0002] -0295 ; [.1EFF.0020.0002] -02E4 ; [.1EFF.0020.0014] -02BF ; [.1F03.0020.0002] -02C1 ; [.1F04.0020.0002] -1D24 ; [.1F05.0020.0002] -1D25 ; [.1F06.0020.0002] -1D5C ; [.1F06.0020.0014] -A725 ; [.1F07.0020.0002] -A724 ; [.1F07.0020.0008] -02A1 ; [.1F08.0020.0002] -02A2 ; [.1F0C.0020.0002] -0296 ; [.1F10.0020.0002] -01C0 ; [.1F14.0020.0002] -01C1 ; [.1F18.0020.0002] -01C2 ; [.1F1C.0020.0002] -01C3 ; [.1F20.0020.0002] -0297 ; [.1F24.0020.0002] -0298 ; [.1F28.0020.0002] -02AC ; [.1F2C.0020.0002] -02AD ; [.1F30.0020.0002] -03B1 ; [.1F34.0020.0002] -1D6C2 ; [.1F34.0020.0005] -1D6FC ; [.1F34.0020.0005] -1D736 ; [.1F34.0020.0005] -1D770 ; [.1F34.0020.0005] -1D7AA ; [.1F34.0020.0005] -0391 ; [.1F34.0020.0008] -1D6A8 ; [.1F34.0020.000B] -1D6E2 ; [.1F34.0020.000B] -1D71C ; [.1F34.0020.000B] -1D756 ; [.1F34.0020.000B] -1D790 ; [.1F34.0020.000B] -1F00 ; [.1F34.0020.0002][.0000.0022.0002] -1F08 ; [.1F34.0020.0008][.0000.0022.0002] -1F04 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0024.0002] -1F0C ; [.1F34.0020.0008][.0000.0022.0002][.0000.0024.0002] -1F84 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] -1F8C ; [.1F34.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] -1F02 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0025.0002] -1F0A ; [.1F34.0020.0008][.0000.0022.0002][.0000.0025.0002] -1F82 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] -1F8A ; [.1F34.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] -1F06 ; [.1F34.0020.0002][.0000.0022.0002][.0000.002A.0002] -1F0E ; [.1F34.0020.0008][.0000.0022.0002][.0000.002A.0002] -1F86 ; [.1F34.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] -1F8E ; [.1F34.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] -1F80 ; [.1F34.0020.0002][.0000.0022.0002][.0000.004C.0002] -1F88 ; [.1F34.0020.0008][.0000.0022.0002][.0000.004C.0002] -1F01 ; [.1F34.0020.0002][.0000.0023.0002] -1F09 ; [.1F34.0020.0008][.0000.0023.0002] -1F05 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0024.0002] -1F0D ; [.1F34.0020.0008][.0000.0023.0002][.0000.0024.0002] -1F85 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] -1F8D ; [.1F34.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] -1F03 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0025.0002] -1F0B ; [.1F34.0020.0008][.0000.0023.0002][.0000.0025.0002] -1F83 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] -1F8B ; [.1F34.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] -1F07 ; [.1F34.0020.0002][.0000.0023.0002][.0000.002A.0002] -1F0F ; [.1F34.0020.0008][.0000.0023.0002][.0000.002A.0002] -1F87 ; [.1F34.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] -1F8F ; [.1F34.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] -1F81 ; [.1F34.0020.0002][.0000.0023.0002][.0000.004C.0002] -1F89 ; [.1F34.0020.0008][.0000.0023.0002][.0000.004C.0002] -03AC ; [.1F34.0020.0002][.0000.0024.0002] -1F71 ; [.1F34.0020.0002][.0000.0024.0002] -0386 ; [.1F34.0020.0008][.0000.0024.0002] -1FBB ; [.1F34.0020.0008][.0000.0024.0002] -1FB4 ; [.1F34.0020.0002][.0000.0024.0002][.0000.004C.0002] -1F70 ; [.1F34.0020.0002][.0000.0025.0002] -1FBA ; [.1F34.0020.0008][.0000.0025.0002] -1FB2 ; [.1F34.0020.0002][.0000.0025.0002][.0000.004C.0002] -1FB0 ; [.1F34.0020.0002][.0000.0026.0002] -1FB8 ; [.1F34.0020.0008][.0000.0026.0002] -1FB6 ; [.1F34.0020.0002][.0000.002A.0002] -1FB7 ; [.1F34.0020.0002][.0000.002A.0002][.0000.004C.0002] -1FB1 ; [.1F34.0020.0002][.0000.0032.0002] -1FB9 ; [.1F34.0020.0008][.0000.0032.0002] -1FB3 ; [.1F34.0020.0002][.0000.004C.0002] -1FBC ; [.1F34.0020.0008][.0000.004C.0002] -03B2 ; [.1F35.0020.0002] -03D0 ; [.1F35.0020.0004] -1D6C3 ; [.1F35.0020.0005] -1D6FD ; [.1F35.0020.0005] -1D737 ; [.1F35.0020.0005] -1D771 ; [.1F35.0020.0005] -1D7AB ; [.1F35.0020.0005] -0392 ; [.1F35.0020.0008] -1D6A9 ; [.1F35.0020.000B] -1D6E3 ; [.1F35.0020.000B] -1D71D ; [.1F35.0020.000B] -1D757 ; [.1F35.0020.000B] -1D791 ; [.1F35.0020.000B] -1D5D ; [.1F35.0020.0014] -1D66 ; [.1F35.0020.0015] -03B3 ; [.1F36.0020.0002] -213D ; [.1F36.0020.0005] -1D6C4 ; [.1F36.0020.0005] -1D6FE ; [.1F36.0020.0005] -1D738 ; [.1F36.0020.0005] -1D772 ; [.1F36.0020.0005] -1D7AC ; [.1F36.0020.0005] -0393 ; [.1F36.0020.0008] -213E ; [.1F36.0020.000B] -1D6AA ; [.1F36.0020.000B] -1D6E4 ; [.1F36.0020.000B] -1D71E ; [.1F36.0020.000B] -1D758 ; [.1F36.0020.000B] -1D792 ; [.1F36.0020.000B] -1D5E ; [.1F36.0020.0014] -1D67 ; [.1F36.0020.0015] -1D26 ; [.1F37.0020.0002] -03B4 ; [.1F38.0020.0002] -1D6C5 ; [.1F38.0020.0005] -1D6FF ; [.1F38.0020.0005] -1D739 ; [.1F38.0020.0005] -1D773 ; [.1F38.0020.0005] -1D7AD ; [.1F38.0020.0005] -0394 ; [.1F38.0020.0008] -1D6AB ; [.1F38.0020.000B] -1D6E5 ; [.1F38.0020.000B] -1D71F ; [.1F38.0020.000B] -1D759 ; [.1F38.0020.000B] -1D793 ; [.1F38.0020.000B] -1D5F ; [.1F38.0020.0014] -03B5 ; [.1F39.0020.0002] -03F5 ; [.1F39.0020.0004] -1D6C6 ; [.1F39.0020.0005] -1D6DC ; [.1F39.0020.0005] -1D700 ; [.1F39.0020.0005] -1D716 ; [.1F39.0020.0005] -1D73A ; [.1F39.0020.0005] -1D750 ; [.1F39.0020.0005] -1D774 ; [.1F39.0020.0005] -1D78A ; [.1F39.0020.0005] -1D7AE ; [.1F39.0020.0005] -1D7C4 ; [.1F39.0020.0005] -0395 ; [.1F39.0020.0008] -1D6AC ; [.1F39.0020.000B] -1D6E6 ; [.1F39.0020.000B] -1D720 ; [.1F39.0020.000B] -1D75A ; [.1F39.0020.000B] -1D794 ; [.1F39.0020.000B] -1F10 ; [.1F39.0020.0002][.0000.0022.0002] -1F18 ; [.1F39.0020.0008][.0000.0022.0002] -1F14 ; [.1F39.0020.0002][.0000.0022.0002][.0000.0024.0002] -1F1C ; [.1F39.0020.0008][.0000.0022.0002][.0000.0024.0002] -1F12 ; [.1F39.0020.0002][.0000.0022.0002][.0000.0025.0002] -1F1A ; [.1F39.0020.0008][.0000.0022.0002][.0000.0025.0002] -1F11 ; [.1F39.0020.0002][.0000.0023.0002] -1F19 ; [.1F39.0020.0008][.0000.0023.0002] -1F15 ; [.1F39.0020.0002][.0000.0023.0002][.0000.0024.0002] -1F1D ; [.1F39.0020.0008][.0000.0023.0002][.0000.0024.0002] -1F13 ; [.1F39.0020.0002][.0000.0023.0002][.0000.0025.0002] -1F1B ; [.1F39.0020.0008][.0000.0023.0002][.0000.0025.0002] -03AD ; [.1F39.0020.0002][.0000.0024.0002] -1F73 ; [.1F39.0020.0002][.0000.0024.0002] -0388 ; [.1F39.0020.0008][.0000.0024.0002] -1FC9 ; [.1F39.0020.0008][.0000.0024.0002] -1F72 ; [.1F39.0020.0002][.0000.0025.0002] -1FC8 ; [.1F39.0020.0008][.0000.0025.0002] -03DD ; [.1F3A.0020.0002] -1D7CB ; [.1F3A.0020.0005] -03DC ; [.1F3A.0020.0008] -1D7CA ; [.1F3A.0020.000B] -0377 ; [.1F3B.0020.0002] -0376 ; [.1F3B.0020.0008] -03DB ; [.1F3C.0020.0002] -03DA ; [.1F3C.0020.0008] -03B6 ; [.1F3D.0020.0002] -1D6C7 ; [.1F3D.0020.0005] -1D701 ; [.1F3D.0020.0005] -1D73B ; [.1F3D.0020.0005] -1D775 ; [.1F3D.0020.0005] -1D7AF ; [.1F3D.0020.0005] -0396 ; [.1F3D.0020.0008] -1D6AD ; [.1F3D.0020.000B] -1D6E7 ; [.1F3D.0020.000B] -1D721 ; [.1F3D.0020.000B] -1D75B ; [.1F3D.0020.000B] -1D795 ; [.1F3D.0020.000B] -0371 ; [.1F3E.0020.0002] -0370 ; [.1F3E.0020.0008] -03B7 ; [.1F3F.0020.0002] -1D6C8 ; [.1F3F.0020.0005] -1D702 ; [.1F3F.0020.0005] -1D73C ; [.1F3F.0020.0005] -1D776 ; [.1F3F.0020.0005] -1D7B0 ; [.1F3F.0020.0005] -0397 ; [.1F3F.0020.0008] -1D6AE ; [.1F3F.0020.000B] -1D6E8 ; [.1F3F.0020.000B] -1D722 ; [.1F3F.0020.000B] -1D75C ; [.1F3F.0020.000B] -1D796 ; [.1F3F.0020.000B] -1F20 ; [.1F3F.0020.0002][.0000.0022.0002] -1F28 ; [.1F3F.0020.0008][.0000.0022.0002] -1F24 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0024.0002] -1F2C ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0024.0002] -1F94 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] -1F9C ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] -1F22 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0025.0002] -1F2A ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0025.0002] -1F92 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] -1F9A ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] -1F26 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.002A.0002] -1F2E ; [.1F3F.0020.0008][.0000.0022.0002][.0000.002A.0002] -1F96 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] -1F9E ; [.1F3F.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] -1F90 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.004C.0002] -1F98 ; [.1F3F.0020.0008][.0000.0022.0002][.0000.004C.0002] -1F21 ; [.1F3F.0020.0002][.0000.0023.0002] -1F29 ; [.1F3F.0020.0008][.0000.0023.0002] -1F25 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0024.0002] -1F2D ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0024.0002] -1F95 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] -1F9D ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] -1F23 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0025.0002] -1F2B ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0025.0002] -1F93 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] -1F9B ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] -1F27 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.002A.0002] -1F2F ; [.1F3F.0020.0008][.0000.0023.0002][.0000.002A.0002] -1F97 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] -1F9F ; [.1F3F.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] -1F91 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.004C.0002] -1F99 ; [.1F3F.0020.0008][.0000.0023.0002][.0000.004C.0002] -03AE ; [.1F3F.0020.0002][.0000.0024.0002] -1F75 ; [.1F3F.0020.0002][.0000.0024.0002] -0389 ; [.1F3F.0020.0008][.0000.0024.0002] -1FCB ; [.1F3F.0020.0008][.0000.0024.0002] -1FC4 ; [.1F3F.0020.0002][.0000.0024.0002][.0000.004C.0002] -1F74 ; [.1F3F.0020.0002][.0000.0025.0002] -1FCA ; [.1F3F.0020.0008][.0000.0025.0002] -1FC2 ; [.1F3F.0020.0002][.0000.0025.0002][.0000.004C.0002] -1FC6 ; [.1F3F.0020.0002][.0000.002A.0002] -1FC7 ; [.1F3F.0020.0002][.0000.002A.0002][.0000.004C.0002] -1FC3 ; [.1F3F.0020.0002][.0000.004C.0002] -1FCC ; [.1F3F.0020.0008][.0000.004C.0002] -03B8 ; [.1F40.0020.0002] -03D1 ; [.1F40.0020.0004] -1D6C9 ; [.1F40.0020.0005] -1D6DD ; [.1F40.0020.0005] -1D703 ; [.1F40.0020.0005] -1D717 ; [.1F40.0020.0005] -1D73D ; [.1F40.0020.0005] -1D751 ; [.1F40.0020.0005] -1D777 ; [.1F40.0020.0005] -1D78B ; [.1F40.0020.0005] -1D7B1 ; [.1F40.0020.0005] -1D7C5 ; [.1F40.0020.0005] -0398 ; [.1F40.0020.0008] -03F4 ; [.1F40.0020.000A] -1D6AF ; [.1F40.0020.000B] -1D6B9 ; [.1F40.0020.000B] -1D6E9 ; [.1F40.0020.000B] -1D6F3 ; [.1F40.0020.000B] -1D723 ; [.1F40.0020.000B] -1D72D ; [.1F40.0020.000B] -1D75D ; [.1F40.0020.000B] -1D767 ; [.1F40.0020.000B] -1D797 ; [.1F40.0020.000B] -1D7A1 ; [.1F40.0020.000B] -1DBF ; [.1F40.0020.0014] -03B9 ; [.1F41.0020.0002] -1FBE ; [.1F41.0020.0002] -037A ; [.1F41.0020.0004] -1D6CA ; [.1F41.0020.0005] -1D704 ; [.1F41.0020.0005] -1D73E ; [.1F41.0020.0005] -1D778 ; [.1F41.0020.0005] -1D7B2 ; [.1F41.0020.0005] -0399 ; [.1F41.0020.0008] -1D6B0 ; [.1F41.0020.000B] -1D6EA ; [.1F41.0020.000B] -1D724 ; [.1F41.0020.000B] -1D75E ; [.1F41.0020.000B] -1D798 ; [.1F41.0020.000B] -1F30 ; [.1F41.0020.0002][.0000.0022.0002] -1F38 ; [.1F41.0020.0008][.0000.0022.0002] -1F34 ; [.1F41.0020.0002][.0000.0022.0002][.0000.0024.0002] -1F3C ; [.1F41.0020.0008][.0000.0022.0002][.0000.0024.0002] -1F32 ; [.1F41.0020.0002][.0000.0022.0002][.0000.0025.0002] -1F3A ; [.1F41.0020.0008][.0000.0022.0002][.0000.0025.0002] -1F36 ; [.1F41.0020.0002][.0000.0022.0002][.0000.002A.0002] -1F3E ; [.1F41.0020.0008][.0000.0022.0002][.0000.002A.0002] -1F31 ; [.1F41.0020.0002][.0000.0023.0002] -1F39 ; [.1F41.0020.0008][.0000.0023.0002] -1F35 ; [.1F41.0020.0002][.0000.0023.0002][.0000.0024.0002] -1F3D ; [.1F41.0020.0008][.0000.0023.0002][.0000.0024.0002] -1F33 ; [.1F41.0020.0002][.0000.0023.0002][.0000.0025.0002] -1F3B ; [.1F41.0020.0008][.0000.0023.0002][.0000.0025.0002] -1F37 ; [.1F41.0020.0002][.0000.0023.0002][.0000.002A.0002] -1F3F ; [.1F41.0020.0008][.0000.0023.0002][.0000.002A.0002] -03AF ; [.1F41.0020.0002][.0000.0024.0002] -1F77 ; [.1F41.0020.0002][.0000.0024.0002] -038A ; [.1F41.0020.0008][.0000.0024.0002] -1FDB ; [.1F41.0020.0008][.0000.0024.0002] -1F76 ; [.1F41.0020.0002][.0000.0025.0002] -1FDA ; [.1F41.0020.0008][.0000.0025.0002] -1FD0 ; [.1F41.0020.0002][.0000.0026.0002] -1FD8 ; [.1F41.0020.0008][.0000.0026.0002] -1FD6 ; [.1F41.0020.0002][.0000.002A.0002] -03CA ; [.1F41.0020.0002][.0000.002B.0002] -03AA ; [.1F41.0020.0008][.0000.002B.0002] -0390 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0024.0002] -1FD3 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0024.0002] -1FD2 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0025.0002] -1FD7 ; [.1F41.0020.0002][.0000.002B.0002][.0000.002A.0002] -1FD1 ; [.1F41.0020.0002][.0000.0032.0002] -1FD9 ; [.1F41.0020.0008][.0000.0032.0002] -03F3 ; [.1F42.0020.0002] -037F ; [.1F42.0020.0008] -03BA ; [.1F43.0020.0002] -03F0 ; [.1F43.0020.0004] -1D6CB ; [.1F43.0020.0005] -1D6DE ; [.1F43.0020.0005] -1D705 ; [.1F43.0020.0005] -1D718 ; [.1F43.0020.0005] -1D73F ; [.1F43.0020.0005] -1D752 ; [.1F43.0020.0005] -1D779 ; [.1F43.0020.0005] -1D78C ; [.1F43.0020.0005] -1D7B3 ; [.1F43.0020.0005] -1D7C6 ; [.1F43.0020.0005] -039A ; [.1F43.0020.0008] -1D6B1 ; [.1F43.0020.000B] -1D6EB ; [.1F43.0020.000B] -1D725 ; [.1F43.0020.000B] -1D75F ; [.1F43.0020.000B] -1D799 ; [.1F43.0020.000B] -03D7 ; [.1F43.0020.0004][.1F34.0020.0004][.1F41.0020.0004] -03CF ; [.1F43.0020.000A][.1F34.0020.0004][.1F41.0020.0004] -03BB ; [.1F44.0020.0002] -1D6CC ; [.1F44.0020.0005] -1D706 ; [.1F44.0020.0005] -1D740 ; [.1F44.0020.0005] -1D77A ; [.1F44.0020.0005] -1D7B4 ; [.1F44.0020.0005] -039B ; [.1F44.0020.0008] -1D6B2 ; [.1F44.0020.000B] -1D6EC ; [.1F44.0020.000B] -1D726 ; [.1F44.0020.000B] -1D760 ; [.1F44.0020.000B] -1D79A ; [.1F44.0020.000B] -1D27 ; [.1F45.0020.0002] -03BC ; [.1F46.0020.0002] -00B5 ; [.1F46.0020.0004] -1D6CD ; [.1F46.0020.0005] -1D707 ; [.1F46.0020.0005] -1D741 ; [.1F46.0020.0005] -1D77B ; [.1F46.0020.0005] -1D7B5 ; [.1F46.0020.0005] -039C ; [.1F46.0020.0008] -1D6B3 ; [.1F46.0020.000B] -1D6ED ; [.1F46.0020.000B] -1D727 ; [.1F46.0020.000B] -1D761 ; [.1F46.0020.000B] -1D79B ; [.1F46.0020.000B] -3382 ; [.1F46.0020.001C][.1BC2.0020.001D] -338C ; [.1F46.0020.001C][.1C60.0020.001D] -338D ; [.1F46.0020.001C][.1C6F.0020.001C] -3395 ; [.1F46.0020.001C][.1CF2.0020.001C] -339B ; [.1F46.0020.001C][.1D25.0020.001C] -33B2 ; [.1F46.0020.001C][.1DEC.0020.001C] -33B6 ; [.1F46.0020.001C][.1E5E.0020.001D] -33BC ; [.1F46.0020.001C][.1E70.0020.001D] -03BD ; [.1F47.0020.0002] -1D6CE ; [.1F47.0020.0005] -1D708 ; [.1F47.0020.0005] -1D742 ; [.1F47.0020.0005] -1D77C ; [.1F47.0020.0005] -1D7B6 ; [.1F47.0020.0005] -039D ; [.1F47.0020.0008] -1D6B4 ; [.1F47.0020.000B] -1D6EE ; [.1F47.0020.000B] -1D728 ; [.1F47.0020.000B] -1D762 ; [.1F47.0020.000B] -1D79C ; [.1F47.0020.000B] -03BE ; [.1F48.0020.0002] -1D6CF ; [.1F48.0020.0005] -1D709 ; [.1F48.0020.0005] -1D743 ; [.1F48.0020.0005] -1D77D ; [.1F48.0020.0005] -1D7B7 ; [.1F48.0020.0005] -039E ; [.1F48.0020.0008] -1D6B5 ; [.1F48.0020.000B] -1D6EF ; [.1F48.0020.000B] -1D729 ; [.1F48.0020.000B] -1D763 ; [.1F48.0020.000B] -1D79D ; [.1F48.0020.000B] -03BF ; [.1F49.0020.0002] -1D6D0 ; [.1F49.0020.0005] -1D70A ; [.1F49.0020.0005] -1D744 ; [.1F49.0020.0005] -1D77E ; [.1F49.0020.0005] -1D7B8 ; [.1F49.0020.0005] -039F ; [.1F49.0020.0008] -1D6B6 ; [.1F49.0020.000B] -1D6F0 ; [.1F49.0020.000B] -1D72A ; [.1F49.0020.000B] -1D764 ; [.1F49.0020.000B] -1D79E ; [.1F49.0020.000B] -1F40 ; [.1F49.0020.0002][.0000.0022.0002] -1F48 ; [.1F49.0020.0008][.0000.0022.0002] -1F44 ; [.1F49.0020.0002][.0000.0022.0002][.0000.0024.0002] -1F4C ; [.1F49.0020.0008][.0000.0022.0002][.0000.0024.0002] -1F42 ; [.1F49.0020.0002][.0000.0022.0002][.0000.0025.0002] -1F4A ; [.1F49.0020.0008][.0000.0022.0002][.0000.0025.0002] -1F41 ; [.1F49.0020.0002][.0000.0023.0002] -1F49 ; [.1F49.0020.0008][.0000.0023.0002] -1F45 ; [.1F49.0020.0002][.0000.0023.0002][.0000.0024.0002] -1F4D ; [.1F49.0020.0008][.0000.0023.0002][.0000.0024.0002] -1F43 ; [.1F49.0020.0002][.0000.0023.0002][.0000.0025.0002] -1F4B ; [.1F49.0020.0008][.0000.0023.0002][.0000.0025.0002] -03CC ; [.1F49.0020.0002][.0000.0024.0002] -1F79 ; [.1F49.0020.0002][.0000.0024.0002] -038C ; [.1F49.0020.0008][.0000.0024.0002] -1FF9 ; [.1F49.0020.0008][.0000.0024.0002] -1F78 ; [.1F49.0020.0002][.0000.0025.0002] -1FF8 ; [.1F49.0020.0008][.0000.0025.0002] -03C0 ; [.1F4A.0020.0002] -03D6 ; [.1F4A.0020.0004] -213C ; [.1F4A.0020.0005] -1D6D1 ; [.1F4A.0020.0005] -1D6E1 ; [.1F4A.0020.0005] -1D70B ; [.1F4A.0020.0005] -1D71B ; [.1F4A.0020.0005] -1D745 ; [.1F4A.0020.0005] -1D755 ; [.1F4A.0020.0005] -1D77F ; [.1F4A.0020.0005] -1D78F ; [.1F4A.0020.0005] -1D7B9 ; [.1F4A.0020.0005] -1D7C9 ; [.1F4A.0020.0005] -03A0 ; [.1F4A.0020.0008] -213F ; [.1F4A.0020.000B] -1D6B7 ; [.1F4A.0020.000B] -1D6F1 ; [.1F4A.0020.000B] -1D72B ; [.1F4A.0020.000B] -1D765 ; [.1F4A.0020.000B] -1D79F ; [.1F4A.0020.000B] -1D28 ; [.1F4B.0020.0002] -03FB ; [.1F4C.0020.0002] -03FA ; [.1F4C.0020.0008] -03DF ; [.1F4D.0020.0002] -03DE ; [.1F4D.0020.0008] -03D9 ; [.1F4E.0020.0002] -03D8 ; [.1F4E.0020.0008] -03C1 ; [.1F4F.0020.0002] -03F1 ; [.1F4F.0020.0004] -1D6D2 ; [.1F4F.0020.0005] -1D6E0 ; [.1F4F.0020.0005] -1D70C ; [.1F4F.0020.0005] -1D71A ; [.1F4F.0020.0005] -1D746 ; [.1F4F.0020.0005] -1D754 ; [.1F4F.0020.0005] -1D780 ; [.1F4F.0020.0005] -1D78E ; [.1F4F.0020.0005] -1D7BA ; [.1F4F.0020.0005] -1D7C8 ; [.1F4F.0020.0005] -03A1 ; [.1F4F.0020.0008] -1D6B8 ; [.1F4F.0020.000B] -1D6F2 ; [.1F4F.0020.000B] -1D72C ; [.1F4F.0020.000B] -1D766 ; [.1F4F.0020.000B] -1D7A0 ; [.1F4F.0020.000B] -1D68 ; [.1F4F.0020.0015] -1FE4 ; [.1F4F.0020.0002][.0000.0022.0002] -1FE5 ; [.1F4F.0020.0002][.0000.0023.0002] -1FEC ; [.1F4F.0020.0008][.0000.0023.0002] -1D29 ; [.1F50.0020.0002] -03FC ; [.1F51.0020.0002] -03C3 ; [.1F52.0020.0002] -03F2 ; [.1F52.0020.0004] -1D6D3 ; [.1F52.0020.0005] -1D6D4 ; [.1F52.0020.0005] -1D70D ; [.1F52.0020.0005] -1D70E ; [.1F52.0020.0005] -1D747 ; [.1F52.0020.0005] -1D748 ; [.1F52.0020.0005] -1D781 ; [.1F52.0020.0005] -1D782 ; [.1F52.0020.0005] -1D7BB ; [.1F52.0020.0005] -1D7BC ; [.1F52.0020.0005] -03A3 ; [.1F52.0020.0008] -03F9 ; [.1F52.0020.000A] -1D6BA ; [.1F52.0020.000B] -1D6F4 ; [.1F52.0020.000B] -1D72E ; [.1F52.0020.000B] -1D768 ; [.1F52.0020.000B] -1D7A2 ; [.1F52.0020.000B] -03C2 ; [.1F52.0020.0019] -037C ; [.1F53.0020.0002] -03FE ; [.1F53.0020.0008] -037B ; [.1F54.0020.0002] -03FD ; [.1F54.0020.0008] -037D ; [.1F55.0020.0002] -03FF ; [.1F55.0020.0008] -03C4 ; [.1F56.0020.0002] -1D6D5 ; [.1F56.0020.0005] -1D70F ; [.1F56.0020.0005] -1D749 ; [.1F56.0020.0005] -1D783 ; [.1F56.0020.0005] -1D7BD ; [.1F56.0020.0005] -03A4 ; [.1F56.0020.0008] -1D6BB ; [.1F56.0020.000B] -1D6F5 ; [.1F56.0020.000B] -1D72F ; [.1F56.0020.000B] -1D769 ; [.1F56.0020.000B] -1D7A3 ; [.1F56.0020.000B] -03C5 ; [.1F57.0020.0002] -1D6D6 ; [.1F57.0020.0005] -1D710 ; [.1F57.0020.0005] -1D74A ; [.1F57.0020.0005] -1D784 ; [.1F57.0020.0005] -1D7BE ; [.1F57.0020.0005] -03A5 ; [.1F57.0020.0008] -03D2 ; [.1F57.0020.000A] -1D6BC ; [.1F57.0020.000B] -1D6F6 ; [.1F57.0020.000B] -1D730 ; [.1F57.0020.000B] -1D76A ; [.1F57.0020.000B] -1D7A4 ; [.1F57.0020.000B] -1F50 ; [.1F57.0020.0002][.0000.0022.0002] -1F54 ; [.1F57.0020.0002][.0000.0022.0002][.0000.0024.0002] -1F52 ; [.1F57.0020.0002][.0000.0022.0002][.0000.0025.0002] -1F56 ; [.1F57.0020.0002][.0000.0022.0002][.0000.002A.0002] -1F51 ; [.1F57.0020.0002][.0000.0023.0002] -1F59 ; [.1F57.0020.0008][.0000.0023.0002] -1F55 ; [.1F57.0020.0002][.0000.0023.0002][.0000.0024.0002] -1F5D ; [.1F57.0020.0008][.0000.0023.0002][.0000.0024.0002] -1F53 ; [.1F57.0020.0002][.0000.0023.0002][.0000.0025.0002] -1F5B ; [.1F57.0020.0008][.0000.0023.0002][.0000.0025.0002] -1F57 ; [.1F57.0020.0002][.0000.0023.0002][.0000.002A.0002] -1F5F ; [.1F57.0020.0008][.0000.0023.0002][.0000.002A.0002] -03CD ; [.1F57.0020.0002][.0000.0024.0002] -1F7B ; [.1F57.0020.0002][.0000.0024.0002] -038E ; [.1F57.0020.0008][.0000.0024.0002] -1FEB ; [.1F57.0020.0008][.0000.0024.0002] -03D3 ; [.1F57.0020.000A][.0000.0024.0002] -1F7A ; [.1F57.0020.0002][.0000.0025.0002] -1FEA ; [.1F57.0020.0008][.0000.0025.0002] -1FE0 ; [.1F57.0020.0002][.0000.0026.0002] -1FE8 ; [.1F57.0020.0008][.0000.0026.0002] -1FE6 ; [.1F57.0020.0002][.0000.002A.0002] -03CB ; [.1F57.0020.0002][.0000.002B.0002] -03AB ; [.1F57.0020.0008][.0000.002B.0002] -03D4 ; [.1F57.0020.000A][.0000.002B.0002] -03B0 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0024.0002] -1FE3 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0024.0002] -1FE2 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0025.0002] -1FE7 ; [.1F57.0020.0002][.0000.002B.0002][.0000.002A.0002] -1FE1 ; [.1F57.0020.0002][.0000.0032.0002] -1FE9 ; [.1F57.0020.0008][.0000.0032.0002] -03C6 ; [.1F58.0020.0002] -03D5 ; [.1F58.0020.0004] -1D6D7 ; [.1F58.0020.0005] -1D6DF ; [.1F58.0020.0005] -1D711 ; [.1F58.0020.0005] -1D719 ; [.1F58.0020.0005] -1D74B ; [.1F58.0020.0005] -1D753 ; [.1F58.0020.0005] -1D785 ; [.1F58.0020.0005] -1D78D ; [.1F58.0020.0005] -1D7BF ; [.1F58.0020.0005] -1D7C7 ; [.1F58.0020.0005] -03A6 ; [.1F58.0020.0008] -1D6BD ; [.1F58.0020.000B] -1D6F7 ; [.1F58.0020.000B] -1D731 ; [.1F58.0020.000B] -1D76B ; [.1F58.0020.000B] -1D7A5 ; [.1F58.0020.000B] -1D60 ; [.1F58.0020.0014] -1D69 ; [.1F58.0020.0015] -03C7 ; [.1F59.0020.0002] -1D6D8 ; [.1F59.0020.0005] -1D712 ; [.1F59.0020.0005] -1D74C ; [.1F59.0020.0005] -1D786 ; [.1F59.0020.0005] -1D7C0 ; [.1F59.0020.0005] -03A7 ; [.1F59.0020.0008] -1D6BE ; [.1F59.0020.000B] -1D6F8 ; [.1F59.0020.000B] -1D732 ; [.1F59.0020.000B] -1D76C ; [.1F59.0020.000B] -1D7A6 ; [.1F59.0020.000B] -1D61 ; [.1F59.0020.0014] -1D6A ; [.1F59.0020.0015] -03C8 ; [.1F5A.0020.0002] -1D6D9 ; [.1F5A.0020.0005] -1D713 ; [.1F5A.0020.0005] -1D74D ; [.1F5A.0020.0005] -1D787 ; [.1F5A.0020.0005] -1D7C1 ; [.1F5A.0020.0005] -03A8 ; [.1F5A.0020.0008] -1D6BF ; [.1F5A.0020.000B] -1D6F9 ; [.1F5A.0020.000B] -1D733 ; [.1F5A.0020.000B] -1D76D ; [.1F5A.0020.000B] -1D7A7 ; [.1F5A.0020.000B] -1D2A ; [.1F5B.0020.0002] -03C9 ; [.1F5C.0020.0002] -1D6DA ; [.1F5C.0020.0005] -1D714 ; [.1F5C.0020.0005] -1D74E ; [.1F5C.0020.0005] -1D788 ; [.1F5C.0020.0005] -1D7C2 ; [.1F5C.0020.0005] -03A9 ; [.1F5C.0020.0008] -2126 ; [.1F5C.0020.0008] -1D6C0 ; [.1F5C.0020.000B] -1D6FA ; [.1F5C.0020.000B] -1D734 ; [.1F5C.0020.000B] -1D76E ; [.1F5C.0020.000B] -1D7A8 ; [.1F5C.0020.000B] -1F60 ; [.1F5C.0020.0002][.0000.0022.0002] -1F68 ; [.1F5C.0020.0008][.0000.0022.0002] -1F64 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0024.0002] -1F6C ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0024.0002] -1FA4 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] -1FAC ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] -1F62 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0025.0002] -1F6A ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0025.0002] -1FA2 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] -1FAA ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] -1F66 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.002A.0002] -1F6E ; [.1F5C.0020.0008][.0000.0022.0002][.0000.002A.0002] -1FA6 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] -1FAE ; [.1F5C.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] -1FA0 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.004C.0002] -1FA8 ; [.1F5C.0020.0008][.0000.0022.0002][.0000.004C.0002] -1F61 ; [.1F5C.0020.0002][.0000.0023.0002] -1F69 ; [.1F5C.0020.0008][.0000.0023.0002] -1F65 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0024.0002] -1F6D ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0024.0002] -1FA5 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] -1FAD ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] -1F63 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0025.0002] -1F6B ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0025.0002] -1FA3 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] -1FAB ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] -1F67 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.002A.0002] -1F6F ; [.1F5C.0020.0008][.0000.0023.0002][.0000.002A.0002] -1FA7 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] -1FAF ; [.1F5C.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] -1FA1 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.004C.0002] -1FA9 ; [.1F5C.0020.0008][.0000.0023.0002][.0000.004C.0002] -03CE ; [.1F5C.0020.0002][.0000.0024.0002] -1F7D ; [.1F5C.0020.0002][.0000.0024.0002] -038F ; [.1F5C.0020.0008][.0000.0024.0002] -1FFB ; [.1F5C.0020.0008][.0000.0024.0002] -1FF4 ; [.1F5C.0020.0002][.0000.0024.0002][.0000.004C.0002] -1F7C ; [.1F5C.0020.0002][.0000.0025.0002] -1FFA ; [.1F5C.0020.0008][.0000.0025.0002] -1FF2 ; [.1F5C.0020.0002][.0000.0025.0002][.0000.004C.0002] -1FF6 ; [.1F5C.0020.0002][.0000.002A.0002] -1FF7 ; [.1F5C.0020.0002][.0000.002A.0002][.0000.004C.0002] -1FF3 ; [.1F5C.0020.0002][.0000.004C.0002] -1FFC ; [.1F5C.0020.0008][.0000.004C.0002] -AB65 ; [.1F5D.0020.0002] -03E1 ; [.1F5E.0020.0002] -03E0 ; [.1F5E.0020.0008] -0373 ; [.1F5F.0020.0002] -0372 ; [.1F5F.0020.0008] -03F8 ; [.1F60.0020.0002] -03F7 ; [.1F60.0020.0008] -2C81 ; [.1F61.0020.0002] -2C80 ; [.1F61.0020.0008] -2C83 ; [.1F62.0020.0002] -2C82 ; [.1F62.0020.0008] -2C85 ; [.1F63.0020.0002] -2C84 ; [.1F63.0020.0008] -2C87 ; [.1F64.0020.0002] -2C86 ; [.1F64.0020.0008] -2C89 ; [.1F65.0020.0002] -2C88 ; [.1F65.0020.0008] -2CB7 ; [.1F66.0020.0002] -2CB6 ; [.1F66.0020.0008] -2C8B ; [.1F67.0020.0002] -2C8A ; [.1F67.0020.0008] -2C8D ; [.1F68.0020.0002] -2C8C ; [.1F68.0020.0008] -2C8F ; [.1F69.0020.0002] -2C8E ; [.1F69.0020.0008] -2C91 ; [.1F6A.0020.0002] -2C90 ; [.1F6A.0020.0008] -2C93 ; [.1F6B.0020.0002] -2C92 ; [.1F6B.0020.0008] -2C95 ; [.1F6C.0020.0002] -2C94 ; [.1F6C.0020.0008] -2CE4 ; [.1F6C.0020.0004][.1F61.0020.0004][.1F6B.0020.0004] -2CB9 ; [.1F6D.0020.0002] -2CB8 ; [.1F6D.0020.0008] -2C97 ; [.1F6E.0020.0002] -2C96 ; [.1F6E.0020.0008] -2C99 ; [.1F6F.0020.0002] -2C98 ; [.1F6F.0020.0008] -2C9B ; [.1F70.0020.0002] -2C9A ; [.1F70.0020.0008] -2CBB ; [.1F71.0020.0002] -2CBA ; [.1F71.0020.0008] -2CBD ; [.1F72.0020.0002] -2CBC ; [.1F72.0020.0008] -2C9D ; [.1F73.0020.0002] -2C9C ; [.1F73.0020.0008] -2C9F ; [.1F74.0020.0002] -2C9E ; [.1F74.0020.0008] -2CA1 ; [.1F75.0020.0002] -2CA0 ; [.1F75.0020.0008] -2CA3 ; [.1F76.0020.0002] -2CA2 ; [.1F76.0020.0008] -2CA5 ; [.1F77.0020.0002] -2CA4 ; [.1F77.0020.0008] -2CA7 ; [.1F78.0020.0002] -2CA6 ; [.1F78.0020.0008] -2CA9 ; [.1F79.0020.0002] -2CA8 ; [.1F79.0020.0008] -2CAB ; [.1F7A.0020.0002] -2CAA ; [.1F7A.0020.0008] -2CAD ; [.1F7B.0020.0002] -2CAC ; [.1F7B.0020.0008] -2CAF ; [.1F7C.0020.0002] -2CAE ; [.1F7C.0020.0008] -2CB1 ; [.1F7D.0020.0002] -2CB0 ; [.1F7D.0020.0008] -2CBF ; [.1F7E.0020.0002] -2CBE ; [.1F7E.0020.0008] -2CC1 ; [.1F7F.0020.0002] -2CC0 ; [.1F7F.0020.0008] -03E3 ; [.1F80.0020.0002] -03E2 ; [.1F80.0020.0008] -2CEC ; [.1F81.0020.0002] -2CEB ; [.1F81.0020.0008] -2CC3 ; [.1F82.0020.0002] -2CC2 ; [.1F82.0020.0008] -2CC5 ; [.1F83.0020.0002] -2CC4 ; [.1F83.0020.0008] -2CC7 ; [.1F84.0020.0002] -2CC6 ; [.1F84.0020.0008] -03E5 ; [.1F85.0020.0002] -03E4 ; [.1F85.0020.0008] -03E7 ; [.1F86.0020.0002] -03E6 ; [.1F86.0020.0008] -2CF3 ; [.1F87.0020.0002] -2CF2 ; [.1F87.0020.0008] -2CC9 ; [.1F88.0020.0002] -2CC8 ; [.1F88.0020.0008] -03E9 ; [.1F89.0020.0002] -03E8 ; [.1F89.0020.0008] -2CCB ; [.1F8A.0020.0002] -2CCA ; [.1F8A.0020.0008] -2CCD ; [.1F8B.0020.0002] -2CCC ; [.1F8B.0020.0008] -2CCF ; [.1F8C.0020.0002] -2CCE ; [.1F8C.0020.0008] -2CD1 ; [.1F8D.0020.0002] -2CD0 ; [.1F8D.0020.0008] -2CD3 ; [.1F8E.0020.0002] -2CD2 ; [.1F8E.0020.0008] -2CD5 ; [.1F8F.0020.0002] -2CD4 ; [.1F8F.0020.0008] -03EB ; [.1F90.0020.0002] -03EA ; [.1F90.0020.0008] -2CEE ; [.1F91.0020.0002] -2CED ; [.1F91.0020.0008] -2CD7 ; [.1F92.0020.0002] -2CD6 ; [.1F92.0020.0008] -03ED ; [.1F93.0020.0002] -03EC ; [.1F93.0020.0008] -2CD9 ; [.1F94.0020.0002] -2CD8 ; [.1F94.0020.0008] -2CDB ; [.1F95.0020.0002] -2CDA ; [.1F95.0020.0008] -2CDD ; [.1F96.0020.0002] -2CDC ; [.1F96.0020.0008] -03EF ; [.1F97.0020.0002] -03EE ; [.1F97.0020.0008] -2CB3 ; [.1F98.0020.0002] -2CB2 ; [.1F98.0020.0008] -2CB5 ; [.1F99.0020.0002] -2CB4 ; [.1F99.0020.0008] -2CDF ; [.1F9A.0020.0002] -2CDE ; [.1F9A.0020.0008] -2CE1 ; [.1F9B.0020.0002] -2CE0 ; [.1F9B.0020.0008] -2CE3 ; [.1F9C.0020.0002] -2CE2 ; [.1F9C.0020.0008] -0430 ; [.1F9D.0020.0002] -2DF6 ; [.1F9D.0020.0004] -0410 ; [.1F9D.0020.0008] -04D1 ; [.1F9D.0020.0002][.0000.0026.0002] -04D0 ; [.1F9D.0020.0008][.0000.0026.0002] -04D3 ; [.1F9D.0020.0002][.0000.002B.0002] -04D2 ; [.1F9D.0020.0008][.0000.002B.0002] -04D9 ; [.1FA1.0020.0002] -04D8 ; [.1FA1.0020.0008] -04DB ; [.1FA1.0020.0002][.0000.002B.0002] -04DA ; [.1FA1.0020.0008][.0000.002B.0002] -04D5 ; [.1FA5.0020.0002] -04D4 ; [.1FA5.0020.0008] -0431 ; [.1FA9.0020.0002] -2DE0 ; [.1FA9.0020.0004] -0411 ; [.1FA9.0020.0008] -0432 ; [.1FAD.0020.0002] -2DE1 ; [.1FAD.0020.0004] -0412 ; [.1FAD.0020.0008] -0433 ; [.1FB1.0020.0002] -2DE2 ; [.1FB1.0020.0004] -0413 ; [.1FB1.0020.0008] -0453 ; [.1FB1.0020.0002][.0000.0024.0002] -0403 ; [.1FB1.0020.0008][.0000.0024.0002] -0491 ; [.1FB1.0020.0004][.0000.010C.0004] -0490 ; [.1FB1.0020.000A][.0000.010C.0004] -0493 ; [.1FB5.0020.0002] -0492 ; [.1FB5.0020.0008] -04FB ; [.1FB9.0020.0002] -04FA ; [.1FB9.0020.0008] -0495 ; [.1FBD.0020.0002] -0494 ; [.1FBD.0020.0008] -04F7 ; [.1FC1.0020.0002] -04F6 ; [.1FC1.0020.0008] -0434 ; [.1FC5.0020.0002] -2DE3 ; [.1FC5.0020.0004] -0414 ; [.1FC5.0020.0008] -0501 ; [.1FC9.0020.0002] -0500 ; [.1FC9.0020.0008] -A681 ; [.1FCA.0020.0002] -A680 ; [.1FCA.0020.0008] -0452 ; [.1FCB.0020.0002] -0402 ; [.1FCB.0020.0008] -A663 ; [.1FCF.0020.0002] -A662 ; [.1FCF.0020.0008] -0503 ; [.1FD0.0020.0002] -0502 ; [.1FD0.0020.0008] -0499 ; [.1FD1.0020.0002] -0498 ; [.1FD1.0020.0008] -0435 ; [.1FD5.0020.0002] -2DF7 ; [.1FD5.0020.0004] -0415 ; [.1FD5.0020.0008] -0450 ; [.1FD5.0020.0002][.0000.0025.0002] -0400 ; [.1FD5.0020.0008][.0000.0025.0002] -04D7 ; [.1FD5.0020.0002][.0000.0026.0002] -04D6 ; [.1FD5.0020.0008][.0000.0026.0002] -0451 ; [.1FD5.0020.0002][.0000.002B.0002] -0401 ; [.1FD5.0020.0008][.0000.002B.0002] -0454 ; [.1FD9.0020.0002] -A674 ; [.1FD9.0020.0004] -0404 ; [.1FD9.0020.0008] -0436 ; [.1FDD.0020.0002] -2DE4 ; [.1FDD.0020.0004] -0416 ; [.1FDD.0020.0008] -04C2 ; [.1FDD.0020.0002][.0000.0026.0002] -04C1 ; [.1FDD.0020.0008][.0000.0026.0002] -04DD ; [.1FDD.0020.0002][.0000.002B.0002] -04DC ; [.1FDD.0020.0008][.0000.002B.0002] -052B ; [.1FE1.0020.0002] -052A ; [.1FE1.0020.0008] -A685 ; [.1FE2.0020.0002] -A684 ; [.1FE2.0020.0008] -0497 ; [.1FE3.0020.0002] -0496 ; [.1FE3.0020.0008] -0437 ; [.1FE7.0020.0002] -2DE5 ; [.1FE7.0020.0004] -0417 ; [.1FE7.0020.0008] -04DF ; [.1FE7.0020.0002][.0000.002B.0002] -04DE ; [.1FE7.0020.0008][.0000.002B.0002] -A641 ; [.1FEB.0020.0002] -A640 ; [.1FEB.0020.0008] -0505 ; [.1FEC.0020.0002] -0504 ; [.1FEC.0020.0008] -0511 ; [.1FED.0020.0002] -0510 ; [.1FED.0020.0008] -A643 ; [.1FEE.0020.0002] -A642 ; [.1FEE.0020.0008] -0455 ; [.1FEF.0020.0002] -0405 ; [.1FEF.0020.0008] -A645 ; [.1FF3.0020.0002] -A644 ; [.1FF3.0020.0008] -04E1 ; [.1FF4.0020.0002] -04E0 ; [.1FF4.0020.0008] -A689 ; [.1FF8.0020.0002] -A688 ; [.1FF8.0020.0008] -0507 ; [.1FF9.0020.0002] -0506 ; [.1FF9.0020.0008] -A683 ; [.1FFA.0020.0002] -A682 ; [.1FFA.0020.0008] -0438 ; [.1FFB.0020.0002] -A675 ; [.1FFB.0020.0004] -0418 ; [.1FFB.0020.0008] -045D ; [.1FFB.0020.0002][.0000.0025.0002] -040D ; [.1FFB.0020.0008][.0000.0025.0002] -04E5 ; [.1FFB.0020.0002][.0000.002B.0002] -04E4 ; [.1FFB.0020.0008][.0000.002B.0002] -04E3 ; [.1FFB.0020.0002][.0000.0032.0002] -04E2 ; [.1FFB.0020.0008][.0000.0032.0002] -048B ; [.1FFF.0020.0002] -048A ; [.1FFF.0020.0008] -0456 ; [.2003.0020.0002] -0406 ; [.2003.0020.0008] -0457 ; [.2003.0020.0002][.0000.002B.0002] -A676 ; [.2003.0020.0004][.0000.002B.0004] -0407 ; [.2003.0020.0008][.0000.002B.0002] -A647 ; [.2007.0020.0002] -A646 ; [.2007.0020.0008] -0439 ; [.2008.0020.0002] -0438 0306 ; [.2008.0020.0002] -0419 ; [.2008.0020.0008] -0418 0306 ; [.2008.0020.0008] -0458 ; [.200C.0020.0002] -0408 ; [.200C.0020.0008] -A649 ; [.2010.0020.0002] -2DF8 ; [.2010.0020.0004] -A648 ; [.2010.0020.0008] -043A ; [.2011.0020.0002] -2DE6 ; [.2011.0020.0004] -041A ; [.2011.0020.0008] -045C ; [.2011.0020.0002][.0000.0024.0002] -040C ; [.2011.0020.0008][.0000.0024.0002] -049B ; [.2015.0020.0002] -049A ; [.2015.0020.0008] -04C4 ; [.2019.0020.0002] -04C3 ; [.2019.0020.0008] -04A1 ; [.201D.0020.0002] -04A0 ; [.201D.0020.0008] -049F ; [.2021.0020.0002] -049E ; [.2021.0020.0008] -049D ; [.2025.0020.0002] -049C ; [.2025.0020.0008] -051F ; [.2029.0020.0002] -051E ; [.2029.0020.0008] -051B ; [.202A.0020.0002] -051A ; [.202A.0020.0008] -043B ; [.202B.0020.0002] -2DE7 ; [.202B.0020.0004] -041B ; [.202B.0020.0008] -1D2B ; [.202F.0020.0002] -04C6 ; [.2030.0020.0002] -04C5 ; [.2030.0020.0008] -052F ; [.2034.0020.0002] -052E ; [.2034.0020.0008] -0513 ; [.2035.0020.0002] -0512 ; [.2035.0020.0008] -0521 ; [.2036.0020.0002] -0520 ; [.2036.0020.0008] -0459 ; [.2037.0020.0002] -0409 ; [.2037.0020.0008] -A665 ; [.203B.0020.0002] -A664 ; [.203B.0020.0008] -0509 ; [.203C.0020.0002] -0508 ; [.203C.0020.0008] -0515 ; [.203D.0020.0002] -0514 ; [.203D.0020.0008] -043C ; [.203E.0020.0002] -2DE8 ; [.203E.0020.0004] -041C ; [.203E.0020.0008] -04CE ; [.2042.0020.0002] -04CD ; [.2042.0020.0008] -A667 ; [.2046.0020.0002] -A666 ; [.2046.0020.0008] -043D ; [.2047.0020.0002] -2DE9 ; [.2047.0020.0004] -041D ; [.2047.0020.0008] -1D78 ; [.2047.0020.0014] -0529 ; [.204B.0020.0002] -0528 ; [.204B.0020.0008] -04CA ; [.204C.0020.0002] -04C9 ; [.204C.0020.0008] -04A3 ; [.2050.0020.0002] -04A2 ; [.2050.0020.0008] -04C8 ; [.2054.0020.0002] -04C7 ; [.2054.0020.0008] -0523 ; [.2058.0020.0002] -0522 ; [.2058.0020.0008] -04A5 ; [.2059.0020.0002] -04A4 ; [.2059.0020.0008] -045A ; [.205D.0020.0002] -040A ; [.205D.0020.0008] -050B ; [.2061.0020.0002] -050A ; [.2061.0020.0008] -043E ; [.2062.0020.0002] -2DEA ; [.2062.0020.0004] -A669 ; [.2062.0020.0004] -A66B ; [.2062.0020.0004] -A66D ; [.2062.0020.0004] -A66E ; [.2062.0020.0004] -A699 ; [.2062.0020.0004] -A69B ; [.2062.0020.0004] -041E ; [.2062.0020.0008] -A668 ; [.2062.0020.000A] -A66A ; [.2062.0020.000A] -A66C ; [.2062.0020.000A] -A698 ; [.2062.0020.000A] -A69A ; [.2062.0020.000A] -04E7 ; [.2062.0020.0002][.0000.002B.0002] -04E6 ; [.2062.0020.0008][.0000.002B.0002] -04E9 ; [.2066.0020.0002] -04E8 ; [.2066.0020.0008] -04EB ; [.2066.0020.0002][.0000.002B.0002] -04EA ; [.2066.0020.0008][.0000.002B.0002] -043F ; [.206A.0020.0002] -2DEB ; [.206A.0020.0004] -041F ; [.206A.0020.0008] -0525 ; [.206E.0020.0002] -0524 ; [.206E.0020.0008] -04A7 ; [.206F.0020.0002] -04A6 ; [.206F.0020.0008] -0481 ; [.2073.0020.0002] -0480 ; [.2073.0020.0008] -0440 ; [.2077.0020.0002] -2DEC ; [.2077.0020.0004] -0420 ; [.2077.0020.0008] -048F ; [.207B.0020.0002] -048E ; [.207B.0020.0008] -0517 ; [.207F.0020.0002] -0516 ; [.207F.0020.0008] -0441 ; [.2080.0020.0002] -2DED ; [.2080.0020.0004] -0421 ; [.2080.0020.0008] -2DF5 ; [.2080.0020.0004][.2089.0020.0004] -050D ; [.2084.0020.0002] -050C ; [.2084.0020.0008] -04AB ; [.2085.0020.0002] -04AA ; [.2085.0020.0008] -0442 ; [.2089.0020.0002] -2DEE ; [.2089.0020.0004] -0422 ; [.2089.0020.0008] -A68D ; [.208D.0020.0002] -A68C ; [.208D.0020.0008] -050F ; [.208E.0020.0002] -050E ; [.208E.0020.0008] -04AD ; [.208F.0020.0002] -04AC ; [.208F.0020.0008] -A68B ; [.2093.0020.0002] -A68A ; [.2093.0020.0008] -045B ; [.2094.0020.0002] -040B ; [.2094.0020.0008] -0443 ; [.2098.0020.0002] -A677 ; [.2098.0020.0004] -0423 ; [.2098.0020.0008] -045E ; [.2098.0020.0002][.0000.0026.0002] -040E ; [.2098.0020.0008][.0000.0026.0002] -04F1 ; [.2098.0020.0002][.0000.002B.0002] -04F0 ; [.2098.0020.0008][.0000.002B.0002] -04F3 ; [.2098.0020.0002][.0000.002C.0002] -04F2 ; [.2098.0020.0008][.0000.002C.0002] -04EF ; [.2098.0020.0002][.0000.0032.0002] -04EE ; [.2098.0020.0008][.0000.0032.0002] -04AF ; [.209C.0020.0002] -04AE ; [.209C.0020.0008] -04B1 ; [.20A0.0020.0002] -04B0 ; [.20A0.0020.0008] -A64B ; [.20A4.0020.0002] -2DF9 ; [.20A4.0020.0004] -A64A ; [.20A4.0020.0008] -0479 ; [.20A5.0020.0002] -0478 ; [.20A5.0020.0008] -0444 ; [.20A9.0020.0002] -A69E ; [.20A9.0020.0004] -0424 ; [.20A9.0020.0008] -0445 ; [.20AD.0020.0002] -2DEF ; [.20AD.0020.0004] -0425 ; [.20AD.0020.0008] -04FD ; [.20B1.0020.0002] -04FC ; [.20B1.0020.0008] -04FF ; [.20B5.0020.0002] -04FE ; [.20B5.0020.0008] -04B3 ; [.20B9.0020.0002] -04B2 ; [.20B9.0020.0008] -04BB ; [.20BD.0020.0002] -04BA ; [.20BD.0020.0008] -0527 ; [.20C1.0020.0002] -0526 ; [.20C1.0020.0008] -A695 ; [.20C2.0020.0002] -A694 ; [.20C2.0020.0008] -0461 ; [.20C3.0020.0002] -A67B ; [.20C3.0020.0004] -0460 ; [.20C3.0020.0008] -047F ; [.20C7.0020.0002] -047E ; [.20C7.0020.0008] -A64D ; [.20CB.0020.0002] -A64C ; [.20CB.0020.0008] -047D ; [.20CC.0020.0002] -047C ; [.20CC.0020.0008] -047B ; [.20D0.0020.0002] -047A ; [.20D0.0020.0008] -0446 ; [.20D4.0020.0002] -2DF0 ; [.20D4.0020.0004] -0426 ; [.20D4.0020.0008] -A661 ; [.20D8.0020.0002] -A660 ; [.20D8.0020.0008] -A68F ; [.20D9.0020.0002] -A68E ; [.20D9.0020.0008] -04B5 ; [.20DA.0020.0002] -04B4 ; [.20DA.0020.0008] -A691 ; [.20DE.0020.0002] -A690 ; [.20DE.0020.0008] -0447 ; [.20DF.0020.0002] -2DF1 ; [.20DF.0020.0004] -0427 ; [.20DF.0020.0008] -04F5 ; [.20DF.0020.0002][.0000.002B.0002] -04F4 ; [.20DF.0020.0008][.0000.002B.0002] -052D ; [.20E3.0020.0002] -052C ; [.20E3.0020.0008] -A693 ; [.20E4.0020.0002] -A692 ; [.20E4.0020.0008] -04B7 ; [.20E5.0020.0002] -04B6 ; [.20E5.0020.0008] -04CC ; [.20E9.0020.0002] -04CB ; [.20E9.0020.0008] -04B9 ; [.20ED.0020.0002] -04B8 ; [.20ED.0020.0008] -A687 ; [.20F1.0020.0002] -A686 ; [.20F1.0020.0008] -04BD ; [.20F2.0020.0002] -04BC ; [.20F2.0020.0008] -04BF ; [.20F6.0020.0002] -04BE ; [.20F6.0020.0008] -045F ; [.20FA.0020.0002] -040F ; [.20FA.0020.0008] -0448 ; [.20FE.0020.0002] -2DF2 ; [.20FE.0020.0004] -0428 ; [.20FE.0020.0008] -A697 ; [.2102.0020.0002] -A696 ; [.2102.0020.0008] -0449 ; [.2103.0020.0002] -2DF3 ; [.2103.0020.0004] -0429 ; [.2103.0020.0008] -A64F ; [.2107.0020.0002] -A64E ; [.2107.0020.0008] -2E2F ; [.2108.0020.0002] -A67F ; [.2109.0020.0002] -044A ; [.210A.0020.0002] -A678 ; [.210A.0020.0004] -042A ; [.210A.0020.0008] -A69C ; [.210A.0020.0014] -A651 ; [.210E.0020.0002] -A650 ; [.210E.0020.0008] -044B ; [.210F.0020.0002] -A679 ; [.210F.0020.0004] -042B ; [.210F.0020.0008] -04F9 ; [.210F.0020.0002][.0000.002B.0002] -04F8 ; [.210F.0020.0008][.0000.002B.0002] -044C ; [.2113.0020.0002] -A67A ; [.2113.0020.0004] -042C ; [.2113.0020.0008] -A69D ; [.2113.0020.0014] -048D ; [.2117.0020.0002] -048C ; [.2117.0020.0008] -0463 ; [.211B.0020.0002] -2DFA ; [.211B.0020.0004] -0462 ; [.211B.0020.0008] -A653 ; [.211F.0020.0002] -A652 ; [.211F.0020.0008] -044D ; [.2120.0020.0002] -042D ; [.2120.0020.0008] -04ED ; [.2120.0020.0002][.0000.002B.0002] -04EC ; [.2120.0020.0008][.0000.002B.0002] -044E ; [.2124.0020.0002] -2DFB ; [.2124.0020.0004] -042E ; [.2124.0020.0008] -A655 ; [.2128.0020.0002] -A654 ; [.2128.0020.0008] -A657 ; [.2129.0020.0002] -2DFC ; [.2129.0020.0004] -A656 ; [.2129.0020.0008] -044F ; [.212A.0020.0002] -042F ; [.212A.0020.0008] -0519 ; [.212E.0020.0002] -0518 ; [.212E.0020.0008] -0465 ; [.212F.0020.0002] -A69F ; [.212F.0020.0004] -0464 ; [.212F.0020.0008] -0467 ; [.2133.0020.0002] -2DFD ; [.2133.0020.0004] -0466 ; [.2133.0020.0008] -A659 ; [.2137.0020.0002] -A658 ; [.2137.0020.0008] -046B ; [.2138.0020.0002] -2DFE ; [.2138.0020.0004] -046A ; [.2138.0020.0008] -A65B ; [.213C.0020.0002] -A65A ; [.213C.0020.0008] -0469 ; [.213D.0020.0002] -0468 ; [.213D.0020.0008] -A65D ; [.2141.0020.0002] -A65C ; [.2141.0020.0008] -046D ; [.2142.0020.0002] -2DFF ; [.2142.0020.0004] -046C ; [.2142.0020.0008] -046F ; [.2146.0020.0002] -046E ; [.2146.0020.0008] -0471 ; [.214A.0020.0002] -0470 ; [.214A.0020.0008] -0473 ; [.214E.0020.0002] -2DF4 ; [.214E.0020.0004] -0472 ; [.214E.0020.0008] -0475 ; [.2152.0020.0002] -0474 ; [.2152.0020.0008] -0477 ; [.2152.0020.0002][.0000.003C.0002] -0476 ; [.2152.0020.0008][.0000.003C.0002] -A65F ; [.2156.0020.0002] -A65E ; [.2156.0020.0008] -04A9 ; [.2157.0020.0002] -04A8 ; [.2157.0020.0008] -051D ; [.215B.0020.0002] -051C ; [.215B.0020.0008] -04CF ; [.215C.0020.0002] -04C0 ; [.215C.0020.0008] -2C30 ; [.2160.0020.0002] -2C00 ; [.2160.0020.0008] -2C31 ; [.2161.0020.0002] -2C01 ; [.2161.0020.0008] -2C32 ; [.2162.0020.0002] -2C02 ; [.2162.0020.0008] -2C33 ; [.2163.0020.0002] -2C03 ; [.2163.0020.0008] -2C34 ; [.2164.0020.0002] -2C04 ; [.2164.0020.0008] -2C35 ; [.2165.0020.0002] -2C05 ; [.2165.0020.0008] -2C36 ; [.2166.0020.0002] -2C06 ; [.2166.0020.0008] -2C37 ; [.2167.0020.0002] -2C07 ; [.2167.0020.0008] -2C38 ; [.2168.0020.0002] -2C08 ; [.2168.0020.0008] -2C39 ; [.2169.0020.0002] -2C09 ; [.2169.0020.0008] -2C3A ; [.216A.0020.0002] -2C0A ; [.216A.0020.0008] -2C3B ; [.216B.0020.0002] -2C0B ; [.216B.0020.0008] -2C3C ; [.216C.0020.0002] -2C0C ; [.216C.0020.0008] -2C3D ; [.216D.0020.0002] -2C0D ; [.216D.0020.0008] -2C3E ; [.216E.0020.0002] -2C0E ; [.216E.0020.0008] -2C3F ; [.216F.0020.0002] -2C0F ; [.216F.0020.0008] -2C40 ; [.2170.0020.0002] -2C10 ; [.2170.0020.0008] -2C41 ; [.2171.0020.0002] -2C11 ; [.2171.0020.0008] -2C42 ; [.2172.0020.0002] -2C12 ; [.2172.0020.0008] -2C43 ; [.2173.0020.0002] -2C13 ; [.2173.0020.0008] -2C44 ; [.2174.0020.0002] -2C14 ; [.2174.0020.0008] -2C45 ; [.2175.0020.0002] -2C15 ; [.2175.0020.0008] -2C46 ; [.2176.0020.0002] -2C16 ; [.2176.0020.0008] -2C47 ; [.2177.0020.0002] -2C17 ; [.2177.0020.0008] -2C48 ; [.2178.0020.0002] -2C18 ; [.2178.0020.0008] -2C49 ; [.2179.0020.0002] -2C19 ; [.2179.0020.0008] -2C4A ; [.217A.0020.0002] -2C1A ; [.217A.0020.0008] -2C4B ; [.217B.0020.0002] -2C1B ; [.217B.0020.0008] -2C4C ; [.217C.0020.0002] -2C1C ; [.217C.0020.0008] -2C4D ; [.217D.0020.0002] -2C1D ; [.217D.0020.0008] -2C4E ; [.217E.0020.0002] -2C1E ; [.217E.0020.0008] -2C4F ; [.217F.0020.0002] -2C1F ; [.217F.0020.0008] -2C50 ; [.2180.0020.0002] -2C20 ; [.2180.0020.0008] -2C51 ; [.2181.0020.0002] -2C21 ; [.2181.0020.0008] -2C52 ; [.2182.0020.0002] -2C22 ; [.2182.0020.0008] -2C53 ; [.2183.0020.0002] -2C23 ; [.2183.0020.0008] -2C54 ; [.2184.0020.0002] -2C24 ; [.2184.0020.0008] -2C55 ; [.2185.0020.0002] -2C25 ; [.2185.0020.0008] -2C56 ; [.2186.0020.0002] -2C26 ; [.2186.0020.0008] -2C57 ; [.2187.0020.0002] -2C27 ; [.2187.0020.0008] -2C58 ; [.2188.0020.0002] -2C28 ; [.2188.0020.0008] -2C59 ; [.2189.0020.0002] -2C29 ; [.2189.0020.0008] -2C5A ; [.218A.0020.0002] -2C2A ; [.218A.0020.0008] -2C5B ; [.218B.0020.0002] -2C2B ; [.218B.0020.0008] -2C5C ; [.218C.0020.0002] -2C2C ; [.218C.0020.0008] -2C5D ; [.218D.0020.0002] -2C2D ; [.218D.0020.0008] -2C5E ; [.218E.0020.0002] -2C2E ; [.218E.0020.0008] -10350 ; [.218F.0020.0002] -10376 ; [.218F.0020.0004] -10351 ; [.2190.0020.0002] -10352 ; [.2191.0020.0002] -10353 ; [.2192.0020.0002] -10377 ; [.2192.0020.0004] -10354 ; [.2193.0020.0002] -10355 ; [.2194.0020.0002] -10356 ; [.2195.0020.0002] -10357 ; [.2196.0020.0002] -10378 ; [.2196.0020.0004] -10358 ; [.2197.0020.0002] -10359 ; [.2198.0020.0002] -1035A ; [.2199.0020.0002] -1035B ; [.219A.0020.0002] -1035C ; [.219B.0020.0002] -1035D ; [.219C.0020.0002] -10379 ; [.219C.0020.0004] -1035E ; [.219D.0020.0002] -1035F ; [.219E.0020.0002] -10360 ; [.219F.0020.0002] -10361 ; [.21A0.0020.0002] -1037A ; [.21A0.0020.0004] -10362 ; [.21A1.0020.0002] -10363 ; [.21A2.0020.0002] -10364 ; [.21A3.0020.0002] -10365 ; [.21A4.0020.0002] -10366 ; [.21A5.0020.0002] -10367 ; [.21A6.0020.0002] -10368 ; [.21A7.0020.0002] -10369 ; [.21A8.0020.0002] -1036A ; [.21A9.0020.0002] -1036B ; [.21AA.0020.0002] -1036C ; [.21AB.0020.0002] -1036D ; [.21AC.0020.0002] -1036E ; [.21AD.0020.0002] -1036F ; [.21AE.0020.0002] -10370 ; [.21AF.0020.0002] -10371 ; [.21B0.0020.0002] -10372 ; [.21B1.0020.0002] -10373 ; [.21B2.0020.0002] -10374 ; [.21B3.0020.0002] -10375 ; [.21B4.0020.0002] -10D0 ; [.21B5.0020.0002] -2D00 ; [.21B6.0020.0002] -10A0 ; [.21B6.0020.0008] -10D1 ; [.21B7.0020.0002] -2D01 ; [.21B8.0020.0002] -10A1 ; [.21B8.0020.0008] -10D2 ; [.21B9.0020.0002] -2D02 ; [.21BA.0020.0002] -10A2 ; [.21BA.0020.0008] -10D3 ; [.21BB.0020.0002] -2D03 ; [.21BC.0020.0002] -10A3 ; [.21BC.0020.0008] -10D4 ; [.21BD.0020.0002] -2D04 ; [.21BE.0020.0002] -10A4 ; [.21BE.0020.0008] -10D5 ; [.21BF.0020.0002] -2D05 ; [.21C0.0020.0002] -10A5 ; [.21C0.0020.0008] -10D6 ; [.21C1.0020.0002] -2D06 ; [.21C2.0020.0002] -10A6 ; [.21C2.0020.0008] -10F1 ; [.21C3.0020.0002] -2D21 ; [.21C4.0020.0002] -10C1 ; [.21C4.0020.0008] -10D7 ; [.21C5.0020.0002] -2D07 ; [.21C6.0020.0002] -10A7 ; [.21C6.0020.0008] -10D8 ; [.21C7.0020.0002] -2D08 ; [.21C8.0020.0002] -10A8 ; [.21C8.0020.0008] -10D9 ; [.21C9.0020.0002] -2D09 ; [.21CA.0020.0002] -10A9 ; [.21CA.0020.0008] -10DA ; [.21CB.0020.0002] -2D0A ; [.21CC.0020.0002] -10AA ; [.21CC.0020.0008] -10DB ; [.21CD.0020.0002] -2D0B ; [.21CE.0020.0002] -10AB ; [.21CE.0020.0008] -10DC ; [.21CF.0020.0002] -10FC ; [.21CF.0020.0014] -2D0C ; [.21D0.0020.0002] -10AC ; [.21D0.0020.0008] -10F2 ; [.21D1.0020.0002] -2D22 ; [.21D2.0020.0002] -10C2 ; [.21D2.0020.0008] -10DD ; [.21D3.0020.0002] -2D0D ; [.21D4.0020.0002] -10AD ; [.21D4.0020.0008] -10DE ; [.21D5.0020.0002] -2D0E ; [.21D6.0020.0002] -10AE ; [.21D6.0020.0008] -10DF ; [.21D7.0020.0002] -2D0F ; [.21D8.0020.0002] -10AF ; [.21D8.0020.0008] -10E0 ; [.21D9.0020.0002] -2D10 ; [.21DA.0020.0002] -10B0 ; [.21DA.0020.0008] -10E1 ; [.21DB.0020.0002] -2D11 ; [.21DC.0020.0002] -10B1 ; [.21DC.0020.0008] -10E2 ; [.21DD.0020.0002] -2D12 ; [.21DE.0020.0002] -10B2 ; [.21DE.0020.0008] -10F3 ; [.21DF.0020.0002] -2D23 ; [.21E0.0020.0002] -10C3 ; [.21E0.0020.0008] -10E3 ; [.21E1.0020.0002] -2D13 ; [.21E2.0020.0002] -10B3 ; [.21E2.0020.0008] -10E4 ; [.21E3.0020.0002] -2D14 ; [.21E4.0020.0002] -10B4 ; [.21E4.0020.0008] -10E5 ; [.21E5.0020.0002] -2D15 ; [.21E6.0020.0002] -10B5 ; [.21E6.0020.0008] -10E6 ; [.21E7.0020.0002] -2D16 ; [.21E8.0020.0002] -10B6 ; [.21E8.0020.0008] -10E7 ; [.21E9.0020.0002] -2D17 ; [.21EA.0020.0002] -10B7 ; [.21EA.0020.0008] -10E8 ; [.21EB.0020.0002] -2D18 ; [.21EC.0020.0002] -10B8 ; [.21EC.0020.0008] -10E9 ; [.21ED.0020.0002] -2D19 ; [.21EE.0020.0002] -10B9 ; [.21EE.0020.0008] -10EA ; [.21EF.0020.0002] -2D1A ; [.21F0.0020.0002] -10BA ; [.21F0.0020.0008] -10EB ; [.21F1.0020.0002] -2D1B ; [.21F2.0020.0002] -10BB ; [.21F2.0020.0008] -10EC ; [.21F3.0020.0002] -2D1C ; [.21F4.0020.0002] -10BC ; [.21F4.0020.0008] -10ED ; [.21F5.0020.0002] -2D1D ; [.21F6.0020.0002] -10BD ; [.21F6.0020.0008] -10EE ; [.21F7.0020.0002] -2D1E ; [.21F8.0020.0002] -10BE ; [.21F8.0020.0008] -10F4 ; [.21F9.0020.0002] -2D24 ; [.21FA.0020.0002] -10C4 ; [.21FA.0020.0008] -10EF ; [.21FB.0020.0002] -2D1F ; [.21FC.0020.0002] -10BF ; [.21FC.0020.0008] -10F0 ; [.21FD.0020.0002] -2D20 ; [.21FE.0020.0002] -10C0 ; [.21FE.0020.0008] -10F5 ; [.21FF.0020.0002] -2D25 ; [.2200.0020.0002] -10C5 ; [.2200.0020.0008] -10F6 ; [.2201.0020.0002] -10F7 ; [.2202.0020.0002] -2D27 ; [.2203.0020.0002] -10C7 ; [.2203.0020.0008] -10F8 ; [.2204.0020.0002] -10F9 ; [.2205.0020.0002] -10FA ; [.2206.0020.0002] -10FD ; [.2207.0020.0002] -2D2D ; [.2208.0020.0002] -10CD ; [.2208.0020.0008] -10FE ; [.2209.0020.0002] -10FF ; [.220A.0020.0002] -0561 ; [.220B.0020.0002] -0531 ; [.220B.0020.0008] -0562 ; [.220C.0020.0002] -0532 ; [.220C.0020.0008] -0563 ; [.220D.0020.0002] -0533 ; [.220D.0020.0008] -0564 ; [.220E.0020.0002] -0534 ; [.220E.0020.0008] -0565 ; [.220F.0020.0002] -0535 ; [.220F.0020.0008] -0587 ; [.220F.0020.0004][.222C.0020.0004] -0566 ; [.2210.0020.0002] -0536 ; [.2210.0020.0008] -0567 ; [.2211.0020.0002] -0537 ; [.2211.0020.0008] -0568 ; [.2212.0020.0002] -0538 ; [.2212.0020.0008] -0569 ; [.2213.0020.0002] -0539 ; [.2213.0020.0008] -056A ; [.2214.0020.0002] -053A ; [.2214.0020.0008] -056B ; [.2215.0020.0002] -053B ; [.2215.0020.0008] -056C ; [.2216.0020.0002] -053C ; [.2216.0020.0008] -056D ; [.2217.0020.0002] -053D ; [.2217.0020.0008] -056E ; [.2218.0020.0002] -053E ; [.2218.0020.0008] -056F ; [.2219.0020.0002] -053F ; [.2219.0020.0008] -0570 ; [.221A.0020.0002] -0540 ; [.221A.0020.0008] -0571 ; [.221B.0020.0002] -0541 ; [.221B.0020.0008] -0572 ; [.221C.0020.0002] -0542 ; [.221C.0020.0008] -0573 ; [.221D.0020.0002] -0543 ; [.221D.0020.0008] -0574 ; [.221E.0020.0002] -0544 ; [.221E.0020.0008] -FB14 ; [.221E.0020.0004][.220F.0020.0004] -FB15 ; [.221E.0020.0004][.2215.0020.0004] -FB17 ; [.221E.0020.0004][.2217.0020.0004] -FB13 ; [.221E.0020.0004][.2220.0020.0004] -0575 ; [.221F.0020.0002] -0545 ; [.221F.0020.0008] -0576 ; [.2220.0020.0002] -0546 ; [.2220.0020.0008] -0577 ; [.2221.0020.0002] -0547 ; [.2221.0020.0008] -0578 ; [.2222.0020.0002] -0548 ; [.2222.0020.0008] -0579 ; [.2223.0020.0002] -0549 ; [.2223.0020.0008] -057A ; [.2224.0020.0002] -054A ; [.2224.0020.0008] -057B ; [.2225.0020.0002] -054B ; [.2225.0020.0008] -057C ; [.2226.0020.0002] -054C ; [.2226.0020.0008] -057D ; [.2227.0020.0002] -054D ; [.2227.0020.0008] -057E ; [.2228.0020.0002] -054E ; [.2228.0020.0008] -FB16 ; [.2228.0020.0004][.2220.0020.0004] -057F ; [.2229.0020.0002] -054F ; [.2229.0020.0008] -0580 ; [.222A.0020.0002] -0550 ; [.222A.0020.0008] -0581 ; [.222B.0020.0002] -0551 ; [.222B.0020.0008] -0582 ; [.222C.0020.0002] -0552 ; [.222C.0020.0008] -0583 ; [.222D.0020.0002] -0553 ; [.222D.0020.0008] -0584 ; [.222E.0020.0002] -0554 ; [.222E.0020.0008] -0585 ; [.222F.0020.0002] -0555 ; [.222F.0020.0008] -0586 ; [.2230.0020.0002] -0556 ; [.2230.0020.0008] -0559 ; [.2231.0020.0002] -05D0 ; [.2232.0020.0002] -2135 ; [.2232.0020.0004] -FB21 ; [.2232.0020.0005] -FB2E ; [.2232.0020.0002][.0000.0059.0002] -FB2F ; [.2232.0020.0002][.0000.005A.0002] -FB30 ; [.2232.0020.0002][.0000.005F.0002] -FB4F ; [.2232.0020.0004][.223D.0020.0004] -05D1 ; [.2233.0020.0002] -2136 ; [.2233.0020.0004] -FB31 ; [.2233.0020.0002][.0000.005F.0002] -FB4C ; [.2233.0020.0002][.0000.0060.0002] -05D2 ; [.2234.0020.0002] -2137 ; [.2234.0020.0004] -FB32 ; [.2234.0020.0002][.0000.005F.0002] -05D3 ; [.2235.0020.0002] -2138 ; [.2235.0020.0004] -FB22 ; [.2235.0020.0005] -FB33 ; [.2235.0020.0002][.0000.005F.0002] -05D4 ; [.2236.0020.0002] -FB23 ; [.2236.0020.0005] -FB34 ; [.2236.0020.0002][.0000.005F.0002] -05D5 ; [.2237.0020.0002] -FB4B ; [.2237.0020.0002][.0000.005B.0002] -FB35 ; [.2237.0020.0002][.0000.005F.0002] -05F0 ; [.2237.0020.0004][.2237.0020.0004] -05F1 ; [.2237.0020.0004][.223B.0020.0004] -05D6 ; [.2238.0020.0002] -FB36 ; [.2238.0020.0002][.0000.005F.0002] -05D7 ; [.2239.0020.0002] -05D8 ; [.223A.0020.0002] -FB38 ; [.223A.0020.0002][.0000.005F.0002] -05D9 ; [.223B.0020.0002] -FB1D ; [.223B.0020.0002][.0000.0056.0002] -FB39 ; [.223B.0020.0002][.0000.005F.0002] -05F2 ; [.223B.0020.0004][.223B.0020.0004] -FB1F ; [.223B.0020.0004][.223B.0020.0004][.0000.0059.0002] -05DB ; [.223C.0020.0002] -FB24 ; [.223C.0020.0005] -05DA ; [.223C.0020.0019] -FB3B ; [.223C.0020.0002][.0000.005F.0002] -FB3A ; [.223C.0020.0019][.0000.005F.0002] -FB4D ; [.223C.0020.0002][.0000.0060.0002] -05DC ; [.223D.0020.0002] -FB25 ; [.223D.0020.0005] -FB3C ; [.223D.0020.0002][.0000.005F.0002] -05DE ; [.223E.0020.0002] -FB26 ; [.223E.0020.0005] -05DD ; [.223E.0020.0019] -FB3E ; [.223E.0020.0002][.0000.005F.0002] -05E0 ; [.223F.0020.0002] -05DF ; [.223F.0020.0019] -FB40 ; [.223F.0020.0002][.0000.005F.0002] -05E1 ; [.2240.0020.0002] -FB41 ; [.2240.0020.0002][.0000.005F.0002] -05E2 ; [.2241.0020.0002] -FB20 ; [.2241.0020.0005] -05E4 ; [.2242.0020.0002] -05E3 ; [.2242.0020.0019] -FB44 ; [.2242.0020.0002][.0000.005F.0002] -FB43 ; [.2242.0020.0019][.0000.005F.0002] -FB4E ; [.2242.0020.0002][.0000.0060.0002] -05E6 ; [.2243.0020.0002] -05E5 ; [.2243.0020.0019] -FB46 ; [.2243.0020.0002][.0000.005F.0002] -05E7 ; [.2244.0020.0002] -FB47 ; [.2244.0020.0002][.0000.005F.0002] -05E8 ; [.2245.0020.0002] -FB27 ; [.2245.0020.0005] -FB48 ; [.2245.0020.0002][.0000.005F.0002] -05E9 ; [.2246.0020.0002] -FB2B ; [.2246.0020.0002][.0000.005D.0002] -FB2A ; [.2246.0020.0002][.0000.005E.0002] -FB49 ; [.2246.0020.0002][.0000.005F.0002] -FB2D ; [.2246.0020.0002][.0000.005F.0002][.0000.005D.0002] -FB2C ; [.2246.0020.0002][.0000.005F.0002][.0000.005E.0002] -05EA ; [.2247.0020.0002] -FB28 ; [.2247.0020.0005] -FB4A ; [.2247.0020.0002][.0000.005F.0002] -10900 ; [.2248.0020.0002] -10901 ; [.2249.0020.0002] -10902 ; [.224A.0020.0002] -10903 ; [.224B.0020.0002] -10904 ; [.224C.0020.0002] -10905 ; [.224D.0020.0002] -10906 ; [.224E.0020.0002] -10907 ; [.224F.0020.0002] -10908 ; [.2250.0020.0002] -10909 ; [.2251.0020.0002] -1090A ; [.2252.0020.0002] -1090B ; [.2253.0020.0002] -1090C ; [.2254.0020.0002] -1090D ; [.2255.0020.0002] -1090E ; [.2256.0020.0002] -1090F ; [.2257.0020.0002] -10910 ; [.2258.0020.0002] -10911 ; [.2259.0020.0002] -10912 ; [.225A.0020.0002] -10913 ; [.225B.0020.0002] -10914 ; [.225C.0020.0002] -10915 ; [.225D.0020.0002] -0800 ; [.225E.0020.0002] -0801 ; [.225F.0020.0002] -0802 ; [.2260.0020.0002] -0803 ; [.2261.0020.0002] -0804 ; [.2262.0020.0002] -0805 ; [.2263.0020.0002] -0806 ; [.2264.0020.0002] -0807 ; [.2265.0020.0002] -0808 ; [.2266.0020.0002] -0809 ; [.2267.0020.0002] -080A ; [.2268.0020.0002] -080B ; [.2269.0020.0002] -080C ; [.226A.0020.0002] -080D ; [.226B.0020.0002] -080E ; [.226C.0020.0002] -080F ; [.226D.0020.0002] -0810 ; [.226E.0020.0002] -0811 ; [.226F.0020.0002] -0812 ; [.2270.0020.0002] -0813 ; [.2271.0020.0002] -0814 ; [.2272.0020.0002] -0815 ; [.2273.0020.0002] -0816 ; [.2274.0020.0002] -0817 ; [.2275.0020.0002] -081A ; [.2276.0020.0002] -081B ; [.2277.0020.0002] -0621 ; [.2278.0020.0002] -0674 ; [.2278.0020.0004] -FE80 ; [.2278.0020.001A] -06FD ; [.2278.0020.0004][.0000.010C.0004] -0622 ; [.2279.0020.0002] -0627 0653 ; [.2279.0020.0002] -FE82 ; [.2279.0020.0019] -FE81 ; [.2279.0020.001A] -0623 ; [.227A.0020.0002] -0627 0654 ; [.227A.0020.0002] -FE84 ; [.227A.0020.0019] -FE83 ; [.227A.0020.001A] -0672 ; [.227B.0020.0002] -0671 ; [.227C.0020.0002] -FB51 ; [.227C.0020.0019] -FB50 ; [.227C.0020.001A] -0624 ; [.227D.0020.0002] -0648 0654 ; [.227D.0020.0002] -FE86 ; [.227D.0020.0019] -FE85 ; [.227D.0020.001A] -0625 ; [.227E.0020.0002] -0627 0655 ; [.227E.0020.0002] -FE88 ; [.227E.0020.0019] -FE87 ; [.227E.0020.001A] -0673 ; [.227F.0020.0002] -0773 ; [.2280.0020.0002] -0774 ; [.2281.0020.0002] -0626 ; [.2282.0020.0002] -064A 0654 ; [.2282.0020.0002] -FE8B ; [.2282.0020.0017] -FE8C ; [.2282.0020.0018] -FE8A ; [.2282.0020.0019] -FE89 ; [.2282.0020.001A] -FBEB ; [.2282.0020.0019][.2286.0020.0019] -FBEA ; [.2282.0020.001A][.2286.0020.001A] -FC97 ; [.2282.0020.0017][.229D.0020.0017] -FC00 ; [.2282.0020.001A][.229D.0020.001A] -FC98 ; [.2282.0020.0017][.22A4.0020.0017] -FC01 ; [.2282.0020.001A][.22A4.0020.001A] -FC99 ; [.2282.0020.0017][.22A5.0020.0017] -FC64 ; [.2282.0020.0019][.22BE.0020.0019] -FC65 ; [.2282.0020.0019][.22BF.0020.0019] -FC9A ; [.2282.0020.0017][.2318.0020.0017] -FCDF ; [.2282.0020.0018][.2318.0020.0018] -FC66 ; [.2282.0020.0019][.2318.0020.0019] -FC02 ; [.2282.0020.001A][.2318.0020.001A] -FC67 ; [.2282.0020.0019][.231C.0020.0019] -FC9B ; [.2282.0020.0017][.2325.0020.0017] -FCE0 ; [.2282.0020.0018][.2325.0020.0018] -FBED ; [.2282.0020.0019][.232A.0020.0019] -FBEC ; [.2282.0020.001A][.232A.0020.001A] -FBEF ; [.2282.0020.0019][.232B.0020.0019] -FBEE ; [.2282.0020.001A][.232B.0020.001A] -FBF3 ; [.2282.0020.0019][.232E.0020.0019] -FBF2 ; [.2282.0020.001A][.232E.0020.001A] -FBF1 ; [.2282.0020.0019][.232F.0020.0019] -FBF0 ; [.2282.0020.001A][.232F.0020.001A] -FBF5 ; [.2282.0020.0019][.2330.0020.0019] -FBF4 ; [.2282.0020.001A][.2330.0020.001A] -FBFB ; [.2282.0020.0017][.2339.0020.0017] -FBFA ; [.2282.0020.0019][.2339.0020.0019] -FC68 ; [.2282.0020.0019][.2339.0020.0019] -FBF9 ; [.2282.0020.001A][.2339.0020.001A] -FC03 ; [.2282.0020.001A][.2339.0020.001A] -FC69 ; [.2282.0020.0019][.233A.0020.0019] -FC04 ; [.2282.0020.001A][.233A.0020.001A] -FBF8 ; [.2282.0020.0017][.233E.0020.0017] -FBF7 ; [.2282.0020.0019][.233E.0020.0019] -FBF6 ; [.2282.0020.001A][.233E.0020.001A] -08A8 ; [.2283.0020.0002] -08A9 ; [.2284.0020.0002] -08AC ; [.2285.0020.0002] -0627 ; [.2286.0020.0002] -08AD ; [.2286.0020.0004] -1EE00 ; [.2286.0020.0005] -1EE80 ; [.2286.0020.0005] -FE8E ; [.2286.0020.0019] -FE8D ; [.2286.0020.001A] -FD3C ; [.2286.0020.0019][.0000.006D.0019] -FD3D ; [.2286.0020.001A][.0000.006D.001A] -0675 ; [.2286.0020.0004][.2278.0020.0004] -FDF3 ; [.2286.0020.001A][.22FC.0020.001A][.2288.0020.001A][.22BE.0020.001A] -FDF2 ; [.2286.0020.001A][.2311.0020.001A][.2311.0020.001A][.2325.0020.001A] -066E ; [.2287.0020.0002] -1EE1C ; [.2287.0020.0005] -1EE7C ; [.2287.0020.0005] -0628 ; [.2288.0020.0002] -1EE01 ; [.2288.0020.0005] -1EE21 ; [.2288.0020.0005] -1EE61 ; [.2288.0020.0005] -1EE81 ; [.2288.0020.0005] -1EEA1 ; [.2288.0020.0005] -FE91 ; [.2288.0020.0017] -FE92 ; [.2288.0020.0018] -FE90 ; [.2288.0020.0019] -FE8F ; [.2288.0020.001A] -FC9C ; [.2288.0020.0017][.229D.0020.0017] -FC05 ; [.2288.0020.001A][.229D.0020.001A] -FC9D ; [.2288.0020.0017][.22A4.0020.0017] -FC06 ; [.2288.0020.001A][.22A4.0020.001A] -FDC2 ; [.2288.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FC9E ; [.2288.0020.0017][.22A5.0020.0017] -FC07 ; [.2288.0020.001A][.22A5.0020.001A] -FD9E ; [.2288.0020.0019][.22A5.0020.0019][.233A.0020.0019] -FC6A ; [.2288.0020.0019][.22BE.0020.0019] -FC6B ; [.2288.0020.0019][.22BF.0020.0019] -FC9F ; [.2288.0020.0017][.2318.0020.0017] -FCE1 ; [.2288.0020.0018][.2318.0020.0018] -FC6C ; [.2288.0020.0019][.2318.0020.0019] -FC08 ; [.2288.0020.001A][.2318.0020.001A] -FC6D ; [.2288.0020.0019][.231C.0020.0019] -FCA0 ; [.2288.0020.0017][.2325.0020.0017] -FCE2 ; [.2288.0020.0018][.2325.0020.0018] -FC6E ; [.2288.0020.0019][.2339.0020.0019] -FC09 ; [.2288.0020.001A][.2339.0020.001A] -FC6F ; [.2288.0020.0019][.233A.0020.0019] -FC0A ; [.2288.0020.001A][.233A.0020.001A] -067B ; [.2289.0020.0002] -FB54 ; [.2289.0020.0017] -FB55 ; [.2289.0020.0018] -FB53 ; [.2289.0020.0019] -FB52 ; [.2289.0020.001A] -067E ; [.228A.0020.0002] -FB58 ; [.228A.0020.0017] -FB59 ; [.228A.0020.0018] -FB57 ; [.228A.0020.0019] -FB56 ; [.228A.0020.001A] -0680 ; [.228B.0020.0002] -FB5C ; [.228B.0020.0017] -FB5D ; [.228B.0020.0018] -FB5B ; [.228B.0020.0019] -FB5A ; [.228B.0020.001A] -0750 ; [.228C.0020.0002] -0751 ; [.228D.0020.0002] -0752 ; [.228E.0020.0002] -0753 ; [.228F.0020.0002] -0754 ; [.2290.0020.0002] -0755 ; [.2291.0020.0002] -08A0 ; [.2292.0020.0002] -0756 ; [.2293.0020.0002] -08A1 ; [.2294.0020.0002] -0629 ; [.2295.0020.0002] -FE94 ; [.2295.0020.0019] -FE93 ; [.2295.0020.001A] -062A ; [.2296.0020.0002] -1EE15 ; [.2296.0020.0005] -1EE35 ; [.2296.0020.0005] -1EE75 ; [.2296.0020.0005] -1EE95 ; [.2296.0020.0005] -1EEB5 ; [.2296.0020.0005] -FE97 ; [.2296.0020.0017] -FE98 ; [.2296.0020.0018] -FE96 ; [.2296.0020.0019] -FE95 ; [.2296.0020.001A] -FCA1 ; [.2296.0020.0017][.229D.0020.0017] -FC0B ; [.2296.0020.001A][.229D.0020.001A] -FD50 ; [.2296.0020.0017][.229D.0020.0017][.2318.0020.0017] -FDA0 ; [.2296.0020.0019][.229D.0020.0019][.2339.0020.0019] -FD9F ; [.2296.0020.0019][.229D.0020.0019][.233A.0020.0019] -FCA2 ; [.2296.0020.0017][.22A4.0020.0017] -FC0C ; [.2296.0020.001A][.22A4.0020.001A] -FD52 ; [.2296.0020.0017][.22A4.0020.0017][.229D.0020.0017] -FD51 ; [.2296.0020.0019][.22A4.0020.0019][.229D.0020.0019] -FD53 ; [.2296.0020.0017][.22A4.0020.0017][.2318.0020.0017] -FCA3 ; [.2296.0020.0017][.22A5.0020.0017] -FC0D ; [.2296.0020.001A][.22A5.0020.001A] -FD54 ; [.2296.0020.0017][.22A5.0020.0017][.2318.0020.0017] -FDA2 ; [.2296.0020.0019][.22A5.0020.0019][.2339.0020.0019] -FDA1 ; [.2296.0020.0019][.22A5.0020.0019][.233A.0020.0019] -FC70 ; [.2296.0020.0019][.22BE.0020.0019] -FC71 ; [.2296.0020.0019][.22BF.0020.0019] -FCA4 ; [.2296.0020.0017][.2318.0020.0017] -FCE3 ; [.2296.0020.0018][.2318.0020.0018] -FC72 ; [.2296.0020.0019][.2318.0020.0019] -FC0E ; [.2296.0020.001A][.2318.0020.001A] -FD55 ; [.2296.0020.0017][.2318.0020.0017][.229D.0020.0017] -FD56 ; [.2296.0020.0017][.2318.0020.0017][.22A4.0020.0017] -FD57 ; [.2296.0020.0017][.2318.0020.0017][.22A5.0020.0017] -FDA4 ; [.2296.0020.0019][.2318.0020.0019][.2339.0020.0019] -FDA3 ; [.2296.0020.0019][.2318.0020.0019][.233A.0020.0019] -FC73 ; [.2296.0020.0019][.231C.0020.0019] -FCA5 ; [.2296.0020.0017][.2325.0020.0017] -FCE4 ; [.2296.0020.0018][.2325.0020.0018] -FC74 ; [.2296.0020.0019][.2339.0020.0019] -FC0F ; [.2296.0020.001A][.2339.0020.001A] -FC75 ; [.2296.0020.0019][.233A.0020.0019] -FC10 ; [.2296.0020.001A][.233A.0020.001A] -062B ; [.2297.0020.0002] -1EE16 ; [.2297.0020.0005] -1EE36 ; [.2297.0020.0005] -1EE76 ; [.2297.0020.0005] -1EE96 ; [.2297.0020.0005] -1EEB6 ; [.2297.0020.0005] -FE9B ; [.2297.0020.0017] -FE9C ; [.2297.0020.0018] -FE9A ; [.2297.0020.0019] -FE99 ; [.2297.0020.001A] -FC11 ; [.2297.0020.001A][.229D.0020.001A] -FC76 ; [.2297.0020.0019][.22BE.0020.0019] -FC77 ; [.2297.0020.0019][.22BF.0020.0019] -FCA6 ; [.2297.0020.0017][.2318.0020.0017] -FCE5 ; [.2297.0020.0018][.2318.0020.0018] -FC78 ; [.2297.0020.0019][.2318.0020.0019] -FC12 ; [.2297.0020.001A][.2318.0020.001A] -FC79 ; [.2297.0020.0019][.231C.0020.0019] -FCE6 ; [.2297.0020.0018][.2325.0020.0018] -FC7A ; [.2297.0020.0019][.2339.0020.0019] -FC13 ; [.2297.0020.001A][.2339.0020.001A] -FC7B ; [.2297.0020.0019][.233A.0020.0019] -FC14 ; [.2297.0020.001A][.233A.0020.001A] -0679 ; [.2298.0020.0002] -FB68 ; [.2298.0020.0017] -FB69 ; [.2298.0020.0018] -FB67 ; [.2298.0020.0019] -FB66 ; [.2298.0020.001A] -067A ; [.2299.0020.0002] -FB60 ; [.2299.0020.0017] -FB61 ; [.2299.0020.0018] -FB5F ; [.2299.0020.0019] -FB5E ; [.2299.0020.001A] -067C ; [.229A.0020.0002] -067D ; [.229B.0020.0002] -067F ; [.229C.0020.0002] -FB64 ; [.229C.0020.0017] -FB65 ; [.229C.0020.0018] -FB63 ; [.229C.0020.0019] -FB62 ; [.229C.0020.001A] -062C ; [.229D.0020.0002] -1EE02 ; [.229D.0020.0005] -1EE22 ; [.229D.0020.0005] -1EE42 ; [.229D.0020.0005] -1EE62 ; [.229D.0020.0005] -1EE82 ; [.229D.0020.0005] -1EEA2 ; [.229D.0020.0005] -FE9F ; [.229D.0020.0017] -FEA0 ; [.229D.0020.0018] -FE9E ; [.229D.0020.0019] -FE9D ; [.229D.0020.001A] -FCA7 ; [.229D.0020.0017][.22A4.0020.0017] -FC15 ; [.229D.0020.001A][.22A4.0020.001A] -FDA6 ; [.229D.0020.0019][.22A4.0020.0019][.2339.0020.0019] -FDBE ; [.229D.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FDFB ; [.229D.0020.001A][.2311.0020.001A][*0209.0020.001A][.229D.0020.001A][.2311.0020.001A][.2286.0020.001A][.2311.0020.001A][.2325.0020.001A] -FCA8 ; [.229D.0020.0017][.2318.0020.0017] -FC16 ; [.229D.0020.001A][.2318.0020.001A] -FD59 ; [.229D.0020.0017][.2318.0020.0017][.22A4.0020.0017] -FD58 ; [.229D.0020.0019][.2318.0020.0019][.22A4.0020.0019] -FDA7 ; [.229D.0020.0019][.2318.0020.0019][.2339.0020.0019] -FDA5 ; [.229D.0020.0019][.2318.0020.0019][.233A.0020.0019] -FD1D ; [.229D.0020.0019][.2339.0020.0019] -FD01 ; [.229D.0020.001A][.2339.0020.001A] -FD1E ; [.229D.0020.0019][.233A.0020.0019] -FD02 ; [.229D.0020.001A][.233A.0020.001A] -0683 ; [.229E.0020.0002] -FB78 ; [.229E.0020.0017] -FB79 ; [.229E.0020.0018] -FB77 ; [.229E.0020.0019] -FB76 ; [.229E.0020.001A] -0684 ; [.229F.0020.0002] -FB74 ; [.229F.0020.0017] -FB75 ; [.229F.0020.0018] -FB73 ; [.229F.0020.0019] -FB72 ; [.229F.0020.001A] -0686 ; [.22A0.0020.0002] -FB7C ; [.22A0.0020.0017] -FB7D ; [.22A0.0020.0018] -FB7B ; [.22A0.0020.0019] -FB7A ; [.22A0.0020.001A] -06BF ; [.22A1.0020.0002] -0687 ; [.22A2.0020.0002] -FB80 ; [.22A2.0020.0017] -FB81 ; [.22A2.0020.0018] -FB7F ; [.22A2.0020.0019] -FB7E ; [.22A2.0020.001A] -08A2 ; [.22A3.0020.0002] -062D ; [.22A4.0020.0002] -1EE07 ; [.22A4.0020.0005] -1EE27 ; [.22A4.0020.0005] -1EE47 ; [.22A4.0020.0005] -1EE67 ; [.22A4.0020.0005] -1EE87 ; [.22A4.0020.0005] -1EEA7 ; [.22A4.0020.0005] -FEA3 ; [.22A4.0020.0017] -FEA4 ; [.22A4.0020.0018] -FEA2 ; [.22A4.0020.0019] -FEA1 ; [.22A4.0020.001A] -FCA9 ; [.22A4.0020.0017][.229D.0020.0017] -FC17 ; [.22A4.0020.001A][.229D.0020.001A] -FDBF ; [.22A4.0020.0019][.229D.0020.0019][.233A.0020.0019] -FCAA ; [.22A4.0020.0017][.2318.0020.0017] -FC18 ; [.22A4.0020.001A][.2318.0020.001A] -FD5B ; [.22A4.0020.0019][.2318.0020.0019][.2339.0020.0019] -FD5A ; [.22A4.0020.0019][.2318.0020.0019][.233A.0020.0019] -FD1B ; [.22A4.0020.0019][.2339.0020.0019] -FCFF ; [.22A4.0020.001A][.2339.0020.001A] -FD1C ; [.22A4.0020.0019][.233A.0020.0019] -FD00 ; [.22A4.0020.001A][.233A.0020.001A] -062E ; [.22A5.0020.0002] -1EE17 ; [.22A5.0020.0005] -1EE37 ; [.22A5.0020.0005] -1EE57 ; [.22A5.0020.0005] -1EE77 ; [.22A5.0020.0005] -1EE97 ; [.22A5.0020.0005] -1EEB7 ; [.22A5.0020.0005] -FEA7 ; [.22A5.0020.0017] -FEA8 ; [.22A5.0020.0018] -FEA6 ; [.22A5.0020.0019] -FEA5 ; [.22A5.0020.001A] -FCAB ; [.22A5.0020.0017][.229D.0020.0017] -FC19 ; [.22A5.0020.001A][.229D.0020.001A] -FC1A ; [.22A5.0020.001A][.22A4.0020.001A] -FCAC ; [.22A5.0020.0017][.2318.0020.0017] -FC1B ; [.22A5.0020.001A][.2318.0020.001A] -FD1F ; [.22A5.0020.0019][.2339.0020.0019] -FD03 ; [.22A5.0020.001A][.2339.0020.001A] -FD20 ; [.22A5.0020.0019][.233A.0020.0019] -FD04 ; [.22A5.0020.001A][.233A.0020.001A] -0681 ; [.22A6.0020.0002] -0682 ; [.22A7.0020.0002] -0685 ; [.22A8.0020.0002] -0757 ; [.22A9.0020.0002] -0758 ; [.22AA.0020.0002] -076E ; [.22AB.0020.0002] -076F ; [.22AC.0020.0002] -0772 ; [.22AD.0020.0002] -077C ; [.22AE.0020.0002] -062F ; [.22AF.0020.0002] -1EE03 ; [.22AF.0020.0005] -1EE83 ; [.22AF.0020.0005] -1EEA3 ; [.22AF.0020.0005] -FEAA ; [.22AF.0020.0019] -FEA9 ; [.22AF.0020.001A] -0630 ; [.22B0.0020.0002] -1EE18 ; [.22B0.0020.0005] -1EE98 ; [.22B0.0020.0005] -1EEB8 ; [.22B0.0020.0005] -FEAC ; [.22B0.0020.0019] -FEAB ; [.22B0.0020.001A] -FC5B ; [.22B0.0020.001A][.0000.0098.001A] -0688 ; [.22B1.0020.0002] -FB89 ; [.22B1.0020.0019] -FB88 ; [.22B1.0020.001A] -0689 ; [.22B2.0020.0002] -068A ; [.22B3.0020.0002] -068B ; [.22B4.0020.0002] -068C ; [.22B5.0020.0002] -FB85 ; [.22B5.0020.0019] -FB84 ; [.22B5.0020.001A] -068D ; [.22B6.0020.0002] -FB83 ; [.22B6.0020.0019] -FB82 ; [.22B6.0020.001A] -08AE ; [.22B7.0020.0002] -068E ; [.22B8.0020.0002] -FB87 ; [.22B8.0020.0019] -FB86 ; [.22B8.0020.001A] -068F ; [.22B9.0020.0002] -0690 ; [.22BA.0020.0002] -06EE ; [.22BB.0020.0002] -0759 ; [.22BC.0020.0002] -075A ; [.22BD.0020.0002] -0631 ; [.22BE.0020.0002] -1EE13 ; [.22BE.0020.0005] -1EE93 ; [.22BE.0020.0005] -1EEB3 ; [.22BE.0020.0005] -FEAE ; [.22BE.0020.0019] -FEAD ; [.22BE.0020.001A] -FC5C ; [.22BE.0020.001A][.0000.0098.001A] -FDF6 ; [.22BE.0020.001A][.22D0.0020.001A][.232B.0020.001A][.2311.0020.001A] -FDFC ; [.22BE.0020.001A][.233B.0020.001A][.2286.0020.001A][.2311.0020.001A] -0632 ; [.22BF.0020.0002] -1EE06 ; [.22BF.0020.0005] -1EE86 ; [.22BF.0020.0005] -1EEA6 ; [.22BF.0020.0005] -FEB0 ; [.22BF.0020.0019] -FEAF ; [.22BF.0020.001A] -0691 ; [.22C0.0020.0002] -FB8D ; [.22C0.0020.0019] -FB8C ; [.22C0.0020.001A] -0692 ; [.22C1.0020.0002] -0693 ; [.22C2.0020.0002] -0694 ; [.22C3.0020.0002] -0695 ; [.22C4.0020.0002] -0696 ; [.22C5.0020.0002] -0697 ; [.22C6.0020.0002] -0698 ; [.22C7.0020.0002] -FB8B ; [.22C7.0020.0019] -FB8A ; [.22C7.0020.001A] -0699 ; [.22C8.0020.0002] -06EF ; [.22C9.0020.0002] -075B ; [.22CA.0020.0002] -076B ; [.22CB.0020.0002] -076C ; [.22CC.0020.0002] -0771 ; [.22CD.0020.0002] -08AA ; [.22CE.0020.0002] -08B2 ; [.22CF.0020.0002] -0633 ; [.22D0.0020.0002] -1EE0E ; [.22D0.0020.0005] -1EE2E ; [.22D0.0020.0005] -1EE4E ; [.22D0.0020.0005] -1EE6E ; [.22D0.0020.0005] -1EE8E ; [.22D0.0020.0005] -1EEAE ; [.22D0.0020.0005] -FEB3 ; [.22D0.0020.0017] -FEB4 ; [.22D0.0020.0018] -FEB2 ; [.22D0.0020.0019] -FEB1 ; [.22D0.0020.001A] -FCAD ; [.22D0.0020.0017][.229D.0020.0017] -FD34 ; [.22D0.0020.0018][.229D.0020.0018] -FC1C ; [.22D0.0020.001A][.229D.0020.001A] -FD5D ; [.22D0.0020.0017][.229D.0020.0017][.22A4.0020.0017] -FD5E ; [.22D0.0020.0019][.229D.0020.0019][.2339.0020.0019] -FCAE ; [.22D0.0020.0017][.22A4.0020.0017] -FD35 ; [.22D0.0020.0018][.22A4.0020.0018] -FC1D ; [.22D0.0020.001A][.22A4.0020.001A] -FD5C ; [.22D0.0020.0017][.22A4.0020.0017][.229D.0020.0017] -FCAF ; [.22D0.0020.0017][.22A5.0020.0017] -FD36 ; [.22D0.0020.0018][.22A5.0020.0018] -FC1E ; [.22D0.0020.001A][.22A5.0020.001A] -FDA8 ; [.22D0.0020.0019][.22A5.0020.0019][.2339.0020.0019] -FDC6 ; [.22D0.0020.0019][.22A5.0020.0019][.233A.0020.0019] -FD2A ; [.22D0.0020.0019][.22BE.0020.0019] -FD0E ; [.22D0.0020.001A][.22BE.0020.001A] -FCB0 ; [.22D0.0020.0017][.2318.0020.0017] -FCE7 ; [.22D0.0020.0018][.2318.0020.0018] -FC1F ; [.22D0.0020.001A][.2318.0020.001A] -FD61 ; [.22D0.0020.0017][.2318.0020.0017][.229D.0020.0017] -FD60 ; [.22D0.0020.0017][.2318.0020.0017][.22A4.0020.0017] -FD5F ; [.22D0.0020.0019][.2318.0020.0019][.22A4.0020.0019] -FD63 ; [.22D0.0020.0017][.2318.0020.0017][.2318.0020.0017] -FD62 ; [.22D0.0020.0019][.2318.0020.0019][.2318.0020.0019] -FD31 ; [.22D0.0020.0017][.2325.0020.0017] -FCE8 ; [.22D0.0020.0018][.2325.0020.0018] -FD17 ; [.22D0.0020.0019][.2339.0020.0019] -FCFB ; [.22D0.0020.001A][.2339.0020.001A] -FD18 ; [.22D0.0020.0019][.233A.0020.0019] -FCFC ; [.22D0.0020.001A][.233A.0020.001A] -0634 ; [.22D1.0020.0002] -1EE14 ; [.22D1.0020.0005] -1EE34 ; [.22D1.0020.0005] -1EE54 ; [.22D1.0020.0005] -1EE74 ; [.22D1.0020.0005] -1EE94 ; [.22D1.0020.0005] -1EEB4 ; [.22D1.0020.0005] -FEB7 ; [.22D1.0020.0017] -FEB8 ; [.22D1.0020.0018] -FEB6 ; [.22D1.0020.0019] -FEB5 ; [.22D1.0020.001A] -FD2D ; [.22D1.0020.0017][.229D.0020.0017] -FD37 ; [.22D1.0020.0018][.229D.0020.0018] -FD25 ; [.22D1.0020.0019][.229D.0020.0019] -FD09 ; [.22D1.0020.001A][.229D.0020.001A] -FD69 ; [.22D1.0020.0019][.229D.0020.0019][.233A.0020.0019] -FD2E ; [.22D1.0020.0017][.22A4.0020.0017] -FD38 ; [.22D1.0020.0018][.22A4.0020.0018] -FD26 ; [.22D1.0020.0019][.22A4.0020.0019] -FD0A ; [.22D1.0020.001A][.22A4.0020.001A] -FD68 ; [.22D1.0020.0017][.22A4.0020.0017][.2318.0020.0017] -FD67 ; [.22D1.0020.0019][.22A4.0020.0019][.2318.0020.0019] -FDAA ; [.22D1.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FD2F ; [.22D1.0020.0017][.22A5.0020.0017] -FD39 ; [.22D1.0020.0018][.22A5.0020.0018] -FD27 ; [.22D1.0020.0019][.22A5.0020.0019] -FD0B ; [.22D1.0020.001A][.22A5.0020.001A] -FD29 ; [.22D1.0020.0019][.22BE.0020.0019] -FD0D ; [.22D1.0020.001A][.22BE.0020.001A] -FD30 ; [.22D1.0020.0017][.2318.0020.0017] -FCE9 ; [.22D1.0020.0018][.2318.0020.0018] -FD28 ; [.22D1.0020.0019][.2318.0020.0019] -FD0C ; [.22D1.0020.001A][.2318.0020.001A] -FD6B ; [.22D1.0020.0017][.2318.0020.0017][.22A5.0020.0017] -FD6A ; [.22D1.0020.0019][.2318.0020.0019][.22A5.0020.0019] -FD6D ; [.22D1.0020.0017][.2318.0020.0017][.2318.0020.0017] -FD6C ; [.22D1.0020.0019][.2318.0020.0019][.2318.0020.0019] -FD32 ; [.22D1.0020.0017][.2325.0020.0017] -FCEA ; [.22D1.0020.0018][.2325.0020.0018] -FD19 ; [.22D1.0020.0019][.2339.0020.0019] -FCFD ; [.22D1.0020.001A][.2339.0020.001A] -FD1A ; [.22D1.0020.0019][.233A.0020.0019] -FCFE ; [.22D1.0020.001A][.233A.0020.001A] -069A ; [.22D2.0020.0002] -069B ; [.22D3.0020.0002] -069C ; [.22D4.0020.0002] -06FA ; [.22D5.0020.0002] -075C ; [.22D6.0020.0002] -076D ; [.22D7.0020.0002] -0770 ; [.22D8.0020.0002] -077D ; [.22D9.0020.0002] -077E ; [.22DA.0020.0002] -0635 ; [.22DB.0020.0002] -1EE11 ; [.22DB.0020.0005] -1EE31 ; [.22DB.0020.0005] -1EE51 ; [.22DB.0020.0005] -1EE71 ; [.22DB.0020.0005] -1EE91 ; [.22DB.0020.0005] -1EEB1 ; [.22DB.0020.0005] -FEBB ; [.22DB.0020.0017] -FEBC ; [.22DB.0020.0018] -FEBA ; [.22DB.0020.0019] -FEB9 ; [.22DB.0020.001A] -FCB1 ; [.22DB.0020.0017][.22A4.0020.0017] -FC20 ; [.22DB.0020.001A][.22A4.0020.001A] -FD65 ; [.22DB.0020.0017][.22A4.0020.0017][.22A4.0020.0017] -FD64 ; [.22DB.0020.0019][.22A4.0020.0019][.22A4.0020.0019] -FDA9 ; [.22DB.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FCB2 ; [.22DB.0020.0017][.22A5.0020.0017] -FD2B ; [.22DB.0020.0019][.22BE.0020.0019] -FD0F ; [.22DB.0020.001A][.22BE.0020.001A] -FDF5 ; [.22DB.0020.001A][.2311.0020.001A][.22E5.0020.001A][.2318.0020.001A] -FDF9 ; [.22DB.0020.001A][.2311.0020.001A][.2339.0020.001A] -FDFA ; [.22DB.0020.001A][.2311.0020.001A][.2339.0020.001A][*0209.0020.001A][.2286.0020.001A][.2311.0020.001A][.2311.0020.001A][.2325.0020.001A][*0209.0020.001A][.22E5.0020.001A][.2311.0020.001A][.233A.0020.001A][.2325.0020.001A][*0209.0020.001A][.232B.0020.001A][.22D0.0020.001A][.2311.0020.001A][.2318.0020.001A] -FDF0 ; [.22DB.0020.001A][.2311.0020.001A][.2347.0020.001A] -FCB3 ; [.22DB.0020.0017][.2318.0020.0017] -FC21 ; [.22DB.0020.001A][.2318.0020.001A] -FDC5 ; [.22DB.0020.0017][.2318.0020.0017][.2318.0020.0017] -FD66 ; [.22DB.0020.0019][.2318.0020.0019][.2318.0020.0019] -FD21 ; [.22DB.0020.0019][.2339.0020.0019] -FD05 ; [.22DB.0020.001A][.2339.0020.001A] -FD22 ; [.22DB.0020.0019][.233A.0020.0019] -FD06 ; [.22DB.0020.001A][.233A.0020.001A] -0636 ; [.22DC.0020.0002] -1EE19 ; [.22DC.0020.0005] -1EE39 ; [.22DC.0020.0005] -1EE59 ; [.22DC.0020.0005] -1EE79 ; [.22DC.0020.0005] -1EE99 ; [.22DC.0020.0005] -1EEB9 ; [.22DC.0020.0005] -FEBF ; [.22DC.0020.0017] -FEC0 ; [.22DC.0020.0018] -FEBE ; [.22DC.0020.0019] -FEBD ; [.22DC.0020.001A] -FCB4 ; [.22DC.0020.0017][.229D.0020.0017] -FC22 ; [.22DC.0020.001A][.229D.0020.001A] -FCB5 ; [.22DC.0020.0017][.22A4.0020.0017] -FC23 ; [.22DC.0020.001A][.22A4.0020.001A] -FD6E ; [.22DC.0020.0019][.22A4.0020.0019][.2339.0020.0019] -FDAB ; [.22DC.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FCB6 ; [.22DC.0020.0017][.22A5.0020.0017] -FC24 ; [.22DC.0020.001A][.22A5.0020.001A] -FD70 ; [.22DC.0020.0017][.22A5.0020.0017][.2318.0020.0017] -FD6F ; [.22DC.0020.0019][.22A5.0020.0019][.2318.0020.0019] -FD2C ; [.22DC.0020.0019][.22BE.0020.0019] -FD10 ; [.22DC.0020.001A][.22BE.0020.001A] -FCB7 ; [.22DC.0020.0017][.2318.0020.0017] -FC25 ; [.22DC.0020.001A][.2318.0020.001A] -FD23 ; [.22DC.0020.0019][.2339.0020.0019] -FD07 ; [.22DC.0020.001A][.2339.0020.001A] -FD24 ; [.22DC.0020.0019][.233A.0020.0019] -FD08 ; [.22DC.0020.001A][.233A.0020.001A] -069D ; [.22DD.0020.0002] -08AF ; [.22DE.0020.0002] -069E ; [.22DF.0020.0002] -06FB ; [.22E0.0020.0002] -0637 ; [.22E1.0020.0002] -1EE08 ; [.22E1.0020.0005] -1EE68 ; [.22E1.0020.0005] -1EE88 ; [.22E1.0020.0005] -1EEA8 ; [.22E1.0020.0005] -FEC3 ; [.22E1.0020.0017] -FEC4 ; [.22E1.0020.0018] -FEC2 ; [.22E1.0020.0019] -FEC1 ; [.22E1.0020.001A] -FCB8 ; [.22E1.0020.0017][.22A4.0020.0017] -FC26 ; [.22E1.0020.001A][.22A4.0020.001A] -FD33 ; [.22E1.0020.0017][.2318.0020.0017] -FD3A ; [.22E1.0020.0018][.2318.0020.0018] -FC27 ; [.22E1.0020.001A][.2318.0020.001A] -FD72 ; [.22E1.0020.0017][.2318.0020.0017][.22A4.0020.0017] -FD71 ; [.22E1.0020.0019][.2318.0020.0019][.22A4.0020.0019] -FD73 ; [.22E1.0020.0017][.2318.0020.0017][.2318.0020.0017] -FD74 ; [.22E1.0020.0019][.2318.0020.0019][.233A.0020.0019] -FD11 ; [.22E1.0020.0019][.2339.0020.0019] -FCF5 ; [.22E1.0020.001A][.2339.0020.001A] -FD12 ; [.22E1.0020.0019][.233A.0020.0019] -FCF6 ; [.22E1.0020.001A][.233A.0020.001A] -0638 ; [.22E2.0020.0002] -1EE1A ; [.22E2.0020.0005] -1EE7A ; [.22E2.0020.0005] -1EE9A ; [.22E2.0020.0005] -1EEBA ; [.22E2.0020.0005] -FEC7 ; [.22E2.0020.0017] -FEC8 ; [.22E2.0020.0018] -FEC6 ; [.22E2.0020.0019] -FEC5 ; [.22E2.0020.001A] -FCB9 ; [.22E2.0020.0017][.2318.0020.0017] -FD3B ; [.22E2.0020.0018][.2318.0020.0018] -FC28 ; [.22E2.0020.001A][.2318.0020.001A] -069F ; [.22E3.0020.0002] -08A3 ; [.22E4.0020.0002] -0639 ; [.22E5.0020.0002] -1EE0F ; [.22E5.0020.0005] -1EE2F ; [.22E5.0020.0005] -1EE4F ; [.22E5.0020.0005] -1EE6F ; [.22E5.0020.0005] -1EE8F ; [.22E5.0020.0005] -1EEAF ; [.22E5.0020.0005] -FECB ; [.22E5.0020.0017] -FECC ; [.22E5.0020.0018] -FECA ; [.22E5.0020.0019] -FEC9 ; [.22E5.0020.001A] -FCBA ; [.22E5.0020.0017][.229D.0020.0017] -FC29 ; [.22E5.0020.001A][.229D.0020.001A] -FDC4 ; [.22E5.0020.0017][.229D.0020.0017][.2318.0020.0017] -FD75 ; [.22E5.0020.0019][.229D.0020.0019][.2318.0020.0019] -FDF7 ; [.22E5.0020.001A][.2311.0020.001A][.233A.0020.001A][.2325.0020.001A] -FCBB ; [.22E5.0020.0017][.2318.0020.0017] -FC2A ; [.22E5.0020.001A][.2318.0020.001A] -FD77 ; [.22E5.0020.0017][.2318.0020.0017][.2318.0020.0017] -FD76 ; [.22E5.0020.0019][.2318.0020.0019][.2318.0020.0019] -FD78 ; [.22E5.0020.0019][.2318.0020.0019][.2339.0020.0019] -FDB6 ; [.22E5.0020.0019][.2318.0020.0019][.233A.0020.0019] -FD13 ; [.22E5.0020.0019][.2339.0020.0019] -FCF7 ; [.22E5.0020.001A][.2339.0020.001A] -FD14 ; [.22E5.0020.0019][.233A.0020.0019] -FCF8 ; [.22E5.0020.001A][.233A.0020.001A] -063A ; [.22E6.0020.0002] -1EE1B ; [.22E6.0020.0005] -1EE3B ; [.22E6.0020.0005] -1EE5B ; [.22E6.0020.0005] -1EE7B ; [.22E6.0020.0005] -1EE9B ; [.22E6.0020.0005] -1EEBB ; [.22E6.0020.0005] -FECF ; [.22E6.0020.0017] -FED0 ; [.22E6.0020.0018] -FECE ; [.22E6.0020.0019] -FECD ; [.22E6.0020.001A] -FCBC ; [.22E6.0020.0017][.229D.0020.0017] -FC2B ; [.22E6.0020.001A][.229D.0020.001A] -FCBD ; [.22E6.0020.0017][.2318.0020.0017] -FC2C ; [.22E6.0020.001A][.2318.0020.001A] -FD79 ; [.22E6.0020.0019][.2318.0020.0019][.2318.0020.0019] -FD7B ; [.22E6.0020.0019][.2318.0020.0019][.2339.0020.0019] -FD7A ; [.22E6.0020.0019][.2318.0020.0019][.233A.0020.0019] -FD15 ; [.22E6.0020.0019][.2339.0020.0019] -FCF9 ; [.22E6.0020.001A][.2339.0020.001A] -FD16 ; [.22E6.0020.0019][.233A.0020.0019] -FCFA ; [.22E6.0020.001A][.233A.0020.001A] -06A0 ; [.22E7.0020.0002] -06FC ; [.22E8.0020.0002] -075D ; [.22E9.0020.0002] -075E ; [.22EA.0020.0002] -075F ; [.22EB.0020.0002] -08B3 ; [.22EC.0020.0002] -0641 ; [.22ED.0020.0002] -1EE10 ; [.22ED.0020.0005] -1EE30 ; [.22ED.0020.0005] -1EE70 ; [.22ED.0020.0005] -1EE90 ; [.22ED.0020.0005] -1EEB0 ; [.22ED.0020.0005] -FED3 ; [.22ED.0020.0017] -FED4 ; [.22ED.0020.0018] -FED2 ; [.22ED.0020.0019] -FED1 ; [.22ED.0020.001A] -FCBE ; [.22ED.0020.0017][.229D.0020.0017] -FC2D ; [.22ED.0020.001A][.229D.0020.001A] -FCBF ; [.22ED.0020.0017][.22A4.0020.0017] -FC2E ; [.22ED.0020.001A][.22A4.0020.001A] -FCC0 ; [.22ED.0020.0017][.22A5.0020.0017] -FC2F ; [.22ED.0020.001A][.22A5.0020.001A] -FD7D ; [.22ED.0020.0017][.22A5.0020.0017][.2318.0020.0017] -FD7C ; [.22ED.0020.0019][.22A5.0020.0019][.2318.0020.0019] -FCC1 ; [.22ED.0020.0017][.2318.0020.0017] -FC30 ; [.22ED.0020.001A][.2318.0020.001A] -FDC1 ; [.22ED.0020.0019][.2318.0020.0019][.233A.0020.0019] -FC7C ; [.22ED.0020.0019][.2339.0020.0019] -FC31 ; [.22ED.0020.001A][.2339.0020.001A] -FC7D ; [.22ED.0020.0019][.233A.0020.0019] -FC32 ; [.22ED.0020.001A][.233A.0020.001A] -06A1 ; [.22EE.0020.0002] -1EE1E ; [.22EE.0020.0005] -1EE7E ; [.22EE.0020.0005] -06A2 ; [.22EF.0020.0002] -06A3 ; [.22F0.0020.0002] -06A4 ; [.22F1.0020.0002] -FB6C ; [.22F1.0020.0017] -FB6D ; [.22F1.0020.0018] -FB6B ; [.22F1.0020.0019] -FB6A ; [.22F1.0020.001A] -08A4 ; [.22F2.0020.0002] -06A5 ; [.22F3.0020.0002] -06A6 ; [.22F4.0020.0002] -FB70 ; [.22F4.0020.0017] -FB71 ; [.22F4.0020.0018] -FB6F ; [.22F4.0020.0019] -FB6E ; [.22F4.0020.001A] -0760 ; [.22F5.0020.0002] -0761 ; [.22F6.0020.0002] -066F ; [.22F7.0020.0002] -1EE1F ; [.22F7.0020.0005] -1EE5F ; [.22F7.0020.0005] -0642 ; [.22F8.0020.0002] -1EE12 ; [.22F8.0020.0005] -1EE32 ; [.22F8.0020.0005] -1EE52 ; [.22F8.0020.0005] -1EE72 ; [.22F8.0020.0005] -1EE92 ; [.22F8.0020.0005] -1EEB2 ; [.22F8.0020.0005] -FED7 ; [.22F8.0020.0017] -FED8 ; [.22F8.0020.0018] -FED6 ; [.22F8.0020.0019] -FED5 ; [.22F8.0020.001A] -FCC2 ; [.22F8.0020.0017][.22A4.0020.0017] -FC33 ; [.22F8.0020.001A][.22A4.0020.001A] -FDF1 ; [.22F8.0020.001A][.2311.0020.001A][.2347.0020.001A] -FCC3 ; [.22F8.0020.0017][.2318.0020.0017] -FC34 ; [.22F8.0020.001A][.2318.0020.001A] -FDB4 ; [.22F8.0020.0017][.2318.0020.0017][.22A4.0020.0017] -FD7E ; [.22F8.0020.0019][.2318.0020.0019][.22A4.0020.0019] -FD7F ; [.22F8.0020.0019][.2318.0020.0019][.2318.0020.0019] -FDB2 ; [.22F8.0020.0019][.2318.0020.0019][.233A.0020.0019] -FC7E ; [.22F8.0020.0019][.2339.0020.0019] -FC35 ; [.22F8.0020.001A][.2339.0020.001A] -FC7F ; [.22F8.0020.0019][.233A.0020.0019] -FC36 ; [.22F8.0020.001A][.233A.0020.001A] -06A7 ; [.22F9.0020.0002] -06A8 ; [.22FA.0020.0002] -08A5 ; [.22FB.0020.0002] -0643 ; [.22FC.0020.0002] -1EE0A ; [.22FC.0020.0005] -1EE2A ; [.22FC.0020.0005] -1EE6A ; [.22FC.0020.0005] -FEDB ; [.22FC.0020.0017] -FEDC ; [.22FC.0020.0018] -FEDA ; [.22FC.0020.0019] -FED9 ; [.22FC.0020.001A] -FC80 ; [.22FC.0020.0019][.2286.0020.0019] -FC37 ; [.22FC.0020.001A][.2286.0020.001A] -FCC4 ; [.22FC.0020.0017][.229D.0020.0017] -FC38 ; [.22FC.0020.001A][.229D.0020.001A] -FCC5 ; [.22FC.0020.0017][.22A4.0020.0017] -FC39 ; [.22FC.0020.001A][.22A4.0020.001A] -FCC6 ; [.22FC.0020.0017][.22A5.0020.0017] -FC3A ; [.22FC.0020.001A][.22A5.0020.001A] -FCC7 ; [.22FC.0020.0017][.2311.0020.0017] -FCEB ; [.22FC.0020.0018][.2311.0020.0018] -FC81 ; [.22FC.0020.0019][.2311.0020.0019] -FC3B ; [.22FC.0020.001A][.2311.0020.001A] -FCC8 ; [.22FC.0020.0017][.2318.0020.0017] -FCEC ; [.22FC.0020.0018][.2318.0020.0018] -FC82 ; [.22FC.0020.0019][.2318.0020.0019] -FC3C ; [.22FC.0020.001A][.2318.0020.001A] -FDC3 ; [.22FC.0020.0017][.2318.0020.0017][.2318.0020.0017] -FDBB ; [.22FC.0020.0019][.2318.0020.0019][.2318.0020.0019] -FDB7 ; [.22FC.0020.0019][.2318.0020.0019][.233A.0020.0019] -FC83 ; [.22FC.0020.0019][.2339.0020.0019] -FC3D ; [.22FC.0020.001A][.2339.0020.001A] -FC84 ; [.22FC.0020.0019][.233A.0020.0019] -FC3E ; [.22FC.0020.001A][.233A.0020.001A] -06A9 ; [.22FD.0020.0002] -FB90 ; [.22FD.0020.0017] -FB91 ; [.22FD.0020.0018] -FB8F ; [.22FD.0020.0019] -FB8E ; [.22FD.0020.001A] -06AA ; [.22FE.0020.0002] -06AB ; [.22FF.0020.0002] -06AC ; [.2300.0020.0002] -077F ; [.2301.0020.0002] -06AD ; [.2302.0020.0002] -FBD5 ; [.2302.0020.0017] -FBD6 ; [.2302.0020.0018] -FBD4 ; [.2302.0020.0019] -FBD3 ; [.2302.0020.001A] -06AE ; [.2303.0020.0002] -08B4 ; [.2304.0020.0002] -06AF ; [.2305.0020.0002] -FB94 ; [.2305.0020.0017] -FB95 ; [.2305.0020.0018] -FB93 ; [.2305.0020.0019] -FB92 ; [.2305.0020.001A] -08B0 ; [.2306.0020.0002] -06B0 ; [.2307.0020.0002] -06B1 ; [.2308.0020.0002] -FB9C ; [.2308.0020.0017] -FB9D ; [.2308.0020.0018] -FB9B ; [.2308.0020.0019] -FB9A ; [.2308.0020.001A] -06B2 ; [.2309.0020.0002] -06B3 ; [.230A.0020.0002] -FB98 ; [.230A.0020.0017] -FB99 ; [.230A.0020.0018] -FB97 ; [.230A.0020.0019] -FB96 ; [.230A.0020.001A] -06B4 ; [.230B.0020.0002] -0762 ; [.230C.0020.0002] -063B ; [.230D.0020.0002] -063C ; [.230E.0020.0002] -0763 ; [.230F.0020.0002] -0764 ; [.2310.0020.0002] -0644 ; [.2311.0020.0002] -1EE0B ; [.2311.0020.0005] -1EE2B ; [.2311.0020.0005] -1EE4B ; [.2311.0020.0005] -1EE8B ; [.2311.0020.0005] -1EEAB ; [.2311.0020.0005] -FEDF ; [.2311.0020.0017] -FEE0 ; [.2311.0020.0018] -FEDE ; [.2311.0020.0019] -FEDD ; [.2311.0020.001A] -FEF6 ; [.2311.0020.0019][.2279.0020.0019] -FEF5 ; [.2311.0020.001A][.2279.0020.001A] -FEF8 ; [.2311.0020.0019][.227A.0020.0019] -FEF7 ; [.2311.0020.001A][.227A.0020.001A] -FEFA ; [.2311.0020.0019][.227E.0020.0019] -FEF9 ; [.2311.0020.001A][.227E.0020.001A] -FEFC ; [.2311.0020.0019][.2286.0020.0019] -FEFB ; [.2311.0020.001A][.2286.0020.001A] -FCC9 ; [.2311.0020.0017][.229D.0020.0017] -FC3F ; [.2311.0020.001A][.229D.0020.001A] -FD83 ; [.2311.0020.0017][.229D.0020.0017][.229D.0020.0017] -FD84 ; [.2311.0020.0019][.229D.0020.0019][.229D.0020.0019] -FDBA ; [.2311.0020.0017][.229D.0020.0017][.2318.0020.0017] -FDBC ; [.2311.0020.0019][.229D.0020.0019][.2318.0020.0019] -FDAC ; [.2311.0020.0019][.229D.0020.0019][.233A.0020.0019] -FCCA ; [.2311.0020.0017][.22A4.0020.0017] -FC40 ; [.2311.0020.001A][.22A4.0020.001A] -FDB5 ; [.2311.0020.0017][.22A4.0020.0017][.2318.0020.0017] -FD80 ; [.2311.0020.0019][.22A4.0020.0019][.2318.0020.0019] -FD82 ; [.2311.0020.0019][.22A4.0020.0019][.2339.0020.0019] -FD81 ; [.2311.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FCCB ; [.2311.0020.0017][.22A5.0020.0017] -FC41 ; [.2311.0020.001A][.22A5.0020.001A] -FD86 ; [.2311.0020.0017][.22A5.0020.0017][.2318.0020.0017] -FD85 ; [.2311.0020.0019][.22A5.0020.0019][.2318.0020.0019] -FCCC ; [.2311.0020.0017][.2318.0020.0017] -FCED ; [.2311.0020.0018][.2318.0020.0018] -FC85 ; [.2311.0020.0019][.2318.0020.0019] -FC42 ; [.2311.0020.001A][.2318.0020.001A] -FD88 ; [.2311.0020.0017][.2318.0020.0017][.22A4.0020.0017] -FD87 ; [.2311.0020.0019][.2318.0020.0019][.22A4.0020.0019] -FDAD ; [.2311.0020.0019][.2318.0020.0019][.233A.0020.0019] -FCCD ; [.2311.0020.0017][.2325.0020.0017] -FC86 ; [.2311.0020.0019][.2339.0020.0019] -FC43 ; [.2311.0020.001A][.2339.0020.001A] -FC87 ; [.2311.0020.0019][.233A.0020.0019] -FC44 ; [.2311.0020.001A][.233A.0020.001A] -06B5 ; [.2312.0020.0002] -06B6 ; [.2313.0020.0002] -06B7 ; [.2314.0020.0002] -06B8 ; [.2315.0020.0002] -076A ; [.2316.0020.0002] -08A6 ; [.2317.0020.0002] -0645 ; [.2318.0020.0002] -1EE0C ; [.2318.0020.0005] -1EE2C ; [.2318.0020.0005] -1EE6C ; [.2318.0020.0005] -1EE8C ; [.2318.0020.0005] -1EEAC ; [.2318.0020.0005] -FEE3 ; [.2318.0020.0017] -FEE4 ; [.2318.0020.0018] -FEE2 ; [.2318.0020.0019] -FEE1 ; [.2318.0020.001A] -06FE ; [.2318.0020.0004][.0000.010C.0004] -FC88 ; [.2318.0020.0019][.2286.0020.0019] -FCCE ; [.2318.0020.0017][.229D.0020.0017] -FC45 ; [.2318.0020.001A][.229D.0020.001A] -FD8C ; [.2318.0020.0017][.229D.0020.0017][.22A4.0020.0017] -FD92 ; [.2318.0020.0017][.229D.0020.0017][.22A5.0020.0017] -FD8D ; [.2318.0020.0017][.229D.0020.0017][.2318.0020.0017] -FDC0 ; [.2318.0020.0019][.229D.0020.0019][.233A.0020.0019] -FCCF ; [.2318.0020.0017][.22A4.0020.0017] -FC46 ; [.2318.0020.001A][.22A4.0020.001A] -FD89 ; [.2318.0020.0017][.22A4.0020.0017][.229D.0020.0017] -FD8A ; [.2318.0020.0017][.22A4.0020.0017][.2318.0020.0017] -FDF4 ; [.2318.0020.001A][.22A4.0020.001A][.2318.0020.001A][.22AF.0020.001A] -FD8B ; [.2318.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FCD0 ; [.2318.0020.0017][.22A5.0020.0017] -FC47 ; [.2318.0020.001A][.22A5.0020.001A] -FD8E ; [.2318.0020.0017][.22A5.0020.0017][.229D.0020.0017] -FD8F ; [.2318.0020.0017][.22A5.0020.0017][.2318.0020.0017] -FDB9 ; [.2318.0020.0019][.22A5.0020.0019][.233A.0020.0019] -FCD1 ; [.2318.0020.0017][.2318.0020.0017] -FC89 ; [.2318.0020.0019][.2318.0020.0019] -FC48 ; [.2318.0020.001A][.2318.0020.001A] -FDB1 ; [.2318.0020.0019][.2318.0020.0019][.233A.0020.0019] -FC49 ; [.2318.0020.001A][.2339.0020.001A] -FC4A ; [.2318.0020.001A][.233A.0020.001A] -0765 ; [.2319.0020.0002] -0766 ; [.231A.0020.0002] -08A7 ; [.231B.0020.0002] -0646 ; [.231C.0020.0002] -1EE0D ; [.231C.0020.0005] -1EE2D ; [.231C.0020.0005] -1EE4D ; [.231C.0020.0005] -1EE6D ; [.231C.0020.0005] -1EE8D ; [.231C.0020.0005] -1EEAD ; [.231C.0020.0005] -FEE7 ; [.231C.0020.0017] -FEE8 ; [.231C.0020.0018] -FEE6 ; [.231C.0020.0019] -FEE5 ; [.231C.0020.001A] -FCD2 ; [.231C.0020.0017][.229D.0020.0017] -FC4B ; [.231C.0020.001A][.229D.0020.001A] -FDB8 ; [.231C.0020.0017][.229D.0020.0017][.22A4.0020.0017] -FDBD ; [.231C.0020.0019][.229D.0020.0019][.22A4.0020.0019] -FD98 ; [.231C.0020.0017][.229D.0020.0017][.2318.0020.0017] -FD97 ; [.231C.0020.0019][.229D.0020.0019][.2318.0020.0019] -FD99 ; [.231C.0020.0019][.229D.0020.0019][.2339.0020.0019] -FDC7 ; [.231C.0020.0019][.229D.0020.0019][.233A.0020.0019] -FCD3 ; [.231C.0020.0017][.22A4.0020.0017] -FC4C ; [.231C.0020.001A][.22A4.0020.001A] -FD95 ; [.231C.0020.0017][.22A4.0020.0017][.2318.0020.0017] -FD96 ; [.231C.0020.0019][.22A4.0020.0019][.2339.0020.0019] -FDB3 ; [.231C.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FCD4 ; [.231C.0020.0017][.22A5.0020.0017] -FC4D ; [.231C.0020.001A][.22A5.0020.001A] -FC8A ; [.231C.0020.0019][.22BE.0020.0019] -FC8B ; [.231C.0020.0019][.22BF.0020.0019] -FCD5 ; [.231C.0020.0017][.2318.0020.0017] -FCEE ; [.231C.0020.0018][.2318.0020.0018] -FC8C ; [.231C.0020.0019][.2318.0020.0019] -FC4E ; [.231C.0020.001A][.2318.0020.001A] -FD9B ; [.231C.0020.0019][.2318.0020.0019][.2339.0020.0019] -FD9A ; [.231C.0020.0019][.2318.0020.0019][.233A.0020.0019] -FC8D ; [.231C.0020.0019][.231C.0020.0019] -FCD6 ; [.231C.0020.0017][.2325.0020.0017] -FCEF ; [.231C.0020.0018][.2325.0020.0018] -FC8E ; [.231C.0020.0019][.2339.0020.0019] -FC4F ; [.231C.0020.001A][.2339.0020.001A] -FC8F ; [.231C.0020.0019][.233A.0020.0019] -FC50 ; [.231C.0020.001A][.233A.0020.001A] -06BA ; [.231D.0020.0002] -1EE1D ; [.231D.0020.0005] -1EE5D ; [.231D.0020.0005] -FB9F ; [.231D.0020.0019] -FB9E ; [.231D.0020.001A] -06BB ; [.231E.0020.0002] -FBA2 ; [.231E.0020.0017] -FBA3 ; [.231E.0020.0018] -FBA1 ; [.231E.0020.0019] -FBA0 ; [.231E.0020.001A] -06BC ; [.231F.0020.0002] -06BD ; [.2320.0020.0002] -06B9 ; [.2321.0020.0002] -0767 ; [.2322.0020.0002] -0768 ; [.2323.0020.0002] -0769 ; [.2324.0020.0002] -0647 ; [.2325.0020.0002] -1EE24 ; [.2325.0020.0005] -1EE64 ; [.2325.0020.0005] -1EE84 ; [.2325.0020.0005] -FEEB ; [.2325.0020.0017] -FEEC ; [.2325.0020.0018] -FEEA ; [.2325.0020.0019] -FEE9 ; [.2325.0020.001A] -FCD9 ; [.2325.0020.0017][.0000.0098.0017] -FCD7 ; [.2325.0020.0017][.229D.0020.0017] -FC51 ; [.2325.0020.001A][.229D.0020.001A] -FCD8 ; [.2325.0020.0017][.2318.0020.0017] -FC52 ; [.2325.0020.001A][.2318.0020.001A] -FD93 ; [.2325.0020.0017][.2318.0020.0017][.229D.0020.0017] -FD94 ; [.2325.0020.0017][.2318.0020.0017][.2318.0020.0017] -FC53 ; [.2325.0020.001A][.2339.0020.001A] -FC54 ; [.2325.0020.001A][.233A.0020.001A] -06BE ; [.2326.0020.0002] -FBAC ; [.2326.0020.0017] -FBAD ; [.2326.0020.0018] -FBAB ; [.2326.0020.0019] -FBAA ; [.2326.0020.001A] -06C1 ; [.2327.0020.0002] -FBA8 ; [.2327.0020.0017] -FBA9 ; [.2327.0020.0018] -FBA7 ; [.2327.0020.0019] -FBA6 ; [.2327.0020.001A] -06C2 ; [.2327.0020.0002][.0000.0083.0002] -06C3 ; [.2328.0020.0002] -06FF ; [.2329.0020.0002] -06D5 ; [.232A.0020.0002] -06C0 ; [.232A.0020.0002][.0000.0083.0002] -FBA5 ; [.232A.0020.0019][.0000.0083.0019] -FBA4 ; [.232A.0020.001A][.0000.0083.001A] -0648 ; [.232B.0020.0002] -06E5 ; [.232B.0020.0004] -1EE05 ; [.232B.0020.0005] -1EE85 ; [.232B.0020.0005] -1EEA5 ; [.232B.0020.0005] -FEEE ; [.232B.0020.0019] -FEED ; [.232B.0020.001A] -0676 ; [.232B.0020.0004][.2278.0020.0004] -FDF8 ; [.232B.0020.001A][.22D0.0020.001A][.2311.0020.001A][.2318.0020.001A] -06C4 ; [.232C.0020.0002] -06C5 ; [.232D.0020.0002] -FBE1 ; [.232D.0020.0019] -FBE0 ; [.232D.0020.001A] -06C6 ; [.232E.0020.0002] -FBDA ; [.232E.0020.0019] -FBD9 ; [.232E.0020.001A] -06C7 ; [.232F.0020.0002] -FBD8 ; [.232F.0020.0019] -FBD7 ; [.232F.0020.001A] -0677 ; [.232F.0020.0004][.2278.0020.0004] -FBDD ; [.232F.0020.001A][.2278.0020.001A] -06C8 ; [.2330.0020.0002] -FBDC ; [.2330.0020.0019] -FBDB ; [.2330.0020.001A] -06C9 ; [.2331.0020.0002] -FBE3 ; [.2331.0020.0019] -FBE2 ; [.2331.0020.001A] -06CA ; [.2332.0020.0002] -06CB ; [.2333.0020.0002] -FBDF ; [.2333.0020.0019] -FBDE ; [.2333.0020.001A] -08B1 ; [.2334.0020.0002] -06CF ; [.2335.0020.0002] -0778 ; [.2336.0020.0002] -0779 ; [.2337.0020.0002] -08AB ; [.2338.0020.0002] -0649 ; [.2339.0020.0002] -FBE8 ; [.2339.0020.0017] -FBE9 ; [.2339.0020.0018] -FEF0 ; [.2339.0020.0019] -FEEF ; [.2339.0020.001A] -FC90 ; [.2339.0020.0019][.0000.0098.0019] -FC5D ; [.2339.0020.001A][.0000.0098.001A] -064A ; [.233A.0020.0002] -06E6 ; [.233A.0020.0004] -1EE09 ; [.233A.0020.0005] -1EE29 ; [.233A.0020.0005] -1EE49 ; [.233A.0020.0005] -1EE69 ; [.233A.0020.0005] -1EE89 ; [.233A.0020.0005] -1EEA9 ; [.233A.0020.0005] -FEF3 ; [.233A.0020.0017] -FEF4 ; [.233A.0020.0018] -FEF2 ; [.233A.0020.0019] -FEF1 ; [.233A.0020.001A] -0678 ; [.233A.0020.0004][.2278.0020.0004] -FCDA ; [.233A.0020.0017][.229D.0020.0017] -FC55 ; [.233A.0020.001A][.229D.0020.001A] -FDAF ; [.233A.0020.0019][.229D.0020.0019][.233A.0020.0019] -FCDB ; [.233A.0020.0017][.22A4.0020.0017] -FC56 ; [.233A.0020.001A][.22A4.0020.001A] -FDAE ; [.233A.0020.0019][.22A4.0020.0019][.233A.0020.0019] -FCDC ; [.233A.0020.0017][.22A5.0020.0017] -FC57 ; [.233A.0020.001A][.22A5.0020.001A] -FC91 ; [.233A.0020.0019][.22BE.0020.0019] -FC92 ; [.233A.0020.0019][.22BF.0020.0019] -FCDD ; [.233A.0020.0017][.2318.0020.0017] -FCF0 ; [.233A.0020.0018][.2318.0020.0018] -FC93 ; [.233A.0020.0019][.2318.0020.0019] -FC58 ; [.233A.0020.001A][.2318.0020.001A] -FD9D ; [.233A.0020.0017][.2318.0020.0017][.2318.0020.0017] -FD9C ; [.233A.0020.0019][.2318.0020.0019][.2318.0020.0019] -FDB0 ; [.233A.0020.0019][.2318.0020.0019][.233A.0020.0019] -FC94 ; [.233A.0020.0019][.231C.0020.0019] -FCDE ; [.233A.0020.0017][.2325.0020.0017] -FCF1 ; [.233A.0020.0018][.2325.0020.0018] -FC95 ; [.233A.0020.0019][.2339.0020.0019] -FC59 ; [.233A.0020.001A][.2339.0020.001A] -FC96 ; [.233A.0020.0019][.233A.0020.0019] -FC5A ; [.233A.0020.001A][.233A.0020.001A] -06CC ; [.233B.0020.0002] -FBFE ; [.233B.0020.0017] -FBFF ; [.233B.0020.0018] -FBFD ; [.233B.0020.0019] -FBFC ; [.233B.0020.001A] -06CD ; [.233C.0020.0002] -06CE ; [.233D.0020.0002] -06D0 ; [.233E.0020.0002] -FBE6 ; [.233E.0020.0017] -FBE7 ; [.233E.0020.0018] -FBE5 ; [.233E.0020.0019] -FBE4 ; [.233E.0020.001A] -06D1 ; [.233F.0020.0002] -063D ; [.2340.0020.0002] -063E ; [.2341.0020.0002] -063F ; [.2342.0020.0002] -0620 ; [.2343.0020.0002] -0775 ; [.2344.0020.0002] -0776 ; [.2345.0020.0002] -0777 ; [.2346.0020.0002] -06D2 ; [.2347.0020.0002] -FBAF ; [.2347.0020.0019] -FBAE ; [.2347.0020.001A] -06D3 ; [.2347.0020.0002][.0000.0083.0002] -FBB1 ; [.2347.0020.0019][.0000.0083.0019] -FBB0 ; [.2347.0020.001A][.0000.0083.001A] -077A ; [.2348.0020.0002] -077B ; [.2349.0020.0002] -0710 ; [.234A.0020.0002] -0712 ; [.234B.0020.0002] -072D ; [.234B.0020.0004][.0000.010D.0004] -0713 ; [.234C.0020.0002] -0714 ; [.234C.0020.0004][.0000.010C.0004] -072E ; [.234C.0020.0004][.0000.010D.0004] -0716 ; [.234D.0020.0002] -0715 ; [.234E.0020.0002] -072F ; [.234E.0020.0004][.0000.010D.0004] -0717 ; [.234F.0020.0002] -0718 ; [.2350.0020.0002] -0719 ; [.2351.0020.0002] -074D ; [.2352.0020.0002] -071A ; [.2353.0020.0002] -071B ; [.2354.0020.0002] -071C ; [.2354.0020.0004][.0000.010C.0004] -071D ; [.2355.0020.0002] -071E ; [.2356.0020.0002] -071F ; [.2357.0020.0002] -074E ; [.2358.0020.0002] -0720 ; [.2359.0020.0002] -0721 ; [.235A.0020.0002] -0722 ; [.235B.0020.0002] -0723 ; [.235C.0020.0002] -0724 ; [.235C.0020.0019] -0725 ; [.235D.0020.0002] -0726 ; [.235E.0020.0002] -0727 ; [.235E.0020.0004][.0000.010C.0004] -074F ; [.235F.0020.0002] -0728 ; [.2360.0020.0002] -0729 ; [.2361.0020.0002] -072A ; [.2362.0020.0002] -072B ; [.2363.0020.0002] -072C ; [.2364.0020.0002] -0840 ; [.2365.0020.0002] -0841 ; [.2366.0020.0002] -0842 ; [.2367.0020.0002] -0843 ; [.2368.0020.0002] -0844 ; [.2369.0020.0002] -0845 ; [.236A.0020.0002] -0846 ; [.236B.0020.0002] -0847 ; [.236C.0020.0002] -0848 ; [.236D.0020.0002] -0849 ; [.236E.0020.0002] -084A ; [.236F.0020.0002] -084B ; [.2370.0020.0002] -084C ; [.2371.0020.0002] -084D ; [.2372.0020.0002] -084E ; [.2373.0020.0002] -084F ; [.2374.0020.0002] -0850 ; [.2375.0020.0002] -0851 ; [.2376.0020.0002] -0852 ; [.2377.0020.0002] -0853 ; [.2378.0020.0002] -0854 ; [.2379.0020.0002] -0855 ; [.237A.0020.0002] -0856 ; [.237B.0020.0002] -0857 ; [.237C.0020.0002] -0858 ; [.237D.0020.0002] -0780 ; [.237E.0020.0002] -0799 ; [.237F.0020.0002] -079A ; [.2380.0020.0002] -0781 ; [.2381.0020.0002] -0782 ; [.2382.0020.0002] -0783 ; [.2383.0020.0002] -079C ; [.2384.0020.0002] -0784 ; [.2385.0020.0002] -0785 ; [.2386.0020.0002] -0786 ; [.2387.0020.0002] -0787 ; [.2388.0020.0002] -07A2 ; [.2389.0020.0002] -07A3 ; [.238A.0020.0002] -0788 ; [.238B.0020.0002] -07A5 ; [.238C.0020.0002] -0789 ; [.238D.0020.0002] -078A ; [.238E.0020.0002] -078B ; [.238F.0020.0002] -079B ; [.2390.0020.0002] -078C ; [.2391.0020.0002] -0798 ; [.2392.0020.0002] -07A0 ; [.2393.0020.0002] -07A1 ; [.2394.0020.0002] -078D ; [.2395.0020.0002] -078E ; [.2396.0020.0002] -07A4 ; [.2397.0020.0002] -078F ; [.2398.0020.0002] -0790 ; [.2399.0020.0002] -079D ; [.239A.0020.0002] -079E ; [.239B.0020.0002] -079F ; [.239C.0020.0002] -0791 ; [.239D.0020.0002] -0792 ; [.239E.0020.0002] -0793 ; [.239F.0020.0002] -0794 ; [.23A0.0020.0002] -0795 ; [.23A1.0020.0002] -0796 ; [.23A2.0020.0002] -0797 ; [.23A3.0020.0002] -07B1 ; [.23A4.0020.0002] -07A6 ; [.23A5.0020.0002] -07A7 ; [.23A6.0020.0002] -07A8 ; [.23A7.0020.0002] -07A9 ; [.23A8.0020.0002] -07AA ; [.23A9.0020.0002] -07AB ; [.23AA.0020.0002] -07AC ; [.23AB.0020.0002] -07AD ; [.23AC.0020.0002] -07AE ; [.23AD.0020.0002] -07AF ; [.23AE.0020.0002] -07B0 ; [.23AF.0020.0002] -07CA ; [.23B0.0020.0002] -07CB ; [.23B1.0020.0002] -07CC ; [.23B2.0020.0002] -07CD ; [.23B3.0020.0002] -07CE ; [.23B4.0020.0002] -07CF ; [.23B5.0020.0002] -07D0 ; [.23B6.0020.0002] -07D1 ; [.23B7.0020.0002] -07D2 ; [.23B8.0020.0002] -07D3 ; [.23B9.0020.0002] -07D4 ; [.23BA.0020.0002] -07D5 ; [.23BB.0020.0002] -07D6 ; [.23BC.0020.0002] -07E8 ; [.23BC.0020.0004][.0000.010B.0004] -07D7 ; [.23BD.0020.0002] -07E9 ; [.23BD.0020.0004][.0000.010B.0004] -07D8 ; [.23BE.0020.0002] -07D9 ; [.23BF.0020.0002] -07EA ; [.23BF.0020.0004][.0000.010B.0004] -07DA ; [.23C0.0020.0002] -07DB ; [.23C1.0020.0002] -07DC ; [.23C2.0020.0002] -07DD ; [.23C3.0020.0002] -07DE ; [.23C4.0020.0002] -07DF ; [.23C5.0020.0002] -07E0 ; [.23C6.0020.0002] -07E1 ; [.23C7.0020.0002] -07E2 ; [.23C8.0020.0002] -07E3 ; [.23C9.0020.0002] -07E4 ; [.23CA.0020.0002] -07E5 ; [.23CB.0020.0002] -07E6 ; [.23CC.0020.0002] -07E7 ; [.23CD.0020.0002] -07F4 ; [.23CE.0020.0002] -07F5 ; [.23CF.0020.0002] -2D30 ; [.23D0.0020.0002] -2D31 ; [.23D1.0020.0002] -2D32 ; [.23D2.0020.0002] -2D33 ; [.23D3.0020.0002] -2D34 ; [.23D4.0020.0002] -2D35 ; [.23D5.0020.0002] -2D36 ; [.23D6.0020.0002] -2D37 ; [.23D7.0020.0002] -2D38 ; [.23D8.0020.0002] -2D39 ; [.23D9.0020.0002] -2D3A ; [.23DA.0020.0002] -2D3B ; [.23DB.0020.0002] -2D66 ; [.23DC.0020.0002] -2D3C ; [.23DD.0020.0002] -2D3D ; [.23DE.0020.0002] -2D3E ; [.23DF.0020.0002] -2D3F ; [.23E0.0020.0002] -2D40 ; [.23E1.0020.0002] -2D41 ; [.23E2.0020.0002] -2D42 ; [.23E3.0020.0002] -2D43 ; [.23E4.0020.0002] -2D44 ; [.23E5.0020.0002] -2D45 ; [.23E6.0020.0002] -2D46 ; [.23E7.0020.0002] -2D47 ; [.23E8.0020.0002] -2D48 ; [.23E9.0020.0002] -2D49 ; [.23EA.0020.0002] -2D4A ; [.23EB.0020.0002] -2D4B ; [.23EC.0020.0002] -2D4C ; [.23ED.0020.0002] -2D4D ; [.23EE.0020.0002] -2D4E ; [.23EF.0020.0002] -2D4F ; [.23F0.0020.0002] -2D50 ; [.23F1.0020.0002] -2D51 ; [.23F2.0020.0002] -2D52 ; [.23F3.0020.0002] -2D53 ; [.23F4.0020.0002] -2D67 ; [.23F5.0020.0002] -2D54 ; [.23F6.0020.0002] -2D55 ; [.23F7.0020.0002] -2D56 ; [.23F8.0020.0002] -2D57 ; [.23F9.0020.0002] -2D58 ; [.23FA.0020.0002] -2D59 ; [.23FB.0020.0002] -2D5A ; [.23FC.0020.0002] -2D5B ; [.23FD.0020.0002] -2D5C ; [.23FE.0020.0002] -2D5D ; [.23FF.0020.0002] -2D5E ; [.2400.0020.0002] -2D5F ; [.2401.0020.0002] -2D60 ; [.2402.0020.0002] -2D61 ; [.2403.0020.0002] -2D62 ; [.2404.0020.0002] -2D63 ; [.2405.0020.0002] -2D64 ; [.2406.0020.0002] -2D65 ; [.2407.0020.0002] -2D6F ; [.2408.0020.0002] -1200 ; [.2409.0020.0002] -1201 ; [.240A.0020.0002] -1202 ; [.240B.0020.0002] -1203 ; [.240C.0020.0002] -1204 ; [.240D.0020.0002] -1205 ; [.240E.0020.0002] -1206 ; [.240F.0020.0002] -1207 ; [.2410.0020.0002] -1208 ; [.2411.0020.0002] -1209 ; [.2412.0020.0002] -120A ; [.2413.0020.0002] -120B ; [.2414.0020.0002] -120C ; [.2415.0020.0002] -120D ; [.2416.0020.0002] -120E ; [.2417.0020.0002] -120F ; [.2418.0020.0002] -2D80 ; [.2419.0020.0002] -1210 ; [.241A.0020.0002] -1211 ; [.241B.0020.0002] -1212 ; [.241C.0020.0002] -1213 ; [.241D.0020.0002] -1214 ; [.241E.0020.0002] -1215 ; [.241F.0020.0002] -1216 ; [.2420.0020.0002] -1217 ; [.2421.0020.0002] -1218 ; [.2422.0020.0002] -1219 ; [.2423.0020.0002] -121A ; [.2424.0020.0002] -121B ; [.2425.0020.0002] -121C ; [.2426.0020.0002] -121D ; [.2427.0020.0002] -121E ; [.2428.0020.0002] -121F ; [.2429.0020.0002] -1380 ; [.242A.0020.0002] -1381 ; [.242B.0020.0002] -1382 ; [.242C.0020.0002] -1383 ; [.242D.0020.0002] -2D81 ; [.242E.0020.0002] -1220 ; [.242F.0020.0002] -1221 ; [.2430.0020.0002] -1222 ; [.2431.0020.0002] -1223 ; [.2432.0020.0002] -1224 ; [.2433.0020.0002] -1225 ; [.2434.0020.0002] -1226 ; [.2435.0020.0002] -1227 ; [.2436.0020.0002] -1228 ; [.2437.0020.0002] -1229 ; [.2438.0020.0002] -122A ; [.2439.0020.0002] -122B ; [.243A.0020.0002] -122C ; [.243B.0020.0002] -122D ; [.243C.0020.0002] -122E ; [.243D.0020.0002] -122F ; [.243E.0020.0002] -2D82 ; [.243F.0020.0002] -1230 ; [.2440.0020.0002] -1231 ; [.2441.0020.0002] -1232 ; [.2442.0020.0002] -1233 ; [.2443.0020.0002] -1234 ; [.2444.0020.0002] -1235 ; [.2445.0020.0002] -1236 ; [.2446.0020.0002] -1237 ; [.2447.0020.0002] -2D83 ; [.2448.0020.0002] -AB01 ; [.2449.0020.0002] -AB02 ; [.244A.0020.0002] -AB03 ; [.244B.0020.0002] -AB04 ; [.244C.0020.0002] -AB05 ; [.244D.0020.0002] -AB06 ; [.244E.0020.0002] -1238 ; [.244F.0020.0002] -1239 ; [.2450.0020.0002] -123A ; [.2451.0020.0002] -123B ; [.2452.0020.0002] -123C ; [.2453.0020.0002] -123D ; [.2454.0020.0002] -123E ; [.2455.0020.0002] -123F ; [.2456.0020.0002] -2D84 ; [.2457.0020.0002] -1240 ; [.2458.0020.0002] -1241 ; [.2459.0020.0002] -1242 ; [.245A.0020.0002] -1243 ; [.245B.0020.0002] -1244 ; [.245C.0020.0002] -1245 ; [.245D.0020.0002] -1246 ; [.245E.0020.0002] -1247 ; [.245F.0020.0002] -1248 ; [.2460.0020.0002] -124A ; [.2461.0020.0002] -124B ; [.2462.0020.0002] -124C ; [.2463.0020.0002] -124D ; [.2464.0020.0002] -1250 ; [.2465.0020.0002] -1251 ; [.2466.0020.0002] -1252 ; [.2467.0020.0002] -1253 ; [.2468.0020.0002] -1254 ; [.2469.0020.0002] -1255 ; [.246A.0020.0002] -1256 ; [.246B.0020.0002] -1258 ; [.246C.0020.0002] -125A ; [.246D.0020.0002] -125B ; [.246E.0020.0002] -125C ; [.246F.0020.0002] -125D ; [.2470.0020.0002] -1260 ; [.2471.0020.0002] -1261 ; [.2472.0020.0002] -1262 ; [.2473.0020.0002] -1263 ; [.2474.0020.0002] -1264 ; [.2475.0020.0002] -1265 ; [.2476.0020.0002] -1266 ; [.2477.0020.0002] -1267 ; [.2478.0020.0002] -1384 ; [.2479.0020.0002] -1385 ; [.247A.0020.0002] -1386 ; [.247B.0020.0002] -1387 ; [.247C.0020.0002] -2D85 ; [.247D.0020.0002] -1268 ; [.247E.0020.0002] -1269 ; [.247F.0020.0002] -126A ; [.2480.0020.0002] -126B ; [.2481.0020.0002] -126C ; [.2482.0020.0002] -126D ; [.2483.0020.0002] -126E ; [.2484.0020.0002] -126F ; [.2485.0020.0002] -1270 ; [.2486.0020.0002] -1271 ; [.2487.0020.0002] -1272 ; [.2488.0020.0002] -1273 ; [.2489.0020.0002] -1274 ; [.248A.0020.0002] -1275 ; [.248B.0020.0002] -1276 ; [.248C.0020.0002] -1277 ; [.248D.0020.0002] -2D86 ; [.248E.0020.0002] -1278 ; [.248F.0020.0002] -1279 ; [.2490.0020.0002] -127A ; [.2491.0020.0002] -127B ; [.2492.0020.0002] -127C ; [.2493.0020.0002] -127D ; [.2494.0020.0002] -127E ; [.2495.0020.0002] -127F ; [.2496.0020.0002] -2D87 ; [.2497.0020.0002] -1280 ; [.2498.0020.0002] -1281 ; [.2499.0020.0002] -1282 ; [.249A.0020.0002] -1283 ; [.249B.0020.0002] -1284 ; [.249C.0020.0002] -1285 ; [.249D.0020.0002] -1286 ; [.249E.0020.0002] -1287 ; [.249F.0020.0002] -1288 ; [.24A0.0020.0002] -128A ; [.24A1.0020.0002] -128B ; [.24A2.0020.0002] -128C ; [.24A3.0020.0002] -128D ; [.24A4.0020.0002] -1290 ; [.24A5.0020.0002] -1291 ; [.24A6.0020.0002] -1292 ; [.24A7.0020.0002] -1293 ; [.24A8.0020.0002] -1294 ; [.24A9.0020.0002] -1295 ; [.24AA.0020.0002] -1296 ; [.24AB.0020.0002] -1297 ; [.24AC.0020.0002] -2D88 ; [.24AD.0020.0002] -1298 ; [.24AE.0020.0002] -1299 ; [.24AF.0020.0002] -129A ; [.24B0.0020.0002] -129B ; [.24B1.0020.0002] -129C ; [.24B2.0020.0002] -129D ; [.24B3.0020.0002] -129E ; [.24B4.0020.0002] -129F ; [.24B5.0020.0002] -2D89 ; [.24B6.0020.0002] -12A0 ; [.24B7.0020.0002] -12A1 ; [.24B8.0020.0002] -12A2 ; [.24B9.0020.0002] -12A3 ; [.24BA.0020.0002] -12A4 ; [.24BB.0020.0002] -12A5 ; [.24BC.0020.0002] -12A6 ; [.24BD.0020.0002] -12A7 ; [.24BE.0020.0002] -2D8A ; [.24BF.0020.0002] -12A8 ; [.24C0.0020.0002] -12A9 ; [.24C1.0020.0002] -12AA ; [.24C2.0020.0002] -12AB ; [.24C3.0020.0002] -12AC ; [.24C4.0020.0002] -12AD ; [.24C5.0020.0002] -12AE ; [.24C6.0020.0002] -12AF ; [.24C7.0020.0002] -12B0 ; [.24C8.0020.0002] -12B2 ; [.24C9.0020.0002] -12B3 ; [.24CA.0020.0002] -12B4 ; [.24CB.0020.0002] -12B5 ; [.24CC.0020.0002] -12B8 ; [.24CD.0020.0002] -12B9 ; [.24CE.0020.0002] -12BA ; [.24CF.0020.0002] -12BB ; [.24D0.0020.0002] -12BC ; [.24D1.0020.0002] -12BD ; [.24D2.0020.0002] -12BE ; [.24D3.0020.0002] -12C0 ; [.24D4.0020.0002] -12C2 ; [.24D5.0020.0002] -12C3 ; [.24D6.0020.0002] -12C4 ; [.24D7.0020.0002] -12C5 ; [.24D8.0020.0002] -12C8 ; [.24D9.0020.0002] -12C9 ; [.24DA.0020.0002] -12CA ; [.24DB.0020.0002] -12CB ; [.24DC.0020.0002] -12CC ; [.24DD.0020.0002] -12CD ; [.24DE.0020.0002] -12CE ; [.24DF.0020.0002] -12CF ; [.24E0.0020.0002] -12D0 ; [.24E1.0020.0002] -12D1 ; [.24E2.0020.0002] -12D2 ; [.24E3.0020.0002] -12D3 ; [.24E4.0020.0002] -12D4 ; [.24E5.0020.0002] -12D5 ; [.24E6.0020.0002] -12D6 ; [.24E7.0020.0002] -12D8 ; [.24E8.0020.0002] -12D9 ; [.24E9.0020.0002] -12DA ; [.24EA.0020.0002] -12DB ; [.24EB.0020.0002] -12DC ; [.24EC.0020.0002] -12DD ; [.24ED.0020.0002] -12DE ; [.24EE.0020.0002] -12DF ; [.24EF.0020.0002] -2D8B ; [.24F0.0020.0002] -AB11 ; [.24F1.0020.0002] -AB12 ; [.24F2.0020.0002] -AB13 ; [.24F3.0020.0002] -AB14 ; [.24F4.0020.0002] -AB15 ; [.24F5.0020.0002] -AB16 ; [.24F6.0020.0002] -12E0 ; [.24F7.0020.0002] -12E1 ; [.24F8.0020.0002] -12E2 ; [.24F9.0020.0002] -12E3 ; [.24FA.0020.0002] -12E4 ; [.24FB.0020.0002] -12E5 ; [.24FC.0020.0002] -12E6 ; [.24FD.0020.0002] -12E7 ; [.24FE.0020.0002] -12E8 ; [.24FF.0020.0002] -12E9 ; [.2500.0020.0002] -12EA ; [.2501.0020.0002] -12EB ; [.2502.0020.0002] -12EC ; [.2503.0020.0002] -12ED ; [.2504.0020.0002] -12EE ; [.2505.0020.0002] -12EF ; [.2506.0020.0002] -12F0 ; [.2507.0020.0002] -12F1 ; [.2508.0020.0002] -12F2 ; [.2509.0020.0002] -12F3 ; [.250A.0020.0002] -12F4 ; [.250B.0020.0002] -12F5 ; [.250C.0020.0002] -12F6 ; [.250D.0020.0002] -12F7 ; [.250E.0020.0002] -2D8C ; [.250F.0020.0002] -AB09 ; [.2510.0020.0002] -AB0A ; [.2511.0020.0002] -AB0B ; [.2512.0020.0002] -AB0C ; [.2513.0020.0002] -AB0D ; [.2514.0020.0002] -AB0E ; [.2515.0020.0002] -12F8 ; [.2516.0020.0002] -12F9 ; [.2517.0020.0002] -12FA ; [.2518.0020.0002] -12FB ; [.2519.0020.0002] -12FC ; [.251A.0020.0002] -12FD ; [.251B.0020.0002] -12FE ; [.251C.0020.0002] -12FF ; [.251D.0020.0002] -2D8D ; [.251E.0020.0002] -1300 ; [.251F.0020.0002] -1301 ; [.2520.0020.0002] -1302 ; [.2521.0020.0002] -1303 ; [.2522.0020.0002] -1304 ; [.2523.0020.0002] -1305 ; [.2524.0020.0002] -1306 ; [.2525.0020.0002] -1307 ; [.2526.0020.0002] -2D8E ; [.2527.0020.0002] -1308 ; [.2528.0020.0002] -1309 ; [.2529.0020.0002] -130A ; [.252A.0020.0002] -130B ; [.252B.0020.0002] -130C ; [.252C.0020.0002] -130D ; [.252D.0020.0002] -130E ; [.252E.0020.0002] -130F ; [.252F.0020.0002] -1310 ; [.2530.0020.0002] -1312 ; [.2531.0020.0002] -1313 ; [.2532.0020.0002] -1314 ; [.2533.0020.0002] -1315 ; [.2534.0020.0002] -1318 ; [.2535.0020.0002] -1319 ; [.2536.0020.0002] -131A ; [.2537.0020.0002] -131B ; [.2538.0020.0002] -131C ; [.2539.0020.0002] -131D ; [.253A.0020.0002] -131E ; [.253B.0020.0002] -131F ; [.253C.0020.0002] -2D93 ; [.253D.0020.0002] -2D94 ; [.253E.0020.0002] -2D95 ; [.253F.0020.0002] -2D96 ; [.2540.0020.0002] -1320 ; [.2541.0020.0002] -1321 ; [.2542.0020.0002] -1322 ; [.2543.0020.0002] -1323 ; [.2544.0020.0002] -1324 ; [.2545.0020.0002] -1325 ; [.2546.0020.0002] -1326 ; [.2547.0020.0002] -1327 ; [.2548.0020.0002] -2D8F ; [.2549.0020.0002] -1328 ; [.254A.0020.0002] -1329 ; [.254B.0020.0002] -132A ; [.254C.0020.0002] -132B ; [.254D.0020.0002] -132C ; [.254E.0020.0002] -132D ; [.254F.0020.0002] -132E ; [.2550.0020.0002] -132F ; [.2551.0020.0002] -2D90 ; [.2552.0020.0002] -AB20 ; [.2553.0020.0002] -AB21 ; [.2554.0020.0002] -AB22 ; [.2555.0020.0002] -AB23 ; [.2556.0020.0002] -AB24 ; [.2557.0020.0002] -AB25 ; [.2558.0020.0002] -AB26 ; [.2559.0020.0002] -1330 ; [.255A.0020.0002] -1331 ; [.255B.0020.0002] -1332 ; [.255C.0020.0002] -1333 ; [.255D.0020.0002] -1334 ; [.255E.0020.0002] -1335 ; [.255F.0020.0002] -1336 ; [.2560.0020.0002] -1337 ; [.2561.0020.0002] -2D91 ; [.2562.0020.0002] -1338 ; [.2563.0020.0002] -1339 ; [.2564.0020.0002] -133A ; [.2565.0020.0002] -133B ; [.2566.0020.0002] -133C ; [.2567.0020.0002] -133D ; [.2568.0020.0002] -133E ; [.2569.0020.0002] -133F ; [.256A.0020.0002] -AB28 ; [.256B.0020.0002] -AB29 ; [.256C.0020.0002] -AB2A ; [.256D.0020.0002] -AB2B ; [.256E.0020.0002] -AB2C ; [.256F.0020.0002] -AB2D ; [.2570.0020.0002] -AB2E ; [.2571.0020.0002] -1340 ; [.2572.0020.0002] -1341 ; [.2573.0020.0002] -1342 ; [.2574.0020.0002] -1343 ; [.2575.0020.0002] -1344 ; [.2576.0020.0002] -1345 ; [.2577.0020.0002] -1346 ; [.2578.0020.0002] -1347 ; [.2579.0020.0002] -1348 ; [.257A.0020.0002] -1349 ; [.257B.0020.0002] -134A ; [.257C.0020.0002] -134B ; [.257D.0020.0002] -134C ; [.257E.0020.0002] -134D ; [.257F.0020.0002] -134E ; [.2580.0020.0002] -134F ; [.2581.0020.0002] -1388 ; [.2582.0020.0002] -1389 ; [.2583.0020.0002] -138A ; [.2584.0020.0002] -138B ; [.2585.0020.0002] -1350 ; [.2586.0020.0002] -1351 ; [.2587.0020.0002] -1352 ; [.2588.0020.0002] -1353 ; [.2589.0020.0002] -1354 ; [.258A.0020.0002] -1355 ; [.258B.0020.0002] -1356 ; [.258C.0020.0002] -1357 ; [.258D.0020.0002] -138C ; [.258E.0020.0002] -138D ; [.258F.0020.0002] -138E ; [.2590.0020.0002] -138F ; [.2591.0020.0002] -2D92 ; [.2592.0020.0002] -1358 ; [.2593.0020.0002] -1359 ; [.2594.0020.0002] -135A ; [.2595.0020.0002] -2DA0 ; [.2596.0020.0002] -2DA1 ; [.2597.0020.0002] -2DA2 ; [.2598.0020.0002] -2DA3 ; [.2599.0020.0002] -2DA4 ; [.259A.0020.0002] -2DA5 ; [.259B.0020.0002] -2DA6 ; [.259C.0020.0002] -2DA8 ; [.259D.0020.0002] -2DA9 ; [.259E.0020.0002] -2DAA ; [.259F.0020.0002] -2DAB ; [.25A0.0020.0002] -2DAC ; [.25A1.0020.0002] -2DAD ; [.25A2.0020.0002] -2DAE ; [.25A3.0020.0002] -2DB0 ; [.25A4.0020.0002] -2DB1 ; [.25A5.0020.0002] -2DB2 ; [.25A6.0020.0002] -2DB3 ; [.25A7.0020.0002] -2DB4 ; [.25A8.0020.0002] -2DB5 ; [.25A9.0020.0002] -2DB6 ; [.25AA.0020.0002] -2DB8 ; [.25AB.0020.0002] -2DB9 ; [.25AC.0020.0002] -2DBA ; [.25AD.0020.0002] -2DBB ; [.25AE.0020.0002] -2DBC ; [.25AF.0020.0002] -2DBD ; [.25B0.0020.0002] -2DBE ; [.25B1.0020.0002] -2DC0 ; [.25B2.0020.0002] -2DC1 ; [.25B3.0020.0002] -2DC2 ; [.25B4.0020.0002] -2DC3 ; [.25B5.0020.0002] -2DC4 ; [.25B6.0020.0002] -2DC5 ; [.25B7.0020.0002] -2DC6 ; [.25B8.0020.0002] -2DC8 ; [.25B9.0020.0002] -2DC9 ; [.25BA.0020.0002] -2DCA ; [.25BB.0020.0002] -2DCB ; [.25BC.0020.0002] -2DCC ; [.25BD.0020.0002] -2DCD ; [.25BE.0020.0002] -2DCE ; [.25BF.0020.0002] -2DD0 ; [.25C0.0020.0002] -2DD1 ; [.25C1.0020.0002] -2DD2 ; [.25C2.0020.0002] -2DD3 ; [.25C3.0020.0002] -2DD4 ; [.25C4.0020.0002] -2DD5 ; [.25C5.0020.0002] -2DD6 ; [.25C6.0020.0002] -2DD8 ; [.25C7.0020.0002] -2DD9 ; [.25C8.0020.0002] -2DDA ; [.25C9.0020.0002] -2DDB ; [.25CA.0020.0002] -2DDC ; [.25CB.0020.0002] -2DDD ; [.25CC.0020.0002] -2DDE ; [.25CD.0020.0002] -0950 ; [.25CE.0020.0002] -A8FD ; [.25CF.0020.0002] -0972 ; [.25D0.0020.0002] -0904 ; [.25D1.0020.0002] -0905 ; [.25D2.0020.0002] -0906 ; [.25D3.0020.0002] -0973 ; [.25D4.0020.0002] -0974 ; [.25D5.0020.0002] -0975 ; [.25D6.0020.0002] -0976 ; [.25D7.0020.0002] -0977 ; [.25D8.0020.0002] -0907 ; [.25D9.0020.0002] -0908 ; [.25DA.0020.0002] -0909 ; [.25DB.0020.0002] -090A ; [.25DC.0020.0002] -090B ; [.25DD.0020.0002] -0960 ; [.25DE.0020.0002] -090C ; [.25DF.0020.0002] -0961 ; [.25E0.0020.0002] -090D ; [.25E1.0020.0002] -090E ; [.25E2.0020.0002] -090F ; [.25E3.0020.0002] -0910 ; [.25E4.0020.0002] -0911 ; [.25E5.0020.0002] -0912 ; [.25E6.0020.0002] -0913 ; [.25E7.0020.0002] -0914 ; [.25E8.0020.0002] -0915 ; [.25E9.0020.0002] -0958 ; [.25E9.0020.0002][.0000.00BD.0002] -0916 ; [.25EA.0020.0002] -0959 ; [.25EA.0020.0002][.0000.00BD.0002] -0917 ; [.25EB.0020.0002] -095A ; [.25EB.0020.0002][.0000.00BD.0002] -097B ; [.25EC.0020.0002] -0918 ; [.25ED.0020.0002] -0919 ; [.25EE.0020.0002] -091A ; [.25EF.0020.0002] -091B ; [.25F0.0020.0002] -091C ; [.25F1.0020.0002] -095B ; [.25F1.0020.0002][.0000.00BD.0002] -0979 ; [.25F2.0020.0002] -097C ; [.25F3.0020.0002] -091D ; [.25F4.0020.0002] -091E ; [.25F5.0020.0002] -091F ; [.25F6.0020.0002] -0920 ; [.25F7.0020.0002] -0978 ; [.25F8.0020.0002] -0921 ; [.25F9.0020.0002] -095C ; [.25F9.0020.0002][.0000.00BD.0002] -097E ; [.25FA.0020.0002] -0922 ; [.25FB.0020.0002] -095D ; [.25FB.0020.0002][.0000.00BD.0002] -0923 ; [.25FC.0020.0002] -0924 ; [.25FD.0020.0002] -0925 ; [.25FE.0020.0002] -0926 ; [.25FF.0020.0002] -0927 ; [.2600.0020.0002] -0928 ; [.2601.0020.0002] -0929 ; [.2601.0020.0002][.0000.00BD.0002] -092A ; [.2602.0020.0002] -092B ; [.2603.0020.0002] -095E ; [.2603.0020.0002][.0000.00BD.0002] -092C ; [.2604.0020.0002] -097F ; [.2605.0020.0002] -092D ; [.2606.0020.0002] -092E ; [.2607.0020.0002] -092F ; [.2608.0020.0002] -095F ; [.2608.0020.0002][.0000.00BD.0002] -097A ; [.2609.0020.0002] -0930 ; [.260A.0020.0002] -0931 ; [.260A.0020.0002][.0000.00BD.0002] -0932 ; [.260B.0020.0002] -0933 ; [.260C.0020.0002] -0934 ; [.260C.0020.0002][.0000.00BD.0002] -0935 ; [.260D.0020.0002] -0936 ; [.260E.0020.0002] -0937 ; [.260F.0020.0002] -0938 ; [.2610.0020.0002] -0939 ; [.2611.0020.0002] -093D ; [.2612.0020.0002] -097D ; [.2613.0020.0002] -1CE9 ; [.2614.0020.0002] -1CEA ; [.2614.0020.0004] -1CEB ; [.2614.0020.0004] -1CEC ; [.2614.0020.0004] -1CEE ; [.2614.0020.0004] -1CEF ; [.2614.0020.0004] -1CF0 ; [.2614.0020.0004] -1CF1 ; [.2614.0020.0004] -1CF5 ; [.2615.0020.0002] -1CF6 ; [.2616.0020.0002] -A8F2 ; [.2617.0020.0002] -A8F3 ; [.2617.0020.0004] -A8F4 ; [.2617.0020.0004] -A8F5 ; [.2617.0020.0004] -A8F6 ; [.2617.0020.0004] -A8F7 ; [.2617.0020.0004] -A8FB ; [.2618.0020.0002] -093E ; [.2619.0020.0002] -093A ; [.261A.0020.0002] -093B ; [.261B.0020.0002] -094F ; [.261C.0020.0002] -0956 ; [.261D.0020.0002] -0957 ; [.261E.0020.0002] -093F ; [.261F.0020.0002] -0940 ; [.2620.0020.0002] -0941 ; [.2621.0020.0002] -0942 ; [.2622.0020.0002] -0943 ; [.2623.0020.0002] -0944 ; [.2624.0020.0002] -0962 ; [.2625.0020.0002] -0963 ; [.2626.0020.0002] -0945 ; [.2627.0020.0002] -0955 ; [.2628.0020.0002] -0946 ; [.2629.0020.0002] -0947 ; [.262A.0020.0002] -094E ; [.262B.0020.0002] -0948 ; [.262C.0020.0002] -0949 ; [.262D.0020.0002] -094A ; [.262E.0020.0002] -094B ; [.262F.0020.0002] -094C ; [.2630.0020.0002] -094D ; [.2631.0020.0002] -0980 ; [.2632.0020.0002] -0985 ; [.2633.0020.0002] -0986 ; [.2634.0020.0002] -0987 ; [.2635.0020.0002] -0988 ; [.2636.0020.0002] -0989 ; [.2637.0020.0002] -098A ; [.2638.0020.0002] -098B ; [.2639.0020.0002] -09E0 ; [.263A.0020.0002] -098C ; [.263B.0020.0002] -09E1 ; [.263C.0020.0002] -098F ; [.263D.0020.0002] -0990 ; [.263E.0020.0002] -0993 ; [.263F.0020.0002] -0994 ; [.2640.0020.0002] -0995 ; [.2641.0020.0002] -0996 ; [.2642.0020.0002] -0997 ; [.2643.0020.0002] -0998 ; [.2644.0020.0002] -0999 ; [.2645.0020.0002] -099A ; [.2646.0020.0002] -099B ; [.2647.0020.0002] -099C ; [.2648.0020.0002] -099D ; [.2649.0020.0002] -099E ; [.264A.0020.0002] -099F ; [.264B.0020.0002] -09A0 ; [.264C.0020.0002] -09A1 ; [.264D.0020.0002] -09DC ; [.264D.0020.0002][.0000.00BD.0002] -09A2 ; [.264E.0020.0002] -09DD ; [.264E.0020.0002][.0000.00BD.0002] -09A3 ; [.264F.0020.0002] -09A4 ; [.2650.0020.0002] -09CE ; [.2650.0020.0004][.2671.0020.0004] -09A5 ; [.2651.0020.0002] -09A6 ; [.2652.0020.0002] -09A7 ; [.2653.0020.0002] -09A8 ; [.2654.0020.0002] -09AA ; [.2655.0020.0002] -09AB ; [.2656.0020.0002] -09AC ; [.2657.0020.0002] -09AD ; [.2658.0020.0002] -09AE ; [.2659.0020.0002] -09AF ; [.265A.0020.0002] -09DF ; [.265A.0020.0002][.0000.00BD.0002] -09B0 ; [.265B.0020.0002] -09F0 ; [.265C.0020.0002] -09B2 ; [.265D.0020.0002] -09F1 ; [.265E.0020.0002] -09B6 ; [.265F.0020.0002] -09B7 ; [.2660.0020.0002] -09B8 ; [.2661.0020.0002] -09B9 ; [.2662.0020.0002] -09BD ; [.2663.0020.0002] -09BE ; [.2664.0020.0002] -09BF ; [.2665.0020.0002] -09C0 ; [.2666.0020.0002] -09C1 ; [.2667.0020.0002] -09C2 ; [.2668.0020.0002] -09C3 ; [.2669.0020.0002] -09C4 ; [.266A.0020.0002] -09E2 ; [.266B.0020.0002] -09E3 ; [.266C.0020.0002] -09C7 ; [.266D.0020.0002] -09C8 ; [.266E.0020.0002] -09CB ; [.266F.0020.0002] -09C7 09BE ; [.266F.0020.0002] -09CC ; [.2670.0020.0002] -09C7 09D7 ; [.2670.0020.0002] -09CD ; [.2671.0020.0002] -09D7 ; [.2672.0020.0002] -0A74 ; [.2673.0020.0002] -0A73 ; [.2674.0020.0002] -0A09 ; [.2675.0020.0002] -0A0A ; [.2676.0020.0002] -0A13 ; [.2677.0020.0002] -0A05 ; [.2678.0020.0002] -0A06 ; [.2679.0020.0002] -0A10 ; [.267A.0020.0002] -0A14 ; [.267B.0020.0002] -0A72 ; [.267C.0020.0002] -0A07 ; [.267D.0020.0002] -0A08 ; [.267E.0020.0002] -0A0F ; [.267F.0020.0002] -0A38 ; [.2680.0020.0002] -0A36 ; [.2680.0020.0002][.0000.00BD.0002] -0A39 ; [.2681.0020.0002] -0A51 ; [.2682.0020.0002] -0A15 ; [.2683.0020.0002] -0A16 ; [.2684.0020.0002] -0A59 ; [.2684.0020.0002][.0000.00BD.0002] -0A17 ; [.2685.0020.0002] -0A5A ; [.2685.0020.0002][.0000.00BD.0002] -0A18 ; [.2686.0020.0002] -0A19 ; [.2687.0020.0002] -0A1A ; [.2688.0020.0002] -0A1B ; [.2689.0020.0002] -0A1C ; [.268A.0020.0002] -0A5B ; [.268A.0020.0002][.0000.00BD.0002] -0A1D ; [.268B.0020.0002] -0A1E ; [.268C.0020.0002] -0A1F ; [.268D.0020.0002] -0A20 ; [.268E.0020.0002] -0A21 ; [.268F.0020.0002] -0A22 ; [.2690.0020.0002] -0A23 ; [.2691.0020.0002] -0A24 ; [.2692.0020.0002] -0A25 ; [.2693.0020.0002] -0A26 ; [.2694.0020.0002] -0A27 ; [.2695.0020.0002] -0A28 ; [.2696.0020.0002] -0A2A ; [.2697.0020.0002] -0A2B ; [.2698.0020.0002] -0A5E ; [.2698.0020.0002][.0000.00BD.0002] -0A2C ; [.2699.0020.0002] -0A2D ; [.269A.0020.0002] -0A2E ; [.269B.0020.0002] -0A2F ; [.269C.0020.0002] -0A75 ; [.269D.0020.0002] -0A30 ; [.269E.0020.0002] -0A32 ; [.269F.0020.0002] -0A33 ; [.269F.0020.0002][.0000.00BD.0002] -0A35 ; [.26A0.0020.0002] -0A5C ; [.26A1.0020.0002] -0A3E ; [.26A2.0020.0002] -0A3F ; [.26A3.0020.0002] -0A40 ; [.26A4.0020.0002] -0A41 ; [.26A5.0020.0002] -0A42 ; [.26A6.0020.0002] -0A47 ; [.26A7.0020.0002] -0A48 ; [.26A8.0020.0002] -0A4B ; [.26A9.0020.0002] -0A4C ; [.26AA.0020.0002] -0A4D ; [.26AB.0020.0002] -0AD0 ; [.26AC.0020.0002] -0A85 ; [.26AD.0020.0002] -0A86 ; [.26AE.0020.0002] -0A87 ; [.26AF.0020.0002] -0A88 ; [.26B0.0020.0002] -0A89 ; [.26B1.0020.0002] -0A8A ; [.26B2.0020.0002] -0A8B ; [.26B3.0020.0002] -0AE0 ; [.26B4.0020.0002] -0A8C ; [.26B5.0020.0002] -0AE1 ; [.26B6.0020.0002] -0A8D ; [.26B7.0020.0002] -0A8F ; [.26B8.0020.0002] -0A90 ; [.26B9.0020.0002] -0A91 ; [.26BA.0020.0002] -0A93 ; [.26BB.0020.0002] -0A94 ; [.26BC.0020.0002] -0A95 ; [.26BD.0020.0002] -0A96 ; [.26BE.0020.0002] -0A97 ; [.26BF.0020.0002] -0A98 ; [.26C0.0020.0002] -0A99 ; [.26C1.0020.0002] -0A9A ; [.26C2.0020.0002] -0A9B ; [.26C3.0020.0002] -0A9C ; [.26C4.0020.0002] -0AF9 ; [.26C5.0020.0002] -0A9D ; [.26C6.0020.0002] -0A9E ; [.26C7.0020.0002] -0A9F ; [.26C8.0020.0002] -0AA0 ; [.26C9.0020.0002] -0AA1 ; [.26CA.0020.0002] -0AA2 ; [.26CB.0020.0002] -0AA3 ; [.26CC.0020.0002] -0AA4 ; [.26CD.0020.0002] -0AA5 ; [.26CE.0020.0002] -0AA6 ; [.26CF.0020.0002] -0AA7 ; [.26D0.0020.0002] -0AA8 ; [.26D1.0020.0002] -0AAA ; [.26D2.0020.0002] -0AAB ; [.26D3.0020.0002] -0AAC ; [.26D4.0020.0002] -0AAD ; [.26D5.0020.0002] -0AAE ; [.26D6.0020.0002] -0AAF ; [.26D7.0020.0002] -0AB0 ; [.26D8.0020.0002] -0AB2 ; [.26D9.0020.0002] -0AB5 ; [.26DA.0020.0002] -0AB6 ; [.26DB.0020.0002] -0AB7 ; [.26DC.0020.0002] -0AB8 ; [.26DD.0020.0002] -0AB9 ; [.26DE.0020.0002] -0AB3 ; [.26DF.0020.0002] -0ABD ; [.26E0.0020.0002] -0ABE ; [.26E1.0020.0002] -0ABF ; [.26E2.0020.0002] -0AC0 ; [.26E3.0020.0002] -0AC1 ; [.26E4.0020.0002] -0AC2 ; [.26E5.0020.0002] -0AC3 ; [.26E6.0020.0002] -0AC4 ; [.26E7.0020.0002] -0AE2 ; [.26E8.0020.0002] -0AE3 ; [.26E9.0020.0002] -0AC5 ; [.26EA.0020.0002] -0AC7 ; [.26EB.0020.0002] -0AC8 ; [.26EC.0020.0002] -0AC9 ; [.26ED.0020.0002] -0ACB ; [.26EE.0020.0002] -0ACC ; [.26EF.0020.0002] -0ACD ; [.26F0.0020.0002] -0B05 ; [.26F1.0020.0002] -0B06 ; [.26F2.0020.0002] -0B07 ; [.26F3.0020.0002] -0B08 ; [.26F4.0020.0002] -0B09 ; [.26F5.0020.0002] -0B0A ; [.26F6.0020.0002] -0B0B ; [.26F7.0020.0002] -0B60 ; [.26F8.0020.0002] -0B0C ; [.26F9.0020.0002] -0B61 ; [.26FA.0020.0002] -0B0F ; [.26FB.0020.0002] -0B10 ; [.26FC.0020.0002] -0B13 ; [.26FD.0020.0002] -0B14 ; [.26FE.0020.0002] -0B15 ; [.26FF.0020.0002] -0B16 ; [.2700.0020.0002] -0B17 ; [.2701.0020.0002] -0B18 ; [.2702.0020.0002] -0B19 ; [.2703.0020.0002] -0B1A ; [.2704.0020.0002] -0B1B ; [.2705.0020.0002] -0B1C ; [.2706.0020.0002] -0B1D ; [.2707.0020.0002] -0B1E ; [.2708.0020.0002] -0B1F ; [.2709.0020.0002] -0B20 ; [.270A.0020.0002] -0B21 ; [.270B.0020.0002] -0B5C ; [.270B.0020.0002][.0000.00BD.0002] -0B22 ; [.270C.0020.0002] -0B5D ; [.270C.0020.0002][.0000.00BD.0002] -0B23 ; [.270D.0020.0002] -0B24 ; [.270E.0020.0002] -0B25 ; [.270F.0020.0002] -0B26 ; [.2710.0020.0002] -0B27 ; [.2711.0020.0002] -0B28 ; [.2712.0020.0002] -0B2A ; [.2713.0020.0002] -0B2B ; [.2714.0020.0002] -0B2C ; [.2715.0020.0002] -0B2D ; [.2716.0020.0002] -0B2E ; [.2717.0020.0002] -0B2F ; [.2718.0020.0002] -0B5F ; [.2719.0020.0002] -0B30 ; [.271A.0020.0002] -0B32 ; [.271B.0020.0002] -0B33 ; [.271C.0020.0002] -0B35 ; [.271D.0020.0002] -0B71 ; [.271E.0020.0002] -0B36 ; [.271F.0020.0002] -0B37 ; [.2720.0020.0002] -0B38 ; [.2721.0020.0002] -0B39 ; [.2722.0020.0002] -0B3D ; [.2723.0020.0002] -0B3E ; [.2724.0020.0002] -0B3F ; [.2725.0020.0002] -0B40 ; [.2726.0020.0002] -0B41 ; [.2727.0020.0002] -0B42 ; [.2728.0020.0002] -0B43 ; [.2729.0020.0002] -0B44 ; [.272A.0020.0002] -0B62 ; [.272B.0020.0002] -0B63 ; [.272C.0020.0002] -0B47 ; [.272D.0020.0002] -0B48 ; [.272E.0020.0002] -0B47 0B56 ; [.272E.0020.0002] -0B4B ; [.272F.0020.0002] -0B47 0B3E ; [.272F.0020.0002] -0B4C ; [.2730.0020.0002] -0B47 0B57 ; [.2730.0020.0002] -0B4D ; [.2731.0020.0002] -0B56 ; [.2732.0020.0002] -0B57 ; [.2733.0020.0002] -0BD0 ; [.2734.0020.0002] -0B85 ; [.2735.0020.0002] -0B86 ; [.2736.0020.0002] -0B87 ; [.2737.0020.0002] -0B88 ; [.2738.0020.0002] -0B89 ; [.2739.0020.0002] -0B8A ; [.273A.0020.0002] -0B8E ; [.273B.0020.0002] -0B8F ; [.273C.0020.0002] -0B90 ; [.273D.0020.0002] -0B92 ; [.273E.0020.0002] -0B93 ; [.273F.0020.0002] -0B94 ; [.2740.0020.0002] -0B92 0BD7 ; [.2740.0020.0002] -0B83 ; [.2741.0020.0002] -0B95 ; [.2742.0020.0002] -0B99 ; [.2743.0020.0002] -0B9A ; [.2744.0020.0002] -0B9E ; [.2745.0020.0002] -0B9F ; [.2746.0020.0002] -0BA3 ; [.2747.0020.0002] -0BA4 ; [.2748.0020.0002] -0BA8 ; [.2749.0020.0002] -0BAA ; [.274A.0020.0002] -0BAE ; [.274B.0020.0002] -0BAF ; [.274C.0020.0002] -0BB0 ; [.274D.0020.0002] -0BB2 ; [.274E.0020.0002] -0BB5 ; [.274F.0020.0002] -0BB4 ; [.2750.0020.0002] -0BB3 ; [.2751.0020.0002] -0BB1 ; [.2752.0020.0002] -0BA9 ; [.2753.0020.0002] -0B9C ; [.2754.0020.0002] -0BB6 ; [.2755.0020.0002] -0BB7 ; [.2756.0020.0002] -0BB8 ; [.2757.0020.0002] -0BB9 ; [.2758.0020.0002] -0BBE ; [.2759.0020.0002] -0BBF ; [.275A.0020.0002] -0BC0 ; [.275B.0020.0002] -0BC1 ; [.275C.0020.0002] -0BC2 ; [.275D.0020.0002] -0BC6 ; [.275E.0020.0002] -0BC7 ; [.275F.0020.0002] -0BC8 ; [.2760.0020.0002] -0BCA ; [.2761.0020.0002] -0BC6 0BBE ; [.2761.0020.0002] -0BCB ; [.2762.0020.0002] -0BC7 0BBE ; [.2762.0020.0002] -0BCC ; [.2763.0020.0002] -0BC6 0BD7 ; [.2763.0020.0002] -0BCD ; [.2764.0020.0002] -0BD7 ; [.2765.0020.0002] -0C05 ; [.2766.0020.0002] -0C06 ; [.2767.0020.0002] -0C07 ; [.2768.0020.0002] -0C08 ; [.2769.0020.0002] -0C09 ; [.276A.0020.0002] -0C0A ; [.276B.0020.0002] -0C0B ; [.276C.0020.0002] -0C60 ; [.276D.0020.0002] -0C0C ; [.276E.0020.0002] -0C61 ; [.276F.0020.0002] -0C0E ; [.2770.0020.0002] -0C0F ; [.2771.0020.0002] -0C10 ; [.2772.0020.0002] -0C12 ; [.2773.0020.0002] -0C13 ; [.2774.0020.0002] -0C14 ; [.2775.0020.0002] -0C15 ; [.2776.0020.0002] -0C16 ; [.2777.0020.0002] -0C17 ; [.2778.0020.0002] -0C18 ; [.2779.0020.0002] -0C19 ; [.277A.0020.0002] -0C1A ; [.277B.0020.0002] -0C58 ; [.277C.0020.0002] -0C1B ; [.277D.0020.0002] -0C1C ; [.277E.0020.0002] -0C59 ; [.277F.0020.0002] -0C1D ; [.2780.0020.0002] -0C1E ; [.2781.0020.0002] -0C1F ; [.2782.0020.0002] -0C20 ; [.2783.0020.0002] -0C21 ; [.2784.0020.0002] -0C22 ; [.2785.0020.0002] -0C23 ; [.2786.0020.0002] -0C24 ; [.2787.0020.0002] -0C25 ; [.2788.0020.0002] -0C26 ; [.2789.0020.0002] -0C27 ; [.278A.0020.0002] -0C28 ; [.278B.0020.0002] -0C2A ; [.278C.0020.0002] -0C2B ; [.278D.0020.0002] -0C2C ; [.278E.0020.0002] -0C2D ; [.278F.0020.0002] -0C2E ; [.2790.0020.0002] -0C2F ; [.2791.0020.0002] -0C30 ; [.2792.0020.0002] -0C31 ; [.2793.0020.0002] -0C32 ; [.2794.0020.0002] -0C35 ; [.2795.0020.0002] -0C36 ; [.2796.0020.0002] -0C37 ; [.2797.0020.0002] -0C38 ; [.2798.0020.0002] -0C39 ; [.2799.0020.0002] -0C33 ; [.279A.0020.0002] -0C34 ; [.279B.0020.0002] -0C5A ; [.279C.0020.0002] -0C3D ; [.279D.0020.0002] -0C3E ; [.279E.0020.0002] -0C3F ; [.279F.0020.0002] -0C40 ; [.27A0.0020.0002] -0C41 ; [.27A1.0020.0002] -0C42 ; [.27A2.0020.0002] -0C43 ; [.27A3.0020.0002] -0C44 ; [.27A4.0020.0002] -0C62 ; [.27A5.0020.0002] -0C63 ; [.27A6.0020.0002] -0C46 ; [.27A7.0020.0002] -0C47 ; [.27A8.0020.0002] -0C48 ; [.27A9.0020.0002] -0C46 0C56 ; [.27A9.0020.0002] -0C4A ; [.27AA.0020.0002] -0C4B ; [.27AB.0020.0002] -0C4C ; [.27AC.0020.0002] -0C4D ; [.27AD.0020.0002] -0C55 ; [.27AE.0020.0002] -0C56 ; [.27AF.0020.0002] -0C85 ; [.27B0.0020.0002] -0C86 ; [.27B1.0020.0002] -0C87 ; [.27B2.0020.0002] -0C88 ; [.27B3.0020.0002] -0C89 ; [.27B4.0020.0002] -0C8A ; [.27B5.0020.0002] -0C8B ; [.27B6.0020.0002] -0CE0 ; [.27B7.0020.0002] -0C8C ; [.27B8.0020.0002] -0CE1 ; [.27B9.0020.0002] -0C8E ; [.27BA.0020.0002] -0C8F ; [.27BB.0020.0002] -0C90 ; [.27BC.0020.0002] -0C92 ; [.27BD.0020.0002] -0C93 ; [.27BE.0020.0002] -0C94 ; [.27BF.0020.0002] -0C95 ; [.27C0.0020.0002] -0C96 ; [.27C1.0020.0002] -0C97 ; [.27C2.0020.0002] -0C98 ; [.27C3.0020.0002] -0C99 ; [.27C4.0020.0002] -0C9A ; [.27C5.0020.0002] -0C9B ; [.27C6.0020.0002] -0C9C ; [.27C7.0020.0002] -0C9D ; [.27C8.0020.0002] -0C9E ; [.27C9.0020.0002] -0C9F ; [.27CA.0020.0002] -0CA0 ; [.27CB.0020.0002] -0CA1 ; [.27CC.0020.0002] -0CA2 ; [.27CD.0020.0002] -0CA3 ; [.27CE.0020.0002] -0CA4 ; [.27CF.0020.0002] -0CA5 ; [.27D0.0020.0002] -0CA6 ; [.27D1.0020.0002] -0CA7 ; [.27D2.0020.0002] -0CA8 ; [.27D3.0020.0002] -0CAA ; [.27D4.0020.0002] -0CAB ; [.27D5.0020.0002] -0CAC ; [.27D6.0020.0002] -0CAD ; [.27D7.0020.0002] -0CAE ; [.27D8.0020.0002] -0CAF ; [.27D9.0020.0002] -0CB0 ; [.27DA.0020.0002] -0CB1 ; [.27DB.0020.0002] -0CB2 ; [.27DC.0020.0002] -0CB5 ; [.27DD.0020.0002] -0CB6 ; [.27DE.0020.0002] -0CB7 ; [.27DF.0020.0002] -0CB8 ; [.27E0.0020.0002] -0CB9 ; [.27E1.0020.0002] -0CB3 ; [.27E2.0020.0002] -0CDE ; [.27E3.0020.0002] -0CBD ; [.27E4.0020.0002] -0CF1 ; [.27E5.0020.0002] -0CF2 ; [.27E6.0020.0002] -0CBE ; [.27E7.0020.0002] -0CBF ; [.27E8.0020.0002] -0CC0 ; [.27E9.0020.0002] -0CBF 0CD5 ; [.27E9.0020.0002] -0CC1 ; [.27EA.0020.0002] -0CC2 ; [.27EB.0020.0002] -0CC3 ; [.27EC.0020.0002] -0CC4 ; [.27ED.0020.0002] -0CE2 ; [.27EE.0020.0002] -0CE3 ; [.27EF.0020.0002] -0CC6 ; [.27F0.0020.0002] -0CC7 ; [.27F1.0020.0002] -0CC6 0CD5 ; [.27F1.0020.0002] -0CC8 ; [.27F2.0020.0002] -0CC6 0CD6 ; [.27F2.0020.0002] -0CCA ; [.27F3.0020.0002] -0CC6 0CC2 ; [.27F3.0020.0002] -0CCB ; [.27F4.0020.0002] -0CC6 0CC2 0CD5 ; [.27F4.0020.0002] -0CCA 0CD5 ; [.27F4.0020.0002] -0CCC ; [.27F5.0020.0002] -0CCD ; [.27F6.0020.0002] -0CD5 ; [.27F7.0020.0002] -0CD6 ; [.27F8.0020.0002] -0D05 ; [.27F9.0020.0002] -0D06 ; [.27FA.0020.0002] -0D07 ; [.27FB.0020.0002] -0D08 ; [.27FC.0020.0002] -0D5F ; [.27FD.0020.0002] -0D09 ; [.27FE.0020.0002] -0D0A ; [.27FF.0020.0002] -0D0B ; [.2800.0020.0002] -0D60 ; [.2801.0020.0002] -0D0C ; [.2802.0020.0002] -0D61 ; [.2803.0020.0002] -0D0E ; [.2804.0020.0002] -0D0F ; [.2805.0020.0002] -0D10 ; [.2806.0020.0002] -0D12 ; [.2807.0020.0002] -0D13 ; [.2808.0020.0002] -0D14 ; [.2809.0020.0002] -0D15 ; [.280A.0020.0002] -0D7F ; [.280A.0020.0004][.2841.0020.0004] -0D16 ; [.280B.0020.0002] -0D17 ; [.280C.0020.0002] -0D18 ; [.280D.0020.0002] -0D19 ; [.280E.0020.0002] -0D1A ; [.280F.0020.0002] -0D1B ; [.2810.0020.0002] -0D1C ; [.2811.0020.0002] -0D1D ; [.2812.0020.0002] -0D1E ; [.2813.0020.0002] -0D1F ; [.2814.0020.0002] -0D20 ; [.2815.0020.0002] -0D21 ; [.2816.0020.0002] -0D22 ; [.2817.0020.0002] -0D23 ; [.2818.0020.0002] -0D7A ; [.2818.0020.0004][.2841.0020.0004] -0D24 ; [.2819.0020.0002] -0D25 ; [.281A.0020.0002] -0D26 ; [.281B.0020.0002] -0D27 ; [.281C.0020.0002] -0D28 ; [.281D.0020.0002] -0D7B ; [.281D.0020.0004][.2841.0020.0004] -0D29 ; [.281E.0020.0002] -0D2A ; [.281F.0020.0002] -0D2B ; [.2820.0020.0002] -0D2C ; [.2821.0020.0002] -0D2D ; [.2822.0020.0002] -0D2E ; [.2823.0020.0002] -0D2F ; [.2824.0020.0002] -0D30 ; [.2825.0020.0002] -0D4E ; [.2825.0020.0004][.2841.0020.0004] -0D7C ; [.2825.0020.0004][.2841.0020.0004] -0D32 ; [.2826.0020.0002] -0D7D ; [.2826.0020.0004][.2841.0020.0004] -0D35 ; [.2827.0020.0002] -0D36 ; [.2828.0020.0002] -0D37 ; [.2829.0020.0002] -0D38 ; [.282A.0020.0002] -0D39 ; [.282B.0020.0002] -0D33 ; [.282C.0020.0002] -0D7E ; [.282C.0020.0004][.2841.0020.0004] -0D34 ; [.282D.0020.0002] -0D31 ; [.282E.0020.0002] -0D3A ; [.282F.0020.0002] -0D3D ; [.2830.0020.0002] -0D3E ; [.2831.0020.0002] -0D3F ; [.2832.0020.0002] -0D40 ; [.2833.0020.0002] -0D41 ; [.2834.0020.0002] -0D42 ; [.2835.0020.0002] -0D43 ; [.2836.0020.0002] -0D44 ; [.2837.0020.0002] -0D62 ; [.2838.0020.0002] -0D63 ; [.2839.0020.0002] -0D46 ; [.283A.0020.0002] -0D47 ; [.283B.0020.0002] -0D48 ; [.283C.0020.0002] -0D4A ; [.283D.0020.0002] -0D46 0D3E ; [.283D.0020.0002] -0D4B ; [.283E.0020.0002] -0D47 0D3E ; [.283E.0020.0002] -0D4C ; [.283F.0020.0002] -0D46 0D57 ; [.283F.0020.0002] -0D57 ; [.2840.0020.0002] -0D4D ; [.2841.0020.0002] -0D85 ; [.2842.0020.0002] -0D86 ; [.2843.0020.0002] -0D87 ; [.2844.0020.0002] -0D88 ; [.2845.0020.0002] -0D89 ; [.2846.0020.0002] -0D8A ; [.2847.0020.0002] -0D8B ; [.2848.0020.0002] -0D8C ; [.2849.0020.0002] -0D8D ; [.284A.0020.0002] -0D8E ; [.284B.0020.0002] -0D8F ; [.284C.0020.0002] -0D90 ; [.284D.0020.0002] -0D91 ; [.284E.0020.0002] -0D92 ; [.284F.0020.0002] -0D93 ; [.2850.0020.0002] -0D94 ; [.2851.0020.0002] -0D95 ; [.2852.0020.0002] -0D96 ; [.2853.0020.0002] -0D9A ; [.2854.0020.0002] -0D9B ; [.2855.0020.0002] -0D9C ; [.2856.0020.0002] -0D9D ; [.2857.0020.0002] -0D9E ; [.2858.0020.0002] -0D9F ; [.2859.0020.0002] -0DA0 ; [.285A.0020.0002] -0DA1 ; [.285B.0020.0002] -0DA2 ; [.285C.0020.0002] -0DA3 ; [.285D.0020.0002] -0DA4 ; [.285E.0020.0002] -0DA5 ; [.285F.0020.0002] -0DA6 ; [.2860.0020.0002] -0DA7 ; [.2861.0020.0002] -0DA8 ; [.2862.0020.0002] -0DA9 ; [.2863.0020.0002] -0DAA ; [.2864.0020.0002] -0DAB ; [.2865.0020.0002] -0DAC ; [.2866.0020.0002] -0DAD ; [.2867.0020.0002] -0DAE ; [.2868.0020.0002] -0DAF ; [.2869.0020.0002] -0DB0 ; [.286A.0020.0002] -0DB1 ; [.286B.0020.0002] -0DB3 ; [.286C.0020.0002] -0DB4 ; [.286D.0020.0002] -0DB5 ; [.286E.0020.0002] -0DB6 ; [.286F.0020.0002] -0DB7 ; [.2870.0020.0002] -0DB8 ; [.2871.0020.0002] -0DB9 ; [.2872.0020.0002] -0DBA ; [.2873.0020.0002] -0DBB ; [.2874.0020.0002] -0DBD ; [.2875.0020.0002] -0DC0 ; [.2876.0020.0002] -0DC1 ; [.2877.0020.0002] -0DC2 ; [.2878.0020.0002] -0DC3 ; [.2879.0020.0002] -0DC4 ; [.287A.0020.0002] -0DC5 ; [.287B.0020.0002] -0DC6 ; [.287C.0020.0002] -0DCF ; [.287D.0020.0002] -0DD0 ; [.287E.0020.0002] -0DD1 ; [.287F.0020.0002] -0DD2 ; [.2880.0020.0002] -0DD3 ; [.2881.0020.0002] -0DD4 ; [.2882.0020.0002] -0DD6 ; [.2883.0020.0002] -0DD8 ; [.2884.0020.0002] -0DF2 ; [.2885.0020.0002] -0DDF ; [.2886.0020.0002] -0DF3 ; [.2887.0020.0002] -0DD9 ; [.2888.0020.0002] -0DDA ; [.2889.0020.0002] -0DD9 0DCA ; [.2889.0020.0002] -0DDB ; [.288A.0020.0002] -0DDC ; [.288B.0020.0002] -0DD9 0DCF ; [.288B.0020.0002] -0DDD ; [.288C.0020.0002] -0DD9 0DCF 0DCA ; [.288C.0020.0002] -0DDC 0DCA ; [.288C.0020.0002] -0DDE ; [.288D.0020.0002] -0DD9 0DDF ; [.288D.0020.0002] -0DCA ; [.288E.0020.0002] -AAF2 ; [.288F.0020.0002] -ABC0 ; [.2890.0020.0002] -ABC1 ; [.2891.0020.0002] -ABC2 ; [.2892.0020.0002] -ABC3 ; [.2893.0020.0002] -ABC4 ; [.2894.0020.0002] -ABC5 ; [.2895.0020.0002] -ABC6 ; [.2896.0020.0002] -ABC7 ; [.2897.0020.0002] -ABC8 ; [.2898.0020.0002] -ABC9 ; [.2899.0020.0002] -ABCA ; [.289A.0020.0002] -ABCB ; [.289B.0020.0002] -ABCC ; [.289C.0020.0002] -ABCD ; [.289D.0020.0002] -ABCE ; [.289E.0020.0002] -ABCF ; [.289F.0020.0002] -ABD0 ; [.28A0.0020.0002] -ABD1 ; [.28A1.0020.0002] -ABD2 ; [.28A2.0020.0002] -ABD3 ; [.28A3.0020.0002] -ABD4 ; [.28A4.0020.0002] -ABD5 ; [.28A5.0020.0002] -ABD6 ; [.28A6.0020.0002] -ABD7 ; [.28A7.0020.0002] -ABD8 ; [.28A8.0020.0002] -ABD9 ; [.28A9.0020.0002] -ABDA ; [.28AA.0020.0002] -AAE0 ; [.28AB.0020.0002] -AAE1 ; [.28AC.0020.0002] -AAE2 ; [.28AD.0020.0002] -AAE3 ; [.28AE.0020.0002] -AAE4 ; [.28AF.0020.0002] -AAE5 ; [.28B0.0020.0002] -AAE6 ; [.28B1.0020.0002] -AAE7 ; [.28B2.0020.0002] -AAE8 ; [.28B3.0020.0002] -AAE9 ; [.28B4.0020.0002] -AAEA ; [.28B5.0020.0002] -ABE3 ; [.28B6.0020.0002] -ABE4 ; [.28B7.0020.0002] -ABE5 ; [.28B8.0020.0002] -ABE6 ; [.28B9.0020.0002] -ABE7 ; [.28BA.0020.0002] -ABE8 ; [.28BB.0020.0002] -ABE9 ; [.28BC.0020.0002] -ABEA ; [.28BD.0020.0002] -AAEB ; [.28BE.0020.0002] -AAEC ; [.28BF.0020.0002] -AAED ; [.28C0.0020.0002] -AAEE ; [.28C1.0020.0002] -AAEF ; [.28C2.0020.0002] -AAF5 ; [.28C3.0020.0002] -ABDB ; [.28C4.0020.0002] -ABDC ; [.28C5.0020.0002] -ABDD ; [.28C6.0020.0002] -ABDE ; [.28C7.0020.0002] -ABDF ; [.28C8.0020.0002] -ABE0 ; [.28C9.0020.0002] -ABE1 ; [.28CA.0020.0002] -ABE2 ; [.28CB.0020.0002] -ABED ; [.28CC.0020.0002] -AAF6 ; [.28CD.0020.0002] -A800 ; [.28CE.0020.0002] -A801 ; [.28CF.0020.0002] -A802 ; [.28D0.0020.0002] -A803 ; [.28D1.0020.0002] -A804 ; [.28D2.0020.0002] -A805 ; [.28D3.0020.0002] -A806 ; [.28D4.0020.0002] -A807 ; [.28D5.0020.0002] -A808 ; [.28D6.0020.0002] -A809 ; [.28D7.0020.0002] -A80A ; [.28D8.0020.0002] -A80C ; [.28D9.0020.0002] -A80D ; [.28DA.0020.0002] -A80E ; [.28DB.0020.0002] -A80F ; [.28DC.0020.0002] -A810 ; [.28DD.0020.0002] -A811 ; [.28DE.0020.0002] -A812 ; [.28DF.0020.0002] -A813 ; [.28E0.0020.0002] -A814 ; [.28E1.0020.0002] -A815 ; [.28E2.0020.0002] -A816 ; [.28E3.0020.0002] -A817 ; [.28E4.0020.0002] -A818 ; [.28E5.0020.0002] -A819 ; [.28E6.0020.0002] -A81A ; [.28E7.0020.0002] -A81B ; [.28E8.0020.0002] -A81C ; [.28E9.0020.0002] -A81D ; [.28EA.0020.0002] -A81E ; [.28EB.0020.0002] -A81F ; [.28EC.0020.0002] -A820 ; [.28ED.0020.0002] -A821 ; [.28EE.0020.0002] -A822 ; [.28EF.0020.0002] -A823 ; [.28F0.0020.0002] -A824 ; [.28F1.0020.0002] -A825 ; [.28F2.0020.0002] -A826 ; [.28F3.0020.0002] -A827 ; [.28F4.0020.0002] -A882 ; [.28F5.0020.0002] -A883 ; [.28F6.0020.0002] -A884 ; [.28F7.0020.0002] -A885 ; [.28F8.0020.0002] -A886 ; [.28F9.0020.0002] -A887 ; [.28FA.0020.0002] -A888 ; [.28FB.0020.0002] -A889 ; [.28FC.0020.0002] -A88A ; [.28FD.0020.0002] -A88B ; [.28FE.0020.0002] -A88C ; [.28FF.0020.0002] -A88D ; [.2900.0020.0002] -A88E ; [.2901.0020.0002] -A88F ; [.2902.0020.0002] -A890 ; [.2903.0020.0002] -A891 ; [.2904.0020.0002] -A892 ; [.2905.0020.0002] -A893 ; [.2906.0020.0002] -A894 ; [.2907.0020.0002] -A895 ; [.2908.0020.0002] -A896 ; [.2909.0020.0002] -A897 ; [.290A.0020.0002] -A898 ; [.290B.0020.0002] -A899 ; [.290C.0020.0002] -A89A ; [.290D.0020.0002] -A89B ; [.290E.0020.0002] -A89C ; [.290F.0020.0002] -A89D ; [.2910.0020.0002] -A89E ; [.2911.0020.0002] -A89F ; [.2912.0020.0002] -A8A0 ; [.2913.0020.0002] -A8A1 ; [.2914.0020.0002] -A8A2 ; [.2915.0020.0002] -A8A3 ; [.2916.0020.0002] -A8A4 ; [.2917.0020.0002] -A8A5 ; [.2918.0020.0002] -A8A6 ; [.2919.0020.0002] -A8A7 ; [.291A.0020.0002] -A8A8 ; [.291B.0020.0002] -A8A9 ; [.291C.0020.0002] -A8AA ; [.291D.0020.0002] -A8AB ; [.291E.0020.0002] -A8AC ; [.291F.0020.0002] -A8AD ; [.2920.0020.0002] -A8AE ; [.2921.0020.0002] -A8AF ; [.2922.0020.0002] -A8B0 ; [.2923.0020.0002] -A8B1 ; [.2924.0020.0002] -A8B2 ; [.2925.0020.0002] -A8B3 ; [.2926.0020.0002] -A8B4 ; [.2927.0020.0002] -A8B5 ; [.2928.0020.0002] -A8B6 ; [.2929.0020.0002] -A8B7 ; [.292A.0020.0002] -A8B8 ; [.292B.0020.0002] -A8B9 ; [.292C.0020.0002] -A8BA ; [.292D.0020.0002] -A8BB ; [.292E.0020.0002] -A8BC ; [.292F.0020.0002] -A8BD ; [.2930.0020.0002] -A8BE ; [.2931.0020.0002] -A8BF ; [.2932.0020.0002] -A8C0 ; [.2933.0020.0002] -A8C1 ; [.2934.0020.0002] -A8C2 ; [.2935.0020.0002] -A8C3 ; [.2936.0020.0002] -A8C4 ; [.2937.0020.0002] -11083 ; [.2938.0020.0002] -11084 ; [.2939.0020.0002] -11085 ; [.293A.0020.0002] -11086 ; [.293B.0020.0002] -11087 ; [.293C.0020.0002] -11088 ; [.293D.0020.0002] -11089 ; [.293E.0020.0002] -1108A ; [.293F.0020.0002] -1108B ; [.2940.0020.0002] -1108C ; [.2941.0020.0002] -1108D ; [.2942.0020.0002] -1108E ; [.2943.0020.0002] -1108F ; [.2944.0020.0002] -11090 ; [.2945.0020.0002] -11091 ; [.2946.0020.0002] -11092 ; [.2947.0020.0002] -11093 ; [.2948.0020.0002] -11094 ; [.2949.0020.0002] -11095 ; [.294A.0020.0002] -11096 ; [.294B.0020.0002] -11097 ; [.294C.0020.0002] -11098 ; [.294D.0020.0002] -11099 ; [.294E.0020.0002] -1109A ; [.294E.0020.0002][.0000.00BD.0002] -1109B ; [.294F.0020.0002] -1109C ; [.294F.0020.0002][.0000.00BD.0002] -1109D ; [.2950.0020.0002] -1109E ; [.2951.0020.0002] -1109F ; [.2952.0020.0002] -110A0 ; [.2953.0020.0002] -110A1 ; [.2954.0020.0002] -110A2 ; [.2955.0020.0002] -110A3 ; [.2956.0020.0002] -110A4 ; [.2957.0020.0002] -110A5 ; [.2958.0020.0002] -110AB ; [.2958.0020.0002][.0000.00BD.0002] -110A6 ; [.2959.0020.0002] -110A7 ; [.295A.0020.0002] -110A8 ; [.295B.0020.0002] -110A9 ; [.295C.0020.0002] -110AA ; [.295D.0020.0002] -110AC ; [.295E.0020.0002] -110AD ; [.295F.0020.0002] -110AE ; [.2960.0020.0002] -110AF ; [.2961.0020.0002] -110B0 ; [.2962.0020.0002] -110B1 ; [.2963.0020.0002] -110B2 ; [.2964.0020.0002] -110B3 ; [.2965.0020.0002] -110B4 ; [.2966.0020.0002] -110B5 ; [.2967.0020.0002] -110B6 ; [.2968.0020.0002] -110B7 ; [.2969.0020.0002] -110B8 ; [.296A.0020.0002] -110B9 ; [.296B.0020.0002] -11150 ; [.296C.0020.0002] -11151 ; [.296D.0020.0002] -11152 ; [.296E.0020.0002] -11153 ; [.296F.0020.0002] -11154 ; [.2970.0020.0002] -11155 ; [.2971.0020.0002] -11156 ; [.2972.0020.0002] -11157 ; [.2973.0020.0002] -11158 ; [.2974.0020.0002] -11159 ; [.2975.0020.0002] -1115A ; [.2976.0020.0002] -1115B ; [.2977.0020.0002] -1115C ; [.2978.0020.0002] -1115D ; [.2979.0020.0002] -1115E ; [.297A.0020.0002] -1115F ; [.297B.0020.0002] -11160 ; [.297C.0020.0002] -11161 ; [.297D.0020.0002] -11162 ; [.297E.0020.0002] -11163 ; [.297F.0020.0002] -11164 ; [.2980.0020.0002] -11165 ; [.2981.0020.0002] -11166 ; [.2982.0020.0002] -11167 ; [.2983.0020.0002] -11168 ; [.2984.0020.0002] -11169 ; [.2985.0020.0002] -1116A ; [.2986.0020.0002] -1116B ; [.2987.0020.0002] -1116C ; [.2988.0020.0002] -1116D ; [.2989.0020.0002] -1116E ; [.298A.0020.0002] -1116F ; [.298B.0020.0002] -11176 ; [.298C.0020.0002] -11170 ; [.298D.0020.0002] -11171 ; [.298E.0020.0002] -11172 ; [.298F.0020.0002] -111C4 ; [.2990.0020.0002] -111DA ; [.2991.0020.0002] -11183 ; [.2992.0020.0002] -11184 ; [.2993.0020.0002] -11185 ; [.2994.0020.0002] -11186 ; [.2995.0020.0002] -11187 ; [.2996.0020.0002] -11188 ; [.2997.0020.0002] -11189 ; [.2998.0020.0002] -1118A ; [.2999.0020.0002] -1118B ; [.299A.0020.0002] -1118C ; [.299B.0020.0002] -1118D ; [.299C.0020.0002] -1118E ; [.299D.0020.0002] -1118F ; [.299E.0020.0002] -11190 ; [.299F.0020.0002] -11191 ; [.29A0.0020.0002] -11192 ; [.29A1.0020.0002] -11193 ; [.29A2.0020.0002] -11194 ; [.29A3.0020.0002] -11195 ; [.29A4.0020.0002] -11196 ; [.29A5.0020.0002] -11197 ; [.29A6.0020.0002] -11198 ; [.29A7.0020.0002] -11199 ; [.29A8.0020.0002] -1119A ; [.29A9.0020.0002] -1119B ; [.29AA.0020.0002] -1119C ; [.29AB.0020.0002] -1119D ; [.29AC.0020.0002] -1119E ; [.29AD.0020.0002] -1119F ; [.29AE.0020.0002] -111A0 ; [.29AF.0020.0002] -111A1 ; [.29B0.0020.0002] -111A2 ; [.29B1.0020.0002] -111A3 ; [.29B2.0020.0002] -111A4 ; [.29B3.0020.0002] -111A5 ; [.29B4.0020.0002] -111A6 ; [.29B5.0020.0002] -111A7 ; [.29B6.0020.0002] -111A8 ; [.29B7.0020.0002] -111A9 ; [.29B8.0020.0002] -111AA ; [.29B9.0020.0002] -111AB ; [.29BA.0020.0002] -111AC ; [.29BB.0020.0002] -111AD ; [.29BC.0020.0002] -111AE ; [.29BD.0020.0002] -111AF ; [.29BE.0020.0002] -111B0 ; [.29BF.0020.0002] -111B1 ; [.29C0.0020.0002] -111B2 ; [.29C1.0020.0002] -111C1 ; [.29C2.0020.0002] -111C2 ; [.29C3.0020.0002] -111C3 ; [.29C4.0020.0002] -111DC ; [.29C5.0020.0002] -111B3 ; [.29C6.0020.0002] -111B4 ; [.29C7.0020.0002] -111B5 ; [.29C8.0020.0002] -111B6 ; [.29C9.0020.0002] -111B7 ; [.29CA.0020.0002] -111B8 ; [.29CB.0020.0002] -111B9 ; [.29CC.0020.0002] -111BA ; [.29CD.0020.0002] -111BB ; [.29CE.0020.0002] -111BC ; [.29CF.0020.0002] -111BD ; [.29D0.0020.0002] -111BE ; [.29D1.0020.0002] -111BF ; [.29D2.0020.0002] -111C0 ; [.29D3.0020.0002] -11200 ; [.29D4.0020.0002] -11201 ; [.29D5.0020.0002] -11202 ; [.29D6.0020.0002] -11203 ; [.29D7.0020.0002] -11204 ; [.29D8.0020.0002] -11205 ; [.29D9.0020.0002] -11206 ; [.29DA.0020.0002] -11207 ; [.29DB.0020.0002] -11208 ; [.29DC.0020.0002] -11209 ; [.29DD.0020.0002] -1120A ; [.29DE.0020.0002] -1120B ; [.29DF.0020.0002] -1120C ; [.29E0.0020.0002] -1120D ; [.29E1.0020.0002] -1120E ; [.29E2.0020.0002] -1120F ; [.29E3.0020.0002] -11210 ; [.29E4.0020.0002] -11211 ; [.29E5.0020.0002] -11213 ; [.29E6.0020.0002] -11214 ; [.29E7.0020.0002] -11215 ; [.29E8.0020.0002] -11216 ; [.29E9.0020.0002] -11217 ; [.29EA.0020.0002] -11218 ; [.29EB.0020.0002] -11219 ; [.29EC.0020.0002] -1121A ; [.29ED.0020.0002] -1121B ; [.29EE.0020.0002] -1121C ; [.29EF.0020.0002] -1121D ; [.29F0.0020.0002] -1121E ; [.29F1.0020.0002] -1121F ; [.29F2.0020.0002] -11220 ; [.29F3.0020.0002] -11221 ; [.29F4.0020.0002] -11222 ; [.29F5.0020.0002] -11223 ; [.29F6.0020.0002] -11224 ; [.29F7.0020.0002] -11225 ; [.29F8.0020.0002] -11226 ; [.29F9.0020.0002] -11227 ; [.29FA.0020.0002] -11228 ; [.29FB.0020.0002] -11229 ; [.29FC.0020.0002] -1122A ; [.29FD.0020.0002] -1122B ; [.29FE.0020.0002] -1122C ; [.29FF.0020.0002] -1122D ; [.2A00.0020.0002] -1122E ; [.2A01.0020.0002] -1122F ; [.2A02.0020.0002] -11230 ; [.2A03.0020.0002] -11231 ; [.2A04.0020.0002] -11232 ; [.2A05.0020.0002] -11233 ; [.2A06.0020.0002] -11235 ; [.2A07.0020.0002] -112B0 ; [.2A08.0020.0002] -112B1 ; [.2A09.0020.0002] -112B2 ; [.2A0A.0020.0002] -112B3 ; [.2A0B.0020.0002] -112B4 ; [.2A0C.0020.0002] -112B5 ; [.2A0D.0020.0002] -112B6 ; [.2A0E.0020.0002] -112B7 ; [.2A0F.0020.0002] -112B8 ; [.2A10.0020.0002] -112B9 ; [.2A11.0020.0002] -112BA ; [.2A12.0020.0002] -112BB ; [.2A13.0020.0002] -112BC ; [.2A14.0020.0002] -112BD ; [.2A15.0020.0002] -112BE ; [.2A16.0020.0002] -112BF ; [.2A17.0020.0002] -112C0 ; [.2A18.0020.0002] -112C1 ; [.2A19.0020.0002] -112C2 ; [.2A1A.0020.0002] -112C3 ; [.2A1B.0020.0002] -112C4 ; [.2A1C.0020.0002] -112C5 ; [.2A1D.0020.0002] -112C6 ; [.2A1E.0020.0002] -112C7 ; [.2A1F.0020.0002] -112C8 ; [.2A20.0020.0002] -112C9 ; [.2A21.0020.0002] -112CA ; [.2A22.0020.0002] -112CB ; [.2A23.0020.0002] -112CC ; [.2A24.0020.0002] -112CD ; [.2A25.0020.0002] -112CE ; [.2A26.0020.0002] -112CF ; [.2A27.0020.0002] -112D0 ; [.2A28.0020.0002] -112D1 ; [.2A29.0020.0002] -112D2 ; [.2A2A.0020.0002] -112D3 ; [.2A2B.0020.0002] -112D4 ; [.2A2C.0020.0002] -112D5 ; [.2A2D.0020.0002] -112D6 ; [.2A2E.0020.0002] -112D7 ; [.2A2F.0020.0002] -112D8 ; [.2A30.0020.0002] -112D9 ; [.2A31.0020.0002] -112DA ; [.2A32.0020.0002] -112DB ; [.2A33.0020.0002] -112DC ; [.2A34.0020.0002] -112DD ; [.2A35.0020.0002] -112DE ; [.2A36.0020.0002] -112E0 ; [.2A37.0020.0002] -112E1 ; [.2A38.0020.0002] -112E2 ; [.2A39.0020.0002] -112E3 ; [.2A3A.0020.0002] -112E4 ; [.2A3B.0020.0002] -112E5 ; [.2A3C.0020.0002] -112E6 ; [.2A3D.0020.0002] -112E7 ; [.2A3E.0020.0002] -112E8 ; [.2A3F.0020.0002] -112EA ; [.2A40.0020.0002] -11280 ; [.2A41.0020.0002] -11281 ; [.2A42.0020.0002] -11282 ; [.2A43.0020.0002] -11283 ; [.2A44.0020.0002] -112A5 ; [.2A45.0020.0002] -112A6 ; [.2A46.0020.0002] -11284 ; [.2A47.0020.0002] -11285 ; [.2A48.0020.0002] -11286 ; [.2A49.0020.0002] -11288 ; [.2A4A.0020.0002] -1128A ; [.2A4B.0020.0002] -1128B ; [.2A4C.0020.0002] -1128C ; [.2A4D.0020.0002] -1128D ; [.2A4E.0020.0002] -1128F ; [.2A4F.0020.0002] -11290 ; [.2A50.0020.0002] -11291 ; [.2A51.0020.0002] -11292 ; [.2A52.0020.0002] -11293 ; [.2A53.0020.0002] -11294 ; [.2A54.0020.0002] -11295 ; [.2A55.0020.0002] -11296 ; [.2A56.0020.0002] -11297 ; [.2A57.0020.0002] -11298 ; [.2A58.0020.0002] -11299 ; [.2A59.0020.0002] -1129A ; [.2A5A.0020.0002] -1129B ; [.2A5B.0020.0002] -1129C ; [.2A5C.0020.0002] -1129D ; [.2A5D.0020.0002] -1129F ; [.2A5E.0020.0002] -112A0 ; [.2A5F.0020.0002] -112A1 ; [.2A60.0020.0002] -112A2 ; [.2A61.0020.0002] -112A3 ; [.2A62.0020.0002] -112A4 ; [.2A63.0020.0002] -112A7 ; [.2A64.0020.0002] -112A8 ; [.2A65.0020.0002] -11350 ; [.2A66.0020.0002] -11305 ; [.2A67.0020.0002] -11306 ; [.2A68.0020.0002] -11307 ; [.2A69.0020.0002] -11308 ; [.2A6A.0020.0002] -11309 ; [.2A6B.0020.0002] -1130A ; [.2A6C.0020.0002] -1130B ; [.2A6D.0020.0002] -11360 ; [.2A6E.0020.0002] -1130C ; [.2A6F.0020.0002] -11361 ; [.2A70.0020.0002] -1130F ; [.2A71.0020.0002] -11310 ; [.2A72.0020.0002] -11313 ; [.2A73.0020.0002] -11314 ; [.2A74.0020.0002] -11315 ; [.2A75.0020.0002] -11316 ; [.2A76.0020.0002] -11317 ; [.2A77.0020.0002] -11318 ; [.2A78.0020.0002] -11319 ; [.2A79.0020.0002] -1131A ; [.2A7A.0020.0002] -1131B ; [.2A7B.0020.0002] -1131C ; [.2A7C.0020.0002] -1131D ; [.2A7D.0020.0002] -1131E ; [.2A7E.0020.0002] -1131F ; [.2A7F.0020.0002] -11320 ; [.2A80.0020.0002] -11321 ; [.2A81.0020.0002] -11322 ; [.2A82.0020.0002] -11323 ; [.2A83.0020.0002] -11324 ; [.2A84.0020.0002] -11325 ; [.2A85.0020.0002] -11326 ; [.2A86.0020.0002] -11327 ; [.2A87.0020.0002] -11328 ; [.2A88.0020.0002] -1132A ; [.2A89.0020.0002] -1132B ; [.2A8A.0020.0002] -1132C ; [.2A8B.0020.0002] -1132D ; [.2A8C.0020.0002] -1132E ; [.2A8D.0020.0002] -1132F ; [.2A8E.0020.0002] -11330 ; [.2A8F.0020.0002] -11332 ; [.2A90.0020.0002] -11333 ; [.2A91.0020.0002] -11335 ; [.2A92.0020.0002] -11336 ; [.2A93.0020.0002] -11337 ; [.2A94.0020.0002] -11338 ; [.2A95.0020.0002] -11339 ; [.2A96.0020.0002] -1133D ; [.2A97.0020.0002] -1135E ; [.2A98.0020.0002] -1135F ; [.2A99.0020.0002] -1133E ; [.2A9A.0020.0002] -1133F ; [.2A9B.0020.0002] -11340 ; [.2A9C.0020.0002] -11341 ; [.2A9D.0020.0002] -11342 ; [.2A9E.0020.0002] -11343 ; [.2A9F.0020.0002] -11344 ; [.2AA0.0020.0002] -11362 ; [.2AA1.0020.0002] -11363 ; [.2AA2.0020.0002] -11347 ; [.2AA3.0020.0002] -11348 ; [.2AA4.0020.0002] -1134B ; [.2AA5.0020.0002] -11347 1133E ; [.2AA5.0020.0002] -1134C ; [.2AA6.0020.0002] -11347 11357 ; [.2AA6.0020.0002] -1134D ; [.2AA7.0020.0002] -11357 ; [.2AA8.0020.0002] -1135D ; [.2AA9.0020.0002] -114C7 ; [.2AAA.0020.0002] -11480 ; [.2AAB.0020.0002] -11481 ; [.2AAC.0020.0002] -11482 ; [.2AAD.0020.0002] -11483 ; [.2AAE.0020.0002] -11484 ; [.2AAF.0020.0002] -11485 ; [.2AB0.0020.0002] -11486 ; [.2AB1.0020.0002] -11487 ; [.2AB2.0020.0002] -11488 ; [.2AB3.0020.0002] -11489 ; [.2AB4.0020.0002] -1148A ; [.2AB5.0020.0002] -1148B ; [.2AB6.0020.0002] -1148C ; [.2AB7.0020.0002] -1148D ; [.2AB8.0020.0002] -1148E ; [.2AB9.0020.0002] -1148F ; [.2ABA.0020.0002] -11490 ; [.2ABB.0020.0002] -11491 ; [.2ABC.0020.0002] -11492 ; [.2ABD.0020.0002] -11493 ; [.2ABE.0020.0002] -11494 ; [.2ABF.0020.0002] -11495 ; [.2AC0.0020.0002] -11496 ; [.2AC1.0020.0002] -11497 ; [.2AC2.0020.0002] -11498 ; [.2AC3.0020.0002] -11499 ; [.2AC4.0020.0002] -1149A ; [.2AC5.0020.0002] -1149B ; [.2AC6.0020.0002] -1149C ; [.2AC7.0020.0002] -1149D ; [.2AC8.0020.0002] -1149E ; [.2AC9.0020.0002] -1149F ; [.2ACA.0020.0002] -114A0 ; [.2ACB.0020.0002] -114A1 ; [.2ACC.0020.0002] -114A2 ; [.2ACD.0020.0002] -114A3 ; [.2ACE.0020.0002] -114A4 ; [.2ACF.0020.0002] -114A5 ; [.2AD0.0020.0002] -114A6 ; [.2AD1.0020.0002] -114A7 ; [.2AD2.0020.0002] -114A8 ; [.2AD3.0020.0002] -114A9 ; [.2AD4.0020.0002] -114AA ; [.2AD5.0020.0002] -114AB ; [.2AD6.0020.0002] -114AC ; [.2AD7.0020.0002] -114AD ; [.2AD8.0020.0002] -114AE ; [.2AD9.0020.0002] -114AF ; [.2ADA.0020.0002] -114C4 ; [.2ADB.0020.0002] -114C5 ; [.2ADC.0020.0002] -114B0 ; [.2ADD.0020.0002] -114B1 ; [.2ADE.0020.0002] -114B2 ; [.2ADF.0020.0002] -114B3 ; [.2AE0.0020.0002] -114B4 ; [.2AE1.0020.0002] -114B5 ; [.2AE2.0020.0002] -114B6 ; [.2AE3.0020.0002] -114B7 ; [.2AE4.0020.0002] -114B8 ; [.2AE5.0020.0002] -114B9 ; [.2AE6.0020.0002] -114BA ; [.2AE7.0020.0002] -114BB ; [.2AE8.0020.0002] -114B9 114BA ; [.2AE8.0020.0002] -114BC ; [.2AE9.0020.0002] -114B9 114B0 ; [.2AE9.0020.0002] -114BD ; [.2AEA.0020.0002] -114BE ; [.2AEB.0020.0002] -114B9 114BD ; [.2AEB.0020.0002] -114C2 ; [.2AEC.0020.0002] -11580 ; [.2AED.0020.0002] -11581 ; [.2AEE.0020.0002] -11582 ; [.2AEF.0020.0002] -115D8 ; [.2AEF.0020.0004][.0000.010B.0004] -115D9 ; [.2AEF.0020.0004][.0000.010C.0004] -11583 ; [.2AF0.0020.0002] -115DA ; [.2AF0.0020.0004][.0000.010B.0004] -11584 ; [.2AF1.0020.0002] -115DB ; [.2AF1.0020.0004][.0000.010B.0004] -11585 ; [.2AF2.0020.0002] -11586 ; [.2AF3.0020.0002] -11587 ; [.2AF4.0020.0002] -11588 ; [.2AF5.0020.0002] -11589 ; [.2AF6.0020.0002] -1158A ; [.2AF7.0020.0002] -1158B ; [.2AF8.0020.0002] -1158C ; [.2AF9.0020.0002] -1158D ; [.2AFA.0020.0002] -1158E ; [.2AFB.0020.0002] -1158F ; [.2AFC.0020.0002] -11590 ; [.2AFD.0020.0002] -11591 ; [.2AFE.0020.0002] -11592 ; [.2AFF.0020.0002] -11593 ; [.2B00.0020.0002] -11594 ; [.2B01.0020.0002] -11595 ; [.2B02.0020.0002] -11596 ; [.2B03.0020.0002] -11597 ; [.2B04.0020.0002] -11598 ; [.2B05.0020.0002] -11599 ; [.2B06.0020.0002] -1159A ; [.2B07.0020.0002] -1159B ; [.2B08.0020.0002] -1159C ; [.2B09.0020.0002] -1159D ; [.2B0A.0020.0002] -1159E ; [.2B0B.0020.0002] -1159F ; [.2B0C.0020.0002] -115A0 ; [.2B0D.0020.0002] -115A1 ; [.2B0E.0020.0002] -115A2 ; [.2B0F.0020.0002] -115A3 ; [.2B10.0020.0002] -115A4 ; [.2B11.0020.0002] -115A5 ; [.2B12.0020.0002] -115A6 ; [.2B13.0020.0002] -115A7 ; [.2B14.0020.0002] -115A8 ; [.2B15.0020.0002] -115A9 ; [.2B16.0020.0002] -115AA ; [.2B17.0020.0002] -115AB ; [.2B18.0020.0002] -115AC ; [.2B19.0020.0002] -115AD ; [.2B1A.0020.0002] -115AE ; [.2B1B.0020.0002] -115AF ; [.2B1C.0020.0002] -115B0 ; [.2B1D.0020.0002] -115B1 ; [.2B1E.0020.0002] -115B2 ; [.2B1F.0020.0002] -115DC ; [.2B1F.0020.0004][.0000.010B.0004] -115B3 ; [.2B20.0020.0002] -115DD ; [.2B20.0020.0004][.0000.010B.0004] -115B4 ; [.2B21.0020.0002] -115B5 ; [.2B22.0020.0002] -115B8 ; [.2B23.0020.0002] -115B9 ; [.2B24.0020.0002] -115BA ; [.2B25.0020.0002] -115B8 115AF ; [.2B25.0020.0002] -115BB ; [.2B26.0020.0002] -115B9 115AF ; [.2B26.0020.0002] -115BF ; [.2B27.0020.0002] -11600 ; [.2B28.0020.0002] -11601 ; [.2B29.0020.0002] -11602 ; [.2B2A.0020.0002] -11603 ; [.2B2B.0020.0002] -11604 ; [.2B2C.0020.0002] -11605 ; [.2B2D.0020.0002] -11606 ; [.2B2E.0020.0002] -11607 ; [.2B2F.0020.0002] -11608 ; [.2B30.0020.0002] -11609 ; [.2B31.0020.0002] -1160A ; [.2B32.0020.0002] -1160B ; [.2B33.0020.0002] -1160C ; [.2B34.0020.0002] -1160D ; [.2B35.0020.0002] -1160E ; [.2B36.0020.0002] -1160F ; [.2B37.0020.0002] -11610 ; [.2B38.0020.0002] -11611 ; [.2B39.0020.0002] -11612 ; [.2B3A.0020.0002] -11613 ; [.2B3B.0020.0002] -11614 ; [.2B3C.0020.0002] -11615 ; [.2B3D.0020.0002] -11616 ; [.2B3E.0020.0002] -11617 ; [.2B3F.0020.0002] -11618 ; [.2B40.0020.0002] -11619 ; [.2B41.0020.0002] -1161A ; [.2B42.0020.0002] -1161B ; [.2B43.0020.0002] -1161C ; [.2B44.0020.0002] -1161D ; [.2B45.0020.0002] -1161E ; [.2B46.0020.0002] -1161F ; [.2B47.0020.0002] -11620 ; [.2B48.0020.0002] -11621 ; [.2B49.0020.0002] -11622 ; [.2B4A.0020.0002] -11623 ; [.2B4B.0020.0002] -11624 ; [.2B4C.0020.0002] -11625 ; [.2B4D.0020.0002] -11626 ; [.2B4E.0020.0002] -11627 ; [.2B4F.0020.0002] -11628 ; [.2B50.0020.0002] -11629 ; [.2B51.0020.0002] -1162A ; [.2B52.0020.0002] -1162B ; [.2B53.0020.0002] -1162C ; [.2B54.0020.0002] -1162D ; [.2B55.0020.0002] -1162E ; [.2B56.0020.0002] -1162F ; [.2B57.0020.0002] -11630 ; [.2B58.0020.0002] -11631 ; [.2B59.0020.0002] -11632 ; [.2B5A.0020.0002] -11633 ; [.2B5B.0020.0002] -11634 ; [.2B5C.0020.0002] -11635 ; [.2B5D.0020.0002] -11636 ; [.2B5E.0020.0002] -11637 ; [.2B5F.0020.0002] -11638 ; [.2B60.0020.0002] -11639 ; [.2B61.0020.0002] -1163A ; [.2B62.0020.0002] -1163B ; [.2B63.0020.0002] -1163C ; [.2B64.0020.0002] -1163F ; [.2B65.0020.0002] -11644 ; [.2B66.0020.0002] -11680 ; [.2B67.0020.0002] -11681 ; [.2B68.0020.0002] -11682 ; [.2B69.0020.0002] -11683 ; [.2B6A.0020.0002] -11684 ; [.2B6B.0020.0002] -11685 ; [.2B6C.0020.0002] -11686 ; [.2B6D.0020.0002] -11687 ; [.2B6E.0020.0002] -11688 ; [.2B6F.0020.0002] -11689 ; [.2B70.0020.0002] -116A8 ; [.2B71.0020.0002] -116A7 ; [.2B72.0020.0002] -116A9 ; [.2B73.0020.0002] -1168A ; [.2B74.0020.0002] -1168B ; [.2B75.0020.0002] -1168C ; [.2B76.0020.0002] -1168D ; [.2B77.0020.0002] -1168E ; [.2B78.0020.0002] -1168F ; [.2B79.0020.0002] -11690 ; [.2B7A.0020.0002] -11691 ; [.2B7B.0020.0002] -11692 ; [.2B7C.0020.0002] -11693 ; [.2B7D.0020.0002] -11694 ; [.2B7E.0020.0002] -11695 ; [.2B7F.0020.0002] -11696 ; [.2B80.0020.0002] -11697 ; [.2B81.0020.0002] -11698 ; [.2B82.0020.0002] -11699 ; [.2B83.0020.0002] -1169A ; [.2B84.0020.0002] -1169B ; [.2B85.0020.0002] -1169C ; [.2B86.0020.0002] -1169D ; [.2B87.0020.0002] -1169E ; [.2B88.0020.0002] -1169F ; [.2B89.0020.0002] -116A0 ; [.2B8A.0020.0002] -116A1 ; [.2B8B.0020.0002] -116A2 ; [.2B8C.0020.0002] -116A3 ; [.2B8D.0020.0002] -116A4 ; [.2B8E.0020.0002] -116A5 ; [.2B8F.0020.0002] -116A6 ; [.2B90.0020.0002] -116AA ; [.2B91.0020.0002] -116AD ; [.2B92.0020.0002] -116AE ; [.2B93.0020.0002] -116AF ; [.2B94.0020.0002] -116B0 ; [.2B95.0020.0002] -116B1 ; [.2B96.0020.0002] -116B2 ; [.2B97.0020.0002] -116B3 ; [.2B98.0020.0002] -116B4 ; [.2B99.0020.0002] -116B5 ; [.2B9A.0020.0002] -116B6 ; [.2B9B.0020.0002] -11700 ; [.2B9C.0020.0002] -11701 ; [.2B9D.0020.0002] -11702 ; [.2B9E.0020.0002] -11703 ; [.2B9F.0020.0002] -11704 ; [.2BA0.0020.0002] -11705 ; [.2BA0.0020.0004][.0000.010B.0004] -11706 ; [.2BA1.0020.0002] -11707 ; [.2BA2.0020.0002] -11708 ; [.2BA3.0020.0002] -11709 ; [.2BA4.0020.0002] -1170A ; [.2BA5.0020.0002] -1170B ; [.2BA6.0020.0002] -1170C ; [.2BA7.0020.0002] -1170D ; [.2BA8.0020.0002] -1170E ; [.2BA9.0020.0002] -1170F ; [.2BAA.0020.0002] -11710 ; [.2BAB.0020.0002] -11711 ; [.2BAC.0020.0002] -11712 ; [.2BAD.0020.0002] -11713 ; [.2BAE.0020.0002] -11714 ; [.2BAF.0020.0002] -11715 ; [.2BB0.0020.0002] -11716 ; [.2BB0.0020.0004][.0000.010B.0004] -11717 ; [.2BB1.0020.0002] -11718 ; [.2BB2.0020.0002] -11719 ; [.2BB3.0020.0002] -11720 ; [.2BB4.0020.0002] -11721 ; [.2BB5.0020.0002] -11722 ; [.2BB6.0020.0002] -11723 ; [.2BB7.0020.0002] -11724 ; [.2BB8.0020.0002] -11725 ; [.2BB9.0020.0002] -11726 ; [.2BBA.0020.0002] -11727 ; [.2BBB.0020.0002] -11728 ; [.2BBC.0020.0002] -11729 ; [.2BBD.0020.0002] -1172A ; [.2BBE.0020.0002] -1172B ; [.2BBF.0020.0002] -1171D ; [.2BC0.0020.0002] -1171E ; [.2BC1.0020.0002] -1171F ; [.2BC2.0020.0002] -1B83 ; [.2BC3.0020.0002] -1BBA ; [.2BC3.0020.0004] -1B84 ; [.2BC4.0020.0002] -1B85 ; [.2BC5.0020.0002] -1B86 ; [.2BC6.0020.0002] -1B87 ; [.2BC7.0020.0002] -1B88 ; [.2BC8.0020.0002] -1B89 ; [.2BC9.0020.0002] -1B8A ; [.2BCA.0020.0002] -1BBE ; [.2BCA.0020.0019] -1BAE ; [.2BCB.0020.0002] -1B8B ; [.2BCC.0020.0002] -1B8C ; [.2BCD.0020.0002] -1B8D ; [.2BCE.0020.0002] -1B8E ; [.2BCF.0020.0002] -1B8F ; [.2BD0.0020.0002] -1B90 ; [.2BD1.0020.0002] -1B91 ; [.2BD2.0020.0002] -1B92 ; [.2BD3.0020.0002] -1B93 ; [.2BD4.0020.0002] -1B94 ; [.2BD5.0020.0002] -1B95 ; [.2BD6.0020.0002] -1B96 ; [.2BD7.0020.0002] -1B97 ; [.2BD8.0020.0002] -1B98 ; [.2BD9.0020.0002] -1BBD ; [.2BDA.0020.0002] -1B99 ; [.2BDB.0020.0002] -1BBF ; [.2BDB.0020.0019] -1BAC ; [.2BDC.0020.0002] -1B9A ; [.2BDD.0020.0002] -1BA1 ; [.2BDE.0020.0002] -1B9B ; [.2BDF.0020.0002] -1BA2 ; [.2BE0.0020.0002] -1BBB ; [.2BE1.0020.0002] -1B9C ; [.2BE2.0020.0002] -1BA3 ; [.2BE3.0020.0002] -1BBC ; [.2BE4.0020.0002] -1B9D ; [.2BE5.0020.0002] -1BAD ; [.2BE6.0020.0002] -1B9E ; [.2BE7.0020.0002] -1B9F ; [.2BE8.0020.0002] -1BAF ; [.2BE9.0020.0002] -1BA0 ; [.2BEA.0020.0002] -1BA4 ; [.2BEB.0020.0002] -1BA5 ; [.2BEC.0020.0002] -1BA6 ; [.2BED.0020.0002] -1BA7 ; [.2BEE.0020.0002] -1BA8 ; [.2BEF.0020.0002] -1BA9 ; [.2BF0.0020.0002] -1BAA ; [.2BF1.0020.0002] -1BAB ; [.2BF2.0020.0002] -11005 ; [.2BF3.0020.0002] -11006 ; [.2BF4.0020.0002] -11007 ; [.2BF5.0020.0002] -11008 ; [.2BF6.0020.0002] -11009 ; [.2BF7.0020.0002] -1100A ; [.2BF8.0020.0002] -1100B ; [.2BF9.0020.0002] -1100C ; [.2BFA.0020.0002] -1100D ; [.2BFB.0020.0002] -1100E ; [.2BFC.0020.0002] -1100F ; [.2BFD.0020.0002] -11010 ; [.2BFE.0020.0002] -11011 ; [.2BFF.0020.0002] -11012 ; [.2C00.0020.0002] -11013 ; [.2C01.0020.0002] -11014 ; [.2C02.0020.0002] -11015 ; [.2C03.0020.0002] -11016 ; [.2C04.0020.0002] -11017 ; [.2C05.0020.0002] -11018 ; [.2C06.0020.0002] -11019 ; [.2C07.0020.0002] -1101A ; [.2C08.0020.0002] -1101B ; [.2C09.0020.0002] -1101C ; [.2C0A.0020.0002] -1101D ; [.2C0B.0020.0002] -1101E ; [.2C0C.0020.0002] -1101F ; [.2C0D.0020.0002] -11020 ; [.2C0E.0020.0002] -11021 ; [.2C0F.0020.0002] -11022 ; [.2C10.0020.0002] -11023 ; [.2C11.0020.0002] -11024 ; [.2C12.0020.0002] -11025 ; [.2C13.0020.0002] -11026 ; [.2C14.0020.0002] -11027 ; [.2C15.0020.0002] -11028 ; [.2C16.0020.0002] -11029 ; [.2C17.0020.0002] -1102A ; [.2C18.0020.0002] -1102B ; [.2C19.0020.0002] -1102C ; [.2C1A.0020.0002] -1102D ; [.2C1B.0020.0002] -1102E ; [.2C1C.0020.0002] -1102F ; [.2C1D.0020.0002] -11030 ; [.2C1E.0020.0002] -11031 ; [.2C1F.0020.0002] -11032 ; [.2C20.0020.0002] -11033 ; [.2C21.0020.0002] -11003 ; [.2C22.0020.0002] -11004 ; [.2C23.0020.0002] -11034 ; [.2C24.0020.0002] -11035 ; [.2C25.0020.0002] -11036 ; [.2C26.0020.0002] -11037 ; [.2C27.0020.0002] -11038 ; [.2C28.0020.0002] -11039 ; [.2C29.0020.0002] -1103A ; [.2C2A.0020.0002] -1103B ; [.2C2B.0020.0002] -1103C ; [.2C2C.0020.0002] -1103D ; [.2C2D.0020.0002] -1103E ; [.2C2E.0020.0002] -1103F ; [.2C2F.0020.0002] -11040 ; [.2C30.0020.0002] -11041 ; [.2C31.0020.0002] -11042 ; [.2C32.0020.0002] -11043 ; [.2C33.0020.0002] -11044 ; [.2C34.0020.0002] -11045 ; [.2C35.0020.0002] -11046 ; [.2C36.0020.0002] -1107F ; [.2C37.0020.0002] -10A00 ; [.2C38.0020.0002] -10A01 ; [.2C39.0020.0002] -10A02 ; [.2C3A.0020.0002] -10A03 ; [.2C3B.0020.0002] -10A05 ; [.2C3C.0020.0002] -10A06 ; [.2C3D.0020.0002] -10A0C ; [.2C3E.0020.0002] -10A10 ; [.2C3F.0020.0002] -10A11 ; [.2C40.0020.0002] -10A12 ; [.2C41.0020.0002] -10A13 ; [.2C42.0020.0002] -10A15 ; [.2C43.0020.0002] -10A16 ; [.2C44.0020.0002] -10A17 ; [.2C45.0020.0002] -10A19 ; [.2C46.0020.0002] -10A1A ; [.2C47.0020.0002] -10A1B ; [.2C48.0020.0002] -10A1C ; [.2C49.0020.0002] -10A1D ; [.2C4A.0020.0002] -10A1E ; [.2C4B.0020.0002] -10A1F ; [.2C4C.0020.0002] -10A20 ; [.2C4D.0020.0002] -10A21 ; [.2C4E.0020.0002] -10A22 ; [.2C4F.0020.0002] -10A23 ; [.2C50.0020.0002] -10A24 ; [.2C51.0020.0002] -10A25 ; [.2C52.0020.0002] -10A26 ; [.2C53.0020.0002] -10A27 ; [.2C54.0020.0002] -10A28 ; [.2C55.0020.0002] -10A29 ; [.2C56.0020.0002] -10A2A ; [.2C57.0020.0002] -10A2B ; [.2C58.0020.0002] -10A2C ; [.2C59.0020.0002] -10A2D ; [.2C5A.0020.0002] -10A2E ; [.2C5B.0020.0002] -10A2F ; [.2C5C.0020.0002] -10A30 ; [.2C5D.0020.0002] -10A31 ; [.2C5E.0020.0002] -10A32 ; [.2C5F.0020.0002] -10A33 ; [.2C60.0020.0002] -10A3F ; [.2C61.0020.0002] -0E01 ; [.2C62.0020.0002] -0E40 0E01 ; [.2C62.0020.0002][.2C9C.0020.0002] -0E41 0E01 ; [.2C62.0020.0002][.2C9D.0020.0002] -0E42 0E01 ; [.2C62.0020.0002][.2C9E.0020.0002] -0E43 0E01 ; [.2C62.0020.0002][.2C9F.0020.0002] -0E44 0E01 ; [.2C62.0020.0002][.2CA0.0020.0002] -0E02 ; [.2C63.0020.0002] -0E40 0E02 ; [.2C63.0020.0002][.2C9C.0020.0002] -0E41 0E02 ; [.2C63.0020.0002][.2C9D.0020.0002] -0E42 0E02 ; [.2C63.0020.0002][.2C9E.0020.0002] -0E43 0E02 ; [.2C63.0020.0002][.2C9F.0020.0002] -0E44 0E02 ; [.2C63.0020.0002][.2CA0.0020.0002] -0E03 ; [.2C64.0020.0002] -0E40 0E03 ; [.2C64.0020.0002][.2C9C.0020.0002] -0E41 0E03 ; [.2C64.0020.0002][.2C9D.0020.0002] -0E42 0E03 ; [.2C64.0020.0002][.2C9E.0020.0002] -0E43 0E03 ; [.2C64.0020.0002][.2C9F.0020.0002] -0E44 0E03 ; [.2C64.0020.0002][.2CA0.0020.0002] -0E04 ; [.2C65.0020.0002] -0E40 0E04 ; [.2C65.0020.0002][.2C9C.0020.0002] -0E41 0E04 ; [.2C65.0020.0002][.2C9D.0020.0002] -0E42 0E04 ; [.2C65.0020.0002][.2C9E.0020.0002] -0E43 0E04 ; [.2C65.0020.0002][.2C9F.0020.0002] -0E44 0E04 ; [.2C65.0020.0002][.2CA0.0020.0002] -0E05 ; [.2C66.0020.0002] -0E40 0E05 ; [.2C66.0020.0002][.2C9C.0020.0002] -0E41 0E05 ; [.2C66.0020.0002][.2C9D.0020.0002] -0E42 0E05 ; [.2C66.0020.0002][.2C9E.0020.0002] -0E43 0E05 ; [.2C66.0020.0002][.2C9F.0020.0002] -0E44 0E05 ; [.2C66.0020.0002][.2CA0.0020.0002] -0E06 ; [.2C67.0020.0002] -0E40 0E06 ; [.2C67.0020.0002][.2C9C.0020.0002] -0E41 0E06 ; [.2C67.0020.0002][.2C9D.0020.0002] -0E42 0E06 ; [.2C67.0020.0002][.2C9E.0020.0002] -0E43 0E06 ; [.2C67.0020.0002][.2C9F.0020.0002] -0E44 0E06 ; [.2C67.0020.0002][.2CA0.0020.0002] -0E07 ; [.2C68.0020.0002] -0E40 0E07 ; [.2C68.0020.0002][.2C9C.0020.0002] -0E41 0E07 ; [.2C68.0020.0002][.2C9D.0020.0002] -0E42 0E07 ; [.2C68.0020.0002][.2C9E.0020.0002] -0E43 0E07 ; [.2C68.0020.0002][.2C9F.0020.0002] -0E44 0E07 ; [.2C68.0020.0002][.2CA0.0020.0002] -0E08 ; [.2C69.0020.0002] -0E40 0E08 ; [.2C69.0020.0002][.2C9C.0020.0002] -0E41 0E08 ; [.2C69.0020.0002][.2C9D.0020.0002] -0E42 0E08 ; [.2C69.0020.0002][.2C9E.0020.0002] -0E43 0E08 ; [.2C69.0020.0002][.2C9F.0020.0002] -0E44 0E08 ; [.2C69.0020.0002][.2CA0.0020.0002] -0E09 ; [.2C6A.0020.0002] -0E40 0E09 ; [.2C6A.0020.0002][.2C9C.0020.0002] -0E41 0E09 ; [.2C6A.0020.0002][.2C9D.0020.0002] -0E42 0E09 ; [.2C6A.0020.0002][.2C9E.0020.0002] -0E43 0E09 ; [.2C6A.0020.0002][.2C9F.0020.0002] -0E44 0E09 ; [.2C6A.0020.0002][.2CA0.0020.0002] -0E0A ; [.2C6B.0020.0002] -0E40 0E0A ; [.2C6B.0020.0002][.2C9C.0020.0002] -0E41 0E0A ; [.2C6B.0020.0002][.2C9D.0020.0002] -0E42 0E0A ; [.2C6B.0020.0002][.2C9E.0020.0002] -0E43 0E0A ; [.2C6B.0020.0002][.2C9F.0020.0002] -0E44 0E0A ; [.2C6B.0020.0002][.2CA0.0020.0002] -0E0B ; [.2C6C.0020.0002] -0E40 0E0B ; [.2C6C.0020.0002][.2C9C.0020.0002] -0E41 0E0B ; [.2C6C.0020.0002][.2C9D.0020.0002] -0E42 0E0B ; [.2C6C.0020.0002][.2C9E.0020.0002] -0E43 0E0B ; [.2C6C.0020.0002][.2C9F.0020.0002] -0E44 0E0B ; [.2C6C.0020.0002][.2CA0.0020.0002] -0E0C ; [.2C6D.0020.0002] -0E40 0E0C ; [.2C6D.0020.0002][.2C9C.0020.0002] -0E41 0E0C ; [.2C6D.0020.0002][.2C9D.0020.0002] -0E42 0E0C ; [.2C6D.0020.0002][.2C9E.0020.0002] -0E43 0E0C ; [.2C6D.0020.0002][.2C9F.0020.0002] -0E44 0E0C ; [.2C6D.0020.0002][.2CA0.0020.0002] -0E0D ; [.2C6E.0020.0002] -0E40 0E0D ; [.2C6E.0020.0002][.2C9C.0020.0002] -0E41 0E0D ; [.2C6E.0020.0002][.2C9D.0020.0002] -0E42 0E0D ; [.2C6E.0020.0002][.2C9E.0020.0002] -0E43 0E0D ; [.2C6E.0020.0002][.2C9F.0020.0002] -0E44 0E0D ; [.2C6E.0020.0002][.2CA0.0020.0002] -0E0E ; [.2C6F.0020.0002] -0E40 0E0E ; [.2C6F.0020.0002][.2C9C.0020.0002] -0E41 0E0E ; [.2C6F.0020.0002][.2C9D.0020.0002] -0E42 0E0E ; [.2C6F.0020.0002][.2C9E.0020.0002] -0E43 0E0E ; [.2C6F.0020.0002][.2C9F.0020.0002] -0E44 0E0E ; [.2C6F.0020.0002][.2CA0.0020.0002] -0E0F ; [.2C70.0020.0002] -0E40 0E0F ; [.2C70.0020.0002][.2C9C.0020.0002] -0E41 0E0F ; [.2C70.0020.0002][.2C9D.0020.0002] -0E42 0E0F ; [.2C70.0020.0002][.2C9E.0020.0002] -0E43 0E0F ; [.2C70.0020.0002][.2C9F.0020.0002] -0E44 0E0F ; [.2C70.0020.0002][.2CA0.0020.0002] -0E10 ; [.2C71.0020.0002] -0E40 0E10 ; [.2C71.0020.0002][.2C9C.0020.0002] -0E41 0E10 ; [.2C71.0020.0002][.2C9D.0020.0002] -0E42 0E10 ; [.2C71.0020.0002][.2C9E.0020.0002] -0E43 0E10 ; [.2C71.0020.0002][.2C9F.0020.0002] -0E44 0E10 ; [.2C71.0020.0002][.2CA0.0020.0002] -0E11 ; [.2C72.0020.0002] -0E40 0E11 ; [.2C72.0020.0002][.2C9C.0020.0002] -0E41 0E11 ; [.2C72.0020.0002][.2C9D.0020.0002] -0E42 0E11 ; [.2C72.0020.0002][.2C9E.0020.0002] -0E43 0E11 ; [.2C72.0020.0002][.2C9F.0020.0002] -0E44 0E11 ; [.2C72.0020.0002][.2CA0.0020.0002] -0E12 ; [.2C73.0020.0002] -0E40 0E12 ; [.2C73.0020.0002][.2C9C.0020.0002] -0E41 0E12 ; [.2C73.0020.0002][.2C9D.0020.0002] -0E42 0E12 ; [.2C73.0020.0002][.2C9E.0020.0002] -0E43 0E12 ; [.2C73.0020.0002][.2C9F.0020.0002] -0E44 0E12 ; [.2C73.0020.0002][.2CA0.0020.0002] -0E13 ; [.2C74.0020.0002] -0E40 0E13 ; [.2C74.0020.0002][.2C9C.0020.0002] -0E41 0E13 ; [.2C74.0020.0002][.2C9D.0020.0002] -0E42 0E13 ; [.2C74.0020.0002][.2C9E.0020.0002] -0E43 0E13 ; [.2C74.0020.0002][.2C9F.0020.0002] -0E44 0E13 ; [.2C74.0020.0002][.2CA0.0020.0002] -0E14 ; [.2C75.0020.0002] -0E40 0E14 ; [.2C75.0020.0002][.2C9C.0020.0002] -0E41 0E14 ; [.2C75.0020.0002][.2C9D.0020.0002] -0E42 0E14 ; [.2C75.0020.0002][.2C9E.0020.0002] -0E43 0E14 ; [.2C75.0020.0002][.2C9F.0020.0002] -0E44 0E14 ; [.2C75.0020.0002][.2CA0.0020.0002] -0E15 ; [.2C76.0020.0002] -0E40 0E15 ; [.2C76.0020.0002][.2C9C.0020.0002] -0E41 0E15 ; [.2C76.0020.0002][.2C9D.0020.0002] -0E42 0E15 ; [.2C76.0020.0002][.2C9E.0020.0002] -0E43 0E15 ; [.2C76.0020.0002][.2C9F.0020.0002] -0E44 0E15 ; [.2C76.0020.0002][.2CA0.0020.0002] -0E16 ; [.2C77.0020.0002] -0E40 0E16 ; [.2C77.0020.0002][.2C9C.0020.0002] -0E41 0E16 ; [.2C77.0020.0002][.2C9D.0020.0002] -0E42 0E16 ; [.2C77.0020.0002][.2C9E.0020.0002] -0E43 0E16 ; [.2C77.0020.0002][.2C9F.0020.0002] -0E44 0E16 ; [.2C77.0020.0002][.2CA0.0020.0002] -0E17 ; [.2C78.0020.0002] -0E40 0E17 ; [.2C78.0020.0002][.2C9C.0020.0002] -0E41 0E17 ; [.2C78.0020.0002][.2C9D.0020.0002] -0E42 0E17 ; [.2C78.0020.0002][.2C9E.0020.0002] -0E43 0E17 ; [.2C78.0020.0002][.2C9F.0020.0002] -0E44 0E17 ; [.2C78.0020.0002][.2CA0.0020.0002] -0E18 ; [.2C79.0020.0002] -0E40 0E18 ; [.2C79.0020.0002][.2C9C.0020.0002] -0E41 0E18 ; [.2C79.0020.0002][.2C9D.0020.0002] -0E42 0E18 ; [.2C79.0020.0002][.2C9E.0020.0002] -0E43 0E18 ; [.2C79.0020.0002][.2C9F.0020.0002] -0E44 0E18 ; [.2C79.0020.0002][.2CA0.0020.0002] -0E19 ; [.2C7A.0020.0002] -0E40 0E19 ; [.2C7A.0020.0002][.2C9C.0020.0002] -0E41 0E19 ; [.2C7A.0020.0002][.2C9D.0020.0002] -0E42 0E19 ; [.2C7A.0020.0002][.2C9E.0020.0002] -0E43 0E19 ; [.2C7A.0020.0002][.2C9F.0020.0002] -0E44 0E19 ; [.2C7A.0020.0002][.2CA0.0020.0002] -0E1A ; [.2C7B.0020.0002] -0E40 0E1A ; [.2C7B.0020.0002][.2C9C.0020.0002] -0E41 0E1A ; [.2C7B.0020.0002][.2C9D.0020.0002] -0E42 0E1A ; [.2C7B.0020.0002][.2C9E.0020.0002] -0E43 0E1A ; [.2C7B.0020.0002][.2C9F.0020.0002] -0E44 0E1A ; [.2C7B.0020.0002][.2CA0.0020.0002] -0E1B ; [.2C7C.0020.0002] -0E40 0E1B ; [.2C7C.0020.0002][.2C9C.0020.0002] -0E41 0E1B ; [.2C7C.0020.0002][.2C9D.0020.0002] -0E42 0E1B ; [.2C7C.0020.0002][.2C9E.0020.0002] -0E43 0E1B ; [.2C7C.0020.0002][.2C9F.0020.0002] -0E44 0E1B ; [.2C7C.0020.0002][.2CA0.0020.0002] -0E1C ; [.2C7D.0020.0002] -0E40 0E1C ; [.2C7D.0020.0002][.2C9C.0020.0002] -0E41 0E1C ; [.2C7D.0020.0002][.2C9D.0020.0002] -0E42 0E1C ; [.2C7D.0020.0002][.2C9E.0020.0002] -0E43 0E1C ; [.2C7D.0020.0002][.2C9F.0020.0002] -0E44 0E1C ; [.2C7D.0020.0002][.2CA0.0020.0002] -0E1D ; [.2C7E.0020.0002] -0E40 0E1D ; [.2C7E.0020.0002][.2C9C.0020.0002] -0E41 0E1D ; [.2C7E.0020.0002][.2C9D.0020.0002] -0E42 0E1D ; [.2C7E.0020.0002][.2C9E.0020.0002] -0E43 0E1D ; [.2C7E.0020.0002][.2C9F.0020.0002] -0E44 0E1D ; [.2C7E.0020.0002][.2CA0.0020.0002] -0E1E ; [.2C7F.0020.0002] -0E40 0E1E ; [.2C7F.0020.0002][.2C9C.0020.0002] -0E41 0E1E ; [.2C7F.0020.0002][.2C9D.0020.0002] -0E42 0E1E ; [.2C7F.0020.0002][.2C9E.0020.0002] -0E43 0E1E ; [.2C7F.0020.0002][.2C9F.0020.0002] -0E44 0E1E ; [.2C7F.0020.0002][.2CA0.0020.0002] -0E1F ; [.2C80.0020.0002] -0E40 0E1F ; [.2C80.0020.0002][.2C9C.0020.0002] -0E41 0E1F ; [.2C80.0020.0002][.2C9D.0020.0002] -0E42 0E1F ; [.2C80.0020.0002][.2C9E.0020.0002] -0E43 0E1F ; [.2C80.0020.0002][.2C9F.0020.0002] -0E44 0E1F ; [.2C80.0020.0002][.2CA0.0020.0002] -0E20 ; [.2C81.0020.0002] -0E40 0E20 ; [.2C81.0020.0002][.2C9C.0020.0002] -0E41 0E20 ; [.2C81.0020.0002][.2C9D.0020.0002] -0E42 0E20 ; [.2C81.0020.0002][.2C9E.0020.0002] -0E43 0E20 ; [.2C81.0020.0002][.2C9F.0020.0002] -0E44 0E20 ; [.2C81.0020.0002][.2CA0.0020.0002] -0E21 ; [.2C82.0020.0002] -0E40 0E21 ; [.2C82.0020.0002][.2C9C.0020.0002] -0E41 0E21 ; [.2C82.0020.0002][.2C9D.0020.0002] -0E42 0E21 ; [.2C82.0020.0002][.2C9E.0020.0002] -0E43 0E21 ; [.2C82.0020.0002][.2C9F.0020.0002] -0E44 0E21 ; [.2C82.0020.0002][.2CA0.0020.0002] -0E22 ; [.2C83.0020.0002] -0E40 0E22 ; [.2C83.0020.0002][.2C9C.0020.0002] -0E41 0E22 ; [.2C83.0020.0002][.2C9D.0020.0002] -0E42 0E22 ; [.2C83.0020.0002][.2C9E.0020.0002] -0E43 0E22 ; [.2C83.0020.0002][.2C9F.0020.0002] -0E44 0E22 ; [.2C83.0020.0002][.2CA0.0020.0002] -0E23 ; [.2C84.0020.0002] -0E40 0E23 ; [.2C84.0020.0002][.2C9C.0020.0002] -0E41 0E23 ; [.2C84.0020.0002][.2C9D.0020.0002] -0E42 0E23 ; [.2C84.0020.0002][.2C9E.0020.0002] -0E43 0E23 ; [.2C84.0020.0002][.2C9F.0020.0002] -0E44 0E23 ; [.2C84.0020.0002][.2CA0.0020.0002] -0E24 ; [.2C85.0020.0002] -0E40 0E24 ; [.2C85.0020.0002][.2C9C.0020.0002] -0E41 0E24 ; [.2C85.0020.0002][.2C9D.0020.0002] -0E42 0E24 ; [.2C85.0020.0002][.2C9E.0020.0002] -0E43 0E24 ; [.2C85.0020.0002][.2C9F.0020.0002] -0E44 0E24 ; [.2C85.0020.0002][.2CA0.0020.0002] -0E25 ; [.2C86.0020.0002] -0E40 0E25 ; [.2C86.0020.0002][.2C9C.0020.0002] -0E41 0E25 ; [.2C86.0020.0002][.2C9D.0020.0002] -0E42 0E25 ; [.2C86.0020.0002][.2C9E.0020.0002] -0E43 0E25 ; [.2C86.0020.0002][.2C9F.0020.0002] -0E44 0E25 ; [.2C86.0020.0002][.2CA0.0020.0002] -0E26 ; [.2C87.0020.0002] -0E40 0E26 ; [.2C87.0020.0002][.2C9C.0020.0002] -0E41 0E26 ; [.2C87.0020.0002][.2C9D.0020.0002] -0E42 0E26 ; [.2C87.0020.0002][.2C9E.0020.0002] -0E43 0E26 ; [.2C87.0020.0002][.2C9F.0020.0002] -0E44 0E26 ; [.2C87.0020.0002][.2CA0.0020.0002] -0E27 ; [.2C88.0020.0002] -0E40 0E27 ; [.2C88.0020.0002][.2C9C.0020.0002] -0E41 0E27 ; [.2C88.0020.0002][.2C9D.0020.0002] -0E42 0E27 ; [.2C88.0020.0002][.2C9E.0020.0002] -0E43 0E27 ; [.2C88.0020.0002][.2C9F.0020.0002] -0E44 0E27 ; [.2C88.0020.0002][.2CA0.0020.0002] -0E28 ; [.2C89.0020.0002] -0E40 0E28 ; [.2C89.0020.0002][.2C9C.0020.0002] -0E41 0E28 ; [.2C89.0020.0002][.2C9D.0020.0002] -0E42 0E28 ; [.2C89.0020.0002][.2C9E.0020.0002] -0E43 0E28 ; [.2C89.0020.0002][.2C9F.0020.0002] -0E44 0E28 ; [.2C89.0020.0002][.2CA0.0020.0002] -0E29 ; [.2C8A.0020.0002] -0E40 0E29 ; [.2C8A.0020.0002][.2C9C.0020.0002] -0E41 0E29 ; [.2C8A.0020.0002][.2C9D.0020.0002] -0E42 0E29 ; [.2C8A.0020.0002][.2C9E.0020.0002] -0E43 0E29 ; [.2C8A.0020.0002][.2C9F.0020.0002] -0E44 0E29 ; [.2C8A.0020.0002][.2CA0.0020.0002] -0E2A ; [.2C8B.0020.0002] -0E40 0E2A ; [.2C8B.0020.0002][.2C9C.0020.0002] -0E41 0E2A ; [.2C8B.0020.0002][.2C9D.0020.0002] -0E42 0E2A ; [.2C8B.0020.0002][.2C9E.0020.0002] -0E43 0E2A ; [.2C8B.0020.0002][.2C9F.0020.0002] -0E44 0E2A ; [.2C8B.0020.0002][.2CA0.0020.0002] -0E2B ; [.2C8C.0020.0002] -0E40 0E2B ; [.2C8C.0020.0002][.2C9C.0020.0002] -0E41 0E2B ; [.2C8C.0020.0002][.2C9D.0020.0002] -0E42 0E2B ; [.2C8C.0020.0002][.2C9E.0020.0002] -0E43 0E2B ; [.2C8C.0020.0002][.2C9F.0020.0002] -0E44 0E2B ; [.2C8C.0020.0002][.2CA0.0020.0002] -0E2C ; [.2C8D.0020.0002] -0E40 0E2C ; [.2C8D.0020.0002][.2C9C.0020.0002] -0E41 0E2C ; [.2C8D.0020.0002][.2C9D.0020.0002] -0E42 0E2C ; [.2C8D.0020.0002][.2C9E.0020.0002] -0E43 0E2C ; [.2C8D.0020.0002][.2C9F.0020.0002] -0E44 0E2C ; [.2C8D.0020.0002][.2CA0.0020.0002] -0E2D ; [.2C8E.0020.0002] -0E40 0E2D ; [.2C8E.0020.0002][.2C9C.0020.0002] -0E41 0E2D ; [.2C8E.0020.0002][.2C9D.0020.0002] -0E42 0E2D ; [.2C8E.0020.0002][.2C9E.0020.0002] -0E43 0E2D ; [.2C8E.0020.0002][.2C9F.0020.0002] -0E44 0E2D ; [.2C8E.0020.0002][.2CA0.0020.0002] -0E2E ; [.2C8F.0020.0002] -0E40 0E2E ; [.2C8F.0020.0002][.2C9C.0020.0002] -0E41 0E2E ; [.2C8F.0020.0002][.2C9D.0020.0002] -0E42 0E2E ; [.2C8F.0020.0002][.2C9E.0020.0002] -0E43 0E2E ; [.2C8F.0020.0002][.2C9F.0020.0002] -0E44 0E2E ; [.2C8F.0020.0002][.2CA0.0020.0002] -0E2F ; [.2C90.0020.0002] -0E30 ; [.2C91.0020.0002] -0E31 ; [.2C92.0020.0002] -0E32 ; [.2C93.0020.0002] -0E33 ; [.2C94.0020.0002] -0E4D 0E32 ; [.2C94.0020.0002] -0E34 ; [.2C95.0020.0002] -0E35 ; [.2C96.0020.0002] -0E36 ; [.2C97.0020.0002] -0E37 ; [.2C98.0020.0002] -0E38 ; [.2C99.0020.0002] -0E39 ; [.2C9A.0020.0002] -0E3A ; [.2C9B.0020.0002] -0E40 ; [.2C9C.0020.0002] -0E41 ; [.2C9D.0020.0002] -0E42 ; [.2C9E.0020.0002] -0E43 ; [.2C9F.0020.0002] -0E44 ; [.2CA0.0020.0002] -0E45 ; [.2CA1.0020.0002] -0EDE ; [.2CA2.0020.0002] -0EC0 0EDE ; [.2CA2.0020.0002][.2CCD.0020.0002] -0EC1 0EDE ; [.2CA2.0020.0002][.2CCE.0020.0002] -0EC2 0EDE ; [.2CA2.0020.0002][.2CCF.0020.0002] -0EC3 0EDE ; [.2CA2.0020.0002][.2CD0.0020.0002] -0EC4 0EDE ; [.2CA2.0020.0002][.2CD1.0020.0002] -0E81 ; [.2CA3.0020.0002] -0EC0 0E81 ; [.2CA3.0020.0002][.2CCD.0020.0002] -0EC1 0E81 ; [.2CA3.0020.0002][.2CCE.0020.0002] -0EC2 0E81 ; [.2CA3.0020.0002][.2CCF.0020.0002] -0EC3 0E81 ; [.2CA3.0020.0002][.2CD0.0020.0002] -0EC4 0E81 ; [.2CA3.0020.0002][.2CD1.0020.0002] -0E82 ; [.2CA4.0020.0002] -0EC0 0E82 ; [.2CA4.0020.0002][.2CCD.0020.0002] -0EC1 0E82 ; [.2CA4.0020.0002][.2CCE.0020.0002] -0EC2 0E82 ; [.2CA4.0020.0002][.2CCF.0020.0002] -0EC3 0E82 ; [.2CA4.0020.0002][.2CD0.0020.0002] -0EC4 0E82 ; [.2CA4.0020.0002][.2CD1.0020.0002] -0E84 ; [.2CA5.0020.0002] -0EC0 0E84 ; [.2CA5.0020.0002][.2CCD.0020.0002] -0EC1 0E84 ; [.2CA5.0020.0002][.2CCE.0020.0002] -0EC2 0E84 ; [.2CA5.0020.0002][.2CCF.0020.0002] -0EC3 0E84 ; [.2CA5.0020.0002][.2CD0.0020.0002] -0EC4 0E84 ; [.2CA5.0020.0002][.2CD1.0020.0002] -0E87 ; [.2CA6.0020.0002] -0EC0 0E87 ; [.2CA6.0020.0002][.2CCD.0020.0002] -0EC1 0E87 ; [.2CA6.0020.0002][.2CCE.0020.0002] -0EC2 0E87 ; [.2CA6.0020.0002][.2CCF.0020.0002] -0EC3 0E87 ; [.2CA6.0020.0002][.2CD0.0020.0002] -0EC4 0E87 ; [.2CA6.0020.0002][.2CD1.0020.0002] -0E88 ; [.2CA7.0020.0002] -0EC0 0E88 ; [.2CA7.0020.0002][.2CCD.0020.0002] -0EC1 0E88 ; [.2CA7.0020.0002][.2CCE.0020.0002] -0EC2 0E88 ; [.2CA7.0020.0002][.2CCF.0020.0002] -0EC3 0E88 ; [.2CA7.0020.0002][.2CD0.0020.0002] -0EC4 0E88 ; [.2CA7.0020.0002][.2CD1.0020.0002] -0EAA ; [.2CA8.0020.0002] -0EC0 0EAA ; [.2CA8.0020.0002][.2CCD.0020.0002] -0EC1 0EAA ; [.2CA8.0020.0002][.2CCE.0020.0002] -0EC2 0EAA ; [.2CA8.0020.0002][.2CCF.0020.0002] -0EC3 0EAA ; [.2CA8.0020.0002][.2CD0.0020.0002] -0EC4 0EAA ; [.2CA8.0020.0002][.2CD1.0020.0002] -0E8A ; [.2CA9.0020.0002] -0EC0 0E8A ; [.2CA9.0020.0002][.2CCD.0020.0002] -0EC1 0E8A ; [.2CA9.0020.0002][.2CCE.0020.0002] -0EC2 0E8A ; [.2CA9.0020.0002][.2CCF.0020.0002] -0EC3 0E8A ; [.2CA9.0020.0002][.2CD0.0020.0002] -0EC4 0E8A ; [.2CA9.0020.0002][.2CD1.0020.0002] -0EDF ; [.2CAA.0020.0002] -0EC0 0EDF ; [.2CAA.0020.0002][.2CCD.0020.0002] -0EC1 0EDF ; [.2CAA.0020.0002][.2CCE.0020.0002] -0EC2 0EDF ; [.2CAA.0020.0002][.2CCF.0020.0002] -0EC3 0EDF ; [.2CAA.0020.0002][.2CD0.0020.0002] -0EC4 0EDF ; [.2CAA.0020.0002][.2CD1.0020.0002] -0E8D ; [.2CAB.0020.0002] -0EC0 0E8D ; [.2CAB.0020.0002][.2CCD.0020.0002] -0EC1 0E8D ; [.2CAB.0020.0002][.2CCE.0020.0002] -0EC2 0E8D ; [.2CAB.0020.0002][.2CCF.0020.0002] -0EC3 0E8D ; [.2CAB.0020.0002][.2CD0.0020.0002] -0EC4 0E8D ; [.2CAB.0020.0002][.2CD1.0020.0002] -0E94 ; [.2CAC.0020.0002] -0EC0 0E94 ; [.2CAC.0020.0002][.2CCD.0020.0002] -0EC1 0E94 ; [.2CAC.0020.0002][.2CCE.0020.0002] -0EC2 0E94 ; [.2CAC.0020.0002][.2CCF.0020.0002] -0EC3 0E94 ; [.2CAC.0020.0002][.2CD0.0020.0002] -0EC4 0E94 ; [.2CAC.0020.0002][.2CD1.0020.0002] -0E95 ; [.2CAD.0020.0002] -0EC0 0E95 ; [.2CAD.0020.0002][.2CCD.0020.0002] -0EC1 0E95 ; [.2CAD.0020.0002][.2CCE.0020.0002] -0EC2 0E95 ; [.2CAD.0020.0002][.2CCF.0020.0002] -0EC3 0E95 ; [.2CAD.0020.0002][.2CD0.0020.0002] -0EC4 0E95 ; [.2CAD.0020.0002][.2CD1.0020.0002] -0E96 ; [.2CAE.0020.0002] -0EC0 0E96 ; [.2CAE.0020.0002][.2CCD.0020.0002] -0EC1 0E96 ; [.2CAE.0020.0002][.2CCE.0020.0002] -0EC2 0E96 ; [.2CAE.0020.0002][.2CCF.0020.0002] -0EC3 0E96 ; [.2CAE.0020.0002][.2CD0.0020.0002] -0EC4 0E96 ; [.2CAE.0020.0002][.2CD1.0020.0002] -0E97 ; [.2CAF.0020.0002] -0EC0 0E97 ; [.2CAF.0020.0002][.2CCD.0020.0002] -0EC1 0E97 ; [.2CAF.0020.0002][.2CCE.0020.0002] -0EC2 0E97 ; [.2CAF.0020.0002][.2CCF.0020.0002] -0EC3 0E97 ; [.2CAF.0020.0002][.2CD0.0020.0002] -0EC4 0E97 ; [.2CAF.0020.0002][.2CD1.0020.0002] -0E99 ; [.2CB0.0020.0002] -0EC0 0E99 ; [.2CB0.0020.0002][.2CCD.0020.0002] -0EC1 0E99 ; [.2CB0.0020.0002][.2CCE.0020.0002] -0EC2 0E99 ; [.2CB0.0020.0002][.2CCF.0020.0002] -0EC3 0E99 ; [.2CB0.0020.0002][.2CD0.0020.0002] -0EC4 0E99 ; [.2CB0.0020.0002][.2CD1.0020.0002] -0E9A ; [.2CB1.0020.0002] -0EC0 0E9A ; [.2CB1.0020.0002][.2CCD.0020.0002] -0EC1 0E9A ; [.2CB1.0020.0002][.2CCE.0020.0002] -0EC2 0E9A ; [.2CB1.0020.0002][.2CCF.0020.0002] -0EC3 0E9A ; [.2CB1.0020.0002][.2CD0.0020.0002] -0EC4 0E9A ; [.2CB1.0020.0002][.2CD1.0020.0002] -0E9B ; [.2CB2.0020.0002] -0EC0 0E9B ; [.2CB2.0020.0002][.2CCD.0020.0002] -0EC1 0E9B ; [.2CB2.0020.0002][.2CCE.0020.0002] -0EC2 0E9B ; [.2CB2.0020.0002][.2CCF.0020.0002] -0EC3 0E9B ; [.2CB2.0020.0002][.2CD0.0020.0002] -0EC4 0E9B ; [.2CB2.0020.0002][.2CD1.0020.0002] -0E9C ; [.2CB3.0020.0002] -0EC0 0E9C ; [.2CB3.0020.0002][.2CCD.0020.0002] -0EC1 0E9C ; [.2CB3.0020.0002][.2CCE.0020.0002] -0EC2 0E9C ; [.2CB3.0020.0002][.2CCF.0020.0002] -0EC3 0E9C ; [.2CB3.0020.0002][.2CD0.0020.0002] -0EC4 0E9C ; [.2CB3.0020.0002][.2CD1.0020.0002] -0E9D ; [.2CB4.0020.0002] -0EC0 0E9D ; [.2CB4.0020.0002][.2CCD.0020.0002] -0EC1 0E9D ; [.2CB4.0020.0002][.2CCE.0020.0002] -0EC2 0E9D ; [.2CB4.0020.0002][.2CCF.0020.0002] -0EC3 0E9D ; [.2CB4.0020.0002][.2CD0.0020.0002] -0EC4 0E9D ; [.2CB4.0020.0002][.2CD1.0020.0002] -0E9E ; [.2CB5.0020.0002] -0EC0 0E9E ; [.2CB5.0020.0002][.2CCD.0020.0002] -0EC1 0E9E ; [.2CB5.0020.0002][.2CCE.0020.0002] -0EC2 0E9E ; [.2CB5.0020.0002][.2CCF.0020.0002] -0EC3 0E9E ; [.2CB5.0020.0002][.2CD0.0020.0002] -0EC4 0E9E ; [.2CB5.0020.0002][.2CD1.0020.0002] -0E9F ; [.2CB6.0020.0002] -0EC0 0E9F ; [.2CB6.0020.0002][.2CCD.0020.0002] -0EC1 0E9F ; [.2CB6.0020.0002][.2CCE.0020.0002] -0EC2 0E9F ; [.2CB6.0020.0002][.2CCF.0020.0002] -0EC3 0E9F ; [.2CB6.0020.0002][.2CD0.0020.0002] -0EC4 0E9F ; [.2CB6.0020.0002][.2CD1.0020.0002] -0EA1 ; [.2CB7.0020.0002] -0EC0 0EA1 ; [.2CB7.0020.0002][.2CCD.0020.0002] -0EC1 0EA1 ; [.2CB7.0020.0002][.2CCE.0020.0002] -0EC2 0EA1 ; [.2CB7.0020.0002][.2CCF.0020.0002] -0EC3 0EA1 ; [.2CB7.0020.0002][.2CD0.0020.0002] -0EC4 0EA1 ; [.2CB7.0020.0002][.2CD1.0020.0002] -0EA2 ; [.2CB8.0020.0002] -0EC0 0EA2 ; [.2CB8.0020.0002][.2CCD.0020.0002] -0EC1 0EA2 ; [.2CB8.0020.0002][.2CCE.0020.0002] -0EC2 0EA2 ; [.2CB8.0020.0002][.2CCF.0020.0002] -0EC3 0EA2 ; [.2CB8.0020.0002][.2CD0.0020.0002] -0EC4 0EA2 ; [.2CB8.0020.0002][.2CD1.0020.0002] -0EA3 ; [.2CB9.0020.0002] -0EC0 0EA3 ; [.2CB9.0020.0002][.2CCD.0020.0002] -0EC1 0EA3 ; [.2CB9.0020.0002][.2CCE.0020.0002] -0EC2 0EA3 ; [.2CB9.0020.0002][.2CCF.0020.0002] -0EC3 0EA3 ; [.2CB9.0020.0002][.2CD0.0020.0002] -0EC4 0EA3 ; [.2CB9.0020.0002][.2CD1.0020.0002] -0EA5 ; [.2CBA.0020.0002] -0EC0 0EA5 ; [.2CBA.0020.0002][.2CCD.0020.0002] -0EC1 0EA5 ; [.2CBA.0020.0002][.2CCE.0020.0002] -0EC2 0EA5 ; [.2CBA.0020.0002][.2CCF.0020.0002] -0EC3 0EA5 ; [.2CBA.0020.0002][.2CD0.0020.0002] -0EC4 0EA5 ; [.2CBA.0020.0002][.2CD1.0020.0002] -0EA7 ; [.2CBB.0020.0002] -0EC0 0EA7 ; [.2CBB.0020.0002][.2CCD.0020.0002] -0EC1 0EA7 ; [.2CBB.0020.0002][.2CCE.0020.0002] -0EC2 0EA7 ; [.2CBB.0020.0002][.2CCF.0020.0002] -0EC3 0EA7 ; [.2CBB.0020.0002][.2CD0.0020.0002] -0EC4 0EA7 ; [.2CBB.0020.0002][.2CD1.0020.0002] -0EAB ; [.2CBC.0020.0002] -0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004] -0EC0 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCD.0020.0002] -0EC1 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCE.0020.0002] -0EC2 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCF.0020.0002] -0EC3 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CD0.0020.0002] -0EC4 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CD1.0020.0002] -0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004] -0EC0 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCD.0020.0002] -0EC1 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCE.0020.0002] -0EC2 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCF.0020.0002] -0EC3 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CD0.0020.0002] -0EC4 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CD1.0020.0002] -0EC0 0EAB ; [.2CBC.0020.0002][.2CCD.0020.0002] -0EC1 0EAB ; [.2CBC.0020.0002][.2CCE.0020.0002] -0EC2 0EAB ; [.2CBC.0020.0002][.2CCF.0020.0002] -0EC3 0EAB ; [.2CBC.0020.0002][.2CD0.0020.0002] -0EC4 0EAB ; [.2CBC.0020.0002][.2CD1.0020.0002] -0EAD ; [.2CBD.0020.0002] -0EC0 0EAD ; [.2CBD.0020.0002][.2CCD.0020.0002] -0EC1 0EAD ; [.2CBD.0020.0002][.2CCE.0020.0002] -0EC2 0EAD ; [.2CBD.0020.0002][.2CCF.0020.0002] -0EC3 0EAD ; [.2CBD.0020.0002][.2CD0.0020.0002] -0EC4 0EAD ; [.2CBD.0020.0002][.2CD1.0020.0002] -0EAE ; [.2CBE.0020.0002] -0EC0 0EAE ; [.2CBE.0020.0002][.2CCD.0020.0002] -0EC1 0EAE ; [.2CBE.0020.0002][.2CCE.0020.0002] -0EC2 0EAE ; [.2CBE.0020.0002][.2CCF.0020.0002] -0EC3 0EAE ; [.2CBE.0020.0002][.2CD0.0020.0002] -0EC4 0EAE ; [.2CBE.0020.0002][.2CD1.0020.0002] -0EAF ; [.2CBF.0020.0002] -0EB0 ; [.2CC0.0020.0002] -0EB1 ; [.2CC1.0020.0002] -0EB2 ; [.2CC2.0020.0002] -0EB3 ; [.2CC3.0020.0002] -0ECD 0EB2 ; [.2CC3.0020.0002] -0EB4 ; [.2CC4.0020.0002] -0EB5 ; [.2CC5.0020.0002] -0EB6 ; [.2CC6.0020.0002] -0EB7 ; [.2CC7.0020.0002] -0EB8 ; [.2CC8.0020.0002] -0EB9 ; [.2CC9.0020.0002] -0EBB ; [.2CCA.0020.0002] -0EBC ; [.2CCB.0020.0002] -0EBD ; [.2CCC.0020.0002] -0EC0 ; [.2CCD.0020.0002] -0EC1 ; [.2CCE.0020.0002] -0EC2 ; [.2CCF.0020.0002] -0EC3 ; [.2CD0.0020.0002] -0EC4 ; [.2CD1.0020.0002] -AA80 ; [.2CD2.0020.0002] -AAB5 AA80 ; [.2CD2.0020.0002][.2D07.0020.0002] -AAB6 AA80 ; [.2CD2.0020.0002][.2D08.0020.0002] -AAB9 AA80 ; [.2CD2.0020.0002][.2D0B.0020.0002] -AABB AA80 ; [.2CD2.0020.0002][.2D0D.0020.0002] -AABC AA80 ; [.2CD2.0020.0002][.2D0E.0020.0002] -AA81 ; [.2CD3.0020.0002] -AAB5 AA81 ; [.2CD3.0020.0002][.2D07.0020.0002] -AAB6 AA81 ; [.2CD3.0020.0002][.2D08.0020.0002] -AAB9 AA81 ; [.2CD3.0020.0002][.2D0B.0020.0002] -AABB AA81 ; [.2CD3.0020.0002][.2D0D.0020.0002] -AABC AA81 ; [.2CD3.0020.0002][.2D0E.0020.0002] -AA82 ; [.2CD4.0020.0002] -AAB5 AA82 ; [.2CD4.0020.0002][.2D07.0020.0002] -AAB6 AA82 ; [.2CD4.0020.0002][.2D08.0020.0002] -AAB9 AA82 ; [.2CD4.0020.0002][.2D0B.0020.0002] -AABB AA82 ; [.2CD4.0020.0002][.2D0D.0020.0002] -AABC AA82 ; [.2CD4.0020.0002][.2D0E.0020.0002] -AA83 ; [.2CD5.0020.0002] -AAB5 AA83 ; [.2CD5.0020.0002][.2D07.0020.0002] -AAB6 AA83 ; [.2CD5.0020.0002][.2D08.0020.0002] -AAB9 AA83 ; [.2CD5.0020.0002][.2D0B.0020.0002] -AABB AA83 ; [.2CD5.0020.0002][.2D0D.0020.0002] -AABC AA83 ; [.2CD5.0020.0002][.2D0E.0020.0002] -AA84 ; [.2CD6.0020.0002] -AAB5 AA84 ; [.2CD6.0020.0002][.2D07.0020.0002] -AAB6 AA84 ; [.2CD6.0020.0002][.2D08.0020.0002] -AAB9 AA84 ; [.2CD6.0020.0002][.2D0B.0020.0002] -AABB AA84 ; [.2CD6.0020.0002][.2D0D.0020.0002] -AABC AA84 ; [.2CD6.0020.0002][.2D0E.0020.0002] -AA85 ; [.2CD7.0020.0002] -AAB5 AA85 ; [.2CD7.0020.0002][.2D07.0020.0002] -AAB6 AA85 ; [.2CD7.0020.0002][.2D08.0020.0002] -AAB9 AA85 ; [.2CD7.0020.0002][.2D0B.0020.0002] -AABB AA85 ; [.2CD7.0020.0002][.2D0D.0020.0002] -AABC AA85 ; [.2CD7.0020.0002][.2D0E.0020.0002] -AA86 ; [.2CD8.0020.0002] -AAB5 AA86 ; [.2CD8.0020.0002][.2D07.0020.0002] -AAB6 AA86 ; [.2CD8.0020.0002][.2D08.0020.0002] -AAB9 AA86 ; [.2CD8.0020.0002][.2D0B.0020.0002] -AABB AA86 ; [.2CD8.0020.0002][.2D0D.0020.0002] -AABC AA86 ; [.2CD8.0020.0002][.2D0E.0020.0002] -AA87 ; [.2CD9.0020.0002] -AAB5 AA87 ; [.2CD9.0020.0002][.2D07.0020.0002] -AAB6 AA87 ; [.2CD9.0020.0002][.2D08.0020.0002] -AAB9 AA87 ; [.2CD9.0020.0002][.2D0B.0020.0002] -AABB AA87 ; [.2CD9.0020.0002][.2D0D.0020.0002] -AABC AA87 ; [.2CD9.0020.0002][.2D0E.0020.0002] -AA88 ; [.2CDA.0020.0002] -AAB5 AA88 ; [.2CDA.0020.0002][.2D07.0020.0002] -AAB6 AA88 ; [.2CDA.0020.0002][.2D08.0020.0002] -AAB9 AA88 ; [.2CDA.0020.0002][.2D0B.0020.0002] -AABB AA88 ; [.2CDA.0020.0002][.2D0D.0020.0002] -AABC AA88 ; [.2CDA.0020.0002][.2D0E.0020.0002] -AA89 ; [.2CDB.0020.0002] -AAB5 AA89 ; [.2CDB.0020.0002][.2D07.0020.0002] -AAB6 AA89 ; [.2CDB.0020.0002][.2D08.0020.0002] -AAB9 AA89 ; [.2CDB.0020.0002][.2D0B.0020.0002] -AABB AA89 ; [.2CDB.0020.0002][.2D0D.0020.0002] -AABC AA89 ; [.2CDB.0020.0002][.2D0E.0020.0002] -AA8A ; [.2CDC.0020.0002] -AAB5 AA8A ; [.2CDC.0020.0002][.2D07.0020.0002] -AAB6 AA8A ; [.2CDC.0020.0002][.2D08.0020.0002] -AAB9 AA8A ; [.2CDC.0020.0002][.2D0B.0020.0002] -AABB AA8A ; [.2CDC.0020.0002][.2D0D.0020.0002] -AABC AA8A ; [.2CDC.0020.0002][.2D0E.0020.0002] -AA8B ; [.2CDD.0020.0002] -AAB5 AA8B ; [.2CDD.0020.0002][.2D07.0020.0002] -AAB6 AA8B ; [.2CDD.0020.0002][.2D08.0020.0002] -AAB9 AA8B ; [.2CDD.0020.0002][.2D0B.0020.0002] -AABB AA8B ; [.2CDD.0020.0002][.2D0D.0020.0002] -AABC AA8B ; [.2CDD.0020.0002][.2D0E.0020.0002] -AA8C ; [.2CDE.0020.0002] -AAB5 AA8C ; [.2CDE.0020.0002][.2D07.0020.0002] -AAB6 AA8C ; [.2CDE.0020.0002][.2D08.0020.0002] -AAB9 AA8C ; [.2CDE.0020.0002][.2D0B.0020.0002] -AABB AA8C ; [.2CDE.0020.0002][.2D0D.0020.0002] -AABC AA8C ; [.2CDE.0020.0002][.2D0E.0020.0002] -AA8D ; [.2CDF.0020.0002] -AAB5 AA8D ; [.2CDF.0020.0002][.2D07.0020.0002] -AAB6 AA8D ; [.2CDF.0020.0002][.2D08.0020.0002] -AAB9 AA8D ; [.2CDF.0020.0002][.2D0B.0020.0002] -AABB AA8D ; [.2CDF.0020.0002][.2D0D.0020.0002] -AABC AA8D ; [.2CDF.0020.0002][.2D0E.0020.0002] -AA8E ; [.2CE0.0020.0002] -AAB5 AA8E ; [.2CE0.0020.0002][.2D07.0020.0002] -AAB6 AA8E ; [.2CE0.0020.0002][.2D08.0020.0002] -AAB9 AA8E ; [.2CE0.0020.0002][.2D0B.0020.0002] -AABB AA8E ; [.2CE0.0020.0002][.2D0D.0020.0002] -AABC AA8E ; [.2CE0.0020.0002][.2D0E.0020.0002] -AA8F ; [.2CE1.0020.0002] -AAB5 AA8F ; [.2CE1.0020.0002][.2D07.0020.0002] -AAB6 AA8F ; [.2CE1.0020.0002][.2D08.0020.0002] -AAB9 AA8F ; [.2CE1.0020.0002][.2D0B.0020.0002] -AABB AA8F ; [.2CE1.0020.0002][.2D0D.0020.0002] -AABC AA8F ; [.2CE1.0020.0002][.2D0E.0020.0002] -AA90 ; [.2CE2.0020.0002] -AAB5 AA90 ; [.2CE2.0020.0002][.2D07.0020.0002] -AAB6 AA90 ; [.2CE2.0020.0002][.2D08.0020.0002] -AAB9 AA90 ; [.2CE2.0020.0002][.2D0B.0020.0002] -AABB AA90 ; [.2CE2.0020.0002][.2D0D.0020.0002] -AABC AA90 ; [.2CE2.0020.0002][.2D0E.0020.0002] -AA91 ; [.2CE3.0020.0002] -AAB5 AA91 ; [.2CE3.0020.0002][.2D07.0020.0002] -AAB6 AA91 ; [.2CE3.0020.0002][.2D08.0020.0002] -AAB9 AA91 ; [.2CE3.0020.0002][.2D0B.0020.0002] -AABB AA91 ; [.2CE3.0020.0002][.2D0D.0020.0002] -AABC AA91 ; [.2CE3.0020.0002][.2D0E.0020.0002] -AA92 ; [.2CE4.0020.0002] -AAB5 AA92 ; [.2CE4.0020.0002][.2D07.0020.0002] -AAB6 AA92 ; [.2CE4.0020.0002][.2D08.0020.0002] -AAB9 AA92 ; [.2CE4.0020.0002][.2D0B.0020.0002] -AABB AA92 ; [.2CE4.0020.0002][.2D0D.0020.0002] -AABC AA92 ; [.2CE4.0020.0002][.2D0E.0020.0002] -AA93 ; [.2CE5.0020.0002] -AAB5 AA93 ; [.2CE5.0020.0002][.2D07.0020.0002] -AAB6 AA93 ; [.2CE5.0020.0002][.2D08.0020.0002] -AAB9 AA93 ; [.2CE5.0020.0002][.2D0B.0020.0002] -AABB AA93 ; [.2CE5.0020.0002][.2D0D.0020.0002] -AABC AA93 ; [.2CE5.0020.0002][.2D0E.0020.0002] -AA94 ; [.2CE6.0020.0002] -AAB5 AA94 ; [.2CE6.0020.0002][.2D07.0020.0002] -AAB6 AA94 ; [.2CE6.0020.0002][.2D08.0020.0002] -AAB9 AA94 ; [.2CE6.0020.0002][.2D0B.0020.0002] -AABB AA94 ; [.2CE6.0020.0002][.2D0D.0020.0002] -AABC AA94 ; [.2CE6.0020.0002][.2D0E.0020.0002] -AA95 ; [.2CE7.0020.0002] -AAB5 AA95 ; [.2CE7.0020.0002][.2D07.0020.0002] -AAB6 AA95 ; [.2CE7.0020.0002][.2D08.0020.0002] -AAB9 AA95 ; [.2CE7.0020.0002][.2D0B.0020.0002] -AABB AA95 ; [.2CE7.0020.0002][.2D0D.0020.0002] -AABC AA95 ; [.2CE7.0020.0002][.2D0E.0020.0002] -AA96 ; [.2CE8.0020.0002] -AAB5 AA96 ; [.2CE8.0020.0002][.2D07.0020.0002] -AAB6 AA96 ; [.2CE8.0020.0002][.2D08.0020.0002] -AAB9 AA96 ; [.2CE8.0020.0002][.2D0B.0020.0002] -AABB AA96 ; [.2CE8.0020.0002][.2D0D.0020.0002] -AABC AA96 ; [.2CE8.0020.0002][.2D0E.0020.0002] -AA97 ; [.2CE9.0020.0002] -AAB5 AA97 ; [.2CE9.0020.0002][.2D07.0020.0002] -AAB6 AA97 ; [.2CE9.0020.0002][.2D08.0020.0002] -AAB9 AA97 ; [.2CE9.0020.0002][.2D0B.0020.0002] -AABB AA97 ; [.2CE9.0020.0002][.2D0D.0020.0002] -AABC AA97 ; [.2CE9.0020.0002][.2D0E.0020.0002] -AA98 ; [.2CEA.0020.0002] -AAB5 AA98 ; [.2CEA.0020.0002][.2D07.0020.0002] -AAB6 AA98 ; [.2CEA.0020.0002][.2D08.0020.0002] -AAB9 AA98 ; [.2CEA.0020.0002][.2D0B.0020.0002] -AABB AA98 ; [.2CEA.0020.0002][.2D0D.0020.0002] -AABC AA98 ; [.2CEA.0020.0002][.2D0E.0020.0002] -AA99 ; [.2CEB.0020.0002] -AAB5 AA99 ; [.2CEB.0020.0002][.2D07.0020.0002] -AAB6 AA99 ; [.2CEB.0020.0002][.2D08.0020.0002] -AAB9 AA99 ; [.2CEB.0020.0002][.2D0B.0020.0002] -AABB AA99 ; [.2CEB.0020.0002][.2D0D.0020.0002] -AABC AA99 ; [.2CEB.0020.0002][.2D0E.0020.0002] -AA9A ; [.2CEC.0020.0002] -AAB5 AA9A ; [.2CEC.0020.0002][.2D07.0020.0002] -AAB6 AA9A ; [.2CEC.0020.0002][.2D08.0020.0002] -AAB9 AA9A ; [.2CEC.0020.0002][.2D0B.0020.0002] -AABB AA9A ; [.2CEC.0020.0002][.2D0D.0020.0002] -AABC AA9A ; [.2CEC.0020.0002][.2D0E.0020.0002] -AA9B ; [.2CED.0020.0002] -AAB5 AA9B ; [.2CED.0020.0002][.2D07.0020.0002] -AAB6 AA9B ; [.2CED.0020.0002][.2D08.0020.0002] -AAB9 AA9B ; [.2CED.0020.0002][.2D0B.0020.0002] -AABB AA9B ; [.2CED.0020.0002][.2D0D.0020.0002] -AABC AA9B ; [.2CED.0020.0002][.2D0E.0020.0002] -AA9C ; [.2CEE.0020.0002] -AAB5 AA9C ; [.2CEE.0020.0002][.2D07.0020.0002] -AAB6 AA9C ; [.2CEE.0020.0002][.2D08.0020.0002] -AAB9 AA9C ; [.2CEE.0020.0002][.2D0B.0020.0002] -AABB AA9C ; [.2CEE.0020.0002][.2D0D.0020.0002] -AABC AA9C ; [.2CEE.0020.0002][.2D0E.0020.0002] -AA9D ; [.2CEF.0020.0002] -AAB5 AA9D ; [.2CEF.0020.0002][.2D07.0020.0002] -AAB6 AA9D ; [.2CEF.0020.0002][.2D08.0020.0002] -AAB9 AA9D ; [.2CEF.0020.0002][.2D0B.0020.0002] -AABB AA9D ; [.2CEF.0020.0002][.2D0D.0020.0002] -AABC AA9D ; [.2CEF.0020.0002][.2D0E.0020.0002] -AA9E ; [.2CF0.0020.0002] -AAB5 AA9E ; [.2CF0.0020.0002][.2D07.0020.0002] -AAB6 AA9E ; [.2CF0.0020.0002][.2D08.0020.0002] -AAB9 AA9E ; [.2CF0.0020.0002][.2D0B.0020.0002] -AABB AA9E ; [.2CF0.0020.0002][.2D0D.0020.0002] -AABC AA9E ; [.2CF0.0020.0002][.2D0E.0020.0002] -AA9F ; [.2CF1.0020.0002] -AAB5 AA9F ; [.2CF1.0020.0002][.2D07.0020.0002] -AAB6 AA9F ; [.2CF1.0020.0002][.2D08.0020.0002] -AAB9 AA9F ; [.2CF1.0020.0002][.2D0B.0020.0002] -AABB AA9F ; [.2CF1.0020.0002][.2D0D.0020.0002] -AABC AA9F ; [.2CF1.0020.0002][.2D0E.0020.0002] -AAA0 ; [.2CF2.0020.0002] -AAB5 AAA0 ; [.2CF2.0020.0002][.2D07.0020.0002] -AAB6 AAA0 ; [.2CF2.0020.0002][.2D08.0020.0002] -AAB9 AAA0 ; [.2CF2.0020.0002][.2D0B.0020.0002] -AABB AAA0 ; [.2CF2.0020.0002][.2D0D.0020.0002] -AABC AAA0 ; [.2CF2.0020.0002][.2D0E.0020.0002] -AAA1 ; [.2CF3.0020.0002] -AAB5 AAA1 ; [.2CF3.0020.0002][.2D07.0020.0002] -AAB6 AAA1 ; [.2CF3.0020.0002][.2D08.0020.0002] -AAB9 AAA1 ; [.2CF3.0020.0002][.2D0B.0020.0002] -AABB AAA1 ; [.2CF3.0020.0002][.2D0D.0020.0002] -AABC AAA1 ; [.2CF3.0020.0002][.2D0E.0020.0002] -AAA2 ; [.2CF4.0020.0002] -AAB5 AAA2 ; [.2CF4.0020.0002][.2D07.0020.0002] -AAB6 AAA2 ; [.2CF4.0020.0002][.2D08.0020.0002] -AAB9 AAA2 ; [.2CF4.0020.0002][.2D0B.0020.0002] -AABB AAA2 ; [.2CF4.0020.0002][.2D0D.0020.0002] -AABC AAA2 ; [.2CF4.0020.0002][.2D0E.0020.0002] -AAA3 ; [.2CF5.0020.0002] -AAB5 AAA3 ; [.2CF5.0020.0002][.2D07.0020.0002] -AAB6 AAA3 ; [.2CF5.0020.0002][.2D08.0020.0002] -AAB9 AAA3 ; [.2CF5.0020.0002][.2D0B.0020.0002] -AABB AAA3 ; [.2CF5.0020.0002][.2D0D.0020.0002] -AABC AAA3 ; [.2CF5.0020.0002][.2D0E.0020.0002] -AAA4 ; [.2CF6.0020.0002] -AAB5 AAA4 ; [.2CF6.0020.0002][.2D07.0020.0002] -AAB6 AAA4 ; [.2CF6.0020.0002][.2D08.0020.0002] -AAB9 AAA4 ; [.2CF6.0020.0002][.2D0B.0020.0002] -AABB AAA4 ; [.2CF6.0020.0002][.2D0D.0020.0002] -AABC AAA4 ; [.2CF6.0020.0002][.2D0E.0020.0002] -AAA5 ; [.2CF7.0020.0002] -AAB5 AAA5 ; [.2CF7.0020.0002][.2D07.0020.0002] -AAB6 AAA5 ; [.2CF7.0020.0002][.2D08.0020.0002] -AAB9 AAA5 ; [.2CF7.0020.0002][.2D0B.0020.0002] -AABB AAA5 ; [.2CF7.0020.0002][.2D0D.0020.0002] -AABC AAA5 ; [.2CF7.0020.0002][.2D0E.0020.0002] -AAA6 ; [.2CF8.0020.0002] -AAB5 AAA6 ; [.2CF8.0020.0002][.2D07.0020.0002] -AAB6 AAA6 ; [.2CF8.0020.0002][.2D08.0020.0002] -AAB9 AAA6 ; [.2CF8.0020.0002][.2D0B.0020.0002] -AABB AAA6 ; [.2CF8.0020.0002][.2D0D.0020.0002] -AABC AAA6 ; [.2CF8.0020.0002][.2D0E.0020.0002] -AAA7 ; [.2CF9.0020.0002] -AAB5 AAA7 ; [.2CF9.0020.0002][.2D07.0020.0002] -AAB6 AAA7 ; [.2CF9.0020.0002][.2D08.0020.0002] -AAB9 AAA7 ; [.2CF9.0020.0002][.2D0B.0020.0002] -AABB AAA7 ; [.2CF9.0020.0002][.2D0D.0020.0002] -AABC AAA7 ; [.2CF9.0020.0002][.2D0E.0020.0002] -AAA8 ; [.2CFA.0020.0002] -AAB5 AAA8 ; [.2CFA.0020.0002][.2D07.0020.0002] -AAB6 AAA8 ; [.2CFA.0020.0002][.2D08.0020.0002] -AAB9 AAA8 ; [.2CFA.0020.0002][.2D0B.0020.0002] -AABB AAA8 ; [.2CFA.0020.0002][.2D0D.0020.0002] -AABC AAA8 ; [.2CFA.0020.0002][.2D0E.0020.0002] -AAA9 ; [.2CFB.0020.0002] -AAB5 AAA9 ; [.2CFB.0020.0002][.2D07.0020.0002] -AAB6 AAA9 ; [.2CFB.0020.0002][.2D08.0020.0002] -AAB9 AAA9 ; [.2CFB.0020.0002][.2D0B.0020.0002] -AABB AAA9 ; [.2CFB.0020.0002][.2D0D.0020.0002] -AABC AAA9 ; [.2CFB.0020.0002][.2D0E.0020.0002] -AAAA ; [.2CFC.0020.0002] -AAB5 AAAA ; [.2CFC.0020.0002][.2D07.0020.0002] -AAB6 AAAA ; [.2CFC.0020.0002][.2D08.0020.0002] -AAB9 AAAA ; [.2CFC.0020.0002][.2D0B.0020.0002] -AABB AAAA ; [.2CFC.0020.0002][.2D0D.0020.0002] -AABC AAAA ; [.2CFC.0020.0002][.2D0E.0020.0002] -AAAB ; [.2CFD.0020.0002] -AAB5 AAAB ; [.2CFD.0020.0002][.2D07.0020.0002] -AAB6 AAAB ; [.2CFD.0020.0002][.2D08.0020.0002] -AAB9 AAAB ; [.2CFD.0020.0002][.2D0B.0020.0002] -AABB AAAB ; [.2CFD.0020.0002][.2D0D.0020.0002] -AABC AAAB ; [.2CFD.0020.0002][.2D0E.0020.0002] -AAAC ; [.2CFE.0020.0002] -AAB5 AAAC ; [.2CFE.0020.0002][.2D07.0020.0002] -AAB6 AAAC ; [.2CFE.0020.0002][.2D08.0020.0002] -AAB9 AAAC ; [.2CFE.0020.0002][.2D0B.0020.0002] -AABB AAAC ; [.2CFE.0020.0002][.2D0D.0020.0002] -AABC AAAC ; [.2CFE.0020.0002][.2D0E.0020.0002] -AAAD ; [.2CFF.0020.0002] -AAB5 AAAD ; [.2CFF.0020.0002][.2D07.0020.0002] -AAB6 AAAD ; [.2CFF.0020.0002][.2D08.0020.0002] -AAB9 AAAD ; [.2CFF.0020.0002][.2D0B.0020.0002] -AABB AAAD ; [.2CFF.0020.0002][.2D0D.0020.0002] -AABC AAAD ; [.2CFF.0020.0002][.2D0E.0020.0002] -AAAE ; [.2D00.0020.0002] -AAB5 AAAE ; [.2D00.0020.0002][.2D07.0020.0002] -AAB6 AAAE ; [.2D00.0020.0002][.2D08.0020.0002] -AAB9 AAAE ; [.2D00.0020.0002][.2D0B.0020.0002] -AABB AAAE ; [.2D00.0020.0002][.2D0D.0020.0002] -AABC AAAE ; [.2D00.0020.0002][.2D0E.0020.0002] -AAAF ; [.2D01.0020.0002] -AAB5 AAAF ; [.2D01.0020.0002][.2D07.0020.0002] -AAB6 AAAF ; [.2D01.0020.0002][.2D08.0020.0002] -AAB9 AAAF ; [.2D01.0020.0002][.2D0B.0020.0002] -AABB AAAF ; [.2D01.0020.0002][.2D0D.0020.0002] -AABC AAAF ; [.2D01.0020.0002][.2D0E.0020.0002] -AAB0 ; [.2D02.0020.0002] -AAB1 ; [.2D03.0020.0002] -AAB2 ; [.2D04.0020.0002] -AAB3 ; [.2D05.0020.0002] -AAB4 ; [.2D06.0020.0002] -AAB5 ; [.2D07.0020.0002] -AAB6 ; [.2D08.0020.0002] -AAB7 ; [.2D09.0020.0002] -AAB8 ; [.2D0A.0020.0002] -AAB9 ; [.2D0B.0020.0002] -AABA ; [.2D0C.0020.0002] -AABB ; [.2D0D.0020.0002] -AABC ; [.2D0E.0020.0002] -AABD ; [.2D0F.0020.0002] -AABE ; [.2D10.0020.0002] -AAC0 ; [.2D11.0020.0002] -AAC2 ; [.2D12.0020.0002] -AADB ; [.2D13.0020.0002] -AADC ; [.2D14.0020.0002] -0F40 ; [.2D15.0020.0002] -0F69 ; [.2D15.0020.0002][.2D56.0020.0002] -0F90 ; [.2D16.0020.0002] -0FB9 ; [.2D16.0020.0002][.2D56.0020.0002] -0F6B ; [.2D17.0020.0002] -0F41 ; [.2D18.0020.0002] -0F91 ; [.2D19.0020.0002] -0F42 ; [.2D1A.0020.0002] -0F43 ; [.2D1A.0020.0002][.2D5A.0020.0002] -0F92 ; [.2D1B.0020.0002] -0F93 ; [.2D1B.0020.0002][.2D5A.0020.0002] -0F44 ; [.2D1C.0020.0002] -0F94 ; [.2D1D.0020.0002] -0F45 ; [.2D1E.0020.0002] -0F95 ; [.2D1F.0020.0002] -0F46 ; [.2D20.0020.0002] -0F96 ; [.2D21.0020.0002] -0F47 ; [.2D22.0020.0002] -0F97 ; [.2D23.0020.0002] -0F49 ; [.2D24.0020.0002] -0F99 ; [.2D25.0020.0002] -0F4A ; [.2D26.0020.0002] -0F9A ; [.2D27.0020.0002] -0F4B ; [.2D28.0020.0002] -0F9B ; [.2D29.0020.0002] -0F4C ; [.2D2A.0020.0002] -0F4D ; [.2D2A.0020.0002][.2D5A.0020.0002] -0F9C ; [.2D2B.0020.0002] -0F9D ; [.2D2B.0020.0002][.2D5A.0020.0002] -0F4E ; [.2D2C.0020.0002] -0F9E ; [.2D2D.0020.0002] -0F4F ; [.2D2E.0020.0002] -0F9F ; [.2D2F.0020.0002] -0F50 ; [.2D30.0020.0002] -0FA0 ; [.2D31.0020.0002] -0F51 ; [.2D32.0020.0002] -0F52 ; [.2D32.0020.0002][.2D5A.0020.0002] -0FA1 ; [.2D33.0020.0002] -0FA2 ; [.2D33.0020.0002][.2D5A.0020.0002] -0F53 ; [.2D34.0020.0002] -0FA3 ; [.2D35.0020.0002] -0F54 ; [.2D36.0020.0002] -0FA4 ; [.2D37.0020.0002] -0F55 ; [.2D38.0020.0002] -0FA5 ; [.2D39.0020.0002] -0F56 ; [.2D3A.0020.0002] -0F57 ; [.2D3A.0020.0002][.2D5A.0020.0002] -0FA6 ; [.2D3B.0020.0002] -0FA7 ; [.2D3B.0020.0002][.2D5A.0020.0002] -0F58 ; [.2D3C.0020.0002] -0FA8 ; [.2D3D.0020.0002] -0F59 ; [.2D3E.0020.0002] -0FA9 ; [.2D3F.0020.0002] -0F5A ; [.2D40.0020.0002] -0FAA ; [.2D41.0020.0002] -0F5B ; [.2D42.0020.0002] -0F5C ; [.2D42.0020.0002][.2D5A.0020.0002] -0FAB ; [.2D43.0020.0002] -0FAC ; [.2D43.0020.0002][.2D5A.0020.0002] -0F5D ; [.2D44.0020.0002] -0FAD ; [.2D45.0020.0002] -0FBA ; [.2D45.0020.0004][.0000.010C.0004] -0F5E ; [.2D46.0020.0002] -0FAE ; [.2D47.0020.0002] -0F5F ; [.2D48.0020.0002] -0FAF ; [.2D49.0020.0002] -0F60 ; [.2D4A.0020.0002] -0FB0 ; [.2D4B.0020.0002] -0F61 ; [.2D4C.0020.0002] -0FB1 ; [.2D4D.0020.0002] -0FBB ; [.2D4D.0020.0004][.0000.010C.0004] -0F62 ; [.2D4E.0020.0002] -0F6A ; [.2D4E.0020.0004][.0000.010C.0004] -0FB2 ; [.2D4F.0020.0002] -0FBC ; [.2D4F.0020.0004][.0000.010C.0004] -0F6C ; [.2D50.0020.0002] -0F63 ; [.2D51.0020.0002] -0FB3 ; [.2D52.0020.0002] -0F64 ; [.2D53.0020.0002] -0FB4 ; [.2D54.0020.0002] -0F65 ; [.2D55.0020.0002] -0FB5 ; [.2D56.0020.0002] -0F66 ; [.2D57.0020.0002] -0FB6 ; [.2D58.0020.0002] -0F67 ; [.2D59.0020.0002] -0FB7 ; [.2D5A.0020.0002] -0F68 ; [.2D5B.0020.0002] -0F00 ; [.2D5B.0020.0004][.2D72.0020.0004][.0000.00BF.0004] -0FB8 ; [.2D5C.0020.0002] -0F88 ; [.2D5D.0020.0002] -0F8D ; [.2D5E.0020.0002] -0F89 ; [.2D5F.0020.0002] -0F8E ; [.2D60.0020.0002] -0F8C ; [.2D61.0020.0002] -0F8F ; [.2D62.0020.0002] -0F8A ; [.2D63.0020.0002] -0F8B ; [.2D64.0020.0002] -0F71 ; [.2D65.0020.0002] -0F72 ; [.2D66.0020.0002] -0F73 ; [.2D67.0020.0002] -0F71 0F72 ; [.2D67.0020.0002] -0F80 ; [.2D68.0020.0002] -0F81 ; [.2D69.0020.0002] -0F71 0F80 ; [.2D69.0020.0002] -0F74 ; [.2D6A.0020.0002] -0F75 ; [.2D6B.0020.0002] -0F71 0F74 ; [.2D6B.0020.0002] -0F76 ; [.2D6C.0020.0002] -0FB2 0F80 ; [.2D6C.0020.0002] -0F77 ; [.2D6D.0020.0002] -0FB2 0F71 0F80 ; [.2D6D.0020.0002] -0FB2 0F81 ; [.2D6D.0020.0002] -0F78 ; [.2D6E.0020.0002] -0FB3 0F80 ; [.2D6E.0020.0002] -0F79 ; [.2D6F.0020.0002] -0FB3 0F71 0F80 ; [.2D6F.0020.0002] -0FB3 0F81 ; [.2D6F.0020.0002] -0F7A ; [.2D70.0020.0002] -0F7B ; [.2D71.0020.0002] -0F7C ; [.2D72.0020.0002] -0F7D ; [.2D73.0020.0002] -0F84 ; [.2D74.0020.0002] -1C00 ; [.2D75.0020.0002] -1C01 ; [.2D76.0020.0002] -1C02 ; [.2D77.0020.0002] -1C03 ; [.2D78.0020.0002] -1C04 ; [.2D79.0020.0002] -1C05 ; [.2D7A.0020.0002] -1C06 ; [.2D7B.0020.0002] -1C07 ; [.2D7C.0020.0002] -1C08 ; [.2D7D.0020.0002] -1C09 ; [.2D7E.0020.0002] -1C4D ; [.2D7F.0020.0002] -1C4E ; [.2D80.0020.0002] -1C4F ; [.2D81.0020.0002] -1C0A ; [.2D82.0020.0002] -1C0B ; [.2D83.0020.0002] -1C0C ; [.2D84.0020.0002] -1C0D ; [.2D85.0020.0002] -1C0E ; [.2D86.0020.0002] -1C0F ; [.2D87.0020.0002] -1C10 ; [.2D88.0020.0002] -1C11 ; [.2D89.0020.0002] -1C12 ; [.2D8A.0020.0002] -1C13 ; [.2D8B.0020.0002] -1C14 ; [.2D8C.0020.0002] -1C15 ; [.2D8D.0020.0002] -1C16 ; [.2D8E.0020.0002] -1C17 ; [.2D8F.0020.0002] -1C18 ; [.2D90.0020.0002] -1C19 ; [.2D91.0020.0002] -1C1A ; [.2D92.0020.0002] -1C24 ; [.2D93.0020.0002] -1C1B ; [.2D94.0020.0002] -1C25 ; [.2D95.0020.0002] -1C1C ; [.2D96.0020.0002] -1C1D ; [.2D97.0020.0002] -1C1E ; [.2D98.0020.0002] -1C1F ; [.2D99.0020.0002] -1C20 ; [.2D9A.0020.0002] -1C21 ; [.2D9B.0020.0002] -1C22 ; [.2D9C.0020.0002] -1C23 ; [.2D9D.0020.0002] -1C36 ; [.2D9E.0020.0002] -1C26 ; [.2D9F.0020.0002] -1C27 ; [.2DA0.0020.0002] -1C28 ; [.2DA1.0020.0002] -1C29 ; [.2DA2.0020.0002] -1C2A ; [.2DA3.0020.0002] -1C2B ; [.2DA4.0020.0002] -1C2C ; [.2DA5.0020.0002] -1C2D ; [.2DA6.0020.0002] -1C2E ; [.2DA7.0020.0002] -1C2F ; [.2DA8.0020.0002] -1C30 ; [.2DA9.0020.0002] -1C31 ; [.2DAA.0020.0002] -1C32 ; [.2DAB.0020.0002] -1C33 ; [.2DAC.0020.0002] -1C34 ; [.2DAD.0020.0002] -1C35 ; [.2DAE.0020.0002] -A840 ; [.2DAF.0020.0002] -A841 ; [.2DB0.0020.0002] -A842 ; [.2DB1.0020.0002] -A843 ; [.2DB2.0020.0002] -A844 ; [.2DB3.0020.0002] -A845 ; [.2DB4.0020.0002] -A846 ; [.2DB5.0020.0002] -A847 ; [.2DB6.0020.0002] -A869 ; [.2DB7.0020.0002] -A86A ; [.2DB8.0020.0002] -A86B ; [.2DB9.0020.0002] -A86C ; [.2DBA.0020.0002] -A848 ; [.2DBB.0020.0002] -A849 ; [.2DBC.0020.0002] -A84A ; [.2DBD.0020.0002] -A84B ; [.2DBE.0020.0002] -A84C ; [.2DBF.0020.0002] -A84D ; [.2DC0.0020.0002] -A84E ; [.2DC1.0020.0002] -A84F ; [.2DC2.0020.0002] -A850 ; [.2DC3.0020.0002] -A851 ; [.2DC4.0020.0002] -A852 ; [.2DC5.0020.0002] -A853 ; [.2DC6.0020.0002] -A867 ; [.2DC7.0020.0002] -A854 ; [.2DC8.0020.0002] -A855 ; [.2DC9.0020.0002] -A856 ; [.2DCA.0020.0002] -A857 ; [.2DCB.0020.0002] -A868 ; [.2DCC.0020.0002] -A86D ; [.2DCD.0020.0002] -A858 ; [.2DCE.0020.0002] -A871 ; [.2DCF.0020.0002] -A872 ; [.2DD0.0020.0002] -A859 ; [.2DD1.0020.0002] -A85A ; [.2DD2.0020.0002] -A86E ; [.2DD3.0020.0002] -A85B ; [.2DD4.0020.0002] -A85C ; [.2DD5.0020.0002] -A86F ; [.2DD6.0020.0002] -A870 ; [.2DD7.0020.0002] -A85D ; [.2DD8.0020.0002] -A862 ; [.2DD9.0020.0002] -A863 ; [.2DDA.0020.0002] -A864 ; [.2DDB.0020.0002] -A865 ; [.2DDC.0020.0002] -A85E ; [.2DDD.0020.0002] -A85F ; [.2DDE.0020.0002] -A860 ; [.2DDF.0020.0002] -A861 ; [.2DE0.0020.0002] -A866 ; [.2DE1.0020.0002] -A873 ; [.2DE2.0020.0002] -1900 ; [.2DE3.0020.0002] -1901 ; [.2DE4.0020.0002] -1902 ; [.2DE5.0020.0002] -1903 ; [.2DE6.0020.0002] -1904 ; [.2DE7.0020.0002] -1905 ; [.2DE8.0020.0002] -1906 ; [.2DE9.0020.0002] -1907 ; [.2DEA.0020.0002] -1908 ; [.2DEB.0020.0002] -191D ; [.2DEB.0020.0004][.2E09.0020.0004] -1909 ; [.2DEC.0020.0002] -190A ; [.2DED.0020.0002] -190B ; [.2DEE.0020.0002] -191E ; [.2DEE.0020.0004][.2E0A.0020.0004] -190C ; [.2DEF.0020.0002] -190D ; [.2DF0.0020.0002] -190E ; [.2DF1.0020.0002] -190F ; [.2DF2.0020.0002] -1910 ; [.2DF3.0020.0002] -1911 ; [.2DF4.0020.0002] -1912 ; [.2DF5.0020.0002] -1913 ; [.2DF6.0020.0002] -1914 ; [.2DF7.0020.0002] -1915 ; [.2DF8.0020.0002] -1916 ; [.2DF9.0020.0002] -1917 ; [.2DFA.0020.0002] -1918 ; [.2DFB.0020.0002] -1919 ; [.2DFC.0020.0002] -191A ; [.2DFD.0020.0002] -191B ; [.2DFE.0020.0002] -191C ; [.2DFF.0020.0002] -1920 ; [.2E00.0020.0002] -1921 ; [.2E01.0020.0002] -1922 ; [.2E02.0020.0002] -1923 ; [.2E03.0020.0002] -1924 ; [.2E04.0020.0002] -1925 ; [.2E05.0020.0002] -1926 ; [.2E06.0020.0002] -1927 ; [.2E07.0020.0002] -1928 ; [.2E08.0020.0002] -1929 ; [.2E09.0020.0002] -192A ; [.2E0A.0020.0002] -192B ; [.2E0B.0020.0002] -1930 ; [.2E0C.0020.0002] -1931 ; [.2E0D.0020.0002] -1932 ; [.2E0E.0020.0002] -1933 ; [.2E0F.0020.0002] -1934 ; [.2E10.0020.0002] -1935 ; [.2E11.0020.0002] -1936 ; [.2E12.0020.0002] -1937 ; [.2E13.0020.0002] -1938 ; [.2E14.0020.0002] -1700 ; [.2E15.0020.0002] -1701 ; [.2E16.0020.0002] -1702 ; [.2E17.0020.0002] -1703 ; [.2E18.0020.0002] -1704 ; [.2E19.0020.0002] -1705 ; [.2E1A.0020.0002] -1706 ; [.2E1B.0020.0002] -1707 ; [.2E1C.0020.0002] -1708 ; [.2E1D.0020.0002] -1709 ; [.2E1E.0020.0002] -170A ; [.2E1F.0020.0002] -170B ; [.2E20.0020.0002] -170C ; [.2E21.0020.0002] -170E ; [.2E22.0020.0002] -170F ; [.2E23.0020.0002] -1710 ; [.2E24.0020.0002] -1711 ; [.2E25.0020.0002] -1712 ; [.2E26.0020.0002] -1713 ; [.2E27.0020.0002] -1714 ; [.2E28.0020.0002] -1720 ; [.2E29.0020.0002] -1721 ; [.2E2A.0020.0002] -1722 ; [.2E2B.0020.0002] -1723 ; [.2E2C.0020.0002] -1724 ; [.2E2D.0020.0002] -1725 ; [.2E2E.0020.0002] -1726 ; [.2E2F.0020.0002] -1727 ; [.2E30.0020.0002] -1728 ; [.2E31.0020.0002] -1729 ; [.2E32.0020.0002] -172A ; [.2E33.0020.0002] -172B ; [.2E34.0020.0002] -172C ; [.2E35.0020.0002] -172D ; [.2E36.0020.0002] -172E ; [.2E37.0020.0002] -172F ; [.2E38.0020.0002] -1730 ; [.2E39.0020.0002] -1731 ; [.2E3A.0020.0002] -1732 ; [.2E3B.0020.0002] -1733 ; [.2E3C.0020.0002] -1734 ; [.2E3D.0020.0002] -1740 ; [.2E3E.0020.0002] -1741 ; [.2E3F.0020.0002] -1742 ; [.2E40.0020.0002] -1743 ; [.2E41.0020.0002] -1744 ; [.2E42.0020.0002] -1745 ; [.2E43.0020.0002] -1746 ; [.2E44.0020.0002] -1747 ; [.2E45.0020.0002] -1748 ; [.2E46.0020.0002] -1749 ; [.2E47.0020.0002] -174A ; [.2E48.0020.0002] -174B ; [.2E49.0020.0002] -174C ; [.2E4A.0020.0002] -174D ; [.2E4B.0020.0002] -174E ; [.2E4C.0020.0002] -174F ; [.2E4D.0020.0002] -1750 ; [.2E4E.0020.0002] -1751 ; [.2E4F.0020.0002] -1752 ; [.2E50.0020.0002] -1753 ; [.2E51.0020.0002] -1760 ; [.2E52.0020.0002] -1761 ; [.2E53.0020.0002] -1762 ; [.2E54.0020.0002] -1763 ; [.2E55.0020.0002] -1764 ; [.2E56.0020.0002] -1765 ; [.2E57.0020.0002] -1766 ; [.2E58.0020.0002] -1767 ; [.2E59.0020.0002] -1768 ; [.2E5A.0020.0002] -1769 ; [.2E5B.0020.0002] -176A ; [.2E5C.0020.0002] -176B ; [.2E5D.0020.0002] -176C ; [.2E5E.0020.0002] -176E ; [.2E5F.0020.0002] -176F ; [.2E60.0020.0002] -1770 ; [.2E61.0020.0002] -1772 ; [.2E62.0020.0002] -1773 ; [.2E63.0020.0002] -1A00 ; [.2E64.0020.0002] -1A01 ; [.2E65.0020.0002] -1A02 ; [.2E66.0020.0002] -1A03 ; [.2E67.0020.0002] -1A04 ; [.2E68.0020.0002] -1A05 ; [.2E69.0020.0002] -1A06 ; [.2E6A.0020.0002] -1A07 ; [.2E6B.0020.0002] -1A08 ; [.2E6C.0020.0002] -1A09 ; [.2E6D.0020.0002] -1A0A ; [.2E6E.0020.0002] -1A0B ; [.2E6F.0020.0002] -1A0C ; [.2E70.0020.0002] -1A0D ; [.2E71.0020.0002] -1A0E ; [.2E72.0020.0002] -1A0F ; [.2E73.0020.0002] -1A10 ; [.2E74.0020.0002] -1A11 ; [.2E75.0020.0002] -1A12 ; [.2E76.0020.0002] -1A13 ; [.2E77.0020.0002] -1A14 ; [.2E78.0020.0002] -1A15 ; [.2E79.0020.0002] -1A16 ; [.2E7A.0020.0002] -1A17 ; [.2E7B.0020.0002] -1A18 ; [.2E7C.0020.0002] -1A19 ; [.2E7D.0020.0002] -1A1A ; [.2E7E.0020.0002] -1A1B ; [.2E7F.0020.0002] -1BC0 ; [.2E80.0020.0002] -1BC1 ; [.2E80.0020.0004] -1BC2 ; [.2E81.0020.0002] -1BC3 ; [.2E81.0020.0004] -1BC4 ; [.2E81.0020.0004] -1BC5 ; [.2E82.0020.0002] -1BC6 ; [.2E82.0020.0004] -1BC7 ; [.2E83.0020.0002] -1BC8 ; [.2E83.0020.0004] -1BC9 ; [.2E84.0020.0002] -1BCA ; [.2E84.0020.0004] -1BCB ; [.2E85.0020.0002] -1BCC ; [.2E85.0020.0004] -1BCD ; [.2E85.0020.0004] -1BCE ; [.2E86.0020.0002] -1BCF ; [.2E86.0020.0004] -1BD0 ; [.2E87.0020.0002] -1BD1 ; [.2E88.0020.0002] -1BD2 ; [.2E89.0020.0002] -1BD3 ; [.2E89.0020.0004] -1BD4 ; [.2E8A.0020.0002] -1BD5 ; [.2E8A.0020.0004] -1BD6 ; [.2E8B.0020.0002] -1BD7 ; [.2E8B.0020.0004] -1BD8 ; [.2E8C.0020.0002] -1BD9 ; [.2E8C.0020.0004] -1BDA ; [.2E8C.0020.0004] -1BDB ; [.2E8D.0020.0002] -1BDC ; [.2E8D.0020.0004] -1BDD ; [.2E8E.0020.0002] -1BDE ; [.2E8F.0020.0002] -1BDF ; [.2E8F.0020.0004] -1BE0 ; [.2E90.0020.0002] -1BE1 ; [.2E91.0020.0002] -1BE2 ; [.2E92.0020.0002] -1BE3 ; [.2E93.0020.0002] -1BE4 ; [.2E94.0020.0002] -1BE5 ; [.2E95.0020.0002] -1BE7 ; [.2E96.0020.0002] -1BE8 ; [.2E96.0020.0004] -1BE9 ; [.2E97.0020.0002] -1BEA ; [.2E98.0020.0002] -1BEB ; [.2E98.0020.0004] -1BEC ; [.2E99.0020.0002] -1BED ; [.2E99.0020.0004] -1BEE ; [.2E9A.0020.0002] -1BEF ; [.2E9A.0020.0004] -1BF0 ; [.2E9B.0020.0002] -1BF1 ; [.2E9C.0020.0002] -1BF2 ; [.2E9D.0020.0002] -1BF3 ; [.2E9E.0020.0002] -A930 ; [.2E9F.0020.0002] -A931 ; [.2EA0.0020.0002] -A932 ; [.2EA1.0020.0002] -A933 ; [.2EA2.0020.0002] -A934 ; [.2EA3.0020.0002] -A935 ; [.2EA4.0020.0002] -A936 ; [.2EA5.0020.0002] -A937 ; [.2EA6.0020.0002] -A938 ; [.2EA7.0020.0002] -A939 ; [.2EA8.0020.0002] -A93A ; [.2EA9.0020.0002] -A93B ; [.2EAA.0020.0002] -A93C ; [.2EAB.0020.0002] -A93D ; [.2EAC.0020.0002] -A93E ; [.2EAD.0020.0002] -A93F ; [.2EAE.0020.0002] -A940 ; [.2EAF.0020.0002] -A941 ; [.2EB0.0020.0002] -A942 ; [.2EB1.0020.0002] -A943 ; [.2EB2.0020.0002] -A944 ; [.2EB3.0020.0002] -A945 ; [.2EB4.0020.0002] -A946 ; [.2EB5.0020.0002] -A947 ; [.2EB6.0020.0002] -A948 ; [.2EB7.0020.0002] -A949 ; [.2EB8.0020.0002] -A94A ; [.2EB9.0020.0002] -A94B ; [.2EBA.0020.0002] -A94C ; [.2EBB.0020.0002] -A94D ; [.2EBC.0020.0002] -A94E ; [.2EBD.0020.0002] -A94F ; [.2EBE.0020.0002] -A950 ; [.2EBF.0020.0002] -A951 ; [.2EC0.0020.0002] -A952 ; [.2EC1.0020.0002] -A953 ; [.2EC2.0020.0002] -A90A ; [.2EC3.0020.0002] -A90B ; [.2EC4.0020.0002] -A90C ; [.2EC5.0020.0002] -A90D ; [.2EC6.0020.0002] -A90E ; [.2EC7.0020.0002] -A90F ; [.2EC8.0020.0002] -A910 ; [.2EC9.0020.0002] -A911 ; [.2ECA.0020.0002] -A912 ; [.2ECB.0020.0002] -A913 ; [.2ECC.0020.0002] -A914 ; [.2ECD.0020.0002] -A915 ; [.2ECE.0020.0002] -A916 ; [.2ECF.0020.0002] -A917 ; [.2ED0.0020.0002] -A918 ; [.2ED1.0020.0002] -A919 ; [.2ED2.0020.0002] -A91A ; [.2ED3.0020.0002] -A91B ; [.2ED4.0020.0002] -A91C ; [.2ED5.0020.0002] -A91D ; [.2ED6.0020.0002] -A91E ; [.2ED7.0020.0002] -A91F ; [.2ED8.0020.0002] -A920 ; [.2ED9.0020.0002] -A921 ; [.2EDA.0020.0002] -A922 ; [.2EDB.0020.0002] -A923 ; [.2EDC.0020.0002] -A924 ; [.2EDD.0020.0002] -A925 ; [.2EDE.0020.0002] -A926 ; [.2EDF.0020.0002] -A927 ; [.2EE0.0020.0002] -A928 ; [.2EE1.0020.0002] -A929 ; [.2EE2.0020.0002] -A92A ; [.2EE3.0020.0002] -1000 ; [.2EE4.0020.0002] -1075 ; [.2EE5.0020.0002] -1001 ; [.2EE6.0020.0002] -1076 ; [.2EE7.0020.0002] -1002 ; [.2EE8.0020.0002] -1077 ; [.2EE9.0020.0002] -AA60 ; [.2EEA.0020.0002] -A9E9 ; [.2EEB.0020.0002] -1003 ; [.2EEC.0020.0002] -A9E0 ; [.2EED.0020.0002] -A9EA ; [.2EEE.0020.0002] -1004 ; [.2EEF.0020.0002] -105A ; [.2EF0.0020.0002] -1005 ; [.2EF1.0020.0002] -1078 ; [.2EF2.0020.0002] -AA61 ; [.2EF3.0020.0002] -1006 ; [.2EF4.0020.0002] -A9E1 ; [.2EF5.0020.0002] -AA62 ; [.2EF6.0020.0002] -AA7E ; [.2EF7.0020.0002] -1007 ; [.2EF8.0020.0002] -AA63 ; [.2EF9.0020.0002] -A9EB ; [.2EFA.0020.0002] -1079 ; [.2EFB.0020.0002] -AA72 ; [.2EFC.0020.0002] -1008 ; [.2EFD.0020.0002] -105B ; [.2EFE.0020.0002] -A9E2 ; [.2EFF.0020.0002] -AA64 ; [.2F00.0020.0002] -A9EC ; [.2F01.0020.0002] -1061 ; [.2F02.0020.0002] -AA7F ; [.2F03.0020.0002] -1009 ; [.2F04.0020.0002] -107A ; [.2F05.0020.0002] -AA65 ; [.2F06.0020.0002] -A9E7 ; [.2F07.0020.0002] -100A ; [.2F08.0020.0002] -100B ; [.2F09.0020.0002] -AA66 ; [.2F0A.0020.0002] -100C ; [.2F0B.0020.0002] -AA67 ; [.2F0C.0020.0002] -100D ; [.2F0D.0020.0002] -AA68 ; [.2F0E.0020.0002] -A9ED ; [.2F0F.0020.0002] -100E ; [.2F10.0020.0002] -AA69 ; [.2F11.0020.0002] -A9EE ; [.2F12.0020.0002] -100F ; [.2F13.0020.0002] -106E ; [.2F14.0020.0002] -A9E3 ; [.2F15.0020.0002] -A9EF ; [.2F16.0020.0002] -1010 ; [.2F17.0020.0002] -1011 ; [.2F18.0020.0002] -1012 ; [.2F19.0020.0002] -107B ; [.2F1A.0020.0002] -A9FB ; [.2F1B.0020.0002] -1013 ; [.2F1C.0020.0002] -AA6A ; [.2F1D.0020.0002] -A9FC ; [.2F1E.0020.0002] -1014 ; [.2F1F.0020.0002] -107C ; [.2F20.0020.0002] -AA6B ; [.2F21.0020.0002] -105E ; [.2F22.0020.0002] -1015 ; [.2F23.0020.0002] -1016 ; [.2F24.0020.0002] -107D ; [.2F25.0020.0002] -107E ; [.2F26.0020.0002] -AA6F ; [.2F27.0020.0002] -108E ; [.2F28.0020.0002] -A9E8 ; [.2F29.0020.0002] -1017 ; [.2F2A.0020.0002] -107F ; [.2F2B.0020.0002] -A9FD ; [.2F2C.0020.0002] -1018 ; [.2F2D.0020.0002] -A9E4 ; [.2F2E.0020.0002] -A9FE ; [.2F2F.0020.0002] -1019 ; [.2F30.0020.0002] -105F ; [.2F31.0020.0002] -101A ; [.2F32.0020.0002] -103B ; [.2F33.0020.0002] -101B ; [.2F34.0020.0002] -AA73 ; [.2F35.0020.0002] -AA7A ; [.2F36.0020.0002] -103C ; [.2F37.0020.0002] -101C ; [.2F38.0020.0002] -1060 ; [.2F39.0020.0002] -101D ; [.2F3A.0020.0002] -103D ; [.2F3B.0020.0002] -1082 ; [.2F3C.0020.0002] -1080 ; [.2F3D.0020.0002] -1050 ; [.2F3E.0020.0002] -1051 ; [.2F3F.0020.0002] -1065 ; [.2F40.0020.0002] -101E ; [.2F41.0020.0002] -103F ; [.2F41.0020.0004][.2F7A.0020.0004][.2F41.0020.0004] -AA6C ; [.2F42.0020.0002] -101F ; [.2F43.0020.0002] -1081 ; [.2F44.0020.0002] -AA6D ; [.2F45.0020.0002] -103E ; [.2F46.0020.0002] -AA6E ; [.2F47.0020.0002] -AA71 ; [.2F48.0020.0002] -1020 ; [.2F49.0020.0002] -A9FA ; [.2F4A.0020.0002] -105C ; [.2F4B.0020.0002] -105D ; [.2F4C.0020.0002] -106F ; [.2F4D.0020.0002] -1070 ; [.2F4E.0020.0002] -1066 ; [.2F4F.0020.0002] -1021 ; [.2F50.0020.0002] -1022 ; [.2F51.0020.0002] -1023 ; [.2F52.0020.0002] -1024 ; [.2F53.0020.0002] -1025 ; [.2F54.0020.0002] -1026 ; [.2F55.0020.0002] -1025 102E ; [.2F55.0020.0002] -1052 ; [.2F56.0020.0002] -1053 ; [.2F57.0020.0002] -1054 ; [.2F58.0020.0002] -1055 ; [.2F59.0020.0002] -1027 ; [.2F5A.0020.0002] -1028 ; [.2F5B.0020.0002] -1029 ; [.2F5C.0020.0002] -102A ; [.2F5D.0020.0002] -102C ; [.2F5E.0020.0002] -102B ; [.2F5E.0020.0004] -1083 ; [.2F5F.0020.0002] -1072 ; [.2F60.0020.0002] -109C ; [.2F61.0020.0002] -102D ; [.2F62.0020.0002] -1071 ; [.2F63.0020.0002] -102E ; [.2F64.0020.0002] -1033 ; [.2F65.0020.0002] -102F ; [.2F66.0020.0002] -1073 ; [.2F67.0020.0002] -1074 ; [.2F68.0020.0002] -1030 ; [.2F69.0020.0002] -1056 ; [.2F6A.0020.0002] -1057 ; [.2F6B.0020.0002] -1058 ; [.2F6C.0020.0002] -1059 ; [.2F6D.0020.0002] -1031 ; [.2F6E.0020.0002] -1084 ; [.2F6F.0020.0002] -1035 ; [.2F70.0020.0002] -1085 ; [.2F71.0020.0002] -1032 ; [.2F72.0020.0002] -109D ; [.2F73.0020.0002] -1034 ; [.2F74.0020.0002] -1062 ; [.2F75.0020.0002] -1067 ; [.2F76.0020.0002] -1068 ; [.2F77.0020.0002] -A9E5 ; [.2F78.0020.0002] -1086 ; [.2F79.0020.0002] -1039 ; [.2F7A.0020.0002] -103A ; [.2F7B.0020.0002] -1063 ; [.2F7C.0020.0002] -1064 ; [.2F7D.0020.0002] -1069 ; [.2F7E.0020.0002] -106A ; [.2F7F.0020.0002] -106B ; [.2F80.0020.0002] -106C ; [.2F81.0020.0002] -106D ; [.2F82.0020.0002] -1087 ; [.2F83.0020.0002] -108B ; [.2F84.0020.0002] -1088 ; [.2F85.0020.0002] -108C ; [.2F86.0020.0002] -108D ; [.2F87.0020.0002] -1089 ; [.2F88.0020.0002] -108A ; [.2F89.0020.0002] -108F ; [.2F8A.0020.0002] -109A ; [.2F8B.0020.0002] -109B ; [.2F8C.0020.0002] -AA7B ; [.2F8D.0020.0002] -AA7C ; [.2F8E.0020.0002] -AA7D ; [.2F8F.0020.0002] -AA74 ; [.2F90.0020.0002] -AA75 ; [.2F91.0020.0002] -AA76 ; [.2F92.0020.0002] -11103 ; [.2F93.0020.0002] -11104 ; [.2F94.0020.0002] -11105 ; [.2F95.0020.0002] -11106 ; [.2F96.0020.0002] -11107 ; [.2F97.0020.0002] -11108 ; [.2F98.0020.0002] -11109 ; [.2F99.0020.0002] -1110A ; [.2F9A.0020.0002] -1110B ; [.2F9B.0020.0002] -1110C ; [.2F9C.0020.0002] -1110D ; [.2F9D.0020.0002] -1110E ; [.2F9E.0020.0002] -1110F ; [.2F9F.0020.0002] -11110 ; [.2FA0.0020.0002] -11111 ; [.2FA1.0020.0002] -11112 ; [.2FA2.0020.0002] -11113 ; [.2FA3.0020.0002] -11114 ; [.2FA4.0020.0002] -11115 ; [.2FA5.0020.0002] -11116 ; [.2FA6.0020.0002] -11117 ; [.2FA7.0020.0002] -11118 ; [.2FA8.0020.0002] -11119 ; [.2FA9.0020.0002] -1111A ; [.2FAA.0020.0002] -1111B ; [.2FAB.0020.0002] -1111C ; [.2FAC.0020.0002] -1111D ; [.2FAD.0020.0002] -1111E ; [.2FAE.0020.0002] -1111F ; [.2FAF.0020.0002] -11120 ; [.2FB0.0020.0002] -11121 ; [.2FB1.0020.0002] -11122 ; [.2FB2.0020.0002] -11123 ; [.2FB3.0020.0002] -11124 ; [.2FB4.0020.0002] -11125 ; [.2FB5.0020.0002] -11126 ; [.2FB6.0020.0002] -11127 ; [.2FB7.0020.0002] -11128 ; [.2FB8.0020.0002] -11129 ; [.2FB9.0020.0002] -1112A ; [.2FBA.0020.0002] -1112B ; [.2FBB.0020.0002] -1112C ; [.2FBC.0020.0002] -1112D ; [.2FBD.0020.0002] -1112E ; [.2FBE.0020.0002] -11131 11127 ; [.2FBE.0020.0002] -1112F ; [.2FBF.0020.0002] -11132 11127 ; [.2FBF.0020.0002] -11130 ; [.2FC0.0020.0002] -11131 ; [.2FC1.0020.0002] -11132 ; [.2FC2.0020.0002] -11133 ; [.2FC3.0020.0002] -11134 ; [.2FC4.0020.0002] -1780 ; [.2FC5.0020.0002] -1781 ; [.2FC6.0020.0002] -1782 ; [.2FC7.0020.0002] -1783 ; [.2FC8.0020.0002] -1784 ; [.2FC9.0020.0002] -1785 ; [.2FCA.0020.0002] -1786 ; [.2FCB.0020.0002] -1787 ; [.2FCC.0020.0002] -1788 ; [.2FCD.0020.0002] -1789 ; [.2FCE.0020.0002] -178A ; [.2FCF.0020.0002] -178B ; [.2FD0.0020.0002] -178C ; [.2FD1.0020.0002] -178D ; [.2FD2.0020.0002] -178E ; [.2FD3.0020.0002] -178F ; [.2FD4.0020.0002] -1790 ; [.2FD5.0020.0002] -1791 ; [.2FD6.0020.0002] -1792 ; [.2FD7.0020.0002] -1793 ; [.2FD8.0020.0002] -1794 ; [.2FD9.0020.0002] -1795 ; [.2FDA.0020.0002] -1796 ; [.2FDB.0020.0002] -1797 ; [.2FDC.0020.0002] -1798 ; [.2FDD.0020.0002] -1799 ; [.2FDE.0020.0002] -179A ; [.2FDF.0020.0002] -179B ; [.2FE0.0020.0002] -179C ; [.2FE1.0020.0002] -179D ; [.2FE2.0020.0002] -179E ; [.2FE3.0020.0002] -179F ; [.2FE4.0020.0002] -17A0 ; [.2FE5.0020.0002] -17A1 ; [.2FE6.0020.0002] -17A2 ; [.2FE7.0020.0002] -17DC ; [.2FE8.0020.0002] -17A3 ; [.2FE9.0020.0002] -17A4 ; [.2FEA.0020.0002] -17A5 ; [.2FEB.0020.0002] -17A6 ; [.2FEC.0020.0002] -17A7 ; [.2FED.0020.0002] -17A8 ; [.2FEE.0020.0002] -17A9 ; [.2FEF.0020.0002] -17AA ; [.2FF0.0020.0002] -17AB ; [.2FF1.0020.0002] -17AC ; [.2FF2.0020.0002] -17AD ; [.2FF3.0020.0002] -17AE ; [.2FF4.0020.0002] -17AF ; [.2FF5.0020.0002] -17B0 ; [.2FF6.0020.0002] -17B1 ; [.2FF7.0020.0002] -17B2 ; [.2FF8.0020.0002] -17B3 ; [.2FF9.0020.0002] -17B6 ; [.2FFA.0020.0002] -17B7 ; [.2FFB.0020.0002] -17B8 ; [.2FFC.0020.0002] -17B9 ; [.2FFD.0020.0002] -17BA ; [.2FFE.0020.0002] -17BB ; [.2FFF.0020.0002] -17BC ; [.3000.0020.0002] -17BD ; [.3001.0020.0002] -17BE ; [.3002.0020.0002] -17BF ; [.3003.0020.0002] -17C0 ; [.3004.0020.0002] -17C1 ; [.3005.0020.0002] -17C2 ; [.3006.0020.0002] -17C3 ; [.3007.0020.0002] -17C4 ; [.3008.0020.0002] -17C5 ; [.3009.0020.0002] -17D2 ; [.300A.0020.0002] -1950 ; [.300B.0020.0002] -1951 ; [.300C.0020.0002] -1952 ; [.300D.0020.0002] -1953 ; [.300E.0020.0002] -1954 ; [.300F.0020.0002] -1955 ; [.3010.0020.0002] -1956 ; [.3011.0020.0002] -1957 ; [.3012.0020.0002] -1958 ; [.3013.0020.0002] -1959 ; [.3014.0020.0002] -195A ; [.3015.0020.0002] -195B ; [.3016.0020.0002] -195C ; [.3017.0020.0002] -195D ; [.3018.0020.0002] -195E ; [.3019.0020.0002] -195F ; [.301A.0020.0002] -1960 ; [.301B.0020.0002] -1961 ; [.301C.0020.0002] -1962 ; [.301D.0020.0002] -1963 ; [.301E.0020.0002] -1964 ; [.301F.0020.0002] -1965 ; [.3020.0020.0002] -1966 ; [.3021.0020.0002] -1967 ; [.3022.0020.0002] -1968 ; [.3023.0020.0002] -1969 ; [.3024.0020.0002] -196A ; [.3025.0020.0002] -196B ; [.3026.0020.0002] -196C ; [.3027.0020.0002] -196D ; [.3028.0020.0002] -1970 ; [.3029.0020.0002] -1971 ; [.302A.0020.0002] -1972 ; [.302B.0020.0002] -1973 ; [.302C.0020.0002] -1974 ; [.302D.0020.0002] -1980 ; [.302E.0020.0002] -19B5 1980 ; [.302E.0020.0002][.305F.0020.0002] -19B6 1980 ; [.302E.0020.0002][.3060.0020.0002] -19B7 1980 ; [.302E.0020.0002][.3061.0020.0002] -19BA 1980 ; [.302E.0020.0002][.3064.0020.0002] -1981 ; [.302F.0020.0002] -19B5 1981 ; [.302F.0020.0002][.305F.0020.0002] -19B6 1981 ; [.302F.0020.0002][.3060.0020.0002] -19B7 1981 ; [.302F.0020.0002][.3061.0020.0002] -19BA 1981 ; [.302F.0020.0002][.3064.0020.0002] -1982 ; [.3030.0020.0002] -19B5 1982 ; [.3030.0020.0002][.305F.0020.0002] -19B6 1982 ; [.3030.0020.0002][.3060.0020.0002] -19B7 1982 ; [.3030.0020.0002][.3061.0020.0002] -19BA 1982 ; [.3030.0020.0002][.3064.0020.0002] -1983 ; [.3031.0020.0002] -19B5 1983 ; [.3031.0020.0002][.305F.0020.0002] -19B6 1983 ; [.3031.0020.0002][.3060.0020.0002] -19B7 1983 ; [.3031.0020.0002][.3061.0020.0002] -19BA 1983 ; [.3031.0020.0002][.3064.0020.0002] -1984 ; [.3032.0020.0002] -19B5 1984 ; [.3032.0020.0002][.305F.0020.0002] -19B6 1984 ; [.3032.0020.0002][.3060.0020.0002] -19B7 1984 ; [.3032.0020.0002][.3061.0020.0002] -19BA 1984 ; [.3032.0020.0002][.3064.0020.0002] -1985 ; [.3033.0020.0002] -19B5 1985 ; [.3033.0020.0002][.305F.0020.0002] -19B6 1985 ; [.3033.0020.0002][.3060.0020.0002] -19B7 1985 ; [.3033.0020.0002][.3061.0020.0002] -19BA 1985 ; [.3033.0020.0002][.3064.0020.0002] -1986 ; [.3034.0020.0002] -19B5 1986 ; [.3034.0020.0002][.305F.0020.0002] -19B6 1986 ; [.3034.0020.0002][.3060.0020.0002] -19B7 1986 ; [.3034.0020.0002][.3061.0020.0002] -19BA 1986 ; [.3034.0020.0002][.3064.0020.0002] -1987 ; [.3035.0020.0002] -19B5 1987 ; [.3035.0020.0002][.305F.0020.0002] -19B6 1987 ; [.3035.0020.0002][.3060.0020.0002] -19B7 1987 ; [.3035.0020.0002][.3061.0020.0002] -19BA 1987 ; [.3035.0020.0002][.3064.0020.0002] -1988 ; [.3036.0020.0002] -19B5 1988 ; [.3036.0020.0002][.305F.0020.0002] -19B6 1988 ; [.3036.0020.0002][.3060.0020.0002] -19B7 1988 ; [.3036.0020.0002][.3061.0020.0002] -19BA 1988 ; [.3036.0020.0002][.3064.0020.0002] -1989 ; [.3037.0020.0002] -19B5 1989 ; [.3037.0020.0002][.305F.0020.0002] -19B6 1989 ; [.3037.0020.0002][.3060.0020.0002] -19B7 1989 ; [.3037.0020.0002][.3061.0020.0002] -19BA 1989 ; [.3037.0020.0002][.3064.0020.0002] -198A ; [.3038.0020.0002] -19B5 198A ; [.3038.0020.0002][.305F.0020.0002] -19B6 198A ; [.3038.0020.0002][.3060.0020.0002] -19B7 198A ; [.3038.0020.0002][.3061.0020.0002] -19BA 198A ; [.3038.0020.0002][.3064.0020.0002] -198B ; [.3039.0020.0002] -19B5 198B ; [.3039.0020.0002][.305F.0020.0002] -19B6 198B ; [.3039.0020.0002][.3060.0020.0002] -19B7 198B ; [.3039.0020.0002][.3061.0020.0002] -19BA 198B ; [.3039.0020.0002][.3064.0020.0002] -198C ; [.303A.0020.0002] -19B5 198C ; [.303A.0020.0002][.305F.0020.0002] -19B6 198C ; [.303A.0020.0002][.3060.0020.0002] -19B7 198C ; [.303A.0020.0002][.3061.0020.0002] -19BA 198C ; [.303A.0020.0002][.3064.0020.0002] -198D ; [.303B.0020.0002] -19B5 198D ; [.303B.0020.0002][.305F.0020.0002] -19B6 198D ; [.303B.0020.0002][.3060.0020.0002] -19B7 198D ; [.303B.0020.0002][.3061.0020.0002] -19BA 198D ; [.303B.0020.0002][.3064.0020.0002] -198E ; [.303C.0020.0002] -19B5 198E ; [.303C.0020.0002][.305F.0020.0002] -19B6 198E ; [.303C.0020.0002][.3060.0020.0002] -19B7 198E ; [.303C.0020.0002][.3061.0020.0002] -19BA 198E ; [.303C.0020.0002][.3064.0020.0002] -198F ; [.303D.0020.0002] -19B5 198F ; [.303D.0020.0002][.305F.0020.0002] -19B6 198F ; [.303D.0020.0002][.3060.0020.0002] -19B7 198F ; [.303D.0020.0002][.3061.0020.0002] -19BA 198F ; [.303D.0020.0002][.3064.0020.0002] -1990 ; [.303E.0020.0002] -19B5 1990 ; [.303E.0020.0002][.305F.0020.0002] -19B6 1990 ; [.303E.0020.0002][.3060.0020.0002] -19B7 1990 ; [.303E.0020.0002][.3061.0020.0002] -19BA 1990 ; [.303E.0020.0002][.3064.0020.0002] -1991 ; [.303F.0020.0002] -19B5 1991 ; [.303F.0020.0002][.305F.0020.0002] -19B6 1991 ; [.303F.0020.0002][.3060.0020.0002] -19B7 1991 ; [.303F.0020.0002][.3061.0020.0002] -19BA 1991 ; [.303F.0020.0002][.3064.0020.0002] -1992 ; [.3040.0020.0002] -19B5 1992 ; [.3040.0020.0002][.305F.0020.0002] -19B6 1992 ; [.3040.0020.0002][.3060.0020.0002] -19B7 1992 ; [.3040.0020.0002][.3061.0020.0002] -19BA 1992 ; [.3040.0020.0002][.3064.0020.0002] -1993 ; [.3041.0020.0002] -19B5 1993 ; [.3041.0020.0002][.305F.0020.0002] -19B6 1993 ; [.3041.0020.0002][.3060.0020.0002] -19B7 1993 ; [.3041.0020.0002][.3061.0020.0002] -19BA 1993 ; [.3041.0020.0002][.3064.0020.0002] -1994 ; [.3042.0020.0002] -19B5 1994 ; [.3042.0020.0002][.305F.0020.0002] -19B6 1994 ; [.3042.0020.0002][.3060.0020.0002] -19B7 1994 ; [.3042.0020.0002][.3061.0020.0002] -19BA 1994 ; [.3042.0020.0002][.3064.0020.0002] -1995 ; [.3043.0020.0002] -19B5 1995 ; [.3043.0020.0002][.305F.0020.0002] -19B6 1995 ; [.3043.0020.0002][.3060.0020.0002] -19B7 1995 ; [.3043.0020.0002][.3061.0020.0002] -19BA 1995 ; [.3043.0020.0002][.3064.0020.0002] -1996 ; [.3044.0020.0002] -19B5 1996 ; [.3044.0020.0002][.305F.0020.0002] -19B6 1996 ; [.3044.0020.0002][.3060.0020.0002] -19B7 1996 ; [.3044.0020.0002][.3061.0020.0002] -19BA 1996 ; [.3044.0020.0002][.3064.0020.0002] -1997 ; [.3045.0020.0002] -19B5 1997 ; [.3045.0020.0002][.305F.0020.0002] -19B6 1997 ; [.3045.0020.0002][.3060.0020.0002] -19B7 1997 ; [.3045.0020.0002][.3061.0020.0002] -19BA 1997 ; [.3045.0020.0002][.3064.0020.0002] -1998 ; [.3046.0020.0002] -19B5 1998 ; [.3046.0020.0002][.305F.0020.0002] -19B6 1998 ; [.3046.0020.0002][.3060.0020.0002] -19B7 1998 ; [.3046.0020.0002][.3061.0020.0002] -19BA 1998 ; [.3046.0020.0002][.3064.0020.0002] -1999 ; [.3047.0020.0002] -19B5 1999 ; [.3047.0020.0002][.305F.0020.0002] -19B6 1999 ; [.3047.0020.0002][.3060.0020.0002] -19B7 1999 ; [.3047.0020.0002][.3061.0020.0002] -19BA 1999 ; [.3047.0020.0002][.3064.0020.0002] -199A ; [.3048.0020.0002] -19B5 199A ; [.3048.0020.0002][.305F.0020.0002] -19B6 199A ; [.3048.0020.0002][.3060.0020.0002] -19B7 199A ; [.3048.0020.0002][.3061.0020.0002] -19BA 199A ; [.3048.0020.0002][.3064.0020.0002] -199B ; [.3049.0020.0002] -19B5 199B ; [.3049.0020.0002][.305F.0020.0002] -19B6 199B ; [.3049.0020.0002][.3060.0020.0002] -19B7 199B ; [.3049.0020.0002][.3061.0020.0002] -19BA 199B ; [.3049.0020.0002][.3064.0020.0002] -199C ; [.304A.0020.0002] -19B5 199C ; [.304A.0020.0002][.305F.0020.0002] -19B6 199C ; [.304A.0020.0002][.3060.0020.0002] -19DE ; [.304A.0020.0004][.3060.0020.0004] -19DF ; [.304A.0020.0004][.3060.0020.0004][.306B.0020.0004] -19B7 199C ; [.304A.0020.0002][.3061.0020.0002] -19BA 199C ; [.304A.0020.0002][.3064.0020.0002] -199D ; [.304B.0020.0002] -19B5 199D ; [.304B.0020.0002][.305F.0020.0002] -19B6 199D ; [.304B.0020.0002][.3060.0020.0002] -19B7 199D ; [.304B.0020.0002][.3061.0020.0002] -19BA 199D ; [.304B.0020.0002][.3064.0020.0002] -199E ; [.304C.0020.0002] -19B5 199E ; [.304C.0020.0002][.305F.0020.0002] -19B6 199E ; [.304C.0020.0002][.3060.0020.0002] -19B7 199E ; [.304C.0020.0002][.3061.0020.0002] -19BA 199E ; [.304C.0020.0002][.3064.0020.0002] -199F ; [.304D.0020.0002] -19B5 199F ; [.304D.0020.0002][.305F.0020.0002] -19B6 199F ; [.304D.0020.0002][.3060.0020.0002] -19B7 199F ; [.304D.0020.0002][.3061.0020.0002] -19BA 199F ; [.304D.0020.0002][.3064.0020.0002] -19A0 ; [.304E.0020.0002] -19B5 19A0 ; [.304E.0020.0002][.305F.0020.0002] -19B6 19A0 ; [.304E.0020.0002][.3060.0020.0002] -19B7 19A0 ; [.304E.0020.0002][.3061.0020.0002] -19BA 19A0 ; [.304E.0020.0002][.3064.0020.0002] -19A1 ; [.304F.0020.0002] -19B5 19A1 ; [.304F.0020.0002][.305F.0020.0002] -19B6 19A1 ; [.304F.0020.0002][.3060.0020.0002] -19B7 19A1 ; [.304F.0020.0002][.3061.0020.0002] -19BA 19A1 ; [.304F.0020.0002][.3064.0020.0002] -19A2 ; [.3050.0020.0002] -19B5 19A2 ; [.3050.0020.0002][.305F.0020.0002] -19B6 19A2 ; [.3050.0020.0002][.3060.0020.0002] -19B7 19A2 ; [.3050.0020.0002][.3061.0020.0002] -19BA 19A2 ; [.3050.0020.0002][.3064.0020.0002] -19A3 ; [.3051.0020.0002] -19B5 19A3 ; [.3051.0020.0002][.305F.0020.0002] -19B6 19A3 ; [.3051.0020.0002][.3060.0020.0002] -19B7 19A3 ; [.3051.0020.0002][.3061.0020.0002] -19BA 19A3 ; [.3051.0020.0002][.3064.0020.0002] -19A4 ; [.3052.0020.0002] -19B5 19A4 ; [.3052.0020.0002][.305F.0020.0002] -19B6 19A4 ; [.3052.0020.0002][.3060.0020.0002] -19B7 19A4 ; [.3052.0020.0002][.3061.0020.0002] -19BA 19A4 ; [.3052.0020.0002][.3064.0020.0002] -19A5 ; [.3053.0020.0002] -19B5 19A5 ; [.3053.0020.0002][.305F.0020.0002] -19B6 19A5 ; [.3053.0020.0002][.3060.0020.0002] -19B7 19A5 ; [.3053.0020.0002][.3061.0020.0002] -19BA 19A5 ; [.3053.0020.0002][.3064.0020.0002] -19A6 ; [.3054.0020.0002] -19B5 19A6 ; [.3054.0020.0002][.305F.0020.0002] -19B6 19A6 ; [.3054.0020.0002][.3060.0020.0002] -19B7 19A6 ; [.3054.0020.0002][.3061.0020.0002] -19BA 19A6 ; [.3054.0020.0002][.3064.0020.0002] -19A7 ; [.3055.0020.0002] -19B5 19A7 ; [.3055.0020.0002][.305F.0020.0002] -19B6 19A7 ; [.3055.0020.0002][.3060.0020.0002] -19B7 19A7 ; [.3055.0020.0002][.3061.0020.0002] -19BA 19A7 ; [.3055.0020.0002][.3064.0020.0002] -19A8 ; [.3056.0020.0002] -19B5 19A8 ; [.3056.0020.0002][.305F.0020.0002] -19B6 19A8 ; [.3056.0020.0002][.3060.0020.0002] -19B7 19A8 ; [.3056.0020.0002][.3061.0020.0002] -19BA 19A8 ; [.3056.0020.0002][.3064.0020.0002] -19A9 ; [.3057.0020.0002] -19B5 19A9 ; [.3057.0020.0002][.305F.0020.0002] -19B6 19A9 ; [.3057.0020.0002][.3060.0020.0002] -19B7 19A9 ; [.3057.0020.0002][.3061.0020.0002] -19BA 19A9 ; [.3057.0020.0002][.3064.0020.0002] -19AA ; [.3058.0020.0002] -19B5 19AA ; [.3058.0020.0002][.305F.0020.0002] -19B6 19AA ; [.3058.0020.0002][.3060.0020.0002] -19B7 19AA ; [.3058.0020.0002][.3061.0020.0002] -19BA 19AA ; [.3058.0020.0002][.3064.0020.0002] -19AB ; [.3059.0020.0002] -19B5 19AB ; [.3059.0020.0002][.305F.0020.0002] -19B6 19AB ; [.3059.0020.0002][.3060.0020.0002] -19B7 19AB ; [.3059.0020.0002][.3061.0020.0002] -19BA 19AB ; [.3059.0020.0002][.3064.0020.0002] -19B0 ; [.305A.0020.0002] -19B1 ; [.305B.0020.0002] -19B2 ; [.305C.0020.0002] -19B3 ; [.305D.0020.0002] -19B4 ; [.305E.0020.0002] -19B5 ; [.305F.0020.0002] -19B6 ; [.3060.0020.0002] -19B7 ; [.3061.0020.0002] -19B8 ; [.3062.0020.0002] -19B9 ; [.3063.0020.0002] -19BA ; [.3064.0020.0002] -19BB ; [.3065.0020.0002] -19BC ; [.3066.0020.0002] -19BD ; [.3067.0020.0002] -19BE ; [.3068.0020.0002] -19BF ; [.3069.0020.0002] -19C0 ; [.306A.0020.0002] -19C1 ; [.306B.0020.0002] -19C2 ; [.306C.0020.0002] -19C3 ; [.306D.0020.0002] -19C4 ; [.306E.0020.0002] -19C5 ; [.306F.0020.0002] -19C6 ; [.3070.0020.0002] -19C7 ; [.3071.0020.0002] -19C8 ; [.3072.0020.0002] -19C9 ; [.3073.0020.0002] -1A20 ; [.3074.0020.0002] -1A21 ; [.3075.0020.0002] -1A22 ; [.3076.0020.0002] -1A23 ; [.3077.0020.0002] -1A24 ; [.3078.0020.0002] -1A25 ; [.3079.0020.0002] -1A26 ; [.307A.0020.0002] -1A58 ; [.307A.0020.0004] -1A59 ; [.307A.0020.0004] -1A27 ; [.307B.0020.0002] -1A28 ; [.307C.0020.0002] -1A29 ; [.307D.0020.0002] -1A2A ; [.307E.0020.0002] -1A2B ; [.307F.0020.0002] -1A2C ; [.3080.0020.0002] -1A2D ; [.3081.0020.0002] -1A2E ; [.3082.0020.0002] -1A2F ; [.3083.0020.0002] -1A30 ; [.3084.0020.0002] -1A31 ; [.3085.0020.0002] -1A32 ; [.3086.0020.0002] -1A33 ; [.3087.0020.0002] -1A34 ; [.3088.0020.0002] -1A35 ; [.3089.0020.0002] -1A36 ; [.308A.0020.0002] -1A37 ; [.308B.0020.0002] -1A38 ; [.308C.0020.0002] -1A39 ; [.308D.0020.0002] -1A3A ; [.308E.0020.0002] -1A3B ; [.308F.0020.0002] -1A5A ; [.308F.0020.0004] -1A5B ; [.308F.0020.0004] -1A3C ; [.3090.0020.0002] -1A3D ; [.3091.0020.0002] -1A3E ; [.3092.0020.0002] -1A3F ; [.3093.0020.0002] -1A40 ; [.3094.0020.0002] -1A41 ; [.3095.0020.0002] -1A42 ; [.3096.0020.0002] -1A43 ; [.3097.0020.0002] -1A44 ; [.3098.0020.0002] -1A45 ; [.3099.0020.0002] -1A46 ; [.309A.0020.0002] -1A54 ; [.309A.0020.0004][.30C0.0020.0004][.309A.0020.0004] -1A47 ; [.309B.0020.0002] -1A48 ; [.309C.0020.0002] -1A49 ; [.309D.0020.0002] -1A4A ; [.309E.0020.0002] -1A4B ; [.309F.0020.0002] -1A4C ; [.30A0.0020.0002] -1A53 ; [.30A1.0020.0002] -1A6B ; [.30A2.0020.0002] -1A55 ; [.30A3.0020.0002] -1A56 ; [.30A4.0020.0002] -1A57 ; [.30A5.0020.0002] -1A5C ; [.30A6.0020.0002] -1A5D ; [.30A7.0020.0002] -1A5E ; [.30A8.0020.0002] -1A4D ; [.30A9.0020.0002] -1A4E ; [.30AA.0020.0002] -1A4F ; [.30AB.0020.0002] -1A50 ; [.30AC.0020.0002] -1A51 ; [.30AD.0020.0002] -1A52 ; [.30AE.0020.0002] -1A61 ; [.30AF.0020.0002] -1A6C ; [.30B0.0020.0002] -1A62 ; [.30B1.0020.0002] -1A63 ; [.30B2.0020.0002] -1A64 ; [.30B2.0020.0004] -1A65 ; [.30B3.0020.0002] -1A66 ; [.30B4.0020.0002] -1A67 ; [.30B5.0020.0002] -1A68 ; [.30B6.0020.0002] -1A69 ; [.30B7.0020.0002] -1A6A ; [.30B8.0020.0002] -1A6E ; [.30B9.0020.0002] -1A6F ; [.30BA.0020.0002] -1A73 ; [.30BB.0020.0002] -1A70 ; [.30BC.0020.0002] -1A71 ; [.30BD.0020.0002] -1A72 ; [.30BE.0020.0002] -1A6D ; [.30BF.0020.0002] -1A60 ; [.30C0.0020.0002] -AA00 ; [.30C1.0020.0002] -AA01 ; [.30C2.0020.0002] -AA02 ; [.30C3.0020.0002] -AA03 ; [.30C4.0020.0002] -AA04 ; [.30C5.0020.0002] -AA05 ; [.30C6.0020.0002] -AA06 ; [.30C7.0020.0002] -AA07 ; [.30C8.0020.0002] -AA08 ; [.30C9.0020.0002] -AA09 ; [.30CA.0020.0002] -AA0A ; [.30CB.0020.0002] -AA0B ; [.30CC.0020.0002] -AA0C ; [.30CD.0020.0002] -AA0D ; [.30CE.0020.0002] -AA0E ; [.30CF.0020.0002] -AA0F ; [.30D0.0020.0002] -AA10 ; [.30D1.0020.0002] -AA11 ; [.30D2.0020.0002] -AA12 ; [.30D3.0020.0002] -AA13 ; [.30D4.0020.0002] -AA14 ; [.30D5.0020.0002] -AA15 ; [.30D6.0020.0002] -AA16 ; [.30D7.0020.0002] -AA17 ; [.30D8.0020.0002] -AA18 ; [.30D9.0020.0002] -AA19 ; [.30DA.0020.0002] -AA1A ; [.30DB.0020.0002] -AA1B ; [.30DC.0020.0002] -AA1C ; [.30DD.0020.0002] -AA1D ; [.30DE.0020.0002] -AA1E ; [.30DF.0020.0002] -AA1F ; [.30E0.0020.0002] -AA20 ; [.30E1.0020.0002] -AA21 ; [.30E2.0020.0002] -AA22 ; [.30E3.0020.0002] -AA23 ; [.30E4.0020.0002] -AA24 ; [.30E5.0020.0002] -AA25 ; [.30E6.0020.0002] -AA26 ; [.30E7.0020.0002] -AA27 ; [.30E8.0020.0002] -AA28 ; [.30E9.0020.0002] -AA33 ; [.30EA.0020.0002] -AA34 ; [.30EB.0020.0002] -AA35 ; [.30EC.0020.0002] -AA36 ; [.30ED.0020.0002] -AA29 ; [.30EE.0020.0002] -AA2A ; [.30EF.0020.0002] -AA2B ; [.30F0.0020.0002] -AA2C ; [.30F1.0020.0002] -AA2D ; [.30F2.0020.0002] -AA2E ; [.30F3.0020.0002] -AA2F ; [.30F4.0020.0002] -AA30 ; [.30F5.0020.0002] -AA31 ; [.30F6.0020.0002] -AA32 ; [.30F7.0020.0002] -AA40 ; [.30F8.0020.0002] -AA41 ; [.30F9.0020.0002] -AA42 ; [.30FA.0020.0002] -AA43 ; [.30FB.0020.0002] -AA44 ; [.30FC.0020.0002] -AA45 ; [.30FD.0020.0002] -AA46 ; [.30FE.0020.0002] -AA47 ; [.30FF.0020.0002] -AA48 ; [.3100.0020.0002] -AA49 ; [.3101.0020.0002] -AA4A ; [.3102.0020.0002] -AA4B ; [.3103.0020.0002] -AA4C ; [.3104.0020.0002] -AA4D ; [.3105.0020.0002] -1B05 ; [.3106.0020.0002] -1B06 ; [.3107.0020.0002] -1B05 1B35 ; [.3107.0020.0002] -1B07 ; [.3108.0020.0002] -1B08 ; [.3109.0020.0002] -1B07 1B35 ; [.3109.0020.0002] -1B09 ; [.310A.0020.0002] -1B0A ; [.310B.0020.0002] -1B09 1B35 ; [.310B.0020.0002] -1B0B ; [.310C.0020.0002] -1B0C ; [.310D.0020.0002] -1B0B 1B35 ; [.310D.0020.0002] -1B0D ; [.310E.0020.0002] -1B0E ; [.310F.0020.0002] -1B0D 1B35 ; [.310F.0020.0002] -1B0F ; [.3110.0020.0002] -1B10 ; [.3111.0020.0002] -1B11 ; [.3112.0020.0002] -1B12 ; [.3113.0020.0002] -1B11 1B35 ; [.3113.0020.0002] -1B13 ; [.3114.0020.0002] -1B45 ; [.3115.0020.0002] -1B46 ; [.3116.0020.0002] -1B14 ; [.3117.0020.0002] -1B15 ; [.3118.0020.0002] -1B16 ; [.3119.0020.0002] -1B17 ; [.311A.0020.0002] -1B18 ; [.311B.0020.0002] -1B19 ; [.311C.0020.0002] -1B1A ; [.311D.0020.0002] -1B1B ; [.311E.0020.0002] -1B1C ; [.311F.0020.0002] -1B1D ; [.3120.0020.0002] -1B1E ; [.3121.0020.0002] -1B1F ; [.3122.0020.0002] -1B20 ; [.3123.0020.0002] -1B21 ; [.3124.0020.0002] -1B22 ; [.3125.0020.0002] -1B47 ; [.3126.0020.0002] -1B23 ; [.3127.0020.0002] -1B24 ; [.3128.0020.0002] -1B25 ; [.3129.0020.0002] -1B26 ; [.312A.0020.0002] -1B27 ; [.312B.0020.0002] -1B48 ; [.312C.0020.0002] -1B28 ; [.312D.0020.0002] -1B29 ; [.312E.0020.0002] -1B2A ; [.312F.0020.0002] -1B2B ; [.3130.0020.0002] -1B2C ; [.3131.0020.0002] -1B2D ; [.3132.0020.0002] -1B2E ; [.3133.0020.0002] -1B2F ; [.3134.0020.0002] -1B49 ; [.3135.0020.0002] -1B30 ; [.3136.0020.0002] -1B31 ; [.3137.0020.0002] -1B32 ; [.3138.0020.0002] -1B4A ; [.3139.0020.0002] -1B4B ; [.313A.0020.0002] -1B33 ; [.313B.0020.0002] -1B35 ; [.313C.0020.0002] -1B36 ; [.313D.0020.0002] -1B37 ; [.313E.0020.0002] -1B38 ; [.313F.0020.0002] -1B39 ; [.3140.0020.0002] -1B3A ; [.3141.0020.0002] -1B3B ; [.3142.0020.0002] -1B3A 1B35 ; [.3142.0020.0002] -1B3C ; [.3143.0020.0002] -1B3D ; [.3144.0020.0002] -1B3C 1B35 ; [.3144.0020.0002] -1B3E ; [.3145.0020.0002] -1B3F ; [.3146.0020.0002] -1B40 ; [.3147.0020.0002] -1B3E 1B35 ; [.3147.0020.0002] -1B41 ; [.3148.0020.0002] -1B3F 1B35 ; [.3148.0020.0002] -1B42 ; [.3149.0020.0002] -1B43 ; [.314A.0020.0002] -1B42 1B35 ; [.314A.0020.0002] -1B44 ; [.314B.0020.0002] -A984 ; [.314C.0020.0002] -A985 ; [.314D.0020.0002] -A986 ; [.314E.0020.0002] -A987 ; [.314F.0020.0002] -A988 ; [.3150.0020.0002] -A989 ; [.3151.0020.0002] -A98A ; [.3152.0020.0002] -A98B ; [.3153.0020.0002] -A98C ; [.3154.0020.0002] -A98D ; [.3155.0020.0002] -A98E ; [.3156.0020.0002] -A98F ; [.3157.0020.0002] -A990 ; [.3158.0020.0002] -A991 ; [.3159.0020.0002] -A992 ; [.315A.0020.0002] -A993 ; [.315B.0020.0002] -A994 ; [.315C.0020.0002] -A995 ; [.315D.0020.0002] -A996 ; [.315E.0020.0002] -A997 ; [.315F.0020.0002] -A998 ; [.3160.0020.0002] -A999 ; [.3161.0020.0002] -A99A ; [.3162.0020.0002] -A99B ; [.3163.0020.0002] -A99C ; [.3164.0020.0002] -A99D ; [.3165.0020.0002] -A99E ; [.3166.0020.0002] -A99F ; [.3167.0020.0002] -A9A0 ; [.3168.0020.0002] -A9A1 ; [.3169.0020.0002] -A9A2 ; [.316A.0020.0002] -A9A3 ; [.316B.0020.0002] -A9A4 ; [.316C.0020.0002] -A9A5 ; [.316D.0020.0002] -A9A6 ; [.316E.0020.0002] -A9A7 ; [.316F.0020.0002] -A9A8 ; [.3170.0020.0002] -A9A9 ; [.3171.0020.0002] -A9AA ; [.3172.0020.0002] -A9BE ; [.3173.0020.0002] -A9AB ; [.3174.0020.0002] -A9AC ; [.3174.0020.0004] -A9BF ; [.3175.0020.0002] -A9AD ; [.3176.0020.0002] -A9AE ; [.3177.0020.0002] -A9AF ; [.3178.0020.0002] -A9B0 ; [.3179.0020.0002] -A9B1 ; [.317A.0020.0002] -A9B2 ; [.317B.0020.0002] -A9B4 ; [.317C.0020.0002] -A9BC ; [.317D.0020.0002] -A9B6 ; [.317E.0020.0002] -A9B7 ; [.317F.0020.0002] -A9B8 ; [.3180.0020.0002] -A9B9 ; [.3181.0020.0002] -A9BD ; [.3182.0020.0002] -A9BA ; [.3183.0020.0002] -A9BB ; [.3184.0020.0002] -A9B5 ; [.3185.0020.0002] -A9C0 ; [.3186.0020.0002] -1880 ; [.3187.0020.0002] -1881 ; [.3188.0020.0002] -1882 ; [.3189.0020.0002] -1883 ; [.318A.0020.0002] -1884 ; [.318B.0020.0002] -1885 ; [.318C.0020.0002] -1886 ; [.318D.0020.0002] -1843 ; [.318E.0020.0002] -1820 ; [.318F.0020.0002] -1887 ; [.3190.0020.0002] -1821 ; [.3191.0020.0002] -1844 ; [.3192.0020.0002] -185D ; [.3193.0020.0002] -1822 ; [.3194.0020.0002] -1845 ; [.3195.0020.0002] -185E ; [.3196.0020.0002] -1873 ; [.3197.0020.0002] -1888 ; [.3198.0020.0002] -185F ; [.3199.0020.0002] -1823 ; [.319A.0020.0002] -1846 ; [.319B.0020.0002] -1824 ; [.319C.0020.0002] -1847 ; [.319D.0020.0002] -1861 ; [.319E.0020.0002] -1825 ; [.319F.0020.0002] -1848 ; [.31A0.0020.0002] -1826 ; [.31A1.0020.0002] -1849 ; [.31A2.0020.0002] -1860 ; [.31A3.0020.0002] -1827 ; [.31A4.0020.0002] -1828 ; [.31A5.0020.0002] -1829 ; [.31A6.0020.0002] -184A ; [.31A7.0020.0002] -1862 ; [.31A8.0020.0002] -188A ; [.31A9.0020.0002] -189B ; [.31AA.0020.0002] -182A ; [.31AB.0020.0002] -184B ; [.31AC.0020.0002] -182B ; [.31AD.0020.0002] -184C ; [.31AE.0020.0002] -1866 ; [.31AF.0020.0002] -182C ; [.31B0.0020.0002] -184D ; [.31B1.0020.0002] -182D ; [.31B2.0020.0002] -184E ; [.31B3.0020.0002] -1864 ; [.31B4.0020.0002] -189A ; [.31B5.0020.0002] -1865 ; [.31B6.0020.0002] -182E ; [.31B7.0020.0002] -184F ; [.31B8.0020.0002] -182F ; [.31B9.0020.0002] -1830 ; [.31BA.0020.0002] -1831 ; [.31BB.0020.0002] -1867 ; [.31BC.0020.0002] -189C ; [.31BD.0020.0002] -189D ; [.31BE.0020.0002] -18A2 ; [.31BF.0020.0002] -18A4 ; [.31C0.0020.0002] -18A5 ; [.31C1.0020.0002] -1832 ; [.31C2.0020.0002] -1850 ; [.31C3.0020.0002] -1868 ; [.31C4.0020.0002] -1833 ; [.31C5.0020.0002] -1851 ; [.31C6.0020.0002] -1869 ; [.31C7.0020.0002] -1834 ; [.31C8.0020.0002] -1852 ; [.31C9.0020.0002] -1871 ; [.31CA.0020.0002] -185C ; [.31CB.0020.0002] -188B ; [.31CC.0020.0002] -1835 ; [.31CD.0020.0002] -1853 ; [.31CE.0020.0002] -186A ; [.31CF.0020.0002] -1877 ; [.31D0.0020.0002] -1836 ; [.31D1.0020.0002] -1855 ; [.31D2.0020.0002] -1872 ; [.31D3.0020.0002] -1837 ; [.31D4.0020.0002] -1875 ; [.31D5.0020.0002] -1838 ; [.31D6.0020.0002] -1856 ; [.31D7.0020.0002] -1839 ; [.31D8.0020.0002] -186B ; [.31D9.0020.0002] -1876 ; [.31DA.0020.0002] -183A ; [.31DB.0020.0002] -1857 ; [.31DC.0020.0002] -1863 ; [.31DD.0020.0002] -1874 ; [.31DE.0020.0002] -1889 ; [.31DF.0020.0002] -183B ; [.31E0.0020.0002] -183C ; [.31E1.0020.0002] -1854 ; [.31E2.0020.0002] -186E ; [.31E3.0020.0002] -183D ; [.31E4.0020.0002] -186F ; [.31E5.0020.0002] -1858 ; [.31E6.0020.0002] -186C ; [.31E7.0020.0002] -183E ; [.31E8.0020.0002] -1859 ; [.31E9.0020.0002] -186D ; [.31EA.0020.0002] -183F ; [.31EB.0020.0002] -1840 ; [.31EC.0020.0002] -1841 ; [.31ED.0020.0002] -1842 ; [.31EE.0020.0002] -185A ; [.31EF.0020.0002] -185B ; [.31F0.0020.0002] -1870 ; [.31F1.0020.0002] -188C ; [.31F2.0020.0002] -189E ; [.31F3.0020.0002] -188D ; [.31F4.0020.0002] -188E ; [.31F5.0020.0002] -189F ; [.31F6.0020.0002] -188F ; [.31F7.0020.0002] -1890 ; [.31F8.0020.0002] -1898 ; [.31F9.0020.0002] -18A0 ; [.31FA.0020.0002] -1891 ; [.31FB.0020.0002] -18A1 ; [.31FC.0020.0002] -1892 ; [.31FD.0020.0002] -1893 ; [.31FE.0020.0002] -18A8 ; [.31FF.0020.0002] -1894 ; [.3200.0020.0002] -18A3 ; [.3201.0020.0002] -1895 ; [.3202.0020.0002] -1899 ; [.3203.0020.0002] -1896 ; [.3204.0020.0002] -1897 ; [.3205.0020.0002] -18A6 ; [.3206.0020.0002] -18A7 ; [.3207.0020.0002] -18AA ; [.3208.0020.0002] -18A9 ; [.3209.0020.0002] -1C5A ; [.320A.0020.0002] -1C5B ; [.320B.0020.0002] -1C5C ; [.320C.0020.0002] -1C5D ; [.320D.0020.0002] -1C5E ; [.320E.0020.0002] -1C5F ; [.320F.0020.0002] -1C60 ; [.3210.0020.0002] -1C61 ; [.3211.0020.0002] -1C62 ; [.3212.0020.0002] -1C63 ; [.3213.0020.0002] -1C64 ; [.3214.0020.0002] -1C65 ; [.3215.0020.0002] -1C66 ; [.3216.0020.0002] -1C67 ; [.3217.0020.0002] -1C68 ; [.3218.0020.0002] -1C69 ; [.3219.0020.0002] -1C6A ; [.321A.0020.0002] -1C6B ; [.321B.0020.0002] -1C6C ; [.321C.0020.0002] -1C6D ; [.321D.0020.0002] -1C6E ; [.321E.0020.0002] -1C6F ; [.321F.0020.0002] -1C70 ; [.3220.0020.0002] -1C71 ; [.3221.0020.0002] -1C72 ; [.3222.0020.0002] -1C73 ; [.3223.0020.0002] -1C74 ; [.3224.0020.0002] -1C75 ; [.3225.0020.0002] -1C76 ; [.3226.0020.0002] -1C77 ; [.3227.0020.0002] -1C78 ; [.3228.0020.0002] -1C79 ; [.3229.0020.0002] -1C7A ; [.322A.0020.0002] -1C7B ; [.322B.0020.0002] -1C7C ; [.322C.0020.0002] -1C7D ; [.322D.0020.0002] -AB70 ; [.322E.0020.0002] -13A0 ; [.322E.0020.0008] -AB71 ; [.322F.0020.0002] -13A1 ; [.322F.0020.0008] -AB72 ; [.3230.0020.0002] -13A2 ; [.3230.0020.0008] -AB73 ; [.3231.0020.0002] -13A3 ; [.3231.0020.0008] -AB74 ; [.3232.0020.0002] -13A4 ; [.3232.0020.0008] -AB75 ; [.3233.0020.0002] -13A5 ; [.3233.0020.0008] -AB76 ; [.3234.0020.0002] -13A6 ; [.3234.0020.0008] -AB77 ; [.3235.0020.0002] -13A7 ; [.3235.0020.0008] -AB78 ; [.3236.0020.0002] -13A8 ; [.3236.0020.0008] -AB79 ; [.3237.0020.0002] -13A9 ; [.3237.0020.0008] -AB7A ; [.3238.0020.0002] -13AA ; [.3238.0020.0008] -AB7B ; [.3239.0020.0002] -13AB ; [.3239.0020.0008] -AB7C ; [.323A.0020.0002] -13AC ; [.323A.0020.0008] -AB7D ; [.323B.0020.0002] -13AD ; [.323B.0020.0008] -AB7E ; [.323C.0020.0002] -13AE ; [.323C.0020.0008] -AB7F ; [.323D.0020.0002] -13AF ; [.323D.0020.0008] -AB80 ; [.323E.0020.0002] -13B0 ; [.323E.0020.0008] -AB81 ; [.323F.0020.0002] -13B1 ; [.323F.0020.0008] -AB82 ; [.3240.0020.0002] -13B2 ; [.3240.0020.0008] -AB83 ; [.3241.0020.0002] -13B3 ; [.3241.0020.0008] -AB84 ; [.3242.0020.0002] -13B4 ; [.3242.0020.0008] -AB85 ; [.3243.0020.0002] -13B5 ; [.3243.0020.0008] -AB86 ; [.3244.0020.0002] -13B6 ; [.3244.0020.0008] -AB87 ; [.3245.0020.0002] -13B7 ; [.3245.0020.0008] -AB88 ; [.3246.0020.0002] -13B8 ; [.3246.0020.0008] -AB89 ; [.3247.0020.0002] -13B9 ; [.3247.0020.0008] -AB8A ; [.3248.0020.0002] -13BA ; [.3248.0020.0008] -AB8B ; [.3249.0020.0002] -13BB ; [.3249.0020.0008] -AB8C ; [.324A.0020.0002] -13BC ; [.324A.0020.0008] -AB8D ; [.324B.0020.0002] -13BD ; [.324B.0020.0008] -AB8E ; [.324C.0020.0002] -13BE ; [.324C.0020.0008] -AB8F ; [.324D.0020.0002] -13BF ; [.324D.0020.0008] -AB90 ; [.324E.0020.0002] -13C0 ; [.324E.0020.0008] -AB91 ; [.324F.0020.0002] -13C1 ; [.324F.0020.0008] -AB92 ; [.3250.0020.0002] -13C2 ; [.3250.0020.0008] -AB93 ; [.3251.0020.0002] -13C3 ; [.3251.0020.0008] -AB94 ; [.3252.0020.0002] -13C4 ; [.3252.0020.0008] -AB95 ; [.3253.0020.0002] -13C5 ; [.3253.0020.0008] -AB96 ; [.3254.0020.0002] -13C6 ; [.3254.0020.0008] -AB97 ; [.3255.0020.0002] -13C7 ; [.3255.0020.0008] -AB98 ; [.3256.0020.0002] -13C8 ; [.3256.0020.0008] -AB99 ; [.3257.0020.0002] -13C9 ; [.3257.0020.0008] -AB9A ; [.3258.0020.0002] -13CA ; [.3258.0020.0008] -AB9B ; [.3259.0020.0002] -13CB ; [.3259.0020.0008] -AB9C ; [.325A.0020.0002] -13CC ; [.325A.0020.0008] -AB9D ; [.325B.0020.0002] -13CD ; [.325B.0020.0008] -AB9E ; [.325C.0020.0002] -13CE ; [.325C.0020.0008] -AB9F ; [.325D.0020.0002] -13CF ; [.325D.0020.0008] -ABA0 ; [.325E.0020.0002] -13D0 ; [.325E.0020.0008] -ABA1 ; [.325F.0020.0002] -13D1 ; [.325F.0020.0008] -ABA2 ; [.3260.0020.0002] -13D2 ; [.3260.0020.0008] -ABA3 ; [.3261.0020.0002] -13D3 ; [.3261.0020.0008] -ABA4 ; [.3262.0020.0002] -13D4 ; [.3262.0020.0008] -ABA5 ; [.3263.0020.0002] -13D5 ; [.3263.0020.0008] -ABA6 ; [.3264.0020.0002] -13D6 ; [.3264.0020.0008] -ABA7 ; [.3265.0020.0002] -13D7 ; [.3265.0020.0008] -ABA8 ; [.3266.0020.0002] -13D8 ; [.3266.0020.0008] -ABA9 ; [.3267.0020.0002] -13D9 ; [.3267.0020.0008] -ABAA ; [.3268.0020.0002] -13DA ; [.3268.0020.0008] -ABAB ; [.3269.0020.0002] -13DB ; [.3269.0020.0008] -ABAC ; [.326A.0020.0002] -13DC ; [.326A.0020.0008] -ABAD ; [.326B.0020.0002] -13DD ; [.326B.0020.0008] -ABAE ; [.326C.0020.0002] -13DE ; [.326C.0020.0008] -ABAF ; [.326D.0020.0002] -13DF ; [.326D.0020.0008] -ABB0 ; [.326E.0020.0002] -13E0 ; [.326E.0020.0008] -ABB1 ; [.326F.0020.0002] -13E1 ; [.326F.0020.0008] -ABB2 ; [.3270.0020.0002] -13E2 ; [.3270.0020.0008] -ABB3 ; [.3271.0020.0002] -13E3 ; [.3271.0020.0008] -ABB4 ; [.3272.0020.0002] -13E4 ; [.3272.0020.0008] -ABB5 ; [.3273.0020.0002] -13E5 ; [.3273.0020.0008] -ABB6 ; [.3274.0020.0002] -13E6 ; [.3274.0020.0008] -ABB7 ; [.3275.0020.0002] -13E7 ; [.3275.0020.0008] -ABB8 ; [.3276.0020.0002] -13E8 ; [.3276.0020.0008] -ABB9 ; [.3277.0020.0002] -13E9 ; [.3277.0020.0008] -ABBA ; [.3278.0020.0002] -13EA ; [.3278.0020.0008] -ABBB ; [.3279.0020.0002] -13EB ; [.3279.0020.0008] -ABBC ; [.327A.0020.0002] -13EC ; [.327A.0020.0008] -ABBD ; [.327B.0020.0002] -13ED ; [.327B.0020.0008] -ABBE ; [.327C.0020.0002] -13EE ; [.327C.0020.0008] -ABBF ; [.327D.0020.0002] -13EF ; [.327D.0020.0008] -13F8 ; [.327E.0020.0002] -13F0 ; [.327E.0020.0008] -13F9 ; [.327F.0020.0002] -13F1 ; [.327F.0020.0008] -13FA ; [.3280.0020.0002] -13F2 ; [.3280.0020.0008] -13FB ; [.3281.0020.0002] -13F3 ; [.3281.0020.0008] -13FC ; [.3282.0020.0002] -13F4 ; [.3282.0020.0008] -13FD ; [.3283.0020.0002] -13F5 ; [.3283.0020.0008] -1401 ; [.3284.0020.0002] -1402 ; [.3285.0020.0002] -1403 ; [.3286.0020.0002] -1404 ; [.3287.0020.0002] -1405 ; [.3288.0020.0002] -1406 ; [.3289.0020.0002] -1407 ; [.328A.0020.0002] -1408 ; [.328B.0020.0002] -1409 ; [.328C.0020.0002] -140A ; [.328D.0020.0002] -140B ; [.328E.0020.0002] -140C ; [.328F.0020.0002] -140D ; [.3290.0020.0002] -140E ; [.3291.0020.0002] -140F ; [.3292.0020.0002] -1410 ; [.3293.0020.0002] -1411 ; [.3294.0020.0002] -1412 ; [.3295.0020.0002] -1413 ; [.3296.0020.0002] -1414 ; [.3297.0020.0002] -1415 ; [.3298.0020.0002] -1416 ; [.3299.0020.0002] -1417 ; [.329A.0020.0002] -1418 ; [.329B.0020.0002] -1419 ; [.329C.0020.0002] -141A ; [.329D.0020.0002] -141B ; [.329E.0020.0002] -141C ; [.329F.0020.0002] -141D ; [.32A0.0020.0002] -141E ; [.32A1.0020.0002] -141F ; [.32A2.0020.0002] -1420 ; [.32A3.0020.0002] -1421 ; [.32A4.0020.0002] -1422 ; [.32A5.0020.0002] -1423 ; [.32A6.0020.0002] -1424 ; [.32A7.0020.0002] -1425 ; [.32A8.0020.0002] -1426 ; [.32A9.0020.0002] -1427 ; [.32AA.0020.0002] -1428 ; [.32AB.0020.0002] -1429 ; [.32AC.0020.0002] -142A ; [.32AD.0020.0002] -142B ; [.32AE.0020.0002] -142C ; [.32AF.0020.0002] -142D ; [.32B0.0020.0002] -142E ; [.32B1.0020.0002] -142F ; [.32B2.0020.0002] -1430 ; [.32B3.0020.0002] -1431 ; [.32B4.0020.0002] -1432 ; [.32B5.0020.0002] -1433 ; [.32B6.0020.0002] -1434 ; [.32B7.0020.0002] -1435 ; [.32B8.0020.0002] -1436 ; [.32B9.0020.0002] -1437 ; [.32BA.0020.0002] -1438 ; [.32BB.0020.0002] -1439 ; [.32BC.0020.0002] -143A ; [.32BD.0020.0002] -143B ; [.32BE.0020.0002] -143C ; [.32BF.0020.0002] -143D ; [.32C0.0020.0002] -143E ; [.32C1.0020.0002] -143F ; [.32C2.0020.0002] -1440 ; [.32C3.0020.0002] -1441 ; [.32C4.0020.0002] -1442 ; [.32C5.0020.0002] -1443 ; [.32C6.0020.0002] -1444 ; [.32C7.0020.0002] -1445 ; [.32C8.0020.0002] -1446 ; [.32C9.0020.0002] -1447 ; [.32CA.0020.0002] -1448 ; [.32CB.0020.0002] -1449 ; [.32CC.0020.0002] -144A ; [.32CD.0020.0002] -144B ; [.32CE.0020.0002] -144C ; [.32CF.0020.0002] -144D ; [.32D0.0020.0002] -144E ; [.32D1.0020.0002] -144F ; [.32D2.0020.0002] -1450 ; [.32D3.0020.0002] -1451 ; [.32D4.0020.0002] -1452 ; [.32D5.0020.0002] -1453 ; [.32D6.0020.0002] -1454 ; [.32D7.0020.0002] -1455 ; [.32D8.0020.0002] -1456 ; [.32D9.0020.0002] -1457 ; [.32DA.0020.0002] -1458 ; [.32DB.0020.0002] -1459 ; [.32DC.0020.0002] -145A ; [.32DD.0020.0002] -145B ; [.32DE.0020.0002] -145C ; [.32DF.0020.0002] -145D ; [.32E0.0020.0002] -145E ; [.32E1.0020.0002] -145F ; [.32E2.0020.0002] -1460 ; [.32E3.0020.0002] -1461 ; [.32E4.0020.0002] -1462 ; [.32E5.0020.0002] -1463 ; [.32E6.0020.0002] -1464 ; [.32E7.0020.0002] -1465 ; [.32E8.0020.0002] -1466 ; [.32E9.0020.0002] -1467 ; [.32EA.0020.0002] -1468 ; [.32EB.0020.0002] -1469 ; [.32EC.0020.0002] -146A ; [.32ED.0020.0002] -146B ; [.32EE.0020.0002] -146C ; [.32EF.0020.0002] -146D ; [.32F0.0020.0002] -146E ; [.32F1.0020.0002] -146F ; [.32F2.0020.0002] -1470 ; [.32F3.0020.0002] -1471 ; [.32F4.0020.0002] -1472 ; [.32F5.0020.0002] -1473 ; [.32F6.0020.0002] -1474 ; [.32F7.0020.0002] -1475 ; [.32F8.0020.0002] -1476 ; [.32F9.0020.0002] -1477 ; [.32FA.0020.0002] -1478 ; [.32FB.0020.0002] -1479 ; [.32FC.0020.0002] -147A ; [.32FD.0020.0002] -147B ; [.32FE.0020.0002] -147C ; [.32FF.0020.0002] -147D ; [.3300.0020.0002] -147E ; [.3301.0020.0002] -147F ; [.3302.0020.0002] -1480 ; [.3303.0020.0002] -1481 ; [.3304.0020.0002] -1482 ; [.3305.0020.0002] -1483 ; [.3306.0020.0002] -1484 ; [.3307.0020.0002] -1485 ; [.3308.0020.0002] -1486 ; [.3309.0020.0002] -1487 ; [.330A.0020.0002] -1488 ; [.330B.0020.0002] -1489 ; [.330C.0020.0002] -148A ; [.330D.0020.0002] -148B ; [.330E.0020.0002] -148C ; [.330F.0020.0002] -148D ; [.3310.0020.0002] -148E ; [.3311.0020.0002] -148F ; [.3312.0020.0002] -1490 ; [.3313.0020.0002] -1491 ; [.3314.0020.0002] -1492 ; [.3315.0020.0002] -1493 ; [.3316.0020.0002] -1494 ; [.3317.0020.0002] -1495 ; [.3318.0020.0002] -1496 ; [.3319.0020.0002] -1497 ; [.331A.0020.0002] -1498 ; [.331B.0020.0002] -1499 ; [.331C.0020.0002] -149A ; [.331D.0020.0002] -149B ; [.331E.0020.0002] -149C ; [.331F.0020.0002] -149D ; [.3320.0020.0002] -149E ; [.3321.0020.0002] -149F ; [.3322.0020.0002] -14A0 ; [.3323.0020.0002] -14A1 ; [.3324.0020.0002] -14A2 ; [.3325.0020.0002] -14A3 ; [.3326.0020.0002] -14A4 ; [.3327.0020.0002] -14A5 ; [.3328.0020.0002] -14A6 ; [.3329.0020.0002] -14A7 ; [.332A.0020.0002] -14A8 ; [.332B.0020.0002] -14A9 ; [.332C.0020.0002] -14AA ; [.332D.0020.0002] -14AB ; [.332E.0020.0002] -14AC ; [.332F.0020.0002] -14AD ; [.3330.0020.0002] -14AE ; [.3331.0020.0002] -14AF ; [.3332.0020.0002] -14B0 ; [.3333.0020.0002] -14B1 ; [.3334.0020.0002] -14B2 ; [.3335.0020.0002] -14B3 ; [.3336.0020.0002] -14B4 ; [.3337.0020.0002] -14B5 ; [.3338.0020.0002] -14B6 ; [.3339.0020.0002] -14B7 ; [.333A.0020.0002] -14B8 ; [.333B.0020.0002] -14B9 ; [.333C.0020.0002] -14BA ; [.333D.0020.0002] -14BB ; [.333E.0020.0002] -14BC ; [.333F.0020.0002] -14BD ; [.3340.0020.0002] -14BE ; [.3341.0020.0002] -14BF ; [.3342.0020.0002] -14C0 ; [.3343.0020.0002] -14C1 ; [.3344.0020.0002] -14C2 ; [.3345.0020.0002] -14C3 ; [.3346.0020.0002] -14C4 ; [.3347.0020.0002] -14C5 ; [.3348.0020.0002] -14C6 ; [.3349.0020.0002] -14C7 ; [.334A.0020.0002] -14C8 ; [.334B.0020.0002] -14C9 ; [.334C.0020.0002] -14CA ; [.334D.0020.0002] -14CB ; [.334E.0020.0002] -14CC ; [.334F.0020.0002] -14CD ; [.3350.0020.0002] -14CE ; [.3351.0020.0002] -14CF ; [.3352.0020.0002] -14D0 ; [.3353.0020.0002] -14D1 ; [.3354.0020.0002] -14D2 ; [.3355.0020.0002] -14D3 ; [.3356.0020.0002] -14D4 ; [.3357.0020.0002] -14D5 ; [.3358.0020.0002] -14D6 ; [.3359.0020.0002] -14D7 ; [.335A.0020.0002] -14D8 ; [.335B.0020.0002] -14D9 ; [.335C.0020.0002] -14DA ; [.335D.0020.0002] -14DB ; [.335E.0020.0002] -14DC ; [.335F.0020.0002] -14DD ; [.3360.0020.0002] -14DE ; [.3361.0020.0002] -14DF ; [.3362.0020.0002] -14E0 ; [.3363.0020.0002] -14E1 ; [.3364.0020.0002] -14E2 ; [.3365.0020.0002] -14E3 ; [.3366.0020.0002] -14E4 ; [.3367.0020.0002] -14E5 ; [.3368.0020.0002] -14E6 ; [.3369.0020.0002] -14E7 ; [.336A.0020.0002] -14E8 ; [.336B.0020.0002] -14E9 ; [.336C.0020.0002] -14EA ; [.336D.0020.0002] -14EB ; [.336E.0020.0002] -14EC ; [.336F.0020.0002] -14ED ; [.3370.0020.0002] -14EE ; [.3371.0020.0002] -14EF ; [.3372.0020.0002] -14F0 ; [.3373.0020.0002] -14F1 ; [.3374.0020.0002] -14F2 ; [.3375.0020.0002] -14F3 ; [.3376.0020.0002] -14F4 ; [.3377.0020.0002] -14F5 ; [.3378.0020.0002] -14F6 ; [.3379.0020.0002] -14F7 ; [.337A.0020.0002] -14F8 ; [.337B.0020.0002] -14F9 ; [.337C.0020.0002] -14FA ; [.337D.0020.0002] -14FB ; [.337E.0020.0002] -14FC ; [.337F.0020.0002] -14FD ; [.3380.0020.0002] -14FE ; [.3381.0020.0002] -14FF ; [.3382.0020.0002] -1500 ; [.3383.0020.0002] -1501 ; [.3384.0020.0002] -1502 ; [.3385.0020.0002] -1503 ; [.3386.0020.0002] -1504 ; [.3387.0020.0002] -1505 ; [.3388.0020.0002] -1506 ; [.3389.0020.0002] -1507 ; [.338A.0020.0002] -1508 ; [.338B.0020.0002] -1509 ; [.338C.0020.0002] -150A ; [.338D.0020.0002] -150B ; [.338E.0020.0002] -150C ; [.338F.0020.0002] -150D ; [.3390.0020.0002] -150E ; [.3391.0020.0002] -150F ; [.3392.0020.0002] -1510 ; [.3393.0020.0002] -1511 ; [.3394.0020.0002] -1512 ; [.3395.0020.0002] -1513 ; [.3396.0020.0002] -1514 ; [.3397.0020.0002] -1515 ; [.3398.0020.0002] -1516 ; [.3399.0020.0002] -1517 ; [.339A.0020.0002] -1518 ; [.339B.0020.0002] -1519 ; [.339C.0020.0002] -151A ; [.339D.0020.0002] -151B ; [.339E.0020.0002] -151C ; [.339F.0020.0002] -151D ; [.33A0.0020.0002] -151E ; [.33A1.0020.0002] -151F ; [.33A2.0020.0002] -1520 ; [.33A3.0020.0002] -1521 ; [.33A4.0020.0002] -1522 ; [.33A5.0020.0002] -1523 ; [.33A6.0020.0002] -1524 ; [.33A7.0020.0002] -1525 ; [.33A8.0020.0002] -1526 ; [.33A9.0020.0002] -1527 ; [.33AA.0020.0002] -1528 ; [.33AB.0020.0002] -1529 ; [.33AC.0020.0002] -152A ; [.33AD.0020.0002] -152B ; [.33AE.0020.0002] -152C ; [.33AF.0020.0002] -152D ; [.33B0.0020.0002] -152E ; [.33B1.0020.0002] -152F ; [.33B2.0020.0002] -1530 ; [.33B3.0020.0002] -1531 ; [.33B4.0020.0002] -1532 ; [.33B5.0020.0002] -1533 ; [.33B6.0020.0002] -1534 ; [.33B7.0020.0002] -1535 ; [.33B8.0020.0002] -1536 ; [.33B9.0020.0002] -1537 ; [.33BA.0020.0002] -1538 ; [.33BB.0020.0002] -1539 ; [.33BC.0020.0002] -153A ; [.33BD.0020.0002] -153B ; [.33BE.0020.0002] -153C ; [.33BF.0020.0002] -153D ; [.33C0.0020.0002] -153E ; [.33C1.0020.0002] -153F ; [.33C2.0020.0002] -1540 ; [.33C3.0020.0002] -1541 ; [.33C4.0020.0002] -1542 ; [.33C5.0020.0002] -1543 ; [.33C6.0020.0002] -1544 ; [.33C7.0020.0002] -1545 ; [.33C8.0020.0002] -1546 ; [.33C9.0020.0002] -1547 ; [.33CA.0020.0002] -1548 ; [.33CB.0020.0002] -1549 ; [.33CC.0020.0002] -154A ; [.33CD.0020.0002] -154B ; [.33CE.0020.0002] -154C ; [.33CF.0020.0002] -154D ; [.33D0.0020.0002] -154E ; [.33D1.0020.0002] -154F ; [.33D2.0020.0002] -1550 ; [.33D3.0020.0002] -1551 ; [.33D4.0020.0002] -1552 ; [.33D5.0020.0002] -1553 ; [.33D6.0020.0002] -1554 ; [.33D7.0020.0002] -1555 ; [.33D8.0020.0002] -1556 ; [.33D9.0020.0002] -1557 ; [.33DA.0020.0002] -1558 ; [.33DB.0020.0002] -1559 ; [.33DC.0020.0002] -155A ; [.33DD.0020.0002] -155B ; [.33DE.0020.0002] -155C ; [.33DF.0020.0002] -155D ; [.33E0.0020.0002] -155E ; [.33E1.0020.0002] -155F ; [.33E2.0020.0002] -1560 ; [.33E3.0020.0002] -1561 ; [.33E4.0020.0002] -1562 ; [.33E5.0020.0002] -1563 ; [.33E6.0020.0002] -1564 ; [.33E7.0020.0002] -1565 ; [.33E8.0020.0002] -1566 ; [.33E9.0020.0002] -1567 ; [.33EA.0020.0002] -1568 ; [.33EB.0020.0002] -1569 ; [.33EC.0020.0002] -156A ; [.33ED.0020.0002] -156B ; [.33EE.0020.0002] -156C ; [.33EF.0020.0002] -156D ; [.33F0.0020.0002] -156E ; [.33F1.0020.0002] -156F ; [.33F2.0020.0002] -1570 ; [.33F3.0020.0002] -1571 ; [.33F4.0020.0002] -1572 ; [.33F5.0020.0002] -1573 ; [.33F6.0020.0002] -1574 ; [.33F7.0020.0002] -1575 ; [.33F8.0020.0002] -1576 ; [.33F9.0020.0002] -1577 ; [.33FA.0020.0002] -1578 ; [.33FB.0020.0002] -1579 ; [.33FC.0020.0002] -157A ; [.33FD.0020.0002] -157B ; [.33FE.0020.0002] -157D ; [.33FF.0020.0002] -166F ; [.3400.0020.0002] -157E ; [.3401.0020.0002] -157F ; [.3402.0020.0002] -1580 ; [.3403.0020.0002] -1581 ; [.3404.0020.0002] -1582 ; [.3405.0020.0002] -1583 ; [.3406.0020.0002] -1584 ; [.3407.0020.0002] -1585 ; [.3408.0020.0002] -1586 ; [.3409.0020.0002] -1587 ; [.340A.0020.0002] -1588 ; [.340B.0020.0002] -1589 ; [.340C.0020.0002] -158A ; [.340D.0020.0002] -158B ; [.340E.0020.0002] -158C ; [.340F.0020.0002] -158D ; [.3410.0020.0002] -1670 ; [.3411.0020.0002] -158E ; [.3412.0020.0002] -158F ; [.3413.0020.0002] -1590 ; [.3414.0020.0002] -1591 ; [.3415.0020.0002] -1592 ; [.3416.0020.0002] -1593 ; [.3417.0020.0002] -1594 ; [.3418.0020.0002] -1595 ; [.3419.0020.0002] -1671 ; [.341A.0020.0002] -1672 ; [.341B.0020.0002] -1673 ; [.341C.0020.0002] -1674 ; [.341D.0020.0002] -1675 ; [.341E.0020.0002] -1676 ; [.341F.0020.0002] -1596 ; [.3420.0020.0002] -1597 ; [.3421.0020.0002] -1598 ; [.3422.0020.0002] -1599 ; [.3423.0020.0002] -159A ; [.3424.0020.0002] -159B ; [.3425.0020.0002] -159C ; [.3426.0020.0002] -159D ; [.3427.0020.0002] -159E ; [.3428.0020.0002] -159F ; [.3429.0020.0002] -15A0 ; [.342A.0020.0002] -15A1 ; [.342B.0020.0002] -15A2 ; [.342C.0020.0002] -15A3 ; [.342D.0020.0002] -15A4 ; [.342E.0020.0002] -15A5 ; [.342F.0020.0002] -15A6 ; [.3430.0020.0002] -157C ; [.3431.0020.0002] -15A7 ; [.3432.0020.0002] -15A8 ; [.3433.0020.0002] -15A9 ; [.3434.0020.0002] -15AA ; [.3435.0020.0002] -15AB ; [.3436.0020.0002] -15AC ; [.3437.0020.0002] -15AD ; [.3438.0020.0002] -15AE ; [.3439.0020.0002] -15AF ; [.343A.0020.0002] -15B0 ; [.343B.0020.0002] -15B1 ; [.343C.0020.0002] -15B2 ; [.343D.0020.0002] -15B3 ; [.343E.0020.0002] -15B4 ; [.343F.0020.0002] -15B5 ; [.3440.0020.0002] -15B6 ; [.3441.0020.0002] -15B7 ; [.3442.0020.0002] -15B8 ; [.3443.0020.0002] -15B9 ; [.3444.0020.0002] -15BA ; [.3445.0020.0002] -15BB ; [.3446.0020.0002] -15BC ; [.3447.0020.0002] -15BD ; [.3448.0020.0002] -15BE ; [.3449.0020.0002] -15BF ; [.344A.0020.0002] -15C0 ; [.344B.0020.0002] -15C1 ; [.344C.0020.0002] -15C2 ; [.344D.0020.0002] -15C3 ; [.344E.0020.0002] -15C4 ; [.344F.0020.0002] -15C5 ; [.3450.0020.0002] -15C6 ; [.3451.0020.0002] -15C7 ; [.3452.0020.0002] -15C8 ; [.3453.0020.0002] -15C9 ; [.3454.0020.0002] -15CA ; [.3455.0020.0002] -15CB ; [.3456.0020.0002] -15CC ; [.3457.0020.0002] -15CD ; [.3458.0020.0002] -15CE ; [.3459.0020.0002] -15CF ; [.345A.0020.0002] -15D0 ; [.345B.0020.0002] -15D1 ; [.345C.0020.0002] -15D2 ; [.345D.0020.0002] -15D3 ; [.345E.0020.0002] -15D4 ; [.345F.0020.0002] -15D5 ; [.3460.0020.0002] -15D6 ; [.3461.0020.0002] -15D7 ; [.3462.0020.0002] -15D8 ; [.3463.0020.0002] -15D9 ; [.3464.0020.0002] -15DA ; [.3465.0020.0002] -15DB ; [.3466.0020.0002] -15DC ; [.3467.0020.0002] -15DD ; [.3468.0020.0002] -15DE ; [.3469.0020.0002] -15DF ; [.346A.0020.0002] -15E0 ; [.346B.0020.0002] -15E1 ; [.346C.0020.0002] -15E2 ; [.346D.0020.0002] -15E3 ; [.346E.0020.0002] -15E4 ; [.346F.0020.0002] -15E5 ; [.3470.0020.0002] -15E6 ; [.3471.0020.0002] -15E7 ; [.3472.0020.0002] -15E8 ; [.3473.0020.0002] -15E9 ; [.3474.0020.0002] -15EA ; [.3475.0020.0002] -15EB ; [.3476.0020.0002] -15EC ; [.3477.0020.0002] -15ED ; [.3478.0020.0002] -15EE ; [.3479.0020.0002] -15EF ; [.347A.0020.0002] -15F0 ; [.347B.0020.0002] -15F1 ; [.347C.0020.0002] -15F2 ; [.347D.0020.0002] -15F3 ; [.347E.0020.0002] -15F4 ; [.347F.0020.0002] -15F5 ; [.3480.0020.0002] -15F6 ; [.3481.0020.0002] -15F7 ; [.3482.0020.0002] -15F8 ; [.3483.0020.0002] -15F9 ; [.3484.0020.0002] -15FA ; [.3485.0020.0002] -15FB ; [.3486.0020.0002] -15FC ; [.3487.0020.0002] -15FD ; [.3488.0020.0002] -15FE ; [.3489.0020.0002] -15FF ; [.348A.0020.0002] -1600 ; [.348B.0020.0002] -1601 ; [.348C.0020.0002] -1602 ; [.348D.0020.0002] -1603 ; [.348E.0020.0002] -1604 ; [.348F.0020.0002] -1605 ; [.3490.0020.0002] -1606 ; [.3491.0020.0002] -1607 ; [.3492.0020.0002] -1608 ; [.3493.0020.0002] -1609 ; [.3494.0020.0002] -160A ; [.3495.0020.0002] -160B ; [.3496.0020.0002] -160C ; [.3497.0020.0002] -160D ; [.3498.0020.0002] -160E ; [.3499.0020.0002] -160F ; [.349A.0020.0002] -1610 ; [.349B.0020.0002] -1611 ; [.349C.0020.0002] -1612 ; [.349D.0020.0002] -1613 ; [.349E.0020.0002] -1614 ; [.349F.0020.0002] -1615 ; [.34A0.0020.0002] -1616 ; [.34A1.0020.0002] -1617 ; [.34A2.0020.0002] -1618 ; [.34A3.0020.0002] -1619 ; [.34A4.0020.0002] -161A ; [.34A5.0020.0002] -161B ; [.34A6.0020.0002] -161C ; [.34A7.0020.0002] -161D ; [.34A8.0020.0002] -161E ; [.34A9.0020.0002] -161F ; [.34AA.0020.0002] -1620 ; [.34AB.0020.0002] -1621 ; [.34AC.0020.0002] -1622 ; [.34AD.0020.0002] -1623 ; [.34AE.0020.0002] -1624 ; [.34AF.0020.0002] -1625 ; [.34B0.0020.0002] -1626 ; [.34B1.0020.0002] -1627 ; [.34B2.0020.0002] -1628 ; [.34B3.0020.0002] -1629 ; [.34B4.0020.0002] -162A ; [.34B5.0020.0002] -162B ; [.34B6.0020.0002] -162C ; [.34B7.0020.0002] -162D ; [.34B8.0020.0002] -162E ; [.34B9.0020.0002] -162F ; [.34BA.0020.0002] -1630 ; [.34BB.0020.0002] -1631 ; [.34BC.0020.0002] -1632 ; [.34BD.0020.0002] -1633 ; [.34BE.0020.0002] -1634 ; [.34BF.0020.0002] -1635 ; [.34C0.0020.0002] -1636 ; [.34C1.0020.0002] -1637 ; [.34C2.0020.0002] -1638 ; [.34C3.0020.0002] -1639 ; [.34C4.0020.0002] -163A ; [.34C5.0020.0002] -163B ; [.34C6.0020.0002] -163C ; [.34C7.0020.0002] -163D ; [.34C8.0020.0002] -163E ; [.34C9.0020.0002] -163F ; [.34CA.0020.0002] -1640 ; [.34CB.0020.0002] -1641 ; [.34CC.0020.0002] -1642 ; [.34CD.0020.0002] -1643 ; [.34CE.0020.0002] -1644 ; [.34CF.0020.0002] -1645 ; [.34D0.0020.0002] -1646 ; [.34D1.0020.0002] -1647 ; [.34D2.0020.0002] -1648 ; [.34D3.0020.0002] -1649 ; [.34D4.0020.0002] -164A ; [.34D5.0020.0002] -164B ; [.34D6.0020.0002] -164C ; [.34D7.0020.0002] -164D ; [.34D8.0020.0002] -164E ; [.34D9.0020.0002] -164F ; [.34DA.0020.0002] -1650 ; [.34DB.0020.0002] -1651 ; [.34DC.0020.0002] -1652 ; [.34DD.0020.0002] -1653 ; [.34DE.0020.0002] -1654 ; [.34DF.0020.0002] -1655 ; [.34E0.0020.0002] -1656 ; [.34E1.0020.0002] -1657 ; [.34E2.0020.0002] -1658 ; [.34E3.0020.0002] -1659 ; [.34E4.0020.0002] -165A ; [.34E5.0020.0002] -165B ; [.34E6.0020.0002] -165C ; [.34E7.0020.0002] -165D ; [.34E8.0020.0002] -165E ; [.34E9.0020.0002] -165F ; [.34EA.0020.0002] -1660 ; [.34EB.0020.0002] -1661 ; [.34EC.0020.0002] -1662 ; [.34ED.0020.0002] -1663 ; [.34EE.0020.0002] -1664 ; [.34EF.0020.0002] -1665 ; [.34F0.0020.0002] -1666 ; [.34F1.0020.0002] -1667 ; [.34F2.0020.0002] -1668 ; [.34F3.0020.0002] -1669 ; [.34F4.0020.0002] -166A ; [.34F5.0020.0002] -166B ; [.34F6.0020.0002] -166C ; [.34F7.0020.0002] -1677 ; [.34F8.0020.0002] -1678 ; [.34F9.0020.0002] -1679 ; [.34FA.0020.0002] -167A ; [.34FB.0020.0002] -167B ; [.34FC.0020.0002] -167C ; [.34FD.0020.0002] -167D ; [.34FE.0020.0002] -167E ; [.34FF.0020.0002] -167F ; [.3500.0020.0002] -18B0 ; [.3501.0020.0002] -18B1 ; [.3502.0020.0002] -18B2 ; [.3503.0020.0002] -18B3 ; [.3504.0020.0002] -18B4 ; [.3505.0020.0002] -18B5 ; [.3506.0020.0002] -18B6 ; [.3507.0020.0002] -18B7 ; [.3508.0020.0002] -18B8 ; [.3509.0020.0002] -18B9 ; [.350A.0020.0002] -18BA ; [.350B.0020.0002] -18BB ; [.350C.0020.0002] -18BC ; [.350D.0020.0002] -18BD ; [.350E.0020.0002] -18BE ; [.350F.0020.0002] -18BF ; [.3510.0020.0002] -18C0 ; [.3511.0020.0002] -18C1 ; [.3512.0020.0002] -18C2 ; [.3513.0020.0002] -18C3 ; [.3514.0020.0002] -18C4 ; [.3515.0020.0002] -18C5 ; [.3516.0020.0002] -18C6 ; [.3517.0020.0002] -18C7 ; [.3518.0020.0002] -18C8 ; [.3519.0020.0002] -18C9 ; [.351A.0020.0002] -18CA ; [.351B.0020.0002] -18CB ; [.351C.0020.0002] -18CC ; [.351D.0020.0002] -18CD ; [.351E.0020.0002] -18CE ; [.351F.0020.0002] -18CF ; [.3520.0020.0002] -18D0 ; [.3521.0020.0002] -18D1 ; [.3522.0020.0002] -18D2 ; [.3523.0020.0002] -18D3 ; [.3524.0020.0002] -18D4 ; [.3525.0020.0002] -18D5 ; [.3526.0020.0002] -18D6 ; [.3527.0020.0002] -18D7 ; [.3528.0020.0002] -18D8 ; [.3529.0020.0002] -18D9 ; [.352A.0020.0002] -18DA ; [.352B.0020.0002] -18DB ; [.352C.0020.0002] -18DC ; [.352D.0020.0002] -18DD ; [.352E.0020.0002] -18DE ; [.352F.0020.0002] -18DF ; [.3530.0020.0002] -18E0 ; [.3531.0020.0002] -18E1 ; [.3532.0020.0002] -18E2 ; [.3533.0020.0002] -18E3 ; [.3534.0020.0002] -18E4 ; [.3535.0020.0002] -18E5 ; [.3536.0020.0002] -18E6 ; [.3537.0020.0002] -18E7 ; [.3538.0020.0002] -18E8 ; [.3539.0020.0002] -18E9 ; [.353A.0020.0002] -18EA ; [.353B.0020.0002] -18EB ; [.353C.0020.0002] -18EC ; [.353D.0020.0002] -18ED ; [.353E.0020.0002] -18EE ; [.353F.0020.0002] -18EF ; [.3540.0020.0002] -18F0 ; [.3541.0020.0002] -18F1 ; [.3542.0020.0002] -18F2 ; [.3543.0020.0002] -18F3 ; [.3544.0020.0002] -18F4 ; [.3545.0020.0002] -18F5 ; [.3546.0020.0002] -1681 ; [.3547.0020.0002] -1682 ; [.3548.0020.0002] -1683 ; [.3549.0020.0002] -1684 ; [.354A.0020.0002] -1685 ; [.354B.0020.0002] -1686 ; [.354C.0020.0002] -1687 ; [.354D.0020.0002] -1688 ; [.354E.0020.0002] -1689 ; [.354F.0020.0002] -168A ; [.3550.0020.0002] -168B ; [.3551.0020.0002] -168C ; [.3552.0020.0002] -168D ; [.3553.0020.0002] -168E ; [.3554.0020.0002] -168F ; [.3555.0020.0002] -1690 ; [.3556.0020.0002] -1691 ; [.3557.0020.0002] -1692 ; [.3558.0020.0002] -1693 ; [.3559.0020.0002] -1694 ; [.355A.0020.0002] -1695 ; [.355B.0020.0002] -1696 ; [.355C.0020.0002] -1697 ; [.355D.0020.0002] -1698 ; [.355E.0020.0002] -1699 ; [.355F.0020.0002] -169A ; [.3560.0020.0002] -16A0 ; [.3561.0020.0002] -16A1 ; [.3561.0020.0004][.0000.010B.0004] -16A2 ; [.3562.0020.0002] -16A4 ; [.3562.0020.0004][.0000.010B.0004] -16A5 ; [.3562.0020.0004][.0000.010C.0004] -16A6 ; [.3563.0020.0002] -16A7 ; [.3563.0020.0004][.0000.010B.0004] -16F0 ; [.3563.0020.0004][.3563.0020.0004] -16A8 ; [.3564.0020.0002] -16A9 ; [.3564.0020.0004][.0000.010B.0004] -16AC ; [.3564.0020.0004][.0000.010C.0004] -16AD ; [.3564.0020.0004][.0000.010D.0004] -16AE ; [.3564.0020.0004][.0000.010E.0004] -16F4 ; [.3565.0020.0002] -16AF ; [.3566.0020.0002] -16B0 ; [.3567.0020.0002] -16B1 ; [.3568.0020.0002] -16B2 ; [.3569.0020.0002] -16B3 ; [.3569.0020.0004][.0000.010B.0004] -16B4 ; [.3569.0020.0004][.0000.010C.0004] -16B5 ; [.3569.0020.0004][.0000.010D.0004] -16B6 ; [.3569.0020.0004][.0000.010E.0004] -16F1 ; [.356A.0020.0002] -16B7 ; [.356B.0020.0002] -16B9 ; [.356C.0020.0002] -16E9 ; [.356C.0020.0004][.0000.010B.0004] -16BA ; [.356D.0020.0002] -16BB ; [.356D.0020.0004][.0000.010B.0004] -16BC ; [.356D.0020.0004][.0000.010C.0004] -16BD ; [.356D.0020.0004][.0000.010D.0004] -16BE ; [.356E.0020.0002] -16BF ; [.356E.0020.0004][.0000.010B.0004] -16C0 ; [.356E.0020.0004][.0000.010C.0004] -16C1 ; [.356F.0020.0002] -16C2 ; [.356F.0020.0004][.0000.010B.0004] -16F5 ; [.3570.0020.0002] -16C3 ; [.3571.0020.0002] -16C4 ; [.3571.0020.0004][.0000.010B.0004] -16C5 ; [.3572.0020.0002] -16C6 ; [.3572.0020.0004][.0000.010B.0004] -16EE ; [.3572.0020.0004][.357D.0020.0004] -16C7 ; [.3573.0020.0002] -16C8 ; [.3574.0020.0002] -16D5 ; [.3574.0020.0004][.0000.010B.0004] -16C9 ; [.3575.0020.0002] -16CA ; [.3576.0020.0002] -16CB ; [.3576.0020.0004][.0000.010B.0004] -16EA ; [.3576.0020.0004][.0000.010C.0004] -16CC ; [.3576.0020.0004][.0000.010D.0004] -16CD ; [.3576.0020.0004][.0000.010E.0004] -16CE ; [.3576.0020.0004][.0000.010F.0004] -16F2 ; [.3577.0020.0002] -16CF ; [.3578.0020.0002] -16D0 ; [.3578.0020.0004][.0000.010B.0004] -16D1 ; [.3578.0020.0004][.0000.010C.0004] -16D2 ; [.3579.0020.0002] -16D3 ; [.3579.0020.0004][.0000.010B.0004] -16D4 ; [.3579.0020.0004][.0000.010C.0004] -16D6 ; [.357A.0020.0002] -16F6 ; [.357B.0020.0002] -16D7 ; [.357C.0020.0002] -16D8 ; [.357C.0020.0004][.0000.010B.0004] -16D9 ; [.357C.0020.0004][.0000.010C.0004] -16EF ; [.357C.0020.0004][.0000.010B.0004][.357C.0020.0004][.0000.010B.0004] -16DA ; [.357D.0020.0002] -16DB ; [.357D.0020.0004][.0000.010B.0004] -16DC ; [.357E.0020.0002] -16DD ; [.357E.0020.0004][.0000.010B.0004] -16DE ; [.357F.0020.0002] -16DF ; [.3580.0020.0002] -16F3 ; [.3581.0020.0002] -16AA ; [.3582.0020.0002] -16F7 ; [.3583.0020.0002] -16AB ; [.3584.0020.0002] -16F8 ; [.3585.0020.0002] -16A3 ; [.3586.0020.0002] -16E0 ; [.3587.0020.0002] -16E3 ; [.3588.0020.0002] -16B8 ; [.3589.0020.0002] -16E4 ; [.358A.0020.0002] -16E1 ; [.358B.0020.0002] -16E2 ; [.358C.0020.0002] -16E5 ; [.358D.0020.0002] -16E6 ; [.358E.0020.0002] -16E7 ; [.358E.0020.0004][.0000.010B.0004] -16E8 ; [.358E.0020.0004][.0000.010C.0004] -10CC0 ; [.358F.0020.0002] -10C80 ; [.358F.0020.0008] -10CC1 ; [.358F.0020.0004][.0000.010B.0004] -10C81 ; [.358F.0020.000A][.0000.010B.0004] -10CC2 ; [.3590.0020.0002] -10C82 ; [.3590.0020.0008] -10CC3 ; [.3591.0020.0002] -10C83 ; [.3591.0020.0008] -10CC4 ; [.3592.0020.0002] -10C84 ; [.3592.0020.0008] -10CC5 ; [.3593.0020.0002] -10C85 ; [.3593.0020.0008] -10CC6 ; [.3594.0020.0002] -10C86 ; [.3594.0020.0008] -10CC7 ; [.3595.0020.0002] -10C87 ; [.3595.0020.0008] -10CC8 ; [.3596.0020.0002] -10C88 ; [.3596.0020.0008] -10CC9 ; [.3597.0020.0002] -10C89 ; [.3597.0020.0008] -10CCA ; [.3597.0020.0004][.0000.010B.0004] -10C8A ; [.3597.0020.000A][.0000.010B.0004] -10CCB ; [.3597.0020.0004][.0000.010C.0004] -10C8B ; [.3597.0020.000A][.0000.010C.0004] -10CCC ; [.3598.0020.0002] -10C8C ; [.3598.0020.0008] -10CCD ; [.3599.0020.0002] -10C8D ; [.3599.0020.0008] -10CCE ; [.359A.0020.0002] -10C8E ; [.359A.0020.0008] -10CCF ; [.359B.0020.0002] -10C8F ; [.359B.0020.0008] -10CD0 ; [.359C.0020.0002] -10C90 ; [.359C.0020.0008] -10CD1 ; [.359C.0020.0004][.0000.010B.0004] -10C91 ; [.359C.0020.000A][.0000.010B.0004] -10CD2 ; [.359D.0020.0002] -10C92 ; [.359D.0020.0008] -10CD3 ; [.359E.0020.0002] -10C93 ; [.359E.0020.0008] -10CD4 ; [.359F.0020.0002] -10C94 ; [.359F.0020.0008] -10CD5 ; [.35A0.0020.0002] -10C95 ; [.35A0.0020.0008] -10CD6 ; [.35A1.0020.0002] -10C96 ; [.35A1.0020.0008] -10CD7 ; [.35A2.0020.0002] -10C97 ; [.35A2.0020.0008] -10CD8 ; [.35A3.0020.0002] -10C98 ; [.35A3.0020.0008] -10CD9 ; [.35A4.0020.0002] -10C99 ; [.35A4.0020.0008] -10CDA ; [.35A5.0020.0002] -10C9A ; [.35A5.0020.0008] -10CDB ; [.35A6.0020.0002] -10C9B ; [.35A6.0020.0008] -10CDC ; [.35A6.0020.0004][.0000.010B.0004] -10C9C ; [.35A6.0020.000A][.0000.010B.0004] -10CDD ; [.35A7.0020.0002] -10C9D ; [.35A7.0020.0008] -10CDE ; [.35A7.0020.0004][.0000.010B.0004] -10C9E ; [.35A7.0020.000A][.0000.010B.0004] -10CDF ; [.35A7.0020.0004][.0000.010C.0004] -10C9F ; [.35A7.0020.000A][.0000.010C.0004] -10CE0 ; [.35A8.0020.0002] -10CA0 ; [.35A8.0020.0008] -10CE1 ; [.35A9.0020.0002] -10CA1 ; [.35A9.0020.0008] -10CE2 ; [.35AA.0020.0002] -10CA2 ; [.35AA.0020.0008] -10CE3 ; [.35AA.0020.0004][.0000.010B.0004] -10CA3 ; [.35AA.0020.000A][.0000.010B.0004] -10CE4 ; [.35AB.0020.0002] -10CA4 ; [.35AB.0020.0008] -10CE5 ; [.35AC.0020.0002] -10CA5 ; [.35AC.0020.0008] -10CE6 ; [.35AD.0020.0002] -10CA6 ; [.35AD.0020.0008] -10CE7 ; [.35AE.0020.0002] -10CA7 ; [.35AE.0020.0008] -10CE8 ; [.35AF.0020.0002] -10CA8 ; [.35AF.0020.0008] -10CE9 ; [.35B0.0020.0002] -10CA9 ; [.35B0.0020.0008] -10CEA ; [.35B1.0020.0002] -10CAA ; [.35B1.0020.0008] -10CEB ; [.35B1.0020.0004][.0000.010B.0004] -10CAB ; [.35B1.0020.000A][.0000.010B.0004] -10CEC ; [.35B2.0020.0002] -10CAC ; [.35B2.0020.0008] -10CED ; [.35B2.0020.0004][.0000.010B.0004] -10CAD ; [.35B2.0020.000A][.0000.010B.0004] -10CEE ; [.35B3.0020.0002] -10CAE ; [.35B3.0020.0008] -10CEF ; [.35B4.0020.0002] -10CAF ; [.35B4.0020.0008] -10CF0 ; [.35B5.0020.0002] -10CB0 ; [.35B5.0020.0008] -10CF1 ; [.35B6.0020.0002] -10CB1 ; [.35B6.0020.0008] -10CF2 ; [.35B7.0020.0002] -10CB2 ; [.35B7.0020.0008] -10C00 ; [.35B8.0020.0002] -10C01 ; [.35B8.0020.0004][.0000.010B.0004] -10C02 ; [.35B9.0020.0002] -10C03 ; [.35BA.0020.0002] -10C04 ; [.35BA.0020.0004][.0000.010B.0004] -10C05 ; [.35BB.0020.0002] -10C06 ; [.35BC.0020.0002] -10C07 ; [.35BD.0020.0002] -10C08 ; [.35BD.0020.0004][.0000.010B.0004] -10C09 ; [.35BE.0020.0002] -10C0A ; [.35BE.0020.0004][.0000.010B.0004] -10C0B ; [.35BF.0020.0002] -10C0C ; [.35BF.0020.0004][.0000.010B.0004] -10C0D ; [.35C0.0020.0002] -10C0E ; [.35C0.0020.0004][.0000.010B.0004] -10C0F ; [.35C1.0020.0002] -10C10 ; [.35C1.0020.0004][.0000.010B.0004] -10C11 ; [.35C2.0020.0002] -10C12 ; [.35C2.0020.0004][.0000.010B.0004] -10C13 ; [.35C3.0020.0002] -10C14 ; [.35C4.0020.0002] -10C15 ; [.35C4.0020.0004][.0000.010B.0004] -10C16 ; [.35C5.0020.0002] -10C17 ; [.35C5.0020.0004][.0000.010B.0004] -10C18 ; [.35C6.0020.0002] -10C19 ; [.35C6.0020.0004][.0000.010B.0004] -10C1A ; [.35C7.0020.0002] -10C1B ; [.35C7.0020.0004][.0000.010B.0004] -10C1C ; [.35C8.0020.0002] -10C1D ; [.35C8.0020.0004][.0000.010B.0004] -10C1E ; [.35C9.0020.0002] -10C1F ; [.35C9.0020.0004][.0000.010B.0004] -10C20 ; [.35CA.0020.0002] -10C21 ; [.35CB.0020.0002] -10C22 ; [.35CC.0020.0002] -10C23 ; [.35CD.0020.0002] -10C24 ; [.35CE.0020.0002] -10C25 ; [.35CE.0020.0004][.0000.010B.0004] -10C26 ; [.35CF.0020.0002] -10C27 ; [.35CF.0020.0004][.0000.010B.0004] -10C28 ; [.35D0.0020.0002] -10C29 ; [.35D0.0020.0004][.0000.010B.0004] -10C2A ; [.35D1.0020.0002] -10C2B ; [.35D1.0020.0004][.0000.010B.0004] -10C2C ; [.35D2.0020.0002] -10C2D ; [.35D3.0020.0002] -10C2E ; [.35D3.0020.0004][.0000.010B.0004] -10C2F ; [.35D4.0020.0002] -10C30 ; [.35D5.0020.0002] -10C31 ; [.35D6.0020.0002] -10C32 ; [.35D7.0020.0002] -10C33 ; [.35D7.0020.0004][.0000.010B.0004] -10C34 ; [.35D8.0020.0002] -10C35 ; [.35D8.0020.0004][.0000.010B.0004] -10C36 ; [.35D9.0020.0002] -10C37 ; [.35D9.0020.0004][.0000.010B.0004] -10C38 ; [.35DA.0020.0002] -10C39 ; [.35DA.0020.0004][.0000.010B.0004] -10C3A ; [.35DB.0020.0002] -10C3B ; [.35DB.0020.0004][.0000.010B.0004] -10C3C ; [.35DC.0020.0002] -10C3D ; [.35DD.0020.0002] -10C3E ; [.35DE.0020.0002] -10C3F ; [.35DF.0020.0002] -10C40 ; [.35DF.0020.0004][.0000.010B.0004] -10C41 ; [.35E0.0020.0002] -10C42 ; [.35E0.0020.0004][.0000.010B.0004] -10C43 ; [.35E1.0020.0002] -10C44 ; [.35E1.0020.0004][.0000.010B.0004] -10C45 ; [.35E2.0020.0002] -10C46 ; [.35E2.0020.0004][.0000.010B.0004] -10C47 ; [.35E3.0020.0002] -10C48 ; [.35E4.0020.0002] -A500 ; [.35E5.0020.0002] -A501 ; [.35E6.0020.0002] -A502 ; [.35E7.0020.0002] -A503 ; [.35E8.0020.0002] -A504 ; [.35E9.0020.0002] -A505 ; [.35EA.0020.0002] -A506 ; [.35EB.0020.0002] -A507 ; [.35EC.0020.0002] -A508 ; [.35ED.0020.0002] -A509 ; [.35EE.0020.0002] -A50A ; [.35EF.0020.0002] -A50B ; [.35F0.0020.0002] -A50C ; [.35F1.0020.0002] -A613 ; [.35F1.0020.0004][.36F0.0020.0004] -A50D ; [.35F2.0020.0002] -A50E ; [.35F3.0020.0002] -A50F ; [.35F4.0020.0002] -A510 ; [.35F5.0020.0002] -A511 ; [.35F6.0020.0002] -A512 ; [.35F7.0020.0002] -A513 ; [.35F8.0020.0002] -A514 ; [.35F9.0020.0002] -A515 ; [.35FA.0020.0002] -A516 ; [.35FB.0020.0002] -A517 ; [.35FC.0020.0002] -A518 ; [.35FD.0020.0002] -A519 ; [.35FE.0020.0002] -A51A ; [.35FF.0020.0002] -A51B ; [.3600.0020.0002] -A51C ; [.3601.0020.0002] -A51D ; [.3602.0020.0002] -A51E ; [.3603.0020.0002] -A614 ; [.3603.0020.0004][.36F0.0020.0004] -A51F ; [.3604.0020.0002] -A520 ; [.3605.0020.0002] -A521 ; [.3606.0020.0002] -A522 ; [.3607.0020.0002] -A523 ; [.3608.0020.0002] -A524 ; [.3609.0020.0002] -A525 ; [.360A.0020.0002] -A526 ; [.360B.0020.0002] -A527 ; [.360C.0020.0002] -A528 ; [.360D.0020.0002] -A529 ; [.360E.0020.0002] -A52A ; [.360F.0020.0002] -A52B ; [.3610.0020.0002] -A52C ; [.3611.0020.0002] -A52D ; [.3612.0020.0002] -A52E ; [.3613.0020.0002] -A52F ; [.3614.0020.0002] -A530 ; [.3615.0020.0002] -A531 ; [.3616.0020.0002] -A532 ; [.3617.0020.0002] -A533 ; [.3618.0020.0002] -A615 ; [.3618.0020.0004][.36F0.0020.0004] -A534 ; [.3619.0020.0002] -A535 ; [.361A.0020.0002] -A536 ; [.361B.0020.0002] -A537 ; [.361C.0020.0002] -A538 ; [.361D.0020.0002] -A539 ; [.361E.0020.0002] -A53A ; [.361F.0020.0002] -A53B ; [.3620.0020.0002] -A53C ; [.3621.0020.0002] -A53D ; [.3622.0020.0002] -A53E ; [.3623.0020.0002] -A53F ; [.3624.0020.0002] -A540 ; [.3625.0020.0002] -A541 ; [.3626.0020.0002] -A542 ; [.3627.0020.0002] -A543 ; [.3628.0020.0002] -A544 ; [.3629.0020.0002] -A545 ; [.362A.0020.0002] -A546 ; [.362B.0020.0002] -A547 ; [.362C.0020.0002] -A616 ; [.362C.0020.0004][.36F1.0020.0004] -A548 ; [.362D.0020.0002] -A549 ; [.362E.0020.0002] -A54A ; [.362F.0020.0002] -A54B ; [.3630.0020.0002] -A54C ; [.3631.0020.0002] -A54D ; [.3632.0020.0002] -A54E ; [.3633.0020.0002] -A54F ; [.3634.0020.0002] -A550 ; [.3635.0020.0002] -A551 ; [.3636.0020.0002] -A552 ; [.3637.0020.0002] -A617 ; [.3637.0020.0004][.36F0.0020.0004] -A553 ; [.3638.0020.0002] -A554 ; [.3639.0020.0002] -A555 ; [.363A.0020.0002] -A556 ; [.363B.0020.0002] -A557 ; [.363C.0020.0002] -A558 ; [.363D.0020.0002] -A610 ; [.363D.0020.0004] -A618 ; [.363D.0020.0004][.36F1.0020.0004] -A559 ; [.363E.0020.0002] -A55A ; [.363F.0020.0002] -A619 ; [.363F.0020.0004][.36F1.0020.0004] -A55B ; [.3640.0020.0002] -A55C ; [.3641.0020.0002] -A55D ; [.3642.0020.0002] -A55E ; [.3643.0020.0002] -A55F ; [.3644.0020.0002] -A560 ; [.3645.0020.0002] -A61A ; [.3645.0020.0004][.36F0.0020.0004] -A561 ; [.3646.0020.0002] -A562 ; [.3647.0020.0002] -A563 ; [.3648.0020.0002] -A564 ; [.3649.0020.0002] -A565 ; [.364A.0020.0002] -A566 ; [.364B.0020.0002] -A567 ; [.364C.0020.0002] -A568 ; [.364D.0020.0002] -A569 ; [.364E.0020.0002] -A56A ; [.364F.0020.0002] -A611 ; [.364F.0020.0004] -A56B ; [.3650.0020.0002] -A56C ; [.3651.0020.0002] -A56D ; [.3652.0020.0002] -A56E ; [.3653.0020.0002] -A62A ; [.3653.0020.0004] -A56F ; [.3654.0020.0002] -A570 ; [.3655.0020.0002] -A571 ; [.3656.0020.0002] -A572 ; [.3657.0020.0002] -A573 ; [.3658.0020.0002] -A574 ; [.3659.0020.0002] -A575 ; [.365A.0020.0002] -A576 ; [.365B.0020.0002] -A577 ; [.365C.0020.0002] -A578 ; [.365D.0020.0002] -A579 ; [.365E.0020.0002] -A57A ; [.365F.0020.0002] -A57B ; [.3660.0020.0002] -A57C ; [.3661.0020.0002] -A57D ; [.3662.0020.0002] -A57E ; [.3663.0020.0002] -A57F ; [.3664.0020.0002] -A580 ; [.3665.0020.0002] -A581 ; [.3666.0020.0002] -A582 ; [.3667.0020.0002] -A583 ; [.3668.0020.0002] -A584 ; [.3669.0020.0002] -A585 ; [.366A.0020.0002] -A61B ; [.366A.0020.0004][.36F0.0020.0004] -A586 ; [.366B.0020.0002] -A587 ; [.366C.0020.0002] -A612 ; [.366C.0020.0004] -A588 ; [.366D.0020.0002] -A589 ; [.366E.0020.0002] -A58A ; [.366F.0020.0002] -A58B ; [.3670.0020.0002] -A58C ; [.3671.0020.0002] -A58D ; [.3672.0020.0002] -A58E ; [.3673.0020.0002] -A58F ; [.3674.0020.0002] -A590 ; [.3675.0020.0002] -A591 ; [.3676.0020.0002] -A592 ; [.3677.0020.0002] -A593 ; [.3678.0020.0002] -A594 ; [.3679.0020.0002] -A595 ; [.367A.0020.0002] -A596 ; [.367B.0020.0002] -A597 ; [.367C.0020.0002] -A598 ; [.367D.0020.0002] -A599 ; [.367E.0020.0002] -A59A ; [.367F.0020.0002] -A59B ; [.3680.0020.0002] -A59C ; [.3681.0020.0002] -A59D ; [.3682.0020.0002] -A59E ; [.3683.0020.0002] -A59F ; [.3684.0020.0002] -A5A0 ; [.3685.0020.0002] -A5A1 ; [.3686.0020.0002] -A5A2 ; [.3687.0020.0002] -A5A3 ; [.3688.0020.0002] -A5A4 ; [.3689.0020.0002] -A5A5 ; [.368A.0020.0002] -A5A6 ; [.368B.0020.0002] -A5A7 ; [.368C.0020.0002] -A5A8 ; [.368D.0020.0002] -A5A9 ; [.368E.0020.0002] -A5AA ; [.368F.0020.0002] -A5AB ; [.3690.0020.0002] -A5AC ; [.3691.0020.0002] -A5AD ; [.3692.0020.0002] -A5AE ; [.3693.0020.0002] -A5AF ; [.3694.0020.0002] -A5B0 ; [.3695.0020.0002] -A5B1 ; [.3696.0020.0002] -A5B2 ; [.3697.0020.0002] -A5B3 ; [.3698.0020.0002] -A5B4 ; [.3699.0020.0002] -A61C ; [.3699.0020.0004][.36F0.0020.0004] -A5B5 ; [.369A.0020.0002] -A5B6 ; [.369B.0020.0002] -A5B7 ; [.369C.0020.0002] -A5B8 ; [.369D.0020.0002] -A5B9 ; [.369E.0020.0002] -A5BA ; [.369F.0020.0002] -A5BB ; [.36A0.0020.0002] -A5BC ; [.36A1.0020.0002] -A5BD ; [.36A2.0020.0002] -A5BE ; [.36A3.0020.0002] -A5BF ; [.36A4.0020.0002] -A5C0 ; [.36A5.0020.0002] -A5C1 ; [.36A6.0020.0002] -A5C2 ; [.36A7.0020.0002] -A5C3 ; [.36A8.0020.0002] -A5C4 ; [.36A9.0020.0002] -A5C5 ; [.36AA.0020.0002] -A5C6 ; [.36AB.0020.0002] -A5C7 ; [.36AC.0020.0002] -A5C8 ; [.36AD.0020.0002] -A5C9 ; [.36AE.0020.0002] -A5CA ; [.36AF.0020.0002] -A5CB ; [.36B0.0020.0002] -A61D ; [.36B0.0020.0004][.36F0.0020.0004] -A5CC ; [.36B1.0020.0002] -A5CD ; [.36B2.0020.0002] -A5CE ; [.36B3.0020.0002] -A5CF ; [.36B4.0020.0002] -A5D0 ; [.36B5.0020.0002] -A5D1 ; [.36B6.0020.0002] -A62B ; [.36B6.0020.0004] -A61E ; [.36B6.0020.0004][.36F1.0020.0004] -A5D2 ; [.36B7.0020.0002] -A5D3 ; [.36B8.0020.0002] -A5D4 ; [.36B9.0020.0002] -A5D5 ; [.36BA.0020.0002] -A5D6 ; [.36BB.0020.0002] -A5D7 ; [.36BC.0020.0002] -A5D8 ; [.36BD.0020.0002] -A61F ; [.36BD.0020.0004][.36F0.0020.0004] -A5D9 ; [.36BE.0020.0002] -A5DA ; [.36BF.0020.0002] -A5DB ; [.36C0.0020.0002] -A5DC ; [.36C1.0020.0002] -A5DD ; [.36C2.0020.0002] -A5DE ; [.36C3.0020.0002] -A5DF ; [.36C4.0020.0002] -A5E0 ; [.36C5.0020.0002] -A5E1 ; [.36C6.0020.0002] -A5E2 ; [.36C7.0020.0002] -A5E3 ; [.36C8.0020.0002] -A5E4 ; [.36C9.0020.0002] -A5E5 ; [.36CA.0020.0002] -A5E6 ; [.36CB.0020.0002] -A5E7 ; [.36CC.0020.0002] -A5E8 ; [.36CD.0020.0002] -A5E9 ; [.36CE.0020.0002] -A5EA ; [.36CF.0020.0002] -A5EB ; [.36D0.0020.0002] -A5EC ; [.36D1.0020.0002] -A5ED ; [.36D2.0020.0002] -A5EE ; [.36D3.0020.0002] -A5EF ; [.36D4.0020.0002] -A5F0 ; [.36D5.0020.0002] -A5F1 ; [.36D6.0020.0002] -A5F2 ; [.36D7.0020.0002] -A5F3 ; [.36D8.0020.0002] -A5F4 ; [.36D9.0020.0002] -A5F5 ; [.36DA.0020.0002] -A5F6 ; [.36DB.0020.0002] -A5F7 ; [.36DC.0020.0002] -A5F8 ; [.36DD.0020.0002] -A5F9 ; [.36DE.0020.0002] -A5FA ; [.36DF.0020.0002] -A5FB ; [.36E0.0020.0002] -A5FC ; [.36E1.0020.0002] -A5FD ; [.36E2.0020.0002] -A5FE ; [.36E3.0020.0002] -A5FF ; [.36E4.0020.0002] -A600 ; [.36E5.0020.0002] -A601 ; [.36E6.0020.0002] -A602 ; [.36E7.0020.0002] -A603 ; [.36E8.0020.0002] -A604 ; [.36E9.0020.0002] -A605 ; [.36EA.0020.0002] -A606 ; [.36EB.0020.0002] -A607 ; [.36EC.0020.0002] -A608 ; [.36ED.0020.0002] -A609 ; [.36EE.0020.0002] -A60A ; [.36EF.0020.0002] -A60B ; [.36F0.0020.0002] -A60C ; [.36F1.0020.0002] -A6A0 ; [.36F2.0020.0002] -A6A1 ; [.36F3.0020.0002] -A6A2 ; [.36F4.0020.0002] -A6A3 ; [.36F5.0020.0002] -A6A4 ; [.36F6.0020.0002] -A6A5 ; [.36F7.0020.0002] -A6A6 ; [.36F8.0020.0002] -A6A7 ; [.36F9.0020.0002] -A6A8 ; [.36FA.0020.0002] -A6A9 ; [.36FB.0020.0002] -A6AA ; [.36FC.0020.0002] -A6AB ; [.36FD.0020.0002] -A6AC ; [.36FE.0020.0002] -A6AD ; [.36FF.0020.0002] -A6AE ; [.3700.0020.0002] -A6AF ; [.3701.0020.0002] -A6B0 ; [.3702.0020.0002] -A6B1 ; [.3703.0020.0002] -A6B2 ; [.3704.0020.0002] -A6B3 ; [.3705.0020.0002] -A6B4 ; [.3706.0020.0002] -A6B5 ; [.3707.0020.0002] -A6B6 ; [.3708.0020.0002] -A6B7 ; [.3709.0020.0002] -A6B8 ; [.370A.0020.0002] -A6B9 ; [.370B.0020.0002] -A6BA ; [.370C.0020.0002] -A6BB ; [.370D.0020.0002] -A6BC ; [.370E.0020.0002] -A6BD ; [.370F.0020.0002] -A6BE ; [.3710.0020.0002] -A6BF ; [.3711.0020.0002] -A6C0 ; [.3712.0020.0002] -A6C1 ; [.3713.0020.0002] -A6C2 ; [.3714.0020.0002] -A6C3 ; [.3715.0020.0002] -A6C4 ; [.3716.0020.0002] -A6C5 ; [.3717.0020.0002] -A6C6 ; [.3718.0020.0002] -A6C7 ; [.3719.0020.0002] -A6C8 ; [.371A.0020.0002] -A6C9 ; [.371B.0020.0002] -A6CA ; [.371C.0020.0002] -A6CB ; [.371D.0020.0002] -A6CC ; [.371E.0020.0002] -A6CD ; [.371F.0020.0002] -A6CE ; [.3720.0020.0002] -A6CF ; [.3721.0020.0002] -A6D0 ; [.3722.0020.0002] -A6D1 ; [.3723.0020.0002] -A6D2 ; [.3724.0020.0002] -A6D3 ; [.3725.0020.0002] -A6D4 ; [.3726.0020.0002] -A6D5 ; [.3727.0020.0002] -A6D6 ; [.3728.0020.0002] -A6D7 ; [.3729.0020.0002] -A6D8 ; [.372A.0020.0002] -A6D9 ; [.372B.0020.0002] -A6DA ; [.372C.0020.0002] -A6DB ; [.372D.0020.0002] -A6DC ; [.372E.0020.0002] -A6DD ; [.372F.0020.0002] -A6DE ; [.3730.0020.0002] -A6DF ; [.3731.0020.0002] -A6E0 ; [.3732.0020.0002] -A6E1 ; [.3733.0020.0002] -A6E2 ; [.3734.0020.0002] -A6E3 ; [.3735.0020.0002] -A6E4 ; [.3736.0020.0002] -A6E5 ; [.3737.0020.0002] -A6E6 ; [.3738.0020.0002] -A6E7 ; [.3739.0020.0002] -A6E8 ; [.373A.0020.0002] -A6E9 ; [.373B.0020.0002] -A6EA ; [.373C.0020.0002] -A6EB ; [.373D.0020.0002] -A6EC ; [.373E.0020.0002] -A6ED ; [.373F.0020.0002] -A6EE ; [.3740.0020.0002] -A6EF ; [.3741.0020.0002] -16800 ; [.3742.0020.0002] -16801 ; [.3743.0020.0002] -16802 ; [.3744.0020.0002] -16803 ; [.3745.0020.0002] -16804 ; [.3746.0020.0002] -16805 ; [.3747.0020.0002] -16806 ; [.3748.0020.0002] -16807 ; [.3749.0020.0002] -16808 ; [.374A.0020.0002] -16809 ; [.374B.0020.0002] -1680A ; [.374C.0020.0002] -1680B ; [.374D.0020.0002] -1680C ; [.374E.0020.0002] -1680D ; [.374F.0020.0002] -1680E ; [.3750.0020.0002] -1680F ; [.3751.0020.0002] -16810 ; [.3752.0020.0002] -16811 ; [.3753.0020.0002] -16812 ; [.3754.0020.0002] -16813 ; [.3755.0020.0002] -16814 ; [.3756.0020.0002] -16815 ; [.3757.0020.0002] -16816 ; [.3758.0020.0002] -16817 ; [.3759.0020.0002] -16818 ; [.375A.0020.0002] -16819 ; [.375B.0020.0002] -1681A ; [.375C.0020.0002] -1681B ; [.375D.0020.0002] -1681C ; [.375E.0020.0002] -1681D ; [.375F.0020.0002] -1681E ; [.3760.0020.0002] -1681F ; [.3761.0020.0002] -16820 ; [.3762.0020.0002] -16821 ; [.3763.0020.0002] -16822 ; [.3764.0020.0002] -16823 ; [.3765.0020.0002] -16824 ; [.3766.0020.0002] -16825 ; [.3767.0020.0002] -16826 ; [.3768.0020.0002] -16827 ; [.3769.0020.0002] -16828 ; [.376A.0020.0002] -16829 ; [.376B.0020.0002] -1682A ; [.376C.0020.0002] -1682B ; [.376D.0020.0002] -1682C ; [.376E.0020.0002] -1682D ; [.376F.0020.0002] -1682E ; [.3770.0020.0002] -1682F ; [.3771.0020.0002] -16830 ; [.3772.0020.0002] -16831 ; [.3773.0020.0002] -16832 ; [.3774.0020.0002] -16833 ; [.3775.0020.0002] -16834 ; [.3776.0020.0002] -16835 ; [.3777.0020.0002] -16836 ; [.3778.0020.0002] -16837 ; [.3779.0020.0002] -16838 ; [.377A.0020.0002] -16839 ; [.377B.0020.0002] -1683A ; [.377C.0020.0002] -1683B ; [.377D.0020.0002] -1683C ; [.377E.0020.0002] -1683D ; [.377F.0020.0002] -1683E ; [.3780.0020.0002] -1683F ; [.3781.0020.0002] -16840 ; [.3782.0020.0002] -16841 ; [.3783.0020.0002] -16842 ; [.3784.0020.0002] -16843 ; [.3785.0020.0002] -16844 ; [.3786.0020.0002] -16845 ; [.3787.0020.0002] -16846 ; [.3788.0020.0002] -16847 ; [.3789.0020.0002] -16848 ; [.378A.0020.0002] -16849 ; [.378B.0020.0002] -1684A ; [.378C.0020.0002] -1684B ; [.378D.0020.0002] -1684C ; [.378E.0020.0002] -1684D ; [.378F.0020.0002] -1684E ; [.3790.0020.0002] -1684F ; [.3791.0020.0002] -16850 ; [.3792.0020.0002] -16851 ; [.3793.0020.0002] -16852 ; [.3794.0020.0002] -16853 ; [.3795.0020.0002] -16854 ; [.3796.0020.0002] -16855 ; [.3797.0020.0002] -16856 ; [.3798.0020.0002] -16857 ; [.3799.0020.0002] -16858 ; [.379A.0020.0002] -16859 ; [.379B.0020.0002] -1685A ; [.379C.0020.0002] -1685B ; [.379D.0020.0002] -1685C ; [.379E.0020.0002] -1685D ; [.379F.0020.0002] -1685E ; [.37A0.0020.0002] -1685F ; [.37A1.0020.0002] -16860 ; [.37A2.0020.0002] -16861 ; [.37A3.0020.0002] -16862 ; [.37A4.0020.0002] -16863 ; [.37A5.0020.0002] -16864 ; [.37A6.0020.0002] -16865 ; [.37A7.0020.0002] -16866 ; [.37A8.0020.0002] -16867 ; [.37A9.0020.0002] -16868 ; [.37AA.0020.0002] -16869 ; [.37AB.0020.0002] -1686A ; [.37AC.0020.0002] -1686B ; [.37AD.0020.0002] -1686C ; [.37AE.0020.0002] -1686D ; [.37AF.0020.0002] -1686E ; [.37B0.0020.0002] -1686F ; [.37B1.0020.0002] -16870 ; [.37B2.0020.0002] -16871 ; [.37B3.0020.0002] -16872 ; [.37B4.0020.0002] -16873 ; [.37B5.0020.0002] -16874 ; [.37B6.0020.0002] -16875 ; [.37B7.0020.0002] -16876 ; [.37B8.0020.0002] -16877 ; [.37B9.0020.0002] -16878 ; [.37BA.0020.0002] -16879 ; [.37BB.0020.0002] -1687A ; [.37BC.0020.0002] -1687B ; [.37BD.0020.0002] -1687C ; [.37BE.0020.0002] -1687D ; [.37BF.0020.0002] -1687E ; [.37C0.0020.0002] -1687F ; [.37C1.0020.0002] -16880 ; [.37C2.0020.0002] -16881 ; [.37C3.0020.0002] -16882 ; [.37C4.0020.0002] -16883 ; [.37C5.0020.0002] -16884 ; [.37C6.0020.0002] -16885 ; [.37C7.0020.0002] -16886 ; [.37C8.0020.0002] -16887 ; [.37C9.0020.0002] -16888 ; [.37CA.0020.0002] -16889 ; [.37CB.0020.0002] -1688A ; [.37CC.0020.0002] -1688B ; [.37CD.0020.0002] -1688C ; [.37CE.0020.0002] -1688D ; [.37CF.0020.0002] -1688E ; [.37D0.0020.0002] -1688F ; [.37D1.0020.0002] -16890 ; [.37D2.0020.0002] -16891 ; [.37D3.0020.0002] -16892 ; [.37D4.0020.0002] -16893 ; [.37D5.0020.0002] -16894 ; [.37D6.0020.0002] -16895 ; [.37D7.0020.0002] -16896 ; [.37D8.0020.0002] -16897 ; [.37D9.0020.0002] -16898 ; [.37DA.0020.0002] -16899 ; [.37DB.0020.0002] -1689A ; [.37DC.0020.0002] -1689B ; [.37DD.0020.0002] -1689C ; [.37DE.0020.0002] -1689D ; [.37DF.0020.0002] -1689E ; [.37E0.0020.0002] -1689F ; [.37E1.0020.0002] -168A0 ; [.37E2.0020.0002] -168A1 ; [.37E3.0020.0002] -168A2 ; [.37E4.0020.0002] -168A3 ; [.37E5.0020.0002] -168A4 ; [.37E6.0020.0002] -168A5 ; [.37E7.0020.0002] -168A6 ; [.37E8.0020.0002] -168A7 ; [.37E9.0020.0002] -168A8 ; [.37EA.0020.0002] -168A9 ; [.37EB.0020.0002] -168AA ; [.37EC.0020.0002] -168AB ; [.37ED.0020.0002] -168AC ; [.37EE.0020.0002] -168AD ; [.37EF.0020.0002] -168AE ; [.37F0.0020.0002] -168AF ; [.37F1.0020.0002] -168B0 ; [.37F2.0020.0002] -168B1 ; [.37F3.0020.0002] -168B2 ; [.37F4.0020.0002] -168B3 ; [.37F5.0020.0002] -168B4 ; [.37F6.0020.0002] -168B5 ; [.37F7.0020.0002] -168B6 ; [.37F8.0020.0002] -168B7 ; [.37F9.0020.0002] -168B8 ; [.37FA.0020.0002] -168B9 ; [.37FB.0020.0002] -168BA ; [.37FC.0020.0002] -168BB ; [.37FD.0020.0002] -168BC ; [.37FE.0020.0002] -168BD ; [.37FF.0020.0002] -168BE ; [.3800.0020.0002] -168BF ; [.3801.0020.0002] -168C0 ; [.3802.0020.0002] -168C1 ; [.3803.0020.0002] -168C2 ; [.3804.0020.0002] -168C3 ; [.3805.0020.0002] -168C4 ; [.3806.0020.0002] -168C5 ; [.3807.0020.0002] -168C6 ; [.3808.0020.0002] -168C7 ; [.3809.0020.0002] -168C8 ; [.380A.0020.0002] -168C9 ; [.380B.0020.0002] -168CA ; [.380C.0020.0002] -168CB ; [.380D.0020.0002] -168CC ; [.380E.0020.0002] -168CD ; [.380F.0020.0002] -168CE ; [.3810.0020.0002] -168CF ; [.3811.0020.0002] -168D0 ; [.3812.0020.0002] -168D1 ; [.3813.0020.0002] -168D2 ; [.3814.0020.0002] -168D3 ; [.3815.0020.0002] -168D4 ; [.3816.0020.0002] -168D5 ; [.3817.0020.0002] -168D6 ; [.3818.0020.0002] -168D7 ; [.3819.0020.0002] -168D8 ; [.381A.0020.0002] -168D9 ; [.381B.0020.0002] -168DA ; [.381C.0020.0002] -168DB ; [.381D.0020.0002] -168DC ; [.381E.0020.0002] -168DD ; [.381F.0020.0002] -168DE ; [.3820.0020.0002] -168DF ; [.3821.0020.0002] -168E0 ; [.3822.0020.0002] -168E1 ; [.3823.0020.0002] -168E2 ; [.3824.0020.0002] -168E3 ; [.3825.0020.0002] -168E4 ; [.3826.0020.0002] -168E5 ; [.3827.0020.0002] -168E6 ; [.3828.0020.0002] -168E7 ; [.3829.0020.0002] -168E8 ; [.382A.0020.0002] -168E9 ; [.382B.0020.0002] -168EA ; [.382C.0020.0002] -168EB ; [.382D.0020.0002] -168EC ; [.382E.0020.0002] -168ED ; [.382F.0020.0002] -168EE ; [.3830.0020.0002] -168EF ; [.3831.0020.0002] -168F0 ; [.3832.0020.0002] -168F1 ; [.3833.0020.0002] -168F2 ; [.3834.0020.0002] -168F3 ; [.3835.0020.0002] -168F4 ; [.3836.0020.0002] -168F5 ; [.3837.0020.0002] -168F6 ; [.3838.0020.0002] -168F7 ; [.3839.0020.0002] -168F8 ; [.383A.0020.0002] -168F9 ; [.383B.0020.0002] -168FA ; [.383C.0020.0002] -168FB ; [.383D.0020.0002] -168FC ; [.383E.0020.0002] -168FD ; [.383F.0020.0002] -168FE ; [.3840.0020.0002] -168FF ; [.3841.0020.0002] -16900 ; [.3842.0020.0002] -16901 ; [.3843.0020.0002] -16902 ; [.3844.0020.0002] -16903 ; [.3845.0020.0002] -16904 ; [.3846.0020.0002] -16905 ; [.3847.0020.0002] -16906 ; [.3848.0020.0002] -16907 ; [.3849.0020.0002] -16908 ; [.384A.0020.0002] -16909 ; [.384B.0020.0002] -1690A ; [.384C.0020.0002] -1690B ; [.384D.0020.0002] -1690C ; [.384E.0020.0002] -1690D ; [.384F.0020.0002] -1690E ; [.3850.0020.0002] -1690F ; [.3851.0020.0002] -16910 ; [.3852.0020.0002] -16911 ; [.3853.0020.0002] -16912 ; [.3854.0020.0002] -16913 ; [.3855.0020.0002] -16914 ; [.3856.0020.0002] -16915 ; [.3857.0020.0002] -16916 ; [.3858.0020.0002] -16917 ; [.3859.0020.0002] -16918 ; [.385A.0020.0002] -16919 ; [.385B.0020.0002] -1691A ; [.385C.0020.0002] -1691B ; [.385D.0020.0002] -1691C ; [.385E.0020.0002] -1691D ; [.385F.0020.0002] -1691E ; [.3860.0020.0002] -1691F ; [.3861.0020.0002] -16920 ; [.3862.0020.0002] -16921 ; [.3863.0020.0002] -16922 ; [.3864.0020.0002] -16923 ; [.3865.0020.0002] -16924 ; [.3866.0020.0002] -16925 ; [.3867.0020.0002] -16926 ; [.3868.0020.0002] -16927 ; [.3869.0020.0002] -16928 ; [.386A.0020.0002] -16929 ; [.386B.0020.0002] -1692A ; [.386C.0020.0002] -1692B ; [.386D.0020.0002] -1692C ; [.386E.0020.0002] -1692D ; [.386F.0020.0002] -1692E ; [.3870.0020.0002] -1692F ; [.3871.0020.0002] -16930 ; [.3872.0020.0002] -16931 ; [.3873.0020.0002] -16932 ; [.3874.0020.0002] -16933 ; [.3875.0020.0002] -16934 ; [.3876.0020.0002] -16935 ; [.3877.0020.0002] -16936 ; [.3878.0020.0002] -16937 ; [.3879.0020.0002] -16938 ; [.387A.0020.0002] -16939 ; [.387B.0020.0002] -1693A ; [.387C.0020.0002] -1693B ; [.387D.0020.0002] -1693C ; [.387E.0020.0002] -1693D ; [.387F.0020.0002] -1693E ; [.3880.0020.0002] -1693F ; [.3881.0020.0002] -16940 ; [.3882.0020.0002] -16941 ; [.3883.0020.0002] -16942 ; [.3884.0020.0002] -16943 ; [.3885.0020.0002] -16944 ; [.3886.0020.0002] -16945 ; [.3887.0020.0002] -16946 ; [.3888.0020.0002] -16947 ; [.3889.0020.0002] -16948 ; [.388A.0020.0002] -16949 ; [.388B.0020.0002] -1694A ; [.388C.0020.0002] -1694B ; [.388D.0020.0002] -1694C ; [.388E.0020.0002] -1694D ; [.388F.0020.0002] -1694E ; [.3890.0020.0002] -1694F ; [.3891.0020.0002] -16950 ; [.3892.0020.0002] -16951 ; [.3893.0020.0002] -16952 ; [.3894.0020.0002] -16953 ; [.3895.0020.0002] -16954 ; [.3896.0020.0002] -16955 ; [.3897.0020.0002] -16956 ; [.3898.0020.0002] -16957 ; [.3899.0020.0002] -16958 ; [.389A.0020.0002] -16959 ; [.389B.0020.0002] -1695A ; [.389C.0020.0002] -1695B ; [.389D.0020.0002] -1695C ; [.389E.0020.0002] -1695D ; [.389F.0020.0002] -1695E ; [.38A0.0020.0002] -1695F ; [.38A1.0020.0002] -16960 ; [.38A2.0020.0002] -16961 ; [.38A3.0020.0002] -16962 ; [.38A4.0020.0002] -16963 ; [.38A5.0020.0002] -16964 ; [.38A6.0020.0002] -16965 ; [.38A7.0020.0002] -16966 ; [.38A8.0020.0002] -16967 ; [.38A9.0020.0002] -16968 ; [.38AA.0020.0002] -16969 ; [.38AB.0020.0002] -1696A ; [.38AC.0020.0002] -1696B ; [.38AD.0020.0002] -1696C ; [.38AE.0020.0002] -1696D ; [.38AF.0020.0002] -1696E ; [.38B0.0020.0002] -1696F ; [.38B1.0020.0002] -16970 ; [.38B2.0020.0002] -16971 ; [.38B3.0020.0002] -16972 ; [.38B4.0020.0002] -16973 ; [.38B5.0020.0002] -16974 ; [.38B6.0020.0002] -16975 ; [.38B7.0020.0002] -16976 ; [.38B8.0020.0002] -16977 ; [.38B9.0020.0002] -16978 ; [.38BA.0020.0002] -16979 ; [.38BB.0020.0002] -1697A ; [.38BC.0020.0002] -1697B ; [.38BD.0020.0002] -1697C ; [.38BE.0020.0002] -1697D ; [.38BF.0020.0002] -1697E ; [.38C0.0020.0002] -1697F ; [.38C1.0020.0002] -16980 ; [.38C2.0020.0002] -16981 ; [.38C3.0020.0002] -16982 ; [.38C4.0020.0002] -16983 ; [.38C5.0020.0002] -16984 ; [.38C6.0020.0002] -16985 ; [.38C7.0020.0002] -16986 ; [.38C8.0020.0002] -16987 ; [.38C9.0020.0002] -16988 ; [.38CA.0020.0002] -16989 ; [.38CB.0020.0002] -1698A ; [.38CC.0020.0002] -1698B ; [.38CD.0020.0002] -1698C ; [.38CE.0020.0002] -1698D ; [.38CF.0020.0002] -1698E ; [.38D0.0020.0002] -1698F ; [.38D1.0020.0002] -16990 ; [.38D2.0020.0002] -16991 ; [.38D3.0020.0002] -16992 ; [.38D4.0020.0002] -16993 ; [.38D5.0020.0002] -16994 ; [.38D6.0020.0002] -16995 ; [.38D7.0020.0002] -16996 ; [.38D8.0020.0002] -16997 ; [.38D9.0020.0002] -16998 ; [.38DA.0020.0002] -16999 ; [.38DB.0020.0002] -1699A ; [.38DC.0020.0002] -1699B ; [.38DD.0020.0002] -1699C ; [.38DE.0020.0002] -1699D ; [.38DF.0020.0002] -1699E ; [.38E0.0020.0002] -1699F ; [.38E1.0020.0002] -169A0 ; [.38E2.0020.0002] -169A1 ; [.38E3.0020.0002] -169A2 ; [.38E4.0020.0002] -169A3 ; [.38E5.0020.0002] -169A4 ; [.38E6.0020.0002] -169A5 ; [.38E7.0020.0002] -169A6 ; [.38E8.0020.0002] -169A7 ; [.38E9.0020.0002] -169A8 ; [.38EA.0020.0002] -169A9 ; [.38EB.0020.0002] -169AA ; [.38EC.0020.0002] -169AB ; [.38ED.0020.0002] -169AC ; [.38EE.0020.0002] -169AD ; [.38EF.0020.0002] -169AE ; [.38F0.0020.0002] -169AF ; [.38F1.0020.0002] -169B0 ; [.38F2.0020.0002] -169B1 ; [.38F3.0020.0002] -169B2 ; [.38F4.0020.0002] -169B3 ; [.38F5.0020.0002] -169B4 ; [.38F6.0020.0002] -169B5 ; [.38F7.0020.0002] -169B6 ; [.38F8.0020.0002] -169B7 ; [.38F9.0020.0002] -169B8 ; [.38FA.0020.0002] -169B9 ; [.38FB.0020.0002] -169BA ; [.38FC.0020.0002] -169BB ; [.38FD.0020.0002] -169BC ; [.38FE.0020.0002] -169BD ; [.38FF.0020.0002] -169BE ; [.3900.0020.0002] -169BF ; [.3901.0020.0002] -169C0 ; [.3902.0020.0002] -169C1 ; [.3903.0020.0002] -169C2 ; [.3904.0020.0002] -169C3 ; [.3905.0020.0002] -169C4 ; [.3906.0020.0002] -169C5 ; [.3907.0020.0002] -169C6 ; [.3908.0020.0002] -169C7 ; [.3909.0020.0002] -169C8 ; [.390A.0020.0002] -169C9 ; [.390B.0020.0002] -169CA ; [.390C.0020.0002] -169CB ; [.390D.0020.0002] -169CC ; [.390E.0020.0002] -169CD ; [.390F.0020.0002] -169CE ; [.3910.0020.0002] -169CF ; [.3911.0020.0002] -169D0 ; [.3912.0020.0002] -169D1 ; [.3913.0020.0002] -169D2 ; [.3914.0020.0002] -169D3 ; [.3915.0020.0002] -169D4 ; [.3916.0020.0002] -169D5 ; [.3917.0020.0002] -169D6 ; [.3918.0020.0002] -169D7 ; [.3919.0020.0002] -169D8 ; [.391A.0020.0002] -169D9 ; [.391B.0020.0002] -169DA ; [.391C.0020.0002] -169DB ; [.391D.0020.0002] -169DC ; [.391E.0020.0002] -169DD ; [.391F.0020.0002] -169DE ; [.3920.0020.0002] -169DF ; [.3921.0020.0002] -169E0 ; [.3922.0020.0002] -169E1 ; [.3923.0020.0002] -169E2 ; [.3924.0020.0002] -169E3 ; [.3925.0020.0002] -169E4 ; [.3926.0020.0002] -169E5 ; [.3927.0020.0002] -169E6 ; [.3928.0020.0002] -169E7 ; [.3929.0020.0002] -169E8 ; [.392A.0020.0002] -169E9 ; [.392B.0020.0002] -169EA ; [.392C.0020.0002] -169EB ; [.392D.0020.0002] -169EC ; [.392E.0020.0002] -169ED ; [.392F.0020.0002] -169EE ; [.3930.0020.0002] -169EF ; [.3931.0020.0002] -169F0 ; [.3932.0020.0002] -169F1 ; [.3933.0020.0002] -169F2 ; [.3934.0020.0002] -169F3 ; [.3935.0020.0002] -169F4 ; [.3936.0020.0002] -169F5 ; [.3937.0020.0002] -169F6 ; [.3938.0020.0002] -169F7 ; [.3939.0020.0002] -169F8 ; [.393A.0020.0002] -169F9 ; [.393B.0020.0002] -169FA ; [.393C.0020.0002] -169FB ; [.393D.0020.0002] -169FC ; [.393E.0020.0002] -169FD ; [.393F.0020.0002] -169FE ; [.3940.0020.0002] -169FF ; [.3941.0020.0002] -16A00 ; [.3942.0020.0002] -16A01 ; [.3943.0020.0002] -16A02 ; [.3944.0020.0002] -16A03 ; [.3945.0020.0002] -16A04 ; [.3946.0020.0002] -16A05 ; [.3947.0020.0002] -16A06 ; [.3948.0020.0002] -16A07 ; [.3949.0020.0002] -16A08 ; [.394A.0020.0002] -16A09 ; [.394B.0020.0002] -16A0A ; [.394C.0020.0002] -16A0B ; [.394D.0020.0002] -16A0C ; [.394E.0020.0002] -16A0D ; [.394F.0020.0002] -16A0E ; [.3950.0020.0002] -16A0F ; [.3951.0020.0002] -16A10 ; [.3952.0020.0002] -16A11 ; [.3953.0020.0002] -16A12 ; [.3954.0020.0002] -16A13 ; [.3955.0020.0002] -16A14 ; [.3956.0020.0002] -16A15 ; [.3957.0020.0002] -16A16 ; [.3958.0020.0002] -16A17 ; [.3959.0020.0002] -16A18 ; [.395A.0020.0002] -16A19 ; [.395B.0020.0002] -16A1A ; [.395C.0020.0002] -16A1B ; [.395D.0020.0002] -16A1C ; [.395E.0020.0002] -16A1D ; [.395F.0020.0002] -16A1E ; [.3960.0020.0002] -16A1F ; [.3961.0020.0002] -16A20 ; [.3962.0020.0002] -16A21 ; [.3963.0020.0002] -16A22 ; [.3964.0020.0002] -16A23 ; [.3965.0020.0002] -16A24 ; [.3966.0020.0002] -16A25 ; [.3967.0020.0002] -16A26 ; [.3968.0020.0002] -16A27 ; [.3969.0020.0002] -16A28 ; [.396A.0020.0002] -16A29 ; [.396B.0020.0002] -16A2A ; [.396C.0020.0002] -16A2B ; [.396D.0020.0002] -16A2C ; [.396E.0020.0002] -16A2D ; [.396F.0020.0002] -16A2E ; [.3970.0020.0002] -16A2F ; [.3971.0020.0002] -16A30 ; [.3972.0020.0002] -16A31 ; [.3973.0020.0002] -16A32 ; [.3974.0020.0002] -16A33 ; [.3975.0020.0002] -16A34 ; [.3976.0020.0002] -16A35 ; [.3977.0020.0002] -16A36 ; [.3978.0020.0002] -16A37 ; [.3979.0020.0002] -16A38 ; [.397A.0020.0002] -16AD0 ; [.397B.0020.0002] -16AD1 ; [.397C.0020.0002] -16AD2 ; [.397D.0020.0002] -16AD3 ; [.397E.0020.0002] -16AD4 ; [.397F.0020.0002] -16AD5 ; [.3980.0020.0002] -16AD6 ; [.3981.0020.0002] -16AD7 ; [.3982.0020.0002] -16AD8 ; [.3983.0020.0002] -16AD9 ; [.3984.0020.0002] -16ADA ; [.3985.0020.0002] -16ADB ; [.3986.0020.0002] -16ADC ; [.3987.0020.0002] -16ADD ; [.3988.0020.0002] -16ADE ; [.3989.0020.0002] -16ADF ; [.398A.0020.0002] -16AE0 ; [.398B.0020.0002] -16AE1 ; [.398C.0020.0002] -16AE2 ; [.398D.0020.0002] -16AE3 ; [.398E.0020.0002] -16AE4 ; [.398F.0020.0002] -16AE5 ; [.3990.0020.0002] -16AE6 ; [.3991.0020.0002] -16AE7 ; [.3992.0020.0002] -16AE8 ; [.3993.0020.0002] -16AE9 ; [.3994.0020.0002] -16AEA ; [.3995.0020.0002] -16AEB ; [.3996.0020.0002] -16AEC ; [.3997.0020.0002] -16AED ; [.3998.0020.0002] -1E800 ; [.3999.0020.0002] -1E801 ; [.399A.0020.0002] -1E802 ; [.399B.0020.0002] -1E803 ; [.399C.0020.0002] -1E804 ; [.399D.0020.0002] -1E805 ; [.399E.0020.0002] -1E806 ; [.399F.0020.0002] -1E807 ; [.39A0.0020.0002] -1E808 ; [.39A1.0020.0002] -1E809 ; [.39A2.0020.0002] -1E80A ; [.39A3.0020.0002] -1E80B ; [.39A4.0020.0002] -1E80C ; [.39A5.0020.0002] -1E80D ; [.39A6.0020.0002] -1E80E ; [.39A7.0020.0002] -1E80F ; [.39A8.0020.0002] -1E810 ; [.39A9.0020.0002] -1E811 ; [.39AA.0020.0002] -1E812 ; [.39AB.0020.0002] -1E813 ; [.39AC.0020.0002] -1E814 ; [.39AD.0020.0002] -1E815 ; [.39AE.0020.0002] -1E816 ; [.39AF.0020.0002] -1E817 ; [.39B0.0020.0002] -1E818 ; [.39B1.0020.0002] -1E819 ; [.39B2.0020.0002] -1E81A ; [.39B3.0020.0002] -1E81B ; [.39B4.0020.0002] -1E81C ; [.39B5.0020.0002] -1E81D ; [.39B6.0020.0002] -1E81E ; [.39B7.0020.0002] -1E81F ; [.39B8.0020.0002] -1E820 ; [.39B9.0020.0002] -1E821 ; [.39BA.0020.0002] -1E822 ; [.39BB.0020.0002] -1E823 ; [.39BC.0020.0002] -1E824 ; [.39BD.0020.0002] -1E825 ; [.39BE.0020.0002] -1E826 ; [.39BF.0020.0002] -1E827 ; [.39C0.0020.0002] -1E828 ; [.39C1.0020.0002] -1E829 ; [.39C2.0020.0002] -1E82A ; [.39C3.0020.0002] -1E82B ; [.39C4.0020.0002] -1E82C ; [.39C5.0020.0002] -1E82D ; [.39C6.0020.0002] -1E82E ; [.39C7.0020.0002] -1E82F ; [.39C8.0020.0002] -1E830 ; [.39C9.0020.0002] -1E831 ; [.39CA.0020.0002] -1E832 ; [.39CB.0020.0002] -1E833 ; [.39CC.0020.0002] -1E834 ; [.39CD.0020.0002] -1E835 ; [.39CE.0020.0002] -1E836 ; [.39CF.0020.0002] -1E837 ; [.39D0.0020.0002] -1E838 ; [.39D1.0020.0002] -1E839 ; [.39D2.0020.0002] -1E83A ; [.39D3.0020.0002] -1E83B ; [.39D4.0020.0002] -1E83C ; [.39D5.0020.0002] -1E83D ; [.39D6.0020.0002] -1E83E ; [.39D7.0020.0002] -1E83F ; [.39D8.0020.0002] -1E840 ; [.39D9.0020.0002] -1E841 ; [.39DA.0020.0002] -1E842 ; [.39DB.0020.0002] -1E843 ; [.39DC.0020.0002] -1E844 ; [.39DD.0020.0002] -1E845 ; [.39DE.0020.0002] -1E846 ; [.39DF.0020.0002] -1E847 ; [.39E0.0020.0002] -1E848 ; [.39E1.0020.0002] -1E849 ; [.39E2.0020.0002] -1E84A ; [.39E3.0020.0002] -1E84B ; [.39E4.0020.0002] -1E84C ; [.39E5.0020.0002] -1E84D ; [.39E6.0020.0002] -1E84E ; [.39E7.0020.0002] -1E84F ; [.39E8.0020.0002] -1E850 ; [.39E9.0020.0002] -1E851 ; [.39EA.0020.0002] -1E852 ; [.39EB.0020.0002] -1E853 ; [.39EC.0020.0002] -1E854 ; [.39ED.0020.0002] -1E855 ; [.39EE.0020.0002] -1E856 ; [.39EF.0020.0002] -1E857 ; [.39F0.0020.0002] -1E858 ; [.39F1.0020.0002] -1E859 ; [.39F2.0020.0002] -1E85A ; [.39F3.0020.0002] -1E85B ; [.39F4.0020.0002] -1E85C ; [.39F5.0020.0002] -1E85D ; [.39F6.0020.0002] -1E85E ; [.39F7.0020.0002] -1E85F ; [.39F8.0020.0002] -1E860 ; [.39F9.0020.0002] -1E861 ; [.39FA.0020.0002] -1E862 ; [.39FB.0020.0002] -1E863 ; [.39FC.0020.0002] -1E864 ; [.39FD.0020.0002] -1E865 ; [.39FE.0020.0002] -1E866 ; [.39FF.0020.0002] -1E867 ; [.3A00.0020.0002] -1E868 ; [.3A01.0020.0002] -1E869 ; [.3A02.0020.0002] -1E86A ; [.3A03.0020.0002] -1E86B ; [.3A04.0020.0002] -1E86C ; [.3A05.0020.0002] -1E86D ; [.3A06.0020.0002] -1E86E ; [.3A07.0020.0002] -1E86F ; [.3A08.0020.0002] -1E870 ; [.3A09.0020.0002] -1E871 ; [.3A0A.0020.0002] -1E872 ; [.3A0B.0020.0002] -1E873 ; [.3A0C.0020.0002] -1E874 ; [.3A0D.0020.0002] -1E875 ; [.3A0E.0020.0002] -1E876 ; [.3A0F.0020.0002] -1E877 ; [.3A10.0020.0002] -1E878 ; [.3A11.0020.0002] -1E879 ; [.3A12.0020.0002] -1E87A ; [.3A13.0020.0002] -1E87B ; [.3A14.0020.0002] -1E87C ; [.3A15.0020.0002] -1E87D ; [.3A16.0020.0002] -1E87E ; [.3A17.0020.0002] -1E87F ; [.3A18.0020.0002] -1E880 ; [.3A19.0020.0002] -1E881 ; [.3A1A.0020.0002] -1E882 ; [.3A1B.0020.0002] -1E883 ; [.3A1C.0020.0002] -1E884 ; [.3A1D.0020.0002] -1E885 ; [.3A1E.0020.0002] -1E886 ; [.3A1F.0020.0002] -1E887 ; [.3A20.0020.0002] -1E888 ; [.3A21.0020.0002] -1E889 ; [.3A22.0020.0002] -1E88A ; [.3A23.0020.0002] -1E88B ; [.3A24.0020.0002] -1E88C ; [.3A25.0020.0002] -1E88D ; [.3A26.0020.0002] -1E88E ; [.3A27.0020.0002] -1E88F ; [.3A28.0020.0002] -1E890 ; [.3A29.0020.0002] -1E891 ; [.3A2A.0020.0002] -1E892 ; [.3A2B.0020.0002] -1E893 ; [.3A2C.0020.0002] -1E894 ; [.3A2D.0020.0002] -1E895 ; [.3A2E.0020.0002] -1E896 ; [.3A2F.0020.0002] -1E897 ; [.3A30.0020.0002] -1E898 ; [.3A31.0020.0002] -1E899 ; [.3A32.0020.0002] -1E89A ; [.3A33.0020.0002] -1E89B ; [.3A34.0020.0002] -1E89C ; [.3A35.0020.0002] -1E89D ; [.3A36.0020.0002] -1E89E ; [.3A37.0020.0002] -1E89F ; [.3A38.0020.0002] -1E8A0 ; [.3A39.0020.0002] -1E8A1 ; [.3A3A.0020.0002] -1E8A2 ; [.3A3B.0020.0002] -1E8A3 ; [.3A3C.0020.0002] -1E8A4 ; [.3A3D.0020.0002] -1E8A5 ; [.3A3E.0020.0002] -1E8A6 ; [.3A3F.0020.0002] -1E8A7 ; [.3A40.0020.0002] -1E8A8 ; [.3A41.0020.0002] -1E8A9 ; [.3A42.0020.0002] -1E8AA ; [.3A43.0020.0002] -1E8AB ; [.3A44.0020.0002] -1E8AC ; [.3A45.0020.0002] -1E8AD ; [.3A46.0020.0002] -1E8AE ; [.3A47.0020.0002] -1E8AF ; [.3A48.0020.0002] -1E8B0 ; [.3A49.0020.0002] -1E8B1 ; [.3A4A.0020.0002] -1E8B2 ; [.3A4B.0020.0002] -1E8B3 ; [.3A4C.0020.0002] -1E8B4 ; [.3A4D.0020.0002] -1E8B5 ; [.3A4E.0020.0002] -1E8B6 ; [.3A4F.0020.0002] -1E8B7 ; [.3A50.0020.0002] -1E8B8 ; [.3A51.0020.0002] -1E8B9 ; [.3A52.0020.0002] -1E8BA ; [.3A53.0020.0002] -1E8BB ; [.3A54.0020.0002] -1E8BC ; [.3A55.0020.0002] -1E8BD ; [.3A56.0020.0002] -1E8BE ; [.3A57.0020.0002] -1E8BF ; [.3A58.0020.0002] -1E8C0 ; [.3A59.0020.0002] -1E8C1 ; [.3A5A.0020.0002] -1E8C2 ; [.3A5B.0020.0002] -1E8C3 ; [.3A5C.0020.0002] -1E8C4 ; [.3A5D.0020.0002] -1100 ; [.3A5E.0020.0002] -3131 ; [.3A5E.0020.0004] -3200 ; [*0310.0020.0004][.3A5E.0020.0004][*0311.0020.0004] -3260 ; [.3A5E.0020.0006] -FFA1 ; [.3A5E.0020.0012] -320E ; [*0310.0020.0004][.3A5E.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -326E ; [.3A5E.0020.0006][.3ADC.0020.0006] -1101 ; [.3A5F.0020.0002] -3132 ; [.3A5F.0020.0004] -FFA2 ; [.3A5F.0020.0012] -1102 ; [.3A60.0020.0002] -3134 ; [.3A60.0020.0004] -3201 ; [*0310.0020.0004][.3A60.0020.0004][*0311.0020.0004] -3261 ; [.3A60.0020.0006] -FFA4 ; [.3A60.0020.0012] -320F ; [*0310.0020.0004][.3A60.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -326F ; [.3A60.0020.0006][.3ADC.0020.0006] -1103 ; [.3A61.0020.0002] -3137 ; [.3A61.0020.0004] -3202 ; [*0310.0020.0004][.3A61.0020.0004][*0311.0020.0004] -3262 ; [.3A61.0020.0006] -FFA7 ; [.3A61.0020.0012] -3210 ; [*0310.0020.0004][.3A61.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3270 ; [.3A61.0020.0006][.3ADC.0020.0006] -1104 ; [.3A62.0020.0002] -3138 ; [.3A62.0020.0004] -FFA8 ; [.3A62.0020.0012] -1105 ; [.3A63.0020.0002] -3139 ; [.3A63.0020.0004] -3203 ; [*0310.0020.0004][.3A63.0020.0004][*0311.0020.0004] -3263 ; [.3A63.0020.0006] -FFA9 ; [.3A63.0020.0012] -3211 ; [*0310.0020.0004][.3A63.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3271 ; [.3A63.0020.0006][.3ADC.0020.0006] -1106 ; [.3A64.0020.0002] -3141 ; [.3A64.0020.0004] -3204 ; [*0310.0020.0004][.3A64.0020.0004][*0311.0020.0004] -3264 ; [.3A64.0020.0006] -FFB1 ; [.3A64.0020.0012] -3212 ; [*0310.0020.0004][.3A64.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3272 ; [.3A64.0020.0006][.3ADC.0020.0006] -1107 ; [.3A65.0020.0002] -3142 ; [.3A65.0020.0004] -3205 ; [*0310.0020.0004][.3A65.0020.0004][*0311.0020.0004] -3265 ; [.3A65.0020.0006] -FFB2 ; [.3A65.0020.0012] -3213 ; [*0310.0020.0004][.3A65.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3273 ; [.3A65.0020.0006][.3ADC.0020.0006] -1108 ; [.3A66.0020.0002] -3143 ; [.3A66.0020.0004] -FFB3 ; [.3A66.0020.0012] -1109 ; [.3A67.0020.0002] -3145 ; [.3A67.0020.0004] -3206 ; [*0310.0020.0004][.3A67.0020.0004][*0311.0020.0004] -3266 ; [.3A67.0020.0006] -FFB5 ; [.3A67.0020.0012] -3214 ; [*0310.0020.0004][.3A67.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3274 ; [.3A67.0020.0006][.3ADC.0020.0006] -110A ; [.3A68.0020.0002] -3146 ; [.3A68.0020.0004] -FFB6 ; [.3A68.0020.0012] -110B ; [.3A69.0020.0002] -3147 ; [.3A69.0020.0004] -3207 ; [*0310.0020.0004][.3A69.0020.0004][*0311.0020.0004] -3267 ; [.3A69.0020.0006] -FFB7 ; [.3A69.0020.0012] -3215 ; [*0310.0020.0004][.3A69.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3275 ; [.3A69.0020.0006][.3ADC.0020.0006] -321D ; [*0310.0020.0004][.3A69.0020.0004][.3AE4.0020.0004][.3A6A.0020.0004][.3AE0.0020.0004][.3B3D.0020.0004][*0311.0020.0004] -321E ; [*0310.0020.0004][.3A69.0020.0004][.3AE4.0020.0004][.3A70.0020.0004][.3AE9.0020.0004][*0311.0020.0004] -327E ; [.3A69.0020.0006][.3AE9.0020.0006] -110C ; [.3A6A.0020.0002] -3148 ; [.3A6A.0020.0004] -3208 ; [*0310.0020.0004][.3A6A.0020.0004][*0311.0020.0004] -3268 ; [.3A6A.0020.0006] -FFB8 ; [.3A6A.0020.0012] -3216 ; [*0310.0020.0004][.3A6A.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3276 ; [.3A6A.0020.0006][.3ADC.0020.0006] -321C ; [*0310.0020.0004][.3A6A.0020.0004][.3AE9.0020.0004][*0311.0020.0004] -327D ; [.3A6A.0020.0006][.3AE9.0020.0006][.3A69.0020.0006][.3AEF.0020.0006] -110D ; [.3A6B.0020.0002] -3149 ; [.3A6B.0020.0004] -FFB9 ; [.3A6B.0020.0012] -110E ; [.3A6C.0020.0002] -314A ; [.3A6C.0020.0004] -3209 ; [*0310.0020.0004][.3A6C.0020.0004][*0311.0020.0004] -3269 ; [.3A6C.0020.0006] -FFBA ; [.3A6C.0020.0012] -3217 ; [*0310.0020.0004][.3A6C.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3277 ; [.3A6C.0020.0006][.3ADC.0020.0006] -327C ; [.3A6C.0020.0006][.3ADC.0020.0006][.3B49.0020.0006][.3A5E.0020.0006][.3AE4.0020.0006] -110F ; [.3A6D.0020.0002] -314B ; [.3A6D.0020.0004] -320A ; [*0310.0020.0004][.3A6D.0020.0004][*0311.0020.0004] -326A ; [.3A6D.0020.0006] -FFBB ; [.3A6D.0020.0012] -3218 ; [*0310.0020.0004][.3A6D.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3278 ; [.3A6D.0020.0006][.3ADC.0020.0006] -1110 ; [.3A6E.0020.0002] -314C ; [.3A6E.0020.0004] -320B ; [*0310.0020.0004][.3A6E.0020.0004][*0311.0020.0004] -326B ; [.3A6E.0020.0006] -FFBC ; [.3A6E.0020.0012] -3219 ; [*0310.0020.0004][.3A6E.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -3279 ; [.3A6E.0020.0006][.3ADC.0020.0006] -1111 ; [.3A6F.0020.0002] -314D ; [.3A6F.0020.0004] -320C ; [*0310.0020.0004][.3A6F.0020.0004][*0311.0020.0004] -326C ; [.3A6F.0020.0006] -FFBD ; [.3A6F.0020.0012] -321A ; [*0310.0020.0004][.3A6F.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -327A ; [.3A6F.0020.0006][.3ADC.0020.0006] -1112 ; [.3A70.0020.0002] -314E ; [.3A70.0020.0004] -320D ; [*0310.0020.0004][.3A70.0020.0004][*0311.0020.0004] -326D ; [.3A70.0020.0006] -FFBE ; [.3A70.0020.0012] -321B ; [*0310.0020.0004][.3A70.0020.0004][.3ADC.0020.0004][*0311.0020.0004] -327B ; [.3A70.0020.0006][.3ADC.0020.0006] -1113 ; [.3A71.0020.0002] -1114 ; [.3A72.0020.0002] -3165 ; [.3A72.0020.0004] -1115 ; [.3A73.0020.0002] -3166 ; [.3A73.0020.0004] -1116 ; [.3A74.0020.0002] -1117 ; [.3A75.0020.0002] -1118 ; [.3A76.0020.0002] -1119 ; [.3A77.0020.0002] -111A ; [.3A78.0020.0002] -3140 ; [.3A78.0020.0004] -FFB0 ; [.3A78.0020.0012] -111B ; [.3A79.0020.0002] -111C ; [.3A7A.0020.0002] -316E ; [.3A7A.0020.0004] -111D ; [.3A7B.0020.0002] -3171 ; [.3A7B.0020.0004] -111E ; [.3A7C.0020.0002] -3172 ; [.3A7C.0020.0004] -111F ; [.3A7D.0020.0002] -1120 ; [.3A7E.0020.0002] -3173 ; [.3A7E.0020.0004] -1121 ; [.3A7F.0020.0002] -3144 ; [.3A7F.0020.0004] -FFB4 ; [.3A7F.0020.0012] -1122 ; [.3A80.0020.0002] -3174 ; [.3A80.0020.0004] -1123 ; [.3A81.0020.0002] -3175 ; [.3A81.0020.0004] -1124 ; [.3A82.0020.0002] -1125 ; [.3A83.0020.0002] -1126 ; [.3A84.0020.0002] -1127 ; [.3A85.0020.0002] -3176 ; [.3A85.0020.0004] -1128 ; [.3A86.0020.0002] -1129 ; [.3A87.0020.0002] -3177 ; [.3A87.0020.0004] -112A ; [.3A88.0020.0002] -112B ; [.3A89.0020.0002] -3178 ; [.3A89.0020.0004] -112C ; [.3A8A.0020.0002] -3179 ; [.3A8A.0020.0004] -112D ; [.3A8B.0020.0002] -317A ; [.3A8B.0020.0004] -112E ; [.3A8C.0020.0002] -317B ; [.3A8C.0020.0004] -112F ; [.3A8D.0020.0002] -317C ; [.3A8D.0020.0004] -1130 ; [.3A8E.0020.0002] -1131 ; [.3A8F.0020.0002] -1132 ; [.3A90.0020.0002] -317D ; [.3A90.0020.0004] -1133 ; [.3A91.0020.0002] -1134 ; [.3A92.0020.0002] -1135 ; [.3A93.0020.0002] -1136 ; [.3A94.0020.0002] -317E ; [.3A94.0020.0004] -1137 ; [.3A95.0020.0002] -1138 ; [.3A96.0020.0002] -1139 ; [.3A97.0020.0002] -113A ; [.3A98.0020.0002] -113B ; [.3A99.0020.0002] -113C ; [.3A9A.0020.0002] -113D ; [.3A9B.0020.0002] -113E ; [.3A9C.0020.0002] -113F ; [.3A9D.0020.0002] -1140 ; [.3A9E.0020.0002] -317F ; [.3A9E.0020.0004] -1141 ; [.3A9F.0020.0002] -1142 ; [.3AA0.0020.0002] -1143 ; [.3AA1.0020.0002] -1144 ; [.3AA2.0020.0002] -1145 ; [.3AA3.0020.0002] -1146 ; [.3AA4.0020.0002] -1147 ; [.3AA5.0020.0002] -3180 ; [.3AA5.0020.0004] -1148 ; [.3AA6.0020.0002] -1149 ; [.3AA7.0020.0002] -114A ; [.3AA8.0020.0002] -114B ; [.3AA9.0020.0002] -114C ; [.3AAA.0020.0002] -3181 ; [.3AAA.0020.0004] -114D ; [.3AAB.0020.0002] -114E ; [.3AAC.0020.0002] -114F ; [.3AAD.0020.0002] -1150 ; [.3AAE.0020.0002] -1151 ; [.3AAF.0020.0002] -1152 ; [.3AB0.0020.0002] -1153 ; [.3AB1.0020.0002] -1154 ; [.3AB2.0020.0002] -1155 ; [.3AB3.0020.0002] -1156 ; [.3AB4.0020.0002] -1157 ; [.3AB5.0020.0002] -3184 ; [.3AB5.0020.0004] -1158 ; [.3AB6.0020.0002] -3185 ; [.3AB6.0020.0004] -1159 ; [.3AB7.0020.0002] -3186 ; [.3AB7.0020.0004] -115A ; [.3AB8.0020.0002] -115B ; [.3AB9.0020.0002] -115C ; [.3ABA.0020.0002] -115D ; [.3ABB.0020.0002] -115E ; [.3ABC.0020.0002] -A960 ; [.3ABD.0020.0002] -A961 ; [.3ABE.0020.0002] -A962 ; [.3ABF.0020.0002] -A963 ; [.3AC0.0020.0002] -A964 ; [.3AC1.0020.0002] -A965 ; [.3AC2.0020.0002] -A966 ; [.3AC3.0020.0002] -A967 ; [.3AC4.0020.0002] -A968 ; [.3AC5.0020.0002] -A969 ; [.3AC6.0020.0002] -A96A ; [.3AC7.0020.0002] -A96B ; [.3AC8.0020.0002] -A96C ; [.3AC9.0020.0002] -A96D ; [.3ACA.0020.0002] -A96E ; [.3ACB.0020.0002] -A96F ; [.3ACC.0020.0002] -A970 ; [.3ACD.0020.0002] -A971 ; [.3ACE.0020.0002] -A972 ; [.3ACF.0020.0002] -A973 ; [.3AD0.0020.0002] -A974 ; [.3AD1.0020.0002] -A975 ; [.3AD2.0020.0002] -A976 ; [.3AD3.0020.0002] -A977 ; [.3AD4.0020.0002] -A978 ; [.3AD5.0020.0002] -A979 ; [.3AD6.0020.0002] -A97A ; [.3AD7.0020.0002] -A97B ; [.3AD8.0020.0002] -A97C ; [.3AD9.0020.0002] -115F ; [.3ADA.0020.0002] -1160 ; [.3ADB.0020.0002] -3164 ; [.3ADB.0020.0004] -FFA0 ; [.3ADB.0020.0012] -1161 ; [.3ADC.0020.0002] -314F ; [.3ADC.0020.0004] -FFC2 ; [.3ADC.0020.0012] -1162 ; [.3ADD.0020.0002] -3150 ; [.3ADD.0020.0004] -FFC3 ; [.3ADD.0020.0012] -1163 ; [.3ADE.0020.0002] -3151 ; [.3ADE.0020.0004] -FFC4 ; [.3ADE.0020.0012] -1164 ; [.3ADF.0020.0002] -3152 ; [.3ADF.0020.0004] -FFC5 ; [.3ADF.0020.0012] -1165 ; [.3AE0.0020.0002] -3153 ; [.3AE0.0020.0004] -FFC6 ; [.3AE0.0020.0012] -1166 ; [.3AE1.0020.0002] -3154 ; [.3AE1.0020.0004] -FFC7 ; [.3AE1.0020.0012] -1167 ; [.3AE2.0020.0002] -3155 ; [.3AE2.0020.0004] -FFCA ; [.3AE2.0020.0012] -1168 ; [.3AE3.0020.0002] -3156 ; [.3AE3.0020.0004] -FFCB ; [.3AE3.0020.0012] -1169 ; [.3AE4.0020.0002] -3157 ; [.3AE4.0020.0004] -FFCC ; [.3AE4.0020.0012] -116A ; [.3AE5.0020.0002] -3158 ; [.3AE5.0020.0004] -FFCD ; [.3AE5.0020.0012] -116B ; [.3AE6.0020.0002] -3159 ; [.3AE6.0020.0004] -FFCE ; [.3AE6.0020.0012] -116C ; [.3AE7.0020.0002] -315A ; [.3AE7.0020.0004] -FFCF ; [.3AE7.0020.0012] -116D ; [.3AE8.0020.0002] -315B ; [.3AE8.0020.0004] -FFD2 ; [.3AE8.0020.0012] -116E ; [.3AE9.0020.0002] -315C ; [.3AE9.0020.0004] -FFD3 ; [.3AE9.0020.0012] -116F ; [.3AEA.0020.0002] -315D ; [.3AEA.0020.0004] -FFD4 ; [.3AEA.0020.0012] -1170 ; [.3AEB.0020.0002] -315E ; [.3AEB.0020.0004] -FFD5 ; [.3AEB.0020.0012] -1171 ; [.3AEC.0020.0002] -315F ; [.3AEC.0020.0004] -FFD6 ; [.3AEC.0020.0012] -1172 ; [.3AED.0020.0002] -3160 ; [.3AED.0020.0004] -FFD7 ; [.3AED.0020.0012] -1173 ; [.3AEE.0020.0002] -3161 ; [.3AEE.0020.0004] -FFDA ; [.3AEE.0020.0012] -1174 ; [.3AEF.0020.0002] -3162 ; [.3AEF.0020.0004] -FFDB ; [.3AEF.0020.0012] -1175 ; [.3AF0.0020.0002] -3163 ; [.3AF0.0020.0004] -FFDC ; [.3AF0.0020.0012] -1176 ; [.3AF1.0020.0002] -1177 ; [.3AF2.0020.0002] -1178 ; [.3AF3.0020.0002] -1179 ; [.3AF4.0020.0002] -117A ; [.3AF5.0020.0002] -117B ; [.3AF6.0020.0002] -117C ; [.3AF7.0020.0002] -117D ; [.3AF8.0020.0002] -117E ; [.3AF9.0020.0002] -117F ; [.3AFA.0020.0002] -1180 ; [.3AFB.0020.0002] -1181 ; [.3AFC.0020.0002] -1182 ; [.3AFD.0020.0002] -1183 ; [.3AFE.0020.0002] -1184 ; [.3AFF.0020.0002] -3187 ; [.3AFF.0020.0004] -1185 ; [.3B00.0020.0002] -3188 ; [.3B00.0020.0004] -1186 ; [.3B01.0020.0002] -1187 ; [.3B02.0020.0002] -1188 ; [.3B03.0020.0002] -3189 ; [.3B03.0020.0004] -1189 ; [.3B04.0020.0002] -118A ; [.3B05.0020.0002] -118B ; [.3B06.0020.0002] -118C ; [.3B07.0020.0002] -118D ; [.3B08.0020.0002] -118E ; [.3B09.0020.0002] -118F ; [.3B0A.0020.0002] -1190 ; [.3B0B.0020.0002] -1191 ; [.3B0C.0020.0002] -318A ; [.3B0C.0020.0004] -1192 ; [.3B0D.0020.0002] -318B ; [.3B0D.0020.0004] -1193 ; [.3B0E.0020.0002] -1194 ; [.3B0F.0020.0002] -318C ; [.3B0F.0020.0004] -1195 ; [.3B10.0020.0002] -1196 ; [.3B11.0020.0002] -1197 ; [.3B12.0020.0002] -1198 ; [.3B13.0020.0002] -1199 ; [.3B14.0020.0002] -119A ; [.3B15.0020.0002] -119B ; [.3B16.0020.0002] -119C ; [.3B17.0020.0002] -119D ; [.3B18.0020.0002] -119E ; [.3B19.0020.0002] -318D ; [.3B19.0020.0004] -119F ; [.3B1A.0020.0002] -11A0 ; [.3B1B.0020.0002] -11A1 ; [.3B1C.0020.0002] -318E ; [.3B1C.0020.0004] -11A2 ; [.3B1D.0020.0002] -11A3 ; [.3B1E.0020.0002] -11A4 ; [.3B1F.0020.0002] -11A5 ; [.3B20.0020.0002] -11A6 ; [.3B21.0020.0002] -11A7 ; [.3B22.0020.0002] -D7B0 ; [.3B23.0020.0002] -D7B1 ; [.3B24.0020.0002] -D7B2 ; [.3B25.0020.0002] -D7B3 ; [.3B26.0020.0002] -D7B4 ; [.3B27.0020.0002] -D7B5 ; [.3B28.0020.0002] -D7B6 ; [.3B29.0020.0002] -D7B7 ; [.3B2A.0020.0002] -D7B8 ; [.3B2B.0020.0002] -D7B9 ; [.3B2C.0020.0002] -D7BA ; [.3B2D.0020.0002] -D7BB ; [.3B2E.0020.0002] -D7BC ; [.3B2F.0020.0002] -D7BD ; [.3B30.0020.0002] -D7BE ; [.3B31.0020.0002] -D7BF ; [.3B32.0020.0002] -D7C0 ; [.3B33.0020.0002] -D7C1 ; [.3B34.0020.0002] -D7C2 ; [.3B35.0020.0002] -D7C3 ; [.3B36.0020.0002] -D7C4 ; [.3B37.0020.0002] -D7C5 ; [.3B38.0020.0002] -D7C6 ; [.3B39.0020.0002] -11A8 ; [.3B3A.0020.0002] -11A9 ; [.3B3B.0020.0002] -11AA ; [.3B3C.0020.0002] -3133 ; [.3B3C.0020.0004] -FFA3 ; [.3B3C.0020.0012] -11AB ; [.3B3D.0020.0002] -11AC ; [.3B3E.0020.0002] -3135 ; [.3B3E.0020.0004] -FFA5 ; [.3B3E.0020.0012] -11AD ; [.3B3F.0020.0002] -3136 ; [.3B3F.0020.0004] -FFA6 ; [.3B3F.0020.0012] -11AE ; [.3B40.0020.0002] -11AF ; [.3B41.0020.0002] -11B0 ; [.3B42.0020.0002] -313A ; [.3B42.0020.0004] -FFAA ; [.3B42.0020.0012] -11B1 ; [.3B43.0020.0002] -313B ; [.3B43.0020.0004] -FFAB ; [.3B43.0020.0012] -11B2 ; [.3B44.0020.0002] -313C ; [.3B44.0020.0004] -FFAC ; [.3B44.0020.0012] -11B3 ; [.3B45.0020.0002] -313D ; [.3B45.0020.0004] -FFAD ; [.3B45.0020.0012] -11B4 ; [.3B46.0020.0002] -313E ; [.3B46.0020.0004] -FFAE ; [.3B46.0020.0012] -11B5 ; [.3B47.0020.0002] -313F ; [.3B47.0020.0004] -FFAF ; [.3B47.0020.0012] -11B6 ; [.3B48.0020.0002] -11B7 ; [.3B49.0020.0002] -11B8 ; [.3B4A.0020.0002] -11B9 ; [.3B4B.0020.0002] -11BA ; [.3B4C.0020.0002] -11BB ; [.3B4D.0020.0002] -11BC ; [.3B4E.0020.0002] -11BD ; [.3B4F.0020.0002] -11BE ; [.3B50.0020.0002] -11BF ; [.3B51.0020.0002] -11C0 ; [.3B52.0020.0002] -11C1 ; [.3B53.0020.0002] -11C2 ; [.3B54.0020.0002] -11C3 ; [.3B55.0020.0002] -11C4 ; [.3B56.0020.0002] -11C5 ; [.3B57.0020.0002] -11C6 ; [.3B58.0020.0002] -11C7 ; [.3B59.0020.0002] -3167 ; [.3B59.0020.0004] -11C8 ; [.3B5A.0020.0002] -3168 ; [.3B5A.0020.0004] -11C9 ; [.3B5B.0020.0002] -11CA ; [.3B5C.0020.0002] -11CB ; [.3B5D.0020.0002] -11CC ; [.3B5E.0020.0002] -3169 ; [.3B5E.0020.0004] -11CD ; [.3B5F.0020.0002] -11CE ; [.3B60.0020.0002] -316A ; [.3B60.0020.0004] -11CF ; [.3B61.0020.0002] -11D0 ; [.3B62.0020.0002] -11D1 ; [.3B63.0020.0002] -11D2 ; [.3B64.0020.0002] -11D3 ; [.3B65.0020.0002] -316B ; [.3B65.0020.0004] -11D4 ; [.3B66.0020.0002] -11D5 ; [.3B67.0020.0002] -11D6 ; [.3B68.0020.0002] -11D7 ; [.3B69.0020.0002] -316C ; [.3B69.0020.0004] -11D8 ; [.3B6A.0020.0002] -11D9 ; [.3B6B.0020.0002] -316D ; [.3B6B.0020.0004] -11DA ; [.3B6C.0020.0002] -11DB ; [.3B6D.0020.0002] -11DC ; [.3B6E.0020.0002] -11DD ; [.3B6F.0020.0002] -316F ; [.3B6F.0020.0004] -11DE ; [.3B70.0020.0002] -11DF ; [.3B71.0020.0002] -3170 ; [.3B71.0020.0004] -11E0 ; [.3B72.0020.0002] -11E1 ; [.3B73.0020.0002] -11E2 ; [.3B74.0020.0002] -11E3 ; [.3B75.0020.0002] -11E4 ; [.3B76.0020.0002] -11E5 ; [.3B77.0020.0002] -11E6 ; [.3B78.0020.0002] -11E7 ; [.3B79.0020.0002] -11E8 ; [.3B7A.0020.0002] -11E9 ; [.3B7B.0020.0002] -11EA ; [.3B7C.0020.0002] -11EB ; [.3B7D.0020.0002] -11EC ; [.3B7E.0020.0002] -11ED ; [.3B7F.0020.0002] -11EE ; [.3B80.0020.0002] -11EF ; [.3B81.0020.0002] -11F0 ; [.3B82.0020.0002] -11F1 ; [.3B83.0020.0002] -3182 ; [.3B83.0020.0004] -11F2 ; [.3B84.0020.0002] -3183 ; [.3B84.0020.0004] -11F3 ; [.3B85.0020.0002] -11F4 ; [.3B86.0020.0002] -11F5 ; [.3B87.0020.0002] -11F6 ; [.3B88.0020.0002] -11F7 ; [.3B89.0020.0002] -11F8 ; [.3B8A.0020.0002] -11F9 ; [.3B8B.0020.0002] -11FA ; [.3B8C.0020.0002] -11FB ; [.3B8D.0020.0002] -11FC ; [.3B8E.0020.0002] -11FD ; [.3B8F.0020.0002] -11FE ; [.3B90.0020.0002] -11FF ; [.3B91.0020.0002] -D7CB ; [.3B92.0020.0002] -D7CC ; [.3B93.0020.0002] -D7CD ; [.3B94.0020.0002] -D7CE ; [.3B95.0020.0002] -D7CF ; [.3B96.0020.0002] -D7D0 ; [.3B97.0020.0002] -D7D1 ; [.3B98.0020.0002] -D7D2 ; [.3B99.0020.0002] -D7D3 ; [.3B9A.0020.0002] -D7D4 ; [.3B9B.0020.0002] -D7D5 ; [.3B9C.0020.0002] -D7D6 ; [.3B9D.0020.0002] -D7D7 ; [.3B9E.0020.0002] -D7D8 ; [.3B9F.0020.0002] -D7D9 ; [.3BA0.0020.0002] -D7DA ; [.3BA1.0020.0002] -D7DB ; [.3BA2.0020.0002] -D7DC ; [.3BA3.0020.0002] -D7DD ; [.3BA4.0020.0002] -D7DE ; [.3BA5.0020.0002] -D7DF ; [.3BA6.0020.0002] -D7E0 ; [.3BA7.0020.0002] -D7E1 ; [.3BA8.0020.0002] -D7E2 ; [.3BA9.0020.0002] -D7E3 ; [.3BAA.0020.0002] -D7E4 ; [.3BAB.0020.0002] -D7E5 ; [.3BAC.0020.0002] -D7E6 ; [.3BAD.0020.0002] -D7E7 ; [.3BAE.0020.0002] -D7E8 ; [.3BAF.0020.0002] -D7E9 ; [.3BB0.0020.0002] -D7EA ; [.3BB1.0020.0002] -D7EB ; [.3BB2.0020.0002] -D7EC ; [.3BB3.0020.0002] -D7ED ; [.3BB4.0020.0002] -D7EE ; [.3BB5.0020.0002] -D7EF ; [.3BB6.0020.0002] -D7F0 ; [.3BB7.0020.0002] -D7F1 ; [.3BB8.0020.0002] -D7F2 ; [.3BB9.0020.0002] -D7F3 ; [.3BBA.0020.0002] -D7F4 ; [.3BBB.0020.0002] -D7F5 ; [.3BBC.0020.0002] -D7F6 ; [.3BBD.0020.0002] -D7F7 ; [.3BBE.0020.0002] -D7F8 ; [.3BBF.0020.0002] -D7F9 ; [.3BC0.0020.0002] -D7FA ; [.3BC1.0020.0002] -D7FB ; [.3BC2.0020.0002] -3041 ; [.3BC3.0020.000D] -3042 ; [.3BC3.0020.000E] -30A1 ; [.3BC3.0020.000F] -FF67 ; [.3BC3.0020.0010] -30A2 ; [.3BC3.0020.0011] -FF71 ; [.3BC3.0020.0012] -32D0 ; [.3BC3.0020.0013] -3303 ; [.3BC3.0020.001C][.1B89.0020.001C][.3BED.0020.001C] -3300 ; [.3BC3.0020.001C][.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD7.0020.001C] -3301 ; [.3BC3.0020.001C][.3BED.0020.001C][.3BDF.0020.001C][.3BC3.0020.001C] -3302 ; [.3BC3.0020.001C][.3BF4.0020.001C][.3BE0.0020.001C][.0000.0038.001C][.3BC3.0020.001C] -3043 ; [.3BC4.0020.000D] -3044 ; [.3BC4.0020.000E] -30A3 ; [.3BC4.0020.000F] -FF68 ; [.3BC4.0020.0010] -30A4 ; [.3BC4.0020.0011] -FF72 ; [.3BC4.0020.0012] -32D1 ; [.3BC4.0020.0013] -3304 ; [.3BC4.0020.001C][.3BD9.0020.001C][.3BF4.0020.001C][.3BCB.0020.001C][.0000.0037.001C] -3305 ; [.3BC4.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C] -3045 ; [.3BC5.0020.000D] -3046 ; [.3BC5.0020.000E] -30A5 ; [.3BC5.0020.000F] -FF69 ; [.3BC5.0020.0010] -30A6 ; [.3BC5.0020.0011] -FF73 ; [.3BC5.0020.0012] -32D2 ; [.3BC5.0020.0013] -3094 ; [.3BC5.0020.000E][.0000.0037.0002] -30F4 ; [.3BC5.0020.0011][.0000.0037.0002] -3306 ; [.3BC5.0020.001C][.3BC8.0020.001C][.3BF4.0020.001C] -1B000 ; [.3BC6.0020.0011] -3047 ; [.3BC7.0020.000D] -3048 ; [.3BC7.0020.000E] -30A7 ; [.3BC7.0020.000F] -FF6A ; [.3BC7.0020.0010] -30A8 ; [.3BC7.0020.0011] -FF74 ; [.3BC7.0020.0012] -32D3 ; [.3BC7.0020.0013] -3308 ; [.3BC7.0020.001C][.1B89.0020.001C][.3BC9.0020.001C][.1B89.0020.001C] -3307 ; [.3BC7.0020.001C][.3BD0.0020.001C][.3BCB.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.0000.0037.001C] -3049 ; [.3BC8.0020.000D] -304A ; [.3BC8.0020.000E] -30A9 ; [.3BC8.0020.000F] -FF6B ; [.3BC8.0020.0010] -30AA ; [.3BC8.0020.0011] -FF75 ; [.3BC8.0020.0012] -32D4 ; [.3BC8.0020.0013] -330A ; [.3BC8.0020.001C][.1B89.0020.001C][.3BE4.0020.001C] -3309 ; [.3BC8.0020.001C][.3BF4.0020.001C][.3BD0.0020.001C] -3095 ; [.3BC9.0020.000D] -304B ; [.3BC9.0020.000E] -30F5 ; [.3BC9.0020.000F] -30AB ; [.3BC9.0020.0011] -FF76 ; [.3BC9.0020.0012] -32D5 ; [.3BC9.0020.0013] -304C ; [.3BC9.0020.000E][.0000.0037.0002] -30AC ; [.3BC9.0020.0011][.0000.0037.0002] -330B ; [.3BC9.0020.001C][.3BC4.0020.001C][.3BEC.0020.001C] -330C ; [.3BC9.0020.001C][.3BEB.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] -330D ; [.3BC9.0020.001C][.3BEF.0020.001C][.3BEC.0020.001C][.1B89.0020.001C] -330E ; [.3BC9.0020.001C][.0000.0037.001C][.3BEF.0020.001C][.3BF4.0020.001C] -330F ; [.3BC9.0020.001C][.0000.0037.001C][.3BF4.0020.001C][.3BE2.0020.001C] -304D ; [.3BCA.0020.000E] -30AD ; [.3BCA.0020.0011] -FF77 ; [.3BCA.0020.0012] -32D6 ; [.3BCA.0020.0013] -304E ; [.3BCA.0020.000E][.0000.0037.0002] -30AE ; [.3BCA.0020.0011][.0000.0037.0002] -3310 ; [.3BCA.0020.001C][.0000.0037.001C][.3BC9.0020.001C][.0000.0037.001C] -3311 ; [.3BCA.0020.001C][.0000.0037.001C][.3BD9.0020.001C][.1B89.0020.001C] -3312 ; [.3BCA.0020.001C][.3BE8.0020.001C][.3BEC.0020.001C][.1B89.0020.001C] -3313 ; [.3BCA.0020.001C][.0000.0037.001C][.3BED.0020.001C][.3BD3.0020.001C][.0000.0037.001C][.1B89.0020.001C] -3314 ; [.3BCA.0020.001C][.3BEF.0020.001C] -3315 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C] -3316 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BE5.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] -3317 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BF0.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] -304F ; [.3BCB.0020.000E] -31F0 ; [.3BCB.0020.000F] -30AF ; [.3BCB.0020.0011] -FF78 ; [.3BCB.0020.0012] -32D7 ; [.3BCB.0020.0013] -3050 ; [.3BCB.0020.000E][.0000.0037.0002] -30B0 ; [.3BCB.0020.0011][.0000.0037.0002] -3318 ; [.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C] -3319 ; [.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C][.3BD7.0020.001C][.3BF4.0020.001C] -331A ; [.3BCB.0020.001C][.3BED.0020.001C][.3BD1.0020.001C][.0000.0037.001C][.3BC4.0020.001C][.3BEF.0020.001C] -331B ; [.3BCB.0020.001C][.3BEF.0020.001C][.1B89.0020.001C][.3BDB.0020.001C] -3096 ; [.3BCC.0020.000D] -3051 ; [.3BCC.0020.000E] -30F6 ; [.3BCC.0020.000F] -30B1 ; [.3BCC.0020.0011] -FF79 ; [.3BCC.0020.0012] -32D8 ; [.3BCC.0020.0013] -3052 ; [.3BCC.0020.000E][.0000.0037.0002] -30B2 ; [.3BCC.0020.0011][.0000.0037.0002] -331C ; [.3BCC.0020.001C][.1B89.0020.001C][.3BD0.0020.001C] -3053 ; [.3BCD.0020.000E] -30B3 ; [.3BCD.0020.0011] -FF7A ; [.3BCD.0020.0012] -32D9 ; [.3BCD.0020.0013] -3054 ; [.3BCD.0020.000E][.0000.0037.0002] -30B4 ; [.3BCD.0020.0011][.0000.0037.0002] -331E ; [.3BCD.0020.001C][.1B89.0020.001C][.3BE1.0020.001C][.0000.0038.001C] -1F201 ; [.3BCD.0020.001C][.3BCD.0020.001C] -30FF ; [.3BCD.0020.0016][.3BD7.0020.0016] -331D ; [.3BCD.0020.001C][.3BED.0020.001C][.3BD8.0020.001C] -3055 ; [.3BCE.0020.000E] -30B5 ; [.3BCE.0020.0011] -FF7B ; [.3BCE.0020.0012] -32DA ; [.3BCE.0020.0013] -1F202 ; [.3BCE.0020.001C] -3056 ; [.3BCE.0020.000E][.0000.0037.0002] -30B6 ; [.3BCE.0020.0011][.0000.0037.0002] -331F ; [.3BCE.0020.001C][.3BC4.0020.001C][.3BCB.0020.001C][.3BED.0020.001C] -3320 ; [.3BCE.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C][.1B89.0020.001C][.3BE4.0020.001C] -3057 ; [.3BCF.0020.000E] -31F1 ; [.3BCF.0020.000F] -30B7 ; [.3BCF.0020.0011] -FF7C ; [.3BCF.0020.0012] -32DB ; [.3BCF.0020.0013] -3058 ; [.3BCF.0020.000E][.0000.0037.0002] -30B8 ; [.3BCF.0020.0011][.0000.0037.0002] -3006 ; [.3BCF.0020.0004][.3BE5.0020.0004] -3321 ; [.3BCF.0020.001C][.3BEC.0020.001C][.3BF4.0020.001C][.3BCB.0020.001C][.0000.0037.001C] -3059 ; [.3BD0.0020.000E] -31F2 ; [.3BD0.0020.000F] -30B9 ; [.3BD0.0020.0011] -FF7D ; [.3BD0.0020.0012] -32DC ; [.3BD0.0020.0013] -305A ; [.3BD0.0020.000E][.0000.0037.0002] -30BA ; [.3BD0.0020.0011][.0000.0037.0002] -305B ; [.3BD1.0020.000E] -30BB ; [.3BD1.0020.0011] -FF7E ; [.3BD1.0020.0012] -32DD ; [.3BD1.0020.0013] -305C ; [.3BD1.0020.000E][.0000.0037.0002] -30BC ; [.3BD1.0020.0011][.0000.0037.0002] -3322 ; [.3BD1.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C] -3323 ; [.3BD1.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] -305D ; [.3BD2.0020.000E] -30BD ; [.3BD2.0020.0011] -FF7F ; [.3BD2.0020.0012] -32DE ; [.3BD2.0020.0013] -305E ; [.3BD2.0020.000E][.0000.0037.0002] -30BE ; [.3BD2.0020.0011][.0000.0037.0002] -305F ; [.3BD3.0020.000E] -30BF ; [.3BD3.0020.0011] -FF80 ; [.3BD3.0020.0012] -32DF ; [.3BD3.0020.0013] -3060 ; [.3BD3.0020.000E][.0000.0037.0002] -30C0 ; [.3BD3.0020.0011][.0000.0037.0002] -3324 ; [.3BD3.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BD0.0020.001C] -3061 ; [.3BD4.0020.000E] -30C1 ; [.3BD4.0020.0011] -FF81 ; [.3BD4.0020.0012] -32E0 ; [.3BD4.0020.0013] -3062 ; [.3BD4.0020.000E][.0000.0037.0002] -30C2 ; [.3BD4.0020.0011][.0000.0037.0002] -3063 ; [.3BD5.0020.000D] -3064 ; [.3BD5.0020.000E] -30C3 ; [.3BD5.0020.000F] -FF6F ; [.3BD5.0020.0010] -30C4 ; [.3BD5.0020.0011] -FF82 ; [.3BD5.0020.0012] -32E1 ; [.3BD5.0020.0013] -3065 ; [.3BD5.0020.000E][.0000.0037.0002] -30C5 ; [.3BD5.0020.0011][.0000.0037.0002] -3066 ; [.3BD6.0020.000E] -30C6 ; [.3BD6.0020.0011] -FF83 ; [.3BD6.0020.0012] -32E2 ; [.3BD6.0020.0013] -3067 ; [.3BD6.0020.000E][.0000.0037.0002] -30C7 ; [.3BD6.0020.0011][.0000.0037.0002] -1F213 ; [.3BD6.0020.001C][.0000.0037.001C] -3325 ; [.3BD6.0020.001C][.0000.0037.001C][.3BCF.0020.001C] -3068 ; [.3BD7.0020.000E] -31F3 ; [.3BD7.0020.000F] -30C8 ; [.3BD7.0020.0011] -FF84 ; [.3BD7.0020.0012] -32E3 ; [.3BD7.0020.0013] -3069 ; [.3BD7.0020.000E][.0000.0037.0002] -30C9 ; [.3BD7.0020.0011][.0000.0037.0002] -3326 ; [.3BD7.0020.001C][.0000.0037.001C][.3BED.0020.001C] -3327 ; [.3BD7.0020.001C][.3BF4.0020.001C] -306A ; [.3BD8.0020.000E] -30CA ; [.3BD8.0020.0011] -FF85 ; [.3BD8.0020.0012] -32E4 ; [.3BD8.0020.0013] -3328 ; [.3BD8.0020.001C][.3BDC.0020.001C] -306B ; [.3BD9.0020.000E] -30CB ; [.3BD9.0020.0011] -FF86 ; [.3BD9.0020.0012] -32E5 ; [.3BD9.0020.0013] -306C ; [.3BDA.0020.000E] -31F4 ; [.3BDA.0020.000F] -30CC ; [.3BDA.0020.0011] -FF87 ; [.3BDA.0020.0012] -32E6 ; [.3BDA.0020.0013] -306D ; [.3BDB.0020.000E] -30CD ; [.3BDB.0020.0011] -FF88 ; [.3BDB.0020.0012] -32E7 ; [.3BDB.0020.0013] -306E ; [.3BDC.0020.000E] -30CE ; [.3BDC.0020.0011] -FF89 ; [.3BDC.0020.0012] -32E8 ; [.3BDC.0020.0013] -3329 ; [.3BDC.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] -306F ; [.3BDD.0020.000E] -31F5 ; [.3BDD.0020.000F] -30CF ; [.3BDD.0020.0011] -FF8A ; [.3BDD.0020.0012] -32E9 ; [.3BDD.0020.0013] -3070 ; [.3BDD.0020.000E][.0000.0037.0002] -30D0 ; [.3BDD.0020.0011][.0000.0037.0002] -3071 ; [.3BDD.0020.000E][.0000.0038.0002] -30D1 ; [.3BDD.0020.0011][.0000.0038.0002] -332B ; [.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD1.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] -332C ; [.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD5.0020.001C] -332D ; [.3BDD.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BEE.0020.001C][.3BED.0020.001C] -332A ; [.3BDD.0020.001C][.3BC4.0020.001C][.3BD5.0020.001C] -3072 ; [.3BDE.0020.000E] -31F6 ; [.3BDE.0020.000F] -30D2 ; [.3BDE.0020.0011] -FF8B ; [.3BDE.0020.0012] -32EA ; [.3BDE.0020.0013] -3073 ; [.3BDE.0020.000E][.0000.0037.0002] -30D3 ; [.3BDE.0020.0011][.0000.0037.0002] -3074 ; [.3BDE.0020.000E][.0000.0038.0002] -30D4 ; [.3BDE.0020.0011][.0000.0038.0002] -332E ; [.3BDE.0020.001C][.0000.0038.001C][.3BC3.0020.001C][.3BD0.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] -332F ; [.3BDE.0020.001C][.0000.0038.001C][.3BCB.0020.001C][.3BED.0020.001C] -3330 ; [.3BDE.0020.001C][.0000.0038.001C][.3BCD.0020.001C] -3331 ; [.3BDE.0020.001C][.0000.0037.001C][.3BED.0020.001C] -3075 ; [.3BDF.0020.000E] -31F7 ; [.3BDF.0020.000F] -30D5 ; [.3BDF.0020.0011] -FF8C ; [.3BDF.0020.0012] -32EB ; [.3BDF.0020.0013] -3076 ; [.3BDF.0020.000E][.0000.0037.0002] -30D6 ; [.3BDF.0020.0011][.0000.0037.0002] -3077 ; [.3BDF.0020.000E][.0000.0038.0002] -30D7 ; [.3BDF.0020.0011][.0000.0038.0002] -3332 ; [.3BDF.0020.001C][.3BC3.0020.001C][.3BEB.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C][.0000.0037.001C] -3333 ; [.3BDF.0020.001C][.3BC4.0020.001C][.1B89.0020.001C][.3BD7.0020.001C] -3334 ; [.3BDF.0020.001C][.0000.0037.001C][.3BD5.0020.001C][.3BCF.0020.001C][.3BC7.0020.001C][.3BED.0020.001C] -3335 ; [.3BDF.0020.001C][.3BEB.0020.001C][.3BF4.0020.001C] -3078 ; [.3BE0.0020.000E] -31F8 ; [.3BE0.0020.000F] -30D8 ; [.3BE0.0020.0011] -FF8D ; [.3BE0.0020.0012] -32EC ; [.3BE0.0020.0013] -3079 ; [.3BE0.0020.000E][.0000.0037.0002] -30D9 ; [.3BE0.0020.0011][.0000.0037.0002] -307A ; [.3BE0.0020.000E][.0000.0038.0002] -30DA ; [.3BE0.0020.0011][.0000.0038.0002] -333B ; [.3BE0.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BCF.0020.001C][.0000.0037.001C] -333C ; [.3BE0.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BD3.0020.001C] -3336 ; [.3BE0.0020.001C][.3BCB.0020.001C][.3BD3.0020.001C][.1B89.0020.001C][.3BED.0020.001C] -3337 ; [.3BE0.0020.001C][.0000.0038.001C][.3BD2.0020.001C] -3338 ; [.3BE0.0020.001C][.0000.0038.001C][.3BD9.0020.001C][.3BDE.0020.001C] -3339 ; [.3BE0.0020.001C][.3BED.0020.001C][.3BD5.0020.001C] -333A ; [.3BE0.0020.001C][.0000.0038.001C][.3BF4.0020.001C][.3BD0.0020.001C] -307B ; [.3BE1.0020.000E] -31F9 ; [.3BE1.0020.000F] -30DB ; [.3BE1.0020.0011] -FF8E ; [.3BE1.0020.0012] -32ED ; [.3BE1.0020.0013] -307C ; [.3BE1.0020.000E][.0000.0037.0002] -30DC ; [.3BE1.0020.0011][.0000.0037.0002] -307D ; [.3BE1.0020.000E][.0000.0038.0002] -30DD ; [.3BE1.0020.0011][.0000.0038.0002] -3341 ; [.3BE1.0020.001C][.1B89.0020.001C][.3BED.0020.001C] -3342 ; [.3BE1.0020.001C][.1B89.0020.001C][.3BF4.0020.001C] -333D ; [.3BE1.0020.001C][.0000.0038.001C][.3BC4.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] -1F200 ; [.3BE1.0020.001C][.3BC9.0020.001C] -333E ; [.3BE1.0020.001C][.0000.0037.001C][.3BED.0020.001C][.3BD7.0020.001C] -333F ; [.3BE1.0020.001C][.3BF4.0020.001C] -3340 ; [.3BE1.0020.001C][.0000.0038.001C][.3BF4.0020.001C][.3BD7.0020.001C][.0000.0037.001C] -307E ; [.3BE2.0020.000E] -30DE ; [.3BE2.0020.0011] -FF8F ; [.3BE2.0020.0012] -32EE ; [.3BE2.0020.0013] -3343 ; [.3BE2.0020.001C][.3BC4.0020.001C][.3BCB.0020.001C][.3BEF.0020.001C] -3344 ; [.3BE2.0020.001C][.3BC4.0020.001C][.3BED.0020.001C] -303C ; [.3BE2.0020.0004][.3BD0.0020.0004] -3345 ; [.3BE2.0020.001C][.3BD5.0020.001C][.3BDD.0020.001C] -3346 ; [.3BE2.0020.001C][.3BED.0020.001C][.3BCB.0020.001C] -3347 ; [.3BE2.0020.001C][.3BF4.0020.001C][.3BCF.0020.001C][.3BEA.0020.001C][.3BF4.0020.001C] -307F ; [.3BE3.0020.000E] -30DF ; [.3BE3.0020.0011] -FF90 ; [.3BE3.0020.0012] -32EF ; [.3BE3.0020.0013] -3348 ; [.3BE3.0020.001C][.3BCB.0020.001C][.3BEF.0020.001C][.3BF4.0020.001C] -3349 ; [.3BE3.0020.001C][.3BEC.0020.001C] -334A ; [.3BE3.0020.001C][.3BEC.0020.001C][.3BDD.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BED.0020.001C] -3080 ; [.3BE4.0020.000E] -31FA ; [.3BE4.0020.000F] -30E0 ; [.3BE4.0020.0011] -FF91 ; [.3BE4.0020.0012] -32F0 ; [.3BE4.0020.0013] -3081 ; [.3BE5.0020.000E] -30E1 ; [.3BE5.0020.0011] -FF92 ; [.3BE5.0020.0012] -32F1 ; [.3BE5.0020.0013] -334D ; [.3BE5.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] -334B ; [.3BE5.0020.001C][.3BC9.0020.001C][.0000.0037.001C] -334C ; [.3BE5.0020.001C][.3BC9.0020.001C][.0000.0037.001C][.3BD7.0020.001C][.3BF4.0020.001C] -3082 ; [.3BE6.0020.000E] -30E2 ; [.3BE6.0020.0011] -FF93 ; [.3BE6.0020.0012] -32F2 ; [.3BE6.0020.0013] -3083 ; [.3BE7.0020.000D] -3084 ; [.3BE7.0020.000E] -30E3 ; [.3BE7.0020.000F] -FF6C ; [.3BE7.0020.0010] -30E4 ; [.3BE7.0020.0011] -FF94 ; [.3BE7.0020.0012] -32F3 ; [.3BE7.0020.0013] -334E ; [.3BE7.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.0000.0037.001C] -334F ; [.3BE7.0020.001C][.1B89.0020.001C][.3BED.0020.001C] -3085 ; [.3BE8.0020.000D] -3086 ; [.3BE8.0020.000E] -30E5 ; [.3BE8.0020.000F] -FF6D ; [.3BE8.0020.0010] -30E6 ; [.3BE8.0020.0011] -FF95 ; [.3BE8.0020.0012] -32F4 ; [.3BE8.0020.0013] -3350 ; [.3BE8.0020.001C][.3BC3.0020.001C][.3BF4.0020.001C] -1B001 ; [.3BE9.0020.000E] -3087 ; [.3BEA.0020.000D] -3088 ; [.3BEA.0020.000E] -30E7 ; [.3BEA.0020.000F] -FF6E ; [.3BEA.0020.0010] -30E8 ; [.3BEA.0020.0011] -FF96 ; [.3BEA.0020.0012] -32F5 ; [.3BEA.0020.0013] -309F ; [.3BEA.0020.0016][.3BEC.0020.0016] -3089 ; [.3BEB.0020.000E] -31FB ; [.3BEB.0020.000F] -30E9 ; [.3BEB.0020.0011] -FF97 ; [.3BEB.0020.0012] -32F6 ; [.3BEB.0020.0013] -308A ; [.3BEC.0020.000E] -31FC ; [.3BEC.0020.000F] -30EA ; [.3BEC.0020.0011] -FF98 ; [.3BEC.0020.0012] -32F7 ; [.3BEC.0020.0013] -3351 ; [.3BEC.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] -3352 ; [.3BEC.0020.001C][.3BEB.0020.001C] -308B ; [.3BED.0020.000E] -31FD ; [.3BED.0020.000F] -30EB ; [.3BED.0020.0011] -FF99 ; [.3BED.0020.0012] -32F8 ; [.3BED.0020.0013] -3354 ; [.3BED.0020.001C][.1B89.0020.001C][.3BDF.0020.001C][.0000.0037.001C][.3BED.0020.001C] -3353 ; [.3BED.0020.001C][.3BDE.0020.001C][.0000.0038.001C][.1B89.0020.001C] -308C ; [.3BEE.0020.000E] -31FE ; [.3BEE.0020.000F] -30EC ; [.3BEE.0020.0011] -FF9A ; [.3BEE.0020.0012] -32F9 ; [.3BEE.0020.0013] -3355 ; [.3BEE.0020.001C][.3BE4.0020.001C] -3356 ; [.3BEE.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C][.3BCC.0020.001C][.0000.0037.001C][.3BF4.0020.001C] -308D ; [.3BEF.0020.000E] -31FF ; [.3BEF.0020.000F] -30ED ; [.3BEF.0020.0011] -FF9B ; [.3BEF.0020.0012] -32FA ; [.3BEF.0020.0013] -308E ; [.3BF0.0020.000D] -308F ; [.3BF0.0020.000E] -30EE ; [.3BF0.0020.000F] -30EF ; [.3BF0.0020.0011] -FF9C ; [.3BF0.0020.0012] -32FB ; [.3BF0.0020.0013] -30F7 ; [.3BF0.0020.0011][.0000.0037.0002] -3357 ; [.3BF0.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] -3090 ; [.3BF1.0020.000E] -30F0 ; [.3BF1.0020.0011] -32FC ; [.3BF1.0020.0013] -30F8 ; [.3BF1.0020.0011][.0000.0037.0002] -3091 ; [.3BF2.0020.000E] -30F1 ; [.3BF2.0020.0011] -32FD ; [.3BF2.0020.0013] -30F9 ; [.3BF2.0020.0011][.0000.0037.0002] -3092 ; [.3BF3.0020.000E] -30F2 ; [.3BF3.0020.0011] -FF66 ; [.3BF3.0020.0012] -32FE ; [.3BF3.0020.0013] -30FA ; [.3BF3.0020.0011][.0000.0037.0002] -3093 ; [.3BF4.0020.000E] -30F3 ; [.3BF4.0020.0011] -FF9D ; [.3BF4.0020.0012] -3105 ; [.3BF5.0020.0002] -31A0 ; [.3BF5.0020.0004][.0000.010C.0004] -3106 ; [.3BF6.0020.0002] -31B4 ; [.3BF6.0020.0019] -3107 ; [.3BF7.0020.0002] -3108 ; [.3BF8.0020.0002] -312A ; [.3BF9.0020.0002] -3109 ; [.3BFA.0020.0002] -310A ; [.3BFB.0020.0002] -31B5 ; [.3BFB.0020.0019] -310B ; [.3BFC.0020.0002] -310C ; [.3BFD.0020.0002] -310D ; [.3BFE.0020.0002] -31A3 ; [.3BFE.0020.0004][.0000.010C.0004] -310E ; [.3BFF.0020.0002] -31B6 ; [.3BFF.0020.0019] -312B ; [.3C00.0020.0002] -31AD ; [.3C01.0020.0002] -310F ; [.3C02.0020.0002] -31B7 ; [.3C02.0020.0019] -3110 ; [.3C03.0020.0002] -31A2 ; [.3C03.0020.0004][.0000.010C.0004] -3111 ; [.3C04.0020.0002] -3112 ; [.3C05.0020.0002] -312C ; [.3C06.0020.0002] -3113 ; [.3C07.0020.0002] -3114 ; [.3C08.0020.0002] -3115 ; [.3C09.0020.0002] -3116 ; [.3C0A.0020.0002] -3117 ; [.3C0B.0020.0002] -31A1 ; [.3C0B.0020.0004][.0000.010C.0004] -3118 ; [.3C0C.0020.0002] -3119 ; [.3C0D.0020.0002] -31B8 ; [.3C0E.0020.0002] -31B9 ; [.3C0F.0020.0002] -31BA ; [.3C10.0020.0002] -311A ; [.3C11.0020.0002] -31A9 ; [.3C11.0020.0004][.0000.010C.0004] -311B ; [.3C12.0020.0002] -31A7 ; [.3C12.0020.0004][.0000.010C.0004] -31A6 ; [.3C13.0020.0002] -311C ; [.3C14.0020.0002] -311D ; [.3C15.0020.0002] -31A4 ; [.3C16.0020.0002] -31A5 ; [.3C16.0020.0004][.0000.010C.0004] -311E ; [.3C17.0020.0002] -31AE ; [.3C17.0020.0004][.0000.010C.0004] -311F ; [.3C18.0020.0002] -3120 ; [.3C19.0020.0002] -31AF ; [.3C19.0020.0004][.0000.010C.0004] -3121 ; [.3C1A.0020.0002] -3122 ; [.3C1B.0020.0002] -3123 ; [.3C1C.0020.0002] -3124 ; [.3C1D.0020.0002] -31B2 ; [.3C1E.0020.0002] -3125 ; [.3C1F.0020.0002] -31B0 ; [.3C20.0020.0002] -31B1 ; [.3C21.0020.0002] -31AC ; [.3C22.0020.0002] -3126 ; [.3C23.0020.0002] -3127 ; [.3C24.0020.0002] -31AA ; [.3C24.0020.0004][.0000.010C.0004] -31B3 ; [.3C24.0020.0016][.0000.010C.0016] -3128 ; [.3C25.0020.0002] -31AB ; [.3C25.0020.0004][.0000.010C.0004] -31A8 ; [.3C25.0020.0004][.0000.010D.0004] -3129 ; [.3C26.0020.0002] -312D ; [.3C27.0020.0002] -A000 ; [.3C28.0020.0002] -A001 ; [.3C29.0020.0002] -A002 ; [.3C2A.0020.0002] -A003 ; [.3C2B.0020.0002] -A004 ; [.3C2C.0020.0002] -A005 ; [.3C2D.0020.0002] -A006 ; [.3C2E.0020.0002] -A007 ; [.3C2F.0020.0002] -A008 ; [.3C30.0020.0002] -A009 ; [.3C31.0020.0002] -A00A ; [.3C32.0020.0002] -A00B ; [.3C33.0020.0002] -A00C ; [.3C34.0020.0002] -A00D ; [.3C35.0020.0002] -A00E ; [.3C36.0020.0002] -A00F ; [.3C37.0020.0002] -A010 ; [.3C38.0020.0002] -A011 ; [.3C39.0020.0002] -A012 ; [.3C3A.0020.0002] -A013 ; [.3C3B.0020.0002] -A014 ; [.3C3C.0020.0002] -A015 ; [.3C3D.0020.0002] -A016 ; [.3C3E.0020.0002] -A017 ; [.3C3F.0020.0002] -A018 ; [.3C40.0020.0002] -A019 ; [.3C41.0020.0002] -A01A ; [.3C42.0020.0002] -A01B ; [.3C43.0020.0002] -A01C ; [.3C44.0020.0002] -A01D ; [.3C45.0020.0002] -A01E ; [.3C46.0020.0002] -A01F ; [.3C47.0020.0002] -A020 ; [.3C48.0020.0002] -A021 ; [.3C49.0020.0002] -A022 ; [.3C4A.0020.0002] -A023 ; [.3C4B.0020.0002] -A024 ; [.3C4C.0020.0002] -A025 ; [.3C4D.0020.0002] -A026 ; [.3C4E.0020.0002] -A027 ; [.3C4F.0020.0002] -A028 ; [.3C50.0020.0002] -A029 ; [.3C51.0020.0002] -A02A ; [.3C52.0020.0002] -A02B ; [.3C53.0020.0002] -A02C ; [.3C54.0020.0002] -A02D ; [.3C55.0020.0002] -A02E ; [.3C56.0020.0002] -A02F ; [.3C57.0020.0002] -A030 ; [.3C58.0020.0002] -A031 ; [.3C59.0020.0002] -A032 ; [.3C5A.0020.0002] -A033 ; [.3C5B.0020.0002] -A034 ; [.3C5C.0020.0002] -A035 ; [.3C5D.0020.0002] -A036 ; [.3C5E.0020.0002] -A037 ; [.3C5F.0020.0002] -A038 ; [.3C60.0020.0002] -A039 ; [.3C61.0020.0002] -A03A ; [.3C62.0020.0002] -A03B ; [.3C63.0020.0002] -A03C ; [.3C64.0020.0002] -A03D ; [.3C65.0020.0002] -A03E ; [.3C66.0020.0002] -A03F ; [.3C67.0020.0002] -A040 ; [.3C68.0020.0002] -A041 ; [.3C69.0020.0002] -A042 ; [.3C6A.0020.0002] -A043 ; [.3C6B.0020.0002] -A044 ; [.3C6C.0020.0002] -A045 ; [.3C6D.0020.0002] -A046 ; [.3C6E.0020.0002] -A047 ; [.3C6F.0020.0002] -A048 ; [.3C70.0020.0002] -A049 ; [.3C71.0020.0002] -A04A ; [.3C72.0020.0002] -A04B ; [.3C73.0020.0002] -A04C ; [.3C74.0020.0002] -A04D ; [.3C75.0020.0002] -A04E ; [.3C76.0020.0002] -A04F ; [.3C77.0020.0002] -A050 ; [.3C78.0020.0002] -A051 ; [.3C79.0020.0002] -A052 ; [.3C7A.0020.0002] -A053 ; [.3C7B.0020.0002] -A054 ; [.3C7C.0020.0002] -A055 ; [.3C7D.0020.0002] -A056 ; [.3C7E.0020.0002] -A057 ; [.3C7F.0020.0002] -A058 ; [.3C80.0020.0002] -A059 ; [.3C81.0020.0002] -A05A ; [.3C82.0020.0002] -A05B ; [.3C83.0020.0002] -A05C ; [.3C84.0020.0002] -A05D ; [.3C85.0020.0002] -A05E ; [.3C86.0020.0002] -A05F ; [.3C87.0020.0002] -A060 ; [.3C88.0020.0002] -A061 ; [.3C89.0020.0002] -A062 ; [.3C8A.0020.0002] -A063 ; [.3C8B.0020.0002] -A064 ; [.3C8C.0020.0002] -A065 ; [.3C8D.0020.0002] -A066 ; [.3C8E.0020.0002] -A067 ; [.3C8F.0020.0002] -A068 ; [.3C90.0020.0002] -A069 ; [.3C91.0020.0002] -A06A ; [.3C92.0020.0002] -A06B ; [.3C93.0020.0002] -A06C ; [.3C94.0020.0002] -A06D ; [.3C95.0020.0002] -A06E ; [.3C96.0020.0002] -A06F ; [.3C97.0020.0002] -A070 ; [.3C98.0020.0002] -A071 ; [.3C99.0020.0002] -A072 ; [.3C9A.0020.0002] -A073 ; [.3C9B.0020.0002] -A074 ; [.3C9C.0020.0002] -A075 ; [.3C9D.0020.0002] -A076 ; [.3C9E.0020.0002] -A077 ; [.3C9F.0020.0002] -A078 ; [.3CA0.0020.0002] -A079 ; [.3CA1.0020.0002] -A07A ; [.3CA2.0020.0002] -A07B ; [.3CA3.0020.0002] -A07C ; [.3CA4.0020.0002] -A07D ; [.3CA5.0020.0002] -A07E ; [.3CA6.0020.0002] -A07F ; [.3CA7.0020.0002] -A080 ; [.3CA8.0020.0002] -A081 ; [.3CA9.0020.0002] -A082 ; [.3CAA.0020.0002] -A083 ; [.3CAB.0020.0002] -A084 ; [.3CAC.0020.0002] -A085 ; [.3CAD.0020.0002] -A086 ; [.3CAE.0020.0002] -A087 ; [.3CAF.0020.0002] -A088 ; [.3CB0.0020.0002] -A089 ; [.3CB1.0020.0002] -A08A ; [.3CB2.0020.0002] -A08B ; [.3CB3.0020.0002] -A08C ; [.3CB4.0020.0002] -A08D ; [.3CB5.0020.0002] -A08E ; [.3CB6.0020.0002] -A08F ; [.3CB7.0020.0002] -A090 ; [.3CB8.0020.0002] -A091 ; [.3CB9.0020.0002] -A092 ; [.3CBA.0020.0002] -A093 ; [.3CBB.0020.0002] -A094 ; [.3CBC.0020.0002] -A095 ; [.3CBD.0020.0002] -A096 ; [.3CBE.0020.0002] -A097 ; [.3CBF.0020.0002] -A098 ; [.3CC0.0020.0002] -A099 ; [.3CC1.0020.0002] -A09A ; [.3CC2.0020.0002] -A09B ; [.3CC3.0020.0002] -A09C ; [.3CC4.0020.0002] -A09D ; [.3CC5.0020.0002] -A09E ; [.3CC6.0020.0002] -A09F ; [.3CC7.0020.0002] -A0A0 ; [.3CC8.0020.0002] -A0A1 ; [.3CC9.0020.0002] -A0A2 ; [.3CCA.0020.0002] -A0A3 ; [.3CCB.0020.0002] -A0A4 ; [.3CCC.0020.0002] -A0A5 ; [.3CCD.0020.0002] -A0A6 ; [.3CCE.0020.0002] -A0A7 ; [.3CCF.0020.0002] -A0A8 ; [.3CD0.0020.0002] -A0A9 ; [.3CD1.0020.0002] -A0AA ; [.3CD2.0020.0002] -A0AB ; [.3CD3.0020.0002] -A0AC ; [.3CD4.0020.0002] -A0AD ; [.3CD5.0020.0002] -A0AE ; [.3CD6.0020.0002] -A0AF ; [.3CD7.0020.0002] -A0B0 ; [.3CD8.0020.0002] -A0B1 ; [.3CD9.0020.0002] -A0B2 ; [.3CDA.0020.0002] -A0B3 ; [.3CDB.0020.0002] -A0B4 ; [.3CDC.0020.0002] -A0B5 ; [.3CDD.0020.0002] -A0B6 ; [.3CDE.0020.0002] -A0B7 ; [.3CDF.0020.0002] -A0B8 ; [.3CE0.0020.0002] -A0B9 ; [.3CE1.0020.0002] -A0BA ; [.3CE2.0020.0002] -A0BB ; [.3CE3.0020.0002] -A0BC ; [.3CE4.0020.0002] -A0BD ; [.3CE5.0020.0002] -A0BE ; [.3CE6.0020.0002] -A0BF ; [.3CE7.0020.0002] -A0C0 ; [.3CE8.0020.0002] -A0C1 ; [.3CE9.0020.0002] -A0C2 ; [.3CEA.0020.0002] -A0C3 ; [.3CEB.0020.0002] -A0C4 ; [.3CEC.0020.0002] -A0C5 ; [.3CED.0020.0002] -A0C6 ; [.3CEE.0020.0002] -A0C7 ; [.3CEF.0020.0002] -A0C8 ; [.3CF0.0020.0002] -A0C9 ; [.3CF1.0020.0002] -A0CA ; [.3CF2.0020.0002] -A0CB ; [.3CF3.0020.0002] -A0CC ; [.3CF4.0020.0002] -A0CD ; [.3CF5.0020.0002] -A0CE ; [.3CF6.0020.0002] -A0CF ; [.3CF7.0020.0002] -A0D0 ; [.3CF8.0020.0002] -A0D1 ; [.3CF9.0020.0002] -A0D2 ; [.3CFA.0020.0002] -A0D3 ; [.3CFB.0020.0002] -A0D4 ; [.3CFC.0020.0002] -A0D5 ; [.3CFD.0020.0002] -A0D6 ; [.3CFE.0020.0002] -A0D7 ; [.3CFF.0020.0002] -A0D8 ; [.3D00.0020.0002] -A0D9 ; [.3D01.0020.0002] -A0DA ; [.3D02.0020.0002] -A0DB ; [.3D03.0020.0002] -A0DC ; [.3D04.0020.0002] -A0DD ; [.3D05.0020.0002] -A0DE ; [.3D06.0020.0002] -A0DF ; [.3D07.0020.0002] -A0E0 ; [.3D08.0020.0002] -A0E1 ; [.3D09.0020.0002] -A0E2 ; [.3D0A.0020.0002] -A0E3 ; [.3D0B.0020.0002] -A0E4 ; [.3D0C.0020.0002] -A0E5 ; [.3D0D.0020.0002] -A0E6 ; [.3D0E.0020.0002] -A0E7 ; [.3D0F.0020.0002] -A0E8 ; [.3D10.0020.0002] -A0E9 ; [.3D11.0020.0002] -A0EA ; [.3D12.0020.0002] -A0EB ; [.3D13.0020.0002] -A0EC ; [.3D14.0020.0002] -A0ED ; [.3D15.0020.0002] -A0EE ; [.3D16.0020.0002] -A0EF ; [.3D17.0020.0002] -A0F0 ; [.3D18.0020.0002] -A0F1 ; [.3D19.0020.0002] -A0F2 ; [.3D1A.0020.0002] -A0F3 ; [.3D1B.0020.0002] -A0F4 ; [.3D1C.0020.0002] -A0F5 ; [.3D1D.0020.0002] -A0F6 ; [.3D1E.0020.0002] -A0F7 ; [.3D1F.0020.0002] -A0F8 ; [.3D20.0020.0002] -A0F9 ; [.3D21.0020.0002] -A0FA ; [.3D22.0020.0002] -A0FB ; [.3D23.0020.0002] -A0FC ; [.3D24.0020.0002] -A0FD ; [.3D25.0020.0002] -A0FE ; [.3D26.0020.0002] -A0FF ; [.3D27.0020.0002] -A100 ; [.3D28.0020.0002] -A101 ; [.3D29.0020.0002] -A102 ; [.3D2A.0020.0002] -A103 ; [.3D2B.0020.0002] -A104 ; [.3D2C.0020.0002] -A105 ; [.3D2D.0020.0002] -A106 ; [.3D2E.0020.0002] -A107 ; [.3D2F.0020.0002] -A108 ; [.3D30.0020.0002] -A109 ; [.3D31.0020.0002] -A10A ; [.3D32.0020.0002] -A10B ; [.3D33.0020.0002] -A10C ; [.3D34.0020.0002] -A10D ; [.3D35.0020.0002] -A10E ; [.3D36.0020.0002] -A10F ; [.3D37.0020.0002] -A110 ; [.3D38.0020.0002] -A111 ; [.3D39.0020.0002] -A112 ; [.3D3A.0020.0002] -A113 ; [.3D3B.0020.0002] -A114 ; [.3D3C.0020.0002] -A115 ; [.3D3D.0020.0002] -A116 ; [.3D3E.0020.0002] -A117 ; [.3D3F.0020.0002] -A118 ; [.3D40.0020.0002] -A119 ; [.3D41.0020.0002] -A11A ; [.3D42.0020.0002] -A11B ; [.3D43.0020.0002] -A11C ; [.3D44.0020.0002] -A11D ; [.3D45.0020.0002] -A11E ; [.3D46.0020.0002] -A11F ; [.3D47.0020.0002] -A120 ; [.3D48.0020.0002] -A121 ; [.3D49.0020.0002] -A122 ; [.3D4A.0020.0002] -A123 ; [.3D4B.0020.0002] -A124 ; [.3D4C.0020.0002] -A125 ; [.3D4D.0020.0002] -A126 ; [.3D4E.0020.0002] -A127 ; [.3D4F.0020.0002] -A128 ; [.3D50.0020.0002] -A129 ; [.3D51.0020.0002] -A12A ; [.3D52.0020.0002] -A12B ; [.3D53.0020.0002] -A12C ; [.3D54.0020.0002] -A12D ; [.3D55.0020.0002] -A12E ; [.3D56.0020.0002] -A12F ; [.3D57.0020.0002] -A130 ; [.3D58.0020.0002] -A131 ; [.3D59.0020.0002] -A132 ; [.3D5A.0020.0002] -A133 ; [.3D5B.0020.0002] -A134 ; [.3D5C.0020.0002] -A135 ; [.3D5D.0020.0002] -A136 ; [.3D5E.0020.0002] -A137 ; [.3D5F.0020.0002] -A138 ; [.3D60.0020.0002] -A139 ; [.3D61.0020.0002] -A13A ; [.3D62.0020.0002] -A13B ; [.3D63.0020.0002] -A13C ; [.3D64.0020.0002] -A13D ; [.3D65.0020.0002] -A13E ; [.3D66.0020.0002] -A13F ; [.3D67.0020.0002] -A140 ; [.3D68.0020.0002] -A141 ; [.3D69.0020.0002] -A142 ; [.3D6A.0020.0002] -A143 ; [.3D6B.0020.0002] -A144 ; [.3D6C.0020.0002] -A145 ; [.3D6D.0020.0002] -A146 ; [.3D6E.0020.0002] -A147 ; [.3D6F.0020.0002] -A148 ; [.3D70.0020.0002] -A149 ; [.3D71.0020.0002] -A14A ; [.3D72.0020.0002] -A14B ; [.3D73.0020.0002] -A14C ; [.3D74.0020.0002] -A14D ; [.3D75.0020.0002] -A14E ; [.3D76.0020.0002] -A14F ; [.3D77.0020.0002] -A150 ; [.3D78.0020.0002] -A151 ; [.3D79.0020.0002] -A152 ; [.3D7A.0020.0002] -A153 ; [.3D7B.0020.0002] -A154 ; [.3D7C.0020.0002] -A155 ; [.3D7D.0020.0002] -A156 ; [.3D7E.0020.0002] -A157 ; [.3D7F.0020.0002] -A158 ; [.3D80.0020.0002] -A159 ; [.3D81.0020.0002] -A15A ; [.3D82.0020.0002] -A15B ; [.3D83.0020.0002] -A15C ; [.3D84.0020.0002] -A15D ; [.3D85.0020.0002] -A15E ; [.3D86.0020.0002] -A15F ; [.3D87.0020.0002] -A160 ; [.3D88.0020.0002] -A161 ; [.3D89.0020.0002] -A162 ; [.3D8A.0020.0002] -A163 ; [.3D8B.0020.0002] -A164 ; [.3D8C.0020.0002] -A165 ; [.3D8D.0020.0002] -A166 ; [.3D8E.0020.0002] -A167 ; [.3D8F.0020.0002] -A168 ; [.3D90.0020.0002] -A169 ; [.3D91.0020.0002] -A16A ; [.3D92.0020.0002] -A16B ; [.3D93.0020.0002] -A16C ; [.3D94.0020.0002] -A16D ; [.3D95.0020.0002] -A16E ; [.3D96.0020.0002] -A16F ; [.3D97.0020.0002] -A170 ; [.3D98.0020.0002] -A171 ; [.3D99.0020.0002] -A172 ; [.3D9A.0020.0002] -A173 ; [.3D9B.0020.0002] -A174 ; [.3D9C.0020.0002] -A175 ; [.3D9D.0020.0002] -A176 ; [.3D9E.0020.0002] -A177 ; [.3D9F.0020.0002] -A178 ; [.3DA0.0020.0002] -A179 ; [.3DA1.0020.0002] -A17A ; [.3DA2.0020.0002] -A17B ; [.3DA3.0020.0002] -A17C ; [.3DA4.0020.0002] -A17D ; [.3DA5.0020.0002] -A17E ; [.3DA6.0020.0002] -A17F ; [.3DA7.0020.0002] -A180 ; [.3DA8.0020.0002] -A181 ; [.3DA9.0020.0002] -A182 ; [.3DAA.0020.0002] -A183 ; [.3DAB.0020.0002] -A184 ; [.3DAC.0020.0002] -A185 ; [.3DAD.0020.0002] -A186 ; [.3DAE.0020.0002] -A187 ; [.3DAF.0020.0002] -A188 ; [.3DB0.0020.0002] -A189 ; [.3DB1.0020.0002] -A18A ; [.3DB2.0020.0002] -A18B ; [.3DB3.0020.0002] -A18C ; [.3DB4.0020.0002] -A18D ; [.3DB5.0020.0002] -A18E ; [.3DB6.0020.0002] -A18F ; [.3DB7.0020.0002] -A190 ; [.3DB8.0020.0002] -A191 ; [.3DB9.0020.0002] -A192 ; [.3DBA.0020.0002] -A193 ; [.3DBB.0020.0002] -A194 ; [.3DBC.0020.0002] -A195 ; [.3DBD.0020.0002] -A196 ; [.3DBE.0020.0002] -A197 ; [.3DBF.0020.0002] -A198 ; [.3DC0.0020.0002] -A199 ; [.3DC1.0020.0002] -A19A ; [.3DC2.0020.0002] -A19B ; [.3DC3.0020.0002] -A19C ; [.3DC4.0020.0002] -A19D ; [.3DC5.0020.0002] -A19E ; [.3DC6.0020.0002] -A19F ; [.3DC7.0020.0002] -A1A0 ; [.3DC8.0020.0002] -A1A1 ; [.3DC9.0020.0002] -A1A2 ; [.3DCA.0020.0002] -A1A3 ; [.3DCB.0020.0002] -A1A4 ; [.3DCC.0020.0002] -A1A5 ; [.3DCD.0020.0002] -A1A6 ; [.3DCE.0020.0002] -A1A7 ; [.3DCF.0020.0002] -A1A8 ; [.3DD0.0020.0002] -A1A9 ; [.3DD1.0020.0002] -A1AA ; [.3DD2.0020.0002] -A1AB ; [.3DD3.0020.0002] -A1AC ; [.3DD4.0020.0002] -A1AD ; [.3DD5.0020.0002] -A1AE ; [.3DD6.0020.0002] -A1AF ; [.3DD7.0020.0002] -A1B0 ; [.3DD8.0020.0002] -A1B1 ; [.3DD9.0020.0002] -A1B2 ; [.3DDA.0020.0002] -A1B3 ; [.3DDB.0020.0002] -A1B4 ; [.3DDC.0020.0002] -A1B5 ; [.3DDD.0020.0002] -A1B6 ; [.3DDE.0020.0002] -A1B7 ; [.3DDF.0020.0002] -A1B8 ; [.3DE0.0020.0002] -A1B9 ; [.3DE1.0020.0002] -A1BA ; [.3DE2.0020.0002] -A1BB ; [.3DE3.0020.0002] -A1BC ; [.3DE4.0020.0002] -A1BD ; [.3DE5.0020.0002] -A1BE ; [.3DE6.0020.0002] -A1BF ; [.3DE7.0020.0002] -A1C0 ; [.3DE8.0020.0002] -A1C1 ; [.3DE9.0020.0002] -A1C2 ; [.3DEA.0020.0002] -A1C3 ; [.3DEB.0020.0002] -A1C4 ; [.3DEC.0020.0002] -A1C5 ; [.3DED.0020.0002] -A1C6 ; [.3DEE.0020.0002] -A1C7 ; [.3DEF.0020.0002] -A1C8 ; [.3DF0.0020.0002] -A1C9 ; [.3DF1.0020.0002] -A1CA ; [.3DF2.0020.0002] -A1CB ; [.3DF3.0020.0002] -A1CC ; [.3DF4.0020.0002] -A1CD ; [.3DF5.0020.0002] -A1CE ; [.3DF6.0020.0002] -A1CF ; [.3DF7.0020.0002] -A1D0 ; [.3DF8.0020.0002] -A1D1 ; [.3DF9.0020.0002] -A1D2 ; [.3DFA.0020.0002] -A1D3 ; [.3DFB.0020.0002] -A1D4 ; [.3DFC.0020.0002] -A1D5 ; [.3DFD.0020.0002] -A1D6 ; [.3DFE.0020.0002] -A1D7 ; [.3DFF.0020.0002] -A1D8 ; [.3E00.0020.0002] -A1D9 ; [.3E01.0020.0002] -A1DA ; [.3E02.0020.0002] -A1DB ; [.3E03.0020.0002] -A1DC ; [.3E04.0020.0002] -A1DD ; [.3E05.0020.0002] -A1DE ; [.3E06.0020.0002] -A1DF ; [.3E07.0020.0002] -A1E0 ; [.3E08.0020.0002] -A1E1 ; [.3E09.0020.0002] -A1E2 ; [.3E0A.0020.0002] -A1E3 ; [.3E0B.0020.0002] -A1E4 ; [.3E0C.0020.0002] -A1E5 ; [.3E0D.0020.0002] -A1E6 ; [.3E0E.0020.0002] -A1E7 ; [.3E0F.0020.0002] -A1E8 ; [.3E10.0020.0002] -A1E9 ; [.3E11.0020.0002] -A1EA ; [.3E12.0020.0002] -A1EB ; [.3E13.0020.0002] -A1EC ; [.3E14.0020.0002] -A1ED ; [.3E15.0020.0002] -A1EE ; [.3E16.0020.0002] -A1EF ; [.3E17.0020.0002] -A1F0 ; [.3E18.0020.0002] -A1F1 ; [.3E19.0020.0002] -A1F2 ; [.3E1A.0020.0002] -A1F3 ; [.3E1B.0020.0002] -A1F4 ; [.3E1C.0020.0002] -A1F5 ; [.3E1D.0020.0002] -A1F6 ; [.3E1E.0020.0002] -A1F7 ; [.3E1F.0020.0002] -A1F8 ; [.3E20.0020.0002] -A1F9 ; [.3E21.0020.0002] -A1FA ; [.3E22.0020.0002] -A1FB ; [.3E23.0020.0002] -A1FC ; [.3E24.0020.0002] -A1FD ; [.3E25.0020.0002] -A1FE ; [.3E26.0020.0002] -A1FF ; [.3E27.0020.0002] -A200 ; [.3E28.0020.0002] -A201 ; [.3E29.0020.0002] -A202 ; [.3E2A.0020.0002] -A203 ; [.3E2B.0020.0002] -A204 ; [.3E2C.0020.0002] -A205 ; [.3E2D.0020.0002] -A206 ; [.3E2E.0020.0002] -A207 ; [.3E2F.0020.0002] -A208 ; [.3E30.0020.0002] -A209 ; [.3E31.0020.0002] -A20A ; [.3E32.0020.0002] -A20B ; [.3E33.0020.0002] -A20C ; [.3E34.0020.0002] -A20D ; [.3E35.0020.0002] -A20E ; [.3E36.0020.0002] -A20F ; [.3E37.0020.0002] -A210 ; [.3E38.0020.0002] -A211 ; [.3E39.0020.0002] -A212 ; [.3E3A.0020.0002] -A213 ; [.3E3B.0020.0002] -A214 ; [.3E3C.0020.0002] -A215 ; [.3E3D.0020.0002] -A216 ; [.3E3E.0020.0002] -A217 ; [.3E3F.0020.0002] -A218 ; [.3E40.0020.0002] -A219 ; [.3E41.0020.0002] -A21A ; [.3E42.0020.0002] -A21B ; [.3E43.0020.0002] -A21C ; [.3E44.0020.0002] -A21D ; [.3E45.0020.0002] -A21E ; [.3E46.0020.0002] -A21F ; [.3E47.0020.0002] -A220 ; [.3E48.0020.0002] -A221 ; [.3E49.0020.0002] -A222 ; [.3E4A.0020.0002] -A223 ; [.3E4B.0020.0002] -A224 ; [.3E4C.0020.0002] -A225 ; [.3E4D.0020.0002] -A226 ; [.3E4E.0020.0002] -A227 ; [.3E4F.0020.0002] -A228 ; [.3E50.0020.0002] -A229 ; [.3E51.0020.0002] -A22A ; [.3E52.0020.0002] -A22B ; [.3E53.0020.0002] -A22C ; [.3E54.0020.0002] -A22D ; [.3E55.0020.0002] -A22E ; [.3E56.0020.0002] -A22F ; [.3E57.0020.0002] -A230 ; [.3E58.0020.0002] -A231 ; [.3E59.0020.0002] -A232 ; [.3E5A.0020.0002] -A233 ; [.3E5B.0020.0002] -A234 ; [.3E5C.0020.0002] -A235 ; [.3E5D.0020.0002] -A236 ; [.3E5E.0020.0002] -A237 ; [.3E5F.0020.0002] -A238 ; [.3E60.0020.0002] -A239 ; [.3E61.0020.0002] -A23A ; [.3E62.0020.0002] -A23B ; [.3E63.0020.0002] -A23C ; [.3E64.0020.0002] -A23D ; [.3E65.0020.0002] -A23E ; [.3E66.0020.0002] -A23F ; [.3E67.0020.0002] -A240 ; [.3E68.0020.0002] -A241 ; [.3E69.0020.0002] -A242 ; [.3E6A.0020.0002] -A243 ; [.3E6B.0020.0002] -A244 ; [.3E6C.0020.0002] -A245 ; [.3E6D.0020.0002] -A246 ; [.3E6E.0020.0002] -A247 ; [.3E6F.0020.0002] -A248 ; [.3E70.0020.0002] -A249 ; [.3E71.0020.0002] -A24A ; [.3E72.0020.0002] -A24B ; [.3E73.0020.0002] -A24C ; [.3E74.0020.0002] -A24D ; [.3E75.0020.0002] -A24E ; [.3E76.0020.0002] -A24F ; [.3E77.0020.0002] -A250 ; [.3E78.0020.0002] -A251 ; [.3E79.0020.0002] -A252 ; [.3E7A.0020.0002] -A253 ; [.3E7B.0020.0002] -A254 ; [.3E7C.0020.0002] -A255 ; [.3E7D.0020.0002] -A256 ; [.3E7E.0020.0002] -A257 ; [.3E7F.0020.0002] -A258 ; [.3E80.0020.0002] -A259 ; [.3E81.0020.0002] -A25A ; [.3E82.0020.0002] -A25B ; [.3E83.0020.0002] -A25C ; [.3E84.0020.0002] -A25D ; [.3E85.0020.0002] -A25E ; [.3E86.0020.0002] -A25F ; [.3E87.0020.0002] -A260 ; [.3E88.0020.0002] -A261 ; [.3E89.0020.0002] -A262 ; [.3E8A.0020.0002] -A263 ; [.3E8B.0020.0002] -A264 ; [.3E8C.0020.0002] -A265 ; [.3E8D.0020.0002] -A266 ; [.3E8E.0020.0002] -A267 ; [.3E8F.0020.0002] -A268 ; [.3E90.0020.0002] -A269 ; [.3E91.0020.0002] -A26A ; [.3E92.0020.0002] -A26B ; [.3E93.0020.0002] -A26C ; [.3E94.0020.0002] -A26D ; [.3E95.0020.0002] -A26E ; [.3E96.0020.0002] -A26F ; [.3E97.0020.0002] -A270 ; [.3E98.0020.0002] -A271 ; [.3E99.0020.0002] -A272 ; [.3E9A.0020.0002] -A273 ; [.3E9B.0020.0002] -A274 ; [.3E9C.0020.0002] -A275 ; [.3E9D.0020.0002] -A276 ; [.3E9E.0020.0002] -A277 ; [.3E9F.0020.0002] -A278 ; [.3EA0.0020.0002] -A279 ; [.3EA1.0020.0002] -A27A ; [.3EA2.0020.0002] -A27B ; [.3EA3.0020.0002] -A27C ; [.3EA4.0020.0002] -A27D ; [.3EA5.0020.0002] -A27E ; [.3EA6.0020.0002] -A27F ; [.3EA7.0020.0002] -A280 ; [.3EA8.0020.0002] -A281 ; [.3EA9.0020.0002] -A282 ; [.3EAA.0020.0002] -A283 ; [.3EAB.0020.0002] -A284 ; [.3EAC.0020.0002] -A285 ; [.3EAD.0020.0002] -A286 ; [.3EAE.0020.0002] -A287 ; [.3EAF.0020.0002] -A288 ; [.3EB0.0020.0002] -A289 ; [.3EB1.0020.0002] -A28A ; [.3EB2.0020.0002] -A28B ; [.3EB3.0020.0002] -A28C ; [.3EB4.0020.0002] -A28D ; [.3EB5.0020.0002] -A28E ; [.3EB6.0020.0002] -A28F ; [.3EB7.0020.0002] -A290 ; [.3EB8.0020.0002] -A291 ; [.3EB9.0020.0002] -A292 ; [.3EBA.0020.0002] -A293 ; [.3EBB.0020.0002] -A294 ; [.3EBC.0020.0002] -A295 ; [.3EBD.0020.0002] -A296 ; [.3EBE.0020.0002] -A297 ; [.3EBF.0020.0002] -A298 ; [.3EC0.0020.0002] -A299 ; [.3EC1.0020.0002] -A29A ; [.3EC2.0020.0002] -A29B ; [.3EC3.0020.0002] -A29C ; [.3EC4.0020.0002] -A29D ; [.3EC5.0020.0002] -A29E ; [.3EC6.0020.0002] -A29F ; [.3EC7.0020.0002] -A2A0 ; [.3EC8.0020.0002] -A2A1 ; [.3EC9.0020.0002] -A2A2 ; [.3ECA.0020.0002] -A2A3 ; [.3ECB.0020.0002] -A2A4 ; [.3ECC.0020.0002] -A2A5 ; [.3ECD.0020.0002] -A2A6 ; [.3ECE.0020.0002] -A2A7 ; [.3ECF.0020.0002] -A2A8 ; [.3ED0.0020.0002] -A2A9 ; [.3ED1.0020.0002] -A2AA ; [.3ED2.0020.0002] -A2AB ; [.3ED3.0020.0002] -A2AC ; [.3ED4.0020.0002] -A2AD ; [.3ED5.0020.0002] -A2AE ; [.3ED6.0020.0002] -A2AF ; [.3ED7.0020.0002] -A2B0 ; [.3ED8.0020.0002] -A2B1 ; [.3ED9.0020.0002] -A2B2 ; [.3EDA.0020.0002] -A2B3 ; [.3EDB.0020.0002] -A2B4 ; [.3EDC.0020.0002] -A2B5 ; [.3EDD.0020.0002] -A2B6 ; [.3EDE.0020.0002] -A2B7 ; [.3EDF.0020.0002] -A2B8 ; [.3EE0.0020.0002] -A2B9 ; [.3EE1.0020.0002] -A2BA ; [.3EE2.0020.0002] -A2BB ; [.3EE3.0020.0002] -A2BC ; [.3EE4.0020.0002] -A2BD ; [.3EE5.0020.0002] -A2BE ; [.3EE6.0020.0002] -A2BF ; [.3EE7.0020.0002] -A2C0 ; [.3EE8.0020.0002] -A2C1 ; [.3EE9.0020.0002] -A2C2 ; [.3EEA.0020.0002] -A2C3 ; [.3EEB.0020.0002] -A2C4 ; [.3EEC.0020.0002] -A2C5 ; [.3EED.0020.0002] -A2C6 ; [.3EEE.0020.0002] -A2C7 ; [.3EEF.0020.0002] -A2C8 ; [.3EF0.0020.0002] -A2C9 ; [.3EF1.0020.0002] -A2CA ; [.3EF2.0020.0002] -A2CB ; [.3EF3.0020.0002] -A2CC ; [.3EF4.0020.0002] -A2CD ; [.3EF5.0020.0002] -A2CE ; [.3EF6.0020.0002] -A2CF ; [.3EF7.0020.0002] -A2D0 ; [.3EF8.0020.0002] -A2D1 ; [.3EF9.0020.0002] -A2D2 ; [.3EFA.0020.0002] -A2D3 ; [.3EFB.0020.0002] -A2D4 ; [.3EFC.0020.0002] -A2D5 ; [.3EFD.0020.0002] -A2D6 ; [.3EFE.0020.0002] -A2D7 ; [.3EFF.0020.0002] -A2D8 ; [.3F00.0020.0002] -A2D9 ; [.3F01.0020.0002] -A2DA ; [.3F02.0020.0002] -A2DB ; [.3F03.0020.0002] -A2DC ; [.3F04.0020.0002] -A2DD ; [.3F05.0020.0002] -A2DE ; [.3F06.0020.0002] -A2DF ; [.3F07.0020.0002] -A2E0 ; [.3F08.0020.0002] -A2E1 ; [.3F09.0020.0002] -A2E2 ; [.3F0A.0020.0002] -A2E3 ; [.3F0B.0020.0002] -A2E4 ; [.3F0C.0020.0002] -A2E5 ; [.3F0D.0020.0002] -A2E6 ; [.3F0E.0020.0002] -A2E7 ; [.3F0F.0020.0002] -A2E8 ; [.3F10.0020.0002] -A2E9 ; [.3F11.0020.0002] -A2EA ; [.3F12.0020.0002] -A2EB ; [.3F13.0020.0002] -A2EC ; [.3F14.0020.0002] -A2ED ; [.3F15.0020.0002] -A2EE ; [.3F16.0020.0002] -A2EF ; [.3F17.0020.0002] -A2F0 ; [.3F18.0020.0002] -A2F1 ; [.3F19.0020.0002] -A2F2 ; [.3F1A.0020.0002] -A2F3 ; [.3F1B.0020.0002] -A2F4 ; [.3F1C.0020.0002] -A2F5 ; [.3F1D.0020.0002] -A2F6 ; [.3F1E.0020.0002] -A2F7 ; [.3F1F.0020.0002] -A2F8 ; [.3F20.0020.0002] -A2F9 ; [.3F21.0020.0002] -A2FA ; [.3F22.0020.0002] -A2FB ; [.3F23.0020.0002] -A2FC ; [.3F24.0020.0002] -A2FD ; [.3F25.0020.0002] -A2FE ; [.3F26.0020.0002] -A2FF ; [.3F27.0020.0002] -A300 ; [.3F28.0020.0002] -A301 ; [.3F29.0020.0002] -A302 ; [.3F2A.0020.0002] -A303 ; [.3F2B.0020.0002] -A304 ; [.3F2C.0020.0002] -A305 ; [.3F2D.0020.0002] -A306 ; [.3F2E.0020.0002] -A307 ; [.3F2F.0020.0002] -A308 ; [.3F30.0020.0002] -A309 ; [.3F31.0020.0002] -A30A ; [.3F32.0020.0002] -A30B ; [.3F33.0020.0002] -A30C ; [.3F34.0020.0002] -A30D ; [.3F35.0020.0002] -A30E ; [.3F36.0020.0002] -A30F ; [.3F37.0020.0002] -A310 ; [.3F38.0020.0002] -A311 ; [.3F39.0020.0002] -A312 ; [.3F3A.0020.0002] -A313 ; [.3F3B.0020.0002] -A314 ; [.3F3C.0020.0002] -A315 ; [.3F3D.0020.0002] -A316 ; [.3F3E.0020.0002] -A317 ; [.3F3F.0020.0002] -A318 ; [.3F40.0020.0002] -A319 ; [.3F41.0020.0002] -A31A ; [.3F42.0020.0002] -A31B ; [.3F43.0020.0002] -A31C ; [.3F44.0020.0002] -A31D ; [.3F45.0020.0002] -A31E ; [.3F46.0020.0002] -A31F ; [.3F47.0020.0002] -A320 ; [.3F48.0020.0002] -A321 ; [.3F49.0020.0002] -A322 ; [.3F4A.0020.0002] -A323 ; [.3F4B.0020.0002] -A324 ; [.3F4C.0020.0002] -A325 ; [.3F4D.0020.0002] -A326 ; [.3F4E.0020.0002] -A327 ; [.3F4F.0020.0002] -A328 ; [.3F50.0020.0002] -A329 ; [.3F51.0020.0002] -A32A ; [.3F52.0020.0002] -A32B ; [.3F53.0020.0002] -A32C ; [.3F54.0020.0002] -A32D ; [.3F55.0020.0002] -A32E ; [.3F56.0020.0002] -A32F ; [.3F57.0020.0002] -A330 ; [.3F58.0020.0002] -A331 ; [.3F59.0020.0002] -A332 ; [.3F5A.0020.0002] -A333 ; [.3F5B.0020.0002] -A334 ; [.3F5C.0020.0002] -A335 ; [.3F5D.0020.0002] -A336 ; [.3F5E.0020.0002] -A337 ; [.3F5F.0020.0002] -A338 ; [.3F60.0020.0002] -A339 ; [.3F61.0020.0002] -A33A ; [.3F62.0020.0002] -A33B ; [.3F63.0020.0002] -A33C ; [.3F64.0020.0002] -A33D ; [.3F65.0020.0002] -A33E ; [.3F66.0020.0002] -A33F ; [.3F67.0020.0002] -A340 ; [.3F68.0020.0002] -A341 ; [.3F69.0020.0002] -A342 ; [.3F6A.0020.0002] -A343 ; [.3F6B.0020.0002] -A344 ; [.3F6C.0020.0002] -A345 ; [.3F6D.0020.0002] -A346 ; [.3F6E.0020.0002] -A347 ; [.3F6F.0020.0002] -A348 ; [.3F70.0020.0002] -A349 ; [.3F71.0020.0002] -A34A ; [.3F72.0020.0002] -A34B ; [.3F73.0020.0002] -A34C ; [.3F74.0020.0002] -A34D ; [.3F75.0020.0002] -A34E ; [.3F76.0020.0002] -A34F ; [.3F77.0020.0002] -A350 ; [.3F78.0020.0002] -A351 ; [.3F79.0020.0002] -A352 ; [.3F7A.0020.0002] -A353 ; [.3F7B.0020.0002] -A354 ; [.3F7C.0020.0002] -A355 ; [.3F7D.0020.0002] -A356 ; [.3F7E.0020.0002] -A357 ; [.3F7F.0020.0002] -A358 ; [.3F80.0020.0002] -A359 ; [.3F81.0020.0002] -A35A ; [.3F82.0020.0002] -A35B ; [.3F83.0020.0002] -A35C ; [.3F84.0020.0002] -A35D ; [.3F85.0020.0002] -A35E ; [.3F86.0020.0002] -A35F ; [.3F87.0020.0002] -A360 ; [.3F88.0020.0002] -A361 ; [.3F89.0020.0002] -A362 ; [.3F8A.0020.0002] -A363 ; [.3F8B.0020.0002] -A364 ; [.3F8C.0020.0002] -A365 ; [.3F8D.0020.0002] -A366 ; [.3F8E.0020.0002] -A367 ; [.3F8F.0020.0002] -A368 ; [.3F90.0020.0002] -A369 ; [.3F91.0020.0002] -A36A ; [.3F92.0020.0002] -A36B ; [.3F93.0020.0002] -A36C ; [.3F94.0020.0002] -A36D ; [.3F95.0020.0002] -A36E ; [.3F96.0020.0002] -A36F ; [.3F97.0020.0002] -A370 ; [.3F98.0020.0002] -A371 ; [.3F99.0020.0002] -A372 ; [.3F9A.0020.0002] -A373 ; [.3F9B.0020.0002] -A374 ; [.3F9C.0020.0002] -A375 ; [.3F9D.0020.0002] -A376 ; [.3F9E.0020.0002] -A377 ; [.3F9F.0020.0002] -A378 ; [.3FA0.0020.0002] -A379 ; [.3FA1.0020.0002] -A37A ; [.3FA2.0020.0002] -A37B ; [.3FA3.0020.0002] -A37C ; [.3FA4.0020.0002] -A37D ; [.3FA5.0020.0002] -A37E ; [.3FA6.0020.0002] -A37F ; [.3FA7.0020.0002] -A380 ; [.3FA8.0020.0002] -A381 ; [.3FA9.0020.0002] -A382 ; [.3FAA.0020.0002] -A383 ; [.3FAB.0020.0002] -A384 ; [.3FAC.0020.0002] -A385 ; [.3FAD.0020.0002] -A386 ; [.3FAE.0020.0002] -A387 ; [.3FAF.0020.0002] -A388 ; [.3FB0.0020.0002] -A389 ; [.3FB1.0020.0002] -A38A ; [.3FB2.0020.0002] -A38B ; [.3FB3.0020.0002] -A38C ; [.3FB4.0020.0002] -A38D ; [.3FB5.0020.0002] -A38E ; [.3FB6.0020.0002] -A38F ; [.3FB7.0020.0002] -A390 ; [.3FB8.0020.0002] -A391 ; [.3FB9.0020.0002] -A392 ; [.3FBA.0020.0002] -A393 ; [.3FBB.0020.0002] -A394 ; [.3FBC.0020.0002] -A395 ; [.3FBD.0020.0002] -A396 ; [.3FBE.0020.0002] -A397 ; [.3FBF.0020.0002] -A398 ; [.3FC0.0020.0002] -A399 ; [.3FC1.0020.0002] -A39A ; [.3FC2.0020.0002] -A39B ; [.3FC3.0020.0002] -A39C ; [.3FC4.0020.0002] -A39D ; [.3FC5.0020.0002] -A39E ; [.3FC6.0020.0002] -A39F ; [.3FC7.0020.0002] -A3A0 ; [.3FC8.0020.0002] -A3A1 ; [.3FC9.0020.0002] -A3A2 ; [.3FCA.0020.0002] -A3A3 ; [.3FCB.0020.0002] -A3A4 ; [.3FCC.0020.0002] -A3A5 ; [.3FCD.0020.0002] -A3A6 ; [.3FCE.0020.0002] -A3A7 ; [.3FCF.0020.0002] -A3A8 ; [.3FD0.0020.0002] -A3A9 ; [.3FD1.0020.0002] -A3AA ; [.3FD2.0020.0002] -A3AB ; [.3FD3.0020.0002] -A3AC ; [.3FD4.0020.0002] -A3AD ; [.3FD5.0020.0002] -A3AE ; [.3FD6.0020.0002] -A3AF ; [.3FD7.0020.0002] -A3B0 ; [.3FD8.0020.0002] -A3B1 ; [.3FD9.0020.0002] -A3B2 ; [.3FDA.0020.0002] -A3B3 ; [.3FDB.0020.0002] -A3B4 ; [.3FDC.0020.0002] -A3B5 ; [.3FDD.0020.0002] -A3B6 ; [.3FDE.0020.0002] -A3B7 ; [.3FDF.0020.0002] -A3B8 ; [.3FE0.0020.0002] -A3B9 ; [.3FE1.0020.0002] -A3BA ; [.3FE2.0020.0002] -A3BB ; [.3FE3.0020.0002] -A3BC ; [.3FE4.0020.0002] -A3BD ; [.3FE5.0020.0002] -A3BE ; [.3FE6.0020.0002] -A3BF ; [.3FE7.0020.0002] -A3C0 ; [.3FE8.0020.0002] -A3C1 ; [.3FE9.0020.0002] -A3C2 ; [.3FEA.0020.0002] -A3C3 ; [.3FEB.0020.0002] -A3C4 ; [.3FEC.0020.0002] -A3C5 ; [.3FED.0020.0002] -A3C6 ; [.3FEE.0020.0002] -A3C7 ; [.3FEF.0020.0002] -A3C8 ; [.3FF0.0020.0002] -A3C9 ; [.3FF1.0020.0002] -A3CA ; [.3FF2.0020.0002] -A3CB ; [.3FF3.0020.0002] -A3CC ; [.3FF4.0020.0002] -A3CD ; [.3FF5.0020.0002] -A3CE ; [.3FF6.0020.0002] -A3CF ; [.3FF7.0020.0002] -A3D0 ; [.3FF8.0020.0002] -A3D1 ; [.3FF9.0020.0002] -A3D2 ; [.3FFA.0020.0002] -A3D3 ; [.3FFB.0020.0002] -A3D4 ; [.3FFC.0020.0002] -A3D5 ; [.3FFD.0020.0002] -A3D6 ; [.3FFE.0020.0002] -A3D7 ; [.3FFF.0020.0002] -A3D8 ; [.4000.0020.0002] -A3D9 ; [.4001.0020.0002] -A3DA ; [.4002.0020.0002] -A3DB ; [.4003.0020.0002] -A3DC ; [.4004.0020.0002] -A3DD ; [.4005.0020.0002] -A3DE ; [.4006.0020.0002] -A3DF ; [.4007.0020.0002] -A3E0 ; [.4008.0020.0002] -A3E1 ; [.4009.0020.0002] -A3E2 ; [.400A.0020.0002] -A3E3 ; [.400B.0020.0002] -A3E4 ; [.400C.0020.0002] -A3E5 ; [.400D.0020.0002] -A3E6 ; [.400E.0020.0002] -A3E7 ; [.400F.0020.0002] -A3E8 ; [.4010.0020.0002] -A3E9 ; [.4011.0020.0002] -A3EA ; [.4012.0020.0002] -A3EB ; [.4013.0020.0002] -A3EC ; [.4014.0020.0002] -A3ED ; [.4015.0020.0002] -A3EE ; [.4016.0020.0002] -A3EF ; [.4017.0020.0002] -A3F0 ; [.4018.0020.0002] -A3F1 ; [.4019.0020.0002] -A3F2 ; [.401A.0020.0002] -A3F3 ; [.401B.0020.0002] -A3F4 ; [.401C.0020.0002] -A3F5 ; [.401D.0020.0002] -A3F6 ; [.401E.0020.0002] -A3F7 ; [.401F.0020.0002] -A3F8 ; [.4020.0020.0002] -A3F9 ; [.4021.0020.0002] -A3FA ; [.4022.0020.0002] -A3FB ; [.4023.0020.0002] -A3FC ; [.4024.0020.0002] -A3FD ; [.4025.0020.0002] -A3FE ; [.4026.0020.0002] -A3FF ; [.4027.0020.0002] -A400 ; [.4028.0020.0002] -A401 ; [.4029.0020.0002] -A402 ; [.402A.0020.0002] -A403 ; [.402B.0020.0002] -A404 ; [.402C.0020.0002] -A405 ; [.402D.0020.0002] -A406 ; [.402E.0020.0002] -A407 ; [.402F.0020.0002] -A408 ; [.4030.0020.0002] -A409 ; [.4031.0020.0002] -A40A ; [.4032.0020.0002] -A40B ; [.4033.0020.0002] -A40C ; [.4034.0020.0002] -A40D ; [.4035.0020.0002] -A40E ; [.4036.0020.0002] -A40F ; [.4037.0020.0002] -A410 ; [.4038.0020.0002] -A411 ; [.4039.0020.0002] -A412 ; [.403A.0020.0002] -A413 ; [.403B.0020.0002] -A414 ; [.403C.0020.0002] -A415 ; [.403D.0020.0002] -A416 ; [.403E.0020.0002] -A417 ; [.403F.0020.0002] -A418 ; [.4040.0020.0002] -A419 ; [.4041.0020.0002] -A41A ; [.4042.0020.0002] -A41B ; [.4043.0020.0002] -A41C ; [.4044.0020.0002] -A41D ; [.4045.0020.0002] -A41E ; [.4046.0020.0002] -A41F ; [.4047.0020.0002] -A420 ; [.4048.0020.0002] -A421 ; [.4049.0020.0002] -A422 ; [.404A.0020.0002] -A423 ; [.404B.0020.0002] -A424 ; [.404C.0020.0002] -A425 ; [.404D.0020.0002] -A426 ; [.404E.0020.0002] -A427 ; [.404F.0020.0002] -A428 ; [.4050.0020.0002] -A429 ; [.4051.0020.0002] -A42A ; [.4052.0020.0002] -A42B ; [.4053.0020.0002] -A42C ; [.4054.0020.0002] -A42D ; [.4055.0020.0002] -A42E ; [.4056.0020.0002] -A42F ; [.4057.0020.0002] -A430 ; [.4058.0020.0002] -A431 ; [.4059.0020.0002] -A432 ; [.405A.0020.0002] -A433 ; [.405B.0020.0002] -A434 ; [.405C.0020.0002] -A435 ; [.405D.0020.0002] -A436 ; [.405E.0020.0002] -A437 ; [.405F.0020.0002] -A438 ; [.4060.0020.0002] -A439 ; [.4061.0020.0002] -A43A ; [.4062.0020.0002] -A43B ; [.4063.0020.0002] -A43C ; [.4064.0020.0002] -A43D ; [.4065.0020.0002] -A43E ; [.4066.0020.0002] -A43F ; [.4067.0020.0002] -A440 ; [.4068.0020.0002] -A441 ; [.4069.0020.0002] -A442 ; [.406A.0020.0002] -A443 ; [.406B.0020.0002] -A444 ; [.406C.0020.0002] -A445 ; [.406D.0020.0002] -A446 ; [.406E.0020.0002] -A447 ; [.406F.0020.0002] -A448 ; [.4070.0020.0002] -A449 ; [.4071.0020.0002] -A44A ; [.4072.0020.0002] -A44B ; [.4073.0020.0002] -A44C ; [.4074.0020.0002] -A44D ; [.4075.0020.0002] -A44E ; [.4076.0020.0002] -A44F ; [.4077.0020.0002] -A450 ; [.4078.0020.0002] -A451 ; [.4079.0020.0002] -A452 ; [.407A.0020.0002] -A453 ; [.407B.0020.0002] -A454 ; [.407C.0020.0002] -A455 ; [.407D.0020.0002] -A456 ; [.407E.0020.0002] -A457 ; [.407F.0020.0002] -A458 ; [.4080.0020.0002] -A459 ; [.4081.0020.0002] -A45A ; [.4082.0020.0002] -A45B ; [.4083.0020.0002] -A45C ; [.4084.0020.0002] -A45D ; [.4085.0020.0002] -A45E ; [.4086.0020.0002] -A45F ; [.4087.0020.0002] -A460 ; [.4088.0020.0002] -A461 ; [.4089.0020.0002] -A462 ; [.408A.0020.0002] -A463 ; [.408B.0020.0002] -A464 ; [.408C.0020.0002] -A465 ; [.408D.0020.0002] -A466 ; [.408E.0020.0002] -A467 ; [.408F.0020.0002] -A468 ; [.4090.0020.0002] -A469 ; [.4091.0020.0002] -A46A ; [.4092.0020.0002] -A46B ; [.4093.0020.0002] -A46C ; [.4094.0020.0002] -A46D ; [.4095.0020.0002] -A46E ; [.4096.0020.0002] -A46F ; [.4097.0020.0002] -A470 ; [.4098.0020.0002] -A471 ; [.4099.0020.0002] -A472 ; [.409A.0020.0002] -A473 ; [.409B.0020.0002] -A474 ; [.409C.0020.0002] -A475 ; [.409D.0020.0002] -A476 ; [.409E.0020.0002] -A477 ; [.409F.0020.0002] -A478 ; [.40A0.0020.0002] -A479 ; [.40A1.0020.0002] -A47A ; [.40A2.0020.0002] -A47B ; [.40A3.0020.0002] -A47C ; [.40A4.0020.0002] -A47D ; [.40A5.0020.0002] -A47E ; [.40A6.0020.0002] -A47F ; [.40A7.0020.0002] -A480 ; [.40A8.0020.0002] -A481 ; [.40A9.0020.0002] -A482 ; [.40AA.0020.0002] -A483 ; [.40AB.0020.0002] -A484 ; [.40AC.0020.0002] -A485 ; [.40AD.0020.0002] -A486 ; [.40AE.0020.0002] -A487 ; [.40AF.0020.0002] -A488 ; [.40B0.0020.0002] -A489 ; [.40B1.0020.0002] -A48A ; [.40B2.0020.0002] -A48B ; [.40B3.0020.0002] -A48C ; [.40B4.0020.0002] -A4F8 ; [.40B5.0020.0002] -A4F9 ; [.40B6.0020.0002] -A4FA ; [.40B7.0020.0002] -A4FB ; [.40B8.0020.0002] -A4FD ; [.40B9.0020.0002] -A4FC ; [.40BA.0020.0002] -A4D0 ; [.40BB.0020.0002] -A4D1 ; [.40BC.0020.0002] -A4D2 ; [.40BD.0020.0002] -A4D3 ; [.40BE.0020.0002] -A4D4 ; [.40BF.0020.0002] -A4D5 ; [.40C0.0020.0002] -A4D6 ; [.40C1.0020.0002] -A4D7 ; [.40C2.0020.0002] -A4D8 ; [.40C3.0020.0002] -A4D9 ; [.40C4.0020.0002] -A4DA ; [.40C5.0020.0002] -A4DB ; [.40C6.0020.0002] -A4DC ; [.40C7.0020.0002] -A4DD ; [.40C8.0020.0002] -A4DE ; [.40C9.0020.0002] -A4DF ; [.40CA.0020.0002] -A4E0 ; [.40CB.0020.0002] -A4E1 ; [.40CC.0020.0002] -A4E2 ; [.40CD.0020.0002] -A4E3 ; [.40CE.0020.0002] -A4E4 ; [.40CF.0020.0002] -A4E5 ; [.40D0.0020.0002] -A4E6 ; [.40D1.0020.0002] -A4E7 ; [.40D2.0020.0002] -A4E8 ; [.40D3.0020.0002] -A4E9 ; [.40D4.0020.0002] -A4EB ; [.40D5.0020.0002] -A4ED ; [.40D6.0020.0002] -A4EA ; [.40D7.0020.0002] -A4EC ; [.40D8.0020.0002] -A4EE ; [.40D9.0020.0002] -A4EF ; [.40DA.0020.0002] -A4F0 ; [.40DB.0020.0002] -A4F1 ; [.40DC.0020.0002] -A4F2 ; [.40DD.0020.0002] -A4F3 ; [.40DE.0020.0002] -A4F4 ; [.40DF.0020.0002] -A4F5 ; [.40E0.0020.0002] -A4F6 ; [.40E1.0020.0002] -A4F7 ; [.40E2.0020.0002] -16F00 ; [.40E3.0020.0002] -16F01 ; [.40E4.0020.0002] -16F02 ; [.40E5.0020.0002] -16F03 ; [.40E6.0020.0002] -16F04 ; [.40E7.0020.0002] -16F06 ; [.40E7.0020.0004] -16F05 ; [.40E8.0020.0002] -16F07 ; [.40E9.0020.0002] -16F08 ; [.40EA.0020.0002] -16F09 ; [.40EB.0020.0002] -16F0A ; [.40EC.0020.0002] -16F0B ; [.40ED.0020.0002] -16F0C ; [.40EE.0020.0002] -16F0D ; [.40EF.0020.0002] -16F0E ; [.40F0.0020.0002] -16F0F ; [.40F1.0020.0002] -16F10 ; [.40F2.0020.0002] -16F13 ; [.40F2.0020.0004] -16F11 ; [.40F3.0020.0002] -16F12 ; [.40F4.0020.0002] -16F14 ; [.40F5.0020.0002] -16F15 ; [.40F6.0020.0002] -16F16 ; [.40F7.0020.0002] -16F17 ; [.40F8.0020.0002] -16F18 ; [.40F9.0020.0002] -16F19 ; [.40FA.0020.0002] -16F1A ; [.40FB.0020.0002] -16F1B ; [.40FC.0020.0002] -16F1C ; [.40FD.0020.0002] -16F1D ; [.40FE.0020.0002] -16F1E ; [.40FF.0020.0002] -16F1F ; [.4100.0020.0002] -16F20 ; [.4101.0020.0002] -16F21 ; [.4102.0020.0002] -16F22 ; [.4103.0020.0002] -16F23 ; [.4104.0020.0002] -16F25 ; [.4104.0020.0004] -16F24 ; [.4105.0020.0002] -16F26 ; [.4106.0020.0002] -16F27 ; [.4107.0020.0002] -16F28 ; [.4108.0020.0002] -16F29 ; [.4109.0020.0002] -16F2A ; [.410A.0020.0002] -16F2B ; [.410B.0020.0002] -16F2C ; [.410C.0020.0002] -16F2D ; [.410D.0020.0002] -16F2E ; [.410E.0020.0002] -16F2F ; [.410F.0020.0002] -16F30 ; [.4110.0020.0002] -16F31 ; [.4111.0020.0002] -16F32 ; [.4112.0020.0002] -16F33 ; [.4113.0020.0002] -16F34 ; [.4114.0020.0002] -16F35 ; [.4115.0020.0002] -16F36 ; [.4116.0020.0002] -16F37 ; [.4117.0020.0002] -16F38 ; [.4118.0020.0002] -16F39 ; [.4119.0020.0002] -16F3A ; [.411A.0020.0002] -16F3B ; [.411B.0020.0002] -16F3C ; [.411C.0020.0002] -16F3D ; [.411D.0020.0002] -16F3F ; [.411D.0020.0004] -16F3E ; [.411E.0020.0002] -16F40 ; [.411F.0020.0002] -16F41 ; [.4120.0020.0002] -16F42 ; [.4121.0020.0002] -16F43 ; [.4122.0020.0002] -16F44 ; [.4123.0020.0002] -16F50 ; [.4124.0020.0002] -16F51 ; [.4125.0020.0002] -16F52 ; [.4126.0020.0002] -16F53 ; [.4127.0020.0002] -16F54 ; [.4128.0020.0002] -16F55 ; [.4129.0020.0002] -16F56 ; [.412A.0020.0002] -16F57 ; [.412B.0020.0002] -16F58 ; [.412C.0020.0002] -16F59 ; [.412D.0020.0002] -16F5A ; [.412E.0020.0002] -16F5B ; [.412F.0020.0002] -16F5C ; [.4130.0020.0002] -16F5D ; [.4131.0020.0002] -16F5E ; [.4132.0020.0002] -16F5F ; [.4133.0020.0002] -16F60 ; [.4134.0020.0002] -16F61 ; [.4135.0020.0002] -16F62 ; [.4136.0020.0002] -16F63 ; [.4137.0020.0002] -16F64 ; [.4138.0020.0002] -16F65 ; [.4139.0020.0002] -16F66 ; [.413A.0020.0002] -16F67 ; [.413B.0020.0002] -16F68 ; [.413C.0020.0002] -16F69 ; [.413D.0020.0002] -16F6A ; [.413E.0020.0002] -16F6B ; [.413F.0020.0002] -16F6C ; [.4140.0020.0002] -16F6D ; [.4141.0020.0002] -16F6E ; [.4142.0020.0002] -16F6F ; [.4143.0020.0002] -16F70 ; [.4144.0020.0002] -16F71 ; [.4145.0020.0002] -16F72 ; [.4146.0020.0002] -16F73 ; [.4147.0020.0002] -16F74 ; [.4148.0020.0002] -16F75 ; [.4149.0020.0002] -16F76 ; [.414A.0020.0002] -16F77 ; [.414B.0020.0002] -16F78 ; [.414C.0020.0002] -16F79 ; [.414D.0020.0002] -16F7A ; [.414E.0020.0002] -16F7B ; [.414F.0020.0002] -16F7C ; [.4150.0020.0002] -16F7D ; [.4151.0020.0002] -16F7E ; [.4152.0020.0002] -16F8F ; [.4153.0020.0002] -16F90 ; [.4154.0020.0002] -16F91 ; [.4155.0020.0002] -16F92 ; [.4156.0020.0002] -16F93 ; [.4157.0020.0002] -16F94 ; [.4158.0020.0002] -16F95 ; [.4159.0020.0002] -16F96 ; [.415A.0020.0002] -16F97 ; [.415B.0020.0002] -16F98 ; [.415C.0020.0002] -16F99 ; [.415D.0020.0002] -16F9A ; [.415E.0020.0002] -16F9B ; [.415F.0020.0002] -16F9C ; [.4160.0020.0002] -16F9D ; [.4161.0020.0002] -16F9E ; [.4162.0020.0002] -16F9F ; [.4163.0020.0002] -118FF ; [.4164.0020.0002] -118C0 ; [.4165.0020.0002] -118A0 ; [.4165.0020.0008] -118C1 ; [.4166.0020.0002] -118A1 ; [.4166.0020.0008] -118C2 ; [.4167.0020.0002] -118A2 ; [.4167.0020.0008] -118C3 ; [.4168.0020.0002] -118A3 ; [.4168.0020.0008] -118C4 ; [.4169.0020.0002] -118A4 ; [.4169.0020.0008] -118C5 ; [.416A.0020.0002] -118A5 ; [.416A.0020.0008] -118C6 ; [.416B.0020.0002] -118A6 ; [.416B.0020.0008] -118C7 ; [.416C.0020.0002] -118A7 ; [.416C.0020.0008] -118C8 ; [.416D.0020.0002] -118A8 ; [.416D.0020.0008] -118C9 ; [.416E.0020.0002] -118A9 ; [.416E.0020.0008] -118CA ; [.416F.0020.0002] -118AA ; [.416F.0020.0008] -118CB ; [.4170.0020.0002] -118AB ; [.4170.0020.0008] -118CC ; [.4171.0020.0002] -118AC ; [.4171.0020.0008] -118CD ; [.4172.0020.0002] -118AD ; [.4172.0020.0008] -118CE ; [.4173.0020.0002] -118AE ; [.4173.0020.0008] -118CF ; [.4174.0020.0002] -118AF ; [.4174.0020.0008] -118D0 ; [.4175.0020.0002] -118B0 ; [.4175.0020.0008] -118D1 ; [.4176.0020.0002] -118B1 ; [.4176.0020.0008] -118D2 ; [.4177.0020.0002] -118B2 ; [.4177.0020.0008] -118D3 ; [.4178.0020.0002] -118B3 ; [.4178.0020.0008] -118D4 ; [.4179.0020.0002] -118B4 ; [.4179.0020.0008] -118D5 ; [.417A.0020.0002] -118B5 ; [.417A.0020.0008] -118D6 ; [.417B.0020.0002] -118B6 ; [.417B.0020.0008] -118D7 ; [.417C.0020.0002] -118B7 ; [.417C.0020.0008] -118D8 ; [.417D.0020.0002] -118B8 ; [.417D.0020.0008] -118D9 ; [.417E.0020.0002] -118B9 ; [.417E.0020.0008] -118DA ; [.417F.0020.0002] -118BA ; [.417F.0020.0008] -118DB ; [.4180.0020.0002] -118BB ; [.4180.0020.0008] -118DC ; [.4181.0020.0002] -118BC ; [.4181.0020.0008] -118DD ; [.4182.0020.0002] -118BD ; [.4182.0020.0008] -118DE ; [.4183.0020.0002] -118BE ; [.4183.0020.0008] -118DF ; [.4184.0020.0002] -118BF ; [.4184.0020.0008] -11AD5 ; [.4185.0020.0002] -11AD6 ; [.4186.0020.0002] -11AD7 ; [.4187.0020.0002] -11AD8 ; [.4188.0020.0002] -11AD9 ; [.4189.0020.0002] -11ADA ; [.418A.0020.0002] -11ADB ; [.418B.0020.0002] -11AC0 ; [.418C.0020.0002] -11AC1 ; [.418D.0020.0002] -11AC2 ; [.418E.0020.0002] -11AC3 ; [.418F.0020.0002] -11AC4 ; [.4190.0020.0002] -11AC5 ; [.4191.0020.0002] -11AC6 ; [.4192.0020.0002] -11AC7 ; [.4193.0020.0002] -11AC8 ; [.4194.0020.0002] -11AC9 ; [.4195.0020.0002] -11ACA ; [.4196.0020.0002] -11ACB ; [.4197.0020.0002] -11ACC ; [.4198.0020.0002] -11ACD ; [.4199.0020.0002] -11ACE ; [.419A.0020.0002] -11ACF ; [.419B.0020.0002] -11AD0 ; [.419C.0020.0002] -11AD1 ; [.419D.0020.0002] -11AD2 ; [.419E.0020.0002] -11AD3 ; [.419F.0020.0002] -11AD4 ; [.41A0.0020.0002] -11ADC ; [.41A1.0020.0002] -11ADD ; [.41A2.0020.0002] -11ADF ; [.41A3.0020.0002] -11AE0 ; [.41A4.0020.0002] -11AE1 ; [.41A5.0020.0002] -11AE2 ; [.41A6.0020.0002] -11AE3 ; [.41A7.0020.0002] -11ADE ; [.41A8.0020.0002] -11AE4 ; [.41A9.0020.0002] -11AEF ; [.41AA.0020.0002] -11AF2 ; [.41AB.0020.0002] -11AF1 ; [.41AC.0020.0002] -11AE6 ; [.41AD.0020.0002] -11AE9 ; [.41AE.0020.0002] -11AE5 ; [.41AF.0020.0002] -11AE8 ; [.41B0.0020.0002] -11AF4 ; [.41B1.0020.0002] -11AF7 ; [.41B2.0020.0002] -11AF3 ; [.41B3.0020.0002] -11AF6 ; [.41B4.0020.0002] -11AEC ; [.41B5.0020.0002] -11AEE ; [.41B6.0020.0002] -11AEB ; [.41B7.0020.0002] -11AED ; [.41B8.0020.0002] -11AF5 ; [.41B9.0020.0002] -11AF8 ; [.41BA.0020.0002] -11AE7 ; [.41BB.0020.0002] -11AEA ; [.41BC.0020.0002] -11AF0 ; [.41BD.0020.0002] -16B00 ; [.41BE.0020.0002] -16B01 ; [.41BF.0020.0002] -16B02 ; [.41C0.0020.0002] -16B03 ; [.41C1.0020.0002] -16B04 ; [.41C2.0020.0002] -16B05 ; [.41C3.0020.0002] -16B06 ; [.41C4.0020.0002] -16B07 ; [.41C5.0020.0002] -16B08 ; [.41C6.0020.0002] -16B09 ; [.41C7.0020.0002] -16B0A ; [.41C8.0020.0002] -16B0B ; [.41C9.0020.0002] -16B0C ; [.41CA.0020.0002] -16B0D ; [.41CB.0020.0002] -16B0E ; [.41CC.0020.0002] -16B0F ; [.41CD.0020.0002] -16B10 ; [.41CE.0020.0002] -16B11 ; [.41CF.0020.0002] -16B12 ; [.41D0.0020.0002] -16B13 ; [.41D1.0020.0002] -16B14 ; [.41D2.0020.0002] -16B15 ; [.41D3.0020.0002] -16B16 ; [.41D4.0020.0002] -16B17 ; [.41D5.0020.0002] -16B18 ; [.41D6.0020.0002] -16B19 ; [.41D7.0020.0002] -16B1A ; [.41D8.0020.0002] -16B1B ; [.41D9.0020.0002] -16B1C ; [.41DA.0020.0002] -16B1D ; [.41DB.0020.0002] -16B1E ; [.41DC.0020.0002] -16B1F ; [.41DD.0020.0002] -16B20 ; [.41DE.0020.0002] -16B21 ; [.41DF.0020.0002] -16B22 ; [.41E0.0020.0002] -16B23 ; [.41E1.0020.0002] -16B24 ; [.41E2.0020.0002] -16B25 ; [.41E3.0020.0002] -16B26 ; [.41E4.0020.0002] -16B27 ; [.41E5.0020.0002] -16B28 ; [.41E6.0020.0002] -16B29 ; [.41E7.0020.0002] -16B2A ; [.41E8.0020.0002] -16B2B ; [.41E9.0020.0002] -16B2C ; [.41EA.0020.0002] -16B2D ; [.41EB.0020.0002] -16B2E ; [.41EC.0020.0002] -16B2F ; [.41ED.0020.0002] -16B40 ; [.41EE.0020.0002] -16B41 ; [.41EF.0020.0002] -16B63 ; [.41F0.0020.0002] -16B64 ; [.41F1.0020.0002] -16B65 ; [.41F2.0020.0002] -16B66 ; [.41F3.0020.0002] -16B67 ; [.41F4.0020.0002] -16B68 ; [.41F5.0020.0002] -16B69 ; [.41F6.0020.0002] -16B6A ; [.41F7.0020.0002] -16B6B ; [.41F8.0020.0002] -16B6C ; [.41F9.0020.0002] -16B6D ; [.41FA.0020.0002] -16B6E ; [.41FB.0020.0002] -16B6F ; [.41FC.0020.0002] -16B70 ; [.41FD.0020.0002] -16B71 ; [.41FE.0020.0002] -16B72 ; [.41FF.0020.0002] -16B73 ; [.4200.0020.0002] -16B74 ; [.4201.0020.0002] -16B75 ; [.4202.0020.0002] -16B76 ; [.4203.0020.0002] -16B77 ; [.4204.0020.0002] -16B7D ; [.4205.0020.0002] -16B7E ; [.4206.0020.0002] -16B7F ; [.4207.0020.0002] -16B80 ; [.4208.0020.0002] -16B81 ; [.4209.0020.0002] -16B82 ; [.420A.0020.0002] -16B83 ; [.420B.0020.0002] -16B84 ; [.420C.0020.0002] -16B85 ; [.420D.0020.0002] -16B86 ; [.420E.0020.0002] -16B87 ; [.420F.0020.0002] -16B88 ; [.4210.0020.0002] -16B89 ; [.4211.0020.0002] -16B8A ; [.4212.0020.0002] -16B8B ; [.4213.0020.0002] -16B8C ; [.4214.0020.0002] -16B8D ; [.4215.0020.0002] -16B8E ; [.4216.0020.0002] -16B8F ; [.4217.0020.0002] -10280 ; [.4218.0020.0002] -10281 ; [.4219.0020.0002] -10282 ; [.421A.0020.0002] -10283 ; [.421B.0020.0002] -10284 ; [.421C.0020.0002] -10285 ; [.421D.0020.0002] -10286 ; [.421E.0020.0002] -10287 ; [.421F.0020.0002] -10288 ; [.4220.0020.0002] -10289 ; [.4221.0020.0002] -1028A ; [.4222.0020.0002] -1028B ; [.4223.0020.0002] -1028C ; [.4224.0020.0002] -1028D ; [.4225.0020.0002] -1028E ; [.4226.0020.0002] -1028F ; [.4227.0020.0002] -10290 ; [.4228.0020.0002] -10291 ; [.4229.0020.0002] -10292 ; [.422A.0020.0002] -10293 ; [.422B.0020.0002] -10294 ; [.422C.0020.0002] -10295 ; [.422D.0020.0002] -10296 ; [.422E.0020.0002] -10297 ; [.422F.0020.0002] -10298 ; [.4230.0020.0002] -10299 ; [.4231.0020.0002] -1029A ; [.4232.0020.0002] -1029B ; [.4233.0020.0002] -1029C ; [.4234.0020.0002] -102A0 ; [.4235.0020.0002] -102A1 ; [.4236.0020.0002] -102A2 ; [.4237.0020.0002] -102A3 ; [.4238.0020.0002] -102A4 ; [.4239.0020.0002] -102A5 ; [.423A.0020.0002] -102A6 ; [.423B.0020.0002] -102A7 ; [.423C.0020.0002] -102A8 ; [.423D.0020.0002] -102A9 ; [.423E.0020.0002] -102AA ; [.423F.0020.0002] -102AB ; [.4240.0020.0002] -102AC ; [.4241.0020.0002] -102AD ; [.4242.0020.0002] -102AE ; [.4243.0020.0002] -102AF ; [.4244.0020.0002] -102B0 ; [.4245.0020.0002] -102B1 ; [.4246.0020.0002] -102B2 ; [.4247.0020.0002] -102B3 ; [.4248.0020.0002] -102B4 ; [.4249.0020.0002] -102B5 ; [.424A.0020.0002] -102B6 ; [.424B.0020.0002] -102B7 ; [.424C.0020.0002] -102B8 ; [.424D.0020.0002] -102B9 ; [.424E.0020.0002] -102BA ; [.424F.0020.0002] -102BB ; [.4250.0020.0002] -102BC ; [.4251.0020.0002] -102BD ; [.4252.0020.0002] -102BE ; [.4253.0020.0002] -102BF ; [.4254.0020.0002] -102C0 ; [.4255.0020.0002] -102C1 ; [.4256.0020.0002] -102C2 ; [.4257.0020.0002] -102C3 ; [.4258.0020.0002] -102C4 ; [.4259.0020.0002] -102C5 ; [.425A.0020.0002] -102C6 ; [.425B.0020.0002] -102C7 ; [.425C.0020.0002] -102C8 ; [.425D.0020.0002] -102C9 ; [.425E.0020.0002] -102CA ; [.425F.0020.0002] -102CB ; [.4260.0020.0002] -102CC ; [.4261.0020.0002] -102CD ; [.4262.0020.0002] -102CE ; [.4263.0020.0002] -102CF ; [.4264.0020.0002] -102D0 ; [.4265.0020.0002] -10920 ; [.4266.0020.0002] -10921 ; [.4267.0020.0002] -10922 ; [.4268.0020.0002] -10923 ; [.4269.0020.0002] -10924 ; [.426A.0020.0002] -10925 ; [.426B.0020.0002] -10926 ; [.426C.0020.0002] -10927 ; [.426D.0020.0002] -10928 ; [.426E.0020.0002] -10929 ; [.426F.0020.0002] -1092A ; [.4270.0020.0002] -1092B ; [.4271.0020.0002] -1092C ; [.4272.0020.0002] -1092D ; [.4273.0020.0002] -1092E ; [.4274.0020.0002] -1092F ; [.4275.0020.0002] -10930 ; [.4276.0020.0002] -10931 ; [.4277.0020.0002] -10932 ; [.4278.0020.0002] -10933 ; [.4279.0020.0002] -10934 ; [.427A.0020.0002] -10935 ; [.427B.0020.0002] -10936 ; [.427C.0020.0002] -10937 ; [.427D.0020.0002] -10938 ; [.427E.0020.0002] -10939 ; [.427F.0020.0002] -10300 ; [.4280.0020.0002] -10301 ; [.4281.0020.0002] -10302 ; [.4282.0020.0002] -10303 ; [.4283.0020.0002] -10304 ; [.4284.0020.0002] -10305 ; [.4285.0020.0002] -10306 ; [.4286.0020.0002] -10307 ; [.4287.0020.0002] -10308 ; [.4288.0020.0002] -10309 ; [.4289.0020.0002] -1030A ; [.428A.0020.0002] -1030B ; [.428B.0020.0002] -1030C ; [.428C.0020.0002] -1030D ; [.428D.0020.0002] -1030E ; [.428E.0020.0002] -1031F ; [.428F.0020.0002] -1030F ; [.4290.0020.0002] -10310 ; [.4291.0020.0002] -10311 ; [.4292.0020.0002] -10312 ; [.4293.0020.0002] -10313 ; [.4294.0020.0002] -10314 ; [.4295.0020.0002] -10315 ; [.4296.0020.0002] -10316 ; [.4297.0020.0002] -10317 ; [.4298.0020.0002] -10318 ; [.4299.0020.0002] -10319 ; [.429A.0020.0002] -1031A ; [.429B.0020.0002] -1031B ; [.429C.0020.0002] -1031C ; [.429D.0020.0002] -1031D ; [.429E.0020.0002] -1031E ; [.429F.0020.0002] -10330 ; [.42A0.0020.0002] -10331 ; [.42A1.0020.0002] -10332 ; [.42A2.0020.0002] -10333 ; [.42A3.0020.0002] -10334 ; [.42A4.0020.0002] -10335 ; [.42A5.0020.0002] -10336 ; [.42A6.0020.0002] -10337 ; [.42A7.0020.0002] -10338 ; [.42A8.0020.0002] -10339 ; [.42A9.0020.0002] -1033A ; [.42AA.0020.0002] -1033B ; [.42AB.0020.0002] -1033C ; [.42AC.0020.0002] -1033D ; [.42AD.0020.0002] -1033E ; [.42AE.0020.0002] -1033F ; [.42AF.0020.0002] -10340 ; [.42B0.0020.0002] -10341 ; [.42B1.0020.0002] -10342 ; [.42B2.0020.0002] -10343 ; [.42B3.0020.0002] -10344 ; [.42B4.0020.0002] -10345 ; [.42B5.0020.0002] -10346 ; [.42B6.0020.0002] -10347 ; [.42B7.0020.0002] -10348 ; [.42B8.0020.0002] -10349 ; [.42B9.0020.0002] -1034A ; [.42BA.0020.0002] -10428 ; [.42BB.0020.0002] -10400 ; [.42BB.0020.0008] -10429 ; [.42BC.0020.0002] -10401 ; [.42BC.0020.0008] -1042A ; [.42BD.0020.0002] -10402 ; [.42BD.0020.0008] -1042B ; [.42BE.0020.0002] -10403 ; [.42BE.0020.0008] -1042C ; [.42BF.0020.0002] -10404 ; [.42BF.0020.0008] -1042D ; [.42C0.0020.0002] -10405 ; [.42C0.0020.0008] -1042E ; [.42C1.0020.0002] -10406 ; [.42C1.0020.0008] -1042F ; [.42C2.0020.0002] -10407 ; [.42C2.0020.0008] -10430 ; [.42C3.0020.0002] -10408 ; [.42C3.0020.0008] -10431 ; [.42C4.0020.0002] -10409 ; [.42C4.0020.0008] -10432 ; [.42C5.0020.0002] -1040A ; [.42C5.0020.0008] -10433 ; [.42C6.0020.0002] -1040B ; [.42C6.0020.0008] -10434 ; [.42C7.0020.0002] -1040C ; [.42C7.0020.0008] -10435 ; [.42C8.0020.0002] -1040D ; [.42C8.0020.0008] -10436 ; [.42C9.0020.0002] -1040E ; [.42C9.0020.0008] -10437 ; [.42CA.0020.0002] -1040F ; [.42CA.0020.0008] -10438 ; [.42CB.0020.0002] -10410 ; [.42CB.0020.0008] -10439 ; [.42CC.0020.0002] -10411 ; [.42CC.0020.0008] -1043A ; [.42CD.0020.0002] -10412 ; [.42CD.0020.0008] -1043B ; [.42CE.0020.0002] -10413 ; [.42CE.0020.0008] -1043C ; [.42CF.0020.0002] -10414 ; [.42CF.0020.0008] -1043D ; [.42D0.0020.0002] -10415 ; [.42D0.0020.0008] -1043E ; [.42D1.0020.0002] -10416 ; [.42D1.0020.0008] -1043F ; [.42D2.0020.0002] -10417 ; [.42D2.0020.0008] -10440 ; [.42D3.0020.0002] -10418 ; [.42D3.0020.0008] -10441 ; [.42D4.0020.0002] -10419 ; [.42D4.0020.0008] -10442 ; [.42D5.0020.0002] -1041A ; [.42D5.0020.0008] -10443 ; [.42D6.0020.0002] -1041B ; [.42D6.0020.0008] -10444 ; [.42D7.0020.0002] -1041C ; [.42D7.0020.0008] -10445 ; [.42D8.0020.0002] -1041D ; [.42D8.0020.0008] -10446 ; [.42D9.0020.0002] -1041E ; [.42D9.0020.0008] -10447 ; [.42DA.0020.0002] -1041F ; [.42DA.0020.0008] -10448 ; [.42DB.0020.0002] -10420 ; [.42DB.0020.0008] -10449 ; [.42DC.0020.0002] -10421 ; [.42DC.0020.0008] -1044A ; [.42DD.0020.0002] -10422 ; [.42DD.0020.0008] -1044B ; [.42DE.0020.0002] -10423 ; [.42DE.0020.0008] -1044C ; [.42DF.0020.0002] -10424 ; [.42DF.0020.0008] -1044D ; [.42E0.0020.0002] -10425 ; [.42E0.0020.0008] -1044E ; [.42E1.0020.0002] -10426 ; [.42E1.0020.0008] -1044F ; [.42E2.0020.0002] -10427 ; [.42E2.0020.0008] -10450 ; [.42E3.0020.0002] -10451 ; [.42E4.0020.0002] -10452 ; [.42E5.0020.0002] -10453 ; [.42E6.0020.0002] -10454 ; [.42E7.0020.0002] -10455 ; [.42E8.0020.0002] -10456 ; [.42E9.0020.0002] -10457 ; [.42EA.0020.0002] -10458 ; [.42EB.0020.0002] -10459 ; [.42EC.0020.0002] -1045A ; [.42ED.0020.0002] -1045B ; [.42EE.0020.0002] -1045C ; [.42EF.0020.0002] -1045D ; [.42F0.0020.0002] -1045E ; [.42F1.0020.0002] -1045F ; [.42F2.0020.0002] -10460 ; [.42F3.0020.0002] -10461 ; [.42F4.0020.0002] -10462 ; [.42F5.0020.0002] -10463 ; [.42F6.0020.0002] -10464 ; [.42F7.0020.0002] -10465 ; [.42F8.0020.0002] -10466 ; [.42F9.0020.0002] -10467 ; [.42FA.0020.0002] -10468 ; [.42FB.0020.0002] -10469 ; [.42FC.0020.0002] -1046A ; [.42FD.0020.0002] -1046B ; [.42FE.0020.0002] -1046C ; [.42FF.0020.0002] -1046D ; [.4300.0020.0002] -1046E ; [.4301.0020.0002] -1046F ; [.4302.0020.0002] -10470 ; [.4303.0020.0002] -10471 ; [.4304.0020.0002] -10472 ; [.4305.0020.0002] -10473 ; [.4306.0020.0002] -10474 ; [.4307.0020.0002] -10475 ; [.4308.0020.0002] -10476 ; [.4309.0020.0002] -10477 ; [.430A.0020.0002] -10478 ; [.430B.0020.0002] -10479 ; [.430C.0020.0002] -1047A ; [.430D.0020.0002] -1047B ; [.430E.0020.0002] -1047C ; [.430F.0020.0002] -1047D ; [.4310.0020.0002] -1047E ; [.4311.0020.0002] -1047F ; [.4312.0020.0002] -1BC00 ; [.4313.0020.0002] -1BC01 ; [.4314.0020.0002] -1BC02 ; [.4315.0020.0002] -1BC03 ; [.4316.0020.0002] -1BC04 ; [.4317.0020.0002] -1BC05 ; [.4318.0020.0002] -1BC06 ; [.4319.0020.0002] -1BC07 ; [.431A.0020.0002] -1BC08 ; [.431B.0020.0002] -1BC09 ; [.431C.0020.0002] -1BC0A ; [.431D.0020.0002] -1BC0B ; [.431E.0020.0002] -1BC0C ; [.431F.0020.0002] -1BC0D ; [.4320.0020.0002] -1BC0E ; [.4321.0020.0002] -1BC0F ; [.4322.0020.0002] -1BC10 ; [.4323.0020.0002] -1BC11 ; [.4324.0020.0002] -1BC12 ; [.4325.0020.0002] -1BC13 ; [.4326.0020.0002] -1BC14 ; [.4327.0020.0002] -1BC15 ; [.4328.0020.0002] -1BC16 ; [.4329.0020.0002] -1BC17 ; [.432A.0020.0002] -1BC18 ; [.432B.0020.0002] -1BC19 ; [.432C.0020.0002] -1BC1A ; [.432D.0020.0002] -1BC1B ; [.432E.0020.0002] -1BC1C ; [.432F.0020.0002] -1BC1D ; [.4330.0020.0002] -1BC1E ; [.4331.0020.0002] -1BC1F ; [.4332.0020.0002] -1BC20 ; [.4333.0020.0002] -1BC21 ; [.4334.0020.0002] -1BC22 ; [.4335.0020.0002] -1BC23 ; [.4336.0020.0002] -1BC24 ; [.4337.0020.0002] -1BC25 ; [.4338.0020.0002] -1BC26 ; [.4339.0020.0002] -1BC27 ; [.433A.0020.0002] -1BC28 ; [.433B.0020.0002] -1BC29 ; [.433C.0020.0002] -1BC2A ; [.433D.0020.0002] -1BC2B ; [.433E.0020.0002] -1BC2C ; [.433F.0020.0002] -1BC2D ; [.4340.0020.0002] -1BC2E ; [.4341.0020.0002] -1BC2F ; [.4342.0020.0002] -1BC30 ; [.4343.0020.0002] -1BC31 ; [.4344.0020.0002] -1BC32 ; [.4345.0020.0002] -1BC33 ; [.4346.0020.0002] -1BC34 ; [.4347.0020.0002] -1BC35 ; [.4348.0020.0002] -1BC36 ; [.4349.0020.0002] -1BC37 ; [.434A.0020.0002] -1BC38 ; [.434B.0020.0002] -1BC39 ; [.434C.0020.0002] -1BC3A ; [.434D.0020.0002] -1BC3B ; [.434E.0020.0002] -1BC3C ; [.434F.0020.0002] -1BC3D ; [.4350.0020.0002] -1BC3E ; [.4351.0020.0002] -1BC3F ; [.4352.0020.0002] -1BC40 ; [.4353.0020.0002] -1BC41 ; [.4354.0020.0002] -1BC42 ; [.4355.0020.0002] -1BC43 ; [.4356.0020.0002] -1BC44 ; [.4357.0020.0002] -1BC45 ; [.4358.0020.0002] -1BC46 ; [.4359.0020.0002] -1BC47 ; [.435A.0020.0002] -1BC48 ; [.435B.0020.0002] -1BC49 ; [.435C.0020.0002] -1BC4A ; [.435D.0020.0002] -1BC4B ; [.435E.0020.0002] -1BC4C ; [.435F.0020.0002] -1BC4D ; [.4360.0020.0002] -1BC4E ; [.4361.0020.0002] -1BC4F ; [.4362.0020.0002] -1BC50 ; [.4363.0020.0002] -1BC51 ; [.4364.0020.0002] -1BC52 ; [.4365.0020.0002] -1BC53 ; [.4366.0020.0002] -1BC54 ; [.4367.0020.0002] -1BC55 ; [.4368.0020.0002] -1BC56 ; [.4369.0020.0002] -1BC57 ; [.436A.0020.0002] -1BC58 ; [.436B.0020.0002] -1BC59 ; [.436C.0020.0002] -1BC5A ; [.436D.0020.0002] -1BC5B ; [.436E.0020.0002] -1BC5C ; [.436F.0020.0002] -1BC5D ; [.4370.0020.0002] -1BC5E ; [.4371.0020.0002] -1BC5F ; [.4372.0020.0002] -1BC60 ; [.4373.0020.0002] -1BC61 ; [.4374.0020.0002] -1BC62 ; [.4375.0020.0002] -1BC63 ; [.4376.0020.0002] -1BC64 ; [.4377.0020.0002] -1BC65 ; [.4378.0020.0002] -1BC66 ; [.4379.0020.0002] -1BC67 ; [.437A.0020.0002] -1BC68 ; [.437B.0020.0002] -1BC69 ; [.437C.0020.0002] -1BC6A ; [.437D.0020.0002] -1BC70 ; [.437E.0020.0002] -1BC71 ; [.437F.0020.0002] -1BC72 ; [.4380.0020.0002] -1BC73 ; [.4381.0020.0002] -1BC74 ; [.4382.0020.0002] -1BC75 ; [.4383.0020.0002] -1BC76 ; [.4384.0020.0002] -1BC77 ; [.4385.0020.0002] -1BC78 ; [.4386.0020.0002] -1BC79 ; [.4387.0020.0002] -1BC7A ; [.4388.0020.0002] -1BC7B ; [.4389.0020.0002] -1BC7C ; [.438A.0020.0002] -1BC80 ; [.438B.0020.0002] -1BC81 ; [.438C.0020.0002] -1BC82 ; [.438D.0020.0002] -1BC83 ; [.438E.0020.0002] -1BC84 ; [.438F.0020.0002] -1BC85 ; [.4390.0020.0002] -1BC86 ; [.4391.0020.0002] -1BC87 ; [.4392.0020.0002] -1BC88 ; [.4393.0020.0002] -1BC90 ; [.4394.0020.0002] -1BC91 ; [.4395.0020.0002] -1BC92 ; [.4396.0020.0002] -1BC93 ; [.4397.0020.0002] -1BC94 ; [.4398.0020.0002] -1BC95 ; [.4399.0020.0002] -1BC96 ; [.439A.0020.0002] -1BC97 ; [.439B.0020.0002] -1BC98 ; [.439C.0020.0002] -1BC99 ; [.439D.0020.0002] -10480 ; [.439E.0020.0002] -10481 ; [.439F.0020.0002] -10482 ; [.43A0.0020.0002] -10483 ; [.43A1.0020.0002] -10484 ; [.43A2.0020.0002] -10485 ; [.43A3.0020.0002] -10486 ; [.43A4.0020.0002] -10487 ; [.43A5.0020.0002] -10488 ; [.43A6.0020.0002] -10489 ; [.43A7.0020.0002] -1048A ; [.43A8.0020.0002] -1048B ; [.43A9.0020.0002] -1048C ; [.43AA.0020.0002] -1048D ; [.43AB.0020.0002] -1048E ; [.43AC.0020.0002] -1048F ; [.43AD.0020.0002] -10490 ; [.43AE.0020.0002] -10491 ; [.43AF.0020.0002] -10492 ; [.43B0.0020.0002] -10493 ; [.43B1.0020.0002] -10494 ; [.43B2.0020.0002] -10495 ; [.43B3.0020.0002] -10496 ; [.43B4.0020.0002] -10497 ; [.43B5.0020.0002] -10498 ; [.43B6.0020.0002] -10499 ; [.43B7.0020.0002] -1049A ; [.43B8.0020.0002] -1049B ; [.43B9.0020.0002] -1049C ; [.43BA.0020.0002] -1049D ; [.43BB.0020.0002] -10500 ; [.43BC.0020.0002] -10501 ; [.43BD.0020.0002] -10502 ; [.43BE.0020.0002] -10503 ; [.43BF.0020.0002] -10504 ; [.43C0.0020.0002] -10505 ; [.43C1.0020.0002] -10506 ; [.43C2.0020.0002] -10507 ; [.43C3.0020.0002] -10508 ; [.43C4.0020.0002] -10509 ; [.43C5.0020.0002] -1050A ; [.43C6.0020.0002] -1050B ; [.43C7.0020.0002] -1050C ; [.43C8.0020.0002] -1050D ; [.43C9.0020.0002] -1050E ; [.43CA.0020.0002] -1050F ; [.43CB.0020.0002] -10510 ; [.43CC.0020.0002] -10511 ; [.43CD.0020.0002] -10512 ; [.43CE.0020.0002] -10513 ; [.43CF.0020.0002] -10514 ; [.43D0.0020.0002] -10515 ; [.43D1.0020.0002] -10516 ; [.43D2.0020.0002] -10517 ; [.43D3.0020.0002] -10518 ; [.43D4.0020.0002] -10519 ; [.43D5.0020.0002] -1051A ; [.43D6.0020.0002] -1051B ; [.43D7.0020.0002] -1051C ; [.43D8.0020.0002] -1051D ; [.43D9.0020.0002] -1051E ; [.43DA.0020.0002] -1051F ; [.43DB.0020.0002] -10520 ; [.43DC.0020.0002] -10521 ; [.43DD.0020.0002] -10522 ; [.43DE.0020.0002] -10523 ; [.43DF.0020.0002] -10524 ; [.43E0.0020.0002] -10525 ; [.43E1.0020.0002] -10526 ; [.43E2.0020.0002] -10527 ; [.43E3.0020.0002] -10530 ; [.43E4.0020.0002] -10531 ; [.43E5.0020.0002] -10532 ; [.43E6.0020.0002] -10533 ; [.43E7.0020.0002] -10534 ; [.43E8.0020.0002] -10535 ; [.43E9.0020.0002] -10536 ; [.43EA.0020.0002] -10537 ; [.43EB.0020.0002] -10538 ; [.43EC.0020.0002] -10539 ; [.43ED.0020.0002] -1053A ; [.43EE.0020.0002] -1053B ; [.43EF.0020.0002] -1053C ; [.43F0.0020.0002] -1053D ; [.43F1.0020.0002] -1053E ; [.43F2.0020.0002] -1053F ; [.43F3.0020.0002] -10540 ; [.43F4.0020.0002] -10541 ; [.43F5.0020.0002] -10542 ; [.43F6.0020.0002] -10543 ; [.43F7.0020.0002] -10544 ; [.43F8.0020.0002] -10545 ; [.43F9.0020.0002] -10546 ; [.43FA.0020.0002] -10547 ; [.43FB.0020.0002] -10548 ; [.43FC.0020.0002] -10549 ; [.43FD.0020.0002] -1054A ; [.43FE.0020.0002] -1054B ; [.43FF.0020.0002] -1054C ; [.4400.0020.0002] -1054D ; [.4401.0020.0002] -1054E ; [.4402.0020.0002] -1054F ; [.4403.0020.0002] -10550 ; [.4404.0020.0002] -10551 ; [.4405.0020.0002] -10552 ; [.4406.0020.0002] -10553 ; [.4407.0020.0002] -10554 ; [.4408.0020.0002] -10555 ; [.4409.0020.0002] -10556 ; [.440A.0020.0002] -10557 ; [.440B.0020.0002] -10558 ; [.440C.0020.0002] -10559 ; [.440D.0020.0002] -1055A ; [.440E.0020.0002] -1055B ; [.440F.0020.0002] -1055C ; [.4410.0020.0002] -1055D ; [.4411.0020.0002] -1055E ; [.4412.0020.0002] -1055F ; [.4413.0020.0002] -10560 ; [.4414.0020.0002] -10561 ; [.4415.0020.0002] -10562 ; [.4416.0020.0002] -10563 ; [.4417.0020.0002] -110D0 ; [.4418.0020.0002] -110D1 ; [.4419.0020.0002] -110D2 ; [.441A.0020.0002] -110D3 ; [.441B.0020.0002] -110D4 ; [.441C.0020.0002] -110D5 ; [.441D.0020.0002] -110D6 ; [.441E.0020.0002] -110D7 ; [.441F.0020.0002] -110D8 ; [.4420.0020.0002] -110D9 ; [.4421.0020.0002] -110DA ; [.4422.0020.0002] -110DB ; [.4423.0020.0002] -110DC ; [.4424.0020.0002] -110DD ; [.4425.0020.0002] -110DE ; [.4426.0020.0002] -110DF ; [.4427.0020.0002] -110E0 ; [.4428.0020.0002] -110E1 ; [.4429.0020.0002] -110E2 ; [.442A.0020.0002] -110E3 ; [.442B.0020.0002] -110E4 ; [.442C.0020.0002] -110E5 ; [.442D.0020.0002] -110E6 ; [.442E.0020.0002] -110E7 ; [.442F.0020.0002] -110E8 ; [.4430.0020.0002] -16A40 ; [.4431.0020.0002] -16A41 ; [.4432.0020.0002] -16A42 ; [.4433.0020.0002] -16A43 ; [.4434.0020.0002] -16A44 ; [.4435.0020.0002] -16A45 ; [.4436.0020.0002] -16A46 ; [.4437.0020.0002] -16A47 ; [.4438.0020.0002] -16A48 ; [.4439.0020.0002] -16A49 ; [.443A.0020.0002] -16A4A ; [.443B.0020.0002] -16A4B ; [.443C.0020.0002] -16A4C ; [.443D.0020.0002] -16A4D ; [.443E.0020.0002] -16A4E ; [.443F.0020.0002] -16A4F ; [.4440.0020.0002] -16A50 ; [.4441.0020.0002] -16A51 ; [.4442.0020.0002] -16A52 ; [.4443.0020.0002] -16A53 ; [.4444.0020.0002] -16A54 ; [.4445.0020.0002] -16A55 ; [.4446.0020.0002] -16A56 ; [.4447.0020.0002] -16A57 ; [.4448.0020.0002] -16A58 ; [.4449.0020.0002] -16A59 ; [.444A.0020.0002] -16A5A ; [.444B.0020.0002] -16A5B ; [.444C.0020.0002] -16A5C ; [.444D.0020.0002] -16A5D ; [.444E.0020.0002] -16A5E ; [.444F.0020.0002] -10000 ; [.4450.0020.0002] -10001 ; [.4451.0020.0002] -10002 ; [.4452.0020.0002] -10003 ; [.4453.0020.0002] -10004 ; [.4454.0020.0002] -10005 ; [.4455.0020.0002] -10006 ; [.4456.0020.0002] -10007 ; [.4457.0020.0002] -10008 ; [.4458.0020.0002] -10009 ; [.4459.0020.0002] -1000A ; [.445A.0020.0002] -1000B ; [.445B.0020.0002] -1000D ; [.445C.0020.0002] -1000E ; [.445D.0020.0002] -1000F ; [.445E.0020.0002] -10010 ; [.445F.0020.0002] -10011 ; [.4460.0020.0002] -10012 ; [.4461.0020.0002] -10013 ; [.4462.0020.0002] -10014 ; [.4463.0020.0002] -10015 ; [.4464.0020.0002] -10016 ; [.4465.0020.0002] -10017 ; [.4466.0020.0002] -10018 ; [.4467.0020.0002] -10019 ; [.4468.0020.0002] -1001A ; [.4469.0020.0002] -1001B ; [.446A.0020.0002] -1001C ; [.446B.0020.0002] -1001D ; [.446C.0020.0002] -1001E ; [.446D.0020.0002] -1001F ; [.446E.0020.0002] -10020 ; [.446F.0020.0002] -10021 ; [.4470.0020.0002] -10022 ; [.4471.0020.0002] -10023 ; [.4472.0020.0002] -10024 ; [.4473.0020.0002] -10025 ; [.4474.0020.0002] -10026 ; [.4475.0020.0002] -10028 ; [.4476.0020.0002] -10029 ; [.4477.0020.0002] -1002A ; [.4478.0020.0002] -1002B ; [.4479.0020.0002] -1002C ; [.447A.0020.0002] -1002D ; [.447B.0020.0002] -1002E ; [.447C.0020.0002] -1002F ; [.447D.0020.0002] -10030 ; [.447E.0020.0002] -10031 ; [.447F.0020.0002] -10032 ; [.4480.0020.0002] -10033 ; [.4481.0020.0002] -10034 ; [.4482.0020.0002] -10035 ; [.4483.0020.0002] -10036 ; [.4484.0020.0002] -10037 ; [.4485.0020.0002] -10038 ; [.4486.0020.0002] -10039 ; [.4487.0020.0002] -1003A ; [.4488.0020.0002] -1003C ; [.4489.0020.0002] -1003D ; [.448A.0020.0002] -1003F ; [.448B.0020.0002] -10040 ; [.448C.0020.0002] -10041 ; [.448D.0020.0002] -10042 ; [.448E.0020.0002] -10043 ; [.448F.0020.0002] -10044 ; [.4490.0020.0002] -10045 ; [.4491.0020.0002] -10046 ; [.4492.0020.0002] -10047 ; [.4493.0020.0002] -10048 ; [.4494.0020.0002] -10049 ; [.4495.0020.0002] -1004A ; [.4496.0020.0002] -1004B ; [.4497.0020.0002] -1004C ; [.4498.0020.0002] -1004D ; [.4499.0020.0002] -10050 ; [.449A.0020.0002] -10051 ; [.449B.0020.0002] -10052 ; [.449C.0020.0002] -10053 ; [.449D.0020.0002] -10054 ; [.449E.0020.0002] -10055 ; [.449F.0020.0002] -10056 ; [.44A0.0020.0002] -10057 ; [.44A1.0020.0002] -10058 ; [.44A2.0020.0002] -10059 ; [.44A3.0020.0002] -1005A ; [.44A4.0020.0002] -1005B ; [.44A5.0020.0002] -1005C ; [.44A6.0020.0002] -1005D ; [.44A7.0020.0002] -10080 ; [.44A8.0020.0002] -10081 ; [.44A9.0020.0002] -10082 ; [.44AA.0020.0002] -10083 ; [.44AB.0020.0002] -10084 ; [.44AC.0020.0002] -10085 ; [.44AD.0020.0002] -10086 ; [.44AE.0020.0002] -10087 ; [.44AF.0020.0002] -10088 ; [.44B0.0020.0002] -10089 ; [.44B1.0020.0002] -1008A ; [.44B2.0020.0002] -1008B ; [.44B3.0020.0002] -1008C ; [.44B4.0020.0002] -1008D ; [.44B5.0020.0002] -1008E ; [.44B6.0020.0002] -1008F ; [.44B7.0020.0002] -10090 ; [.44B8.0020.0002] -10091 ; [.44B9.0020.0002] -10092 ; [.44BA.0020.0002] -10093 ; [.44BB.0020.0002] -10094 ; [.44BC.0020.0002] -10095 ; [.44BD.0020.0002] -10096 ; [.44BE.0020.0002] -10097 ; [.44BF.0020.0002] -10098 ; [.44C0.0020.0002] -10099 ; [.44C1.0020.0002] -1009A ; [.44C2.0020.0002] -1009B ; [.44C3.0020.0002] -1009C ; [.44C4.0020.0002] -1009D ; [.44C5.0020.0002] -1009E ; [.44C6.0020.0002] -1009F ; [.44C7.0020.0002] -100A0 ; [.44C8.0020.0002] -100A1 ; [.44C9.0020.0002] -100A2 ; [.44CA.0020.0002] -100A3 ; [.44CB.0020.0002] -100A4 ; [.44CC.0020.0002] -100A5 ; [.44CD.0020.0002] -100A6 ; [.44CE.0020.0002] -100A7 ; [.44CF.0020.0002] -100A8 ; [.44D0.0020.0002] -100A9 ; [.44D1.0020.0002] -100AA ; [.44D2.0020.0002] -100AB ; [.44D3.0020.0002] -100AC ; [.44D4.0020.0002] -100AD ; [.44D5.0020.0002] -100AE ; [.44D6.0020.0002] -100AF ; [.44D7.0020.0002] -100B0 ; [.44D8.0020.0002] -100B1 ; [.44D9.0020.0002] -100B2 ; [.44DA.0020.0002] -100B3 ; [.44DB.0020.0002] -100B4 ; [.44DC.0020.0002] -100B5 ; [.44DD.0020.0002] -100B6 ; [.44DE.0020.0002] -100B7 ; [.44DF.0020.0002] -100B8 ; [.44E0.0020.0002] -100B9 ; [.44E1.0020.0002] -100BA ; [.44E2.0020.0002] -100BB ; [.44E3.0020.0002] -100BC ; [.44E4.0020.0002] -100BD ; [.44E5.0020.0002] -100BE ; [.44E6.0020.0002] -100BF ; [.44E7.0020.0002] -100C0 ; [.44E8.0020.0002] -100C1 ; [.44E9.0020.0002] -100C2 ; [.44EA.0020.0002] -100C3 ; [.44EB.0020.0002] -100C4 ; [.44EC.0020.0002] -100C5 ; [.44ED.0020.0002] -100C6 ; [.44EE.0020.0002] -100C7 ; [.44EF.0020.0002] -100C8 ; [.44F0.0020.0002] -100C9 ; [.44F1.0020.0002] -100CA ; [.44F2.0020.0002] -100CB ; [.44F3.0020.0002] -100CC ; [.44F4.0020.0002] -100CD ; [.44F5.0020.0002] -100CE ; [.44F6.0020.0002] -100CF ; [.44F7.0020.0002] -100D0 ; [.44F8.0020.0002] -100D1 ; [.44F9.0020.0002] -100D2 ; [.44FA.0020.0002] -100D3 ; [.44FB.0020.0002] -100D4 ; [.44FC.0020.0002] -100D5 ; [.44FD.0020.0002] -100D6 ; [.44FE.0020.0002] -100D7 ; [.44FF.0020.0002] -100D8 ; [.4500.0020.0002] -100D9 ; [.4501.0020.0002] -100DA ; [.4502.0020.0002] -100DB ; [.4503.0020.0002] -100DC ; [.4504.0020.0002] -100DD ; [.4505.0020.0002] -100DE ; [.4506.0020.0002] -100DF ; [.4507.0020.0002] -100E0 ; [.4508.0020.0002] -100E1 ; [.4509.0020.0002] -100E2 ; [.450A.0020.0002] -100E3 ; [.450B.0020.0002] -100E4 ; [.450C.0020.0002] -100E5 ; [.450D.0020.0002] -100E6 ; [.450E.0020.0002] -100E7 ; [.450F.0020.0002] -100E8 ; [.4510.0020.0002] -100E9 ; [.4511.0020.0002] -100EA ; [.4512.0020.0002] -100EB ; [.4513.0020.0002] -100EC ; [.4514.0020.0002] -100ED ; [.4515.0020.0002] -100EE ; [.4516.0020.0002] -100EF ; [.4517.0020.0002] -100F0 ; [.4518.0020.0002] -100F1 ; [.4519.0020.0002] -100F2 ; [.451A.0020.0002] -100F3 ; [.451B.0020.0002] -100F4 ; [.451C.0020.0002] -100F5 ; [.451D.0020.0002] -100F6 ; [.451E.0020.0002] -100F7 ; [.451F.0020.0002] -100F8 ; [.4520.0020.0002] -100F9 ; [.4521.0020.0002] -100FA ; [.4522.0020.0002] -10600 ; [.4523.0020.0002] -10601 ; [.4524.0020.0002] -10602 ; [.4525.0020.0002] -10603 ; [.4526.0020.0002] -10604 ; [.4527.0020.0002] -10605 ; [.4528.0020.0002] -10606 ; [.4529.0020.0002] -10607 ; [.452A.0020.0002] -10608 ; [.452B.0020.0002] -10609 ; [.452C.0020.0002] -1060A ; [.452D.0020.0002] -1060B ; [.452E.0020.0002] -1060C ; [.452F.0020.0002] -1060D ; [.4530.0020.0002] -1060E ; [.4531.0020.0002] -1060F ; [.4532.0020.0002] -10610 ; [.4533.0020.0002] -10611 ; [.4534.0020.0002] -10612 ; [.4535.0020.0002] -10613 ; [.4536.0020.0002] -10614 ; [.4537.0020.0002] -10615 ; [.4538.0020.0002] -10616 ; [.4539.0020.0002] -10617 ; [.453A.0020.0002] -10618 ; [.453B.0020.0002] -10619 ; [.453C.0020.0002] -1061A ; [.453D.0020.0002] -1061B ; [.453E.0020.0002] -1061C ; [.453F.0020.0002] -1061D ; [.4540.0020.0002] -1061E ; [.4541.0020.0002] -1061F ; [.4542.0020.0002] -10620 ; [.4543.0020.0002] -10621 ; [.4544.0020.0002] -10622 ; [.4545.0020.0002] -10623 ; [.4546.0020.0002] -10624 ; [.4547.0020.0002] -10625 ; [.4548.0020.0002] -10626 ; [.4549.0020.0002] -10627 ; [.454A.0020.0002] -10628 ; [.454B.0020.0002] -10629 ; [.454C.0020.0002] -1062A ; [.454D.0020.0002] -1062B ; [.454E.0020.0002] -1062C ; [.454F.0020.0002] -1062D ; [.4550.0020.0002] -1062E ; [.4551.0020.0002] -1062F ; [.4552.0020.0002] -10630 ; [.4553.0020.0002] -10631 ; [.4554.0020.0002] -10632 ; [.4555.0020.0002] -10633 ; [.4556.0020.0002] -10634 ; [.4557.0020.0002] -10635 ; [.4558.0020.0002] -10636 ; [.4559.0020.0002] -10637 ; [.455A.0020.0002] -10638 ; [.455B.0020.0002] -10639 ; [.455C.0020.0002] -1063A ; [.455D.0020.0002] -1063B ; [.455E.0020.0002] -1063C ; [.455F.0020.0002] -1063D ; [.4560.0020.0002] -1063E ; [.4561.0020.0002] -1063F ; [.4562.0020.0002] -10640 ; [.4563.0020.0002] -10641 ; [.4564.0020.0002] -10642 ; [.4565.0020.0002] -10643 ; [.4566.0020.0002] -10644 ; [.4567.0020.0002] -10645 ; [.4568.0020.0002] -10646 ; [.4569.0020.0002] -10647 ; [.456A.0020.0002] -10648 ; [.456B.0020.0002] -10649 ; [.456C.0020.0002] -1064A ; [.456D.0020.0002] -1064B ; [.456E.0020.0002] -1064C ; [.456F.0020.0002] -1064D ; [.4570.0020.0002] -1064E ; [.4571.0020.0002] -1064F ; [.4572.0020.0002] -10650 ; [.4573.0020.0002] -10651 ; [.4574.0020.0002] -10652 ; [.4575.0020.0002] -10653 ; [.4576.0020.0002] -10654 ; [.4577.0020.0002] -10655 ; [.4578.0020.0002] -10656 ; [.4579.0020.0002] -10657 ; [.457A.0020.0002] -10658 ; [.457B.0020.0002] -10659 ; [.457C.0020.0002] -1065A ; [.457D.0020.0002] -1065B ; [.457E.0020.0002] -1065C ; [.457F.0020.0002] -1065D ; [.4580.0020.0002] -1065E ; [.4581.0020.0002] -1065F ; [.4582.0020.0002] -10660 ; [.4583.0020.0002] -10661 ; [.4584.0020.0002] -10662 ; [.4585.0020.0002] -10663 ; [.4586.0020.0002] -10664 ; [.4587.0020.0002] -10665 ; [.4588.0020.0002] -10666 ; [.4589.0020.0002] -10667 ; [.458A.0020.0002] -10668 ; [.458B.0020.0002] -10669 ; [.458C.0020.0002] -1066A ; [.458D.0020.0002] -1066B ; [.458E.0020.0002] -1066C ; [.458F.0020.0002] -1066D ; [.4590.0020.0002] -1066E ; [.4591.0020.0002] -1066F ; [.4592.0020.0002] -10670 ; [.4593.0020.0002] -10671 ; [.4594.0020.0002] -10672 ; [.4595.0020.0002] -10673 ; [.4596.0020.0002] -10674 ; [.4597.0020.0002] -10675 ; [.4598.0020.0002] -10676 ; [.4599.0020.0002] -10677 ; [.459A.0020.0002] -10678 ; [.459B.0020.0002] -10679 ; [.459C.0020.0002] -1067A ; [.459D.0020.0002] -1067B ; [.459E.0020.0002] -1067C ; [.459F.0020.0002] -1067D ; [.45A0.0020.0002] -1067E ; [.45A1.0020.0002] -1067F ; [.45A2.0020.0002] -10680 ; [.45A3.0020.0002] -10681 ; [.45A4.0020.0002] -10682 ; [.45A5.0020.0002] -10683 ; [.45A6.0020.0002] -10684 ; [.45A7.0020.0002] -10685 ; [.45A8.0020.0002] -10686 ; [.45A9.0020.0002] -10687 ; [.45AA.0020.0002] -10688 ; [.45AB.0020.0002] -10689 ; [.45AC.0020.0002] -1068A ; [.45AD.0020.0002] -1068B ; [.45AE.0020.0002] -1068C ; [.45AF.0020.0002] -1068D ; [.45B0.0020.0002] -1068E ; [.45B1.0020.0002] -1068F ; [.45B2.0020.0002] -10690 ; [.45B3.0020.0002] -10691 ; [.45B4.0020.0002] -10692 ; [.45B5.0020.0002] -10693 ; [.45B6.0020.0002] -10694 ; [.45B7.0020.0002] -10695 ; [.45B8.0020.0002] -10696 ; [.45B9.0020.0002] -10697 ; [.45BA.0020.0002] -10698 ; [.45BB.0020.0002] -10699 ; [.45BC.0020.0002] -1069A ; [.45BD.0020.0002] -1069B ; [.45BE.0020.0002] -1069C ; [.45BF.0020.0002] -1069D ; [.45C0.0020.0002] -1069E ; [.45C1.0020.0002] -1069F ; [.45C2.0020.0002] -106A0 ; [.45C3.0020.0002] -106A1 ; [.45C4.0020.0002] -106A2 ; [.45C5.0020.0002] -106A3 ; [.45C6.0020.0002] -106A4 ; [.45C7.0020.0002] -106A5 ; [.45C8.0020.0002] -106A6 ; [.45C9.0020.0002] -106A7 ; [.45CA.0020.0002] -106A8 ; [.45CB.0020.0002] -106A9 ; [.45CC.0020.0002] -106AA ; [.45CD.0020.0002] -106AB ; [.45CE.0020.0002] -106AC ; [.45CF.0020.0002] -106AD ; [.45D0.0020.0002] -106AE ; [.45D1.0020.0002] -106AF ; [.45D2.0020.0002] -106B0 ; [.45D3.0020.0002] -106B1 ; [.45D4.0020.0002] -106B2 ; [.45D5.0020.0002] -106B3 ; [.45D6.0020.0002] -106B4 ; [.45D7.0020.0002] -106B5 ; [.45D8.0020.0002] -106B6 ; [.45D9.0020.0002] -106B7 ; [.45DA.0020.0002] -106B8 ; [.45DB.0020.0002] -106B9 ; [.45DC.0020.0002] -106BA ; [.45DD.0020.0002] -106BB ; [.45DE.0020.0002] -106BC ; [.45DF.0020.0002] -106BD ; [.45E0.0020.0002] -106BE ; [.45E1.0020.0002] -106BF ; [.45E2.0020.0002] -106C0 ; [.45E3.0020.0002] -106C1 ; [.45E4.0020.0002] -106C2 ; [.45E5.0020.0002] -106C3 ; [.45E6.0020.0002] -106C4 ; [.45E7.0020.0002] -106C5 ; [.45E8.0020.0002] -106C6 ; [.45E9.0020.0002] -106C7 ; [.45EA.0020.0002] -106C8 ; [.45EB.0020.0002] -106C9 ; [.45EC.0020.0002] -106CA ; [.45ED.0020.0002] -106CB ; [.45EE.0020.0002] -106CC ; [.45EF.0020.0002] -106CD ; [.45F0.0020.0002] -106CE ; [.45F1.0020.0002] -106CF ; [.45F2.0020.0002] -106D0 ; [.45F3.0020.0002] -106D1 ; [.45F4.0020.0002] -106D2 ; [.45F5.0020.0002] -106D3 ; [.45F6.0020.0002] -106D4 ; [.45F7.0020.0002] -106D5 ; [.45F8.0020.0002] -106D6 ; [.45F9.0020.0002] -106D7 ; [.45FA.0020.0002] -106D8 ; [.45FB.0020.0002] -106D9 ; [.45FC.0020.0002] -106DA ; [.45FD.0020.0002] -106DB ; [.45FE.0020.0002] -106DC ; [.45FF.0020.0002] -106DD ; [.4600.0020.0002] -106DE ; [.4601.0020.0002] -106DF ; [.4602.0020.0002] -106E0 ; [.4603.0020.0002] -106E1 ; [.4604.0020.0002] -106E2 ; [.4605.0020.0002] -106E3 ; [.4606.0020.0002] -106E4 ; [.4607.0020.0002] -106E5 ; [.4608.0020.0002] -106E6 ; [.4609.0020.0002] -106E7 ; [.460A.0020.0002] -106E8 ; [.460B.0020.0002] -106E9 ; [.460C.0020.0002] -106EA ; [.460D.0020.0002] -106EB ; [.460E.0020.0002] -106EC ; [.460F.0020.0002] -106ED ; [.4610.0020.0002] -106EE ; [.4611.0020.0002] -106EF ; [.4612.0020.0002] -106F0 ; [.4613.0020.0002] -106F1 ; [.4614.0020.0002] -106F2 ; [.4615.0020.0002] -106F3 ; [.4616.0020.0002] -106F4 ; [.4617.0020.0002] -106F5 ; [.4618.0020.0002] -106F6 ; [.4619.0020.0002] -106F7 ; [.461A.0020.0002] -106F8 ; [.461B.0020.0002] -106F9 ; [.461C.0020.0002] -106FA ; [.461D.0020.0002] -106FB ; [.461E.0020.0002] -106FC ; [.461F.0020.0002] -106FD ; [.4620.0020.0002] -106FE ; [.4621.0020.0002] -106FF ; [.4622.0020.0002] -10700 ; [.4623.0020.0002] -10701 ; [.4624.0020.0002] -10702 ; [.4625.0020.0002] -10703 ; [.4626.0020.0002] -10704 ; [.4627.0020.0002] -10705 ; [.4628.0020.0002] -10706 ; [.4629.0020.0002] -10707 ; [.462A.0020.0002] -10708 ; [.462B.0020.0002] -10709 ; [.462C.0020.0002] -1070A ; [.462D.0020.0002] -1070B ; [.462E.0020.0002] -1070C ; [.462F.0020.0002] -1070D ; [.4630.0020.0002] -1070E ; [.4631.0020.0002] -1070F ; [.4632.0020.0002] -10710 ; [.4633.0020.0002] -10711 ; [.4634.0020.0002] -10712 ; [.4635.0020.0002] -10713 ; [.4636.0020.0002] -10714 ; [.4637.0020.0002] -10715 ; [.4638.0020.0002] -10716 ; [.4639.0020.0002] -10717 ; [.463A.0020.0002] -10718 ; [.463B.0020.0002] -10719 ; [.463C.0020.0002] -1071A ; [.463D.0020.0002] -1071B ; [.463E.0020.0002] -1071C ; [.463F.0020.0002] -1071D ; [.4640.0020.0002] -1071E ; [.4641.0020.0002] -1071F ; [.4642.0020.0002] -10720 ; [.4643.0020.0002] -10721 ; [.4644.0020.0002] -10722 ; [.4645.0020.0002] -10723 ; [.4646.0020.0002] -10724 ; [.4647.0020.0002] -10725 ; [.4648.0020.0002] -10726 ; [.4649.0020.0002] -10727 ; [.464A.0020.0002] -10728 ; [.464B.0020.0002] -10729 ; [.464C.0020.0002] -1072A ; [.464D.0020.0002] -1072B ; [.464E.0020.0002] -1072C ; [.464F.0020.0002] -1072D ; [.4650.0020.0002] -1072E ; [.4651.0020.0002] -1072F ; [.4652.0020.0002] -10730 ; [.4653.0020.0002] -10731 ; [.4654.0020.0002] -10732 ; [.4655.0020.0002] -10733 ; [.4656.0020.0002] -10734 ; [.4657.0020.0002] -10735 ; [.4658.0020.0002] -10736 ; [.4659.0020.0002] -10740 ; [.465A.0020.0002] -10741 ; [.465B.0020.0002] -10742 ; [.465C.0020.0002] -10743 ; [.465D.0020.0002] -10744 ; [.465E.0020.0002] -10745 ; [.465F.0020.0002] -10746 ; [.4660.0020.0002] -10747 ; [.4661.0020.0002] -10748 ; [.4662.0020.0002] -10749 ; [.4663.0020.0002] -1074A ; [.4664.0020.0002] -1074B ; [.4665.0020.0002] -1074C ; [.4666.0020.0002] -1074D ; [.4667.0020.0002] -1074E ; [.4668.0020.0002] -1074F ; [.4669.0020.0002] -10750 ; [.466A.0020.0002] -10751 ; [.466B.0020.0002] -10752 ; [.466C.0020.0002] -10753 ; [.466D.0020.0002] -10754 ; [.466E.0020.0002] -10755 ; [.466F.0020.0002] -10760 ; [.4670.0020.0002] -10761 ; [.4671.0020.0002] -10762 ; [.4672.0020.0002] -10763 ; [.4673.0020.0002] -10764 ; [.4674.0020.0002] -10765 ; [.4675.0020.0002] -10766 ; [.4676.0020.0002] -10767 ; [.4677.0020.0002] -10800 ; [.4678.0020.0002] -10801 ; [.4679.0020.0002] -10802 ; [.467A.0020.0002] -10803 ; [.467B.0020.0002] -10804 ; [.467C.0020.0002] -10805 ; [.467D.0020.0002] -10808 ; [.467E.0020.0002] -1080A ; [.467F.0020.0002] -1080B ; [.4680.0020.0002] -1080C ; [.4681.0020.0002] -1080D ; [.4682.0020.0002] -1080E ; [.4683.0020.0002] -1080F ; [.4684.0020.0002] -10810 ; [.4685.0020.0002] -10811 ; [.4686.0020.0002] -10812 ; [.4687.0020.0002] -10813 ; [.4688.0020.0002] -10814 ; [.4689.0020.0002] -10815 ; [.468A.0020.0002] -10816 ; [.468B.0020.0002] -10817 ; [.468C.0020.0002] -10818 ; [.468D.0020.0002] -10819 ; [.468E.0020.0002] -1081A ; [.468F.0020.0002] -1081B ; [.4690.0020.0002] -1081C ; [.4691.0020.0002] -1081D ; [.4692.0020.0002] -1081E ; [.4693.0020.0002] -1081F ; [.4694.0020.0002] -10820 ; [.4695.0020.0002] -10821 ; [.4696.0020.0002] -10822 ; [.4697.0020.0002] -10823 ; [.4698.0020.0002] -10824 ; [.4699.0020.0002] -10825 ; [.469A.0020.0002] -10826 ; [.469B.0020.0002] -10827 ; [.469C.0020.0002] -10828 ; [.469D.0020.0002] -10829 ; [.469E.0020.0002] -1082A ; [.469F.0020.0002] -1082B ; [.46A0.0020.0002] -1082C ; [.46A1.0020.0002] -1082D ; [.46A2.0020.0002] -1082E ; [.46A3.0020.0002] -1082F ; [.46A4.0020.0002] -10830 ; [.46A5.0020.0002] -10831 ; [.46A6.0020.0002] -10832 ; [.46A7.0020.0002] -10833 ; [.46A8.0020.0002] -10834 ; [.46A9.0020.0002] -10835 ; [.46AA.0020.0002] -10837 ; [.46AB.0020.0002] -10838 ; [.46AC.0020.0002] -1083C ; [.46AD.0020.0002] -1083F ; [.46AE.0020.0002] -10A60 ; [.46AF.0020.0002] -10A61 ; [.46B0.0020.0002] -10A62 ; [.46B1.0020.0002] -10A63 ; [.46B2.0020.0002] -10A64 ; [.46B3.0020.0002] -10A65 ; [.46B4.0020.0002] -10A66 ; [.46B5.0020.0002] -10A67 ; [.46B6.0020.0002] -10A68 ; [.46B7.0020.0002] -10A69 ; [.46B8.0020.0002] -10A6A ; [.46B9.0020.0002] -10A6B ; [.46BA.0020.0002] -10A6C ; [.46BB.0020.0002] -10A6D ; [.46BC.0020.0002] -10A6E ; [.46BD.0020.0002] -10A6F ; [.46BE.0020.0002] -10A70 ; [.46BF.0020.0002] -10A71 ; [.46C0.0020.0002] -10A72 ; [.46C1.0020.0002] -10A73 ; [.46C2.0020.0002] -10A74 ; [.46C3.0020.0002] -10A75 ; [.46C4.0020.0002] -10A76 ; [.46C5.0020.0002] -10A77 ; [.46C6.0020.0002] -10A78 ; [.46C7.0020.0002] -10A79 ; [.46C8.0020.0002] -10A7A ; [.46C9.0020.0002] -10A7B ; [.46CA.0020.0002] -10A7C ; [.46CB.0020.0002] -10A80 ; [.46CC.0020.0002] -10A81 ; [.46CD.0020.0002] -10A82 ; [.46CE.0020.0002] -10A83 ; [.46CF.0020.0002] -10A84 ; [.46D0.0020.0002] -10A85 ; [.46D1.0020.0002] -10A86 ; [.46D2.0020.0002] -10A87 ; [.46D3.0020.0002] -10A88 ; [.46D4.0020.0002] -10A89 ; [.46D5.0020.0002] -10A8A ; [.46D6.0020.0002] -10A8B ; [.46D7.0020.0002] -10A8C ; [.46D8.0020.0002] -10A8D ; [.46D9.0020.0002] -10A8E ; [.46DA.0020.0002] -10A8F ; [.46DB.0020.0002] -10A90 ; [.46DC.0020.0002] -10A91 ; [.46DD.0020.0002] -10A92 ; [.46DE.0020.0002] -10A93 ; [.46DF.0020.0002] -10A94 ; [.46E0.0020.0002] -10A95 ; [.46E1.0020.0002] -10A96 ; [.46E2.0020.0002] -10A97 ; [.46E3.0020.0002] -10A98 ; [.46E4.0020.0002] -10A99 ; [.46E5.0020.0002] -10A9A ; [.46E6.0020.0002] -10A9B ; [.46E7.0020.0002] -10A9C ; [.46E8.0020.0002] -10B00 ; [.46E9.0020.0002] -10B01 ; [.46EA.0020.0002] -10B02 ; [.46EB.0020.0002] -10B03 ; [.46EC.0020.0002] -10B04 ; [.46ED.0020.0002] -10B05 ; [.46EE.0020.0002] -10B06 ; [.46EF.0020.0002] -10B07 ; [.46F0.0020.0002] -10B08 ; [.46F1.0020.0002] -10B09 ; [.46F2.0020.0002] -10B0A ; [.46F3.0020.0002] -10B0B ; [.46F4.0020.0002] -10B0C ; [.46F5.0020.0002] -10B0D ; [.46F6.0020.0002] -10B0E ; [.46F7.0020.0002] -10B0F ; [.46F8.0020.0002] -10B10 ; [.46F9.0020.0002] -10B11 ; [.46FA.0020.0002] -10B12 ; [.46FB.0020.0002] -10B13 ; [.46FC.0020.0002] -10B14 ; [.46FD.0020.0002] -10B15 ; [.46FE.0020.0002] -10B16 ; [.46FF.0020.0002] -10B17 ; [.4700.0020.0002] -10B18 ; [.4701.0020.0002] -10B19 ; [.4702.0020.0002] -10B1A ; [.4703.0020.0002] -10B1B ; [.4704.0020.0002] -10B1C ; [.4705.0020.0002] -10B1D ; [.4706.0020.0002] -10B1E ; [.4707.0020.0002] -10B1F ; [.4708.0020.0002] -10B20 ; [.4709.0020.0002] -10B21 ; [.470A.0020.0002] -10B22 ; [.470B.0020.0002] -10B23 ; [.470C.0020.0002] -10B24 ; [.470D.0020.0002] -10B25 ; [.470E.0020.0002] -10B26 ; [.470F.0020.0002] -10B27 ; [.4710.0020.0002] -10B28 ; [.4711.0020.0002] -10B29 ; [.4712.0020.0002] -10B2A ; [.4713.0020.0002] -10B2B ; [.4714.0020.0002] -10B2C ; [.4715.0020.0002] -10B2D ; [.4716.0020.0002] -10B2E ; [.4716.0020.0004][.0000.010B.0004] -10B2F ; [.4717.0020.0002] -10B30 ; [.4718.0020.0002] -10B31 ; [.4719.0020.0002] -10B32 ; [.471A.0020.0002] -10B33 ; [.471B.0020.0002] -10B34 ; [.471C.0020.0002] -10B35 ; [.471D.0020.0002] -10860 ; [.471E.0020.0002] -10861 ; [.471F.0020.0002] -10862 ; [.4720.0020.0002] -10863 ; [.4721.0020.0002] -10864 ; [.4722.0020.0002] -10865 ; [.4723.0020.0002] -10866 ; [.4724.0020.0002] -10867 ; [.4725.0020.0002] -10868 ; [.4726.0020.0002] -10869 ; [.4727.0020.0002] -1086A ; [.4728.0020.0002] -1086B ; [.4729.0020.0002] -1086C ; [.472A.0020.0002] -1086E ; [.472B.0020.0002] -1086D ; [.472B.0020.0019] -1086F ; [.472C.0020.0002] -10870 ; [.472D.0020.0002] -10871 ; [.472E.0020.0002] -10872 ; [.472F.0020.0002] -10873 ; [.4730.0020.0002] -10874 ; [.4731.0020.0002] -10875 ; [.4732.0020.0002] -10876 ; [.4733.0020.0002] -10881 ; [.4734.0020.0002] -10880 ; [.4734.0020.0019] -10883 ; [.4735.0020.0002] -10882 ; [.4735.0020.0019] -10884 ; [.4736.0020.0002] -10885 ; [.4737.0020.0002] -10887 ; [.4738.0020.0002] -10886 ; [.4738.0020.0019] -10888 ; [.4739.0020.0002] -10889 ; [.473A.0020.0002] -1088A ; [.473B.0020.0002] -1088B ; [.473C.0020.0002] -1088D ; [.473D.0020.0002] -1088C ; [.473D.0020.0019] -1088F ; [.473E.0020.0002] -1088E ; [.473E.0020.0019] -10891 ; [.473F.0020.0002] -10890 ; [.473F.0020.0019] -10893 ; [.4740.0020.0002] -10892 ; [.4740.0020.0019] -10895 ; [.4741.0020.0002] -10894 ; [.4741.0020.0019] -10896 ; [.4742.0020.0002] -10897 ; [.4743.0020.0002] -10898 ; [.4744.0020.0002] -10899 ; [.4745.0020.0002] -1089A ; [.4746.0020.0002] -1089B ; [.4747.0020.0002] -1089D ; [.4748.0020.0002] -1089C ; [.4748.0020.0019] -1089E ; [.4749.0020.0002] -108E0 ; [.474A.0020.0002] -108E1 ; [.474B.0020.0002] -108E2 ; [.474C.0020.0002] -108E3 ; [.474D.0020.0002] -108E4 ; [.474E.0020.0002] -108E5 ; [.474F.0020.0002] -108E6 ; [.4750.0020.0002] -108E7 ; [.4751.0020.0002] -108E8 ; [.4752.0020.0002] -108E9 ; [.4753.0020.0002] -108EA ; [.4754.0020.0002] -108EB ; [.4755.0020.0002] -108EC ; [.4756.0020.0002] -108ED ; [.4757.0020.0002] -108EE ; [.4758.0020.0002] -108EF ; [.4759.0020.0002] -108F0 ; [.475A.0020.0002] -108F1 ; [.475B.0020.0002] -108F2 ; [.475C.0020.0002] -108F4 ; [.475D.0020.0002] -108F5 ; [.475E.0020.0002] -10840 ; [.475F.0020.0002] -10841 ; [.4760.0020.0002] -10842 ; [.4761.0020.0002] -10843 ; [.4762.0020.0002] -10844 ; [.4763.0020.0002] -10845 ; [.4764.0020.0002] -10846 ; [.4765.0020.0002] -10847 ; [.4766.0020.0002] -10848 ; [.4767.0020.0002] -10849 ; [.4768.0020.0002] -1084A ; [.4769.0020.0002] -1084B ; [.476A.0020.0002] -1084C ; [.476B.0020.0002] -1084D ; [.476C.0020.0002] -1084E ; [.476D.0020.0002] -1084F ; [.476E.0020.0002] -10850 ; [.476F.0020.0002] -10851 ; [.4770.0020.0002] -10852 ; [.4771.0020.0002] -10853 ; [.4772.0020.0002] -10854 ; [.4773.0020.0002] -10855 ; [.4774.0020.0002] -10B40 ; [.4775.0020.0002] -10B41 ; [.4776.0020.0002] -10B42 ; [.4777.0020.0002] -10B43 ; [.4778.0020.0002] -10B44 ; [.4779.0020.0002] -10B45 ; [.477A.0020.0002] -10B46 ; [.477B.0020.0002] -10B47 ; [.477C.0020.0002] -10B48 ; [.477D.0020.0002] -10B49 ; [.477E.0020.0002] -10B4A ; [.477F.0020.0002] -10B4B ; [.4780.0020.0002] -10B4C ; [.4781.0020.0002] -10B4D ; [.4782.0020.0002] -10B4E ; [.4783.0020.0002] -10B4F ; [.4784.0020.0002] -10B50 ; [.4785.0020.0002] -10B51 ; [.4786.0020.0002] -10B52 ; [.4787.0020.0002] -10B53 ; [.4788.0020.0002] -10B54 ; [.4789.0020.0002] -10B55 ; [.478A.0020.0002] -10B60 ; [.478B.0020.0002] -10B61 ; [.478C.0020.0002] -10B62 ; [.478D.0020.0002] -10B63 ; [.478E.0020.0002] -10B64 ; [.478F.0020.0002] -10B65 ; [.4790.0020.0002] -10B66 ; [.4791.0020.0002] -10B67 ; [.4792.0020.0002] -10B68 ; [.4793.0020.0002] -10B69 ; [.4794.0020.0002] -10B6A ; [.4795.0020.0002] -10B6B ; [.4796.0020.0002] -10B6C ; [.4797.0020.0002] -10B6D ; [.4798.0020.0002] -10B6E ; [.4799.0020.0002] -10B6F ; [.479A.0020.0002] -10B70 ; [.479B.0020.0002] -10B71 ; [.479C.0020.0002] -10B72 ; [.479D.0020.0002] -10B80 ; [.479E.0020.0002] -10B81 ; [.479F.0020.0002] -10B82 ; [.47A0.0020.0002] -10B83 ; [.47A1.0020.0002] -10B84 ; [.47A2.0020.0002] -10B85 ; [.47A3.0020.0002] -10B86 ; [.47A4.0020.0002] -10B87 ; [.47A5.0020.0002] -10B88 ; [.47A6.0020.0002] -10B89 ; [.47A7.0020.0002] -10B8A ; [.47A8.0020.0002] -10B8B ; [.47A9.0020.0002] -10B8C ; [.47AA.0020.0002] -10B8D ; [.47AB.0020.0002] -10B8E ; [.47AC.0020.0002] -10B8F ; [.47AD.0020.0002] -10B90 ; [.47AE.0020.0002] -10B91 ; [.47AF.0020.0002] -10AC0 ; [.47B0.0020.0002] -10AC1 ; [.47B1.0020.0002] -10AC2 ; [.47B2.0020.0002] -10AC3 ; [.47B3.0020.0002] -10AC4 ; [.47B4.0020.0002] -10AC5 ; [.47B5.0020.0002] -10AC6 ; [.47B6.0020.0002] -10AC7 ; [.47B7.0020.0002] -10AC8 ; [.47B7.0020.0004][.0000.010C.0004] -10AC9 ; [.47B8.0020.0002] -10ACA ; [.47B9.0020.0002] -10ACB ; [.47BA.0020.0002] -10ACC ; [.47BB.0020.0002] -10ACD ; [.47BC.0020.0002] -10ACE ; [.47BD.0020.0002] -10ACF ; [.47BE.0020.0002] -10AD0 ; [.47BF.0020.0002] -10AD1 ; [.47C0.0020.0002] -10AD2 ; [.47C1.0020.0002] -10AD3 ; [.47C2.0020.0002] -10AD4 ; [.47C3.0020.0002] -10AD5 ; [.47C4.0020.0002] -10AD6 ; [.47C5.0020.0002] -10AD7 ; [.47C6.0020.0002] -10AD8 ; [.47C7.0020.0002] -10AD9 ; [.47C8.0020.0002] -10ADA ; [.47C9.0020.0002] -10ADB ; [.47CA.0020.0002] -10ADC ; [.47CB.0020.0002] -10ADD ; [.47CC.0020.0002] -10ADE ; [.47CD.0020.0002] -10ADF ; [.47CE.0020.0002] -10AE0 ; [.47CF.0020.0002] -10AE1 ; [.47D0.0020.0002] -10AE2 ; [.47D1.0020.0002] -10AE3 ; [.47D2.0020.0002] -10AE4 ; [.47D3.0020.0002] -10380 ; [.47D4.0020.0002] -10381 ; [.47D5.0020.0002] -10382 ; [.47D6.0020.0002] -10383 ; [.47D7.0020.0002] -10384 ; [.47D8.0020.0002] -10385 ; [.47D9.0020.0002] -10386 ; [.47DA.0020.0002] -10387 ; [.47DB.0020.0002] -10388 ; [.47DC.0020.0002] -10389 ; [.47DD.0020.0002] -1038A ; [.47DE.0020.0002] -1038B ; [.47DF.0020.0002] -1038C ; [.47E0.0020.0002] -1038D ; [.47E1.0020.0002] -1038E ; [.47E2.0020.0002] -1038F ; [.47E3.0020.0002] -10390 ; [.47E4.0020.0002] -10391 ; [.47E5.0020.0002] -10392 ; [.47E6.0020.0002] -10393 ; [.47E7.0020.0002] -10394 ; [.47E8.0020.0002] -10395 ; [.47E9.0020.0002] -10396 ; [.47EA.0020.0002] -10397 ; [.47EB.0020.0002] -10398 ; [.47EC.0020.0002] -10399 ; [.47ED.0020.0002] -1039A ; [.47EE.0020.0002] -1039B ; [.47EF.0020.0002] -1039C ; [.47F0.0020.0002] -1039D ; [.47F1.0020.0002] -103A0 ; [.47F2.0020.0002] -103A1 ; [.47F3.0020.0002] -103A2 ; [.47F4.0020.0002] -103A3 ; [.47F5.0020.0002] -103A4 ; [.47F6.0020.0002] -103A5 ; [.47F7.0020.0002] -103A6 ; [.47F8.0020.0002] -103A7 ; [.47F9.0020.0002] -103A8 ; [.47FA.0020.0002] -103A9 ; [.47FB.0020.0002] -103AA ; [.47FC.0020.0002] -103AB ; [.47FD.0020.0002] -103AC ; [.47FE.0020.0002] -103AD ; [.47FF.0020.0002] -103AE ; [.4800.0020.0002] -103AF ; [.4801.0020.0002] -103B0 ; [.4802.0020.0002] -103B1 ; [.4803.0020.0002] -103B2 ; [.4804.0020.0002] -103B3 ; [.4805.0020.0002] -103B4 ; [.4806.0020.0002] -103B5 ; [.4807.0020.0002] -103B6 ; [.4808.0020.0002] -103B7 ; [.4809.0020.0002] -103B8 ; [.480A.0020.0002] -103B9 ; [.480B.0020.0002] -103BA ; [.480C.0020.0002] -103BB ; [.480D.0020.0002] -103BC ; [.480E.0020.0002] -103BD ; [.480F.0020.0002] -103BE ; [.4810.0020.0002] -103BF ; [.4811.0020.0002] -103C0 ; [.4812.0020.0002] -103C1 ; [.4813.0020.0002] -103C2 ; [.4814.0020.0002] -103C3 ; [.4815.0020.0002] -103C8 ; [.4816.0020.0002] -103C9 ; [.4817.0020.0002] -103CA ; [.4818.0020.0002] -103CB ; [.4819.0020.0002] -103CC ; [.481A.0020.0002] -103CD ; [.481B.0020.0002] -103CE ; [.481C.0020.0002] -103CF ; [.481D.0020.0002] -12000 ; [.481E.0020.0002] -12001 ; [.481F.0020.0002] -12002 ; [.4820.0020.0002] -12003 ; [.4821.0020.0002] -12004 ; [.4822.0020.0002] -12005 ; [.4823.0020.0002] -12006 ; [.4824.0020.0002] -12007 ; [.4825.0020.0002] -12008 ; [.4826.0020.0002] -12009 ; [.4827.0020.0002] -1200A ; [.4828.0020.0002] -1200B ; [.4829.0020.0002] -1200C ; [.482A.0020.0002] -1200D ; [.482B.0020.0002] -1200E ; [.482C.0020.0002] -1200F ; [.482D.0020.0002] -12010 ; [.482E.0020.0002] -12011 ; [.482F.0020.0002] -12012 ; [.4830.0020.0002] -12013 ; [.4831.0020.0002] -12014 ; [.4832.0020.0002] -12015 ; [.4833.0020.0002] -12016 ; [.4834.0020.0002] -12017 ; [.4835.0020.0002] -12018 ; [.4836.0020.0002] -12019 ; [.4837.0020.0002] -1201A ; [.4838.0020.0002] -1201B ; [.4839.0020.0002] -1201C ; [.483A.0020.0002] -1201D ; [.483B.0020.0002] -1201E ; [.483C.0020.0002] -1201F ; [.483D.0020.0002] -12020 ; [.483E.0020.0002] -12021 ; [.483F.0020.0002] -12022 ; [.4840.0020.0002] -12023 ; [.4841.0020.0002] -12024 ; [.4842.0020.0002] -12025 ; [.4843.0020.0002] -12026 ; [.4844.0020.0002] -12027 ; [.4845.0020.0002] -12028 ; [.4846.0020.0002] -12029 ; [.4847.0020.0002] -1202A ; [.4848.0020.0002] -1202B ; [.4849.0020.0002] -1202C ; [.484A.0020.0002] -1202D ; [.484B.0020.0002] -1202E ; [.484C.0020.0002] -1202F ; [.484D.0020.0002] -12030 ; [.484E.0020.0002] -12031 ; [.484F.0020.0002] -12032 ; [.4850.0020.0002] -12033 ; [.4851.0020.0002] -12034 ; [.4852.0020.0002] -12035 ; [.4853.0020.0002] -12036 ; [.4854.0020.0002] -12037 ; [.4855.0020.0002] -12038 ; [.4856.0020.0002] -12039 ; [.4857.0020.0002] -1203A ; [.4858.0020.0002] -1203B ; [.4859.0020.0002] -1203C ; [.485A.0020.0002] -1203D ; [.485B.0020.0002] -1203E ; [.485C.0020.0002] -1203F ; [.485D.0020.0002] -12040 ; [.485E.0020.0002] -12041 ; [.485F.0020.0002] -12042 ; [.4860.0020.0002] -12043 ; [.4861.0020.0002] -12044 ; [.4862.0020.0002] -12045 ; [.4863.0020.0002] -12046 ; [.4864.0020.0002] -12047 ; [.4865.0020.0002] -12048 ; [.4866.0020.0002] -12049 ; [.4867.0020.0002] -1204A ; [.4868.0020.0002] -1204B ; [.4869.0020.0002] -1204C ; [.486A.0020.0002] -1204D ; [.486B.0020.0002] -1204E ; [.486C.0020.0002] -1204F ; [.486D.0020.0002] -12050 ; [.486E.0020.0002] -12051 ; [.486F.0020.0002] -12052 ; [.4870.0020.0002] -12053 ; [.4871.0020.0002] -12054 ; [.4872.0020.0002] -12055 ; [.4873.0020.0002] -12056 ; [.4874.0020.0002] -12057 ; [.4875.0020.0002] -12058 ; [.4876.0020.0002] -12059 ; [.4877.0020.0002] -1205A ; [.4878.0020.0002] -1205B ; [.4879.0020.0002] -1205C ; [.487A.0020.0002] -1205D ; [.487B.0020.0002] -1205E ; [.487C.0020.0002] -1205F ; [.487D.0020.0002] -12060 ; [.487E.0020.0002] -12061 ; [.487F.0020.0002] -12062 ; [.4880.0020.0002] -12063 ; [.4881.0020.0002] -12064 ; [.4882.0020.0002] -12065 ; [.4883.0020.0002] -12066 ; [.4884.0020.0002] -12067 ; [.4885.0020.0002] -12068 ; [.4886.0020.0002] -12069 ; [.4887.0020.0002] -1206A ; [.4888.0020.0002] -1206B ; [.4889.0020.0002] -1206C ; [.488A.0020.0002] -1206D ; [.488B.0020.0002] -1206E ; [.488C.0020.0002] -1206F ; [.488D.0020.0002] -12070 ; [.488E.0020.0002] -12071 ; [.488F.0020.0002] -12072 ; [.4890.0020.0002] -12073 ; [.4891.0020.0002] -12074 ; [.4892.0020.0002] -12075 ; [.4893.0020.0002] -12076 ; [.4894.0020.0002] -12077 ; [.4895.0020.0002] -12078 ; [.4896.0020.0002] -12079 ; [.4897.0020.0002] -1207A ; [.4898.0020.0002] -1207B ; [.4899.0020.0002] -1207C ; [.489A.0020.0002] -1207D ; [.489B.0020.0002] -1207E ; [.489C.0020.0002] -1207F ; [.489D.0020.0002] -12080 ; [.489E.0020.0002] -12081 ; [.489F.0020.0002] -12082 ; [.48A0.0020.0002] -12083 ; [.48A1.0020.0002] -12084 ; [.48A2.0020.0002] -12085 ; [.48A3.0020.0002] -12086 ; [.48A4.0020.0002] -12087 ; [.48A5.0020.0002] -12088 ; [.48A6.0020.0002] -12089 ; [.48A7.0020.0002] -1208A ; [.48A8.0020.0002] -1208B ; [.48A9.0020.0002] -1208C ; [.48AA.0020.0002] -1208D ; [.48AB.0020.0002] -1208E ; [.48AC.0020.0002] -1208F ; [.48AD.0020.0002] -12090 ; [.48AE.0020.0002] -12091 ; [.48AF.0020.0002] -12092 ; [.48B0.0020.0002] -12093 ; [.48B1.0020.0002] -12094 ; [.48B2.0020.0002] -12095 ; [.48B3.0020.0002] -12096 ; [.48B4.0020.0002] -12097 ; [.48B5.0020.0002] -12098 ; [.48B6.0020.0002] -12099 ; [.48B7.0020.0002] -1209A ; [.48B8.0020.0002] -1209B ; [.48B9.0020.0002] -1209C ; [.48BA.0020.0002] -1209D ; [.48BB.0020.0002] -1209E ; [.48BC.0020.0002] -1209F ; [.48BD.0020.0002] -120A0 ; [.48BE.0020.0002] -120A1 ; [.48BF.0020.0002] -120A2 ; [.48C0.0020.0002] -120A3 ; [.48C1.0020.0002] -120A4 ; [.48C2.0020.0002] -120A5 ; [.48C3.0020.0002] -120A6 ; [.48C4.0020.0002] -120A7 ; [.48C5.0020.0002] -120A8 ; [.48C6.0020.0002] -120A9 ; [.48C7.0020.0002] -120AA ; [.48C8.0020.0002] -120AB ; [.48C9.0020.0002] -120AC ; [.48CA.0020.0002] -120AD ; [.48CB.0020.0002] -120AE ; [.48CC.0020.0002] -120AF ; [.48CD.0020.0002] -120B0 ; [.48CE.0020.0002] -120B1 ; [.48CF.0020.0002] -120B2 ; [.48D0.0020.0002] -120B3 ; [.48D1.0020.0002] -120B4 ; [.48D2.0020.0002] -120B5 ; [.48D3.0020.0002] -120B6 ; [.48D4.0020.0002] -120B7 ; [.48D5.0020.0002] -120B8 ; [.48D6.0020.0002] -120B9 ; [.48D7.0020.0002] -120BA ; [.48D8.0020.0002] -120BB ; [.48D9.0020.0002] -120BC ; [.48DA.0020.0002] -120BD ; [.48DB.0020.0002] -120BE ; [.48DC.0020.0002] -120BF ; [.48DD.0020.0002] -120C0 ; [.48DE.0020.0002] -120C1 ; [.48DF.0020.0002] -120C2 ; [.48E0.0020.0002] -120C3 ; [.48E1.0020.0002] -120C4 ; [.48E2.0020.0002] -120C5 ; [.48E3.0020.0002] -120C6 ; [.48E4.0020.0002] -120C7 ; [.48E5.0020.0002] -120C8 ; [.48E6.0020.0002] -120C9 ; [.48E7.0020.0002] -120CA ; [.48E8.0020.0002] -120CB ; [.48E9.0020.0002] -120CC ; [.48EA.0020.0002] -120CD ; [.48EB.0020.0002] -120CE ; [.48EC.0020.0002] -120CF ; [.48ED.0020.0002] -120D0 ; [.48EE.0020.0002] -120D1 ; [.48EF.0020.0002] -120D2 ; [.48F0.0020.0002] -120D3 ; [.48F1.0020.0002] -120D4 ; [.48F2.0020.0002] -120D5 ; [.48F3.0020.0002] -120D6 ; [.48F4.0020.0002] -120D7 ; [.48F5.0020.0002] -120D8 ; [.48F6.0020.0002] -120D9 ; [.48F7.0020.0002] -120DA ; [.48F8.0020.0002] -120DB ; [.48F9.0020.0002] -120DC ; [.48FA.0020.0002] -120DD ; [.48FB.0020.0002] -120DE ; [.48FC.0020.0002] -120DF ; [.48FD.0020.0002] -120E0 ; [.48FE.0020.0002] -120E1 ; [.48FF.0020.0002] -120E2 ; [.4900.0020.0002] -120E3 ; [.4901.0020.0002] -120E4 ; [.4902.0020.0002] -120E5 ; [.4903.0020.0002] -120E6 ; [.4904.0020.0002] -120E7 ; [.4905.0020.0002] -120E8 ; [.4906.0020.0002] -120E9 ; [.4907.0020.0002] -120EA ; [.4908.0020.0002] -120EB ; [.4909.0020.0002] -120EC ; [.490A.0020.0002] -120ED ; [.490B.0020.0002] -120EE ; [.490C.0020.0002] -120EF ; [.490D.0020.0002] -120F0 ; [.490E.0020.0002] -120F1 ; [.490F.0020.0002] -120F2 ; [.4910.0020.0002] -120F3 ; [.4911.0020.0002] -120F4 ; [.4912.0020.0002] -120F5 ; [.4913.0020.0002] -120F6 ; [.4914.0020.0002] -120F7 ; [.4915.0020.0002] -120F8 ; [.4916.0020.0002] -120F9 ; [.4917.0020.0002] -120FA ; [.4918.0020.0002] -120FB ; [.4919.0020.0002] -120FC ; [.491A.0020.0002] -120FD ; [.491B.0020.0002] -120FE ; [.491C.0020.0002] -120FF ; [.491D.0020.0002] -12100 ; [.491E.0020.0002] -12101 ; [.491F.0020.0002] -12102 ; [.4920.0020.0002] -12103 ; [.4921.0020.0002] -12104 ; [.4922.0020.0002] -12105 ; [.4923.0020.0002] -12106 ; [.4924.0020.0002] -12107 ; [.4925.0020.0002] -12108 ; [.4926.0020.0002] -12109 ; [.4927.0020.0002] -1210A ; [.4928.0020.0002] -1210B ; [.4929.0020.0002] -1210C ; [.492A.0020.0002] -1210D ; [.492B.0020.0002] -1210E ; [.492C.0020.0002] -1210F ; [.492D.0020.0002] -12110 ; [.492E.0020.0002] -12111 ; [.492F.0020.0002] -12112 ; [.4930.0020.0002] -12113 ; [.4931.0020.0002] -12114 ; [.4932.0020.0002] -12115 ; [.4933.0020.0002] -12116 ; [.4934.0020.0002] -12117 ; [.4935.0020.0002] -12118 ; [.4936.0020.0002] -12119 ; [.4937.0020.0002] -1211A ; [.4938.0020.0002] -1211B ; [.4939.0020.0002] -1211C ; [.493A.0020.0002] -1211D ; [.493B.0020.0002] -1211E ; [.493C.0020.0002] -1211F ; [.493D.0020.0002] -12120 ; [.493E.0020.0002] -12121 ; [.493F.0020.0002] -12122 ; [.4940.0020.0002] -12123 ; [.4941.0020.0002] -12124 ; [.4942.0020.0002] -12125 ; [.4943.0020.0002] -12126 ; [.4944.0020.0002] -12127 ; [.4945.0020.0002] -12128 ; [.4946.0020.0002] -12129 ; [.4947.0020.0002] -1212A ; [.4948.0020.0002] -1212B ; [.4949.0020.0002] -1212C ; [.494A.0020.0002] -1212D ; [.494B.0020.0002] -1212E ; [.494C.0020.0002] -1212F ; [.494D.0020.0002] -12130 ; [.494E.0020.0002] -12131 ; [.494F.0020.0002] -12132 ; [.4950.0020.0002] -12133 ; [.4951.0020.0002] -12134 ; [.4952.0020.0002] -12135 ; [.4953.0020.0002] -12136 ; [.4954.0020.0002] -12137 ; [.4955.0020.0002] -12138 ; [.4956.0020.0002] -12139 ; [.4957.0020.0002] -1213A ; [.4958.0020.0002] -1213B ; [.4959.0020.0002] -1213C ; [.495A.0020.0002] -1213D ; [.495B.0020.0002] -1213E ; [.495C.0020.0002] -1213F ; [.495D.0020.0002] -12140 ; [.495E.0020.0002] -12141 ; [.495F.0020.0002] -12142 ; [.4960.0020.0002] -12143 ; [.4961.0020.0002] -12144 ; [.4962.0020.0002] -12145 ; [.4963.0020.0002] -12146 ; [.4964.0020.0002] -12147 ; [.4965.0020.0002] -12148 ; [.4966.0020.0002] -12149 ; [.4967.0020.0002] -1214A ; [.4968.0020.0002] -1214B ; [.4969.0020.0002] -1214C ; [.496A.0020.0002] -1214D ; [.496B.0020.0002] -1214E ; [.496C.0020.0002] -1214F ; [.496D.0020.0002] -12150 ; [.496E.0020.0002] -12151 ; [.496F.0020.0002] -12152 ; [.4970.0020.0002] -12153 ; [.4971.0020.0002] -12154 ; [.4972.0020.0002] -12155 ; [.4973.0020.0002] -12156 ; [.4974.0020.0002] -12157 ; [.4975.0020.0002] -12158 ; [.4976.0020.0002] -12159 ; [.4977.0020.0002] -1215A ; [.4978.0020.0002] -1215B ; [.4979.0020.0002] -1215C ; [.497A.0020.0002] -1215D ; [.497B.0020.0002] -1215E ; [.497C.0020.0002] -1215F ; [.497D.0020.0002] -12160 ; [.497E.0020.0002] -12161 ; [.497F.0020.0002] -12162 ; [.4980.0020.0002] -12163 ; [.4981.0020.0002] -12164 ; [.4982.0020.0002] -12165 ; [.4983.0020.0002] -12166 ; [.4984.0020.0002] -12167 ; [.4985.0020.0002] -12168 ; [.4986.0020.0002] -12169 ; [.4987.0020.0002] -1216A ; [.4988.0020.0002] -1216B ; [.4989.0020.0002] -1216C ; [.498A.0020.0002] -1216D ; [.498B.0020.0002] -1216E ; [.498C.0020.0002] -1216F ; [.498D.0020.0002] -12170 ; [.498E.0020.0002] -12171 ; [.498F.0020.0002] -12172 ; [.4990.0020.0002] -12173 ; [.4991.0020.0002] -12174 ; [.4992.0020.0002] -12175 ; [.4993.0020.0002] -12176 ; [.4994.0020.0002] -12177 ; [.4995.0020.0002] -12178 ; [.4996.0020.0002] -12179 ; [.4997.0020.0002] -1217A ; [.4998.0020.0002] -1217B ; [.4999.0020.0002] -1217C ; [.499A.0020.0002] -1217D ; [.499B.0020.0002] -1217E ; [.499C.0020.0002] -1217F ; [.499D.0020.0002] -12180 ; [.499E.0020.0002] -12181 ; [.499F.0020.0002] -12182 ; [.49A0.0020.0002] -12183 ; [.49A1.0020.0002] -12184 ; [.49A2.0020.0002] -12185 ; [.49A3.0020.0002] -12186 ; [.49A4.0020.0002] -12187 ; [.49A5.0020.0002] -12188 ; [.49A6.0020.0002] -12189 ; [.49A7.0020.0002] -1218A ; [.49A8.0020.0002] -1218B ; [.49A9.0020.0002] -1218C ; [.49AA.0020.0002] -1218D ; [.49AB.0020.0002] -1218E ; [.49AC.0020.0002] -1218F ; [.49AD.0020.0002] -12190 ; [.49AE.0020.0002] -12191 ; [.49AF.0020.0002] -12192 ; [.49B0.0020.0002] -12193 ; [.49B1.0020.0002] -12194 ; [.49B2.0020.0002] -12195 ; [.49B3.0020.0002] -12196 ; [.49B4.0020.0002] -12197 ; [.49B5.0020.0002] -12198 ; [.49B6.0020.0002] -12199 ; [.49B7.0020.0002] -1219A ; [.49B8.0020.0002] -1219B ; [.49B9.0020.0002] -1219C ; [.49BA.0020.0002] -1219D ; [.49BB.0020.0002] -1219E ; [.49BC.0020.0002] -1219F ; [.49BD.0020.0002] -121A0 ; [.49BE.0020.0002] -121A1 ; [.49BF.0020.0002] -121A2 ; [.49C0.0020.0002] -121A3 ; [.49C1.0020.0002] -121A4 ; [.49C2.0020.0002] -121A5 ; [.49C3.0020.0002] -121A6 ; [.49C4.0020.0002] -121A7 ; [.49C5.0020.0002] -121A8 ; [.49C6.0020.0002] -121A9 ; [.49C7.0020.0002] -121AA ; [.49C8.0020.0002] -121AB ; [.49C9.0020.0002] -121AC ; [.49CA.0020.0002] -121AD ; [.49CB.0020.0002] -121AE ; [.49CC.0020.0002] -121AF ; [.49CD.0020.0002] -121B0 ; [.49CE.0020.0002] -121B1 ; [.49CF.0020.0002] -121B2 ; [.49D0.0020.0002] -121B3 ; [.49D1.0020.0002] -121B4 ; [.49D2.0020.0002] -121B5 ; [.49D3.0020.0002] -121B6 ; [.49D4.0020.0002] -121B7 ; [.49D5.0020.0002] -121B8 ; [.49D6.0020.0002] -121B9 ; [.49D7.0020.0002] -121BA ; [.49D8.0020.0002] -121BB ; [.49D9.0020.0002] -121BC ; [.49DA.0020.0002] -121BD ; [.49DB.0020.0002] -121BE ; [.49DC.0020.0002] -121BF ; [.49DD.0020.0002] -121C0 ; [.49DE.0020.0002] -121C1 ; [.49DF.0020.0002] -121C2 ; [.49E0.0020.0002] -121C3 ; [.49E1.0020.0002] -121C4 ; [.49E2.0020.0002] -121C5 ; [.49E3.0020.0002] -121C6 ; [.49E4.0020.0002] -121C7 ; [.49E5.0020.0002] -121C8 ; [.49E6.0020.0002] -121C9 ; [.49E7.0020.0002] -121CA ; [.49E8.0020.0002] -121CB ; [.49E9.0020.0002] -121CC ; [.49EA.0020.0002] -121CD ; [.49EB.0020.0002] -121CE ; [.49EC.0020.0002] -121CF ; [.49ED.0020.0002] -121D0 ; [.49EE.0020.0002] -121D1 ; [.49EF.0020.0002] -121D2 ; [.49F0.0020.0002] -121D3 ; [.49F1.0020.0002] -121D4 ; [.49F2.0020.0002] -121D5 ; [.49F3.0020.0002] -121D6 ; [.49F4.0020.0002] -121D7 ; [.49F5.0020.0002] -121D8 ; [.49F6.0020.0002] -121D9 ; [.49F7.0020.0002] -121DA ; [.49F8.0020.0002] -121DB ; [.49F9.0020.0002] -121DC ; [.49FA.0020.0002] -121DD ; [.49FB.0020.0002] -121DE ; [.49FC.0020.0002] -121DF ; [.49FD.0020.0002] -121E0 ; [.49FE.0020.0002] -121E1 ; [.49FF.0020.0002] -121E2 ; [.4A00.0020.0002] -121E3 ; [.4A01.0020.0002] -121E4 ; [.4A02.0020.0002] -121E5 ; [.4A03.0020.0002] -121E6 ; [.4A04.0020.0002] -121E7 ; [.4A05.0020.0002] -121E8 ; [.4A06.0020.0002] -121E9 ; [.4A07.0020.0002] -121EA ; [.4A08.0020.0002] -121EB ; [.4A09.0020.0002] -121EC ; [.4A0A.0020.0002] -121ED ; [.4A0B.0020.0002] -121EE ; [.4A0C.0020.0002] -121EF ; [.4A0D.0020.0002] -121F0 ; [.4A0E.0020.0002] -121F1 ; [.4A0F.0020.0002] -121F2 ; [.4A10.0020.0002] -121F3 ; [.4A11.0020.0002] -121F4 ; [.4A12.0020.0002] -121F5 ; [.4A13.0020.0002] -121F6 ; [.4A14.0020.0002] -121F7 ; [.4A15.0020.0002] -121F8 ; [.4A16.0020.0002] -121F9 ; [.4A17.0020.0002] -121FA ; [.4A18.0020.0002] -121FB ; [.4A19.0020.0002] -121FC ; [.4A1A.0020.0002] -121FD ; [.4A1B.0020.0002] -121FE ; [.4A1C.0020.0002] -121FF ; [.4A1D.0020.0002] -12200 ; [.4A1E.0020.0002] -12201 ; [.4A1F.0020.0002] -12202 ; [.4A20.0020.0002] -12203 ; [.4A21.0020.0002] -12204 ; [.4A22.0020.0002] -12205 ; [.4A23.0020.0002] -12206 ; [.4A24.0020.0002] -12207 ; [.4A25.0020.0002] -12208 ; [.4A26.0020.0002] -12209 ; [.4A27.0020.0002] -1220A ; [.4A28.0020.0002] -1220B ; [.4A29.0020.0002] -1220C ; [.4A2A.0020.0002] -1220D ; [.4A2B.0020.0002] -1220E ; [.4A2C.0020.0002] -1220F ; [.4A2D.0020.0002] -12210 ; [.4A2E.0020.0002] -12211 ; [.4A2F.0020.0002] -12212 ; [.4A30.0020.0002] -12213 ; [.4A31.0020.0002] -12214 ; [.4A32.0020.0002] -12215 ; [.4A33.0020.0002] -12216 ; [.4A34.0020.0002] -12217 ; [.4A35.0020.0002] -12218 ; [.4A36.0020.0002] -12219 ; [.4A37.0020.0002] -1221A ; [.4A38.0020.0002] -1221B ; [.4A39.0020.0002] -1221C ; [.4A3A.0020.0002] -1221D ; [.4A3B.0020.0002] -1221E ; [.4A3C.0020.0002] -1221F ; [.4A3D.0020.0002] -12220 ; [.4A3E.0020.0002] -12221 ; [.4A3F.0020.0002] -12222 ; [.4A40.0020.0002] -12223 ; [.4A41.0020.0002] -12224 ; [.4A42.0020.0002] -12225 ; [.4A43.0020.0002] -12226 ; [.4A44.0020.0002] -12227 ; [.4A45.0020.0002] -12228 ; [.4A46.0020.0002] -12229 ; [.4A47.0020.0002] -1222A ; [.4A48.0020.0002] -1222B ; [.4A49.0020.0002] -1222C ; [.4A4A.0020.0002] -1222D ; [.4A4B.0020.0002] -1222E ; [.4A4C.0020.0002] -1222F ; [.4A4D.0020.0002] -12230 ; [.4A4E.0020.0002] -12231 ; [.4A4F.0020.0002] -12232 ; [.4A50.0020.0002] -12233 ; [.4A51.0020.0002] -12234 ; [.4A52.0020.0002] -12235 ; [.4A53.0020.0002] -12236 ; [.4A54.0020.0002] -12237 ; [.4A55.0020.0002] -12238 ; [.4A56.0020.0002] -12239 ; [.4A57.0020.0002] -1223A ; [.4A58.0020.0002] -1223B ; [.4A59.0020.0002] -1223C ; [.4A5A.0020.0002] -1223D ; [.4A5B.0020.0002] -1223E ; [.4A5C.0020.0002] -1223F ; [.4A5D.0020.0002] -12240 ; [.4A5E.0020.0002] -12241 ; [.4A5F.0020.0002] -12242 ; [.4A60.0020.0002] -12243 ; [.4A61.0020.0002] -12244 ; [.4A62.0020.0002] -12245 ; [.4A63.0020.0002] -12246 ; [.4A64.0020.0002] -12247 ; [.4A65.0020.0002] -12248 ; [.4A66.0020.0002] -12249 ; [.4A67.0020.0002] -1224A ; [.4A68.0020.0002] -1224B ; [.4A69.0020.0002] -1224C ; [.4A6A.0020.0002] -1224D ; [.4A6B.0020.0002] -1224E ; [.4A6C.0020.0002] -1224F ; [.4A6D.0020.0002] -12250 ; [.4A6E.0020.0002] -12251 ; [.4A6F.0020.0002] -12252 ; [.4A70.0020.0002] -12253 ; [.4A71.0020.0002] -12254 ; [.4A72.0020.0002] -12255 ; [.4A73.0020.0002] -12256 ; [.4A74.0020.0002] -12257 ; [.4A75.0020.0002] -12258 ; [.4A76.0020.0002] -12259 ; [.4A77.0020.0002] -1225A ; [.4A78.0020.0002] -1225B ; [.4A79.0020.0002] -1225C ; [.4A7A.0020.0002] -1225D ; [.4A7B.0020.0002] -1225E ; [.4A7C.0020.0002] -1225F ; [.4A7D.0020.0002] -12260 ; [.4A7E.0020.0002] -12261 ; [.4A7F.0020.0002] -12262 ; [.4A80.0020.0002] -122D4 ; [.4A81.0020.0002] -122D5 ; [.4A82.0020.0002] -12263 ; [.4A83.0020.0002] -12264 ; [.4A84.0020.0002] -12265 ; [.4A85.0020.0002] -12266 ; [.4A86.0020.0002] -12267 ; [.4A87.0020.0002] -12268 ; [.4A88.0020.0002] -12269 ; [.4A89.0020.0002] -1226A ; [.4A8A.0020.0002] -1226B ; [.4A8B.0020.0002] -1226C ; [.4A8C.0020.0002] -1226D ; [.4A8D.0020.0002] -1226E ; [.4A8E.0020.0002] -1226F ; [.4A8F.0020.0002] -12270 ; [.4A90.0020.0002] -12271 ; [.4A91.0020.0002] -12272 ; [.4A92.0020.0002] -12273 ; [.4A93.0020.0002] -12274 ; [.4A94.0020.0002] -12275 ; [.4A95.0020.0002] -12276 ; [.4A96.0020.0002] -12277 ; [.4A97.0020.0002] -12278 ; [.4A98.0020.0002] -12279 ; [.4A99.0020.0002] -1227A ; [.4A9A.0020.0002] -1227B ; [.4A9B.0020.0002] -1227C ; [.4A9C.0020.0002] -1227D ; [.4A9D.0020.0002] -1227E ; [.4A9E.0020.0002] -1227F ; [.4A9F.0020.0002] -12280 ; [.4AA0.0020.0002] -12281 ; [.4AA1.0020.0002] -12282 ; [.4AA2.0020.0002] -12283 ; [.4AA3.0020.0002] -12284 ; [.4AA4.0020.0002] -12285 ; [.4AA5.0020.0002] -12286 ; [.4AA6.0020.0002] -12287 ; [.4AA7.0020.0002] -12288 ; [.4AA8.0020.0002] -12289 ; [.4AA9.0020.0002] -1228A ; [.4AAA.0020.0002] -1228B ; [.4AAB.0020.0002] -1228C ; [.4AAC.0020.0002] -1228D ; [.4AAD.0020.0002] -1228E ; [.4AAE.0020.0002] -1228F ; [.4AAF.0020.0002] -12290 ; [.4AB0.0020.0002] -12291 ; [.4AB1.0020.0002] -12292 ; [.4AB2.0020.0002] -12293 ; [.4AB3.0020.0002] -12294 ; [.4AB4.0020.0002] -12295 ; [.4AB5.0020.0002] -12296 ; [.4AB6.0020.0002] -12297 ; [.4AB7.0020.0002] -12298 ; [.4AB8.0020.0002] -12299 ; [.4AB9.0020.0002] -1229A ; [.4ABA.0020.0002] -1229B ; [.4ABB.0020.0002] -1229C ; [.4ABC.0020.0002] -1229D ; [.4ABD.0020.0002] -1229E ; [.4ABE.0020.0002] -1229F ; [.4ABF.0020.0002] -122A0 ; [.4AC0.0020.0002] -122A1 ; [.4AC1.0020.0002] -122A2 ; [.4AC2.0020.0002] -122A3 ; [.4AC3.0020.0002] -122A4 ; [.4AC4.0020.0002] -122A5 ; [.4AC5.0020.0002] -122A6 ; [.4AC6.0020.0002] -122A7 ; [.4AC7.0020.0002] -122A8 ; [.4AC8.0020.0002] -122A9 ; [.4AC9.0020.0002] -122AA ; [.4ACA.0020.0002] -122AB ; [.4ACB.0020.0002] -122AC ; [.4ACC.0020.0002] -122AD ; [.4ACD.0020.0002] -122AE ; [.4ACE.0020.0002] -122AF ; [.4ACF.0020.0002] -122B0 ; [.4AD0.0020.0002] -122B1 ; [.4AD1.0020.0002] -122B2 ; [.4AD2.0020.0002] -122B3 ; [.4AD3.0020.0002] -122B4 ; [.4AD4.0020.0002] -122B5 ; [.4AD5.0020.0002] -122B6 ; [.4AD6.0020.0002] -122B7 ; [.4AD7.0020.0002] -122B8 ; [.4AD8.0020.0002] -122B9 ; [.4AD9.0020.0002] -122BA ; [.4ADA.0020.0002] -122BB ; [.4ADB.0020.0002] -122BC ; [.4ADC.0020.0002] -122BD ; [.4ADD.0020.0002] -122BE ; [.4ADE.0020.0002] -122BF ; [.4ADF.0020.0002] -122C0 ; [.4AE0.0020.0002] -122C1 ; [.4AE1.0020.0002] -122C2 ; [.4AE2.0020.0002] -122C3 ; [.4AE3.0020.0002] -122C4 ; [.4AE4.0020.0002] -122C5 ; [.4AE5.0020.0002] -122C6 ; [.4AE6.0020.0002] -122C7 ; [.4AE7.0020.0002] -122C8 ; [.4AE8.0020.0002] -122C9 ; [.4AE9.0020.0002] -122CA ; [.4AEA.0020.0002] -122CB ; [.4AEB.0020.0002] -122CC ; [.4AEC.0020.0002] -122CD ; [.4AED.0020.0002] -122CE ; [.4AEE.0020.0002] -122CF ; [.4AEF.0020.0002] -122D0 ; [.4AF0.0020.0002] -122D1 ; [.4AF1.0020.0002] -122D2 ; [.4AF2.0020.0002] -122D3 ; [.4AF3.0020.0002] -122D6 ; [.4AF4.0020.0002] -122D7 ; [.4AF5.0020.0002] -122D8 ; [.4AF6.0020.0002] -122D9 ; [.4AF7.0020.0002] -122DA ; [.4AF8.0020.0002] -122DB ; [.4AF9.0020.0002] -122DC ; [.4AFA.0020.0002] -122DD ; [.4AFB.0020.0002] -122DE ; [.4AFC.0020.0002] -122DF ; [.4AFD.0020.0002] -122E0 ; [.4AFE.0020.0002] -122E1 ; [.4AFF.0020.0002] -122E2 ; [.4B00.0020.0002] -122E3 ; [.4B01.0020.0002] -122E4 ; [.4B02.0020.0002] -122E5 ; [.4B03.0020.0002] -122E6 ; [.4B04.0020.0002] -122E7 ; [.4B05.0020.0002] -122E8 ; [.4B06.0020.0002] -122E9 ; [.4B07.0020.0002] -122EA ; [.4B08.0020.0002] -122EB ; [.4B09.0020.0002] -122EC ; [.4B0A.0020.0002] -122ED ; [.4B0B.0020.0002] -122EE ; [.4B0C.0020.0002] -122EF ; [.4B0D.0020.0002] -122F0 ; [.4B0E.0020.0002] -122F1 ; [.4B0F.0020.0002] -122F2 ; [.4B10.0020.0002] -122F3 ; [.4B11.0020.0002] -122F4 ; [.4B12.0020.0002] -122F5 ; [.4B13.0020.0002] -122F6 ; [.4B14.0020.0002] -122F7 ; [.4B15.0020.0002] -122F8 ; [.4B16.0020.0002] -122F9 ; [.4B17.0020.0002] -122FA ; [.4B18.0020.0002] -122FB ; [.4B19.0020.0002] -122FC ; [.4B1A.0020.0002] -122FD ; [.4B1B.0020.0002] -122FE ; [.4B1C.0020.0002] -122FF ; [.4B1D.0020.0002] -12300 ; [.4B1E.0020.0002] -12301 ; [.4B1F.0020.0002] -12302 ; [.4B20.0020.0002] -12303 ; [.4B21.0020.0002] -12304 ; [.4B22.0020.0002] -12305 ; [.4B23.0020.0002] -12306 ; [.4B24.0020.0002] -12307 ; [.4B25.0020.0002] -12308 ; [.4B26.0020.0002] -12309 ; [.4B27.0020.0002] -1230A ; [.4B28.0020.0002] -1230B ; [.4B29.0020.0002] -1230C ; [.4B2A.0020.0002] -1230D ; [.4B2B.0020.0002] -1230E ; [.4B2C.0020.0002] -1230F ; [.4B2D.0020.0002] -12310 ; [.4B2E.0020.0002] -12311 ; [.4B2F.0020.0002] -12312 ; [.4B30.0020.0002] -12313 ; [.4B31.0020.0002] -12314 ; [.4B32.0020.0002] -12315 ; [.4B33.0020.0002] -12316 ; [.4B34.0020.0002] -12317 ; [.4B35.0020.0002] -12318 ; [.4B36.0020.0002] -12319 ; [.4B37.0020.0002] -1231A ; [.4B38.0020.0002] -1231B ; [.4B39.0020.0002] -1231C ; [.4B3A.0020.0002] -1231D ; [.4B3B.0020.0002] -1231E ; [.4B3C.0020.0002] -1231F ; [.4B3D.0020.0002] -12320 ; [.4B3E.0020.0002] -12321 ; [.4B3F.0020.0002] -12322 ; [.4B40.0020.0002] -12323 ; [.4B41.0020.0002] -12324 ; [.4B42.0020.0002] -12325 ; [.4B43.0020.0002] -12326 ; [.4B44.0020.0002] -12327 ; [.4B45.0020.0002] -12328 ; [.4B46.0020.0002] -12329 ; [.4B47.0020.0002] -1232A ; [.4B48.0020.0002] -1232B ; [.4B49.0020.0002] -1232C ; [.4B4A.0020.0002] -1232D ; [.4B4B.0020.0002] -1232E ; [.4B4C.0020.0002] -1232F ; [.4B4D.0020.0002] -12330 ; [.4B4E.0020.0002] -12331 ; [.4B4F.0020.0002] -12332 ; [.4B50.0020.0002] -12333 ; [.4B51.0020.0002] -12334 ; [.4B52.0020.0002] -12335 ; [.4B53.0020.0002] -12336 ; [.4B54.0020.0002] -12337 ; [.4B55.0020.0002] -12338 ; [.4B56.0020.0002] -12339 ; [.4B57.0020.0002] -1233A ; [.4B58.0020.0002] -1233B ; [.4B59.0020.0002] -1233C ; [.4B5A.0020.0002] -1233D ; [.4B5B.0020.0002] -1233E ; [.4B5C.0020.0002] -1233F ; [.4B5D.0020.0002] -12340 ; [.4B5E.0020.0002] -12341 ; [.4B5F.0020.0002] -12342 ; [.4B60.0020.0002] -12343 ; [.4B61.0020.0002] -12344 ; [.4B62.0020.0002] -12345 ; [.4B63.0020.0002] -12346 ; [.4B64.0020.0002] -12347 ; [.4B65.0020.0002] -12348 ; [.4B66.0020.0002] -12349 ; [.4B67.0020.0002] -1234A ; [.4B68.0020.0002] -1234B ; [.4B69.0020.0002] -1234C ; [.4B6A.0020.0002] -1234D ; [.4B6B.0020.0002] -1234E ; [.4B6C.0020.0002] -1234F ; [.4B6D.0020.0002] -12350 ; [.4B6E.0020.0002] -12351 ; [.4B6F.0020.0002] -12352 ; [.4B70.0020.0002] -12353 ; [.4B71.0020.0002] -12354 ; [.4B72.0020.0002] -12355 ; [.4B73.0020.0002] -12356 ; [.4B74.0020.0002] -12357 ; [.4B75.0020.0002] -12358 ; [.4B76.0020.0002] -12359 ; [.4B77.0020.0002] -1235A ; [.4B78.0020.0002] -1235B ; [.4B79.0020.0002] -1235C ; [.4B7A.0020.0002] -1235D ; [.4B7B.0020.0002] -1235E ; [.4B7C.0020.0002] -1235F ; [.4B7D.0020.0002] -12360 ; [.4B7E.0020.0002] -12361 ; [.4B7F.0020.0002] -12362 ; [.4B80.0020.0002] -12363 ; [.4B81.0020.0002] -12364 ; [.4B82.0020.0002] -12365 ; [.4B83.0020.0002] -12366 ; [.4B84.0020.0002] -12367 ; [.4B85.0020.0002] -12368 ; [.4B86.0020.0002] -12369 ; [.4B87.0020.0002] -1236A ; [.4B88.0020.0002] -1236B ; [.4B89.0020.0002] -1236C ; [.4B8A.0020.0002] -1236D ; [.4B8B.0020.0002] -1236E ; [.4B8C.0020.0002] -1236F ; [.4B8D.0020.0002] -12370 ; [.4B8E.0020.0002] -12371 ; [.4B8F.0020.0002] -12372 ; [.4B90.0020.0002] -12373 ; [.4B91.0020.0002] -12374 ; [.4B92.0020.0002] -12375 ; [.4B93.0020.0002] -12376 ; [.4B94.0020.0002] -12377 ; [.4B95.0020.0002] -12378 ; [.4B96.0020.0002] -12379 ; [.4B97.0020.0002] -1237A ; [.4B98.0020.0002] -1237B ; [.4B99.0020.0002] -1237C ; [.4B9A.0020.0002] -1237D ; [.4B9B.0020.0002] -1237E ; [.4B9C.0020.0002] -1237F ; [.4B9D.0020.0002] -12380 ; [.4B9E.0020.0002] -12381 ; [.4B9F.0020.0002] -12382 ; [.4BA0.0020.0002] -12383 ; [.4BA1.0020.0002] -12384 ; [.4BA2.0020.0002] -12385 ; [.4BA3.0020.0002] -12386 ; [.4BA4.0020.0002] -12387 ; [.4BA5.0020.0002] -12388 ; [.4BA6.0020.0002] -12389 ; [.4BA7.0020.0002] -1238A ; [.4BA8.0020.0002] -1238B ; [.4BA9.0020.0002] -1238C ; [.4BAA.0020.0002] -1238D ; [.4BAB.0020.0002] -1238E ; [.4BAC.0020.0002] -1238F ; [.4BAD.0020.0002] -12390 ; [.4BAE.0020.0002] -12391 ; [.4BAF.0020.0002] -12392 ; [.4BB0.0020.0002] -12393 ; [.4BB1.0020.0002] -12394 ; [.4BB2.0020.0002] -12395 ; [.4BB3.0020.0002] -12396 ; [.4BB4.0020.0002] -12397 ; [.4BB5.0020.0002] -12398 ; [.4BB6.0020.0002] -12399 ; [.4BB7.0020.0002] -12480 ; [.4BB8.0020.0002] -12481 ; [.4BB9.0020.0002] -12482 ; [.4BBA.0020.0002] -12483 ; [.4BBB.0020.0002] -12484 ; [.4BBC.0020.0002] -12485 ; [.4BBD.0020.0002] -12486 ; [.4BBE.0020.0002] -12487 ; [.4BBF.0020.0002] -12488 ; [.4BC0.0020.0002] -12489 ; [.4BC1.0020.0002] -1248A ; [.4BC2.0020.0002] -1248B ; [.4BC3.0020.0002] -1248C ; [.4BC4.0020.0002] -1248D ; [.4BC5.0020.0002] -1248E ; [.4BC6.0020.0002] -1248F ; [.4BC7.0020.0002] -12490 ; [.4BC8.0020.0002] -12491 ; [.4BC9.0020.0002] -12492 ; [.4BCA.0020.0002] -12493 ; [.4BCB.0020.0002] -12494 ; [.4BCC.0020.0002] -12495 ; [.4BCD.0020.0002] -12496 ; [.4BCE.0020.0002] -12497 ; [.4BCF.0020.0002] -12498 ; [.4BD0.0020.0002] -12499 ; [.4BD1.0020.0002] -1249A ; [.4BD2.0020.0002] -1249B ; [.4BD3.0020.0002] -1249C ; [.4BD4.0020.0002] -1249D ; [.4BD5.0020.0002] -1249E ; [.4BD6.0020.0002] -1249F ; [.4BD7.0020.0002] -124A0 ; [.4BD8.0020.0002] -124A1 ; [.4BD9.0020.0002] -124A2 ; [.4BDA.0020.0002] -124A3 ; [.4BDB.0020.0002] -124A4 ; [.4BDC.0020.0002] -124A5 ; [.4BDD.0020.0002] -124A6 ; [.4BDE.0020.0002] -124A7 ; [.4BDF.0020.0002] -124A8 ; [.4BE0.0020.0002] -124A9 ; [.4BE1.0020.0002] -124AA ; [.4BE2.0020.0002] -124AB ; [.4BE3.0020.0002] -124AC ; [.4BE4.0020.0002] -124AD ; [.4BE5.0020.0002] -124AE ; [.4BE6.0020.0002] -124AF ; [.4BE7.0020.0002] -124B0 ; [.4BE8.0020.0002] -124B1 ; [.4BE9.0020.0002] -124B2 ; [.4BEA.0020.0002] -124B3 ; [.4BEB.0020.0002] -124B4 ; [.4BEC.0020.0002] -124B5 ; [.4BED.0020.0002] -124B6 ; [.4BEE.0020.0002] -124B7 ; [.4BEF.0020.0002] -124B8 ; [.4BF0.0020.0002] -124B9 ; [.4BF1.0020.0002] -124BA ; [.4BF2.0020.0002] -124BB ; [.4BF3.0020.0002] -124BC ; [.4BF4.0020.0002] -124BD ; [.4BF5.0020.0002] -124BE ; [.4BF6.0020.0002] -124BF ; [.4BF7.0020.0002] -124C0 ; [.4BF8.0020.0002] -124C1 ; [.4BF9.0020.0002] -124C2 ; [.4BFA.0020.0002] -124C3 ; [.4BFB.0020.0002] -124C4 ; [.4BFC.0020.0002] -124C5 ; [.4BFD.0020.0002] -124C6 ; [.4BFE.0020.0002] -124C7 ; [.4BFF.0020.0002] -124C8 ; [.4C00.0020.0002] -124C9 ; [.4C01.0020.0002] -124CA ; [.4C02.0020.0002] -124CB ; [.4C03.0020.0002] -124CC ; [.4C04.0020.0002] -124CD ; [.4C05.0020.0002] -124CE ; [.4C06.0020.0002] -124CF ; [.4C07.0020.0002] -124D0 ; [.4C08.0020.0002] -124D1 ; [.4C09.0020.0002] -124D2 ; [.4C0A.0020.0002] -124D3 ; [.4C0B.0020.0002] -124D4 ; [.4C0C.0020.0002] -124D5 ; [.4C0D.0020.0002] -124D6 ; [.4C0E.0020.0002] -124D7 ; [.4C0F.0020.0002] -124D8 ; [.4C10.0020.0002] -124D9 ; [.4C11.0020.0002] -124DA ; [.4C12.0020.0002] -124DB ; [.4C13.0020.0002] -124DC ; [.4C14.0020.0002] -124DD ; [.4C15.0020.0002] -124DE ; [.4C16.0020.0002] -124DF ; [.4C17.0020.0002] -124E0 ; [.4C18.0020.0002] -124E1 ; [.4C19.0020.0002] -124E2 ; [.4C1A.0020.0002] -124E3 ; [.4C1B.0020.0002] -124E4 ; [.4C1C.0020.0002] -124E5 ; [.4C1D.0020.0002] -124E6 ; [.4C1E.0020.0002] -124E7 ; [.4C1F.0020.0002] -124E8 ; [.4C20.0020.0002] -124E9 ; [.4C21.0020.0002] -124EA ; [.4C22.0020.0002] -124EB ; [.4C23.0020.0002] -124EC ; [.4C24.0020.0002] -124ED ; [.4C25.0020.0002] -124EE ; [.4C26.0020.0002] -124EF ; [.4C27.0020.0002] -124F0 ; [.4C28.0020.0002] -124F1 ; [.4C29.0020.0002] -124F2 ; [.4C2A.0020.0002] -124F3 ; [.4C2B.0020.0002] -124F4 ; [.4C2C.0020.0002] -124F5 ; [.4C2D.0020.0002] -124F6 ; [.4C2E.0020.0002] -124F7 ; [.4C2F.0020.0002] -124F8 ; [.4C30.0020.0002] -124F9 ; [.4C31.0020.0002] -124FA ; [.4C32.0020.0002] -124FB ; [.4C33.0020.0002] -124FC ; [.4C34.0020.0002] -124FD ; [.4C35.0020.0002] -124FE ; [.4C36.0020.0002] -124FF ; [.4C37.0020.0002] -12500 ; [.4C38.0020.0002] -12501 ; [.4C39.0020.0002] -12502 ; [.4C3A.0020.0002] -12503 ; [.4C3B.0020.0002] -12504 ; [.4C3C.0020.0002] -12505 ; [.4C3D.0020.0002] -12506 ; [.4C3E.0020.0002] -12507 ; [.4C3F.0020.0002] -12508 ; [.4C40.0020.0002] -12509 ; [.4C41.0020.0002] -1250A ; [.4C42.0020.0002] -1250B ; [.4C43.0020.0002] -1250C ; [.4C44.0020.0002] -1250D ; [.4C45.0020.0002] -1250E ; [.4C46.0020.0002] -1250F ; [.4C47.0020.0002] -12510 ; [.4C48.0020.0002] -12511 ; [.4C49.0020.0002] -12512 ; [.4C4A.0020.0002] -12513 ; [.4C4B.0020.0002] -12514 ; [.4C4C.0020.0002] -12515 ; [.4C4D.0020.0002] -12516 ; [.4C4E.0020.0002] -12517 ; [.4C4F.0020.0002] -12518 ; [.4C50.0020.0002] -12519 ; [.4C51.0020.0002] -1251A ; [.4C52.0020.0002] -1251B ; [.4C53.0020.0002] -1251C ; [.4C54.0020.0002] -1251D ; [.4C55.0020.0002] -1251E ; [.4C56.0020.0002] -1251F ; [.4C57.0020.0002] -12520 ; [.4C58.0020.0002] -12521 ; [.4C59.0020.0002] -12522 ; [.4C5A.0020.0002] -12523 ; [.4C5B.0020.0002] -12524 ; [.4C5C.0020.0002] -12525 ; [.4C5D.0020.0002] -12526 ; [.4C5E.0020.0002] -12527 ; [.4C5F.0020.0002] -12528 ; [.4C60.0020.0002] -12529 ; [.4C61.0020.0002] -1252A ; [.4C62.0020.0002] -1252B ; [.4C63.0020.0002] -1252C ; [.4C64.0020.0002] -1252D ; [.4C65.0020.0002] -1252E ; [.4C66.0020.0002] -1252F ; [.4C67.0020.0002] -12530 ; [.4C68.0020.0002] -12531 ; [.4C69.0020.0002] -12532 ; [.4C6A.0020.0002] -12533 ; [.4C6B.0020.0002] -12534 ; [.4C6C.0020.0002] -12535 ; [.4C6D.0020.0002] -12536 ; [.4C6E.0020.0002] -12537 ; [.4C6F.0020.0002] -12538 ; [.4C70.0020.0002] -12539 ; [.4C71.0020.0002] -1253A ; [.4C72.0020.0002] -1253B ; [.4C73.0020.0002] -1253C ; [.4C74.0020.0002] -1253D ; [.4C75.0020.0002] -1253E ; [.4C76.0020.0002] -1253F ; [.4C77.0020.0002] -12540 ; [.4C78.0020.0002] -12541 ; [.4C79.0020.0002] -12542 ; [.4C7A.0020.0002] -12543 ; [.4C7B.0020.0002] -13000 ; [.4C7C.0020.0002] -13001 ; [.4C7D.0020.0002] -13002 ; [.4C7E.0020.0002] -13003 ; [.4C7F.0020.0002] -13004 ; [.4C80.0020.0002] -13005 ; [.4C81.0020.0002] -13006 ; [.4C82.0020.0002] -13007 ; [.4C83.0020.0002] -13008 ; [.4C84.0020.0002] -13009 ; [.4C85.0020.0002] -1300A ; [.4C86.0020.0002] -1300B ; [.4C87.0020.0002] -1300C ; [.4C88.0020.0002] -1300D ; [.4C89.0020.0002] -1300E ; [.4C8A.0020.0002] -1300F ; [.4C8B.0020.0002] -13010 ; [.4C8C.0020.0002] -13011 ; [.4C8D.0020.0002] -13012 ; [.4C8E.0020.0002] -13013 ; [.4C8F.0020.0002] -13014 ; [.4C90.0020.0002] -13015 ; [.4C91.0020.0002] -13016 ; [.4C92.0020.0002] -13017 ; [.4C93.0020.0002] -13018 ; [.4C94.0020.0002] -13019 ; [.4C95.0020.0002] -1301A ; [.4C96.0020.0002] -1301B ; [.4C97.0020.0002] -1301C ; [.4C98.0020.0002] -1301D ; [.4C99.0020.0002] -1301E ; [.4C9A.0020.0002] -1301F ; [.4C9B.0020.0002] -13020 ; [.4C9C.0020.0002] -13021 ; [.4C9D.0020.0002] -13022 ; [.4C9E.0020.0002] -13023 ; [.4C9F.0020.0002] -13024 ; [.4CA0.0020.0002] -13025 ; [.4CA1.0020.0002] -13026 ; [.4CA2.0020.0002] -13027 ; [.4CA3.0020.0002] -13028 ; [.4CA4.0020.0002] -13029 ; [.4CA5.0020.0002] -1302A ; [.4CA6.0020.0002] -1302B ; [.4CA7.0020.0002] -1302C ; [.4CA8.0020.0002] -1302D ; [.4CA9.0020.0002] -1302E ; [.4CAA.0020.0002] -1302F ; [.4CAB.0020.0002] -13030 ; [.4CAC.0020.0002] -13031 ; [.4CAD.0020.0002] -13032 ; [.4CAE.0020.0002] -13033 ; [.4CAF.0020.0002] -13034 ; [.4CB0.0020.0002] -13035 ; [.4CB1.0020.0002] -13036 ; [.4CB2.0020.0002] -13037 ; [.4CB3.0020.0002] -13038 ; [.4CB4.0020.0002] -13039 ; [.4CB5.0020.0002] -1303A ; [.4CB6.0020.0002] -1303B ; [.4CB7.0020.0002] -1303C ; [.4CB8.0020.0002] -1303D ; [.4CB9.0020.0002] -1303E ; [.4CBA.0020.0002] -1303F ; [.4CBB.0020.0002] -13040 ; [.4CBC.0020.0002] -13041 ; [.4CBD.0020.0002] -13042 ; [.4CBE.0020.0002] -13043 ; [.4CBF.0020.0002] -13044 ; [.4CC0.0020.0002] -13045 ; [.4CC1.0020.0002] -13046 ; [.4CC2.0020.0002] -13047 ; [.4CC3.0020.0002] -13048 ; [.4CC4.0020.0002] -13049 ; [.4CC5.0020.0002] -1304A ; [.4CC6.0020.0002] -1304B ; [.4CC7.0020.0002] -1304C ; [.4CC8.0020.0002] -1304D ; [.4CC9.0020.0002] -1304E ; [.4CCA.0020.0002] -1304F ; [.4CCB.0020.0002] -13050 ; [.4CCC.0020.0002] -13051 ; [.4CCD.0020.0002] -13052 ; [.4CCE.0020.0002] -13053 ; [.4CCF.0020.0002] -13054 ; [.4CD0.0020.0002] -13055 ; [.4CD1.0020.0002] -13056 ; [.4CD2.0020.0002] -13057 ; [.4CD3.0020.0002] -13058 ; [.4CD4.0020.0002] -13059 ; [.4CD5.0020.0002] -1305A ; [.4CD6.0020.0002] -1305B ; [.4CD7.0020.0002] -1305C ; [.4CD8.0020.0002] -1305D ; [.4CD9.0020.0002] -1305E ; [.4CDA.0020.0002] -1305F ; [.4CDB.0020.0002] -13060 ; [.4CDC.0020.0002] -13061 ; [.4CDD.0020.0002] -13062 ; [.4CDE.0020.0002] -13063 ; [.4CDF.0020.0002] -13064 ; [.4CE0.0020.0002] -13065 ; [.4CE1.0020.0002] -13066 ; [.4CE2.0020.0002] -13067 ; [.4CE3.0020.0002] -13068 ; [.4CE4.0020.0002] -13069 ; [.4CE5.0020.0002] -1306A ; [.4CE6.0020.0002] -1306B ; [.4CE7.0020.0002] -1306C ; [.4CE8.0020.0002] -1306D ; [.4CE9.0020.0002] -1306E ; [.4CEA.0020.0002] -1306F ; [.4CEB.0020.0002] -13070 ; [.4CEC.0020.0002] -13071 ; [.4CED.0020.0002] -13072 ; [.4CEE.0020.0002] -13073 ; [.4CEF.0020.0002] -13074 ; [.4CF0.0020.0002] -13075 ; [.4CF1.0020.0002] -13076 ; [.4CF2.0020.0002] -13077 ; [.4CF3.0020.0002] -13078 ; [.4CF4.0020.0002] -13079 ; [.4CF5.0020.0002] -1307A ; [.4CF6.0020.0002] -1307B ; [.4CF7.0020.0002] -1307C ; [.4CF8.0020.0002] -1307D ; [.4CF9.0020.0002] -1307E ; [.4CFA.0020.0002] -1307F ; [.4CFB.0020.0002] -13080 ; [.4CFC.0020.0002] -13081 ; [.4CFD.0020.0002] -13082 ; [.4CFE.0020.0002] -13083 ; [.4CFF.0020.0002] -13084 ; [.4D00.0020.0002] -13085 ; [.4D01.0020.0002] -13086 ; [.4D02.0020.0002] -13087 ; [.4D03.0020.0002] -13088 ; [.4D04.0020.0002] -13089 ; [.4D05.0020.0002] -1308A ; [.4D06.0020.0002] -1308B ; [.4D07.0020.0002] -1308C ; [.4D08.0020.0002] -1308D ; [.4D09.0020.0002] -1308E ; [.4D0A.0020.0002] -1308F ; [.4D0B.0020.0002] -13090 ; [.4D0C.0020.0002] -13091 ; [.4D0D.0020.0002] -13092 ; [.4D0E.0020.0002] -13093 ; [.4D0F.0020.0002] -13094 ; [.4D10.0020.0002] -13095 ; [.4D11.0020.0002] -13096 ; [.4D12.0020.0002] -13097 ; [.4D13.0020.0002] -13098 ; [.4D14.0020.0002] -13099 ; [.4D15.0020.0002] -1309A ; [.4D16.0020.0002] -1309B ; [.4D17.0020.0002] -1309C ; [.4D18.0020.0002] -1309D ; [.4D19.0020.0002] -1309E ; [.4D1A.0020.0002] -1309F ; [.4D1B.0020.0002] -130A0 ; [.4D1C.0020.0002] -130A1 ; [.4D1D.0020.0002] -130A2 ; [.4D1E.0020.0002] -130A3 ; [.4D1F.0020.0002] -130A4 ; [.4D20.0020.0002] -130A5 ; [.4D21.0020.0002] -130A6 ; [.4D22.0020.0002] -130A7 ; [.4D23.0020.0002] -130A8 ; [.4D24.0020.0002] -130A9 ; [.4D25.0020.0002] -130AA ; [.4D26.0020.0002] -130AB ; [.4D27.0020.0002] -130AC ; [.4D28.0020.0002] -130AD ; [.4D29.0020.0002] -130AE ; [.4D2A.0020.0002] -130AF ; [.4D2B.0020.0002] -130B0 ; [.4D2C.0020.0002] -130B1 ; [.4D2D.0020.0002] -130B2 ; [.4D2E.0020.0002] -130B3 ; [.4D2F.0020.0002] -130B4 ; [.4D30.0020.0002] -130B5 ; [.4D31.0020.0002] -130B6 ; [.4D32.0020.0002] -130B7 ; [.4D33.0020.0002] -130B8 ; [.4D34.0020.0002] -130B9 ; [.4D35.0020.0002] -130BA ; [.4D36.0020.0002] -130BB ; [.4D37.0020.0002] -130BC ; [.4D38.0020.0002] -130BD ; [.4D39.0020.0002] -130BE ; [.4D3A.0020.0002] -130BF ; [.4D3B.0020.0002] -130C0 ; [.4D3C.0020.0002] -130C1 ; [.4D3D.0020.0002] -130C2 ; [.4D3E.0020.0002] -130C3 ; [.4D3F.0020.0002] -130C4 ; [.4D40.0020.0002] -130C5 ; [.4D41.0020.0002] -130C6 ; [.4D42.0020.0002] -130C7 ; [.4D43.0020.0002] -130C8 ; [.4D44.0020.0002] -130C9 ; [.4D45.0020.0002] -130CA ; [.4D46.0020.0002] -130CB ; [.4D47.0020.0002] -130CC ; [.4D48.0020.0002] -130CD ; [.4D49.0020.0002] -130CE ; [.4D4A.0020.0002] -130CF ; [.4D4B.0020.0002] -130D0 ; [.4D4C.0020.0002] -130D1 ; [.4D4D.0020.0002] -130D2 ; [.4D4E.0020.0002] -130D3 ; [.4D4F.0020.0002] -130D4 ; [.4D50.0020.0002] -130D5 ; [.4D51.0020.0002] -130D6 ; [.4D52.0020.0002] -130D7 ; [.4D53.0020.0002] -130D8 ; [.4D54.0020.0002] -130D9 ; [.4D55.0020.0002] -130DA ; [.4D56.0020.0002] -130DB ; [.4D57.0020.0002] -130DC ; [.4D58.0020.0002] -130DD ; [.4D59.0020.0002] -130DE ; [.4D5A.0020.0002] -130DF ; [.4D5B.0020.0002] -130E0 ; [.4D5C.0020.0002] -130E1 ; [.4D5D.0020.0002] -130E2 ; [.4D5E.0020.0002] -130E3 ; [.4D5F.0020.0002] -130E4 ; [.4D60.0020.0002] -130E5 ; [.4D61.0020.0002] -130E6 ; [.4D62.0020.0002] -130E7 ; [.4D63.0020.0002] -130E8 ; [.4D64.0020.0002] -130E9 ; [.4D65.0020.0002] -130EA ; [.4D66.0020.0002] -130EB ; [.4D67.0020.0002] -130EC ; [.4D68.0020.0002] -130ED ; [.4D69.0020.0002] -130EE ; [.4D6A.0020.0002] -130EF ; [.4D6B.0020.0002] -130F0 ; [.4D6C.0020.0002] -130F1 ; [.4D6D.0020.0002] -130F2 ; [.4D6E.0020.0002] -130F3 ; [.4D6F.0020.0002] -130F4 ; [.4D70.0020.0002] -130F5 ; [.4D71.0020.0002] -130F6 ; [.4D72.0020.0002] -130F7 ; [.4D73.0020.0002] -130F8 ; [.4D74.0020.0002] -130F9 ; [.4D75.0020.0002] -130FA ; [.4D76.0020.0002] -130FB ; [.4D77.0020.0002] -130FC ; [.4D78.0020.0002] -130FD ; [.4D79.0020.0002] -130FE ; [.4D7A.0020.0002] -130FF ; [.4D7B.0020.0002] -13100 ; [.4D7C.0020.0002] -13101 ; [.4D7D.0020.0002] -13102 ; [.4D7E.0020.0002] -13103 ; [.4D7F.0020.0002] -13104 ; [.4D80.0020.0002] -13105 ; [.4D81.0020.0002] -13106 ; [.4D82.0020.0002] -13107 ; [.4D83.0020.0002] -13108 ; [.4D84.0020.0002] -13109 ; [.4D85.0020.0002] -1310A ; [.4D86.0020.0002] -1310B ; [.4D87.0020.0002] -1310C ; [.4D88.0020.0002] -1310D ; [.4D89.0020.0002] -1310E ; [.4D8A.0020.0002] -1310F ; [.4D8B.0020.0002] -13110 ; [.4D8C.0020.0002] -13111 ; [.4D8D.0020.0002] -13112 ; [.4D8E.0020.0002] -13113 ; [.4D8F.0020.0002] -13114 ; [.4D90.0020.0002] -13115 ; [.4D91.0020.0002] -13116 ; [.4D92.0020.0002] -13117 ; [.4D93.0020.0002] -13118 ; [.4D94.0020.0002] -13119 ; [.4D95.0020.0002] -1311A ; [.4D96.0020.0002] -1311B ; [.4D97.0020.0002] -1311C ; [.4D98.0020.0002] -1311D ; [.4D99.0020.0002] -1311E ; [.4D9A.0020.0002] -1311F ; [.4D9B.0020.0002] -13120 ; [.4D9C.0020.0002] -13121 ; [.4D9D.0020.0002] -13122 ; [.4D9E.0020.0002] -13123 ; [.4D9F.0020.0002] -13124 ; [.4DA0.0020.0002] -13125 ; [.4DA1.0020.0002] -13126 ; [.4DA2.0020.0002] -13127 ; [.4DA3.0020.0002] -13128 ; [.4DA4.0020.0002] -13129 ; [.4DA5.0020.0002] -1312A ; [.4DA6.0020.0002] -1312B ; [.4DA7.0020.0002] -1312C ; [.4DA8.0020.0002] -1312D ; [.4DA9.0020.0002] -1312E ; [.4DAA.0020.0002] -1312F ; [.4DAB.0020.0002] -13130 ; [.4DAC.0020.0002] -13131 ; [.4DAD.0020.0002] -13132 ; [.4DAE.0020.0002] -13133 ; [.4DAF.0020.0002] -13134 ; [.4DB0.0020.0002] -13135 ; [.4DB1.0020.0002] -13136 ; [.4DB2.0020.0002] -13137 ; [.4DB3.0020.0002] -13138 ; [.4DB4.0020.0002] -13139 ; [.4DB5.0020.0002] -1313A ; [.4DB6.0020.0002] -1313B ; [.4DB7.0020.0002] -1313C ; [.4DB8.0020.0002] -1313D ; [.4DB9.0020.0002] -1313E ; [.4DBA.0020.0002] -1313F ; [.4DBB.0020.0002] -13140 ; [.4DBC.0020.0002] -13141 ; [.4DBD.0020.0002] -13142 ; [.4DBE.0020.0002] -13143 ; [.4DBF.0020.0002] -13144 ; [.4DC0.0020.0002] -13145 ; [.4DC1.0020.0002] -13146 ; [.4DC2.0020.0002] -13147 ; [.4DC3.0020.0002] -13148 ; [.4DC4.0020.0002] -13149 ; [.4DC5.0020.0002] -1314A ; [.4DC6.0020.0002] -1314B ; [.4DC7.0020.0002] -1314C ; [.4DC8.0020.0002] -1314D ; [.4DC9.0020.0002] -1314E ; [.4DCA.0020.0002] -1314F ; [.4DCB.0020.0002] -13150 ; [.4DCC.0020.0002] -13151 ; [.4DCD.0020.0002] -13152 ; [.4DCE.0020.0002] -13153 ; [.4DCF.0020.0002] -13154 ; [.4DD0.0020.0002] -13155 ; [.4DD1.0020.0002] -13156 ; [.4DD2.0020.0002] -13157 ; [.4DD3.0020.0002] -13158 ; [.4DD4.0020.0002] -13159 ; [.4DD5.0020.0002] -1315A ; [.4DD6.0020.0002] -1315B ; [.4DD7.0020.0002] -1315C ; [.4DD8.0020.0002] -1315D ; [.4DD9.0020.0002] -1315E ; [.4DDA.0020.0002] -1315F ; [.4DDB.0020.0002] -13160 ; [.4DDC.0020.0002] -13161 ; [.4DDD.0020.0002] -13162 ; [.4DDE.0020.0002] -13163 ; [.4DDF.0020.0002] -13164 ; [.4DE0.0020.0002] -13165 ; [.4DE1.0020.0002] -13166 ; [.4DE2.0020.0002] -13167 ; [.4DE3.0020.0002] -13168 ; [.4DE4.0020.0002] -13169 ; [.4DE5.0020.0002] -1316A ; [.4DE6.0020.0002] -1316B ; [.4DE7.0020.0002] -1316C ; [.4DE8.0020.0002] -1316D ; [.4DE9.0020.0002] -1316E ; [.4DEA.0020.0002] -1316F ; [.4DEB.0020.0002] -13170 ; [.4DEC.0020.0002] -13171 ; [.4DED.0020.0002] -13172 ; [.4DEE.0020.0002] -13173 ; [.4DEF.0020.0002] -13174 ; [.4DF0.0020.0002] -13175 ; [.4DF1.0020.0002] -13176 ; [.4DF2.0020.0002] -13177 ; [.4DF3.0020.0002] -13178 ; [.4DF4.0020.0002] -13179 ; [.4DF5.0020.0002] -1317A ; [.4DF6.0020.0002] -1317B ; [.4DF7.0020.0002] -1317C ; [.4DF8.0020.0002] -1317D ; [.4DF9.0020.0002] -1317E ; [.4DFA.0020.0002] -1317F ; [.4DFB.0020.0002] -13180 ; [.4DFC.0020.0002] -13181 ; [.4DFD.0020.0002] -13182 ; [.4DFE.0020.0002] -13183 ; [.4DFF.0020.0002] -13184 ; [.4E00.0020.0002] -13185 ; [.4E01.0020.0002] -13186 ; [.4E02.0020.0002] -13187 ; [.4E03.0020.0002] -13188 ; [.4E04.0020.0002] -13189 ; [.4E05.0020.0002] -1318A ; [.4E06.0020.0002] -1318B ; [.4E07.0020.0002] -1318C ; [.4E08.0020.0002] -1318D ; [.4E09.0020.0002] -1318E ; [.4E0A.0020.0002] -1318F ; [.4E0B.0020.0002] -13190 ; [.4E0C.0020.0002] -13191 ; [.4E0D.0020.0002] -13192 ; [.4E0E.0020.0002] -13193 ; [.4E0F.0020.0002] -13194 ; [.4E10.0020.0002] -13195 ; [.4E11.0020.0002] -13196 ; [.4E12.0020.0002] -13197 ; [.4E13.0020.0002] -13198 ; [.4E14.0020.0002] -13199 ; [.4E15.0020.0002] -1319A ; [.4E16.0020.0002] -1319B ; [.4E17.0020.0002] -1319C ; [.4E18.0020.0002] -1319D ; [.4E19.0020.0002] -1319E ; [.4E1A.0020.0002] -1319F ; [.4E1B.0020.0002] -131A0 ; [.4E1C.0020.0002] -131A1 ; [.4E1D.0020.0002] -131A2 ; [.4E1E.0020.0002] -131A3 ; [.4E1F.0020.0002] -131A4 ; [.4E20.0020.0002] -131A5 ; [.4E21.0020.0002] -131A6 ; [.4E22.0020.0002] -131A7 ; [.4E23.0020.0002] -131A8 ; [.4E24.0020.0002] -131A9 ; [.4E25.0020.0002] -131AA ; [.4E26.0020.0002] -131AB ; [.4E27.0020.0002] -131AC ; [.4E28.0020.0002] -131AD ; [.4E29.0020.0002] -131AE ; [.4E2A.0020.0002] -131AF ; [.4E2B.0020.0002] -131B0 ; [.4E2C.0020.0002] -131B1 ; [.4E2D.0020.0002] -131B2 ; [.4E2E.0020.0002] -131B3 ; [.4E2F.0020.0002] -131B4 ; [.4E30.0020.0002] -131B5 ; [.4E31.0020.0002] -131B6 ; [.4E32.0020.0002] -131B7 ; [.4E33.0020.0002] -131B8 ; [.4E34.0020.0002] -131B9 ; [.4E35.0020.0002] -131BA ; [.4E36.0020.0002] -131BB ; [.4E37.0020.0002] -131BC ; [.4E38.0020.0002] -131BD ; [.4E39.0020.0002] -131BE ; [.4E3A.0020.0002] -131BF ; [.4E3B.0020.0002] -131C0 ; [.4E3C.0020.0002] -131C1 ; [.4E3D.0020.0002] -131C2 ; [.4E3E.0020.0002] -131C3 ; [.4E3F.0020.0002] -131C4 ; [.4E40.0020.0002] -131C5 ; [.4E41.0020.0002] -131C6 ; [.4E42.0020.0002] -131C7 ; [.4E43.0020.0002] -131C8 ; [.4E44.0020.0002] -131C9 ; [.4E45.0020.0002] -131CA ; [.4E46.0020.0002] -131CB ; [.4E47.0020.0002] -131CC ; [.4E48.0020.0002] -131CD ; [.4E49.0020.0002] -131CE ; [.4E4A.0020.0002] -131CF ; [.4E4B.0020.0002] -131D0 ; [.4E4C.0020.0002] -131D1 ; [.4E4D.0020.0002] -131D2 ; [.4E4E.0020.0002] -131D3 ; [.4E4F.0020.0002] -131D4 ; [.4E50.0020.0002] -131D5 ; [.4E51.0020.0002] -131D6 ; [.4E52.0020.0002] -131D7 ; [.4E53.0020.0002] -131D8 ; [.4E54.0020.0002] -131D9 ; [.4E55.0020.0002] -131DA ; [.4E56.0020.0002] -131DB ; [.4E57.0020.0002] -131DC ; [.4E58.0020.0002] -131DD ; [.4E59.0020.0002] -131DE ; [.4E5A.0020.0002] -131DF ; [.4E5B.0020.0002] -131E0 ; [.4E5C.0020.0002] -131E1 ; [.4E5D.0020.0002] -131E2 ; [.4E5E.0020.0002] -131E3 ; [.4E5F.0020.0002] -131E4 ; [.4E60.0020.0002] -131E5 ; [.4E61.0020.0002] -131E6 ; [.4E62.0020.0002] -131E7 ; [.4E63.0020.0002] -131E8 ; [.4E64.0020.0002] -131E9 ; [.4E65.0020.0002] -131EA ; [.4E66.0020.0002] -131EB ; [.4E67.0020.0002] -131EC ; [.4E68.0020.0002] -131ED ; [.4E69.0020.0002] -131EE ; [.4E6A.0020.0002] -131EF ; [.4E6B.0020.0002] -131F0 ; [.4E6C.0020.0002] -131F1 ; [.4E6D.0020.0002] -131F2 ; [.4E6E.0020.0002] -131F3 ; [.4E6F.0020.0002] -131F4 ; [.4E70.0020.0002] -131F5 ; [.4E71.0020.0002] -131F6 ; [.4E72.0020.0002] -131F7 ; [.4E73.0020.0002] -131F8 ; [.4E74.0020.0002] -131F9 ; [.4E75.0020.0002] -131FA ; [.4E76.0020.0002] -131FB ; [.4E77.0020.0002] -131FC ; [.4E78.0020.0002] -131FD ; [.4E79.0020.0002] -131FE ; [.4E7A.0020.0002] -131FF ; [.4E7B.0020.0002] -13200 ; [.4E7C.0020.0002] -13201 ; [.4E7D.0020.0002] -13202 ; [.4E7E.0020.0002] -13203 ; [.4E7F.0020.0002] -13204 ; [.4E80.0020.0002] -13205 ; [.4E81.0020.0002] -13206 ; [.4E82.0020.0002] -13207 ; [.4E83.0020.0002] -13208 ; [.4E84.0020.0002] -13209 ; [.4E85.0020.0002] -1320A ; [.4E86.0020.0002] -1320B ; [.4E87.0020.0002] -1320C ; [.4E88.0020.0002] -1320D ; [.4E89.0020.0002] -1320E ; [.4E8A.0020.0002] -1320F ; [.4E8B.0020.0002] -13210 ; [.4E8C.0020.0002] -13211 ; [.4E8D.0020.0002] -13212 ; [.4E8E.0020.0002] -13213 ; [.4E8F.0020.0002] -13214 ; [.4E90.0020.0002] -13215 ; [.4E91.0020.0002] -13216 ; [.4E92.0020.0002] -13217 ; [.4E93.0020.0002] -13218 ; [.4E94.0020.0002] -13219 ; [.4E95.0020.0002] -1321A ; [.4E96.0020.0002] -1321B ; [.4E97.0020.0002] -1321C ; [.4E98.0020.0002] -1321D ; [.4E99.0020.0002] -1321E ; [.4E9A.0020.0002] -1321F ; [.4E9B.0020.0002] -13220 ; [.4E9C.0020.0002] -13221 ; [.4E9D.0020.0002] -13222 ; [.4E9E.0020.0002] -13223 ; [.4E9F.0020.0002] -13224 ; [.4EA0.0020.0002] -13225 ; [.4EA1.0020.0002] -13226 ; [.4EA2.0020.0002] -13227 ; [.4EA3.0020.0002] -13228 ; [.4EA4.0020.0002] -13229 ; [.4EA5.0020.0002] -1322A ; [.4EA6.0020.0002] -1322B ; [.4EA7.0020.0002] -1322C ; [.4EA8.0020.0002] -1322D ; [.4EA9.0020.0002] -1322E ; [.4EAA.0020.0002] -1322F ; [.4EAB.0020.0002] -13230 ; [.4EAC.0020.0002] -13231 ; [.4EAD.0020.0002] -13232 ; [.4EAE.0020.0002] -13233 ; [.4EAF.0020.0002] -13234 ; [.4EB0.0020.0002] -13235 ; [.4EB1.0020.0002] -13236 ; [.4EB2.0020.0002] -13237 ; [.4EB3.0020.0002] -13238 ; [.4EB4.0020.0002] -13239 ; [.4EB5.0020.0002] -1323A ; [.4EB6.0020.0002] -1323B ; [.4EB7.0020.0002] -1323C ; [.4EB8.0020.0002] -1323D ; [.4EB9.0020.0002] -1323E ; [.4EBA.0020.0002] -1323F ; [.4EBB.0020.0002] -13240 ; [.4EBC.0020.0002] -13241 ; [.4EBD.0020.0002] -13242 ; [.4EBE.0020.0002] -13243 ; [.4EBF.0020.0002] -13244 ; [.4EC0.0020.0002] -13245 ; [.4EC1.0020.0002] -13246 ; [.4EC2.0020.0002] -13247 ; [.4EC3.0020.0002] -13248 ; [.4EC4.0020.0002] -13249 ; [.4EC5.0020.0002] -1324A ; [.4EC6.0020.0002] -1324B ; [.4EC7.0020.0002] -1324C ; [.4EC8.0020.0002] -1324D ; [.4EC9.0020.0002] -1324E ; [.4ECA.0020.0002] -1324F ; [.4ECB.0020.0002] -13250 ; [.4ECC.0020.0002] -13251 ; [.4ECD.0020.0002] -13252 ; [.4ECE.0020.0002] -13253 ; [.4ECF.0020.0002] -13254 ; [.4ED0.0020.0002] -13255 ; [.4ED1.0020.0002] -13256 ; [.4ED2.0020.0002] -13257 ; [.4ED3.0020.0002] -13258 ; [.4ED4.0020.0002] -13259 ; [.4ED5.0020.0002] -1325A ; [.4ED6.0020.0002] -1325B ; [.4ED7.0020.0002] -1325C ; [.4ED8.0020.0002] -1325D ; [.4ED9.0020.0002] -1325E ; [.4EDA.0020.0002] -1325F ; [.4EDB.0020.0002] -13260 ; [.4EDC.0020.0002] -13261 ; [.4EDD.0020.0002] -13262 ; [.4EDE.0020.0002] -13263 ; [.4EDF.0020.0002] -13264 ; [.4EE0.0020.0002] -13265 ; [.4EE1.0020.0002] -13266 ; [.4EE2.0020.0002] -13267 ; [.4EE3.0020.0002] -13268 ; [.4EE4.0020.0002] -13269 ; [.4EE5.0020.0002] -1326A ; [.4EE6.0020.0002] -1326B ; [.4EE7.0020.0002] -1326C ; [.4EE8.0020.0002] -1326D ; [.4EE9.0020.0002] -1326E ; [.4EEA.0020.0002] -1326F ; [.4EEB.0020.0002] -13270 ; [.4EEC.0020.0002] -13271 ; [.4EED.0020.0002] -13272 ; [.4EEE.0020.0002] -13273 ; [.4EEF.0020.0002] -13274 ; [.4EF0.0020.0002] -13275 ; [.4EF1.0020.0002] -13276 ; [.4EF2.0020.0002] -13277 ; [.4EF3.0020.0002] -13278 ; [.4EF4.0020.0002] -13279 ; [.4EF5.0020.0002] -1327A ; [.4EF6.0020.0002] -1327B ; [.4EF7.0020.0002] -1327C ; [.4EF8.0020.0002] -1327D ; [.4EF9.0020.0002] -1327E ; [.4EFA.0020.0002] -1327F ; [.4EFB.0020.0002] -13280 ; [.4EFC.0020.0002] -13281 ; [.4EFD.0020.0002] -13282 ; [.4EFE.0020.0002] -13283 ; [.4EFF.0020.0002] -13284 ; [.4F00.0020.0002] -13285 ; [.4F01.0020.0002] -13286 ; [.4F02.0020.0002] -13287 ; [.4F03.0020.0002] -13288 ; [.4F04.0020.0002] -13289 ; [.4F05.0020.0002] -1328A ; [.4F06.0020.0002] -1328B ; [.4F07.0020.0002] -1328C ; [.4F08.0020.0002] -1328D ; [.4F09.0020.0002] -1328E ; [.4F0A.0020.0002] -1328F ; [.4F0B.0020.0002] -13290 ; [.4F0C.0020.0002] -13291 ; [.4F0D.0020.0002] -13292 ; [.4F0E.0020.0002] -13293 ; [.4F0F.0020.0002] -13294 ; [.4F10.0020.0002] -13295 ; [.4F11.0020.0002] -13296 ; [.4F12.0020.0002] -13297 ; [.4F13.0020.0002] -13298 ; [.4F14.0020.0002] -13299 ; [.4F15.0020.0002] -1329A ; [.4F16.0020.0002] -1329B ; [.4F17.0020.0002] -1329C ; [.4F18.0020.0002] -1329D ; [.4F19.0020.0002] -1329E ; [.4F1A.0020.0002] -1329F ; [.4F1B.0020.0002] -132A0 ; [.4F1C.0020.0002] -132A1 ; [.4F1D.0020.0002] -132A2 ; [.4F1E.0020.0002] -132A3 ; [.4F1F.0020.0002] -132A4 ; [.4F20.0020.0002] -132A5 ; [.4F21.0020.0002] -132A6 ; [.4F22.0020.0002] -132A7 ; [.4F23.0020.0002] -132A8 ; [.4F24.0020.0002] -132A9 ; [.4F25.0020.0002] -132AA ; [.4F26.0020.0002] -132AB ; [.4F27.0020.0002] -132AC ; [.4F28.0020.0002] -132AD ; [.4F29.0020.0002] -132AE ; [.4F2A.0020.0002] -132AF ; [.4F2B.0020.0002] -132B0 ; [.4F2C.0020.0002] -132B1 ; [.4F2D.0020.0002] -132B2 ; [.4F2E.0020.0002] -132B3 ; [.4F2F.0020.0002] -132B4 ; [.4F30.0020.0002] -132B5 ; [.4F31.0020.0002] -132B6 ; [.4F32.0020.0002] -132B7 ; [.4F33.0020.0002] -132B8 ; [.4F34.0020.0002] -132B9 ; [.4F35.0020.0002] -132BA ; [.4F36.0020.0002] -132BB ; [.4F37.0020.0002] -132BC ; [.4F38.0020.0002] -132BD ; [.4F39.0020.0002] -132BE ; [.4F3A.0020.0002] -132BF ; [.4F3B.0020.0002] -132C0 ; [.4F3C.0020.0002] -132C1 ; [.4F3D.0020.0002] -132C2 ; [.4F3E.0020.0002] -132C3 ; [.4F3F.0020.0002] -132C4 ; [.4F40.0020.0002] -132C5 ; [.4F41.0020.0002] -132C6 ; [.4F42.0020.0002] -132C7 ; [.4F43.0020.0002] -132C8 ; [.4F44.0020.0002] -132C9 ; [.4F45.0020.0002] -132CA ; [.4F46.0020.0002] -132CB ; [.4F47.0020.0002] -132CC ; [.4F48.0020.0002] -132CD ; [.4F49.0020.0002] -132CE ; [.4F4A.0020.0002] -132CF ; [.4F4B.0020.0002] -132D0 ; [.4F4C.0020.0002] -132D1 ; [.4F4D.0020.0002] -132D2 ; [.4F4E.0020.0002] -132D3 ; [.4F4F.0020.0002] -132D4 ; [.4F50.0020.0002] -132D5 ; [.4F51.0020.0002] -132D6 ; [.4F52.0020.0002] -132D7 ; [.4F53.0020.0002] -132D8 ; [.4F54.0020.0002] -132D9 ; [.4F55.0020.0002] -132DA ; [.4F56.0020.0002] -132DB ; [.4F57.0020.0002] -132DC ; [.4F58.0020.0002] -132DD ; [.4F59.0020.0002] -132DE ; [.4F5A.0020.0002] -132DF ; [.4F5B.0020.0002] -132E0 ; [.4F5C.0020.0002] -132E1 ; [.4F5D.0020.0002] -132E2 ; [.4F5E.0020.0002] -132E3 ; [.4F5F.0020.0002] -132E4 ; [.4F60.0020.0002] -132E5 ; [.4F61.0020.0002] -132E6 ; [.4F62.0020.0002] -132E7 ; [.4F63.0020.0002] -132E8 ; [.4F64.0020.0002] -132E9 ; [.4F65.0020.0002] -132EA ; [.4F66.0020.0002] -132EB ; [.4F67.0020.0002] -132EC ; [.4F68.0020.0002] -132ED ; [.4F69.0020.0002] -132EE ; [.4F6A.0020.0002] -132EF ; [.4F6B.0020.0002] -132F0 ; [.4F6C.0020.0002] -132F1 ; [.4F6D.0020.0002] -132F2 ; [.4F6E.0020.0002] -132F3 ; [.4F6F.0020.0002] -132F4 ; [.4F70.0020.0002] -132F5 ; [.4F71.0020.0002] -132F6 ; [.4F72.0020.0002] -132F7 ; [.4F73.0020.0002] -132F8 ; [.4F74.0020.0002] -132F9 ; [.4F75.0020.0002] -132FA ; [.4F76.0020.0002] -132FB ; [.4F77.0020.0002] -132FC ; [.4F78.0020.0002] -132FD ; [.4F79.0020.0002] -132FE ; [.4F7A.0020.0002] -132FF ; [.4F7B.0020.0002] -13300 ; [.4F7C.0020.0002] -13301 ; [.4F7D.0020.0002] -13302 ; [.4F7E.0020.0002] -13303 ; [.4F7F.0020.0002] -13304 ; [.4F80.0020.0002] -13305 ; [.4F81.0020.0002] -13306 ; [.4F82.0020.0002] -13307 ; [.4F83.0020.0002] -13308 ; [.4F84.0020.0002] -13309 ; [.4F85.0020.0002] -1330A ; [.4F86.0020.0002] -1330B ; [.4F87.0020.0002] -1330C ; [.4F88.0020.0002] -1330D ; [.4F89.0020.0002] -1330E ; [.4F8A.0020.0002] -1330F ; [.4F8B.0020.0002] -13310 ; [.4F8C.0020.0002] -13311 ; [.4F8D.0020.0002] -13312 ; [.4F8E.0020.0002] -13313 ; [.4F8F.0020.0002] -13314 ; [.4F90.0020.0002] -13315 ; [.4F91.0020.0002] -13316 ; [.4F92.0020.0002] -13317 ; [.4F93.0020.0002] -13318 ; [.4F94.0020.0002] -13319 ; [.4F95.0020.0002] -1331A ; [.4F96.0020.0002] -1331B ; [.4F97.0020.0002] -1331C ; [.4F98.0020.0002] -1331D ; [.4F99.0020.0002] -1331E ; [.4F9A.0020.0002] -1331F ; [.4F9B.0020.0002] -13320 ; [.4F9C.0020.0002] -13321 ; [.4F9D.0020.0002] -13322 ; [.4F9E.0020.0002] -13323 ; [.4F9F.0020.0002] -13324 ; [.4FA0.0020.0002] -13325 ; [.4FA1.0020.0002] -13326 ; [.4FA2.0020.0002] -13327 ; [.4FA3.0020.0002] -13328 ; [.4FA4.0020.0002] -13329 ; [.4FA5.0020.0002] -1332A ; [.4FA6.0020.0002] -1332B ; [.4FA7.0020.0002] -1332C ; [.4FA8.0020.0002] -1332D ; [.4FA9.0020.0002] -1332E ; [.4FAA.0020.0002] -1332F ; [.4FAB.0020.0002] -13330 ; [.4FAC.0020.0002] -13331 ; [.4FAD.0020.0002] -13332 ; [.4FAE.0020.0002] -13333 ; [.4FAF.0020.0002] -13334 ; [.4FB0.0020.0002] -13335 ; [.4FB1.0020.0002] -13336 ; [.4FB2.0020.0002] -13337 ; [.4FB3.0020.0002] -13338 ; [.4FB4.0020.0002] -13339 ; [.4FB5.0020.0002] -1333A ; [.4FB6.0020.0002] -1333B ; [.4FB7.0020.0002] -1333C ; [.4FB8.0020.0002] -1333D ; [.4FB9.0020.0002] -1333E ; [.4FBA.0020.0002] -1333F ; [.4FBB.0020.0002] -13340 ; [.4FBC.0020.0002] -13341 ; [.4FBD.0020.0002] -13342 ; [.4FBE.0020.0002] -13343 ; [.4FBF.0020.0002] -13344 ; [.4FC0.0020.0002] -13345 ; [.4FC1.0020.0002] -13346 ; [.4FC2.0020.0002] -13347 ; [.4FC3.0020.0002] -13348 ; [.4FC4.0020.0002] -13349 ; [.4FC5.0020.0002] -1334A ; [.4FC6.0020.0002] -1334B ; [.4FC7.0020.0002] -1334C ; [.4FC8.0020.0002] -1334D ; [.4FC9.0020.0002] -1334E ; [.4FCA.0020.0002] -1334F ; [.4FCB.0020.0002] -13350 ; [.4FCC.0020.0002] -13351 ; [.4FCD.0020.0002] -13352 ; [.4FCE.0020.0002] -13353 ; [.4FCF.0020.0002] -13354 ; [.4FD0.0020.0002] -13355 ; [.4FD1.0020.0002] -13356 ; [.4FD2.0020.0002] -13357 ; [.4FD3.0020.0002] -13358 ; [.4FD4.0020.0002] -13359 ; [.4FD5.0020.0002] -1335A ; [.4FD6.0020.0002] -1335B ; [.4FD7.0020.0002] -1335C ; [.4FD8.0020.0002] -1335D ; [.4FD9.0020.0002] -1335E ; [.4FDA.0020.0002] -1335F ; [.4FDB.0020.0002] -13360 ; [.4FDC.0020.0002] -13361 ; [.4FDD.0020.0002] -13362 ; [.4FDE.0020.0002] -13363 ; [.4FDF.0020.0002] -13364 ; [.4FE0.0020.0002] -13365 ; [.4FE1.0020.0002] -13366 ; [.4FE2.0020.0002] -13367 ; [.4FE3.0020.0002] -13368 ; [.4FE4.0020.0002] -13369 ; [.4FE5.0020.0002] -1336A ; [.4FE6.0020.0002] -1336B ; [.4FE7.0020.0002] -1336C ; [.4FE8.0020.0002] -1336D ; [.4FE9.0020.0002] -1336E ; [.4FEA.0020.0002] -1336F ; [.4FEB.0020.0002] -13370 ; [.4FEC.0020.0002] -13371 ; [.4FED.0020.0002] -13372 ; [.4FEE.0020.0002] -13373 ; [.4FEF.0020.0002] -13374 ; [.4FF0.0020.0002] -13375 ; [.4FF1.0020.0002] -13376 ; [.4FF2.0020.0002] -13377 ; [.4FF3.0020.0002] -13378 ; [.4FF4.0020.0002] -13379 ; [.4FF5.0020.0002] -1337A ; [.4FF6.0020.0002] -1337B ; [.4FF7.0020.0002] -1337C ; [.4FF8.0020.0002] -1337D ; [.4FF9.0020.0002] -1337E ; [.4FFA.0020.0002] -1337F ; [.4FFB.0020.0002] -13380 ; [.4FFC.0020.0002] -13381 ; [.4FFD.0020.0002] -13382 ; [.4FFE.0020.0002] -13383 ; [.4FFF.0020.0002] -13384 ; [.5000.0020.0002] -13385 ; [.5001.0020.0002] -13386 ; [.5002.0020.0002] -13387 ; [.5003.0020.0002] -13388 ; [.5004.0020.0002] -13389 ; [.5005.0020.0002] -1338A ; [.5006.0020.0002] -1338B ; [.5007.0020.0002] -1338C ; [.5008.0020.0002] -1338D ; [.5009.0020.0002] -1338E ; [.500A.0020.0002] -1338F ; [.500B.0020.0002] -13390 ; [.500C.0020.0002] -13391 ; [.500D.0020.0002] -13392 ; [.500E.0020.0002] -13393 ; [.500F.0020.0002] -13394 ; [.5010.0020.0002] -13395 ; [.5011.0020.0002] -13396 ; [.5012.0020.0002] -13397 ; [.5013.0020.0002] -13398 ; [.5014.0020.0002] -13399 ; [.5015.0020.0002] -1339A ; [.5016.0020.0002] -1339B ; [.5017.0020.0002] -1339C ; [.5018.0020.0002] -1339D ; [.5019.0020.0002] -1339E ; [.501A.0020.0002] -1339F ; [.501B.0020.0002] -133A0 ; [.501C.0020.0002] -133A1 ; [.501D.0020.0002] -133A2 ; [.501E.0020.0002] -133A3 ; [.501F.0020.0002] -133A4 ; [.5020.0020.0002] -133A5 ; [.5021.0020.0002] -133A6 ; [.5022.0020.0002] -133A7 ; [.5023.0020.0002] -133A8 ; [.5024.0020.0002] -133A9 ; [.5025.0020.0002] -133AA ; [.5026.0020.0002] -133AB ; [.5027.0020.0002] -133AC ; [.5028.0020.0002] -133AD ; [.5029.0020.0002] -133AE ; [.502A.0020.0002] -133AF ; [.502B.0020.0002] -133B0 ; [.502C.0020.0002] -133B1 ; [.502D.0020.0002] -133B2 ; [.502E.0020.0002] -133B3 ; [.502F.0020.0002] -133B4 ; [.5030.0020.0002] -133B5 ; [.5031.0020.0002] -133B6 ; [.5032.0020.0002] -133B7 ; [.5033.0020.0002] -133B8 ; [.5034.0020.0002] -133B9 ; [.5035.0020.0002] -133BA ; [.5036.0020.0002] -133BB ; [.5037.0020.0002] -133BC ; [.5038.0020.0002] -133BD ; [.5039.0020.0002] -133BE ; [.503A.0020.0002] -133BF ; [.503B.0020.0002] -133C0 ; [.503C.0020.0002] -133C1 ; [.503D.0020.0002] -133C2 ; [.503E.0020.0002] -133C3 ; [.503F.0020.0002] -133C4 ; [.5040.0020.0002] -133C5 ; [.5041.0020.0002] -133C6 ; [.5042.0020.0002] -133C7 ; [.5043.0020.0002] -133C8 ; [.5044.0020.0002] -133C9 ; [.5045.0020.0002] -133CA ; [.5046.0020.0002] -133CB ; [.5047.0020.0002] -133CC ; [.5048.0020.0002] -133CD ; [.5049.0020.0002] -133CE ; [.504A.0020.0002] -133CF ; [.504B.0020.0002] -133D0 ; [.504C.0020.0002] -133D1 ; [.504D.0020.0002] -133D2 ; [.504E.0020.0002] -133D3 ; [.504F.0020.0002] -133D4 ; [.5050.0020.0002] -133D5 ; [.5051.0020.0002] -133D6 ; [.5052.0020.0002] -133D7 ; [.5053.0020.0002] -133D8 ; [.5054.0020.0002] -133D9 ; [.5055.0020.0002] -133DA ; [.5056.0020.0002] -133DB ; [.5057.0020.0002] -133DC ; [.5058.0020.0002] -133DD ; [.5059.0020.0002] -133DE ; [.505A.0020.0002] -133DF ; [.505B.0020.0002] -133E0 ; [.505C.0020.0002] -133E1 ; [.505D.0020.0002] -133E2 ; [.505E.0020.0002] -133E3 ; [.505F.0020.0002] -133E4 ; [.5060.0020.0002] -133E5 ; [.5061.0020.0002] -133E6 ; [.5062.0020.0002] -133E7 ; [.5063.0020.0002] -133E8 ; [.5064.0020.0002] -133E9 ; [.5065.0020.0002] -133EA ; [.5066.0020.0002] -133EB ; [.5067.0020.0002] -133EC ; [.5068.0020.0002] -133ED ; [.5069.0020.0002] -133EE ; [.506A.0020.0002] -133EF ; [.506B.0020.0002] -133F0 ; [.506C.0020.0002] -133F1 ; [.506D.0020.0002] -133F2 ; [.506E.0020.0002] -133F3 ; [.506F.0020.0002] -133F4 ; [.5070.0020.0002] -133F5 ; [.5071.0020.0002] -133F6 ; [.5072.0020.0002] -133F7 ; [.5073.0020.0002] -133F8 ; [.5074.0020.0002] -133F9 ; [.5075.0020.0002] -133FA ; [.5076.0020.0002] -133FB ; [.5077.0020.0002] -133FC ; [.5078.0020.0002] -133FD ; [.5079.0020.0002] -133FE ; [.507A.0020.0002] -133FF ; [.507B.0020.0002] -13400 ; [.507C.0020.0002] -13401 ; [.507D.0020.0002] -13402 ; [.507E.0020.0002] -13403 ; [.507F.0020.0002] -13404 ; [.5080.0020.0002] -13405 ; [.5081.0020.0002] -13406 ; [.5082.0020.0002] -13407 ; [.5083.0020.0002] -13408 ; [.5084.0020.0002] -13409 ; [.5085.0020.0002] -1340A ; [.5086.0020.0002] -1340B ; [.5087.0020.0002] -1340C ; [.5088.0020.0002] -1340D ; [.5089.0020.0002] -1340E ; [.508A.0020.0002] -1340F ; [.508B.0020.0002] -13410 ; [.508C.0020.0002] -13411 ; [.508D.0020.0002] -13412 ; [.508E.0020.0002] -13413 ; [.508F.0020.0002] -13414 ; [.5090.0020.0002] -13415 ; [.5091.0020.0002] -13416 ; [.5092.0020.0002] -13417 ; [.5093.0020.0002] -13418 ; [.5094.0020.0002] -13419 ; [.5095.0020.0002] -1341A ; [.5096.0020.0002] -1341B ; [.5097.0020.0002] -1341C ; [.5098.0020.0002] -1341D ; [.5099.0020.0002] -1341E ; [.509A.0020.0002] -1341F ; [.509B.0020.0002] -13420 ; [.509C.0020.0002] -13421 ; [.509D.0020.0002] -13422 ; [.509E.0020.0002] -13423 ; [.509F.0020.0002] -13424 ; [.50A0.0020.0002] -13425 ; [.50A1.0020.0002] -13426 ; [.50A2.0020.0002] -13427 ; [.50A3.0020.0002] -13428 ; [.50A4.0020.0002] -13429 ; [.50A5.0020.0002] -1342A ; [.50A6.0020.0002] -1342B ; [.50A7.0020.0002] -1342C ; [.50A8.0020.0002] -1342D ; [.50A9.0020.0002] -1342E ; [.50AA.0020.0002] -109A0 ; [.50AB.0020.0002] -10980 ; [.50AB.0020.0004][.0000.010B.0004] -109A1 ; [.50AC.0020.0002] -10981 ; [.50AC.0020.0004][.0000.010B.0004] -109A2 ; [.50AD.0020.0002] -10982 ; [.50AD.0020.0004][.0000.010B.0004] -109A3 ; [.50AE.0020.0002] -10983 ; [.50AE.0020.0004][.0000.010B.0004] -109A4 ; [.50AF.0020.0002] -10984 ; [.50AF.0020.0004][.0000.010B.0004] -109A5 ; [.50B0.0020.0002] -10985 ; [.50B0.0020.0004][.0000.010B.0004] -109A6 ; [.50B1.0020.0002] -10986 ; [.50B1.0020.0004][.0000.010B.0004] -10987 ; [.50B1.0020.0004][.0000.010C.0004] -109A7 ; [.50B2.0020.0002] -10988 ; [.50B2.0020.0004][.0000.010B.0004] -109A8 ; [.50B3.0020.0002] -10989 ; [.50B3.0020.0004][.0000.010B.0004] -109A9 ; [.50B4.0020.0002] -1098A ; [.50B4.0020.0004][.0000.010B.0004] -1098B ; [.50B4.0020.0004][.0000.010C.0004] -109AA ; [.50B5.0020.0002] -1098C ; [.50B5.0020.0004][.0000.010B.0004] -1098D ; [.50B5.0020.0004][.0000.010C.0004] -109AB ; [.50B6.0020.0002] -1098E ; [.50B6.0020.0004][.0000.010B.0004] -1098F ; [.50B6.0020.0004][.0000.010C.0004] -109AC ; [.50B7.0020.0002] -10990 ; [.50B7.0020.0004][.0000.010B.0004] -109AD ; [.50B8.0020.0002] -10991 ; [.50B8.0020.0004][.0000.010B.0004] -109AE ; [.50B9.0020.0002] -10992 ; [.50B9.0020.0004][.0000.010B.0004] -109AF ; [.50BA.0020.0002] -109B0 ; [.50BA.0020.0004][.0000.010B.0004] -10993 ; [.50BA.0020.0004][.0000.010C.0004] -10994 ; [.50BA.0020.0004][.0000.010D.0004] -109B1 ; [.50BB.0020.0002] -10995 ; [.50BB.0020.0004][.0000.010B.0004] -109B2 ; [.50BC.0020.0002] -10996 ; [.50BC.0020.0004][.0000.010B.0004] -109B3 ; [.50BD.0020.0002] -10997 ; [.50BD.0020.0004][.0000.010B.0004] -109B4 ; [.50BE.0020.0002] -10998 ; [.50BE.0020.0004][.0000.010B.0004] -10999 ; [.50BE.0020.0004][.0000.010C.0004] -109B5 ; [.50BF.0020.0002] -1099A ; [.50BF.0020.0004][.0000.010B.0004] -1099B ; [.50BF.0020.0004][.0000.010C.0004] -109B6 ; [.50C0.0020.0002] -1099C ; [.50C0.0020.0004][.0000.010B.0004] -109B7 ; [.50C1.0020.0002] -1099D ; [.50C1.0020.0004][.0000.010B.0004] -109BE ; [.50C2.0020.0002] -109BF ; [.50C3.0020.0002] -1099E ; [.50C4.0020.0002] -1099F ; [.50C5.0020.0002] -14400 ; [.50C6.0020.0002] -14401 ; [.50C7.0020.0002] -14402 ; [.50C8.0020.0002] -14403 ; [.50C9.0020.0002] -14404 ; [.50CA.0020.0002] -14405 ; [.50CB.0020.0002] -14406 ; [.50CC.0020.0002] -14407 ; [.50CD.0020.0002] -14408 ; [.50CE.0020.0002] -14409 ; [.50CF.0020.0002] -1440A ; [.50D0.0020.0002] -1440B ; [.50D1.0020.0002] -1440C ; [.50D2.0020.0002] -1440D ; [.50D3.0020.0002] -1440E ; [.50D4.0020.0002] -1440F ; [.50D5.0020.0002] -14410 ; [.50D6.0020.0002] -14411 ; [.50D7.0020.0002] -14412 ; [.50D8.0020.0002] -14413 ; [.50D9.0020.0002] -14414 ; [.50DA.0020.0002] -14415 ; [.50DB.0020.0002] -14416 ; [.50DC.0020.0002] -14417 ; [.50DD.0020.0002] -14418 ; [.50DE.0020.0002] -14419 ; [.50DF.0020.0002] -1441A ; [.50E0.0020.0002] -1441B ; [.50E1.0020.0002] -1441C ; [.50E2.0020.0002] -1441D ; [.50E3.0020.0002] -1441E ; [.50E4.0020.0002] -1441F ; [.50E5.0020.0002] -14420 ; [.50E6.0020.0002] -14421 ; [.50E7.0020.0002] -14422 ; [.50E8.0020.0002] -14423 ; [.50E9.0020.0002] -14424 ; [.50EA.0020.0002] -14425 ; [.50EB.0020.0002] -14426 ; [.50EC.0020.0002] -14427 ; [.50ED.0020.0002] -14428 ; [.50EE.0020.0002] -14429 ; [.50EF.0020.0002] -1442A ; [.50F0.0020.0002] -1442B ; [.50F1.0020.0002] -1442C ; [.50F2.0020.0002] -1442D ; [.50F3.0020.0002] -1442E ; [.50F4.0020.0002] -1442F ; [.50F5.0020.0002] -14430 ; [.50F6.0020.0002] -14431 ; [.50F7.0020.0002] -14432 ; [.50F8.0020.0002] -14433 ; [.50F9.0020.0002] -14434 ; [.50FA.0020.0002] -14435 ; [.50FB.0020.0002] -14436 ; [.50FC.0020.0002] -14437 ; [.50FD.0020.0002] -14438 ; [.50FE.0020.0002] -14439 ; [.50FF.0020.0002] -1443A ; [.5100.0020.0002] -1443B ; [.5101.0020.0002] -1443C ; [.5102.0020.0002] -1443D ; [.5103.0020.0002] -1443E ; [.5104.0020.0002] -1443F ; [.5105.0020.0002] -14440 ; [.5106.0020.0002] -14441 ; [.5107.0020.0002] -14442 ; [.5108.0020.0002] -14443 ; [.5109.0020.0002] -14444 ; [.510A.0020.0002] -14445 ; [.510B.0020.0002] -14446 ; [.510C.0020.0002] -14447 ; [.510D.0020.0002] -14448 ; [.510E.0020.0002] -14449 ; [.510F.0020.0002] -1444A ; [.5110.0020.0002] -1444B ; [.5111.0020.0002] -1444C ; [.5112.0020.0002] -1444D ; [.5113.0020.0002] -1444E ; [.5114.0020.0002] -1444F ; [.5115.0020.0002] -14450 ; [.5116.0020.0002] -14451 ; [.5117.0020.0002] -14452 ; [.5118.0020.0002] -14453 ; [.5119.0020.0002] -14454 ; [.511A.0020.0002] -14455 ; [.511B.0020.0002] -14456 ; [.511C.0020.0002] -14457 ; [.511D.0020.0002] -14458 ; [.511E.0020.0002] -14459 ; [.511F.0020.0002] -1445A ; [.5120.0020.0002] -1445B ; [.5121.0020.0002] -1445C ; [.5122.0020.0002] -1445D ; [.5123.0020.0002] -1445E ; [.5124.0020.0002] -1445F ; [.5125.0020.0002] -14460 ; [.5126.0020.0002] -14461 ; [.5127.0020.0002] -14462 ; [.5128.0020.0002] -14463 ; [.5129.0020.0002] -14464 ; [.512A.0020.0002] -14465 ; [.512B.0020.0002] -14466 ; [.512C.0020.0002] -14467 ; [.512D.0020.0002] -14468 ; [.512E.0020.0002] -14469 ; [.512F.0020.0002] -1446A ; [.5130.0020.0002] -1446B ; [.5131.0020.0002] -1446C ; [.5132.0020.0002] -1446D ; [.5133.0020.0002] -1446E ; [.5134.0020.0002] -1446F ; [.5135.0020.0002] -14470 ; [.5136.0020.0002] -14471 ; [.5137.0020.0002] -14472 ; [.5138.0020.0002] -14473 ; [.5139.0020.0002] -14474 ; [.513A.0020.0002] -14475 ; [.513B.0020.0002] -14476 ; [.513C.0020.0002] -14477 ; [.513D.0020.0002] -14478 ; [.513E.0020.0002] -14479 ; [.513F.0020.0002] -1447A ; [.5140.0020.0002] -1447B ; [.5141.0020.0002] -1447C ; [.5142.0020.0002] -1447D ; [.5143.0020.0002] -1447E ; [.5144.0020.0002] -1447F ; [.5145.0020.0002] -14480 ; [.5146.0020.0002] -14481 ; [.5147.0020.0002] -14482 ; [.5148.0020.0002] -14483 ; [.5149.0020.0002] -14484 ; [.514A.0020.0002] -14485 ; [.514B.0020.0002] -14486 ; [.514C.0020.0002] -14487 ; [.514D.0020.0002] -14488 ; [.514E.0020.0002] -14489 ; [.514F.0020.0002] -1448A ; [.5150.0020.0002] -1448B ; [.5151.0020.0002] -1448C ; [.5152.0020.0002] -1448D ; [.5153.0020.0002] -1448E ; [.5154.0020.0002] -1448F ; [.5155.0020.0002] -14490 ; [.5156.0020.0002] -14491 ; [.5157.0020.0002] -14492 ; [.5158.0020.0002] -14493 ; [.5159.0020.0002] -14494 ; [.515A.0020.0002] -14495 ; [.515B.0020.0002] -14496 ; [.515C.0020.0002] -14497 ; [.515D.0020.0002] -14498 ; [.515E.0020.0002] -14499 ; [.515F.0020.0002] -1449A ; [.5160.0020.0002] -1449B ; [.5161.0020.0002] -1449C ; [.5162.0020.0002] -1449D ; [.5163.0020.0002] -1449E ; [.5164.0020.0002] -1449F ; [.5165.0020.0002] -144A0 ; [.5166.0020.0002] -144A1 ; [.5167.0020.0002] -144A2 ; [.5168.0020.0002] -144A3 ; [.5169.0020.0002] -144A4 ; [.516A.0020.0002] -144A5 ; [.516B.0020.0002] -144A6 ; [.516C.0020.0002] -144A7 ; [.516D.0020.0002] -144A8 ; [.516E.0020.0002] -144A9 ; [.516F.0020.0002] -144AA ; [.5170.0020.0002] -144AB ; [.5171.0020.0002] -144AC ; [.5172.0020.0002] -144AD ; [.5173.0020.0002] -144AE ; [.5174.0020.0002] -144AF ; [.5175.0020.0002] -144B0 ; [.5176.0020.0002] -144B1 ; [.5177.0020.0002] -144B2 ; [.5178.0020.0002] -144B3 ; [.5179.0020.0002] -144B4 ; [.517A.0020.0002] -144B5 ; [.517B.0020.0002] -144B6 ; [.517C.0020.0002] -144B7 ; [.517D.0020.0002] -144B8 ; [.517E.0020.0002] -144B9 ; [.517F.0020.0002] -144BA ; [.5180.0020.0002] -144BB ; [.5181.0020.0002] -144BC ; [.5182.0020.0002] -144BD ; [.5183.0020.0002] -144BE ; [.5184.0020.0002] -144BF ; [.5185.0020.0002] -144C0 ; [.5186.0020.0002] -144C1 ; [.5187.0020.0002] -144C2 ; [.5188.0020.0002] -144C3 ; [.5189.0020.0002] -144C4 ; [.518A.0020.0002] -144C5 ; [.518B.0020.0002] -144C6 ; [.518C.0020.0002] -144C7 ; [.518D.0020.0002] -144C8 ; [.518E.0020.0002] -144C9 ; [.518F.0020.0002] -144CA ; [.5190.0020.0002] -144CB ; [.5191.0020.0002] -144CC ; [.5192.0020.0002] -144CD ; [.5193.0020.0002] -144CE ; [.5194.0020.0002] -144CF ; [.5195.0020.0002] -144D0 ; [.5196.0020.0002] -144D1 ; [.5197.0020.0002] -144D2 ; [.5198.0020.0002] -144D3 ; [.5199.0020.0002] -144D4 ; [.519A.0020.0002] -144D5 ; [.519B.0020.0002] -144D6 ; [.519C.0020.0002] -144D7 ; [.519D.0020.0002] -144D8 ; [.519E.0020.0002] -144D9 ; [.519F.0020.0002] -144DA ; [.51A0.0020.0002] -144DB ; [.51A1.0020.0002] -144DC ; [.51A2.0020.0002] -144DD ; [.51A3.0020.0002] -144DE ; [.51A4.0020.0002] -144DF ; [.51A5.0020.0002] -144E0 ; [.51A6.0020.0002] -144E1 ; [.51A7.0020.0002] -144E2 ; [.51A8.0020.0002] -144E3 ; [.51A9.0020.0002] -144E4 ; [.51AA.0020.0002] -144E5 ; [.51AB.0020.0002] -144E6 ; [.51AC.0020.0002] -144E7 ; [.51AD.0020.0002] -144E8 ; [.51AE.0020.0002] -144E9 ; [.51AF.0020.0002] -144EA ; [.51B0.0020.0002] -144EB ; [.51B1.0020.0002] -144EC ; [.51B2.0020.0002] -144ED ; [.51B3.0020.0002] -144EE ; [.51B4.0020.0002] -144EF ; [.51B5.0020.0002] -144F0 ; [.51B6.0020.0002] -144F1 ; [.51B7.0020.0002] -144F2 ; [.51B8.0020.0002] -144F3 ; [.51B9.0020.0002] -144F4 ; [.51BA.0020.0002] -144F5 ; [.51BB.0020.0002] -144F6 ; [.51BC.0020.0002] -144F7 ; [.51BD.0020.0002] -144F8 ; [.51BE.0020.0002] -144F9 ; [.51BF.0020.0002] -144FA ; [.51C0.0020.0002] -144FB ; [.51C1.0020.0002] -144FC ; [.51C2.0020.0002] -144FD ; [.51C3.0020.0002] -144FE ; [.51C4.0020.0002] -144FF ; [.51C5.0020.0002] -14500 ; [.51C6.0020.0002] -14501 ; [.51C7.0020.0002] -14502 ; [.51C8.0020.0002] -14503 ; [.51C9.0020.0002] -14504 ; [.51CA.0020.0002] -14505 ; [.51CB.0020.0002] -14506 ; [.51CC.0020.0002] -14507 ; [.51CD.0020.0002] -14508 ; [.51CE.0020.0002] -14509 ; [.51CF.0020.0002] -1450A ; [.51D0.0020.0002] -1450B ; [.51D1.0020.0002] -1450C ; [.51D2.0020.0002] -1450D ; [.51D3.0020.0002] -1450E ; [.51D4.0020.0002] -1450F ; [.51D5.0020.0002] -14510 ; [.51D6.0020.0002] -14511 ; [.51D7.0020.0002] -14512 ; [.51D8.0020.0002] -14513 ; [.51D9.0020.0002] -14514 ; [.51DA.0020.0002] -14515 ; [.51DB.0020.0002] -14516 ; [.51DC.0020.0002] -14517 ; [.51DD.0020.0002] -14518 ; [.51DE.0020.0002] -14519 ; [.51DF.0020.0002] -1451A ; [.51E0.0020.0002] -1451B ; [.51E1.0020.0002] -1451C ; [.51E2.0020.0002] -1451D ; [.51E3.0020.0002] -1451E ; [.51E4.0020.0002] -1451F ; [.51E5.0020.0002] -14520 ; [.51E6.0020.0002] -14521 ; [.51E7.0020.0002] -14522 ; [.51E8.0020.0002] -14523 ; [.51E9.0020.0002] -14524 ; [.51EA.0020.0002] -14525 ; [.51EB.0020.0002] -14526 ; [.51EC.0020.0002] -14527 ; [.51ED.0020.0002] -14528 ; [.51EE.0020.0002] -14529 ; [.51EF.0020.0002] -1452A ; [.51F0.0020.0002] -1452B ; [.51F1.0020.0002] -1452C ; [.51F2.0020.0002] -1452D ; [.51F3.0020.0002] -1452E ; [.51F4.0020.0002] -1452F ; [.51F5.0020.0002] -14530 ; [.51F6.0020.0002] -14531 ; [.51F7.0020.0002] -14532 ; [.51F8.0020.0002] -14533 ; [.51F9.0020.0002] -14534 ; [.51FA.0020.0002] -14535 ; [.51FB.0020.0002] -14536 ; [.51FC.0020.0002] -14537 ; [.51FD.0020.0002] -14538 ; [.51FE.0020.0002] -14539 ; [.51FF.0020.0002] -1453A ; [.5200.0020.0002] -1453B ; [.5201.0020.0002] -1453C ; [.5202.0020.0002] -1453D ; [.5203.0020.0002] -1453E ; [.5204.0020.0002] -1453F ; [.5205.0020.0002] -14540 ; [.5206.0020.0002] -14541 ; [.5207.0020.0002] -14542 ; [.5208.0020.0002] -14543 ; [.5209.0020.0002] -14544 ; [.520A.0020.0002] -14545 ; [.520B.0020.0002] -14546 ; [.520C.0020.0002] -14547 ; [.520D.0020.0002] -14548 ; [.520E.0020.0002] -14549 ; [.520F.0020.0002] -1454A ; [.5210.0020.0002] -1454B ; [.5211.0020.0002] -1454C ; [.5212.0020.0002] -1454D ; [.5213.0020.0002] -1454E ; [.5214.0020.0002] -1454F ; [.5215.0020.0002] -14550 ; [.5216.0020.0002] -14551 ; [.5217.0020.0002] -14552 ; [.5218.0020.0002] -14553 ; [.5219.0020.0002] -14554 ; [.521A.0020.0002] -14555 ; [.521B.0020.0002] -14556 ; [.521C.0020.0002] -14557 ; [.521D.0020.0002] -14558 ; [.521E.0020.0002] -14559 ; [.521F.0020.0002] -1455A ; [.5220.0020.0002] -1455B ; [.5221.0020.0002] -1455C ; [.5222.0020.0002] -1455D ; [.5223.0020.0002] -1455E ; [.5224.0020.0002] -1455F ; [.5225.0020.0002] -14560 ; [.5226.0020.0002] -14561 ; [.5227.0020.0002] -14562 ; [.5228.0020.0002] -14563 ; [.5229.0020.0002] -14564 ; [.522A.0020.0002] -14565 ; [.522B.0020.0002] -14566 ; [.522C.0020.0002] -14567 ; [.522D.0020.0002] -14568 ; [.522E.0020.0002] -14569 ; [.522F.0020.0002] -1456A ; [.5230.0020.0002] -1456B ; [.5231.0020.0002] -1456C ; [.5232.0020.0002] -1456D ; [.5233.0020.0002] -1456E ; [.5234.0020.0002] -1456F ; [.5235.0020.0002] -14570 ; [.5236.0020.0002] -14571 ; [.5237.0020.0002] -14572 ; [.5238.0020.0002] -14573 ; [.5239.0020.0002] -14574 ; [.523A.0020.0002] -14575 ; [.523B.0020.0002] -14576 ; [.523C.0020.0002] -14577 ; [.523D.0020.0002] -14578 ; [.523E.0020.0002] -14579 ; [.523F.0020.0002] -1457A ; [.5240.0020.0002] -1457B ; [.5241.0020.0002] -1457C ; [.5242.0020.0002] -1457D ; [.5243.0020.0002] -1457E ; [.5244.0020.0002] -1457F ; [.5245.0020.0002] -14580 ; [.5246.0020.0002] -14581 ; [.5247.0020.0002] -14582 ; [.5248.0020.0002] -14583 ; [.5249.0020.0002] -14584 ; [.524A.0020.0002] -14585 ; [.524B.0020.0002] -14586 ; [.524C.0020.0002] -14587 ; [.524D.0020.0002] -14588 ; [.524E.0020.0002] -14589 ; [.524F.0020.0002] -1458A ; [.5250.0020.0002] -1458B ; [.5251.0020.0002] -1458C ; [.5252.0020.0002] -1458D ; [.5253.0020.0002] -1458E ; [.5254.0020.0002] -1458F ; [.5255.0020.0002] -14590 ; [.5256.0020.0002] -14591 ; [.5257.0020.0002] -14592 ; [.5258.0020.0002] -14593 ; [.5259.0020.0002] -14594 ; [.525A.0020.0002] -14595 ; [.525B.0020.0002] -14596 ; [.525C.0020.0002] -14597 ; [.525D.0020.0002] -14598 ; [.525E.0020.0002] -14599 ; [.525F.0020.0002] -1459A ; [.5260.0020.0002] -1459B ; [.5261.0020.0002] -1459C ; [.5262.0020.0002] -1459D ; [.5263.0020.0002] -1459E ; [.5264.0020.0002] -1459F ; [.5265.0020.0002] -145A0 ; [.5266.0020.0002] -145A1 ; [.5267.0020.0002] -145A2 ; [.5268.0020.0002] -145A3 ; [.5269.0020.0002] -145A4 ; [.526A.0020.0002] -145A5 ; [.526B.0020.0002] -145A6 ; [.526C.0020.0002] -145A7 ; [.526D.0020.0002] -145A8 ; [.526E.0020.0002] -145A9 ; [.526F.0020.0002] -145AA ; [.5270.0020.0002] -145AB ; [.5271.0020.0002] -145AC ; [.5272.0020.0002] -145AD ; [.5273.0020.0002] -145AE ; [.5274.0020.0002] -145AF ; [.5275.0020.0002] -145B0 ; [.5276.0020.0002] -145B1 ; [.5277.0020.0002] -145B2 ; [.5278.0020.0002] -145B3 ; [.5279.0020.0002] -145B4 ; [.527A.0020.0002] -145B5 ; [.527B.0020.0002] -145B6 ; [.527C.0020.0002] -145B7 ; [.527D.0020.0002] -145B8 ; [.527E.0020.0002] -145B9 ; [.527F.0020.0002] -145BA ; [.5280.0020.0002] -145BB ; [.5281.0020.0002] -145BC ; [.5282.0020.0002] -145BD ; [.5283.0020.0002] -145BE ; [.5284.0020.0002] -145BF ; [.5285.0020.0002] -145C0 ; [.5286.0020.0002] -145C1 ; [.5287.0020.0002] -145C2 ; [.5288.0020.0002] -145C3 ; [.5289.0020.0002] -145C4 ; [.528A.0020.0002] -145C5 ; [.528B.0020.0002] -145C6 ; [.528C.0020.0002] -145C7 ; [.528D.0020.0002] -145C8 ; [.528E.0020.0002] -145C9 ; [.528F.0020.0002] -145CA ; [.5290.0020.0002] -145CB ; [.5291.0020.0002] -145CC ; [.5292.0020.0002] -145CD ; [.5293.0020.0002] -145CE ; [.5294.0020.0002] -145CF ; [.5295.0020.0002] -145D0 ; [.5296.0020.0002] -145D1 ; [.5297.0020.0002] -145D2 ; [.5298.0020.0002] -145D3 ; [.5299.0020.0002] -145D4 ; [.529A.0020.0002] -145D5 ; [.529B.0020.0002] -145D6 ; [.529C.0020.0002] -145D7 ; [.529D.0020.0002] -145D8 ; [.529E.0020.0002] -145D9 ; [.529F.0020.0002] -145DA ; [.52A0.0020.0002] -145DB ; [.52A1.0020.0002] -145DC ; [.52A2.0020.0002] -145DD ; [.52A3.0020.0002] -145DE ; [.52A4.0020.0002] -145DF ; [.52A5.0020.0002] -145E0 ; [.52A6.0020.0002] -145E1 ; [.52A7.0020.0002] -145E2 ; [.52A8.0020.0002] -145E3 ; [.52A9.0020.0002] -145E4 ; [.52AA.0020.0002] -145E5 ; [.52AB.0020.0002] -145E6 ; [.52AC.0020.0002] -145E7 ; [.52AD.0020.0002] -145E8 ; [.52AE.0020.0002] -145E9 ; [.52AF.0020.0002] -145EA ; [.52B0.0020.0002] -145EB ; [.52B1.0020.0002] -145EC ; [.52B2.0020.0002] -145ED ; [.52B3.0020.0002] -145EE ; [.52B4.0020.0002] -145EF ; [.52B5.0020.0002] -145F0 ; [.52B6.0020.0002] -145F1 ; [.52B7.0020.0002] -145F2 ; [.52B8.0020.0002] -145F3 ; [.52B9.0020.0002] -145F4 ; [.52BA.0020.0002] -145F5 ; [.52BB.0020.0002] -145F6 ; [.52BC.0020.0002] -145F7 ; [.52BD.0020.0002] -145F8 ; [.52BE.0020.0002] -145F9 ; [.52BF.0020.0002] -145FA ; [.52C0.0020.0002] -145FB ; [.52C1.0020.0002] -145FC ; [.52C2.0020.0002] -145FD ; [.52C3.0020.0002] -145FE ; [.52C4.0020.0002] -145FF ; [.52C5.0020.0002] -14600 ; [.52C6.0020.0002] -14601 ; [.52C7.0020.0002] -14602 ; [.52C8.0020.0002] -14603 ; [.52C9.0020.0002] -14604 ; [.52CA.0020.0002] -14605 ; [.52CB.0020.0002] -14606 ; [.52CC.0020.0002] -14607 ; [.52CD.0020.0002] -14608 ; [.52CE.0020.0002] -14609 ; [.52CF.0020.0002] -1460A ; [.52D0.0020.0002] -1460B ; [.52D1.0020.0002] -1460C ; [.52D2.0020.0002] -1460D ; [.52D3.0020.0002] -1460E ; [.52D4.0020.0002] -1460F ; [.52D5.0020.0002] -14610 ; [.52D6.0020.0002] -14611 ; [.52D7.0020.0002] -14612 ; [.52D8.0020.0002] -14613 ; [.52D9.0020.0002] -14614 ; [.52DA.0020.0002] -14615 ; [.52DB.0020.0002] -14616 ; [.52DC.0020.0002] -14617 ; [.52DD.0020.0002] -14618 ; [.52DE.0020.0002] -14619 ; [.52DF.0020.0002] -1461A ; [.52E0.0020.0002] -1461B ; [.52E1.0020.0002] -1461C ; [.52E2.0020.0002] -1461D ; [.52E3.0020.0002] -1461E ; [.52E4.0020.0002] -1461F ; [.52E5.0020.0002] -14620 ; [.52E6.0020.0002] -14621 ; [.52E7.0020.0002] -14622 ; [.52E8.0020.0002] -14623 ; [.52E9.0020.0002] -14624 ; [.52EA.0020.0002] -14625 ; [.52EB.0020.0002] -14626 ; [.52EC.0020.0002] -14627 ; [.52ED.0020.0002] -14628 ; [.52EE.0020.0002] -14629 ; [.52EF.0020.0002] -1462A ; [.52F0.0020.0002] -1462B ; [.52F1.0020.0002] -1462C ; [.52F2.0020.0002] -1462D ; [.52F3.0020.0002] -1462E ; [.52F4.0020.0002] -1462F ; [.52F5.0020.0002] -14630 ; [.52F6.0020.0002] -14631 ; [.52F7.0020.0002] -14632 ; [.52F8.0020.0002] -14633 ; [.52F9.0020.0002] -14634 ; [.52FA.0020.0002] -14635 ; [.52FB.0020.0002] -14636 ; [.52FC.0020.0002] -14637 ; [.52FD.0020.0002] -14638 ; [.52FE.0020.0002] -14639 ; [.52FF.0020.0002] -1463A ; [.5300.0020.0002] -1463B ; [.5301.0020.0002] -1463C ; [.5302.0020.0002] -1463D ; [.5303.0020.0002] -1463E ; [.5304.0020.0002] -1463F ; [.5305.0020.0002] -14640 ; [.5306.0020.0002] -14641 ; [.5307.0020.0002] -14642 ; [.5308.0020.0002] -14643 ; [.5309.0020.0002] -14644 ; [.530A.0020.0002] -14645 ; [.530B.0020.0002] -14646 ; [.530C.0020.0002] -2F00 ; [.FB40.0020.0004][.CE00.0000.0000] -3220 ; [*0310.0020.0004][.FB40.0020.0004][.CE00.0000.0000][*0311.0020.0004] -3280 ; [.FB40.0020.0006][.CE00.0000.0000] -3192 ; [.FB40.0020.0014][.CE00.0000.0000] -1F229 ; [.FB40.0020.001C][.CE00.0000.0000] -319C ; [.FB40.0020.0014][.CE01.0000.0000] -3226 ; [*0310.0020.0004][.FB40.0020.0004][.CE03.0000.0000][*0311.0020.0004] -3286 ; [.FB40.0020.0006][.CE03.0000.0000] -3222 ; [*0310.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0311.0020.0004] -1F241 ; [*0372.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0373.0020.0004] -3282 ; [.FB40.0020.0006][.CE09.0000.0000] -3194 ; [.FB40.0020.0014][.CE09.0000.0000] -1F22A ; [.FB40.0020.001C][.CE09.0000.0000] -32A4 ; [.FB40.0020.0006][.CE0A.0000.0000] -3196 ; [.FB40.0020.0014][.CE0A.0000.0000] -32A6 ; [.FB40.0020.0006][.CE0B.0000.0000] -3198 ; [.FB40.0020.0014][.CE0B.0000.0000] -F967 ; [.FB40.0020.0002][.CE0D.0000.0000] -319B ; [.FB40.0020.0014][.CE19.0000.0000] -FA70 ; [.FB40.0020.0002][.CE26.0000.0000] -2F01 ; [.FB40.0020.0004][.CE28.0000.0000] -2EA6 ; [.FB40.0020.0004][.CE2C.0000.0000] -32A5 ; [.FB40.0020.0006][.CE2D.0000.0000] -3197 ; [.FB40.0020.0014][.CE2D.0000.0000] -1F22D ; [.FB40.0020.001C][.CE2D.0000.0000] -F905 ; [.FB40.0020.0002][.CE32.0000.0000] -2F02 ; [.FB40.0020.0004][.CE36.0000.0000] -2E80 ; [.FB40.0020.0004][.CE36.0000.0000][.0000.010B.0004] -2F801 ; [.FB40.0020.0002][.CE38.0000.0000] -F95E ; [.FB40.0020.0002][.CE39.0000.0000] -2F800 ; [.FB40.0020.0002][.CE3D.0000.0000] -2F03 ; [.FB40.0020.0004][.CE3F.0000.0000] -2F802 ; [.FB40.0020.0002][.CE41.0000.0000] -2F04 ; [.FB40.0020.0004][.CE59.0000.0000] -319A ; [.FB40.0020.0014][.CE59.0000.0000] -2E84 ; [.FB40.0020.0004][.CE59.0000.0000][.0000.010B.0004] -2E83 ; [.FB40.0020.0004][.CE5A.0000.0000] -2E82 ; [.FB40.0020.0004][.CE5B.0000.0000] -3228 ; [*0310.0020.0004][.FB40.0020.0004][.CE5D.0000.0000][*0311.0020.0004] -3288 ; [.FB40.0020.0006][.CE5D.0000.0000] -F91B ; [.FB40.0020.0002][.CE82.0000.0000] -2F05 ; [.FB40.0020.0004][.CE85.0000.0000] -F9BA ; [.FB40.0020.0002][.CE86.0000.0000] -2F06 ; [.FB40.0020.0004][.CE8C.0000.0000] -3221 ; [*0310.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0311.0020.0004] -1F242 ; [*0372.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0373.0020.0004] -3281 ; [.FB40.0020.0006][.CE8C.0000.0000] -3193 ; [.FB40.0020.0014][.CE8C.0000.0000] -1F214 ; [.FB40.0020.001C][.CE8C.0000.0000] -3224 ; [*0310.0020.0004][.FB40.0020.0004][.CE94.0000.0000][*0311.0020.0004] -3284 ; [.FB40.0020.0006][.CE94.0000.0000] -2F07 ; [.FB40.0020.0004][.CEA0.0000.0000] -1F218 ; [.FB40.0020.001C][.CEA4.0000.0000] -F977 ; [.FB40.0020.0002][.CEAE.0000.0000] -2F08 ; [.FB40.0020.0004][.CEBA.0000.0000] -319F ; [.FB40.0020.0014][.CEBA.0000.0000] -2E85 ; [.FB40.0020.0004][.CEBB.0000.0000] -F9FD ; [.FB40.0020.0002][.CEC0.0000.0000] -2F819 ; [.FB40.0020.0002][.CECC.0000.0000] -3239 ; [*0310.0020.0004][.FB40.0020.0004][.CEE3.0000.0000][*0311.0020.0004] -F9A8 ; [.FB40.0020.0002][.CEE4.0000.0000] -323D ; [*0310.0020.0004][.FB40.0020.0004][.CF01.0000.0000][*0311.0020.0004] -32AD ; [.FB40.0020.0006][.CF01.0000.0000] -3241 ; [*0310.0020.0004][.FB40.0020.0004][.CF11.0000.0000][*0311.0020.0004] -32A1 ; [.FB40.0020.0006][.CF11.0000.0000] -2F804 ; [.FB40.0020.0002][.CF60.0000.0000] -FA73 ; [.FB40.0020.0002][.CF80.0000.0000] -F92D ; [.FB40.0020.0002][.CF86.0000.0000] -F9B5 ; [.FB40.0020.0002][.CF8B.0000.0000] -FA30 ; [.FB40.0020.0002][.CFAE.0000.0000] -2F805 ; [.FB40.0020.0002][.CFAE.0000.0000] -2F806 ; [.FB40.0020.0002][.CFBB.0000.0000] -F965 ; [.FB40.0020.0002][.CFBF.0000.0000] -2F807 ; [.FB40.0020.0002][.D002.0000.0000] -F9D4 ; [.FB40.0020.0002][.D02B.0000.0000] -2F808 ; [.FB40.0020.0002][.D07A.0000.0000] -2F809 ; [.FB40.0020.0002][.D099.0000.0000] -2F80B ; [.FB40.0020.0002][.D0CF.0000.0000] -F9BB ; [.FB40.0020.0002][.D0DA.0000.0000] -FA31 ; [.FB40.0020.0002][.D0E7.0000.0000] -2F80A ; [.FB40.0020.0002][.D0E7.0000.0000] -329D ; [.FB40.0020.0006][.D12A.0000.0000] -2F09 ; [.FB40.0020.0004][.D13F.0000.0000] -FA0C ; [.FB40.0020.0002][.D140.0000.0000] -FA74 ; [.FB40.0020.0002][.D145.0000.0000] -FA32 ; [.FB40.0020.0002][.D14D.0000.0000] -2F80E ; [.FB40.0020.0002][.D14D.0000.0000] -2F80F ; [.FB40.0020.0002][.D154.0000.0000] -2F810 ; [.FB40.0020.0002][.D164.0000.0000] -2F0A ; [.FB40.0020.0004][.D165.0000.0000] -2F814 ; [.FB40.0020.0002][.D167.0000.0000] -FA72 ; [.FB40.0020.0002][.D168.0000.0000] -F978 ; [.FB40.0020.0002][.D169.0000.0000] -2F0B ; [.FB40.0020.0004][.D16B.0000.0000] -3227 ; [*0310.0020.0004][.FB40.0020.0004][.D16B.0000.0000][*0311.0020.0004] -3287 ; [.FB40.0020.0006][.D16B.0000.0000] -F9D1 ; [.FB40.0020.0002][.D16D.0000.0000] -3225 ; [*0310.0020.0004][.FB40.0020.0004][.D16D.0000.0000][*0311.0020.0004] -3285 ; [.FB40.0020.0006][.D16D.0000.0000] -2F811 ; [.FB40.0020.0002][.D177.0000.0000] -FA75 ; [.FB40.0020.0002][.D180.0000.0000] -2F0C ; [.FB40.0020.0004][.D182.0000.0000] -2E86 ; [.FB40.0020.0004][.D182.0000.0000][.0000.010B.0004] -2F815 ; [.FB40.0020.0002][.D18D.0000.0000] -1F21E ; [.FB40.0020.001C][.D18D.0000.0000] -2F8D2 ; [.FB40.0020.0002][.D192.0000.0000] -2F8D3 ; [.FB40.0020.0002][.D195.0000.0000] -2F0D ; [.FB40.0020.0004][.D196.0000.0000] -2F817 ; [.FB40.0020.0002][.D197.0000.0000] -32A2 ; [.FB40.0020.0006][.D199.0000.0000] -2F818 ; [.FB40.0020.0002][.D1A4.0000.0000] -2F0E ; [.FB40.0020.0004][.D1AB.0000.0000] -2F81A ; [.FB40.0020.0002][.D1AC.0000.0000] -FA71 ; [.FB40.0020.0002][.D1B5.0000.0000] -2F81B ; [.FB40.0020.0002][.D1B5.0000.0000] -F92E ; [.FB40.0020.0002][.D1B7.0000.0000] -F979 ; [.FB40.0020.0002][.D1C9.0000.0000] -F955 ; [.FB40.0020.0002][.D1CC.0000.0000] -F954 ; [.FB40.0020.0002][.D1DC.0000.0000] -FA15 ; [.FB40.0020.0002][.D1DE.0000.0000] -2F0F ; [.FB40.0020.0004][.D1E0.0000.0000] -2E87 ; [.FB40.0020.0004][.D1E0.0000.0000][.0000.010B.0004] -2F81D ; [.FB40.0020.0002][.D1F5.0000.0000] -2F10 ; [.FB40.0020.0004][.D1F5.0000.0000] -2F11 ; [.FB40.0020.0004][.D200.0000.0000] -2E88 ; [.FB40.0020.0004][.D200.0000.0000][.0000.010B.0004] -2E89 ; [.FB40.0020.0004][.D202.0000.0000] -2F81E ; [.FB40.0020.0002][.D203.0000.0000] -FA00 ; [.FB40.0020.0002][.D207.0000.0000] -2F850 ; [.FB40.0020.0002][.D207.0000.0000] -F99C ; [.FB40.0020.0002][.D217.0000.0000] -1F220 ; [.FB40.0020.001C][.D21D.0000.0000] -F9DD ; [.FB40.0020.0002][.D229.0000.0000] -F9FF ; [.FB40.0020.0002][.D23A.0000.0000] -2F820 ; [.FB40.0020.0002][.D23B.0000.0000] -2F821 ; [.FB40.0020.0002][.D246.0000.0000] -1F21C ; [.FB40.0020.001C][.D24D.0000.0000] -2F822 ; [.FB40.0020.0002][.D272.0000.0000] -1F239 ; [.FB40.0020.001C][.D272.0000.0000] -2F823 ; [.FB40.0020.0002][.D277.0000.0000] -F9C7 ; [.FB40.0020.0002][.D289.0000.0000] -F98A ; [.FB40.0020.0002][.D29B.0000.0000] -2F12 ; [.FB40.0020.0004][.D29B.0000.0000] -F99D ; [.FB40.0020.0002][.D2A3.0000.0000] -2F992 ; [.FB40.0020.0002][.D2B3.0000.0000] -3238 ; [*0310.0020.0004][.FB40.0020.0004][.D2B4.0000.0000][*0311.0020.0004] -3298 ; [.FB40.0020.0006][.D2B4.0000.0000] -FA76 ; [.FB40.0020.0002][.D2C7.0000.0000] -2F825 ; [.FB40.0020.0002][.D2C7.0000.0000] -FA33 ; [.FB40.0020.0002][.D2C9.0000.0000] -2F826 ; [.FB40.0020.0002][.D2C9.0000.0000] -F952 ; [.FB40.0020.0002][.D2D2.0000.0000] -1F247 ; [*0372.0020.0004][.FB40.0020.0004][.D2DD.0000.0000][*0373.0020.0004] -F92F ; [.FB40.0020.0002][.D2DE.0000.0000] -FA34 ; [.FB40.0020.0002][.D2E4.0000.0000] -2F827 ; [.FB40.0020.0002][.D2E4.0000.0000] -F97F ; [.FB40.0020.0002][.D2F5.0000.0000] -2F13 ; [.FB40.0020.0004][.D2F9.0000.0000] -FA77 ; [.FB40.0020.0002][.D2FA.0000.0000] -2F828 ; [.FB40.0020.0002][.D2FA.0000.0000] -2F829 ; [.FB40.0020.0002][.D305.0000.0000] -2F82A ; [.FB40.0020.0002][.D306.0000.0000] -2F14 ; [.FB40.0020.0004][.D315.0000.0000] -F963 ; [.FB40.0020.0002][.D317.0000.0000] -2F82B ; [.FB40.0020.0002][.D317.0000.0000] -2F15 ; [.FB40.0020.0004][.D31A.0000.0000] -2F16 ; [.FB40.0020.0004][.D338.0000.0000] -32A9 ; [.FB40.0020.0006][.D33B.0000.0000] -F9EB ; [.FB40.0020.0002][.D33F.0000.0000] -2F17 ; [.FB40.0020.0004][.D341.0000.0000] -3038 ; [.FB40.0020.0004][.D341.0000.0000] -3229 ; [*0310.0020.0004][.FB40.0020.0004][.D341.0000.0000][*0311.0020.0004] -3289 ; [.FB40.0020.0006][.D341.0000.0000] -3039 ; [.FB40.0020.0004][.D344.0000.0000] -303A ; [.FB40.0020.0004][.D345.0000.0000] -2F82C ; [.FB40.0020.0002][.D349.0000.0000] -FA35 ; [.FB40.0020.0002][.D351.0000.0000] -2F82D ; [.FB40.0020.0002][.D351.0000.0000] -323F ; [*0310.0020.0004][.FB40.0020.0004][.D354.0000.0000][*0311.0020.0004] -32AF ; [.FB40.0020.0006][.D354.0000.0000] -2F82E ; [.FB40.0020.0002][.D35A.0000.0000] -2F18 ; [.FB40.0020.0004][.D35C.0000.0000] -2E8A ; [.FB40.0020.0004][.D35C.0000.0000][.0000.010B.0004] -2F19 ; [.FB40.0020.0004][.D369.0000.0000] -2E8B ; [.FB40.0020.0004][.D369.0000.0000][.0000.010B.0004] -329E ; [.FB40.0020.0006][.D370.0000.0000] -2F82F ; [.FB40.0020.0002][.D373.0000.0000] -F91C ; [.FB40.0020.0002][.D375.0000.0000] -2F830 ; [.FB40.0020.0002][.D37D.0000.0000] -2F831 ; [.FB40.0020.0002][.D37F.0000.0000] -2F832 ; [.FB40.0020.0002][.D37F.0000.0000] -2F833 ; [.FB40.0020.0002][.D37F.0000.0000] -2F1A ; [.FB40.0020.0004][.D382.0000.0000] -2E81 ; [.FB40.0020.0004][.D382.0000.0000][.0000.010B.0004] -2F1B ; [.FB40.0020.0004][.D3B6.0000.0000] -F96B ; [.FB40.0020.0002][.D3C3.0000.0000] -2F1C ; [.FB40.0020.0004][.D3C8.0000.0000] -2F836 ; [.FB40.0020.0002][.D3CA.0000.0000] -1F212 ; [.FB40.0020.001C][.D3CC.0000.0000] -2F837 ; [.FB40.0020.0002][.D3DF.0000.0000] -2F1D ; [.FB40.0020.0004][.D3E3.0000.0000] -F906 ; [.FB40.0020.0002][.D3E5.0000.0000] -2F839 ; [.FB40.0020.0002][.D3EB.0000.0000] -1F251 ; [.FB40.0020.0006][.D3EF.0000.0000] -2F83A ; [.FB40.0020.0002][.D3F1.0000.0000] -32A8 ; [.FB40.0020.0006][.D3F3.0000.0000] -1F22E ; [.FB40.0020.001C][.D3F3.0000.0000] -2F83B ; [.FB40.0020.0002][.D406.0000.0000] -1F234 ; [.FB40.0020.001C][.D408.0000.0000] -3234 ; [*0310.0020.0004][.FB40.0020.0004][.D40D.0000.0000][*0311.0020.0004] -3294 ; [.FB40.0020.0006][.D40D.0000.0000] -F9DE ; [.FB40.0020.0002][.D40F.0000.0000] -F9ED ; [.FB40.0020.0002][.D41D.0000.0000] -2F83D ; [.FB40.0020.0002][.D438.0000.0000] -1F225 ; [.FB40.0020.001C][.D439.0000.0000] -F980 ; [.FB40.0020.0002][.D442.0000.0000] -2F83E ; [.FB40.0020.0002][.D448.0000.0000] -2F83F ; [.FB40.0020.0002][.D468.0000.0000] -323A ; [*0310.0020.0004][.FB40.0020.0004][.D47C.0000.0000][*0311.0020.0004] -2F83C ; [.FB40.0020.0002][.D49E.0000.0000] -2F840 ; [.FB40.0020.0002][.D4A2.0000.0000] -F99E ; [.FB40.0020.0002][.D4BD.0000.0000] -2F841 ; [.FB40.0020.0002][.D4F6.0000.0000] -2F842 ; [.FB40.0020.0002][.D510.0000.0000] -3244 ; [.FB40.0020.0006][.D54F.0000.0000] -2F843 ; [.FB40.0020.0002][.D553.0000.0000] -FA79 ; [.FB40.0020.0002][.D555.0000.0000] -2F844 ; [.FB40.0020.0002][.D563.0000.0000] -2F845 ; [.FB40.0020.0002][.D584.0000.0000] -2F846 ; [.FB40.0020.0002][.D584.0000.0000] -F90B ; [.FB40.0020.0002][.D587.0000.0000] -FA7A ; [.FB40.0020.0002][.D599.0000.0000] -2F847 ; [.FB40.0020.0002][.D599.0000.0000] -FA36 ; [.FB40.0020.0002][.D59D.0000.0000] -FA78 ; [.FB40.0020.0002][.D59D.0000.0000] -2F848 ; [.FB40.0020.0002][.D5AB.0000.0000] -2F849 ; [.FB40.0020.0002][.D5B3.0000.0000] -1F23A ; [.FB40.0020.001C][.D5B6.0000.0000] -FA0D ; [.FB40.0020.0002][.D5C0.0000.0000] -2F84A ; [.FB40.0020.0002][.D5C2.0000.0000] -FA7B ; [.FB40.0020.0002][.D5E2.0000.0000] -FA37 ; [.FB40.0020.0002][.D606.0000.0000] -2F84C ; [.FB40.0020.0002][.D606.0000.0000] -2F84E ; [.FB40.0020.0002][.D651.0000.0000] -FA38 ; [.FB40.0020.0002][.D668.0000.0000] -2F84F ; [.FB40.0020.0002][.D674.0000.0000] -2F1E ; [.FB40.0020.0004][.D6D7.0000.0000] -3223 ; [*0310.0020.0004][.FB40.0020.0004][.D6DB.0000.0000][*0311.0020.0004] -3283 ; [.FB40.0020.0006][.D6DB.0000.0000] -3195 ; [.FB40.0020.0014][.D6DB.0000.0000] -F9A9 ; [.FB40.0020.0002][.D6F9.0000.0000] -2F84B ; [.FB40.0020.0002][.D716.0000.0000] -2F84D ; [.FB40.0020.0002][.D717.0000.0000] -2F1F ; [.FB40.0020.0004][.D71F.0000.0000] -322F ; [*0310.0020.0004][.FB40.0020.0004][.D71F.0000.0000][*0311.0020.0004] -328F ; [.FB40.0020.0006][.D71F.0000.0000] -319E ; [.FB40.0020.0014][.D730.0000.0000] -2F855 ; [.FB40.0020.0002][.D78B.0000.0000] -2F852 ; [.FB40.0020.0002][.D7CE.0000.0000] -2F853 ; [.FB40.0020.0002][.D7F4.0000.0000] -2F854 ; [.FB40.0020.0002][.D80D.0000.0000] -2F857 ; [.FB40.0020.0002][.D831.0000.0000] -2F856 ; [.FB40.0020.0002][.D832.0000.0000] -FA39 ; [.FB40.0020.0002][.D840.0000.0000] -FA10 ; [.FB40.0020.0002][.D85A.0000.0000] -FA7C ; [.FB40.0020.0002][.D85A.0000.0000] -F96C ; [.FB40.0020.0002][.D85E.0000.0000] -FA3A ; [.FB40.0020.0002][.D8A8.0000.0000] -2F858 ; [.FB40.0020.0002][.D8AC.0000.0000] -FA7D ; [.FB40.0020.0002][.D8B3.0000.0000] -F94A ; [.FB40.0020.0002][.D8D8.0000.0000] -F942 ; [.FB40.0020.0002][.D8DF.0000.0000] -2F20 ; [.FB40.0020.0004][.D8EB.0000.0000] -2F851 ; [.FB40.0020.0002][.D8EE.0000.0000] -1F224 ; [.FB40.0020.001C][.D8F0.0000.0000] -2F85A ; [.FB40.0020.0002][.D8F2.0000.0000] -2F85B ; [.FB40.0020.0002][.D8F7.0000.0000] -2F21 ; [.FB40.0020.0004][.D902.0000.0000] -2F85C ; [.FB40.0020.0002][.D906.0000.0000] -2F22 ; [.FB40.0020.0004][.D90A.0000.0000] -2F23 ; [.FB40.0020.0004][.D915.0000.0000] -2F85D ; [.FB40.0020.0002][.D91A.0000.0000] -1F215 ; [.FB40.0020.001C][.D91A.0000.0000] -32B0 ; [.FB40.0020.0006][.D91C.0000.0000] -2F85E ; [.FB40.0020.0002][.D922.0000.0000] -2F24 ; [.FB40.0020.0004][.D927.0000.0000] -337D ; [.FB40.0020.001C][.D927.0000.0000][.FB40.0020.001C][.EB63.0000.0000] -319D ; [.FB40.0020.0014][.D929.0000.0000] -1F217 ; [.FB40.0020.001C][.D929.0000.0000] -FA7E ; [.FB40.0020.0002][.D944.0000.0000] -F90C ; [.FB40.0020.0002][.D948.0000.0000] -F909 ; [.FB40.0020.0002][.D951.0000.0000] -FA7F ; [.FB40.0020.0002][.D954.0000.0000] -2F85F ; [.FB40.0020.0002][.D962.0000.0000] -F981 ; [.FB40.0020.0002][.D973.0000.0000] -2F25 ; [.FB40.0020.0004][.D973.0000.0000] -329B ; [.FB40.0020.0006][.D973.0000.0000] -2F865 ; [.FB40.0020.0002][.D9D8.0000.0000] -2F862 ; [.FB40.0020.0002][.D9EC.0000.0000] -2F863 ; [.FB40.0020.0002][.DA1B.0000.0000] -2F864 ; [.FB40.0020.0002][.DA27.0000.0000] -FA80 ; [.FB40.0020.0002][.DA62.0000.0000] -2F866 ; [.FB40.0020.0002][.DA66.0000.0000] -2F986 ; [.FB40.0020.0002][.DAB5.0000.0000] -2F869 ; [.FB40.0020.0002][.DB08.0000.0000] -FA81 ; [.FB40.0020.0002][.DB28.0000.0000] -2F86A ; [.FB40.0020.0002][.DB3E.0000.0000] -2F86B ; [.FB40.0020.0002][.DB3E.0000.0000] -2F26 ; [.FB40.0020.0004][.DB50.0000.0000] -1F211 ; [.FB40.0020.001C][.DB57.0000.0000] -323B ; [*0310.0020.0004][.FB40.0020.0004][.DB66.0000.0000][*0311.0020.0004] -32AB ; [.FB40.0020.0006][.DB66.0000.0000] -2F27 ; [.FB40.0020.0004][.DB80.0000.0000] -FA04 ; [.FB40.0020.0002][.DB85.0000.0000] -1F243 ; [*0372.0020.0004][.FB40.0020.0004][.DB89.0000.0000][*0373.0020.0004] -32AA ; [.FB40.0020.0006][.DB97.0000.0000] -2F86D ; [.FB40.0020.0002][.DBC3.0000.0000] -2F86E ; [.FB40.0020.0002][.DBD8.0000.0000] -F95F ; [.FB40.0020.0002][.DBE7.0000.0000] -F9AA ; [.FB40.0020.0002][.DBE7.0000.0000] -2F86F ; [.FB40.0020.0002][.DBE7.0000.0000] -F9BC ; [.FB40.0020.0002][.DBEE.0000.0000] -2F870 ; [.FB40.0020.0002][.DBF3.0000.0000] -2F28 ; [.FB40.0020.0004][.DBF8.0000.0000] -2F872 ; [.FB40.0020.0002][.DBFF.0000.0000] -2F873 ; [.FB40.0020.0002][.DC06.0000.0000] -2F29 ; [.FB40.0020.0004][.DC0F.0000.0000] -2E8C ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.010B.0004] -2E8D ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.010C.0004] -2F875 ; [.FB40.0020.0002][.DC22.0000.0000] -2E90 ; [.FB40.0020.0004][.DC22.0000.0000] -2F2A ; [.FB40.0020.0004][.DC22.0000.0000] -2E8E ; [.FB40.0020.0004][.DC22.0000.0000][.0000.010B.0004] -2E8F ; [.FB40.0020.0004][.DC23.0000.0000] -2E91 ; [.FB40.0020.0004][.DC23.0000.0000][.0000.010B.0004] -2F2B ; [.FB40.0020.0004][.DC38.0000.0000] -F9BD ; [.FB40.0020.0002][.DC3F.0000.0000] -2F877 ; [.FB40.0020.0002][.DC60.0000.0000] -F94B ; [.FB40.0020.0002][.DC62.0000.0000] -FA3B ; [.FB40.0020.0002][.DC64.0000.0000] -F9DF ; [.FB40.0020.0002][.DC65.0000.0000] -FA3C ; [.FB40.0020.0002][.DC6E.0000.0000] -2F878 ; [.FB40.0020.0002][.DC6E.0000.0000] -2F2C ; [.FB40.0020.0004][.DC6E.0000.0000] -2F2D ; [.FB40.0020.0004][.DC71.0000.0000] -2F87A ; [.FB40.0020.0002][.DC8D.0000.0000] -2F879 ; [.FB40.0020.0002][.DCC0.0000.0000] -F9D5 ; [.FB40.0020.0002][.DD19.0000.0000] -2F87C ; [.FB40.0020.0002][.DD43.0000.0000] -F921 ; [.FB40.0020.0002][.DD50.0000.0000] -2F87F ; [.FB40.0020.0002][.DD6B.0000.0000] -2F87E ; [.FB40.0020.0002][.DD6E.0000.0000] -2F880 ; [.FB40.0020.0002][.DD7C.0000.0000] -2F9F4 ; [.FB40.0020.0002][.DDB2.0000.0000] -F9AB ; [.FB40.0020.0002][.DDBA.0000.0000] -2F2E ; [.FB40.0020.0004][.DDDB.0000.0000] -2F881 ; [.FB40.0020.0002][.DDE1.0000.0000] -2F882 ; [.FB40.0020.0002][.DDE2.0000.0000] -2F2F ; [.FB40.0020.0004][.DDE5.0000.0000] -32A7 ; [.FB40.0020.0006][.DDE6.0000.0000] -1F22C ; [.FB40.0020.001C][.DDE6.0000.0000] -2F30 ; [.FB40.0020.0004][.DDF1.0000.0000] -2E92 ; [.FB40.0020.0004][.DDF3.0000.0000] -2F884 ; [.FB40.0020.0002][.DDFD.0000.0000] -2F31 ; [.FB40.0020.0004][.DDFE.0000.0000] -2F885 ; [.FB40.0020.0002][.DE28.0000.0000] -2F886 ; [.FB40.0020.0002][.DE3D.0000.0000] -2F887 ; [.FB40.0020.0002][.DE69.0000.0000] -2F32 ; [.FB40.0020.0004][.DE72.0000.0000] -337B ; [.FB40.0020.001C][.DE73.0000.0000][.FB40.0020.001C][.E210.0000.0000] -F98E ; [.FB40.0020.0002][.DE74.0000.0000] -2E93 ; [.FB40.0020.0004][.DE7A.0000.0000] -2F33 ; [.FB40.0020.0004][.DE7A.0000.0000] -3245 ; [.FB40.0020.0006][.DE7C.0000.0000] -2F34 ; [.FB40.0020.0004][.DE7F.0000.0000] -FA01 ; [.FB40.0020.0002][.DEA6.0000.0000] -2F88B ; [.FB40.0020.0002][.DEB0.0000.0000] -2F88C ; [.FB40.0020.0002][.DEB3.0000.0000] -2F88D ; [.FB40.0020.0002][.DEB6.0000.0000] -F9A2 ; [.FB40.0020.0002][.DEC9.0000.0000] -F928 ; [.FB40.0020.0002][.DECA.0000.0000] -2F88E ; [.FB40.0020.0002][.DECA.0000.0000] -FA82 ; [.FB40.0020.0002][.DED2.0000.0000] -FA0B ; [.FB40.0020.0002][.DED3.0000.0000] -FA83 ; [.FB40.0020.0002][.DED9.0000.0000] -F982 ; [.FB40.0020.0002][.DEEC.0000.0000] -2F35 ; [.FB40.0020.0004][.DEF4.0000.0000] -2F890 ; [.FB40.0020.0002][.DEFE.0000.0000] -2F36 ; [.FB40.0020.0004][.DEFE.0000.0000] -F943 ; [.FB40.0020.0002][.DF04.0000.0000] -2F37 ; [.FB40.0020.0004][.DF0B.0000.0000] -2F38 ; [.FB40.0020.0004][.DF13.0000.0000] -2F894 ; [.FB40.0020.0002][.DF22.0000.0000] -2F895 ; [.FB40.0020.0002][.DF22.0000.0000] -2F39 ; [.FB40.0020.0004][.DF50.0000.0000] -2E95 ; [.FB40.0020.0004][.DF50.0000.0000][.0000.010B.0004] -2E94 ; [.FB40.0020.0004][.DF51.0000.0000] -2F874 ; [.FB40.0020.0002][.DF53.0000.0000] -2F3A ; [.FB40.0020.0004][.DF61.0000.0000] -2F899 ; [.FB40.0020.0002][.DF62.0000.0000] -FA84 ; [.FB40.0020.0002][.DF69.0000.0000] -2F89A ; [.FB40.0020.0002][.DF6B.0000.0000] -2F3B ; [.FB40.0020.0004][.DF73.0000.0000] -F9D8 ; [.FB40.0020.0002][.DF8B.0000.0000] -1F21D ; [.FB40.0020.001C][.DF8C.0000.0000] -1F250 ; [.FB40.0020.0006][.DF97.0000.0000] -2F89C ; [.FB40.0020.0002][.DF9A.0000.0000] -F966 ; [.FB40.0020.0002][.DFA9.0000.0000] -FA85 ; [.FB40.0020.0002][.DFAD.0000.0000] -2F3C ; [.FB40.0020.0004][.DFC3.0000.0000] -2E97 ; [.FB40.0020.0004][.DFC3.0000.0000][.0000.010B.0004] -2E96 ; [.FB40.0020.0004][.DFC4.0000.0000] -2F89D ; [.FB40.0020.0002][.DFCD.0000.0000] -2F89E ; [.FB40.0020.0002][.DFD7.0000.0000] -F9A3 ; [.FB40.0020.0002][.DFF5.0000.0000] -2F89F ; [.FB40.0020.0002][.DFF9.0000.0000] -F960 ; [.FB40.0020.0002][.E012.0000.0000] -F9AC ; [.FB40.0020.0002][.E01C.0000.0000] -FA6B ; [.FB40.0020.0002][.E075.0000.0000] -2F8A0 ; [.FB40.0020.0002][.E081.0000.0000] -FA3D ; [.FB40.0020.0002][.E094.0000.0000] -2F8A3 ; [.FB40.0020.0002][.E094.0000.0000] -2F8A5 ; [.FB40.0020.0002][.E0C7.0000.0000] -FA86 ; [.FB40.0020.0002][.E0D8.0000.0000] -F9B9 ; [.FB40.0020.0002][.E0E1.0000.0000] -FA88 ; [.FB40.0020.0002][.E108.0000.0000] -F9D9 ; [.FB40.0020.0002][.E144.0000.0000] -2F8A6 ; [.FB40.0020.0002][.E148.0000.0000] -2F8A7 ; [.FB40.0020.0002][.E14C.0000.0000] -2F8A9 ; [.FB40.0020.0002][.E14C.0000.0000] -FA87 ; [.FB40.0020.0002][.E14E.0000.0000] -2F8A8 ; [.FB40.0020.0002][.E14E.0000.0000] -FA8A ; [.FB40.0020.0002][.E160.0000.0000] -FA3E ; [.FB40.0020.0002][.E168.0000.0000] -2F8AA ; [.FB40.0020.0002][.E17A.0000.0000] -FA3F ; [.FB40.0020.0002][.E18E.0000.0000] -FA89 ; [.FB40.0020.0002][.E18E.0000.0000] -2F8AB ; [.FB40.0020.0002][.E18E.0000.0000] -F98F ; [.FB40.0020.0002][.E190.0000.0000] -2F8AD ; [.FB40.0020.0002][.E1A4.0000.0000] -2F8AE ; [.FB40.0020.0002][.E1AF.0000.0000] -2F8AC ; [.FB40.0020.0002][.E1B2.0000.0000] -2F8AF ; [.FB40.0020.0002][.E1DE.0000.0000] -FA40 ; [.FB40.0020.0002][.E1F2.0000.0000] -FA8B ; [.FB40.0020.0002][.E1F2.0000.0000] -2F8B0 ; [.FB40.0020.0002][.E1F2.0000.0000] -F90D ; [.FB40.0020.0002][.E1F6.0000.0000] -2F8B1 ; [.FB40.0020.0002][.E1F6.0000.0000] -F990 ; [.FB40.0020.0002][.E200.0000.0000] -2F3D ; [.FB40.0020.0004][.E208.0000.0000] -2F8B2 ; [.FB40.0020.0002][.E210.0000.0000] -2F8B3 ; [.FB40.0020.0002][.E21B.0000.0000] -F9D2 ; [.FB40.0020.0002][.E22E.0000.0000] -FA8C ; [.FB40.0020.0002][.E234.0000.0000] -2F3E ; [.FB40.0020.0004][.E236.0000.0000] -2F3F ; [.FB40.0020.0004][.E24B.0000.0000] -1F210 ; [.FB40.0020.001C][.E24B.0000.0000] -2E98 ; [.FB40.0020.0004][.E24C.0000.0000] -1F245 ; [*0372.0020.0004][.FB40.0020.0004][.E253.0000.0000][*0373.0020.0004] -1F231 ; [.FB40.0020.001C][.E253.0000.0000] -2F8B4 ; [.FB40.0020.0002][.E25D.0000.0000] -1F227 ; [.FB40.0020.001C][.E295.0000.0000] -2F8B5 ; [.FB40.0020.0002][.E2B1.0000.0000] -F925 ; [.FB40.0020.0002][.E2C9.0000.0000] -F95B ; [.FB40.0020.0002][.E2CF.0000.0000] -FA02 ; [.FB40.0020.0002][.E2D3.0000.0000] -2F8B6 ; [.FB40.0020.0002][.E2D4.0000.0000] -2F8BA ; [.FB40.0020.0002][.E2FC.0000.0000] -F973 ; [.FB40.0020.0002][.E2FE.0000.0000] -1F22F ; [.FB40.0020.001C][.E307.0000.0000] -2F8B9 ; [.FB40.0020.0002][.E33D.0000.0000] -2F8B7 ; [.FB40.0020.0002][.E350.0000.0000] -1F228 ; [.FB40.0020.001C][.E355.0000.0000] -2F8BB ; [.FB40.0020.0002][.E368.0000.0000] -F9A4 ; [.FB40.0020.0002][.E37B.0000.0000] -2F8BC ; [.FB40.0020.0002][.E383.0000.0000] -F975 ; [.FB40.0020.0002][.E3A0.0000.0000] -2F8C1 ; [.FB40.0020.0002][.E3A9.0000.0000] -FA8D ; [.FB40.0020.0002][.E3C4.0000.0000] -2F8C0 ; [.FB40.0020.0002][.E3C5.0000.0000] -2F8BD ; [.FB40.0020.0002][.E3E4.0000.0000] -FA8E ; [.FB40.0020.0002][.E41C.0000.0000] -2F8BF ; [.FB40.0020.0002][.E422.0000.0000] -FA8F ; [.FB40.0020.0002][.E452.0000.0000] -2F8C3 ; [.FB40.0020.0002][.E469.0000.0000] -2F8C6 ; [.FB40.0020.0002][.E477.0000.0000] -2F8C4 ; [.FB40.0020.0002][.E47E.0000.0000] -F991 ; [.FB40.0020.0002][.E49A.0000.0000] -2F8C5 ; [.FB40.0020.0002][.E49D.0000.0000] -F930 ; [.FB40.0020.0002][.E4C4.0000.0000] -2F40 ; [.FB40.0020.0004][.E52F.0000.0000] -2F41 ; [.FB40.0020.0004][.E534.0000.0000] -2E99 ; [.FB40.0020.0004][.E535.0000.0000] -FA41 ; [.FB40.0020.0002][.E54F.0000.0000] -2F8C8 ; [.FB40.0020.0002][.E54F.0000.0000] -FA90 ; [.FB40.0020.0002][.E556.0000.0000] -1F248 ; [*0372.0020.0004][.FB40.0020.0004][.E557.0000.0000][*0373.0020.0004] -2F8C9 ; [.FB40.0020.0002][.E56C.0000.0000] -F969 ; [.FB40.0020.0002][.E578.0000.0000] -2F42 ; [.FB40.0020.0004][.E587.0000.0000] -3246 ; [.FB40.0020.0006][.E587.0000.0000] -2F43 ; [.FB40.0020.0004][.E597.0000.0000] -F9BE ; [.FB40.0020.0002][.E599.0000.0000] -1F21B ; [.FB40.0020.001C][.E599.0000.0000] -2F44 ; [.FB40.0020.0004][.E5A4.0000.0000] -1F21F ; [.FB40.0020.001C][.E5B0.0000.0000] -2F45 ; [.FB40.0020.0004][.E5B9.0000.0000] -F983 ; [.FB40.0020.0002][.E5C5.0000.0000] -2F46 ; [.FB40.0020.0004][.E5E0.0000.0000] -2E9B ; [.FB40.0020.0004][.E5E1.0000.0000] -FA42 ; [.FB40.0020.0002][.E5E2.0000.0000] -2F8CB ; [.FB40.0020.0002][.E5E3.0000.0000] -2F47 ; [.FB40.0020.0004][.E5E5.0000.0000] -3230 ; [*0310.0020.0004][.FB40.0020.0004][.E5E5.0000.0000][*0311.0020.0004] -3290 ; [.FB40.0020.0006][.E5E5.0000.0000] -2E9C ; [.FB40.0020.0004][.E5E5.0000.0000][.0000.010B.0004] -337E ; [.FB40.0020.001C][.E60E.0000.0000][.FB40.0020.001C][.ECBB.0000.0000] -F9E0 ; [.FB40.0020.0002][.E613.0000.0000] -1F219 ; [.FB40.0020.001C][.E620.0000.0000] -337C ; [.FB40.0020.001C][.E62D.0000.0000][.FB40.0020.001C][.D48C.0000.0000] -2F8CD ; [.FB40.0020.0002][.E649.0000.0000] -FA12 ; [.FB40.0020.0002][.E674.0000.0000] -FA91 ; [.FB40.0020.0002][.E674.0000.0000] -F9C5 ; [.FB40.0020.0002][.E688.0000.0000] -FA43 ; [.FB40.0020.0002][.E691.0000.0000] -2F8CF ; [.FB40.0020.0002][.E691.0000.0000] -2F8D5 ; [.FB40.0020.0002][.E69C.0000.0000] -FA06 ; [.FB40.0020.0002][.E6B4.0000.0000] -F98B ; [.FB40.0020.0002][.E6C6.0000.0000] -2F48 ; [.FB40.0020.0004][.E6F0.0000.0000] -F901 ; [.FB40.0020.0002][.E6F4.0000.0000] -2F8CC ; [.FB40.0020.0002][.E6F8.0000.0000] -2F8D4 ; [.FB40.0020.0002][.E700.0000.0000] -2F49 ; [.FB40.0020.0004][.E708.0000.0000] -322A ; [*0310.0020.0004][.FB40.0020.0004][.E708.0000.0000][*0311.0020.0004] -328A ; [.FB40.0020.0006][.E708.0000.0000] -1F237 ; [.FB40.0020.001C][.E708.0000.0000] -2E9D ; [.FB40.0020.0004][.E708.0000.0000][.0000.010B.0004] -3232 ; [*0310.0020.0004][.FB40.0020.0004][.E709.0000.0000][*0311.0020.0004] -3292 ; [.FB40.0020.0006][.E709.0000.0000] -1F236 ; [.FB40.0020.001C][.E709.0000.0000] -F929 ; [.FB40.0020.0002][.E717.0000.0000] -FA92 ; [.FB40.0020.0002][.E717.0000.0000] -2F8D8 ; [.FB40.0020.0002][.E717.0000.0000] -FA93 ; [.FB40.0020.0002][.E71B.0000.0000] -2F8D9 ; [.FB40.0020.0002][.E71B.0000.0000] -2F8DA ; [.FB40.0020.0002][.E721.0000.0000] -2F4A ; [.FB40.0020.0004][.E728.0000.0000] -322D ; [*0310.0020.0004][.FB40.0020.0004][.E728.0000.0000][*0311.0020.0004] -328D ; [.FB40.0020.0006][.E728.0000.0000] -1F240 ; [*0372.0020.0004][.FB40.0020.0004][.E72C.0000.0000][*0373.0020.0004] -F9E1 ; [.FB40.0020.0002][.E74E.0000.0000] -2F8DC ; [.FB40.0020.0002][.E753.0000.0000] -FA94 ; [.FB40.0020.0002][.E756.0000.0000] -2F8DB ; [.FB40.0020.0002][.E75E.0000.0000] -F9C8 ; [.FB40.0020.0002][.E77B.0000.0000] -2F8E0 ; [.FB40.0020.0002][.E785.0000.0000] -F9F4 ; [.FB40.0020.0002][.E797.0000.0000] -F9C9 ; [.FB40.0020.0002][.E7F3.0000.0000] -2F8DF ; [.FB40.0020.0002][.E7FA.0000.0000] -F9DA ; [.FB40.0020.0002][.E817.0000.0000] -2F8E5 ; [.FB40.0020.0002][.E81F.0000.0000] -3231 ; [*0310.0020.0004][.FB40.0020.0004][.E82A.0000.0000][*0311.0020.0004] -3291 ; [.FB40.0020.0006][.E82A.0000.0000] -337F ; [.FB40.0020.001C][.E82A.0000.0000][.FB40.0020.001C][.DF0F.0000.0000][.FB40.0020.001C][.CF1A.0000.0000][.FB40.0020.001C][.F93E.0000.0000] -2F8E1 ; [.FB40.0020.0002][.E852.0000.0000] -F97A ; [.FB40.0020.0002][.E881.0000.0000] -FA44 ; [.FB40.0020.0002][.E885.0000.0000] -2F8E2 ; [.FB40.0020.0002][.E885.0000.0000] -2F8E4 ; [.FB40.0020.0002][.E88E.0000.0000] -F9E2 ; [.FB40.0020.0002][.E8A8.0000.0000] -2F8E6 ; [.FB40.0020.0002][.E914.0000.0000] -2F8E8 ; [.FB40.0020.0002][.E942.0000.0000] -2F8E9 ; [.FB40.0020.0002][.E9A3.0000.0000] -2F8EA ; [.FB40.0020.0002][.E9EA.0000.0000] -F914 ; [.FB40.0020.0002][.EA02.0000.0000] -F95C ; [.FB40.0020.0002][.EA02.0000.0000] -F9BF ; [.FB40.0020.0002][.EA02.0000.0000] -F94C ; [.FB40.0020.0002][.EA13.0000.0000] -2F8EB ; [.FB40.0020.0002][.EAA8.0000.0000] -F931 ; [.FB40.0020.0002][.EAD3.0000.0000] -2F8ED ; [.FB40.0020.0002][.EADB.0000.0000] -F91D ; [.FB40.0020.0002][.EB04.0000.0000] -2F4B ; [.FB40.0020.0004][.EB20.0000.0000] -2F8EF ; [.FB40.0020.0002][.EB21.0000.0000] -2F8F1 ; [.FB40.0020.0002][.EB54.0000.0000] -2F4C ; [.FB40.0020.0004][.EB62.0000.0000] -32A3 ; [.FB40.0020.0006][.EB63.0000.0000] -2F8F3 ; [.FB40.0020.0002][.EB72.0000.0000] -F98C ; [.FB40.0020.0002][.EB77.0000.0000] -FA95 ; [.FB40.0020.0002][.EB79.0000.0000] -2F4D ; [.FB40.0020.0004][.EB79.0000.0000] -2E9E ; [.FB40.0020.0004][.EB7A.0000.0000][.0000.010B.0004] -2F8F4 ; [.FB40.0020.0002][.EB9F.0000.0000] -F9A5 ; [.FB40.0020.0002][.EBAE.0000.0000] -2F4E ; [.FB40.0020.0004][.EBB3.0000.0000] -F970 ; [.FB40.0020.0002][.EBBA.0000.0000] -FA96 ; [.FB40.0020.0002][.EBBA.0000.0000] -2F8F5 ; [.FB40.0020.0002][.EBBA.0000.0000] -2F8F6 ; [.FB40.0020.0002][.EBBB.0000.0000] -2F4F ; [.FB40.0020.0004][.EBCB.0000.0000] -2E9F ; [.FB40.0020.0004][.EBCD.0000.0000] -2F50 ; [.FB40.0020.0004][.EBD4.0000.0000] -2F51 ; [.FB40.0020.0004][.EBDB.0000.0000] -2F52 ; [.FB40.0020.0004][.EC0F.0000.0000] -2EA0 ; [.FB40.0020.0004][.EC11.0000.0000] -2F53 ; [.FB40.0020.0004][.EC14.0000.0000] -2F54 ; [.FB40.0020.0004][.EC34.0000.0000] -322C ; [*0310.0020.0004][.FB40.0020.0004][.EC34.0000.0000][*0311.0020.0004] -328C ; [.FB40.0020.0006][.EC34.0000.0000] -2EA1 ; [.FB40.0020.0004][.EC35.0000.0000] -2EA2 ; [.FB40.0020.0004][.EC3A.0000.0000] -2F8FA ; [.FB40.0020.0002][.EC4E.0000.0000] -2F8FE ; [.FB40.0020.0002][.EC67.0000.0000] -F972 ; [.FB40.0020.0002][.EC88.0000.0000] -2F8FC ; [.FB40.0020.0002][.ECBF.0000.0000] -F968 ; [.FB40.0020.0002][.ECCC.0000.0000] -2F8FD ; [.FB40.0020.0002][.ECCD.0000.0000] -F9E3 ; [.FB40.0020.0002][.ECE5.0000.0000] -329F ; [.FB40.0020.0006][.ECE8.0000.0000] -2F8FF ; [.FB40.0020.0002][.ED16.0000.0000] -F915 ; [.FB40.0020.0002][.ED1B.0000.0000] -FA05 ; [.FB40.0020.0002][.ED1E.0000.0000] -2F907 ; [.FB40.0020.0002][.ED34.0000.0000] -2F900 ; [.FB40.0020.0002][.ED3E.0000.0000] -F9CA ; [.FB40.0020.0002][.ED41.0000.0000] -FA97 ; [.FB40.0020.0002][.ED41.0000.0000] -2F902 ; [.FB40.0020.0002][.ED41.0000.0000] -2F903 ; [.FB40.0020.0002][.ED69.0000.0000] -F92A ; [.FB40.0020.0002][.ED6A.0000.0000] -FA45 ; [.FB40.0020.0002][.ED77.0000.0000] -2F901 ; [.FB40.0020.0002][.ED77.0000.0000] -2F904 ; [.FB40.0020.0002][.ED78.0000.0000] -2F905 ; [.FB40.0020.0002][.ED85.0000.0000] -F9F5 ; [.FB40.0020.0002][.EDCB.0000.0000] -F94D ; [.FB40.0020.0002][.EDDA.0000.0000] -F9D6 ; [.FB40.0020.0002][.EDEA.0000.0000] -2F90E ; [.FB40.0020.0002][.EDF9.0000.0000] -FA46 ; [.FB40.0020.0002][.EE1A.0000.0000] -2F908 ; [.FB40.0020.0002][.EE2F.0000.0000] -2F909 ; [.FB40.0020.0002][.EE6E.0000.0000] -1F235 ; [.FB40.0020.001C][.EE80.0000.0000] -F9CB ; [.FB40.0020.0002][.EE9C.0000.0000] -F9EC ; [.FB40.0020.0002][.EEBA.0000.0000] -2F90C ; [.FB40.0020.0002][.EEC7.0000.0000] -FA99 ; [.FB40.0020.0002][.EECB.0000.0000] -2F90B ; [.FB40.0020.0002][.EECB.0000.0000] -F904 ; [.FB40.0020.0002][.EED1.0000.0000] -FA98 ; [.FB40.0020.0002][.EEDB.0000.0000] -F94E ; [.FB40.0020.0002][.EF0F.0000.0000] -1F226 ; [.FB40.0020.001C][.EF14.0000.0000] -FA47 ; [.FB40.0020.0002][.EF22.0000.0000] -FA9A ; [.FB40.0020.0002][.EF22.0000.0000] -F992 ; [.FB40.0020.0002][.EF23.0000.0000] -2F90F ; [.FB40.0020.0002][.EF6E.0000.0000] -2F912 ; [.FB40.0020.0002][.EFC6.0000.0000] -F922 ; [.FB40.0020.0002][.EFEB.0000.0000] -F984 ; [.FB40.0020.0002][.EFFE.0000.0000] -2F915 ; [.FB40.0020.0002][.F01B.0000.0000] -FA9B ; [.FB40.0020.0002][.F01E.0000.0000] -2F914 ; [.FB40.0020.0002][.F01E.0000.0000] -2F913 ; [.FB40.0020.0002][.F039.0000.0000] -2F917 ; [.FB40.0020.0002][.F04A.0000.0000] -2F55 ; [.FB40.0020.0004][.F06B.0000.0000] -322B ; [*0310.0020.0004][.FB40.0020.0004][.F06B.0000.0000][*0311.0020.0004] -328B ; [.FB40.0020.0006][.F06B.0000.0000] -2EA3 ; [.FB40.0020.0004][.F06C.0000.0000] -2F835 ; [.FB40.0020.0002][.F070.0000.0000] -2F919 ; [.FB40.0020.0002][.F077.0000.0000] -2F918 ; [.FB40.0020.0002][.F07D.0000.0000] -F9FB ; [.FB40.0020.0002][.F099.0000.0000] -2F91A ; [.FB40.0020.0002][.F0AD.0000.0000] -1F244 ; [*0372.0020.0004][.FB40.0020.0004][.F0B9.0000.0000][*0373.0020.0004] -F99F ; [.FB40.0020.0002][.F0C8.0000.0000] -F916 ; [.FB40.0020.0002][.F0D9.0000.0000] -1F21A ; [.FB40.0020.001C][.F121.0000.0000] -2F91C ; [.FB40.0020.0002][.F145.0000.0000] -F993 ; [.FB40.0020.0002][.F149.0000.0000] -FA48 ; [.FB40.0020.0002][.F16E.0000.0000] -FA9C ; [.FB40.0020.0002][.F16E.0000.0000] -2F91E ; [.FB40.0020.0002][.F19C.0000.0000] -F9C0 ; [.FB40.0020.0002][.F1CE.0000.0000] -F9EE ; [.FB40.0020.0002][.F1D0.0000.0000] -F932 ; [.FB40.0020.0002][.F210.0000.0000] -F91E ; [.FB40.0020.0002][.F21B.0000.0000] -2F920 ; [.FB40.0020.0002][.F228.0000.0000] -2F56 ; [.FB40.0020.0004][.F22A.0000.0000] -FA49 ; [.FB40.0020.0002][.F22B.0000.0000] -2EA4 ; [.FB40.0020.0004][.F22B.0000.0000] -2EA5 ; [.FB40.0020.0004][.F22B.0000.0000][.0000.010B.0004] -FA9E ; [.FB40.0020.0002][.F235.0000.0000] -2F921 ; [.FB40.0020.0002][.F235.0000.0000] -2F57 ; [.FB40.0020.0004][.F236.0000.0000] -2F58 ; [.FB40.0020.0004][.F23B.0000.0000] -2F59 ; [.FB40.0020.0004][.F23F.0000.0000] -2F5A ; [.FB40.0020.0004][.F247.0000.0000] -2F922 ; [.FB40.0020.0002][.F250.0000.0000] -2F5B ; [.FB40.0020.0004][.F259.0000.0000] -2F5C ; [.FB40.0020.0004][.F25B.0000.0000] -2EA7 ; [.FB40.0020.0004][.F25B.0000.0000][.0000.010B.0004] -F946 ; [.FB40.0020.0002][.F262.0000.0000] -3235 ; [*0310.0020.0004][.FB40.0020.0004][.F279.0000.0000][*0311.0020.0004] -3295 ; [.FB40.0020.0006][.F279.0000.0000] -2F924 ; [.FB40.0020.0002][.F280.0000.0000] -2F925 ; [.FB40.0020.0002][.F295.0000.0000] -2F5D ; [.FB40.0020.0004][.F2AC.0000.0000] -2EA8 ; [.FB40.0020.0004][.F2AD.0000.0000] -FA9F ; [.FB40.0020.0002][.F2AF.0000.0000] -F9FA ; [.FB40.0020.0002][.F2C0.0000.0000] -F92B ; [.FB40.0020.0002][.F2FC.0000.0000] -FA16 ; [.FB40.0020.0002][.F32A.0000.0000] -FAA0 ; [.FB40.0020.0002][.F32A.0000.0000] -F9A7 ; [.FB40.0020.0002][.F375.0000.0000] -2F928 ; [.FB40.0020.0002][.F37A.0000.0000] -2F5E ; [.FB40.0020.0004][.F384.0000.0000] -F961 ; [.FB40.0020.0002][.F387.0000.0000] -F9DB ; [.FB40.0020.0002][.F387.0000.0000] -2F5F ; [.FB40.0020.0004][.F389.0000.0000] -2F929 ; [.FB40.0020.0002][.F38B.0000.0000] -2EA9 ; [.FB40.0020.0004][.F38B.0000.0000][.0000.010B.0004] -2F92B ; [.FB40.0020.0002][.F3A5.0000.0000] -F9AD ; [.FB40.0020.0002][.F3B2.0000.0000] -F917 ; [.FB40.0020.0002][.F3DE.0000.0000] -F9E4 ; [.FB40.0020.0002][.F406.0000.0000] -F9CC ; [.FB40.0020.0002][.F409.0000.0000] -FA4A ; [.FB40.0020.0002][.F422.0000.0000] -2F92E ; [.FB40.0020.0002][.F447.0000.0000] -2F92F ; [.FB40.0020.0002][.F45C.0000.0000] -F9AE ; [.FB40.0020.0002][.F469.0000.0000] -FAA1 ; [.FB40.0020.0002][.F471.0000.0000] -2F930 ; [.FB40.0020.0002][.F471.0000.0000] -2F931 ; [.FB40.0020.0002][.F485.0000.0000] -F994 ; [.FB40.0020.0002][.F489.0000.0000] -F9EF ; [.FB40.0020.0002][.F498.0000.0000] -2F932 ; [.FB40.0020.0002][.F4CA.0000.0000] -2F60 ; [.FB40.0020.0004][.F4DC.0000.0000] -2F61 ; [.FB40.0020.0004][.F4E6.0000.0000] -FAA2 ; [.FB40.0020.0002][.F506.0000.0000] -2F62 ; [.FB40.0020.0004][.F518.0000.0000] -2F63 ; [.FB40.0020.0004][.F51F.0000.0000] -1F222 ; [.FB40.0020.001C][.F51F.0000.0000] -2F934 ; [.FB40.0020.0002][.F524.0000.0000] -2F64 ; [.FB40.0020.0004][.F528.0000.0000] -2F65 ; [.FB40.0020.0004][.F530.0000.0000] -3199 ; [.FB40.0020.0014][.F532.0000.0000] -1F238 ; [.FB40.0020.001C][.F533.0000.0000] -329A ; [.FB40.0020.0006][.F537.0000.0000] -FAA3 ; [.FB40.0020.0002][.F53B.0000.0000] -2F936 ; [.FB40.0020.0002][.F53E.0000.0000] -F9CD ; [.FB40.0020.0002][.F559.0000.0000] -F976 ; [.FB40.0020.0002][.F565.0000.0000] -F962 ; [.FB40.0020.0002][.F570.0000.0000] -2F938 ; [.FB40.0020.0002][.F570.0000.0000] -2F66 ; [.FB40.0020.0004][.F58B.0000.0000] -2EAA ; [.FB40.0020.0004][.F58B.0000.0000][.0000.010B.0004] -2F67 ; [.FB40.0020.0004][.F592.0000.0000] -F9E5 ; [.FB40.0020.0002][.F5E2.0000.0000] -2F93A ; [.FB40.0020.0002][.F610.0000.0000] -FAA4 ; [.FB40.0020.0002][.F61D.0000.0000] -FAA5 ; [.FB40.0020.0002][.F61F.0000.0000] -F9C1 ; [.FB40.0020.0002][.F642.0000.0000] -F90E ; [.FB40.0020.0002][.F669.0000.0000] -2F68 ; [.FB40.0020.0004][.F676.0000.0000] -2F69 ; [.FB40.0020.0004][.F67D.0000.0000] -2F6A ; [.FB40.0020.0004][.F6AE.0000.0000] -2F6B ; [.FB40.0020.0004][.F6BF.0000.0000] -FA17 ; [.FB40.0020.0002][.F6CA.0000.0000] -FAA6 ; [.FB40.0020.0002][.F6CA.0000.0000] -1F246 ; [*0372.0020.0004][.FB40.0020.0004][.F6D7.0000.0000][*0373.0020.0004] -FAA7 ; [.FB40.0020.0002][.F6DB.0000.0000] -323C ; [*0310.0020.0004][.FB40.0020.0004][.F6E3.0000.0000][*0311.0020.0004] -32AC ; [.FB40.0020.0006][.F6E3.0000.0000] -F933 ; [.FB40.0020.0002][.F6E7.0000.0000] -2F6C ; [.FB40.0020.0004][.F6EE.0000.0000] -2EAB ; [.FB40.0020.0004][.F6EE.0000.0000][.0000.010B.0004] -FAA8 ; [.FB40.0020.0002][.F6F4.0000.0000] -2F940 ; [.FB40.0020.0002][.F6F4.0000.0000] -F96D ; [.FB40.0020.0002][.F701.0000.0000] -2F945 ; [.FB40.0020.0002][.F71E.0000.0000] -2F946 ; [.FB40.0020.0002][.F71F.0000.0000] -2F947 ; [.FB40.0020.0002][.F71F.0000.0000] -FAAA ; [.FB40.0020.0002][.F740.0000.0000] -FAA9 ; [.FB40.0020.0002][.F74A.0000.0000] -2F948 ; [.FB40.0020.0002][.F74A.0000.0000] -2F94A ; [.FB40.0020.0002][.F78B.0000.0000] -FA9D ; [.FB40.0020.0002][.F7A7.0000.0000] -2F6D ; [.FB40.0020.0004][.F7DB.0000.0000] -2F6E ; [.FB40.0020.0004][.F7E2.0000.0000] -2F6F ; [.FB40.0020.0004][.F7F3.0000.0000] -2F94E ; [.FB40.0020.0002][.F84E.0000.0000] -F9CE ; [.FB40.0020.0002][.F86B.0000.0000] -F93B ; [.FB40.0020.0002][.F88C.0000.0000] -2F94F ; [.FB40.0020.0002][.F88C.0000.0000] -FA4B ; [.FB40.0020.0002][.F891.0000.0000] -F947 ; [.FB40.0020.0002][.F8CA.0000.0000] -FAAB ; [.FB40.0020.0002][.F8CC.0000.0000] -2F950 ; [.FB40.0020.0002][.F8CC.0000.0000] -F964 ; [.FB40.0020.0002][.F8FB.0000.0000] -F985 ; [.FB40.0020.0002][.F92A.0000.0000] -2F70 ; [.FB40.0020.0004][.F93A.0000.0000] -2EAC ; [.FB40.0020.0004][.F93A.0000.0000][.0000.010B.0004] -2EAD ; [.FB40.0020.0004][.F93B.0000.0000] -FA18 ; [.FB40.0020.0002][.F93C.0000.0000] -FA4C ; [.FB40.0020.0002][.F93E.0000.0000] -3233 ; [*0310.0020.0004][.FB40.0020.0004][.F93E.0000.0000][*0311.0020.0004] -3293 ; [.FB40.0020.0006][.F93E.0000.0000] -FA4E ; [.FB40.0020.0002][.F948.0000.0000] -FA4D ; [.FB40.0020.0002][.F949.0000.0000] -FA4F ; [.FB40.0020.0002][.F950.0000.0000] -FA50 ; [.FB40.0020.0002][.F956.0000.0000] -2F953 ; [.FB40.0020.0002][.F956.0000.0000] -FA51 ; [.FB40.0020.0002][.F95D.0000.0000] -3237 ; [*0310.0020.0004][.FB40.0020.0004][.F95D.0000.0000][*0311.0020.0004] -3297 ; [.FB40.0020.0006][.F95D.0000.0000] -FA19 ; [.FB40.0020.0002][.F95E.0000.0000] -FA1A ; [.FB40.0020.0002][.F965.0000.0000] -3240 ; [*0310.0020.0004][.FB40.0020.0004][.F96D.0000.0000][*0311.0020.0004] -F93C ; [.FB40.0020.0002][.F97F.0000.0000] -1F232 ; [.FB40.0020.001C][.F981.0000.0000] -FA52 ; [.FB40.0020.0002][.F98D.0000.0000] -FA53 ; [.FB40.0020.0002][.F98E.0000.0000] -FA1B ; [.FB40.0020.0002][.F98F.0000.0000] -2F956 ; [.FB40.0020.0002][.F98F.0000.0000] -F9B6 ; [.FB40.0020.0002][.F9AE.0000.0000] -2F71 ; [.FB40.0020.0004][.F9B8.0000.0000] -2F72 ; [.FB40.0020.0004][.F9BE.0000.0000] -F995 ; [.FB40.0020.0002][.F9CA.0000.0000] -3299 ; [.FB40.0020.0006][.F9D8.0000.0000] -2F957 ; [.FB40.0020.0002][.F9EB.0000.0000] -F956 ; [.FB40.0020.0002][.FA1C.0000.0000] -FA54 ; [.FB40.0020.0002][.FA40.0000.0000] -2F959 ; [.FB40.0020.0002][.FA40.0000.0000] -2F95A ; [.FB40.0020.0002][.FA4A.0000.0000] -2F95B ; [.FB40.0020.0002][.FA4F.0000.0000] -2F73 ; [.FB40.0020.0004][.FA74.0000.0000] -1F233 ; [.FB40.0020.001C][.FA7A.0000.0000] -FA55 ; [.FB40.0020.0002][.FA81.0000.0000] -FAAC ; [.FB40.0020.0002][.FAB1.0000.0000] -F9F7 ; [.FB40.0020.0002][.FACB.0000.0000] -2F74 ; [.FB40.0020.0004][.FACB.0000.0000] -2F95F ; [.FB40.0020.0002][.FAEE.0000.0000] -2F75 ; [.FB40.0020.0004][.FAF9.0000.0000] -2EAE ; [.FB40.0020.0004][.FAF9.0000.0000][.0000.010B.0004] -F9F8 ; [.FB40.0020.0002][.FB20.0000.0000] -3247 ; [.FB40.0020.0006][.FB8F.0000.0000] -FA56 ; [.FB40.0020.0002][.FBC0.0000.0000] -FAAD ; [.FB40.0020.0002][.FBC0.0000.0000] -2F962 ; [.FB40.0020.0002][.FBC6.0000.0000] -2F963 ; [.FB40.0020.0002][.FBC9.0000.0000] -F9A6 ; [.FB40.0020.0002][.FC3E.0000.0000] -F944 ; [.FB40.0020.0002][.FC60.0000.0000] -2F76 ; [.FB40.0020.0004][.FC73.0000.0000] -FAAE ; [.FB40.0020.0002][.FC7B.0000.0000] -F9F9 ; [.FB40.0020.0002][.FC92.0000.0000] -FA1D ; [.FB40.0020.0002][.FCBE.0000.0000] -2F966 ; [.FB40.0020.0002][.FCD2.0000.0000] -FA03 ; [.FB40.0020.0002][.FCD6.0000.0000] -2F969 ; [.FB40.0020.0002][.FCE3.0000.0000] -F97B ; [.FB40.0020.0002][.FCE7.0000.0000] -2F968 ; [.FB40.0020.0002][.FCE8.0000.0000] -2F77 ; [.FB40.0020.0004][.FCF8.0000.0000] -2EAF ; [.FB40.0020.0004][.FCF9.0000.0000] -2F96A ; [.FB40.0020.0002][.FD00.0000.0000] -F9CF ; [.FB40.0020.0002][.FD10.0000.0000] -F96A ; [.FB40.0020.0002][.FD22.0000.0000] -F94F ; [.FB40.0020.0002][.FD2F.0000.0000] -1F221 ; [.FB40.0020.001C][.FD42.0000.0000] -FAAF ; [.FB40.0020.0002][.FD5B.0000.0000] -2F96C ; [.FB40.0020.0002][.FD63.0000.0000] -F93D ; [.FB40.0020.0002][.FDA0.0000.0000] -F957 ; [.FB40.0020.0002][.FDBE.0000.0000] -2F96E ; [.FB40.0020.0002][.FDC7.0000.0000] -F996 ; [.FB40.0020.0002][.FDF4.0000.0000] -FA57 ; [.FB40.0020.0002][.FDF4.0000.0000] -FAB0 ; [.FB40.0020.0002][.FDF4.0000.0000] -2F96F ; [.FB40.0020.0002][.FE02.0000.0000] -FA58 ; [.FB40.0020.0002][.FE09.0000.0000] -F950 ; [.FB40.0020.0002][.FE37.0000.0000] -FA59 ; [.FB40.0020.0002][.FE41.0000.0000] -2F970 ; [.FB40.0020.0002][.FE45.0000.0000] -2EB0 ; [.FB40.0020.0004][.FE9F.0000.0000] -2F78 ; [.FB40.0020.0004][.FF36.0000.0000] -FAB1 ; [.FB40.0020.0002][.FF3E.0000.0000] -2F79 ; [.FB40.0020.0004][.FF51.0000.0000] -2EB2 ; [.FB40.0020.0004][.FF52.0000.0000] -2EB5 ; [.FB40.0020.0004][.FF52.0000.0000][.0000.010B.0004] -2EB1 ; [.FB40.0020.0004][.FF53.0000.0000] -2EB3 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.010B.0004] -2EB4 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.010C.0004] -FA5A ; [.FB40.0020.0002][.FF72.0000.0000] -F9E6 ; [.FB40.0020.0002][.FF79.0000.0000] -2F976 ; [.FB40.0020.0002][.FF7A.0000.0000] -F90F ; [.FB40.0020.0002][.FF85.0000.0000] -2F7A ; [.FB40.0020.0004][.FF8A.0000.0000] -2EB6 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.010B.0004] -2EB7 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.010C.0004] -2EB8 ; [.FB40.0020.0004][.FF8B.0000.0000] -2F978 ; [.FB40.0020.0002][.FF95.0000.0000] -F9AF ; [.FB40.0020.0002][.FF9A.0000.0000] -FA1E ; [.FB40.0020.0002][.FFBD.0000.0000] -2F7B ; [.FB40.0020.0004][.FFBD.0000.0000] -2F979 ; [.FB40.0020.0002][.FFFA.0000.0000] -F934 ; [.FB41.0020.0002][.8001.0000.0000] -2F7C ; [.FB41.0020.0004][.8001.0000.0000] -2EB9 ; [.FB41.0020.0004][.8002.0000.0000] -FA5B ; [.FB41.0020.0002][.8005.0000.0000] -FAB2 ; [.FB41.0020.0002][.8005.0000.0000] -2F97A ; [.FB41.0020.0002][.8005.0000.0000] -2F7D ; [.FB41.0020.0004][.800C.0000.0000] -2F7E ; [.FB41.0020.0004][.8012.0000.0000] -2F7F ; [.FB41.0020.0004][.8033.0000.0000] -F9B0 ; [.FB41.0020.0002][.8046.0000.0000] -2F97D ; [.FB41.0020.0002][.8060.0000.0000] -F997 ; [.FB41.0020.0002][.806F.0000.0000] -2F97F ; [.FB41.0020.0002][.8070.0000.0000] -F945 ; [.FB41.0020.0002][.807E.0000.0000] -2F80 ; [.FB41.0020.0004][.807F.0000.0000] -2EBB ; [.FB41.0020.0004][.807F.0000.0000][.0000.010B.0004] -2EBA ; [.FB41.0020.0004][.8080.0000.0000] -2F81 ; [.FB41.0020.0004][.8089.0000.0000] -2EBC ; [.FB41.0020.0004][.8089.0000.0000][.0000.010B.0004] -F953 ; [.FB41.0020.0002][.808B.0000.0000] -2F8D6 ; [.FB41.0020.0002][.80AD.0000.0000] -2F982 ; [.FB41.0020.0002][.80B2.0000.0000] -2F983 ; [.FB41.0020.0002][.8103.0000.0000] -2F985 ; [.FB41.0020.0002][.813E.0000.0000] -F926 ; [.FB41.0020.0002][.81D8.0000.0000] -2F82 ; [.FB41.0020.0004][.81E3.0000.0000] -F9F6 ; [.FB41.0020.0002][.81E8.0000.0000] -2F83 ; [.FB41.0020.0004][.81EA.0000.0000] -3242 ; [*0310.0020.0004][.FB41.0020.0004][.81EA.0000.0000][*0311.0020.0004] -FA5C ; [.FB41.0020.0002][.81ED.0000.0000] -2F84 ; [.FB41.0020.0004][.81F3.0000.0000] -3243 ; [*0310.0020.0004][.FB41.0020.0004][.81F3.0000.0000][*0311.0020.0004] -2F85 ; [.FB41.0020.0004][.81FC.0000.0000] -2EBD ; [.FB41.0020.0004][.81FC.0000.0000][.0000.010B.0004] -2F893 ; [.FB41.0020.0002][.8201.0000.0000] -2F98B ; [.FB41.0020.0002][.8201.0000.0000] -2F98C ; [.FB41.0020.0002][.8204.0000.0000] -2F86 ; [.FB41.0020.0004][.820C.0000.0000] -FA6D ; [.FB41.0020.0002][.8218.0000.0000] -2F87 ; [.FB41.0020.0004][.821B.0000.0000] -2F88 ; [.FB41.0020.0004][.821F.0000.0000] -2F89 ; [.FB41.0020.0004][.826E.0000.0000] -F97C ; [.FB41.0020.0002][.826F.0000.0000] -2F8A ; [.FB41.0020.0004][.8272.0000.0000] -2F8B ; [.FB41.0020.0004][.8278.0000.0000] -FA5D ; [.FB41.0020.0002][.8279.0000.0000] -FA5E ; [.FB41.0020.0002][.8279.0000.0000] -2EBE ; [.FB41.0020.0004][.8279.0000.0000] -2EBF ; [.FB41.0020.0004][.8279.0000.0000][.0000.010B.0004] -2EC0 ; [.FB41.0020.0004][.8279.0000.0000][.0000.010C.0004] -2F990 ; [.FB41.0020.0002][.828B.0000.0000] -2F98F ; [.FB41.0020.0002][.8291.0000.0000] -2F991 ; [.FB41.0020.0002][.829D.0000.0000] -2F993 ; [.FB41.0020.0002][.82B1.0000.0000] -2F994 ; [.FB41.0020.0002][.82B3.0000.0000] -2F995 ; [.FB41.0020.0002][.82BD.0000.0000] -F974 ; [.FB41.0020.0002][.82E5.0000.0000] -2F998 ; [.FB41.0020.0002][.82E5.0000.0000] -2F996 ; [.FB41.0020.0002][.82E6.0000.0000] -2F999 ; [.FB41.0020.0002][.831D.0000.0000] -2F99C ; [.FB41.0020.0002][.8323.0000.0000] -F9FE ; [.FB41.0020.0002][.8336.0000.0000] -FAB3 ; [.FB41.0020.0002][.8352.0000.0000] -2F9A0 ; [.FB41.0020.0002][.8353.0000.0000] -2F99A ; [.FB41.0020.0002][.8363.0000.0000] -2F99B ; [.FB41.0020.0002][.83AD.0000.0000] -2F99D ; [.FB41.0020.0002][.83BD.0000.0000] -F93E ; [.FB41.0020.0002][.83C9.0000.0000] -2F9A1 ; [.FB41.0020.0002][.83CA.0000.0000] -2F9A2 ; [.FB41.0020.0002][.83CC.0000.0000] -2F9A3 ; [.FB41.0020.0002][.83DC.0000.0000] -2F99E ; [.FB41.0020.0002][.83E7.0000.0000] -FAB4 ; [.FB41.0020.0002][.83EF.0000.0000] -F958 ; [.FB41.0020.0002][.83F1.0000.0000] -F918 ; [.FB41.0020.0002][.843D.0000.0000] -F96E ; [.FB41.0020.0002][.8449.0000.0000] -FA5F ; [.FB41.0020.0002][.8457.0000.0000] -2F99F ; [.FB41.0020.0002][.8457.0000.0000] -F999 ; [.FB41.0020.0002][.84EE.0000.0000] -2F9A8 ; [.FB41.0020.0002][.84F1.0000.0000] -2F9A9 ; [.FB41.0020.0002][.84F3.0000.0000] -F9C2 ; [.FB41.0020.0002][.84FC.0000.0000] -2F9AA ; [.FB41.0020.0002][.8516.0000.0000] -2F9AC ; [.FB41.0020.0002][.8564.0000.0000] -F923 ; [.FB41.0020.0002][.85CD.0000.0000] -F9F0 ; [.FB41.0020.0002][.85FA.0000.0000] -F935 ; [.FB41.0020.0002][.8606.0000.0000] -FA20 ; [.FB41.0020.0002][.8612.0000.0000] -F91F ; [.FB41.0020.0002][.862D.0000.0000] -F910 ; [.FB41.0020.0002][.863F.0000.0000] -2F8C ; [.FB41.0020.0004][.864D.0000.0000] -2EC1 ; [.FB41.0020.0004][.864E.0000.0000] -2F9B3 ; [.FB41.0020.0002][.8650.0000.0000] -F936 ; [.FB41.0020.0002][.865C.0000.0000] -2F9B4 ; [.FB41.0020.0002][.865C.0000.0000] -2F9B5 ; [.FB41.0020.0002][.8667.0000.0000] -2F9B6 ; [.FB41.0020.0002][.8669.0000.0000] -2F8D ; [.FB41.0020.0004][.866B.0000.0000] -2F9B8 ; [.FB41.0020.0002][.8688.0000.0000] -2F9B7 ; [.FB41.0020.0002][.86A9.0000.0000] -2F9BA ; [.FB41.0020.0002][.86E2.0000.0000] -2F9B9 ; [.FB41.0020.0002][.870E.0000.0000] -2F9BC ; [.FB41.0020.0002][.8728.0000.0000] -2F9BD ; [.FB41.0020.0002][.876B.0000.0000] -FAB5 ; [.FB41.0020.0002][.8779.0000.0000] -2F9BB ; [.FB41.0020.0002][.8779.0000.0000] -2F9BE ; [.FB41.0020.0002][.8786.0000.0000] -F911 ; [.FB41.0020.0002][.87BA.0000.0000] -2F9C0 ; [.FB41.0020.0002][.87E1.0000.0000] -2F9C1 ; [.FB41.0020.0002][.8801.0000.0000] -F927 ; [.FB41.0020.0002][.881F.0000.0000] -2F8E ; [.FB41.0020.0004][.8840.0000.0000] -FA08 ; [.FB41.0020.0002][.884C.0000.0000] -2F8F ; [.FB41.0020.0004][.884C.0000.0000] -2F9C3 ; [.FB41.0020.0002][.8860.0000.0000] -2F9C4 ; [.FB41.0020.0002][.8863.0000.0000] -2F90 ; [.FB41.0020.0004][.8863.0000.0000] -2EC2 ; [.FB41.0020.0004][.8864.0000.0000] -F9A0 ; [.FB41.0020.0002][.88C2.0000.0000] -F9E7 ; [.FB41.0020.0002][.88CF.0000.0000] -2F9C6 ; [.FB41.0020.0002][.88D7.0000.0000] -2F9C7 ; [.FB41.0020.0002][.88DE.0000.0000] -F9E8 ; [.FB41.0020.0002][.88E1.0000.0000] -F912 ; [.FB41.0020.0002][.88F8.0000.0000] -2F9C9 ; [.FB41.0020.0002][.88FA.0000.0000] -FA60 ; [.FB41.0020.0002][.8910.0000.0000] -FAB6 ; [.FB41.0020.0002][.8941.0000.0000] -F924 ; [.FB41.0020.0002][.8964.0000.0000] -2F91 ; [.FB41.0020.0004][.897E.0000.0000] -2EC4 ; [.FB41.0020.0004][.897F.0000.0000] -2EC3 ; [.FB41.0020.0004][.8980.0000.0000] -FAB7 ; [.FB41.0020.0002][.8986.0000.0000] -FA0A ; [.FB41.0020.0002][.898B.0000.0000] -2F92 ; [.FB41.0020.0004][.898B.0000.0000] -FA61 ; [.FB41.0020.0002][.8996.0000.0000] -FAB8 ; [.FB41.0020.0002][.8996.0000.0000] -2EC5 ; [.FB41.0020.0004][.89C1.0000.0000] -2EC6 ; [.FB41.0020.0004][.89D2.0000.0000] -2F93 ; [.FB41.0020.0004][.89D2.0000.0000] -2EC7 ; [.FB41.0020.0004][.89D2.0000.0000][.0000.010B.0004] -1F216 ; [.FB41.0020.001C][.89E3.0000.0000] -2F94 ; [.FB41.0020.0004][.8A00.0000.0000] -2F9CF ; [.FB41.0020.0002][.8AA0.0000.0000] -F96F ; [.FB41.0020.0002][.8AAA.0000.0000] -F9A1 ; [.FB41.0020.0002][.8AAA.0000.0000] -FAB9 ; [.FB41.0020.0002][.8ABF.0000.0000] -FABB ; [.FB41.0020.0002][.8ACB.0000.0000] -F97D ; [.FB41.0020.0002][.8AD2.0000.0000] -F941 ; [.FB41.0020.0002][.8AD6.0000.0000] -FABE ; [.FB41.0020.0002][.8AED.0000.0000] -2F9D0 ; [.FB41.0020.0002][.8AED.0000.0000] -FA22 ; [.FB41.0020.0002][.8AF8.0000.0000] -FABA ; [.FB41.0020.0002][.8AF8.0000.0000] -F95D ; [.FB41.0020.0002][.8AFE.0000.0000] -FABD ; [.FB41.0020.0002][.8AFE.0000.0000] -FA62 ; [.FB41.0020.0002][.8B01.0000.0000] -FABC ; [.FB41.0020.0002][.8B01.0000.0000] -FA63 ; [.FB41.0020.0002][.8B39.0000.0000] -FABF ; [.FB41.0020.0002][.8B39.0000.0000] -F9FC ; [.FB41.0020.0002][.8B58.0000.0000] -F95A ; [.FB41.0020.0002][.8B80.0000.0000] -FAC0 ; [.FB41.0020.0002][.8B8A.0000.0000] -2F9D1 ; [.FB41.0020.0002][.8B8A.0000.0000] -2EC8 ; [.FB41.0020.0004][.8BA0.0000.0000] -2F95 ; [.FB41.0020.0004][.8C37.0000.0000] -2F96 ; [.FB41.0020.0004][.8C46.0000.0000] -F900 ; [.FB41.0020.0002][.8C48.0000.0000] -2F9D2 ; [.FB41.0020.0002][.8C55.0000.0000] -2F97 ; [.FB41.0020.0004][.8C55.0000.0000] -2F98 ; [.FB41.0020.0004][.8C78.0000.0000] -2F99 ; [.FB41.0020.0004][.8C9D.0000.0000] -3236 ; [*0310.0020.0004][.FB41.0020.0004][.8CA1.0000.0000][*0311.0020.0004] -3296 ; [.FB41.0020.0006][.8CA1.0000.0000] -1F223 ; [.FB41.0020.001C][.8CA9.0000.0000] -2F9D4 ; [.FB41.0020.0002][.8CAB.0000.0000] -2F9D5 ; [.FB41.0020.0002][.8CC1.0000.0000] -F948 ; [.FB41.0020.0002][.8CC2.0000.0000] -323E ; [*0310.0020.0004][.FB41.0020.0004][.8CC7.0000.0000][*0311.0020.0004] -32AE ; [.FB41.0020.0006][.8CC7.0000.0000] -F903 ; [.FB41.0020.0002][.8CC8.0000.0000] -FA64 ; [.FB41.0020.0002][.8CD3.0000.0000] -FA65 ; [.FB41.0020.0002][.8D08.0000.0000] -FAC1 ; [.FB41.0020.0002][.8D08.0000.0000] -2F9D6 ; [.FB41.0020.0002][.8D1B.0000.0000] -2EC9 ; [.FB41.0020.0004][.8D1D.0000.0000] -2F9A ; [.FB41.0020.0004][.8D64.0000.0000] -2F9B ; [.FB41.0020.0004][.8D70.0000.0000] -1F230 ; [.FB41.0020.001C][.8D70.0000.0000] -2F9D7 ; [.FB41.0020.0002][.8D77.0000.0000] -2F9C ; [.FB41.0020.0004][.8DB3.0000.0000] -2ECA ; [.FB41.0020.0004][.8DB3.0000.0000][.0000.010B.0004] -2F9DB ; [.FB41.0020.0002][.8DBC.0000.0000] -2F9DA ; [.FB41.0020.0002][.8DCB.0000.0000] -F937 ; [.FB41.0020.0002][.8DEF.0000.0000] -2F9DC ; [.FB41.0020.0002][.8DF0.0000.0000] -2F9D ; [.FB41.0020.0004][.8EAB.0000.0000] -F902 ; [.FB41.0020.0002][.8ECA.0000.0000] -2F9E ; [.FB41.0020.0004][.8ECA.0000.0000] -2F9DE ; [.FB41.0020.0002][.8ED4.0000.0000] -F998 ; [.FB41.0020.0002][.8F26.0000.0000] -F9D7 ; [.FB41.0020.0002][.8F2A.0000.0000] -FAC2 ; [.FB41.0020.0002][.8F38.0000.0000] -2F9DF ; [.FB41.0020.0002][.8F38.0000.0000] -FA07 ; [.FB41.0020.0002][.8F3B.0000.0000] -F98D ; [.FB41.0020.0002][.8F62.0000.0000] -2ECB ; [.FB41.0020.0004][.8F66.0000.0000] -2F9F ; [.FB41.0020.0004][.8F9B.0000.0000] -2F98D ; [.FB41.0020.0002][.8F9E.0000.0000] -F971 ; [.FB41.0020.0002][.8FB0.0000.0000] -2FA0 ; [.FB41.0020.0004][.8FB0.0000.0000] -2FA1 ; [.FB41.0020.0004][.8FB5.0000.0000] -FA66 ; [.FB41.0020.0002][.8FB6.0000.0000] -2ECC ; [.FB41.0020.0004][.8FB6.0000.0000] -2ECD ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.010B.0004] -2ECE ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.010C.0004] -F99A ; [.FB41.0020.0002][.9023.0000.0000] -FA25 ; [.FB41.0020.0002][.9038.0000.0000] -FA67 ; [.FB41.0020.0002][.9038.0000.0000] -1F22B ; [.FB41.0020.001C][.904A.0000.0000] -329C ; [.FB41.0020.0006][.9069.0000.0000] -FAC3 ; [.FB41.0020.0002][.9072.0000.0000] -F9C3 ; [.FB41.0020.0002][.907C.0000.0000] -F913 ; [.FB41.0020.0002][.908F.0000.0000] -2FA2 ; [.FB41.0020.0004][.9091.0000.0000] -2ECF ; [.FB41.0020.0004][.9091.0000.0000][.0000.010B.0004] -2F9E2 ; [.FB41.0020.0002][.9094.0000.0000] -F92C ; [.FB41.0020.0002][.90CE.0000.0000] -FA2E ; [.FB41.0020.0002][.90DE.0000.0000] -2F9E3 ; [.FB41.0020.0002][.90F1.0000.0000] -FA26 ; [.FB41.0020.0002][.90FD.0000.0000] -2F9E4 ; [.FB41.0020.0002][.9111.0000.0000] -2F9E6 ; [.FB41.0020.0002][.911B.0000.0000] -2FA3 ; [.FB41.0020.0004][.9149.0000.0000] -F919 ; [.FB41.0020.0002][.916A.0000.0000] -FAC4 ; [.FB41.0020.0002][.9199.0000.0000] -F9B7 ; [.FB41.0020.0002][.91B4.0000.0000] -2FA4 ; [.FB41.0020.0004][.91C6.0000.0000] -F9E9 ; [.FB41.0020.0002][.91CC.0000.0000] -2FA5 ; [.FB41.0020.0004][.91CC.0000.0000] -F97E ; [.FB41.0020.0002][.91CF.0000.0000] -F90A ; [.FB41.0020.0002][.91D1.0000.0000] -2FA6 ; [.FB41.0020.0004][.91D1.0000.0000] -322E ; [*0310.0020.0004][.FB41.0020.0004][.91D1.0000.0000][*0311.0020.0004] -328E ; [.FB41.0020.0006][.91D1.0000.0000] -F9B1 ; [.FB41.0020.0002][.9234.0000.0000] -2F9E7 ; [.FB41.0020.0002][.9238.0000.0000] -FAC5 ; [.FB41.0020.0002][.9276.0000.0000] -2F9EA ; [.FB41.0020.0002][.927C.0000.0000] -2F9E8 ; [.FB41.0020.0002][.92D7.0000.0000] -2F9E9 ; [.FB41.0020.0002][.92D8.0000.0000] -F93F ; [.FB41.0020.0002][.9304.0000.0000] -F99B ; [.FB41.0020.0002][.934A.0000.0000] -2F9EB ; [.FB41.0020.0002][.93F9.0000.0000] -2F9EC ; [.FB41.0020.0002][.9415.0000.0000] -2ED0 ; [.FB41.0020.0004][.9485.0000.0000] -2ED1 ; [.FB41.0020.0004][.9577.0000.0000] -2FA7 ; [.FB41.0020.0004][.9577.0000.0000] -2ED2 ; [.FB41.0020.0004][.9578.0000.0000] -2ED3 ; [.FB41.0020.0004][.957F.0000.0000] -2FA8 ; [.FB41.0020.0004][.9580.0000.0000] -2F9EE ; [.FB41.0020.0002][.958B.0000.0000] -F986 ; [.FB41.0020.0002][.95AD.0000.0000] -2F9F0 ; [.FB41.0020.0002][.95B7.0000.0000] -2ED4 ; [.FB41.0020.0004][.95E8.0000.0000] -2FA9 ; [.FB41.0020.0004][.961C.0000.0000] -2ED5 ; [.FB41.0020.0004][.961C.0000.0000][.0000.010B.0004] -2ED6 ; [.FB41.0020.0004][.961D.0000.0000] -F9C6 ; [.FB41.0020.0002][.962E.0000.0000] -F951 ; [.FB41.0020.0002][.964B.0000.0000] -FA09 ; [.FB41.0020.0002][.964D.0000.0000] -F959 ; [.FB41.0020.0002][.9675.0000.0000] -F9D3 ; [.FB41.0020.0002][.9678.0000.0000] -FAC6 ; [.FB41.0020.0002][.967C.0000.0000] -F9DC ; [.FB41.0020.0002][.9686.0000.0000] -F9F1 ; [.FB41.0020.0002][.96A3.0000.0000] -2FAA ; [.FB41.0020.0004][.96B6.0000.0000] -FA2F ; [.FB41.0020.0002][.96B7.0000.0000] -F9B8 ; [.FB41.0020.0002][.96B8.0000.0000] -2FAB ; [.FB41.0020.0004][.96B9.0000.0000] -2F9F3 ; [.FB41.0020.0002][.96C3.0000.0000] -F9EA ; [.FB41.0020.0002][.96E2.0000.0000] -FA68 ; [.FB41.0020.0002][.96E3.0000.0000] -FAC7 ; [.FB41.0020.0002][.96E3.0000.0000] -2FAC ; [.FB41.0020.0004][.96E8.0000.0000] -2ED7 ; [.FB41.0020.0004][.96E8.0000.0000][.0000.010B.0004] -F9B2 ; [.FB41.0020.0002][.96F6.0000.0000] -F949 ; [.FB41.0020.0002][.96F7.0000.0000] -2F9F5 ; [.FB41.0020.0002][.9723.0000.0000] -F938 ; [.FB41.0020.0002][.9732.0000.0000] -F9B3 ; [.FB41.0020.0002][.9748.0000.0000] -2FAD ; [.FB41.0020.0004][.9751.0000.0000] -2ED8 ; [.FB41.0020.0004][.9752.0000.0000] -FA1C ; [.FB41.0020.0002][.9756.0000.0000] -FAC8 ; [.FB41.0020.0002][.9756.0000.0000] -2FAE ; [.FB41.0020.0004][.975E.0000.0000] -2FAF ; [.FB41.0020.0004][.9762.0000.0000] -2FB0 ; [.FB41.0020.0004][.9769.0000.0000] -2FB1 ; [.FB41.0020.0004][.97CB.0000.0000] -FAC9 ; [.FB41.0020.0002][.97DB.0000.0000] -2F9FA ; [.FB41.0020.0002][.97E0.0000.0000] -2ED9 ; [.FB41.0020.0004][.97E6.0000.0000] -2FB2 ; [.FB41.0020.0004][.97ED.0000.0000] -2FB3 ; [.FB41.0020.0004][.97F3.0000.0000] -FA69 ; [.FB41.0020.0002][.97FF.0000.0000] -FACA ; [.FB41.0020.0002][.97FF.0000.0000] -2FB4 ; [.FB41.0020.0004][.9801.0000.0000] -32A0 ; [.FB41.0020.0006][.9805.0000.0000] -FACB ; [.FB41.0020.0002][.980B.0000.0000] -2F9FE ; [.FB41.0020.0002][.980B.0000.0000] -2F9FF ; [.FB41.0020.0002][.980B.0000.0000] -F9B4 ; [.FB41.0020.0002][.9818.0000.0000] -2FA00 ; [.FB41.0020.0002][.9829.0000.0000] -FA6A ; [.FB41.0020.0002][.983B.0000.0000] -FACC ; [.FB41.0020.0002][.983B.0000.0000] -F9D0 ; [.FB41.0020.0002][.985E.0000.0000] -2EDA ; [.FB41.0020.0004][.9875.0000.0000] -2FB5 ; [.FB41.0020.0004][.98A8.0000.0000] -2EDB ; [.FB41.0020.0004][.98CE.0000.0000] -2FB6 ; [.FB41.0020.0004][.98DB.0000.0000] -2EDC ; [.FB41.0020.0004][.98DE.0000.0000] -2EDD ; [.FB41.0020.0004][.98DF.0000.0000] -2FB7 ; [.FB41.0020.0004][.98DF.0000.0000] -2EDF ; [.FB41.0020.0004][.98E0.0000.0000] -2EDE ; [.FB41.0020.0004][.98E0.0000.0000][.0000.010B.0004] -2FA02 ; [.FB41.0020.0002][.98E2.0000.0000] -FA2A ; [.FB41.0020.0002][.98EF.0000.0000] -FA2B ; [.FB41.0020.0002][.98FC.0000.0000] -FA2C ; [.FB41.0020.0002][.9928.0000.0000] -2FA04 ; [.FB41.0020.0002][.9929.0000.0000] -2EE0 ; [.FB41.0020.0004][.9963.0000.0000] -2FB8 ; [.FB41.0020.0004][.9996.0000.0000] -2EE1 ; [.FB41.0020.0004][.9996.0000.0000][.0000.010B.0004] -2FB9 ; [.FB41.0020.0004][.9999.0000.0000] -2FA05 ; [.FB41.0020.0002][.99A7.0000.0000] -2FBA ; [.FB41.0020.0004][.99AC.0000.0000] -2FA06 ; [.FB41.0020.0002][.99C2.0000.0000] -F91A ; [.FB41.0020.0002][.99F1.0000.0000] -2FA07 ; [.FB41.0020.0002][.99FE.0000.0000] -F987 ; [.FB41.0020.0002][.9A6A.0000.0000] -2EE2 ; [.FB41.0020.0004][.9A6C.0000.0000] -2FBB ; [.FB41.0020.0004][.9AA8.0000.0000] -2EE3 ; [.FB41.0020.0004][.9AA8.0000.0000][.0000.010B.0004] -2FBC ; [.FB41.0020.0004][.9AD8.0000.0000] -2FBD ; [.FB41.0020.0004][.9ADF.0000.0000] -FACD ; [.FB41.0020.0002][.9B12.0000.0000] -2FA0A ; [.FB41.0020.0002][.9B12.0000.0000] -2FBE ; [.FB41.0020.0004][.9B25.0000.0000] -2FBF ; [.FB41.0020.0004][.9B2F.0000.0000] -2FC0 ; [.FB41.0020.0004][.9B32.0000.0000] -2FC1 ; [.FB41.0020.0004][.9B3C.0000.0000] -2EE4 ; [.FB41.0020.0004][.9B3C.0000.0000][.0000.010B.0004] -2FC2 ; [.FB41.0020.0004][.9B5A.0000.0000] -F939 ; [.FB41.0020.0002][.9B6F.0000.0000] -2FA0B ; [.FB41.0020.0002][.9C40.0000.0000] -F9F2 ; [.FB41.0020.0002][.9C57.0000.0000] -2EE5 ; [.FB41.0020.0004][.9C7C.0000.0000] -2FC3 ; [.FB41.0020.0004][.9CE5.0000.0000] -2FA0C ; [.FB41.0020.0002][.9CFD.0000.0000] -2FA0F ; [.FB41.0020.0002][.9D67.0000.0000] -FA2D ; [.FB41.0020.0002][.9DB4.0000.0000] -F93A ; [.FB41.0020.0002][.9DFA.0000.0000] -F920 ; [.FB41.0020.0002][.9E1E.0000.0000] -2EE6 ; [.FB41.0020.0004][.9E1F.0000.0000] -2FC4 ; [.FB41.0020.0004][.9E75.0000.0000] -2EE7 ; [.FB41.0020.0004][.9E75.0000.0000][.0000.010B.0004] -F940 ; [.FB41.0020.0002][.9E7F.0000.0000] -2FC5 ; [.FB41.0020.0004][.9E7F.0000.0000] -F988 ; [.FB41.0020.0002][.9E97.0000.0000] -F9F3 ; [.FB41.0020.0002][.9E9F.0000.0000] -2FC6 ; [.FB41.0020.0004][.9EA5.0000.0000] -2EE8 ; [.FB41.0020.0004][.9EA6.0000.0000] -2FA15 ; [.FB41.0020.0002][.9EBB.0000.0000] -2FC7 ; [.FB41.0020.0004][.9EBB.0000.0000] -2FC8 ; [.FB41.0020.0004][.9EC3.0000.0000] -2EE9 ; [.FB41.0020.0004][.9EC4.0000.0000] -2FC9 ; [.FB41.0020.0004][.9ECD.0000.0000] -F989 ; [.FB41.0020.0002][.9ECE.0000.0000] -2FCA ; [.FB41.0020.0004][.9ED1.0000.0000] -2FA17 ; [.FB41.0020.0002][.9EF9.0000.0000] -2FCB ; [.FB41.0020.0004][.9EF9.0000.0000] -2FCC ; [.FB41.0020.0004][.9EFD.0000.0000] -2FA18 ; [.FB41.0020.0002][.9EFE.0000.0000] -2EEA ; [.FB41.0020.0004][.9EFE.0000.0000] -2FA19 ; [.FB41.0020.0002][.9F05.0000.0000] -2FCD ; [.FB41.0020.0004][.9F0E.0000.0000] -2FA1A ; [.FB41.0020.0002][.9F0F.0000.0000] -2FCE ; [.FB41.0020.0004][.9F13.0000.0000] -2FA1B ; [.FB41.0020.0002][.9F16.0000.0000] -2FCF ; [.FB41.0020.0004][.9F20.0000.0000] -2FA1C ; [.FB41.0020.0002][.9F3B.0000.0000] -2FD0 ; [.FB41.0020.0004][.9F3B.0000.0000] -FAD8 ; [.FB41.0020.0002][.9F43.0000.0000] -2FD1 ; [.FB41.0020.0004][.9F4A.0000.0000] -2EEB ; [.FB41.0020.0004][.9F4A.0000.0000][.0000.010B.0004] -2EEC ; [.FB41.0020.0004][.9F50.0000.0000] -2FD2 ; [.FB41.0020.0004][.9F52.0000.0000] -2EED ; [.FB41.0020.0004][.9F52.0000.0000][.0000.010B.0004] -2EEE ; [.FB41.0020.0004][.9F7F.0000.0000] -F9C4 ; [.FB41.0020.0002][.9F8D.0000.0000] -2FD3 ; [.FB41.0020.0004][.9F8D.0000.0000] -2EEF ; [.FB41.0020.0004][.9F8D.0000.0000][.0000.010B.0004] -FAD9 ; [.FB41.0020.0002][.9F8E.0000.0000] -2EF0 ; [.FB41.0020.0004][.9F99.0000.0000] -F907 ; [.FB41.0020.0002][.9F9C.0000.0000] -F908 ; [.FB41.0020.0002][.9F9C.0000.0000] -FACE ; [.FB41.0020.0002][.9F9C.0000.0000] -2FD4 ; [.FB41.0020.0004][.9F9C.0000.0000] -2EF1 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.010B.0004] -2EF2 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.010C.0004] -2EF3 ; [.FB41.0020.0004][.9F9F.0000.0000] -2FD5 ; [.FB41.0020.0004][.9FA0.0000.0000] -FA0E ; [.FB41.0020.0002][.FA0E.0000.0000] -FA0F ; [.FB41.0020.0002][.FA0F.0000.0000] -FA11 ; [.FB41.0020.0002][.FA11.0000.0000] -FA13 ; [.FB41.0020.0002][.FA13.0000.0000] -FA14 ; [.FB41.0020.0002][.FA14.0000.0000] -FA1F ; [.FB41.0020.0002][.FA1F.0000.0000] -FA21 ; [.FB41.0020.0002][.FA21.0000.0000] -FA23 ; [.FB41.0020.0002][.FA23.0000.0000] -FA24 ; [.FB41.0020.0002][.FA24.0000.0000] -FA27 ; [.FB41.0020.0002][.FA27.0000.0000] -FA28 ; [.FB41.0020.0002][.FA28.0000.0000] -FA29 ; [.FB41.0020.0002][.FA29.0000.0000] -2F80C ; [.FB80.0020.0002][.B49E.0000.0000] -2F813 ; [.FB80.0020.0002][.B4B9.0000.0000] -2F9CA ; [.FB80.0020.0002][.B4BB.0000.0000] -2F81F ; [.FB80.0020.0002][.B4DF.0000.0000] -2F824 ; [.FB80.0020.0002][.B515.0000.0000] -2F867 ; [.FB80.0020.0002][.B6EE.0000.0000] -2F868 ; [.FB80.0020.0002][.B6FC.0000.0000] -2F876 ; [.FB80.0020.0002][.B781.0000.0000] -2F883 ; [.FB80.0020.0002][.B82F.0000.0000] -2F888 ; [.FB80.0020.0002][.B862.0000.0000] -2F88A ; [.FB80.0020.0002][.B87C.0000.0000] -2F896 ; [.FB80.0020.0002][.B8C7.0000.0000] -2F89B ; [.FB80.0020.0002][.B8E3.0000.0000] -2F8A2 ; [.FB80.0020.0002][.B91C.0000.0000] -2F8A1 ; [.FB80.0020.0002][.B93A.0000.0000] -2F8C2 ; [.FB80.0020.0002][.BA2E.0000.0000] -2F8C7 ; [.FB80.0020.0002][.BA6C.0000.0000] -2F8D1 ; [.FB80.0020.0002][.BAE4.0000.0000] -2F8D0 ; [.FB80.0020.0002][.BB08.0000.0000] -2F8CE ; [.FB80.0020.0002][.BB19.0000.0000] -2F8DE ; [.FB80.0020.0002][.BB49.0000.0000] -FAD2 ; [.FB80.0020.0002][.BB9D.0000.0000] -2F8E7 ; [.FB80.0020.0002][.BB9D.0000.0000] -2F8EE ; [.FB80.0020.0002][.BC18.0000.0000] -2F8F2 ; [.FB80.0020.0002][.BC4E.0000.0000] -2F90A ; [.FB80.0020.0002][.BD33.0000.0000] -2F916 ; [.FB80.0020.0002][.BD96.0000.0000] -2F92A ; [.FB80.0020.0002][.BEAC.0000.0000] -2F92C ; [.FB80.0020.0002][.BEB8.0000.0000] -2F92D ; [.FB80.0020.0002][.BEB8.0000.0000] -2F933 ; [.FB80.0020.0002][.BF1B.0000.0000] -2F93E ; [.FB80.0020.0002][.BFFC.0000.0000] -2F93F ; [.FB80.0020.0002][.C008.0000.0000] -FAD3 ; [.FB80.0020.0002][.C018.0000.0000] -FAD4 ; [.FB80.0020.0002][.C039.0000.0000] -2F949 ; [.FB80.0020.0002][.C039.0000.0000] -2F94B ; [.FB80.0020.0002][.C046.0000.0000] -2F94C ; [.FB80.0020.0002][.C096.0000.0000] -2F951 ; [.FB80.0020.0002][.C0E3.0000.0000] -2F958 ; [.FB80.0020.0002][.C12F.0000.0000] -2F960 ; [.FB80.0020.0002][.C202.0000.0000] -2F964 ; [.FB80.0020.0002][.C227.0000.0000] -2F967 ; [.FB80.0020.0002][.C2A0.0000.0000] -2F96D ; [.FB80.0020.0002][.C301.0000.0000] -2F971 ; [.FB80.0020.0002][.C334.0000.0000] -2F974 ; [.FB80.0020.0002][.C359.0000.0000] -2F981 ; [.FB80.0020.0002][.C3D5.0000.0000] -2F8D7 ; [.FB80.0020.0002][.C3D9.0000.0000] -2F984 ; [.FB80.0020.0002][.C40B.0000.0000] -2F98E ; [.FB80.0020.0002][.C46B.0000.0000] -2F9A7 ; [.FB80.0020.0002][.C52B.0000.0000] -2F9AE ; [.FB80.0020.0002][.C55D.0000.0000] -2F9AF ; [.FB80.0020.0002][.C561.0000.0000] -2F9B2 ; [.FB80.0020.0002][.C56B.0000.0000] -2F9BF ; [.FB80.0020.0002][.C5D7.0000.0000] -2F9C2 ; [.FB80.0020.0002][.C5F9.0000.0000] -2F9C8 ; [.FB80.0020.0002][.C635.0000.0000] -2F9CD ; [.FB80.0020.0002][.C6BE.0000.0000] -2F9CE ; [.FB80.0020.0002][.C6C7.0000.0000] -2F9EF ; [.FB80.0020.0002][.C995.0000.0000] -2F9F2 ; [.FB80.0020.0002][.C9E6.0000.0000] -2F9F8 ; [.FB80.0020.0002][.CA6E.0000.0000] -2F9F9 ; [.FB80.0020.0002][.CA76.0000.0000] -2F9FC ; [.FB80.0020.0002][.CAB2.0000.0000] -2FA03 ; [.FB80.0020.0002][.CB33.0000.0000] -2FA08 ; [.FB80.0020.0002][.CBCE.0000.0000] -2FA0D ; [.FB80.0020.0002][.CCCE.0000.0000] -2FA0E ; [.FB80.0020.0002][.CCED.0000.0000] -2FA11 ; [.FB80.0020.0002][.CCF8.0000.0000] -2FA16 ; [.FB80.0020.0002][.CD56.0000.0000] -2F803 ; [.FB84.0020.0002][.8122.0000.0000] -2F812 ; [.FB84.0020.0002][.851C.0000.0000] -2F91B ; [.FB84.0020.0002][.8525.0000.0000] -2F816 ; [.FB84.0020.0002][.854B.0000.0000] -2F80D ; [.FB84.0020.0002][.863A.0000.0000] -2F9D9 ; [.FB84.0020.0002][.8804.0000.0000] -2F9DD ; [.FB84.0020.0002][.88DE.0000.0000] -2F834 ; [.FB84.0020.0002][.8A2C.0000.0000] -2F838 ; [.FB84.0020.0002][.8B63.0000.0000] -2F859 ; [.FB84.0020.0002][.94E4.0000.0000] -2F860 ; [.FB84.0020.0002][.96A8.0000.0000] -2F861 ; [.FB84.0020.0002][.96EA.0000.0000] -2F86C ; [.FB84.0020.0002][.99C8.0000.0000] -2F871 ; [.FB84.0020.0002][.9B18.0000.0000] -2F8F8 ; [.FB84.0020.0002][.9D0B.0000.0000] -2F87B ; [.FB84.0020.0002][.9DE4.0000.0000] -2F87D ; [.FB84.0020.0002][.9DE6.0000.0000] -2F889 ; [.FB84.0020.0002][.A183.0000.0000] -2F939 ; [.FB84.0020.0002][.A19F.0000.0000] -2F891 ; [.FB84.0020.0002][.A331.0000.0000] -2F892 ; [.FB84.0020.0002][.A331.0000.0000] -2F8A4 ; [.FB84.0020.0002][.A6D4.0000.0000] -FAD0 ; [.FB84.0020.0002][.A844.0000.0000] -FACF ; [.FB84.0020.0002][.A84A.0000.0000] -2F8B8 ; [.FB84.0020.0002][.AB0C.0000.0000] -2F8BE ; [.FB84.0020.0002][.ABF1.0000.0000] -2F8CA ; [.FB84.0020.0002][.B00A.0000.0000] -2F897 ; [.FB84.0020.0002][.B2B8.0000.0000] -2F980 ; [.FB84.0020.0002][.B35F.0000.0000] -2F989 ; [.FB84.0020.0002][.B393.0000.0000] -2F98A ; [.FB84.0020.0002][.B39C.0000.0000] -2F8DD ; [.FB84.0020.0002][.B3C3.0000.0000] -FAD1 ; [.FB84.0020.0002][.B3D5.0000.0000] -2F8E3 ; [.FB84.0020.0002][.B46D.0000.0000] -2F8EC ; [.FB84.0020.0002][.B6A3.0000.0000] -2F8F0 ; [.FB84.0020.0002][.B8A7.0000.0000] -2F8F7 ; [.FB84.0020.0002][.BA8D.0000.0000] -2F8F9 ; [.FB84.0020.0002][.BAFA.0000.0000] -2F8FB ; [.FB84.0020.0002][.BCBC.0000.0000] -2F906 ; [.FB84.0020.0002][.BD1E.0000.0000] -2F90D ; [.FB84.0020.0002][.BED1.0000.0000] -2F910 ; [.FB84.0020.0002][.BF5E.0000.0000] -2F911 ; [.FB84.0020.0002][.BF8E.0000.0000] -2F91D ; [.FB84.0020.0002][.C263.0000.0000] -FA6C ; [.FB84.0020.0002][.C2EE.0000.0000] -2F91F ; [.FB84.0020.0002][.C3AB.0000.0000] -2F923 ; [.FB84.0020.0002][.C608.0000.0000] -2F926 ; [.FB84.0020.0002][.C735.0000.0000] -2F927 ; [.FB84.0020.0002][.C814.0000.0000] -2F935 ; [.FB84.0020.0002][.CC36.0000.0000] -2F937 ; [.FB84.0020.0002][.CC92.0000.0000] -2F93B ; [.FB84.0020.0002][.CFA1.0000.0000] -2F93C ; [.FB84.0020.0002][.CFB8.0000.0000] -2F93D ; [.FB84.0020.0002][.D044.0000.0000] -2F942 ; [.FB84.0020.0002][.D0F2.0000.0000] -2F941 ; [.FB84.0020.0002][.D0F3.0000.0000] -2F943 ; [.FB84.0020.0002][.D119.0000.0000] -2F944 ; [.FB84.0020.0002][.D133.0000.0000] -FAD5 ; [.FB84.0020.0002][.D249.0000.0000] -2F94D ; [.FB84.0020.0002][.D41D.0000.0000] -2F952 ; [.FB84.0020.0002][.D626.0000.0000] -2F954 ; [.FB84.0020.0002][.D69A.0000.0000] -2F955 ; [.FB84.0020.0002][.D6C5.0000.0000] -2F95C ; [.FB84.0020.0002][.D97C.0000.0000] -2F95D ; [.FB84.0020.0002][.DAA7.0000.0000] -2F95E ; [.FB84.0020.0002][.DAA7.0000.0000] -2F961 ; [.FB84.0020.0002][.DBAB.0000.0000] -2F965 ; [.FB84.0020.0002][.DC80.0000.0000] -FAD6 ; [.FB84.0020.0002][.DCD0.0000.0000] -2F96B ; [.FB84.0020.0002][.DF86.0000.0000] -2F898 ; [.FB84.0020.0002][.E1DA.0000.0000] -2F972 ; [.FB84.0020.0002][.E228.0000.0000] -2F973 ; [.FB84.0020.0002][.E247.0000.0000] -2F975 ; [.FB84.0020.0002][.E2D9.0000.0000] -2F977 ; [.FB84.0020.0002][.E33E.0000.0000] -2F97B ; [.FB84.0020.0002][.E4DA.0000.0000] -2F97C ; [.FB84.0020.0002][.E523.0000.0000] -2F97E ; [.FB84.0020.0002][.E5A8.0000.0000] -2F987 ; [.FB84.0020.0002][.E7A7.0000.0000] -2F988 ; [.FB84.0020.0002][.E7B5.0000.0000] -2F997 ; [.FB84.0020.0002][.EB3C.0000.0000] -2F9A4 ; [.FB84.0020.0002][.EC36.0000.0000] -2F9A6 ; [.FB84.0020.0002][.ECD5.0000.0000] -2F9A5 ; [.FB84.0020.0002][.ED6B.0000.0000] -2F9AD ; [.FB84.0020.0002][.EF2C.0000.0000] -2F9B0 ; [.FB84.0020.0002][.EFB1.0000.0000] -2F9B1 ; [.FB84.0020.0002][.F0D2.0000.0000] -2F9AB ; [.FB84.0020.0002][.F3CA.0000.0000] -2F9C5 ; [.FB84.0020.0002][.F667.0000.0000] -2F9CB ; [.FB84.0020.0002][.F8AE.0000.0000] -2F9CC ; [.FB84.0020.0002][.F966.0000.0000] -2F9D3 ; [.FB84.0020.0002][.FCA8.0000.0000] -FAD7 ; [.FB84.0020.0002][.FED3.0000.0000] -2F9D8 ; [.FB84.0020.0002][.FF2F.0000.0000] -2F9E0 ; [.FB85.0020.0002][.85D2.0000.0000] -2F9E1 ; [.FB85.0020.0002][.85ED.0000.0000] -2F9E5 ; [.FB85.0020.0002][.872E.0000.0000] -2F9ED ; [.FB85.0020.0002][.8BFA.0000.0000] -2F9F1 ; [.FB85.0020.0002][.8D77.0000.0000] -2F9F6 ; [.FB85.0020.0002][.9145.0000.0000] -2F81C ; [.FB85.0020.0002][.91DF.0000.0000] -2F9F7 ; [.FB85.0020.0002][.921A.0000.0000] -2F9FB ; [.FB85.0020.0002][.940A.0000.0000] -2F9FD ; [.FB85.0020.0002][.9496.0000.0000] -2FA01 ; [.FB85.0020.0002][.95B6.0000.0000] -2FA09 ; [.FB85.0020.0002][.9B30.0000.0000] -2FA10 ; [.FB85.0020.0002][.A0CE.0000.0000] -2FA12 ; [.FB85.0020.0002][.A105.0000.0000] -2FA13 ; [.FB85.0020.0002][.A20E.0000.0000] -2FA14 ; [.FB85.0020.0002][.A291.0000.0000] -2F88F ; [.FB85.0020.0002][.A392.0000.0000] -2FA1D ; [.FB85.0020.0002][.A600.0000.0000] -FFFD ; [.FFFD.0020.0002] +# unidata-8.0.0.txt +# Date: 2015-02-18, 15:42:57 GMT [KW] +# +# This file defines the Default Unicode Collation Element Table +# (DUCET) for the Unicode Collation Algorithm +# +# Copyright (c) 2001-2015 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# See UTS #10, Unicode Collation Algorithm, for more information. +# +# Diagnostic weight ranges +# Primary weight range: 0200..530C (20749) +# Secondary weight range: 0020..010F (240) +# Variant secondaries: 010B..010F (5) +# Tertiary weight range: 0002..001F (30) +# +@version 8.0.0 + +0000 ; [.0000.0000.0000] # NULL (in ISO 6429) +0001 ; [.0000.0000.0000] # START OF HEADING (in ISO 6429) +0002 ; [.0000.0000.0000] # START OF TEXT (in ISO 6429) +0003 ; [.0000.0000.0000] # END OF TEXT (in ISO 6429) +0004 ; [.0000.0000.0000] # END OF TRANSMISSION (in ISO 6429) +0005 ; [.0000.0000.0000] # ENQUIRY (in ISO 6429) +0006 ; [.0000.0000.0000] # ACKNOWLEDGE (in ISO 6429) +0007 ; [.0000.0000.0000] # BELL (in ISO 6429) +0008 ; [.0000.0000.0000] # BACKSPACE (in ISO 6429) +000E ; [.0000.0000.0000] # SHIFT OUT (in ISO 6429) +000F ; [.0000.0000.0000] # SHIFT IN (in ISO 6429) +0010 ; [.0000.0000.0000] # DATA LINK ESCAPE (in ISO 6429) +0011 ; [.0000.0000.0000] # DEVICE CONTROL ONE (in ISO 6429) +0012 ; [.0000.0000.0000] # DEVICE CONTROL TWO (in ISO 6429) +0013 ; [.0000.0000.0000] # DEVICE CONTROL THREE (in ISO 6429) +0014 ; [.0000.0000.0000] # DEVICE CONTROL FOUR (in ISO 6429) +0015 ; [.0000.0000.0000] # NEGATIVE ACKNOWLEDGE (in ISO 6429) +0016 ; [.0000.0000.0000] # SYNCHRONOUS IDLE (in ISO 6429) +0017 ; [.0000.0000.0000] # END OF TRANSMISSION BLOCK (in ISO 6429) +0018 ; [.0000.0000.0000] # CANCEL (in ISO 6429) +0019 ; [.0000.0000.0000] # END OF MEDIUM (in ISO 6429) +001A ; [.0000.0000.0000] # SUBSTITUTE (in ISO 6429) +001B ; [.0000.0000.0000] # ESCAPE (in ISO 6429) +001C ; [.0000.0000.0000] # FILE SEPARATOR (in ISO 6429) +001D ; [.0000.0000.0000] # GROUP SEPARATOR (in ISO 6429) +001E ; [.0000.0000.0000] # RECORD SEPARATOR (in ISO 6429) +001F ; [.0000.0000.0000] # UNIT SEPARATOR (in ISO 6429) +007F ; [.0000.0000.0000] # DELETE (in ISO 6429) +0080 ; [.0000.0000.0000] # <control> +0081 ; [.0000.0000.0000] # <control> +0082 ; [.0000.0000.0000] # BREAK PERMITTED HERE (in ISO 6429) +0083 ; [.0000.0000.0000] # NO BREAK HERE (in ISO 6429) +0084 ; [.0000.0000.0000] # <control> +0086 ; [.0000.0000.0000] # START OF SELECTED AREA (in ISO 6429) +0087 ; [.0000.0000.0000] # END OF SELECTED AREA (in ISO 6429) +0088 ; [.0000.0000.0000] # CHARACTER TABULATION SET (in ISO 6429) +0089 ; [.0000.0000.0000] # CHARACTER TABULATION WITH JUSTIFICATION (in ISO 6429) +008A ; [.0000.0000.0000] # LINE TABULATION SET (in ISO 6429) +008B ; [.0000.0000.0000] # PARTIAL LINE FORWARD (in ISO 6429) +008C ; [.0000.0000.0000] # PARTIAL LINE BACKWARD (in ISO 6429) +008D ; [.0000.0000.0000] # PARTIAL LINE FEED (in ISO 6429) +008E ; [.0000.0000.0000] # SINGLE SHIFT TWO (in ISO 6429) +008F ; [.0000.0000.0000] # SINGLE SHIFT THREE (in ISO 6429) +0090 ; [.0000.0000.0000] # DEVICE CONTROL STRING (in ISO 6429) +0091 ; [.0000.0000.0000] # PRIVATE USE ONE (in ISO 6429) +0092 ; [.0000.0000.0000] # PRIVATE USE TWO (in ISO 6429) +0093 ; [.0000.0000.0000] # SET TRANSMIT STATE (in ISO 6429) +0094 ; [.0000.0000.0000] # CANCEL CHARACTER (in ISO 6429) +0095 ; [.0000.0000.0000] # MESSAGE WAITING (in ISO 6429) +0096 ; [.0000.0000.0000] # START OF GUARDED AREA (in ISO 6429) +0097 ; [.0000.0000.0000] # END OF GUARDED AREA (in ISO 6429) +0098 ; [.0000.0000.0000] # START OF STRING (in ISO 6429) +0099 ; [.0000.0000.0000] # <control> +009A ; [.0000.0000.0000] # SINGLE CHARACTER INTRODUCER (in ISO 6429) +009B ; [.0000.0000.0000] # CONTROL SEQUENCE INTRODUCER (in ISO 6429) +009C ; [.0000.0000.0000] # STRING TERMINATOR (in ISO 6429) +009D ; [.0000.0000.0000] # OPERATING SYSTEM COMMAND (in ISO 6429) +009E ; [.0000.0000.0000] # PRIVACY MESSAGE (in ISO 6429) +009F ; [.0000.0000.0000] # APPLICATION PROGRAM COMMAND (in ISO 6429) +00AD ; [.0000.0000.0000] # SOFT HYPHEN +061C ; [.0000.0000.0000] # ARABIC LETTER MARK +070F ; [.0000.0000.0000] # SYRIAC ABBREVIATION MARK +180B ; [.0000.0000.0000] # MONGOLIAN FREE VARIATION SELECTOR ONE +180C ; [.0000.0000.0000] # MONGOLIAN FREE VARIATION SELECTOR TWO +180D ; [.0000.0000.0000] # MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; [.0000.0000.0000] # MONGOLIAN VOWEL SEPARATOR +200B ; [.0000.0000.0000] # ZERO WIDTH SPACE +200C ; [.0000.0000.0000] # ZERO WIDTH NON-JOINER +200D ; [.0000.0000.0000] # ZERO WIDTH JOINER +200E ; [.0000.0000.0000] # LEFT-TO-RIGHT MARK +200F ; [.0000.0000.0000] # RIGHT-TO-LEFT MARK +202A ; [.0000.0000.0000] # LEFT-TO-RIGHT EMBEDDING +202B ; [.0000.0000.0000] # RIGHT-TO-LEFT EMBEDDING +202C ; [.0000.0000.0000] # POP DIRECTIONAL FORMATTING +202D ; [.0000.0000.0000] # LEFT-TO-RIGHT OVERRIDE +202E ; [.0000.0000.0000] # RIGHT-TO-LEFT OVERRIDE +2060 ; [.0000.0000.0000] # WORD JOINER +2066 ; [.0000.0000.0000] # LEFT-TO-RIGHT ISOLATE +2067 ; [.0000.0000.0000] # RIGHT-TO-LEFT ISOLATE +2068 ; [.0000.0000.0000] # FIRST STRONG ISOLATE +2069 ; [.0000.0000.0000] # POP DIRECTIONAL ISOLATE +206A ; [.0000.0000.0000] # INHIBIT SYMMETRIC SWAPPING +206B ; [.0000.0000.0000] # ACTIVATE SYMMETRIC SWAPPING +206C ; [.0000.0000.0000] # INHIBIT ARABIC FORM SHAPING +206D ; [.0000.0000.0000] # ACTIVATE ARABIC FORM SHAPING +206E ; [.0000.0000.0000] # NATIONAL DIGIT SHAPES +206F ; [.0000.0000.0000] # NOMINAL DIGIT SHAPES +FE00 ; [.0000.0000.0000] # VARIATION SELECTOR-1 +FE01 ; [.0000.0000.0000] # VARIATION SELECTOR-2 +FE02 ; [.0000.0000.0000] # VARIATION SELECTOR-3 +FE03 ; [.0000.0000.0000] # VARIATION SELECTOR-4 +FE04 ; [.0000.0000.0000] # VARIATION SELECTOR-5 +FE05 ; [.0000.0000.0000] # VARIATION SELECTOR-6 +FE06 ; [.0000.0000.0000] # VARIATION SELECTOR-7 +FE07 ; [.0000.0000.0000] # VARIATION SELECTOR-8 +FE08 ; [.0000.0000.0000] # VARIATION SELECTOR-9 +FE09 ; [.0000.0000.0000] # VARIATION SELECTOR-10 +FE0A ; [.0000.0000.0000] # VARIATION SELECTOR-11 +FE0B ; [.0000.0000.0000] # VARIATION SELECTOR-12 +FE0C ; [.0000.0000.0000] # VARIATION SELECTOR-13 +FE0D ; [.0000.0000.0000] # VARIATION SELECTOR-14 +FE0E ; [.0000.0000.0000] # VARIATION SELECTOR-15 +FE0F ; [.0000.0000.0000] # VARIATION SELECTOR-16 +FEFF ; [.0000.0000.0000] # ZERO WIDTH NO-BREAK SPACE +FFF9 ; [.0000.0000.0000] # INTERLINEAR ANNOTATION ANCHOR +FFFA ; [.0000.0000.0000] # INTERLINEAR ANNOTATION SEPARATOR +FFFB ; [.0000.0000.0000] # INTERLINEAR ANNOTATION TERMINATOR +1BCA0 ; [.0000.0000.0000] # SHORTHAND FORMAT LETTER OVERLAP +1BCA1 ; [.0000.0000.0000] # SHORTHAND FORMAT CONTINUING OVERLAP +1BCA2 ; [.0000.0000.0000] # SHORTHAND FORMAT DOWN STEP +1BCA3 ; [.0000.0000.0000] # SHORTHAND FORMAT UP STEP +1D173 ; [.0000.0000.0000] # MUSICAL SYMBOL BEGIN BEAM +1D174 ; [.0000.0000.0000] # MUSICAL SYMBOL END BEAM +1D175 ; [.0000.0000.0000] # MUSICAL SYMBOL BEGIN TIE +1D176 ; [.0000.0000.0000] # MUSICAL SYMBOL END TIE +1D177 ; [.0000.0000.0000] # MUSICAL SYMBOL BEGIN SLUR +1D178 ; [.0000.0000.0000] # MUSICAL SYMBOL END SLUR +1D179 ; [.0000.0000.0000] # MUSICAL SYMBOL BEGIN PHRASE +1D17A ; [.0000.0000.0000] # MUSICAL SYMBOL END PHRASE +E0001 ; [.0000.0000.0000] # LANGUAGE TAG +E0020 ; [.0000.0000.0000] # TAG SPACE +E0021 ; [.0000.0000.0000] # TAG EXCLAMATION MARK +E0022 ; [.0000.0000.0000] # TAG QUOTATION MARK +E0023 ; [.0000.0000.0000] # TAG NUMBER SIGN +E0024 ; [.0000.0000.0000] # TAG DOLLAR SIGN +E0025 ; [.0000.0000.0000] # TAG PERCENT SIGN +E0026 ; [.0000.0000.0000] # TAG AMPERSAND +E0027 ; [.0000.0000.0000] # TAG APOSTROPHE +E0028 ; [.0000.0000.0000] # TAG LEFT PARENTHESIS +E0029 ; [.0000.0000.0000] # TAG RIGHT PARENTHESIS +E002A ; [.0000.0000.0000] # TAG ASTERISK +E002B ; [.0000.0000.0000] # TAG PLUS SIGN +E002C ; [.0000.0000.0000] # TAG COMMA +E002D ; [.0000.0000.0000] # TAG HYPHEN-MINUS +E002E ; [.0000.0000.0000] # TAG FULL STOP +E002F ; [.0000.0000.0000] # TAG SOLIDUS +E0030 ; [.0000.0000.0000] # TAG DIGIT ZERO +E0031 ; [.0000.0000.0000] # TAG DIGIT ONE +E0032 ; [.0000.0000.0000] # TAG DIGIT TWO +E0033 ; [.0000.0000.0000] # TAG DIGIT THREE +E0034 ; [.0000.0000.0000] # TAG DIGIT FOUR +E0035 ; [.0000.0000.0000] # TAG DIGIT FIVE +E0036 ; [.0000.0000.0000] # TAG DIGIT SIX +E0037 ; [.0000.0000.0000] # TAG DIGIT SEVEN +E0038 ; [.0000.0000.0000] # TAG DIGIT EIGHT +E0039 ; [.0000.0000.0000] # TAG DIGIT NINE +E003A ; [.0000.0000.0000] # TAG COLON +E003B ; [.0000.0000.0000] # TAG SEMICOLON +E003C ; [.0000.0000.0000] # TAG LESS-THAN SIGN +E003D ; [.0000.0000.0000] # TAG EQUALS SIGN +E003E ; [.0000.0000.0000] # TAG GREATER-THAN SIGN +E003F ; [.0000.0000.0000] # TAG QUESTION MARK +E0040 ; [.0000.0000.0000] # TAG COMMERCIAL AT +E0041 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER A +E0042 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER B +E0043 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER C +E0044 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER D +E0045 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER E +E0046 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER F +E0047 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER G +E0048 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER H +E0049 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER I +E004A ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER J +E004B ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER K +E004C ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER L +E004D ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER M +E004E ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER N +E004F ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER O +E0050 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER P +E0051 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER Q +E0052 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER R +E0053 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER S +E0054 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER T +E0055 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER U +E0056 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER V +E0057 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER W +E0058 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER X +E0059 ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER Y +E005A ; [.0000.0000.0000] # TAG LATIN CAPITAL LETTER Z +E005B ; [.0000.0000.0000] # TAG LEFT SQUARE BRACKET +E005C ; [.0000.0000.0000] # TAG REVERSE SOLIDUS +E005D ; [.0000.0000.0000] # TAG RIGHT SQUARE BRACKET +E005E ; [.0000.0000.0000] # TAG CIRCUMFLEX ACCENT +E005F ; [.0000.0000.0000] # TAG LOW LINE +E0060 ; [.0000.0000.0000] # TAG GRAVE ACCENT +E0061 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER A +E0062 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER B +E0063 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER C +E0064 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER D +E0065 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER E +E0066 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER F +E0067 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER G +E0068 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER H +E0069 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER I +E006A ; [.0000.0000.0000] # TAG LATIN SMALL LETTER J +E006B ; [.0000.0000.0000] # TAG LATIN SMALL LETTER K +E006C ; [.0000.0000.0000] # TAG LATIN SMALL LETTER L +E006D ; [.0000.0000.0000] # TAG LATIN SMALL LETTER M +E006E ; [.0000.0000.0000] # TAG LATIN SMALL LETTER N +E006F ; [.0000.0000.0000] # TAG LATIN SMALL LETTER O +E0070 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER P +E0071 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER Q +E0072 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER R +E0073 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER S +E0074 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER T +E0075 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER U +E0076 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER V +E0077 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER W +E0078 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER X +E0079 ; [.0000.0000.0000] # TAG LATIN SMALL LETTER Y +E007A ; [.0000.0000.0000] # TAG LATIN SMALL LETTER Z +E007B ; [.0000.0000.0000] # TAG LEFT CURLY BRACKET +E007C ; [.0000.0000.0000] # TAG VERTICAL LINE +E007D ; [.0000.0000.0000] # TAG RIGHT CURLY BRACKET +E007E ; [.0000.0000.0000] # TAG TILDE +E007F ; [.0000.0000.0000] # CANCEL TAG +E0100 ; [.0000.0000.0000] # VARIATION SELECTOR-17 +E0101 ; [.0000.0000.0000] # VARIATION SELECTOR-18 +E0102 ; [.0000.0000.0000] # VARIATION SELECTOR-19 +E0103 ; [.0000.0000.0000] # VARIATION SELECTOR-20 +E0104 ; [.0000.0000.0000] # VARIATION SELECTOR-21 +E0105 ; [.0000.0000.0000] # VARIATION SELECTOR-22 +E0106 ; [.0000.0000.0000] # VARIATION SELECTOR-23 +E0107 ; [.0000.0000.0000] # VARIATION SELECTOR-24 +E0108 ; [.0000.0000.0000] # VARIATION SELECTOR-25 +E0109 ; [.0000.0000.0000] # VARIATION SELECTOR-26 +E010A ; [.0000.0000.0000] # VARIATION SELECTOR-27 +E010B ; [.0000.0000.0000] # VARIATION SELECTOR-28 +E010C ; [.0000.0000.0000] # VARIATION SELECTOR-29 +E010D ; [.0000.0000.0000] # VARIATION SELECTOR-30 +E010E ; [.0000.0000.0000] # VARIATION SELECTOR-31 +E010F ; [.0000.0000.0000] # VARIATION SELECTOR-32 +E0110 ; [.0000.0000.0000] # VARIATION SELECTOR-33 +E0111 ; [.0000.0000.0000] # VARIATION SELECTOR-34 +E0112 ; [.0000.0000.0000] # VARIATION SELECTOR-35 +E0113 ; [.0000.0000.0000] # VARIATION SELECTOR-36 +E0114 ; [.0000.0000.0000] # VARIATION SELECTOR-37 +E0115 ; [.0000.0000.0000] # VARIATION SELECTOR-38 +E0116 ; [.0000.0000.0000] # VARIATION SELECTOR-39 +E0117 ; [.0000.0000.0000] # VARIATION SELECTOR-40 +E0118 ; [.0000.0000.0000] # VARIATION SELECTOR-41 +E0119 ; [.0000.0000.0000] # VARIATION SELECTOR-42 +E011A ; [.0000.0000.0000] # VARIATION SELECTOR-43 +E011B ; [.0000.0000.0000] # VARIATION SELECTOR-44 +E011C ; [.0000.0000.0000] # VARIATION SELECTOR-45 +E011D ; [.0000.0000.0000] # VARIATION SELECTOR-46 +E011E ; [.0000.0000.0000] # VARIATION SELECTOR-47 +E011F ; [.0000.0000.0000] # VARIATION SELECTOR-48 +E0120 ; [.0000.0000.0000] # VARIATION SELECTOR-49 +E0121 ; [.0000.0000.0000] # VARIATION SELECTOR-50 +E0122 ; [.0000.0000.0000] # VARIATION SELECTOR-51 +E0123 ; [.0000.0000.0000] # VARIATION SELECTOR-52 +E0124 ; [.0000.0000.0000] # VARIATION SELECTOR-53 +E0125 ; [.0000.0000.0000] # VARIATION SELECTOR-54 +E0126 ; [.0000.0000.0000] # VARIATION SELECTOR-55 +E0127 ; [.0000.0000.0000] # VARIATION SELECTOR-56 +E0128 ; [.0000.0000.0000] # VARIATION SELECTOR-57 +E0129 ; [.0000.0000.0000] # VARIATION SELECTOR-58 +E012A ; [.0000.0000.0000] # VARIATION SELECTOR-59 +E012B ; [.0000.0000.0000] # VARIATION SELECTOR-60 +E012C ; [.0000.0000.0000] # VARIATION SELECTOR-61 +E012D ; [.0000.0000.0000] # VARIATION SELECTOR-62 +E012E ; [.0000.0000.0000] # VARIATION SELECTOR-63 +E012F ; [.0000.0000.0000] # VARIATION SELECTOR-64 +E0130 ; [.0000.0000.0000] # VARIATION SELECTOR-65 +E0131 ; [.0000.0000.0000] # VARIATION SELECTOR-66 +E0132 ; [.0000.0000.0000] # VARIATION SELECTOR-67 +E0133 ; [.0000.0000.0000] # VARIATION SELECTOR-68 +E0134 ; [.0000.0000.0000] # VARIATION SELECTOR-69 +E0135 ; [.0000.0000.0000] # VARIATION SELECTOR-70 +E0136 ; [.0000.0000.0000] # VARIATION SELECTOR-71 +E0137 ; [.0000.0000.0000] # VARIATION SELECTOR-72 +E0138 ; [.0000.0000.0000] # VARIATION SELECTOR-73 +E0139 ; [.0000.0000.0000] # VARIATION SELECTOR-74 +E013A ; [.0000.0000.0000] # VARIATION SELECTOR-75 +E013B ; [.0000.0000.0000] # VARIATION SELECTOR-76 +E013C ; [.0000.0000.0000] # VARIATION SELECTOR-77 +E013D ; [.0000.0000.0000] # VARIATION SELECTOR-78 +E013E ; [.0000.0000.0000] # VARIATION SELECTOR-79 +E013F ; [.0000.0000.0000] # VARIATION SELECTOR-80 +E0140 ; [.0000.0000.0000] # VARIATION SELECTOR-81 +E0141 ; [.0000.0000.0000] # VARIATION SELECTOR-82 +E0142 ; [.0000.0000.0000] # VARIATION SELECTOR-83 +E0143 ; [.0000.0000.0000] # VARIATION SELECTOR-84 +E0144 ; [.0000.0000.0000] # VARIATION SELECTOR-85 +E0145 ; [.0000.0000.0000] # VARIATION SELECTOR-86 +E0146 ; [.0000.0000.0000] # VARIATION SELECTOR-87 +E0147 ; [.0000.0000.0000] # VARIATION SELECTOR-88 +E0148 ; [.0000.0000.0000] # VARIATION SELECTOR-89 +E0149 ; [.0000.0000.0000] # VARIATION SELECTOR-90 +E014A ; [.0000.0000.0000] # VARIATION SELECTOR-91 +E014B ; [.0000.0000.0000] # VARIATION SELECTOR-92 +E014C ; [.0000.0000.0000] # VARIATION SELECTOR-93 +E014D ; [.0000.0000.0000] # VARIATION SELECTOR-94 +E014E ; [.0000.0000.0000] # VARIATION SELECTOR-95 +E014F ; [.0000.0000.0000] # VARIATION SELECTOR-96 +E0150 ; [.0000.0000.0000] # VARIATION SELECTOR-97 +E0151 ; [.0000.0000.0000] # VARIATION SELECTOR-98 +E0152 ; [.0000.0000.0000] # VARIATION SELECTOR-99 +E0153 ; [.0000.0000.0000] # VARIATION SELECTOR-100 +E0154 ; [.0000.0000.0000] # VARIATION SELECTOR-101 +E0155 ; [.0000.0000.0000] # VARIATION SELECTOR-102 +E0156 ; [.0000.0000.0000] # VARIATION SELECTOR-103 +E0157 ; [.0000.0000.0000] # VARIATION SELECTOR-104 +E0158 ; [.0000.0000.0000] # VARIATION SELECTOR-105 +E0159 ; [.0000.0000.0000] # VARIATION SELECTOR-106 +E015A ; [.0000.0000.0000] # VARIATION SELECTOR-107 +E015B ; [.0000.0000.0000] # VARIATION SELECTOR-108 +E015C ; [.0000.0000.0000] # VARIATION SELECTOR-109 +E015D ; [.0000.0000.0000] # VARIATION SELECTOR-110 +E015E ; [.0000.0000.0000] # VARIATION SELECTOR-111 +E015F ; [.0000.0000.0000] # VARIATION SELECTOR-112 +E0160 ; [.0000.0000.0000] # VARIATION SELECTOR-113 +E0161 ; [.0000.0000.0000] # VARIATION SELECTOR-114 +E0162 ; [.0000.0000.0000] # VARIATION SELECTOR-115 +E0163 ; [.0000.0000.0000] # VARIATION SELECTOR-116 +E0164 ; [.0000.0000.0000] # VARIATION SELECTOR-117 +E0165 ; [.0000.0000.0000] # VARIATION SELECTOR-118 +E0166 ; [.0000.0000.0000] # VARIATION SELECTOR-119 +E0167 ; [.0000.0000.0000] # VARIATION SELECTOR-120 +E0168 ; [.0000.0000.0000] # VARIATION SELECTOR-121 +E0169 ; [.0000.0000.0000] # VARIATION SELECTOR-122 +E016A ; [.0000.0000.0000] # VARIATION SELECTOR-123 +E016B ; [.0000.0000.0000] # VARIATION SELECTOR-124 +E016C ; [.0000.0000.0000] # VARIATION SELECTOR-125 +E016D ; [.0000.0000.0000] # VARIATION SELECTOR-126 +E016E ; [.0000.0000.0000] # VARIATION SELECTOR-127 +E016F ; [.0000.0000.0000] # VARIATION SELECTOR-128 +E0170 ; [.0000.0000.0000] # VARIATION SELECTOR-129 +E0171 ; [.0000.0000.0000] # VARIATION SELECTOR-130 +E0172 ; [.0000.0000.0000] # VARIATION SELECTOR-131 +E0173 ; [.0000.0000.0000] # VARIATION SELECTOR-132 +E0174 ; [.0000.0000.0000] # VARIATION SELECTOR-133 +E0175 ; [.0000.0000.0000] # VARIATION SELECTOR-134 +E0176 ; [.0000.0000.0000] # VARIATION SELECTOR-135 +E0177 ; [.0000.0000.0000] # VARIATION SELECTOR-136 +E0178 ; [.0000.0000.0000] # VARIATION SELECTOR-137 +E0179 ; [.0000.0000.0000] # VARIATION SELECTOR-138 +E017A ; [.0000.0000.0000] # VARIATION SELECTOR-139 +E017B ; [.0000.0000.0000] # VARIATION SELECTOR-140 +E017C ; [.0000.0000.0000] # VARIATION SELECTOR-141 +E017D ; [.0000.0000.0000] # VARIATION SELECTOR-142 +E017E ; [.0000.0000.0000] # VARIATION SELECTOR-143 +E017F ; [.0000.0000.0000] # VARIATION SELECTOR-144 +E0180 ; [.0000.0000.0000] # VARIATION SELECTOR-145 +E0181 ; [.0000.0000.0000] # VARIATION SELECTOR-146 +E0182 ; [.0000.0000.0000] # VARIATION SELECTOR-147 +E0183 ; [.0000.0000.0000] # VARIATION SELECTOR-148 +E0184 ; [.0000.0000.0000] # VARIATION SELECTOR-149 +E0185 ; [.0000.0000.0000] # VARIATION SELECTOR-150 +E0186 ; [.0000.0000.0000] # VARIATION SELECTOR-151 +E0187 ; [.0000.0000.0000] # VARIATION SELECTOR-152 +E0188 ; [.0000.0000.0000] # VARIATION SELECTOR-153 +E0189 ; [.0000.0000.0000] # VARIATION SELECTOR-154 +E018A ; [.0000.0000.0000] # VARIATION SELECTOR-155 +E018B ; [.0000.0000.0000] # VARIATION SELECTOR-156 +E018C ; [.0000.0000.0000] # VARIATION SELECTOR-157 +E018D ; [.0000.0000.0000] # VARIATION SELECTOR-158 +E018E ; [.0000.0000.0000] # VARIATION SELECTOR-159 +E018F ; [.0000.0000.0000] # VARIATION SELECTOR-160 +E0190 ; [.0000.0000.0000] # VARIATION SELECTOR-161 +E0191 ; [.0000.0000.0000] # VARIATION SELECTOR-162 +E0192 ; [.0000.0000.0000] # VARIATION SELECTOR-163 +E0193 ; [.0000.0000.0000] # VARIATION SELECTOR-164 +E0194 ; [.0000.0000.0000] # VARIATION SELECTOR-165 +E0195 ; [.0000.0000.0000] # VARIATION SELECTOR-166 +E0196 ; [.0000.0000.0000] # VARIATION SELECTOR-167 +E0197 ; [.0000.0000.0000] # VARIATION SELECTOR-168 +E0198 ; [.0000.0000.0000] # VARIATION SELECTOR-169 +E0199 ; [.0000.0000.0000] # VARIATION SELECTOR-170 +E019A ; [.0000.0000.0000] # VARIATION SELECTOR-171 +E019B ; [.0000.0000.0000] # VARIATION SELECTOR-172 +E019C ; [.0000.0000.0000] # VARIATION SELECTOR-173 +E019D ; [.0000.0000.0000] # VARIATION SELECTOR-174 +E019E ; [.0000.0000.0000] # VARIATION SELECTOR-175 +E019F ; [.0000.0000.0000] # VARIATION SELECTOR-176 +E01A0 ; [.0000.0000.0000] # VARIATION SELECTOR-177 +E01A1 ; [.0000.0000.0000] # VARIATION SELECTOR-178 +E01A2 ; [.0000.0000.0000] # VARIATION SELECTOR-179 +E01A3 ; [.0000.0000.0000] # VARIATION SELECTOR-180 +E01A4 ; [.0000.0000.0000] # VARIATION SELECTOR-181 +E01A5 ; [.0000.0000.0000] # VARIATION SELECTOR-182 +E01A6 ; [.0000.0000.0000] # VARIATION SELECTOR-183 +E01A7 ; [.0000.0000.0000] # VARIATION SELECTOR-184 +E01A8 ; [.0000.0000.0000] # VARIATION SELECTOR-185 +E01A9 ; [.0000.0000.0000] # VARIATION SELECTOR-186 +E01AA ; [.0000.0000.0000] # VARIATION SELECTOR-187 +E01AB ; [.0000.0000.0000] # VARIATION SELECTOR-188 +E01AC ; [.0000.0000.0000] # VARIATION SELECTOR-189 +E01AD ; [.0000.0000.0000] # VARIATION SELECTOR-190 +E01AE ; [.0000.0000.0000] # VARIATION SELECTOR-191 +E01AF ; [.0000.0000.0000] # VARIATION SELECTOR-192 +E01B0 ; [.0000.0000.0000] # VARIATION SELECTOR-193 +E01B1 ; [.0000.0000.0000] # VARIATION SELECTOR-194 +E01B2 ; [.0000.0000.0000] # VARIATION SELECTOR-195 +E01B3 ; [.0000.0000.0000] # VARIATION SELECTOR-196 +E01B4 ; [.0000.0000.0000] # VARIATION SELECTOR-197 +E01B5 ; [.0000.0000.0000] # VARIATION SELECTOR-198 +E01B6 ; [.0000.0000.0000] # VARIATION SELECTOR-199 +E01B7 ; [.0000.0000.0000] # VARIATION SELECTOR-200 +E01B8 ; [.0000.0000.0000] # VARIATION SELECTOR-201 +E01B9 ; [.0000.0000.0000] # VARIATION SELECTOR-202 +E01BA ; [.0000.0000.0000] # VARIATION SELECTOR-203 +E01BB ; [.0000.0000.0000] # VARIATION SELECTOR-204 +E01BC ; [.0000.0000.0000] # VARIATION SELECTOR-205 +E01BD ; [.0000.0000.0000] # VARIATION SELECTOR-206 +E01BE ; [.0000.0000.0000] # VARIATION SELECTOR-207 +E01BF ; [.0000.0000.0000] # VARIATION SELECTOR-208 +E01C0 ; [.0000.0000.0000] # VARIATION SELECTOR-209 +E01C1 ; [.0000.0000.0000] # VARIATION SELECTOR-210 +E01C2 ; [.0000.0000.0000] # VARIATION SELECTOR-211 +E01C3 ; [.0000.0000.0000] # VARIATION SELECTOR-212 +E01C4 ; [.0000.0000.0000] # VARIATION SELECTOR-213 +E01C5 ; [.0000.0000.0000] # VARIATION SELECTOR-214 +E01C6 ; [.0000.0000.0000] # VARIATION SELECTOR-215 +E01C7 ; [.0000.0000.0000] # VARIATION SELECTOR-216 +E01C8 ; [.0000.0000.0000] # VARIATION SELECTOR-217 +E01C9 ; [.0000.0000.0000] # VARIATION SELECTOR-218 +E01CA ; [.0000.0000.0000] # VARIATION SELECTOR-219 +E01CB ; [.0000.0000.0000] # VARIATION SELECTOR-220 +E01CC ; [.0000.0000.0000] # VARIATION SELECTOR-221 +E01CD ; [.0000.0000.0000] # VARIATION SELECTOR-222 +E01CE ; [.0000.0000.0000] # VARIATION SELECTOR-223 +E01CF ; [.0000.0000.0000] # VARIATION SELECTOR-224 +E01D0 ; [.0000.0000.0000] # VARIATION SELECTOR-225 +E01D1 ; [.0000.0000.0000] # VARIATION SELECTOR-226 +E01D2 ; [.0000.0000.0000] # VARIATION SELECTOR-227 +E01D3 ; [.0000.0000.0000] # VARIATION SELECTOR-228 +E01D4 ; [.0000.0000.0000] # VARIATION SELECTOR-229 +E01D5 ; [.0000.0000.0000] # VARIATION SELECTOR-230 +E01D6 ; [.0000.0000.0000] # VARIATION SELECTOR-231 +E01D7 ; [.0000.0000.0000] # VARIATION SELECTOR-232 +E01D8 ; [.0000.0000.0000] # VARIATION SELECTOR-233 +E01D9 ; [.0000.0000.0000] # VARIATION SELECTOR-234 +E01DA ; [.0000.0000.0000] # VARIATION SELECTOR-235 +E01DB ; [.0000.0000.0000] # VARIATION SELECTOR-236 +E01DC ; [.0000.0000.0000] # VARIATION SELECTOR-237 +E01DD ; [.0000.0000.0000] # VARIATION SELECTOR-238 +E01DE ; [.0000.0000.0000] # VARIATION SELECTOR-239 +E01DF ; [.0000.0000.0000] # VARIATION SELECTOR-240 +E01E0 ; [.0000.0000.0000] # VARIATION SELECTOR-241 +E01E1 ; [.0000.0000.0000] # VARIATION SELECTOR-242 +E01E2 ; [.0000.0000.0000] # VARIATION SELECTOR-243 +E01E3 ; [.0000.0000.0000] # VARIATION SELECTOR-244 +E01E4 ; [.0000.0000.0000] # VARIATION SELECTOR-245 +E01E5 ; [.0000.0000.0000] # VARIATION SELECTOR-246 +E01E6 ; [.0000.0000.0000] # VARIATION SELECTOR-247 +E01E7 ; [.0000.0000.0000] # VARIATION SELECTOR-248 +E01E8 ; [.0000.0000.0000] # VARIATION SELECTOR-249 +E01E9 ; [.0000.0000.0000] # VARIATION SELECTOR-250 +E01EA ; [.0000.0000.0000] # VARIATION SELECTOR-251 +E01EB ; [.0000.0000.0000] # VARIATION SELECTOR-252 +E01EC ; [.0000.0000.0000] # VARIATION SELECTOR-253 +E01ED ; [.0000.0000.0000] # VARIATION SELECTOR-254 +E01EE ; [.0000.0000.0000] # VARIATION SELECTOR-255 +E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 +0009 ; [*0201.0020.0002] # HORIZONTAL TABULATION (in ISO 6429) +000A ; [*0202.0020.0002] # LINE FEED (in ISO 6429) +000B ; [*0203.0020.0002] # VERTICAL TABULATION (in ISO 6429) +000C ; [*0204.0020.0002] # FORM FEED (in ISO 6429) +000D ; [*0205.0020.0002] # CARRIAGE RETURN (in ISO 6429) +0020 ; [*0209.0020.0002] # SPACE +0021 ; [*025F.0020.0002] # EXCLAMATION MARK +0022 ; [*0305.0020.0002] # QUOTATION MARK +0023 ; [*0391.0020.0002] # NUMBER SIGN +0025 ; [*0392.0020.0002] # PERCENT SIGN +0026 ; [*038F.0020.0002] # AMPERSAND +0027 ; [*02FE.0020.0002] # APOSTROPHE +0028 ; [*0310.0020.0002] # LEFT PARENTHESIS +0029 ; [*0311.0020.0002] # RIGHT PARENTHESIS +002A ; [*0388.0020.0002] # ASTERISK +002B ; [*05F6.0020.0002] # PLUS SIGN +002C ; [*0221.0020.0002] # COMMA +002D ; [*020D.0020.0002] # HYPHEN-MINUS +002E ; [*0274.0020.0002] # FULL STOP +002F ; [*038D.0020.0002] # SOLIDUS +003A ; [*0238.0020.0002] # COLON +003B ; [*0233.0020.0002] # SEMICOLON +003C ; [*05FA.0020.0002] # LESS-THAN SIGN +003D ; [*05FB.0020.0002] # EQUALS SIGN +003E ; [*05FC.0020.0002] # GREATER-THAN SIGN +003F ; [*0264.0020.0002] # QUESTION MARK +0040 ; [*0387.0020.0002] # COMMERCIAL AT +005B ; [*0312.0020.0002] # LEFT SQUARE BRACKET +005C ; [*038E.0020.0002] # REVERSE SOLIDUS +005D ; [*0313.0020.0002] # RIGHT SQUARE BRACKET +005E ; [*0466.0020.0002] # CIRCUMFLEX ACCENT +005F ; [*020B.0020.0002] # LOW LINE +0060 ; [*0463.0020.0002] # GRAVE ACCENT +007B ; [*0314.0020.0002] # LEFT CURLY BRACKET +007C ; [*05FE.0020.0002] # VERTICAL LINE +007D ; [*0315.0020.0002] # RIGHT CURLY BRACKET +007E ; [*0600.0020.0002] # TILDE +0085 ; [*0206.0020.0002] # NEXT LINE (in ISO 6429) +00A0 ; [*0209.0020.001B] # NO-BREAK SPACE +00A1 ; [*0260.0020.0002] # INVERTED EXCLAMATION MARK +00A6 ; [*05FF.0020.0002] # BROKEN BAR +00A7 ; [*0382.0020.0002] # SECTION SIGN +00A8 ; [*046A.0020.0002] # DIAERESIS +00A9 ; [*0564.0020.0002] # COPYRIGHT SIGN +00AB ; [*030E.0020.0002] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; [*05FD.0020.0002] # NOT SIGN +00AE ; [*0565.0020.0002] # REGISTERED SIGN +00AF ; [*0467.0020.0002] # MACRON +00B0 ; [*04D7.0020.0002] # DEGREE SIGN +00B1 ; [*05F7.0020.0002] # PLUS-MINUS SIGN +00B4 ; [*0464.0020.0002] # ACUTE ACCENT +00B6 ; [*0384.0020.0002] # PILCROW SIGN +00B7 ; [*0288.0020.0002] # MIDDLE DOT +00B8 ; [*046D.0020.0002] # CEDILLA +00BB ; [*030F.0020.0002] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BF ; [*0265.0020.0002] # INVERTED QUESTION MARK +00D7 ; [*05F9.0020.0002] # MULTIPLICATION SIGN +00F7 ; [*05F8.0020.0002] # DIVISION SIGN +02B9 ; [*0474.0020.0002] # MODIFIER LETTER PRIME +02BA ; [*0476.0020.0002] # MODIFIER LETTER DOUBLE PRIME +02C2 ; [*0477.0020.0002] # MODIFIER LETTER LEFT ARROWHEAD +02C3 ; [*0478.0020.0002] # MODIFIER LETTER RIGHT ARROWHEAD +02C4 ; [*0479.0020.0002] # MODIFIER LETTER UP ARROWHEAD +02C5 ; [*047A.0020.0002] # MODIFIER LETTER DOWN ARROWHEAD +02C6 ; [*047B.0020.0002] # MODIFIER LETTER CIRCUMFLEX ACCENT +02C7 ; [*047C.0020.0002] # CARON +02C8 ; [*047D.0020.0002] # MODIFIER LETTER VERTICAL LINE +02C9 ; [*047E.0020.0002] # MODIFIER LETTER MACRON +02CA ; [*047F.0020.0002] # MODIFIER LETTER ACUTE ACCENT +02CB ; [*0480.0020.0002] # MODIFIER LETTER GRAVE ACCENT +02CC ; [*0481.0020.0002] # MODIFIER LETTER LOW VERTICAL LINE +02CD ; [*0482.0020.0002] # MODIFIER LETTER LOW MACRON +02CE ; [*0483.0020.0002] # MODIFIER LETTER LOW GRAVE ACCENT +02CF ; [*0484.0020.0002] # MODIFIER LETTER LOW ACUTE ACCENT +02D2 ; [*0485.0020.0002] # MODIFIER LETTER CENTRED RIGHT HALF RING +02D3 ; [*0486.0020.0002] # MODIFIER LETTER CENTRED LEFT HALF RING +02D4 ; [*0487.0020.0002] # MODIFIER LETTER UP TACK +02D5 ; [*0488.0020.0002] # MODIFIER LETTER DOWN TACK +02D6 ; [*0489.0020.0002] # MODIFIER LETTER PLUS SIGN +02D7 ; [*048A.0020.0002] # MODIFIER LETTER MINUS SIGN +02D8 ; [*0468.0020.0002] # BREVE +02D9 ; [*0469.0020.0002] # DOT ABOVE +02DA ; [*046B.0020.0002] # RING ABOVE +02DB ; [*046E.0020.0002] # OGONEK +02DC ; [*0465.0020.0002] # SMALL TILDE +02DD ; [*046C.0020.0002] # DOUBLE ACUTE ACCENT +02DE ; [*048B.0020.0002] # MODIFIER LETTER RHOTIC HOOK +02DF ; [*048C.0020.0002] # MODIFIER LETTER CROSS ACCENT +02E5 ; [*048D.0020.0002] # MODIFIER LETTER EXTRA-HIGH TONE BAR +02E6 ; [*048E.0020.0002] # MODIFIER LETTER HIGH TONE BAR +02E7 ; [*048F.0020.0002] # MODIFIER LETTER MID TONE BAR +02E8 ; [*0490.0020.0002] # MODIFIER LETTER LOW TONE BAR +02E9 ; [*0491.0020.0002] # MODIFIER LETTER EXTRA-LOW TONE BAR +02EA ; [*0492.0020.0002] # MODIFIER LETTER YIN DEPARTING TONE MARK +02EB ; [*0493.0020.0002] # MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; [*0494.0020.0002] # MODIFIER LETTER VOICING +02ED ; [*0495.0020.0002] # MODIFIER LETTER UNASPIRATED +02EF ; [*0496.0020.0002] # MODIFIER LETTER LOW DOWN ARROWHEAD +02F0 ; [*0497.0020.0002] # MODIFIER LETTER LOW UP ARROWHEAD +02F1 ; [*0498.0020.0002] # MODIFIER LETTER LOW LEFT ARROWHEAD +02F2 ; [*0499.0020.0002] # MODIFIER LETTER LOW RIGHT ARROWHEAD +02F3 ; [*049A.0020.0002] # MODIFIER LETTER LOW RING +02F4 ; [*049B.0020.0002] # MODIFIER LETTER MIDDLE GRAVE ACCENT +02F5 ; [*049C.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT +02F6 ; [*049D.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT +02F7 ; [*049E.0020.0002] # MODIFIER LETTER LOW TILDE +02F8 ; [*049F.0020.0002] # MODIFIER LETTER RAISED COLON +02F9 ; [*04A0.0020.0002] # MODIFIER LETTER BEGIN HIGH TONE +02FA ; [*04A1.0020.0002] # MODIFIER LETTER END HIGH TONE +02FB ; [*04A2.0020.0002] # MODIFIER LETTER BEGIN LOW TONE +02FC ; [*04A3.0020.0002] # MODIFIER LETTER END LOW TONE +02FD ; [*04A4.0020.0002] # MODIFIER LETTER SHELF +02FE ; [*04A5.0020.0002] # MODIFIER LETTER OPEN SHELF +02FF ; [*04A6.0020.0002] # MODIFIER LETTER LOW LEFT ARROW +034F ; [.0000.0000.0000] # COMBINING GRAPHEME JOINER +0374 ; [*0474.0020.0002] # GREEK NUMERAL SIGN +0375 ; [*0475.0020.0002] # GREEK LOWER NUMERAL SIGN +037E ; [*0233.0020.0002] # GREEK QUESTION MARK +0384 ; [*0464.0020.0002] # GREEK TONOS +0385 ; [*046A.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA TONOS +0387 ; [*0288.0020.0002] # GREEK ANO TELEIA +03F6 ; [*05F1.0020.0002] # GREEK REVERSED LUNATE EPSILON SYMBOL +0482 ; [*04D8.0020.0002] # CYRILLIC THOUSANDS SIGN +0488 ; [.0000.0000.0000] # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN +0489 ; [.0000.0000.0000] # COMBINING CYRILLIC MILLIONS SIGN +055A ; [*03C3.0020.0002] # ARMENIAN APOSTROPHE +055B ; [*03C4.0020.0002] # ARMENIAN EMPHASIS MARK +055C ; [*0261.0020.0002] # ARMENIAN EXCLAMATION MARK +055D ; [*0225.0020.0002] # ARMENIAN COMMA +055E ; [*0267.0020.0002] # ARMENIAN QUESTION MARK +055F ; [*03C5.0020.0002] # ARMENIAN ABBREVIATION MARK +0589 ; [*0239.0020.0002] # ARMENIAN FULL STOP +058A ; [*020E.0020.0002] # ARMENIAN HYPHEN +058D ; [*04D9.0020.0002] # RIGHT-FACING ARMENIAN ETERNITY SIGN +058E ; [*04DA.0020.0002] # LEFT-FACING ARMENIAN ETERNITY SIGN +0591 ; [.0000.0000.0000] # HEBREW ACCENT ETNAHTA +0592 ; [.0000.0000.0000] # HEBREW ACCENT SEGOL +0593 ; [.0000.0000.0000] # HEBREW ACCENT SHALSHELET +0594 ; [.0000.0000.0000] # HEBREW ACCENT ZAQEF QATAN +0595 ; [.0000.0000.0000] # HEBREW ACCENT ZAQEF GADOL +0596 ; [.0000.0000.0000] # HEBREW ACCENT TIPEHA +0597 ; [.0000.0000.0000] # HEBREW ACCENT REVIA +0598 ; [.0000.0000.0000] # HEBREW ACCENT ZARQA +0599 ; [.0000.0000.0000] # HEBREW ACCENT PASHTA +059A ; [.0000.0000.0000] # HEBREW ACCENT YETIV +059B ; [.0000.0000.0000] # HEBREW ACCENT TEVIR +059C ; [.0000.0000.0000] # HEBREW ACCENT GERESH +059D ; [.0000.0000.0000] # HEBREW ACCENT GERESH MUQDAM +059E ; [.0000.0000.0000] # HEBREW ACCENT GERSHAYIM +059F ; [.0000.0000.0000] # HEBREW ACCENT QARNEY PARA +05A0 ; [.0000.0000.0000] # HEBREW ACCENT TELISHA GEDOLA +05A1 ; [.0000.0000.0000] # HEBREW ACCENT PAZER +05A2 ; [.0000.0000.0000] # HEBREW ACCENT ATNAH HAFUKH +05A3 ; [.0000.0000.0000] # HEBREW ACCENT MUNAH +05A4 ; [.0000.0000.0000] # HEBREW ACCENT MAHAPAKH +05A5 ; [.0000.0000.0000] # HEBREW ACCENT MERKHA +05A6 ; [.0000.0000.0000] # HEBREW ACCENT MERKHA KEFULA +05A7 ; [.0000.0000.0000] # HEBREW ACCENT DARGA +05A8 ; [.0000.0000.0000] # HEBREW ACCENT QADMA +05A9 ; [.0000.0000.0000] # HEBREW ACCENT TELISHA QETANA +05AA ; [.0000.0000.0000] # HEBREW ACCENT YERAH BEN YOMO +05AB ; [.0000.0000.0000] # HEBREW ACCENT OLE +05AC ; [.0000.0000.0000] # HEBREW ACCENT ILUY +05AD ; [.0000.0000.0000] # HEBREW ACCENT DEHI +05AE ; [.0000.0000.0000] # HEBREW ACCENT ZINOR +05AF ; [.0000.0000.0000] # HEBREW MARK MASORA CIRCLE +05BD ; [.0000.0000.0000] # HEBREW POINT METEG +05BE ; [*03C6.0020.0002] # HEBREW PUNCTUATION MAQAF +05C0 ; [*03C7.0020.0002] # HEBREW PUNCTUATION PASEQ +05C3 ; [*03C8.0020.0002] # HEBREW PUNCTUATION SOF PASUQ +05C4 ; [.0000.0000.0000] # HEBREW MARK UPPER DOT +05C5 ; [.0000.0000.0000] # HEBREW MARK LOWER DOT +05C6 ; [*03C9.0020.0002] # HEBREW PUNCTUATION NUN HAFUKHA +05F3 ; [*03CA.0020.0002] # HEBREW PUNCTUATION GERESH +05F4 ; [*03CB.0020.0002] # HEBREW PUNCTUATION GERSHAYIM +0600 ; [.0000.0000.0000] # ARABIC NUMBER SIGN +0601 ; [.0000.0000.0000] # ARABIC SIGN SANAH +0602 ; [.0000.0000.0000] # ARABIC FOOTNOTE MARKER +0603 ; [.0000.0000.0000] # ARABIC SIGN SAFHA +0604 ; [.0000.0000.0000] # ARABIC SIGN SAMVAT +0605 ; [.0000.0000.0000] # ARABIC NUMBER MARK ABOVE +0606 ; [*060D.0020.0002] # ARABIC-INDIC CUBE ROOT +0607 ; [*060F.0020.0002] # ARABIC-INDIC FOURTH ROOT +0608 ; [*04DB.0020.0002] # ARABIC RAY +0609 ; [*0395.0020.0002] # ARABIC-INDIC PER MILLE SIGN +060A ; [*0397.0020.0002] # ARABIC-INDIC PER TEN THOUSAND SIGN +060C ; [*0226.0020.0002] # ARABIC COMMA +060D ; [*0227.0020.0002] # ARABIC DATE SEPARATOR +060E ; [*04DE.0020.0002] # ARABIC POETIC VERSE SIGN +060F ; [*04DF.0020.0002] # ARABIC SIGN MISRA +0610 ; [.0000.0000.0000] # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM +0611 ; [.0000.0000.0000] # ARABIC SIGN ALAYHE ASSALLAM +0612 ; [.0000.0000.0000] # ARABIC SIGN RAHMATULLAH ALAYHE +0613 ; [.0000.0000.0000] # ARABIC SIGN RADI ALLAHOU ANHU +0614 ; [.0000.0000.0000] # ARABIC SIGN TAKHALLUS +0615 ; [.0000.0000.0000] # ARABIC SMALL HIGH TAH +0616 ; [.0000.0000.0000] # ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH +0617 ; [.0000.0000.0000] # ARABIC SMALL HIGH ZAIN +0618 ; [.0000.0000.0000] # ARABIC SMALL FATHA +0619 ; [.0000.0000.0000] # ARABIC SMALL DAMMA +061A ; [.0000.0000.0000] # ARABIC SMALL KASRA +061B ; [*0234.0020.0002] # ARABIC SEMICOLON +061E ; [*023A.0020.0002] # ARABIC TRIPLE DOT PUNCTUATION MARK +061F ; [*0268.0020.0002] # ARABIC QUESTION MARK +0640 ; [.0000.0000.0000] # ARABIC TATWEEL +066A ; [*0393.0020.0002] # ARABIC PERCENT SIGN +066B ; [*0228.0020.0002] # ARABIC DECIMAL SEPARATOR +066C ; [*0229.0020.0002] # ARABIC THOUSANDS SEPARATOR +066D ; [*038B.0020.0002] # ARABIC FIVE POINTED STAR +06D4 ; [*0276.0020.0002] # ARABIC FULL STOP +06D6 ; [.0000.0000.0000] # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA +06D7 ; [.0000.0000.0000] # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA +06D8 ; [.0000.0000.0000] # ARABIC SMALL HIGH MEEM INITIAL FORM +06D9 ; [.0000.0000.0000] # ARABIC SMALL HIGH LAM ALEF +06DA ; [.0000.0000.0000] # ARABIC SMALL HIGH JEEM +06DB ; [.0000.0000.0000] # ARABIC SMALL HIGH THREE DOTS +06DC ; [.0000.0000.0000] # ARABIC SMALL HIGH SEEN +06DD ; [.0000.0000.0000] # ARABIC END OF AYAH +06DE ; [*04E0.0020.0002] # ARABIC START OF RUB EL HIZB +06DF ; [.0000.0000.0000] # ARABIC SMALL HIGH ROUNDED ZERO +06E0 ; [.0000.0000.0000] # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E1 ; [.0000.0000.0000] # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH +06E2 ; [.0000.0000.0000] # ARABIC SMALL HIGH MEEM ISOLATED FORM +06E3 ; [.0000.0000.0000] # ARABIC SMALL LOW SEEN +06E4 ; [.0000.0000.0000] # ARABIC SMALL HIGH MADDA +06E7 ; [.0000.0000.0000] # ARABIC SMALL HIGH YEH +06E8 ; [.0000.0000.0000] # ARABIC SMALL HIGH NOON +06E9 ; [*04E1.0020.0002] # ARABIC PLACE OF SAJDAH +06EA ; [.0000.0000.0000] # ARABIC EMPTY CENTRE LOW STOP +06EB ; [.0000.0000.0000] # ARABIC EMPTY CENTRE HIGH STOP +06EC ; [.0000.0000.0000] # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +06ED ; [.0000.0000.0000] # ARABIC SMALL LOW MEEM +0700 ; [*02BD.0020.0002] # SYRIAC END OF PARAGRAPH +0701 ; [*0277.0020.0002] # SYRIAC SUPRALINEAR FULL STOP +0702 ; [*0278.0020.0002] # SYRIAC SUBLINEAR FULL STOP +0703 ; [*023B.0020.0002] # SYRIAC SUPRALINEAR COLON +0704 ; [*023C.0020.0002] # SYRIAC SUBLINEAR COLON +0705 ; [*023D.0020.0002] # SYRIAC HORIZONTAL COLON +0706 ; [*023E.0020.0002] # SYRIAC COLON SKEWED LEFT +0707 ; [*023F.0020.0002] # SYRIAC COLON SKEWED RIGHT +0708 ; [*0240.0020.0002] # SYRIAC SUPRALINEAR COLON SKEWED LEFT +0709 ; [*0269.0020.0002] # SYRIAC SUBLINEAR COLON SKEWED RIGHT +070A ; [*03CC.0020.0002] # SYRIAC CONTRACTION +070B ; [*03CD.0020.0002] # SYRIAC HARKLEAN OBELUS +070C ; [*03CE.0020.0002] # SYRIAC HARKLEAN METOBELUS +070D ; [*03CF.0020.0002] # SYRIAC HARKLEAN ASTERISCUS +0740 ; [.0000.0000.0000] # SYRIAC FEMININE DOT +0743 ; [.0000.0000.0000] # SYRIAC TWO VERTICAL DOTS ABOVE +0744 ; [.0000.0000.0000] # SYRIAC TWO VERTICAL DOTS BELOW +0747 ; [.0000.0000.0000] # SYRIAC OBLIQUE LINE ABOVE +0748 ; [.0000.0000.0000] # SYRIAC OBLIQUE LINE BELOW +0749 ; [.0000.0000.0000] # SYRIAC MUSIC +074A ; [.0000.0000.0000] # SYRIAC BARREKH +07F6 ; [*04F3.0020.0002] # NKO SYMBOL OO DENNEN +07F7 ; [*02BE.0020.0002] # NKO SYMBOL GBAKURUNEN +07F8 ; [*022A.0020.0002] # NKO COMMA +07F9 ; [*0262.0020.0002] # NKO EXCLAMATION MARK +07FA ; [.0000.0000.0000] # NKO LAJANYALAN +0830 ; [*0241.0020.0002] # SAMARITAN PUNCTUATION NEQUDAA +0831 ; [*0242.0020.0002] # SAMARITAN PUNCTUATION AFSAAQ +0832 ; [*0243.0020.0002] # SAMARITAN PUNCTUATION ANGED +0833 ; [*0244.0020.0002] # SAMARITAN PUNCTUATION BAU +0834 ; [*0245.0020.0002] # SAMARITAN PUNCTUATION ATMAAU +0835 ; [*0246.0020.0002] # SAMARITAN PUNCTUATION SHIYYAALAA +0836 ; [*0247.0020.0002] # SAMARITAN ABBREVIATION MARK +0837 ; [*0248.0020.0002] # SAMARITAN PUNCTUATION MELODIC QITSA +0838 ; [*0249.0020.0002] # SAMARITAN PUNCTUATION ZIQAA +0839 ; [*024A.0020.0002] # SAMARITAN PUNCTUATION QITSA +083A ; [*024B.0020.0002] # SAMARITAN PUNCTUATION ZAEF +083B ; [*024C.0020.0002] # SAMARITAN PUNCTUATION TURU +083C ; [*024D.0020.0002] # SAMARITAN PUNCTUATION ARKAANU +083D ; [*024E.0020.0002] # SAMARITAN PUNCTUATION SOF MASHFAAT +083E ; [*024F.0020.0002] # SAMARITAN PUNCTUATION ANNAAU +085E ; [*03D0.0020.0002] # MANDAIC PUNCTUATION +08EA ; [.0000.0000.0000] # ARABIC TONE ONE DOT ABOVE +08EB ; [.0000.0000.0000] # ARABIC TONE TWO DOTS ABOVE +08EC ; [.0000.0000.0000] # ARABIC TONE LOOP ABOVE +08ED ; [.0000.0000.0000] # ARABIC TONE ONE DOT BELOW +08EE ; [.0000.0000.0000] # ARABIC TONE TWO DOTS BELOW +08EF ; [.0000.0000.0000] # ARABIC TONE LOOP BELOW +08F3 ; [.0000.0000.0000] # ARABIC SMALL HIGH WAW +0951 ; [.0000.0000.0000] # DEVANAGARI STRESS SIGN UDATTA +0952 ; [.0000.0000.0000] # DEVANAGARI STRESS SIGN ANUDATTA +0964 ; [*028B.0020.0002] # DEVANAGARI DANDA +0965 ; [*028C.0020.0002] # DEVANAGARI DOUBLE DANDA +0970 ; [*03D2.0020.0002] # DEVANAGARI ABBREVIATION SIGN +09F4 ; [*1A26.0020.0002] # BENGALI CURRENCY NUMERATOR ONE +09F5 ; [*1A27.0020.0002] # BENGALI CURRENCY NUMERATOR TWO +09F6 ; [*1A28.0020.0002] # BENGALI CURRENCY NUMERATOR THREE +09F7 ; [*1A29.0020.0002] # BENGALI CURRENCY NUMERATOR FOUR +09F8 ; [*1A2A.0020.0002] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +09F9 ; [*1A2B.0020.0002] # BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; [*04F4.0020.0002] # BENGALI ISSHAR +0AF0 ; [*03D7.0020.0002] # GUJARATI ABBREVIATION SIGN +0B70 ; [*04F5.0020.0002] # ORIYA ISSHAR +0B72 ; [*1A2C.0020.0002] # ORIYA FRACTION ONE QUARTER +0B73 ; [*1A2D.0020.0002] # ORIYA FRACTION ONE HALF +0B74 ; [*1A2E.0020.0002] # ORIYA FRACTION THREE QUARTERS +0B75 ; [*1A2F.0020.0002] # ORIYA FRACTION ONE SIXTEENTH +0B76 ; [*1A30.0020.0002] # ORIYA FRACTION ONE EIGHTH +0B77 ; [*1A31.0020.0002] # ORIYA FRACTION THREE SIXTEENTHS +0BF0 ; [*1A38.0020.0002] # TAMIL NUMBER TEN +0BF1 ; [*1A39.0020.0002] # TAMIL NUMBER ONE HUNDRED +0BF2 ; [*1A3A.0020.0002] # TAMIL NUMBER ONE THOUSAND +0BF3 ; [*04F6.0020.0002] # TAMIL DAY SIGN +0BF4 ; [*04F7.0020.0002] # TAMIL MONTH SIGN +0BF5 ; [*04F8.0020.0002] # TAMIL YEAR SIGN +0BF6 ; [*04F9.0020.0002] # TAMIL DEBIT SIGN +0BF7 ; [*04FA.0020.0002] # TAMIL CREDIT SIGN +0BF8 ; [*04FB.0020.0002] # TAMIL AS ABOVE SIGN +0BFA ; [*04FC.0020.0002] # TAMIL NUMBER SIGN +0C7F ; [*04FD.0020.0002] # TELUGU SIGN TUUMU +0D70 ; [*1A3B.0020.0002] # MALAYALAM NUMBER TEN +0D71 ; [*1A3C.0020.0002] # MALAYALAM NUMBER ONE HUNDRED +0D72 ; [*1A3D.0020.0002] # MALAYALAM NUMBER ONE THOUSAND +0D73 ; [*1A3E.0020.0002] # MALAYALAM FRACTION ONE QUARTER +0D74 ; [*1A3F.0020.0002] # MALAYALAM FRACTION ONE HALF +0D75 ; [*1A40.0020.0002] # MALAYALAM FRACTION THREE QUARTERS +0D79 ; [*04FE.0020.0002] # MALAYALAM DATE MARK +0DF4 ; [*03D8.0020.0002] # SINHALA PUNCTUATION KUNDDALIYA +0E4F ; [*03D9.0020.0002] # THAI CHARACTER FONGMAN +0E5A ; [*03DA.0020.0002] # THAI CHARACTER ANGKHANKHU +0E5B ; [*03DB.0020.0002] # THAI CHARACTER KHOMUT +0F01 ; [*0506.0020.0002] # TIBETAN MARK GTER YIG MGO TRUNCATED A +0F02 ; [*0507.0020.0002] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA +0F03 ; [*0508.0020.0002] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04 ; [*03DE.0020.0002] # TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05 ; [*03DF.0020.0002] # TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06 ; [*03E0.0020.0002] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA +0F07 ; [*03E1.0020.0002] # TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08 ; [*03E2.0020.0002] # TIBETAN MARK SBRUL SHAD +0F09 ; [*03E3.0020.0002] # TIBETAN MARK BSKUR YIG MGO +0F0A ; [*03E4.0020.0002] # TIBETAN MARK BKA- SHOG YIG MGO +0F0B ; [*03E7.0020.0002] # TIBETAN MARK INTERSYLLABIC TSHEG +0F0C ; [*03E7.0020.001B] # TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D ; [*03E8.0020.0002] # TIBETAN MARK SHAD +0F0E ; [*03E9.0020.0002] # TIBETAN MARK NYIS SHAD +0F0F ; [*03EA.0020.0002] # TIBETAN MARK TSHEG SHAD +0F10 ; [*03EB.0020.0002] # TIBETAN MARK NYIS TSHEG SHAD +0F11 ; [*03EC.0020.0002] # TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12 ; [*03ED.0020.0002] # TIBETAN MARK RGYA GRAM SHAD +0F13 ; [*0509.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; [*0257.0020.0002] # TIBETAN MARK GTER TSHEG +0F15 ; [*050A.0020.0002] # TIBETAN LOGOTYPE SIGN CHAD RTAGS +0F16 ; [*050B.0020.0002] # TIBETAN LOGOTYPE SIGN LHAG RTAGS +0F17 ; [*050C.0020.0002] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18 ; [.0000.0000.0000] # TIBETAN ASTROLOGICAL SIGN -KHYUD PA +0F19 ; [.0000.0000.0000] # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A ; [*050D.0020.0002] # TIBETAN SIGN RDEL DKAR GCIG +0F1B ; [*050E.0020.0002] # TIBETAN SIGN RDEL DKAR GNYIS +0F1C ; [*050F.0020.0002] # TIBETAN SIGN RDEL DKAR GSUM +0F1D ; [*0510.0020.0002] # TIBETAN SIGN RDEL NAG GCIG +0F1E ; [*0511.0020.0002] # TIBETAN SIGN RDEL NAG GNYIS +0F1F ; [*0512.0020.0002] # TIBETAN SIGN RDEL DKAR RDEL NAG +0F34 ; [*0513.0020.0002] # TIBETAN MARK BSDUS RTAGS +0F35 ; [.0000.0000.0000] # TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; [*0514.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; [.0000.0000.0000] # TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; [*0515.0020.0002] # TIBETAN MARK CHE MGO +0F3A ; [*0316.0020.0002] # TIBETAN MARK GUG RTAGS GYON +0F3B ; [*0317.0020.0002] # TIBETAN MARK GUG RTAGS GYAS +0F3C ; [*0318.0020.0002] # TIBETAN MARK ANG KHANG GYON +0F3D ; [*0319.0020.0002] # TIBETAN MARK ANG KHANG GYAS +0F3E ; [.0000.0000.0000] # TIBETAN SIGN YAR TSHES +0F3F ; [.0000.0000.0000] # TIBETAN SIGN MAR TSHES +0F82 ; [.0000.0000.0000] # TIBETAN SIGN NYI ZLA NAA DA +0F83 ; [.0000.0000.0000] # TIBETAN SIGN SNA LDAN +0F85 ; [*03EE.0020.0002] # TIBETAN MARK PALUTA +0F86 ; [.0000.0000.0000] # TIBETAN SIGN LCI RTAGS +0F87 ; [.0000.0000.0000] # TIBETAN SIGN YANG RTAGS +0FBE ; [*0516.0020.0002] # TIBETAN KU RU KHA +0FBF ; [*0517.0020.0002] # TIBETAN KU RU KHA BZHI MIG CAN +0FC0 ; [*0518.0020.0002] # TIBETAN CANTILLATION SIGN HEAVY BEAT +0FC1 ; [*0519.0020.0002] # TIBETAN CANTILLATION SIGN LIGHT BEAT +0FC2 ; [*051A.0020.0002] # TIBETAN CANTILLATION SIGN CANG TE-U +0FC3 ; [*051B.0020.0002] # TIBETAN CANTILLATION SIGN SBUB -CHAL +0FC4 ; [*051C.0020.0002] # TIBETAN SYMBOL DRIL BU +0FC5 ; [*051D.0020.0002] # TIBETAN SYMBOL RDO RJE +0FC6 ; [.0000.0000.0000] # TIBETAN SYMBOL PADMA GDAN +0FC7 ; [*051E.0020.0002] # TIBETAN SYMBOL RDO RJE RGYA GRAM +0FC8 ; [*051F.0020.0002] # TIBETAN SYMBOL PHUR PA +0FC9 ; [*0520.0020.0002] # TIBETAN SYMBOL NOR BU +0FCA ; [*0521.0020.0002] # TIBETAN SYMBOL NOR BU NYIS -KHYIL +0FCB ; [*0522.0020.0002] # TIBETAN SYMBOL NOR BU GSUM -KHYIL +0FCC ; [*0523.0020.0002] # TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE ; [*0524.0020.0002] # TIBETAN SIGN RDEL NAG RDEL DKAR +0FCF ; [*0525.0020.0002] # TIBETAN SIGN RDEL NAG GSUM +0FD0 ; [*03E5.0020.0002] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN +0FD1 ; [*03E6.0020.0002] # TIBETAN MARK MNYAM YIG GI MGO RGYAN +0FD2 ; [*03EF.0020.0002] # TIBETAN MARK NYIS TSHEG +0FD3 ; [*03F0.0020.0002] # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA +0FD4 ; [*03F1.0020.0002] # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5 ; [*0526.0020.0002] # RIGHT-FACING SVASTI SIGN +0FD6 ; [*0527.0020.0002] # LEFT-FACING SVASTI SIGN +0FD7 ; [*0528.0020.0002] # RIGHT-FACING SVASTI SIGN WITH DOTS +0FD8 ; [*0529.0020.0002] # LEFT-FACING SVASTI SIGN WITH DOTS +0FD9 ; [*03F2.0020.0002] # TIBETAN MARK LEADING MCHAN RTAGS +0FDA ; [*03F3.0020.0002] # TIBETAN MARK TRAILING MCHAN RTAGS +104A ; [*0296.0020.0002] # MYANMAR SIGN LITTLE SECTION +104B ; [*0297.0020.0002] # MYANMAR SIGN SECTION +104C ; [*03F7.0020.0002] # MYANMAR SYMBOL LOCATIVE +104D ; [*03F8.0020.0002] # MYANMAR SYMBOL COMPLETED +104E ; [*03F9.0020.0002] # MYANMAR SYMBOL AFOREMENTIONED +104F ; [*03FA.0020.0002] # MYANMAR SYMBOL GENITIVE +109E ; [*052B.0020.0002] # MYANMAR SYMBOL SHAN ONE +109F ; [*052C.0020.0002] # MYANMAR SYMBOL SHAN EXCLAMATION +10FB ; [*02BF.0020.0002] # GEORGIAN PARAGRAPH SEPARATOR +1360 ; [*02C0.0020.0002] # ETHIOPIC SECTION MARK +1361 ; [*0250.0020.0002] # ETHIOPIC WORDSPACE +1362 ; [*0279.0020.0002] # ETHIOPIC FULL STOP +1363 ; [*0251.0020.0002] # ETHIOPIC COMMA +1364 ; [*0252.0020.0002] # ETHIOPIC SEMICOLON +1365 ; [*0253.0020.0002] # ETHIOPIC COLON +1366 ; [*0254.0020.0002] # ETHIOPIC PREFACE COLON +1367 ; [*026A.0020.0002] # ETHIOPIC QUESTION MARK +1368 ; [*02C1.0020.0002] # ETHIOPIC PARAGRAPH SEPARATOR +1372 ; [*1A41.0020.0002] # ETHIOPIC NUMBER TEN +1373 ; [*1A42.0020.0002] # ETHIOPIC NUMBER TWENTY +1374 ; [*1A43.0020.0002] # ETHIOPIC NUMBER THIRTY +1375 ; [*1A44.0020.0002] # ETHIOPIC NUMBER FORTY +1376 ; [*1A45.0020.0002] # ETHIOPIC NUMBER FIFTY +1377 ; [*1A46.0020.0002] # ETHIOPIC NUMBER SIXTY +1378 ; [*1A47.0020.0002] # ETHIOPIC NUMBER SEVENTY +1379 ; [*1A48.0020.0002] # ETHIOPIC NUMBER EIGHTY +137A ; [*1A49.0020.0002] # ETHIOPIC NUMBER NINETY +137B ; [*1A4A.0020.0002] # ETHIOPIC NUMBER HUNDRED +137C ; [*1A4B.0020.0002] # ETHIOPIC NUMBER TEN THOUSAND +1390 ; [*04A7.0020.0002] # ETHIOPIC TONAL MARK YIZET +1391 ; [*04A8.0020.0002] # ETHIOPIC TONAL MARK DERET +1392 ; [*04A9.0020.0002] # ETHIOPIC TONAL MARK RIKRIK +1393 ; [*04AA.0020.0002] # ETHIOPIC TONAL MARK SHORT RIKRIK +1394 ; [*04AB.0020.0002] # ETHIOPIC TONAL MARK DIFAT +1395 ; [*04AC.0020.0002] # ETHIOPIC TONAL MARK KENAT +1396 ; [*04AD.0020.0002] # ETHIOPIC TONAL MARK CHIRET +1397 ; [*04AE.0020.0002] # ETHIOPIC TONAL MARK HIDET +1398 ; [*04AF.0020.0002] # ETHIOPIC TONAL MARK DERET-HIDET +1399 ; [*04B0.0020.0002] # ETHIOPIC TONAL MARK KURT +1400 ; [*020F.0020.0002] # CANADIAN SYLLABICS HYPHEN +166D ; [*0407.0020.0002] # CANADIAN SYLLABICS CHI SIGN +166E ; [*027C.0020.0002] # CANADIAN SYLLABICS FULL STOP +1680 ; [*0209.0020.0004] # OGHAM SPACE MARK +169B ; [*031A.0020.0002] # OGHAM FEATHER MARK +169C ; [*031B.0020.0002] # OGHAM REVERSED FEATHER MARK +16EB ; [*025B.0020.0002] # RUNIC SINGLE PUNCTUATION +16EC ; [*025C.0020.0002] # RUNIC MULTIPLE PUNCTUATION +16ED ; [*025D.0020.0002] # RUNIC CROSS PUNCTUATION +1735 ; [*0293.0020.0002] # PHILIPPINE SINGLE PUNCTUATION +1736 ; [*0294.0020.0002] # PHILIPPINE DOUBLE PUNCTUATION +17B4 ; [.0000.0000.0000] # KHMER VOWEL INHERENT AQ +17B5 ; [.0000.0000.0000] # KHMER VOWEL INHERENT AA +17D3 ; [.0000.0000.0000] # KHMER SIGN BATHAMASAT +17D4 ; [*0298.0020.0002] # KHMER SIGN KHAN +17D5 ; [*0299.0020.0002] # KHMER SIGN BARIYOOSAN +17D6 ; [*0258.0020.0002] # KHMER SIGN CAMNUC PII KUUH +17D8 ; [*03FB.0020.0002] # KHMER SIGN BEYYAL +17D9 ; [*03FC.0020.0002] # KHMER SIGN PHNAEK MUAN +17DA ; [*03FD.0020.0002] # KHMER SIGN KOOMUUT +1800 ; [*03D1.0020.0002] # MONGOLIAN BIRGA +1801 ; [*0275.0020.0002] # MONGOLIAN ELLIPSIS +1802 ; [*022B.0020.0002] # MONGOLIAN COMMA +1803 ; [*027A.0020.0002] # MONGOLIAN FULL STOP +1804 ; [*0255.0020.0002] # MONGOLIAN COLON +1805 ; [*0256.0020.0002] # MONGOLIAN FOUR DOTS +1806 ; [*0211.0020.0002] # MONGOLIAN TODO SOFT HYPHEN +1807 ; [*0212.0020.0002] # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +1808 ; [*022C.0020.0002] # MONGOLIAN MANCHU COMMA +1809 ; [*027B.0020.0002] # MONGOLIAN MANCHU FULL STOP +180A ; [.0000.0000.0000] # MONGOLIAN NIRUGU +1940 ; [*052A.0020.0002] # LIMBU SIGN LOO +1944 ; [*0263.0020.0002] # LIMBU EXCLAMATION MARK +1945 ; [*026B.0020.0002] # LIMBU QUESTION MARK +19E0 ; [*0531.0020.0002] # KHMER SYMBOL PATHAMASAT +19E1 ; [*0532.0020.0002] # KHMER SYMBOL MUOY KOET +19E2 ; [*0533.0020.0002] # KHMER SYMBOL PII KOET +19E3 ; [*0534.0020.0002] # KHMER SYMBOL BEI KOET +19E4 ; [*0535.0020.0002] # KHMER SYMBOL BUON KOET +19E5 ; [*0536.0020.0002] # KHMER SYMBOL PRAM KOET +19E6 ; [*0537.0020.0002] # KHMER SYMBOL PRAM-MUOY KOET +19E7 ; [*0538.0020.0002] # KHMER SYMBOL PRAM-PII KOET +19E8 ; [*0539.0020.0002] # KHMER SYMBOL PRAM-BEI KOET +19E9 ; [*053A.0020.0002] # KHMER SYMBOL PRAM-BUON KOET +19EA ; [*053B.0020.0002] # KHMER SYMBOL DAP KOET +19EB ; [*053C.0020.0002] # KHMER SYMBOL DAP-MUOY KOET +19EC ; [*053D.0020.0002] # KHMER SYMBOL DAP-PII KOET +19ED ; [*053E.0020.0002] # KHMER SYMBOL DAP-BEI KOET +19EE ; [*053F.0020.0002] # KHMER SYMBOL DAP-BUON KOET +19EF ; [*0540.0020.0002] # KHMER SYMBOL DAP-PRAM KOET +19F0 ; [*0541.0020.0002] # KHMER SYMBOL TUTEYASAT +19F1 ; [*0542.0020.0002] # KHMER SYMBOL MUOY ROC +19F2 ; [*0543.0020.0002] # KHMER SYMBOL PII ROC +19F3 ; [*0544.0020.0002] # KHMER SYMBOL BEI ROC +19F4 ; [*0545.0020.0002] # KHMER SYMBOL BUON ROC +19F5 ; [*0546.0020.0002] # KHMER SYMBOL PRAM ROC +19F6 ; [*0547.0020.0002] # KHMER SYMBOL PRAM-MUOY ROC +19F7 ; [*0548.0020.0002] # KHMER SYMBOL PRAM-PII ROC +19F8 ; [*0549.0020.0002] # KHMER SYMBOL PRAM-BEI ROC +19F9 ; [*054A.0020.0002] # KHMER SYMBOL PRAM-BUON ROC +19FA ; [*054B.0020.0002] # KHMER SYMBOL DAP ROC +19FB ; [*054C.0020.0002] # KHMER SYMBOL DAP-MUOY ROC +19FC ; [*054D.0020.0002] # KHMER SYMBOL DAP-PII ROC +19FD ; [*054E.0020.0002] # KHMER SYMBOL DAP-BEI ROC +19FE ; [*054F.0020.0002] # KHMER SYMBOL DAP-BUON ROC +19FF ; [*0550.0020.0002] # KHMER SYMBOL DAP-PRAM ROC +1A1E ; [*02C2.0020.0002] # BUGINESE PALLAWA +1A1F ; [*02C3.0020.0002] # BUGINESE END OF SECTION +1A7F ; [.0000.0000.0000] # TAI THAM COMBINING CRYPTOGRAMMIC DOT +1AA0 ; [*03FE.0020.0002] # TAI THAM SIGN WIANG +1AA1 ; [*03FF.0020.0002] # TAI THAM SIGN WIANGWAAK +1AA2 ; [*0400.0020.0002] # TAI THAM SIGN SAWAN +1AA3 ; [*0401.0020.0002] # TAI THAM SIGN KEOW +1AA4 ; [*0402.0020.0002] # TAI THAM SIGN HOY +1AA5 ; [*0403.0020.0002] # TAI THAM SIGN DOKMAI +1AA6 ; [*0404.0020.0002] # TAI THAM SIGN REVERSED ROTATED RANA +1AA8 ; [*029A.0020.0002] # TAI THAM SIGN KAAN +1AA9 ; [*029B.0020.0002] # TAI THAM SIGN KAANKUU +1AAA ; [*029C.0020.0002] # TAI THAM SIGN SATKAAN +1AAB ; [*029D.0020.0002] # TAI THAM SIGN SATKAANKUU +1AAC ; [*0405.0020.0002] # TAI THAM SIGN HANG +1AAD ; [*0406.0020.0002] # TAI THAM SIGN CAANG +1B5A ; [*02C4.0020.0002] # BALINESE PANTI +1B5B ; [*02C5.0020.0002] # BALINESE PAMADA +1B5C ; [*027D.0020.0002] # BALINESE WINDU +1B5D ; [*0259.0020.0002] # BALINESE CARIK PAMUNGKAH +1B5E ; [*029E.0020.0002] # BALINESE CARIK SIKI +1B5F ; [*029F.0020.0002] # BALINESE CARIK PAREREN +1B60 ; [*0210.0020.0002] # BALINESE PAMENENG +1B61 ; [*0551.0020.0002] # BALINESE MUSICAL SYMBOL DONG +1B62 ; [*0552.0020.0002] # BALINESE MUSICAL SYMBOL DENG +1B63 ; [*0553.0020.0002] # BALINESE MUSICAL SYMBOL DUNG +1B64 ; [*0554.0020.0002] # BALINESE MUSICAL SYMBOL DANG +1B65 ; [*0555.0020.0002] # BALINESE MUSICAL SYMBOL DANG SURANG +1B66 ; [*0556.0020.0002] # BALINESE MUSICAL SYMBOL DING +1B67 ; [*0557.0020.0002] # BALINESE MUSICAL SYMBOL DAENG +1B68 ; [*0558.0020.0002] # BALINESE MUSICAL SYMBOL DEUNG +1B69 ; [*0559.0020.0002] # BALINESE MUSICAL SYMBOL DAING +1B6A ; [*055A.0020.0002] # BALINESE MUSICAL SYMBOL DANG GEDE +1B6B ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING TEGEH +1B6C ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING ENDEP +1B6D ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL +1B6E ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI +1B6F ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING JEGOGAN +1B70 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN +1B71 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN +1B72 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING BENDE +1B73 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING GONG +1B74 ; [*055B.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG +1B75 ; [*055C.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG +1B76 ; [*055D.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK +1B77 ; [*055E.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK +1B78 ; [*055F.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG +1B79 ; [*0560.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG +1B7A ; [*0561.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK +1B7B ; [*0562.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK +1B7C ; [*0563.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1BFC ; [*0413.0020.0002] # BATAK SYMBOL BINDU NA METEK +1BFD ; [*0414.0020.0002] # BATAK SYMBOL BINDU PINARBORAS +1BFE ; [*0415.0020.0002] # BATAK SYMBOL BINDU JUDUL +1BFF ; [*0416.0020.0002] # BATAK SYMBOL BINDU PANGOLAT +1C3B ; [*028F.0020.0002] # LEPCHA PUNCTUATION TA-ROL +1C3C ; [*0290.0020.0002] # LEPCHA PUNCTUATION NYET THYOOM TA-ROL +1C3D ; [*03F4.0020.0002] # LEPCHA PUNCTUATION CER-WA +1C3E ; [*03F5.0020.0002] # LEPCHA PUNCTUATION TSHOOK CER-WA +1C3F ; [*03F6.0020.0002] # LEPCHA PUNCTUATION TSHOOK +1C7E ; [*02BB.0020.0002] # OL CHIKI PUNCTUATION MUCAAD +1C7F ; [*02BC.0020.0002] # OL CHIKI PUNCTUATION DOUBLE MUCAAD +1CC0 ; [*0408.0020.0002] # SUNDANESE PUNCTUATION BINDU SURYA +1CC1 ; [*0409.0020.0002] # SUNDANESE PUNCTUATION BINDU PANGLONG +1CC2 ; [*040A.0020.0002] # SUNDANESE PUNCTUATION BINDU PURNAMA +1CC3 ; [*040B.0020.0002] # SUNDANESE PUNCTUATION BINDU CAKRA +1CC4 ; [*040C.0020.0002] # SUNDANESE PUNCTUATION BINDU LEU SATANGA +1CC5 ; [*040D.0020.0002] # SUNDANESE PUNCTUATION BINDU KA SATANGA +1CC6 ; [*040E.0020.0002] # SUNDANESE PUNCTUATION BINDU DA SATANGA +1CC7 ; [*040F.0020.0002] # SUNDANESE PUNCTUATION BINDU BA SATANGA +1CD0 ; [.0000.0000.0000] # VEDIC TONE KARSHANA +1CD1 ; [.0000.0000.0000] # VEDIC TONE SHARA +1CD2 ; [.0000.0000.0000] # VEDIC TONE PRENKHA +1CD3 ; [.0000.0000.0000] # VEDIC SIGN NIHSHVASA +1CD4 ; [.0000.0000.0000] # VEDIC SIGN YAJURVEDIC MIDLINE SVARITA +1CD5 ; [.0000.0000.0000] # VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA +1CD6 ; [.0000.0000.0000] # VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA +1CD7 ; [.0000.0000.0000] # VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA +1CD8 ; [.0000.0000.0000] # VEDIC TONE CANDRA BELOW +1CD9 ; [.0000.0000.0000] # VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER +1CDA ; [.0000.0000.0000] # VEDIC TONE DOUBLE SVARITA +1CDB ; [.0000.0000.0000] # VEDIC TONE TRIPLE SVARITA +1CDC ; [.0000.0000.0000] # VEDIC TONE KATHAKA ANUDATTA +1CDD ; [.0000.0000.0000] # VEDIC TONE DOT BELOW +1CDE ; [.0000.0000.0000] # VEDIC TONE TWO DOTS BELOW +1CDF ; [.0000.0000.0000] # VEDIC TONE THREE DOTS BELOW +1CE0 ; [.0000.0000.0000] # VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; [.0000.0000.0000] # VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2 ; [.0000.0000.0000] # VEDIC SIGN VISARGA SVARITA +1CE3 ; [.0000.0000.0000] # VEDIC SIGN VISARGA UDATTA +1CE4 ; [.0000.0000.0000] # VEDIC SIGN REVERSED VISARGA UDATTA +1CE5 ; [.0000.0000.0000] # VEDIC SIGN VISARGA ANUDATTA +1CE6 ; [.0000.0000.0000] # VEDIC SIGN REVERSED VISARGA ANUDATTA +1CE7 ; [.0000.0000.0000] # VEDIC SIGN VISARGA UDATTA WITH TAIL +1CE8 ; [.0000.0000.0000] # VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CF4 ; [.0000.0000.0000] # VEDIC TONE CANDRA ABOVE +1CF8 ; [.0000.0000.0000] # VEDIC TONE RING ABOVE +1CF9 ; [.0000.0000.0000] # VEDIC TONE DOUBLE RING ABOVE +1FBD ; [*046F.0020.0002] # GREEK KORONIS +1FBF ; [*046F.0020.0002] # GREEK PSILI +1FC0 ; [*0471.0020.0002] # GREEK PERISPOMENI +1FC1 ; [*046A.0020.0002][.0000.002A.0002] # GREEK DIALYTIKA AND PERISPOMENI +1FCD ; [*046F.0020.0002][.0000.0025.0002] # GREEK PSILI AND VARIA +1FCE ; [*046F.0020.0002][.0000.0024.0002] # GREEK PSILI AND OXIA +1FCF ; [*046F.0020.0002][.0000.002A.0002] # GREEK PSILI AND PERISPOMENI +1FDD ; [*0470.0020.0002][.0000.0025.0002] # GREEK DASIA AND VARIA +1FDE ; [*0470.0020.0002][.0000.0024.0002] # GREEK DASIA AND OXIA +1FDF ; [*0470.0020.0002][.0000.002A.0002] # GREEK DASIA AND PERISPOMENI +1FED ; [*046A.0020.0002][.0000.0025.0002] # GREEK DIALYTIKA AND VARIA +1FEE ; [*046A.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA AND OXIA +1FEF ; [*0463.0020.0002] # GREEK VARIA +1FFD ; [*0464.0020.0002] # GREEK OXIA +1FFE ; [*0470.0020.0002] # GREEK DASIA +2000 ; [*0209.0020.0004] # EN QUAD +2001 ; [*0209.0020.0004] # EM QUAD +2002 ; [*0209.0020.0004] # EN SPACE +2003 ; [*0209.0020.0004] # EM SPACE +2004 ; [*0209.0020.0004] # THREE-PER-EM SPACE +2005 ; [*0209.0020.0004] # FOUR-PER-EM SPACE +2006 ; [*0209.0020.0004] # SIX-PER-EM SPACE +2007 ; [*0209.0020.001B] # FIGURE SPACE +2008 ; [*0209.0020.0004] # PUNCTUATION SPACE +2009 ; [*0209.0020.0004] # THIN SPACE +200A ; [*0209.0020.0004] # HAIR SPACE +2010 ; [*0213.0020.0002] # HYPHEN +2011 ; [*0213.0020.001B] # NON-BREAKING HYPHEN +2012 ; [*0214.0020.0002] # FIGURE DASH +2013 ; [*0215.0020.0002] # EN DASH +2014 ; [*0216.0020.0002] # EM DASH +2015 ; [*0217.0020.0002] # HORIZONTAL BAR +2016 ; [*037C.0020.0002] # DOUBLE VERTICAL LINE +2017 ; [*020C.0020.0002] # DOUBLE LOW LINE +2018 ; [*02FF.0020.0002] # LEFT SINGLE QUOTATION MARK +2019 ; [*0300.0020.0002] # RIGHT SINGLE QUOTATION MARK +201A ; [*0301.0020.0002] # SINGLE LOW-9 QUOTATION MARK +201B ; [*0302.0020.0002] # SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C ; [*0306.0020.0002] # LEFT DOUBLE QUOTATION MARK +201D ; [*0307.0020.0002] # RIGHT DOUBLE QUOTATION MARK +201E ; [*0308.0020.0002] # DOUBLE LOW-9 QUOTATION MARK +201F ; [*0309.0020.0002] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020 ; [*0398.0020.0002] # DAGGER +2021 ; [*0399.0020.0002] # DOUBLE DAGGER +2022 ; [*039D.0020.0002] # BULLET +2023 ; [*039E.0020.0002] # TRIANGULAR BULLET +2024 ; [*0274.0020.0004] # ONE DOT LEADER +2025 ; [*0274.0020.0004][*0274.0020.0004] # TWO DOT LEADER +2026 ; [*0274.0020.0004][*0274.0020.0004][*0274.0020.0004] # HORIZONTAL ELLIPSIS +2027 ; [*039F.0020.0002] # HYPHENATION POINT +2028 ; [*0207.0020.0002] # LINE SEPARATOR +2029 ; [*0208.0020.0002] # PARAGRAPH SEPARATOR +202F ; [*0209.0020.001B] # NARROW NO-BREAK SPACE +2030 ; [*0394.0020.0002] # PER MILLE SIGN +2031 ; [*0396.0020.0002] # PER TEN THOUSAND SIGN +2032 ; [*03A3.0020.0002] # PRIME +2033 ; [*03A3.0020.0004][*03A3.0020.0004] # DOUBLE PRIME +2034 ; [*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004] # TRIPLE PRIME +2035 ; [*03A4.0020.0002] # REVERSED PRIME +2036 ; [*03A4.0020.0004][*03A4.0020.0004] # REVERSED DOUBLE PRIME +2037 ; [*03A4.0020.0004][*03A4.0020.0004][*03A4.0020.0004] # REVERSED TRIPLE PRIME +2038 ; [*03A7.0020.0002] # CARET +2039 ; [*0303.0020.0002] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; [*0304.0020.0002] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B ; [*03A8.0020.0002] # REFERENCE MARK +203C ; [*025F.0020.0004][*025F.0020.0004] # DOUBLE EXCLAMATION MARK +203D ; [*0272.0020.0002] # INTERROBANG +203E ; [*020A.0020.0002] # OVERLINE +203F ; [*03A9.0020.0002] # UNDERTIE +2040 ; [*03AB.0020.0002] # CHARACTER TIE +2041 ; [*03AD.0020.0002] # CARET INSERTION POINT +2042 ; [*03AE.0020.0002] # ASTERISM +2043 ; [*03A0.0020.0002] # HYPHEN BULLET +2044 ; [*0606.0020.0002] # FRACTION SLASH +2045 ; [*031C.0020.0002] # LEFT SQUARE BRACKET WITH QUILL +2046 ; [*031D.0020.0002] # RIGHT SQUARE BRACKET WITH QUILL +2047 ; [*0264.0020.0004][*0264.0020.0004] # DOUBLE QUESTION MARK +2048 ; [*0264.0020.0004][*025F.0020.0004] # QUESTION EXCLAMATION MARK +2049 ; [*025F.0020.0004][*0264.0020.0004] # EXCLAMATION QUESTION MARK +204A ; [*0390.0020.0002] # TIRONIAN SIGN ET +204B ; [*0385.0020.0002] # REVERSED PILCROW SIGN +204C ; [*03A1.0020.0002] # BLACK LEFTWARDS BULLET +204D ; [*03A2.0020.0002] # BLACK RIGHTWARDS BULLET +204E ; [*0389.0020.0002] # LOW ASTERISK +204F ; [*0235.0020.0002] # REVERSED SEMICOLON +2050 ; [*03AC.0020.0002] # CLOSE UP +2051 ; [*038A.0020.0002] # TWO ASTERISKS ALIGNED VERTICALLY +2052 ; [*0602.0020.0002] # COMMERCIAL MINUS SIGN +2053 ; [*021A.0020.0002] # SWUNG DASH +2054 ; [*03AA.0020.0002] # INVERTED UNDERTIE +2055 ; [*02E1.0020.0002] # FLOWER PUNCTUATION MARK +2056 ; [*02E2.0020.0002] # THREE DOT PUNCTUATION +2057 ; [*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004] # QUADRUPLE PRIME +2058 ; [*02E3.0020.0002] # FOUR DOT PUNCTUATION +2059 ; [*02E4.0020.0002] # FIVE DOT PUNCTUATION +205A ; [*02E5.0020.0002] # TWO DOT PUNCTUATION +205B ; [*02E6.0020.0002] # FOUR DOT MARK +205C ; [*02E7.0020.0002] # DOTTED CROSS +205D ; [*02E8.0020.0002] # TRICOLON +205E ; [*02E9.0020.0002] # VERTICAL FOUR DOTS +205F ; [*0209.0020.0004] # MEDIUM MATHEMATICAL SPACE +2061 ; [.0000.0000.0000] # FUNCTION APPLICATION +2062 ; [.0000.0000.0000] # INVISIBLE TIMES +2063 ; [.0000.0000.0000] # INVISIBLE SEPARATOR +2064 ; [.0000.0000.0000] # INVISIBLE PLUS +207A ; [*05F6.0020.0014] # SUPERSCRIPT PLUS SIGN +207B ; [*0601.0020.0014] # SUPERSCRIPT MINUS +207C ; [*05FB.0020.0014] # SUPERSCRIPT EQUALS SIGN +207D ; [*0310.0020.0014] # SUPERSCRIPT LEFT PARENTHESIS +207E ; [*0311.0020.0014] # SUPERSCRIPT RIGHT PARENTHESIS +208A ; [*05F6.0020.0015] # SUBSCRIPT PLUS SIGN +208B ; [*0601.0020.0015] # SUBSCRIPT MINUS +208C ; [*05FB.0020.0015] # SUBSCRIPT EQUALS SIGN +208D ; [*0310.0020.0015] # SUBSCRIPT LEFT PARENTHESIS +208E ; [*0311.0020.0015] # SUBSCRIPT RIGHT PARENTHESIS +2104 ; [*0566.0020.0002] # CENTRE LINE SYMBOL +2108 ; [*0567.0020.0002] # SCRUPLE +2114 ; [*0568.0020.0002] # L B BAR SYMBOL +2117 ; [*0569.0020.0002] # SOUND RECORDING COPYRIGHT +2118 ; [*056A.0020.0002] # SCRIPT CAPITAL P +211E ; [*056B.0020.0002] # PRESCRIPTION TAKE +211F ; [*056C.0020.0002] # RESPONSE +2123 ; [*056D.0020.0002] # VERSICLE +2125 ; [*056E.0020.0002] # OUNCE SIGN +2127 ; [*056F.0020.0002] # INVERTED OHM SIGN +2129 ; [*0570.0020.0002] # TURNED GREEK SMALL LETTER IOTA +212E ; [*0571.0020.0002] # ESTIMATED SYMBOL +213A ; [*0572.0020.0002] # ROTATED CAPITAL Q +2140 ; [*05F5.0020.0005] # DOUBLE-STRUCK N-ARY SUMMATION +2141 ; [*0573.0020.0002] # TURNED SANS-SERIF CAPITAL G +2142 ; [*0574.0020.0002] # TURNED SANS-SERIF CAPITAL L +2143 ; [*0575.0020.0002] # REVERSED SANS-SERIF CAPITAL L +2144 ; [*0576.0020.0002] # TURNED SANS-SERIF CAPITAL Y +214A ; [*0577.0020.0002] # PROPERTY LINE +214B ; [*0691.0020.0002] # TURNED AMPERSAND +214C ; [*0578.0020.0002] # PER SIGN +214F ; [*0579.0020.0002] # SYMBOL FOR SAMARITAN SOURCE +2180 ; [*1A4C.0020.0002] # ROMAN NUMERAL ONE THOUSAND C D +2181 ; [*1A4D.0020.0002] # ROMAN NUMERAL FIVE THOUSAND +2182 ; [*1A4E.0020.0002] # ROMAN NUMERAL TEN THOUSAND +2186 ; [*1A4F.0020.0002] # ROMAN NUMERAL FIFTY EARLY FORM +2187 ; [*1A50.0020.0002] # ROMAN NUMERAL FIFTY THOUSAND +2188 ; [*1A51.0020.0002] # ROMAN NUMERAL ONE HUNDRED THOUSAND +218A ; [*057A.0020.0002] # TURNED DIGIT TWO +218B ; [*057B.0020.0002] # TURNED DIGIT THREE +2190 ; [*057C.0020.0002] # LEFTWARDS ARROW +2191 ; [*057E.0020.0002] # UPWARDS ARROW +2192 ; [*057D.0020.0002] # RIGHTWARDS ARROW +2193 ; [*057F.0020.0002] # DOWNWARDS ARROW +2194 ; [*0580.0020.0002] # LEFT RIGHT ARROW +2195 ; [*0581.0020.0002] # UP DOWN ARROW +2196 ; [*0582.0020.0002] # NORTH WEST ARROW +2197 ; [*0583.0020.0002] # NORTH EAST ARROW +2198 ; [*0584.0020.0002] # SOUTH EAST ARROW +2199 ; [*0585.0020.0002] # SOUTH WEST ARROW +219A ; [*057C.0020.0002][.0000.002F.0002] # LEFTWARDS ARROW WITH STROKE +219B ; [*057D.0020.0002][.0000.002F.0002] # RIGHTWARDS ARROW WITH STROKE +219C ; [*0586.0020.0002] # LEFTWARDS WAVE ARROW +219D ; [*0587.0020.0002] # RIGHTWARDS WAVE ARROW +219E ; [*0588.0020.0002] # LEFTWARDS TWO HEADED ARROW +219F ; [*0589.0020.0002] # UPWARDS TWO HEADED ARROW +21A0 ; [*058A.0020.0002] # RIGHTWARDS TWO HEADED ARROW +21A1 ; [*058B.0020.0002] # DOWNWARDS TWO HEADED ARROW +21A2 ; [*058C.0020.0002] # LEFTWARDS ARROW WITH TAIL +21A3 ; [*058D.0020.0002] # RIGHTWARDS ARROW WITH TAIL +21A4 ; [*058E.0020.0002] # LEFTWARDS ARROW FROM BAR +21A5 ; [*058F.0020.0002] # UPWARDS ARROW FROM BAR +21A6 ; [*0590.0020.0002] # RIGHTWARDS ARROW FROM BAR +21A7 ; [*0591.0020.0002] # DOWNWARDS ARROW FROM BAR +21A8 ; [*0592.0020.0002] # UP DOWN ARROW WITH BASE +21A9 ; [*0593.0020.0002] # LEFTWARDS ARROW WITH HOOK +21AA ; [*0594.0020.0002] # RIGHTWARDS ARROW WITH HOOK +21AB ; [*0595.0020.0002] # LEFTWARDS ARROW WITH LOOP +21AC ; [*0596.0020.0002] # RIGHTWARDS ARROW WITH LOOP +21AD ; [*0597.0020.0002] # LEFT RIGHT WAVE ARROW +21AE ; [*0580.0020.0002][.0000.002F.0002] # LEFT RIGHT ARROW WITH STROKE +21AF ; [*0598.0020.0002] # DOWNWARDS ZIGZAG ARROW +21B0 ; [*0599.0020.0002] # UPWARDS ARROW WITH TIP LEFTWARDS +21B1 ; [*059A.0020.0002] # UPWARDS ARROW WITH TIP RIGHTWARDS +21B2 ; [*059B.0020.0002] # DOWNWARDS ARROW WITH TIP LEFTWARDS +21B3 ; [*059C.0020.0002] # DOWNWARDS ARROW WITH TIP RIGHTWARDS +21B4 ; [*059D.0020.0002] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS +21B5 ; [*059E.0020.0002] # DOWNWARDS ARROW WITH CORNER LEFTWARDS +21B6 ; [*059F.0020.0002] # ANTICLOCKWISE TOP SEMICIRCLE ARROW +21B7 ; [*05A0.0020.0002] # CLOCKWISE TOP SEMICIRCLE ARROW +21B8 ; [*05A1.0020.0002] # NORTH WEST ARROW TO LONG BAR +21B9 ; [*05A2.0020.0002] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA ; [*05A3.0020.0002] # ANTICLOCKWISE OPEN CIRCLE ARROW +21BB ; [*05A4.0020.0002] # CLOCKWISE OPEN CIRCLE ARROW +21BC ; [*05A5.0020.0002] # LEFTWARDS HARPOON WITH BARB UPWARDS +21BD ; [*05A6.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWNWARDS +21BE ; [*05A7.0020.0002] # UPWARDS HARPOON WITH BARB RIGHTWARDS +21BF ; [*05A8.0020.0002] # UPWARDS HARPOON WITH BARB LEFTWARDS +21C0 ; [*05A9.0020.0002] # RIGHTWARDS HARPOON WITH BARB UPWARDS +21C1 ; [*05AA.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS +21C2 ; [*05AB.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS +21C3 ; [*05AC.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFTWARDS +21C4 ; [*05AD.0020.0002] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW +21C5 ; [*05AE.0020.0002] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +21C6 ; [*05AF.0020.0002] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW +21C7 ; [*05B0.0020.0002] # LEFTWARDS PAIRED ARROWS +21C8 ; [*05B1.0020.0002] # UPWARDS PAIRED ARROWS +21C9 ; [*05B2.0020.0002] # RIGHTWARDS PAIRED ARROWS +21CA ; [*05B3.0020.0002] # DOWNWARDS PAIRED ARROWS +21CB ; [*05B4.0020.0002] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +21CC ; [*05B5.0020.0002] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +21CD ; [*05B6.0020.0002][.0000.002F.0002] # LEFTWARDS DOUBLE ARROW WITH STROKE +21CE ; [*05BA.0020.0002][.0000.002F.0002] # LEFT RIGHT DOUBLE ARROW WITH STROKE +21CF ; [*05B8.0020.0002][.0000.002F.0002] # RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0 ; [*05B6.0020.0002] # LEFTWARDS DOUBLE ARROW +21D1 ; [*05B7.0020.0002] # UPWARDS DOUBLE ARROW +21D2 ; [*05B8.0020.0002] # RIGHTWARDS DOUBLE ARROW +21D3 ; [*05B9.0020.0002] # DOWNWARDS DOUBLE ARROW +21D4 ; [*05BA.0020.0002] # LEFT RIGHT DOUBLE ARROW +21D5 ; [*05BB.0020.0002] # UP DOWN DOUBLE ARROW +21D6 ; [*05BC.0020.0002] # NORTH WEST DOUBLE ARROW +21D7 ; [*05BD.0020.0002] # NORTH EAST DOUBLE ARROW +21D8 ; [*05BE.0020.0002] # SOUTH EAST DOUBLE ARROW +21D9 ; [*05BF.0020.0002] # SOUTH WEST DOUBLE ARROW +21DA ; [*05C0.0020.0002] # LEFTWARDS TRIPLE ARROW +21DB ; [*05C1.0020.0002] # RIGHTWARDS TRIPLE ARROW +21DC ; [*05C2.0020.0002] # LEFTWARDS SQUIGGLE ARROW +21DD ; [*05C3.0020.0002] # RIGHTWARDS SQUIGGLE ARROW +21DE ; [*05C4.0020.0002] # UPWARDS ARROW WITH DOUBLE STROKE +21DF ; [*05C5.0020.0002] # DOWNWARDS ARROW WITH DOUBLE STROKE +21E0 ; [*05C6.0020.0002] # LEFTWARDS DASHED ARROW +21E1 ; [*05C7.0020.0002] # UPWARDS DASHED ARROW +21E2 ; [*05C8.0020.0002] # RIGHTWARDS DASHED ARROW +21E3 ; [*05C9.0020.0002] # DOWNWARDS DASHED ARROW +21E4 ; [*05CA.0020.0002] # LEFTWARDS ARROW TO BAR +21E5 ; [*05CB.0020.0002] # RIGHTWARDS ARROW TO BAR +21E6 ; [*05CC.0020.0002] # LEFTWARDS WHITE ARROW +21E7 ; [*05CD.0020.0002] # UPWARDS WHITE ARROW +21E8 ; [*05CE.0020.0002] # RIGHTWARDS WHITE ARROW +21E9 ; [*05CF.0020.0002] # DOWNWARDS WHITE ARROW +21EA ; [*05D0.0020.0002] # UPWARDS WHITE ARROW FROM BAR +21EB ; [*05D1.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL +21EC ; [*05D2.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR +21ED ; [*05D3.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR +21EE ; [*05D4.0020.0002] # UPWARDS WHITE DOUBLE ARROW +21EF ; [*05D5.0020.0002] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL +21F0 ; [*05D6.0020.0002] # RIGHTWARDS WHITE ARROW FROM WALL +21F1 ; [*05D7.0020.0002] # NORTH WEST ARROW TO CORNER +21F2 ; [*05D8.0020.0002] # SOUTH EAST ARROW TO CORNER +21F3 ; [*05D9.0020.0002] # UP DOWN WHITE ARROW +21F4 ; [*05DA.0020.0002] # RIGHT ARROW WITH SMALL CIRCLE +21F5 ; [*05DB.0020.0002] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +21F6 ; [*05DC.0020.0002] # THREE RIGHTWARDS ARROWS +21F7 ; [*05DD.0020.0002] # LEFTWARDS ARROW WITH VERTICAL STROKE +21F8 ; [*05DE.0020.0002] # RIGHTWARDS ARROW WITH VERTICAL STROKE +21F9 ; [*05DF.0020.0002] # LEFT RIGHT ARROW WITH VERTICAL STROKE +21FA ; [*05E0.0020.0002] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FB ; [*05E1.0020.0002] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FC ; [*05E2.0020.0002] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE +21FD ; [*05E3.0020.0002] # LEFTWARDS OPEN-HEADED ARROW +21FE ; [*05E4.0020.0002] # RIGHTWARDS OPEN-HEADED ARROW +21FF ; [*05E5.0020.0002] # LEFT RIGHT OPEN-HEADED ARROW +2200 ; [*05E6.0020.0002] # FOR ALL +2201 ; [*05E7.0020.0002] # COMPLEMENT +2202 ; [*05E8.0020.0002] # PARTIAL DIFFERENTIAL +2203 ; [*05E9.0020.0002] # THERE EXISTS +2204 ; [*05E9.0020.0002][.0000.002F.0002] # THERE DOES NOT EXIST +2205 ; [*05EA.0020.0002] # EMPTY SET +2206 ; [*05EB.0020.0002] # INCREMENT +2207 ; [*05EC.0020.0002] # NABLA +2208 ; [*05ED.0020.0002] # ELEMENT OF +2209 ; [*05ED.0020.0002][.0000.002F.0002] # NOT AN ELEMENT OF +220A ; [*05EE.0020.0002] # SMALL ELEMENT OF +220B ; [*05EF.0020.0002] # CONTAINS AS MEMBER +220C ; [*05EF.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS MEMBER +220D ; [*05F0.0020.0002] # SMALL CONTAINS AS MEMBER +220E ; [*05F2.0020.0002] # END OF PROOF +220F ; [*05F3.0020.0002] # N-ARY PRODUCT +2210 ; [*05F4.0020.0002] # N-ARY COPRODUCT +2211 ; [*05F5.0020.0002] # N-ARY SUMMATION +2212 ; [*0601.0020.0002] # MINUS SIGN +2213 ; [*0603.0020.0002] # MINUS-OR-PLUS SIGN +2214 ; [*0604.0020.0002] # DOT PLUS +2215 ; [*0605.0020.0002] # DIVISION SLASH +2216 ; [*0607.0020.0002] # SET MINUS +2217 ; [*0608.0020.0002] # ASTERISK OPERATOR +2218 ; [*0609.0020.0002] # RING OPERATOR +2219 ; [*060A.0020.0002] # BULLET OPERATOR +221A ; [*060B.0020.0002] # SQUARE ROOT +221B ; [*060C.0020.0002] # CUBE ROOT +221C ; [*060E.0020.0002] # FOURTH ROOT +221D ; [*0610.0020.0002] # PROPORTIONAL TO +221E ; [*0611.0020.0002] # INFINITY +221F ; [*0612.0020.0002] # RIGHT ANGLE +2220 ; [*0613.0020.0002] # ANGLE +2221 ; [*0614.0020.0002] # MEASURED ANGLE +2222 ; [*0615.0020.0002] # SPHERICAL ANGLE +2223 ; [*0616.0020.0002] # DIVIDES +2224 ; [*0616.0020.0002][.0000.002F.0002] # DOES NOT DIVIDE +2225 ; [*0617.0020.0002] # PARALLEL TO +2226 ; [*0617.0020.0002][.0000.002F.0002] # NOT PARALLEL TO +2227 ; [*0618.0020.0002] # LOGICAL AND +2228 ; [*0619.0020.0002] # LOGICAL OR +2229 ; [*061A.0020.0002] # INTERSECTION +222A ; [*061B.0020.0002] # UNION +222B ; [*061C.0020.0002] # INTEGRAL +222C ; [*061C.0020.0004][*061C.0020.0004] # DOUBLE INTEGRAL +222D ; [*061C.0020.0004][*061C.0020.0004][*061C.0020.0004] # TRIPLE INTEGRAL +222E ; [*061D.0020.0002] # CONTOUR INTEGRAL +222F ; [*061D.0020.0004][*061D.0020.0004] # SURFACE INTEGRAL +2230 ; [*061D.0020.0004][*061D.0020.0004][*061D.0020.0004] # VOLUME INTEGRAL +2231 ; [*061E.0020.0002] # CLOCKWISE INTEGRAL +2232 ; [*061F.0020.0002] # CLOCKWISE CONTOUR INTEGRAL +2233 ; [*0620.0020.0002] # ANTICLOCKWISE CONTOUR INTEGRAL +2234 ; [*0621.0020.0002] # THEREFORE +2235 ; [*0622.0020.0002] # BECAUSE +2236 ; [*0623.0020.0002] # RATIO +2237 ; [*0624.0020.0002] # PROPORTION +2238 ; [*0625.0020.0002] # DOT MINUS +2239 ; [*0626.0020.0002] # EXCESS +223A ; [*0627.0020.0002] # GEOMETRIC PROPORTION +223B ; [*0628.0020.0002] # HOMOTHETIC +223C ; [*0629.0020.0002] # TILDE OPERATOR +223D ; [*062A.0020.0002] # REVERSED TILDE +223E ; [*062B.0020.0002] # INVERTED LAZY S +223F ; [*062C.0020.0002] # SINE WAVE +2240 ; [*062D.0020.0002] # WREATH PRODUCT +2241 ; [*0629.0020.0002][.0000.002F.0002] # NOT TILDE +2242 ; [*062E.0020.0002] # MINUS TILDE +2243 ; [*062F.0020.0002] # ASYMPTOTICALLY EQUAL TO +2244 ; [*062F.0020.0002][.0000.002F.0002] # NOT ASYMPTOTICALLY EQUAL TO +2245 ; [*0630.0020.0002] # APPROXIMATELY EQUAL TO +2246 ; [*0631.0020.0002] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +2247 ; [*0630.0020.0002][.0000.002F.0002] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248 ; [*0632.0020.0002] # ALMOST EQUAL TO +2249 ; [*0632.0020.0002][.0000.002F.0002] # NOT ALMOST EQUAL TO +224A ; [*0633.0020.0002] # ALMOST EQUAL OR EQUAL TO +224B ; [*0634.0020.0002] # TRIPLE TILDE +224C ; [*0635.0020.0002] # ALL EQUAL TO +224D ; [*0636.0020.0002] # EQUIVALENT TO +224E ; [*0637.0020.0002] # GEOMETRICALLY EQUIVALENT TO +224F ; [*0638.0020.0002] # DIFFERENCE BETWEEN +2250 ; [*0639.0020.0002] # APPROACHES THE LIMIT +2251 ; [*063A.0020.0002] # GEOMETRICALLY EQUAL TO +2252 ; [*063B.0020.0002] # APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253 ; [*063C.0020.0002] # IMAGE OF OR APPROXIMATELY EQUAL TO +2254 ; [*063D.0020.0002] # COLON EQUALS +2255 ; [*063E.0020.0002] # EQUALS COLON +2256 ; [*063F.0020.0002] # RING IN EQUAL TO +2257 ; [*0640.0020.0002] # RING EQUAL TO +2258 ; [*0641.0020.0002] # CORRESPONDS TO +2259 ; [*0642.0020.0002] # ESTIMATES +225A ; [*0643.0020.0002] # EQUIANGULAR TO +225B ; [*0644.0020.0002] # STAR EQUALS +225C ; [*0645.0020.0002] # DELTA EQUAL TO +225D ; [*0646.0020.0002] # EQUAL TO BY DEFINITION +225E ; [*0647.0020.0002] # MEASURED BY +225F ; [*0648.0020.0002] # QUESTIONED EQUAL TO +2260 ; [*05FB.0020.0002][.0000.002F.0002] # NOT EQUAL TO +2261 ; [*0649.0020.0002] # IDENTICAL TO +2262 ; [*0649.0020.0002][.0000.002F.0002] # NOT IDENTICAL TO +2263 ; [*064A.0020.0002] # STRICTLY EQUIVALENT TO +2264 ; [*064B.0020.0002] # LESS-THAN OR EQUAL TO +2265 ; [*064C.0020.0002] # GREATER-THAN OR EQUAL TO +2266 ; [*064D.0020.0002] # LESS-THAN OVER EQUAL TO +2267 ; [*064E.0020.0002] # GREATER-THAN OVER EQUAL TO +2268 ; [*064F.0020.0002] # LESS-THAN BUT NOT EQUAL TO +2269 ; [*0650.0020.0002] # GREATER-THAN BUT NOT EQUAL TO +226A ; [*0651.0020.0002] # MUCH LESS-THAN +226B ; [*0652.0020.0002] # MUCH GREATER-THAN +226C ; [*0653.0020.0002] # BETWEEN +226D ; [*0636.0020.0002][.0000.002F.0002] # NOT EQUIVALENT TO +226E ; [*05FA.0020.0002][.0000.002F.0002] # NOT LESS-THAN +226F ; [*05FC.0020.0002][.0000.002F.0002] # NOT GREATER-THAN +2270 ; [*064B.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUAL TO +2271 ; [*064C.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUAL TO +2272 ; [*0654.0020.0002] # LESS-THAN OR EQUIVALENT TO +2273 ; [*0655.0020.0002] # GREATER-THAN OR EQUIVALENT TO +2274 ; [*0654.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUIVALENT TO +2275 ; [*0655.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUIVALENT TO +2276 ; [*0656.0020.0002] # LESS-THAN OR GREATER-THAN +2277 ; [*0657.0020.0002] # GREATER-THAN OR LESS-THAN +2278 ; [*0656.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR GREATER-THAN +2279 ; [*0657.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR LESS-THAN +227A ; [*0658.0020.0002] # PRECEDES +227B ; [*0659.0020.0002] # SUCCEEDS +227C ; [*065A.0020.0002] # PRECEDES OR EQUAL TO +227D ; [*065B.0020.0002] # SUCCEEDS OR EQUAL TO +227E ; [*065C.0020.0002] # PRECEDES OR EQUIVALENT TO +227F ; [*065D.0020.0002] # SUCCEEDS OR EQUIVALENT TO +2280 ; [*0658.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE +2281 ; [*0659.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED +2282 ; [*065E.0020.0002] # SUBSET OF +2283 ; [*065F.0020.0002] # SUPERSET OF +2284 ; [*065E.0020.0002][.0000.002F.0002] # NOT A SUBSET OF +2285 ; [*065F.0020.0002][.0000.002F.0002] # NOT A SUPERSET OF +2286 ; [*0660.0020.0002] # SUBSET OF OR EQUAL TO +2287 ; [*0661.0020.0002] # SUPERSET OF OR EQUAL TO +2288 ; [*0660.0020.0002][.0000.002F.0002] # NEITHER A SUBSET OF NOR EQUAL TO +2289 ; [*0661.0020.0002][.0000.002F.0002] # NEITHER A SUPERSET OF NOR EQUAL TO +228A ; [*0662.0020.0002] # SUBSET OF WITH NOT EQUAL TO +228B ; [*0663.0020.0002] # SUPERSET OF WITH NOT EQUAL TO +228C ; [*0664.0020.0002] # MULTISET +228D ; [*0665.0020.0002] # MULTISET MULTIPLICATION +228E ; [*0666.0020.0002] # MULTISET UNION +228F ; [*0667.0020.0002] # SQUARE IMAGE OF +2290 ; [*0668.0020.0002] # SQUARE ORIGINAL OF +2291 ; [*0669.0020.0002] # SQUARE IMAGE OF OR EQUAL TO +2292 ; [*066A.0020.0002] # SQUARE ORIGINAL OF OR EQUAL TO +2293 ; [*066B.0020.0002] # SQUARE CAP +2294 ; [*066C.0020.0002] # SQUARE CUP +2295 ; [*066D.0020.0002] # CIRCLED PLUS +2296 ; [*066E.0020.0002] # CIRCLED MINUS +2297 ; [*066F.0020.0002] # CIRCLED TIMES +2298 ; [*0670.0020.0002] # CIRCLED DIVISION SLASH +2299 ; [*0671.0020.0002] # CIRCLED DOT OPERATOR +229A ; [*0672.0020.0002] # CIRCLED RING OPERATOR +229B ; [*0673.0020.0002] # CIRCLED ASTERISK OPERATOR +229C ; [*0674.0020.0002] # CIRCLED EQUALS +229D ; [*0675.0020.0002] # CIRCLED DASH +229E ; [*0676.0020.0002] # SQUARED PLUS +229F ; [*0677.0020.0002] # SQUARED MINUS +22A0 ; [*0678.0020.0002] # SQUARED TIMES +22A1 ; [*0679.0020.0002] # SQUARED DOT OPERATOR +22A2 ; [*067A.0020.0002] # RIGHT TACK +22A3 ; [*067B.0020.0002] # LEFT TACK +22A4 ; [*067C.0020.0002] # DOWN TACK +22A5 ; [*067D.0020.0002] # UP TACK +22A6 ; [*067E.0020.0002] # ASSERTION +22A7 ; [*067F.0020.0002] # MODELS +22A8 ; [*0680.0020.0002] # TRUE +22A9 ; [*0681.0020.0002] # FORCES +22AA ; [*0682.0020.0002] # TRIPLE VERTICAL BAR RIGHT TURNSTILE +22AB ; [*0683.0020.0002] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22AC ; [*067A.0020.0002][.0000.002F.0002] # DOES NOT PROVE +22AD ; [*0680.0020.0002][.0000.002F.0002] # NOT TRUE +22AE ; [*0681.0020.0002][.0000.002F.0002] # DOES NOT FORCE +22AF ; [*0683.0020.0002][.0000.002F.0002] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22B0 ; [*0684.0020.0002] # PRECEDES UNDER RELATION +22B1 ; [*0685.0020.0002] # SUCCEEDS UNDER RELATION +22B2 ; [*0686.0020.0002] # NORMAL SUBGROUP OF +22B3 ; [*0687.0020.0002] # CONTAINS AS NORMAL SUBGROUP +22B4 ; [*0688.0020.0002] # NORMAL SUBGROUP OF OR EQUAL TO +22B5 ; [*0689.0020.0002] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6 ; [*068A.0020.0002] # ORIGINAL OF +22B7 ; [*068B.0020.0002] # IMAGE OF +22B8 ; [*068C.0020.0002] # MULTIMAP +22B9 ; [*068D.0020.0002] # HERMITIAN CONJUGATE MATRIX +22BA ; [*068E.0020.0002] # INTERCALATE +22BB ; [*068F.0020.0002] # XOR +22BC ; [*0690.0020.0002] # NAND +22BD ; [*0692.0020.0002] # NOR +22BE ; [*0693.0020.0002] # RIGHT ANGLE WITH ARC +22BF ; [*0694.0020.0002] # RIGHT TRIANGLE +22C0 ; [*0695.0020.0002] # N-ARY LOGICAL AND +22C1 ; [*0696.0020.0002] # N-ARY LOGICAL OR +22C2 ; [*0697.0020.0002] # N-ARY INTERSECTION +22C3 ; [*0698.0020.0002] # N-ARY UNION +22C4 ; [*0699.0020.0002] # DIAMOND OPERATOR +22C5 ; [*069A.0020.0002] # DOT OPERATOR +22C6 ; [*069B.0020.0002] # STAR OPERATOR +22C7 ; [*069C.0020.0002] # DIVISION TIMES +22C8 ; [*069D.0020.0002] # BOWTIE +22C9 ; [*069E.0020.0002] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA ; [*069F.0020.0002] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB ; [*06A0.0020.0002] # LEFT SEMIDIRECT PRODUCT +22CC ; [*06A1.0020.0002] # RIGHT SEMIDIRECT PRODUCT +22CD ; [*06A2.0020.0002] # REVERSED TILDE EQUALS +22CE ; [*06A3.0020.0002] # CURLY LOGICAL OR +22CF ; [*06A4.0020.0002] # CURLY LOGICAL AND +22D0 ; [*06A5.0020.0002] # DOUBLE SUBSET +22D1 ; [*06A6.0020.0002] # DOUBLE SUPERSET +22D2 ; [*06A7.0020.0002] # DOUBLE INTERSECTION +22D3 ; [*06A8.0020.0002] # DOUBLE UNION +22D4 ; [*06A9.0020.0002] # PITCHFORK +22D5 ; [*06AA.0020.0002] # EQUAL AND PARALLEL TO +22D6 ; [*06AB.0020.0002] # LESS-THAN WITH DOT +22D7 ; [*06AC.0020.0002] # GREATER-THAN WITH DOT +22D8 ; [*06AD.0020.0002] # VERY MUCH LESS-THAN +22D9 ; [*06AE.0020.0002] # VERY MUCH GREATER-THAN +22DA ; [*06AF.0020.0002] # LESS-THAN EQUAL TO OR GREATER-THAN +22DB ; [*06B0.0020.0002] # GREATER-THAN EQUAL TO OR LESS-THAN +22DC ; [*06B1.0020.0002] # EQUAL TO OR LESS-THAN +22DD ; [*06B2.0020.0002] # EQUAL TO OR GREATER-THAN +22DE ; [*06B3.0020.0002] # EQUAL TO OR PRECEDES +22DF ; [*06B4.0020.0002] # EQUAL TO OR SUCCEEDS +22E0 ; [*065A.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE OR EQUAL +22E1 ; [*065B.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED OR EQUAL +22E2 ; [*0669.0020.0002][.0000.002F.0002] # NOT SQUARE IMAGE OF OR EQUAL TO +22E3 ; [*066A.0020.0002][.0000.002F.0002] # NOT SQUARE ORIGINAL OF OR EQUAL TO +22E4 ; [*06B5.0020.0002] # SQUARE IMAGE OF OR NOT EQUAL TO +22E5 ; [*06B6.0020.0002] # SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6 ; [*06B7.0020.0002] # LESS-THAN BUT NOT EQUIVALENT TO +22E7 ; [*06B8.0020.0002] # GREATER-THAN BUT NOT EQUIVALENT TO +22E8 ; [*06B9.0020.0002] # PRECEDES BUT NOT EQUIVALENT TO +22E9 ; [*06BA.0020.0002] # SUCCEEDS BUT NOT EQUIVALENT TO +22EA ; [*0686.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF +22EB ; [*0687.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC ; [*0688.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED ; [*0689.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +22EE ; [*06BB.0020.0002] # VERTICAL ELLIPSIS +22EF ; [*06BC.0020.0002] # MIDLINE HORIZONTAL ELLIPSIS +22F0 ; [*06BD.0020.0002] # UP RIGHT DIAGONAL ELLIPSIS +22F1 ; [*06BE.0020.0002] # DOWN RIGHT DIAGONAL ELLIPSIS +22F2 ; [*06BF.0020.0002] # ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3 ; [*06C0.0020.0002] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4 ; [*06C1.0020.0002] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F5 ; [*06C2.0020.0002] # ELEMENT OF WITH DOT ABOVE +22F6 ; [*06C3.0020.0002] # ELEMENT OF WITH OVERBAR +22F7 ; [*06C4.0020.0002] # SMALL ELEMENT OF WITH OVERBAR +22F8 ; [*06C5.0020.0002] # ELEMENT OF WITH UNDERBAR +22F9 ; [*06C6.0020.0002] # ELEMENT OF WITH TWO HORIZONTAL STROKES +22FA ; [*06C7.0020.0002] # CONTAINS WITH LONG HORIZONTAL STROKE +22FB ; [*06C8.0020.0002] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC ; [*06C9.0020.0002] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD ; [*06CA.0020.0002] # CONTAINS WITH OVERBAR +22FE ; [*06CB.0020.0002] # SMALL CONTAINS WITH OVERBAR +22FF ; [*06CC.0020.0002] # Z NOTATION BAG MEMBERSHIP +2300 ; [*06CD.0020.0002] # DIAMETER SIGN +2301 ; [*06CE.0020.0002] # ELECTRIC ARROW +2302 ; [*06CF.0020.0002] # HOUSE +2303 ; [*06D0.0020.0002] # UP ARROWHEAD +2304 ; [*06D1.0020.0002] # DOWN ARROWHEAD +2305 ; [*06D2.0020.0002] # PROJECTIVE +2306 ; [*06D3.0020.0002] # PERSPECTIVE +2307 ; [*06D4.0020.0002] # WAVY LINE +2308 ; [*031E.0020.0002] # LEFT CEILING +2309 ; [*031F.0020.0002] # RIGHT CEILING +230A ; [*0320.0020.0002] # LEFT FLOOR +230B ; [*0321.0020.0002] # RIGHT FLOOR +230C ; [*06D5.0020.0002] # BOTTOM RIGHT CROP +230D ; [*06D6.0020.0002] # BOTTOM LEFT CROP +230E ; [*06D7.0020.0002] # TOP RIGHT CROP +230F ; [*06D8.0020.0002] # TOP LEFT CROP +2310 ; [*06D9.0020.0002] # REVERSED NOT SIGN +2311 ; [*06DA.0020.0002] # SQUARE LOZENGE +2312 ; [*06DB.0020.0002] # ARC +2313 ; [*06DC.0020.0002] # SEGMENT +2314 ; [*06DD.0020.0002] # SECTOR +2315 ; [*06DE.0020.0002] # TELEPHONE RECORDER +2316 ; [*06DF.0020.0002] # POSITION INDICATOR +2317 ; [*06E0.0020.0002] # VIEWDATA SQUARE +2318 ; [*06E1.0020.0002] # PLACE OF INTEREST SIGN +2319 ; [*06E2.0020.0002] # TURNED NOT SIGN +231A ; [*06E3.0020.0002] # WATCH +231B ; [*06E4.0020.0002] # HOURGLASS +231C ; [*06E5.0020.0002] # TOP LEFT CORNER +231D ; [*06E6.0020.0002] # TOP RIGHT CORNER +231E ; [*06E7.0020.0002] # BOTTOM LEFT CORNER +231F ; [*06E8.0020.0002] # BOTTOM RIGHT CORNER +2320 ; [*06E9.0020.0002] # TOP HALF INTEGRAL +2321 ; [*06EA.0020.0002] # BOTTOM HALF INTEGRAL +2322 ; [*06EB.0020.0002] # FROWN +2323 ; [*06EC.0020.0002] # SMILE +2324 ; [*06ED.0020.0002] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS +2325 ; [*06EE.0020.0002] # OPTION KEY +2326 ; [*06EF.0020.0002] # ERASE TO THE RIGHT +2327 ; [*06F0.0020.0002] # X IN A RECTANGLE BOX +2328 ; [*06F1.0020.0002] # KEYBOARD +2329 ; [*0368.0020.0002] # LEFT-POINTING ANGLE BRACKET +232A ; [*0369.0020.0002] # RIGHT-POINTING ANGLE BRACKET +232B ; [*06F2.0020.0002] # ERASE TO THE LEFT +232C ; [*06F3.0020.0002] # BENZENE RING +232D ; [*06F4.0020.0002] # CYLINDRICITY +232E ; [*06F5.0020.0002] # ALL AROUND-PROFILE +232F ; [*06F6.0020.0002] # SYMMETRY +2330 ; [*06F7.0020.0002] # TOTAL RUNOUT +2331 ; [*06F8.0020.0002] # DIMENSION ORIGIN +2332 ; [*06F9.0020.0002] # CONICAL TAPER +2333 ; [*06FA.0020.0002] # SLOPE +2334 ; [*06FB.0020.0002] # COUNTERBORE +2335 ; [*06FC.0020.0002] # COUNTERSINK +2336 ; [*06FD.0020.0002] # APL FUNCTIONAL SYMBOL I-BEAM +2337 ; [*06FE.0020.0002] # APL FUNCTIONAL SYMBOL SQUISH QUAD +2338 ; [*06FF.0020.0002] # APL FUNCTIONAL SYMBOL QUAD EQUAL +2339 ; [*0700.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIVIDE +233A ; [*0701.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIAMOND +233B ; [*0702.0020.0002] # APL FUNCTIONAL SYMBOL QUAD JOT +233C ; [*0703.0020.0002] # APL FUNCTIONAL SYMBOL QUAD CIRCLE +233D ; [*0704.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STILE +233E ; [*0705.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE JOT +233F ; [*0706.0020.0002] # APL FUNCTIONAL SYMBOL SLASH BAR +2340 ; [*0707.0020.0002] # APL FUNCTIONAL SYMBOL BACKSLASH BAR +2341 ; [*0708.0020.0002] # APL FUNCTIONAL SYMBOL QUAD SLASH +2342 ; [*0709.0020.0002] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH +2343 ; [*070A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN +2344 ; [*070B.0020.0002] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN +2345 ; [*070C.0020.0002] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE +2346 ; [*070D.0020.0002] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE +2347 ; [*070E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW +2348 ; [*070F.0020.0002] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW +2349 ; [*0710.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH +234A ; [*0711.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR +234B ; [*0712.0020.0002] # APL FUNCTIONAL SYMBOL DELTA STILE +234C ; [*0713.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET +234D ; [*0714.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DELTA +234E ; [*0715.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK JOT +234F ; [*0716.0020.0002] # APL FUNCTIONAL SYMBOL UPWARDS VANE +2350 ; [*0717.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +2351 ; [*0718.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR +2352 ; [*0719.0020.0002] # APL FUNCTIONAL SYMBOL DEL STILE +2353 ; [*071A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UP CARET +2354 ; [*071B.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DEL +2355 ; [*071C.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK JOT +2356 ; [*071D.0020.0002] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE +2357 ; [*071E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +2358 ; [*071F.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR +2359 ; [*0720.0020.0002] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR +235A ; [*0721.0020.0002] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR +235B ; [*0722.0020.0002] # APL FUNCTIONAL SYMBOL JOT UNDERBAR +235C ; [*0723.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR +235D ; [*0724.0020.0002] # APL FUNCTIONAL SYMBOL UP SHOE JOT +235E ; [*0725.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE QUAD +235F ; [*0726.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STAR +2360 ; [*0727.0020.0002] # APL FUNCTIONAL SYMBOL QUAD COLON +2361 ; [*0728.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS +2362 ; [*0729.0020.0002] # APL FUNCTIONAL SYMBOL DEL DIAERESIS +2363 ; [*072A.0020.0002] # APL FUNCTIONAL SYMBOL STAR DIAERESIS +2364 ; [*072B.0020.0002] # APL FUNCTIONAL SYMBOL JOT DIAERESIS +2365 ; [*072C.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS +2366 ; [*072D.0020.0002] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE +2367 ; [*072E.0020.0002] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE +2368 ; [*072F.0020.0002] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS +2369 ; [*0730.0020.0002] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS +236A ; [*0731.0020.0002] # APL FUNCTIONAL SYMBOL COMMA BAR +236B ; [*0732.0020.0002] # APL FUNCTIONAL SYMBOL DEL TILDE +236C ; [*0733.0020.0002] # APL FUNCTIONAL SYMBOL ZILDE +236D ; [*0734.0020.0002] # APL FUNCTIONAL SYMBOL STILE TILDE +236E ; [*0735.0020.0002] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR +236F ; [*0736.0020.0002] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL +2370 ; [*0737.0020.0002] # APL FUNCTIONAL SYMBOL QUAD QUESTION +2371 ; [*0738.0020.0002] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE +2372 ; [*0739.0020.0002] # APL FUNCTIONAL SYMBOL UP CARET TILDE +2373 ; [*073A.0020.0002] # APL FUNCTIONAL SYMBOL IOTA +2374 ; [*073B.0020.0002] # APL FUNCTIONAL SYMBOL RHO +2375 ; [*073C.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA +2376 ; [*073D.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR +2377 ; [*073E.0020.0002] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR +2378 ; [*073F.0020.0002] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR +2379 ; [*0740.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR +237A ; [*0741.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA +237B ; [*0742.0020.0002] # NOT CHECK MARK +237C ; [*0743.0020.0002] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D ; [*0744.0020.0002] # SHOULDERED OPEN BOX +237E ; [*0745.0020.0002] # BELL SYMBOL +237F ; [*0746.0020.0002] # VERTICAL LINE WITH MIDDLE DOT +2380 ; [*0747.0020.0002] # INSERTION SYMBOL +2381 ; [*0748.0020.0002] # CONTINUOUS UNDERLINE SYMBOL +2382 ; [*0749.0020.0002] # DISCONTINUOUS UNDERLINE SYMBOL +2383 ; [*074A.0020.0002] # EMPHASIS SYMBOL +2384 ; [*074B.0020.0002] # COMPOSITION SYMBOL +2385 ; [*074C.0020.0002] # WHITE SQUARE WITH CENTRE VERTICAL LINE +2386 ; [*074D.0020.0002] # ENTER SYMBOL +2387 ; [*074E.0020.0002] # ALTERNATIVE KEY SYMBOL +2388 ; [*074F.0020.0002] # HELM SYMBOL +2389 ; [*0750.0020.0002] # CIRCLED HORIZONTAL BAR WITH NOTCH +238A ; [*0751.0020.0002] # CIRCLED TRIANGLE DOWN +238B ; [*0752.0020.0002] # BROKEN CIRCLE WITH NORTHWEST ARROW +238C ; [*0753.0020.0002] # UNDO SYMBOL +238D ; [*0754.0020.0002] # MONOSTABLE SYMBOL +238E ; [*0755.0020.0002] # HYSTERESIS SYMBOL +238F ; [*0756.0020.0002] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL +2390 ; [*0757.0020.0002] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL +2391 ; [*0758.0020.0002] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL +2392 ; [*0759.0020.0002] # PASSIVE-PULL-UP-OUTPUT SYMBOL +2393 ; [*075A.0020.0002] # DIRECT CURRENT SYMBOL FORM TWO +2394 ; [*075B.0020.0002] # SOFTWARE-FUNCTION SYMBOL +2395 ; [*075C.0020.0002] # APL FUNCTIONAL SYMBOL QUAD +2396 ; [*075D.0020.0002] # DECIMAL SEPARATOR KEY SYMBOL +2397 ; [*075E.0020.0002] # PREVIOUS PAGE +2398 ; [*075F.0020.0002] # NEXT PAGE +2399 ; [*0760.0020.0002] # PRINT SCREEN SYMBOL +239A ; [*0761.0020.0002] # CLEAR SCREEN SYMBOL +239B ; [*0762.0020.0002] # LEFT PARENTHESIS UPPER HOOK +239C ; [*0763.0020.0002] # LEFT PARENTHESIS EXTENSION +239D ; [*0764.0020.0002] # LEFT PARENTHESIS LOWER HOOK +239E ; [*0765.0020.0002] # RIGHT PARENTHESIS UPPER HOOK +239F ; [*0766.0020.0002] # RIGHT PARENTHESIS EXTENSION +23A0 ; [*0767.0020.0002] # RIGHT PARENTHESIS LOWER HOOK +23A1 ; [*0768.0020.0002] # LEFT SQUARE BRACKET UPPER CORNER +23A2 ; [*0769.0020.0002] # LEFT SQUARE BRACKET EXTENSION +23A3 ; [*076A.0020.0002] # LEFT SQUARE BRACKET LOWER CORNER +23A4 ; [*076B.0020.0002] # RIGHT SQUARE BRACKET UPPER CORNER +23A5 ; [*076C.0020.0002] # RIGHT SQUARE BRACKET EXTENSION +23A6 ; [*076D.0020.0002] # RIGHT SQUARE BRACKET LOWER CORNER +23A7 ; [*076E.0020.0002] # LEFT CURLY BRACKET UPPER HOOK +23A8 ; [*076F.0020.0002] # LEFT CURLY BRACKET MIDDLE PIECE +23A9 ; [*0770.0020.0002] # LEFT CURLY BRACKET LOWER HOOK +23AA ; [*0771.0020.0002] # CURLY BRACKET EXTENSION +23AB ; [*0772.0020.0002] # RIGHT CURLY BRACKET UPPER HOOK +23AC ; [*0773.0020.0002] # RIGHT CURLY BRACKET MIDDLE PIECE +23AD ; [*0774.0020.0002] # RIGHT CURLY BRACKET LOWER HOOK +23AE ; [*0775.0020.0002] # INTEGRAL EXTENSION +23AF ; [*0776.0020.0002] # HORIZONTAL LINE EXTENSION +23B0 ; [*0777.0020.0002] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +23B1 ; [*0778.0020.0002] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +23B2 ; [*0779.0020.0002] # SUMMATION TOP +23B3 ; [*077A.0020.0002] # SUMMATION BOTTOM +23B4 ; [*077B.0020.0002] # TOP SQUARE BRACKET +23B5 ; [*077C.0020.0002] # BOTTOM SQUARE BRACKET +23B6 ; [*077D.0020.0002] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7 ; [*077E.0020.0002] # RADICAL SYMBOL BOTTOM +23B8 ; [*077F.0020.0002] # LEFT VERTICAL BOX LINE +23B9 ; [*0780.0020.0002] # RIGHT VERTICAL BOX LINE +23BA ; [*0781.0020.0002] # HORIZONTAL SCAN LINE-1 +23BB ; [*0782.0020.0002] # HORIZONTAL SCAN LINE-3 +23BC ; [*0783.0020.0002] # HORIZONTAL SCAN LINE-7 +23BD ; [*0784.0020.0002] # HORIZONTAL SCAN LINE-9 +23BE ; [*0785.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT +23BF ; [*0786.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT +23C0 ; [*0787.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE +23C1 ; [*0788.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE +23C2 ; [*0789.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE +23C3 ; [*078A.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE +23C4 ; [*078B.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE +23C5 ; [*078C.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE +23C6 ; [*078D.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE +23C7 ; [*078E.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE +23C8 ; [*078F.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE +23C9 ; [*0790.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL +23CA ; [*0791.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL +23CB ; [*0792.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT +23CC ; [*0793.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT +23CD ; [*0794.0020.0002] # SQUARE FOOT +23CE ; [*0795.0020.0002] # RETURN SYMBOL +23CF ; [*0796.0020.0002] # EJECT SYMBOL +23D0 ; [*0797.0020.0002] # VERTICAL LINE EXTENSION +23D1 ; [*0798.0020.0002] # METRICAL BREVE +23D2 ; [*0799.0020.0002] # METRICAL LONG OVER SHORT +23D3 ; [*079A.0020.0002] # METRICAL SHORT OVER LONG +23D4 ; [*079B.0020.0002] # METRICAL LONG OVER TWO SHORTS +23D5 ; [*079C.0020.0002] # METRICAL TWO SHORTS OVER LONG +23D6 ; [*079D.0020.0002] # METRICAL TWO SHORTS JOINED +23D7 ; [*079E.0020.0002] # METRICAL TRISEME +23D8 ; [*079F.0020.0002] # METRICAL TETRASEME +23D9 ; [*07A0.0020.0002] # METRICAL PENTASEME +23DA ; [*07A1.0020.0002] # EARTH GROUND +23DB ; [*07A2.0020.0002] # FUSE +23DC ; [*07A3.0020.0002] # TOP PARENTHESIS +23DD ; [*07A4.0020.0002] # BOTTOM PARENTHESIS +23DE ; [*07A5.0020.0002] # TOP CURLY BRACKET +23DF ; [*07A6.0020.0002] # BOTTOM CURLY BRACKET +23E0 ; [*07A7.0020.0002] # TOP TORTOISE SHELL BRACKET +23E1 ; [*07A8.0020.0002] # BOTTOM TORTOISE SHELL BRACKET +23E2 ; [*07A9.0020.0002] # WHITE TRAPEZIUM +23E3 ; [*07AA.0020.0002] # BENZENE RING WITH CIRCLE +23E4 ; [*07AB.0020.0002] # STRAIGHTNESS +23E5 ; [*07AC.0020.0002] # FLATNESS +23E6 ; [*07AD.0020.0002] # AC CURRENT +23E7 ; [*07AE.0020.0002] # ELECTRICAL INTERSECTION +23E8 ; [*07AF.0020.0002] # DECIMAL EXPONENT SYMBOL +23E9 ; [*07B0.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE +23EA ; [*07B1.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE +23EB ; [*07B2.0020.0002] # BLACK UP-POINTING DOUBLE TRIANGLE +23EC ; [*07B3.0020.0002] # BLACK DOWN-POINTING DOUBLE TRIANGLE +23ED ; [*07B4.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR +23EE ; [*07B5.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR +23EF ; [*07B6.0020.0002] # BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +23F0 ; [*07B7.0020.0002] # ALARM CLOCK +23F1 ; [*07B8.0020.0002] # STOPWATCH +23F2 ; [*07B9.0020.0002] # TIMER CLOCK +23F3 ; [*07BA.0020.0002] # HOURGLASS WITH FLOWING SAND +23F4 ; [*07BB.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE +23F5 ; [*07BC.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE +23F6 ; [*07BD.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE +23F7 ; [*07BE.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE +23F8 ; [*07BF.0020.0002] # DOUBLE VERTICAL BAR +23F9 ; [*07C0.0020.0002] # BLACK SQUARE FOR STOP +23FA ; [*07C1.0020.0002] # BLACK CIRCLE FOR RECORD +2400 ; [*07C2.0020.0002] # SYMBOL FOR NULL +2401 ; [*07C3.0020.0002] # SYMBOL FOR START OF HEADING +2402 ; [*07C4.0020.0002] # SYMBOL FOR START OF TEXT +2403 ; [*07C5.0020.0002] # SYMBOL FOR END OF TEXT +2404 ; [*07C6.0020.0002] # SYMBOL FOR END OF TRANSMISSION +2405 ; [*07C7.0020.0002] # SYMBOL FOR ENQUIRY +2406 ; [*07C8.0020.0002] # SYMBOL FOR ACKNOWLEDGE +2407 ; [*07C9.0020.0002] # SYMBOL FOR BELL +2408 ; [*07CA.0020.0002] # SYMBOL FOR BACKSPACE +2409 ; [*07CB.0020.0002] # SYMBOL FOR HORIZONTAL TABULATION +240A ; [*07CC.0020.0002] # SYMBOL FOR LINE FEED +240B ; [*07CD.0020.0002] # SYMBOL FOR VERTICAL TABULATION +240C ; [*07CE.0020.0002] # SYMBOL FOR FORM FEED +240D ; [*07CF.0020.0002] # SYMBOL FOR CARRIAGE RETURN +240E ; [*07D0.0020.0002] # SYMBOL FOR SHIFT OUT +240F ; [*07D1.0020.0002] # SYMBOL FOR SHIFT IN +2410 ; [*07D2.0020.0002] # SYMBOL FOR DATA LINK ESCAPE +2411 ; [*07D3.0020.0002] # SYMBOL FOR DEVICE CONTROL ONE +2412 ; [*07D4.0020.0002] # SYMBOL FOR DEVICE CONTROL TWO +2413 ; [*07D5.0020.0002] # SYMBOL FOR DEVICE CONTROL THREE +2414 ; [*07D6.0020.0002] # SYMBOL FOR DEVICE CONTROL FOUR +2415 ; [*07D7.0020.0002] # SYMBOL FOR NEGATIVE ACKNOWLEDGE +2416 ; [*07D8.0020.0002] # SYMBOL FOR SYNCHRONOUS IDLE +2417 ; [*07D9.0020.0002] # SYMBOL FOR END OF TRANSMISSION BLOCK +2418 ; [*07DA.0020.0002] # SYMBOL FOR CANCEL +2419 ; [*07DB.0020.0002] # SYMBOL FOR END OF MEDIUM +241A ; [*07DC.0020.0002] # SYMBOL FOR SUBSTITUTE +241B ; [*07DD.0020.0002] # SYMBOL FOR ESCAPE +241C ; [*07DE.0020.0002] # SYMBOL FOR FILE SEPARATOR +241D ; [*07DF.0020.0002] # SYMBOL FOR GROUP SEPARATOR +241E ; [*07E0.0020.0002] # SYMBOL FOR RECORD SEPARATOR +241F ; [*07E1.0020.0002] # SYMBOL FOR UNIT SEPARATOR +2420 ; [*07E2.0020.0002] # SYMBOL FOR SPACE +2421 ; [*07E3.0020.0002] # SYMBOL FOR DELETE +2422 ; [*07E4.0020.0002] # BLANK SYMBOL +2423 ; [*07E5.0020.0002] # OPEN BOX +2424 ; [*07E6.0020.0002] # SYMBOL FOR NEWLINE +2425 ; [*07E7.0020.0002] # SYMBOL FOR DELETE FORM TWO +2426 ; [*07E8.0020.0002] # SYMBOL FOR SUBSTITUTE FORM TWO +2440 ; [*07E9.0020.0002] # OCR HOOK +2441 ; [*07EA.0020.0002] # OCR CHAIR +2442 ; [*07EB.0020.0002] # OCR FORK +2443 ; [*07EC.0020.0002] # OCR INVERTED FORK +2444 ; [*07ED.0020.0002] # OCR BELT BUCKLE +2445 ; [*07EE.0020.0002] # OCR BOW TIE +2446 ; [*07EF.0020.0002] # OCR BRANCH BANK IDENTIFICATION +2447 ; [*07F0.0020.0002] # OCR AMOUNT OF CHECK +2448 ; [*07F1.0020.0002] # OCR DASH +2449 ; [*07F2.0020.0002] # OCR CUSTOMER ACCOUNT NUMBER +244A ; [*07F3.0020.0002] # OCR DOUBLE BACKSLASH +2500 ; [*07F4.0020.0002] # BOX DRAWINGS LIGHT HORIZONTAL +2501 ; [*07F5.0020.0002] # BOX DRAWINGS HEAVY HORIZONTAL +2502 ; [*07F6.0020.0002] # BOX DRAWINGS LIGHT VERTICAL +2503 ; [*07F7.0020.0002] # BOX DRAWINGS HEAVY VERTICAL +2504 ; [*07F8.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +2505 ; [*07F9.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +2506 ; [*07FA.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +2507 ; [*07FB.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +2508 ; [*07FC.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +2509 ; [*07FD.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +250A ; [*07FE.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +250B ; [*07FF.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +250C ; [*0800.0020.0002] # BOX DRAWINGS LIGHT DOWN AND RIGHT +250D ; [*0801.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +250E ; [*0802.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +250F ; [*0803.0020.0002] # BOX DRAWINGS HEAVY DOWN AND RIGHT +2510 ; [*0804.0020.0002] # BOX DRAWINGS LIGHT DOWN AND LEFT +2511 ; [*0805.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +2512 ; [*0806.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +2513 ; [*0807.0020.0002] # BOX DRAWINGS HEAVY DOWN AND LEFT +2514 ; [*0808.0020.0002] # BOX DRAWINGS LIGHT UP AND RIGHT +2515 ; [*0809.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +2516 ; [*080A.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +2517 ; [*080B.0020.0002] # BOX DRAWINGS HEAVY UP AND RIGHT +2518 ; [*080C.0020.0002] # BOX DRAWINGS LIGHT UP AND LEFT +2519 ; [*080D.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY +251A ; [*080E.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT +251B ; [*080F.0020.0002] # BOX DRAWINGS HEAVY UP AND LEFT +251C ; [*0810.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +251D ; [*0811.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +251E ; [*0812.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +251F ; [*0813.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +2520 ; [*0814.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +2521 ; [*0815.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +2522 ; [*0816.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +2523 ; [*0817.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT +2524 ; [*0818.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND LEFT +2525 ; [*0819.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +2526 ; [*081A.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +2527 ; [*081B.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +2528 ; [*081C.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +2529 ; [*081D.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +252A ; [*081E.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +252B ; [*081F.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND LEFT +252C ; [*0820.0020.0002] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +252D ; [*0821.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +252E ; [*0822.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +252F ; [*0823.0020.0002] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +2530 ; [*0824.0020.0002] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +2531 ; [*0825.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +2532 ; [*0826.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +2533 ; [*0827.0020.0002] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +2534 ; [*0828.0020.0002] # BOX DRAWINGS LIGHT UP AND HORIZONTAL +2535 ; [*0829.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +2536 ; [*082A.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +2537 ; [*082B.0020.0002] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +2538 ; [*082C.0020.0002] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +2539 ; [*082D.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +253A ; [*082E.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +253B ; [*082F.0020.0002] # BOX DRAWINGS HEAVY UP AND HORIZONTAL +253C ; [*0830.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +253D ; [*0831.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +253E ; [*0832.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +253F ; [*0833.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +2540 ; [*0834.0020.0002] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +2541 ; [*0835.0020.0002] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +2542 ; [*0836.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +2543 ; [*0837.0020.0002] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +2544 ; [*0838.0020.0002] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +2545 ; [*0839.0020.0002] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +2546 ; [*083A.0020.0002] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +2547 ; [*083B.0020.0002] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +2548 ; [*083C.0020.0002] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +2549 ; [*083D.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +254A ; [*083E.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +254B ; [*083F.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C ; [*0840.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +254D ; [*0841.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +254E ; [*0842.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +254F ; [*0843.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550 ; [*0844.0020.0002] # BOX DRAWINGS DOUBLE HORIZONTAL +2551 ; [*0845.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL +2552 ; [*0846.0020.0002] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +2553 ; [*0847.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +2554 ; [*0848.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND RIGHT +2555 ; [*0849.0020.0002] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +2556 ; [*084A.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +2557 ; [*084B.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND LEFT +2558 ; [*084C.0020.0002] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +2559 ; [*084D.0020.0002] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +255A ; [*084E.0020.0002] # BOX DRAWINGS DOUBLE UP AND RIGHT +255B ; [*084F.0020.0002] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +255C ; [*0850.0020.0002] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +255D ; [*0851.0020.0002] # BOX DRAWINGS DOUBLE UP AND LEFT +255E ; [*0852.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +255F ; [*0853.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +2560 ; [*0854.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +2561 ; [*0855.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +2562 ; [*0856.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +2563 ; [*0857.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT +2564 ; [*0858.0020.0002] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +2565 ; [*0859.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +2566 ; [*085A.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +2567 ; [*085B.0020.0002] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +2568 ; [*085C.0020.0002] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +2569 ; [*085D.0020.0002] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL +256A ; [*085E.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +256B ; [*085F.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256C ; [*0860.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +256D ; [*0861.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +256E ; [*0862.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT +256F ; [*0863.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND LEFT +2570 ; [*0864.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND RIGHT +2571 ; [*0865.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +2572 ; [*0866.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +2573 ; [*0867.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL CROSS +2574 ; [*0868.0020.0002] # BOX DRAWINGS LIGHT LEFT +2575 ; [*0869.0020.0002] # BOX DRAWINGS LIGHT UP +2576 ; [*086A.0020.0002] # BOX DRAWINGS LIGHT RIGHT +2577 ; [*086B.0020.0002] # BOX DRAWINGS LIGHT DOWN +2578 ; [*086C.0020.0002] # BOX DRAWINGS HEAVY LEFT +2579 ; [*086D.0020.0002] # BOX DRAWINGS HEAVY UP +257A ; [*086E.0020.0002] # BOX DRAWINGS HEAVY RIGHT +257B ; [*086F.0020.0002] # BOX DRAWINGS HEAVY DOWN +257C ; [*0870.0020.0002] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +257D ; [*0871.0020.0002] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN +257E ; [*0872.0020.0002] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +257F ; [*0873.0020.0002] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580 ; [*0874.0020.0002] # UPPER HALF BLOCK +2581 ; [*0875.0020.0002] # LOWER ONE EIGHTH BLOCK +2582 ; [*0876.0020.0002] # LOWER ONE QUARTER BLOCK +2583 ; [*0877.0020.0002] # LOWER THREE EIGHTHS BLOCK +2584 ; [*0878.0020.0002] # LOWER HALF BLOCK +2585 ; [*0879.0020.0002] # LOWER FIVE EIGHTHS BLOCK +2586 ; [*087A.0020.0002] # LOWER THREE QUARTERS BLOCK +2587 ; [*087B.0020.0002] # LOWER SEVEN EIGHTHS BLOCK +2588 ; [*087C.0020.0002] # FULL BLOCK +2589 ; [*087D.0020.0002] # LEFT SEVEN EIGHTHS BLOCK +258A ; [*087E.0020.0002] # LEFT THREE QUARTERS BLOCK +258B ; [*087F.0020.0002] # LEFT FIVE EIGHTHS BLOCK +258C ; [*0880.0020.0002] # LEFT HALF BLOCK +258D ; [*0881.0020.0002] # LEFT THREE EIGHTHS BLOCK +258E ; [*0882.0020.0002] # LEFT ONE QUARTER BLOCK +258F ; [*0883.0020.0002] # LEFT ONE EIGHTH BLOCK +2590 ; [*0884.0020.0002] # RIGHT HALF BLOCK +2591 ; [*0885.0020.0002] # LIGHT SHADE +2592 ; [*0886.0020.0002] # MEDIUM SHADE +2593 ; [*0887.0020.0002] # DARK SHADE +2594 ; [*0888.0020.0002] # UPPER ONE EIGHTH BLOCK +2595 ; [*0889.0020.0002] # RIGHT ONE EIGHTH BLOCK +2596 ; [*088A.0020.0002] # QUADRANT LOWER LEFT +2597 ; [*088B.0020.0002] # QUADRANT LOWER RIGHT +2598 ; [*088C.0020.0002] # QUADRANT UPPER LEFT +2599 ; [*088D.0020.0002] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +259A ; [*088E.0020.0002] # QUADRANT UPPER LEFT AND LOWER RIGHT +259B ; [*088F.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +259C ; [*0890.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +259D ; [*0891.0020.0002] # QUADRANT UPPER RIGHT +259E ; [*0892.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT +259F ; [*0893.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0 ; [*0894.0020.0002] # BLACK SQUARE +25A1 ; [*0895.0020.0002] # WHITE SQUARE +25A2 ; [*0896.0020.0002] # WHITE SQUARE WITH ROUNDED CORNERS +25A3 ; [*0897.0020.0002] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE +25A4 ; [*0898.0020.0002] # SQUARE WITH HORIZONTAL FILL +25A5 ; [*0899.0020.0002] # SQUARE WITH VERTICAL FILL +25A6 ; [*089A.0020.0002] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL +25A7 ; [*089B.0020.0002] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +25A8 ; [*089C.0020.0002] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +25A9 ; [*089D.0020.0002] # SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA ; [*089E.0020.0002] # BLACK SMALL SQUARE +25AB ; [*089F.0020.0002] # WHITE SMALL SQUARE +25AC ; [*08A0.0020.0002] # BLACK RECTANGLE +25AD ; [*08A1.0020.0002] # WHITE RECTANGLE +25AE ; [*08A2.0020.0002] # BLACK VERTICAL RECTANGLE +25AF ; [*08A3.0020.0002] # WHITE VERTICAL RECTANGLE +25B0 ; [*08A4.0020.0002] # BLACK PARALLELOGRAM +25B1 ; [*08A5.0020.0002] # WHITE PARALLELOGRAM +25B2 ; [*08A6.0020.0002] # BLACK UP-POINTING TRIANGLE +25B3 ; [*08A7.0020.0002] # WHITE UP-POINTING TRIANGLE +25B4 ; [*08A8.0020.0002] # BLACK UP-POINTING SMALL TRIANGLE +25B5 ; [*08A9.0020.0002] # WHITE UP-POINTING SMALL TRIANGLE +25B6 ; [*08AA.0020.0002] # BLACK RIGHT-POINTING TRIANGLE +25B7 ; [*08AB.0020.0002] # WHITE RIGHT-POINTING TRIANGLE +25B8 ; [*08AC.0020.0002] # BLACK RIGHT-POINTING SMALL TRIANGLE +25B9 ; [*08AD.0020.0002] # WHITE RIGHT-POINTING SMALL TRIANGLE +25BA ; [*08AE.0020.0002] # BLACK RIGHT-POINTING POINTER +25BB ; [*08AF.0020.0002] # WHITE RIGHT-POINTING POINTER +25BC ; [*08B0.0020.0002] # BLACK DOWN-POINTING TRIANGLE +25BD ; [*08B1.0020.0002] # WHITE DOWN-POINTING TRIANGLE +25BE ; [*08B2.0020.0002] # BLACK DOWN-POINTING SMALL TRIANGLE +25BF ; [*08B3.0020.0002] # WHITE DOWN-POINTING SMALL TRIANGLE +25C0 ; [*08B4.0020.0002] # BLACK LEFT-POINTING TRIANGLE +25C1 ; [*08B5.0020.0002] # WHITE LEFT-POINTING TRIANGLE +25C2 ; [*08B6.0020.0002] # BLACK LEFT-POINTING SMALL TRIANGLE +25C3 ; [*08B7.0020.0002] # WHITE LEFT-POINTING SMALL TRIANGLE +25C4 ; [*08B8.0020.0002] # BLACK LEFT-POINTING POINTER +25C5 ; [*08B9.0020.0002] # WHITE LEFT-POINTING POINTER +25C6 ; [*08BA.0020.0002] # BLACK DIAMOND +25C7 ; [*08BB.0020.0002] # WHITE DIAMOND +25C8 ; [*08BC.0020.0002] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9 ; [*08BD.0020.0002] # FISHEYE +25CA ; [*08BE.0020.0002] # LOZENGE +25CB ; [*08BF.0020.0002] # WHITE CIRCLE +25CC ; [*08C0.0020.0002] # DOTTED CIRCLE +25CD ; [*08C1.0020.0002] # CIRCLE WITH VERTICAL FILL +25CE ; [*08C2.0020.0002] # BULLSEYE +25CF ; [*08C3.0020.0002] # BLACK CIRCLE +25D0 ; [*08C4.0020.0002] # CIRCLE WITH LEFT HALF BLACK +25D1 ; [*08C5.0020.0002] # CIRCLE WITH RIGHT HALF BLACK +25D2 ; [*08C6.0020.0002] # CIRCLE WITH LOWER HALF BLACK +25D3 ; [*08C7.0020.0002] # CIRCLE WITH UPPER HALF BLACK +25D4 ; [*08C8.0020.0002] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK +25D5 ; [*08C9.0020.0002] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +25D6 ; [*08CA.0020.0002] # LEFT HALF BLACK CIRCLE +25D7 ; [*08CB.0020.0002] # RIGHT HALF BLACK CIRCLE +25D8 ; [*08CC.0020.0002] # INVERSE BULLET +25D9 ; [*08CD.0020.0002] # INVERSE WHITE CIRCLE +25DA ; [*08CE.0020.0002] # UPPER HALF INVERSE WHITE CIRCLE +25DB ; [*08CF.0020.0002] # LOWER HALF INVERSE WHITE CIRCLE +25DC ; [*08D0.0020.0002] # UPPER LEFT QUADRANT CIRCULAR ARC +25DD ; [*08D1.0020.0002] # UPPER RIGHT QUADRANT CIRCULAR ARC +25DE ; [*08D2.0020.0002] # LOWER RIGHT QUADRANT CIRCULAR ARC +25DF ; [*08D3.0020.0002] # LOWER LEFT QUADRANT CIRCULAR ARC +25E0 ; [*08D4.0020.0002] # UPPER HALF CIRCLE +25E1 ; [*08D5.0020.0002] # LOWER HALF CIRCLE +25E2 ; [*08D6.0020.0002] # BLACK LOWER RIGHT TRIANGLE +25E3 ; [*08D7.0020.0002] # BLACK LOWER LEFT TRIANGLE +25E4 ; [*08D8.0020.0002] # BLACK UPPER LEFT TRIANGLE +25E5 ; [*08D9.0020.0002] # BLACK UPPER RIGHT TRIANGLE +25E6 ; [*08DA.0020.0002] # WHITE BULLET +25E7 ; [*08DB.0020.0002] # SQUARE WITH LEFT HALF BLACK +25E8 ; [*08DC.0020.0002] # SQUARE WITH RIGHT HALF BLACK +25E9 ; [*08DD.0020.0002] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +25EA ; [*08DE.0020.0002] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +25EB ; [*08DF.0020.0002] # WHITE SQUARE WITH VERTICAL BISECTING LINE +25EC ; [*08E0.0020.0002] # WHITE UP-POINTING TRIANGLE WITH DOT +25ED ; [*08E1.0020.0002] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK +25EE ; [*08E2.0020.0002] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF ; [*08E3.0020.0002] # LARGE CIRCLE +25F0 ; [*08E4.0020.0002] # WHITE SQUARE WITH UPPER LEFT QUADRANT +25F1 ; [*08E5.0020.0002] # WHITE SQUARE WITH LOWER LEFT QUADRANT +25F2 ; [*08E6.0020.0002] # WHITE SQUARE WITH LOWER RIGHT QUADRANT +25F3 ; [*08E7.0020.0002] # WHITE SQUARE WITH UPPER RIGHT QUADRANT +25F4 ; [*08E8.0020.0002] # WHITE CIRCLE WITH UPPER LEFT QUADRANT +25F5 ; [*08E9.0020.0002] # WHITE CIRCLE WITH LOWER LEFT QUADRANT +25F6 ; [*08EA.0020.0002] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT +25F7 ; [*08EB.0020.0002] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8 ; [*08EC.0020.0002] # UPPER LEFT TRIANGLE +25F9 ; [*08ED.0020.0002] # UPPER RIGHT TRIANGLE +25FA ; [*08EE.0020.0002] # LOWER LEFT TRIANGLE +25FB ; [*08EF.0020.0002] # WHITE MEDIUM SQUARE +25FC ; [*08F0.0020.0002] # BLACK MEDIUM SQUARE +25FD ; [*08F1.0020.0002] # WHITE MEDIUM SMALL SQUARE +25FE ; [*08F2.0020.0002] # BLACK MEDIUM SMALL SQUARE +25FF ; [*08F3.0020.0002] # LOWER RIGHT TRIANGLE +2600 ; [*08F4.0020.0002] # BLACK SUN WITH RAYS +2601 ; [*08F5.0020.0002] # CLOUD +2602 ; [*08F6.0020.0002] # UMBRELLA +2603 ; [*08F7.0020.0002] # SNOWMAN +2604 ; [*08F8.0020.0002] # COMET +2605 ; [*08F9.0020.0002] # BLACK STAR +2606 ; [*08FA.0020.0002] # WHITE STAR +2607 ; [*08FB.0020.0002] # LIGHTNING +2608 ; [*08FC.0020.0002] # THUNDERSTORM +2609 ; [*08FD.0020.0002] # SUN +260A ; [*08FE.0020.0002] # ASCENDING NODE +260B ; [*08FF.0020.0002] # DESCENDING NODE +260C ; [*0900.0020.0002] # CONJUNCTION +260D ; [*0901.0020.0002] # OPPOSITION +260E ; [*0902.0020.0002] # BLACK TELEPHONE +260F ; [*0903.0020.0002] # WHITE TELEPHONE +2610 ; [*0904.0020.0002] # BALLOT BOX +2611 ; [*0905.0020.0002] # BALLOT BOX WITH CHECK +2612 ; [*0906.0020.0002] # BALLOT BOX WITH X +2613 ; [*0907.0020.0002] # SALTIRE +2614 ; [*0908.0020.0002] # UMBRELLA WITH RAIN DROPS +2615 ; [*0909.0020.0002] # HOT BEVERAGE +2616 ; [*090A.0020.0002] # WHITE SHOGI PIECE +2617 ; [*090B.0020.0002] # BLACK SHOGI PIECE +2618 ; [*090C.0020.0002] # SHAMROCK +2619 ; [*090D.0020.0002] # REVERSED ROTATED FLORAL HEART BULLET +261A ; [*090E.0020.0002] # BLACK LEFT POINTING INDEX +261B ; [*090F.0020.0002] # BLACK RIGHT POINTING INDEX +261C ; [*0910.0020.0002] # WHITE LEFT POINTING INDEX +261D ; [*0911.0020.0002] # WHITE UP POINTING INDEX +261E ; [*0912.0020.0002] # WHITE RIGHT POINTING INDEX +261F ; [*0913.0020.0002] # WHITE DOWN POINTING INDEX +2620 ; [*0914.0020.0002] # SKULL AND CROSSBONES +2621 ; [*0915.0020.0002] # CAUTION SIGN +2622 ; [*0916.0020.0002] # RADIOACTIVE SIGN +2623 ; [*0917.0020.0002] # BIOHAZARD SIGN +2624 ; [*0918.0020.0002] # CADUCEUS +2625 ; [*0919.0020.0002] # ANKH +2626 ; [*091A.0020.0002] # ORTHODOX CROSS +2627 ; [*091B.0020.0002] # CHI RHO +2628 ; [*091C.0020.0002] # CROSS OF LORRAINE +2629 ; [*091D.0020.0002] # CROSS OF JERUSALEM +262A ; [*091E.0020.0002] # STAR AND CRESCENT +262B ; [*091F.0020.0002] # FARSI SYMBOL +262C ; [*0920.0020.0002] # ADI SHAKTI +262D ; [*0921.0020.0002] # HAMMER AND SICKLE +262E ; [*0922.0020.0002] # PEACE SYMBOL +262F ; [*0923.0020.0002] # YIN YANG +2630 ; [*0E7E.0020.0002] # TRIGRAM FOR HEAVEN +2631 ; [*0E7F.0020.0002] # TRIGRAM FOR LAKE +2632 ; [*0E80.0020.0002] # TRIGRAM FOR FIRE +2633 ; [*0E81.0020.0002] # TRIGRAM FOR THUNDER +2634 ; [*0E82.0020.0002] # TRIGRAM FOR WIND +2635 ; [*0E83.0020.0002] # TRIGRAM FOR WATER +2636 ; [*0E84.0020.0002] # TRIGRAM FOR MOUNTAIN +2637 ; [*0E85.0020.0002] # TRIGRAM FOR EARTH +2638 ; [*0924.0020.0002] # WHEEL OF DHARMA +2639 ; [*0925.0020.0002] # WHITE FROWNING FACE +263A ; [*0926.0020.0002] # WHITE SMILING FACE +263B ; [*0927.0020.0002] # BLACK SMILING FACE +263C ; [*0928.0020.0002] # WHITE SUN WITH RAYS +263D ; [*0929.0020.0002] # FIRST QUARTER MOON +263E ; [*092A.0020.0002] # LAST QUARTER MOON +263F ; [*092B.0020.0002] # MERCURY +2640 ; [*092C.0020.0002] # FEMALE SIGN +2641 ; [*092D.0020.0002] # EARTH +2642 ; [*092E.0020.0002] # MALE SIGN +2643 ; [*092F.0020.0002] # JUPITER +2644 ; [*0930.0020.0002] # SATURN +2645 ; [*0931.0020.0002] # URANUS +2646 ; [*0932.0020.0002] # NEPTUNE +2647 ; [*0933.0020.0002] # PLUTO +2648 ; [*0934.0020.0002] # ARIES +2649 ; [*0935.0020.0002] # TAURUS +264A ; [*0936.0020.0002] # GEMINI +264B ; [*0937.0020.0002] # CANCER +264C ; [*0938.0020.0002] # LEO +264D ; [*0939.0020.0002] # VIRGO +264E ; [*093A.0020.0002] # LIBRA +264F ; [*093B.0020.0002] # SCORPIUS +2650 ; [*093C.0020.0002] # SAGITTARIUS +2651 ; [*093D.0020.0002] # CAPRICORN +2652 ; [*093E.0020.0002] # AQUARIUS +2653 ; [*093F.0020.0002] # PISCES +2654 ; [*0940.0020.0002] # WHITE CHESS KING +2655 ; [*0941.0020.0002] # WHITE CHESS QUEEN +2656 ; [*0942.0020.0002] # WHITE CHESS ROOK +2657 ; [*0943.0020.0002] # WHITE CHESS BISHOP +2658 ; [*0944.0020.0002] # WHITE CHESS KNIGHT +2659 ; [*0945.0020.0002] # WHITE CHESS PAWN +265A ; [*0946.0020.0002] # BLACK CHESS KING +265B ; [*0947.0020.0002] # BLACK CHESS QUEEN +265C ; [*0948.0020.0002] # BLACK CHESS ROOK +265D ; [*0949.0020.0002] # BLACK CHESS BISHOP +265E ; [*094A.0020.0002] # BLACK CHESS KNIGHT +265F ; [*094B.0020.0002] # BLACK CHESS PAWN +2660 ; [*094C.0020.0002] # BLACK SPADE SUIT +2661 ; [*094D.0020.0002] # WHITE HEART SUIT +2662 ; [*094E.0020.0002] # WHITE DIAMOND SUIT +2663 ; [*094F.0020.0002] # BLACK CLUB SUIT +2664 ; [*0950.0020.0002] # WHITE SPADE SUIT +2665 ; [*0951.0020.0002] # BLACK HEART SUIT +2666 ; [*0952.0020.0002] # BLACK DIAMOND SUIT +2667 ; [*0953.0020.0002] # WHITE CLUB SUIT +2668 ; [*0954.0020.0002] # HOT SPRINGS +2669 ; [*0955.0020.0002] # QUARTER NOTE +266A ; [*0956.0020.0002] # EIGHTH NOTE +266B ; [*0957.0020.0002] # BEAMED EIGHTH NOTES +266C ; [*0958.0020.0002] # BEAMED SIXTEENTH NOTES +266D ; [*10CD.0020.0002] # MUSIC FLAT SIGN +266E ; [*10CE.0020.0002] # MUSIC NATURAL SIGN +266F ; [*10CF.0020.0002] # MUSIC SHARP SIGN +2670 ; [*0959.0020.0002] # WEST SYRIAC CROSS +2671 ; [*095A.0020.0002] # EAST SYRIAC CROSS +2672 ; [*095B.0020.0002] # UNIVERSAL RECYCLING SYMBOL +2673 ; [*095C.0020.0002] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS +2674 ; [*095D.0020.0002] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS +2675 ; [*095E.0020.0002] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS +2676 ; [*095F.0020.0002] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS +2677 ; [*0960.0020.0002] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS +2678 ; [*0961.0020.0002] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS +2679 ; [*0962.0020.0002] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS +267A ; [*0963.0020.0002] # RECYCLING SYMBOL FOR GENERIC MATERIALS +267B ; [*0964.0020.0002] # BLACK UNIVERSAL RECYCLING SYMBOL +267C ; [*0965.0020.0002] # RECYCLED PAPER SYMBOL +267D ; [*0966.0020.0002] # PARTIALLY-RECYCLED PAPER SYMBOL +267E ; [*0967.0020.0002] # PERMANENT PAPER SIGN +267F ; [*0968.0020.0002] # WHEELCHAIR SYMBOL +2680 ; [*0969.0020.0002] # DIE FACE-1 +2681 ; [*096A.0020.0002] # DIE FACE-2 +2682 ; [*096B.0020.0002] # DIE FACE-3 +2683 ; [*096C.0020.0002] # DIE FACE-4 +2684 ; [*096D.0020.0002] # DIE FACE-5 +2685 ; [*096E.0020.0002] # DIE FACE-6 +2686 ; [*096F.0020.0002] # WHITE CIRCLE WITH DOT RIGHT +2687 ; [*0970.0020.0002] # WHITE CIRCLE WITH TWO DOTS +2688 ; [*0971.0020.0002] # BLACK CIRCLE WITH WHITE DOT RIGHT +2689 ; [*0972.0020.0002] # BLACK CIRCLE WITH TWO WHITE DOTS +268A ; [*0E78.0020.0002] # MONOGRAM FOR YANG +268B ; [*0E79.0020.0002] # MONOGRAM FOR YIN +268C ; [*0E7A.0020.0002] # DIGRAM FOR GREATER YANG +268D ; [*0E7B.0020.0002] # DIGRAM FOR LESSER YIN +268E ; [*0E7C.0020.0002] # DIGRAM FOR LESSER YANG +268F ; [*0E7D.0020.0002] # DIGRAM FOR GREATER YIN +2690 ; [*0973.0020.0002] # WHITE FLAG +2691 ; [*0974.0020.0002] # BLACK FLAG +2692 ; [*0975.0020.0002] # HAMMER AND PICK +2693 ; [*0976.0020.0002] # ANCHOR +2694 ; [*0977.0020.0002] # CROSSED SWORDS +2695 ; [*0978.0020.0002] # STAFF OF AESCULAPIUS +2696 ; [*0979.0020.0002] # SCALES +2697 ; [*097A.0020.0002] # ALEMBIC +2698 ; [*097B.0020.0002] # FLOWER +2699 ; [*097C.0020.0002] # GEAR +269A ; [*097D.0020.0002] # STAFF OF HERMES +269B ; [*097E.0020.0002] # ATOM SYMBOL +269C ; [*097F.0020.0002] # FLEUR-DE-LIS +269D ; [*0980.0020.0002] # OUTLINED WHITE STAR +269E ; [*0981.0020.0002] # THREE LINES CONVERGING RIGHT +269F ; [*0982.0020.0002] # THREE LINES CONVERGING LEFT +26A0 ; [*0983.0020.0002] # WARNING SIGN +26A1 ; [*0984.0020.0002] # HIGH VOLTAGE SIGN +26A2 ; [*0985.0020.0002] # DOUBLED FEMALE SIGN +26A3 ; [*0986.0020.0002] # DOUBLED MALE SIGN +26A4 ; [*0987.0020.0002] # INTERLOCKED FEMALE AND MALE SIGN +26A5 ; [*0988.0020.0002] # MALE AND FEMALE SIGN +26A6 ; [*0989.0020.0002] # MALE WITH STROKE SIGN +26A7 ; [*098A.0020.0002] # MALE WITH STROKE AND MALE AND FEMALE SIGN +26A8 ; [*098B.0020.0002] # VERTICAL MALE WITH STROKE SIGN +26A9 ; [*098C.0020.0002] # HORIZONTAL MALE WITH STROKE SIGN +26AA ; [*098D.0020.0002] # MEDIUM WHITE CIRCLE +26AB ; [*098E.0020.0002] # MEDIUM BLACK CIRCLE +26AC ; [*098F.0020.0002] # MEDIUM SMALL WHITE CIRCLE +26AD ; [*0990.0020.0002] # MARRIAGE SYMBOL +26AE ; [*0991.0020.0002] # DIVORCE SYMBOL +26AF ; [*0992.0020.0002] # UNMARRIED PARTNERSHIP SYMBOL +26B0 ; [*0993.0020.0002] # COFFIN +26B1 ; [*0994.0020.0002] # FUNERAL URN +26B2 ; [*0995.0020.0002] # NEUTER +26B3 ; [*0996.0020.0002] # CERES +26B4 ; [*0997.0020.0002] # PALLAS +26B5 ; [*0998.0020.0002] # JUNO +26B6 ; [*0999.0020.0002] # VESTA +26B7 ; [*099A.0020.0002] # CHIRON +26B8 ; [*099B.0020.0002] # BLACK MOON LILITH +26B9 ; [*099C.0020.0002] # SEXTILE +26BA ; [*099D.0020.0002] # SEMISEXTILE +26BB ; [*099E.0020.0002] # QUINCUNX +26BC ; [*099F.0020.0002] # SESQUIQUADRATE +26BD ; [*09A0.0020.0002] # SOCCER BALL +26BE ; [*09A1.0020.0002] # BASEBALL +26BF ; [*09A2.0020.0002] # SQUARED KEY +26C0 ; [*09A3.0020.0002] # WHITE DRAUGHTS MAN +26C1 ; [*09A4.0020.0002] # WHITE DRAUGHTS KING +26C2 ; [*09A5.0020.0002] # BLACK DRAUGHTS MAN +26C3 ; [*09A6.0020.0002] # BLACK DRAUGHTS KING +26C4 ; [*09A7.0020.0002] # SNOWMAN WITHOUT SNOW +26C5 ; [*09A8.0020.0002] # SUN BEHIND CLOUD +26C6 ; [*09A9.0020.0002] # RAIN +26C7 ; [*09AA.0020.0002] # BLACK SNOWMAN +26C8 ; [*09AB.0020.0002] # THUNDER CLOUD AND RAIN +26C9 ; [*09AC.0020.0002] # TURNED WHITE SHOGI PIECE +26CA ; [*09AD.0020.0002] # TURNED BLACK SHOGI PIECE +26CB ; [*09AE.0020.0002] # WHITE DIAMOND IN SQUARE +26CC ; [*09AF.0020.0002] # CROSSING LANES +26CD ; [*09B0.0020.0002] # DISABLED CAR +26CE ; [*09B1.0020.0002] # OPHIUCHUS +26CF ; [*09B2.0020.0002] # PICK +26D0 ; [*09B3.0020.0002] # CAR SLIDING +26D1 ; [*09B4.0020.0002] # HELMET WITH WHITE CROSS +26D2 ; [*09B5.0020.0002] # CIRCLED CROSSING LANES +26D3 ; [*09B6.0020.0002] # CHAINS +26D4 ; [*09B7.0020.0002] # NO ENTRY +26D5 ; [*09B8.0020.0002] # ALTERNATE ONE-WAY LEFT WAY TRAFFIC +26D6 ; [*09B9.0020.0002] # BLACK TWO-WAY LEFT WAY TRAFFIC +26D7 ; [*09BA.0020.0002] # WHITE TWO-WAY LEFT WAY TRAFFIC +26D8 ; [*09BB.0020.0002] # BLACK LEFT LANE MERGE +26D9 ; [*09BC.0020.0002] # WHITE LEFT LANE MERGE +26DA ; [*09BD.0020.0002] # DRIVE SLOW SIGN +26DB ; [*09BE.0020.0002] # HEAVY WHITE DOWN-POINTING TRIANGLE +26DC ; [*09BF.0020.0002] # LEFT CLOSED ENTRY +26DD ; [*09C0.0020.0002] # SQUARED SALTIRE +26DE ; [*09C1.0020.0002] # FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE +26DF ; [*09C2.0020.0002] # BLACK TRUCK +26E0 ; [*09C3.0020.0002] # RESTRICTED LEFT ENTRY-1 +26E1 ; [*09C4.0020.0002] # RESTRICTED LEFT ENTRY-2 +26E2 ; [*09C5.0020.0002] # ASTRONOMICAL SYMBOL FOR URANUS +26E3 ; [*09C6.0020.0002] # HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E4 ; [*09C7.0020.0002] # PENTAGRAM +26E5 ; [*09C8.0020.0002] # RIGHT-HANDED INTERLACED PENTAGRAM +26E6 ; [*09C9.0020.0002] # LEFT-HANDED INTERLACED PENTAGRAM +26E7 ; [*09CA.0020.0002] # INVERTED PENTAGRAM +26E8 ; [*09CB.0020.0002] # BLACK CROSS ON SHIELD +26E9 ; [*09CC.0020.0002] # SHINTO SHRINE +26EA ; [*09CD.0020.0002] # CHURCH +26EB ; [*09CE.0020.0002] # CASTLE +26EC ; [*09CF.0020.0002] # HISTORIC SITE +26ED ; [*09D0.0020.0002] # GEAR WITHOUT HUB +26EE ; [*09D1.0020.0002] # GEAR WITH HANDLES +26EF ; [*09D2.0020.0002] # MAP SYMBOL FOR LIGHTHOUSE +26F0 ; [*09D3.0020.0002] # MOUNTAIN +26F1 ; [*09D4.0020.0002] # UMBRELLA ON GROUND +26F2 ; [*09D5.0020.0002] # FOUNTAIN +26F3 ; [*09D6.0020.0002] # FLAG IN HOLE +26F4 ; [*09D7.0020.0002] # FERRY +26F5 ; [*09D8.0020.0002] # SAILBOAT +26F6 ; [*09D9.0020.0002] # SQUARE FOUR CORNERS +26F7 ; [*09DA.0020.0002] # SKIER +26F8 ; [*09DB.0020.0002] # ICE SKATE +26F9 ; [*09DC.0020.0002] # PERSON WITH BALL +26FA ; [*09DD.0020.0002] # TENT +26FB ; [*09DE.0020.0002] # JAPANESE BANK SYMBOL +26FC ; [*09DF.0020.0002] # HEADSTONE GRAVEYARD SYMBOL +26FD ; [*09E0.0020.0002] # FUEL PUMP +26FE ; [*09E1.0020.0002] # CUP ON BLACK SQUARE +26FF ; [*09E2.0020.0002] # WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +2700 ; [*09FD.0020.0002] # BLACK SAFETY SCISSORS +2701 ; [*09FE.0020.0002] # UPPER BLADE SCISSORS +2702 ; [*09FF.0020.0002] # BLACK SCISSORS +2703 ; [*0A00.0020.0002] # LOWER BLADE SCISSORS +2704 ; [*0A01.0020.0002] # WHITE SCISSORS +2705 ; [*0A02.0020.0002] # WHITE HEAVY CHECK MARK +2706 ; [*0A03.0020.0002] # TELEPHONE LOCATION SIGN +2707 ; [*0A04.0020.0002] # TAPE DRIVE +2708 ; [*0A05.0020.0002] # AIRPLANE +2709 ; [*0A06.0020.0002] # ENVELOPE +270A ; [*0A07.0020.0002] # RAISED FIST +270B ; [*0A08.0020.0002] # RAISED HAND +270C ; [*0A09.0020.0002] # VICTORY HAND +270D ; [*0A0A.0020.0002] # WRITING HAND +270E ; [*0A0B.0020.0002] # LOWER RIGHT PENCIL +270F ; [*0A0C.0020.0002] # PENCIL +2710 ; [*0A0D.0020.0002] # UPPER RIGHT PENCIL +2711 ; [*0A0E.0020.0002] # WHITE NIB +2712 ; [*0A0F.0020.0002] # BLACK NIB +2713 ; [*0A10.0020.0002] # CHECK MARK +2714 ; [*0A11.0020.0002] # HEAVY CHECK MARK +2715 ; [*0A12.0020.0002] # MULTIPLICATION X +2716 ; [*0A13.0020.0002] # HEAVY MULTIPLICATION X +2717 ; [*0A14.0020.0002] # BALLOT X +2718 ; [*0A15.0020.0002] # HEAVY BALLOT X +2719 ; [*0A16.0020.0002] # OUTLINED GREEK CROSS +271A ; [*0A17.0020.0002] # HEAVY GREEK CROSS +271B ; [*0A18.0020.0002] # OPEN CENTRE CROSS +271C ; [*0A19.0020.0002] # HEAVY OPEN CENTRE CROSS +271D ; [*0A1A.0020.0002] # LATIN CROSS +271E ; [*0A1B.0020.0002] # SHADOWED WHITE LATIN CROSS +271F ; [*0A1C.0020.0002] # OUTLINED LATIN CROSS +2720 ; [*0A1D.0020.0002] # MALTESE CROSS +2721 ; [*0A1E.0020.0002] # STAR OF DAVID +2722 ; [*0A1F.0020.0002] # FOUR TEARDROP-SPOKED ASTERISK +2723 ; [*0A20.0020.0002] # FOUR BALLOON-SPOKED ASTERISK +2724 ; [*0A21.0020.0002] # HEAVY FOUR BALLOON-SPOKED ASTERISK +2725 ; [*0A22.0020.0002] # FOUR CLUB-SPOKED ASTERISK +2726 ; [*0A23.0020.0002] # BLACK FOUR POINTED STAR +2727 ; [*0A24.0020.0002] # WHITE FOUR POINTED STAR +2728 ; [*0A25.0020.0002] # SPARKLES +2729 ; [*0A26.0020.0002] # STRESS OUTLINED WHITE STAR +272A ; [*0A27.0020.0002] # CIRCLED WHITE STAR +272B ; [*0A28.0020.0002] # OPEN CENTRE BLACK STAR +272C ; [*0A29.0020.0002] # BLACK CENTRE WHITE STAR +272D ; [*0A2A.0020.0002] # OUTLINED BLACK STAR +272E ; [*0A2B.0020.0002] # HEAVY OUTLINED BLACK STAR +272F ; [*0A2C.0020.0002] # PINWHEEL STAR +2730 ; [*0A2D.0020.0002] # SHADOWED WHITE STAR +2731 ; [*0A2E.0020.0002] # HEAVY ASTERISK +2732 ; [*0A2F.0020.0002] # OPEN CENTRE ASTERISK +2733 ; [*0A30.0020.0002] # EIGHT SPOKED ASTERISK +2734 ; [*0A31.0020.0002] # EIGHT POINTED BLACK STAR +2735 ; [*0A32.0020.0002] # EIGHT POINTED PINWHEEL STAR +2736 ; [*0A33.0020.0002] # SIX POINTED BLACK STAR +2737 ; [*0A34.0020.0002] # EIGHT POINTED RECTILINEAR BLACK STAR +2738 ; [*0A35.0020.0002] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +2739 ; [*0A36.0020.0002] # TWELVE POINTED BLACK STAR +273A ; [*0A37.0020.0002] # SIXTEEN POINTED ASTERISK +273B ; [*0A38.0020.0002] # TEARDROP-SPOKED ASTERISK +273C ; [*0A39.0020.0002] # OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D ; [*0A3A.0020.0002] # HEAVY TEARDROP-SPOKED ASTERISK +273E ; [*0A3B.0020.0002] # SIX PETALLED BLACK AND WHITE FLORETTE +273F ; [*0A3C.0020.0002] # BLACK FLORETTE +2740 ; [*0A3D.0020.0002] # WHITE FLORETTE +2741 ; [*0A3E.0020.0002] # EIGHT PETALLED OUTLINED BLACK FLORETTE +2742 ; [*0A3F.0020.0002] # CIRCLED OPEN CENTRE EIGHT POINTED STAR +2743 ; [*0A40.0020.0002] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +2744 ; [*0A41.0020.0002] # SNOWFLAKE +2745 ; [*0A42.0020.0002] # TIGHT TRIFOLIATE SNOWFLAKE +2746 ; [*0A43.0020.0002] # HEAVY CHEVRON SNOWFLAKE +2747 ; [*0A44.0020.0002] # SPARKLE +2748 ; [*0A45.0020.0002] # HEAVY SPARKLE +2749 ; [*0A46.0020.0002] # BALLOON-SPOKED ASTERISK +274A ; [*0A47.0020.0002] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274B ; [*0A48.0020.0002] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274C ; [*0A49.0020.0002] # CROSS MARK +274D ; [*0A4A.0020.0002] # SHADOWED WHITE CIRCLE +274E ; [*0A4B.0020.0002] # NEGATIVE SQUARED CROSS MARK +274F ; [*0A4C.0020.0002] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE +2750 ; [*0A4D.0020.0002] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE +2751 ; [*0A4E.0020.0002] # LOWER RIGHT SHADOWED WHITE SQUARE +2752 ; [*0A4F.0020.0002] # UPPER RIGHT SHADOWED WHITE SQUARE +2753 ; [*0A50.0020.0002] # BLACK QUESTION MARK ORNAMENT +2754 ; [*0A51.0020.0002] # WHITE QUESTION MARK ORNAMENT +2755 ; [*0A52.0020.0002] # WHITE EXCLAMATION MARK ORNAMENT +2756 ; [*0A53.0020.0002] # BLACK DIAMOND MINUS WHITE X +2757 ; [*0A54.0020.0002] # HEAVY EXCLAMATION MARK SYMBOL +2758 ; [*0A55.0020.0002] # LIGHT VERTICAL BAR +2759 ; [*0A56.0020.0002] # MEDIUM VERTICAL BAR +275A ; [*0A57.0020.0002] # HEAVY VERTICAL BAR +275B ; [*0A58.0020.0002] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT +275C ; [*0A59.0020.0002] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT +275D ; [*0A5A.0020.0002] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +275E ; [*0A5B.0020.0002] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +275F ; [*0A5C.0020.0002] # HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT +2760 ; [*0A5D.0020.0002] # HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +2761 ; [*0A5E.0020.0002] # CURVED STEM PARAGRAPH SIGN ORNAMENT +2762 ; [*0A5F.0020.0002] # HEAVY EXCLAMATION MARK ORNAMENT +2763 ; [*0A60.0020.0002] # HEAVY HEART EXCLAMATION MARK ORNAMENT +2764 ; [*0A61.0020.0002] # HEAVY BLACK HEART +2765 ; [*0A62.0020.0002] # ROTATED HEAVY BLACK HEART BULLET +2766 ; [*0A63.0020.0002] # FLORAL HEART +2767 ; [*0A64.0020.0002] # ROTATED FLORAL HEART BULLET +2768 ; [*0346.0020.0002] # MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; [*0347.0020.0002] # MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; [*0348.0020.0002] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; [*0349.0020.0002] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; [*034A.0020.0002] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; [*034B.0020.0002] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; [*034C.0020.0002] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; [*034D.0020.0002] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; [*034E.0020.0002] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; [*034F.0020.0002] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; [*0350.0020.0002] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; [*0351.0020.0002] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; [*0352.0020.0002] # MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; [*0353.0020.0002] # MEDIUM RIGHT CURLY BRACKET ORNAMENT +2794 ; [*0A65.0020.0002] # HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795 ; [*0A66.0020.0002] # HEAVY PLUS SIGN +2796 ; [*0A67.0020.0002] # HEAVY MINUS SIGN +2797 ; [*0A68.0020.0002] # HEAVY DIVISION SIGN +2798 ; [*0A69.0020.0002] # HEAVY SOUTH EAST ARROW +2799 ; [*0A6A.0020.0002] # HEAVY RIGHTWARDS ARROW +279A ; [*0A6B.0020.0002] # HEAVY NORTH EAST ARROW +279B ; [*0A6C.0020.0002] # DRAFTING POINT RIGHTWARDS ARROW +279C ; [*0A6D.0020.0002] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW +279D ; [*0A6E.0020.0002] # TRIANGLE-HEADED RIGHTWARDS ARROW +279E ; [*0A6F.0020.0002] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +279F ; [*0A70.0020.0002] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A0 ; [*0A71.0020.0002] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A1 ; [*0A72.0020.0002] # BLACK RIGHTWARDS ARROW +27A2 ; [*0A73.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +27A3 ; [*0A74.0020.0002] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +27A4 ; [*0A75.0020.0002] # BLACK RIGHTWARDS ARROWHEAD +27A5 ; [*0A76.0020.0002] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +27A6 ; [*0A77.0020.0002] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +27A7 ; [*0A78.0020.0002] # SQUAT BLACK RIGHTWARDS ARROW +27A8 ; [*0A79.0020.0002] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +27A9 ; [*0A7A.0020.0002] # RIGHT-SHADED WHITE RIGHTWARDS ARROW +27AA ; [*0A7B.0020.0002] # LEFT-SHADED WHITE RIGHTWARDS ARROW +27AB ; [*0A7C.0020.0002] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AC ; [*0A7D.0020.0002] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AD ; [*0A7E.0020.0002] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AE ; [*0A7F.0020.0002] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AF ; [*0A80.0020.0002] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B0 ; [*0A81.0020.0002] # CURLY LOOP +27B1 ; [*0A82.0020.0002] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B2 ; [*0A83.0020.0002] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW +27B3 ; [*0A84.0020.0002] # WHITE-FEATHERED RIGHTWARDS ARROW +27B4 ; [*0A85.0020.0002] # BLACK-FEATHERED SOUTH EAST ARROW +27B5 ; [*0A86.0020.0002] # BLACK-FEATHERED RIGHTWARDS ARROW +27B6 ; [*0A87.0020.0002] # BLACK-FEATHERED NORTH EAST ARROW +27B7 ; [*0A88.0020.0002] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW +27B8 ; [*0A89.0020.0002] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +27B9 ; [*0A8A.0020.0002] # HEAVY BLACK-FEATHERED NORTH EAST ARROW +27BA ; [*0A8B.0020.0002] # TEARDROP-BARBED RIGHTWARDS ARROW +27BB ; [*0A8C.0020.0002] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +27BC ; [*0A8D.0020.0002] # WEDGE-TAILED RIGHTWARDS ARROW +27BD ; [*0A8E.0020.0002] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW +27BE ; [*0A8F.0020.0002] # OPEN-OUTLINED RIGHTWARDS ARROW +27BF ; [*0A90.0020.0002] # DOUBLE CURLY LOOP +27C0 ; [*0A91.0020.0002] # THREE DIMENSIONAL ANGLE +27C1 ; [*0A92.0020.0002] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE +27C2 ; [*0A93.0020.0002] # PERPENDICULAR +27C3 ; [*0A94.0020.0002] # OPEN SUBSET +27C4 ; [*0A95.0020.0002] # OPEN SUPERSET +27C5 ; [*033A.0020.0002] # LEFT S-SHAPED BAG DELIMITER +27C6 ; [*033B.0020.0002] # RIGHT S-SHAPED BAG DELIMITER +27C7 ; [*0A96.0020.0002] # OR WITH DOT INSIDE +27C8 ; [*0A97.0020.0002] # REVERSE SOLIDUS PRECEDING SUBSET +27C9 ; [*0A98.0020.0002] # SUPERSET PRECEDING SOLIDUS +27CA ; [*0A99.0020.0002] # VERTICAL BAR WITH HORIZONTAL STROKE +27CB ; [*0A9A.0020.0002] # MATHEMATICAL RISING DIAGONAL +27CC ; [*0A9B.0020.0002] # LONG DIVISION +27CD ; [*0A9C.0020.0002] # MATHEMATICAL FALLING DIAGONAL +27CE ; [*0A9D.0020.0002] # SQUARED LOGICAL AND +27CF ; [*0A9E.0020.0002] # SQUARED LOGICAL OR +27D0 ; [*0A9F.0020.0002] # WHITE DIAMOND WITH CENTRED DOT +27D1 ; [*0AA0.0020.0002] # AND WITH DOT +27D2 ; [*0AA1.0020.0002] # ELEMENT OF OPENING UPWARDS +27D3 ; [*0AA2.0020.0002] # LOWER RIGHT CORNER WITH DOT +27D4 ; [*0AA3.0020.0002] # UPPER LEFT CORNER WITH DOT +27D5 ; [*0AA4.0020.0002] # LEFT OUTER JOIN +27D6 ; [*0AA5.0020.0002] # RIGHT OUTER JOIN +27D7 ; [*0AA6.0020.0002] # FULL OUTER JOIN +27D8 ; [*0AA7.0020.0002] # LARGE UP TACK +27D9 ; [*0AA8.0020.0002] # LARGE DOWN TACK +27DA ; [*0AA9.0020.0002] # LEFT AND RIGHT DOUBLE TURNSTILE +27DB ; [*0AAA.0020.0002] # LEFT AND RIGHT TACK +27DC ; [*0AAB.0020.0002] # LEFT MULTIMAP +27DD ; [*0AAC.0020.0002] # LONG RIGHT TACK +27DE ; [*0AAD.0020.0002] # LONG LEFT TACK +27DF ; [*0AAE.0020.0002] # UP TACK WITH CIRCLE ABOVE +27E0 ; [*0AAF.0020.0002] # LOZENGE DIVIDED BY HORIZONTAL RULE +27E1 ; [*0AB0.0020.0002] # WHITE CONCAVE-SIDED DIAMOND +27E2 ; [*0AB1.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +27E3 ; [*0AB2.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +27E4 ; [*0AB3.0020.0002] # WHITE SQUARE WITH LEFTWARDS TICK +27E5 ; [*0AB4.0020.0002] # WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; [*033C.0020.0002] # MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; [*033D.0020.0002] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; [*033E.0020.0002] # MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; [*033F.0020.0002] # MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; [*0340.0020.0002] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; [*0341.0020.0002] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; [*0342.0020.0002] # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; [*0343.0020.0002] # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; [*0344.0020.0002] # MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; [*0345.0020.0002] # MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0 ; [*0AB5.0020.0002] # UPWARDS QUADRUPLE ARROW +27F1 ; [*0AB6.0020.0002] # DOWNWARDS QUADRUPLE ARROW +27F2 ; [*0AB7.0020.0002] # ANTICLOCKWISE GAPPED CIRCLE ARROW +27F3 ; [*0AB8.0020.0002] # CLOCKWISE GAPPED CIRCLE ARROW +27F4 ; [*0AB9.0020.0002] # RIGHT ARROW WITH CIRCLED PLUS +27F5 ; [*0ABA.0020.0002] # LONG LEFTWARDS ARROW +27F6 ; [*0ABB.0020.0002] # LONG RIGHTWARDS ARROW +27F7 ; [*0ABC.0020.0002] # LONG LEFT RIGHT ARROW +27F8 ; [*0ABD.0020.0002] # LONG LEFTWARDS DOUBLE ARROW +27F9 ; [*0ABE.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW +27FA ; [*0ABF.0020.0002] # LONG LEFT RIGHT DOUBLE ARROW +27FB ; [*0AC0.0020.0002] # LONG LEFTWARDS ARROW FROM BAR +27FC ; [*0AC1.0020.0002] # LONG RIGHTWARDS ARROW FROM BAR +27FD ; [*0AC2.0020.0002] # LONG LEFTWARDS DOUBLE ARROW FROM BAR +27FE ; [*0AC3.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR +27FF ; [*0AC4.0020.0002] # LONG RIGHTWARDS SQUIGGLE ARROW +2800 ; [*0D78.0020.0002] # BRAILLE PATTERN BLANK +2801 ; [*0D79.0020.0002] # BRAILLE PATTERN DOTS-1 +2802 ; [*0D7A.0020.0002] # BRAILLE PATTERN DOTS-2 +2803 ; [*0D7B.0020.0002] # BRAILLE PATTERN DOTS-12 +2804 ; [*0D7C.0020.0002] # BRAILLE PATTERN DOTS-3 +2805 ; [*0D7D.0020.0002] # BRAILLE PATTERN DOTS-13 +2806 ; [*0D7E.0020.0002] # BRAILLE PATTERN DOTS-23 +2807 ; [*0D7F.0020.0002] # BRAILLE PATTERN DOTS-123 +2808 ; [*0D80.0020.0002] # BRAILLE PATTERN DOTS-4 +2809 ; [*0D81.0020.0002] # BRAILLE PATTERN DOTS-14 +280A ; [*0D82.0020.0002] # BRAILLE PATTERN DOTS-24 +280B ; [*0D83.0020.0002] # BRAILLE PATTERN DOTS-124 +280C ; [*0D84.0020.0002] # BRAILLE PATTERN DOTS-34 +280D ; [*0D85.0020.0002] # BRAILLE PATTERN DOTS-134 +280E ; [*0D86.0020.0002] # BRAILLE PATTERN DOTS-234 +280F ; [*0D87.0020.0002] # BRAILLE PATTERN DOTS-1234 +2810 ; [*0D88.0020.0002] # BRAILLE PATTERN DOTS-5 +2811 ; [*0D89.0020.0002] # BRAILLE PATTERN DOTS-15 +2812 ; [*0D8A.0020.0002] # BRAILLE PATTERN DOTS-25 +2813 ; [*0D8B.0020.0002] # BRAILLE PATTERN DOTS-125 +2814 ; [*0D8C.0020.0002] # BRAILLE PATTERN DOTS-35 +2815 ; [*0D8D.0020.0002] # BRAILLE PATTERN DOTS-135 +2816 ; [*0D8E.0020.0002] # BRAILLE PATTERN DOTS-235 +2817 ; [*0D8F.0020.0002] # BRAILLE PATTERN DOTS-1235 +2818 ; [*0D90.0020.0002] # BRAILLE PATTERN DOTS-45 +2819 ; [*0D91.0020.0002] # BRAILLE PATTERN DOTS-145 +281A ; [*0D92.0020.0002] # BRAILLE PATTERN DOTS-245 +281B ; [*0D93.0020.0002] # BRAILLE PATTERN DOTS-1245 +281C ; [*0D94.0020.0002] # BRAILLE PATTERN DOTS-345 +281D ; [*0D95.0020.0002] # BRAILLE PATTERN DOTS-1345 +281E ; [*0D96.0020.0002] # BRAILLE PATTERN DOTS-2345 +281F ; [*0D97.0020.0002] # BRAILLE PATTERN DOTS-12345 +2820 ; [*0D98.0020.0002] # BRAILLE PATTERN DOTS-6 +2821 ; [*0D99.0020.0002] # BRAILLE PATTERN DOTS-16 +2822 ; [*0D9A.0020.0002] # BRAILLE PATTERN DOTS-26 +2823 ; [*0D9B.0020.0002] # BRAILLE PATTERN DOTS-126 +2824 ; [*0D9C.0020.0002] # BRAILLE PATTERN DOTS-36 +2825 ; [*0D9D.0020.0002] # BRAILLE PATTERN DOTS-136 +2826 ; [*0D9E.0020.0002] # BRAILLE PATTERN DOTS-236 +2827 ; [*0D9F.0020.0002] # BRAILLE PATTERN DOTS-1236 +2828 ; [*0DA0.0020.0002] # BRAILLE PATTERN DOTS-46 +2829 ; [*0DA1.0020.0002] # BRAILLE PATTERN DOTS-146 +282A ; [*0DA2.0020.0002] # BRAILLE PATTERN DOTS-246 +282B ; [*0DA3.0020.0002] # BRAILLE PATTERN DOTS-1246 +282C ; [*0DA4.0020.0002] # BRAILLE PATTERN DOTS-346 +282D ; [*0DA5.0020.0002] # BRAILLE PATTERN DOTS-1346 +282E ; [*0DA6.0020.0002] # BRAILLE PATTERN DOTS-2346 +282F ; [*0DA7.0020.0002] # BRAILLE PATTERN DOTS-12346 +2830 ; [*0DA8.0020.0002] # BRAILLE PATTERN DOTS-56 +2831 ; [*0DA9.0020.0002] # BRAILLE PATTERN DOTS-156 +2832 ; [*0DAA.0020.0002] # BRAILLE PATTERN DOTS-256 +2833 ; [*0DAB.0020.0002] # BRAILLE PATTERN DOTS-1256 +2834 ; [*0DAC.0020.0002] # BRAILLE PATTERN DOTS-356 +2835 ; [*0DAD.0020.0002] # BRAILLE PATTERN DOTS-1356 +2836 ; [*0DAE.0020.0002] # BRAILLE PATTERN DOTS-2356 +2837 ; [*0DAF.0020.0002] # BRAILLE PATTERN DOTS-12356 +2838 ; [*0DB0.0020.0002] # BRAILLE PATTERN DOTS-456 +2839 ; [*0DB1.0020.0002] # BRAILLE PATTERN DOTS-1456 +283A ; [*0DB2.0020.0002] # BRAILLE PATTERN DOTS-2456 +283B ; [*0DB3.0020.0002] # BRAILLE PATTERN DOTS-12456 +283C ; [*0DB4.0020.0002] # BRAILLE PATTERN DOTS-3456 +283D ; [*0DB5.0020.0002] # BRAILLE PATTERN DOTS-13456 +283E ; [*0DB6.0020.0002] # BRAILLE PATTERN DOTS-23456 +283F ; [*0DB7.0020.0002] # BRAILLE PATTERN DOTS-123456 +2840 ; [*0DB8.0020.0002] # BRAILLE PATTERN DOTS-7 +2841 ; [*0DB9.0020.0002] # BRAILLE PATTERN DOTS-17 +2842 ; [*0DBA.0020.0002] # BRAILLE PATTERN DOTS-27 +2843 ; [*0DBB.0020.0002] # BRAILLE PATTERN DOTS-127 +2844 ; [*0DBC.0020.0002] # BRAILLE PATTERN DOTS-37 +2845 ; [*0DBD.0020.0002] # BRAILLE PATTERN DOTS-137 +2846 ; [*0DBE.0020.0002] # BRAILLE PATTERN DOTS-237 +2847 ; [*0DBF.0020.0002] # BRAILLE PATTERN DOTS-1237 +2848 ; [*0DC0.0020.0002] # BRAILLE PATTERN DOTS-47 +2849 ; [*0DC1.0020.0002] # BRAILLE PATTERN DOTS-147 +284A ; [*0DC2.0020.0002] # BRAILLE PATTERN DOTS-247 +284B ; [*0DC3.0020.0002] # BRAILLE PATTERN DOTS-1247 +284C ; [*0DC4.0020.0002] # BRAILLE PATTERN DOTS-347 +284D ; [*0DC5.0020.0002] # BRAILLE PATTERN DOTS-1347 +284E ; [*0DC6.0020.0002] # BRAILLE PATTERN DOTS-2347 +284F ; [*0DC7.0020.0002] # BRAILLE PATTERN DOTS-12347 +2850 ; [*0DC8.0020.0002] # BRAILLE PATTERN DOTS-57 +2851 ; [*0DC9.0020.0002] # BRAILLE PATTERN DOTS-157 +2852 ; [*0DCA.0020.0002] # BRAILLE PATTERN DOTS-257 +2853 ; [*0DCB.0020.0002] # BRAILLE PATTERN DOTS-1257 +2854 ; [*0DCC.0020.0002] # BRAILLE PATTERN DOTS-357 +2855 ; [*0DCD.0020.0002] # BRAILLE PATTERN DOTS-1357 +2856 ; [*0DCE.0020.0002] # BRAILLE PATTERN DOTS-2357 +2857 ; [*0DCF.0020.0002] # BRAILLE PATTERN DOTS-12357 +2858 ; [*0DD0.0020.0002] # BRAILLE PATTERN DOTS-457 +2859 ; [*0DD1.0020.0002] # BRAILLE PATTERN DOTS-1457 +285A ; [*0DD2.0020.0002] # BRAILLE PATTERN DOTS-2457 +285B ; [*0DD3.0020.0002] # BRAILLE PATTERN DOTS-12457 +285C ; [*0DD4.0020.0002] # BRAILLE PATTERN DOTS-3457 +285D ; [*0DD5.0020.0002] # BRAILLE PATTERN DOTS-13457 +285E ; [*0DD6.0020.0002] # BRAILLE PATTERN DOTS-23457 +285F ; [*0DD7.0020.0002] # BRAILLE PATTERN DOTS-123457 +2860 ; [*0DD8.0020.0002] # BRAILLE PATTERN DOTS-67 +2861 ; [*0DD9.0020.0002] # BRAILLE PATTERN DOTS-167 +2862 ; [*0DDA.0020.0002] # BRAILLE PATTERN DOTS-267 +2863 ; [*0DDB.0020.0002] # BRAILLE PATTERN DOTS-1267 +2864 ; [*0DDC.0020.0002] # BRAILLE PATTERN DOTS-367 +2865 ; [*0DDD.0020.0002] # BRAILLE PATTERN DOTS-1367 +2866 ; [*0DDE.0020.0002] # BRAILLE PATTERN DOTS-2367 +2867 ; [*0DDF.0020.0002] # BRAILLE PATTERN DOTS-12367 +2868 ; [*0DE0.0020.0002] # BRAILLE PATTERN DOTS-467 +2869 ; [*0DE1.0020.0002] # BRAILLE PATTERN DOTS-1467 +286A ; [*0DE2.0020.0002] # BRAILLE PATTERN DOTS-2467 +286B ; [*0DE3.0020.0002] # BRAILLE PATTERN DOTS-12467 +286C ; [*0DE4.0020.0002] # BRAILLE PATTERN DOTS-3467 +286D ; [*0DE5.0020.0002] # BRAILLE PATTERN DOTS-13467 +286E ; [*0DE6.0020.0002] # BRAILLE PATTERN DOTS-23467 +286F ; [*0DE7.0020.0002] # BRAILLE PATTERN DOTS-123467 +2870 ; [*0DE8.0020.0002] # BRAILLE PATTERN DOTS-567 +2871 ; [*0DE9.0020.0002] # BRAILLE PATTERN DOTS-1567 +2872 ; [*0DEA.0020.0002] # BRAILLE PATTERN DOTS-2567 +2873 ; [*0DEB.0020.0002] # BRAILLE PATTERN DOTS-12567 +2874 ; [*0DEC.0020.0002] # BRAILLE PATTERN DOTS-3567 +2875 ; [*0DED.0020.0002] # BRAILLE PATTERN DOTS-13567 +2876 ; [*0DEE.0020.0002] # BRAILLE PATTERN DOTS-23567 +2877 ; [*0DEF.0020.0002] # BRAILLE PATTERN DOTS-123567 +2878 ; [*0DF0.0020.0002] # BRAILLE PATTERN DOTS-4567 +2879 ; [*0DF1.0020.0002] # BRAILLE PATTERN DOTS-14567 +287A ; [*0DF2.0020.0002] # BRAILLE PATTERN DOTS-24567 +287B ; [*0DF3.0020.0002] # BRAILLE PATTERN DOTS-124567 +287C ; [*0DF4.0020.0002] # BRAILLE PATTERN DOTS-34567 +287D ; [*0DF5.0020.0002] # BRAILLE PATTERN DOTS-134567 +287E ; [*0DF6.0020.0002] # BRAILLE PATTERN DOTS-234567 +287F ; [*0DF7.0020.0002] # BRAILLE PATTERN DOTS-1234567 +2880 ; [*0DF8.0020.0002] # BRAILLE PATTERN DOTS-8 +2881 ; [*0DF9.0020.0002] # BRAILLE PATTERN DOTS-18 +2882 ; [*0DFA.0020.0002] # BRAILLE PATTERN DOTS-28 +2883 ; [*0DFB.0020.0002] # BRAILLE PATTERN DOTS-128 +2884 ; [*0DFC.0020.0002] # BRAILLE PATTERN DOTS-38 +2885 ; [*0DFD.0020.0002] # BRAILLE PATTERN DOTS-138 +2886 ; [*0DFE.0020.0002] # BRAILLE PATTERN DOTS-238 +2887 ; [*0DFF.0020.0002] # BRAILLE PATTERN DOTS-1238 +2888 ; [*0E00.0020.0002] # BRAILLE PATTERN DOTS-48 +2889 ; [*0E01.0020.0002] # BRAILLE PATTERN DOTS-148 +288A ; [*0E02.0020.0002] # BRAILLE PATTERN DOTS-248 +288B ; [*0E03.0020.0002] # BRAILLE PATTERN DOTS-1248 +288C ; [*0E04.0020.0002] # BRAILLE PATTERN DOTS-348 +288D ; [*0E05.0020.0002] # BRAILLE PATTERN DOTS-1348 +288E ; [*0E06.0020.0002] # BRAILLE PATTERN DOTS-2348 +288F ; [*0E07.0020.0002] # BRAILLE PATTERN DOTS-12348 +2890 ; [*0E08.0020.0002] # BRAILLE PATTERN DOTS-58 +2891 ; [*0E09.0020.0002] # BRAILLE PATTERN DOTS-158 +2892 ; [*0E0A.0020.0002] # BRAILLE PATTERN DOTS-258 +2893 ; [*0E0B.0020.0002] # BRAILLE PATTERN DOTS-1258 +2894 ; [*0E0C.0020.0002] # BRAILLE PATTERN DOTS-358 +2895 ; [*0E0D.0020.0002] # BRAILLE PATTERN DOTS-1358 +2896 ; [*0E0E.0020.0002] # BRAILLE PATTERN DOTS-2358 +2897 ; [*0E0F.0020.0002] # BRAILLE PATTERN DOTS-12358 +2898 ; [*0E10.0020.0002] # BRAILLE PATTERN DOTS-458 +2899 ; [*0E11.0020.0002] # BRAILLE PATTERN DOTS-1458 +289A ; [*0E12.0020.0002] # BRAILLE PATTERN DOTS-2458 +289B ; [*0E13.0020.0002] # BRAILLE PATTERN DOTS-12458 +289C ; [*0E14.0020.0002] # BRAILLE PATTERN DOTS-3458 +289D ; [*0E15.0020.0002] # BRAILLE PATTERN DOTS-13458 +289E ; [*0E16.0020.0002] # BRAILLE PATTERN DOTS-23458 +289F ; [*0E17.0020.0002] # BRAILLE PATTERN DOTS-123458 +28A0 ; [*0E18.0020.0002] # BRAILLE PATTERN DOTS-68 +28A1 ; [*0E19.0020.0002] # BRAILLE PATTERN DOTS-168 +28A2 ; [*0E1A.0020.0002] # BRAILLE PATTERN DOTS-268 +28A3 ; [*0E1B.0020.0002] # BRAILLE PATTERN DOTS-1268 +28A4 ; [*0E1C.0020.0002] # BRAILLE PATTERN DOTS-368 +28A5 ; [*0E1D.0020.0002] # BRAILLE PATTERN DOTS-1368 +28A6 ; [*0E1E.0020.0002] # BRAILLE PATTERN DOTS-2368 +28A7 ; [*0E1F.0020.0002] # BRAILLE PATTERN DOTS-12368 +28A8 ; [*0E20.0020.0002] # BRAILLE PATTERN DOTS-468 +28A9 ; [*0E21.0020.0002] # BRAILLE PATTERN DOTS-1468 +28AA ; [*0E22.0020.0002] # BRAILLE PATTERN DOTS-2468 +28AB ; [*0E23.0020.0002] # BRAILLE PATTERN DOTS-12468 +28AC ; [*0E24.0020.0002] # BRAILLE PATTERN DOTS-3468 +28AD ; [*0E25.0020.0002] # BRAILLE PATTERN DOTS-13468 +28AE ; [*0E26.0020.0002] # BRAILLE PATTERN DOTS-23468 +28AF ; [*0E27.0020.0002] # BRAILLE PATTERN DOTS-123468 +28B0 ; [*0E28.0020.0002] # BRAILLE PATTERN DOTS-568 +28B1 ; [*0E29.0020.0002] # BRAILLE PATTERN DOTS-1568 +28B2 ; [*0E2A.0020.0002] # BRAILLE PATTERN DOTS-2568 +28B3 ; [*0E2B.0020.0002] # BRAILLE PATTERN DOTS-12568 +28B4 ; [*0E2C.0020.0002] # BRAILLE PATTERN DOTS-3568 +28B5 ; [*0E2D.0020.0002] # BRAILLE PATTERN DOTS-13568 +28B6 ; [*0E2E.0020.0002] # BRAILLE PATTERN DOTS-23568 +28B7 ; [*0E2F.0020.0002] # BRAILLE PATTERN DOTS-123568 +28B8 ; [*0E30.0020.0002] # BRAILLE PATTERN DOTS-4568 +28B9 ; [*0E31.0020.0002] # BRAILLE PATTERN DOTS-14568 +28BA ; [*0E32.0020.0002] # BRAILLE PATTERN DOTS-24568 +28BB ; [*0E33.0020.0002] # BRAILLE PATTERN DOTS-124568 +28BC ; [*0E34.0020.0002] # BRAILLE PATTERN DOTS-34568 +28BD ; [*0E35.0020.0002] # BRAILLE PATTERN DOTS-134568 +28BE ; [*0E36.0020.0002] # BRAILLE PATTERN DOTS-234568 +28BF ; [*0E37.0020.0002] # BRAILLE PATTERN DOTS-1234568 +28C0 ; [*0E38.0020.0002] # BRAILLE PATTERN DOTS-78 +28C1 ; [*0E39.0020.0002] # BRAILLE PATTERN DOTS-178 +28C2 ; [*0E3A.0020.0002] # BRAILLE PATTERN DOTS-278 +28C3 ; [*0E3B.0020.0002] # BRAILLE PATTERN DOTS-1278 +28C4 ; [*0E3C.0020.0002] # BRAILLE PATTERN DOTS-378 +28C5 ; [*0E3D.0020.0002] # BRAILLE PATTERN DOTS-1378 +28C6 ; [*0E3E.0020.0002] # BRAILLE PATTERN DOTS-2378 +28C7 ; [*0E3F.0020.0002] # BRAILLE PATTERN DOTS-12378 +28C8 ; [*0E40.0020.0002] # BRAILLE PATTERN DOTS-478 +28C9 ; [*0E41.0020.0002] # BRAILLE PATTERN DOTS-1478 +28CA ; [*0E42.0020.0002] # BRAILLE PATTERN DOTS-2478 +28CB ; [*0E43.0020.0002] # BRAILLE PATTERN DOTS-12478 +28CC ; [*0E44.0020.0002] # BRAILLE PATTERN DOTS-3478 +28CD ; [*0E45.0020.0002] # BRAILLE PATTERN DOTS-13478 +28CE ; [*0E46.0020.0002] # BRAILLE PATTERN DOTS-23478 +28CF ; [*0E47.0020.0002] # BRAILLE PATTERN DOTS-123478 +28D0 ; [*0E48.0020.0002] # BRAILLE PATTERN DOTS-578 +28D1 ; [*0E49.0020.0002] # BRAILLE PATTERN DOTS-1578 +28D2 ; [*0E4A.0020.0002] # BRAILLE PATTERN DOTS-2578 +28D3 ; [*0E4B.0020.0002] # BRAILLE PATTERN DOTS-12578 +28D4 ; [*0E4C.0020.0002] # BRAILLE PATTERN DOTS-3578 +28D5 ; [*0E4D.0020.0002] # BRAILLE PATTERN DOTS-13578 +28D6 ; [*0E4E.0020.0002] # BRAILLE PATTERN DOTS-23578 +28D7 ; [*0E4F.0020.0002] # BRAILLE PATTERN DOTS-123578 +28D8 ; [*0E50.0020.0002] # BRAILLE PATTERN DOTS-4578 +28D9 ; [*0E51.0020.0002] # BRAILLE PATTERN DOTS-14578 +28DA ; [*0E52.0020.0002] # BRAILLE PATTERN DOTS-24578 +28DB ; [*0E53.0020.0002] # BRAILLE PATTERN DOTS-124578 +28DC ; [*0E54.0020.0002] # BRAILLE PATTERN DOTS-34578 +28DD ; [*0E55.0020.0002] # BRAILLE PATTERN DOTS-134578 +28DE ; [*0E56.0020.0002] # BRAILLE PATTERN DOTS-234578 +28DF ; [*0E57.0020.0002] # BRAILLE PATTERN DOTS-1234578 +28E0 ; [*0E58.0020.0002] # BRAILLE PATTERN DOTS-678 +28E1 ; [*0E59.0020.0002] # BRAILLE PATTERN DOTS-1678 +28E2 ; [*0E5A.0020.0002] # BRAILLE PATTERN DOTS-2678 +28E3 ; [*0E5B.0020.0002] # BRAILLE PATTERN DOTS-12678 +28E4 ; [*0E5C.0020.0002] # BRAILLE PATTERN DOTS-3678 +28E5 ; [*0E5D.0020.0002] # BRAILLE PATTERN DOTS-13678 +28E6 ; [*0E5E.0020.0002] # BRAILLE PATTERN DOTS-23678 +28E7 ; [*0E5F.0020.0002] # BRAILLE PATTERN DOTS-123678 +28E8 ; [*0E60.0020.0002] # BRAILLE PATTERN DOTS-4678 +28E9 ; [*0E61.0020.0002] # BRAILLE PATTERN DOTS-14678 +28EA ; [*0E62.0020.0002] # BRAILLE PATTERN DOTS-24678 +28EB ; [*0E63.0020.0002] # BRAILLE PATTERN DOTS-124678 +28EC ; [*0E64.0020.0002] # BRAILLE PATTERN DOTS-34678 +28ED ; [*0E65.0020.0002] # BRAILLE PATTERN DOTS-134678 +28EE ; [*0E66.0020.0002] # BRAILLE PATTERN DOTS-234678 +28EF ; [*0E67.0020.0002] # BRAILLE PATTERN DOTS-1234678 +28F0 ; [*0E68.0020.0002] # BRAILLE PATTERN DOTS-5678 +28F1 ; [*0E69.0020.0002] # BRAILLE PATTERN DOTS-15678 +28F2 ; [*0E6A.0020.0002] # BRAILLE PATTERN DOTS-25678 +28F3 ; [*0E6B.0020.0002] # BRAILLE PATTERN DOTS-125678 +28F4 ; [*0E6C.0020.0002] # BRAILLE PATTERN DOTS-35678 +28F5 ; [*0E6D.0020.0002] # BRAILLE PATTERN DOTS-135678 +28F6 ; [*0E6E.0020.0002] # BRAILLE PATTERN DOTS-235678 +28F7 ; [*0E6F.0020.0002] # BRAILLE PATTERN DOTS-1235678 +28F8 ; [*0E70.0020.0002] # BRAILLE PATTERN DOTS-45678 +28F9 ; [*0E71.0020.0002] # BRAILLE PATTERN DOTS-145678 +28FA ; [*0E72.0020.0002] # BRAILLE PATTERN DOTS-245678 +28FB ; [*0E73.0020.0002] # BRAILLE PATTERN DOTS-1245678 +28FC ; [*0E74.0020.0002] # BRAILLE PATTERN DOTS-345678 +28FD ; [*0E75.0020.0002] # BRAILLE PATTERN DOTS-1345678 +28FE ; [*0E76.0020.0002] # BRAILLE PATTERN DOTS-2345678 +28FF ; [*0E77.0020.0002] # BRAILLE PATTERN DOTS-12345678 +2900 ; [*0AC5.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2901 ; [*0AC6.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2902 ; [*0AC7.0020.0002] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2903 ; [*0AC8.0020.0002] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2904 ; [*0AC9.0020.0002] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +2905 ; [*0ACA.0020.0002] # RIGHTWARDS TWO-HEADED ARROW FROM BAR +2906 ; [*0ACB.0020.0002] # LEFTWARDS DOUBLE ARROW FROM BAR +2907 ; [*0ACC.0020.0002] # RIGHTWARDS DOUBLE ARROW FROM BAR +2908 ; [*0ACD.0020.0002] # DOWNWARDS ARROW WITH HORIZONTAL STROKE +2909 ; [*0ACE.0020.0002] # UPWARDS ARROW WITH HORIZONTAL STROKE +290A ; [*0ACF.0020.0002] # UPWARDS TRIPLE ARROW +290B ; [*0AD0.0020.0002] # DOWNWARDS TRIPLE ARROW +290C ; [*0AD1.0020.0002] # LEFTWARDS DOUBLE DASH ARROW +290D ; [*0AD2.0020.0002] # RIGHTWARDS DOUBLE DASH ARROW +290E ; [*0AD3.0020.0002] # LEFTWARDS TRIPLE DASH ARROW +290F ; [*0AD4.0020.0002] # RIGHTWARDS TRIPLE DASH ARROW +2910 ; [*0AD5.0020.0002] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +2911 ; [*0AD6.0020.0002] # RIGHTWARDS ARROW WITH DOTTED STEM +2912 ; [*0AD7.0020.0002] # UPWARDS ARROW TO BAR +2913 ; [*0AD8.0020.0002] # DOWNWARDS ARROW TO BAR +2914 ; [*0AD9.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2915 ; [*0ADA.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2916 ; [*0ADB.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL +2917 ; [*0ADC.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2918 ; [*0ADD.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2919 ; [*0ADE.0020.0002] # LEFTWARDS ARROW-TAIL +291A ; [*0ADF.0020.0002] # RIGHTWARDS ARROW-TAIL +291B ; [*0AE0.0020.0002] # LEFTWARDS DOUBLE ARROW-TAIL +291C ; [*0AE1.0020.0002] # RIGHTWARDS DOUBLE ARROW-TAIL +291D ; [*0AE2.0020.0002] # LEFTWARDS ARROW TO BLACK DIAMOND +291E ; [*0AE3.0020.0002] # RIGHTWARDS ARROW TO BLACK DIAMOND +291F ; [*0AE4.0020.0002] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +2920 ; [*0AE5.0020.0002] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +2921 ; [*0AE6.0020.0002] # NORTH WEST AND SOUTH EAST ARROW +2922 ; [*0AE7.0020.0002] # NORTH EAST AND SOUTH WEST ARROW +2923 ; [*0AE8.0020.0002] # NORTH WEST ARROW WITH HOOK +2924 ; [*0AE9.0020.0002] # NORTH EAST ARROW WITH HOOK +2925 ; [*0AEA.0020.0002] # SOUTH EAST ARROW WITH HOOK +2926 ; [*0AEB.0020.0002] # SOUTH WEST ARROW WITH HOOK +2927 ; [*0AEC.0020.0002] # NORTH WEST ARROW AND NORTH EAST ARROW +2928 ; [*0AED.0020.0002] # NORTH EAST ARROW AND SOUTH EAST ARROW +2929 ; [*0AEE.0020.0002] # SOUTH EAST ARROW AND SOUTH WEST ARROW +292A ; [*0AEF.0020.0002] # SOUTH WEST ARROW AND NORTH WEST ARROW +292B ; [*0AF0.0020.0002] # RISING DIAGONAL CROSSING FALLING DIAGONAL +292C ; [*0AF1.0020.0002] # FALLING DIAGONAL CROSSING RISING DIAGONAL +292D ; [*0AF2.0020.0002] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW +292E ; [*0AF3.0020.0002] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW +292F ; [*0AF4.0020.0002] # FALLING DIAGONAL CROSSING NORTH EAST ARROW +2930 ; [*0AF5.0020.0002] # RISING DIAGONAL CROSSING SOUTH EAST ARROW +2931 ; [*0AF6.0020.0002] # NORTH EAST ARROW CROSSING NORTH WEST ARROW +2932 ; [*0AF7.0020.0002] # NORTH WEST ARROW CROSSING NORTH EAST ARROW +2933 ; [*0AF8.0020.0002] # WAVE ARROW POINTING DIRECTLY RIGHT +2934 ; [*0AF9.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS +2935 ; [*0AFA.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +2936 ; [*0AFB.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +2937 ; [*0AFC.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +2938 ; [*0AFD.0020.0002] # RIGHT-SIDE ARC CLOCKWISE ARROW +2939 ; [*0AFE.0020.0002] # LEFT-SIDE ARC ANTICLOCKWISE ARROW +293A ; [*0AFF.0020.0002] # TOP ARC ANTICLOCKWISE ARROW +293B ; [*0B00.0020.0002] # BOTTOM ARC ANTICLOCKWISE ARROW +293C ; [*0B01.0020.0002] # TOP ARC CLOCKWISE ARROW WITH MINUS +293D ; [*0B02.0020.0002] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS +293E ; [*0B03.0020.0002] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW +293F ; [*0B04.0020.0002] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW +2940 ; [*0B05.0020.0002] # ANTICLOCKWISE CLOSED CIRCLE ARROW +2941 ; [*0B06.0020.0002] # CLOCKWISE CLOSED CIRCLE ARROW +2942 ; [*0B07.0020.0002] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW +2943 ; [*0B08.0020.0002] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW +2944 ; [*0B09.0020.0002] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW +2945 ; [*0B0A.0020.0002] # RIGHTWARDS ARROW WITH PLUS BELOW +2946 ; [*0B0B.0020.0002] # LEFTWARDS ARROW WITH PLUS BELOW +2947 ; [*0B0C.0020.0002] # RIGHTWARDS ARROW THROUGH X +2948 ; [*0B0D.0020.0002] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE +2949 ; [*0B0E.0020.0002] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +294A ; [*0B0F.0020.0002] # LEFT BARB UP RIGHT BARB DOWN HARPOON +294B ; [*0B10.0020.0002] # LEFT BARB DOWN RIGHT BARB UP HARPOON +294C ; [*0B11.0020.0002] # UP BARB RIGHT DOWN BARB LEFT HARPOON +294D ; [*0B12.0020.0002] # UP BARB LEFT DOWN BARB RIGHT HARPOON +294E ; [*0B13.0020.0002] # LEFT BARB UP RIGHT BARB UP HARPOON +294F ; [*0B14.0020.0002] # UP BARB RIGHT DOWN BARB RIGHT HARPOON +2950 ; [*0B15.0020.0002] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON +2951 ; [*0B16.0020.0002] # UP BARB LEFT DOWN BARB LEFT HARPOON +2952 ; [*0B17.0020.0002] # LEFTWARDS HARPOON WITH BARB UP TO BAR +2953 ; [*0B18.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP TO BAR +2954 ; [*0B19.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT TO BAR +2955 ; [*0B1A.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +2956 ; [*0B1B.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR +2957 ; [*0B1C.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +2958 ; [*0B1D.0020.0002] # UPWARDS HARPOON WITH BARB LEFT TO BAR +2959 ; [*0B1E.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR +295A ; [*0B1F.0020.0002] # LEFTWARDS HARPOON WITH BARB UP FROM BAR +295B ; [*0B20.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR +295C ; [*0B21.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR +295D ; [*0B22.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +295E ; [*0B23.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +295F ; [*0B24.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +2960 ; [*0B25.0020.0002] # UPWARDS HARPOON WITH BARB LEFT FROM BAR +2961 ; [*0B26.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +2962 ; [*0B27.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +2963 ; [*0B28.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2964 ; [*0B29.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2965 ; [*0B2A.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +2966 ; [*0B2B.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +2967 ; [*0B2C.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2968 ; [*0B2D.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +2969 ; [*0B2E.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +296A ; [*0B2F.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296B ; [*0B30.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296C ; [*0B31.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296D ; [*0B32.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296E ; [*0B33.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +296F ; [*0B34.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2970 ; [*0B35.0020.0002] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD +2971 ; [*0B36.0020.0002] # EQUALS SIGN ABOVE RIGHTWARDS ARROW +2972 ; [*0B37.0020.0002] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2973 ; [*0B38.0020.0002] # LEFTWARDS ARROW ABOVE TILDE OPERATOR +2974 ; [*0B39.0020.0002] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR +2975 ; [*0B3A.0020.0002] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +2976 ; [*0B3B.0020.0002] # LESS-THAN ABOVE LEFTWARDS ARROW +2977 ; [*0B3C.0020.0002] # LEFTWARDS ARROW THROUGH LESS-THAN +2978 ; [*0B3D.0020.0002] # GREATER-THAN ABOVE RIGHTWARDS ARROW +2979 ; [*0B3E.0020.0002] # SUBSET ABOVE RIGHTWARDS ARROW +297A ; [*0B3F.0020.0002] # LEFTWARDS ARROW THROUGH SUBSET +297B ; [*0B40.0020.0002] # SUPERSET ABOVE LEFTWARDS ARROW +297C ; [*0B41.0020.0002] # LEFT FISH TAIL +297D ; [*0B42.0020.0002] # RIGHT FISH TAIL +297E ; [*0B43.0020.0002] # UP FISH TAIL +297F ; [*0B44.0020.0002] # DOWN FISH TAIL +2980 ; [*0B45.0020.0002] # TRIPLE VERTICAL BAR DELIMITER +2981 ; [*0B46.0020.0002] # Z NOTATION SPOT +2982 ; [*0B47.0020.0002] # Z NOTATION TYPE COLON +2983 ; [*0324.0020.0002] # LEFT WHITE CURLY BRACKET +2984 ; [*0325.0020.0002] # RIGHT WHITE CURLY BRACKET +2985 ; [*0326.0020.0002] # LEFT WHITE PARENTHESIS +2986 ; [*0327.0020.0002] # RIGHT WHITE PARENTHESIS +2987 ; [*0328.0020.0002] # Z NOTATION LEFT IMAGE BRACKET +2988 ; [*0329.0020.0002] # Z NOTATION RIGHT IMAGE BRACKET +2989 ; [*032A.0020.0002] # Z NOTATION LEFT BINDING BRACKET +298A ; [*032B.0020.0002] # Z NOTATION RIGHT BINDING BRACKET +298B ; [*032C.0020.0002] # LEFT SQUARE BRACKET WITH UNDERBAR +298C ; [*032D.0020.0002] # RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; [*032E.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; [*032F.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; [*0330.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; [*0331.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; [*0332.0020.0002] # LEFT ANGLE BRACKET WITH DOT +2992 ; [*0333.0020.0002] # RIGHT ANGLE BRACKET WITH DOT +2993 ; [*0334.0020.0002] # LEFT ARC LESS-THAN BRACKET +2994 ; [*0335.0020.0002] # RIGHT ARC GREATER-THAN BRACKET +2995 ; [*0336.0020.0002] # DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; [*0337.0020.0002] # DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; [*0338.0020.0002] # LEFT BLACK TORTOISE SHELL BRACKET +2998 ; [*0339.0020.0002] # RIGHT BLACK TORTOISE SHELL BRACKET +2999 ; [*0B48.0020.0002] # DOTTED FENCE +299A ; [*0B49.0020.0002] # VERTICAL ZIGZAG LINE +299B ; [*0B4A.0020.0002] # MEASURED ANGLE OPENING LEFT +299C ; [*0B4B.0020.0002] # RIGHT ANGLE VARIANT WITH SQUARE +299D ; [*0B4C.0020.0002] # MEASURED RIGHT ANGLE WITH DOT +299E ; [*0B4D.0020.0002] # ANGLE WITH S INSIDE +299F ; [*0B4E.0020.0002] # ACUTE ANGLE +29A0 ; [*0B4F.0020.0002] # SPHERICAL ANGLE OPENING LEFT +29A1 ; [*0B50.0020.0002] # SPHERICAL ANGLE OPENING UP +29A2 ; [*0B51.0020.0002] # TURNED ANGLE +29A3 ; [*0B52.0020.0002] # REVERSED ANGLE +29A4 ; [*0B53.0020.0002] # ANGLE WITH UNDERBAR +29A5 ; [*0B54.0020.0002] # REVERSED ANGLE WITH UNDERBAR +29A6 ; [*0B55.0020.0002] # OBLIQUE ANGLE OPENING UP +29A7 ; [*0B56.0020.0002] # OBLIQUE ANGLE OPENING DOWN +29A8 ; [*0B57.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +29A9 ; [*0B58.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +29AA ; [*0B59.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +29AB ; [*0B5A.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +29AC ; [*0B5B.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +29AD ; [*0B5C.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +29AE ; [*0B5D.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +29AF ; [*0B5E.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +29B0 ; [*0B5F.0020.0002] # REVERSED EMPTY SET +29B1 ; [*0B60.0020.0002] # EMPTY SET WITH OVERBAR +29B2 ; [*0B61.0020.0002] # EMPTY SET WITH SMALL CIRCLE ABOVE +29B3 ; [*0B62.0020.0002] # EMPTY SET WITH RIGHT ARROW ABOVE +29B4 ; [*0B63.0020.0002] # EMPTY SET WITH LEFT ARROW ABOVE +29B5 ; [*0B64.0020.0002] # CIRCLE WITH HORIZONTAL BAR +29B6 ; [*0B65.0020.0002] # CIRCLED VERTICAL BAR +29B7 ; [*0B66.0020.0002] # CIRCLED PARALLEL +29B8 ; [*0B67.0020.0002] # CIRCLED REVERSE SOLIDUS +29B9 ; [*0B68.0020.0002] # CIRCLED PERPENDICULAR +29BA ; [*0B69.0020.0002] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR +29BB ; [*0B6A.0020.0002] # CIRCLE WITH SUPERIMPOSED X +29BC ; [*0B6B.0020.0002] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +29BD ; [*0B6C.0020.0002] # UP ARROW THROUGH CIRCLE +29BE ; [*0B6D.0020.0002] # CIRCLED WHITE BULLET +29BF ; [*0B6E.0020.0002] # CIRCLED BULLET +29C0 ; [*0B6F.0020.0002] # CIRCLED LESS-THAN +29C1 ; [*0B70.0020.0002] # CIRCLED GREATER-THAN +29C2 ; [*0B71.0020.0002] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT +29C3 ; [*0B72.0020.0002] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +29C4 ; [*0B73.0020.0002] # SQUARED RISING DIAGONAL SLASH +29C5 ; [*0B74.0020.0002] # SQUARED FALLING DIAGONAL SLASH +29C6 ; [*0B75.0020.0002] # SQUARED ASTERISK +29C7 ; [*0B76.0020.0002] # SQUARED SMALL CIRCLE +29C8 ; [*0B77.0020.0002] # SQUARED SQUARE +29C9 ; [*0B78.0020.0002] # TWO JOINED SQUARES +29CA ; [*0B79.0020.0002] # TRIANGLE WITH DOT ABOVE +29CB ; [*0B7A.0020.0002] # TRIANGLE WITH UNDERBAR +29CC ; [*0B7B.0020.0002] # S IN TRIANGLE +29CD ; [*0B7C.0020.0002] # TRIANGLE WITH SERIFS AT BOTTOM +29CE ; [*0B7D.0020.0002] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE +29CF ; [*0B7E.0020.0002] # LEFT TRIANGLE BESIDE VERTICAL BAR +29D0 ; [*0B7F.0020.0002] # VERTICAL BAR BESIDE RIGHT TRIANGLE +29D1 ; [*0B80.0020.0002] # BOWTIE WITH LEFT HALF BLACK +29D2 ; [*0B81.0020.0002] # BOWTIE WITH RIGHT HALF BLACK +29D3 ; [*0B82.0020.0002] # BLACK BOWTIE +29D4 ; [*0B83.0020.0002] # TIMES WITH LEFT HALF BLACK +29D5 ; [*0B84.0020.0002] # TIMES WITH RIGHT HALF BLACK +29D6 ; [*0B85.0020.0002] # WHITE HOURGLASS +29D7 ; [*0B86.0020.0002] # BLACK HOURGLASS +29D8 ; [*037E.0020.0002] # LEFT WIGGLY FENCE +29D9 ; [*037F.0020.0002] # RIGHT WIGGLY FENCE +29DA ; [*0380.0020.0002] # LEFT DOUBLE WIGGLY FENCE +29DB ; [*0381.0020.0002] # RIGHT DOUBLE WIGGLY FENCE +29DC ; [*0B87.0020.0002] # INCOMPLETE INFINITY +29DD ; [*0B88.0020.0002] # TIE OVER INFINITY +29DE ; [*0B89.0020.0002] # INFINITY NEGATED WITH VERTICAL BAR +29DF ; [*0B8A.0020.0002] # DOUBLE-ENDED MULTIMAP +29E0 ; [*0B8B.0020.0002] # SQUARE WITH CONTOURED OUTLINE +29E1 ; [*0B8C.0020.0002] # INCREASES AS +29E2 ; [*0B8D.0020.0002] # SHUFFLE PRODUCT +29E3 ; [*0B8E.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL +29E4 ; [*0B8F.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +29E5 ; [*0B90.0020.0002] # IDENTICAL TO AND SLANTED PARALLEL +29E6 ; [*0B91.0020.0002] # GLEICH STARK +29E7 ; [*0B92.0020.0002] # THERMODYNAMIC +29E8 ; [*0B93.0020.0002] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +29E9 ; [*0B94.0020.0002] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +29EA ; [*0B95.0020.0002] # BLACK DIAMOND WITH DOWN ARROW +29EB ; [*0B96.0020.0002] # BLACK LOZENGE +29EC ; [*0B97.0020.0002] # WHITE CIRCLE WITH DOWN ARROW +29ED ; [*0B98.0020.0002] # BLACK CIRCLE WITH DOWN ARROW +29EE ; [*0B99.0020.0002] # ERROR-BARRED WHITE SQUARE +29EF ; [*0B9A.0020.0002] # ERROR-BARRED BLACK SQUARE +29F0 ; [*0B9B.0020.0002] # ERROR-BARRED WHITE DIAMOND +29F1 ; [*0B9C.0020.0002] # ERROR-BARRED BLACK DIAMOND +29F2 ; [*0B9D.0020.0002] # ERROR-BARRED WHITE CIRCLE +29F3 ; [*0B9E.0020.0002] # ERROR-BARRED BLACK CIRCLE +29F4 ; [*0B9F.0020.0002] # RULE-DELAYED +29F5 ; [*0BA0.0020.0002] # REVERSE SOLIDUS OPERATOR +29F6 ; [*0BA1.0020.0002] # SOLIDUS WITH OVERBAR +29F7 ; [*0BA2.0020.0002] # REVERSE SOLIDUS WITH HORIZONTAL STROKE +29F8 ; [*0BA3.0020.0002] # BIG SOLIDUS +29F9 ; [*0BA4.0020.0002] # BIG REVERSE SOLIDUS +29FA ; [*0BA5.0020.0002] # DOUBLE PLUS +29FB ; [*0BA6.0020.0002] # TRIPLE PLUS +29FC ; [*0322.0020.0002] # LEFT-POINTING CURVED ANGLE BRACKET +29FD ; [*0323.0020.0002] # RIGHT-POINTING CURVED ANGLE BRACKET +29FE ; [*0BA7.0020.0002] # TINY +29FF ; [*0BA8.0020.0002] # MINY +2A00 ; [*0BA9.0020.0002] # N-ARY CIRCLED DOT OPERATOR +2A01 ; [*0BAA.0020.0002] # N-ARY CIRCLED PLUS OPERATOR +2A02 ; [*0BAB.0020.0002] # N-ARY CIRCLED TIMES OPERATOR +2A03 ; [*0BAC.0020.0002] # N-ARY UNION OPERATOR WITH DOT +2A04 ; [*0BAD.0020.0002] # N-ARY UNION OPERATOR WITH PLUS +2A05 ; [*0BAE.0020.0002] # N-ARY SQUARE INTERSECTION OPERATOR +2A06 ; [*0BAF.0020.0002] # N-ARY SQUARE UNION OPERATOR +2A07 ; [*0BB0.0020.0002] # TWO LOGICAL AND OPERATOR +2A08 ; [*0BB1.0020.0002] # TWO LOGICAL OR OPERATOR +2A09 ; [*0BB2.0020.0002] # N-ARY TIMES OPERATOR +2A0A ; [*0BB3.0020.0002] # MODULO TWO SUM +2A0B ; [*0BB4.0020.0002] # SUMMATION WITH INTEGRAL +2A0C ; [*061C.0020.0004][*061C.0020.0004][*061C.0020.0004][*061C.0020.0004] # QUADRUPLE INTEGRAL OPERATOR +2A0D ; [*0BB5.0020.0002] # FINITE PART INTEGRAL +2A0E ; [*0BB6.0020.0002] # INTEGRAL WITH DOUBLE STROKE +2A0F ; [*0BB7.0020.0002] # INTEGRAL AVERAGE WITH SLASH +2A10 ; [*0BB8.0020.0002] # CIRCULATION FUNCTION +2A11 ; [*0BB9.0020.0002] # ANTICLOCKWISE INTEGRATION +2A12 ; [*0BBA.0020.0002] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +2A13 ; [*0BBB.0020.0002] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +2A14 ; [*0BBC.0020.0002] # LINE INTEGRATION NOT INCLUDING THE POLE +2A15 ; [*0BBD.0020.0002] # INTEGRAL AROUND A POINT OPERATOR +2A16 ; [*0BBE.0020.0002] # QUATERNION INTEGRAL OPERATOR +2A17 ; [*0BBF.0020.0002] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +2A18 ; [*0BC0.0020.0002] # INTEGRAL WITH TIMES SIGN +2A19 ; [*0BC1.0020.0002] # INTEGRAL WITH INTERSECTION +2A1A ; [*0BC2.0020.0002] # INTEGRAL WITH UNION +2A1B ; [*0BC3.0020.0002] # INTEGRAL WITH OVERBAR +2A1C ; [*0BC4.0020.0002] # INTEGRAL WITH UNDERBAR +2A1D ; [*0BC5.0020.0002] # JOIN +2A1E ; [*0BC6.0020.0002] # LARGE LEFT TRIANGLE OPERATOR +2A1F ; [*0BC7.0020.0002] # Z NOTATION SCHEMA COMPOSITION +2A20 ; [*0BC8.0020.0002] # Z NOTATION SCHEMA PIPING +2A21 ; [*0BC9.0020.0002] # Z NOTATION SCHEMA PROJECTION +2A22 ; [*0BCA.0020.0002] # PLUS SIGN WITH SMALL CIRCLE ABOVE +2A23 ; [*0BCB.0020.0002] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +2A24 ; [*0BCC.0020.0002] # PLUS SIGN WITH TILDE ABOVE +2A25 ; [*0BCD.0020.0002] # PLUS SIGN WITH DOT BELOW +2A26 ; [*0BCE.0020.0002] # PLUS SIGN WITH TILDE BELOW +2A27 ; [*0BCF.0020.0002] # PLUS SIGN WITH SUBSCRIPT TWO +2A28 ; [*0BD0.0020.0002] # PLUS SIGN WITH BLACK TRIANGLE +2A29 ; [*0BD1.0020.0002] # MINUS SIGN WITH COMMA ABOVE +2A2A ; [*0BD2.0020.0002] # MINUS SIGN WITH DOT BELOW +2A2B ; [*0BD3.0020.0002] # MINUS SIGN WITH FALLING DOTS +2A2C ; [*0BD4.0020.0002] # MINUS SIGN WITH RISING DOTS +2A2D ; [*0BD5.0020.0002] # PLUS SIGN IN LEFT HALF CIRCLE +2A2E ; [*0BD6.0020.0002] # PLUS SIGN IN RIGHT HALF CIRCLE +2A2F ; [*0BD7.0020.0002] # VECTOR OR CROSS PRODUCT +2A30 ; [*0BD8.0020.0002] # MULTIPLICATION SIGN WITH DOT ABOVE +2A31 ; [*0BD9.0020.0002] # MULTIPLICATION SIGN WITH UNDERBAR +2A32 ; [*0BDA.0020.0002] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED +2A33 ; [*0BDB.0020.0002] # SMASH PRODUCT +2A34 ; [*0BDC.0020.0002] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35 ; [*0BDD.0020.0002] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A36 ; [*0BDE.0020.0002] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +2A37 ; [*0BDF.0020.0002] # MULTIPLICATION SIGN IN DOUBLE CIRCLE +2A38 ; [*0BE0.0020.0002] # CIRCLED DIVISION SIGN +2A39 ; [*0BE1.0020.0002] # PLUS SIGN IN TRIANGLE +2A3A ; [*0BE2.0020.0002] # MINUS SIGN IN TRIANGLE +2A3B ; [*0BE3.0020.0002] # MULTIPLICATION SIGN IN TRIANGLE +2A3C ; [*0BE4.0020.0002] # INTERIOR PRODUCT +2A3D ; [*0BE5.0020.0002] # RIGHTHAND INTERIOR PRODUCT +2A3E ; [*0BE6.0020.0002] # Z NOTATION RELATIONAL COMPOSITION +2A3F ; [*0BE7.0020.0002] # AMALGAMATION OR COPRODUCT +2A40 ; [*0BE8.0020.0002] # INTERSECTION WITH DOT +2A41 ; [*0BE9.0020.0002] # UNION WITH MINUS SIGN +2A42 ; [*0BEA.0020.0002] # UNION WITH OVERBAR +2A43 ; [*0BEB.0020.0002] # INTERSECTION WITH OVERBAR +2A44 ; [*0BEC.0020.0002] # INTERSECTION WITH LOGICAL AND +2A45 ; [*0BED.0020.0002] # UNION WITH LOGICAL OR +2A46 ; [*0BEE.0020.0002] # UNION ABOVE INTERSECTION +2A47 ; [*0BEF.0020.0002] # INTERSECTION ABOVE UNION +2A48 ; [*0BF0.0020.0002] # UNION ABOVE BAR ABOVE INTERSECTION +2A49 ; [*0BF1.0020.0002] # INTERSECTION ABOVE BAR ABOVE UNION +2A4A ; [*0BF2.0020.0002] # UNION BESIDE AND JOINED WITH UNION +2A4B ; [*0BF3.0020.0002] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION +2A4C ; [*0BF4.0020.0002] # CLOSED UNION WITH SERIFS +2A4D ; [*0BF5.0020.0002] # CLOSED INTERSECTION WITH SERIFS +2A4E ; [*0BF6.0020.0002] # DOUBLE SQUARE INTERSECTION +2A4F ; [*0BF7.0020.0002] # DOUBLE SQUARE UNION +2A50 ; [*0BF8.0020.0002] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT +2A51 ; [*0BF9.0020.0002] # LOGICAL AND WITH DOT ABOVE +2A52 ; [*0BFA.0020.0002] # LOGICAL OR WITH DOT ABOVE +2A53 ; [*0BFB.0020.0002] # DOUBLE LOGICAL AND +2A54 ; [*0BFC.0020.0002] # DOUBLE LOGICAL OR +2A55 ; [*0BFD.0020.0002] # TWO INTERSECTING LOGICAL AND +2A56 ; [*0BFE.0020.0002] # TWO INTERSECTING LOGICAL OR +2A57 ; [*0BFF.0020.0002] # SLOPING LARGE OR +2A58 ; [*0C00.0020.0002] # SLOPING LARGE AND +2A59 ; [*0C01.0020.0002] # LOGICAL OR OVERLAPPING LOGICAL AND +2A5A ; [*0C02.0020.0002] # LOGICAL AND WITH MIDDLE STEM +2A5B ; [*0C03.0020.0002] # LOGICAL OR WITH MIDDLE STEM +2A5C ; [*0C04.0020.0002] # LOGICAL AND WITH HORIZONTAL DASH +2A5D ; [*0C05.0020.0002] # LOGICAL OR WITH HORIZONTAL DASH +2A5E ; [*0C06.0020.0002] # LOGICAL AND WITH DOUBLE OVERBAR +2A5F ; [*0C07.0020.0002] # LOGICAL AND WITH UNDERBAR +2A60 ; [*0C08.0020.0002] # LOGICAL AND WITH DOUBLE UNDERBAR +2A61 ; [*0C09.0020.0002] # SMALL VEE WITH UNDERBAR +2A62 ; [*0C0A.0020.0002] # LOGICAL OR WITH DOUBLE OVERBAR +2A63 ; [*0C0B.0020.0002] # LOGICAL OR WITH DOUBLE UNDERBAR +2A64 ; [*0C0C.0020.0002] # Z NOTATION DOMAIN ANTIRESTRICTION +2A65 ; [*0C0D.0020.0002] # Z NOTATION RANGE ANTIRESTRICTION +2A66 ; [*0C0E.0020.0002] # EQUALS SIGN WITH DOT BELOW +2A67 ; [*0C0F.0020.0002] # IDENTICAL WITH DOT ABOVE +2A68 ; [*0C10.0020.0002] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE +2A69 ; [*0C11.0020.0002] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE +2A6A ; [*0C12.0020.0002] # TILDE OPERATOR WITH DOT ABOVE +2A6B ; [*0C13.0020.0002] # TILDE OPERATOR WITH RISING DOTS +2A6C ; [*0C14.0020.0002] # SIMILAR MINUS SIMILAR +2A6D ; [*0C15.0020.0002] # CONGRUENT WITH DOT ABOVE +2A6E ; [*0C16.0020.0002] # EQUALS WITH ASTERISK +2A6F ; [*0C17.0020.0002] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +2A70 ; [*0C18.0020.0002] # APPROXIMATELY EQUAL OR EQUAL TO +2A71 ; [*0C19.0020.0002] # EQUALS SIGN ABOVE PLUS SIGN +2A72 ; [*0C1A.0020.0002] # PLUS SIGN ABOVE EQUALS SIGN +2A73 ; [*0C1B.0020.0002] # EQUALS SIGN ABOVE TILDE OPERATOR +2A74 ; [*0238.0020.0004][*0238.0020.0004][*05FB.0020.0004] # DOUBLE COLON EQUAL +2A75 ; [*05FB.0020.0004][*05FB.0020.0004] # TWO CONSECUTIVE EQUALS SIGNS +2A76 ; [*05FB.0020.0004][*05FB.0020.0004][*05FB.0020.0004] # THREE CONSECUTIVE EQUALS SIGNS +2A77 ; [*0C1C.0020.0002] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +2A78 ; [*0C1D.0020.0002] # EQUIVALENT WITH FOUR DOTS ABOVE +2A79 ; [*0C1E.0020.0002] # LESS-THAN WITH CIRCLE INSIDE +2A7A ; [*0C1F.0020.0002] # GREATER-THAN WITH CIRCLE INSIDE +2A7B ; [*0C20.0020.0002] # LESS-THAN WITH QUESTION MARK ABOVE +2A7C ; [*0C21.0020.0002] # GREATER-THAN WITH QUESTION MARK ABOVE +2A7D ; [*0C22.0020.0002] # LESS-THAN OR SLANTED EQUAL TO +2A7E ; [*0C23.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO +2A7F ; [*0C24.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80 ; [*0C25.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81 ; [*0C26.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82 ; [*0C27.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83 ; [*0C28.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84 ; [*0C29.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A85 ; [*0C2A.0020.0002] # LESS-THAN OR APPROXIMATE +2A86 ; [*0C2B.0020.0002] # GREATER-THAN OR APPROXIMATE +2A87 ; [*0C2C.0020.0002] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO +2A88 ; [*0C2D.0020.0002] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +2A89 ; [*0C2E.0020.0002] # LESS-THAN AND NOT APPROXIMATE +2A8A ; [*0C2F.0020.0002] # GREATER-THAN AND NOT APPROXIMATE +2A8B ; [*0C30.0020.0002] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +2A8C ; [*0C31.0020.0002] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +2A8D ; [*0C32.0020.0002] # LESS-THAN ABOVE SIMILAR OR EQUAL +2A8E ; [*0C33.0020.0002] # GREATER-THAN ABOVE SIMILAR OR EQUAL +2A8F ; [*0C34.0020.0002] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +2A90 ; [*0C35.0020.0002] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +2A91 ; [*0C36.0020.0002] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92 ; [*0C37.0020.0002] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93 ; [*0C38.0020.0002] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94 ; [*0C39.0020.0002] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95 ; [*0C3A.0020.0002] # SLANTED EQUAL TO OR LESS-THAN +2A96 ; [*0C3B.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN +2A97 ; [*0C3C.0020.0002] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98 ; [*0C3D.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99 ; [*0C3E.0020.0002] # DOUBLE-LINE EQUAL TO OR LESS-THAN +2A9A ; [*0C3F.0020.0002] # DOUBLE-LINE EQUAL TO OR GREATER-THAN +2A9B ; [*0C40.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C ; [*0C41.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2A9D ; [*0C42.0020.0002] # SIMILAR OR LESS-THAN +2A9E ; [*0C43.0020.0002] # SIMILAR OR GREATER-THAN +2A9F ; [*0C44.0020.0002] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +2AA0 ; [*0C45.0020.0002] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +2AA1 ; [*0C46.0020.0002] # DOUBLE NESTED LESS-THAN +2AA2 ; [*0C47.0020.0002] # DOUBLE NESTED GREATER-THAN +2AA3 ; [*0C48.0020.0002] # DOUBLE NESTED LESS-THAN WITH UNDERBAR +2AA4 ; [*0C49.0020.0002] # GREATER-THAN OVERLAPPING LESS-THAN +2AA5 ; [*0C4A.0020.0002] # GREATER-THAN BESIDE LESS-THAN +2AA6 ; [*0C4B.0020.0002] # LESS-THAN CLOSED BY CURVE +2AA7 ; [*0C4C.0020.0002] # GREATER-THAN CLOSED BY CURVE +2AA8 ; [*0C4D.0020.0002] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9 ; [*0C4E.0020.0002] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA ; [*0C4F.0020.0002] # SMALLER THAN +2AAB ; [*0C50.0020.0002] # LARGER THAN +2AAC ; [*0C51.0020.0002] # SMALLER THAN OR EQUAL TO +2AAD ; [*0C52.0020.0002] # LARGER THAN OR EQUAL TO +2AAE ; [*0C53.0020.0002] # EQUALS SIGN WITH BUMPY ABOVE +2AAF ; [*0C54.0020.0002] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +2AB0 ; [*0C55.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +2AB1 ; [*0C56.0020.0002] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +2AB2 ; [*0C57.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +2AB3 ; [*0C58.0020.0002] # PRECEDES ABOVE EQUALS SIGN +2AB4 ; [*0C59.0020.0002] # SUCCEEDS ABOVE EQUALS SIGN +2AB5 ; [*0C5A.0020.0002] # PRECEDES ABOVE NOT EQUAL TO +2AB6 ; [*0C5B.0020.0002] # SUCCEEDS ABOVE NOT EQUAL TO +2AB7 ; [*0C5C.0020.0002] # PRECEDES ABOVE ALMOST EQUAL TO +2AB8 ; [*0C5D.0020.0002] # SUCCEEDS ABOVE ALMOST EQUAL TO +2AB9 ; [*0C5E.0020.0002] # PRECEDES ABOVE NOT ALMOST EQUAL TO +2ABA ; [*0C5F.0020.0002] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO +2ABB ; [*0C60.0020.0002] # DOUBLE PRECEDES +2ABC ; [*0C61.0020.0002] # DOUBLE SUCCEEDS +2ABD ; [*0C62.0020.0002] # SUBSET WITH DOT +2ABE ; [*0C63.0020.0002] # SUPERSET WITH DOT +2ABF ; [*0C64.0020.0002] # SUBSET WITH PLUS SIGN BELOW +2AC0 ; [*0C65.0020.0002] # SUPERSET WITH PLUS SIGN BELOW +2AC1 ; [*0C66.0020.0002] # SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2 ; [*0C67.0020.0002] # SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3 ; [*0C68.0020.0002] # SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4 ; [*0C69.0020.0002] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5 ; [*0C6A.0020.0002] # SUBSET OF ABOVE EQUALS SIGN +2AC6 ; [*0C6B.0020.0002] # SUPERSET OF ABOVE EQUALS SIGN +2AC7 ; [*0C6C.0020.0002] # SUBSET OF ABOVE TILDE OPERATOR +2AC8 ; [*0C6D.0020.0002] # SUPERSET OF ABOVE TILDE OPERATOR +2AC9 ; [*0C6E.0020.0002] # SUBSET OF ABOVE ALMOST EQUAL TO +2ACA ; [*0C6F.0020.0002] # SUPERSET OF ABOVE ALMOST EQUAL TO +2ACB ; [*0C70.0020.0002] # SUBSET OF ABOVE NOT EQUAL TO +2ACC ; [*0C71.0020.0002] # SUPERSET OF ABOVE NOT EQUAL TO +2ACD ; [*0C72.0020.0002] # SQUARE LEFT OPEN BOX OPERATOR +2ACE ; [*0C73.0020.0002] # SQUARE RIGHT OPEN BOX OPERATOR +2ACF ; [*0C74.0020.0002] # CLOSED SUBSET +2AD0 ; [*0C75.0020.0002] # CLOSED SUPERSET +2AD1 ; [*0C76.0020.0002] # CLOSED SUBSET OR EQUAL TO +2AD2 ; [*0C77.0020.0002] # CLOSED SUPERSET OR EQUAL TO +2AD3 ; [*0C78.0020.0002] # SUBSET ABOVE SUPERSET +2AD4 ; [*0C79.0020.0002] # SUPERSET ABOVE SUBSET +2AD5 ; [*0C7A.0020.0002] # SUBSET ABOVE SUBSET +2AD6 ; [*0C7B.0020.0002] # SUPERSET ABOVE SUPERSET +2AD7 ; [*0C7C.0020.0002] # SUPERSET BESIDE SUBSET +2AD8 ; [*0C7D.0020.0002] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +2AD9 ; [*0C7E.0020.0002] # ELEMENT OF OPENING DOWNWARDS +2ADA ; [*0C7F.0020.0002] # PITCHFORK WITH TEE TOP +2ADB ; [*0C80.0020.0002] # TRANSVERSAL INTERSECTION +2ADC ; [*0C81.0020.0002][.0000.002F.0002] # FORKING +2ADD ; [*0C81.0020.0002] # NONFORKING +2ADE ; [*0C82.0020.0002] # SHORT LEFT TACK +2ADF ; [*0C83.0020.0002] # SHORT DOWN TACK +2AE0 ; [*0C84.0020.0002] # SHORT UP TACK +2AE1 ; [*0C85.0020.0002] # PERPENDICULAR WITH S +2AE2 ; [*0C86.0020.0002] # VERTICAL BAR TRIPLE RIGHT TURNSTILE +2AE3 ; [*0C87.0020.0002] # DOUBLE VERTICAL BAR LEFT TURNSTILE +2AE4 ; [*0C88.0020.0002] # VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE5 ; [*0C89.0020.0002] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE6 ; [*0C8A.0020.0002] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +2AE7 ; [*0C8B.0020.0002] # SHORT DOWN TACK WITH OVERBAR +2AE8 ; [*0C8C.0020.0002] # SHORT UP TACK WITH UNDERBAR +2AE9 ; [*0C8D.0020.0002] # SHORT UP TACK ABOVE SHORT DOWN TACK +2AEA ; [*0C8E.0020.0002] # DOUBLE DOWN TACK +2AEB ; [*0C8F.0020.0002] # DOUBLE UP TACK +2AEC ; [*0C90.0020.0002] # DOUBLE STROKE NOT SIGN +2AED ; [*0C91.0020.0002] # REVERSED DOUBLE STROKE NOT SIGN +2AEE ; [*0C92.0020.0002] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +2AEF ; [*0C93.0020.0002] # VERTICAL LINE WITH CIRCLE ABOVE +2AF0 ; [*0C94.0020.0002] # VERTICAL LINE WITH CIRCLE BELOW +2AF1 ; [*0C95.0020.0002] # DOWN TACK WITH CIRCLE BELOW +2AF2 ; [*0C96.0020.0002] # PARALLEL WITH HORIZONTAL STROKE +2AF3 ; [*0C97.0020.0002] # PARALLEL WITH TILDE OPERATOR +2AF4 ; [*0C98.0020.0002] # TRIPLE VERTICAL BAR BINARY RELATION +2AF5 ; [*0C99.0020.0002] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE +2AF6 ; [*0C9A.0020.0002] # TRIPLE COLON OPERATOR +2AF7 ; [*0C9B.0020.0002] # TRIPLE NESTED LESS-THAN +2AF8 ; [*0C9C.0020.0002] # TRIPLE NESTED GREATER-THAN +2AF9 ; [*0C9D.0020.0002] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +2AFA ; [*0C9E.0020.0002] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +2AFB ; [*0C9F.0020.0002] # TRIPLE SOLIDUS BINARY RELATION +2AFC ; [*0CA0.0020.0002] # LARGE TRIPLE VERTICAL BAR OPERATOR +2AFD ; [*0CA1.0020.0002] # DOUBLE SOLIDUS OPERATOR +2AFE ; [*0CA2.0020.0002] # WHITE VERTICAL BAR +2AFF ; [*0CA3.0020.0002] # N-ARY WHITE VERTICAL BAR +2B00 ; [*0CA4.0020.0002] # NORTH EAST WHITE ARROW +2B01 ; [*0CA5.0020.0002] # NORTH WEST WHITE ARROW +2B02 ; [*0CA6.0020.0002] # SOUTH EAST WHITE ARROW +2B03 ; [*0CA7.0020.0002] # SOUTH WEST WHITE ARROW +2B04 ; [*0CA8.0020.0002] # LEFT RIGHT WHITE ARROW +2B05 ; [*0CA9.0020.0002] # LEFTWARDS BLACK ARROW +2B06 ; [*0CAA.0020.0002] # UPWARDS BLACK ARROW +2B07 ; [*0CAB.0020.0002] # DOWNWARDS BLACK ARROW +2B08 ; [*0CAC.0020.0002] # NORTH EAST BLACK ARROW +2B09 ; [*0CAD.0020.0002] # NORTH WEST BLACK ARROW +2B0A ; [*0CAE.0020.0002] # SOUTH EAST BLACK ARROW +2B0B ; [*0CAF.0020.0002] # SOUTH WEST BLACK ARROW +2B0C ; [*0CB0.0020.0002] # LEFT RIGHT BLACK ARROW +2B0D ; [*0CB1.0020.0002] # UP DOWN BLACK ARROW +2B0E ; [*0CB2.0020.0002] # RIGHTWARDS ARROW WITH TIP DOWNWARDS +2B0F ; [*0CB3.0020.0002] # RIGHTWARDS ARROW WITH TIP UPWARDS +2B10 ; [*0CB4.0020.0002] # LEFTWARDS ARROW WITH TIP DOWNWARDS +2B11 ; [*0CB5.0020.0002] # LEFTWARDS ARROW WITH TIP UPWARDS +2B12 ; [*0CB6.0020.0002] # SQUARE WITH TOP HALF BLACK +2B13 ; [*0CB7.0020.0002] # SQUARE WITH BOTTOM HALF BLACK +2B14 ; [*0CB8.0020.0002] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK +2B15 ; [*0CB9.0020.0002] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK +2B16 ; [*0CBA.0020.0002] # DIAMOND WITH LEFT HALF BLACK +2B17 ; [*0CBB.0020.0002] # DIAMOND WITH RIGHT HALF BLACK +2B18 ; [*0CBC.0020.0002] # DIAMOND WITH TOP HALF BLACK +2B19 ; [*0CBD.0020.0002] # DIAMOND WITH BOTTOM HALF BLACK +2B1A ; [*0CBE.0020.0002] # DOTTED SQUARE +2B1B ; [*0CBF.0020.0002] # BLACK LARGE SQUARE +2B1C ; [*0CC0.0020.0002] # WHITE LARGE SQUARE +2B1D ; [*0CC1.0020.0002] # BLACK VERY SMALL SQUARE +2B1E ; [*0CC2.0020.0002] # WHITE VERY SMALL SQUARE +2B1F ; [*0CC3.0020.0002] # BLACK PENTAGON +2B20 ; [*0CC4.0020.0002] # WHITE PENTAGON +2B21 ; [*0CC5.0020.0002] # WHITE HEXAGON +2B22 ; [*0CC6.0020.0002] # BLACK HEXAGON +2B23 ; [*0CC7.0020.0002] # HORIZONTAL BLACK HEXAGON +2B24 ; [*0CC8.0020.0002] # BLACK LARGE CIRCLE +2B25 ; [*0CC9.0020.0002] # BLACK MEDIUM DIAMOND +2B26 ; [*0CCA.0020.0002] # WHITE MEDIUM DIAMOND +2B27 ; [*0CCB.0020.0002] # BLACK MEDIUM LOZENGE +2B28 ; [*0CCC.0020.0002] # WHITE MEDIUM LOZENGE +2B29 ; [*0CCD.0020.0002] # BLACK SMALL DIAMOND +2B2A ; [*0CCE.0020.0002] # BLACK SMALL LOZENGE +2B2B ; [*0CCF.0020.0002] # WHITE SMALL LOZENGE +2B2C ; [*0CD0.0020.0002] # BLACK HORIZONTAL ELLIPSE +2B2D ; [*0CD1.0020.0002] # WHITE HORIZONTAL ELLIPSE +2B2E ; [*0CD2.0020.0002] # BLACK VERTICAL ELLIPSE +2B2F ; [*0CD3.0020.0002] # WHITE VERTICAL ELLIPSE +2B30 ; [*0CD4.0020.0002] # LEFT ARROW WITH SMALL CIRCLE +2B31 ; [*0CD5.0020.0002] # THREE LEFTWARDS ARROWS +2B32 ; [*0CD6.0020.0002] # LEFT ARROW WITH CIRCLED PLUS +2B33 ; [*0CD7.0020.0002] # LONG LEFTWARDS SQUIGGLE ARROW +2B34 ; [*0CD8.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2B35 ; [*0CD9.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2B36 ; [*0CDA.0020.0002] # LEFTWARDS TWO-HEADED ARROW FROM BAR +2B37 ; [*0CDB.0020.0002] # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW +2B38 ; [*0CDC.0020.0002] # LEFTWARDS ARROW WITH DOTTED STEM +2B39 ; [*0CDD.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2B3A ; [*0CDE.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2B3B ; [*0CDF.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL +2B3C ; [*0CE0.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2B3D ; [*0CE1.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2B3E ; [*0CE2.0020.0002] # LEFTWARDS ARROW THROUGH X +2B3F ; [*0CE3.0020.0002] # WAVE ARROW POINTING DIRECTLY LEFT +2B40 ; [*0CE4.0020.0002] # EQUALS SIGN ABOVE LEFTWARDS ARROW +2B41 ; [*0CE5.0020.0002] # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW +2B42 ; [*0CE6.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO +2B43 ; [*0CE7.0020.0002] # RIGHTWARDS ARROW THROUGH GREATER-THAN +2B44 ; [*0CE8.0020.0002] # RIGHTWARDS ARROW THROUGH SUPERSET +2B45 ; [*0CE9.0020.0002] # LEFTWARDS QUADRUPLE ARROW +2B46 ; [*0CEA.0020.0002] # RIGHTWARDS QUADRUPLE ARROW +2B47 ; [*0CEB.0020.0002] # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2B48 ; [*0CEC.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO +2B49 ; [*0CED.0020.0002] # TILDE OPERATOR ABOVE LEFTWARDS ARROW +2B4A ; [*0CEE.0020.0002] # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO +2B4B ; [*0CEF.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4C ; [*0CF0.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D ; [*0CF1.0020.0002] # DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW +2B4E ; [*0CF2.0020.0002] # SHORT SLANTED NORTH ARROW +2B4F ; [*0CF3.0020.0002] # SHORT BACKSLANTED SOUTH ARROW +2B50 ; [*0CF4.0020.0002] # WHITE MEDIUM STAR +2B51 ; [*0CF5.0020.0002] # BLACK SMALL STAR +2B52 ; [*0CF6.0020.0002] # WHITE SMALL STAR +2B53 ; [*0CF7.0020.0002] # BLACK RIGHT-POINTING PENTAGON +2B54 ; [*0CF8.0020.0002] # WHITE RIGHT-POINTING PENTAGON +2B55 ; [*0CF9.0020.0002] # HEAVY LARGE CIRCLE +2B56 ; [*0CFA.0020.0002] # HEAVY OVAL WITH OVAL INSIDE +2B57 ; [*0CFB.0020.0002] # HEAVY CIRCLE WITH CIRCLE INSIDE +2B58 ; [*0CFC.0020.0002] # HEAVY CIRCLE +2B59 ; [*0CFD.0020.0002] # HEAVY CIRCLED SALTIRE +2B5A ; [*0CFE.0020.0002] # SLANTED NORTH ARROW WITH HOOKED HEAD +2B5B ; [*0CFF.0020.0002] # BACKSLANTED SOUTH ARROW WITH HOOKED TAIL +2B5C ; [*0D00.0020.0002] # SLANTED NORTH ARROW WITH HORIZONTAL TAIL +2B5D ; [*0D01.0020.0002] # BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL +2B5E ; [*0D02.0020.0002] # BENT ARROW POINTING DOWNWARDS THEN NORTH EAST +2B5F ; [*0D03.0020.0002] # SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST +2B60 ; [*0D04.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW +2B61 ; [*0D05.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW +2B62 ; [*0D06.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW +2B63 ; [*0D07.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW +2B64 ; [*0D08.0020.0002] # LEFT RIGHT TRIANGLE-HEADED ARROW +2B65 ; [*0D09.0020.0002] # UP DOWN TRIANGLE-HEADED ARROW +2B66 ; [*0D0A.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW +2B67 ; [*0D0B.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW +2B68 ; [*0D0C.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW +2B69 ; [*0D0D.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW +2B6A ; [*0D0E.0020.0002] # LEFTWARDS TRIANGLE-HEADED DASHED ARROW +2B6B ; [*0D0F.0020.0002] # UPWARDS TRIANGLE-HEADED DASHED ARROW +2B6C ; [*0D10.0020.0002] # RIGHTWARDS TRIANGLE-HEADED DASHED ARROW +2B6D ; [*0D11.0020.0002] # DOWNWARDS TRIANGLE-HEADED DASHED ARROW +2B6E ; [*0D12.0020.0002] # CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW +2B6F ; [*0D13.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW +2B70 ; [*0D14.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW TO BAR +2B71 ; [*0D15.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW TO BAR +2B72 ; [*0D16.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR +2B73 ; [*0D17.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76 ; [*0D18.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW TO BAR +2B77 ; [*0D19.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW TO BAR +2B78 ; [*0D1A.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW TO BAR +2B79 ; [*0D1B.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW TO BAR +2B7A ; [*0D1C.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7B ; [*0D1D.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7C ; [*0D1E.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7D ; [*0D1F.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7E ; [*0D20.0020.0002] # HORIZONTAL TAB KEY +2B7F ; [*0D21.0020.0002] # VERTICAL TAB KEY +2B80 ; [*0D22.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW +2B81 ; [*0D23.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW +2B82 ; [*0D24.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW +2B83 ; [*0D25.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW +2B84 ; [*0D26.0020.0002] # LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS +2B85 ; [*0D27.0020.0002] # UPWARDS TRIANGLE-HEADED PAIRED ARROWS +2B86 ; [*0D28.0020.0002] # RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS +2B87 ; [*0D29.0020.0002] # DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS +2B88 ; [*0D2A.0020.0002] # LEFTWARDS BLACK CIRCLED WHITE ARROW +2B89 ; [*0D2B.0020.0002] # UPWARDS BLACK CIRCLED WHITE ARROW +2B8A ; [*0D2C.0020.0002] # RIGHTWARDS BLACK CIRCLED WHITE ARROW +2B8B ; [*0D2D.0020.0002] # DOWNWARDS BLACK CIRCLED WHITE ARROW +2B8C ; [*0D2E.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW +2B8D ; [*0D2F.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW +2B8E ; [*0D30.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW +2B8F ; [*0D31.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW +2B90 ; [*0D32.0020.0002] # RETURN LEFT +2B91 ; [*0D33.0020.0002] # RETURN RIGHT +2B92 ; [*0D34.0020.0002] # NEWLINE LEFT +2B93 ; [*0D35.0020.0002] # NEWLINE RIGHT +2B94 ; [*0D36.0020.0002] # FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE +2B95 ; [*0D37.0020.0002] # RIGHTWARDS BLACK ARROW +2B98 ; [*0D38.0020.0002] # THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD +2B99 ; [*0D39.0020.0002] # THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD +2B9A ; [*0D3A.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD +2B9B ; [*0D3B.0020.0002] # THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD +2B9C ; [*0D3C.0020.0002] # BLACK LEFTWARDS EQUILATERAL ARROWHEAD +2B9D ; [*0D3D.0020.0002] # BLACK UPWARDS EQUILATERAL ARROWHEAD +2B9E ; [*0D3E.0020.0002] # BLACK RIGHTWARDS EQUILATERAL ARROWHEAD +2B9F ; [*0D3F.0020.0002] # BLACK DOWNWARDS EQUILATERAL ARROWHEAD +2BA0 ; [*0D40.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS +2BA1 ; [*0D41.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS +2BA2 ; [*0D42.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS +2BA3 ; [*0D43.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS +2BA4 ; [*0D44.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS +2BA5 ; [*0D45.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS +2BA6 ; [*0D46.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS +2BA7 ; [*0D47.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS +2BA8 ; [*0D48.0020.0002] # BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW +2BA9 ; [*0D49.0020.0002] # BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +2BAA ; [*0D4A.0020.0002] # BLACK CURVED UPWARDS AND LEFTWARDS ARROW +2BAB ; [*0D4B.0020.0002] # BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +2BAC ; [*0D4C.0020.0002] # BLACK CURVED LEFTWARDS AND UPWARDS ARROW +2BAD ; [*0D4D.0020.0002] # BLACK CURVED RIGHTWARDS AND UPWARDS ARROW +2BAE ; [*0D4E.0020.0002] # BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW +2BAF ; [*0D4F.0020.0002] # BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW +2BB0 ; [*0D50.0020.0002] # RIBBON ARROW DOWN LEFT +2BB1 ; [*0D51.0020.0002] # RIBBON ARROW DOWN RIGHT +2BB2 ; [*0D52.0020.0002] # RIBBON ARROW UP LEFT +2BB3 ; [*0D53.0020.0002] # RIBBON ARROW UP RIGHT +2BB4 ; [*0D54.0020.0002] # RIBBON ARROW LEFT UP +2BB5 ; [*0D55.0020.0002] # RIBBON ARROW RIGHT UP +2BB6 ; [*0D56.0020.0002] # RIBBON ARROW LEFT DOWN +2BB7 ; [*0D57.0020.0002] # RIBBON ARROW RIGHT DOWN +2BB8 ; [*0D58.0020.0002] # UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR +2BB9 ; [*0D59.0020.0002] # UP ARROWHEAD IN A RECTANGLE BOX +2BBD ; [*0D5A.0020.0002] # BALLOT BOX WITH LIGHT X +2BBE ; [*0D5B.0020.0002] # CIRCLED X +2BBF ; [*0D5C.0020.0002] # CIRCLED BOLD X +2BC0 ; [*0D5D.0020.0002] # BLACK SQUARE CENTRED +2BC1 ; [*0D5E.0020.0002] # BLACK DIAMOND CENTRED +2BC2 ; [*0D5F.0020.0002] # TURNED BLACK PENTAGON +2BC3 ; [*0D60.0020.0002] # HORIZONTAL BLACK OCTAGON +2BC4 ; [*0D61.0020.0002] # BLACK OCTAGON +2BC5 ; [*0D62.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE CENTRED +2BC6 ; [*0D63.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED +2BC7 ; [*0D64.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED +2BC8 ; [*0D65.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +2BCA ; [*0D66.0020.0002] # TOP HALF BLACK CIRCLE +2BCB ; [*0D67.0020.0002] # BOTTOM HALF BLACK CIRCLE +2BCC ; [*0D68.0020.0002] # LIGHT FOUR POINTED BLACK CUSP +2BCD ; [*0D69.0020.0002] # ROTATED LIGHT FOUR POINTED BLACK CUSP +2BCE ; [*0D6A.0020.0002] # WHITE FOUR POINTED CUSP +2BCF ; [*0D6B.0020.0002] # ROTATED WHITE FOUR POINTED CUSP +2BD0 ; [*0D6C.0020.0002] # SQUARE POSITION INDICATOR +2BD1 ; [*0D6D.0020.0002] # UNCERTAINTY SIGN +2BEC ; [*0D6E.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BED ; [*0D6F.0020.0002] # UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BEE ; [*0D70.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BEF ; [*0D71.0020.0002] # DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2CE5 ; [*0D72.0020.0002] # COPTIC SYMBOL MI RO +2CE6 ; [*0D73.0020.0002] # COPTIC SYMBOL PI RO +2CE7 ; [*0D74.0020.0002] # COPTIC SYMBOL STAUROS +2CE8 ; [*0D75.0020.0002] # COPTIC SYMBOL TAU RO +2CE9 ; [*0D76.0020.0002] # COPTIC SYMBOL KHI RO +2CEA ; [*0D77.0020.0002] # COPTIC SYMBOL SHIMA SIMA +2CF9 ; [*027E.0020.0002] # COPTIC OLD NUBIAN FULL STOP +2CFA ; [*026C.0020.0002] # COPTIC OLD NUBIAN DIRECT QUESTION MARK +2CFB ; [*026D.0020.0002] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2CFC ; [*02EF.0020.0002] # COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; [*1A68.0020.0002] # COPTIC FRACTION ONE HALF +2CFE ; [*027F.0020.0002] # COPTIC FULL STOP +2CFF ; [*02F0.0020.0002] # COPTIC MORPHOLOGICAL DIVIDER +2D70 ; [*0410.0020.0002] # TIFINAGH SEPARATOR MARK +2D7F ; [.0000.0000.0000] # TIFINAGH CONSONANT JOINER +2E00 ; [*03AF.0020.0002] # RIGHT ANGLE SUBSTITUTION MARKER +2E01 ; [*03B0.0020.0002] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; [*0354.0020.0002] # LEFT SUBSTITUTION BRACKET +2E03 ; [*0355.0020.0002] # RIGHT SUBSTITUTION BRACKET +2E04 ; [*0356.0020.0002] # LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; [*0357.0020.0002] # RIGHT DOTTED SUBSTITUTION BRACKET +2E06 ; [*03B1.0020.0002] # RAISED INTERPOLATION MARKER +2E07 ; [*03B2.0020.0002] # RAISED DOTTED INTERPOLATION MARKER +2E08 ; [*03B3.0020.0002] # DOTTED TRANSPOSITION MARKER +2E09 ; [*0358.0020.0002] # LEFT TRANSPOSITION BRACKET +2E0A ; [*0359.0020.0002] # RIGHT TRANSPOSITION BRACKET +2E0B ; [*03B4.0020.0002] # RAISED SQUARE +2E0C ; [*035A.0020.0002] # LEFT RAISED OMISSION BRACKET +2E0D ; [*035B.0020.0002] # RIGHT RAISED OMISSION BRACKET +2E0E ; [*03B5.0020.0002] # EDITORIAL CORONIS +2E0F ; [*03B6.0020.0002] # PARAGRAPHOS +2E10 ; [*03B7.0020.0002] # FORKED PARAGRAPHOS +2E11 ; [*03B8.0020.0002] # REVERSED FORKED PARAGRAPHOS +2E12 ; [*03B9.0020.0002] # HYPODIASTOLE +2E13 ; [*03BA.0020.0002] # DOTTED OBELOS +2E14 ; [*03BB.0020.0002] # DOWNWARDS ANCORA +2E15 ; [*03BC.0020.0002] # UPWARDS ANCORA +2E16 ; [*03BD.0020.0002] # DOTTED RIGHT-POINTING ANGLE +2E17 ; [*021B.0020.0002] # DOUBLE OBLIQUE HYPHEN +2E18 ; [*0273.0020.0002] # INVERTED INTERROBANG +2E19 ; [*02F1.0020.0002] # PALM BRANCH +2E1A ; [*03BE.0020.0002] # HYPHEN WITH DIAERESIS +2E1B ; [*03BF.0020.0002] # TILDE WITH RING ABOVE +2E1C ; [*035C.0020.0002] # LEFT LOW PARAPHRASE BRACKET +2E1D ; [*035D.0020.0002] # RIGHT LOW PARAPHRASE BRACKET +2E1E ; [*03C0.0020.0002] # TILDE WITH DOT ABOVE +2E1F ; [*03C1.0020.0002] # TILDE WITH DOT BELOW +2E20 ; [*035E.0020.0002] # LEFT VERTICAL BAR WITH QUILL +2E21 ; [*035F.0020.0002] # RIGHT VERTICAL BAR WITH QUILL +2E22 ; [*0360.0020.0002] # TOP LEFT HALF BRACKET +2E23 ; [*0361.0020.0002] # TOP RIGHT HALF BRACKET +2E24 ; [*0362.0020.0002] # BOTTOM LEFT HALF BRACKET +2E25 ; [*0363.0020.0002] # BOTTOM RIGHT HALF BRACKET +2E26 ; [*0364.0020.0002] # LEFT SIDEWAYS U BRACKET +2E27 ; [*0365.0020.0002] # RIGHT SIDEWAYS U BRACKET +2E28 ; [*0366.0020.0002] # LEFT DOUBLE PARENTHESIS +2E29 ; [*0367.0020.0002] # RIGHT DOUBLE PARENTHESIS +2E2A ; [*02EA.0020.0002] # TWO DOTS OVER ONE DOT PUNCTUATION +2E2B ; [*02EB.0020.0002] # ONE DOT OVER TWO DOTS PUNCTUATION +2E2C ; [*02EC.0020.0002] # SQUARED FOUR DOT PUNCTUATION +2E2D ; [*02ED.0020.0002] # FIVE DOT MARK +2E2E ; [*0266.0020.0002] # REVERSED QUESTION MARK +2E30 ; [*0280.0020.0002] # RING POINT +2E31 ; [*0289.0020.0002] # WORD SEPARATOR MIDDLE DOT +2E32 ; [*0223.0020.0002] # TURNED COMMA +2E33 ; [*028A.0020.0002] # RAISED DOT +2E34 ; [*0222.0020.0002] # RAISED COMMA +2E35 ; [*0236.0020.0002] # TURNED SEMICOLON +2E36 ; [*039A.0020.0002] # DAGGER WITH LEFT GUARD +2E37 ; [*039B.0020.0002] # DAGGER WITH RIGHT GUARD +2E38 ; [*039C.0020.0002] # TURNED DAGGER +2E39 ; [*0383.0020.0002] # TOP HALF SECTION SIGN +2E3A ; [*0218.0020.0002] # TWO-EM DASH +2E3B ; [*0219.0020.0002] # THREE-EM DASH +2E3C ; [*0281.0020.0002] # STENOGRAPHIC FULL STOP +2E3D ; [*02EE.0020.0002] # VERTICAL SIX DOTS +2E3E ; [*037D.0020.0002] # WIGGLY VERTICAL LINE +2E3F ; [*0386.0020.0002] # CAPITULUM +2E40 ; [*021C.0020.0002] # DOUBLE HYPHEN +2E41 ; [*0224.0020.0002] # REVERSED COMMA +2E42 ; [*030A.0020.0002] # DOUBLE LOW-REVERSED-9 QUOTATION MARK +2FF0 ; [*19EB.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT +2FF1 ; [*19EC.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF2 ; [*19ED.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT +2FF3 ; [*19EE.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW +2FF4 ; [*19EF.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND +2FF5 ; [*19F0.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE +2FF6 ; [*19F1.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW +2FF7 ; [*19F2.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT +2FF8 ; [*19F3.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT +2FF9 ; [*19F4.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT +2FFA ; [*19F5.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT +2FFB ; [*19F6.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3000 ; [*0209.0020.0003] # IDEOGRAPHIC SPACE +3001 ; [*0230.0020.0002] # IDEOGRAPHIC COMMA +3002 ; [*0287.0020.0002] # IDEOGRAPHIC FULL STOP +3003 ; [*03A5.0020.0002] # DITTO MARK +3004 ; [*1A1B.0020.0002] # JAPANESE INDUSTRIAL STANDARD SYMBOL +3008 ; [*0368.0020.0002] # LEFT ANGLE BRACKET +3009 ; [*0369.0020.0002] # RIGHT ANGLE BRACKET +300A ; [*036A.0020.0002] # LEFT DOUBLE ANGLE BRACKET +300B ; [*036B.0020.0002] # RIGHT DOUBLE ANGLE BRACKET +300C ; [*036C.0020.0002] # LEFT CORNER BRACKET +300D ; [*036D.0020.0002] # RIGHT CORNER BRACKET +300E ; [*036E.0020.0002] # LEFT WHITE CORNER BRACKET +300F ; [*036F.0020.0002] # RIGHT WHITE CORNER BRACKET +3010 ; [*0370.0020.0002] # LEFT BLACK LENTICULAR BRACKET +3011 ; [*0371.0020.0002] # RIGHT BLACK LENTICULAR BRACKET +3012 ; [*1A1C.0020.0002] # POSTAL MARK +3013 ; [*1A1D.0020.0002] # GETA MARK +3014 ; [*0372.0020.0002] # LEFT TORTOISE SHELL BRACKET +3015 ; [*0373.0020.0002] # RIGHT TORTOISE SHELL BRACKET +3016 ; [*0374.0020.0002] # LEFT WHITE LENTICULAR BRACKET +3017 ; [*0375.0020.0002] # RIGHT WHITE LENTICULAR BRACKET +3018 ; [*0376.0020.0002] # LEFT WHITE TORTOISE SHELL BRACKET +3019 ; [*0377.0020.0002] # RIGHT WHITE TORTOISE SHELL BRACKET +301A ; [*0378.0020.0002] # LEFT WHITE SQUARE BRACKET +301B ; [*0379.0020.0002] # RIGHT WHITE SQUARE BRACKET +301C ; [*021D.0020.0002] # WAVE DASH +301D ; [*030B.0020.0002] # REVERSED DOUBLE PRIME QUOTATION MARK +301E ; [*030C.0020.0002] # DOUBLE PRIME QUOTATION MARK +301F ; [*030D.0020.0002] # LOW DOUBLE PRIME QUOTATION MARK +3020 ; [*1A1E.0020.0002] # POSTAL MARK FACE +3030 ; [*021E.0020.0002] # WAVY DASH +3036 ; [*1A1C.0020.0004] # CIRCLED POSTAL MARK +3037 ; [*1A1F.0020.0002] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +303D ; [*03A6.0020.0002] # PART ALTERNATION MARK +303E ; [*1A20.0020.0002] # IDEOGRAPHIC VARIATION INDICATOR +303F ; [*1A21.0020.0002] # IDEOGRAPHIC HALF FILL SPACE +309B ; [*0472.0020.0002] # KATAKANA-HIRAGANA VOICED SOUND MARK +309C ; [*0473.0020.0002] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30A0 ; [*021F.0020.0002] # KATAKANA-HIRAGANA DOUBLE HYPHEN +30FB ; [*0220.0020.0002] # KATAKANA MIDDLE DOT +3190 ; [*1A22.0020.0002] # IDEOGRAPHIC ANNOTATION LINKING MARK +3191 ; [*1A23.0020.0002] # IDEOGRAPHIC ANNOTATION REVERSE MARK +31C0 ; [*19F7.0020.0002] # CJK STROKE T +31C1 ; [*19F8.0020.0002] # CJK STROKE WG +31C2 ; [*19F9.0020.0002] # CJK STROKE XG +31C3 ; [*19FA.0020.0002] # CJK STROKE BXG +31C4 ; [*19FB.0020.0002] # CJK STROKE SW +31C5 ; [*19FC.0020.0002] # CJK STROKE HZZ +31C6 ; [*19FD.0020.0002] # CJK STROKE HZG +31C7 ; [*19FE.0020.0002] # CJK STROKE HP +31C8 ; [*19FF.0020.0002] # CJK STROKE HZWG +31C9 ; [*1A00.0020.0002] # CJK STROKE SZWG +31CA ; [*1A01.0020.0002] # CJK STROKE HZT +31CB ; [*1A02.0020.0002] # CJK STROKE HZZP +31CC ; [*1A03.0020.0002] # CJK STROKE HPWG +31CD ; [*1A04.0020.0002] # CJK STROKE HZW +31CE ; [*1A05.0020.0002] # CJK STROKE HZZZ +31CF ; [*1A06.0020.0002] # CJK STROKE N +31D0 ; [*1A07.0020.0002] # CJK STROKE H +31D1 ; [*1A08.0020.0002] # CJK STROKE S +31D2 ; [*1A09.0020.0002] # CJK STROKE P +31D3 ; [*1A0A.0020.0002] # CJK STROKE SP +31D4 ; [*1A0B.0020.0002] # CJK STROKE D +31D5 ; [*1A0C.0020.0002] # CJK STROKE HZ +31D6 ; [*1A0D.0020.0002] # CJK STROKE HG +31D7 ; [*1A0E.0020.0002] # CJK STROKE SZ +31D8 ; [*1A0F.0020.0002] # CJK STROKE SWZ +31D9 ; [*1A10.0020.0002] # CJK STROKE ST +31DA ; [*1A11.0020.0002] # CJK STROKE SG +31DB ; [*1A12.0020.0002] # CJK STROKE PD +31DC ; [*1A13.0020.0002] # CJK STROKE PZ +31DD ; [*1A14.0020.0002] # CJK STROKE TN +31DE ; [*1A15.0020.0002] # CJK STROKE SZZ +31DF ; [*1A16.0020.0002] # CJK STROKE SWG +31E0 ; [*1A17.0020.0002] # CJK STROKE HXWG +31E1 ; [*1A18.0020.0002] # CJK STROKE HZZZG +31E2 ; [*1A19.0020.0002] # CJK STROKE PG +31E3 ; [*1A1A.0020.0002] # CJK STROKE Q +327F ; [*1A24.0020.0002] # KOREAN STANDARD SYMBOL +4DC0 ; [*0E86.0020.0002] # HEXAGRAM FOR THE CREATIVE HEAVEN +4DC1 ; [*0E87.0020.0002] # HEXAGRAM FOR THE RECEPTIVE EARTH +4DC2 ; [*0E88.0020.0002] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING +4DC3 ; [*0E89.0020.0002] # HEXAGRAM FOR YOUTHFUL FOLLY +4DC4 ; [*0E8A.0020.0002] # HEXAGRAM FOR WAITING +4DC5 ; [*0E8B.0020.0002] # HEXAGRAM FOR CONFLICT +4DC6 ; [*0E8C.0020.0002] # HEXAGRAM FOR THE ARMY +4DC7 ; [*0E8D.0020.0002] # HEXAGRAM FOR HOLDING TOGETHER +4DC8 ; [*0E8E.0020.0002] # HEXAGRAM FOR SMALL TAMING +4DC9 ; [*0E8F.0020.0002] # HEXAGRAM FOR TREADING +4DCA ; [*0E90.0020.0002] # HEXAGRAM FOR PEACE +4DCB ; [*0E91.0020.0002] # HEXAGRAM FOR STANDSTILL +4DCC ; [*0E92.0020.0002] # HEXAGRAM FOR FELLOWSHIP +4DCD ; [*0E93.0020.0002] # HEXAGRAM FOR GREAT POSSESSION +4DCE ; [*0E94.0020.0002] # HEXAGRAM FOR MODESTY +4DCF ; [*0E95.0020.0002] # HEXAGRAM FOR ENTHUSIASM +4DD0 ; [*0E96.0020.0002] # HEXAGRAM FOR FOLLOWING +4DD1 ; [*0E97.0020.0002] # HEXAGRAM FOR WORK ON THE DECAYED +4DD2 ; [*0E98.0020.0002] # HEXAGRAM FOR APPROACH +4DD3 ; [*0E99.0020.0002] # HEXAGRAM FOR CONTEMPLATION +4DD4 ; [*0E9A.0020.0002] # HEXAGRAM FOR BITING THROUGH +4DD5 ; [*0E9B.0020.0002] # HEXAGRAM FOR GRACE +4DD6 ; [*0E9C.0020.0002] # HEXAGRAM FOR SPLITTING APART +4DD7 ; [*0E9D.0020.0002] # HEXAGRAM FOR RETURN +4DD8 ; [*0E9E.0020.0002] # HEXAGRAM FOR INNOCENCE +4DD9 ; [*0E9F.0020.0002] # HEXAGRAM FOR GREAT TAMING +4DDA ; [*0EA0.0020.0002] # HEXAGRAM FOR MOUTH CORNERS +4DDB ; [*0EA1.0020.0002] # HEXAGRAM FOR GREAT PREPONDERANCE +4DDC ; [*0EA2.0020.0002] # HEXAGRAM FOR THE ABYSMAL WATER +4DDD ; [*0EA3.0020.0002] # HEXAGRAM FOR THE CLINGING FIRE +4DDE ; [*0EA4.0020.0002] # HEXAGRAM FOR INFLUENCE +4DDF ; [*0EA5.0020.0002] # HEXAGRAM FOR DURATION +4DE0 ; [*0EA6.0020.0002] # HEXAGRAM FOR RETREAT +4DE1 ; [*0EA7.0020.0002] # HEXAGRAM FOR GREAT POWER +4DE2 ; [*0EA8.0020.0002] # HEXAGRAM FOR PROGRESS +4DE3 ; [*0EA9.0020.0002] # HEXAGRAM FOR DARKENING OF THE LIGHT +4DE4 ; [*0EAA.0020.0002] # HEXAGRAM FOR THE FAMILY +4DE5 ; [*0EAB.0020.0002] # HEXAGRAM FOR OPPOSITION +4DE6 ; [*0EAC.0020.0002] # HEXAGRAM FOR OBSTRUCTION +4DE7 ; [*0EAD.0020.0002] # HEXAGRAM FOR DELIVERANCE +4DE8 ; [*0EAE.0020.0002] # HEXAGRAM FOR DECREASE +4DE9 ; [*0EAF.0020.0002] # HEXAGRAM FOR INCREASE +4DEA ; [*0EB0.0020.0002] # HEXAGRAM FOR BREAKTHROUGH +4DEB ; [*0EB1.0020.0002] # HEXAGRAM FOR COMING TO MEET +4DEC ; [*0EB2.0020.0002] # HEXAGRAM FOR GATHERING TOGETHER +4DED ; [*0EB3.0020.0002] # HEXAGRAM FOR PUSHING UPWARD +4DEE ; [*0EB4.0020.0002] # HEXAGRAM FOR OPPRESSION +4DEF ; [*0EB5.0020.0002] # HEXAGRAM FOR THE WELL +4DF0 ; [*0EB6.0020.0002] # HEXAGRAM FOR REVOLUTION +4DF1 ; [*0EB7.0020.0002] # HEXAGRAM FOR THE CAULDRON +4DF2 ; [*0EB8.0020.0002] # HEXAGRAM FOR THE AROUSING THUNDER +4DF3 ; [*0EB9.0020.0002] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN +4DF4 ; [*0EBA.0020.0002] # HEXAGRAM FOR DEVELOPMENT +4DF5 ; [*0EBB.0020.0002] # HEXAGRAM FOR THE MARRYING MAIDEN +4DF6 ; [*0EBC.0020.0002] # HEXAGRAM FOR ABUNDANCE +4DF7 ; [*0EBD.0020.0002] # HEXAGRAM FOR THE WANDERER +4DF8 ; [*0EBE.0020.0002] # HEXAGRAM FOR THE GENTLE WIND +4DF9 ; [*0EBF.0020.0002] # HEXAGRAM FOR THE JOYOUS LAKE +4DFA ; [*0EC0.0020.0002] # HEXAGRAM FOR DISPERSION +4DFB ; [*0EC1.0020.0002] # HEXAGRAM FOR LIMITATION +4DFC ; [*0EC2.0020.0002] # HEXAGRAM FOR INNER TRUTH +4DFD ; [*0EC3.0020.0002] # HEXAGRAM FOR SMALL PREPONDERANCE +4DFE ; [*0EC4.0020.0002] # HEXAGRAM FOR AFTER COMPLETION +4DFF ; [*0EC5.0020.0002] # HEXAGRAM FOR BEFORE COMPLETION +A490 ; [*0F1D.0020.0002] # YI RADICAL QOT +A491 ; [*0F1E.0020.0002] # YI RADICAL LI +A492 ; [*0F1F.0020.0002] # YI RADICAL KIT +A493 ; [*0F20.0020.0002] # YI RADICAL NYIP +A494 ; [*0F21.0020.0002] # YI RADICAL CYP +A495 ; [*0F22.0020.0002] # YI RADICAL SSI +A496 ; [*0F23.0020.0002] # YI RADICAL GGOP +A497 ; [*0F24.0020.0002] # YI RADICAL GEP +A498 ; [*0F25.0020.0002] # YI RADICAL MI +A499 ; [*0F26.0020.0002] # YI RADICAL HXIT +A49A ; [*0F27.0020.0002] # YI RADICAL LYR +A49B ; [*0F28.0020.0002] # YI RADICAL BBUT +A49C ; [*0F29.0020.0002] # YI RADICAL MOP +A49D ; [*0F2A.0020.0002] # YI RADICAL YO +A49E ; [*0F2B.0020.0002] # YI RADICAL PUT +A49F ; [*0F2C.0020.0002] # YI RADICAL HXUO +A4A0 ; [*0F2D.0020.0002] # YI RADICAL TAT +A4A1 ; [*0F2E.0020.0002] # YI RADICAL GA +A4A2 ; [*0F2F.0020.0002] # YI RADICAL ZUP +A4A3 ; [*0F30.0020.0002] # YI RADICAL CYT +A4A4 ; [*0F31.0020.0002] # YI RADICAL DDUR +A4A5 ; [*0F32.0020.0002] # YI RADICAL BUR +A4A6 ; [*0F33.0020.0002] # YI RADICAL GGUO +A4A7 ; [*0F34.0020.0002] # YI RADICAL NYOP +A4A8 ; [*0F35.0020.0002] # YI RADICAL TU +A4A9 ; [*0F36.0020.0002] # YI RADICAL OP +A4AA ; [*0F37.0020.0002] # YI RADICAL JJUT +A4AB ; [*0F38.0020.0002] # YI RADICAL ZOT +A4AC ; [*0F39.0020.0002] # YI RADICAL PYT +A4AD ; [*0F3A.0020.0002] # YI RADICAL HMO +A4AE ; [*0F3B.0020.0002] # YI RADICAL YIT +A4AF ; [*0F3C.0020.0002] # YI RADICAL VUR +A4B0 ; [*0F3D.0020.0002] # YI RADICAL SHY +A4B1 ; [*0F3E.0020.0002] # YI RADICAL VEP +A4B2 ; [*0F3F.0020.0002] # YI RADICAL ZA +A4B3 ; [*0F40.0020.0002] # YI RADICAL JO +A4B4 ; [*0F41.0020.0002] # YI RADICAL NZUP +A4B5 ; [*0F42.0020.0002] # YI RADICAL JJY +A4B6 ; [*0F43.0020.0002] # YI RADICAL GOT +A4B7 ; [*0F44.0020.0002] # YI RADICAL JJIE +A4B8 ; [*0F45.0020.0002] # YI RADICAL WO +A4B9 ; [*0F46.0020.0002] # YI RADICAL DU +A4BA ; [*0F47.0020.0002] # YI RADICAL SHUR +A4BB ; [*0F48.0020.0002] # YI RADICAL LIE +A4BC ; [*0F49.0020.0002] # YI RADICAL CY +A4BD ; [*0F4A.0020.0002] # YI RADICAL CUOP +A4BE ; [*0F4B.0020.0002] # YI RADICAL CIP +A4BF ; [*0F4C.0020.0002] # YI RADICAL HXOP +A4C0 ; [*0F4D.0020.0002] # YI RADICAL SHAT +A4C1 ; [*0F4E.0020.0002] # YI RADICAL ZUR +A4C2 ; [*0F4F.0020.0002] # YI RADICAL SHOP +A4C3 ; [*0F50.0020.0002] # YI RADICAL CHE +A4C4 ; [*0F51.0020.0002] # YI RADICAL ZZIET +A4C5 ; [*0F52.0020.0002] # YI RADICAL NBIE +A4C6 ; [*0F53.0020.0002] # YI RADICAL KE +A4FE ; [*022D.0020.0002] # LISU PUNCTUATION COMMA +A4FF ; [*0282.0020.0002] # LISU PUNCTUATION FULL STOP +A60D ; [*022E.0020.0002] # VAI COMMA +A60E ; [*0283.0020.0002] # VAI FULL STOP +A60F ; [*026E.0020.0002] # VAI QUESTION MARK +A670 ; [.0000.0000.0000] # COMBINING CYRILLIC TEN MILLIONS SIGN +A671 ; [.0000.0000.0000] # COMBINING CYRILLIC HUNDRED MILLIONS SIGN +A672 ; [.0000.0000.0000] # COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673 ; [*038C.0020.0002] # SLAVONIC ASTERISK +A67E ; [*03C2.0020.0002] # CYRILLIC KAVYKA +A6F2 ; [*02D0.0020.0002] # BAMUM NJAEMLI +A6F3 ; [*0284.0020.0002] # BAMUM FULL STOP +A6F4 ; [*025E.0020.0002] # BAMUM COLON +A6F5 ; [*022F.0020.0002] # BAMUM COMMA +A6F6 ; [*0237.0020.0002] # BAMUM SEMICOLON +A6F7 ; [*026F.0020.0002] # BAMUM QUESTION MARK +A700 ; [*04B1.0020.0002] # MODIFIER LETTER CHINESE TONE YIN PING +A701 ; [*04B2.0020.0002] # MODIFIER LETTER CHINESE TONE YANG PING +A702 ; [*04B3.0020.0002] # MODIFIER LETTER CHINESE TONE YIN SHANG +A703 ; [*04B4.0020.0002] # MODIFIER LETTER CHINESE TONE YANG SHANG +A704 ; [*04B5.0020.0002] # MODIFIER LETTER CHINESE TONE YIN QU +A705 ; [*04B6.0020.0002] # MODIFIER LETTER CHINESE TONE YANG QU +A706 ; [*04B7.0020.0002] # MODIFIER LETTER CHINESE TONE YIN RU +A707 ; [*04B8.0020.0002] # MODIFIER LETTER CHINESE TONE YANG RU +A708 ; [*04B9.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR +A709 ; [*04BA.0020.0002] # MODIFIER LETTER HIGH DOTTED TONE BAR +A70A ; [*04BB.0020.0002] # MODIFIER LETTER MID DOTTED TONE BAR +A70B ; [*04BC.0020.0002] # MODIFIER LETTER LOW DOTTED TONE BAR +A70C ; [*04BD.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR +A70D ; [*04BE.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR +A70E ; [*04BF.0020.0002] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR +A70F ; [*04C0.0020.0002] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR +A710 ; [*04C1.0020.0002] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR +A711 ; [*04C2.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR +A712 ; [*04C3.0020.0002] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR +A713 ; [*04C4.0020.0002] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR +A714 ; [*04C5.0020.0002] # MODIFIER LETTER MID LEFT-STEM TONE BAR +A715 ; [*04C6.0020.0002] # MODIFIER LETTER LOW LEFT-STEM TONE BAR +A716 ; [*04C7.0020.0002] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717 ; [*04C8.0020.0002] # MODIFIER LETTER DOT VERTICAL BAR +A718 ; [*04C9.0020.0002] # MODIFIER LETTER DOT SLASH +A719 ; [*04CA.0020.0002] # MODIFIER LETTER DOT HORIZONTAL BAR +A71A ; [*04CB.0020.0002] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE +A71B ; [*04CC.0020.0002] # MODIFIER LETTER RAISED UP ARROW +A71C ; [*04CD.0020.0002] # MODIFIER LETTER RAISED DOWN ARROW +A71D ; [*04CE.0020.0002] # MODIFIER LETTER RAISED EXCLAMATION MARK +A71E ; [*04CF.0020.0002] # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK +A71F ; [*04D0.0020.0002] # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720 ; [*04D1.0020.0002] # MODIFIER LETTER STRESS AND HIGH TONE +A721 ; [*04D2.0020.0002] # MODIFIER LETTER STRESS AND LOW TONE +A788 ; [*04D3.0020.0002] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789 ; [*04D4.0020.0002] # MODIFIER LETTER COLON +A78A ; [*04D5.0020.0002] # MODIFIER LETTER SHORT EQUALS SIGN +A828 ; [*04FF.0020.0002] # SYLOTI NAGRI POETRY MARK-1 +A829 ; [*0500.0020.0002] # SYLOTI NAGRI POETRY MARK-2 +A82A ; [*0501.0020.0002] # SYLOTI NAGRI POETRY MARK-3 +A82B ; [*0502.0020.0002] # SYLOTI NAGRI POETRY MARK-4 +A830 ; [*1A32.0020.0002] # NORTH INDIC FRACTION ONE QUARTER +A831 ; [*1A33.0020.0002] # NORTH INDIC FRACTION ONE HALF +A832 ; [*1A34.0020.0002] # NORTH INDIC FRACTION THREE QUARTERS +A833 ; [*1A35.0020.0002] # NORTH INDIC FRACTION ONE SIXTEENTH +A834 ; [*1A36.0020.0002] # NORTH INDIC FRACTION ONE EIGHTH +A835 ; [*1A37.0020.0002] # NORTH INDIC FRACTION THREE SIXTEENTHS +A836 ; [*0503.0020.0002] # NORTH INDIC QUARTER MARK +A837 ; [*0504.0020.0002] # NORTH INDIC PLACEHOLDER MARK +A839 ; [*0505.0020.0002] # NORTH INDIC QUANTITY MARK +A874 ; [*0411.0020.0002] # PHAGS-PA SINGLE HEAD MARK +A875 ; [*0412.0020.0002] # PHAGS-PA DOUBLE HEAD MARK +A876 ; [*0291.0020.0002] # PHAGS-PA MARK SHAD +A877 ; [*0292.0020.0002] # PHAGS-PA MARK DOUBLE SHAD +A8CE ; [*028D.0020.0002] # SAURASHTRA DANDA +A8CF ; [*028E.0020.0002] # SAURASHTRA DOUBLE DANDA +A8E0 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT ZERO +A8E1 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT ONE +A8E2 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT TWO +A8E3 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT THREE +A8E4 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT FOUR +A8E5 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT FIVE +A8E6 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT SIX +A8E7 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT SEVEN +A8E8 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT EIGHT +A8E9 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT NINE +A8EA ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER A +A8EB ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER U +A8EC ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER KA +A8ED ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER NA +A8EE ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER PA +A8EF ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER RA +A8F0 ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER VI +A8F1 ; [.0000.0000.0000] # COMBINING DEVANAGARI SIGN AVAGRAHA +A8F8 ; [*03D3.0020.0002] # DEVANAGARI SIGN PUSHPIKA +A8F9 ; [*03D4.0020.0002] # DEVANAGARI GAP FILLER +A8FA ; [*03D5.0020.0002] # DEVANAGARI CARET +A8FC ; [*03D6.0020.0002] # DEVANAGARI SIGN SIDDHAM +A92E ; [*0417.0020.0002] # KAYAH LI SIGN CWI +A92F ; [*0295.0020.0002] # KAYAH LI SIGN SHYA +A95F ; [*02D1.0020.0002] # REJANG SECTION MARK +A9C1 ; [*02C6.0020.0002] # JAVANESE LEFT RERENGGAN +A9C2 ; [*02C7.0020.0002] # JAVANESE RIGHT RERENGGAN +A9C3 ; [*02C8.0020.0002] # JAVANESE PADA ANDAP +A9C4 ; [*02C9.0020.0002] # JAVANESE PADA MADYA +A9C5 ; [*02CA.0020.0002] # JAVANESE PADA LUHUR +A9C6 ; [*02CB.0020.0002] # JAVANESE PADA WINDU +A9C7 ; [*025A.0020.0002] # JAVANESE PADA PANGKAT +A9C8 ; [*02A0.0020.0002] # JAVANESE PADA LINGSA +A9C9 ; [*02A1.0020.0002] # JAVANESE PADA LUNGSI +A9CA ; [*02CC.0020.0002] # JAVANESE PADA ADEG +A9CB ; [*02CD.0020.0002] # JAVANESE PADA ADEG ADEG +A9CC ; [*02CE.0020.0002] # JAVANESE PADA PISELEH +A9CD ; [*02CF.0020.0002] # JAVANESE TURNED PADA PISELEH +A9DE ; [*0418.0020.0002] # JAVANESE PADA TIRTA TUMETES +A9DF ; [*0419.0020.0002] # JAVANESE PADA ISEN-ISEN +AA5C ; [*041A.0020.0002] # CHAM PUNCTUATION SPIRAL +AA5D ; [*02A2.0020.0002] # CHAM PUNCTUATION DANDA +AA5E ; [*02A3.0020.0002] # CHAM PUNCTUATION DOUBLE DANDA +AA5F ; [*02A4.0020.0002] # CHAM PUNCTUATION TRIPLE DANDA +AA77 ; [*052D.0020.0002] # MYANMAR SYMBOL AITON EXCLAMATION +AA78 ; [*052E.0020.0002] # MYANMAR SYMBOL AITON ONE +AA79 ; [*052F.0020.0002] # MYANMAR SYMBOL AITON TWO +AADE ; [*03DC.0020.0002] # TAI VIET SYMBOL HO HOI +AADF ; [*03DD.0020.0002] # TAI VIET SYMBOL KOI KOI +AAF0 ; [*02A5.0020.0002] # MEETEI MAYEK CHEIKHAN +AAF1 ; [*0270.0020.0002] # MEETEI MAYEK AHANG KHUDAM +AB5B ; [*04D6.0020.0002] # MODIFIER BREVE WITH INVERTED BREVE +ABEB ; [*02A6.0020.0002] # MEETEI MAYEK CHEIKHEI +FB29 ; [*05F6.0020.0005] # HEBREW LETTER ALTERNATIVE PLUS SIGN +FBB2 ; [*04E3.0020.0002] # ARABIC SYMBOL DOT ABOVE +FBB3 ; [*04E4.0020.0002] # ARABIC SYMBOL DOT BELOW +FBB4 ; [*04E5.0020.0002] # ARABIC SYMBOL TWO DOTS ABOVE +FBB5 ; [*04E6.0020.0002] # ARABIC SYMBOL TWO DOTS BELOW +FBB6 ; [*04E7.0020.0002] # ARABIC SYMBOL THREE DOTS ABOVE +FBB7 ; [*04E8.0020.0002] # ARABIC SYMBOL THREE DOTS BELOW +FBB8 ; [*04E9.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE +FBB9 ; [*04EA.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW +FBBA ; [*04EB.0020.0002] # ARABIC SYMBOL FOUR DOTS ABOVE +FBBB ; [*04EC.0020.0002] # ARABIC SYMBOL FOUR DOTS BELOW +FBBC ; [*04ED.0020.0002] # ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW +FBBD ; [*04EE.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE +FBBE ; [*04EF.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY BELOW +FBBF ; [*04F0.0020.0002] # ARABIC SYMBOL RING +FBC0 ; [*04F1.0020.0002] # ARABIC SYMBOL SMALL TAH ABOVE +FBC1 ; [*04F2.0020.0002] # ARABIC SYMBOL SMALL TAH BELOW +FD3E ; [*037A.0020.0002] # ORNATE LEFT PARENTHESIS +FD3F ; [*037B.0020.0002] # ORNATE RIGHT PARENTHESIS +FDFD ; [*04E2.0020.0002] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE10 ; [*0221.0020.0016] # PRESENTATION FORM FOR VERTICAL COMMA +FE11 ; [*0230.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA +FE12 ; [*0287.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13 ; [*0238.0020.0016] # PRESENTATION FORM FOR VERTICAL COLON +FE14 ; [*0233.0020.0016] # PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15 ; [*025F.0020.0016] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +FE16 ; [*0264.0020.0016] # PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; [*0374.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; [*0375.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; [*0274.0020.0016][*0274.0020.0016][*0274.0020.0016] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE21 ; [.0000.0000.0000] # COMBINING LIGATURE RIGHT HALF +FE23 ; [.0000.0000.0000] # COMBINING DOUBLE TILDE RIGHT HALF +FE24 ; [.0000.0000.0000] # COMBINING MACRON LEFT HALF +FE25 ; [.0000.0000.0000] # COMBINING MACRON RIGHT HALF +FE26 ; [.0000.0000.0000] # COMBINING CONJOINING MACRON +FE28 ; [.0000.0000.0000] # COMBINING LIGATURE RIGHT HALF BELOW +FE2A ; [.0000.0000.0000] # COMBINING TILDE RIGHT HALF BELOW +FE2B ; [.0000.0000.0000] # COMBINING MACRON LEFT HALF BELOW +FE2C ; [.0000.0000.0000] # COMBINING MACRON RIGHT HALF BELOW +FE2D ; [.0000.0000.0000] # COMBINING CONJOINING MACRON BELOW +FE2F ; [.0000.0000.0000] # COMBINING CYRILLIC TITLO RIGHT HALF +FE30 ; [*0274.0020.0016][*0274.0020.0016] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31 ; [*0216.0020.0016] # PRESENTATION FORM FOR VERTICAL EM DASH +FE32 ; [*0215.0020.0016] # PRESENTATION FORM FOR VERTICAL EN DASH +FE33 ; [*020B.0020.0016] # PRESENTATION FORM FOR VERTICAL LOW LINE +FE34 ; [*020B.0020.0016] # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; [*0310.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; [*0311.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; [*0314.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; [*0315.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; [*0372.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; [*0373.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; [*0370.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; [*0371.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; [*036A.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; [*036B.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; [*0368.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; [*0369.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; [*036C.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; [*036D.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; [*036E.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; [*036F.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45 ; [*0231.0020.0002] # SESAME DOT +FE46 ; [*0232.0020.0002] # WHITE SESAME DOT +FE47 ; [*0312.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; [*0313.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49 ; [*020A.0020.0004] # DASHED OVERLINE +FE4A ; [*020A.0020.0004] # CENTRELINE OVERLINE +FE4B ; [*020A.0020.0004] # WAVY OVERLINE +FE4C ; [*020A.0020.0004] # DOUBLE WAVY OVERLINE +FE4D ; [*020B.0020.0004] # DASHED LOW LINE +FE4E ; [*020B.0020.0004] # CENTRELINE LOW LINE +FE4F ; [*020B.0020.0004] # WAVY LOW LINE +FE50 ; [*0221.0020.000F] # SMALL COMMA +FE51 ; [*0230.0020.000F] # SMALL IDEOGRAPHIC COMMA +FE52 ; [*0274.0020.000F] # SMALL FULL STOP +FE54 ; [*0233.0020.000F] # SMALL SEMICOLON +FE55 ; [*0238.0020.000F] # SMALL COLON +FE56 ; [*0264.0020.000F] # SMALL QUESTION MARK +FE57 ; [*025F.0020.000F] # SMALL EXCLAMATION MARK +FE58 ; [*0216.0020.000F] # SMALL EM DASH +FE59 ; [*0310.0020.000F] # SMALL LEFT PARENTHESIS +FE5A ; [*0311.0020.000F] # SMALL RIGHT PARENTHESIS +FE5B ; [*0314.0020.000F] # SMALL LEFT CURLY BRACKET +FE5C ; [*0315.0020.000F] # SMALL RIGHT CURLY BRACKET +FE5D ; [*0372.0020.000F] # SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; [*0373.0020.000F] # SMALL RIGHT TORTOISE SHELL BRACKET +FE5F ; [*0391.0020.000F] # SMALL NUMBER SIGN +FE60 ; [*038F.0020.000F] # SMALL AMPERSAND +FE61 ; [*0388.0020.000F] # SMALL ASTERISK +FE62 ; [*05F6.0020.000F] # SMALL PLUS SIGN +FE63 ; [*020D.0020.000F] # SMALL HYPHEN-MINUS +FE64 ; [*05FA.0020.000F] # SMALL LESS-THAN SIGN +FE65 ; [*05FC.0020.000F] # SMALL GREATER-THAN SIGN +FE66 ; [*05FB.0020.000F] # SMALL EQUALS SIGN +FE68 ; [*038E.0020.000F] # SMALL REVERSE SOLIDUS +FE6A ; [*0392.0020.000F] # SMALL PERCENT SIGN +FE6B ; [*0387.0020.000F] # SMALL COMMERCIAL AT +FE73 ; [.0000.0000.0000] # ARABIC TAIL FRAGMENT +FF01 ; [*025F.0020.0003] # FULLWIDTH EXCLAMATION MARK +FF02 ; [*0305.0020.0003] # FULLWIDTH QUOTATION MARK +FF03 ; [*0391.0020.0003] # FULLWIDTH NUMBER SIGN +FF05 ; [*0392.0020.0003] # FULLWIDTH PERCENT SIGN +FF06 ; [*038F.0020.0003] # FULLWIDTH AMPERSAND +FF07 ; [*02FE.0020.0003] # FULLWIDTH APOSTROPHE +FF08 ; [*0310.0020.0003] # FULLWIDTH LEFT PARENTHESIS +FF09 ; [*0311.0020.0003] # FULLWIDTH RIGHT PARENTHESIS +FF0A ; [*0388.0020.0003] # FULLWIDTH ASTERISK +FF0B ; [*05F6.0020.0003] # FULLWIDTH PLUS SIGN +FF0C ; [*0221.0020.0003] # FULLWIDTH COMMA +FF0D ; [*020D.0020.0003] # FULLWIDTH HYPHEN-MINUS +FF0E ; [*0274.0020.0003] # FULLWIDTH FULL STOP +FF0F ; [*038D.0020.0003] # FULLWIDTH SOLIDUS +FF1A ; [*0238.0020.0003] # FULLWIDTH COLON +FF1B ; [*0233.0020.0003] # FULLWIDTH SEMICOLON +FF1C ; [*05FA.0020.0003] # FULLWIDTH LESS-THAN SIGN +FF1D ; [*05FB.0020.0003] # FULLWIDTH EQUALS SIGN +FF1E ; [*05FC.0020.0003] # FULLWIDTH GREATER-THAN SIGN +FF1F ; [*0264.0020.0003] # FULLWIDTH QUESTION MARK +FF20 ; [*0387.0020.0003] # FULLWIDTH COMMERCIAL AT +FF3B ; [*0312.0020.0003] # FULLWIDTH LEFT SQUARE BRACKET +FF3C ; [*038E.0020.0003] # FULLWIDTH REVERSE SOLIDUS +FF3D ; [*0313.0020.0003] # FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; [*0466.0020.0003] # FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; [*020B.0020.0003] # FULLWIDTH LOW LINE +FF40 ; [*0463.0020.0003] # FULLWIDTH GRAVE ACCENT +FF5B ; [*0314.0020.0003] # FULLWIDTH LEFT CURLY BRACKET +FF5C ; [*05FE.0020.0003] # FULLWIDTH VERTICAL LINE +FF5D ; [*0315.0020.0003] # FULLWIDTH RIGHT CURLY BRACKET +FF5E ; [*0600.0020.0003] # FULLWIDTH TILDE +FF5F ; [*0326.0020.0003] # FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; [*0327.0020.0003] # FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; [*0287.0020.0012] # HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; [*036C.0020.0012] # HALFWIDTH LEFT CORNER BRACKET +FF63 ; [*036D.0020.0012] # HALFWIDTH RIGHT CORNER BRACKET +FF64 ; [*0230.0020.0012] # HALFWIDTH IDEOGRAPHIC COMMA +FF65 ; [*0220.0020.0012] # HALFWIDTH KATAKANA MIDDLE DOT +FFE2 ; [*05FD.0020.0003] # FULLWIDTH NOT SIGN +FFE3 ; [*0467.0020.0003] # FULLWIDTH MACRON +FFE4 ; [*05FF.0020.0003] # FULLWIDTH BROKEN BAR +FFE8 ; [*07F6.0020.0012] # HALFWIDTH FORMS LIGHT VERTICAL +FFE9 ; [*057C.0020.0012] # HALFWIDTH LEFTWARDS ARROW +FFEA ; [*057E.0020.0012] # HALFWIDTH UPWARDS ARROW +FFEB ; [*057D.0020.0012] # HALFWIDTH RIGHTWARDS ARROW +FFEC ; [*057F.0020.0012] # HALFWIDTH DOWNWARDS ARROW +FFED ; [*0894.0020.0012] # HALFWIDTH BLACK SQUARE +FFEE ; [*08BF.0020.0012] # HALFWIDTH WHITE CIRCLE +FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER +10100 ; [*02F3.0020.0002] # AEGEAN WORD SEPARATOR LINE +10101 ; [*02F4.0020.0002] # AEGEAN WORD SEPARATOR DOT +10102 ; [*02F5.0020.0002] # AEGEAN CHECK MARK +10110 ; [*1A6F.0020.0002] # AEGEAN NUMBER TEN +10111 ; [*1A70.0020.0002] # AEGEAN NUMBER TWENTY +10112 ; [*1A71.0020.0002] # AEGEAN NUMBER THIRTY +10113 ; [*1A72.0020.0002] # AEGEAN NUMBER FORTY +10114 ; [*1A73.0020.0002] # AEGEAN NUMBER FIFTY +10115 ; [*1A74.0020.0002] # AEGEAN NUMBER SIXTY +10116 ; [*1A75.0020.0002] # AEGEAN NUMBER SEVENTY +10117 ; [*1A76.0020.0002] # AEGEAN NUMBER EIGHTY +10118 ; [*1A77.0020.0002] # AEGEAN NUMBER NINETY +10119 ; [*1A78.0020.0002] # AEGEAN NUMBER ONE HUNDRED +1011A ; [*1A79.0020.0002] # AEGEAN NUMBER TWO HUNDRED +1011B ; [*1A7A.0020.0002] # AEGEAN NUMBER THREE HUNDRED +1011C ; [*1A7B.0020.0002] # AEGEAN NUMBER FOUR HUNDRED +1011D ; [*1A7C.0020.0002] # AEGEAN NUMBER FIVE HUNDRED +1011E ; [*1A7D.0020.0002] # AEGEAN NUMBER SIX HUNDRED +1011F ; [*1A7E.0020.0002] # AEGEAN NUMBER SEVEN HUNDRED +10120 ; [*1A7F.0020.0002] # AEGEAN NUMBER EIGHT HUNDRED +10121 ; [*1A80.0020.0002] # AEGEAN NUMBER NINE HUNDRED +10122 ; [*1A81.0020.0002] # AEGEAN NUMBER ONE THOUSAND +10123 ; [*1A82.0020.0002] # AEGEAN NUMBER TWO THOUSAND +10124 ; [*1A83.0020.0002] # AEGEAN NUMBER THREE THOUSAND +10125 ; [*1A84.0020.0002] # AEGEAN NUMBER FOUR THOUSAND +10126 ; [*1A85.0020.0002] # AEGEAN NUMBER FIVE THOUSAND +10127 ; [*1A86.0020.0002] # AEGEAN NUMBER SIX THOUSAND +10128 ; [*1A87.0020.0002] # AEGEAN NUMBER SEVEN THOUSAND +10129 ; [*1A88.0020.0002] # AEGEAN NUMBER EIGHT THOUSAND +1012A ; [*1A89.0020.0002] # AEGEAN NUMBER NINE THOUSAND +1012B ; [*1A8A.0020.0002] # AEGEAN NUMBER TEN THOUSAND +1012C ; [*1A8B.0020.0002] # AEGEAN NUMBER TWENTY THOUSAND +1012D ; [*1A8C.0020.0002] # AEGEAN NUMBER THIRTY THOUSAND +1012E ; [*1A8D.0020.0002] # AEGEAN NUMBER FORTY THOUSAND +1012F ; [*1A8E.0020.0002] # AEGEAN NUMBER FIFTY THOUSAND +10130 ; [*1A8F.0020.0002] # AEGEAN NUMBER SIXTY THOUSAND +10131 ; [*1A90.0020.0002] # AEGEAN NUMBER SEVENTY THOUSAND +10132 ; [*1A91.0020.0002] # AEGEAN NUMBER EIGHTY THOUSAND +10133 ; [*1A92.0020.0002] # AEGEAN NUMBER NINETY THOUSAND +10137 ; [*0F54.0020.0002] # AEGEAN WEIGHT BASE UNIT +10138 ; [*0F55.0020.0002] # AEGEAN WEIGHT FIRST SUBUNIT +10139 ; [*0F56.0020.0002] # AEGEAN WEIGHT SECOND SUBUNIT +1013A ; [*0F57.0020.0002] # AEGEAN WEIGHT THIRD SUBUNIT +1013B ; [*0F58.0020.0002] # AEGEAN WEIGHT FOURTH SUBUNIT +1013C ; [*0F59.0020.0002] # AEGEAN DRY MEASURE FIRST SUBUNIT +1013D ; [*0F5A.0020.0002] # AEGEAN LIQUID MEASURE FIRST SUBUNIT +1013E ; [*0F5B.0020.0002] # AEGEAN MEASURE SECOND SUBUNIT +1013F ; [*0F5C.0020.0002] # AEGEAN MEASURE THIRD SUBUNIT +10140 ; [*1A93.0020.0002] # GREEK ACROPHONIC ATTIC ONE QUARTER +10141 ; [*1A94.0020.0002] # GREEK ACROPHONIC ATTIC ONE HALF +10144 ; [*1A95.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY +10145 ; [*1A96.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED +10146 ; [*1A97.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND +10147 ; [*1A98.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND +10149 ; [*1A99.0020.0002] # GREEK ACROPHONIC ATTIC TEN TALENTS +1014A ; [*1A9A.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY TALENTS +1014B ; [*1A9B.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS +1014C ; [*1A9C.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS +1014D ; [*1A9D.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS +1014E ; [*1A9E.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS +10150 ; [*1A9F.0020.0002] # GREEK ACROPHONIC ATTIC TEN STATERS +10151 ; [*1AA0.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY STATERS +10152 ; [*1AA1.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS +10153 ; [*1AA2.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS +10154 ; [*1AA3.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS +10155 ; [*1AA4.0020.0002] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS +10156 ; [*1AA5.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS +10157 ; [*1AA6.0020.0002] # GREEK ACROPHONIC ATTIC TEN MNAS +10160 ; [*1AA7.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN +10161 ; [*1AA8.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM +10162 ; [*1AA9.0020.0002] # GREEK ACROPHONIC HERMIONIAN TEN +10163 ; [*1AAA.0020.0002] # GREEK ACROPHONIC MESSENIAN TEN +10164 ; [*1AAB.0020.0002] # GREEK ACROPHONIC THESPIAN TEN +10165 ; [*1AAC.0020.0002] # GREEK ACROPHONIC THESPIAN THIRTY +10166 ; [*1AAD.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY +10167 ; [*1AAE.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM +10168 ; [*1AAF.0020.0002] # GREEK ACROPHONIC HERMIONIAN FIFTY +10169 ; [*1AB0.0020.0002] # GREEK ACROPHONIC THESPIAN FIFTY +1016A ; [*1AB1.0020.0002] # GREEK ACROPHONIC THESPIAN ONE HUNDRED +1016B ; [*1AB2.0020.0002] # GREEK ACROPHONIC THESPIAN THREE HUNDRED +1016C ; [*1AB3.0020.0002] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED +1016D ; [*1AB4.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED +1016E ; [*1AB5.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED +1016F ; [*1AB6.0020.0002] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED +10170 ; [*1AB7.0020.0002] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED +10171 ; [*1AB8.0020.0002] # GREEK ACROPHONIC THESPIAN ONE THOUSAND +10172 ; [*1AB9.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND +10174 ; [*1ABA.0020.0002] # GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175 ; [*1ABB.0020.0002] # GREEK ONE HALF SIGN +10176 ; [*1ABC.0020.0002] # GREEK ONE HALF SIGN ALTERNATE FORM +10177 ; [*1ABD.0020.0002] # GREEK TWO THIRDS SIGN +10178 ; [*1ABE.0020.0002] # GREEK THREE QUARTERS SIGN +10179 ; [*0F5D.0020.0002] # GREEK YEAR SIGN +1017A ; [*0F5E.0020.0002] # GREEK TALENT SIGN +1017B ; [*0F5F.0020.0002] # GREEK DRACHMA SIGN +1017C ; [*0F60.0020.0002] # GREEK OBOL SIGN +1017D ; [*0F61.0020.0002] # GREEK TWO OBOLS SIGN +1017E ; [*0F62.0020.0002] # GREEK THREE OBOLS SIGN +1017F ; [*0F63.0020.0002] # GREEK FOUR OBOLS SIGN +10180 ; [*0F64.0020.0002] # GREEK FIVE OBOLS SIGN +10181 ; [*0F65.0020.0002] # GREEK METRETES SIGN +10182 ; [*0F66.0020.0002] # GREEK KYATHOS BASE SIGN +10183 ; [*0F67.0020.0002] # GREEK LITRA SIGN +10184 ; [*0F68.0020.0002] # GREEK OUNKIA SIGN +10185 ; [*0F69.0020.0002] # GREEK XESTES SIGN +10186 ; [*0F6A.0020.0002] # GREEK ARTABE SIGN +10187 ; [*0F6B.0020.0002] # GREEK AROURA SIGN +10188 ; [*0F6C.0020.0002] # GREEK GRAMMA SIGN +10189 ; [*0F6D.0020.0002] # GREEK TRYBLION BASE SIGN +1018B ; [*1ABF.0020.0002] # GREEK ONE QUARTER SIGN +1018C ; [*0F6E.0020.0002] # GREEK SINUSOID SIGN +10190 ; [*0F6F.0020.0002] # ROMAN SEXTANS SIGN +10191 ; [*0F70.0020.0002] # ROMAN UNCIA SIGN +10192 ; [*0F71.0020.0002] # ROMAN SEMUNCIA SIGN +10193 ; [*0F72.0020.0002] # ROMAN SEXTULA SIGN +10194 ; [*0F73.0020.0002] # ROMAN DIMIDIA SEXTULA SIGN +10195 ; [*0F74.0020.0002] # ROMAN SILIQUA SIGN +10196 ; [*0F75.0020.0002] # ROMAN DENARIUS SIGN +10197 ; [*0F76.0020.0002] # ROMAN QUINARIUS SIGN +10198 ; [*0F77.0020.0002] # ROMAN SESTERTIUS SIGN +10199 ; [*0F78.0020.0002] # ROMAN DUPONDIUS SIGN +1019A ; [*0F79.0020.0002] # ROMAN AS SIGN +1019B ; [*0F7A.0020.0002] # ROMAN CENTURIAL SIGN +101A0 ; [*0F7B.0020.0002] # GREEK SYMBOL TAU RHO +101D0 ; [*0F7C.0020.0002] # PHAISTOS DISC SIGN PEDESTRIAN +101D1 ; [*0F7D.0020.0002] # PHAISTOS DISC SIGN PLUMED HEAD +101D2 ; [*0F7E.0020.0002] # PHAISTOS DISC SIGN TATTOOED HEAD +101D3 ; [*0F7F.0020.0002] # PHAISTOS DISC SIGN CAPTIVE +101D4 ; [*0F80.0020.0002] # PHAISTOS DISC SIGN CHILD +101D5 ; [*0F81.0020.0002] # PHAISTOS DISC SIGN WOMAN +101D6 ; [*0F82.0020.0002] # PHAISTOS DISC SIGN HELMET +101D7 ; [*0F83.0020.0002] # PHAISTOS DISC SIGN GAUNTLET +101D8 ; [*0F84.0020.0002] # PHAISTOS DISC SIGN TIARA +101D9 ; [*0F85.0020.0002] # PHAISTOS DISC SIGN ARROW +101DA ; [*0F86.0020.0002] # PHAISTOS DISC SIGN BOW +101DB ; [*0F87.0020.0002] # PHAISTOS DISC SIGN SHIELD +101DC ; [*0F88.0020.0002] # PHAISTOS DISC SIGN CLUB +101DD ; [*0F89.0020.0002] # PHAISTOS DISC SIGN MANACLES +101DE ; [*0F8A.0020.0002] # PHAISTOS DISC SIGN MATTOCK +101DF ; [*0F8B.0020.0002] # PHAISTOS DISC SIGN SAW +101E0 ; [*0F8C.0020.0002] # PHAISTOS DISC SIGN LID +101E1 ; [*0F8D.0020.0002] # PHAISTOS DISC SIGN BOOMERANG +101E2 ; [*0F8E.0020.0002] # PHAISTOS DISC SIGN CARPENTRY PLANE +101E3 ; [*0F8F.0020.0002] # PHAISTOS DISC SIGN DOLIUM +101E4 ; [*0F90.0020.0002] # PHAISTOS DISC SIGN COMB +101E5 ; [*0F91.0020.0002] # PHAISTOS DISC SIGN SLING +101E6 ; [*0F92.0020.0002] # PHAISTOS DISC SIGN COLUMN +101E7 ; [*0F93.0020.0002] # PHAISTOS DISC SIGN BEEHIVE +101E8 ; [*0F94.0020.0002] # PHAISTOS DISC SIGN SHIP +101E9 ; [*0F95.0020.0002] # PHAISTOS DISC SIGN HORN +101EA ; [*0F96.0020.0002] # PHAISTOS DISC SIGN HIDE +101EB ; [*0F97.0020.0002] # PHAISTOS DISC SIGN BULLS LEG +101EC ; [*0F98.0020.0002] # PHAISTOS DISC SIGN CAT +101ED ; [*0F99.0020.0002] # PHAISTOS DISC SIGN RAM +101EE ; [*0F9A.0020.0002] # PHAISTOS DISC SIGN EAGLE +101EF ; [*0F9B.0020.0002] # PHAISTOS DISC SIGN DOVE +101F0 ; [*0F9C.0020.0002] # PHAISTOS DISC SIGN TUNNY +101F1 ; [*0F9D.0020.0002] # PHAISTOS DISC SIGN BEE +101F2 ; [*0F9E.0020.0002] # PHAISTOS DISC SIGN PLANE TREE +101F3 ; [*0F9F.0020.0002] # PHAISTOS DISC SIGN VINE +101F4 ; [*0FA0.0020.0002] # PHAISTOS DISC SIGN PAPYRUS +101F5 ; [*0FA1.0020.0002] # PHAISTOS DISC SIGN ROSETTE +101F6 ; [*0FA2.0020.0002] # PHAISTOS DISC SIGN LILY +101F7 ; [*0FA3.0020.0002] # PHAISTOS DISC SIGN OX BACK +101F8 ; [*0FA4.0020.0002] # PHAISTOS DISC SIGN FLUTE +101F9 ; [*0FA5.0020.0002] # PHAISTOS DISC SIGN GRATER +101FA ; [*0FA6.0020.0002] # PHAISTOS DISC SIGN STRAINER +101FB ; [*0FA7.0020.0002] # PHAISTOS DISC SIGN SMALL AXE +101FC ; [*0FA8.0020.0002] # PHAISTOS DISC SIGN WAVY BAND +102E0 ; [.0000.0000.0000] # COPTIC EPACT THOUSANDS MARK +102EA ; [*1AC0.0020.0002] # COPTIC EPACT NUMBER TEN +102EB ; [*1AC1.0020.0002] # COPTIC EPACT NUMBER TWENTY +102EC ; [*1AC2.0020.0002] # COPTIC EPACT NUMBER THIRTY +102ED ; [*1AC3.0020.0002] # COPTIC EPACT NUMBER FORTY +102EE ; [*1AC4.0020.0002] # COPTIC EPACT NUMBER FIFTY +102EF ; [*1AC5.0020.0002] # COPTIC EPACT NUMBER SIXTY +102F0 ; [*1AC6.0020.0002] # COPTIC EPACT NUMBER SEVENTY +102F1 ; [*1AC7.0020.0002] # COPTIC EPACT NUMBER EIGHTY +102F2 ; [*1AC8.0020.0002] # COPTIC EPACT NUMBER NINETY +102F3 ; [*1AC9.0020.0002] # COPTIC EPACT NUMBER ONE HUNDRED +102F4 ; [*1ACA.0020.0002] # COPTIC EPACT NUMBER TWO HUNDRED +102F5 ; [*1ACB.0020.0002] # COPTIC EPACT NUMBER THREE HUNDRED +102F6 ; [*1ACC.0020.0002] # COPTIC EPACT NUMBER FOUR HUNDRED +102F7 ; [*1ACD.0020.0002] # COPTIC EPACT NUMBER FIVE HUNDRED +102F8 ; [*1ACE.0020.0002] # COPTIC EPACT NUMBER SIX HUNDRED +102F9 ; [*1ACF.0020.0002] # COPTIC EPACT NUMBER SEVEN HUNDRED +102FA ; [*1AD0.0020.0002] # COPTIC EPACT NUMBER EIGHT HUNDRED +102FB ; [*1AD1.0020.0002] # COPTIC EPACT NUMBER NINE HUNDRED +10322 ; [*1A69.0020.0002] # OLD ITALIC NUMERAL TEN +10323 ; [*1A6A.0020.0002] # OLD ITALIC NUMERAL FIFTY +1039F ; [*02F6.0020.0002] # UGARITIC WORD DIVIDER +103D0 ; [*02F7.0020.0002] # OLD PERSIAN WORD DIVIDER +103D3 ; [*1AD2.0020.0002] # OLD PERSIAN NUMBER TEN +103D4 ; [*1AD3.0020.0002] # OLD PERSIAN NUMBER TWENTY +103D5 ; [*1AD4.0020.0002] # OLD PERSIAN NUMBER HUNDRED +1056F ; [*041B.0020.0002] # CAUCASIAN ALBANIAN CITATION MARK +10857 ; [*02D2.0020.0002] # IMPERIAL ARAMAIC SECTION SIGN +1085B ; [*1AE4.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN +1085C ; [*1AE5.0020.0002] # IMPERIAL ARAMAIC NUMBER TWENTY +1085D ; [*1AE6.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE HUNDRED +1085E ; [*1AE7.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE THOUSAND +1085F ; [*1AE8.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10877 ; [*0FA9.0020.0002] # PALMYRENE LEFT-POINTING FLEURON +10878 ; [*0FAA.0020.0002] # PALMYRENE RIGHT-POINTING FLEURON +1087E ; [*1AD5.0020.0002] # PALMYRENE NUMBER TEN +1087F ; [*1AD6.0020.0002] # PALMYRENE NUMBER TWENTY +108AD ; [*1AD7.0020.0002] # NABATAEAN NUMBER TEN +108AE ; [*1AD8.0020.0002] # NABATAEAN NUMBER TWENTY +108AF ; [*1AD9.0020.0002] # NABATAEAN NUMBER ONE HUNDRED +108FD ; [*1ADA.0020.0002] # HATRAN NUMBER TEN +108FE ; [*1ADB.0020.0002] # HATRAN NUMBER TWENTY +108FF ; [*1ADC.0020.0002] # HATRAN NUMBER ONE HUNDRED +10917 ; [*1AE1.0020.0002] # PHOENICIAN NUMBER TEN +10918 ; [*1AE2.0020.0002] # PHOENICIAN NUMBER TWENTY +10919 ; [*1AE3.0020.0002] # PHOENICIAN NUMBER ONE HUNDRED +1091F ; [*02F8.0020.0002] # PHOENICIAN WORD SEPARATOR +1093F ; [*02F2.0020.0002] # LYDIAN TRIANGULAR MARK +109BC ; [*1B59.0020.0002] # MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS +109BD ; [*1B4E.0020.0002] # MEROITIC CURSIVE FRACTION ONE HALF +109C9 ; [*1B23.0020.0002] # MEROITIC CURSIVE NUMBER TEN +109CA ; [*1B24.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY +109CB ; [*1B25.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY +109CC ; [*1B26.0020.0002] # MEROITIC CURSIVE NUMBER FORTY +109CD ; [*1B27.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY +109CE ; [*1B28.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY +109CF ; [*1B29.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY +109D2 ; [*1B2A.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED +109D3 ; [*1B2B.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED +109D4 ; [*1B2C.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED +109D5 ; [*1B2D.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED +109D6 ; [*1B2E.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED +109D7 ; [*1B2F.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED +109D8 ; [*1B30.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED +109D9 ; [*1B31.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED +109DA ; [*1B32.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED +109DB ; [*1B33.0020.0002] # MEROITIC CURSIVE NUMBER ONE THOUSAND +109DC ; [*1B34.0020.0002] # MEROITIC CURSIVE NUMBER TWO THOUSAND +109DD ; [*1B35.0020.0002] # MEROITIC CURSIVE NUMBER THREE THOUSAND +109DE ; [*1B36.0020.0002] # MEROITIC CURSIVE NUMBER FOUR THOUSAND +109DF ; [*1B37.0020.0002] # MEROITIC CURSIVE NUMBER FIVE THOUSAND +109E0 ; [*1B38.0020.0002] # MEROITIC CURSIVE NUMBER SIX THOUSAND +109E1 ; [*1B39.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN THOUSAND +109E2 ; [*1B3A.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT THOUSAND +109E3 ; [*1B3B.0020.0002] # MEROITIC CURSIVE NUMBER NINE THOUSAND +109E4 ; [*1B3C.0020.0002] # MEROITIC CURSIVE NUMBER TEN THOUSAND +109E5 ; [*1B3D.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY THOUSAND +109E6 ; [*1B3E.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY THOUSAND +109E7 ; [*1B3F.0020.0002] # MEROITIC CURSIVE NUMBER FORTY THOUSAND +109E8 ; [*1B40.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY THOUSAND +109E9 ; [*1B41.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY THOUSAND +109EA ; [*1B42.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY THOUSAND +109EB ; [*1B43.0020.0002] # MEROITIC CURSIVE NUMBER EIGHTY THOUSAND +109EC ; [*1B44.0020.0002] # MEROITIC CURSIVE NUMBER NINETY THOUSAND +109ED ; [*1B45.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND +109EE ; [*1B46.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND +109EF ; [*1B47.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND +109F0 ; [*1B48.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND +109F1 ; [*1B49.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND +109F2 ; [*1B4A.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND +109F3 ; [*1B4B.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND +109F4 ; [*1B4C.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND +109F5 ; [*1B4D.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND +109F6 ; [*1B4F.0020.0002] # MEROITIC CURSIVE FRACTION ONE TWELFTH +109F7 ; [*1B50.0020.0002] # MEROITIC CURSIVE FRACTION TWO TWELFTHS +109F8 ; [*1B51.0020.0002] # MEROITIC CURSIVE FRACTION THREE TWELFTHS +109F9 ; [*1B52.0020.0002] # MEROITIC CURSIVE FRACTION FOUR TWELFTHS +109FA ; [*1B53.0020.0002] # MEROITIC CURSIVE FRACTION FIVE TWELFTHS +109FB ; [*1B54.0020.0002] # MEROITIC CURSIVE FRACTION SIX TWELFTHS +109FC ; [*1B55.0020.0002] # MEROITIC CURSIVE FRACTION SEVEN TWELFTHS +109FD ; [*1B56.0020.0002] # MEROITIC CURSIVE FRACTION EIGHT TWELFTHS +109FE ; [*1B57.0020.0002] # MEROITIC CURSIVE FRACTION NINE TWELFTHS +109FF ; [*1B58.0020.0002] # MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A44 ; [*1B04.0020.0002] # KHAROSHTHI NUMBER TEN +10A45 ; [*1B05.0020.0002] # KHAROSHTHI NUMBER TWENTY +10A46 ; [*1B06.0020.0002] # KHAROSHTHI NUMBER ONE HUNDRED +10A47 ; [*1B07.0020.0002] # KHAROSHTHI NUMBER ONE THOUSAND +10A50 ; [*0421.0020.0002] # KHAROSHTHI PUNCTUATION DOT +10A51 ; [*0422.0020.0002] # KHAROSHTHI PUNCTUATION SMALL CIRCLE +10A52 ; [*0423.0020.0002] # KHAROSHTHI PUNCTUATION CIRCLE +10A53 ; [*0424.0020.0002] # KHAROSHTHI PUNCTUATION CRESCENT BAR +10A54 ; [*0425.0020.0002] # KHAROSHTHI PUNCTUATION MANGALAM +10A55 ; [*0426.0020.0002] # KHAROSHTHI PUNCTUATION LOTUS +10A56 ; [*02A7.0020.0002] # KHAROSHTHI PUNCTUATION DANDA +10A57 ; [*02A8.0020.0002] # KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58 ; [*0427.0020.0002] # KHAROSHTHI PUNCTUATION LINES +10A7E ; [*1ADD.0020.0002] # OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; [*1ADE.0020.0002] # OLD SOUTH ARABIAN NUMERIC INDICATOR +10A9E ; [*1ADF.0020.0002] # OLD NORTH ARABIAN NUMBER TEN +10A9F ; [*1AE0.0020.0002] # OLD NORTH ARABIAN NUMBER TWENTY +10AED ; [*1AE9.0020.0002] # MANICHAEAN NUMBER TEN +10AEE ; [*1AEA.0020.0002] # MANICHAEAN NUMBER TWENTY +10AEF ; [*1AEB.0020.0002] # MANICHAEAN NUMBER ONE HUNDRED +10AF0 ; [*0429.0020.0002] # MANICHAEAN PUNCTUATION STAR +10AF1 ; [*042A.0020.0002] # MANICHAEAN PUNCTUATION FLEURON +10AF2 ; [*042B.0020.0002] # MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT +10AF3 ; [*042C.0020.0002] # MANICHAEAN PUNCTUATION DOT WITHIN DOT +10AF4 ; [*042D.0020.0002] # MANICHAEAN PUNCTUATION DOT +10AF5 ; [*042E.0020.0002] # MANICHAEAN PUNCTUATION TWO DOTS +10AF6 ; [*042F.0020.0002] # MANICHAEAN PUNCTUATION LINE FILLER +10B39 ; [*0428.0020.0002] # AVESTAN ABBREVIATION MARK +10B3A ; [*02D3.0020.0002] # TINY TWO DOTS OVER ONE DOT PUNCTUATION +10B3B ; [*02D4.0020.0002] # SMALL TWO DOTS OVER ONE DOT PUNCTUATION +10B3C ; [*02D5.0020.0002] # LARGE TWO DOTS OVER ONE DOT PUNCTUATION +10B3D ; [*02D6.0020.0002] # LARGE ONE DOT OVER TWO DOTS PUNCTUATION +10B3E ; [*02D7.0020.0002] # LARGE TWO RINGS OVER ONE RING PUNCTUATION +10B3F ; [*02D8.0020.0002] # LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B5C ; [*1AEC.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TEN +10B5D ; [*1AED.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWENTY +10B5E ; [*1AEE.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED +10B5F ; [*1AEF.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B7C ; [*1AF0.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TEN +10B7D ; [*1AF1.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWENTY +10B7E ; [*1AF2.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED +10B7F ; [*1AF3.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B99 ; [*0430.0020.0002] # PSALTER PAHLAVI SECTION MARK +10B9A ; [*0431.0020.0002] # PSALTER PAHLAVI TURNED SECTION MARK +10B9B ; [*0432.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH CROSS +10B9C ; [*0433.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH DOT +10BAD ; [*1AF4.0020.0002] # PSALTER PAHLAVI NUMBER TEN +10BAE ; [*1AF5.0020.0002] # PSALTER PAHLAVI NUMBER TWENTY +10BAF ; [*1AF6.0020.0002] # PSALTER PAHLAVI NUMBER ONE HUNDRED +10CFC ; [*1A6B.0020.0002] # OLD HUNGARIAN NUMBER TEN +10CFD ; [*1A6C.0020.0002] # OLD HUNGARIAN NUMBER FIFTY +10CFE ; [*1A6D.0020.0002] # OLD HUNGARIAN NUMBER ONE HUNDRED +10CFF ; [*1A6E.0020.0002] # OLD HUNGARIAN NUMBER ONE THOUSAND +10E69 ; [*1A52.0020.0002] # RUMI NUMBER TEN +10E6A ; [*1A53.0020.0002] # RUMI NUMBER TWENTY +10E6B ; [*1A54.0020.0002] # RUMI NUMBER THIRTY +10E6C ; [*1A55.0020.0002] # RUMI NUMBER FORTY +10E6D ; [*1A56.0020.0002] # RUMI NUMBER FIFTY +10E6E ; [*1A57.0020.0002] # RUMI NUMBER SIXTY +10E6F ; [*1A58.0020.0002] # RUMI NUMBER SEVENTY +10E70 ; [*1A59.0020.0002] # RUMI NUMBER EIGHTY +10E71 ; [*1A5A.0020.0002] # RUMI NUMBER NINETY +10E72 ; [*1A5B.0020.0002] # RUMI NUMBER ONE HUNDRED +10E73 ; [*1A5C.0020.0002] # RUMI NUMBER TWO HUNDRED +10E74 ; [*1A5D.0020.0002] # RUMI NUMBER THREE HUNDRED +10E75 ; [*1A5E.0020.0002] # RUMI NUMBER FOUR HUNDRED +10E76 ; [*1A5F.0020.0002] # RUMI NUMBER FIVE HUNDRED +10E77 ; [*1A60.0020.0002] # RUMI NUMBER SIX HUNDRED +10E78 ; [*1A61.0020.0002] # RUMI NUMBER SEVEN HUNDRED +10E79 ; [*1A62.0020.0002] # RUMI NUMBER EIGHT HUNDRED +10E7A ; [*1A63.0020.0002] # RUMI NUMBER NINE HUNDRED +10E7B ; [*1A64.0020.0002] # RUMI FRACTION ONE HALF +10E7C ; [*1A65.0020.0002] # RUMI FRACTION ONE QUARTER +10E7D ; [*1A66.0020.0002] # RUMI FRACTION ONE THIRD +10E7E ; [*1A67.0020.0002] # RUMI FRACTION TWO THIRDS +11047 ; [*02A9.0020.0002] # BRAHMI DANDA +11048 ; [*02AA.0020.0002] # BRAHMI DOUBLE DANDA +11049 ; [*041C.0020.0002] # BRAHMI PUNCTUATION DOT +1104A ; [*041D.0020.0002] # BRAHMI PUNCTUATION DOUBLE DOT +1104B ; [*041E.0020.0002] # BRAHMI PUNCTUATION LINE +1104C ; [*041F.0020.0002] # BRAHMI PUNCTUATION CRESCENT BAR +1104D ; [*0420.0020.0002] # BRAHMI PUNCTUATION LOTUS +1105B ; [*1AF9.0020.0002] # BRAHMI NUMBER TEN +1105C ; [*1AFA.0020.0002] # BRAHMI NUMBER TWENTY +1105D ; [*1AFB.0020.0002] # BRAHMI NUMBER THIRTY +1105E ; [*1AFC.0020.0002] # BRAHMI NUMBER FORTY +1105F ; [*1AFD.0020.0002] # BRAHMI NUMBER FIFTY +11060 ; [*1AFE.0020.0002] # BRAHMI NUMBER SIXTY +11061 ; [*1AFF.0020.0002] # BRAHMI NUMBER SEVENTY +11062 ; [*1B00.0020.0002] # BRAHMI NUMBER EIGHTY +11063 ; [*1B01.0020.0002] # BRAHMI NUMBER NINETY +11064 ; [*1B02.0020.0002] # BRAHMI NUMBER ONE HUNDRED +11065 ; [*1B03.0020.0002] # BRAHMI NUMBER ONE THOUSAND +110BB ; [*0434.0020.0002] # KAITHI ABBREVIATION SIGN +110BC ; [*0435.0020.0002] # KAITHI ENUMERATION SIGN +110BD ; [.0000.0000.0000] # KAITHI NUMBER SIGN +110BE ; [*02D9.0020.0002] # KAITHI SECTION MARK +110BF ; [*02DA.0020.0002] # KAITHI DOUBLE SECTION MARK +110C0 ; [*02AB.0020.0002] # KAITHI DANDA +110C1 ; [*02AC.0020.0002] # KAITHI DOUBLE DANDA +11140 ; [*02DB.0020.0002] # CHAKMA SECTION MARK +11141 ; [*02AD.0020.0002] # CHAKMA DANDA +11142 ; [*02AE.0020.0002] # CHAKMA DOUBLE DANDA +11143 ; [*0271.0020.0002] # CHAKMA QUESTION MARK +11174 ; [*0436.0020.0002] # MAHAJANI ABBREVIATION SIGN +11175 ; [*0437.0020.0002] # MAHAJANI SECTION MARK +111C5 ; [*02AF.0020.0002] # SHARADA DANDA +111C6 ; [*02B0.0020.0002] # SHARADA DOUBLE DANDA +111C7 ; [*0439.0020.0002] # SHARADA ABBREVIATION SIGN +111C8 ; [*02DC.0020.0002] # SHARADA SEPARATOR +111C9 ; [*043A.0020.0002] # SHARADA SANDHI MARK +111CD ; [*0438.0020.0002] # SHARADA SUTRA MARK +111DB ; [*043B.0020.0002] # SHARADA SIGN SIDDHAM +111DD ; [*043C.0020.0002] # SHARADA CONTINUATION SIGN +111DE ; [*02DD.0020.0002] # SHARADA SECTION MARK-1 +111DF ; [*02DE.0020.0002] # SHARADA SECTION MARK-2 +111EA ; [*1B08.0020.0002] # SINHALA ARCHAIC NUMBER TEN +111EB ; [*1B09.0020.0002] # SINHALA ARCHAIC NUMBER TWENTY +111EC ; [*1B0A.0020.0002] # SINHALA ARCHAIC NUMBER THIRTY +111ED ; [*1B0B.0020.0002] # SINHALA ARCHAIC NUMBER FORTY +111EE ; [*1B0C.0020.0002] # SINHALA ARCHAIC NUMBER FIFTY +111EF ; [*1B0D.0020.0002] # SINHALA ARCHAIC NUMBER SIXTY +111F0 ; [*1B0E.0020.0002] # SINHALA ARCHAIC NUMBER SEVENTY +111F1 ; [*1B0F.0020.0002] # SINHALA ARCHAIC NUMBER EIGHTY +111F2 ; [*1B10.0020.0002] # SINHALA ARCHAIC NUMBER NINETY +111F3 ; [*1B11.0020.0002] # SINHALA ARCHAIC NUMBER ONE HUNDRED +111F4 ; [*1B12.0020.0002] # SINHALA ARCHAIC NUMBER ONE THOUSAND +11238 ; [*02B1.0020.0002] # KHOJKI DANDA +11239 ; [*02B2.0020.0002] # KHOJKI DOUBLE DANDA +1123A ; [*043D.0020.0002] # KHOJKI WORD SEPARATOR +1123B ; [*043E.0020.0002] # KHOJKI SECTION MARK +1123C ; [*043F.0020.0002] # KHOJKI DOUBLE SECTION MARK +1123D ; [*0440.0020.0002] # KHOJKI ABBREVIATION SIGN +112A9 ; [*02DF.0020.0002] # MULTANI SECTION MARK +11366 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT ZERO +11367 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT ONE +11368 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT TWO +11369 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT THREE +1136A ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT FOUR +1136B ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT FIVE +1136C ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT SIX +11370 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER A +11371 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER KA +11372 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER NA +11373 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER VI +11374 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER PA +114C6 ; [*0441.0020.0002] # TIRHUTA ABBREVIATION SIGN +115C1 ; [*0442.0020.0002] # SIDDHAM SIGN SIDDHAM +115C2 ; [*02B3.0020.0002] # SIDDHAM DANDA +115C3 ; [*02B4.0020.0002] # SIDDHAM DOUBLE DANDA +115C4 ; [*0443.0020.0002] # SIDDHAM SEPARATOR DOT +115C5 ; [*0444.0020.0002] # SIDDHAM SEPARATOR BAR +115C6 ; [*0445.0020.0002] # SIDDHAM REPETITION MARK-1 +115C7 ; [*0446.0020.0002] # SIDDHAM REPETITION MARK-2 +115C8 ; [*0447.0020.0002] # SIDDHAM REPETITION MARK-3 +115C9 ; [*0448.0020.0002] # SIDDHAM END OF TEXT MARK +115CA ; [*0449.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS +115CB ; [*044A.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS +115CC ; [*044B.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS +115CD ; [*044C.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS +115CE ; [*044D.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS +115CF ; [*044E.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING +115D0 ; [*044F.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING WITH RAYS +115D1 ; [*0450.0020.0002] # SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS +115D2 ; [*0451.0020.0002] # SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS +115D3 ; [*0452.0020.0002] # SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS +115D4 ; [*0453.0020.0002] # SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS +115D5 ; [*0454.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND RAYS +115D6 ; [*0455.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES +115D7 ; [*0456.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +11641 ; [*02B5.0020.0002] # MODI DANDA +11642 ; [*02B6.0020.0002] # MODI DOUBLE DANDA +11643 ; [*0457.0020.0002] # MODI ABBREVIATION SIGN +1173A ; [*1AF7.0020.0002] # AHOM NUMBER TEN +1173B ; [*1AF8.0020.0002] # AHOM NUMBER TWENTY +1173C ; [*02B7.0020.0002] # AHOM SIGN SMALL SECTION +1173D ; [*02B8.0020.0002] # AHOM SIGN SECTION +1173E ; [*02E0.0020.0002] # AHOM SIGN RULAI +1173F ; [*0530.0020.0002] # AHOM SYMBOL VI +118EA ; [*1B13.0020.0002] # WARANG CITI NUMBER TEN +118EB ; [*1B14.0020.0002] # WARANG CITI NUMBER TWENTY +118EC ; [*1B15.0020.0002] # WARANG CITI NUMBER THIRTY +118ED ; [*1B16.0020.0002] # WARANG CITI NUMBER FORTY +118EE ; [*1B17.0020.0002] # WARANG CITI NUMBER FIFTY +118EF ; [*1B18.0020.0002] # WARANG CITI NUMBER SIXTY +118F0 ; [*1B19.0020.0002] # WARANG CITI NUMBER SEVENTY +118F1 ; [*1B1A.0020.0002] # WARANG CITI NUMBER EIGHTY +118F2 ; [*1B1B.0020.0002] # WARANG CITI NUMBER NINETY +12432 ; [*1B5A.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH +12433 ; [*1B5B.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN +1245A ; [*1B5C.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH +1245B ; [*1B5D.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH +1245C ; [*1B5E.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH +1245D ; [*1B5F.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A +1245E ; [*1B60.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A +1245F ; [*1B61.0020.0002] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH +12460 ; [*1B62.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH +12461 ; [*1B63.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH +12462 ; [*1B64.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER +12463 ; [*1B65.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER GUR +12464 ; [*1B66.0020.0002] # CUNEIFORM NUMERIC SIGN ONE HALF GUR +12465 ; [*1B67.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD +12466 ; [*1B68.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS +12467 ; [*1B69.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FORTY +12468 ; [*1B6A.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FIFTY +12470 ; [*02F9.0020.0002] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER +12471 ; [*02FA.0020.0002] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON +12472 ; [*02FB.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON +12473 ; [*02FC.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON +12474 ; [*02FD.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +16A6E ; [*02B9.0020.0002] # MRO DANDA +16A6F ; [*02BA.0020.0002] # MRO DOUBLE DANDA +16AF5 ; [*0285.0020.0002] # BASSA VAH FULL STOP +16B37 ; [*0458.0020.0002] # PAHAWH HMONG SIGN VOS THOM +16B38 ; [*0459.0020.0002] # PAHAWH HMONG SIGN VOS TSHAB CEEB +16B39 ; [*045A.0020.0002] # PAHAWH HMONG SIGN CIM CHEEM +16B3A ; [*045B.0020.0002] # PAHAWH HMONG SIGN VOS THIAB +16B3B ; [*045C.0020.0002] # PAHAWH HMONG SIGN VOS FEEM +16B3C ; [*0FAB.0020.0002] # PAHAWH HMONG SIGN XYEEM NTXIV +16B3D ; [*0FAC.0020.0002] # PAHAWH HMONG SIGN XYEEM RHO +16B3E ; [*0FAD.0020.0002] # PAHAWH HMONG SIGN XYEEM TOV +16B3F ; [*0FAE.0020.0002] # PAHAWH HMONG SIGN XYEEM FAIB +16B44 ; [*045D.0020.0002] # PAHAWH HMONG SIGN XAUS +16B45 ; [*0FAF.0020.0002] # PAHAWH HMONG SIGN CIM TSOV ROG +16B5B ; [*1B1C.0020.0002] # PAHAWH HMONG NUMBER TENS +16B5C ; [*1B1D.0020.0002] # PAHAWH HMONG NUMBER HUNDREDS +16B5D ; [*1B1E.0020.0002] # PAHAWH HMONG NUMBER TEN THOUSANDS +16B5E ; [*1B1F.0020.0002] # PAHAWH HMONG NUMBER MILLIONS +16B5F ; [*1B20.0020.0002] # PAHAWH HMONG NUMBER HUNDRED MILLIONS +16B60 ; [*1B21.0020.0002] # PAHAWH HMONG NUMBER TEN BILLIONS +16B61 ; [*1B22.0020.0002] # PAHAWH HMONG NUMBER TRILLIONS +1BC9C ; [*11A0.0020.0002] # DUPLOYAN SIGN O WITH CROSS +1BC9F ; [*0286.0020.0002] # DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1D000 ; [*0FB0.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILI +1D001 ; [*0FB1.0020.0002] # BYZANTINE MUSICAL SYMBOL DASEIA +1D002 ; [*0FB2.0020.0002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI +1D003 ; [*0FB3.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON +1D004 ; [*0FB4.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI +1D005 ; [*0FB5.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON +1D006 ; [*0FB6.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI +1D007 ; [*0FB7.0020.0002] # BYZANTINE MUSICAL SYMBOL KATHISTI +1D008 ; [*0FB8.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMATIKI +1D009 ; [*0FB9.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI +1D00A ; [*0FBA.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS +1D00B ; [*0FBB.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI +1D00C ; [*0FBC.0020.0002] # BYZANTINE MUSICAL SYMBOL KREMASTI +1D00D ; [*0FBD.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON +1D00E ; [*0FBE.0020.0002] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON +1D00F ; [*0FBF.0020.0002] # BYZANTINE MUSICAL SYMBOL TELEIA +1D010 ; [*0FC0.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA +1D011 ; [*0FC1.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS +1D012 ; [*0FC2.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI +1D013 ; [*0FC3.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNEVMA +1D014 ; [*0FC4.0020.0002] # BYZANTINE MUSICAL SYMBOL THITA +1D015 ; [*0FC5.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION +1D016 ; [*0FC6.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION +1D017 ; [*0FC7.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILON +1D018 ; [*0FC8.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILON +1D019 ; [*0FC9.0020.0002] # BYZANTINE MUSICAL SYMBOL VATHY +1D01A ; [*0FCA.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION +1D01B ; [*0FCB.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION +1D01C ; [*0FCC.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION +1D01D ; [*0FCD.0020.0002] # BYZANTINE MUSICAL SYMBOL SAXIMATA +1D01E ; [*0FCE.0020.0002] # BYZANTINE MUSICAL SYMBOL PARICHON +1D01F ; [*0FCF.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA +1D020 ; [*0FD0.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION +1D021 ; [*0FD1.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION +1D022 ; [*0FD2.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION +1D023 ; [*0FD3.0020.0002] # BYZANTINE MUSICAL SYMBOL APOTHEMA +1D024 ; [*0FD4.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA +1D025 ; [*0FD5.0020.0002] # BYZANTINE MUSICAL SYMBOL REVMA +1D026 ; [*0FD6.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION +1D027 ; [*0FD7.0020.0002] # BYZANTINE MUSICAL SYMBOL TINAGMA +1D028 ; [*0FD8.0020.0002] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA +1D029 ; [*0FD9.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA +1D02A ; [*0FDA.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION +1D02B ; [*0FDB.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU +1D02C ; [*0FDC.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION +1D02D ; [*0FDD.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA +1D02E ; [*0FDE.0020.0002] # BYZANTINE MUSICAL SYMBOL LEMOI +1D02F ; [*0FDF.0020.0002] # BYZANTINE MUSICAL SYMBOL DYO +1D030 ; [*0FE0.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIA +1D031 ; [*0FE1.0020.0002] # BYZANTINE MUSICAL SYMBOL TESSERA +1D032 ; [*0FE2.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMATA +1D033 ; [*0FE3.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO +1D034 ; [*0FE4.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION +1D035 ; [*0FE5.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORA +1D036 ; [*0FE6.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION +1D037 ; [*0FE7.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON +1D038 ; [*0FE8.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON +1D039 ; [*0FE9.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON +1D03A ; [*0FEA.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA +1D03B ; [*0FEB.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION +1D03C ; [*0FEC.0020.0002] # BYZANTINE MUSICAL SYMBOL RAPISMA +1D03D ; [*0FED.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION +1D03E ; [*0FEE.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION +1D03F ; [*0FEF.0020.0002] # BYZANTINE MUSICAL SYMBOL ICHADIN +1D040 ; [*0FF0.0020.0002] # BYZANTINE MUSICAL SYMBOL NANA +1D041 ; [*0FF1.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASMA +1D042 ; [*0FF2.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO +1D043 ; [*0FF3.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO +1D044 ; [*0FF4.0020.0002] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA +1D045 ; [*0FF5.0020.0002] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA +1D046 ; [*0FF6.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON NEO +1D047 ; [*0FF7.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON NEO +1D048 ; [*0FF8.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA NEO +1D049 ; [*0FF9.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTI +1D04A ; [*0FFA.0020.0002] # BYZANTINE MUSICAL SYMBOL KOUFISMA +1D04B ; [*0FFB.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA +1D04C ; [*0FFC.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA +1D04D ; [*0FFD.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON NEO +1D04E ; [*0FFE.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO +1D04F ; [*0FFF.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO +1D050 ; [*1000.0020.0002] # BYZANTINE MUSICAL SYMBOL YPSILI +1D051 ; [*1001.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO +1D052 ; [*1002.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO +1D053 ; [*1003.0020.0002] # BYZANTINE MUSICAL SYMBOL YPORROI +1D054 ; [*1004.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON +1D055 ; [*1005.0020.0002] # BYZANTINE MUSICAL SYMBOL ELAFRON +1D056 ; [*1006.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILI +1D057 ; [*1007.0020.0002] # BYZANTINE MUSICAL SYMBOL MIKRON ISON +1D058 ; [*1008.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA NEO +1D059 ; [*1009.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA NEO +1D05A ; [*100A.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO +1D05B ; [*100B.0020.0002] # BYZANTINE MUSICAL SYMBOL OMALON +1D05C ; [*100C.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA +1D05D ; [*100D.0020.0002] # BYZANTINE MUSICAL SYMBOL LYGISMA +1D05E ; [*100E.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO +1D05F ; [*100F.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO +1D060 ; [*1010.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA +1D061 ; [*1011.0020.0002] # BYZANTINE MUSICAL SYMBOL KYLISMA +1D062 ; [*1012.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA +1D063 ; [*1013.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO +1D064 ; [*1014.0020.0002] # BYZANTINE MUSICAL SYMBOL EKSTREPTON +1D065 ; [*1015.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO +1D066 ; [*1016.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMA +1D067 ; [*1017.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO +1D068 ; [*1018.0020.0002] # BYZANTINE MUSICAL SYMBOL EPEGERMA +1D069 ; [*1019.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA NEO +1D06A ; [*101A.0020.0002] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA +1D06B ; [*101B.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON +1D06C ; [*101C.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA +1D06D ; [*101D.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA +1D06E ; [*101E.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA +1D06F ; [*101F.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA +1D070 ; [*1020.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA +1D071 ; [*1021.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA +1D072 ; [*1022.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON +1D073 ; [*1023.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON +1D074 ; [*1024.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON +1D075 ; [*1025.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO +1D076 ; [*1026.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO +1D077 ; [*1027.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO +1D078 ; [*1028.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN +1D079 ; [*1029.0020.0002] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES +1D07A ; [*102A.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVASMA +1D07B ; [*102B.0020.0002] # BYZANTINE MUSICAL SYMBOL ENDOFONON +1D07C ; [*102C.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN KATO +1D07D ; [*102D.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN ANO +1D07E ; [*102E.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS +1D07F ; [*102F.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA ANO +1D080 ; [*1030.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION +1D081 ; [*1031.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION +1D082 ; [*1032.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO +1D083 ; [*1033.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO +1D084 ; [*1034.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA NEO +1D085 ; [*1035.0020.0002] # BYZANTINE MUSICAL SYMBOL APLI +1D086 ; [*1036.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI +1D087 ; [*1037.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIPLI +1D088 ; [*1038.0020.0002] # BYZANTINE MUSICAL SYMBOL TETRAPLI +1D089 ; [*1039.0020.0002] # BYZANTINE MUSICAL SYMBOL KORONIS +1D08A ; [*103A.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU +1D08B ; [*103B.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON +1D08C ; [*103C.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON +1D08D ; [*103D.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON +1D08E ; [*103E.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU +1D08F ; [*103F.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO +1D090 ; [*1040.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA +1D091 ; [*1041.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA +1D092 ; [*1042.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON +1D093 ; [*1043.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO +1D094 ; [*1044.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO +1D095 ; [*1045.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA +1D096 ; [*1046.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIGORGON +1D097 ; [*1047.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGON +1D098 ; [*1048.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIDIARGON +1D099 ; [*1049.0020.0002] # BYZANTINE MUSICAL SYMBOL DIARGON +1D09A ; [*104A.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI +1D09B ; [*104B.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI +1D09C ; [*104C.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI +1D09D ; [*104D.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA +1D09E ; [*104E.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI MESI +1D09F ; [*104F.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI +1D0A0 ; [*1050.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI +1D0A1 ; [*1051.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI +1D0A2 ; [*1052.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS +1D0A3 ; [*1053.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS +1D0A4 ; [*1054.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS +1D0A5 ; [*1055.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS +1D0A6 ; [*1056.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS +1D0A7 ; [*1057.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS +1D0A8 ; [*1058.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS +1D0A9 ; [*1059.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS +1D0AA ; [*105A.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS +1D0AB ; [*105B.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS +1D0AC ; [*105C.0020.0002] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS +1D0AD ; [*105D.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS +1D0AE ; [*105E.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS +1D0AF ; [*105F.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS +1D0B0 ; [*1060.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS +1D0B1 ; [*1061.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS +1D0B2 ; [*1062.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS +1D0B3 ; [*1063.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS +1D0B4 ; [*1064.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN +1D0B5 ; [*1065.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN +1D0B6 ; [*1066.0020.0002] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU +1D0B7 ; [*1067.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFONON +1D0B8 ; [*1068.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORON +1D0B9 ; [*1069.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU +1D0BA ; [*106A.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA +1D0BB ; [*106B.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA +1D0BC ; [*106C.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS +1D0BD ; [*106D.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI +1D0BE ; [*106E.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI +1D0BF ; [*106F.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE +1D0C0 ; [*1070.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO +1D0C1 ; [*1071.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO +1D0C2 ; [*1072.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO +1D0C3 ; [*1073.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS +1D0C4 ; [*1074.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS +1D0C5 ; [*1075.0020.0002] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS +1D0C6 ; [*1076.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI +1D0C7 ; [*1077.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO +1D0C8 ; [*1078.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS +1D0C9 ; [*1079.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA KLITON +1D0CA ; [*107A.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI +1D0CB ; [*107B.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION +1D0CC ; [*107C.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA +1D0CD ; [*107D.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION +1D0CE ; [*107E.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION +1D0CF ; [*107F.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION +1D0D0 ; [*1080.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA +1D0D1 ; [*1081.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA +1D0D2 ; [*1082.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA +1D0D3 ; [*1083.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA +1D0D4 ; [*1084.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA +1D0D5 ; [*1085.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA +1D0D6 ; [*1086.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA +1D0D7 ; [*1087.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA +1D0D8 ; [*1088.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS +1D0D9 ; [*1089.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS +1D0DA ; [*108A.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI +1D0DB ; [*108B.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI +1D0DC ; [*108C.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI +1D0DD ; [*108D.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS +1D0DE ; [*108E.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS +1D0DF ; [*108F.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU +1D0E0 ; [*1090.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU +1D0E1 ; [*1091.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU +1D0E2 ; [*1092.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS +1D0E3 ; [*1093.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU +1D0E4 ; [*1094.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU +1D0E5 ; [*1095.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU +1D0E6 ; [*1096.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG +1D0E7 ; [*1097.0020.0002] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU +1D0E8 ; [*1098.0020.0002] # BYZANTINE MUSICAL SYMBOL STIGMA +1D0E9 ; [*1099.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA +1D0EA ; [*109A.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU +1D0EB ; [*109B.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA +1D0EC ; [*109C.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI +1D0ED ; [*109D.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE +1D0EE ; [*109E.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO +1D0EF ; [*109F.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI +1D0F0 ; [*10A0.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO +1D0F1 ; [*10A1.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO +1D0F2 ; [*10A2.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO +1D0F3 ; [*10A3.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO +1D0F4 ; [*10A4.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA KATO +1D0F5 ; [*10A5.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100 ; [*10A6.0020.0002] # MUSICAL SYMBOL SINGLE BARLINE +1D101 ; [*10A7.0020.0002] # MUSICAL SYMBOL DOUBLE BARLINE +1D102 ; [*10A8.0020.0002] # MUSICAL SYMBOL FINAL BARLINE +1D103 ; [*10A9.0020.0002] # MUSICAL SYMBOL REVERSE FINAL BARLINE +1D104 ; [*10AA.0020.0002] # MUSICAL SYMBOL DASHED BARLINE +1D105 ; [*10AB.0020.0002] # MUSICAL SYMBOL SHORT BARLINE +1D106 ; [*10AC.0020.0002] # MUSICAL SYMBOL LEFT REPEAT SIGN +1D107 ; [*10AD.0020.0002] # MUSICAL SYMBOL RIGHT REPEAT SIGN +1D108 ; [*10AE.0020.0002] # MUSICAL SYMBOL REPEAT DOTS +1D109 ; [*10AF.0020.0002] # MUSICAL SYMBOL DAL SEGNO +1D10A ; [*10B0.0020.0002] # MUSICAL SYMBOL DA CAPO +1D10B ; [*10B1.0020.0002] # MUSICAL SYMBOL SEGNO +1D10C ; [*10B2.0020.0002] # MUSICAL SYMBOL CODA +1D10D ; [*10B3.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-1 +1D10E ; [*10B4.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-2 +1D10F ; [*10B5.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-3 +1D110 ; [*10B6.0020.0002] # MUSICAL SYMBOL FERMATA +1D111 ; [*10B7.0020.0002] # MUSICAL SYMBOL FERMATA BELOW +1D112 ; [*10B8.0020.0002] # MUSICAL SYMBOL BREATH MARK +1D113 ; [*10B9.0020.0002] # MUSICAL SYMBOL CAESURA +1D114 ; [*10BA.0020.0002] # MUSICAL SYMBOL BRACE +1D115 ; [*10BB.0020.0002] # MUSICAL SYMBOL BRACKET +1D116 ; [*10BC.0020.0002] # MUSICAL SYMBOL ONE-LINE STAFF +1D117 ; [*10BD.0020.0002] # MUSICAL SYMBOL TWO-LINE STAFF +1D118 ; [*10BE.0020.0002] # MUSICAL SYMBOL THREE-LINE STAFF +1D119 ; [*10BF.0020.0002] # MUSICAL SYMBOL FOUR-LINE STAFF +1D11A ; [*10C0.0020.0002] # MUSICAL SYMBOL FIVE-LINE STAFF +1D11B ; [*10C1.0020.0002] # MUSICAL SYMBOL SIX-LINE STAFF +1D11C ; [*10C2.0020.0002] # MUSICAL SYMBOL SIX-STRING FRETBOARD +1D11D ; [*10C3.0020.0002] # MUSICAL SYMBOL FOUR-STRING FRETBOARD +1D11E ; [*10C4.0020.0002] # MUSICAL SYMBOL G CLEF +1D11F ; [*10C5.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA ALTA +1D120 ; [*10C6.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA BASSA +1D121 ; [*10C7.0020.0002] # MUSICAL SYMBOL C CLEF +1D122 ; [*10C8.0020.0002] # MUSICAL SYMBOL F CLEF +1D123 ; [*10C9.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA ALTA +1D124 ; [*10CA.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA BASSA +1D125 ; [*10CB.0020.0002] # MUSICAL SYMBOL DRUM CLEF-1 +1D126 ; [*10CC.0020.0002] # MUSICAL SYMBOL DRUM CLEF-2 +1D129 ; [*10E0.0020.0002] # MUSICAL SYMBOL MULTIPLE MEASURE REST +1D12A ; [*10D0.0020.0002] # MUSICAL SYMBOL DOUBLE SHARP +1D12B ; [*10D1.0020.0002] # MUSICAL SYMBOL DOUBLE FLAT +1D12C ; [*10D2.0020.0002] # MUSICAL SYMBOL FLAT UP +1D12D ; [*10D3.0020.0002] # MUSICAL SYMBOL FLAT DOWN +1D12E ; [*10D4.0020.0002] # MUSICAL SYMBOL NATURAL UP +1D12F ; [*10D5.0020.0002] # MUSICAL SYMBOL NATURAL DOWN +1D130 ; [*10D6.0020.0002] # MUSICAL SYMBOL SHARP UP +1D131 ; [*10D7.0020.0002] # MUSICAL SYMBOL SHARP DOWN +1D132 ; [*10D8.0020.0002] # MUSICAL SYMBOL QUARTER TONE SHARP +1D133 ; [*10D9.0020.0002] # MUSICAL SYMBOL QUARTER TONE FLAT +1D134 ; [*10DA.0020.0002] # MUSICAL SYMBOL COMMON TIME +1D135 ; [*10DB.0020.0002] # MUSICAL SYMBOL CUT TIME +1D136 ; [*10DC.0020.0002] # MUSICAL SYMBOL OTTAVA ALTA +1D137 ; [*10DD.0020.0002] # MUSICAL SYMBOL OTTAVA BASSA +1D138 ; [*10DE.0020.0002] # MUSICAL SYMBOL QUINDICESIMA ALTA +1D139 ; [*10DF.0020.0002] # MUSICAL SYMBOL QUINDICESIMA BASSA +1D13A ; [*10E1.0020.0002] # MUSICAL SYMBOL MULTI REST +1D13B ; [*10E2.0020.0002] # MUSICAL SYMBOL WHOLE REST +1D13C ; [*10E3.0020.0002] # MUSICAL SYMBOL HALF REST +1D13D ; [*10E4.0020.0002] # MUSICAL SYMBOL QUARTER REST +1D13E ; [*10E5.0020.0002] # MUSICAL SYMBOL EIGHTH REST +1D13F ; [*10E6.0020.0002] # MUSICAL SYMBOL SIXTEENTH REST +1D140 ; [*10E7.0020.0002] # MUSICAL SYMBOL THIRTY-SECOND REST +1D141 ; [*10E8.0020.0002] # MUSICAL SYMBOL SIXTY-FOURTH REST +1D142 ; [*10E9.0020.0002] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST +1D143 ; [*10EA.0020.0002] # MUSICAL SYMBOL X NOTEHEAD +1D144 ; [*10EB.0020.0002] # MUSICAL SYMBOL PLUS NOTEHEAD +1D145 ; [*10EC.0020.0002] # MUSICAL SYMBOL CIRCLE X NOTEHEAD +1D146 ; [*10ED.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE +1D147 ; [*10EE.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK +1D148 ; [*10EF.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE +1D149 ; [*10F0.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK +1D14A ; [*10F1.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE +1D14B ; [*10F2.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK +1D14C ; [*10F3.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE +1D14D ; [*10F4.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK +1D14E ; [*10F5.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE +1D14F ; [*10F6.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK +1D150 ; [*10F7.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE +1D151 ; [*10F8.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK +1D152 ; [*10F9.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD WHITE +1D153 ; [*10FA.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD BLACK +1D154 ; [*10FB.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE +1D155 ; [*10FC.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK +1D156 ; [*10FD.0020.0002] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD +1D157 ; [*10FE.0020.0002] # MUSICAL SYMBOL VOID NOTEHEAD +1D158 ; [*10FF.0020.0002] # MUSICAL SYMBOL NOTEHEAD BLACK +1D159 ; [*1100.0020.0002] # MUSICAL SYMBOL NULL NOTEHEAD +1D15A ; [*1101.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE +1D15B ; [*1102.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK +1D15C ; [*1103.0020.0002] # MUSICAL SYMBOL BREVE +1D15D ; [*1104.0020.0002] # MUSICAL SYMBOL WHOLE NOTE +1D15E ; [*10FE.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL HALF NOTE +1D15F ; [*10FF.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL QUARTER NOTE +1D160 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL EIGHTH NOTE +1D161 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTEENTH NOTE +1D162 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING STEM +1D166 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-1 +1D168 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-2 +1D169 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A ; [*1105.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-1 +1D16B ; [*1106.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-2 +1D16C ; [*1107.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING AUGMENTATION DOT +1D16E ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-1 +1D16F ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-2 +1D170 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-3 +1D171 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-4 +1D172 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-5 +1D17B ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING ACCENT +1D17C ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING STACCATO +1D17D ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TENUTO +1D17E ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING STACCATISSIMO +1D17F ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING MARCATO +1D180 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING MARCATO-STACCATO +1D181 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING ACCENT-STACCATO +1D182 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING LOURE +1D183 ; [*1108.0020.0002] # MUSICAL SYMBOL ARPEGGIATO UP +1D184 ; [*1109.0020.0002] # MUSICAL SYMBOL ARPEGGIATO DOWN +1D185 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOIT +1D186 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING RIP +1D187 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLIP +1D188 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING SMEAR +1D189 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING BEND +1D18A ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOUBLE TONGUE +1D18B ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C ; [*110A.0020.0002] # MUSICAL SYMBOL RINFORZANDO +1D18D ; [*110B.0020.0002] # MUSICAL SYMBOL SUBITO +1D18E ; [*110C.0020.0002] # MUSICAL SYMBOL Z +1D18F ; [*110D.0020.0002] # MUSICAL SYMBOL PIANO +1D190 ; [*110E.0020.0002] # MUSICAL SYMBOL MEZZO +1D191 ; [*110F.0020.0002] # MUSICAL SYMBOL FORTE +1D192 ; [*1110.0020.0002] # MUSICAL SYMBOL CRESCENDO +1D193 ; [*1111.0020.0002] # MUSICAL SYMBOL DECRESCENDO +1D194 ; [*1112.0020.0002] # MUSICAL SYMBOL GRACE NOTE SLASH +1D195 ; [*1113.0020.0002] # MUSICAL SYMBOL GRACE NOTE NO SLASH +1D196 ; [*1114.0020.0002] # MUSICAL SYMBOL TR +1D197 ; [*1115.0020.0002] # MUSICAL SYMBOL TURN +1D198 ; [*1116.0020.0002] # MUSICAL SYMBOL INVERTED TURN +1D199 ; [*1117.0020.0002] # MUSICAL SYMBOL TURN SLASH +1D19A ; [*1118.0020.0002] # MUSICAL SYMBOL TURN UP +1D19B ; [*1119.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-1 +1D19C ; [*111A.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-2 +1D19D ; [*111B.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-3 +1D19E ; [*111C.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-4 +1D19F ; [*111D.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-5 +1D1A0 ; [*111E.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-6 +1D1A1 ; [*111F.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-7 +1D1A2 ; [*1120.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-8 +1D1A3 ; [*1121.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-9 +1D1A4 ; [*1122.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-10 +1D1A5 ; [*1123.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-11 +1D1A6 ; [*1124.0020.0002] # MUSICAL SYMBOL HAUPTSTIMME +1D1A7 ; [*1125.0020.0002] # MUSICAL SYMBOL NEBENSTIMME +1D1A8 ; [*1126.0020.0002] # MUSICAL SYMBOL END OF STIMME +1D1A9 ; [*1127.0020.0002] # MUSICAL SYMBOL DEGREE SLASH +1D1AA ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOWN BOW +1D1AB ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING UP BOW +1D1AC ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING HARMONIC +1D1AD ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE ; [*1128.0020.0002] # MUSICAL SYMBOL PEDAL MARK +1D1AF ; [*1129.0020.0002] # MUSICAL SYMBOL PEDAL UP MARK +1D1B0 ; [*112A.0020.0002] # MUSICAL SYMBOL HALF PEDAL MARK +1D1B1 ; [*112B.0020.0002] # MUSICAL SYMBOL GLISSANDO UP +1D1B2 ; [*112C.0020.0002] # MUSICAL SYMBOL GLISSANDO DOWN +1D1B3 ; [*112D.0020.0002] # MUSICAL SYMBOL WITH FINGERNAILS +1D1B4 ; [*112E.0020.0002] # MUSICAL SYMBOL DAMP +1D1B5 ; [*112F.0020.0002] # MUSICAL SYMBOL DAMP ALL +1D1B6 ; [*1130.0020.0002] # MUSICAL SYMBOL MAXIMA +1D1B7 ; [*1131.0020.0002] # MUSICAL SYMBOL LONGA +1D1B8 ; [*1132.0020.0002] # MUSICAL SYMBOL BREVIS +1D1B9 ; [*1133.0020.0002] # MUSICAL SYMBOL SEMIBREVIS WHITE +1D1BA ; [*1134.0020.0002] # MUSICAL SYMBOL SEMIBREVIS BLACK +1D1BB ; [*1133.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA +1D1BC ; [*1134.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA BLACK +1D1BD ; [*1133.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE ; [*1134.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF ; [*1133.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA WHITE +1D1C0 ; [*1134.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA BLACK +1D1C1 ; [*1135.0020.0002] # MUSICAL SYMBOL LONGA PERFECTA REST +1D1C2 ; [*1136.0020.0002] # MUSICAL SYMBOL LONGA IMPERFECTA REST +1D1C3 ; [*1137.0020.0002] # MUSICAL SYMBOL BREVIS REST +1D1C4 ; [*1138.0020.0002] # MUSICAL SYMBOL SEMIBREVIS REST +1D1C5 ; [*1139.0020.0002] # MUSICAL SYMBOL MINIMA REST +1D1C6 ; [*113A.0020.0002] # MUSICAL SYMBOL SEMIMINIMA REST +1D1C7 ; [*113B.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA +1D1C8 ; [*113C.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA +1D1C9 ; [*113D.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 +1D1CA ; [*113E.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA +1D1CB ; [*113F.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA +1D1CC ; [*1140.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 +1D1CD ; [*1141.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 +1D1CE ; [*1142.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 +1D1CF ; [*1143.0020.0002] # MUSICAL SYMBOL CROIX +1D1D0 ; [*1144.0020.0002] # MUSICAL SYMBOL GREGORIAN C CLEF +1D1D1 ; [*1145.0020.0002] # MUSICAL SYMBOL GREGORIAN F CLEF +1D1D2 ; [*1146.0020.0002] # MUSICAL SYMBOL SQUARE B +1D1D3 ; [*1147.0020.0002] # MUSICAL SYMBOL VIRGA +1D1D4 ; [*1148.0020.0002] # MUSICAL SYMBOL PODATUS +1D1D5 ; [*1149.0020.0002] # MUSICAL SYMBOL CLIVIS +1D1D6 ; [*114A.0020.0002] # MUSICAL SYMBOL SCANDICUS +1D1D7 ; [*114B.0020.0002] # MUSICAL SYMBOL CLIMACUS +1D1D8 ; [*114C.0020.0002] # MUSICAL SYMBOL TORCULUS +1D1D9 ; [*114D.0020.0002] # MUSICAL SYMBOL PORRECTUS +1D1DA ; [*114E.0020.0002] # MUSICAL SYMBOL PORRECTUS FLEXUS +1D1DB ; [*114F.0020.0002] # MUSICAL SYMBOL SCANDICUS FLEXUS +1D1DC ; [*1150.0020.0002] # MUSICAL SYMBOL TORCULUS RESUPINUS +1D1DD ; [*1151.0020.0002] # MUSICAL SYMBOL PES SUBPUNCTIS +1D1DE ; [*1152.0020.0002] # MUSICAL SYMBOL KIEVAN C CLEF +1D1DF ; [*1153.0020.0002] # MUSICAL SYMBOL KIEVAN END OF PIECE +1D1E0 ; [*1154.0020.0002] # MUSICAL SYMBOL KIEVAN FINAL NOTE +1D1E1 ; [*1155.0020.0002] # MUSICAL SYMBOL KIEVAN RECITATIVE MARK +1D1E2 ; [*1156.0020.0002] # MUSICAL SYMBOL KIEVAN WHOLE NOTE +1D1E3 ; [*1157.0020.0002] # MUSICAL SYMBOL KIEVAN HALF NOTE +1D1E4 ; [*1158.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN +1D1E5 ; [*1159.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP +1D1E6 ; [*115A.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN +1D1E7 ; [*115B.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP +1D1E8 ; [*115C.0020.0002] # MUSICAL SYMBOL KIEVAN FLAT SIGN +1D200 ; [*115D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-1 +1D201 ; [*115E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-2 +1D202 ; [*115F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-3 +1D203 ; [*1160.0020.0002] # GREEK VOCAL NOTATION SYMBOL-4 +1D204 ; [*1161.0020.0002] # GREEK VOCAL NOTATION SYMBOL-5 +1D205 ; [*1162.0020.0002] # GREEK VOCAL NOTATION SYMBOL-6 +1D206 ; [*1163.0020.0002] # GREEK VOCAL NOTATION SYMBOL-7 +1D207 ; [*1164.0020.0002] # GREEK VOCAL NOTATION SYMBOL-8 +1D208 ; [*1165.0020.0002] # GREEK VOCAL NOTATION SYMBOL-9 +1D209 ; [*1166.0020.0002] # GREEK VOCAL NOTATION SYMBOL-10 +1D20A ; [*1167.0020.0002] # GREEK VOCAL NOTATION SYMBOL-11 +1D20B ; [*1168.0020.0002] # GREEK VOCAL NOTATION SYMBOL-12 +1D20C ; [*1169.0020.0002] # GREEK VOCAL NOTATION SYMBOL-13 +1D20D ; [*116A.0020.0002] # GREEK VOCAL NOTATION SYMBOL-14 +1D20E ; [*116B.0020.0002] # GREEK VOCAL NOTATION SYMBOL-15 +1D20F ; [*116C.0020.0002] # GREEK VOCAL NOTATION SYMBOL-16 +1D210 ; [*116D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-17 +1D211 ; [*116E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-18 +1D212 ; [*116F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-19 +1D213 ; [*1170.0020.0002] # GREEK VOCAL NOTATION SYMBOL-20 +1D214 ; [*1171.0020.0002] # GREEK VOCAL NOTATION SYMBOL-21 +1D215 ; [*1172.0020.0002] # GREEK VOCAL NOTATION SYMBOL-22 +1D216 ; [*1173.0020.0002] # GREEK VOCAL NOTATION SYMBOL-23 +1D217 ; [*1174.0020.0002] # GREEK VOCAL NOTATION SYMBOL-24 +1D218 ; [*1175.0020.0002] # GREEK VOCAL NOTATION SYMBOL-50 +1D219 ; [*1176.0020.0002] # GREEK VOCAL NOTATION SYMBOL-51 +1D21A ; [*1177.0020.0002] # GREEK VOCAL NOTATION SYMBOL-52 +1D21B ; [*1178.0020.0002] # GREEK VOCAL NOTATION SYMBOL-53 +1D21C ; [*1179.0020.0002] # GREEK VOCAL NOTATION SYMBOL-54 +1D21D ; [*117A.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-1 +1D21E ; [*117B.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-2 +1D21F ; [*117C.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-4 +1D220 ; [*117D.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-5 +1D221 ; [*117E.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-7 +1D222 ; [*117F.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-8 +1D223 ; [*1180.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-11 +1D224 ; [*1181.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-12 +1D225 ; [*1182.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-13 +1D226 ; [*1183.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-14 +1D227 ; [*1184.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-17 +1D228 ; [*1185.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-18 +1D229 ; [*1186.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-19 +1D22A ; [*1187.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-23 +1D22B ; [*1188.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-24 +1D22C ; [*1189.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-25 +1D22D ; [*118A.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-26 +1D22E ; [*118B.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-27 +1D22F ; [*118C.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-29 +1D230 ; [*118D.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-30 +1D231 ; [*118E.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-32 +1D232 ; [*118F.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-36 +1D233 ; [*1190.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-37 +1D234 ; [*1191.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-38 +1D235 ; [*1192.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-39 +1D236 ; [*1193.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-40 +1D237 ; [*1194.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-42 +1D238 ; [*1195.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-43 +1D239 ; [*1196.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-45 +1D23A ; [*1197.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-47 +1D23B ; [*1198.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-48 +1D23C ; [*1199.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-49 +1D23D ; [*119A.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-50 +1D23E ; [*119B.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-51 +1D23F ; [*119C.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-52 +1D240 ; [*119D.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-53 +1D241 ; [*119E.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL TRISEME +1D243 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL TETRASEME +1D244 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL PENTASEME +1D245 ; [*119F.0020.0002] # GREEK MUSICAL LEIMMA +1D300 ; [*0EC6.0020.0002] # MONOGRAM FOR EARTH +1D301 ; [*0EC7.0020.0002] # DIGRAM FOR HEAVENLY EARTH +1D302 ; [*0EC8.0020.0002] # DIGRAM FOR HUMAN EARTH +1D303 ; [*0EC9.0020.0002] # DIGRAM FOR EARTHLY HEAVEN +1D304 ; [*0ECA.0020.0002] # DIGRAM FOR EARTHLY HUMAN +1D305 ; [*0ECB.0020.0002] # DIGRAM FOR EARTH +1D306 ; [*0ECC.0020.0002] # TETRAGRAM FOR CENTRE +1D307 ; [*0ECD.0020.0002] # TETRAGRAM FOR FULL CIRCLE +1D308 ; [*0ECE.0020.0002] # TETRAGRAM FOR MIRED +1D309 ; [*0ECF.0020.0002] # TETRAGRAM FOR BARRIER +1D30A ; [*0ED0.0020.0002] # TETRAGRAM FOR KEEPING SMALL +1D30B ; [*0ED1.0020.0002] # TETRAGRAM FOR CONTRARIETY +1D30C ; [*0ED2.0020.0002] # TETRAGRAM FOR ASCENT +1D30D ; [*0ED3.0020.0002] # TETRAGRAM FOR OPPOSITION +1D30E ; [*0ED4.0020.0002] # TETRAGRAM FOR BRANCHING OUT +1D30F ; [*0ED5.0020.0002] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION +1D310 ; [*0ED6.0020.0002] # TETRAGRAM FOR DIVERGENCE +1D311 ; [*0ED7.0020.0002] # TETRAGRAM FOR YOUTHFULNESS +1D312 ; [*0ED8.0020.0002] # TETRAGRAM FOR INCREASE +1D313 ; [*0ED9.0020.0002] # TETRAGRAM FOR PENETRATION +1D314 ; [*0EDA.0020.0002] # TETRAGRAM FOR REACH +1D315 ; [*0EDB.0020.0002] # TETRAGRAM FOR CONTACT +1D316 ; [*0EDC.0020.0002] # TETRAGRAM FOR HOLDING BACK +1D317 ; [*0EDD.0020.0002] # TETRAGRAM FOR WAITING +1D318 ; [*0EDE.0020.0002] # TETRAGRAM FOR FOLLOWING +1D319 ; [*0EDF.0020.0002] # TETRAGRAM FOR ADVANCE +1D31A ; [*0EE0.0020.0002] # TETRAGRAM FOR RELEASE +1D31B ; [*0EE1.0020.0002] # TETRAGRAM FOR RESISTANCE +1D31C ; [*0EE2.0020.0002] # TETRAGRAM FOR EASE +1D31D ; [*0EE3.0020.0002] # TETRAGRAM FOR JOY +1D31E ; [*0EE4.0020.0002] # TETRAGRAM FOR CONTENTION +1D31F ; [*0EE5.0020.0002] # TETRAGRAM FOR ENDEAVOUR +1D320 ; [*0EE6.0020.0002] # TETRAGRAM FOR DUTIES +1D321 ; [*0EE7.0020.0002] # TETRAGRAM FOR CHANGE +1D322 ; [*0EE8.0020.0002] # TETRAGRAM FOR DECISIVENESS +1D323 ; [*0EE9.0020.0002] # TETRAGRAM FOR BOLD RESOLUTION +1D324 ; [*0EEA.0020.0002] # TETRAGRAM FOR PACKING +1D325 ; [*0EEB.0020.0002] # TETRAGRAM FOR LEGION +1D326 ; [*0EEC.0020.0002] # TETRAGRAM FOR CLOSENESS +1D327 ; [*0EED.0020.0002] # TETRAGRAM FOR KINSHIP +1D328 ; [*0EEE.0020.0002] # TETRAGRAM FOR GATHERING +1D329 ; [*0EEF.0020.0002] # TETRAGRAM FOR STRENGTH +1D32A ; [*0EF0.0020.0002] # TETRAGRAM FOR PURITY +1D32B ; [*0EF1.0020.0002] # TETRAGRAM FOR FULLNESS +1D32C ; [*0EF2.0020.0002] # TETRAGRAM FOR RESIDENCE +1D32D ; [*0EF3.0020.0002] # TETRAGRAM FOR LAW OR MODEL +1D32E ; [*0EF4.0020.0002] # TETRAGRAM FOR RESPONSE +1D32F ; [*0EF5.0020.0002] # TETRAGRAM FOR GOING TO MEET +1D330 ; [*0EF6.0020.0002] # TETRAGRAM FOR ENCOUNTERS +1D331 ; [*0EF7.0020.0002] # TETRAGRAM FOR STOVE +1D332 ; [*0EF8.0020.0002] # TETRAGRAM FOR GREATNESS +1D333 ; [*0EF9.0020.0002] # TETRAGRAM FOR ENLARGEMENT +1D334 ; [*0EFA.0020.0002] # TETRAGRAM FOR PATTERN +1D335 ; [*0EFB.0020.0002] # TETRAGRAM FOR RITUAL +1D336 ; [*0EFC.0020.0002] # TETRAGRAM FOR FLIGHT +1D337 ; [*0EFD.0020.0002] # TETRAGRAM FOR VASTNESS OR WASTING +1D338 ; [*0EFE.0020.0002] # TETRAGRAM FOR CONSTANCY +1D339 ; [*0EFF.0020.0002] # TETRAGRAM FOR MEASURE +1D33A ; [*0F00.0020.0002] # TETRAGRAM FOR ETERNITY +1D33B ; [*0F01.0020.0002] # TETRAGRAM FOR UNITY +1D33C ; [*0F02.0020.0002] # TETRAGRAM FOR DIMINISHMENT +1D33D ; [*0F03.0020.0002] # TETRAGRAM FOR CLOSED MOUTH +1D33E ; [*0F04.0020.0002] # TETRAGRAM FOR GUARDEDNESS +1D33F ; [*0F05.0020.0002] # TETRAGRAM FOR GATHERING IN +1D340 ; [*0F06.0020.0002] # TETRAGRAM FOR MASSING +1D341 ; [*0F07.0020.0002] # TETRAGRAM FOR ACCUMULATION +1D342 ; [*0F08.0020.0002] # TETRAGRAM FOR EMBELLISHMENT +1D343 ; [*0F09.0020.0002] # TETRAGRAM FOR DOUBT +1D344 ; [*0F0A.0020.0002] # TETRAGRAM FOR WATCH +1D345 ; [*0F0B.0020.0002] # TETRAGRAM FOR SINKING +1D346 ; [*0F0C.0020.0002] # TETRAGRAM FOR INNER +1D347 ; [*0F0D.0020.0002] # TETRAGRAM FOR DEPARTURE +1D348 ; [*0F0E.0020.0002] # TETRAGRAM FOR DARKENING +1D349 ; [*0F0F.0020.0002] # TETRAGRAM FOR DIMMING +1D34A ; [*0F10.0020.0002] # TETRAGRAM FOR EXHAUSTION +1D34B ; [*0F11.0020.0002] # TETRAGRAM FOR SEVERANCE +1D34C ; [*0F12.0020.0002] # TETRAGRAM FOR STOPPAGE +1D34D ; [*0F13.0020.0002] # TETRAGRAM FOR HARDNESS +1D34E ; [*0F14.0020.0002] # TETRAGRAM FOR COMPLETION +1D34F ; [*0F15.0020.0002] # TETRAGRAM FOR CLOSURE +1D350 ; [*0F16.0020.0002] # TETRAGRAM FOR FAILURE +1D351 ; [*0F17.0020.0002] # TETRAGRAM FOR AGGRAVATION +1D352 ; [*0F18.0020.0002] # TETRAGRAM FOR COMPLIANCE +1D353 ; [*0F19.0020.0002] # TETRAGRAM FOR ON THE VERGE +1D354 ; [*0F1A.0020.0002] # TETRAGRAM FOR DIFFICULTIES +1D355 ; [*0F1B.0020.0002] # TETRAGRAM FOR LABOURING +1D356 ; [*0F1C.0020.0002] # TETRAGRAM FOR FOSTERING +1D369 ; [*1B6B.0020.0002] # COUNTING ROD TENS DIGIT ONE +1D36A ; [*1B6C.0020.0002] # COUNTING ROD TENS DIGIT TWO +1D36B ; [*1B6D.0020.0002] # COUNTING ROD TENS DIGIT THREE +1D36C ; [*1B6E.0020.0002] # COUNTING ROD TENS DIGIT FOUR +1D36D ; [*1B6F.0020.0002] # COUNTING ROD TENS DIGIT FIVE +1D36E ; [*1B70.0020.0002] # COUNTING ROD TENS DIGIT SIX +1D36F ; [*1B71.0020.0002] # COUNTING ROD TENS DIGIT SEVEN +1D370 ; [*1B72.0020.0002] # COUNTING ROD TENS DIGIT EIGHT +1D371 ; [*1B73.0020.0002] # COUNTING ROD TENS DIGIT NINE +1D6C1 ; [*05EC.0020.0005] # MATHEMATICAL BOLD NABLA +1D6DB ; [*05E8.0020.0005] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6FB ; [*05EC.0020.0005] # MATHEMATICAL ITALIC NABLA +1D715 ; [*05E8.0020.0005] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D735 ; [*05EC.0020.0005] # MATHEMATICAL BOLD ITALIC NABLA +1D74F ; [*05E8.0020.0005] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D76F ; [*05EC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD NABLA +1D789 ; [*05E8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D7A9 ; [*05EC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7C3 ; [*05E8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D800 ; [*17CF.0020.0002] # SIGNWRITING HAND-FIST INDEX +1D801 ; [*17D0.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX +1D802 ; [*17D1.0020.0002] # SIGNWRITING HAND-CUP INDEX +1D803 ; [*17D2.0020.0002] # SIGNWRITING HAND-OVAL INDEX +1D804 ; [*17D3.0020.0002] # SIGNWRITING HAND-HINGE INDEX +1D805 ; [*17D4.0020.0002] # SIGNWRITING HAND-ANGLE INDEX +1D806 ; [*17D5.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT +1D807 ; [*17D6.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX BENT +1D808 ; [*17D7.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT +1D809 ; [*17D8.0020.0002] # SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE +1D80A ; [*17D9.0020.0002] # SIGNWRITING HAND-FIST INDEX CUPPED +1D80B ; [*17DA.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED +1D80C ; [*17DB.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED LOW +1D80D ; [*17DC.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX HINGE +1D80E ; [*17DD.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE +1D80F ; [*17DE.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE +1D810 ; [*17DF.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT +1D811 ; [*17E0.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES +1D812 ; [*17E1.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED +1D813 ; [*17E2.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED +1D814 ; [*17E3.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP +1D815 ; [*17E4.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED +1D816 ; [*17E5.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT +1D817 ; [*17E6.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT +1D818 ; [*17E7.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED +1D819 ; [*17E8.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED +1D81A ; [*17E9.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED +1D81B ; [*17EA.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED +1D81C ; [*17EB.0020.0002] # SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX +1D81D ; [*17EC.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE +1D81E ; [*17ED.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB +1D81F ; [*17EE.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB +1D820 ; [*17EF.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT +1D821 ; [*17F0.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT +1D822 ; [*17F1.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT +1D823 ; [*17F2.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE +1D824 ; [*17F3.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE +1D825 ; [*17F4.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED +1D826 ; [*17F5.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE +1D827 ; [*17F6.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD +1D828 ; [*17F7.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED +1D829 ; [*17F8.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED +1D82A ; [*17F9.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED +1D82B ; [*17FA.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED +1D82C ; [*17FB.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT +1D82D ; [*17FC.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE +1D82E ; [*17FD.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED +1D82F ; [*17FE.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT +1D830 ; [*17FF.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP +1D831 ; [*1800.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP +1D832 ; [*1801.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE +1D833 ; [*1802.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE +1D834 ; [*1803.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD +1D835 ; [*1804.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD +1D836 ; [*1805.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP +1D837 ; [*1806.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP +1D838 ; [*1807.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP +1D839 ; [*1808.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED +1D83A ; [*1809.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP +1D83B ; [*180A.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP +1D83C ; [*180B.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP +1D83D ; [*180C.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED +1D83E ; [*180D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT +1D83F ; [*180E.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED +1D840 ; [*180F.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP +1D841 ; [*1810.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED +1D842 ; [*1811.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP +1D843 ; [*1812.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED +1D844 ; [*1813.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS +1D845 ; [*1814.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS BENT +1D846 ; [*1815.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS HINGED +1D847 ; [*1816.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED +1D848 ; [*1817.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT +1D849 ; [*1818.0020.0002] # SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED +1D84A ; [*1819.0020.0002] # SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT +1D84B ; [*181A.0020.0002] # SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED +1D84C ; [*181B.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD +1D84D ; [*181C.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD +1D84E ; [*181D.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT +1D84F ; [*181E.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT +1D850 ; [*181F.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT +1D851 ; [*1820.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT +1D852 ; [*1821.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD +1D853 ; [*1822.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD +1D854 ; [*1823.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN +1D855 ; [*1824.0020.0002] # SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN +1D856 ; [*1825.0020.0002] # SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD +1D857 ; [*1826.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED +1D858 ; [*1827.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE +1D859 ; [*1828.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB +1D85A ; [*1829.0020.0002] # SIGNWRITING HAND-FLAT +1D85B ; [*182A.0020.0002] # SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS +1D85C ; [*182B.0020.0002] # SIGNWRITING HAND-FLAT HEEL +1D85D ; [*182C.0020.0002] # SIGNWRITING HAND-FLAT THUMB SIDE +1D85E ; [*182D.0020.0002] # SIGNWRITING HAND-FLAT HEEL THUMB SIDE +1D85F ; [*182E.0020.0002] # SIGNWRITING HAND-FLAT THUMB BENT +1D860 ; [*182F.0020.0002] # SIGNWRITING HAND-FLAT THUMB FORWARD +1D861 ; [*1830.0020.0002] # SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE +1D862 ; [*1831.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE +1D863 ; [*1832.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE +1D864 ; [*1833.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT +1D865 ; [*1834.0020.0002] # SIGNWRITING HAND-FLAT SPLIT LITTLE +1D866 ; [*1835.0020.0002] # SIGNWRITING HAND-CLAW +1D867 ; [*1836.0020.0002] # SIGNWRITING HAND-CLAW THUMB SIDE +1D868 ; [*1837.0020.0002] # SIGNWRITING HAND-CLAW NO THUMB +1D869 ; [*1838.0020.0002] # SIGNWRITING HAND-CLAW THUMB FORWARD +1D86A ; [*1839.0020.0002] # SIGNWRITING HAND-HOOK CURLICUE +1D86B ; [*183A.0020.0002] # SIGNWRITING HAND-HOOK +1D86C ; [*183B.0020.0002] # SIGNWRITING HAND-CUP OPEN +1D86D ; [*183C.0020.0002] # SIGNWRITING HAND-CUP +1D86E ; [*183D.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB SIDE +1D86F ; [*183E.0020.0002] # SIGNWRITING HAND-CUP THUMB SIDE +1D870 ; [*183F.0020.0002] # SIGNWRITING HAND-CUP OPEN NO THUMB +1D871 ; [*1840.0020.0002] # SIGNWRITING HAND-CUP NO THUMB +1D872 ; [*1841.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB FORWARD +1D873 ; [*1842.0020.0002] # SIGNWRITING HAND-CUP THUMB FORWARD +1D874 ; [*1843.0020.0002] # SIGNWRITING HAND-CURLICUE OPEN +1D875 ; [*1844.0020.0002] # SIGNWRITING HAND-CURLICUE +1D876 ; [*1845.0020.0002] # SIGNWRITING HAND-CIRCLE +1D877 ; [*1846.0020.0002] # SIGNWRITING HAND-OVAL +1D878 ; [*1847.0020.0002] # SIGNWRITING HAND-OVAL THUMB SIDE +1D879 ; [*1848.0020.0002] # SIGNWRITING HAND-OVAL NO THUMB +1D87A ; [*1849.0020.0002] # SIGNWRITING HAND-OVAL THUMB FORWARD +1D87B ; [*184A.0020.0002] # SIGNWRITING HAND-HINGE OPEN +1D87C ; [*184B.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB FORWARD +1D87D ; [*184C.0020.0002] # SIGNWRITING HAND-HINGE +1D87E ; [*184D.0020.0002] # SIGNWRITING HAND-HINGE SMALL +1D87F ; [*184E.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB SIDE +1D880 ; [*184F.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE +1D881 ; [*1850.0020.0002] # SIGNWRITING HAND-HINGE OPEN NO THUMB +1D882 ; [*1851.0020.0002] # SIGNWRITING HAND-HINGE NO THUMB +1D883 ; [*1852.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX +1D884 ; [*1853.0020.0002] # SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING +1D885 ; [*1854.0020.0002] # SIGNWRITING HAND-ANGLE +1D886 ; [*1855.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING +1D887 ; [*1856.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING +1D888 ; [*1857.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING +1D889 ; [*1858.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE RING +1D88A ; [*1859.0020.0002] # SIGNWRITING HAND-HINGE LITTLE +1D88B ; [*185A.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT +1D88C ; [*185B.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED +1D88D ; [*185C.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED +1D88E ; [*185D.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN +1D88F ; [*185E.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT +1D890 ; [*185F.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED +1D891 ; [*1860.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED +1D892 ; [*1861.0020.0002] # SIGNWRITING HAND-FIST LITTLE UP +1D893 ; [*1862.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP +1D894 ; [*1863.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE UP +1D895 ; [*1864.0020.0002] # SIGNWRITING HAND-OVAL LITTLE UP +1D896 ; [*1865.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE UP +1D897 ; [*1866.0020.0002] # SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE +1D898 ; [*1867.0020.0002] # SIGNWRITING HAND-FIST LITTLE BENT +1D899 ; [*1868.0020.0002] # SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB +1D89A ; [*1869.0020.0002] # SIGNWRITING HAND-FIST LITTLE THUMB +1D89B ; [*186A.0020.0002] # SIGNWRITING HAND-HINGE LITTLE THUMB +1D89C ; [*186B.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX THUMB +1D89D ; [*186C.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX THUMB +1D89E ; [*186D.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT +1D89F ; [*186E.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB +1D8A0 ; [*186F.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX +1D8A1 ; [*1870.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE INDEX +1D8A2 ; [*1871.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX +1D8A3 ; [*1872.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX +1D8A4 ; [*1873.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE +1D8A5 ; [*1874.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE +1D8A6 ; [*1875.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE +1D8A7 ; [*1876.0020.0002] # SIGNWRITING HAND-HINGE RING +1D8A8 ; [*1877.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE +1D8A9 ; [*1878.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE +1D8AA ; [*1879.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE +1D8AB ; [*187A.0020.0002] # SIGNWRITING HAND-FIST RING DOWN +1D8AC ; [*187B.0020.0002] # SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE +1D8AD ; [*187C.0020.0002] # SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS +1D8AE ; [*187D.0020.0002] # SIGNWRITING HAND-FIST RING UP +1D8AF ; [*187E.0020.0002] # SIGNWRITING HAND-FIST RING RAISED KNUCKLE +1D8B0 ; [*187F.0020.0002] # SIGNWRITING HAND-FIST RING LITTLE +1D8B1 ; [*1880.0020.0002] # SIGNWRITING HAND-CIRCLE RING LITTLE +1D8B2 ; [*1881.0020.0002] # SIGNWRITING HAND-OVAL RING LITTLE +1D8B3 ; [*1882.0020.0002] # SIGNWRITING HAND-ANGLE RING LITTLE +1D8B4 ; [*1883.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE +1D8B5 ; [*1884.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE CONJOINED +1D8B6 ; [*1885.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES +1D8B7 ; [*1886.0020.0002] # SIGNWRITING HAND-FIST RING INDEX +1D8B8 ; [*1887.0020.0002] # SIGNWRITING HAND-FIST RING THUMB +1D8B9 ; [*1888.0020.0002] # SIGNWRITING HAND-HOOK RING THUMB +1D8BA ; [*1889.0020.0002] # SIGNWRITING HAND-FIST INDEX RING LITTLE +1D8BB ; [*188A.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX RING LITTLE +1D8BC ; [*188B.0020.0002] # SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON +1D8BD ; [*188C.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT +1D8BE ; [*188D.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE IN +1D8BF ; [*188E.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER +1D8C0 ; [*188F.0020.0002] # SIGNWRITING HAND-CUP INDEX RING LITTLE +1D8C1 ; [*1890.0020.0002] # SIGNWRITING HAND-HINGE INDEX RING LITTLE +1D8C2 ; [*1891.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT +1D8C3 ; [*1892.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE +1D8C4 ; [*1893.0020.0002] # SIGNWRITING HAND-FIST MIDDLE DOWN +1D8C5 ; [*1894.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE +1D8C6 ; [*1895.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP +1D8C7 ; [*1896.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE UP +1D8C8 ; [*1897.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE +1D8C9 ; [*1898.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE +1D8CA ; [*1899.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE THUMB +1D8CB ; [*189A.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE +1D8CC ; [*189B.0020.0002] # SIGNWRITING HAND-FIST MIDDLE LITTLE +1D8CD ; [*189C.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RING LITTLE +1D8CE ; [*189D.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE +1D8CF ; [*189E.0020.0002] # SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON +1D8D0 ; [*189F.0020.0002] # SIGNWRITING HAND-CUP MIDDLE RING LITTLE +1D8D1 ; [*18A0.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE RING LITTLE +1D8D2 ; [*18A1.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT +1D8D3 ; [*18A2.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN +1D8D4 ; [*18A3.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE +1D8D5 ; [*18A4.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT +1D8D6 ; [*18A5.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED +1D8D7 ; [*18A6.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE +1D8D8 ; [*18A7.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT +1D8D9 ; [*18A8.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN +1D8DA ; [*18A9.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED +1D8DB ; [*18AA.0020.0002] # SIGNWRITING HAND-HINGE INDEX HINGED +1D8DC ; [*18AB.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE +1D8DD ; [*18AC.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SIDE +1D8DE ; [*18AD.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL +1D8DF ; [*18AE.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED +1D8E0 ; [*18AF.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT +1D8E1 ; [*18B0.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT +1D8E2 ; [*18B1.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT +1D8E3 ; [*18B2.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE +1D8E4 ; [*18B3.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT +1D8E5 ; [*18B4.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT +1D8E6 ; [*18B5.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOK +1D8E7 ; [*18B6.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURLICUE +1D8E8 ; [*18B7.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE +1D8E9 ; [*18B8.0020.0002] # SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE +1D8EA ; [*18B9.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER +1D8EB ; [*18BA.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLE +1D8EC ; [*18BB.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB +1D8ED ; [*18BC.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB OPEN +1D8EE ; [*18BD.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB OPEN +1D8EF ; [*18BE.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB LARGE +1D8F0 ; [*18BF.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB +1D8F1 ; [*18C0.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SMALL +1D8F2 ; [*18C1.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB OUT +1D8F3 ; [*18C2.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB IN +1D8F4 ; [*18C3.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB +1D8F5 ; [*18C4.0020.0002] # SIGNWRITING HAND-FIST THUMB +1D8F6 ; [*18C5.0020.0002] # SIGNWRITING HAND-FIST THUMB HEEL +1D8F7 ; [*18C6.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL +1D8F8 ; [*18C7.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE CONJOINED +1D8F9 ; [*18C8.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE BENT +1D8FA ; [*18C9.0020.0002] # SIGNWRITING HAND-FIST THUMB FORWARD +1D8FB ; [*18CA.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE +1D8FC ; [*18CB.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING +1D8FD ; [*18CC.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE +1D8FE ; [*18CD.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS +1D8FF ; [*18CE.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS +1D900 ; [*18CF.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS +1D901 ; [*18D0.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS +1D902 ; [*18D1.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES +1D903 ; [*18D2.0020.0002] # SIGNWRITING HAND-FIST +1D904 ; [*18D3.0020.0002] # SIGNWRITING HAND-FIST HEEL +1D905 ; [*18D4.0020.0002] # SIGNWRITING TOUCH SINGLE +1D906 ; [*18D5.0020.0002] # SIGNWRITING TOUCH MULTIPLE +1D907 ; [*18D6.0020.0002] # SIGNWRITING TOUCH BETWEEN +1D908 ; [*18D7.0020.0002] # SIGNWRITING GRASP SINGLE +1D909 ; [*18D8.0020.0002] # SIGNWRITING GRASP MULTIPLE +1D90A ; [*18D9.0020.0002] # SIGNWRITING GRASP BETWEEN +1D90B ; [*18DA.0020.0002] # SIGNWRITING STRIKE SINGLE +1D90C ; [*18DB.0020.0002] # SIGNWRITING STRIKE MULTIPLE +1D90D ; [*18DC.0020.0002] # SIGNWRITING STRIKE BETWEEN +1D90E ; [*18DD.0020.0002] # SIGNWRITING BRUSH SINGLE +1D90F ; [*18DE.0020.0002] # SIGNWRITING BRUSH MULTIPLE +1D910 ; [*18DF.0020.0002] # SIGNWRITING BRUSH BETWEEN +1D911 ; [*18E0.0020.0002] # SIGNWRITING RUB SINGLE +1D912 ; [*18E1.0020.0002] # SIGNWRITING RUB MULTIPLE +1D913 ; [*18E2.0020.0002] # SIGNWRITING RUB BETWEEN +1D914 ; [*18E3.0020.0002] # SIGNWRITING SURFACE SYMBOLS +1D915 ; [*18E4.0020.0002] # SIGNWRITING SURFACE BETWEEN +1D916 ; [*18E5.0020.0002] # SIGNWRITING SQUEEZE LARGE SINGLE +1D917 ; [*18E6.0020.0002] # SIGNWRITING SQUEEZE SMALL SINGLE +1D918 ; [*18E7.0020.0002] # SIGNWRITING SQUEEZE LARGE MULTIPLE +1D919 ; [*18E8.0020.0002] # SIGNWRITING SQUEEZE SMALL MULTIPLE +1D91A ; [*18E9.0020.0002] # SIGNWRITING SQUEEZE SEQUENTIAL +1D91B ; [*18EA.0020.0002] # SIGNWRITING FLICK LARGE SINGLE +1D91C ; [*18EB.0020.0002] # SIGNWRITING FLICK SMALL SINGLE +1D91D ; [*18EC.0020.0002] # SIGNWRITING FLICK LARGE MULTIPLE +1D91E ; [*18ED.0020.0002] # SIGNWRITING FLICK SMALL MULTIPLE +1D91F ; [*18EE.0020.0002] # SIGNWRITING FLICK SEQUENTIAL +1D920 ; [*18EF.0020.0002] # SIGNWRITING SQUEEZE FLICK ALTERNATING +1D921 ; [*18F0.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE +1D922 ; [*18F1.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL +1D923 ; [*18F2.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL +1D924 ; [*18F3.0020.0002] # SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL +1D925 ; [*18F4.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE +1D926 ; [*18F5.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL +1D927 ; [*18F6.0020.0002] # SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS +1D928 ; [*18F7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT +1D929 ; [*18F8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT +1D92A ; [*18F9.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL +1D92B ; [*18FA.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM +1D92C ; [*18FB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE +1D92D ; [*18FC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST +1D92E ; [*18FD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX +1D92F ; [*18FE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT +1D930 ; [*18FF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX +1D931 ; [*1900.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING +1D932 ; [*1901.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX +1D933 ; [*1902.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CROSS +1D934 ; [*1903.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT +1D935 ; [*1904.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX +1D936 ; [*1905.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING +1D937 ; [*1906.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX +1D938 ; [*1907.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL +1D939 ; [*1908.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM +1D93A ; [*1909.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE +1D93B ; [*190A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL +1D93C ; [*190B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM +1D93D ; [*190C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE +1D93E ; [*190D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION +1D93F ; [*190E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL +1D940 ; [*190F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM +1D941 ; [*1910.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE +1D942 ; [*1911.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL +1D943 ; [*1912.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM +1D944 ; [*1913.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE +1D945 ; [*1914.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL +1D946 ; [*1915.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM +1D947 ; [*1916.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE +1D948 ; [*1917.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL +1D949 ; [*1918.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM +1D94A ; [*1919.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE +1D94B ; [*191A.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE +1D94C ; [*191B.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE +1D94D ; [*191C.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING +1D94E ; [*191D.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE +1D94F ; [*191E.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE +1D950 ; [*191F.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING +1D951 ; [*1920.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE SHAKING +1D952 ; [*1921.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE +1D953 ; [*1922.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE +1D954 ; [*1923.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE +1D955 ; [*1924.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL +1D956 ; [*1925.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM +1D957 ; [*1926.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE +1D958 ; [*1927.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST +1D959 ; [*1928.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL +1D95A ; [*1929.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM +1D95B ; [*192A.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE +1D95C ; [*192B.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST +1D95D ; [*192C.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL +1D95E ; [*192D.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM +1D95F ; [*192E.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE +1D960 ; [*192F.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST +1D961 ; [*1930.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL +1D962 ; [*1931.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM +1D963 ; [*1932.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE +1D964 ; [*1933.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST +1D965 ; [*1934.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL +1D966 ; [*1935.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM +1D967 ; [*1936.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE +1D968 ; [*1937.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST +1D969 ; [*1938.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX +1D96A ; [*1939.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT +1D96B ; [*193A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX +1D96C ; [*193B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING +1D96D ; [*193C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX +1D96E ; [*193D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CROSS +1D96F ; [*193E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT +1D970 ; [*193F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX +1D971 ; [*1940.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT +1D972 ; [*1941.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX +1D973 ; [*1942.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BEND +1D974 ; [*1943.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL +1D975 ; [*1944.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM +1D976 ; [*1945.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE +1D977 ; [*1946.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CHECK +1D978 ; [*1947.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL +1D979 ; [*1948.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM +1D97A ; [*1949.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE +1D97B ; [*194A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL +1D97C ; [*194B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM +1D97D ; [*194C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE +1D97E ; [*194D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL +1D97F ; [*194E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM +1D980 ; [*194F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE +1D981 ; [*1950.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE +1D982 ; [*1951.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE +1D983 ; [*1952.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING +1D984 ; [*1953.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE +1D985 ; [*1954.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE +1D986 ; [*1955.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING +1D987 ; [*1956.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE SHAKING +1D988 ; [*1957.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL +1D989 ; [*1958.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM +1D98A ; [*1959.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE +1D98B ; [*195A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST +1D98C ; [*195B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL +1D98D ; [*195C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM +1D98E ; [*195D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE +1D98F ; [*195E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST +1D990 ; [*195F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL +1D991 ; [*1960.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM +1D992 ; [*1961.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL +1D993 ; [*1962.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM +1D994 ; [*1963.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE +1D995 ; [*1964.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL +1D996 ; [*1965.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM +1D997 ; [*1966.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE +1D998 ; [*1967.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE +1D999 ; [*1968.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL +1D99A ; [*1969.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM +1D99B ; [*196A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE +1D99C ; [*196B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL +1D99D ; [*196C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM +1D99E ; [*196D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE +1D99F ; [*196E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT +1D9A0 ; [*196F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL +1D9A1 ; [*1970.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM +1D9A2 ; [*1971.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE +1D9A3 ; [*1972.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE +1D9A4 ; [*1973.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATE +1D9A5 ; [*1974.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SHAKING +1D9A6 ; [*1975.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL +1D9A7 ; [*1976.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL +1D9A8 ; [*1977.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL +1D9A9 ; [*1978.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL +1D9AA ; [*1979.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL +1D9AB ; [*197A.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL +1D9AC ; [*197B.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL +1D9AD ; [*197C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST +1D9AE ; [*197D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST +1D9AF ; [*197E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST +1D9B0 ; [*197F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST +1D9B1 ; [*1980.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST +1D9B2 ; [*1981.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST +1D9B3 ; [*1982.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST +1D9B4 ; [*1983.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL +1D9B5 ; [*1984.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM +1D9B6 ; [*1985.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE +1D9B7 ; [*1986.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL +1D9B8 ; [*1987.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE +1D9B9 ; [*1988.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE +1D9BA ; [*1989.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE +1D9BB ; [*198A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE +1D9BC ; [*198B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE +1D9BD ; [*198C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE +1D9BE ; [*198D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE +1D9BF ; [*198E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE +1D9C0 ; [*198F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE +1D9C1 ; [*1990.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL +1D9C2 ; [*1991.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE +1D9C3 ; [*1992.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING +1D9C4 ; [*1993.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING +1D9C5 ; [*1994.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING +1D9C6 ; [*1995.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL +1D9C7 ; [*1996.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE +1D9C8 ; [*1997.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE +1D9C9 ; [*1998.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE +1D9CA ; [*1999.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE +1D9CB ; [*199A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE +1D9CC ; [*199B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE +1D9CD ; [*199C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE +1D9CE ; [*199D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE +1D9CF ; [*199E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE +1D9D0 ; [*199F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL +1D9D1 ; [*19A0.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE +1D9D2 ; [*19A1.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR +1D9D3 ; [*19A2.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR +1D9D4 ; [*19A3.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR +1D9D5 ; [*19A4.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL +1D9D6 ; [*19A5.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM +1D9D7 ; [*19A6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE +1D9D8 ; [*19A7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST +1D9D9 ; [*19A8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED +1D9DA ; [*19A9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL +1D9DB ; [*19AA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL +1D9DC ; [*19AB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE +1D9DD ; [*19AC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL +1D9DE ; [*19AD.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE +1D9DF ; [*19AE.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE +1D9E0 ; [*19AF.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE +1D9E1 ; [*19B0.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING +1D9E2 ; [*19B1.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL +1D9E3 ; [*19B2.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE +1D9E4 ; [*19B3.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE +1D9E5 ; [*19B4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE +1D9E6 ; [*19B5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE +1D9E7 ; [*19B6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE +1D9E8 ; [*19B7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE +1D9E9 ; [*19B8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE +1D9EA ; [*19B9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE +1D9EB ; [*19BA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE +1D9EC ; [*19BB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE +1D9ED ; [*19BC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE +1D9EE ; [*19BD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE +1D9EF ; [*19BE.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE +1D9F0 ; [*19BF.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE +1D9F1 ; [*19C0.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE +1D9F2 ; [*19C1.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE +1D9F3 ; [*19C2.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE +1D9F4 ; [*19C3.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE +1D9F5 ; [*19C4.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD SMALL +1D9F6 ; [*19C5.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD LARGE +1D9F7 ; [*19C6.0020.0002] # SIGNWRITING DYNAMIC FAST +1D9F8 ; [*19C7.0020.0002] # SIGNWRITING DYNAMIC SLOW +1D9F9 ; [*19C8.0020.0002] # SIGNWRITING DYNAMIC TENSE +1D9FA ; [*19C9.0020.0002] # SIGNWRITING DYNAMIC RELAXED +1D9FB ; [*19CA.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS +1D9FC ; [*19CB.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING +1D9FD ; [*19CC.0020.0002] # SIGNWRITING DYNAMIC EVERY OTHER TIME +1D9FE ; [*19CD.0020.0002] # SIGNWRITING DYNAMIC GRADUAL +1D9FF ; [*19CE.0020.0002] # SIGNWRITING HEAD +1DA00 ; [.0000.0000.0000] # SIGNWRITING HEAD RIM +1DA01 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT +1DA02 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT +1DA03 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT +1DA04 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE +1DA05 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE +1DA06 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT CIRCLE +1DA07 ; [.0000.0000.0000] # SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING +1DA08 ; [.0000.0000.0000] # SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN +1DA09 ; [.0000.0000.0000] # SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING +1DA0A ; [.0000.0000.0000] # SIGNWRITING EYEBROWS STRAIGHT UP +1DA0B ; [.0000.0000.0000] # SIGNWRITING EYEBROWS STRAIGHT NEUTRAL +1DA0C ; [.0000.0000.0000] # SIGNWRITING EYEBROWS STRAIGHT DOWN +1DA0D ; [.0000.0000.0000] # SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN +1DA0E ; [.0000.0000.0000] # SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL +1DA0F ; [.0000.0000.0000] # SIGNWRITING DREAMY EYEBROWS UP NEUTRAL +1DA10 ; [.0000.0000.0000] # SIGNWRITING DREAMY EYEBROWS NEUTRAL UP +1DA11 ; [.0000.0000.0000] # SIGNWRITING FOREHEAD NEUTRAL +1DA12 ; [.0000.0000.0000] # SIGNWRITING FOREHEAD CONTACT +1DA13 ; [.0000.0000.0000] # SIGNWRITING FOREHEAD WRINKLED +1DA14 ; [.0000.0000.0000] # SIGNWRITING EYES OPEN +1DA15 ; [.0000.0000.0000] # SIGNWRITING EYES SQUEEZED +1DA16 ; [.0000.0000.0000] # SIGNWRITING EYES CLOSED +1DA17 ; [.0000.0000.0000] # SIGNWRITING EYE BLINK SINGLE +1DA18 ; [.0000.0000.0000] # SIGNWRITING EYE BLINK MULTIPLE +1DA19 ; [.0000.0000.0000] # SIGNWRITING EYES HALF OPEN +1DA1A ; [.0000.0000.0000] # SIGNWRITING EYES WIDE OPEN +1DA1B ; [.0000.0000.0000] # SIGNWRITING EYES HALF CLOSED +1DA1C ; [.0000.0000.0000] # SIGNWRITING EYES WIDENING MOVEMENT +1DA1D ; [.0000.0000.0000] # SIGNWRITING EYE WINK +1DA1E ; [.0000.0000.0000] # SIGNWRITING EYELASHES UP +1DA1F ; [.0000.0000.0000] # SIGNWRITING EYELASHES DOWN +1DA20 ; [.0000.0000.0000] # SIGNWRITING EYELASHES FLUTTERING +1DA21 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT +1DA22 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE +1DA23 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING +1DA24 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT +1DA25 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE +1DA26 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING +1DA27 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-WALLPLANE CURVED +1DA28 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-FLOORPLANE CURVED +1DA29 ; [.0000.0000.0000] # SIGNWRITING EYEGAZE-WALLPLANE CIRCLING +1DA2A ; [.0000.0000.0000] # SIGNWRITING CHEEKS PUFFED +1DA2B ; [.0000.0000.0000] # SIGNWRITING CHEEKS NEUTRAL +1DA2C ; [.0000.0000.0000] # SIGNWRITING CHEEKS SUCKED +1DA2D ; [.0000.0000.0000] # SIGNWRITING TENSE CHEEKS HIGH +1DA2E ; [.0000.0000.0000] # SIGNWRITING TENSE CHEEKS MIDDLE +1DA2F ; [.0000.0000.0000] # SIGNWRITING TENSE CHEEKS LOW +1DA30 ; [.0000.0000.0000] # SIGNWRITING EARS +1DA31 ; [.0000.0000.0000] # SIGNWRITING NOSE NEUTRAL +1DA32 ; [.0000.0000.0000] # SIGNWRITING NOSE CONTACT +1DA33 ; [.0000.0000.0000] # SIGNWRITING NOSE WRINKLES +1DA34 ; [.0000.0000.0000] # SIGNWRITING NOSE WIGGLES +1DA35 ; [.0000.0000.0000] # SIGNWRITING AIR BLOWING OUT +1DA36 ; [.0000.0000.0000] # SIGNWRITING AIR SUCKING IN +1DA37 ; [*19CF.0020.0002] # SIGNWRITING AIR BLOW SMALL ROTATIONS +1DA38 ; [*19D0.0020.0002] # SIGNWRITING AIR SUCK SMALL ROTATIONS +1DA39 ; [*19D1.0020.0002] # SIGNWRITING BREATH INHALE +1DA3A ; [*19D2.0020.0002] # SIGNWRITING BREATH EXHALE +1DA3B ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED NEUTRAL +1DA3C ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED FORWARD +1DA3D ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED CONTACT +1DA3E ; [.0000.0000.0000] # SIGNWRITING MOUTH SMILE +1DA3F ; [.0000.0000.0000] # SIGNWRITING MOUTH SMILE WRINKLED +1DA40 ; [.0000.0000.0000] # SIGNWRITING MOUTH SMILE OPEN +1DA41 ; [.0000.0000.0000] # SIGNWRITING MOUTH FROWN +1DA42 ; [.0000.0000.0000] # SIGNWRITING MOUTH FROWN WRINKLED +1DA43 ; [.0000.0000.0000] # SIGNWRITING MOUTH FROWN OPEN +1DA44 ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN CIRCLE +1DA45 ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN FORWARD +1DA46 ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN WRINKLED +1DA47 ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN OVAL +1DA48 ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN OVAL WRINKLED +1DA49 ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN OVAL YAWN +1DA4A ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN RECTANGLE +1DA4B ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED +1DA4C ; [.0000.0000.0000] # SIGNWRITING MOUTH OPEN RECTANGLE YAWN +1DA4D ; [.0000.0000.0000] # SIGNWRITING MOUTH KISS +1DA4E ; [.0000.0000.0000] # SIGNWRITING MOUTH KISS FORWARD +1DA4F ; [.0000.0000.0000] # SIGNWRITING MOUTH KISS WRINKLED +1DA50 ; [.0000.0000.0000] # SIGNWRITING MOUTH TENSE +1DA51 ; [.0000.0000.0000] # SIGNWRITING MOUTH TENSE FORWARD +1DA52 ; [.0000.0000.0000] # SIGNWRITING MOUTH TENSE SUCKED +1DA53 ; [.0000.0000.0000] # SIGNWRITING LIPS PRESSED TOGETHER +1DA54 ; [.0000.0000.0000] # SIGNWRITING LIP LOWER OVER UPPER +1DA55 ; [.0000.0000.0000] # SIGNWRITING LIP UPPER OVER LOWER +1DA56 ; [.0000.0000.0000] # SIGNWRITING MOUTH CORNERS +1DA57 ; [.0000.0000.0000] # SIGNWRITING MOUTH WRINKLES SINGLE +1DA58 ; [.0000.0000.0000] # SIGNWRITING MOUTH WRINKLES DOUBLE +1DA59 ; [.0000.0000.0000] # SIGNWRITING TONGUE STICKING OUT FAR +1DA5A ; [.0000.0000.0000] # SIGNWRITING TONGUE LICKING LIPS +1DA5B ; [.0000.0000.0000] # SIGNWRITING TONGUE TIP BETWEEN LIPS +1DA5C ; [.0000.0000.0000] # SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH +1DA5D ; [.0000.0000.0000] # SIGNWRITING TONGUE INSIDE MOUTH RELAXED +1DA5E ; [.0000.0000.0000] # SIGNWRITING TONGUE MOVES AGAINST CHEEK +1DA5F ; [.0000.0000.0000] # SIGNWRITING TONGUE CENTRE STICKING OUT +1DA60 ; [.0000.0000.0000] # SIGNWRITING TONGUE CENTRE INSIDE MOUTH +1DA61 ; [.0000.0000.0000] # SIGNWRITING TEETH +1DA62 ; [.0000.0000.0000] # SIGNWRITING TEETH MOVEMENT +1DA63 ; [.0000.0000.0000] # SIGNWRITING TEETH ON TONGUE +1DA64 ; [.0000.0000.0000] # SIGNWRITING TEETH ON TONGUE MOVEMENT +1DA65 ; [.0000.0000.0000] # SIGNWRITING TEETH ON LIPS +1DA66 ; [.0000.0000.0000] # SIGNWRITING TEETH ON LIPS MOVEMENT +1DA67 ; [.0000.0000.0000] # SIGNWRITING TEETH BITE LIPS +1DA68 ; [.0000.0000.0000] # SIGNWRITING MOVEMENT-WALLPLANE JAW +1DA69 ; [.0000.0000.0000] # SIGNWRITING MOVEMENT-FLOORPLANE JAW +1DA6A ; [.0000.0000.0000] # SIGNWRITING NECK +1DA6B ; [.0000.0000.0000] # SIGNWRITING HAIR +1DA6C ; [.0000.0000.0000] # SIGNWRITING EXCITEMENT +1DA6D ; [*19D3.0020.0002] # SIGNWRITING SHOULDER HIP SPINE +1DA6E ; [*19D4.0020.0002] # SIGNWRITING SHOULDER HIP POSITIONS +1DA6F ; [*19D5.0020.0002] # SIGNWRITING WALLPLANE SHOULDER HIP MOVE +1DA70 ; [*19D6.0020.0002] # SIGNWRITING FLOORPLANE SHOULDER HIP MOVE +1DA71 ; [*19D7.0020.0002] # SIGNWRITING SHOULDER TILTING FROM WAIST +1DA72 ; [*19D8.0020.0002] # SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH +1DA73 ; [*19D9.0020.0002] # SIGNWRITING TORSO-WALLPLANE CURVED BEND +1DA74 ; [*19DA.0020.0002] # SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 ; [.0000.0000.0000] # SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76 ; [*19DB.0020.0002] # SIGNWRITING LIMB COMBINATION +1DA77 ; [*19DC.0020.0002] # SIGNWRITING LIMB LENGTH-1 +1DA78 ; [*19DD.0020.0002] # SIGNWRITING LIMB LENGTH-2 +1DA79 ; [*19DE.0020.0002] # SIGNWRITING LIMB LENGTH-3 +1DA7A ; [*19DF.0020.0002] # SIGNWRITING LIMB LENGTH-4 +1DA7B ; [*19E0.0020.0002] # SIGNWRITING LIMB LENGTH-5 +1DA7C ; [*19E1.0020.0002] # SIGNWRITING LIMB LENGTH-6 +1DA7D ; [*19E2.0020.0002] # SIGNWRITING LIMB LENGTH-7 +1DA7E ; [*19E3.0020.0002] # SIGNWRITING FINGER +1DA7F ; [*19E4.0020.0002] # SIGNWRITING LOCATION-WALLPLANE SPACE +1DA80 ; [*19E5.0020.0002] # SIGNWRITING LOCATION-FLOORPLANE SPACE +1DA81 ; [*19E6.0020.0002] # SIGNWRITING LOCATION HEIGHT +1DA82 ; [*19E7.0020.0002] # SIGNWRITING LOCATION WIDTH +1DA83 ; [*19E8.0020.0002] # SIGNWRITING LOCATION DEPTH +1DA84 ; [.0000.0000.0000] # SIGNWRITING LOCATION HEAD NECK +1DA85 ; [*19E9.0020.0002] # SIGNWRITING LOCATION TORSO +1DA86 ; [*19EA.0020.0002] # SIGNWRITING LOCATION LIMBS DIGITS +1DA87 ; [*045E.0020.0002] # SIGNWRITING COMMA +1DA88 ; [*045F.0020.0002] # SIGNWRITING FULL STOP +1DA89 ; [*0460.0020.0002] # SIGNWRITING SEMICOLON +1DA8A ; [*0461.0020.0002] # SIGNWRITING COLON +1DA8B ; [*0462.0020.0002] # SIGNWRITING PARENTHESIS +1DA9B ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-2 +1DA9C ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-3 +1DA9D ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-4 +1DA9E ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-5 +1DA9F ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-6 +1DAA1 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-2 +1DAA2 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-3 +1DAA3 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-4 +1DAA4 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-5 +1DAA5 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-6 +1DAA6 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-7 +1DAA7 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-8 +1DAA8 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-9 +1DAA9 ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-10 +1DAAA ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-11 +1DAAB ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-12 +1DAAC ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-13 +1DAAD ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-14 +1DAAE ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-15 +1DAAF ; [.0000.0000.0000] # SIGNWRITING ROTATION MODIFIER-16 +1E8D0 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER TEENS +1E8D1 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER TENS +1E8D2 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER HUNDREDS +1E8D3 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER THOUSANDS +1E8D4 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS +1E8D5 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS +1E8D6 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER MILLIONS +1EEF0 ; [*04DC.0020.0002] # ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL +1EEF1 ; [*04DD.0020.0002] # ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000 ; [*11A1.0020.0002] # MAHJONG TILE EAST WIND +1F001 ; [*11A2.0020.0002] # MAHJONG TILE SOUTH WIND +1F002 ; [*11A3.0020.0002] # MAHJONG TILE WEST WIND +1F003 ; [*11A4.0020.0002] # MAHJONG TILE NORTH WIND +1F004 ; [*11A5.0020.0002] # MAHJONG TILE RED DRAGON +1F005 ; [*11A6.0020.0002] # MAHJONG TILE GREEN DRAGON +1F006 ; [*11A7.0020.0002] # MAHJONG TILE WHITE DRAGON +1F007 ; [*11A8.0020.0002] # MAHJONG TILE ONE OF CHARACTERS +1F008 ; [*11A9.0020.0002] # MAHJONG TILE TWO OF CHARACTERS +1F009 ; [*11AA.0020.0002] # MAHJONG TILE THREE OF CHARACTERS +1F00A ; [*11AB.0020.0002] # MAHJONG TILE FOUR OF CHARACTERS +1F00B ; [*11AC.0020.0002] # MAHJONG TILE FIVE OF CHARACTERS +1F00C ; [*11AD.0020.0002] # MAHJONG TILE SIX OF CHARACTERS +1F00D ; [*11AE.0020.0002] # MAHJONG TILE SEVEN OF CHARACTERS +1F00E ; [*11AF.0020.0002] # MAHJONG TILE EIGHT OF CHARACTERS +1F00F ; [*11B0.0020.0002] # MAHJONG TILE NINE OF CHARACTERS +1F010 ; [*11B1.0020.0002] # MAHJONG TILE ONE OF BAMBOOS +1F011 ; [*11B2.0020.0002] # MAHJONG TILE TWO OF BAMBOOS +1F012 ; [*11B3.0020.0002] # MAHJONG TILE THREE OF BAMBOOS +1F013 ; [*11B4.0020.0002] # MAHJONG TILE FOUR OF BAMBOOS +1F014 ; [*11B5.0020.0002] # MAHJONG TILE FIVE OF BAMBOOS +1F015 ; [*11B6.0020.0002] # MAHJONG TILE SIX OF BAMBOOS +1F016 ; [*11B7.0020.0002] # MAHJONG TILE SEVEN OF BAMBOOS +1F017 ; [*11B8.0020.0002] # MAHJONG TILE EIGHT OF BAMBOOS +1F018 ; [*11B9.0020.0002] # MAHJONG TILE NINE OF BAMBOOS +1F019 ; [*11BA.0020.0002] # MAHJONG TILE ONE OF CIRCLES +1F01A ; [*11BB.0020.0002] # MAHJONG TILE TWO OF CIRCLES +1F01B ; [*11BC.0020.0002] # MAHJONG TILE THREE OF CIRCLES +1F01C ; [*11BD.0020.0002] # MAHJONG TILE FOUR OF CIRCLES +1F01D ; [*11BE.0020.0002] # MAHJONG TILE FIVE OF CIRCLES +1F01E ; [*11BF.0020.0002] # MAHJONG TILE SIX OF CIRCLES +1F01F ; [*11C0.0020.0002] # MAHJONG TILE SEVEN OF CIRCLES +1F020 ; [*11C1.0020.0002] # MAHJONG TILE EIGHT OF CIRCLES +1F021 ; [*11C2.0020.0002] # MAHJONG TILE NINE OF CIRCLES +1F022 ; [*11C3.0020.0002] # MAHJONG TILE PLUM +1F023 ; [*11C4.0020.0002] # MAHJONG TILE ORCHID +1F024 ; [*11C5.0020.0002] # MAHJONG TILE BAMBOO +1F025 ; [*11C6.0020.0002] # MAHJONG TILE CHRYSANTHEMUM +1F026 ; [*11C7.0020.0002] # MAHJONG TILE SPRING +1F027 ; [*11C8.0020.0002] # MAHJONG TILE SUMMER +1F028 ; [*11C9.0020.0002] # MAHJONG TILE AUTUMN +1F029 ; [*11CA.0020.0002] # MAHJONG TILE WINTER +1F02A ; [*11CB.0020.0002] # MAHJONG TILE JOKER +1F02B ; [*11CC.0020.0002] # MAHJONG TILE BACK +1F030 ; [*11CD.0020.0002] # DOMINO TILE HORIZONTAL BACK +1F031 ; [*11CE.0020.0002] # DOMINO TILE HORIZONTAL-00-00 +1F032 ; [*11CF.0020.0002] # DOMINO TILE HORIZONTAL-00-01 +1F033 ; [*11D0.0020.0002] # DOMINO TILE HORIZONTAL-00-02 +1F034 ; [*11D1.0020.0002] # DOMINO TILE HORIZONTAL-00-03 +1F035 ; [*11D2.0020.0002] # DOMINO TILE HORIZONTAL-00-04 +1F036 ; [*11D3.0020.0002] # DOMINO TILE HORIZONTAL-00-05 +1F037 ; [*11D4.0020.0002] # DOMINO TILE HORIZONTAL-00-06 +1F038 ; [*11D5.0020.0002] # DOMINO TILE HORIZONTAL-01-00 +1F039 ; [*11D6.0020.0002] # DOMINO TILE HORIZONTAL-01-01 +1F03A ; [*11D7.0020.0002] # DOMINO TILE HORIZONTAL-01-02 +1F03B ; [*11D8.0020.0002] # DOMINO TILE HORIZONTAL-01-03 +1F03C ; [*11D9.0020.0002] # DOMINO TILE HORIZONTAL-01-04 +1F03D ; [*11DA.0020.0002] # DOMINO TILE HORIZONTAL-01-05 +1F03E ; [*11DB.0020.0002] # DOMINO TILE HORIZONTAL-01-06 +1F03F ; [*11DC.0020.0002] # DOMINO TILE HORIZONTAL-02-00 +1F040 ; [*11DD.0020.0002] # DOMINO TILE HORIZONTAL-02-01 +1F041 ; [*11DE.0020.0002] # DOMINO TILE HORIZONTAL-02-02 +1F042 ; [*11DF.0020.0002] # DOMINO TILE HORIZONTAL-02-03 +1F043 ; [*11E0.0020.0002] # DOMINO TILE HORIZONTAL-02-04 +1F044 ; [*11E1.0020.0002] # DOMINO TILE HORIZONTAL-02-05 +1F045 ; [*11E2.0020.0002] # DOMINO TILE HORIZONTAL-02-06 +1F046 ; [*11E3.0020.0002] # DOMINO TILE HORIZONTAL-03-00 +1F047 ; [*11E4.0020.0002] # DOMINO TILE HORIZONTAL-03-01 +1F048 ; [*11E5.0020.0002] # DOMINO TILE HORIZONTAL-03-02 +1F049 ; [*11E6.0020.0002] # DOMINO TILE HORIZONTAL-03-03 +1F04A ; [*11E7.0020.0002] # DOMINO TILE HORIZONTAL-03-04 +1F04B ; [*11E8.0020.0002] # DOMINO TILE HORIZONTAL-03-05 +1F04C ; [*11E9.0020.0002] # DOMINO TILE HORIZONTAL-03-06 +1F04D ; [*11EA.0020.0002] # DOMINO TILE HORIZONTAL-04-00 +1F04E ; [*11EB.0020.0002] # DOMINO TILE HORIZONTAL-04-01 +1F04F ; [*11EC.0020.0002] # DOMINO TILE HORIZONTAL-04-02 +1F050 ; [*11ED.0020.0002] # DOMINO TILE HORIZONTAL-04-03 +1F051 ; [*11EE.0020.0002] # DOMINO TILE HORIZONTAL-04-04 +1F052 ; [*11EF.0020.0002] # DOMINO TILE HORIZONTAL-04-05 +1F053 ; [*11F0.0020.0002] # DOMINO TILE HORIZONTAL-04-06 +1F054 ; [*11F1.0020.0002] # DOMINO TILE HORIZONTAL-05-00 +1F055 ; [*11F2.0020.0002] # DOMINO TILE HORIZONTAL-05-01 +1F056 ; [*11F3.0020.0002] # DOMINO TILE HORIZONTAL-05-02 +1F057 ; [*11F4.0020.0002] # DOMINO TILE HORIZONTAL-05-03 +1F058 ; [*11F5.0020.0002] # DOMINO TILE HORIZONTAL-05-04 +1F059 ; [*11F6.0020.0002] # DOMINO TILE HORIZONTAL-05-05 +1F05A ; [*11F7.0020.0002] # DOMINO TILE HORIZONTAL-05-06 +1F05B ; [*11F8.0020.0002] # DOMINO TILE HORIZONTAL-06-00 +1F05C ; [*11F9.0020.0002] # DOMINO TILE HORIZONTAL-06-01 +1F05D ; [*11FA.0020.0002] # DOMINO TILE HORIZONTAL-06-02 +1F05E ; [*11FB.0020.0002] # DOMINO TILE HORIZONTAL-06-03 +1F05F ; [*11FC.0020.0002] # DOMINO TILE HORIZONTAL-06-04 +1F060 ; [*11FD.0020.0002] # DOMINO TILE HORIZONTAL-06-05 +1F061 ; [*11FE.0020.0002] # DOMINO TILE HORIZONTAL-06-06 +1F062 ; [*11FF.0020.0002] # DOMINO TILE VERTICAL BACK +1F063 ; [*1200.0020.0002] # DOMINO TILE VERTICAL-00-00 +1F064 ; [*1201.0020.0002] # DOMINO TILE VERTICAL-00-01 +1F065 ; [*1202.0020.0002] # DOMINO TILE VERTICAL-00-02 +1F066 ; [*1203.0020.0002] # DOMINO TILE VERTICAL-00-03 +1F067 ; [*1204.0020.0002] # DOMINO TILE VERTICAL-00-04 +1F068 ; [*1205.0020.0002] # DOMINO TILE VERTICAL-00-05 +1F069 ; [*1206.0020.0002] # DOMINO TILE VERTICAL-00-06 +1F06A ; [*1207.0020.0002] # DOMINO TILE VERTICAL-01-00 +1F06B ; [*1208.0020.0002] # DOMINO TILE VERTICAL-01-01 +1F06C ; [*1209.0020.0002] # DOMINO TILE VERTICAL-01-02 +1F06D ; [*120A.0020.0002] # DOMINO TILE VERTICAL-01-03 +1F06E ; [*120B.0020.0002] # DOMINO TILE VERTICAL-01-04 +1F06F ; [*120C.0020.0002] # DOMINO TILE VERTICAL-01-05 +1F070 ; [*120D.0020.0002] # DOMINO TILE VERTICAL-01-06 +1F071 ; [*120E.0020.0002] # DOMINO TILE VERTICAL-02-00 +1F072 ; [*120F.0020.0002] # DOMINO TILE VERTICAL-02-01 +1F073 ; [*1210.0020.0002] # DOMINO TILE VERTICAL-02-02 +1F074 ; [*1211.0020.0002] # DOMINO TILE VERTICAL-02-03 +1F075 ; [*1212.0020.0002] # DOMINO TILE VERTICAL-02-04 +1F076 ; [*1213.0020.0002] # DOMINO TILE VERTICAL-02-05 +1F077 ; [*1214.0020.0002] # DOMINO TILE VERTICAL-02-06 +1F078 ; [*1215.0020.0002] # DOMINO TILE VERTICAL-03-00 +1F079 ; [*1216.0020.0002] # DOMINO TILE VERTICAL-03-01 +1F07A ; [*1217.0020.0002] # DOMINO TILE VERTICAL-03-02 +1F07B ; [*1218.0020.0002] # DOMINO TILE VERTICAL-03-03 +1F07C ; [*1219.0020.0002] # DOMINO TILE VERTICAL-03-04 +1F07D ; [*121A.0020.0002] # DOMINO TILE VERTICAL-03-05 +1F07E ; [*121B.0020.0002] # DOMINO TILE VERTICAL-03-06 +1F07F ; [*121C.0020.0002] # DOMINO TILE VERTICAL-04-00 +1F080 ; [*121D.0020.0002] # DOMINO TILE VERTICAL-04-01 +1F081 ; [*121E.0020.0002] # DOMINO TILE VERTICAL-04-02 +1F082 ; [*121F.0020.0002] # DOMINO TILE VERTICAL-04-03 +1F083 ; [*1220.0020.0002] # DOMINO TILE VERTICAL-04-04 +1F084 ; [*1221.0020.0002] # DOMINO TILE VERTICAL-04-05 +1F085 ; [*1222.0020.0002] # DOMINO TILE VERTICAL-04-06 +1F086 ; [*1223.0020.0002] # DOMINO TILE VERTICAL-05-00 +1F087 ; [*1224.0020.0002] # DOMINO TILE VERTICAL-05-01 +1F088 ; [*1225.0020.0002] # DOMINO TILE VERTICAL-05-02 +1F089 ; [*1226.0020.0002] # DOMINO TILE VERTICAL-05-03 +1F08A ; [*1227.0020.0002] # DOMINO TILE VERTICAL-05-04 +1F08B ; [*1228.0020.0002] # DOMINO TILE VERTICAL-05-05 +1F08C ; [*1229.0020.0002] # DOMINO TILE VERTICAL-05-06 +1F08D ; [*122A.0020.0002] # DOMINO TILE VERTICAL-06-00 +1F08E ; [*122B.0020.0002] # DOMINO TILE VERTICAL-06-01 +1F08F ; [*122C.0020.0002] # DOMINO TILE VERTICAL-06-02 +1F090 ; [*122D.0020.0002] # DOMINO TILE VERTICAL-06-03 +1F091 ; [*122E.0020.0002] # DOMINO TILE VERTICAL-06-04 +1F092 ; [*122F.0020.0002] # DOMINO TILE VERTICAL-06-05 +1F093 ; [*1230.0020.0002] # DOMINO TILE VERTICAL-06-06 +1F0A0 ; [*1231.0020.0002] # PLAYING CARD BACK +1F0A1 ; [*1232.0020.0002] # PLAYING CARD ACE OF SPADES +1F0A2 ; [*1233.0020.0002] # PLAYING CARD TWO OF SPADES +1F0A3 ; [*1234.0020.0002] # PLAYING CARD THREE OF SPADES +1F0A4 ; [*1235.0020.0002] # PLAYING CARD FOUR OF SPADES +1F0A5 ; [*1236.0020.0002] # PLAYING CARD FIVE OF SPADES +1F0A6 ; [*1237.0020.0002] # PLAYING CARD SIX OF SPADES +1F0A7 ; [*1238.0020.0002] # PLAYING CARD SEVEN OF SPADES +1F0A8 ; [*1239.0020.0002] # PLAYING CARD EIGHT OF SPADES +1F0A9 ; [*123A.0020.0002] # PLAYING CARD NINE OF SPADES +1F0AA ; [*123B.0020.0002] # PLAYING CARD TEN OF SPADES +1F0AB ; [*123C.0020.0002] # PLAYING CARD JACK OF SPADES +1F0AC ; [*123D.0020.0002] # PLAYING CARD KNIGHT OF SPADES +1F0AD ; [*123E.0020.0002] # PLAYING CARD QUEEN OF SPADES +1F0AE ; [*123F.0020.0002] # PLAYING CARD KING OF SPADES +1F0B1 ; [*1240.0020.0002] # PLAYING CARD ACE OF HEARTS +1F0B2 ; [*1241.0020.0002] # PLAYING CARD TWO OF HEARTS +1F0B3 ; [*1242.0020.0002] # PLAYING CARD THREE OF HEARTS +1F0B4 ; [*1243.0020.0002] # PLAYING CARD FOUR OF HEARTS +1F0B5 ; [*1244.0020.0002] # PLAYING CARD FIVE OF HEARTS +1F0B6 ; [*1245.0020.0002] # PLAYING CARD SIX OF HEARTS +1F0B7 ; [*1246.0020.0002] # PLAYING CARD SEVEN OF HEARTS +1F0B8 ; [*1247.0020.0002] # PLAYING CARD EIGHT OF HEARTS +1F0B9 ; [*1248.0020.0002] # PLAYING CARD NINE OF HEARTS +1F0BA ; [*1249.0020.0002] # PLAYING CARD TEN OF HEARTS +1F0BB ; [*124A.0020.0002] # PLAYING CARD JACK OF HEARTS +1F0BC ; [*124B.0020.0002] # PLAYING CARD KNIGHT OF HEARTS +1F0BD ; [*124C.0020.0002] # PLAYING CARD QUEEN OF HEARTS +1F0BE ; [*124D.0020.0002] # PLAYING CARD KING OF HEARTS +1F0BF ; [*124E.0020.0002] # PLAYING CARD RED JOKER +1F0C1 ; [*124F.0020.0002] # PLAYING CARD ACE OF DIAMONDS +1F0C2 ; [*1250.0020.0002] # PLAYING CARD TWO OF DIAMONDS +1F0C3 ; [*1251.0020.0002] # PLAYING CARD THREE OF DIAMONDS +1F0C4 ; [*1252.0020.0002] # PLAYING CARD FOUR OF DIAMONDS +1F0C5 ; [*1253.0020.0002] # PLAYING CARD FIVE OF DIAMONDS +1F0C6 ; [*1254.0020.0002] # PLAYING CARD SIX OF DIAMONDS +1F0C7 ; [*1255.0020.0002] # PLAYING CARD SEVEN OF DIAMONDS +1F0C8 ; [*1256.0020.0002] # PLAYING CARD EIGHT OF DIAMONDS +1F0C9 ; [*1257.0020.0002] # PLAYING CARD NINE OF DIAMONDS +1F0CA ; [*1258.0020.0002] # PLAYING CARD TEN OF DIAMONDS +1F0CB ; [*1259.0020.0002] # PLAYING CARD JACK OF DIAMONDS +1F0CC ; [*125A.0020.0002] # PLAYING CARD KNIGHT OF DIAMONDS +1F0CD ; [*125B.0020.0002] # PLAYING CARD QUEEN OF DIAMONDS +1F0CE ; [*125C.0020.0002] # PLAYING CARD KING OF DIAMONDS +1F0CF ; [*125D.0020.0002] # PLAYING CARD BLACK JOKER +1F0D1 ; [*125E.0020.0002] # PLAYING CARD ACE OF CLUBS +1F0D2 ; [*125F.0020.0002] # PLAYING CARD TWO OF CLUBS +1F0D3 ; [*1260.0020.0002] # PLAYING CARD THREE OF CLUBS +1F0D4 ; [*1261.0020.0002] # PLAYING CARD FOUR OF CLUBS +1F0D5 ; [*1262.0020.0002] # PLAYING CARD FIVE OF CLUBS +1F0D6 ; [*1263.0020.0002] # PLAYING CARD SIX OF CLUBS +1F0D7 ; [*1264.0020.0002] # PLAYING CARD SEVEN OF CLUBS +1F0D8 ; [*1265.0020.0002] # PLAYING CARD EIGHT OF CLUBS +1F0D9 ; [*1266.0020.0002] # PLAYING CARD NINE OF CLUBS +1F0DA ; [*1267.0020.0002] # PLAYING CARD TEN OF CLUBS +1F0DB ; [*1268.0020.0002] # PLAYING CARD JACK OF CLUBS +1F0DC ; [*1269.0020.0002] # PLAYING CARD KNIGHT OF CLUBS +1F0DD ; [*126A.0020.0002] # PLAYING CARD QUEEN OF CLUBS +1F0DE ; [*126B.0020.0002] # PLAYING CARD KING OF CLUBS +1F0DF ; [*126C.0020.0002] # PLAYING CARD WHITE JOKER +1F0E0 ; [*126D.0020.0002] # PLAYING CARD FOOL +1F0E1 ; [*126E.0020.0002] # PLAYING CARD TRUMP-1 +1F0E2 ; [*126F.0020.0002] # PLAYING CARD TRUMP-2 +1F0E3 ; [*1270.0020.0002] # PLAYING CARD TRUMP-3 +1F0E4 ; [*1271.0020.0002] # PLAYING CARD TRUMP-4 +1F0E5 ; [*1272.0020.0002] # PLAYING CARD TRUMP-5 +1F0E6 ; [*1273.0020.0002] # PLAYING CARD TRUMP-6 +1F0E7 ; [*1274.0020.0002] # PLAYING CARD TRUMP-7 +1F0E8 ; [*1275.0020.0002] # PLAYING CARD TRUMP-8 +1F0E9 ; [*1276.0020.0002] # PLAYING CARD TRUMP-9 +1F0EA ; [*1277.0020.0002] # PLAYING CARD TRUMP-10 +1F0EB ; [*1278.0020.0002] # PLAYING CARD TRUMP-11 +1F0EC ; [*1279.0020.0002] # PLAYING CARD TRUMP-12 +1F0ED ; [*127A.0020.0002] # PLAYING CARD TRUMP-13 +1F0EE ; [*127B.0020.0002] # PLAYING CARD TRUMP-14 +1F0EF ; [*127C.0020.0002] # PLAYING CARD TRUMP-15 +1F0F0 ; [*127D.0020.0002] # PLAYING CARD TRUMP-16 +1F0F1 ; [*127E.0020.0002] # PLAYING CARD TRUMP-17 +1F0F2 ; [*127F.0020.0002] # PLAYING CARD TRUMP-18 +1F0F3 ; [*1280.0020.0002] # PLAYING CARD TRUMP-19 +1F0F4 ; [*1281.0020.0002] # PLAYING CARD TRUMP-20 +1F0F5 ; [*1282.0020.0002] # PLAYING CARD TRUMP-21 +1F1E6 ; [*09E3.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER A +1F1E7 ; [*09E4.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER B +1F1E8 ; [*09E5.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER C +1F1E9 ; [*09E6.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER D +1F1EA ; [*09E7.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER E +1F1EB ; [*09E8.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER F +1F1EC ; [*09E9.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER G +1F1ED ; [*09EA.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER H +1F1EE ; [*09EB.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER I +1F1EF ; [*09EC.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER J +1F1F0 ; [*09ED.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER K +1F1F1 ; [*09EE.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER L +1F1F2 ; [*09EF.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER M +1F1F3 ; [*09F0.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER N +1F1F4 ; [*09F1.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER O +1F1F5 ; [*09F2.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER P +1F1F6 ; [*09F3.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Q +1F1F7 ; [*09F4.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER R +1F1F8 ; [*09F5.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER S +1F1F9 ; [*09F6.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER T +1F1FA ; [*09F7.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER U +1F1FB ; [*09F8.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER V +1F1FC ; [*09F9.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER W +1F1FD ; [*09FA.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER X +1F1FE ; [*09FB.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Y +1F1FF ; [*09FC.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Z +1F300 ; [*1283.0020.0002] # CYCLONE +1F301 ; [*1284.0020.0002] # FOGGY +1F302 ; [*1285.0020.0002] # CLOSED UMBRELLA +1F303 ; [*1286.0020.0002] # NIGHT WITH STARS +1F304 ; [*1287.0020.0002] # SUNRISE OVER MOUNTAINS +1F305 ; [*1288.0020.0002] # SUNRISE +1F306 ; [*1289.0020.0002] # CITYSCAPE AT DUSK +1F307 ; [*128A.0020.0002] # SUNSET OVER BUILDINGS +1F308 ; [*128B.0020.0002] # RAINBOW +1F309 ; [*128C.0020.0002] # BRIDGE AT NIGHT +1F30A ; [*128D.0020.0002] # WATER WAVE +1F30B ; [*128E.0020.0002] # VOLCANO +1F30C ; [*128F.0020.0002] # MILKY WAY +1F30D ; [*1290.0020.0002] # EARTH GLOBE EUROPE-AFRICA +1F30E ; [*1291.0020.0002] # EARTH GLOBE AMERICAS +1F30F ; [*1292.0020.0002] # EARTH GLOBE ASIA-AUSTRALIA +1F310 ; [*1293.0020.0002] # GLOBE WITH MERIDIANS +1F311 ; [*1294.0020.0002] # NEW MOON SYMBOL +1F312 ; [*1295.0020.0002] # WAXING CRESCENT MOON SYMBOL +1F313 ; [*1296.0020.0002] # FIRST QUARTER MOON SYMBOL +1F314 ; [*1297.0020.0002] # WAXING GIBBOUS MOON SYMBOL +1F315 ; [*1298.0020.0002] # FULL MOON SYMBOL +1F316 ; [*1299.0020.0002] # WANING GIBBOUS MOON SYMBOL +1F317 ; [*129A.0020.0002] # LAST QUARTER MOON SYMBOL +1F318 ; [*129B.0020.0002] # WANING CRESCENT MOON SYMBOL +1F319 ; [*129C.0020.0002] # CRESCENT MOON +1F31A ; [*129D.0020.0002] # NEW MOON WITH FACE +1F31B ; [*129E.0020.0002] # FIRST QUARTER MOON WITH FACE +1F31C ; [*129F.0020.0002] # LAST QUARTER MOON WITH FACE +1F31D ; [*12A0.0020.0002] # FULL MOON WITH FACE +1F31E ; [*12A1.0020.0002] # SUN WITH FACE +1F31F ; [*12A2.0020.0002] # GLOWING STAR +1F320 ; [*12A3.0020.0002] # SHOOTING STAR +1F321 ; [*12A4.0020.0002] # THERMOMETER +1F322 ; [*12A5.0020.0002] # BLACK DROPLET +1F323 ; [*12A6.0020.0002] # WHITE SUN +1F324 ; [*12A7.0020.0002] # WHITE SUN WITH SMALL CLOUD +1F325 ; [*12A8.0020.0002] # WHITE SUN BEHIND CLOUD +1F326 ; [*12A9.0020.0002] # WHITE SUN BEHIND CLOUD WITH RAIN +1F327 ; [*12AA.0020.0002] # CLOUD WITH RAIN +1F328 ; [*12AB.0020.0002] # CLOUD WITH SNOW +1F329 ; [*12AC.0020.0002] # CLOUD WITH LIGHTNING +1F32A ; [*12AD.0020.0002] # CLOUD WITH TORNADO +1F32B ; [*12AE.0020.0002] # FOG +1F32C ; [*12AF.0020.0002] # WIND BLOWING FACE +1F32D ; [*12B0.0020.0002] # HOT DOG +1F32E ; [*12B1.0020.0002] # TACO +1F32F ; [*12B2.0020.0002] # BURRITO +1F330 ; [*12B3.0020.0002] # CHESTNUT +1F331 ; [*12B4.0020.0002] # SEEDLING +1F332 ; [*12B5.0020.0002] # EVERGREEN TREE +1F333 ; [*12B6.0020.0002] # DECIDUOUS TREE +1F334 ; [*12B7.0020.0002] # PALM TREE +1F335 ; [*12B8.0020.0002] # CACTUS +1F336 ; [*12B9.0020.0002] # HOT PEPPER +1F337 ; [*12BA.0020.0002] # TULIP +1F338 ; [*12BB.0020.0002] # CHERRY BLOSSOM +1F339 ; [*12BC.0020.0002] # ROSE +1F33A ; [*12BD.0020.0002] # HIBISCUS +1F33B ; [*12BE.0020.0002] # SUNFLOWER +1F33C ; [*12BF.0020.0002] # BLOSSOM +1F33D ; [*12C0.0020.0002] # EAR OF MAIZE +1F33E ; [*12C1.0020.0002] # EAR OF RICE +1F33F ; [*12C2.0020.0002] # HERB +1F340 ; [*12C3.0020.0002] # FOUR LEAF CLOVER +1F341 ; [*12C4.0020.0002] # MAPLE LEAF +1F342 ; [*12C5.0020.0002] # FALLEN LEAF +1F343 ; [*12C6.0020.0002] # LEAF FLUTTERING IN WIND +1F344 ; [*12C7.0020.0002] # MUSHROOM +1F345 ; [*12C8.0020.0002] # TOMATO +1F346 ; [*12C9.0020.0002] # AUBERGINE +1F347 ; [*12CA.0020.0002] # GRAPES +1F348 ; [*12CB.0020.0002] # MELON +1F349 ; [*12CC.0020.0002] # WATERMELON +1F34A ; [*12CD.0020.0002] # TANGERINE +1F34B ; [*12CE.0020.0002] # LEMON +1F34C ; [*12CF.0020.0002] # BANANA +1F34D ; [*12D0.0020.0002] # PINEAPPLE +1F34E ; [*12D1.0020.0002] # RED APPLE +1F34F ; [*12D2.0020.0002] # GREEN APPLE +1F350 ; [*12D3.0020.0002] # PEAR +1F351 ; [*12D4.0020.0002] # PEACH +1F352 ; [*12D5.0020.0002] # CHERRIES +1F353 ; [*12D6.0020.0002] # STRAWBERRY +1F354 ; [*12D7.0020.0002] # HAMBURGER +1F355 ; [*12D8.0020.0002] # SLICE OF PIZZA +1F356 ; [*12D9.0020.0002] # MEAT ON BONE +1F357 ; [*12DA.0020.0002] # POULTRY LEG +1F358 ; [*12DB.0020.0002] # RICE CRACKER +1F359 ; [*12DC.0020.0002] # RICE BALL +1F35A ; [*12DD.0020.0002] # COOKED RICE +1F35B ; [*12DE.0020.0002] # CURRY AND RICE +1F35C ; [*12DF.0020.0002] # STEAMING BOWL +1F35D ; [*12E0.0020.0002] # SPAGHETTI +1F35E ; [*12E1.0020.0002] # BREAD +1F35F ; [*12E2.0020.0002] # FRENCH FRIES +1F360 ; [*12E3.0020.0002] # ROASTED SWEET POTATO +1F361 ; [*12E4.0020.0002] # DANGO +1F362 ; [*12E5.0020.0002] # ODEN +1F363 ; [*12E6.0020.0002] # SUSHI +1F364 ; [*12E7.0020.0002] # FRIED SHRIMP +1F365 ; [*12E8.0020.0002] # FISH CAKE WITH SWIRL DESIGN +1F366 ; [*12E9.0020.0002] # SOFT ICE CREAM +1F367 ; [*12EA.0020.0002] # SHAVED ICE +1F368 ; [*12EB.0020.0002] # ICE CREAM +1F369 ; [*12EC.0020.0002] # DOUGHNUT +1F36A ; [*12ED.0020.0002] # COOKIE +1F36B ; [*12EE.0020.0002] # CHOCOLATE BAR +1F36C ; [*12EF.0020.0002] # CANDY +1F36D ; [*12F0.0020.0002] # LOLLIPOP +1F36E ; [*12F1.0020.0002] # CUSTARD +1F36F ; [*12F2.0020.0002] # HONEY POT +1F370 ; [*12F3.0020.0002] # SHORTCAKE +1F371 ; [*12F4.0020.0002] # BENTO BOX +1F372 ; [*12F5.0020.0002] # POT OF FOOD +1F373 ; [*12F6.0020.0002] # COOKING +1F374 ; [*12F7.0020.0002] # FORK AND KNIFE +1F375 ; [*12F8.0020.0002] # TEACUP WITHOUT HANDLE +1F376 ; [*12F9.0020.0002] # SAKE BOTTLE AND CUP +1F377 ; [*12FA.0020.0002] # WINE GLASS +1F378 ; [*12FB.0020.0002] # COCKTAIL GLASS +1F379 ; [*12FC.0020.0002] # TROPICAL DRINK +1F37A ; [*12FD.0020.0002] # BEER MUG +1F37B ; [*12FE.0020.0002] # CLINKING BEER MUGS +1F37C ; [*12FF.0020.0002] # BABY BOTTLE +1F37D ; [*1300.0020.0002] # FORK AND KNIFE WITH PLATE +1F37E ; [*1301.0020.0002] # BOTTLE WITH POPPING CORK +1F37F ; [*1302.0020.0002] # POPCORN +1F380 ; [*1303.0020.0002] # RIBBON +1F381 ; [*1304.0020.0002] # WRAPPED PRESENT +1F382 ; [*1305.0020.0002] # BIRTHDAY CAKE +1F383 ; [*1306.0020.0002] # JACK-O-LANTERN +1F384 ; [*1307.0020.0002] # CHRISTMAS TREE +1F385 ; [*1308.0020.0002] # FATHER CHRISTMAS +1F386 ; [*1309.0020.0002] # FIREWORKS +1F387 ; [*130A.0020.0002] # FIREWORK SPARKLER +1F388 ; [*130B.0020.0002] # BALLOON +1F389 ; [*130C.0020.0002] # PARTY POPPER +1F38A ; [*130D.0020.0002] # CONFETTI BALL +1F38B ; [*130E.0020.0002] # TANABATA TREE +1F38C ; [*130F.0020.0002] # CROSSED FLAGS +1F38D ; [*1310.0020.0002] # PINE DECORATION +1F38E ; [*1311.0020.0002] # JAPANESE DOLLS +1F38F ; [*1312.0020.0002] # CARP STREAMER +1F390 ; [*1313.0020.0002] # WIND CHIME +1F391 ; [*1314.0020.0002] # MOON VIEWING CEREMONY +1F392 ; [*1315.0020.0002] # SCHOOL SATCHEL +1F393 ; [*1316.0020.0002] # GRADUATION CAP +1F394 ; [*1317.0020.0002] # HEART WITH TIP ON THE LEFT +1F395 ; [*1318.0020.0002] # BOUQUET OF FLOWERS +1F396 ; [*1319.0020.0002] # MILITARY MEDAL +1F397 ; [*131A.0020.0002] # REMINDER RIBBON +1F398 ; [*131B.0020.0002] # MUSICAL KEYBOARD WITH JACKS +1F399 ; [*131C.0020.0002] # STUDIO MICROPHONE +1F39A ; [*131D.0020.0002] # LEVEL SLIDER +1F39B ; [*131E.0020.0002] # CONTROL KNOBS +1F39C ; [*131F.0020.0002] # BEAMED ASCENDING MUSICAL NOTES +1F39D ; [*1320.0020.0002] # BEAMED DESCENDING MUSICAL NOTES +1F39E ; [*1321.0020.0002] # FILM FRAMES +1F39F ; [*1322.0020.0002] # ADMISSION TICKETS +1F3A0 ; [*1323.0020.0002] # CAROUSEL HORSE +1F3A1 ; [*1324.0020.0002] # FERRIS WHEEL +1F3A2 ; [*1325.0020.0002] # ROLLER COASTER +1F3A3 ; [*1326.0020.0002] # FISHING POLE AND FISH +1F3A4 ; [*1327.0020.0002] # MICROPHONE +1F3A5 ; [*1328.0020.0002] # MOVIE CAMERA +1F3A6 ; [*1329.0020.0002] # CINEMA +1F3A7 ; [*132A.0020.0002] # HEADPHONE +1F3A8 ; [*132B.0020.0002] # ARTIST PALETTE +1F3A9 ; [*132C.0020.0002] # TOP HAT +1F3AA ; [*132D.0020.0002] # CIRCUS TENT +1F3AB ; [*132E.0020.0002] # TICKET +1F3AC ; [*132F.0020.0002] # CLAPPER BOARD +1F3AD ; [*1330.0020.0002] # PERFORMING ARTS +1F3AE ; [*1331.0020.0002] # VIDEO GAME +1F3AF ; [*1332.0020.0002] # DIRECT HIT +1F3B0 ; [*1333.0020.0002] # SLOT MACHINE +1F3B1 ; [*1334.0020.0002] # BILLIARDS +1F3B2 ; [*1335.0020.0002] # GAME DIE +1F3B3 ; [*1336.0020.0002] # BOWLING +1F3B4 ; [*1337.0020.0002] # FLOWER PLAYING CARDS +1F3B5 ; [*1338.0020.0002] # MUSICAL NOTE +1F3B6 ; [*1339.0020.0002] # MULTIPLE MUSICAL NOTES +1F3B7 ; [*133A.0020.0002] # SAXOPHONE +1F3B8 ; [*133B.0020.0002] # GUITAR +1F3B9 ; [*133C.0020.0002] # MUSICAL KEYBOARD +1F3BA ; [*133D.0020.0002] # TRUMPET +1F3BB ; [*133E.0020.0002] # VIOLIN +1F3BC ; [*133F.0020.0002] # MUSICAL SCORE +1F3BD ; [*1340.0020.0002] # RUNNING SHIRT WITH SASH +1F3BE ; [*1341.0020.0002] # TENNIS RACQUET AND BALL +1F3BF ; [*1342.0020.0002] # SKI AND SKI BOOT +1F3C0 ; [*1343.0020.0002] # BASKETBALL AND HOOP +1F3C1 ; [*1344.0020.0002] # CHEQUERED FLAG +1F3C2 ; [*1345.0020.0002] # SNOWBOARDER +1F3C3 ; [*1346.0020.0002] # RUNNER +1F3C4 ; [*1347.0020.0002] # SURFER +1F3C5 ; [*1348.0020.0002] # SPORTS MEDAL +1F3C6 ; [*1349.0020.0002] # TROPHY +1F3C7 ; [*134A.0020.0002] # HORSE RACING +1F3C8 ; [*134B.0020.0002] # AMERICAN FOOTBALL +1F3C9 ; [*134C.0020.0002] # RUGBY FOOTBALL +1F3CA ; [*134D.0020.0002] # SWIMMER +1F3CB ; [*134E.0020.0002] # WEIGHT LIFTER +1F3CC ; [*134F.0020.0002] # GOLFER +1F3CD ; [*1350.0020.0002] # RACING MOTORCYCLE +1F3CE ; [*1351.0020.0002] # RACING CAR +1F3CF ; [*1352.0020.0002] # CRICKET BAT AND BALL +1F3D0 ; [*1353.0020.0002] # VOLLEYBALL +1F3D1 ; [*1354.0020.0002] # FIELD HOCKEY STICK AND BALL +1F3D2 ; [*1355.0020.0002] # ICE HOCKEY STICK AND PUCK +1F3D3 ; [*1356.0020.0002] # TABLE TENNIS PADDLE AND BALL +1F3D4 ; [*1357.0020.0002] # SNOW CAPPED MOUNTAIN +1F3D5 ; [*1358.0020.0002] # CAMPING +1F3D6 ; [*1359.0020.0002] # BEACH WITH UMBRELLA +1F3D7 ; [*135A.0020.0002] # BUILDING CONSTRUCTION +1F3D8 ; [*135B.0020.0002] # HOUSE BUILDINGS +1F3D9 ; [*135C.0020.0002] # CITYSCAPE +1F3DA ; [*135D.0020.0002] # DERELICT HOUSE BUILDING +1F3DB ; [*135E.0020.0002] # CLASSICAL BUILDING +1F3DC ; [*135F.0020.0002] # DESERT +1F3DD ; [*1360.0020.0002] # DESERT ISLAND +1F3DE ; [*1361.0020.0002] # NATIONAL PARK +1F3DF ; [*1362.0020.0002] # STADIUM +1F3E0 ; [*1363.0020.0002] # HOUSE BUILDING +1F3E1 ; [*1364.0020.0002] # HOUSE WITH GARDEN +1F3E2 ; [*1365.0020.0002] # OFFICE BUILDING +1F3E3 ; [*1366.0020.0002] # JAPANESE POST OFFICE +1F3E4 ; [*1367.0020.0002] # EUROPEAN POST OFFICE +1F3E5 ; [*1368.0020.0002] # HOSPITAL +1F3E6 ; [*1369.0020.0002] # BANK +1F3E7 ; [*136A.0020.0002] # AUTOMATED TELLER MACHINE +1F3E8 ; [*136B.0020.0002] # HOTEL +1F3E9 ; [*136C.0020.0002] # LOVE HOTEL +1F3EA ; [*136D.0020.0002] # CONVENIENCE STORE +1F3EB ; [*136E.0020.0002] # SCHOOL +1F3EC ; [*136F.0020.0002] # DEPARTMENT STORE +1F3ED ; [*1370.0020.0002] # FACTORY +1F3EE ; [*1371.0020.0002] # IZAKAYA LANTERN +1F3EF ; [*1372.0020.0002] # JAPANESE CASTLE +1F3F0 ; [*1373.0020.0002] # EUROPEAN CASTLE +1F3F1 ; [*1374.0020.0002] # WHITE PENNANT +1F3F2 ; [*1375.0020.0002] # BLACK PENNANT +1F3F3 ; [*1376.0020.0002] # WAVING WHITE FLAG +1F3F4 ; [*1377.0020.0002] # WAVING BLACK FLAG +1F3F5 ; [*1378.0020.0002] # ROSETTE +1F3F6 ; [*1379.0020.0002] # BLACK ROSETTE +1F3F7 ; [*137A.0020.0002] # LABEL +1F3F8 ; [*137B.0020.0002] # BADMINTON RACQUET AND SHUTTLECOCK +1F3F9 ; [*137C.0020.0002] # BOW AND ARROW +1F3FA ; [*137D.0020.0002] # AMPHORA +1F3FB ; [*137E.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-1-2 +1F3FC ; [*137F.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-3 +1F3FD ; [*1380.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-4 +1F3FE ; [*1381.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-5 +1F3FF ; [*1382.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400 ; [*1383.0020.0002] # RAT +1F401 ; [*1384.0020.0002] # MOUSE +1F402 ; [*1385.0020.0002] # OX +1F403 ; [*1386.0020.0002] # WATER BUFFALO +1F404 ; [*1387.0020.0002] # COW +1F405 ; [*1388.0020.0002] # TIGER +1F406 ; [*1389.0020.0002] # LEOPARD +1F407 ; [*138A.0020.0002] # RABBIT +1F408 ; [*138B.0020.0002] # CAT +1F409 ; [*138C.0020.0002] # DRAGON +1F40A ; [*138D.0020.0002] # CROCODILE +1F40B ; [*138E.0020.0002] # WHALE +1F40C ; [*138F.0020.0002] # SNAIL +1F40D ; [*1390.0020.0002] # SNAKE +1F40E ; [*1391.0020.0002] # HORSE +1F40F ; [*1392.0020.0002] # RAM +1F410 ; [*1393.0020.0002] # GOAT +1F411 ; [*1394.0020.0002] # SHEEP +1F412 ; [*1395.0020.0002] # MONKEY +1F413 ; [*1396.0020.0002] # ROOSTER +1F414 ; [*1397.0020.0002] # CHICKEN +1F415 ; [*1398.0020.0002] # DOG +1F416 ; [*1399.0020.0002] # PIG +1F417 ; [*139A.0020.0002] # BOAR +1F418 ; [*139B.0020.0002] # ELEPHANT +1F419 ; [*139C.0020.0002] # OCTOPUS +1F41A ; [*139D.0020.0002] # SPIRAL SHELL +1F41B ; [*139E.0020.0002] # BUG +1F41C ; [*139F.0020.0002] # ANT +1F41D ; [*13A0.0020.0002] # HONEYBEE +1F41E ; [*13A1.0020.0002] # LADY BEETLE +1F41F ; [*13A2.0020.0002] # FISH +1F420 ; [*13A3.0020.0002] # TROPICAL FISH +1F421 ; [*13A4.0020.0002] # BLOWFISH +1F422 ; [*13A5.0020.0002] # TURTLE +1F423 ; [*13A6.0020.0002] # HATCHING CHICK +1F424 ; [*13A7.0020.0002] # BABY CHICK +1F425 ; [*13A8.0020.0002] # FRONT-FACING BABY CHICK +1F426 ; [*13A9.0020.0002] # BIRD +1F427 ; [*13AA.0020.0002] # PENGUIN +1F428 ; [*13AB.0020.0002] # KOALA +1F429 ; [*13AC.0020.0002] # POODLE +1F42A ; [*13AD.0020.0002] # DROMEDARY CAMEL +1F42B ; [*13AE.0020.0002] # BACTRIAN CAMEL +1F42C ; [*13AF.0020.0002] # DOLPHIN +1F42D ; [*13B0.0020.0002] # MOUSE FACE +1F42E ; [*13B1.0020.0002] # COW FACE +1F42F ; [*13B2.0020.0002] # TIGER FACE +1F430 ; [*13B3.0020.0002] # RABBIT FACE +1F431 ; [*13B4.0020.0002] # CAT FACE +1F432 ; [*13B5.0020.0002] # DRAGON FACE +1F433 ; [*13B6.0020.0002] # SPOUTING WHALE +1F434 ; [*13B7.0020.0002] # HORSE FACE +1F435 ; [*13B8.0020.0002] # MONKEY FACE +1F436 ; [*13B9.0020.0002] # DOG FACE +1F437 ; [*13BA.0020.0002] # PIG FACE +1F438 ; [*13BB.0020.0002] # FROG FACE +1F439 ; [*13BC.0020.0002] # HAMSTER FACE +1F43A ; [*13BD.0020.0002] # WOLF FACE +1F43B ; [*13BE.0020.0002] # BEAR FACE +1F43C ; [*13BF.0020.0002] # PANDA FACE +1F43D ; [*13C0.0020.0002] # PIG NOSE +1F43E ; [*13C1.0020.0002] # PAW PRINTS +1F43F ; [*13C2.0020.0002] # CHIPMUNK +1F440 ; [*13C3.0020.0002] # EYES +1F441 ; [*13C4.0020.0002] # EYE +1F442 ; [*13C5.0020.0002] # EAR +1F443 ; [*13C6.0020.0002] # NOSE +1F444 ; [*13C7.0020.0002] # MOUTH +1F445 ; [*13C8.0020.0002] # TONGUE +1F446 ; [*13C9.0020.0002] # WHITE UP POINTING BACKHAND INDEX +1F447 ; [*13CA.0020.0002] # WHITE DOWN POINTING BACKHAND INDEX +1F448 ; [*13CB.0020.0002] # WHITE LEFT POINTING BACKHAND INDEX +1F449 ; [*13CC.0020.0002] # WHITE RIGHT POINTING BACKHAND INDEX +1F44A ; [*13CD.0020.0002] # FISTED HAND SIGN +1F44B ; [*13CE.0020.0002] # WAVING HAND SIGN +1F44C ; [*13CF.0020.0002] # OK HAND SIGN +1F44D ; [*13D0.0020.0002] # THUMBS UP SIGN +1F44E ; [*13D1.0020.0002] # THUMBS DOWN SIGN +1F44F ; [*13D2.0020.0002] # CLAPPING HANDS SIGN +1F450 ; [*13D3.0020.0002] # OPEN HANDS SIGN +1F451 ; [*13D4.0020.0002] # CROWN +1F452 ; [*13D5.0020.0002] # WOMANS HAT +1F453 ; [*13D6.0020.0002] # EYEGLASSES +1F454 ; [*13D7.0020.0002] # NECKTIE +1F455 ; [*13D8.0020.0002] # T-SHIRT +1F456 ; [*13D9.0020.0002] # JEANS +1F457 ; [*13DA.0020.0002] # DRESS +1F458 ; [*13DB.0020.0002] # KIMONO +1F459 ; [*13DC.0020.0002] # BIKINI +1F45A ; [*13DD.0020.0002] # WOMANS CLOTHES +1F45B ; [*13DE.0020.0002] # PURSE +1F45C ; [*13DF.0020.0002] # HANDBAG +1F45D ; [*13E0.0020.0002] # POUCH +1F45E ; [*13E1.0020.0002] # MANS SHOE +1F45F ; [*13E2.0020.0002] # ATHLETIC SHOE +1F460 ; [*13E3.0020.0002] # HIGH-HEELED SHOE +1F461 ; [*13E4.0020.0002] # WOMANS SANDAL +1F462 ; [*13E5.0020.0002] # WOMANS BOOTS +1F463 ; [*13E6.0020.0002] # FOOTPRINTS +1F464 ; [*13E7.0020.0002] # BUST IN SILHOUETTE +1F465 ; [*13E8.0020.0002] # BUSTS IN SILHOUETTE +1F466 ; [*13E9.0020.0002] # BOY +1F467 ; [*13EA.0020.0002] # GIRL +1F468 ; [*13EB.0020.0002] # MAN +1F469 ; [*13EC.0020.0002] # WOMAN +1F46A ; [*13ED.0020.0002] # FAMILY +1F46B ; [*13EE.0020.0002] # MAN AND WOMAN HOLDING HANDS +1F46C ; [*13EF.0020.0002] # TWO MEN HOLDING HANDS +1F46D ; [*13F0.0020.0002] # TWO WOMEN HOLDING HANDS +1F46E ; [*13F1.0020.0002] # POLICE OFFICER +1F46F ; [*13F2.0020.0002] # WOMAN WITH BUNNY EARS +1F470 ; [*13F3.0020.0002] # BRIDE WITH VEIL +1F471 ; [*13F4.0020.0002] # PERSON WITH BLOND HAIR +1F472 ; [*13F5.0020.0002] # MAN WITH GUA PI MAO +1F473 ; [*13F6.0020.0002] # MAN WITH TURBAN +1F474 ; [*13F7.0020.0002] # OLDER MAN +1F475 ; [*13F8.0020.0002] # OLDER WOMAN +1F476 ; [*13F9.0020.0002] # BABY +1F477 ; [*13FA.0020.0002] # CONSTRUCTION WORKER +1F478 ; [*13FB.0020.0002] # PRINCESS +1F479 ; [*13FC.0020.0002] # JAPANESE OGRE +1F47A ; [*13FD.0020.0002] # JAPANESE GOBLIN +1F47B ; [*13FE.0020.0002] # GHOST +1F47C ; [*13FF.0020.0002] # BABY ANGEL +1F47D ; [*1400.0020.0002] # EXTRATERRESTRIAL ALIEN +1F47E ; [*1401.0020.0002] # ALIEN MONSTER +1F47F ; [*1402.0020.0002] # IMP +1F480 ; [*1403.0020.0002] # SKULL +1F481 ; [*1404.0020.0002] # INFORMATION DESK PERSON +1F482 ; [*1405.0020.0002] # GUARDSMAN +1F483 ; [*1406.0020.0002] # DANCER +1F484 ; [*1407.0020.0002] # LIPSTICK +1F485 ; [*1408.0020.0002] # NAIL POLISH +1F486 ; [*1409.0020.0002] # FACE MASSAGE +1F487 ; [*140A.0020.0002] # HAIRCUT +1F488 ; [*140B.0020.0002] # BARBER POLE +1F489 ; [*140C.0020.0002] # SYRINGE +1F48A ; [*140D.0020.0002] # PILL +1F48B ; [*140E.0020.0002] # KISS MARK +1F48C ; [*140F.0020.0002] # LOVE LETTER +1F48D ; [*1410.0020.0002] # RING +1F48E ; [*1411.0020.0002] # GEM STONE +1F48F ; [*1412.0020.0002] # KISS +1F490 ; [*1413.0020.0002] # BOUQUET +1F491 ; [*1414.0020.0002] # COUPLE WITH HEART +1F492 ; [*1415.0020.0002] # WEDDING +1F493 ; [*1416.0020.0002] # BEATING HEART +1F494 ; [*1417.0020.0002] # BROKEN HEART +1F495 ; [*1418.0020.0002] # TWO HEARTS +1F496 ; [*1419.0020.0002] # SPARKLING HEART +1F497 ; [*141A.0020.0002] # GROWING HEART +1F498 ; [*141B.0020.0002] # HEART WITH ARROW +1F499 ; [*141C.0020.0002] # BLUE HEART +1F49A ; [*141D.0020.0002] # GREEN HEART +1F49B ; [*141E.0020.0002] # YELLOW HEART +1F49C ; [*141F.0020.0002] # PURPLE HEART +1F49D ; [*1420.0020.0002] # HEART WITH RIBBON +1F49E ; [*1421.0020.0002] # REVOLVING HEARTS +1F49F ; [*1422.0020.0002] # HEART DECORATION +1F4A0 ; [*1423.0020.0002] # DIAMOND SHAPE WITH A DOT INSIDE +1F4A1 ; [*1424.0020.0002] # ELECTRIC LIGHT BULB +1F4A2 ; [*1425.0020.0002] # ANGER SYMBOL +1F4A3 ; [*1426.0020.0002] # BOMB +1F4A4 ; [*1427.0020.0002] # SLEEPING SYMBOL +1F4A5 ; [*1428.0020.0002] # COLLISION SYMBOL +1F4A6 ; [*1429.0020.0002] # SPLASHING SWEAT SYMBOL +1F4A7 ; [*142A.0020.0002] # DROPLET +1F4A8 ; [*142B.0020.0002] # DASH SYMBOL +1F4A9 ; [*142C.0020.0002] # PILE OF POO +1F4AA ; [*142D.0020.0002] # FLEXED BICEPS +1F4AB ; [*142E.0020.0002] # DIZZY SYMBOL +1F4AC ; [*142F.0020.0002] # SPEECH BALLOON +1F4AD ; [*1430.0020.0002] # THOUGHT BALLOON +1F4AE ; [*1431.0020.0002] # WHITE FLOWER +1F4AF ; [*1432.0020.0002] # HUNDRED POINTS SYMBOL +1F4B0 ; [*1433.0020.0002] # MONEY BAG +1F4B1 ; [*1434.0020.0002] # CURRENCY EXCHANGE +1F4B2 ; [*1435.0020.0002] # HEAVY DOLLAR SIGN +1F4B3 ; [*1436.0020.0002] # CREDIT CARD +1F4B4 ; [*1437.0020.0002] # BANKNOTE WITH YEN SIGN +1F4B5 ; [*1438.0020.0002] # BANKNOTE WITH DOLLAR SIGN +1F4B6 ; [*1439.0020.0002] # BANKNOTE WITH EURO SIGN +1F4B7 ; [*143A.0020.0002] # BANKNOTE WITH POUND SIGN +1F4B8 ; [*143B.0020.0002] # MONEY WITH WINGS +1F4B9 ; [*143C.0020.0002] # CHART WITH UPWARDS TREND AND YEN SIGN +1F4BA ; [*143D.0020.0002] # SEAT +1F4BB ; [*143E.0020.0002] # PERSONAL COMPUTER +1F4BC ; [*143F.0020.0002] # BRIEFCASE +1F4BD ; [*1440.0020.0002] # MINIDISC +1F4BE ; [*1441.0020.0002] # FLOPPY DISK +1F4BF ; [*1442.0020.0002] # OPTICAL DISC +1F4C0 ; [*1443.0020.0002] # DVD +1F4C1 ; [*1444.0020.0002] # FILE FOLDER +1F4C2 ; [*1445.0020.0002] # OPEN FILE FOLDER +1F4C3 ; [*1446.0020.0002] # PAGE WITH CURL +1F4C4 ; [*1447.0020.0002] # PAGE FACING UP +1F4C5 ; [*1448.0020.0002] # CALENDAR +1F4C6 ; [*1449.0020.0002] # TEAR-OFF CALENDAR +1F4C7 ; [*144A.0020.0002] # CARD INDEX +1F4C8 ; [*144B.0020.0002] # CHART WITH UPWARDS TREND +1F4C9 ; [*144C.0020.0002] # CHART WITH DOWNWARDS TREND +1F4CA ; [*144D.0020.0002] # BAR CHART +1F4CB ; [*144E.0020.0002] # CLIPBOARD +1F4CC ; [*144F.0020.0002] # PUSHPIN +1F4CD ; [*1450.0020.0002] # ROUND PUSHPIN +1F4CE ; [*1451.0020.0002] # PAPERCLIP +1F4CF ; [*1452.0020.0002] # STRAIGHT RULER +1F4D0 ; [*1453.0020.0002] # TRIANGULAR RULER +1F4D1 ; [*1454.0020.0002] # BOOKMARK TABS +1F4D2 ; [*1455.0020.0002] # LEDGER +1F4D3 ; [*1456.0020.0002] # NOTEBOOK +1F4D4 ; [*1457.0020.0002] # NOTEBOOK WITH DECORATIVE COVER +1F4D5 ; [*1458.0020.0002] # CLOSED BOOK +1F4D6 ; [*1459.0020.0002] # OPEN BOOK +1F4D7 ; [*145A.0020.0002] # GREEN BOOK +1F4D8 ; [*145B.0020.0002] # BLUE BOOK +1F4D9 ; [*145C.0020.0002] # ORANGE BOOK +1F4DA ; [*145D.0020.0002] # BOOKS +1F4DB ; [*145E.0020.0002] # NAME BADGE +1F4DC ; [*145F.0020.0002] # SCROLL +1F4DD ; [*1460.0020.0002] # MEMO +1F4DE ; [*1461.0020.0002] # TELEPHONE RECEIVER +1F4DF ; [*1462.0020.0002] # PAGER +1F4E0 ; [*1463.0020.0002] # FAX MACHINE +1F4E1 ; [*1464.0020.0002] # SATELLITE ANTENNA +1F4E2 ; [*1465.0020.0002] # PUBLIC ADDRESS LOUDSPEAKER +1F4E3 ; [*1466.0020.0002] # CHEERING MEGAPHONE +1F4E4 ; [*1467.0020.0002] # OUTBOX TRAY +1F4E5 ; [*1468.0020.0002] # INBOX TRAY +1F4E6 ; [*1469.0020.0002] # PACKAGE +1F4E7 ; [*146A.0020.0002] # E-MAIL SYMBOL +1F4E8 ; [*146B.0020.0002] # INCOMING ENVELOPE +1F4E9 ; [*146C.0020.0002] # ENVELOPE WITH DOWNWARDS ARROW ABOVE +1F4EA ; [*146D.0020.0002] # CLOSED MAILBOX WITH LOWERED FLAG +1F4EB ; [*146E.0020.0002] # CLOSED MAILBOX WITH RAISED FLAG +1F4EC ; [*146F.0020.0002] # OPEN MAILBOX WITH RAISED FLAG +1F4ED ; [*1470.0020.0002] # OPEN MAILBOX WITH LOWERED FLAG +1F4EE ; [*1471.0020.0002] # POSTBOX +1F4EF ; [*1472.0020.0002] # POSTAL HORN +1F4F0 ; [*1473.0020.0002] # NEWSPAPER +1F4F1 ; [*1474.0020.0002] # MOBILE PHONE +1F4F2 ; [*1475.0020.0002] # MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT +1F4F3 ; [*1476.0020.0002] # VIBRATION MODE +1F4F4 ; [*1477.0020.0002] # MOBILE PHONE OFF +1F4F5 ; [*1478.0020.0002] # NO MOBILE PHONES +1F4F6 ; [*1479.0020.0002] # ANTENNA WITH BARS +1F4F7 ; [*147A.0020.0002] # CAMERA +1F4F8 ; [*147B.0020.0002] # CAMERA WITH FLASH +1F4F9 ; [*147C.0020.0002] # VIDEO CAMERA +1F4FA ; [*147D.0020.0002] # TELEVISION +1F4FB ; [*147E.0020.0002] # RADIO +1F4FC ; [*147F.0020.0002] # VIDEOCASSETTE +1F4FD ; [*1480.0020.0002] # FILM PROJECTOR +1F4FE ; [*1481.0020.0002] # PORTABLE STEREO +1F4FF ; [*1482.0020.0002] # PRAYER BEADS +1F500 ; [*1483.0020.0002] # TWISTED RIGHTWARDS ARROWS +1F501 ; [*1484.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS +1F502 ; [*1485.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY +1F503 ; [*1486.0020.0002] # CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS +1F504 ; [*1487.0020.0002] # ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS +1F505 ; [*1488.0020.0002] # LOW BRIGHTNESS SYMBOL +1F506 ; [*1489.0020.0002] # HIGH BRIGHTNESS SYMBOL +1F507 ; [*148A.0020.0002] # SPEAKER WITH CANCELLATION STROKE +1F508 ; [*148B.0020.0002] # SPEAKER +1F509 ; [*148C.0020.0002] # SPEAKER WITH ONE SOUND WAVE +1F50A ; [*148D.0020.0002] # SPEAKER WITH THREE SOUND WAVES +1F50B ; [*148E.0020.0002] # BATTERY +1F50C ; [*148F.0020.0002] # ELECTRIC PLUG +1F50D ; [*1490.0020.0002] # LEFT-POINTING MAGNIFYING GLASS +1F50E ; [*1491.0020.0002] # RIGHT-POINTING MAGNIFYING GLASS +1F50F ; [*1492.0020.0002] # LOCK WITH INK PEN +1F510 ; [*1493.0020.0002] # CLOSED LOCK WITH KEY +1F511 ; [*1494.0020.0002] # KEY +1F512 ; [*1495.0020.0002] # LOCK +1F513 ; [*1496.0020.0002] # OPEN LOCK +1F514 ; [*1497.0020.0002] # BELL +1F515 ; [*1498.0020.0002] # BELL WITH CANCELLATION STROKE +1F516 ; [*1499.0020.0002] # BOOKMARK +1F517 ; [*149A.0020.0002] # LINK SYMBOL +1F518 ; [*149B.0020.0002] # RADIO BUTTON +1F519 ; [*149C.0020.0002] # BACK WITH LEFTWARDS ARROW ABOVE +1F51A ; [*149D.0020.0002] # END WITH LEFTWARDS ARROW ABOVE +1F51B ; [*149E.0020.0002] # ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE +1F51C ; [*149F.0020.0002] # SOON WITH RIGHTWARDS ARROW ABOVE +1F51D ; [*14A0.0020.0002] # TOP WITH UPWARDS ARROW ABOVE +1F51E ; [*14A1.0020.0002] # NO ONE UNDER EIGHTEEN SYMBOL +1F51F ; [*14A2.0020.0002] # KEYCAP TEN +1F520 ; [*14A3.0020.0002] # INPUT SYMBOL FOR LATIN CAPITAL LETTERS +1F521 ; [*14A4.0020.0002] # INPUT SYMBOL FOR LATIN SMALL LETTERS +1F522 ; [*14A5.0020.0002] # INPUT SYMBOL FOR NUMBERS +1F523 ; [*14A6.0020.0002] # INPUT SYMBOL FOR SYMBOLS +1F524 ; [*14A7.0020.0002] # INPUT SYMBOL FOR LATIN LETTERS +1F525 ; [*14A8.0020.0002] # FIRE +1F526 ; [*14A9.0020.0002] # ELECTRIC TORCH +1F527 ; [*14AA.0020.0002] # WRENCH +1F528 ; [*14AB.0020.0002] # HAMMER +1F529 ; [*14AC.0020.0002] # NUT AND BOLT +1F52A ; [*14AD.0020.0002] # HOCHO +1F52B ; [*14AE.0020.0002] # PISTOL +1F52C ; [*14AF.0020.0002] # MICROSCOPE +1F52D ; [*14B0.0020.0002] # TELESCOPE +1F52E ; [*14B1.0020.0002] # CRYSTAL BALL +1F52F ; [*14B2.0020.0002] # SIX POINTED STAR WITH MIDDLE DOT +1F530 ; [*14B3.0020.0002] # JAPANESE SYMBOL FOR BEGINNER +1F531 ; [*14B4.0020.0002] # TRIDENT EMBLEM +1F532 ; [*14B5.0020.0002] # BLACK SQUARE BUTTON +1F533 ; [*14B6.0020.0002] # WHITE SQUARE BUTTON +1F534 ; [*14B7.0020.0002] # LARGE RED CIRCLE +1F535 ; [*14B8.0020.0002] # LARGE BLUE CIRCLE +1F536 ; [*14B9.0020.0002] # LARGE ORANGE DIAMOND +1F537 ; [*14BA.0020.0002] # LARGE BLUE DIAMOND +1F538 ; [*14BB.0020.0002] # SMALL ORANGE DIAMOND +1F539 ; [*14BC.0020.0002] # SMALL BLUE DIAMOND +1F53A ; [*14BD.0020.0002] # UP-POINTING RED TRIANGLE +1F53B ; [*14BE.0020.0002] # DOWN-POINTING RED TRIANGLE +1F53C ; [*14BF.0020.0002] # UP-POINTING SMALL RED TRIANGLE +1F53D ; [*14C0.0020.0002] # DOWN-POINTING SMALL RED TRIANGLE +1F53E ; [*14C1.0020.0002] # LOWER RIGHT SHADOWED WHITE CIRCLE +1F53F ; [*14C2.0020.0002] # UPPER RIGHT SHADOWED WHITE CIRCLE +1F540 ; [*14C3.0020.0002] # CIRCLED CROSS POMMEE +1F541 ; [*14C4.0020.0002] # CROSS POMMEE WITH HALF-CIRCLE BELOW +1F542 ; [*14C5.0020.0002] # CROSS POMMEE +1F543 ; [*14C6.0020.0002] # NOTCHED LEFT SEMICIRCLE WITH THREE DOTS +1F544 ; [*14C7.0020.0002] # NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS +1F545 ; [*14C8.0020.0002] # SYMBOL FOR MARKS CHAPTER +1F546 ; [*14C9.0020.0002] # WHITE LATIN CROSS +1F547 ; [*14CA.0020.0002] # HEAVY LATIN CROSS +1F548 ; [*14CB.0020.0002] # CELTIC CROSS +1F549 ; [*14CC.0020.0002] # OM SYMBOL +1F54A ; [*14CD.0020.0002] # DOVE OF PEACE +1F54B ; [*14CE.0020.0002] # KAABA +1F54C ; [*14CF.0020.0002] # MOSQUE +1F54D ; [*14D0.0020.0002] # SYNAGOGUE +1F54E ; [*14D1.0020.0002] # MENORAH WITH NINE BRANCHES +1F54F ; [*14D2.0020.0002] # BOWL OF HYGIEIA +1F550 ; [*14D3.0020.0002] # CLOCK FACE ONE OCLOCK +1F551 ; [*14D4.0020.0002] # CLOCK FACE TWO OCLOCK +1F552 ; [*14D5.0020.0002] # CLOCK FACE THREE OCLOCK +1F553 ; [*14D6.0020.0002] # CLOCK FACE FOUR OCLOCK +1F554 ; [*14D7.0020.0002] # CLOCK FACE FIVE OCLOCK +1F555 ; [*14D8.0020.0002] # CLOCK FACE SIX OCLOCK +1F556 ; [*14D9.0020.0002] # CLOCK FACE SEVEN OCLOCK +1F557 ; [*14DA.0020.0002] # CLOCK FACE EIGHT OCLOCK +1F558 ; [*14DB.0020.0002] # CLOCK FACE NINE OCLOCK +1F559 ; [*14DC.0020.0002] # CLOCK FACE TEN OCLOCK +1F55A ; [*14DD.0020.0002] # CLOCK FACE ELEVEN OCLOCK +1F55B ; [*14DE.0020.0002] # CLOCK FACE TWELVE OCLOCK +1F55C ; [*14DF.0020.0002] # CLOCK FACE ONE-THIRTY +1F55D ; [*14E0.0020.0002] # CLOCK FACE TWO-THIRTY +1F55E ; [*14E1.0020.0002] # CLOCK FACE THREE-THIRTY +1F55F ; [*14E2.0020.0002] # CLOCK FACE FOUR-THIRTY +1F560 ; [*14E3.0020.0002] # CLOCK FACE FIVE-THIRTY +1F561 ; [*14E4.0020.0002] # CLOCK FACE SIX-THIRTY +1F562 ; [*14E5.0020.0002] # CLOCK FACE SEVEN-THIRTY +1F563 ; [*14E6.0020.0002] # CLOCK FACE EIGHT-THIRTY +1F564 ; [*14E7.0020.0002] # CLOCK FACE NINE-THIRTY +1F565 ; [*14E8.0020.0002] # CLOCK FACE TEN-THIRTY +1F566 ; [*14E9.0020.0002] # CLOCK FACE ELEVEN-THIRTY +1F567 ; [*14EA.0020.0002] # CLOCK FACE TWELVE-THIRTY +1F568 ; [*14EB.0020.0002] # RIGHT SPEAKER +1F569 ; [*14EC.0020.0002] # RIGHT SPEAKER WITH ONE SOUND WAVE +1F56A ; [*14ED.0020.0002] # RIGHT SPEAKER WITH THREE SOUND WAVES +1F56B ; [*14EE.0020.0002] # BULLHORN +1F56C ; [*14EF.0020.0002] # BULLHORN WITH SOUND WAVES +1F56D ; [*14F0.0020.0002] # RINGING BELL +1F56E ; [*14F1.0020.0002] # BOOK +1F56F ; [*14F2.0020.0002] # CANDLE +1F570 ; [*14F3.0020.0002] # MANTELPIECE CLOCK +1F571 ; [*14F4.0020.0002] # BLACK SKULL AND CROSSBONES +1F572 ; [*14F5.0020.0002] # NO PIRACY +1F573 ; [*14F6.0020.0002] # HOLE +1F574 ; [*14F7.0020.0002] # MAN IN BUSINESS SUIT LEVITATING +1F575 ; [*14F8.0020.0002] # SLEUTH OR SPY +1F576 ; [*14F9.0020.0002] # DARK SUNGLASSES +1F577 ; [*14FA.0020.0002] # SPIDER +1F578 ; [*14FB.0020.0002] # SPIDER WEB +1F579 ; [*14FC.0020.0002] # JOYSTICK +1F57B ; [*14FD.0020.0002] # LEFT HAND TELEPHONE RECEIVER +1F57C ; [*14FE.0020.0002] # TELEPHONE RECEIVER WITH PAGE +1F57D ; [*14FF.0020.0002] # RIGHT HAND TELEPHONE RECEIVER +1F57E ; [*1500.0020.0002] # WHITE TOUCHTONE TELEPHONE +1F57F ; [*1501.0020.0002] # BLACK TOUCHTONE TELEPHONE +1F580 ; [*1502.0020.0002] # TELEPHONE ON TOP OF MODEM +1F581 ; [*1503.0020.0002] # CLAMSHELL MOBILE PHONE +1F582 ; [*1504.0020.0002] # BACK OF ENVELOPE +1F583 ; [*1505.0020.0002] # STAMPED ENVELOPE +1F584 ; [*1506.0020.0002] # ENVELOPE WITH LIGHTNING +1F585 ; [*1507.0020.0002] # FLYING ENVELOPE +1F586 ; [*1508.0020.0002] # PEN OVER STAMPED ENVELOPE +1F587 ; [*1509.0020.0002] # LINKED PAPERCLIPS +1F588 ; [*150A.0020.0002] # BLACK PUSHPIN +1F589 ; [*150B.0020.0002] # LOWER LEFT PENCIL +1F58A ; [*150C.0020.0002] # LOWER LEFT BALLPOINT PEN +1F58B ; [*150D.0020.0002] # LOWER LEFT FOUNTAIN PEN +1F58C ; [*150E.0020.0002] # LOWER LEFT PAINTBRUSH +1F58D ; [*150F.0020.0002] # LOWER LEFT CRAYON +1F58E ; [*1510.0020.0002] # LEFT WRITING HAND +1F58F ; [*1511.0020.0002] # TURNED OK HAND SIGN +1F590 ; [*1512.0020.0002] # RAISED HAND WITH FINGERS SPLAYED +1F591 ; [*1513.0020.0002] # REVERSED RAISED HAND WITH FINGERS SPLAYED +1F592 ; [*1514.0020.0002] # REVERSED THUMBS UP SIGN +1F593 ; [*1515.0020.0002] # REVERSED THUMBS DOWN SIGN +1F594 ; [*1516.0020.0002] # REVERSED VICTORY HAND +1F595 ; [*1517.0020.0002] # REVERSED HAND WITH MIDDLE FINGER EXTENDED +1F596 ; [*1518.0020.0002] # RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597 ; [*1519.0020.0002] # WHITE DOWN POINTING LEFT HAND INDEX +1F598 ; [*151A.0020.0002] # SIDEWAYS WHITE LEFT POINTING INDEX +1F599 ; [*151B.0020.0002] # SIDEWAYS WHITE RIGHT POINTING INDEX +1F59A ; [*151C.0020.0002] # SIDEWAYS BLACK LEFT POINTING INDEX +1F59B ; [*151D.0020.0002] # SIDEWAYS BLACK RIGHT POINTING INDEX +1F59C ; [*151E.0020.0002] # BLACK LEFT POINTING BACKHAND INDEX +1F59D ; [*151F.0020.0002] # BLACK RIGHT POINTING BACKHAND INDEX +1F59E ; [*1520.0020.0002] # SIDEWAYS WHITE UP POINTING INDEX +1F59F ; [*1521.0020.0002] # SIDEWAYS WHITE DOWN POINTING INDEX +1F5A0 ; [*1522.0020.0002] # SIDEWAYS BLACK UP POINTING INDEX +1F5A1 ; [*1523.0020.0002] # SIDEWAYS BLACK DOWN POINTING INDEX +1F5A2 ; [*1524.0020.0002] # BLACK UP POINTING BACKHAND INDEX +1F5A3 ; [*1525.0020.0002] # BLACK DOWN POINTING BACKHAND INDEX +1F5A5 ; [*1526.0020.0002] # DESKTOP COMPUTER +1F5A6 ; [*1527.0020.0002] # KEYBOARD AND MOUSE +1F5A7 ; [*1528.0020.0002] # THREE NETWORKED COMPUTERS +1F5A8 ; [*1529.0020.0002] # PRINTER +1F5A9 ; [*152A.0020.0002] # POCKET CALCULATOR +1F5AA ; [*152B.0020.0002] # BLACK HARD SHELL FLOPPY DISK +1F5AB ; [*152C.0020.0002] # WHITE HARD SHELL FLOPPY DISK +1F5AC ; [*152D.0020.0002] # SOFT SHELL FLOPPY DISK +1F5AD ; [*152E.0020.0002] # TAPE CARTRIDGE +1F5AE ; [*152F.0020.0002] # WIRED KEYBOARD +1F5AF ; [*1530.0020.0002] # ONE BUTTON MOUSE +1F5B0 ; [*1531.0020.0002] # TWO BUTTON MOUSE +1F5B1 ; [*1532.0020.0002] # THREE BUTTON MOUSE +1F5B2 ; [*1533.0020.0002] # TRACKBALL +1F5B3 ; [*1534.0020.0002] # OLD PERSONAL COMPUTER +1F5B4 ; [*1535.0020.0002] # HARD DISK +1F5B5 ; [*1536.0020.0002] # SCREEN +1F5B6 ; [*1537.0020.0002] # PRINTER ICON +1F5B7 ; [*1538.0020.0002] # FAX ICON +1F5B8 ; [*1539.0020.0002] # OPTICAL DISC ICON +1F5B9 ; [*153A.0020.0002] # DOCUMENT WITH TEXT +1F5BA ; [*153B.0020.0002] # DOCUMENT WITH TEXT AND PICTURE +1F5BB ; [*153C.0020.0002] # DOCUMENT WITH PICTURE +1F5BC ; [*153D.0020.0002] # FRAME WITH PICTURE +1F5BD ; [*153E.0020.0002] # FRAME WITH TILES +1F5BE ; [*153F.0020.0002] # FRAME WITH AN X +1F5BF ; [*1540.0020.0002] # BLACK FOLDER +1F5C0 ; [*1541.0020.0002] # FOLDER +1F5C1 ; [*1542.0020.0002] # OPEN FOLDER +1F5C2 ; [*1543.0020.0002] # CARD INDEX DIVIDERS +1F5C3 ; [*1544.0020.0002] # CARD FILE BOX +1F5C4 ; [*1545.0020.0002] # FILE CABINET +1F5C5 ; [*1546.0020.0002] # EMPTY NOTE +1F5C6 ; [*1547.0020.0002] # EMPTY NOTE PAGE +1F5C7 ; [*1548.0020.0002] # EMPTY NOTE PAD +1F5C8 ; [*1549.0020.0002] # NOTE +1F5C9 ; [*154A.0020.0002] # NOTE PAGE +1F5CA ; [*154B.0020.0002] # NOTE PAD +1F5CB ; [*154C.0020.0002] # EMPTY DOCUMENT +1F5CC ; [*154D.0020.0002] # EMPTY PAGE +1F5CD ; [*154E.0020.0002] # EMPTY PAGES +1F5CE ; [*154F.0020.0002] # DOCUMENT +1F5CF ; [*1550.0020.0002] # PAGE +1F5D0 ; [*1551.0020.0002] # PAGES +1F5D1 ; [*1552.0020.0002] # WASTEBASKET +1F5D2 ; [*1553.0020.0002] # SPIRAL NOTE PAD +1F5D3 ; [*1554.0020.0002] # SPIRAL CALENDAR PAD +1F5D4 ; [*1555.0020.0002] # DESKTOP WINDOW +1F5D5 ; [*1556.0020.0002] # MINIMIZE +1F5D6 ; [*1557.0020.0002] # MAXIMIZE +1F5D7 ; [*1558.0020.0002] # OVERLAP +1F5D8 ; [*1559.0020.0002] # CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS +1F5D9 ; [*155A.0020.0002] # CANCELLATION X +1F5DA ; [*155B.0020.0002] # INCREASE FONT SIZE SYMBOL +1F5DB ; [*155C.0020.0002] # DECREASE FONT SIZE SYMBOL +1F5DC ; [*155D.0020.0002] # COMPRESSION +1F5DD ; [*155E.0020.0002] # OLD KEY +1F5DE ; [*155F.0020.0002] # ROLLED-UP NEWSPAPER +1F5DF ; [*1560.0020.0002] # PAGE WITH CIRCLED TEXT +1F5E0 ; [*1561.0020.0002] # STOCK CHART +1F5E1 ; [*1562.0020.0002] # DAGGER KNIFE +1F5E2 ; [*1563.0020.0002] # LIPS +1F5E3 ; [*1564.0020.0002] # SPEAKING HEAD IN SILHOUETTE +1F5E4 ; [*1565.0020.0002] # THREE RAYS ABOVE +1F5E5 ; [*1566.0020.0002] # THREE RAYS BELOW +1F5E6 ; [*1567.0020.0002] # THREE RAYS LEFT +1F5E7 ; [*1568.0020.0002] # THREE RAYS RIGHT +1F5E8 ; [*1569.0020.0002] # LEFT SPEECH BUBBLE +1F5E9 ; [*156A.0020.0002] # RIGHT SPEECH BUBBLE +1F5EA ; [*156B.0020.0002] # TWO SPEECH BUBBLES +1F5EB ; [*156C.0020.0002] # THREE SPEECH BUBBLES +1F5EC ; [*156D.0020.0002] # LEFT THOUGHT BUBBLE +1F5ED ; [*156E.0020.0002] # RIGHT THOUGHT BUBBLE +1F5EE ; [*156F.0020.0002] # LEFT ANGER BUBBLE +1F5EF ; [*1570.0020.0002] # RIGHT ANGER BUBBLE +1F5F0 ; [*1571.0020.0002] # MOOD BUBBLE +1F5F1 ; [*1572.0020.0002] # LIGHTNING MOOD BUBBLE +1F5F2 ; [*1573.0020.0002] # LIGHTNING MOOD +1F5F3 ; [*1574.0020.0002] # BALLOT BOX WITH BALLOT +1F5F4 ; [*1575.0020.0002] # BALLOT SCRIPT X +1F5F5 ; [*1576.0020.0002] # BALLOT BOX WITH SCRIPT X +1F5F6 ; [*1577.0020.0002] # BALLOT BOLD SCRIPT X +1F5F7 ; [*1578.0020.0002] # BALLOT BOX WITH BOLD SCRIPT X +1F5F8 ; [*1579.0020.0002] # LIGHT CHECK MARK +1F5F9 ; [*157A.0020.0002] # BALLOT BOX WITH BOLD CHECK +1F5FA ; [*157B.0020.0002] # WORLD MAP +1F5FB ; [*157C.0020.0002] # MOUNT FUJI +1F5FC ; [*157D.0020.0002] # TOKYO TOWER +1F5FD ; [*157E.0020.0002] # STATUE OF LIBERTY +1F5FE ; [*157F.0020.0002] # SILHOUETTE OF JAPAN +1F5FF ; [*1580.0020.0002] # MOYAI +1F600 ; [*1590.0020.0002] # GRINNING FACE +1F601 ; [*1591.0020.0002] # GRINNING FACE WITH SMILING EYES +1F602 ; [*1592.0020.0002] # FACE WITH TEARS OF JOY +1F603 ; [*1593.0020.0002] # SMILING FACE WITH OPEN MOUTH +1F604 ; [*1594.0020.0002] # SMILING FACE WITH OPEN MOUTH AND SMILING EYES +1F605 ; [*1595.0020.0002] # SMILING FACE WITH OPEN MOUTH AND COLD SWEAT +1F606 ; [*1596.0020.0002] # SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES +1F607 ; [*1597.0020.0002] # SMILING FACE WITH HALO +1F608 ; [*1598.0020.0002] # SMILING FACE WITH HORNS +1F609 ; [*1599.0020.0002] # WINKING FACE +1F60A ; [*159A.0020.0002] # SMILING FACE WITH SMILING EYES +1F60B ; [*159B.0020.0002] # FACE SAVOURING DELICIOUS FOOD +1F60C ; [*159C.0020.0002] # RELIEVED FACE +1F60D ; [*159D.0020.0002] # SMILING FACE WITH HEART-SHAPED EYES +1F60E ; [*159E.0020.0002] # SMILING FACE WITH SUNGLASSES +1F60F ; [*159F.0020.0002] # SMIRKING FACE +1F610 ; [*15A0.0020.0002] # NEUTRAL FACE +1F611 ; [*15A1.0020.0002] # EXPRESSIONLESS FACE +1F612 ; [*15A2.0020.0002] # UNAMUSED FACE +1F613 ; [*15A3.0020.0002] # FACE WITH COLD SWEAT +1F614 ; [*15A4.0020.0002] # PENSIVE FACE +1F615 ; [*15A5.0020.0002] # CONFUSED FACE +1F616 ; [*15A6.0020.0002] # CONFOUNDED FACE +1F617 ; [*15A7.0020.0002] # KISSING FACE +1F618 ; [*15A8.0020.0002] # FACE THROWING A KISS +1F619 ; [*15A9.0020.0002] # KISSING FACE WITH SMILING EYES +1F61A ; [*15AA.0020.0002] # KISSING FACE WITH CLOSED EYES +1F61B ; [*15AB.0020.0002] # FACE WITH STUCK-OUT TONGUE +1F61C ; [*15AC.0020.0002] # FACE WITH STUCK-OUT TONGUE AND WINKING EYE +1F61D ; [*15AD.0020.0002] # FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES +1F61E ; [*15AE.0020.0002] # DISAPPOINTED FACE +1F61F ; [*15AF.0020.0002] # WORRIED FACE +1F620 ; [*15B0.0020.0002] # ANGRY FACE +1F621 ; [*15B1.0020.0002] # POUTING FACE +1F622 ; [*15B2.0020.0002] # CRYING FACE +1F623 ; [*15B3.0020.0002] # PERSEVERING FACE +1F624 ; [*15B4.0020.0002] # FACE WITH LOOK OF TRIUMPH +1F625 ; [*15B5.0020.0002] # DISAPPOINTED BUT RELIEVED FACE +1F626 ; [*15B6.0020.0002] # FROWNING FACE WITH OPEN MOUTH +1F627 ; [*15B7.0020.0002] # ANGUISHED FACE +1F628 ; [*15B8.0020.0002] # FEARFUL FACE +1F629 ; [*15B9.0020.0002] # WEARY FACE +1F62A ; [*15BA.0020.0002] # SLEEPY FACE +1F62B ; [*15BB.0020.0002] # TIRED FACE +1F62C ; [*15BC.0020.0002] # GRIMACING FACE +1F62D ; [*15BD.0020.0002] # LOUDLY CRYING FACE +1F62E ; [*15BE.0020.0002] # FACE WITH OPEN MOUTH +1F62F ; [*15BF.0020.0002] # HUSHED FACE +1F630 ; [*15C0.0020.0002] # FACE WITH OPEN MOUTH AND COLD SWEAT +1F631 ; [*15C1.0020.0002] # FACE SCREAMING IN FEAR +1F632 ; [*15C2.0020.0002] # ASTONISHED FACE +1F633 ; [*15C3.0020.0002] # FLUSHED FACE +1F634 ; [*15C4.0020.0002] # SLEEPING FACE +1F635 ; [*15C5.0020.0002] # DIZZY FACE +1F636 ; [*15C6.0020.0002] # FACE WITHOUT MOUTH +1F637 ; [*15C7.0020.0002] # FACE WITH MEDICAL MASK +1F638 ; [*15C8.0020.0002] # GRINNING CAT FACE WITH SMILING EYES +1F639 ; [*15C9.0020.0002] # CAT FACE WITH TEARS OF JOY +1F63A ; [*15CA.0020.0002] # SMILING CAT FACE WITH OPEN MOUTH +1F63B ; [*15CB.0020.0002] # SMILING CAT FACE WITH HEART-SHAPED EYES +1F63C ; [*15CC.0020.0002] # CAT FACE WITH WRY SMILE +1F63D ; [*15CD.0020.0002] # KISSING CAT FACE WITH CLOSED EYES +1F63E ; [*15CE.0020.0002] # POUTING CAT FACE +1F63F ; [*15CF.0020.0002] # CRYING CAT FACE +1F640 ; [*15D0.0020.0002] # WEARY CAT FACE +1F641 ; [*15D1.0020.0002] # SLIGHTLY FROWNING FACE +1F642 ; [*15D2.0020.0002] # SLIGHTLY SMILING FACE +1F643 ; [*15D3.0020.0002] # UPSIDE-DOWN FACE +1F644 ; [*15D4.0020.0002] # FACE WITH ROLLING EYES +1F645 ; [*15D5.0020.0002] # FACE WITH NO GOOD GESTURE +1F646 ; [*15D6.0020.0002] # FACE WITH OK GESTURE +1F647 ; [*15D7.0020.0002] # PERSON BOWING DEEPLY +1F648 ; [*15D8.0020.0002] # SEE-NO-EVIL MONKEY +1F649 ; [*15D9.0020.0002] # HEAR-NO-EVIL MONKEY +1F64A ; [*15DA.0020.0002] # SPEAK-NO-EVIL MONKEY +1F64B ; [*15DB.0020.0002] # HAPPY PERSON RAISING ONE HAND +1F64C ; [*15DC.0020.0002] # PERSON RAISING BOTH HANDS IN CELEBRATION +1F64D ; [*15DD.0020.0002] # PERSON FROWNING +1F64E ; [*15DE.0020.0002] # PERSON WITH POUTING FACE +1F64F ; [*15DF.0020.0002] # PERSON WITH FOLDED HANDS +1F650 ; [*15E0.0020.0002] # NORTH WEST POINTING LEAF +1F651 ; [*15E1.0020.0002] # SOUTH WEST POINTING LEAF +1F652 ; [*15E2.0020.0002] # NORTH EAST POINTING LEAF +1F653 ; [*15E3.0020.0002] # SOUTH EAST POINTING LEAF +1F654 ; [*15E4.0020.0002] # TURNED NORTH WEST POINTING LEAF +1F655 ; [*15E5.0020.0002] # TURNED SOUTH WEST POINTING LEAF +1F656 ; [*15E6.0020.0002] # TURNED NORTH EAST POINTING LEAF +1F657 ; [*15E7.0020.0002] # TURNED SOUTH EAST POINTING LEAF +1F658 ; [*15E8.0020.0002] # NORTH WEST POINTING VINE LEAF +1F659 ; [*15E9.0020.0002] # SOUTH WEST POINTING VINE LEAF +1F65A ; [*15EA.0020.0002] # NORTH EAST POINTING VINE LEAF +1F65B ; [*15EB.0020.0002] # SOUTH EAST POINTING VINE LEAF +1F65C ; [*15EC.0020.0002] # HEAVY NORTH WEST POINTING VINE LEAF +1F65D ; [*15ED.0020.0002] # HEAVY SOUTH WEST POINTING VINE LEAF +1F65E ; [*15EE.0020.0002] # HEAVY NORTH EAST POINTING VINE LEAF +1F65F ; [*15EF.0020.0002] # HEAVY SOUTH EAST POINTING VINE LEAF +1F660 ; [*15F0.0020.0002] # NORTH WEST POINTING BUD +1F661 ; [*15F1.0020.0002] # SOUTH WEST POINTING BUD +1F662 ; [*15F2.0020.0002] # NORTH EAST POINTING BUD +1F663 ; [*15F3.0020.0002] # SOUTH EAST POINTING BUD +1F664 ; [*15F4.0020.0002] # HEAVY NORTH WEST POINTING BUD +1F665 ; [*15F5.0020.0002] # HEAVY SOUTH WEST POINTING BUD +1F666 ; [*15F6.0020.0002] # HEAVY NORTH EAST POINTING BUD +1F667 ; [*15F7.0020.0002] # HEAVY SOUTH EAST POINTING BUD +1F668 ; [*15F8.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT +1F669 ; [*15F9.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE +1F66A ; [*15FA.0020.0002] # SOLID QUILT SQUARE ORNAMENT +1F66B ; [*15FB.0020.0002] # SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE +1F66C ; [*15FC.0020.0002] # LEFTWARDS ROCKET +1F66D ; [*15FD.0020.0002] # UPWARDS ROCKET +1F66E ; [*15FE.0020.0002] # RIGHTWARDS ROCKET +1F66F ; [*15FF.0020.0002] # DOWNWARDS ROCKET +1F670 ; [*1600.0020.0002] # SCRIPT LIGATURE ET ORNAMENT +1F671 ; [*1601.0020.0002] # HEAVY SCRIPT LIGATURE ET ORNAMENT +1F672 ; [*1602.0020.0002] # LIGATURE OPEN ET ORNAMENT +1F673 ; [*1603.0020.0002] # HEAVY LIGATURE OPEN ET ORNAMENT +1F674 ; [*1604.0020.0002] # HEAVY AMPERSAND ORNAMENT +1F675 ; [*1605.0020.0002] # SWASH AMPERSAND ORNAMENT +1F676 ; [*1606.0020.0002] # SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +1F677 ; [*1607.0020.0002] # SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +1F678 ; [*1608.0020.0002] # SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +1F679 ; [*1609.0020.0002] # HEAVY INTERROBANG ORNAMENT +1F67A ; [*160A.0020.0002] # SANS-SERIF INTERROBANG ORNAMENT +1F67B ; [*160B.0020.0002] # HEAVY SANS-SERIF INTERROBANG ORNAMENT +1F67C ; [*160C.0020.0002] # VERY HEAVY SOLIDUS +1F67D ; [*160D.0020.0002] # VERY HEAVY REVERSE SOLIDUS +1F67E ; [*160E.0020.0002] # CHECKER BOARD +1F67F ; [*160F.0020.0002] # REVERSE CHECKER BOARD +1F680 ; [*1610.0020.0002] # ROCKET +1F681 ; [*1611.0020.0002] # HELICOPTER +1F682 ; [*1612.0020.0002] # STEAM LOCOMOTIVE +1F683 ; [*1613.0020.0002] # RAILWAY CAR +1F684 ; [*1614.0020.0002] # HIGH-SPEED TRAIN +1F685 ; [*1615.0020.0002] # HIGH-SPEED TRAIN WITH BULLET NOSE +1F686 ; [*1616.0020.0002] # TRAIN +1F687 ; [*1617.0020.0002] # METRO +1F688 ; [*1618.0020.0002] # LIGHT RAIL +1F689 ; [*1619.0020.0002] # STATION +1F68A ; [*161A.0020.0002] # TRAM +1F68B ; [*161B.0020.0002] # TRAM CAR +1F68C ; [*161C.0020.0002] # BUS +1F68D ; [*161D.0020.0002] # ONCOMING BUS +1F68E ; [*161E.0020.0002] # TROLLEYBUS +1F68F ; [*161F.0020.0002] # BUS STOP +1F690 ; [*1620.0020.0002] # MINIBUS +1F691 ; [*1621.0020.0002] # AMBULANCE +1F692 ; [*1622.0020.0002] # FIRE ENGINE +1F693 ; [*1623.0020.0002] # POLICE CAR +1F694 ; [*1624.0020.0002] # ONCOMING POLICE CAR +1F695 ; [*1625.0020.0002] # TAXI +1F696 ; [*1626.0020.0002] # ONCOMING TAXI +1F697 ; [*1627.0020.0002] # AUTOMOBILE +1F698 ; [*1628.0020.0002] # ONCOMING AUTOMOBILE +1F699 ; [*1629.0020.0002] # RECREATIONAL VEHICLE +1F69A ; [*162A.0020.0002] # DELIVERY TRUCK +1F69B ; [*162B.0020.0002] # ARTICULATED LORRY +1F69C ; [*162C.0020.0002] # TRACTOR +1F69D ; [*162D.0020.0002] # MONORAIL +1F69E ; [*162E.0020.0002] # MOUNTAIN RAILWAY +1F69F ; [*162F.0020.0002] # SUSPENSION RAILWAY +1F6A0 ; [*1630.0020.0002] # MOUNTAIN CABLEWAY +1F6A1 ; [*1631.0020.0002] # AERIAL TRAMWAY +1F6A2 ; [*1632.0020.0002] # SHIP +1F6A3 ; [*1633.0020.0002] # ROWBOAT +1F6A4 ; [*1634.0020.0002] # SPEEDBOAT +1F6A5 ; [*1635.0020.0002] # HORIZONTAL TRAFFIC LIGHT +1F6A6 ; [*1636.0020.0002] # VERTICAL TRAFFIC LIGHT +1F6A7 ; [*1637.0020.0002] # CONSTRUCTION SIGN +1F6A8 ; [*1638.0020.0002] # POLICE CARS REVOLVING LIGHT +1F6A9 ; [*1639.0020.0002] # TRIANGULAR FLAG ON POST +1F6AA ; [*163A.0020.0002] # DOOR +1F6AB ; [*163B.0020.0002] # NO ENTRY SIGN +1F6AC ; [*163C.0020.0002] # SMOKING SYMBOL +1F6AD ; [*163D.0020.0002] # NO SMOKING SYMBOL +1F6AE ; [*163E.0020.0002] # PUT LITTER IN ITS PLACE SYMBOL +1F6AF ; [*163F.0020.0002] # DO NOT LITTER SYMBOL +1F6B0 ; [*1640.0020.0002] # POTABLE WATER SYMBOL +1F6B1 ; [*1641.0020.0002] # NON-POTABLE WATER SYMBOL +1F6B2 ; [*1642.0020.0002] # BICYCLE +1F6B3 ; [*1643.0020.0002] # NO BICYCLES +1F6B4 ; [*1644.0020.0002] # BICYCLIST +1F6B5 ; [*1645.0020.0002] # MOUNTAIN BICYCLIST +1F6B6 ; [*1646.0020.0002] # PEDESTRIAN +1F6B7 ; [*1647.0020.0002] # NO PEDESTRIANS +1F6B8 ; [*1648.0020.0002] # CHILDREN CROSSING +1F6B9 ; [*1649.0020.0002] # MENS SYMBOL +1F6BA ; [*164A.0020.0002] # WOMENS SYMBOL +1F6BB ; [*164B.0020.0002] # RESTROOM +1F6BC ; [*164C.0020.0002] # BABY SYMBOL +1F6BD ; [*164D.0020.0002] # TOILET +1F6BE ; [*164E.0020.0002] # WATER CLOSET +1F6BF ; [*164F.0020.0002] # SHOWER +1F6C0 ; [*1650.0020.0002] # BATH +1F6C1 ; [*1651.0020.0002] # BATHTUB +1F6C2 ; [*1652.0020.0002] # PASSPORT CONTROL +1F6C3 ; [*1653.0020.0002] # CUSTOMS +1F6C4 ; [*1654.0020.0002] # BAGGAGE CLAIM +1F6C5 ; [*1655.0020.0002] # LEFT LUGGAGE +1F6C6 ; [*1656.0020.0002] # TRIANGLE WITH ROUNDED CORNERS +1F6C7 ; [*1657.0020.0002] # PROHIBITED SIGN +1F6C8 ; [*1658.0020.0002] # CIRCLED INFORMATION SOURCE +1F6C9 ; [*1659.0020.0002] # BOYS SYMBOL +1F6CA ; [*165A.0020.0002] # GIRLS SYMBOL +1F6CB ; [*165B.0020.0002] # COUCH AND LAMP +1F6CC ; [*165C.0020.0002] # SLEEPING ACCOMMODATION +1F6CD ; [*165D.0020.0002] # SHOPPING BAGS +1F6CE ; [*165E.0020.0002] # BELLHOP BELL +1F6CF ; [*165F.0020.0002] # BED +1F6D0 ; [*1660.0020.0002] # PLACE OF WORSHIP +1F6E0 ; [*1661.0020.0002] # HAMMER AND WRENCH +1F6E1 ; [*1662.0020.0002] # SHIELD +1F6E2 ; [*1663.0020.0002] # OIL DRUM +1F6E3 ; [*1664.0020.0002] # MOTORWAY +1F6E4 ; [*1665.0020.0002] # RAILWAY TRACK +1F6E5 ; [*1666.0020.0002] # MOTOR BOAT +1F6E6 ; [*1667.0020.0002] # UP-POINTING MILITARY AIRPLANE +1F6E7 ; [*1668.0020.0002] # UP-POINTING AIRPLANE +1F6E8 ; [*1669.0020.0002] # UP-POINTING SMALL AIRPLANE +1F6E9 ; [*166A.0020.0002] # SMALL AIRPLANE +1F6EA ; [*166B.0020.0002] # NORTHEAST-POINTING AIRPLANE +1F6EB ; [*166C.0020.0002] # AIRPLANE DEPARTURE +1F6EC ; [*166D.0020.0002] # AIRPLANE ARRIVING +1F6F0 ; [*166E.0020.0002] # SATELLITE +1F6F1 ; [*166F.0020.0002] # ONCOMING FIRE ENGINE +1F6F2 ; [*1670.0020.0002] # DIESEL LOCOMOTIVE +1F6F3 ; [*1671.0020.0002] # PASSENGER SHIP +1F700 ; [*1672.0020.0002] # ALCHEMICAL SYMBOL FOR QUINTESSENCE +1F701 ; [*1673.0020.0002] # ALCHEMICAL SYMBOL FOR AIR +1F702 ; [*1674.0020.0002] # ALCHEMICAL SYMBOL FOR FIRE +1F703 ; [*1675.0020.0002] # ALCHEMICAL SYMBOL FOR EARTH +1F704 ; [*1676.0020.0002] # ALCHEMICAL SYMBOL FOR WATER +1F705 ; [*1677.0020.0002] # ALCHEMICAL SYMBOL FOR AQUAFORTIS +1F706 ; [*1678.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA +1F707 ; [*1679.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA-2 +1F708 ; [*167A.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE +1F709 ; [*167B.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE-2 +1F70A ; [*167C.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR +1F70B ; [*167D.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-2 +1F70C ; [*167E.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-3 +1F70D ; [*167F.0020.0002] # ALCHEMICAL SYMBOL FOR SULFUR +1F70E ; [*1680.0020.0002] # ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR +1F70F ; [*1681.0020.0002] # ALCHEMICAL SYMBOL FOR BLACK SULFUR +1F710 ; [*1682.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE +1F711 ; [*1683.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 +1F712 ; [*1684.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 +1F713 ; [*1685.0020.0002] # ALCHEMICAL SYMBOL FOR CINNABAR +1F714 ; [*1686.0020.0002] # ALCHEMICAL SYMBOL FOR SALT +1F715 ; [*1687.0020.0002] # ALCHEMICAL SYMBOL FOR NITRE +1F716 ; [*1688.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL +1F717 ; [*1689.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL-2 +1F718 ; [*168A.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT +1F719 ; [*168B.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT-2 +1F71A ; [*168C.0020.0002] # ALCHEMICAL SYMBOL FOR GOLD +1F71B ; [*168D.0020.0002] # ALCHEMICAL SYMBOL FOR SILVER +1F71C ; [*168E.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE +1F71D ; [*168F.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE-2 +1F71E ; [*1690.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF IRON +1F71F ; [*1691.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF IRON +1F720 ; [*1692.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ORE +1F721 ; [*1693.0020.0002] # ALCHEMICAL SYMBOL FOR IRON-COPPER ORE +1F722 ; [*1694.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER +1F723 ; [*1695.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER +1F724 ; [*1696.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 +1F725 ; [*1697.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE +1F726 ; [*1698.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE +1F727 ; [*1699.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER +1F728 ; [*169A.0020.0002] # ALCHEMICAL SYMBOL FOR VERDIGRIS +1F729 ; [*169B.0020.0002] # ALCHEMICAL SYMBOL FOR TIN ORE +1F72A ; [*169C.0020.0002] # ALCHEMICAL SYMBOL FOR LEAD ORE +1F72B ; [*169D.0020.0002] # ALCHEMICAL SYMBOL FOR ANTIMONY ORE +1F72C ; [*169E.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY +1F72D ; [*169F.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY +1F72E ; [*16A0.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY +1F72F ; [*16A1.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY +1F730 ; [*16A2.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY +1F731 ; [*16A3.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 +1F732 ; [*16A4.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS +1F733 ; [*16A5.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-2 +1F734 ; [*16A6.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-3 +1F735 ; [*16A7.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-4 +1F736 ; [*16A8.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI +1F737 ; [*16A9.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI-2 +1F738 ; [*16AA.0020.0002] # ALCHEMICAL SYMBOL FOR MARCASITE +1F739 ; [*16AB.0020.0002] # ALCHEMICAL SYMBOL FOR SAL-AMMONIAC +1F73A ; [*16AC.0020.0002] # ALCHEMICAL SYMBOL FOR ARSENIC +1F73B ; [*16AD.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR +1F73C ; [*16AE.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR-2 +1F73D ; [*16AF.0020.0002] # ALCHEMICAL SYMBOL FOR AURIPIGMENT +1F73E ; [*16B0.0020.0002] # ALCHEMICAL SYMBOL FOR BISMUTH ORE +1F73F ; [*16B1.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR +1F740 ; [*16B2.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR-2 +1F741 ; [*16B3.0020.0002] # ALCHEMICAL SYMBOL FOR QUICK LIME +1F742 ; [*16B4.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX +1F743 ; [*16B5.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-2 +1F744 ; [*16B6.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-3 +1F745 ; [*16B7.0020.0002] # ALCHEMICAL SYMBOL FOR ALUM +1F746 ; [*16B8.0020.0002] # ALCHEMICAL SYMBOL FOR OIL +1F747 ; [*16B9.0020.0002] # ALCHEMICAL SYMBOL FOR SPIRIT +1F748 ; [*16BA.0020.0002] # ALCHEMICAL SYMBOL FOR TINCTURE +1F749 ; [*16BB.0020.0002] # ALCHEMICAL SYMBOL FOR GUM +1F74A ; [*16BC.0020.0002] # ALCHEMICAL SYMBOL FOR WAX +1F74B ; [*16BD.0020.0002] # ALCHEMICAL SYMBOL FOR POWDER +1F74C ; [*16BE.0020.0002] # ALCHEMICAL SYMBOL FOR CALX +1F74D ; [*16BF.0020.0002] # ALCHEMICAL SYMBOL FOR TUTTY +1F74E ; [*16C0.0020.0002] # ALCHEMICAL SYMBOL FOR CAPUT MORTUUM +1F74F ; [*16C1.0020.0002] # ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE +1F750 ; [*16C2.0020.0002] # ALCHEMICAL SYMBOL FOR CADUCEUS +1F751 ; [*16C3.0020.0002] # ALCHEMICAL SYMBOL FOR TRIDENT +1F752 ; [*16C4.0020.0002] # ALCHEMICAL SYMBOL FOR STARRED TRIDENT +1F753 ; [*16C5.0020.0002] # ALCHEMICAL SYMBOL FOR LODESTONE +1F754 ; [*16C6.0020.0002] # ALCHEMICAL SYMBOL FOR SOAP +1F755 ; [*16C7.0020.0002] # ALCHEMICAL SYMBOL FOR URINE +1F756 ; [*16C8.0020.0002] # ALCHEMICAL SYMBOL FOR HORSE DUNG +1F757 ; [*16C9.0020.0002] # ALCHEMICAL SYMBOL FOR ASHES +1F758 ; [*16CA.0020.0002] # ALCHEMICAL SYMBOL FOR POT ASHES +1F759 ; [*16CB.0020.0002] # ALCHEMICAL SYMBOL FOR BRICK +1F75A ; [*16CC.0020.0002] # ALCHEMICAL SYMBOL FOR POWDERED BRICK +1F75B ; [*16CD.0020.0002] # ALCHEMICAL SYMBOL FOR AMALGAM +1F75C ; [*16CE.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM +1F75D ; [*16CF.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 +1F75E ; [*16D0.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATION +1F75F ; [*16D1.0020.0002] # ALCHEMICAL SYMBOL FOR PRECIPITATE +1F760 ; [*16D2.0020.0002] # ALCHEMICAL SYMBOL FOR DISTILL +1F761 ; [*16D3.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE +1F762 ; [*16D4.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE-2 +1F763 ; [*16D5.0020.0002] # ALCHEMICAL SYMBOL FOR PURIFY +1F764 ; [*16D6.0020.0002] # ALCHEMICAL SYMBOL FOR PUTREFACTION +1F765 ; [*16D7.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE +1F766 ; [*16D8.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-2 +1F767 ; [*16D9.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-3 +1F768 ; [*16DA.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-4 +1F769 ; [*16DB.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-5 +1F76A ; [*16DC.0020.0002] # ALCHEMICAL SYMBOL FOR ALEMBIC +1F76B ; [*16DD.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF MARY +1F76C ; [*16DE.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF VAPOURS +1F76D ; [*16DF.0020.0002] # ALCHEMICAL SYMBOL FOR RETORT +1F76E ; [*16E0.0020.0002] # ALCHEMICAL SYMBOL FOR HOUR +1F76F ; [*16E1.0020.0002] # ALCHEMICAL SYMBOL FOR NIGHT +1F770 ; [*16E2.0020.0002] # ALCHEMICAL SYMBOL FOR DAY-NIGHT +1F771 ; [*16E3.0020.0002] # ALCHEMICAL SYMBOL FOR MONTH +1F772 ; [*16E4.0020.0002] # ALCHEMICAL SYMBOL FOR HALF DRAM +1F773 ; [*16E5.0020.0002] # ALCHEMICAL SYMBOL FOR HALF OUNCE +1F780 ; [*16E6.0020.0002] # BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE +1F781 ; [*16E7.0020.0002] # BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE +1F782 ; [*16E8.0020.0002] # BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE +1F783 ; [*16E9.0020.0002] # BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE +1F784 ; [*16EA.0020.0002] # BLACK SLIGHTLY SMALL CIRCLE +1F785 ; [*16EB.0020.0002] # MEDIUM BOLD WHITE CIRCLE +1F786 ; [*16EC.0020.0002] # BOLD WHITE CIRCLE +1F787 ; [*16ED.0020.0002] # HEAVY WHITE CIRCLE +1F788 ; [*16EE.0020.0002] # VERY HEAVY WHITE CIRCLE +1F789 ; [*16EF.0020.0002] # EXTREMELY HEAVY WHITE CIRCLE +1F78A ; [*16F0.0020.0002] # WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE +1F78B ; [*16F1.0020.0002] # ROUND TARGET +1F78C ; [*16F2.0020.0002] # BLACK TINY SQUARE +1F78D ; [*16F3.0020.0002] # BLACK SLIGHTLY SMALL SQUARE +1F78E ; [*16F4.0020.0002] # LIGHT WHITE SQUARE +1F78F ; [*16F5.0020.0002] # MEDIUM WHITE SQUARE +1F790 ; [*16F6.0020.0002] # BOLD WHITE SQUARE +1F791 ; [*16F7.0020.0002] # HEAVY WHITE SQUARE +1F792 ; [*16F8.0020.0002] # VERY HEAVY WHITE SQUARE +1F793 ; [*16F9.0020.0002] # EXTREMELY HEAVY WHITE SQUARE +1F794 ; [*16FA.0020.0002] # WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE +1F795 ; [*16FB.0020.0002] # WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE +1F796 ; [*16FC.0020.0002] # SQUARE TARGET +1F797 ; [*16FD.0020.0002] # BLACK TINY DIAMOND +1F798 ; [*16FE.0020.0002] # BLACK VERY SMALL DIAMOND +1F799 ; [*16FF.0020.0002] # BLACK MEDIUM SMALL DIAMOND +1F79A ; [*1700.0020.0002] # WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND +1F79B ; [*1701.0020.0002] # WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND +1F79C ; [*1702.0020.0002] # DIAMOND TARGET +1F79D ; [*1703.0020.0002] # BLACK TINY LOZENGE +1F79E ; [*1704.0020.0002] # BLACK VERY SMALL LOZENGE +1F79F ; [*1705.0020.0002] # BLACK MEDIUM SMALL LOZENGE +1F7A0 ; [*1706.0020.0002] # WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE +1F7A1 ; [*1707.0020.0002] # THIN GREEK CROSS +1F7A2 ; [*1708.0020.0002] # LIGHT GREEK CROSS +1F7A3 ; [*1709.0020.0002] # MEDIUM GREEK CROSS +1F7A4 ; [*170A.0020.0002] # BOLD GREEK CROSS +1F7A5 ; [*170B.0020.0002] # VERY BOLD GREEK CROSS +1F7A6 ; [*170C.0020.0002] # VERY HEAVY GREEK CROSS +1F7A7 ; [*170D.0020.0002] # EXTREMELY HEAVY GREEK CROSS +1F7A8 ; [*170E.0020.0002] # THIN SALTIRE +1F7A9 ; [*170F.0020.0002] # LIGHT SALTIRE +1F7AA ; [*1710.0020.0002] # MEDIUM SALTIRE +1F7AB ; [*1711.0020.0002] # BOLD SALTIRE +1F7AC ; [*1712.0020.0002] # HEAVY SALTIRE +1F7AD ; [*1713.0020.0002] # VERY HEAVY SALTIRE +1F7AE ; [*1714.0020.0002] # EXTREMELY HEAVY SALTIRE +1F7AF ; [*1715.0020.0002] # LIGHT FIVE SPOKED ASTERISK +1F7B0 ; [*1716.0020.0002] # MEDIUM FIVE SPOKED ASTERISK +1F7B1 ; [*1717.0020.0002] # BOLD FIVE SPOKED ASTERISK +1F7B2 ; [*1718.0020.0002] # HEAVY FIVE SPOKED ASTERISK +1F7B3 ; [*1719.0020.0002] # VERY HEAVY FIVE SPOKED ASTERISK +1F7B4 ; [*171A.0020.0002] # EXTREMELY HEAVY FIVE SPOKED ASTERISK +1F7B5 ; [*171B.0020.0002] # LIGHT SIX SPOKED ASTERISK +1F7B6 ; [*171C.0020.0002] # MEDIUM SIX SPOKED ASTERISK +1F7B7 ; [*171D.0020.0002] # BOLD SIX SPOKED ASTERISK +1F7B8 ; [*171E.0020.0002] # HEAVY SIX SPOKED ASTERISK +1F7B9 ; [*171F.0020.0002] # VERY HEAVY SIX SPOKED ASTERISK +1F7BA ; [*1720.0020.0002] # EXTREMELY HEAVY SIX SPOKED ASTERISK +1F7BB ; [*1721.0020.0002] # LIGHT EIGHT SPOKED ASTERISK +1F7BC ; [*1722.0020.0002] # MEDIUM EIGHT SPOKED ASTERISK +1F7BD ; [*1723.0020.0002] # BOLD EIGHT SPOKED ASTERISK +1F7BE ; [*1724.0020.0002] # HEAVY EIGHT SPOKED ASTERISK +1F7BF ; [*1725.0020.0002] # VERY HEAVY EIGHT SPOKED ASTERISK +1F7C0 ; [*1726.0020.0002] # LIGHT THREE POINTED BLACK STAR +1F7C1 ; [*1727.0020.0002] # MEDIUM THREE POINTED BLACK STAR +1F7C2 ; [*1728.0020.0002] # THREE POINTED BLACK STAR +1F7C3 ; [*1729.0020.0002] # MEDIUM THREE POINTED PINWHEEL STAR +1F7C4 ; [*172A.0020.0002] # LIGHT FOUR POINTED BLACK STAR +1F7C5 ; [*172B.0020.0002] # MEDIUM FOUR POINTED BLACK STAR +1F7C6 ; [*172C.0020.0002] # FOUR POINTED BLACK STAR +1F7C7 ; [*172D.0020.0002] # MEDIUM FOUR POINTED PINWHEEL STAR +1F7C8 ; [*172E.0020.0002] # REVERSE LIGHT FOUR POINTED PINWHEEL STAR +1F7C9 ; [*172F.0020.0002] # LIGHT FIVE POINTED BLACK STAR +1F7CA ; [*1730.0020.0002] # HEAVY FIVE POINTED BLACK STAR +1F7CB ; [*1731.0020.0002] # MEDIUM SIX POINTED BLACK STAR +1F7CC ; [*1732.0020.0002] # HEAVY SIX POINTED BLACK STAR +1F7CD ; [*1733.0020.0002] # SIX POINTED PINWHEEL STAR +1F7CE ; [*1734.0020.0002] # MEDIUM EIGHT POINTED BLACK STAR +1F7CF ; [*1735.0020.0002] # HEAVY EIGHT POINTED BLACK STAR +1F7D0 ; [*1736.0020.0002] # VERY HEAVY EIGHT POINTED BLACK STAR +1F7D1 ; [*1737.0020.0002] # HEAVY EIGHT POINTED PINWHEEL STAR +1F7D2 ; [*1738.0020.0002] # LIGHT TWELVE POINTED BLACK STAR +1F7D3 ; [*1739.0020.0002] # HEAVY TWELVE POINTED BLACK STAR +1F7D4 ; [*173A.0020.0002] # HEAVY TWELVE POINTED PINWHEEL STAR +1F800 ; [*173B.0020.0002] # LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F801 ; [*173C.0020.0002] # UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F802 ; [*173D.0020.0002] # RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F803 ; [*173E.0020.0002] # DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F804 ; [*173F.0020.0002] # LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F805 ; [*1740.0020.0002] # UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F806 ; [*1741.0020.0002] # RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F807 ; [*1742.0020.0002] # DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F808 ; [*1743.0020.0002] # LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F809 ; [*1744.0020.0002] # UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80A ; [*1745.0020.0002] # RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80B ; [*1746.0020.0002] # DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810 ; [*1747.0020.0002] # LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F811 ; [*1748.0020.0002] # UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F812 ; [*1749.0020.0002] # RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F813 ; [*174A.0020.0002] # DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F814 ; [*174B.0020.0002] # LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F815 ; [*174C.0020.0002] # UPWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F816 ; [*174D.0020.0002] # RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F817 ; [*174E.0020.0002] # DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F818 ; [*174F.0020.0002] # HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F819 ; [*1750.0020.0002] # HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81A ; [*1751.0020.0002] # HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81B ; [*1752.0020.0002] # HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81C ; [*1753.0020.0002] # HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81D ; [*1754.0020.0002] # HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81E ; [*1755.0020.0002] # HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81F ; [*1756.0020.0002] # HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F820 ; [*1757.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F821 ; [*1758.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F822 ; [*1759.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F823 ; [*175A.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F824 ; [*175B.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F825 ; [*175C.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F826 ; [*175D.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F827 ; [*175E.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F828 ; [*175F.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F829 ; [*1760.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82A ; [*1761.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82B ; [*1762.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82C ; [*1763.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82D ; [*1764.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82E ; [*1765.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82F ; [*1766.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F830 ; [*1767.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F831 ; [*1768.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F832 ; [*1769.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F833 ; [*176A.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F834 ; [*176B.0020.0002] # LEFTWARDS FINGER-POST ARROW +1F835 ; [*176C.0020.0002] # UPWARDS FINGER-POST ARROW +1F836 ; [*176D.0020.0002] # RIGHTWARDS FINGER-POST ARROW +1F837 ; [*176E.0020.0002] # DOWNWARDS FINGER-POST ARROW +1F838 ; [*176F.0020.0002] # LEFTWARDS SQUARED ARROW +1F839 ; [*1770.0020.0002] # UPWARDS SQUARED ARROW +1F83A ; [*1771.0020.0002] # RIGHTWARDS SQUARED ARROW +1F83B ; [*1772.0020.0002] # DOWNWARDS SQUARED ARROW +1F83C ; [*1773.0020.0002] # LEFTWARDS COMPRESSED ARROW +1F83D ; [*1774.0020.0002] # UPWARDS COMPRESSED ARROW +1F83E ; [*1775.0020.0002] # RIGHTWARDS COMPRESSED ARROW +1F83F ; [*1776.0020.0002] # DOWNWARDS COMPRESSED ARROW +1F840 ; [*1777.0020.0002] # LEFTWARDS HEAVY COMPRESSED ARROW +1F841 ; [*1778.0020.0002] # UPWARDS HEAVY COMPRESSED ARROW +1F842 ; [*1779.0020.0002] # RIGHTWARDS HEAVY COMPRESSED ARROW +1F843 ; [*177A.0020.0002] # DOWNWARDS HEAVY COMPRESSED ARROW +1F844 ; [*177B.0020.0002] # LEFTWARDS HEAVY ARROW +1F845 ; [*177C.0020.0002] # UPWARDS HEAVY ARROW +1F846 ; [*177D.0020.0002] # RIGHTWARDS HEAVY ARROW +1F847 ; [*177E.0020.0002] # DOWNWARDS HEAVY ARROW +1F850 ; [*177F.0020.0002] # LEFTWARDS SANS-SERIF ARROW +1F851 ; [*1780.0020.0002] # UPWARDS SANS-SERIF ARROW +1F852 ; [*1781.0020.0002] # RIGHTWARDS SANS-SERIF ARROW +1F853 ; [*1782.0020.0002] # DOWNWARDS SANS-SERIF ARROW +1F854 ; [*1783.0020.0002] # NORTH WEST SANS-SERIF ARROW +1F855 ; [*1784.0020.0002] # NORTH EAST SANS-SERIF ARROW +1F856 ; [*1785.0020.0002] # SOUTH EAST SANS-SERIF ARROW +1F857 ; [*1786.0020.0002] # SOUTH WEST SANS-SERIF ARROW +1F858 ; [*1787.0020.0002] # LEFT RIGHT SANS-SERIF ARROW +1F859 ; [*1788.0020.0002] # UP DOWN SANS-SERIF ARROW +1F860 ; [*1789.0020.0002] # WIDE-HEADED LEFTWARDS LIGHT BARB ARROW +1F861 ; [*178A.0020.0002] # WIDE-HEADED UPWARDS LIGHT BARB ARROW +1F862 ; [*178B.0020.0002] # WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW +1F863 ; [*178C.0020.0002] # WIDE-HEADED DOWNWARDS LIGHT BARB ARROW +1F864 ; [*178D.0020.0002] # WIDE-HEADED NORTH WEST LIGHT BARB ARROW +1F865 ; [*178E.0020.0002] # WIDE-HEADED NORTH EAST LIGHT BARB ARROW +1F866 ; [*178F.0020.0002] # WIDE-HEADED SOUTH EAST LIGHT BARB ARROW +1F867 ; [*1790.0020.0002] # WIDE-HEADED SOUTH WEST LIGHT BARB ARROW +1F868 ; [*1791.0020.0002] # WIDE-HEADED LEFTWARDS BARB ARROW +1F869 ; [*1792.0020.0002] # WIDE-HEADED UPWARDS BARB ARROW +1F86A ; [*1793.0020.0002] # WIDE-HEADED RIGHTWARDS BARB ARROW +1F86B ; [*1794.0020.0002] # WIDE-HEADED DOWNWARDS BARB ARROW +1F86C ; [*1795.0020.0002] # WIDE-HEADED NORTH WEST BARB ARROW +1F86D ; [*1796.0020.0002] # WIDE-HEADED NORTH EAST BARB ARROW +1F86E ; [*1797.0020.0002] # WIDE-HEADED SOUTH EAST BARB ARROW +1F86F ; [*1798.0020.0002] # WIDE-HEADED SOUTH WEST BARB ARROW +1F870 ; [*1799.0020.0002] # WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW +1F871 ; [*179A.0020.0002] # WIDE-HEADED UPWARDS MEDIUM BARB ARROW +1F872 ; [*179B.0020.0002] # WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW +1F873 ; [*179C.0020.0002] # WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW +1F874 ; [*179D.0020.0002] # WIDE-HEADED NORTH WEST MEDIUM BARB ARROW +1F875 ; [*179E.0020.0002] # WIDE-HEADED NORTH EAST MEDIUM BARB ARROW +1F876 ; [*179F.0020.0002] # WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW +1F877 ; [*17A0.0020.0002] # WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW +1F878 ; [*17A1.0020.0002] # WIDE-HEADED LEFTWARDS HEAVY BARB ARROW +1F879 ; [*17A2.0020.0002] # WIDE-HEADED UPWARDS HEAVY BARB ARROW +1F87A ; [*17A3.0020.0002] # WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW +1F87B ; [*17A4.0020.0002] # WIDE-HEADED DOWNWARDS HEAVY BARB ARROW +1F87C ; [*17A5.0020.0002] # WIDE-HEADED NORTH WEST HEAVY BARB ARROW +1F87D ; [*17A6.0020.0002] # WIDE-HEADED NORTH EAST HEAVY BARB ARROW +1F87E ; [*17A7.0020.0002] # WIDE-HEADED SOUTH EAST HEAVY BARB ARROW +1F87F ; [*17A8.0020.0002] # WIDE-HEADED SOUTH WEST HEAVY BARB ARROW +1F880 ; [*17A9.0020.0002] # WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW +1F881 ; [*17AA.0020.0002] # WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW +1F882 ; [*17AB.0020.0002] # WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW +1F883 ; [*17AC.0020.0002] # WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW +1F884 ; [*17AD.0020.0002] # WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW +1F885 ; [*17AE.0020.0002] # WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW +1F886 ; [*17AF.0020.0002] # WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW +1F887 ; [*17B0.0020.0002] # WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890 ; [*17B1.0020.0002] # LEFTWARDS TRIANGLE ARROWHEAD +1F891 ; [*17B2.0020.0002] # UPWARDS TRIANGLE ARROWHEAD +1F892 ; [*17B3.0020.0002] # RIGHTWARDS TRIANGLE ARROWHEAD +1F893 ; [*17B4.0020.0002] # DOWNWARDS TRIANGLE ARROWHEAD +1F894 ; [*17B5.0020.0002] # LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F895 ; [*17B6.0020.0002] # UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F896 ; [*17B7.0020.0002] # RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F897 ; [*17B8.0020.0002] # DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F898 ; [*17B9.0020.0002] # LEFTWARDS ARROW WITH NOTCHED TAIL +1F899 ; [*17BA.0020.0002] # UPWARDS ARROW WITH NOTCHED TAIL +1F89A ; [*17BB.0020.0002] # RIGHTWARDS ARROW WITH NOTCHED TAIL +1F89B ; [*17BC.0020.0002] # DOWNWARDS ARROW WITH NOTCHED TAIL +1F89C ; [*17BD.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE +1F89D ; [*17BE.0020.0002] # HEAVY ARROW SHAFT WIDTH TWO THIRDS +1F89E ; [*17BF.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE HALF +1F89F ; [*17C0.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE THIRD +1F8A0 ; [*17C1.0020.0002] # LEFTWARDS BOTTOM-SHADED WHITE ARROW +1F8A1 ; [*17C2.0020.0002] # RIGHTWARDS BOTTOM SHADED WHITE ARROW +1F8A2 ; [*17C3.0020.0002] # LEFTWARDS TOP SHADED WHITE ARROW +1F8A3 ; [*17C4.0020.0002] # RIGHTWARDS TOP SHADED WHITE ARROW +1F8A4 ; [*17C5.0020.0002] # LEFTWARDS LEFT-SHADED WHITE ARROW +1F8A5 ; [*17C6.0020.0002] # RIGHTWARDS RIGHT-SHADED WHITE ARROW +1F8A6 ; [*17C7.0020.0002] # LEFTWARDS RIGHT-SHADED WHITE ARROW +1F8A7 ; [*17C8.0020.0002] # RIGHTWARDS LEFT-SHADED WHITE ARROW +1F8A8 ; [*17C9.0020.0002] # LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW +1F8A9 ; [*17CA.0020.0002] # RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW +1F8AA ; [*17CB.0020.0002] # LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW +1F8AB ; [*17CC.0020.0002] # RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW +1F8AC ; [*17CD.0020.0002] # WHITE ARROW SHAFT WIDTH ONE +1F8AD ; [*17CE.0020.0002] # WHITE ARROW SHAFT WIDTH TWO THIRDS +1F910 ; [*1581.0020.0002] # ZIPPER-MOUTH FACE +1F911 ; [*1582.0020.0002] # MONEY-MOUTH FACE +1F912 ; [*1583.0020.0002] # FACE WITH THERMOMETER +1F913 ; [*1584.0020.0002] # NERD FACE +1F914 ; [*1585.0020.0002] # THINKING FACE +1F915 ; [*1586.0020.0002] # FACE WITH HEAD-BANDAGE +1F916 ; [*1587.0020.0002] # ROBOT FACE +1F917 ; [*1588.0020.0002] # HUGGING FACE +1F918 ; [*1589.0020.0002] # SIGN OF THE HORNS +1F980 ; [*158A.0020.0002] # CRAB +1F981 ; [*158B.0020.0002] # LION FACE +1F982 ; [*158C.0020.0002] # SCORPION +1F983 ; [*158D.0020.0002] # TURKEY +1F984 ; [*158E.0020.0002] # UNICORN FACE +1F9C0 ; [*158F.0020.0002] # CHEESE WEDGE +0332 ; [.0000.0021.0002] # COMBINING LOW LINE +0313 ; [.0000.0022.0002] # COMBINING COMMA ABOVE +0343 ; [.0000.0022.0002] # COMBINING GREEK KORONIS +0486 ; [.0000.0022.0002] # COMBINING CYRILLIC PSILI PNEUMATA +2CF1 ; [.0000.0022.0002] # COPTIC COMBINING SPIRITUS LENIS +0314 ; [.0000.0023.0002] # COMBINING REVERSED COMMA ABOVE +0485 ; [.0000.0023.0002] # COMBINING CYRILLIC DASIA PNEUMATA +2CF0 ; [.0000.0023.0002] # COPTIC COMBINING SPIRITUS ASPER +0301 ; [.0000.0024.0002] # COMBINING ACUTE ACCENT +0341 ; [.0000.0024.0002] # COMBINING ACUTE TONE MARK +0954 ; [.0000.0024.0002] # DEVANAGARI ACUTE ACCENT +0300 ; [.0000.0025.0002] # COMBINING GRAVE ACCENT +0340 ; [.0000.0025.0002] # COMBINING GRAVE TONE MARK +0953 ; [.0000.0025.0002] # DEVANAGARI GRAVE ACCENT +0306 ; [.0000.0026.0002] # COMBINING BREVE +0302 ; [.0000.0027.0002] # COMBINING CIRCUMFLEX ACCENT +030C ; [.0000.0028.0002] # COMBINING CARON +030A ; [.0000.0029.0002] # COMBINING RING ABOVE +0342 ; [.0000.002A.0002] # COMBINING GREEK PERISPOMENI +0308 ; [.0000.002B.0002] # COMBINING DIAERESIS +0344 ; [.0000.002B.0002][.0000.0024.0002] # COMBINING GREEK DIALYTIKA TONOS +030B ; [.0000.002C.0002] # COMBINING DOUBLE ACUTE ACCENT +0303 ; [.0000.002D.0002] # COMBINING TILDE +0307 ; [.0000.002E.0002] # COMBINING DOT ABOVE +0338 ; [.0000.002F.0002] # COMBINING LONG SOLIDUS OVERLAY +0327 ; [.0000.0030.0002] # COMBINING CEDILLA +0328 ; [.0000.0031.0002] # COMBINING OGONEK +0304 ; [.0000.0032.0002] # COMBINING MACRON +030D ; [.0000.0033.0002] # COMBINING VERTICAL LINE ABOVE +030E ; [.0000.0033.0002] # COMBINING DOUBLE VERTICAL LINE ABOVE +0312 ; [.0000.0033.0002] # COMBINING TURNED COMMA ABOVE +0315 ; [.0000.0033.0002] # COMBINING COMMA ABOVE RIGHT +031A ; [.0000.0033.0002] # COMBINING LEFT ANGLE ABOVE +033D ; [.0000.0033.0002] # COMBINING X ABOVE +033E ; [.0000.0033.0002] # COMBINING VERTICAL TILDE +033F ; [.0000.0033.0002] # COMBINING DOUBLE OVERLINE +0346 ; [.0000.0033.0002] # COMBINING BRIDGE ABOVE +034A ; [.0000.0033.0002] # COMBINING NOT TILDE ABOVE +034B ; [.0000.0033.0002] # COMBINING HOMOTHETIC ABOVE +034C ; [.0000.0033.0002] # COMBINING ALMOST EQUAL TO ABOVE +0350 ; [.0000.0033.0002] # COMBINING RIGHT ARROWHEAD ABOVE +0351 ; [.0000.0033.0002] # COMBINING LEFT HALF RING ABOVE +0352 ; [.0000.0033.0002] # COMBINING FERMATA +0357 ; [.0000.0033.0002] # COMBINING RIGHT HALF RING ABOVE +035B ; [.0000.0033.0002] # COMBINING ZIGZAG ABOVE +035D ; [.0000.0033.0002] # COMBINING DOUBLE BREVE +035E ; [.0000.0033.0002] # COMBINING DOUBLE MACRON +0484 ; [.0000.0033.0002] # COMBINING CYRILLIC PALATALIZATION +0487 ; [.0000.0033.0002] # COMBINING CYRILLIC POKRYTIE +0741 ; [.0000.0033.0002] # SYRIAC QUSHSHAYA +0745 ; [.0000.0033.0002] # SYRIAC THREE DOTS ABOVE +17CB ; [.0000.0033.0002] # KHMER SIGN BANTOC +17CC ; [.0000.0033.0002] # KHMER SIGN ROBAT +17CD ; [.0000.0033.0002] # KHMER SIGN TOANDAKHIAT +17CE ; [.0000.0033.0002] # KHMER SIGN KAKABAT +17CF ; [.0000.0033.0002] # KHMER SIGN AHSDA +17D0 ; [.0000.0033.0002] # KHMER SIGN SAMYOK SANNYA +17D1 ; [.0000.0033.0002] # KHMER SIGN VIRIAM +17DD ; [.0000.0033.0002] # KHMER SIGN ATTHACAN +1AB0 ; [.0000.0033.0002] # COMBINING DOUBLED CIRCUMFLEX ACCENT +1AB1 ; [.0000.0033.0002] # COMBINING DIAERESIS-RING +1AB2 ; [.0000.0033.0002] # COMBINING INFINITY +1AB3 ; [.0000.0033.0002] # COMBINING DOWNWARDS ARROW +1AB4 ; [.0000.0033.0002] # COMBINING TRIPLE DOT +1ABB ; [.0000.0033.0002] # COMBINING PARENTHESES ABOVE +1ABC ; [.0000.0033.0002] # COMBINING DOUBLE PARENTHESES ABOVE +1DC0 ; [.0000.0033.0002] # COMBINING DOTTED GRAVE ACCENT +1DC1 ; [.0000.0033.0002] # COMBINING DOTTED ACUTE ACCENT +1DC3 ; [.0000.0033.0002] # COMBINING SUSPENSION MARK +1DC4 ; [.0000.0033.0002] # COMBINING MACRON-ACUTE +1DC5 ; [.0000.0033.0002] # COMBINING GRAVE-MACRON +1DC6 ; [.0000.0033.0002] # COMBINING MACRON-GRAVE +1DC7 ; [.0000.0033.0002] # COMBINING ACUTE-MACRON +1DC8 ; [.0000.0033.0002] # COMBINING GRAVE-ACUTE-GRAVE +1DC9 ; [.0000.0033.0002] # COMBINING ACUTE-GRAVE-ACUTE +1DCB ; [.0000.0033.0002] # COMBINING BREVE-MACRON +1DCC ; [.0000.0033.0002] # COMBINING MACRON-BREVE +1DCD ; [.0000.0033.0002] # COMBINING DOUBLE CIRCUMFLEX ABOVE +1DCE ; [.0000.0033.0002] # COMBINING OGONEK ABOVE +1DD1 ; [.0000.0033.0002] # COMBINING UR ABOVE +1DF5 ; [.0000.0033.0002] # COMBINING UP TACK ABOVE +1DFE ; [.0000.0033.0002] # COMBINING LEFT ARROWHEAD ABOVE +20F0 ; [.0000.0033.0002] # COMBINING ASTERISK ABOVE +2CEF ; [.0000.0033.0002] # COPTIC COMBINING NI ABOVE +A67C ; [.0000.0033.0002] # COMBINING CYRILLIC KAVYKA +A67D ; [.0000.0033.0002] # COMBINING CYRILLIC PAYEROK +10AE5 ; [.0000.0033.0002] # MANICHAEAN ABBREVIATION MARK ABOVE +1BC9D ; [.0000.0033.0002] # DUPLOYAN THICK LETTER SELECTOR +0316 ; [.0000.0034.0002] # COMBINING GRAVE ACCENT BELOW +0317 ; [.0000.0034.0002] # COMBINING ACUTE ACCENT BELOW +0318 ; [.0000.0034.0002] # COMBINING LEFT TACK BELOW +0319 ; [.0000.0034.0002] # COMBINING RIGHT TACK BELOW +031C ; [.0000.0034.0002] # COMBINING LEFT HALF RING BELOW +031D ; [.0000.0034.0002] # COMBINING UP TACK BELOW +031E ; [.0000.0034.0002] # COMBINING DOWN TACK BELOW +031F ; [.0000.0034.0002] # COMBINING PLUS SIGN BELOW +0320 ; [.0000.0034.0002] # COMBINING MINUS SIGN BELOW +0329 ; [.0000.0034.0002] # COMBINING VERTICAL LINE BELOW +032A ; [.0000.0034.0002] # COMBINING BRIDGE BELOW +032B ; [.0000.0034.0002] # COMBINING INVERTED DOUBLE ARCH BELOW +032C ; [.0000.0034.0002] # COMBINING CARON BELOW +032F ; [.0000.0034.0002] # COMBINING INVERTED BREVE BELOW +0333 ; [.0000.0034.0002] # COMBINING DOUBLE LOW LINE +033A ; [.0000.0034.0002] # COMBINING INVERTED BRIDGE BELOW +033B ; [.0000.0034.0002] # COMBINING SQUARE BELOW +033C ; [.0000.0034.0002] # COMBINING SEAGULL BELOW +0347 ; [.0000.0034.0002] # COMBINING EQUALS SIGN BELOW +0348 ; [.0000.0034.0002] # COMBINING DOUBLE VERTICAL LINE BELOW +0349 ; [.0000.0034.0002] # COMBINING LEFT ANGLE BELOW +034D ; [.0000.0034.0002] # COMBINING LEFT RIGHT ARROW BELOW +034E ; [.0000.0034.0002] # COMBINING UPWARDS ARROW BELOW +0353 ; [.0000.0034.0002] # COMBINING X BELOW +0354 ; [.0000.0034.0002] # COMBINING LEFT ARROWHEAD BELOW +0355 ; [.0000.0034.0002] # COMBINING RIGHT ARROWHEAD BELOW +0356 ; [.0000.0034.0002] # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW +0359 ; [.0000.0034.0002] # COMBINING ASTERISK BELOW +035A ; [.0000.0034.0002] # COMBINING DOUBLE RING BELOW +035C ; [.0000.0034.0002] # COMBINING DOUBLE BREVE BELOW +035F ; [.0000.0034.0002] # COMBINING DOUBLE MACRON BELOW +0362 ; [.0000.0034.0002] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0742 ; [.0000.0034.0002] # SYRIAC RUKKAKHA +0746 ; [.0000.0034.0002] # SYRIAC THREE DOTS BELOW +0859 ; [.0000.0034.0002] # MANDAIC AFFRICATION MARK +085A ; [.0000.0034.0002] # MANDAIC VOCALIZATION MARK +085B ; [.0000.0034.0002] # MANDAIC GEMINATION MARK +1AB5 ; [.0000.0034.0002] # COMBINING X-X BELOW +1AB6 ; [.0000.0034.0002] # COMBINING WIGGLY LINE BELOW +1AB7 ; [.0000.0034.0002] # COMBINING OPEN MARK BELOW +1AB8 ; [.0000.0034.0002] # COMBINING DOUBLE OPEN MARK BELOW +1AB9 ; [.0000.0034.0002] # COMBINING LIGHT CENTRALIZATION STROKE BELOW +1ABA ; [.0000.0034.0002] # COMBINING STRONG CENTRALIZATION STROKE BELOW +1ABD ; [.0000.0034.0002] # COMBINING PARENTHESES BELOW +1DC2 ; [.0000.0034.0002] # COMBINING SNAKE BELOW +1DCF ; [.0000.0034.0002] # COMBINING ZIGZAG BELOW +1DD0 ; [.0000.0034.0002] # COMBINING IS BELOW +1DFC ; [.0000.0034.0002] # COMBINING DOUBLE INVERTED BREVE BELOW +1DFD ; [.0000.0034.0002] # COMBINING ALMOST EQUAL TO BELOW +1DFF ; [.0000.0034.0002] # COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +20EC ; [.0000.0034.0002] # COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS +20ED ; [.0000.0034.0002] # COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS +20EE ; [.0000.0034.0002] # COMBINING LEFT ARROW BELOW +20EF ; [.0000.0034.0002] # COMBINING RIGHT ARROW BELOW +FE27 ; [.0000.0034.0002] # COMBINING LIGATURE LEFT HALF BELOW +10A0D ; [.0000.0034.0002] # KHAROSHTHI SIGN DOUBLE RING BELOW +10AE6 ; [.0000.0034.0002] # MANICHAEAN ABBREVIATION MARK BELOW +0336 ; [.0000.0035.0002] # COMBINING LONG STROKE OVERLAY +0337 ; [.0000.0035.0002] # COMBINING SHORT SOLIDUS OVERLAY +20D8 ; [.0000.0035.0002] # COMBINING RING OVERLAY +20D9 ; [.0000.0035.0002] # COMBINING CLOCKWISE RING OVERLAY +20DA ; [.0000.0035.0002] # COMBINING ANTICLOCKWISE RING OVERLAY +20E5 ; [.0000.0035.0002] # COMBINING REVERSE SOLIDUS OVERLAY +20EA ; [.0000.0035.0002] # COMBINING LEFTWARDS ARROW OVERLAY +20EB ; [.0000.0035.0002] # COMBINING LONG DOUBLE SOLIDUS OVERLAY +1BC9E ; [.0000.0035.0002] # DUPLOYAN DOUBLE MARK +1ABE ; [.0000.0036.0002] # COMBINING PARENTHESES OVERLAY +20DD ; [.0000.0036.0002] # COMBINING ENCLOSING CIRCLE +20DE ; [.0000.0036.0002] # COMBINING ENCLOSING SQUARE +20DF ; [.0000.0036.0002] # COMBINING ENCLOSING DIAMOND +20E0 ; [.0000.0036.0002] # COMBINING ENCLOSING CIRCLE BACKSLASH +20E2 ; [.0000.0036.0002] # COMBINING ENCLOSING SCREEN +20E3 ; [.0000.0036.0002] # COMBINING ENCLOSING KEYCAP +20E4 ; [.0000.0036.0002] # COMBINING ENCLOSING UPWARD POINTING TRIANGLE +3099 ; [.0000.0037.0002] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK +FF9E ; [.0000.0037.0012] # HALFWIDTH KATAKANA VOICED SOUND MARK +309A ; [.0000.0038.0002] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +FF9F ; [.0000.0038.0012] # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +0335 ; [.0000.0039.0002] # COMBINING SHORT STROKE OVERLAY +0305 ; [.0000.003A.0002] # COMBINING OVERLINE +0309 ; [.0000.003B.0002] # COMBINING HOOK ABOVE +030F ; [.0000.003C.0002] # COMBINING DOUBLE GRAVE ACCENT +0310 ; [.0000.003D.0002] # COMBINING CANDRABINDU +0311 ; [.0000.003E.0002] # COMBINING INVERTED BREVE +031B ; [.0000.003F.0002] # COMBINING HORN +0321 ; [.0000.0040.0002] # COMBINING PALATALIZED HOOK BELOW +0322 ; [.0000.0041.0002] # COMBINING RETROFLEX HOOK BELOW +0323 ; [.0000.0042.0002] # COMBINING DOT BELOW +0324 ; [.0000.0043.0002] # COMBINING DIAERESIS BELOW +0325 ; [.0000.0044.0002] # COMBINING RING BELOW +0326 ; [.0000.0045.0002] # COMBINING COMMA BELOW +032D ; [.0000.0046.0002] # COMBINING CIRCUMFLEX ACCENT BELOW +032E ; [.0000.0047.0002] # COMBINING BREVE BELOW +0330 ; [.0000.0048.0002] # COMBINING TILDE BELOW +0331 ; [.0000.0049.0002] # COMBINING MACRON BELOW +0334 ; [.0000.004A.0002] # COMBINING TILDE OVERLAY +0339 ; [.0000.004B.0002] # COMBINING RIGHT HALF RING BELOW +0345 ; [.0000.004C.0002] # COMBINING GREEK YPOGEGRAMMENI +0358 ; [.0000.004D.0002] # COMBINING DOT ABOVE RIGHT +0360 ; [.0000.004E.0002] # COMBINING DOUBLE TILDE +FE22 ; [.0000.004E.0002] # COMBINING DOUBLE TILDE LEFT HALF +FE29 ; [.0000.004E.0002] # COMBINING TILDE LEFT HALF BELOW +0361 ; [.0000.004F.0002] # COMBINING DOUBLE INVERTED BREVE +FE20 ; [.0000.004F.0002] # COMBINING LIGATURE LEFT HALF +0483 ; [.0000.0050.0002] # COMBINING CYRILLIC TITLO +FE2E ; [.0000.0050.0002] # COMBINING CYRILLIC TITLO LEFT HALF +A66F ; [.0000.0051.0002] # COMBINING CYRILLIC VZMET +05B0 ; [.0000.0052.0002] # HEBREW POINT SHEVA +05B1 ; [.0000.0053.0002] # HEBREW POINT HATAF SEGOL +05B2 ; [.0000.0054.0002] # HEBREW POINT HATAF PATAH +05B3 ; [.0000.0055.0002] # HEBREW POINT HATAF QAMATS +05B4 ; [.0000.0056.0002] # HEBREW POINT HIRIQ +05B5 ; [.0000.0057.0002] # HEBREW POINT TSERE +05B6 ; [.0000.0058.0002] # HEBREW POINT SEGOL +05B7 ; [.0000.0059.0002] # HEBREW POINT PATAH +05B8 ; [.0000.005A.0002] # HEBREW POINT QAMATS +05C7 ; [.0000.005A.0002] # HEBREW POINT QAMATS QATAN +05B9 ; [.0000.005B.0002] # HEBREW POINT HOLAM +05BA ; [.0000.005B.0002] # HEBREW POINT HOLAM HASER FOR VAV +05BB ; [.0000.005C.0002] # HEBREW POINT QUBUTS +05C2 ; [.0000.005D.0002] # HEBREW POINT SIN DOT +05C1 ; [.0000.005E.0002] # HEBREW POINT SHIN DOT +05BC ; [.0000.005F.0002] # HEBREW POINT DAGESH OR MAPIQ +05BF ; [.0000.0060.0002] # HEBREW POINT RAFE +FB1E ; [.0000.0061.0002] # HEBREW POINT JUDEO-SPANISH VARIKA +081C ; [.0000.0062.0002] # SAMARITAN VOWEL SIGN LONG E +081D ; [.0000.0062.0002] # SAMARITAN VOWEL SIGN E +081E ; [.0000.0063.0002] # SAMARITAN VOWEL SIGN OVERLONG AA +081F ; [.0000.0063.0002] # SAMARITAN VOWEL SIGN LONG AA +0820 ; [.0000.0063.0002] # SAMARITAN VOWEL SIGN AA +0821 ; [.0000.0064.0002] # SAMARITAN VOWEL SIGN OVERLONG A +0822 ; [.0000.0064.0002] # SAMARITAN VOWEL SIGN LONG A +0823 ; [.0000.0064.0002] # SAMARITAN VOWEL SIGN A +0824 ; [.0000.0065.0002] # SAMARITAN MODIFIER LETTER SHORT A +0825 ; [.0000.0065.0002] # SAMARITAN VOWEL SIGN SHORT A +0826 ; [.0000.0066.0002] # SAMARITAN VOWEL SIGN LONG U +0827 ; [.0000.0066.0002] # SAMARITAN VOWEL SIGN U +0828 ; [.0000.0067.0002] # SAMARITAN MODIFIER LETTER I +0829 ; [.0000.0067.0002] # SAMARITAN VOWEL SIGN LONG I +082A ; [.0000.0067.0002] # SAMARITAN VOWEL SIGN I +082B ; [.0000.0068.0002] # SAMARITAN VOWEL SIGN O +082C ; [.0000.0069.0002] # SAMARITAN VOWEL SIGN SUKUN +0818 ; [.0000.006A.0002] # SAMARITAN MARK OCCLUSION +0819 ; [.0000.006B.0002] # SAMARITAN MARK DAGESH +082D ; [.0000.006C.0002] # SAMARITAN MARK NEQUDAA +064B ; [.0000.006D.0002] # ARABIC FATHATAN +FE71 ; [.0000.006D.0018] # ARABIC TATWEEL WITH FATHATAN ABOVE +FE70 ; [.0000.006D.001A] # ARABIC FATHATAN ISOLATED FORM +08F0 ; [.0000.006E.0002] # ARABIC OPEN FATHATAN +08E7 ; [.0000.006F.0002] # ARABIC CURLY FATHATAN +064C ; [.0000.0070.0002] # ARABIC DAMMATAN +FE72 ; [.0000.0070.001A] # ARABIC DAMMATAN ISOLATED FORM +FC5E ; [.0000.0070.001A][.0000.0080.001A] # ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM +08F1 ; [.0000.0071.0002] # ARABIC OPEN DAMMATAN +08E8 ; [.0000.0072.0002] # ARABIC CURLY DAMMATAN +064D ; [.0000.0073.0002] # ARABIC KASRATAN +FE74 ; [.0000.0073.001A] # ARABIC KASRATAN ISOLATED FORM +FC5F ; [.0000.0073.001A][.0000.0080.001A] # ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM +08F2 ; [.0000.0074.0002] # ARABIC OPEN KASRATAN +08E9 ; [.0000.0075.0002] # ARABIC CURLY KASRATAN +064E ; [.0000.0076.0002] # ARABIC FATHA +FE77 ; [.0000.0076.0018] # ARABIC FATHA MEDIAL FORM +FE76 ; [.0000.0076.001A] # ARABIC FATHA ISOLATED FORM +FCF2 ; [.0000.0076.0018][.0000.0080.0018] # ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM +FC60 ; [.0000.0076.001A][.0000.0080.001A] # ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM +08E4 ; [.0000.0077.0002] # ARABIC CURLY FATHA +08F4 ; [.0000.0078.0002] # ARABIC FATHA WITH RING +08F5 ; [.0000.0079.0002] # ARABIC FATHA WITH DOT ABOVE +064F ; [.0000.007A.0002] # ARABIC DAMMA +FE79 ; [.0000.007A.0018] # ARABIC DAMMA MEDIAL FORM +FE78 ; [.0000.007A.001A] # ARABIC DAMMA ISOLATED FORM +FCF3 ; [.0000.007A.0018][.0000.0080.0018] # ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM +FC61 ; [.0000.007A.001A][.0000.0080.001A] # ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM +08E5 ; [.0000.007B.0002] # ARABIC CURLY DAMMA +08FE ; [.0000.007C.0002] # ARABIC DAMMA WITH DOT +0650 ; [.0000.007D.0002] # ARABIC KASRA +FE7B ; [.0000.007D.0018] # ARABIC KASRA MEDIAL FORM +FE7A ; [.0000.007D.001A] # ARABIC KASRA ISOLATED FORM +FCF4 ; [.0000.007D.0018][.0000.0080.0018] # ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +FC62 ; [.0000.007D.001A][.0000.0080.001A] # ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM +08E6 ; [.0000.007E.0002] # ARABIC CURLY KASRA +08F6 ; [.0000.007F.0002] # ARABIC KASRA WITH DOT BELOW +0651 ; [.0000.0080.0002] # ARABIC SHADDA +11237 ; [.0000.0080.0002] # KHOJKI SIGN SHADDA +FE7D ; [.0000.0080.0018] # ARABIC SHADDA MEDIAL FORM +FE7C ; [.0000.0080.001A] # ARABIC SHADDA ISOLATED FORM +FC63 ; [.0000.0080.001A][.0000.0098.001A] # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +0652 ; [.0000.0081.0002] # ARABIC SUKUN +FE7F ; [.0000.0081.0018] # ARABIC SUKUN MEDIAL FORM +FE7E ; [.0000.0081.001A] # ARABIC SUKUN ISOLATED FORM +0653 ; [.0000.0082.0002] # ARABIC MADDAH ABOVE +0654 ; [.0000.0083.0002] # ARABIC HAMZA ABOVE +0655 ; [.0000.0084.0002] # ARABIC HAMZA BELOW +065F ; [.0000.0085.0002] # ARABIC WAVY HAMZA BELOW +0656 ; [.0000.0086.0002] # ARABIC SUBSCRIPT ALEF +0657 ; [.0000.0087.0002] # ARABIC INVERTED DAMMA +0658 ; [.0000.0088.0002] # ARABIC MARK NOON GHUNNA +08FF ; [.0000.0089.0002] # ARABIC MARK SIDEWAYS NOON GHUNNA +0659 ; [.0000.008A.0002] # ARABIC ZWARAKAY +065A ; [.0000.008B.0002] # ARABIC VOWEL SIGN SMALL V ABOVE +065B ; [.0000.008C.0002] # ARABIC VOWEL SIGN INVERTED SMALL V ABOVE +065C ; [.0000.008D.0002] # ARABIC VOWEL SIGN DOT BELOW +065D ; [.0000.008E.0002] # ARABIC REVERSED DAMMA +065E ; [.0000.008F.0002] # ARABIC FATHA WITH TWO DOTS +08E3 ; [.0000.0090.0002] # ARABIC TURNED DAMMA BELOW +08F7 ; [.0000.0091.0002] # ARABIC LEFT ARROWHEAD ABOVE +08F8 ; [.0000.0092.0002] # ARABIC RIGHT ARROWHEAD ABOVE +08FD ; [.0000.0093.0002] # ARABIC RIGHT ARROWHEAD ABOVE WITH DOT +08FB ; [.0000.0094.0002] # ARABIC DOUBLE RIGHT ARROWHEAD ABOVE +08FC ; [.0000.0095.0002] # ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT +08F9 ; [.0000.0096.0002] # ARABIC LEFT ARROWHEAD BELOW +08FA ; [.0000.0097.0002] # ARABIC RIGHT ARROWHEAD BELOW +0670 ; [.0000.0098.0002] # ARABIC LETTER SUPERSCRIPT ALEF +0711 ; [.0000.0099.0002] # SYRIAC LETTER SUPERSCRIPT ALAPH +0730 ; [.0000.009A.0002] # SYRIAC PTHAHA ABOVE +0731 ; [.0000.009B.0002] # SYRIAC PTHAHA BELOW +0732 ; [.0000.009C.0002] # SYRIAC PTHAHA DOTTED +0733 ; [.0000.009D.0002] # SYRIAC ZQAPHA ABOVE +0734 ; [.0000.009E.0002] # SYRIAC ZQAPHA BELOW +0735 ; [.0000.009F.0002] # SYRIAC ZQAPHA DOTTED +0736 ; [.0000.00A0.0002] # SYRIAC RBASA ABOVE +0737 ; [.0000.00A1.0002] # SYRIAC RBASA BELOW +0738 ; [.0000.00A2.0002] # SYRIAC DOTTED ZLAMA HORIZONTAL +0739 ; [.0000.00A3.0002] # SYRIAC DOTTED ZLAMA ANGULAR +073A ; [.0000.00A4.0002] # SYRIAC HBASA ABOVE +073B ; [.0000.00A5.0002] # SYRIAC HBASA BELOW +073C ; [.0000.00A6.0002] # SYRIAC HBASA-ESASA DOTTED +073D ; [.0000.00A7.0002] # SYRIAC ESASA ABOVE +073E ; [.0000.00A8.0002] # SYRIAC ESASA BELOW +073F ; [.0000.00A9.0002] # SYRIAC RWAHA +07EB ; [.0000.00AA.0002] # NKO COMBINING SHORT HIGH TONE +07EC ; [.0000.00AB.0002] # NKO COMBINING SHORT LOW TONE +07ED ; [.0000.00AC.0002] # NKO COMBINING SHORT RISING TONE +07EE ; [.0000.00AD.0002] # NKO COMBINING LONG DESCENDING TONE +07EF ; [.0000.00AE.0002] # NKO COMBINING LONG HIGH TONE +07F0 ; [.0000.00AF.0002] # NKO COMBINING LONG LOW TONE +07F1 ; [.0000.00B0.0002] # NKO COMBINING LONG RISING TONE +07F2 ; [.0000.00B1.0002] # NKO COMBINING NASALIZATION MARK +07F3 ; [.0000.00B2.0002] # NKO COMBINING DOUBLE DOT ABOVE +135F ; [.0000.00B3.0002] # ETHIOPIC COMBINING GEMINATION MARK +135E ; [.0000.00B4.0002] # ETHIOPIC COMBINING VOWEL LENGTH MARK +135D ; [.0000.00B5.0002] # ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK +A6F0 ; [.0000.00B6.0002] # BAMUM COMBINING MARK KOQNDON +A6F1 ; [.0000.00B7.0002] # BAMUM COMBINING MARK TUKWENTIS +16AF0 ; [.0000.00B8.0002] # BASSA VAH COMBINING HIGH TONE +16AF1 ; [.0000.00B9.0002] # BASSA VAH COMBINING LOW TONE +16AF2 ; [.0000.00BA.0002] # BASSA VAH COMBINING MID TONE +16AF3 ; [.0000.00BB.0002] # BASSA VAH COMBINING LOW-MID TONE +16AF4 ; [.0000.00BC.0002] # BASSA VAH COMBINING HIGH-LOW TONE +093C ; [.0000.00BD.0002] # DEVANAGARI SIGN NUKTA +09BC ; [.0000.00BD.0002] # BENGALI SIGN NUKTA +0A3C ; [.0000.00BD.0002] # GURMUKHI SIGN NUKTA +0ABC ; [.0000.00BD.0002] # GUJARATI SIGN NUKTA +0B3C ; [.0000.00BD.0002] # ORIYA SIGN NUKTA +0CBC ; [.0000.00BD.0002] # KANNADA SIGN NUKTA +1B34 ; [.0000.00BD.0002] # BALINESE SIGN REREKAN +1BE6 ; [.0000.00BD.0002] # BATAK SIGN TOMPI +1C37 ; [.0000.00BD.0002] # LEPCHA SIGN NUKTA +A9B3 ; [.0000.00BD.0002] # JAVANESE SIGN CECAK TELU +110BA ; [.0000.00BD.0002] # KAITHI SIGN NUKTA +11173 ; [.0000.00BD.0002] # MAHAJANI SIGN NUKTA +111CA ; [.0000.00BD.0002] # SHARADA SIGN NUKTA +11236 ; [.0000.00BD.0002] # KHOJKI SIGN NUKTA +112E9 ; [.0000.00BD.0002] # KHUDAWADI SIGN NUKTA +1133C ; [.0000.00BD.0002] # GRANTHA SIGN NUKTA +114C3 ; [.0000.00BD.0002] # TIRHUTA SIGN NUKTA +115C0 ; [.0000.00BD.0002] # SIDDHAM SIGN NUKTA +116B7 ; [.0000.00BD.0002] # TAKRI SIGN NUKTA +0900 ; [.0000.00BE.0002] # DEVANAGARI SIGN INVERTED CANDRABINDU +0901 ; [.0000.00BE.0002] # DEVANAGARI SIGN CANDRABINDU +0981 ; [.0000.00BE.0002] # BENGALI SIGN CANDRABINDU +0A01 ; [.0000.00BE.0002] # GURMUKHI SIGN ADAK BINDI +0A81 ; [.0000.00BE.0002] # GUJARATI SIGN CANDRABINDU +0B01 ; [.0000.00BE.0002] # ORIYA SIGN CANDRABINDU +0C00 ; [.0000.00BE.0002] # TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01 ; [.0000.00BE.0002] # TELUGU SIGN CANDRABINDU +0C81 ; [.0000.00BE.0002] # KANNADA SIGN CANDRABINDU +0D01 ; [.0000.00BE.0002] # MALAYALAM SIGN CANDRABINDU +1B00 ; [.0000.00BE.0002] # BALINESE SIGN ULU RICEM +1B01 ; [.0000.00BE.0002] # BALINESE SIGN ULU CANDRA +A980 ; [.0000.00BE.0002] # JAVANESE SIGN PANYANGGA +11000 ; [.0000.00BE.0002] # BRAHMI SIGN CANDRABINDU +11080 ; [.0000.00BE.0002] # KAITHI SIGN CANDRABINDU +11100 ; [.0000.00BE.0002] # CHAKMA SIGN CANDRABINDU +11180 ; [.0000.00BE.0002] # SHARADA SIGN CANDRABINDU +11301 ; [.0000.00BE.0002] # GRANTHA SIGN CANDRABINDU +114BF ; [.0000.00BE.0002] # TIRHUTA SIGN CANDRABINDU +115BC ; [.0000.00BE.0002] # SIDDHAM SIGN CANDRABINDU +11640 ; [.0000.00BE.0002] # MODI SIGN ARDHACANDRA +0902 ; [.0000.00BF.0002] # DEVANAGARI SIGN ANUSVARA +0982 ; [.0000.00BF.0002] # BENGALI SIGN ANUSVARA +0A02 ; [.0000.00BF.0002] # GURMUKHI SIGN BINDI +0A82 ; [.0000.00BF.0002] # GUJARATI SIGN ANUSVARA +0B02 ; [.0000.00BF.0002] # ORIYA SIGN ANUSVARA +0B82 ; [.0000.00BF.0002] # TAMIL SIGN ANUSVARA +0C02 ; [.0000.00BF.0002] # TELUGU SIGN ANUSVARA +0C82 ; [.0000.00BF.0002] # KANNADA SIGN ANUSVARA +0D02 ; [.0000.00BF.0002] # MALAYALAM SIGN ANUSVARA +0D82 ; [.0000.00BF.0002] # SINHALA SIGN ANUSVARAYA +0F7E ; [.0000.00BF.0002] # TIBETAN SIGN RJES SU NGA RO +1036 ; [.0000.00BF.0002] # MYANMAR SIGN ANUSVARA +17C6 ; [.0000.00BF.0002] # KHMER SIGN NIKAHIT +1A74 ; [.0000.00BF.0002] # TAI THAM SIGN MAI KANG +1B02 ; [.0000.00BF.0002] # BALINESE SIGN CECEK +1B80 ; [.0000.00BF.0002] # SUNDANESE SIGN PANYECEK +1CED ; [.0000.00BF.0002] # VEDIC SIGN TIRYAK +A80B ; [.0000.00BF.0002] # SYLOTI NAGRI SIGN ANUSVARA +A880 ; [.0000.00BF.0002] # SAURASHTRA SIGN ANUSVARA +A981 ; [.0000.00BF.0002] # JAVANESE SIGN CECAK +10A0E ; [.0000.00BF.0002] # KHAROSHTHI SIGN ANUSVARA +11001 ; [.0000.00BF.0002] # BRAHMI SIGN ANUSVARA +11081 ; [.0000.00BF.0002] # KAITHI SIGN ANUSVARA +11101 ; [.0000.00BF.0002] # CHAKMA SIGN ANUSVARA +11181 ; [.0000.00BF.0002] # SHARADA SIGN ANUSVARA +11234 ; [.0000.00BF.0002] # KHOJKI SIGN ANUSVARA +112DF ; [.0000.00BF.0002] # KHUDAWADI SIGN ANUSVARA +11300 ; [.0000.00BF.0002] # GRANTHA SIGN COMBINING ANUSVARA ABOVE +11302 ; [.0000.00BF.0002] # GRANTHA SIGN ANUSVARA +114C0 ; [.0000.00BF.0002] # TIRHUTA SIGN ANUSVARA +115BD ; [.0000.00BF.0002] # SIDDHAM SIGN ANUSVARA +1163D ; [.0000.00BF.0002] # MODI SIGN ANUSVARA +116AB ; [.0000.00BF.0002] # TAKRI SIGN ANUSVARA +0903 ; [.0000.00C0.0002] # DEVANAGARI SIGN VISARGA +0983 ; [.0000.00C0.0002] # BENGALI SIGN VISARGA +0A03 ; [.0000.00C0.0002] # GURMUKHI SIGN VISARGA +0A83 ; [.0000.00C0.0002] # GUJARATI SIGN VISARGA +0B03 ; [.0000.00C0.0002] # ORIYA SIGN VISARGA +0C03 ; [.0000.00C0.0002] # TELUGU SIGN VISARGA +0C83 ; [.0000.00C0.0002] # KANNADA SIGN VISARGA +0D03 ; [.0000.00C0.0002] # MALAYALAM SIGN VISARGA +0D83 ; [.0000.00C0.0002] # SINHALA SIGN VISARGAYA +0F7F ; [.0000.00C0.0002] # TIBETAN SIGN RNAM BCAD +1038 ; [.0000.00C0.0002] # MYANMAR SIGN VISARGA +17C7 ; [.0000.00C0.0002] # KHMER SIGN REAHMUK +1B04 ; [.0000.00C0.0002] # BALINESE SIGN BISAH +1B82 ; [.0000.00C0.0002] # SUNDANESE SIGN PANGWISAD +1CF2 ; [.0000.00C0.0002] # VEDIC SIGN ARDHAVISARGA +1CF3 ; [.0000.00C0.0002] # VEDIC SIGN ROTATED ARDHAVISARGA +A881 ; [.0000.00C0.0002] # SAURASHTRA SIGN VISARGA +A983 ; [.0000.00C0.0002] # JAVANESE SIGN WIGNYAN +10A0F ; [.0000.00C0.0002] # KHAROSHTHI SIGN VISARGA +11002 ; [.0000.00C0.0002] # BRAHMI SIGN VISARGA +11082 ; [.0000.00C0.0002] # KAITHI SIGN VISARGA +11102 ; [.0000.00C0.0002] # CHAKMA SIGN VISARGA +11182 ; [.0000.00C0.0002] # SHARADA SIGN VISARGA +11303 ; [.0000.00C0.0002] # GRANTHA SIGN VISARGA +114C1 ; [.0000.00C0.0002] # TIRHUTA SIGN VISARGA +115BE ; [.0000.00C0.0002] # SIDDHAM SIGN VISARGA +1163E ; [.0000.00C0.0002] # MODI SIGN VISARGA +116AC ; [.0000.00C0.0002] # TAKRI SIGN VISARGA +0A70 ; [.0000.00C1.0002] # GURMUKHI TIPPI +0A71 ; [.0000.00C2.0002] # GURMUKHI ADDAK +1B03 ; [.0000.00C3.0002] # BALINESE SIGN SURANG +A982 ; [.0000.00C4.0002] # JAVANESE SIGN LAYAR +1B81 ; [.0000.00C5.0002] # SUNDANESE SIGN PANGLAYAR +ABEC ; [.0000.00C6.0002] # MEETEI MAYEK LUM IYEK +10A38 ; [.0000.00C7.0002] # KHAROSHTHI SIGN BAR ABOVE +10A39 ; [.0000.00C8.0002] # KHAROSHTHI SIGN CAUDA +10A3A ; [.0000.00C9.0002] # KHAROSHTHI SIGN DOT BELOW +111CB ; [.0000.00CA.0002] # SHARADA VOWEL MODIFIER MARK +111CC ; [.0000.00CB.0002] # SHARADA EXTRA SHORT VOWEL MARK +0E4E ; [.0000.00CC.0002] # THAI CHARACTER YAMAKKAN +0E47 ; [.0000.00CD.0002] # THAI CHARACTER MAITAIKHU +0E48 ; [.0000.00CE.0002] # THAI CHARACTER MAI EK +0E49 ; [.0000.00CF.0002] # THAI CHARACTER MAI THO +0E4A ; [.0000.00D0.0002] # THAI CHARACTER MAI TRI +0E4B ; [.0000.00D1.0002] # THAI CHARACTER MAI CHATTAWA +0E4C ; [.0000.00D2.0002] # THAI CHARACTER THANTHAKHAT +0E4D ; [.0000.00D3.0002] # THAI CHARACTER NIKHAHIT +0EC8 ; [.0000.00D4.0002] # LAO TONE MAI EK +0EC9 ; [.0000.00D5.0002] # LAO TONE MAI THO +0ECA ; [.0000.00D6.0002] # LAO TONE MAI TI +0ECB ; [.0000.00D7.0002] # LAO TONE MAI CATAWA +0ECC ; [.0000.00D8.0002] # LAO CANCELLATION MARK +0ECD ; [.0000.00D9.0002] # LAO NIGGAHITA +AABF ; [.0000.00DA.0002] # TAI VIET TONE MAI EK +AAC1 ; [.0000.00DB.0002] # TAI VIET TONE MAI THO +0F39 ; [.0000.00DC.0002] # TIBETAN MARK TSA -PHRU +A92B ; [.0000.00DD.0002] # KAYAH LI TONE PLOPHU +A92C ; [.0000.00DE.0002] # KAYAH LI TONE CALYA +A92D ; [.0000.00DF.0002] # KAYAH LI TONE CALYA PLOPHU +1037 ; [.0000.00E0.0002] # MYANMAR SIGN DOT BELOW +17C8 ; [.0000.00E1.0002] # KHMER SIGN YUUKALEAPINTU +17C9 ; [.0000.00E2.0002] # KHMER SIGN MUUSIKATOAN +17CA ; [.0000.00E3.0002] # KHMER SIGN TRIISAP +1A75 ; [.0000.00E4.0002] # TAI THAM SIGN TONE-1 +1A76 ; [.0000.00E5.0002] # TAI THAM SIGN TONE-2 +1A77 ; [.0000.00E6.0002] # TAI THAM SIGN KHUEN TONE-3 +1A78 ; [.0000.00E7.0002] # TAI THAM SIGN KHUEN TONE-4 +1A79 ; [.0000.00E8.0002] # TAI THAM SIGN KHUEN TONE-5 +1A7A ; [.0000.00E9.0002] # TAI THAM SIGN RA HAAM +1A7B ; [.0000.00EA.0002] # TAI THAM SIGN MAI SAM +1A7C ; [.0000.00EB.0002] # TAI THAM SIGN KHUEN-LUE KARAN +1939 ; [.0000.00EC.0002] # LIMBU SIGN MUKPHRENG +193A ; [.0000.00ED.0002] # LIMBU SIGN KEMPHRENG +193B ; [.0000.00EE.0002] # LIMBU SIGN SA-I +16B30 ; [.0000.00EF.0002] # PAHAWH HMONG MARK CIM TUB +16B31 ; [.0000.00F0.0002] # PAHAWH HMONG MARK CIM SO +16B32 ; [.0000.00F1.0002] # PAHAWH HMONG MARK CIM KES +16B33 ; [.0000.00F2.0002] # PAHAWH HMONG MARK CIM KHAV +16B34 ; [.0000.00F3.0002] # PAHAWH HMONG MARK CIM SUAM +16B35 ; [.0000.00F4.0002] # PAHAWH HMONG MARK CIM HOM +16B36 ; [.0000.00F5.0002] # PAHAWH HMONG MARK CIM TAUM +302A ; [.0000.00F6.0002] # IDEOGRAPHIC LEVEL TONE MARK +302B ; [.0000.00F7.0002] # IDEOGRAPHIC RISING TONE MARK +302C ; [.0000.00F8.0002] # IDEOGRAPHIC DEPARTING TONE MARK +302D ; [.0000.00F9.0002] # IDEOGRAPHIC ENTERING TONE MARK +302E ; [.0000.00FA.0002] # HANGUL SINGLE DOT TONE MARK +302F ; [.0000.00FB.0002] # HANGUL DOUBLE DOT TONE MARK +20D0 ; [.0000.00FC.0002] # COMBINING LEFT HARPOON ABOVE +20D1 ; [.0000.00FD.0002] # COMBINING RIGHT HARPOON ABOVE +20D2 ; [.0000.00FE.0002] # COMBINING LONG VERTICAL LINE OVERLAY +20D3 ; [.0000.00FE.0002] # COMBINING SHORT VERTICAL LINE OVERLAY +20D4 ; [.0000.00FF.0002] # COMBINING ANTICLOCKWISE ARROW ABOVE +20D5 ; [.0000.0100.0002] # COMBINING CLOCKWISE ARROW ABOVE +20D6 ; [.0000.0101.0002] # COMBINING LEFT ARROW ABOVE +20D7 ; [.0000.0102.0002] # COMBINING RIGHT ARROW ABOVE +20DB ; [.0000.0103.0002] # COMBINING THREE DOTS ABOVE +20DC ; [.0000.0104.0002] # COMBINING FOUR DOTS ABOVE +20E1 ; [.0000.0105.0002] # COMBINING LEFT RIGHT ARROW ABOVE +20E6 ; [.0000.0106.0002] # COMBINING DOUBLE VERTICAL STROKE OVERLAY +20E7 ; [.0000.0107.0002] # COMBINING ANNUITY SYMBOL +20E8 ; [.0000.0108.0002] # COMBINING TRIPLE UNDERDOT +20E9 ; [.0000.0109.0002] # COMBINING WIDE BRIDGE ABOVE +101FD ; [.0000.010A.0002] # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +02D0 ; [.1B74.0020.0002] # MODIFIER LETTER TRIANGULAR COLON +02D1 ; [.1B75.0020.0002] # MODIFIER LETTER HALF TRIANGULAR COLON +0971 ; [.1B76.0020.0002] # DEVANAGARI SIGN HIGH SPACING DOT +0E46 ; [.1B77.0020.0002] # THAI CHARACTER MAIYAMOK +0EC6 ; [.1B78.0020.0002] # LAO KO LA +17D7 ; [.1B79.0020.0002] # KHMER SIGN LEK TOO +1AA7 ; [.1B7A.0020.0002] # TAI THAM SIGN MAI YAMOK +A9CF ; [.1B7B.0020.0002] # JAVANESE PANGRANGKEP +A9E6 ; [.1B7C.0020.0002] # MYANMAR MODIFIER LETTER SHAN REDUPLICATION +AA70 ; [.1B7D.0020.0002] # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AADD ; [.1B7E.0020.0002] # TAI VIET SYMBOL SAM +AAF3 ; [.1B7F.0020.0002] # MEETEI MAYEK SYLLABLE REPETITION MARK +AAF4 ; [.1B80.0020.0002] # MEETEI MAYEK WORD REPETITION MARK +16B42 ; [.1B81.0020.0002] # PAHAWH HMONG SIGN VOS NRUA +16B43 ; [.1B82.0020.0002] # PAHAWH HMONG SIGN IB YAM +3005 ; [.1B83.0020.0002] # IDEOGRAPHIC ITERATION MARK +303B ; [.1B84.0020.0002] # VERTICAL IDEOGRAPHIC ITERATION MARK +3031 ; [.1B85.0020.0002] # VERTICAL KANA REPEAT MARK +3032 ; [.1B85.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK +3033 ; [.1B86.0020.0002] # VERTICAL KANA REPEAT MARK UPPER HALF +3034 ; [.1B86.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +3035 ; [.1B87.0020.0002] # VERTICAL KANA REPEAT MARK LOWER HALF +309D ; [.1B88.0020.0002] # HIRAGANA ITERATION MARK +309E ; [.1B88.0020.0002][.0000.0037.0002] # HIRAGANA VOICED ITERATION MARK +30FC ; [.1B89.0020.0002] # KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF70 ; [.1B89.0020.0012] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +30FD ; [.1B8A.0020.0002] # KATAKANA ITERATION MARK +30FE ; [.1B8A.0020.0002][.0000.0037.0002] # KATAKANA VOICED ITERATION MARK +00A4 ; [.1B8B.0020.0002] # CURRENCY SIGN +00A2 ; [.1B8C.0020.0002] # CENT SIGN +FFE0 ; [.1B8C.0020.0003] # FULLWIDTH CENT SIGN +0024 ; [.1B8D.0020.0002] # DOLLAR SIGN +FF04 ; [.1B8D.0020.0003] # FULLWIDTH DOLLAR SIGN +FE69 ; [.1B8D.0020.000F] # SMALL DOLLAR SIGN +00A3 ; [.1B8E.0020.0002] # POUND SIGN +FFE1 ; [.1B8E.0020.0003] # FULLWIDTH POUND SIGN +00A5 ; [.1B8F.0020.0002] # YEN SIGN +FFE5 ; [.1B8F.0020.0003] # FULLWIDTH YEN SIGN +058F ; [.1B90.0020.0002] # ARMENIAN DRAM SIGN +060B ; [.1B91.0020.0002] # AFGHANI SIGN +09F2 ; [.1B92.0020.0002] # BENGALI RUPEE MARK +09F3 ; [.1B93.0020.0002] # BENGALI RUPEE SIGN +09FB ; [.1B94.0020.0002] # BENGALI GANDA MARK +0AF1 ; [.1B95.0020.0002] # GUJARATI RUPEE SIGN +A838 ; [.1B96.0020.0002] # NORTH INDIC RUPEE MARK +0BF9 ; [.1B97.0020.0002] # TAMIL RUPEE SIGN +0E3F ; [.1B98.0020.0002] # THAI CURRENCY SYMBOL BAHT +17DB ; [.1B99.0020.0002] # KHMER CURRENCY SYMBOL RIEL +20A0 ; [.1B9A.0020.0002] # EURO-CURRENCY SIGN +20A1 ; [.1B9B.0020.0002] # COLON SIGN +20A2 ; [.1B9C.0020.0002] # CRUZEIRO SIGN +20A3 ; [.1B9D.0020.0002] # FRENCH FRANC SIGN +20A4 ; [.1B9E.0020.0002] # LIRA SIGN +20A5 ; [.1B9F.0020.0002] # MILL SIGN +20A6 ; [.1BA0.0020.0002] # NAIRA SIGN +20A7 ; [.1BA1.0020.0002] # PESETA SIGN +20A9 ; [.1BA2.0020.0002] # WON SIGN +FFE6 ; [.1BA2.0020.0003] # FULLWIDTH WON SIGN +20AA ; [.1BA3.0020.0002] # NEW SHEQEL SIGN +20AB ; [.1BA4.0020.0002] # DONG SIGN +20AC ; [.1BA5.0020.0002] # EURO SIGN +20AD ; [.1BA6.0020.0002] # KIP SIGN +20AE ; [.1BA7.0020.0002] # TUGRIK SIGN +20AF ; [.1BA8.0020.0002] # DRACHMA SIGN +20B0 ; [.1BA9.0020.0002] # GERMAN PENNY SIGN +20B1 ; [.1BAA.0020.0002] # PESO SIGN +20B2 ; [.1BAB.0020.0002] # GUARANI SIGN +20B3 ; [.1BAC.0020.0002] # AUSTRAL SIGN +20B4 ; [.1BAD.0020.0002] # HRYVNIA SIGN +20B5 ; [.1BAE.0020.0002] # CEDI SIGN +20B6 ; [.1BAF.0020.0002] # LIVRE TOURNOIS SIGN +20B7 ; [.1BB0.0020.0002] # SPESMILO SIGN +20B8 ; [.1BB1.0020.0002] # TENGE SIGN +20B9 ; [.1BB2.0020.0002] # INDIAN RUPEE SIGN +20BA ; [.1BB3.0020.0002] # TURKISH LIRA SIGN +20BB ; [.1BB4.0020.0002] # NORDIC MARK SIGN +20BC ; [.1BB5.0020.0002] # MANAT SIGN +20BD ; [.1BB6.0020.0002] # RUBLE SIGN +20BE ; [.1BB7.0020.0002] # LARI SIGN +0030 ; [.1BB8.0020.0002] # DIGIT ZERO +0660 ; [.1BB8.0020.0002] # ARABIC-INDIC DIGIT ZERO +06F0 ; [.1BB8.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ZERO +07C0 ; [.1BB8.0020.0002] # NKO DIGIT ZERO +0966 ; [.1BB8.0020.0002] # DEVANAGARI DIGIT ZERO +09E6 ; [.1BB8.0020.0002] # BENGALI DIGIT ZERO +0A66 ; [.1BB8.0020.0002] # GURMUKHI DIGIT ZERO +0AE6 ; [.1BB8.0020.0002] # GUJARATI DIGIT ZERO +0B66 ; [.1BB8.0020.0002] # ORIYA DIGIT ZERO +0BE6 ; [.1BB8.0020.0002] # TAMIL DIGIT ZERO +0C66 ; [.1BB8.0020.0002] # TELUGU DIGIT ZERO +0C78 ; [.1BB8.0020.0002] # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR +0CE6 ; [.1BB8.0020.0002] # KANNADA DIGIT ZERO +0D66 ; [.1BB8.0020.0002] # MALAYALAM DIGIT ZERO +0DE6 ; [.1BB8.0020.0002] # SINHALA LITH DIGIT ZERO +0E50 ; [.1BB8.0020.0002] # THAI DIGIT ZERO +0ED0 ; [.1BB8.0020.0002] # LAO DIGIT ZERO +0F20 ; [.1BB8.0020.0002] # TIBETAN DIGIT ZERO +1040 ; [.1BB8.0020.0002] # MYANMAR DIGIT ZERO +1090 ; [.1BB8.0020.0002] # MYANMAR SHAN DIGIT ZERO +17E0 ; [.1BB8.0020.0002] # KHMER DIGIT ZERO +17F0 ; [.1BB8.0020.0002] # KHMER SYMBOL LEK ATTAK SON +1810 ; [.1BB8.0020.0002] # MONGOLIAN DIGIT ZERO +1946 ; [.1BB8.0020.0002] # LIMBU DIGIT ZERO +19D0 ; [.1BB8.0020.0002] # NEW TAI LUE DIGIT ZERO +1A80 ; [.1BB8.0020.0002] # TAI THAM HORA DIGIT ZERO +1A90 ; [.1BB8.0020.0002] # TAI THAM THAM DIGIT ZERO +1B50 ; [.1BB8.0020.0002] # BALINESE DIGIT ZERO +1BB0 ; [.1BB8.0020.0002] # SUNDANESE DIGIT ZERO +1C40 ; [.1BB8.0020.0002] # LEPCHA DIGIT ZERO +1C50 ; [.1BB8.0020.0002] # OL CHIKI DIGIT ZERO +3007 ; [.1BB8.0020.0002] # IDEOGRAPHIC NUMBER ZERO +A620 ; [.1BB8.0020.0002] # VAI DIGIT ZERO +A8D0 ; [.1BB8.0020.0002] # SAURASHTRA DIGIT ZERO +A900 ; [.1BB8.0020.0002] # KAYAH LI DIGIT ZERO +A9D0 ; [.1BB8.0020.0002] # JAVANESE DIGIT ZERO +A9F0 ; [.1BB8.0020.0002] # MYANMAR TAI LAING DIGIT ZERO +AA50 ; [.1BB8.0020.0002] # CHAM DIGIT ZERO +ABF0 ; [.1BB8.0020.0002] # MEETEI MAYEK DIGIT ZERO +1018A ; [.1BB8.0020.0002] # GREEK ZERO SIGN +104A0 ; [.1BB8.0020.0002] # OSMANYA DIGIT ZERO +11066 ; [.1BB8.0020.0002] # BRAHMI DIGIT ZERO +110F0 ; [.1BB8.0020.0002] # SORA SOMPENG DIGIT ZERO +11136 ; [.1BB8.0020.0002] # CHAKMA DIGIT ZERO +111D0 ; [.1BB8.0020.0002] # SHARADA DIGIT ZERO +112F0 ; [.1BB8.0020.0002] # KHUDAWADI DIGIT ZERO +114D0 ; [.1BB8.0020.0002] # TIRHUTA DIGIT ZERO +11650 ; [.1BB8.0020.0002] # MODI DIGIT ZERO +116C0 ; [.1BB8.0020.0002] # TAKRI DIGIT ZERO +11730 ; [.1BB8.0020.0002] # AHOM DIGIT ZERO +118E0 ; [.1BB8.0020.0002] # WARANG CITI DIGIT ZERO +16A60 ; [.1BB8.0020.0002] # MRO DIGIT ZERO +16B50 ; [.1BB8.0020.0002] # PAHAWH HMONG DIGIT ZERO +FF10 ; [.1BB8.0020.0003] # FULLWIDTH DIGIT ZERO +0F33 ; [.1BB8.0020.0004] # TIBETAN DIGIT HALF ZERO +1F100 ; [.1BB8.0020.0004][*0274.0020.0004] # DIGIT ZERO FULL STOP +1F101 ; [.1BB8.0020.0004][*0221.0020.0004] # DIGIT ZERO COMMA +1D7CE ; [.1BB8.0020.0005] # MATHEMATICAL BOLD DIGIT ZERO +1D7D8 ; [.1BB8.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7E2 ; [.1BB8.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7EC ; [.1BB8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7F6 ; [.1BB8.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ZERO +24EA ; [.1BB8.0020.0006] # CIRCLED DIGIT ZERO +24FF ; [.1BB8.0020.0006] # NEGATIVE CIRCLED DIGIT ZERO +1F10B ; [.1BB8.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ZERO +1F10C ; [.1BB8.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +2070 ; [.1BB8.0020.0014] # SUPERSCRIPT ZERO +2080 ; [.1BB8.0020.0015] # SUBSCRIPT ZERO +2189 ; [.1BB8.0020.001E][*0606.0020.001E][.1BBB.0020.001E] # VULGAR FRACTION ZERO THIRDS +3358 ; [.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +0031 ; [.1BB9.0020.0002] # DIGIT ONE +0661 ; [.1BB9.0020.0002] # ARABIC-INDIC DIGIT ONE +06F1 ; [.1BB9.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ONE +07C1 ; [.1BB9.0020.0002] # NKO DIGIT ONE +0967 ; [.1BB9.0020.0002] # DEVANAGARI DIGIT ONE +09E7 ; [.1BB9.0020.0002] # BENGALI DIGIT ONE +0A67 ; [.1BB9.0020.0002] # GURMUKHI DIGIT ONE +0AE7 ; [.1BB9.0020.0002] # GUJARATI DIGIT ONE +0B67 ; [.1BB9.0020.0002] # ORIYA DIGIT ONE +0BE7 ; [.1BB9.0020.0002] # TAMIL DIGIT ONE +0C67 ; [.1BB9.0020.0002] # TELUGU DIGIT ONE +0C79 ; [.1BB9.0020.0002] # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR +0C7C ; [.1BB9.0020.0002] # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR +0CE7 ; [.1BB9.0020.0002] # KANNADA DIGIT ONE +0D67 ; [.1BB9.0020.0002] # MALAYALAM DIGIT ONE +0DE7 ; [.1BB9.0020.0002] # SINHALA LITH DIGIT ONE +0E51 ; [.1BB9.0020.0002] # THAI DIGIT ONE +0ED1 ; [.1BB9.0020.0002] # LAO DIGIT ONE +0F21 ; [.1BB9.0020.0002] # TIBETAN DIGIT ONE +1041 ; [.1BB9.0020.0002] # MYANMAR DIGIT ONE +1091 ; [.1BB9.0020.0002] # MYANMAR SHAN DIGIT ONE +1369 ; [.1BB9.0020.0002] # ETHIOPIC DIGIT ONE +17E1 ; [.1BB9.0020.0002] # KHMER DIGIT ONE +17F1 ; [.1BB9.0020.0002] # KHMER SYMBOL LEK ATTAK MUOY +1811 ; [.1BB9.0020.0002] # MONGOLIAN DIGIT ONE +1947 ; [.1BB9.0020.0002] # LIMBU DIGIT ONE +19D1 ; [.1BB9.0020.0002] # NEW TAI LUE DIGIT ONE +19DA ; [.1BB9.0020.0002] # NEW TAI LUE THAM DIGIT ONE +1A81 ; [.1BB9.0020.0002] # TAI THAM HORA DIGIT ONE +1A91 ; [.1BB9.0020.0002] # TAI THAM THAM DIGIT ONE +1B51 ; [.1BB9.0020.0002] # BALINESE DIGIT ONE +1BB1 ; [.1BB9.0020.0002] # SUNDANESE DIGIT ONE +1C41 ; [.1BB9.0020.0002] # LEPCHA DIGIT ONE +1C51 ; [.1BB9.0020.0002] # OL CHIKI DIGIT ONE +3021 ; [.1BB9.0020.0002] # HANGZHOU NUMERAL ONE +A621 ; [.1BB9.0020.0002] # VAI DIGIT ONE +A8D1 ; [.1BB9.0020.0002] # SAURASHTRA DIGIT ONE +A901 ; [.1BB9.0020.0002] # KAYAH LI DIGIT ONE +A9D1 ; [.1BB9.0020.0002] # JAVANESE DIGIT ONE +A9F1 ; [.1BB9.0020.0002] # MYANMAR TAI LAING DIGIT ONE +AA51 ; [.1BB9.0020.0002] # CHAM DIGIT ONE +ABF1 ; [.1BB9.0020.0002] # MEETEI MAYEK DIGIT ONE +10107 ; [.1BB9.0020.0002] # AEGEAN NUMBER ONE +10142 ; [.1BB9.0020.0002] # GREEK ACROPHONIC ATTIC ONE DRACHMA +10158 ; [.1BB9.0020.0002] # GREEK ACROPHONIC HERAEUM ONE PLETHRON +10159 ; [.1BB9.0020.0002] # GREEK ACROPHONIC THESPIAN ONE +1015A ; [.1BB9.0020.0002] # GREEK ACROPHONIC HERMIONIAN ONE +102E1 ; [.1BB9.0020.0002] # COPTIC EPACT DIGIT ONE +10320 ; [.1BB9.0020.0002] # OLD ITALIC NUMERAL ONE +103D1 ; [.1BB9.0020.0002] # OLD PERSIAN NUMBER ONE +104A1 ; [.1BB9.0020.0002] # OSMANYA DIGIT ONE +10858 ; [.1BB9.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE +10879 ; [.1BB9.0020.0002] # PALMYRENE NUMBER ONE +108A7 ; [.1BB9.0020.0002] # NABATAEAN NUMBER ONE +108FB ; [.1BB9.0020.0002] # HATRAN NUMBER ONE +10916 ; [.1BB9.0020.0002] # PHOENICIAN NUMBER ONE +109C0 ; [.1BB9.0020.0002] # MEROITIC CURSIVE NUMBER ONE +10A40 ; [.1BB9.0020.0002] # KHAROSHTHI DIGIT ONE +10A7D ; [.1BB9.0020.0002] # OLD SOUTH ARABIAN NUMBER ONE +10A9D ; [.1BB9.0020.0002] # OLD NORTH ARABIAN NUMBER ONE +10AEB ; [.1BB9.0020.0002] # MANICHAEAN NUMBER ONE +10B58 ; [.1BB9.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE +10B78 ; [.1BB9.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE +10BA9 ; [.1BB9.0020.0002] # PSALTER PAHLAVI NUMBER ONE +10CFA ; [.1BB9.0020.0002] # OLD HUNGARIAN NUMBER ONE +10E60 ; [.1BB9.0020.0002] # RUMI DIGIT ONE +11052 ; [.1BB9.0020.0002] # BRAHMI NUMBER ONE +11067 ; [.1BB9.0020.0002] # BRAHMI DIGIT ONE +110F1 ; [.1BB9.0020.0002] # SORA SOMPENG DIGIT ONE +11137 ; [.1BB9.0020.0002] # CHAKMA DIGIT ONE +111D1 ; [.1BB9.0020.0002] # SHARADA DIGIT ONE +111E1 ; [.1BB9.0020.0002] # SINHALA ARCHAIC DIGIT ONE +112F1 ; [.1BB9.0020.0002] # KHUDAWADI DIGIT ONE +114D1 ; [.1BB9.0020.0002] # TIRHUTA DIGIT ONE +11651 ; [.1BB9.0020.0002] # MODI DIGIT ONE +116C1 ; [.1BB9.0020.0002] # TAKRI DIGIT ONE +11731 ; [.1BB9.0020.0002] # AHOM DIGIT ONE +118E1 ; [.1BB9.0020.0002] # WARANG CITI DIGIT ONE +12415 ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESH2 +1241E ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESHU +1242C ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE SHARU +12434 ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BURU +1244F ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BAN2 +12458 ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE ESHE3 +16A61 ; [.1BB9.0020.0002] # MRO DIGIT ONE +16B51 ; [.1BB9.0020.0002] # PAHAWH HMONG DIGIT ONE +1D360 ; [.1BB9.0020.0002] # COUNTING ROD UNIT DIGIT ONE +1E8C7 ; [.1BB9.0020.0002] # MENDE KIKAKUI DIGIT ONE +FF11 ; [.1BB9.0020.0003] # FULLWIDTH DIGIT ONE +0F2A ; [.1BB9.0020.0004] # TIBETAN DIGIT HALF ONE +2474 ; [*0310.0020.0004][.1BB9.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT ONE +2488 ; [.1BB9.0020.0004][*0274.0020.0004] # DIGIT ONE FULL STOP +1F102 ; [.1BB9.0020.0004][*0221.0020.0004] # DIGIT ONE COMMA +1D7CF ; [.1BB9.0020.0005] # MATHEMATICAL BOLD DIGIT ONE +1D7D9 ; [.1BB9.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7E3 ; [.1BB9.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ONE +1D7ED ; [.1BB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7F7 ; [.1BB9.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ONE +2460 ; [.1BB9.0020.0006] # CIRCLED DIGIT ONE +24F5 ; [.1BB9.0020.0006] # DOUBLE CIRCLED DIGIT ONE +2776 ; [.1BB9.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT ONE +2780 ; [.1BB9.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE +278A ; [.1BB9.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +00B9 ; [.1BB9.0020.0014] # SUPERSCRIPT ONE +2081 ; [.1BB9.0020.0015] # SUBSCRIPT ONE +215F ; [.1BB9.0020.001E][*0606.0020.001E] # FRACTION NUMERATOR ONE +247D ; [*0310.0020.0004][.1BB9.0020.0004][.1BB8.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER TEN +2491 ; [.1BB9.0020.0004][.1BB8.0020.0004][*0274.0020.0004] # NUMBER TEN FULL STOP +2469 ; [.1BB9.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER TEN +24FE ; [.1BB9.0020.0006][.1BB8.0020.0006] # DOUBLE CIRCLED NUMBER TEN +277F ; [.1BB9.0020.0006][.1BB8.0020.0006] # DINGBAT NEGATIVE CIRCLED NUMBER TEN +2789 ; [.1BB9.0020.0006][.1BB8.0020.0006] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN +2793 ; [.1BB9.0020.0006][.1BB8.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +3248 ; [.1BB9.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER TEN ON BLACK SQUARE +33E9 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +32C9 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +3362 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +247E ; [*0310.0020.0004][.1BB9.0020.0004][.1BB9.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER ELEVEN +2492 ; [.1BB9.0020.0004][.1BB9.0020.0004][*0274.0020.0004] # NUMBER ELEVEN FULL STOP +246A ; [.1BB9.0020.0006][.1BB9.0020.0006] # CIRCLED NUMBER ELEVEN +24EB ; [.1BB9.0020.0006][.1BB9.0020.0006] # NEGATIVE CIRCLED NUMBER ELEVEN +2152 ; [.1BB9.0020.001E][*0606.0020.001E][.1BB9.0020.001E][.1BB8.0020.001E] # VULGAR FRACTION ONE TENTH +33EA ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +32CA ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +3363 ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +247F ; [*0310.0020.0004][.1BB9.0020.0004][.1BBA.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER TWELVE +2493 ; [.1BB9.0020.0004][.1BBA.0020.0004][*0274.0020.0004] # NUMBER TWELVE FULL STOP +246B ; [.1BB9.0020.0006][.1BBA.0020.0006] # CIRCLED NUMBER TWELVE +24EC ; [.1BB9.0020.0006][.1BBA.0020.0006] # NEGATIVE CIRCLED NUMBER TWELVE +00BD ; [.1BB9.0020.001E][*0606.0020.001E][.1BBA.0020.001E] # VULGAR FRACTION ONE HALF +33EB ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +32CB ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +3364 ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +2480 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBB.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER THIRTEEN +2494 ; [.1BB9.0020.0004][.1BBB.0020.0004][*0274.0020.0004] # NUMBER THIRTEEN FULL STOP +246C ; [.1BB9.0020.0006][.1BBB.0020.0006] # CIRCLED NUMBER THIRTEEN +24ED ; [.1BB9.0020.0006][.1BBB.0020.0006] # NEGATIVE CIRCLED NUMBER THIRTEEN +2153 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBB.0020.001E] # VULGAR FRACTION ONE THIRD +33EC ; [.1BB9.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +3365 ; [.1BB9.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +2481 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBC.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER FOURTEEN +2495 ; [.1BB9.0020.0004][.1BBC.0020.0004][*0274.0020.0004] # NUMBER FOURTEEN FULL STOP +246D ; [.1BB9.0020.0006][.1BBC.0020.0006] # CIRCLED NUMBER FOURTEEN +24EE ; [.1BB9.0020.0006][.1BBC.0020.0006] # NEGATIVE CIRCLED NUMBER FOURTEEN +00BC ; [.1BB9.0020.001E][*0606.0020.001E][.1BBC.0020.001E] # VULGAR FRACTION ONE QUARTER +33ED ; [.1BB9.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +3366 ; [.1BB9.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +2482 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBD.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER FIFTEEN +2496 ; [.1BB9.0020.0004][.1BBD.0020.0004][*0274.0020.0004] # NUMBER FIFTEEN FULL STOP +246E ; [.1BB9.0020.0006][.1BBD.0020.0006] # CIRCLED NUMBER FIFTEEN +24EF ; [.1BB9.0020.0006][.1BBD.0020.0006] # NEGATIVE CIRCLED NUMBER FIFTEEN +2155 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBD.0020.001E] # VULGAR FRACTION ONE FIFTH +33EE ; [.1BB9.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +3367 ; [.1BB9.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +2483 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBE.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER SIXTEEN +2497 ; [.1BB9.0020.0004][.1BBE.0020.0004][*0274.0020.0004] # NUMBER SIXTEEN FULL STOP +246F ; [.1BB9.0020.0006][.1BBE.0020.0006] # CIRCLED NUMBER SIXTEEN +24F0 ; [.1BB9.0020.0006][.1BBE.0020.0006] # NEGATIVE CIRCLED NUMBER SIXTEEN +2159 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBE.0020.001E] # VULGAR FRACTION ONE SIXTH +33EF ; [.1BB9.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +3368 ; [.1BB9.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +2484 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBF.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER SEVENTEEN +2498 ; [.1BB9.0020.0004][.1BBF.0020.0004][*0274.0020.0004] # NUMBER SEVENTEEN FULL STOP +2470 ; [.1BB9.0020.0006][.1BBF.0020.0006] # CIRCLED NUMBER SEVENTEEN +24F1 ; [.1BB9.0020.0006][.1BBF.0020.0006] # NEGATIVE CIRCLED NUMBER SEVENTEEN +2150 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBF.0020.001E] # VULGAR FRACTION ONE SEVENTH +33F0 ; [.1BB9.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +3369 ; [.1BB9.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +2485 ; [*0310.0020.0004][.1BB9.0020.0004][.1BC0.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER EIGHTEEN +2499 ; [.1BB9.0020.0004][.1BC0.0020.0004][*0274.0020.0004] # NUMBER EIGHTEEN FULL STOP +2471 ; [.1BB9.0020.0006][.1BC0.0020.0006] # CIRCLED NUMBER EIGHTEEN +24F2 ; [.1BB9.0020.0006][.1BC0.0020.0006] # NEGATIVE CIRCLED NUMBER EIGHTEEN +215B ; [.1BB9.0020.001E][*0606.0020.001E][.1BC0.0020.001E] # VULGAR FRACTION ONE EIGHTH +33F1 ; [.1BB9.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +336A ; [.1BB9.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +2486 ; [*0310.0020.0004][.1BB9.0020.0004][.1BC1.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER NINETEEN +249A ; [.1BB9.0020.0004][.1BC1.0020.0004][*0274.0020.0004] # NUMBER NINETEEN FULL STOP +2472 ; [.1BB9.0020.0006][.1BC1.0020.0006] # CIRCLED NUMBER NINETEEN +24F3 ; [.1BB9.0020.0006][.1BC1.0020.0006] # NEGATIVE CIRCLED NUMBER NINETEEN +2151 ; [.1BB9.0020.001E][*0606.0020.001E][.1BC1.0020.001E] # VULGAR FRACTION ONE NINTH +33F2 ; [.1BB9.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +336B ; [.1BB9.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +33E0 ; [.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +32C0 ; [.1BB9.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +3359 ; [.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +0032 ; [.1BBA.0020.0002] # DIGIT TWO +0662 ; [.1BBA.0020.0002] # ARABIC-INDIC DIGIT TWO +06F2 ; [.1BBA.0020.0002] # EXTENDED ARABIC-INDIC DIGIT TWO +07C2 ; [.1BBA.0020.0002] # NKO DIGIT TWO +0968 ; [.1BBA.0020.0002] # DEVANAGARI DIGIT TWO +09E8 ; [.1BBA.0020.0002] # BENGALI DIGIT TWO +0A68 ; [.1BBA.0020.0002] # GURMUKHI DIGIT TWO +0AE8 ; [.1BBA.0020.0002] # GUJARATI DIGIT TWO +0B68 ; [.1BBA.0020.0002] # ORIYA DIGIT TWO +0BE8 ; [.1BBA.0020.0002] # TAMIL DIGIT TWO +0C68 ; [.1BBA.0020.0002] # TELUGU DIGIT TWO +0C7A ; [.1BBA.0020.0002] # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR +0C7D ; [.1BBA.0020.0002] # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR +0CE8 ; [.1BBA.0020.0002] # KANNADA DIGIT TWO +0D68 ; [.1BBA.0020.0002] # MALAYALAM DIGIT TWO +0DE8 ; [.1BBA.0020.0002] # SINHALA LITH DIGIT TWO +0E52 ; [.1BBA.0020.0002] # THAI DIGIT TWO +0ED2 ; [.1BBA.0020.0002] # LAO DIGIT TWO +0F22 ; [.1BBA.0020.0002] # TIBETAN DIGIT TWO +1042 ; [.1BBA.0020.0002] # MYANMAR DIGIT TWO +1092 ; [.1BBA.0020.0002] # MYANMAR SHAN DIGIT TWO +136A ; [.1BBA.0020.0002] # ETHIOPIC DIGIT TWO +17E2 ; [.1BBA.0020.0002] # KHMER DIGIT TWO +17F2 ; [.1BBA.0020.0002] # KHMER SYMBOL LEK ATTAK PII +1812 ; [.1BBA.0020.0002] # MONGOLIAN DIGIT TWO +1948 ; [.1BBA.0020.0002] # LIMBU DIGIT TWO +19D2 ; [.1BBA.0020.0002] # NEW TAI LUE DIGIT TWO +1A82 ; [.1BBA.0020.0002] # TAI THAM HORA DIGIT TWO +1A92 ; [.1BBA.0020.0002] # TAI THAM THAM DIGIT TWO +1B52 ; [.1BBA.0020.0002] # BALINESE DIGIT TWO +1BB2 ; [.1BBA.0020.0002] # SUNDANESE DIGIT TWO +1C42 ; [.1BBA.0020.0002] # LEPCHA DIGIT TWO +1C52 ; [.1BBA.0020.0002] # OL CHIKI DIGIT TWO +3022 ; [.1BBA.0020.0002] # HANGZHOU NUMERAL TWO +A622 ; [.1BBA.0020.0002] # VAI DIGIT TWO +A8D2 ; [.1BBA.0020.0002] # SAURASHTRA DIGIT TWO +A902 ; [.1BBA.0020.0002] # KAYAH LI DIGIT TWO +A9D2 ; [.1BBA.0020.0002] # JAVANESE DIGIT TWO +A9F2 ; [.1BBA.0020.0002] # MYANMAR TAI LAING DIGIT TWO +AA52 ; [.1BBA.0020.0002] # CHAM DIGIT TWO +ABF2 ; [.1BBA.0020.0002] # MEETEI MAYEK DIGIT TWO +10108 ; [.1BBA.0020.0002] # AEGEAN NUMBER TWO +1015B ; [.1BBA.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO +1015C ; [.1BBA.0020.0002] # GREEK ACROPHONIC THESPIAN TWO +1015D ; [.1BBA.0020.0002] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS +1015E ; [.1BBA.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS +102E2 ; [.1BBA.0020.0002] # COPTIC EPACT DIGIT TWO +103D2 ; [.1BBA.0020.0002] # OLD PERSIAN NUMBER TWO +104A2 ; [.1BBA.0020.0002] # OSMANYA DIGIT TWO +10859 ; [.1BBA.0020.0002] # IMPERIAL ARAMAIC NUMBER TWO +1087A ; [.1BBA.0020.0002] # PALMYRENE NUMBER TWO +108A8 ; [.1BBA.0020.0002] # NABATAEAN NUMBER TWO +1091A ; [.1BBA.0020.0002] # PHOENICIAN NUMBER TWO +109C1 ; [.1BBA.0020.0002] # MEROITIC CURSIVE NUMBER TWO +10A41 ; [.1BBA.0020.0002] # KHAROSHTHI DIGIT TWO +10B59 ; [.1BBA.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWO +10B79 ; [.1BBA.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWO +10BAA ; [.1BBA.0020.0002] # PSALTER PAHLAVI NUMBER TWO +10E61 ; [.1BBA.0020.0002] # RUMI DIGIT TWO +11053 ; [.1BBA.0020.0002] # BRAHMI NUMBER TWO +11068 ; [.1BBA.0020.0002] # BRAHMI DIGIT TWO +110F2 ; [.1BBA.0020.0002] # SORA SOMPENG DIGIT TWO +11138 ; [.1BBA.0020.0002] # CHAKMA DIGIT TWO +111D2 ; [.1BBA.0020.0002] # SHARADA DIGIT TWO +111E2 ; [.1BBA.0020.0002] # SINHALA ARCHAIC DIGIT TWO +112F2 ; [.1BBA.0020.0002] # KHUDAWADI DIGIT TWO +114D2 ; [.1BBA.0020.0002] # TIRHUTA DIGIT TWO +11652 ; [.1BBA.0020.0002] # MODI DIGIT TWO +116C2 ; [.1BBA.0020.0002] # TAKRI DIGIT TWO +11732 ; [.1BBA.0020.0002] # AHOM DIGIT TWO +118E2 ; [.1BBA.0020.0002] # WARANG CITI DIGIT TWO +12400 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH +12416 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESH2 +1241F ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESHU +12423 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHAR2 +1242D ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHARU +12435 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BURU +1244A ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH TENU +12450 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BAN2 +12456 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAMIN +12459 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ESHE3 +16A62 ; [.1BBA.0020.0002] # MRO DIGIT TWO +16B52 ; [.1BBA.0020.0002] # PAHAWH HMONG DIGIT TWO +1D361 ; [.1BBA.0020.0002] # COUNTING ROD UNIT DIGIT TWO +1E8C8 ; [.1BBA.0020.0002] # MENDE KIKAKUI DIGIT TWO +FF12 ; [.1BBA.0020.0003] # FULLWIDTH DIGIT TWO +0F2B ; [.1BBA.0020.0004] # TIBETAN DIGIT HALF TWO +2475 ; [*0310.0020.0004][.1BBA.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT TWO +2489 ; [.1BBA.0020.0004][*0274.0020.0004] # DIGIT TWO FULL STOP +1F103 ; [.1BBA.0020.0004][*0221.0020.0004] # DIGIT TWO COMMA +1D7D0 ; [.1BBA.0020.0005] # MATHEMATICAL BOLD DIGIT TWO +1D7DA ; [.1BBA.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7E4 ; [.1BBA.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT TWO +1D7EE ; [.1BBA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7F8 ; [.1BBA.0020.0005] # MATHEMATICAL MONOSPACE DIGIT TWO +2461 ; [.1BBA.0020.0006] # CIRCLED DIGIT TWO +24F6 ; [.1BBA.0020.0006] # DOUBLE CIRCLED DIGIT TWO +2777 ; [.1BBA.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT TWO +2781 ; [.1BBA.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO +278B ; [.1BBA.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +00B2 ; [.1BBA.0020.0014] # SUPERSCRIPT TWO +2082 ; [.1BBA.0020.0015] # SUBSCRIPT TWO +2487 ; [*0310.0020.0004][.1BBA.0020.0004][.1BB8.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER TWENTY +249B ; [.1BBA.0020.0004][.1BB8.0020.0004][*0274.0020.0004] # NUMBER TWENTY FULL STOP +2473 ; [.1BBA.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER TWENTY +24F4 ; [.1BBA.0020.0006][.1BB8.0020.0006] # NEGATIVE CIRCLED NUMBER TWENTY +3249 ; [.1BBA.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER TWENTY ON BLACK SQUARE +33F3 ; [.1BBA.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +336C ; [.1BBA.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +3251 ; [.1BBA.0020.0006][.1BB9.0020.0006] # CIRCLED NUMBER TWENTY ONE +33F4 ; [.1BBA.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +336D ; [.1BBA.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +3252 ; [.1BBA.0020.0006][.1BBA.0020.0006] # CIRCLED NUMBER TWENTY TWO +33F5 ; [.1BBA.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +336E ; [.1BBA.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +3253 ; [.1BBA.0020.0006][.1BBB.0020.0006] # CIRCLED NUMBER TWENTY THREE +2154 ; [.1BBA.0020.001E][*0606.0020.001E][.1BBB.0020.001E] # VULGAR FRACTION TWO THIRDS +33F6 ; [.1BBA.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +336F ; [.1BBA.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3254 ; [.1BBA.0020.0006][.1BBC.0020.0006] # CIRCLED NUMBER TWENTY FOUR +33F7 ; [.1BBA.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +3370 ; [.1BBA.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3255 ; [.1BBA.0020.0006][.1BBD.0020.0006] # CIRCLED NUMBER TWENTY FIVE +2156 ; [.1BBA.0020.001E][*0606.0020.001E][.1BBD.0020.001E] # VULGAR FRACTION TWO FIFTHS +33F8 ; [.1BBA.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +3256 ; [.1BBA.0020.0006][.1BBE.0020.0006] # CIRCLED NUMBER TWENTY SIX +33F9 ; [.1BBA.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +3257 ; [.1BBA.0020.0006][.1BBF.0020.0006] # CIRCLED NUMBER TWENTY SEVEN +33FA ; [.1BBA.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +3258 ; [.1BBA.0020.0006][.1BC0.0020.0006] # CIRCLED NUMBER TWENTY EIGHT +33FB ; [.1BBA.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +3259 ; [.1BBA.0020.0006][.1BC1.0020.0006] # CIRCLED NUMBER TWENTY NINE +33FC ; [.1BBA.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +33E1 ; [.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +32C1 ; [.1BBA.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +335A ; [.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +0033 ; [.1BBB.0020.0002] # DIGIT THREE +0663 ; [.1BBB.0020.0002] # ARABIC-INDIC DIGIT THREE +06F3 ; [.1BBB.0020.0002] # EXTENDED ARABIC-INDIC DIGIT THREE +07C3 ; [.1BBB.0020.0002] # NKO DIGIT THREE +0969 ; [.1BBB.0020.0002] # DEVANAGARI DIGIT THREE +09E9 ; [.1BBB.0020.0002] # BENGALI DIGIT THREE +0A69 ; [.1BBB.0020.0002] # GURMUKHI DIGIT THREE +0AE9 ; [.1BBB.0020.0002] # GUJARATI DIGIT THREE +0B69 ; [.1BBB.0020.0002] # ORIYA DIGIT THREE +0BE9 ; [.1BBB.0020.0002] # TAMIL DIGIT THREE +0C69 ; [.1BBB.0020.0002] # TELUGU DIGIT THREE +0C7B ; [.1BBB.0020.0002] # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR +0C7E ; [.1BBB.0020.0002] # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0CE9 ; [.1BBB.0020.0002] # KANNADA DIGIT THREE +0D69 ; [.1BBB.0020.0002] # MALAYALAM DIGIT THREE +0DE9 ; [.1BBB.0020.0002] # SINHALA LITH DIGIT THREE +0E53 ; [.1BBB.0020.0002] # THAI DIGIT THREE +0ED3 ; [.1BBB.0020.0002] # LAO DIGIT THREE +0F23 ; [.1BBB.0020.0002] # TIBETAN DIGIT THREE +1043 ; [.1BBB.0020.0002] # MYANMAR DIGIT THREE +1093 ; [.1BBB.0020.0002] # MYANMAR SHAN DIGIT THREE +136B ; [.1BBB.0020.0002] # ETHIOPIC DIGIT THREE +17E3 ; [.1BBB.0020.0002] # KHMER DIGIT THREE +17F3 ; [.1BBB.0020.0002] # KHMER SYMBOL LEK ATTAK BEI +1813 ; [.1BBB.0020.0002] # MONGOLIAN DIGIT THREE +1949 ; [.1BBB.0020.0002] # LIMBU DIGIT THREE +19D3 ; [.1BBB.0020.0002] # NEW TAI LUE DIGIT THREE +1A83 ; [.1BBB.0020.0002] # TAI THAM HORA DIGIT THREE +1A93 ; [.1BBB.0020.0002] # TAI THAM THAM DIGIT THREE +1B53 ; [.1BBB.0020.0002] # BALINESE DIGIT THREE +1BB3 ; [.1BBB.0020.0002] # SUNDANESE DIGIT THREE +1C43 ; [.1BBB.0020.0002] # LEPCHA DIGIT THREE +1C53 ; [.1BBB.0020.0002] # OL CHIKI DIGIT THREE +3023 ; [.1BBB.0020.0002] # HANGZHOU NUMERAL THREE +A623 ; [.1BBB.0020.0002] # VAI DIGIT THREE +A8D3 ; [.1BBB.0020.0002] # SAURASHTRA DIGIT THREE +A903 ; [.1BBB.0020.0002] # KAYAH LI DIGIT THREE +A9D3 ; [.1BBB.0020.0002] # JAVANESE DIGIT THREE +A9F3 ; [.1BBB.0020.0002] # MYANMAR TAI LAING DIGIT THREE +AA53 ; [.1BBB.0020.0002] # CHAM DIGIT THREE +ABF3 ; [.1BBB.0020.0002] # MEETEI MAYEK DIGIT THREE +10109 ; [.1BBB.0020.0002] # AEGEAN NUMBER THREE +102E3 ; [.1BBB.0020.0002] # COPTIC EPACT DIGIT THREE +104A3 ; [.1BBB.0020.0002] # OSMANYA DIGIT THREE +1085A ; [.1BBB.0020.0002] # IMPERIAL ARAMAIC NUMBER THREE +1087B ; [.1BBB.0020.0002] # PALMYRENE NUMBER THREE +108A9 ; [.1BBB.0020.0002] # NABATAEAN NUMBER THREE +1091B ; [.1BBB.0020.0002] # PHOENICIAN NUMBER THREE +109C2 ; [.1BBB.0020.0002] # MEROITIC CURSIVE NUMBER THREE +10A42 ; [.1BBB.0020.0002] # KHAROSHTHI DIGIT THREE +10B5A ; [.1BBB.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER THREE +10B7A ; [.1BBB.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER THREE +10BAB ; [.1BBB.0020.0002] # PSALTER PAHLAVI NUMBER THREE +10E62 ; [.1BBB.0020.0002] # RUMI DIGIT THREE +11054 ; [.1BBB.0020.0002] # BRAHMI NUMBER THREE +11069 ; [.1BBB.0020.0002] # BRAHMI DIGIT THREE +110F3 ; [.1BBB.0020.0002] # SORA SOMPENG DIGIT THREE +11139 ; [.1BBB.0020.0002] # CHAKMA DIGIT THREE +111D3 ; [.1BBB.0020.0002] # SHARADA DIGIT THREE +111E3 ; [.1BBB.0020.0002] # SINHALA ARCHAIC DIGIT THREE +112F3 ; [.1BBB.0020.0002] # KHUDAWADI DIGIT THREE +114D3 ; [.1BBB.0020.0002] # TIRHUTA DIGIT THREE +11653 ; [.1BBB.0020.0002] # MODI DIGIT THREE +116C3 ; [.1BBB.0020.0002] # TAKRI DIGIT THREE +11733 ; [.1BBB.0020.0002] # AHOM DIGIT THREE +118E3 ; [.1BBB.0020.0002] # WARANG CITI DIGIT THREE +12401 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH +12408 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE DISH +12417 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESH2 +12420 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESHU +12424 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 +12425 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM +1242E ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU +1242F ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM +12436 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU +12437 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM +1243A ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16 +1243B ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21 +1244B ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH TENU +12451 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BAN2 +12457 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAESH +16A63 ; [.1BBB.0020.0002] # MRO DIGIT THREE +16B53 ; [.1BBB.0020.0002] # PAHAWH HMONG DIGIT THREE +1D362 ; [.1BBB.0020.0002] # COUNTING ROD UNIT DIGIT THREE +1E8C9 ; [.1BBB.0020.0002] # MENDE KIKAKUI DIGIT THREE +FF13 ; [.1BBB.0020.0003] # FULLWIDTH DIGIT THREE +0F2C ; [.1BBB.0020.0004] # TIBETAN DIGIT HALF THREE +2476 ; [*0310.0020.0004][.1BBB.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT THREE +248A ; [.1BBB.0020.0004][*0274.0020.0004] # DIGIT THREE FULL STOP +1F104 ; [.1BBB.0020.0004][*0221.0020.0004] # DIGIT THREE COMMA +1D7D1 ; [.1BBB.0020.0005] # MATHEMATICAL BOLD DIGIT THREE +1D7DB ; [.1BBB.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7E5 ; [.1BBB.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT THREE +1D7EF ; [.1BBB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F9 ; [.1BBB.0020.0005] # MATHEMATICAL MONOSPACE DIGIT THREE +2462 ; [.1BBB.0020.0006] # CIRCLED DIGIT THREE +24F7 ; [.1BBB.0020.0006] # DOUBLE CIRCLED DIGIT THREE +2778 ; [.1BBB.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT THREE +2782 ; [.1BBB.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE +278C ; [.1BBB.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +00B3 ; [.1BBB.0020.0014] # SUPERSCRIPT THREE +2083 ; [.1BBB.0020.0015] # SUBSCRIPT THREE +324A ; [.1BBB.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER THIRTY ON BLACK SQUARE +325A ; [.1BBB.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER THIRTY +33FD ; [.1BBB.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +325B ; [.1BBB.0020.0006][.1BB9.0020.0006] # CIRCLED NUMBER THIRTY ONE +33FE ; [.1BBB.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +325C ; [.1BBB.0020.0006][.1BBA.0020.0006] # CIRCLED NUMBER THIRTY TWO +325D ; [.1BBB.0020.0006][.1BBB.0020.0006] # CIRCLED NUMBER THIRTY THREE +325E ; [.1BBB.0020.0006][.1BBC.0020.0006] # CIRCLED NUMBER THIRTY FOUR +00BE ; [.1BBB.0020.001E][*0606.0020.001E][.1BBC.0020.001E] # VULGAR FRACTION THREE QUARTERS +325F ; [.1BBB.0020.0006][.1BBD.0020.0006] # CIRCLED NUMBER THIRTY FIVE +2157 ; [.1BBB.0020.001E][*0606.0020.001E][.1BBD.0020.001E] # VULGAR FRACTION THREE FIFTHS +32B1 ; [.1BBB.0020.0006][.1BBE.0020.0006] # CIRCLED NUMBER THIRTY SIX +32B2 ; [.1BBB.0020.0006][.1BBF.0020.0006] # CIRCLED NUMBER THIRTY SEVEN +32B3 ; [.1BBB.0020.0006][.1BC0.0020.0006] # CIRCLED NUMBER THIRTY EIGHT +215C ; [.1BBB.0020.001E][*0606.0020.001E][.1BC0.0020.001E] # VULGAR FRACTION THREE EIGHTHS +32B4 ; [.1BBB.0020.0006][.1BC1.0020.0006] # CIRCLED NUMBER THIRTY NINE +33E2 ; [.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +32C2 ; [.1BBB.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +335B ; [.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +0034 ; [.1BBC.0020.0002] # DIGIT FOUR +0664 ; [.1BBC.0020.0002] # ARABIC-INDIC DIGIT FOUR +06F4 ; [.1BBC.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FOUR +07C4 ; [.1BBC.0020.0002] # NKO DIGIT FOUR +096A ; [.1BBC.0020.0002] # DEVANAGARI DIGIT FOUR +09EA ; [.1BBC.0020.0002] # BENGALI DIGIT FOUR +0A6A ; [.1BBC.0020.0002] # GURMUKHI DIGIT FOUR +0AEA ; [.1BBC.0020.0002] # GUJARATI DIGIT FOUR +0B6A ; [.1BBC.0020.0002] # ORIYA DIGIT FOUR +0BEA ; [.1BBC.0020.0002] # TAMIL DIGIT FOUR +0C6A ; [.1BBC.0020.0002] # TELUGU DIGIT FOUR +0CEA ; [.1BBC.0020.0002] # KANNADA DIGIT FOUR +0D6A ; [.1BBC.0020.0002] # MALAYALAM DIGIT FOUR +0DEA ; [.1BBC.0020.0002] # SINHALA LITH DIGIT FOUR +0E54 ; [.1BBC.0020.0002] # THAI DIGIT FOUR +0ED4 ; [.1BBC.0020.0002] # LAO DIGIT FOUR +0F24 ; [.1BBC.0020.0002] # TIBETAN DIGIT FOUR +1044 ; [.1BBC.0020.0002] # MYANMAR DIGIT FOUR +1094 ; [.1BBC.0020.0002] # MYANMAR SHAN DIGIT FOUR +136C ; [.1BBC.0020.0002] # ETHIOPIC DIGIT FOUR +17E4 ; [.1BBC.0020.0002] # KHMER DIGIT FOUR +17F4 ; [.1BBC.0020.0002] # KHMER SYMBOL LEK ATTAK BUON +1814 ; [.1BBC.0020.0002] # MONGOLIAN DIGIT FOUR +194A ; [.1BBC.0020.0002] # LIMBU DIGIT FOUR +19D4 ; [.1BBC.0020.0002] # NEW TAI LUE DIGIT FOUR +1A84 ; [.1BBC.0020.0002] # TAI THAM HORA DIGIT FOUR +1A94 ; [.1BBC.0020.0002] # TAI THAM THAM DIGIT FOUR +1B54 ; [.1BBC.0020.0002] # BALINESE DIGIT FOUR +1BB4 ; [.1BBC.0020.0002] # SUNDANESE DIGIT FOUR +1C44 ; [.1BBC.0020.0002] # LEPCHA DIGIT FOUR +1C54 ; [.1BBC.0020.0002] # OL CHIKI DIGIT FOUR +3024 ; [.1BBC.0020.0002] # HANGZHOU NUMERAL FOUR +A624 ; [.1BBC.0020.0002] # VAI DIGIT FOUR +A8D4 ; [.1BBC.0020.0002] # SAURASHTRA DIGIT FOUR +A904 ; [.1BBC.0020.0002] # KAYAH LI DIGIT FOUR +A9D4 ; [.1BBC.0020.0002] # JAVANESE DIGIT FOUR +A9F4 ; [.1BBC.0020.0002] # MYANMAR TAI LAING DIGIT FOUR +AA54 ; [.1BBC.0020.0002] # CHAM DIGIT FOUR +ABF4 ; [.1BBC.0020.0002] # MEETEI MAYEK DIGIT FOUR +1010A ; [.1BBC.0020.0002] # AEGEAN NUMBER FOUR +102E4 ; [.1BBC.0020.0002] # COPTIC EPACT DIGIT FOUR +104A4 ; [.1BBC.0020.0002] # OSMANYA DIGIT FOUR +1087C ; [.1BBC.0020.0002] # PALMYRENE NUMBER FOUR +108AA ; [.1BBC.0020.0002] # NABATAEAN NUMBER FOUR +108AB ; [.1BBC.0020.0002] # NABATAEAN CRUCIFORM NUMBER FOUR +109C3 ; [.1BBC.0020.0002] # MEROITIC CURSIVE NUMBER FOUR +10A43 ; [.1BBC.0020.0002] # KHAROSHTHI DIGIT FOUR +10B5B ; [.1BBC.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER FOUR +10B7B ; [.1BBC.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER FOUR +10BAC ; [.1BBC.0020.0002] # PSALTER PAHLAVI NUMBER FOUR +10E63 ; [.1BBC.0020.0002] # RUMI DIGIT FOUR +11055 ; [.1BBC.0020.0002] # BRAHMI NUMBER FOUR +1106A ; [.1BBC.0020.0002] # BRAHMI DIGIT FOUR +110F4 ; [.1BBC.0020.0002] # SORA SOMPENG DIGIT FOUR +1113A ; [.1BBC.0020.0002] # CHAKMA DIGIT FOUR +111D4 ; [.1BBC.0020.0002] # SHARADA DIGIT FOUR +111E4 ; [.1BBC.0020.0002] # SINHALA ARCHAIC DIGIT FOUR +112F4 ; [.1BBC.0020.0002] # KHUDAWADI DIGIT FOUR +114D4 ; [.1BBC.0020.0002] # TIRHUTA DIGIT FOUR +11654 ; [.1BBC.0020.0002] # MODI DIGIT FOUR +116C4 ; [.1BBC.0020.0002] # TAKRI DIGIT FOUR +11734 ; [.1BBC.0020.0002] # AHOM DIGIT FOUR +118E4 ; [.1BBC.0020.0002] # WARANG CITI DIGIT FOUR +12402 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH +12409 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR DISH +1240F ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U +12418 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESH2 +12421 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESHU +12426 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHAR2 +12430 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHARU +12438 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BURU +1243C ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU +1243D ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4 +1243E ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A +1243F ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B +1244C ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU +12452 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 +12453 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM +12469 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM +16A64 ; [.1BBC.0020.0002] # MRO DIGIT FOUR +16B54 ; [.1BBC.0020.0002] # PAHAWH HMONG DIGIT FOUR +1D363 ; [.1BBC.0020.0002] # COUNTING ROD UNIT DIGIT FOUR +1E8CA ; [.1BBC.0020.0002] # MENDE KIKAKUI DIGIT FOUR +FF14 ; [.1BBC.0020.0003] # FULLWIDTH DIGIT FOUR +0F2D ; [.1BBC.0020.0004] # TIBETAN DIGIT HALF FOUR +2477 ; [*0310.0020.0004][.1BBC.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT FOUR +248B ; [.1BBC.0020.0004][*0274.0020.0004] # DIGIT FOUR FULL STOP +1F105 ; [.1BBC.0020.0004][*0221.0020.0004] # DIGIT FOUR COMMA +1D7D2 ; [.1BBC.0020.0005] # MATHEMATICAL BOLD DIGIT FOUR +1D7DC ; [.1BBC.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7E6 ; [.1BBC.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7F0 ; [.1BBC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7FA ; [.1BBC.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FOUR +2463 ; [.1BBC.0020.0006] # CIRCLED DIGIT FOUR +24F8 ; [.1BBC.0020.0006] # DOUBLE CIRCLED DIGIT FOUR +2779 ; [.1BBC.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR +2783 ; [.1BBC.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +278D ; [.1BBC.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +2074 ; [.1BBC.0020.0014] # SUPERSCRIPT FOUR +2084 ; [.1BBC.0020.0015] # SUBSCRIPT FOUR +324B ; [.1BBC.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER FORTY ON BLACK SQUARE +32B5 ; [.1BBC.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER FORTY +32B6 ; [.1BBC.0020.0006][.1BB9.0020.0006] # CIRCLED NUMBER FORTY ONE +32B7 ; [.1BBC.0020.0006][.1BBA.0020.0006] # CIRCLED NUMBER FORTY TWO +32B8 ; [.1BBC.0020.0006][.1BBB.0020.0006] # CIRCLED NUMBER FORTY THREE +32B9 ; [.1BBC.0020.0006][.1BBC.0020.0006] # CIRCLED NUMBER FORTY FOUR +32BA ; [.1BBC.0020.0006][.1BBD.0020.0006] # CIRCLED NUMBER FORTY FIVE +2158 ; [.1BBC.0020.001E][*0606.0020.001E][.1BBD.0020.001E] # VULGAR FRACTION FOUR FIFTHS +32BB ; [.1BBC.0020.0006][.1BBE.0020.0006] # CIRCLED NUMBER FORTY SIX +32BC ; [.1BBC.0020.0006][.1BBF.0020.0006] # CIRCLED NUMBER FORTY SEVEN +32BD ; [.1BBC.0020.0006][.1BC0.0020.0006] # CIRCLED NUMBER FORTY EIGHT +32BE ; [.1BBC.0020.0006][.1BC1.0020.0006] # CIRCLED NUMBER FORTY NINE +33E3 ; [.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +32C3 ; [.1BBC.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +335C ; [.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +0035 ; [.1BBD.0020.0002] # DIGIT FIVE +0665 ; [.1BBD.0020.0002] # ARABIC-INDIC DIGIT FIVE +06F5 ; [.1BBD.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FIVE +07C5 ; [.1BBD.0020.0002] # NKO DIGIT FIVE +096B ; [.1BBD.0020.0002] # DEVANAGARI DIGIT FIVE +09EB ; [.1BBD.0020.0002] # BENGALI DIGIT FIVE +0A6B ; [.1BBD.0020.0002] # GURMUKHI DIGIT FIVE +0AEB ; [.1BBD.0020.0002] # GUJARATI DIGIT FIVE +0B6B ; [.1BBD.0020.0002] # ORIYA DIGIT FIVE +0BEB ; [.1BBD.0020.0002] # TAMIL DIGIT FIVE +0C6B ; [.1BBD.0020.0002] # TELUGU DIGIT FIVE +0CEB ; [.1BBD.0020.0002] # KANNADA DIGIT FIVE +0D6B ; [.1BBD.0020.0002] # MALAYALAM DIGIT FIVE +0DEB ; [.1BBD.0020.0002] # SINHALA LITH DIGIT FIVE +0E55 ; [.1BBD.0020.0002] # THAI DIGIT FIVE +0ED5 ; [.1BBD.0020.0002] # LAO DIGIT FIVE +0F25 ; [.1BBD.0020.0002] # TIBETAN DIGIT FIVE +1045 ; [.1BBD.0020.0002] # MYANMAR DIGIT FIVE +1095 ; [.1BBD.0020.0002] # MYANMAR SHAN DIGIT FIVE +136D ; [.1BBD.0020.0002] # ETHIOPIC DIGIT FIVE +17E5 ; [.1BBD.0020.0002] # KHMER DIGIT FIVE +17F5 ; [.1BBD.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM +1815 ; [.1BBD.0020.0002] # MONGOLIAN DIGIT FIVE +194B ; [.1BBD.0020.0002] # LIMBU DIGIT FIVE +19D5 ; [.1BBD.0020.0002] # NEW TAI LUE DIGIT FIVE +1A85 ; [.1BBD.0020.0002] # TAI THAM HORA DIGIT FIVE +1A95 ; [.1BBD.0020.0002] # TAI THAM THAM DIGIT FIVE +1B55 ; [.1BBD.0020.0002] # BALINESE DIGIT FIVE +1BB5 ; [.1BBD.0020.0002] # SUNDANESE DIGIT FIVE +1C45 ; [.1BBD.0020.0002] # LEPCHA DIGIT FIVE +1C55 ; [.1BBD.0020.0002] # OL CHIKI DIGIT FIVE +3025 ; [.1BBD.0020.0002] # HANGZHOU NUMERAL FIVE +A625 ; [.1BBD.0020.0002] # VAI DIGIT FIVE +A8D5 ; [.1BBD.0020.0002] # SAURASHTRA DIGIT FIVE +A905 ; [.1BBD.0020.0002] # KAYAH LI DIGIT FIVE +A9D5 ; [.1BBD.0020.0002] # JAVANESE DIGIT FIVE +A9F5 ; [.1BBD.0020.0002] # MYANMAR TAI LAING DIGIT FIVE +AA55 ; [.1BBD.0020.0002] # CHAM DIGIT FIVE +ABF5 ; [.1BBD.0020.0002] # MEETEI MAYEK DIGIT FIVE +1010B ; [.1BBD.0020.0002] # AEGEAN NUMBER FIVE +10143 ; [.1BBD.0020.0002] # GREEK ACROPHONIC ATTIC FIVE +10148 ; [.1BBD.0020.0002] # GREEK ACROPHONIC ATTIC FIVE TALENTS +1014F ; [.1BBD.0020.0002] # GREEK ACROPHONIC ATTIC FIVE STATERS +1015F ; [.1BBD.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE +10173 ; [.1BBD.0020.0002] # GREEK ACROPHONIC DELPHIC FIVE MNAS +102E5 ; [.1BBD.0020.0002] # COPTIC EPACT DIGIT FIVE +10321 ; [.1BBD.0020.0002] # OLD ITALIC NUMERAL FIVE +104A5 ; [.1BBD.0020.0002] # OSMANYA DIGIT FIVE +1087D ; [.1BBD.0020.0002] # PALMYRENE NUMBER FIVE +108AC ; [.1BBD.0020.0002] # NABATAEAN NUMBER FIVE +108FC ; [.1BBD.0020.0002] # HATRAN NUMBER FIVE +109C4 ; [.1BBD.0020.0002] # MEROITIC CURSIVE NUMBER FIVE +10AEC ; [.1BBD.0020.0002] # MANICHAEAN NUMBER FIVE +10CFB ; [.1BBD.0020.0002] # OLD HUNGARIAN NUMBER FIVE +10E64 ; [.1BBD.0020.0002] # RUMI DIGIT FIVE +11056 ; [.1BBD.0020.0002] # BRAHMI NUMBER FIVE +1106B ; [.1BBD.0020.0002] # BRAHMI DIGIT FIVE +110F5 ; [.1BBD.0020.0002] # SORA SOMPENG DIGIT FIVE +1113B ; [.1BBD.0020.0002] # CHAKMA DIGIT FIVE +111D5 ; [.1BBD.0020.0002] # SHARADA DIGIT FIVE +111E5 ; [.1BBD.0020.0002] # SINHALA ARCHAIC DIGIT FIVE +112F5 ; [.1BBD.0020.0002] # KHUDAWADI DIGIT FIVE +114D5 ; [.1BBD.0020.0002] # TIRHUTA DIGIT FIVE +11655 ; [.1BBD.0020.0002] # MODI DIGIT FIVE +116C5 ; [.1BBD.0020.0002] # TAKRI DIGIT FIVE +11735 ; [.1BBD.0020.0002] # AHOM DIGIT FIVE +118E5 ; [.1BBD.0020.0002] # WARANG CITI DIGIT FIVE +12403 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH +1240A ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE DISH +12410 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U +12419 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESH2 +12422 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESHU +12427 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHAR2 +12431 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHARU +12439 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BURU +1244D ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU +12454 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 +12455 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM +1246A ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM +16A65 ; [.1BBD.0020.0002] # MRO DIGIT FIVE +16B55 ; [.1BBD.0020.0002] # PAHAWH HMONG DIGIT FIVE +1D364 ; [.1BBD.0020.0002] # COUNTING ROD UNIT DIGIT FIVE +1E8CB ; [.1BBD.0020.0002] # MENDE KIKAKUI DIGIT FIVE +FF15 ; [.1BBD.0020.0003] # FULLWIDTH DIGIT FIVE +0F2E ; [.1BBD.0020.0004] # TIBETAN DIGIT HALF FIVE +2478 ; [*0310.0020.0004][.1BBD.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT FIVE +248C ; [.1BBD.0020.0004][*0274.0020.0004] # DIGIT FIVE FULL STOP +1F106 ; [.1BBD.0020.0004][*0221.0020.0004] # DIGIT FIVE COMMA +1D7D3 ; [.1BBD.0020.0005] # MATHEMATICAL BOLD DIGIT FIVE +1D7DD ; [.1BBD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7E7 ; [.1BBD.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7F1 ; [.1BBD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7FB ; [.1BBD.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FIVE +2464 ; [.1BBD.0020.0006] # CIRCLED DIGIT FIVE +24F9 ; [.1BBD.0020.0006] # DOUBLE CIRCLED DIGIT FIVE +277A ; [.1BBD.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE +2784 ; [.1BBD.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +278E ; [.1BBD.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +2075 ; [.1BBD.0020.0014] # SUPERSCRIPT FIVE +2085 ; [.1BBD.0020.0015] # SUBSCRIPT FIVE +324C ; [.1BBD.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER FIFTY ON BLACK SQUARE +32BF ; [.1BBD.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER FIFTY +215A ; [.1BBD.0020.001E][*0606.0020.001E][.1BBE.0020.001E] # VULGAR FRACTION FIVE SIXTHS +215D ; [.1BBD.0020.001E][*0606.0020.001E][.1BC0.0020.001E] # VULGAR FRACTION FIVE EIGHTHS +33E4 ; [.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +32C4 ; [.1BBD.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +335D ; [.1BBD.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +0036 ; [.1BBE.0020.0002] # DIGIT SIX +0666 ; [.1BBE.0020.0002] # ARABIC-INDIC DIGIT SIX +06F6 ; [.1BBE.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SIX +07C6 ; [.1BBE.0020.0002] # NKO DIGIT SIX +096C ; [.1BBE.0020.0002] # DEVANAGARI DIGIT SIX +09EC ; [.1BBE.0020.0002] # BENGALI DIGIT SIX +0A6C ; [.1BBE.0020.0002] # GURMUKHI DIGIT SIX +0AEC ; [.1BBE.0020.0002] # GUJARATI DIGIT SIX +0B6C ; [.1BBE.0020.0002] # ORIYA DIGIT SIX +0BEC ; [.1BBE.0020.0002] # TAMIL DIGIT SIX +0C6C ; [.1BBE.0020.0002] # TELUGU DIGIT SIX +0CEC ; [.1BBE.0020.0002] # KANNADA DIGIT SIX +0D6C ; [.1BBE.0020.0002] # MALAYALAM DIGIT SIX +0DEC ; [.1BBE.0020.0002] # SINHALA LITH DIGIT SIX +0E56 ; [.1BBE.0020.0002] # THAI DIGIT SIX +0ED6 ; [.1BBE.0020.0002] # LAO DIGIT SIX +0F26 ; [.1BBE.0020.0002] # TIBETAN DIGIT SIX +1046 ; [.1BBE.0020.0002] # MYANMAR DIGIT SIX +1096 ; [.1BBE.0020.0002] # MYANMAR SHAN DIGIT SIX +136E ; [.1BBE.0020.0002] # ETHIOPIC DIGIT SIX +17E6 ; [.1BBE.0020.0002] # KHMER DIGIT SIX +17F6 ; [.1BBE.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-MUOY +1816 ; [.1BBE.0020.0002] # MONGOLIAN DIGIT SIX +194C ; [.1BBE.0020.0002] # LIMBU DIGIT SIX +19D6 ; [.1BBE.0020.0002] # NEW TAI LUE DIGIT SIX +1A86 ; [.1BBE.0020.0002] # TAI THAM HORA DIGIT SIX +1A96 ; [.1BBE.0020.0002] # TAI THAM THAM DIGIT SIX +1B56 ; [.1BBE.0020.0002] # BALINESE DIGIT SIX +1BB6 ; [.1BBE.0020.0002] # SUNDANESE DIGIT SIX +1C46 ; [.1BBE.0020.0002] # LEPCHA DIGIT SIX +1C56 ; [.1BBE.0020.0002] # OL CHIKI DIGIT SIX +2185 ; [.1BBE.0020.0002] # ROMAN NUMERAL SIX LATE FORM +3026 ; [.1BBE.0020.0002] # HANGZHOU NUMERAL SIX +A626 ; [.1BBE.0020.0002] # VAI DIGIT SIX +A8D6 ; [.1BBE.0020.0002] # SAURASHTRA DIGIT SIX +A906 ; [.1BBE.0020.0002] # KAYAH LI DIGIT SIX +A9D6 ; [.1BBE.0020.0002] # JAVANESE DIGIT SIX +A9F6 ; [.1BBE.0020.0002] # MYANMAR TAI LAING DIGIT SIX +AA56 ; [.1BBE.0020.0002] # CHAM DIGIT SIX +ABF6 ; [.1BBE.0020.0002] # MEETEI MAYEK DIGIT SIX +1010C ; [.1BBE.0020.0002] # AEGEAN NUMBER SIX +102E6 ; [.1BBE.0020.0002] # COPTIC EPACT DIGIT SIX +104A6 ; [.1BBE.0020.0002] # OSMANYA DIGIT SIX +109C5 ; [.1BBE.0020.0002] # MEROITIC CURSIVE NUMBER SIX +10E65 ; [.1BBE.0020.0002] # RUMI DIGIT SIX +11057 ; [.1BBE.0020.0002] # BRAHMI NUMBER SIX +1106C ; [.1BBE.0020.0002] # BRAHMI DIGIT SIX +110F6 ; [.1BBE.0020.0002] # SORA SOMPENG DIGIT SIX +1113C ; [.1BBE.0020.0002] # CHAKMA DIGIT SIX +111D6 ; [.1BBE.0020.0002] # SHARADA DIGIT SIX +111E6 ; [.1BBE.0020.0002] # SINHALA ARCHAIC DIGIT SIX +112F6 ; [.1BBE.0020.0002] # KHUDAWADI DIGIT SIX +114D6 ; [.1BBE.0020.0002] # TIRHUTA DIGIT SIX +11656 ; [.1BBE.0020.0002] # MODI DIGIT SIX +116C6 ; [.1BBE.0020.0002] # TAKRI DIGIT SIX +11736 ; [.1BBE.0020.0002] # AHOM DIGIT SIX +118E6 ; [.1BBE.0020.0002] # WARANG CITI DIGIT SIX +12404 ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH +1240B ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX DISH +12411 ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U +1241A ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX GESH2 +12428 ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX SHAR2 +12440 ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9 +1244E ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH TENU +1246B ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM +16A66 ; [.1BBE.0020.0002] # MRO DIGIT SIX +16B56 ; [.1BBE.0020.0002] # PAHAWH HMONG DIGIT SIX +1D365 ; [.1BBE.0020.0002] # COUNTING ROD UNIT DIGIT SIX +1E8CC ; [.1BBE.0020.0002] # MENDE KIKAKUI DIGIT SIX +FF16 ; [.1BBE.0020.0003] # FULLWIDTH DIGIT SIX +0F2F ; [.1BBE.0020.0004] # TIBETAN DIGIT HALF SIX +2479 ; [*0310.0020.0004][.1BBE.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT SIX +248D ; [.1BBE.0020.0004][*0274.0020.0004] # DIGIT SIX FULL STOP +1F107 ; [.1BBE.0020.0004][*0221.0020.0004] # DIGIT SIX COMMA +1D7D4 ; [.1BBE.0020.0005] # MATHEMATICAL BOLD DIGIT SIX +1D7DE ; [.1BBE.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7E8 ; [.1BBE.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SIX +1D7F2 ; [.1BBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7FC ; [.1BBE.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SIX +2465 ; [.1BBE.0020.0006] # CIRCLED DIGIT SIX +24FA ; [.1BBE.0020.0006] # DOUBLE CIRCLED DIGIT SIX +277B ; [.1BBE.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SIX +2785 ; [.1BBE.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX +278F ; [.1BBE.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +2076 ; [.1BBE.0020.0014] # SUPERSCRIPT SIX +2086 ; [.1BBE.0020.0015] # SUBSCRIPT SIX +324D ; [.1BBE.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER SIXTY ON BLACK SQUARE +33E5 ; [.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +32C5 ; [.1BBE.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +335E ; [.1BBE.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +0037 ; [.1BBF.0020.0002] # DIGIT SEVEN +0667 ; [.1BBF.0020.0002] # ARABIC-INDIC DIGIT SEVEN +06F7 ; [.1BBF.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SEVEN +07C7 ; [.1BBF.0020.0002] # NKO DIGIT SEVEN +096D ; [.1BBF.0020.0002] # DEVANAGARI DIGIT SEVEN +09ED ; [.1BBF.0020.0002] # BENGALI DIGIT SEVEN +0A6D ; [.1BBF.0020.0002] # GURMUKHI DIGIT SEVEN +0AED ; [.1BBF.0020.0002] # GUJARATI DIGIT SEVEN +0B6D ; [.1BBF.0020.0002] # ORIYA DIGIT SEVEN +0BED ; [.1BBF.0020.0002] # TAMIL DIGIT SEVEN +0C6D ; [.1BBF.0020.0002] # TELUGU DIGIT SEVEN +0CED ; [.1BBF.0020.0002] # KANNADA DIGIT SEVEN +0D6D ; [.1BBF.0020.0002] # MALAYALAM DIGIT SEVEN +0DED ; [.1BBF.0020.0002] # SINHALA LITH DIGIT SEVEN +0E57 ; [.1BBF.0020.0002] # THAI DIGIT SEVEN +0ED7 ; [.1BBF.0020.0002] # LAO DIGIT SEVEN +0F27 ; [.1BBF.0020.0002] # TIBETAN DIGIT SEVEN +1047 ; [.1BBF.0020.0002] # MYANMAR DIGIT SEVEN +1097 ; [.1BBF.0020.0002] # MYANMAR SHAN DIGIT SEVEN +136F ; [.1BBF.0020.0002] # ETHIOPIC DIGIT SEVEN +17E7 ; [.1BBF.0020.0002] # KHMER DIGIT SEVEN +17F7 ; [.1BBF.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-PII +1817 ; [.1BBF.0020.0002] # MONGOLIAN DIGIT SEVEN +194D ; [.1BBF.0020.0002] # LIMBU DIGIT SEVEN +19D7 ; [.1BBF.0020.0002] # NEW TAI LUE DIGIT SEVEN +1A87 ; [.1BBF.0020.0002] # TAI THAM HORA DIGIT SEVEN +1A97 ; [.1BBF.0020.0002] # TAI THAM THAM DIGIT SEVEN +1B57 ; [.1BBF.0020.0002] # BALINESE DIGIT SEVEN +1BB7 ; [.1BBF.0020.0002] # SUNDANESE DIGIT SEVEN +1C47 ; [.1BBF.0020.0002] # LEPCHA DIGIT SEVEN +1C57 ; [.1BBF.0020.0002] # OL CHIKI DIGIT SEVEN +3027 ; [.1BBF.0020.0002] # HANGZHOU NUMERAL SEVEN +A627 ; [.1BBF.0020.0002] # VAI DIGIT SEVEN +A8D7 ; [.1BBF.0020.0002] # SAURASHTRA DIGIT SEVEN +A907 ; [.1BBF.0020.0002] # KAYAH LI DIGIT SEVEN +A9D7 ; [.1BBF.0020.0002] # JAVANESE DIGIT SEVEN +A9F7 ; [.1BBF.0020.0002] # MYANMAR TAI LAING DIGIT SEVEN +AA57 ; [.1BBF.0020.0002] # CHAM DIGIT SEVEN +ABF7 ; [.1BBF.0020.0002] # MEETEI MAYEK DIGIT SEVEN +1010D ; [.1BBF.0020.0002] # AEGEAN NUMBER SEVEN +102E7 ; [.1BBF.0020.0002] # COPTIC EPACT DIGIT SEVEN +104A7 ; [.1BBF.0020.0002] # OSMANYA DIGIT SEVEN +109C6 ; [.1BBF.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN +10E66 ; [.1BBF.0020.0002] # RUMI DIGIT SEVEN +11058 ; [.1BBF.0020.0002] # BRAHMI NUMBER SEVEN +1106D ; [.1BBF.0020.0002] # BRAHMI DIGIT SEVEN +110F7 ; [.1BBF.0020.0002] # SORA SOMPENG DIGIT SEVEN +1113D ; [.1BBF.0020.0002] # CHAKMA DIGIT SEVEN +111D7 ; [.1BBF.0020.0002] # SHARADA DIGIT SEVEN +111E7 ; [.1BBF.0020.0002] # SINHALA ARCHAIC DIGIT SEVEN +112F7 ; [.1BBF.0020.0002] # KHUDAWADI DIGIT SEVEN +114D7 ; [.1BBF.0020.0002] # TIRHUTA DIGIT SEVEN +11657 ; [.1BBF.0020.0002] # MODI DIGIT SEVEN +116C7 ; [.1BBF.0020.0002] # TAKRI DIGIT SEVEN +11737 ; [.1BBF.0020.0002] # AHOM DIGIT SEVEN +118E7 ; [.1BBF.0020.0002] # WARANG CITI DIGIT SEVEN +12405 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN ASH +1240C ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN DISH +12412 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U +1241B ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN GESH2 +12429 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2 +12441 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3 +12442 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A +12443 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B +1246C ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM +16A67 ; [.1BBF.0020.0002] # MRO DIGIT SEVEN +16B57 ; [.1BBF.0020.0002] # PAHAWH HMONG DIGIT SEVEN +1D366 ; [.1BBF.0020.0002] # COUNTING ROD UNIT DIGIT SEVEN +1E8CD ; [.1BBF.0020.0002] # MENDE KIKAKUI DIGIT SEVEN +FF17 ; [.1BBF.0020.0003] # FULLWIDTH DIGIT SEVEN +0F30 ; [.1BBF.0020.0004] # TIBETAN DIGIT HALF SEVEN +247A ; [*0310.0020.0004][.1BBF.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT SEVEN +248E ; [.1BBF.0020.0004][*0274.0020.0004] # DIGIT SEVEN FULL STOP +1F108 ; [.1BBF.0020.0004][*0221.0020.0004] # DIGIT SEVEN COMMA +1D7D5 ; [.1BBF.0020.0005] # MATHEMATICAL BOLD DIGIT SEVEN +1D7DF ; [.1BBF.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E9 ; [.1BBF.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7F3 ; [.1BBF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7FD ; [.1BBF.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SEVEN +2466 ; [.1BBF.0020.0006] # CIRCLED DIGIT SEVEN +24FB ; [.1BBF.0020.0006] # DOUBLE CIRCLED DIGIT SEVEN +277C ; [.1BBF.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +2786 ; [.1BBF.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2790 ; [.1BBF.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +2077 ; [.1BBF.0020.0014] # SUPERSCRIPT SEVEN +2087 ; [.1BBF.0020.0015] # SUBSCRIPT SEVEN +324E ; [.1BBF.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER SEVENTY ON BLACK SQUARE +215E ; [.1BBF.0020.001E][*0606.0020.001E][.1BC0.0020.001E] # VULGAR FRACTION SEVEN EIGHTHS +33E6 ; [.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +32C6 ; [.1BBF.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +335F ; [.1BBF.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +0038 ; [.1BC0.0020.0002] # DIGIT EIGHT +0668 ; [.1BC0.0020.0002] # ARABIC-INDIC DIGIT EIGHT +06F8 ; [.1BC0.0020.0002] # EXTENDED ARABIC-INDIC DIGIT EIGHT +07C8 ; [.1BC0.0020.0002] # NKO DIGIT EIGHT +096E ; [.1BC0.0020.0002] # DEVANAGARI DIGIT EIGHT +09EE ; [.1BC0.0020.0002] # BENGALI DIGIT EIGHT +0A6E ; [.1BC0.0020.0002] # GURMUKHI DIGIT EIGHT +0AEE ; [.1BC0.0020.0002] # GUJARATI DIGIT EIGHT +0B6E ; [.1BC0.0020.0002] # ORIYA DIGIT EIGHT +0BEE ; [.1BC0.0020.0002] # TAMIL DIGIT EIGHT +0C6E ; [.1BC0.0020.0002] # TELUGU DIGIT EIGHT +0CEE ; [.1BC0.0020.0002] # KANNADA DIGIT EIGHT +0D6E ; [.1BC0.0020.0002] # MALAYALAM DIGIT EIGHT +0DEE ; [.1BC0.0020.0002] # SINHALA LITH DIGIT EIGHT +0E58 ; [.1BC0.0020.0002] # THAI DIGIT EIGHT +0ED8 ; [.1BC0.0020.0002] # LAO DIGIT EIGHT +0F28 ; [.1BC0.0020.0002] # TIBETAN DIGIT EIGHT +1048 ; [.1BC0.0020.0002] # MYANMAR DIGIT EIGHT +1098 ; [.1BC0.0020.0002] # MYANMAR SHAN DIGIT EIGHT +1370 ; [.1BC0.0020.0002] # ETHIOPIC DIGIT EIGHT +17E8 ; [.1BC0.0020.0002] # KHMER DIGIT EIGHT +17F8 ; [.1BC0.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BEI +1818 ; [.1BC0.0020.0002] # MONGOLIAN DIGIT EIGHT +194E ; [.1BC0.0020.0002] # LIMBU DIGIT EIGHT +19D8 ; [.1BC0.0020.0002] # NEW TAI LUE DIGIT EIGHT +1A88 ; [.1BC0.0020.0002] # TAI THAM HORA DIGIT EIGHT +1A98 ; [.1BC0.0020.0002] # TAI THAM THAM DIGIT EIGHT +1B58 ; [.1BC0.0020.0002] # BALINESE DIGIT EIGHT +1BB8 ; [.1BC0.0020.0002] # SUNDANESE DIGIT EIGHT +1C48 ; [.1BC0.0020.0002] # LEPCHA DIGIT EIGHT +1C58 ; [.1BC0.0020.0002] # OL CHIKI DIGIT EIGHT +3028 ; [.1BC0.0020.0002] # HANGZHOU NUMERAL EIGHT +A628 ; [.1BC0.0020.0002] # VAI DIGIT EIGHT +A8D8 ; [.1BC0.0020.0002] # SAURASHTRA DIGIT EIGHT +A908 ; [.1BC0.0020.0002] # KAYAH LI DIGIT EIGHT +A9D8 ; [.1BC0.0020.0002] # JAVANESE DIGIT EIGHT +A9F8 ; [.1BC0.0020.0002] # MYANMAR TAI LAING DIGIT EIGHT +AA58 ; [.1BC0.0020.0002] # CHAM DIGIT EIGHT +ABF8 ; [.1BC0.0020.0002] # MEETEI MAYEK DIGIT EIGHT +1010E ; [.1BC0.0020.0002] # AEGEAN NUMBER EIGHT +102E8 ; [.1BC0.0020.0002] # COPTIC EPACT DIGIT EIGHT +104A8 ; [.1BC0.0020.0002] # OSMANYA DIGIT EIGHT +109C7 ; [.1BC0.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT +10E67 ; [.1BC0.0020.0002] # RUMI DIGIT EIGHT +11059 ; [.1BC0.0020.0002] # BRAHMI NUMBER EIGHT +1106E ; [.1BC0.0020.0002] # BRAHMI DIGIT EIGHT +110F8 ; [.1BC0.0020.0002] # SORA SOMPENG DIGIT EIGHT +1113E ; [.1BC0.0020.0002] # CHAKMA DIGIT EIGHT +111D8 ; [.1BC0.0020.0002] # SHARADA DIGIT EIGHT +111E8 ; [.1BC0.0020.0002] # SINHALA ARCHAIC DIGIT EIGHT +112F8 ; [.1BC0.0020.0002] # KHUDAWADI DIGIT EIGHT +114D8 ; [.1BC0.0020.0002] # TIRHUTA DIGIT EIGHT +11658 ; [.1BC0.0020.0002] # MODI DIGIT EIGHT +116C8 ; [.1BC0.0020.0002] # TAKRI DIGIT EIGHT +11738 ; [.1BC0.0020.0002] # AHOM DIGIT EIGHT +118E8 ; [.1BC0.0020.0002] # WARANG CITI DIGIT EIGHT +12406 ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT ASH +1240D ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT DISH +12413 ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U +1241C ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT GESH2 +1242A ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2 +12444 ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU +12445 ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3 +1246D ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM +16A68 ; [.1BC0.0020.0002] # MRO DIGIT EIGHT +16B58 ; [.1BC0.0020.0002] # PAHAWH HMONG DIGIT EIGHT +1D367 ; [.1BC0.0020.0002] # COUNTING ROD UNIT DIGIT EIGHT +1E8CE ; [.1BC0.0020.0002] # MENDE KIKAKUI DIGIT EIGHT +FF18 ; [.1BC0.0020.0003] # FULLWIDTH DIGIT EIGHT +0F31 ; [.1BC0.0020.0004] # TIBETAN DIGIT HALF EIGHT +247B ; [*0310.0020.0004][.1BC0.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT EIGHT +248F ; [.1BC0.0020.0004][*0274.0020.0004] # DIGIT EIGHT FULL STOP +1F109 ; [.1BC0.0020.0004][*0221.0020.0004] # DIGIT EIGHT COMMA +1D7D6 ; [.1BC0.0020.0005] # MATHEMATICAL BOLD DIGIT EIGHT +1D7E0 ; [.1BC0.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7EA ; [.1BC0.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7F4 ; [.1BC0.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7FE ; [.1BC0.0020.0005] # MATHEMATICAL MONOSPACE DIGIT EIGHT +2467 ; [.1BC0.0020.0006] # CIRCLED DIGIT EIGHT +24FC ; [.1BC0.0020.0006] # DOUBLE CIRCLED DIGIT EIGHT +277D ; [.1BC0.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +2787 ; [.1BC0.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2791 ; [.1BC0.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +2078 ; [.1BC0.0020.0014] # SUPERSCRIPT EIGHT +2088 ; [.1BC0.0020.0015] # SUBSCRIPT EIGHT +324F ; [.1BC0.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER EIGHTY ON BLACK SQUARE +33E7 ; [.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +32C7 ; [.1BC0.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +3360 ; [.1BC0.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +0039 ; [.1BC1.0020.0002] # DIGIT NINE +0669 ; [.1BC1.0020.0002] # ARABIC-INDIC DIGIT NINE +06F9 ; [.1BC1.0020.0002] # EXTENDED ARABIC-INDIC DIGIT NINE +07C9 ; [.1BC1.0020.0002] # NKO DIGIT NINE +096F ; [.1BC1.0020.0002] # DEVANAGARI DIGIT NINE +09EF ; [.1BC1.0020.0002] # BENGALI DIGIT NINE +0A6F ; [.1BC1.0020.0002] # GURMUKHI DIGIT NINE +0AEF ; [.1BC1.0020.0002] # GUJARATI DIGIT NINE +0B6F ; [.1BC1.0020.0002] # ORIYA DIGIT NINE +0BEF ; [.1BC1.0020.0002] # TAMIL DIGIT NINE +0C6F ; [.1BC1.0020.0002] # TELUGU DIGIT NINE +0CEF ; [.1BC1.0020.0002] # KANNADA DIGIT NINE +0D6F ; [.1BC1.0020.0002] # MALAYALAM DIGIT NINE +0DEF ; [.1BC1.0020.0002] # SINHALA LITH DIGIT NINE +0E59 ; [.1BC1.0020.0002] # THAI DIGIT NINE +0ED9 ; [.1BC1.0020.0002] # LAO DIGIT NINE +0F29 ; [.1BC1.0020.0002] # TIBETAN DIGIT NINE +1049 ; [.1BC1.0020.0002] # MYANMAR DIGIT NINE +1099 ; [.1BC1.0020.0002] # MYANMAR SHAN DIGIT NINE +1371 ; [.1BC1.0020.0002] # ETHIOPIC DIGIT NINE +17E9 ; [.1BC1.0020.0002] # KHMER DIGIT NINE +17F9 ; [.1BC1.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BUON +1819 ; [.1BC1.0020.0002] # MONGOLIAN DIGIT NINE +194F ; [.1BC1.0020.0002] # LIMBU DIGIT NINE +19D9 ; [.1BC1.0020.0002] # NEW TAI LUE DIGIT NINE +1A89 ; [.1BC1.0020.0002] # TAI THAM HORA DIGIT NINE +1A99 ; [.1BC1.0020.0002] # TAI THAM THAM DIGIT NINE +1B59 ; [.1BC1.0020.0002] # BALINESE DIGIT NINE +1BB9 ; [.1BC1.0020.0002] # SUNDANESE DIGIT NINE +1C49 ; [.1BC1.0020.0002] # LEPCHA DIGIT NINE +1C59 ; [.1BC1.0020.0002] # OL CHIKI DIGIT NINE +3029 ; [.1BC1.0020.0002] # HANGZHOU NUMERAL NINE +A629 ; [.1BC1.0020.0002] # VAI DIGIT NINE +A8D9 ; [.1BC1.0020.0002] # SAURASHTRA DIGIT NINE +A909 ; [.1BC1.0020.0002] # KAYAH LI DIGIT NINE +A9D9 ; [.1BC1.0020.0002] # JAVANESE DIGIT NINE +A9F9 ; [.1BC1.0020.0002] # MYANMAR TAI LAING DIGIT NINE +AA59 ; [.1BC1.0020.0002] # CHAM DIGIT NINE +ABF9 ; [.1BC1.0020.0002] # MEETEI MAYEK DIGIT NINE +1010F ; [.1BC1.0020.0002] # AEGEAN NUMBER NINE +102E9 ; [.1BC1.0020.0002] # COPTIC EPACT DIGIT NINE +104A9 ; [.1BC1.0020.0002] # OSMANYA DIGIT NINE +109C8 ; [.1BC1.0020.0002] # MEROITIC CURSIVE NUMBER NINE +10E68 ; [.1BC1.0020.0002] # RUMI DIGIT NINE +1105A ; [.1BC1.0020.0002] # BRAHMI NUMBER NINE +1106F ; [.1BC1.0020.0002] # BRAHMI DIGIT NINE +110F9 ; [.1BC1.0020.0002] # SORA SOMPENG DIGIT NINE +1113F ; [.1BC1.0020.0002] # CHAKMA DIGIT NINE +111D9 ; [.1BC1.0020.0002] # SHARADA DIGIT NINE +111E9 ; [.1BC1.0020.0002] # SINHALA ARCHAIC DIGIT NINE +112F9 ; [.1BC1.0020.0002] # KHUDAWADI DIGIT NINE +114D9 ; [.1BC1.0020.0002] # TIRHUTA DIGIT NINE +11659 ; [.1BC1.0020.0002] # MODI DIGIT NINE +116C9 ; [.1BC1.0020.0002] # TAKRI DIGIT NINE +11739 ; [.1BC1.0020.0002] # AHOM DIGIT NINE +118E9 ; [.1BC1.0020.0002] # WARANG CITI DIGIT NINE +12407 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE ASH +1240E ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE DISH +12414 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U +1241D ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE GESH2 +1242B ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE SHAR2 +12446 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU +12447 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3 +12448 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4 +12449 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A +1246E ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +16A69 ; [.1BC1.0020.0002] # MRO DIGIT NINE +16B59 ; [.1BC1.0020.0002] # PAHAWH HMONG DIGIT NINE +1D368 ; [.1BC1.0020.0002] # COUNTING ROD UNIT DIGIT NINE +1E8CF ; [.1BC1.0020.0002] # MENDE KIKAKUI DIGIT NINE +FF19 ; [.1BC1.0020.0003] # FULLWIDTH DIGIT NINE +0F32 ; [.1BC1.0020.0004] # TIBETAN DIGIT HALF NINE +247C ; [*0310.0020.0004][.1BC1.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT NINE +2490 ; [.1BC1.0020.0004][*0274.0020.0004] # DIGIT NINE FULL STOP +1F10A ; [.1BC1.0020.0004][*0221.0020.0004] # DIGIT NINE COMMA +1D7D7 ; [.1BC1.0020.0005] # MATHEMATICAL BOLD DIGIT NINE +1D7E1 ; [.1BC1.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7EB ; [.1BC1.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT NINE +1D7F5 ; [.1BC1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7FF ; [.1BC1.0020.0005] # MATHEMATICAL MONOSPACE DIGIT NINE +2468 ; [.1BC1.0020.0006] # CIRCLED DIGIT NINE +24FD ; [.1BC1.0020.0006] # DOUBLE CIRCLED DIGIT NINE +277E ; [.1BC1.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT NINE +2788 ; [.1BC1.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2792 ; [.1BC1.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +2079 ; [.1BC1.0020.0014] # SUPERSCRIPT NINE +2089 ; [.1BC1.0020.0015] # SUBSCRIPT NINE +33E8 ; [.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +32C8 ; [.1BC1.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +3361 ; [.1BC1.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +0061 ; [.1BC2.0020.0002] # LATIN SMALL LETTER A +FF41 ; [.1BC2.0020.0003] # FULLWIDTH LATIN SMALL LETTER A +0363 ; [.1BC2.0020.0004] # COMBINING LATIN SMALL LETTER A +249C ; [*0310.0020.0004][.1BC2.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER A +1D41A ; [.1BC2.0020.0005] # MATHEMATICAL BOLD SMALL A +1D44E ; [.1BC2.0020.0005] # MATHEMATICAL ITALIC SMALL A +1D482 ; [.1BC2.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL A +1D4B6 ; [.1BC2.0020.0005] # MATHEMATICAL SCRIPT SMALL A +1D4EA ; [.1BC2.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL A +1D51E ; [.1BC2.0020.0005] # MATHEMATICAL FRAKTUR SMALL A +1D552 ; [.1BC2.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL A +1D586 ; [.1BC2.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL A +1D5BA ; [.1BC2.0020.0005] # MATHEMATICAL SANS-SERIF SMALL A +1D5EE ; [.1BC2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL A +1D622 ; [.1BC2.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D656 ; [.1BC2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D68A ; [.1BC2.0020.0005] # MATHEMATICAL MONOSPACE SMALL A +24D0 ; [.1BC2.0020.0006] # CIRCLED LATIN SMALL LETTER A +0041 ; [.1BC2.0020.0008] # LATIN CAPITAL LETTER A +FF21 ; [.1BC2.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER A +1F110 ; [*0310.0020.0004][.1BC2.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER A +1D400 ; [.1BC2.0020.000B] # MATHEMATICAL BOLD CAPITAL A +1D434 ; [.1BC2.0020.000B] # MATHEMATICAL ITALIC CAPITAL A +1D468 ; [.1BC2.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL A +1D49C ; [.1BC2.0020.000B] # MATHEMATICAL SCRIPT CAPITAL A +1D4D0 ; [.1BC2.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL A +1D504 ; [.1BC2.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL A +1D538 ; [.1BC2.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D56C ; [.1BC2.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D5A0 ; [.1BC2.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL A +1D5D4 ; [.1BC2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D608 ; [.1BC2.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D63C ; [.1BC2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D670 ; [.1BC2.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL A +24B6 ; [.1BC2.0020.000C] # CIRCLED LATIN CAPITAL LETTER A +1F150 ; [.1BC2.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER A +00AA ; [.1BC2.0020.0014] # FEMININE ORDINAL INDICATOR +1D43 ; [.1BC2.0020.0014] # MODIFIER LETTER SMALL A +2090 ; [.1BC2.0020.0015] # LATIN SUBSCRIPT SMALL LETTER A +1D2C ; [.1BC2.0020.001D] # MODIFIER LETTER CAPITAL A +1F130 ; [.1BC2.0020.001D] # SQUARED LATIN CAPITAL LETTER A +1F170 ; [.1BC2.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER A +00E1 ; [.1BC2.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH ACUTE +00C1 ; [.1BC2.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH ACUTE +00E0 ; [.1BC2.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH GRAVE +00C0 ; [.1BC2.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH GRAVE +0103 ; [.1BC2.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE +0102 ; [.1BC2.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE +1EAF ; [.1BC2.0020.0002][.0000.0026.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EAE ; [.1BC2.0020.0008][.0000.0026.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB1 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB0 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB5 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB4 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB3 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB2 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +00E2 ; [.1BC2.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX +00C2 ; [.1BC2.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +1EA5 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA4 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA7 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA6 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EAB ; [.1BC2.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAA ; [.1BC2.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EA9 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA8 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +01CE ; [.1BC2.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER A WITH CARON +01CD ; [.1BC2.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER A WITH CARON +00E5 ; [.1BC2.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER A WITH RING ABOVE +00C5 ; [.1BC2.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE +212B ; [.1BC2.0020.0008][.0000.0029.0002] # ANGSTROM SIGN +01FB ; [.1BC2.0020.0002][.0000.0029.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FA ; [.1BC2.0020.0008][.0000.0029.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +00E4 ; [.1BC2.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER A WITH DIAERESIS +1DF2 ; [.1BC2.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER A WITH DIAERESIS +A79B ; [.1BC2.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK AE +00C4 ; [.1BC2.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS +A79A ; [.1BC2.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK AE +01DF ; [.1BC2.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01DE ; [.1BC2.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +00E3 ; [.1BC2.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH TILDE +00C3 ; [.1BC2.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH TILDE +0227 ; [.1BC2.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER A WITH DOT ABOVE +0226 ; [.1BC2.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE +01E1 ; [.1BC2.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E0 ; [.1BC2.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +0105 ; [.1BC2.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER A WITH OGONEK +0104 ; [.1BC2.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER A WITH OGONEK +0101 ; [.1BC2.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH MACRON +0100 ; [.1BC2.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH MACRON +1EA3 ; [.1BC2.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH HOOK ABOVE +1EA2 ; [.1BC2.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH HOOK ABOVE +0201 ; [.1BC2.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER A WITH DOUBLE GRAVE +0200 ; [.1BC2.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0203 ; [.1BC2.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER A WITH INVERTED BREVE +0202 ; [.1BC2.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER A WITH INVERTED BREVE +1EA1 ; [.1BC2.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER A WITH DOT BELOW +1EA0 ; [.1BC2.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER A WITH DOT BELOW +1EB7 ; [.1BC2.0020.0002][.0000.0042.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB6 ; [.1BC2.0020.0008][.0000.0042.0002][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EAD ; [.1BC2.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAC ; [.1BC2.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1E01 ; [.1BC2.0020.0002][.0000.0044.0002] # LATIN SMALL LETTER A WITH RING BELOW +1E00 ; [.1BC2.0020.0008][.0000.0044.0002] # LATIN CAPITAL LETTER A WITH RING BELOW +1DD3 ; [.1BC2.0020.0004][.0000.010B.0004] # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE +A733 ; [.1BC2.0020.0004][.1BC2.0020.0004] # LATIN SMALL LETTER AA +A732 ; [.1BC2.0020.000A][.1BC2.0020.000A] # LATIN CAPITAL LETTER AA +1F18E ; [.1BC2.0020.001D][.1BDB.0020.001D] # NEGATIVE SQUARED AB +2100 ; [.1BC2.0020.0004][*038D.0020.0004][.1BF5.0020.0004] # ACCOUNT OF +00E6 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004] # LATIN SMALL LETTER AE +1DD4 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004] # COMBINING LATIN SMALL LETTER AE +00C6 ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A] # LATIN CAPITAL LETTER AE +1D2D ; [.1BC2.0020.0014][.0000.010B.0014][.1C25.0020.0014] # MODIFIER LETTER CAPITAL AE +01FD ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004][.0000.0024.0002] # LATIN SMALL LETTER AE WITH ACUTE +01FC ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A][.0000.0024.0002] # LATIN CAPITAL LETTER AE WITH ACUTE +01E3 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004][.0000.0032.0002] # LATIN SMALL LETTER AE WITH MACRON +01E2 ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A][.0000.0032.0002] # LATIN CAPITAL LETTER AE WITH MACRON +33C2 ; [.1BC2.0020.001C][*0274.0020.001C][.1D25.0020.001C][*0274.0020.001C] # SQUARE AM +33DF ; [.1BC2.0020.001D][*0605.0020.001C][.1D25.0020.001C] # SQUARE A OVER M +1DD5 ; [.1BC2.0020.0004][.1D58.0020.0004] # COMBINING LATIN SMALL LETTER AO +A735 ; [.1BC2.0020.0004][.1D58.0020.0004] # LATIN SMALL LETTER AO +A734 ; [.1BC2.0020.000A][.1D58.0020.000A] # LATIN CAPITAL LETTER AO +2101 ; [.1BC2.0020.0004][*038D.0020.0004][.1DEC.0020.0004] # ADDRESSED TO THE SUBJECT +214D ; [.1BC2.0020.000A][*038D.0020.0004][.1DEC.0020.000A] # AKTIESELSKAB +A737 ; [.1BC2.0020.0004][.1E30.0020.0004] # LATIN SMALL LETTER AU +A736 ; [.1BC2.0020.000A][.1E30.0020.000A] # LATIN CAPITAL LETTER AU +3373 ; [.1BC2.0020.001D][.1E30.0020.001D] # SQUARE AU +1DD6 ; [.1BC2.0020.0004][.1E5E.0020.0004] # COMBINING LATIN SMALL LETTER AV +A739 ; [.1BC2.0020.0004][.1E5E.0020.0004] # LATIN SMALL LETTER AV +A738 ; [.1BC2.0020.000A][.1E5E.0020.000A] # LATIN CAPITAL LETTER AV +A73B ; [.1BC2.0020.0004][.0000.010B.0004][.1E5E.0020.0004] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR +A73A ; [.1BC2.0020.000A][.0000.010B.0004][.1E5E.0020.000A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73D ; [.1BC2.0020.0004][.1E86.0020.0004] # LATIN SMALL LETTER AY +A73C ; [.1BC2.0020.000A][.1E86.0020.000A] # LATIN CAPITAL LETTER AY +1E9A ; [.1BC2.0020.0004][.1EFB.0020.0004] # LATIN SMALL LETTER A WITH RIGHT HALF RING +1D00 ; [.1BC6.0020.0002] # LATIN LETTER SMALL CAPITAL A +2C65 ; [.1BC7.0020.0002] # LATIN SMALL LETTER A WITH STROKE +023A ; [.1BC7.0020.0008] # LATIN CAPITAL LETTER A WITH STROKE +1D8F ; [.1BC8.0020.0002] # LATIN SMALL LETTER A WITH RETROFLEX HOOK +1D01 ; [.1BC9.0020.0002] # LATIN LETTER SMALL CAPITAL AE +1D02 ; [.1BCA.0020.0002] # LATIN SMALL LETTER TURNED AE +1D46 ; [.1BCA.0020.0014] # MODIFIER LETTER SMALL TURNED AE +AB31 ; [.1BCB.0020.0002] # LATIN SMALL LETTER A REVERSED-SCHWA +0250 ; [.1BCC.0020.0002] # LATIN SMALL LETTER TURNED A +2C6F ; [.1BCC.0020.0008] # LATIN CAPITAL LETTER TURNED A +1D44 ; [.1BCC.0020.0014] # MODIFIER LETTER SMALL TURNED A +0251 ; [.1BD0.0020.0002] # LATIN SMALL LETTER ALPHA +1DE7 ; [.1BD0.0020.0004] # COMBINING LATIN SMALL LETTER ALPHA +2C6D ; [.1BD0.0020.0008] # LATIN CAPITAL LETTER ALPHA +1D45 ; [.1BD0.0020.0014] # MODIFIER LETTER SMALL ALPHA +AB30 ; [.1BD4.0020.0002] # LATIN SMALL LETTER BARRED ALPHA +1D90 ; [.1BD5.0020.0002] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK +0252 ; [.1BD6.0020.0002] # LATIN SMALL LETTER TURNED ALPHA +2C70 ; [.1BD6.0020.0008] # LATIN CAPITAL LETTER TURNED ALPHA +1D9B ; [.1BD6.0020.0014] # MODIFIER LETTER SMALL TURNED ALPHA +AB64 ; [.1BDA.0020.0002] # LATIN SMALL LETTER INVERTED ALPHA +0062 ; [.1BDB.0020.0002] # LATIN SMALL LETTER B +FF42 ; [.1BDB.0020.0003] # FULLWIDTH LATIN SMALL LETTER B +1DE8 ; [.1BDB.0020.0004] # COMBINING LATIN SMALL LETTER B +249D ; [*0310.0020.0004][.1BDB.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER B +1D41B ; [.1BDB.0020.0005] # MATHEMATICAL BOLD SMALL B +1D44F ; [.1BDB.0020.0005] # MATHEMATICAL ITALIC SMALL B +1D483 ; [.1BDB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL B +1D4B7 ; [.1BDB.0020.0005] # MATHEMATICAL SCRIPT SMALL B +1D4EB ; [.1BDB.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL B +1D51F ; [.1BDB.0020.0005] # MATHEMATICAL FRAKTUR SMALL B +1D553 ; [.1BDB.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL B +1D587 ; [.1BDB.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL B +1D5BB ; [.1BDB.0020.0005] # MATHEMATICAL SANS-SERIF SMALL B +1D5EF ; [.1BDB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL B +1D623 ; [.1BDB.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D657 ; [.1BDB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D68B ; [.1BDB.0020.0005] # MATHEMATICAL MONOSPACE SMALL B +24D1 ; [.1BDB.0020.0006] # CIRCLED LATIN SMALL LETTER B +0042 ; [.1BDB.0020.0008] # LATIN CAPITAL LETTER B +FF22 ; [.1BDB.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER B +1F111 ; [*0310.0020.0004][.1BDB.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER B +212C ; [.1BDB.0020.000B] # SCRIPT CAPITAL B +1D401 ; [.1BDB.0020.000B] # MATHEMATICAL BOLD CAPITAL B +1D435 ; [.1BDB.0020.000B] # MATHEMATICAL ITALIC CAPITAL B +1D469 ; [.1BDB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL B +1D4D1 ; [.1BDB.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL B +1D505 ; [.1BDB.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL B +1D539 ; [.1BDB.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D56D ; [.1BDB.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D5A1 ; [.1BDB.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL B +1D5D5 ; [.1BDB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D609 ; [.1BDB.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D63D ; [.1BDB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D671 ; [.1BDB.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL B +24B7 ; [.1BDB.0020.000C] # CIRCLED LATIN CAPITAL LETTER B +1F151 ; [.1BDB.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER B +1D47 ; [.1BDB.0020.0014] # MODIFIER LETTER SMALL B +1D2E ; [.1BDB.0020.001D] # MODIFIER LETTER CAPITAL B +1F131 ; [.1BDB.0020.001D] # SQUARED LATIN CAPITAL LETTER B +1F171 ; [.1BDB.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER B +1E03 ; [.1BDB.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER B WITH DOT ABOVE +1E02 ; [.1BDB.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E05 ; [.1BDB.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER B WITH DOT BELOW +1E04 ; [.1BDB.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER B WITH DOT BELOW +1E07 ; [.1BDB.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER B WITH LINE BELOW +1E06 ; [.1BDB.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER B WITH LINE BELOW +3374 ; [.1BDB.0020.001C][.1BC2.0020.001C][.1DAE.0020.001C] # SQUARE BAR +33C3 ; [.1BDB.0020.001D][.1D9C.0020.001C] # SQUARE BQ +0299 ; [.1BDF.0020.0002] # LATIN LETTER SMALL CAPITAL B +0180 ; [.1BE3.0020.0002] # LATIN SMALL LETTER B WITH STROKE +0243 ; [.1BE3.0020.0008] # LATIN CAPITAL LETTER B WITH STROKE +1D2F ; [.1BE7.0020.0002] # MODIFIER LETTER CAPITAL BARRED B +1D03 ; [.1BE8.0020.0002] # LATIN LETTER SMALL CAPITAL BARRED B +1D6C ; [.1BE9.0020.0002] # LATIN SMALL LETTER B WITH MIDDLE TILDE +A797 ; [.1BEA.0020.0002] # LATIN SMALL LETTER B WITH FLOURISH +A796 ; [.1BEA.0020.0008] # LATIN CAPITAL LETTER B WITH FLOURISH +1D80 ; [.1BEB.0020.0002] # LATIN SMALL LETTER B WITH PALATAL HOOK +0253 ; [.1BEC.0020.0002] # LATIN SMALL LETTER B WITH HOOK +0181 ; [.1BEC.0020.0008] # LATIN CAPITAL LETTER B WITH HOOK +0183 ; [.1BF0.0020.0002] # LATIN SMALL LETTER B WITH TOPBAR +0182 ; [.1BF0.0020.0008] # LATIN CAPITAL LETTER B WITH TOPBAR +A7B5 ; [.1BF4.0020.0002] # LATIN SMALL LETTER BETA +1DE9 ; [.1BF4.0020.0004] # COMBINING LATIN SMALL LETTER BETA +A7B4 ; [.1BF4.0020.0008] # LATIN CAPITAL LETTER BETA +0063 ; [.1BF5.0020.0002] # LATIN SMALL LETTER C +FF43 ; [.1BF5.0020.0003] # FULLWIDTH LATIN SMALL LETTER C +0368 ; [.1BF5.0020.0004] # COMBINING LATIN SMALL LETTER C +217D ; [.1BF5.0020.0004] # SMALL ROMAN NUMERAL ONE HUNDRED +249E ; [*0310.0020.0004][.1BF5.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER C +1D41C ; [.1BF5.0020.0005] # MATHEMATICAL BOLD SMALL C +1D450 ; [.1BF5.0020.0005] # MATHEMATICAL ITALIC SMALL C +1D484 ; [.1BF5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL C +1D4B8 ; [.1BF5.0020.0005] # MATHEMATICAL SCRIPT SMALL C +1D4EC ; [.1BF5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL C +1D520 ; [.1BF5.0020.0005] # MATHEMATICAL FRAKTUR SMALL C +1D554 ; [.1BF5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL C +1D588 ; [.1BF5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL C +1D5BC ; [.1BF5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL C +1D5F0 ; [.1BF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL C +1D624 ; [.1BF5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D658 ; [.1BF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D68C ; [.1BF5.0020.0005] # MATHEMATICAL MONOSPACE SMALL C +24D2 ; [.1BF5.0020.0006] # CIRCLED LATIN SMALL LETTER C +0043 ; [.1BF5.0020.0008] # LATIN CAPITAL LETTER C +FF23 ; [.1BF5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER C +2103 ; [*04D7.0020.0004][.1BF5.0020.000A] # DEGREE CELSIUS +216D ; [.1BF5.0020.000A] # ROMAN NUMERAL ONE HUNDRED +1F112 ; [*0310.0020.0004][.1BF5.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER C +2102 ; [.1BF5.0020.000B] # DOUBLE-STRUCK CAPITAL C +212D ; [.1BF5.0020.000B] # BLACK-LETTER CAPITAL C +1D402 ; [.1BF5.0020.000B] # MATHEMATICAL BOLD CAPITAL C +1D436 ; [.1BF5.0020.000B] # MATHEMATICAL ITALIC CAPITAL C +1D46A ; [.1BF5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL C +1D49E ; [.1BF5.0020.000B] # MATHEMATICAL SCRIPT CAPITAL C +1D4D2 ; [.1BF5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL C +1D56E ; [.1BF5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D5A2 ; [.1BF5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL C +1D5D6 ; [.1BF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D60A ; [.1BF5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D63E ; [.1BF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D672 ; [.1BF5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL C +24B8 ; [.1BF5.0020.000C] # CIRCLED LATIN CAPITAL LETTER C +1F12B ; [.1BF5.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER C +1F152 ; [.1BF5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER C +1D9C ; [.1BF5.0020.0014] # MODIFIER LETTER SMALL C +1F132 ; [.1BF5.0020.001D] # SQUARED LATIN CAPITAL LETTER C +1F172 ; [.1BF5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER C +0107 ; [.1BF5.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH ACUTE +0106 ; [.1BF5.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH ACUTE +0109 ; [.1BF5.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER C WITH CIRCUMFLEX +0108 ; [.1BF5.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010D ; [.1BF5.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER C WITH CARON +010C ; [.1BF5.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER C WITH CARON +010B ; [.1BF5.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER C WITH DOT ABOVE +010A ; [.1BF5.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER C WITH DOT ABOVE +00E7 ; [.1BF5.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER C WITH CEDILLA +1DD7 ; [.1BF5.0020.0004][.0000.0030.0004] # COMBINING LATIN SMALL LETTER C CEDILLA +00C7 ; [.1BF5.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER C WITH CEDILLA +1E09 ; [.1BF5.0020.0002][.0000.0030.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E08 ; [.1BF5.0020.0008][.0000.0030.0002][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +3388 ; [.1BF5.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] # SQUARE CAL +33C4 ; [.1BF5.0020.001C][.1BF5.0020.001C] # SQUARE CC +1F12D ; [.1BF5.0020.000C][.1C0A.0020.000C] # CIRCLED CD +33C5 ; [.1BF5.0020.001C][.1C0A.0020.001C] # SQUARE CD +33C6 ; [.1BF5.0020.001D][*0605.0020.001C][.1CE0.0020.001C][.1C6F.0020.001C] # SQUARE C OVER KG +1F191 ; [.1BF5.0020.001D][.1CF2.0020.001D] # SQUARED CL +339D ; [.1BF5.0020.001C][.1D25.0020.001C] # SQUARE CM +33A0 ; [.1BF5.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] # SQUARE CM SQUARED +33A4 ; [.1BF5.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] # SQUARE CM CUBED +2105 ; [.1BF5.0020.0004][*038D.0020.0004][.1D58.0020.0004] # CARE OF +33C7 ; [.1BF5.0020.001D][.1D58.0020.001C][*0274.0020.001C] # SQUARE CO +1F192 ; [.1BF5.0020.001D][.1D58.0020.001D][.1D58.0020.001D][.1CF2.0020.001D] # SQUARED COOL +2106 ; [.1BF5.0020.0004][*038D.0020.0004][.1E30.0020.0004] # CADA UNA +1D04 ; [.1BF9.0020.0002] # LATIN LETTER SMALL CAPITAL C +023C ; [.1BFA.0020.0002] # LATIN SMALL LETTER C WITH STROKE +023B ; [.1BFA.0020.0008] # LATIN CAPITAL LETTER C WITH STROKE +A793 ; [.1BFE.0020.0002] # LATIN SMALL LETTER C WITH BAR +A792 ; [.1BFE.0020.0008] # LATIN CAPITAL LETTER C WITH BAR +A794 ; [.1BFF.0020.0002] # LATIN SMALL LETTER C WITH PALATAL HOOK +0188 ; [.1C00.0020.0002] # LATIN SMALL LETTER C WITH HOOK +0187 ; [.1C00.0020.0008] # LATIN CAPITAL LETTER C WITH HOOK +0255 ; [.1C04.0020.0002] # LATIN SMALL LETTER C WITH CURL +1D9D ; [.1C04.0020.0014] # MODIFIER LETTER SMALL C WITH CURL +2184 ; [.1C08.0020.0002] # LATIN SMALL LETTER REVERSED C +2183 ; [.1C08.0020.0008] # ROMAN NUMERAL REVERSED ONE HUNDRED +A73F ; [.1C09.0020.0002] # LATIN SMALL LETTER REVERSED C WITH DOT +A73E ; [.1C09.0020.0008] # LATIN CAPITAL LETTER REVERSED C WITH DOT +0064 ; [.1C0A.0020.0002] # LATIN SMALL LETTER D +FF44 ; [.1C0A.0020.0003] # FULLWIDTH LATIN SMALL LETTER D +0369 ; [.1C0A.0020.0004] # COMBINING LATIN SMALL LETTER D +217E ; [.1C0A.0020.0004] # SMALL ROMAN NUMERAL FIVE HUNDRED +249F ; [*0310.0020.0004][.1C0A.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER D +2146 ; [.1C0A.0020.0005] # DOUBLE-STRUCK ITALIC SMALL D +1D41D ; [.1C0A.0020.0005] # MATHEMATICAL BOLD SMALL D +1D451 ; [.1C0A.0020.0005] # MATHEMATICAL ITALIC SMALL D +1D485 ; [.1C0A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL D +1D4B9 ; [.1C0A.0020.0005] # MATHEMATICAL SCRIPT SMALL D +1D4ED ; [.1C0A.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL D +1D521 ; [.1C0A.0020.0005] # MATHEMATICAL FRAKTUR SMALL D +1D555 ; [.1C0A.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL D +1D589 ; [.1C0A.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL D +1D5BD ; [.1C0A.0020.0005] # MATHEMATICAL SANS-SERIF SMALL D +1D5F1 ; [.1C0A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL D +1D625 ; [.1C0A.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D659 ; [.1C0A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D68D ; [.1C0A.0020.0005] # MATHEMATICAL MONOSPACE SMALL D +24D3 ; [.1C0A.0020.0006] # CIRCLED LATIN SMALL LETTER D +0044 ; [.1C0A.0020.0008] # LATIN CAPITAL LETTER D +FF24 ; [.1C0A.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER D +216E ; [.1C0A.0020.000A] # ROMAN NUMERAL FIVE HUNDRED +1F113 ; [*0310.0020.0004][.1C0A.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER D +2145 ; [.1C0A.0020.000B] # DOUBLE-STRUCK ITALIC CAPITAL D +1D403 ; [.1C0A.0020.000B] # MATHEMATICAL BOLD CAPITAL D +1D437 ; [.1C0A.0020.000B] # MATHEMATICAL ITALIC CAPITAL D +1D46B ; [.1C0A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL D +1D49F ; [.1C0A.0020.000B] # MATHEMATICAL SCRIPT CAPITAL D +1D4D3 ; [.1C0A.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL D +1D507 ; [.1C0A.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL D +1D53B ; [.1C0A.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D56F ; [.1C0A.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D5A3 ; [.1C0A.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL D +1D5D7 ; [.1C0A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D60B ; [.1C0A.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D63F ; [.1C0A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D673 ; [.1C0A.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL D +24B9 ; [.1C0A.0020.000C] # CIRCLED LATIN CAPITAL LETTER D +1F153 ; [.1C0A.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER D +1D48 ; [.1C0A.0020.0014] # MODIFIER LETTER SMALL D +1D30 ; [.1C0A.0020.001D] # MODIFIER LETTER CAPITAL D +1F133 ; [.1C0A.0020.001D] # SQUARED LATIN CAPITAL LETTER D +1F173 ; [.1C0A.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER D +010F ; [.1C0A.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER D WITH CARON +010E ; [.1C0A.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER D WITH CARON +1E0B ; [.1C0A.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER D WITH DOT ABOVE +1E0A ; [.1C0A.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E11 ; [.1C0A.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER D WITH CEDILLA +1E10 ; [.1C0A.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER D WITH CEDILLA +0111 ; [.1C0A.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER D WITH STROKE +0110 ; [.1C0A.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER D WITH STROKE +1E0D ; [.1C0A.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER D WITH DOT BELOW +1E0C ; [.1C0A.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER D WITH DOT BELOW +1E13 ; [.1C0A.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E12 ; [.1C0A.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E0F ; [.1C0A.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER D WITH LINE BELOW +1E0E ; [.1C0A.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER D WITH LINE BELOW +00F0 ; [.1C0A.0020.0004][.0000.010B.0004] # LATIN SMALL LETTER ETH +1DD9 ; [.1C0A.0020.0004][.0000.010B.0004] # COMBINING LATIN SMALL LETTER ETH +00D0 ; [.1C0A.0020.000A][.0000.010B.0004] # LATIN CAPITAL LETTER ETH +1D9E ; [.1C0A.0020.0014][.0000.010B.0014] # MODIFIER LETTER SMALL ETH +1DD8 ; [.1C0A.0020.0004][.0000.010C.0004] # COMBINING LATIN SMALL LETTER INSULAR D +A77A ; [.1C0A.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR D +A779 ; [.1C0A.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR D +3372 ; [.1C0A.0020.001C][.1BC2.0020.001C] # SQUARE DA +0238 ; [.1C0A.0020.0004][.1BDB.0020.0004] # LATIN SMALL LETTER DB DIGRAPH +33C8 ; [.1C0A.0020.001C][.1BDB.0020.001D] # SQUARE DB +1F190 ; [.1C0A.0020.001D][.1CC7.0020.001D] # SQUARE DJ +3397 ; [.1C0A.0020.001C][.1CF2.0020.001C] # SQUARE DL +3377 ; [.1C0A.0020.001C][.1D25.0020.001C] # SQUARE DM +3378 ; [.1C0A.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] # SQUARE DM SQUARED +3379 ; [.1C0A.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] # SQUARE DM CUBED +01F3 ; [.1C0A.0020.0004][.1E9C.0020.0004] # LATIN SMALL LETTER DZ +02A3 ; [.1C0A.0020.0004][.1E9C.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH +01F2 ; [.1C0A.0020.000A][.1E9C.0020.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F1 ; [.1C0A.0020.000A][.1E9C.0020.000A] # LATIN CAPITAL LETTER DZ +01C6 ; [.1C0A.0020.0004][.1E9C.0020.0004][.0000.0028.0004] # LATIN SMALL LETTER DZ WITH CARON +01C5 ; [.1C0A.0020.000A][.1E9C.0020.0004][.0000.0028.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C4 ; [.1C0A.0020.000A][.1E9C.0020.000A][.0000.0028.0004] # LATIN CAPITAL LETTER DZ WITH CARON +02A5 ; [.1C0A.0020.0004][.1EAF.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL +02A4 ; [.1C0A.0020.0004][.1EB9.0020.0004] # LATIN SMALL LETTER DEZH DIGRAPH +1D05 ; [.1C0E.0020.0002] # LATIN LETTER SMALL CAPITAL D +1D06 ; [.1C0F.0020.0002] # LATIN LETTER SMALL CAPITAL ETH +1D6D ; [.1C10.0020.0002] # LATIN SMALL LETTER D WITH MIDDLE TILDE +1D81 ; [.1C11.0020.0002] # LATIN SMALL LETTER D WITH PALATAL HOOK +0256 ; [.1C12.0020.0002] # LATIN SMALL LETTER D WITH TAIL +0189 ; [.1C12.0020.0008] # LATIN CAPITAL LETTER AFRICAN D +0257 ; [.1C16.0020.0002] # LATIN SMALL LETTER D WITH HOOK +018A ; [.1C16.0020.0008] # LATIN CAPITAL LETTER D WITH HOOK +1D91 ; [.1C1A.0020.0002] # LATIN SMALL LETTER D WITH HOOK AND TAIL +018C ; [.1C1B.0020.0002] # LATIN SMALL LETTER D WITH TOPBAR +018B ; [.1C1B.0020.0008] # LATIN CAPITAL LETTER D WITH TOPBAR +0221 ; [.1C1F.0020.0002] # LATIN SMALL LETTER D WITH CURL +A771 ; [.1C23.0020.0002] # LATIN SMALL LETTER DUM +1E9F ; [.1C24.0020.0002] # LATIN SMALL LETTER DELTA +0065 ; [.1C25.0020.0002] # LATIN SMALL LETTER E +FF45 ; [.1C25.0020.0003] # FULLWIDTH LATIN SMALL LETTER E +0364 ; [.1C25.0020.0004] # COMBINING LATIN SMALL LETTER E +24A0 ; [*0310.0020.0004][.1C25.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER E +212F ; [.1C25.0020.0005] # SCRIPT SMALL E +2147 ; [.1C25.0020.0005] # DOUBLE-STRUCK ITALIC SMALL E +1D41E ; [.1C25.0020.0005] # MATHEMATICAL BOLD SMALL E +1D452 ; [.1C25.0020.0005] # MATHEMATICAL ITALIC SMALL E +1D486 ; [.1C25.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL E +1D4EE ; [.1C25.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL E +1D522 ; [.1C25.0020.0005] # MATHEMATICAL FRAKTUR SMALL E +1D556 ; [.1C25.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL E +1D58A ; [.1C25.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL E +1D5BE ; [.1C25.0020.0005] # MATHEMATICAL SANS-SERIF SMALL E +1D5F2 ; [.1C25.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL E +1D626 ; [.1C25.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D65A ; [.1C25.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D68E ; [.1C25.0020.0005] # MATHEMATICAL MONOSPACE SMALL E +24D4 ; [.1C25.0020.0006] # CIRCLED LATIN SMALL LETTER E +0045 ; [.1C25.0020.0008] # LATIN CAPITAL LETTER E +FF25 ; [.1C25.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER E +1F114 ; [*0310.0020.0004][.1C25.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER E +2130 ; [.1C25.0020.000B] # SCRIPT CAPITAL E +1D404 ; [.1C25.0020.000B] # MATHEMATICAL BOLD CAPITAL E +1D438 ; [.1C25.0020.000B] # MATHEMATICAL ITALIC CAPITAL E +1D46C ; [.1C25.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL E +1D4D4 ; [.1C25.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL E +1D508 ; [.1C25.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL E +1D53C ; [.1C25.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D570 ; [.1C25.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D5A4 ; [.1C25.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL E +1D5D8 ; [.1C25.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D60C ; [.1C25.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D640 ; [.1C25.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D674 ; [.1C25.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL E +24BA ; [.1C25.0020.000C] # CIRCLED LATIN CAPITAL LETTER E +1F154 ; [.1C25.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER E +1D49 ; [.1C25.0020.0014] # MODIFIER LETTER SMALL E +2091 ; [.1C25.0020.0015] # LATIN SUBSCRIPT SMALL LETTER E +1D31 ; [.1C25.0020.001D] # MODIFIER LETTER CAPITAL E +1F134 ; [.1C25.0020.001D] # SQUARED LATIN CAPITAL LETTER E +1F174 ; [.1C25.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER E +00E9 ; [.1C25.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH ACUTE +00C9 ; [.1C25.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH ACUTE +00E8 ; [.1C25.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH GRAVE +00C8 ; [.1C25.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH GRAVE +0115 ; [.1C25.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH BREVE +0114 ; [.1C25.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH BREVE +00EA ; [.1C25.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX +00CA ; [.1C25.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +1EBF ; [.1C25.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBE ; [.1C25.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC1 ; [.1C25.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC0 ; [.1C25.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC5 ; [.1C25.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC4 ; [.1C25.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC3 ; [.1C25.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC2 ; [.1C25.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +011B ; [.1C25.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER E WITH CARON +011A ; [.1C25.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER E WITH CARON +00EB ; [.1C25.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER E WITH DIAERESIS +00CB ; [.1C25.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER E WITH DIAERESIS +1EBD ; [.1C25.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH TILDE +1EBC ; [.1C25.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH TILDE +0117 ; [.1C25.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER E WITH DOT ABOVE +0116 ; [.1C25.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER E WITH DOT ABOVE +0229 ; [.1C25.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER E WITH CEDILLA +0228 ; [.1C25.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER E WITH CEDILLA +1E1D ; [.1C25.0020.0002][.0000.0030.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1C ; [.1C25.0020.0008][.0000.0030.0002][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +0119 ; [.1C25.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER E WITH OGONEK +0118 ; [.1C25.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER E WITH OGONEK +0113 ; [.1C25.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER E WITH MACRON +0112 ; [.1C25.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER E WITH MACRON +1E17 ; [.1C25.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E16 ; [.1C25.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E15 ; [.1C25.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E14 ; [.1C25.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1EBB ; [.1C25.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH HOOK ABOVE +1EBA ; [.1C25.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH HOOK ABOVE +0205 ; [.1C25.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER E WITH DOUBLE GRAVE +0204 ; [.1C25.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0207 ; [.1C25.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER E WITH INVERTED BREVE +0206 ; [.1C25.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER E WITH INVERTED BREVE +1EB9 ; [.1C25.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER E WITH DOT BELOW +1EB8 ; [.1C25.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER E WITH DOT BELOW +1EC7 ; [.1C25.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC6 ; [.1C25.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1E19 ; [.1C25.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E18 ; [.1C25.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1B ; [.1C25.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER E WITH TILDE BELOW +1E1A ; [.1C25.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER E WITH TILDE BELOW +32CD ; [.1C25.0020.001C][.1DAE.0020.001C][.1C6F.0020.001C] # SQUARE ERG +32CE ; [.1C25.0020.001C][.1E5E.0020.001D] # SQUARE EV +1D07 ; [.1C29.0020.0002] # LATIN LETTER SMALL CAPITAL E +AB32 ; [.1C2A.0020.0002] # LATIN SMALL LETTER BLACKLETTER E +AB33 ; [.1C2B.0020.0002] # LATIN SMALL LETTER BARRED E +0247 ; [.1C2C.0020.0002] # LATIN SMALL LETTER E WITH STROKE +0246 ; [.1C2C.0020.0008] # LATIN CAPITAL LETTER E WITH STROKE +1D92 ; [.1C30.0020.0002] # LATIN SMALL LETTER E WITH RETROFLEX HOOK +AB34 ; [.1C31.0020.0002] # LATIN SMALL LETTER E WITH FLOURISH +2C78 ; [.1C32.0020.0002] # LATIN SMALL LETTER E WITH NOTCH +01DD ; [.1C33.0020.0002] # LATIN SMALL LETTER TURNED E +018E ; [.1C33.0020.0008] # LATIN CAPITAL LETTER REVERSED E +1D32 ; [.1C33.0020.001D] # MODIFIER LETTER CAPITAL REVERSED E +2C7B ; [.1C37.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED E +0259 ; [.1C38.0020.0002] # LATIN SMALL LETTER SCHWA +1DEA ; [.1C38.0020.0004] # COMBINING LATIN SMALL LETTER SCHWA +018F ; [.1C38.0020.0008] # LATIN CAPITAL LETTER SCHWA +1D4A ; [.1C38.0020.0014] # MODIFIER LETTER SMALL SCHWA +2094 ; [.1C38.0020.0015] # LATIN SUBSCRIPT SMALL LETTER SCHWA +1D95 ; [.1C3C.0020.0002] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK +025B ; [.1C3D.0020.0002] # LATIN SMALL LETTER OPEN E +0190 ; [.1C3D.0020.0008] # LATIN CAPITAL LETTER OPEN E +2107 ; [.1C3D.0020.000A] # EULER CONSTANT +1D4B ; [.1C3D.0020.0014] # MODIFIER LETTER SMALL OPEN E +1D93 ; [.1C41.0020.0002] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK +0258 ; [.1C42.0020.0002] # LATIN SMALL LETTER REVERSED E +025A ; [.1C46.0020.0002] # LATIN SMALL LETTER SCHWA WITH HOOK +025C ; [.1C4A.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E +A7AB ; [.1C4A.0020.0008] # LATIN CAPITAL LETTER REVERSED OPEN E +1D9F ; [.1C4A.0020.0014] # MODIFIER LETTER SMALL REVERSED OPEN E +1D94 ; [.1C4E.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK +1D08 ; [.1C4F.0020.0002] # LATIN SMALL LETTER TURNED OPEN E +1D4C ; [.1C4F.0020.0014] # MODIFIER LETTER SMALL TURNED OPEN E +025D ; [.1C50.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK +025E ; [.1C54.0020.0002] # LATIN SMALL LETTER CLOSED REVERSED OPEN E +029A ; [.1C58.0020.0002] # LATIN SMALL LETTER CLOSED OPEN E +0264 ; [.1C5C.0020.0002] # LATIN SMALL LETTER RAMS HORN +0066 ; [.1C60.0020.0002] # LATIN SMALL LETTER F +FF46 ; [.1C60.0020.0003] # FULLWIDTH LATIN SMALL LETTER F +1DEB ; [.1C60.0020.0004] # COMBINING LATIN SMALL LETTER F +24A1 ; [*0310.0020.0004][.1C60.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER F +1D41F ; [.1C60.0020.0005] # MATHEMATICAL BOLD SMALL F +1D453 ; [.1C60.0020.0005] # MATHEMATICAL ITALIC SMALL F +1D487 ; [.1C60.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL F +1D4BB ; [.1C60.0020.0005] # MATHEMATICAL SCRIPT SMALL F +1D4EF ; [.1C60.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL F +1D523 ; [.1C60.0020.0005] # MATHEMATICAL FRAKTUR SMALL F +1D557 ; [.1C60.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL F +1D58B ; [.1C60.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL F +1D5BF ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF SMALL F +1D5F3 ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL F +1D627 ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D65B ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D68F ; [.1C60.0020.0005] # MATHEMATICAL MONOSPACE SMALL F +24D5 ; [.1C60.0020.0006] # CIRCLED LATIN SMALL LETTER F +0046 ; [.1C60.0020.0008] # LATIN CAPITAL LETTER F +FF26 ; [.1C60.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER F +2109 ; [*04D7.0020.0004][.1C60.0020.000A] # DEGREE FAHRENHEIT +1F115 ; [*0310.0020.0004][.1C60.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER F +2131 ; [.1C60.0020.000B] # SCRIPT CAPITAL F +1D405 ; [.1C60.0020.000B] # MATHEMATICAL BOLD CAPITAL F +1D439 ; [.1C60.0020.000B] # MATHEMATICAL ITALIC CAPITAL F +1D46D ; [.1C60.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL F +1D4D5 ; [.1C60.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL F +1D509 ; [.1C60.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL F +1D53D ; [.1C60.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D571 ; [.1C60.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D5A5 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL F +1D5D9 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D60D ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D641 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D675 ; [.1C60.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL F +24BB ; [.1C60.0020.000C] # CIRCLED LATIN CAPITAL LETTER F +1F155 ; [.1C60.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER F +1DA0 ; [.1C60.0020.0014] # MODIFIER LETTER SMALL F +1F135 ; [.1C60.0020.001D] # SQUARED LATIN CAPITAL LETTER F +1F175 ; [.1C60.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER F +1E1F ; [.1C60.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER F WITH DOT ABOVE +1E1E ; [.1C60.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER F WITH DOT ABOVE +A77C ; [.1C60.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR F +A77B ; [.1C60.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR F +213B ; [.1C60.0020.000A][.1BC2.0020.000A][.1E7A.0020.000A] # FACSIMILE SIGN +FB00 ; [.1C60.0020.0004][.1C60.0020.0004] # LATIN SMALL LIGATURE FF +FB03 ; [.1C60.0020.0004][.1C60.0020.0004][.1CAD.0020.0004] # LATIN SMALL LIGATURE FFI +FB04 ; [.1C60.0020.0004][.1C60.0020.0004][.1CF2.0020.0004] # LATIN SMALL LIGATURE FFL +FB01 ; [.1C60.0020.0004][.1CAD.0020.0004] # LATIN SMALL LIGATURE FI +FB02 ; [.1C60.0020.0004][.1CF2.0020.0004] # LATIN SMALL LIGATURE FL +3399 ; [.1C60.0020.001C][.1D25.0020.001C] # SQUARE FM +02A9 ; [.1C60.0020.0004][.1D53.0020.0004] # LATIN SMALL LETTER FENG DIGRAPH +1F193 ; [.1C60.0020.001D][.1DAE.0020.001D][.1C25.0020.001D][.1C25.0020.001D] # SQUARED FREE +A730 ; [.1C64.0020.0002] # LATIN LETTER SMALL CAPITAL F +AB35 ; [.1C65.0020.0002] # LATIN SMALL LETTER LENIS F +A799 ; [.1C66.0020.0002] # LATIN SMALL LETTER F WITH STROKE +A798 ; [.1C66.0020.0008] # LATIN CAPITAL LETTER F WITH STROKE +1D6E ; [.1C67.0020.0002] # LATIN SMALL LETTER F WITH MIDDLE TILDE +1D82 ; [.1C68.0020.0002] # LATIN SMALL LETTER F WITH PALATAL HOOK +0192 ; [.1C69.0020.0002] # LATIN SMALL LETTER F WITH HOOK +0191 ; [.1C69.0020.0008] # LATIN CAPITAL LETTER F WITH HOOK +214E ; [.1C6D.0020.0002] # TURNED SMALL F +2132 ; [.1C6D.0020.0008] # TURNED CAPITAL F +A7FB ; [.1C6E.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED F +0067 ; [.1C6F.0020.0002] # LATIN SMALL LETTER G +FF47 ; [.1C6F.0020.0003] # FULLWIDTH LATIN SMALL LETTER G +1DDA ; [.1C6F.0020.0004] # COMBINING LATIN SMALL LETTER G +24A2 ; [*0310.0020.0004][.1C6F.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER G +210A ; [.1C6F.0020.0005] # SCRIPT SMALL G +1D420 ; [.1C6F.0020.0005] # MATHEMATICAL BOLD SMALL G +1D454 ; [.1C6F.0020.0005] # MATHEMATICAL ITALIC SMALL G +1D488 ; [.1C6F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL G +1D4F0 ; [.1C6F.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL G +1D524 ; [.1C6F.0020.0005] # MATHEMATICAL FRAKTUR SMALL G +1D558 ; [.1C6F.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL G +1D58C ; [.1C6F.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL G +1D5C0 ; [.1C6F.0020.0005] # MATHEMATICAL SANS-SERIF SMALL G +1D5F4 ; [.1C6F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL G +1D628 ; [.1C6F.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D65C ; [.1C6F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D690 ; [.1C6F.0020.0005] # MATHEMATICAL MONOSPACE SMALL G +24D6 ; [.1C6F.0020.0006] # CIRCLED LATIN SMALL LETTER G +0047 ; [.1C6F.0020.0008] # LATIN CAPITAL LETTER G +FF27 ; [.1C6F.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER G +1F116 ; [*0310.0020.0004][.1C6F.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER G +1D406 ; [.1C6F.0020.000B] # MATHEMATICAL BOLD CAPITAL G +1D43A ; [.1C6F.0020.000B] # MATHEMATICAL ITALIC CAPITAL G +1D46E ; [.1C6F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL G +1D4A2 ; [.1C6F.0020.000B] # MATHEMATICAL SCRIPT CAPITAL G +1D4D6 ; [.1C6F.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL G +1D50A ; [.1C6F.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL G +1D53E ; [.1C6F.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D572 ; [.1C6F.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D5A6 ; [.1C6F.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL G +1D5DA ; [.1C6F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D60E ; [.1C6F.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D642 ; [.1C6F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D676 ; [.1C6F.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL G +24BC ; [.1C6F.0020.000C] # CIRCLED LATIN CAPITAL LETTER G +1F156 ; [.1C6F.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER G +1D4D ; [.1C6F.0020.0014] # MODIFIER LETTER SMALL G +1D33 ; [.1C6F.0020.001D] # MODIFIER LETTER CAPITAL G +1F136 ; [.1C6F.0020.001D] # SQUARED LATIN CAPITAL LETTER G +1F176 ; [.1C6F.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER G +01F5 ; [.1C6F.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER G WITH ACUTE +01F4 ; [.1C6F.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER G WITH ACUTE +011F ; [.1C6F.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER G WITH BREVE +011E ; [.1C6F.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER G WITH BREVE +011D ; [.1C6F.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER G WITH CIRCUMFLEX +011C ; [.1C6F.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +01E7 ; [.1C6F.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER G WITH CARON +01E6 ; [.1C6F.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER G WITH CARON +0121 ; [.1C6F.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER G WITH DOT ABOVE +0120 ; [.1C6F.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER G WITH DOT ABOVE +0123 ; [.1C6F.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER G WITH CEDILLA +0122 ; [.1C6F.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER G WITH CEDILLA +1E21 ; [.1C6F.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER G WITH MACRON +1E20 ; [.1C6F.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER G WITH MACRON +A7A1 ; [.1C6F.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER G WITH OBLIQUE STROKE +A7A0 ; [.1C6F.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +1D79 ; [.1C6F.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR G +A77D ; [.1C6F.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR G +33FF ; [.1C6F.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] # SQUARE GAL +3387 ; [.1C6F.0020.001D][.1BDB.0020.001D] # SQUARE GB +3393 ; [.1C6F.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] # SQUARE GHZ +33AC ; [.1C6F.0020.001D][.1D87.0020.001D][.1BC2.0020.001C] # SQUARE GPA +33C9 ; [.1C6F.0020.001D][.1E86.0020.001C] # SQUARE GY +0261 ; [.1C73.0020.0002] # LATIN SMALL LETTER SCRIPT G +A7AC ; [.1C73.0020.0008] # LATIN CAPITAL LETTER SCRIPT G +1DA2 ; [.1C73.0020.0014] # MODIFIER LETTER SMALL SCRIPT G +AB36 ; [.1C77.0020.0002] # LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL +0262 ; [.1C78.0020.0002] # LATIN LETTER SMALL CAPITAL G +1DDB ; [.1C78.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL G +01E5 ; [.1C7C.0020.0002] # LATIN SMALL LETTER G WITH STROKE +01E4 ; [.1C7C.0020.0008] # LATIN CAPITAL LETTER G WITH STROKE +1D83 ; [.1C80.0020.0002] # LATIN SMALL LETTER G WITH PALATAL HOOK +0260 ; [.1C81.0020.0002] # LATIN SMALL LETTER G WITH HOOK +0193 ; [.1C81.0020.0008] # LATIN CAPITAL LETTER G WITH HOOK +029B ; [.1C85.0020.0002] # LATIN LETTER SMALL CAPITAL G WITH HOOK +1D77 ; [.1C89.0020.0002] # LATIN SMALL LETTER TURNED G +A77F ; [.1C8A.0020.0002] # LATIN SMALL LETTER TURNED INSULAR G +A77E ; [.1C8A.0020.0008] # LATIN CAPITAL LETTER TURNED INSULAR G +0263 ; [.1C8B.0020.0002] # LATIN SMALL LETTER GAMMA +0194 ; [.1C8B.0020.0008] # LATIN CAPITAL LETTER GAMMA +02E0 ; [.1C8B.0020.0014] # MODIFIER LETTER SMALL GAMMA +01A3 ; [.1C8F.0020.0002] # LATIN SMALL LETTER OI +01A2 ; [.1C8F.0020.0008] # LATIN CAPITAL LETTER OI +0068 ; [.1C93.0020.0002] # LATIN SMALL LETTER H +FF48 ; [.1C93.0020.0003] # FULLWIDTH LATIN SMALL LETTER H +036A ; [.1C93.0020.0004] # COMBINING LATIN SMALL LETTER H +24A3 ; [*0310.0020.0004][.1C93.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER H +210E ; [.1C93.0020.0005] # PLANCK CONSTANT +1D421 ; [.1C93.0020.0005] # MATHEMATICAL BOLD SMALL H +1D489 ; [.1C93.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL H +1D4BD ; [.1C93.0020.0005] # MATHEMATICAL SCRIPT SMALL H +1D4F1 ; [.1C93.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL H +1D525 ; [.1C93.0020.0005] # MATHEMATICAL FRAKTUR SMALL H +1D559 ; [.1C93.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL H +1D58D ; [.1C93.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL H +1D5C1 ; [.1C93.0020.0005] # MATHEMATICAL SANS-SERIF SMALL H +1D5F5 ; [.1C93.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL H +1D629 ; [.1C93.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D65D ; [.1C93.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D691 ; [.1C93.0020.0005] # MATHEMATICAL MONOSPACE SMALL H +24D7 ; [.1C93.0020.0006] # CIRCLED LATIN SMALL LETTER H +0048 ; [.1C93.0020.0008] # LATIN CAPITAL LETTER H +FF28 ; [.1C93.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER H +1F117 ; [*0310.0020.0004][.1C93.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER H +210B ; [.1C93.0020.000B] # SCRIPT CAPITAL H +210C ; [.1C93.0020.000B] # BLACK-LETTER CAPITAL H +210D ; [.1C93.0020.000B] # DOUBLE-STRUCK CAPITAL H +1D407 ; [.1C93.0020.000B] # MATHEMATICAL BOLD CAPITAL H +1D43B ; [.1C93.0020.000B] # MATHEMATICAL ITALIC CAPITAL H +1D46F ; [.1C93.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL H +1D4D7 ; [.1C93.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL H +1D573 ; [.1C93.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D5A7 ; [.1C93.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL H +1D5DB ; [.1C93.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D60F ; [.1C93.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D643 ; [.1C93.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D677 ; [.1C93.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL H +24BD ; [.1C93.0020.000C] # CIRCLED LATIN CAPITAL LETTER H +1F157 ; [.1C93.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H +02B0 ; [.1C93.0020.0014] # MODIFIER LETTER SMALL H +2095 ; [.1C93.0020.0015] # LATIN SUBSCRIPT SMALL LETTER H +1D34 ; [.1C93.0020.001D] # MODIFIER LETTER CAPITAL H +1F137 ; [.1C93.0020.001D] # SQUARED LATIN CAPITAL LETTER H +1F177 ; [.1C93.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER H +0125 ; [.1C93.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER H WITH CIRCUMFLEX +0124 ; [.1C93.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +021F ; [.1C93.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER H WITH CARON +021E ; [.1C93.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER H WITH CARON +1E27 ; [.1C93.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER H WITH DIAERESIS +1E26 ; [.1C93.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER H WITH DIAERESIS +1E23 ; [.1C93.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER H WITH DOT ABOVE +1E22 ; [.1C93.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E29 ; [.1C93.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER H WITH CEDILLA +1E28 ; [.1C93.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER H WITH CEDILLA +0127 ; [.1C93.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER H WITH STROKE +210F ; [.1C93.0020.0002][.0000.0039.0002] # PLANCK CONSTANT OVER TWO PI +0126 ; [.1C93.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER H WITH STROKE +A7F8 ; [.1C93.0020.0014][.0000.0039.0014] # MODIFIER LETTER CAPITAL H WITH STROKE +1E25 ; [.1C93.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER H WITH DOT BELOW +1E24 ; [.1C93.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER H WITH DOT BELOW +1E2B ; [.1C93.0020.0002][.0000.0047.0002] # LATIN SMALL LETTER H WITH BREVE BELOW +1E2A ; [.1C93.0020.0008][.0000.0047.0002] # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E96 ; [.1C93.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER H WITH LINE BELOW +33CA ; [.1C93.0020.001C][.1BC2.0020.001C] # SQUARE HA +32CC ; [.1C93.0020.001D][.1C6F.0020.001C] # SQUARE HG +33CB ; [.1C93.0020.001D][.1D87.0020.001D] # SQUARE HP +3371 ; [.1C93.0020.001C][.1D87.0020.001D][.1BC2.0020.001C] # SQUARE HPA +1F14A ; [.1C93.0020.001D][.1E5E.0020.001D] # SQUARED HV +3390 ; [.1C93.0020.001D][.1E9C.0020.001C] # SQUARE HZ +029C ; [.1C97.0020.0002] # LATIN LETTER SMALL CAPITAL H +0195 ; [.1C9B.0020.0002] # LATIN SMALL LETTER HV +01F6 ; [.1C9B.0020.0008] # LATIN CAPITAL LETTER HWAIR +A795 ; [.1C9F.0020.0002] # LATIN SMALL LETTER H WITH PALATAL HOOK +0266 ; [.1CA0.0020.0002] # LATIN SMALL LETTER H WITH HOOK +A7AA ; [.1CA0.0020.0008] # LATIN CAPITAL LETTER H WITH HOOK +02B1 ; [.1CA0.0020.0014] # MODIFIER LETTER SMALL H WITH HOOK +2C68 ; [.1CA4.0020.0002] # LATIN SMALL LETTER H WITH DESCENDER +2C67 ; [.1CA4.0020.0008] # LATIN CAPITAL LETTER H WITH DESCENDER +2C76 ; [.1CA5.0020.0002] # LATIN SMALL LETTER HALF H +2C75 ; [.1CA5.0020.0008] # LATIN CAPITAL LETTER HALF H +A727 ; [.1CA6.0020.0002] # LATIN SMALL LETTER HENG +A726 ; [.1CA6.0020.0008] # LATIN CAPITAL LETTER HENG +AB5C ; [.1CA6.0020.0014] # MODIFIER LETTER SMALL HENG +0267 ; [.1CA7.0020.0002] # LATIN SMALL LETTER HENG WITH HOOK +02BB ; [.1CAB.0020.0002] # MODIFIER LETTER TURNED COMMA +02BD ; [.1CAC.0020.0002] # MODIFIER LETTER REVERSED COMMA +0069 ; [.1CAD.0020.0002] # LATIN SMALL LETTER I +FF49 ; [.1CAD.0020.0003] # FULLWIDTH LATIN SMALL LETTER I +0365 ; [.1CAD.0020.0004] # COMBINING LATIN SMALL LETTER I +2170 ; [.1CAD.0020.0004] # SMALL ROMAN NUMERAL ONE +24A4 ; [*0310.0020.0004][.1CAD.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER I +2139 ; [.1CAD.0020.0005] # INFORMATION SOURCE +2148 ; [.1CAD.0020.0005] # DOUBLE-STRUCK ITALIC SMALL I +1D422 ; [.1CAD.0020.0005] # MATHEMATICAL BOLD SMALL I +1D456 ; [.1CAD.0020.0005] # MATHEMATICAL ITALIC SMALL I +1D48A ; [.1CAD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL I +1D4BE ; [.1CAD.0020.0005] # MATHEMATICAL SCRIPT SMALL I +1D4F2 ; [.1CAD.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL I +1D526 ; [.1CAD.0020.0005] # MATHEMATICAL FRAKTUR SMALL I +1D55A ; [.1CAD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL I +1D58E ; [.1CAD.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL I +1D5C2 ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF SMALL I +1D5F6 ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL I +1D62A ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D65E ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D692 ; [.1CAD.0020.0005] # MATHEMATICAL MONOSPACE SMALL I +24D8 ; [.1CAD.0020.0006] # CIRCLED LATIN SMALL LETTER I +0049 ; [.1CAD.0020.0008] # LATIN CAPITAL LETTER I +FF29 ; [.1CAD.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER I +2160 ; [.1CAD.0020.000A] # ROMAN NUMERAL ONE +1F118 ; [*0310.0020.0004][.1CAD.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER I +2110 ; [.1CAD.0020.000B] # SCRIPT CAPITAL I +2111 ; [.1CAD.0020.000B] # BLACK-LETTER CAPITAL I +1D408 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD CAPITAL I +1D43C ; [.1CAD.0020.000B] # MATHEMATICAL ITALIC CAPITAL I +1D470 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL I +1D4D8 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL I +1D540 ; [.1CAD.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D574 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D5A8 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL I +1D5DC ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D610 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D644 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D678 ; [.1CAD.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL I +24BE ; [.1CAD.0020.000C] # CIRCLED LATIN CAPITAL LETTER I +1F158 ; [.1CAD.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER I +2071 ; [.1CAD.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER I +1D62 ; [.1CAD.0020.0015] # LATIN SUBSCRIPT SMALL LETTER I +1D35 ; [.1CAD.0020.001D] # MODIFIER LETTER CAPITAL I +1F138 ; [.1CAD.0020.001D] # SQUARED LATIN CAPITAL LETTER I +1F178 ; [.1CAD.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER I +00ED ; [.1CAD.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH ACUTE +00CD ; [.1CAD.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH ACUTE +00EC ; [.1CAD.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER I WITH GRAVE +00CC ; [.1CAD.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER I WITH GRAVE +012D ; [.1CAD.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER I WITH BREVE +012C ; [.1CAD.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER I WITH BREVE +00EE ; [.1CAD.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER I WITH CIRCUMFLEX +00CE ; [.1CAD.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +01D0 ; [.1CAD.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER I WITH CARON +01CF ; [.1CAD.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER I WITH CARON +00EF ; [.1CAD.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER I WITH DIAERESIS +00CF ; [.1CAD.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS +1E2F ; [.1CAD.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E2E ; [.1CAD.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +0129 ; [.1CAD.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER I WITH TILDE +0128 ; [.1CAD.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER I WITH TILDE +0130 ; [.1CAD.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER I WITH DOT ABOVE +012F ; [.1CAD.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER I WITH OGONEK +012E ; [.1CAD.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER I WITH OGONEK +012B ; [.1CAD.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER I WITH MACRON +012A ; [.1CAD.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER I WITH MACRON +1EC9 ; [.1CAD.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER I WITH HOOK ABOVE +1EC8 ; [.1CAD.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER I WITH HOOK ABOVE +0209 ; [.1CAD.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER I WITH DOUBLE GRAVE +0208 ; [.1CAD.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020B ; [.1CAD.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER I WITH INVERTED BREVE +020A ; [.1CAD.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER I WITH INVERTED BREVE +1ECB ; [.1CAD.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER I WITH DOT BELOW +1ECA ; [.1CAD.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER I WITH DOT BELOW +1E2D ; [.1CAD.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER I WITH TILDE BELOW +1E2C ; [.1CAD.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER I WITH TILDE BELOW +1F18B ; [.1CAD.0020.001D][.1BF5.0020.001D] # NEGATIVE SQUARED IC +1F194 ; [.1CAD.0020.001D][.1C0A.0020.001D] # SQUARED ID +2171 ; [.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL TWO +2161 ; [.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL TWO +2172 ; [.1CAD.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL THREE +2162 ; [.1CAD.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL THREE +0133 ; [.1CAD.0020.0004][.1CC7.0020.0004] # LATIN SMALL LIGATURE IJ +0132 ; [.1CAD.0020.000A][.1CC7.0020.000A] # LATIN CAPITAL LIGATURE IJ +33CC ; [.1CAD.0020.001C][.1D34.0020.001C] # SQUARE IN +337A ; [.1CAD.0020.001D][.1E30.0020.001D] # SQUARE IU +2173 ; [.1CAD.0020.0004][.1E5E.0020.0004] # SMALL ROMAN NUMERAL FOUR +2163 ; [.1CAD.0020.000A][.1E5E.0020.000A] # ROMAN NUMERAL FOUR +2178 ; [.1CAD.0020.0004][.1E7A.0020.0004] # SMALL ROMAN NUMERAL NINE +2168 ; [.1CAD.0020.000A][.1E7A.0020.000A] # ROMAN NUMERAL NINE +0131 ; [.1CB1.0020.0002] # LATIN SMALL LETTER DOTLESS I +1D6A4 ; [.1CB1.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS I +026A ; [.1CB5.0020.0002] # LATIN LETTER SMALL CAPITAL I +1DA6 ; [.1CB5.0020.0014] # MODIFIER LETTER SMALL CAPITAL I +A7FE ; [.1CB9.0020.0002] # LATIN EPIGRAPHIC LETTER I LONGA +A7F7 ; [.1CBA.0020.0002] # LATIN EPIGRAPHIC LETTER SIDEWAYS I +1D09 ; [.1CBB.0020.0002] # LATIN SMALL LETTER TURNED I +1D4E ; [.1CBB.0020.0014] # MODIFIER LETTER SMALL TURNED I +0268 ; [.1CBC.0020.0002] # LATIN SMALL LETTER I WITH STROKE +0197 ; [.1CBC.0020.0008] # LATIN CAPITAL LETTER I WITH STROKE +1DA4 ; [.1CBC.0020.0014] # MODIFIER LETTER SMALL I WITH STROKE +1D7B ; [.1CC0.0020.0002] # LATIN SMALL CAPITAL LETTER I WITH STROKE +1DA7 ; [.1CC0.0020.0014] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE +1D96 ; [.1CC1.0020.0002] # LATIN SMALL LETTER I WITH RETROFLEX HOOK +0269 ; [.1CC2.0020.0002] # LATIN SMALL LETTER IOTA +0196 ; [.1CC2.0020.0008] # LATIN CAPITAL LETTER IOTA +1DA5 ; [.1CC2.0020.0014] # MODIFIER LETTER SMALL IOTA +1D7C ; [.1CC6.0020.0002] # LATIN SMALL LETTER IOTA WITH STROKE +006A ; [.1CC7.0020.0002] # LATIN SMALL LETTER J +FF4A ; [.1CC7.0020.0003] # FULLWIDTH LATIN SMALL LETTER J +24A5 ; [*0310.0020.0004][.1CC7.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER J +2149 ; [.1CC7.0020.0005] # DOUBLE-STRUCK ITALIC SMALL J +1D423 ; [.1CC7.0020.0005] # MATHEMATICAL BOLD SMALL J +1D457 ; [.1CC7.0020.0005] # MATHEMATICAL ITALIC SMALL J +1D48B ; [.1CC7.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL J +1D4BF ; [.1CC7.0020.0005] # MATHEMATICAL SCRIPT SMALL J +1D4F3 ; [.1CC7.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL J +1D527 ; [.1CC7.0020.0005] # MATHEMATICAL FRAKTUR SMALL J +1D55B ; [.1CC7.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL J +1D58F ; [.1CC7.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL J +1D5C3 ; [.1CC7.0020.0005] # MATHEMATICAL SANS-SERIF SMALL J +1D5F7 ; [.1CC7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL J +1D62B ; [.1CC7.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D65F ; [.1CC7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D693 ; [.1CC7.0020.0005] # MATHEMATICAL MONOSPACE SMALL J +24D9 ; [.1CC7.0020.0006] # CIRCLED LATIN SMALL LETTER J +004A ; [.1CC7.0020.0008] # LATIN CAPITAL LETTER J +FF2A ; [.1CC7.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER J +1F119 ; [*0310.0020.0004][.1CC7.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER J +1D409 ; [.1CC7.0020.000B] # MATHEMATICAL BOLD CAPITAL J +1D43D ; [.1CC7.0020.000B] # MATHEMATICAL ITALIC CAPITAL J +1D471 ; [.1CC7.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL J +1D4A5 ; [.1CC7.0020.000B] # MATHEMATICAL SCRIPT CAPITAL J +1D4D9 ; [.1CC7.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL J +1D50D ; [.1CC7.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL J +1D541 ; [.1CC7.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D575 ; [.1CC7.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D5A9 ; [.1CC7.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL J +1D5DD ; [.1CC7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D611 ; [.1CC7.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D645 ; [.1CC7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D679 ; [.1CC7.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL J +24BF ; [.1CC7.0020.000C] # CIRCLED LATIN CAPITAL LETTER J +1F159 ; [.1CC7.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER J +02B2 ; [.1CC7.0020.0014] # MODIFIER LETTER SMALL J +2C7C ; [.1CC7.0020.0015] # LATIN SUBSCRIPT SMALL LETTER J +1D36 ; [.1CC7.0020.001D] # MODIFIER LETTER CAPITAL J +1F139 ; [.1CC7.0020.001D] # SQUARED LATIN CAPITAL LETTER J +1F179 ; [.1CC7.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER J +0135 ; [.1CC7.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER J WITH CIRCUMFLEX +0134 ; [.1CC7.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +01F0 ; [.1CC7.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER J WITH CARON +0237 ; [.1CCB.0020.0002] # LATIN SMALL LETTER DOTLESS J +1D6A5 ; [.1CCB.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS J +1D0A ; [.1CCF.0020.0002] # LATIN LETTER SMALL CAPITAL J +0249 ; [.1CD0.0020.0002] # LATIN SMALL LETTER J WITH STROKE +0248 ; [.1CD0.0020.0008] # LATIN CAPITAL LETTER J WITH STROKE +029D ; [.1CD4.0020.0002] # LATIN SMALL LETTER J WITH CROSSED-TAIL +A7B2 ; [.1CD4.0020.0008] # LATIN CAPITAL LETTER J WITH CROSSED-TAIL +1DA8 ; [.1CD4.0020.0014] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL +025F ; [.1CD8.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE +1DA1 ; [.1CD8.0020.0014] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE +0284 ; [.1CDC.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK +006B ; [.1CE0.0020.0002] # LATIN SMALL LETTER K +FF4B ; [.1CE0.0020.0003] # FULLWIDTH LATIN SMALL LETTER K +1DDC ; [.1CE0.0020.0004] # COMBINING LATIN SMALL LETTER K +24A6 ; [*0310.0020.0004][.1CE0.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER K +1D424 ; [.1CE0.0020.0005] # MATHEMATICAL BOLD SMALL K +1D458 ; [.1CE0.0020.0005] # MATHEMATICAL ITALIC SMALL K +1D48C ; [.1CE0.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL K +1D4C0 ; [.1CE0.0020.0005] # MATHEMATICAL SCRIPT SMALL K +1D4F4 ; [.1CE0.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL K +1D528 ; [.1CE0.0020.0005] # MATHEMATICAL FRAKTUR SMALL K +1D55C ; [.1CE0.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL K +1D590 ; [.1CE0.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL K +1D5C4 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF SMALL K +1D5F8 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL K +1D62C ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D660 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D694 ; [.1CE0.0020.0005] # MATHEMATICAL MONOSPACE SMALL K +24DA ; [.1CE0.0020.0006] # CIRCLED LATIN SMALL LETTER K +004B ; [.1CE0.0020.0008] # LATIN CAPITAL LETTER K +212A ; [.1CE0.0020.0008] # KELVIN SIGN +FF2B ; [.1CE0.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER K +1F11A ; [*0310.0020.0004][.1CE0.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER K +1D40A ; [.1CE0.0020.000B] # MATHEMATICAL BOLD CAPITAL K +1D43E ; [.1CE0.0020.000B] # MATHEMATICAL ITALIC CAPITAL K +1D472 ; [.1CE0.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL K +1D4A6 ; [.1CE0.0020.000B] # MATHEMATICAL SCRIPT CAPITAL K +1D4DA ; [.1CE0.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL K +1D50E ; [.1CE0.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL K +1D542 ; [.1CE0.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D576 ; [.1CE0.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D5AA ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL K +1D5DE ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D612 ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D646 ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D67A ; [.1CE0.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL K +24C0 ; [.1CE0.0020.000C] # CIRCLED LATIN CAPITAL LETTER K +1F15A ; [.1CE0.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER K +1D4F ; [.1CE0.0020.0014] # MODIFIER LETTER SMALL K +2096 ; [.1CE0.0020.0015] # LATIN SUBSCRIPT SMALL LETTER K +1D37 ; [.1CE0.0020.001D] # MODIFIER LETTER CAPITAL K +1F13A ; [.1CE0.0020.001D] # SQUARED LATIN CAPITAL LETTER K +1F17A ; [.1CE0.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER K +1E31 ; [.1CE0.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER K WITH ACUTE +1E30 ; [.1CE0.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER K WITH ACUTE +01E9 ; [.1CE0.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER K WITH CARON +01E8 ; [.1CE0.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER K WITH CARON +0137 ; [.1CE0.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER K WITH CEDILLA +0136 ; [.1CE0.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER K WITH CEDILLA +A7A3 ; [.1CE0.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER K WITH OBLIQUE STROKE +A7A2 ; [.1CE0.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +1E33 ; [.1CE0.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER K WITH DOT BELOW +1E32 ; [.1CE0.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER K WITH DOT BELOW +1E35 ; [.1CE0.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER K WITH LINE BELOW +1E34 ; [.1CE0.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER K WITH LINE BELOW +3384 ; [.1CE0.0020.001C][.1BC2.0020.001D] # SQUARE KA +3385 ; [.1CE0.0020.001D][.1BDB.0020.001D] # SQUARE KB +3389 ; [.1CE0.0020.001C][.1BF5.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] # SQUARE KCAL +338F ; [.1CE0.0020.001C][.1C6F.0020.001C] # SQUARE KG +3391 ; [.1CE0.0020.001C][.1C93.0020.001D][.1E9C.0020.001C] # SQUARE KHZ +33CD ; [.1CE0.0020.001D][.1CE0.0020.001D] # SQUARE KK +3398 ; [.1CE0.0020.001C][.1CF2.0020.001C] # SQUARE KL +339E ; [.1CE0.0020.001C][.1D25.0020.001C] # SQUARE KM +33CE ; [.1CE0.0020.001D][.1D25.0020.001D] # SQUARE KM CAPITAL +33A2 ; [.1CE0.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] # SQUARE KM SQUARED +33A6 ; [.1CE0.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] # SQUARE KM CUBED +33AA ; [.1CE0.0020.001C][.1D87.0020.001D][.1BC2.0020.001C] # SQUARE KPA +33CF ; [.1CE0.0020.001C][.1E10.0020.001C] # SQUARE KT +33B8 ; [.1CE0.0020.001C][.1E5E.0020.001D] # SQUARE KV +33BE ; [.1CE0.0020.001C][.1E70.0020.001D] # SQUARE KW +33C0 ; [.1CE0.0020.001C][.1F5C.0020.001D] # SQUARE K OHM +1D0B ; [.1CE4.0020.0002] # LATIN LETTER SMALL CAPITAL K +1D84 ; [.1CE5.0020.0002] # LATIN SMALL LETTER K WITH PALATAL HOOK +0199 ; [.1CE6.0020.0002] # LATIN SMALL LETTER K WITH HOOK +0198 ; [.1CE6.0020.0008] # LATIN CAPITAL LETTER K WITH HOOK +2C6A ; [.1CEA.0020.0002] # LATIN SMALL LETTER K WITH DESCENDER +2C69 ; [.1CEA.0020.0008] # LATIN CAPITAL LETTER K WITH DESCENDER +A741 ; [.1CEB.0020.0002] # LATIN SMALL LETTER K WITH STROKE +A740 ; [.1CEB.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE +A743 ; [.1CEC.0020.0002] # LATIN SMALL LETTER K WITH DIAGONAL STROKE +A742 ; [.1CEC.0020.0008] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A745 ; [.1CED.0020.0002] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +A744 ; [.1CED.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +029E ; [.1CEE.0020.0002] # LATIN SMALL LETTER TURNED K +A7B0 ; [.1CEE.0020.0008] # LATIN CAPITAL LETTER TURNED K +006C ; [.1CF2.0020.0002] # LATIN SMALL LETTER L +FF4C ; [.1CF2.0020.0003] # FULLWIDTH LATIN SMALL LETTER L +1DDD ; [.1CF2.0020.0004] # COMBINING LATIN SMALL LETTER L +217C ; [.1CF2.0020.0004] # SMALL ROMAN NUMERAL FIFTY +24A7 ; [*0310.0020.0004][.1CF2.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER L +2113 ; [.1CF2.0020.0005] # SCRIPT SMALL L +1D425 ; [.1CF2.0020.0005] # MATHEMATICAL BOLD SMALL L +1D459 ; [.1CF2.0020.0005] # MATHEMATICAL ITALIC SMALL L +1D48D ; [.1CF2.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL L +1D4C1 ; [.1CF2.0020.0005] # MATHEMATICAL SCRIPT SMALL L +1D4F5 ; [.1CF2.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL L +1D529 ; [.1CF2.0020.0005] # MATHEMATICAL FRAKTUR SMALL L +1D55D ; [.1CF2.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL L +1D591 ; [.1CF2.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL L +1D5C5 ; [.1CF2.0020.0005] # MATHEMATICAL SANS-SERIF SMALL L +1D5F9 ; [.1CF2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL L +1D62D ; [.1CF2.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D661 ; [.1CF2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D695 ; [.1CF2.0020.0005] # MATHEMATICAL MONOSPACE SMALL L +24DB ; [.1CF2.0020.0006] # CIRCLED LATIN SMALL LETTER L +004C ; [.1CF2.0020.0008] # LATIN CAPITAL LETTER L +FF2C ; [.1CF2.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER L +216C ; [.1CF2.0020.000A] # ROMAN NUMERAL FIFTY +1F11B ; [*0310.0020.0004][.1CF2.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER L +2112 ; [.1CF2.0020.000B] # SCRIPT CAPITAL L +1D40B ; [.1CF2.0020.000B] # MATHEMATICAL BOLD CAPITAL L +1D43F ; [.1CF2.0020.000B] # MATHEMATICAL ITALIC CAPITAL L +1D473 ; [.1CF2.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL L +1D4DB ; [.1CF2.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL L +1D50F ; [.1CF2.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL L +1D543 ; [.1CF2.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D577 ; [.1CF2.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D5AB ; [.1CF2.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL L +1D5DF ; [.1CF2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D613 ; [.1CF2.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D647 ; [.1CF2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D67B ; [.1CF2.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL L +24C1 ; [.1CF2.0020.000C] # CIRCLED LATIN CAPITAL LETTER L +1F15B ; [.1CF2.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER L +02E1 ; [.1CF2.0020.0014] # MODIFIER LETTER SMALL L +2097 ; [.1CF2.0020.0015] # LATIN SUBSCRIPT SMALL LETTER L +1D38 ; [.1CF2.0020.001D] # MODIFIER LETTER CAPITAL L +1F13B ; [.1CF2.0020.001D] # SQUARED LATIN CAPITAL LETTER L +1F17B ; [.1CF2.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER L +013A ; [.1CF2.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER L WITH ACUTE +0139 ; [.1CF2.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER L WITH ACUTE +013E ; [.1CF2.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER L WITH CARON +013D ; [.1CF2.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER L WITH CARON +013C ; [.1CF2.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER L WITH CEDILLA +013B ; [.1CF2.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER L WITH CEDILLA +0142 ; [.1CF2.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER L WITH STROKE +0141 ; [.1CF2.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER L WITH STROKE +1E37 ; [.1CF2.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER L WITH DOT BELOW +1E36 ; [.1CF2.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW +1E39 ; [.1CF2.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E38 ; [.1CF2.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3D ; [.1CF2.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3C ; [.1CF2.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3B ; [.1CF2.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER L WITH LINE BELOW +1E3A ; [.1CF2.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER L WITH LINE BELOW +0140 ; [.1CF2.0020.0002][.0000.010B.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +006C 00B7 ; [.1CF2.0020.0002][.0000.010B.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +006C 0387 ; [.1CF2.0020.0002][.0000.010B.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +013F ; [.1CF2.0020.0008][.0000.010B.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +004C 00B7 ; [.1CF2.0020.0008][.0000.010B.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +004C 0387 ; [.1CF2.0020.0008][.0000.010B.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +01C9 ; [.1CF2.0020.0004][.1CC7.0020.0004] # LATIN SMALL LETTER LJ +01C8 ; [.1CF2.0020.000A][.1CC7.0020.0004] # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01C7 ; [.1CF2.0020.000A][.1CC7.0020.000A] # LATIN CAPITAL LETTER LJ +1EFB ; [.1CF2.0020.0004][.1CF2.0020.0004] # LATIN SMALL LETTER MIDDLE-WELSH LL +1EFA ; [.1CF2.0020.000A][.1CF2.0020.000A] # LATIN CAPITAL LETTER MIDDLE-WELSH LL +33D0 ; [.1CF2.0020.001C][.1D25.0020.001C] # SQUARE LM +33D1 ; [.1CF2.0020.001C][.1D34.0020.001C] # SQUARE LN +33D2 ; [.1CF2.0020.001C][.1D58.0020.001C][.1C6F.0020.001C] # SQUARE LOG +02AA ; [.1CF2.0020.0004][.1DEC.0020.0004] # LATIN SMALL LETTER LS DIGRAPH +32CF ; [.1CF2.0020.001D][.1E10.0020.001D][.1C0A.0020.001D] # LIMITED LIABILITY SIGN +33D3 ; [.1CF2.0020.001C][.1E7A.0020.001C] # SQUARE LX +02AB ; [.1CF2.0020.0004][.1E9C.0020.0004] # LATIN SMALL LETTER LZ DIGRAPH +029F ; [.1CF6.0020.0002] # LATIN LETTER SMALL CAPITAL L +1DDE ; [.1CF6.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL L +1DAB ; [.1CF6.0020.0014] # MODIFIER LETTER SMALL CAPITAL L +A747 ; [.1CFA.0020.0002] # LATIN SMALL LETTER BROKEN L +A746 ; [.1CFA.0020.0008] # LATIN CAPITAL LETTER BROKEN L +1D0C ; [.1CFB.0020.0002] # LATIN LETTER SMALL CAPITAL L WITH STROKE +A749 ; [.1CFC.0020.0002] # LATIN SMALL LETTER L WITH HIGH STROKE +A748 ; [.1CFC.0020.0008] # LATIN CAPITAL LETTER L WITH HIGH STROKE +019A ; [.1CFD.0020.0002] # LATIN SMALL LETTER L WITH BAR +023D ; [.1CFD.0020.0008] # LATIN CAPITAL LETTER L WITH BAR +2C61 ; [.1D01.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE BAR +2C60 ; [.1D01.0020.0008] # LATIN CAPITAL LETTER L WITH DOUBLE BAR +026B ; [.1D02.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE TILDE +2C62 ; [.1D02.0020.0008] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE +AB5E ; [.1D02.0020.0014] # MODIFIER LETTER SMALL L WITH MIDDLE TILDE +AB38 ; [.1D06.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE +1DEC ; [.1D06.0020.0004] # COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE +AB39 ; [.1D07.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE RING +026C ; [.1D08.0020.0002] # LATIN SMALL LETTER L WITH BELT +A7AD ; [.1D08.0020.0008] # LATIN CAPITAL LETTER L WITH BELT +AB37 ; [.1D0C.0020.0002] # LATIN SMALL LETTER L WITH INVERTED LAZY S +AB5D ; [.1D0C.0020.0014] # MODIFIER LETTER SMALL L WITH INVERTED LAZY S +1D85 ; [.1D0D.0020.0002] # LATIN SMALL LETTER L WITH PALATAL HOOK +1DAA ; [.1D0D.0020.0014] # MODIFIER LETTER SMALL L WITH PALATAL HOOK +026D ; [.1D0E.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK +1DA9 ; [.1D0E.0020.0014] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +A78E ; [.1D12.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +0234 ; [.1D13.0020.0002] # LATIN SMALL LETTER L WITH CURL +A772 ; [.1D17.0020.0002] # LATIN SMALL LETTER LUM +026E ; [.1D18.0020.0002] # LATIN SMALL LETTER LEZH +A781 ; [.1D1C.0020.0002] # LATIN SMALL LETTER TURNED L +A780 ; [.1D1C.0020.0008] # LATIN CAPITAL LETTER TURNED L +019B ; [.1D1D.0020.0002] # LATIN SMALL LETTER LAMBDA WITH STROKE +028E ; [.1D21.0020.0002] # LATIN SMALL LETTER TURNED Y +006D ; [.1D25.0020.0002] # LATIN SMALL LETTER M +FF4D ; [.1D25.0020.0003] # FULLWIDTH LATIN SMALL LETTER M +036B ; [.1D25.0020.0004] # COMBINING LATIN SMALL LETTER M +217F ; [.1D25.0020.0004] # SMALL ROMAN NUMERAL ONE THOUSAND +24A8 ; [*0310.0020.0004][.1D25.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER M +1D426 ; [.1D25.0020.0005] # MATHEMATICAL BOLD SMALL M +1D45A ; [.1D25.0020.0005] # MATHEMATICAL ITALIC SMALL M +1D48E ; [.1D25.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL M +1D4C2 ; [.1D25.0020.0005] # MATHEMATICAL SCRIPT SMALL M +1D4F6 ; [.1D25.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL M +1D52A ; [.1D25.0020.0005] # MATHEMATICAL FRAKTUR SMALL M +1D55E ; [.1D25.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL M +1D592 ; [.1D25.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL M +1D5C6 ; [.1D25.0020.0005] # MATHEMATICAL SANS-SERIF SMALL M +1D5FA ; [.1D25.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL M +1D62E ; [.1D25.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D662 ; [.1D25.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D696 ; [.1D25.0020.0005] # MATHEMATICAL MONOSPACE SMALL M +24DC ; [.1D25.0020.0006] # CIRCLED LATIN SMALL LETTER M +004D ; [.1D25.0020.0008] # LATIN CAPITAL LETTER M +FF2D ; [.1D25.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER M +216F ; [.1D25.0020.000A] # ROMAN NUMERAL ONE THOUSAND +1F11C ; [*0310.0020.0004][.1D25.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER M +2133 ; [.1D25.0020.000B] # SCRIPT CAPITAL M +1D40C ; [.1D25.0020.000B] # MATHEMATICAL BOLD CAPITAL M +1D440 ; [.1D25.0020.000B] # MATHEMATICAL ITALIC CAPITAL M +1D474 ; [.1D25.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL M +1D4DC ; [.1D25.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL M +1D510 ; [.1D25.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL M +1D544 ; [.1D25.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D578 ; [.1D25.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D5AC ; [.1D25.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL M +1D5E0 ; [.1D25.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D614 ; [.1D25.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D648 ; [.1D25.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D67C ; [.1D25.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL M +24C2 ; [.1D25.0020.000C] # CIRCLED LATIN CAPITAL LETTER M +1F15C ; [.1D25.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER M +1D50 ; [.1D25.0020.0014] # MODIFIER LETTER SMALL M +2098 ; [.1D25.0020.0015] # LATIN SUBSCRIPT SMALL LETTER M +1D39 ; [.1D25.0020.001D] # MODIFIER LETTER CAPITAL M +1F13C ; [.1D25.0020.001D] # SQUARED LATIN CAPITAL LETTER M +1F17C ; [.1D25.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER M +1E3F ; [.1D25.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER M WITH ACUTE +1E3E ; [.1D25.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER M WITH ACUTE +1E41 ; [.1D25.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER M WITH DOT ABOVE +1E40 ; [.1D25.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E43 ; [.1D25.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER M WITH DOT BELOW +1E42 ; [.1D25.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER M WITH DOT BELOW +33A1 ; [.1D25.0020.001C][.1BBA.0020.001C] # SQUARE M SQUARED +33A5 ; [.1D25.0020.001C][.1BBB.0020.001C] # SQUARE M CUBED +3383 ; [.1D25.0020.001C][.1BC2.0020.001D] # SQUARE MA +33D4 ; [.1D25.0020.001C][.1BDB.0020.001C] # SQUARE MB SMALL +3386 ; [.1D25.0020.001D][.1BDB.0020.001D] # SQUARE MB +1F16A ; [.1D25.0020.0014][.1BF5.0020.0014] # RAISED MC SIGN +1F16B ; [.1D25.0020.0014][.1C0A.0020.0014] # RAISED MD SIGN +338E ; [.1D25.0020.001C][.1C6F.0020.001C] # SQUARE MG +3392 ; [.1D25.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] # SQUARE MHZ +33D5 ; [.1D25.0020.001C][.1CAD.0020.001C][.1CF2.0020.001C] # SQUARE MIL +3396 ; [.1D25.0020.001C][.1CF2.0020.001C] # SQUARE ML +339C ; [.1D25.0020.001C][.1D25.0020.001C] # SQUARE MM +339F ; [.1D25.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] # SQUARE MM SQUARED +33A3 ; [.1D25.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] # SQUARE MM CUBED +33D6 ; [.1D25.0020.001C][.1D58.0020.001C][.1CF2.0020.001C] # SQUARE MOL +33AB ; [.1D25.0020.001D][.1D87.0020.001D][.1BC2.0020.001C] # SQUARE MPA +33A7 ; [.1D25.0020.001C][*0605.0020.001C][.1DEC.0020.001C] # SQUARE M OVER S +33B3 ; [.1D25.0020.001C][.1DEC.0020.001C] # SQUARE MS +33A8 ; [.1D25.0020.001C][*0605.0020.001C][.1DEC.0020.001C][.1BBA.0020.001C] # SQUARE M OVER S SQUARED +33B7 ; [.1D25.0020.001C][.1E5E.0020.001D] # SQUARE MV +33B9 ; [.1D25.0020.001D][.1E5E.0020.001D] # SQUARE MV MEGA +1F14B ; [.1D25.0020.001D][.1E5E.0020.001D] # SQUARED MV +33BD ; [.1D25.0020.001C][.1E70.0020.001D] # SQUARE MW +33BF ; [.1D25.0020.001D][.1E70.0020.001D] # SQUARE MW MEGA +33C1 ; [.1D25.0020.001D][.1F5C.0020.001D] # SQUARE M OHM +1D0D ; [.1D29.0020.0002] # LATIN LETTER SMALL CAPITAL M +1DDF ; [.1D29.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL M +1D6F ; [.1D2A.0020.0002] # LATIN SMALL LETTER M WITH MIDDLE TILDE +1D86 ; [.1D2B.0020.0002] # LATIN SMALL LETTER M WITH PALATAL HOOK +0271 ; [.1D2C.0020.0002] # LATIN SMALL LETTER M WITH HOOK +2C6E ; [.1D2C.0020.0008] # LATIN CAPITAL LETTER M WITH HOOK +1DAC ; [.1D2C.0020.0014] # MODIFIER LETTER SMALL M WITH HOOK +AB3A ; [.1D30.0020.0002] # LATIN SMALL LETTER M WITH CROSSED-TAIL +A7FD ; [.1D31.0020.0002] # LATIN EPIGRAPHIC LETTER INVERTED M +A7FF ; [.1D32.0020.0002] # LATIN EPIGRAPHIC LETTER ARCHAIC M +A773 ; [.1D33.0020.0002] # LATIN SMALL LETTER MUM +006E ; [.1D34.0020.0002] # LATIN SMALL LETTER N +FF4E ; [.1D34.0020.0003] # FULLWIDTH LATIN SMALL LETTER N +1DE0 ; [.1D34.0020.0004] # COMBINING LATIN SMALL LETTER N +24A9 ; [*0310.0020.0004][.1D34.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER N +1D427 ; [.1D34.0020.0005] # MATHEMATICAL BOLD SMALL N +1D45B ; [.1D34.0020.0005] # MATHEMATICAL ITALIC SMALL N +1D48F ; [.1D34.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL N +1D4C3 ; [.1D34.0020.0005] # MATHEMATICAL SCRIPT SMALL N +1D4F7 ; [.1D34.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL N +1D52B ; [.1D34.0020.0005] # MATHEMATICAL FRAKTUR SMALL N +1D55F ; [.1D34.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL N +1D593 ; [.1D34.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL N +1D5C7 ; [.1D34.0020.0005] # MATHEMATICAL SANS-SERIF SMALL N +1D5FB ; [.1D34.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL N +1D62F ; [.1D34.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D663 ; [.1D34.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D697 ; [.1D34.0020.0005] # MATHEMATICAL MONOSPACE SMALL N +24DD ; [.1D34.0020.0006] # CIRCLED LATIN SMALL LETTER N +004E ; [.1D34.0020.0008] # LATIN CAPITAL LETTER N +FF2E ; [.1D34.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER N +1F11D ; [*0310.0020.0004][.1D34.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER N +2115 ; [.1D34.0020.000B] # DOUBLE-STRUCK CAPITAL N +1D40D ; [.1D34.0020.000B] # MATHEMATICAL BOLD CAPITAL N +1D441 ; [.1D34.0020.000B] # MATHEMATICAL ITALIC CAPITAL N +1D475 ; [.1D34.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL N +1D4A9 ; [.1D34.0020.000B] # MATHEMATICAL SCRIPT CAPITAL N +1D4DD ; [.1D34.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL N +1D511 ; [.1D34.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL N +1D579 ; [.1D34.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D5AD ; [.1D34.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL N +1D5E1 ; [.1D34.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D615 ; [.1D34.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D649 ; [.1D34.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D67D ; [.1D34.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL N +24C3 ; [.1D34.0020.000C] # CIRCLED LATIN CAPITAL LETTER N +1F15D ; [.1D34.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER N +207F ; [.1D34.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER N +2099 ; [.1D34.0020.0015] # LATIN SUBSCRIPT SMALL LETTER N +1D3A ; [.1D34.0020.001D] # MODIFIER LETTER CAPITAL N +1F13D ; [.1D34.0020.001D] # SQUARED LATIN CAPITAL LETTER N +1F17D ; [.1D34.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER N +0144 ; [.1D34.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER N WITH ACUTE +0143 ; [.1D34.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER N WITH ACUTE +01F9 ; [.1D34.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER N WITH GRAVE +01F8 ; [.1D34.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER N WITH GRAVE +0148 ; [.1D34.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER N WITH CARON +0147 ; [.1D34.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER N WITH CARON +00F1 ; [.1D34.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER N WITH TILDE +00D1 ; [.1D34.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER N WITH TILDE +1E45 ; [.1D34.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER N WITH DOT ABOVE +1E44 ; [.1D34.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER N WITH DOT ABOVE +0146 ; [.1D34.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER N WITH CEDILLA +0145 ; [.1D34.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER N WITH CEDILLA +A7A5 ; [.1D34.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER N WITH OBLIQUE STROKE +A7A4 ; [.1D34.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +1E47 ; [.1D34.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER N WITH DOT BELOW +1E46 ; [.1D34.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER N WITH DOT BELOW +1E4B ; [.1D34.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4A ; [.1D34.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E49 ; [.1D34.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER N WITH LINE BELOW +1E48 ; [.1D34.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER N WITH LINE BELOW +3381 ; [.1D34.0020.001C][.1BC2.0020.001D] # SQUARE NA +1F195 ; [.1D34.0020.001D][.1C25.0020.001D][.1E70.0020.001D] # SQUARED NEW +338B ; [.1D34.0020.001C][.1C60.0020.001D] # SQUARE NF +1F196 ; [.1D34.0020.001D][.1C6F.0020.001D] # SQUARED NG +01CC ; [.1D34.0020.0004][.1CC7.0020.0004] # LATIN SMALL LETTER NJ +01CB ; [.1D34.0020.000A][.1CC7.0020.0004] # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CA ; [.1D34.0020.000A][.1CC7.0020.000A] # LATIN CAPITAL LETTER NJ +339A ; [.1D34.0020.001C][.1D25.0020.001C] # SQUARE NM +2116 ; [.1D34.0020.000A][.1D58.0020.0004] # NUMERO SIGN +33B1 ; [.1D34.0020.001C][.1DEC.0020.001C] # SQUARE NS +33B5 ; [.1D34.0020.001C][.1E5E.0020.001D] # SQUARE NV +33BB ; [.1D34.0020.001C][.1E70.0020.001D] # SQUARE NW +0274 ; [.1D38.0020.0002] # LATIN LETTER SMALL CAPITAL N +1DE1 ; [.1D38.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL N +1DB0 ; [.1D38.0020.0014] # MODIFIER LETTER SMALL CAPITAL N +1D3B ; [.1D3C.0020.0002] # MODIFIER LETTER CAPITAL REVERSED N +1D0E ; [.1D3D.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED N +1D70 ; [.1D3E.0020.0002] # LATIN SMALL LETTER N WITH MIDDLE TILDE +0272 ; [.1D3F.0020.0002] # LATIN SMALL LETTER N WITH LEFT HOOK +019D ; [.1D3F.0020.0008] # LATIN CAPITAL LETTER N WITH LEFT HOOK +1DAE ; [.1D3F.0020.0014] # MODIFIER LETTER SMALL N WITH LEFT HOOK +019E ; [.1D43.0020.0002] # LATIN SMALL LETTER N WITH LONG RIGHT LEG +0220 ; [.1D43.0020.0008] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +A791 ; [.1D47.0020.0002] # LATIN SMALL LETTER N WITH DESCENDER +A790 ; [.1D47.0020.0008] # LATIN CAPITAL LETTER N WITH DESCENDER +1D87 ; [.1D48.0020.0002] # LATIN SMALL LETTER N WITH PALATAL HOOK +0273 ; [.1D49.0020.0002] # LATIN SMALL LETTER N WITH RETROFLEX HOOK +1DAF ; [.1D49.0020.0014] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +0235 ; [.1D4D.0020.0002] # LATIN SMALL LETTER N WITH CURL +AB3B ; [.1D51.0020.0002] # LATIN SMALL LETTER N WITH CROSSED-TAIL +A774 ; [.1D52.0020.0002] # LATIN SMALL LETTER NUM +014B ; [.1D53.0020.0002] # LATIN SMALL LETTER ENG +014A ; [.1D53.0020.0008] # LATIN CAPITAL LETTER ENG +1D51 ; [.1D53.0020.0014] # MODIFIER LETTER SMALL ENG +AB3C ; [.1D57.0020.0002] # LATIN SMALL LETTER ENG WITH CROSSED-TAIL +006F ; [.1D58.0020.0002] # LATIN SMALL LETTER O +FF4F ; [.1D58.0020.0003] # FULLWIDTH LATIN SMALL LETTER O +0366 ; [.1D58.0020.0004] # COMBINING LATIN SMALL LETTER O +24AA ; [*0310.0020.0004][.1D58.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER O +2134 ; [.1D58.0020.0005] # SCRIPT SMALL O +1D428 ; [.1D58.0020.0005] # MATHEMATICAL BOLD SMALL O +1D45C ; [.1D58.0020.0005] # MATHEMATICAL ITALIC SMALL O +1D490 ; [.1D58.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL O +1D4F8 ; [.1D58.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL O +1D52C ; [.1D58.0020.0005] # MATHEMATICAL FRAKTUR SMALL O +1D560 ; [.1D58.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL O +1D594 ; [.1D58.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL O +1D5C8 ; [.1D58.0020.0005] # MATHEMATICAL SANS-SERIF SMALL O +1D5FC ; [.1D58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL O +1D630 ; [.1D58.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D664 ; [.1D58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D698 ; [.1D58.0020.0005] # MATHEMATICAL MONOSPACE SMALL O +24DE ; [.1D58.0020.0006] # CIRCLED LATIN SMALL LETTER O +004F ; [.1D58.0020.0008] # LATIN CAPITAL LETTER O +FF2F ; [.1D58.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER O +1F11E ; [*0310.0020.0004][.1D58.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER O +1D40E ; [.1D58.0020.000B] # MATHEMATICAL BOLD CAPITAL O +1D442 ; [.1D58.0020.000B] # MATHEMATICAL ITALIC CAPITAL O +1D476 ; [.1D58.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL O +1D4AA ; [.1D58.0020.000B] # MATHEMATICAL SCRIPT CAPITAL O +1D4DE ; [.1D58.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL O +1D512 ; [.1D58.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL O +1D546 ; [.1D58.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D57A ; [.1D58.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D5AE ; [.1D58.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL O +1D5E2 ; [.1D58.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D616 ; [.1D58.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D64A ; [.1D58.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D67E ; [.1D58.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL O +24C4 ; [.1D58.0020.000C] # CIRCLED LATIN CAPITAL LETTER O +1F15E ; [.1D58.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER O +00BA ; [.1D58.0020.0014] # MASCULINE ORDINAL INDICATOR +1D52 ; [.1D58.0020.0014] # MODIFIER LETTER SMALL O +2092 ; [.1D58.0020.0015] # LATIN SUBSCRIPT SMALL LETTER O +1D3C ; [.1D58.0020.001D] # MODIFIER LETTER CAPITAL O +1F13E ; [.1D58.0020.001D] # SQUARED LATIN CAPITAL LETTER O +1F17E ; [.1D58.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER O +00F3 ; [.1D58.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH ACUTE +00D3 ; [.1D58.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH ACUTE +00F2 ; [.1D58.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH GRAVE +00D2 ; [.1D58.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH GRAVE +014F ; [.1D58.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER O WITH BREVE +014E ; [.1D58.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER O WITH BREVE +00F4 ; [.1D58.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX +00D4 ; [.1D58.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +1ED1 ; [.1D58.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED0 ; [.1D58.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED3 ; [.1D58.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED2 ; [.1D58.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED7 ; [.1D58.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED6 ; [.1D58.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED5 ; [.1D58.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED4 ; [.1D58.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +01D2 ; [.1D58.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER O WITH CARON +01D1 ; [.1D58.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER O WITH CARON +00F6 ; [.1D58.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH DIAERESIS +1DF3 ; [.1D58.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER O WITH DIAERESIS +A79D ; [.1D58.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK OE +00D6 ; [.1D58.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS +A79C ; [.1D58.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK OE +022B ; [.1D58.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022A ; [.1D58.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +0151 ; [.1D58.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0150 ; [.1D58.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +00F5 ; [.1D58.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH TILDE +00D5 ; [.1D58.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH TILDE +1E4D ; [.1D58.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4C ; [.1D58.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4F ; [.1D58.0020.0002][.0000.002D.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E4E ; [.1D58.0020.0008][.0000.002D.0002][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +022D ; [.1D58.0020.0002][.0000.002D.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH TILDE AND MACRON +022C ; [.1D58.0020.0008][.0000.002D.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022F ; [.1D58.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER O WITH DOT ABOVE +022E ; [.1D58.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE +0231 ; [.1D58.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0230 ; [.1D58.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +00F8 ; [.1D58.0020.0002][.0000.002F.0002] # LATIN SMALL LETTER O WITH STROKE +00D8 ; [.1D58.0020.0008][.0000.002F.0002] # LATIN CAPITAL LETTER O WITH STROKE +01FF ; [.1D58.0020.0002][.0000.002F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH STROKE AND ACUTE +01FE ; [.1D58.0020.0008][.0000.002F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01EB ; [.1D58.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER O WITH OGONEK +01EA ; [.1D58.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER O WITH OGONEK +01ED ; [.1D58.0020.0002][.0000.0031.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EC ; [.1D58.0020.0008][.0000.0031.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +014D ; [.1D58.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH MACRON +014C ; [.1D58.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH MACRON +1E53 ; [.1D58.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E52 ; [.1D58.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E51 ; [.1D58.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E50 ; [.1D58.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1DED ; [.1D58.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE +1ECF ; [.1D58.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HOOK ABOVE +1ECE ; [.1D58.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HOOK ABOVE +020D ; [.1D58.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER O WITH DOUBLE GRAVE +020C ; [.1D58.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020F ; [.1D58.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER O WITH INVERTED BREVE +020E ; [.1D58.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER O WITH INVERTED BREVE +01A1 ; [.1D58.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER O WITH HORN +01A0 ; [.1D58.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER O WITH HORN +1EDB ; [.1D58.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDA ; [.1D58.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDD ; [.1D58.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDC ; [.1D58.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EE1 ; [.1D58.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH HORN AND TILDE +1EE0 ; [.1D58.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EDF ; [.1D58.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EDE ; [.1D58.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE3 ; [.1D58.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE2 ; [.1D58.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1ECD ; [.1D58.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH DOT BELOW +1ECC ; [.1D58.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH DOT BELOW +1ED9 ; [.1D58.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED8 ; [.1D58.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +0153 ; [.1D58.0020.0004][.0000.010B.0004][.1C25.0020.0004] # LATIN SMALL LIGATURE OE +0152 ; [.1D58.0020.000A][.0000.010B.0004][.1C25.0020.000A] # LATIN CAPITAL LIGATURE OE +A7F9 ; [.1D58.0020.0014][.0000.010B.0014][.1C25.0020.0014] # MODIFIER LETTER SMALL LIGATURE OE +1F197 ; [.1D58.0020.001D][.1CE0.0020.001D] # SQUARED OK +A74F ; [.1D58.0020.0004][.1D58.0020.0004] # LATIN SMALL LETTER OO +A74E ; [.1D58.0020.000A][.1D58.0020.000A] # LATIN CAPITAL LETTER OO +3375 ; [.1D58.0020.001C][.1E5E.0020.001D] # SQUARE OV +1D0F ; [.1D5C.0020.0002] # LATIN LETTER SMALL CAPITAL O +1D11 ; [.1D5D.0020.0002] # LATIN SMALL LETTER SIDEWAYS O +AB3D ; [.1D5E.0020.0002] # LATIN SMALL LETTER BLACKLETTER O +0276 ; [.1D5F.0020.0002] # LATIN LETTER SMALL CAPITAL OE +1D14 ; [.1D63.0020.0002] # LATIN SMALL LETTER TURNED OE +AB41 ; [.1D64.0020.0002] # LATIN SMALL LETTER TURNED OE WITH STROKE +AB42 ; [.1D65.0020.0002] # LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE +AB40 ; [.1D66.0020.0002] # LATIN SMALL LETTER INVERTED OE +AB43 ; [.1D67.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O +AB44 ; [.1D68.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE +1D13 ; [.1D69.0020.0002] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE +AB3E ; [.1D6A.0020.0002] # LATIN SMALL LETTER BLACKLETTER O WITH STROKE +0254 ; [.1D6B.0020.0002] # LATIN SMALL LETTER OPEN O +0186 ; [.1D6B.0020.0008] # LATIN CAPITAL LETTER OPEN O +1D53 ; [.1D6B.0020.0014] # MODIFIER LETTER SMALL OPEN O +1D10 ; [.1D6F.0020.0002] # LATIN LETTER SMALL CAPITAL OPEN O +1D12 ; [.1D70.0020.0002] # LATIN SMALL LETTER SIDEWAYS OPEN O +AB3F ; [.1D71.0020.0002] # LATIN SMALL LETTER OPEN O WITH STROKE +1D97 ; [.1D72.0020.0002] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK +AB62 ; [.1D73.0020.0002] # LATIN SMALL LETTER OPEN OE +A74D ; [.1D74.0020.0002] # LATIN SMALL LETTER O WITH LOOP +A74C ; [.1D74.0020.0008] # LATIN CAPITAL LETTER O WITH LOOP +1D16 ; [.1D75.0020.0002] # LATIN SMALL LETTER TOP HALF O +1D54 ; [.1D75.0020.0014] # MODIFIER LETTER SMALL TOP HALF O +1D17 ; [.1D76.0020.0002] # LATIN SMALL LETTER BOTTOM HALF O +1D55 ; [.1D76.0020.0014] # MODIFIER LETTER SMALL BOTTOM HALF O +2C7A ; [.1D77.0020.0002] # LATIN SMALL LETTER O WITH LOW RING INSIDE +0275 ; [.1D78.0020.0002] # LATIN SMALL LETTER BARRED O +019F ; [.1D78.0020.0008] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +1DB1 ; [.1D78.0020.0014] # MODIFIER LETTER SMALL BARRED O +A74B ; [.1D7C.0020.0002] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +A74A ; [.1D7C.0020.0008] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +0277 ; [.1D7D.0020.0002] # LATIN SMALL LETTER CLOSED OMEGA +A7B7 ; [.1D81.0020.0002] # LATIN SMALL LETTER OMEGA +A7B6 ; [.1D81.0020.0008] # LATIN CAPITAL LETTER OMEGA +0223 ; [.1D82.0020.0002] # LATIN SMALL LETTER OU +0222 ; [.1D82.0020.0008] # LATIN CAPITAL LETTER OU +1D3D ; [.1D82.0020.001D] # MODIFIER LETTER CAPITAL OU +1D15 ; [.1D86.0020.0002] # LATIN LETTER SMALL CAPITAL OU +0070 ; [.1D87.0020.0002] # LATIN SMALL LETTER P +FF50 ; [.1D87.0020.0003] # FULLWIDTH LATIN SMALL LETTER P +1DEE ; [.1D87.0020.0004] # COMBINING LATIN SMALL LETTER P +24AB ; [*0310.0020.0004][.1D87.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER P +1D429 ; [.1D87.0020.0005] # MATHEMATICAL BOLD SMALL P +1D45D ; [.1D87.0020.0005] # MATHEMATICAL ITALIC SMALL P +1D491 ; [.1D87.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL P +1D4C5 ; [.1D87.0020.0005] # MATHEMATICAL SCRIPT SMALL P +1D4F9 ; [.1D87.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL P +1D52D ; [.1D87.0020.0005] # MATHEMATICAL FRAKTUR SMALL P +1D561 ; [.1D87.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL P +1D595 ; [.1D87.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL P +1D5C9 ; [.1D87.0020.0005] # MATHEMATICAL SANS-SERIF SMALL P +1D5FD ; [.1D87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL P +1D631 ; [.1D87.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D665 ; [.1D87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D699 ; [.1D87.0020.0005] # MATHEMATICAL MONOSPACE SMALL P +24DF ; [.1D87.0020.0006] # CIRCLED LATIN SMALL LETTER P +0050 ; [.1D87.0020.0008] # LATIN CAPITAL LETTER P +FF30 ; [.1D87.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER P +1F11F ; [*0310.0020.0004][.1D87.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER P +2119 ; [.1D87.0020.000B] # DOUBLE-STRUCK CAPITAL P +1D40F ; [.1D87.0020.000B] # MATHEMATICAL BOLD CAPITAL P +1D443 ; [.1D87.0020.000B] # MATHEMATICAL ITALIC CAPITAL P +1D477 ; [.1D87.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL P +1D4AB ; [.1D87.0020.000B] # MATHEMATICAL SCRIPT CAPITAL P +1D4DF ; [.1D87.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL P +1D513 ; [.1D87.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL P +1D57B ; [.1D87.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D5AF ; [.1D87.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL P +1D5E3 ; [.1D87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D617 ; [.1D87.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D64B ; [.1D87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D67F ; [.1D87.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL P +24C5 ; [.1D87.0020.000C] # CIRCLED LATIN CAPITAL LETTER P +1F15F ; [.1D87.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P +1D56 ; [.1D87.0020.0014] # MODIFIER LETTER SMALL P +209A ; [.1D87.0020.0015] # LATIN SUBSCRIPT SMALL LETTER P +1D3E ; [.1D87.0020.001D] # MODIFIER LETTER CAPITAL P +1F13F ; [.1D87.0020.001D] # SQUARED LATIN CAPITAL LETTER P +1F17F ; [.1D87.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER P +1F18A ; [.1D87.0020.001D] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P +1E55 ; [.1D87.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER P WITH ACUTE +1E54 ; [.1D87.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER P WITH ACUTE +1E57 ; [.1D87.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER P WITH DOT ABOVE +1E56 ; [.1D87.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER P WITH DOT ABOVE +3380 ; [.1D87.0020.001C][.1BC2.0020.001D] # SQUARE PA AMPS +33A9 ; [.1D87.0020.001D][.1BC2.0020.001C] # SQUARE PA +1F18C ; [.1D87.0020.001D][.1BC2.0020.001D] # NEGATIVE SQUARED PA +3376 ; [.1D87.0020.001C][.1BF5.0020.001C] # SQUARE PC +338A ; [.1D87.0020.001C][.1C60.0020.001D] # SQUARE PF +33D7 ; [.1D87.0020.001D][.1C93.0020.001D] # SQUARE PH +33D8 ; [.1D87.0020.001C][*0274.0020.001C][.1D25.0020.001C][*0274.0020.001C] # SQUARE PM +33D9 ; [.1D87.0020.001D][.1D87.0020.001D][.1D25.0020.001D] # SQUARE PPM +1F14E ; [.1D87.0020.001D][.1D87.0020.001D][.1E5E.0020.001D] # SQUARED PPV +33DA ; [.1D87.0020.001D][.1DAE.0020.001D] # SQUARE PR +33B0 ; [.1D87.0020.001C][.1DEC.0020.001C] # SQUARE PS +3250 ; [.1D87.0020.001D][.1E10.0020.001D][.1C25.0020.001D] # PARTNERSHIP SIGN +33B4 ; [.1D87.0020.001C][.1E5E.0020.001D] # SQUARE PV +33BA ; [.1D87.0020.001C][.1E70.0020.001D] # SQUARE PW +1D18 ; [.1D8B.0020.0002] # LATIN LETTER SMALL CAPITAL P +1D7D ; [.1D8C.0020.0002] # LATIN SMALL LETTER P WITH STROKE +2C63 ; [.1D8C.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE +A751 ; [.1D8D.0020.0002] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +A750 ; [.1D8D.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +1D71 ; [.1D8E.0020.0002] # LATIN SMALL LETTER P WITH MIDDLE TILDE +1D88 ; [.1D8F.0020.0002] # LATIN SMALL LETTER P WITH PALATAL HOOK +01A5 ; [.1D90.0020.0002] # LATIN SMALL LETTER P WITH HOOK +01A4 ; [.1D90.0020.0008] # LATIN CAPITAL LETTER P WITH HOOK +A753 ; [.1D94.0020.0002] # LATIN SMALL LETTER P WITH FLOURISH +A752 ; [.1D94.0020.0008] # LATIN CAPITAL LETTER P WITH FLOURISH +A755 ; [.1D95.0020.0002] # LATIN SMALL LETTER P WITH SQUIRREL TAIL +A754 ; [.1D95.0020.0008] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A7FC ; [.1D96.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED P +0278 ; [.1D97.0020.0002] # LATIN SMALL LETTER PHI +1DB2 ; [.1D97.0020.0014] # MODIFIER LETTER SMALL PHI +2C77 ; [.1D9B.0020.0002] # LATIN SMALL LETTER TAILLESS PHI +0071 ; [.1D9C.0020.0002] # LATIN SMALL LETTER Q +FF51 ; [.1D9C.0020.0003] # FULLWIDTH LATIN SMALL LETTER Q +24AC ; [*0310.0020.0004][.1D9C.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Q +1D42A ; [.1D9C.0020.0005] # MATHEMATICAL BOLD SMALL Q +1D45E ; [.1D9C.0020.0005] # MATHEMATICAL ITALIC SMALL Q +1D492 ; [.1D9C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Q +1D4C6 ; [.1D9C.0020.0005] # MATHEMATICAL SCRIPT SMALL Q +1D4FA ; [.1D9C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Q +1D52E ; [.1D9C.0020.0005] # MATHEMATICAL FRAKTUR SMALL Q +1D562 ; [.1D9C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D596 ; [.1D9C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Q +1D5CA ; [.1D9C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Q +1D5FE ; [.1D9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D632 ; [.1D9C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D666 ; [.1D9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D69A ; [.1D9C.0020.0005] # MATHEMATICAL MONOSPACE SMALL Q +24E0 ; [.1D9C.0020.0006] # CIRCLED LATIN SMALL LETTER Q +0051 ; [.1D9C.0020.0008] # LATIN CAPITAL LETTER Q +FF31 ; [.1D9C.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Q +1F120 ; [*0310.0020.0004][.1D9C.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Q +211A ; [.1D9C.0020.000B] # DOUBLE-STRUCK CAPITAL Q +1D410 ; [.1D9C.0020.000B] # MATHEMATICAL BOLD CAPITAL Q +1D444 ; [.1D9C.0020.000B] # MATHEMATICAL ITALIC CAPITAL Q +1D478 ; [.1D9C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Q +1D4AC ; [.1D9C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Q +1D4E0 ; [.1D9C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D514 ; [.1D9C.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Q +1D57C ; [.1D9C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D5B0 ; [.1D9C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Q +1D5E4 ; [.1D9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D618 ; [.1D9C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D64C ; [.1D9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D680 ; [.1D9C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Q +24C6 ; [.1D9C.0020.000C] # CIRCLED LATIN CAPITAL LETTER Q +1F160 ; [.1D9C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Q +1F140 ; [.1D9C.0020.001D] # SQUARED LATIN CAPITAL LETTER Q +1F180 ; [.1D9C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Q +0239 ; [.1D9C.0020.0004][.1D87.0020.0004] # LATIN SMALL LETTER QP DIGRAPH +A757 ; [.1DA0.0020.0002] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +A756 ; [.1DA0.0020.0008] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A759 ; [.1DA1.0020.0002] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE +A758 ; [.1DA1.0020.0008] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +02A0 ; [.1DA2.0020.0002] # LATIN SMALL LETTER Q WITH HOOK +024B ; [.1DA6.0020.0002] # LATIN SMALL LETTER Q WITH HOOK TAIL +024A ; [.1DA6.0020.0008] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +0138 ; [.1DAA.0020.0002] # LATIN SMALL LETTER KRA +0072 ; [.1DAE.0020.0002] # LATIN SMALL LETTER R +FF52 ; [.1DAE.0020.0003] # FULLWIDTH LATIN SMALL LETTER R +036C ; [.1DAE.0020.0004] # COMBINING LATIN SMALL LETTER R +1DCA ; [.1DAE.0020.0004] # COMBINING LATIN SMALL LETTER R BELOW +24AD ; [*0310.0020.0004][.1DAE.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER R +1D42B ; [.1DAE.0020.0005] # MATHEMATICAL BOLD SMALL R +1D45F ; [.1DAE.0020.0005] # MATHEMATICAL ITALIC SMALL R +1D493 ; [.1DAE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL R +1D4C7 ; [.1DAE.0020.0005] # MATHEMATICAL SCRIPT SMALL R +1D4FB ; [.1DAE.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL R +1D52F ; [.1DAE.0020.0005] # MATHEMATICAL FRAKTUR SMALL R +1D563 ; [.1DAE.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL R +1D597 ; [.1DAE.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL R +1D5CB ; [.1DAE.0020.0005] # MATHEMATICAL SANS-SERIF SMALL R +1D5FF ; [.1DAE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL R +1D633 ; [.1DAE.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D667 ; [.1DAE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D69B ; [.1DAE.0020.0005] # MATHEMATICAL MONOSPACE SMALL R +24E1 ; [.1DAE.0020.0006] # CIRCLED LATIN SMALL LETTER R +0052 ; [.1DAE.0020.0008] # LATIN CAPITAL LETTER R +FF32 ; [.1DAE.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER R +1F121 ; [*0310.0020.0004][.1DAE.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER R +211B ; [.1DAE.0020.000B] # SCRIPT CAPITAL R +211C ; [.1DAE.0020.000B] # BLACK-LETTER CAPITAL R +211D ; [.1DAE.0020.000B] # DOUBLE-STRUCK CAPITAL R +1D411 ; [.1DAE.0020.000B] # MATHEMATICAL BOLD CAPITAL R +1D445 ; [.1DAE.0020.000B] # MATHEMATICAL ITALIC CAPITAL R +1D479 ; [.1DAE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL R +1D4E1 ; [.1DAE.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL R +1D57D ; [.1DAE.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D5B1 ; [.1DAE.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL R +1D5E5 ; [.1DAE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D619 ; [.1DAE.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D64D ; [.1DAE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D681 ; [.1DAE.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL R +24C7 ; [.1DAE.0020.000C] # CIRCLED LATIN CAPITAL LETTER R +1F12C ; [.1DAE.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER R +1F161 ; [.1DAE.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER R +02B3 ; [.1DAE.0020.0014] # MODIFIER LETTER SMALL R +1D63 ; [.1DAE.0020.0015] # LATIN SUBSCRIPT SMALL LETTER R +1D3F ; [.1DAE.0020.001D] # MODIFIER LETTER CAPITAL R +1F141 ; [.1DAE.0020.001D] # SQUARED LATIN CAPITAL LETTER R +1F181 ; [.1DAE.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER R +0155 ; [.1DAE.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER R WITH ACUTE +0154 ; [.1DAE.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER R WITH ACUTE +0159 ; [.1DAE.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER R WITH CARON +0158 ; [.1DAE.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER R WITH CARON +1E59 ; [.1DAE.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER R WITH DOT ABOVE +1E58 ; [.1DAE.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER R WITH DOT ABOVE +0157 ; [.1DAE.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER R WITH CEDILLA +0156 ; [.1DAE.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER R WITH CEDILLA +A7A7 ; [.1DAE.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER R WITH OBLIQUE STROKE +A7A6 ; [.1DAE.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +0211 ; [.1DAE.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER R WITH DOUBLE GRAVE +0210 ; [.1DAE.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0213 ; [.1DAE.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER R WITH INVERTED BREVE +0212 ; [.1DAE.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER R WITH INVERTED BREVE +1E5B ; [.1DAE.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER R WITH DOT BELOW +1E5A ; [.1DAE.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5D ; [.1DAE.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5C ; [.1DAE.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5F ; [.1DAE.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER R WITH LINE BELOW +1E5E ; [.1DAE.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER R WITH LINE BELOW +A783 ; [.1DAE.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR R +A782 ; [.1DAE.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR R +33AD ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C] # SQUARE RAD +33AE ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C][*0605.0020.001C][.1DEC.0020.001C] # SQUARE RAD OVER S +33AF ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C][*0605.0020.001C][.1DEC.0020.001C][.1BBA.0020.001C] # SQUARE RAD OVER S SQUARED +20A8 ; [.1DAE.0020.000A][.1DEC.0020.0004] # RUPEE SIGN +AB45 ; [.1DB2.0020.0002] # LATIN SMALL LETTER STIRRUP R +0280 ; [.1DB3.0020.0002] # LATIN LETTER SMALL CAPITAL R +1DE2 ; [.1DB3.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL R +01A6 ; [.1DB3.0020.0008] # LATIN LETTER YR +AB46 ; [.1DB7.0020.0002] # LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG +A75B ; [.1DB8.0020.0002] # LATIN SMALL LETTER R ROTUNDA +1DE3 ; [.1DB8.0020.0004] # COMBINING LATIN SMALL LETTER R ROTUNDA +A75A ; [.1DB8.0020.0008] # LATIN CAPITAL LETTER R ROTUNDA +1D19 ; [.1DB9.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED R +024D ; [.1DBA.0020.0002] # LATIN SMALL LETTER R WITH STROKE +024C ; [.1DBA.0020.0008] # LATIN CAPITAL LETTER R WITH STROKE +1D72 ; [.1DBE.0020.0002] # LATIN SMALL LETTER R WITH MIDDLE TILDE +0279 ; [.1DBF.0020.0002] # LATIN SMALL LETTER TURNED R +02B4 ; [.1DBF.0020.0014] # MODIFIER LETTER SMALL TURNED R +1D1A ; [.1DC3.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED R +027A ; [.1DC4.0020.0002] # LATIN SMALL LETTER TURNED R WITH LONG LEG +1D89 ; [.1DC8.0020.0002] # LATIN SMALL LETTER R WITH PALATAL HOOK +027B ; [.1DC9.0020.0002] # LATIN SMALL LETTER TURNED R WITH HOOK +02B5 ; [.1DC9.0020.0014] # MODIFIER LETTER SMALL TURNED R WITH HOOK +2C79 ; [.1DCD.0020.0002] # LATIN SMALL LETTER TURNED R WITH TAIL +027C ; [.1DCE.0020.0002] # LATIN SMALL LETTER R WITH LONG LEG +027D ; [.1DD2.0020.0002] # LATIN SMALL LETTER R WITH TAIL +2C64 ; [.1DD2.0020.0008] # LATIN CAPITAL LETTER R WITH TAIL +AB49 ; [.1DD6.0020.0002] # LATIN SMALL LETTER R WITH CROSSED-TAIL +027E ; [.1DD7.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK +1D73 ; [.1DDB.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE +027F ; [.1DDC.0020.0002] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK +AB47 ; [.1DE0.0020.0002] # LATIN SMALL LETTER R WITHOUT HANDLE +AB48 ; [.1DE1.0020.0002] # LATIN SMALL LETTER DOUBLE R +AB4A ; [.1DE2.0020.0002] # LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL +AB4B ; [.1DE3.0020.0002] # LATIN SMALL LETTER SCRIPT R +AB4C ; [.1DE4.0020.0002] # LATIN SMALL LETTER SCRIPT R WITH RING +0281 ; [.1DE5.0020.0002] # LATIN LETTER SMALL CAPITAL INVERTED R +02B6 ; [.1DE5.0020.0014] # MODIFIER LETTER SMALL CAPITAL INVERTED R +A775 ; [.1DE9.0020.0002] # LATIN SMALL LETTER RUM +A776 ; [.1DEA.0020.0002] # LATIN LETTER SMALL CAPITAL RUM +A75D ; [.1DEB.0020.0002] # LATIN SMALL LETTER RUM ROTUNDA +A75C ; [.1DEB.0020.0008] # LATIN CAPITAL LETTER RUM ROTUNDA +0073 ; [.1DEC.0020.0002] # LATIN SMALL LETTER S +FF53 ; [.1DEC.0020.0003] # FULLWIDTH LATIN SMALL LETTER S +1DE4 ; [.1DEC.0020.0004] # COMBINING LATIN SMALL LETTER S +24AE ; [*0310.0020.0004][.1DEC.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER S +1D42C ; [.1DEC.0020.0005] # MATHEMATICAL BOLD SMALL S +1D460 ; [.1DEC.0020.0005] # MATHEMATICAL ITALIC SMALL S +1D494 ; [.1DEC.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL S +1D4C8 ; [.1DEC.0020.0005] # MATHEMATICAL SCRIPT SMALL S +1D4FC ; [.1DEC.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL S +1D530 ; [.1DEC.0020.0005] # MATHEMATICAL FRAKTUR SMALL S +1D564 ; [.1DEC.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL S +1D598 ; [.1DEC.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL S +1D5CC ; [.1DEC.0020.0005] # MATHEMATICAL SANS-SERIF SMALL S +1D600 ; [.1DEC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL S +1D634 ; [.1DEC.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D668 ; [.1DEC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D69C ; [.1DEC.0020.0005] # MATHEMATICAL MONOSPACE SMALL S +24E2 ; [.1DEC.0020.0006] # CIRCLED LATIN SMALL LETTER S +0053 ; [.1DEC.0020.0008] # LATIN CAPITAL LETTER S +FF33 ; [.1DEC.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER S +1F122 ; [*0310.0020.0004][.1DEC.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER S +1F12A ; [*0372.0020.0004][.1DEC.0020.000A][*0373.0020.0004] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S +1D412 ; [.1DEC.0020.000B] # MATHEMATICAL BOLD CAPITAL S +1D446 ; [.1DEC.0020.000B] # MATHEMATICAL ITALIC CAPITAL S +1D47A ; [.1DEC.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL S +1D4AE ; [.1DEC.0020.000B] # MATHEMATICAL SCRIPT CAPITAL S +1D4E2 ; [.1DEC.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL S +1D516 ; [.1DEC.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL S +1D54A ; [.1DEC.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D57E ; [.1DEC.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D5B2 ; [.1DEC.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL S +1D5E6 ; [.1DEC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D61A ; [.1DEC.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D64E ; [.1DEC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D682 ; [.1DEC.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL S +24C8 ; [.1DEC.0020.000C] # CIRCLED LATIN CAPITAL LETTER S +1F162 ; [.1DEC.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER S +02E2 ; [.1DEC.0020.0014] # MODIFIER LETTER SMALL S +209B ; [.1DEC.0020.0015] # LATIN SUBSCRIPT SMALL LETTER S +1F142 ; [.1DEC.0020.001D] # SQUARED LATIN CAPITAL LETTER S +1F182 ; [.1DEC.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER S +015B ; [.1DEC.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER S WITH ACUTE +015A ; [.1DEC.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER S WITH ACUTE +1E65 ; [.1DEC.0020.0002][.0000.0024.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E64 ; [.1DEC.0020.0008][.0000.0024.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +015D ; [.1DEC.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER S WITH CIRCUMFLEX +015C ; [.1DEC.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0161 ; [.1DEC.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER S WITH CARON +0160 ; [.1DEC.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER S WITH CARON +1E67 ; [.1DEC.0020.0002][.0000.0028.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E66 ; [.1DEC.0020.0008][.0000.0028.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E61 ; [.1DEC.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT ABOVE +1E60 ; [.1DEC.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT ABOVE +015F ; [.1DEC.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER S WITH CEDILLA +015E ; [.1DEC.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER S WITH CEDILLA +A7A9 ; [.1DEC.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER S WITH OBLIQUE STROKE +A7A8 ; [.1DEC.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +1E63 ; [.1DEC.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER S WITH DOT BELOW +1E62 ; [.1DEC.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW +1E69 ; [.1DEC.0020.0002][.0000.0042.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E68 ; [.1DEC.0020.0008][.0000.0042.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +0219 ; [.1DEC.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER S WITH COMMA BELOW +0218 ; [.1DEC.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER S WITH COMMA BELOW +017F ; [.1DEC.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER LONG S +1DE5 ; [.1DEC.0020.0004][.0000.010C.0004] # COMBINING LATIN SMALL LETTER LONG S +A785 ; [.1DEC.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR S +A784 ; [.1DEC.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR S +1E9B ; [.1DEC.0020.0004][.0000.010C.0004][.0000.002E.0002] # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1F18D ; [.1DEC.0020.001D][.1BC2.0020.001D] # NEGATIVE SQUARED SA +1F14C ; [.1DEC.0020.001D][.1C0A.0020.001D] # SQUARED SD +2120 ; [.1DEC.0020.0014][.1D25.0020.0014] # SERVICE MARK +1F198 ; [.1DEC.0020.001D][.1D58.0020.001D][.1DEC.0020.001D] # SQUARED SOS +33DB ; [.1DEC.0020.001C][.1DAE.0020.001C] # SQUARE SR +1F14D ; [.1DEC.0020.001D][.1DEC.0020.001D] # SQUARED SS +00DF ; [.1DEC.0020.0004][.0000.010B.0004][.1DEC.0020.0004] # LATIN SMALL LETTER SHARP S +1E9E ; [.1DEC.0020.000A][.0000.010B.0004][.1DEC.0020.000A] # LATIN CAPITAL LETTER SHARP S +FB06 ; [.1DEC.0020.0004][.1E10.0020.0004] # LATIN SMALL LIGATURE ST +FB05 ; [.1DEC.0020.0004][.0000.010C.0004][.1E10.0020.0004] # LATIN SMALL LIGATURE LONG S T +33DC ; [.1DEC.0020.001D][.1E5E.0020.001C] # SQUARE SV +A731 ; [.1DF0.0020.0002] # LATIN LETTER SMALL CAPITAL S +1D74 ; [.1DF1.0020.0002] # LATIN SMALL LETTER S WITH MIDDLE TILDE +1D8A ; [.1DF2.0020.0002] # LATIN SMALL LETTER S WITH PALATAL HOOK +0282 ; [.1DF3.0020.0002] # LATIN SMALL LETTER S WITH HOOK +1DB3 ; [.1DF3.0020.0014] # MODIFIER LETTER SMALL S WITH HOOK +023F ; [.1DF7.0020.0002] # LATIN SMALL LETTER S WITH SWASH TAIL +2C7E ; [.1DF7.0020.0008] # LATIN CAPITAL LETTER S WITH SWASH TAIL +1E9C ; [.1DFB.0020.0002] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE +1E9D ; [.1DFC.0020.0002] # LATIN SMALL LETTER LONG S WITH HIGH STROKE +0283 ; [.1DFD.0020.0002] # LATIN SMALL LETTER ESH +1DEF ; [.1DFD.0020.0004] # COMBINING LATIN SMALL LETTER ESH +01A9 ; [.1DFD.0020.0008] # LATIN CAPITAL LETTER ESH +1DB4 ; [.1DFD.0020.0014] # MODIFIER LETTER SMALL ESH +AB4D ; [.1E01.0020.0002] # LATIN SMALL LETTER BASELINE ESH +1D8B ; [.1E02.0020.0002] # LATIN SMALL LETTER ESH WITH PALATAL HOOK +01AA ; [.1E03.0020.0002] # LATIN LETTER REVERSED ESH LOOP +0285 ; [.1E07.0020.0002] # LATIN SMALL LETTER SQUAT REVERSED ESH +1D98 ; [.1E0B.0020.0002] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK +0286 ; [.1E0C.0020.0002] # LATIN SMALL LETTER ESH WITH CURL +0074 ; [.1E10.0020.0002] # LATIN SMALL LETTER T +FF54 ; [.1E10.0020.0003] # FULLWIDTH LATIN SMALL LETTER T +036D ; [.1E10.0020.0004] # COMBINING LATIN SMALL LETTER T +24AF ; [*0310.0020.0004][.1E10.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER T +1D42D ; [.1E10.0020.0005] # MATHEMATICAL BOLD SMALL T +1D461 ; [.1E10.0020.0005] # MATHEMATICAL ITALIC SMALL T +1D495 ; [.1E10.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL T +1D4C9 ; [.1E10.0020.0005] # MATHEMATICAL SCRIPT SMALL T +1D4FD ; [.1E10.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL T +1D531 ; [.1E10.0020.0005] # MATHEMATICAL FRAKTUR SMALL T +1D565 ; [.1E10.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL T +1D599 ; [.1E10.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL T +1D5CD ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF SMALL T +1D601 ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL T +1D635 ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D669 ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D69D ; [.1E10.0020.0005] # MATHEMATICAL MONOSPACE SMALL T +24E3 ; [.1E10.0020.0006] # CIRCLED LATIN SMALL LETTER T +0054 ; [.1E10.0020.0008] # LATIN CAPITAL LETTER T +FF34 ; [.1E10.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER T +1F123 ; [*0310.0020.0004][.1E10.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER T +1D413 ; [.1E10.0020.000B] # MATHEMATICAL BOLD CAPITAL T +1D447 ; [.1E10.0020.000B] # MATHEMATICAL ITALIC CAPITAL T +1D47B ; [.1E10.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL T +1D4AF ; [.1E10.0020.000B] # MATHEMATICAL SCRIPT CAPITAL T +1D4E3 ; [.1E10.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL T +1D517 ; [.1E10.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL T +1D54B ; [.1E10.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D57F ; [.1E10.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D5B3 ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL T +1D5E7 ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D61B ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D64F ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D683 ; [.1E10.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL T +24C9 ; [.1E10.0020.000C] # CIRCLED LATIN CAPITAL LETTER T +1F163 ; [.1E10.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER T +1D57 ; [.1E10.0020.0014] # MODIFIER LETTER SMALL T +209C ; [.1E10.0020.0015] # LATIN SUBSCRIPT SMALL LETTER T +1D40 ; [.1E10.0020.001D] # MODIFIER LETTER CAPITAL T +1F143 ; [.1E10.0020.001D] # SQUARED LATIN CAPITAL LETTER T +1F183 ; [.1E10.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER T +0165 ; [.1E10.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER T WITH CARON +0164 ; [.1E10.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER T WITH CARON +1E97 ; [.1E10.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER T WITH DIAERESIS +1E6B ; [.1E10.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER T WITH DOT ABOVE +1E6A ; [.1E10.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER T WITH DOT ABOVE +0163 ; [.1E10.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER T WITH CEDILLA +0162 ; [.1E10.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER T WITH CEDILLA +1E6D ; [.1E10.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER T WITH DOT BELOW +1E6C ; [.1E10.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER T WITH DOT BELOW +021B ; [.1E10.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER T WITH COMMA BELOW +021A ; [.1E10.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER T WITH COMMA BELOW +1E71 ; [.1E10.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E70 ; [.1E10.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E6F ; [.1E10.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER T WITH LINE BELOW +1E6E ; [.1E10.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER T WITH LINE BELOW +A787 ; [.1E10.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR T +A786 ; [.1E10.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR T +02A8 ; [.1E10.0020.0004][.1C04.0020.0004] # LATIN SMALL LETTER TC DIGRAPH WITH CURL +2121 ; [.1E10.0020.000A][.1C25.0020.000A][.1CF2.0020.000A] # TELEPHONE SIGN +1D7A ; [.1E10.0020.0004][.0000.010B.0004][.1C93.0020.0004] # LATIN SMALL LETTER TH WITH STRIKETHROUGH +3394 ; [.1E10.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] # SQUARE THZ +2122 ; [.1E10.0020.0014][.1D25.0020.0014] # TRADE MARK SIGN +01BE ; [.1E10.0020.0004][.1DEC.0020.0004] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE +02A6 ; [.1E10.0020.0004][.1DEC.0020.0004] # LATIN SMALL LETTER TS DIGRAPH +02A7 ; [.1E10.0020.0004][.1DFD.0020.0004] # LATIN SMALL LETTER TESH DIGRAPH +A729 ; [.1E10.0020.0004][.1E9C.0020.0004] # LATIN SMALL LETTER TZ +A728 ; [.1E10.0020.000A][.1E9C.0020.0004] # LATIN CAPITAL LETTER TZ +1D1B ; [.1E14.0020.0002] # LATIN LETTER SMALL CAPITAL T +0167 ; [.1E15.0020.0002] # LATIN SMALL LETTER T WITH STROKE +0166 ; [.1E15.0020.0008] # LATIN CAPITAL LETTER T WITH STROKE +2C66 ; [.1E19.0020.0002] # LATIN SMALL LETTER T WITH DIAGONAL STROKE +023E ; [.1E19.0020.0008] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +1D75 ; [.1E1A.0020.0002] # LATIN SMALL LETTER T WITH MIDDLE TILDE +01AB ; [.1E1B.0020.0002] # LATIN SMALL LETTER T WITH PALATAL HOOK +1DB5 ; [.1E1B.0020.0014] # MODIFIER LETTER SMALL T WITH PALATAL HOOK +01AD ; [.1E1F.0020.0002] # LATIN SMALL LETTER T WITH HOOK +01AC ; [.1E1F.0020.0008] # LATIN CAPITAL LETTER T WITH HOOK +0288 ; [.1E23.0020.0002] # LATIN SMALL LETTER T WITH RETROFLEX HOOK +01AE ; [.1E23.0020.0008] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +0236 ; [.1E27.0020.0002] # LATIN SMALL LETTER T WITH CURL +A777 ; [.1E2B.0020.0002] # LATIN SMALL LETTER TUM +0287 ; [.1E2C.0020.0002] # LATIN SMALL LETTER TURNED T +A7B1 ; [.1E2C.0020.0008] # LATIN CAPITAL LETTER TURNED T +0075 ; [.1E30.0020.0002] # LATIN SMALL LETTER U +FF55 ; [.1E30.0020.0003] # FULLWIDTH LATIN SMALL LETTER U +0367 ; [.1E30.0020.0004] # COMBINING LATIN SMALL LETTER U +24B0 ; [*0310.0020.0004][.1E30.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER U +1D42E ; [.1E30.0020.0005] # MATHEMATICAL BOLD SMALL U +1D462 ; [.1E30.0020.0005] # MATHEMATICAL ITALIC SMALL U +1D496 ; [.1E30.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL U +1D4CA ; [.1E30.0020.0005] # MATHEMATICAL SCRIPT SMALL U +1D4FE ; [.1E30.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL U +1D532 ; [.1E30.0020.0005] # MATHEMATICAL FRAKTUR SMALL U +1D566 ; [.1E30.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL U +1D59A ; [.1E30.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL U +1D5CE ; [.1E30.0020.0005] # MATHEMATICAL SANS-SERIF SMALL U +1D602 ; [.1E30.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL U +1D636 ; [.1E30.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D66A ; [.1E30.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D69E ; [.1E30.0020.0005] # MATHEMATICAL MONOSPACE SMALL U +24E4 ; [.1E30.0020.0006] # CIRCLED LATIN SMALL LETTER U +0055 ; [.1E30.0020.0008] # LATIN CAPITAL LETTER U +FF35 ; [.1E30.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER U +1F124 ; [*0310.0020.0004][.1E30.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER U +1D414 ; [.1E30.0020.000B] # MATHEMATICAL BOLD CAPITAL U +1D448 ; [.1E30.0020.000B] # MATHEMATICAL ITALIC CAPITAL U +1D47C ; [.1E30.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL U +1D4B0 ; [.1E30.0020.000B] # MATHEMATICAL SCRIPT CAPITAL U +1D4E4 ; [.1E30.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL U +1D518 ; [.1E30.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL U +1D54C ; [.1E30.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D580 ; [.1E30.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D5B4 ; [.1E30.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL U +1D5E8 ; [.1E30.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D61C ; [.1E30.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D650 ; [.1E30.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D684 ; [.1E30.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL U +24CA ; [.1E30.0020.000C] # CIRCLED LATIN CAPITAL LETTER U +1F164 ; [.1E30.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER U +1D58 ; [.1E30.0020.0014] # MODIFIER LETTER SMALL U +1D64 ; [.1E30.0020.0015] # LATIN SUBSCRIPT SMALL LETTER U +1D41 ; [.1E30.0020.001D] # MODIFIER LETTER CAPITAL U +1F144 ; [.1E30.0020.001D] # SQUARED LATIN CAPITAL LETTER U +1F184 ; [.1E30.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER U +00FA ; [.1E30.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH ACUTE +00DA ; [.1E30.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH ACUTE +00F9 ; [.1E30.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH GRAVE +00D9 ; [.1E30.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH GRAVE +016D ; [.1E30.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER U WITH BREVE +016C ; [.1E30.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER U WITH BREVE +00FB ; [.1E30.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX +00DB ; [.1E30.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +01D4 ; [.1E30.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH CARON +01D3 ; [.1E30.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH CARON +016F ; [.1E30.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER U WITH RING ABOVE +016E ; [.1E30.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER U WITH RING ABOVE +00FC ; [.1E30.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH DIAERESIS +1DF4 ; [.1E30.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER U WITH DIAERESIS +A79F ; [.1E30.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK UE +00DC ; [.1E30.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS +A79E ; [.1E30.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK UE +01D8 ; [.1E30.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D7 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01DC ; [.1E30.0020.0002][.0000.002B.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DB ; [.1E30.0020.0008][.0000.002B.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DA ; [.1E30.0020.0002][.0000.002B.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01D9 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01D6 ; [.1E30.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D5 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +0171 ; [.1E30.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0170 ; [.1E30.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0169 ; [.1E30.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH TILDE +0168 ; [.1E30.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH TILDE +1E79 ; [.1E30.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E78 ; [.1E30.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +0173 ; [.1E30.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER U WITH OGONEK +0172 ; [.1E30.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER U WITH OGONEK +016B ; [.1E30.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH MACRON +016A ; [.1E30.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH MACRON +1E7B ; [.1E30.0020.0002][.0000.0032.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7A ; [.1E30.0020.0008][.0000.0032.0002][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1DF0 ; [.1E30.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE +1EE7 ; [.1E30.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HOOK ABOVE +1EE6 ; [.1E30.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HOOK ABOVE +0215 ; [.1E30.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER U WITH DOUBLE GRAVE +0214 ; [.1E30.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0217 ; [.1E30.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER U WITH INVERTED BREVE +0216 ; [.1E30.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER U WITH INVERTED BREVE +01B0 ; [.1E30.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER U WITH HORN +01AF ; [.1E30.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER U WITH HORN +1EE9 ; [.1E30.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH HORN AND ACUTE +1EE8 ; [.1E30.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEB ; [.1E30.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEA ; [.1E30.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEF ; [.1E30.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH HORN AND TILDE +1EEE ; [.1E30.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EED ; [.1E30.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEC ; [.1E30.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EF1 ; [.1E30.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF0 ; [.1E30.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EE5 ; [.1E30.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH DOT BELOW +1EE4 ; [.1E30.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH DOT BELOW +1E73 ; [.1E30.0020.0002][.0000.0043.0002] # LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E72 ; [.1E30.0020.0008][.0000.0043.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E77 ; [.1E30.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E76 ; [.1E30.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E75 ; [.1E30.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER U WITH TILDE BELOW +1E74 ; [.1E30.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER U WITH TILDE BELOW +1F199 ; [.1E30.0020.001D][.1D87.0020.001D][*025F.0020.001C] # SQUARED UP WITH EXCLAMATION MARK +1D1C ; [.1E34.0020.0002] # LATIN LETTER SMALL CAPITAL U +1DB8 ; [.1E34.0020.0014] # MODIFIER LETTER SMALL CAPITAL U +AB4E ; [.1E35.0020.0002] # LATIN SMALL LETTER U WITH SHORT RIGHT LEG +1D1D ; [.1E36.0020.0002] # LATIN SMALL LETTER SIDEWAYS U +1D59 ; [.1E36.0020.0014] # MODIFIER LETTER SMALL SIDEWAYS U +1D1E ; [.1E37.0020.0002] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U +1D6B ; [.1E38.0020.0002] # LATIN SMALL LETTER UE +AB50 ; [.1E39.0020.0002] # LATIN SMALL LETTER UI +AB51 ; [.1E3A.0020.0002] # LATIN SMALL LETTER TURNED UI +0289 ; [.1E3B.0020.0002] # LATIN SMALL LETTER U BAR +0244 ; [.1E3B.0020.0008] # LATIN CAPITAL LETTER U BAR +1DB6 ; [.1E3B.0020.0014] # MODIFIER LETTER SMALL U BAR +AB4F ; [.1E3F.0020.0002] # LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG +1D7E ; [.1E40.0020.0002] # LATIN SMALL CAPITAL LETTER U WITH STROKE +1D99 ; [.1E41.0020.0002] # LATIN SMALL LETTER U WITH RETROFLEX HOOK +AB52 ; [.1E42.0020.0002] # LATIN SMALL LETTER U WITH LEFT HOOK +AB5F ; [.1E42.0020.0014] # MODIFIER LETTER SMALL U WITH LEFT HOOK +0265 ; [.1E43.0020.0002] # LATIN SMALL LETTER TURNED H +A78D ; [.1E43.0020.0008] # LATIN CAPITAL LETTER TURNED H +1DA3 ; [.1E43.0020.0014] # MODIFIER LETTER SMALL TURNED H +02AE ; [.1E47.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK +02AF ; [.1E4B.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +026F ; [.1E4F.0020.0002] # LATIN SMALL LETTER TURNED M +019C ; [.1E4F.0020.0008] # LATIN CAPITAL LETTER TURNED M +1D5A ; [.1E4F.0020.0014] # MODIFIER LETTER SMALL TURNED M +A7FA ; [.1E53.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED M +1D1F ; [.1E54.0020.0002] # LATIN SMALL LETTER SIDEWAYS TURNED M +0270 ; [.1E55.0020.0002] # LATIN SMALL LETTER TURNED M WITH LONG LEG +1DAD ; [.1E55.0020.0014] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG +028A ; [.1E59.0020.0002] # LATIN SMALL LETTER UPSILON +01B1 ; [.1E59.0020.0008] # LATIN CAPITAL LETTER UPSILON +1DB7 ; [.1E59.0020.0014] # MODIFIER LETTER SMALL UPSILON +1D7F ; [.1E5D.0020.0002] # LATIN SMALL LETTER UPSILON WITH STROKE +0076 ; [.1E5E.0020.0002] # LATIN SMALL LETTER V +FF56 ; [.1E5E.0020.0003] # FULLWIDTH LATIN SMALL LETTER V +036E ; [.1E5E.0020.0004] # COMBINING LATIN SMALL LETTER V +2174 ; [.1E5E.0020.0004] # SMALL ROMAN NUMERAL FIVE +24B1 ; [*0310.0020.0004][.1E5E.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER V +1D42F ; [.1E5E.0020.0005] # MATHEMATICAL BOLD SMALL V +1D463 ; [.1E5E.0020.0005] # MATHEMATICAL ITALIC SMALL V +1D497 ; [.1E5E.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL V +1D4CB ; [.1E5E.0020.0005] # MATHEMATICAL SCRIPT SMALL V +1D4FF ; [.1E5E.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL V +1D533 ; [.1E5E.0020.0005] # MATHEMATICAL FRAKTUR SMALL V +1D567 ; [.1E5E.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL V +1D59B ; [.1E5E.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL V +1D5CF ; [.1E5E.0020.0005] # MATHEMATICAL SANS-SERIF SMALL V +1D603 ; [.1E5E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL V +1D637 ; [.1E5E.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D66B ; [.1E5E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D69F ; [.1E5E.0020.0005] # MATHEMATICAL MONOSPACE SMALL V +24E5 ; [.1E5E.0020.0006] # CIRCLED LATIN SMALL LETTER V +0056 ; [.1E5E.0020.0008] # LATIN CAPITAL LETTER V +FF36 ; [.1E5E.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER V +2164 ; [.1E5E.0020.000A] # ROMAN NUMERAL FIVE +1F125 ; [*0310.0020.0004][.1E5E.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER V +1D415 ; [.1E5E.0020.000B] # MATHEMATICAL BOLD CAPITAL V +1D449 ; [.1E5E.0020.000B] # MATHEMATICAL ITALIC CAPITAL V +1D47D ; [.1E5E.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL V +1D4B1 ; [.1E5E.0020.000B] # MATHEMATICAL SCRIPT CAPITAL V +1D4E5 ; [.1E5E.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL V +1D519 ; [.1E5E.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL V +1D54D ; [.1E5E.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D581 ; [.1E5E.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D5B5 ; [.1E5E.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL V +1D5E9 ; [.1E5E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D61D ; [.1E5E.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D651 ; [.1E5E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D685 ; [.1E5E.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL V +24CB ; [.1E5E.0020.000C] # CIRCLED LATIN CAPITAL LETTER V +1F165 ; [.1E5E.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER V +1D5B ; [.1E5E.0020.0014] # MODIFIER LETTER SMALL V +1D65 ; [.1E5E.0020.0015] # LATIN SUBSCRIPT SMALL LETTER V +2C7D ; [.1E5E.0020.001D] # MODIFIER LETTER CAPITAL V +1F145 ; [.1E5E.0020.001D] # SQUARED LATIN CAPITAL LETTER V +1F185 ; [.1E5E.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER V +1E7D ; [.1E5E.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER V WITH TILDE +1E7C ; [.1E5E.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER V WITH TILDE +1E7F ; [.1E5E.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER V WITH DOT BELOW +1E7E ; [.1E5E.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER V WITH DOT BELOW +2175 ; [.1E5E.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL SIX +2165 ; [.1E5E.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL SIX +2176 ; [.1E5E.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL SEVEN +2166 ; [.1E5E.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL SEVEN +2177 ; [.1E5E.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL EIGHT +2167 ; [.1E5E.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL EIGHT +33DE ; [.1E5E.0020.001D][*0605.0020.001C][.1D25.0020.001C] # SQUARE V OVER M +1F19A ; [.1E5E.0020.001D][.1DEC.0020.001D] # SQUARED VS +A761 ; [.1E5E.0020.0004][.1E86.0020.0004] # LATIN SMALL LETTER VY +A760 ; [.1E5E.0020.000A][.1E86.0020.000A] # LATIN CAPITAL LETTER VY +1D20 ; [.1E62.0020.0002] # LATIN LETTER SMALL CAPITAL V +A75F ; [.1E63.0020.0002] # LATIN SMALL LETTER V WITH DIAGONAL STROKE +A75E ; [.1E63.0020.0008] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +1D8C ; [.1E64.0020.0002] # LATIN SMALL LETTER V WITH PALATAL HOOK +028B ; [.1E65.0020.0002] # LATIN SMALL LETTER V WITH HOOK +01B2 ; [.1E65.0020.0008] # LATIN CAPITAL LETTER V WITH HOOK +1DB9 ; [.1E65.0020.0014] # MODIFIER LETTER SMALL V WITH HOOK +2C71 ; [.1E69.0020.0002] # LATIN SMALL LETTER V WITH RIGHT HOOK +2C74 ; [.1E6A.0020.0002] # LATIN SMALL LETTER V WITH CURL +1EFD ; [.1E6B.0020.0002] # LATIN SMALL LETTER MIDDLE-WELSH V +1EFC ; [.1E6B.0020.0008] # LATIN CAPITAL LETTER MIDDLE-WELSH V +028C ; [.1E6C.0020.0002] # LATIN SMALL LETTER TURNED V +0245 ; [.1E6C.0020.0008] # LATIN CAPITAL LETTER TURNED V +1DBA ; [.1E6C.0020.0014] # MODIFIER LETTER SMALL TURNED V +0077 ; [.1E70.0020.0002] # LATIN SMALL LETTER W +FF57 ; [.1E70.0020.0003] # FULLWIDTH LATIN SMALL LETTER W +1DF1 ; [.1E70.0020.0004] # COMBINING LATIN SMALL LETTER W +24B2 ; [*0310.0020.0004][.1E70.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER W +1D430 ; [.1E70.0020.0005] # MATHEMATICAL BOLD SMALL W +1D464 ; [.1E70.0020.0005] # MATHEMATICAL ITALIC SMALL W +1D498 ; [.1E70.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL W +1D4CC ; [.1E70.0020.0005] # MATHEMATICAL SCRIPT SMALL W +1D500 ; [.1E70.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL W +1D534 ; [.1E70.0020.0005] # MATHEMATICAL FRAKTUR SMALL W +1D568 ; [.1E70.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL W +1D59C ; [.1E70.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL W +1D5D0 ; [.1E70.0020.0005] # MATHEMATICAL SANS-SERIF SMALL W +1D604 ; [.1E70.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL W +1D638 ; [.1E70.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D66C ; [.1E70.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D6A0 ; [.1E70.0020.0005] # MATHEMATICAL MONOSPACE SMALL W +24E6 ; [.1E70.0020.0006] # CIRCLED LATIN SMALL LETTER W +0057 ; [.1E70.0020.0008] # LATIN CAPITAL LETTER W +FF37 ; [.1E70.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER W +1F126 ; [*0310.0020.0004][.1E70.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER W +1D416 ; [.1E70.0020.000B] # MATHEMATICAL BOLD CAPITAL W +1D44A ; [.1E70.0020.000B] # MATHEMATICAL ITALIC CAPITAL W +1D47E ; [.1E70.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL W +1D4B2 ; [.1E70.0020.000B] # MATHEMATICAL SCRIPT CAPITAL W +1D4E6 ; [.1E70.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL W +1D51A ; [.1E70.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL W +1D54E ; [.1E70.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D582 ; [.1E70.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D5B6 ; [.1E70.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL W +1D5EA ; [.1E70.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D61E ; [.1E70.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D652 ; [.1E70.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D686 ; [.1E70.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL W +24CC ; [.1E70.0020.000C] # CIRCLED LATIN CAPITAL LETTER W +1F166 ; [.1E70.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER W +02B7 ; [.1E70.0020.0014] # MODIFIER LETTER SMALL W +1D42 ; [.1E70.0020.001D] # MODIFIER LETTER CAPITAL W +1F146 ; [.1E70.0020.001D] # SQUARED LATIN CAPITAL LETTER W +1F186 ; [.1E70.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER W +1E83 ; [.1E70.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER W WITH ACUTE +1E82 ; [.1E70.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER W WITH ACUTE +1E81 ; [.1E70.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER W WITH GRAVE +1E80 ; [.1E70.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER W WITH GRAVE +0175 ; [.1E70.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER W WITH CIRCUMFLEX +0174 ; [.1E70.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +1E98 ; [.1E70.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER W WITH RING ABOVE +1E85 ; [.1E70.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER W WITH DIAERESIS +1E84 ; [.1E70.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER W WITH DIAERESIS +1E87 ; [.1E70.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER W WITH DOT ABOVE +1E86 ; [.1E70.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E89 ; [.1E70.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER W WITH DOT BELOW +1E88 ; [.1E70.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER W WITH DOT BELOW +33DD ; [.1E70.0020.001D][.1BDB.0020.001C] # SQUARE WB +1F14F ; [.1E70.0020.001D][.1BF5.0020.001D] # SQUARED WC +1F18F ; [.1E70.0020.001D][.1BF5.0020.001D] # NEGATIVE SQUARED WC +1F12E ; [.1E70.0020.000C][.1E9C.0020.000C] # CIRCLED WZ +1D21 ; [.1E74.0020.0002] # LATIN LETTER SMALL CAPITAL W +2C73 ; [.1E75.0020.0002] # LATIN SMALL LETTER W WITH HOOK +2C72 ; [.1E75.0020.0008] # LATIN CAPITAL LETTER W WITH HOOK +028D ; [.1E76.0020.0002] # LATIN SMALL LETTER TURNED W +0078 ; [.1E7A.0020.0002] # LATIN SMALL LETTER X +FF58 ; [.1E7A.0020.0003] # FULLWIDTH LATIN SMALL LETTER X +036F ; [.1E7A.0020.0004] # COMBINING LATIN SMALL LETTER X +2179 ; [.1E7A.0020.0004] # SMALL ROMAN NUMERAL TEN +24B3 ; [*0310.0020.0004][.1E7A.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER X +1D431 ; [.1E7A.0020.0005] # MATHEMATICAL BOLD SMALL X +1D465 ; [.1E7A.0020.0005] # MATHEMATICAL ITALIC SMALL X +1D499 ; [.1E7A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL X +1D4CD ; [.1E7A.0020.0005] # MATHEMATICAL SCRIPT SMALL X +1D501 ; [.1E7A.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL X +1D535 ; [.1E7A.0020.0005] # MATHEMATICAL FRAKTUR SMALL X +1D569 ; [.1E7A.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL X +1D59D ; [.1E7A.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL X +1D5D1 ; [.1E7A.0020.0005] # MATHEMATICAL SANS-SERIF SMALL X +1D605 ; [.1E7A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL X +1D639 ; [.1E7A.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D66D ; [.1E7A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D6A1 ; [.1E7A.0020.0005] # MATHEMATICAL MONOSPACE SMALL X +24E7 ; [.1E7A.0020.0006] # CIRCLED LATIN SMALL LETTER X +0058 ; [.1E7A.0020.0008] # LATIN CAPITAL LETTER X +FF38 ; [.1E7A.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER X +2169 ; [.1E7A.0020.000A] # ROMAN NUMERAL TEN +1F127 ; [*0310.0020.0004][.1E7A.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER X +1D417 ; [.1E7A.0020.000B] # MATHEMATICAL BOLD CAPITAL X +1D44B ; [.1E7A.0020.000B] # MATHEMATICAL ITALIC CAPITAL X +1D47F ; [.1E7A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL X +1D4B3 ; [.1E7A.0020.000B] # MATHEMATICAL SCRIPT CAPITAL X +1D4E7 ; [.1E7A.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL X +1D51B ; [.1E7A.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL X +1D54F ; [.1E7A.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D583 ; [.1E7A.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D5B7 ; [.1E7A.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL X +1D5EB ; [.1E7A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D61F ; [.1E7A.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D653 ; [.1E7A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D687 ; [.1E7A.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL X +24CD ; [.1E7A.0020.000C] # CIRCLED LATIN CAPITAL LETTER X +1F167 ; [.1E7A.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER X +02E3 ; [.1E7A.0020.0014] # MODIFIER LETTER SMALL X +2093 ; [.1E7A.0020.0015] # LATIN SUBSCRIPT SMALL LETTER X +1F147 ; [.1E7A.0020.001D] # SQUARED LATIN CAPITAL LETTER X +1F187 ; [.1E7A.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER X +1E8D ; [.1E7A.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER X WITH DIAERESIS +1E8C ; [.1E7A.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8B ; [.1E7A.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER X WITH DOT ABOVE +1E8A ; [.1E7A.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER X WITH DOT ABOVE +217A ; [.1E7A.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL ELEVEN +216A ; [.1E7A.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL ELEVEN +217B ; [.1E7A.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL TWELVE +216B ; [.1E7A.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL TWELVE +1D8D ; [.1E7E.0020.0002] # LATIN SMALL LETTER X WITH PALATAL HOOK +AB56 ; [.1E7F.0020.0002] # LATIN SMALL LETTER X WITH LOW RIGHT RING +AB57 ; [.1E80.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG +AB58 ; [.1E81.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING +AB59 ; [.1E82.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF +AB53 ; [.1E83.0020.0002] # LATIN SMALL LETTER CHI +A7B3 ; [.1E83.0020.0008] # LATIN CAPITAL LETTER CHI +AB54 ; [.1E84.0020.0002] # LATIN SMALL LETTER CHI WITH LOW RIGHT RING +AB55 ; [.1E85.0020.0002] # LATIN SMALL LETTER CHI WITH LOW LEFT SERIF +0079 ; [.1E86.0020.0002] # LATIN SMALL LETTER Y +FF59 ; [.1E86.0020.0003] # FULLWIDTH LATIN SMALL LETTER Y +24B4 ; [*0310.0020.0004][.1E86.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Y +1D432 ; [.1E86.0020.0005] # MATHEMATICAL BOLD SMALL Y +1D466 ; [.1E86.0020.0005] # MATHEMATICAL ITALIC SMALL Y +1D49A ; [.1E86.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Y +1D4CE ; [.1E86.0020.0005] # MATHEMATICAL SCRIPT SMALL Y +1D502 ; [.1E86.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Y +1D536 ; [.1E86.0020.0005] # MATHEMATICAL FRAKTUR SMALL Y +1D56A ; [.1E86.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D59E ; [.1E86.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Y +1D5D2 ; [.1E86.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Y +1D606 ; [.1E86.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D63A ; [.1E86.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D66E ; [.1E86.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D6A2 ; [.1E86.0020.0005] # MATHEMATICAL MONOSPACE SMALL Y +24E8 ; [.1E86.0020.0006] # CIRCLED LATIN SMALL LETTER Y +0059 ; [.1E86.0020.0008] # LATIN CAPITAL LETTER Y +FF39 ; [.1E86.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Y +1F128 ; [*0310.0020.0004][.1E86.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Y +1D418 ; [.1E86.0020.000B] # MATHEMATICAL BOLD CAPITAL Y +1D44C ; [.1E86.0020.000B] # MATHEMATICAL ITALIC CAPITAL Y +1D480 ; [.1E86.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Y +1D4B4 ; [.1E86.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Y +1D4E8 ; [.1E86.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D51C ; [.1E86.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Y +1D550 ; [.1E86.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D584 ; [.1E86.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D5B8 ; [.1E86.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Y +1D5EC ; [.1E86.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D620 ; [.1E86.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D654 ; [.1E86.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D688 ; [.1E86.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Y +24CE ; [.1E86.0020.000C] # CIRCLED LATIN CAPITAL LETTER Y +1F168 ; [.1E86.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Y +02B8 ; [.1E86.0020.0014] # MODIFIER LETTER SMALL Y +1F148 ; [.1E86.0020.001D] # SQUARED LATIN CAPITAL LETTER Y +1F188 ; [.1E86.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Y +00FD ; [.1E86.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Y WITH ACUTE +00DD ; [.1E86.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Y WITH ACUTE +1EF3 ; [.1E86.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER Y WITH GRAVE +1EF2 ; [.1E86.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER Y WITH GRAVE +0177 ; [.1E86.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0176 ; [.1E86.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +1E99 ; [.1E86.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER Y WITH RING ABOVE +00FF ; [.1E86.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER Y WITH DIAERESIS +0178 ; [.1E86.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER Y WITH DIAERESIS +1EF9 ; [.1E86.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER Y WITH TILDE +1EF8 ; [.1E86.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER Y WITH TILDE +1E8F ; [.1E86.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Y WITH DOT ABOVE +1E8E ; [.1E86.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Y WITH DOT ABOVE +0233 ; [.1E86.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER Y WITH MACRON +0232 ; [.1E86.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER Y WITH MACRON +1EF7 ; [.1E86.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF6 ; [.1E86.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF5 ; [.1E86.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Y WITH DOT BELOW +1EF4 ; [.1E86.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Y WITH DOT BELOW +028F ; [.1E8A.0020.0002] # LATIN LETTER SMALL CAPITAL Y +024F ; [.1E8E.0020.0002] # LATIN SMALL LETTER Y WITH STROKE +024E ; [.1E8E.0020.0008] # LATIN CAPITAL LETTER Y WITH STROKE +01B4 ; [.1E92.0020.0002] # LATIN SMALL LETTER Y WITH HOOK +01B3 ; [.1E92.0020.0008] # LATIN CAPITAL LETTER Y WITH HOOK +1EFF ; [.1E96.0020.0002] # LATIN SMALL LETTER Y WITH LOOP +1EFE ; [.1E96.0020.0008] # LATIN CAPITAL LETTER Y WITH LOOP +AB5A ; [.1E97.0020.0002] # LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +021D ; [.1E98.0020.0002] # LATIN SMALL LETTER YOGH +021C ; [.1E98.0020.0008] # LATIN CAPITAL LETTER YOGH +007A ; [.1E9C.0020.0002] # LATIN SMALL LETTER Z +FF5A ; [.1E9C.0020.0003] # FULLWIDTH LATIN SMALL LETTER Z +1DE6 ; [.1E9C.0020.0004] # COMBINING LATIN SMALL LETTER Z +24B5 ; [*0310.0020.0004][.1E9C.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Z +1D433 ; [.1E9C.0020.0005] # MATHEMATICAL BOLD SMALL Z +1D467 ; [.1E9C.0020.0005] # MATHEMATICAL ITALIC SMALL Z +1D49B ; [.1E9C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Z +1D4CF ; [.1E9C.0020.0005] # MATHEMATICAL SCRIPT SMALL Z +1D503 ; [.1E9C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Z +1D537 ; [.1E9C.0020.0005] # MATHEMATICAL FRAKTUR SMALL Z +1D56B ; [.1E9C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D59F ; [.1E9C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5D3 ; [.1E9C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Z +1D607 ; [.1E9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D63B ; [.1E9C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D66F ; [.1E9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D6A3 ; [.1E9C.0020.0005] # MATHEMATICAL MONOSPACE SMALL Z +24E9 ; [.1E9C.0020.0006] # CIRCLED LATIN SMALL LETTER Z +005A ; [.1E9C.0020.0008] # LATIN CAPITAL LETTER Z +FF3A ; [.1E9C.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Z +1F129 ; [*0310.0020.0004][.1E9C.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Z +2124 ; [.1E9C.0020.000B] # DOUBLE-STRUCK CAPITAL Z +2128 ; [.1E9C.0020.000B] # BLACK-LETTER CAPITAL Z +1D419 ; [.1E9C.0020.000B] # MATHEMATICAL BOLD CAPITAL Z +1D44D ; [.1E9C.0020.000B] # MATHEMATICAL ITALIC CAPITAL Z +1D481 ; [.1E9C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Z +1D4B5 ; [.1E9C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Z +1D4E9 ; [.1E9C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D585 ; [.1E9C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D5B9 ; [.1E9C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Z +1D5ED ; [.1E9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D621 ; [.1E9C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D655 ; [.1E9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D689 ; [.1E9C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Z +24CF ; [.1E9C.0020.000C] # CIRCLED LATIN CAPITAL LETTER Z +1F169 ; [.1E9C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1DBB ; [.1E9C.0020.0014] # MODIFIER LETTER SMALL Z +1F149 ; [.1E9C.0020.001D] # SQUARED LATIN CAPITAL LETTER Z +1F189 ; [.1E9C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Z +017A ; [.1E9C.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Z WITH ACUTE +0179 ; [.1E9C.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Z WITH ACUTE +1E91 ; [.1E9C.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E90 ; [.1E9C.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +017E ; [.1E9C.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER Z WITH CARON +017D ; [.1E9C.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER Z WITH CARON +017C ; [.1E9C.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Z WITH DOT ABOVE +017B ; [.1E9C.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Z WITH DOT ABOVE +1E93 ; [.1E9C.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Z WITH DOT BELOW +1E92 ; [.1E9C.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E95 ; [.1E9C.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER Z WITH LINE BELOW +1E94 ; [.1E9C.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER Z WITH LINE BELOW +018D ; [.1E9C.0020.0004][.1E70.0020.0004] # LATIN SMALL LETTER TURNED DELTA +1D22 ; [.1EA0.0020.0002] # LATIN LETTER SMALL CAPITAL Z +01B6 ; [.1EA1.0020.0002] # LATIN SMALL LETTER Z WITH STROKE +01B5 ; [.1EA1.0020.0008] # LATIN CAPITAL LETTER Z WITH STROKE +1D76 ; [.1EA5.0020.0002] # LATIN SMALL LETTER Z WITH MIDDLE TILDE +1D8E ; [.1EA6.0020.0002] # LATIN SMALL LETTER Z WITH PALATAL HOOK +0225 ; [.1EA7.0020.0002] # LATIN SMALL LETTER Z WITH HOOK +0224 ; [.1EA7.0020.0008] # LATIN CAPITAL LETTER Z WITH HOOK +0290 ; [.1EAB.0020.0002] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK +1DBC ; [.1EAB.0020.0014] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +0291 ; [.1EAF.0020.0002] # LATIN SMALL LETTER Z WITH CURL +1DBD ; [.1EAF.0020.0014] # MODIFIER LETTER SMALL Z WITH CURL +0240 ; [.1EB3.0020.0002] # LATIN SMALL LETTER Z WITH SWASH TAIL +2C7F ; [.1EB3.0020.0008] # LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C6C ; [.1EB7.0020.0002] # LATIN SMALL LETTER Z WITH DESCENDER +2C6B ; [.1EB7.0020.0008] # LATIN CAPITAL LETTER Z WITH DESCENDER +A763 ; [.1EB8.0020.0002] # LATIN SMALL LETTER VISIGOTHIC Z +A762 ; [.1EB8.0020.0008] # LATIN CAPITAL LETTER VISIGOTHIC Z +0292 ; [.1EB9.0020.0002] # LATIN SMALL LETTER EZH +01B7 ; [.1EB9.0020.0008] # LATIN CAPITAL LETTER EZH +1DBE ; [.1EB9.0020.0014] # MODIFIER LETTER SMALL EZH +01EF ; [.1EB9.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER EZH WITH CARON +01EE ; [.1EB9.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER EZH WITH CARON +1D23 ; [.1EBD.0020.0002] # LATIN LETTER SMALL CAPITAL EZH +01B9 ; [.1EBE.0020.0002] # LATIN SMALL LETTER EZH REVERSED +01B8 ; [.1EBE.0020.0008] # LATIN CAPITAL LETTER EZH REVERSED +1D9A ; [.1EC2.0020.0002] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +01BA ; [.1EC3.0020.0002] # LATIN SMALL LETTER EZH WITH TAIL +0293 ; [.1EC7.0020.0002] # LATIN SMALL LETTER EZH WITH CURL +00FE ; [.1ECB.0020.0002] # LATIN SMALL LETTER THORN +00DE ; [.1ECB.0020.0008] # LATIN CAPITAL LETTER THORN +A765 ; [.1ECF.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE +A764 ; [.1ECF.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE +A767 ; [.1ED0.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +A766 ; [.1ED0.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +01BF ; [.1ED1.0020.0002] # LATIN LETTER WYNN +01F7 ; [.1ED1.0020.0008] # LATIN CAPITAL LETTER WYNN +A769 ; [.1ED5.0020.0002] # LATIN SMALL LETTER VEND +A768 ; [.1ED5.0020.0008] # LATIN CAPITAL LETTER VEND +AB60 ; [.1ED6.0020.0002] # LATIN SMALL LETTER SAKHA YAT +AB61 ; [.1ED7.0020.0002] # LATIN SMALL LETTER IOTIFIED E +AB63 ; [.1ED8.0020.0002] # LATIN SMALL LETTER UO +A76B ; [.1ED9.0020.0002] # LATIN SMALL LETTER ET +A76A ; [.1ED9.0020.0008] # LATIN CAPITAL LETTER ET +A76D ; [.1EDA.0020.0002] # LATIN SMALL LETTER IS +A76C ; [.1EDA.0020.0008] # LATIN CAPITAL LETTER IS +A76F ; [.1EDB.0020.0002] # LATIN SMALL LETTER CON +1DD2 ; [.1EDB.0020.0004] # COMBINING US ABOVE +A76E ; [.1EDB.0020.0008] # LATIN CAPITAL LETTER CON +A770 ; [.1EDB.0020.0014] # MODIFIER LETTER US +A778 ; [.1EDC.0020.0002] # LATIN SMALL LETTER UM +01BB ; [.1EDD.0020.0002] # LATIN LETTER TWO WITH STROKE +A72B ; [.1EE1.0020.0002] # LATIN SMALL LETTER TRESILLO +A72A ; [.1EE1.0020.0008] # LATIN CAPITAL LETTER TRESILLO +A72D ; [.1EE2.0020.0002] # LATIN SMALL LETTER CUATRILLO +A72C ; [.1EE2.0020.0008] # LATIN CAPITAL LETTER CUATRILLO +A72F ; [.1EE3.0020.0002] # LATIN SMALL LETTER CUATRILLO WITH COMMA +A72E ; [.1EE3.0020.0008] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +01A8 ; [.1EE4.0020.0002] # LATIN SMALL LETTER TONE TWO +01A7 ; [.1EE4.0020.0008] # LATIN CAPITAL LETTER TONE TWO +01BD ; [.1EE8.0020.0002] # LATIN SMALL LETTER TONE FIVE +01BC ; [.1EE8.0020.0008] # LATIN CAPITAL LETTER TONE FIVE +0185 ; [.1EEC.0020.0002] # LATIN SMALL LETTER TONE SIX +0184 ; [.1EEC.0020.0008] # LATIN CAPITAL LETTER TONE SIX +0294 ; [.1EF0.0020.0002] # LATIN LETTER GLOTTAL STOP +0242 ; [.1EF4.0020.0002] # LATIN SMALL LETTER GLOTTAL STOP +0241 ; [.1EF4.0020.0008] # LATIN CAPITAL LETTER GLOTTAL STOP +02C0 ; [.1EF8.0020.0002] # MODIFIER LETTER GLOTTAL STOP +02BC ; [.1EF9.0020.0002] # MODIFIER LETTER APOSTROPHE +0149 ; [.1EF9.0020.0004][.1D34.0020.0004] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +02EE ; [.1EFA.0020.0002] # MODIFIER LETTER DOUBLE APOSTROPHE +02BE ; [.1EFB.0020.0002] # MODIFIER LETTER RIGHT HALF RING +A723 ; [.1EFC.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF +A722 ; [.1EFC.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A78C ; [.1EFD.0020.0002] # LATIN SMALL LETTER SALTILLO +A78B ; [.1EFD.0020.0008] # LATIN CAPITAL LETTER SALTILLO +A78F ; [.1EFE.0020.0002] # LATIN LETTER SINOLOGICAL DOT +0295 ; [.1EFF.0020.0002] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE +02E4 ; [.1EFF.0020.0014] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02BF ; [.1F03.0020.0002] # MODIFIER LETTER LEFT HALF RING +02C1 ; [.1F04.0020.0002] # MODIFIER LETTER REVERSED GLOTTAL STOP +1D24 ; [.1F05.0020.0002] # LATIN LETTER VOICED LARYNGEAL SPIRANT +1D25 ; [.1F06.0020.0002] # LATIN LETTER AIN +1D5C ; [.1F06.0020.0014] # MODIFIER LETTER SMALL AIN +A725 ; [.1F07.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL AIN +A724 ; [.1F07.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +02A1 ; [.1F08.0020.0002] # LATIN LETTER GLOTTAL STOP WITH STROKE +02A2 ; [.1F0C.0020.0002] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE +0296 ; [.1F10.0020.0002] # LATIN LETTER INVERTED GLOTTAL STOP +01C0 ; [.1F14.0020.0002] # LATIN LETTER DENTAL CLICK +01C1 ; [.1F18.0020.0002] # LATIN LETTER LATERAL CLICK +01C2 ; [.1F1C.0020.0002] # LATIN LETTER ALVEOLAR CLICK +01C3 ; [.1F20.0020.0002] # LATIN LETTER RETROFLEX CLICK +0297 ; [.1F24.0020.0002] # LATIN LETTER STRETCHED C +0298 ; [.1F28.0020.0002] # LATIN LETTER BILABIAL CLICK +02AC ; [.1F2C.0020.0002] # LATIN LETTER BILABIAL PERCUSSIVE +02AD ; [.1F30.0020.0002] # LATIN LETTER BIDENTAL PERCUSSIVE +03B1 ; [.1F34.0020.0002] # GREEK SMALL LETTER ALPHA +1D6C2 ; [.1F34.0020.0005] # MATHEMATICAL BOLD SMALL ALPHA +1D6FC ; [.1F34.0020.0005] # MATHEMATICAL ITALIC SMALL ALPHA +1D736 ; [.1F34.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D770 ; [.1F34.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D7AA ; [.1F34.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +0391 ; [.1F34.0020.0008] # GREEK CAPITAL LETTER ALPHA +1D6A8 ; [.1F34.0020.000B] # MATHEMATICAL BOLD CAPITAL ALPHA +1D6E2 ; [.1F34.0020.000B] # MATHEMATICAL ITALIC CAPITAL ALPHA +1D71C ; [.1F34.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D756 ; [.1F34.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D790 ; [.1F34.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1F00 ; [.1F34.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ALPHA WITH PSILI +1F08 ; [.1F34.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F04 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +1F0C ; [.1F34.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F84 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F8C ; [.1F34.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F02 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +1F0A ; [.1F34.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F82 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F8A ; [.1F34.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F06 ; [.1F34.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0E ; [.1F34.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F86 ; [.1F34.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F8E ; [.1F34.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F80 ; [.1F34.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F88 ; [.1F34.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F01 ; [.1F34.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ALPHA WITH DASIA +1F09 ; [.1F34.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F05 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +1F0D ; [.1F34.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F85 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F8D ; [.1F34.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F03 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +1F0B ; [.1F34.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F83 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F8B ; [.1F34.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F07 ; [.1F34.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F0F ; [.1F34.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F87 ; [.1F34.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F8F ; [.1F34.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F81 ; [.1F34.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F89 ; [.1F34.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +03AC ; [.1F34.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH TONOS +1F71 ; [.1F34.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH OXIA +0386 ; [.1F34.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH TONOS +1FBB ; [.1F34.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FB4 ; [.1F34.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1F70 ; [.1F34.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH VARIA +1FBA ; [.1F34.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FB2 ; [.1F34.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB0 ; [.1F34.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER ALPHA WITH VRACHY +1FB8 ; [.1F34.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB6 ; [.1F34.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7 ; [.1F34.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB1 ; [.1F34.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER ALPHA WITH MACRON +1FB9 ; [.1F34.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FB3 ; [.1F34.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FBC ; [.1F34.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +03B2 ; [.1F35.0020.0002] # GREEK SMALL LETTER BETA +03D0 ; [.1F35.0020.0004] # GREEK BETA SYMBOL +1D6C3 ; [.1F35.0020.0005] # MATHEMATICAL BOLD SMALL BETA +1D6FD ; [.1F35.0020.0005] # MATHEMATICAL ITALIC SMALL BETA +1D737 ; [.1F35.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL BETA +1D771 ; [.1F35.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D7AB ; [.1F35.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +0392 ; [.1F35.0020.0008] # GREEK CAPITAL LETTER BETA +1D6A9 ; [.1F35.0020.000B] # MATHEMATICAL BOLD CAPITAL BETA +1D6E3 ; [.1F35.0020.000B] # MATHEMATICAL ITALIC CAPITAL BETA +1D71D ; [.1F35.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D757 ; [.1F35.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D791 ; [.1F35.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D5D ; [.1F35.0020.0014] # MODIFIER LETTER SMALL BETA +1D66 ; [.1F35.0020.0015] # GREEK SUBSCRIPT SMALL LETTER BETA +03B3 ; [.1F36.0020.0002] # GREEK SMALL LETTER GAMMA +213D ; [.1F36.0020.0005] # DOUBLE-STRUCK SMALL GAMMA +1D6C4 ; [.1F36.0020.0005] # MATHEMATICAL BOLD SMALL GAMMA +1D6FE ; [.1F36.0020.0005] # MATHEMATICAL ITALIC SMALL GAMMA +1D738 ; [.1F36.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D772 ; [.1F36.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D7AC ; [.1F36.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +0393 ; [.1F36.0020.0008] # GREEK CAPITAL LETTER GAMMA +213E ; [.1F36.0020.000B] # DOUBLE-STRUCK CAPITAL GAMMA +1D6AA ; [.1F36.0020.000B] # MATHEMATICAL BOLD CAPITAL GAMMA +1D6E4 ; [.1F36.0020.000B] # MATHEMATICAL ITALIC CAPITAL GAMMA +1D71E ; [.1F36.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D758 ; [.1F36.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D792 ; [.1F36.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D5E ; [.1F36.0020.0014] # MODIFIER LETTER SMALL GREEK GAMMA +1D67 ; [.1F36.0020.0015] # GREEK SUBSCRIPT SMALL LETTER GAMMA +1D26 ; [.1F37.0020.0002] # GREEK LETTER SMALL CAPITAL GAMMA +03B4 ; [.1F38.0020.0002] # GREEK SMALL LETTER DELTA +1D6C5 ; [.1F38.0020.0005] # MATHEMATICAL BOLD SMALL DELTA +1D6FF ; [.1F38.0020.0005] # MATHEMATICAL ITALIC SMALL DELTA +1D739 ; [.1F38.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL DELTA +1D773 ; [.1F38.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D7AD ; [.1F38.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +0394 ; [.1F38.0020.0008] # GREEK CAPITAL LETTER DELTA +1D6AB ; [.1F38.0020.000B] # MATHEMATICAL BOLD CAPITAL DELTA +1D6E5 ; [.1F38.0020.000B] # MATHEMATICAL ITALIC CAPITAL DELTA +1D71F ; [.1F38.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D759 ; [.1F38.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D793 ; [.1F38.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D5F ; [.1F38.0020.0014] # MODIFIER LETTER SMALL DELTA +03B5 ; [.1F39.0020.0002] # GREEK SMALL LETTER EPSILON +03F5 ; [.1F39.0020.0004] # GREEK LUNATE EPSILON SYMBOL +1D6C6 ; [.1F39.0020.0005] # MATHEMATICAL BOLD SMALL EPSILON +1D6DC ; [.1F39.0020.0005] # MATHEMATICAL BOLD EPSILON SYMBOL +1D700 ; [.1F39.0020.0005] # MATHEMATICAL ITALIC SMALL EPSILON +1D716 ; [.1F39.0020.0005] # MATHEMATICAL ITALIC EPSILON SYMBOL +1D73A ; [.1F39.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D750 ; [.1F39.0020.0005] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D774 ; [.1F39.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D78A ; [.1F39.0020.0005] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D7AE ; [.1F39.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7C4 ; [.1F39.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +0395 ; [.1F39.0020.0008] # GREEK CAPITAL LETTER EPSILON +1D6AC ; [.1F39.0020.000B] # MATHEMATICAL BOLD CAPITAL EPSILON +1D6E6 ; [.1F39.0020.000B] # MATHEMATICAL ITALIC CAPITAL EPSILON +1D720 ; [.1F39.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D75A ; [.1F39.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D794 ; [.1F39.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1F10 ; [.1F39.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER EPSILON WITH PSILI +1F18 ; [.1F39.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F14 ; [.1F39.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +1F1C ; [.1F39.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F12 ; [.1F39.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +1F1A ; [.1F39.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F11 ; [.1F39.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER EPSILON WITH DASIA +1F19 ; [.1F39.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F15 ; [.1F39.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F1D ; [.1F39.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F13 ; [.1F39.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +1F1B ; [.1F39.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +03AD ; [.1F39.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH TONOS +1F73 ; [.1F39.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH OXIA +0388 ; [.1F39.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH TONOS +1FC9 ; [.1F39.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH OXIA +1F72 ; [.1F39.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH VARIA +1FC8 ; [.1F39.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH VARIA +03DD ; [.1F3A.0020.0002] # GREEK SMALL LETTER DIGAMMA +1D7CB ; [.1F3A.0020.0005] # MATHEMATICAL BOLD SMALL DIGAMMA +03DC ; [.1F3A.0020.0008] # GREEK LETTER DIGAMMA +1D7CA ; [.1F3A.0020.000B] # MATHEMATICAL BOLD CAPITAL DIGAMMA +0377 ; [.1F3B.0020.0002] # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +0376 ; [.1F3B.0020.0008] # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +03DB ; [.1F3C.0020.0002] # GREEK SMALL LETTER STIGMA +03DA ; [.1F3C.0020.0008] # GREEK LETTER STIGMA +03B6 ; [.1F3D.0020.0002] # GREEK SMALL LETTER ZETA +1D6C7 ; [.1F3D.0020.0005] # MATHEMATICAL BOLD SMALL ZETA +1D701 ; [.1F3D.0020.0005] # MATHEMATICAL ITALIC SMALL ZETA +1D73B ; [.1F3D.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ZETA +1D775 ; [.1F3D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D7AF ; [.1F3D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +0396 ; [.1F3D.0020.0008] # GREEK CAPITAL LETTER ZETA +1D6AD ; [.1F3D.0020.000B] # MATHEMATICAL BOLD CAPITAL ZETA +1D6E7 ; [.1F3D.0020.000B] # MATHEMATICAL ITALIC CAPITAL ZETA +1D721 ; [.1F3D.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D75B ; [.1F3D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D795 ; [.1F3D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +0371 ; [.1F3E.0020.0002] # GREEK SMALL LETTER HETA +0370 ; [.1F3E.0020.0008] # GREEK CAPITAL LETTER HETA +03B7 ; [.1F3F.0020.0002] # GREEK SMALL LETTER ETA +1D6C8 ; [.1F3F.0020.0005] # MATHEMATICAL BOLD SMALL ETA +1D702 ; [.1F3F.0020.0005] # MATHEMATICAL ITALIC SMALL ETA +1D73C ; [.1F3F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ETA +1D776 ; [.1F3F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D7B0 ; [.1F3F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +0397 ; [.1F3F.0020.0008] # GREEK CAPITAL LETTER ETA +1D6AE ; [.1F3F.0020.000B] # MATHEMATICAL BOLD CAPITAL ETA +1D6E8 ; [.1F3F.0020.000B] # MATHEMATICAL ITALIC CAPITAL ETA +1D722 ; [.1F3F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D75C ; [.1F3F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D796 ; [.1F3F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1F20 ; [.1F3F.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ETA WITH PSILI +1F28 ; [.1F3F.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ETA WITH PSILI +1F24 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA +1F2C ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F94 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F9C ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F22 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA +1F2A ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F92 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F9A ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F26 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +1F2E ; [.1F3F.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F96 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F9E ; [.1F3F.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F90 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F98 ; [.1F3F.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F21 ; [.1F3F.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ETA WITH DASIA +1F29 ; [.1F3F.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ETA WITH DASIA +1F25 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA +1F2D ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F95 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F9D ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F23 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA +1F2B ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F93 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F9B ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F27 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F2F ; [.1F3F.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F97 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F9F ; [.1F3F.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F91 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F99 ; [.1F3F.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +03AE ; [.1F3F.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH TONOS +1F75 ; [.1F3F.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH OXIA +0389 ; [.1F3F.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH TONOS +1FCB ; [.1F3F.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH OXIA +1FC4 ; [.1F3F.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1F74 ; [.1F3F.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH VARIA +1FCA ; [.1F3F.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH VARIA +1FC2 ; [.1F3F.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC6 ; [.1F3F.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7 ; [.1F3F.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC3 ; [.1F3F.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FCC ; [.1F3F.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +03B8 ; [.1F40.0020.0002] # GREEK SMALL LETTER THETA +03D1 ; [.1F40.0020.0004] # GREEK THETA SYMBOL +1D6C9 ; [.1F40.0020.0005] # MATHEMATICAL BOLD SMALL THETA +1D6DD ; [.1F40.0020.0005] # MATHEMATICAL BOLD THETA SYMBOL +1D703 ; [.1F40.0020.0005] # MATHEMATICAL ITALIC SMALL THETA +1D717 ; [.1F40.0020.0005] # MATHEMATICAL ITALIC THETA SYMBOL +1D73D ; [.1F40.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL THETA +1D751 ; [.1F40.0020.0005] # MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D777 ; [.1F40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D78B ; [.1F40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D7B1 ; [.1F40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7C5 ; [.1F40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +0398 ; [.1F40.0020.0008] # GREEK CAPITAL LETTER THETA +03F4 ; [.1F40.0020.000A] # GREEK CAPITAL THETA SYMBOL +1D6AF ; [.1F40.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA +1D6B9 ; [.1F40.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6E9 ; [.1F40.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA +1D6F3 ; [.1F40.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D723 ; [.1F40.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D72D ; [.1F40.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D75D ; [.1F40.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D767 ; [.1F40.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D797 ; [.1F40.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D7A1 ; [.1F40.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1DBF ; [.1F40.0020.0014] # MODIFIER LETTER SMALL THETA +03B9 ; [.1F41.0020.0002] # GREEK SMALL LETTER IOTA +1FBE ; [.1F41.0020.0002] # GREEK PROSGEGRAMMENI +037A ; [.1F41.0020.0004] # GREEK YPOGEGRAMMENI +1D6CA ; [.1F41.0020.0005] # MATHEMATICAL BOLD SMALL IOTA +1D704 ; [.1F41.0020.0005] # MATHEMATICAL ITALIC SMALL IOTA +1D73E ; [.1F41.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL IOTA +1D778 ; [.1F41.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D7B2 ; [.1F41.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +0399 ; [.1F41.0020.0008] # GREEK CAPITAL LETTER IOTA +1D6B0 ; [.1F41.0020.000B] # MATHEMATICAL BOLD CAPITAL IOTA +1D6EA ; [.1F41.0020.000B] # MATHEMATICAL ITALIC CAPITAL IOTA +1D724 ; [.1F41.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D75E ; [.1F41.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D798 ; [.1F41.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1F30 ; [.1F41.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER IOTA WITH PSILI +1F38 ; [.1F41.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI +1F34 ; [.1F41.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +1F3C ; [.1F41.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F32 ; [.1F41.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +1F3A ; [.1F41.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F36 ; [.1F41.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3E ; [.1F41.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F31 ; [.1F41.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER IOTA WITH DASIA +1F39 ; [.1F41.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA +1F35 ; [.1F41.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +1F3D ; [.1F41.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F33 ; [.1F41.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +1F3B ; [.1F41.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F37 ; [.1F41.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F3F ; [.1F41.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +03AF ; [.1F41.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH TONOS +1F77 ; [.1F41.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH OXIA +038A ; [.1F41.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH TONOS +1FDB ; [.1F41.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH OXIA +1F76 ; [.1F41.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH VARIA +1FDA ; [.1F41.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH VARIA +1FD0 ; [.1F41.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER IOTA WITH VRACHY +1FD8 ; [.1F41.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD6 ; [.1F41.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PERISPOMENI +03CA ; [.1F41.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA +03AA ; [.1F41.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0390 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +1FD3 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD2 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD7 ; [.1F41.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD1 ; [.1F41.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER IOTA WITH MACRON +1FD9 ; [.1F41.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER IOTA WITH MACRON +03F3 ; [.1F42.0020.0002] # GREEK LETTER YOT +037F ; [.1F42.0020.0008] # GREEK CAPITAL LETTER YOT +03BA ; [.1F43.0020.0002] # GREEK SMALL LETTER KAPPA +03F0 ; [.1F43.0020.0004] # GREEK KAPPA SYMBOL +1D6CB ; [.1F43.0020.0005] # MATHEMATICAL BOLD SMALL KAPPA +1D6DE ; [.1F43.0020.0005] # MATHEMATICAL BOLD KAPPA SYMBOL +1D705 ; [.1F43.0020.0005] # MATHEMATICAL ITALIC SMALL KAPPA +1D718 ; [.1F43.0020.0005] # MATHEMATICAL ITALIC KAPPA SYMBOL +1D73F ; [.1F43.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D752 ; [.1F43.0020.0005] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D779 ; [.1F43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D78C ; [.1F43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D7B3 ; [.1F43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7C6 ; [.1F43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +039A ; [.1F43.0020.0008] # GREEK CAPITAL LETTER KAPPA +1D6B1 ; [.1F43.0020.000B] # MATHEMATICAL BOLD CAPITAL KAPPA +1D6EB ; [.1F43.0020.000B] # MATHEMATICAL ITALIC CAPITAL KAPPA +1D725 ; [.1F43.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D75F ; [.1F43.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D799 ; [.1F43.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +03D7 ; [.1F43.0020.0004][.1F34.0020.0004][.1F41.0020.0004] # GREEK KAI SYMBOL +03CF ; [.1F43.0020.000A][.1F34.0020.0004][.1F41.0020.0004] # GREEK CAPITAL KAI SYMBOL +03BB ; [.1F44.0020.0002] # GREEK SMALL LETTER LAMDA +1D6CC ; [.1F44.0020.0005] # MATHEMATICAL BOLD SMALL LAMDA +1D706 ; [.1F44.0020.0005] # MATHEMATICAL ITALIC SMALL LAMDA +1D740 ; [.1F44.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D77A ; [.1F44.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D7B4 ; [.1F44.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +039B ; [.1F44.0020.0008] # GREEK CAPITAL LETTER LAMDA +1D6B2 ; [.1F44.0020.000B] # MATHEMATICAL BOLD CAPITAL LAMDA +1D6EC ; [.1F44.0020.000B] # MATHEMATICAL ITALIC CAPITAL LAMDA +1D726 ; [.1F44.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D760 ; [.1F44.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D79A ; [.1F44.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D27 ; [.1F45.0020.0002] # GREEK LETTER SMALL CAPITAL LAMDA +03BC ; [.1F46.0020.0002] # GREEK SMALL LETTER MU +00B5 ; [.1F46.0020.0004] # MICRO SIGN +1D6CD ; [.1F46.0020.0005] # MATHEMATICAL BOLD SMALL MU +1D707 ; [.1F46.0020.0005] # MATHEMATICAL ITALIC SMALL MU +1D741 ; [.1F46.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL MU +1D77B ; [.1F46.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D7B5 ; [.1F46.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +039C ; [.1F46.0020.0008] # GREEK CAPITAL LETTER MU +1D6B3 ; [.1F46.0020.000B] # MATHEMATICAL BOLD CAPITAL MU +1D6ED ; [.1F46.0020.000B] # MATHEMATICAL ITALIC CAPITAL MU +1D727 ; [.1F46.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL MU +1D761 ; [.1F46.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D79B ; [.1F46.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +3382 ; [.1F46.0020.001C][.1BC2.0020.001D] # SQUARE MU A +338C ; [.1F46.0020.001C][.1C60.0020.001D] # SQUARE MU F +338D ; [.1F46.0020.001C][.1C6F.0020.001C] # SQUARE MU G +3395 ; [.1F46.0020.001C][.1CF2.0020.001C] # SQUARE MU L +339B ; [.1F46.0020.001C][.1D25.0020.001C] # SQUARE MU M +33B2 ; [.1F46.0020.001C][.1DEC.0020.001C] # SQUARE MU S +33B6 ; [.1F46.0020.001C][.1E5E.0020.001D] # SQUARE MU V +33BC ; [.1F46.0020.001C][.1E70.0020.001D] # SQUARE MU W +03BD ; [.1F47.0020.0002] # GREEK SMALL LETTER NU +1D6CE ; [.1F47.0020.0005] # MATHEMATICAL BOLD SMALL NU +1D708 ; [.1F47.0020.0005] # MATHEMATICAL ITALIC SMALL NU +1D742 ; [.1F47.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL NU +1D77C ; [.1F47.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D7B6 ; [.1F47.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +039D ; [.1F47.0020.0008] # GREEK CAPITAL LETTER NU +1D6B4 ; [.1F47.0020.000B] # MATHEMATICAL BOLD CAPITAL NU +1D6EE ; [.1F47.0020.000B] # MATHEMATICAL ITALIC CAPITAL NU +1D728 ; [.1F47.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL NU +1D762 ; [.1F47.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D79C ; [.1F47.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +03BE ; [.1F48.0020.0002] # GREEK SMALL LETTER XI +1D6CF ; [.1F48.0020.0005] # MATHEMATICAL BOLD SMALL XI +1D709 ; [.1F48.0020.0005] # MATHEMATICAL ITALIC SMALL XI +1D743 ; [.1F48.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL XI +1D77D ; [.1F48.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D7B7 ; [.1F48.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +039E ; [.1F48.0020.0008] # GREEK CAPITAL LETTER XI +1D6B5 ; [.1F48.0020.000B] # MATHEMATICAL BOLD CAPITAL XI +1D6EF ; [.1F48.0020.000B] # MATHEMATICAL ITALIC CAPITAL XI +1D729 ; [.1F48.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL XI +1D763 ; [.1F48.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D79D ; [.1F48.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +03BF ; [.1F49.0020.0002] # GREEK SMALL LETTER OMICRON +1D6D0 ; [.1F49.0020.0005] # MATHEMATICAL BOLD SMALL OMICRON +1D70A ; [.1F49.0020.0005] # MATHEMATICAL ITALIC SMALL OMICRON +1D744 ; [.1F49.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D77E ; [.1F49.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D7B8 ; [.1F49.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +039F ; [.1F49.0020.0008] # GREEK CAPITAL LETTER OMICRON +1D6B6 ; [.1F49.0020.000B] # MATHEMATICAL BOLD CAPITAL OMICRON +1D6F0 ; [.1F49.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMICRON +1D72A ; [.1F49.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D764 ; [.1F49.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D79E ; [.1F49.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1F40 ; [.1F49.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMICRON WITH PSILI +1F48 ; [.1F49.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F44 ; [.1F49.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +1F4C ; [.1F49.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F42 ; [.1F49.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +1F4A ; [.1F49.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F41 ; [.1F49.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMICRON WITH DASIA +1F49 ; [.1F49.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F45 ; [.1F49.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F4D ; [.1F49.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F43 ; [.1F49.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +1F4B ; [.1F49.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +03CC ; [.1F49.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH TONOS +1F79 ; [.1F49.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH OXIA +038C ; [.1F49.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH TONOS +1FF9 ; [.1F49.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH OXIA +1F78 ; [.1F49.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH VARIA +1FF8 ; [.1F49.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH VARIA +03C0 ; [.1F4A.0020.0002] # GREEK SMALL LETTER PI +03D6 ; [.1F4A.0020.0004] # GREEK PI SYMBOL +213C ; [.1F4A.0020.0005] # DOUBLE-STRUCK SMALL PI +1D6D1 ; [.1F4A.0020.0005] # MATHEMATICAL BOLD SMALL PI +1D6E1 ; [.1F4A.0020.0005] # MATHEMATICAL BOLD PI SYMBOL +1D70B ; [.1F4A.0020.0005] # MATHEMATICAL ITALIC SMALL PI +1D71B ; [.1F4A.0020.0005] # MATHEMATICAL ITALIC PI SYMBOL +1D745 ; [.1F4A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PI +1D755 ; [.1F4A.0020.0005] # MATHEMATICAL BOLD ITALIC PI SYMBOL +1D77F ; [.1F4A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D78F ; [.1F4A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D7B9 ; [.1F4A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7C9 ; [.1F4A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +03A0 ; [.1F4A.0020.0008] # GREEK CAPITAL LETTER PI +213F ; [.1F4A.0020.000B] # DOUBLE-STRUCK CAPITAL PI +1D6B7 ; [.1F4A.0020.000B] # MATHEMATICAL BOLD CAPITAL PI +1D6F1 ; [.1F4A.0020.000B] # MATHEMATICAL ITALIC CAPITAL PI +1D72B ; [.1F4A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PI +1D765 ; [.1F4A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D79F ; [.1F4A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D28 ; [.1F4B.0020.0002] # GREEK LETTER SMALL CAPITAL PI +03FB ; [.1F4C.0020.0002] # GREEK SMALL LETTER SAN +03FA ; [.1F4C.0020.0008] # GREEK CAPITAL LETTER SAN +03DF ; [.1F4D.0020.0002] # GREEK SMALL LETTER KOPPA +03DE ; [.1F4D.0020.0008] # GREEK LETTER KOPPA +03D9 ; [.1F4E.0020.0002] # GREEK SMALL LETTER ARCHAIC KOPPA +03D8 ; [.1F4E.0020.0008] # GREEK LETTER ARCHAIC KOPPA +03C1 ; [.1F4F.0020.0002] # GREEK SMALL LETTER RHO +03F1 ; [.1F4F.0020.0004] # GREEK RHO SYMBOL +1D6D2 ; [.1F4F.0020.0005] # MATHEMATICAL BOLD SMALL RHO +1D6E0 ; [.1F4F.0020.0005] # MATHEMATICAL BOLD RHO SYMBOL +1D70C ; [.1F4F.0020.0005] # MATHEMATICAL ITALIC SMALL RHO +1D71A ; [.1F4F.0020.0005] # MATHEMATICAL ITALIC RHO SYMBOL +1D746 ; [.1F4F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL RHO +1D754 ; [.1F4F.0020.0005] # MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D780 ; [.1F4F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D78E ; [.1F4F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D7BA ; [.1F4F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7C8 ; [.1F4F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +03A1 ; [.1F4F.0020.0008] # GREEK CAPITAL LETTER RHO +1D6B8 ; [.1F4F.0020.000B] # MATHEMATICAL BOLD CAPITAL RHO +1D6F2 ; [.1F4F.0020.000B] # MATHEMATICAL ITALIC CAPITAL RHO +1D72C ; [.1F4F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D766 ; [.1F4F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D7A0 ; [.1F4F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D68 ; [.1F4F.0020.0015] # GREEK SUBSCRIPT SMALL LETTER RHO +1FE4 ; [.1F4F.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER RHO WITH PSILI +1FE5 ; [.1F4F.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER RHO WITH DASIA +1FEC ; [.1F4F.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER RHO WITH DASIA +1D29 ; [.1F50.0020.0002] # GREEK LETTER SMALL CAPITAL RHO +03FC ; [.1F51.0020.0002] # GREEK RHO WITH STROKE SYMBOL +03C3 ; [.1F52.0020.0002] # GREEK SMALL LETTER SIGMA +03F2 ; [.1F52.0020.0004] # GREEK LUNATE SIGMA SYMBOL +1D6D3 ; [.1F52.0020.0005] # MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4 ; [.1F52.0020.0005] # MATHEMATICAL BOLD SMALL SIGMA +1D70D ; [.1F52.0020.0005] # MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E ; [.1F52.0020.0005] # MATHEMATICAL ITALIC SMALL SIGMA +1D747 ; [.1F52.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748 ; [.1F52.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D781 ; [.1F52.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782 ; [.1F52.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D7BB ; [.1F52.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC ; [.1F52.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +03A3 ; [.1F52.0020.0008] # GREEK CAPITAL LETTER SIGMA +03F9 ; [.1F52.0020.000A] # GREEK CAPITAL LUNATE SIGMA SYMBOL +1D6BA ; [.1F52.0020.000B] # MATHEMATICAL BOLD CAPITAL SIGMA +1D6F4 ; [.1F52.0020.000B] # MATHEMATICAL ITALIC CAPITAL SIGMA +1D72E ; [.1F52.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D768 ; [.1F52.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D7A2 ; [.1F52.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +03C2 ; [.1F52.0020.0019] # GREEK SMALL LETTER FINAL SIGMA +037C ; [.1F53.0020.0002] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL +03FE ; [.1F53.0020.0008] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +037B ; [.1F54.0020.0002] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL +03FD ; [.1F54.0020.0008] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +037D ; [.1F55.0020.0002] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +03FF ; [.1F55.0020.0008] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +03C4 ; [.1F56.0020.0002] # GREEK SMALL LETTER TAU +1D6D5 ; [.1F56.0020.0005] # MATHEMATICAL BOLD SMALL TAU +1D70F ; [.1F56.0020.0005] # MATHEMATICAL ITALIC SMALL TAU +1D749 ; [.1F56.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL TAU +1D783 ; [.1F56.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D7BD ; [.1F56.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +03A4 ; [.1F56.0020.0008] # GREEK CAPITAL LETTER TAU +1D6BB ; [.1F56.0020.000B] # MATHEMATICAL BOLD CAPITAL TAU +1D6F5 ; [.1F56.0020.000B] # MATHEMATICAL ITALIC CAPITAL TAU +1D72F ; [.1F56.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D769 ; [.1F56.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D7A3 ; [.1F56.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +03C5 ; [.1F57.0020.0002] # GREEK SMALL LETTER UPSILON +1D6D6 ; [.1F57.0020.0005] # MATHEMATICAL BOLD SMALL UPSILON +1D710 ; [.1F57.0020.0005] # MATHEMATICAL ITALIC SMALL UPSILON +1D74A ; [.1F57.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D784 ; [.1F57.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D7BE ; [.1F57.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +03A5 ; [.1F57.0020.0008] # GREEK CAPITAL LETTER UPSILON +03D2 ; [.1F57.0020.000A] # GREEK UPSILON WITH HOOK SYMBOL +1D6BC ; [.1F57.0020.000B] # MATHEMATICAL BOLD CAPITAL UPSILON +1D6F6 ; [.1F57.0020.000B] # MATHEMATICAL ITALIC CAPITAL UPSILON +1D730 ; [.1F57.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D76A ; [.1F57.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D7A4 ; [.1F57.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1F50 ; [.1F57.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER UPSILON WITH PSILI +1F54 ; [.1F57.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F52 ; [.1F57.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F56 ; [.1F57.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F51 ; [.1F57.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER UPSILON WITH DASIA +1F59 ; [.1F57.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F55 ; [.1F57.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +1F5D ; [.1F57.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F53 ; [.1F57.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +1F5B ; [.1F57.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F57 ; [.1F57.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F5F ; [.1F57.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +03CD ; [.1F57.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH TONOS +1F7B ; [.1F57.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH OXIA +038E ; [.1F57.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH TONOS +1FEB ; [.1F57.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH OXIA +03D3 ; [.1F57.0020.000A][.0000.0024.0002] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +1F7A ; [.1F57.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH VARIA +1FEA ; [.1F57.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FE0 ; [.1F57.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER UPSILON WITH VRACHY +1FE8 ; [.1F57.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE6 ; [.1F57.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +03CB ; [.1F57.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03AB ; [.1F57.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03D4 ; [.1F57.0020.000A][.0000.002B.0002] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03B0 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +1FE3 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE2 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE7 ; [.1F57.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE1 ; [.1F57.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER UPSILON WITH MACRON +1FE9 ; [.1F57.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER UPSILON WITH MACRON +03C6 ; [.1F58.0020.0002] # GREEK SMALL LETTER PHI +03D5 ; [.1F58.0020.0004] # GREEK PHI SYMBOL +1D6D7 ; [.1F58.0020.0005] # MATHEMATICAL BOLD SMALL PHI +1D6DF ; [.1F58.0020.0005] # MATHEMATICAL BOLD PHI SYMBOL +1D711 ; [.1F58.0020.0005] # MATHEMATICAL ITALIC SMALL PHI +1D719 ; [.1F58.0020.0005] # MATHEMATICAL ITALIC PHI SYMBOL +1D74B ; [.1F58.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PHI +1D753 ; [.1F58.0020.0005] # MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D785 ; [.1F58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D78D ; [.1F58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D7BF ; [.1F58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C7 ; [.1F58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +03A6 ; [.1F58.0020.0008] # GREEK CAPITAL LETTER PHI +1D6BD ; [.1F58.0020.000B] # MATHEMATICAL BOLD CAPITAL PHI +1D6F7 ; [.1F58.0020.000B] # MATHEMATICAL ITALIC CAPITAL PHI +1D731 ; [.1F58.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D76B ; [.1F58.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D7A5 ; [.1F58.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D60 ; [.1F58.0020.0014] # MODIFIER LETTER SMALL GREEK PHI +1D69 ; [.1F58.0020.0015] # GREEK SUBSCRIPT SMALL LETTER PHI +03C7 ; [.1F59.0020.0002] # GREEK SMALL LETTER CHI +1D6D8 ; [.1F59.0020.0005] # MATHEMATICAL BOLD SMALL CHI +1D712 ; [.1F59.0020.0005] # MATHEMATICAL ITALIC SMALL CHI +1D74C ; [.1F59.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL CHI +1D786 ; [.1F59.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D7C0 ; [.1F59.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +03A7 ; [.1F59.0020.0008] # GREEK CAPITAL LETTER CHI +1D6BE ; [.1F59.0020.000B] # MATHEMATICAL BOLD CAPITAL CHI +1D6F8 ; [.1F59.0020.000B] # MATHEMATICAL ITALIC CAPITAL CHI +1D732 ; [.1F59.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D76C ; [.1F59.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D7A6 ; [.1F59.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D61 ; [.1F59.0020.0014] # MODIFIER LETTER SMALL CHI +1D6A ; [.1F59.0020.0015] # GREEK SUBSCRIPT SMALL LETTER CHI +03C8 ; [.1F5A.0020.0002] # GREEK SMALL LETTER PSI +1D6D9 ; [.1F5A.0020.0005] # MATHEMATICAL BOLD SMALL PSI +1D713 ; [.1F5A.0020.0005] # MATHEMATICAL ITALIC SMALL PSI +1D74D ; [.1F5A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PSI +1D787 ; [.1F5A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D7C1 ; [.1F5A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +03A8 ; [.1F5A.0020.0008] # GREEK CAPITAL LETTER PSI +1D6BF ; [.1F5A.0020.000B] # MATHEMATICAL BOLD CAPITAL PSI +1D6F9 ; [.1F5A.0020.000B] # MATHEMATICAL ITALIC CAPITAL PSI +1D733 ; [.1F5A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D76D ; [.1F5A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D7A7 ; [.1F5A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D2A ; [.1F5B.0020.0002] # GREEK LETTER SMALL CAPITAL PSI +03C9 ; [.1F5C.0020.0002] # GREEK SMALL LETTER OMEGA +1D6DA ; [.1F5C.0020.0005] # MATHEMATICAL BOLD SMALL OMEGA +1D714 ; [.1F5C.0020.0005] # MATHEMATICAL ITALIC SMALL OMEGA +1D74E ; [.1F5C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D788 ; [.1F5C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D7C2 ; [.1F5C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +03A9 ; [.1F5C.0020.0008] # GREEK CAPITAL LETTER OMEGA +2126 ; [.1F5C.0020.0008] # OHM SIGN +1D6C0 ; [.1F5C.0020.000B] # MATHEMATICAL BOLD CAPITAL OMEGA +1D6FA ; [.1F5C.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMEGA +1D734 ; [.1F5C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D76E ; [.1F5C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D7A8 ; [.1F5C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1F60 ; [.1F5C.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMEGA WITH PSILI +1F68 ; [.1F5C.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F64 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +1F6C ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1FA4 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FAC ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F62 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +1F6A ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1FA2 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FAA ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F66 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6E ; [.1F5C.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1FA6 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FAE ; [.1F5C.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FA0 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA8 ; [.1F5C.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1F61 ; [.1F5C.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMEGA WITH DASIA +1F69 ; [.1F5C.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F65 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +1F6D ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1FA5 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FAD ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F63 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +1F6B ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1FA3 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FAB ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F67 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F6F ; [.1F5C.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1FA7 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FAF ; [.1F5C.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA1 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA9 ; [.1F5C.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +03CE ; [.1F5C.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH TONOS +1F7D ; [.1F5C.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH OXIA +038F ; [.1F5C.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH TONOS +1FFB ; [.1F5C.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FF4 ; [.1F5C.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1F7C ; [.1F5C.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH VARIA +1FFA ; [.1F5C.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FF2 ; [.1F5C.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF6 ; [.1F5C.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7 ; [.1F5C.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF3 ; [.1F5C.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FFC ; [.1F5C.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +AB65 ; [.1F5D.0020.0002] # GREEK LETTER SMALL CAPITAL OMEGA +03E1 ; [.1F5E.0020.0002] # GREEK SMALL LETTER SAMPI +03E0 ; [.1F5E.0020.0008] # GREEK LETTER SAMPI +0373 ; [.1F5F.0020.0002] # GREEK SMALL LETTER ARCHAIC SAMPI +0372 ; [.1F5F.0020.0008] # GREEK CAPITAL LETTER ARCHAIC SAMPI +03F8 ; [.1F60.0020.0002] # GREEK SMALL LETTER SHO +03F7 ; [.1F60.0020.0008] # GREEK CAPITAL LETTER SHO +2C81 ; [.1F61.0020.0002] # COPTIC SMALL LETTER ALFA +2C80 ; [.1F61.0020.0008] # COPTIC CAPITAL LETTER ALFA +2C83 ; [.1F62.0020.0002] # COPTIC SMALL LETTER VIDA +2C82 ; [.1F62.0020.0008] # COPTIC CAPITAL LETTER VIDA +2C85 ; [.1F63.0020.0002] # COPTIC SMALL LETTER GAMMA +2C84 ; [.1F63.0020.0008] # COPTIC CAPITAL LETTER GAMMA +2C87 ; [.1F64.0020.0002] # COPTIC SMALL LETTER DALDA +2C86 ; [.1F64.0020.0008] # COPTIC CAPITAL LETTER DALDA +2C89 ; [.1F65.0020.0002] # COPTIC SMALL LETTER EIE +2C88 ; [.1F65.0020.0008] # COPTIC CAPITAL LETTER EIE +2CB7 ; [.1F66.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB6 ; [.1F66.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2C8B ; [.1F67.0020.0002] # COPTIC SMALL LETTER SOU +2C8A ; [.1F67.0020.0008] # COPTIC CAPITAL LETTER SOU +2C8D ; [.1F68.0020.0002] # COPTIC SMALL LETTER ZATA +2C8C ; [.1F68.0020.0008] # COPTIC CAPITAL LETTER ZATA +2C8F ; [.1F69.0020.0002] # COPTIC SMALL LETTER HATE +2C8E ; [.1F69.0020.0008] # COPTIC CAPITAL LETTER HATE +2C91 ; [.1F6A.0020.0002] # COPTIC SMALL LETTER THETHE +2C90 ; [.1F6A.0020.0008] # COPTIC CAPITAL LETTER THETHE +2C93 ; [.1F6B.0020.0002] # COPTIC SMALL LETTER IAUDA +2C92 ; [.1F6B.0020.0008] # COPTIC CAPITAL LETTER IAUDA +2C95 ; [.1F6C.0020.0002] # COPTIC SMALL LETTER KAPA +2C94 ; [.1F6C.0020.0008] # COPTIC CAPITAL LETTER KAPA +2CE4 ; [.1F6C.0020.0004][.1F61.0020.0004][.1F6B.0020.0004] # COPTIC SYMBOL KAI +2CB9 ; [.1F6D.0020.0002] # COPTIC SMALL LETTER DIALECT-P KAPA +2CB8 ; [.1F6D.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P KAPA +2C97 ; [.1F6E.0020.0002] # COPTIC SMALL LETTER LAULA +2C96 ; [.1F6E.0020.0008] # COPTIC CAPITAL LETTER LAULA +2C99 ; [.1F6F.0020.0002] # COPTIC SMALL LETTER MI +2C98 ; [.1F6F.0020.0008] # COPTIC CAPITAL LETTER MI +2C9B ; [.1F70.0020.0002] # COPTIC SMALL LETTER NI +2C9A ; [.1F70.0020.0008] # COPTIC CAPITAL LETTER NI +2CBB ; [.1F71.0020.0002] # COPTIC SMALL LETTER DIALECT-P NI +2CBA ; [.1F71.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P NI +2CBD ; [.1F72.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBC ; [.1F72.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2C9D ; [.1F73.0020.0002] # COPTIC SMALL LETTER KSI +2C9C ; [.1F73.0020.0008] # COPTIC CAPITAL LETTER KSI +2C9F ; [.1F74.0020.0002] # COPTIC SMALL LETTER O +2C9E ; [.1F74.0020.0008] # COPTIC CAPITAL LETTER O +2CA1 ; [.1F75.0020.0002] # COPTIC SMALL LETTER PI +2CA0 ; [.1F75.0020.0008] # COPTIC CAPITAL LETTER PI +2CA3 ; [.1F76.0020.0002] # COPTIC SMALL LETTER RO +2CA2 ; [.1F76.0020.0008] # COPTIC CAPITAL LETTER RO +2CA5 ; [.1F77.0020.0002] # COPTIC SMALL LETTER SIMA +2CA4 ; [.1F77.0020.0008] # COPTIC CAPITAL LETTER SIMA +2CA7 ; [.1F78.0020.0002] # COPTIC SMALL LETTER TAU +2CA6 ; [.1F78.0020.0008] # COPTIC CAPITAL LETTER TAU +2CA9 ; [.1F79.0020.0002] # COPTIC SMALL LETTER UA +2CA8 ; [.1F79.0020.0008] # COPTIC CAPITAL LETTER UA +2CAB ; [.1F7A.0020.0002] # COPTIC SMALL LETTER FI +2CAA ; [.1F7A.0020.0008] # COPTIC CAPITAL LETTER FI +2CAD ; [.1F7B.0020.0002] # COPTIC SMALL LETTER KHI +2CAC ; [.1F7B.0020.0008] # COPTIC CAPITAL LETTER KHI +2CAF ; [.1F7C.0020.0002] # COPTIC SMALL LETTER PSI +2CAE ; [.1F7C.0020.0008] # COPTIC CAPITAL LETTER PSI +2CB1 ; [.1F7D.0020.0002] # COPTIC SMALL LETTER OOU +2CB0 ; [.1F7D.0020.0008] # COPTIC CAPITAL LETTER OOU +2CBF ; [.1F7E.0020.0002] # COPTIC SMALL LETTER OLD COPTIC OOU +2CBE ; [.1F7E.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC1 ; [.1F7F.0020.0002] # COPTIC SMALL LETTER SAMPI +2CC0 ; [.1F7F.0020.0008] # COPTIC CAPITAL LETTER SAMPI +03E3 ; [.1F80.0020.0002] # COPTIC SMALL LETTER SHEI +03E2 ; [.1F80.0020.0008] # COPTIC CAPITAL LETTER SHEI +2CEC ; [.1F81.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +2CEB ; [.1F81.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CC3 ; [.1F82.0020.0002] # COPTIC SMALL LETTER CROSSED SHEI +2CC2 ; [.1F82.0020.0008] # COPTIC CAPITAL LETTER CROSSED SHEI +2CC5 ; [.1F83.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHEI +2CC4 ; [.1F83.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC7 ; [.1F84.0020.0002] # COPTIC SMALL LETTER OLD COPTIC ESH +2CC6 ; [.1F84.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC ESH +03E5 ; [.1F85.0020.0002] # COPTIC SMALL LETTER FEI +03E4 ; [.1F85.0020.0008] # COPTIC CAPITAL LETTER FEI +03E7 ; [.1F86.0020.0002] # COPTIC SMALL LETTER KHEI +03E6 ; [.1F86.0020.0008] # COPTIC CAPITAL LETTER KHEI +2CF3 ; [.1F87.0020.0002] # COPTIC SMALL LETTER BOHAIRIC KHEI +2CF2 ; [.1F87.0020.0008] # COPTIC CAPITAL LETTER BOHAIRIC KHEI +2CC9 ; [.1F88.0020.0002] # COPTIC SMALL LETTER AKHMIMIC KHEI +2CC8 ; [.1F88.0020.0008] # COPTIC CAPITAL LETTER AKHMIMIC KHEI +03E9 ; [.1F89.0020.0002] # COPTIC SMALL LETTER HORI +03E8 ; [.1F89.0020.0008] # COPTIC CAPITAL LETTER HORI +2CCB ; [.1F8A.0020.0002] # COPTIC SMALL LETTER DIALECT-P HORI +2CCA ; [.1F8A.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCD ; [.1F8B.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HORI +2CCC ; [.1F8B.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCF ; [.1F8C.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HA +2CCE ; [.1F8C.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HA +2CD1 ; [.1F8D.0020.0002] # COPTIC SMALL LETTER L-SHAPED HA +2CD0 ; [.1F8D.0020.0008] # COPTIC CAPITAL LETTER L-SHAPED HA +2CD3 ; [.1F8E.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HEI +2CD2 ; [.1F8E.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD5 ; [.1F8F.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HAT +2CD4 ; [.1F8F.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HAT +03EB ; [.1F90.0020.0002] # COPTIC SMALL LETTER GANGIA +03EA ; [.1F90.0020.0008] # COPTIC CAPITAL LETTER GANGIA +2CEE ; [.1F91.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CED ; [.1F91.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CD7 ; [.1F92.0020.0002] # COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD6 ; [.1F92.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +03ED ; [.1F93.0020.0002] # COPTIC SMALL LETTER SHIMA +03EC ; [.1F93.0020.0008] # COPTIC CAPITAL LETTER SHIMA +2CD9 ; [.1F94.0020.0002] # COPTIC SMALL LETTER OLD COPTIC DJA +2CD8 ; [.1F94.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDB ; [.1F95.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDA ; [.1F95.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDD ; [.1F96.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDC ; [.1F96.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +03EF ; [.1F97.0020.0002] # COPTIC SMALL LETTER DEI +03EE ; [.1F97.0020.0008] # COPTIC CAPITAL LETTER DEI +2CB3 ; [.1F98.0020.0002] # COPTIC SMALL LETTER DIALECT-P ALEF +2CB2 ; [.1F98.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB5 ; [.1F99.0020.0002] # COPTIC SMALL LETTER OLD COPTIC AIN +2CB4 ; [.1F99.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CDF ; [.1F9A.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NGI +2CDE ; [.1F9A.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE1 ; [.1F9B.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NYI +2CE0 ; [.1F9B.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE3 ; [.1F9C.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN WAU +2CE2 ; [.1F9C.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN WAU +0430 ; [.1F9D.0020.0002] # CYRILLIC SMALL LETTER A +2DF6 ; [.1F9D.0020.0004] # COMBINING CYRILLIC LETTER A +0410 ; [.1F9D.0020.0008] # CYRILLIC CAPITAL LETTER A +04D1 ; [.1F9D.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER A WITH BREVE +04D0 ; [.1F9D.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER A WITH BREVE +04D3 ; [.1F9D.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER A WITH DIAERESIS +04D2 ; [.1F9D.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D9 ; [.1FA1.0020.0002] # CYRILLIC SMALL LETTER SCHWA +04D8 ; [.1FA1.0020.0008] # CYRILLIC CAPITAL LETTER SCHWA +04DB ; [.1FA1.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DA ; [.1FA1.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04D5 ; [.1FA5.0020.0002] # CYRILLIC SMALL LIGATURE A IE +04D4 ; [.1FA5.0020.0008] # CYRILLIC CAPITAL LIGATURE A IE +0431 ; [.1FA9.0020.0002] # CYRILLIC SMALL LETTER BE +2DE0 ; [.1FA9.0020.0004] # COMBINING CYRILLIC LETTER BE +0411 ; [.1FA9.0020.0008] # CYRILLIC CAPITAL LETTER BE +0432 ; [.1FAD.0020.0002] # CYRILLIC SMALL LETTER VE +2DE1 ; [.1FAD.0020.0004] # COMBINING CYRILLIC LETTER VE +0412 ; [.1FAD.0020.0008] # CYRILLIC CAPITAL LETTER VE +0433 ; [.1FB1.0020.0002] # CYRILLIC SMALL LETTER GHE +2DE2 ; [.1FB1.0020.0004] # COMBINING CYRILLIC LETTER GHE +0413 ; [.1FB1.0020.0008] # CYRILLIC CAPITAL LETTER GHE +0453 ; [.1FB1.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER GJE +0403 ; [.1FB1.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER GJE +0491 ; [.1FB1.0020.0004][.0000.010C.0004] # CYRILLIC SMALL LETTER GHE WITH UPTURN +0490 ; [.1FB1.0020.000A][.0000.010C.0004] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0493 ; [.1FB5.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE +0492 ; [.1FB5.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE +04FB ; [.1FB9.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +04FA ; [.1FB9.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +0495 ; [.1FBD.0020.0002] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0494 ; [.1FBD.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +04F7 ; [.1FC1.0020.0002] # CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F6 ; [.1FC1.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +0434 ; [.1FC5.0020.0002] # CYRILLIC SMALL LETTER DE +2DE3 ; [.1FC5.0020.0004] # COMBINING CYRILLIC LETTER DE +0414 ; [.1FC5.0020.0008] # CYRILLIC CAPITAL LETTER DE +0501 ; [.1FC9.0020.0002] # CYRILLIC SMALL LETTER KOMI DE +0500 ; [.1FC9.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DE +A681 ; [.1FCA.0020.0002] # CYRILLIC SMALL LETTER DWE +A680 ; [.1FCA.0020.0008] # CYRILLIC CAPITAL LETTER DWE +0452 ; [.1FCB.0020.0002] # CYRILLIC SMALL LETTER DJE +0402 ; [.1FCB.0020.0008] # CYRILLIC CAPITAL LETTER DJE +A663 ; [.1FCF.0020.0002] # CYRILLIC SMALL LETTER SOFT DE +A662 ; [.1FCF.0020.0008] # CYRILLIC CAPITAL LETTER SOFT DE +0503 ; [.1FD0.0020.0002] # CYRILLIC SMALL LETTER KOMI DJE +0502 ; [.1FD0.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DJE +0499 ; [.1FD1.0020.0002] # CYRILLIC SMALL LETTER ZE WITH DESCENDER +0498 ; [.1FD1.0020.0008] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0435 ; [.1FD5.0020.0002] # CYRILLIC SMALL LETTER IE +2DF7 ; [.1FD5.0020.0004] # COMBINING CYRILLIC LETTER IE +0415 ; [.1FD5.0020.0008] # CYRILLIC CAPITAL LETTER IE +0450 ; [.1FD5.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER IE WITH GRAVE +0400 ; [.1FD5.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER IE WITH GRAVE +04D7 ; [.1FD5.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER IE WITH BREVE +04D6 ; [.1FD5.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER IE WITH BREVE +0451 ; [.1FD5.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER IO +0401 ; [.1FD5.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER IO +0454 ; [.1FD9.0020.0002] # CYRILLIC SMALL LETTER UKRAINIAN IE +A674 ; [.1FD9.0020.0004] # COMBINING CYRILLIC LETTER UKRAINIAN IE +0404 ; [.1FD9.0020.0008] # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0436 ; [.1FDD.0020.0002] # CYRILLIC SMALL LETTER ZHE +2DE4 ; [.1FDD.0020.0004] # COMBINING CYRILLIC LETTER ZHE +0416 ; [.1FDD.0020.0008] # CYRILLIC CAPITAL LETTER ZHE +04C2 ; [.1FDD.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER ZHE WITH BREVE +04C1 ; [.1FDD.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04DD ; [.1FDD.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DC ; [.1FDD.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +052B ; [.1FE1.0020.0002] # CYRILLIC SMALL LETTER DZZHE +052A ; [.1FE1.0020.0008] # CYRILLIC CAPITAL LETTER DZZHE +A685 ; [.1FE2.0020.0002] # CYRILLIC SMALL LETTER ZHWE +A684 ; [.1FE2.0020.0008] # CYRILLIC CAPITAL LETTER ZHWE +0497 ; [.1FE3.0020.0002] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0496 ; [.1FE3.0020.0008] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0437 ; [.1FE7.0020.0002] # CYRILLIC SMALL LETTER ZE +2DE5 ; [.1FE7.0020.0004] # COMBINING CYRILLIC LETTER ZE +0417 ; [.1FE7.0020.0008] # CYRILLIC CAPITAL LETTER ZE +04DF ; [.1FE7.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04DE ; [.1FE7.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +A641 ; [.1FEB.0020.0002] # CYRILLIC SMALL LETTER ZEMLYA +A640 ; [.1FEB.0020.0008] # CYRILLIC CAPITAL LETTER ZEMLYA +0505 ; [.1FEC.0020.0002] # CYRILLIC SMALL LETTER KOMI ZJE +0504 ; [.1FEC.0020.0008] # CYRILLIC CAPITAL LETTER KOMI ZJE +0511 ; [.1FED.0020.0002] # CYRILLIC SMALL LETTER REVERSED ZE +0510 ; [.1FED.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED ZE +A643 ; [.1FEE.0020.0002] # CYRILLIC SMALL LETTER DZELO +A642 ; [.1FEE.0020.0008] # CYRILLIC CAPITAL LETTER DZELO +0455 ; [.1FEF.0020.0002] # CYRILLIC SMALL LETTER DZE +0405 ; [.1FEF.0020.0008] # CYRILLIC CAPITAL LETTER DZE +A645 ; [.1FF3.0020.0002] # CYRILLIC SMALL LETTER REVERSED DZE +A644 ; [.1FF3.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED DZE +04E1 ; [.1FF4.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN DZE +04E0 ; [.1FF4.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +A689 ; [.1FF8.0020.0002] # CYRILLIC SMALL LETTER DZZE +A688 ; [.1FF8.0020.0008] # CYRILLIC CAPITAL LETTER DZZE +0507 ; [.1FF9.0020.0002] # CYRILLIC SMALL LETTER KOMI DZJE +0506 ; [.1FF9.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DZJE +A683 ; [.1FFA.0020.0002] # CYRILLIC SMALL LETTER DZWE +A682 ; [.1FFA.0020.0008] # CYRILLIC CAPITAL LETTER DZWE +0438 ; [.1FFB.0020.0002] # CYRILLIC SMALL LETTER I +A675 ; [.1FFB.0020.0004] # COMBINING CYRILLIC LETTER I +0418 ; [.1FFB.0020.0008] # CYRILLIC CAPITAL LETTER I +045D ; [.1FFB.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER I WITH GRAVE +040D ; [.1FFB.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER I WITH GRAVE +04E5 ; [.1FFB.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER I WITH DIAERESIS +04E4 ; [.1FFB.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E3 ; [.1FFB.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER I WITH MACRON +04E2 ; [.1FFB.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER I WITH MACRON +048B ; [.1FFF.0020.0002] # CYRILLIC SMALL LETTER SHORT I WITH TAIL +048A ; [.1FFF.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +0456 ; [.2003.0020.0002] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0406 ; [.2003.0020.0008] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0457 ; [.2003.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YI +A676 ; [.2003.0020.0004][.0000.002B.0004] # COMBINING CYRILLIC LETTER YI +0407 ; [.2003.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YI +A647 ; [.2007.0020.0002] # CYRILLIC SMALL LETTER IOTA +A646 ; [.2007.0020.0008] # CYRILLIC CAPITAL LETTER IOTA +0439 ; [.2008.0020.0002] # CYRILLIC SMALL LETTER SHORT I +0438 0306 ; [.2008.0020.0002] # CYRILLIC SMALL LETTER SHORT I +0419 ; [.2008.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I +0418 0306 ; [.2008.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I +0458 ; [.200C.0020.0002] # CYRILLIC SMALL LETTER JE +0408 ; [.200C.0020.0008] # CYRILLIC CAPITAL LETTER JE +A649 ; [.2010.0020.0002] # CYRILLIC SMALL LETTER DJERV +2DF8 ; [.2010.0020.0004] # COMBINING CYRILLIC LETTER DJERV +A648 ; [.2010.0020.0008] # CYRILLIC CAPITAL LETTER DJERV +043A ; [.2011.0020.0002] # CYRILLIC SMALL LETTER KA +2DE6 ; [.2011.0020.0004] # COMBINING CYRILLIC LETTER KA +041A ; [.2011.0020.0008] # CYRILLIC CAPITAL LETTER KA +045C ; [.2011.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER KJE +040C ; [.2011.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER KJE +049B ; [.2015.0020.0002] # CYRILLIC SMALL LETTER KA WITH DESCENDER +049A ; [.2015.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +04C4 ; [.2019.0020.0002] # CYRILLIC SMALL LETTER KA WITH HOOK +04C3 ; [.2019.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH HOOK +04A1 ; [.201D.0020.0002] # CYRILLIC SMALL LETTER BASHKIR KA +04A0 ; [.201D.0020.0008] # CYRILLIC CAPITAL LETTER BASHKIR KA +049F ; [.2021.0020.0002] # CYRILLIC SMALL LETTER KA WITH STROKE +049E ; [.2021.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH STROKE +049D ; [.2025.0020.0002] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049C ; [.2025.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +051F ; [.2029.0020.0002] # CYRILLIC SMALL LETTER ALEUT KA +051E ; [.2029.0020.0008] # CYRILLIC CAPITAL LETTER ALEUT KA +051B ; [.202A.0020.0002] # CYRILLIC SMALL LETTER QA +051A ; [.202A.0020.0008] # CYRILLIC CAPITAL LETTER QA +043B ; [.202B.0020.0002] # CYRILLIC SMALL LETTER EL +2DE7 ; [.202B.0020.0004] # COMBINING CYRILLIC LETTER EL +041B ; [.202B.0020.0008] # CYRILLIC CAPITAL LETTER EL +1D2B ; [.202F.0020.0002] # CYRILLIC LETTER SMALL CAPITAL EL +04C6 ; [.2030.0020.0002] # CYRILLIC SMALL LETTER EL WITH TAIL +04C5 ; [.2030.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH TAIL +052F ; [.2034.0020.0002] # CYRILLIC SMALL LETTER EL WITH DESCENDER +052E ; [.2034.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0513 ; [.2035.0020.0002] # CYRILLIC SMALL LETTER EL WITH HOOK +0512 ; [.2035.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH HOOK +0521 ; [.2036.0020.0002] # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +0520 ; [.2036.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0459 ; [.2037.0020.0002] # CYRILLIC SMALL LETTER LJE +0409 ; [.2037.0020.0008] # CYRILLIC CAPITAL LETTER LJE +A665 ; [.203B.0020.0002] # CYRILLIC SMALL LETTER SOFT EL +A664 ; [.203B.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EL +0509 ; [.203C.0020.0002] # CYRILLIC SMALL LETTER KOMI LJE +0508 ; [.203C.0020.0008] # CYRILLIC CAPITAL LETTER KOMI LJE +0515 ; [.203D.0020.0002] # CYRILLIC SMALL LETTER LHA +0514 ; [.203D.0020.0008] # CYRILLIC CAPITAL LETTER LHA +043C ; [.203E.0020.0002] # CYRILLIC SMALL LETTER EM +2DE8 ; [.203E.0020.0004] # COMBINING CYRILLIC LETTER EM +041C ; [.203E.0020.0008] # CYRILLIC CAPITAL LETTER EM +04CE ; [.2042.0020.0002] # CYRILLIC SMALL LETTER EM WITH TAIL +04CD ; [.2042.0020.0008] # CYRILLIC CAPITAL LETTER EM WITH TAIL +A667 ; [.2046.0020.0002] # CYRILLIC SMALL LETTER SOFT EM +A666 ; [.2046.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EM +043D ; [.2047.0020.0002] # CYRILLIC SMALL LETTER EN +2DE9 ; [.2047.0020.0004] # COMBINING CYRILLIC LETTER EN +041D ; [.2047.0020.0008] # CYRILLIC CAPITAL LETTER EN +1D78 ; [.2047.0020.0014] # MODIFIER LETTER CYRILLIC EN +0529 ; [.204B.0020.0002] # CYRILLIC SMALL LETTER EN WITH LEFT HOOK +0528 ; [.204B.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +04CA ; [.204C.0020.0002] # CYRILLIC SMALL LETTER EN WITH TAIL +04C9 ; [.204C.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH TAIL +04A3 ; [.2050.0020.0002] # CYRILLIC SMALL LETTER EN WITH DESCENDER +04A2 ; [.2050.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04C8 ; [.2054.0020.0002] # CYRILLIC SMALL LETTER EN WITH HOOK +04C7 ; [.2054.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH HOOK +0523 ; [.2058.0020.0002] # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +0522 ; [.2058.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +04A5 ; [.2059.0020.0002] # CYRILLIC SMALL LIGATURE EN GHE +04A4 ; [.2059.0020.0008] # CYRILLIC CAPITAL LIGATURE EN GHE +045A ; [.205D.0020.0002] # CYRILLIC SMALL LETTER NJE +040A ; [.205D.0020.0008] # CYRILLIC CAPITAL LETTER NJE +050B ; [.2061.0020.0002] # CYRILLIC SMALL LETTER KOMI NJE +050A ; [.2061.0020.0008] # CYRILLIC CAPITAL LETTER KOMI NJE +043E ; [.2062.0020.0002] # CYRILLIC SMALL LETTER O +2DEA ; [.2062.0020.0004] # COMBINING CYRILLIC LETTER O +A669 ; [.2062.0020.0004] # CYRILLIC SMALL LETTER MONOCULAR O +A66B ; [.2062.0020.0004] # CYRILLIC SMALL LETTER BINOCULAR O +A66D ; [.2062.0020.0004] # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; [.2062.0020.0004] # CYRILLIC LETTER MULTIOCULAR O +A699 ; [.2062.0020.0004] # CYRILLIC SMALL LETTER DOUBLE O +A69B ; [.2062.0020.0004] # CYRILLIC SMALL LETTER CROSSED O +041E ; [.2062.0020.0008] # CYRILLIC CAPITAL LETTER O +A668 ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER MONOCULAR O +A66A ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER BINOCULAR O +A66C ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A698 ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE O +A69A ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER CROSSED O +04E7 ; [.2062.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER O WITH DIAERESIS +04E6 ; [.2062.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E9 ; [.2066.0020.0002] # CYRILLIC SMALL LETTER BARRED O +04E8 ; [.2066.0020.0008] # CYRILLIC CAPITAL LETTER BARRED O +04EB ; [.2066.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EA ; [.2066.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +043F ; [.206A.0020.0002] # CYRILLIC SMALL LETTER PE +2DEB ; [.206A.0020.0004] # COMBINING CYRILLIC LETTER PE +041F ; [.206A.0020.0008] # CYRILLIC CAPITAL LETTER PE +0525 ; [.206E.0020.0002] # CYRILLIC SMALL LETTER PE WITH DESCENDER +0524 ; [.206E.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +04A7 ; [.206F.0020.0002] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A6 ; [.206F.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +0481 ; [.2073.0020.0002] # CYRILLIC SMALL LETTER KOPPA +0480 ; [.2073.0020.0008] # CYRILLIC CAPITAL LETTER KOPPA +0440 ; [.2077.0020.0002] # CYRILLIC SMALL LETTER ER +2DEC ; [.2077.0020.0004] # COMBINING CYRILLIC LETTER ER +0420 ; [.2077.0020.0008] # CYRILLIC CAPITAL LETTER ER +048F ; [.207B.0020.0002] # CYRILLIC SMALL LETTER ER WITH TICK +048E ; [.207B.0020.0008] # CYRILLIC CAPITAL LETTER ER WITH TICK +0517 ; [.207F.0020.0002] # CYRILLIC SMALL LETTER RHA +0516 ; [.207F.0020.0008] # CYRILLIC CAPITAL LETTER RHA +0441 ; [.2080.0020.0002] # CYRILLIC SMALL LETTER ES +2DED ; [.2080.0020.0004] # COMBINING CYRILLIC LETTER ES +0421 ; [.2080.0020.0008] # CYRILLIC CAPITAL LETTER ES +2DF5 ; [.2080.0020.0004][.2089.0020.0004] # COMBINING CYRILLIC LETTER ES-TE +050D ; [.2084.0020.0002] # CYRILLIC SMALL LETTER KOMI SJE +050C ; [.2084.0020.0008] # CYRILLIC CAPITAL LETTER KOMI SJE +04AB ; [.2085.0020.0002] # CYRILLIC SMALL LETTER ES WITH DESCENDER +04AA ; [.2085.0020.0008] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +0442 ; [.2089.0020.0002] # CYRILLIC SMALL LETTER TE +2DEE ; [.2089.0020.0004] # COMBINING CYRILLIC LETTER TE +0422 ; [.2089.0020.0008] # CYRILLIC CAPITAL LETTER TE +A68D ; [.208D.0020.0002] # CYRILLIC SMALL LETTER TWE +A68C ; [.208D.0020.0008] # CYRILLIC CAPITAL LETTER TWE +050F ; [.208E.0020.0002] # CYRILLIC SMALL LETTER KOMI TJE +050E ; [.208E.0020.0008] # CYRILLIC CAPITAL LETTER KOMI TJE +04AD ; [.208F.0020.0002] # CYRILLIC SMALL LETTER TE WITH DESCENDER +04AC ; [.208F.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +A68B ; [.2093.0020.0002] # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +A68A ; [.2093.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +045B ; [.2094.0020.0002] # CYRILLIC SMALL LETTER TSHE +040B ; [.2094.0020.0008] # CYRILLIC CAPITAL LETTER TSHE +0443 ; [.2098.0020.0002] # CYRILLIC SMALL LETTER U +A677 ; [.2098.0020.0004] # COMBINING CYRILLIC LETTER U +0423 ; [.2098.0020.0008] # CYRILLIC CAPITAL LETTER U +045E ; [.2098.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER SHORT U +040E ; [.2098.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER SHORT U +04F1 ; [.2098.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER U WITH DIAERESIS +04F0 ; [.2098.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F3 ; [.2098.0020.0002][.0000.002C.0002] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F2 ; [.2098.0020.0008][.0000.002C.0002] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04EF ; [.2098.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER U WITH MACRON +04EE ; [.2098.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER U WITH MACRON +04AF ; [.209C.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U +04AE ; [.209C.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U +04B1 ; [.20A0.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B0 ; [.20A0.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +A64B ; [.20A4.0020.0002] # CYRILLIC SMALL LETTER MONOGRAPH UK +2DF9 ; [.20A4.0020.0004] # COMBINING CYRILLIC LETTER MONOGRAPH UK +A64A ; [.20A4.0020.0008] # CYRILLIC CAPITAL LETTER MONOGRAPH UK +0479 ; [.20A5.0020.0002] # CYRILLIC SMALL LETTER UK +0478 ; [.20A5.0020.0008] # CYRILLIC CAPITAL LETTER UK +0444 ; [.20A9.0020.0002] # CYRILLIC SMALL LETTER EF +A69E ; [.20A9.0020.0004] # COMBINING CYRILLIC LETTER EF +0424 ; [.20A9.0020.0008] # CYRILLIC CAPITAL LETTER EF +0445 ; [.20AD.0020.0002] # CYRILLIC SMALL LETTER HA +2DEF ; [.20AD.0020.0004] # COMBINING CYRILLIC LETTER HA +0425 ; [.20AD.0020.0008] # CYRILLIC CAPITAL LETTER HA +04FD ; [.20B1.0020.0002] # CYRILLIC SMALL LETTER HA WITH HOOK +04FC ; [.20B1.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH HOOK +04FF ; [.20B5.0020.0002] # CYRILLIC SMALL LETTER HA WITH STROKE +04FE ; [.20B5.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH STROKE +04B3 ; [.20B9.0020.0002] # CYRILLIC SMALL LETTER HA WITH DESCENDER +04B2 ; [.20B9.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04BB ; [.20BD.0020.0002] # CYRILLIC SMALL LETTER SHHA +04BA ; [.20BD.0020.0008] # CYRILLIC CAPITAL LETTER SHHA +0527 ; [.20C1.0020.0002] # CYRILLIC SMALL LETTER SHHA WITH DESCENDER +0526 ; [.20C1.0020.0008] # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +A695 ; [.20C2.0020.0002] # CYRILLIC SMALL LETTER HWE +A694 ; [.20C2.0020.0008] # CYRILLIC CAPITAL LETTER HWE +0461 ; [.20C3.0020.0002] # CYRILLIC SMALL LETTER OMEGA +A67B ; [.20C3.0020.0004] # COMBINING CYRILLIC LETTER OMEGA +0460 ; [.20C3.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA +047F ; [.20C7.0020.0002] # CYRILLIC SMALL LETTER OT +047E ; [.20C7.0020.0008] # CYRILLIC CAPITAL LETTER OT +A64D ; [.20CB.0020.0002] # CYRILLIC SMALL LETTER BROAD OMEGA +A64C ; [.20CB.0020.0008] # CYRILLIC CAPITAL LETTER BROAD OMEGA +047D ; [.20CC.0020.0002] # CYRILLIC SMALL LETTER OMEGA WITH TITLO +047C ; [.20CC.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047B ; [.20D0.0020.0002] # CYRILLIC SMALL LETTER ROUND OMEGA +047A ; [.20D0.0020.0008] # CYRILLIC CAPITAL LETTER ROUND OMEGA +0446 ; [.20D4.0020.0002] # CYRILLIC SMALL LETTER TSE +2DF0 ; [.20D4.0020.0004] # COMBINING CYRILLIC LETTER TSE +0426 ; [.20D4.0020.0008] # CYRILLIC CAPITAL LETTER TSE +A661 ; [.20D8.0020.0002] # CYRILLIC SMALL LETTER REVERSED TSE +A660 ; [.20D8.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED TSE +A68F ; [.20D9.0020.0002] # CYRILLIC SMALL LETTER TSWE +A68E ; [.20D9.0020.0008] # CYRILLIC CAPITAL LETTER TSWE +04B5 ; [.20DA.0020.0002] # CYRILLIC SMALL LIGATURE TE TSE +04B4 ; [.20DA.0020.0008] # CYRILLIC CAPITAL LIGATURE TE TSE +A691 ; [.20DE.0020.0002] # CYRILLIC SMALL LETTER TSSE +A690 ; [.20DE.0020.0008] # CYRILLIC CAPITAL LETTER TSSE +0447 ; [.20DF.0020.0002] # CYRILLIC SMALL LETTER CHE +2DF1 ; [.20DF.0020.0004] # COMBINING CYRILLIC LETTER CHE +0427 ; [.20DF.0020.0008] # CYRILLIC CAPITAL LETTER CHE +04F5 ; [.20DF.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F4 ; [.20DF.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +052D ; [.20E3.0020.0002] # CYRILLIC SMALL LETTER DCHE +052C ; [.20E3.0020.0008] # CYRILLIC CAPITAL LETTER DCHE +A693 ; [.20E4.0020.0002] # CYRILLIC SMALL LETTER TCHE +A692 ; [.20E4.0020.0008] # CYRILLIC CAPITAL LETTER TCHE +04B7 ; [.20E5.0020.0002] # CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B6 ; [.20E5.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04CC ; [.20E9.0020.0002] # CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CB ; [.20E9.0020.0008] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04B9 ; [.20ED.0020.0002] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04B8 ; [.20ED.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +A687 ; [.20F1.0020.0002] # CYRILLIC SMALL LETTER CCHE +A686 ; [.20F1.0020.0008] # CYRILLIC CAPITAL LETTER CCHE +04BD ; [.20F2.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE +04BC ; [.20F2.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BF ; [.20F6.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04BE ; [.20F6.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +045F ; [.20FA.0020.0002] # CYRILLIC SMALL LETTER DZHE +040F ; [.20FA.0020.0008] # CYRILLIC CAPITAL LETTER DZHE +0448 ; [.20FE.0020.0002] # CYRILLIC SMALL LETTER SHA +2DF2 ; [.20FE.0020.0004] # COMBINING CYRILLIC LETTER SHA +0428 ; [.20FE.0020.0008] # CYRILLIC CAPITAL LETTER SHA +A697 ; [.2102.0020.0002] # CYRILLIC SMALL LETTER SHWE +A696 ; [.2102.0020.0008] # CYRILLIC CAPITAL LETTER SHWE +0449 ; [.2103.0020.0002] # CYRILLIC SMALL LETTER SHCHA +2DF3 ; [.2103.0020.0004] # COMBINING CYRILLIC LETTER SHCHA +0429 ; [.2103.0020.0008] # CYRILLIC CAPITAL LETTER SHCHA +A64F ; [.2107.0020.0002] # CYRILLIC SMALL LETTER NEUTRAL YER +A64E ; [.2107.0020.0008] # CYRILLIC CAPITAL LETTER NEUTRAL YER +2E2F ; [.2108.0020.0002] # VERTICAL TILDE +A67F ; [.2109.0020.0002] # CYRILLIC PAYEROK +044A ; [.210A.0020.0002] # CYRILLIC SMALL LETTER HARD SIGN +A678 ; [.210A.0020.0004] # COMBINING CYRILLIC LETTER HARD SIGN +042A ; [.210A.0020.0008] # CYRILLIC CAPITAL LETTER HARD SIGN +A69C ; [.210A.0020.0014] # MODIFIER LETTER CYRILLIC HARD SIGN +A651 ; [.210E.0020.0002] # CYRILLIC SMALL LETTER YERU WITH BACK YER +A650 ; [.210E.0020.0008] # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +044B ; [.210F.0020.0002] # CYRILLIC SMALL LETTER YERU +A679 ; [.210F.0020.0004] # COMBINING CYRILLIC LETTER YERU +042B ; [.210F.0020.0008] # CYRILLIC CAPITAL LETTER YERU +04F9 ; [.210F.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS +04F8 ; [.210F.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +044C ; [.2113.0020.0002] # CYRILLIC SMALL LETTER SOFT SIGN +A67A ; [.2113.0020.0004] # COMBINING CYRILLIC LETTER SOFT SIGN +042C ; [.2113.0020.0008] # CYRILLIC CAPITAL LETTER SOFT SIGN +A69D ; [.2113.0020.0014] # MODIFIER LETTER CYRILLIC SOFT SIGN +048D ; [.2117.0020.0002] # CYRILLIC SMALL LETTER SEMISOFT SIGN +048C ; [.2117.0020.0008] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +0463 ; [.211B.0020.0002] # CYRILLIC SMALL LETTER YAT +2DFA ; [.211B.0020.0004] # COMBINING CYRILLIC LETTER YAT +0462 ; [.211B.0020.0008] # CYRILLIC CAPITAL LETTER YAT +A653 ; [.211F.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED YAT +A652 ; [.211F.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED YAT +044D ; [.2120.0020.0002] # CYRILLIC SMALL LETTER E +042D ; [.2120.0020.0008] # CYRILLIC CAPITAL LETTER E +04ED ; [.2120.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER E WITH DIAERESIS +04EC ; [.2120.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +044E ; [.2124.0020.0002] # CYRILLIC SMALL LETTER YU +2DFB ; [.2124.0020.0004] # COMBINING CYRILLIC LETTER YU +042E ; [.2124.0020.0008] # CYRILLIC CAPITAL LETTER YU +A655 ; [.2128.0020.0002] # CYRILLIC SMALL LETTER REVERSED YU +A654 ; [.2128.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED YU +A657 ; [.2129.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED A +2DFC ; [.2129.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED A +A656 ; [.2129.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED A +044F ; [.212A.0020.0002] # CYRILLIC SMALL LETTER YA +042F ; [.212A.0020.0008] # CYRILLIC CAPITAL LETTER YA +0519 ; [.212E.0020.0002] # CYRILLIC SMALL LETTER YAE +0518 ; [.212E.0020.0008] # CYRILLIC CAPITAL LETTER YAE +0465 ; [.212F.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED E +A69F ; [.212F.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED E +0464 ; [.212F.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED E +0467 ; [.2133.0020.0002] # CYRILLIC SMALL LETTER LITTLE YUS +2DFD ; [.2133.0020.0004] # COMBINING CYRILLIC LETTER LITTLE YUS +0466 ; [.2133.0020.0008] # CYRILLIC CAPITAL LETTER LITTLE YUS +A659 ; [.2137.0020.0002] # CYRILLIC SMALL LETTER CLOSED LITTLE YUS +A658 ; [.2137.0020.0008] # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +046B ; [.2138.0020.0002] # CYRILLIC SMALL LETTER BIG YUS +2DFE ; [.2138.0020.0004] # COMBINING CYRILLIC LETTER BIG YUS +046A ; [.2138.0020.0008] # CYRILLIC CAPITAL LETTER BIG YUS +A65B ; [.213C.0020.0002] # CYRILLIC SMALL LETTER BLENDED YUS +A65A ; [.213C.0020.0008] # CYRILLIC CAPITAL LETTER BLENDED YUS +0469 ; [.213D.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +0468 ; [.213D.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +A65D ; [.2141.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +A65C ; [.2141.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +046D ; [.2142.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS +2DFF ; [.2142.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +046C ; [.2142.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046F ; [.2146.0020.0002] # CYRILLIC SMALL LETTER KSI +046E ; [.2146.0020.0008] # CYRILLIC CAPITAL LETTER KSI +0471 ; [.214A.0020.0002] # CYRILLIC SMALL LETTER PSI +0470 ; [.214A.0020.0008] # CYRILLIC CAPITAL LETTER PSI +0473 ; [.214E.0020.0002] # CYRILLIC SMALL LETTER FITA +2DF4 ; [.214E.0020.0004] # COMBINING CYRILLIC LETTER FITA +0472 ; [.214E.0020.0008] # CYRILLIC CAPITAL LETTER FITA +0475 ; [.2152.0020.0002] # CYRILLIC SMALL LETTER IZHITSA +0474 ; [.2152.0020.0008] # CYRILLIC CAPITAL LETTER IZHITSA +0477 ; [.2152.0020.0002][.0000.003C.0002] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0476 ; [.2152.0020.0008][.0000.003C.0002] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +A65F ; [.2156.0020.0002] # CYRILLIC SMALL LETTER YN +A65E ; [.2156.0020.0008] # CYRILLIC CAPITAL LETTER YN +04A9 ; [.2157.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN HA +04A8 ; [.2157.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN HA +051D ; [.215B.0020.0002] # CYRILLIC SMALL LETTER WE +051C ; [.215B.0020.0008] # CYRILLIC CAPITAL LETTER WE +04CF ; [.215C.0020.0002] # CYRILLIC SMALL LETTER PALOCHKA +04C0 ; [.215C.0020.0008] # CYRILLIC LETTER PALOCHKA +2C30 ; [.2160.0020.0002] # GLAGOLITIC SMALL LETTER AZU +2C00 ; [.2160.0020.0008] # GLAGOLITIC CAPITAL LETTER AZU +2C31 ; [.2161.0020.0002] # GLAGOLITIC SMALL LETTER BUKY +2C01 ; [.2161.0020.0008] # GLAGOLITIC CAPITAL LETTER BUKY +2C32 ; [.2162.0020.0002] # GLAGOLITIC SMALL LETTER VEDE +2C02 ; [.2162.0020.0008] # GLAGOLITIC CAPITAL LETTER VEDE +2C33 ; [.2163.0020.0002] # GLAGOLITIC SMALL LETTER GLAGOLI +2C03 ; [.2163.0020.0008] # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C34 ; [.2164.0020.0002] # GLAGOLITIC SMALL LETTER DOBRO +2C04 ; [.2164.0020.0008] # GLAGOLITIC CAPITAL LETTER DOBRO +2C35 ; [.2165.0020.0002] # GLAGOLITIC SMALL LETTER YESTU +2C05 ; [.2165.0020.0008] # GLAGOLITIC CAPITAL LETTER YESTU +2C36 ; [.2166.0020.0002] # GLAGOLITIC SMALL LETTER ZHIVETE +2C06 ; [.2166.0020.0008] # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C37 ; [.2167.0020.0002] # GLAGOLITIC SMALL LETTER DZELO +2C07 ; [.2167.0020.0008] # GLAGOLITIC CAPITAL LETTER DZELO +2C38 ; [.2168.0020.0002] # GLAGOLITIC SMALL LETTER ZEMLJA +2C08 ; [.2168.0020.0008] # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C39 ; [.2169.0020.0002] # GLAGOLITIC SMALL LETTER IZHE +2C09 ; [.2169.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHE +2C3A ; [.216A.0020.0002] # GLAGOLITIC SMALL LETTER INITIAL IZHE +2C0A ; [.216A.0020.0008] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C3B ; [.216B.0020.0002] # GLAGOLITIC SMALL LETTER I +2C0B ; [.216B.0020.0008] # GLAGOLITIC CAPITAL LETTER I +2C3C ; [.216C.0020.0002] # GLAGOLITIC SMALL LETTER DJERVI +2C0C ; [.216C.0020.0008] # GLAGOLITIC CAPITAL LETTER DJERVI +2C3D ; [.216D.0020.0002] # GLAGOLITIC SMALL LETTER KAKO +2C0D ; [.216D.0020.0008] # GLAGOLITIC CAPITAL LETTER KAKO +2C3E ; [.216E.0020.0002] # GLAGOLITIC SMALL LETTER LJUDIJE +2C0E ; [.216E.0020.0008] # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C3F ; [.216F.0020.0002] # GLAGOLITIC SMALL LETTER MYSLITE +2C0F ; [.216F.0020.0008] # GLAGOLITIC CAPITAL LETTER MYSLITE +2C40 ; [.2170.0020.0002] # GLAGOLITIC SMALL LETTER NASHI +2C10 ; [.2170.0020.0008] # GLAGOLITIC CAPITAL LETTER NASHI +2C41 ; [.2171.0020.0002] # GLAGOLITIC SMALL LETTER ONU +2C11 ; [.2171.0020.0008] # GLAGOLITIC CAPITAL LETTER ONU +2C42 ; [.2172.0020.0002] # GLAGOLITIC SMALL LETTER POKOJI +2C12 ; [.2172.0020.0008] # GLAGOLITIC CAPITAL LETTER POKOJI +2C43 ; [.2173.0020.0002] # GLAGOLITIC SMALL LETTER RITSI +2C13 ; [.2173.0020.0008] # GLAGOLITIC CAPITAL LETTER RITSI +2C44 ; [.2174.0020.0002] # GLAGOLITIC SMALL LETTER SLOVO +2C14 ; [.2174.0020.0008] # GLAGOLITIC CAPITAL LETTER SLOVO +2C45 ; [.2175.0020.0002] # GLAGOLITIC SMALL LETTER TVRIDO +2C15 ; [.2175.0020.0008] # GLAGOLITIC CAPITAL LETTER TVRIDO +2C46 ; [.2176.0020.0002] # GLAGOLITIC SMALL LETTER UKU +2C16 ; [.2176.0020.0008] # GLAGOLITIC CAPITAL LETTER UKU +2C47 ; [.2177.0020.0002] # GLAGOLITIC SMALL LETTER FRITU +2C17 ; [.2177.0020.0008] # GLAGOLITIC CAPITAL LETTER FRITU +2C48 ; [.2178.0020.0002] # GLAGOLITIC SMALL LETTER HERU +2C18 ; [.2178.0020.0008] # GLAGOLITIC CAPITAL LETTER HERU +2C49 ; [.2179.0020.0002] # GLAGOLITIC SMALL LETTER OTU +2C19 ; [.2179.0020.0008] # GLAGOLITIC CAPITAL LETTER OTU +2C4A ; [.217A.0020.0002] # GLAGOLITIC SMALL LETTER PE +2C1A ; [.217A.0020.0008] # GLAGOLITIC CAPITAL LETTER PE +2C4B ; [.217B.0020.0002] # GLAGOLITIC SMALL LETTER SHTA +2C1B ; [.217B.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTA +2C4C ; [.217C.0020.0002] # GLAGOLITIC SMALL LETTER TSI +2C1C ; [.217C.0020.0008] # GLAGOLITIC CAPITAL LETTER TSI +2C4D ; [.217D.0020.0002] # GLAGOLITIC SMALL LETTER CHRIVI +2C1D ; [.217D.0020.0008] # GLAGOLITIC CAPITAL LETTER CHRIVI +2C4E ; [.217E.0020.0002] # GLAGOLITIC SMALL LETTER SHA +2C1E ; [.217E.0020.0008] # GLAGOLITIC CAPITAL LETTER SHA +2C4F ; [.217F.0020.0002] # GLAGOLITIC SMALL LETTER YERU +2C1F ; [.217F.0020.0008] # GLAGOLITIC CAPITAL LETTER YERU +2C50 ; [.2180.0020.0002] # GLAGOLITIC SMALL LETTER YERI +2C20 ; [.2180.0020.0008] # GLAGOLITIC CAPITAL LETTER YERI +2C51 ; [.2181.0020.0002] # GLAGOLITIC SMALL LETTER YATI +2C21 ; [.2181.0020.0008] # GLAGOLITIC CAPITAL LETTER YATI +2C52 ; [.2182.0020.0002] # GLAGOLITIC SMALL LETTER SPIDERY HA +2C22 ; [.2182.0020.0008] # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C53 ; [.2183.0020.0002] # GLAGOLITIC SMALL LETTER YU +2C23 ; [.2183.0020.0008] # GLAGOLITIC CAPITAL LETTER YU +2C54 ; [.2184.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS +2C24 ; [.2184.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C55 ; [.2185.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +2C25 ; [.2185.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C56 ; [.2186.0020.0002] # GLAGOLITIC SMALL LETTER YO +2C26 ; [.2186.0020.0008] # GLAGOLITIC CAPITAL LETTER YO +2C57 ; [.2187.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +2C27 ; [.2187.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C58 ; [.2188.0020.0002] # GLAGOLITIC SMALL LETTER BIG YUS +2C28 ; [.2188.0020.0008] # GLAGOLITIC CAPITAL LETTER BIG YUS +2C59 ; [.2189.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS +2C29 ; [.2189.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C5A ; [.218A.0020.0002] # GLAGOLITIC SMALL LETTER FITA +2C2A ; [.218A.0020.0008] # GLAGOLITIC CAPITAL LETTER FITA +2C5B ; [.218B.0020.0002] # GLAGOLITIC SMALL LETTER IZHITSA +2C2B ; [.218B.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHITSA +2C5C ; [.218C.0020.0002] # GLAGOLITIC SMALL LETTER SHTAPIC +2C2C ; [.218C.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C5D ; [.218D.0020.0002] # GLAGOLITIC SMALL LETTER TROKUTASTI A +2C2D ; [.218D.0020.0008] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C5E ; [.218E.0020.0002] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C2E ; [.218E.0020.0008] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +10350 ; [.218F.0020.0002] # OLD PERMIC LETTER AN +10376 ; [.218F.0020.0004] # COMBINING OLD PERMIC LETTER AN +10351 ; [.2190.0020.0002] # OLD PERMIC LETTER BUR +10352 ; [.2191.0020.0002] # OLD PERMIC LETTER GAI +10353 ; [.2192.0020.0002] # OLD PERMIC LETTER DOI +10377 ; [.2192.0020.0004] # COMBINING OLD PERMIC LETTER DOI +10354 ; [.2193.0020.0002] # OLD PERMIC LETTER E +10355 ; [.2194.0020.0002] # OLD PERMIC LETTER ZHOI +10356 ; [.2195.0020.0002] # OLD PERMIC LETTER DZHOI +10357 ; [.2196.0020.0002] # OLD PERMIC LETTER ZATA +10378 ; [.2196.0020.0004] # COMBINING OLD PERMIC LETTER ZATA +10358 ; [.2197.0020.0002] # OLD PERMIC LETTER DZITA +10359 ; [.2198.0020.0002] # OLD PERMIC LETTER I +1035A ; [.2199.0020.0002] # OLD PERMIC LETTER KOKE +1035B ; [.219A.0020.0002] # OLD PERMIC LETTER LEI +1035C ; [.219B.0020.0002] # OLD PERMIC LETTER MENOE +1035D ; [.219C.0020.0002] # OLD PERMIC LETTER NENOE +10379 ; [.219C.0020.0004] # COMBINING OLD PERMIC LETTER NENOE +1035E ; [.219D.0020.0002] # OLD PERMIC LETTER VOOI +1035F ; [.219E.0020.0002] # OLD PERMIC LETTER PEEI +10360 ; [.219F.0020.0002] # OLD PERMIC LETTER REI +10361 ; [.21A0.0020.0002] # OLD PERMIC LETTER SII +1037A ; [.21A0.0020.0004] # COMBINING OLD PERMIC LETTER SII +10362 ; [.21A1.0020.0002] # OLD PERMIC LETTER TAI +10363 ; [.21A2.0020.0002] # OLD PERMIC LETTER U +10364 ; [.21A3.0020.0002] # OLD PERMIC LETTER CHERY +10365 ; [.21A4.0020.0002] # OLD PERMIC LETTER SHOOI +10366 ; [.21A5.0020.0002] # OLD PERMIC LETTER SHCHOOI +10367 ; [.21A6.0020.0002] # OLD PERMIC LETTER YRY +10368 ; [.21A7.0020.0002] # OLD PERMIC LETTER YERU +10369 ; [.21A8.0020.0002] # OLD PERMIC LETTER O +1036A ; [.21A9.0020.0002] # OLD PERMIC LETTER OO +1036B ; [.21AA.0020.0002] # OLD PERMIC LETTER EF +1036C ; [.21AB.0020.0002] # OLD PERMIC LETTER HA +1036D ; [.21AC.0020.0002] # OLD PERMIC LETTER TSIU +1036E ; [.21AD.0020.0002] # OLD PERMIC LETTER VER +1036F ; [.21AE.0020.0002] # OLD PERMIC LETTER YER +10370 ; [.21AF.0020.0002] # OLD PERMIC LETTER YERI +10371 ; [.21B0.0020.0002] # OLD PERMIC LETTER YAT +10372 ; [.21B1.0020.0002] # OLD PERMIC LETTER IE +10373 ; [.21B2.0020.0002] # OLD PERMIC LETTER YU +10374 ; [.21B3.0020.0002] # OLD PERMIC LETTER YA +10375 ; [.21B4.0020.0002] # OLD PERMIC LETTER IA +10D0 ; [.21B5.0020.0002] # GEORGIAN LETTER AN +2D00 ; [.21B6.0020.0002] # GEORGIAN SMALL LETTER AN +10A0 ; [.21B6.0020.0008] # GEORGIAN CAPITAL LETTER AN +10D1 ; [.21B7.0020.0002] # GEORGIAN LETTER BAN +2D01 ; [.21B8.0020.0002] # GEORGIAN SMALL LETTER BAN +10A1 ; [.21B8.0020.0008] # GEORGIAN CAPITAL LETTER BAN +10D2 ; [.21B9.0020.0002] # GEORGIAN LETTER GAN +2D02 ; [.21BA.0020.0002] # GEORGIAN SMALL LETTER GAN +10A2 ; [.21BA.0020.0008] # GEORGIAN CAPITAL LETTER GAN +10D3 ; [.21BB.0020.0002] # GEORGIAN LETTER DON +2D03 ; [.21BC.0020.0002] # GEORGIAN SMALL LETTER DON +10A3 ; [.21BC.0020.0008] # GEORGIAN CAPITAL LETTER DON +10D4 ; [.21BD.0020.0002] # GEORGIAN LETTER EN +2D04 ; [.21BE.0020.0002] # GEORGIAN SMALL LETTER EN +10A4 ; [.21BE.0020.0008] # GEORGIAN CAPITAL LETTER EN +10D5 ; [.21BF.0020.0002] # GEORGIAN LETTER VIN +2D05 ; [.21C0.0020.0002] # GEORGIAN SMALL LETTER VIN +10A5 ; [.21C0.0020.0008] # GEORGIAN CAPITAL LETTER VIN +10D6 ; [.21C1.0020.0002] # GEORGIAN LETTER ZEN +2D06 ; [.21C2.0020.0002] # GEORGIAN SMALL LETTER ZEN +10A6 ; [.21C2.0020.0008] # GEORGIAN CAPITAL LETTER ZEN +10F1 ; [.21C3.0020.0002] # GEORGIAN LETTER HE +2D21 ; [.21C4.0020.0002] # GEORGIAN SMALL LETTER HE +10C1 ; [.21C4.0020.0008] # GEORGIAN CAPITAL LETTER HE +10D7 ; [.21C5.0020.0002] # GEORGIAN LETTER TAN +2D07 ; [.21C6.0020.0002] # GEORGIAN SMALL LETTER TAN +10A7 ; [.21C6.0020.0008] # GEORGIAN CAPITAL LETTER TAN +10D8 ; [.21C7.0020.0002] # GEORGIAN LETTER IN +2D08 ; [.21C8.0020.0002] # GEORGIAN SMALL LETTER IN +10A8 ; [.21C8.0020.0008] # GEORGIAN CAPITAL LETTER IN +10D9 ; [.21C9.0020.0002] # GEORGIAN LETTER KAN +2D09 ; [.21CA.0020.0002] # GEORGIAN SMALL LETTER KAN +10A9 ; [.21CA.0020.0008] # GEORGIAN CAPITAL LETTER KAN +10DA ; [.21CB.0020.0002] # GEORGIAN LETTER LAS +2D0A ; [.21CC.0020.0002] # GEORGIAN SMALL LETTER LAS +10AA ; [.21CC.0020.0008] # GEORGIAN CAPITAL LETTER LAS +10DB ; [.21CD.0020.0002] # GEORGIAN LETTER MAN +2D0B ; [.21CE.0020.0002] # GEORGIAN SMALL LETTER MAN +10AB ; [.21CE.0020.0008] # GEORGIAN CAPITAL LETTER MAN +10DC ; [.21CF.0020.0002] # GEORGIAN LETTER NAR +10FC ; [.21CF.0020.0014] # MODIFIER LETTER GEORGIAN NAR +2D0C ; [.21D0.0020.0002] # GEORGIAN SMALL LETTER NAR +10AC ; [.21D0.0020.0008] # GEORGIAN CAPITAL LETTER NAR +10F2 ; [.21D1.0020.0002] # GEORGIAN LETTER HIE +2D22 ; [.21D2.0020.0002] # GEORGIAN SMALL LETTER HIE +10C2 ; [.21D2.0020.0008] # GEORGIAN CAPITAL LETTER HIE +10DD ; [.21D3.0020.0002] # GEORGIAN LETTER ON +2D0D ; [.21D4.0020.0002] # GEORGIAN SMALL LETTER ON +10AD ; [.21D4.0020.0008] # GEORGIAN CAPITAL LETTER ON +10DE ; [.21D5.0020.0002] # GEORGIAN LETTER PAR +2D0E ; [.21D6.0020.0002] # GEORGIAN SMALL LETTER PAR +10AE ; [.21D6.0020.0008] # GEORGIAN CAPITAL LETTER PAR +10DF ; [.21D7.0020.0002] # GEORGIAN LETTER ZHAR +2D0F ; [.21D8.0020.0002] # GEORGIAN SMALL LETTER ZHAR +10AF ; [.21D8.0020.0008] # GEORGIAN CAPITAL LETTER ZHAR +10E0 ; [.21D9.0020.0002] # GEORGIAN LETTER RAE +2D10 ; [.21DA.0020.0002] # GEORGIAN SMALL LETTER RAE +10B0 ; [.21DA.0020.0008] # GEORGIAN CAPITAL LETTER RAE +10E1 ; [.21DB.0020.0002] # GEORGIAN LETTER SAN +2D11 ; [.21DC.0020.0002] # GEORGIAN SMALL LETTER SAN +10B1 ; [.21DC.0020.0008] # GEORGIAN CAPITAL LETTER SAN +10E2 ; [.21DD.0020.0002] # GEORGIAN LETTER TAR +2D12 ; [.21DE.0020.0002] # GEORGIAN SMALL LETTER TAR +10B2 ; [.21DE.0020.0008] # GEORGIAN CAPITAL LETTER TAR +10F3 ; [.21DF.0020.0002] # GEORGIAN LETTER WE +2D23 ; [.21E0.0020.0002] # GEORGIAN SMALL LETTER WE +10C3 ; [.21E0.0020.0008] # GEORGIAN CAPITAL LETTER WE +10E3 ; [.21E1.0020.0002] # GEORGIAN LETTER UN +2D13 ; [.21E2.0020.0002] # GEORGIAN SMALL LETTER UN +10B3 ; [.21E2.0020.0008] # GEORGIAN CAPITAL LETTER UN +10E4 ; [.21E3.0020.0002] # GEORGIAN LETTER PHAR +2D14 ; [.21E4.0020.0002] # GEORGIAN SMALL LETTER PHAR +10B4 ; [.21E4.0020.0008] # GEORGIAN CAPITAL LETTER PHAR +10E5 ; [.21E5.0020.0002] # GEORGIAN LETTER KHAR +2D15 ; [.21E6.0020.0002] # GEORGIAN SMALL LETTER KHAR +10B5 ; [.21E6.0020.0008] # GEORGIAN CAPITAL LETTER KHAR +10E6 ; [.21E7.0020.0002] # GEORGIAN LETTER GHAN +2D16 ; [.21E8.0020.0002] # GEORGIAN SMALL LETTER GHAN +10B6 ; [.21E8.0020.0008] # GEORGIAN CAPITAL LETTER GHAN +10E7 ; [.21E9.0020.0002] # GEORGIAN LETTER QAR +2D17 ; [.21EA.0020.0002] # GEORGIAN SMALL LETTER QAR +10B7 ; [.21EA.0020.0008] # GEORGIAN CAPITAL LETTER QAR +10E8 ; [.21EB.0020.0002] # GEORGIAN LETTER SHIN +2D18 ; [.21EC.0020.0002] # GEORGIAN SMALL LETTER SHIN +10B8 ; [.21EC.0020.0008] # GEORGIAN CAPITAL LETTER SHIN +10E9 ; [.21ED.0020.0002] # GEORGIAN LETTER CHIN +2D19 ; [.21EE.0020.0002] # GEORGIAN SMALL LETTER CHIN +10B9 ; [.21EE.0020.0008] # GEORGIAN CAPITAL LETTER CHIN +10EA ; [.21EF.0020.0002] # GEORGIAN LETTER CAN +2D1A ; [.21F0.0020.0002] # GEORGIAN SMALL LETTER CAN +10BA ; [.21F0.0020.0008] # GEORGIAN CAPITAL LETTER CAN +10EB ; [.21F1.0020.0002] # GEORGIAN LETTER JIL +2D1B ; [.21F2.0020.0002] # GEORGIAN SMALL LETTER JIL +10BB ; [.21F2.0020.0008] # GEORGIAN CAPITAL LETTER JIL +10EC ; [.21F3.0020.0002] # GEORGIAN LETTER CIL +2D1C ; [.21F4.0020.0002] # GEORGIAN SMALL LETTER CIL +10BC ; [.21F4.0020.0008] # GEORGIAN CAPITAL LETTER CIL +10ED ; [.21F5.0020.0002] # GEORGIAN LETTER CHAR +2D1D ; [.21F6.0020.0002] # GEORGIAN SMALL LETTER CHAR +10BD ; [.21F6.0020.0008] # GEORGIAN CAPITAL LETTER CHAR +10EE ; [.21F7.0020.0002] # GEORGIAN LETTER XAN +2D1E ; [.21F8.0020.0002] # GEORGIAN SMALL LETTER XAN +10BE ; [.21F8.0020.0008] # GEORGIAN CAPITAL LETTER XAN +10F4 ; [.21F9.0020.0002] # GEORGIAN LETTER HAR +2D24 ; [.21FA.0020.0002] # GEORGIAN SMALL LETTER HAR +10C4 ; [.21FA.0020.0008] # GEORGIAN CAPITAL LETTER HAR +10EF ; [.21FB.0020.0002] # GEORGIAN LETTER JHAN +2D1F ; [.21FC.0020.0002] # GEORGIAN SMALL LETTER JHAN +10BF ; [.21FC.0020.0008] # GEORGIAN CAPITAL LETTER JHAN +10F0 ; [.21FD.0020.0002] # GEORGIAN LETTER HAE +2D20 ; [.21FE.0020.0002] # GEORGIAN SMALL LETTER HAE +10C0 ; [.21FE.0020.0008] # GEORGIAN CAPITAL LETTER HAE +10F5 ; [.21FF.0020.0002] # GEORGIAN LETTER HOE +2D25 ; [.2200.0020.0002] # GEORGIAN SMALL LETTER HOE +10C5 ; [.2200.0020.0008] # GEORGIAN CAPITAL LETTER HOE +10F6 ; [.2201.0020.0002] # GEORGIAN LETTER FI +10F7 ; [.2202.0020.0002] # GEORGIAN LETTER YN +2D27 ; [.2203.0020.0002] # GEORGIAN SMALL LETTER YN +10C7 ; [.2203.0020.0008] # GEORGIAN CAPITAL LETTER YN +10F8 ; [.2204.0020.0002] # GEORGIAN LETTER ELIFI +10F9 ; [.2205.0020.0002] # GEORGIAN LETTER TURNED GAN +10FA ; [.2206.0020.0002] # GEORGIAN LETTER AIN +10FD ; [.2207.0020.0002] # GEORGIAN LETTER AEN +2D2D ; [.2208.0020.0002] # GEORGIAN SMALL LETTER AEN +10CD ; [.2208.0020.0008] # GEORGIAN CAPITAL LETTER AEN +10FE ; [.2209.0020.0002] # GEORGIAN LETTER HARD SIGN +10FF ; [.220A.0020.0002] # GEORGIAN LETTER LABIAL SIGN +0561 ; [.220B.0020.0002] # ARMENIAN SMALL LETTER AYB +0531 ; [.220B.0020.0008] # ARMENIAN CAPITAL LETTER AYB +0562 ; [.220C.0020.0002] # ARMENIAN SMALL LETTER BEN +0532 ; [.220C.0020.0008] # ARMENIAN CAPITAL LETTER BEN +0563 ; [.220D.0020.0002] # ARMENIAN SMALL LETTER GIM +0533 ; [.220D.0020.0008] # ARMENIAN CAPITAL LETTER GIM +0564 ; [.220E.0020.0002] # ARMENIAN SMALL LETTER DA +0534 ; [.220E.0020.0008] # ARMENIAN CAPITAL LETTER DA +0565 ; [.220F.0020.0002] # ARMENIAN SMALL LETTER ECH +0535 ; [.220F.0020.0008] # ARMENIAN CAPITAL LETTER ECH +0587 ; [.220F.0020.0004][.222C.0020.0004] # ARMENIAN SMALL LIGATURE ECH YIWN +0566 ; [.2210.0020.0002] # ARMENIAN SMALL LETTER ZA +0536 ; [.2210.0020.0008] # ARMENIAN CAPITAL LETTER ZA +0567 ; [.2211.0020.0002] # ARMENIAN SMALL LETTER EH +0537 ; [.2211.0020.0008] # ARMENIAN CAPITAL LETTER EH +0568 ; [.2212.0020.0002] # ARMENIAN SMALL LETTER ET +0538 ; [.2212.0020.0008] # ARMENIAN CAPITAL LETTER ET +0569 ; [.2213.0020.0002] # ARMENIAN SMALL LETTER TO +0539 ; [.2213.0020.0008] # ARMENIAN CAPITAL LETTER TO +056A ; [.2214.0020.0002] # ARMENIAN SMALL LETTER ZHE +053A ; [.2214.0020.0008] # ARMENIAN CAPITAL LETTER ZHE +056B ; [.2215.0020.0002] # ARMENIAN SMALL LETTER INI +053B ; [.2215.0020.0008] # ARMENIAN CAPITAL LETTER INI +056C ; [.2216.0020.0002] # ARMENIAN SMALL LETTER LIWN +053C ; [.2216.0020.0008] # ARMENIAN CAPITAL LETTER LIWN +056D ; [.2217.0020.0002] # ARMENIAN SMALL LETTER XEH +053D ; [.2217.0020.0008] # ARMENIAN CAPITAL LETTER XEH +056E ; [.2218.0020.0002] # ARMENIAN SMALL LETTER CA +053E ; [.2218.0020.0008] # ARMENIAN CAPITAL LETTER CA +056F ; [.2219.0020.0002] # ARMENIAN SMALL LETTER KEN +053F ; [.2219.0020.0008] # ARMENIAN CAPITAL LETTER KEN +0570 ; [.221A.0020.0002] # ARMENIAN SMALL LETTER HO +0540 ; [.221A.0020.0008] # ARMENIAN CAPITAL LETTER HO +0571 ; [.221B.0020.0002] # ARMENIAN SMALL LETTER JA +0541 ; [.221B.0020.0008] # ARMENIAN CAPITAL LETTER JA +0572 ; [.221C.0020.0002] # ARMENIAN SMALL LETTER GHAD +0542 ; [.221C.0020.0008] # ARMENIAN CAPITAL LETTER GHAD +0573 ; [.221D.0020.0002] # ARMENIAN SMALL LETTER CHEH +0543 ; [.221D.0020.0008] # ARMENIAN CAPITAL LETTER CHEH +0574 ; [.221E.0020.0002] # ARMENIAN SMALL LETTER MEN +0544 ; [.221E.0020.0008] # ARMENIAN CAPITAL LETTER MEN +FB14 ; [.221E.0020.0004][.220F.0020.0004] # ARMENIAN SMALL LIGATURE MEN ECH +FB15 ; [.221E.0020.0004][.2215.0020.0004] # ARMENIAN SMALL LIGATURE MEN INI +FB17 ; [.221E.0020.0004][.2217.0020.0004] # ARMENIAN SMALL LIGATURE MEN XEH +FB13 ; [.221E.0020.0004][.2220.0020.0004] # ARMENIAN SMALL LIGATURE MEN NOW +0575 ; [.221F.0020.0002] # ARMENIAN SMALL LETTER YI +0545 ; [.221F.0020.0008] # ARMENIAN CAPITAL LETTER YI +0576 ; [.2220.0020.0002] # ARMENIAN SMALL LETTER NOW +0546 ; [.2220.0020.0008] # ARMENIAN CAPITAL LETTER NOW +0577 ; [.2221.0020.0002] # ARMENIAN SMALL LETTER SHA +0547 ; [.2221.0020.0008] # ARMENIAN CAPITAL LETTER SHA +0578 ; [.2222.0020.0002] # ARMENIAN SMALL LETTER VO +0548 ; [.2222.0020.0008] # ARMENIAN CAPITAL LETTER VO +0579 ; [.2223.0020.0002] # ARMENIAN SMALL LETTER CHA +0549 ; [.2223.0020.0008] # ARMENIAN CAPITAL LETTER CHA +057A ; [.2224.0020.0002] # ARMENIAN SMALL LETTER PEH +054A ; [.2224.0020.0008] # ARMENIAN CAPITAL LETTER PEH +057B ; [.2225.0020.0002] # ARMENIAN SMALL LETTER JHEH +054B ; [.2225.0020.0008] # ARMENIAN CAPITAL LETTER JHEH +057C ; [.2226.0020.0002] # ARMENIAN SMALL LETTER RA +054C ; [.2226.0020.0008] # ARMENIAN CAPITAL LETTER RA +057D ; [.2227.0020.0002] # ARMENIAN SMALL LETTER SEH +054D ; [.2227.0020.0008] # ARMENIAN CAPITAL LETTER SEH +057E ; [.2228.0020.0002] # ARMENIAN SMALL LETTER VEW +054E ; [.2228.0020.0008] # ARMENIAN CAPITAL LETTER VEW +FB16 ; [.2228.0020.0004][.2220.0020.0004] # ARMENIAN SMALL LIGATURE VEW NOW +057F ; [.2229.0020.0002] # ARMENIAN SMALL LETTER TIWN +054F ; [.2229.0020.0008] # ARMENIAN CAPITAL LETTER TIWN +0580 ; [.222A.0020.0002] # ARMENIAN SMALL LETTER REH +0550 ; [.222A.0020.0008] # ARMENIAN CAPITAL LETTER REH +0581 ; [.222B.0020.0002] # ARMENIAN SMALL LETTER CO +0551 ; [.222B.0020.0008] # ARMENIAN CAPITAL LETTER CO +0582 ; [.222C.0020.0002] # ARMENIAN SMALL LETTER YIWN +0552 ; [.222C.0020.0008] # ARMENIAN CAPITAL LETTER YIWN +0583 ; [.222D.0020.0002] # ARMENIAN SMALL LETTER PIWR +0553 ; [.222D.0020.0008] # ARMENIAN CAPITAL LETTER PIWR +0584 ; [.222E.0020.0002] # ARMENIAN SMALL LETTER KEH +0554 ; [.222E.0020.0008] # ARMENIAN CAPITAL LETTER KEH +0585 ; [.222F.0020.0002] # ARMENIAN SMALL LETTER OH +0555 ; [.222F.0020.0008] # ARMENIAN CAPITAL LETTER OH +0586 ; [.2230.0020.0002] # ARMENIAN SMALL LETTER FEH +0556 ; [.2230.0020.0008] # ARMENIAN CAPITAL LETTER FEH +0559 ; [.2231.0020.0002] # ARMENIAN MODIFIER LETTER LEFT HALF RING +05D0 ; [.2232.0020.0002] # HEBREW LETTER ALEF +2135 ; [.2232.0020.0004] # ALEF SYMBOL +FB21 ; [.2232.0020.0005] # HEBREW LETTER WIDE ALEF +FB2E ; [.2232.0020.0002][.0000.0059.0002] # HEBREW LETTER ALEF WITH PATAH +FB2F ; [.2232.0020.0002][.0000.005A.0002] # HEBREW LETTER ALEF WITH QAMATS +FB30 ; [.2232.0020.0002][.0000.005F.0002] # HEBREW LETTER ALEF WITH MAPIQ +FB4F ; [.2232.0020.0004][.223D.0020.0004] # HEBREW LIGATURE ALEF LAMED +05D1 ; [.2233.0020.0002] # HEBREW LETTER BET +2136 ; [.2233.0020.0004] # BET SYMBOL +FB31 ; [.2233.0020.0002][.0000.005F.0002] # HEBREW LETTER BET WITH DAGESH +FB4C ; [.2233.0020.0002][.0000.0060.0002] # HEBREW LETTER BET WITH RAFE +05D2 ; [.2234.0020.0002] # HEBREW LETTER GIMEL +2137 ; [.2234.0020.0004] # GIMEL SYMBOL +FB32 ; [.2234.0020.0002][.0000.005F.0002] # HEBREW LETTER GIMEL WITH DAGESH +05D3 ; [.2235.0020.0002] # HEBREW LETTER DALET +2138 ; [.2235.0020.0004] # DALET SYMBOL +FB22 ; [.2235.0020.0005] # HEBREW LETTER WIDE DALET +FB33 ; [.2235.0020.0002][.0000.005F.0002] # HEBREW LETTER DALET WITH DAGESH +05D4 ; [.2236.0020.0002] # HEBREW LETTER HE +FB23 ; [.2236.0020.0005] # HEBREW LETTER WIDE HE +FB34 ; [.2236.0020.0002][.0000.005F.0002] # HEBREW LETTER HE WITH MAPIQ +05D5 ; [.2237.0020.0002] # HEBREW LETTER VAV +FB4B ; [.2237.0020.0002][.0000.005B.0002] # HEBREW LETTER VAV WITH HOLAM +FB35 ; [.2237.0020.0002][.0000.005F.0002] # HEBREW LETTER VAV WITH DAGESH +05F0 ; [.2237.0020.0004][.2237.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE VAV +05F1 ; [.2237.0020.0004][.223B.0020.0004] # HEBREW LIGATURE YIDDISH VAV YOD +05D6 ; [.2238.0020.0002] # HEBREW LETTER ZAYIN +FB36 ; [.2238.0020.0002][.0000.005F.0002] # HEBREW LETTER ZAYIN WITH DAGESH +05D7 ; [.2239.0020.0002] # HEBREW LETTER HET +05D8 ; [.223A.0020.0002] # HEBREW LETTER TET +FB38 ; [.223A.0020.0002][.0000.005F.0002] # HEBREW LETTER TET WITH DAGESH +05D9 ; [.223B.0020.0002] # HEBREW LETTER YOD +FB1D ; [.223B.0020.0002][.0000.0056.0002] # HEBREW LETTER YOD WITH HIRIQ +FB39 ; [.223B.0020.0002][.0000.005F.0002] # HEBREW LETTER YOD WITH DAGESH +05F2 ; [.223B.0020.0004][.223B.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE YOD +FB1F ; [.223B.0020.0004][.223B.0020.0004][.0000.0059.0002] # HEBREW LIGATURE YIDDISH YOD YOD PATAH +05DB ; [.223C.0020.0002] # HEBREW LETTER KAF +FB24 ; [.223C.0020.0005] # HEBREW LETTER WIDE KAF +05DA ; [.223C.0020.0019] # HEBREW LETTER FINAL KAF +FB3B ; [.223C.0020.0002][.0000.005F.0002] # HEBREW LETTER KAF WITH DAGESH +FB3A ; [.223C.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL KAF WITH DAGESH +FB4D ; [.223C.0020.0002][.0000.0060.0002] # HEBREW LETTER KAF WITH RAFE +05DC ; [.223D.0020.0002] # HEBREW LETTER LAMED +FB25 ; [.223D.0020.0005] # HEBREW LETTER WIDE LAMED +FB3C ; [.223D.0020.0002][.0000.005F.0002] # HEBREW LETTER LAMED WITH DAGESH +05DE ; [.223E.0020.0002] # HEBREW LETTER MEM +FB26 ; [.223E.0020.0005] # HEBREW LETTER WIDE FINAL MEM +05DD ; [.223E.0020.0019] # HEBREW LETTER FINAL MEM +FB3E ; [.223E.0020.0002][.0000.005F.0002] # HEBREW LETTER MEM WITH DAGESH +05E0 ; [.223F.0020.0002] # HEBREW LETTER NUN +05DF ; [.223F.0020.0019] # HEBREW LETTER FINAL NUN +FB40 ; [.223F.0020.0002][.0000.005F.0002] # HEBREW LETTER NUN WITH DAGESH +05E1 ; [.2240.0020.0002] # HEBREW LETTER SAMEKH +FB41 ; [.2240.0020.0002][.0000.005F.0002] # HEBREW LETTER SAMEKH WITH DAGESH +05E2 ; [.2241.0020.0002] # HEBREW LETTER AYIN +FB20 ; [.2241.0020.0005] # HEBREW LETTER ALTERNATIVE AYIN +05E4 ; [.2242.0020.0002] # HEBREW LETTER PE +05E3 ; [.2242.0020.0019] # HEBREW LETTER FINAL PE +FB44 ; [.2242.0020.0002][.0000.005F.0002] # HEBREW LETTER PE WITH DAGESH +FB43 ; [.2242.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL PE WITH DAGESH +FB4E ; [.2242.0020.0002][.0000.0060.0002] # HEBREW LETTER PE WITH RAFE +05E6 ; [.2243.0020.0002] # HEBREW LETTER TSADI +05E5 ; [.2243.0020.0019] # HEBREW LETTER FINAL TSADI +FB46 ; [.2243.0020.0002][.0000.005F.0002] # HEBREW LETTER TSADI WITH DAGESH +05E7 ; [.2244.0020.0002] # HEBREW LETTER QOF +FB47 ; [.2244.0020.0002][.0000.005F.0002] # HEBREW LETTER QOF WITH DAGESH +05E8 ; [.2245.0020.0002] # HEBREW LETTER RESH +FB27 ; [.2245.0020.0005] # HEBREW LETTER WIDE RESH +FB48 ; [.2245.0020.0002][.0000.005F.0002] # HEBREW LETTER RESH WITH DAGESH +05E9 ; [.2246.0020.0002] # HEBREW LETTER SHIN +FB2B ; [.2246.0020.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH SIN DOT +FB2A ; [.2246.0020.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH SHIN DOT +FB49 ; [.2246.0020.0002][.0000.005F.0002] # HEBREW LETTER SHIN WITH DAGESH +FB2D ; [.2246.0020.0002][.0000.005F.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2C ; [.2246.0020.0002][.0000.005F.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +05EA ; [.2247.0020.0002] # HEBREW LETTER TAV +FB28 ; [.2247.0020.0005] # HEBREW LETTER WIDE TAV +FB4A ; [.2247.0020.0002][.0000.005F.0002] # HEBREW LETTER TAV WITH DAGESH +10900 ; [.2248.0020.0002] # PHOENICIAN LETTER ALF +10901 ; [.2249.0020.0002] # PHOENICIAN LETTER BET +10902 ; [.224A.0020.0002] # PHOENICIAN LETTER GAML +10903 ; [.224B.0020.0002] # PHOENICIAN LETTER DELT +10904 ; [.224C.0020.0002] # PHOENICIAN LETTER HE +10905 ; [.224D.0020.0002] # PHOENICIAN LETTER WAU +10906 ; [.224E.0020.0002] # PHOENICIAN LETTER ZAI +10907 ; [.224F.0020.0002] # PHOENICIAN LETTER HET +10908 ; [.2250.0020.0002] # PHOENICIAN LETTER TET +10909 ; [.2251.0020.0002] # PHOENICIAN LETTER YOD +1090A ; [.2252.0020.0002] # PHOENICIAN LETTER KAF +1090B ; [.2253.0020.0002] # PHOENICIAN LETTER LAMD +1090C ; [.2254.0020.0002] # PHOENICIAN LETTER MEM +1090D ; [.2255.0020.0002] # PHOENICIAN LETTER NUN +1090E ; [.2256.0020.0002] # PHOENICIAN LETTER SEMK +1090F ; [.2257.0020.0002] # PHOENICIAN LETTER AIN +10910 ; [.2258.0020.0002] # PHOENICIAN LETTER PE +10911 ; [.2259.0020.0002] # PHOENICIAN LETTER SADE +10912 ; [.225A.0020.0002] # PHOENICIAN LETTER QOF +10913 ; [.225B.0020.0002] # PHOENICIAN LETTER ROSH +10914 ; [.225C.0020.0002] # PHOENICIAN LETTER SHIN +10915 ; [.225D.0020.0002] # PHOENICIAN LETTER TAU +0800 ; [.225E.0020.0002] # SAMARITAN LETTER ALAF +0801 ; [.225F.0020.0002] # SAMARITAN LETTER BIT +0802 ; [.2260.0020.0002] # SAMARITAN LETTER GAMAN +0803 ; [.2261.0020.0002] # SAMARITAN LETTER DALAT +0804 ; [.2262.0020.0002] # SAMARITAN LETTER IY +0805 ; [.2263.0020.0002] # SAMARITAN LETTER BAA +0806 ; [.2264.0020.0002] # SAMARITAN LETTER ZEN +0807 ; [.2265.0020.0002] # SAMARITAN LETTER IT +0808 ; [.2266.0020.0002] # SAMARITAN LETTER TIT +0809 ; [.2267.0020.0002] # SAMARITAN LETTER YUT +080A ; [.2268.0020.0002] # SAMARITAN LETTER KAAF +080B ; [.2269.0020.0002] # SAMARITAN LETTER LABAT +080C ; [.226A.0020.0002] # SAMARITAN LETTER MIM +080D ; [.226B.0020.0002] # SAMARITAN LETTER NUN +080E ; [.226C.0020.0002] # SAMARITAN LETTER SINGAAT +080F ; [.226D.0020.0002] # SAMARITAN LETTER IN +0810 ; [.226E.0020.0002] # SAMARITAN LETTER FI +0811 ; [.226F.0020.0002] # SAMARITAN LETTER TSAADIY +0812 ; [.2270.0020.0002] # SAMARITAN LETTER QUF +0813 ; [.2271.0020.0002] # SAMARITAN LETTER RISH +0814 ; [.2272.0020.0002] # SAMARITAN LETTER SHAN +0815 ; [.2273.0020.0002] # SAMARITAN LETTER TAAF +0816 ; [.2274.0020.0002] # SAMARITAN MARK IN +0817 ; [.2275.0020.0002] # SAMARITAN MARK IN-ALAF +081A ; [.2276.0020.0002] # SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B ; [.2277.0020.0002] # SAMARITAN MARK EPENTHETIC YUT +0621 ; [.2278.0020.0002] # ARABIC LETTER HAMZA +0674 ; [.2278.0020.0004] # ARABIC LETTER HIGH HAMZA +FE80 ; [.2278.0020.001A] # ARABIC LETTER HAMZA ISOLATED FORM +06FD ; [.2278.0020.0004][.0000.010C.0004] # ARABIC SIGN SINDHI AMPERSAND +0622 ; [.2279.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE +0627 0653 ; [.2279.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE +FE82 ; [.2279.0020.0019] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE81 ; [.2279.0020.001A] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +0623 ; [.227A.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE +0627 0654 ; [.227A.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE +FE84 ; [.227A.0020.0019] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE83 ; [.227A.0020.001A] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +0672 ; [.227B.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE +0671 ; [.227C.0020.0002] # ARABIC LETTER ALEF WASLA +FB51 ; [.227C.0020.0019] # ARABIC LETTER ALEF WASLA FINAL FORM +FB50 ; [.227C.0020.001A] # ARABIC LETTER ALEF WASLA ISOLATED FORM +0624 ; [.227D.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE +0648 0654 ; [.227D.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE +FE86 ; [.227D.0020.0019] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE85 ; [.227D.0020.001A] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +0625 ; [.227E.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW +0627 0655 ; [.227E.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW +FE88 ; [.227E.0020.0019] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE87 ; [.227E.0020.001A] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +0673 ; [.227F.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0773 ; [.2280.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0774 ; [.2281.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0626 ; [.2282.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE +064A 0654 ; [.2282.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE +FE8B ; [.2282.0020.0017] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE8C ; [.2282.0020.0018] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8A ; [.2282.0020.0019] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE89 ; [.2282.0020.001A] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FBEB ; [.2282.0020.0019][.2286.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEA ; [.2282.0020.001A][.2286.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FC97 ; [.2282.0020.0017][.229D.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC00 ; [.2282.0020.001A][.229D.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC98 ; [.2282.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC01 ; [.2282.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC99 ; [.2282.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC64 ; [.2282.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65 ; [.2282.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC9A ; [.2282.0020.0017][.2318.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FCDF ; [.2282.0020.0018][.2318.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FC66 ; [.2282.0020.0019][.2318.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC02 ; [.2282.0020.001A][.2318.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC67 ; [.2282.0020.0019][.231C.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC9B ; [.2282.0020.0017][.2325.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FCE0 ; [.2282.0020.0018][.2325.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FBED ; [.2282.0020.0019][.232A.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEC ; [.2282.0020.001A][.232A.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBEF ; [.2282.0020.0019][.232B.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBEE ; [.2282.0020.001A][.232B.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBF3 ; [.2282.0020.0019][.232E.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF2 ; [.2282.0020.001A][.232E.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF1 ; [.2282.0020.0019][.232F.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF0 ; [.2282.0020.001A][.232F.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF5 ; [.2282.0020.0019][.2330.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF4 ; [.2282.0020.001A][.2330.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBFB ; [.2282.0020.0017][.2339.0020.0017] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFA ; [.2282.0020.0019][.2339.0020.0019] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC68 ; [.2282.0020.0019][.2339.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBF9 ; [.2282.0020.001A][.2339.0020.001A] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC03 ; [.2282.0020.001A][.2339.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC69 ; [.2282.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC04 ; [.2282.0020.001A][.233A.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FBF8 ; [.2282.0020.0017][.233E.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF7 ; [.2282.0020.0019][.233E.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBF6 ; [.2282.0020.001A][.233E.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +08A8 ; [.2283.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE +08A9 ; [.2284.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE +08AC ; [.2285.0020.0002] # ARABIC LETTER ROHINGYA YEH +0627 ; [.2286.0020.0002] # ARABIC LETTER ALEF +08AD ; [.2286.0020.0004] # ARABIC LETTER LOW ALEF +1EE00 ; [.2286.0020.0005] # ARABIC MATHEMATICAL ALEF +1EE80 ; [.2286.0020.0005] # ARABIC MATHEMATICAL LOOPED ALEF +FE8E ; [.2286.0020.0019] # ARABIC LETTER ALEF FINAL FORM +FE8D ; [.2286.0020.001A] # ARABIC LETTER ALEF ISOLATED FORM +FD3C ; [.2286.0020.0019][.0000.006D.0019] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD3D ; [.2286.0020.001A][.0000.006D.001A] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +0675 ; [.2286.0020.0004][.2278.0020.0004] # ARABIC LETTER HIGH HAMZA ALEF +FDF3 ; [.2286.0020.001A][.22FC.0020.001A][.2288.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE AKBAR ISOLATED FORM +FDF2 ; [.2286.0020.001A][.2311.0020.001A][.2311.0020.001A][.2325.0020.001A] # ARABIC LIGATURE ALLAH ISOLATED FORM +066E ; [.2287.0020.0002] # ARABIC LETTER DOTLESS BEH +1EE1C ; [.2287.0020.0005] # ARABIC MATHEMATICAL DOTLESS BEH +1EE7C ; [.2287.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +0628 ; [.2288.0020.0002] # ARABIC LETTER BEH +1EE01 ; [.2288.0020.0005] # ARABIC MATHEMATICAL BEH +1EE21 ; [.2288.0020.0005] # ARABIC MATHEMATICAL INITIAL BEH +1EE61 ; [.2288.0020.0005] # ARABIC MATHEMATICAL STRETCHED BEH +1EE81 ; [.2288.0020.0005] # ARABIC MATHEMATICAL LOOPED BEH +1EEA1 ; [.2288.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK BEH +FE91 ; [.2288.0020.0017] # ARABIC LETTER BEH INITIAL FORM +FE92 ; [.2288.0020.0018] # ARABIC LETTER BEH MEDIAL FORM +FE90 ; [.2288.0020.0019] # ARABIC LETTER BEH FINAL FORM +FE8F ; [.2288.0020.001A] # ARABIC LETTER BEH ISOLATED FORM +FC9C ; [.2288.0020.0017][.229D.0020.0017] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC05 ; [.2288.0020.001A][.229D.0020.001A] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC9D ; [.2288.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC06 ; [.2288.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FDC2 ; [.2288.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FC9E ; [.2288.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC07 ; [.2288.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FD9E ; [.2288.0020.0019][.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FC6A ; [.2288.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B ; [.2288.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC9F ; [.2288.0020.0017][.2318.0020.0017] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCE1 ; [.2288.0020.0018][.2318.0020.0018] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FC6C ; [.2288.0020.0019][.2318.0020.0019] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC08 ; [.2288.0020.001A][.2318.0020.001A] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC6D ; [.2288.0020.0019][.231C.0020.0019] # ARABIC LIGATURE BEH WITH NOON FINAL FORM +FCA0 ; [.2288.0020.0017][.2325.0020.0017] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCE2 ; [.2288.0020.0018][.2325.0020.0018] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FC6E ; [.2288.0020.0019][.2339.0020.0019] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC09 ; [.2288.0020.001A][.2339.0020.001A] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC6F ; [.2288.0020.0019][.233A.0020.0019] # ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC0A ; [.2288.0020.001A][.233A.0020.001A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +067B ; [.2289.0020.0002] # ARABIC LETTER BEEH +FB54 ; [.2289.0020.0017] # ARABIC LETTER BEEH INITIAL FORM +FB55 ; [.2289.0020.0018] # ARABIC LETTER BEEH MEDIAL FORM +FB53 ; [.2289.0020.0019] # ARABIC LETTER BEEH FINAL FORM +FB52 ; [.2289.0020.001A] # ARABIC LETTER BEEH ISOLATED FORM +067E ; [.228A.0020.0002] # ARABIC LETTER PEH +FB58 ; [.228A.0020.0017] # ARABIC LETTER PEH INITIAL FORM +FB59 ; [.228A.0020.0018] # ARABIC LETTER PEH MEDIAL FORM +FB57 ; [.228A.0020.0019] # ARABIC LETTER PEH FINAL FORM +FB56 ; [.228A.0020.001A] # ARABIC LETTER PEH ISOLATED FORM +0680 ; [.228B.0020.0002] # ARABIC LETTER BEHEH +FB5C ; [.228B.0020.0017] # ARABIC LETTER BEHEH INITIAL FORM +FB5D ; [.228B.0020.0018] # ARABIC LETTER BEHEH MEDIAL FORM +FB5B ; [.228B.0020.0019] # ARABIC LETTER BEHEH FINAL FORM +FB5A ; [.228B.0020.001A] # ARABIC LETTER BEHEH ISOLATED FORM +0750 ; [.228C.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW +0751 ; [.228D.0020.0002] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE +0752 ; [.228E.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW +0753 ; [.228F.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE +0754 ; [.2290.0020.0002] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE +0755 ; [.2291.0020.0002] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW +08A0 ; [.2292.0020.0002] # ARABIC LETTER BEH WITH SMALL V BELOW +0756 ; [.2293.0020.0002] # ARABIC LETTER BEH WITH SMALL V +08A1 ; [.2294.0020.0002] # ARABIC LETTER BEH WITH HAMZA ABOVE +0629 ; [.2295.0020.0002] # ARABIC LETTER TEH MARBUTA +FE94 ; [.2295.0020.0019] # ARABIC LETTER TEH MARBUTA FINAL FORM +FE93 ; [.2295.0020.001A] # ARABIC LETTER TEH MARBUTA ISOLATED FORM +062A ; [.2296.0020.0002] # ARABIC LETTER TEH +1EE15 ; [.2296.0020.0005] # ARABIC MATHEMATICAL TEH +1EE35 ; [.2296.0020.0005] # ARABIC MATHEMATICAL INITIAL TEH +1EE75 ; [.2296.0020.0005] # ARABIC MATHEMATICAL STRETCHED TEH +1EE95 ; [.2296.0020.0005] # ARABIC MATHEMATICAL LOOPED TEH +1EEB5 ; [.2296.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TEH +FE97 ; [.2296.0020.0017] # ARABIC LETTER TEH INITIAL FORM +FE98 ; [.2296.0020.0018] # ARABIC LETTER TEH MEDIAL FORM +FE96 ; [.2296.0020.0019] # ARABIC LETTER TEH FINAL FORM +FE95 ; [.2296.0020.001A] # ARABIC LETTER TEH ISOLATED FORM +FCA1 ; [.2296.0020.0017][.229D.0020.0017] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FC0B ; [.2296.0020.001A][.229D.0020.001A] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FD50 ; [.2296.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FDA0 ; [.2296.0020.0019][.229D.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9F ; [.2296.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FCA2 ; [.2296.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FC0C ; [.2296.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FD52 ; [.2296.0020.0017][.22A4.0020.0017][.229D.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD51 ; [.2296.0020.0019][.22A4.0020.0019][.229D.0020.0019] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD53 ; [.2296.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FCA3 ; [.2296.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FC0D ; [.2296.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FD54 ; [.2296.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FDA2 ; [.2296.0020.0019][.22A5.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA1 ; [.2296.0020.0019][.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FC70 ; [.2296.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71 ; [.2296.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FCA4 ; [.2296.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCE3 ; [.2296.0020.0018][.2318.0020.0018] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FC72 ; [.2296.0020.0019][.2318.0020.0019] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC0E ; [.2296.0020.001A][.2318.0020.001A] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FD55 ; [.2296.0020.0017][.2318.0020.0017][.229D.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56 ; [.2296.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57 ; [.2296.0020.0017][.2318.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FDA4 ; [.2296.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA3 ; [.2296.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FC73 ; [.2296.0020.0019][.231C.0020.0019] # ARABIC LIGATURE TEH WITH NOON FINAL FORM +FCA5 ; [.2296.0020.0017][.2325.0020.0017] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCE4 ; [.2296.0020.0018][.2325.0020.0018] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FC74 ; [.2296.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC0F ; [.2296.0020.001A][.2339.0020.001A] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC75 ; [.2296.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC10 ; [.2296.0020.001A][.233A.0020.001A] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +062B ; [.2297.0020.0002] # ARABIC LETTER THEH +1EE16 ; [.2297.0020.0005] # ARABIC MATHEMATICAL THEH +1EE36 ; [.2297.0020.0005] # ARABIC MATHEMATICAL INITIAL THEH +1EE76 ; [.2297.0020.0005] # ARABIC MATHEMATICAL STRETCHED THEH +1EE96 ; [.2297.0020.0005] # ARABIC MATHEMATICAL LOOPED THEH +1EEB6 ; [.2297.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THEH +FE9B ; [.2297.0020.0017] # ARABIC LETTER THEH INITIAL FORM +FE9C ; [.2297.0020.0018] # ARABIC LETTER THEH MEDIAL FORM +FE9A ; [.2297.0020.0019] # ARABIC LETTER THEH FINAL FORM +FE99 ; [.2297.0020.001A] # ARABIC LETTER THEH ISOLATED FORM +FC11 ; [.2297.0020.001A][.229D.0020.001A] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC76 ; [.2297.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77 ; [.2297.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FCA6 ; [.2297.0020.0017][.2318.0020.0017] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCE5 ; [.2297.0020.0018][.2318.0020.0018] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FC78 ; [.2297.0020.0019][.2318.0020.0019] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC12 ; [.2297.0020.001A][.2318.0020.001A] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC79 ; [.2297.0020.0019][.231C.0020.0019] # ARABIC LIGATURE THEH WITH NOON FINAL FORM +FCE6 ; [.2297.0020.0018][.2325.0020.0018] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FC7A ; [.2297.0020.0019][.2339.0020.0019] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC13 ; [.2297.0020.001A][.2339.0020.001A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC7B ; [.2297.0020.0019][.233A.0020.0019] # ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC14 ; [.2297.0020.001A][.233A.0020.001A] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +0679 ; [.2298.0020.0002] # ARABIC LETTER TTEH +FB68 ; [.2298.0020.0017] # ARABIC LETTER TTEH INITIAL FORM +FB69 ; [.2298.0020.0018] # ARABIC LETTER TTEH MEDIAL FORM +FB67 ; [.2298.0020.0019] # ARABIC LETTER TTEH FINAL FORM +FB66 ; [.2298.0020.001A] # ARABIC LETTER TTEH ISOLATED FORM +067A ; [.2299.0020.0002] # ARABIC LETTER TTEHEH +FB60 ; [.2299.0020.0017] # ARABIC LETTER TTEHEH INITIAL FORM +FB61 ; [.2299.0020.0018] # ARABIC LETTER TTEHEH MEDIAL FORM +FB5F ; [.2299.0020.0019] # ARABIC LETTER TTEHEH FINAL FORM +FB5E ; [.2299.0020.001A] # ARABIC LETTER TTEHEH ISOLATED FORM +067C ; [.229A.0020.0002] # ARABIC LETTER TEH WITH RING +067D ; [.229B.0020.0002] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS +067F ; [.229C.0020.0002] # ARABIC LETTER TEHEH +FB64 ; [.229C.0020.0017] # ARABIC LETTER TEHEH INITIAL FORM +FB65 ; [.229C.0020.0018] # ARABIC LETTER TEHEH MEDIAL FORM +FB63 ; [.229C.0020.0019] # ARABIC LETTER TEHEH FINAL FORM +FB62 ; [.229C.0020.001A] # ARABIC LETTER TEHEH ISOLATED FORM +062C ; [.229D.0020.0002] # ARABIC LETTER JEEM +1EE02 ; [.229D.0020.0005] # ARABIC MATHEMATICAL JEEM +1EE22 ; [.229D.0020.0005] # ARABIC MATHEMATICAL INITIAL JEEM +1EE42 ; [.229D.0020.0005] # ARABIC MATHEMATICAL TAILED JEEM +1EE62 ; [.229D.0020.0005] # ARABIC MATHEMATICAL STRETCHED JEEM +1EE82 ; [.229D.0020.0005] # ARABIC MATHEMATICAL LOOPED JEEM +1EEA2 ; [.229D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM +FE9F ; [.229D.0020.0017] # ARABIC LETTER JEEM INITIAL FORM +FEA0 ; [.229D.0020.0018] # ARABIC LETTER JEEM MEDIAL FORM +FE9E ; [.229D.0020.0019] # ARABIC LETTER JEEM FINAL FORM +FE9D ; [.229D.0020.001A] # ARABIC LETTER JEEM ISOLATED FORM +FCA7 ; [.229D.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FC15 ; [.229D.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FDA6 ; [.229D.0020.0019][.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDBE ; [.229D.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDFB ; [.229D.0020.001A][.2311.0020.001A][*0209.0020.001A][.229D.0020.001A][.2311.0020.001A][.2286.0020.001A][.2311.0020.001A][.2325.0020.001A] # ARABIC LIGATURE JALLAJALALOUHOU +FCA8 ; [.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FC16 ; [.229D.0020.001A][.2318.0020.001A] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FD59 ; [.229D.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD58 ; [.229D.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FDA7 ; [.229D.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5 ; [.229D.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FD1D ; [.229D.0020.0019][.2339.0020.0019] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD01 ; [.229D.0020.001A][.2339.0020.001A] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD1E ; [.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD02 ; [.229D.0020.001A][.233A.0020.001A] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +0683 ; [.229E.0020.0002] # ARABIC LETTER NYEH +FB78 ; [.229E.0020.0017] # ARABIC LETTER NYEH INITIAL FORM +FB79 ; [.229E.0020.0018] # ARABIC LETTER NYEH MEDIAL FORM +FB77 ; [.229E.0020.0019] # ARABIC LETTER NYEH FINAL FORM +FB76 ; [.229E.0020.001A] # ARABIC LETTER NYEH ISOLATED FORM +0684 ; [.229F.0020.0002] # ARABIC LETTER DYEH +FB74 ; [.229F.0020.0017] # ARABIC LETTER DYEH INITIAL FORM +FB75 ; [.229F.0020.0018] # ARABIC LETTER DYEH MEDIAL FORM +FB73 ; [.229F.0020.0019] # ARABIC LETTER DYEH FINAL FORM +FB72 ; [.229F.0020.001A] # ARABIC LETTER DYEH ISOLATED FORM +0686 ; [.22A0.0020.0002] # ARABIC LETTER TCHEH +FB7C ; [.22A0.0020.0017] # ARABIC LETTER TCHEH INITIAL FORM +FB7D ; [.22A0.0020.0018] # ARABIC LETTER TCHEH MEDIAL FORM +FB7B ; [.22A0.0020.0019] # ARABIC LETTER TCHEH FINAL FORM +FB7A ; [.22A0.0020.001A] # ARABIC LETTER TCHEH ISOLATED FORM +06BF ; [.22A1.0020.0002] # ARABIC LETTER TCHEH WITH DOT ABOVE +0687 ; [.22A2.0020.0002] # ARABIC LETTER TCHEHEH +FB80 ; [.22A2.0020.0017] # ARABIC LETTER TCHEHEH INITIAL FORM +FB81 ; [.22A2.0020.0018] # ARABIC LETTER TCHEHEH MEDIAL FORM +FB7F ; [.22A2.0020.0019] # ARABIC LETTER TCHEHEH FINAL FORM +FB7E ; [.22A2.0020.001A] # ARABIC LETTER TCHEHEH ISOLATED FORM +08A2 ; [.22A3.0020.0002] # ARABIC LETTER JEEM WITH TWO DOTS ABOVE +062D ; [.22A4.0020.0002] # ARABIC LETTER HAH +1EE07 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL HAH +1EE27 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL INITIAL HAH +1EE47 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL TAILED HAH +1EE67 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL STRETCHED HAH +1EE87 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL LOOPED HAH +1EEA7 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK HAH +FEA3 ; [.22A4.0020.0017] # ARABIC LETTER HAH INITIAL FORM +FEA4 ; [.22A4.0020.0018] # ARABIC LETTER HAH MEDIAL FORM +FEA2 ; [.22A4.0020.0019] # ARABIC LETTER HAH FINAL FORM +FEA1 ; [.22A4.0020.001A] # ARABIC LETTER HAH ISOLATED FORM +FCA9 ; [.22A4.0020.0017][.229D.0020.0017] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FC17 ; [.22A4.0020.001A][.229D.0020.001A] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FDBF ; [.22A4.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FCAA ; [.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FC18 ; [.22A4.0020.001A][.2318.0020.001A] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FD5B ; [.22A4.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5A ; [.22A4.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD1B ; [.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FCFF ; [.22A4.0020.001A][.2339.0020.001A] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD1C ; [.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD00 ; [.22A4.0020.001A][.233A.0020.001A] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +062E ; [.22A5.0020.0002] # ARABIC LETTER KHAH +1EE17 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL KHAH +1EE37 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL INITIAL KHAH +1EE57 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL TAILED KHAH +1EE77 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL STRETCHED KHAH +1EE97 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL LOOPED KHAH +1EEB7 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH +FEA7 ; [.22A5.0020.0017] # ARABIC LETTER KHAH INITIAL FORM +FEA8 ; [.22A5.0020.0018] # ARABIC LETTER KHAH MEDIAL FORM +FEA6 ; [.22A5.0020.0019] # ARABIC LETTER KHAH FINAL FORM +FEA5 ; [.22A5.0020.001A] # ARABIC LETTER KHAH ISOLATED FORM +FCAB ; [.22A5.0020.0017][.229D.0020.0017] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FC19 ; [.22A5.0020.001A][.229D.0020.001A] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A ; [.22A5.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FCAC ; [.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FC1B ; [.22A5.0020.001A][.2318.0020.001A] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FD1F ; [.22A5.0020.0019][.2339.0020.0019] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD03 ; [.22A5.0020.001A][.2339.0020.001A] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD20 ; [.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD04 ; [.22A5.0020.001A][.233A.0020.001A] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +0681 ; [.22A6.0020.0002] # ARABIC LETTER HAH WITH HAMZA ABOVE +0682 ; [.22A7.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE +0685 ; [.22A8.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS ABOVE +0757 ; [.22A9.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS ABOVE +0758 ; [.22AA.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW +076E ; [.22AB.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW +076F ; [.22AC.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS +0772 ; [.22AD.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE +077C ; [.22AE.0020.0002] # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW +062F ; [.22AF.0020.0002] # ARABIC LETTER DAL +1EE03 ; [.22AF.0020.0005] # ARABIC MATHEMATICAL DAL +1EE83 ; [.22AF.0020.0005] # ARABIC MATHEMATICAL LOOPED DAL +1EEA3 ; [.22AF.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +FEAA ; [.22AF.0020.0019] # ARABIC LETTER DAL FINAL FORM +FEA9 ; [.22AF.0020.001A] # ARABIC LETTER DAL ISOLATED FORM +0630 ; [.22B0.0020.0002] # ARABIC LETTER THAL +1EE18 ; [.22B0.0020.0005] # ARABIC MATHEMATICAL THAL +1EE98 ; [.22B0.0020.0005] # ARABIC MATHEMATICAL LOOPED THAL +1EEB8 ; [.22B0.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THAL +FEAC ; [.22B0.0020.0019] # ARABIC LETTER THAL FINAL FORM +FEAB ; [.22B0.0020.001A] # ARABIC LETTER THAL ISOLATED FORM +FC5B ; [.22B0.0020.001A][.0000.0098.001A] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +0688 ; [.22B1.0020.0002] # ARABIC LETTER DDAL +FB89 ; [.22B1.0020.0019] # ARABIC LETTER DDAL FINAL FORM +FB88 ; [.22B1.0020.001A] # ARABIC LETTER DDAL ISOLATED FORM +0689 ; [.22B2.0020.0002] # ARABIC LETTER DAL WITH RING +068A ; [.22B3.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW +068B ; [.22B4.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH +068C ; [.22B5.0020.0002] # ARABIC LETTER DAHAL +FB85 ; [.22B5.0020.0019] # ARABIC LETTER DAHAL FINAL FORM +FB84 ; [.22B5.0020.001A] # ARABIC LETTER DAHAL ISOLATED FORM +068D ; [.22B6.0020.0002] # ARABIC LETTER DDAHAL +FB83 ; [.22B6.0020.0019] # ARABIC LETTER DDAHAL FINAL FORM +FB82 ; [.22B6.0020.001A] # ARABIC LETTER DDAHAL ISOLATED FORM +08AE ; [.22B7.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS BELOW +068E ; [.22B8.0020.0002] # ARABIC LETTER DUL +FB87 ; [.22B8.0020.0019] # ARABIC LETTER DUL FINAL FORM +FB86 ; [.22B8.0020.001A] # ARABIC LETTER DUL ISOLATED FORM +068F ; [.22B9.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS +0690 ; [.22BA.0020.0002] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE +06EE ; [.22BB.0020.0002] # ARABIC LETTER DAL WITH INVERTED V +0759 ; [.22BC.0020.0002] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH +075A ; [.22BD.0020.0002] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW +0631 ; [.22BE.0020.0002] # ARABIC LETTER REH +1EE13 ; [.22BE.0020.0005] # ARABIC MATHEMATICAL REH +1EE93 ; [.22BE.0020.0005] # ARABIC MATHEMATICAL LOOPED REH +1EEB3 ; [.22BE.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK REH +FEAE ; [.22BE.0020.0019] # ARABIC LETTER REH FINAL FORM +FEAD ; [.22BE.0020.001A] # ARABIC LETTER REH ISOLATED FORM +FC5C ; [.22BE.0020.001A][.0000.0098.001A] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FDF6 ; [.22BE.0020.001A][.22D0.0020.001A][.232B.0020.001A][.2311.0020.001A] # ARABIC LIGATURE RASOUL ISOLATED FORM +FDFC ; [.22BE.0020.001A][.233B.0020.001A][.2286.0020.001A][.2311.0020.001A] # RIAL SIGN +0632 ; [.22BF.0020.0002] # ARABIC LETTER ZAIN +1EE06 ; [.22BF.0020.0005] # ARABIC MATHEMATICAL ZAIN +1EE86 ; [.22BF.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAIN +1EEA6 ; [.22BF.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN +FEB0 ; [.22BF.0020.0019] # ARABIC LETTER ZAIN FINAL FORM +FEAF ; [.22BF.0020.001A] # ARABIC LETTER ZAIN ISOLATED FORM +0691 ; [.22C0.0020.0002] # ARABIC LETTER RREH +FB8D ; [.22C0.0020.0019] # ARABIC LETTER RREH FINAL FORM +FB8C ; [.22C0.0020.001A] # ARABIC LETTER RREH ISOLATED FORM +0692 ; [.22C1.0020.0002] # ARABIC LETTER REH WITH SMALL V +0693 ; [.22C2.0020.0002] # ARABIC LETTER REH WITH RING +0694 ; [.22C3.0020.0002] # ARABIC LETTER REH WITH DOT BELOW +0695 ; [.22C4.0020.0002] # ARABIC LETTER REH WITH SMALL V BELOW +0696 ; [.22C5.0020.0002] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE +0697 ; [.22C6.0020.0002] # ARABIC LETTER REH WITH TWO DOTS ABOVE +0698 ; [.22C7.0020.0002] # ARABIC LETTER JEH +FB8B ; [.22C7.0020.0019] # ARABIC LETTER JEH FINAL FORM +FB8A ; [.22C7.0020.001A] # ARABIC LETTER JEH ISOLATED FORM +0699 ; [.22C8.0020.0002] # ARABIC LETTER REH WITH FOUR DOTS ABOVE +06EF ; [.22C9.0020.0002] # ARABIC LETTER REH WITH INVERTED V +075B ; [.22CA.0020.0002] # ARABIC LETTER REH WITH STROKE +076B ; [.22CB.0020.0002] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE +076C ; [.22CC.0020.0002] # ARABIC LETTER REH WITH HAMZA ABOVE +0771 ; [.22CD.0020.0002] # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS +08AA ; [.22CE.0020.0002] # ARABIC LETTER REH WITH LOOP +08B2 ; [.22CF.0020.0002] # ARABIC LETTER ZAIN WITH INVERTED V ABOVE +0633 ; [.22D0.0020.0002] # ARABIC LETTER SEEN +1EE0E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL SEEN +1EE2E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL INITIAL SEEN +1EE4E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL TAILED SEEN +1EE6E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL STRETCHED SEEN +1EE8E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL LOOPED SEEN +1EEAE ; [.22D0.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN +FEB3 ; [.22D0.0020.0017] # ARABIC LETTER SEEN INITIAL FORM +FEB4 ; [.22D0.0020.0018] # ARABIC LETTER SEEN MEDIAL FORM +FEB2 ; [.22D0.0020.0019] # ARABIC LETTER SEEN FINAL FORM +FEB1 ; [.22D0.0020.001A] # ARABIC LETTER SEEN ISOLATED FORM +FCAD ; [.22D0.0020.0017][.229D.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FD34 ; [.22D0.0020.0018][.229D.0020.0018] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FC1C ; [.22D0.0020.001A][.229D.0020.001A] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FD5D ; [.22D0.0020.0017][.229D.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E ; [.22D0.0020.0019][.229D.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FCAE ; [.22D0.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FD35 ; [.22D0.0020.0018][.22A4.0020.0018] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FC1D ; [.22D0.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FD5C ; [.22D0.0020.0017][.22A4.0020.0017][.229D.0020.0017] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FCAF ; [.22D0.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FD36 ; [.22D0.0020.0018][.22A5.0020.0018] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FC1E ; [.22D0.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FDA8 ; [.22D0.0020.0019][.22A5.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDC6 ; [.22D0.0020.0019][.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FD2A ; [.22D0.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD0E ; [.22D0.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FCB0 ; [.22D0.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCE7 ; [.22D0.0020.0018][.2318.0020.0018] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FC1F ; [.22D0.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FD61 ; [.22D0.0020.0017][.2318.0020.0017][.229D.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD60 ; [.22D0.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD5F ; [.22D0.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD63 ; [.22D0.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD62 ; [.22D0.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD31 ; [.22D0.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FCE8 ; [.22D0.0020.0018][.2325.0020.0018] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FD17 ; [.22D0.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FCFB ; [.22D0.0020.001A][.2339.0020.001A] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FD18 ; [.22D0.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FCFC ; [.22D0.0020.001A][.233A.0020.001A] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +0634 ; [.22D1.0020.0002] # ARABIC LETTER SHEEN +1EE14 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL SHEEN +1EE34 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL INITIAL SHEEN +1EE54 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL TAILED SHEEN +1EE74 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL STRETCHED SHEEN +1EE94 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL LOOPED SHEEN +1EEB4 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN +FEB7 ; [.22D1.0020.0017] # ARABIC LETTER SHEEN INITIAL FORM +FEB8 ; [.22D1.0020.0018] # ARABIC LETTER SHEEN MEDIAL FORM +FEB6 ; [.22D1.0020.0019] # ARABIC LETTER SHEEN FINAL FORM +FEB5 ; [.22D1.0020.001A] # ARABIC LETTER SHEEN ISOLATED FORM +FD2D ; [.22D1.0020.0017][.229D.0020.0017] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD37 ; [.22D1.0020.0018][.229D.0020.0018] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD25 ; [.22D1.0020.0019][.229D.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD09 ; [.22D1.0020.001A][.229D.0020.001A] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD69 ; [.22D1.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD2E ; [.22D1.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD38 ; [.22D1.0020.0018][.22A4.0020.0018] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD26 ; [.22D1.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD0A ; [.22D1.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD68 ; [.22D1.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD67 ; [.22D1.0020.0019][.22A4.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FDAA ; [.22D1.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FD2F ; [.22D1.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD39 ; [.22D1.0020.0018][.22A5.0020.0018] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD27 ; [.22D1.0020.0019][.22A5.0020.0019] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD0B ; [.22D1.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD29 ; [.22D1.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD0D ; [.22D1.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD30 ; [.22D1.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FCE9 ; [.22D1.0020.0018][.2318.0020.0018] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FD28 ; [.22D1.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD0C ; [.22D1.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD6B ; [.22D1.0020.0017][.2318.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6A ; [.22D1.0020.0019][.2318.0020.0019][.22A5.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6D ; [.22D1.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6C ; [.22D1.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD32 ; [.22D1.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FCEA ; [.22D1.0020.0018][.2325.0020.0018] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FD19 ; [.22D1.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FCFD ; [.22D1.0020.001A][.2339.0020.001A] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FD1A ; [.22D1.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FCFE ; [.22D1.0020.001A][.233A.0020.001A] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +069A ; [.22D2.0020.0002] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE +069B ; [.22D3.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW +069C ; [.22D4.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE +06FA ; [.22D5.0020.0002] # ARABIC LETTER SHEEN WITH DOT BELOW +075C ; [.22D6.0020.0002] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE +076D ; [.22D7.0020.0002] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +0770 ; [.22D8.0020.0002] # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS +077D ; [.22D9.0020.0002] # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE +077E ; [.22DA.0020.0002] # ARABIC LETTER SEEN WITH INVERTED V +0635 ; [.22DB.0020.0002] # ARABIC LETTER SAD +1EE11 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL SAD +1EE31 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL INITIAL SAD +1EE51 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL TAILED SAD +1EE71 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL STRETCHED SAD +1EE91 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL LOOPED SAD +1EEB1 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SAD +FEBB ; [.22DB.0020.0017] # ARABIC LETTER SAD INITIAL FORM +FEBC ; [.22DB.0020.0018] # ARABIC LETTER SAD MEDIAL FORM +FEBA ; [.22DB.0020.0019] # ARABIC LETTER SAD FINAL FORM +FEB9 ; [.22DB.0020.001A] # ARABIC LETTER SAD ISOLATED FORM +FCB1 ; [.22DB.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FC20 ; [.22DB.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FD65 ; [.22DB.0020.0017][.22A4.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD64 ; [.22DB.0020.0019][.22A4.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FDA9 ; [.22DB.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FCB2 ; [.22DB.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FD2B ; [.22DB.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE SAD WITH REH FINAL FORM +FD0F ; [.22DB.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FDF5 ; [.22DB.0020.001A][.2311.0020.001A][.22E5.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SALAM ISOLATED FORM +FDF9 ; [.22DB.0020.001A][.2311.0020.001A][.2339.0020.001A] # ARABIC LIGATURE SALLA ISOLATED FORM +FDFA ; [.22DB.0020.001A][.2311.0020.001A][.2339.0020.001A][*0209.0020.001A][.2286.0020.001A][.2311.0020.001A][.2311.0020.001A][.2325.0020.001A][*0209.0020.001A][.22E5.0020.001A][.2311.0020.001A][.233A.0020.001A][.2325.0020.001A][*0209.0020.001A][.232B.0020.001A][.22D0.0020.001A][.2311.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDF0 ; [.22DB.0020.001A][.2311.0020.001A][.2347.0020.001A] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FCB3 ; [.22DB.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FC21 ; [.22DB.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FDC5 ; [.22DB.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FD66 ; [.22DB.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD21 ; [.22DB.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD05 ; [.22DB.0020.001A][.2339.0020.001A] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD22 ; [.22DB.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD06 ; [.22DB.0020.001A][.233A.0020.001A] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +0636 ; [.22DC.0020.0002] # ARABIC LETTER DAD +1EE19 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL DAD +1EE39 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL INITIAL DAD +1EE59 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL TAILED DAD +1EE79 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL STRETCHED DAD +1EE99 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL LOOPED DAD +1EEB9 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAD +FEBF ; [.22DC.0020.0017] # ARABIC LETTER DAD INITIAL FORM +FEC0 ; [.22DC.0020.0018] # ARABIC LETTER DAD MEDIAL FORM +FEBE ; [.22DC.0020.0019] # ARABIC LETTER DAD FINAL FORM +FEBD ; [.22DC.0020.001A] # ARABIC LETTER DAD ISOLATED FORM +FCB4 ; [.22DC.0020.0017][.229D.0020.0017] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FC22 ; [.22DC.0020.001A][.229D.0020.001A] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FCB5 ; [.22DC.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FC23 ; [.22DC.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FD6E ; [.22DC.0020.0019][.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FDAB ; [.22DC.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FCB6 ; [.22DC.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FC24 ; [.22DC.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FD70 ; [.22DC.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD6F ; [.22DC.0020.0019][.22A5.0020.0019][.2318.0020.0019] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD2C ; [.22DC.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE DAD WITH REH FINAL FORM +FD10 ; [.22DC.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FCB7 ; [.22DC.0020.0017][.2318.0020.0017] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FC25 ; [.22DC.0020.001A][.2318.0020.001A] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FD23 ; [.22DC.0020.0019][.2339.0020.0019] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD07 ; [.22DC.0020.001A][.2339.0020.001A] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD24 ; [.22DC.0020.0019][.233A.0020.0019] # ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD08 ; [.22DC.0020.001A][.233A.0020.001A] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +069D ; [.22DD.0020.0002] # ARABIC LETTER SAD WITH TWO DOTS BELOW +08AF ; [.22DE.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS BELOW +069E ; [.22DF.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS ABOVE +06FB ; [.22E0.0020.0002] # ARABIC LETTER DAD WITH DOT BELOW +0637 ; [.22E1.0020.0002] # ARABIC LETTER TAH +1EE08 ; [.22E1.0020.0005] # ARABIC MATHEMATICAL TAH +1EE68 ; [.22E1.0020.0005] # ARABIC MATHEMATICAL STRETCHED TAH +1EE88 ; [.22E1.0020.0005] # ARABIC MATHEMATICAL LOOPED TAH +1EEA8 ; [.22E1.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TAH +FEC3 ; [.22E1.0020.0017] # ARABIC LETTER TAH INITIAL FORM +FEC4 ; [.22E1.0020.0018] # ARABIC LETTER TAH MEDIAL FORM +FEC2 ; [.22E1.0020.0019] # ARABIC LETTER TAH FINAL FORM +FEC1 ; [.22E1.0020.001A] # ARABIC LETTER TAH ISOLATED FORM +FCB8 ; [.22E1.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FC26 ; [.22E1.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FD33 ; [.22E1.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD3A ; [.22E1.0020.0018][.2318.0020.0018] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FC27 ; [.22E1.0020.001A][.2318.0020.001A] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FD72 ; [.22E1.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD71 ; [.22E1.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD73 ; [.22E1.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74 ; [.22E1.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD11 ; [.22E1.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FCF5 ; [.22E1.0020.001A][.2339.0020.001A] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FD12 ; [.22E1.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TAH WITH YEH FINAL FORM +FCF6 ; [.22E1.0020.001A][.233A.0020.001A] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +0638 ; [.22E2.0020.0002] # ARABIC LETTER ZAH +1EE1A ; [.22E2.0020.0005] # ARABIC MATHEMATICAL ZAH +1EE7A ; [.22E2.0020.0005] # ARABIC MATHEMATICAL STRETCHED ZAH +1EE9A ; [.22E2.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAH +1EEBA ; [.22E2.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH +FEC7 ; [.22E2.0020.0017] # ARABIC LETTER ZAH INITIAL FORM +FEC8 ; [.22E2.0020.0018] # ARABIC LETTER ZAH MEDIAL FORM +FEC6 ; [.22E2.0020.0019] # ARABIC LETTER ZAH FINAL FORM +FEC5 ; [.22E2.0020.001A] # ARABIC LETTER ZAH ISOLATED FORM +FCB9 ; [.22E2.0020.0017][.2318.0020.0017] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FD3B ; [.22E2.0020.0018][.2318.0020.0018] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FC28 ; [.22E2.0020.001A][.2318.0020.001A] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +069F ; [.22E3.0020.0002] # ARABIC LETTER TAH WITH THREE DOTS ABOVE +08A3 ; [.22E4.0020.0002] # ARABIC LETTER TAH WITH TWO DOTS ABOVE +0639 ; [.22E5.0020.0002] # ARABIC LETTER AIN +1EE0F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL AIN +1EE2F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL INITIAL AIN +1EE4F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL TAILED AIN +1EE6F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL STRETCHED AIN +1EE8F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL LOOPED AIN +1EEAF ; [.22E5.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK AIN +FECB ; [.22E5.0020.0017] # ARABIC LETTER AIN INITIAL FORM +FECC ; [.22E5.0020.0018] # ARABIC LETTER AIN MEDIAL FORM +FECA ; [.22E5.0020.0019] # ARABIC LETTER AIN FINAL FORM +FEC9 ; [.22E5.0020.001A] # ARABIC LETTER AIN ISOLATED FORM +FCBA ; [.22E5.0020.0017][.229D.0020.0017] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FC29 ; [.22E5.0020.001A][.229D.0020.001A] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FDC4 ; [.22E5.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FD75 ; [.22E5.0020.0019][.229D.0020.0019][.2318.0020.0019] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FDF7 ; [.22E5.0020.001A][.2311.0020.001A][.233A.0020.001A][.2325.0020.001A] # ARABIC LIGATURE ALAYHE ISOLATED FORM +FCBB ; [.22E5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FC2A ; [.22E5.0020.001A][.2318.0020.001A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FD77 ; [.22E5.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD76 ; [.22E5.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD78 ; [.22E5.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDB6 ; [.22E5.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FD13 ; [.22E5.0020.0019][.2339.0020.0019] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FCF7 ; [.22E5.0020.001A][.2339.0020.001A] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FD14 ; [.22E5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE AIN WITH YEH FINAL FORM +FCF8 ; [.22E5.0020.001A][.233A.0020.001A] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +063A ; [.22E6.0020.0002] # ARABIC LETTER GHAIN +1EE1B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL GHAIN +1EE3B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL INITIAL GHAIN +1EE5B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL TAILED GHAIN +1EE7B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL STRETCHED GHAIN +1EE9B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL LOOPED GHAIN +1EEBB ; [.22E6.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +FECF ; [.22E6.0020.0017] # ARABIC LETTER GHAIN INITIAL FORM +FED0 ; [.22E6.0020.0018] # ARABIC LETTER GHAIN MEDIAL FORM +FECE ; [.22E6.0020.0019] # ARABIC LETTER GHAIN FINAL FORM +FECD ; [.22E6.0020.001A] # ARABIC LETTER GHAIN ISOLATED FORM +FCBC ; [.22E6.0020.0017][.229D.0020.0017] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FC2B ; [.22E6.0020.001A][.229D.0020.001A] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FCBD ; [.22E6.0020.0017][.2318.0020.0017] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FC2C ; [.22E6.0020.001A][.2318.0020.001A] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FD79 ; [.22E6.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7B ; [.22E6.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7A ; [.22E6.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD15 ; [.22E6.0020.0019][.2339.0020.0019] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FCF9 ; [.22E6.0020.001A][.2339.0020.001A] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FD16 ; [.22E6.0020.0019][.233A.0020.0019] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FCFA ; [.22E6.0020.001A][.233A.0020.001A] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +06A0 ; [.22E7.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS ABOVE +06FC ; [.22E8.0020.0002] # ARABIC LETTER GHAIN WITH DOT BELOW +075D ; [.22E9.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS ABOVE +075E ; [.22EA.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE +075F ; [.22EB.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE +08B3 ; [.22EC.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS BELOW +0641 ; [.22ED.0020.0002] # ARABIC LETTER FEH +1EE10 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL FEH +1EE30 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL INITIAL FEH +1EE70 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL STRETCHED FEH +1EE90 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL LOOPED FEH +1EEB0 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK FEH +FED3 ; [.22ED.0020.0017] # ARABIC LETTER FEH INITIAL FORM +FED4 ; [.22ED.0020.0018] # ARABIC LETTER FEH MEDIAL FORM +FED2 ; [.22ED.0020.0019] # ARABIC LETTER FEH FINAL FORM +FED1 ; [.22ED.0020.001A] # ARABIC LETTER FEH ISOLATED FORM +FCBE ; [.22ED.0020.0017][.229D.0020.0017] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FC2D ; [.22ED.0020.001A][.229D.0020.001A] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FCBF ; [.22ED.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FC2E ; [.22ED.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FCC0 ; [.22ED.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FC2F ; [.22ED.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FD7D ; [.22ED.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7C ; [.22ED.0020.0019][.22A5.0020.0019][.2318.0020.0019] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FCC1 ; [.22ED.0020.0017][.2318.0020.0017] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FC30 ; [.22ED.0020.001A][.2318.0020.001A] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FDC1 ; [.22ED.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FC7C ; [.22ED.0020.0019][.2339.0020.0019] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC31 ; [.22ED.0020.001A][.2339.0020.001A] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC7D ; [.22ED.0020.0019][.233A.0020.0019] # ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC32 ; [.22ED.0020.001A][.233A.0020.001A] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +06A1 ; [.22EE.0020.0002] # ARABIC LETTER DOTLESS FEH +1EE1E ; [.22EE.0020.0005] # ARABIC MATHEMATICAL DOTLESS FEH +1EE7E ; [.22EE.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +06A2 ; [.22EF.0020.0002] # ARABIC LETTER FEH WITH DOT MOVED BELOW +06A3 ; [.22F0.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW +06A4 ; [.22F1.0020.0002] # ARABIC LETTER VEH +FB6C ; [.22F1.0020.0017] # ARABIC LETTER VEH INITIAL FORM +FB6D ; [.22F1.0020.0018] # ARABIC LETTER VEH MEDIAL FORM +FB6B ; [.22F1.0020.0019] # ARABIC LETTER VEH FINAL FORM +FB6A ; [.22F1.0020.001A] # ARABIC LETTER VEH ISOLATED FORM +08A4 ; [.22F2.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE +06A5 ; [.22F3.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS BELOW +06A6 ; [.22F4.0020.0002] # ARABIC LETTER PEHEH +FB70 ; [.22F4.0020.0017] # ARABIC LETTER PEHEH INITIAL FORM +FB71 ; [.22F4.0020.0018] # ARABIC LETTER PEHEH MEDIAL FORM +FB6F ; [.22F4.0020.0019] # ARABIC LETTER PEHEH FINAL FORM +FB6E ; [.22F4.0020.001A] # ARABIC LETTER PEHEH ISOLATED FORM +0760 ; [.22F5.0020.0002] # ARABIC LETTER FEH WITH TWO DOTS BELOW +0761 ; [.22F6.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW +066F ; [.22F7.0020.0002] # ARABIC LETTER DOTLESS QAF +1EE1F ; [.22F7.0020.0005] # ARABIC MATHEMATICAL DOTLESS QAF +1EE5F ; [.22F7.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS QAF +0642 ; [.22F8.0020.0002] # ARABIC LETTER QAF +1EE12 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL QAF +1EE32 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL INITIAL QAF +1EE52 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL TAILED QAF +1EE72 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL STRETCHED QAF +1EE92 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL LOOPED QAF +1EEB2 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK QAF +FED7 ; [.22F8.0020.0017] # ARABIC LETTER QAF INITIAL FORM +FED8 ; [.22F8.0020.0018] # ARABIC LETTER QAF MEDIAL FORM +FED6 ; [.22F8.0020.0019] # ARABIC LETTER QAF FINAL FORM +FED5 ; [.22F8.0020.001A] # ARABIC LETTER QAF ISOLATED FORM +FCC2 ; [.22F8.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FC33 ; [.22F8.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FDF1 ; [.22F8.0020.001A][.2311.0020.001A][.2347.0020.001A] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FCC3 ; [.22F8.0020.0017][.2318.0020.0017] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FC34 ; [.22F8.0020.001A][.2318.0020.001A] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FDB4 ; [.22F8.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FD7E ; [.22F8.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F ; [.22F8.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FDB2 ; [.22F8.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FC7E ; [.22F8.0020.0019][.2339.0020.0019] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC35 ; [.22F8.0020.001A][.2339.0020.001A] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC7F ; [.22F8.0020.0019][.233A.0020.0019] # ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC36 ; [.22F8.0020.001A][.233A.0020.001A] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +06A7 ; [.22F9.0020.0002] # ARABIC LETTER QAF WITH DOT ABOVE +06A8 ; [.22FA.0020.0002] # ARABIC LETTER QAF WITH THREE DOTS ABOVE +08A5 ; [.22FB.0020.0002] # ARABIC LETTER QAF WITH DOT BELOW +0643 ; [.22FC.0020.0002] # ARABIC LETTER KAF +1EE0A ; [.22FC.0020.0005] # ARABIC MATHEMATICAL KAF +1EE2A ; [.22FC.0020.0005] # ARABIC MATHEMATICAL INITIAL KAF +1EE6A ; [.22FC.0020.0005] # ARABIC MATHEMATICAL STRETCHED KAF +FEDB ; [.22FC.0020.0017] # ARABIC LETTER KAF INITIAL FORM +FEDC ; [.22FC.0020.0018] # ARABIC LETTER KAF MEDIAL FORM +FEDA ; [.22FC.0020.0019] # ARABIC LETTER KAF FINAL FORM +FED9 ; [.22FC.0020.001A] # ARABIC LETTER KAF ISOLATED FORM +FC80 ; [.22FC.0020.0019][.2286.0020.0019] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC37 ; [.22FC.0020.001A][.2286.0020.001A] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FCC4 ; [.22FC.0020.0017][.229D.0020.0017] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FC38 ; [.22FC.0020.001A][.229D.0020.001A] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FCC5 ; [.22FC.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FC39 ; [.22FC.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FCC6 ; [.22FC.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FC3A ; [.22FC.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FCC7 ; [.22FC.0020.0017][.2311.0020.0017] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCEB ; [.22FC.0020.0018][.2311.0020.0018] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FC81 ; [.22FC.0020.0019][.2311.0020.0019] # ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC3B ; [.22FC.0020.001A][.2311.0020.001A] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FCC8 ; [.22FC.0020.0017][.2318.0020.0017] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCEC ; [.22FC.0020.0018][.2318.0020.0018] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FC82 ; [.22FC.0020.0019][.2318.0020.0019] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC3C ; [.22FC.0020.001A][.2318.0020.001A] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FDC3 ; [.22FC.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDBB ; [.22FC.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDB7 ; [.22FC.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FC83 ; [.22FC.0020.0019][.2339.0020.0019] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC3D ; [.22FC.0020.001A][.2339.0020.001A] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC84 ; [.22FC.0020.0019][.233A.0020.0019] # ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC3E ; [.22FC.0020.001A][.233A.0020.001A] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +06A9 ; [.22FD.0020.0002] # ARABIC LETTER KEHEH +FB90 ; [.22FD.0020.0017] # ARABIC LETTER KEHEH INITIAL FORM +FB91 ; [.22FD.0020.0018] # ARABIC LETTER KEHEH MEDIAL FORM +FB8F ; [.22FD.0020.0019] # ARABIC LETTER KEHEH FINAL FORM +FB8E ; [.22FD.0020.001A] # ARABIC LETTER KEHEH ISOLATED FORM +06AA ; [.22FE.0020.0002] # ARABIC LETTER SWASH KAF +06AB ; [.22FF.0020.0002] # ARABIC LETTER KAF WITH RING +06AC ; [.2300.0020.0002] # ARABIC LETTER KAF WITH DOT ABOVE +077F ; [.2301.0020.0002] # ARABIC LETTER KAF WITH TWO DOTS ABOVE +06AD ; [.2302.0020.0002] # ARABIC LETTER NG +FBD5 ; [.2302.0020.0017] # ARABIC LETTER NG INITIAL FORM +FBD6 ; [.2302.0020.0018] # ARABIC LETTER NG MEDIAL FORM +FBD4 ; [.2302.0020.0019] # ARABIC LETTER NG FINAL FORM +FBD3 ; [.2302.0020.001A] # ARABIC LETTER NG ISOLATED FORM +06AE ; [.2303.0020.0002] # ARABIC LETTER KAF WITH THREE DOTS BELOW +08B4 ; [.2304.0020.0002] # ARABIC LETTER KAF WITH DOT BELOW +06AF ; [.2305.0020.0002] # ARABIC LETTER GAF +FB94 ; [.2305.0020.0017] # ARABIC LETTER GAF INITIAL FORM +FB95 ; [.2305.0020.0018] # ARABIC LETTER GAF MEDIAL FORM +FB93 ; [.2305.0020.0019] # ARABIC LETTER GAF FINAL FORM +FB92 ; [.2305.0020.001A] # ARABIC LETTER GAF ISOLATED FORM +08B0 ; [.2306.0020.0002] # ARABIC LETTER GAF WITH INVERTED STROKE +06B0 ; [.2307.0020.0002] # ARABIC LETTER GAF WITH RING +06B1 ; [.2308.0020.0002] # ARABIC LETTER NGOEH +FB9C ; [.2308.0020.0017] # ARABIC LETTER NGOEH INITIAL FORM +FB9D ; [.2308.0020.0018] # ARABIC LETTER NGOEH MEDIAL FORM +FB9B ; [.2308.0020.0019] # ARABIC LETTER NGOEH FINAL FORM +FB9A ; [.2308.0020.001A] # ARABIC LETTER NGOEH ISOLATED FORM +06B2 ; [.2309.0020.0002] # ARABIC LETTER GAF WITH TWO DOTS BELOW +06B3 ; [.230A.0020.0002] # ARABIC LETTER GUEH +FB98 ; [.230A.0020.0017] # ARABIC LETTER GUEH INITIAL FORM +FB99 ; [.230A.0020.0018] # ARABIC LETTER GUEH MEDIAL FORM +FB97 ; [.230A.0020.0019] # ARABIC LETTER GUEH FINAL FORM +FB96 ; [.230A.0020.001A] # ARABIC LETTER GUEH ISOLATED FORM +06B4 ; [.230B.0020.0002] # ARABIC LETTER GAF WITH THREE DOTS ABOVE +0762 ; [.230C.0020.0002] # ARABIC LETTER KEHEH WITH DOT ABOVE +063B ; [.230D.0020.0002] # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE +063C ; [.230E.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS BELOW +0763 ; [.230F.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE +0764 ; [.2310.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW +0644 ; [.2311.0020.0002] # ARABIC LETTER LAM +1EE0B ; [.2311.0020.0005] # ARABIC MATHEMATICAL LAM +1EE2B ; [.2311.0020.0005] # ARABIC MATHEMATICAL INITIAL LAM +1EE4B ; [.2311.0020.0005] # ARABIC MATHEMATICAL TAILED LAM +1EE8B ; [.2311.0020.0005] # ARABIC MATHEMATICAL LOOPED LAM +1EEAB ; [.2311.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK LAM +FEDF ; [.2311.0020.0017] # ARABIC LETTER LAM INITIAL FORM +FEE0 ; [.2311.0020.0018] # ARABIC LETTER LAM MEDIAL FORM +FEDE ; [.2311.0020.0019] # ARABIC LETTER LAM FINAL FORM +FEDD ; [.2311.0020.001A] # ARABIC LETTER LAM ISOLATED FORM +FEF6 ; [.2311.0020.0019][.2279.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF5 ; [.2311.0020.001A][.2279.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF8 ; [.2311.0020.0019][.227A.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF7 ; [.2311.0020.001A][.227A.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEFA ; [.2311.0020.0019][.227E.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEF9 ; [.2311.0020.001A][.227E.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFC ; [.2311.0020.0019][.2286.0020.0019] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFB ; [.2311.0020.001A][.2286.0020.001A] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +FCC9 ; [.2311.0020.0017][.229D.0020.0017] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FC3F ; [.2311.0020.001A][.229D.0020.001A] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FD83 ; [.2311.0020.0017][.229D.0020.0017][.229D.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD84 ; [.2311.0020.0019][.229D.0020.0019][.229D.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FDBA ; [.2311.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBC ; [.2311.0020.0019][.229D.0020.0019][.2318.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDAC ; [.2311.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FCCA ; [.2311.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FC40 ; [.2311.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FDB5 ; [.2311.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FD80 ; [.2311.0020.0019][.22A4.0020.0019][.2318.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD82 ; [.2311.0020.0019][.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD81 ; [.2311.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FCCB ; [.2311.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FC41 ; [.2311.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FD86 ; [.2311.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD85 ; [.2311.0020.0019][.22A5.0020.0019][.2318.0020.0019] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FCCC ; [.2311.0020.0017][.2318.0020.0017] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCED ; [.2311.0020.0018][.2318.0020.0018] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FC85 ; [.2311.0020.0019][.2318.0020.0019] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC42 ; [.2311.0020.001A][.2318.0020.001A] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FD88 ; [.2311.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD87 ; [.2311.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FDAD ; [.2311.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FCCD ; [.2311.0020.0017][.2325.0020.0017] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FC86 ; [.2311.0020.0019][.2339.0020.0019] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC43 ; [.2311.0020.001A][.2339.0020.001A] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC87 ; [.2311.0020.0019][.233A.0020.0019] # ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC44 ; [.2311.0020.001A][.233A.0020.001A] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +06B5 ; [.2312.0020.0002] # ARABIC LETTER LAM WITH SMALL V +06B6 ; [.2313.0020.0002] # ARABIC LETTER LAM WITH DOT ABOVE +06B7 ; [.2314.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS ABOVE +06B8 ; [.2315.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS BELOW +076A ; [.2316.0020.0002] # ARABIC LETTER LAM WITH BAR +08A6 ; [.2317.0020.0002] # ARABIC LETTER LAM WITH DOUBLE BAR +0645 ; [.2318.0020.0002] # ARABIC LETTER MEEM +1EE0C ; [.2318.0020.0005] # ARABIC MATHEMATICAL MEEM +1EE2C ; [.2318.0020.0005] # ARABIC MATHEMATICAL INITIAL MEEM +1EE6C ; [.2318.0020.0005] # ARABIC MATHEMATICAL STRETCHED MEEM +1EE8C ; [.2318.0020.0005] # ARABIC MATHEMATICAL LOOPED MEEM +1EEAC ; [.2318.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM +FEE3 ; [.2318.0020.0017] # ARABIC LETTER MEEM INITIAL FORM +FEE4 ; [.2318.0020.0018] # ARABIC LETTER MEEM MEDIAL FORM +FEE2 ; [.2318.0020.0019] # ARABIC LETTER MEEM FINAL FORM +FEE1 ; [.2318.0020.001A] # ARABIC LETTER MEEM ISOLATED FORM +06FE ; [.2318.0020.0004][.0000.010C.0004] # ARABIC SIGN SINDHI POSTPOSITION MEN +FC88 ; [.2318.0020.0019][.2286.0020.0019] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FCCE ; [.2318.0020.0017][.229D.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FC45 ; [.2318.0020.001A][.229D.0020.001A] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FD8C ; [.2318.0020.0017][.229D.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD92 ; [.2318.0020.0017][.229D.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD8D ; [.2318.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FDC0 ; [.2318.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FCCF ; [.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FC46 ; [.2318.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FD89 ; [.2318.0020.0017][.22A4.0020.0017][.229D.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A ; [.2318.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FDF4 ; [.2318.0020.001A][.22A4.0020.001A][.2318.0020.001A][.22AF.0020.001A] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FD8B ; [.2318.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FCD0 ; [.2318.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FC47 ; [.2318.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FD8E ; [.2318.0020.0017][.22A5.0020.0017][.229D.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F ; [.2318.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FDB9 ; [.2318.0020.0019][.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FCD1 ; [.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FC89 ; [.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC48 ; [.2318.0020.001A][.2318.0020.001A] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FDB1 ; [.2318.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FC49 ; [.2318.0020.001A][.2339.0020.001A] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A ; [.2318.0020.001A][.233A.0020.001A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +0765 ; [.2319.0020.0002] # ARABIC LETTER MEEM WITH DOT ABOVE +0766 ; [.231A.0020.0002] # ARABIC LETTER MEEM WITH DOT BELOW +08A7 ; [.231B.0020.0002] # ARABIC LETTER MEEM WITH THREE DOTS ABOVE +0646 ; [.231C.0020.0002] # ARABIC LETTER NOON +1EE0D ; [.231C.0020.0005] # ARABIC MATHEMATICAL NOON +1EE2D ; [.231C.0020.0005] # ARABIC MATHEMATICAL INITIAL NOON +1EE4D ; [.231C.0020.0005] # ARABIC MATHEMATICAL TAILED NOON +1EE6D ; [.231C.0020.0005] # ARABIC MATHEMATICAL STRETCHED NOON +1EE8D ; [.231C.0020.0005] # ARABIC MATHEMATICAL LOOPED NOON +1EEAD ; [.231C.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK NOON +FEE7 ; [.231C.0020.0017] # ARABIC LETTER NOON INITIAL FORM +FEE8 ; [.231C.0020.0018] # ARABIC LETTER NOON MEDIAL FORM +FEE6 ; [.231C.0020.0019] # ARABIC LETTER NOON FINAL FORM +FEE5 ; [.231C.0020.001A] # ARABIC LETTER NOON ISOLATED FORM +FCD2 ; [.231C.0020.0017][.229D.0020.0017] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FC4B ; [.231C.0020.001A][.229D.0020.001A] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FDB8 ; [.231C.0020.0017][.229D.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDBD ; [.231C.0020.0019][.229D.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FD98 ; [.231C.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD97 ; [.231C.0020.0019][.229D.0020.0019][.2318.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD99 ; [.231C.0020.0019][.229D.0020.0019][.2339.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDC7 ; [.231C.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FCD3 ; [.231C.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FC4C ; [.231C.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FD95 ; [.231C.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96 ; [.231C.0020.0019][.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FDB3 ; [.231C.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FCD4 ; [.231C.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FC4D ; [.231C.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC8A ; [.231C.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B ; [.231C.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FCD5 ; [.231C.0020.0017][.2318.0020.0017] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCEE ; [.231C.0020.0018][.2318.0020.0018] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FC8C ; [.231C.0020.0019][.2318.0020.0019] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC4E ; [.231C.0020.001A][.2318.0020.001A] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FD9B ; [.231C.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9A ; [.231C.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FC8D ; [.231C.0020.0019][.231C.0020.0019] # ARABIC LIGATURE NOON WITH NOON FINAL FORM +FCD6 ; [.231C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCEF ; [.231C.0020.0018][.2325.0020.0018] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FC8E ; [.231C.0020.0019][.2339.0020.0019] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC4F ; [.231C.0020.001A][.2339.0020.001A] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC8F ; [.231C.0020.0019][.233A.0020.0019] # ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC50 ; [.231C.0020.001A][.233A.0020.001A] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +06BA ; [.231D.0020.0002] # ARABIC LETTER NOON GHUNNA +1EE1D ; [.231D.0020.0005] # ARABIC MATHEMATICAL DOTLESS NOON +1EE5D ; [.231D.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS NOON +FB9F ; [.231D.0020.0019] # ARABIC LETTER NOON GHUNNA FINAL FORM +FB9E ; [.231D.0020.001A] # ARABIC LETTER NOON GHUNNA ISOLATED FORM +06BB ; [.231E.0020.0002] # ARABIC LETTER RNOON +FBA2 ; [.231E.0020.0017] # ARABIC LETTER RNOON INITIAL FORM +FBA3 ; [.231E.0020.0018] # ARABIC LETTER RNOON MEDIAL FORM +FBA1 ; [.231E.0020.0019] # ARABIC LETTER RNOON FINAL FORM +FBA0 ; [.231E.0020.001A] # ARABIC LETTER RNOON ISOLATED FORM +06BC ; [.231F.0020.0002] # ARABIC LETTER NOON WITH RING +06BD ; [.2320.0020.0002] # ARABIC LETTER NOON WITH THREE DOTS ABOVE +06B9 ; [.2321.0020.0002] # ARABIC LETTER NOON WITH DOT BELOW +0767 ; [.2322.0020.0002] # ARABIC LETTER NOON WITH TWO DOTS BELOW +0768 ; [.2323.0020.0002] # ARABIC LETTER NOON WITH SMALL TAH +0769 ; [.2324.0020.0002] # ARABIC LETTER NOON WITH SMALL V +0647 ; [.2325.0020.0002] # ARABIC LETTER HEH +1EE24 ; [.2325.0020.0005] # ARABIC MATHEMATICAL INITIAL HEH +1EE64 ; [.2325.0020.0005] # ARABIC MATHEMATICAL STRETCHED HEH +1EE84 ; [.2325.0020.0005] # ARABIC MATHEMATICAL LOOPED HEH +FEEB ; [.2325.0020.0017] # ARABIC LETTER HEH INITIAL FORM +FEEC ; [.2325.0020.0018] # ARABIC LETTER HEH MEDIAL FORM +FEEA ; [.2325.0020.0019] # ARABIC LETTER HEH FINAL FORM +FEE9 ; [.2325.0020.001A] # ARABIC LETTER HEH ISOLATED FORM +FCD9 ; [.2325.0020.0017][.0000.0098.0017] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCD7 ; [.2325.0020.0017][.229D.0020.0017] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FC51 ; [.2325.0020.001A][.229D.0020.001A] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FCD8 ; [.2325.0020.0017][.2318.0020.0017] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FC52 ; [.2325.0020.001A][.2318.0020.001A] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FD93 ; [.2325.0020.0017][.2318.0020.0017][.229D.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94 ; [.2325.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FC53 ; [.2325.0020.001A][.2339.0020.001A] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54 ; [.2325.0020.001A][.233A.0020.001A] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +06BE ; [.2326.0020.0002] # ARABIC LETTER HEH DOACHASHMEE +FBAC ; [.2326.0020.0017] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBAD ; [.2326.0020.0018] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAB ; [.2326.0020.0019] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAA ; [.2326.0020.001A] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +06C1 ; [.2327.0020.0002] # ARABIC LETTER HEH GOAL +FBA8 ; [.2327.0020.0017] # ARABIC LETTER HEH GOAL INITIAL FORM +FBA9 ; [.2327.0020.0018] # ARABIC LETTER HEH GOAL MEDIAL FORM +FBA7 ; [.2327.0020.0019] # ARABIC LETTER HEH GOAL FINAL FORM +FBA6 ; [.2327.0020.001A] # ARABIC LETTER HEH GOAL ISOLATED FORM +06C2 ; [.2327.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06C3 ; [.2328.0020.0002] # ARABIC LETTER TEH MARBUTA GOAL +06FF ; [.2329.0020.0002] # ARABIC LETTER HEH WITH INVERTED V +06D5 ; [.232A.0020.0002] # ARABIC LETTER AE +06C0 ; [.232A.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH WITH YEH ABOVE +FBA5 ; [.232A.0020.0019][.0000.0083.0019] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA4 ; [.232A.0020.001A][.0000.0083.001A] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +0648 ; [.232B.0020.0002] # ARABIC LETTER WAW +06E5 ; [.232B.0020.0004] # ARABIC SMALL WAW +1EE05 ; [.232B.0020.0005] # ARABIC MATHEMATICAL WAW +1EE85 ; [.232B.0020.0005] # ARABIC MATHEMATICAL LOOPED WAW +1EEA5 ; [.232B.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK WAW +FEEE ; [.232B.0020.0019] # ARABIC LETTER WAW FINAL FORM +FEED ; [.232B.0020.001A] # ARABIC LETTER WAW ISOLATED FORM +0676 ; [.232B.0020.0004][.2278.0020.0004] # ARABIC LETTER HIGH HAMZA WAW +FDF8 ; [.232B.0020.001A][.22D0.0020.001A][.2311.0020.001A][.2318.0020.001A] # ARABIC LIGATURE WASALLAM ISOLATED FORM +06C4 ; [.232C.0020.0002] # ARABIC LETTER WAW WITH RING +06C5 ; [.232D.0020.0002] # ARABIC LETTER KIRGHIZ OE +FBE1 ; [.232D.0020.0019] # ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE0 ; [.232D.0020.001A] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM +06C6 ; [.232E.0020.0002] # ARABIC LETTER OE +FBDA ; [.232E.0020.0019] # ARABIC LETTER OE FINAL FORM +FBD9 ; [.232E.0020.001A] # ARABIC LETTER OE ISOLATED FORM +06C7 ; [.232F.0020.0002] # ARABIC LETTER U +FBD8 ; [.232F.0020.0019] # ARABIC LETTER U FINAL FORM +FBD7 ; [.232F.0020.001A] # ARABIC LETTER U ISOLATED FORM +0677 ; [.232F.0020.0004][.2278.0020.0004] # ARABIC LETTER U WITH HAMZA ABOVE +FBDD ; [.232F.0020.001A][.2278.0020.001A] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +06C8 ; [.2330.0020.0002] # ARABIC LETTER YU +FBDC ; [.2330.0020.0019] # ARABIC LETTER YU FINAL FORM +FBDB ; [.2330.0020.001A] # ARABIC LETTER YU ISOLATED FORM +06C9 ; [.2331.0020.0002] # ARABIC LETTER KIRGHIZ YU +FBE3 ; [.2331.0020.0019] # ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE2 ; [.2331.0020.001A] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM +06CA ; [.2332.0020.0002] # ARABIC LETTER WAW WITH TWO DOTS ABOVE +06CB ; [.2333.0020.0002] # ARABIC LETTER VE +FBDF ; [.2333.0020.0019] # ARABIC LETTER VE FINAL FORM +FBDE ; [.2333.0020.001A] # ARABIC LETTER VE ISOLATED FORM +08B1 ; [.2334.0020.0002] # ARABIC LETTER STRAIGHT WAW +06CF ; [.2335.0020.0002] # ARABIC LETTER WAW WITH DOT ABOVE +0778 ; [.2336.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0779 ; [.2337.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +08AB ; [.2338.0020.0002] # ARABIC LETTER WAW WITH DOT WITHIN +0649 ; [.2339.0020.0002] # ARABIC LETTER ALEF MAKSURA +FBE8 ; [.2339.0020.0017] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBE9 ; [.2339.0020.0018] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FEF0 ; [.2339.0020.0019] # ARABIC LETTER ALEF MAKSURA FINAL FORM +FEEF ; [.2339.0020.001A] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FC90 ; [.2339.0020.0019][.0000.0098.0019] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC5D ; [.2339.0020.001A][.0000.0098.001A] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +064A ; [.233A.0020.0002] # ARABIC LETTER YEH +06E6 ; [.233A.0020.0004] # ARABIC SMALL YEH +1EE09 ; [.233A.0020.0005] # ARABIC MATHEMATICAL YEH +1EE29 ; [.233A.0020.0005] # ARABIC MATHEMATICAL INITIAL YEH +1EE49 ; [.233A.0020.0005] # ARABIC MATHEMATICAL TAILED YEH +1EE69 ; [.233A.0020.0005] # ARABIC MATHEMATICAL STRETCHED YEH +1EE89 ; [.233A.0020.0005] # ARABIC MATHEMATICAL LOOPED YEH +1EEA9 ; [.233A.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +FEF3 ; [.233A.0020.0017] # ARABIC LETTER YEH INITIAL FORM +FEF4 ; [.233A.0020.0018] # ARABIC LETTER YEH MEDIAL FORM +FEF2 ; [.233A.0020.0019] # ARABIC LETTER YEH FINAL FORM +FEF1 ; [.233A.0020.001A] # ARABIC LETTER YEH ISOLATED FORM +0678 ; [.233A.0020.0004][.2278.0020.0004] # ARABIC LETTER HIGH HAMZA YEH +FCDA ; [.233A.0020.0017][.229D.0020.0017] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FC55 ; [.233A.0020.001A][.229D.0020.001A] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FDAF ; [.233A.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FCDB ; [.233A.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FC56 ; [.233A.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FDAE ; [.233A.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FCDC ; [.233A.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FC57 ; [.233A.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC91 ; [.233A.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92 ; [.233A.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FCDD ; [.233A.0020.0017][.2318.0020.0017] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCF0 ; [.233A.0020.0018][.2318.0020.0018] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FC93 ; [.233A.0020.0019][.2318.0020.0019] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC58 ; [.233A.0020.001A][.2318.0020.001A] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FD9D ; [.233A.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9C ; [.233A.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FDB0 ; [.233A.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FC94 ; [.233A.0020.0019][.231C.0020.0019] # ARABIC LIGATURE YEH WITH NOON FINAL FORM +FCDE ; [.233A.0020.0017][.2325.0020.0017] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCF1 ; [.233A.0020.0018][.2325.0020.0018] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FC95 ; [.233A.0020.0019][.2339.0020.0019] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC59 ; [.233A.0020.001A][.2339.0020.001A] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC96 ; [.233A.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC5A ; [.233A.0020.001A][.233A.0020.001A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +06CC ; [.233B.0020.0002] # ARABIC LETTER FARSI YEH +FBFE ; [.233B.0020.0017] # ARABIC LETTER FARSI YEH INITIAL FORM +FBFF ; [.233B.0020.0018] # ARABIC LETTER FARSI YEH MEDIAL FORM +FBFD ; [.233B.0020.0019] # ARABIC LETTER FARSI YEH FINAL FORM +FBFC ; [.233B.0020.001A] # ARABIC LETTER FARSI YEH ISOLATED FORM +06CD ; [.233C.0020.0002] # ARABIC LETTER YEH WITH TAIL +06CE ; [.233D.0020.0002] # ARABIC LETTER YEH WITH SMALL V +06D0 ; [.233E.0020.0002] # ARABIC LETTER E +FBE6 ; [.233E.0020.0017] # ARABIC LETTER E INITIAL FORM +FBE7 ; [.233E.0020.0018] # ARABIC LETTER E MEDIAL FORM +FBE5 ; [.233E.0020.0019] # ARABIC LETTER E FINAL FORM +FBE4 ; [.233E.0020.001A] # ARABIC LETTER E ISOLATED FORM +06D1 ; [.233F.0020.0002] # ARABIC LETTER YEH WITH THREE DOTS BELOW +063D ; [.2340.0020.0002] # ARABIC LETTER FARSI YEH WITH INVERTED V +063E ; [.2341.0020.0002] # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE +063F ; [.2342.0020.0002] # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0620 ; [.2343.0020.0002] # ARABIC LETTER KASHMIRI YEH +0775 ; [.2344.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0776 ; [.2345.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0777 ; [.2346.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW +06D2 ; [.2347.0020.0002] # ARABIC LETTER YEH BARREE +FBAF ; [.2347.0020.0019] # ARABIC LETTER YEH BARREE FINAL FORM +FBAE ; [.2347.0020.001A] # ARABIC LETTER YEH BARREE ISOLATED FORM +06D3 ; [.2347.0020.0002][.0000.0083.0002] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +FBB1 ; [.2347.0020.0019][.0000.0083.0019] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB0 ; [.2347.0020.001A][.0000.0083.001A] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +077A ; [.2348.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +077B ; [.2349.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0710 ; [.234A.0020.0002] # SYRIAC LETTER ALAPH +0712 ; [.234B.0020.0002] # SYRIAC LETTER BETH +072D ; [.234B.0020.0004][.0000.010D.0004] # SYRIAC LETTER PERSIAN BHETH +0713 ; [.234C.0020.0002] # SYRIAC LETTER GAMAL +0714 ; [.234C.0020.0004][.0000.010C.0004] # SYRIAC LETTER GAMAL GARSHUNI +072E ; [.234C.0020.0004][.0000.010D.0004] # SYRIAC LETTER PERSIAN GHAMAL +0716 ; [.234D.0020.0002] # SYRIAC LETTER DOTLESS DALATH RISH +0715 ; [.234E.0020.0002] # SYRIAC LETTER DALATH +072F ; [.234E.0020.0004][.0000.010D.0004] # SYRIAC LETTER PERSIAN DHALATH +0717 ; [.234F.0020.0002] # SYRIAC LETTER HE +0718 ; [.2350.0020.0002] # SYRIAC LETTER WAW +0719 ; [.2351.0020.0002] # SYRIAC LETTER ZAIN +074D ; [.2352.0020.0002] # SYRIAC LETTER SOGDIAN ZHAIN +071A ; [.2353.0020.0002] # SYRIAC LETTER HETH +071B ; [.2354.0020.0002] # SYRIAC LETTER TETH +071C ; [.2354.0020.0004][.0000.010C.0004] # SYRIAC LETTER TETH GARSHUNI +071D ; [.2355.0020.0002] # SYRIAC LETTER YUDH +071E ; [.2356.0020.0002] # SYRIAC LETTER YUDH HE +071F ; [.2357.0020.0002] # SYRIAC LETTER KAPH +074E ; [.2358.0020.0002] # SYRIAC LETTER SOGDIAN KHAPH +0720 ; [.2359.0020.0002] # SYRIAC LETTER LAMADH +0721 ; [.235A.0020.0002] # SYRIAC LETTER MIM +0722 ; [.235B.0020.0002] # SYRIAC LETTER NUN +0723 ; [.235C.0020.0002] # SYRIAC LETTER SEMKATH +0724 ; [.235C.0020.0019] # SYRIAC LETTER FINAL SEMKATH +0725 ; [.235D.0020.0002] # SYRIAC LETTER E +0726 ; [.235E.0020.0002] # SYRIAC LETTER PE +0727 ; [.235E.0020.0004][.0000.010C.0004] # SYRIAC LETTER REVERSED PE +074F ; [.235F.0020.0002] # SYRIAC LETTER SOGDIAN FE +0728 ; [.2360.0020.0002] # SYRIAC LETTER SADHE +0729 ; [.2361.0020.0002] # SYRIAC LETTER QAPH +072A ; [.2362.0020.0002] # SYRIAC LETTER RISH +072B ; [.2363.0020.0002] # SYRIAC LETTER SHIN +072C ; [.2364.0020.0002] # SYRIAC LETTER TAW +0840 ; [.2365.0020.0002] # MANDAIC LETTER HALQA +0841 ; [.2366.0020.0002] # MANDAIC LETTER AB +0842 ; [.2367.0020.0002] # MANDAIC LETTER AG +0843 ; [.2368.0020.0002] # MANDAIC LETTER AD +0844 ; [.2369.0020.0002] # MANDAIC LETTER AH +0845 ; [.236A.0020.0002] # MANDAIC LETTER USHENNA +0846 ; [.236B.0020.0002] # MANDAIC LETTER AZ +0847 ; [.236C.0020.0002] # MANDAIC LETTER IT +0848 ; [.236D.0020.0002] # MANDAIC LETTER ATT +0849 ; [.236E.0020.0002] # MANDAIC LETTER AKSA +084A ; [.236F.0020.0002] # MANDAIC LETTER AK +084B ; [.2370.0020.0002] # MANDAIC LETTER AL +084C ; [.2371.0020.0002] # MANDAIC LETTER AM +084D ; [.2372.0020.0002] # MANDAIC LETTER AN +084E ; [.2373.0020.0002] # MANDAIC LETTER AS +084F ; [.2374.0020.0002] # MANDAIC LETTER IN +0850 ; [.2375.0020.0002] # MANDAIC LETTER AP +0851 ; [.2376.0020.0002] # MANDAIC LETTER ASZ +0852 ; [.2377.0020.0002] # MANDAIC LETTER AQ +0853 ; [.2378.0020.0002] # MANDAIC LETTER AR +0854 ; [.2379.0020.0002] # MANDAIC LETTER ASH +0855 ; [.237A.0020.0002] # MANDAIC LETTER AT +0856 ; [.237B.0020.0002] # MANDAIC LETTER DUSHENNA +0857 ; [.237C.0020.0002] # MANDAIC LETTER KAD +0858 ; [.237D.0020.0002] # MANDAIC LETTER AIN +0780 ; [.237E.0020.0002] # THAANA LETTER HAA +0799 ; [.237F.0020.0002] # THAANA LETTER HHAA +079A ; [.2380.0020.0002] # THAANA LETTER KHAA +0781 ; [.2381.0020.0002] # THAANA LETTER SHAVIYANI +0782 ; [.2382.0020.0002] # THAANA LETTER NOONU +0783 ; [.2383.0020.0002] # THAANA LETTER RAA +079C ; [.2384.0020.0002] # THAANA LETTER ZAA +0784 ; [.2385.0020.0002] # THAANA LETTER BAA +0785 ; [.2386.0020.0002] # THAANA LETTER LHAVIYANI +0786 ; [.2387.0020.0002] # THAANA LETTER KAAFU +0787 ; [.2388.0020.0002] # THAANA LETTER ALIFU +07A2 ; [.2389.0020.0002] # THAANA LETTER AINU +07A3 ; [.238A.0020.0002] # THAANA LETTER GHAINU +0788 ; [.238B.0020.0002] # THAANA LETTER VAAVU +07A5 ; [.238C.0020.0002] # THAANA LETTER WAAVU +0789 ; [.238D.0020.0002] # THAANA LETTER MEEMU +078A ; [.238E.0020.0002] # THAANA LETTER FAAFU +078B ; [.238F.0020.0002] # THAANA LETTER DHAALU +079B ; [.2390.0020.0002] # THAANA LETTER THAALU +078C ; [.2391.0020.0002] # THAANA LETTER THAA +0798 ; [.2392.0020.0002] # THAANA LETTER TTAA +07A0 ; [.2393.0020.0002] # THAANA LETTER TO +07A1 ; [.2394.0020.0002] # THAANA LETTER ZO +078D ; [.2395.0020.0002] # THAANA LETTER LAAMU +078E ; [.2396.0020.0002] # THAANA LETTER GAAFU +07A4 ; [.2397.0020.0002] # THAANA LETTER QAAFU +078F ; [.2398.0020.0002] # THAANA LETTER GNAVIYANI +0790 ; [.2399.0020.0002] # THAANA LETTER SEENU +079D ; [.239A.0020.0002] # THAANA LETTER SHEENU +079E ; [.239B.0020.0002] # THAANA LETTER SAADHU +079F ; [.239C.0020.0002] # THAANA LETTER DAADHU +0791 ; [.239D.0020.0002] # THAANA LETTER DAVIYANI +0792 ; [.239E.0020.0002] # THAANA LETTER ZAVIYANI +0793 ; [.239F.0020.0002] # THAANA LETTER TAVIYANI +0794 ; [.23A0.0020.0002] # THAANA LETTER YAA +0795 ; [.23A1.0020.0002] # THAANA LETTER PAVIYANI +0796 ; [.23A2.0020.0002] # THAANA LETTER JAVIYANI +0797 ; [.23A3.0020.0002] # THAANA LETTER CHAVIYANI +07B1 ; [.23A4.0020.0002] # THAANA LETTER NAA +07A6 ; [.23A5.0020.0002] # THAANA ABAFILI +07A7 ; [.23A6.0020.0002] # THAANA AABAAFILI +07A8 ; [.23A7.0020.0002] # THAANA IBIFILI +07A9 ; [.23A8.0020.0002] # THAANA EEBEEFILI +07AA ; [.23A9.0020.0002] # THAANA UBUFILI +07AB ; [.23AA.0020.0002] # THAANA OOBOOFILI +07AC ; [.23AB.0020.0002] # THAANA EBEFILI +07AD ; [.23AC.0020.0002] # THAANA EYBEYFILI +07AE ; [.23AD.0020.0002] # THAANA OBOFILI +07AF ; [.23AE.0020.0002] # THAANA OABOAFILI +07B0 ; [.23AF.0020.0002] # THAANA SUKUN +07CA ; [.23B0.0020.0002] # NKO LETTER A +07CB ; [.23B1.0020.0002] # NKO LETTER EE +07CC ; [.23B2.0020.0002] # NKO LETTER I +07CD ; [.23B3.0020.0002] # NKO LETTER E +07CE ; [.23B4.0020.0002] # NKO LETTER U +07CF ; [.23B5.0020.0002] # NKO LETTER OO +07D0 ; [.23B6.0020.0002] # NKO LETTER O +07D1 ; [.23B7.0020.0002] # NKO LETTER DAGBASINNA +07D2 ; [.23B8.0020.0002] # NKO LETTER N +07D3 ; [.23B9.0020.0002] # NKO LETTER BA +07D4 ; [.23BA.0020.0002] # NKO LETTER PA +07D5 ; [.23BB.0020.0002] # NKO LETTER TA +07D6 ; [.23BC.0020.0002] # NKO LETTER JA +07E8 ; [.23BC.0020.0004][.0000.010B.0004] # NKO LETTER JONA JA +07D7 ; [.23BD.0020.0002] # NKO LETTER CHA +07E9 ; [.23BD.0020.0004][.0000.010B.0004] # NKO LETTER JONA CHA +07D8 ; [.23BE.0020.0002] # NKO LETTER DA +07D9 ; [.23BF.0020.0002] # NKO LETTER RA +07EA ; [.23BF.0020.0004][.0000.010B.0004] # NKO LETTER JONA RA +07DA ; [.23C0.0020.0002] # NKO LETTER RRA +07DB ; [.23C1.0020.0002] # NKO LETTER SA +07DC ; [.23C2.0020.0002] # NKO LETTER GBA +07DD ; [.23C3.0020.0002] # NKO LETTER FA +07DE ; [.23C4.0020.0002] # NKO LETTER KA +07DF ; [.23C5.0020.0002] # NKO LETTER LA +07E0 ; [.23C6.0020.0002] # NKO LETTER NA WOLOSO +07E1 ; [.23C7.0020.0002] # NKO LETTER MA +07E2 ; [.23C8.0020.0002] # NKO LETTER NYA +07E3 ; [.23C9.0020.0002] # NKO LETTER NA +07E4 ; [.23CA.0020.0002] # NKO LETTER HA +07E5 ; [.23CB.0020.0002] # NKO LETTER WA +07E6 ; [.23CC.0020.0002] # NKO LETTER YA +07E7 ; [.23CD.0020.0002] # NKO LETTER NYA WOLOSO +07F4 ; [.23CE.0020.0002] # NKO HIGH TONE APOSTROPHE +07F5 ; [.23CF.0020.0002] # NKO LOW TONE APOSTROPHE +2D30 ; [.23D0.0020.0002] # TIFINAGH LETTER YA +2D31 ; [.23D1.0020.0002] # TIFINAGH LETTER YAB +2D32 ; [.23D2.0020.0002] # TIFINAGH LETTER YABH +2D33 ; [.23D3.0020.0002] # TIFINAGH LETTER YAG +2D34 ; [.23D4.0020.0002] # TIFINAGH LETTER YAGHH +2D35 ; [.23D5.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAJ +2D36 ; [.23D6.0020.0002] # TIFINAGH LETTER YAJ +2D37 ; [.23D7.0020.0002] # TIFINAGH LETTER YAD +2D38 ; [.23D8.0020.0002] # TIFINAGH LETTER YADH +2D39 ; [.23D9.0020.0002] # TIFINAGH LETTER YADD +2D3A ; [.23DA.0020.0002] # TIFINAGH LETTER YADDH +2D3B ; [.23DB.0020.0002] # TIFINAGH LETTER YEY +2D66 ; [.23DC.0020.0002] # TIFINAGH LETTER YE +2D3C ; [.23DD.0020.0002] # TIFINAGH LETTER YAF +2D3D ; [.23DE.0020.0002] # TIFINAGH LETTER YAK +2D3E ; [.23DF.0020.0002] # TIFINAGH LETTER TUAREG YAK +2D3F ; [.23E0.0020.0002] # TIFINAGH LETTER YAKHH +2D40 ; [.23E1.0020.0002] # TIFINAGH LETTER YAH +2D41 ; [.23E2.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAH +2D42 ; [.23E3.0020.0002] # TIFINAGH LETTER TUAREG YAH +2D43 ; [.23E4.0020.0002] # TIFINAGH LETTER YAHH +2D44 ; [.23E5.0020.0002] # TIFINAGH LETTER YAA +2D45 ; [.23E6.0020.0002] # TIFINAGH LETTER YAKH +2D46 ; [.23E7.0020.0002] # TIFINAGH LETTER TUAREG YAKH +2D47 ; [.23E8.0020.0002] # TIFINAGH LETTER YAQ +2D48 ; [.23E9.0020.0002] # TIFINAGH LETTER TUAREG YAQ +2D49 ; [.23EA.0020.0002] # TIFINAGH LETTER YI +2D4A ; [.23EB.0020.0002] # TIFINAGH LETTER YAZH +2D4B ; [.23EC.0020.0002] # TIFINAGH LETTER AHAGGAR YAZH +2D4C ; [.23ED.0020.0002] # TIFINAGH LETTER TUAREG YAZH +2D4D ; [.23EE.0020.0002] # TIFINAGH LETTER YAL +2D4E ; [.23EF.0020.0002] # TIFINAGH LETTER YAM +2D4F ; [.23F0.0020.0002] # TIFINAGH LETTER YAN +2D50 ; [.23F1.0020.0002] # TIFINAGH LETTER TUAREG YAGN +2D51 ; [.23F2.0020.0002] # TIFINAGH LETTER TUAREG YANG +2D52 ; [.23F3.0020.0002] # TIFINAGH LETTER YAP +2D53 ; [.23F4.0020.0002] # TIFINAGH LETTER YU +2D67 ; [.23F5.0020.0002] # TIFINAGH LETTER YO +2D54 ; [.23F6.0020.0002] # TIFINAGH LETTER YAR +2D55 ; [.23F7.0020.0002] # TIFINAGH LETTER YARR +2D56 ; [.23F8.0020.0002] # TIFINAGH LETTER YAGH +2D57 ; [.23F9.0020.0002] # TIFINAGH LETTER TUAREG YAGH +2D58 ; [.23FA.0020.0002] # TIFINAGH LETTER AYER YAGH +2D59 ; [.23FB.0020.0002] # TIFINAGH LETTER YAS +2D5A ; [.23FC.0020.0002] # TIFINAGH LETTER YASS +2D5B ; [.23FD.0020.0002] # TIFINAGH LETTER YASH +2D5C ; [.23FE.0020.0002] # TIFINAGH LETTER YAT +2D5D ; [.23FF.0020.0002] # TIFINAGH LETTER YATH +2D5E ; [.2400.0020.0002] # TIFINAGH LETTER YACH +2D5F ; [.2401.0020.0002] # TIFINAGH LETTER YATT +2D60 ; [.2402.0020.0002] # TIFINAGH LETTER YAV +2D61 ; [.2403.0020.0002] # TIFINAGH LETTER YAW +2D62 ; [.2404.0020.0002] # TIFINAGH LETTER YAY +2D63 ; [.2405.0020.0002] # TIFINAGH LETTER YAZ +2D64 ; [.2406.0020.0002] # TIFINAGH LETTER TAWELLEMET YAZ +2D65 ; [.2407.0020.0002] # TIFINAGH LETTER YAZZ +2D6F ; [.2408.0020.0002] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK +1200 ; [.2409.0020.0002] # ETHIOPIC SYLLABLE HA +1201 ; [.240A.0020.0002] # ETHIOPIC SYLLABLE HU +1202 ; [.240B.0020.0002] # ETHIOPIC SYLLABLE HI +1203 ; [.240C.0020.0002] # ETHIOPIC SYLLABLE HAA +1204 ; [.240D.0020.0002] # ETHIOPIC SYLLABLE HEE +1205 ; [.240E.0020.0002] # ETHIOPIC SYLLABLE HE +1206 ; [.240F.0020.0002] # ETHIOPIC SYLLABLE HO +1207 ; [.2410.0020.0002] # ETHIOPIC SYLLABLE HOA +1208 ; [.2411.0020.0002] # ETHIOPIC SYLLABLE LA +1209 ; [.2412.0020.0002] # ETHIOPIC SYLLABLE LU +120A ; [.2413.0020.0002] # ETHIOPIC SYLLABLE LI +120B ; [.2414.0020.0002] # ETHIOPIC SYLLABLE LAA +120C ; [.2415.0020.0002] # ETHIOPIC SYLLABLE LEE +120D ; [.2416.0020.0002] # ETHIOPIC SYLLABLE LE +120E ; [.2417.0020.0002] # ETHIOPIC SYLLABLE LO +120F ; [.2418.0020.0002] # ETHIOPIC SYLLABLE LWA +2D80 ; [.2419.0020.0002] # ETHIOPIC SYLLABLE LOA +1210 ; [.241A.0020.0002] # ETHIOPIC SYLLABLE HHA +1211 ; [.241B.0020.0002] # ETHIOPIC SYLLABLE HHU +1212 ; [.241C.0020.0002] # ETHIOPIC SYLLABLE HHI +1213 ; [.241D.0020.0002] # ETHIOPIC SYLLABLE HHAA +1214 ; [.241E.0020.0002] # ETHIOPIC SYLLABLE HHEE +1215 ; [.241F.0020.0002] # ETHIOPIC SYLLABLE HHE +1216 ; [.2420.0020.0002] # ETHIOPIC SYLLABLE HHO +1217 ; [.2421.0020.0002] # ETHIOPIC SYLLABLE HHWA +1218 ; [.2422.0020.0002] # ETHIOPIC SYLLABLE MA +1219 ; [.2423.0020.0002] # ETHIOPIC SYLLABLE MU +121A ; [.2424.0020.0002] # ETHIOPIC SYLLABLE MI +121B ; [.2425.0020.0002] # ETHIOPIC SYLLABLE MAA +121C ; [.2426.0020.0002] # ETHIOPIC SYLLABLE MEE +121D ; [.2427.0020.0002] # ETHIOPIC SYLLABLE ME +121E ; [.2428.0020.0002] # ETHIOPIC SYLLABLE MO +121F ; [.2429.0020.0002] # ETHIOPIC SYLLABLE MWA +1380 ; [.242A.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT MWA +1381 ; [.242B.0020.0002] # ETHIOPIC SYLLABLE MWI +1382 ; [.242C.0020.0002] # ETHIOPIC SYLLABLE MWEE +1383 ; [.242D.0020.0002] # ETHIOPIC SYLLABLE MWE +2D81 ; [.242E.0020.0002] # ETHIOPIC SYLLABLE MOA +1220 ; [.242F.0020.0002] # ETHIOPIC SYLLABLE SZA +1221 ; [.2430.0020.0002] # ETHIOPIC SYLLABLE SZU +1222 ; [.2431.0020.0002] # ETHIOPIC SYLLABLE SZI +1223 ; [.2432.0020.0002] # ETHIOPIC SYLLABLE SZAA +1224 ; [.2433.0020.0002] # ETHIOPIC SYLLABLE SZEE +1225 ; [.2434.0020.0002] # ETHIOPIC SYLLABLE SZE +1226 ; [.2435.0020.0002] # ETHIOPIC SYLLABLE SZO +1227 ; [.2436.0020.0002] # ETHIOPIC SYLLABLE SZWA +1228 ; [.2437.0020.0002] # ETHIOPIC SYLLABLE RA +1229 ; [.2438.0020.0002] # ETHIOPIC SYLLABLE RU +122A ; [.2439.0020.0002] # ETHIOPIC SYLLABLE RI +122B ; [.243A.0020.0002] # ETHIOPIC SYLLABLE RAA +122C ; [.243B.0020.0002] # ETHIOPIC SYLLABLE REE +122D ; [.243C.0020.0002] # ETHIOPIC SYLLABLE RE +122E ; [.243D.0020.0002] # ETHIOPIC SYLLABLE RO +122F ; [.243E.0020.0002] # ETHIOPIC SYLLABLE RWA +2D82 ; [.243F.0020.0002] # ETHIOPIC SYLLABLE ROA +1230 ; [.2440.0020.0002] # ETHIOPIC SYLLABLE SA +1231 ; [.2441.0020.0002] # ETHIOPIC SYLLABLE SU +1232 ; [.2442.0020.0002] # ETHIOPIC SYLLABLE SI +1233 ; [.2443.0020.0002] # ETHIOPIC SYLLABLE SAA +1234 ; [.2444.0020.0002] # ETHIOPIC SYLLABLE SEE +1235 ; [.2445.0020.0002] # ETHIOPIC SYLLABLE SE +1236 ; [.2446.0020.0002] # ETHIOPIC SYLLABLE SO +1237 ; [.2447.0020.0002] # ETHIOPIC SYLLABLE SWA +2D83 ; [.2448.0020.0002] # ETHIOPIC SYLLABLE SOA +AB01 ; [.2449.0020.0002] # ETHIOPIC SYLLABLE TTHU +AB02 ; [.244A.0020.0002] # ETHIOPIC SYLLABLE TTHI +AB03 ; [.244B.0020.0002] # ETHIOPIC SYLLABLE TTHAA +AB04 ; [.244C.0020.0002] # ETHIOPIC SYLLABLE TTHEE +AB05 ; [.244D.0020.0002] # ETHIOPIC SYLLABLE TTHE +AB06 ; [.244E.0020.0002] # ETHIOPIC SYLLABLE TTHO +1238 ; [.244F.0020.0002] # ETHIOPIC SYLLABLE SHA +1239 ; [.2450.0020.0002] # ETHIOPIC SYLLABLE SHU +123A ; [.2451.0020.0002] # ETHIOPIC SYLLABLE SHI +123B ; [.2452.0020.0002] # ETHIOPIC SYLLABLE SHAA +123C ; [.2453.0020.0002] # ETHIOPIC SYLLABLE SHEE +123D ; [.2454.0020.0002] # ETHIOPIC SYLLABLE SHE +123E ; [.2455.0020.0002] # ETHIOPIC SYLLABLE SHO +123F ; [.2456.0020.0002] # ETHIOPIC SYLLABLE SHWA +2D84 ; [.2457.0020.0002] # ETHIOPIC SYLLABLE SHOA +1240 ; [.2458.0020.0002] # ETHIOPIC SYLLABLE QA +1241 ; [.2459.0020.0002] # ETHIOPIC SYLLABLE QU +1242 ; [.245A.0020.0002] # ETHIOPIC SYLLABLE QI +1243 ; [.245B.0020.0002] # ETHIOPIC SYLLABLE QAA +1244 ; [.245C.0020.0002] # ETHIOPIC SYLLABLE QEE +1245 ; [.245D.0020.0002] # ETHIOPIC SYLLABLE QE +1246 ; [.245E.0020.0002] # ETHIOPIC SYLLABLE QO +1247 ; [.245F.0020.0002] # ETHIOPIC SYLLABLE QOA +1248 ; [.2460.0020.0002] # ETHIOPIC SYLLABLE QWA +124A ; [.2461.0020.0002] # ETHIOPIC SYLLABLE QWI +124B ; [.2462.0020.0002] # ETHIOPIC SYLLABLE QWAA +124C ; [.2463.0020.0002] # ETHIOPIC SYLLABLE QWEE +124D ; [.2464.0020.0002] # ETHIOPIC SYLLABLE QWE +1250 ; [.2465.0020.0002] # ETHIOPIC SYLLABLE QHA +1251 ; [.2466.0020.0002] # ETHIOPIC SYLLABLE QHU +1252 ; [.2467.0020.0002] # ETHIOPIC SYLLABLE QHI +1253 ; [.2468.0020.0002] # ETHIOPIC SYLLABLE QHAA +1254 ; [.2469.0020.0002] # ETHIOPIC SYLLABLE QHEE +1255 ; [.246A.0020.0002] # ETHIOPIC SYLLABLE QHE +1256 ; [.246B.0020.0002] # ETHIOPIC SYLLABLE QHO +1258 ; [.246C.0020.0002] # ETHIOPIC SYLLABLE QHWA +125A ; [.246D.0020.0002] # ETHIOPIC SYLLABLE QHWI +125B ; [.246E.0020.0002] # ETHIOPIC SYLLABLE QHWAA +125C ; [.246F.0020.0002] # ETHIOPIC SYLLABLE QHWEE +125D ; [.2470.0020.0002] # ETHIOPIC SYLLABLE QHWE +1260 ; [.2471.0020.0002] # ETHIOPIC SYLLABLE BA +1261 ; [.2472.0020.0002] # ETHIOPIC SYLLABLE BU +1262 ; [.2473.0020.0002] # ETHIOPIC SYLLABLE BI +1263 ; [.2474.0020.0002] # ETHIOPIC SYLLABLE BAA +1264 ; [.2475.0020.0002] # ETHIOPIC SYLLABLE BEE +1265 ; [.2476.0020.0002] # ETHIOPIC SYLLABLE BE +1266 ; [.2477.0020.0002] # ETHIOPIC SYLLABLE BO +1267 ; [.2478.0020.0002] # ETHIOPIC SYLLABLE BWA +1384 ; [.2479.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT BWA +1385 ; [.247A.0020.0002] # ETHIOPIC SYLLABLE BWI +1386 ; [.247B.0020.0002] # ETHIOPIC SYLLABLE BWEE +1387 ; [.247C.0020.0002] # ETHIOPIC SYLLABLE BWE +2D85 ; [.247D.0020.0002] # ETHIOPIC SYLLABLE BOA +1268 ; [.247E.0020.0002] # ETHIOPIC SYLLABLE VA +1269 ; [.247F.0020.0002] # ETHIOPIC SYLLABLE VU +126A ; [.2480.0020.0002] # ETHIOPIC SYLLABLE VI +126B ; [.2481.0020.0002] # ETHIOPIC SYLLABLE VAA +126C ; [.2482.0020.0002] # ETHIOPIC SYLLABLE VEE +126D ; [.2483.0020.0002] # ETHIOPIC SYLLABLE VE +126E ; [.2484.0020.0002] # ETHIOPIC SYLLABLE VO +126F ; [.2485.0020.0002] # ETHIOPIC SYLLABLE VWA +1270 ; [.2486.0020.0002] # ETHIOPIC SYLLABLE TA +1271 ; [.2487.0020.0002] # ETHIOPIC SYLLABLE TU +1272 ; [.2488.0020.0002] # ETHIOPIC SYLLABLE TI +1273 ; [.2489.0020.0002] # ETHIOPIC SYLLABLE TAA +1274 ; [.248A.0020.0002] # ETHIOPIC SYLLABLE TEE +1275 ; [.248B.0020.0002] # ETHIOPIC SYLLABLE TE +1276 ; [.248C.0020.0002] # ETHIOPIC SYLLABLE TO +1277 ; [.248D.0020.0002] # ETHIOPIC SYLLABLE TWA +2D86 ; [.248E.0020.0002] # ETHIOPIC SYLLABLE TOA +1278 ; [.248F.0020.0002] # ETHIOPIC SYLLABLE CA +1279 ; [.2490.0020.0002] # ETHIOPIC SYLLABLE CU +127A ; [.2491.0020.0002] # ETHIOPIC SYLLABLE CI +127B ; [.2492.0020.0002] # ETHIOPIC SYLLABLE CAA +127C ; [.2493.0020.0002] # ETHIOPIC SYLLABLE CEE +127D ; [.2494.0020.0002] # ETHIOPIC SYLLABLE CE +127E ; [.2495.0020.0002] # ETHIOPIC SYLLABLE CO +127F ; [.2496.0020.0002] # ETHIOPIC SYLLABLE CWA +2D87 ; [.2497.0020.0002] # ETHIOPIC SYLLABLE COA +1280 ; [.2498.0020.0002] # ETHIOPIC SYLLABLE XA +1281 ; [.2499.0020.0002] # ETHIOPIC SYLLABLE XU +1282 ; [.249A.0020.0002] # ETHIOPIC SYLLABLE XI +1283 ; [.249B.0020.0002] # ETHIOPIC SYLLABLE XAA +1284 ; [.249C.0020.0002] # ETHIOPIC SYLLABLE XEE +1285 ; [.249D.0020.0002] # ETHIOPIC SYLLABLE XE +1286 ; [.249E.0020.0002] # ETHIOPIC SYLLABLE XO +1287 ; [.249F.0020.0002] # ETHIOPIC SYLLABLE XOA +1288 ; [.24A0.0020.0002] # ETHIOPIC SYLLABLE XWA +128A ; [.24A1.0020.0002] # ETHIOPIC SYLLABLE XWI +128B ; [.24A2.0020.0002] # ETHIOPIC SYLLABLE XWAA +128C ; [.24A3.0020.0002] # ETHIOPIC SYLLABLE XWEE +128D ; [.24A4.0020.0002] # ETHIOPIC SYLLABLE XWE +1290 ; [.24A5.0020.0002] # ETHIOPIC SYLLABLE NA +1291 ; [.24A6.0020.0002] # ETHIOPIC SYLLABLE NU +1292 ; [.24A7.0020.0002] # ETHIOPIC SYLLABLE NI +1293 ; [.24A8.0020.0002] # ETHIOPIC SYLLABLE NAA +1294 ; [.24A9.0020.0002] # ETHIOPIC SYLLABLE NEE +1295 ; [.24AA.0020.0002] # ETHIOPIC SYLLABLE NE +1296 ; [.24AB.0020.0002] # ETHIOPIC SYLLABLE NO +1297 ; [.24AC.0020.0002] # ETHIOPIC SYLLABLE NWA +2D88 ; [.24AD.0020.0002] # ETHIOPIC SYLLABLE NOA +1298 ; [.24AE.0020.0002] # ETHIOPIC SYLLABLE NYA +1299 ; [.24AF.0020.0002] # ETHIOPIC SYLLABLE NYU +129A ; [.24B0.0020.0002] # ETHIOPIC SYLLABLE NYI +129B ; [.24B1.0020.0002] # ETHIOPIC SYLLABLE NYAA +129C ; [.24B2.0020.0002] # ETHIOPIC SYLLABLE NYEE +129D ; [.24B3.0020.0002] # ETHIOPIC SYLLABLE NYE +129E ; [.24B4.0020.0002] # ETHIOPIC SYLLABLE NYO +129F ; [.24B5.0020.0002] # ETHIOPIC SYLLABLE NYWA +2D89 ; [.24B6.0020.0002] # ETHIOPIC SYLLABLE NYOA +12A0 ; [.24B7.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL A +12A1 ; [.24B8.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL U +12A2 ; [.24B9.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL I +12A3 ; [.24BA.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL AA +12A4 ; [.24BB.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL EE +12A5 ; [.24BC.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL E +12A6 ; [.24BD.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL O +12A7 ; [.24BE.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL WA +2D8A ; [.24BF.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL OA +12A8 ; [.24C0.0020.0002] # ETHIOPIC SYLLABLE KA +12A9 ; [.24C1.0020.0002] # ETHIOPIC SYLLABLE KU +12AA ; [.24C2.0020.0002] # ETHIOPIC SYLLABLE KI +12AB ; [.24C3.0020.0002] # ETHIOPIC SYLLABLE KAA +12AC ; [.24C4.0020.0002] # ETHIOPIC SYLLABLE KEE +12AD ; [.24C5.0020.0002] # ETHIOPIC SYLLABLE KE +12AE ; [.24C6.0020.0002] # ETHIOPIC SYLLABLE KO +12AF ; [.24C7.0020.0002] # ETHIOPIC SYLLABLE KOA +12B0 ; [.24C8.0020.0002] # ETHIOPIC SYLLABLE KWA +12B2 ; [.24C9.0020.0002] # ETHIOPIC SYLLABLE KWI +12B3 ; [.24CA.0020.0002] # ETHIOPIC SYLLABLE KWAA +12B4 ; [.24CB.0020.0002] # ETHIOPIC SYLLABLE KWEE +12B5 ; [.24CC.0020.0002] # ETHIOPIC SYLLABLE KWE +12B8 ; [.24CD.0020.0002] # ETHIOPIC SYLLABLE KXA +12B9 ; [.24CE.0020.0002] # ETHIOPIC SYLLABLE KXU +12BA ; [.24CF.0020.0002] # ETHIOPIC SYLLABLE KXI +12BB ; [.24D0.0020.0002] # ETHIOPIC SYLLABLE KXAA +12BC ; [.24D1.0020.0002] # ETHIOPIC SYLLABLE KXEE +12BD ; [.24D2.0020.0002] # ETHIOPIC SYLLABLE KXE +12BE ; [.24D3.0020.0002] # ETHIOPIC SYLLABLE KXO +12C0 ; [.24D4.0020.0002] # ETHIOPIC SYLLABLE KXWA +12C2 ; [.24D5.0020.0002] # ETHIOPIC SYLLABLE KXWI +12C3 ; [.24D6.0020.0002] # ETHIOPIC SYLLABLE KXWAA +12C4 ; [.24D7.0020.0002] # ETHIOPIC SYLLABLE KXWEE +12C5 ; [.24D8.0020.0002] # ETHIOPIC SYLLABLE KXWE +12C8 ; [.24D9.0020.0002] # ETHIOPIC SYLLABLE WA +12C9 ; [.24DA.0020.0002] # ETHIOPIC SYLLABLE WU +12CA ; [.24DB.0020.0002] # ETHIOPIC SYLLABLE WI +12CB ; [.24DC.0020.0002] # ETHIOPIC SYLLABLE WAA +12CC ; [.24DD.0020.0002] # ETHIOPIC SYLLABLE WEE +12CD ; [.24DE.0020.0002] # ETHIOPIC SYLLABLE WE +12CE ; [.24DF.0020.0002] # ETHIOPIC SYLLABLE WO +12CF ; [.24E0.0020.0002] # ETHIOPIC SYLLABLE WOA +12D0 ; [.24E1.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL A +12D1 ; [.24E2.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL U +12D2 ; [.24E3.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL I +12D3 ; [.24E4.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL AA +12D4 ; [.24E5.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL EE +12D5 ; [.24E6.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL E +12D6 ; [.24E7.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL O +12D8 ; [.24E8.0020.0002] # ETHIOPIC SYLLABLE ZA +12D9 ; [.24E9.0020.0002] # ETHIOPIC SYLLABLE ZU +12DA ; [.24EA.0020.0002] # ETHIOPIC SYLLABLE ZI +12DB ; [.24EB.0020.0002] # ETHIOPIC SYLLABLE ZAA +12DC ; [.24EC.0020.0002] # ETHIOPIC SYLLABLE ZEE +12DD ; [.24ED.0020.0002] # ETHIOPIC SYLLABLE ZE +12DE ; [.24EE.0020.0002] # ETHIOPIC SYLLABLE ZO +12DF ; [.24EF.0020.0002] # ETHIOPIC SYLLABLE ZWA +2D8B ; [.24F0.0020.0002] # ETHIOPIC SYLLABLE ZOA +AB11 ; [.24F1.0020.0002] # ETHIOPIC SYLLABLE DZU +AB12 ; [.24F2.0020.0002] # ETHIOPIC SYLLABLE DZI +AB13 ; [.24F3.0020.0002] # ETHIOPIC SYLLABLE DZAA +AB14 ; [.24F4.0020.0002] # ETHIOPIC SYLLABLE DZEE +AB15 ; [.24F5.0020.0002] # ETHIOPIC SYLLABLE DZE +AB16 ; [.24F6.0020.0002] # ETHIOPIC SYLLABLE DZO +12E0 ; [.24F7.0020.0002] # ETHIOPIC SYLLABLE ZHA +12E1 ; [.24F8.0020.0002] # ETHIOPIC SYLLABLE ZHU +12E2 ; [.24F9.0020.0002] # ETHIOPIC SYLLABLE ZHI +12E3 ; [.24FA.0020.0002] # ETHIOPIC SYLLABLE ZHAA +12E4 ; [.24FB.0020.0002] # ETHIOPIC SYLLABLE ZHEE +12E5 ; [.24FC.0020.0002] # ETHIOPIC SYLLABLE ZHE +12E6 ; [.24FD.0020.0002] # ETHIOPIC SYLLABLE ZHO +12E7 ; [.24FE.0020.0002] # ETHIOPIC SYLLABLE ZHWA +12E8 ; [.24FF.0020.0002] # ETHIOPIC SYLLABLE YA +12E9 ; [.2500.0020.0002] # ETHIOPIC SYLLABLE YU +12EA ; [.2501.0020.0002] # ETHIOPIC SYLLABLE YI +12EB ; [.2502.0020.0002] # ETHIOPIC SYLLABLE YAA +12EC ; [.2503.0020.0002] # ETHIOPIC SYLLABLE YEE +12ED ; [.2504.0020.0002] # ETHIOPIC SYLLABLE YE +12EE ; [.2505.0020.0002] # ETHIOPIC SYLLABLE YO +12EF ; [.2506.0020.0002] # ETHIOPIC SYLLABLE YOA +12F0 ; [.2507.0020.0002] # ETHIOPIC SYLLABLE DA +12F1 ; [.2508.0020.0002] # ETHIOPIC SYLLABLE DU +12F2 ; [.2509.0020.0002] # ETHIOPIC SYLLABLE DI +12F3 ; [.250A.0020.0002] # ETHIOPIC SYLLABLE DAA +12F4 ; [.250B.0020.0002] # ETHIOPIC SYLLABLE DEE +12F5 ; [.250C.0020.0002] # ETHIOPIC SYLLABLE DE +12F6 ; [.250D.0020.0002] # ETHIOPIC SYLLABLE DO +12F7 ; [.250E.0020.0002] # ETHIOPIC SYLLABLE DWA +2D8C ; [.250F.0020.0002] # ETHIOPIC SYLLABLE DOA +AB09 ; [.2510.0020.0002] # ETHIOPIC SYLLABLE DDHU +AB0A ; [.2511.0020.0002] # ETHIOPIC SYLLABLE DDHI +AB0B ; [.2512.0020.0002] # ETHIOPIC SYLLABLE DDHAA +AB0C ; [.2513.0020.0002] # ETHIOPIC SYLLABLE DDHEE +AB0D ; [.2514.0020.0002] # ETHIOPIC SYLLABLE DDHE +AB0E ; [.2515.0020.0002] # ETHIOPIC SYLLABLE DDHO +12F8 ; [.2516.0020.0002] # ETHIOPIC SYLLABLE DDA +12F9 ; [.2517.0020.0002] # ETHIOPIC SYLLABLE DDU +12FA ; [.2518.0020.0002] # ETHIOPIC SYLLABLE DDI +12FB ; [.2519.0020.0002] # ETHIOPIC SYLLABLE DDAA +12FC ; [.251A.0020.0002] # ETHIOPIC SYLLABLE DDEE +12FD ; [.251B.0020.0002] # ETHIOPIC SYLLABLE DDE +12FE ; [.251C.0020.0002] # ETHIOPIC SYLLABLE DDO +12FF ; [.251D.0020.0002] # ETHIOPIC SYLLABLE DDWA +2D8D ; [.251E.0020.0002] # ETHIOPIC SYLLABLE DDOA +1300 ; [.251F.0020.0002] # ETHIOPIC SYLLABLE JA +1301 ; [.2520.0020.0002] # ETHIOPIC SYLLABLE JU +1302 ; [.2521.0020.0002] # ETHIOPIC SYLLABLE JI +1303 ; [.2522.0020.0002] # ETHIOPIC SYLLABLE JAA +1304 ; [.2523.0020.0002] # ETHIOPIC SYLLABLE JEE +1305 ; [.2524.0020.0002] # ETHIOPIC SYLLABLE JE +1306 ; [.2525.0020.0002] # ETHIOPIC SYLLABLE JO +1307 ; [.2526.0020.0002] # ETHIOPIC SYLLABLE JWA +2D8E ; [.2527.0020.0002] # ETHIOPIC SYLLABLE JOA +1308 ; [.2528.0020.0002] # ETHIOPIC SYLLABLE GA +1309 ; [.2529.0020.0002] # ETHIOPIC SYLLABLE GU +130A ; [.252A.0020.0002] # ETHIOPIC SYLLABLE GI +130B ; [.252B.0020.0002] # ETHIOPIC SYLLABLE GAA +130C ; [.252C.0020.0002] # ETHIOPIC SYLLABLE GEE +130D ; [.252D.0020.0002] # ETHIOPIC SYLLABLE GE +130E ; [.252E.0020.0002] # ETHIOPIC SYLLABLE GO +130F ; [.252F.0020.0002] # ETHIOPIC SYLLABLE GOA +1310 ; [.2530.0020.0002] # ETHIOPIC SYLLABLE GWA +1312 ; [.2531.0020.0002] # ETHIOPIC SYLLABLE GWI +1313 ; [.2532.0020.0002] # ETHIOPIC SYLLABLE GWAA +1314 ; [.2533.0020.0002] # ETHIOPIC SYLLABLE GWEE +1315 ; [.2534.0020.0002] # ETHIOPIC SYLLABLE GWE +1318 ; [.2535.0020.0002] # ETHIOPIC SYLLABLE GGA +1319 ; [.2536.0020.0002] # ETHIOPIC SYLLABLE GGU +131A ; [.2537.0020.0002] # ETHIOPIC SYLLABLE GGI +131B ; [.2538.0020.0002] # ETHIOPIC SYLLABLE GGAA +131C ; [.2539.0020.0002] # ETHIOPIC SYLLABLE GGEE +131D ; [.253A.0020.0002] # ETHIOPIC SYLLABLE GGE +131E ; [.253B.0020.0002] # ETHIOPIC SYLLABLE GGO +131F ; [.253C.0020.0002] # ETHIOPIC SYLLABLE GGWAA +2D93 ; [.253D.0020.0002] # ETHIOPIC SYLLABLE GGWA +2D94 ; [.253E.0020.0002] # ETHIOPIC SYLLABLE GGWI +2D95 ; [.253F.0020.0002] # ETHIOPIC SYLLABLE GGWEE +2D96 ; [.2540.0020.0002] # ETHIOPIC SYLLABLE GGWE +1320 ; [.2541.0020.0002] # ETHIOPIC SYLLABLE THA +1321 ; [.2542.0020.0002] # ETHIOPIC SYLLABLE THU +1322 ; [.2543.0020.0002] # ETHIOPIC SYLLABLE THI +1323 ; [.2544.0020.0002] # ETHIOPIC SYLLABLE THAA +1324 ; [.2545.0020.0002] # ETHIOPIC SYLLABLE THEE +1325 ; [.2546.0020.0002] # ETHIOPIC SYLLABLE THE +1326 ; [.2547.0020.0002] # ETHIOPIC SYLLABLE THO +1327 ; [.2548.0020.0002] # ETHIOPIC SYLLABLE THWA +2D8F ; [.2549.0020.0002] # ETHIOPIC SYLLABLE THOA +1328 ; [.254A.0020.0002] # ETHIOPIC SYLLABLE CHA +1329 ; [.254B.0020.0002] # ETHIOPIC SYLLABLE CHU +132A ; [.254C.0020.0002] # ETHIOPIC SYLLABLE CHI +132B ; [.254D.0020.0002] # ETHIOPIC SYLLABLE CHAA +132C ; [.254E.0020.0002] # ETHIOPIC SYLLABLE CHEE +132D ; [.254F.0020.0002] # ETHIOPIC SYLLABLE CHE +132E ; [.2550.0020.0002] # ETHIOPIC SYLLABLE CHO +132F ; [.2551.0020.0002] # ETHIOPIC SYLLABLE CHWA +2D90 ; [.2552.0020.0002] # ETHIOPIC SYLLABLE CHOA +AB20 ; [.2553.0020.0002] # ETHIOPIC SYLLABLE CCHHA +AB21 ; [.2554.0020.0002] # ETHIOPIC SYLLABLE CCHHU +AB22 ; [.2555.0020.0002] # ETHIOPIC SYLLABLE CCHHI +AB23 ; [.2556.0020.0002] # ETHIOPIC SYLLABLE CCHHAA +AB24 ; [.2557.0020.0002] # ETHIOPIC SYLLABLE CCHHEE +AB25 ; [.2558.0020.0002] # ETHIOPIC SYLLABLE CCHHE +AB26 ; [.2559.0020.0002] # ETHIOPIC SYLLABLE CCHHO +1330 ; [.255A.0020.0002] # ETHIOPIC SYLLABLE PHA +1331 ; [.255B.0020.0002] # ETHIOPIC SYLLABLE PHU +1332 ; [.255C.0020.0002] # ETHIOPIC SYLLABLE PHI +1333 ; [.255D.0020.0002] # ETHIOPIC SYLLABLE PHAA +1334 ; [.255E.0020.0002] # ETHIOPIC SYLLABLE PHEE +1335 ; [.255F.0020.0002] # ETHIOPIC SYLLABLE PHE +1336 ; [.2560.0020.0002] # ETHIOPIC SYLLABLE PHO +1337 ; [.2561.0020.0002] # ETHIOPIC SYLLABLE PHWA +2D91 ; [.2562.0020.0002] # ETHIOPIC SYLLABLE PHOA +1338 ; [.2563.0020.0002] # ETHIOPIC SYLLABLE TSA +1339 ; [.2564.0020.0002] # ETHIOPIC SYLLABLE TSU +133A ; [.2565.0020.0002] # ETHIOPIC SYLLABLE TSI +133B ; [.2566.0020.0002] # ETHIOPIC SYLLABLE TSAA +133C ; [.2567.0020.0002] # ETHIOPIC SYLLABLE TSEE +133D ; [.2568.0020.0002] # ETHIOPIC SYLLABLE TSE +133E ; [.2569.0020.0002] # ETHIOPIC SYLLABLE TSO +133F ; [.256A.0020.0002] # ETHIOPIC SYLLABLE TSWA +AB28 ; [.256B.0020.0002] # ETHIOPIC SYLLABLE BBA +AB29 ; [.256C.0020.0002] # ETHIOPIC SYLLABLE BBU +AB2A ; [.256D.0020.0002] # ETHIOPIC SYLLABLE BBI +AB2B ; [.256E.0020.0002] # ETHIOPIC SYLLABLE BBAA +AB2C ; [.256F.0020.0002] # ETHIOPIC SYLLABLE BBEE +AB2D ; [.2570.0020.0002] # ETHIOPIC SYLLABLE BBE +AB2E ; [.2571.0020.0002] # ETHIOPIC SYLLABLE BBO +1340 ; [.2572.0020.0002] # ETHIOPIC SYLLABLE TZA +1341 ; [.2573.0020.0002] # ETHIOPIC SYLLABLE TZU +1342 ; [.2574.0020.0002] # ETHIOPIC SYLLABLE TZI +1343 ; [.2575.0020.0002] # ETHIOPIC SYLLABLE TZAA +1344 ; [.2576.0020.0002] # ETHIOPIC SYLLABLE TZEE +1345 ; [.2577.0020.0002] # ETHIOPIC SYLLABLE TZE +1346 ; [.2578.0020.0002] # ETHIOPIC SYLLABLE TZO +1347 ; [.2579.0020.0002] # ETHIOPIC SYLLABLE TZOA +1348 ; [.257A.0020.0002] # ETHIOPIC SYLLABLE FA +1349 ; [.257B.0020.0002] # ETHIOPIC SYLLABLE FU +134A ; [.257C.0020.0002] # ETHIOPIC SYLLABLE FI +134B ; [.257D.0020.0002] # ETHIOPIC SYLLABLE FAA +134C ; [.257E.0020.0002] # ETHIOPIC SYLLABLE FEE +134D ; [.257F.0020.0002] # ETHIOPIC SYLLABLE FE +134E ; [.2580.0020.0002] # ETHIOPIC SYLLABLE FO +134F ; [.2581.0020.0002] # ETHIOPIC SYLLABLE FWA +1388 ; [.2582.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT FWA +1389 ; [.2583.0020.0002] # ETHIOPIC SYLLABLE FWI +138A ; [.2584.0020.0002] # ETHIOPIC SYLLABLE FWEE +138B ; [.2585.0020.0002] # ETHIOPIC SYLLABLE FWE +1350 ; [.2586.0020.0002] # ETHIOPIC SYLLABLE PA +1351 ; [.2587.0020.0002] # ETHIOPIC SYLLABLE PU +1352 ; [.2588.0020.0002] # ETHIOPIC SYLLABLE PI +1353 ; [.2589.0020.0002] # ETHIOPIC SYLLABLE PAA +1354 ; [.258A.0020.0002] # ETHIOPIC SYLLABLE PEE +1355 ; [.258B.0020.0002] # ETHIOPIC SYLLABLE PE +1356 ; [.258C.0020.0002] # ETHIOPIC SYLLABLE PO +1357 ; [.258D.0020.0002] # ETHIOPIC SYLLABLE PWA +138C ; [.258E.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT PWA +138D ; [.258F.0020.0002] # ETHIOPIC SYLLABLE PWI +138E ; [.2590.0020.0002] # ETHIOPIC SYLLABLE PWEE +138F ; [.2591.0020.0002] # ETHIOPIC SYLLABLE PWE +2D92 ; [.2592.0020.0002] # ETHIOPIC SYLLABLE POA +1358 ; [.2593.0020.0002] # ETHIOPIC SYLLABLE RYA +1359 ; [.2594.0020.0002] # ETHIOPIC SYLLABLE MYA +135A ; [.2595.0020.0002] # ETHIOPIC SYLLABLE FYA +2DA0 ; [.2596.0020.0002] # ETHIOPIC SYLLABLE SSA +2DA1 ; [.2597.0020.0002] # ETHIOPIC SYLLABLE SSU +2DA2 ; [.2598.0020.0002] # ETHIOPIC SYLLABLE SSI +2DA3 ; [.2599.0020.0002] # ETHIOPIC SYLLABLE SSAA +2DA4 ; [.259A.0020.0002] # ETHIOPIC SYLLABLE SSEE +2DA5 ; [.259B.0020.0002] # ETHIOPIC SYLLABLE SSE +2DA6 ; [.259C.0020.0002] # ETHIOPIC SYLLABLE SSO +2DA8 ; [.259D.0020.0002] # ETHIOPIC SYLLABLE CCA +2DA9 ; [.259E.0020.0002] # ETHIOPIC SYLLABLE CCU +2DAA ; [.259F.0020.0002] # ETHIOPIC SYLLABLE CCI +2DAB ; [.25A0.0020.0002] # ETHIOPIC SYLLABLE CCAA +2DAC ; [.25A1.0020.0002] # ETHIOPIC SYLLABLE CCEE +2DAD ; [.25A2.0020.0002] # ETHIOPIC SYLLABLE CCE +2DAE ; [.25A3.0020.0002] # ETHIOPIC SYLLABLE CCO +2DB0 ; [.25A4.0020.0002] # ETHIOPIC SYLLABLE ZZA +2DB1 ; [.25A5.0020.0002] # ETHIOPIC SYLLABLE ZZU +2DB2 ; [.25A6.0020.0002] # ETHIOPIC SYLLABLE ZZI +2DB3 ; [.25A7.0020.0002] # ETHIOPIC SYLLABLE ZZAA +2DB4 ; [.25A8.0020.0002] # ETHIOPIC SYLLABLE ZZEE +2DB5 ; [.25A9.0020.0002] # ETHIOPIC SYLLABLE ZZE +2DB6 ; [.25AA.0020.0002] # ETHIOPIC SYLLABLE ZZO +2DB8 ; [.25AB.0020.0002] # ETHIOPIC SYLLABLE CCHA +2DB9 ; [.25AC.0020.0002] # ETHIOPIC SYLLABLE CCHU +2DBA ; [.25AD.0020.0002] # ETHIOPIC SYLLABLE CCHI +2DBB ; [.25AE.0020.0002] # ETHIOPIC SYLLABLE CCHAA +2DBC ; [.25AF.0020.0002] # ETHIOPIC SYLLABLE CCHEE +2DBD ; [.25B0.0020.0002] # ETHIOPIC SYLLABLE CCHE +2DBE ; [.25B1.0020.0002] # ETHIOPIC SYLLABLE CCHO +2DC0 ; [.25B2.0020.0002] # ETHIOPIC SYLLABLE QYA +2DC1 ; [.25B3.0020.0002] # ETHIOPIC SYLLABLE QYU +2DC2 ; [.25B4.0020.0002] # ETHIOPIC SYLLABLE QYI +2DC3 ; [.25B5.0020.0002] # ETHIOPIC SYLLABLE QYAA +2DC4 ; [.25B6.0020.0002] # ETHIOPIC SYLLABLE QYEE +2DC5 ; [.25B7.0020.0002] # ETHIOPIC SYLLABLE QYE +2DC6 ; [.25B8.0020.0002] # ETHIOPIC SYLLABLE QYO +2DC8 ; [.25B9.0020.0002] # ETHIOPIC SYLLABLE KYA +2DC9 ; [.25BA.0020.0002] # ETHIOPIC SYLLABLE KYU +2DCA ; [.25BB.0020.0002] # ETHIOPIC SYLLABLE KYI +2DCB ; [.25BC.0020.0002] # ETHIOPIC SYLLABLE KYAA +2DCC ; [.25BD.0020.0002] # ETHIOPIC SYLLABLE KYEE +2DCD ; [.25BE.0020.0002] # ETHIOPIC SYLLABLE KYE +2DCE ; [.25BF.0020.0002] # ETHIOPIC SYLLABLE KYO +2DD0 ; [.25C0.0020.0002] # ETHIOPIC SYLLABLE XYA +2DD1 ; [.25C1.0020.0002] # ETHIOPIC SYLLABLE XYU +2DD2 ; [.25C2.0020.0002] # ETHIOPIC SYLLABLE XYI +2DD3 ; [.25C3.0020.0002] # ETHIOPIC SYLLABLE XYAA +2DD4 ; [.25C4.0020.0002] # ETHIOPIC SYLLABLE XYEE +2DD5 ; [.25C5.0020.0002] # ETHIOPIC SYLLABLE XYE +2DD6 ; [.25C6.0020.0002] # ETHIOPIC SYLLABLE XYO +2DD8 ; [.25C7.0020.0002] # ETHIOPIC SYLLABLE GYA +2DD9 ; [.25C8.0020.0002] # ETHIOPIC SYLLABLE GYU +2DDA ; [.25C9.0020.0002] # ETHIOPIC SYLLABLE GYI +2DDB ; [.25CA.0020.0002] # ETHIOPIC SYLLABLE GYAA +2DDC ; [.25CB.0020.0002] # ETHIOPIC SYLLABLE GYEE +2DDD ; [.25CC.0020.0002] # ETHIOPIC SYLLABLE GYE +2DDE ; [.25CD.0020.0002] # ETHIOPIC SYLLABLE GYO +0950 ; [.25CE.0020.0002] # DEVANAGARI OM +A8FD ; [.25CF.0020.0002] # DEVANAGARI JAIN OM +0972 ; [.25D0.0020.0002] # DEVANAGARI LETTER CANDRA A +0904 ; [.25D1.0020.0002] # DEVANAGARI LETTER SHORT A +0905 ; [.25D2.0020.0002] # DEVANAGARI LETTER A +0906 ; [.25D3.0020.0002] # DEVANAGARI LETTER AA +0973 ; [.25D4.0020.0002] # DEVANAGARI LETTER OE +0974 ; [.25D5.0020.0002] # DEVANAGARI LETTER OOE +0975 ; [.25D6.0020.0002] # DEVANAGARI LETTER AW +0976 ; [.25D7.0020.0002] # DEVANAGARI LETTER UE +0977 ; [.25D8.0020.0002] # DEVANAGARI LETTER UUE +0907 ; [.25D9.0020.0002] # DEVANAGARI LETTER I +0908 ; [.25DA.0020.0002] # DEVANAGARI LETTER II +0909 ; [.25DB.0020.0002] # DEVANAGARI LETTER U +090A ; [.25DC.0020.0002] # DEVANAGARI LETTER UU +090B ; [.25DD.0020.0002] # DEVANAGARI LETTER VOCALIC R +0960 ; [.25DE.0020.0002] # DEVANAGARI LETTER VOCALIC RR +090C ; [.25DF.0020.0002] # DEVANAGARI LETTER VOCALIC L +0961 ; [.25E0.0020.0002] # DEVANAGARI LETTER VOCALIC LL +090D ; [.25E1.0020.0002] # DEVANAGARI LETTER CANDRA E +090E ; [.25E2.0020.0002] # DEVANAGARI LETTER SHORT E +090F ; [.25E3.0020.0002] # DEVANAGARI LETTER E +0910 ; [.25E4.0020.0002] # DEVANAGARI LETTER AI +0911 ; [.25E5.0020.0002] # DEVANAGARI LETTER CANDRA O +0912 ; [.25E6.0020.0002] # DEVANAGARI LETTER SHORT O +0913 ; [.25E7.0020.0002] # DEVANAGARI LETTER O +0914 ; [.25E8.0020.0002] # DEVANAGARI LETTER AU +0915 ; [.25E9.0020.0002] # DEVANAGARI LETTER KA +0958 ; [.25E9.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER QA +0916 ; [.25EA.0020.0002] # DEVANAGARI LETTER KHA +0959 ; [.25EA.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER KHHA +0917 ; [.25EB.0020.0002] # DEVANAGARI LETTER GA +095A ; [.25EB.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER GHHA +097B ; [.25EC.0020.0002] # DEVANAGARI LETTER GGA +0918 ; [.25ED.0020.0002] # DEVANAGARI LETTER GHA +0919 ; [.25EE.0020.0002] # DEVANAGARI LETTER NGA +091A ; [.25EF.0020.0002] # DEVANAGARI LETTER CA +091B ; [.25F0.0020.0002] # DEVANAGARI LETTER CHA +091C ; [.25F1.0020.0002] # DEVANAGARI LETTER JA +095B ; [.25F1.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER ZA +0979 ; [.25F2.0020.0002] # DEVANAGARI LETTER ZHA +097C ; [.25F3.0020.0002] # DEVANAGARI LETTER JJA +091D ; [.25F4.0020.0002] # DEVANAGARI LETTER JHA +091E ; [.25F5.0020.0002] # DEVANAGARI LETTER NYA +091F ; [.25F6.0020.0002] # DEVANAGARI LETTER TTA +0920 ; [.25F7.0020.0002] # DEVANAGARI LETTER TTHA +0978 ; [.25F8.0020.0002] # DEVANAGARI LETTER MARWARI DDA +0921 ; [.25F9.0020.0002] # DEVANAGARI LETTER DDA +095C ; [.25F9.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER DDDHA +097E ; [.25FA.0020.0002] # DEVANAGARI LETTER DDDA +0922 ; [.25FB.0020.0002] # DEVANAGARI LETTER DDHA +095D ; [.25FB.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER RHA +0923 ; [.25FC.0020.0002] # DEVANAGARI LETTER NNA +0924 ; [.25FD.0020.0002] # DEVANAGARI LETTER TA +0925 ; [.25FE.0020.0002] # DEVANAGARI LETTER THA +0926 ; [.25FF.0020.0002] # DEVANAGARI LETTER DA +0927 ; [.2600.0020.0002] # DEVANAGARI LETTER DHA +0928 ; [.2601.0020.0002] # DEVANAGARI LETTER NA +0929 ; [.2601.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER NNNA +092A ; [.2602.0020.0002] # DEVANAGARI LETTER PA +092B ; [.2603.0020.0002] # DEVANAGARI LETTER PHA +095E ; [.2603.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER FA +092C ; [.2604.0020.0002] # DEVANAGARI LETTER BA +097F ; [.2605.0020.0002] # DEVANAGARI LETTER BBA +092D ; [.2606.0020.0002] # DEVANAGARI LETTER BHA +092E ; [.2607.0020.0002] # DEVANAGARI LETTER MA +092F ; [.2608.0020.0002] # DEVANAGARI LETTER YA +095F ; [.2608.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER YYA +097A ; [.2609.0020.0002] # DEVANAGARI LETTER HEAVY YA +0930 ; [.260A.0020.0002] # DEVANAGARI LETTER RA +0931 ; [.260A.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER RRA +0932 ; [.260B.0020.0002] # DEVANAGARI LETTER LA +0933 ; [.260C.0020.0002] # DEVANAGARI LETTER LLA +0934 ; [.260C.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER LLLA +0935 ; [.260D.0020.0002] # DEVANAGARI LETTER VA +0936 ; [.260E.0020.0002] # DEVANAGARI LETTER SHA +0937 ; [.260F.0020.0002] # DEVANAGARI LETTER SSA +0938 ; [.2610.0020.0002] # DEVANAGARI LETTER SA +0939 ; [.2611.0020.0002] # DEVANAGARI LETTER HA +093D ; [.2612.0020.0002] # DEVANAGARI SIGN AVAGRAHA +097D ; [.2613.0020.0002] # DEVANAGARI LETTER GLOTTAL STOP +1CE9 ; [.2614.0020.0002] # VEDIC SIGN ANUSVARA ANTARGOMUKHA +1CEA ; [.2614.0020.0004] # VEDIC SIGN ANUSVARA BAHIRGOMUKHA +1CEB ; [.2614.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA +1CEC ; [.2614.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE ; [.2614.0020.0004] # VEDIC SIGN HEXIFORM LONG ANUSVARA +1CEF ; [.2614.0020.0004] # VEDIC SIGN LONG ANUSVARA +1CF0 ; [.2614.0020.0004] # VEDIC SIGN RTHANG LONG ANUSVARA +1CF1 ; [.2614.0020.0004] # VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF5 ; [.2615.0020.0002] # VEDIC SIGN JIHVAMULIYA +1CF6 ; [.2616.0020.0002] # VEDIC SIGN UPADHMANIYA +A8F2 ; [.2617.0020.0002] # DEVANAGARI SIGN SPACING CANDRABINDU +A8F3 ; [.2617.0020.0004] # DEVANAGARI SIGN CANDRABINDU VIRAMA +A8F4 ; [.2617.0020.0004] # DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA +A8F5 ; [.2617.0020.0004] # DEVANAGARI SIGN CANDRABINDU TWO +A8F6 ; [.2617.0020.0004] # DEVANAGARI SIGN CANDRABINDU THREE +A8F7 ; [.2617.0020.0004] # DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8FB ; [.2618.0020.0002] # DEVANAGARI HEADSTROKE +093E ; [.2619.0020.0002] # DEVANAGARI VOWEL SIGN AA +093A ; [.261A.0020.0002] # DEVANAGARI VOWEL SIGN OE +093B ; [.261B.0020.0002] # DEVANAGARI VOWEL SIGN OOE +094F ; [.261C.0020.0002] # DEVANAGARI VOWEL SIGN AW +0956 ; [.261D.0020.0002] # DEVANAGARI VOWEL SIGN UE +0957 ; [.261E.0020.0002] # DEVANAGARI VOWEL SIGN UUE +093F ; [.261F.0020.0002] # DEVANAGARI VOWEL SIGN I +0940 ; [.2620.0020.0002] # DEVANAGARI VOWEL SIGN II +0941 ; [.2621.0020.0002] # DEVANAGARI VOWEL SIGN U +0942 ; [.2622.0020.0002] # DEVANAGARI VOWEL SIGN UU +0943 ; [.2623.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC R +0944 ; [.2624.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC RR +0962 ; [.2625.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC L +0963 ; [.2626.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC LL +0945 ; [.2627.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA E +0955 ; [.2628.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA LONG E +0946 ; [.2629.0020.0002] # DEVANAGARI VOWEL SIGN SHORT E +0947 ; [.262A.0020.0002] # DEVANAGARI VOWEL SIGN E +094E ; [.262B.0020.0002] # DEVANAGARI VOWEL SIGN PRISHTHAMATRA E +0948 ; [.262C.0020.0002] # DEVANAGARI VOWEL SIGN AI +0949 ; [.262D.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA O +094A ; [.262E.0020.0002] # DEVANAGARI VOWEL SIGN SHORT O +094B ; [.262F.0020.0002] # DEVANAGARI VOWEL SIGN O +094C ; [.2630.0020.0002] # DEVANAGARI VOWEL SIGN AU +094D ; [.2631.0020.0002] # DEVANAGARI SIGN VIRAMA +0980 ; [.2632.0020.0002] # BENGALI ANJI +0985 ; [.2633.0020.0002] # BENGALI LETTER A +0986 ; [.2634.0020.0002] # BENGALI LETTER AA +0987 ; [.2635.0020.0002] # BENGALI LETTER I +0988 ; [.2636.0020.0002] # BENGALI LETTER II +0989 ; [.2637.0020.0002] # BENGALI LETTER U +098A ; [.2638.0020.0002] # BENGALI LETTER UU +098B ; [.2639.0020.0002] # BENGALI LETTER VOCALIC R +09E0 ; [.263A.0020.0002] # BENGALI LETTER VOCALIC RR +098C ; [.263B.0020.0002] # BENGALI LETTER VOCALIC L +09E1 ; [.263C.0020.0002] # BENGALI LETTER VOCALIC LL +098F ; [.263D.0020.0002] # BENGALI LETTER E +0990 ; [.263E.0020.0002] # BENGALI LETTER AI +0993 ; [.263F.0020.0002] # BENGALI LETTER O +0994 ; [.2640.0020.0002] # BENGALI LETTER AU +0995 ; [.2641.0020.0002] # BENGALI LETTER KA +0996 ; [.2642.0020.0002] # BENGALI LETTER KHA +0997 ; [.2643.0020.0002] # BENGALI LETTER GA +0998 ; [.2644.0020.0002] # BENGALI LETTER GHA +0999 ; [.2645.0020.0002] # BENGALI LETTER NGA +099A ; [.2646.0020.0002] # BENGALI LETTER CA +099B ; [.2647.0020.0002] # BENGALI LETTER CHA +099C ; [.2648.0020.0002] # BENGALI LETTER JA +099D ; [.2649.0020.0002] # BENGALI LETTER JHA +099E ; [.264A.0020.0002] # BENGALI LETTER NYA +099F ; [.264B.0020.0002] # BENGALI LETTER TTA +09A0 ; [.264C.0020.0002] # BENGALI LETTER TTHA +09A1 ; [.264D.0020.0002] # BENGALI LETTER DDA +09DC ; [.264D.0020.0002][.0000.00BD.0002] # BENGALI LETTER RRA +09A2 ; [.264E.0020.0002] # BENGALI LETTER DDHA +09DD ; [.264E.0020.0002][.0000.00BD.0002] # BENGALI LETTER RHA +09A3 ; [.264F.0020.0002] # BENGALI LETTER NNA +09A4 ; [.2650.0020.0002] # BENGALI LETTER TA +09CE ; [.2650.0020.0004][.2671.0020.0004] # BENGALI LETTER KHANDA TA +09A5 ; [.2651.0020.0002] # BENGALI LETTER THA +09A6 ; [.2652.0020.0002] # BENGALI LETTER DA +09A7 ; [.2653.0020.0002] # BENGALI LETTER DHA +09A8 ; [.2654.0020.0002] # BENGALI LETTER NA +09AA ; [.2655.0020.0002] # BENGALI LETTER PA +09AB ; [.2656.0020.0002] # BENGALI LETTER PHA +09AC ; [.2657.0020.0002] # BENGALI LETTER BA +09AD ; [.2658.0020.0002] # BENGALI LETTER BHA +09AE ; [.2659.0020.0002] # BENGALI LETTER MA +09AF ; [.265A.0020.0002] # BENGALI LETTER YA +09DF ; [.265A.0020.0002][.0000.00BD.0002] # BENGALI LETTER YYA +09B0 ; [.265B.0020.0002] # BENGALI LETTER RA +09F0 ; [.265C.0020.0002] # BENGALI LETTER RA WITH MIDDLE DIAGONAL +09B2 ; [.265D.0020.0002] # BENGALI LETTER LA +09F1 ; [.265E.0020.0002] # BENGALI LETTER RA WITH LOWER DIAGONAL +09B6 ; [.265F.0020.0002] # BENGALI LETTER SHA +09B7 ; [.2660.0020.0002] # BENGALI LETTER SSA +09B8 ; [.2661.0020.0002] # BENGALI LETTER SA +09B9 ; [.2662.0020.0002] # BENGALI LETTER HA +09BD ; [.2663.0020.0002] # BENGALI SIGN AVAGRAHA +09BE ; [.2664.0020.0002] # BENGALI VOWEL SIGN AA +09BF ; [.2665.0020.0002] # BENGALI VOWEL SIGN I +09C0 ; [.2666.0020.0002] # BENGALI VOWEL SIGN II +09C1 ; [.2667.0020.0002] # BENGALI VOWEL SIGN U +09C2 ; [.2668.0020.0002] # BENGALI VOWEL SIGN UU +09C3 ; [.2669.0020.0002] # BENGALI VOWEL SIGN VOCALIC R +09C4 ; [.266A.0020.0002] # BENGALI VOWEL SIGN VOCALIC RR +09E2 ; [.266B.0020.0002] # BENGALI VOWEL SIGN VOCALIC L +09E3 ; [.266C.0020.0002] # BENGALI VOWEL SIGN VOCALIC LL +09C7 ; [.266D.0020.0002] # BENGALI VOWEL SIGN E +09C8 ; [.266E.0020.0002] # BENGALI VOWEL SIGN AI +09CB ; [.266F.0020.0002] # BENGALI VOWEL SIGN O +09C7 09BE ; [.266F.0020.0002] # BENGALI VOWEL SIGN O +09CC ; [.2670.0020.0002] # BENGALI VOWEL SIGN AU +09C7 09D7 ; [.2670.0020.0002] # BENGALI VOWEL SIGN AU +09CD ; [.2671.0020.0002] # BENGALI SIGN VIRAMA +09D7 ; [.2672.0020.0002] # BENGALI AU LENGTH MARK +0A74 ; [.2673.0020.0002] # GURMUKHI EK ONKAR +0A73 ; [.2674.0020.0002] # GURMUKHI URA +0A09 ; [.2675.0020.0002] # GURMUKHI LETTER U +0A0A ; [.2676.0020.0002] # GURMUKHI LETTER UU +0A13 ; [.2677.0020.0002] # GURMUKHI LETTER OO +0A05 ; [.2678.0020.0002] # GURMUKHI LETTER A +0A06 ; [.2679.0020.0002] # GURMUKHI LETTER AA +0A10 ; [.267A.0020.0002] # GURMUKHI LETTER AI +0A14 ; [.267B.0020.0002] # GURMUKHI LETTER AU +0A72 ; [.267C.0020.0002] # GURMUKHI IRI +0A07 ; [.267D.0020.0002] # GURMUKHI LETTER I +0A08 ; [.267E.0020.0002] # GURMUKHI LETTER II +0A0F ; [.267F.0020.0002] # GURMUKHI LETTER EE +0A38 ; [.2680.0020.0002] # GURMUKHI LETTER SA +0A36 ; [.2680.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER SHA +0A39 ; [.2681.0020.0002] # GURMUKHI LETTER HA +0A51 ; [.2682.0020.0002] # GURMUKHI SIGN UDAAT +0A15 ; [.2683.0020.0002] # GURMUKHI LETTER KA +0A16 ; [.2684.0020.0002] # GURMUKHI LETTER KHA +0A59 ; [.2684.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER KHHA +0A17 ; [.2685.0020.0002] # GURMUKHI LETTER GA +0A5A ; [.2685.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER GHHA +0A18 ; [.2686.0020.0002] # GURMUKHI LETTER GHA +0A19 ; [.2687.0020.0002] # GURMUKHI LETTER NGA +0A1A ; [.2688.0020.0002] # GURMUKHI LETTER CA +0A1B ; [.2689.0020.0002] # GURMUKHI LETTER CHA +0A1C ; [.268A.0020.0002] # GURMUKHI LETTER JA +0A5B ; [.268A.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER ZA +0A1D ; [.268B.0020.0002] # GURMUKHI LETTER JHA +0A1E ; [.268C.0020.0002] # GURMUKHI LETTER NYA +0A1F ; [.268D.0020.0002] # GURMUKHI LETTER TTA +0A20 ; [.268E.0020.0002] # GURMUKHI LETTER TTHA +0A21 ; [.268F.0020.0002] # GURMUKHI LETTER DDA +0A22 ; [.2690.0020.0002] # GURMUKHI LETTER DDHA +0A23 ; [.2691.0020.0002] # GURMUKHI LETTER NNA +0A24 ; [.2692.0020.0002] # GURMUKHI LETTER TA +0A25 ; [.2693.0020.0002] # GURMUKHI LETTER THA +0A26 ; [.2694.0020.0002] # GURMUKHI LETTER DA +0A27 ; [.2695.0020.0002] # GURMUKHI LETTER DHA +0A28 ; [.2696.0020.0002] # GURMUKHI LETTER NA +0A2A ; [.2697.0020.0002] # GURMUKHI LETTER PA +0A2B ; [.2698.0020.0002] # GURMUKHI LETTER PHA +0A5E ; [.2698.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER FA +0A2C ; [.2699.0020.0002] # GURMUKHI LETTER BA +0A2D ; [.269A.0020.0002] # GURMUKHI LETTER BHA +0A2E ; [.269B.0020.0002] # GURMUKHI LETTER MA +0A2F ; [.269C.0020.0002] # GURMUKHI LETTER YA +0A75 ; [.269D.0020.0002] # GURMUKHI SIGN YAKASH +0A30 ; [.269E.0020.0002] # GURMUKHI LETTER RA +0A32 ; [.269F.0020.0002] # GURMUKHI LETTER LA +0A33 ; [.269F.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER LLA +0A35 ; [.26A0.0020.0002] # GURMUKHI LETTER VA +0A5C ; [.26A1.0020.0002] # GURMUKHI LETTER RRA +0A3E ; [.26A2.0020.0002] # GURMUKHI VOWEL SIGN AA +0A3F ; [.26A3.0020.0002] # GURMUKHI VOWEL SIGN I +0A40 ; [.26A4.0020.0002] # GURMUKHI VOWEL SIGN II +0A41 ; [.26A5.0020.0002] # GURMUKHI VOWEL SIGN U +0A42 ; [.26A6.0020.0002] # GURMUKHI VOWEL SIGN UU +0A47 ; [.26A7.0020.0002] # GURMUKHI VOWEL SIGN EE +0A48 ; [.26A8.0020.0002] # GURMUKHI VOWEL SIGN AI +0A4B ; [.26A9.0020.0002] # GURMUKHI VOWEL SIGN OO +0A4C ; [.26AA.0020.0002] # GURMUKHI VOWEL SIGN AU +0A4D ; [.26AB.0020.0002] # GURMUKHI SIGN VIRAMA +0AD0 ; [.26AC.0020.0002] # GUJARATI OM +0A85 ; [.26AD.0020.0002] # GUJARATI LETTER A +0A86 ; [.26AE.0020.0002] # GUJARATI LETTER AA +0A87 ; [.26AF.0020.0002] # GUJARATI LETTER I +0A88 ; [.26B0.0020.0002] # GUJARATI LETTER II +0A89 ; [.26B1.0020.0002] # GUJARATI LETTER U +0A8A ; [.26B2.0020.0002] # GUJARATI LETTER UU +0A8B ; [.26B3.0020.0002] # GUJARATI LETTER VOCALIC R +0AE0 ; [.26B4.0020.0002] # GUJARATI LETTER VOCALIC RR +0A8C ; [.26B5.0020.0002] # GUJARATI LETTER VOCALIC L +0AE1 ; [.26B6.0020.0002] # GUJARATI LETTER VOCALIC LL +0A8D ; [.26B7.0020.0002] # GUJARATI VOWEL CANDRA E +0A8F ; [.26B8.0020.0002] # GUJARATI LETTER E +0A90 ; [.26B9.0020.0002] # GUJARATI LETTER AI +0A91 ; [.26BA.0020.0002] # GUJARATI VOWEL CANDRA O +0A93 ; [.26BB.0020.0002] # GUJARATI LETTER O +0A94 ; [.26BC.0020.0002] # GUJARATI LETTER AU +0A95 ; [.26BD.0020.0002] # GUJARATI LETTER KA +0A96 ; [.26BE.0020.0002] # GUJARATI LETTER KHA +0A97 ; [.26BF.0020.0002] # GUJARATI LETTER GA +0A98 ; [.26C0.0020.0002] # GUJARATI LETTER GHA +0A99 ; [.26C1.0020.0002] # GUJARATI LETTER NGA +0A9A ; [.26C2.0020.0002] # GUJARATI LETTER CA +0A9B ; [.26C3.0020.0002] # GUJARATI LETTER CHA +0A9C ; [.26C4.0020.0002] # GUJARATI LETTER JA +0AF9 ; [.26C5.0020.0002] # GUJARATI LETTER ZHA +0A9D ; [.26C6.0020.0002] # GUJARATI LETTER JHA +0A9E ; [.26C7.0020.0002] # GUJARATI LETTER NYA +0A9F ; [.26C8.0020.0002] # GUJARATI LETTER TTA +0AA0 ; [.26C9.0020.0002] # GUJARATI LETTER TTHA +0AA1 ; [.26CA.0020.0002] # GUJARATI LETTER DDA +0AA2 ; [.26CB.0020.0002] # GUJARATI LETTER DDHA +0AA3 ; [.26CC.0020.0002] # GUJARATI LETTER NNA +0AA4 ; [.26CD.0020.0002] # GUJARATI LETTER TA +0AA5 ; [.26CE.0020.0002] # GUJARATI LETTER THA +0AA6 ; [.26CF.0020.0002] # GUJARATI LETTER DA +0AA7 ; [.26D0.0020.0002] # GUJARATI LETTER DHA +0AA8 ; [.26D1.0020.0002] # GUJARATI LETTER NA +0AAA ; [.26D2.0020.0002] # GUJARATI LETTER PA +0AAB ; [.26D3.0020.0002] # GUJARATI LETTER PHA +0AAC ; [.26D4.0020.0002] # GUJARATI LETTER BA +0AAD ; [.26D5.0020.0002] # GUJARATI LETTER BHA +0AAE ; [.26D6.0020.0002] # GUJARATI LETTER MA +0AAF ; [.26D7.0020.0002] # GUJARATI LETTER YA +0AB0 ; [.26D8.0020.0002] # GUJARATI LETTER RA +0AB2 ; [.26D9.0020.0002] # GUJARATI LETTER LA +0AB5 ; [.26DA.0020.0002] # GUJARATI LETTER VA +0AB6 ; [.26DB.0020.0002] # GUJARATI LETTER SHA +0AB7 ; [.26DC.0020.0002] # GUJARATI LETTER SSA +0AB8 ; [.26DD.0020.0002] # GUJARATI LETTER SA +0AB9 ; [.26DE.0020.0002] # GUJARATI LETTER HA +0AB3 ; [.26DF.0020.0002] # GUJARATI LETTER LLA +0ABD ; [.26E0.0020.0002] # GUJARATI SIGN AVAGRAHA +0ABE ; [.26E1.0020.0002] # GUJARATI VOWEL SIGN AA +0ABF ; [.26E2.0020.0002] # GUJARATI VOWEL SIGN I +0AC0 ; [.26E3.0020.0002] # GUJARATI VOWEL SIGN II +0AC1 ; [.26E4.0020.0002] # GUJARATI VOWEL SIGN U +0AC2 ; [.26E5.0020.0002] # GUJARATI VOWEL SIGN UU +0AC3 ; [.26E6.0020.0002] # GUJARATI VOWEL SIGN VOCALIC R +0AC4 ; [.26E7.0020.0002] # GUJARATI VOWEL SIGN VOCALIC RR +0AE2 ; [.26E8.0020.0002] # GUJARATI VOWEL SIGN VOCALIC L +0AE3 ; [.26E9.0020.0002] # GUJARATI VOWEL SIGN VOCALIC LL +0AC5 ; [.26EA.0020.0002] # GUJARATI VOWEL SIGN CANDRA E +0AC7 ; [.26EB.0020.0002] # GUJARATI VOWEL SIGN E +0AC8 ; [.26EC.0020.0002] # GUJARATI VOWEL SIGN AI +0AC9 ; [.26ED.0020.0002] # GUJARATI VOWEL SIGN CANDRA O +0ACB ; [.26EE.0020.0002] # GUJARATI VOWEL SIGN O +0ACC ; [.26EF.0020.0002] # GUJARATI VOWEL SIGN AU +0ACD ; [.26F0.0020.0002] # GUJARATI SIGN VIRAMA +0B05 ; [.26F1.0020.0002] # ORIYA LETTER A +0B06 ; [.26F2.0020.0002] # ORIYA LETTER AA +0B07 ; [.26F3.0020.0002] # ORIYA LETTER I +0B08 ; [.26F4.0020.0002] # ORIYA LETTER II +0B09 ; [.26F5.0020.0002] # ORIYA LETTER U +0B0A ; [.26F6.0020.0002] # ORIYA LETTER UU +0B0B ; [.26F7.0020.0002] # ORIYA LETTER VOCALIC R +0B60 ; [.26F8.0020.0002] # ORIYA LETTER VOCALIC RR +0B0C ; [.26F9.0020.0002] # ORIYA LETTER VOCALIC L +0B61 ; [.26FA.0020.0002] # ORIYA LETTER VOCALIC LL +0B0F ; [.26FB.0020.0002] # ORIYA LETTER E +0B10 ; [.26FC.0020.0002] # ORIYA LETTER AI +0B13 ; [.26FD.0020.0002] # ORIYA LETTER O +0B14 ; [.26FE.0020.0002] # ORIYA LETTER AU +0B15 ; [.26FF.0020.0002] # ORIYA LETTER KA +0B16 ; [.2700.0020.0002] # ORIYA LETTER KHA +0B17 ; [.2701.0020.0002] # ORIYA LETTER GA +0B18 ; [.2702.0020.0002] # ORIYA LETTER GHA +0B19 ; [.2703.0020.0002] # ORIYA LETTER NGA +0B1A ; [.2704.0020.0002] # ORIYA LETTER CA +0B1B ; [.2705.0020.0002] # ORIYA LETTER CHA +0B1C ; [.2706.0020.0002] # ORIYA LETTER JA +0B1D ; [.2707.0020.0002] # ORIYA LETTER JHA +0B1E ; [.2708.0020.0002] # ORIYA LETTER NYA +0B1F ; [.2709.0020.0002] # ORIYA LETTER TTA +0B20 ; [.270A.0020.0002] # ORIYA LETTER TTHA +0B21 ; [.270B.0020.0002] # ORIYA LETTER DDA +0B5C ; [.270B.0020.0002][.0000.00BD.0002] # ORIYA LETTER RRA +0B22 ; [.270C.0020.0002] # ORIYA LETTER DDHA +0B5D ; [.270C.0020.0002][.0000.00BD.0002] # ORIYA LETTER RHA +0B23 ; [.270D.0020.0002] # ORIYA LETTER NNA +0B24 ; [.270E.0020.0002] # ORIYA LETTER TA +0B25 ; [.270F.0020.0002] # ORIYA LETTER THA +0B26 ; [.2710.0020.0002] # ORIYA LETTER DA +0B27 ; [.2711.0020.0002] # ORIYA LETTER DHA +0B28 ; [.2712.0020.0002] # ORIYA LETTER NA +0B2A ; [.2713.0020.0002] # ORIYA LETTER PA +0B2B ; [.2714.0020.0002] # ORIYA LETTER PHA +0B2C ; [.2715.0020.0002] # ORIYA LETTER BA +0B2D ; [.2716.0020.0002] # ORIYA LETTER BHA +0B2E ; [.2717.0020.0002] # ORIYA LETTER MA +0B2F ; [.2718.0020.0002] # ORIYA LETTER YA +0B5F ; [.2719.0020.0002] # ORIYA LETTER YYA +0B30 ; [.271A.0020.0002] # ORIYA LETTER RA +0B32 ; [.271B.0020.0002] # ORIYA LETTER LA +0B33 ; [.271C.0020.0002] # ORIYA LETTER LLA +0B35 ; [.271D.0020.0002] # ORIYA LETTER VA +0B71 ; [.271E.0020.0002] # ORIYA LETTER WA +0B36 ; [.271F.0020.0002] # ORIYA LETTER SHA +0B37 ; [.2720.0020.0002] # ORIYA LETTER SSA +0B38 ; [.2721.0020.0002] # ORIYA LETTER SA +0B39 ; [.2722.0020.0002] # ORIYA LETTER HA +0B3D ; [.2723.0020.0002] # ORIYA SIGN AVAGRAHA +0B3E ; [.2724.0020.0002] # ORIYA VOWEL SIGN AA +0B3F ; [.2725.0020.0002] # ORIYA VOWEL SIGN I +0B40 ; [.2726.0020.0002] # ORIYA VOWEL SIGN II +0B41 ; [.2727.0020.0002] # ORIYA VOWEL SIGN U +0B42 ; [.2728.0020.0002] # ORIYA VOWEL SIGN UU +0B43 ; [.2729.0020.0002] # ORIYA VOWEL SIGN VOCALIC R +0B44 ; [.272A.0020.0002] # ORIYA VOWEL SIGN VOCALIC RR +0B62 ; [.272B.0020.0002] # ORIYA VOWEL SIGN VOCALIC L +0B63 ; [.272C.0020.0002] # ORIYA VOWEL SIGN VOCALIC LL +0B47 ; [.272D.0020.0002] # ORIYA VOWEL SIGN E +0B48 ; [.272E.0020.0002] # ORIYA VOWEL SIGN AI +0B47 0B56 ; [.272E.0020.0002] # ORIYA VOWEL SIGN AI +0B4B ; [.272F.0020.0002] # ORIYA VOWEL SIGN O +0B47 0B3E ; [.272F.0020.0002] # ORIYA VOWEL SIGN O +0B4C ; [.2730.0020.0002] # ORIYA VOWEL SIGN AU +0B47 0B57 ; [.2730.0020.0002] # ORIYA VOWEL SIGN AU +0B4D ; [.2731.0020.0002] # ORIYA SIGN VIRAMA +0B56 ; [.2732.0020.0002] # ORIYA AI LENGTH MARK +0B57 ; [.2733.0020.0002] # ORIYA AU LENGTH MARK +0BD0 ; [.2734.0020.0002] # TAMIL OM +0B85 ; [.2735.0020.0002] # TAMIL LETTER A +0B86 ; [.2736.0020.0002] # TAMIL LETTER AA +0B87 ; [.2737.0020.0002] # TAMIL LETTER I +0B88 ; [.2738.0020.0002] # TAMIL LETTER II +0B89 ; [.2739.0020.0002] # TAMIL LETTER U +0B8A ; [.273A.0020.0002] # TAMIL LETTER UU +0B8E ; [.273B.0020.0002] # TAMIL LETTER E +0B8F ; [.273C.0020.0002] # TAMIL LETTER EE +0B90 ; [.273D.0020.0002] # TAMIL LETTER AI +0B92 ; [.273E.0020.0002] # TAMIL LETTER O +0B93 ; [.273F.0020.0002] # TAMIL LETTER OO +0B94 ; [.2740.0020.0002] # TAMIL LETTER AU +0B92 0BD7 ; [.2740.0020.0002] # TAMIL LETTER AU +0B83 ; [.2741.0020.0002] # TAMIL SIGN VISARGA +0B95 ; [.2742.0020.0002] # TAMIL LETTER KA +0B99 ; [.2743.0020.0002] # TAMIL LETTER NGA +0B9A ; [.2744.0020.0002] # TAMIL LETTER CA +0B9E ; [.2745.0020.0002] # TAMIL LETTER NYA +0B9F ; [.2746.0020.0002] # TAMIL LETTER TTA +0BA3 ; [.2747.0020.0002] # TAMIL LETTER NNA +0BA4 ; [.2748.0020.0002] # TAMIL LETTER TA +0BA8 ; [.2749.0020.0002] # TAMIL LETTER NA +0BAA ; [.274A.0020.0002] # TAMIL LETTER PA +0BAE ; [.274B.0020.0002] # TAMIL LETTER MA +0BAF ; [.274C.0020.0002] # TAMIL LETTER YA +0BB0 ; [.274D.0020.0002] # TAMIL LETTER RA +0BB2 ; [.274E.0020.0002] # TAMIL LETTER LA +0BB5 ; [.274F.0020.0002] # TAMIL LETTER VA +0BB4 ; [.2750.0020.0002] # TAMIL LETTER LLLA +0BB3 ; [.2751.0020.0002] # TAMIL LETTER LLA +0BB1 ; [.2752.0020.0002] # TAMIL LETTER RRA +0BA9 ; [.2753.0020.0002] # TAMIL LETTER NNNA +0B9C ; [.2754.0020.0002] # TAMIL LETTER JA +0BB6 ; [.2755.0020.0002] # TAMIL LETTER SHA +0BB7 ; [.2756.0020.0002] # TAMIL LETTER SSA +0BB8 ; [.2757.0020.0002] # TAMIL LETTER SA +0BB9 ; [.2758.0020.0002] # TAMIL LETTER HA +0BBE ; [.2759.0020.0002] # TAMIL VOWEL SIGN AA +0BBF ; [.275A.0020.0002] # TAMIL VOWEL SIGN I +0BC0 ; [.275B.0020.0002] # TAMIL VOWEL SIGN II +0BC1 ; [.275C.0020.0002] # TAMIL VOWEL SIGN U +0BC2 ; [.275D.0020.0002] # TAMIL VOWEL SIGN UU +0BC6 ; [.275E.0020.0002] # TAMIL VOWEL SIGN E +0BC7 ; [.275F.0020.0002] # TAMIL VOWEL SIGN EE +0BC8 ; [.2760.0020.0002] # TAMIL VOWEL SIGN AI +0BCA ; [.2761.0020.0002] # TAMIL VOWEL SIGN O +0BC6 0BBE ; [.2761.0020.0002] # TAMIL VOWEL SIGN O +0BCB ; [.2762.0020.0002] # TAMIL VOWEL SIGN OO +0BC7 0BBE ; [.2762.0020.0002] # TAMIL VOWEL SIGN OO +0BCC ; [.2763.0020.0002] # TAMIL VOWEL SIGN AU +0BC6 0BD7 ; [.2763.0020.0002] # TAMIL VOWEL SIGN AU +0BCD ; [.2764.0020.0002] # TAMIL SIGN VIRAMA +0BD7 ; [.2765.0020.0002] # TAMIL AU LENGTH MARK +0C05 ; [.2766.0020.0002] # TELUGU LETTER A +0C06 ; [.2767.0020.0002] # TELUGU LETTER AA +0C07 ; [.2768.0020.0002] # TELUGU LETTER I +0C08 ; [.2769.0020.0002] # TELUGU LETTER II +0C09 ; [.276A.0020.0002] # TELUGU LETTER U +0C0A ; [.276B.0020.0002] # TELUGU LETTER UU +0C0B ; [.276C.0020.0002] # TELUGU LETTER VOCALIC R +0C60 ; [.276D.0020.0002] # TELUGU LETTER VOCALIC RR +0C0C ; [.276E.0020.0002] # TELUGU LETTER VOCALIC L +0C61 ; [.276F.0020.0002] # TELUGU LETTER VOCALIC LL +0C0E ; [.2770.0020.0002] # TELUGU LETTER E +0C0F ; [.2771.0020.0002] # TELUGU LETTER EE +0C10 ; [.2772.0020.0002] # TELUGU LETTER AI +0C12 ; [.2773.0020.0002] # TELUGU LETTER O +0C13 ; [.2774.0020.0002] # TELUGU LETTER OO +0C14 ; [.2775.0020.0002] # TELUGU LETTER AU +0C15 ; [.2776.0020.0002] # TELUGU LETTER KA +0C16 ; [.2777.0020.0002] # TELUGU LETTER KHA +0C17 ; [.2778.0020.0002] # TELUGU LETTER GA +0C18 ; [.2779.0020.0002] # TELUGU LETTER GHA +0C19 ; [.277A.0020.0002] # TELUGU LETTER NGA +0C1A ; [.277B.0020.0002] # TELUGU LETTER CA +0C58 ; [.277C.0020.0002] # TELUGU LETTER TSA +0C1B ; [.277D.0020.0002] # TELUGU LETTER CHA +0C1C ; [.277E.0020.0002] # TELUGU LETTER JA +0C59 ; [.277F.0020.0002] # TELUGU LETTER DZA +0C1D ; [.2780.0020.0002] # TELUGU LETTER JHA +0C1E ; [.2781.0020.0002] # TELUGU LETTER NYA +0C1F ; [.2782.0020.0002] # TELUGU LETTER TTA +0C20 ; [.2783.0020.0002] # TELUGU LETTER TTHA +0C21 ; [.2784.0020.0002] # TELUGU LETTER DDA +0C22 ; [.2785.0020.0002] # TELUGU LETTER DDHA +0C23 ; [.2786.0020.0002] # TELUGU LETTER NNA +0C24 ; [.2787.0020.0002] # TELUGU LETTER TA +0C25 ; [.2788.0020.0002] # TELUGU LETTER THA +0C26 ; [.2789.0020.0002] # TELUGU LETTER DA +0C27 ; [.278A.0020.0002] # TELUGU LETTER DHA +0C28 ; [.278B.0020.0002] # TELUGU LETTER NA +0C2A ; [.278C.0020.0002] # TELUGU LETTER PA +0C2B ; [.278D.0020.0002] # TELUGU LETTER PHA +0C2C ; [.278E.0020.0002] # TELUGU LETTER BA +0C2D ; [.278F.0020.0002] # TELUGU LETTER BHA +0C2E ; [.2790.0020.0002] # TELUGU LETTER MA +0C2F ; [.2791.0020.0002] # TELUGU LETTER YA +0C30 ; [.2792.0020.0002] # TELUGU LETTER RA +0C31 ; [.2793.0020.0002] # TELUGU LETTER RRA +0C32 ; [.2794.0020.0002] # TELUGU LETTER LA +0C35 ; [.2795.0020.0002] # TELUGU LETTER VA +0C36 ; [.2796.0020.0002] # TELUGU LETTER SHA +0C37 ; [.2797.0020.0002] # TELUGU LETTER SSA +0C38 ; [.2798.0020.0002] # TELUGU LETTER SA +0C39 ; [.2799.0020.0002] # TELUGU LETTER HA +0C33 ; [.279A.0020.0002] # TELUGU LETTER LLA +0C34 ; [.279B.0020.0002] # TELUGU LETTER LLLA +0C5A ; [.279C.0020.0002] # TELUGU LETTER RRRA +0C3D ; [.279D.0020.0002] # TELUGU SIGN AVAGRAHA +0C3E ; [.279E.0020.0002] # TELUGU VOWEL SIGN AA +0C3F ; [.279F.0020.0002] # TELUGU VOWEL SIGN I +0C40 ; [.27A0.0020.0002] # TELUGU VOWEL SIGN II +0C41 ; [.27A1.0020.0002] # TELUGU VOWEL SIGN U +0C42 ; [.27A2.0020.0002] # TELUGU VOWEL SIGN UU +0C43 ; [.27A3.0020.0002] # TELUGU VOWEL SIGN VOCALIC R +0C44 ; [.27A4.0020.0002] # TELUGU VOWEL SIGN VOCALIC RR +0C62 ; [.27A5.0020.0002] # TELUGU VOWEL SIGN VOCALIC L +0C63 ; [.27A6.0020.0002] # TELUGU VOWEL SIGN VOCALIC LL +0C46 ; [.27A7.0020.0002] # TELUGU VOWEL SIGN E +0C47 ; [.27A8.0020.0002] # TELUGU VOWEL SIGN EE +0C48 ; [.27A9.0020.0002] # TELUGU VOWEL SIGN AI +0C46 0C56 ; [.27A9.0020.0002] # TELUGU VOWEL SIGN AI +0C4A ; [.27AA.0020.0002] # TELUGU VOWEL SIGN O +0C4B ; [.27AB.0020.0002] # TELUGU VOWEL SIGN OO +0C4C ; [.27AC.0020.0002] # TELUGU VOWEL SIGN AU +0C4D ; [.27AD.0020.0002] # TELUGU SIGN VIRAMA +0C55 ; [.27AE.0020.0002] # TELUGU LENGTH MARK +0C56 ; [.27AF.0020.0002] # TELUGU AI LENGTH MARK +0C85 ; [.27B0.0020.0002] # KANNADA LETTER A +0C86 ; [.27B1.0020.0002] # KANNADA LETTER AA +0C87 ; [.27B2.0020.0002] # KANNADA LETTER I +0C88 ; [.27B3.0020.0002] # KANNADA LETTER II +0C89 ; [.27B4.0020.0002] # KANNADA LETTER U +0C8A ; [.27B5.0020.0002] # KANNADA LETTER UU +0C8B ; [.27B6.0020.0002] # KANNADA LETTER VOCALIC R +0CE0 ; [.27B7.0020.0002] # KANNADA LETTER VOCALIC RR +0C8C ; [.27B8.0020.0002] # KANNADA LETTER VOCALIC L +0CE1 ; [.27B9.0020.0002] # KANNADA LETTER VOCALIC LL +0C8E ; [.27BA.0020.0002] # KANNADA LETTER E +0C8F ; [.27BB.0020.0002] # KANNADA LETTER EE +0C90 ; [.27BC.0020.0002] # KANNADA LETTER AI +0C92 ; [.27BD.0020.0002] # KANNADA LETTER O +0C93 ; [.27BE.0020.0002] # KANNADA LETTER OO +0C94 ; [.27BF.0020.0002] # KANNADA LETTER AU +0C95 ; [.27C0.0020.0002] # KANNADA LETTER KA +0C96 ; [.27C1.0020.0002] # KANNADA LETTER KHA +0C97 ; [.27C2.0020.0002] # KANNADA LETTER GA +0C98 ; [.27C3.0020.0002] # KANNADA LETTER GHA +0C99 ; [.27C4.0020.0002] # KANNADA LETTER NGA +0C9A ; [.27C5.0020.0002] # KANNADA LETTER CA +0C9B ; [.27C6.0020.0002] # KANNADA LETTER CHA +0C9C ; [.27C7.0020.0002] # KANNADA LETTER JA +0C9D ; [.27C8.0020.0002] # KANNADA LETTER JHA +0C9E ; [.27C9.0020.0002] # KANNADA LETTER NYA +0C9F ; [.27CA.0020.0002] # KANNADA LETTER TTA +0CA0 ; [.27CB.0020.0002] # KANNADA LETTER TTHA +0CA1 ; [.27CC.0020.0002] # KANNADA LETTER DDA +0CA2 ; [.27CD.0020.0002] # KANNADA LETTER DDHA +0CA3 ; [.27CE.0020.0002] # KANNADA LETTER NNA +0CA4 ; [.27CF.0020.0002] # KANNADA LETTER TA +0CA5 ; [.27D0.0020.0002] # KANNADA LETTER THA +0CA6 ; [.27D1.0020.0002] # KANNADA LETTER DA +0CA7 ; [.27D2.0020.0002] # KANNADA LETTER DHA +0CA8 ; [.27D3.0020.0002] # KANNADA LETTER NA +0CAA ; [.27D4.0020.0002] # KANNADA LETTER PA +0CAB ; [.27D5.0020.0002] # KANNADA LETTER PHA +0CAC ; [.27D6.0020.0002] # KANNADA LETTER BA +0CAD ; [.27D7.0020.0002] # KANNADA LETTER BHA +0CAE ; [.27D8.0020.0002] # KANNADA LETTER MA +0CAF ; [.27D9.0020.0002] # KANNADA LETTER YA +0CB0 ; [.27DA.0020.0002] # KANNADA LETTER RA +0CB1 ; [.27DB.0020.0002] # KANNADA LETTER RRA +0CB2 ; [.27DC.0020.0002] # KANNADA LETTER LA +0CB5 ; [.27DD.0020.0002] # KANNADA LETTER VA +0CB6 ; [.27DE.0020.0002] # KANNADA LETTER SHA +0CB7 ; [.27DF.0020.0002] # KANNADA LETTER SSA +0CB8 ; [.27E0.0020.0002] # KANNADA LETTER SA +0CB9 ; [.27E1.0020.0002] # KANNADA LETTER HA +0CB3 ; [.27E2.0020.0002] # KANNADA LETTER LLA +0CDE ; [.27E3.0020.0002] # KANNADA LETTER FA +0CBD ; [.27E4.0020.0002] # KANNADA SIGN AVAGRAHA +0CF1 ; [.27E5.0020.0002] # KANNADA SIGN JIHVAMULIYA +0CF2 ; [.27E6.0020.0002] # KANNADA SIGN UPADHMANIYA +0CBE ; [.27E7.0020.0002] # KANNADA VOWEL SIGN AA +0CBF ; [.27E8.0020.0002] # KANNADA VOWEL SIGN I +0CC0 ; [.27E9.0020.0002] # KANNADA VOWEL SIGN II +0CBF 0CD5 ; [.27E9.0020.0002] # KANNADA VOWEL SIGN II +0CC1 ; [.27EA.0020.0002] # KANNADA VOWEL SIGN U +0CC2 ; [.27EB.0020.0002] # KANNADA VOWEL SIGN UU +0CC3 ; [.27EC.0020.0002] # KANNADA VOWEL SIGN VOCALIC R +0CC4 ; [.27ED.0020.0002] # KANNADA VOWEL SIGN VOCALIC RR +0CE2 ; [.27EE.0020.0002] # KANNADA VOWEL SIGN VOCALIC L +0CE3 ; [.27EF.0020.0002] # KANNADA VOWEL SIGN VOCALIC LL +0CC6 ; [.27F0.0020.0002] # KANNADA VOWEL SIGN E +0CC7 ; [.27F1.0020.0002] # KANNADA VOWEL SIGN EE +0CC6 0CD5 ; [.27F1.0020.0002] # KANNADA VOWEL SIGN EE +0CC8 ; [.27F2.0020.0002] # KANNADA VOWEL SIGN AI +0CC6 0CD6 ; [.27F2.0020.0002] # KANNADA VOWEL SIGN AI +0CCA ; [.27F3.0020.0002] # KANNADA VOWEL SIGN O +0CC6 0CC2 ; [.27F3.0020.0002] # KANNADA VOWEL SIGN O +0CCB ; [.27F4.0020.0002] # KANNADA VOWEL SIGN OO +0CC6 0CC2 0CD5 ; [.27F4.0020.0002] # KANNADA VOWEL SIGN OO +0CCA 0CD5 ; [.27F4.0020.0002] # KANNADA VOWEL SIGN OO +0CCC ; [.27F5.0020.0002] # KANNADA VOWEL SIGN AU +0CCD ; [.27F6.0020.0002] # KANNADA SIGN VIRAMA +0CD5 ; [.27F7.0020.0002] # KANNADA LENGTH MARK +0CD6 ; [.27F8.0020.0002] # KANNADA AI LENGTH MARK +0D05 ; [.27F9.0020.0002] # MALAYALAM LETTER A +0D06 ; [.27FA.0020.0002] # MALAYALAM LETTER AA +0D07 ; [.27FB.0020.0002] # MALAYALAM LETTER I +0D08 ; [.27FC.0020.0002] # MALAYALAM LETTER II +0D5F ; [.27FD.0020.0002] # MALAYALAM LETTER ARCHAIC II +0D09 ; [.27FE.0020.0002] # MALAYALAM LETTER U +0D0A ; [.27FF.0020.0002] # MALAYALAM LETTER UU +0D0B ; [.2800.0020.0002] # MALAYALAM LETTER VOCALIC R +0D60 ; [.2801.0020.0002] # MALAYALAM LETTER VOCALIC RR +0D0C ; [.2802.0020.0002] # MALAYALAM LETTER VOCALIC L +0D61 ; [.2803.0020.0002] # MALAYALAM LETTER VOCALIC LL +0D0E ; [.2804.0020.0002] # MALAYALAM LETTER E +0D0F ; [.2805.0020.0002] # MALAYALAM LETTER EE +0D10 ; [.2806.0020.0002] # MALAYALAM LETTER AI +0D12 ; [.2807.0020.0002] # MALAYALAM LETTER O +0D13 ; [.2808.0020.0002] # MALAYALAM LETTER OO +0D14 ; [.2809.0020.0002] # MALAYALAM LETTER AU +0D15 ; [.280A.0020.0002] # MALAYALAM LETTER KA +0D7F ; [.280A.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU K +0D16 ; [.280B.0020.0002] # MALAYALAM LETTER KHA +0D17 ; [.280C.0020.0002] # MALAYALAM LETTER GA +0D18 ; [.280D.0020.0002] # MALAYALAM LETTER GHA +0D19 ; [.280E.0020.0002] # MALAYALAM LETTER NGA +0D1A ; [.280F.0020.0002] # MALAYALAM LETTER CA +0D1B ; [.2810.0020.0002] # MALAYALAM LETTER CHA +0D1C ; [.2811.0020.0002] # MALAYALAM LETTER JA +0D1D ; [.2812.0020.0002] # MALAYALAM LETTER JHA +0D1E ; [.2813.0020.0002] # MALAYALAM LETTER NYA +0D1F ; [.2814.0020.0002] # MALAYALAM LETTER TTA +0D20 ; [.2815.0020.0002] # MALAYALAM LETTER TTHA +0D21 ; [.2816.0020.0002] # MALAYALAM LETTER DDA +0D22 ; [.2817.0020.0002] # MALAYALAM LETTER DDHA +0D23 ; [.2818.0020.0002] # MALAYALAM LETTER NNA +0D7A ; [.2818.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU NN +0D24 ; [.2819.0020.0002] # MALAYALAM LETTER TA +0D25 ; [.281A.0020.0002] # MALAYALAM LETTER THA +0D26 ; [.281B.0020.0002] # MALAYALAM LETTER DA +0D27 ; [.281C.0020.0002] # MALAYALAM LETTER DHA +0D28 ; [.281D.0020.0002] # MALAYALAM LETTER NA +0D7B ; [.281D.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU N +0D29 ; [.281E.0020.0002] # MALAYALAM LETTER NNNA +0D2A ; [.281F.0020.0002] # MALAYALAM LETTER PA +0D2B ; [.2820.0020.0002] # MALAYALAM LETTER PHA +0D2C ; [.2821.0020.0002] # MALAYALAM LETTER BA +0D2D ; [.2822.0020.0002] # MALAYALAM LETTER BHA +0D2E ; [.2823.0020.0002] # MALAYALAM LETTER MA +0D2F ; [.2824.0020.0002] # MALAYALAM LETTER YA +0D30 ; [.2825.0020.0002] # MALAYALAM LETTER RA +0D4E ; [.2825.0020.0004][.2841.0020.0004] # MALAYALAM LETTER DOT REPH +0D7C ; [.2825.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU RR +0D32 ; [.2826.0020.0002] # MALAYALAM LETTER LA +0D7D ; [.2826.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU L +0D35 ; [.2827.0020.0002] # MALAYALAM LETTER VA +0D36 ; [.2828.0020.0002] # MALAYALAM LETTER SHA +0D37 ; [.2829.0020.0002] # MALAYALAM LETTER SSA +0D38 ; [.282A.0020.0002] # MALAYALAM LETTER SA +0D39 ; [.282B.0020.0002] # MALAYALAM LETTER HA +0D33 ; [.282C.0020.0002] # MALAYALAM LETTER LLA +0D7E ; [.282C.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU LL +0D34 ; [.282D.0020.0002] # MALAYALAM LETTER LLLA +0D31 ; [.282E.0020.0002] # MALAYALAM LETTER RRA +0D3A ; [.282F.0020.0002] # MALAYALAM LETTER TTTA +0D3D ; [.2830.0020.0002] # MALAYALAM SIGN AVAGRAHA +0D3E ; [.2831.0020.0002] # MALAYALAM VOWEL SIGN AA +0D3F ; [.2832.0020.0002] # MALAYALAM VOWEL SIGN I +0D40 ; [.2833.0020.0002] # MALAYALAM VOWEL SIGN II +0D41 ; [.2834.0020.0002] # MALAYALAM VOWEL SIGN U +0D42 ; [.2835.0020.0002] # MALAYALAM VOWEL SIGN UU +0D43 ; [.2836.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC R +0D44 ; [.2837.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC RR +0D62 ; [.2838.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC L +0D63 ; [.2839.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC LL +0D46 ; [.283A.0020.0002] # MALAYALAM VOWEL SIGN E +0D47 ; [.283B.0020.0002] # MALAYALAM VOWEL SIGN EE +0D48 ; [.283C.0020.0002] # MALAYALAM VOWEL SIGN AI +0D4A ; [.283D.0020.0002] # MALAYALAM VOWEL SIGN O +0D46 0D3E ; [.283D.0020.0002] # MALAYALAM VOWEL SIGN O +0D4B ; [.283E.0020.0002] # MALAYALAM VOWEL SIGN OO +0D47 0D3E ; [.283E.0020.0002] # MALAYALAM VOWEL SIGN OO +0D4C ; [.283F.0020.0002] # MALAYALAM VOWEL SIGN AU +0D46 0D57 ; [.283F.0020.0002] # MALAYALAM VOWEL SIGN AU +0D57 ; [.2840.0020.0002] # MALAYALAM AU LENGTH MARK +0D4D ; [.2841.0020.0002] # MALAYALAM SIGN VIRAMA +0D85 ; [.2842.0020.0002] # SINHALA LETTER AYANNA +0D86 ; [.2843.0020.0002] # SINHALA LETTER AAYANNA +0D87 ; [.2844.0020.0002] # SINHALA LETTER AEYANNA +0D88 ; [.2845.0020.0002] # SINHALA LETTER AEEYANNA +0D89 ; [.2846.0020.0002] # SINHALA LETTER IYANNA +0D8A ; [.2847.0020.0002] # SINHALA LETTER IIYANNA +0D8B ; [.2848.0020.0002] # SINHALA LETTER UYANNA +0D8C ; [.2849.0020.0002] # SINHALA LETTER UUYANNA +0D8D ; [.284A.0020.0002] # SINHALA LETTER IRUYANNA +0D8E ; [.284B.0020.0002] # SINHALA LETTER IRUUYANNA +0D8F ; [.284C.0020.0002] # SINHALA LETTER ILUYANNA +0D90 ; [.284D.0020.0002] # SINHALA LETTER ILUUYANNA +0D91 ; [.284E.0020.0002] # SINHALA LETTER EYANNA +0D92 ; [.284F.0020.0002] # SINHALA LETTER EEYANNA +0D93 ; [.2850.0020.0002] # SINHALA LETTER AIYANNA +0D94 ; [.2851.0020.0002] # SINHALA LETTER OYANNA +0D95 ; [.2852.0020.0002] # SINHALA LETTER OOYANNA +0D96 ; [.2853.0020.0002] # SINHALA LETTER AUYANNA +0D9A ; [.2854.0020.0002] # SINHALA LETTER ALPAPRAANA KAYANNA +0D9B ; [.2855.0020.0002] # SINHALA LETTER MAHAAPRAANA KAYANNA +0D9C ; [.2856.0020.0002] # SINHALA LETTER ALPAPRAANA GAYANNA +0D9D ; [.2857.0020.0002] # SINHALA LETTER MAHAAPRAANA GAYANNA +0D9E ; [.2858.0020.0002] # SINHALA LETTER KANTAJA NAASIKYAYA +0D9F ; [.2859.0020.0002] # SINHALA LETTER SANYAKA GAYANNA +0DA0 ; [.285A.0020.0002] # SINHALA LETTER ALPAPRAANA CAYANNA +0DA1 ; [.285B.0020.0002] # SINHALA LETTER MAHAAPRAANA CAYANNA +0DA2 ; [.285C.0020.0002] # SINHALA LETTER ALPAPRAANA JAYANNA +0DA3 ; [.285D.0020.0002] # SINHALA LETTER MAHAAPRAANA JAYANNA +0DA4 ; [.285E.0020.0002] # SINHALA LETTER TAALUJA NAASIKYAYA +0DA5 ; [.285F.0020.0002] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA +0DA6 ; [.2860.0020.0002] # SINHALA LETTER SANYAKA JAYANNA +0DA7 ; [.2861.0020.0002] # SINHALA LETTER ALPAPRAANA TTAYANNA +0DA8 ; [.2862.0020.0002] # SINHALA LETTER MAHAAPRAANA TTAYANNA +0DA9 ; [.2863.0020.0002] # SINHALA LETTER ALPAPRAANA DDAYANNA +0DAA ; [.2864.0020.0002] # SINHALA LETTER MAHAAPRAANA DDAYANNA +0DAB ; [.2865.0020.0002] # SINHALA LETTER MUURDHAJA NAYANNA +0DAC ; [.2866.0020.0002] # SINHALA LETTER SANYAKA DDAYANNA +0DAD ; [.2867.0020.0002] # SINHALA LETTER ALPAPRAANA TAYANNA +0DAE ; [.2868.0020.0002] # SINHALA LETTER MAHAAPRAANA TAYANNA +0DAF ; [.2869.0020.0002] # SINHALA LETTER ALPAPRAANA DAYANNA +0DB0 ; [.286A.0020.0002] # SINHALA LETTER MAHAAPRAANA DAYANNA +0DB1 ; [.286B.0020.0002] # SINHALA LETTER DANTAJA NAYANNA +0DB3 ; [.286C.0020.0002] # SINHALA LETTER SANYAKA DAYANNA +0DB4 ; [.286D.0020.0002] # SINHALA LETTER ALPAPRAANA PAYANNA +0DB5 ; [.286E.0020.0002] # SINHALA LETTER MAHAAPRAANA PAYANNA +0DB6 ; [.286F.0020.0002] # SINHALA LETTER ALPAPRAANA BAYANNA +0DB7 ; [.2870.0020.0002] # SINHALA LETTER MAHAAPRAANA BAYANNA +0DB8 ; [.2871.0020.0002] # SINHALA LETTER MAYANNA +0DB9 ; [.2872.0020.0002] # SINHALA LETTER AMBA BAYANNA +0DBA ; [.2873.0020.0002] # SINHALA LETTER YAYANNA +0DBB ; [.2874.0020.0002] # SINHALA LETTER RAYANNA +0DBD ; [.2875.0020.0002] # SINHALA LETTER DANTAJA LAYANNA +0DC0 ; [.2876.0020.0002] # SINHALA LETTER VAYANNA +0DC1 ; [.2877.0020.0002] # SINHALA LETTER TAALUJA SAYANNA +0DC2 ; [.2878.0020.0002] # SINHALA LETTER MUURDHAJA SAYANNA +0DC3 ; [.2879.0020.0002] # SINHALA LETTER DANTAJA SAYANNA +0DC4 ; [.287A.0020.0002] # SINHALA LETTER HAYANNA +0DC5 ; [.287B.0020.0002] # SINHALA LETTER MUURDHAJA LAYANNA +0DC6 ; [.287C.0020.0002] # SINHALA LETTER FAYANNA +0DCF ; [.287D.0020.0002] # SINHALA VOWEL SIGN AELA-PILLA +0DD0 ; [.287E.0020.0002] # SINHALA VOWEL SIGN KETTI AEDA-PILLA +0DD1 ; [.287F.0020.0002] # SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2 ; [.2880.0020.0002] # SINHALA VOWEL SIGN KETTI IS-PILLA +0DD3 ; [.2881.0020.0002] # SINHALA VOWEL SIGN DIGA IS-PILLA +0DD4 ; [.2882.0020.0002] # SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; [.2883.0020.0002] # SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8 ; [.2884.0020.0002] # SINHALA VOWEL SIGN GAETTA-PILLA +0DF2 ; [.2885.0020.0002] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA +0DDF ; [.2886.0020.0002] # SINHALA VOWEL SIGN GAYANUKITTA +0DF3 ; [.2887.0020.0002] # SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DD9 ; [.2888.0020.0002] # SINHALA VOWEL SIGN KOMBUVA +0DDA ; [.2889.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA +0DD9 0DCA ; [.2889.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA +0DDB ; [.288A.0020.0002] # SINHALA VOWEL SIGN KOMBU DEKA +0DDC ; [.288B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DD9 0DCF ; [.288B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DDD ; [.288C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DD9 0DCF 0DCA ; [.288C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDC 0DCA ; [.288C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDE ; [.288D.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DD9 0DDF ; [.288D.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DCA ; [.288E.0020.0002] # SINHALA SIGN AL-LAKUNA +AAF2 ; [.288F.0020.0002] # MEETEI MAYEK ANJI +ABC0 ; [.2890.0020.0002] # MEETEI MAYEK LETTER KOK +ABC1 ; [.2891.0020.0002] # MEETEI MAYEK LETTER SAM +ABC2 ; [.2892.0020.0002] # MEETEI MAYEK LETTER LAI +ABC3 ; [.2893.0020.0002] # MEETEI MAYEK LETTER MIT +ABC4 ; [.2894.0020.0002] # MEETEI MAYEK LETTER PA +ABC5 ; [.2895.0020.0002] # MEETEI MAYEK LETTER NA +ABC6 ; [.2896.0020.0002] # MEETEI MAYEK LETTER CHIL +ABC7 ; [.2897.0020.0002] # MEETEI MAYEK LETTER TIL +ABC8 ; [.2898.0020.0002] # MEETEI MAYEK LETTER KHOU +ABC9 ; [.2899.0020.0002] # MEETEI MAYEK LETTER NGOU +ABCA ; [.289A.0020.0002] # MEETEI MAYEK LETTER THOU +ABCB ; [.289B.0020.0002] # MEETEI MAYEK LETTER WAI +ABCC ; [.289C.0020.0002] # MEETEI MAYEK LETTER YANG +ABCD ; [.289D.0020.0002] # MEETEI MAYEK LETTER HUK +ABCE ; [.289E.0020.0002] # MEETEI MAYEK LETTER UN +ABCF ; [.289F.0020.0002] # MEETEI MAYEK LETTER I +ABD0 ; [.28A0.0020.0002] # MEETEI MAYEK LETTER PHAM +ABD1 ; [.28A1.0020.0002] # MEETEI MAYEK LETTER ATIYA +ABD2 ; [.28A2.0020.0002] # MEETEI MAYEK LETTER GOK +ABD3 ; [.28A3.0020.0002] # MEETEI MAYEK LETTER JHAM +ABD4 ; [.28A4.0020.0002] # MEETEI MAYEK LETTER RAI +ABD5 ; [.28A5.0020.0002] # MEETEI MAYEK LETTER BA +ABD6 ; [.28A6.0020.0002] # MEETEI MAYEK LETTER JIL +ABD7 ; [.28A7.0020.0002] # MEETEI MAYEK LETTER DIL +ABD8 ; [.28A8.0020.0002] # MEETEI MAYEK LETTER GHOU +ABD9 ; [.28A9.0020.0002] # MEETEI MAYEK LETTER DHOU +ABDA ; [.28AA.0020.0002] # MEETEI MAYEK LETTER BHAM +AAE0 ; [.28AB.0020.0002] # MEETEI MAYEK LETTER E +AAE1 ; [.28AC.0020.0002] # MEETEI MAYEK LETTER O +AAE2 ; [.28AD.0020.0002] # MEETEI MAYEK LETTER CHA +AAE3 ; [.28AE.0020.0002] # MEETEI MAYEK LETTER NYA +AAE4 ; [.28AF.0020.0002] # MEETEI MAYEK LETTER TTA +AAE5 ; [.28B0.0020.0002] # MEETEI MAYEK LETTER TTHA +AAE6 ; [.28B1.0020.0002] # MEETEI MAYEK LETTER DDA +AAE7 ; [.28B2.0020.0002] # MEETEI MAYEK LETTER DDHA +AAE8 ; [.28B3.0020.0002] # MEETEI MAYEK LETTER NNA +AAE9 ; [.28B4.0020.0002] # MEETEI MAYEK LETTER SHA +AAEA ; [.28B5.0020.0002] # MEETEI MAYEK LETTER SSA +ABE3 ; [.28B6.0020.0002] # MEETEI MAYEK VOWEL SIGN ONAP +ABE4 ; [.28B7.0020.0002] # MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; [.28B8.0020.0002] # MEETEI MAYEK VOWEL SIGN ANAP +ABE6 ; [.28B9.0020.0002] # MEETEI MAYEK VOWEL SIGN YENAP +ABE7 ; [.28BA.0020.0002] # MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; [.28BB.0020.0002] # MEETEI MAYEK VOWEL SIGN UNAP +ABE9 ; [.28BC.0020.0002] # MEETEI MAYEK VOWEL SIGN CHEINAP +ABEA ; [.28BD.0020.0002] # MEETEI MAYEK VOWEL SIGN NUNG +AAEB ; [.28BE.0020.0002] # MEETEI MAYEK VOWEL SIGN II +AAEC ; [.28BF.0020.0002] # MEETEI MAYEK VOWEL SIGN UU +AAED ; [.28C0.0020.0002] # MEETEI MAYEK VOWEL SIGN AAI +AAEE ; [.28C1.0020.0002] # MEETEI MAYEK VOWEL SIGN AU +AAEF ; [.28C2.0020.0002] # MEETEI MAYEK VOWEL SIGN AAU +AAF5 ; [.28C3.0020.0002] # MEETEI MAYEK VOWEL SIGN VISARGA +ABDB ; [.28C4.0020.0002] # MEETEI MAYEK LETTER KOK LONSUM +ABDC ; [.28C5.0020.0002] # MEETEI MAYEK LETTER LAI LONSUM +ABDD ; [.28C6.0020.0002] # MEETEI MAYEK LETTER MIT LONSUM +ABDE ; [.28C7.0020.0002] # MEETEI MAYEK LETTER PA LONSUM +ABDF ; [.28C8.0020.0002] # MEETEI MAYEK LETTER NA LONSUM +ABE0 ; [.28C9.0020.0002] # MEETEI MAYEK LETTER TIL LONSUM +ABE1 ; [.28CA.0020.0002] # MEETEI MAYEK LETTER NGOU LONSUM +ABE2 ; [.28CB.0020.0002] # MEETEI MAYEK LETTER I LONSUM +ABED ; [.28CC.0020.0002] # MEETEI MAYEK APUN IYEK +AAF6 ; [.28CD.0020.0002] # MEETEI MAYEK VIRAMA +A800 ; [.28CE.0020.0002] # SYLOTI NAGRI LETTER A +A801 ; [.28CF.0020.0002] # SYLOTI NAGRI LETTER I +A802 ; [.28D0.0020.0002] # SYLOTI NAGRI SIGN DVISVARA +A803 ; [.28D1.0020.0002] # SYLOTI NAGRI LETTER U +A804 ; [.28D2.0020.0002] # SYLOTI NAGRI LETTER E +A805 ; [.28D3.0020.0002] # SYLOTI NAGRI LETTER O +A806 ; [.28D4.0020.0002] # SYLOTI NAGRI SIGN HASANTA +A807 ; [.28D5.0020.0002] # SYLOTI NAGRI LETTER KO +A808 ; [.28D6.0020.0002] # SYLOTI NAGRI LETTER KHO +A809 ; [.28D7.0020.0002] # SYLOTI NAGRI LETTER GO +A80A ; [.28D8.0020.0002] # SYLOTI NAGRI LETTER GHO +A80C ; [.28D9.0020.0002] # SYLOTI NAGRI LETTER CO +A80D ; [.28DA.0020.0002] # SYLOTI NAGRI LETTER CHO +A80E ; [.28DB.0020.0002] # SYLOTI NAGRI LETTER JO +A80F ; [.28DC.0020.0002] # SYLOTI NAGRI LETTER JHO +A810 ; [.28DD.0020.0002] # SYLOTI NAGRI LETTER TTO +A811 ; [.28DE.0020.0002] # SYLOTI NAGRI LETTER TTHO +A812 ; [.28DF.0020.0002] # SYLOTI NAGRI LETTER DDO +A813 ; [.28E0.0020.0002] # SYLOTI NAGRI LETTER DDHO +A814 ; [.28E1.0020.0002] # SYLOTI NAGRI LETTER TO +A815 ; [.28E2.0020.0002] # SYLOTI NAGRI LETTER THO +A816 ; [.28E3.0020.0002] # SYLOTI NAGRI LETTER DO +A817 ; [.28E4.0020.0002] # SYLOTI NAGRI LETTER DHO +A818 ; [.28E5.0020.0002] # SYLOTI NAGRI LETTER NO +A819 ; [.28E6.0020.0002] # SYLOTI NAGRI LETTER PO +A81A ; [.28E7.0020.0002] # SYLOTI NAGRI LETTER PHO +A81B ; [.28E8.0020.0002] # SYLOTI NAGRI LETTER BO +A81C ; [.28E9.0020.0002] # SYLOTI NAGRI LETTER BHO +A81D ; [.28EA.0020.0002] # SYLOTI NAGRI LETTER MO +A81E ; [.28EB.0020.0002] # SYLOTI NAGRI LETTER RO +A81F ; [.28EC.0020.0002] # SYLOTI NAGRI LETTER LO +A820 ; [.28ED.0020.0002] # SYLOTI NAGRI LETTER RRO +A821 ; [.28EE.0020.0002] # SYLOTI NAGRI LETTER SO +A822 ; [.28EF.0020.0002] # SYLOTI NAGRI LETTER HO +A823 ; [.28F0.0020.0002] # SYLOTI NAGRI VOWEL SIGN A +A824 ; [.28F1.0020.0002] # SYLOTI NAGRI VOWEL SIGN I +A825 ; [.28F2.0020.0002] # SYLOTI NAGRI VOWEL SIGN U +A826 ; [.28F3.0020.0002] # SYLOTI NAGRI VOWEL SIGN E +A827 ; [.28F4.0020.0002] # SYLOTI NAGRI VOWEL SIGN OO +A882 ; [.28F5.0020.0002] # SAURASHTRA LETTER A +A883 ; [.28F6.0020.0002] # SAURASHTRA LETTER AA +A884 ; [.28F7.0020.0002] # SAURASHTRA LETTER I +A885 ; [.28F8.0020.0002] # SAURASHTRA LETTER II +A886 ; [.28F9.0020.0002] # SAURASHTRA LETTER U +A887 ; [.28FA.0020.0002] # SAURASHTRA LETTER UU +A888 ; [.28FB.0020.0002] # SAURASHTRA LETTER VOCALIC R +A889 ; [.28FC.0020.0002] # SAURASHTRA LETTER VOCALIC RR +A88A ; [.28FD.0020.0002] # SAURASHTRA LETTER VOCALIC L +A88B ; [.28FE.0020.0002] # SAURASHTRA LETTER VOCALIC LL +A88C ; [.28FF.0020.0002] # SAURASHTRA LETTER E +A88D ; [.2900.0020.0002] # SAURASHTRA LETTER EE +A88E ; [.2901.0020.0002] # SAURASHTRA LETTER AI +A88F ; [.2902.0020.0002] # SAURASHTRA LETTER O +A890 ; [.2903.0020.0002] # SAURASHTRA LETTER OO +A891 ; [.2904.0020.0002] # SAURASHTRA LETTER AU +A892 ; [.2905.0020.0002] # SAURASHTRA LETTER KA +A893 ; [.2906.0020.0002] # SAURASHTRA LETTER KHA +A894 ; [.2907.0020.0002] # SAURASHTRA LETTER GA +A895 ; [.2908.0020.0002] # SAURASHTRA LETTER GHA +A896 ; [.2909.0020.0002] # SAURASHTRA LETTER NGA +A897 ; [.290A.0020.0002] # SAURASHTRA LETTER CA +A898 ; [.290B.0020.0002] # SAURASHTRA LETTER CHA +A899 ; [.290C.0020.0002] # SAURASHTRA LETTER JA +A89A ; [.290D.0020.0002] # SAURASHTRA LETTER JHA +A89B ; [.290E.0020.0002] # SAURASHTRA LETTER NYA +A89C ; [.290F.0020.0002] # SAURASHTRA LETTER TTA +A89D ; [.2910.0020.0002] # SAURASHTRA LETTER TTHA +A89E ; [.2911.0020.0002] # SAURASHTRA LETTER DDA +A89F ; [.2912.0020.0002] # SAURASHTRA LETTER DDHA +A8A0 ; [.2913.0020.0002] # SAURASHTRA LETTER NNA +A8A1 ; [.2914.0020.0002] # SAURASHTRA LETTER TA +A8A2 ; [.2915.0020.0002] # SAURASHTRA LETTER THA +A8A3 ; [.2916.0020.0002] # SAURASHTRA LETTER DA +A8A4 ; [.2917.0020.0002] # SAURASHTRA LETTER DHA +A8A5 ; [.2918.0020.0002] # SAURASHTRA LETTER NA +A8A6 ; [.2919.0020.0002] # SAURASHTRA LETTER PA +A8A7 ; [.291A.0020.0002] # SAURASHTRA LETTER PHA +A8A8 ; [.291B.0020.0002] # SAURASHTRA LETTER BA +A8A9 ; [.291C.0020.0002] # SAURASHTRA LETTER BHA +A8AA ; [.291D.0020.0002] # SAURASHTRA LETTER MA +A8AB ; [.291E.0020.0002] # SAURASHTRA LETTER YA +A8AC ; [.291F.0020.0002] # SAURASHTRA LETTER RA +A8AD ; [.2920.0020.0002] # SAURASHTRA LETTER LA +A8AE ; [.2921.0020.0002] # SAURASHTRA LETTER VA +A8AF ; [.2922.0020.0002] # SAURASHTRA LETTER SHA +A8B0 ; [.2923.0020.0002] # SAURASHTRA LETTER SSA +A8B1 ; [.2924.0020.0002] # SAURASHTRA LETTER SA +A8B2 ; [.2925.0020.0002] # SAURASHTRA LETTER HA +A8B3 ; [.2926.0020.0002] # SAURASHTRA LETTER LLA +A8B4 ; [.2927.0020.0002] # SAURASHTRA CONSONANT SIGN HAARU +A8B5 ; [.2928.0020.0002] # SAURASHTRA VOWEL SIGN AA +A8B6 ; [.2929.0020.0002] # SAURASHTRA VOWEL SIGN I +A8B7 ; [.292A.0020.0002] # SAURASHTRA VOWEL SIGN II +A8B8 ; [.292B.0020.0002] # SAURASHTRA VOWEL SIGN U +A8B9 ; [.292C.0020.0002] # SAURASHTRA VOWEL SIGN UU +A8BA ; [.292D.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC R +A8BB ; [.292E.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC RR +A8BC ; [.292F.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC L +A8BD ; [.2930.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC LL +A8BE ; [.2931.0020.0002] # SAURASHTRA VOWEL SIGN E +A8BF ; [.2932.0020.0002] # SAURASHTRA VOWEL SIGN EE +A8C0 ; [.2933.0020.0002] # SAURASHTRA VOWEL SIGN AI +A8C1 ; [.2934.0020.0002] # SAURASHTRA VOWEL SIGN O +A8C2 ; [.2935.0020.0002] # SAURASHTRA VOWEL SIGN OO +A8C3 ; [.2936.0020.0002] # SAURASHTRA VOWEL SIGN AU +A8C4 ; [.2937.0020.0002] # SAURASHTRA SIGN VIRAMA +11083 ; [.2938.0020.0002] # KAITHI LETTER A +11084 ; [.2939.0020.0002] # KAITHI LETTER AA +11085 ; [.293A.0020.0002] # KAITHI LETTER I +11086 ; [.293B.0020.0002] # KAITHI LETTER II +11087 ; [.293C.0020.0002] # KAITHI LETTER U +11088 ; [.293D.0020.0002] # KAITHI LETTER UU +11089 ; [.293E.0020.0002] # KAITHI LETTER E +1108A ; [.293F.0020.0002] # KAITHI LETTER AI +1108B ; [.2940.0020.0002] # KAITHI LETTER O +1108C ; [.2941.0020.0002] # KAITHI LETTER AU +1108D ; [.2942.0020.0002] # KAITHI LETTER KA +1108E ; [.2943.0020.0002] # KAITHI LETTER KHA +1108F ; [.2944.0020.0002] # KAITHI LETTER GA +11090 ; [.2945.0020.0002] # KAITHI LETTER GHA +11091 ; [.2946.0020.0002] # KAITHI LETTER NGA +11092 ; [.2947.0020.0002] # KAITHI LETTER CA +11093 ; [.2948.0020.0002] # KAITHI LETTER CHA +11094 ; [.2949.0020.0002] # KAITHI LETTER JA +11095 ; [.294A.0020.0002] # KAITHI LETTER JHA +11096 ; [.294B.0020.0002] # KAITHI LETTER NYA +11097 ; [.294C.0020.0002] # KAITHI LETTER TTA +11098 ; [.294D.0020.0002] # KAITHI LETTER TTHA +11099 ; [.294E.0020.0002] # KAITHI LETTER DDA +1109A ; [.294E.0020.0002][.0000.00BD.0002] # KAITHI LETTER DDDHA +1109B ; [.294F.0020.0002] # KAITHI LETTER DDHA +1109C ; [.294F.0020.0002][.0000.00BD.0002] # KAITHI LETTER RHA +1109D ; [.2950.0020.0002] # KAITHI LETTER NNA +1109E ; [.2951.0020.0002] # KAITHI LETTER TA +1109F ; [.2952.0020.0002] # KAITHI LETTER THA +110A0 ; [.2953.0020.0002] # KAITHI LETTER DA +110A1 ; [.2954.0020.0002] # KAITHI LETTER DHA +110A2 ; [.2955.0020.0002] # KAITHI LETTER NA +110A3 ; [.2956.0020.0002] # KAITHI LETTER PA +110A4 ; [.2957.0020.0002] # KAITHI LETTER PHA +110A5 ; [.2958.0020.0002] # KAITHI LETTER BA +110AB ; [.2958.0020.0002][.0000.00BD.0002] # KAITHI LETTER VA +110A6 ; [.2959.0020.0002] # KAITHI LETTER BHA +110A7 ; [.295A.0020.0002] # KAITHI LETTER MA +110A8 ; [.295B.0020.0002] # KAITHI LETTER YA +110A9 ; [.295C.0020.0002] # KAITHI LETTER RA +110AA ; [.295D.0020.0002] # KAITHI LETTER LA +110AC ; [.295E.0020.0002] # KAITHI LETTER SHA +110AD ; [.295F.0020.0002] # KAITHI LETTER SSA +110AE ; [.2960.0020.0002] # KAITHI LETTER SA +110AF ; [.2961.0020.0002] # KAITHI LETTER HA +110B0 ; [.2962.0020.0002] # KAITHI VOWEL SIGN AA +110B1 ; [.2963.0020.0002] # KAITHI VOWEL SIGN I +110B2 ; [.2964.0020.0002] # KAITHI VOWEL SIGN II +110B3 ; [.2965.0020.0002] # KAITHI VOWEL SIGN U +110B4 ; [.2966.0020.0002] # KAITHI VOWEL SIGN UU +110B5 ; [.2967.0020.0002] # KAITHI VOWEL SIGN E +110B6 ; [.2968.0020.0002] # KAITHI VOWEL SIGN AI +110B7 ; [.2969.0020.0002] # KAITHI VOWEL SIGN O +110B8 ; [.296A.0020.0002] # KAITHI VOWEL SIGN AU +110B9 ; [.296B.0020.0002] # KAITHI SIGN VIRAMA +11150 ; [.296C.0020.0002] # MAHAJANI LETTER A +11151 ; [.296D.0020.0002] # MAHAJANI LETTER I +11152 ; [.296E.0020.0002] # MAHAJANI LETTER U +11153 ; [.296F.0020.0002] # MAHAJANI LETTER E +11154 ; [.2970.0020.0002] # MAHAJANI LETTER O +11155 ; [.2971.0020.0002] # MAHAJANI LETTER KA +11156 ; [.2972.0020.0002] # MAHAJANI LETTER KHA +11157 ; [.2973.0020.0002] # MAHAJANI LETTER GA +11158 ; [.2974.0020.0002] # MAHAJANI LETTER GHA +11159 ; [.2975.0020.0002] # MAHAJANI LETTER CA +1115A ; [.2976.0020.0002] # MAHAJANI LETTER CHA +1115B ; [.2977.0020.0002] # MAHAJANI LETTER JA +1115C ; [.2978.0020.0002] # MAHAJANI LETTER JHA +1115D ; [.2979.0020.0002] # MAHAJANI LETTER NYA +1115E ; [.297A.0020.0002] # MAHAJANI LETTER TTA +1115F ; [.297B.0020.0002] # MAHAJANI LETTER TTHA +11160 ; [.297C.0020.0002] # MAHAJANI LETTER DDA +11161 ; [.297D.0020.0002] # MAHAJANI LETTER DDHA +11162 ; [.297E.0020.0002] # MAHAJANI LETTER NNA +11163 ; [.297F.0020.0002] # MAHAJANI LETTER TA +11164 ; [.2980.0020.0002] # MAHAJANI LETTER THA +11165 ; [.2981.0020.0002] # MAHAJANI LETTER DA +11166 ; [.2982.0020.0002] # MAHAJANI LETTER DHA +11167 ; [.2983.0020.0002] # MAHAJANI LETTER NA +11168 ; [.2984.0020.0002] # MAHAJANI LETTER PA +11169 ; [.2985.0020.0002] # MAHAJANI LETTER PHA +1116A ; [.2986.0020.0002] # MAHAJANI LETTER BA +1116B ; [.2987.0020.0002] # MAHAJANI LETTER BHA +1116C ; [.2988.0020.0002] # MAHAJANI LETTER MA +1116D ; [.2989.0020.0002] # MAHAJANI LETTER RA +1116E ; [.298A.0020.0002] # MAHAJANI LETTER LA +1116F ; [.298B.0020.0002] # MAHAJANI LETTER VA +11176 ; [.298C.0020.0002] # MAHAJANI LIGATURE SHRI +11170 ; [.298D.0020.0002] # MAHAJANI LETTER SA +11171 ; [.298E.0020.0002] # MAHAJANI LETTER HA +11172 ; [.298F.0020.0002] # MAHAJANI LETTER RRA +111C4 ; [.2990.0020.0002] # SHARADA OM +111DA ; [.2991.0020.0002] # SHARADA EKAM +11183 ; [.2992.0020.0002] # SHARADA LETTER A +11184 ; [.2993.0020.0002] # SHARADA LETTER AA +11185 ; [.2994.0020.0002] # SHARADA LETTER I +11186 ; [.2995.0020.0002] # SHARADA LETTER II +11187 ; [.2996.0020.0002] # SHARADA LETTER U +11188 ; [.2997.0020.0002] # SHARADA LETTER UU +11189 ; [.2998.0020.0002] # SHARADA LETTER VOCALIC R +1118A ; [.2999.0020.0002] # SHARADA LETTER VOCALIC RR +1118B ; [.299A.0020.0002] # SHARADA LETTER VOCALIC L +1118C ; [.299B.0020.0002] # SHARADA LETTER VOCALIC LL +1118D ; [.299C.0020.0002] # SHARADA LETTER E +1118E ; [.299D.0020.0002] # SHARADA LETTER AI +1118F ; [.299E.0020.0002] # SHARADA LETTER O +11190 ; [.299F.0020.0002] # SHARADA LETTER AU +11191 ; [.29A0.0020.0002] # SHARADA LETTER KA +11192 ; [.29A1.0020.0002] # SHARADA LETTER KHA +11193 ; [.29A2.0020.0002] # SHARADA LETTER GA +11194 ; [.29A3.0020.0002] # SHARADA LETTER GHA +11195 ; [.29A4.0020.0002] # SHARADA LETTER NGA +11196 ; [.29A5.0020.0002] # SHARADA LETTER CA +11197 ; [.29A6.0020.0002] # SHARADA LETTER CHA +11198 ; [.29A7.0020.0002] # SHARADA LETTER JA +11199 ; [.29A8.0020.0002] # SHARADA LETTER JHA +1119A ; [.29A9.0020.0002] # SHARADA LETTER NYA +1119B ; [.29AA.0020.0002] # SHARADA LETTER TTA +1119C ; [.29AB.0020.0002] # SHARADA LETTER TTHA +1119D ; [.29AC.0020.0002] # SHARADA LETTER DDA +1119E ; [.29AD.0020.0002] # SHARADA LETTER DDHA +1119F ; [.29AE.0020.0002] # SHARADA LETTER NNA +111A0 ; [.29AF.0020.0002] # SHARADA LETTER TA +111A1 ; [.29B0.0020.0002] # SHARADA LETTER THA +111A2 ; [.29B1.0020.0002] # SHARADA LETTER DA +111A3 ; [.29B2.0020.0002] # SHARADA LETTER DHA +111A4 ; [.29B3.0020.0002] # SHARADA LETTER NA +111A5 ; [.29B4.0020.0002] # SHARADA LETTER PA +111A6 ; [.29B5.0020.0002] # SHARADA LETTER PHA +111A7 ; [.29B6.0020.0002] # SHARADA LETTER BA +111A8 ; [.29B7.0020.0002] # SHARADA LETTER BHA +111A9 ; [.29B8.0020.0002] # SHARADA LETTER MA +111AA ; [.29B9.0020.0002] # SHARADA LETTER YA +111AB ; [.29BA.0020.0002] # SHARADA LETTER RA +111AC ; [.29BB.0020.0002] # SHARADA LETTER LA +111AD ; [.29BC.0020.0002] # SHARADA LETTER LLA +111AE ; [.29BD.0020.0002] # SHARADA LETTER VA +111AF ; [.29BE.0020.0002] # SHARADA LETTER SHA +111B0 ; [.29BF.0020.0002] # SHARADA LETTER SSA +111B1 ; [.29C0.0020.0002] # SHARADA LETTER SA +111B2 ; [.29C1.0020.0002] # SHARADA LETTER HA +111C1 ; [.29C2.0020.0002] # SHARADA SIGN AVAGRAHA +111C2 ; [.29C3.0020.0002] # SHARADA SIGN JIHVAMULIYA +111C3 ; [.29C4.0020.0002] # SHARADA SIGN UPADHMANIYA +111DC ; [.29C5.0020.0002] # SHARADA HEADSTROKE +111B3 ; [.29C6.0020.0002] # SHARADA VOWEL SIGN AA +111B4 ; [.29C7.0020.0002] # SHARADA VOWEL SIGN I +111B5 ; [.29C8.0020.0002] # SHARADA VOWEL SIGN II +111B6 ; [.29C9.0020.0002] # SHARADA VOWEL SIGN U +111B7 ; [.29CA.0020.0002] # SHARADA VOWEL SIGN UU +111B8 ; [.29CB.0020.0002] # SHARADA VOWEL SIGN VOCALIC R +111B9 ; [.29CC.0020.0002] # SHARADA VOWEL SIGN VOCALIC RR +111BA ; [.29CD.0020.0002] # SHARADA VOWEL SIGN VOCALIC L +111BB ; [.29CE.0020.0002] # SHARADA VOWEL SIGN VOCALIC LL +111BC ; [.29CF.0020.0002] # SHARADA VOWEL SIGN E +111BD ; [.29D0.0020.0002] # SHARADA VOWEL SIGN AI +111BE ; [.29D1.0020.0002] # SHARADA VOWEL SIGN O +111BF ; [.29D2.0020.0002] # SHARADA VOWEL SIGN AU +111C0 ; [.29D3.0020.0002] # SHARADA SIGN VIRAMA +11200 ; [.29D4.0020.0002] # KHOJKI LETTER A +11201 ; [.29D5.0020.0002] # KHOJKI LETTER AA +11202 ; [.29D6.0020.0002] # KHOJKI LETTER I +11203 ; [.29D7.0020.0002] # KHOJKI LETTER U +11204 ; [.29D8.0020.0002] # KHOJKI LETTER E +11205 ; [.29D9.0020.0002] # KHOJKI LETTER AI +11206 ; [.29DA.0020.0002] # KHOJKI LETTER O +11207 ; [.29DB.0020.0002] # KHOJKI LETTER AU +11208 ; [.29DC.0020.0002] # KHOJKI LETTER KA +11209 ; [.29DD.0020.0002] # KHOJKI LETTER KHA +1120A ; [.29DE.0020.0002] # KHOJKI LETTER GA +1120B ; [.29DF.0020.0002] # KHOJKI LETTER GGA +1120C ; [.29E0.0020.0002] # KHOJKI LETTER GHA +1120D ; [.29E1.0020.0002] # KHOJKI LETTER NGA +1120E ; [.29E2.0020.0002] # KHOJKI LETTER CA +1120F ; [.29E3.0020.0002] # KHOJKI LETTER CHA +11210 ; [.29E4.0020.0002] # KHOJKI LETTER JA +11211 ; [.29E5.0020.0002] # KHOJKI LETTER JJA +11213 ; [.29E6.0020.0002] # KHOJKI LETTER NYA +11214 ; [.29E7.0020.0002] # KHOJKI LETTER TTA +11215 ; [.29E8.0020.0002] # KHOJKI LETTER TTHA +11216 ; [.29E9.0020.0002] # KHOJKI LETTER DDA +11217 ; [.29EA.0020.0002] # KHOJKI LETTER DDHA +11218 ; [.29EB.0020.0002] # KHOJKI LETTER NNA +11219 ; [.29EC.0020.0002] # KHOJKI LETTER TA +1121A ; [.29ED.0020.0002] # KHOJKI LETTER THA +1121B ; [.29EE.0020.0002] # KHOJKI LETTER DA +1121C ; [.29EF.0020.0002] # KHOJKI LETTER DDDA +1121D ; [.29F0.0020.0002] # KHOJKI LETTER DHA +1121E ; [.29F1.0020.0002] # KHOJKI LETTER NA +1121F ; [.29F2.0020.0002] # KHOJKI LETTER PA +11220 ; [.29F3.0020.0002] # KHOJKI LETTER PHA +11221 ; [.29F4.0020.0002] # KHOJKI LETTER BA +11222 ; [.29F5.0020.0002] # KHOJKI LETTER BBA +11223 ; [.29F6.0020.0002] # KHOJKI LETTER BHA +11224 ; [.29F7.0020.0002] # KHOJKI LETTER MA +11225 ; [.29F8.0020.0002] # KHOJKI LETTER YA +11226 ; [.29F9.0020.0002] # KHOJKI LETTER RA +11227 ; [.29FA.0020.0002] # KHOJKI LETTER LA +11228 ; [.29FB.0020.0002] # KHOJKI LETTER VA +11229 ; [.29FC.0020.0002] # KHOJKI LETTER SA +1122A ; [.29FD.0020.0002] # KHOJKI LETTER HA +1122B ; [.29FE.0020.0002] # KHOJKI LETTER LLA +1122C ; [.29FF.0020.0002] # KHOJKI VOWEL SIGN AA +1122D ; [.2A00.0020.0002] # KHOJKI VOWEL SIGN I +1122E ; [.2A01.0020.0002] # KHOJKI VOWEL SIGN II +1122F ; [.2A02.0020.0002] # KHOJKI VOWEL SIGN U +11230 ; [.2A03.0020.0002] # KHOJKI VOWEL SIGN E +11231 ; [.2A04.0020.0002] # KHOJKI VOWEL SIGN AI +11232 ; [.2A05.0020.0002] # KHOJKI VOWEL SIGN O +11233 ; [.2A06.0020.0002] # KHOJKI VOWEL SIGN AU +11235 ; [.2A07.0020.0002] # KHOJKI SIGN VIRAMA +112B0 ; [.2A08.0020.0002] # KHUDAWADI LETTER A +112B1 ; [.2A09.0020.0002] # KHUDAWADI LETTER AA +112B2 ; [.2A0A.0020.0002] # KHUDAWADI LETTER I +112B3 ; [.2A0B.0020.0002] # KHUDAWADI LETTER II +112B4 ; [.2A0C.0020.0002] # KHUDAWADI LETTER U +112B5 ; [.2A0D.0020.0002] # KHUDAWADI LETTER UU +112B6 ; [.2A0E.0020.0002] # KHUDAWADI LETTER E +112B7 ; [.2A0F.0020.0002] # KHUDAWADI LETTER AI +112B8 ; [.2A10.0020.0002] # KHUDAWADI LETTER O +112B9 ; [.2A11.0020.0002] # KHUDAWADI LETTER AU +112BA ; [.2A12.0020.0002] # KHUDAWADI LETTER KA +112BB ; [.2A13.0020.0002] # KHUDAWADI LETTER KHA +112BC ; [.2A14.0020.0002] # KHUDAWADI LETTER GA +112BD ; [.2A15.0020.0002] # KHUDAWADI LETTER GGA +112BE ; [.2A16.0020.0002] # KHUDAWADI LETTER GHA +112BF ; [.2A17.0020.0002] # KHUDAWADI LETTER NGA +112C0 ; [.2A18.0020.0002] # KHUDAWADI LETTER CA +112C1 ; [.2A19.0020.0002] # KHUDAWADI LETTER CHA +112C2 ; [.2A1A.0020.0002] # KHUDAWADI LETTER JA +112C3 ; [.2A1B.0020.0002] # KHUDAWADI LETTER JJA +112C4 ; [.2A1C.0020.0002] # KHUDAWADI LETTER JHA +112C5 ; [.2A1D.0020.0002] # KHUDAWADI LETTER NYA +112C6 ; [.2A1E.0020.0002] # KHUDAWADI LETTER TTA +112C7 ; [.2A1F.0020.0002] # KHUDAWADI LETTER TTHA +112C8 ; [.2A20.0020.0002] # KHUDAWADI LETTER DDA +112C9 ; [.2A21.0020.0002] # KHUDAWADI LETTER DDDA +112CA ; [.2A22.0020.0002] # KHUDAWADI LETTER RRA +112CB ; [.2A23.0020.0002] # KHUDAWADI LETTER DDHA +112CC ; [.2A24.0020.0002] # KHUDAWADI LETTER NNA +112CD ; [.2A25.0020.0002] # KHUDAWADI LETTER TA +112CE ; [.2A26.0020.0002] # KHUDAWADI LETTER THA +112CF ; [.2A27.0020.0002] # KHUDAWADI LETTER DA +112D0 ; [.2A28.0020.0002] # KHUDAWADI LETTER DHA +112D1 ; [.2A29.0020.0002] # KHUDAWADI LETTER NA +112D2 ; [.2A2A.0020.0002] # KHUDAWADI LETTER PA +112D3 ; [.2A2B.0020.0002] # KHUDAWADI LETTER PHA +112D4 ; [.2A2C.0020.0002] # KHUDAWADI LETTER BA +112D5 ; [.2A2D.0020.0002] # KHUDAWADI LETTER BBA +112D6 ; [.2A2E.0020.0002] # KHUDAWADI LETTER BHA +112D7 ; [.2A2F.0020.0002] # KHUDAWADI LETTER MA +112D8 ; [.2A30.0020.0002] # KHUDAWADI LETTER YA +112D9 ; [.2A31.0020.0002] # KHUDAWADI LETTER RA +112DA ; [.2A32.0020.0002] # KHUDAWADI LETTER LA +112DB ; [.2A33.0020.0002] # KHUDAWADI LETTER VA +112DC ; [.2A34.0020.0002] # KHUDAWADI LETTER SHA +112DD ; [.2A35.0020.0002] # KHUDAWADI LETTER SA +112DE ; [.2A36.0020.0002] # KHUDAWADI LETTER HA +112E0 ; [.2A37.0020.0002] # KHUDAWADI VOWEL SIGN AA +112E1 ; [.2A38.0020.0002] # KHUDAWADI VOWEL SIGN I +112E2 ; [.2A39.0020.0002] # KHUDAWADI VOWEL SIGN II +112E3 ; [.2A3A.0020.0002] # KHUDAWADI VOWEL SIGN U +112E4 ; [.2A3B.0020.0002] # KHUDAWADI VOWEL SIGN UU +112E5 ; [.2A3C.0020.0002] # KHUDAWADI VOWEL SIGN E +112E6 ; [.2A3D.0020.0002] # KHUDAWADI VOWEL SIGN AI +112E7 ; [.2A3E.0020.0002] # KHUDAWADI VOWEL SIGN O +112E8 ; [.2A3F.0020.0002] # KHUDAWADI VOWEL SIGN AU +112EA ; [.2A40.0020.0002] # KHUDAWADI SIGN VIRAMA +11280 ; [.2A41.0020.0002] # MULTANI LETTER A +11281 ; [.2A42.0020.0002] # MULTANI LETTER I +11282 ; [.2A43.0020.0002] # MULTANI LETTER U +11283 ; [.2A44.0020.0002] # MULTANI LETTER E +112A5 ; [.2A45.0020.0002] # MULTANI LETTER SA +112A6 ; [.2A46.0020.0002] # MULTANI LETTER HA +11284 ; [.2A47.0020.0002] # MULTANI LETTER KA +11285 ; [.2A48.0020.0002] # MULTANI LETTER KHA +11286 ; [.2A49.0020.0002] # MULTANI LETTER GA +11288 ; [.2A4A.0020.0002] # MULTANI LETTER GHA +1128A ; [.2A4B.0020.0002] # MULTANI LETTER CA +1128B ; [.2A4C.0020.0002] # MULTANI LETTER CHA +1128C ; [.2A4D.0020.0002] # MULTANI LETTER JA +1128D ; [.2A4E.0020.0002] # MULTANI LETTER JJA +1128F ; [.2A4F.0020.0002] # MULTANI LETTER NYA +11290 ; [.2A50.0020.0002] # MULTANI LETTER TTA +11291 ; [.2A51.0020.0002] # MULTANI LETTER TTHA +11292 ; [.2A52.0020.0002] # MULTANI LETTER DDA +11293 ; [.2A53.0020.0002] # MULTANI LETTER DDDA +11294 ; [.2A54.0020.0002] # MULTANI LETTER DDHA +11295 ; [.2A55.0020.0002] # MULTANI LETTER NNA +11296 ; [.2A56.0020.0002] # MULTANI LETTER TA +11297 ; [.2A57.0020.0002] # MULTANI LETTER THA +11298 ; [.2A58.0020.0002] # MULTANI LETTER DA +11299 ; [.2A59.0020.0002] # MULTANI LETTER DHA +1129A ; [.2A5A.0020.0002] # MULTANI LETTER NA +1129B ; [.2A5B.0020.0002] # MULTANI LETTER PA +1129C ; [.2A5C.0020.0002] # MULTANI LETTER PHA +1129D ; [.2A5D.0020.0002] # MULTANI LETTER BA +1129F ; [.2A5E.0020.0002] # MULTANI LETTER BHA +112A0 ; [.2A5F.0020.0002] # MULTANI LETTER MA +112A1 ; [.2A60.0020.0002] # MULTANI LETTER YA +112A2 ; [.2A61.0020.0002] # MULTANI LETTER RA +112A3 ; [.2A62.0020.0002] # MULTANI LETTER LA +112A4 ; [.2A63.0020.0002] # MULTANI LETTER VA +112A7 ; [.2A64.0020.0002] # MULTANI LETTER RRA +112A8 ; [.2A65.0020.0002] # MULTANI LETTER RHA +11350 ; [.2A66.0020.0002] # GRANTHA OM +11305 ; [.2A67.0020.0002] # GRANTHA LETTER A +11306 ; [.2A68.0020.0002] # GRANTHA LETTER AA +11307 ; [.2A69.0020.0002] # GRANTHA LETTER I +11308 ; [.2A6A.0020.0002] # GRANTHA LETTER II +11309 ; [.2A6B.0020.0002] # GRANTHA LETTER U +1130A ; [.2A6C.0020.0002] # GRANTHA LETTER UU +1130B ; [.2A6D.0020.0002] # GRANTHA LETTER VOCALIC R +11360 ; [.2A6E.0020.0002] # GRANTHA LETTER VOCALIC RR +1130C ; [.2A6F.0020.0002] # GRANTHA LETTER VOCALIC L +11361 ; [.2A70.0020.0002] # GRANTHA LETTER VOCALIC LL +1130F ; [.2A71.0020.0002] # GRANTHA LETTER EE +11310 ; [.2A72.0020.0002] # GRANTHA LETTER AI +11313 ; [.2A73.0020.0002] # GRANTHA LETTER OO +11314 ; [.2A74.0020.0002] # GRANTHA LETTER AU +11315 ; [.2A75.0020.0002] # GRANTHA LETTER KA +11316 ; [.2A76.0020.0002] # GRANTHA LETTER KHA +11317 ; [.2A77.0020.0002] # GRANTHA LETTER GA +11318 ; [.2A78.0020.0002] # GRANTHA LETTER GHA +11319 ; [.2A79.0020.0002] # GRANTHA LETTER NGA +1131A ; [.2A7A.0020.0002] # GRANTHA LETTER CA +1131B ; [.2A7B.0020.0002] # GRANTHA LETTER CHA +1131C ; [.2A7C.0020.0002] # GRANTHA LETTER JA +1131D ; [.2A7D.0020.0002] # GRANTHA LETTER JHA +1131E ; [.2A7E.0020.0002] # GRANTHA LETTER NYA +1131F ; [.2A7F.0020.0002] # GRANTHA LETTER TTA +11320 ; [.2A80.0020.0002] # GRANTHA LETTER TTHA +11321 ; [.2A81.0020.0002] # GRANTHA LETTER DDA +11322 ; [.2A82.0020.0002] # GRANTHA LETTER DDHA +11323 ; [.2A83.0020.0002] # GRANTHA LETTER NNA +11324 ; [.2A84.0020.0002] # GRANTHA LETTER TA +11325 ; [.2A85.0020.0002] # GRANTHA LETTER THA +11326 ; [.2A86.0020.0002] # GRANTHA LETTER DA +11327 ; [.2A87.0020.0002] # GRANTHA LETTER DHA +11328 ; [.2A88.0020.0002] # GRANTHA LETTER NA +1132A ; [.2A89.0020.0002] # GRANTHA LETTER PA +1132B ; [.2A8A.0020.0002] # GRANTHA LETTER PHA +1132C ; [.2A8B.0020.0002] # GRANTHA LETTER BA +1132D ; [.2A8C.0020.0002] # GRANTHA LETTER BHA +1132E ; [.2A8D.0020.0002] # GRANTHA LETTER MA +1132F ; [.2A8E.0020.0002] # GRANTHA LETTER YA +11330 ; [.2A8F.0020.0002] # GRANTHA LETTER RA +11332 ; [.2A90.0020.0002] # GRANTHA LETTER LA +11333 ; [.2A91.0020.0002] # GRANTHA LETTER LLA +11335 ; [.2A92.0020.0002] # GRANTHA LETTER VA +11336 ; [.2A93.0020.0002] # GRANTHA LETTER SHA +11337 ; [.2A94.0020.0002] # GRANTHA LETTER SSA +11338 ; [.2A95.0020.0002] # GRANTHA LETTER SA +11339 ; [.2A96.0020.0002] # GRANTHA LETTER HA +1133D ; [.2A97.0020.0002] # GRANTHA SIGN AVAGRAHA +1135E ; [.2A98.0020.0002] # GRANTHA LETTER VEDIC ANUSVARA +1135F ; [.2A99.0020.0002] # GRANTHA LETTER VEDIC DOUBLE ANUSVARA +1133E ; [.2A9A.0020.0002] # GRANTHA VOWEL SIGN AA +1133F ; [.2A9B.0020.0002] # GRANTHA VOWEL SIGN I +11340 ; [.2A9C.0020.0002] # GRANTHA VOWEL SIGN II +11341 ; [.2A9D.0020.0002] # GRANTHA VOWEL SIGN U +11342 ; [.2A9E.0020.0002] # GRANTHA VOWEL SIGN UU +11343 ; [.2A9F.0020.0002] # GRANTHA VOWEL SIGN VOCALIC R +11344 ; [.2AA0.0020.0002] # GRANTHA VOWEL SIGN VOCALIC RR +11362 ; [.2AA1.0020.0002] # GRANTHA VOWEL SIGN VOCALIC L +11363 ; [.2AA2.0020.0002] # GRANTHA VOWEL SIGN VOCALIC LL +11347 ; [.2AA3.0020.0002] # GRANTHA VOWEL SIGN EE +11348 ; [.2AA4.0020.0002] # GRANTHA VOWEL SIGN AI +1134B ; [.2AA5.0020.0002] # GRANTHA VOWEL SIGN OO +11347 1133E ; [.2AA5.0020.0002] # GRANTHA VOWEL SIGN OO +1134C ; [.2AA6.0020.0002] # GRANTHA VOWEL SIGN AU +11347 11357 ; [.2AA6.0020.0002] # GRANTHA VOWEL SIGN AU +1134D ; [.2AA7.0020.0002] # GRANTHA SIGN VIRAMA +11357 ; [.2AA8.0020.0002] # GRANTHA AU LENGTH MARK +1135D ; [.2AA9.0020.0002] # GRANTHA SIGN PLUTA +114C7 ; [.2AAA.0020.0002] # TIRHUTA OM +11480 ; [.2AAB.0020.0002] # TIRHUTA ANJI +11481 ; [.2AAC.0020.0002] # TIRHUTA LETTER A +11482 ; [.2AAD.0020.0002] # TIRHUTA LETTER AA +11483 ; [.2AAE.0020.0002] # TIRHUTA LETTER I +11484 ; [.2AAF.0020.0002] # TIRHUTA LETTER II +11485 ; [.2AB0.0020.0002] # TIRHUTA LETTER U +11486 ; [.2AB1.0020.0002] # TIRHUTA LETTER UU +11487 ; [.2AB2.0020.0002] # TIRHUTA LETTER VOCALIC R +11488 ; [.2AB3.0020.0002] # TIRHUTA LETTER VOCALIC RR +11489 ; [.2AB4.0020.0002] # TIRHUTA LETTER VOCALIC L +1148A ; [.2AB5.0020.0002] # TIRHUTA LETTER VOCALIC LL +1148B ; [.2AB6.0020.0002] # TIRHUTA LETTER E +1148C ; [.2AB7.0020.0002] # TIRHUTA LETTER AI +1148D ; [.2AB8.0020.0002] # TIRHUTA LETTER O +1148E ; [.2AB9.0020.0002] # TIRHUTA LETTER AU +1148F ; [.2ABA.0020.0002] # TIRHUTA LETTER KA +11490 ; [.2ABB.0020.0002] # TIRHUTA LETTER KHA +11491 ; [.2ABC.0020.0002] # TIRHUTA LETTER GA +11492 ; [.2ABD.0020.0002] # TIRHUTA LETTER GHA +11493 ; [.2ABE.0020.0002] # TIRHUTA LETTER NGA +11494 ; [.2ABF.0020.0002] # TIRHUTA LETTER CA +11495 ; [.2AC0.0020.0002] # TIRHUTA LETTER CHA +11496 ; [.2AC1.0020.0002] # TIRHUTA LETTER JA +11497 ; [.2AC2.0020.0002] # TIRHUTA LETTER JHA +11498 ; [.2AC3.0020.0002] # TIRHUTA LETTER NYA +11499 ; [.2AC4.0020.0002] # TIRHUTA LETTER TTA +1149A ; [.2AC5.0020.0002] # TIRHUTA LETTER TTHA +1149B ; [.2AC6.0020.0002] # TIRHUTA LETTER DDA +1149C ; [.2AC7.0020.0002] # TIRHUTA LETTER DDHA +1149D ; [.2AC8.0020.0002] # TIRHUTA LETTER NNA +1149E ; [.2AC9.0020.0002] # TIRHUTA LETTER TA +1149F ; [.2ACA.0020.0002] # TIRHUTA LETTER THA +114A0 ; [.2ACB.0020.0002] # TIRHUTA LETTER DA +114A1 ; [.2ACC.0020.0002] # TIRHUTA LETTER DHA +114A2 ; [.2ACD.0020.0002] # TIRHUTA LETTER NA +114A3 ; [.2ACE.0020.0002] # TIRHUTA LETTER PA +114A4 ; [.2ACF.0020.0002] # TIRHUTA LETTER PHA +114A5 ; [.2AD0.0020.0002] # TIRHUTA LETTER BA +114A6 ; [.2AD1.0020.0002] # TIRHUTA LETTER BHA +114A7 ; [.2AD2.0020.0002] # TIRHUTA LETTER MA +114A8 ; [.2AD3.0020.0002] # TIRHUTA LETTER YA +114A9 ; [.2AD4.0020.0002] # TIRHUTA LETTER RA +114AA ; [.2AD5.0020.0002] # TIRHUTA LETTER LA +114AB ; [.2AD6.0020.0002] # TIRHUTA LETTER VA +114AC ; [.2AD7.0020.0002] # TIRHUTA LETTER SHA +114AD ; [.2AD8.0020.0002] # TIRHUTA LETTER SSA +114AE ; [.2AD9.0020.0002] # TIRHUTA LETTER SA +114AF ; [.2ADA.0020.0002] # TIRHUTA LETTER HA +114C4 ; [.2ADB.0020.0002] # TIRHUTA SIGN AVAGRAHA +114C5 ; [.2ADC.0020.0002] # TIRHUTA GVANG +114B0 ; [.2ADD.0020.0002] # TIRHUTA VOWEL SIGN AA +114B1 ; [.2ADE.0020.0002] # TIRHUTA VOWEL SIGN I +114B2 ; [.2ADF.0020.0002] # TIRHUTA VOWEL SIGN II +114B3 ; [.2AE0.0020.0002] # TIRHUTA VOWEL SIGN U +114B4 ; [.2AE1.0020.0002] # TIRHUTA VOWEL SIGN UU +114B5 ; [.2AE2.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC R +114B6 ; [.2AE3.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC RR +114B7 ; [.2AE4.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC L +114B8 ; [.2AE5.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; [.2AE6.0020.0002] # TIRHUTA VOWEL SIGN E +114BA ; [.2AE7.0020.0002] # TIRHUTA VOWEL SIGN SHORT E +114BB ; [.2AE8.0020.0002] # TIRHUTA VOWEL SIGN AI +114B9 114BA ; [.2AE8.0020.0002] # TIRHUTA VOWEL SIGN AI +114BC ; [.2AE9.0020.0002] # TIRHUTA VOWEL SIGN O +114B9 114B0 ; [.2AE9.0020.0002] # TIRHUTA VOWEL SIGN O +114BD ; [.2AEA.0020.0002] # TIRHUTA VOWEL SIGN SHORT O +114BE ; [.2AEB.0020.0002] # TIRHUTA VOWEL SIGN AU +114B9 114BD ; [.2AEB.0020.0002] # TIRHUTA VOWEL SIGN AU +114C2 ; [.2AEC.0020.0002] # TIRHUTA SIGN VIRAMA +11580 ; [.2AED.0020.0002] # SIDDHAM LETTER A +11581 ; [.2AEE.0020.0002] # SIDDHAM LETTER AA +11582 ; [.2AEF.0020.0002] # SIDDHAM LETTER I +115D8 ; [.2AEF.0020.0004][.0000.010B.0004] # SIDDHAM LETTER THREE-CIRCLE ALTERNATE I +115D9 ; [.2AEF.0020.0004][.0000.010C.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE I +11583 ; [.2AF0.0020.0002] # SIDDHAM LETTER II +115DA ; [.2AF0.0020.0004][.0000.010B.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE II +11584 ; [.2AF1.0020.0002] # SIDDHAM LETTER U +115DB ; [.2AF1.0020.0004][.0000.010B.0004] # SIDDHAM LETTER ALTERNATE U +11585 ; [.2AF2.0020.0002] # SIDDHAM LETTER UU +11586 ; [.2AF3.0020.0002] # SIDDHAM LETTER VOCALIC R +11587 ; [.2AF4.0020.0002] # SIDDHAM LETTER VOCALIC RR +11588 ; [.2AF5.0020.0002] # SIDDHAM LETTER VOCALIC L +11589 ; [.2AF6.0020.0002] # SIDDHAM LETTER VOCALIC LL +1158A ; [.2AF7.0020.0002] # SIDDHAM LETTER E +1158B ; [.2AF8.0020.0002] # SIDDHAM LETTER AI +1158C ; [.2AF9.0020.0002] # SIDDHAM LETTER O +1158D ; [.2AFA.0020.0002] # SIDDHAM LETTER AU +1158E ; [.2AFB.0020.0002] # SIDDHAM LETTER KA +1158F ; [.2AFC.0020.0002] # SIDDHAM LETTER KHA +11590 ; [.2AFD.0020.0002] # SIDDHAM LETTER GA +11591 ; [.2AFE.0020.0002] # SIDDHAM LETTER GHA +11592 ; [.2AFF.0020.0002] # SIDDHAM LETTER NGA +11593 ; [.2B00.0020.0002] # SIDDHAM LETTER CA +11594 ; [.2B01.0020.0002] # SIDDHAM LETTER CHA +11595 ; [.2B02.0020.0002] # SIDDHAM LETTER JA +11596 ; [.2B03.0020.0002] # SIDDHAM LETTER JHA +11597 ; [.2B04.0020.0002] # SIDDHAM LETTER NYA +11598 ; [.2B05.0020.0002] # SIDDHAM LETTER TTA +11599 ; [.2B06.0020.0002] # SIDDHAM LETTER TTHA +1159A ; [.2B07.0020.0002] # SIDDHAM LETTER DDA +1159B ; [.2B08.0020.0002] # SIDDHAM LETTER DDHA +1159C ; [.2B09.0020.0002] # SIDDHAM LETTER NNA +1159D ; [.2B0A.0020.0002] # SIDDHAM LETTER TA +1159E ; [.2B0B.0020.0002] # SIDDHAM LETTER THA +1159F ; [.2B0C.0020.0002] # SIDDHAM LETTER DA +115A0 ; [.2B0D.0020.0002] # SIDDHAM LETTER DHA +115A1 ; [.2B0E.0020.0002] # SIDDHAM LETTER NA +115A2 ; [.2B0F.0020.0002] # SIDDHAM LETTER PA +115A3 ; [.2B10.0020.0002] # SIDDHAM LETTER PHA +115A4 ; [.2B11.0020.0002] # SIDDHAM LETTER BA +115A5 ; [.2B12.0020.0002] # SIDDHAM LETTER BHA +115A6 ; [.2B13.0020.0002] # SIDDHAM LETTER MA +115A7 ; [.2B14.0020.0002] # SIDDHAM LETTER YA +115A8 ; [.2B15.0020.0002] # SIDDHAM LETTER RA +115A9 ; [.2B16.0020.0002] # SIDDHAM LETTER LA +115AA ; [.2B17.0020.0002] # SIDDHAM LETTER VA +115AB ; [.2B18.0020.0002] # SIDDHAM LETTER SHA +115AC ; [.2B19.0020.0002] # SIDDHAM LETTER SSA +115AD ; [.2B1A.0020.0002] # SIDDHAM LETTER SA +115AE ; [.2B1B.0020.0002] # SIDDHAM LETTER HA +115AF ; [.2B1C.0020.0002] # SIDDHAM VOWEL SIGN AA +115B0 ; [.2B1D.0020.0002] # SIDDHAM VOWEL SIGN I +115B1 ; [.2B1E.0020.0002] # SIDDHAM VOWEL SIGN II +115B2 ; [.2B1F.0020.0002] # SIDDHAM VOWEL SIGN U +115DC ; [.2B1F.0020.0004][.0000.010B.0004] # SIDDHAM VOWEL SIGN ALTERNATE U +115B3 ; [.2B20.0020.0002] # SIDDHAM VOWEL SIGN UU +115DD ; [.2B20.0020.0004][.0000.010B.0004] # SIDDHAM VOWEL SIGN ALTERNATE UU +115B4 ; [.2B21.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC R +115B5 ; [.2B22.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC RR +115B8 ; [.2B23.0020.0002] # SIDDHAM VOWEL SIGN E +115B9 ; [.2B24.0020.0002] # SIDDHAM VOWEL SIGN AI +115BA ; [.2B25.0020.0002] # SIDDHAM VOWEL SIGN O +115B8 115AF ; [.2B25.0020.0002] # SIDDHAM VOWEL SIGN O +115BB ; [.2B26.0020.0002] # SIDDHAM VOWEL SIGN AU +115B9 115AF ; [.2B26.0020.0002] # SIDDHAM VOWEL SIGN AU +115BF ; [.2B27.0020.0002] # SIDDHAM SIGN VIRAMA +11600 ; [.2B28.0020.0002] # MODI LETTER A +11601 ; [.2B29.0020.0002] # MODI LETTER AA +11602 ; [.2B2A.0020.0002] # MODI LETTER I +11603 ; [.2B2B.0020.0002] # MODI LETTER II +11604 ; [.2B2C.0020.0002] # MODI LETTER U +11605 ; [.2B2D.0020.0002] # MODI LETTER UU +11606 ; [.2B2E.0020.0002] # MODI LETTER VOCALIC R +11607 ; [.2B2F.0020.0002] # MODI LETTER VOCALIC RR +11608 ; [.2B30.0020.0002] # MODI LETTER VOCALIC L +11609 ; [.2B31.0020.0002] # MODI LETTER VOCALIC LL +1160A ; [.2B32.0020.0002] # MODI LETTER E +1160B ; [.2B33.0020.0002] # MODI LETTER AI +1160C ; [.2B34.0020.0002] # MODI LETTER O +1160D ; [.2B35.0020.0002] # MODI LETTER AU +1160E ; [.2B36.0020.0002] # MODI LETTER KA +1160F ; [.2B37.0020.0002] # MODI LETTER KHA +11610 ; [.2B38.0020.0002] # MODI LETTER GA +11611 ; [.2B39.0020.0002] # MODI LETTER GHA +11612 ; [.2B3A.0020.0002] # MODI LETTER NGA +11613 ; [.2B3B.0020.0002] # MODI LETTER CA +11614 ; [.2B3C.0020.0002] # MODI LETTER CHA +11615 ; [.2B3D.0020.0002] # MODI LETTER JA +11616 ; [.2B3E.0020.0002] # MODI LETTER JHA +11617 ; [.2B3F.0020.0002] # MODI LETTER NYA +11618 ; [.2B40.0020.0002] # MODI LETTER TTA +11619 ; [.2B41.0020.0002] # MODI LETTER TTHA +1161A ; [.2B42.0020.0002] # MODI LETTER DDA +1161B ; [.2B43.0020.0002] # MODI LETTER DDHA +1161C ; [.2B44.0020.0002] # MODI LETTER NNA +1161D ; [.2B45.0020.0002] # MODI LETTER TA +1161E ; [.2B46.0020.0002] # MODI LETTER THA +1161F ; [.2B47.0020.0002] # MODI LETTER DA +11620 ; [.2B48.0020.0002] # MODI LETTER DHA +11621 ; [.2B49.0020.0002] # MODI LETTER NA +11622 ; [.2B4A.0020.0002] # MODI LETTER PA +11623 ; [.2B4B.0020.0002] # MODI LETTER PHA +11624 ; [.2B4C.0020.0002] # MODI LETTER BA +11625 ; [.2B4D.0020.0002] # MODI LETTER BHA +11626 ; [.2B4E.0020.0002] # MODI LETTER MA +11627 ; [.2B4F.0020.0002] # MODI LETTER YA +11628 ; [.2B50.0020.0002] # MODI LETTER RA +11629 ; [.2B51.0020.0002] # MODI LETTER LA +1162A ; [.2B52.0020.0002] # MODI LETTER VA +1162B ; [.2B53.0020.0002] # MODI LETTER SHA +1162C ; [.2B54.0020.0002] # MODI LETTER SSA +1162D ; [.2B55.0020.0002] # MODI LETTER SA +1162E ; [.2B56.0020.0002] # MODI LETTER HA +1162F ; [.2B57.0020.0002] # MODI LETTER LLA +11630 ; [.2B58.0020.0002] # MODI VOWEL SIGN AA +11631 ; [.2B59.0020.0002] # MODI VOWEL SIGN I +11632 ; [.2B5A.0020.0002] # MODI VOWEL SIGN II +11633 ; [.2B5B.0020.0002] # MODI VOWEL SIGN U +11634 ; [.2B5C.0020.0002] # MODI VOWEL SIGN UU +11635 ; [.2B5D.0020.0002] # MODI VOWEL SIGN VOCALIC R +11636 ; [.2B5E.0020.0002] # MODI VOWEL SIGN VOCALIC RR +11637 ; [.2B5F.0020.0002] # MODI VOWEL SIGN VOCALIC L +11638 ; [.2B60.0020.0002] # MODI VOWEL SIGN VOCALIC LL +11639 ; [.2B61.0020.0002] # MODI VOWEL SIGN E +1163A ; [.2B62.0020.0002] # MODI VOWEL SIGN AI +1163B ; [.2B63.0020.0002] # MODI VOWEL SIGN O +1163C ; [.2B64.0020.0002] # MODI VOWEL SIGN AU +1163F ; [.2B65.0020.0002] # MODI SIGN VIRAMA +11644 ; [.2B66.0020.0002] # MODI SIGN HUVA +11680 ; [.2B67.0020.0002] # TAKRI LETTER A +11681 ; [.2B68.0020.0002] # TAKRI LETTER AA +11682 ; [.2B69.0020.0002] # TAKRI LETTER I +11683 ; [.2B6A.0020.0002] # TAKRI LETTER II +11684 ; [.2B6B.0020.0002] # TAKRI LETTER U +11685 ; [.2B6C.0020.0002] # TAKRI LETTER UU +11686 ; [.2B6D.0020.0002] # TAKRI LETTER E +11687 ; [.2B6E.0020.0002] # TAKRI LETTER AI +11688 ; [.2B6F.0020.0002] # TAKRI LETTER O +11689 ; [.2B70.0020.0002] # TAKRI LETTER AU +116A8 ; [.2B71.0020.0002] # TAKRI LETTER SA +116A7 ; [.2B72.0020.0002] # TAKRI LETTER SHA +116A9 ; [.2B73.0020.0002] # TAKRI LETTER HA +1168A ; [.2B74.0020.0002] # TAKRI LETTER KA +1168B ; [.2B75.0020.0002] # TAKRI LETTER KHA +1168C ; [.2B76.0020.0002] # TAKRI LETTER GA +1168D ; [.2B77.0020.0002] # TAKRI LETTER GHA +1168E ; [.2B78.0020.0002] # TAKRI LETTER NGA +1168F ; [.2B79.0020.0002] # TAKRI LETTER CA +11690 ; [.2B7A.0020.0002] # TAKRI LETTER CHA +11691 ; [.2B7B.0020.0002] # TAKRI LETTER JA +11692 ; [.2B7C.0020.0002] # TAKRI LETTER JHA +11693 ; [.2B7D.0020.0002] # TAKRI LETTER NYA +11694 ; [.2B7E.0020.0002] # TAKRI LETTER TTA +11695 ; [.2B7F.0020.0002] # TAKRI LETTER TTHA +11696 ; [.2B80.0020.0002] # TAKRI LETTER DDA +11697 ; [.2B81.0020.0002] # TAKRI LETTER DDHA +11698 ; [.2B82.0020.0002] # TAKRI LETTER NNA +11699 ; [.2B83.0020.0002] # TAKRI LETTER TA +1169A ; [.2B84.0020.0002] # TAKRI LETTER THA +1169B ; [.2B85.0020.0002] # TAKRI LETTER DA +1169C ; [.2B86.0020.0002] # TAKRI LETTER DHA +1169D ; [.2B87.0020.0002] # TAKRI LETTER NA +1169E ; [.2B88.0020.0002] # TAKRI LETTER PA +1169F ; [.2B89.0020.0002] # TAKRI LETTER PHA +116A0 ; [.2B8A.0020.0002] # TAKRI LETTER BA +116A1 ; [.2B8B.0020.0002] # TAKRI LETTER BHA +116A2 ; [.2B8C.0020.0002] # TAKRI LETTER MA +116A3 ; [.2B8D.0020.0002] # TAKRI LETTER YA +116A4 ; [.2B8E.0020.0002] # TAKRI LETTER RA +116A5 ; [.2B8F.0020.0002] # TAKRI LETTER LA +116A6 ; [.2B90.0020.0002] # TAKRI LETTER VA +116AA ; [.2B91.0020.0002] # TAKRI LETTER RRA +116AD ; [.2B92.0020.0002] # TAKRI VOWEL SIGN AA +116AE ; [.2B93.0020.0002] # TAKRI VOWEL SIGN I +116AF ; [.2B94.0020.0002] # TAKRI VOWEL SIGN II +116B0 ; [.2B95.0020.0002] # TAKRI VOWEL SIGN U +116B1 ; [.2B96.0020.0002] # TAKRI VOWEL SIGN UU +116B2 ; [.2B97.0020.0002] # TAKRI VOWEL SIGN E +116B3 ; [.2B98.0020.0002] # TAKRI VOWEL SIGN AI +116B4 ; [.2B99.0020.0002] # TAKRI VOWEL SIGN O +116B5 ; [.2B9A.0020.0002] # TAKRI VOWEL SIGN AU +116B6 ; [.2B9B.0020.0002] # TAKRI SIGN VIRAMA +11700 ; [.2B9C.0020.0002] # AHOM LETTER KA +11701 ; [.2B9D.0020.0002] # AHOM LETTER KHA +11702 ; [.2B9E.0020.0002] # AHOM LETTER NGA +11703 ; [.2B9F.0020.0002] # AHOM LETTER NA +11704 ; [.2BA0.0020.0002] # AHOM LETTER TA +11705 ; [.2BA0.0020.0004][.0000.010B.0004] # AHOM LETTER ALTERNATE TA +11706 ; [.2BA1.0020.0002] # AHOM LETTER PA +11707 ; [.2BA2.0020.0002] # AHOM LETTER PHA +11708 ; [.2BA3.0020.0002] # AHOM LETTER BA +11709 ; [.2BA4.0020.0002] # AHOM LETTER MA +1170A ; [.2BA5.0020.0002] # AHOM LETTER JA +1170B ; [.2BA6.0020.0002] # AHOM LETTER CHA +1170C ; [.2BA7.0020.0002] # AHOM LETTER THA +1170D ; [.2BA8.0020.0002] # AHOM LETTER RA +1170E ; [.2BA9.0020.0002] # AHOM LETTER LA +1170F ; [.2BAA.0020.0002] # AHOM LETTER SA +11710 ; [.2BAB.0020.0002] # AHOM LETTER NYA +11711 ; [.2BAC.0020.0002] # AHOM LETTER HA +11712 ; [.2BAD.0020.0002] # AHOM LETTER A +11713 ; [.2BAE.0020.0002] # AHOM LETTER DA +11714 ; [.2BAF.0020.0002] # AHOM LETTER DHA +11715 ; [.2BB0.0020.0002] # AHOM LETTER GA +11716 ; [.2BB0.0020.0004][.0000.010B.0004] # AHOM LETTER ALTERNATE GA +11717 ; [.2BB1.0020.0002] # AHOM LETTER GHA +11718 ; [.2BB2.0020.0002] # AHOM LETTER BHA +11719 ; [.2BB3.0020.0002] # AHOM LETTER JHA +11720 ; [.2BB4.0020.0002] # AHOM VOWEL SIGN A +11721 ; [.2BB5.0020.0002] # AHOM VOWEL SIGN AA +11722 ; [.2BB6.0020.0002] # AHOM VOWEL SIGN I +11723 ; [.2BB7.0020.0002] # AHOM VOWEL SIGN II +11724 ; [.2BB8.0020.0002] # AHOM VOWEL SIGN U +11725 ; [.2BB9.0020.0002] # AHOM VOWEL SIGN UU +11726 ; [.2BBA.0020.0002] # AHOM VOWEL SIGN E +11727 ; [.2BBB.0020.0002] # AHOM VOWEL SIGN AW +11728 ; [.2BBC.0020.0002] # AHOM VOWEL SIGN O +11729 ; [.2BBD.0020.0002] # AHOM VOWEL SIGN AI +1172A ; [.2BBE.0020.0002] # AHOM VOWEL SIGN AM +1172B ; [.2BBF.0020.0002] # AHOM SIGN KILLER +1171D ; [.2BC0.0020.0002] # AHOM CONSONANT SIGN MEDIAL LA +1171E ; [.2BC1.0020.0002] # AHOM CONSONANT SIGN MEDIAL RA +1171F ; [.2BC2.0020.0002] # AHOM CONSONANT SIGN MEDIAL LIGATING RA +1B83 ; [.2BC3.0020.0002] # SUNDANESE LETTER A +1BBA ; [.2BC3.0020.0004] # SUNDANESE AVAGRAHA +1B84 ; [.2BC4.0020.0002] # SUNDANESE LETTER I +1B85 ; [.2BC5.0020.0002] # SUNDANESE LETTER U +1B86 ; [.2BC6.0020.0002] # SUNDANESE LETTER AE +1B87 ; [.2BC7.0020.0002] # SUNDANESE LETTER O +1B88 ; [.2BC8.0020.0002] # SUNDANESE LETTER E +1B89 ; [.2BC9.0020.0002] # SUNDANESE LETTER EU +1B8A ; [.2BCA.0020.0002] # SUNDANESE LETTER KA +1BBE ; [.2BCA.0020.0019] # SUNDANESE LETTER FINAL K +1BAE ; [.2BCB.0020.0002] # SUNDANESE LETTER KHA +1B8B ; [.2BCC.0020.0002] # SUNDANESE LETTER QA +1B8C ; [.2BCD.0020.0002] # SUNDANESE LETTER GA +1B8D ; [.2BCE.0020.0002] # SUNDANESE LETTER NGA +1B8E ; [.2BCF.0020.0002] # SUNDANESE LETTER CA +1B8F ; [.2BD0.0020.0002] # SUNDANESE LETTER JA +1B90 ; [.2BD1.0020.0002] # SUNDANESE LETTER ZA +1B91 ; [.2BD2.0020.0002] # SUNDANESE LETTER NYA +1B92 ; [.2BD3.0020.0002] # SUNDANESE LETTER TA +1B93 ; [.2BD4.0020.0002] # SUNDANESE LETTER DA +1B94 ; [.2BD5.0020.0002] # SUNDANESE LETTER NA +1B95 ; [.2BD6.0020.0002] # SUNDANESE LETTER PA +1B96 ; [.2BD7.0020.0002] # SUNDANESE LETTER FA +1B97 ; [.2BD8.0020.0002] # SUNDANESE LETTER VA +1B98 ; [.2BD9.0020.0002] # SUNDANESE LETTER BA +1BBD ; [.2BDA.0020.0002] # SUNDANESE LETTER BHA +1B99 ; [.2BDB.0020.0002] # SUNDANESE LETTER MA +1BBF ; [.2BDB.0020.0019] # SUNDANESE LETTER FINAL M +1BAC ; [.2BDC.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN MA +1B9A ; [.2BDD.0020.0002] # SUNDANESE LETTER YA +1BA1 ; [.2BDE.0020.0002] # SUNDANESE CONSONANT SIGN PAMINGKAL +1B9B ; [.2BDF.0020.0002] # SUNDANESE LETTER RA +1BA2 ; [.2BE0.0020.0002] # SUNDANESE CONSONANT SIGN PANYAKRA +1BBB ; [.2BE1.0020.0002] # SUNDANESE LETTER REU +1B9C ; [.2BE2.0020.0002] # SUNDANESE LETTER LA +1BA3 ; [.2BE3.0020.0002] # SUNDANESE CONSONANT SIGN PANYIKU +1BBC ; [.2BE4.0020.0002] # SUNDANESE LETTER LEU +1B9D ; [.2BE5.0020.0002] # SUNDANESE LETTER WA +1BAD ; [.2BE6.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN WA +1B9E ; [.2BE7.0020.0002] # SUNDANESE LETTER SA +1B9F ; [.2BE8.0020.0002] # SUNDANESE LETTER XA +1BAF ; [.2BE9.0020.0002] # SUNDANESE LETTER SYA +1BA0 ; [.2BEA.0020.0002] # SUNDANESE LETTER HA +1BA4 ; [.2BEB.0020.0002] # SUNDANESE VOWEL SIGN PANGHULU +1BA5 ; [.2BEC.0020.0002] # SUNDANESE VOWEL SIGN PANYUKU +1BA6 ; [.2BED.0020.0002] # SUNDANESE VOWEL SIGN PANAELAENG +1BA7 ; [.2BEE.0020.0002] # SUNDANESE VOWEL SIGN PANOLONG +1BA8 ; [.2BEF.0020.0002] # SUNDANESE VOWEL SIGN PAMEPET +1BA9 ; [.2BF0.0020.0002] # SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; [.2BF1.0020.0002] # SUNDANESE SIGN PAMAAEH +1BAB ; [.2BF2.0020.0002] # SUNDANESE SIGN VIRAMA +11005 ; [.2BF3.0020.0002] # BRAHMI LETTER A +11006 ; [.2BF4.0020.0002] # BRAHMI LETTER AA +11007 ; [.2BF5.0020.0002] # BRAHMI LETTER I +11008 ; [.2BF6.0020.0002] # BRAHMI LETTER II +11009 ; [.2BF7.0020.0002] # BRAHMI LETTER U +1100A ; [.2BF8.0020.0002] # BRAHMI LETTER UU +1100B ; [.2BF9.0020.0002] # BRAHMI LETTER VOCALIC R +1100C ; [.2BFA.0020.0002] # BRAHMI LETTER VOCALIC RR +1100D ; [.2BFB.0020.0002] # BRAHMI LETTER VOCALIC L +1100E ; [.2BFC.0020.0002] # BRAHMI LETTER VOCALIC LL +1100F ; [.2BFD.0020.0002] # BRAHMI LETTER E +11010 ; [.2BFE.0020.0002] # BRAHMI LETTER AI +11011 ; [.2BFF.0020.0002] # BRAHMI LETTER O +11012 ; [.2C00.0020.0002] # BRAHMI LETTER AU +11013 ; [.2C01.0020.0002] # BRAHMI LETTER KA +11014 ; [.2C02.0020.0002] # BRAHMI LETTER KHA +11015 ; [.2C03.0020.0002] # BRAHMI LETTER GA +11016 ; [.2C04.0020.0002] # BRAHMI LETTER GHA +11017 ; [.2C05.0020.0002] # BRAHMI LETTER NGA +11018 ; [.2C06.0020.0002] # BRAHMI LETTER CA +11019 ; [.2C07.0020.0002] # BRAHMI LETTER CHA +1101A ; [.2C08.0020.0002] # BRAHMI LETTER JA +1101B ; [.2C09.0020.0002] # BRAHMI LETTER JHA +1101C ; [.2C0A.0020.0002] # BRAHMI LETTER NYA +1101D ; [.2C0B.0020.0002] # BRAHMI LETTER TTA +1101E ; [.2C0C.0020.0002] # BRAHMI LETTER TTHA +1101F ; [.2C0D.0020.0002] # BRAHMI LETTER DDA +11020 ; [.2C0E.0020.0002] # BRAHMI LETTER DDHA +11021 ; [.2C0F.0020.0002] # BRAHMI LETTER NNA +11022 ; [.2C10.0020.0002] # BRAHMI LETTER TA +11023 ; [.2C11.0020.0002] # BRAHMI LETTER THA +11024 ; [.2C12.0020.0002] # BRAHMI LETTER DA +11025 ; [.2C13.0020.0002] # BRAHMI LETTER DHA +11026 ; [.2C14.0020.0002] # BRAHMI LETTER NA +11027 ; [.2C15.0020.0002] # BRAHMI LETTER PA +11028 ; [.2C16.0020.0002] # BRAHMI LETTER PHA +11029 ; [.2C17.0020.0002] # BRAHMI LETTER BA +1102A ; [.2C18.0020.0002] # BRAHMI LETTER BHA +1102B ; [.2C19.0020.0002] # BRAHMI LETTER MA +1102C ; [.2C1A.0020.0002] # BRAHMI LETTER YA +1102D ; [.2C1B.0020.0002] # BRAHMI LETTER RA +1102E ; [.2C1C.0020.0002] # BRAHMI LETTER LA +1102F ; [.2C1D.0020.0002] # BRAHMI LETTER VA +11030 ; [.2C1E.0020.0002] # BRAHMI LETTER SHA +11031 ; [.2C1F.0020.0002] # BRAHMI LETTER SSA +11032 ; [.2C20.0020.0002] # BRAHMI LETTER SA +11033 ; [.2C21.0020.0002] # BRAHMI LETTER HA +11003 ; [.2C22.0020.0002] # BRAHMI SIGN JIHVAMULIYA +11004 ; [.2C23.0020.0002] # BRAHMI SIGN UPADHMANIYA +11034 ; [.2C24.0020.0002] # BRAHMI LETTER LLA +11035 ; [.2C25.0020.0002] # BRAHMI LETTER OLD TAMIL LLLA +11036 ; [.2C26.0020.0002] # BRAHMI LETTER OLD TAMIL RRA +11037 ; [.2C27.0020.0002] # BRAHMI LETTER OLD TAMIL NNNA +11038 ; [.2C28.0020.0002] # BRAHMI VOWEL SIGN AA +11039 ; [.2C29.0020.0002] # BRAHMI VOWEL SIGN BHATTIPROLU AA +1103A ; [.2C2A.0020.0002] # BRAHMI VOWEL SIGN I +1103B ; [.2C2B.0020.0002] # BRAHMI VOWEL SIGN II +1103C ; [.2C2C.0020.0002] # BRAHMI VOWEL SIGN U +1103D ; [.2C2D.0020.0002] # BRAHMI VOWEL SIGN UU +1103E ; [.2C2E.0020.0002] # BRAHMI VOWEL SIGN VOCALIC R +1103F ; [.2C2F.0020.0002] # BRAHMI VOWEL SIGN VOCALIC RR +11040 ; [.2C30.0020.0002] # BRAHMI VOWEL SIGN VOCALIC L +11041 ; [.2C31.0020.0002] # BRAHMI VOWEL SIGN VOCALIC LL +11042 ; [.2C32.0020.0002] # BRAHMI VOWEL SIGN E +11043 ; [.2C33.0020.0002] # BRAHMI VOWEL SIGN AI +11044 ; [.2C34.0020.0002] # BRAHMI VOWEL SIGN O +11045 ; [.2C35.0020.0002] # BRAHMI VOWEL SIGN AU +11046 ; [.2C36.0020.0002] # BRAHMI VIRAMA +1107F ; [.2C37.0020.0002] # BRAHMI NUMBER JOINER +10A00 ; [.2C38.0020.0002] # KHAROSHTHI LETTER A +10A01 ; [.2C39.0020.0002] # KHAROSHTHI VOWEL SIGN I +10A02 ; [.2C3A.0020.0002] # KHAROSHTHI VOWEL SIGN U +10A03 ; [.2C3B.0020.0002] # KHAROSHTHI VOWEL SIGN VOCALIC R +10A05 ; [.2C3C.0020.0002] # KHAROSHTHI VOWEL SIGN E +10A06 ; [.2C3D.0020.0002] # KHAROSHTHI VOWEL SIGN O +10A0C ; [.2C3E.0020.0002] # KHAROSHTHI VOWEL LENGTH MARK +10A10 ; [.2C3F.0020.0002] # KHAROSHTHI LETTER KA +10A11 ; [.2C40.0020.0002] # KHAROSHTHI LETTER KHA +10A12 ; [.2C41.0020.0002] # KHAROSHTHI LETTER GA +10A13 ; [.2C42.0020.0002] # KHAROSHTHI LETTER GHA +10A15 ; [.2C43.0020.0002] # KHAROSHTHI LETTER CA +10A16 ; [.2C44.0020.0002] # KHAROSHTHI LETTER CHA +10A17 ; [.2C45.0020.0002] # KHAROSHTHI LETTER JA +10A19 ; [.2C46.0020.0002] # KHAROSHTHI LETTER NYA +10A1A ; [.2C47.0020.0002] # KHAROSHTHI LETTER TTA +10A1B ; [.2C48.0020.0002] # KHAROSHTHI LETTER TTHA +10A1C ; [.2C49.0020.0002] # KHAROSHTHI LETTER DDA +10A1D ; [.2C4A.0020.0002] # KHAROSHTHI LETTER DDHA +10A1E ; [.2C4B.0020.0002] # KHAROSHTHI LETTER NNA +10A1F ; [.2C4C.0020.0002] # KHAROSHTHI LETTER TA +10A20 ; [.2C4D.0020.0002] # KHAROSHTHI LETTER THA +10A21 ; [.2C4E.0020.0002] # KHAROSHTHI LETTER DA +10A22 ; [.2C4F.0020.0002] # KHAROSHTHI LETTER DHA +10A23 ; [.2C50.0020.0002] # KHAROSHTHI LETTER NA +10A24 ; [.2C51.0020.0002] # KHAROSHTHI LETTER PA +10A25 ; [.2C52.0020.0002] # KHAROSHTHI LETTER PHA +10A26 ; [.2C53.0020.0002] # KHAROSHTHI LETTER BA +10A27 ; [.2C54.0020.0002] # KHAROSHTHI LETTER BHA +10A28 ; [.2C55.0020.0002] # KHAROSHTHI LETTER MA +10A29 ; [.2C56.0020.0002] # KHAROSHTHI LETTER YA +10A2A ; [.2C57.0020.0002] # KHAROSHTHI LETTER RA +10A2B ; [.2C58.0020.0002] # KHAROSHTHI LETTER LA +10A2C ; [.2C59.0020.0002] # KHAROSHTHI LETTER VA +10A2D ; [.2C5A.0020.0002] # KHAROSHTHI LETTER SHA +10A2E ; [.2C5B.0020.0002] # KHAROSHTHI LETTER SSA +10A2F ; [.2C5C.0020.0002] # KHAROSHTHI LETTER SA +10A30 ; [.2C5D.0020.0002] # KHAROSHTHI LETTER ZA +10A31 ; [.2C5E.0020.0002] # KHAROSHTHI LETTER HA +10A32 ; [.2C5F.0020.0002] # KHAROSHTHI LETTER KKA +10A33 ; [.2C60.0020.0002] # KHAROSHTHI LETTER TTTHA +10A3F ; [.2C61.0020.0002] # KHAROSHTHI VIRAMA +0E01 ; [.2C62.0020.0002] # THAI CHARACTER KO KAI +0E40 0E01 ; [.2C62.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI> +0E41 0E01 ; [.2C62.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI> +0E42 0E01 ; [.2C62.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI> +0E43 0E01 ; [.2C62.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI> +0E44 0E01 ; [.2C62.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI> +0E02 ; [.2C63.0020.0002] # THAI CHARACTER KHO KHAI +0E40 0E02 ; [.2C63.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI> +0E41 0E02 ; [.2C63.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI> +0E42 0E02 ; [.2C63.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI> +0E43 0E02 ; [.2C63.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI> +0E44 0E02 ; [.2C63.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI> +0E03 ; [.2C64.0020.0002] # THAI CHARACTER KHO KHUAT +0E40 0E03 ; [.2C64.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT> +0E41 0E03 ; [.2C64.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT> +0E42 0E03 ; [.2C64.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT> +0E43 0E03 ; [.2C64.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT> +0E44 0E03 ; [.2C64.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT> +0E04 ; [.2C65.0020.0002] # THAI CHARACTER KHO KHWAI +0E40 0E04 ; [.2C65.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI> +0E41 0E04 ; [.2C65.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI> +0E42 0E04 ; [.2C65.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI> +0E43 0E04 ; [.2C65.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI> +0E44 0E04 ; [.2C65.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI> +0E05 ; [.2C66.0020.0002] # THAI CHARACTER KHO KHON +0E40 0E05 ; [.2C66.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON> +0E41 0E05 ; [.2C66.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON> +0E42 0E05 ; [.2C66.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON> +0E43 0E05 ; [.2C66.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON> +0E44 0E05 ; [.2C66.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON> +0E06 ; [.2C67.0020.0002] # THAI CHARACTER KHO RAKHANG +0E40 0E06 ; [.2C67.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG> +0E41 0E06 ; [.2C67.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG> +0E42 0E06 ; [.2C67.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG> +0E43 0E06 ; [.2C67.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG> +0E44 0E06 ; [.2C67.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG> +0E07 ; [.2C68.0020.0002] # THAI CHARACTER NGO NGU +0E40 0E07 ; [.2C68.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU> +0E41 0E07 ; [.2C68.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU> +0E42 0E07 ; [.2C68.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU> +0E43 0E07 ; [.2C68.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU> +0E44 0E07 ; [.2C68.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU> +0E08 ; [.2C69.0020.0002] # THAI CHARACTER CHO CHAN +0E40 0E08 ; [.2C69.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN> +0E41 0E08 ; [.2C69.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN> +0E42 0E08 ; [.2C69.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN> +0E43 0E08 ; [.2C69.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN> +0E44 0E08 ; [.2C69.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN> +0E09 ; [.2C6A.0020.0002] # THAI CHARACTER CHO CHING +0E40 0E09 ; [.2C6A.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING> +0E41 0E09 ; [.2C6A.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING> +0E42 0E09 ; [.2C6A.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING> +0E43 0E09 ; [.2C6A.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING> +0E44 0E09 ; [.2C6A.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING> +0E0A ; [.2C6B.0020.0002] # THAI CHARACTER CHO CHANG +0E40 0E0A ; [.2C6B.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG> +0E41 0E0A ; [.2C6B.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG> +0E42 0E0A ; [.2C6B.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG> +0E43 0E0A ; [.2C6B.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG> +0E44 0E0A ; [.2C6B.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG> +0E0B ; [.2C6C.0020.0002] # THAI CHARACTER SO SO +0E40 0E0B ; [.2C6C.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO> +0E41 0E0B ; [.2C6C.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO> +0E42 0E0B ; [.2C6C.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO> +0E43 0E0B ; [.2C6C.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO> +0E44 0E0B ; [.2C6C.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO> +0E0C ; [.2C6D.0020.0002] # THAI CHARACTER CHO CHOE +0E40 0E0C ; [.2C6D.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE> +0E41 0E0C ; [.2C6D.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE> +0E42 0E0C ; [.2C6D.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE> +0E43 0E0C ; [.2C6D.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE> +0E44 0E0C ; [.2C6D.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE> +0E0D ; [.2C6E.0020.0002] # THAI CHARACTER YO YING +0E40 0E0D ; [.2C6E.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING> +0E41 0E0D ; [.2C6E.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING> +0E42 0E0D ; [.2C6E.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING> +0E43 0E0D ; [.2C6E.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING> +0E44 0E0D ; [.2C6E.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING> +0E0E ; [.2C6F.0020.0002] # THAI CHARACTER DO CHADA +0E40 0E0E ; [.2C6F.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA> +0E41 0E0E ; [.2C6F.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA> +0E42 0E0E ; [.2C6F.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA> +0E43 0E0E ; [.2C6F.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA> +0E44 0E0E ; [.2C6F.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA> +0E0F ; [.2C70.0020.0002] # THAI CHARACTER TO PATAK +0E40 0E0F ; [.2C70.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK> +0E41 0E0F ; [.2C70.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK> +0E42 0E0F ; [.2C70.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK> +0E43 0E0F ; [.2C70.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK> +0E44 0E0F ; [.2C70.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK> +0E10 ; [.2C71.0020.0002] # THAI CHARACTER THO THAN +0E40 0E10 ; [.2C71.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN> +0E41 0E10 ; [.2C71.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN> +0E42 0E10 ; [.2C71.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN> +0E43 0E10 ; [.2C71.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN> +0E44 0E10 ; [.2C71.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN> +0E11 ; [.2C72.0020.0002] # THAI CHARACTER THO NANGMONTHO +0E40 0E11 ; [.2C72.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO> +0E41 0E11 ; [.2C72.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO> +0E42 0E11 ; [.2C72.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO> +0E43 0E11 ; [.2C72.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO> +0E44 0E11 ; [.2C72.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO> +0E12 ; [.2C73.0020.0002] # THAI CHARACTER THO PHUTHAO +0E40 0E12 ; [.2C73.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO> +0E41 0E12 ; [.2C73.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO> +0E42 0E12 ; [.2C73.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO> +0E43 0E12 ; [.2C73.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO> +0E44 0E12 ; [.2C73.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO> +0E13 ; [.2C74.0020.0002] # THAI CHARACTER NO NEN +0E40 0E13 ; [.2C74.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN> +0E41 0E13 ; [.2C74.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN> +0E42 0E13 ; [.2C74.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN> +0E43 0E13 ; [.2C74.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN> +0E44 0E13 ; [.2C74.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN> +0E14 ; [.2C75.0020.0002] # THAI CHARACTER DO DEK +0E40 0E14 ; [.2C75.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK> +0E41 0E14 ; [.2C75.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK> +0E42 0E14 ; [.2C75.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK> +0E43 0E14 ; [.2C75.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK> +0E44 0E14 ; [.2C75.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK> +0E15 ; [.2C76.0020.0002] # THAI CHARACTER TO TAO +0E40 0E15 ; [.2C76.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO> +0E41 0E15 ; [.2C76.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO> +0E42 0E15 ; [.2C76.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO> +0E43 0E15 ; [.2C76.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO> +0E44 0E15 ; [.2C76.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO> +0E16 ; [.2C77.0020.0002] # THAI CHARACTER THO THUNG +0E40 0E16 ; [.2C77.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG> +0E41 0E16 ; [.2C77.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG> +0E42 0E16 ; [.2C77.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG> +0E43 0E16 ; [.2C77.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG> +0E44 0E16 ; [.2C77.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG> +0E17 ; [.2C78.0020.0002] # THAI CHARACTER THO THAHAN +0E40 0E17 ; [.2C78.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN> +0E41 0E17 ; [.2C78.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN> +0E42 0E17 ; [.2C78.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN> +0E43 0E17 ; [.2C78.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN> +0E44 0E17 ; [.2C78.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN> +0E18 ; [.2C79.0020.0002] # THAI CHARACTER THO THONG +0E40 0E18 ; [.2C79.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG> +0E41 0E18 ; [.2C79.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG> +0E42 0E18 ; [.2C79.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG> +0E43 0E18 ; [.2C79.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG> +0E44 0E18 ; [.2C79.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG> +0E19 ; [.2C7A.0020.0002] # THAI CHARACTER NO NU +0E40 0E19 ; [.2C7A.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU> +0E41 0E19 ; [.2C7A.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU> +0E42 0E19 ; [.2C7A.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU> +0E43 0E19 ; [.2C7A.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU> +0E44 0E19 ; [.2C7A.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU> +0E1A ; [.2C7B.0020.0002] # THAI CHARACTER BO BAIMAI +0E40 0E1A ; [.2C7B.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI> +0E41 0E1A ; [.2C7B.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI> +0E42 0E1A ; [.2C7B.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI> +0E43 0E1A ; [.2C7B.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI> +0E44 0E1A ; [.2C7B.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI> +0E1B ; [.2C7C.0020.0002] # THAI CHARACTER PO PLA +0E40 0E1B ; [.2C7C.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA> +0E41 0E1B ; [.2C7C.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA> +0E42 0E1B ; [.2C7C.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA> +0E43 0E1B ; [.2C7C.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA> +0E44 0E1B ; [.2C7C.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA> +0E1C ; [.2C7D.0020.0002] # THAI CHARACTER PHO PHUNG +0E40 0E1C ; [.2C7D.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG> +0E41 0E1C ; [.2C7D.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG> +0E42 0E1C ; [.2C7D.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG> +0E43 0E1C ; [.2C7D.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG> +0E44 0E1C ; [.2C7D.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG> +0E1D ; [.2C7E.0020.0002] # THAI CHARACTER FO FA +0E40 0E1D ; [.2C7E.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA> +0E41 0E1D ; [.2C7E.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA> +0E42 0E1D ; [.2C7E.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA> +0E43 0E1D ; [.2C7E.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA> +0E44 0E1D ; [.2C7E.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA> +0E1E ; [.2C7F.0020.0002] # THAI CHARACTER PHO PHAN +0E40 0E1E ; [.2C7F.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN> +0E41 0E1E ; [.2C7F.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN> +0E42 0E1E ; [.2C7F.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN> +0E43 0E1E ; [.2C7F.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN> +0E44 0E1E ; [.2C7F.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN> +0E1F ; [.2C80.0020.0002] # THAI CHARACTER FO FAN +0E40 0E1F ; [.2C80.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN> +0E41 0E1F ; [.2C80.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN> +0E42 0E1F ; [.2C80.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN> +0E43 0E1F ; [.2C80.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN> +0E44 0E1F ; [.2C80.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN> +0E20 ; [.2C81.0020.0002] # THAI CHARACTER PHO SAMPHAO +0E40 0E20 ; [.2C81.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO> +0E41 0E20 ; [.2C81.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO> +0E42 0E20 ; [.2C81.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO> +0E43 0E20 ; [.2C81.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO> +0E44 0E20 ; [.2C81.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO> +0E21 ; [.2C82.0020.0002] # THAI CHARACTER MO MA +0E40 0E21 ; [.2C82.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA> +0E41 0E21 ; [.2C82.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA> +0E42 0E21 ; [.2C82.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA> +0E43 0E21 ; [.2C82.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA> +0E44 0E21 ; [.2C82.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA> +0E22 ; [.2C83.0020.0002] # THAI CHARACTER YO YAK +0E40 0E22 ; [.2C83.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK> +0E41 0E22 ; [.2C83.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK> +0E42 0E22 ; [.2C83.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK> +0E43 0E22 ; [.2C83.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK> +0E44 0E22 ; [.2C83.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK> +0E23 ; [.2C84.0020.0002] # THAI CHARACTER RO RUA +0E40 0E23 ; [.2C84.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA> +0E41 0E23 ; [.2C84.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA> +0E42 0E23 ; [.2C84.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA> +0E43 0E23 ; [.2C84.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA> +0E44 0E23 ; [.2C84.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA> +0E24 ; [.2C85.0020.0002] # THAI CHARACTER RU +0E40 0E24 ; [.2C85.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RU> +0E41 0E24 ; [.2C85.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RU> +0E42 0E24 ; [.2C85.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RU> +0E43 0E24 ; [.2C85.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU> +0E44 0E24 ; [.2C85.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU> +0E25 ; [.2C86.0020.0002] # THAI CHARACTER LO LING +0E40 0E25 ; [.2C86.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING> +0E41 0E25 ; [.2C86.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING> +0E42 0E25 ; [.2C86.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING> +0E43 0E25 ; [.2C86.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING> +0E44 0E25 ; [.2C86.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING> +0E26 ; [.2C87.0020.0002] # THAI CHARACTER LU +0E40 0E26 ; [.2C87.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LU> +0E41 0E26 ; [.2C87.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LU> +0E42 0E26 ; [.2C87.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LU> +0E43 0E26 ; [.2C87.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU> +0E44 0E26 ; [.2C87.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU> +0E27 ; [.2C88.0020.0002] # THAI CHARACTER WO WAEN +0E40 0E27 ; [.2C88.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN> +0E41 0E27 ; [.2C88.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN> +0E42 0E27 ; [.2C88.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN> +0E43 0E27 ; [.2C88.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN> +0E44 0E27 ; [.2C88.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN> +0E28 ; [.2C89.0020.0002] # THAI CHARACTER SO SALA +0E40 0E28 ; [.2C89.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA> +0E41 0E28 ; [.2C89.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA> +0E42 0E28 ; [.2C89.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA> +0E43 0E28 ; [.2C89.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA> +0E44 0E28 ; [.2C89.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA> +0E29 ; [.2C8A.0020.0002] # THAI CHARACTER SO RUSI +0E40 0E29 ; [.2C8A.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI> +0E41 0E29 ; [.2C8A.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI> +0E42 0E29 ; [.2C8A.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI> +0E43 0E29 ; [.2C8A.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI> +0E44 0E29 ; [.2C8A.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI> +0E2A ; [.2C8B.0020.0002] # THAI CHARACTER SO SUA +0E40 0E2A ; [.2C8B.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA> +0E41 0E2A ; [.2C8B.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA> +0E42 0E2A ; [.2C8B.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA> +0E43 0E2A ; [.2C8B.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA> +0E44 0E2A ; [.2C8B.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA> +0E2B ; [.2C8C.0020.0002] # THAI CHARACTER HO HIP +0E40 0E2B ; [.2C8C.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP> +0E41 0E2B ; [.2C8C.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP> +0E42 0E2B ; [.2C8C.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP> +0E43 0E2B ; [.2C8C.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP> +0E44 0E2B ; [.2C8C.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP> +0E2C ; [.2C8D.0020.0002] # THAI CHARACTER LO CHULA +0E40 0E2C ; [.2C8D.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA> +0E41 0E2C ; [.2C8D.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA> +0E42 0E2C ; [.2C8D.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA> +0E43 0E2C ; [.2C8D.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA> +0E44 0E2C ; [.2C8D.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA> +0E2D ; [.2C8E.0020.0002] # THAI CHARACTER O ANG +0E40 0E2D ; [.2C8E.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG> +0E41 0E2D ; [.2C8E.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG> +0E42 0E2D ; [.2C8E.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG> +0E43 0E2D ; [.2C8E.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG> +0E44 0E2D ; [.2C8E.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG> +0E2E ; [.2C8F.0020.0002] # THAI CHARACTER HO NOKHUK +0E40 0E2E ; [.2C8F.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK> +0E41 0E2E ; [.2C8F.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK> +0E42 0E2E ; [.2C8F.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK> +0E43 0E2E ; [.2C8F.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK> +0E44 0E2E ; [.2C8F.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK> +0E2F ; [.2C90.0020.0002] # THAI CHARACTER PAIYANNOI +0E30 ; [.2C91.0020.0002] # THAI CHARACTER SARA A +0E31 ; [.2C92.0020.0002] # THAI CHARACTER MAI HAN-AKAT +0E32 ; [.2C93.0020.0002] # THAI CHARACTER SARA AA +0E33 ; [.2C94.0020.0002] # THAI CHARACTER SARA AM +0E4D 0E32 ; [.2C94.0020.0002] # THAI CHARACTER SARA AM +0E34 ; [.2C95.0020.0002] # THAI CHARACTER SARA I +0E35 ; [.2C96.0020.0002] # THAI CHARACTER SARA II +0E36 ; [.2C97.0020.0002] # THAI CHARACTER SARA UE +0E37 ; [.2C98.0020.0002] # THAI CHARACTER SARA UEE +0E38 ; [.2C99.0020.0002] # THAI CHARACTER SARA U +0E39 ; [.2C9A.0020.0002] # THAI CHARACTER SARA UU +0E3A ; [.2C9B.0020.0002] # THAI CHARACTER PHINTHU +0E40 ; [.2C9C.0020.0002] # THAI CHARACTER SARA E +0E41 ; [.2C9D.0020.0002] # THAI CHARACTER SARA AE +0E42 ; [.2C9E.0020.0002] # THAI CHARACTER SARA O +0E43 ; [.2C9F.0020.0002] # THAI CHARACTER SARA AI MAIMUAN +0E44 ; [.2CA0.0020.0002] # THAI CHARACTER SARA AI MAIMALAI +0E45 ; [.2CA1.0020.0002] # THAI CHARACTER LAKKHANGYAO +0EDE ; [.2CA2.0020.0002] # LAO LETTER KHMU GO +0EC0 0EDE ; [.2CA2.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU GO> +0EC1 0EDE ; [.2CA2.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU GO> +0EC2 0EDE ; [.2CA2.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU GO> +0EC3 0EDE ; [.2CA2.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU GO> +0EC4 0EDE ; [.2CA2.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU GO> +0E81 ; [.2CA3.0020.0002] # LAO LETTER KO +0EC0 0E81 ; [.2CA3.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KO> +0EC1 0E81 ; [.2CA3.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KO> +0EC2 0E81 ; [.2CA3.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KO> +0EC3 0E81 ; [.2CA3.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KO> +0EC4 0E81 ; [.2CA3.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KO> +0E82 ; [.2CA4.0020.0002] # LAO LETTER KHO SUNG +0EC0 0E82 ; [.2CA4.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG> +0EC1 0E82 ; [.2CA4.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG> +0EC2 0E82 ; [.2CA4.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG> +0EC3 0E82 ; [.2CA4.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG> +0EC4 0E82 ; [.2CA4.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG> +0E84 ; [.2CA5.0020.0002] # LAO LETTER KHO TAM +0EC0 0E84 ; [.2CA5.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM> +0EC1 0E84 ; [.2CA5.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM> +0EC2 0E84 ; [.2CA5.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM> +0EC3 0E84 ; [.2CA5.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM> +0EC4 0E84 ; [.2CA5.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM> +0E87 ; [.2CA6.0020.0002] # LAO LETTER NGO +0EC0 0E87 ; [.2CA6.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NGO> +0EC1 0E87 ; [.2CA6.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NGO> +0EC2 0E87 ; [.2CA6.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NGO> +0EC3 0E87 ; [.2CA6.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NGO> +0EC4 0E87 ; [.2CA6.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NGO> +0E88 ; [.2CA7.0020.0002] # LAO LETTER CO +0EC0 0E88 ; [.2CA7.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER CO> +0EC1 0E88 ; [.2CA7.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER CO> +0EC2 0E88 ; [.2CA7.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER CO> +0EC3 0E88 ; [.2CA7.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER CO> +0EC4 0E88 ; [.2CA7.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER CO> +0EAA ; [.2CA8.0020.0002] # LAO LETTER SO SUNG +0EC0 0EAA ; [.2CA8.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG> +0EC1 0EAA ; [.2CA8.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG> +0EC2 0EAA ; [.2CA8.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG> +0EC3 0EAA ; [.2CA8.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG> +0EC4 0EAA ; [.2CA8.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG> +0E8A ; [.2CA9.0020.0002] # LAO LETTER SO TAM +0EC0 0E8A ; [.2CA9.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO TAM> +0EC1 0E8A ; [.2CA9.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM> +0EC2 0E8A ; [.2CA9.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO TAM> +0EC3 0E8A ; [.2CA9.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM> +0EC4 0E8A ; [.2CA9.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM> +0EDF ; [.2CAA.0020.0002] # LAO LETTER KHMU NYO +0EC0 0EDF ; [.2CAA.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU NYO> +0EC1 0EDF ; [.2CAA.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU NYO> +0EC2 0EDF ; [.2CAA.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU NYO> +0EC3 0EDF ; [.2CAA.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU NYO> +0EC4 0EDF ; [.2CAA.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU NYO> +0E8D ; [.2CAB.0020.0002] # LAO LETTER NYO +0EC0 0E8D ; [.2CAB.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NYO> +0EC1 0E8D ; [.2CAB.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NYO> +0EC2 0E8D ; [.2CAB.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NYO> +0EC3 0E8D ; [.2CAB.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NYO> +0EC4 0E8D ; [.2CAB.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NYO> +0E94 ; [.2CAC.0020.0002] # LAO LETTER DO +0EC0 0E94 ; [.2CAC.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER DO> +0EC1 0E94 ; [.2CAC.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER DO> +0EC2 0E94 ; [.2CAC.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER DO> +0EC3 0E94 ; [.2CAC.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER DO> +0EC4 0E94 ; [.2CAC.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER DO> +0E95 ; [.2CAD.0020.0002] # LAO LETTER TO +0EC0 0E95 ; [.2CAD.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER TO> +0EC1 0E95 ; [.2CAD.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER TO> +0EC2 0E95 ; [.2CAD.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER TO> +0EC3 0E95 ; [.2CAD.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER TO> +0EC4 0E95 ; [.2CAD.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER TO> +0E96 ; [.2CAE.0020.0002] # LAO LETTER THO SUNG +0EC0 0E96 ; [.2CAE.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG> +0EC1 0E96 ; [.2CAE.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG> +0EC2 0E96 ; [.2CAE.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG> +0EC3 0E96 ; [.2CAE.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG> +0EC4 0E96 ; [.2CAE.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG> +0E97 ; [.2CAF.0020.0002] # LAO LETTER THO TAM +0EC0 0E97 ; [.2CAF.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO TAM> +0EC1 0E97 ; [.2CAF.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM> +0EC2 0E97 ; [.2CAF.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO TAM> +0EC3 0E97 ; [.2CAF.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM> +0EC4 0E97 ; [.2CAF.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM> +0E99 ; [.2CB0.0020.0002] # LAO LETTER NO +0EC0 0E99 ; [.2CB0.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NO> +0EC1 0E99 ; [.2CB0.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NO> +0EC2 0E99 ; [.2CB0.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NO> +0EC3 0E99 ; [.2CB0.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NO> +0EC4 0E99 ; [.2CB0.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NO> +0E9A ; [.2CB1.0020.0002] # LAO LETTER BO +0EC0 0E9A ; [.2CB1.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER BO> +0EC1 0E9A ; [.2CB1.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER BO> +0EC2 0E9A ; [.2CB1.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER BO> +0EC3 0E9A ; [.2CB1.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER BO> +0EC4 0E9A ; [.2CB1.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER BO> +0E9B ; [.2CB2.0020.0002] # LAO LETTER PO +0EC0 0E9B ; [.2CB2.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PO> +0EC1 0E9B ; [.2CB2.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PO> +0EC2 0E9B ; [.2CB2.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PO> +0EC3 0E9B ; [.2CB2.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PO> +0EC4 0E9B ; [.2CB2.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PO> +0E9C ; [.2CB3.0020.0002] # LAO LETTER PHO SUNG +0EC0 0E9C ; [.2CB3.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG> +0EC1 0E9C ; [.2CB3.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG> +0EC2 0E9C ; [.2CB3.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG> +0EC3 0E9C ; [.2CB3.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG> +0EC4 0E9C ; [.2CB3.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG> +0E9D ; [.2CB4.0020.0002] # LAO LETTER FO TAM +0EC0 0E9D ; [.2CB4.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO TAM> +0EC1 0E9D ; [.2CB4.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM> +0EC2 0E9D ; [.2CB4.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO TAM> +0EC3 0E9D ; [.2CB4.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM> +0EC4 0E9D ; [.2CB4.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM> +0E9E ; [.2CB5.0020.0002] # LAO LETTER PHO TAM +0EC0 0E9E ; [.2CB5.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM> +0EC1 0E9E ; [.2CB5.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM> +0EC2 0E9E ; [.2CB5.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM> +0EC3 0E9E ; [.2CB5.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM> +0EC4 0E9E ; [.2CB5.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM> +0E9F ; [.2CB6.0020.0002] # LAO LETTER FO SUNG +0EC0 0E9F ; [.2CB6.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG> +0EC1 0E9F ; [.2CB6.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG> +0EC2 0E9F ; [.2CB6.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG> +0EC3 0E9F ; [.2CB6.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG> +0EC4 0E9F ; [.2CB6.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG> +0EA1 ; [.2CB7.0020.0002] # LAO LETTER MO +0EC0 0EA1 ; [.2CB7.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER MO> +0EC1 0EA1 ; [.2CB7.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER MO> +0EC2 0EA1 ; [.2CB7.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER MO> +0EC3 0EA1 ; [.2CB7.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER MO> +0EC4 0EA1 ; [.2CB7.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER MO> +0EA2 ; [.2CB8.0020.0002] # LAO LETTER YO +0EC0 0EA2 ; [.2CB8.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER YO> +0EC1 0EA2 ; [.2CB8.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER YO> +0EC2 0EA2 ; [.2CB8.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER YO> +0EC3 0EA2 ; [.2CB8.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER YO> +0EC4 0EA2 ; [.2CB8.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER YO> +0EA3 ; [.2CB9.0020.0002] # LAO LETTER LO LING +0EC0 0EA3 ; [.2CB9.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LING> +0EC1 0EA3 ; [.2CB9.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LING> +0EC2 0EA3 ; [.2CB9.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LING> +0EC3 0EA3 ; [.2CB9.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LING> +0EC4 0EA3 ; [.2CB9.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LING> +0EA5 ; [.2CBA.0020.0002] # LAO LETTER LO LOOT +0EC0 0EA5 ; [.2CBA.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT> +0EC1 0EA5 ; [.2CBA.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT> +0EC2 0EA5 ; [.2CBA.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT> +0EC3 0EA5 ; [.2CBA.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT> +0EC4 0EA5 ; [.2CBA.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT> +0EA7 ; [.2CBB.0020.0002] # LAO LETTER WO +0EC0 0EA7 ; [.2CBB.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER WO> +0EC1 0EA7 ; [.2CBB.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER WO> +0EC2 0EA7 ; [.2CBB.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER WO> +0EC3 0EA7 ; [.2CBB.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER WO> +0EC4 0EA7 ; [.2CBB.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER WO> +0EAB ; [.2CBC.0020.0002] # LAO LETTER HO SUNG +0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004] # LAO HO NO +0EC0 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO HO NO> +0EC1 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO HO NO> +0EC2 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO HO NO> +0EC3 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO HO NO> +0EC4 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO HO NO> +0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004] # LAO HO MO +0EC0 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO HO MO> +0EC1 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO HO MO> +0EC2 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO HO MO> +0EC3 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO HO MO> +0EC4 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO HO MO> +0EC0 0EAB ; [.2CBC.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG> +0EC1 0EAB ; [.2CBC.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG> +0EC2 0EAB ; [.2CBC.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG> +0EC3 0EAB ; [.2CBC.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG> +0EC4 0EAB ; [.2CBC.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG> +0EAD ; [.2CBD.0020.0002] # LAO LETTER O +0EC0 0EAD ; [.2CBD.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER O> +0EC1 0EAD ; [.2CBD.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER O> +0EC2 0EAD ; [.2CBD.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER O> +0EC3 0EAD ; [.2CBD.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER O> +0EC4 0EAD ; [.2CBD.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER O> +0EAE ; [.2CBE.0020.0002] # LAO LETTER HO TAM +0EC0 0EAE ; [.2CBE.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO TAM> +0EC1 0EAE ; [.2CBE.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM> +0EC2 0EAE ; [.2CBE.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO TAM> +0EC3 0EAE ; [.2CBE.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM> +0EC4 0EAE ; [.2CBE.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM> +0EAF ; [.2CBF.0020.0002] # LAO ELLIPSIS +0EB0 ; [.2CC0.0020.0002] # LAO VOWEL SIGN A +0EB1 ; [.2CC1.0020.0002] # LAO VOWEL SIGN MAI KAN +0EB2 ; [.2CC2.0020.0002] # LAO VOWEL SIGN AA +0EB3 ; [.2CC3.0020.0002] # LAO VOWEL SIGN AM +0ECD 0EB2 ; [.2CC3.0020.0002] # LAO VOWEL SIGN AM +0EB4 ; [.2CC4.0020.0002] # LAO VOWEL SIGN I +0EB5 ; [.2CC5.0020.0002] # LAO VOWEL SIGN II +0EB6 ; [.2CC6.0020.0002] # LAO VOWEL SIGN Y +0EB7 ; [.2CC7.0020.0002] # LAO VOWEL SIGN YY +0EB8 ; [.2CC8.0020.0002] # LAO VOWEL SIGN U +0EB9 ; [.2CC9.0020.0002] # LAO VOWEL SIGN UU +0EBB ; [.2CCA.0020.0002] # LAO VOWEL SIGN MAI KON +0EBC ; [.2CCB.0020.0002] # LAO SEMIVOWEL SIGN LO +0EBD ; [.2CCC.0020.0002] # LAO SEMIVOWEL SIGN NYO +0EC0 ; [.2CCD.0020.0002] # LAO VOWEL SIGN E +0EC1 ; [.2CCE.0020.0002] # LAO VOWEL SIGN EI +0EC2 ; [.2CCF.0020.0002] # LAO VOWEL SIGN O +0EC3 ; [.2CD0.0020.0002] # LAO VOWEL SIGN AY +0EC4 ; [.2CD1.0020.0002] # LAO VOWEL SIGN AI +AA80 ; [.2CD2.0020.0002] # TAI VIET LETTER LOW KO +AAB5 AA80 ; [.2CD2.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KO> +AAB6 AA80 ; [.2CD2.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KO> +AAB9 AA80 ; [.2CD2.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KO> +AABB AA80 ; [.2CD2.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KO> +AABC AA80 ; [.2CD2.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KO> +AA81 ; [.2CD3.0020.0002] # TAI VIET LETTER HIGH KO +AAB5 AA81 ; [.2CD3.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KO> +AAB6 AA81 ; [.2CD3.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KO> +AAB9 AA81 ; [.2CD3.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KO> +AABB AA81 ; [.2CD3.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KO> +AABC AA81 ; [.2CD3.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KO> +AA82 ; [.2CD4.0020.0002] # TAI VIET LETTER LOW KHO +AAB5 AA82 ; [.2CD4.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHO> +AAB6 AA82 ; [.2CD4.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHO> +AAB9 AA82 ; [.2CD4.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHO> +AABB AA82 ; [.2CD4.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHO> +AABC AA82 ; [.2CD4.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHO> +AA83 ; [.2CD5.0020.0002] # TAI VIET LETTER HIGH KHO +AAB5 AA83 ; [.2CD5.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHO> +AAB6 AA83 ; [.2CD5.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHO> +AAB9 AA83 ; [.2CD5.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHO> +AABB AA83 ; [.2CD5.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHO> +AABC AA83 ; [.2CD5.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHO> +AA84 ; [.2CD6.0020.0002] # TAI VIET LETTER LOW KHHO +AAB5 AA84 ; [.2CD6.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHHO> +AAB6 AA84 ; [.2CD6.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHHO> +AAB9 AA84 ; [.2CD6.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHHO> +AABB AA84 ; [.2CD6.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHHO> +AABC AA84 ; [.2CD6.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHHO> +AA85 ; [.2CD7.0020.0002] # TAI VIET LETTER HIGH KHHO +AAB5 AA85 ; [.2CD7.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHHO> +AAB6 AA85 ; [.2CD7.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHHO> +AAB9 AA85 ; [.2CD7.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHHO> +AABB AA85 ; [.2CD7.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHHO> +AABC AA85 ; [.2CD7.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHHO> +AA86 ; [.2CD8.0020.0002] # TAI VIET LETTER LOW GO +AAB5 AA86 ; [.2CD8.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW GO> +AAB6 AA86 ; [.2CD8.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW GO> +AAB9 AA86 ; [.2CD8.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW GO> +AABB AA86 ; [.2CD8.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW GO> +AABC AA86 ; [.2CD8.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW GO> +AA87 ; [.2CD9.0020.0002] # TAI VIET LETTER HIGH GO +AAB5 AA87 ; [.2CD9.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH GO> +AAB6 AA87 ; [.2CD9.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH GO> +AAB9 AA87 ; [.2CD9.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH GO> +AABB AA87 ; [.2CD9.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH GO> +AABC AA87 ; [.2CD9.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH GO> +AA88 ; [.2CDA.0020.0002] # TAI VIET LETTER LOW NGO +AAB5 AA88 ; [.2CDA.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NGO> +AAB6 AA88 ; [.2CDA.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NGO> +AAB9 AA88 ; [.2CDA.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NGO> +AABB AA88 ; [.2CDA.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NGO> +AABC AA88 ; [.2CDA.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NGO> +AA89 ; [.2CDB.0020.0002] # TAI VIET LETTER HIGH NGO +AAB5 AA89 ; [.2CDB.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NGO> +AAB6 AA89 ; [.2CDB.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NGO> +AAB9 AA89 ; [.2CDB.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NGO> +AABB AA89 ; [.2CDB.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NGO> +AABC AA89 ; [.2CDB.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NGO> +AA8A ; [.2CDC.0020.0002] # TAI VIET LETTER LOW CO +AAB5 AA8A ; [.2CDC.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CO> +AAB6 AA8A ; [.2CDC.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CO> +AAB9 AA8A ; [.2CDC.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CO> +AABB AA8A ; [.2CDC.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CO> +AABC AA8A ; [.2CDC.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CO> +AA8B ; [.2CDD.0020.0002] # TAI VIET LETTER HIGH CO +AAB5 AA8B ; [.2CDD.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CO> +AAB6 AA8B ; [.2CDD.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CO> +AAB9 AA8B ; [.2CDD.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CO> +AABB AA8B ; [.2CDD.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CO> +AABC AA8B ; [.2CDD.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CO> +AA8C ; [.2CDE.0020.0002] # TAI VIET LETTER LOW CHO +AAB5 AA8C ; [.2CDE.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CHO> +AAB6 AA8C ; [.2CDE.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CHO> +AAB9 AA8C ; [.2CDE.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CHO> +AABB AA8C ; [.2CDE.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CHO> +AABC AA8C ; [.2CDE.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CHO> +AA8D ; [.2CDF.0020.0002] # TAI VIET LETTER HIGH CHO +AAB5 AA8D ; [.2CDF.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CHO> +AAB6 AA8D ; [.2CDF.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CHO> +AAB9 AA8D ; [.2CDF.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CHO> +AABB AA8D ; [.2CDF.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CHO> +AABC AA8D ; [.2CDF.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CHO> +AA8E ; [.2CE0.0020.0002] # TAI VIET LETTER LOW SO +AAB5 AA8E ; [.2CE0.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW SO> +AAB6 AA8E ; [.2CE0.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW SO> +AAB9 AA8E ; [.2CE0.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW SO> +AABB AA8E ; [.2CE0.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW SO> +AABC AA8E ; [.2CE0.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW SO> +AA8F ; [.2CE1.0020.0002] # TAI VIET LETTER HIGH SO +AAB5 AA8F ; [.2CE1.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH SO> +AAB6 AA8F ; [.2CE1.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH SO> +AAB9 AA8F ; [.2CE1.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH SO> +AABB AA8F ; [.2CE1.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH SO> +AABC AA8F ; [.2CE1.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH SO> +AA90 ; [.2CE2.0020.0002] # TAI VIET LETTER LOW NYO +AAB5 AA90 ; [.2CE2.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NYO> +AAB6 AA90 ; [.2CE2.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NYO> +AAB9 AA90 ; [.2CE2.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NYO> +AABB AA90 ; [.2CE2.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NYO> +AABC AA90 ; [.2CE2.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NYO> +AA91 ; [.2CE3.0020.0002] # TAI VIET LETTER HIGH NYO +AAB5 AA91 ; [.2CE3.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NYO> +AAB6 AA91 ; [.2CE3.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NYO> +AAB9 AA91 ; [.2CE3.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NYO> +AABB AA91 ; [.2CE3.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NYO> +AABC AA91 ; [.2CE3.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NYO> +AA92 ; [.2CE4.0020.0002] # TAI VIET LETTER LOW DO +AAB5 AA92 ; [.2CE4.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW DO> +AAB6 AA92 ; [.2CE4.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW DO> +AAB9 AA92 ; [.2CE4.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW DO> +AABB AA92 ; [.2CE4.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW DO> +AABC AA92 ; [.2CE4.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW DO> +AA93 ; [.2CE5.0020.0002] # TAI VIET LETTER HIGH DO +AAB5 AA93 ; [.2CE5.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH DO> +AAB6 AA93 ; [.2CE5.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH DO> +AAB9 AA93 ; [.2CE5.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH DO> +AABB AA93 ; [.2CE5.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH DO> +AABC AA93 ; [.2CE5.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH DO> +AA94 ; [.2CE6.0020.0002] # TAI VIET LETTER LOW TO +AAB5 AA94 ; [.2CE6.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW TO> +AAB6 AA94 ; [.2CE6.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW TO> +AAB9 AA94 ; [.2CE6.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW TO> +AABB AA94 ; [.2CE6.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW TO> +AABC AA94 ; [.2CE6.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW TO> +AA95 ; [.2CE7.0020.0002] # TAI VIET LETTER HIGH TO +AAB5 AA95 ; [.2CE7.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH TO> +AAB6 AA95 ; [.2CE7.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH TO> +AAB9 AA95 ; [.2CE7.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH TO> +AABB AA95 ; [.2CE7.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH TO> +AABC AA95 ; [.2CE7.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH TO> +AA96 ; [.2CE8.0020.0002] # TAI VIET LETTER LOW THO +AAB5 AA96 ; [.2CE8.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW THO> +AAB6 AA96 ; [.2CE8.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW THO> +AAB9 AA96 ; [.2CE8.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW THO> +AABB AA96 ; [.2CE8.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW THO> +AABC AA96 ; [.2CE8.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW THO> +AA97 ; [.2CE9.0020.0002] # TAI VIET LETTER HIGH THO +AAB5 AA97 ; [.2CE9.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH THO> +AAB6 AA97 ; [.2CE9.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH THO> +AAB9 AA97 ; [.2CE9.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH THO> +AABB AA97 ; [.2CE9.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH THO> +AABC AA97 ; [.2CE9.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH THO> +AA98 ; [.2CEA.0020.0002] # TAI VIET LETTER LOW NO +AAB5 AA98 ; [.2CEA.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NO> +AAB6 AA98 ; [.2CEA.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NO> +AAB9 AA98 ; [.2CEA.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NO> +AABB AA98 ; [.2CEA.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NO> +AABC AA98 ; [.2CEA.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NO> +AA99 ; [.2CEB.0020.0002] # TAI VIET LETTER HIGH NO +AAB5 AA99 ; [.2CEB.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NO> +AAB6 AA99 ; [.2CEB.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NO> +AAB9 AA99 ; [.2CEB.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NO> +AABB AA99 ; [.2CEB.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NO> +AABC AA99 ; [.2CEB.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NO> +AA9A ; [.2CEC.0020.0002] # TAI VIET LETTER LOW BO +AAB5 AA9A ; [.2CEC.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW BO> +AAB6 AA9A ; [.2CEC.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW BO> +AAB9 AA9A ; [.2CEC.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW BO> +AABB AA9A ; [.2CEC.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW BO> +AABC AA9A ; [.2CEC.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW BO> +AA9B ; [.2CED.0020.0002] # TAI VIET LETTER HIGH BO +AAB5 AA9B ; [.2CED.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH BO> +AAB6 AA9B ; [.2CED.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH BO> +AAB9 AA9B ; [.2CED.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH BO> +AABB AA9B ; [.2CED.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH BO> +AABC AA9B ; [.2CED.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH BO> +AA9C ; [.2CEE.0020.0002] # TAI VIET LETTER LOW PO +AAB5 AA9C ; [.2CEE.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PO> +AAB6 AA9C ; [.2CEE.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PO> +AAB9 AA9C ; [.2CEE.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PO> +AABB AA9C ; [.2CEE.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PO> +AABC AA9C ; [.2CEE.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PO> +AA9D ; [.2CEF.0020.0002] # TAI VIET LETTER HIGH PO +AAB5 AA9D ; [.2CEF.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PO> +AAB6 AA9D ; [.2CEF.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PO> +AAB9 AA9D ; [.2CEF.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PO> +AABB AA9D ; [.2CEF.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PO> +AABC AA9D ; [.2CEF.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PO> +AA9E ; [.2CF0.0020.0002] # TAI VIET LETTER LOW PHO +AAB5 AA9E ; [.2CF0.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PHO> +AAB6 AA9E ; [.2CF0.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PHO> +AAB9 AA9E ; [.2CF0.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PHO> +AABB AA9E ; [.2CF0.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PHO> +AABC AA9E ; [.2CF0.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PHO> +AA9F ; [.2CF1.0020.0002] # TAI VIET LETTER HIGH PHO +AAB5 AA9F ; [.2CF1.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PHO> +AAB6 AA9F ; [.2CF1.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PHO> +AAB9 AA9F ; [.2CF1.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PHO> +AABB AA9F ; [.2CF1.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PHO> +AABC AA9F ; [.2CF1.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PHO> +AAA0 ; [.2CF2.0020.0002] # TAI VIET LETTER LOW FO +AAB5 AAA0 ; [.2CF2.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW FO> +AAB6 AAA0 ; [.2CF2.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW FO> +AAB9 AAA0 ; [.2CF2.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW FO> +AABB AAA0 ; [.2CF2.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW FO> +AABC AAA0 ; [.2CF2.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW FO> +AAA1 ; [.2CF3.0020.0002] # TAI VIET LETTER HIGH FO +AAB5 AAA1 ; [.2CF3.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH FO> +AAB6 AAA1 ; [.2CF3.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH FO> +AAB9 AAA1 ; [.2CF3.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH FO> +AABB AAA1 ; [.2CF3.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH FO> +AABC AAA1 ; [.2CF3.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH FO> +AAA2 ; [.2CF4.0020.0002] # TAI VIET LETTER LOW MO +AAB5 AAA2 ; [.2CF4.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW MO> +AAB6 AAA2 ; [.2CF4.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW MO> +AAB9 AAA2 ; [.2CF4.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW MO> +AABB AAA2 ; [.2CF4.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW MO> +AABC AAA2 ; [.2CF4.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW MO> +AAA3 ; [.2CF5.0020.0002] # TAI VIET LETTER HIGH MO +AAB5 AAA3 ; [.2CF5.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH MO> +AAB6 AAA3 ; [.2CF5.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH MO> +AAB9 AAA3 ; [.2CF5.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH MO> +AABB AAA3 ; [.2CF5.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH MO> +AABC AAA3 ; [.2CF5.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH MO> +AAA4 ; [.2CF6.0020.0002] # TAI VIET LETTER LOW YO +AAB5 AAA4 ; [.2CF6.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW YO> +AAB6 AAA4 ; [.2CF6.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW YO> +AAB9 AAA4 ; [.2CF6.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW YO> +AABB AAA4 ; [.2CF6.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW YO> +AABC AAA4 ; [.2CF6.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW YO> +AAA5 ; [.2CF7.0020.0002] # TAI VIET LETTER HIGH YO +AAB5 AAA5 ; [.2CF7.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH YO> +AAB6 AAA5 ; [.2CF7.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH YO> +AAB9 AAA5 ; [.2CF7.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH YO> +AABB AAA5 ; [.2CF7.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH YO> +AABC AAA5 ; [.2CF7.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH YO> +AAA6 ; [.2CF8.0020.0002] # TAI VIET LETTER LOW RO +AAB5 AAA6 ; [.2CF8.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW RO> +AAB6 AAA6 ; [.2CF8.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW RO> +AAB9 AAA6 ; [.2CF8.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW RO> +AABB AAA6 ; [.2CF8.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW RO> +AABC AAA6 ; [.2CF8.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW RO> +AAA7 ; [.2CF9.0020.0002] # TAI VIET LETTER HIGH RO +AAB5 AAA7 ; [.2CF9.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH RO> +AAB6 AAA7 ; [.2CF9.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH RO> +AAB9 AAA7 ; [.2CF9.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH RO> +AABB AAA7 ; [.2CF9.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH RO> +AABC AAA7 ; [.2CF9.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH RO> +AAA8 ; [.2CFA.0020.0002] # TAI VIET LETTER LOW LO +AAB5 AAA8 ; [.2CFA.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW LO> +AAB6 AAA8 ; [.2CFA.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW LO> +AAB9 AAA8 ; [.2CFA.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW LO> +AABB AAA8 ; [.2CFA.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW LO> +AABC AAA8 ; [.2CFA.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW LO> +AAA9 ; [.2CFB.0020.0002] # TAI VIET LETTER HIGH LO +AAB5 AAA9 ; [.2CFB.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH LO> +AAB6 AAA9 ; [.2CFB.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH LO> +AAB9 AAA9 ; [.2CFB.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH LO> +AABB AAA9 ; [.2CFB.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH LO> +AABC AAA9 ; [.2CFB.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH LO> +AAAA ; [.2CFC.0020.0002] # TAI VIET LETTER LOW VO +AAB5 AAAA ; [.2CFC.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW VO> +AAB6 AAAA ; [.2CFC.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW VO> +AAB9 AAAA ; [.2CFC.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW VO> +AABB AAAA ; [.2CFC.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW VO> +AABC AAAA ; [.2CFC.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW VO> +AAAB ; [.2CFD.0020.0002] # TAI VIET LETTER HIGH VO +AAB5 AAAB ; [.2CFD.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH VO> +AAB6 AAAB ; [.2CFD.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH VO> +AAB9 AAAB ; [.2CFD.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH VO> +AABB AAAB ; [.2CFD.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH VO> +AABC AAAB ; [.2CFD.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH VO> +AAAC ; [.2CFE.0020.0002] # TAI VIET LETTER LOW HO +AAB5 AAAC ; [.2CFE.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW HO> +AAB6 AAAC ; [.2CFE.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW HO> +AAB9 AAAC ; [.2CFE.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW HO> +AABB AAAC ; [.2CFE.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW HO> +AABC AAAC ; [.2CFE.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW HO> +AAAD ; [.2CFF.0020.0002] # TAI VIET LETTER HIGH HO +AAB5 AAAD ; [.2CFF.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH HO> +AAB6 AAAD ; [.2CFF.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH HO> +AAB9 AAAD ; [.2CFF.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH HO> +AABB AAAD ; [.2CFF.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH HO> +AABC AAAD ; [.2CFF.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH HO> +AAAE ; [.2D00.0020.0002] # TAI VIET LETTER LOW O +AAB5 AAAE ; [.2D00.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW O> +AAB6 AAAE ; [.2D00.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW O> +AAB9 AAAE ; [.2D00.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW O> +AABB AAAE ; [.2D00.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW O> +AABC AAAE ; [.2D00.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW O> +AAAF ; [.2D01.0020.0002] # TAI VIET LETTER HIGH O +AAB5 AAAF ; [.2D01.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH O> +AAB6 AAAF ; [.2D01.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH O> +AAB9 AAAF ; [.2D01.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH O> +AABB AAAF ; [.2D01.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH O> +AABC AAAF ; [.2D01.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH O> +AAB0 ; [.2D02.0020.0002] # TAI VIET MAI KANG +AAB1 ; [.2D03.0020.0002] # TAI VIET VOWEL AA +AAB2 ; [.2D04.0020.0002] # TAI VIET VOWEL I +AAB3 ; [.2D05.0020.0002] # TAI VIET VOWEL UE +AAB4 ; [.2D06.0020.0002] # TAI VIET VOWEL U +AAB5 ; [.2D07.0020.0002] # TAI VIET VOWEL E +AAB6 ; [.2D08.0020.0002] # TAI VIET VOWEL O +AAB7 ; [.2D09.0020.0002] # TAI VIET MAI KHIT +AAB8 ; [.2D0A.0020.0002] # TAI VIET VOWEL IA +AAB9 ; [.2D0B.0020.0002] # TAI VIET VOWEL UEA +AABA ; [.2D0C.0020.0002] # TAI VIET VOWEL UA +AABB ; [.2D0D.0020.0002] # TAI VIET VOWEL AUE +AABC ; [.2D0E.0020.0002] # TAI VIET VOWEL AY +AABD ; [.2D0F.0020.0002] # TAI VIET VOWEL AN +AABE ; [.2D10.0020.0002] # TAI VIET VOWEL AM +AAC0 ; [.2D11.0020.0002] # TAI VIET TONE MAI NUENG +AAC2 ; [.2D12.0020.0002] # TAI VIET TONE MAI SONG +AADB ; [.2D13.0020.0002] # TAI VIET SYMBOL KON +AADC ; [.2D14.0020.0002] # TAI VIET SYMBOL NUENG +0F40 ; [.2D15.0020.0002] # TIBETAN LETTER KA +0F69 ; [.2D15.0020.0002][.2D56.0020.0002] # TIBETAN LETTER KSSA +0F90 ; [.2D16.0020.0002] # TIBETAN SUBJOINED LETTER KA +0FB9 ; [.2D16.0020.0002][.2D56.0020.0002] # TIBETAN SUBJOINED LETTER KSSA +0F6B ; [.2D17.0020.0002] # TIBETAN LETTER KKA +0F41 ; [.2D18.0020.0002] # TIBETAN LETTER KHA +0F91 ; [.2D19.0020.0002] # TIBETAN SUBJOINED LETTER KHA +0F42 ; [.2D1A.0020.0002] # TIBETAN LETTER GA +0F43 ; [.2D1A.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER GHA +0F92 ; [.2D1B.0020.0002] # TIBETAN SUBJOINED LETTER GA +0F93 ; [.2D1B.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER GHA +0F44 ; [.2D1C.0020.0002] # TIBETAN LETTER NGA +0F94 ; [.2D1D.0020.0002] # TIBETAN SUBJOINED LETTER NGA +0F45 ; [.2D1E.0020.0002] # TIBETAN LETTER CA +0F95 ; [.2D1F.0020.0002] # TIBETAN SUBJOINED LETTER CA +0F46 ; [.2D20.0020.0002] # TIBETAN LETTER CHA +0F96 ; [.2D21.0020.0002] # TIBETAN SUBJOINED LETTER CHA +0F47 ; [.2D22.0020.0002] # TIBETAN LETTER JA +0F97 ; [.2D23.0020.0002] # TIBETAN SUBJOINED LETTER JA +0F49 ; [.2D24.0020.0002] # TIBETAN LETTER NYA +0F99 ; [.2D25.0020.0002] # TIBETAN SUBJOINED LETTER NYA +0F4A ; [.2D26.0020.0002] # TIBETAN LETTER TTA +0F9A ; [.2D27.0020.0002] # TIBETAN SUBJOINED LETTER TTA +0F4B ; [.2D28.0020.0002] # TIBETAN LETTER TTHA +0F9B ; [.2D29.0020.0002] # TIBETAN SUBJOINED LETTER TTHA +0F4C ; [.2D2A.0020.0002] # TIBETAN LETTER DDA +0F4D ; [.2D2A.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER DDHA +0F9C ; [.2D2B.0020.0002] # TIBETAN SUBJOINED LETTER DDA +0F9D ; [.2D2B.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER DDHA +0F4E ; [.2D2C.0020.0002] # TIBETAN LETTER NNA +0F9E ; [.2D2D.0020.0002] # TIBETAN SUBJOINED LETTER NNA +0F4F ; [.2D2E.0020.0002] # TIBETAN LETTER TA +0F9F ; [.2D2F.0020.0002] # TIBETAN SUBJOINED LETTER TA +0F50 ; [.2D30.0020.0002] # TIBETAN LETTER THA +0FA0 ; [.2D31.0020.0002] # TIBETAN SUBJOINED LETTER THA +0F51 ; [.2D32.0020.0002] # TIBETAN LETTER DA +0F52 ; [.2D32.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER DHA +0FA1 ; [.2D33.0020.0002] # TIBETAN SUBJOINED LETTER DA +0FA2 ; [.2D33.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER DHA +0F53 ; [.2D34.0020.0002] # TIBETAN LETTER NA +0FA3 ; [.2D35.0020.0002] # TIBETAN SUBJOINED LETTER NA +0F54 ; [.2D36.0020.0002] # TIBETAN LETTER PA +0FA4 ; [.2D37.0020.0002] # TIBETAN SUBJOINED LETTER PA +0F55 ; [.2D38.0020.0002] # TIBETAN LETTER PHA +0FA5 ; [.2D39.0020.0002] # TIBETAN SUBJOINED LETTER PHA +0F56 ; [.2D3A.0020.0002] # TIBETAN LETTER BA +0F57 ; [.2D3A.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER BHA +0FA6 ; [.2D3B.0020.0002] # TIBETAN SUBJOINED LETTER BA +0FA7 ; [.2D3B.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER BHA +0F58 ; [.2D3C.0020.0002] # TIBETAN LETTER MA +0FA8 ; [.2D3D.0020.0002] # TIBETAN SUBJOINED LETTER MA +0F59 ; [.2D3E.0020.0002] # TIBETAN LETTER TSA +0FA9 ; [.2D3F.0020.0002] # TIBETAN SUBJOINED LETTER TSA +0F5A ; [.2D40.0020.0002] # TIBETAN LETTER TSHA +0FAA ; [.2D41.0020.0002] # TIBETAN SUBJOINED LETTER TSHA +0F5B ; [.2D42.0020.0002] # TIBETAN LETTER DZA +0F5C ; [.2D42.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER DZHA +0FAB ; [.2D43.0020.0002] # TIBETAN SUBJOINED LETTER DZA +0FAC ; [.2D43.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER DZHA +0F5D ; [.2D44.0020.0002] # TIBETAN LETTER WA +0FAD ; [.2D45.0020.0002] # TIBETAN SUBJOINED LETTER WA +0FBA ; [.2D45.0020.0004][.0000.010C.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM WA +0F5E ; [.2D46.0020.0002] # TIBETAN LETTER ZHA +0FAE ; [.2D47.0020.0002] # TIBETAN SUBJOINED LETTER ZHA +0F5F ; [.2D48.0020.0002] # TIBETAN LETTER ZA +0FAF ; [.2D49.0020.0002] # TIBETAN SUBJOINED LETTER ZA +0F60 ; [.2D4A.0020.0002] # TIBETAN LETTER -A +0FB0 ; [.2D4B.0020.0002] # TIBETAN SUBJOINED LETTER -A +0F61 ; [.2D4C.0020.0002] # TIBETAN LETTER YA +0FB1 ; [.2D4D.0020.0002] # TIBETAN SUBJOINED LETTER YA +0FBB ; [.2D4D.0020.0004][.0000.010C.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM YA +0F62 ; [.2D4E.0020.0002] # TIBETAN LETTER RA +0F6A ; [.2D4E.0020.0004][.0000.010C.0004] # TIBETAN LETTER FIXED-FORM RA +0FB2 ; [.2D4F.0020.0002] # TIBETAN SUBJOINED LETTER RA +0FBC ; [.2D4F.0020.0004][.0000.010C.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM RA +0F6C ; [.2D50.0020.0002] # TIBETAN LETTER RRA +0F63 ; [.2D51.0020.0002] # TIBETAN LETTER LA +0FB3 ; [.2D52.0020.0002] # TIBETAN SUBJOINED LETTER LA +0F64 ; [.2D53.0020.0002] # TIBETAN LETTER SHA +0FB4 ; [.2D54.0020.0002] # TIBETAN SUBJOINED LETTER SHA +0F65 ; [.2D55.0020.0002] # TIBETAN LETTER SSA +0FB5 ; [.2D56.0020.0002] # TIBETAN SUBJOINED LETTER SSA +0F66 ; [.2D57.0020.0002] # TIBETAN LETTER SA +0FB6 ; [.2D58.0020.0002] # TIBETAN SUBJOINED LETTER SA +0F67 ; [.2D59.0020.0002] # TIBETAN LETTER HA +0FB7 ; [.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER HA +0F68 ; [.2D5B.0020.0002] # TIBETAN LETTER A +0F00 ; [.2D5B.0020.0004][.2D72.0020.0004][.0000.00BF.0004] # TIBETAN SYLLABLE OM +0FB8 ; [.2D5C.0020.0002] # TIBETAN SUBJOINED LETTER A +0F88 ; [.2D5D.0020.0002] # TIBETAN SIGN LCE TSA CAN +0F8D ; [.2D5E.0020.0002] # TIBETAN SUBJOINED SIGN LCE TSA CAN +0F89 ; [.2D5F.0020.0002] # TIBETAN SIGN MCHU CAN +0F8E ; [.2D60.0020.0002] # TIBETAN SUBJOINED SIGN MCHU CAN +0F8C ; [.2D61.0020.0002] # TIBETAN SIGN INVERTED MCHU CAN +0F8F ; [.2D62.0020.0002] # TIBETAN SUBJOINED SIGN INVERTED MCHU CAN +0F8A ; [.2D63.0020.0002] # TIBETAN SIGN GRU CAN RGYINGS +0F8B ; [.2D64.0020.0002] # TIBETAN SIGN GRU MED RGYINGS +0F71 ; [.2D65.0020.0002] # TIBETAN VOWEL SIGN AA +0F72 ; [.2D66.0020.0002] # TIBETAN VOWEL SIGN I +0F73 ; [.2D67.0020.0002] # TIBETAN VOWEL SIGN II +0F71 0F72 ; [.2D67.0020.0002] # TIBETAN VOWEL SIGN II +0F80 ; [.2D68.0020.0002] # TIBETAN VOWEL SIGN REVERSED I +0F81 ; [.2D69.0020.0002] # TIBETAN VOWEL SIGN REVERSED II +0F71 0F80 ; [.2D69.0020.0002] # TIBETAN VOWEL SIGN REVERSED II +0F74 ; [.2D6A.0020.0002] # TIBETAN VOWEL SIGN U +0F75 ; [.2D6B.0020.0002] # TIBETAN VOWEL SIGN UU +0F71 0F74 ; [.2D6B.0020.0002] # TIBETAN VOWEL SIGN UU +0F76 ; [.2D6C.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R +0FB2 0F80 ; [.2D6C.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R +0F77 ; [.2D6D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0FB2 0F71 0F80 ; [.2D6D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0FB2 0F81 ; [.2D6D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0F78 ; [.2D6E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L +0FB3 0F80 ; [.2D6E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L +0F79 ; [.2D6F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0FB3 0F71 0F80 ; [.2D6F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0FB3 0F81 ; [.2D6F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0F7A ; [.2D70.0020.0002] # TIBETAN VOWEL SIGN E +0F7B ; [.2D71.0020.0002] # TIBETAN VOWEL SIGN EE +0F7C ; [.2D72.0020.0002] # TIBETAN VOWEL SIGN O +0F7D ; [.2D73.0020.0002] # TIBETAN VOWEL SIGN OO +0F84 ; [.2D74.0020.0002] # TIBETAN MARK HALANTA +1C00 ; [.2D75.0020.0002] # LEPCHA LETTER KA +1C01 ; [.2D76.0020.0002] # LEPCHA LETTER KLA +1C02 ; [.2D77.0020.0002] # LEPCHA LETTER KHA +1C03 ; [.2D78.0020.0002] # LEPCHA LETTER GA +1C04 ; [.2D79.0020.0002] # LEPCHA LETTER GLA +1C05 ; [.2D7A.0020.0002] # LEPCHA LETTER NGA +1C06 ; [.2D7B.0020.0002] # LEPCHA LETTER CA +1C07 ; [.2D7C.0020.0002] # LEPCHA LETTER CHA +1C08 ; [.2D7D.0020.0002] # LEPCHA LETTER JA +1C09 ; [.2D7E.0020.0002] # LEPCHA LETTER NYA +1C4D ; [.2D7F.0020.0002] # LEPCHA LETTER TTA +1C4E ; [.2D80.0020.0002] # LEPCHA LETTER TTHA +1C4F ; [.2D81.0020.0002] # LEPCHA LETTER DDA +1C0A ; [.2D82.0020.0002] # LEPCHA LETTER TA +1C0B ; [.2D83.0020.0002] # LEPCHA LETTER THA +1C0C ; [.2D84.0020.0002] # LEPCHA LETTER DA +1C0D ; [.2D85.0020.0002] # LEPCHA LETTER NA +1C0E ; [.2D86.0020.0002] # LEPCHA LETTER PA +1C0F ; [.2D87.0020.0002] # LEPCHA LETTER PLA +1C10 ; [.2D88.0020.0002] # LEPCHA LETTER PHA +1C11 ; [.2D89.0020.0002] # LEPCHA LETTER FA +1C12 ; [.2D8A.0020.0002] # LEPCHA LETTER FLA +1C13 ; [.2D8B.0020.0002] # LEPCHA LETTER BA +1C14 ; [.2D8C.0020.0002] # LEPCHA LETTER BLA +1C15 ; [.2D8D.0020.0002] # LEPCHA LETTER MA +1C16 ; [.2D8E.0020.0002] # LEPCHA LETTER MLA +1C17 ; [.2D8F.0020.0002] # LEPCHA LETTER TSA +1C18 ; [.2D90.0020.0002] # LEPCHA LETTER TSHA +1C19 ; [.2D91.0020.0002] # LEPCHA LETTER DZA +1C1A ; [.2D92.0020.0002] # LEPCHA LETTER YA +1C24 ; [.2D93.0020.0002] # LEPCHA SUBJOINED LETTER YA +1C1B ; [.2D94.0020.0002] # LEPCHA LETTER RA +1C25 ; [.2D95.0020.0002] # LEPCHA SUBJOINED LETTER RA +1C1C ; [.2D96.0020.0002] # LEPCHA LETTER LA +1C1D ; [.2D97.0020.0002] # LEPCHA LETTER HA +1C1E ; [.2D98.0020.0002] # LEPCHA LETTER HLA +1C1F ; [.2D99.0020.0002] # LEPCHA LETTER VA +1C20 ; [.2D9A.0020.0002] # LEPCHA LETTER SA +1C21 ; [.2D9B.0020.0002] # LEPCHA LETTER SHA +1C22 ; [.2D9C.0020.0002] # LEPCHA LETTER WA +1C23 ; [.2D9D.0020.0002] # LEPCHA LETTER A +1C36 ; [.2D9E.0020.0002] # LEPCHA SIGN RAN +1C26 ; [.2D9F.0020.0002] # LEPCHA VOWEL SIGN AA +1C27 ; [.2DA0.0020.0002] # LEPCHA VOWEL SIGN I +1C28 ; [.2DA1.0020.0002] # LEPCHA VOWEL SIGN O +1C29 ; [.2DA2.0020.0002] # LEPCHA VOWEL SIGN OO +1C2A ; [.2DA3.0020.0002] # LEPCHA VOWEL SIGN U +1C2B ; [.2DA4.0020.0002] # LEPCHA VOWEL SIGN UU +1C2C ; [.2DA5.0020.0002] # LEPCHA VOWEL SIGN E +1C2D ; [.2DA6.0020.0002] # LEPCHA CONSONANT SIGN K +1C2E ; [.2DA7.0020.0002] # LEPCHA CONSONANT SIGN M +1C2F ; [.2DA8.0020.0002] # LEPCHA CONSONANT SIGN L +1C30 ; [.2DA9.0020.0002] # LEPCHA CONSONANT SIGN N +1C31 ; [.2DAA.0020.0002] # LEPCHA CONSONANT SIGN P +1C32 ; [.2DAB.0020.0002] # LEPCHA CONSONANT SIGN R +1C33 ; [.2DAC.0020.0002] # LEPCHA CONSONANT SIGN T +1C34 ; [.2DAD.0020.0002] # LEPCHA CONSONANT SIGN NYIN-DO +1C35 ; [.2DAE.0020.0002] # LEPCHA CONSONANT SIGN KANG +A840 ; [.2DAF.0020.0002] # PHAGS-PA LETTER KA +A841 ; [.2DB0.0020.0002] # PHAGS-PA LETTER KHA +A842 ; [.2DB1.0020.0002] # PHAGS-PA LETTER GA +A843 ; [.2DB2.0020.0002] # PHAGS-PA LETTER NGA +A844 ; [.2DB3.0020.0002] # PHAGS-PA LETTER CA +A845 ; [.2DB4.0020.0002] # PHAGS-PA LETTER CHA +A846 ; [.2DB5.0020.0002] # PHAGS-PA LETTER JA +A847 ; [.2DB6.0020.0002] # PHAGS-PA LETTER NYA +A869 ; [.2DB7.0020.0002] # PHAGS-PA LETTER TTA +A86A ; [.2DB8.0020.0002] # PHAGS-PA LETTER TTHA +A86B ; [.2DB9.0020.0002] # PHAGS-PA LETTER DDA +A86C ; [.2DBA.0020.0002] # PHAGS-PA LETTER NNA +A848 ; [.2DBB.0020.0002] # PHAGS-PA LETTER TA +A849 ; [.2DBC.0020.0002] # PHAGS-PA LETTER THA +A84A ; [.2DBD.0020.0002] # PHAGS-PA LETTER DA +A84B ; [.2DBE.0020.0002] # PHAGS-PA LETTER NA +A84C ; [.2DBF.0020.0002] # PHAGS-PA LETTER PA +A84D ; [.2DC0.0020.0002] # PHAGS-PA LETTER PHA +A84E ; [.2DC1.0020.0002] # PHAGS-PA LETTER BA +A84F ; [.2DC2.0020.0002] # PHAGS-PA LETTER MA +A850 ; [.2DC3.0020.0002] # PHAGS-PA LETTER TSA +A851 ; [.2DC4.0020.0002] # PHAGS-PA LETTER TSHA +A852 ; [.2DC5.0020.0002] # PHAGS-PA LETTER DZA +A853 ; [.2DC6.0020.0002] # PHAGS-PA LETTER WA +A867 ; [.2DC7.0020.0002] # PHAGS-PA SUBJOINED LETTER WA +A854 ; [.2DC8.0020.0002] # PHAGS-PA LETTER ZHA +A855 ; [.2DC9.0020.0002] # PHAGS-PA LETTER ZA +A856 ; [.2DCA.0020.0002] # PHAGS-PA LETTER SMALL A +A857 ; [.2DCB.0020.0002] # PHAGS-PA LETTER YA +A868 ; [.2DCC.0020.0002] # PHAGS-PA SUBJOINED LETTER YA +A86D ; [.2DCD.0020.0002] # PHAGS-PA LETTER ALTERNATE YA +A858 ; [.2DCE.0020.0002] # PHAGS-PA LETTER RA +A871 ; [.2DCF.0020.0002] # PHAGS-PA SUBJOINED LETTER RA +A872 ; [.2DD0.0020.0002] # PHAGS-PA SUPERFIXED LETTER RA +A859 ; [.2DD1.0020.0002] # PHAGS-PA LETTER LA +A85A ; [.2DD2.0020.0002] # PHAGS-PA LETTER SHA +A86E ; [.2DD3.0020.0002] # PHAGS-PA LETTER VOICELESS SHA +A85B ; [.2DD4.0020.0002] # PHAGS-PA LETTER SA +A85C ; [.2DD5.0020.0002] # PHAGS-PA LETTER HA +A86F ; [.2DD6.0020.0002] # PHAGS-PA LETTER VOICED HA +A870 ; [.2DD7.0020.0002] # PHAGS-PA LETTER ASPIRATED FA +A85D ; [.2DD8.0020.0002] # PHAGS-PA LETTER A +A862 ; [.2DD9.0020.0002] # PHAGS-PA LETTER QA +A863 ; [.2DDA.0020.0002] # PHAGS-PA LETTER XA +A864 ; [.2DDB.0020.0002] # PHAGS-PA LETTER FA +A865 ; [.2DDC.0020.0002] # PHAGS-PA LETTER GGA +A85E ; [.2DDD.0020.0002] # PHAGS-PA LETTER I +A85F ; [.2DDE.0020.0002] # PHAGS-PA LETTER U +A860 ; [.2DDF.0020.0002] # PHAGS-PA LETTER E +A861 ; [.2DE0.0020.0002] # PHAGS-PA LETTER O +A866 ; [.2DE1.0020.0002] # PHAGS-PA LETTER EE +A873 ; [.2DE2.0020.0002] # PHAGS-PA LETTER CANDRABINDU +1900 ; [.2DE3.0020.0002] # LIMBU VOWEL-CARRIER LETTER +1901 ; [.2DE4.0020.0002] # LIMBU LETTER KA +1902 ; [.2DE5.0020.0002] # LIMBU LETTER KHA +1903 ; [.2DE6.0020.0002] # LIMBU LETTER GA +1904 ; [.2DE7.0020.0002] # LIMBU LETTER GHA +1905 ; [.2DE8.0020.0002] # LIMBU LETTER NGA +1906 ; [.2DE9.0020.0002] # LIMBU LETTER CA +1907 ; [.2DEA.0020.0002] # LIMBU LETTER CHA +1908 ; [.2DEB.0020.0002] # LIMBU LETTER JA +191D ; [.2DEB.0020.0004][.2E09.0020.0004] # LIMBU LETTER GYAN +1909 ; [.2DEC.0020.0002] # LIMBU LETTER JHA +190A ; [.2DED.0020.0002] # LIMBU LETTER YAN +190B ; [.2DEE.0020.0002] # LIMBU LETTER TA +191E ; [.2DEE.0020.0004][.2E0A.0020.0004] # LIMBU LETTER TRA +190C ; [.2DEF.0020.0002] # LIMBU LETTER THA +190D ; [.2DF0.0020.0002] # LIMBU LETTER DA +190E ; [.2DF1.0020.0002] # LIMBU LETTER DHA +190F ; [.2DF2.0020.0002] # LIMBU LETTER NA +1910 ; [.2DF3.0020.0002] # LIMBU LETTER PA +1911 ; [.2DF4.0020.0002] # LIMBU LETTER PHA +1912 ; [.2DF5.0020.0002] # LIMBU LETTER BA +1913 ; [.2DF6.0020.0002] # LIMBU LETTER BHA +1914 ; [.2DF7.0020.0002] # LIMBU LETTER MA +1915 ; [.2DF8.0020.0002] # LIMBU LETTER YA +1916 ; [.2DF9.0020.0002] # LIMBU LETTER RA +1917 ; [.2DFA.0020.0002] # LIMBU LETTER LA +1918 ; [.2DFB.0020.0002] # LIMBU LETTER WA +1919 ; [.2DFC.0020.0002] # LIMBU LETTER SHA +191A ; [.2DFD.0020.0002] # LIMBU LETTER SSA +191B ; [.2DFE.0020.0002] # LIMBU LETTER SA +191C ; [.2DFF.0020.0002] # LIMBU LETTER HA +1920 ; [.2E00.0020.0002] # LIMBU VOWEL SIGN A +1921 ; [.2E01.0020.0002] # LIMBU VOWEL SIGN I +1922 ; [.2E02.0020.0002] # LIMBU VOWEL SIGN U +1923 ; [.2E03.0020.0002] # LIMBU VOWEL SIGN EE +1924 ; [.2E04.0020.0002] # LIMBU VOWEL SIGN AI +1925 ; [.2E05.0020.0002] # LIMBU VOWEL SIGN OO +1926 ; [.2E06.0020.0002] # LIMBU VOWEL SIGN AU +1927 ; [.2E07.0020.0002] # LIMBU VOWEL SIGN E +1928 ; [.2E08.0020.0002] # LIMBU VOWEL SIGN O +1929 ; [.2E09.0020.0002] # LIMBU SUBJOINED LETTER YA +192A ; [.2E0A.0020.0002] # LIMBU SUBJOINED LETTER RA +192B ; [.2E0B.0020.0002] # LIMBU SUBJOINED LETTER WA +1930 ; [.2E0C.0020.0002] # LIMBU SMALL LETTER KA +1931 ; [.2E0D.0020.0002] # LIMBU SMALL LETTER NGA +1932 ; [.2E0E.0020.0002] # LIMBU SMALL LETTER ANUSVARA +1933 ; [.2E0F.0020.0002] # LIMBU SMALL LETTER TA +1934 ; [.2E10.0020.0002] # LIMBU SMALL LETTER NA +1935 ; [.2E11.0020.0002] # LIMBU SMALL LETTER PA +1936 ; [.2E12.0020.0002] # LIMBU SMALL LETTER MA +1937 ; [.2E13.0020.0002] # LIMBU SMALL LETTER RA +1938 ; [.2E14.0020.0002] # LIMBU SMALL LETTER LA +1700 ; [.2E15.0020.0002] # TAGALOG LETTER A +1701 ; [.2E16.0020.0002] # TAGALOG LETTER I +1702 ; [.2E17.0020.0002] # TAGALOG LETTER U +1703 ; [.2E18.0020.0002] # TAGALOG LETTER KA +1704 ; [.2E19.0020.0002] # TAGALOG LETTER GA +1705 ; [.2E1A.0020.0002] # TAGALOG LETTER NGA +1706 ; [.2E1B.0020.0002] # TAGALOG LETTER TA +1707 ; [.2E1C.0020.0002] # TAGALOG LETTER DA +1708 ; [.2E1D.0020.0002] # TAGALOG LETTER NA +1709 ; [.2E1E.0020.0002] # TAGALOG LETTER PA +170A ; [.2E1F.0020.0002] # TAGALOG LETTER BA +170B ; [.2E20.0020.0002] # TAGALOG LETTER MA +170C ; [.2E21.0020.0002] # TAGALOG LETTER YA +170E ; [.2E22.0020.0002] # TAGALOG LETTER LA +170F ; [.2E23.0020.0002] # TAGALOG LETTER WA +1710 ; [.2E24.0020.0002] # TAGALOG LETTER SA +1711 ; [.2E25.0020.0002] # TAGALOG LETTER HA +1712 ; [.2E26.0020.0002] # TAGALOG VOWEL SIGN I +1713 ; [.2E27.0020.0002] # TAGALOG VOWEL SIGN U +1714 ; [.2E28.0020.0002] # TAGALOG SIGN VIRAMA +1720 ; [.2E29.0020.0002] # HANUNOO LETTER A +1721 ; [.2E2A.0020.0002] # HANUNOO LETTER I +1722 ; [.2E2B.0020.0002] # HANUNOO LETTER U +1723 ; [.2E2C.0020.0002] # HANUNOO LETTER KA +1724 ; [.2E2D.0020.0002] # HANUNOO LETTER GA +1725 ; [.2E2E.0020.0002] # HANUNOO LETTER NGA +1726 ; [.2E2F.0020.0002] # HANUNOO LETTER TA +1727 ; [.2E30.0020.0002] # HANUNOO LETTER DA +1728 ; [.2E31.0020.0002] # HANUNOO LETTER NA +1729 ; [.2E32.0020.0002] # HANUNOO LETTER PA +172A ; [.2E33.0020.0002] # HANUNOO LETTER BA +172B ; [.2E34.0020.0002] # HANUNOO LETTER MA +172C ; [.2E35.0020.0002] # HANUNOO LETTER YA +172D ; [.2E36.0020.0002] # HANUNOO LETTER RA +172E ; [.2E37.0020.0002] # HANUNOO LETTER LA +172F ; [.2E38.0020.0002] # HANUNOO LETTER WA +1730 ; [.2E39.0020.0002] # HANUNOO LETTER SA +1731 ; [.2E3A.0020.0002] # HANUNOO LETTER HA +1732 ; [.2E3B.0020.0002] # HANUNOO VOWEL SIGN I +1733 ; [.2E3C.0020.0002] # HANUNOO VOWEL SIGN U +1734 ; [.2E3D.0020.0002] # HANUNOO SIGN PAMUDPOD +1740 ; [.2E3E.0020.0002] # BUHID LETTER A +1741 ; [.2E3F.0020.0002] # BUHID LETTER I +1742 ; [.2E40.0020.0002] # BUHID LETTER U +1743 ; [.2E41.0020.0002] # BUHID LETTER KA +1744 ; [.2E42.0020.0002] # BUHID LETTER GA +1745 ; [.2E43.0020.0002] # BUHID LETTER NGA +1746 ; [.2E44.0020.0002] # BUHID LETTER TA +1747 ; [.2E45.0020.0002] # BUHID LETTER DA +1748 ; [.2E46.0020.0002] # BUHID LETTER NA +1749 ; [.2E47.0020.0002] # BUHID LETTER PA +174A ; [.2E48.0020.0002] # BUHID LETTER BA +174B ; [.2E49.0020.0002] # BUHID LETTER MA +174C ; [.2E4A.0020.0002] # BUHID LETTER YA +174D ; [.2E4B.0020.0002] # BUHID LETTER RA +174E ; [.2E4C.0020.0002] # BUHID LETTER LA +174F ; [.2E4D.0020.0002] # BUHID LETTER WA +1750 ; [.2E4E.0020.0002] # BUHID LETTER SA +1751 ; [.2E4F.0020.0002] # BUHID LETTER HA +1752 ; [.2E50.0020.0002] # BUHID VOWEL SIGN I +1753 ; [.2E51.0020.0002] # BUHID VOWEL SIGN U +1760 ; [.2E52.0020.0002] # TAGBANWA LETTER A +1761 ; [.2E53.0020.0002] # TAGBANWA LETTER I +1762 ; [.2E54.0020.0002] # TAGBANWA LETTER U +1763 ; [.2E55.0020.0002] # TAGBANWA LETTER KA +1764 ; [.2E56.0020.0002] # TAGBANWA LETTER GA +1765 ; [.2E57.0020.0002] # TAGBANWA LETTER NGA +1766 ; [.2E58.0020.0002] # TAGBANWA LETTER TA +1767 ; [.2E59.0020.0002] # TAGBANWA LETTER DA +1768 ; [.2E5A.0020.0002] # TAGBANWA LETTER NA +1769 ; [.2E5B.0020.0002] # TAGBANWA LETTER PA +176A ; [.2E5C.0020.0002] # TAGBANWA LETTER BA +176B ; [.2E5D.0020.0002] # TAGBANWA LETTER MA +176C ; [.2E5E.0020.0002] # TAGBANWA LETTER YA +176E ; [.2E5F.0020.0002] # TAGBANWA LETTER LA +176F ; [.2E60.0020.0002] # TAGBANWA LETTER WA +1770 ; [.2E61.0020.0002] # TAGBANWA LETTER SA +1772 ; [.2E62.0020.0002] # TAGBANWA VOWEL SIGN I +1773 ; [.2E63.0020.0002] # TAGBANWA VOWEL SIGN U +1A00 ; [.2E64.0020.0002] # BUGINESE LETTER KA +1A01 ; [.2E65.0020.0002] # BUGINESE LETTER GA +1A02 ; [.2E66.0020.0002] # BUGINESE LETTER NGA +1A03 ; [.2E67.0020.0002] # BUGINESE LETTER NGKA +1A04 ; [.2E68.0020.0002] # BUGINESE LETTER PA +1A05 ; [.2E69.0020.0002] # BUGINESE LETTER BA +1A06 ; [.2E6A.0020.0002] # BUGINESE LETTER MA +1A07 ; [.2E6B.0020.0002] # BUGINESE LETTER MPA +1A08 ; [.2E6C.0020.0002] # BUGINESE LETTER TA +1A09 ; [.2E6D.0020.0002] # BUGINESE LETTER DA +1A0A ; [.2E6E.0020.0002] # BUGINESE LETTER NA +1A0B ; [.2E6F.0020.0002] # BUGINESE LETTER NRA +1A0C ; [.2E70.0020.0002] # BUGINESE LETTER CA +1A0D ; [.2E71.0020.0002] # BUGINESE LETTER JA +1A0E ; [.2E72.0020.0002] # BUGINESE LETTER NYA +1A0F ; [.2E73.0020.0002] # BUGINESE LETTER NYCA +1A10 ; [.2E74.0020.0002] # BUGINESE LETTER YA +1A11 ; [.2E75.0020.0002] # BUGINESE LETTER RA +1A12 ; [.2E76.0020.0002] # BUGINESE LETTER LA +1A13 ; [.2E77.0020.0002] # BUGINESE LETTER VA +1A14 ; [.2E78.0020.0002] # BUGINESE LETTER SA +1A15 ; [.2E79.0020.0002] # BUGINESE LETTER A +1A16 ; [.2E7A.0020.0002] # BUGINESE LETTER HA +1A17 ; [.2E7B.0020.0002] # BUGINESE VOWEL SIGN I +1A18 ; [.2E7C.0020.0002] # BUGINESE VOWEL SIGN U +1A19 ; [.2E7D.0020.0002] # BUGINESE VOWEL SIGN E +1A1A ; [.2E7E.0020.0002] # BUGINESE VOWEL SIGN O +1A1B ; [.2E7F.0020.0002] # BUGINESE VOWEL SIGN AE +1BC0 ; [.2E80.0020.0002] # BATAK LETTER A +1BC1 ; [.2E80.0020.0004] # BATAK LETTER SIMALUNGUN A +1BC2 ; [.2E81.0020.0002] # BATAK LETTER HA +1BC3 ; [.2E81.0020.0004] # BATAK LETTER SIMALUNGUN HA +1BC4 ; [.2E81.0020.0004] # BATAK LETTER MANDAILING HA +1BC5 ; [.2E82.0020.0002] # BATAK LETTER BA +1BC6 ; [.2E82.0020.0004] # BATAK LETTER KARO BA +1BC7 ; [.2E83.0020.0002] # BATAK LETTER PA +1BC8 ; [.2E83.0020.0004] # BATAK LETTER SIMALUNGUN PA +1BC9 ; [.2E84.0020.0002] # BATAK LETTER NA +1BCA ; [.2E84.0020.0004] # BATAK LETTER MANDAILING NA +1BCB ; [.2E85.0020.0002] # BATAK LETTER WA +1BCC ; [.2E85.0020.0004] # BATAK LETTER SIMALUNGUN WA +1BCD ; [.2E85.0020.0004] # BATAK LETTER PAKPAK WA +1BCE ; [.2E86.0020.0002] # BATAK LETTER GA +1BCF ; [.2E86.0020.0004] # BATAK LETTER SIMALUNGUN GA +1BD0 ; [.2E87.0020.0002] # BATAK LETTER JA +1BD1 ; [.2E88.0020.0002] # BATAK LETTER DA +1BD2 ; [.2E89.0020.0002] # BATAK LETTER RA +1BD3 ; [.2E89.0020.0004] # BATAK LETTER SIMALUNGUN RA +1BD4 ; [.2E8A.0020.0002] # BATAK LETTER MA +1BD5 ; [.2E8A.0020.0004] # BATAK LETTER SIMALUNGUN MA +1BD6 ; [.2E8B.0020.0002] # BATAK LETTER SOUTHERN TA +1BD7 ; [.2E8B.0020.0004] # BATAK LETTER NORTHERN TA +1BD8 ; [.2E8C.0020.0002] # BATAK LETTER SA +1BD9 ; [.2E8C.0020.0004] # BATAK LETTER SIMALUNGUN SA +1BDA ; [.2E8C.0020.0004] # BATAK LETTER MANDAILING SA +1BDB ; [.2E8D.0020.0002] # BATAK LETTER YA +1BDC ; [.2E8D.0020.0004] # BATAK LETTER SIMALUNGUN YA +1BDD ; [.2E8E.0020.0002] # BATAK LETTER NGA +1BDE ; [.2E8F.0020.0002] # BATAK LETTER LA +1BDF ; [.2E8F.0020.0004] # BATAK LETTER SIMALUNGUN LA +1BE0 ; [.2E90.0020.0002] # BATAK LETTER NYA +1BE1 ; [.2E91.0020.0002] # BATAK LETTER CA +1BE2 ; [.2E92.0020.0002] # BATAK LETTER NDA +1BE3 ; [.2E93.0020.0002] # BATAK LETTER MBA +1BE4 ; [.2E94.0020.0002] # BATAK LETTER I +1BE5 ; [.2E95.0020.0002] # BATAK LETTER U +1BE7 ; [.2E96.0020.0002] # BATAK VOWEL SIGN E +1BE8 ; [.2E96.0020.0004] # BATAK VOWEL SIGN PAKPAK E +1BE9 ; [.2E97.0020.0002] # BATAK VOWEL SIGN EE +1BEA ; [.2E98.0020.0002] # BATAK VOWEL SIGN I +1BEB ; [.2E98.0020.0004] # BATAK VOWEL SIGN KARO I +1BEC ; [.2E99.0020.0002] # BATAK VOWEL SIGN O +1BED ; [.2E99.0020.0004] # BATAK VOWEL SIGN KARO O +1BEE ; [.2E9A.0020.0002] # BATAK VOWEL SIGN U +1BEF ; [.2E9A.0020.0004] # BATAK VOWEL SIGN U FOR SIMALUNGUN SA +1BF0 ; [.2E9B.0020.0002] # BATAK CONSONANT SIGN NG +1BF1 ; [.2E9C.0020.0002] # BATAK CONSONANT SIGN H +1BF2 ; [.2E9D.0020.0002] # BATAK PANGOLAT +1BF3 ; [.2E9E.0020.0002] # BATAK PANONGONAN +A930 ; [.2E9F.0020.0002] # REJANG LETTER KA +A931 ; [.2EA0.0020.0002] # REJANG LETTER GA +A932 ; [.2EA1.0020.0002] # REJANG LETTER NGA +A933 ; [.2EA2.0020.0002] # REJANG LETTER TA +A934 ; [.2EA3.0020.0002] # REJANG LETTER DA +A935 ; [.2EA4.0020.0002] # REJANG LETTER NA +A936 ; [.2EA5.0020.0002] # REJANG LETTER PA +A937 ; [.2EA6.0020.0002] # REJANG LETTER BA +A938 ; [.2EA7.0020.0002] # REJANG LETTER MA +A939 ; [.2EA8.0020.0002] # REJANG LETTER CA +A93A ; [.2EA9.0020.0002] # REJANG LETTER JA +A93B ; [.2EAA.0020.0002] # REJANG LETTER NYA +A93C ; [.2EAB.0020.0002] # REJANG LETTER SA +A93D ; [.2EAC.0020.0002] # REJANG LETTER RA +A93E ; [.2EAD.0020.0002] # REJANG LETTER LA +A93F ; [.2EAE.0020.0002] # REJANG LETTER YA +A940 ; [.2EAF.0020.0002] # REJANG LETTER WA +A941 ; [.2EB0.0020.0002] # REJANG LETTER HA +A942 ; [.2EB1.0020.0002] # REJANG LETTER MBA +A943 ; [.2EB2.0020.0002] # REJANG LETTER NGGA +A944 ; [.2EB3.0020.0002] # REJANG LETTER NDA +A945 ; [.2EB4.0020.0002] # REJANG LETTER NYJA +A946 ; [.2EB5.0020.0002] # REJANG LETTER A +A947 ; [.2EB6.0020.0002] # REJANG VOWEL SIGN I +A948 ; [.2EB7.0020.0002] # REJANG VOWEL SIGN U +A949 ; [.2EB8.0020.0002] # REJANG VOWEL SIGN E +A94A ; [.2EB9.0020.0002] # REJANG VOWEL SIGN AI +A94B ; [.2EBA.0020.0002] # REJANG VOWEL SIGN O +A94C ; [.2EBB.0020.0002] # REJANG VOWEL SIGN AU +A94D ; [.2EBC.0020.0002] # REJANG VOWEL SIGN EU +A94E ; [.2EBD.0020.0002] # REJANG VOWEL SIGN EA +A94F ; [.2EBE.0020.0002] # REJANG CONSONANT SIGN NG +A950 ; [.2EBF.0020.0002] # REJANG CONSONANT SIGN N +A951 ; [.2EC0.0020.0002] # REJANG CONSONANT SIGN R +A952 ; [.2EC1.0020.0002] # REJANG CONSONANT SIGN H +A953 ; [.2EC2.0020.0002] # REJANG VIRAMA +A90A ; [.2EC3.0020.0002] # KAYAH LI LETTER KA +A90B ; [.2EC4.0020.0002] # KAYAH LI LETTER KHA +A90C ; [.2EC5.0020.0002] # KAYAH LI LETTER GA +A90D ; [.2EC6.0020.0002] # KAYAH LI LETTER NGA +A90E ; [.2EC7.0020.0002] # KAYAH LI LETTER SA +A90F ; [.2EC8.0020.0002] # KAYAH LI LETTER SHA +A910 ; [.2EC9.0020.0002] # KAYAH LI LETTER ZA +A911 ; [.2ECA.0020.0002] # KAYAH LI LETTER NYA +A912 ; [.2ECB.0020.0002] # KAYAH LI LETTER TA +A913 ; [.2ECC.0020.0002] # KAYAH LI LETTER HTA +A914 ; [.2ECD.0020.0002] # KAYAH LI LETTER NA +A915 ; [.2ECE.0020.0002] # KAYAH LI LETTER PA +A916 ; [.2ECF.0020.0002] # KAYAH LI LETTER PHA +A917 ; [.2ED0.0020.0002] # KAYAH LI LETTER MA +A918 ; [.2ED1.0020.0002] # KAYAH LI LETTER DA +A919 ; [.2ED2.0020.0002] # KAYAH LI LETTER BA +A91A ; [.2ED3.0020.0002] # KAYAH LI LETTER RA +A91B ; [.2ED4.0020.0002] # KAYAH LI LETTER YA +A91C ; [.2ED5.0020.0002] # KAYAH LI LETTER LA +A91D ; [.2ED6.0020.0002] # KAYAH LI LETTER WA +A91E ; [.2ED7.0020.0002] # KAYAH LI LETTER THA +A91F ; [.2ED8.0020.0002] # KAYAH LI LETTER HA +A920 ; [.2ED9.0020.0002] # KAYAH LI LETTER VA +A921 ; [.2EDA.0020.0002] # KAYAH LI LETTER CA +A922 ; [.2EDB.0020.0002] # KAYAH LI LETTER A +A923 ; [.2EDC.0020.0002] # KAYAH LI LETTER OE +A924 ; [.2EDD.0020.0002] # KAYAH LI LETTER I +A925 ; [.2EDE.0020.0002] # KAYAH LI LETTER OO +A926 ; [.2EDF.0020.0002] # KAYAH LI VOWEL UE +A927 ; [.2EE0.0020.0002] # KAYAH LI VOWEL E +A928 ; [.2EE1.0020.0002] # KAYAH LI VOWEL U +A929 ; [.2EE2.0020.0002] # KAYAH LI VOWEL EE +A92A ; [.2EE3.0020.0002] # KAYAH LI VOWEL O +1000 ; [.2EE4.0020.0002] # MYANMAR LETTER KA +1075 ; [.2EE5.0020.0002] # MYANMAR LETTER SHAN KA +1001 ; [.2EE6.0020.0002] # MYANMAR LETTER KHA +1076 ; [.2EE7.0020.0002] # MYANMAR LETTER SHAN KHA +1002 ; [.2EE8.0020.0002] # MYANMAR LETTER GA +1077 ; [.2EE9.0020.0002] # MYANMAR LETTER SHAN GA +AA60 ; [.2EEA.0020.0002] # MYANMAR LETTER KHAMTI GA +A9E9 ; [.2EEB.0020.0002] # MYANMAR LETTER TAI LAING GA +1003 ; [.2EEC.0020.0002] # MYANMAR LETTER GHA +A9E0 ; [.2EED.0020.0002] # MYANMAR LETTER SHAN GHA +A9EA ; [.2EEE.0020.0002] # MYANMAR LETTER TAI LAING GHA +1004 ; [.2EEF.0020.0002] # MYANMAR LETTER NGA +105A ; [.2EF0.0020.0002] # MYANMAR LETTER MON NGA +1005 ; [.2EF1.0020.0002] # MYANMAR LETTER CA +1078 ; [.2EF2.0020.0002] # MYANMAR LETTER SHAN CA +AA61 ; [.2EF3.0020.0002] # MYANMAR LETTER KHAMTI CA +1006 ; [.2EF4.0020.0002] # MYANMAR LETTER CHA +A9E1 ; [.2EF5.0020.0002] # MYANMAR LETTER SHAN CHA +AA62 ; [.2EF6.0020.0002] # MYANMAR LETTER KHAMTI CHA +AA7E ; [.2EF7.0020.0002] # MYANMAR LETTER SHWE PALAUNG CHA +1007 ; [.2EF8.0020.0002] # MYANMAR LETTER JA +AA63 ; [.2EF9.0020.0002] # MYANMAR LETTER KHAMTI JA +A9EB ; [.2EFA.0020.0002] # MYANMAR LETTER TAI LAING JA +1079 ; [.2EFB.0020.0002] # MYANMAR LETTER SHAN ZA +AA72 ; [.2EFC.0020.0002] # MYANMAR LETTER KHAMTI ZA +1008 ; [.2EFD.0020.0002] # MYANMAR LETTER JHA +105B ; [.2EFE.0020.0002] # MYANMAR LETTER MON JHA +A9E2 ; [.2EFF.0020.0002] # MYANMAR LETTER SHAN JHA +AA64 ; [.2F00.0020.0002] # MYANMAR LETTER KHAMTI JHA +A9EC ; [.2F01.0020.0002] # MYANMAR LETTER TAI LAING JHA +1061 ; [.2F02.0020.0002] # MYANMAR LETTER SGAW KAREN SHA +AA7F ; [.2F03.0020.0002] # MYANMAR LETTER SHWE PALAUNG SHA +1009 ; [.2F04.0020.0002] # MYANMAR LETTER NYA +107A ; [.2F05.0020.0002] # MYANMAR LETTER SHAN NYA +AA65 ; [.2F06.0020.0002] # MYANMAR LETTER KHAMTI NYA +A9E7 ; [.2F07.0020.0002] # MYANMAR LETTER TAI LAING NYA +100A ; [.2F08.0020.0002] # MYANMAR LETTER NNYA +100B ; [.2F09.0020.0002] # MYANMAR LETTER TTA +AA66 ; [.2F0A.0020.0002] # MYANMAR LETTER KHAMTI TTA +100C ; [.2F0B.0020.0002] # MYANMAR LETTER TTHA +AA67 ; [.2F0C.0020.0002] # MYANMAR LETTER KHAMTI TTHA +100D ; [.2F0D.0020.0002] # MYANMAR LETTER DDA +AA68 ; [.2F0E.0020.0002] # MYANMAR LETTER KHAMTI DDA +A9ED ; [.2F0F.0020.0002] # MYANMAR LETTER TAI LAING DDA +100E ; [.2F10.0020.0002] # MYANMAR LETTER DDHA +AA69 ; [.2F11.0020.0002] # MYANMAR LETTER KHAMTI DDHA +A9EE ; [.2F12.0020.0002] # MYANMAR LETTER TAI LAING DDHA +100F ; [.2F13.0020.0002] # MYANMAR LETTER NNA +106E ; [.2F14.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN NNA +A9E3 ; [.2F15.0020.0002] # MYANMAR LETTER SHAN NNA +A9EF ; [.2F16.0020.0002] # MYANMAR LETTER TAI LAING NNA +1010 ; [.2F17.0020.0002] # MYANMAR LETTER TA +1011 ; [.2F18.0020.0002] # MYANMAR LETTER THA +1012 ; [.2F19.0020.0002] # MYANMAR LETTER DA +107B ; [.2F1A.0020.0002] # MYANMAR LETTER SHAN DA +A9FB ; [.2F1B.0020.0002] # MYANMAR LETTER TAI LAING DA +1013 ; [.2F1C.0020.0002] # MYANMAR LETTER DHA +AA6A ; [.2F1D.0020.0002] # MYANMAR LETTER KHAMTI DHA +A9FC ; [.2F1E.0020.0002] # MYANMAR LETTER TAI LAING DHA +1014 ; [.2F1F.0020.0002] # MYANMAR LETTER NA +107C ; [.2F20.0020.0002] # MYANMAR LETTER SHAN NA +AA6B ; [.2F21.0020.0002] # MYANMAR LETTER KHAMTI NA +105E ; [.2F22.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL NA +1015 ; [.2F23.0020.0002] # MYANMAR LETTER PA +1016 ; [.2F24.0020.0002] # MYANMAR LETTER PHA +107D ; [.2F25.0020.0002] # MYANMAR LETTER SHAN PHA +107E ; [.2F26.0020.0002] # MYANMAR LETTER SHAN FA +AA6F ; [.2F27.0020.0002] # MYANMAR LETTER KHAMTI FA +108E ; [.2F28.0020.0002] # MYANMAR LETTER RUMAI PALAUNG FA +A9E8 ; [.2F29.0020.0002] # MYANMAR LETTER TAI LAING FA +1017 ; [.2F2A.0020.0002] # MYANMAR LETTER BA +107F ; [.2F2B.0020.0002] # MYANMAR LETTER SHAN BA +A9FD ; [.2F2C.0020.0002] # MYANMAR LETTER TAI LAING BA +1018 ; [.2F2D.0020.0002] # MYANMAR LETTER BHA +A9E4 ; [.2F2E.0020.0002] # MYANMAR LETTER SHAN BHA +A9FE ; [.2F2F.0020.0002] # MYANMAR LETTER TAI LAING BHA +1019 ; [.2F30.0020.0002] # MYANMAR LETTER MA +105F ; [.2F31.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL MA +101A ; [.2F32.0020.0002] # MYANMAR LETTER YA +103B ; [.2F33.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL YA +101B ; [.2F34.0020.0002] # MYANMAR LETTER RA +AA73 ; [.2F35.0020.0002] # MYANMAR LETTER KHAMTI RA +AA7A ; [.2F36.0020.0002] # MYANMAR LETTER AITON RA +103C ; [.2F37.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL RA +101C ; [.2F38.0020.0002] # MYANMAR LETTER LA +1060 ; [.2F39.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL LA +101D ; [.2F3A.0020.0002] # MYANMAR LETTER WA +103D ; [.2F3B.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL WA +1082 ; [.2F3C.0020.0002] # MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1080 ; [.2F3D.0020.0002] # MYANMAR LETTER SHAN THA +1050 ; [.2F3E.0020.0002] # MYANMAR LETTER SHA +1051 ; [.2F3F.0020.0002] # MYANMAR LETTER SSA +1065 ; [.2F40.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN THA +101E ; [.2F41.0020.0002] # MYANMAR LETTER SA +103F ; [.2F41.0020.0004][.2F7A.0020.0004][.2F41.0020.0004] # MYANMAR LETTER GREAT SA +AA6C ; [.2F42.0020.0002] # MYANMAR LETTER KHAMTI SA +101F ; [.2F43.0020.0002] # MYANMAR LETTER HA +1081 ; [.2F44.0020.0002] # MYANMAR LETTER SHAN HA +AA6D ; [.2F45.0020.0002] # MYANMAR LETTER KHAMTI HA +103E ; [.2F46.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL HA +AA6E ; [.2F47.0020.0002] # MYANMAR LETTER KHAMTI HHA +AA71 ; [.2F48.0020.0002] # MYANMAR LETTER KHAMTI XA +1020 ; [.2F49.0020.0002] # MYANMAR LETTER LLA +A9FA ; [.2F4A.0020.0002] # MYANMAR LETTER TAI LAING LLA +105C ; [.2F4B.0020.0002] # MYANMAR LETTER MON BBA +105D ; [.2F4C.0020.0002] # MYANMAR LETTER MON BBE +106F ; [.2F4D.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN YWA +1070 ; [.2F4E.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN GHWA +1066 ; [.2F4F.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN PWA +1021 ; [.2F50.0020.0002] # MYANMAR LETTER A +1022 ; [.2F51.0020.0002] # MYANMAR LETTER SHAN A +1023 ; [.2F52.0020.0002] # MYANMAR LETTER I +1024 ; [.2F53.0020.0002] # MYANMAR LETTER II +1025 ; [.2F54.0020.0002] # MYANMAR LETTER U +1026 ; [.2F55.0020.0002] # MYANMAR LETTER UU +1025 102E ; [.2F55.0020.0002] # MYANMAR LETTER UU +1052 ; [.2F56.0020.0002] # MYANMAR LETTER VOCALIC R +1053 ; [.2F57.0020.0002] # MYANMAR LETTER VOCALIC RR +1054 ; [.2F58.0020.0002] # MYANMAR LETTER VOCALIC L +1055 ; [.2F59.0020.0002] # MYANMAR LETTER VOCALIC LL +1027 ; [.2F5A.0020.0002] # MYANMAR LETTER E +1028 ; [.2F5B.0020.0002] # MYANMAR LETTER MON E +1029 ; [.2F5C.0020.0002] # MYANMAR LETTER O +102A ; [.2F5D.0020.0002] # MYANMAR LETTER AU +102C ; [.2F5E.0020.0002] # MYANMAR VOWEL SIGN AA +102B ; [.2F5E.0020.0004] # MYANMAR VOWEL SIGN TALL AA +1083 ; [.2F5F.0020.0002] # MYANMAR VOWEL SIGN SHAN AA +1072 ; [.2F60.0020.0002] # MYANMAR VOWEL SIGN KAYAH OE +109C ; [.2F61.0020.0002] # MYANMAR VOWEL SIGN AITON A +102D ; [.2F62.0020.0002] # MYANMAR VOWEL SIGN I +1071 ; [.2F63.0020.0002] # MYANMAR VOWEL SIGN GEBA KAREN I +102E ; [.2F64.0020.0002] # MYANMAR VOWEL SIGN II +1033 ; [.2F65.0020.0002] # MYANMAR VOWEL SIGN MON II +102F ; [.2F66.0020.0002] # MYANMAR VOWEL SIGN U +1073 ; [.2F67.0020.0002] # MYANMAR VOWEL SIGN KAYAH U +1074 ; [.2F68.0020.0002] # MYANMAR VOWEL SIGN KAYAH EE +1030 ; [.2F69.0020.0002] # MYANMAR VOWEL SIGN UU +1056 ; [.2F6A.0020.0002] # MYANMAR VOWEL SIGN VOCALIC R +1057 ; [.2F6B.0020.0002] # MYANMAR VOWEL SIGN VOCALIC RR +1058 ; [.2F6C.0020.0002] # MYANMAR VOWEL SIGN VOCALIC L +1059 ; [.2F6D.0020.0002] # MYANMAR VOWEL SIGN VOCALIC LL +1031 ; [.2F6E.0020.0002] # MYANMAR VOWEL SIGN E +1084 ; [.2F6F.0020.0002] # MYANMAR VOWEL SIGN SHAN E +1035 ; [.2F70.0020.0002] # MYANMAR VOWEL SIGN E ABOVE +1085 ; [.2F71.0020.0002] # MYANMAR VOWEL SIGN SHAN E ABOVE +1032 ; [.2F72.0020.0002] # MYANMAR VOWEL SIGN AI +109D ; [.2F73.0020.0002] # MYANMAR VOWEL SIGN AITON AI +1034 ; [.2F74.0020.0002] # MYANMAR VOWEL SIGN MON O +1062 ; [.2F75.0020.0002] # MYANMAR VOWEL SIGN SGAW KAREN EU +1067 ; [.2F76.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU +1068 ; [.2F77.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE +A9E5 ; [.2F78.0020.0002] # MYANMAR SIGN SHAN SAW +1086 ; [.2F79.0020.0002] # MYANMAR VOWEL SIGN SHAN FINAL Y +1039 ; [.2F7A.0020.0002] # MYANMAR SIGN VIRAMA +103A ; [.2F7B.0020.0002] # MYANMAR SIGN ASAT +1063 ; [.2F7C.0020.0002] # MYANMAR TONE MARK SGAW KAREN HATHI +1064 ; [.2F7D.0020.0002] # MYANMAR TONE MARK SGAW KAREN KE PHO +1069 ; [.2F7E.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-1 +106A ; [.2F7F.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-2 +106B ; [.2F80.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-3 +106C ; [.2F81.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-4 +106D ; [.2F82.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-5 +1087 ; [.2F83.0020.0002] # MYANMAR SIGN SHAN TONE-2 +108B ; [.2F84.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-2 +1088 ; [.2F85.0020.0002] # MYANMAR SIGN SHAN TONE-3 +108C ; [.2F86.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; [.2F87.0020.0002] # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +1089 ; [.2F88.0020.0002] # MYANMAR SIGN SHAN TONE-5 +108A ; [.2F89.0020.0002] # MYANMAR SIGN SHAN TONE-6 +108F ; [.2F8A.0020.0002] # MYANMAR SIGN RUMAI PALAUNG TONE-5 +109A ; [.2F8B.0020.0002] # MYANMAR SIGN KHAMTI TONE-1 +109B ; [.2F8C.0020.0002] # MYANMAR SIGN KHAMTI TONE-3 +AA7B ; [.2F8D.0020.0002] # MYANMAR SIGN PAO KAREN TONE +AA7C ; [.2F8E.0020.0002] # MYANMAR SIGN TAI LAING TONE-2 +AA7D ; [.2F8F.0020.0002] # MYANMAR SIGN TAI LAING TONE-5 +AA74 ; [.2F90.0020.0002] # MYANMAR LOGOGRAM KHAMTI OAY +AA75 ; [.2F91.0020.0002] # MYANMAR LOGOGRAM KHAMTI QN +AA76 ; [.2F92.0020.0002] # MYANMAR LOGOGRAM KHAMTI HM +11103 ; [.2F93.0020.0002] # CHAKMA LETTER AA +11104 ; [.2F94.0020.0002] # CHAKMA LETTER I +11105 ; [.2F95.0020.0002] # CHAKMA LETTER U +11106 ; [.2F96.0020.0002] # CHAKMA LETTER E +11107 ; [.2F97.0020.0002] # CHAKMA LETTER KAA +11108 ; [.2F98.0020.0002] # CHAKMA LETTER KHAA +11109 ; [.2F99.0020.0002] # CHAKMA LETTER GAA +1110A ; [.2F9A.0020.0002] # CHAKMA LETTER GHAA +1110B ; [.2F9B.0020.0002] # CHAKMA LETTER NGAA +1110C ; [.2F9C.0020.0002] # CHAKMA LETTER CAA +1110D ; [.2F9D.0020.0002] # CHAKMA LETTER CHAA +1110E ; [.2F9E.0020.0002] # CHAKMA LETTER JAA +1110F ; [.2F9F.0020.0002] # CHAKMA LETTER JHAA +11110 ; [.2FA0.0020.0002] # CHAKMA LETTER NYAA +11111 ; [.2FA1.0020.0002] # CHAKMA LETTER TTAA +11112 ; [.2FA2.0020.0002] # CHAKMA LETTER TTHAA +11113 ; [.2FA3.0020.0002] # CHAKMA LETTER DDAA +11114 ; [.2FA4.0020.0002] # CHAKMA LETTER DDHAA +11115 ; [.2FA5.0020.0002] # CHAKMA LETTER NNAA +11116 ; [.2FA6.0020.0002] # CHAKMA LETTER TAA +11117 ; [.2FA7.0020.0002] # CHAKMA LETTER THAA +11118 ; [.2FA8.0020.0002] # CHAKMA LETTER DAA +11119 ; [.2FA9.0020.0002] # CHAKMA LETTER DHAA +1111A ; [.2FAA.0020.0002] # CHAKMA LETTER NAA +1111B ; [.2FAB.0020.0002] # CHAKMA LETTER PAA +1111C ; [.2FAC.0020.0002] # CHAKMA LETTER PHAA +1111D ; [.2FAD.0020.0002] # CHAKMA LETTER BAA +1111E ; [.2FAE.0020.0002] # CHAKMA LETTER BHAA +1111F ; [.2FAF.0020.0002] # CHAKMA LETTER MAA +11120 ; [.2FB0.0020.0002] # CHAKMA LETTER YYAA +11121 ; [.2FB1.0020.0002] # CHAKMA LETTER YAA +11122 ; [.2FB2.0020.0002] # CHAKMA LETTER RAA +11123 ; [.2FB3.0020.0002] # CHAKMA LETTER LAA +11124 ; [.2FB4.0020.0002] # CHAKMA LETTER WAA +11125 ; [.2FB5.0020.0002] # CHAKMA LETTER SAA +11126 ; [.2FB6.0020.0002] # CHAKMA LETTER HAA +11127 ; [.2FB7.0020.0002] # CHAKMA VOWEL SIGN A +11128 ; [.2FB8.0020.0002] # CHAKMA VOWEL SIGN I +11129 ; [.2FB9.0020.0002] # CHAKMA VOWEL SIGN II +1112A ; [.2FBA.0020.0002] # CHAKMA VOWEL SIGN U +1112B ; [.2FBB.0020.0002] # CHAKMA VOWEL SIGN UU +1112C ; [.2FBC.0020.0002] # CHAKMA VOWEL SIGN E +1112D ; [.2FBD.0020.0002] # CHAKMA VOWEL SIGN AI +1112E ; [.2FBE.0020.0002] # CHAKMA VOWEL SIGN O +11131 11127 ; [.2FBE.0020.0002] # CHAKMA VOWEL SIGN O +1112F ; [.2FBF.0020.0002] # CHAKMA VOWEL SIGN AU +11132 11127 ; [.2FBF.0020.0002] # CHAKMA VOWEL SIGN AU +11130 ; [.2FC0.0020.0002] # CHAKMA VOWEL SIGN OI +11131 ; [.2FC1.0020.0002] # CHAKMA O MARK +11132 ; [.2FC2.0020.0002] # CHAKMA AU MARK +11133 ; [.2FC3.0020.0002] # CHAKMA VIRAMA +11134 ; [.2FC4.0020.0002] # CHAKMA MAAYYAA +1780 ; [.2FC5.0020.0002] # KHMER LETTER KA +1781 ; [.2FC6.0020.0002] # KHMER LETTER KHA +1782 ; [.2FC7.0020.0002] # KHMER LETTER KO +1783 ; [.2FC8.0020.0002] # KHMER LETTER KHO +1784 ; [.2FC9.0020.0002] # KHMER LETTER NGO +1785 ; [.2FCA.0020.0002] # KHMER LETTER CA +1786 ; [.2FCB.0020.0002] # KHMER LETTER CHA +1787 ; [.2FCC.0020.0002] # KHMER LETTER CO +1788 ; [.2FCD.0020.0002] # KHMER LETTER CHO +1789 ; [.2FCE.0020.0002] # KHMER LETTER NYO +178A ; [.2FCF.0020.0002] # KHMER LETTER DA +178B ; [.2FD0.0020.0002] # KHMER LETTER TTHA +178C ; [.2FD1.0020.0002] # KHMER LETTER DO +178D ; [.2FD2.0020.0002] # KHMER LETTER TTHO +178E ; [.2FD3.0020.0002] # KHMER LETTER NNO +178F ; [.2FD4.0020.0002] # KHMER LETTER TA +1790 ; [.2FD5.0020.0002] # KHMER LETTER THA +1791 ; [.2FD6.0020.0002] # KHMER LETTER TO +1792 ; [.2FD7.0020.0002] # KHMER LETTER THO +1793 ; [.2FD8.0020.0002] # KHMER LETTER NO +1794 ; [.2FD9.0020.0002] # KHMER LETTER BA +1795 ; [.2FDA.0020.0002] # KHMER LETTER PHA +1796 ; [.2FDB.0020.0002] # KHMER LETTER PO +1797 ; [.2FDC.0020.0002] # KHMER LETTER PHO +1798 ; [.2FDD.0020.0002] # KHMER LETTER MO +1799 ; [.2FDE.0020.0002] # KHMER LETTER YO +179A ; [.2FDF.0020.0002] # KHMER LETTER RO +179B ; [.2FE0.0020.0002] # KHMER LETTER LO +179C ; [.2FE1.0020.0002] # KHMER LETTER VO +179D ; [.2FE2.0020.0002] # KHMER LETTER SHA +179E ; [.2FE3.0020.0002] # KHMER LETTER SSO +179F ; [.2FE4.0020.0002] # KHMER LETTER SA +17A0 ; [.2FE5.0020.0002] # KHMER LETTER HA +17A1 ; [.2FE6.0020.0002] # KHMER LETTER LA +17A2 ; [.2FE7.0020.0002] # KHMER LETTER QA +17DC ; [.2FE8.0020.0002] # KHMER SIGN AVAKRAHASANYA +17A3 ; [.2FE9.0020.0002] # KHMER INDEPENDENT VOWEL QAQ +17A4 ; [.2FEA.0020.0002] # KHMER INDEPENDENT VOWEL QAA +17A5 ; [.2FEB.0020.0002] # KHMER INDEPENDENT VOWEL QI +17A6 ; [.2FEC.0020.0002] # KHMER INDEPENDENT VOWEL QII +17A7 ; [.2FED.0020.0002] # KHMER INDEPENDENT VOWEL QU +17A8 ; [.2FEE.0020.0002] # KHMER INDEPENDENT VOWEL QUK +17A9 ; [.2FEF.0020.0002] # KHMER INDEPENDENT VOWEL QUU +17AA ; [.2FF0.0020.0002] # KHMER INDEPENDENT VOWEL QUUV +17AB ; [.2FF1.0020.0002] # KHMER INDEPENDENT VOWEL RY +17AC ; [.2FF2.0020.0002] # KHMER INDEPENDENT VOWEL RYY +17AD ; [.2FF3.0020.0002] # KHMER INDEPENDENT VOWEL LY +17AE ; [.2FF4.0020.0002] # KHMER INDEPENDENT VOWEL LYY +17AF ; [.2FF5.0020.0002] # KHMER INDEPENDENT VOWEL QE +17B0 ; [.2FF6.0020.0002] # KHMER INDEPENDENT VOWEL QAI +17B1 ; [.2FF7.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE ONE +17B2 ; [.2FF8.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE TWO +17B3 ; [.2FF9.0020.0002] # KHMER INDEPENDENT VOWEL QAU +17B6 ; [.2FFA.0020.0002] # KHMER VOWEL SIGN AA +17B7 ; [.2FFB.0020.0002] # KHMER VOWEL SIGN I +17B8 ; [.2FFC.0020.0002] # KHMER VOWEL SIGN II +17B9 ; [.2FFD.0020.0002] # KHMER VOWEL SIGN Y +17BA ; [.2FFE.0020.0002] # KHMER VOWEL SIGN YY +17BB ; [.2FFF.0020.0002] # KHMER VOWEL SIGN U +17BC ; [.3000.0020.0002] # KHMER VOWEL SIGN UU +17BD ; [.3001.0020.0002] # KHMER VOWEL SIGN UA +17BE ; [.3002.0020.0002] # KHMER VOWEL SIGN OE +17BF ; [.3003.0020.0002] # KHMER VOWEL SIGN YA +17C0 ; [.3004.0020.0002] # KHMER VOWEL SIGN IE +17C1 ; [.3005.0020.0002] # KHMER VOWEL SIGN E +17C2 ; [.3006.0020.0002] # KHMER VOWEL SIGN AE +17C3 ; [.3007.0020.0002] # KHMER VOWEL SIGN AI +17C4 ; [.3008.0020.0002] # KHMER VOWEL SIGN OO +17C5 ; [.3009.0020.0002] # KHMER VOWEL SIGN AU +17D2 ; [.300A.0020.0002] # KHMER SIGN COENG +1950 ; [.300B.0020.0002] # TAI LE LETTER KA +1951 ; [.300C.0020.0002] # TAI LE LETTER XA +1952 ; [.300D.0020.0002] # TAI LE LETTER NGA +1953 ; [.300E.0020.0002] # TAI LE LETTER TSA +1954 ; [.300F.0020.0002] # TAI LE LETTER SA +1955 ; [.3010.0020.0002] # TAI LE LETTER YA +1956 ; [.3011.0020.0002] # TAI LE LETTER TA +1957 ; [.3012.0020.0002] # TAI LE LETTER THA +1958 ; [.3013.0020.0002] # TAI LE LETTER LA +1959 ; [.3014.0020.0002] # TAI LE LETTER PA +195A ; [.3015.0020.0002] # TAI LE LETTER PHA +195B ; [.3016.0020.0002] # TAI LE LETTER MA +195C ; [.3017.0020.0002] # TAI LE LETTER FA +195D ; [.3018.0020.0002] # TAI LE LETTER VA +195E ; [.3019.0020.0002] # TAI LE LETTER HA +195F ; [.301A.0020.0002] # TAI LE LETTER QA +1960 ; [.301B.0020.0002] # TAI LE LETTER KHA +1961 ; [.301C.0020.0002] # TAI LE LETTER TSHA +1962 ; [.301D.0020.0002] # TAI LE LETTER NA +1963 ; [.301E.0020.0002] # TAI LE LETTER A +1964 ; [.301F.0020.0002] # TAI LE LETTER I +1965 ; [.3020.0020.0002] # TAI LE LETTER EE +1966 ; [.3021.0020.0002] # TAI LE LETTER EH +1967 ; [.3022.0020.0002] # TAI LE LETTER U +1968 ; [.3023.0020.0002] # TAI LE LETTER OO +1969 ; [.3024.0020.0002] # TAI LE LETTER O +196A ; [.3025.0020.0002] # TAI LE LETTER UE +196B ; [.3026.0020.0002] # TAI LE LETTER E +196C ; [.3027.0020.0002] # TAI LE LETTER AUE +196D ; [.3028.0020.0002] # TAI LE LETTER AI +1970 ; [.3029.0020.0002] # TAI LE LETTER TONE-2 +1971 ; [.302A.0020.0002] # TAI LE LETTER TONE-3 +1972 ; [.302B.0020.0002] # TAI LE LETTER TONE-4 +1973 ; [.302C.0020.0002] # TAI LE LETTER TONE-5 +1974 ; [.302D.0020.0002] # TAI LE LETTER TONE-6 +1980 ; [.302E.0020.0002] # NEW TAI LUE LETTER HIGH QA +19B5 1980 ; [.302E.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH QA> +19B6 1980 ; [.302E.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH QA> +19B7 1980 ; [.302E.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH QA> +19BA 1980 ; [.302E.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH QA> +1981 ; [.302F.0020.0002] # NEW TAI LUE LETTER LOW QA +19B5 1981 ; [.302F.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW QA> +19B6 1981 ; [.302F.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW QA> +19B7 1981 ; [.302F.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW QA> +19BA 1981 ; [.302F.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW QA> +1982 ; [.3030.0020.0002] # NEW TAI LUE LETTER HIGH KA +19B5 1982 ; [.3030.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KA> +19B6 1982 ; [.3030.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KA> +19B7 1982 ; [.3030.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KA> +19BA 1982 ; [.3030.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KA> +1983 ; [.3031.0020.0002] # NEW TAI LUE LETTER HIGH XA +19B5 1983 ; [.3031.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XA> +19B6 1983 ; [.3031.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XA> +19B7 1983 ; [.3031.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XA> +19BA 1983 ; [.3031.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XA> +1984 ; [.3032.0020.0002] # NEW TAI LUE LETTER HIGH NGA +19B5 1984 ; [.3032.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NGA> +19B6 1984 ; [.3032.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NGA> +19B7 1984 ; [.3032.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NGA> +19BA 1984 ; [.3032.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NGA> +1985 ; [.3033.0020.0002] # NEW TAI LUE LETTER LOW KA +19B5 1985 ; [.3033.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KA> +19B6 1985 ; [.3033.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KA> +19B7 1985 ; [.3033.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KA> +19BA 1985 ; [.3033.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KA> +1986 ; [.3034.0020.0002] # NEW TAI LUE LETTER LOW XA +19B5 1986 ; [.3034.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XA> +19B6 1986 ; [.3034.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XA> +19B7 1986 ; [.3034.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XA> +19BA 1986 ; [.3034.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XA> +1987 ; [.3035.0020.0002] # NEW TAI LUE LETTER LOW NGA +19B5 1987 ; [.3035.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NGA> +19B6 1987 ; [.3035.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NGA> +19B7 1987 ; [.3035.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NGA> +19BA 1987 ; [.3035.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NGA> +1988 ; [.3036.0020.0002] # NEW TAI LUE LETTER HIGH TSA +19B5 1988 ; [.3036.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TSA> +19B6 1988 ; [.3036.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TSA> +19B7 1988 ; [.3036.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TSA> +19BA 1988 ; [.3036.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TSA> +1989 ; [.3037.0020.0002] # NEW TAI LUE LETTER HIGH SA +19B5 1989 ; [.3037.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SA> +19B6 1989 ; [.3037.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SA> +19B7 1989 ; [.3037.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SA> +19BA 1989 ; [.3037.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SA> +198A ; [.3038.0020.0002] # NEW TAI LUE LETTER HIGH YA +19B5 198A ; [.3038.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH YA> +19B6 198A ; [.3038.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH YA> +19B7 198A ; [.3038.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH YA> +19BA 198A ; [.3038.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH YA> +198B ; [.3039.0020.0002] # NEW TAI LUE LETTER LOW TSA +19B5 198B ; [.3039.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TSA> +19B6 198B ; [.3039.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TSA> +19B7 198B ; [.3039.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TSA> +19BA 198B ; [.3039.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TSA> +198C ; [.303A.0020.0002] # NEW TAI LUE LETTER LOW SA +19B5 198C ; [.303A.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SA> +19B6 198C ; [.303A.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SA> +19B7 198C ; [.303A.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SA> +19BA 198C ; [.303A.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SA> +198D ; [.303B.0020.0002] # NEW TAI LUE LETTER LOW YA +19B5 198D ; [.303B.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW YA> +19B6 198D ; [.303B.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW YA> +19B7 198D ; [.303B.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW YA> +19BA 198D ; [.303B.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW YA> +198E ; [.303C.0020.0002] # NEW TAI LUE LETTER HIGH TA +19B5 198E ; [.303C.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TA> +19B6 198E ; [.303C.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TA> +19B7 198E ; [.303C.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TA> +19BA 198E ; [.303C.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TA> +198F ; [.303D.0020.0002] # NEW TAI LUE LETTER HIGH THA +19B5 198F ; [.303D.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH THA> +19B6 198F ; [.303D.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH THA> +19B7 198F ; [.303D.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH THA> +19BA 198F ; [.303D.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH THA> +1990 ; [.303E.0020.0002] # NEW TAI LUE LETTER HIGH NA +19B5 1990 ; [.303E.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NA> +19B6 1990 ; [.303E.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NA> +19B7 1990 ; [.303E.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NA> +19BA 1990 ; [.303E.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NA> +1991 ; [.303F.0020.0002] # NEW TAI LUE LETTER LOW TA +19B5 1991 ; [.303F.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TA> +19B6 1991 ; [.303F.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TA> +19B7 1991 ; [.303F.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TA> +19BA 1991 ; [.303F.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TA> +1992 ; [.3040.0020.0002] # NEW TAI LUE LETTER LOW THA +19B5 1992 ; [.3040.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW THA> +19B6 1992 ; [.3040.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW THA> +19B7 1992 ; [.3040.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW THA> +19BA 1992 ; [.3040.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW THA> +1993 ; [.3041.0020.0002] # NEW TAI LUE LETTER LOW NA +19B5 1993 ; [.3041.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NA> +19B6 1993 ; [.3041.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NA> +19B7 1993 ; [.3041.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NA> +19BA 1993 ; [.3041.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NA> +1994 ; [.3042.0020.0002] # NEW TAI LUE LETTER HIGH PA +19B5 1994 ; [.3042.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PA> +19B6 1994 ; [.3042.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PA> +19B7 1994 ; [.3042.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PA> +19BA 1994 ; [.3042.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PA> +1995 ; [.3043.0020.0002] # NEW TAI LUE LETTER HIGH PHA +19B5 1995 ; [.3043.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PHA> +19B6 1995 ; [.3043.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PHA> +19B7 1995 ; [.3043.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PHA> +19BA 1995 ; [.3043.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PHA> +1996 ; [.3044.0020.0002] # NEW TAI LUE LETTER HIGH MA +19B5 1996 ; [.3044.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH MA> +19B6 1996 ; [.3044.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH MA> +19B7 1996 ; [.3044.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH MA> +19BA 1996 ; [.3044.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH MA> +1997 ; [.3045.0020.0002] # NEW TAI LUE LETTER LOW PA +19B5 1997 ; [.3045.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PA> +19B6 1997 ; [.3045.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PA> +19B7 1997 ; [.3045.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PA> +19BA 1997 ; [.3045.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PA> +1998 ; [.3046.0020.0002] # NEW TAI LUE LETTER LOW PHA +19B5 1998 ; [.3046.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PHA> +19B6 1998 ; [.3046.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PHA> +19B7 1998 ; [.3046.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PHA> +19BA 1998 ; [.3046.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PHA> +1999 ; [.3047.0020.0002] # NEW TAI LUE LETTER LOW MA +19B5 1999 ; [.3047.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW MA> +19B6 1999 ; [.3047.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW MA> +19B7 1999 ; [.3047.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW MA> +19BA 1999 ; [.3047.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW MA> +199A ; [.3048.0020.0002] # NEW TAI LUE LETTER HIGH FA +19B5 199A ; [.3048.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH FA> +19B6 199A ; [.3048.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH FA> +19B7 199A ; [.3048.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH FA> +19BA 199A ; [.3048.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH FA> +199B ; [.3049.0020.0002] # NEW TAI LUE LETTER HIGH VA +19B5 199B ; [.3049.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH VA> +19B6 199B ; [.3049.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH VA> +19B7 199B ; [.3049.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH VA> +19BA 199B ; [.3049.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH VA> +199C ; [.304A.0020.0002] # NEW TAI LUE LETTER HIGH LA +19B5 199C ; [.304A.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH LA> +19B6 199C ; [.304A.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH LA> +19DE ; [.304A.0020.0004][.3060.0020.0004] # NEW TAI LUE SIGN LAE +19DF ; [.304A.0020.0004][.3060.0020.0004][.306B.0020.0004] # NEW TAI LUE SIGN LAEV +19B7 199C ; [.304A.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH LA> +19BA 199C ; [.304A.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH LA> +199D ; [.304B.0020.0002] # NEW TAI LUE LETTER LOW FA +19B5 199D ; [.304B.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW FA> +19B6 199D ; [.304B.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW FA> +19B7 199D ; [.304B.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW FA> +19BA 199D ; [.304B.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW FA> +199E ; [.304C.0020.0002] # NEW TAI LUE LETTER LOW VA +19B5 199E ; [.304C.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW VA> +19B6 199E ; [.304C.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW VA> +19B7 199E ; [.304C.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW VA> +19BA 199E ; [.304C.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW VA> +199F ; [.304D.0020.0002] # NEW TAI LUE LETTER LOW LA +19B5 199F ; [.304D.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW LA> +19B6 199F ; [.304D.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW LA> +19B7 199F ; [.304D.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW LA> +19BA 199F ; [.304D.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW LA> +19A0 ; [.304E.0020.0002] # NEW TAI LUE LETTER HIGH HA +19B5 19A0 ; [.304E.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH HA> +19B6 19A0 ; [.304E.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH HA> +19B7 19A0 ; [.304E.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH HA> +19BA 19A0 ; [.304E.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH HA> +19A1 ; [.304F.0020.0002] # NEW TAI LUE LETTER HIGH DA +19B5 19A1 ; [.304F.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH DA> +19B6 19A1 ; [.304F.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH DA> +19B7 19A1 ; [.304F.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH DA> +19BA 19A1 ; [.304F.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH DA> +19A2 ; [.3050.0020.0002] # NEW TAI LUE LETTER HIGH BA +19B5 19A2 ; [.3050.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH BA> +19B6 19A2 ; [.3050.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH BA> +19B7 19A2 ; [.3050.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH BA> +19BA 19A2 ; [.3050.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH BA> +19A3 ; [.3051.0020.0002] # NEW TAI LUE LETTER LOW HA +19B5 19A3 ; [.3051.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW HA> +19B6 19A3 ; [.3051.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW HA> +19B7 19A3 ; [.3051.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW HA> +19BA 19A3 ; [.3051.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW HA> +19A4 ; [.3052.0020.0002] # NEW TAI LUE LETTER LOW DA +19B5 19A4 ; [.3052.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW DA> +19B6 19A4 ; [.3052.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW DA> +19B7 19A4 ; [.3052.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW DA> +19BA 19A4 ; [.3052.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW DA> +19A5 ; [.3053.0020.0002] # NEW TAI LUE LETTER LOW BA +19B5 19A5 ; [.3053.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW BA> +19B6 19A5 ; [.3053.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW BA> +19B7 19A5 ; [.3053.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW BA> +19BA 19A5 ; [.3053.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW BA> +19A6 ; [.3054.0020.0002] # NEW TAI LUE LETTER HIGH KVA +19B5 19A6 ; [.3054.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KVA> +19B6 19A6 ; [.3054.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KVA> +19B7 19A6 ; [.3054.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KVA> +19BA 19A6 ; [.3054.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KVA> +19A7 ; [.3055.0020.0002] # NEW TAI LUE LETTER HIGH XVA +19B5 19A7 ; [.3055.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XVA> +19B6 19A7 ; [.3055.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XVA> +19B7 19A7 ; [.3055.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XVA> +19BA 19A7 ; [.3055.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XVA> +19A8 ; [.3056.0020.0002] # NEW TAI LUE LETTER LOW KVA +19B5 19A8 ; [.3056.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KVA> +19B6 19A8 ; [.3056.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KVA> +19B7 19A8 ; [.3056.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KVA> +19BA 19A8 ; [.3056.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KVA> +19A9 ; [.3057.0020.0002] # NEW TAI LUE LETTER LOW XVA +19B5 19A9 ; [.3057.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XVA> +19B6 19A9 ; [.3057.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XVA> +19B7 19A9 ; [.3057.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XVA> +19BA 19A9 ; [.3057.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XVA> +19AA ; [.3058.0020.0002] # NEW TAI LUE LETTER HIGH SUA +19B5 19AA ; [.3058.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SUA> +19B6 19AA ; [.3058.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SUA> +19B7 19AA ; [.3058.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SUA> +19BA 19AA ; [.3058.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SUA> +19AB ; [.3059.0020.0002] # NEW TAI LUE LETTER LOW SUA +19B5 19AB ; [.3059.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SUA> +19B6 19AB ; [.3059.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SUA> +19B7 19AB ; [.3059.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SUA> +19BA 19AB ; [.3059.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SUA> +19B0 ; [.305A.0020.0002] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER +19B1 ; [.305B.0020.0002] # NEW TAI LUE VOWEL SIGN AA +19B2 ; [.305C.0020.0002] # NEW TAI LUE VOWEL SIGN II +19B3 ; [.305D.0020.0002] # NEW TAI LUE VOWEL SIGN U +19B4 ; [.305E.0020.0002] # NEW TAI LUE VOWEL SIGN UU +19B5 ; [.305F.0020.0002] # NEW TAI LUE VOWEL SIGN E +19B6 ; [.3060.0020.0002] # NEW TAI LUE VOWEL SIGN AE +19B7 ; [.3061.0020.0002] # NEW TAI LUE VOWEL SIGN O +19B8 ; [.3062.0020.0002] # NEW TAI LUE VOWEL SIGN OA +19B9 ; [.3063.0020.0002] # NEW TAI LUE VOWEL SIGN UE +19BA ; [.3064.0020.0002] # NEW TAI LUE VOWEL SIGN AY +19BB ; [.3065.0020.0002] # NEW TAI LUE VOWEL SIGN AAY +19BC ; [.3066.0020.0002] # NEW TAI LUE VOWEL SIGN UY +19BD ; [.3067.0020.0002] # NEW TAI LUE VOWEL SIGN OY +19BE ; [.3068.0020.0002] # NEW TAI LUE VOWEL SIGN OAY +19BF ; [.3069.0020.0002] # NEW TAI LUE VOWEL SIGN UEY +19C0 ; [.306A.0020.0002] # NEW TAI LUE VOWEL SIGN IY +19C1 ; [.306B.0020.0002] # NEW TAI LUE LETTER FINAL V +19C2 ; [.306C.0020.0002] # NEW TAI LUE LETTER FINAL NG +19C3 ; [.306D.0020.0002] # NEW TAI LUE LETTER FINAL N +19C4 ; [.306E.0020.0002] # NEW TAI LUE LETTER FINAL M +19C5 ; [.306F.0020.0002] # NEW TAI LUE LETTER FINAL K +19C6 ; [.3070.0020.0002] # NEW TAI LUE LETTER FINAL D +19C7 ; [.3071.0020.0002] # NEW TAI LUE LETTER FINAL B +19C8 ; [.3072.0020.0002] # NEW TAI LUE TONE MARK-1 +19C9 ; [.3073.0020.0002] # NEW TAI LUE TONE MARK-2 +1A20 ; [.3074.0020.0002] # TAI THAM LETTER HIGH KA +1A21 ; [.3075.0020.0002] # TAI THAM LETTER HIGH KHA +1A22 ; [.3076.0020.0002] # TAI THAM LETTER HIGH KXA +1A23 ; [.3077.0020.0002] # TAI THAM LETTER LOW KA +1A24 ; [.3078.0020.0002] # TAI THAM LETTER LOW KXA +1A25 ; [.3079.0020.0002] # TAI THAM LETTER LOW KHA +1A26 ; [.307A.0020.0002] # TAI THAM LETTER NGA +1A58 ; [.307A.0020.0004] # TAI THAM SIGN MAI KANG LAI +1A59 ; [.307A.0020.0004] # TAI THAM CONSONANT SIGN FINAL NGA +1A27 ; [.307B.0020.0002] # TAI THAM LETTER HIGH CA +1A28 ; [.307C.0020.0002] # TAI THAM LETTER HIGH CHA +1A29 ; [.307D.0020.0002] # TAI THAM LETTER LOW CA +1A2A ; [.307E.0020.0002] # TAI THAM LETTER LOW SA +1A2B ; [.307F.0020.0002] # TAI THAM LETTER LOW CHA +1A2C ; [.3080.0020.0002] # TAI THAM LETTER NYA +1A2D ; [.3081.0020.0002] # TAI THAM LETTER RATA +1A2E ; [.3082.0020.0002] # TAI THAM LETTER HIGH RATHA +1A2F ; [.3083.0020.0002] # TAI THAM LETTER DA +1A30 ; [.3084.0020.0002] # TAI THAM LETTER LOW RATHA +1A31 ; [.3085.0020.0002] # TAI THAM LETTER RANA +1A32 ; [.3086.0020.0002] # TAI THAM LETTER HIGH TA +1A33 ; [.3087.0020.0002] # TAI THAM LETTER HIGH THA +1A34 ; [.3088.0020.0002] # TAI THAM LETTER LOW TA +1A35 ; [.3089.0020.0002] # TAI THAM LETTER LOW THA +1A36 ; [.308A.0020.0002] # TAI THAM LETTER NA +1A37 ; [.308B.0020.0002] # TAI THAM LETTER BA +1A38 ; [.308C.0020.0002] # TAI THAM LETTER HIGH PA +1A39 ; [.308D.0020.0002] # TAI THAM LETTER HIGH PHA +1A3A ; [.308E.0020.0002] # TAI THAM LETTER HIGH FA +1A3B ; [.308F.0020.0002] # TAI THAM LETTER LOW PA +1A5A ; [.308F.0020.0004] # TAI THAM CONSONANT SIGN LOW PA +1A5B ; [.308F.0020.0004] # TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA +1A3C ; [.3090.0020.0002] # TAI THAM LETTER LOW FA +1A3D ; [.3091.0020.0002] # TAI THAM LETTER LOW PHA +1A3E ; [.3092.0020.0002] # TAI THAM LETTER MA +1A3F ; [.3093.0020.0002] # TAI THAM LETTER LOW YA +1A40 ; [.3094.0020.0002] # TAI THAM LETTER HIGH YA +1A41 ; [.3095.0020.0002] # TAI THAM LETTER RA +1A42 ; [.3096.0020.0002] # TAI THAM LETTER RUE +1A43 ; [.3097.0020.0002] # TAI THAM LETTER LA +1A44 ; [.3098.0020.0002] # TAI THAM LETTER LUE +1A45 ; [.3099.0020.0002] # TAI THAM LETTER WA +1A46 ; [.309A.0020.0002] # TAI THAM LETTER HIGH SHA +1A54 ; [.309A.0020.0004][.30C0.0020.0004][.309A.0020.0004] # TAI THAM LETTER GREAT SA +1A47 ; [.309B.0020.0002] # TAI THAM LETTER HIGH SSA +1A48 ; [.309C.0020.0002] # TAI THAM LETTER HIGH SA +1A49 ; [.309D.0020.0002] # TAI THAM LETTER HIGH HA +1A4A ; [.309E.0020.0002] # TAI THAM LETTER LLA +1A4B ; [.309F.0020.0002] # TAI THAM LETTER A +1A4C ; [.30A0.0020.0002] # TAI THAM LETTER LOW HA +1A53 ; [.30A1.0020.0002] # TAI THAM LETTER LAE +1A6B ; [.30A2.0020.0002] # TAI THAM VOWEL SIGN O +1A55 ; [.30A3.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; [.30A4.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; [.30A5.0020.0002] # TAI THAM CONSONANT SIGN LA TANG LAI +1A5C ; [.30A6.0020.0002] # TAI THAM CONSONANT SIGN MA +1A5D ; [.30A7.0020.0002] # TAI THAM CONSONANT SIGN BA +1A5E ; [.30A8.0020.0002] # TAI THAM CONSONANT SIGN SA +1A4D ; [.30A9.0020.0002] # TAI THAM LETTER I +1A4E ; [.30AA.0020.0002] # TAI THAM LETTER II +1A4F ; [.30AB.0020.0002] # TAI THAM LETTER U +1A50 ; [.30AC.0020.0002] # TAI THAM LETTER UU +1A51 ; [.30AD.0020.0002] # TAI THAM LETTER EE +1A52 ; [.30AE.0020.0002] # TAI THAM LETTER OO +1A61 ; [.30AF.0020.0002] # TAI THAM VOWEL SIGN A +1A6C ; [.30B0.0020.0002] # TAI THAM VOWEL SIGN OA BELOW +1A62 ; [.30B1.0020.0002] # TAI THAM VOWEL SIGN MAI SAT +1A63 ; [.30B2.0020.0002] # TAI THAM VOWEL SIGN AA +1A64 ; [.30B2.0020.0004] # TAI THAM VOWEL SIGN TALL AA +1A65 ; [.30B3.0020.0002] # TAI THAM VOWEL SIGN I +1A66 ; [.30B4.0020.0002] # TAI THAM VOWEL SIGN II +1A67 ; [.30B5.0020.0002] # TAI THAM VOWEL SIGN UE +1A68 ; [.30B6.0020.0002] # TAI THAM VOWEL SIGN UUE +1A69 ; [.30B7.0020.0002] # TAI THAM VOWEL SIGN U +1A6A ; [.30B8.0020.0002] # TAI THAM VOWEL SIGN UU +1A6E ; [.30B9.0020.0002] # TAI THAM VOWEL SIGN E +1A6F ; [.30BA.0020.0002] # TAI THAM VOWEL SIGN AE +1A73 ; [.30BB.0020.0002] # TAI THAM VOWEL SIGN OA ABOVE +1A70 ; [.30BC.0020.0002] # TAI THAM VOWEL SIGN OO +1A71 ; [.30BD.0020.0002] # TAI THAM VOWEL SIGN AI +1A72 ; [.30BE.0020.0002] # TAI THAM VOWEL SIGN THAM AI +1A6D ; [.30BF.0020.0002] # TAI THAM VOWEL SIGN OY +1A60 ; [.30C0.0020.0002] # TAI THAM SIGN SAKOT +AA00 ; [.30C1.0020.0002] # CHAM LETTER A +AA01 ; [.30C2.0020.0002] # CHAM LETTER I +AA02 ; [.30C3.0020.0002] # CHAM LETTER U +AA03 ; [.30C4.0020.0002] # CHAM LETTER E +AA04 ; [.30C5.0020.0002] # CHAM LETTER AI +AA05 ; [.30C6.0020.0002] # CHAM LETTER O +AA06 ; [.30C7.0020.0002] # CHAM LETTER KA +AA07 ; [.30C8.0020.0002] # CHAM LETTER KHA +AA08 ; [.30C9.0020.0002] # CHAM LETTER GA +AA09 ; [.30CA.0020.0002] # CHAM LETTER GHA +AA0A ; [.30CB.0020.0002] # CHAM LETTER NGUE +AA0B ; [.30CC.0020.0002] # CHAM LETTER NGA +AA0C ; [.30CD.0020.0002] # CHAM LETTER CHA +AA0D ; [.30CE.0020.0002] # CHAM LETTER CHHA +AA0E ; [.30CF.0020.0002] # CHAM LETTER JA +AA0F ; [.30D0.0020.0002] # CHAM LETTER JHA +AA10 ; [.30D1.0020.0002] # CHAM LETTER NHUE +AA11 ; [.30D2.0020.0002] # CHAM LETTER NHA +AA12 ; [.30D3.0020.0002] # CHAM LETTER NHJA +AA13 ; [.30D4.0020.0002] # CHAM LETTER TA +AA14 ; [.30D5.0020.0002] # CHAM LETTER THA +AA15 ; [.30D6.0020.0002] # CHAM LETTER DA +AA16 ; [.30D7.0020.0002] # CHAM LETTER DHA +AA17 ; [.30D8.0020.0002] # CHAM LETTER NUE +AA18 ; [.30D9.0020.0002] # CHAM LETTER NA +AA19 ; [.30DA.0020.0002] # CHAM LETTER DDA +AA1A ; [.30DB.0020.0002] # CHAM LETTER PA +AA1B ; [.30DC.0020.0002] # CHAM LETTER PPA +AA1C ; [.30DD.0020.0002] # CHAM LETTER PHA +AA1D ; [.30DE.0020.0002] # CHAM LETTER BA +AA1E ; [.30DF.0020.0002] # CHAM LETTER BHA +AA1F ; [.30E0.0020.0002] # CHAM LETTER MUE +AA20 ; [.30E1.0020.0002] # CHAM LETTER MA +AA21 ; [.30E2.0020.0002] # CHAM LETTER BBA +AA22 ; [.30E3.0020.0002] # CHAM LETTER YA +AA23 ; [.30E4.0020.0002] # CHAM LETTER RA +AA24 ; [.30E5.0020.0002] # CHAM LETTER LA +AA25 ; [.30E6.0020.0002] # CHAM LETTER VA +AA26 ; [.30E7.0020.0002] # CHAM LETTER SSA +AA27 ; [.30E8.0020.0002] # CHAM LETTER SA +AA28 ; [.30E9.0020.0002] # CHAM LETTER HA +AA33 ; [.30EA.0020.0002] # CHAM CONSONANT SIGN YA +AA34 ; [.30EB.0020.0002] # CHAM CONSONANT SIGN RA +AA35 ; [.30EC.0020.0002] # CHAM CONSONANT SIGN LA +AA36 ; [.30ED.0020.0002] # CHAM CONSONANT SIGN WA +AA29 ; [.30EE.0020.0002] # CHAM VOWEL SIGN AA +AA2A ; [.30EF.0020.0002] # CHAM VOWEL SIGN I +AA2B ; [.30F0.0020.0002] # CHAM VOWEL SIGN II +AA2C ; [.30F1.0020.0002] # CHAM VOWEL SIGN EI +AA2D ; [.30F2.0020.0002] # CHAM VOWEL SIGN U +AA2E ; [.30F3.0020.0002] # CHAM VOWEL SIGN OE +AA2F ; [.30F4.0020.0002] # CHAM VOWEL SIGN O +AA30 ; [.30F5.0020.0002] # CHAM VOWEL SIGN AI +AA31 ; [.30F6.0020.0002] # CHAM VOWEL SIGN AU +AA32 ; [.30F7.0020.0002] # CHAM VOWEL SIGN UE +AA40 ; [.30F8.0020.0002] # CHAM LETTER FINAL K +AA41 ; [.30F9.0020.0002] # CHAM LETTER FINAL G +AA42 ; [.30FA.0020.0002] # CHAM LETTER FINAL NG +AA43 ; [.30FB.0020.0002] # CHAM CONSONANT SIGN FINAL NG +AA44 ; [.30FC.0020.0002] # CHAM LETTER FINAL CH +AA45 ; [.30FD.0020.0002] # CHAM LETTER FINAL T +AA46 ; [.30FE.0020.0002] # CHAM LETTER FINAL N +AA47 ; [.30FF.0020.0002] # CHAM LETTER FINAL P +AA48 ; [.3100.0020.0002] # CHAM LETTER FINAL Y +AA49 ; [.3101.0020.0002] # CHAM LETTER FINAL R +AA4A ; [.3102.0020.0002] # CHAM LETTER FINAL L +AA4B ; [.3103.0020.0002] # CHAM LETTER FINAL SS +AA4C ; [.3104.0020.0002] # CHAM CONSONANT SIGN FINAL M +AA4D ; [.3105.0020.0002] # CHAM CONSONANT SIGN FINAL H +1B05 ; [.3106.0020.0002] # BALINESE LETTER AKARA +1B06 ; [.3107.0020.0002] # BALINESE LETTER AKARA TEDUNG +1B05 1B35 ; [.3107.0020.0002] # BALINESE LETTER AKARA TEDUNG +1B07 ; [.3108.0020.0002] # BALINESE LETTER IKARA +1B08 ; [.3109.0020.0002] # BALINESE LETTER IKARA TEDUNG +1B07 1B35 ; [.3109.0020.0002] # BALINESE LETTER IKARA TEDUNG +1B09 ; [.310A.0020.0002] # BALINESE LETTER UKARA +1B0A ; [.310B.0020.0002] # BALINESE LETTER UKARA TEDUNG +1B09 1B35 ; [.310B.0020.0002] # BALINESE LETTER UKARA TEDUNG +1B0B ; [.310C.0020.0002] # BALINESE LETTER RA REPA +1B0C ; [.310D.0020.0002] # BALINESE LETTER RA REPA TEDUNG +1B0B 1B35 ; [.310D.0020.0002] # BALINESE LETTER RA REPA TEDUNG +1B0D ; [.310E.0020.0002] # BALINESE LETTER LA LENGA +1B0E ; [.310F.0020.0002] # BALINESE LETTER LA LENGA TEDUNG +1B0D 1B35 ; [.310F.0020.0002] # BALINESE LETTER LA LENGA TEDUNG +1B0F ; [.3110.0020.0002] # BALINESE LETTER EKARA +1B10 ; [.3111.0020.0002] # BALINESE LETTER AIKARA +1B11 ; [.3112.0020.0002] # BALINESE LETTER OKARA +1B12 ; [.3113.0020.0002] # BALINESE LETTER OKARA TEDUNG +1B11 1B35 ; [.3113.0020.0002] # BALINESE LETTER OKARA TEDUNG +1B13 ; [.3114.0020.0002] # BALINESE LETTER KA +1B45 ; [.3115.0020.0002] # BALINESE LETTER KAF SASAK +1B46 ; [.3116.0020.0002] # BALINESE LETTER KHOT SASAK +1B14 ; [.3117.0020.0002] # BALINESE LETTER KA MAHAPRANA +1B15 ; [.3118.0020.0002] # BALINESE LETTER GA +1B16 ; [.3119.0020.0002] # BALINESE LETTER GA GORA +1B17 ; [.311A.0020.0002] # BALINESE LETTER NGA +1B18 ; [.311B.0020.0002] # BALINESE LETTER CA +1B19 ; [.311C.0020.0002] # BALINESE LETTER CA LACA +1B1A ; [.311D.0020.0002] # BALINESE LETTER JA +1B1B ; [.311E.0020.0002] # BALINESE LETTER JA JERA +1B1C ; [.311F.0020.0002] # BALINESE LETTER NYA +1B1D ; [.3120.0020.0002] # BALINESE LETTER TA LATIK +1B1E ; [.3121.0020.0002] # BALINESE LETTER TA MURDA MAHAPRANA +1B1F ; [.3122.0020.0002] # BALINESE LETTER DA MURDA ALPAPRANA +1B20 ; [.3123.0020.0002] # BALINESE LETTER DA MURDA MAHAPRANA +1B21 ; [.3124.0020.0002] # BALINESE LETTER NA RAMBAT +1B22 ; [.3125.0020.0002] # BALINESE LETTER TA +1B47 ; [.3126.0020.0002] # BALINESE LETTER TZIR SASAK +1B23 ; [.3127.0020.0002] # BALINESE LETTER TA TAWA +1B24 ; [.3128.0020.0002] # BALINESE LETTER DA +1B25 ; [.3129.0020.0002] # BALINESE LETTER DA MADU +1B26 ; [.312A.0020.0002] # BALINESE LETTER NA +1B27 ; [.312B.0020.0002] # BALINESE LETTER PA +1B48 ; [.312C.0020.0002] # BALINESE LETTER EF SASAK +1B28 ; [.312D.0020.0002] # BALINESE LETTER PA KAPAL +1B29 ; [.312E.0020.0002] # BALINESE LETTER BA +1B2A ; [.312F.0020.0002] # BALINESE LETTER BA KEMBANG +1B2B ; [.3130.0020.0002] # BALINESE LETTER MA +1B2C ; [.3131.0020.0002] # BALINESE LETTER YA +1B2D ; [.3132.0020.0002] # BALINESE LETTER RA +1B2E ; [.3133.0020.0002] # BALINESE LETTER LA +1B2F ; [.3134.0020.0002] # BALINESE LETTER WA +1B49 ; [.3135.0020.0002] # BALINESE LETTER VE SASAK +1B30 ; [.3136.0020.0002] # BALINESE LETTER SA SAGA +1B31 ; [.3137.0020.0002] # BALINESE LETTER SA SAPA +1B32 ; [.3138.0020.0002] # BALINESE LETTER SA +1B4A ; [.3139.0020.0002] # BALINESE LETTER ZAL SASAK +1B4B ; [.313A.0020.0002] # BALINESE LETTER ASYURA SASAK +1B33 ; [.313B.0020.0002] # BALINESE LETTER HA +1B35 ; [.313C.0020.0002] # BALINESE VOWEL SIGN TEDUNG +1B36 ; [.313D.0020.0002] # BALINESE VOWEL SIGN ULU +1B37 ; [.313E.0020.0002] # BALINESE VOWEL SIGN ULU SARI +1B38 ; [.313F.0020.0002] # BALINESE VOWEL SIGN SUKU +1B39 ; [.3140.0020.0002] # BALINESE VOWEL SIGN SUKU ILUT +1B3A ; [.3141.0020.0002] # BALINESE VOWEL SIGN RA REPA +1B3B ; [.3142.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG +1B3A 1B35 ; [.3142.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; [.3143.0020.0002] # BALINESE VOWEL SIGN LA LENGA +1B3D ; [.3144.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG +1B3C 1B35 ; [.3144.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG +1B3E ; [.3145.0020.0002] # BALINESE VOWEL SIGN TALING +1B3F ; [.3146.0020.0002] # BALINESE VOWEL SIGN TALING REPA +1B40 ; [.3147.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG +1B3E 1B35 ; [.3147.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG +1B41 ; [.3148.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG +1B3F 1B35 ; [.3148.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; [.3149.0020.0002] # BALINESE VOWEL SIGN PEPET +1B43 ; [.314A.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG +1B42 1B35 ; [.314A.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG +1B44 ; [.314B.0020.0002] # BALINESE ADEG ADEG +A984 ; [.314C.0020.0002] # JAVANESE LETTER A +A985 ; [.314D.0020.0002] # JAVANESE LETTER I KAWI +A986 ; [.314E.0020.0002] # JAVANESE LETTER I +A987 ; [.314F.0020.0002] # JAVANESE LETTER II +A988 ; [.3150.0020.0002] # JAVANESE LETTER U +A989 ; [.3151.0020.0002] # JAVANESE LETTER PA CEREK +A98A ; [.3152.0020.0002] # JAVANESE LETTER NGA LELET +A98B ; [.3153.0020.0002] # JAVANESE LETTER NGA LELET RASWADI +A98C ; [.3154.0020.0002] # JAVANESE LETTER E +A98D ; [.3155.0020.0002] # JAVANESE LETTER AI +A98E ; [.3156.0020.0002] # JAVANESE LETTER O +A98F ; [.3157.0020.0002] # JAVANESE LETTER KA +A990 ; [.3158.0020.0002] # JAVANESE LETTER KA SASAK +A991 ; [.3159.0020.0002] # JAVANESE LETTER KA MURDA +A992 ; [.315A.0020.0002] # JAVANESE LETTER GA +A993 ; [.315B.0020.0002] # JAVANESE LETTER GA MURDA +A994 ; [.315C.0020.0002] # JAVANESE LETTER NGA +A995 ; [.315D.0020.0002] # JAVANESE LETTER CA +A996 ; [.315E.0020.0002] # JAVANESE LETTER CA MURDA +A997 ; [.315F.0020.0002] # JAVANESE LETTER JA +A998 ; [.3160.0020.0002] # JAVANESE LETTER NYA MURDA +A999 ; [.3161.0020.0002] # JAVANESE LETTER JA MAHAPRANA +A99A ; [.3162.0020.0002] # JAVANESE LETTER NYA +A99B ; [.3163.0020.0002] # JAVANESE LETTER TTA +A99C ; [.3164.0020.0002] # JAVANESE LETTER TTA MAHAPRANA +A99D ; [.3165.0020.0002] # JAVANESE LETTER DDA +A99E ; [.3166.0020.0002] # JAVANESE LETTER DDA MAHAPRANA +A99F ; [.3167.0020.0002] # JAVANESE LETTER NA MURDA +A9A0 ; [.3168.0020.0002] # JAVANESE LETTER TA +A9A1 ; [.3169.0020.0002] # JAVANESE LETTER TA MURDA +A9A2 ; [.316A.0020.0002] # JAVANESE LETTER DA +A9A3 ; [.316B.0020.0002] # JAVANESE LETTER DA MAHAPRANA +A9A4 ; [.316C.0020.0002] # JAVANESE LETTER NA +A9A5 ; [.316D.0020.0002] # JAVANESE LETTER PA +A9A6 ; [.316E.0020.0002] # JAVANESE LETTER PA MURDA +A9A7 ; [.316F.0020.0002] # JAVANESE LETTER BA +A9A8 ; [.3170.0020.0002] # JAVANESE LETTER BA MURDA +A9A9 ; [.3171.0020.0002] # JAVANESE LETTER MA +A9AA ; [.3172.0020.0002] # JAVANESE LETTER YA +A9BE ; [.3173.0020.0002] # JAVANESE CONSONANT SIGN PENGKAL +A9AB ; [.3174.0020.0002] # JAVANESE LETTER RA +A9AC ; [.3174.0020.0004] # JAVANESE LETTER RA AGUNG +A9BF ; [.3175.0020.0002] # JAVANESE CONSONANT SIGN CAKRA +A9AD ; [.3176.0020.0002] # JAVANESE LETTER LA +A9AE ; [.3177.0020.0002] # JAVANESE LETTER WA +A9AF ; [.3178.0020.0002] # JAVANESE LETTER SA MURDA +A9B0 ; [.3179.0020.0002] # JAVANESE LETTER SA MAHAPRANA +A9B1 ; [.317A.0020.0002] # JAVANESE LETTER SA +A9B2 ; [.317B.0020.0002] # JAVANESE LETTER HA +A9B4 ; [.317C.0020.0002] # JAVANESE VOWEL SIGN TARUNG +A9BC ; [.317D.0020.0002] # JAVANESE VOWEL SIGN PEPET +A9B6 ; [.317E.0020.0002] # JAVANESE VOWEL SIGN WULU +A9B7 ; [.317F.0020.0002] # JAVANESE VOWEL SIGN WULU MELIK +A9B8 ; [.3180.0020.0002] # JAVANESE VOWEL SIGN SUKU +A9B9 ; [.3181.0020.0002] # JAVANESE VOWEL SIGN SUKU MENDUT +A9BD ; [.3182.0020.0002] # JAVANESE CONSONANT SIGN KERET +A9BA ; [.3183.0020.0002] # JAVANESE VOWEL SIGN TALING +A9BB ; [.3184.0020.0002] # JAVANESE VOWEL SIGN DIRGA MURE +A9B5 ; [.3185.0020.0002] # JAVANESE VOWEL SIGN TOLONG +A9C0 ; [.3186.0020.0002] # JAVANESE PANGKON +1880 ; [.3187.0020.0002] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE +1881 ; [.3188.0020.0002] # MONGOLIAN LETTER ALI GALI VISARGA ONE +1882 ; [.3189.0020.0002] # MONGOLIAN LETTER ALI GALI DAMARU +1883 ; [.318A.0020.0002] # MONGOLIAN LETTER ALI GALI UBADAMA +1884 ; [.318B.0020.0002] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885 ; [.318C.0020.0002] # MONGOLIAN LETTER ALI GALI BALUDA +1886 ; [.318D.0020.0002] # MONGOLIAN LETTER ALI GALI THREE BALUDA +1843 ; [.318E.0020.0002] # MONGOLIAN LETTER TODO LONG VOWEL SIGN +1820 ; [.318F.0020.0002] # MONGOLIAN LETTER A +1887 ; [.3190.0020.0002] # MONGOLIAN LETTER ALI GALI A +1821 ; [.3191.0020.0002] # MONGOLIAN LETTER E +1844 ; [.3192.0020.0002] # MONGOLIAN LETTER TODO E +185D ; [.3193.0020.0002] # MONGOLIAN LETTER SIBE E +1822 ; [.3194.0020.0002] # MONGOLIAN LETTER I +1845 ; [.3195.0020.0002] # MONGOLIAN LETTER TODO I +185E ; [.3196.0020.0002] # MONGOLIAN LETTER SIBE I +1873 ; [.3197.0020.0002] # MONGOLIAN LETTER MANCHU I +1888 ; [.3198.0020.0002] # MONGOLIAN LETTER ALI GALI I +185F ; [.3199.0020.0002] # MONGOLIAN LETTER SIBE IY +1823 ; [.319A.0020.0002] # MONGOLIAN LETTER O +1846 ; [.319B.0020.0002] # MONGOLIAN LETTER TODO O +1824 ; [.319C.0020.0002] # MONGOLIAN LETTER U +1847 ; [.319D.0020.0002] # MONGOLIAN LETTER TODO U +1861 ; [.319E.0020.0002] # MONGOLIAN LETTER SIBE U +1825 ; [.319F.0020.0002] # MONGOLIAN LETTER OE +1848 ; [.31A0.0020.0002] # MONGOLIAN LETTER TODO OE +1826 ; [.31A1.0020.0002] # MONGOLIAN LETTER UE +1849 ; [.31A2.0020.0002] # MONGOLIAN LETTER TODO UE +1860 ; [.31A3.0020.0002] # MONGOLIAN LETTER SIBE UE +1827 ; [.31A4.0020.0002] # MONGOLIAN LETTER EE +1828 ; [.31A5.0020.0002] # MONGOLIAN LETTER NA +1829 ; [.31A6.0020.0002] # MONGOLIAN LETTER ANG +184A ; [.31A7.0020.0002] # MONGOLIAN LETTER TODO ANG +1862 ; [.31A8.0020.0002] # MONGOLIAN LETTER SIBE ANG +188A ; [.31A9.0020.0002] # MONGOLIAN LETTER ALI GALI NGA +189B ; [.31AA.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI NGA +182A ; [.31AB.0020.0002] # MONGOLIAN LETTER BA +184B ; [.31AC.0020.0002] # MONGOLIAN LETTER TODO BA +182B ; [.31AD.0020.0002] # MONGOLIAN LETTER PA +184C ; [.31AE.0020.0002] # MONGOLIAN LETTER TODO PA +1866 ; [.31AF.0020.0002] # MONGOLIAN LETTER SIBE PA +182C ; [.31B0.0020.0002] # MONGOLIAN LETTER QA +184D ; [.31B1.0020.0002] # MONGOLIAN LETTER TODO QA +182D ; [.31B2.0020.0002] # MONGOLIAN LETTER GA +184E ; [.31B3.0020.0002] # MONGOLIAN LETTER TODO GA +1864 ; [.31B4.0020.0002] # MONGOLIAN LETTER SIBE GA +189A ; [.31B5.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI GHA +1865 ; [.31B6.0020.0002] # MONGOLIAN LETTER SIBE HA +182E ; [.31B7.0020.0002] # MONGOLIAN LETTER MA +184F ; [.31B8.0020.0002] # MONGOLIAN LETTER TODO MA +182F ; [.31B9.0020.0002] # MONGOLIAN LETTER LA +1830 ; [.31BA.0020.0002] # MONGOLIAN LETTER SA +1831 ; [.31BB.0020.0002] # MONGOLIAN LETTER SHA +1867 ; [.31BC.0020.0002] # MONGOLIAN LETTER SIBE SHA +189C ; [.31BD.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CA +189D ; [.31BE.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI JHA +18A2 ; [.31BF.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI SSA +18A4 ; [.31C0.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZHA +18A5 ; [.31C1.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZA +1832 ; [.31C2.0020.0002] # MONGOLIAN LETTER TA +1850 ; [.31C3.0020.0002] # MONGOLIAN LETTER TODO TA +1868 ; [.31C4.0020.0002] # MONGOLIAN LETTER SIBE TA +1833 ; [.31C5.0020.0002] # MONGOLIAN LETTER DA +1851 ; [.31C6.0020.0002] # MONGOLIAN LETTER TODO DA +1869 ; [.31C7.0020.0002] # MONGOLIAN LETTER SIBE DA +1834 ; [.31C8.0020.0002] # MONGOLIAN LETTER CHA +1852 ; [.31C9.0020.0002] # MONGOLIAN LETTER TODO CHA +1871 ; [.31CA.0020.0002] # MONGOLIAN LETTER SIBE CHA +185C ; [.31CB.0020.0002] # MONGOLIAN LETTER TODO DZA +188B ; [.31CC.0020.0002] # MONGOLIAN LETTER ALI GALI CA +1835 ; [.31CD.0020.0002] # MONGOLIAN LETTER JA +1853 ; [.31CE.0020.0002] # MONGOLIAN LETTER TODO JA +186A ; [.31CF.0020.0002] # MONGOLIAN LETTER SIBE JA +1877 ; [.31D0.0020.0002] # MONGOLIAN LETTER MANCHU ZHA +1836 ; [.31D1.0020.0002] # MONGOLIAN LETTER YA +1855 ; [.31D2.0020.0002] # MONGOLIAN LETTER TODO YA +1872 ; [.31D3.0020.0002] # MONGOLIAN LETTER SIBE ZHA +1837 ; [.31D4.0020.0002] # MONGOLIAN LETTER RA +1875 ; [.31D5.0020.0002] # MONGOLIAN LETTER MANCHU RA +1838 ; [.31D6.0020.0002] # MONGOLIAN LETTER WA +1856 ; [.31D7.0020.0002] # MONGOLIAN LETTER TODO WA +1839 ; [.31D8.0020.0002] # MONGOLIAN LETTER FA +186B ; [.31D9.0020.0002] # MONGOLIAN LETTER SIBE FA +1876 ; [.31DA.0020.0002] # MONGOLIAN LETTER MANCHU FA +183A ; [.31DB.0020.0002] # MONGOLIAN LETTER KA +1857 ; [.31DC.0020.0002] # MONGOLIAN LETTER TODO KA +1863 ; [.31DD.0020.0002] # MONGOLIAN LETTER SIBE KA +1874 ; [.31DE.0020.0002] # MONGOLIAN LETTER MANCHU KA +1889 ; [.31DF.0020.0002] # MONGOLIAN LETTER ALI GALI KA +183B ; [.31E0.0020.0002] # MONGOLIAN LETTER KHA +183C ; [.31E1.0020.0002] # MONGOLIAN LETTER TSA +1854 ; [.31E2.0020.0002] # MONGOLIAN LETTER TODO TSA +186E ; [.31E3.0020.0002] # MONGOLIAN LETTER SIBE TSA +183D ; [.31E4.0020.0002] # MONGOLIAN LETTER ZA +186F ; [.31E5.0020.0002] # MONGOLIAN LETTER SIBE ZA +1858 ; [.31E6.0020.0002] # MONGOLIAN LETTER TODO GAA +186C ; [.31E7.0020.0002] # MONGOLIAN LETTER SIBE GAA +183E ; [.31E8.0020.0002] # MONGOLIAN LETTER HAA +1859 ; [.31E9.0020.0002] # MONGOLIAN LETTER TODO HAA +186D ; [.31EA.0020.0002] # MONGOLIAN LETTER SIBE HAA +183F ; [.31EB.0020.0002] # MONGOLIAN LETTER ZRA +1840 ; [.31EC.0020.0002] # MONGOLIAN LETTER LHA +1841 ; [.31ED.0020.0002] # MONGOLIAN LETTER ZHI +1842 ; [.31EE.0020.0002] # MONGOLIAN LETTER CHI +185A ; [.31EF.0020.0002] # MONGOLIAN LETTER TODO JIA +185B ; [.31F0.0020.0002] # MONGOLIAN LETTER TODO NIA +1870 ; [.31F1.0020.0002] # MONGOLIAN LETTER SIBE RAA +188C ; [.31F2.0020.0002] # MONGOLIAN LETTER ALI GALI TTA +189E ; [.31F3.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TTA +188D ; [.31F4.0020.0002] # MONGOLIAN LETTER ALI GALI TTHA +188E ; [.31F5.0020.0002] # MONGOLIAN LETTER ALI GALI DDA +189F ; [.31F6.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DDHA +188F ; [.31F7.0020.0002] # MONGOLIAN LETTER ALI GALI NNA +1890 ; [.31F8.0020.0002] # MONGOLIAN LETTER ALI GALI TA +1898 ; [.31F9.0020.0002] # MONGOLIAN LETTER TODO ALI GALI TA +18A0 ; [.31FA.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TA +1891 ; [.31FB.0020.0002] # MONGOLIAN LETTER ALI GALI DA +18A1 ; [.31FC.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DHA +1892 ; [.31FD.0020.0002] # MONGOLIAN LETTER ALI GALI PA +1893 ; [.31FE.0020.0002] # MONGOLIAN LETTER ALI GALI PHA +18A8 ; [.31FF.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI BHA +1894 ; [.3200.0020.0002] # MONGOLIAN LETTER ALI GALI SSA +18A3 ; [.3201.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CYA +1895 ; [.3202.0020.0002] # MONGOLIAN LETTER ALI GALI ZHA +1899 ; [.3203.0020.0002] # MONGOLIAN LETTER TODO ALI GALI ZHA +1896 ; [.3204.0020.0002] # MONGOLIAN LETTER ALI GALI ZA +1897 ; [.3205.0020.0002] # MONGOLIAN LETTER ALI GALI AH +18A6 ; [.3206.0020.0002] # MONGOLIAN LETTER ALI GALI HALF U +18A7 ; [.3207.0020.0002] # MONGOLIAN LETTER ALI GALI HALF YA +18AA ; [.3208.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI LHA +18A9 ; [.3209.0020.0002] # MONGOLIAN LETTER ALI GALI DAGALGA +1C5A ; [.320A.0020.0002] # OL CHIKI LETTER LA +1C5B ; [.320B.0020.0002] # OL CHIKI LETTER AT +1C5C ; [.320C.0020.0002] # OL CHIKI LETTER AG +1C5D ; [.320D.0020.0002] # OL CHIKI LETTER ANG +1C5E ; [.320E.0020.0002] # OL CHIKI LETTER AL +1C5F ; [.320F.0020.0002] # OL CHIKI LETTER LAA +1C60 ; [.3210.0020.0002] # OL CHIKI LETTER AAK +1C61 ; [.3211.0020.0002] # OL CHIKI LETTER AAJ +1C62 ; [.3212.0020.0002] # OL CHIKI LETTER AAM +1C63 ; [.3213.0020.0002] # OL CHIKI LETTER AAW +1C64 ; [.3214.0020.0002] # OL CHIKI LETTER LI +1C65 ; [.3215.0020.0002] # OL CHIKI LETTER IS +1C66 ; [.3216.0020.0002] # OL CHIKI LETTER IH +1C67 ; [.3217.0020.0002] # OL CHIKI LETTER INY +1C68 ; [.3218.0020.0002] # OL CHIKI LETTER IR +1C69 ; [.3219.0020.0002] # OL CHIKI LETTER LU +1C6A ; [.321A.0020.0002] # OL CHIKI LETTER UC +1C6B ; [.321B.0020.0002] # OL CHIKI LETTER UD +1C6C ; [.321C.0020.0002] # OL CHIKI LETTER UNN +1C6D ; [.321D.0020.0002] # OL CHIKI LETTER UY +1C6E ; [.321E.0020.0002] # OL CHIKI LETTER LE +1C6F ; [.321F.0020.0002] # OL CHIKI LETTER EP +1C70 ; [.3220.0020.0002] # OL CHIKI LETTER EDD +1C71 ; [.3221.0020.0002] # OL CHIKI LETTER EN +1C72 ; [.3222.0020.0002] # OL CHIKI LETTER ERR +1C73 ; [.3223.0020.0002] # OL CHIKI LETTER LO +1C74 ; [.3224.0020.0002] # OL CHIKI LETTER OTT +1C75 ; [.3225.0020.0002] # OL CHIKI LETTER OB +1C76 ; [.3226.0020.0002] # OL CHIKI LETTER OV +1C77 ; [.3227.0020.0002] # OL CHIKI LETTER OH +1C78 ; [.3228.0020.0002] # OL CHIKI MU TTUDDAG +1C79 ; [.3229.0020.0002] # OL CHIKI GAAHLAA TTUDDAAG +1C7A ; [.322A.0020.0002] # OL CHIKI MU-GAAHLAA TTUDDAAG +1C7B ; [.322B.0020.0002] # OL CHIKI RELAA +1C7C ; [.322C.0020.0002] # OL CHIKI PHAARKAA +1C7D ; [.322D.0020.0002] # OL CHIKI AHAD +AB70 ; [.322E.0020.0002] # CHEROKEE SMALL LETTER A +13A0 ; [.322E.0020.0008] # CHEROKEE LETTER A +AB71 ; [.322F.0020.0002] # CHEROKEE SMALL LETTER E +13A1 ; [.322F.0020.0008] # CHEROKEE LETTER E +AB72 ; [.3230.0020.0002] # CHEROKEE SMALL LETTER I +13A2 ; [.3230.0020.0008] # CHEROKEE LETTER I +AB73 ; [.3231.0020.0002] # CHEROKEE SMALL LETTER O +13A3 ; [.3231.0020.0008] # CHEROKEE LETTER O +AB74 ; [.3232.0020.0002] # CHEROKEE SMALL LETTER U +13A4 ; [.3232.0020.0008] # CHEROKEE LETTER U +AB75 ; [.3233.0020.0002] # CHEROKEE SMALL LETTER V +13A5 ; [.3233.0020.0008] # CHEROKEE LETTER V +AB76 ; [.3234.0020.0002] # CHEROKEE SMALL LETTER GA +13A6 ; [.3234.0020.0008] # CHEROKEE LETTER GA +AB77 ; [.3235.0020.0002] # CHEROKEE SMALL LETTER KA +13A7 ; [.3235.0020.0008] # CHEROKEE LETTER KA +AB78 ; [.3236.0020.0002] # CHEROKEE SMALL LETTER GE +13A8 ; [.3236.0020.0008] # CHEROKEE LETTER GE +AB79 ; [.3237.0020.0002] # CHEROKEE SMALL LETTER GI +13A9 ; [.3237.0020.0008] # CHEROKEE LETTER GI +AB7A ; [.3238.0020.0002] # CHEROKEE SMALL LETTER GO +13AA ; [.3238.0020.0008] # CHEROKEE LETTER GO +AB7B ; [.3239.0020.0002] # CHEROKEE SMALL LETTER GU +13AB ; [.3239.0020.0008] # CHEROKEE LETTER GU +AB7C ; [.323A.0020.0002] # CHEROKEE SMALL LETTER GV +13AC ; [.323A.0020.0008] # CHEROKEE LETTER GV +AB7D ; [.323B.0020.0002] # CHEROKEE SMALL LETTER HA +13AD ; [.323B.0020.0008] # CHEROKEE LETTER HA +AB7E ; [.323C.0020.0002] # CHEROKEE SMALL LETTER HE +13AE ; [.323C.0020.0008] # CHEROKEE LETTER HE +AB7F ; [.323D.0020.0002] # CHEROKEE SMALL LETTER HI +13AF ; [.323D.0020.0008] # CHEROKEE LETTER HI +AB80 ; [.323E.0020.0002] # CHEROKEE SMALL LETTER HO +13B0 ; [.323E.0020.0008] # CHEROKEE LETTER HO +AB81 ; [.323F.0020.0002] # CHEROKEE SMALL LETTER HU +13B1 ; [.323F.0020.0008] # CHEROKEE LETTER HU +AB82 ; [.3240.0020.0002] # CHEROKEE SMALL LETTER HV +13B2 ; [.3240.0020.0008] # CHEROKEE LETTER HV +AB83 ; [.3241.0020.0002] # CHEROKEE SMALL LETTER LA +13B3 ; [.3241.0020.0008] # CHEROKEE LETTER LA +AB84 ; [.3242.0020.0002] # CHEROKEE SMALL LETTER LE +13B4 ; [.3242.0020.0008] # CHEROKEE LETTER LE +AB85 ; [.3243.0020.0002] # CHEROKEE SMALL LETTER LI +13B5 ; [.3243.0020.0008] # CHEROKEE LETTER LI +AB86 ; [.3244.0020.0002] # CHEROKEE SMALL LETTER LO +13B6 ; [.3244.0020.0008] # CHEROKEE LETTER LO +AB87 ; [.3245.0020.0002] # CHEROKEE SMALL LETTER LU +13B7 ; [.3245.0020.0008] # CHEROKEE LETTER LU +AB88 ; [.3246.0020.0002] # CHEROKEE SMALL LETTER LV +13B8 ; [.3246.0020.0008] # CHEROKEE LETTER LV +AB89 ; [.3247.0020.0002] # CHEROKEE SMALL LETTER MA +13B9 ; [.3247.0020.0008] # CHEROKEE LETTER MA +AB8A ; [.3248.0020.0002] # CHEROKEE SMALL LETTER ME +13BA ; [.3248.0020.0008] # CHEROKEE LETTER ME +AB8B ; [.3249.0020.0002] # CHEROKEE SMALL LETTER MI +13BB ; [.3249.0020.0008] # CHEROKEE LETTER MI +AB8C ; [.324A.0020.0002] # CHEROKEE SMALL LETTER MO +13BC ; [.324A.0020.0008] # CHEROKEE LETTER MO +AB8D ; [.324B.0020.0002] # CHEROKEE SMALL LETTER MU +13BD ; [.324B.0020.0008] # CHEROKEE LETTER MU +AB8E ; [.324C.0020.0002] # CHEROKEE SMALL LETTER NA +13BE ; [.324C.0020.0008] # CHEROKEE LETTER NA +AB8F ; [.324D.0020.0002] # CHEROKEE SMALL LETTER HNA +13BF ; [.324D.0020.0008] # CHEROKEE LETTER HNA +AB90 ; [.324E.0020.0002] # CHEROKEE SMALL LETTER NAH +13C0 ; [.324E.0020.0008] # CHEROKEE LETTER NAH +AB91 ; [.324F.0020.0002] # CHEROKEE SMALL LETTER NE +13C1 ; [.324F.0020.0008] # CHEROKEE LETTER NE +AB92 ; [.3250.0020.0002] # CHEROKEE SMALL LETTER NI +13C2 ; [.3250.0020.0008] # CHEROKEE LETTER NI +AB93 ; [.3251.0020.0002] # CHEROKEE SMALL LETTER NO +13C3 ; [.3251.0020.0008] # CHEROKEE LETTER NO +AB94 ; [.3252.0020.0002] # CHEROKEE SMALL LETTER NU +13C4 ; [.3252.0020.0008] # CHEROKEE LETTER NU +AB95 ; [.3253.0020.0002] # CHEROKEE SMALL LETTER NV +13C5 ; [.3253.0020.0008] # CHEROKEE LETTER NV +AB96 ; [.3254.0020.0002] # CHEROKEE SMALL LETTER QUA +13C6 ; [.3254.0020.0008] # CHEROKEE LETTER QUA +AB97 ; [.3255.0020.0002] # CHEROKEE SMALL LETTER QUE +13C7 ; [.3255.0020.0008] # CHEROKEE LETTER QUE +AB98 ; [.3256.0020.0002] # CHEROKEE SMALL LETTER QUI +13C8 ; [.3256.0020.0008] # CHEROKEE LETTER QUI +AB99 ; [.3257.0020.0002] # CHEROKEE SMALL LETTER QUO +13C9 ; [.3257.0020.0008] # CHEROKEE LETTER QUO +AB9A ; [.3258.0020.0002] # CHEROKEE SMALL LETTER QUU +13CA ; [.3258.0020.0008] # CHEROKEE LETTER QUU +AB9B ; [.3259.0020.0002] # CHEROKEE SMALL LETTER QUV +13CB ; [.3259.0020.0008] # CHEROKEE LETTER QUV +AB9C ; [.325A.0020.0002] # CHEROKEE SMALL LETTER SA +13CC ; [.325A.0020.0008] # CHEROKEE LETTER SA +AB9D ; [.325B.0020.0002] # CHEROKEE SMALL LETTER S +13CD ; [.325B.0020.0008] # CHEROKEE LETTER S +AB9E ; [.325C.0020.0002] # CHEROKEE SMALL LETTER SE +13CE ; [.325C.0020.0008] # CHEROKEE LETTER SE +AB9F ; [.325D.0020.0002] # CHEROKEE SMALL LETTER SI +13CF ; [.325D.0020.0008] # CHEROKEE LETTER SI +ABA0 ; [.325E.0020.0002] # CHEROKEE SMALL LETTER SO +13D0 ; [.325E.0020.0008] # CHEROKEE LETTER SO +ABA1 ; [.325F.0020.0002] # CHEROKEE SMALL LETTER SU +13D1 ; [.325F.0020.0008] # CHEROKEE LETTER SU +ABA2 ; [.3260.0020.0002] # CHEROKEE SMALL LETTER SV +13D2 ; [.3260.0020.0008] # CHEROKEE LETTER SV +ABA3 ; [.3261.0020.0002] # CHEROKEE SMALL LETTER DA +13D3 ; [.3261.0020.0008] # CHEROKEE LETTER DA +ABA4 ; [.3262.0020.0002] # CHEROKEE SMALL LETTER TA +13D4 ; [.3262.0020.0008] # CHEROKEE LETTER TA +ABA5 ; [.3263.0020.0002] # CHEROKEE SMALL LETTER DE +13D5 ; [.3263.0020.0008] # CHEROKEE LETTER DE +ABA6 ; [.3264.0020.0002] # CHEROKEE SMALL LETTER TE +13D6 ; [.3264.0020.0008] # CHEROKEE LETTER TE +ABA7 ; [.3265.0020.0002] # CHEROKEE SMALL LETTER DI +13D7 ; [.3265.0020.0008] # CHEROKEE LETTER DI +ABA8 ; [.3266.0020.0002] # CHEROKEE SMALL LETTER TI +13D8 ; [.3266.0020.0008] # CHEROKEE LETTER TI +ABA9 ; [.3267.0020.0002] # CHEROKEE SMALL LETTER DO +13D9 ; [.3267.0020.0008] # CHEROKEE LETTER DO +ABAA ; [.3268.0020.0002] # CHEROKEE SMALL LETTER DU +13DA ; [.3268.0020.0008] # CHEROKEE LETTER DU +ABAB ; [.3269.0020.0002] # CHEROKEE SMALL LETTER DV +13DB ; [.3269.0020.0008] # CHEROKEE LETTER DV +ABAC ; [.326A.0020.0002] # CHEROKEE SMALL LETTER DLA +13DC ; [.326A.0020.0008] # CHEROKEE LETTER DLA +ABAD ; [.326B.0020.0002] # CHEROKEE SMALL LETTER TLA +13DD ; [.326B.0020.0008] # CHEROKEE LETTER TLA +ABAE ; [.326C.0020.0002] # CHEROKEE SMALL LETTER TLE +13DE ; [.326C.0020.0008] # CHEROKEE LETTER TLE +ABAF ; [.326D.0020.0002] # CHEROKEE SMALL LETTER TLI +13DF ; [.326D.0020.0008] # CHEROKEE LETTER TLI +ABB0 ; [.326E.0020.0002] # CHEROKEE SMALL LETTER TLO +13E0 ; [.326E.0020.0008] # CHEROKEE LETTER TLO +ABB1 ; [.326F.0020.0002] # CHEROKEE SMALL LETTER TLU +13E1 ; [.326F.0020.0008] # CHEROKEE LETTER TLU +ABB2 ; [.3270.0020.0002] # CHEROKEE SMALL LETTER TLV +13E2 ; [.3270.0020.0008] # CHEROKEE LETTER TLV +ABB3 ; [.3271.0020.0002] # CHEROKEE SMALL LETTER TSA +13E3 ; [.3271.0020.0008] # CHEROKEE LETTER TSA +ABB4 ; [.3272.0020.0002] # CHEROKEE SMALL LETTER TSE +13E4 ; [.3272.0020.0008] # CHEROKEE LETTER TSE +ABB5 ; [.3273.0020.0002] # CHEROKEE SMALL LETTER TSI +13E5 ; [.3273.0020.0008] # CHEROKEE LETTER TSI +ABB6 ; [.3274.0020.0002] # CHEROKEE SMALL LETTER TSO +13E6 ; [.3274.0020.0008] # CHEROKEE LETTER TSO +ABB7 ; [.3275.0020.0002] # CHEROKEE SMALL LETTER TSU +13E7 ; [.3275.0020.0008] # CHEROKEE LETTER TSU +ABB8 ; [.3276.0020.0002] # CHEROKEE SMALL LETTER TSV +13E8 ; [.3276.0020.0008] # CHEROKEE LETTER TSV +ABB9 ; [.3277.0020.0002] # CHEROKEE SMALL LETTER WA +13E9 ; [.3277.0020.0008] # CHEROKEE LETTER WA +ABBA ; [.3278.0020.0002] # CHEROKEE SMALL LETTER WE +13EA ; [.3278.0020.0008] # CHEROKEE LETTER WE +ABBB ; [.3279.0020.0002] # CHEROKEE SMALL LETTER WI +13EB ; [.3279.0020.0008] # CHEROKEE LETTER WI +ABBC ; [.327A.0020.0002] # CHEROKEE SMALL LETTER WO +13EC ; [.327A.0020.0008] # CHEROKEE LETTER WO +ABBD ; [.327B.0020.0002] # CHEROKEE SMALL LETTER WU +13ED ; [.327B.0020.0008] # CHEROKEE LETTER WU +ABBE ; [.327C.0020.0002] # CHEROKEE SMALL LETTER WV +13EE ; [.327C.0020.0008] # CHEROKEE LETTER WV +ABBF ; [.327D.0020.0002] # CHEROKEE SMALL LETTER YA +13EF ; [.327D.0020.0008] # CHEROKEE LETTER YA +13F8 ; [.327E.0020.0002] # CHEROKEE SMALL LETTER YE +13F0 ; [.327E.0020.0008] # CHEROKEE LETTER YE +13F9 ; [.327F.0020.0002] # CHEROKEE SMALL LETTER YI +13F1 ; [.327F.0020.0008] # CHEROKEE LETTER YI +13FA ; [.3280.0020.0002] # CHEROKEE SMALL LETTER YO +13F2 ; [.3280.0020.0008] # CHEROKEE LETTER YO +13FB ; [.3281.0020.0002] # CHEROKEE SMALL LETTER YU +13F3 ; [.3281.0020.0008] # CHEROKEE LETTER YU +13FC ; [.3282.0020.0002] # CHEROKEE SMALL LETTER YV +13F4 ; [.3282.0020.0008] # CHEROKEE LETTER YV +13FD ; [.3283.0020.0002] # CHEROKEE SMALL LETTER MV +13F5 ; [.3283.0020.0008] # CHEROKEE LETTER MV +1401 ; [.3284.0020.0002] # CANADIAN SYLLABICS E +1402 ; [.3285.0020.0002] # CANADIAN SYLLABICS AAI +1403 ; [.3286.0020.0002] # CANADIAN SYLLABICS I +1404 ; [.3287.0020.0002] # CANADIAN SYLLABICS II +1405 ; [.3288.0020.0002] # CANADIAN SYLLABICS O +1406 ; [.3289.0020.0002] # CANADIAN SYLLABICS OO +1407 ; [.328A.0020.0002] # CANADIAN SYLLABICS Y-CREE OO +1408 ; [.328B.0020.0002] # CANADIAN SYLLABICS CARRIER EE +1409 ; [.328C.0020.0002] # CANADIAN SYLLABICS CARRIER I +140A ; [.328D.0020.0002] # CANADIAN SYLLABICS A +140B ; [.328E.0020.0002] # CANADIAN SYLLABICS AA +140C ; [.328F.0020.0002] # CANADIAN SYLLABICS WE +140D ; [.3290.0020.0002] # CANADIAN SYLLABICS WEST-CREE WE +140E ; [.3291.0020.0002] # CANADIAN SYLLABICS WI +140F ; [.3292.0020.0002] # CANADIAN SYLLABICS WEST-CREE WI +1410 ; [.3293.0020.0002] # CANADIAN SYLLABICS WII +1411 ; [.3294.0020.0002] # CANADIAN SYLLABICS WEST-CREE WII +1412 ; [.3295.0020.0002] # CANADIAN SYLLABICS WO +1413 ; [.3296.0020.0002] # CANADIAN SYLLABICS WEST-CREE WO +1414 ; [.3297.0020.0002] # CANADIAN SYLLABICS WOO +1415 ; [.3298.0020.0002] # CANADIAN SYLLABICS WEST-CREE WOO +1416 ; [.3299.0020.0002] # CANADIAN SYLLABICS NASKAPI WOO +1417 ; [.329A.0020.0002] # CANADIAN SYLLABICS WA +1418 ; [.329B.0020.0002] # CANADIAN SYLLABICS WEST-CREE WA +1419 ; [.329C.0020.0002] # CANADIAN SYLLABICS WAA +141A ; [.329D.0020.0002] # CANADIAN SYLLABICS WEST-CREE WAA +141B ; [.329E.0020.0002] # CANADIAN SYLLABICS NASKAPI WAA +141C ; [.329F.0020.0002] # CANADIAN SYLLABICS AI +141D ; [.32A0.0020.0002] # CANADIAN SYLLABICS Y-CREE W +141E ; [.32A1.0020.0002] # CANADIAN SYLLABICS GLOTTAL STOP +141F ; [.32A2.0020.0002] # CANADIAN SYLLABICS FINAL ACUTE +1420 ; [.32A3.0020.0002] # CANADIAN SYLLABICS FINAL GRAVE +1421 ; [.32A4.0020.0002] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING +1422 ; [.32A5.0020.0002] # CANADIAN SYLLABICS FINAL TOP HALF RING +1423 ; [.32A6.0020.0002] # CANADIAN SYLLABICS FINAL RIGHT HALF RING +1424 ; [.32A7.0020.0002] # CANADIAN SYLLABICS FINAL RING +1425 ; [.32A8.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE +1426 ; [.32A9.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES +1427 ; [.32AA.0020.0002] # CANADIAN SYLLABICS FINAL MIDDLE DOT +1428 ; [.32AB.0020.0002] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE +1429 ; [.32AC.0020.0002] # CANADIAN SYLLABICS FINAL PLUS +142A ; [.32AD.0020.0002] # CANADIAN SYLLABICS FINAL DOWN TACK +142B ; [.32AE.0020.0002] # CANADIAN SYLLABICS EN +142C ; [.32AF.0020.0002] # CANADIAN SYLLABICS IN +142D ; [.32B0.0020.0002] # CANADIAN SYLLABICS ON +142E ; [.32B1.0020.0002] # CANADIAN SYLLABICS AN +142F ; [.32B2.0020.0002] # CANADIAN SYLLABICS PE +1430 ; [.32B3.0020.0002] # CANADIAN SYLLABICS PAAI +1431 ; [.32B4.0020.0002] # CANADIAN SYLLABICS PI +1432 ; [.32B5.0020.0002] # CANADIAN SYLLABICS PII +1433 ; [.32B6.0020.0002] # CANADIAN SYLLABICS PO +1434 ; [.32B7.0020.0002] # CANADIAN SYLLABICS POO +1435 ; [.32B8.0020.0002] # CANADIAN SYLLABICS Y-CREE POO +1436 ; [.32B9.0020.0002] # CANADIAN SYLLABICS CARRIER HEE +1437 ; [.32BA.0020.0002] # CANADIAN SYLLABICS CARRIER HI +1438 ; [.32BB.0020.0002] # CANADIAN SYLLABICS PA +1439 ; [.32BC.0020.0002] # CANADIAN SYLLABICS PAA +143A ; [.32BD.0020.0002] # CANADIAN SYLLABICS PWE +143B ; [.32BE.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWE +143C ; [.32BF.0020.0002] # CANADIAN SYLLABICS PWI +143D ; [.32C0.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWI +143E ; [.32C1.0020.0002] # CANADIAN SYLLABICS PWII +143F ; [.32C2.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWII +1440 ; [.32C3.0020.0002] # CANADIAN SYLLABICS PWO +1441 ; [.32C4.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWO +1442 ; [.32C5.0020.0002] # CANADIAN SYLLABICS PWOO +1443 ; [.32C6.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWOO +1444 ; [.32C7.0020.0002] # CANADIAN SYLLABICS PWA +1445 ; [.32C8.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWA +1446 ; [.32C9.0020.0002] # CANADIAN SYLLABICS PWAA +1447 ; [.32CA.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWAA +1448 ; [.32CB.0020.0002] # CANADIAN SYLLABICS Y-CREE PWAA +1449 ; [.32CC.0020.0002] # CANADIAN SYLLABICS P +144A ; [.32CD.0020.0002] # CANADIAN SYLLABICS WEST-CREE P +144B ; [.32CE.0020.0002] # CANADIAN SYLLABICS CARRIER H +144C ; [.32CF.0020.0002] # CANADIAN SYLLABICS TE +144D ; [.32D0.0020.0002] # CANADIAN SYLLABICS TAAI +144E ; [.32D1.0020.0002] # CANADIAN SYLLABICS TI +144F ; [.32D2.0020.0002] # CANADIAN SYLLABICS TII +1450 ; [.32D3.0020.0002] # CANADIAN SYLLABICS TO +1451 ; [.32D4.0020.0002] # CANADIAN SYLLABICS TOO +1452 ; [.32D5.0020.0002] # CANADIAN SYLLABICS Y-CREE TOO +1453 ; [.32D6.0020.0002] # CANADIAN SYLLABICS CARRIER DEE +1454 ; [.32D7.0020.0002] # CANADIAN SYLLABICS CARRIER DI +1455 ; [.32D8.0020.0002] # CANADIAN SYLLABICS TA +1456 ; [.32D9.0020.0002] # CANADIAN SYLLABICS TAA +1457 ; [.32DA.0020.0002] # CANADIAN SYLLABICS TWE +1458 ; [.32DB.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWE +1459 ; [.32DC.0020.0002] # CANADIAN SYLLABICS TWI +145A ; [.32DD.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWI +145B ; [.32DE.0020.0002] # CANADIAN SYLLABICS TWII +145C ; [.32DF.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWII +145D ; [.32E0.0020.0002] # CANADIAN SYLLABICS TWO +145E ; [.32E1.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWO +145F ; [.32E2.0020.0002] # CANADIAN SYLLABICS TWOO +1460 ; [.32E3.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWOO +1461 ; [.32E4.0020.0002] # CANADIAN SYLLABICS TWA +1462 ; [.32E5.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWA +1463 ; [.32E6.0020.0002] # CANADIAN SYLLABICS TWAA +1464 ; [.32E7.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWAA +1465 ; [.32E8.0020.0002] # CANADIAN SYLLABICS NASKAPI TWAA +1466 ; [.32E9.0020.0002] # CANADIAN SYLLABICS T +1467 ; [.32EA.0020.0002] # CANADIAN SYLLABICS TTE +1468 ; [.32EB.0020.0002] # CANADIAN SYLLABICS TTI +1469 ; [.32EC.0020.0002] # CANADIAN SYLLABICS TTO +146A ; [.32ED.0020.0002] # CANADIAN SYLLABICS TTA +146B ; [.32EE.0020.0002] # CANADIAN SYLLABICS KE +146C ; [.32EF.0020.0002] # CANADIAN SYLLABICS KAAI +146D ; [.32F0.0020.0002] # CANADIAN SYLLABICS KI +146E ; [.32F1.0020.0002] # CANADIAN SYLLABICS KII +146F ; [.32F2.0020.0002] # CANADIAN SYLLABICS KO +1470 ; [.32F3.0020.0002] # CANADIAN SYLLABICS KOO +1471 ; [.32F4.0020.0002] # CANADIAN SYLLABICS Y-CREE KOO +1472 ; [.32F5.0020.0002] # CANADIAN SYLLABICS KA +1473 ; [.32F6.0020.0002] # CANADIAN SYLLABICS KAA +1474 ; [.32F7.0020.0002] # CANADIAN SYLLABICS KWE +1475 ; [.32F8.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWE +1476 ; [.32F9.0020.0002] # CANADIAN SYLLABICS KWI +1477 ; [.32FA.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWI +1478 ; [.32FB.0020.0002] # CANADIAN SYLLABICS KWII +1479 ; [.32FC.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWII +147A ; [.32FD.0020.0002] # CANADIAN SYLLABICS KWO +147B ; [.32FE.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWO +147C ; [.32FF.0020.0002] # CANADIAN SYLLABICS KWOO +147D ; [.3300.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWOO +147E ; [.3301.0020.0002] # CANADIAN SYLLABICS KWA +147F ; [.3302.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWA +1480 ; [.3303.0020.0002] # CANADIAN SYLLABICS KWAA +1481 ; [.3304.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWAA +1482 ; [.3305.0020.0002] # CANADIAN SYLLABICS NASKAPI KWAA +1483 ; [.3306.0020.0002] # CANADIAN SYLLABICS K +1484 ; [.3307.0020.0002] # CANADIAN SYLLABICS KW +1485 ; [.3308.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH +1486 ; [.3309.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH +1487 ; [.330A.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH +1488 ; [.330B.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH +1489 ; [.330C.0020.0002] # CANADIAN SYLLABICS CE +148A ; [.330D.0020.0002] # CANADIAN SYLLABICS CAAI +148B ; [.330E.0020.0002] # CANADIAN SYLLABICS CI +148C ; [.330F.0020.0002] # CANADIAN SYLLABICS CII +148D ; [.3310.0020.0002] # CANADIAN SYLLABICS CO +148E ; [.3311.0020.0002] # CANADIAN SYLLABICS COO +148F ; [.3312.0020.0002] # CANADIAN SYLLABICS Y-CREE COO +1490 ; [.3313.0020.0002] # CANADIAN SYLLABICS CA +1491 ; [.3314.0020.0002] # CANADIAN SYLLABICS CAA +1492 ; [.3315.0020.0002] # CANADIAN SYLLABICS CWE +1493 ; [.3316.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWE +1494 ; [.3317.0020.0002] # CANADIAN SYLLABICS CWI +1495 ; [.3318.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWI +1496 ; [.3319.0020.0002] # CANADIAN SYLLABICS CWII +1497 ; [.331A.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWII +1498 ; [.331B.0020.0002] # CANADIAN SYLLABICS CWO +1499 ; [.331C.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWO +149A ; [.331D.0020.0002] # CANADIAN SYLLABICS CWOO +149B ; [.331E.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWOO +149C ; [.331F.0020.0002] # CANADIAN SYLLABICS CWA +149D ; [.3320.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWA +149E ; [.3321.0020.0002] # CANADIAN SYLLABICS CWAA +149F ; [.3322.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWAA +14A0 ; [.3323.0020.0002] # CANADIAN SYLLABICS NASKAPI CWAA +14A1 ; [.3324.0020.0002] # CANADIAN SYLLABICS C +14A2 ; [.3325.0020.0002] # CANADIAN SYLLABICS SAYISI TH +14A3 ; [.3326.0020.0002] # CANADIAN SYLLABICS ME +14A4 ; [.3327.0020.0002] # CANADIAN SYLLABICS MAAI +14A5 ; [.3328.0020.0002] # CANADIAN SYLLABICS MI +14A6 ; [.3329.0020.0002] # CANADIAN SYLLABICS MII +14A7 ; [.332A.0020.0002] # CANADIAN SYLLABICS MO +14A8 ; [.332B.0020.0002] # CANADIAN SYLLABICS MOO +14A9 ; [.332C.0020.0002] # CANADIAN SYLLABICS Y-CREE MOO +14AA ; [.332D.0020.0002] # CANADIAN SYLLABICS MA +14AB ; [.332E.0020.0002] # CANADIAN SYLLABICS MAA +14AC ; [.332F.0020.0002] # CANADIAN SYLLABICS MWE +14AD ; [.3330.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWE +14AE ; [.3331.0020.0002] # CANADIAN SYLLABICS MWI +14AF ; [.3332.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWI +14B0 ; [.3333.0020.0002] # CANADIAN SYLLABICS MWII +14B1 ; [.3334.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWII +14B2 ; [.3335.0020.0002] # CANADIAN SYLLABICS MWO +14B3 ; [.3336.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWO +14B4 ; [.3337.0020.0002] # CANADIAN SYLLABICS MWOO +14B5 ; [.3338.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWOO +14B6 ; [.3339.0020.0002] # CANADIAN SYLLABICS MWA +14B7 ; [.333A.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWA +14B8 ; [.333B.0020.0002] # CANADIAN SYLLABICS MWAA +14B9 ; [.333C.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWAA +14BA ; [.333D.0020.0002] # CANADIAN SYLLABICS NASKAPI MWAA +14BB ; [.333E.0020.0002] # CANADIAN SYLLABICS M +14BC ; [.333F.0020.0002] # CANADIAN SYLLABICS WEST-CREE M +14BD ; [.3340.0020.0002] # CANADIAN SYLLABICS MH +14BE ; [.3341.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN M +14BF ; [.3342.0020.0002] # CANADIAN SYLLABICS SAYISI M +14C0 ; [.3343.0020.0002] # CANADIAN SYLLABICS NE +14C1 ; [.3344.0020.0002] # CANADIAN SYLLABICS NAAI +14C2 ; [.3345.0020.0002] # CANADIAN SYLLABICS NI +14C3 ; [.3346.0020.0002] # CANADIAN SYLLABICS NII +14C4 ; [.3347.0020.0002] # CANADIAN SYLLABICS NO +14C5 ; [.3348.0020.0002] # CANADIAN SYLLABICS NOO +14C6 ; [.3349.0020.0002] # CANADIAN SYLLABICS Y-CREE NOO +14C7 ; [.334A.0020.0002] # CANADIAN SYLLABICS NA +14C8 ; [.334B.0020.0002] # CANADIAN SYLLABICS NAA +14C9 ; [.334C.0020.0002] # CANADIAN SYLLABICS NWE +14CA ; [.334D.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWE +14CB ; [.334E.0020.0002] # CANADIAN SYLLABICS NWA +14CC ; [.334F.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWA +14CD ; [.3350.0020.0002] # CANADIAN SYLLABICS NWAA +14CE ; [.3351.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWAA +14CF ; [.3352.0020.0002] # CANADIAN SYLLABICS NASKAPI NWAA +14D0 ; [.3353.0020.0002] # CANADIAN SYLLABICS N +14D1 ; [.3354.0020.0002] # CANADIAN SYLLABICS CARRIER NG +14D2 ; [.3355.0020.0002] # CANADIAN SYLLABICS NH +14D3 ; [.3356.0020.0002] # CANADIAN SYLLABICS LE +14D4 ; [.3357.0020.0002] # CANADIAN SYLLABICS LAAI +14D5 ; [.3358.0020.0002] # CANADIAN SYLLABICS LI +14D6 ; [.3359.0020.0002] # CANADIAN SYLLABICS LII +14D7 ; [.335A.0020.0002] # CANADIAN SYLLABICS LO +14D8 ; [.335B.0020.0002] # CANADIAN SYLLABICS LOO +14D9 ; [.335C.0020.0002] # CANADIAN SYLLABICS Y-CREE LOO +14DA ; [.335D.0020.0002] # CANADIAN SYLLABICS LA +14DB ; [.335E.0020.0002] # CANADIAN SYLLABICS LAA +14DC ; [.335F.0020.0002] # CANADIAN SYLLABICS LWE +14DD ; [.3360.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWE +14DE ; [.3361.0020.0002] # CANADIAN SYLLABICS LWI +14DF ; [.3362.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWI +14E0 ; [.3363.0020.0002] # CANADIAN SYLLABICS LWII +14E1 ; [.3364.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWII +14E2 ; [.3365.0020.0002] # CANADIAN SYLLABICS LWO +14E3 ; [.3366.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWO +14E4 ; [.3367.0020.0002] # CANADIAN SYLLABICS LWOO +14E5 ; [.3368.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWOO +14E6 ; [.3369.0020.0002] # CANADIAN SYLLABICS LWA +14E7 ; [.336A.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWA +14E8 ; [.336B.0020.0002] # CANADIAN SYLLABICS LWAA +14E9 ; [.336C.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWAA +14EA ; [.336D.0020.0002] # CANADIAN SYLLABICS L +14EB ; [.336E.0020.0002] # CANADIAN SYLLABICS WEST-CREE L +14EC ; [.336F.0020.0002] # CANADIAN SYLLABICS MEDIAL L +14ED ; [.3370.0020.0002] # CANADIAN SYLLABICS SE +14EE ; [.3371.0020.0002] # CANADIAN SYLLABICS SAAI +14EF ; [.3372.0020.0002] # CANADIAN SYLLABICS SI +14F0 ; [.3373.0020.0002] # CANADIAN SYLLABICS SII +14F1 ; [.3374.0020.0002] # CANADIAN SYLLABICS SO +14F2 ; [.3375.0020.0002] # CANADIAN SYLLABICS SOO +14F3 ; [.3376.0020.0002] # CANADIAN SYLLABICS Y-CREE SOO +14F4 ; [.3377.0020.0002] # CANADIAN SYLLABICS SA +14F5 ; [.3378.0020.0002] # CANADIAN SYLLABICS SAA +14F6 ; [.3379.0020.0002] # CANADIAN SYLLABICS SWE +14F7 ; [.337A.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWE +14F8 ; [.337B.0020.0002] # CANADIAN SYLLABICS SWI +14F9 ; [.337C.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWI +14FA ; [.337D.0020.0002] # CANADIAN SYLLABICS SWII +14FB ; [.337E.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWII +14FC ; [.337F.0020.0002] # CANADIAN SYLLABICS SWO +14FD ; [.3380.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWO +14FE ; [.3381.0020.0002] # CANADIAN SYLLABICS SWOO +14FF ; [.3382.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWOO +1500 ; [.3383.0020.0002] # CANADIAN SYLLABICS SWA +1501 ; [.3384.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWA +1502 ; [.3385.0020.0002] # CANADIAN SYLLABICS SWAA +1503 ; [.3386.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWAA +1504 ; [.3387.0020.0002] # CANADIAN SYLLABICS NASKAPI SWAA +1505 ; [.3388.0020.0002] # CANADIAN SYLLABICS S +1506 ; [.3389.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN S +1507 ; [.338A.0020.0002] # CANADIAN SYLLABICS SW +1508 ; [.338B.0020.0002] # CANADIAN SYLLABICS BLACKFOOT S +1509 ; [.338C.0020.0002] # CANADIAN SYLLABICS MOOSE-CREE SK +150A ; [.338D.0020.0002] # CANADIAN SYLLABICS NASKAPI SKW +150B ; [.338E.0020.0002] # CANADIAN SYLLABICS NASKAPI S-W +150C ; [.338F.0020.0002] # CANADIAN SYLLABICS NASKAPI SPWA +150D ; [.3390.0020.0002] # CANADIAN SYLLABICS NASKAPI STWA +150E ; [.3391.0020.0002] # CANADIAN SYLLABICS NASKAPI SKWA +150F ; [.3392.0020.0002] # CANADIAN SYLLABICS NASKAPI SCWA +1510 ; [.3393.0020.0002] # CANADIAN SYLLABICS SHE +1511 ; [.3394.0020.0002] # CANADIAN SYLLABICS SHI +1512 ; [.3395.0020.0002] # CANADIAN SYLLABICS SHII +1513 ; [.3396.0020.0002] # CANADIAN SYLLABICS SHO +1514 ; [.3397.0020.0002] # CANADIAN SYLLABICS SHOO +1515 ; [.3398.0020.0002] # CANADIAN SYLLABICS SHA +1516 ; [.3399.0020.0002] # CANADIAN SYLLABICS SHAA +1517 ; [.339A.0020.0002] # CANADIAN SYLLABICS SHWE +1518 ; [.339B.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWE +1519 ; [.339C.0020.0002] # CANADIAN SYLLABICS SHWI +151A ; [.339D.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWI +151B ; [.339E.0020.0002] # CANADIAN SYLLABICS SHWII +151C ; [.339F.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWII +151D ; [.33A0.0020.0002] # CANADIAN SYLLABICS SHWO +151E ; [.33A1.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWO +151F ; [.33A2.0020.0002] # CANADIAN SYLLABICS SHWOO +1520 ; [.33A3.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWOO +1521 ; [.33A4.0020.0002] # CANADIAN SYLLABICS SHWA +1522 ; [.33A5.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWA +1523 ; [.33A6.0020.0002] # CANADIAN SYLLABICS SHWAA +1524 ; [.33A7.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWAA +1525 ; [.33A8.0020.0002] # CANADIAN SYLLABICS SH +1526 ; [.33A9.0020.0002] # CANADIAN SYLLABICS YE +1527 ; [.33AA.0020.0002] # CANADIAN SYLLABICS YAAI +1528 ; [.33AB.0020.0002] # CANADIAN SYLLABICS YI +1529 ; [.33AC.0020.0002] # CANADIAN SYLLABICS YII +152A ; [.33AD.0020.0002] # CANADIAN SYLLABICS YO +152B ; [.33AE.0020.0002] # CANADIAN SYLLABICS YOO +152C ; [.33AF.0020.0002] # CANADIAN SYLLABICS Y-CREE YOO +152D ; [.33B0.0020.0002] # CANADIAN SYLLABICS YA +152E ; [.33B1.0020.0002] # CANADIAN SYLLABICS YAA +152F ; [.33B2.0020.0002] # CANADIAN SYLLABICS YWE +1530 ; [.33B3.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWE +1531 ; [.33B4.0020.0002] # CANADIAN SYLLABICS YWI +1532 ; [.33B5.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWI +1533 ; [.33B6.0020.0002] # CANADIAN SYLLABICS YWII +1534 ; [.33B7.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWII +1535 ; [.33B8.0020.0002] # CANADIAN SYLLABICS YWO +1536 ; [.33B9.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWO +1537 ; [.33BA.0020.0002] # CANADIAN SYLLABICS YWOO +1538 ; [.33BB.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWOO +1539 ; [.33BC.0020.0002] # CANADIAN SYLLABICS YWA +153A ; [.33BD.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWA +153B ; [.33BE.0020.0002] # CANADIAN SYLLABICS YWAA +153C ; [.33BF.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWAA +153D ; [.33C0.0020.0002] # CANADIAN SYLLABICS NASKAPI YWAA +153E ; [.33C1.0020.0002] # CANADIAN SYLLABICS Y +153F ; [.33C2.0020.0002] # CANADIAN SYLLABICS BIBLE-CREE Y +1540 ; [.33C3.0020.0002] # CANADIAN SYLLABICS WEST-CREE Y +1541 ; [.33C4.0020.0002] # CANADIAN SYLLABICS SAYISI YI +1542 ; [.33C5.0020.0002] # CANADIAN SYLLABICS RE +1543 ; [.33C6.0020.0002] # CANADIAN SYLLABICS R-CREE RE +1544 ; [.33C7.0020.0002] # CANADIAN SYLLABICS WEST-CREE LE +1545 ; [.33C8.0020.0002] # CANADIAN SYLLABICS RAAI +1546 ; [.33C9.0020.0002] # CANADIAN SYLLABICS RI +1547 ; [.33CA.0020.0002] # CANADIAN SYLLABICS RII +1548 ; [.33CB.0020.0002] # CANADIAN SYLLABICS RO +1549 ; [.33CC.0020.0002] # CANADIAN SYLLABICS ROO +154A ; [.33CD.0020.0002] # CANADIAN SYLLABICS WEST-CREE LO +154B ; [.33CE.0020.0002] # CANADIAN SYLLABICS RA +154C ; [.33CF.0020.0002] # CANADIAN SYLLABICS RAA +154D ; [.33D0.0020.0002] # CANADIAN SYLLABICS WEST-CREE LA +154E ; [.33D1.0020.0002] # CANADIAN SYLLABICS RWAA +154F ; [.33D2.0020.0002] # CANADIAN SYLLABICS WEST-CREE RWAA +1550 ; [.33D3.0020.0002] # CANADIAN SYLLABICS R +1551 ; [.33D4.0020.0002] # CANADIAN SYLLABICS WEST-CREE R +1552 ; [.33D5.0020.0002] # CANADIAN SYLLABICS MEDIAL R +1553 ; [.33D6.0020.0002] # CANADIAN SYLLABICS FE +1554 ; [.33D7.0020.0002] # CANADIAN SYLLABICS FAAI +1555 ; [.33D8.0020.0002] # CANADIAN SYLLABICS FI +1556 ; [.33D9.0020.0002] # CANADIAN SYLLABICS FII +1557 ; [.33DA.0020.0002] # CANADIAN SYLLABICS FO +1558 ; [.33DB.0020.0002] # CANADIAN SYLLABICS FOO +1559 ; [.33DC.0020.0002] # CANADIAN SYLLABICS FA +155A ; [.33DD.0020.0002] # CANADIAN SYLLABICS FAA +155B ; [.33DE.0020.0002] # CANADIAN SYLLABICS FWAA +155C ; [.33DF.0020.0002] # CANADIAN SYLLABICS WEST-CREE FWAA +155D ; [.33E0.0020.0002] # CANADIAN SYLLABICS F +155E ; [.33E1.0020.0002] # CANADIAN SYLLABICS THE +155F ; [.33E2.0020.0002] # CANADIAN SYLLABICS N-CREE THE +1560 ; [.33E3.0020.0002] # CANADIAN SYLLABICS THI +1561 ; [.33E4.0020.0002] # CANADIAN SYLLABICS N-CREE THI +1562 ; [.33E5.0020.0002] # CANADIAN SYLLABICS THII +1563 ; [.33E6.0020.0002] # CANADIAN SYLLABICS N-CREE THII +1564 ; [.33E7.0020.0002] # CANADIAN SYLLABICS THO +1565 ; [.33E8.0020.0002] # CANADIAN SYLLABICS THOO +1566 ; [.33E9.0020.0002] # CANADIAN SYLLABICS THA +1567 ; [.33EA.0020.0002] # CANADIAN SYLLABICS THAA +1568 ; [.33EB.0020.0002] # CANADIAN SYLLABICS THWAA +1569 ; [.33EC.0020.0002] # CANADIAN SYLLABICS WEST-CREE THWAA +156A ; [.33ED.0020.0002] # CANADIAN SYLLABICS TH +156B ; [.33EE.0020.0002] # CANADIAN SYLLABICS TTHE +156C ; [.33EF.0020.0002] # CANADIAN SYLLABICS TTHI +156D ; [.33F0.0020.0002] # CANADIAN SYLLABICS TTHO +156E ; [.33F1.0020.0002] # CANADIAN SYLLABICS TTHA +156F ; [.33F2.0020.0002] # CANADIAN SYLLABICS TTH +1570 ; [.33F3.0020.0002] # CANADIAN SYLLABICS TYE +1571 ; [.33F4.0020.0002] # CANADIAN SYLLABICS TYI +1572 ; [.33F5.0020.0002] # CANADIAN SYLLABICS TYO +1573 ; [.33F6.0020.0002] # CANADIAN SYLLABICS TYA +1574 ; [.33F7.0020.0002] # CANADIAN SYLLABICS NUNAVIK HE +1575 ; [.33F8.0020.0002] # CANADIAN SYLLABICS NUNAVIK HI +1576 ; [.33F9.0020.0002] # CANADIAN SYLLABICS NUNAVIK HII +1577 ; [.33FA.0020.0002] # CANADIAN SYLLABICS NUNAVIK HO +1578 ; [.33FB.0020.0002] # CANADIAN SYLLABICS NUNAVIK HOO +1579 ; [.33FC.0020.0002] # CANADIAN SYLLABICS NUNAVIK HA +157A ; [.33FD.0020.0002] # CANADIAN SYLLABICS NUNAVIK HAA +157B ; [.33FE.0020.0002] # CANADIAN SYLLABICS NUNAVIK H +157D ; [.33FF.0020.0002] # CANADIAN SYLLABICS HK +166F ; [.3400.0020.0002] # CANADIAN SYLLABICS QAI +157E ; [.3401.0020.0002] # CANADIAN SYLLABICS QAAI +157F ; [.3402.0020.0002] # CANADIAN SYLLABICS QI +1580 ; [.3403.0020.0002] # CANADIAN SYLLABICS QII +1581 ; [.3404.0020.0002] # CANADIAN SYLLABICS QO +1582 ; [.3405.0020.0002] # CANADIAN SYLLABICS QOO +1583 ; [.3406.0020.0002] # CANADIAN SYLLABICS QA +1584 ; [.3407.0020.0002] # CANADIAN SYLLABICS QAA +1585 ; [.3408.0020.0002] # CANADIAN SYLLABICS Q +1586 ; [.3409.0020.0002] # CANADIAN SYLLABICS TLHE +1587 ; [.340A.0020.0002] # CANADIAN SYLLABICS TLHI +1588 ; [.340B.0020.0002] # CANADIAN SYLLABICS TLHO +1589 ; [.340C.0020.0002] # CANADIAN SYLLABICS TLHA +158A ; [.340D.0020.0002] # CANADIAN SYLLABICS WEST-CREE RE +158B ; [.340E.0020.0002] # CANADIAN SYLLABICS WEST-CREE RI +158C ; [.340F.0020.0002] # CANADIAN SYLLABICS WEST-CREE RO +158D ; [.3410.0020.0002] # CANADIAN SYLLABICS WEST-CREE RA +1670 ; [.3411.0020.0002] # CANADIAN SYLLABICS NGAI +158E ; [.3412.0020.0002] # CANADIAN SYLLABICS NGAAI +158F ; [.3413.0020.0002] # CANADIAN SYLLABICS NGI +1590 ; [.3414.0020.0002] # CANADIAN SYLLABICS NGII +1591 ; [.3415.0020.0002] # CANADIAN SYLLABICS NGO +1592 ; [.3416.0020.0002] # CANADIAN SYLLABICS NGOO +1593 ; [.3417.0020.0002] # CANADIAN SYLLABICS NGA +1594 ; [.3418.0020.0002] # CANADIAN SYLLABICS NGAA +1595 ; [.3419.0020.0002] # CANADIAN SYLLABICS NG +1671 ; [.341A.0020.0002] # CANADIAN SYLLABICS NNGI +1672 ; [.341B.0020.0002] # CANADIAN SYLLABICS NNGII +1673 ; [.341C.0020.0002] # CANADIAN SYLLABICS NNGO +1674 ; [.341D.0020.0002] # CANADIAN SYLLABICS NNGOO +1675 ; [.341E.0020.0002] # CANADIAN SYLLABICS NNGA +1676 ; [.341F.0020.0002] # CANADIAN SYLLABICS NNGAA +1596 ; [.3420.0020.0002] # CANADIAN SYLLABICS NNG +1597 ; [.3421.0020.0002] # CANADIAN SYLLABICS SAYISI SHE +1598 ; [.3422.0020.0002] # CANADIAN SYLLABICS SAYISI SHI +1599 ; [.3423.0020.0002] # CANADIAN SYLLABICS SAYISI SHO +159A ; [.3424.0020.0002] # CANADIAN SYLLABICS SAYISI SHA +159B ; [.3425.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THE +159C ; [.3426.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THI +159D ; [.3427.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THO +159E ; [.3428.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THA +159F ; [.3429.0020.0002] # CANADIAN SYLLABICS WOODS-CREE TH +15A0 ; [.342A.0020.0002] # CANADIAN SYLLABICS LHI +15A1 ; [.342B.0020.0002] # CANADIAN SYLLABICS LHII +15A2 ; [.342C.0020.0002] # CANADIAN SYLLABICS LHO +15A3 ; [.342D.0020.0002] # CANADIAN SYLLABICS LHOO +15A4 ; [.342E.0020.0002] # CANADIAN SYLLABICS LHA +15A5 ; [.342F.0020.0002] # CANADIAN SYLLABICS LHAA +15A6 ; [.3430.0020.0002] # CANADIAN SYLLABICS LH +157C ; [.3431.0020.0002] # CANADIAN SYLLABICS NUNAVUT H +15A7 ; [.3432.0020.0002] # CANADIAN SYLLABICS TH-CREE THE +15A8 ; [.3433.0020.0002] # CANADIAN SYLLABICS TH-CREE THI +15A9 ; [.3434.0020.0002] # CANADIAN SYLLABICS TH-CREE THII +15AA ; [.3435.0020.0002] # CANADIAN SYLLABICS TH-CREE THO +15AB ; [.3436.0020.0002] # CANADIAN SYLLABICS TH-CREE THOO +15AC ; [.3437.0020.0002] # CANADIAN SYLLABICS TH-CREE THA +15AD ; [.3438.0020.0002] # CANADIAN SYLLABICS TH-CREE THAA +15AE ; [.3439.0020.0002] # CANADIAN SYLLABICS TH-CREE TH +15AF ; [.343A.0020.0002] # CANADIAN SYLLABICS AIVILIK B +15B0 ; [.343B.0020.0002] # CANADIAN SYLLABICS BLACKFOOT E +15B1 ; [.343C.0020.0002] # CANADIAN SYLLABICS BLACKFOOT I +15B2 ; [.343D.0020.0002] # CANADIAN SYLLABICS BLACKFOOT O +15B3 ; [.343E.0020.0002] # CANADIAN SYLLABICS BLACKFOOT A +15B4 ; [.343F.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WE +15B5 ; [.3440.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WI +15B6 ; [.3441.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WO +15B7 ; [.3442.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WA +15B8 ; [.3443.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NE +15B9 ; [.3444.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NI +15BA ; [.3445.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NO +15BB ; [.3446.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NA +15BC ; [.3447.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KE +15BD ; [.3448.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KI +15BE ; [.3449.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KO +15BF ; [.344A.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KA +15C0 ; [.344B.0020.0002] # CANADIAN SYLLABICS SAYISI HE +15C1 ; [.344C.0020.0002] # CANADIAN SYLLABICS SAYISI HI +15C2 ; [.344D.0020.0002] # CANADIAN SYLLABICS SAYISI HO +15C3 ; [.344E.0020.0002] # CANADIAN SYLLABICS SAYISI HA +15C4 ; [.344F.0020.0002] # CANADIAN SYLLABICS CARRIER GHU +15C5 ; [.3450.0020.0002] # CANADIAN SYLLABICS CARRIER GHO +15C6 ; [.3451.0020.0002] # CANADIAN SYLLABICS CARRIER GHE +15C7 ; [.3452.0020.0002] # CANADIAN SYLLABICS CARRIER GHEE +15C8 ; [.3453.0020.0002] # CANADIAN SYLLABICS CARRIER GHI +15C9 ; [.3454.0020.0002] # CANADIAN SYLLABICS CARRIER GHA +15CA ; [.3455.0020.0002] # CANADIAN SYLLABICS CARRIER RU +15CB ; [.3456.0020.0002] # CANADIAN SYLLABICS CARRIER RO +15CC ; [.3457.0020.0002] # CANADIAN SYLLABICS CARRIER RE +15CD ; [.3458.0020.0002] # CANADIAN SYLLABICS CARRIER REE +15CE ; [.3459.0020.0002] # CANADIAN SYLLABICS CARRIER RI +15CF ; [.345A.0020.0002] # CANADIAN SYLLABICS CARRIER RA +15D0 ; [.345B.0020.0002] # CANADIAN SYLLABICS CARRIER WU +15D1 ; [.345C.0020.0002] # CANADIAN SYLLABICS CARRIER WO +15D2 ; [.345D.0020.0002] # CANADIAN SYLLABICS CARRIER WE +15D3 ; [.345E.0020.0002] # CANADIAN SYLLABICS CARRIER WEE +15D4 ; [.345F.0020.0002] # CANADIAN SYLLABICS CARRIER WI +15D5 ; [.3460.0020.0002] # CANADIAN SYLLABICS CARRIER WA +15D6 ; [.3461.0020.0002] # CANADIAN SYLLABICS CARRIER HWU +15D7 ; [.3462.0020.0002] # CANADIAN SYLLABICS CARRIER HWO +15D8 ; [.3463.0020.0002] # CANADIAN SYLLABICS CARRIER HWE +15D9 ; [.3464.0020.0002] # CANADIAN SYLLABICS CARRIER HWEE +15DA ; [.3465.0020.0002] # CANADIAN SYLLABICS CARRIER HWI +15DB ; [.3466.0020.0002] # CANADIAN SYLLABICS CARRIER HWA +15DC ; [.3467.0020.0002] # CANADIAN SYLLABICS CARRIER THU +15DD ; [.3468.0020.0002] # CANADIAN SYLLABICS CARRIER THO +15DE ; [.3469.0020.0002] # CANADIAN SYLLABICS CARRIER THE +15DF ; [.346A.0020.0002] # CANADIAN SYLLABICS CARRIER THEE +15E0 ; [.346B.0020.0002] # CANADIAN SYLLABICS CARRIER THI +15E1 ; [.346C.0020.0002] # CANADIAN SYLLABICS CARRIER THA +15E2 ; [.346D.0020.0002] # CANADIAN SYLLABICS CARRIER TTU +15E3 ; [.346E.0020.0002] # CANADIAN SYLLABICS CARRIER TTO +15E4 ; [.346F.0020.0002] # CANADIAN SYLLABICS CARRIER TTE +15E5 ; [.3470.0020.0002] # CANADIAN SYLLABICS CARRIER TTEE +15E6 ; [.3471.0020.0002] # CANADIAN SYLLABICS CARRIER TTI +15E7 ; [.3472.0020.0002] # CANADIAN SYLLABICS CARRIER TTA +15E8 ; [.3473.0020.0002] # CANADIAN SYLLABICS CARRIER PU +15E9 ; [.3474.0020.0002] # CANADIAN SYLLABICS CARRIER PO +15EA ; [.3475.0020.0002] # CANADIAN SYLLABICS CARRIER PE +15EB ; [.3476.0020.0002] # CANADIAN SYLLABICS CARRIER PEE +15EC ; [.3477.0020.0002] # CANADIAN SYLLABICS CARRIER PI +15ED ; [.3478.0020.0002] # CANADIAN SYLLABICS CARRIER PA +15EE ; [.3479.0020.0002] # CANADIAN SYLLABICS CARRIER P +15EF ; [.347A.0020.0002] # CANADIAN SYLLABICS CARRIER GU +15F0 ; [.347B.0020.0002] # CANADIAN SYLLABICS CARRIER GO +15F1 ; [.347C.0020.0002] # CANADIAN SYLLABICS CARRIER GE +15F2 ; [.347D.0020.0002] # CANADIAN SYLLABICS CARRIER GEE +15F3 ; [.347E.0020.0002] # CANADIAN SYLLABICS CARRIER GI +15F4 ; [.347F.0020.0002] # CANADIAN SYLLABICS CARRIER GA +15F5 ; [.3480.0020.0002] # CANADIAN SYLLABICS CARRIER KHU +15F6 ; [.3481.0020.0002] # CANADIAN SYLLABICS CARRIER KHO +15F7 ; [.3482.0020.0002] # CANADIAN SYLLABICS CARRIER KHE +15F8 ; [.3483.0020.0002] # CANADIAN SYLLABICS CARRIER KHEE +15F9 ; [.3484.0020.0002] # CANADIAN SYLLABICS CARRIER KHI +15FA ; [.3485.0020.0002] # CANADIAN SYLLABICS CARRIER KHA +15FB ; [.3486.0020.0002] # CANADIAN SYLLABICS CARRIER KKU +15FC ; [.3487.0020.0002] # CANADIAN SYLLABICS CARRIER KKO +15FD ; [.3488.0020.0002] # CANADIAN SYLLABICS CARRIER KKE +15FE ; [.3489.0020.0002] # CANADIAN SYLLABICS CARRIER KKEE +15FF ; [.348A.0020.0002] # CANADIAN SYLLABICS CARRIER KKI +1600 ; [.348B.0020.0002] # CANADIAN SYLLABICS CARRIER KKA +1601 ; [.348C.0020.0002] # CANADIAN SYLLABICS CARRIER KK +1602 ; [.348D.0020.0002] # CANADIAN SYLLABICS CARRIER NU +1603 ; [.348E.0020.0002] # CANADIAN SYLLABICS CARRIER NO +1604 ; [.348F.0020.0002] # CANADIAN SYLLABICS CARRIER NE +1605 ; [.3490.0020.0002] # CANADIAN SYLLABICS CARRIER NEE +1606 ; [.3491.0020.0002] # CANADIAN SYLLABICS CARRIER NI +1607 ; [.3492.0020.0002] # CANADIAN SYLLABICS CARRIER NA +1608 ; [.3493.0020.0002] # CANADIAN SYLLABICS CARRIER MU +1609 ; [.3494.0020.0002] # CANADIAN SYLLABICS CARRIER MO +160A ; [.3495.0020.0002] # CANADIAN SYLLABICS CARRIER ME +160B ; [.3496.0020.0002] # CANADIAN SYLLABICS CARRIER MEE +160C ; [.3497.0020.0002] # CANADIAN SYLLABICS CARRIER MI +160D ; [.3498.0020.0002] # CANADIAN SYLLABICS CARRIER MA +160E ; [.3499.0020.0002] # CANADIAN SYLLABICS CARRIER YU +160F ; [.349A.0020.0002] # CANADIAN SYLLABICS CARRIER YO +1610 ; [.349B.0020.0002] # CANADIAN SYLLABICS CARRIER YE +1611 ; [.349C.0020.0002] # CANADIAN SYLLABICS CARRIER YEE +1612 ; [.349D.0020.0002] # CANADIAN SYLLABICS CARRIER YI +1613 ; [.349E.0020.0002] # CANADIAN SYLLABICS CARRIER YA +1614 ; [.349F.0020.0002] # CANADIAN SYLLABICS CARRIER JU +1615 ; [.34A0.0020.0002] # CANADIAN SYLLABICS SAYISI JU +1616 ; [.34A1.0020.0002] # CANADIAN SYLLABICS CARRIER JO +1617 ; [.34A2.0020.0002] # CANADIAN SYLLABICS CARRIER JE +1618 ; [.34A3.0020.0002] # CANADIAN SYLLABICS CARRIER JEE +1619 ; [.34A4.0020.0002] # CANADIAN SYLLABICS CARRIER JI +161A ; [.34A5.0020.0002] # CANADIAN SYLLABICS SAYISI JI +161B ; [.34A6.0020.0002] # CANADIAN SYLLABICS CARRIER JA +161C ; [.34A7.0020.0002] # CANADIAN SYLLABICS CARRIER JJU +161D ; [.34A8.0020.0002] # CANADIAN SYLLABICS CARRIER JJO +161E ; [.34A9.0020.0002] # CANADIAN SYLLABICS CARRIER JJE +161F ; [.34AA.0020.0002] # CANADIAN SYLLABICS CARRIER JJEE +1620 ; [.34AB.0020.0002] # CANADIAN SYLLABICS CARRIER JJI +1621 ; [.34AC.0020.0002] # CANADIAN SYLLABICS CARRIER JJA +1622 ; [.34AD.0020.0002] # CANADIAN SYLLABICS CARRIER LU +1623 ; [.34AE.0020.0002] # CANADIAN SYLLABICS CARRIER LO +1624 ; [.34AF.0020.0002] # CANADIAN SYLLABICS CARRIER LE +1625 ; [.34B0.0020.0002] # CANADIAN SYLLABICS CARRIER LEE +1626 ; [.34B1.0020.0002] # CANADIAN SYLLABICS CARRIER LI +1627 ; [.34B2.0020.0002] # CANADIAN SYLLABICS CARRIER LA +1628 ; [.34B3.0020.0002] # CANADIAN SYLLABICS CARRIER DLU +1629 ; [.34B4.0020.0002] # CANADIAN SYLLABICS CARRIER DLO +162A ; [.34B5.0020.0002] # CANADIAN SYLLABICS CARRIER DLE +162B ; [.34B6.0020.0002] # CANADIAN SYLLABICS CARRIER DLEE +162C ; [.34B7.0020.0002] # CANADIAN SYLLABICS CARRIER DLI +162D ; [.34B8.0020.0002] # CANADIAN SYLLABICS CARRIER DLA +162E ; [.34B9.0020.0002] # CANADIAN SYLLABICS CARRIER LHU +162F ; [.34BA.0020.0002] # CANADIAN SYLLABICS CARRIER LHO +1630 ; [.34BB.0020.0002] # CANADIAN SYLLABICS CARRIER LHE +1631 ; [.34BC.0020.0002] # CANADIAN SYLLABICS CARRIER LHEE +1632 ; [.34BD.0020.0002] # CANADIAN SYLLABICS CARRIER LHI +1633 ; [.34BE.0020.0002] # CANADIAN SYLLABICS CARRIER LHA +1634 ; [.34BF.0020.0002] # CANADIAN SYLLABICS CARRIER TLHU +1635 ; [.34C0.0020.0002] # CANADIAN SYLLABICS CARRIER TLHO +1636 ; [.34C1.0020.0002] # CANADIAN SYLLABICS CARRIER TLHE +1637 ; [.34C2.0020.0002] # CANADIAN SYLLABICS CARRIER TLHEE +1638 ; [.34C3.0020.0002] # CANADIAN SYLLABICS CARRIER TLHI +1639 ; [.34C4.0020.0002] # CANADIAN SYLLABICS CARRIER TLHA +163A ; [.34C5.0020.0002] # CANADIAN SYLLABICS CARRIER TLU +163B ; [.34C6.0020.0002] # CANADIAN SYLLABICS CARRIER TLO +163C ; [.34C7.0020.0002] # CANADIAN SYLLABICS CARRIER TLE +163D ; [.34C8.0020.0002] # CANADIAN SYLLABICS CARRIER TLEE +163E ; [.34C9.0020.0002] # CANADIAN SYLLABICS CARRIER TLI +163F ; [.34CA.0020.0002] # CANADIAN SYLLABICS CARRIER TLA +1640 ; [.34CB.0020.0002] # CANADIAN SYLLABICS CARRIER ZU +1641 ; [.34CC.0020.0002] # CANADIAN SYLLABICS CARRIER ZO +1642 ; [.34CD.0020.0002] # CANADIAN SYLLABICS CARRIER ZE +1643 ; [.34CE.0020.0002] # CANADIAN SYLLABICS CARRIER ZEE +1644 ; [.34CF.0020.0002] # CANADIAN SYLLABICS CARRIER ZI +1645 ; [.34D0.0020.0002] # CANADIAN SYLLABICS CARRIER ZA +1646 ; [.34D1.0020.0002] # CANADIAN SYLLABICS CARRIER Z +1647 ; [.34D2.0020.0002] # CANADIAN SYLLABICS CARRIER INITIAL Z +1648 ; [.34D3.0020.0002] # CANADIAN SYLLABICS CARRIER DZU +1649 ; [.34D4.0020.0002] # CANADIAN SYLLABICS CARRIER DZO +164A ; [.34D5.0020.0002] # CANADIAN SYLLABICS CARRIER DZE +164B ; [.34D6.0020.0002] # CANADIAN SYLLABICS CARRIER DZEE +164C ; [.34D7.0020.0002] # CANADIAN SYLLABICS CARRIER DZI +164D ; [.34D8.0020.0002] # CANADIAN SYLLABICS CARRIER DZA +164E ; [.34D9.0020.0002] # CANADIAN SYLLABICS CARRIER SU +164F ; [.34DA.0020.0002] # CANADIAN SYLLABICS CARRIER SO +1650 ; [.34DB.0020.0002] # CANADIAN SYLLABICS CARRIER SE +1651 ; [.34DC.0020.0002] # CANADIAN SYLLABICS CARRIER SEE +1652 ; [.34DD.0020.0002] # CANADIAN SYLLABICS CARRIER SI +1653 ; [.34DE.0020.0002] # CANADIAN SYLLABICS CARRIER SA +1654 ; [.34DF.0020.0002] # CANADIAN SYLLABICS CARRIER SHU +1655 ; [.34E0.0020.0002] # CANADIAN SYLLABICS CARRIER SHO +1656 ; [.34E1.0020.0002] # CANADIAN SYLLABICS CARRIER SHE +1657 ; [.34E2.0020.0002] # CANADIAN SYLLABICS CARRIER SHEE +1658 ; [.34E3.0020.0002] # CANADIAN SYLLABICS CARRIER SHI +1659 ; [.34E4.0020.0002] # CANADIAN SYLLABICS CARRIER SHA +165A ; [.34E5.0020.0002] # CANADIAN SYLLABICS CARRIER SH +165B ; [.34E6.0020.0002] # CANADIAN SYLLABICS CARRIER TSU +165C ; [.34E7.0020.0002] # CANADIAN SYLLABICS CARRIER TSO +165D ; [.34E8.0020.0002] # CANADIAN SYLLABICS CARRIER TSE +165E ; [.34E9.0020.0002] # CANADIAN SYLLABICS CARRIER TSEE +165F ; [.34EA.0020.0002] # CANADIAN SYLLABICS CARRIER TSI +1660 ; [.34EB.0020.0002] # CANADIAN SYLLABICS CARRIER TSA +1661 ; [.34EC.0020.0002] # CANADIAN SYLLABICS CARRIER CHU +1662 ; [.34ED.0020.0002] # CANADIAN SYLLABICS CARRIER CHO +1663 ; [.34EE.0020.0002] # CANADIAN SYLLABICS CARRIER CHE +1664 ; [.34EF.0020.0002] # CANADIAN SYLLABICS CARRIER CHEE +1665 ; [.34F0.0020.0002] # CANADIAN SYLLABICS CARRIER CHI +1666 ; [.34F1.0020.0002] # CANADIAN SYLLABICS CARRIER CHA +1667 ; [.34F2.0020.0002] # CANADIAN SYLLABICS CARRIER TTSU +1668 ; [.34F3.0020.0002] # CANADIAN SYLLABICS CARRIER TTSO +1669 ; [.34F4.0020.0002] # CANADIAN SYLLABICS CARRIER TTSE +166A ; [.34F5.0020.0002] # CANADIAN SYLLABICS CARRIER TTSEE +166B ; [.34F6.0020.0002] # CANADIAN SYLLABICS CARRIER TTSI +166C ; [.34F7.0020.0002] # CANADIAN SYLLABICS CARRIER TTSA +1677 ; [.34F8.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWEE +1678 ; [.34F9.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWI +1679 ; [.34FA.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWII +167A ; [.34FB.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWO +167B ; [.34FC.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWOO +167C ; [.34FD.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWA +167D ; [.34FE.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWAA +167E ; [.34FF.0020.0002] # CANADIAN SYLLABICS WOODS-CREE FINAL TH +167F ; [.3500.0020.0002] # CANADIAN SYLLABICS BLACKFOOT W +18B0 ; [.3501.0020.0002] # CANADIAN SYLLABICS OY +18B1 ; [.3502.0020.0002] # CANADIAN SYLLABICS AY +18B2 ; [.3503.0020.0002] # CANADIAN SYLLABICS AAY +18B3 ; [.3504.0020.0002] # CANADIAN SYLLABICS WAY +18B4 ; [.3505.0020.0002] # CANADIAN SYLLABICS POY +18B5 ; [.3506.0020.0002] # CANADIAN SYLLABICS PAY +18B6 ; [.3507.0020.0002] # CANADIAN SYLLABICS PWOY +18B7 ; [.3508.0020.0002] # CANADIAN SYLLABICS TAY +18B8 ; [.3509.0020.0002] # CANADIAN SYLLABICS KAY +18B9 ; [.350A.0020.0002] # CANADIAN SYLLABICS KWAY +18BA ; [.350B.0020.0002] # CANADIAN SYLLABICS MAY +18BB ; [.350C.0020.0002] # CANADIAN SYLLABICS NOY +18BC ; [.350D.0020.0002] # CANADIAN SYLLABICS NAY +18BD ; [.350E.0020.0002] # CANADIAN SYLLABICS LAY +18BE ; [.350F.0020.0002] # CANADIAN SYLLABICS SOY +18BF ; [.3510.0020.0002] # CANADIAN SYLLABICS SAY +18C0 ; [.3511.0020.0002] # CANADIAN SYLLABICS SHOY +18C1 ; [.3512.0020.0002] # CANADIAN SYLLABICS SHAY +18C2 ; [.3513.0020.0002] # CANADIAN SYLLABICS SHWOY +18C3 ; [.3514.0020.0002] # CANADIAN SYLLABICS YOY +18C4 ; [.3515.0020.0002] # CANADIAN SYLLABICS YAY +18C5 ; [.3516.0020.0002] # CANADIAN SYLLABICS RAY +18C6 ; [.3517.0020.0002] # CANADIAN SYLLABICS NWI +18C7 ; [.3518.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWI +18C8 ; [.3519.0020.0002] # CANADIAN SYLLABICS NWII +18C9 ; [.351A.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWII +18CA ; [.351B.0020.0002] # CANADIAN SYLLABICS NWO +18CB ; [.351C.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWO +18CC ; [.351D.0020.0002] # CANADIAN SYLLABICS NWOO +18CD ; [.351E.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWOO +18CE ; [.351F.0020.0002] # CANADIAN SYLLABICS RWEE +18CF ; [.3520.0020.0002] # CANADIAN SYLLABICS RWI +18D0 ; [.3521.0020.0002] # CANADIAN SYLLABICS RWII +18D1 ; [.3522.0020.0002] # CANADIAN SYLLABICS RWO +18D2 ; [.3523.0020.0002] # CANADIAN SYLLABICS RWOO +18D3 ; [.3524.0020.0002] # CANADIAN SYLLABICS RWA +18D4 ; [.3525.0020.0002] # CANADIAN SYLLABICS OJIBWAY P +18D5 ; [.3526.0020.0002] # CANADIAN SYLLABICS OJIBWAY T +18D6 ; [.3527.0020.0002] # CANADIAN SYLLABICS OJIBWAY K +18D7 ; [.3528.0020.0002] # CANADIAN SYLLABICS OJIBWAY C +18D8 ; [.3529.0020.0002] # CANADIAN SYLLABICS OJIBWAY M +18D9 ; [.352A.0020.0002] # CANADIAN SYLLABICS OJIBWAY N +18DA ; [.352B.0020.0002] # CANADIAN SYLLABICS OJIBWAY S +18DB ; [.352C.0020.0002] # CANADIAN SYLLABICS OJIBWAY SH +18DC ; [.352D.0020.0002] # CANADIAN SYLLABICS EASTERN W +18DD ; [.352E.0020.0002] # CANADIAN SYLLABICS WESTERN W +18DE ; [.352F.0020.0002] # CANADIAN SYLLABICS FINAL SMALL RING +18DF ; [.3530.0020.0002] # CANADIAN SYLLABICS FINAL RAISED DOT +18E0 ; [.3531.0020.0002] # CANADIAN SYLLABICS R-CREE RWE +18E1 ; [.3532.0020.0002] # CANADIAN SYLLABICS WEST-CREE LOO +18E2 ; [.3533.0020.0002] # CANADIAN SYLLABICS WEST-CREE LAA +18E3 ; [.3534.0020.0002] # CANADIAN SYLLABICS THWE +18E4 ; [.3535.0020.0002] # CANADIAN SYLLABICS THWA +18E5 ; [.3536.0020.0002] # CANADIAN SYLLABICS TTHWE +18E6 ; [.3537.0020.0002] # CANADIAN SYLLABICS TTHOO +18E7 ; [.3538.0020.0002] # CANADIAN SYLLABICS TTHAA +18E8 ; [.3539.0020.0002] # CANADIAN SYLLABICS TLHWE +18E9 ; [.353A.0020.0002] # CANADIAN SYLLABICS TLHOO +18EA ; [.353B.0020.0002] # CANADIAN SYLLABICS SAYISI SHWE +18EB ; [.353C.0020.0002] # CANADIAN SYLLABICS SAYISI SHOO +18EC ; [.353D.0020.0002] # CANADIAN SYLLABICS SAYISI HOO +18ED ; [.353E.0020.0002] # CANADIAN SYLLABICS CARRIER GWU +18EE ; [.353F.0020.0002] # CANADIAN SYLLABICS CARRIER DENE GEE +18EF ; [.3540.0020.0002] # CANADIAN SYLLABICS CARRIER GAA +18F0 ; [.3541.0020.0002] # CANADIAN SYLLABICS CARRIER GWA +18F1 ; [.3542.0020.0002] # CANADIAN SYLLABICS SAYISI JUU +18F2 ; [.3543.0020.0002] # CANADIAN SYLLABICS CARRIER JWA +18F3 ; [.3544.0020.0002] # CANADIAN SYLLABICS BEAVER DENE L +18F4 ; [.3545.0020.0002] # CANADIAN SYLLABICS BEAVER DENE R +18F5 ; [.3546.0020.0002] # CANADIAN SYLLABICS CARRIER DENTAL S +1681 ; [.3547.0020.0002] # OGHAM LETTER BEITH +1682 ; [.3548.0020.0002] # OGHAM LETTER LUIS +1683 ; [.3549.0020.0002] # OGHAM LETTER FEARN +1684 ; [.354A.0020.0002] # OGHAM LETTER SAIL +1685 ; [.354B.0020.0002] # OGHAM LETTER NION +1686 ; [.354C.0020.0002] # OGHAM LETTER UATH +1687 ; [.354D.0020.0002] # OGHAM LETTER DAIR +1688 ; [.354E.0020.0002] # OGHAM LETTER TINNE +1689 ; [.354F.0020.0002] # OGHAM LETTER COLL +168A ; [.3550.0020.0002] # OGHAM LETTER CEIRT +168B ; [.3551.0020.0002] # OGHAM LETTER MUIN +168C ; [.3552.0020.0002] # OGHAM LETTER GORT +168D ; [.3553.0020.0002] # OGHAM LETTER NGEADAL +168E ; [.3554.0020.0002] # OGHAM LETTER STRAIF +168F ; [.3555.0020.0002] # OGHAM LETTER RUIS +1690 ; [.3556.0020.0002] # OGHAM LETTER AILM +1691 ; [.3557.0020.0002] # OGHAM LETTER ONN +1692 ; [.3558.0020.0002] # OGHAM LETTER UR +1693 ; [.3559.0020.0002] # OGHAM LETTER EADHADH +1694 ; [.355A.0020.0002] # OGHAM LETTER IODHADH +1695 ; [.355B.0020.0002] # OGHAM LETTER EABHADH +1696 ; [.355C.0020.0002] # OGHAM LETTER OR +1697 ; [.355D.0020.0002] # OGHAM LETTER UILLEANN +1698 ; [.355E.0020.0002] # OGHAM LETTER IFIN +1699 ; [.355F.0020.0002] # OGHAM LETTER EAMHANCHOLL +169A ; [.3560.0020.0002] # OGHAM LETTER PEITH +16A0 ; [.3561.0020.0002] # RUNIC LETTER FEHU FEOH FE F +16A1 ; [.3561.0020.0004][.0000.010B.0004] # RUNIC LETTER V +16A2 ; [.3562.0020.0002] # RUNIC LETTER URUZ UR U +16A4 ; [.3562.0020.0004][.0000.010B.0004] # RUNIC LETTER Y +16A5 ; [.3562.0020.0004][.0000.010C.0004] # RUNIC LETTER W +16A6 ; [.3563.0020.0002] # RUNIC LETTER THURISAZ THURS THORN +16A7 ; [.3563.0020.0004][.0000.010B.0004] # RUNIC LETTER ETH +16F0 ; [.3563.0020.0004][.3563.0020.0004] # RUNIC BELGTHOR SYMBOL +16A8 ; [.3564.0020.0002] # RUNIC LETTER ANSUZ A +16A9 ; [.3564.0020.0004][.0000.010B.0004] # RUNIC LETTER OS O +16AC ; [.3564.0020.0004][.0000.010C.0004] # RUNIC LETTER LONG-BRANCH-OSS O +16AD ; [.3564.0020.0004][.0000.010D.0004] # RUNIC LETTER SHORT-TWIG-OSS O +16AE ; [.3564.0020.0004][.0000.010E.0004] # RUNIC LETTER O +16F4 ; [.3565.0020.0002] # RUNIC LETTER FRANKS CASKET OS +16AF ; [.3566.0020.0002] # RUNIC LETTER OE +16B0 ; [.3567.0020.0002] # RUNIC LETTER ON +16B1 ; [.3568.0020.0002] # RUNIC LETTER RAIDO RAD REID R +16B2 ; [.3569.0020.0002] # RUNIC LETTER KAUNA +16B3 ; [.3569.0020.0004][.0000.010B.0004] # RUNIC LETTER CEN +16B4 ; [.3569.0020.0004][.0000.010C.0004] # RUNIC LETTER KAUN K +16B5 ; [.3569.0020.0004][.0000.010D.0004] # RUNIC LETTER G +16B6 ; [.3569.0020.0004][.0000.010E.0004] # RUNIC LETTER ENG +16F1 ; [.356A.0020.0002] # RUNIC LETTER K +16B7 ; [.356B.0020.0002] # RUNIC LETTER GEBO GYFU G +16B9 ; [.356C.0020.0002] # RUNIC LETTER WUNJO WYNN W +16E9 ; [.356C.0020.0004][.0000.010B.0004] # RUNIC LETTER Q +16BA ; [.356D.0020.0002] # RUNIC LETTER HAGLAZ H +16BB ; [.356D.0020.0004][.0000.010B.0004] # RUNIC LETTER HAEGL H +16BC ; [.356D.0020.0004][.0000.010C.0004] # RUNIC LETTER LONG-BRANCH-HAGALL H +16BD ; [.356D.0020.0004][.0000.010D.0004] # RUNIC LETTER SHORT-TWIG-HAGALL H +16BE ; [.356E.0020.0002] # RUNIC LETTER NAUDIZ NYD NAUD N +16BF ; [.356E.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-NAUD N +16C0 ; [.356E.0020.0004][.0000.010C.0004] # RUNIC LETTER DOTTED-N +16C1 ; [.356F.0020.0002] # RUNIC LETTER ISAZ IS ISS I +16C2 ; [.356F.0020.0004][.0000.010B.0004] # RUNIC LETTER E +16F5 ; [.3570.0020.0002] # RUNIC LETTER FRANKS CASKET IS +16C3 ; [.3571.0020.0002] # RUNIC LETTER JERAN J +16C4 ; [.3571.0020.0004][.0000.010B.0004] # RUNIC LETTER GER +16C5 ; [.3572.0020.0002] # RUNIC LETTER LONG-BRANCH-AR AE +16C6 ; [.3572.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-AR A +16EE ; [.3572.0020.0004][.357D.0020.0004] # RUNIC ARLAUG SYMBOL +16C7 ; [.3573.0020.0002] # RUNIC LETTER IWAZ EOH +16C8 ; [.3574.0020.0002] # RUNIC LETTER PERTHO PEORTH P +16D5 ; [.3574.0020.0004][.0000.010B.0004] # RUNIC LETTER OPEN-P +16C9 ; [.3575.0020.0002] # RUNIC LETTER ALGIZ EOLHX +16CA ; [.3576.0020.0002] # RUNIC LETTER SOWILO S +16CB ; [.3576.0020.0004][.0000.010B.0004] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S +16EA ; [.3576.0020.0004][.0000.010C.0004] # RUNIC LETTER X +16CC ; [.3576.0020.0004][.0000.010D.0004] # RUNIC LETTER SHORT-TWIG-SOL S +16CD ; [.3576.0020.0004][.0000.010E.0004] # RUNIC LETTER C +16CE ; [.3576.0020.0004][.0000.010F.0004] # RUNIC LETTER Z +16F2 ; [.3577.0020.0002] # RUNIC LETTER SH +16CF ; [.3578.0020.0002] # RUNIC LETTER TIWAZ TIR TYR T +16D0 ; [.3578.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-TYR T +16D1 ; [.3578.0020.0004][.0000.010C.0004] # RUNIC LETTER D +16D2 ; [.3579.0020.0002] # RUNIC LETTER BERKANAN BEORC BJARKAN B +16D3 ; [.3579.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-BJARKAN B +16D4 ; [.3579.0020.0004][.0000.010C.0004] # RUNIC LETTER DOTTED-P +16D6 ; [.357A.0020.0002] # RUNIC LETTER EHWAZ EH E +16F6 ; [.357B.0020.0002] # RUNIC LETTER FRANKS CASKET EH +16D7 ; [.357C.0020.0002] # RUNIC LETTER MANNAZ MAN M +16D8 ; [.357C.0020.0004][.0000.010B.0004] # RUNIC LETTER LONG-BRANCH-MADR M +16D9 ; [.357C.0020.0004][.0000.010C.0004] # RUNIC LETTER SHORT-TWIG-MADR M +16EF ; [.357C.0020.0004][.0000.010B.0004][.357C.0020.0004][.0000.010B.0004] # RUNIC TVIMADUR SYMBOL +16DA ; [.357D.0020.0002] # RUNIC LETTER LAUKAZ LAGU LOGR L +16DB ; [.357D.0020.0004][.0000.010B.0004] # RUNIC LETTER DOTTED-L +16DC ; [.357E.0020.0002] # RUNIC LETTER INGWAZ +16DD ; [.357E.0020.0004][.0000.010B.0004] # RUNIC LETTER ING +16DE ; [.357F.0020.0002] # RUNIC LETTER DAGAZ DAEG D +16DF ; [.3580.0020.0002] # RUNIC LETTER OTHALAN ETHEL O +16F3 ; [.3581.0020.0002] # RUNIC LETTER OO +16AA ; [.3582.0020.0002] # RUNIC LETTER AC A +16F7 ; [.3583.0020.0002] # RUNIC LETTER FRANKS CASKET AC +16AB ; [.3584.0020.0002] # RUNIC LETTER AESC +16F8 ; [.3585.0020.0002] # RUNIC LETTER FRANKS CASKET AESC +16A3 ; [.3586.0020.0002] # RUNIC LETTER YR +16E0 ; [.3587.0020.0002] # RUNIC LETTER EAR +16E3 ; [.3588.0020.0002] # RUNIC LETTER CALC +16B8 ; [.3589.0020.0002] # RUNIC LETTER GAR +16E4 ; [.358A.0020.0002] # RUNIC LETTER CEALC +16E1 ; [.358B.0020.0002] # RUNIC LETTER IOR +16E2 ; [.358C.0020.0002] # RUNIC LETTER CWEORTH +16E5 ; [.358D.0020.0002] # RUNIC LETTER STAN +16E6 ; [.358E.0020.0002] # RUNIC LETTER LONG-BRANCH-YR +16E7 ; [.358E.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-YR +16E8 ; [.358E.0020.0004][.0000.010C.0004] # RUNIC LETTER ICELANDIC-YR +10CC0 ; [.358F.0020.0002] # OLD HUNGARIAN SMALL LETTER A +10C80 ; [.358F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER A +10CC1 ; [.358F.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER AA +10C81 ; [.358F.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER AA +10CC2 ; [.3590.0020.0002] # OLD HUNGARIAN SMALL LETTER EB +10C82 ; [.3590.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EB +10CC3 ; [.3591.0020.0002] # OLD HUNGARIAN SMALL LETTER AMB +10C83 ; [.3591.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AMB +10CC4 ; [.3592.0020.0002] # OLD HUNGARIAN SMALL LETTER EC +10C84 ; [.3592.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EC +10CC5 ; [.3593.0020.0002] # OLD HUNGARIAN SMALL LETTER ENC +10C85 ; [.3593.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENC +10CC6 ; [.3594.0020.0002] # OLD HUNGARIAN SMALL LETTER ECS +10C86 ; [.3594.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECS +10CC7 ; [.3595.0020.0002] # OLD HUNGARIAN SMALL LETTER ED +10C87 ; [.3595.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ED +10CC8 ; [.3596.0020.0002] # OLD HUNGARIAN SMALL LETTER AND +10C88 ; [.3596.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AND +10CC9 ; [.3597.0020.0002] # OLD HUNGARIAN SMALL LETTER E +10C89 ; [.3597.0020.0008] # OLD HUNGARIAN CAPITAL LETTER E +10CCA ; [.3597.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER CLOSE E +10C8A ; [.3597.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER CLOSE E +10CCB ; [.3597.0020.0004][.0000.010C.0004] # OLD HUNGARIAN SMALL LETTER EE +10C8B ; [.3597.0020.000A][.0000.010C.0004] # OLD HUNGARIAN CAPITAL LETTER EE +10CCC ; [.3598.0020.0002] # OLD HUNGARIAN SMALL LETTER EF +10C8C ; [.3598.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EF +10CCD ; [.3599.0020.0002] # OLD HUNGARIAN SMALL LETTER EG +10C8D ; [.3599.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EG +10CCE ; [.359A.0020.0002] # OLD HUNGARIAN SMALL LETTER EGY +10C8E ; [.359A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EGY +10CCF ; [.359B.0020.0002] # OLD HUNGARIAN SMALL LETTER EH +10C8F ; [.359B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EH +10CD0 ; [.359C.0020.0002] # OLD HUNGARIAN SMALL LETTER I +10C90 ; [.359C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER I +10CD1 ; [.359C.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER II +10C91 ; [.359C.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER II +10CD2 ; [.359D.0020.0002] # OLD HUNGARIAN SMALL LETTER EJ +10C92 ; [.359D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EJ +10CD3 ; [.359E.0020.0002] # OLD HUNGARIAN SMALL LETTER EK +10C93 ; [.359E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EK +10CD4 ; [.359F.0020.0002] # OLD HUNGARIAN SMALL LETTER AK +10C94 ; [.359F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AK +10CD5 ; [.35A0.0020.0002] # OLD HUNGARIAN SMALL LETTER UNK +10C95 ; [.35A0.0020.0008] # OLD HUNGARIAN CAPITAL LETTER UNK +10CD6 ; [.35A1.0020.0002] # OLD HUNGARIAN SMALL LETTER EL +10C96 ; [.35A1.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EL +10CD7 ; [.35A2.0020.0002] # OLD HUNGARIAN SMALL LETTER ELY +10C97 ; [.35A2.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ELY +10CD8 ; [.35A3.0020.0002] # OLD HUNGARIAN SMALL LETTER EM +10C98 ; [.35A3.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EM +10CD9 ; [.35A4.0020.0002] # OLD HUNGARIAN SMALL LETTER EN +10C99 ; [.35A4.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EN +10CDA ; [.35A5.0020.0002] # OLD HUNGARIAN SMALL LETTER ENY +10C9A ; [.35A5.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENY +10CDB ; [.35A6.0020.0002] # OLD HUNGARIAN SMALL LETTER O +10C9B ; [.35A6.0020.0008] # OLD HUNGARIAN CAPITAL LETTER O +10CDC ; [.35A6.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER OO +10C9C ; [.35A6.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER OO +10CDD ; [.35A7.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE +10C9D ; [.35A7.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +10CDE ; [.35A7.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA OE +10C9E ; [.35A7.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +10CDF ; [.35A7.0020.0004][.0000.010C.0004] # OLD HUNGARIAN SMALL LETTER OEE +10C9F ; [.35A7.0020.000A][.0000.010C.0004] # OLD HUNGARIAN CAPITAL LETTER OEE +10CE0 ; [.35A8.0020.0002] # OLD HUNGARIAN SMALL LETTER EP +10CA0 ; [.35A8.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EP +10CE1 ; [.35A9.0020.0002] # OLD HUNGARIAN SMALL LETTER EMP +10CA1 ; [.35A9.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EMP +10CE2 ; [.35AA.0020.0002] # OLD HUNGARIAN SMALL LETTER ER +10CA2 ; [.35AA.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ER +10CE3 ; [.35AA.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER SHORT ER +10CA3 ; [.35AA.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER SHORT ER +10CE4 ; [.35AB.0020.0002] # OLD HUNGARIAN SMALL LETTER ES +10CA4 ; [.35AB.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ES +10CE5 ; [.35AC.0020.0002] # OLD HUNGARIAN SMALL LETTER ESZ +10CA5 ; [.35AC.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ESZ +10CE6 ; [.35AD.0020.0002] # OLD HUNGARIAN SMALL LETTER ET +10CA6 ; [.35AD.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ET +10CE7 ; [.35AE.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT +10CA7 ; [.35AE.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT +10CE8 ; [.35AF.0020.0002] # OLD HUNGARIAN SMALL LETTER ETY +10CA8 ; [.35AF.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ETY +10CE9 ; [.35B0.0020.0002] # OLD HUNGARIAN SMALL LETTER ECH +10CA9 ; [.35B0.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECH +10CEA ; [.35B1.0020.0002] # OLD HUNGARIAN SMALL LETTER U +10CAA ; [.35B1.0020.0008] # OLD HUNGARIAN CAPITAL LETTER U +10CEB ; [.35B1.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER UU +10CAB ; [.35B1.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER UU +10CEC ; [.35B2.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE +10CAC ; [.35B2.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +10CED ; [.35B2.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA UE +10CAD ; [.35B2.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +10CEE ; [.35B3.0020.0002] # OLD HUNGARIAN SMALL LETTER EV +10CAE ; [.35B3.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EV +10CEF ; [.35B4.0020.0002] # OLD HUNGARIAN SMALL LETTER EZ +10CAF ; [.35B4.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZ +10CF0 ; [.35B5.0020.0002] # OLD HUNGARIAN SMALL LETTER EZS +10CB0 ; [.35B5.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZS +10CF1 ; [.35B6.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN +10CB1 ; [.35B6.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +10CF2 ; [.35B7.0020.0002] # OLD HUNGARIAN SMALL LETTER US +10CB2 ; [.35B7.0020.0008] # OLD HUNGARIAN CAPITAL LETTER US +10C00 ; [.35B8.0020.0002] # OLD TURKIC LETTER ORKHON A +10C01 ; [.35B8.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI A +10C02 ; [.35B9.0020.0002] # OLD TURKIC LETTER YENISEI AE +10C03 ; [.35BA.0020.0002] # OLD TURKIC LETTER ORKHON I +10C04 ; [.35BA.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI I +10C05 ; [.35BB.0020.0002] # OLD TURKIC LETTER YENISEI E +10C06 ; [.35BC.0020.0002] # OLD TURKIC LETTER ORKHON O +10C07 ; [.35BD.0020.0002] # OLD TURKIC LETTER ORKHON OE +10C08 ; [.35BD.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI OE +10C09 ; [.35BE.0020.0002] # OLD TURKIC LETTER ORKHON AB +10C0A ; [.35BE.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AB +10C0B ; [.35BF.0020.0002] # OLD TURKIC LETTER ORKHON AEB +10C0C ; [.35BF.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEB +10C0D ; [.35C0.0020.0002] # OLD TURKIC LETTER ORKHON AG +10C0E ; [.35C0.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AG +10C0F ; [.35C1.0020.0002] # OLD TURKIC LETTER ORKHON AEG +10C10 ; [.35C1.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEG +10C11 ; [.35C2.0020.0002] # OLD TURKIC LETTER ORKHON AD +10C12 ; [.35C2.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AD +10C13 ; [.35C3.0020.0002] # OLD TURKIC LETTER ORKHON AED +10C14 ; [.35C4.0020.0002] # OLD TURKIC LETTER ORKHON EZ +10C15 ; [.35C4.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI EZ +10C16 ; [.35C5.0020.0002] # OLD TURKIC LETTER ORKHON AY +10C17 ; [.35C5.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AY +10C18 ; [.35C6.0020.0002] # OLD TURKIC LETTER ORKHON AEY +10C19 ; [.35C6.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEY +10C1A ; [.35C7.0020.0002] # OLD TURKIC LETTER ORKHON AEK +10C1B ; [.35C7.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEK +10C1C ; [.35C8.0020.0002] # OLD TURKIC LETTER ORKHON OEK +10C1D ; [.35C8.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI OEK +10C1E ; [.35C9.0020.0002] # OLD TURKIC LETTER ORKHON AL +10C1F ; [.35C9.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AL +10C20 ; [.35CA.0020.0002] # OLD TURKIC LETTER ORKHON AEL +10C21 ; [.35CB.0020.0002] # OLD TURKIC LETTER ORKHON ELT +10C22 ; [.35CC.0020.0002] # OLD TURKIC LETTER ORKHON EM +10C23 ; [.35CD.0020.0002] # OLD TURKIC LETTER ORKHON AN +10C24 ; [.35CE.0020.0002] # OLD TURKIC LETTER ORKHON AEN +10C25 ; [.35CE.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEN +10C26 ; [.35CF.0020.0002] # OLD TURKIC LETTER ORKHON ENT +10C27 ; [.35CF.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ENT +10C28 ; [.35D0.0020.0002] # OLD TURKIC LETTER ORKHON ENC +10C29 ; [.35D0.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ENC +10C2A ; [.35D1.0020.0002] # OLD TURKIC LETTER ORKHON ENY +10C2B ; [.35D1.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ENY +10C2C ; [.35D2.0020.0002] # OLD TURKIC LETTER YENISEI ANG +10C2D ; [.35D3.0020.0002] # OLD TURKIC LETTER ORKHON ENG +10C2E ; [.35D3.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AENG +10C2F ; [.35D4.0020.0002] # OLD TURKIC LETTER ORKHON EP +10C30 ; [.35D5.0020.0002] # OLD TURKIC LETTER ORKHON OP +10C31 ; [.35D6.0020.0002] # OLD TURKIC LETTER ORKHON IC +10C32 ; [.35D7.0020.0002] # OLD TURKIC LETTER ORKHON EC +10C33 ; [.35D7.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI EC +10C34 ; [.35D8.0020.0002] # OLD TURKIC LETTER ORKHON AQ +10C35 ; [.35D8.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AQ +10C36 ; [.35D9.0020.0002] # OLD TURKIC LETTER ORKHON IQ +10C37 ; [.35D9.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI IQ +10C38 ; [.35DA.0020.0002] # OLD TURKIC LETTER ORKHON OQ +10C39 ; [.35DA.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI OQ +10C3A ; [.35DB.0020.0002] # OLD TURKIC LETTER ORKHON AR +10C3B ; [.35DB.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AR +10C3C ; [.35DC.0020.0002] # OLD TURKIC LETTER ORKHON AER +10C3D ; [.35DD.0020.0002] # OLD TURKIC LETTER ORKHON AS +10C3E ; [.35DE.0020.0002] # OLD TURKIC LETTER ORKHON AES +10C3F ; [.35DF.0020.0002] # OLD TURKIC LETTER ORKHON ASH +10C40 ; [.35DF.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ASH +10C41 ; [.35E0.0020.0002] # OLD TURKIC LETTER ORKHON ESH +10C42 ; [.35E0.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ESH +10C43 ; [.35E1.0020.0002] # OLD TURKIC LETTER ORKHON AT +10C44 ; [.35E1.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AT +10C45 ; [.35E2.0020.0002] # OLD TURKIC LETTER ORKHON AET +10C46 ; [.35E2.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AET +10C47 ; [.35E3.0020.0002] # OLD TURKIC LETTER ORKHON OT +10C48 ; [.35E4.0020.0002] # OLD TURKIC LETTER ORKHON BASH +A500 ; [.35E5.0020.0002] # VAI SYLLABLE EE +A501 ; [.35E6.0020.0002] # VAI SYLLABLE EEN +A502 ; [.35E7.0020.0002] # VAI SYLLABLE HEE +A503 ; [.35E8.0020.0002] # VAI SYLLABLE WEE +A504 ; [.35E9.0020.0002] # VAI SYLLABLE WEEN +A505 ; [.35EA.0020.0002] # VAI SYLLABLE PEE +A506 ; [.35EB.0020.0002] # VAI SYLLABLE BHEE +A507 ; [.35EC.0020.0002] # VAI SYLLABLE BEE +A508 ; [.35ED.0020.0002] # VAI SYLLABLE MBEE +A509 ; [.35EE.0020.0002] # VAI SYLLABLE KPEE +A50A ; [.35EF.0020.0002] # VAI SYLLABLE MGBEE +A50B ; [.35F0.0020.0002] # VAI SYLLABLE GBEE +A50C ; [.35F1.0020.0002] # VAI SYLLABLE FEE +A613 ; [.35F1.0020.0004][.36F0.0020.0004] # VAI SYMBOL FEENG +A50D ; [.35F2.0020.0002] # VAI SYLLABLE VEE +A50E ; [.35F3.0020.0002] # VAI SYLLABLE TEE +A50F ; [.35F4.0020.0002] # VAI SYLLABLE THEE +A510 ; [.35F5.0020.0002] # VAI SYLLABLE DHEE +A511 ; [.35F6.0020.0002] # VAI SYLLABLE DHHEE +A512 ; [.35F7.0020.0002] # VAI SYLLABLE LEE +A513 ; [.35F8.0020.0002] # VAI SYLLABLE REE +A514 ; [.35F9.0020.0002] # VAI SYLLABLE DEE +A515 ; [.35FA.0020.0002] # VAI SYLLABLE NDEE +A516 ; [.35FB.0020.0002] # VAI SYLLABLE SEE +A517 ; [.35FC.0020.0002] # VAI SYLLABLE SHEE +A518 ; [.35FD.0020.0002] # VAI SYLLABLE ZEE +A519 ; [.35FE.0020.0002] # VAI SYLLABLE ZHEE +A51A ; [.35FF.0020.0002] # VAI SYLLABLE CEE +A51B ; [.3600.0020.0002] # VAI SYLLABLE JEE +A51C ; [.3601.0020.0002] # VAI SYLLABLE NJEE +A51D ; [.3602.0020.0002] # VAI SYLLABLE YEE +A51E ; [.3603.0020.0002] # VAI SYLLABLE KEE +A614 ; [.3603.0020.0004][.36F0.0020.0004] # VAI SYMBOL KEENG +A51F ; [.3604.0020.0002] # VAI SYLLABLE NGGEE +A520 ; [.3605.0020.0002] # VAI SYLLABLE GEE +A521 ; [.3606.0020.0002] # VAI SYLLABLE MEE +A522 ; [.3607.0020.0002] # VAI SYLLABLE NEE +A523 ; [.3608.0020.0002] # VAI SYLLABLE NYEE +A524 ; [.3609.0020.0002] # VAI SYLLABLE I +A525 ; [.360A.0020.0002] # VAI SYLLABLE IN +A526 ; [.360B.0020.0002] # VAI SYLLABLE HI +A527 ; [.360C.0020.0002] # VAI SYLLABLE HIN +A528 ; [.360D.0020.0002] # VAI SYLLABLE WI +A529 ; [.360E.0020.0002] # VAI SYLLABLE WIN +A52A ; [.360F.0020.0002] # VAI SYLLABLE PI +A52B ; [.3610.0020.0002] # VAI SYLLABLE BHI +A52C ; [.3611.0020.0002] # VAI SYLLABLE BI +A52D ; [.3612.0020.0002] # VAI SYLLABLE MBI +A52E ; [.3613.0020.0002] # VAI SYLLABLE KPI +A52F ; [.3614.0020.0002] # VAI SYLLABLE MGBI +A530 ; [.3615.0020.0002] # VAI SYLLABLE GBI +A531 ; [.3616.0020.0002] # VAI SYLLABLE FI +A532 ; [.3617.0020.0002] # VAI SYLLABLE VI +A533 ; [.3618.0020.0002] # VAI SYLLABLE TI +A615 ; [.3618.0020.0004][.36F0.0020.0004] # VAI SYMBOL TING +A534 ; [.3619.0020.0002] # VAI SYLLABLE THI +A535 ; [.361A.0020.0002] # VAI SYLLABLE DHI +A536 ; [.361B.0020.0002] # VAI SYLLABLE DHHI +A537 ; [.361C.0020.0002] # VAI SYLLABLE LI +A538 ; [.361D.0020.0002] # VAI SYLLABLE RI +A539 ; [.361E.0020.0002] # VAI SYLLABLE DI +A53A ; [.361F.0020.0002] # VAI SYLLABLE NDI +A53B ; [.3620.0020.0002] # VAI SYLLABLE SI +A53C ; [.3621.0020.0002] # VAI SYLLABLE SHI +A53D ; [.3622.0020.0002] # VAI SYLLABLE ZI +A53E ; [.3623.0020.0002] # VAI SYLLABLE ZHI +A53F ; [.3624.0020.0002] # VAI SYLLABLE CI +A540 ; [.3625.0020.0002] # VAI SYLLABLE JI +A541 ; [.3626.0020.0002] # VAI SYLLABLE NJI +A542 ; [.3627.0020.0002] # VAI SYLLABLE YI +A543 ; [.3628.0020.0002] # VAI SYLLABLE KI +A544 ; [.3629.0020.0002] # VAI SYLLABLE NGGI +A545 ; [.362A.0020.0002] # VAI SYLLABLE GI +A546 ; [.362B.0020.0002] # VAI SYLLABLE MI +A547 ; [.362C.0020.0002] # VAI SYLLABLE NI +A616 ; [.362C.0020.0004][.36F1.0020.0004] # VAI SYMBOL NII +A548 ; [.362D.0020.0002] # VAI SYLLABLE NYI +A549 ; [.362E.0020.0002] # VAI SYLLABLE A +A54A ; [.362F.0020.0002] # VAI SYLLABLE AN +A54B ; [.3630.0020.0002] # VAI SYLLABLE NGAN +A54C ; [.3631.0020.0002] # VAI SYLLABLE HA +A54D ; [.3632.0020.0002] # VAI SYLLABLE HAN +A54E ; [.3633.0020.0002] # VAI SYLLABLE WA +A54F ; [.3634.0020.0002] # VAI SYLLABLE WAN +A550 ; [.3635.0020.0002] # VAI SYLLABLE PA +A551 ; [.3636.0020.0002] # VAI SYLLABLE BHA +A552 ; [.3637.0020.0002] # VAI SYLLABLE BA +A617 ; [.3637.0020.0004][.36F0.0020.0004] # VAI SYMBOL BANG +A553 ; [.3638.0020.0002] # VAI SYLLABLE MBA +A554 ; [.3639.0020.0002] # VAI SYLLABLE KPA +A555 ; [.363A.0020.0002] # VAI SYLLABLE KPAN +A556 ; [.363B.0020.0002] # VAI SYLLABLE MGBA +A557 ; [.363C.0020.0002] # VAI SYLLABLE GBA +A558 ; [.363D.0020.0002] # VAI SYLLABLE FA +A610 ; [.363D.0020.0004] # VAI SYLLABLE NDOLE FA +A618 ; [.363D.0020.0004][.36F1.0020.0004] # VAI SYMBOL FAA +A559 ; [.363E.0020.0002] # VAI SYLLABLE VA +A55A ; [.363F.0020.0002] # VAI SYLLABLE TA +A619 ; [.363F.0020.0004][.36F1.0020.0004] # VAI SYMBOL TAA +A55B ; [.3640.0020.0002] # VAI SYLLABLE THA +A55C ; [.3641.0020.0002] # VAI SYLLABLE DHA +A55D ; [.3642.0020.0002] # VAI SYLLABLE DHHA +A55E ; [.3643.0020.0002] # VAI SYLLABLE LA +A55F ; [.3644.0020.0002] # VAI SYLLABLE RA +A560 ; [.3645.0020.0002] # VAI SYLLABLE DA +A61A ; [.3645.0020.0004][.36F0.0020.0004] # VAI SYMBOL DANG +A561 ; [.3646.0020.0002] # VAI SYLLABLE NDA +A562 ; [.3647.0020.0002] # VAI SYLLABLE SA +A563 ; [.3648.0020.0002] # VAI SYLLABLE SHA +A564 ; [.3649.0020.0002] # VAI SYLLABLE ZA +A565 ; [.364A.0020.0002] # VAI SYLLABLE ZHA +A566 ; [.364B.0020.0002] # VAI SYLLABLE CA +A567 ; [.364C.0020.0002] # VAI SYLLABLE JA +A568 ; [.364D.0020.0002] # VAI SYLLABLE NJA +A569 ; [.364E.0020.0002] # VAI SYLLABLE YA +A56A ; [.364F.0020.0002] # VAI SYLLABLE KA +A611 ; [.364F.0020.0004] # VAI SYLLABLE NDOLE KA +A56B ; [.3650.0020.0002] # VAI SYLLABLE KAN +A56C ; [.3651.0020.0002] # VAI SYLLABLE NGGA +A56D ; [.3652.0020.0002] # VAI SYLLABLE GA +A56E ; [.3653.0020.0002] # VAI SYLLABLE MA +A62A ; [.3653.0020.0004] # VAI SYLLABLE NDOLE MA +A56F ; [.3654.0020.0002] # VAI SYLLABLE NA +A570 ; [.3655.0020.0002] # VAI SYLLABLE NYA +A571 ; [.3656.0020.0002] # VAI SYLLABLE OO +A572 ; [.3657.0020.0002] # VAI SYLLABLE OON +A573 ; [.3658.0020.0002] # VAI SYLLABLE HOO +A574 ; [.3659.0020.0002] # VAI SYLLABLE WOO +A575 ; [.365A.0020.0002] # VAI SYLLABLE WOON +A576 ; [.365B.0020.0002] # VAI SYLLABLE POO +A577 ; [.365C.0020.0002] # VAI SYLLABLE BHOO +A578 ; [.365D.0020.0002] # VAI SYLLABLE BOO +A579 ; [.365E.0020.0002] # VAI SYLLABLE MBOO +A57A ; [.365F.0020.0002] # VAI SYLLABLE KPOO +A57B ; [.3660.0020.0002] # VAI SYLLABLE MGBOO +A57C ; [.3661.0020.0002] # VAI SYLLABLE GBOO +A57D ; [.3662.0020.0002] # VAI SYLLABLE FOO +A57E ; [.3663.0020.0002] # VAI SYLLABLE VOO +A57F ; [.3664.0020.0002] # VAI SYLLABLE TOO +A580 ; [.3665.0020.0002] # VAI SYLLABLE THOO +A581 ; [.3666.0020.0002] # VAI SYLLABLE DHOO +A582 ; [.3667.0020.0002] # VAI SYLLABLE DHHOO +A583 ; [.3668.0020.0002] # VAI SYLLABLE LOO +A584 ; [.3669.0020.0002] # VAI SYLLABLE ROO +A585 ; [.366A.0020.0002] # VAI SYLLABLE DOO +A61B ; [.366A.0020.0004][.36F0.0020.0004] # VAI SYMBOL DOONG +A586 ; [.366B.0020.0002] # VAI SYLLABLE NDOO +A587 ; [.366C.0020.0002] # VAI SYLLABLE SOO +A612 ; [.366C.0020.0004] # VAI SYLLABLE NDOLE SOO +A588 ; [.366D.0020.0002] # VAI SYLLABLE SHOO +A589 ; [.366E.0020.0002] # VAI SYLLABLE ZOO +A58A ; [.366F.0020.0002] # VAI SYLLABLE ZHOO +A58B ; [.3670.0020.0002] # VAI SYLLABLE COO +A58C ; [.3671.0020.0002] # VAI SYLLABLE JOO +A58D ; [.3672.0020.0002] # VAI SYLLABLE NJOO +A58E ; [.3673.0020.0002] # VAI SYLLABLE YOO +A58F ; [.3674.0020.0002] # VAI SYLLABLE KOO +A590 ; [.3675.0020.0002] # VAI SYLLABLE NGGOO +A591 ; [.3676.0020.0002] # VAI SYLLABLE GOO +A592 ; [.3677.0020.0002] # VAI SYLLABLE MOO +A593 ; [.3678.0020.0002] # VAI SYLLABLE NOO +A594 ; [.3679.0020.0002] # VAI SYLLABLE NYOO +A595 ; [.367A.0020.0002] # VAI SYLLABLE U +A596 ; [.367B.0020.0002] # VAI SYLLABLE UN +A597 ; [.367C.0020.0002] # VAI SYLLABLE HU +A598 ; [.367D.0020.0002] # VAI SYLLABLE HUN +A599 ; [.367E.0020.0002] # VAI SYLLABLE WU +A59A ; [.367F.0020.0002] # VAI SYLLABLE WUN +A59B ; [.3680.0020.0002] # VAI SYLLABLE PU +A59C ; [.3681.0020.0002] # VAI SYLLABLE BHU +A59D ; [.3682.0020.0002] # VAI SYLLABLE BU +A59E ; [.3683.0020.0002] # VAI SYLLABLE MBU +A59F ; [.3684.0020.0002] # VAI SYLLABLE KPU +A5A0 ; [.3685.0020.0002] # VAI SYLLABLE MGBU +A5A1 ; [.3686.0020.0002] # VAI SYLLABLE GBU +A5A2 ; [.3687.0020.0002] # VAI SYLLABLE FU +A5A3 ; [.3688.0020.0002] # VAI SYLLABLE VU +A5A4 ; [.3689.0020.0002] # VAI SYLLABLE TU +A5A5 ; [.368A.0020.0002] # VAI SYLLABLE THU +A5A6 ; [.368B.0020.0002] # VAI SYLLABLE DHU +A5A7 ; [.368C.0020.0002] # VAI SYLLABLE DHHU +A5A8 ; [.368D.0020.0002] # VAI SYLLABLE LU +A5A9 ; [.368E.0020.0002] # VAI SYLLABLE RU +A5AA ; [.368F.0020.0002] # VAI SYLLABLE DU +A5AB ; [.3690.0020.0002] # VAI SYLLABLE NDU +A5AC ; [.3691.0020.0002] # VAI SYLLABLE SU +A5AD ; [.3692.0020.0002] # VAI SYLLABLE SHU +A5AE ; [.3693.0020.0002] # VAI SYLLABLE ZU +A5AF ; [.3694.0020.0002] # VAI SYLLABLE ZHU +A5B0 ; [.3695.0020.0002] # VAI SYLLABLE CU +A5B1 ; [.3696.0020.0002] # VAI SYLLABLE JU +A5B2 ; [.3697.0020.0002] # VAI SYLLABLE NJU +A5B3 ; [.3698.0020.0002] # VAI SYLLABLE YU +A5B4 ; [.3699.0020.0002] # VAI SYLLABLE KU +A61C ; [.3699.0020.0004][.36F0.0020.0004] # VAI SYMBOL KUNG +A5B5 ; [.369A.0020.0002] # VAI SYLLABLE NGGU +A5B6 ; [.369B.0020.0002] # VAI SYLLABLE GU +A5B7 ; [.369C.0020.0002] # VAI SYLLABLE MU +A5B8 ; [.369D.0020.0002] # VAI SYLLABLE NU +A5B9 ; [.369E.0020.0002] # VAI SYLLABLE NYU +A5BA ; [.369F.0020.0002] # VAI SYLLABLE O +A5BB ; [.36A0.0020.0002] # VAI SYLLABLE ON +A5BC ; [.36A1.0020.0002] # VAI SYLLABLE NGON +A5BD ; [.36A2.0020.0002] # VAI SYLLABLE HO +A5BE ; [.36A3.0020.0002] # VAI SYLLABLE HON +A5BF ; [.36A4.0020.0002] # VAI SYLLABLE WO +A5C0 ; [.36A5.0020.0002] # VAI SYLLABLE WON +A5C1 ; [.36A6.0020.0002] # VAI SYLLABLE PO +A5C2 ; [.36A7.0020.0002] # VAI SYLLABLE BHO +A5C3 ; [.36A8.0020.0002] # VAI SYLLABLE BO +A5C4 ; [.36A9.0020.0002] # VAI SYLLABLE MBO +A5C5 ; [.36AA.0020.0002] # VAI SYLLABLE KPO +A5C6 ; [.36AB.0020.0002] # VAI SYLLABLE MGBO +A5C7 ; [.36AC.0020.0002] # VAI SYLLABLE GBO +A5C8 ; [.36AD.0020.0002] # VAI SYLLABLE GBON +A5C9 ; [.36AE.0020.0002] # VAI SYLLABLE FO +A5CA ; [.36AF.0020.0002] # VAI SYLLABLE VO +A5CB ; [.36B0.0020.0002] # VAI SYLLABLE TO +A61D ; [.36B0.0020.0004][.36F0.0020.0004] # VAI SYMBOL TONG +A5CC ; [.36B1.0020.0002] # VAI SYLLABLE THO +A5CD ; [.36B2.0020.0002] # VAI SYLLABLE DHO +A5CE ; [.36B3.0020.0002] # VAI SYLLABLE DHHO +A5CF ; [.36B4.0020.0002] # VAI SYLLABLE LO +A5D0 ; [.36B5.0020.0002] # VAI SYLLABLE RO +A5D1 ; [.36B6.0020.0002] # VAI SYLLABLE DO +A62B ; [.36B6.0020.0004] # VAI SYLLABLE NDOLE DO +A61E ; [.36B6.0020.0004][.36F1.0020.0004] # VAI SYMBOL DO-O +A5D2 ; [.36B7.0020.0002] # VAI SYLLABLE NDO +A5D3 ; [.36B8.0020.0002] # VAI SYLLABLE SO +A5D4 ; [.36B9.0020.0002] # VAI SYLLABLE SHO +A5D5 ; [.36BA.0020.0002] # VAI SYLLABLE ZO +A5D6 ; [.36BB.0020.0002] # VAI SYLLABLE ZHO +A5D7 ; [.36BC.0020.0002] # VAI SYLLABLE CO +A5D8 ; [.36BD.0020.0002] # VAI SYLLABLE JO +A61F ; [.36BD.0020.0004][.36F0.0020.0004] # VAI SYMBOL JONG +A5D9 ; [.36BE.0020.0002] # VAI SYLLABLE NJO +A5DA ; [.36BF.0020.0002] # VAI SYLLABLE YO +A5DB ; [.36C0.0020.0002] # VAI SYLLABLE KO +A5DC ; [.36C1.0020.0002] # VAI SYLLABLE NGGO +A5DD ; [.36C2.0020.0002] # VAI SYLLABLE GO +A5DE ; [.36C3.0020.0002] # VAI SYLLABLE MO +A5DF ; [.36C4.0020.0002] # VAI SYLLABLE NO +A5E0 ; [.36C5.0020.0002] # VAI SYLLABLE NYO +A5E1 ; [.36C6.0020.0002] # VAI SYLLABLE E +A5E2 ; [.36C7.0020.0002] # VAI SYLLABLE EN +A5E3 ; [.36C8.0020.0002] # VAI SYLLABLE NGEN +A5E4 ; [.36C9.0020.0002] # VAI SYLLABLE HE +A5E5 ; [.36CA.0020.0002] # VAI SYLLABLE HEN +A5E6 ; [.36CB.0020.0002] # VAI SYLLABLE WE +A5E7 ; [.36CC.0020.0002] # VAI SYLLABLE WEN +A5E8 ; [.36CD.0020.0002] # VAI SYLLABLE PE +A5E9 ; [.36CE.0020.0002] # VAI SYLLABLE BHE +A5EA ; [.36CF.0020.0002] # VAI SYLLABLE BE +A5EB ; [.36D0.0020.0002] # VAI SYLLABLE MBE +A5EC ; [.36D1.0020.0002] # VAI SYLLABLE KPE +A5ED ; [.36D2.0020.0002] # VAI SYLLABLE KPEN +A5EE ; [.36D3.0020.0002] # VAI SYLLABLE MGBE +A5EF ; [.36D4.0020.0002] # VAI SYLLABLE GBE +A5F0 ; [.36D5.0020.0002] # VAI SYLLABLE GBEN +A5F1 ; [.36D6.0020.0002] # VAI SYLLABLE FE +A5F2 ; [.36D7.0020.0002] # VAI SYLLABLE VE +A5F3 ; [.36D8.0020.0002] # VAI SYLLABLE TE +A5F4 ; [.36D9.0020.0002] # VAI SYLLABLE THE +A5F5 ; [.36DA.0020.0002] # VAI SYLLABLE DHE +A5F6 ; [.36DB.0020.0002] # VAI SYLLABLE DHHE +A5F7 ; [.36DC.0020.0002] # VAI SYLLABLE LE +A5F8 ; [.36DD.0020.0002] # VAI SYLLABLE RE +A5F9 ; [.36DE.0020.0002] # VAI SYLLABLE DE +A5FA ; [.36DF.0020.0002] # VAI SYLLABLE NDE +A5FB ; [.36E0.0020.0002] # VAI SYLLABLE SE +A5FC ; [.36E1.0020.0002] # VAI SYLLABLE SHE +A5FD ; [.36E2.0020.0002] # VAI SYLLABLE ZE +A5FE ; [.36E3.0020.0002] # VAI SYLLABLE ZHE +A5FF ; [.36E4.0020.0002] # VAI SYLLABLE CE +A600 ; [.36E5.0020.0002] # VAI SYLLABLE JE +A601 ; [.36E6.0020.0002] # VAI SYLLABLE NJE +A602 ; [.36E7.0020.0002] # VAI SYLLABLE YE +A603 ; [.36E8.0020.0002] # VAI SYLLABLE KE +A604 ; [.36E9.0020.0002] # VAI SYLLABLE NGGE +A605 ; [.36EA.0020.0002] # VAI SYLLABLE NGGEN +A606 ; [.36EB.0020.0002] # VAI SYLLABLE GE +A607 ; [.36EC.0020.0002] # VAI SYLLABLE GEN +A608 ; [.36ED.0020.0002] # VAI SYLLABLE ME +A609 ; [.36EE.0020.0002] # VAI SYLLABLE NE +A60A ; [.36EF.0020.0002] # VAI SYLLABLE NYE +A60B ; [.36F0.0020.0002] # VAI SYLLABLE NG +A60C ; [.36F1.0020.0002] # VAI SYLLABLE LENGTHENER +A6A0 ; [.36F2.0020.0002] # BAMUM LETTER A +A6A1 ; [.36F3.0020.0002] # BAMUM LETTER KA +A6A2 ; [.36F4.0020.0002] # BAMUM LETTER U +A6A3 ; [.36F5.0020.0002] # BAMUM LETTER KU +A6A4 ; [.36F6.0020.0002] # BAMUM LETTER EE +A6A5 ; [.36F7.0020.0002] # BAMUM LETTER REE +A6A6 ; [.36F8.0020.0002] # BAMUM LETTER TAE +A6A7 ; [.36F9.0020.0002] # BAMUM LETTER O +A6A8 ; [.36FA.0020.0002] # BAMUM LETTER NYI +A6A9 ; [.36FB.0020.0002] # BAMUM LETTER I +A6AA ; [.36FC.0020.0002] # BAMUM LETTER LA +A6AB ; [.36FD.0020.0002] # BAMUM LETTER PA +A6AC ; [.36FE.0020.0002] # BAMUM LETTER RII +A6AD ; [.36FF.0020.0002] # BAMUM LETTER RIEE +A6AE ; [.3700.0020.0002] # BAMUM LETTER LEEEE +A6AF ; [.3701.0020.0002] # BAMUM LETTER MEEEE +A6B0 ; [.3702.0020.0002] # BAMUM LETTER TAA +A6B1 ; [.3703.0020.0002] # BAMUM LETTER NDAA +A6B2 ; [.3704.0020.0002] # BAMUM LETTER NJAEM +A6B3 ; [.3705.0020.0002] # BAMUM LETTER M +A6B4 ; [.3706.0020.0002] # BAMUM LETTER SUU +A6B5 ; [.3707.0020.0002] # BAMUM LETTER MU +A6B6 ; [.3708.0020.0002] # BAMUM LETTER SHII +A6B7 ; [.3709.0020.0002] # BAMUM LETTER SI +A6B8 ; [.370A.0020.0002] # BAMUM LETTER SHEUX +A6B9 ; [.370B.0020.0002] # BAMUM LETTER SEUX +A6BA ; [.370C.0020.0002] # BAMUM LETTER KYEE +A6BB ; [.370D.0020.0002] # BAMUM LETTER KET +A6BC ; [.370E.0020.0002] # BAMUM LETTER NUAE +A6BD ; [.370F.0020.0002] # BAMUM LETTER NU +A6BE ; [.3710.0020.0002] # BAMUM LETTER NJUAE +A6BF ; [.3711.0020.0002] # BAMUM LETTER YOQ +A6C0 ; [.3712.0020.0002] # BAMUM LETTER SHU +A6C1 ; [.3713.0020.0002] # BAMUM LETTER YUQ +A6C2 ; [.3714.0020.0002] # BAMUM LETTER YA +A6C3 ; [.3715.0020.0002] # BAMUM LETTER NSHA +A6C4 ; [.3716.0020.0002] # BAMUM LETTER KEUX +A6C5 ; [.3717.0020.0002] # BAMUM LETTER PEUX +A6C6 ; [.3718.0020.0002] # BAMUM LETTER NJEE +A6C7 ; [.3719.0020.0002] # BAMUM LETTER NTEE +A6C8 ; [.371A.0020.0002] # BAMUM LETTER PUE +A6C9 ; [.371B.0020.0002] # BAMUM LETTER WUE +A6CA ; [.371C.0020.0002] # BAMUM LETTER PEE +A6CB ; [.371D.0020.0002] # BAMUM LETTER FEE +A6CC ; [.371E.0020.0002] # BAMUM LETTER RU +A6CD ; [.371F.0020.0002] # BAMUM LETTER LU +A6CE ; [.3720.0020.0002] # BAMUM LETTER MI +A6CF ; [.3721.0020.0002] # BAMUM LETTER NI +A6D0 ; [.3722.0020.0002] # BAMUM LETTER REUX +A6D1 ; [.3723.0020.0002] # BAMUM LETTER RAE +A6D2 ; [.3724.0020.0002] # BAMUM LETTER KEN +A6D3 ; [.3725.0020.0002] # BAMUM LETTER NGKWAEN +A6D4 ; [.3726.0020.0002] # BAMUM LETTER NGGA +A6D5 ; [.3727.0020.0002] # BAMUM LETTER NGA +A6D6 ; [.3728.0020.0002] # BAMUM LETTER SHO +A6D7 ; [.3729.0020.0002] # BAMUM LETTER PUAE +A6D8 ; [.372A.0020.0002] # BAMUM LETTER FU +A6D9 ; [.372B.0020.0002] # BAMUM LETTER FOM +A6DA ; [.372C.0020.0002] # BAMUM LETTER WA +A6DB ; [.372D.0020.0002] # BAMUM LETTER NA +A6DC ; [.372E.0020.0002] # BAMUM LETTER LI +A6DD ; [.372F.0020.0002] # BAMUM LETTER PI +A6DE ; [.3730.0020.0002] # BAMUM LETTER LOQ +A6DF ; [.3731.0020.0002] # BAMUM LETTER KO +A6E0 ; [.3732.0020.0002] # BAMUM LETTER MBEN +A6E1 ; [.3733.0020.0002] # BAMUM LETTER REN +A6E2 ; [.3734.0020.0002] # BAMUM LETTER MEN +A6E3 ; [.3735.0020.0002] # BAMUM LETTER MA +A6E4 ; [.3736.0020.0002] # BAMUM LETTER TI +A6E5 ; [.3737.0020.0002] # BAMUM LETTER KI +A6E6 ; [.3738.0020.0002] # BAMUM LETTER MO +A6E7 ; [.3739.0020.0002] # BAMUM LETTER MBAA +A6E8 ; [.373A.0020.0002] # BAMUM LETTER TET +A6E9 ; [.373B.0020.0002] # BAMUM LETTER KPA +A6EA ; [.373C.0020.0002] # BAMUM LETTER TEN +A6EB ; [.373D.0020.0002] # BAMUM LETTER NTUU +A6EC ; [.373E.0020.0002] # BAMUM LETTER SAMBA +A6ED ; [.373F.0020.0002] # BAMUM LETTER FAAMAE +A6EE ; [.3740.0020.0002] # BAMUM LETTER KOVUU +A6EF ; [.3741.0020.0002] # BAMUM LETTER KOGHOM +16800 ; [.3742.0020.0002] # BAMUM LETTER PHASE-A NGKUE MFON +16801 ; [.3743.0020.0002] # BAMUM LETTER PHASE-A GBIEE FON +16802 ; [.3744.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE +16803 ; [.3745.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMBA +16804 ; [.3746.0020.0002] # BAMUM LETTER PHASE-A NAA MFON +16805 ; [.3747.0020.0002] # BAMUM LETTER PHASE-A SHUENSHUET +16806 ; [.3748.0020.0002] # BAMUM LETTER PHASE-A TITA MFON +16807 ; [.3749.0020.0002] # BAMUM LETTER PHASE-A NZA MFON +16808 ; [.374A.0020.0002] # BAMUM LETTER PHASE-A SHINDA PA NJI +16809 ; [.374B.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE +1680A ; [.374C.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA +1680B ; [.374D.0020.0002] # BAMUM LETTER PHASE-A MAEMBGBIEE +1680C ; [.374E.0020.0002] # BAMUM LETTER PHASE-A TU MAEMBA +1680D ; [.374F.0020.0002] # BAMUM LETTER PHASE-A NGANGU +1680E ; [.3750.0020.0002] # BAMUM LETTER PHASE-A MAEMVEUX +1680F ; [.3751.0020.0002] # BAMUM LETTER PHASE-A MANSUAE +16810 ; [.3752.0020.0002] # BAMUM LETTER PHASE-A MVEUAENGAM +16811 ; [.3753.0020.0002] # BAMUM LETTER PHASE-A SEUNYAM +16812 ; [.3754.0020.0002] # BAMUM LETTER PHASE-A NTOQPEN +16813 ; [.3755.0020.0002] # BAMUM LETTER PHASE-A KEUKEUTNDA +16814 ; [.3756.0020.0002] # BAMUM LETTER PHASE-A NKINDI +16815 ; [.3757.0020.0002] # BAMUM LETTER PHASE-A SUU +16816 ; [.3758.0020.0002] # BAMUM LETTER PHASE-A NGKUENZEUM +16817 ; [.3759.0020.0002] # BAMUM LETTER PHASE-A LAPAQ +16818 ; [.375A.0020.0002] # BAMUM LETTER PHASE-A LET KUT +16819 ; [.375B.0020.0002] # BAMUM LETTER PHASE-A NTAP MFAA +1681A ; [.375C.0020.0002] # BAMUM LETTER PHASE-A MAEKEUP +1681B ; [.375D.0020.0002] # BAMUM LETTER PHASE-A PASHAE +1681C ; [.375E.0020.0002] # BAMUM LETTER PHASE-A GHEUAERAE +1681D ; [.375F.0020.0002] # BAMUM LETTER PHASE-A PAMSHAE +1681E ; [.3760.0020.0002] # BAMUM LETTER PHASE-A MON NGGEUAET +1681F ; [.3761.0020.0002] # BAMUM LETTER PHASE-A NZUN MEUT +16820 ; [.3762.0020.0002] # BAMUM LETTER PHASE-A U YUQ NAE +16821 ; [.3763.0020.0002] # BAMUM LETTER PHASE-A GHEUAEGHEUAE +16822 ; [.3764.0020.0002] # BAMUM LETTER PHASE-A NTAP NTAA +16823 ; [.3765.0020.0002] # BAMUM LETTER PHASE-A SISA +16824 ; [.3766.0020.0002] # BAMUM LETTER PHASE-A MGBASA +16825 ; [.3767.0020.0002] # BAMUM LETTER PHASE-A MEUNJOMNDEUQ +16826 ; [.3768.0020.0002] # BAMUM LETTER PHASE-A MOOMPUQ +16827 ; [.3769.0020.0002] # BAMUM LETTER PHASE-A KAFA +16828 ; [.376A.0020.0002] # BAMUM LETTER PHASE-A PA LEERAEWA +16829 ; [.376B.0020.0002] # BAMUM LETTER PHASE-A NDA LEERAEWA +1682A ; [.376C.0020.0002] # BAMUM LETTER PHASE-A PET +1682B ; [.376D.0020.0002] # BAMUM LETTER PHASE-A MAEMKPEN +1682C ; [.376E.0020.0002] # BAMUM LETTER PHASE-A NIKA +1682D ; [.376F.0020.0002] # BAMUM LETTER PHASE-A PUP +1682E ; [.3770.0020.0002] # BAMUM LETTER PHASE-A TUAEP +1682F ; [.3771.0020.0002] # BAMUM LETTER PHASE-A LUAEP +16830 ; [.3772.0020.0002] # BAMUM LETTER PHASE-A SONJAM +16831 ; [.3773.0020.0002] # BAMUM LETTER PHASE-A TEUTEUWEN +16832 ; [.3774.0020.0002] # BAMUM LETTER PHASE-A MAENYI +16833 ; [.3775.0020.0002] # BAMUM LETTER PHASE-A KET +16834 ; [.3776.0020.0002] # BAMUM LETTER PHASE-A NDAANGGEUAET +16835 ; [.3777.0020.0002] # BAMUM LETTER PHASE-A KUOQ +16836 ; [.3778.0020.0002] # BAMUM LETTER PHASE-A MOOMEUT +16837 ; [.3779.0020.0002] # BAMUM LETTER PHASE-A SHUM +16838 ; [.377A.0020.0002] # BAMUM LETTER PHASE-A LOMMAE +16839 ; [.377B.0020.0002] # BAMUM LETTER PHASE-A FIRI +1683A ; [.377C.0020.0002] # BAMUM LETTER PHASE-A ROM +1683B ; [.377D.0020.0002] # BAMUM LETTER PHASE-A KPOQ +1683C ; [.377E.0020.0002] # BAMUM LETTER PHASE-A SOQ +1683D ; [.377F.0020.0002] # BAMUM LETTER PHASE-A MAP PIEET +1683E ; [.3780.0020.0002] # BAMUM LETTER PHASE-A SHIRAE +1683F ; [.3781.0020.0002] # BAMUM LETTER PHASE-A NTAP +16840 ; [.3782.0020.0002] # BAMUM LETTER PHASE-A SHOQ NSHUT YUM +16841 ; [.3783.0020.0002] # BAMUM LETTER PHASE-A NYIT MONGKEUAEQ +16842 ; [.3784.0020.0002] # BAMUM LETTER PHASE-A PAARAE +16843 ; [.3785.0020.0002] # BAMUM LETTER PHASE-A NKAARAE +16844 ; [.3786.0020.0002] # BAMUM LETTER PHASE-A UNKNOWN +16845 ; [.3787.0020.0002] # BAMUM LETTER PHASE-A NGGEN +16846 ; [.3788.0020.0002] # BAMUM LETTER PHASE-A MAESI +16847 ; [.3789.0020.0002] # BAMUM LETTER PHASE-A NJAM +16848 ; [.378A.0020.0002] # BAMUM LETTER PHASE-A MBANYI +16849 ; [.378B.0020.0002] # BAMUM LETTER PHASE-A NYET +1684A ; [.378C.0020.0002] # BAMUM LETTER PHASE-A TEUAEN +1684B ; [.378D.0020.0002] # BAMUM LETTER PHASE-A SOT +1684C ; [.378E.0020.0002] # BAMUM LETTER PHASE-A PAAM +1684D ; [.378F.0020.0002] # BAMUM LETTER PHASE-A NSHIEE +1684E ; [.3790.0020.0002] # BAMUM LETTER PHASE-A MAEM +1684F ; [.3791.0020.0002] # BAMUM LETTER PHASE-A NYI +16850 ; [.3792.0020.0002] # BAMUM LETTER PHASE-A KAQ +16851 ; [.3793.0020.0002] # BAMUM LETTER PHASE-A NSHA +16852 ; [.3794.0020.0002] # BAMUM LETTER PHASE-A VEE +16853 ; [.3795.0020.0002] # BAMUM LETTER PHASE-A LU +16854 ; [.3796.0020.0002] # BAMUM LETTER PHASE-A NEN +16855 ; [.3797.0020.0002] # BAMUM LETTER PHASE-A NAQ +16856 ; [.3798.0020.0002] # BAMUM LETTER PHASE-A MBAQ +16857 ; [.3799.0020.0002] # BAMUM LETTER PHASE-B NSHUET +16858 ; [.379A.0020.0002] # BAMUM LETTER PHASE-B TU MAEMGBIEE +16859 ; [.379B.0020.0002] # BAMUM LETTER PHASE-B SIEE +1685A ; [.379C.0020.0002] # BAMUM LETTER PHASE-B SET TU +1685B ; [.379D.0020.0002] # BAMUM LETTER PHASE-B LOM NTEUM +1685C ; [.379E.0020.0002] # BAMUM LETTER PHASE-B MBA MAELEE +1685D ; [.379F.0020.0002] # BAMUM LETTER PHASE-B KIEEM +1685E ; [.37A0.0020.0002] # BAMUM LETTER PHASE-B YEURAE +1685F ; [.37A1.0020.0002] # BAMUM LETTER PHASE-B MBAARAE +16860 ; [.37A2.0020.0002] # BAMUM LETTER PHASE-B KAM +16861 ; [.37A3.0020.0002] # BAMUM LETTER PHASE-B PEESHI +16862 ; [.37A4.0020.0002] # BAMUM LETTER PHASE-B YAFU LEERAEWA +16863 ; [.37A5.0020.0002] # BAMUM LETTER PHASE-B LAM NSHUT NYAM +16864 ; [.37A6.0020.0002] # BAMUM LETTER PHASE-B NTIEE SHEUOQ +16865 ; [.37A7.0020.0002] # BAMUM LETTER PHASE-B NDU NJAA +16866 ; [.37A8.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEUAEM +16867 ; [.37A9.0020.0002] # BAMUM LETTER PHASE-B PIT +16868 ; [.37AA.0020.0002] # BAMUM LETTER PHASE-B TU NSIEE +16869 ; [.37AB.0020.0002] # BAMUM LETTER PHASE-B SHET NJAQ +1686A ; [.37AC.0020.0002] # BAMUM LETTER PHASE-B SHEUAEQTU +1686B ; [.37AD.0020.0002] # BAMUM LETTER PHASE-B MFON TEUAEQ +1686C ; [.37AE.0020.0002] # BAMUM LETTER PHASE-B MBIT MBAAKET +1686D ; [.37AF.0020.0002] # BAMUM LETTER PHASE-B NYI NTEUM +1686E ; [.37B0.0020.0002] # BAMUM LETTER PHASE-B KEUPUQ +1686F ; [.37B1.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEN +16870 ; [.37B2.0020.0002] # BAMUM LETTER PHASE-B KEUYEUX +16871 ; [.37B3.0020.0002] # BAMUM LETTER PHASE-B LAANAE +16872 ; [.37B4.0020.0002] # BAMUM LETTER PHASE-B PARUM +16873 ; [.37B5.0020.0002] # BAMUM LETTER PHASE-B VEUM +16874 ; [.37B6.0020.0002] # BAMUM LETTER PHASE-B NGKINDI MVOP +16875 ; [.37B7.0020.0002] # BAMUM LETTER PHASE-B NGGEU MBU +16876 ; [.37B8.0020.0002] # BAMUM LETTER PHASE-B WUAET +16877 ; [.37B9.0020.0002] # BAMUM LETTER PHASE-B SAKEUAE +16878 ; [.37BA.0020.0002] # BAMUM LETTER PHASE-B TAAM +16879 ; [.37BB.0020.0002] # BAMUM LETTER PHASE-B MEUQ +1687A ; [.37BC.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ +1687B ; [.37BD.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ LARGE +1687C ; [.37BE.0020.0002] # BAMUM LETTER PHASE-B MFIYAQ +1687D ; [.37BF.0020.0002] # BAMUM LETTER PHASE-B SUE +1687E ; [.37C0.0020.0002] # BAMUM LETTER PHASE-B MBEURI +1687F ; [.37C1.0020.0002] # BAMUM LETTER PHASE-B MONTIEEN +16880 ; [.37C2.0020.0002] # BAMUM LETTER PHASE-B NYAEMAE +16881 ; [.37C3.0020.0002] # BAMUM LETTER PHASE-B PUNGAAM +16882 ; [.37C4.0020.0002] # BAMUM LETTER PHASE-B MEUT NGGEET +16883 ; [.37C5.0020.0002] # BAMUM LETTER PHASE-B FEUX +16884 ; [.37C6.0020.0002] # BAMUM LETTER PHASE-B MBUOQ +16885 ; [.37C7.0020.0002] # BAMUM LETTER PHASE-B FEE +16886 ; [.37C8.0020.0002] # BAMUM LETTER PHASE-B KEUAEM +16887 ; [.37C9.0020.0002] # BAMUM LETTER PHASE-B MA NJEUAENA +16888 ; [.37CA.0020.0002] # BAMUM LETTER PHASE-B MA NJUQA +16889 ; [.37CB.0020.0002] # BAMUM LETTER PHASE-B LET +1688A ; [.37CC.0020.0002] # BAMUM LETTER PHASE-B NGGAAM +1688B ; [.37CD.0020.0002] # BAMUM LETTER PHASE-B NSEN +1688C ; [.37CE.0020.0002] # BAMUM LETTER PHASE-B MA +1688D ; [.37CF.0020.0002] # BAMUM LETTER PHASE-B KIQ +1688E ; [.37D0.0020.0002] # BAMUM LETTER PHASE-B NGOM +1688F ; [.37D1.0020.0002] # BAMUM LETTER PHASE-C NGKUE MAEMBA +16890 ; [.37D2.0020.0002] # BAMUM LETTER PHASE-C NZA +16891 ; [.37D3.0020.0002] # BAMUM LETTER PHASE-C YUM +16892 ; [.37D4.0020.0002] # BAMUM LETTER PHASE-C WANGKUOQ +16893 ; [.37D5.0020.0002] # BAMUM LETTER PHASE-C NGGEN +16894 ; [.37D6.0020.0002] # BAMUM LETTER PHASE-C NDEUAEREE +16895 ; [.37D7.0020.0002] # BAMUM LETTER PHASE-C NGKAQ +16896 ; [.37D8.0020.0002] # BAMUM LETTER PHASE-C GHARAE +16897 ; [.37D9.0020.0002] # BAMUM LETTER PHASE-C MBEEKEET +16898 ; [.37DA.0020.0002] # BAMUM LETTER PHASE-C GBAYI +16899 ; [.37DB.0020.0002] # BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN +1689A ; [.37DC.0020.0002] # BAMUM LETTER PHASE-C NTU MBIT +1689B ; [.37DD.0020.0002] # BAMUM LETTER PHASE-C MBEUM +1689C ; [.37DE.0020.0002] # BAMUM LETTER PHASE-C PIRIEEN +1689D ; [.37DF.0020.0002] # BAMUM LETTER PHASE-C NDOMBU +1689E ; [.37E0.0020.0002] # BAMUM LETTER PHASE-C MBAA CABBAGE-TREE +1689F ; [.37E1.0020.0002] # BAMUM LETTER PHASE-C KEUSHEUAEP +168A0 ; [.37E2.0020.0002] # BAMUM LETTER PHASE-C GHAP +168A1 ; [.37E3.0020.0002] # BAMUM LETTER PHASE-C KEUKAQ +168A2 ; [.37E4.0020.0002] # BAMUM LETTER PHASE-C YU MUOMAE +168A3 ; [.37E5.0020.0002] # BAMUM LETTER PHASE-C NZEUM +168A4 ; [.37E6.0020.0002] # BAMUM LETTER PHASE-C MBUE +168A5 ; [.37E7.0020.0002] # BAMUM LETTER PHASE-C NSEUAEN +168A6 ; [.37E8.0020.0002] # BAMUM LETTER PHASE-C MBIT +168A7 ; [.37E9.0020.0002] # BAMUM LETTER PHASE-C YEUQ +168A8 ; [.37EA.0020.0002] # BAMUM LETTER PHASE-C KPARAQ +168A9 ; [.37EB.0020.0002] # BAMUM LETTER PHASE-C KAA +168AA ; [.37EC.0020.0002] # BAMUM LETTER PHASE-C SEUX +168AB ; [.37ED.0020.0002] # BAMUM LETTER PHASE-C NDIDA +168AC ; [.37EE.0020.0002] # BAMUM LETTER PHASE-C TAASHAE +168AD ; [.37EF.0020.0002] # BAMUM LETTER PHASE-C NJUEQ +168AE ; [.37F0.0020.0002] # BAMUM LETTER PHASE-C TITA YUE +168AF ; [.37F1.0020.0002] # BAMUM LETTER PHASE-C SUAET +168B0 ; [.37F2.0020.0002] # BAMUM LETTER PHASE-C NGGUAEN NYAM +168B1 ; [.37F3.0020.0002] # BAMUM LETTER PHASE-C VEUX +168B2 ; [.37F4.0020.0002] # BAMUM LETTER PHASE-C NANSANAQ +168B3 ; [.37F5.0020.0002] # BAMUM LETTER PHASE-C MA KEUAERI +168B4 ; [.37F6.0020.0002] # BAMUM LETTER PHASE-C NTAA +168B5 ; [.37F7.0020.0002] # BAMUM LETTER PHASE-C NGGUON +168B6 ; [.37F8.0020.0002] # BAMUM LETTER PHASE-C LAP +168B7 ; [.37F9.0020.0002] # BAMUM LETTER PHASE-C MBIRIEEN +168B8 ; [.37FA.0020.0002] # BAMUM LETTER PHASE-C MGBASAQ +168B9 ; [.37FB.0020.0002] # BAMUM LETTER PHASE-C NTEUNGBA +168BA ; [.37FC.0020.0002] # BAMUM LETTER PHASE-C TEUTEUX +168BB ; [.37FD.0020.0002] # BAMUM LETTER PHASE-C NGGUM +168BC ; [.37FE.0020.0002] # BAMUM LETTER PHASE-C FUE +168BD ; [.37FF.0020.0002] # BAMUM LETTER PHASE-C NDEUT +168BE ; [.3800.0020.0002] # BAMUM LETTER PHASE-C NSA +168BF ; [.3801.0020.0002] # BAMUM LETTER PHASE-C NSHAQ +168C0 ; [.3802.0020.0002] # BAMUM LETTER PHASE-C BUNG +168C1 ; [.3803.0020.0002] # BAMUM LETTER PHASE-C VEUAEPEN +168C2 ; [.3804.0020.0002] # BAMUM LETTER PHASE-C MBERAE +168C3 ; [.3805.0020.0002] # BAMUM LETTER PHASE-C RU +168C4 ; [.3806.0020.0002] # BAMUM LETTER PHASE-C NJAEM +168C5 ; [.3807.0020.0002] # BAMUM LETTER PHASE-C LAM +168C6 ; [.3808.0020.0002] # BAMUM LETTER PHASE-C TITUAEP +168C7 ; [.3809.0020.0002] # BAMUM LETTER PHASE-C NSUOT NGOM +168C8 ; [.380A.0020.0002] # BAMUM LETTER PHASE-C NJEEEE +168C9 ; [.380B.0020.0002] # BAMUM LETTER PHASE-C KET +168CA ; [.380C.0020.0002] # BAMUM LETTER PHASE-C NGGU +168CB ; [.380D.0020.0002] # BAMUM LETTER PHASE-C MAESI +168CC ; [.380E.0020.0002] # BAMUM LETTER PHASE-C MBUAEM +168CD ; [.380F.0020.0002] # BAMUM LETTER PHASE-C LU +168CE ; [.3810.0020.0002] # BAMUM LETTER PHASE-C KUT +168CF ; [.3811.0020.0002] # BAMUM LETTER PHASE-C NJAM +168D0 ; [.3812.0020.0002] # BAMUM LETTER PHASE-C NGOM +168D1 ; [.3813.0020.0002] # BAMUM LETTER PHASE-C WUP +168D2 ; [.3814.0020.0002] # BAMUM LETTER PHASE-C NGGUEET +168D3 ; [.3815.0020.0002] # BAMUM LETTER PHASE-C NSOM +168D4 ; [.3816.0020.0002] # BAMUM LETTER PHASE-C NTEN +168D5 ; [.3817.0020.0002] # BAMUM LETTER PHASE-C KUOP NKAARAE +168D6 ; [.3818.0020.0002] # BAMUM LETTER PHASE-C NSUN +168D7 ; [.3819.0020.0002] # BAMUM LETTER PHASE-C NDAM +168D8 ; [.381A.0020.0002] # BAMUM LETTER PHASE-C MA NSIEE +168D9 ; [.381B.0020.0002] # BAMUM LETTER PHASE-C YAA +168DA ; [.381C.0020.0002] # BAMUM LETTER PHASE-C NDAP +168DB ; [.381D.0020.0002] # BAMUM LETTER PHASE-C SHUEQ +168DC ; [.381E.0020.0002] # BAMUM LETTER PHASE-C SETFON +168DD ; [.381F.0020.0002] # BAMUM LETTER PHASE-C MBI +168DE ; [.3820.0020.0002] # BAMUM LETTER PHASE-C MAEMBA +168DF ; [.3821.0020.0002] # BAMUM LETTER PHASE-C MBANYI +168E0 ; [.3822.0020.0002] # BAMUM LETTER PHASE-C KEUSEUX +168E1 ; [.3823.0020.0002] # BAMUM LETTER PHASE-C MBEUX +168E2 ; [.3824.0020.0002] # BAMUM LETTER PHASE-C KEUM +168E3 ; [.3825.0020.0002] # BAMUM LETTER PHASE-C MBAA PICKET +168E4 ; [.3826.0020.0002] # BAMUM LETTER PHASE-C YUWOQ +168E5 ; [.3827.0020.0002] # BAMUM LETTER PHASE-C NJEUX +168E6 ; [.3828.0020.0002] # BAMUM LETTER PHASE-C MIEE +168E7 ; [.3829.0020.0002] # BAMUM LETTER PHASE-C MUAE +168E8 ; [.382A.0020.0002] # BAMUM LETTER PHASE-C SHIQ +168E9 ; [.382B.0020.0002] # BAMUM LETTER PHASE-C KEN LAW +168EA ; [.382C.0020.0002] # BAMUM LETTER PHASE-C KEN FATIGUE +168EB ; [.382D.0020.0002] # BAMUM LETTER PHASE-C NGAQ +168EC ; [.382E.0020.0002] # BAMUM LETTER PHASE-C NAQ +168ED ; [.382F.0020.0002] # BAMUM LETTER PHASE-C LIQ +168EE ; [.3830.0020.0002] # BAMUM LETTER PHASE-C PIN +168EF ; [.3831.0020.0002] # BAMUM LETTER PHASE-C PEN +168F0 ; [.3832.0020.0002] # BAMUM LETTER PHASE-C TET +168F1 ; [.3833.0020.0002] # BAMUM LETTER PHASE-D MBUO +168F2 ; [.3834.0020.0002] # BAMUM LETTER PHASE-D WAP +168F3 ; [.3835.0020.0002] # BAMUM LETTER PHASE-D NJI +168F4 ; [.3836.0020.0002] # BAMUM LETTER PHASE-D MFON +168F5 ; [.3837.0020.0002] # BAMUM LETTER PHASE-D NJIEE +168F6 ; [.3838.0020.0002] # BAMUM LETTER PHASE-D LIEE +168F7 ; [.3839.0020.0002] # BAMUM LETTER PHASE-D NJEUT +168F8 ; [.383A.0020.0002] # BAMUM LETTER PHASE-D NSHEE +168F9 ; [.383B.0020.0002] # BAMUM LETTER PHASE-D NGGAAMAE +168FA ; [.383C.0020.0002] # BAMUM LETTER PHASE-D NYAM +168FB ; [.383D.0020.0002] # BAMUM LETTER PHASE-D WUAEN +168FC ; [.383E.0020.0002] # BAMUM LETTER PHASE-D NGKUN +168FD ; [.383F.0020.0002] # BAMUM LETTER PHASE-D SHEE +168FE ; [.3840.0020.0002] # BAMUM LETTER PHASE-D NGKAP +168FF ; [.3841.0020.0002] # BAMUM LETTER PHASE-D KEUAETMEUN +16900 ; [.3842.0020.0002] # BAMUM LETTER PHASE-D TEUT +16901 ; [.3843.0020.0002] # BAMUM LETTER PHASE-D SHEUAE +16902 ; [.3844.0020.0002] # BAMUM LETTER PHASE-D NJAP +16903 ; [.3845.0020.0002] # BAMUM LETTER PHASE-D SUE +16904 ; [.3846.0020.0002] # BAMUM LETTER PHASE-D KET +16905 ; [.3847.0020.0002] # BAMUM LETTER PHASE-D YAEMMAE +16906 ; [.3848.0020.0002] # BAMUM LETTER PHASE-D KUOM +16907 ; [.3849.0020.0002] # BAMUM LETTER PHASE-D SAP +16908 ; [.384A.0020.0002] # BAMUM LETTER PHASE-D MFEUT +16909 ; [.384B.0020.0002] # BAMUM LETTER PHASE-D NDEUX +1690A ; [.384C.0020.0002] # BAMUM LETTER PHASE-D MALEERI +1690B ; [.384D.0020.0002] # BAMUM LETTER PHASE-D MEUT +1690C ; [.384E.0020.0002] # BAMUM LETTER PHASE-D SEUAEQ +1690D ; [.384F.0020.0002] # BAMUM LETTER PHASE-D YEN +1690E ; [.3850.0020.0002] # BAMUM LETTER PHASE-D NJEUAEM +1690F ; [.3851.0020.0002] # BAMUM LETTER PHASE-D KEUOT MBUAE +16910 ; [.3852.0020.0002] # BAMUM LETTER PHASE-D NGKEURI +16911 ; [.3853.0020.0002] # BAMUM LETTER PHASE-D TU +16912 ; [.3854.0020.0002] # BAMUM LETTER PHASE-D GHAA +16913 ; [.3855.0020.0002] # BAMUM LETTER PHASE-D NGKYEE +16914 ; [.3856.0020.0002] # BAMUM LETTER PHASE-D FEUFEUAET +16915 ; [.3857.0020.0002] # BAMUM LETTER PHASE-D NDEE +16916 ; [.3858.0020.0002] # BAMUM LETTER PHASE-D MGBOFUM +16917 ; [.3859.0020.0002] # BAMUM LETTER PHASE-D LEUAEP +16918 ; [.385A.0020.0002] # BAMUM LETTER PHASE-D NDON +16919 ; [.385B.0020.0002] # BAMUM LETTER PHASE-D MONI +1691A ; [.385C.0020.0002] # BAMUM LETTER PHASE-D MGBEUN +1691B ; [.385D.0020.0002] # BAMUM LETTER PHASE-D PUUT +1691C ; [.385E.0020.0002] # BAMUM LETTER PHASE-D MGBIEE +1691D ; [.385F.0020.0002] # BAMUM LETTER PHASE-D MFO +1691E ; [.3860.0020.0002] # BAMUM LETTER PHASE-D LUM +1691F ; [.3861.0020.0002] # BAMUM LETTER PHASE-D NSIEEP +16920 ; [.3862.0020.0002] # BAMUM LETTER PHASE-D MBAA +16921 ; [.3863.0020.0002] # BAMUM LETTER PHASE-D KWAET +16922 ; [.3864.0020.0002] # BAMUM LETTER PHASE-D NYET +16923 ; [.3865.0020.0002] # BAMUM LETTER PHASE-D TEUAEN +16924 ; [.3866.0020.0002] # BAMUM LETTER PHASE-D SOT +16925 ; [.3867.0020.0002] # BAMUM LETTER PHASE-D YUWOQ +16926 ; [.3868.0020.0002] # BAMUM LETTER PHASE-D KEUM +16927 ; [.3869.0020.0002] # BAMUM LETTER PHASE-D RAEM +16928 ; [.386A.0020.0002] # BAMUM LETTER PHASE-D TEEEE +16929 ; [.386B.0020.0002] # BAMUM LETTER PHASE-D NGKEUAEQ +1692A ; [.386C.0020.0002] # BAMUM LETTER PHASE-D MFEUAE +1692B ; [.386D.0020.0002] # BAMUM LETTER PHASE-D NSIEET +1692C ; [.386E.0020.0002] # BAMUM LETTER PHASE-D KEUP +1692D ; [.386F.0020.0002] # BAMUM LETTER PHASE-D PIP +1692E ; [.3870.0020.0002] # BAMUM LETTER PHASE-D PEUTAE +1692F ; [.3871.0020.0002] # BAMUM LETTER PHASE-D NYUE +16930 ; [.3872.0020.0002] # BAMUM LETTER PHASE-D LET +16931 ; [.3873.0020.0002] # BAMUM LETTER PHASE-D NGGAAM +16932 ; [.3874.0020.0002] # BAMUM LETTER PHASE-D MFIEE +16933 ; [.3875.0020.0002] # BAMUM LETTER PHASE-D NGGWAEN +16934 ; [.3876.0020.0002] # BAMUM LETTER PHASE-D YUOM +16935 ; [.3877.0020.0002] # BAMUM LETTER PHASE-D PAP +16936 ; [.3878.0020.0002] # BAMUM LETTER PHASE-D YUOP +16937 ; [.3879.0020.0002] # BAMUM LETTER PHASE-D NDAM +16938 ; [.387A.0020.0002] # BAMUM LETTER PHASE-D NTEUM +16939 ; [.387B.0020.0002] # BAMUM LETTER PHASE-D SUAE +1693A ; [.387C.0020.0002] # BAMUM LETTER PHASE-D KUN +1693B ; [.387D.0020.0002] # BAMUM LETTER PHASE-D NGGEUX +1693C ; [.387E.0020.0002] # BAMUM LETTER PHASE-D NGKIEE +1693D ; [.387F.0020.0002] # BAMUM LETTER PHASE-D TUOT +1693E ; [.3880.0020.0002] # BAMUM LETTER PHASE-D MEUN +1693F ; [.3881.0020.0002] # BAMUM LETTER PHASE-D KUQ +16940 ; [.3882.0020.0002] # BAMUM LETTER PHASE-D NSUM +16941 ; [.3883.0020.0002] # BAMUM LETTER PHASE-D TEUN +16942 ; [.3884.0020.0002] # BAMUM LETTER PHASE-D MAENJET +16943 ; [.3885.0020.0002] # BAMUM LETTER PHASE-D NGGAP +16944 ; [.3886.0020.0002] # BAMUM LETTER PHASE-D LEUM +16945 ; [.3887.0020.0002] # BAMUM LETTER PHASE-D NGGUOM +16946 ; [.3888.0020.0002] # BAMUM LETTER PHASE-D NSHUT +16947 ; [.3889.0020.0002] # BAMUM LETTER PHASE-D NJUEQ +16948 ; [.388A.0020.0002] # BAMUM LETTER PHASE-D GHEUAE +16949 ; [.388B.0020.0002] # BAMUM LETTER PHASE-D KU +1694A ; [.388C.0020.0002] # BAMUM LETTER PHASE-D REN OLD +1694B ; [.388D.0020.0002] # BAMUM LETTER PHASE-D TAE +1694C ; [.388E.0020.0002] # BAMUM LETTER PHASE-D TOQ +1694D ; [.388F.0020.0002] # BAMUM LETTER PHASE-D NYI +1694E ; [.3890.0020.0002] # BAMUM LETTER PHASE-D RII +1694F ; [.3891.0020.0002] # BAMUM LETTER PHASE-D LEEEE +16950 ; [.3892.0020.0002] # BAMUM LETTER PHASE-D MEEEE +16951 ; [.3893.0020.0002] # BAMUM LETTER PHASE-D M +16952 ; [.3894.0020.0002] # BAMUM LETTER PHASE-D SUU +16953 ; [.3895.0020.0002] # BAMUM LETTER PHASE-D MU +16954 ; [.3896.0020.0002] # BAMUM LETTER PHASE-D SHII +16955 ; [.3897.0020.0002] # BAMUM LETTER PHASE-D SHEUX +16956 ; [.3898.0020.0002] # BAMUM LETTER PHASE-D KYEE +16957 ; [.3899.0020.0002] # BAMUM LETTER PHASE-D NU +16958 ; [.389A.0020.0002] # BAMUM LETTER PHASE-D SHU +16959 ; [.389B.0020.0002] # BAMUM LETTER PHASE-D NTEE +1695A ; [.389C.0020.0002] # BAMUM LETTER PHASE-D PEE +1695B ; [.389D.0020.0002] # BAMUM LETTER PHASE-D NI +1695C ; [.389E.0020.0002] # BAMUM LETTER PHASE-D SHOQ +1695D ; [.389F.0020.0002] # BAMUM LETTER PHASE-D PUQ +1695E ; [.38A0.0020.0002] # BAMUM LETTER PHASE-D MVOP +1695F ; [.38A1.0020.0002] # BAMUM LETTER PHASE-D LOQ +16960 ; [.38A2.0020.0002] # BAMUM LETTER PHASE-D REN MUCH +16961 ; [.38A3.0020.0002] # BAMUM LETTER PHASE-D TI +16962 ; [.38A4.0020.0002] # BAMUM LETTER PHASE-D NTUU +16963 ; [.38A5.0020.0002] # BAMUM LETTER PHASE-D MBAA SEVEN +16964 ; [.38A6.0020.0002] # BAMUM LETTER PHASE-D SAQ +16965 ; [.38A7.0020.0002] # BAMUM LETTER PHASE-D FAA +16966 ; [.38A8.0020.0002] # BAMUM LETTER PHASE-E NDAP +16967 ; [.38A9.0020.0002] # BAMUM LETTER PHASE-E TOON +16968 ; [.38AA.0020.0002] # BAMUM LETTER PHASE-E MBEUM +16969 ; [.38AB.0020.0002] # BAMUM LETTER PHASE-E LAP +1696A ; [.38AC.0020.0002] # BAMUM LETTER PHASE-E VOM +1696B ; [.38AD.0020.0002] # BAMUM LETTER PHASE-E LOON +1696C ; [.38AE.0020.0002] # BAMUM LETTER PHASE-E PAA +1696D ; [.38AF.0020.0002] # BAMUM LETTER PHASE-E SOM +1696E ; [.38B0.0020.0002] # BAMUM LETTER PHASE-E RAQ +1696F ; [.38B1.0020.0002] # BAMUM LETTER PHASE-E NSHUOP +16970 ; [.38B2.0020.0002] # BAMUM LETTER PHASE-E NDUN +16971 ; [.38B3.0020.0002] # BAMUM LETTER PHASE-E PUAE +16972 ; [.38B4.0020.0002] # BAMUM LETTER PHASE-E TAM +16973 ; [.38B5.0020.0002] # BAMUM LETTER PHASE-E NGKA +16974 ; [.38B6.0020.0002] # BAMUM LETTER PHASE-E KPEUX +16975 ; [.38B7.0020.0002] # BAMUM LETTER PHASE-E WUO +16976 ; [.38B8.0020.0002] # BAMUM LETTER PHASE-E SEE +16977 ; [.38B9.0020.0002] # BAMUM LETTER PHASE-E NGGEUAET +16978 ; [.38BA.0020.0002] # BAMUM LETTER PHASE-E PAAM +16979 ; [.38BB.0020.0002] # BAMUM LETTER PHASE-E TOO +1697A ; [.38BC.0020.0002] # BAMUM LETTER PHASE-E KUOP +1697B ; [.38BD.0020.0002] # BAMUM LETTER PHASE-E LOM +1697C ; [.38BE.0020.0002] # BAMUM LETTER PHASE-E NSHIEE +1697D ; [.38BF.0020.0002] # BAMUM LETTER PHASE-E NGOP +1697E ; [.38C0.0020.0002] # BAMUM LETTER PHASE-E MAEM +1697F ; [.38C1.0020.0002] # BAMUM LETTER PHASE-E NGKEUX +16980 ; [.38C2.0020.0002] # BAMUM LETTER PHASE-E NGOQ +16981 ; [.38C3.0020.0002] # BAMUM LETTER PHASE-E NSHUE +16982 ; [.38C4.0020.0002] # BAMUM LETTER PHASE-E RIMGBA +16983 ; [.38C5.0020.0002] # BAMUM LETTER PHASE-E NJEUX +16984 ; [.38C6.0020.0002] # BAMUM LETTER PHASE-E PEEM +16985 ; [.38C7.0020.0002] # BAMUM LETTER PHASE-E SAA +16986 ; [.38C8.0020.0002] # BAMUM LETTER PHASE-E NGGURAE +16987 ; [.38C9.0020.0002] # BAMUM LETTER PHASE-E MGBA +16988 ; [.38CA.0020.0002] # BAMUM LETTER PHASE-E GHEUX +16989 ; [.38CB.0020.0002] # BAMUM LETTER PHASE-E NGKEUAEM +1698A ; [.38CC.0020.0002] # BAMUM LETTER PHASE-E NJAEMLI +1698B ; [.38CD.0020.0002] # BAMUM LETTER PHASE-E MAP +1698C ; [.38CE.0020.0002] # BAMUM LETTER PHASE-E LOOT +1698D ; [.38CF.0020.0002] # BAMUM LETTER PHASE-E NGGEEEE +1698E ; [.38D0.0020.0002] # BAMUM LETTER PHASE-E NDIQ +1698F ; [.38D1.0020.0002] # BAMUM LETTER PHASE-E TAEN NTEUM +16990 ; [.38D2.0020.0002] # BAMUM LETTER PHASE-E SET +16991 ; [.38D3.0020.0002] # BAMUM LETTER PHASE-E PUM +16992 ; [.38D4.0020.0002] # BAMUM LETTER PHASE-E NDAA SOFTNESS +16993 ; [.38D5.0020.0002] # BAMUM LETTER PHASE-E NGGUAESHAE NYAM +16994 ; [.38D6.0020.0002] # BAMUM LETTER PHASE-E YIEE +16995 ; [.38D7.0020.0002] # BAMUM LETTER PHASE-E GHEUN +16996 ; [.38D8.0020.0002] # BAMUM LETTER PHASE-E TUAE +16997 ; [.38D9.0020.0002] # BAMUM LETTER PHASE-E YEUAE +16998 ; [.38DA.0020.0002] # BAMUM LETTER PHASE-E PO +16999 ; [.38DB.0020.0002] # BAMUM LETTER PHASE-E TUMAE +1699A ; [.38DC.0020.0002] # BAMUM LETTER PHASE-E KEUAE +1699B ; [.38DD.0020.0002] # BAMUM LETTER PHASE-E SUAEN +1699C ; [.38DE.0020.0002] # BAMUM LETTER PHASE-E TEUAEQ +1699D ; [.38DF.0020.0002] # BAMUM LETTER PHASE-E VEUAE +1699E ; [.38E0.0020.0002] # BAMUM LETTER PHASE-E WEUX +1699F ; [.38E1.0020.0002] # BAMUM LETTER PHASE-E LAAM +169A0 ; [.38E2.0020.0002] # BAMUM LETTER PHASE-E PU +169A1 ; [.38E3.0020.0002] # BAMUM LETTER PHASE-E TAAQ +169A2 ; [.38E4.0020.0002] # BAMUM LETTER PHASE-E GHAAMAE +169A3 ; [.38E5.0020.0002] # BAMUM LETTER PHASE-E NGEUREUT +169A4 ; [.38E6.0020.0002] # BAMUM LETTER PHASE-E SHEUAEQ +169A5 ; [.38E7.0020.0002] # BAMUM LETTER PHASE-E MGBEN +169A6 ; [.38E8.0020.0002] # BAMUM LETTER PHASE-E MBEE +169A7 ; [.38E9.0020.0002] # BAMUM LETTER PHASE-E NZAQ +169A8 ; [.38EA.0020.0002] # BAMUM LETTER PHASE-E NKOM +169A9 ; [.38EB.0020.0002] # BAMUM LETTER PHASE-E GBET +169AA ; [.38EC.0020.0002] # BAMUM LETTER PHASE-E TUM +169AB ; [.38ED.0020.0002] # BAMUM LETTER PHASE-E KUET +169AC ; [.38EE.0020.0002] # BAMUM LETTER PHASE-E YAP +169AD ; [.38EF.0020.0002] # BAMUM LETTER PHASE-E NYI CLEAVER +169AE ; [.38F0.0020.0002] # BAMUM LETTER PHASE-E YIT +169AF ; [.38F1.0020.0002] # BAMUM LETTER PHASE-E MFEUQ +169B0 ; [.38F2.0020.0002] # BAMUM LETTER PHASE-E NDIAQ +169B1 ; [.38F3.0020.0002] # BAMUM LETTER PHASE-E PIEEQ +169B2 ; [.38F4.0020.0002] # BAMUM LETTER PHASE-E YUEQ +169B3 ; [.38F5.0020.0002] # BAMUM LETTER PHASE-E LEUAEM +169B4 ; [.38F6.0020.0002] # BAMUM LETTER PHASE-E FUE +169B5 ; [.38F7.0020.0002] # BAMUM LETTER PHASE-E GBEUX +169B6 ; [.38F8.0020.0002] # BAMUM LETTER PHASE-E NGKUP +169B7 ; [.38F9.0020.0002] # BAMUM LETTER PHASE-E KET +169B8 ; [.38FA.0020.0002] # BAMUM LETTER PHASE-E MAE +169B9 ; [.38FB.0020.0002] # BAMUM LETTER PHASE-E NGKAAMI +169BA ; [.38FC.0020.0002] # BAMUM LETTER PHASE-E GHET +169BB ; [.38FD.0020.0002] # BAMUM LETTER PHASE-E FA +169BC ; [.38FE.0020.0002] # BAMUM LETTER PHASE-E NTUM +169BD ; [.38FF.0020.0002] # BAMUM LETTER PHASE-E PEUT +169BE ; [.3900.0020.0002] # BAMUM LETTER PHASE-E YEUM +169BF ; [.3901.0020.0002] # BAMUM LETTER PHASE-E NGGEUAE +169C0 ; [.3902.0020.0002] # BAMUM LETTER PHASE-E NYI BETWEEN +169C1 ; [.3903.0020.0002] # BAMUM LETTER PHASE-E NZUQ +169C2 ; [.3904.0020.0002] # BAMUM LETTER PHASE-E POON +169C3 ; [.3905.0020.0002] # BAMUM LETTER PHASE-E MIEE +169C4 ; [.3906.0020.0002] # BAMUM LETTER PHASE-E FUET +169C5 ; [.3907.0020.0002] # BAMUM LETTER PHASE-E NAE +169C6 ; [.3908.0020.0002] # BAMUM LETTER PHASE-E MUAE +169C7 ; [.3909.0020.0002] # BAMUM LETTER PHASE-E GHEUAE +169C8 ; [.390A.0020.0002] # BAMUM LETTER PHASE-E FU I +169C9 ; [.390B.0020.0002] # BAMUM LETTER PHASE-E MVI +169CA ; [.390C.0020.0002] # BAMUM LETTER PHASE-E PUAQ +169CB ; [.390D.0020.0002] # BAMUM LETTER PHASE-E NGKUM +169CC ; [.390E.0020.0002] # BAMUM LETTER PHASE-E KUT +169CD ; [.390F.0020.0002] # BAMUM LETTER PHASE-E PIET +169CE ; [.3910.0020.0002] # BAMUM LETTER PHASE-E NTAP +169CF ; [.3911.0020.0002] # BAMUM LETTER PHASE-E YEUAET +169D0 ; [.3912.0020.0002] # BAMUM LETTER PHASE-E NGGUP +169D1 ; [.3913.0020.0002] # BAMUM LETTER PHASE-E PA PEOPLE +169D2 ; [.3914.0020.0002] # BAMUM LETTER PHASE-E FU CALL +169D3 ; [.3915.0020.0002] # BAMUM LETTER PHASE-E FOM +169D4 ; [.3916.0020.0002] # BAMUM LETTER PHASE-E NJEE +169D5 ; [.3917.0020.0002] # BAMUM LETTER PHASE-E A +169D6 ; [.3918.0020.0002] # BAMUM LETTER PHASE-E TOQ +169D7 ; [.3919.0020.0002] # BAMUM LETTER PHASE-E O +169D8 ; [.391A.0020.0002] # BAMUM LETTER PHASE-E I +169D9 ; [.391B.0020.0002] # BAMUM LETTER PHASE-E LAQ +169DA ; [.391C.0020.0002] # BAMUM LETTER PHASE-E PA PLURAL +169DB ; [.391D.0020.0002] # BAMUM LETTER PHASE-E TAA +169DC ; [.391E.0020.0002] # BAMUM LETTER PHASE-E TAQ +169DD ; [.391F.0020.0002] # BAMUM LETTER PHASE-E NDAA MY HOUSE +169DE ; [.3920.0020.0002] # BAMUM LETTER PHASE-E SHIQ +169DF ; [.3921.0020.0002] # BAMUM LETTER PHASE-E YEUX +169E0 ; [.3922.0020.0002] # BAMUM LETTER PHASE-E NGUAE +169E1 ; [.3923.0020.0002] # BAMUM LETTER PHASE-E YUAEN +169E2 ; [.3924.0020.0002] # BAMUM LETTER PHASE-E YOQ SWIMMING +169E3 ; [.3925.0020.0002] # BAMUM LETTER PHASE-E YOQ COVER +169E4 ; [.3926.0020.0002] # BAMUM LETTER PHASE-E YUQ +169E5 ; [.3927.0020.0002] # BAMUM LETTER PHASE-E YUN +169E6 ; [.3928.0020.0002] # BAMUM LETTER PHASE-E KEUX +169E7 ; [.3929.0020.0002] # BAMUM LETTER PHASE-E PEUX +169E8 ; [.392A.0020.0002] # BAMUM LETTER PHASE-E NJEE EPOCH +169E9 ; [.392B.0020.0002] # BAMUM LETTER PHASE-E PUE +169EA ; [.392C.0020.0002] # BAMUM LETTER PHASE-E WUE +169EB ; [.392D.0020.0002] # BAMUM LETTER PHASE-E FEE +169EC ; [.392E.0020.0002] # BAMUM LETTER PHASE-E VEE +169ED ; [.392F.0020.0002] # BAMUM LETTER PHASE-E LU +169EE ; [.3930.0020.0002] # BAMUM LETTER PHASE-E MI +169EF ; [.3931.0020.0002] # BAMUM LETTER PHASE-E REUX +169F0 ; [.3932.0020.0002] # BAMUM LETTER PHASE-E RAE +169F1 ; [.3933.0020.0002] # BAMUM LETTER PHASE-E NGUAET +169F2 ; [.3934.0020.0002] # BAMUM LETTER PHASE-E NGA +169F3 ; [.3935.0020.0002] # BAMUM LETTER PHASE-E SHO +169F4 ; [.3936.0020.0002] # BAMUM LETTER PHASE-E SHOQ +169F5 ; [.3937.0020.0002] # BAMUM LETTER PHASE-E FU REMEDY +169F6 ; [.3938.0020.0002] # BAMUM LETTER PHASE-E NA +169F7 ; [.3939.0020.0002] # BAMUM LETTER PHASE-E PI +169F8 ; [.393A.0020.0002] # BAMUM LETTER PHASE-E LOQ +169F9 ; [.393B.0020.0002] # BAMUM LETTER PHASE-E KO +169FA ; [.393C.0020.0002] # BAMUM LETTER PHASE-E MEN +169FB ; [.393D.0020.0002] # BAMUM LETTER PHASE-E MA +169FC ; [.393E.0020.0002] # BAMUM LETTER PHASE-E MAQ +169FD ; [.393F.0020.0002] # BAMUM LETTER PHASE-E TEU +169FE ; [.3940.0020.0002] # BAMUM LETTER PHASE-E KI +169FF ; [.3941.0020.0002] # BAMUM LETTER PHASE-E MON +16A00 ; [.3942.0020.0002] # BAMUM LETTER PHASE-E TEN +16A01 ; [.3943.0020.0002] # BAMUM LETTER PHASE-E FAQ +16A02 ; [.3944.0020.0002] # BAMUM LETTER PHASE-E GHOM +16A03 ; [.3945.0020.0002] # BAMUM LETTER PHASE-F KA +16A04 ; [.3946.0020.0002] # BAMUM LETTER PHASE-F U +16A05 ; [.3947.0020.0002] # BAMUM LETTER PHASE-F KU +16A06 ; [.3948.0020.0002] # BAMUM LETTER PHASE-F EE +16A07 ; [.3949.0020.0002] # BAMUM LETTER PHASE-F REE +16A08 ; [.394A.0020.0002] # BAMUM LETTER PHASE-F TAE +16A09 ; [.394B.0020.0002] # BAMUM LETTER PHASE-F NYI +16A0A ; [.394C.0020.0002] # BAMUM LETTER PHASE-F LA +16A0B ; [.394D.0020.0002] # BAMUM LETTER PHASE-F RII +16A0C ; [.394E.0020.0002] # BAMUM LETTER PHASE-F RIEE +16A0D ; [.394F.0020.0002] # BAMUM LETTER PHASE-F MEEEE +16A0E ; [.3950.0020.0002] # BAMUM LETTER PHASE-F TAA +16A0F ; [.3951.0020.0002] # BAMUM LETTER PHASE-F NDAA +16A10 ; [.3952.0020.0002] # BAMUM LETTER PHASE-F NJAEM +16A11 ; [.3953.0020.0002] # BAMUM LETTER PHASE-F M +16A12 ; [.3954.0020.0002] # BAMUM LETTER PHASE-F SUU +16A13 ; [.3955.0020.0002] # BAMUM LETTER PHASE-F SHII +16A14 ; [.3956.0020.0002] # BAMUM LETTER PHASE-F SI +16A15 ; [.3957.0020.0002] # BAMUM LETTER PHASE-F SEUX +16A16 ; [.3958.0020.0002] # BAMUM LETTER PHASE-F KYEE +16A17 ; [.3959.0020.0002] # BAMUM LETTER PHASE-F KET +16A18 ; [.395A.0020.0002] # BAMUM LETTER PHASE-F NUAE +16A19 ; [.395B.0020.0002] # BAMUM LETTER PHASE-F NU +16A1A ; [.395C.0020.0002] # BAMUM LETTER PHASE-F NJUAE +16A1B ; [.395D.0020.0002] # BAMUM LETTER PHASE-F YOQ +16A1C ; [.395E.0020.0002] # BAMUM LETTER PHASE-F SHU +16A1D ; [.395F.0020.0002] # BAMUM LETTER PHASE-F YA +16A1E ; [.3960.0020.0002] # BAMUM LETTER PHASE-F NSHA +16A1F ; [.3961.0020.0002] # BAMUM LETTER PHASE-F PEUX +16A20 ; [.3962.0020.0002] # BAMUM LETTER PHASE-F NTEE +16A21 ; [.3963.0020.0002] # BAMUM LETTER PHASE-F WUE +16A22 ; [.3964.0020.0002] # BAMUM LETTER PHASE-F PEE +16A23 ; [.3965.0020.0002] # BAMUM LETTER PHASE-F RU +16A24 ; [.3966.0020.0002] # BAMUM LETTER PHASE-F NI +16A25 ; [.3967.0020.0002] # BAMUM LETTER PHASE-F REUX +16A26 ; [.3968.0020.0002] # BAMUM LETTER PHASE-F KEN +16A27 ; [.3969.0020.0002] # BAMUM LETTER PHASE-F NGKWAEN +16A28 ; [.396A.0020.0002] # BAMUM LETTER PHASE-F NGGA +16A29 ; [.396B.0020.0002] # BAMUM LETTER PHASE-F SHO +16A2A ; [.396C.0020.0002] # BAMUM LETTER PHASE-F PUAE +16A2B ; [.396D.0020.0002] # BAMUM LETTER PHASE-F FOM +16A2C ; [.396E.0020.0002] # BAMUM LETTER PHASE-F WA +16A2D ; [.396F.0020.0002] # BAMUM LETTER PHASE-F LI +16A2E ; [.3970.0020.0002] # BAMUM LETTER PHASE-F LOQ +16A2F ; [.3971.0020.0002] # BAMUM LETTER PHASE-F KO +16A30 ; [.3972.0020.0002] # BAMUM LETTER PHASE-F MBEN +16A31 ; [.3973.0020.0002] # BAMUM LETTER PHASE-F REN +16A32 ; [.3974.0020.0002] # BAMUM LETTER PHASE-F MA +16A33 ; [.3975.0020.0002] # BAMUM LETTER PHASE-F MO +16A34 ; [.3976.0020.0002] # BAMUM LETTER PHASE-F MBAA +16A35 ; [.3977.0020.0002] # BAMUM LETTER PHASE-F TET +16A36 ; [.3978.0020.0002] # BAMUM LETTER PHASE-F KPA +16A37 ; [.3979.0020.0002] # BAMUM LETTER PHASE-F SAMBA +16A38 ; [.397A.0020.0002] # BAMUM LETTER PHASE-F VUEQ +16AD0 ; [.397B.0020.0002] # BASSA VAH LETTER ENNI +16AD1 ; [.397C.0020.0002] # BASSA VAH LETTER KA +16AD2 ; [.397D.0020.0002] # BASSA VAH LETTER SE +16AD3 ; [.397E.0020.0002] # BASSA VAH LETTER FA +16AD4 ; [.397F.0020.0002] # BASSA VAH LETTER MBE +16AD5 ; [.3980.0020.0002] # BASSA VAH LETTER YIE +16AD6 ; [.3981.0020.0002] # BASSA VAH LETTER GAH +16AD7 ; [.3982.0020.0002] # BASSA VAH LETTER DHII +16AD8 ; [.3983.0020.0002] # BASSA VAH LETTER KPAH +16AD9 ; [.3984.0020.0002] # BASSA VAH LETTER JO +16ADA ; [.3985.0020.0002] # BASSA VAH LETTER HWAH +16ADB ; [.3986.0020.0002] # BASSA VAH LETTER WA +16ADC ; [.3987.0020.0002] # BASSA VAH LETTER ZO +16ADD ; [.3988.0020.0002] # BASSA VAH LETTER GBU +16ADE ; [.3989.0020.0002] # BASSA VAH LETTER DO +16ADF ; [.398A.0020.0002] # BASSA VAH LETTER CE +16AE0 ; [.398B.0020.0002] # BASSA VAH LETTER UWU +16AE1 ; [.398C.0020.0002] # BASSA VAH LETTER TO +16AE2 ; [.398D.0020.0002] # BASSA VAH LETTER BA +16AE3 ; [.398E.0020.0002] # BASSA VAH LETTER VU +16AE4 ; [.398F.0020.0002] # BASSA VAH LETTER YEIN +16AE5 ; [.3990.0020.0002] # BASSA VAH LETTER PA +16AE6 ; [.3991.0020.0002] # BASSA VAH LETTER WADDA +16AE7 ; [.3992.0020.0002] # BASSA VAH LETTER A +16AE8 ; [.3993.0020.0002] # BASSA VAH LETTER O +16AE9 ; [.3994.0020.0002] # BASSA VAH LETTER OO +16AEA ; [.3995.0020.0002] # BASSA VAH LETTER U +16AEB ; [.3996.0020.0002] # BASSA VAH LETTER EE +16AEC ; [.3997.0020.0002] # BASSA VAH LETTER E +16AED ; [.3998.0020.0002] # BASSA VAH LETTER I +1E800 ; [.3999.0020.0002] # MENDE KIKAKUI SYLLABLE M001 KI +1E801 ; [.399A.0020.0002] # MENDE KIKAKUI SYLLABLE M002 KA +1E802 ; [.399B.0020.0002] # MENDE KIKAKUI SYLLABLE M003 KU +1E803 ; [.399C.0020.0002] # MENDE KIKAKUI SYLLABLE M065 KEE +1E804 ; [.399D.0020.0002] # MENDE KIKAKUI SYLLABLE M095 KE +1E805 ; [.399E.0020.0002] # MENDE KIKAKUI SYLLABLE M076 KOO +1E806 ; [.399F.0020.0002] # MENDE KIKAKUI SYLLABLE M048 KO +1E807 ; [.39A0.0020.0002] # MENDE KIKAKUI SYLLABLE M179 KUA +1E808 ; [.39A1.0020.0002] # MENDE KIKAKUI SYLLABLE M004 WI +1E809 ; [.39A2.0020.0002] # MENDE KIKAKUI SYLLABLE M005 WA +1E80A ; [.39A3.0020.0002] # MENDE KIKAKUI SYLLABLE M006 WU +1E80B ; [.39A4.0020.0002] # MENDE KIKAKUI SYLLABLE M126 WEE +1E80C ; [.39A5.0020.0002] # MENDE KIKAKUI SYLLABLE M118 WE +1E80D ; [.39A6.0020.0002] # MENDE KIKAKUI SYLLABLE M114 WOO +1E80E ; [.39A7.0020.0002] # MENDE KIKAKUI SYLLABLE M045 WO +1E80F ; [.39A8.0020.0002] # MENDE KIKAKUI SYLLABLE M194 WUI +1E810 ; [.39A9.0020.0002] # MENDE KIKAKUI SYLLABLE M143 WEI +1E811 ; [.39AA.0020.0002] # MENDE KIKAKUI SYLLABLE M061 WVI +1E812 ; [.39AB.0020.0002] # MENDE KIKAKUI SYLLABLE M049 WVA +1E813 ; [.39AC.0020.0002] # MENDE KIKAKUI SYLLABLE M139 WVE +1E814 ; [.39AD.0020.0002] # MENDE KIKAKUI SYLLABLE M007 MIN +1E815 ; [.39AE.0020.0002] # MENDE KIKAKUI SYLLABLE M008 MAN +1E816 ; [.39AF.0020.0002] # MENDE KIKAKUI SYLLABLE M009 MUN +1E817 ; [.39B0.0020.0002] # MENDE KIKAKUI SYLLABLE M059 MEN +1E818 ; [.39B1.0020.0002] # MENDE KIKAKUI SYLLABLE M094 MON +1E819 ; [.39B2.0020.0002] # MENDE KIKAKUI SYLLABLE M154 MUAN +1E81A ; [.39B3.0020.0002] # MENDE KIKAKUI SYLLABLE M189 MUEN +1E81B ; [.39B4.0020.0002] # MENDE KIKAKUI SYLLABLE M010 BI +1E81C ; [.39B5.0020.0002] # MENDE KIKAKUI SYLLABLE M011 BA +1E81D ; [.39B6.0020.0002] # MENDE KIKAKUI SYLLABLE M012 BU +1E81E ; [.39B7.0020.0002] # MENDE KIKAKUI SYLLABLE M150 BEE +1E81F ; [.39B8.0020.0002] # MENDE KIKAKUI SYLLABLE M097 BE +1E820 ; [.39B9.0020.0002] # MENDE KIKAKUI SYLLABLE M103 BOO +1E821 ; [.39BA.0020.0002] # MENDE KIKAKUI SYLLABLE M138 BO +1E822 ; [.39BB.0020.0002] # MENDE KIKAKUI SYLLABLE M013 I +1E823 ; [.39BC.0020.0002] # MENDE KIKAKUI SYLLABLE M014 A +1E824 ; [.39BD.0020.0002] # MENDE KIKAKUI SYLLABLE M015 U +1E825 ; [.39BE.0020.0002] # MENDE KIKAKUI SYLLABLE M163 EE +1E826 ; [.39BF.0020.0002] # MENDE KIKAKUI SYLLABLE M100 E +1E827 ; [.39C0.0020.0002] # MENDE KIKAKUI SYLLABLE M165 OO +1E828 ; [.39C1.0020.0002] # MENDE KIKAKUI SYLLABLE M147 O +1E829 ; [.39C2.0020.0002] # MENDE KIKAKUI SYLLABLE M137 EI +1E82A ; [.39C3.0020.0002] # MENDE KIKAKUI SYLLABLE M131 IN +1E82B ; [.39C4.0020.0002] # MENDE KIKAKUI SYLLABLE M135 IN +1E82C ; [.39C5.0020.0002] # MENDE KIKAKUI SYLLABLE M195 AN +1E82D ; [.39C6.0020.0002] # MENDE KIKAKUI SYLLABLE M178 EN +1E82E ; [.39C7.0020.0002] # MENDE KIKAKUI SYLLABLE M019 SI +1E82F ; [.39C8.0020.0002] # MENDE KIKAKUI SYLLABLE M020 SA +1E830 ; [.39C9.0020.0002] # MENDE KIKAKUI SYLLABLE M021 SU +1E831 ; [.39CA.0020.0002] # MENDE KIKAKUI SYLLABLE M162 SEE +1E832 ; [.39CB.0020.0002] # MENDE KIKAKUI SYLLABLE M116 SE +1E833 ; [.39CC.0020.0002] # MENDE KIKAKUI SYLLABLE M136 SOO +1E834 ; [.39CD.0020.0002] # MENDE KIKAKUI SYLLABLE M079 SO +1E835 ; [.39CE.0020.0002] # MENDE KIKAKUI SYLLABLE M196 SIA +1E836 ; [.39CF.0020.0002] # MENDE KIKAKUI SYLLABLE M025 LI +1E837 ; [.39D0.0020.0002] # MENDE KIKAKUI SYLLABLE M026 LA +1E838 ; [.39D1.0020.0002] # MENDE KIKAKUI SYLLABLE M027 LU +1E839 ; [.39D2.0020.0002] # MENDE KIKAKUI SYLLABLE M084 LEE +1E83A ; [.39D3.0020.0002] # MENDE KIKAKUI SYLLABLE M073 LE +1E83B ; [.39D4.0020.0002] # MENDE KIKAKUI SYLLABLE M054 LOO +1E83C ; [.39D5.0020.0002] # MENDE KIKAKUI SYLLABLE M153 LO +1E83D ; [.39D6.0020.0002] # MENDE KIKAKUI SYLLABLE M110 LONG LE +1E83E ; [.39D7.0020.0002] # MENDE KIKAKUI SYLLABLE M016 DI +1E83F ; [.39D8.0020.0002] # MENDE KIKAKUI SYLLABLE M017 DA +1E840 ; [.39D9.0020.0002] # MENDE KIKAKUI SYLLABLE M018 DU +1E841 ; [.39DA.0020.0002] # MENDE KIKAKUI SYLLABLE M089 DEE +1E842 ; [.39DB.0020.0002] # MENDE KIKAKUI SYLLABLE M180 DOO +1E843 ; [.39DC.0020.0002] # MENDE KIKAKUI SYLLABLE M181 DO +1E844 ; [.39DD.0020.0002] # MENDE KIKAKUI SYLLABLE M022 TI +1E845 ; [.39DE.0020.0002] # MENDE KIKAKUI SYLLABLE M023 TA +1E846 ; [.39DF.0020.0002] # MENDE KIKAKUI SYLLABLE M024 TU +1E847 ; [.39E0.0020.0002] # MENDE KIKAKUI SYLLABLE M091 TEE +1E848 ; [.39E1.0020.0002] # MENDE KIKAKUI SYLLABLE M055 TE +1E849 ; [.39E2.0020.0002] # MENDE KIKAKUI SYLLABLE M104 TOO +1E84A ; [.39E3.0020.0002] # MENDE KIKAKUI SYLLABLE M069 TO +1E84B ; [.39E4.0020.0002] # MENDE KIKAKUI SYLLABLE M028 JI +1E84C ; [.39E5.0020.0002] # MENDE KIKAKUI SYLLABLE M029 JA +1E84D ; [.39E6.0020.0002] # MENDE KIKAKUI SYLLABLE M030 JU +1E84E ; [.39E7.0020.0002] # MENDE KIKAKUI SYLLABLE M157 JEE +1E84F ; [.39E8.0020.0002] # MENDE KIKAKUI SYLLABLE M113 JE +1E850 ; [.39E9.0020.0002] # MENDE KIKAKUI SYLLABLE M160 JOO +1E851 ; [.39EA.0020.0002] # MENDE KIKAKUI SYLLABLE M063 JO +1E852 ; [.39EB.0020.0002] # MENDE KIKAKUI SYLLABLE M175 LONG JO +1E853 ; [.39EC.0020.0002] # MENDE KIKAKUI SYLLABLE M031 YI +1E854 ; [.39ED.0020.0002] # MENDE KIKAKUI SYLLABLE M032 YA +1E855 ; [.39EE.0020.0002] # MENDE KIKAKUI SYLLABLE M033 YU +1E856 ; [.39EF.0020.0002] # MENDE KIKAKUI SYLLABLE M109 YEE +1E857 ; [.39F0.0020.0002] # MENDE KIKAKUI SYLLABLE M080 YE +1E858 ; [.39F1.0020.0002] # MENDE KIKAKUI SYLLABLE M141 YOO +1E859 ; [.39F2.0020.0002] # MENDE KIKAKUI SYLLABLE M121 YO +1E85A ; [.39F3.0020.0002] # MENDE KIKAKUI SYLLABLE M034 FI +1E85B ; [.39F4.0020.0002] # MENDE KIKAKUI SYLLABLE M035 FA +1E85C ; [.39F5.0020.0002] # MENDE KIKAKUI SYLLABLE M036 FU +1E85D ; [.39F6.0020.0002] # MENDE KIKAKUI SYLLABLE M078 FEE +1E85E ; [.39F7.0020.0002] # MENDE KIKAKUI SYLLABLE M075 FE +1E85F ; [.39F8.0020.0002] # MENDE KIKAKUI SYLLABLE M133 FOO +1E860 ; [.39F9.0020.0002] # MENDE KIKAKUI SYLLABLE M088 FO +1E861 ; [.39FA.0020.0002] # MENDE KIKAKUI SYLLABLE M197 FUA +1E862 ; [.39FB.0020.0002] # MENDE KIKAKUI SYLLABLE M101 FAN +1E863 ; [.39FC.0020.0002] # MENDE KIKAKUI SYLLABLE M037 NIN +1E864 ; [.39FD.0020.0002] # MENDE KIKAKUI SYLLABLE M038 NAN +1E865 ; [.39FE.0020.0002] # MENDE KIKAKUI SYLLABLE M039 NUN +1E866 ; [.39FF.0020.0002] # MENDE KIKAKUI SYLLABLE M117 NEN +1E867 ; [.3A00.0020.0002] # MENDE KIKAKUI SYLLABLE M169 NON +1E868 ; [.3A01.0020.0002] # MENDE KIKAKUI SYLLABLE M176 HI +1E869 ; [.3A02.0020.0002] # MENDE KIKAKUI SYLLABLE M041 HA +1E86A ; [.3A03.0020.0002] # MENDE KIKAKUI SYLLABLE M186 HU +1E86B ; [.3A04.0020.0002] # MENDE KIKAKUI SYLLABLE M040 HEE +1E86C ; [.3A05.0020.0002] # MENDE KIKAKUI SYLLABLE M096 HE +1E86D ; [.3A06.0020.0002] # MENDE KIKAKUI SYLLABLE M042 HOO +1E86E ; [.3A07.0020.0002] # MENDE KIKAKUI SYLLABLE M140 HO +1E86F ; [.3A08.0020.0002] # MENDE KIKAKUI SYLLABLE M083 HEEI +1E870 ; [.3A09.0020.0002] # MENDE KIKAKUI SYLLABLE M128 HOOU +1E871 ; [.3A0A.0020.0002] # MENDE KIKAKUI SYLLABLE M053 HIN +1E872 ; [.3A0B.0020.0002] # MENDE KIKAKUI SYLLABLE M130 HAN +1E873 ; [.3A0C.0020.0002] # MENDE KIKAKUI SYLLABLE M087 HUN +1E874 ; [.3A0D.0020.0002] # MENDE KIKAKUI SYLLABLE M052 HEN +1E875 ; [.3A0E.0020.0002] # MENDE KIKAKUI SYLLABLE M193 HON +1E876 ; [.3A0F.0020.0002] # MENDE KIKAKUI SYLLABLE M046 HUAN +1E877 ; [.3A10.0020.0002] # MENDE KIKAKUI SYLLABLE M090 NGGI +1E878 ; [.3A11.0020.0002] # MENDE KIKAKUI SYLLABLE M043 NGGA +1E879 ; [.3A12.0020.0002] # MENDE KIKAKUI SYLLABLE M082 NGGU +1E87A ; [.3A13.0020.0002] # MENDE KIKAKUI SYLLABLE M115 NGGEE +1E87B ; [.3A14.0020.0002] # MENDE KIKAKUI SYLLABLE M146 NGGE +1E87C ; [.3A15.0020.0002] # MENDE KIKAKUI SYLLABLE M156 NGGOO +1E87D ; [.3A16.0020.0002] # MENDE KIKAKUI SYLLABLE M120 NGGO +1E87E ; [.3A17.0020.0002] # MENDE KIKAKUI SYLLABLE M159 NGGAA +1E87F ; [.3A18.0020.0002] # MENDE KIKAKUI SYLLABLE M127 NGGUA +1E880 ; [.3A19.0020.0002] # MENDE KIKAKUI SYLLABLE M086 LONG NGGE +1E881 ; [.3A1A.0020.0002] # MENDE KIKAKUI SYLLABLE M106 LONG NGGOO +1E882 ; [.3A1B.0020.0002] # MENDE KIKAKUI SYLLABLE M183 LONG NGGO +1E883 ; [.3A1C.0020.0002] # MENDE KIKAKUI SYLLABLE M155 GI +1E884 ; [.3A1D.0020.0002] # MENDE KIKAKUI SYLLABLE M111 GA +1E885 ; [.3A1E.0020.0002] # MENDE KIKAKUI SYLLABLE M168 GU +1E886 ; [.3A1F.0020.0002] # MENDE KIKAKUI SYLLABLE M190 GEE +1E887 ; [.3A20.0020.0002] # MENDE KIKAKUI SYLLABLE M166 GUEI +1E888 ; [.3A21.0020.0002] # MENDE KIKAKUI SYLLABLE M167 GUAN +1E889 ; [.3A22.0020.0002] # MENDE KIKAKUI SYLLABLE M184 NGEN +1E88A ; [.3A23.0020.0002] # MENDE KIKAKUI SYLLABLE M057 NGON +1E88B ; [.3A24.0020.0002] # MENDE KIKAKUI SYLLABLE M177 NGUAN +1E88C ; [.3A25.0020.0002] # MENDE KIKAKUI SYLLABLE M068 PI +1E88D ; [.3A26.0020.0002] # MENDE KIKAKUI SYLLABLE M099 PA +1E88E ; [.3A27.0020.0002] # MENDE KIKAKUI SYLLABLE M050 PU +1E88F ; [.3A28.0020.0002] # MENDE KIKAKUI SYLLABLE M081 PEE +1E890 ; [.3A29.0020.0002] # MENDE KIKAKUI SYLLABLE M051 PE +1E891 ; [.3A2A.0020.0002] # MENDE KIKAKUI SYLLABLE M102 POO +1E892 ; [.3A2B.0020.0002] # MENDE KIKAKUI SYLLABLE M066 PO +1E893 ; [.3A2C.0020.0002] # MENDE KIKAKUI SYLLABLE M145 MBI +1E894 ; [.3A2D.0020.0002] # MENDE KIKAKUI SYLLABLE M062 MBA +1E895 ; [.3A2E.0020.0002] # MENDE KIKAKUI SYLLABLE M122 MBU +1E896 ; [.3A2F.0020.0002] # MENDE KIKAKUI SYLLABLE M047 MBEE +1E897 ; [.3A30.0020.0002] # MENDE KIKAKUI SYLLABLE M188 MBEE +1E898 ; [.3A31.0020.0002] # MENDE KIKAKUI SYLLABLE M072 MBE +1E899 ; [.3A32.0020.0002] # MENDE KIKAKUI SYLLABLE M172 MBOO +1E89A ; [.3A33.0020.0002] # MENDE KIKAKUI SYLLABLE M174 MBO +1E89B ; [.3A34.0020.0002] # MENDE KIKAKUI SYLLABLE M187 MBUU +1E89C ; [.3A35.0020.0002] # MENDE KIKAKUI SYLLABLE M161 LONG MBE +1E89D ; [.3A36.0020.0002] # MENDE KIKAKUI SYLLABLE M105 LONG MBOO +1E89E ; [.3A37.0020.0002] # MENDE KIKAKUI SYLLABLE M142 LONG MBO +1E89F ; [.3A38.0020.0002] # MENDE KIKAKUI SYLLABLE M132 KPI +1E8A0 ; [.3A39.0020.0002] # MENDE KIKAKUI SYLLABLE M092 KPA +1E8A1 ; [.3A3A.0020.0002] # MENDE KIKAKUI SYLLABLE M074 KPU +1E8A2 ; [.3A3B.0020.0002] # MENDE KIKAKUI SYLLABLE M044 KPEE +1E8A3 ; [.3A3C.0020.0002] # MENDE KIKAKUI SYLLABLE M108 KPE +1E8A4 ; [.3A3D.0020.0002] # MENDE KIKAKUI SYLLABLE M112 KPOO +1E8A5 ; [.3A3E.0020.0002] # MENDE KIKAKUI SYLLABLE M158 KPO +1E8A6 ; [.3A3F.0020.0002] # MENDE KIKAKUI SYLLABLE M124 GBI +1E8A7 ; [.3A40.0020.0002] # MENDE KIKAKUI SYLLABLE M056 GBA +1E8A8 ; [.3A41.0020.0002] # MENDE KIKAKUI SYLLABLE M148 GBU +1E8A9 ; [.3A42.0020.0002] # MENDE KIKAKUI SYLLABLE M093 GBEE +1E8AA ; [.3A43.0020.0002] # MENDE KIKAKUI SYLLABLE M107 GBE +1E8AB ; [.3A44.0020.0002] # MENDE KIKAKUI SYLLABLE M071 GBOO +1E8AC ; [.3A45.0020.0002] # MENDE KIKAKUI SYLLABLE M070 GBO +1E8AD ; [.3A46.0020.0002] # MENDE KIKAKUI SYLLABLE M171 RA +1E8AE ; [.3A47.0020.0002] # MENDE KIKAKUI SYLLABLE M123 NDI +1E8AF ; [.3A48.0020.0002] # MENDE KIKAKUI SYLLABLE M129 NDA +1E8B0 ; [.3A49.0020.0002] # MENDE KIKAKUI SYLLABLE M125 NDU +1E8B1 ; [.3A4A.0020.0002] # MENDE KIKAKUI SYLLABLE M191 NDEE +1E8B2 ; [.3A4B.0020.0002] # MENDE KIKAKUI SYLLABLE M119 NDE +1E8B3 ; [.3A4C.0020.0002] # MENDE KIKAKUI SYLLABLE M067 NDOO +1E8B4 ; [.3A4D.0020.0002] # MENDE KIKAKUI SYLLABLE M064 NDO +1E8B5 ; [.3A4E.0020.0002] # MENDE KIKAKUI SYLLABLE M152 NJA +1E8B6 ; [.3A4F.0020.0002] # MENDE KIKAKUI SYLLABLE M192 NJU +1E8B7 ; [.3A50.0020.0002] # MENDE KIKAKUI SYLLABLE M149 NJEE +1E8B8 ; [.3A51.0020.0002] # MENDE KIKAKUI SYLLABLE M134 NJOO +1E8B9 ; [.3A52.0020.0002] # MENDE KIKAKUI SYLLABLE M182 VI +1E8BA ; [.3A53.0020.0002] # MENDE KIKAKUI SYLLABLE M185 VA +1E8BB ; [.3A54.0020.0002] # MENDE KIKAKUI SYLLABLE M151 VU +1E8BC ; [.3A55.0020.0002] # MENDE KIKAKUI SYLLABLE M173 VEE +1E8BD ; [.3A56.0020.0002] # MENDE KIKAKUI SYLLABLE M085 VE +1E8BE ; [.3A57.0020.0002] # MENDE KIKAKUI SYLLABLE M144 VOO +1E8BF ; [.3A58.0020.0002] # MENDE KIKAKUI SYLLABLE M077 VO +1E8C0 ; [.3A59.0020.0002] # MENDE KIKAKUI SYLLABLE M164 NYIN +1E8C1 ; [.3A5A.0020.0002] # MENDE KIKAKUI SYLLABLE M058 NYAN +1E8C2 ; [.3A5B.0020.0002] # MENDE KIKAKUI SYLLABLE M170 NYUN +1E8C3 ; [.3A5C.0020.0002] # MENDE KIKAKUI SYLLABLE M098 NYEN +1E8C4 ; [.3A5D.0020.0002] # MENDE KIKAKUI SYLLABLE M060 NYON +1100 ; [.3A5E.0020.0002] # HANGUL CHOSEONG KIYEOK +3131 ; [.3A5E.0020.0004] # HANGUL LETTER KIYEOK +3200 ; [*0310.0020.0004][.3A5E.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL KIYEOK +3260 ; [.3A5E.0020.0006] # CIRCLED HANGUL KIYEOK +FFA1 ; [.3A5E.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK +320E ; [*0310.0020.0004][.3A5E.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL KIYEOK A +326E ; [.3A5E.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL KIYEOK A +1101 ; [.3A5F.0020.0002] # HANGUL CHOSEONG SSANGKIYEOK +3132 ; [.3A5F.0020.0004] # HANGUL LETTER SSANGKIYEOK +FFA2 ; [.3A5F.0020.0012] # HALFWIDTH HANGUL LETTER SSANGKIYEOK +1102 ; [.3A60.0020.0002] # HANGUL CHOSEONG NIEUN +3134 ; [.3A60.0020.0004] # HANGUL LETTER NIEUN +3201 ; [*0310.0020.0004][.3A60.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL NIEUN +3261 ; [.3A60.0020.0006] # CIRCLED HANGUL NIEUN +FFA4 ; [.3A60.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN +320F ; [*0310.0020.0004][.3A60.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL NIEUN A +326F ; [.3A60.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL NIEUN A +1103 ; [.3A61.0020.0002] # HANGUL CHOSEONG TIKEUT +3137 ; [.3A61.0020.0004] # HANGUL LETTER TIKEUT +3202 ; [*0310.0020.0004][.3A61.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL TIKEUT +3262 ; [.3A61.0020.0006] # CIRCLED HANGUL TIKEUT +FFA7 ; [.3A61.0020.0012] # HALFWIDTH HANGUL LETTER TIKEUT +3210 ; [*0310.0020.0004][.3A61.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL TIKEUT A +3270 ; [.3A61.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL TIKEUT A +1104 ; [.3A62.0020.0002] # HANGUL CHOSEONG SSANGTIKEUT +3138 ; [.3A62.0020.0004] # HANGUL LETTER SSANGTIKEUT +FFA8 ; [.3A62.0020.0012] # HALFWIDTH HANGUL LETTER SSANGTIKEUT +1105 ; [.3A63.0020.0002] # HANGUL CHOSEONG RIEUL +3139 ; [.3A63.0020.0004] # HANGUL LETTER RIEUL +3203 ; [*0310.0020.0004][.3A63.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL RIEUL +3263 ; [.3A63.0020.0006] # CIRCLED HANGUL RIEUL +FFA9 ; [.3A63.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL +3211 ; [*0310.0020.0004][.3A63.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL RIEUL A +3271 ; [.3A63.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL RIEUL A +1106 ; [.3A64.0020.0002] # HANGUL CHOSEONG MIEUM +3141 ; [.3A64.0020.0004] # HANGUL LETTER MIEUM +3204 ; [*0310.0020.0004][.3A64.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL MIEUM +3264 ; [.3A64.0020.0006] # CIRCLED HANGUL MIEUM +FFB1 ; [.3A64.0020.0012] # HALFWIDTH HANGUL LETTER MIEUM +3212 ; [*0310.0020.0004][.3A64.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL MIEUM A +3272 ; [.3A64.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL MIEUM A +1107 ; [.3A65.0020.0002] # HANGUL CHOSEONG PIEUP +3142 ; [.3A65.0020.0004] # HANGUL LETTER PIEUP +3205 ; [*0310.0020.0004][.3A65.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL PIEUP +3265 ; [.3A65.0020.0006] # CIRCLED HANGUL PIEUP +FFB2 ; [.3A65.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP +3213 ; [*0310.0020.0004][.3A65.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL PIEUP A +3273 ; [.3A65.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL PIEUP A +1108 ; [.3A66.0020.0002] # HANGUL CHOSEONG SSANGPIEUP +3143 ; [.3A66.0020.0004] # HANGUL LETTER SSANGPIEUP +FFB3 ; [.3A66.0020.0012] # HALFWIDTH HANGUL LETTER SSANGPIEUP +1109 ; [.3A67.0020.0002] # HANGUL CHOSEONG SIOS +3145 ; [.3A67.0020.0004] # HANGUL LETTER SIOS +3206 ; [*0310.0020.0004][.3A67.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL SIOS +3266 ; [.3A67.0020.0006] # CIRCLED HANGUL SIOS +FFB5 ; [.3A67.0020.0012] # HALFWIDTH HANGUL LETTER SIOS +3214 ; [*0310.0020.0004][.3A67.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL SIOS A +3274 ; [.3A67.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL SIOS A +110A ; [.3A68.0020.0002] # HANGUL CHOSEONG SSANGSIOS +3146 ; [.3A68.0020.0004] # HANGUL LETTER SSANGSIOS +FFB6 ; [.3A68.0020.0012] # HALFWIDTH HANGUL LETTER SSANGSIOS +110B ; [.3A69.0020.0002] # HANGUL CHOSEONG IEUNG +3147 ; [.3A69.0020.0004] # HANGUL LETTER IEUNG +3207 ; [*0310.0020.0004][.3A69.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL IEUNG +3267 ; [.3A69.0020.0006] # CIRCLED HANGUL IEUNG +FFB7 ; [.3A69.0020.0012] # HALFWIDTH HANGUL LETTER IEUNG +3215 ; [*0310.0020.0004][.3A69.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL IEUNG A +3275 ; [.3A69.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL IEUNG A +321D ; [*0310.0020.0004][.3A69.0020.0004][.3AE4.0020.0004][.3A6A.0020.0004][.3AE0.0020.0004][.3B3D.0020.0004][*0311.0020.0004] # PARENTHESIZED KOREAN CHARACTER OJEON +321E ; [*0310.0020.0004][.3A69.0020.0004][.3AE4.0020.0004][.3A70.0020.0004][.3AE9.0020.0004][*0311.0020.0004] # PARENTHESIZED KOREAN CHARACTER O HU +327E ; [.3A69.0020.0006][.3AE9.0020.0006] # CIRCLED HANGUL IEUNG U +110C ; [.3A6A.0020.0002] # HANGUL CHOSEONG CIEUC +3148 ; [.3A6A.0020.0004] # HANGUL LETTER CIEUC +3208 ; [*0310.0020.0004][.3A6A.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CIEUC +3268 ; [.3A6A.0020.0006] # CIRCLED HANGUL CIEUC +FFB8 ; [.3A6A.0020.0012] # HALFWIDTH HANGUL LETTER CIEUC +3216 ; [*0310.0020.0004][.3A6A.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CIEUC A +3276 ; [.3A6A.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL CIEUC A +321C ; [*0310.0020.0004][.3A6A.0020.0004][.3AE9.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CIEUC U +327D ; [.3A6A.0020.0006][.3AE9.0020.0006][.3A69.0020.0006][.3AEF.0020.0006] # CIRCLED KOREAN CHARACTER JUEUI +110D ; [.3A6B.0020.0002] # HANGUL CHOSEONG SSANGCIEUC +3149 ; [.3A6B.0020.0004] # HANGUL LETTER SSANGCIEUC +FFB9 ; [.3A6B.0020.0012] # HALFWIDTH HANGUL LETTER SSANGCIEUC +110E ; [.3A6C.0020.0002] # HANGUL CHOSEONG CHIEUCH +314A ; [.3A6C.0020.0004] # HANGUL LETTER CHIEUCH +3209 ; [*0310.0020.0004][.3A6C.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CHIEUCH +3269 ; [.3A6C.0020.0006] # CIRCLED HANGUL CHIEUCH +FFBA ; [.3A6C.0020.0012] # HALFWIDTH HANGUL LETTER CHIEUCH +3217 ; [*0310.0020.0004][.3A6C.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CHIEUCH A +3277 ; [.3A6C.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL CHIEUCH A +327C ; [.3A6C.0020.0006][.3ADC.0020.0006][.3B49.0020.0006][.3A5E.0020.0006][.3AE4.0020.0006] # CIRCLED KOREAN CHARACTER CHAMKO +110F ; [.3A6D.0020.0002] # HANGUL CHOSEONG KHIEUKH +314B ; [.3A6D.0020.0004] # HANGUL LETTER KHIEUKH +320A ; [*0310.0020.0004][.3A6D.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL KHIEUKH +326A ; [.3A6D.0020.0006] # CIRCLED HANGUL KHIEUKH +FFBB ; [.3A6D.0020.0012] # HALFWIDTH HANGUL LETTER KHIEUKH +3218 ; [*0310.0020.0004][.3A6D.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL KHIEUKH A +3278 ; [.3A6D.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL KHIEUKH A +1110 ; [.3A6E.0020.0002] # HANGUL CHOSEONG THIEUTH +314C ; [.3A6E.0020.0004] # HANGUL LETTER THIEUTH +320B ; [*0310.0020.0004][.3A6E.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL THIEUTH +326B ; [.3A6E.0020.0006] # CIRCLED HANGUL THIEUTH +FFBC ; [.3A6E.0020.0012] # HALFWIDTH HANGUL LETTER THIEUTH +3219 ; [*0310.0020.0004][.3A6E.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL THIEUTH A +3279 ; [.3A6E.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL THIEUTH A +1111 ; [.3A6F.0020.0002] # HANGUL CHOSEONG PHIEUPH +314D ; [.3A6F.0020.0004] # HANGUL LETTER PHIEUPH +320C ; [*0310.0020.0004][.3A6F.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL PHIEUPH +326C ; [.3A6F.0020.0006] # CIRCLED HANGUL PHIEUPH +FFBD ; [.3A6F.0020.0012] # HALFWIDTH HANGUL LETTER PHIEUPH +321A ; [*0310.0020.0004][.3A6F.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL PHIEUPH A +327A ; [.3A6F.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL PHIEUPH A +1112 ; [.3A70.0020.0002] # HANGUL CHOSEONG HIEUH +314E ; [.3A70.0020.0004] # HANGUL LETTER HIEUH +320D ; [*0310.0020.0004][.3A70.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL HIEUH +326D ; [.3A70.0020.0006] # CIRCLED HANGUL HIEUH +FFBE ; [.3A70.0020.0012] # HALFWIDTH HANGUL LETTER HIEUH +321B ; [*0310.0020.0004][.3A70.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL HIEUH A +327B ; [.3A70.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL HIEUH A +1113 ; [.3A71.0020.0002] # HANGUL CHOSEONG NIEUN-KIYEOK +1114 ; [.3A72.0020.0002] # HANGUL CHOSEONG SSANGNIEUN +3165 ; [.3A72.0020.0004] # HANGUL LETTER SSANGNIEUN +1115 ; [.3A73.0020.0002] # HANGUL CHOSEONG NIEUN-TIKEUT +3166 ; [.3A73.0020.0004] # HANGUL LETTER NIEUN-TIKEUT +1116 ; [.3A74.0020.0002] # HANGUL CHOSEONG NIEUN-PIEUP +1117 ; [.3A75.0020.0002] # HANGUL CHOSEONG TIKEUT-KIYEOK +1118 ; [.3A76.0020.0002] # HANGUL CHOSEONG RIEUL-NIEUN +1119 ; [.3A77.0020.0002] # HANGUL CHOSEONG SSANGRIEUL +111A ; [.3A78.0020.0002] # HANGUL CHOSEONG RIEUL-HIEUH +3140 ; [.3A78.0020.0004] # HANGUL LETTER RIEUL-HIEUH +FFB0 ; [.3A78.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH +111B ; [.3A79.0020.0002] # HANGUL CHOSEONG KAPYEOUNRIEUL +111C ; [.3A7A.0020.0002] # HANGUL CHOSEONG MIEUM-PIEUP +316E ; [.3A7A.0020.0004] # HANGUL LETTER MIEUM-PIEUP +111D ; [.3A7B.0020.0002] # HANGUL CHOSEONG KAPYEOUNMIEUM +3171 ; [.3A7B.0020.0004] # HANGUL LETTER KAPYEOUNMIEUM +111E ; [.3A7C.0020.0002] # HANGUL CHOSEONG PIEUP-KIYEOK +3172 ; [.3A7C.0020.0004] # HANGUL LETTER PIEUP-KIYEOK +111F ; [.3A7D.0020.0002] # HANGUL CHOSEONG PIEUP-NIEUN +1120 ; [.3A7E.0020.0002] # HANGUL CHOSEONG PIEUP-TIKEUT +3173 ; [.3A7E.0020.0004] # HANGUL LETTER PIEUP-TIKEUT +1121 ; [.3A7F.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS +3144 ; [.3A7F.0020.0004] # HANGUL LETTER PIEUP-SIOS +FFB4 ; [.3A7F.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP-SIOS +1122 ; [.3A80.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +3174 ; [.3A80.0020.0004] # HANGUL LETTER PIEUP-SIOS-KIYEOK +1123 ; [.3A81.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +3175 ; [.3A81.0020.0004] # HANGUL LETTER PIEUP-SIOS-TIKEUT +1124 ; [.3A82.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP +1125 ; [.3A83.0020.0002] # HANGUL CHOSEONG PIEUP-SSANGSIOS +1126 ; [.3A84.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC +1127 ; [.3A85.0020.0002] # HANGUL CHOSEONG PIEUP-CIEUC +3176 ; [.3A85.0020.0004] # HANGUL LETTER PIEUP-CIEUC +1128 ; [.3A86.0020.0002] # HANGUL CHOSEONG PIEUP-CHIEUCH +1129 ; [.3A87.0020.0002] # HANGUL CHOSEONG PIEUP-THIEUTH +3177 ; [.3A87.0020.0004] # HANGUL LETTER PIEUP-THIEUTH +112A ; [.3A88.0020.0002] # HANGUL CHOSEONG PIEUP-PHIEUPH +112B ; [.3A89.0020.0002] # HANGUL CHOSEONG KAPYEOUNPIEUP +3178 ; [.3A89.0020.0004] # HANGUL LETTER KAPYEOUNPIEUP +112C ; [.3A8A.0020.0002] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +3179 ; [.3A8A.0020.0004] # HANGUL LETTER KAPYEOUNSSANGPIEUP +112D ; [.3A8B.0020.0002] # HANGUL CHOSEONG SIOS-KIYEOK +317A ; [.3A8B.0020.0004] # HANGUL LETTER SIOS-KIYEOK +112E ; [.3A8C.0020.0002] # HANGUL CHOSEONG SIOS-NIEUN +317B ; [.3A8C.0020.0004] # HANGUL LETTER SIOS-NIEUN +112F ; [.3A8D.0020.0002] # HANGUL CHOSEONG SIOS-TIKEUT +317C ; [.3A8D.0020.0004] # HANGUL LETTER SIOS-TIKEUT +1130 ; [.3A8E.0020.0002] # HANGUL CHOSEONG SIOS-RIEUL +1131 ; [.3A8F.0020.0002] # HANGUL CHOSEONG SIOS-MIEUM +1132 ; [.3A90.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP +317D ; [.3A90.0020.0004] # HANGUL LETTER SIOS-PIEUP +1133 ; [.3A91.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +1134 ; [.3A92.0020.0002] # HANGUL CHOSEONG SIOS-SSANGSIOS +1135 ; [.3A93.0020.0002] # HANGUL CHOSEONG SIOS-IEUNG +1136 ; [.3A94.0020.0002] # HANGUL CHOSEONG SIOS-CIEUC +317E ; [.3A94.0020.0004] # HANGUL LETTER SIOS-CIEUC +1137 ; [.3A95.0020.0002] # HANGUL CHOSEONG SIOS-CHIEUCH +1138 ; [.3A96.0020.0002] # HANGUL CHOSEONG SIOS-KHIEUKH +1139 ; [.3A97.0020.0002] # HANGUL CHOSEONG SIOS-THIEUTH +113A ; [.3A98.0020.0002] # HANGUL CHOSEONG SIOS-PHIEUPH +113B ; [.3A99.0020.0002] # HANGUL CHOSEONG SIOS-HIEUH +113C ; [.3A9A.0020.0002] # HANGUL CHOSEONG CHITUEUMSIOS +113D ; [.3A9B.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGSIOS +113E ; [.3A9C.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSIOS +113F ; [.3A9D.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +1140 ; [.3A9E.0020.0002] # HANGUL CHOSEONG PANSIOS +317F ; [.3A9E.0020.0004] # HANGUL LETTER PANSIOS +1141 ; [.3A9F.0020.0002] # HANGUL CHOSEONG IEUNG-KIYEOK +1142 ; [.3AA0.0020.0002] # HANGUL CHOSEONG IEUNG-TIKEUT +1143 ; [.3AA1.0020.0002] # HANGUL CHOSEONG IEUNG-MIEUM +1144 ; [.3AA2.0020.0002] # HANGUL CHOSEONG IEUNG-PIEUP +1145 ; [.3AA3.0020.0002] # HANGUL CHOSEONG IEUNG-SIOS +1146 ; [.3AA4.0020.0002] # HANGUL CHOSEONG IEUNG-PANSIOS +1147 ; [.3AA5.0020.0002] # HANGUL CHOSEONG SSANGIEUNG +3180 ; [.3AA5.0020.0004] # HANGUL LETTER SSANGIEUNG +1148 ; [.3AA6.0020.0002] # HANGUL CHOSEONG IEUNG-CIEUC +1149 ; [.3AA7.0020.0002] # HANGUL CHOSEONG IEUNG-CHIEUCH +114A ; [.3AA8.0020.0002] # HANGUL CHOSEONG IEUNG-THIEUTH +114B ; [.3AA9.0020.0002] # HANGUL CHOSEONG IEUNG-PHIEUPH +114C ; [.3AAA.0020.0002] # HANGUL CHOSEONG YESIEUNG +3181 ; [.3AAA.0020.0004] # HANGUL LETTER YESIEUNG +114D ; [.3AAB.0020.0002] # HANGUL CHOSEONG CIEUC-IEUNG +114E ; [.3AAC.0020.0002] # HANGUL CHOSEONG CHITUEUMCIEUC +114F ; [.3AAD.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC +1150 ; [.3AAE.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCIEUC +1151 ; [.3AAF.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +1152 ; [.3AB0.0020.0002] # HANGUL CHOSEONG CHIEUCH-KHIEUKH +1153 ; [.3AB1.0020.0002] # HANGUL CHOSEONG CHIEUCH-HIEUH +1154 ; [.3AB2.0020.0002] # HANGUL CHOSEONG CHITUEUMCHIEUCH +1155 ; [.3AB3.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +1156 ; [.3AB4.0020.0002] # HANGUL CHOSEONG PHIEUPH-PIEUP +1157 ; [.3AB5.0020.0002] # HANGUL CHOSEONG KAPYEOUNPHIEUPH +3184 ; [.3AB5.0020.0004] # HANGUL LETTER KAPYEOUNPHIEUPH +1158 ; [.3AB6.0020.0002] # HANGUL CHOSEONG SSANGHIEUH +3185 ; [.3AB6.0020.0004] # HANGUL LETTER SSANGHIEUH +1159 ; [.3AB7.0020.0002] # HANGUL CHOSEONG YEORINHIEUH +3186 ; [.3AB7.0020.0004] # HANGUL LETTER YEORINHIEUH +115A ; [.3AB8.0020.0002] # HANGUL CHOSEONG KIYEOK-TIKEUT +115B ; [.3AB9.0020.0002] # HANGUL CHOSEONG NIEUN-SIOS +115C ; [.3ABA.0020.0002] # HANGUL CHOSEONG NIEUN-CIEUC +115D ; [.3ABB.0020.0002] # HANGUL CHOSEONG NIEUN-HIEUH +115E ; [.3ABC.0020.0002] # HANGUL CHOSEONG TIKEUT-RIEUL +A960 ; [.3ABD.0020.0002] # HANGUL CHOSEONG TIKEUT-MIEUM +A961 ; [.3ABE.0020.0002] # HANGUL CHOSEONG TIKEUT-PIEUP +A962 ; [.3ABF.0020.0002] # HANGUL CHOSEONG TIKEUT-SIOS +A963 ; [.3AC0.0020.0002] # HANGUL CHOSEONG TIKEUT-CIEUC +A964 ; [.3AC1.0020.0002] # HANGUL CHOSEONG RIEUL-KIYEOK +A965 ; [.3AC2.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGKIYEOK +A966 ; [.3AC3.0020.0002] # HANGUL CHOSEONG RIEUL-TIKEUT +A967 ; [.3AC4.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGTIKEUT +A968 ; [.3AC5.0020.0002] # HANGUL CHOSEONG RIEUL-MIEUM +A969 ; [.3AC6.0020.0002] # HANGUL CHOSEONG RIEUL-PIEUP +A96A ; [.3AC7.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGPIEUP +A96B ; [.3AC8.0020.0002] # HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP +A96C ; [.3AC9.0020.0002] # HANGUL CHOSEONG RIEUL-SIOS +A96D ; [.3ACA.0020.0002] # HANGUL CHOSEONG RIEUL-CIEUC +A96E ; [.3ACB.0020.0002] # HANGUL CHOSEONG RIEUL-KHIEUKH +A96F ; [.3ACC.0020.0002] # HANGUL CHOSEONG MIEUM-KIYEOK +A970 ; [.3ACD.0020.0002] # HANGUL CHOSEONG MIEUM-TIKEUT +A971 ; [.3ACE.0020.0002] # HANGUL CHOSEONG MIEUM-SIOS +A972 ; [.3ACF.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-THIEUTH +A973 ; [.3AD0.0020.0002] # HANGUL CHOSEONG PIEUP-KHIEUKH +A974 ; [.3AD1.0020.0002] # HANGUL CHOSEONG PIEUP-HIEUH +A975 ; [.3AD2.0020.0002] # HANGUL CHOSEONG SSANGSIOS-PIEUP +A976 ; [.3AD3.0020.0002] # HANGUL CHOSEONG IEUNG-RIEUL +A977 ; [.3AD4.0020.0002] # HANGUL CHOSEONG IEUNG-HIEUH +A978 ; [.3AD5.0020.0002] # HANGUL CHOSEONG SSANGCIEUC-HIEUH +A979 ; [.3AD6.0020.0002] # HANGUL CHOSEONG SSANGTHIEUTH +A97A ; [.3AD7.0020.0002] # HANGUL CHOSEONG PHIEUPH-HIEUH +A97B ; [.3AD8.0020.0002] # HANGUL CHOSEONG HIEUH-SIOS +A97C ; [.3AD9.0020.0002] # HANGUL CHOSEONG SSANGYEORINHIEUH +115F ; [.3ADA.0020.0002] # HANGUL CHOSEONG FILLER +1160 ; [.3ADB.0020.0002] # HANGUL JUNGSEONG FILLER +3164 ; [.3ADB.0020.0004] # HANGUL FILLER +FFA0 ; [.3ADB.0020.0012] # HALFWIDTH HANGUL FILLER +1161 ; [.3ADC.0020.0002] # HANGUL JUNGSEONG A +314F ; [.3ADC.0020.0004] # HANGUL LETTER A +FFC2 ; [.3ADC.0020.0012] # HALFWIDTH HANGUL LETTER A +1162 ; [.3ADD.0020.0002] # HANGUL JUNGSEONG AE +3150 ; [.3ADD.0020.0004] # HANGUL LETTER AE +FFC3 ; [.3ADD.0020.0012] # HALFWIDTH HANGUL LETTER AE +1163 ; [.3ADE.0020.0002] # HANGUL JUNGSEONG YA +3151 ; [.3ADE.0020.0004] # HANGUL LETTER YA +FFC4 ; [.3ADE.0020.0012] # HALFWIDTH HANGUL LETTER YA +1164 ; [.3ADF.0020.0002] # HANGUL JUNGSEONG YAE +3152 ; [.3ADF.0020.0004] # HANGUL LETTER YAE +FFC5 ; [.3ADF.0020.0012] # HALFWIDTH HANGUL LETTER YAE +1165 ; [.3AE0.0020.0002] # HANGUL JUNGSEONG EO +3153 ; [.3AE0.0020.0004] # HANGUL LETTER EO +FFC6 ; [.3AE0.0020.0012] # HALFWIDTH HANGUL LETTER EO +1166 ; [.3AE1.0020.0002] # HANGUL JUNGSEONG E +3154 ; [.3AE1.0020.0004] # HANGUL LETTER E +FFC7 ; [.3AE1.0020.0012] # HALFWIDTH HANGUL LETTER E +1167 ; [.3AE2.0020.0002] # HANGUL JUNGSEONG YEO +3155 ; [.3AE2.0020.0004] # HANGUL LETTER YEO +FFCA ; [.3AE2.0020.0012] # HALFWIDTH HANGUL LETTER YEO +1168 ; [.3AE3.0020.0002] # HANGUL JUNGSEONG YE +3156 ; [.3AE3.0020.0004] # HANGUL LETTER YE +FFCB ; [.3AE3.0020.0012] # HALFWIDTH HANGUL LETTER YE +1169 ; [.3AE4.0020.0002] # HANGUL JUNGSEONG O +3157 ; [.3AE4.0020.0004] # HANGUL LETTER O +FFCC ; [.3AE4.0020.0012] # HALFWIDTH HANGUL LETTER O +116A ; [.3AE5.0020.0002] # HANGUL JUNGSEONG WA +3158 ; [.3AE5.0020.0004] # HANGUL LETTER WA +FFCD ; [.3AE5.0020.0012] # HALFWIDTH HANGUL LETTER WA +116B ; [.3AE6.0020.0002] # HANGUL JUNGSEONG WAE +3159 ; [.3AE6.0020.0004] # HANGUL LETTER WAE +FFCE ; [.3AE6.0020.0012] # HALFWIDTH HANGUL LETTER WAE +116C ; [.3AE7.0020.0002] # HANGUL JUNGSEONG OE +315A ; [.3AE7.0020.0004] # HANGUL LETTER OE +FFCF ; [.3AE7.0020.0012] # HALFWIDTH HANGUL LETTER OE +116D ; [.3AE8.0020.0002] # HANGUL JUNGSEONG YO +315B ; [.3AE8.0020.0004] # HANGUL LETTER YO +FFD2 ; [.3AE8.0020.0012] # HALFWIDTH HANGUL LETTER YO +116E ; [.3AE9.0020.0002] # HANGUL JUNGSEONG U +315C ; [.3AE9.0020.0004] # HANGUL LETTER U +FFD3 ; [.3AE9.0020.0012] # HALFWIDTH HANGUL LETTER U +116F ; [.3AEA.0020.0002] # HANGUL JUNGSEONG WEO +315D ; [.3AEA.0020.0004] # HANGUL LETTER WEO +FFD4 ; [.3AEA.0020.0012] # HALFWIDTH HANGUL LETTER WEO +1170 ; [.3AEB.0020.0002] # HANGUL JUNGSEONG WE +315E ; [.3AEB.0020.0004] # HANGUL LETTER WE +FFD5 ; [.3AEB.0020.0012] # HALFWIDTH HANGUL LETTER WE +1171 ; [.3AEC.0020.0002] # HANGUL JUNGSEONG WI +315F ; [.3AEC.0020.0004] # HANGUL LETTER WI +FFD6 ; [.3AEC.0020.0012] # HALFWIDTH HANGUL LETTER WI +1172 ; [.3AED.0020.0002] # HANGUL JUNGSEONG YU +3160 ; [.3AED.0020.0004] # HANGUL LETTER YU +FFD7 ; [.3AED.0020.0012] # HALFWIDTH HANGUL LETTER YU +1173 ; [.3AEE.0020.0002] # HANGUL JUNGSEONG EU +3161 ; [.3AEE.0020.0004] # HANGUL LETTER EU +FFDA ; [.3AEE.0020.0012] # HALFWIDTH HANGUL LETTER EU +1174 ; [.3AEF.0020.0002] # HANGUL JUNGSEONG YI +3162 ; [.3AEF.0020.0004] # HANGUL LETTER YI +FFDB ; [.3AEF.0020.0012] # HALFWIDTH HANGUL LETTER YI +1175 ; [.3AF0.0020.0002] # HANGUL JUNGSEONG I +3163 ; [.3AF0.0020.0004] # HANGUL LETTER I +FFDC ; [.3AF0.0020.0012] # HALFWIDTH HANGUL LETTER I +1176 ; [.3AF1.0020.0002] # HANGUL JUNGSEONG A-O +1177 ; [.3AF2.0020.0002] # HANGUL JUNGSEONG A-U +1178 ; [.3AF3.0020.0002] # HANGUL JUNGSEONG YA-O +1179 ; [.3AF4.0020.0002] # HANGUL JUNGSEONG YA-YO +117A ; [.3AF5.0020.0002] # HANGUL JUNGSEONG EO-O +117B ; [.3AF6.0020.0002] # HANGUL JUNGSEONG EO-U +117C ; [.3AF7.0020.0002] # HANGUL JUNGSEONG EO-EU +117D ; [.3AF8.0020.0002] # HANGUL JUNGSEONG YEO-O +117E ; [.3AF9.0020.0002] # HANGUL JUNGSEONG YEO-U +117F ; [.3AFA.0020.0002] # HANGUL JUNGSEONG O-EO +1180 ; [.3AFB.0020.0002] # HANGUL JUNGSEONG O-E +1181 ; [.3AFC.0020.0002] # HANGUL JUNGSEONG O-YE +1182 ; [.3AFD.0020.0002] # HANGUL JUNGSEONG O-O +1183 ; [.3AFE.0020.0002] # HANGUL JUNGSEONG O-U +1184 ; [.3AFF.0020.0002] # HANGUL JUNGSEONG YO-YA +3187 ; [.3AFF.0020.0004] # HANGUL LETTER YO-YA +1185 ; [.3B00.0020.0002] # HANGUL JUNGSEONG YO-YAE +3188 ; [.3B00.0020.0004] # HANGUL LETTER YO-YAE +1186 ; [.3B01.0020.0002] # HANGUL JUNGSEONG YO-YEO +1187 ; [.3B02.0020.0002] # HANGUL JUNGSEONG YO-O +1188 ; [.3B03.0020.0002] # HANGUL JUNGSEONG YO-I +3189 ; [.3B03.0020.0004] # HANGUL LETTER YO-I +1189 ; [.3B04.0020.0002] # HANGUL JUNGSEONG U-A +118A ; [.3B05.0020.0002] # HANGUL JUNGSEONG U-AE +118B ; [.3B06.0020.0002] # HANGUL JUNGSEONG U-EO-EU +118C ; [.3B07.0020.0002] # HANGUL JUNGSEONG U-YE +118D ; [.3B08.0020.0002] # HANGUL JUNGSEONG U-U +118E ; [.3B09.0020.0002] # HANGUL JUNGSEONG YU-A +118F ; [.3B0A.0020.0002] # HANGUL JUNGSEONG YU-EO +1190 ; [.3B0B.0020.0002] # HANGUL JUNGSEONG YU-E +1191 ; [.3B0C.0020.0002] # HANGUL JUNGSEONG YU-YEO +318A ; [.3B0C.0020.0004] # HANGUL LETTER YU-YEO +1192 ; [.3B0D.0020.0002] # HANGUL JUNGSEONG YU-YE +318B ; [.3B0D.0020.0004] # HANGUL LETTER YU-YE +1193 ; [.3B0E.0020.0002] # HANGUL JUNGSEONG YU-U +1194 ; [.3B0F.0020.0002] # HANGUL JUNGSEONG YU-I +318C ; [.3B0F.0020.0004] # HANGUL LETTER YU-I +1195 ; [.3B10.0020.0002] # HANGUL JUNGSEONG EU-U +1196 ; [.3B11.0020.0002] # HANGUL JUNGSEONG EU-EU +1197 ; [.3B12.0020.0002] # HANGUL JUNGSEONG YI-U +1198 ; [.3B13.0020.0002] # HANGUL JUNGSEONG I-A +1199 ; [.3B14.0020.0002] # HANGUL JUNGSEONG I-YA +119A ; [.3B15.0020.0002] # HANGUL JUNGSEONG I-O +119B ; [.3B16.0020.0002] # HANGUL JUNGSEONG I-U +119C ; [.3B17.0020.0002] # HANGUL JUNGSEONG I-EU +119D ; [.3B18.0020.0002] # HANGUL JUNGSEONG I-ARAEA +119E ; [.3B19.0020.0002] # HANGUL JUNGSEONG ARAEA +318D ; [.3B19.0020.0004] # HANGUL LETTER ARAEA +119F ; [.3B1A.0020.0002] # HANGUL JUNGSEONG ARAEA-EO +11A0 ; [.3B1B.0020.0002] # HANGUL JUNGSEONG ARAEA-U +11A1 ; [.3B1C.0020.0002] # HANGUL JUNGSEONG ARAEA-I +318E ; [.3B1C.0020.0004] # HANGUL LETTER ARAEAE +11A2 ; [.3B1D.0020.0002] # HANGUL JUNGSEONG SSANGARAEA +11A3 ; [.3B1E.0020.0002] # HANGUL JUNGSEONG A-EU +11A4 ; [.3B1F.0020.0002] # HANGUL JUNGSEONG YA-U +11A5 ; [.3B20.0020.0002] # HANGUL JUNGSEONG YEO-YA +11A6 ; [.3B21.0020.0002] # HANGUL JUNGSEONG O-YA +11A7 ; [.3B22.0020.0002] # HANGUL JUNGSEONG O-YAE +D7B0 ; [.3B23.0020.0002] # HANGUL JUNGSEONG O-YEO +D7B1 ; [.3B24.0020.0002] # HANGUL JUNGSEONG O-O-I +D7B2 ; [.3B25.0020.0002] # HANGUL JUNGSEONG YO-A +D7B3 ; [.3B26.0020.0002] # HANGUL JUNGSEONG YO-AE +D7B4 ; [.3B27.0020.0002] # HANGUL JUNGSEONG YO-EO +D7B5 ; [.3B28.0020.0002] # HANGUL JUNGSEONG U-YEO +D7B6 ; [.3B29.0020.0002] # HANGUL JUNGSEONG U-I-I +D7B7 ; [.3B2A.0020.0002] # HANGUL JUNGSEONG YU-AE +D7B8 ; [.3B2B.0020.0002] # HANGUL JUNGSEONG YU-O +D7B9 ; [.3B2C.0020.0002] # HANGUL JUNGSEONG EU-A +D7BA ; [.3B2D.0020.0002] # HANGUL JUNGSEONG EU-EO +D7BB ; [.3B2E.0020.0002] # HANGUL JUNGSEONG EU-E +D7BC ; [.3B2F.0020.0002] # HANGUL JUNGSEONG EU-O +D7BD ; [.3B30.0020.0002] # HANGUL JUNGSEONG I-YA-O +D7BE ; [.3B31.0020.0002] # HANGUL JUNGSEONG I-YAE +D7BF ; [.3B32.0020.0002] # HANGUL JUNGSEONG I-YEO +D7C0 ; [.3B33.0020.0002] # HANGUL JUNGSEONG I-YE +D7C1 ; [.3B34.0020.0002] # HANGUL JUNGSEONG I-O-I +D7C2 ; [.3B35.0020.0002] # HANGUL JUNGSEONG I-YO +D7C3 ; [.3B36.0020.0002] # HANGUL JUNGSEONG I-YU +D7C4 ; [.3B37.0020.0002] # HANGUL JUNGSEONG I-I +D7C5 ; [.3B38.0020.0002] # HANGUL JUNGSEONG ARAEA-A +D7C6 ; [.3B39.0020.0002] # HANGUL JUNGSEONG ARAEA-E +11A8 ; [.3B3A.0020.0002] # HANGUL JONGSEONG KIYEOK +11A9 ; [.3B3B.0020.0002] # HANGUL JONGSEONG SSANGKIYEOK +11AA ; [.3B3C.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS +3133 ; [.3B3C.0020.0004] # HANGUL LETTER KIYEOK-SIOS +FFA3 ; [.3B3C.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS +11AB ; [.3B3D.0020.0002] # HANGUL JONGSEONG NIEUN +11AC ; [.3B3E.0020.0002] # HANGUL JONGSEONG NIEUN-CIEUC +3135 ; [.3B3E.0020.0004] # HANGUL LETTER NIEUN-CIEUC +FFA5 ; [.3B3E.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC +11AD ; [.3B3F.0020.0002] # HANGUL JONGSEONG NIEUN-HIEUH +3136 ; [.3B3F.0020.0004] # HANGUL LETTER NIEUN-HIEUH +FFA6 ; [.3B3F.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH +11AE ; [.3B40.0020.0002] # HANGUL JONGSEONG TIKEUT +11AF ; [.3B41.0020.0002] # HANGUL JONGSEONG RIEUL +11B0 ; [.3B42.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK +313A ; [.3B42.0020.0004] # HANGUL LETTER RIEUL-KIYEOK +FFAA ; [.3B42.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +11B1 ; [.3B43.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM +313B ; [.3B43.0020.0004] # HANGUL LETTER RIEUL-MIEUM +FFAB ; [.3B43.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM +11B2 ; [.3B44.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP +313C ; [.3B44.0020.0004] # HANGUL LETTER RIEUL-PIEUP +FFAC ; [.3B44.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP +11B3 ; [.3B45.0020.0002] # HANGUL JONGSEONG RIEUL-SIOS +313D ; [.3B45.0020.0004] # HANGUL LETTER RIEUL-SIOS +FFAD ; [.3B45.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-SIOS +11B4 ; [.3B46.0020.0002] # HANGUL JONGSEONG RIEUL-THIEUTH +313E ; [.3B46.0020.0004] # HANGUL LETTER RIEUL-THIEUTH +FFAE ; [.3B46.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +11B5 ; [.3B47.0020.0002] # HANGUL JONGSEONG RIEUL-PHIEUPH +313F ; [.3B47.0020.0004] # HANGUL LETTER RIEUL-PHIEUPH +FFAF ; [.3B47.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +11B6 ; [.3B48.0020.0002] # HANGUL JONGSEONG RIEUL-HIEUH +11B7 ; [.3B49.0020.0002] # HANGUL JONGSEONG MIEUM +11B8 ; [.3B4A.0020.0002] # HANGUL JONGSEONG PIEUP +11B9 ; [.3B4B.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS +11BA ; [.3B4C.0020.0002] # HANGUL JONGSEONG SIOS +11BB ; [.3B4D.0020.0002] # HANGUL JONGSEONG SSANGSIOS +11BC ; [.3B4E.0020.0002] # HANGUL JONGSEONG IEUNG +11BD ; [.3B4F.0020.0002] # HANGUL JONGSEONG CIEUC +11BE ; [.3B50.0020.0002] # HANGUL JONGSEONG CHIEUCH +11BF ; [.3B51.0020.0002] # HANGUL JONGSEONG KHIEUKH +11C0 ; [.3B52.0020.0002] # HANGUL JONGSEONG THIEUTH +11C1 ; [.3B53.0020.0002] # HANGUL JONGSEONG PHIEUPH +11C2 ; [.3B54.0020.0002] # HANGUL JONGSEONG HIEUH +11C3 ; [.3B55.0020.0002] # HANGUL JONGSEONG KIYEOK-RIEUL +11C4 ; [.3B56.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +11C5 ; [.3B57.0020.0002] # HANGUL JONGSEONG NIEUN-KIYEOK +11C6 ; [.3B58.0020.0002] # HANGUL JONGSEONG NIEUN-TIKEUT +11C7 ; [.3B59.0020.0002] # HANGUL JONGSEONG NIEUN-SIOS +3167 ; [.3B59.0020.0004] # HANGUL LETTER NIEUN-SIOS +11C8 ; [.3B5A.0020.0002] # HANGUL JONGSEONG NIEUN-PANSIOS +3168 ; [.3B5A.0020.0004] # HANGUL LETTER NIEUN-PANSIOS +11C9 ; [.3B5B.0020.0002] # HANGUL JONGSEONG NIEUN-THIEUTH +11CA ; [.3B5C.0020.0002] # HANGUL JONGSEONG TIKEUT-KIYEOK +11CB ; [.3B5D.0020.0002] # HANGUL JONGSEONG TIKEUT-RIEUL +11CC ; [.3B5E.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +3169 ; [.3B5E.0020.0004] # HANGUL LETTER RIEUL-KIYEOK-SIOS +11CD ; [.3B5F.0020.0002] # HANGUL JONGSEONG RIEUL-NIEUN +11CE ; [.3B60.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT +316A ; [.3B60.0020.0004] # HANGUL LETTER RIEUL-TIKEUT +11CF ; [.3B61.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +11D0 ; [.3B62.0020.0002] # HANGUL JONGSEONG SSANGRIEUL +11D1 ; [.3B63.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +11D2 ; [.3B64.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS +11D3 ; [.3B65.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS +316B ; [.3B65.0020.0004] # HANGUL LETTER RIEUL-PIEUP-SIOS +11D4 ; [.3B66.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +11D5 ; [.3B67.0020.0002] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +11D6 ; [.3B68.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGSIOS +11D7 ; [.3B69.0020.0002] # HANGUL JONGSEONG RIEUL-PANSIOS +316C ; [.3B69.0020.0004] # HANGUL LETTER RIEUL-PANSIOS +11D8 ; [.3B6A.0020.0002] # HANGUL JONGSEONG RIEUL-KHIEUKH +11D9 ; [.3B6B.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH +316D ; [.3B6B.0020.0004] # HANGUL LETTER RIEUL-YEORINHIEUH +11DA ; [.3B6C.0020.0002] # HANGUL JONGSEONG MIEUM-KIYEOK +11DB ; [.3B6D.0020.0002] # HANGUL JONGSEONG MIEUM-RIEUL +11DC ; [.3B6E.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP +11DD ; [.3B6F.0020.0002] # HANGUL JONGSEONG MIEUM-SIOS +316F ; [.3B6F.0020.0004] # HANGUL LETTER MIEUM-SIOS +11DE ; [.3B70.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGSIOS +11DF ; [.3B71.0020.0002] # HANGUL JONGSEONG MIEUM-PANSIOS +3170 ; [.3B71.0020.0004] # HANGUL LETTER MIEUM-PANSIOS +11E0 ; [.3B72.0020.0002] # HANGUL JONGSEONG MIEUM-CHIEUCH +11E1 ; [.3B73.0020.0002] # HANGUL JONGSEONG MIEUM-HIEUH +11E2 ; [.3B74.0020.0002] # HANGUL JONGSEONG KAPYEOUNMIEUM +11E3 ; [.3B75.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL +11E4 ; [.3B76.0020.0002] # HANGUL JONGSEONG PIEUP-PHIEUPH +11E5 ; [.3B77.0020.0002] # HANGUL JONGSEONG PIEUP-HIEUH +11E6 ; [.3B78.0020.0002] # HANGUL JONGSEONG KAPYEOUNPIEUP +11E7 ; [.3B79.0020.0002] # HANGUL JONGSEONG SIOS-KIYEOK +11E8 ; [.3B7A.0020.0002] # HANGUL JONGSEONG SIOS-TIKEUT +11E9 ; [.3B7B.0020.0002] # HANGUL JONGSEONG SIOS-RIEUL +11EA ; [.3B7C.0020.0002] # HANGUL JONGSEONG SIOS-PIEUP +11EB ; [.3B7D.0020.0002] # HANGUL JONGSEONG PANSIOS +11EC ; [.3B7E.0020.0002] # HANGUL JONGSEONG IEUNG-KIYEOK +11ED ; [.3B7F.0020.0002] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK +11EE ; [.3B80.0020.0002] # HANGUL JONGSEONG SSANGIEUNG +11EF ; [.3B81.0020.0002] # HANGUL JONGSEONG IEUNG-KHIEUKH +11F0 ; [.3B82.0020.0002] # HANGUL JONGSEONG YESIEUNG +11F1 ; [.3B83.0020.0002] # HANGUL JONGSEONG YESIEUNG-SIOS +3182 ; [.3B83.0020.0004] # HANGUL LETTER YESIEUNG-SIOS +11F2 ; [.3B84.0020.0002] # HANGUL JONGSEONG YESIEUNG-PANSIOS +3183 ; [.3B84.0020.0004] # HANGUL LETTER YESIEUNG-PANSIOS +11F3 ; [.3B85.0020.0002] # HANGUL JONGSEONG PHIEUPH-PIEUP +11F4 ; [.3B86.0020.0002] # HANGUL JONGSEONG KAPYEOUNPHIEUPH +11F5 ; [.3B87.0020.0002] # HANGUL JONGSEONG HIEUH-NIEUN +11F6 ; [.3B88.0020.0002] # HANGUL JONGSEONG HIEUH-RIEUL +11F7 ; [.3B89.0020.0002] # HANGUL JONGSEONG HIEUH-MIEUM +11F8 ; [.3B8A.0020.0002] # HANGUL JONGSEONG HIEUH-PIEUP +11F9 ; [.3B8B.0020.0002] # HANGUL JONGSEONG YEORINHIEUH +11FA ; [.3B8C.0020.0002] # HANGUL JONGSEONG KIYEOK-NIEUN +11FB ; [.3B8D.0020.0002] # HANGUL JONGSEONG KIYEOK-PIEUP +11FC ; [.3B8E.0020.0002] # HANGUL JONGSEONG KIYEOK-CHIEUCH +11FD ; [.3B8F.0020.0002] # HANGUL JONGSEONG KIYEOK-KHIEUKH +11FE ; [.3B90.0020.0002] # HANGUL JONGSEONG KIYEOK-HIEUH +11FF ; [.3B91.0020.0002] # HANGUL JONGSEONG SSANGNIEUN +D7CB ; [.3B92.0020.0002] # HANGUL JONGSEONG NIEUN-RIEUL +D7CC ; [.3B93.0020.0002] # HANGUL JONGSEONG NIEUN-CHIEUCH +D7CD ; [.3B94.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT +D7CE ; [.3B95.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT-PIEUP +D7CF ; [.3B96.0020.0002] # HANGUL JONGSEONG TIKEUT-PIEUP +D7D0 ; [.3B97.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS +D7D1 ; [.3B98.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK +D7D2 ; [.3B99.0020.0002] # HANGUL JONGSEONG TIKEUT-CIEUC +D7D3 ; [.3B9A.0020.0002] # HANGUL JONGSEONG TIKEUT-CHIEUCH +D7D4 ; [.3B9B.0020.0002] # HANGUL JONGSEONG TIKEUT-THIEUTH +D7D5 ; [.3B9C.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGKIYEOK +D7D6 ; [.3B9D.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH +D7D7 ; [.3B9E.0020.0002] # HANGUL JONGSEONG SSANGRIEUL-KHIEUKH +D7D8 ; [.3B9F.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-HIEUH +D7D9 ; [.3BA0.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT +D7DA ; [.3BA1.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH +D7DB ; [.3BA2.0020.0002] # HANGUL JONGSEONG RIEUL-YESIEUNG +D7DC ; [.3BA3.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH +D7DD ; [.3BA4.0020.0002] # HANGUL JONGSEONG KAPYEOUNRIEUL +D7DE ; [.3BA5.0020.0002] # HANGUL JONGSEONG MIEUM-NIEUN +D7DF ; [.3BA6.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGNIEUN +D7E0 ; [.3BA7.0020.0002] # HANGUL JONGSEONG SSANGMIEUM +D7E1 ; [.3BA8.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP-SIOS +D7E2 ; [.3BA9.0020.0002] # HANGUL JONGSEONG MIEUM-CIEUC +D7E3 ; [.3BAA.0020.0002] # HANGUL JONGSEONG PIEUP-TIKEUT +D7E4 ; [.3BAB.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH +D7E5 ; [.3BAC.0020.0002] # HANGUL JONGSEONG PIEUP-MIEUM +D7E6 ; [.3BAD.0020.0002] # HANGUL JONGSEONG SSANGPIEUP +D7E7 ; [.3BAE.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS-TIKEUT +D7E8 ; [.3BAF.0020.0002] # HANGUL JONGSEONG PIEUP-CIEUC +D7E9 ; [.3BB0.0020.0002] # HANGUL JONGSEONG PIEUP-CHIEUCH +D7EA ; [.3BB1.0020.0002] # HANGUL JONGSEONG SIOS-MIEUM +D7EB ; [.3BB2.0020.0002] # HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP +D7EC ; [.3BB3.0020.0002] # HANGUL JONGSEONG SSANGSIOS-KIYEOK +D7ED ; [.3BB4.0020.0002] # HANGUL JONGSEONG SSANGSIOS-TIKEUT +D7EE ; [.3BB5.0020.0002] # HANGUL JONGSEONG SIOS-PANSIOS +D7EF ; [.3BB6.0020.0002] # HANGUL JONGSEONG SIOS-CIEUC +D7F0 ; [.3BB7.0020.0002] # HANGUL JONGSEONG SIOS-CHIEUCH +D7F1 ; [.3BB8.0020.0002] # HANGUL JONGSEONG SIOS-THIEUTH +D7F2 ; [.3BB9.0020.0002] # HANGUL JONGSEONG SIOS-HIEUH +D7F3 ; [.3BBA.0020.0002] # HANGUL JONGSEONG PANSIOS-PIEUP +D7F4 ; [.3BBB.0020.0002] # HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP +D7F5 ; [.3BBC.0020.0002] # HANGUL JONGSEONG YESIEUNG-MIEUM +D7F6 ; [.3BBD.0020.0002] # HANGUL JONGSEONG YESIEUNG-HIEUH +D7F7 ; [.3BBE.0020.0002] # HANGUL JONGSEONG CIEUC-PIEUP +D7F8 ; [.3BBF.0020.0002] # HANGUL JONGSEONG CIEUC-SSANGPIEUP +D7F9 ; [.3BC0.0020.0002] # HANGUL JONGSEONG SSANGCIEUC +D7FA ; [.3BC1.0020.0002] # HANGUL JONGSEONG PHIEUPH-SIOS +D7FB ; [.3BC2.0020.0002] # HANGUL JONGSEONG PHIEUPH-THIEUTH +3041 ; [.3BC3.0020.000D] # HIRAGANA LETTER SMALL A +3042 ; [.3BC3.0020.000E] # HIRAGANA LETTER A +30A1 ; [.3BC3.0020.000F] # KATAKANA LETTER SMALL A +FF67 ; [.3BC3.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL A +30A2 ; [.3BC3.0020.0011] # KATAKANA LETTER A +FF71 ; [.3BC3.0020.0012] # HALFWIDTH KATAKANA LETTER A +32D0 ; [.3BC3.0020.0013] # CIRCLED KATAKANA A +3303 ; [.3BC3.0020.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE AARU +3300 ; [.3BC3.0020.001C][.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD7.0020.001C] # SQUARE APAATO +3301 ; [.3BC3.0020.001C][.3BED.0020.001C][.3BDF.0020.001C][.3BC3.0020.001C] # SQUARE ARUHUA +3302 ; [.3BC3.0020.001C][.3BF4.0020.001C][.3BE0.0020.001C][.0000.0038.001C][.3BC3.0020.001C] # SQUARE ANPEA +3043 ; [.3BC4.0020.000D] # HIRAGANA LETTER SMALL I +3044 ; [.3BC4.0020.000E] # HIRAGANA LETTER I +30A3 ; [.3BC4.0020.000F] # KATAKANA LETTER SMALL I +FF68 ; [.3BC4.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL I +30A4 ; [.3BC4.0020.0011] # KATAKANA LETTER I +FF72 ; [.3BC4.0020.0012] # HALFWIDTH KATAKANA LETTER I +32D1 ; [.3BC4.0020.0013] # CIRCLED KATAKANA I +3304 ; [.3BC4.0020.001C][.3BD9.0020.001C][.3BF4.0020.001C][.3BCB.0020.001C][.0000.0037.001C] # SQUARE ININGU +3305 ; [.3BC4.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C] # SQUARE INTI +3045 ; [.3BC5.0020.000D] # HIRAGANA LETTER SMALL U +3046 ; [.3BC5.0020.000E] # HIRAGANA LETTER U +30A5 ; [.3BC5.0020.000F] # KATAKANA LETTER SMALL U +FF69 ; [.3BC5.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL U +30A6 ; [.3BC5.0020.0011] # KATAKANA LETTER U +FF73 ; [.3BC5.0020.0012] # HALFWIDTH KATAKANA LETTER U +32D2 ; [.3BC5.0020.0013] # CIRCLED KATAKANA U +3094 ; [.3BC5.0020.000E][.0000.0037.0002] # HIRAGANA LETTER VU +30F4 ; [.3BC5.0020.0011][.0000.0037.0002] # KATAKANA LETTER VU +3306 ; [.3BC5.0020.001C][.3BC8.0020.001C][.3BF4.0020.001C] # SQUARE UON +1B000 ; [.3BC6.0020.0011] # KATAKANA LETTER ARCHAIC E +3047 ; [.3BC7.0020.000D] # HIRAGANA LETTER SMALL E +3048 ; [.3BC7.0020.000E] # HIRAGANA LETTER E +30A7 ; [.3BC7.0020.000F] # KATAKANA LETTER SMALL E +FF6A ; [.3BC7.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL E +30A8 ; [.3BC7.0020.0011] # KATAKANA LETTER E +FF74 ; [.3BC7.0020.0012] # HALFWIDTH KATAKANA LETTER E +32D3 ; [.3BC7.0020.0013] # CIRCLED KATAKANA E +3308 ; [.3BC7.0020.001C][.1B89.0020.001C][.3BC9.0020.001C][.1B89.0020.001C] # SQUARE EEKAA +3307 ; [.3BC7.0020.001C][.3BD0.0020.001C][.3BCB.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.0000.0037.001C] # SQUARE ESUKUUDO +3049 ; [.3BC8.0020.000D] # HIRAGANA LETTER SMALL O +304A ; [.3BC8.0020.000E] # HIRAGANA LETTER O +30A9 ; [.3BC8.0020.000F] # KATAKANA LETTER SMALL O +FF6B ; [.3BC8.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL O +30AA ; [.3BC8.0020.0011] # KATAKANA LETTER O +FF75 ; [.3BC8.0020.0012] # HALFWIDTH KATAKANA LETTER O +32D4 ; [.3BC8.0020.0013] # CIRCLED KATAKANA O +330A ; [.3BC8.0020.001C][.1B89.0020.001C][.3BE4.0020.001C] # SQUARE OOMU +3309 ; [.3BC8.0020.001C][.3BF4.0020.001C][.3BD0.0020.001C] # SQUARE ONSU +3095 ; [.3BC9.0020.000D] # HIRAGANA LETTER SMALL KA +304B ; [.3BC9.0020.000E] # HIRAGANA LETTER KA +30F5 ; [.3BC9.0020.000F] # KATAKANA LETTER SMALL KA +30AB ; [.3BC9.0020.0011] # KATAKANA LETTER KA +FF76 ; [.3BC9.0020.0012] # HALFWIDTH KATAKANA LETTER KA +32D5 ; [.3BC9.0020.0013] # CIRCLED KATAKANA KA +304C ; [.3BC9.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GA +30AC ; [.3BC9.0020.0011][.0000.0037.0002] # KATAKANA LETTER GA +330B ; [.3BC9.0020.001C][.3BC4.0020.001C][.3BEC.0020.001C] # SQUARE KAIRI +330C ; [.3BC9.0020.001C][.3BEB.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] # SQUARE KARATTO +330D ; [.3BC9.0020.001C][.3BEF.0020.001C][.3BEC.0020.001C][.1B89.0020.001C] # SQUARE KARORII +330E ; [.3BC9.0020.001C][.0000.0037.001C][.3BEF.0020.001C][.3BF4.0020.001C] # SQUARE GARON +330F ; [.3BC9.0020.001C][.0000.0037.001C][.3BF4.0020.001C][.3BE2.0020.001C] # SQUARE GANMA +304D ; [.3BCA.0020.000E] # HIRAGANA LETTER KI +30AD ; [.3BCA.0020.0011] # KATAKANA LETTER KI +FF77 ; [.3BCA.0020.0012] # HALFWIDTH KATAKANA LETTER KI +32D6 ; [.3BCA.0020.0013] # CIRCLED KATAKANA KI +304E ; [.3BCA.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GI +30AE ; [.3BCA.0020.0011][.0000.0037.0002] # KATAKANA LETTER GI +3310 ; [.3BCA.0020.001C][.0000.0037.001C][.3BC9.0020.001C][.0000.0037.001C] # SQUARE GIGA +3311 ; [.3BCA.0020.001C][.0000.0037.001C][.3BD9.0020.001C][.1B89.0020.001C] # SQUARE GINII +3312 ; [.3BCA.0020.001C][.3BE8.0020.001C][.3BEC.0020.001C][.1B89.0020.001C] # SQUARE KYURII +3313 ; [.3BCA.0020.001C][.0000.0037.001C][.3BED.0020.001C][.3BD3.0020.001C][.0000.0037.001C][.1B89.0020.001C] # SQUARE GIRUDAA +3314 ; [.3BCA.0020.001C][.3BEF.0020.001C] # SQUARE KIRO +3315 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C] # SQUARE KIROGURAMU +3316 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BE5.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] # SQUARE KIROMEETORU +3317 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BF0.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] # SQUARE KIROWATTO +304F ; [.3BCB.0020.000E] # HIRAGANA LETTER KU +31F0 ; [.3BCB.0020.000F] # KATAKANA LETTER SMALL KU +30AF ; [.3BCB.0020.0011] # KATAKANA LETTER KU +FF78 ; [.3BCB.0020.0012] # HALFWIDTH KATAKANA LETTER KU +32D7 ; [.3BCB.0020.0013] # CIRCLED KATAKANA KU +3050 ; [.3BCB.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GU +30B0 ; [.3BCB.0020.0011][.0000.0037.0002] # KATAKANA LETTER GU +3318 ; [.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C] # SQUARE GURAMU +3319 ; [.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C][.3BD7.0020.001C][.3BF4.0020.001C] # SQUARE GURAMUTON +331A ; [.3BCB.0020.001C][.3BED.0020.001C][.3BD1.0020.001C][.0000.0037.001C][.3BC4.0020.001C][.3BEF.0020.001C] # SQUARE KURUZEIRO +331B ; [.3BCB.0020.001C][.3BEF.0020.001C][.1B89.0020.001C][.3BDB.0020.001C] # SQUARE KUROONE +3096 ; [.3BCC.0020.000D] # HIRAGANA LETTER SMALL KE +3051 ; [.3BCC.0020.000E] # HIRAGANA LETTER KE +30F6 ; [.3BCC.0020.000F] # KATAKANA LETTER SMALL KE +30B1 ; [.3BCC.0020.0011] # KATAKANA LETTER KE +FF79 ; [.3BCC.0020.0012] # HALFWIDTH KATAKANA LETTER KE +32D8 ; [.3BCC.0020.0013] # CIRCLED KATAKANA KE +3052 ; [.3BCC.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GE +30B2 ; [.3BCC.0020.0011][.0000.0037.0002] # KATAKANA LETTER GE +331C ; [.3BCC.0020.001C][.1B89.0020.001C][.3BD0.0020.001C] # SQUARE KEESU +3053 ; [.3BCD.0020.000E] # HIRAGANA LETTER KO +30B3 ; [.3BCD.0020.0011] # KATAKANA LETTER KO +FF7A ; [.3BCD.0020.0012] # HALFWIDTH KATAKANA LETTER KO +32D9 ; [.3BCD.0020.0013] # CIRCLED KATAKANA KO +3054 ; [.3BCD.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GO +30B4 ; [.3BCD.0020.0011][.0000.0037.0002] # KATAKANA LETTER GO +331E ; [.3BCD.0020.001C][.1B89.0020.001C][.3BE1.0020.001C][.0000.0038.001C] # SQUARE KOOPO +1F201 ; [.3BCD.0020.001C][.3BCD.0020.001C] # SQUARED KATAKANA KOKO +30FF ; [.3BCD.0020.0016][.3BD7.0020.0016] # KATAKANA DIGRAPH KOTO +331D ; [.3BCD.0020.001C][.3BED.0020.001C][.3BD8.0020.001C] # SQUARE KORUNA +3055 ; [.3BCE.0020.000E] # HIRAGANA LETTER SA +30B5 ; [.3BCE.0020.0011] # KATAKANA LETTER SA +FF7B ; [.3BCE.0020.0012] # HALFWIDTH KATAKANA LETTER SA +32DA ; [.3BCE.0020.0013] # CIRCLED KATAKANA SA +1F202 ; [.3BCE.0020.001C] # SQUARED KATAKANA SA +3056 ; [.3BCE.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZA +30B6 ; [.3BCE.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZA +331F ; [.3BCE.0020.001C][.3BC4.0020.001C][.3BCB.0020.001C][.3BED.0020.001C] # SQUARE SAIKURU +3320 ; [.3BCE.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C][.1B89.0020.001C][.3BE4.0020.001C] # SQUARE SANTIIMU +3057 ; [.3BCF.0020.000E] # HIRAGANA LETTER SI +31F1 ; [.3BCF.0020.000F] # KATAKANA LETTER SMALL SI +30B7 ; [.3BCF.0020.0011] # KATAKANA LETTER SI +FF7C ; [.3BCF.0020.0012] # HALFWIDTH KATAKANA LETTER SI +32DB ; [.3BCF.0020.0013] # CIRCLED KATAKANA SI +3058 ; [.3BCF.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZI +30B8 ; [.3BCF.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZI +3006 ; [.3BCF.0020.0004][.3BE5.0020.0004] # IDEOGRAPHIC CLOSING MARK +3321 ; [.3BCF.0020.001C][.3BEC.0020.001C][.3BF4.0020.001C][.3BCB.0020.001C][.0000.0037.001C] # SQUARE SIRINGU +3059 ; [.3BD0.0020.000E] # HIRAGANA LETTER SU +31F2 ; [.3BD0.0020.000F] # KATAKANA LETTER SMALL SU +30B9 ; [.3BD0.0020.0011] # KATAKANA LETTER SU +FF7D ; [.3BD0.0020.0012] # HALFWIDTH KATAKANA LETTER SU +32DC ; [.3BD0.0020.0013] # CIRCLED KATAKANA SU +305A ; [.3BD0.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZU +30BA ; [.3BD0.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZU +305B ; [.3BD1.0020.000E] # HIRAGANA LETTER SE +30BB ; [.3BD1.0020.0011] # KATAKANA LETTER SE +FF7E ; [.3BD1.0020.0012] # HALFWIDTH KATAKANA LETTER SE +32DD ; [.3BD1.0020.0013] # CIRCLED KATAKANA SE +305C ; [.3BD1.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZE +30BC ; [.3BD1.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZE +3322 ; [.3BD1.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C] # SQUARE SENTI +3323 ; [.3BD1.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] # SQUARE SENTO +305D ; [.3BD2.0020.000E] # HIRAGANA LETTER SO +30BD ; [.3BD2.0020.0011] # KATAKANA LETTER SO +FF7F ; [.3BD2.0020.0012] # HALFWIDTH KATAKANA LETTER SO +32DE ; [.3BD2.0020.0013] # CIRCLED KATAKANA SO +305E ; [.3BD2.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZO +30BE ; [.3BD2.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZO +305F ; [.3BD3.0020.000E] # HIRAGANA LETTER TA +30BF ; [.3BD3.0020.0011] # KATAKANA LETTER TA +FF80 ; [.3BD3.0020.0012] # HALFWIDTH KATAKANA LETTER TA +32DF ; [.3BD3.0020.0013] # CIRCLED KATAKANA TA +3060 ; [.3BD3.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DA +30C0 ; [.3BD3.0020.0011][.0000.0037.0002] # KATAKANA LETTER DA +3324 ; [.3BD3.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BD0.0020.001C] # SQUARE DAASU +3061 ; [.3BD4.0020.000E] # HIRAGANA LETTER TI +30C1 ; [.3BD4.0020.0011] # KATAKANA LETTER TI +FF81 ; [.3BD4.0020.0012] # HALFWIDTH KATAKANA LETTER TI +32E0 ; [.3BD4.0020.0013] # CIRCLED KATAKANA TI +3062 ; [.3BD4.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DI +30C2 ; [.3BD4.0020.0011][.0000.0037.0002] # KATAKANA LETTER DI +3063 ; [.3BD5.0020.000D] # HIRAGANA LETTER SMALL TU +3064 ; [.3BD5.0020.000E] # HIRAGANA LETTER TU +30C3 ; [.3BD5.0020.000F] # KATAKANA LETTER SMALL TU +FF6F ; [.3BD5.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL TU +30C4 ; [.3BD5.0020.0011] # KATAKANA LETTER TU +FF82 ; [.3BD5.0020.0012] # HALFWIDTH KATAKANA LETTER TU +32E1 ; [.3BD5.0020.0013] # CIRCLED KATAKANA TU +3065 ; [.3BD5.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DU +30C5 ; [.3BD5.0020.0011][.0000.0037.0002] # KATAKANA LETTER DU +3066 ; [.3BD6.0020.000E] # HIRAGANA LETTER TE +30C6 ; [.3BD6.0020.0011] # KATAKANA LETTER TE +FF83 ; [.3BD6.0020.0012] # HALFWIDTH KATAKANA LETTER TE +32E2 ; [.3BD6.0020.0013] # CIRCLED KATAKANA TE +3067 ; [.3BD6.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DE +30C7 ; [.3BD6.0020.0011][.0000.0037.0002] # KATAKANA LETTER DE +1F213 ; [.3BD6.0020.001C][.0000.0037.001C] # SQUARED KATAKANA DE +3325 ; [.3BD6.0020.001C][.0000.0037.001C][.3BCF.0020.001C] # SQUARE DESI +3068 ; [.3BD7.0020.000E] # HIRAGANA LETTER TO +31F3 ; [.3BD7.0020.000F] # KATAKANA LETTER SMALL TO +30C8 ; [.3BD7.0020.0011] # KATAKANA LETTER TO +FF84 ; [.3BD7.0020.0012] # HALFWIDTH KATAKANA LETTER TO +32E3 ; [.3BD7.0020.0013] # CIRCLED KATAKANA TO +3069 ; [.3BD7.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DO +30C9 ; [.3BD7.0020.0011][.0000.0037.0002] # KATAKANA LETTER DO +3326 ; [.3BD7.0020.001C][.0000.0037.001C][.3BED.0020.001C] # SQUARE DORU +3327 ; [.3BD7.0020.001C][.3BF4.0020.001C] # SQUARE TON +306A ; [.3BD8.0020.000E] # HIRAGANA LETTER NA +30CA ; [.3BD8.0020.0011] # KATAKANA LETTER NA +FF85 ; [.3BD8.0020.0012] # HALFWIDTH KATAKANA LETTER NA +32E4 ; [.3BD8.0020.0013] # CIRCLED KATAKANA NA +3328 ; [.3BD8.0020.001C][.3BDC.0020.001C] # SQUARE NANO +306B ; [.3BD9.0020.000E] # HIRAGANA LETTER NI +30CB ; [.3BD9.0020.0011] # KATAKANA LETTER NI +FF86 ; [.3BD9.0020.0012] # HALFWIDTH KATAKANA LETTER NI +32E5 ; [.3BD9.0020.0013] # CIRCLED KATAKANA NI +306C ; [.3BDA.0020.000E] # HIRAGANA LETTER NU +31F4 ; [.3BDA.0020.000F] # KATAKANA LETTER SMALL NU +30CC ; [.3BDA.0020.0011] # KATAKANA LETTER NU +FF87 ; [.3BDA.0020.0012] # HALFWIDTH KATAKANA LETTER NU +32E6 ; [.3BDA.0020.0013] # CIRCLED KATAKANA NU +306D ; [.3BDB.0020.000E] # HIRAGANA LETTER NE +30CD ; [.3BDB.0020.0011] # KATAKANA LETTER NE +FF88 ; [.3BDB.0020.0012] # HALFWIDTH KATAKANA LETTER NE +32E7 ; [.3BDB.0020.0013] # CIRCLED KATAKANA NE +306E ; [.3BDC.0020.000E] # HIRAGANA LETTER NO +30CE ; [.3BDC.0020.0011] # KATAKANA LETTER NO +FF89 ; [.3BDC.0020.0012] # HALFWIDTH KATAKANA LETTER NO +32E8 ; [.3BDC.0020.0013] # CIRCLED KATAKANA NO +3329 ; [.3BDC.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] # SQUARE NOTTO +306F ; [.3BDD.0020.000E] # HIRAGANA LETTER HA +31F5 ; [.3BDD.0020.000F] # KATAKANA LETTER SMALL HA +30CF ; [.3BDD.0020.0011] # KATAKANA LETTER HA +FF8A ; [.3BDD.0020.0012] # HALFWIDTH KATAKANA LETTER HA +32E9 ; [.3BDD.0020.0013] # CIRCLED KATAKANA HA +3070 ; [.3BDD.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BA +30D0 ; [.3BDD.0020.0011][.0000.0037.0002] # KATAKANA LETTER BA +3071 ; [.3BDD.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PA +30D1 ; [.3BDD.0020.0011][.0000.0038.0002] # KATAKANA LETTER PA +332B ; [.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD1.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] # SQUARE PAASENTO +332C ; [.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD5.0020.001C] # SQUARE PAATU +332D ; [.3BDD.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BEE.0020.001C][.3BED.0020.001C] # SQUARE BAARERU +332A ; [.3BDD.0020.001C][.3BC4.0020.001C][.3BD5.0020.001C] # SQUARE HAITU +3072 ; [.3BDE.0020.000E] # HIRAGANA LETTER HI +31F6 ; [.3BDE.0020.000F] # KATAKANA LETTER SMALL HI +30D2 ; [.3BDE.0020.0011] # KATAKANA LETTER HI +FF8B ; [.3BDE.0020.0012] # HALFWIDTH KATAKANA LETTER HI +32EA ; [.3BDE.0020.0013] # CIRCLED KATAKANA HI +3073 ; [.3BDE.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BI +30D3 ; [.3BDE.0020.0011][.0000.0037.0002] # KATAKANA LETTER BI +3074 ; [.3BDE.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PI +30D4 ; [.3BDE.0020.0011][.0000.0038.0002] # KATAKANA LETTER PI +332E ; [.3BDE.0020.001C][.0000.0038.001C][.3BC3.0020.001C][.3BD0.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] # SQUARE PIASUTORU +332F ; [.3BDE.0020.001C][.0000.0038.001C][.3BCB.0020.001C][.3BED.0020.001C] # SQUARE PIKURU +3330 ; [.3BDE.0020.001C][.0000.0038.001C][.3BCD.0020.001C] # SQUARE PIKO +3331 ; [.3BDE.0020.001C][.0000.0037.001C][.3BED.0020.001C] # SQUARE BIRU +3075 ; [.3BDF.0020.000E] # HIRAGANA LETTER HU +31F7 ; [.3BDF.0020.000F] # KATAKANA LETTER SMALL HU +30D5 ; [.3BDF.0020.0011] # KATAKANA LETTER HU +FF8C ; [.3BDF.0020.0012] # HALFWIDTH KATAKANA LETTER HU +32EB ; [.3BDF.0020.0013] # CIRCLED KATAKANA HU +3076 ; [.3BDF.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BU +30D6 ; [.3BDF.0020.0011][.0000.0037.0002] # KATAKANA LETTER BU +3077 ; [.3BDF.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PU +30D7 ; [.3BDF.0020.0011][.0000.0038.0002] # KATAKANA LETTER PU +3332 ; [.3BDF.0020.001C][.3BC3.0020.001C][.3BEB.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C][.0000.0037.001C] # SQUARE HUARADDO +3333 ; [.3BDF.0020.001C][.3BC4.0020.001C][.1B89.0020.001C][.3BD7.0020.001C] # SQUARE HUIITO +3334 ; [.3BDF.0020.001C][.0000.0037.001C][.3BD5.0020.001C][.3BCF.0020.001C][.3BC7.0020.001C][.3BED.0020.001C] # SQUARE BUSSYERU +3335 ; [.3BDF.0020.001C][.3BEB.0020.001C][.3BF4.0020.001C] # SQUARE HURAN +3078 ; [.3BE0.0020.000E] # HIRAGANA LETTER HE +31F8 ; [.3BE0.0020.000F] # KATAKANA LETTER SMALL HE +30D8 ; [.3BE0.0020.0011] # KATAKANA LETTER HE +FF8D ; [.3BE0.0020.0012] # HALFWIDTH KATAKANA LETTER HE +32EC ; [.3BE0.0020.0013] # CIRCLED KATAKANA HE +3079 ; [.3BE0.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BE +30D9 ; [.3BE0.0020.0011][.0000.0037.0002] # KATAKANA LETTER BE +307A ; [.3BE0.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PE +30DA ; [.3BE0.0020.0011][.0000.0038.0002] # KATAKANA LETTER PE +333B ; [.3BE0.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BCF.0020.001C][.0000.0037.001C] # SQUARE PEEZI +333C ; [.3BE0.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BD3.0020.001C] # SQUARE BEETA +3336 ; [.3BE0.0020.001C][.3BCB.0020.001C][.3BD3.0020.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE HEKUTAARU +3337 ; [.3BE0.0020.001C][.0000.0038.001C][.3BD2.0020.001C] # SQUARE PESO +3338 ; [.3BE0.0020.001C][.0000.0038.001C][.3BD9.0020.001C][.3BDE.0020.001C] # SQUARE PENIHI +3339 ; [.3BE0.0020.001C][.3BED.0020.001C][.3BD5.0020.001C] # SQUARE HERUTU +333A ; [.3BE0.0020.001C][.0000.0038.001C][.3BF4.0020.001C][.3BD0.0020.001C] # SQUARE PENSU +307B ; [.3BE1.0020.000E] # HIRAGANA LETTER HO +31F9 ; [.3BE1.0020.000F] # KATAKANA LETTER SMALL HO +30DB ; [.3BE1.0020.0011] # KATAKANA LETTER HO +FF8E ; [.3BE1.0020.0012] # HALFWIDTH KATAKANA LETTER HO +32ED ; [.3BE1.0020.0013] # CIRCLED KATAKANA HO +307C ; [.3BE1.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BO +30DC ; [.3BE1.0020.0011][.0000.0037.0002] # KATAKANA LETTER BO +307D ; [.3BE1.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PO +30DD ; [.3BE1.0020.0011][.0000.0038.0002] # KATAKANA LETTER PO +3341 ; [.3BE1.0020.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE HOORU +3342 ; [.3BE1.0020.001C][.1B89.0020.001C][.3BF4.0020.001C] # SQUARE HOON +333D ; [.3BE1.0020.001C][.0000.0038.001C][.3BC4.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] # SQUARE POINTO +1F200 ; [.3BE1.0020.001C][.3BC9.0020.001C] # SQUARE HIRAGANA HOKA +333E ; [.3BE1.0020.001C][.0000.0037.001C][.3BED.0020.001C][.3BD7.0020.001C] # SQUARE BORUTO +333F ; [.3BE1.0020.001C][.3BF4.0020.001C] # SQUARE HON +3340 ; [.3BE1.0020.001C][.0000.0038.001C][.3BF4.0020.001C][.3BD7.0020.001C][.0000.0037.001C] # SQUARE PONDO +307E ; [.3BE2.0020.000E] # HIRAGANA LETTER MA +30DE ; [.3BE2.0020.0011] # KATAKANA LETTER MA +FF8F ; [.3BE2.0020.0012] # HALFWIDTH KATAKANA LETTER MA +32EE ; [.3BE2.0020.0013] # CIRCLED KATAKANA MA +3343 ; [.3BE2.0020.001C][.3BC4.0020.001C][.3BCB.0020.001C][.3BEF.0020.001C] # SQUARE MAIKURO +3344 ; [.3BE2.0020.001C][.3BC4.0020.001C][.3BED.0020.001C] # SQUARE MAIRU +303C ; [.3BE2.0020.0004][.3BD0.0020.0004] # MASU MARK +3345 ; [.3BE2.0020.001C][.3BD5.0020.001C][.3BDD.0020.001C] # SQUARE MAHHA +3346 ; [.3BE2.0020.001C][.3BED.0020.001C][.3BCB.0020.001C] # SQUARE MARUKU +3347 ; [.3BE2.0020.001C][.3BF4.0020.001C][.3BCF.0020.001C][.3BEA.0020.001C][.3BF4.0020.001C] # SQUARE MANSYON +307F ; [.3BE3.0020.000E] # HIRAGANA LETTER MI +30DF ; [.3BE3.0020.0011] # KATAKANA LETTER MI +FF90 ; [.3BE3.0020.0012] # HALFWIDTH KATAKANA LETTER MI +32EF ; [.3BE3.0020.0013] # CIRCLED KATAKANA MI +3348 ; [.3BE3.0020.001C][.3BCB.0020.001C][.3BEF.0020.001C][.3BF4.0020.001C] # SQUARE MIKURON +3349 ; [.3BE3.0020.001C][.3BEC.0020.001C] # SQUARE MIRI +334A ; [.3BE3.0020.001C][.3BEC.0020.001C][.3BDD.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE MIRIBAARU +3080 ; [.3BE4.0020.000E] # HIRAGANA LETTER MU +31FA ; [.3BE4.0020.000F] # KATAKANA LETTER SMALL MU +30E0 ; [.3BE4.0020.0011] # KATAKANA LETTER MU +FF91 ; [.3BE4.0020.0012] # HALFWIDTH KATAKANA LETTER MU +32F0 ; [.3BE4.0020.0013] # CIRCLED KATAKANA MU +3081 ; [.3BE5.0020.000E] # HIRAGANA LETTER ME +30E1 ; [.3BE5.0020.0011] # KATAKANA LETTER ME +FF92 ; [.3BE5.0020.0012] # HALFWIDTH KATAKANA LETTER ME +32F1 ; [.3BE5.0020.0013] # CIRCLED KATAKANA ME +334D ; [.3BE5.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] # SQUARE MEETORU +334B ; [.3BE5.0020.001C][.3BC9.0020.001C][.0000.0037.001C] # SQUARE MEGA +334C ; [.3BE5.0020.001C][.3BC9.0020.001C][.0000.0037.001C][.3BD7.0020.001C][.3BF4.0020.001C] # SQUARE MEGATON +3082 ; [.3BE6.0020.000E] # HIRAGANA LETTER MO +30E2 ; [.3BE6.0020.0011] # KATAKANA LETTER MO +FF93 ; [.3BE6.0020.0012] # HALFWIDTH KATAKANA LETTER MO +32F2 ; [.3BE6.0020.0013] # CIRCLED KATAKANA MO +3083 ; [.3BE7.0020.000D] # HIRAGANA LETTER SMALL YA +3084 ; [.3BE7.0020.000E] # HIRAGANA LETTER YA +30E3 ; [.3BE7.0020.000F] # KATAKANA LETTER SMALL YA +FF6C ; [.3BE7.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YA +30E4 ; [.3BE7.0020.0011] # KATAKANA LETTER YA +FF94 ; [.3BE7.0020.0012] # HALFWIDTH KATAKANA LETTER YA +32F3 ; [.3BE7.0020.0013] # CIRCLED KATAKANA YA +334E ; [.3BE7.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.0000.0037.001C] # SQUARE YAADO +334F ; [.3BE7.0020.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE YAARU +3085 ; [.3BE8.0020.000D] # HIRAGANA LETTER SMALL YU +3086 ; [.3BE8.0020.000E] # HIRAGANA LETTER YU +30E5 ; [.3BE8.0020.000F] # KATAKANA LETTER SMALL YU +FF6D ; [.3BE8.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YU +30E6 ; [.3BE8.0020.0011] # KATAKANA LETTER YU +FF95 ; [.3BE8.0020.0012] # HALFWIDTH KATAKANA LETTER YU +32F4 ; [.3BE8.0020.0013] # CIRCLED KATAKANA YU +3350 ; [.3BE8.0020.001C][.3BC3.0020.001C][.3BF4.0020.001C] # SQUARE YUAN +1B001 ; [.3BE9.0020.000E] # HIRAGANA LETTER ARCHAIC YE +3087 ; [.3BEA.0020.000D] # HIRAGANA LETTER SMALL YO +3088 ; [.3BEA.0020.000E] # HIRAGANA LETTER YO +30E7 ; [.3BEA.0020.000F] # KATAKANA LETTER SMALL YO +FF6E ; [.3BEA.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YO +30E8 ; [.3BEA.0020.0011] # KATAKANA LETTER YO +FF96 ; [.3BEA.0020.0012] # HALFWIDTH KATAKANA LETTER YO +32F5 ; [.3BEA.0020.0013] # CIRCLED KATAKANA YO +309F ; [.3BEA.0020.0016][.3BEC.0020.0016] # HIRAGANA DIGRAPH YORI +3089 ; [.3BEB.0020.000E] # HIRAGANA LETTER RA +31FB ; [.3BEB.0020.000F] # KATAKANA LETTER SMALL RA +30E9 ; [.3BEB.0020.0011] # KATAKANA LETTER RA +FF97 ; [.3BEB.0020.0012] # HALFWIDTH KATAKANA LETTER RA +32F6 ; [.3BEB.0020.0013] # CIRCLED KATAKANA RA +308A ; [.3BEC.0020.000E] # HIRAGANA LETTER RI +31FC ; [.3BEC.0020.000F] # KATAKANA LETTER SMALL RI +30EA ; [.3BEC.0020.0011] # KATAKANA LETTER RI +FF98 ; [.3BEC.0020.0012] # HALFWIDTH KATAKANA LETTER RI +32F7 ; [.3BEC.0020.0013] # CIRCLED KATAKANA RI +3351 ; [.3BEC.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] # SQUARE RITTORU +3352 ; [.3BEC.0020.001C][.3BEB.0020.001C] # SQUARE RIRA +308B ; [.3BED.0020.000E] # HIRAGANA LETTER RU +31FD ; [.3BED.0020.000F] # KATAKANA LETTER SMALL RU +30EB ; [.3BED.0020.0011] # KATAKANA LETTER RU +FF99 ; [.3BED.0020.0012] # HALFWIDTH KATAKANA LETTER RU +32F8 ; [.3BED.0020.0013] # CIRCLED KATAKANA RU +3354 ; [.3BED.0020.001C][.1B89.0020.001C][.3BDF.0020.001C][.0000.0037.001C][.3BED.0020.001C] # SQUARE RUUBURU +3353 ; [.3BED.0020.001C][.3BDE.0020.001C][.0000.0038.001C][.1B89.0020.001C] # SQUARE RUPII +308C ; [.3BEE.0020.000E] # HIRAGANA LETTER RE +31FE ; [.3BEE.0020.000F] # KATAKANA LETTER SMALL RE +30EC ; [.3BEE.0020.0011] # KATAKANA LETTER RE +FF9A ; [.3BEE.0020.0012] # HALFWIDTH KATAKANA LETTER RE +32F9 ; [.3BEE.0020.0013] # CIRCLED KATAKANA RE +3355 ; [.3BEE.0020.001C][.3BE4.0020.001C] # SQUARE REMU +3356 ; [.3BEE.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C][.3BCC.0020.001C][.0000.0037.001C][.3BF4.0020.001C] # SQUARE RENTOGEN +308D ; [.3BEF.0020.000E] # HIRAGANA LETTER RO +31FF ; [.3BEF.0020.000F] # KATAKANA LETTER SMALL RO +30ED ; [.3BEF.0020.0011] # KATAKANA LETTER RO +FF9B ; [.3BEF.0020.0012] # HALFWIDTH KATAKANA LETTER RO +32FA ; [.3BEF.0020.0013] # CIRCLED KATAKANA RO +308E ; [.3BF0.0020.000D] # HIRAGANA LETTER SMALL WA +308F ; [.3BF0.0020.000E] # HIRAGANA LETTER WA +30EE ; [.3BF0.0020.000F] # KATAKANA LETTER SMALL WA +30EF ; [.3BF0.0020.0011] # KATAKANA LETTER WA +FF9C ; [.3BF0.0020.0012] # HALFWIDTH KATAKANA LETTER WA +32FB ; [.3BF0.0020.0013] # CIRCLED KATAKANA WA +30F7 ; [.3BF0.0020.0011][.0000.0037.0002] # KATAKANA LETTER VA +3357 ; [.3BF0.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] # SQUARE WATTO +3090 ; [.3BF1.0020.000E] # HIRAGANA LETTER WI +30F0 ; [.3BF1.0020.0011] # KATAKANA LETTER WI +32FC ; [.3BF1.0020.0013] # CIRCLED KATAKANA WI +30F8 ; [.3BF1.0020.0011][.0000.0037.0002] # KATAKANA LETTER VI +3091 ; [.3BF2.0020.000E] # HIRAGANA LETTER WE +30F1 ; [.3BF2.0020.0011] # KATAKANA LETTER WE +32FD ; [.3BF2.0020.0013] # CIRCLED KATAKANA WE +30F9 ; [.3BF2.0020.0011][.0000.0037.0002] # KATAKANA LETTER VE +3092 ; [.3BF3.0020.000E] # HIRAGANA LETTER WO +30F2 ; [.3BF3.0020.0011] # KATAKANA LETTER WO +FF66 ; [.3BF3.0020.0012] # HALFWIDTH KATAKANA LETTER WO +32FE ; [.3BF3.0020.0013] # CIRCLED KATAKANA WO +30FA ; [.3BF3.0020.0011][.0000.0037.0002] # KATAKANA LETTER VO +3093 ; [.3BF4.0020.000E] # HIRAGANA LETTER N +30F3 ; [.3BF4.0020.0011] # KATAKANA LETTER N +FF9D ; [.3BF4.0020.0012] # HALFWIDTH KATAKANA LETTER N +3105 ; [.3BF5.0020.0002] # BOPOMOFO LETTER B +31A0 ; [.3BF5.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER BU +3106 ; [.3BF6.0020.0002] # BOPOMOFO LETTER P +31B4 ; [.3BF6.0020.0019] # BOPOMOFO FINAL LETTER P +3107 ; [.3BF7.0020.0002] # BOPOMOFO LETTER M +3108 ; [.3BF8.0020.0002] # BOPOMOFO LETTER F +312A ; [.3BF9.0020.0002] # BOPOMOFO LETTER V +3109 ; [.3BFA.0020.0002] # BOPOMOFO LETTER D +310A ; [.3BFB.0020.0002] # BOPOMOFO LETTER T +31B5 ; [.3BFB.0020.0019] # BOPOMOFO FINAL LETTER T +310B ; [.3BFC.0020.0002] # BOPOMOFO LETTER N +310C ; [.3BFD.0020.0002] # BOPOMOFO LETTER L +310D ; [.3BFE.0020.0002] # BOPOMOFO LETTER G +31A3 ; [.3BFE.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER GU +310E ; [.3BFF.0020.0002] # BOPOMOFO LETTER K +31B6 ; [.3BFF.0020.0019] # BOPOMOFO FINAL LETTER K +312B ; [.3C00.0020.0002] # BOPOMOFO LETTER NG +31AD ; [.3C01.0020.0002] # BOPOMOFO LETTER NGG +310F ; [.3C02.0020.0002] # BOPOMOFO LETTER H +31B7 ; [.3C02.0020.0019] # BOPOMOFO FINAL LETTER H +3110 ; [.3C03.0020.0002] # BOPOMOFO LETTER J +31A2 ; [.3C03.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER JI +3111 ; [.3C04.0020.0002] # BOPOMOFO LETTER Q +3112 ; [.3C05.0020.0002] # BOPOMOFO LETTER X +312C ; [.3C06.0020.0002] # BOPOMOFO LETTER GN +3113 ; [.3C07.0020.0002] # BOPOMOFO LETTER ZH +3114 ; [.3C08.0020.0002] # BOPOMOFO LETTER CH +3115 ; [.3C09.0020.0002] # BOPOMOFO LETTER SH +3116 ; [.3C0A.0020.0002] # BOPOMOFO LETTER R +3117 ; [.3C0B.0020.0002] # BOPOMOFO LETTER Z +31A1 ; [.3C0B.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER ZI +3118 ; [.3C0C.0020.0002] # BOPOMOFO LETTER C +3119 ; [.3C0D.0020.0002] # BOPOMOFO LETTER S +31B8 ; [.3C0E.0020.0002] # BOPOMOFO LETTER GH +31B9 ; [.3C0F.0020.0002] # BOPOMOFO LETTER LH +31BA ; [.3C10.0020.0002] # BOPOMOFO LETTER ZY +311A ; [.3C11.0020.0002] # BOPOMOFO LETTER A +31A9 ; [.3C11.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER ANN +311B ; [.3C12.0020.0002] # BOPOMOFO LETTER O +31A7 ; [.3C12.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER ONN +31A6 ; [.3C13.0020.0002] # BOPOMOFO LETTER OO +311C ; [.3C14.0020.0002] # BOPOMOFO LETTER E +311D ; [.3C15.0020.0002] # BOPOMOFO LETTER EH +31A4 ; [.3C16.0020.0002] # BOPOMOFO LETTER EE +31A5 ; [.3C16.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER ENN +311E ; [.3C17.0020.0002] # BOPOMOFO LETTER AI +31AE ; [.3C17.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER AINN +311F ; [.3C18.0020.0002] # BOPOMOFO LETTER EI +3120 ; [.3C19.0020.0002] # BOPOMOFO LETTER AU +31AF ; [.3C19.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER AUNN +3121 ; [.3C1A.0020.0002] # BOPOMOFO LETTER OU +3122 ; [.3C1B.0020.0002] # BOPOMOFO LETTER AN +3123 ; [.3C1C.0020.0002] # BOPOMOFO LETTER EN +3124 ; [.3C1D.0020.0002] # BOPOMOFO LETTER ANG +31B2 ; [.3C1E.0020.0002] # BOPOMOFO LETTER ONG +3125 ; [.3C1F.0020.0002] # BOPOMOFO LETTER ENG +31B0 ; [.3C20.0020.0002] # BOPOMOFO LETTER AM +31B1 ; [.3C21.0020.0002] # BOPOMOFO LETTER OM +31AC ; [.3C22.0020.0002] # BOPOMOFO LETTER IM +3126 ; [.3C23.0020.0002] # BOPOMOFO LETTER ER +3127 ; [.3C24.0020.0002] # BOPOMOFO LETTER I +31AA ; [.3C24.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER INN +31B3 ; [.3C24.0020.0016][.0000.010C.0016] # BOPOMOFO LETTER INNN +3128 ; [.3C25.0020.0002] # BOPOMOFO LETTER U +31AB ; [.3C25.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER UNN +31A8 ; [.3C25.0020.0004][.0000.010D.0004] # BOPOMOFO LETTER IR +3129 ; [.3C26.0020.0002] # BOPOMOFO LETTER IU +312D ; [.3C27.0020.0002] # BOPOMOFO LETTER IH +A000 ; [.3C28.0020.0002] # YI SYLLABLE IT +A001 ; [.3C29.0020.0002] # YI SYLLABLE IX +A002 ; [.3C2A.0020.0002] # YI SYLLABLE I +A003 ; [.3C2B.0020.0002] # YI SYLLABLE IP +A004 ; [.3C2C.0020.0002] # YI SYLLABLE IET +A005 ; [.3C2D.0020.0002] # YI SYLLABLE IEX +A006 ; [.3C2E.0020.0002] # YI SYLLABLE IE +A007 ; [.3C2F.0020.0002] # YI SYLLABLE IEP +A008 ; [.3C30.0020.0002] # YI SYLLABLE AT +A009 ; [.3C31.0020.0002] # YI SYLLABLE AX +A00A ; [.3C32.0020.0002] # YI SYLLABLE A +A00B ; [.3C33.0020.0002] # YI SYLLABLE AP +A00C ; [.3C34.0020.0002] # YI SYLLABLE UOX +A00D ; [.3C35.0020.0002] # YI SYLLABLE UO +A00E ; [.3C36.0020.0002] # YI SYLLABLE UOP +A00F ; [.3C37.0020.0002] # YI SYLLABLE OT +A010 ; [.3C38.0020.0002] # YI SYLLABLE OX +A011 ; [.3C39.0020.0002] # YI SYLLABLE O +A012 ; [.3C3A.0020.0002] # YI SYLLABLE OP +A013 ; [.3C3B.0020.0002] # YI SYLLABLE EX +A014 ; [.3C3C.0020.0002] # YI SYLLABLE E +A015 ; [.3C3D.0020.0002] # YI SYLLABLE WU +A016 ; [.3C3E.0020.0002] # YI SYLLABLE BIT +A017 ; [.3C3F.0020.0002] # YI SYLLABLE BIX +A018 ; [.3C40.0020.0002] # YI SYLLABLE BI +A019 ; [.3C41.0020.0002] # YI SYLLABLE BIP +A01A ; [.3C42.0020.0002] # YI SYLLABLE BIET +A01B ; [.3C43.0020.0002] # YI SYLLABLE BIEX +A01C ; [.3C44.0020.0002] # YI SYLLABLE BIE +A01D ; [.3C45.0020.0002] # YI SYLLABLE BIEP +A01E ; [.3C46.0020.0002] # YI SYLLABLE BAT +A01F ; [.3C47.0020.0002] # YI SYLLABLE BAX +A020 ; [.3C48.0020.0002] # YI SYLLABLE BA +A021 ; [.3C49.0020.0002] # YI SYLLABLE BAP +A022 ; [.3C4A.0020.0002] # YI SYLLABLE BUOX +A023 ; [.3C4B.0020.0002] # YI SYLLABLE BUO +A024 ; [.3C4C.0020.0002] # YI SYLLABLE BUOP +A025 ; [.3C4D.0020.0002] # YI SYLLABLE BOT +A026 ; [.3C4E.0020.0002] # YI SYLLABLE BOX +A027 ; [.3C4F.0020.0002] # YI SYLLABLE BO +A028 ; [.3C50.0020.0002] # YI SYLLABLE BOP +A029 ; [.3C51.0020.0002] # YI SYLLABLE BEX +A02A ; [.3C52.0020.0002] # YI SYLLABLE BE +A02B ; [.3C53.0020.0002] # YI SYLLABLE BEP +A02C ; [.3C54.0020.0002] # YI SYLLABLE BUT +A02D ; [.3C55.0020.0002] # YI SYLLABLE BUX +A02E ; [.3C56.0020.0002] # YI SYLLABLE BU +A02F ; [.3C57.0020.0002] # YI SYLLABLE BUP +A030 ; [.3C58.0020.0002] # YI SYLLABLE BURX +A031 ; [.3C59.0020.0002] # YI SYLLABLE BUR +A032 ; [.3C5A.0020.0002] # YI SYLLABLE BYT +A033 ; [.3C5B.0020.0002] # YI SYLLABLE BYX +A034 ; [.3C5C.0020.0002] # YI SYLLABLE BY +A035 ; [.3C5D.0020.0002] # YI SYLLABLE BYP +A036 ; [.3C5E.0020.0002] # YI SYLLABLE BYRX +A037 ; [.3C5F.0020.0002] # YI SYLLABLE BYR +A038 ; [.3C60.0020.0002] # YI SYLLABLE PIT +A039 ; [.3C61.0020.0002] # YI SYLLABLE PIX +A03A ; [.3C62.0020.0002] # YI SYLLABLE PI +A03B ; [.3C63.0020.0002] # YI SYLLABLE PIP +A03C ; [.3C64.0020.0002] # YI SYLLABLE PIEX +A03D ; [.3C65.0020.0002] # YI SYLLABLE PIE +A03E ; [.3C66.0020.0002] # YI SYLLABLE PIEP +A03F ; [.3C67.0020.0002] # YI SYLLABLE PAT +A040 ; [.3C68.0020.0002] # YI SYLLABLE PAX +A041 ; [.3C69.0020.0002] # YI SYLLABLE PA +A042 ; [.3C6A.0020.0002] # YI SYLLABLE PAP +A043 ; [.3C6B.0020.0002] # YI SYLLABLE PUOX +A044 ; [.3C6C.0020.0002] # YI SYLLABLE PUO +A045 ; [.3C6D.0020.0002] # YI SYLLABLE PUOP +A046 ; [.3C6E.0020.0002] # YI SYLLABLE POT +A047 ; [.3C6F.0020.0002] # YI SYLLABLE POX +A048 ; [.3C70.0020.0002] # YI SYLLABLE PO +A049 ; [.3C71.0020.0002] # YI SYLLABLE POP +A04A ; [.3C72.0020.0002] # YI SYLLABLE PUT +A04B ; [.3C73.0020.0002] # YI SYLLABLE PUX +A04C ; [.3C74.0020.0002] # YI SYLLABLE PU +A04D ; [.3C75.0020.0002] # YI SYLLABLE PUP +A04E ; [.3C76.0020.0002] # YI SYLLABLE PURX +A04F ; [.3C77.0020.0002] # YI SYLLABLE PUR +A050 ; [.3C78.0020.0002] # YI SYLLABLE PYT +A051 ; [.3C79.0020.0002] # YI SYLLABLE PYX +A052 ; [.3C7A.0020.0002] # YI SYLLABLE PY +A053 ; [.3C7B.0020.0002] # YI SYLLABLE PYP +A054 ; [.3C7C.0020.0002] # YI SYLLABLE PYRX +A055 ; [.3C7D.0020.0002] # YI SYLLABLE PYR +A056 ; [.3C7E.0020.0002] # YI SYLLABLE BBIT +A057 ; [.3C7F.0020.0002] # YI SYLLABLE BBIX +A058 ; [.3C80.0020.0002] # YI SYLLABLE BBI +A059 ; [.3C81.0020.0002] # YI SYLLABLE BBIP +A05A ; [.3C82.0020.0002] # YI SYLLABLE BBIET +A05B ; [.3C83.0020.0002] # YI SYLLABLE BBIEX +A05C ; [.3C84.0020.0002] # YI SYLLABLE BBIE +A05D ; [.3C85.0020.0002] # YI SYLLABLE BBIEP +A05E ; [.3C86.0020.0002] # YI SYLLABLE BBAT +A05F ; [.3C87.0020.0002] # YI SYLLABLE BBAX +A060 ; [.3C88.0020.0002] # YI SYLLABLE BBA +A061 ; [.3C89.0020.0002] # YI SYLLABLE BBAP +A062 ; [.3C8A.0020.0002] # YI SYLLABLE BBUOX +A063 ; [.3C8B.0020.0002] # YI SYLLABLE BBUO +A064 ; [.3C8C.0020.0002] # YI SYLLABLE BBUOP +A065 ; [.3C8D.0020.0002] # YI SYLLABLE BBOT +A066 ; [.3C8E.0020.0002] # YI SYLLABLE BBOX +A067 ; [.3C8F.0020.0002] # YI SYLLABLE BBO +A068 ; [.3C90.0020.0002] # YI SYLLABLE BBOP +A069 ; [.3C91.0020.0002] # YI SYLLABLE BBEX +A06A ; [.3C92.0020.0002] # YI SYLLABLE BBE +A06B ; [.3C93.0020.0002] # YI SYLLABLE BBEP +A06C ; [.3C94.0020.0002] # YI SYLLABLE BBUT +A06D ; [.3C95.0020.0002] # YI SYLLABLE BBUX +A06E ; [.3C96.0020.0002] # YI SYLLABLE BBU +A06F ; [.3C97.0020.0002] # YI SYLLABLE BBUP +A070 ; [.3C98.0020.0002] # YI SYLLABLE BBURX +A071 ; [.3C99.0020.0002] # YI SYLLABLE BBUR +A072 ; [.3C9A.0020.0002] # YI SYLLABLE BBYT +A073 ; [.3C9B.0020.0002] # YI SYLLABLE BBYX +A074 ; [.3C9C.0020.0002] # YI SYLLABLE BBY +A075 ; [.3C9D.0020.0002] # YI SYLLABLE BBYP +A076 ; [.3C9E.0020.0002] # YI SYLLABLE NBIT +A077 ; [.3C9F.0020.0002] # YI SYLLABLE NBIX +A078 ; [.3CA0.0020.0002] # YI SYLLABLE NBI +A079 ; [.3CA1.0020.0002] # YI SYLLABLE NBIP +A07A ; [.3CA2.0020.0002] # YI SYLLABLE NBIEX +A07B ; [.3CA3.0020.0002] # YI SYLLABLE NBIE +A07C ; [.3CA4.0020.0002] # YI SYLLABLE NBIEP +A07D ; [.3CA5.0020.0002] # YI SYLLABLE NBAT +A07E ; [.3CA6.0020.0002] # YI SYLLABLE NBAX +A07F ; [.3CA7.0020.0002] # YI SYLLABLE NBA +A080 ; [.3CA8.0020.0002] # YI SYLLABLE NBAP +A081 ; [.3CA9.0020.0002] # YI SYLLABLE NBOT +A082 ; [.3CAA.0020.0002] # YI SYLLABLE NBOX +A083 ; [.3CAB.0020.0002] # YI SYLLABLE NBO +A084 ; [.3CAC.0020.0002] # YI SYLLABLE NBOP +A085 ; [.3CAD.0020.0002] # YI SYLLABLE NBUT +A086 ; [.3CAE.0020.0002] # YI SYLLABLE NBUX +A087 ; [.3CAF.0020.0002] # YI SYLLABLE NBU +A088 ; [.3CB0.0020.0002] # YI SYLLABLE NBUP +A089 ; [.3CB1.0020.0002] # YI SYLLABLE NBURX +A08A ; [.3CB2.0020.0002] # YI SYLLABLE NBUR +A08B ; [.3CB3.0020.0002] # YI SYLLABLE NBYT +A08C ; [.3CB4.0020.0002] # YI SYLLABLE NBYX +A08D ; [.3CB5.0020.0002] # YI SYLLABLE NBY +A08E ; [.3CB6.0020.0002] # YI SYLLABLE NBYP +A08F ; [.3CB7.0020.0002] # YI SYLLABLE NBYRX +A090 ; [.3CB8.0020.0002] # YI SYLLABLE NBYR +A091 ; [.3CB9.0020.0002] # YI SYLLABLE HMIT +A092 ; [.3CBA.0020.0002] # YI SYLLABLE HMIX +A093 ; [.3CBB.0020.0002] # YI SYLLABLE HMI +A094 ; [.3CBC.0020.0002] # YI SYLLABLE HMIP +A095 ; [.3CBD.0020.0002] # YI SYLLABLE HMIEX +A096 ; [.3CBE.0020.0002] # YI SYLLABLE HMIE +A097 ; [.3CBF.0020.0002] # YI SYLLABLE HMIEP +A098 ; [.3CC0.0020.0002] # YI SYLLABLE HMAT +A099 ; [.3CC1.0020.0002] # YI SYLLABLE HMAX +A09A ; [.3CC2.0020.0002] # YI SYLLABLE HMA +A09B ; [.3CC3.0020.0002] # YI SYLLABLE HMAP +A09C ; [.3CC4.0020.0002] # YI SYLLABLE HMUOX +A09D ; [.3CC5.0020.0002] # YI SYLLABLE HMUO +A09E ; [.3CC6.0020.0002] # YI SYLLABLE HMUOP +A09F ; [.3CC7.0020.0002] # YI SYLLABLE HMOT +A0A0 ; [.3CC8.0020.0002] # YI SYLLABLE HMOX +A0A1 ; [.3CC9.0020.0002] # YI SYLLABLE HMO +A0A2 ; [.3CCA.0020.0002] # YI SYLLABLE HMOP +A0A3 ; [.3CCB.0020.0002] # YI SYLLABLE HMUT +A0A4 ; [.3CCC.0020.0002] # YI SYLLABLE HMUX +A0A5 ; [.3CCD.0020.0002] # YI SYLLABLE HMU +A0A6 ; [.3CCE.0020.0002] # YI SYLLABLE HMUP +A0A7 ; [.3CCF.0020.0002] # YI SYLLABLE HMURX +A0A8 ; [.3CD0.0020.0002] # YI SYLLABLE HMUR +A0A9 ; [.3CD1.0020.0002] # YI SYLLABLE HMYX +A0AA ; [.3CD2.0020.0002] # YI SYLLABLE HMY +A0AB ; [.3CD3.0020.0002] # YI SYLLABLE HMYP +A0AC ; [.3CD4.0020.0002] # YI SYLLABLE HMYRX +A0AD ; [.3CD5.0020.0002] # YI SYLLABLE HMYR +A0AE ; [.3CD6.0020.0002] # YI SYLLABLE MIT +A0AF ; [.3CD7.0020.0002] # YI SYLLABLE MIX +A0B0 ; [.3CD8.0020.0002] # YI SYLLABLE MI +A0B1 ; [.3CD9.0020.0002] # YI SYLLABLE MIP +A0B2 ; [.3CDA.0020.0002] # YI SYLLABLE MIEX +A0B3 ; [.3CDB.0020.0002] # YI SYLLABLE MIE +A0B4 ; [.3CDC.0020.0002] # YI SYLLABLE MIEP +A0B5 ; [.3CDD.0020.0002] # YI SYLLABLE MAT +A0B6 ; [.3CDE.0020.0002] # YI SYLLABLE MAX +A0B7 ; [.3CDF.0020.0002] # YI SYLLABLE MA +A0B8 ; [.3CE0.0020.0002] # YI SYLLABLE MAP +A0B9 ; [.3CE1.0020.0002] # YI SYLLABLE MUOT +A0BA ; [.3CE2.0020.0002] # YI SYLLABLE MUOX +A0BB ; [.3CE3.0020.0002] # YI SYLLABLE MUO +A0BC ; [.3CE4.0020.0002] # YI SYLLABLE MUOP +A0BD ; [.3CE5.0020.0002] # YI SYLLABLE MOT +A0BE ; [.3CE6.0020.0002] # YI SYLLABLE MOX +A0BF ; [.3CE7.0020.0002] # YI SYLLABLE MO +A0C0 ; [.3CE8.0020.0002] # YI SYLLABLE MOP +A0C1 ; [.3CE9.0020.0002] # YI SYLLABLE MEX +A0C2 ; [.3CEA.0020.0002] # YI SYLLABLE ME +A0C3 ; [.3CEB.0020.0002] # YI SYLLABLE MUT +A0C4 ; [.3CEC.0020.0002] # YI SYLLABLE MUX +A0C5 ; [.3CED.0020.0002] # YI SYLLABLE MU +A0C6 ; [.3CEE.0020.0002] # YI SYLLABLE MUP +A0C7 ; [.3CEF.0020.0002] # YI SYLLABLE MURX +A0C8 ; [.3CF0.0020.0002] # YI SYLLABLE MUR +A0C9 ; [.3CF1.0020.0002] # YI SYLLABLE MYT +A0CA ; [.3CF2.0020.0002] # YI SYLLABLE MYX +A0CB ; [.3CF3.0020.0002] # YI SYLLABLE MY +A0CC ; [.3CF4.0020.0002] # YI SYLLABLE MYP +A0CD ; [.3CF5.0020.0002] # YI SYLLABLE FIT +A0CE ; [.3CF6.0020.0002] # YI SYLLABLE FIX +A0CF ; [.3CF7.0020.0002] # YI SYLLABLE FI +A0D0 ; [.3CF8.0020.0002] # YI SYLLABLE FIP +A0D1 ; [.3CF9.0020.0002] # YI SYLLABLE FAT +A0D2 ; [.3CFA.0020.0002] # YI SYLLABLE FAX +A0D3 ; [.3CFB.0020.0002] # YI SYLLABLE FA +A0D4 ; [.3CFC.0020.0002] # YI SYLLABLE FAP +A0D5 ; [.3CFD.0020.0002] # YI SYLLABLE FOX +A0D6 ; [.3CFE.0020.0002] # YI SYLLABLE FO +A0D7 ; [.3CFF.0020.0002] # YI SYLLABLE FOP +A0D8 ; [.3D00.0020.0002] # YI SYLLABLE FUT +A0D9 ; [.3D01.0020.0002] # YI SYLLABLE FUX +A0DA ; [.3D02.0020.0002] # YI SYLLABLE FU +A0DB ; [.3D03.0020.0002] # YI SYLLABLE FUP +A0DC ; [.3D04.0020.0002] # YI SYLLABLE FURX +A0DD ; [.3D05.0020.0002] # YI SYLLABLE FUR +A0DE ; [.3D06.0020.0002] # YI SYLLABLE FYT +A0DF ; [.3D07.0020.0002] # YI SYLLABLE FYX +A0E0 ; [.3D08.0020.0002] # YI SYLLABLE FY +A0E1 ; [.3D09.0020.0002] # YI SYLLABLE FYP +A0E2 ; [.3D0A.0020.0002] # YI SYLLABLE VIT +A0E3 ; [.3D0B.0020.0002] # YI SYLLABLE VIX +A0E4 ; [.3D0C.0020.0002] # YI SYLLABLE VI +A0E5 ; [.3D0D.0020.0002] # YI SYLLABLE VIP +A0E6 ; [.3D0E.0020.0002] # YI SYLLABLE VIET +A0E7 ; [.3D0F.0020.0002] # YI SYLLABLE VIEX +A0E8 ; [.3D10.0020.0002] # YI SYLLABLE VIE +A0E9 ; [.3D11.0020.0002] # YI SYLLABLE VIEP +A0EA ; [.3D12.0020.0002] # YI SYLLABLE VAT +A0EB ; [.3D13.0020.0002] # YI SYLLABLE VAX +A0EC ; [.3D14.0020.0002] # YI SYLLABLE VA +A0ED ; [.3D15.0020.0002] # YI SYLLABLE VAP +A0EE ; [.3D16.0020.0002] # YI SYLLABLE VOT +A0EF ; [.3D17.0020.0002] # YI SYLLABLE VOX +A0F0 ; [.3D18.0020.0002] # YI SYLLABLE VO +A0F1 ; [.3D19.0020.0002] # YI SYLLABLE VOP +A0F2 ; [.3D1A.0020.0002] # YI SYLLABLE VEX +A0F3 ; [.3D1B.0020.0002] # YI SYLLABLE VEP +A0F4 ; [.3D1C.0020.0002] # YI SYLLABLE VUT +A0F5 ; [.3D1D.0020.0002] # YI SYLLABLE VUX +A0F6 ; [.3D1E.0020.0002] # YI SYLLABLE VU +A0F7 ; [.3D1F.0020.0002] # YI SYLLABLE VUP +A0F8 ; [.3D20.0020.0002] # YI SYLLABLE VURX +A0F9 ; [.3D21.0020.0002] # YI SYLLABLE VUR +A0FA ; [.3D22.0020.0002] # YI SYLLABLE VYT +A0FB ; [.3D23.0020.0002] # YI SYLLABLE VYX +A0FC ; [.3D24.0020.0002] # YI SYLLABLE VY +A0FD ; [.3D25.0020.0002] # YI SYLLABLE VYP +A0FE ; [.3D26.0020.0002] # YI SYLLABLE VYRX +A0FF ; [.3D27.0020.0002] # YI SYLLABLE VYR +A100 ; [.3D28.0020.0002] # YI SYLLABLE DIT +A101 ; [.3D29.0020.0002] # YI SYLLABLE DIX +A102 ; [.3D2A.0020.0002] # YI SYLLABLE DI +A103 ; [.3D2B.0020.0002] # YI SYLLABLE DIP +A104 ; [.3D2C.0020.0002] # YI SYLLABLE DIEX +A105 ; [.3D2D.0020.0002] # YI SYLLABLE DIE +A106 ; [.3D2E.0020.0002] # YI SYLLABLE DIEP +A107 ; [.3D2F.0020.0002] # YI SYLLABLE DAT +A108 ; [.3D30.0020.0002] # YI SYLLABLE DAX +A109 ; [.3D31.0020.0002] # YI SYLLABLE DA +A10A ; [.3D32.0020.0002] # YI SYLLABLE DAP +A10B ; [.3D33.0020.0002] # YI SYLLABLE DUOX +A10C ; [.3D34.0020.0002] # YI SYLLABLE DUO +A10D ; [.3D35.0020.0002] # YI SYLLABLE DOT +A10E ; [.3D36.0020.0002] # YI SYLLABLE DOX +A10F ; [.3D37.0020.0002] # YI SYLLABLE DO +A110 ; [.3D38.0020.0002] # YI SYLLABLE DOP +A111 ; [.3D39.0020.0002] # YI SYLLABLE DEX +A112 ; [.3D3A.0020.0002] # YI SYLLABLE DE +A113 ; [.3D3B.0020.0002] # YI SYLLABLE DEP +A114 ; [.3D3C.0020.0002] # YI SYLLABLE DUT +A115 ; [.3D3D.0020.0002] # YI SYLLABLE DUX +A116 ; [.3D3E.0020.0002] # YI SYLLABLE DU +A117 ; [.3D3F.0020.0002] # YI SYLLABLE DUP +A118 ; [.3D40.0020.0002] # YI SYLLABLE DURX +A119 ; [.3D41.0020.0002] # YI SYLLABLE DUR +A11A ; [.3D42.0020.0002] # YI SYLLABLE TIT +A11B ; [.3D43.0020.0002] # YI SYLLABLE TIX +A11C ; [.3D44.0020.0002] # YI SYLLABLE TI +A11D ; [.3D45.0020.0002] # YI SYLLABLE TIP +A11E ; [.3D46.0020.0002] # YI SYLLABLE TIEX +A11F ; [.3D47.0020.0002] # YI SYLLABLE TIE +A120 ; [.3D48.0020.0002] # YI SYLLABLE TIEP +A121 ; [.3D49.0020.0002] # YI SYLLABLE TAT +A122 ; [.3D4A.0020.0002] # YI SYLLABLE TAX +A123 ; [.3D4B.0020.0002] # YI SYLLABLE TA +A124 ; [.3D4C.0020.0002] # YI SYLLABLE TAP +A125 ; [.3D4D.0020.0002] # YI SYLLABLE TUOT +A126 ; [.3D4E.0020.0002] # YI SYLLABLE TUOX +A127 ; [.3D4F.0020.0002] # YI SYLLABLE TUO +A128 ; [.3D50.0020.0002] # YI SYLLABLE TUOP +A129 ; [.3D51.0020.0002] # YI SYLLABLE TOT +A12A ; [.3D52.0020.0002] # YI SYLLABLE TOX +A12B ; [.3D53.0020.0002] # YI SYLLABLE TO +A12C ; [.3D54.0020.0002] # YI SYLLABLE TOP +A12D ; [.3D55.0020.0002] # YI SYLLABLE TEX +A12E ; [.3D56.0020.0002] # YI SYLLABLE TE +A12F ; [.3D57.0020.0002] # YI SYLLABLE TEP +A130 ; [.3D58.0020.0002] # YI SYLLABLE TUT +A131 ; [.3D59.0020.0002] # YI SYLLABLE TUX +A132 ; [.3D5A.0020.0002] # YI SYLLABLE TU +A133 ; [.3D5B.0020.0002] # YI SYLLABLE TUP +A134 ; [.3D5C.0020.0002] # YI SYLLABLE TURX +A135 ; [.3D5D.0020.0002] # YI SYLLABLE TUR +A136 ; [.3D5E.0020.0002] # YI SYLLABLE DDIT +A137 ; [.3D5F.0020.0002] # YI SYLLABLE DDIX +A138 ; [.3D60.0020.0002] # YI SYLLABLE DDI +A139 ; [.3D61.0020.0002] # YI SYLLABLE DDIP +A13A ; [.3D62.0020.0002] # YI SYLLABLE DDIEX +A13B ; [.3D63.0020.0002] # YI SYLLABLE DDIE +A13C ; [.3D64.0020.0002] # YI SYLLABLE DDIEP +A13D ; [.3D65.0020.0002] # YI SYLLABLE DDAT +A13E ; [.3D66.0020.0002] # YI SYLLABLE DDAX +A13F ; [.3D67.0020.0002] # YI SYLLABLE DDA +A140 ; [.3D68.0020.0002] # YI SYLLABLE DDAP +A141 ; [.3D69.0020.0002] # YI SYLLABLE DDUOX +A142 ; [.3D6A.0020.0002] # YI SYLLABLE DDUO +A143 ; [.3D6B.0020.0002] # YI SYLLABLE DDUOP +A144 ; [.3D6C.0020.0002] # YI SYLLABLE DDOT +A145 ; [.3D6D.0020.0002] # YI SYLLABLE DDOX +A146 ; [.3D6E.0020.0002] # YI SYLLABLE DDO +A147 ; [.3D6F.0020.0002] # YI SYLLABLE DDOP +A148 ; [.3D70.0020.0002] # YI SYLLABLE DDEX +A149 ; [.3D71.0020.0002] # YI SYLLABLE DDE +A14A ; [.3D72.0020.0002] # YI SYLLABLE DDEP +A14B ; [.3D73.0020.0002] # YI SYLLABLE DDUT +A14C ; [.3D74.0020.0002] # YI SYLLABLE DDUX +A14D ; [.3D75.0020.0002] # YI SYLLABLE DDU +A14E ; [.3D76.0020.0002] # YI SYLLABLE DDUP +A14F ; [.3D77.0020.0002] # YI SYLLABLE DDURX +A150 ; [.3D78.0020.0002] # YI SYLLABLE DDUR +A151 ; [.3D79.0020.0002] # YI SYLLABLE NDIT +A152 ; [.3D7A.0020.0002] # YI SYLLABLE NDIX +A153 ; [.3D7B.0020.0002] # YI SYLLABLE NDI +A154 ; [.3D7C.0020.0002] # YI SYLLABLE NDIP +A155 ; [.3D7D.0020.0002] # YI SYLLABLE NDIEX +A156 ; [.3D7E.0020.0002] # YI SYLLABLE NDIE +A157 ; [.3D7F.0020.0002] # YI SYLLABLE NDAT +A158 ; [.3D80.0020.0002] # YI SYLLABLE NDAX +A159 ; [.3D81.0020.0002] # YI SYLLABLE NDA +A15A ; [.3D82.0020.0002] # YI SYLLABLE NDAP +A15B ; [.3D83.0020.0002] # YI SYLLABLE NDOT +A15C ; [.3D84.0020.0002] # YI SYLLABLE NDOX +A15D ; [.3D85.0020.0002] # YI SYLLABLE NDO +A15E ; [.3D86.0020.0002] # YI SYLLABLE NDOP +A15F ; [.3D87.0020.0002] # YI SYLLABLE NDEX +A160 ; [.3D88.0020.0002] # YI SYLLABLE NDE +A161 ; [.3D89.0020.0002] # YI SYLLABLE NDEP +A162 ; [.3D8A.0020.0002] # YI SYLLABLE NDUT +A163 ; [.3D8B.0020.0002] # YI SYLLABLE NDUX +A164 ; [.3D8C.0020.0002] # YI SYLLABLE NDU +A165 ; [.3D8D.0020.0002] # YI SYLLABLE NDUP +A166 ; [.3D8E.0020.0002] # YI SYLLABLE NDURX +A167 ; [.3D8F.0020.0002] # YI SYLLABLE NDUR +A168 ; [.3D90.0020.0002] # YI SYLLABLE HNIT +A169 ; [.3D91.0020.0002] # YI SYLLABLE HNIX +A16A ; [.3D92.0020.0002] # YI SYLLABLE HNI +A16B ; [.3D93.0020.0002] # YI SYLLABLE HNIP +A16C ; [.3D94.0020.0002] # YI SYLLABLE HNIET +A16D ; [.3D95.0020.0002] # YI SYLLABLE HNIEX +A16E ; [.3D96.0020.0002] # YI SYLLABLE HNIE +A16F ; [.3D97.0020.0002] # YI SYLLABLE HNIEP +A170 ; [.3D98.0020.0002] # YI SYLLABLE HNAT +A171 ; [.3D99.0020.0002] # YI SYLLABLE HNAX +A172 ; [.3D9A.0020.0002] # YI SYLLABLE HNA +A173 ; [.3D9B.0020.0002] # YI SYLLABLE HNAP +A174 ; [.3D9C.0020.0002] # YI SYLLABLE HNUOX +A175 ; [.3D9D.0020.0002] # YI SYLLABLE HNUO +A176 ; [.3D9E.0020.0002] # YI SYLLABLE HNOT +A177 ; [.3D9F.0020.0002] # YI SYLLABLE HNOX +A178 ; [.3DA0.0020.0002] # YI SYLLABLE HNOP +A179 ; [.3DA1.0020.0002] # YI SYLLABLE HNEX +A17A ; [.3DA2.0020.0002] # YI SYLLABLE HNE +A17B ; [.3DA3.0020.0002] # YI SYLLABLE HNEP +A17C ; [.3DA4.0020.0002] # YI SYLLABLE HNUT +A17D ; [.3DA5.0020.0002] # YI SYLLABLE NIT +A17E ; [.3DA6.0020.0002] # YI SYLLABLE NIX +A17F ; [.3DA7.0020.0002] # YI SYLLABLE NI +A180 ; [.3DA8.0020.0002] # YI SYLLABLE NIP +A181 ; [.3DA9.0020.0002] # YI SYLLABLE NIEX +A182 ; [.3DAA.0020.0002] # YI SYLLABLE NIE +A183 ; [.3DAB.0020.0002] # YI SYLLABLE NIEP +A184 ; [.3DAC.0020.0002] # YI SYLLABLE NAX +A185 ; [.3DAD.0020.0002] # YI SYLLABLE NA +A186 ; [.3DAE.0020.0002] # YI SYLLABLE NAP +A187 ; [.3DAF.0020.0002] # YI SYLLABLE NUOX +A188 ; [.3DB0.0020.0002] # YI SYLLABLE NUO +A189 ; [.3DB1.0020.0002] # YI SYLLABLE NUOP +A18A ; [.3DB2.0020.0002] # YI SYLLABLE NOT +A18B ; [.3DB3.0020.0002] # YI SYLLABLE NOX +A18C ; [.3DB4.0020.0002] # YI SYLLABLE NO +A18D ; [.3DB5.0020.0002] # YI SYLLABLE NOP +A18E ; [.3DB6.0020.0002] # YI SYLLABLE NEX +A18F ; [.3DB7.0020.0002] # YI SYLLABLE NE +A190 ; [.3DB8.0020.0002] # YI SYLLABLE NEP +A191 ; [.3DB9.0020.0002] # YI SYLLABLE NUT +A192 ; [.3DBA.0020.0002] # YI SYLLABLE NUX +A193 ; [.3DBB.0020.0002] # YI SYLLABLE NU +A194 ; [.3DBC.0020.0002] # YI SYLLABLE NUP +A195 ; [.3DBD.0020.0002] # YI SYLLABLE NURX +A196 ; [.3DBE.0020.0002] # YI SYLLABLE NUR +A197 ; [.3DBF.0020.0002] # YI SYLLABLE HLIT +A198 ; [.3DC0.0020.0002] # YI SYLLABLE HLIX +A199 ; [.3DC1.0020.0002] # YI SYLLABLE HLI +A19A ; [.3DC2.0020.0002] # YI SYLLABLE HLIP +A19B ; [.3DC3.0020.0002] # YI SYLLABLE HLIEX +A19C ; [.3DC4.0020.0002] # YI SYLLABLE HLIE +A19D ; [.3DC5.0020.0002] # YI SYLLABLE HLIEP +A19E ; [.3DC6.0020.0002] # YI SYLLABLE HLAT +A19F ; [.3DC7.0020.0002] # YI SYLLABLE HLAX +A1A0 ; [.3DC8.0020.0002] # YI SYLLABLE HLA +A1A1 ; [.3DC9.0020.0002] # YI SYLLABLE HLAP +A1A2 ; [.3DCA.0020.0002] # YI SYLLABLE HLUOX +A1A3 ; [.3DCB.0020.0002] # YI SYLLABLE HLUO +A1A4 ; [.3DCC.0020.0002] # YI SYLLABLE HLUOP +A1A5 ; [.3DCD.0020.0002] # YI SYLLABLE HLOX +A1A6 ; [.3DCE.0020.0002] # YI SYLLABLE HLO +A1A7 ; [.3DCF.0020.0002] # YI SYLLABLE HLOP +A1A8 ; [.3DD0.0020.0002] # YI SYLLABLE HLEX +A1A9 ; [.3DD1.0020.0002] # YI SYLLABLE HLE +A1AA ; [.3DD2.0020.0002] # YI SYLLABLE HLEP +A1AB ; [.3DD3.0020.0002] # YI SYLLABLE HLUT +A1AC ; [.3DD4.0020.0002] # YI SYLLABLE HLUX +A1AD ; [.3DD5.0020.0002] # YI SYLLABLE HLU +A1AE ; [.3DD6.0020.0002] # YI SYLLABLE HLUP +A1AF ; [.3DD7.0020.0002] # YI SYLLABLE HLURX +A1B0 ; [.3DD8.0020.0002] # YI SYLLABLE HLUR +A1B1 ; [.3DD9.0020.0002] # YI SYLLABLE HLYT +A1B2 ; [.3DDA.0020.0002] # YI SYLLABLE HLYX +A1B3 ; [.3DDB.0020.0002] # YI SYLLABLE HLY +A1B4 ; [.3DDC.0020.0002] # YI SYLLABLE HLYP +A1B5 ; [.3DDD.0020.0002] # YI SYLLABLE HLYRX +A1B6 ; [.3DDE.0020.0002] # YI SYLLABLE HLYR +A1B7 ; [.3DDF.0020.0002] # YI SYLLABLE LIT +A1B8 ; [.3DE0.0020.0002] # YI SYLLABLE LIX +A1B9 ; [.3DE1.0020.0002] # YI SYLLABLE LI +A1BA ; [.3DE2.0020.0002] # YI SYLLABLE LIP +A1BB ; [.3DE3.0020.0002] # YI SYLLABLE LIET +A1BC ; [.3DE4.0020.0002] # YI SYLLABLE LIEX +A1BD ; [.3DE5.0020.0002] # YI SYLLABLE LIE +A1BE ; [.3DE6.0020.0002] # YI SYLLABLE LIEP +A1BF ; [.3DE7.0020.0002] # YI SYLLABLE LAT +A1C0 ; [.3DE8.0020.0002] # YI SYLLABLE LAX +A1C1 ; [.3DE9.0020.0002] # YI SYLLABLE LA +A1C2 ; [.3DEA.0020.0002] # YI SYLLABLE LAP +A1C3 ; [.3DEB.0020.0002] # YI SYLLABLE LUOT +A1C4 ; [.3DEC.0020.0002] # YI SYLLABLE LUOX +A1C5 ; [.3DED.0020.0002] # YI SYLLABLE LUO +A1C6 ; [.3DEE.0020.0002] # YI SYLLABLE LUOP +A1C7 ; [.3DEF.0020.0002] # YI SYLLABLE LOT +A1C8 ; [.3DF0.0020.0002] # YI SYLLABLE LOX +A1C9 ; [.3DF1.0020.0002] # YI SYLLABLE LO +A1CA ; [.3DF2.0020.0002] # YI SYLLABLE LOP +A1CB ; [.3DF3.0020.0002] # YI SYLLABLE LEX +A1CC ; [.3DF4.0020.0002] # YI SYLLABLE LE +A1CD ; [.3DF5.0020.0002] # YI SYLLABLE LEP +A1CE ; [.3DF6.0020.0002] # YI SYLLABLE LUT +A1CF ; [.3DF7.0020.0002] # YI SYLLABLE LUX +A1D0 ; [.3DF8.0020.0002] # YI SYLLABLE LU +A1D1 ; [.3DF9.0020.0002] # YI SYLLABLE LUP +A1D2 ; [.3DFA.0020.0002] # YI SYLLABLE LURX +A1D3 ; [.3DFB.0020.0002] # YI SYLLABLE LUR +A1D4 ; [.3DFC.0020.0002] # YI SYLLABLE LYT +A1D5 ; [.3DFD.0020.0002] # YI SYLLABLE LYX +A1D6 ; [.3DFE.0020.0002] # YI SYLLABLE LY +A1D7 ; [.3DFF.0020.0002] # YI SYLLABLE LYP +A1D8 ; [.3E00.0020.0002] # YI SYLLABLE LYRX +A1D9 ; [.3E01.0020.0002] # YI SYLLABLE LYR +A1DA ; [.3E02.0020.0002] # YI SYLLABLE GIT +A1DB ; [.3E03.0020.0002] # YI SYLLABLE GIX +A1DC ; [.3E04.0020.0002] # YI SYLLABLE GI +A1DD ; [.3E05.0020.0002] # YI SYLLABLE GIP +A1DE ; [.3E06.0020.0002] # YI SYLLABLE GIET +A1DF ; [.3E07.0020.0002] # YI SYLLABLE GIEX +A1E0 ; [.3E08.0020.0002] # YI SYLLABLE GIE +A1E1 ; [.3E09.0020.0002] # YI SYLLABLE GIEP +A1E2 ; [.3E0A.0020.0002] # YI SYLLABLE GAT +A1E3 ; [.3E0B.0020.0002] # YI SYLLABLE GAX +A1E4 ; [.3E0C.0020.0002] # YI SYLLABLE GA +A1E5 ; [.3E0D.0020.0002] # YI SYLLABLE GAP +A1E6 ; [.3E0E.0020.0002] # YI SYLLABLE GUOT +A1E7 ; [.3E0F.0020.0002] # YI SYLLABLE GUOX +A1E8 ; [.3E10.0020.0002] # YI SYLLABLE GUO +A1E9 ; [.3E11.0020.0002] # YI SYLLABLE GUOP +A1EA ; [.3E12.0020.0002] # YI SYLLABLE GOT +A1EB ; [.3E13.0020.0002] # YI SYLLABLE GOX +A1EC ; [.3E14.0020.0002] # YI SYLLABLE GO +A1ED ; [.3E15.0020.0002] # YI SYLLABLE GOP +A1EE ; [.3E16.0020.0002] # YI SYLLABLE GET +A1EF ; [.3E17.0020.0002] # YI SYLLABLE GEX +A1F0 ; [.3E18.0020.0002] # YI SYLLABLE GE +A1F1 ; [.3E19.0020.0002] # YI SYLLABLE GEP +A1F2 ; [.3E1A.0020.0002] # YI SYLLABLE GUT +A1F3 ; [.3E1B.0020.0002] # YI SYLLABLE GUX +A1F4 ; [.3E1C.0020.0002] # YI SYLLABLE GU +A1F5 ; [.3E1D.0020.0002] # YI SYLLABLE GUP +A1F6 ; [.3E1E.0020.0002] # YI SYLLABLE GURX +A1F7 ; [.3E1F.0020.0002] # YI SYLLABLE GUR +A1F8 ; [.3E20.0020.0002] # YI SYLLABLE KIT +A1F9 ; [.3E21.0020.0002] # YI SYLLABLE KIX +A1FA ; [.3E22.0020.0002] # YI SYLLABLE KI +A1FB ; [.3E23.0020.0002] # YI SYLLABLE KIP +A1FC ; [.3E24.0020.0002] # YI SYLLABLE KIEX +A1FD ; [.3E25.0020.0002] # YI SYLLABLE KIE +A1FE ; [.3E26.0020.0002] # YI SYLLABLE KIEP +A1FF ; [.3E27.0020.0002] # YI SYLLABLE KAT +A200 ; [.3E28.0020.0002] # YI SYLLABLE KAX +A201 ; [.3E29.0020.0002] # YI SYLLABLE KA +A202 ; [.3E2A.0020.0002] # YI SYLLABLE KAP +A203 ; [.3E2B.0020.0002] # YI SYLLABLE KUOX +A204 ; [.3E2C.0020.0002] # YI SYLLABLE KUO +A205 ; [.3E2D.0020.0002] # YI SYLLABLE KUOP +A206 ; [.3E2E.0020.0002] # YI SYLLABLE KOT +A207 ; [.3E2F.0020.0002] # YI SYLLABLE KOX +A208 ; [.3E30.0020.0002] # YI SYLLABLE KO +A209 ; [.3E31.0020.0002] # YI SYLLABLE KOP +A20A ; [.3E32.0020.0002] # YI SYLLABLE KET +A20B ; [.3E33.0020.0002] # YI SYLLABLE KEX +A20C ; [.3E34.0020.0002] # YI SYLLABLE KE +A20D ; [.3E35.0020.0002] # YI SYLLABLE KEP +A20E ; [.3E36.0020.0002] # YI SYLLABLE KUT +A20F ; [.3E37.0020.0002] # YI SYLLABLE KUX +A210 ; [.3E38.0020.0002] # YI SYLLABLE KU +A211 ; [.3E39.0020.0002] # YI SYLLABLE KUP +A212 ; [.3E3A.0020.0002] # YI SYLLABLE KURX +A213 ; [.3E3B.0020.0002] # YI SYLLABLE KUR +A214 ; [.3E3C.0020.0002] # YI SYLLABLE GGIT +A215 ; [.3E3D.0020.0002] # YI SYLLABLE GGIX +A216 ; [.3E3E.0020.0002] # YI SYLLABLE GGI +A217 ; [.3E3F.0020.0002] # YI SYLLABLE GGIEX +A218 ; [.3E40.0020.0002] # YI SYLLABLE GGIE +A219 ; [.3E41.0020.0002] # YI SYLLABLE GGIEP +A21A ; [.3E42.0020.0002] # YI SYLLABLE GGAT +A21B ; [.3E43.0020.0002] # YI SYLLABLE GGAX +A21C ; [.3E44.0020.0002] # YI SYLLABLE GGA +A21D ; [.3E45.0020.0002] # YI SYLLABLE GGAP +A21E ; [.3E46.0020.0002] # YI SYLLABLE GGUOT +A21F ; [.3E47.0020.0002] # YI SYLLABLE GGUOX +A220 ; [.3E48.0020.0002] # YI SYLLABLE GGUO +A221 ; [.3E49.0020.0002] # YI SYLLABLE GGUOP +A222 ; [.3E4A.0020.0002] # YI SYLLABLE GGOT +A223 ; [.3E4B.0020.0002] # YI SYLLABLE GGOX +A224 ; [.3E4C.0020.0002] # YI SYLLABLE GGO +A225 ; [.3E4D.0020.0002] # YI SYLLABLE GGOP +A226 ; [.3E4E.0020.0002] # YI SYLLABLE GGET +A227 ; [.3E4F.0020.0002] # YI SYLLABLE GGEX +A228 ; [.3E50.0020.0002] # YI SYLLABLE GGE +A229 ; [.3E51.0020.0002] # YI SYLLABLE GGEP +A22A ; [.3E52.0020.0002] # YI SYLLABLE GGUT +A22B ; [.3E53.0020.0002] # YI SYLLABLE GGUX +A22C ; [.3E54.0020.0002] # YI SYLLABLE GGU +A22D ; [.3E55.0020.0002] # YI SYLLABLE GGUP +A22E ; [.3E56.0020.0002] # YI SYLLABLE GGURX +A22F ; [.3E57.0020.0002] # YI SYLLABLE GGUR +A230 ; [.3E58.0020.0002] # YI SYLLABLE MGIEX +A231 ; [.3E59.0020.0002] # YI SYLLABLE MGIE +A232 ; [.3E5A.0020.0002] # YI SYLLABLE MGAT +A233 ; [.3E5B.0020.0002] # YI SYLLABLE MGAX +A234 ; [.3E5C.0020.0002] # YI SYLLABLE MGA +A235 ; [.3E5D.0020.0002] # YI SYLLABLE MGAP +A236 ; [.3E5E.0020.0002] # YI SYLLABLE MGUOX +A237 ; [.3E5F.0020.0002] # YI SYLLABLE MGUO +A238 ; [.3E60.0020.0002] # YI SYLLABLE MGUOP +A239 ; [.3E61.0020.0002] # YI SYLLABLE MGOT +A23A ; [.3E62.0020.0002] # YI SYLLABLE MGOX +A23B ; [.3E63.0020.0002] # YI SYLLABLE MGO +A23C ; [.3E64.0020.0002] # YI SYLLABLE MGOP +A23D ; [.3E65.0020.0002] # YI SYLLABLE MGEX +A23E ; [.3E66.0020.0002] # YI SYLLABLE MGE +A23F ; [.3E67.0020.0002] # YI SYLLABLE MGEP +A240 ; [.3E68.0020.0002] # YI SYLLABLE MGUT +A241 ; [.3E69.0020.0002] # YI SYLLABLE MGUX +A242 ; [.3E6A.0020.0002] # YI SYLLABLE MGU +A243 ; [.3E6B.0020.0002] # YI SYLLABLE MGUP +A244 ; [.3E6C.0020.0002] # YI SYLLABLE MGURX +A245 ; [.3E6D.0020.0002] # YI SYLLABLE MGUR +A246 ; [.3E6E.0020.0002] # YI SYLLABLE HXIT +A247 ; [.3E6F.0020.0002] # YI SYLLABLE HXIX +A248 ; [.3E70.0020.0002] # YI SYLLABLE HXI +A249 ; [.3E71.0020.0002] # YI SYLLABLE HXIP +A24A ; [.3E72.0020.0002] # YI SYLLABLE HXIET +A24B ; [.3E73.0020.0002] # YI SYLLABLE HXIEX +A24C ; [.3E74.0020.0002] # YI SYLLABLE HXIE +A24D ; [.3E75.0020.0002] # YI SYLLABLE HXIEP +A24E ; [.3E76.0020.0002] # YI SYLLABLE HXAT +A24F ; [.3E77.0020.0002] # YI SYLLABLE HXAX +A250 ; [.3E78.0020.0002] # YI SYLLABLE HXA +A251 ; [.3E79.0020.0002] # YI SYLLABLE HXAP +A252 ; [.3E7A.0020.0002] # YI SYLLABLE HXUOT +A253 ; [.3E7B.0020.0002] # YI SYLLABLE HXUOX +A254 ; [.3E7C.0020.0002] # YI SYLLABLE HXUO +A255 ; [.3E7D.0020.0002] # YI SYLLABLE HXUOP +A256 ; [.3E7E.0020.0002] # YI SYLLABLE HXOT +A257 ; [.3E7F.0020.0002] # YI SYLLABLE HXOX +A258 ; [.3E80.0020.0002] # YI SYLLABLE HXO +A259 ; [.3E81.0020.0002] # YI SYLLABLE HXOP +A25A ; [.3E82.0020.0002] # YI SYLLABLE HXEX +A25B ; [.3E83.0020.0002] # YI SYLLABLE HXE +A25C ; [.3E84.0020.0002] # YI SYLLABLE HXEP +A25D ; [.3E85.0020.0002] # YI SYLLABLE NGIEX +A25E ; [.3E86.0020.0002] # YI SYLLABLE NGIE +A25F ; [.3E87.0020.0002] # YI SYLLABLE NGIEP +A260 ; [.3E88.0020.0002] # YI SYLLABLE NGAT +A261 ; [.3E89.0020.0002] # YI SYLLABLE NGAX +A262 ; [.3E8A.0020.0002] # YI SYLLABLE NGA +A263 ; [.3E8B.0020.0002] # YI SYLLABLE NGAP +A264 ; [.3E8C.0020.0002] # YI SYLLABLE NGUOT +A265 ; [.3E8D.0020.0002] # YI SYLLABLE NGUOX +A266 ; [.3E8E.0020.0002] # YI SYLLABLE NGUO +A267 ; [.3E8F.0020.0002] # YI SYLLABLE NGOT +A268 ; [.3E90.0020.0002] # YI SYLLABLE NGOX +A269 ; [.3E91.0020.0002] # YI SYLLABLE NGO +A26A ; [.3E92.0020.0002] # YI SYLLABLE NGOP +A26B ; [.3E93.0020.0002] # YI SYLLABLE NGEX +A26C ; [.3E94.0020.0002] # YI SYLLABLE NGE +A26D ; [.3E95.0020.0002] # YI SYLLABLE NGEP +A26E ; [.3E96.0020.0002] # YI SYLLABLE HIT +A26F ; [.3E97.0020.0002] # YI SYLLABLE HIEX +A270 ; [.3E98.0020.0002] # YI SYLLABLE HIE +A271 ; [.3E99.0020.0002] # YI SYLLABLE HAT +A272 ; [.3E9A.0020.0002] # YI SYLLABLE HAX +A273 ; [.3E9B.0020.0002] # YI SYLLABLE HA +A274 ; [.3E9C.0020.0002] # YI SYLLABLE HAP +A275 ; [.3E9D.0020.0002] # YI SYLLABLE HUOT +A276 ; [.3E9E.0020.0002] # YI SYLLABLE HUOX +A277 ; [.3E9F.0020.0002] # YI SYLLABLE HUO +A278 ; [.3EA0.0020.0002] # YI SYLLABLE HUOP +A279 ; [.3EA1.0020.0002] # YI SYLLABLE HOT +A27A ; [.3EA2.0020.0002] # YI SYLLABLE HOX +A27B ; [.3EA3.0020.0002] # YI SYLLABLE HO +A27C ; [.3EA4.0020.0002] # YI SYLLABLE HOP +A27D ; [.3EA5.0020.0002] # YI SYLLABLE HEX +A27E ; [.3EA6.0020.0002] # YI SYLLABLE HE +A27F ; [.3EA7.0020.0002] # YI SYLLABLE HEP +A280 ; [.3EA8.0020.0002] # YI SYLLABLE WAT +A281 ; [.3EA9.0020.0002] # YI SYLLABLE WAX +A282 ; [.3EAA.0020.0002] # YI SYLLABLE WA +A283 ; [.3EAB.0020.0002] # YI SYLLABLE WAP +A284 ; [.3EAC.0020.0002] # YI SYLLABLE WUOX +A285 ; [.3EAD.0020.0002] # YI SYLLABLE WUO +A286 ; [.3EAE.0020.0002] # YI SYLLABLE WUOP +A287 ; [.3EAF.0020.0002] # YI SYLLABLE WOX +A288 ; [.3EB0.0020.0002] # YI SYLLABLE WO +A289 ; [.3EB1.0020.0002] # YI SYLLABLE WOP +A28A ; [.3EB2.0020.0002] # YI SYLLABLE WEX +A28B ; [.3EB3.0020.0002] # YI SYLLABLE WE +A28C ; [.3EB4.0020.0002] # YI SYLLABLE WEP +A28D ; [.3EB5.0020.0002] # YI SYLLABLE ZIT +A28E ; [.3EB6.0020.0002] # YI SYLLABLE ZIX +A28F ; [.3EB7.0020.0002] # YI SYLLABLE ZI +A290 ; [.3EB8.0020.0002] # YI SYLLABLE ZIP +A291 ; [.3EB9.0020.0002] # YI SYLLABLE ZIEX +A292 ; [.3EBA.0020.0002] # YI SYLLABLE ZIE +A293 ; [.3EBB.0020.0002] # YI SYLLABLE ZIEP +A294 ; [.3EBC.0020.0002] # YI SYLLABLE ZAT +A295 ; [.3EBD.0020.0002] # YI SYLLABLE ZAX +A296 ; [.3EBE.0020.0002] # YI SYLLABLE ZA +A297 ; [.3EBF.0020.0002] # YI SYLLABLE ZAP +A298 ; [.3EC0.0020.0002] # YI SYLLABLE ZUOX +A299 ; [.3EC1.0020.0002] # YI SYLLABLE ZUO +A29A ; [.3EC2.0020.0002] # YI SYLLABLE ZUOP +A29B ; [.3EC3.0020.0002] # YI SYLLABLE ZOT +A29C ; [.3EC4.0020.0002] # YI SYLLABLE ZOX +A29D ; [.3EC5.0020.0002] # YI SYLLABLE ZO +A29E ; [.3EC6.0020.0002] # YI SYLLABLE ZOP +A29F ; [.3EC7.0020.0002] # YI SYLLABLE ZEX +A2A0 ; [.3EC8.0020.0002] # YI SYLLABLE ZE +A2A1 ; [.3EC9.0020.0002] # YI SYLLABLE ZEP +A2A2 ; [.3ECA.0020.0002] # YI SYLLABLE ZUT +A2A3 ; [.3ECB.0020.0002] # YI SYLLABLE ZUX +A2A4 ; [.3ECC.0020.0002] # YI SYLLABLE ZU +A2A5 ; [.3ECD.0020.0002] # YI SYLLABLE ZUP +A2A6 ; [.3ECE.0020.0002] # YI SYLLABLE ZURX +A2A7 ; [.3ECF.0020.0002] # YI SYLLABLE ZUR +A2A8 ; [.3ED0.0020.0002] # YI SYLLABLE ZYT +A2A9 ; [.3ED1.0020.0002] # YI SYLLABLE ZYX +A2AA ; [.3ED2.0020.0002] # YI SYLLABLE ZY +A2AB ; [.3ED3.0020.0002] # YI SYLLABLE ZYP +A2AC ; [.3ED4.0020.0002] # YI SYLLABLE ZYRX +A2AD ; [.3ED5.0020.0002] # YI SYLLABLE ZYR +A2AE ; [.3ED6.0020.0002] # YI SYLLABLE CIT +A2AF ; [.3ED7.0020.0002] # YI SYLLABLE CIX +A2B0 ; [.3ED8.0020.0002] # YI SYLLABLE CI +A2B1 ; [.3ED9.0020.0002] # YI SYLLABLE CIP +A2B2 ; [.3EDA.0020.0002] # YI SYLLABLE CIET +A2B3 ; [.3EDB.0020.0002] # YI SYLLABLE CIEX +A2B4 ; [.3EDC.0020.0002] # YI SYLLABLE CIE +A2B5 ; [.3EDD.0020.0002] # YI SYLLABLE CIEP +A2B6 ; [.3EDE.0020.0002] # YI SYLLABLE CAT +A2B7 ; [.3EDF.0020.0002] # YI SYLLABLE CAX +A2B8 ; [.3EE0.0020.0002] # YI SYLLABLE CA +A2B9 ; [.3EE1.0020.0002] # YI SYLLABLE CAP +A2BA ; [.3EE2.0020.0002] # YI SYLLABLE CUOX +A2BB ; [.3EE3.0020.0002] # YI SYLLABLE CUO +A2BC ; [.3EE4.0020.0002] # YI SYLLABLE CUOP +A2BD ; [.3EE5.0020.0002] # YI SYLLABLE COT +A2BE ; [.3EE6.0020.0002] # YI SYLLABLE COX +A2BF ; [.3EE7.0020.0002] # YI SYLLABLE CO +A2C0 ; [.3EE8.0020.0002] # YI SYLLABLE COP +A2C1 ; [.3EE9.0020.0002] # YI SYLLABLE CEX +A2C2 ; [.3EEA.0020.0002] # YI SYLLABLE CE +A2C3 ; [.3EEB.0020.0002] # YI SYLLABLE CEP +A2C4 ; [.3EEC.0020.0002] # YI SYLLABLE CUT +A2C5 ; [.3EED.0020.0002] # YI SYLLABLE CUX +A2C6 ; [.3EEE.0020.0002] # YI SYLLABLE CU +A2C7 ; [.3EEF.0020.0002] # YI SYLLABLE CUP +A2C8 ; [.3EF0.0020.0002] # YI SYLLABLE CURX +A2C9 ; [.3EF1.0020.0002] # YI SYLLABLE CUR +A2CA ; [.3EF2.0020.0002] # YI SYLLABLE CYT +A2CB ; [.3EF3.0020.0002] # YI SYLLABLE CYX +A2CC ; [.3EF4.0020.0002] # YI SYLLABLE CY +A2CD ; [.3EF5.0020.0002] # YI SYLLABLE CYP +A2CE ; [.3EF6.0020.0002] # YI SYLLABLE CYRX +A2CF ; [.3EF7.0020.0002] # YI SYLLABLE CYR +A2D0 ; [.3EF8.0020.0002] # YI SYLLABLE ZZIT +A2D1 ; [.3EF9.0020.0002] # YI SYLLABLE ZZIX +A2D2 ; [.3EFA.0020.0002] # YI SYLLABLE ZZI +A2D3 ; [.3EFB.0020.0002] # YI SYLLABLE ZZIP +A2D4 ; [.3EFC.0020.0002] # YI SYLLABLE ZZIET +A2D5 ; [.3EFD.0020.0002] # YI SYLLABLE ZZIEX +A2D6 ; [.3EFE.0020.0002] # YI SYLLABLE ZZIE +A2D7 ; [.3EFF.0020.0002] # YI SYLLABLE ZZIEP +A2D8 ; [.3F00.0020.0002] # YI SYLLABLE ZZAT +A2D9 ; [.3F01.0020.0002] # YI SYLLABLE ZZAX +A2DA ; [.3F02.0020.0002] # YI SYLLABLE ZZA +A2DB ; [.3F03.0020.0002] # YI SYLLABLE ZZAP +A2DC ; [.3F04.0020.0002] # YI SYLLABLE ZZOX +A2DD ; [.3F05.0020.0002] # YI SYLLABLE ZZO +A2DE ; [.3F06.0020.0002] # YI SYLLABLE ZZOP +A2DF ; [.3F07.0020.0002] # YI SYLLABLE ZZEX +A2E0 ; [.3F08.0020.0002] # YI SYLLABLE ZZE +A2E1 ; [.3F09.0020.0002] # YI SYLLABLE ZZEP +A2E2 ; [.3F0A.0020.0002] # YI SYLLABLE ZZUX +A2E3 ; [.3F0B.0020.0002] # YI SYLLABLE ZZU +A2E4 ; [.3F0C.0020.0002] # YI SYLLABLE ZZUP +A2E5 ; [.3F0D.0020.0002] # YI SYLLABLE ZZURX +A2E6 ; [.3F0E.0020.0002] # YI SYLLABLE ZZUR +A2E7 ; [.3F0F.0020.0002] # YI SYLLABLE ZZYT +A2E8 ; [.3F10.0020.0002] # YI SYLLABLE ZZYX +A2E9 ; [.3F11.0020.0002] # YI SYLLABLE ZZY +A2EA ; [.3F12.0020.0002] # YI SYLLABLE ZZYP +A2EB ; [.3F13.0020.0002] # YI SYLLABLE ZZYRX +A2EC ; [.3F14.0020.0002] # YI SYLLABLE ZZYR +A2ED ; [.3F15.0020.0002] # YI SYLLABLE NZIT +A2EE ; [.3F16.0020.0002] # YI SYLLABLE NZIX +A2EF ; [.3F17.0020.0002] # YI SYLLABLE NZI +A2F0 ; [.3F18.0020.0002] # YI SYLLABLE NZIP +A2F1 ; [.3F19.0020.0002] # YI SYLLABLE NZIEX +A2F2 ; [.3F1A.0020.0002] # YI SYLLABLE NZIE +A2F3 ; [.3F1B.0020.0002] # YI SYLLABLE NZIEP +A2F4 ; [.3F1C.0020.0002] # YI SYLLABLE NZAT +A2F5 ; [.3F1D.0020.0002] # YI SYLLABLE NZAX +A2F6 ; [.3F1E.0020.0002] # YI SYLLABLE NZA +A2F7 ; [.3F1F.0020.0002] # YI SYLLABLE NZAP +A2F8 ; [.3F20.0020.0002] # YI SYLLABLE NZUOX +A2F9 ; [.3F21.0020.0002] # YI SYLLABLE NZUO +A2FA ; [.3F22.0020.0002] # YI SYLLABLE NZOX +A2FB ; [.3F23.0020.0002] # YI SYLLABLE NZOP +A2FC ; [.3F24.0020.0002] # YI SYLLABLE NZEX +A2FD ; [.3F25.0020.0002] # YI SYLLABLE NZE +A2FE ; [.3F26.0020.0002] # YI SYLLABLE NZUX +A2FF ; [.3F27.0020.0002] # YI SYLLABLE NZU +A300 ; [.3F28.0020.0002] # YI SYLLABLE NZUP +A301 ; [.3F29.0020.0002] # YI SYLLABLE NZURX +A302 ; [.3F2A.0020.0002] # YI SYLLABLE NZUR +A303 ; [.3F2B.0020.0002] # YI SYLLABLE NZYT +A304 ; [.3F2C.0020.0002] # YI SYLLABLE NZYX +A305 ; [.3F2D.0020.0002] # YI SYLLABLE NZY +A306 ; [.3F2E.0020.0002] # YI SYLLABLE NZYP +A307 ; [.3F2F.0020.0002] # YI SYLLABLE NZYRX +A308 ; [.3F30.0020.0002] # YI SYLLABLE NZYR +A309 ; [.3F31.0020.0002] # YI SYLLABLE SIT +A30A ; [.3F32.0020.0002] # YI SYLLABLE SIX +A30B ; [.3F33.0020.0002] # YI SYLLABLE SI +A30C ; [.3F34.0020.0002] # YI SYLLABLE SIP +A30D ; [.3F35.0020.0002] # YI SYLLABLE SIEX +A30E ; [.3F36.0020.0002] # YI SYLLABLE SIE +A30F ; [.3F37.0020.0002] # YI SYLLABLE SIEP +A310 ; [.3F38.0020.0002] # YI SYLLABLE SAT +A311 ; [.3F39.0020.0002] # YI SYLLABLE SAX +A312 ; [.3F3A.0020.0002] # YI SYLLABLE SA +A313 ; [.3F3B.0020.0002] # YI SYLLABLE SAP +A314 ; [.3F3C.0020.0002] # YI SYLLABLE SUOX +A315 ; [.3F3D.0020.0002] # YI SYLLABLE SUO +A316 ; [.3F3E.0020.0002] # YI SYLLABLE SUOP +A317 ; [.3F3F.0020.0002] # YI SYLLABLE SOT +A318 ; [.3F40.0020.0002] # YI SYLLABLE SOX +A319 ; [.3F41.0020.0002] # YI SYLLABLE SO +A31A ; [.3F42.0020.0002] # YI SYLLABLE SOP +A31B ; [.3F43.0020.0002] # YI SYLLABLE SEX +A31C ; [.3F44.0020.0002] # YI SYLLABLE SE +A31D ; [.3F45.0020.0002] # YI SYLLABLE SEP +A31E ; [.3F46.0020.0002] # YI SYLLABLE SUT +A31F ; [.3F47.0020.0002] # YI SYLLABLE SUX +A320 ; [.3F48.0020.0002] # YI SYLLABLE SU +A321 ; [.3F49.0020.0002] # YI SYLLABLE SUP +A322 ; [.3F4A.0020.0002] # YI SYLLABLE SURX +A323 ; [.3F4B.0020.0002] # YI SYLLABLE SUR +A324 ; [.3F4C.0020.0002] # YI SYLLABLE SYT +A325 ; [.3F4D.0020.0002] # YI SYLLABLE SYX +A326 ; [.3F4E.0020.0002] # YI SYLLABLE SY +A327 ; [.3F4F.0020.0002] # YI SYLLABLE SYP +A328 ; [.3F50.0020.0002] # YI SYLLABLE SYRX +A329 ; [.3F51.0020.0002] # YI SYLLABLE SYR +A32A ; [.3F52.0020.0002] # YI SYLLABLE SSIT +A32B ; [.3F53.0020.0002] # YI SYLLABLE SSIX +A32C ; [.3F54.0020.0002] # YI SYLLABLE SSI +A32D ; [.3F55.0020.0002] # YI SYLLABLE SSIP +A32E ; [.3F56.0020.0002] # YI SYLLABLE SSIEX +A32F ; [.3F57.0020.0002] # YI SYLLABLE SSIE +A330 ; [.3F58.0020.0002] # YI SYLLABLE SSIEP +A331 ; [.3F59.0020.0002] # YI SYLLABLE SSAT +A332 ; [.3F5A.0020.0002] # YI SYLLABLE SSAX +A333 ; [.3F5B.0020.0002] # YI SYLLABLE SSA +A334 ; [.3F5C.0020.0002] # YI SYLLABLE SSAP +A335 ; [.3F5D.0020.0002] # YI SYLLABLE SSOT +A336 ; [.3F5E.0020.0002] # YI SYLLABLE SSOX +A337 ; [.3F5F.0020.0002] # YI SYLLABLE SSO +A338 ; [.3F60.0020.0002] # YI SYLLABLE SSOP +A339 ; [.3F61.0020.0002] # YI SYLLABLE SSEX +A33A ; [.3F62.0020.0002] # YI SYLLABLE SSE +A33B ; [.3F63.0020.0002] # YI SYLLABLE SSEP +A33C ; [.3F64.0020.0002] # YI SYLLABLE SSUT +A33D ; [.3F65.0020.0002] # YI SYLLABLE SSUX +A33E ; [.3F66.0020.0002] # YI SYLLABLE SSU +A33F ; [.3F67.0020.0002] # YI SYLLABLE SSUP +A340 ; [.3F68.0020.0002] # YI SYLLABLE SSYT +A341 ; [.3F69.0020.0002] # YI SYLLABLE SSYX +A342 ; [.3F6A.0020.0002] # YI SYLLABLE SSY +A343 ; [.3F6B.0020.0002] # YI SYLLABLE SSYP +A344 ; [.3F6C.0020.0002] # YI SYLLABLE SSYRX +A345 ; [.3F6D.0020.0002] # YI SYLLABLE SSYR +A346 ; [.3F6E.0020.0002] # YI SYLLABLE ZHAT +A347 ; [.3F6F.0020.0002] # YI SYLLABLE ZHAX +A348 ; [.3F70.0020.0002] # YI SYLLABLE ZHA +A349 ; [.3F71.0020.0002] # YI SYLLABLE ZHAP +A34A ; [.3F72.0020.0002] # YI SYLLABLE ZHUOX +A34B ; [.3F73.0020.0002] # YI SYLLABLE ZHUO +A34C ; [.3F74.0020.0002] # YI SYLLABLE ZHUOP +A34D ; [.3F75.0020.0002] # YI SYLLABLE ZHOT +A34E ; [.3F76.0020.0002] # YI SYLLABLE ZHOX +A34F ; [.3F77.0020.0002] # YI SYLLABLE ZHO +A350 ; [.3F78.0020.0002] # YI SYLLABLE ZHOP +A351 ; [.3F79.0020.0002] # YI SYLLABLE ZHET +A352 ; [.3F7A.0020.0002] # YI SYLLABLE ZHEX +A353 ; [.3F7B.0020.0002] # YI SYLLABLE ZHE +A354 ; [.3F7C.0020.0002] # YI SYLLABLE ZHEP +A355 ; [.3F7D.0020.0002] # YI SYLLABLE ZHUT +A356 ; [.3F7E.0020.0002] # YI SYLLABLE ZHUX +A357 ; [.3F7F.0020.0002] # YI SYLLABLE ZHU +A358 ; [.3F80.0020.0002] # YI SYLLABLE ZHUP +A359 ; [.3F81.0020.0002] # YI SYLLABLE ZHURX +A35A ; [.3F82.0020.0002] # YI SYLLABLE ZHUR +A35B ; [.3F83.0020.0002] # YI SYLLABLE ZHYT +A35C ; [.3F84.0020.0002] # YI SYLLABLE ZHYX +A35D ; [.3F85.0020.0002] # YI SYLLABLE ZHY +A35E ; [.3F86.0020.0002] # YI SYLLABLE ZHYP +A35F ; [.3F87.0020.0002] # YI SYLLABLE ZHYRX +A360 ; [.3F88.0020.0002] # YI SYLLABLE ZHYR +A361 ; [.3F89.0020.0002] # YI SYLLABLE CHAT +A362 ; [.3F8A.0020.0002] # YI SYLLABLE CHAX +A363 ; [.3F8B.0020.0002] # YI SYLLABLE CHA +A364 ; [.3F8C.0020.0002] # YI SYLLABLE CHAP +A365 ; [.3F8D.0020.0002] # YI SYLLABLE CHUOT +A366 ; [.3F8E.0020.0002] # YI SYLLABLE CHUOX +A367 ; [.3F8F.0020.0002] # YI SYLLABLE CHUO +A368 ; [.3F90.0020.0002] # YI SYLLABLE CHUOP +A369 ; [.3F91.0020.0002] # YI SYLLABLE CHOT +A36A ; [.3F92.0020.0002] # YI SYLLABLE CHOX +A36B ; [.3F93.0020.0002] # YI SYLLABLE CHO +A36C ; [.3F94.0020.0002] # YI SYLLABLE CHOP +A36D ; [.3F95.0020.0002] # YI SYLLABLE CHET +A36E ; [.3F96.0020.0002] # YI SYLLABLE CHEX +A36F ; [.3F97.0020.0002] # YI SYLLABLE CHE +A370 ; [.3F98.0020.0002] # YI SYLLABLE CHEP +A371 ; [.3F99.0020.0002] # YI SYLLABLE CHUX +A372 ; [.3F9A.0020.0002] # YI SYLLABLE CHU +A373 ; [.3F9B.0020.0002] # YI SYLLABLE CHUP +A374 ; [.3F9C.0020.0002] # YI SYLLABLE CHURX +A375 ; [.3F9D.0020.0002] # YI SYLLABLE CHUR +A376 ; [.3F9E.0020.0002] # YI SYLLABLE CHYT +A377 ; [.3F9F.0020.0002] # YI SYLLABLE CHYX +A378 ; [.3FA0.0020.0002] # YI SYLLABLE CHY +A379 ; [.3FA1.0020.0002] # YI SYLLABLE CHYP +A37A ; [.3FA2.0020.0002] # YI SYLLABLE CHYRX +A37B ; [.3FA3.0020.0002] # YI SYLLABLE CHYR +A37C ; [.3FA4.0020.0002] # YI SYLLABLE RRAX +A37D ; [.3FA5.0020.0002] # YI SYLLABLE RRA +A37E ; [.3FA6.0020.0002] # YI SYLLABLE RRUOX +A37F ; [.3FA7.0020.0002] # YI SYLLABLE RRUO +A380 ; [.3FA8.0020.0002] # YI SYLLABLE RROT +A381 ; [.3FA9.0020.0002] # YI SYLLABLE RROX +A382 ; [.3FAA.0020.0002] # YI SYLLABLE RRO +A383 ; [.3FAB.0020.0002] # YI SYLLABLE RROP +A384 ; [.3FAC.0020.0002] # YI SYLLABLE RRET +A385 ; [.3FAD.0020.0002] # YI SYLLABLE RREX +A386 ; [.3FAE.0020.0002] # YI SYLLABLE RRE +A387 ; [.3FAF.0020.0002] # YI SYLLABLE RREP +A388 ; [.3FB0.0020.0002] # YI SYLLABLE RRUT +A389 ; [.3FB1.0020.0002] # YI SYLLABLE RRUX +A38A ; [.3FB2.0020.0002] # YI SYLLABLE RRU +A38B ; [.3FB3.0020.0002] # YI SYLLABLE RRUP +A38C ; [.3FB4.0020.0002] # YI SYLLABLE RRURX +A38D ; [.3FB5.0020.0002] # YI SYLLABLE RRUR +A38E ; [.3FB6.0020.0002] # YI SYLLABLE RRYT +A38F ; [.3FB7.0020.0002] # YI SYLLABLE RRYX +A390 ; [.3FB8.0020.0002] # YI SYLLABLE RRY +A391 ; [.3FB9.0020.0002] # YI SYLLABLE RRYP +A392 ; [.3FBA.0020.0002] # YI SYLLABLE RRYRX +A393 ; [.3FBB.0020.0002] # YI SYLLABLE RRYR +A394 ; [.3FBC.0020.0002] # YI SYLLABLE NRAT +A395 ; [.3FBD.0020.0002] # YI SYLLABLE NRAX +A396 ; [.3FBE.0020.0002] # YI SYLLABLE NRA +A397 ; [.3FBF.0020.0002] # YI SYLLABLE NRAP +A398 ; [.3FC0.0020.0002] # YI SYLLABLE NROX +A399 ; [.3FC1.0020.0002] # YI SYLLABLE NRO +A39A ; [.3FC2.0020.0002] # YI SYLLABLE NROP +A39B ; [.3FC3.0020.0002] # YI SYLLABLE NRET +A39C ; [.3FC4.0020.0002] # YI SYLLABLE NREX +A39D ; [.3FC5.0020.0002] # YI SYLLABLE NRE +A39E ; [.3FC6.0020.0002] # YI SYLLABLE NREP +A39F ; [.3FC7.0020.0002] # YI SYLLABLE NRUT +A3A0 ; [.3FC8.0020.0002] # YI SYLLABLE NRUX +A3A1 ; [.3FC9.0020.0002] # YI SYLLABLE NRU +A3A2 ; [.3FCA.0020.0002] # YI SYLLABLE NRUP +A3A3 ; [.3FCB.0020.0002] # YI SYLLABLE NRURX +A3A4 ; [.3FCC.0020.0002] # YI SYLLABLE NRUR +A3A5 ; [.3FCD.0020.0002] # YI SYLLABLE NRYT +A3A6 ; [.3FCE.0020.0002] # YI SYLLABLE NRYX +A3A7 ; [.3FCF.0020.0002] # YI SYLLABLE NRY +A3A8 ; [.3FD0.0020.0002] # YI SYLLABLE NRYP +A3A9 ; [.3FD1.0020.0002] # YI SYLLABLE NRYRX +A3AA ; [.3FD2.0020.0002] # YI SYLLABLE NRYR +A3AB ; [.3FD3.0020.0002] # YI SYLLABLE SHAT +A3AC ; [.3FD4.0020.0002] # YI SYLLABLE SHAX +A3AD ; [.3FD5.0020.0002] # YI SYLLABLE SHA +A3AE ; [.3FD6.0020.0002] # YI SYLLABLE SHAP +A3AF ; [.3FD7.0020.0002] # YI SYLLABLE SHUOX +A3B0 ; [.3FD8.0020.0002] # YI SYLLABLE SHUO +A3B1 ; [.3FD9.0020.0002] # YI SYLLABLE SHUOP +A3B2 ; [.3FDA.0020.0002] # YI SYLLABLE SHOT +A3B3 ; [.3FDB.0020.0002] # YI SYLLABLE SHOX +A3B4 ; [.3FDC.0020.0002] # YI SYLLABLE SHO +A3B5 ; [.3FDD.0020.0002] # YI SYLLABLE SHOP +A3B6 ; [.3FDE.0020.0002] # YI SYLLABLE SHET +A3B7 ; [.3FDF.0020.0002] # YI SYLLABLE SHEX +A3B8 ; [.3FE0.0020.0002] # YI SYLLABLE SHE +A3B9 ; [.3FE1.0020.0002] # YI SYLLABLE SHEP +A3BA ; [.3FE2.0020.0002] # YI SYLLABLE SHUT +A3BB ; [.3FE3.0020.0002] # YI SYLLABLE SHUX +A3BC ; [.3FE4.0020.0002] # YI SYLLABLE SHU +A3BD ; [.3FE5.0020.0002] # YI SYLLABLE SHUP +A3BE ; [.3FE6.0020.0002] # YI SYLLABLE SHURX +A3BF ; [.3FE7.0020.0002] # YI SYLLABLE SHUR +A3C0 ; [.3FE8.0020.0002] # YI SYLLABLE SHYT +A3C1 ; [.3FE9.0020.0002] # YI SYLLABLE SHYX +A3C2 ; [.3FEA.0020.0002] # YI SYLLABLE SHY +A3C3 ; [.3FEB.0020.0002] # YI SYLLABLE SHYP +A3C4 ; [.3FEC.0020.0002] # YI SYLLABLE SHYRX +A3C5 ; [.3FED.0020.0002] # YI SYLLABLE SHYR +A3C6 ; [.3FEE.0020.0002] # YI SYLLABLE RAT +A3C7 ; [.3FEF.0020.0002] # YI SYLLABLE RAX +A3C8 ; [.3FF0.0020.0002] # YI SYLLABLE RA +A3C9 ; [.3FF1.0020.0002] # YI SYLLABLE RAP +A3CA ; [.3FF2.0020.0002] # YI SYLLABLE RUOX +A3CB ; [.3FF3.0020.0002] # YI SYLLABLE RUO +A3CC ; [.3FF4.0020.0002] # YI SYLLABLE RUOP +A3CD ; [.3FF5.0020.0002] # YI SYLLABLE ROT +A3CE ; [.3FF6.0020.0002] # YI SYLLABLE ROX +A3CF ; [.3FF7.0020.0002] # YI SYLLABLE RO +A3D0 ; [.3FF8.0020.0002] # YI SYLLABLE ROP +A3D1 ; [.3FF9.0020.0002] # YI SYLLABLE REX +A3D2 ; [.3FFA.0020.0002] # YI SYLLABLE RE +A3D3 ; [.3FFB.0020.0002] # YI SYLLABLE REP +A3D4 ; [.3FFC.0020.0002] # YI SYLLABLE RUT +A3D5 ; [.3FFD.0020.0002] # YI SYLLABLE RUX +A3D6 ; [.3FFE.0020.0002] # YI SYLLABLE RU +A3D7 ; [.3FFF.0020.0002] # YI SYLLABLE RUP +A3D8 ; [.4000.0020.0002] # YI SYLLABLE RURX +A3D9 ; [.4001.0020.0002] # YI SYLLABLE RUR +A3DA ; [.4002.0020.0002] # YI SYLLABLE RYT +A3DB ; [.4003.0020.0002] # YI SYLLABLE RYX +A3DC ; [.4004.0020.0002] # YI SYLLABLE RY +A3DD ; [.4005.0020.0002] # YI SYLLABLE RYP +A3DE ; [.4006.0020.0002] # YI SYLLABLE RYRX +A3DF ; [.4007.0020.0002] # YI SYLLABLE RYR +A3E0 ; [.4008.0020.0002] # YI SYLLABLE JIT +A3E1 ; [.4009.0020.0002] # YI SYLLABLE JIX +A3E2 ; [.400A.0020.0002] # YI SYLLABLE JI +A3E3 ; [.400B.0020.0002] # YI SYLLABLE JIP +A3E4 ; [.400C.0020.0002] # YI SYLLABLE JIET +A3E5 ; [.400D.0020.0002] # YI SYLLABLE JIEX +A3E6 ; [.400E.0020.0002] # YI SYLLABLE JIE +A3E7 ; [.400F.0020.0002] # YI SYLLABLE JIEP +A3E8 ; [.4010.0020.0002] # YI SYLLABLE JUOT +A3E9 ; [.4011.0020.0002] # YI SYLLABLE JUOX +A3EA ; [.4012.0020.0002] # YI SYLLABLE JUO +A3EB ; [.4013.0020.0002] # YI SYLLABLE JUOP +A3EC ; [.4014.0020.0002] # YI SYLLABLE JOT +A3ED ; [.4015.0020.0002] # YI SYLLABLE JOX +A3EE ; [.4016.0020.0002] # YI SYLLABLE JO +A3EF ; [.4017.0020.0002] # YI SYLLABLE JOP +A3F0 ; [.4018.0020.0002] # YI SYLLABLE JUT +A3F1 ; [.4019.0020.0002] # YI SYLLABLE JUX +A3F2 ; [.401A.0020.0002] # YI SYLLABLE JU +A3F3 ; [.401B.0020.0002] # YI SYLLABLE JUP +A3F4 ; [.401C.0020.0002] # YI SYLLABLE JURX +A3F5 ; [.401D.0020.0002] # YI SYLLABLE JUR +A3F6 ; [.401E.0020.0002] # YI SYLLABLE JYT +A3F7 ; [.401F.0020.0002] # YI SYLLABLE JYX +A3F8 ; [.4020.0020.0002] # YI SYLLABLE JY +A3F9 ; [.4021.0020.0002] # YI SYLLABLE JYP +A3FA ; [.4022.0020.0002] # YI SYLLABLE JYRX +A3FB ; [.4023.0020.0002] # YI SYLLABLE JYR +A3FC ; [.4024.0020.0002] # YI SYLLABLE QIT +A3FD ; [.4025.0020.0002] # YI SYLLABLE QIX +A3FE ; [.4026.0020.0002] # YI SYLLABLE QI +A3FF ; [.4027.0020.0002] # YI SYLLABLE QIP +A400 ; [.4028.0020.0002] # YI SYLLABLE QIET +A401 ; [.4029.0020.0002] # YI SYLLABLE QIEX +A402 ; [.402A.0020.0002] # YI SYLLABLE QIE +A403 ; [.402B.0020.0002] # YI SYLLABLE QIEP +A404 ; [.402C.0020.0002] # YI SYLLABLE QUOT +A405 ; [.402D.0020.0002] # YI SYLLABLE QUOX +A406 ; [.402E.0020.0002] # YI SYLLABLE QUO +A407 ; [.402F.0020.0002] # YI SYLLABLE QUOP +A408 ; [.4030.0020.0002] # YI SYLLABLE QOT +A409 ; [.4031.0020.0002] # YI SYLLABLE QOX +A40A ; [.4032.0020.0002] # YI SYLLABLE QO +A40B ; [.4033.0020.0002] # YI SYLLABLE QOP +A40C ; [.4034.0020.0002] # YI SYLLABLE QUT +A40D ; [.4035.0020.0002] # YI SYLLABLE QUX +A40E ; [.4036.0020.0002] # YI SYLLABLE QU +A40F ; [.4037.0020.0002] # YI SYLLABLE QUP +A410 ; [.4038.0020.0002] # YI SYLLABLE QURX +A411 ; [.4039.0020.0002] # YI SYLLABLE QUR +A412 ; [.403A.0020.0002] # YI SYLLABLE QYT +A413 ; [.403B.0020.0002] # YI SYLLABLE QYX +A414 ; [.403C.0020.0002] # YI SYLLABLE QY +A415 ; [.403D.0020.0002] # YI SYLLABLE QYP +A416 ; [.403E.0020.0002] # YI SYLLABLE QYRX +A417 ; [.403F.0020.0002] # YI SYLLABLE QYR +A418 ; [.4040.0020.0002] # YI SYLLABLE JJIT +A419 ; [.4041.0020.0002] # YI SYLLABLE JJIX +A41A ; [.4042.0020.0002] # YI SYLLABLE JJI +A41B ; [.4043.0020.0002] # YI SYLLABLE JJIP +A41C ; [.4044.0020.0002] # YI SYLLABLE JJIET +A41D ; [.4045.0020.0002] # YI SYLLABLE JJIEX +A41E ; [.4046.0020.0002] # YI SYLLABLE JJIE +A41F ; [.4047.0020.0002] # YI SYLLABLE JJIEP +A420 ; [.4048.0020.0002] # YI SYLLABLE JJUOX +A421 ; [.4049.0020.0002] # YI SYLLABLE JJUO +A422 ; [.404A.0020.0002] # YI SYLLABLE JJUOP +A423 ; [.404B.0020.0002] # YI SYLLABLE JJOT +A424 ; [.404C.0020.0002] # YI SYLLABLE JJOX +A425 ; [.404D.0020.0002] # YI SYLLABLE JJO +A426 ; [.404E.0020.0002] # YI SYLLABLE JJOP +A427 ; [.404F.0020.0002] # YI SYLLABLE JJUT +A428 ; [.4050.0020.0002] # YI SYLLABLE JJUX +A429 ; [.4051.0020.0002] # YI SYLLABLE JJU +A42A ; [.4052.0020.0002] # YI SYLLABLE JJUP +A42B ; [.4053.0020.0002] # YI SYLLABLE JJURX +A42C ; [.4054.0020.0002] # YI SYLLABLE JJUR +A42D ; [.4055.0020.0002] # YI SYLLABLE JJYT +A42E ; [.4056.0020.0002] # YI SYLLABLE JJYX +A42F ; [.4057.0020.0002] # YI SYLLABLE JJY +A430 ; [.4058.0020.0002] # YI SYLLABLE JJYP +A431 ; [.4059.0020.0002] # YI SYLLABLE NJIT +A432 ; [.405A.0020.0002] # YI SYLLABLE NJIX +A433 ; [.405B.0020.0002] # YI SYLLABLE NJI +A434 ; [.405C.0020.0002] # YI SYLLABLE NJIP +A435 ; [.405D.0020.0002] # YI SYLLABLE NJIET +A436 ; [.405E.0020.0002] # YI SYLLABLE NJIEX +A437 ; [.405F.0020.0002] # YI SYLLABLE NJIE +A438 ; [.4060.0020.0002] # YI SYLLABLE NJIEP +A439 ; [.4061.0020.0002] # YI SYLLABLE NJUOX +A43A ; [.4062.0020.0002] # YI SYLLABLE NJUO +A43B ; [.4063.0020.0002] # YI SYLLABLE NJOT +A43C ; [.4064.0020.0002] # YI SYLLABLE NJOX +A43D ; [.4065.0020.0002] # YI SYLLABLE NJO +A43E ; [.4066.0020.0002] # YI SYLLABLE NJOP +A43F ; [.4067.0020.0002] # YI SYLLABLE NJUX +A440 ; [.4068.0020.0002] # YI SYLLABLE NJU +A441 ; [.4069.0020.0002] # YI SYLLABLE NJUP +A442 ; [.406A.0020.0002] # YI SYLLABLE NJURX +A443 ; [.406B.0020.0002] # YI SYLLABLE NJUR +A444 ; [.406C.0020.0002] # YI SYLLABLE NJYT +A445 ; [.406D.0020.0002] # YI SYLLABLE NJYX +A446 ; [.406E.0020.0002] # YI SYLLABLE NJY +A447 ; [.406F.0020.0002] # YI SYLLABLE NJYP +A448 ; [.4070.0020.0002] # YI SYLLABLE NJYRX +A449 ; [.4071.0020.0002] # YI SYLLABLE NJYR +A44A ; [.4072.0020.0002] # YI SYLLABLE NYIT +A44B ; [.4073.0020.0002] # YI SYLLABLE NYIX +A44C ; [.4074.0020.0002] # YI SYLLABLE NYI +A44D ; [.4075.0020.0002] # YI SYLLABLE NYIP +A44E ; [.4076.0020.0002] # YI SYLLABLE NYIET +A44F ; [.4077.0020.0002] # YI SYLLABLE NYIEX +A450 ; [.4078.0020.0002] # YI SYLLABLE NYIE +A451 ; [.4079.0020.0002] # YI SYLLABLE NYIEP +A452 ; [.407A.0020.0002] # YI SYLLABLE NYUOX +A453 ; [.407B.0020.0002] # YI SYLLABLE NYUO +A454 ; [.407C.0020.0002] # YI SYLLABLE NYUOP +A455 ; [.407D.0020.0002] # YI SYLLABLE NYOT +A456 ; [.407E.0020.0002] # YI SYLLABLE NYOX +A457 ; [.407F.0020.0002] # YI SYLLABLE NYO +A458 ; [.4080.0020.0002] # YI SYLLABLE NYOP +A459 ; [.4081.0020.0002] # YI SYLLABLE NYUT +A45A ; [.4082.0020.0002] # YI SYLLABLE NYUX +A45B ; [.4083.0020.0002] # YI SYLLABLE NYU +A45C ; [.4084.0020.0002] # YI SYLLABLE NYUP +A45D ; [.4085.0020.0002] # YI SYLLABLE XIT +A45E ; [.4086.0020.0002] # YI SYLLABLE XIX +A45F ; [.4087.0020.0002] # YI SYLLABLE XI +A460 ; [.4088.0020.0002] # YI SYLLABLE XIP +A461 ; [.4089.0020.0002] # YI SYLLABLE XIET +A462 ; [.408A.0020.0002] # YI SYLLABLE XIEX +A463 ; [.408B.0020.0002] # YI SYLLABLE XIE +A464 ; [.408C.0020.0002] # YI SYLLABLE XIEP +A465 ; [.408D.0020.0002] # YI SYLLABLE XUOX +A466 ; [.408E.0020.0002] # YI SYLLABLE XUO +A467 ; [.408F.0020.0002] # YI SYLLABLE XOT +A468 ; [.4090.0020.0002] # YI SYLLABLE XOX +A469 ; [.4091.0020.0002] # YI SYLLABLE XO +A46A ; [.4092.0020.0002] # YI SYLLABLE XOP +A46B ; [.4093.0020.0002] # YI SYLLABLE XYT +A46C ; [.4094.0020.0002] # YI SYLLABLE XYX +A46D ; [.4095.0020.0002] # YI SYLLABLE XY +A46E ; [.4096.0020.0002] # YI SYLLABLE XYP +A46F ; [.4097.0020.0002] # YI SYLLABLE XYRX +A470 ; [.4098.0020.0002] # YI SYLLABLE XYR +A471 ; [.4099.0020.0002] # YI SYLLABLE YIT +A472 ; [.409A.0020.0002] # YI SYLLABLE YIX +A473 ; [.409B.0020.0002] # YI SYLLABLE YI +A474 ; [.409C.0020.0002] # YI SYLLABLE YIP +A475 ; [.409D.0020.0002] # YI SYLLABLE YIET +A476 ; [.409E.0020.0002] # YI SYLLABLE YIEX +A477 ; [.409F.0020.0002] # YI SYLLABLE YIE +A478 ; [.40A0.0020.0002] # YI SYLLABLE YIEP +A479 ; [.40A1.0020.0002] # YI SYLLABLE YUOT +A47A ; [.40A2.0020.0002] # YI SYLLABLE YUOX +A47B ; [.40A3.0020.0002] # YI SYLLABLE YUO +A47C ; [.40A4.0020.0002] # YI SYLLABLE YUOP +A47D ; [.40A5.0020.0002] # YI SYLLABLE YOT +A47E ; [.40A6.0020.0002] # YI SYLLABLE YOX +A47F ; [.40A7.0020.0002] # YI SYLLABLE YO +A480 ; [.40A8.0020.0002] # YI SYLLABLE YOP +A481 ; [.40A9.0020.0002] # YI SYLLABLE YUT +A482 ; [.40AA.0020.0002] # YI SYLLABLE YUX +A483 ; [.40AB.0020.0002] # YI SYLLABLE YU +A484 ; [.40AC.0020.0002] # YI SYLLABLE YUP +A485 ; [.40AD.0020.0002] # YI SYLLABLE YURX +A486 ; [.40AE.0020.0002] # YI SYLLABLE YUR +A487 ; [.40AF.0020.0002] # YI SYLLABLE YYT +A488 ; [.40B0.0020.0002] # YI SYLLABLE YYX +A489 ; [.40B1.0020.0002] # YI SYLLABLE YY +A48A ; [.40B2.0020.0002] # YI SYLLABLE YYP +A48B ; [.40B3.0020.0002] # YI SYLLABLE YYRX +A48C ; [.40B4.0020.0002] # YI SYLLABLE YYR +A4F8 ; [.40B5.0020.0002] # LISU LETTER TONE MYA TI +A4F9 ; [.40B6.0020.0002] # LISU LETTER TONE NA PO +A4FA ; [.40B7.0020.0002] # LISU LETTER TONE MYA CYA +A4FB ; [.40B8.0020.0002] # LISU LETTER TONE MYA BO +A4FD ; [.40B9.0020.0002] # LISU LETTER TONE MYA JEU +A4FC ; [.40BA.0020.0002] # LISU LETTER TONE MYA NA +A4D0 ; [.40BB.0020.0002] # LISU LETTER BA +A4D1 ; [.40BC.0020.0002] # LISU LETTER PA +A4D2 ; [.40BD.0020.0002] # LISU LETTER PHA +A4D3 ; [.40BE.0020.0002] # LISU LETTER DA +A4D4 ; [.40BF.0020.0002] # LISU LETTER TA +A4D5 ; [.40C0.0020.0002] # LISU LETTER THA +A4D6 ; [.40C1.0020.0002] # LISU LETTER GA +A4D7 ; [.40C2.0020.0002] # LISU LETTER KA +A4D8 ; [.40C3.0020.0002] # LISU LETTER KHA +A4D9 ; [.40C4.0020.0002] # LISU LETTER JA +A4DA ; [.40C5.0020.0002] # LISU LETTER CA +A4DB ; [.40C6.0020.0002] # LISU LETTER CHA +A4DC ; [.40C7.0020.0002] # LISU LETTER DZA +A4DD ; [.40C8.0020.0002] # LISU LETTER TSA +A4DE ; [.40C9.0020.0002] # LISU LETTER TSHA +A4DF ; [.40CA.0020.0002] # LISU LETTER MA +A4E0 ; [.40CB.0020.0002] # LISU LETTER NA +A4E1 ; [.40CC.0020.0002] # LISU LETTER LA +A4E2 ; [.40CD.0020.0002] # LISU LETTER SA +A4E3 ; [.40CE.0020.0002] # LISU LETTER ZHA +A4E4 ; [.40CF.0020.0002] # LISU LETTER ZA +A4E5 ; [.40D0.0020.0002] # LISU LETTER NGA +A4E6 ; [.40D1.0020.0002] # LISU LETTER HA +A4E7 ; [.40D2.0020.0002] # LISU LETTER XA +A4E8 ; [.40D3.0020.0002] # LISU LETTER HHA +A4E9 ; [.40D4.0020.0002] # LISU LETTER FA +A4EB ; [.40D5.0020.0002] # LISU LETTER SHA +A4ED ; [.40D6.0020.0002] # LISU LETTER GHA +A4EA ; [.40D7.0020.0002] # LISU LETTER WA +A4EC ; [.40D8.0020.0002] # LISU LETTER YA +A4EE ; [.40D9.0020.0002] # LISU LETTER A +A4EF ; [.40DA.0020.0002] # LISU LETTER AE +A4F0 ; [.40DB.0020.0002] # LISU LETTER E +A4F1 ; [.40DC.0020.0002] # LISU LETTER EU +A4F2 ; [.40DD.0020.0002] # LISU LETTER I +A4F3 ; [.40DE.0020.0002] # LISU LETTER O +A4F4 ; [.40DF.0020.0002] # LISU LETTER U +A4F5 ; [.40E0.0020.0002] # LISU LETTER UE +A4F6 ; [.40E1.0020.0002] # LISU LETTER UH +A4F7 ; [.40E2.0020.0002] # LISU LETTER OE +16F00 ; [.40E3.0020.0002] # MIAO LETTER PA +16F01 ; [.40E4.0020.0002] # MIAO LETTER BA +16F02 ; [.40E5.0020.0002] # MIAO LETTER YI PA +16F03 ; [.40E6.0020.0002] # MIAO LETTER PLA +16F04 ; [.40E7.0020.0002] # MIAO LETTER MA +16F06 ; [.40E7.0020.0004] # MIAO LETTER ARCHAIC MA +16F05 ; [.40E8.0020.0002] # MIAO LETTER MHA +16F07 ; [.40E9.0020.0002] # MIAO LETTER FA +16F08 ; [.40EA.0020.0002] # MIAO LETTER VA +16F09 ; [.40EB.0020.0002] # MIAO LETTER VFA +16F0A ; [.40EC.0020.0002] # MIAO LETTER TA +16F0B ; [.40ED.0020.0002] # MIAO LETTER DA +16F0C ; [.40EE.0020.0002] # MIAO LETTER YI TTA +16F0D ; [.40EF.0020.0002] # MIAO LETTER YI TA +16F0E ; [.40F0.0020.0002] # MIAO LETTER TTA +16F0F ; [.40F1.0020.0002] # MIAO LETTER DDA +16F10 ; [.40F2.0020.0002] # MIAO LETTER NA +16F13 ; [.40F2.0020.0004] # MIAO LETTER ARCHAIC NA +16F11 ; [.40F3.0020.0002] # MIAO LETTER NHA +16F12 ; [.40F4.0020.0002] # MIAO LETTER YI NNA +16F14 ; [.40F5.0020.0002] # MIAO LETTER NNA +16F15 ; [.40F6.0020.0002] # MIAO LETTER NNHA +16F16 ; [.40F7.0020.0002] # MIAO LETTER LA +16F17 ; [.40F8.0020.0002] # MIAO LETTER LYA +16F18 ; [.40F9.0020.0002] # MIAO LETTER LHA +16F19 ; [.40FA.0020.0002] # MIAO LETTER LHYA +16F1A ; [.40FB.0020.0002] # MIAO LETTER TLHA +16F1B ; [.40FC.0020.0002] # MIAO LETTER DLHA +16F1C ; [.40FD.0020.0002] # MIAO LETTER TLHYA +16F1D ; [.40FE.0020.0002] # MIAO LETTER DLHYA +16F1E ; [.40FF.0020.0002] # MIAO LETTER KA +16F1F ; [.4100.0020.0002] # MIAO LETTER GA +16F20 ; [.4101.0020.0002] # MIAO LETTER YI KA +16F21 ; [.4102.0020.0002] # MIAO LETTER QA +16F22 ; [.4103.0020.0002] # MIAO LETTER QGA +16F23 ; [.4104.0020.0002] # MIAO LETTER NGA +16F25 ; [.4104.0020.0004] # MIAO LETTER ARCHAIC NGA +16F24 ; [.4105.0020.0002] # MIAO LETTER NGHA +16F26 ; [.4106.0020.0002] # MIAO LETTER HA +16F27 ; [.4107.0020.0002] # MIAO LETTER XA +16F28 ; [.4108.0020.0002] # MIAO LETTER GHA +16F29 ; [.4109.0020.0002] # MIAO LETTER GHHA +16F2A ; [.410A.0020.0002] # MIAO LETTER TSSA +16F2B ; [.410B.0020.0002] # MIAO LETTER DZZA +16F2C ; [.410C.0020.0002] # MIAO LETTER NYA +16F2D ; [.410D.0020.0002] # MIAO LETTER NYHA +16F2E ; [.410E.0020.0002] # MIAO LETTER TSHA +16F2F ; [.410F.0020.0002] # MIAO LETTER DZHA +16F30 ; [.4110.0020.0002] # MIAO LETTER YI TSHA +16F31 ; [.4111.0020.0002] # MIAO LETTER YI DZHA +16F32 ; [.4112.0020.0002] # MIAO LETTER REFORMED TSHA +16F33 ; [.4113.0020.0002] # MIAO LETTER SHA +16F34 ; [.4114.0020.0002] # MIAO LETTER SSA +16F35 ; [.4115.0020.0002] # MIAO LETTER ZHA +16F36 ; [.4116.0020.0002] # MIAO LETTER ZSHA +16F37 ; [.4117.0020.0002] # MIAO LETTER TSA +16F38 ; [.4118.0020.0002] # MIAO LETTER DZA +16F39 ; [.4119.0020.0002] # MIAO LETTER YI TSA +16F3A ; [.411A.0020.0002] # MIAO LETTER SA +16F3B ; [.411B.0020.0002] # MIAO LETTER ZA +16F3C ; [.411C.0020.0002] # MIAO LETTER ZSA +16F3D ; [.411D.0020.0002] # MIAO LETTER ZZA +16F3F ; [.411D.0020.0004] # MIAO LETTER ARCHAIC ZZA +16F3E ; [.411E.0020.0002] # MIAO LETTER ZZSA +16F40 ; [.411F.0020.0002] # MIAO LETTER ZZYA +16F41 ; [.4120.0020.0002] # MIAO LETTER ZZSYA +16F42 ; [.4121.0020.0002] # MIAO LETTER WA +16F43 ; [.4122.0020.0002] # MIAO LETTER AH +16F44 ; [.4123.0020.0002] # MIAO LETTER HHA +16F50 ; [.4124.0020.0002] # MIAO LETTER NASALIZATION +16F51 ; [.4125.0020.0002] # MIAO SIGN ASPIRATION +16F52 ; [.4126.0020.0002] # MIAO SIGN REFORMED VOICING +16F53 ; [.4127.0020.0002] # MIAO SIGN REFORMED ASPIRATION +16F54 ; [.4128.0020.0002] # MIAO VOWEL SIGN A +16F55 ; [.4129.0020.0002] # MIAO VOWEL SIGN AA +16F56 ; [.412A.0020.0002] # MIAO VOWEL SIGN AHH +16F57 ; [.412B.0020.0002] # MIAO VOWEL SIGN AN +16F58 ; [.412C.0020.0002] # MIAO VOWEL SIGN ANG +16F59 ; [.412D.0020.0002] # MIAO VOWEL SIGN O +16F5A ; [.412E.0020.0002] # MIAO VOWEL SIGN OO +16F5B ; [.412F.0020.0002] # MIAO VOWEL SIGN WO +16F5C ; [.4130.0020.0002] # MIAO VOWEL SIGN W +16F5D ; [.4131.0020.0002] # MIAO VOWEL SIGN E +16F5E ; [.4132.0020.0002] # MIAO VOWEL SIGN EN +16F5F ; [.4133.0020.0002] # MIAO VOWEL SIGN ENG +16F60 ; [.4134.0020.0002] # MIAO VOWEL SIGN OEY +16F61 ; [.4135.0020.0002] # MIAO VOWEL SIGN I +16F62 ; [.4136.0020.0002] # MIAO VOWEL SIGN IA +16F63 ; [.4137.0020.0002] # MIAO VOWEL SIGN IAN +16F64 ; [.4138.0020.0002] # MIAO VOWEL SIGN IANG +16F65 ; [.4139.0020.0002] # MIAO VOWEL SIGN IO +16F66 ; [.413A.0020.0002] # MIAO VOWEL SIGN IE +16F67 ; [.413B.0020.0002] # MIAO VOWEL SIGN II +16F68 ; [.413C.0020.0002] # MIAO VOWEL SIGN IU +16F69 ; [.413D.0020.0002] # MIAO VOWEL SIGN ING +16F6A ; [.413E.0020.0002] # MIAO VOWEL SIGN U +16F6B ; [.413F.0020.0002] # MIAO VOWEL SIGN UA +16F6C ; [.4140.0020.0002] # MIAO VOWEL SIGN UAN +16F6D ; [.4141.0020.0002] # MIAO VOWEL SIGN UANG +16F6E ; [.4142.0020.0002] # MIAO VOWEL SIGN UU +16F6F ; [.4143.0020.0002] # MIAO VOWEL SIGN UEI +16F70 ; [.4144.0020.0002] # MIAO VOWEL SIGN UNG +16F71 ; [.4145.0020.0002] # MIAO VOWEL SIGN Y +16F72 ; [.4146.0020.0002] # MIAO VOWEL SIGN YI +16F73 ; [.4147.0020.0002] # MIAO VOWEL SIGN AE +16F74 ; [.4148.0020.0002] # MIAO VOWEL SIGN AEE +16F75 ; [.4149.0020.0002] # MIAO VOWEL SIGN ERR +16F76 ; [.414A.0020.0002] # MIAO VOWEL SIGN ROUNDED ERR +16F77 ; [.414B.0020.0002] # MIAO VOWEL SIGN ER +16F78 ; [.414C.0020.0002] # MIAO VOWEL SIGN ROUNDED ER +16F79 ; [.414D.0020.0002] # MIAO VOWEL SIGN AI +16F7A ; [.414E.0020.0002] # MIAO VOWEL SIGN EI +16F7B ; [.414F.0020.0002] # MIAO VOWEL SIGN AU +16F7C ; [.4150.0020.0002] # MIAO VOWEL SIGN OU +16F7D ; [.4151.0020.0002] # MIAO VOWEL SIGN N +16F7E ; [.4152.0020.0002] # MIAO VOWEL SIGN NG +16F8F ; [.4153.0020.0002] # MIAO TONE RIGHT +16F90 ; [.4154.0020.0002] # MIAO TONE TOP RIGHT +16F91 ; [.4155.0020.0002] # MIAO TONE ABOVE +16F92 ; [.4156.0020.0002] # MIAO TONE BELOW +16F93 ; [.4157.0020.0002] # MIAO LETTER TONE-2 +16F94 ; [.4158.0020.0002] # MIAO LETTER TONE-3 +16F95 ; [.4159.0020.0002] # MIAO LETTER TONE-4 +16F96 ; [.415A.0020.0002] # MIAO LETTER TONE-5 +16F97 ; [.415B.0020.0002] # MIAO LETTER TONE-6 +16F98 ; [.415C.0020.0002] # MIAO LETTER TONE-7 +16F99 ; [.415D.0020.0002] # MIAO LETTER TONE-8 +16F9A ; [.415E.0020.0002] # MIAO LETTER REFORMED TONE-1 +16F9B ; [.415F.0020.0002] # MIAO LETTER REFORMED TONE-2 +16F9C ; [.4160.0020.0002] # MIAO LETTER REFORMED TONE-4 +16F9D ; [.4161.0020.0002] # MIAO LETTER REFORMED TONE-5 +16F9E ; [.4162.0020.0002] # MIAO LETTER REFORMED TONE-6 +16F9F ; [.4163.0020.0002] # MIAO LETTER REFORMED TONE-8 +118FF ; [.4164.0020.0002] # WARANG CITI OM +118C0 ; [.4165.0020.0002] # WARANG CITI SMALL LETTER NGAA +118A0 ; [.4165.0020.0008] # WARANG CITI CAPITAL LETTER NGAA +118C1 ; [.4166.0020.0002] # WARANG CITI SMALL LETTER A +118A1 ; [.4166.0020.0008] # WARANG CITI CAPITAL LETTER A +118C2 ; [.4167.0020.0002] # WARANG CITI SMALL LETTER WI +118A2 ; [.4167.0020.0008] # WARANG CITI CAPITAL LETTER WI +118C3 ; [.4168.0020.0002] # WARANG CITI SMALL LETTER YU +118A3 ; [.4168.0020.0008] # WARANG CITI CAPITAL LETTER YU +118C4 ; [.4169.0020.0002] # WARANG CITI SMALL LETTER YA +118A4 ; [.4169.0020.0008] # WARANG CITI CAPITAL LETTER YA +118C5 ; [.416A.0020.0002] # WARANG CITI SMALL LETTER YO +118A5 ; [.416A.0020.0008] # WARANG CITI CAPITAL LETTER YO +118C6 ; [.416B.0020.0002] # WARANG CITI SMALL LETTER II +118A6 ; [.416B.0020.0008] # WARANG CITI CAPITAL LETTER II +118C7 ; [.416C.0020.0002] # WARANG CITI SMALL LETTER UU +118A7 ; [.416C.0020.0008] # WARANG CITI CAPITAL LETTER UU +118C8 ; [.416D.0020.0002] # WARANG CITI SMALL LETTER E +118A8 ; [.416D.0020.0008] # WARANG CITI CAPITAL LETTER E +118C9 ; [.416E.0020.0002] # WARANG CITI SMALL LETTER O +118A9 ; [.416E.0020.0008] # WARANG CITI CAPITAL LETTER O +118CA ; [.416F.0020.0002] # WARANG CITI SMALL LETTER ANG +118AA ; [.416F.0020.0008] # WARANG CITI CAPITAL LETTER ANG +118CB ; [.4170.0020.0002] # WARANG CITI SMALL LETTER GA +118AB ; [.4170.0020.0008] # WARANG CITI CAPITAL LETTER GA +118CC ; [.4171.0020.0002] # WARANG CITI SMALL LETTER KO +118AC ; [.4171.0020.0008] # WARANG CITI CAPITAL LETTER KO +118CD ; [.4172.0020.0002] # WARANG CITI SMALL LETTER ENY +118AD ; [.4172.0020.0008] # WARANG CITI CAPITAL LETTER ENY +118CE ; [.4173.0020.0002] # WARANG CITI SMALL LETTER YUJ +118AE ; [.4173.0020.0008] # WARANG CITI CAPITAL LETTER YUJ +118CF ; [.4174.0020.0002] # WARANG CITI SMALL LETTER UC +118AF ; [.4174.0020.0008] # WARANG CITI CAPITAL LETTER UC +118D0 ; [.4175.0020.0002] # WARANG CITI SMALL LETTER ENN +118B0 ; [.4175.0020.0008] # WARANG CITI CAPITAL LETTER ENN +118D1 ; [.4176.0020.0002] # WARANG CITI SMALL LETTER ODD +118B1 ; [.4176.0020.0008] # WARANG CITI CAPITAL LETTER ODD +118D2 ; [.4177.0020.0002] # WARANG CITI SMALL LETTER TTE +118B2 ; [.4177.0020.0008] # WARANG CITI CAPITAL LETTER TTE +118D3 ; [.4178.0020.0002] # WARANG CITI SMALL LETTER NUNG +118B3 ; [.4178.0020.0008] # WARANG CITI CAPITAL LETTER NUNG +118D4 ; [.4179.0020.0002] # WARANG CITI SMALL LETTER DA +118B4 ; [.4179.0020.0008] # WARANG CITI CAPITAL LETTER DA +118D5 ; [.417A.0020.0002] # WARANG CITI SMALL LETTER AT +118B5 ; [.417A.0020.0008] # WARANG CITI CAPITAL LETTER AT +118D6 ; [.417B.0020.0002] # WARANG CITI SMALL LETTER AM +118B6 ; [.417B.0020.0008] # WARANG CITI CAPITAL LETTER AM +118D7 ; [.417C.0020.0002] # WARANG CITI SMALL LETTER BU +118B7 ; [.417C.0020.0008] # WARANG CITI CAPITAL LETTER BU +118D8 ; [.417D.0020.0002] # WARANG CITI SMALL LETTER PU +118B8 ; [.417D.0020.0008] # WARANG CITI CAPITAL LETTER PU +118D9 ; [.417E.0020.0002] # WARANG CITI SMALL LETTER HIYO +118B9 ; [.417E.0020.0008] # WARANG CITI CAPITAL LETTER HIYO +118DA ; [.417F.0020.0002] # WARANG CITI SMALL LETTER HOLO +118BA ; [.417F.0020.0008] # WARANG CITI CAPITAL LETTER HOLO +118DB ; [.4180.0020.0002] # WARANG CITI SMALL LETTER HORR +118BB ; [.4180.0020.0008] # WARANG CITI CAPITAL LETTER HORR +118DC ; [.4181.0020.0002] # WARANG CITI SMALL LETTER HAR +118BC ; [.4181.0020.0008] # WARANG CITI CAPITAL LETTER HAR +118DD ; [.4182.0020.0002] # WARANG CITI SMALL LETTER SSUU +118BD ; [.4182.0020.0008] # WARANG CITI CAPITAL LETTER SSUU +118DE ; [.4183.0020.0002] # WARANG CITI SMALL LETTER SII +118BE ; [.4183.0020.0008] # WARANG CITI CAPITAL LETTER SII +118DF ; [.4184.0020.0002] # WARANG CITI SMALL LETTER VIYO +118BF ; [.4184.0020.0008] # WARANG CITI CAPITAL LETTER VIYO +11AD5 ; [.4185.0020.0002] # PAU CIN HAU LETTER A +11AD6 ; [.4186.0020.0002] # PAU CIN HAU LETTER E +11AD7 ; [.4187.0020.0002] # PAU CIN HAU LETTER I +11AD8 ; [.4188.0020.0002] # PAU CIN HAU LETTER O +11AD9 ; [.4189.0020.0002] # PAU CIN HAU LETTER U +11ADA ; [.418A.0020.0002] # PAU CIN HAU LETTER UA +11ADB ; [.418B.0020.0002] # PAU CIN HAU LETTER IA +11AC0 ; [.418C.0020.0002] # PAU CIN HAU LETTER PA +11AC1 ; [.418D.0020.0002] # PAU CIN HAU LETTER KA +11AC2 ; [.418E.0020.0002] # PAU CIN HAU LETTER LA +11AC3 ; [.418F.0020.0002] # PAU CIN HAU LETTER MA +11AC4 ; [.4190.0020.0002] # PAU CIN HAU LETTER DA +11AC5 ; [.4191.0020.0002] # PAU CIN HAU LETTER ZA +11AC6 ; [.4192.0020.0002] # PAU CIN HAU LETTER VA +11AC7 ; [.4193.0020.0002] # PAU CIN HAU LETTER NGA +11AC8 ; [.4194.0020.0002] # PAU CIN HAU LETTER HA +11AC9 ; [.4195.0020.0002] # PAU CIN HAU LETTER GA +11ACA ; [.4196.0020.0002] # PAU CIN HAU LETTER KHA +11ACB ; [.4197.0020.0002] # PAU CIN HAU LETTER SA +11ACC ; [.4198.0020.0002] # PAU CIN HAU LETTER BA +11ACD ; [.4199.0020.0002] # PAU CIN HAU LETTER CA +11ACE ; [.419A.0020.0002] # PAU CIN HAU LETTER TA +11ACF ; [.419B.0020.0002] # PAU CIN HAU LETTER THA +11AD0 ; [.419C.0020.0002] # PAU CIN HAU LETTER NA +11AD1 ; [.419D.0020.0002] # PAU CIN HAU LETTER PHA +11AD2 ; [.419E.0020.0002] # PAU CIN HAU LETTER RA +11AD3 ; [.419F.0020.0002] # PAU CIN HAU LETTER FA +11AD4 ; [.41A0.0020.0002] # PAU CIN HAU LETTER CHA +11ADC ; [.41A1.0020.0002] # PAU CIN HAU LETTER FINAL P +11ADD ; [.41A2.0020.0002] # PAU CIN HAU LETTER FINAL K +11ADF ; [.41A3.0020.0002] # PAU CIN HAU LETTER FINAL M +11AE0 ; [.41A4.0020.0002] # PAU CIN HAU LETTER FINAL N +11AE1 ; [.41A5.0020.0002] # PAU CIN HAU LETTER FINAL L +11AE2 ; [.41A6.0020.0002] # PAU CIN HAU LETTER FINAL W +11AE3 ; [.41A7.0020.0002] # PAU CIN HAU LETTER FINAL NG +11ADE ; [.41A8.0020.0002] # PAU CIN HAU LETTER FINAL T +11AE4 ; [.41A9.0020.0002] # PAU CIN HAU LETTER FINAL Y +11AEF ; [.41AA.0020.0002] # PAU CIN HAU MID-LEVEL TONE +11AF2 ; [.41AB.0020.0002] # PAU CIN HAU MID-LEVEL TONE FINAL +11AF1 ; [.41AC.0020.0002] # PAU CIN HAU MID-LEVEL TONE LONG FINAL +11AE6 ; [.41AD.0020.0002] # PAU CIN HAU RISING TONE +11AE9 ; [.41AE.0020.0002] # PAU CIN HAU RISING TONE FINAL +11AE5 ; [.41AF.0020.0002] # PAU CIN HAU RISING TONE LONG +11AE8 ; [.41B0.0020.0002] # PAU CIN HAU RISING TONE LONG FINAL +11AF4 ; [.41B1.0020.0002] # PAU CIN HAU LOW-FALLING TONE +11AF7 ; [.41B2.0020.0002] # PAU CIN HAU LOW-FALLING TONE FINAL +11AF3 ; [.41B3.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG +11AF6 ; [.41B4.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG FINAL +11AEC ; [.41B5.0020.0002] # PAU CIN HAU SANDHI TONE +11AEE ; [.41B6.0020.0002] # PAU CIN HAU SANDHI TONE FINAL +11AEB ; [.41B7.0020.0002] # PAU CIN HAU SANDHI TONE LONG +11AED ; [.41B8.0020.0002] # PAU CIN HAU SANDHI TONE LONG FINAL +11AF5 ; [.41B9.0020.0002] # PAU CIN HAU GLOTTAL STOP +11AF8 ; [.41BA.0020.0002] # PAU CIN HAU GLOTTAL STOP FINAL +11AE7 ; [.41BB.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP +11AEA ; [.41BC.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP FINAL +11AF0 ; [.41BD.0020.0002] # PAU CIN HAU GLOTTAL STOP VARIANT +16B00 ; [.41BE.0020.0002] # PAHAWH HMONG VOWEL KEEB +16B01 ; [.41BF.0020.0002] # PAHAWH HMONG VOWEL KEEV +16B02 ; [.41C0.0020.0002] # PAHAWH HMONG VOWEL KIB +16B03 ; [.41C1.0020.0002] # PAHAWH HMONG VOWEL KIV +16B04 ; [.41C2.0020.0002] # PAHAWH HMONG VOWEL KAUB +16B05 ; [.41C3.0020.0002] # PAHAWH HMONG VOWEL KAUV +16B06 ; [.41C4.0020.0002] # PAHAWH HMONG VOWEL KUB +16B07 ; [.41C5.0020.0002] # PAHAWH HMONG VOWEL KUV +16B08 ; [.41C6.0020.0002] # PAHAWH HMONG VOWEL KEB +16B09 ; [.41C7.0020.0002] # PAHAWH HMONG VOWEL KEV +16B0A ; [.41C8.0020.0002] # PAHAWH HMONG VOWEL KAIB +16B0B ; [.41C9.0020.0002] # PAHAWH HMONG VOWEL KAIV +16B0C ; [.41CA.0020.0002] # PAHAWH HMONG VOWEL KOOB +16B0D ; [.41CB.0020.0002] # PAHAWH HMONG VOWEL KOOV +16B0E ; [.41CC.0020.0002] # PAHAWH HMONG VOWEL KAWB +16B0F ; [.41CD.0020.0002] # PAHAWH HMONG VOWEL KAWV +16B10 ; [.41CE.0020.0002] # PAHAWH HMONG VOWEL KUAB +16B11 ; [.41CF.0020.0002] # PAHAWH HMONG VOWEL KUAV +16B12 ; [.41D0.0020.0002] # PAHAWH HMONG VOWEL KOB +16B13 ; [.41D1.0020.0002] # PAHAWH HMONG VOWEL KOV +16B14 ; [.41D2.0020.0002] # PAHAWH HMONG VOWEL KIAB +16B15 ; [.41D3.0020.0002] # PAHAWH HMONG VOWEL KIAV +16B16 ; [.41D4.0020.0002] # PAHAWH HMONG VOWEL KAB +16B17 ; [.41D5.0020.0002] # PAHAWH HMONG VOWEL KAV +16B18 ; [.41D6.0020.0002] # PAHAWH HMONG VOWEL KWB +16B19 ; [.41D7.0020.0002] # PAHAWH HMONG VOWEL KWV +16B1A ; [.41D8.0020.0002] # PAHAWH HMONG VOWEL KAAB +16B1B ; [.41D9.0020.0002] # PAHAWH HMONG VOWEL KAAV +16B1C ; [.41DA.0020.0002] # PAHAWH HMONG CONSONANT VAU +16B1D ; [.41DB.0020.0002] # PAHAWH HMONG CONSONANT NTSAU +16B1E ; [.41DC.0020.0002] # PAHAWH HMONG CONSONANT LAU +16B1F ; [.41DD.0020.0002] # PAHAWH HMONG CONSONANT HAU +16B20 ; [.41DE.0020.0002] # PAHAWH HMONG CONSONANT NLAU +16B21 ; [.41DF.0020.0002] # PAHAWH HMONG CONSONANT RAU +16B22 ; [.41E0.0020.0002] # PAHAWH HMONG CONSONANT NKAU +16B23 ; [.41E1.0020.0002] # PAHAWH HMONG CONSONANT QHAU +16B24 ; [.41E2.0020.0002] # PAHAWH HMONG CONSONANT YAU +16B25 ; [.41E3.0020.0002] # PAHAWH HMONG CONSONANT HLAU +16B26 ; [.41E4.0020.0002] # PAHAWH HMONG CONSONANT MAU +16B27 ; [.41E5.0020.0002] # PAHAWH HMONG CONSONANT CHAU +16B28 ; [.41E6.0020.0002] # PAHAWH HMONG CONSONANT NCHAU +16B29 ; [.41E7.0020.0002] # PAHAWH HMONG CONSONANT HNAU +16B2A ; [.41E8.0020.0002] # PAHAWH HMONG CONSONANT PLHAU +16B2B ; [.41E9.0020.0002] # PAHAWH HMONG CONSONANT NTHAU +16B2C ; [.41EA.0020.0002] # PAHAWH HMONG CONSONANT NAU +16B2D ; [.41EB.0020.0002] # PAHAWH HMONG CONSONANT AU +16B2E ; [.41EC.0020.0002] # PAHAWH HMONG CONSONANT XAU +16B2F ; [.41ED.0020.0002] # PAHAWH HMONG CONSONANT CAU +16B40 ; [.41EE.0020.0002] # PAHAWH HMONG SIGN VOS SEEV +16B41 ; [.41EF.0020.0002] # PAHAWH HMONG SIGN MEEJ SUAB +16B63 ; [.41F0.0020.0002] # PAHAWH HMONG SIGN VOS LUB +16B64 ; [.41F1.0020.0002] # PAHAWH HMONG SIGN XYOO +16B65 ; [.41F2.0020.0002] # PAHAWH HMONG SIGN HLI +16B66 ; [.41F3.0020.0002] # PAHAWH HMONG SIGN THIRD-STAGE HLI +16B67 ; [.41F4.0020.0002] # PAHAWH HMONG SIGN ZWJ THAJ +16B68 ; [.41F5.0020.0002] # PAHAWH HMONG SIGN HNUB +16B69 ; [.41F6.0020.0002] # PAHAWH HMONG SIGN NQIG +16B6A ; [.41F7.0020.0002] # PAHAWH HMONG SIGN XIAB +16B6B ; [.41F8.0020.0002] # PAHAWH HMONG SIGN NTUJ +16B6C ; [.41F9.0020.0002] # PAHAWH HMONG SIGN AV +16B6D ; [.41FA.0020.0002] # PAHAWH HMONG SIGN TXHEEJ CEEV +16B6E ; [.41FB.0020.0002] # PAHAWH HMONG SIGN MEEJ TSEEB +16B6F ; [.41FC.0020.0002] # PAHAWH HMONG SIGN TAU +16B70 ; [.41FD.0020.0002] # PAHAWH HMONG SIGN LOS +16B71 ; [.41FE.0020.0002] # PAHAWH HMONG SIGN MUS +16B72 ; [.41FF.0020.0002] # PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG +16B73 ; [.4200.0020.0002] # PAHAWH HMONG SIGN CIM CUAM TSHOOJ +16B74 ; [.4201.0020.0002] # PAHAWH HMONG SIGN CIM TXWV +16B75 ; [.4202.0020.0002] # PAHAWH HMONG SIGN CIM TXWV CHWV +16B76 ; [.4203.0020.0002] # PAHAWH HMONG SIGN CIM PUB DAWB +16B77 ; [.4204.0020.0002] # PAHAWH HMONG SIGN CIM NRES TOS +16B7D ; [.4205.0020.0002] # PAHAWH HMONG CLAN SIGN TSHEEJ +16B7E ; [.4206.0020.0002] # PAHAWH HMONG CLAN SIGN YEEG +16B7F ; [.4207.0020.0002] # PAHAWH HMONG CLAN SIGN LIS +16B80 ; [.4208.0020.0002] # PAHAWH HMONG CLAN SIGN LAUJ +16B81 ; [.4209.0020.0002] # PAHAWH HMONG CLAN SIGN XYOOJ +16B82 ; [.420A.0020.0002] # PAHAWH HMONG CLAN SIGN KOO +16B83 ; [.420B.0020.0002] # PAHAWH HMONG CLAN SIGN HAWJ +16B84 ; [.420C.0020.0002] # PAHAWH HMONG CLAN SIGN MUAS +16B85 ; [.420D.0020.0002] # PAHAWH HMONG CLAN SIGN THOJ +16B86 ; [.420E.0020.0002] # PAHAWH HMONG CLAN SIGN TSAB +16B87 ; [.420F.0020.0002] # PAHAWH HMONG CLAN SIGN PHAB +16B88 ; [.4210.0020.0002] # PAHAWH HMONG CLAN SIGN KHAB +16B89 ; [.4211.0020.0002] # PAHAWH HMONG CLAN SIGN HAM +16B8A ; [.4212.0020.0002] # PAHAWH HMONG CLAN SIGN VAJ +16B8B ; [.4213.0020.0002] # PAHAWH HMONG CLAN SIGN FAJ +16B8C ; [.4214.0020.0002] # PAHAWH HMONG CLAN SIGN YAJ +16B8D ; [.4215.0020.0002] # PAHAWH HMONG CLAN SIGN TSWB +16B8E ; [.4216.0020.0002] # PAHAWH HMONG CLAN SIGN KWM +16B8F ; [.4217.0020.0002] # PAHAWH HMONG CLAN SIGN VWJ +10280 ; [.4218.0020.0002] # LYCIAN LETTER A +10281 ; [.4219.0020.0002] # LYCIAN LETTER E +10282 ; [.421A.0020.0002] # LYCIAN LETTER B +10283 ; [.421B.0020.0002] # LYCIAN LETTER BH +10284 ; [.421C.0020.0002] # LYCIAN LETTER G +10285 ; [.421D.0020.0002] # LYCIAN LETTER D +10286 ; [.421E.0020.0002] # LYCIAN LETTER I +10287 ; [.421F.0020.0002] # LYCIAN LETTER W +10288 ; [.4220.0020.0002] # LYCIAN LETTER Z +10289 ; [.4221.0020.0002] # LYCIAN LETTER TH +1028A ; [.4222.0020.0002] # LYCIAN LETTER J +1028B ; [.4223.0020.0002] # LYCIAN LETTER K +1028C ; [.4224.0020.0002] # LYCIAN LETTER Q +1028D ; [.4225.0020.0002] # LYCIAN LETTER L +1028E ; [.4226.0020.0002] # LYCIAN LETTER M +1028F ; [.4227.0020.0002] # LYCIAN LETTER N +10290 ; [.4228.0020.0002] # LYCIAN LETTER MM +10291 ; [.4229.0020.0002] # LYCIAN LETTER NN +10292 ; [.422A.0020.0002] # LYCIAN LETTER U +10293 ; [.422B.0020.0002] # LYCIAN LETTER P +10294 ; [.422C.0020.0002] # LYCIAN LETTER KK +10295 ; [.422D.0020.0002] # LYCIAN LETTER R +10296 ; [.422E.0020.0002] # LYCIAN LETTER S +10297 ; [.422F.0020.0002] # LYCIAN LETTER T +10298 ; [.4230.0020.0002] # LYCIAN LETTER TT +10299 ; [.4231.0020.0002] # LYCIAN LETTER AN +1029A ; [.4232.0020.0002] # LYCIAN LETTER EN +1029B ; [.4233.0020.0002] # LYCIAN LETTER H +1029C ; [.4234.0020.0002] # LYCIAN LETTER X +102A0 ; [.4235.0020.0002] # CARIAN LETTER A +102A1 ; [.4236.0020.0002] # CARIAN LETTER P2 +102A2 ; [.4237.0020.0002] # CARIAN LETTER D +102A3 ; [.4238.0020.0002] # CARIAN LETTER L +102A4 ; [.4239.0020.0002] # CARIAN LETTER UUU +102A5 ; [.423A.0020.0002] # CARIAN LETTER R +102A6 ; [.423B.0020.0002] # CARIAN LETTER LD +102A7 ; [.423C.0020.0002] # CARIAN LETTER A2 +102A8 ; [.423D.0020.0002] # CARIAN LETTER Q +102A9 ; [.423E.0020.0002] # CARIAN LETTER B +102AA ; [.423F.0020.0002] # CARIAN LETTER M +102AB ; [.4240.0020.0002] # CARIAN LETTER O +102AC ; [.4241.0020.0002] # CARIAN LETTER D2 +102AD ; [.4242.0020.0002] # CARIAN LETTER T +102AE ; [.4243.0020.0002] # CARIAN LETTER SH +102AF ; [.4244.0020.0002] # CARIAN LETTER SH2 +102B0 ; [.4245.0020.0002] # CARIAN LETTER S +102B1 ; [.4246.0020.0002] # CARIAN LETTER C-18 +102B2 ; [.4247.0020.0002] # CARIAN LETTER U +102B3 ; [.4248.0020.0002] # CARIAN LETTER NN +102B4 ; [.4249.0020.0002] # CARIAN LETTER X +102B5 ; [.424A.0020.0002] # CARIAN LETTER N +102B6 ; [.424B.0020.0002] # CARIAN LETTER TT2 +102B7 ; [.424C.0020.0002] # CARIAN LETTER P +102B8 ; [.424D.0020.0002] # CARIAN LETTER SS +102B9 ; [.424E.0020.0002] # CARIAN LETTER I +102BA ; [.424F.0020.0002] # CARIAN LETTER E +102BB ; [.4250.0020.0002] # CARIAN LETTER UUUU +102BC ; [.4251.0020.0002] # CARIAN LETTER K +102BD ; [.4252.0020.0002] # CARIAN LETTER K2 +102BE ; [.4253.0020.0002] # CARIAN LETTER ND +102BF ; [.4254.0020.0002] # CARIAN LETTER UU +102C0 ; [.4255.0020.0002] # CARIAN LETTER G +102C1 ; [.4256.0020.0002] # CARIAN LETTER G2 +102C2 ; [.4257.0020.0002] # CARIAN LETTER ST +102C3 ; [.4258.0020.0002] # CARIAN LETTER ST2 +102C4 ; [.4259.0020.0002] # CARIAN LETTER NG +102C5 ; [.425A.0020.0002] # CARIAN LETTER II +102C6 ; [.425B.0020.0002] # CARIAN LETTER C-39 +102C7 ; [.425C.0020.0002] # CARIAN LETTER TT +102C8 ; [.425D.0020.0002] # CARIAN LETTER UUU2 +102C9 ; [.425E.0020.0002] # CARIAN LETTER RR +102CA ; [.425F.0020.0002] # CARIAN LETTER MB +102CB ; [.4260.0020.0002] # CARIAN LETTER MB2 +102CC ; [.4261.0020.0002] # CARIAN LETTER MB3 +102CD ; [.4262.0020.0002] # CARIAN LETTER MB4 +102CE ; [.4263.0020.0002] # CARIAN LETTER LD2 +102CF ; [.4264.0020.0002] # CARIAN LETTER E2 +102D0 ; [.4265.0020.0002] # CARIAN LETTER UUU3 +10920 ; [.4266.0020.0002] # LYDIAN LETTER A +10921 ; [.4267.0020.0002] # LYDIAN LETTER B +10922 ; [.4268.0020.0002] # LYDIAN LETTER G +10923 ; [.4269.0020.0002] # LYDIAN LETTER D +10924 ; [.426A.0020.0002] # LYDIAN LETTER E +10925 ; [.426B.0020.0002] # LYDIAN LETTER V +10926 ; [.426C.0020.0002] # LYDIAN LETTER I +10927 ; [.426D.0020.0002] # LYDIAN LETTER Y +10928 ; [.426E.0020.0002] # LYDIAN LETTER K +10929 ; [.426F.0020.0002] # LYDIAN LETTER L +1092A ; [.4270.0020.0002] # LYDIAN LETTER M +1092B ; [.4271.0020.0002] # LYDIAN LETTER N +1092C ; [.4272.0020.0002] # LYDIAN LETTER O +1092D ; [.4273.0020.0002] # LYDIAN LETTER R +1092E ; [.4274.0020.0002] # LYDIAN LETTER SS +1092F ; [.4275.0020.0002] # LYDIAN LETTER T +10930 ; [.4276.0020.0002] # LYDIAN LETTER U +10931 ; [.4277.0020.0002] # LYDIAN LETTER F +10932 ; [.4278.0020.0002] # LYDIAN LETTER Q +10933 ; [.4279.0020.0002] # LYDIAN LETTER S +10934 ; [.427A.0020.0002] # LYDIAN LETTER TT +10935 ; [.427B.0020.0002] # LYDIAN LETTER AN +10936 ; [.427C.0020.0002] # LYDIAN LETTER EN +10937 ; [.427D.0020.0002] # LYDIAN LETTER LY +10938 ; [.427E.0020.0002] # LYDIAN LETTER NN +10939 ; [.427F.0020.0002] # LYDIAN LETTER C +10300 ; [.4280.0020.0002] # OLD ITALIC LETTER A +10301 ; [.4281.0020.0002] # OLD ITALIC LETTER BE +10302 ; [.4282.0020.0002] # OLD ITALIC LETTER KE +10303 ; [.4283.0020.0002] # OLD ITALIC LETTER DE +10304 ; [.4284.0020.0002] # OLD ITALIC LETTER E +10305 ; [.4285.0020.0002] # OLD ITALIC LETTER VE +10306 ; [.4286.0020.0002] # OLD ITALIC LETTER ZE +10307 ; [.4287.0020.0002] # OLD ITALIC LETTER HE +10308 ; [.4288.0020.0002] # OLD ITALIC LETTER THE +10309 ; [.4289.0020.0002] # OLD ITALIC LETTER I +1030A ; [.428A.0020.0002] # OLD ITALIC LETTER KA +1030B ; [.428B.0020.0002] # OLD ITALIC LETTER EL +1030C ; [.428C.0020.0002] # OLD ITALIC LETTER EM +1030D ; [.428D.0020.0002] # OLD ITALIC LETTER EN +1030E ; [.428E.0020.0002] # OLD ITALIC LETTER ESH +1031F ; [.428F.0020.0002] # OLD ITALIC LETTER ESS +1030F ; [.4290.0020.0002] # OLD ITALIC LETTER O +10310 ; [.4291.0020.0002] # OLD ITALIC LETTER PE +10311 ; [.4292.0020.0002] # OLD ITALIC LETTER SHE +10312 ; [.4293.0020.0002] # OLD ITALIC LETTER KU +10313 ; [.4294.0020.0002] # OLD ITALIC LETTER ER +10314 ; [.4295.0020.0002] # OLD ITALIC LETTER ES +10315 ; [.4296.0020.0002] # OLD ITALIC LETTER TE +10316 ; [.4297.0020.0002] # OLD ITALIC LETTER U +10317 ; [.4298.0020.0002] # OLD ITALIC LETTER EKS +10318 ; [.4299.0020.0002] # OLD ITALIC LETTER PHE +10319 ; [.429A.0020.0002] # OLD ITALIC LETTER KHE +1031A ; [.429B.0020.0002] # OLD ITALIC LETTER EF +1031B ; [.429C.0020.0002] # OLD ITALIC LETTER ERS +1031C ; [.429D.0020.0002] # OLD ITALIC LETTER CHE +1031D ; [.429E.0020.0002] # OLD ITALIC LETTER II +1031E ; [.429F.0020.0002] # OLD ITALIC LETTER UU +10330 ; [.42A0.0020.0002] # GOTHIC LETTER AHSA +10331 ; [.42A1.0020.0002] # GOTHIC LETTER BAIRKAN +10332 ; [.42A2.0020.0002] # GOTHIC LETTER GIBA +10333 ; [.42A3.0020.0002] # GOTHIC LETTER DAGS +10334 ; [.42A4.0020.0002] # GOTHIC LETTER AIHVUS +10335 ; [.42A5.0020.0002] # GOTHIC LETTER QAIRTHRA +10336 ; [.42A6.0020.0002] # GOTHIC LETTER IUJA +10337 ; [.42A7.0020.0002] # GOTHIC LETTER HAGL +10338 ; [.42A8.0020.0002] # GOTHIC LETTER THIUTH +10339 ; [.42A9.0020.0002] # GOTHIC LETTER EIS +1033A ; [.42AA.0020.0002] # GOTHIC LETTER KUSMA +1033B ; [.42AB.0020.0002] # GOTHIC LETTER LAGUS +1033C ; [.42AC.0020.0002] # GOTHIC LETTER MANNA +1033D ; [.42AD.0020.0002] # GOTHIC LETTER NAUTHS +1033E ; [.42AE.0020.0002] # GOTHIC LETTER JER +1033F ; [.42AF.0020.0002] # GOTHIC LETTER URUS +10340 ; [.42B0.0020.0002] # GOTHIC LETTER PAIRTHRA +10341 ; [.42B1.0020.0002] # GOTHIC LETTER NINETY +10342 ; [.42B2.0020.0002] # GOTHIC LETTER RAIDA +10343 ; [.42B3.0020.0002] # GOTHIC LETTER SAUIL +10344 ; [.42B4.0020.0002] # GOTHIC LETTER TEIWS +10345 ; [.42B5.0020.0002] # GOTHIC LETTER WINJA +10346 ; [.42B6.0020.0002] # GOTHIC LETTER FAIHU +10347 ; [.42B7.0020.0002] # GOTHIC LETTER IGGWS +10348 ; [.42B8.0020.0002] # GOTHIC LETTER HWAIR +10349 ; [.42B9.0020.0002] # GOTHIC LETTER OTHAL +1034A ; [.42BA.0020.0002] # GOTHIC LETTER NINE HUNDRED +10428 ; [.42BB.0020.0002] # DESERET SMALL LETTER LONG I +10400 ; [.42BB.0020.0008] # DESERET CAPITAL LETTER LONG I +10429 ; [.42BC.0020.0002] # DESERET SMALL LETTER LONG E +10401 ; [.42BC.0020.0008] # DESERET CAPITAL LETTER LONG E +1042A ; [.42BD.0020.0002] # DESERET SMALL LETTER LONG A +10402 ; [.42BD.0020.0008] # DESERET CAPITAL LETTER LONG A +1042B ; [.42BE.0020.0002] # DESERET SMALL LETTER LONG AH +10403 ; [.42BE.0020.0008] # DESERET CAPITAL LETTER LONG AH +1042C ; [.42BF.0020.0002] # DESERET SMALL LETTER LONG O +10404 ; [.42BF.0020.0008] # DESERET CAPITAL LETTER LONG O +1042D ; [.42C0.0020.0002] # DESERET SMALL LETTER LONG OO +10405 ; [.42C0.0020.0008] # DESERET CAPITAL LETTER LONG OO +1042E ; [.42C1.0020.0002] # DESERET SMALL LETTER SHORT I +10406 ; [.42C1.0020.0008] # DESERET CAPITAL LETTER SHORT I +1042F ; [.42C2.0020.0002] # DESERET SMALL LETTER SHORT E +10407 ; [.42C2.0020.0008] # DESERET CAPITAL LETTER SHORT E +10430 ; [.42C3.0020.0002] # DESERET SMALL LETTER SHORT A +10408 ; [.42C3.0020.0008] # DESERET CAPITAL LETTER SHORT A +10431 ; [.42C4.0020.0002] # DESERET SMALL LETTER SHORT AH +10409 ; [.42C4.0020.0008] # DESERET CAPITAL LETTER SHORT AH +10432 ; [.42C5.0020.0002] # DESERET SMALL LETTER SHORT O +1040A ; [.42C5.0020.0008] # DESERET CAPITAL LETTER SHORT O +10433 ; [.42C6.0020.0002] # DESERET SMALL LETTER SHORT OO +1040B ; [.42C6.0020.0008] # DESERET CAPITAL LETTER SHORT OO +10434 ; [.42C7.0020.0002] # DESERET SMALL LETTER AY +1040C ; [.42C7.0020.0008] # DESERET CAPITAL LETTER AY +10435 ; [.42C8.0020.0002] # DESERET SMALL LETTER OW +1040D ; [.42C8.0020.0008] # DESERET CAPITAL LETTER OW +10436 ; [.42C9.0020.0002] # DESERET SMALL LETTER WU +1040E ; [.42C9.0020.0008] # DESERET CAPITAL LETTER WU +10437 ; [.42CA.0020.0002] # DESERET SMALL LETTER YEE +1040F ; [.42CA.0020.0008] # DESERET CAPITAL LETTER YEE +10438 ; [.42CB.0020.0002] # DESERET SMALL LETTER H +10410 ; [.42CB.0020.0008] # DESERET CAPITAL LETTER H +10439 ; [.42CC.0020.0002] # DESERET SMALL LETTER PEE +10411 ; [.42CC.0020.0008] # DESERET CAPITAL LETTER PEE +1043A ; [.42CD.0020.0002] # DESERET SMALL LETTER BEE +10412 ; [.42CD.0020.0008] # DESERET CAPITAL LETTER BEE +1043B ; [.42CE.0020.0002] # DESERET SMALL LETTER TEE +10413 ; [.42CE.0020.0008] # DESERET CAPITAL LETTER TEE +1043C ; [.42CF.0020.0002] # DESERET SMALL LETTER DEE +10414 ; [.42CF.0020.0008] # DESERET CAPITAL LETTER DEE +1043D ; [.42D0.0020.0002] # DESERET SMALL LETTER CHEE +10415 ; [.42D0.0020.0008] # DESERET CAPITAL LETTER CHEE +1043E ; [.42D1.0020.0002] # DESERET SMALL LETTER JEE +10416 ; [.42D1.0020.0008] # DESERET CAPITAL LETTER JEE +1043F ; [.42D2.0020.0002] # DESERET SMALL LETTER KAY +10417 ; [.42D2.0020.0008] # DESERET CAPITAL LETTER KAY +10440 ; [.42D3.0020.0002] # DESERET SMALL LETTER GAY +10418 ; [.42D3.0020.0008] # DESERET CAPITAL LETTER GAY +10441 ; [.42D4.0020.0002] # DESERET SMALL LETTER EF +10419 ; [.42D4.0020.0008] # DESERET CAPITAL LETTER EF +10442 ; [.42D5.0020.0002] # DESERET SMALL LETTER VEE +1041A ; [.42D5.0020.0008] # DESERET CAPITAL LETTER VEE +10443 ; [.42D6.0020.0002] # DESERET SMALL LETTER ETH +1041B ; [.42D6.0020.0008] # DESERET CAPITAL LETTER ETH +10444 ; [.42D7.0020.0002] # DESERET SMALL LETTER THEE +1041C ; [.42D7.0020.0008] # DESERET CAPITAL LETTER THEE +10445 ; [.42D8.0020.0002] # DESERET SMALL LETTER ES +1041D ; [.42D8.0020.0008] # DESERET CAPITAL LETTER ES +10446 ; [.42D9.0020.0002] # DESERET SMALL LETTER ZEE +1041E ; [.42D9.0020.0008] # DESERET CAPITAL LETTER ZEE +10447 ; [.42DA.0020.0002] # DESERET SMALL LETTER ESH +1041F ; [.42DA.0020.0008] # DESERET CAPITAL LETTER ESH +10448 ; [.42DB.0020.0002] # DESERET SMALL LETTER ZHEE +10420 ; [.42DB.0020.0008] # DESERET CAPITAL LETTER ZHEE +10449 ; [.42DC.0020.0002] # DESERET SMALL LETTER ER +10421 ; [.42DC.0020.0008] # DESERET CAPITAL LETTER ER +1044A ; [.42DD.0020.0002] # DESERET SMALL LETTER EL +10422 ; [.42DD.0020.0008] # DESERET CAPITAL LETTER EL +1044B ; [.42DE.0020.0002] # DESERET SMALL LETTER EM +10423 ; [.42DE.0020.0008] # DESERET CAPITAL LETTER EM +1044C ; [.42DF.0020.0002] # DESERET SMALL LETTER EN +10424 ; [.42DF.0020.0008] # DESERET CAPITAL LETTER EN +1044D ; [.42E0.0020.0002] # DESERET SMALL LETTER ENG +10425 ; [.42E0.0020.0008] # DESERET CAPITAL LETTER ENG +1044E ; [.42E1.0020.0002] # DESERET SMALL LETTER OI +10426 ; [.42E1.0020.0008] # DESERET CAPITAL LETTER OI +1044F ; [.42E2.0020.0002] # DESERET SMALL LETTER EW +10427 ; [.42E2.0020.0008] # DESERET CAPITAL LETTER EW +10450 ; [.42E3.0020.0002] # SHAVIAN LETTER PEEP +10451 ; [.42E4.0020.0002] # SHAVIAN LETTER TOT +10452 ; [.42E5.0020.0002] # SHAVIAN LETTER KICK +10453 ; [.42E6.0020.0002] # SHAVIAN LETTER FEE +10454 ; [.42E7.0020.0002] # SHAVIAN LETTER THIGH +10455 ; [.42E8.0020.0002] # SHAVIAN LETTER SO +10456 ; [.42E9.0020.0002] # SHAVIAN LETTER SURE +10457 ; [.42EA.0020.0002] # SHAVIAN LETTER CHURCH +10458 ; [.42EB.0020.0002] # SHAVIAN LETTER YEA +10459 ; [.42EC.0020.0002] # SHAVIAN LETTER HUNG +1045A ; [.42ED.0020.0002] # SHAVIAN LETTER BIB +1045B ; [.42EE.0020.0002] # SHAVIAN LETTER DEAD +1045C ; [.42EF.0020.0002] # SHAVIAN LETTER GAG +1045D ; [.42F0.0020.0002] # SHAVIAN LETTER VOW +1045E ; [.42F1.0020.0002] # SHAVIAN LETTER THEY +1045F ; [.42F2.0020.0002] # SHAVIAN LETTER ZOO +10460 ; [.42F3.0020.0002] # SHAVIAN LETTER MEASURE +10461 ; [.42F4.0020.0002] # SHAVIAN LETTER JUDGE +10462 ; [.42F5.0020.0002] # SHAVIAN LETTER WOE +10463 ; [.42F6.0020.0002] # SHAVIAN LETTER HA-HA +10464 ; [.42F7.0020.0002] # SHAVIAN LETTER LOLL +10465 ; [.42F8.0020.0002] # SHAVIAN LETTER MIME +10466 ; [.42F9.0020.0002] # SHAVIAN LETTER IF +10467 ; [.42FA.0020.0002] # SHAVIAN LETTER EGG +10468 ; [.42FB.0020.0002] # SHAVIAN LETTER ASH +10469 ; [.42FC.0020.0002] # SHAVIAN LETTER ADO +1046A ; [.42FD.0020.0002] # SHAVIAN LETTER ON +1046B ; [.42FE.0020.0002] # SHAVIAN LETTER WOOL +1046C ; [.42FF.0020.0002] # SHAVIAN LETTER OUT +1046D ; [.4300.0020.0002] # SHAVIAN LETTER AH +1046E ; [.4301.0020.0002] # SHAVIAN LETTER ROAR +1046F ; [.4302.0020.0002] # SHAVIAN LETTER NUN +10470 ; [.4303.0020.0002] # SHAVIAN LETTER EAT +10471 ; [.4304.0020.0002] # SHAVIAN LETTER AGE +10472 ; [.4305.0020.0002] # SHAVIAN LETTER ICE +10473 ; [.4306.0020.0002] # SHAVIAN LETTER UP +10474 ; [.4307.0020.0002] # SHAVIAN LETTER OAK +10475 ; [.4308.0020.0002] # SHAVIAN LETTER OOZE +10476 ; [.4309.0020.0002] # SHAVIAN LETTER OIL +10477 ; [.430A.0020.0002] # SHAVIAN LETTER AWE +10478 ; [.430B.0020.0002] # SHAVIAN LETTER ARE +10479 ; [.430C.0020.0002] # SHAVIAN LETTER OR +1047A ; [.430D.0020.0002] # SHAVIAN LETTER AIR +1047B ; [.430E.0020.0002] # SHAVIAN LETTER ERR +1047C ; [.430F.0020.0002] # SHAVIAN LETTER ARRAY +1047D ; [.4310.0020.0002] # SHAVIAN LETTER EAR +1047E ; [.4311.0020.0002] # SHAVIAN LETTER IAN +1047F ; [.4312.0020.0002] # SHAVIAN LETTER YEW +1BC00 ; [.4313.0020.0002] # DUPLOYAN LETTER H +1BC01 ; [.4314.0020.0002] # DUPLOYAN LETTER X +1BC02 ; [.4315.0020.0002] # DUPLOYAN LETTER P +1BC03 ; [.4316.0020.0002] # DUPLOYAN LETTER T +1BC04 ; [.4317.0020.0002] # DUPLOYAN LETTER F +1BC05 ; [.4318.0020.0002] # DUPLOYAN LETTER K +1BC06 ; [.4319.0020.0002] # DUPLOYAN LETTER L +1BC07 ; [.431A.0020.0002] # DUPLOYAN LETTER B +1BC08 ; [.431B.0020.0002] # DUPLOYAN LETTER D +1BC09 ; [.431C.0020.0002] # DUPLOYAN LETTER V +1BC0A ; [.431D.0020.0002] # DUPLOYAN LETTER G +1BC0B ; [.431E.0020.0002] # DUPLOYAN LETTER R +1BC0C ; [.431F.0020.0002] # DUPLOYAN LETTER P N +1BC0D ; [.4320.0020.0002] # DUPLOYAN LETTER D S +1BC0E ; [.4321.0020.0002] # DUPLOYAN LETTER F N +1BC0F ; [.4322.0020.0002] # DUPLOYAN LETTER K M +1BC10 ; [.4323.0020.0002] # DUPLOYAN LETTER R S +1BC11 ; [.4324.0020.0002] # DUPLOYAN LETTER TH +1BC12 ; [.4325.0020.0002] # DUPLOYAN LETTER SLOAN DH +1BC13 ; [.4326.0020.0002] # DUPLOYAN LETTER DH +1BC14 ; [.4327.0020.0002] # DUPLOYAN LETTER KK +1BC15 ; [.4328.0020.0002] # DUPLOYAN LETTER SLOAN J +1BC16 ; [.4329.0020.0002] # DUPLOYAN LETTER HL +1BC17 ; [.432A.0020.0002] # DUPLOYAN LETTER LH +1BC18 ; [.432B.0020.0002] # DUPLOYAN LETTER RH +1BC19 ; [.432C.0020.0002] # DUPLOYAN LETTER M +1BC1A ; [.432D.0020.0002] # DUPLOYAN LETTER N +1BC1B ; [.432E.0020.0002] # DUPLOYAN LETTER J +1BC1C ; [.432F.0020.0002] # DUPLOYAN LETTER S +1BC1D ; [.4330.0020.0002] # DUPLOYAN LETTER M N +1BC1E ; [.4331.0020.0002] # DUPLOYAN LETTER N M +1BC1F ; [.4332.0020.0002] # DUPLOYAN LETTER J M +1BC20 ; [.4333.0020.0002] # DUPLOYAN LETTER S J +1BC21 ; [.4334.0020.0002] # DUPLOYAN LETTER M WITH DOT +1BC22 ; [.4335.0020.0002] # DUPLOYAN LETTER N WITH DOT +1BC23 ; [.4336.0020.0002] # DUPLOYAN LETTER J WITH DOT +1BC24 ; [.4337.0020.0002] # DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE +1BC25 ; [.4338.0020.0002] # DUPLOYAN LETTER S WITH DOT +1BC26 ; [.4339.0020.0002] # DUPLOYAN LETTER S WITH DOT BELOW +1BC27 ; [.433A.0020.0002] # DUPLOYAN LETTER M S +1BC28 ; [.433B.0020.0002] # DUPLOYAN LETTER N S +1BC29 ; [.433C.0020.0002] # DUPLOYAN LETTER J S +1BC2A ; [.433D.0020.0002] # DUPLOYAN LETTER S S +1BC2B ; [.433E.0020.0002] # DUPLOYAN LETTER M N S +1BC2C ; [.433F.0020.0002] # DUPLOYAN LETTER N M S +1BC2D ; [.4340.0020.0002] # DUPLOYAN LETTER J M S +1BC2E ; [.4341.0020.0002] # DUPLOYAN LETTER S J S +1BC2F ; [.4342.0020.0002] # DUPLOYAN LETTER J S WITH DOT +1BC30 ; [.4343.0020.0002] # DUPLOYAN LETTER J N +1BC31 ; [.4344.0020.0002] # DUPLOYAN LETTER J N S +1BC32 ; [.4345.0020.0002] # DUPLOYAN LETTER S T +1BC33 ; [.4346.0020.0002] # DUPLOYAN LETTER S T R +1BC34 ; [.4347.0020.0002] # DUPLOYAN LETTER S P +1BC35 ; [.4348.0020.0002] # DUPLOYAN LETTER S P R +1BC36 ; [.4349.0020.0002] # DUPLOYAN LETTER T S +1BC37 ; [.434A.0020.0002] # DUPLOYAN LETTER T R S +1BC38 ; [.434B.0020.0002] # DUPLOYAN LETTER W +1BC39 ; [.434C.0020.0002] # DUPLOYAN LETTER WH +1BC3A ; [.434D.0020.0002] # DUPLOYAN LETTER W R +1BC3B ; [.434E.0020.0002] # DUPLOYAN LETTER S N +1BC3C ; [.434F.0020.0002] # DUPLOYAN LETTER S M +1BC3D ; [.4350.0020.0002] # DUPLOYAN LETTER K R S +1BC3E ; [.4351.0020.0002] # DUPLOYAN LETTER G R S +1BC3F ; [.4352.0020.0002] # DUPLOYAN LETTER S K +1BC40 ; [.4353.0020.0002] # DUPLOYAN LETTER S K R +1BC41 ; [.4354.0020.0002] # DUPLOYAN LETTER A +1BC42 ; [.4355.0020.0002] # DUPLOYAN LETTER SLOAN OW +1BC43 ; [.4356.0020.0002] # DUPLOYAN LETTER OA +1BC44 ; [.4357.0020.0002] # DUPLOYAN LETTER O +1BC45 ; [.4358.0020.0002] # DUPLOYAN LETTER AOU +1BC46 ; [.4359.0020.0002] # DUPLOYAN LETTER I +1BC47 ; [.435A.0020.0002] # DUPLOYAN LETTER E +1BC48 ; [.435B.0020.0002] # DUPLOYAN LETTER IE +1BC49 ; [.435C.0020.0002] # DUPLOYAN LETTER SHORT I +1BC4A ; [.435D.0020.0002] # DUPLOYAN LETTER UI +1BC4B ; [.435E.0020.0002] # DUPLOYAN LETTER EE +1BC4C ; [.435F.0020.0002] # DUPLOYAN LETTER SLOAN EH +1BC4D ; [.4360.0020.0002] # DUPLOYAN LETTER ROMANIAN I +1BC4E ; [.4361.0020.0002] # DUPLOYAN LETTER SLOAN EE +1BC4F ; [.4362.0020.0002] # DUPLOYAN LETTER LONG I +1BC50 ; [.4363.0020.0002] # DUPLOYAN LETTER YE +1BC51 ; [.4364.0020.0002] # DUPLOYAN LETTER U +1BC52 ; [.4365.0020.0002] # DUPLOYAN LETTER EU +1BC53 ; [.4366.0020.0002] # DUPLOYAN LETTER XW +1BC54 ; [.4367.0020.0002] # DUPLOYAN LETTER U N +1BC55 ; [.4368.0020.0002] # DUPLOYAN LETTER LONG U +1BC56 ; [.4369.0020.0002] # DUPLOYAN LETTER ROMANIAN U +1BC57 ; [.436A.0020.0002] # DUPLOYAN LETTER UH +1BC58 ; [.436B.0020.0002] # DUPLOYAN LETTER SLOAN U +1BC59 ; [.436C.0020.0002] # DUPLOYAN LETTER OOH +1BC5A ; [.436D.0020.0002] # DUPLOYAN LETTER OW +1BC5B ; [.436E.0020.0002] # DUPLOYAN LETTER OU +1BC5C ; [.436F.0020.0002] # DUPLOYAN LETTER WA +1BC5D ; [.4370.0020.0002] # DUPLOYAN LETTER WO +1BC5E ; [.4371.0020.0002] # DUPLOYAN LETTER WI +1BC5F ; [.4372.0020.0002] # DUPLOYAN LETTER WEI +1BC60 ; [.4373.0020.0002] # DUPLOYAN LETTER WOW +1BC61 ; [.4374.0020.0002] # DUPLOYAN LETTER NASAL U +1BC62 ; [.4375.0020.0002] # DUPLOYAN LETTER NASAL O +1BC63 ; [.4376.0020.0002] # DUPLOYAN LETTER NASAL I +1BC64 ; [.4377.0020.0002] # DUPLOYAN LETTER NASAL A +1BC65 ; [.4378.0020.0002] # DUPLOYAN LETTER PERNIN AN +1BC66 ; [.4379.0020.0002] # DUPLOYAN LETTER PERNIN AM +1BC67 ; [.437A.0020.0002] # DUPLOYAN LETTER SLOAN EN +1BC68 ; [.437B.0020.0002] # DUPLOYAN LETTER SLOAN AN +1BC69 ; [.437C.0020.0002] # DUPLOYAN LETTER SLOAN ON +1BC6A ; [.437D.0020.0002] # DUPLOYAN LETTER VOCALIC M +1BC70 ; [.437E.0020.0002] # DUPLOYAN AFFIX LEFT HORIZONTAL SECANT +1BC71 ; [.437F.0020.0002] # DUPLOYAN AFFIX MID HORIZONTAL SECANT +1BC72 ; [.4380.0020.0002] # DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT +1BC73 ; [.4381.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL SECANT +1BC74 ; [.4382.0020.0002] # DUPLOYAN AFFIX MID VERTICAL SECANT +1BC75 ; [.4383.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL SECANT +1BC76 ; [.4384.0020.0002] # DUPLOYAN AFFIX ATTACHED SECANT +1BC77 ; [.4385.0020.0002] # DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT +1BC78 ; [.4386.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT +1BC79 ; [.4387.0020.0002] # DUPLOYAN AFFIX ATTACHED TAIL +1BC7A ; [.4388.0020.0002] # DUPLOYAN AFFIX ATTACHED E HOOK +1BC7B ; [.4389.0020.0002] # DUPLOYAN AFFIX ATTACHED I HOOK +1BC7C ; [.438A.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80 ; [.438B.0020.0002] # DUPLOYAN AFFIX HIGH ACUTE +1BC81 ; [.438C.0020.0002] # DUPLOYAN AFFIX HIGH TIGHT ACUTE +1BC82 ; [.438D.0020.0002] # DUPLOYAN AFFIX HIGH GRAVE +1BC83 ; [.438E.0020.0002] # DUPLOYAN AFFIX HIGH LONG GRAVE +1BC84 ; [.438F.0020.0002] # DUPLOYAN AFFIX HIGH DOT +1BC85 ; [.4390.0020.0002] # DUPLOYAN AFFIX HIGH CIRCLE +1BC86 ; [.4391.0020.0002] # DUPLOYAN AFFIX HIGH LINE +1BC87 ; [.4392.0020.0002] # DUPLOYAN AFFIX HIGH WAVE +1BC88 ; [.4393.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL +1BC90 ; [.4394.0020.0002] # DUPLOYAN AFFIX LOW ACUTE +1BC91 ; [.4395.0020.0002] # DUPLOYAN AFFIX LOW TIGHT ACUTE +1BC92 ; [.4396.0020.0002] # DUPLOYAN AFFIX LOW GRAVE +1BC93 ; [.4397.0020.0002] # DUPLOYAN AFFIX LOW LONG GRAVE +1BC94 ; [.4398.0020.0002] # DUPLOYAN AFFIX LOW DOT +1BC95 ; [.4399.0020.0002] # DUPLOYAN AFFIX LOW CIRCLE +1BC96 ; [.439A.0020.0002] # DUPLOYAN AFFIX LOW LINE +1BC97 ; [.439B.0020.0002] # DUPLOYAN AFFIX LOW WAVE +1BC98 ; [.439C.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL +1BC99 ; [.439D.0020.0002] # DUPLOYAN AFFIX LOW ARROW +10480 ; [.439E.0020.0002] # OSMANYA LETTER ALEF +10481 ; [.439F.0020.0002] # OSMANYA LETTER BA +10482 ; [.43A0.0020.0002] # OSMANYA LETTER TA +10483 ; [.43A1.0020.0002] # OSMANYA LETTER JA +10484 ; [.43A2.0020.0002] # OSMANYA LETTER XA +10485 ; [.43A3.0020.0002] # OSMANYA LETTER KHA +10486 ; [.43A4.0020.0002] # OSMANYA LETTER DEEL +10487 ; [.43A5.0020.0002] # OSMANYA LETTER RA +10488 ; [.43A6.0020.0002] # OSMANYA LETTER SA +10489 ; [.43A7.0020.0002] # OSMANYA LETTER SHIIN +1048A ; [.43A8.0020.0002] # OSMANYA LETTER DHA +1048B ; [.43A9.0020.0002] # OSMANYA LETTER CAYN +1048C ; [.43AA.0020.0002] # OSMANYA LETTER GA +1048D ; [.43AB.0020.0002] # OSMANYA LETTER FA +1048E ; [.43AC.0020.0002] # OSMANYA LETTER QAAF +1048F ; [.43AD.0020.0002] # OSMANYA LETTER KAAF +10490 ; [.43AE.0020.0002] # OSMANYA LETTER LAAN +10491 ; [.43AF.0020.0002] # OSMANYA LETTER MIIN +10492 ; [.43B0.0020.0002] # OSMANYA LETTER NUUN +10493 ; [.43B1.0020.0002] # OSMANYA LETTER WAW +10494 ; [.43B2.0020.0002] # OSMANYA LETTER HA +10495 ; [.43B3.0020.0002] # OSMANYA LETTER YA +10496 ; [.43B4.0020.0002] # OSMANYA LETTER A +10497 ; [.43B5.0020.0002] # OSMANYA LETTER E +10498 ; [.43B6.0020.0002] # OSMANYA LETTER I +10499 ; [.43B7.0020.0002] # OSMANYA LETTER O +1049A ; [.43B8.0020.0002] # OSMANYA LETTER U +1049B ; [.43B9.0020.0002] # OSMANYA LETTER AA +1049C ; [.43BA.0020.0002] # OSMANYA LETTER EE +1049D ; [.43BB.0020.0002] # OSMANYA LETTER OO +10500 ; [.43BC.0020.0002] # ELBASAN LETTER A +10501 ; [.43BD.0020.0002] # ELBASAN LETTER BE +10502 ; [.43BE.0020.0002] # ELBASAN LETTER CE +10503 ; [.43BF.0020.0002] # ELBASAN LETTER CHE +10504 ; [.43C0.0020.0002] # ELBASAN LETTER DE +10505 ; [.43C1.0020.0002] # ELBASAN LETTER NDE +10506 ; [.43C2.0020.0002] # ELBASAN LETTER DHE +10507 ; [.43C3.0020.0002] # ELBASAN LETTER EI +10508 ; [.43C4.0020.0002] # ELBASAN LETTER E +10509 ; [.43C5.0020.0002] # ELBASAN LETTER FE +1050A ; [.43C6.0020.0002] # ELBASAN LETTER GE +1050B ; [.43C7.0020.0002] # ELBASAN LETTER GJE +1050C ; [.43C8.0020.0002] # ELBASAN LETTER HE +1050D ; [.43C9.0020.0002] # ELBASAN LETTER I +1050E ; [.43CA.0020.0002] # ELBASAN LETTER JE +1050F ; [.43CB.0020.0002] # ELBASAN LETTER KE +10510 ; [.43CC.0020.0002] # ELBASAN LETTER LE +10511 ; [.43CD.0020.0002] # ELBASAN LETTER LLE +10512 ; [.43CE.0020.0002] # ELBASAN LETTER ME +10513 ; [.43CF.0020.0002] # ELBASAN LETTER NE +10514 ; [.43D0.0020.0002] # ELBASAN LETTER NA +10515 ; [.43D1.0020.0002] # ELBASAN LETTER NJE +10516 ; [.43D2.0020.0002] # ELBASAN LETTER O +10517 ; [.43D3.0020.0002] # ELBASAN LETTER PE +10518 ; [.43D4.0020.0002] # ELBASAN LETTER QE +10519 ; [.43D5.0020.0002] # ELBASAN LETTER RE +1051A ; [.43D6.0020.0002] # ELBASAN LETTER RRE +1051B ; [.43D7.0020.0002] # ELBASAN LETTER SE +1051C ; [.43D8.0020.0002] # ELBASAN LETTER SHE +1051D ; [.43D9.0020.0002] # ELBASAN LETTER TE +1051E ; [.43DA.0020.0002] # ELBASAN LETTER THE +1051F ; [.43DB.0020.0002] # ELBASAN LETTER U +10520 ; [.43DC.0020.0002] # ELBASAN LETTER VE +10521 ; [.43DD.0020.0002] # ELBASAN LETTER XE +10522 ; [.43DE.0020.0002] # ELBASAN LETTER Y +10523 ; [.43DF.0020.0002] # ELBASAN LETTER ZE +10524 ; [.43E0.0020.0002] # ELBASAN LETTER ZHE +10525 ; [.43E1.0020.0002] # ELBASAN LETTER GHE +10526 ; [.43E2.0020.0002] # ELBASAN LETTER GHAMMA +10527 ; [.43E3.0020.0002] # ELBASAN LETTER KHE +10530 ; [.43E4.0020.0002] # CAUCASIAN ALBANIAN LETTER ALT +10531 ; [.43E5.0020.0002] # CAUCASIAN ALBANIAN LETTER BET +10532 ; [.43E6.0020.0002] # CAUCASIAN ALBANIAN LETTER GIM +10533 ; [.43E7.0020.0002] # CAUCASIAN ALBANIAN LETTER DAT +10534 ; [.43E8.0020.0002] # CAUCASIAN ALBANIAN LETTER EB +10535 ; [.43E9.0020.0002] # CAUCASIAN ALBANIAN LETTER ZARL +10536 ; [.43EA.0020.0002] # CAUCASIAN ALBANIAN LETTER EYN +10537 ; [.43EB.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHIL +10538 ; [.43EC.0020.0002] # CAUCASIAN ALBANIAN LETTER TAS +10539 ; [.43ED.0020.0002] # CAUCASIAN ALBANIAN LETTER CHA +1053A ; [.43EE.0020.0002] # CAUCASIAN ALBANIAN LETTER YOWD +1053B ; [.43EF.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHA +1053C ; [.43F0.0020.0002] # CAUCASIAN ALBANIAN LETTER IRB +1053D ; [.43F1.0020.0002] # CAUCASIAN ALBANIAN LETTER SHA +1053E ; [.43F2.0020.0002] # CAUCASIAN ALBANIAN LETTER LAN +1053F ; [.43F3.0020.0002] # CAUCASIAN ALBANIAN LETTER INYA +10540 ; [.43F4.0020.0002] # CAUCASIAN ALBANIAN LETTER XEYN +10541 ; [.43F5.0020.0002] # CAUCASIAN ALBANIAN LETTER DYAN +10542 ; [.43F6.0020.0002] # CAUCASIAN ALBANIAN LETTER CAR +10543 ; [.43F7.0020.0002] # CAUCASIAN ALBANIAN LETTER JHOX +10544 ; [.43F8.0020.0002] # CAUCASIAN ALBANIAN LETTER KAR +10545 ; [.43F9.0020.0002] # CAUCASIAN ALBANIAN LETTER LYIT +10546 ; [.43FA.0020.0002] # CAUCASIAN ALBANIAN LETTER HEYT +10547 ; [.43FB.0020.0002] # CAUCASIAN ALBANIAN LETTER QAY +10548 ; [.43FC.0020.0002] # CAUCASIAN ALBANIAN LETTER AOR +10549 ; [.43FD.0020.0002] # CAUCASIAN ALBANIAN LETTER CHOY +1054A ; [.43FE.0020.0002] # CAUCASIAN ALBANIAN LETTER CHI +1054B ; [.43FF.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAY +1054C ; [.4400.0020.0002] # CAUCASIAN ALBANIAN LETTER MAQ +1054D ; [.4401.0020.0002] # CAUCASIAN ALBANIAN LETTER QAR +1054E ; [.4402.0020.0002] # CAUCASIAN ALBANIAN LETTER NOWC +1054F ; [.4403.0020.0002] # CAUCASIAN ALBANIAN LETTER DZYAY +10550 ; [.4404.0020.0002] # CAUCASIAN ALBANIAN LETTER SHAK +10551 ; [.4405.0020.0002] # CAUCASIAN ALBANIAN LETTER JAYN +10552 ; [.4406.0020.0002] # CAUCASIAN ALBANIAN LETTER ON +10553 ; [.4407.0020.0002] # CAUCASIAN ALBANIAN LETTER TYAY +10554 ; [.4408.0020.0002] # CAUCASIAN ALBANIAN LETTER FAM +10555 ; [.4409.0020.0002] # CAUCASIAN ALBANIAN LETTER DZAY +10556 ; [.440A.0020.0002] # CAUCASIAN ALBANIAN LETTER CHAT +10557 ; [.440B.0020.0002] # CAUCASIAN ALBANIAN LETTER PEN +10558 ; [.440C.0020.0002] # CAUCASIAN ALBANIAN LETTER GHEYS +10559 ; [.440D.0020.0002] # CAUCASIAN ALBANIAN LETTER RAT +1055A ; [.440E.0020.0002] # CAUCASIAN ALBANIAN LETTER SEYK +1055B ; [.440F.0020.0002] # CAUCASIAN ALBANIAN LETTER VEYZ +1055C ; [.4410.0020.0002] # CAUCASIAN ALBANIAN LETTER TIWR +1055D ; [.4411.0020.0002] # CAUCASIAN ALBANIAN LETTER SHOY +1055E ; [.4412.0020.0002] # CAUCASIAN ALBANIAN LETTER IWN +1055F ; [.4413.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAW +10560 ; [.4414.0020.0002] # CAUCASIAN ALBANIAN LETTER CAYN +10561 ; [.4415.0020.0002] # CAUCASIAN ALBANIAN LETTER YAYD +10562 ; [.4416.0020.0002] # CAUCASIAN ALBANIAN LETTER PIWR +10563 ; [.4417.0020.0002] # CAUCASIAN ALBANIAN LETTER KIW +110D0 ; [.4418.0020.0002] # SORA SOMPENG LETTER SAH +110D1 ; [.4419.0020.0002] # SORA SOMPENG LETTER TAH +110D2 ; [.441A.0020.0002] # SORA SOMPENG LETTER BAH +110D3 ; [.441B.0020.0002] # SORA SOMPENG LETTER CAH +110D4 ; [.441C.0020.0002] # SORA SOMPENG LETTER DAH +110D5 ; [.441D.0020.0002] # SORA SOMPENG LETTER GAH +110D6 ; [.441E.0020.0002] # SORA SOMPENG LETTER MAH +110D7 ; [.441F.0020.0002] # SORA SOMPENG LETTER NGAH +110D8 ; [.4420.0020.0002] # SORA SOMPENG LETTER LAH +110D9 ; [.4421.0020.0002] # SORA SOMPENG LETTER NAH +110DA ; [.4422.0020.0002] # SORA SOMPENG LETTER VAH +110DB ; [.4423.0020.0002] # SORA SOMPENG LETTER PAH +110DC ; [.4424.0020.0002] # SORA SOMPENG LETTER YAH +110DD ; [.4425.0020.0002] # SORA SOMPENG LETTER RAH +110DE ; [.4426.0020.0002] # SORA SOMPENG LETTER HAH +110DF ; [.4427.0020.0002] # SORA SOMPENG LETTER KAH +110E0 ; [.4428.0020.0002] # SORA SOMPENG LETTER JAH +110E1 ; [.4429.0020.0002] # SORA SOMPENG LETTER NYAH +110E2 ; [.442A.0020.0002] # SORA SOMPENG LETTER AH +110E3 ; [.442B.0020.0002] # SORA SOMPENG LETTER EEH +110E4 ; [.442C.0020.0002] # SORA SOMPENG LETTER IH +110E5 ; [.442D.0020.0002] # SORA SOMPENG LETTER UH +110E6 ; [.442E.0020.0002] # SORA SOMPENG LETTER OH +110E7 ; [.442F.0020.0002] # SORA SOMPENG LETTER EH +110E8 ; [.4430.0020.0002] # SORA SOMPENG LETTER MAE +16A40 ; [.4431.0020.0002] # MRO LETTER TA +16A41 ; [.4432.0020.0002] # MRO LETTER NGI +16A42 ; [.4433.0020.0002] # MRO LETTER YO +16A43 ; [.4434.0020.0002] # MRO LETTER MIM +16A44 ; [.4435.0020.0002] # MRO LETTER BA +16A45 ; [.4436.0020.0002] # MRO LETTER DA +16A46 ; [.4437.0020.0002] # MRO LETTER A +16A47 ; [.4438.0020.0002] # MRO LETTER PHI +16A48 ; [.4439.0020.0002] # MRO LETTER KHAI +16A49 ; [.443A.0020.0002] # MRO LETTER HAO +16A4A ; [.443B.0020.0002] # MRO LETTER DAI +16A4B ; [.443C.0020.0002] # MRO LETTER CHU +16A4C ; [.443D.0020.0002] # MRO LETTER KEAAE +16A4D ; [.443E.0020.0002] # MRO LETTER OL +16A4E ; [.443F.0020.0002] # MRO LETTER MAEM +16A4F ; [.4440.0020.0002] # MRO LETTER NIN +16A50 ; [.4441.0020.0002] # MRO LETTER PA +16A51 ; [.4442.0020.0002] # MRO LETTER OO +16A52 ; [.4443.0020.0002] # MRO LETTER O +16A53 ; [.4444.0020.0002] # MRO LETTER RO +16A54 ; [.4445.0020.0002] # MRO LETTER SHI +16A55 ; [.4446.0020.0002] # MRO LETTER THEA +16A56 ; [.4447.0020.0002] # MRO LETTER EA +16A57 ; [.4448.0020.0002] # MRO LETTER WA +16A58 ; [.4449.0020.0002] # MRO LETTER E +16A59 ; [.444A.0020.0002] # MRO LETTER KO +16A5A ; [.444B.0020.0002] # MRO LETTER LAN +16A5B ; [.444C.0020.0002] # MRO LETTER LA +16A5C ; [.444D.0020.0002] # MRO LETTER HAI +16A5D ; [.444E.0020.0002] # MRO LETTER RI +16A5E ; [.444F.0020.0002] # MRO LETTER TEK +10000 ; [.4450.0020.0002] # LINEAR B SYLLABLE B008 A +10001 ; [.4451.0020.0002] # LINEAR B SYLLABLE B038 E +10002 ; [.4452.0020.0002] # LINEAR B SYLLABLE B028 I +10003 ; [.4453.0020.0002] # LINEAR B SYLLABLE B061 O +10004 ; [.4454.0020.0002] # LINEAR B SYLLABLE B010 U +10005 ; [.4455.0020.0002] # LINEAR B SYLLABLE B001 DA +10006 ; [.4456.0020.0002] # LINEAR B SYLLABLE B045 DE +10007 ; [.4457.0020.0002] # LINEAR B SYLLABLE B007 DI +10008 ; [.4458.0020.0002] # LINEAR B SYLLABLE B014 DO +10009 ; [.4459.0020.0002] # LINEAR B SYLLABLE B051 DU +1000A ; [.445A.0020.0002] # LINEAR B SYLLABLE B057 JA +1000B ; [.445B.0020.0002] # LINEAR B SYLLABLE B046 JE +1000D ; [.445C.0020.0002] # LINEAR B SYLLABLE B036 JO +1000E ; [.445D.0020.0002] # LINEAR B SYLLABLE B065 JU +1000F ; [.445E.0020.0002] # LINEAR B SYLLABLE B077 KA +10010 ; [.445F.0020.0002] # LINEAR B SYLLABLE B044 KE +10011 ; [.4460.0020.0002] # LINEAR B SYLLABLE B067 KI +10012 ; [.4461.0020.0002] # LINEAR B SYLLABLE B070 KO +10013 ; [.4462.0020.0002] # LINEAR B SYLLABLE B081 KU +10014 ; [.4463.0020.0002] # LINEAR B SYLLABLE B080 MA +10015 ; [.4464.0020.0002] # LINEAR B SYLLABLE B013 ME +10016 ; [.4465.0020.0002] # LINEAR B SYLLABLE B073 MI +10017 ; [.4466.0020.0002] # LINEAR B SYLLABLE B015 MO +10018 ; [.4467.0020.0002] # LINEAR B SYLLABLE B023 MU +10019 ; [.4468.0020.0002] # LINEAR B SYLLABLE B006 NA +1001A ; [.4469.0020.0002] # LINEAR B SYLLABLE B024 NE +1001B ; [.446A.0020.0002] # LINEAR B SYLLABLE B030 NI +1001C ; [.446B.0020.0002] # LINEAR B SYLLABLE B052 NO +1001D ; [.446C.0020.0002] # LINEAR B SYLLABLE B055 NU +1001E ; [.446D.0020.0002] # LINEAR B SYLLABLE B003 PA +1001F ; [.446E.0020.0002] # LINEAR B SYLLABLE B072 PE +10020 ; [.446F.0020.0002] # LINEAR B SYLLABLE B039 PI +10021 ; [.4470.0020.0002] # LINEAR B SYLLABLE B011 PO +10022 ; [.4471.0020.0002] # LINEAR B SYLLABLE B050 PU +10023 ; [.4472.0020.0002] # LINEAR B SYLLABLE B016 QA +10024 ; [.4473.0020.0002] # LINEAR B SYLLABLE B078 QE +10025 ; [.4474.0020.0002] # LINEAR B SYLLABLE B021 QI +10026 ; [.4475.0020.0002] # LINEAR B SYLLABLE B032 QO +10028 ; [.4476.0020.0002] # LINEAR B SYLLABLE B060 RA +10029 ; [.4477.0020.0002] # LINEAR B SYLLABLE B027 RE +1002A ; [.4478.0020.0002] # LINEAR B SYLLABLE B053 RI +1002B ; [.4479.0020.0002] # LINEAR B SYLLABLE B002 RO +1002C ; [.447A.0020.0002] # LINEAR B SYLLABLE B026 RU +1002D ; [.447B.0020.0002] # LINEAR B SYLLABLE B031 SA +1002E ; [.447C.0020.0002] # LINEAR B SYLLABLE B009 SE +1002F ; [.447D.0020.0002] # LINEAR B SYLLABLE B041 SI +10030 ; [.447E.0020.0002] # LINEAR B SYLLABLE B012 SO +10031 ; [.447F.0020.0002] # LINEAR B SYLLABLE B058 SU +10032 ; [.4480.0020.0002] # LINEAR B SYLLABLE B059 TA +10033 ; [.4481.0020.0002] # LINEAR B SYLLABLE B004 TE +10034 ; [.4482.0020.0002] # LINEAR B SYLLABLE B037 TI +10035 ; [.4483.0020.0002] # LINEAR B SYLLABLE B005 TO +10036 ; [.4484.0020.0002] # LINEAR B SYLLABLE B069 TU +10037 ; [.4485.0020.0002] # LINEAR B SYLLABLE B054 WA +10038 ; [.4486.0020.0002] # LINEAR B SYLLABLE B075 WE +10039 ; [.4487.0020.0002] # LINEAR B SYLLABLE B040 WI +1003A ; [.4488.0020.0002] # LINEAR B SYLLABLE B042 WO +1003C ; [.4489.0020.0002] # LINEAR B SYLLABLE B017 ZA +1003D ; [.448A.0020.0002] # LINEAR B SYLLABLE B074 ZE +1003F ; [.448B.0020.0002] # LINEAR B SYLLABLE B020 ZO +10040 ; [.448C.0020.0002] # LINEAR B SYLLABLE B025 A2 +10041 ; [.448D.0020.0002] # LINEAR B SYLLABLE B043 A3 +10042 ; [.448E.0020.0002] # LINEAR B SYLLABLE B085 AU +10043 ; [.448F.0020.0002] # LINEAR B SYLLABLE B071 DWE +10044 ; [.4490.0020.0002] # LINEAR B SYLLABLE B090 DWO +10045 ; [.4491.0020.0002] # LINEAR B SYLLABLE B048 NWA +10046 ; [.4492.0020.0002] # LINEAR B SYLLABLE B029 PU2 +10047 ; [.4493.0020.0002] # LINEAR B SYLLABLE B062 PTE +10048 ; [.4494.0020.0002] # LINEAR B SYLLABLE B076 RA2 +10049 ; [.4495.0020.0002] # LINEAR B SYLLABLE B033 RA3 +1004A ; [.4496.0020.0002] # LINEAR B SYLLABLE B068 RO2 +1004B ; [.4497.0020.0002] # LINEAR B SYLLABLE B066 TA2 +1004C ; [.4498.0020.0002] # LINEAR B SYLLABLE B087 TWE +1004D ; [.4499.0020.0002] # LINEAR B SYLLABLE B091 TWO +10050 ; [.449A.0020.0002] # LINEAR B SYMBOL B018 +10051 ; [.449B.0020.0002] # LINEAR B SYMBOL B019 +10052 ; [.449C.0020.0002] # LINEAR B SYMBOL B022 +10053 ; [.449D.0020.0002] # LINEAR B SYMBOL B034 +10054 ; [.449E.0020.0002] # LINEAR B SYMBOL B047 +10055 ; [.449F.0020.0002] # LINEAR B SYMBOL B049 +10056 ; [.44A0.0020.0002] # LINEAR B SYMBOL B056 +10057 ; [.44A1.0020.0002] # LINEAR B SYMBOL B063 +10058 ; [.44A2.0020.0002] # LINEAR B SYMBOL B064 +10059 ; [.44A3.0020.0002] # LINEAR B SYMBOL B079 +1005A ; [.44A4.0020.0002] # LINEAR B SYMBOL B082 +1005B ; [.44A5.0020.0002] # LINEAR B SYMBOL B083 +1005C ; [.44A6.0020.0002] # LINEAR B SYMBOL B086 +1005D ; [.44A7.0020.0002] # LINEAR B SYMBOL B089 +10080 ; [.44A8.0020.0002] # LINEAR B IDEOGRAM B100 MAN +10081 ; [.44A9.0020.0002] # LINEAR B IDEOGRAM B102 WOMAN +10082 ; [.44AA.0020.0002] # LINEAR B IDEOGRAM B104 DEER +10083 ; [.44AB.0020.0002] # LINEAR B IDEOGRAM B105 EQUID +10084 ; [.44AC.0020.0002] # LINEAR B IDEOGRAM B105F MARE +10085 ; [.44AD.0020.0002] # LINEAR B IDEOGRAM B105M STALLION +10086 ; [.44AE.0020.0002] # LINEAR B IDEOGRAM B106F EWE +10087 ; [.44AF.0020.0002] # LINEAR B IDEOGRAM B106M RAM +10088 ; [.44B0.0020.0002] # LINEAR B IDEOGRAM B107F SHE-GOAT +10089 ; [.44B1.0020.0002] # LINEAR B IDEOGRAM B107M HE-GOAT +1008A ; [.44B2.0020.0002] # LINEAR B IDEOGRAM B108F SOW +1008B ; [.44B3.0020.0002] # LINEAR B IDEOGRAM B108M BOAR +1008C ; [.44B4.0020.0002] # LINEAR B IDEOGRAM B109F COW +1008D ; [.44B5.0020.0002] # LINEAR B IDEOGRAM B109M BULL +1008E ; [.44B6.0020.0002] # LINEAR B IDEOGRAM B120 WHEAT +1008F ; [.44B7.0020.0002] # LINEAR B IDEOGRAM B121 BARLEY +10090 ; [.44B8.0020.0002] # LINEAR B IDEOGRAM B122 OLIVE +10091 ; [.44B9.0020.0002] # LINEAR B IDEOGRAM B123 SPICE +10092 ; [.44BA.0020.0002] # LINEAR B IDEOGRAM B125 CYPERUS +10093 ; [.44BB.0020.0002] # LINEAR B MONOGRAM B127 KAPO +10094 ; [.44BC.0020.0002] # LINEAR B MONOGRAM B128 KANAKO +10095 ; [.44BD.0020.0002] # LINEAR B IDEOGRAM B130 OIL +10096 ; [.44BE.0020.0002] # LINEAR B IDEOGRAM B131 WINE +10097 ; [.44BF.0020.0002] # LINEAR B IDEOGRAM B132 +10098 ; [.44C0.0020.0002] # LINEAR B MONOGRAM B133 AREPA +10099 ; [.44C1.0020.0002] # LINEAR B MONOGRAM B135 MERI +1009A ; [.44C2.0020.0002] # LINEAR B IDEOGRAM B140 BRONZE +1009B ; [.44C3.0020.0002] # LINEAR B IDEOGRAM B141 GOLD +1009C ; [.44C4.0020.0002] # LINEAR B IDEOGRAM B142 +1009D ; [.44C5.0020.0002] # LINEAR B IDEOGRAM B145 WOOL +1009E ; [.44C6.0020.0002] # LINEAR B IDEOGRAM B146 +1009F ; [.44C7.0020.0002] # LINEAR B IDEOGRAM B150 +100A0 ; [.44C8.0020.0002] # LINEAR B IDEOGRAM B151 HORN +100A1 ; [.44C9.0020.0002] # LINEAR B IDEOGRAM B152 +100A2 ; [.44CA.0020.0002] # LINEAR B IDEOGRAM B153 +100A3 ; [.44CB.0020.0002] # LINEAR B IDEOGRAM B154 +100A4 ; [.44CC.0020.0002] # LINEAR B MONOGRAM B156 TURO2 +100A5 ; [.44CD.0020.0002] # LINEAR B IDEOGRAM B157 +100A6 ; [.44CE.0020.0002] # LINEAR B IDEOGRAM B158 +100A7 ; [.44CF.0020.0002] # LINEAR B IDEOGRAM B159 CLOTH +100A8 ; [.44D0.0020.0002] # LINEAR B IDEOGRAM B160 +100A9 ; [.44D1.0020.0002] # LINEAR B IDEOGRAM B161 +100AA ; [.44D2.0020.0002] # LINEAR B IDEOGRAM B162 GARMENT +100AB ; [.44D3.0020.0002] # LINEAR B IDEOGRAM B163 ARMOUR +100AC ; [.44D4.0020.0002] # LINEAR B IDEOGRAM B164 +100AD ; [.44D5.0020.0002] # LINEAR B IDEOGRAM B165 +100AE ; [.44D6.0020.0002] # LINEAR B IDEOGRAM B166 +100AF ; [.44D7.0020.0002] # LINEAR B IDEOGRAM B167 +100B0 ; [.44D8.0020.0002] # LINEAR B IDEOGRAM B168 +100B1 ; [.44D9.0020.0002] # LINEAR B IDEOGRAM B169 +100B2 ; [.44DA.0020.0002] # LINEAR B IDEOGRAM B170 +100B3 ; [.44DB.0020.0002] # LINEAR B IDEOGRAM B171 +100B4 ; [.44DC.0020.0002] # LINEAR B IDEOGRAM B172 +100B5 ; [.44DD.0020.0002] # LINEAR B IDEOGRAM B173 MONTH +100B6 ; [.44DE.0020.0002] # LINEAR B IDEOGRAM B174 +100B7 ; [.44DF.0020.0002] # LINEAR B IDEOGRAM B176 TREE +100B8 ; [.44E0.0020.0002] # LINEAR B IDEOGRAM B177 +100B9 ; [.44E1.0020.0002] # LINEAR B IDEOGRAM B178 +100BA ; [.44E2.0020.0002] # LINEAR B IDEOGRAM B179 +100BB ; [.44E3.0020.0002] # LINEAR B IDEOGRAM B180 +100BC ; [.44E4.0020.0002] # LINEAR B IDEOGRAM B181 +100BD ; [.44E5.0020.0002] # LINEAR B IDEOGRAM B182 +100BE ; [.44E6.0020.0002] # LINEAR B IDEOGRAM B183 +100BF ; [.44E7.0020.0002] # LINEAR B IDEOGRAM B184 +100C0 ; [.44E8.0020.0002] # LINEAR B IDEOGRAM B185 +100C1 ; [.44E9.0020.0002] # LINEAR B IDEOGRAM B189 +100C2 ; [.44EA.0020.0002] # LINEAR B IDEOGRAM B190 +100C3 ; [.44EB.0020.0002] # LINEAR B IDEOGRAM B191 HELMET +100C4 ; [.44EC.0020.0002] # LINEAR B IDEOGRAM B220 FOOTSTOOL +100C5 ; [.44ED.0020.0002] # LINEAR B IDEOGRAM B225 BATHTUB +100C6 ; [.44EE.0020.0002] # LINEAR B IDEOGRAM B230 SPEAR +100C7 ; [.44EF.0020.0002] # LINEAR B IDEOGRAM B231 ARROW +100C8 ; [.44F0.0020.0002] # LINEAR B IDEOGRAM B232 +100C9 ; [.44F1.0020.0002] # LINEAR B IDEOGRAM B233 SWORD +100CA ; [.44F2.0020.0002] # LINEAR B IDEOGRAM B234 +100CB ; [.44F3.0020.0002] # LINEAR B IDEOGRAM B236 +100CC ; [.44F4.0020.0002] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT +100CD ; [.44F5.0020.0002] # LINEAR B IDEOGRAM B241 CHARIOT +100CE ; [.44F6.0020.0002] # LINEAR B IDEOGRAM B242 CHARIOT FRAME +100CF ; [.44F7.0020.0002] # LINEAR B IDEOGRAM B243 WHEEL +100D0 ; [.44F8.0020.0002] # LINEAR B IDEOGRAM B245 +100D1 ; [.44F9.0020.0002] # LINEAR B IDEOGRAM B246 +100D2 ; [.44FA.0020.0002] # LINEAR B MONOGRAM B247 DIPTE +100D3 ; [.44FB.0020.0002] # LINEAR B IDEOGRAM B248 +100D4 ; [.44FC.0020.0002] # LINEAR B IDEOGRAM B249 +100D5 ; [.44FD.0020.0002] # LINEAR B IDEOGRAM B251 +100D6 ; [.44FE.0020.0002] # LINEAR B IDEOGRAM B252 +100D7 ; [.44FF.0020.0002] # LINEAR B IDEOGRAM B253 +100D8 ; [.4500.0020.0002] # LINEAR B IDEOGRAM B254 DART +100D9 ; [.4501.0020.0002] # LINEAR B IDEOGRAM B255 +100DA ; [.4502.0020.0002] # LINEAR B IDEOGRAM B256 +100DB ; [.4503.0020.0002] # LINEAR B IDEOGRAM B257 +100DC ; [.4504.0020.0002] # LINEAR B IDEOGRAM B258 +100DD ; [.4505.0020.0002] # LINEAR B IDEOGRAM B259 +100DE ; [.4506.0020.0002] # LINEAR B IDEOGRAM VESSEL B155 +100DF ; [.4507.0020.0002] # LINEAR B IDEOGRAM VESSEL B200 +100E0 ; [.4508.0020.0002] # LINEAR B IDEOGRAM VESSEL B201 +100E1 ; [.4509.0020.0002] # LINEAR B IDEOGRAM VESSEL B202 +100E2 ; [.450A.0020.0002] # LINEAR B IDEOGRAM VESSEL B203 +100E3 ; [.450B.0020.0002] # LINEAR B IDEOGRAM VESSEL B204 +100E4 ; [.450C.0020.0002] # LINEAR B IDEOGRAM VESSEL B205 +100E5 ; [.450D.0020.0002] # LINEAR B IDEOGRAM VESSEL B206 +100E6 ; [.450E.0020.0002] # LINEAR B IDEOGRAM VESSEL B207 +100E7 ; [.450F.0020.0002] # LINEAR B IDEOGRAM VESSEL B208 +100E8 ; [.4510.0020.0002] # LINEAR B IDEOGRAM VESSEL B209 +100E9 ; [.4511.0020.0002] # LINEAR B IDEOGRAM VESSEL B210 +100EA ; [.4512.0020.0002] # LINEAR B IDEOGRAM VESSEL B211 +100EB ; [.4513.0020.0002] # LINEAR B IDEOGRAM VESSEL B212 +100EC ; [.4514.0020.0002] # LINEAR B IDEOGRAM VESSEL B213 +100ED ; [.4515.0020.0002] # LINEAR B IDEOGRAM VESSEL B214 +100EE ; [.4516.0020.0002] # LINEAR B IDEOGRAM VESSEL B215 +100EF ; [.4517.0020.0002] # LINEAR B IDEOGRAM VESSEL B216 +100F0 ; [.4518.0020.0002] # LINEAR B IDEOGRAM VESSEL B217 +100F1 ; [.4519.0020.0002] # LINEAR B IDEOGRAM VESSEL B218 +100F2 ; [.451A.0020.0002] # LINEAR B IDEOGRAM VESSEL B219 +100F3 ; [.451B.0020.0002] # LINEAR B IDEOGRAM VESSEL B221 +100F4 ; [.451C.0020.0002] # LINEAR B IDEOGRAM VESSEL B222 +100F5 ; [.451D.0020.0002] # LINEAR B IDEOGRAM VESSEL B226 +100F6 ; [.451E.0020.0002] # LINEAR B IDEOGRAM VESSEL B227 +100F7 ; [.451F.0020.0002] # LINEAR B IDEOGRAM VESSEL B228 +100F8 ; [.4520.0020.0002] # LINEAR B IDEOGRAM VESSEL B229 +100F9 ; [.4521.0020.0002] # LINEAR B IDEOGRAM VESSEL B250 +100FA ; [.4522.0020.0002] # LINEAR B IDEOGRAM VESSEL B305 +10600 ; [.4523.0020.0002] # LINEAR A SIGN AB001 +10601 ; [.4524.0020.0002] # LINEAR A SIGN AB002 +10602 ; [.4525.0020.0002] # LINEAR A SIGN AB003 +10603 ; [.4526.0020.0002] # LINEAR A SIGN AB004 +10604 ; [.4527.0020.0002] # LINEAR A SIGN AB005 +10605 ; [.4528.0020.0002] # LINEAR A SIGN AB006 +10606 ; [.4529.0020.0002] # LINEAR A SIGN AB007 +10607 ; [.452A.0020.0002] # LINEAR A SIGN AB008 +10608 ; [.452B.0020.0002] # LINEAR A SIGN AB009 +10609 ; [.452C.0020.0002] # LINEAR A SIGN AB010 +1060A ; [.452D.0020.0002] # LINEAR A SIGN AB011 +1060B ; [.452E.0020.0002] # LINEAR A SIGN AB013 +1060C ; [.452F.0020.0002] # LINEAR A SIGN AB016 +1060D ; [.4530.0020.0002] # LINEAR A SIGN AB017 +1060E ; [.4531.0020.0002] # LINEAR A SIGN AB020 +1060F ; [.4532.0020.0002] # LINEAR A SIGN AB021 +10610 ; [.4533.0020.0002] # LINEAR A SIGN AB021F +10611 ; [.4534.0020.0002] # LINEAR A SIGN AB021M +10612 ; [.4535.0020.0002] # LINEAR A SIGN AB022 +10613 ; [.4536.0020.0002] # LINEAR A SIGN AB022F +10614 ; [.4537.0020.0002] # LINEAR A SIGN AB022M +10615 ; [.4538.0020.0002] # LINEAR A SIGN AB023 +10616 ; [.4539.0020.0002] # LINEAR A SIGN AB023M +10617 ; [.453A.0020.0002] # LINEAR A SIGN AB024 +10618 ; [.453B.0020.0002] # LINEAR A SIGN AB026 +10619 ; [.453C.0020.0002] # LINEAR A SIGN AB027 +1061A ; [.453D.0020.0002] # LINEAR A SIGN AB028 +1061B ; [.453E.0020.0002] # LINEAR A SIGN A028B +1061C ; [.453F.0020.0002] # LINEAR A SIGN AB029 +1061D ; [.4540.0020.0002] # LINEAR A SIGN AB030 +1061E ; [.4541.0020.0002] # LINEAR A SIGN AB031 +1061F ; [.4542.0020.0002] # LINEAR A SIGN AB034 +10620 ; [.4543.0020.0002] # LINEAR A SIGN AB037 +10621 ; [.4544.0020.0002] # LINEAR A SIGN AB038 +10622 ; [.4545.0020.0002] # LINEAR A SIGN AB039 +10623 ; [.4546.0020.0002] # LINEAR A SIGN AB040 +10624 ; [.4547.0020.0002] # LINEAR A SIGN AB041 +10625 ; [.4548.0020.0002] # LINEAR A SIGN AB044 +10626 ; [.4549.0020.0002] # LINEAR A SIGN AB045 +10627 ; [.454A.0020.0002] # LINEAR A SIGN AB046 +10628 ; [.454B.0020.0002] # LINEAR A SIGN AB047 +10629 ; [.454C.0020.0002] # LINEAR A SIGN AB048 +1062A ; [.454D.0020.0002] # LINEAR A SIGN AB049 +1062B ; [.454E.0020.0002] # LINEAR A SIGN AB050 +1062C ; [.454F.0020.0002] # LINEAR A SIGN AB051 +1062D ; [.4550.0020.0002] # LINEAR A SIGN AB053 +1062E ; [.4551.0020.0002] # LINEAR A SIGN AB054 +1062F ; [.4552.0020.0002] # LINEAR A SIGN AB055 +10630 ; [.4553.0020.0002] # LINEAR A SIGN AB056 +10631 ; [.4554.0020.0002] # LINEAR A SIGN AB057 +10632 ; [.4555.0020.0002] # LINEAR A SIGN AB058 +10633 ; [.4556.0020.0002] # LINEAR A SIGN AB059 +10634 ; [.4557.0020.0002] # LINEAR A SIGN AB060 +10635 ; [.4558.0020.0002] # LINEAR A SIGN AB061 +10636 ; [.4559.0020.0002] # LINEAR A SIGN AB065 +10637 ; [.455A.0020.0002] # LINEAR A SIGN AB066 +10638 ; [.455B.0020.0002] # LINEAR A SIGN AB067 +10639 ; [.455C.0020.0002] # LINEAR A SIGN AB069 +1063A ; [.455D.0020.0002] # LINEAR A SIGN AB070 +1063B ; [.455E.0020.0002] # LINEAR A SIGN AB073 +1063C ; [.455F.0020.0002] # LINEAR A SIGN AB074 +1063D ; [.4560.0020.0002] # LINEAR A SIGN AB076 +1063E ; [.4561.0020.0002] # LINEAR A SIGN AB077 +1063F ; [.4562.0020.0002] # LINEAR A SIGN AB078 +10640 ; [.4563.0020.0002] # LINEAR A SIGN AB079 +10641 ; [.4564.0020.0002] # LINEAR A SIGN AB080 +10642 ; [.4565.0020.0002] # LINEAR A SIGN AB081 +10643 ; [.4566.0020.0002] # LINEAR A SIGN AB082 +10644 ; [.4567.0020.0002] # LINEAR A SIGN AB085 +10645 ; [.4568.0020.0002] # LINEAR A SIGN AB086 +10646 ; [.4569.0020.0002] # LINEAR A SIGN AB087 +10647 ; [.456A.0020.0002] # LINEAR A SIGN A100-102 +10648 ; [.456B.0020.0002] # LINEAR A SIGN AB118 +10649 ; [.456C.0020.0002] # LINEAR A SIGN AB120 +1064A ; [.456D.0020.0002] # LINEAR A SIGN A120B +1064B ; [.456E.0020.0002] # LINEAR A SIGN AB122 +1064C ; [.456F.0020.0002] # LINEAR A SIGN AB123 +1064D ; [.4570.0020.0002] # LINEAR A SIGN AB131A +1064E ; [.4571.0020.0002] # LINEAR A SIGN AB131B +1064F ; [.4572.0020.0002] # LINEAR A SIGN A131C +10650 ; [.4573.0020.0002] # LINEAR A SIGN AB164 +10651 ; [.4574.0020.0002] # LINEAR A SIGN AB171 +10652 ; [.4575.0020.0002] # LINEAR A SIGN AB180 +10653 ; [.4576.0020.0002] # LINEAR A SIGN AB188 +10654 ; [.4577.0020.0002] # LINEAR A SIGN AB191 +10655 ; [.4578.0020.0002] # LINEAR A SIGN A301 +10656 ; [.4579.0020.0002] # LINEAR A SIGN A302 +10657 ; [.457A.0020.0002] # LINEAR A SIGN A303 +10658 ; [.457B.0020.0002] # LINEAR A SIGN A304 +10659 ; [.457C.0020.0002] # LINEAR A SIGN A305 +1065A ; [.457D.0020.0002] # LINEAR A SIGN A306 +1065B ; [.457E.0020.0002] # LINEAR A SIGN A307 +1065C ; [.457F.0020.0002] # LINEAR A SIGN A308 +1065D ; [.4580.0020.0002] # LINEAR A SIGN A309A +1065E ; [.4581.0020.0002] # LINEAR A SIGN A309B +1065F ; [.4582.0020.0002] # LINEAR A SIGN A309C +10660 ; [.4583.0020.0002] # LINEAR A SIGN A310 +10661 ; [.4584.0020.0002] # LINEAR A SIGN A311 +10662 ; [.4585.0020.0002] # LINEAR A SIGN A312 +10663 ; [.4586.0020.0002] # LINEAR A SIGN A313A +10664 ; [.4587.0020.0002] # LINEAR A SIGN A313B +10665 ; [.4588.0020.0002] # LINEAR A SIGN A313C +10666 ; [.4589.0020.0002] # LINEAR A SIGN A314 +10667 ; [.458A.0020.0002] # LINEAR A SIGN A315 +10668 ; [.458B.0020.0002] # LINEAR A SIGN A316 +10669 ; [.458C.0020.0002] # LINEAR A SIGN A317 +1066A ; [.458D.0020.0002] # LINEAR A SIGN A318 +1066B ; [.458E.0020.0002] # LINEAR A SIGN A319 +1066C ; [.458F.0020.0002] # LINEAR A SIGN A320 +1066D ; [.4590.0020.0002] # LINEAR A SIGN A321 +1066E ; [.4591.0020.0002] # LINEAR A SIGN A322 +1066F ; [.4592.0020.0002] # LINEAR A SIGN A323 +10670 ; [.4593.0020.0002] # LINEAR A SIGN A324 +10671 ; [.4594.0020.0002] # LINEAR A SIGN A325 +10672 ; [.4595.0020.0002] # LINEAR A SIGN A326 +10673 ; [.4596.0020.0002] # LINEAR A SIGN A327 +10674 ; [.4597.0020.0002] # LINEAR A SIGN A328 +10675 ; [.4598.0020.0002] # LINEAR A SIGN A329 +10676 ; [.4599.0020.0002] # LINEAR A SIGN A330 +10677 ; [.459A.0020.0002] # LINEAR A SIGN A331 +10678 ; [.459B.0020.0002] # LINEAR A SIGN A332 +10679 ; [.459C.0020.0002] # LINEAR A SIGN A333 +1067A ; [.459D.0020.0002] # LINEAR A SIGN A334 +1067B ; [.459E.0020.0002] # LINEAR A SIGN A335 +1067C ; [.459F.0020.0002] # LINEAR A SIGN A336 +1067D ; [.45A0.0020.0002] # LINEAR A SIGN A337 +1067E ; [.45A1.0020.0002] # LINEAR A SIGN A338 +1067F ; [.45A2.0020.0002] # LINEAR A SIGN A339 +10680 ; [.45A3.0020.0002] # LINEAR A SIGN A340 +10681 ; [.45A4.0020.0002] # LINEAR A SIGN A341 +10682 ; [.45A5.0020.0002] # LINEAR A SIGN A342 +10683 ; [.45A6.0020.0002] # LINEAR A SIGN A343 +10684 ; [.45A7.0020.0002] # LINEAR A SIGN A344 +10685 ; [.45A8.0020.0002] # LINEAR A SIGN A345 +10686 ; [.45A9.0020.0002] # LINEAR A SIGN A346 +10687 ; [.45AA.0020.0002] # LINEAR A SIGN A347 +10688 ; [.45AB.0020.0002] # LINEAR A SIGN A348 +10689 ; [.45AC.0020.0002] # LINEAR A SIGN A349 +1068A ; [.45AD.0020.0002] # LINEAR A SIGN A350 +1068B ; [.45AE.0020.0002] # LINEAR A SIGN A351 +1068C ; [.45AF.0020.0002] # LINEAR A SIGN A352 +1068D ; [.45B0.0020.0002] # LINEAR A SIGN A353 +1068E ; [.45B1.0020.0002] # LINEAR A SIGN A354 +1068F ; [.45B2.0020.0002] # LINEAR A SIGN A355 +10690 ; [.45B3.0020.0002] # LINEAR A SIGN A356 +10691 ; [.45B4.0020.0002] # LINEAR A SIGN A357 +10692 ; [.45B5.0020.0002] # LINEAR A SIGN A358 +10693 ; [.45B6.0020.0002] # LINEAR A SIGN A359 +10694 ; [.45B7.0020.0002] # LINEAR A SIGN A360 +10695 ; [.45B8.0020.0002] # LINEAR A SIGN A361 +10696 ; [.45B9.0020.0002] # LINEAR A SIGN A362 +10697 ; [.45BA.0020.0002] # LINEAR A SIGN A363 +10698 ; [.45BB.0020.0002] # LINEAR A SIGN A364 +10699 ; [.45BC.0020.0002] # LINEAR A SIGN A365 +1069A ; [.45BD.0020.0002] # LINEAR A SIGN A366 +1069B ; [.45BE.0020.0002] # LINEAR A SIGN A367 +1069C ; [.45BF.0020.0002] # LINEAR A SIGN A368 +1069D ; [.45C0.0020.0002] # LINEAR A SIGN A369 +1069E ; [.45C1.0020.0002] # LINEAR A SIGN A370 +1069F ; [.45C2.0020.0002] # LINEAR A SIGN A371 +106A0 ; [.45C3.0020.0002] # LINEAR A SIGN A400-VAS +106A1 ; [.45C4.0020.0002] # LINEAR A SIGN A401-VAS +106A2 ; [.45C5.0020.0002] # LINEAR A SIGN A402-VAS +106A3 ; [.45C6.0020.0002] # LINEAR A SIGN A403-VAS +106A4 ; [.45C7.0020.0002] # LINEAR A SIGN A404-VAS +106A5 ; [.45C8.0020.0002] # LINEAR A SIGN A405-VAS +106A6 ; [.45C9.0020.0002] # LINEAR A SIGN A406-VAS +106A7 ; [.45CA.0020.0002] # LINEAR A SIGN A407-VAS +106A8 ; [.45CB.0020.0002] # LINEAR A SIGN A408-VAS +106A9 ; [.45CC.0020.0002] # LINEAR A SIGN A409-VAS +106AA ; [.45CD.0020.0002] # LINEAR A SIGN A410-VAS +106AB ; [.45CE.0020.0002] # LINEAR A SIGN A411-VAS +106AC ; [.45CF.0020.0002] # LINEAR A SIGN A412-VAS +106AD ; [.45D0.0020.0002] # LINEAR A SIGN A413-VAS +106AE ; [.45D1.0020.0002] # LINEAR A SIGN A414-VAS +106AF ; [.45D2.0020.0002] # LINEAR A SIGN A415-VAS +106B0 ; [.45D3.0020.0002] # LINEAR A SIGN A416-VAS +106B1 ; [.45D4.0020.0002] # LINEAR A SIGN A417-VAS +106B2 ; [.45D5.0020.0002] # LINEAR A SIGN A418-VAS +106B3 ; [.45D6.0020.0002] # LINEAR A SIGN A501 +106B4 ; [.45D7.0020.0002] # LINEAR A SIGN A502 +106B5 ; [.45D8.0020.0002] # LINEAR A SIGN A503 +106B6 ; [.45D9.0020.0002] # LINEAR A SIGN A504 +106B7 ; [.45DA.0020.0002] # LINEAR A SIGN A505 +106B8 ; [.45DB.0020.0002] # LINEAR A SIGN A506 +106B9 ; [.45DC.0020.0002] # LINEAR A SIGN A508 +106BA ; [.45DD.0020.0002] # LINEAR A SIGN A509 +106BB ; [.45DE.0020.0002] # LINEAR A SIGN A510 +106BC ; [.45DF.0020.0002] # LINEAR A SIGN A511 +106BD ; [.45E0.0020.0002] # LINEAR A SIGN A512 +106BE ; [.45E1.0020.0002] # LINEAR A SIGN A513 +106BF ; [.45E2.0020.0002] # LINEAR A SIGN A515 +106C0 ; [.45E3.0020.0002] # LINEAR A SIGN A516 +106C1 ; [.45E4.0020.0002] # LINEAR A SIGN A520 +106C2 ; [.45E5.0020.0002] # LINEAR A SIGN A521 +106C3 ; [.45E6.0020.0002] # LINEAR A SIGN A523 +106C4 ; [.45E7.0020.0002] # LINEAR A SIGN A524 +106C5 ; [.45E8.0020.0002] # LINEAR A SIGN A525 +106C6 ; [.45E9.0020.0002] # LINEAR A SIGN A526 +106C7 ; [.45EA.0020.0002] # LINEAR A SIGN A527 +106C8 ; [.45EB.0020.0002] # LINEAR A SIGN A528 +106C9 ; [.45EC.0020.0002] # LINEAR A SIGN A529 +106CA ; [.45ED.0020.0002] # LINEAR A SIGN A530 +106CB ; [.45EE.0020.0002] # LINEAR A SIGN A531 +106CC ; [.45EF.0020.0002] # LINEAR A SIGN A532 +106CD ; [.45F0.0020.0002] # LINEAR A SIGN A534 +106CE ; [.45F1.0020.0002] # LINEAR A SIGN A535 +106CF ; [.45F2.0020.0002] # LINEAR A SIGN A536 +106D0 ; [.45F3.0020.0002] # LINEAR A SIGN A537 +106D1 ; [.45F4.0020.0002] # LINEAR A SIGN A538 +106D2 ; [.45F5.0020.0002] # LINEAR A SIGN A539 +106D3 ; [.45F6.0020.0002] # LINEAR A SIGN A540 +106D4 ; [.45F7.0020.0002] # LINEAR A SIGN A541 +106D5 ; [.45F8.0020.0002] # LINEAR A SIGN A542 +106D6 ; [.45F9.0020.0002] # LINEAR A SIGN A545 +106D7 ; [.45FA.0020.0002] # LINEAR A SIGN A547 +106D8 ; [.45FB.0020.0002] # LINEAR A SIGN A548 +106D9 ; [.45FC.0020.0002] # LINEAR A SIGN A549 +106DA ; [.45FD.0020.0002] # LINEAR A SIGN A550 +106DB ; [.45FE.0020.0002] # LINEAR A SIGN A551 +106DC ; [.45FF.0020.0002] # LINEAR A SIGN A552 +106DD ; [.4600.0020.0002] # LINEAR A SIGN A553 +106DE ; [.4601.0020.0002] # LINEAR A SIGN A554 +106DF ; [.4602.0020.0002] # LINEAR A SIGN A555 +106E0 ; [.4603.0020.0002] # LINEAR A SIGN A556 +106E1 ; [.4604.0020.0002] # LINEAR A SIGN A557 +106E2 ; [.4605.0020.0002] # LINEAR A SIGN A559 +106E3 ; [.4606.0020.0002] # LINEAR A SIGN A563 +106E4 ; [.4607.0020.0002] # LINEAR A SIGN A564 +106E5 ; [.4608.0020.0002] # LINEAR A SIGN A565 +106E6 ; [.4609.0020.0002] # LINEAR A SIGN A566 +106E7 ; [.460A.0020.0002] # LINEAR A SIGN A568 +106E8 ; [.460B.0020.0002] # LINEAR A SIGN A569 +106E9 ; [.460C.0020.0002] # LINEAR A SIGN A570 +106EA ; [.460D.0020.0002] # LINEAR A SIGN A571 +106EB ; [.460E.0020.0002] # LINEAR A SIGN A572 +106EC ; [.460F.0020.0002] # LINEAR A SIGN A573 +106ED ; [.4610.0020.0002] # LINEAR A SIGN A574 +106EE ; [.4611.0020.0002] # LINEAR A SIGN A575 +106EF ; [.4612.0020.0002] # LINEAR A SIGN A576 +106F0 ; [.4613.0020.0002] # LINEAR A SIGN A577 +106F1 ; [.4614.0020.0002] # LINEAR A SIGN A578 +106F2 ; [.4615.0020.0002] # LINEAR A SIGN A579 +106F3 ; [.4616.0020.0002] # LINEAR A SIGN A580 +106F4 ; [.4617.0020.0002] # LINEAR A SIGN A581 +106F5 ; [.4618.0020.0002] # LINEAR A SIGN A582 +106F6 ; [.4619.0020.0002] # LINEAR A SIGN A583 +106F7 ; [.461A.0020.0002] # LINEAR A SIGN A584 +106F8 ; [.461B.0020.0002] # LINEAR A SIGN A585 +106F9 ; [.461C.0020.0002] # LINEAR A SIGN A586 +106FA ; [.461D.0020.0002] # LINEAR A SIGN A587 +106FB ; [.461E.0020.0002] # LINEAR A SIGN A588 +106FC ; [.461F.0020.0002] # LINEAR A SIGN A589 +106FD ; [.4620.0020.0002] # LINEAR A SIGN A591 +106FE ; [.4621.0020.0002] # LINEAR A SIGN A592 +106FF ; [.4622.0020.0002] # LINEAR A SIGN A594 +10700 ; [.4623.0020.0002] # LINEAR A SIGN A595 +10701 ; [.4624.0020.0002] # LINEAR A SIGN A596 +10702 ; [.4625.0020.0002] # LINEAR A SIGN A598 +10703 ; [.4626.0020.0002] # LINEAR A SIGN A600 +10704 ; [.4627.0020.0002] # LINEAR A SIGN A601 +10705 ; [.4628.0020.0002] # LINEAR A SIGN A602 +10706 ; [.4629.0020.0002] # LINEAR A SIGN A603 +10707 ; [.462A.0020.0002] # LINEAR A SIGN A604 +10708 ; [.462B.0020.0002] # LINEAR A SIGN A606 +10709 ; [.462C.0020.0002] # LINEAR A SIGN A608 +1070A ; [.462D.0020.0002] # LINEAR A SIGN A609 +1070B ; [.462E.0020.0002] # LINEAR A SIGN A610 +1070C ; [.462F.0020.0002] # LINEAR A SIGN A611 +1070D ; [.4630.0020.0002] # LINEAR A SIGN A612 +1070E ; [.4631.0020.0002] # LINEAR A SIGN A613 +1070F ; [.4632.0020.0002] # LINEAR A SIGN A614 +10710 ; [.4633.0020.0002] # LINEAR A SIGN A615 +10711 ; [.4634.0020.0002] # LINEAR A SIGN A616 +10712 ; [.4635.0020.0002] # LINEAR A SIGN A617 +10713 ; [.4636.0020.0002] # LINEAR A SIGN A618 +10714 ; [.4637.0020.0002] # LINEAR A SIGN A619 +10715 ; [.4638.0020.0002] # LINEAR A SIGN A620 +10716 ; [.4639.0020.0002] # LINEAR A SIGN A621 +10717 ; [.463A.0020.0002] # LINEAR A SIGN A622 +10718 ; [.463B.0020.0002] # LINEAR A SIGN A623 +10719 ; [.463C.0020.0002] # LINEAR A SIGN A624 +1071A ; [.463D.0020.0002] # LINEAR A SIGN A626 +1071B ; [.463E.0020.0002] # LINEAR A SIGN A627 +1071C ; [.463F.0020.0002] # LINEAR A SIGN A628 +1071D ; [.4640.0020.0002] # LINEAR A SIGN A629 +1071E ; [.4641.0020.0002] # LINEAR A SIGN A634 +1071F ; [.4642.0020.0002] # LINEAR A SIGN A637 +10720 ; [.4643.0020.0002] # LINEAR A SIGN A638 +10721 ; [.4644.0020.0002] # LINEAR A SIGN A640 +10722 ; [.4645.0020.0002] # LINEAR A SIGN A642 +10723 ; [.4646.0020.0002] # LINEAR A SIGN A643 +10724 ; [.4647.0020.0002] # LINEAR A SIGN A644 +10725 ; [.4648.0020.0002] # LINEAR A SIGN A645 +10726 ; [.4649.0020.0002] # LINEAR A SIGN A646 +10727 ; [.464A.0020.0002] # LINEAR A SIGN A648 +10728 ; [.464B.0020.0002] # LINEAR A SIGN A649 +10729 ; [.464C.0020.0002] # LINEAR A SIGN A651 +1072A ; [.464D.0020.0002] # LINEAR A SIGN A652 +1072B ; [.464E.0020.0002] # LINEAR A SIGN A653 +1072C ; [.464F.0020.0002] # LINEAR A SIGN A654 +1072D ; [.4650.0020.0002] # LINEAR A SIGN A655 +1072E ; [.4651.0020.0002] # LINEAR A SIGN A656 +1072F ; [.4652.0020.0002] # LINEAR A SIGN A657 +10730 ; [.4653.0020.0002] # LINEAR A SIGN A658 +10731 ; [.4654.0020.0002] # LINEAR A SIGN A659 +10732 ; [.4655.0020.0002] # LINEAR A SIGN A660 +10733 ; [.4656.0020.0002] # LINEAR A SIGN A661 +10734 ; [.4657.0020.0002] # LINEAR A SIGN A662 +10735 ; [.4658.0020.0002] # LINEAR A SIGN A663 +10736 ; [.4659.0020.0002] # LINEAR A SIGN A664 +10740 ; [.465A.0020.0002] # LINEAR A SIGN A701 A +10741 ; [.465B.0020.0002] # LINEAR A SIGN A702 B +10742 ; [.465C.0020.0002] # LINEAR A SIGN A703 D +10743 ; [.465D.0020.0002] # LINEAR A SIGN A704 E +10744 ; [.465E.0020.0002] # LINEAR A SIGN A705 F +10745 ; [.465F.0020.0002] # LINEAR A SIGN A706 H +10746 ; [.4660.0020.0002] # LINEAR A SIGN A707 J +10747 ; [.4661.0020.0002] # LINEAR A SIGN A708 K +10748 ; [.4662.0020.0002] # LINEAR A SIGN A709 L +10749 ; [.4663.0020.0002] # LINEAR A SIGN A709-2 L2 +1074A ; [.4664.0020.0002] # LINEAR A SIGN A709-3 L3 +1074B ; [.4665.0020.0002] # LINEAR A SIGN A709-4 L4 +1074C ; [.4666.0020.0002] # LINEAR A SIGN A709-6 L6 +1074D ; [.4667.0020.0002] # LINEAR A SIGN A710 W +1074E ; [.4668.0020.0002] # LINEAR A SIGN A711 X +1074F ; [.4669.0020.0002] # LINEAR A SIGN A712 Y +10750 ; [.466A.0020.0002] # LINEAR A SIGN A713 OMEGA +10751 ; [.466B.0020.0002] # LINEAR A SIGN A714 ABB +10752 ; [.466C.0020.0002] # LINEAR A SIGN A715 BB +10753 ; [.466D.0020.0002] # LINEAR A SIGN A717 DD +10754 ; [.466E.0020.0002] # LINEAR A SIGN A726 EYYY +10755 ; [.466F.0020.0002] # LINEAR A SIGN A732 JE +10760 ; [.4670.0020.0002] # LINEAR A SIGN A800 +10761 ; [.4671.0020.0002] # LINEAR A SIGN A801 +10762 ; [.4672.0020.0002] # LINEAR A SIGN A802 +10763 ; [.4673.0020.0002] # LINEAR A SIGN A803 +10764 ; [.4674.0020.0002] # LINEAR A SIGN A804 +10765 ; [.4675.0020.0002] # LINEAR A SIGN A805 +10766 ; [.4676.0020.0002] # LINEAR A SIGN A806 +10767 ; [.4677.0020.0002] # LINEAR A SIGN A807 +10800 ; [.4678.0020.0002] # CYPRIOT SYLLABLE A +10801 ; [.4679.0020.0002] # CYPRIOT SYLLABLE E +10802 ; [.467A.0020.0002] # CYPRIOT SYLLABLE I +10803 ; [.467B.0020.0002] # CYPRIOT SYLLABLE O +10804 ; [.467C.0020.0002] # CYPRIOT SYLLABLE U +10805 ; [.467D.0020.0002] # CYPRIOT SYLLABLE JA +10808 ; [.467E.0020.0002] # CYPRIOT SYLLABLE JO +1080A ; [.467F.0020.0002] # CYPRIOT SYLLABLE KA +1080B ; [.4680.0020.0002] # CYPRIOT SYLLABLE KE +1080C ; [.4681.0020.0002] # CYPRIOT SYLLABLE KI +1080D ; [.4682.0020.0002] # CYPRIOT SYLLABLE KO +1080E ; [.4683.0020.0002] # CYPRIOT SYLLABLE KU +1080F ; [.4684.0020.0002] # CYPRIOT SYLLABLE LA +10810 ; [.4685.0020.0002] # CYPRIOT SYLLABLE LE +10811 ; [.4686.0020.0002] # CYPRIOT SYLLABLE LI +10812 ; [.4687.0020.0002] # CYPRIOT SYLLABLE LO +10813 ; [.4688.0020.0002] # CYPRIOT SYLLABLE LU +10814 ; [.4689.0020.0002] # CYPRIOT SYLLABLE MA +10815 ; [.468A.0020.0002] # CYPRIOT SYLLABLE ME +10816 ; [.468B.0020.0002] # CYPRIOT SYLLABLE MI +10817 ; [.468C.0020.0002] # CYPRIOT SYLLABLE MO +10818 ; [.468D.0020.0002] # CYPRIOT SYLLABLE MU +10819 ; [.468E.0020.0002] # CYPRIOT SYLLABLE NA +1081A ; [.468F.0020.0002] # CYPRIOT SYLLABLE NE +1081B ; [.4690.0020.0002] # CYPRIOT SYLLABLE NI +1081C ; [.4691.0020.0002] # CYPRIOT SYLLABLE NO +1081D ; [.4692.0020.0002] # CYPRIOT SYLLABLE NU +1081E ; [.4693.0020.0002] # CYPRIOT SYLLABLE PA +1081F ; [.4694.0020.0002] # CYPRIOT SYLLABLE PE +10820 ; [.4695.0020.0002] # CYPRIOT SYLLABLE PI +10821 ; [.4696.0020.0002] # CYPRIOT SYLLABLE PO +10822 ; [.4697.0020.0002] # CYPRIOT SYLLABLE PU +10823 ; [.4698.0020.0002] # CYPRIOT SYLLABLE RA +10824 ; [.4699.0020.0002] # CYPRIOT SYLLABLE RE +10825 ; [.469A.0020.0002] # CYPRIOT SYLLABLE RI +10826 ; [.469B.0020.0002] # CYPRIOT SYLLABLE RO +10827 ; [.469C.0020.0002] # CYPRIOT SYLLABLE RU +10828 ; [.469D.0020.0002] # CYPRIOT SYLLABLE SA +10829 ; [.469E.0020.0002] # CYPRIOT SYLLABLE SE +1082A ; [.469F.0020.0002] # CYPRIOT SYLLABLE SI +1082B ; [.46A0.0020.0002] # CYPRIOT SYLLABLE SO +1082C ; [.46A1.0020.0002] # CYPRIOT SYLLABLE SU +1082D ; [.46A2.0020.0002] # CYPRIOT SYLLABLE TA +1082E ; [.46A3.0020.0002] # CYPRIOT SYLLABLE TE +1082F ; [.46A4.0020.0002] # CYPRIOT SYLLABLE TI +10830 ; [.46A5.0020.0002] # CYPRIOT SYLLABLE TO +10831 ; [.46A6.0020.0002] # CYPRIOT SYLLABLE TU +10832 ; [.46A7.0020.0002] # CYPRIOT SYLLABLE WA +10833 ; [.46A8.0020.0002] # CYPRIOT SYLLABLE WE +10834 ; [.46A9.0020.0002] # CYPRIOT SYLLABLE WI +10835 ; [.46AA.0020.0002] # CYPRIOT SYLLABLE WO +10837 ; [.46AB.0020.0002] # CYPRIOT SYLLABLE XA +10838 ; [.46AC.0020.0002] # CYPRIOT SYLLABLE XE +1083C ; [.46AD.0020.0002] # CYPRIOT SYLLABLE ZA +1083F ; [.46AE.0020.0002] # CYPRIOT SYLLABLE ZO +10A60 ; [.46AF.0020.0002] # OLD SOUTH ARABIAN LETTER HE +10A61 ; [.46B0.0020.0002] # OLD SOUTH ARABIAN LETTER LAMEDH +10A62 ; [.46B1.0020.0002] # OLD SOUTH ARABIAN LETTER HETH +10A63 ; [.46B2.0020.0002] # OLD SOUTH ARABIAN LETTER MEM +10A64 ; [.46B3.0020.0002] # OLD SOUTH ARABIAN LETTER QOPH +10A65 ; [.46B4.0020.0002] # OLD SOUTH ARABIAN LETTER WAW +10A66 ; [.46B5.0020.0002] # OLD SOUTH ARABIAN LETTER SHIN +10A67 ; [.46B6.0020.0002] # OLD SOUTH ARABIAN LETTER RESH +10A68 ; [.46B7.0020.0002] # OLD SOUTH ARABIAN LETTER BETH +10A69 ; [.46B8.0020.0002] # OLD SOUTH ARABIAN LETTER TAW +10A6A ; [.46B9.0020.0002] # OLD SOUTH ARABIAN LETTER SAT +10A6B ; [.46BA.0020.0002] # OLD SOUTH ARABIAN LETTER KAPH +10A6C ; [.46BB.0020.0002] # OLD SOUTH ARABIAN LETTER NUN +10A6D ; [.46BC.0020.0002] # OLD SOUTH ARABIAN LETTER KHETH +10A6E ; [.46BD.0020.0002] # OLD SOUTH ARABIAN LETTER SADHE +10A6F ; [.46BE.0020.0002] # OLD SOUTH ARABIAN LETTER SAMEKH +10A70 ; [.46BF.0020.0002] # OLD SOUTH ARABIAN LETTER FE +10A71 ; [.46C0.0020.0002] # OLD SOUTH ARABIAN LETTER ALEF +10A72 ; [.46C1.0020.0002] # OLD SOUTH ARABIAN LETTER AYN +10A73 ; [.46C2.0020.0002] # OLD SOUTH ARABIAN LETTER DHADHE +10A74 ; [.46C3.0020.0002] # OLD SOUTH ARABIAN LETTER GIMEL +10A75 ; [.46C4.0020.0002] # OLD SOUTH ARABIAN LETTER DALETH +10A76 ; [.46C5.0020.0002] # OLD SOUTH ARABIAN LETTER GHAYN +10A77 ; [.46C6.0020.0002] # OLD SOUTH ARABIAN LETTER TETH +10A78 ; [.46C7.0020.0002] # OLD SOUTH ARABIAN LETTER ZAYN +10A79 ; [.46C8.0020.0002] # OLD SOUTH ARABIAN LETTER DHALETH +10A7A ; [.46C9.0020.0002] # OLD SOUTH ARABIAN LETTER YODH +10A7B ; [.46CA.0020.0002] # OLD SOUTH ARABIAN LETTER THAW +10A7C ; [.46CB.0020.0002] # OLD SOUTH ARABIAN LETTER THETH +10A80 ; [.46CC.0020.0002] # OLD NORTH ARABIAN LETTER HEH +10A81 ; [.46CD.0020.0002] # OLD NORTH ARABIAN LETTER LAM +10A82 ; [.46CE.0020.0002] # OLD NORTH ARABIAN LETTER HAH +10A83 ; [.46CF.0020.0002] # OLD NORTH ARABIAN LETTER MEEM +10A84 ; [.46D0.0020.0002] # OLD NORTH ARABIAN LETTER QAF +10A85 ; [.46D1.0020.0002] # OLD NORTH ARABIAN LETTER WAW +10A86 ; [.46D2.0020.0002] # OLD NORTH ARABIAN LETTER ES-2 +10A87 ; [.46D3.0020.0002] # OLD NORTH ARABIAN LETTER REH +10A88 ; [.46D4.0020.0002] # OLD NORTH ARABIAN LETTER BEH +10A89 ; [.46D5.0020.0002] # OLD NORTH ARABIAN LETTER TEH +10A8A ; [.46D6.0020.0002] # OLD NORTH ARABIAN LETTER ES-1 +10A8B ; [.46D7.0020.0002] # OLD NORTH ARABIAN LETTER KAF +10A8C ; [.46D8.0020.0002] # OLD NORTH ARABIAN LETTER NOON +10A8D ; [.46D9.0020.0002] # OLD NORTH ARABIAN LETTER KHAH +10A8E ; [.46DA.0020.0002] # OLD NORTH ARABIAN LETTER SAD +10A8F ; [.46DB.0020.0002] # OLD NORTH ARABIAN LETTER ES-3 +10A90 ; [.46DC.0020.0002] # OLD NORTH ARABIAN LETTER FEH +10A91 ; [.46DD.0020.0002] # OLD NORTH ARABIAN LETTER ALEF +10A92 ; [.46DE.0020.0002] # OLD NORTH ARABIAN LETTER AIN +10A93 ; [.46DF.0020.0002] # OLD NORTH ARABIAN LETTER DAD +10A94 ; [.46E0.0020.0002] # OLD NORTH ARABIAN LETTER GEEM +10A95 ; [.46E1.0020.0002] # OLD NORTH ARABIAN LETTER DAL +10A96 ; [.46E2.0020.0002] # OLD NORTH ARABIAN LETTER GHAIN +10A97 ; [.46E3.0020.0002] # OLD NORTH ARABIAN LETTER TAH +10A98 ; [.46E4.0020.0002] # OLD NORTH ARABIAN LETTER ZAIN +10A99 ; [.46E5.0020.0002] # OLD NORTH ARABIAN LETTER THAL +10A9A ; [.46E6.0020.0002] # OLD NORTH ARABIAN LETTER YEH +10A9B ; [.46E7.0020.0002] # OLD NORTH ARABIAN LETTER THEH +10A9C ; [.46E8.0020.0002] # OLD NORTH ARABIAN LETTER ZAH +10B00 ; [.46E9.0020.0002] # AVESTAN LETTER A +10B01 ; [.46EA.0020.0002] # AVESTAN LETTER AA +10B02 ; [.46EB.0020.0002] # AVESTAN LETTER AO +10B03 ; [.46EC.0020.0002] # AVESTAN LETTER AAO +10B04 ; [.46ED.0020.0002] # AVESTAN LETTER AN +10B05 ; [.46EE.0020.0002] # AVESTAN LETTER AAN +10B06 ; [.46EF.0020.0002] # AVESTAN LETTER AE +10B07 ; [.46F0.0020.0002] # AVESTAN LETTER AEE +10B08 ; [.46F1.0020.0002] # AVESTAN LETTER E +10B09 ; [.46F2.0020.0002] # AVESTAN LETTER EE +10B0A ; [.46F3.0020.0002] # AVESTAN LETTER O +10B0B ; [.46F4.0020.0002] # AVESTAN LETTER OO +10B0C ; [.46F5.0020.0002] # AVESTAN LETTER I +10B0D ; [.46F6.0020.0002] # AVESTAN LETTER II +10B0E ; [.46F7.0020.0002] # AVESTAN LETTER U +10B0F ; [.46F8.0020.0002] # AVESTAN LETTER UU +10B10 ; [.46F9.0020.0002] # AVESTAN LETTER KE +10B11 ; [.46FA.0020.0002] # AVESTAN LETTER XE +10B12 ; [.46FB.0020.0002] # AVESTAN LETTER XYE +10B13 ; [.46FC.0020.0002] # AVESTAN LETTER XVE +10B14 ; [.46FD.0020.0002] # AVESTAN LETTER GE +10B15 ; [.46FE.0020.0002] # AVESTAN LETTER GGE +10B16 ; [.46FF.0020.0002] # AVESTAN LETTER GHE +10B17 ; [.4700.0020.0002] # AVESTAN LETTER CE +10B18 ; [.4701.0020.0002] # AVESTAN LETTER JE +10B19 ; [.4702.0020.0002] # AVESTAN LETTER TE +10B1A ; [.4703.0020.0002] # AVESTAN LETTER THE +10B1B ; [.4704.0020.0002] # AVESTAN LETTER DE +10B1C ; [.4705.0020.0002] # AVESTAN LETTER DHE +10B1D ; [.4706.0020.0002] # AVESTAN LETTER TTE +10B1E ; [.4707.0020.0002] # AVESTAN LETTER PE +10B1F ; [.4708.0020.0002] # AVESTAN LETTER FE +10B20 ; [.4709.0020.0002] # AVESTAN LETTER BE +10B21 ; [.470A.0020.0002] # AVESTAN LETTER BHE +10B22 ; [.470B.0020.0002] # AVESTAN LETTER NGE +10B23 ; [.470C.0020.0002] # AVESTAN LETTER NGYE +10B24 ; [.470D.0020.0002] # AVESTAN LETTER NGVE +10B25 ; [.470E.0020.0002] # AVESTAN LETTER NE +10B26 ; [.470F.0020.0002] # AVESTAN LETTER NYE +10B27 ; [.4710.0020.0002] # AVESTAN LETTER NNE +10B28 ; [.4711.0020.0002] # AVESTAN LETTER ME +10B29 ; [.4712.0020.0002] # AVESTAN LETTER HME +10B2A ; [.4713.0020.0002] # AVESTAN LETTER YYE +10B2B ; [.4714.0020.0002] # AVESTAN LETTER YE +10B2C ; [.4715.0020.0002] # AVESTAN LETTER VE +10B2D ; [.4716.0020.0002] # AVESTAN LETTER RE +10B2E ; [.4716.0020.0004][.0000.010B.0004] # AVESTAN LETTER LE +10B2F ; [.4717.0020.0002] # AVESTAN LETTER SE +10B30 ; [.4718.0020.0002] # AVESTAN LETTER ZE +10B31 ; [.4719.0020.0002] # AVESTAN LETTER SHE +10B32 ; [.471A.0020.0002] # AVESTAN LETTER ZHE +10B33 ; [.471B.0020.0002] # AVESTAN LETTER SHYE +10B34 ; [.471C.0020.0002] # AVESTAN LETTER SSHE +10B35 ; [.471D.0020.0002] # AVESTAN LETTER HE +10860 ; [.471E.0020.0002] # PALMYRENE LETTER ALEPH +10861 ; [.471F.0020.0002] # PALMYRENE LETTER BETH +10862 ; [.4720.0020.0002] # PALMYRENE LETTER GIMEL +10863 ; [.4721.0020.0002] # PALMYRENE LETTER DALETH +10864 ; [.4722.0020.0002] # PALMYRENE LETTER HE +10865 ; [.4723.0020.0002] # PALMYRENE LETTER WAW +10866 ; [.4724.0020.0002] # PALMYRENE LETTER ZAYIN +10867 ; [.4725.0020.0002] # PALMYRENE LETTER HETH +10868 ; [.4726.0020.0002] # PALMYRENE LETTER TETH +10869 ; [.4727.0020.0002] # PALMYRENE LETTER YODH +1086A ; [.4728.0020.0002] # PALMYRENE LETTER KAPH +1086B ; [.4729.0020.0002] # PALMYRENE LETTER LAMEDH +1086C ; [.472A.0020.0002] # PALMYRENE LETTER MEM +1086E ; [.472B.0020.0002] # PALMYRENE LETTER NUN +1086D ; [.472B.0020.0019] # PALMYRENE LETTER FINAL NUN +1086F ; [.472C.0020.0002] # PALMYRENE LETTER SAMEKH +10870 ; [.472D.0020.0002] # PALMYRENE LETTER AYIN +10871 ; [.472E.0020.0002] # PALMYRENE LETTER PE +10872 ; [.472F.0020.0002] # PALMYRENE LETTER SADHE +10873 ; [.4730.0020.0002] # PALMYRENE LETTER QOPH +10874 ; [.4731.0020.0002] # PALMYRENE LETTER RESH +10875 ; [.4732.0020.0002] # PALMYRENE LETTER SHIN +10876 ; [.4733.0020.0002] # PALMYRENE LETTER TAW +10881 ; [.4734.0020.0002] # NABATAEAN LETTER ALEPH +10880 ; [.4734.0020.0019] # NABATAEAN LETTER FINAL ALEPH +10883 ; [.4735.0020.0002] # NABATAEAN LETTER BETH +10882 ; [.4735.0020.0019] # NABATAEAN LETTER FINAL BETH +10884 ; [.4736.0020.0002] # NABATAEAN LETTER GIMEL +10885 ; [.4737.0020.0002] # NABATAEAN LETTER DALETH +10887 ; [.4738.0020.0002] # NABATAEAN LETTER HE +10886 ; [.4738.0020.0019] # NABATAEAN LETTER FINAL HE +10888 ; [.4739.0020.0002] # NABATAEAN LETTER WAW +10889 ; [.473A.0020.0002] # NABATAEAN LETTER ZAYIN +1088A ; [.473B.0020.0002] # NABATAEAN LETTER HETH +1088B ; [.473C.0020.0002] # NABATAEAN LETTER TETH +1088D ; [.473D.0020.0002] # NABATAEAN LETTER YODH +1088C ; [.473D.0020.0019] # NABATAEAN LETTER FINAL YODH +1088F ; [.473E.0020.0002] # NABATAEAN LETTER KAPH +1088E ; [.473E.0020.0019] # NABATAEAN LETTER FINAL KAPH +10891 ; [.473F.0020.0002] # NABATAEAN LETTER LAMEDH +10890 ; [.473F.0020.0019] # NABATAEAN LETTER FINAL LAMEDH +10893 ; [.4740.0020.0002] # NABATAEAN LETTER MEM +10892 ; [.4740.0020.0019] # NABATAEAN LETTER FINAL MEM +10895 ; [.4741.0020.0002] # NABATAEAN LETTER NUN +10894 ; [.4741.0020.0019] # NABATAEAN LETTER FINAL NUN +10896 ; [.4742.0020.0002] # NABATAEAN LETTER SAMEKH +10897 ; [.4743.0020.0002] # NABATAEAN LETTER AYIN +10898 ; [.4744.0020.0002] # NABATAEAN LETTER PE +10899 ; [.4745.0020.0002] # NABATAEAN LETTER SADHE +1089A ; [.4746.0020.0002] # NABATAEAN LETTER QOPH +1089B ; [.4747.0020.0002] # NABATAEAN LETTER RESH +1089D ; [.4748.0020.0002] # NABATAEAN LETTER SHIN +1089C ; [.4748.0020.0019] # NABATAEAN LETTER FINAL SHIN +1089E ; [.4749.0020.0002] # NABATAEAN LETTER TAW +108E0 ; [.474A.0020.0002] # HATRAN LETTER ALEPH +108E1 ; [.474B.0020.0002] # HATRAN LETTER BETH +108E2 ; [.474C.0020.0002] # HATRAN LETTER GIMEL +108E3 ; [.474D.0020.0002] # HATRAN LETTER DALETH-RESH +108E4 ; [.474E.0020.0002] # HATRAN LETTER HE +108E5 ; [.474F.0020.0002] # HATRAN LETTER WAW +108E6 ; [.4750.0020.0002] # HATRAN LETTER ZAYN +108E7 ; [.4751.0020.0002] # HATRAN LETTER HETH +108E8 ; [.4752.0020.0002] # HATRAN LETTER TETH +108E9 ; [.4753.0020.0002] # HATRAN LETTER YODH +108EA ; [.4754.0020.0002] # HATRAN LETTER KAPH +108EB ; [.4755.0020.0002] # HATRAN LETTER LAMEDH +108EC ; [.4756.0020.0002] # HATRAN LETTER MEM +108ED ; [.4757.0020.0002] # HATRAN LETTER NUN +108EE ; [.4758.0020.0002] # HATRAN LETTER SAMEKH +108EF ; [.4759.0020.0002] # HATRAN LETTER AYN +108F0 ; [.475A.0020.0002] # HATRAN LETTER PE +108F1 ; [.475B.0020.0002] # HATRAN LETTER SADHE +108F2 ; [.475C.0020.0002] # HATRAN LETTER QOPH +108F4 ; [.475D.0020.0002] # HATRAN LETTER SHIN +108F5 ; [.475E.0020.0002] # HATRAN LETTER TAW +10840 ; [.475F.0020.0002] # IMPERIAL ARAMAIC LETTER ALEPH +10841 ; [.4760.0020.0002] # IMPERIAL ARAMAIC LETTER BETH +10842 ; [.4761.0020.0002] # IMPERIAL ARAMAIC LETTER GIMEL +10843 ; [.4762.0020.0002] # IMPERIAL ARAMAIC LETTER DALETH +10844 ; [.4763.0020.0002] # IMPERIAL ARAMAIC LETTER HE +10845 ; [.4764.0020.0002] # IMPERIAL ARAMAIC LETTER WAW +10846 ; [.4765.0020.0002] # IMPERIAL ARAMAIC LETTER ZAYIN +10847 ; [.4766.0020.0002] # IMPERIAL ARAMAIC LETTER HETH +10848 ; [.4767.0020.0002] # IMPERIAL ARAMAIC LETTER TETH +10849 ; [.4768.0020.0002] # IMPERIAL ARAMAIC LETTER YODH +1084A ; [.4769.0020.0002] # IMPERIAL ARAMAIC LETTER KAPH +1084B ; [.476A.0020.0002] # IMPERIAL ARAMAIC LETTER LAMEDH +1084C ; [.476B.0020.0002] # IMPERIAL ARAMAIC LETTER MEM +1084D ; [.476C.0020.0002] # IMPERIAL ARAMAIC LETTER NUN +1084E ; [.476D.0020.0002] # IMPERIAL ARAMAIC LETTER SAMEKH +1084F ; [.476E.0020.0002] # IMPERIAL ARAMAIC LETTER AYIN +10850 ; [.476F.0020.0002] # IMPERIAL ARAMAIC LETTER PE +10851 ; [.4770.0020.0002] # IMPERIAL ARAMAIC LETTER SADHE +10852 ; [.4771.0020.0002] # IMPERIAL ARAMAIC LETTER QOPH +10853 ; [.4772.0020.0002] # IMPERIAL ARAMAIC LETTER RESH +10854 ; [.4773.0020.0002] # IMPERIAL ARAMAIC LETTER SHIN +10855 ; [.4774.0020.0002] # IMPERIAL ARAMAIC LETTER TAW +10B40 ; [.4775.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ALEPH +10B41 ; [.4776.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER BETH +10B42 ; [.4777.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER GIMEL +10B43 ; [.4778.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER DALETH +10B44 ; [.4779.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HE +10B45 ; [.477A.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER WAW +10B46 ; [.477B.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ZAYIN +10B47 ; [.477C.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HETH +10B48 ; [.477D.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TETH +10B49 ; [.477E.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER YODH +10B4A ; [.477F.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER KAPH +10B4B ; [.4780.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER LAMEDH +10B4C ; [.4781.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER MEM +10B4D ; [.4782.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER NUN +10B4E ; [.4783.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SAMEKH +10B4F ; [.4784.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER AYIN +10B50 ; [.4785.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER PE +10B51 ; [.4786.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SADHE +10B52 ; [.4787.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER QOPH +10B53 ; [.4788.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER RESH +10B54 ; [.4789.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SHIN +10B55 ; [.478A.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TAW +10B60 ; [.478B.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ALEPH +10B61 ; [.478C.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER BETH +10B62 ; [.478D.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER GIMEL +10B63 ; [.478E.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER DALETH +10B64 ; [.478F.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HE +10B65 ; [.4790.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH +10B66 ; [.4791.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ZAYIN +10B67 ; [.4792.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HETH +10B68 ; [.4793.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TETH +10B69 ; [.4794.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER YODH +10B6A ; [.4795.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER KAPH +10B6B ; [.4796.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER LAMEDH +10B6C ; [.4797.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH +10B6D ; [.4798.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER NUN +10B6E ; [.4799.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SAMEKH +10B6F ; [.479A.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER PE +10B70 ; [.479B.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SADHE +10B71 ; [.479C.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SHIN +10B72 ; [.479D.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TAW +10B80 ; [.479E.0020.0002] # PSALTER PAHLAVI LETTER ALEPH +10B81 ; [.479F.0020.0002] # PSALTER PAHLAVI LETTER BETH +10B82 ; [.47A0.0020.0002] # PSALTER PAHLAVI LETTER GIMEL +10B83 ; [.47A1.0020.0002] # PSALTER PAHLAVI LETTER DALETH +10B84 ; [.47A2.0020.0002] # PSALTER PAHLAVI LETTER HE +10B85 ; [.47A3.0020.0002] # PSALTER PAHLAVI LETTER WAW-AYIN-RESH +10B86 ; [.47A4.0020.0002] # PSALTER PAHLAVI LETTER ZAYIN +10B87 ; [.47A5.0020.0002] # PSALTER PAHLAVI LETTER HETH +10B88 ; [.47A6.0020.0002] # PSALTER PAHLAVI LETTER YODH +10B89 ; [.47A7.0020.0002] # PSALTER PAHLAVI LETTER KAPH +10B8A ; [.47A8.0020.0002] # PSALTER PAHLAVI LETTER LAMEDH +10B8B ; [.47A9.0020.0002] # PSALTER PAHLAVI LETTER MEM-QOPH +10B8C ; [.47AA.0020.0002] # PSALTER PAHLAVI LETTER NUN +10B8D ; [.47AB.0020.0002] # PSALTER PAHLAVI LETTER SAMEKH +10B8E ; [.47AC.0020.0002] # PSALTER PAHLAVI LETTER PE +10B8F ; [.47AD.0020.0002] # PSALTER PAHLAVI LETTER SADHE +10B90 ; [.47AE.0020.0002] # PSALTER PAHLAVI LETTER SHIN +10B91 ; [.47AF.0020.0002] # PSALTER PAHLAVI LETTER TAW +10AC0 ; [.47B0.0020.0002] # MANICHAEAN LETTER ALEPH +10AC1 ; [.47B1.0020.0002] # MANICHAEAN LETTER BETH +10AC2 ; [.47B2.0020.0002] # MANICHAEAN LETTER BHETH +10AC3 ; [.47B3.0020.0002] # MANICHAEAN LETTER GIMEL +10AC4 ; [.47B4.0020.0002] # MANICHAEAN LETTER GHIMEL +10AC5 ; [.47B5.0020.0002] # MANICHAEAN LETTER DALETH +10AC6 ; [.47B6.0020.0002] # MANICHAEAN LETTER HE +10AC7 ; [.47B7.0020.0002] # MANICHAEAN LETTER WAW +10AC8 ; [.47B7.0020.0004][.0000.010C.0004] # MANICHAEAN SIGN UD +10AC9 ; [.47B8.0020.0002] # MANICHAEAN LETTER ZAYIN +10ACA ; [.47B9.0020.0002] # MANICHAEAN LETTER ZHAYIN +10ACB ; [.47BA.0020.0002] # MANICHAEAN LETTER JAYIN +10ACC ; [.47BB.0020.0002] # MANICHAEAN LETTER JHAYIN +10ACD ; [.47BC.0020.0002] # MANICHAEAN LETTER HETH +10ACE ; [.47BD.0020.0002] # MANICHAEAN LETTER TETH +10ACF ; [.47BE.0020.0002] # MANICHAEAN LETTER YODH +10AD0 ; [.47BF.0020.0002] # MANICHAEAN LETTER KAPH +10AD1 ; [.47C0.0020.0002] # MANICHAEAN LETTER XAPH +10AD2 ; [.47C1.0020.0002] # MANICHAEAN LETTER KHAPH +10AD3 ; [.47C2.0020.0002] # MANICHAEAN LETTER LAMEDH +10AD4 ; [.47C3.0020.0002] # MANICHAEAN LETTER DHAMEDH +10AD5 ; [.47C4.0020.0002] # MANICHAEAN LETTER THAMEDH +10AD6 ; [.47C5.0020.0002] # MANICHAEAN LETTER MEM +10AD7 ; [.47C6.0020.0002] # MANICHAEAN LETTER NUN +10AD8 ; [.47C7.0020.0002] # MANICHAEAN LETTER SAMEKH +10AD9 ; [.47C8.0020.0002] # MANICHAEAN LETTER AYIN +10ADA ; [.47C9.0020.0002] # MANICHAEAN LETTER AAYIN +10ADB ; [.47CA.0020.0002] # MANICHAEAN LETTER PE +10ADC ; [.47CB.0020.0002] # MANICHAEAN LETTER FE +10ADD ; [.47CC.0020.0002] # MANICHAEAN LETTER SADHE +10ADE ; [.47CD.0020.0002] # MANICHAEAN LETTER QOPH +10ADF ; [.47CE.0020.0002] # MANICHAEAN LETTER XOPH +10AE0 ; [.47CF.0020.0002] # MANICHAEAN LETTER QHOPH +10AE1 ; [.47D0.0020.0002] # MANICHAEAN LETTER RESH +10AE2 ; [.47D1.0020.0002] # MANICHAEAN LETTER SHIN +10AE3 ; [.47D2.0020.0002] # MANICHAEAN LETTER SSHIN +10AE4 ; [.47D3.0020.0002] # MANICHAEAN LETTER TAW +10380 ; [.47D4.0020.0002] # UGARITIC LETTER ALPA +10381 ; [.47D5.0020.0002] # UGARITIC LETTER BETA +10382 ; [.47D6.0020.0002] # UGARITIC LETTER GAMLA +10383 ; [.47D7.0020.0002] # UGARITIC LETTER KHA +10384 ; [.47D8.0020.0002] # UGARITIC LETTER DELTA +10385 ; [.47D9.0020.0002] # UGARITIC LETTER HO +10386 ; [.47DA.0020.0002] # UGARITIC LETTER WO +10387 ; [.47DB.0020.0002] # UGARITIC LETTER ZETA +10388 ; [.47DC.0020.0002] # UGARITIC LETTER HOTA +10389 ; [.47DD.0020.0002] # UGARITIC LETTER TET +1038A ; [.47DE.0020.0002] # UGARITIC LETTER YOD +1038B ; [.47DF.0020.0002] # UGARITIC LETTER KAF +1038C ; [.47E0.0020.0002] # UGARITIC LETTER SHIN +1038D ; [.47E1.0020.0002] # UGARITIC LETTER LAMDA +1038E ; [.47E2.0020.0002] # UGARITIC LETTER MEM +1038F ; [.47E3.0020.0002] # UGARITIC LETTER DHAL +10390 ; [.47E4.0020.0002] # UGARITIC LETTER NUN +10391 ; [.47E5.0020.0002] # UGARITIC LETTER ZU +10392 ; [.47E6.0020.0002] # UGARITIC LETTER SAMKA +10393 ; [.47E7.0020.0002] # UGARITIC LETTER AIN +10394 ; [.47E8.0020.0002] # UGARITIC LETTER PU +10395 ; [.47E9.0020.0002] # UGARITIC LETTER SADE +10396 ; [.47EA.0020.0002] # UGARITIC LETTER QOPA +10397 ; [.47EB.0020.0002] # UGARITIC LETTER RASHA +10398 ; [.47EC.0020.0002] # UGARITIC LETTER THANNA +10399 ; [.47ED.0020.0002] # UGARITIC LETTER GHAIN +1039A ; [.47EE.0020.0002] # UGARITIC LETTER TO +1039B ; [.47EF.0020.0002] # UGARITIC LETTER I +1039C ; [.47F0.0020.0002] # UGARITIC LETTER U +1039D ; [.47F1.0020.0002] # UGARITIC LETTER SSU +103A0 ; [.47F2.0020.0002] # OLD PERSIAN SIGN A +103A1 ; [.47F3.0020.0002] # OLD PERSIAN SIGN I +103A2 ; [.47F4.0020.0002] # OLD PERSIAN SIGN U +103A3 ; [.47F5.0020.0002] # OLD PERSIAN SIGN KA +103A4 ; [.47F6.0020.0002] # OLD PERSIAN SIGN KU +103A5 ; [.47F7.0020.0002] # OLD PERSIAN SIGN GA +103A6 ; [.47F8.0020.0002] # OLD PERSIAN SIGN GU +103A7 ; [.47F9.0020.0002] # OLD PERSIAN SIGN XA +103A8 ; [.47FA.0020.0002] # OLD PERSIAN SIGN CA +103A9 ; [.47FB.0020.0002] # OLD PERSIAN SIGN JA +103AA ; [.47FC.0020.0002] # OLD PERSIAN SIGN JI +103AB ; [.47FD.0020.0002] # OLD PERSIAN SIGN TA +103AC ; [.47FE.0020.0002] # OLD PERSIAN SIGN TU +103AD ; [.47FF.0020.0002] # OLD PERSIAN SIGN DA +103AE ; [.4800.0020.0002] # OLD PERSIAN SIGN DI +103AF ; [.4801.0020.0002] # OLD PERSIAN SIGN DU +103B0 ; [.4802.0020.0002] # OLD PERSIAN SIGN THA +103B1 ; [.4803.0020.0002] # OLD PERSIAN SIGN PA +103B2 ; [.4804.0020.0002] # OLD PERSIAN SIGN BA +103B3 ; [.4805.0020.0002] # OLD PERSIAN SIGN FA +103B4 ; [.4806.0020.0002] # OLD PERSIAN SIGN NA +103B5 ; [.4807.0020.0002] # OLD PERSIAN SIGN NU +103B6 ; [.4808.0020.0002] # OLD PERSIAN SIGN MA +103B7 ; [.4809.0020.0002] # OLD PERSIAN SIGN MI +103B8 ; [.480A.0020.0002] # OLD PERSIAN SIGN MU +103B9 ; [.480B.0020.0002] # OLD PERSIAN SIGN YA +103BA ; [.480C.0020.0002] # OLD PERSIAN SIGN VA +103BB ; [.480D.0020.0002] # OLD PERSIAN SIGN VI +103BC ; [.480E.0020.0002] # OLD PERSIAN SIGN RA +103BD ; [.480F.0020.0002] # OLD PERSIAN SIGN RU +103BE ; [.4810.0020.0002] # OLD PERSIAN SIGN LA +103BF ; [.4811.0020.0002] # OLD PERSIAN SIGN SA +103C0 ; [.4812.0020.0002] # OLD PERSIAN SIGN ZA +103C1 ; [.4813.0020.0002] # OLD PERSIAN SIGN SHA +103C2 ; [.4814.0020.0002] # OLD PERSIAN SIGN SSA +103C3 ; [.4815.0020.0002] # OLD PERSIAN SIGN HA +103C8 ; [.4816.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA +103C9 ; [.4817.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA-2 +103CA ; [.4818.0020.0002] # OLD PERSIAN SIGN AURAMAZDAAHA +103CB ; [.4819.0020.0002] # OLD PERSIAN SIGN XSHAAYATHIYA +103CC ; [.481A.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH +103CD ; [.481B.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH-2 +103CE ; [.481C.0020.0002] # OLD PERSIAN SIGN BAGA +103CF ; [.481D.0020.0002] # OLD PERSIAN SIGN BUUMISH +12000 ; [.481E.0020.0002] # CUNEIFORM SIGN A +12001 ; [.481F.0020.0002] # CUNEIFORM SIGN A TIMES A +12002 ; [.4820.0020.0002] # CUNEIFORM SIGN A TIMES BAD +12003 ; [.4821.0020.0002] # CUNEIFORM SIGN A TIMES GAN2 TENU +12004 ; [.4822.0020.0002] # CUNEIFORM SIGN A TIMES HA +12005 ; [.4823.0020.0002] # CUNEIFORM SIGN A TIMES IGI +12006 ; [.4824.0020.0002] # CUNEIFORM SIGN A TIMES LAGAR GUNU +12007 ; [.4825.0020.0002] # CUNEIFORM SIGN A TIMES MUSH +12008 ; [.4826.0020.0002] # CUNEIFORM SIGN A TIMES SAG +12009 ; [.4827.0020.0002] # CUNEIFORM SIGN A2 +1200A ; [.4828.0020.0002] # CUNEIFORM SIGN AB +1200B ; [.4829.0020.0002] # CUNEIFORM SIGN AB TIMES ASH2 +1200C ; [.482A.0020.0002] # CUNEIFORM SIGN AB TIMES DUN3 GUNU +1200D ; [.482B.0020.0002] # CUNEIFORM SIGN AB TIMES GAL +1200E ; [.482C.0020.0002] # CUNEIFORM SIGN AB TIMES GAN2 TENU +1200F ; [.482D.0020.0002] # CUNEIFORM SIGN AB TIMES HA +12010 ; [.482E.0020.0002] # CUNEIFORM SIGN AB TIMES IGI GUNU +12011 ; [.482F.0020.0002] # CUNEIFORM SIGN AB TIMES IMIN +12012 ; [.4830.0020.0002] # CUNEIFORM SIGN AB TIMES LAGAB +12013 ; [.4831.0020.0002] # CUNEIFORM SIGN AB TIMES SHESH +12014 ; [.4832.0020.0002] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U +12015 ; [.4833.0020.0002] # CUNEIFORM SIGN AB GUNU +12016 ; [.4834.0020.0002] # CUNEIFORM SIGN AB2 +12017 ; [.4835.0020.0002] # CUNEIFORM SIGN AB2 TIMES BALAG +12018 ; [.4836.0020.0002] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU +12019 ; [.4837.0020.0002] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN +1201A ; [.4838.0020.0002] # CUNEIFORM SIGN AB2 TIMES SHA3 +1201B ; [.4839.0020.0002] # CUNEIFORM SIGN AB2 TIMES TAK4 +1201C ; [.483A.0020.0002] # CUNEIFORM SIGN AD +1201D ; [.483B.0020.0002] # CUNEIFORM SIGN AK +1201E ; [.483C.0020.0002] # CUNEIFORM SIGN AK TIMES ERIN2 +1201F ; [.483D.0020.0002] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH +12020 ; [.483E.0020.0002] # CUNEIFORM SIGN AL +12021 ; [.483F.0020.0002] # CUNEIFORM SIGN AL TIMES AL +12022 ; [.4840.0020.0002] # CUNEIFORM SIGN AL TIMES DIM2 +12023 ; [.4841.0020.0002] # CUNEIFORM SIGN AL TIMES GISH +12024 ; [.4842.0020.0002] # CUNEIFORM SIGN AL TIMES HA +12025 ; [.4843.0020.0002] # CUNEIFORM SIGN AL TIMES KAD3 +12026 ; [.4844.0020.0002] # CUNEIFORM SIGN AL TIMES KI +12027 ; [.4845.0020.0002] # CUNEIFORM SIGN AL TIMES SHE +12028 ; [.4846.0020.0002] # CUNEIFORM SIGN AL TIMES USH +12029 ; [.4847.0020.0002] # CUNEIFORM SIGN ALAN +1202A ; [.4848.0020.0002] # CUNEIFORM SIGN ALEPH +1202B ; [.4849.0020.0002] # CUNEIFORM SIGN AMAR +1202C ; [.484A.0020.0002] # CUNEIFORM SIGN AMAR TIMES SHE +1202D ; [.484B.0020.0002] # CUNEIFORM SIGN AN +1202E ; [.484C.0020.0002] # CUNEIFORM SIGN AN OVER AN +1202F ; [.484D.0020.0002] # CUNEIFORM SIGN AN THREE TIMES +12030 ; [.484E.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA +12031 ; [.484F.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA SQUARED +12032 ; [.4850.0020.0002] # CUNEIFORM SIGN ANSHE +12033 ; [.4851.0020.0002] # CUNEIFORM SIGN APIN +12034 ; [.4852.0020.0002] # CUNEIFORM SIGN ARAD +12035 ; [.4853.0020.0002] # CUNEIFORM SIGN ARAD TIMES KUR +12036 ; [.4854.0020.0002] # CUNEIFORM SIGN ARKAB +12037 ; [.4855.0020.0002] # CUNEIFORM SIGN ASAL2 +12038 ; [.4856.0020.0002] # CUNEIFORM SIGN ASH +12039 ; [.4857.0020.0002] # CUNEIFORM SIGN ASH ZIDA TENU +1203A ; [.4858.0020.0002] # CUNEIFORM SIGN ASH KABA TENU +1203B ; [.4859.0020.0002] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP +1203C ; [.485A.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH +1203D ; [.485B.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH +1203E ; [.485C.0020.0002] # CUNEIFORM SIGN ASH2 +1203F ; [.485D.0020.0002] # CUNEIFORM SIGN ASHGAB +12040 ; [.485E.0020.0002] # CUNEIFORM SIGN BA +12041 ; [.485F.0020.0002] # CUNEIFORM SIGN BAD +12042 ; [.4860.0020.0002] # CUNEIFORM SIGN BAG3 +12043 ; [.4861.0020.0002] # CUNEIFORM SIGN BAHAR2 +12044 ; [.4862.0020.0002] # CUNEIFORM SIGN BAL +12045 ; [.4863.0020.0002] # CUNEIFORM SIGN BAL OVER BAL +12046 ; [.4864.0020.0002] # CUNEIFORM SIGN BALAG +12047 ; [.4865.0020.0002] # CUNEIFORM SIGN BAR +12048 ; [.4866.0020.0002] # CUNEIFORM SIGN BARA2 +12049 ; [.4867.0020.0002] # CUNEIFORM SIGN BI +1204A ; [.4868.0020.0002] # CUNEIFORM SIGN BI TIMES A +1204B ; [.4869.0020.0002] # CUNEIFORM SIGN BI TIMES GAR +1204C ; [.486A.0020.0002] # CUNEIFORM SIGN BI TIMES IGI GUNU +1204D ; [.486B.0020.0002] # CUNEIFORM SIGN BU +1204E ; [.486C.0020.0002] # CUNEIFORM SIGN BU OVER BU AB +1204F ; [.486D.0020.0002] # CUNEIFORM SIGN BU OVER BU UN +12050 ; [.486E.0020.0002] # CUNEIFORM SIGN BU CROSSING BU +12051 ; [.486F.0020.0002] # CUNEIFORM SIGN BULUG +12052 ; [.4870.0020.0002] # CUNEIFORM SIGN BULUG OVER BULUG +12053 ; [.4871.0020.0002] # CUNEIFORM SIGN BUR +12054 ; [.4872.0020.0002] # CUNEIFORM SIGN BUR2 +12055 ; [.4873.0020.0002] # CUNEIFORM SIGN DA +12056 ; [.4874.0020.0002] # CUNEIFORM SIGN DAG +12057 ; [.4875.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH +12058 ; [.4876.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR +12059 ; [.4877.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG +1205A ; [.4878.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BI +1205B ; [.4879.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA +1205C ; [.487A.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH +1205D ; [.487B.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GI +1205E ; [.487C.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2 +1205F ; [.487D.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD +12060 ; [.487E.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES HA +12061 ; [.487F.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR +12062 ; [.4880.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU +12063 ; [.4881.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK +12064 ; [.4882.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LA +12065 ; [.4883.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU +12066 ; [.4884.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2 +12067 ; [.4885.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM +12068 ; [.4886.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES NE +12069 ; [.4887.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP +1206A ; [.4888.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES SI +1206B ; [.4889.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4 +1206C ; [.488A.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2 +1206D ; [.488B.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES USH +1206E ; [.488C.0020.0002] # CUNEIFORM SIGN DAM +1206F ; [.488D.0020.0002] # CUNEIFORM SIGN DAR +12070 ; [.488E.0020.0002] # CUNEIFORM SIGN DARA3 +12071 ; [.488F.0020.0002] # CUNEIFORM SIGN DARA4 +12072 ; [.4890.0020.0002] # CUNEIFORM SIGN DI +12073 ; [.4891.0020.0002] # CUNEIFORM SIGN DIB +12074 ; [.4892.0020.0002] # CUNEIFORM SIGN DIM +12075 ; [.4893.0020.0002] # CUNEIFORM SIGN DIM TIMES SHE +12076 ; [.4894.0020.0002] # CUNEIFORM SIGN DIM2 +12077 ; [.4895.0020.0002] # CUNEIFORM SIGN DIN +12078 ; [.4896.0020.0002] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH +12079 ; [.4897.0020.0002] # CUNEIFORM SIGN DISH +1207A ; [.4898.0020.0002] # CUNEIFORM SIGN DU +1207B ; [.4899.0020.0002] # CUNEIFORM SIGN DU OVER DU +1207C ; [.489A.0020.0002] # CUNEIFORM SIGN DU GUNU +1207D ; [.489B.0020.0002] # CUNEIFORM SIGN DU SHESHIG +1207E ; [.489C.0020.0002] # CUNEIFORM SIGN DUB +1207F ; [.489D.0020.0002] # CUNEIFORM SIGN DUB TIMES ESH2 +12080 ; [.489E.0020.0002] # CUNEIFORM SIGN DUB2 +12081 ; [.489F.0020.0002] # CUNEIFORM SIGN DUG +12082 ; [.48A0.0020.0002] # CUNEIFORM SIGN DUGUD +12083 ; [.48A1.0020.0002] # CUNEIFORM SIGN DUH +12084 ; [.48A2.0020.0002] # CUNEIFORM SIGN DUN +12085 ; [.48A3.0020.0002] # CUNEIFORM SIGN DUN3 +12086 ; [.48A4.0020.0002] # CUNEIFORM SIGN DUN3 GUNU +12087 ; [.48A5.0020.0002] # CUNEIFORM SIGN DUN3 GUNU GUNU +12088 ; [.48A6.0020.0002] # CUNEIFORM SIGN DUN4 +12089 ; [.48A7.0020.0002] # CUNEIFORM SIGN DUR2 +1208A ; [.48A8.0020.0002] # CUNEIFORM SIGN E +1208B ; [.48A9.0020.0002] # CUNEIFORM SIGN E TIMES PAP +1208C ; [.48AA.0020.0002] # CUNEIFORM SIGN E OVER E NUN OVER NUN +1208D ; [.48AB.0020.0002] # CUNEIFORM SIGN E2 +1208E ; [.48AC.0020.0002] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA +1208F ; [.48AD.0020.0002] # CUNEIFORM SIGN E2 TIMES GAR +12090 ; [.48AE.0020.0002] # CUNEIFORM SIGN E2 TIMES MI +12091 ; [.48AF.0020.0002] # CUNEIFORM SIGN E2 TIMES SAL +12092 ; [.48B0.0020.0002] # CUNEIFORM SIGN E2 TIMES SHE +12093 ; [.48B1.0020.0002] # CUNEIFORM SIGN E2 TIMES U +12094 ; [.48B2.0020.0002] # CUNEIFORM SIGN EDIN +12095 ; [.48B3.0020.0002] # CUNEIFORM SIGN EGIR +12096 ; [.48B4.0020.0002] # CUNEIFORM SIGN EL +12097 ; [.48B5.0020.0002] # CUNEIFORM SIGN EN +12098 ; [.48B6.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 +12099 ; [.48B7.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 TENU +1209A ; [.48B8.0020.0002] # CUNEIFORM SIGN EN TIMES ME +1209B ; [.48B9.0020.0002] # CUNEIFORM SIGN EN CROSSING EN +1209C ; [.48BA.0020.0002] # CUNEIFORM SIGN EN OPPOSING EN +1209D ; [.48BB.0020.0002] # CUNEIFORM SIGN EN SQUARED +1209E ; [.48BC.0020.0002] # CUNEIFORM SIGN EREN +1209F ; [.48BD.0020.0002] # CUNEIFORM SIGN ERIN2 +120A0 ; [.48BE.0020.0002] # CUNEIFORM SIGN ESH2 +120A1 ; [.48BF.0020.0002] # CUNEIFORM SIGN EZEN +120A2 ; [.48C0.0020.0002] # CUNEIFORM SIGN EZEN TIMES A +120A3 ; [.48C1.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL +120A4 ; [.48C2.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL +120A5 ; [.48C3.0020.0002] # CUNEIFORM SIGN EZEN TIMES AN +120A6 ; [.48C4.0020.0002] # CUNEIFORM SIGN EZEN TIMES BAD +120A7 ; [.48C5.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU +120A8 ; [.48C6.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU +120A9 ; [.48C7.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA +120AA ; [.48C8.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA GUNU +120AB ; [.48C9.0020.0002] # CUNEIFORM SIGN EZEN TIMES IGI GUNU +120AC ; [.48CA.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL +120AD ; [.48CB.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED +120AE ; [.48CC.0020.0002] # CUNEIFORM SIGN EZEN TIMES KU3 +120AF ; [.48CD.0020.0002] # CUNEIFORM SIGN EZEN TIMES LA +120B0 ; [.48CE.0020.0002] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL +120B1 ; [.48CF.0020.0002] # CUNEIFORM SIGN EZEN TIMES LI +120B2 ; [.48D0.0020.0002] # CUNEIFORM SIGN EZEN TIMES LU +120B3 ; [.48D1.0020.0002] # CUNEIFORM SIGN EZEN TIMES U2 +120B4 ; [.48D2.0020.0002] # CUNEIFORM SIGN EZEN TIMES UD +120B5 ; [.48D3.0020.0002] # CUNEIFORM SIGN GA +120B6 ; [.48D4.0020.0002] # CUNEIFORM SIGN GA GUNU +120B7 ; [.48D5.0020.0002] # CUNEIFORM SIGN GA2 +120B8 ; [.48D6.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA +120B9 ; [.48D7.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS HA +120BA ; [.48D8.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI +120BB ; [.48D9.0020.0002] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB +120BC ; [.48DA.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN +120BD ; [.48DB.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH +120BE ; [.48DC.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL +120BF ; [.48DD.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAD +120C0 ; [.48DE.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA +120C1 ; [.48DF.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR +120C2 ; [.48E0.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA +120C3 ; [.48E1.0020.0002] # CUNEIFORM SIGN GA2 TIMES DA +120C4 ; [.48E2.0020.0002] # CUNEIFORM SIGN GA2 TIMES DI +120C5 ; [.48E3.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE +120C6 ; [.48E4.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUB +120C7 ; [.48E5.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL +120C8 ; [.48E6.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA +120C9 ; [.48E7.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN +120CA ; [.48E8.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU +120CB ; [.48E9.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU +120CC ; [.48EA.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR +120CD ; [.48EB.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI +120CE ; [.48EC.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 +120CF ; [.48ED.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A +120D0 ; [.48EE.0020.0002] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU +120D1 ; [.48EF.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2 +120D2 ; [.48F0.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL +120D3 ; [.48F1.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA +120D4 ; [.48F2.0020.0002] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI +120D5 ; [.48F3.0020.0002] # CUNEIFORM SIGN GA2 TIMES HUB2 +120D6 ; [.48F4.0020.0002] # CUNEIFORM SIGN GA2 TIMES IGI GUNU +120D7 ; [.48F5.0020.0002] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH +120D8 ; [.48F6.0020.0002] # CUNEIFORM SIGN GA2 TIMES KAK +120D9 ; [.48F7.0020.0002] # CUNEIFORM SIGN GA2 TIMES KASKAL +120DA ; [.48F8.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID +120DB ; [.48F9.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL +120DC ; [.48FA.0020.0002] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN +120DD ; [.48FB.0020.0002] # CUNEIFORM SIGN GA2 TIMES LA +120DE ; [.48FC.0020.0002] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN +120DF ; [.48FD.0020.0002] # CUNEIFORM SIGN GA2 TIMES MI +120E0 ; [.48FE.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN +120E1 ; [.48FF.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN +120E2 ; [.4900.0020.0002] # CUNEIFORM SIGN GA2 TIMES PA +120E3 ; [.4901.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAL +120E4 ; [.4902.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAR +120E5 ; [.4903.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE +120E6 ; [.4904.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR +120E7 ; [.4905.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHID +120E8 ; [.4906.0020.0002] # CUNEIFORM SIGN GA2 TIMES SUM +120E9 ; [.4907.0020.0002] # CUNEIFORM SIGN GA2 TIMES TAK4 +120EA ; [.4908.0020.0002] # CUNEIFORM SIGN GA2 TIMES U +120EB ; [.4909.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD +120EC ; [.490A.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU +120ED ; [.490B.0020.0002] # CUNEIFORM SIGN GA2 OVER GA2 +120EE ; [.490C.0020.0002] # CUNEIFORM SIGN GABA +120EF ; [.490D.0020.0002] # CUNEIFORM SIGN GABA CROSSING GABA +120F0 ; [.490E.0020.0002] # CUNEIFORM SIGN GAD +120F1 ; [.490F.0020.0002] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR +120F2 ; [.4910.0020.0002] # CUNEIFORM SIGN GAL +120F3 ; [.4911.0020.0002] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR +120F4 ; [.4912.0020.0002] # CUNEIFORM SIGN GALAM +120F5 ; [.4913.0020.0002] # CUNEIFORM SIGN GAM +120F6 ; [.4914.0020.0002] # CUNEIFORM SIGN GAN +120F7 ; [.4915.0020.0002] # CUNEIFORM SIGN GAN2 +120F8 ; [.4916.0020.0002] # CUNEIFORM SIGN GAN2 TENU +120F9 ; [.4917.0020.0002] # CUNEIFORM SIGN GAN2 OVER GAN2 +120FA ; [.4918.0020.0002] # CUNEIFORM SIGN GAN2 CROSSING GAN2 +120FB ; [.4919.0020.0002] # CUNEIFORM SIGN GAR +120FC ; [.491A.0020.0002] # CUNEIFORM SIGN GAR3 +120FD ; [.491B.0020.0002] # CUNEIFORM SIGN GASHAN +120FE ; [.491C.0020.0002] # CUNEIFORM SIGN GESHTIN +120FF ; [.491D.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES KUR +12100 ; [.491E.0020.0002] # CUNEIFORM SIGN GI +12101 ; [.491F.0020.0002] # CUNEIFORM SIGN GI TIMES E +12102 ; [.4920.0020.0002] # CUNEIFORM SIGN GI TIMES U +12103 ; [.4921.0020.0002] # CUNEIFORM SIGN GI CROSSING GI +12104 ; [.4922.0020.0002] # CUNEIFORM SIGN GI4 +12105 ; [.4923.0020.0002] # CUNEIFORM SIGN GI4 OVER GI4 +12106 ; [.4924.0020.0002] # CUNEIFORM SIGN GI4 CROSSING GI4 +12107 ; [.4925.0020.0002] # CUNEIFORM SIGN GIDIM +12108 ; [.4926.0020.0002] # CUNEIFORM SIGN GIR2 +12109 ; [.4927.0020.0002] # CUNEIFORM SIGN GIR2 GUNU +1210A ; [.4928.0020.0002] # CUNEIFORM SIGN GIR3 +1210B ; [.4929.0020.0002] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI +1210C ; [.492A.0020.0002] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU +1210D ; [.492B.0020.0002] # CUNEIFORM SIGN GIR3 TIMES IGI +1210E ; [.492C.0020.0002] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI +1210F ; [.492D.0020.0002] # CUNEIFORM SIGN GIR3 TIMES PA +12110 ; [.492E.0020.0002] # CUNEIFORM SIGN GISAL +12111 ; [.492F.0020.0002] # CUNEIFORM SIGN GISH +12112 ; [.4930.0020.0002] # CUNEIFORM SIGN GISH CROSSING GISH +12113 ; [.4931.0020.0002] # CUNEIFORM SIGN GISH TIMES BAD +12114 ; [.4932.0020.0002] # CUNEIFORM SIGN GISH TIMES TAK4 +12115 ; [.4933.0020.0002] # CUNEIFORM SIGN GISH TENU +12116 ; [.4934.0020.0002] # CUNEIFORM SIGN GU +12117 ; [.4935.0020.0002] # CUNEIFORM SIGN GU CROSSING GU +12118 ; [.4936.0020.0002] # CUNEIFORM SIGN GU2 +12119 ; [.4937.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK +1211A ; [.4938.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU +1211B ; [.4939.0020.0002] # CUNEIFORM SIGN GU2 TIMES NUN +1211C ; [.493A.0020.0002] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2 +1211D ; [.493B.0020.0002] # CUNEIFORM SIGN GU2 GUNU +1211E ; [.493C.0020.0002] # CUNEIFORM SIGN GUD +1211F ; [.493D.0020.0002] # CUNEIFORM SIGN GUD TIMES A PLUS KUR +12120 ; [.493E.0020.0002] # CUNEIFORM SIGN GUD TIMES KUR +12121 ; [.493F.0020.0002] # CUNEIFORM SIGN GUD OVER GUD LUGAL +12122 ; [.4940.0020.0002] # CUNEIFORM SIGN GUL +12123 ; [.4941.0020.0002] # CUNEIFORM SIGN GUM +12124 ; [.4942.0020.0002] # CUNEIFORM SIGN GUM TIMES SHE +12125 ; [.4943.0020.0002] # CUNEIFORM SIGN GUR +12126 ; [.4944.0020.0002] # CUNEIFORM SIGN GUR7 +12127 ; [.4945.0020.0002] # CUNEIFORM SIGN GURUN +12128 ; [.4946.0020.0002] # CUNEIFORM SIGN GURUSH +12129 ; [.4947.0020.0002] # CUNEIFORM SIGN HA +1212A ; [.4948.0020.0002] # CUNEIFORM SIGN HA TENU +1212B ; [.4949.0020.0002] # CUNEIFORM SIGN HA GUNU +1212C ; [.494A.0020.0002] # CUNEIFORM SIGN HAL +1212D ; [.494B.0020.0002] # CUNEIFORM SIGN HI +1212E ; [.494C.0020.0002] # CUNEIFORM SIGN HI TIMES ASH +1212F ; [.494D.0020.0002] # CUNEIFORM SIGN HI TIMES ASH2 +12130 ; [.494E.0020.0002] # CUNEIFORM SIGN HI TIMES BAD +12131 ; [.494F.0020.0002] # CUNEIFORM SIGN HI TIMES DISH +12132 ; [.4950.0020.0002] # CUNEIFORM SIGN HI TIMES GAD +12133 ; [.4951.0020.0002] # CUNEIFORM SIGN HI TIMES KIN +12134 ; [.4952.0020.0002] # CUNEIFORM SIGN HI TIMES NUN +12135 ; [.4953.0020.0002] # CUNEIFORM SIGN HI TIMES SHE +12136 ; [.4954.0020.0002] # CUNEIFORM SIGN HI TIMES U +12137 ; [.4955.0020.0002] # CUNEIFORM SIGN HU +12138 ; [.4956.0020.0002] # CUNEIFORM SIGN HUB2 +12139 ; [.4957.0020.0002] # CUNEIFORM SIGN HUB2 TIMES AN +1213A ; [.4958.0020.0002] # CUNEIFORM SIGN HUB2 TIMES HAL +1213B ; [.4959.0020.0002] # CUNEIFORM SIGN HUB2 TIMES KASKAL +1213C ; [.495A.0020.0002] # CUNEIFORM SIGN HUB2 TIMES LISH +1213D ; [.495B.0020.0002] # CUNEIFORM SIGN HUB2 TIMES UD +1213E ; [.495C.0020.0002] # CUNEIFORM SIGN HUL2 +1213F ; [.495D.0020.0002] # CUNEIFORM SIGN I +12140 ; [.495E.0020.0002] # CUNEIFORM SIGN I A +12141 ; [.495F.0020.0002] # CUNEIFORM SIGN IB +12142 ; [.4960.0020.0002] # CUNEIFORM SIGN IDIM +12143 ; [.4961.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM BUR +12144 ; [.4962.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED +12145 ; [.4963.0020.0002] # CUNEIFORM SIGN IG +12146 ; [.4964.0020.0002] # CUNEIFORM SIGN IGI +12147 ; [.4965.0020.0002] # CUNEIFORM SIGN IGI DIB +12148 ; [.4966.0020.0002] # CUNEIFORM SIGN IGI RI +12149 ; [.4967.0020.0002] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD +1214A ; [.4968.0020.0002] # CUNEIFORM SIGN IGI GUNU +1214B ; [.4969.0020.0002] # CUNEIFORM SIGN IL +1214C ; [.496A.0020.0002] # CUNEIFORM SIGN IL TIMES GAN2 TENU +1214D ; [.496B.0020.0002] # CUNEIFORM SIGN IL2 +1214E ; [.496C.0020.0002] # CUNEIFORM SIGN IM +1214F ; [.496D.0020.0002] # CUNEIFORM SIGN IM TIMES TAK4 +12150 ; [.496E.0020.0002] # CUNEIFORM SIGN IM CROSSING IM +12151 ; [.496F.0020.0002] # CUNEIFORM SIGN IM OPPOSING IM +12152 ; [.4970.0020.0002] # CUNEIFORM SIGN IM SQUARED +12153 ; [.4971.0020.0002] # CUNEIFORM SIGN IMIN +12154 ; [.4972.0020.0002] # CUNEIFORM SIGN IN +12155 ; [.4973.0020.0002] # CUNEIFORM SIGN IR +12156 ; [.4974.0020.0002] # CUNEIFORM SIGN ISH +12157 ; [.4975.0020.0002] # CUNEIFORM SIGN KA +12158 ; [.4976.0020.0002] # CUNEIFORM SIGN KA TIMES A +12159 ; [.4977.0020.0002] # CUNEIFORM SIGN KA TIMES AD +1215A ; [.4978.0020.0002] # CUNEIFORM SIGN KA TIMES AD PLUS KU3 +1215B ; [.4979.0020.0002] # CUNEIFORM SIGN KA TIMES ASH2 +1215C ; [.497A.0020.0002] # CUNEIFORM SIGN KA TIMES BAD +1215D ; [.497B.0020.0002] # CUNEIFORM SIGN KA TIMES BALAG +1215E ; [.497C.0020.0002] # CUNEIFORM SIGN KA TIMES BAR +1215F ; [.497D.0020.0002] # CUNEIFORM SIGN KA TIMES BI +12160 ; [.497E.0020.0002] # CUNEIFORM SIGN KA TIMES ERIN2 +12161 ; [.497F.0020.0002] # CUNEIFORM SIGN KA TIMES ESH2 +12162 ; [.4980.0020.0002] # CUNEIFORM SIGN KA TIMES GA +12163 ; [.4981.0020.0002] # CUNEIFORM SIGN KA TIMES GAL +12164 ; [.4982.0020.0002] # CUNEIFORM SIGN KA TIMES GAN2 TENU +12165 ; [.4983.0020.0002] # CUNEIFORM SIGN KA TIMES GAR +12166 ; [.4984.0020.0002] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A +12167 ; [.4985.0020.0002] # CUNEIFORM SIGN KA TIMES GI +12168 ; [.4986.0020.0002] # CUNEIFORM SIGN KA TIMES GIR2 +12169 ; [.4987.0020.0002] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR +1216A ; [.4988.0020.0002] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH +1216B ; [.4989.0020.0002] # CUNEIFORM SIGN KA TIMES GU +1216C ; [.498A.0020.0002] # CUNEIFORM SIGN KA TIMES GUR7 +1216D ; [.498B.0020.0002] # CUNEIFORM SIGN KA TIMES IGI +1216E ; [.498C.0020.0002] # CUNEIFORM SIGN KA TIMES IM +1216F ; [.498D.0020.0002] # CUNEIFORM SIGN KA TIMES KAK +12170 ; [.498E.0020.0002] # CUNEIFORM SIGN KA TIMES KI +12171 ; [.498F.0020.0002] # CUNEIFORM SIGN KA TIMES KID +12172 ; [.4990.0020.0002] # CUNEIFORM SIGN KA TIMES LI +12173 ; [.4991.0020.0002] # CUNEIFORM SIGN KA TIMES LU +12174 ; [.4992.0020.0002] # CUNEIFORM SIGN KA TIMES ME +12175 ; [.4993.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS DU +12176 ; [.4994.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS GI +12177 ; [.4995.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS TE +12178 ; [.4996.0020.0002] # CUNEIFORM SIGN KA TIMES MI +12179 ; [.4997.0020.0002] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ +1217A ; [.4998.0020.0002] # CUNEIFORM SIGN KA TIMES NE +1217B ; [.4999.0020.0002] # CUNEIFORM SIGN KA TIMES NUN +1217C ; [.499A.0020.0002] # CUNEIFORM SIGN KA TIMES PI +1217D ; [.499B.0020.0002] # CUNEIFORM SIGN KA TIMES RU +1217E ; [.499C.0020.0002] # CUNEIFORM SIGN KA TIMES SA +1217F ; [.499D.0020.0002] # CUNEIFORM SIGN KA TIMES SAR +12180 ; [.499E.0020.0002] # CUNEIFORM SIGN KA TIMES SHA +12181 ; [.499F.0020.0002] # CUNEIFORM SIGN KA TIMES SHE +12182 ; [.49A0.0020.0002] # CUNEIFORM SIGN KA TIMES SHID +12183 ; [.49A1.0020.0002] # CUNEIFORM SIGN KA TIMES SHU +12184 ; [.49A2.0020.0002] # CUNEIFORM SIGN KA TIMES SIG +12185 ; [.49A3.0020.0002] # CUNEIFORM SIGN KA TIMES SUHUR +12186 ; [.49A4.0020.0002] # CUNEIFORM SIGN KA TIMES TAR +12187 ; [.49A5.0020.0002] # CUNEIFORM SIGN KA TIMES U +12188 ; [.49A6.0020.0002] # CUNEIFORM SIGN KA TIMES U2 +12189 ; [.49A7.0020.0002] # CUNEIFORM SIGN KA TIMES UD +1218A ; [.49A8.0020.0002] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA +1218B ; [.49A9.0020.0002] # CUNEIFORM SIGN KA TIMES USH +1218C ; [.49AA.0020.0002] # CUNEIFORM SIGN KA TIMES ZI +1218D ; [.49AB.0020.0002] # CUNEIFORM SIGN KA2 +1218E ; [.49AC.0020.0002] # CUNEIFORM SIGN KA2 CROSSING KA2 +1218F ; [.49AD.0020.0002] # CUNEIFORM SIGN KAB +12190 ; [.49AE.0020.0002] # CUNEIFORM SIGN KAD2 +12191 ; [.49AF.0020.0002] # CUNEIFORM SIGN KAD3 +12192 ; [.49B0.0020.0002] # CUNEIFORM SIGN KAD4 +12193 ; [.49B1.0020.0002] # CUNEIFORM SIGN KAD5 +12194 ; [.49B2.0020.0002] # CUNEIFORM SIGN KAD5 OVER KAD5 +12195 ; [.49B3.0020.0002] # CUNEIFORM SIGN KAK +12196 ; [.49B4.0020.0002] # CUNEIFORM SIGN KAK TIMES IGI GUNU +12197 ; [.49B5.0020.0002] # CUNEIFORM SIGN KAL +12198 ; [.49B6.0020.0002] # CUNEIFORM SIGN KAL TIMES BAD +12199 ; [.49B7.0020.0002] # CUNEIFORM SIGN KAL CROSSING KAL +1219A ; [.49B8.0020.0002] # CUNEIFORM SIGN KAM2 +1219B ; [.49B9.0020.0002] # CUNEIFORM SIGN KAM4 +1219C ; [.49BA.0020.0002] # CUNEIFORM SIGN KASKAL +1219D ; [.49BB.0020.0002] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U +1219E ; [.49BC.0020.0002] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U +1219F ; [.49BD.0020.0002] # CUNEIFORM SIGN KESH2 +121A0 ; [.49BE.0020.0002] # CUNEIFORM SIGN KI +121A1 ; [.49BF.0020.0002] # CUNEIFORM SIGN KI TIMES BAD +121A2 ; [.49C0.0020.0002] # CUNEIFORM SIGN KI TIMES U +121A3 ; [.49C1.0020.0002] # CUNEIFORM SIGN KI TIMES UD +121A4 ; [.49C2.0020.0002] # CUNEIFORM SIGN KID +121A5 ; [.49C3.0020.0002] # CUNEIFORM SIGN KIN +121A6 ; [.49C4.0020.0002] # CUNEIFORM SIGN KISAL +121A7 ; [.49C5.0020.0002] # CUNEIFORM SIGN KISH +121A8 ; [.49C6.0020.0002] # CUNEIFORM SIGN KISIM5 +121A9 ; [.49C7.0020.0002] # CUNEIFORM SIGN KISIM5 OVER KISIM5 +121AA ; [.49C8.0020.0002] # CUNEIFORM SIGN KU +121AB ; [.49C9.0020.0002] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2 +121AC ; [.49CA.0020.0002] # CUNEIFORM SIGN KU3 +121AD ; [.49CB.0020.0002] # CUNEIFORM SIGN KU4 +121AE ; [.49CC.0020.0002] # CUNEIFORM SIGN KU4 VARIANT FORM +121AF ; [.49CD.0020.0002] # CUNEIFORM SIGN KU7 +121B0 ; [.49CE.0020.0002] # CUNEIFORM SIGN KUL +121B1 ; [.49CF.0020.0002] # CUNEIFORM SIGN KUL GUNU +121B2 ; [.49D0.0020.0002] # CUNEIFORM SIGN KUN +121B3 ; [.49D1.0020.0002] # CUNEIFORM SIGN KUR +121B4 ; [.49D2.0020.0002] # CUNEIFORM SIGN KUR OPPOSING KUR +121B5 ; [.49D3.0020.0002] # CUNEIFORM SIGN KUSHU2 +121B6 ; [.49D4.0020.0002] # CUNEIFORM SIGN KWU318 +121B7 ; [.49D5.0020.0002] # CUNEIFORM SIGN LA +121B8 ; [.49D6.0020.0002] # CUNEIFORM SIGN LAGAB +121B9 ; [.49D7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A +121BA ; [.49D8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA +121BB ; [.49D9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR +121BC ; [.49DA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL +121BD ; [.49DB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AL +121BE ; [.49DC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AN +121BF ; [.49DD.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU +121C0 ; [.49DE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BAD +121C1 ; [.49DF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BI +121C2 ; [.49E0.0020.0002] # CUNEIFORM SIGN LAGAB TIMES DAR +121C3 ; [.49E1.0020.0002] # CUNEIFORM SIGN LAGAB TIMES EN +121C4 ; [.49E2.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GA +121C5 ; [.49E3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GAR +121C6 ; [.49E4.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD +121C7 ; [.49E5.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD +121C8 ; [.49E6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HA +121C9 ; [.49E7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HAL +121CA ; [.49E8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN +121CB ; [.49E9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU +121CC ; [.49EA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM +121CD ; [.49EB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA +121CE ; [.49EC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU +121CF ; [.49ED.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KI +121D0 ; [.49EE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KIN +121D1 ; [.49EF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KU3 +121D2 ; [.49F0.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL +121D3 ; [.49F1.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A +121D4 ; [.49F2.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LAGAB +121D5 ; [.49F3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LISH +121D6 ; [.49F4.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LU +121D7 ; [.49F5.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LUL +121D8 ; [.49F6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME +121D9 ; [.49F7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN +121DA ; [.49F8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES MUSH +121DB ; [.49F9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES NE +121DC ; [.49FA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM +121DD ; [.49FB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2 +121DE ; [.49FC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU +121DF ; [.49FD.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 +121E0 ; [.49FE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2 +121E1 ; [.49FF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SUM +121E2 ; [.4A00.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAG +121E3 ; [.4A01.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAK4 +121E4 ; [.4A02.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA +121E5 ; [.4A03.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U +121E6 ; [.4A04.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS A +121E7 ; [.4A05.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U +121E8 ; [.4A06.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH +121E9 ; [.4A07.0020.0002] # CUNEIFORM SIGN LAGAB TIMES UD +121EA ; [.4A08.0020.0002] # CUNEIFORM SIGN LAGAB TIMES USH +121EB ; [.4A09.0020.0002] # CUNEIFORM SIGN LAGAB SQUARED +121EC ; [.4A0A.0020.0002] # CUNEIFORM SIGN LAGAR +121ED ; [.4A0B.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE +121EE ; [.4A0C.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM +121EF ; [.4A0D.0020.0002] # CUNEIFORM SIGN LAGAR GUNU +121F0 ; [.4A0E.0020.0002] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE +121F1 ; [.4A0F.0020.0002] # CUNEIFORM SIGN LAHSHU +121F2 ; [.4A10.0020.0002] # CUNEIFORM SIGN LAL +121F3 ; [.4A11.0020.0002] # CUNEIFORM SIGN LAL TIMES LAL +121F4 ; [.4A12.0020.0002] # CUNEIFORM SIGN LAM +121F5 ; [.4A13.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR +121F6 ; [.4A14.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU +121F7 ; [.4A15.0020.0002] # CUNEIFORM SIGN LI +121F8 ; [.4A16.0020.0002] # CUNEIFORM SIGN LIL +121F9 ; [.4A17.0020.0002] # CUNEIFORM SIGN LIMMU2 +121FA ; [.4A18.0020.0002] # CUNEIFORM SIGN LISH +121FB ; [.4A19.0020.0002] # CUNEIFORM SIGN LU +121FC ; [.4A1A.0020.0002] # CUNEIFORM SIGN LU TIMES BAD +121FD ; [.4A1B.0020.0002] # CUNEIFORM SIGN LU2 +121FE ; [.4A1C.0020.0002] # CUNEIFORM SIGN LU2 TIMES AL +121FF ; [.4A1D.0020.0002] # CUNEIFORM SIGN LU2 TIMES BAD +12200 ; [.4A1E.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 +12201 ; [.4A1F.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU +12202 ; [.4A20.0020.0002] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU +12203 ; [.4A21.0020.0002] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD +12204 ; [.4A22.0020.0002] # CUNEIFORM SIGN LU2 TIMES IM +12205 ; [.4A23.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD2 +12206 ; [.4A24.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 +12207 ; [.4A25.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH +12208 ; [.4A26.0020.0002] # CUNEIFORM SIGN LU2 TIMES KI +12209 ; [.4A27.0020.0002] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH +1220A ; [.4A28.0020.0002] # CUNEIFORM SIGN LU2 TIMES LAGAB +1220B ; [.4A29.0020.0002] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN +1220C ; [.4A2A.0020.0002] # CUNEIFORM SIGN LU2 TIMES NE +1220D ; [.4A2B.0020.0002] # CUNEIFORM SIGN LU2 TIMES NU +1220E ; [.4A2C.0020.0002] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH +1220F ; [.4A2D.0020.0002] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU +12210 ; [.4A2E.0020.0002] # CUNEIFORM SIGN LU2 TIMES TUG2 +12211 ; [.4A2F.0020.0002] # CUNEIFORM SIGN LU2 TENU +12212 ; [.4A30.0020.0002] # CUNEIFORM SIGN LU2 CROSSING LU2 +12213 ; [.4A31.0020.0002] # CUNEIFORM SIGN LU2 OPPOSING LU2 +12214 ; [.4A32.0020.0002] # CUNEIFORM SIGN LU2 SQUARED +12215 ; [.4A33.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG +12216 ; [.4A34.0020.0002] # CUNEIFORM SIGN LU3 +12217 ; [.4A35.0020.0002] # CUNEIFORM SIGN LUGAL +12218 ; [.4A36.0020.0002] # CUNEIFORM SIGN LUGAL OVER LUGAL +12219 ; [.4A37.0020.0002] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL +1221A ; [.4A38.0020.0002] # CUNEIFORM SIGN LUGAL SHESHIG +1221B ; [.4A39.0020.0002] # CUNEIFORM SIGN LUH +1221C ; [.4A3A.0020.0002] # CUNEIFORM SIGN LUL +1221D ; [.4A3B.0020.0002] # CUNEIFORM SIGN LUM +1221E ; [.4A3C.0020.0002] # CUNEIFORM SIGN LUM OVER LUM +1221F ; [.4A3D.0020.0002] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR +12220 ; [.4A3E.0020.0002] # CUNEIFORM SIGN MA +12221 ; [.4A3F.0020.0002] # CUNEIFORM SIGN MA TIMES TAK4 +12222 ; [.4A40.0020.0002] # CUNEIFORM SIGN MA GUNU +12223 ; [.4A41.0020.0002] # CUNEIFORM SIGN MA2 +12224 ; [.4A42.0020.0002] # CUNEIFORM SIGN MAH +12225 ; [.4A43.0020.0002] # CUNEIFORM SIGN MAR +12226 ; [.4A44.0020.0002] # CUNEIFORM SIGN MASH +12227 ; [.4A45.0020.0002] # CUNEIFORM SIGN MASH2 +12228 ; [.4A46.0020.0002] # CUNEIFORM SIGN ME +12229 ; [.4A47.0020.0002] # CUNEIFORM SIGN MES +1222A ; [.4A48.0020.0002] # CUNEIFORM SIGN MI +1222B ; [.4A49.0020.0002] # CUNEIFORM SIGN MIN +1222C ; [.4A4A.0020.0002] # CUNEIFORM SIGN MU +1222D ; [.4A4B.0020.0002] # CUNEIFORM SIGN MU OVER MU +1222E ; [.4A4C.0020.0002] # CUNEIFORM SIGN MUG +1222F ; [.4A4D.0020.0002] # CUNEIFORM SIGN MUG GUNU +12230 ; [.4A4E.0020.0002] # CUNEIFORM SIGN MUNSUB +12231 ; [.4A4F.0020.0002] # CUNEIFORM SIGN MURGU2 +12232 ; [.4A50.0020.0002] # CUNEIFORM SIGN MUSH +12233 ; [.4A51.0020.0002] # CUNEIFORM SIGN MUSH TIMES A +12234 ; [.4A52.0020.0002] # CUNEIFORM SIGN MUSH TIMES KUR +12235 ; [.4A53.0020.0002] # CUNEIFORM SIGN MUSH TIMES ZA +12236 ; [.4A54.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH +12237 ; [.4A55.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA +12238 ; [.4A56.0020.0002] # CUNEIFORM SIGN MUSH CROSSING MUSH +12239 ; [.4A57.0020.0002] # CUNEIFORM SIGN MUSH3 +1223A ; [.4A58.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A +1223B ; [.4A59.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI +1223C ; [.4A5A.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES DI +1223D ; [.4A5B.0020.0002] # CUNEIFORM SIGN MUSH3 GUNU +1223E ; [.4A5C.0020.0002] # CUNEIFORM SIGN NA +1223F ; [.4A5D.0020.0002] # CUNEIFORM SIGN NA2 +12240 ; [.4A5E.0020.0002] # CUNEIFORM SIGN NAGA +12241 ; [.4A5F.0020.0002] # CUNEIFORM SIGN NAGA INVERTED +12242 ; [.4A60.0020.0002] # CUNEIFORM SIGN NAGA TIMES SHU TENU +12243 ; [.4A61.0020.0002] # CUNEIFORM SIGN NAGA OPPOSING NAGA +12244 ; [.4A62.0020.0002] # CUNEIFORM SIGN NAGAR +12245 ; [.4A63.0020.0002] # CUNEIFORM SIGN NAM NUTILLU +12246 ; [.4A64.0020.0002] # CUNEIFORM SIGN NAM +12247 ; [.4A65.0020.0002] # CUNEIFORM SIGN NAM2 +12248 ; [.4A66.0020.0002] # CUNEIFORM SIGN NE +12249 ; [.4A67.0020.0002] # CUNEIFORM SIGN NE TIMES A +1224A ; [.4A68.0020.0002] # CUNEIFORM SIGN NE TIMES UD +1224B ; [.4A69.0020.0002] # CUNEIFORM SIGN NE SHESHIG +1224C ; [.4A6A.0020.0002] # CUNEIFORM SIGN NI +1224D ; [.4A6B.0020.0002] # CUNEIFORM SIGN NI TIMES E +1224E ; [.4A6C.0020.0002] # CUNEIFORM SIGN NI2 +1224F ; [.4A6D.0020.0002] # CUNEIFORM SIGN NIM +12250 ; [.4A6E.0020.0002] # CUNEIFORM SIGN NIM TIMES GAN2 TENU +12251 ; [.4A6F.0020.0002] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU +12252 ; [.4A70.0020.0002] # CUNEIFORM SIGN NINDA2 +12253 ; [.4A71.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES AN +12254 ; [.4A72.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH +12255 ; [.4A73.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH +12256 ; [.4A74.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUD +12257 ; [.4A75.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU +12258 ; [.4A76.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NE +12259 ; [.4A77.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NUN +1225A ; [.4A78.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE +1225B ; [.4A79.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN +1225C ; [.4A7A.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH +1225D ; [.4A7B.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH +1225E ; [.4A7C.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH +1225F ; [.4A7D.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES USH +12260 ; [.4A7E.0020.0002] # CUNEIFORM SIGN NISAG +12261 ; [.4A7F.0020.0002] # CUNEIFORM SIGN NU +12262 ; [.4A80.0020.0002] # CUNEIFORM SIGN NU11 +122D4 ; [.4A81.0020.0002] # CUNEIFORM SIGN SHIR TENU +122D5 ; [.4A82.0020.0002] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR +12263 ; [.4A83.0020.0002] # CUNEIFORM SIGN NUN +12264 ; [.4A84.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES GAR +12265 ; [.4A85.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES MASH +12266 ; [.4A86.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL +12267 ; [.4A87.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL +12268 ; [.4A88.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES USH +12269 ; [.4A89.0020.0002] # CUNEIFORM SIGN NUN TENU +1226A ; [.4A8A.0020.0002] # CUNEIFORM SIGN NUN OVER NUN +1226B ; [.4A8B.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN +1226C ; [.4A8C.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR +1226D ; [.4A8D.0020.0002] # CUNEIFORM SIGN NUNUZ +1226E ; [.4A8E.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB +1226F ; [.4A8F.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI +12270 ; [.4A90.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG +12271 ; [.4A91.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD +12272 ; [.4A92.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU +12273 ; [.4A93.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3 +12274 ; [.4A94.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA +12275 ; [.4A95.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE +12276 ; [.4A96.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3 +12277 ; [.4A97.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2 +12278 ; [.4A98.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI +12279 ; [.4A99.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U +1227A ; [.4A9A.0020.0002] # CUNEIFORM SIGN PA +1227B ; [.4A9B.0020.0002] # CUNEIFORM SIGN PAD +1227C ; [.4A9C.0020.0002] # CUNEIFORM SIGN PAN +1227D ; [.4A9D.0020.0002] # CUNEIFORM SIGN PAP +1227E ; [.4A9E.0020.0002] # CUNEIFORM SIGN PESH2 +1227F ; [.4A9F.0020.0002] # CUNEIFORM SIGN PI +12280 ; [.4AA0.0020.0002] # CUNEIFORM SIGN PI TIMES A +12281 ; [.4AA1.0020.0002] # CUNEIFORM SIGN PI TIMES AB +12282 ; [.4AA2.0020.0002] # CUNEIFORM SIGN PI TIMES BI +12283 ; [.4AA3.0020.0002] # CUNEIFORM SIGN PI TIMES BU +12284 ; [.4AA4.0020.0002] # CUNEIFORM SIGN PI TIMES E +12285 ; [.4AA5.0020.0002] # CUNEIFORM SIGN PI TIMES I +12286 ; [.4AA6.0020.0002] # CUNEIFORM SIGN PI TIMES IB +12287 ; [.4AA7.0020.0002] # CUNEIFORM SIGN PI TIMES U +12288 ; [.4AA8.0020.0002] # CUNEIFORM SIGN PI TIMES U2 +12289 ; [.4AA9.0020.0002] # CUNEIFORM SIGN PI CROSSING PI +1228A ; [.4AAA.0020.0002] # CUNEIFORM SIGN PIRIG +1228B ; [.4AAB.0020.0002] # CUNEIFORM SIGN PIRIG TIMES KAL +1228C ; [.4AAC.0020.0002] # CUNEIFORM SIGN PIRIG TIMES UD +1228D ; [.4AAD.0020.0002] # CUNEIFORM SIGN PIRIG TIMES ZA +1228E ; [.4AAE.0020.0002] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG +1228F ; [.4AAF.0020.0002] # CUNEIFORM SIGN RA +12290 ; [.4AB0.0020.0002] # CUNEIFORM SIGN RAB +12291 ; [.4AB1.0020.0002] # CUNEIFORM SIGN RI +12292 ; [.4AB2.0020.0002] # CUNEIFORM SIGN RU +12293 ; [.4AB3.0020.0002] # CUNEIFORM SIGN SA +12294 ; [.4AB4.0020.0002] # CUNEIFORM SIGN SAG NUTILLU +12295 ; [.4AB5.0020.0002] # CUNEIFORM SIGN SAG +12296 ; [.4AB6.0020.0002] # CUNEIFORM SIGN SAG TIMES A +12297 ; [.4AB7.0020.0002] # CUNEIFORM SIGN SAG TIMES DU +12298 ; [.4AB8.0020.0002] # CUNEIFORM SIGN SAG TIMES DUB +12299 ; [.4AB9.0020.0002] # CUNEIFORM SIGN SAG TIMES HA +1229A ; [.4ABA.0020.0002] # CUNEIFORM SIGN SAG TIMES KAK +1229B ; [.4ABB.0020.0002] # CUNEIFORM SIGN SAG TIMES KUR +1229C ; [.4ABC.0020.0002] # CUNEIFORM SIGN SAG TIMES LUM +1229D ; [.4ABD.0020.0002] # CUNEIFORM SIGN SAG TIMES MI +1229E ; [.4ABE.0020.0002] # CUNEIFORM SIGN SAG TIMES NUN +1229F ; [.4ABF.0020.0002] # CUNEIFORM SIGN SAG TIMES SAL +122A0 ; [.4AC0.0020.0002] # CUNEIFORM SIGN SAG TIMES SHID +122A1 ; [.4AC1.0020.0002] # CUNEIFORM SIGN SAG TIMES TAB +122A2 ; [.4AC2.0020.0002] # CUNEIFORM SIGN SAG TIMES U2 +122A3 ; [.4AC3.0020.0002] # CUNEIFORM SIGN SAG TIMES UB +122A4 ; [.4AC4.0020.0002] # CUNEIFORM SIGN SAG TIMES UM +122A5 ; [.4AC5.0020.0002] # CUNEIFORM SIGN SAG TIMES UR +122A6 ; [.4AC6.0020.0002] # CUNEIFORM SIGN SAG TIMES USH +122A7 ; [.4AC7.0020.0002] # CUNEIFORM SIGN SAG OVER SAG +122A8 ; [.4AC8.0020.0002] # CUNEIFORM SIGN SAG GUNU +122A9 ; [.4AC9.0020.0002] # CUNEIFORM SIGN SAL +122AA ; [.4ACA.0020.0002] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2 +122AB ; [.4ACB.0020.0002] # CUNEIFORM SIGN SANGA2 +122AC ; [.4ACC.0020.0002] # CUNEIFORM SIGN SAR +122AD ; [.4ACD.0020.0002] # CUNEIFORM SIGN SHA +122AE ; [.4ACE.0020.0002] # CUNEIFORM SIGN SHA3 +122AF ; [.4ACF.0020.0002] # CUNEIFORM SIGN SHA3 TIMES A +122B0 ; [.4AD0.0020.0002] # CUNEIFORM SIGN SHA3 TIMES BAD +122B1 ; [.4AD1.0020.0002] # CUNEIFORM SIGN SHA3 TIMES GISH +122B2 ; [.4AD2.0020.0002] # CUNEIFORM SIGN SHA3 TIMES NE +122B3 ; [.4AD3.0020.0002] # CUNEIFORM SIGN SHA3 TIMES SHU2 +122B4 ; [.4AD4.0020.0002] # CUNEIFORM SIGN SHA3 TIMES TUR +122B5 ; [.4AD5.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U +122B6 ; [.4AD6.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U PLUS A +122B7 ; [.4AD7.0020.0002] # CUNEIFORM SIGN SHA6 +122B8 ; [.4AD8.0020.0002] # CUNEIFORM SIGN SHAB6 +122B9 ; [.4AD9.0020.0002] # CUNEIFORM SIGN SHAR2 +122BA ; [.4ADA.0020.0002] # CUNEIFORM SIGN SHE +122BB ; [.4ADB.0020.0002] # CUNEIFORM SIGN SHE HU +122BC ; [.4ADC.0020.0002] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR +122BD ; [.4ADD.0020.0002] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR +122BE ; [.4ADE.0020.0002] # CUNEIFORM SIGN SHEG9 +122BF ; [.4ADF.0020.0002] # CUNEIFORM SIGN SHEN +122C0 ; [.4AE0.0020.0002] # CUNEIFORM SIGN SHESH +122C1 ; [.4AE1.0020.0002] # CUNEIFORM SIGN SHESH2 +122C2 ; [.4AE2.0020.0002] # CUNEIFORM SIGN SHESHLAM +122C3 ; [.4AE3.0020.0002] # CUNEIFORM SIGN SHID +122C4 ; [.4AE4.0020.0002] # CUNEIFORM SIGN SHID TIMES A +122C5 ; [.4AE5.0020.0002] # CUNEIFORM SIGN SHID TIMES IM +122C6 ; [.4AE6.0020.0002] # CUNEIFORM SIGN SHIM +122C7 ; [.4AE7.0020.0002] # CUNEIFORM SIGN SHIM TIMES A +122C8 ; [.4AE8.0020.0002] # CUNEIFORM SIGN SHIM TIMES BAL +122C9 ; [.4AE9.0020.0002] # CUNEIFORM SIGN SHIM TIMES BULUG +122CA ; [.4AEA.0020.0002] # CUNEIFORM SIGN SHIM TIMES DIN +122CB ; [.4AEB.0020.0002] # CUNEIFORM SIGN SHIM TIMES GAR +122CC ; [.4AEC.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI +122CD ; [.4AED.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI GUNU +122CE ; [.4AEE.0020.0002] # CUNEIFORM SIGN SHIM TIMES KUSHU2 +122CF ; [.4AEF.0020.0002] # CUNEIFORM SIGN SHIM TIMES LUL +122D0 ; [.4AF0.0020.0002] # CUNEIFORM SIGN SHIM TIMES MUG +122D1 ; [.4AF1.0020.0002] # CUNEIFORM SIGN SHIM TIMES SAL +122D2 ; [.4AF2.0020.0002] # CUNEIFORM SIGN SHINIG +122D3 ; [.4AF3.0020.0002] # CUNEIFORM SIGN SHIR +122D6 ; [.4AF4.0020.0002] # CUNEIFORM SIGN SHITA +122D7 ; [.4AF5.0020.0002] # CUNEIFORM SIGN SHU +122D8 ; [.4AF6.0020.0002] # CUNEIFORM SIGN SHU OVER INVERTED SHU +122D9 ; [.4AF7.0020.0002] # CUNEIFORM SIGN SHU2 +122DA ; [.4AF8.0020.0002] # CUNEIFORM SIGN SHUBUR +122DB ; [.4AF9.0020.0002] # CUNEIFORM SIGN SI +122DC ; [.4AFA.0020.0002] # CUNEIFORM SIGN SI GUNU +122DD ; [.4AFB.0020.0002] # CUNEIFORM SIGN SIG +122DE ; [.4AFC.0020.0002] # CUNEIFORM SIGN SIG4 +122DF ; [.4AFD.0020.0002] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2 +122E0 ; [.4AFE.0020.0002] # CUNEIFORM SIGN SIK2 +122E1 ; [.4AFF.0020.0002] # CUNEIFORM SIGN SILA3 +122E2 ; [.4B00.0020.0002] # CUNEIFORM SIGN SU +122E3 ; [.4B01.0020.0002] # CUNEIFORM SIGN SU OVER SU +122E4 ; [.4B02.0020.0002] # CUNEIFORM SIGN SUD +122E5 ; [.4B03.0020.0002] # CUNEIFORM SIGN SUD2 +122E6 ; [.4B04.0020.0002] # CUNEIFORM SIGN SUHUR +122E7 ; [.4B05.0020.0002] # CUNEIFORM SIGN SUM +122E8 ; [.4B06.0020.0002] # CUNEIFORM SIGN SUMASH +122E9 ; [.4B07.0020.0002] # CUNEIFORM SIGN SUR +122EA ; [.4B08.0020.0002] # CUNEIFORM SIGN SUR9 +122EB ; [.4B09.0020.0002] # CUNEIFORM SIGN TA +122EC ; [.4B0A.0020.0002] # CUNEIFORM SIGN TA ASTERISK +122ED ; [.4B0B.0020.0002] # CUNEIFORM SIGN TA TIMES HI +122EE ; [.4B0C.0020.0002] # CUNEIFORM SIGN TA TIMES MI +122EF ; [.4B0D.0020.0002] # CUNEIFORM SIGN TA GUNU +122F0 ; [.4B0E.0020.0002] # CUNEIFORM SIGN TAB +122F1 ; [.4B0F.0020.0002] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH +122F2 ; [.4B10.0020.0002] # CUNEIFORM SIGN TAB SQUARED +122F3 ; [.4B11.0020.0002] # CUNEIFORM SIGN TAG +122F4 ; [.4B12.0020.0002] # CUNEIFORM SIGN TAG TIMES BI +122F5 ; [.4B13.0020.0002] # CUNEIFORM SIGN TAG TIMES GUD +122F6 ; [.4B14.0020.0002] # CUNEIFORM SIGN TAG TIMES SHE +122F7 ; [.4B15.0020.0002] # CUNEIFORM SIGN TAG TIMES SHU +122F8 ; [.4B16.0020.0002] # CUNEIFORM SIGN TAG TIMES TUG2 +122F9 ; [.4B17.0020.0002] # CUNEIFORM SIGN TAG TIMES UD +122FA ; [.4B18.0020.0002] # CUNEIFORM SIGN TAK4 +122FB ; [.4B19.0020.0002] # CUNEIFORM SIGN TAR +122FC ; [.4B1A.0020.0002] # CUNEIFORM SIGN TE +122FD ; [.4B1B.0020.0002] # CUNEIFORM SIGN TE GUNU +122FE ; [.4B1C.0020.0002] # CUNEIFORM SIGN TI +122FF ; [.4B1D.0020.0002] # CUNEIFORM SIGN TI TENU +12300 ; [.4B1E.0020.0002] # CUNEIFORM SIGN TIL +12301 ; [.4B1F.0020.0002] # CUNEIFORM SIGN TIR +12302 ; [.4B20.0020.0002] # CUNEIFORM SIGN TIR TIMES TAK4 +12303 ; [.4B21.0020.0002] # CUNEIFORM SIGN TIR OVER TIR +12304 ; [.4B22.0020.0002] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR +12305 ; [.4B23.0020.0002] # CUNEIFORM SIGN TU +12306 ; [.4B24.0020.0002] # CUNEIFORM SIGN TUG2 +12307 ; [.4B25.0020.0002] # CUNEIFORM SIGN TUK +12308 ; [.4B26.0020.0002] # CUNEIFORM SIGN TUM +12309 ; [.4B27.0020.0002] # CUNEIFORM SIGN TUR +1230A ; [.4B28.0020.0002] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA +1230B ; [.4B29.0020.0002] # CUNEIFORM SIGN U +1230C ; [.4B2A.0020.0002] # CUNEIFORM SIGN U GUD +1230D ; [.4B2B.0020.0002] # CUNEIFORM SIGN U U U +1230E ; [.4B2C.0020.0002] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR +1230F ; [.4B2D.0020.0002] # CUNEIFORM SIGN U OVER U SUR OVER SUR +12310 ; [.4B2E.0020.0002] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED +12311 ; [.4B2F.0020.0002] # CUNEIFORM SIGN U2 +12312 ; [.4B30.0020.0002] # CUNEIFORM SIGN UB +12313 ; [.4B31.0020.0002] # CUNEIFORM SIGN UD +12314 ; [.4B32.0020.0002] # CUNEIFORM SIGN UD KUSHU2 +12315 ; [.4B33.0020.0002] # CUNEIFORM SIGN UD TIMES BAD +12316 ; [.4B34.0020.0002] # CUNEIFORM SIGN UD TIMES MI +12317 ; [.4B35.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U +12318 ; [.4B36.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU +12319 ; [.4B37.0020.0002] # CUNEIFORM SIGN UD GUNU +1231A ; [.4B38.0020.0002] # CUNEIFORM SIGN UD SHESHIG +1231B ; [.4B39.0020.0002] # CUNEIFORM SIGN UD SHESHIG TIMES BAD +1231C ; [.4B3A.0020.0002] # CUNEIFORM SIGN UDUG +1231D ; [.4B3B.0020.0002] # CUNEIFORM SIGN UM +1231E ; [.4B3C.0020.0002] # CUNEIFORM SIGN UM TIMES LAGAB +1231F ; [.4B3D.0020.0002] # CUNEIFORM SIGN UM TIMES ME PLUS DA +12320 ; [.4B3E.0020.0002] # CUNEIFORM SIGN UM TIMES SHA3 +12321 ; [.4B3F.0020.0002] # CUNEIFORM SIGN UM TIMES U +12322 ; [.4B40.0020.0002] # CUNEIFORM SIGN UMBIN +12323 ; [.4B41.0020.0002] # CUNEIFORM SIGN UMUM +12324 ; [.4B42.0020.0002] # CUNEIFORM SIGN UMUM TIMES KASKAL +12325 ; [.4B43.0020.0002] # CUNEIFORM SIGN UMUM TIMES PA +12326 ; [.4B44.0020.0002] # CUNEIFORM SIGN UN +12327 ; [.4B45.0020.0002] # CUNEIFORM SIGN UN GUNU +12328 ; [.4B46.0020.0002] # CUNEIFORM SIGN UR +12329 ; [.4B47.0020.0002] # CUNEIFORM SIGN UR CROSSING UR +1232A ; [.4B48.0020.0002] # CUNEIFORM SIGN UR SHESHIG +1232B ; [.4B49.0020.0002] # CUNEIFORM SIGN UR2 +1232C ; [.4B4A.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS HA +1232D ; [.4B4B.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS NA +1232E ; [.4B4C.0020.0002] # CUNEIFORM SIGN UR2 TIMES AL +1232F ; [.4B4D.0020.0002] # CUNEIFORM SIGN UR2 TIMES HA +12330 ; [.4B4E.0020.0002] # CUNEIFORM SIGN UR2 TIMES NUN +12331 ; [.4B4F.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 +12332 ; [.4B50.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH +12333 ; [.4B51.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI +12334 ; [.4B52.0020.0002] # CUNEIFORM SIGN UR4 +12335 ; [.4B53.0020.0002] # CUNEIFORM SIGN URI +12336 ; [.4B54.0020.0002] # CUNEIFORM SIGN URI3 +12337 ; [.4B55.0020.0002] # CUNEIFORM SIGN URU +12338 ; [.4B56.0020.0002] # CUNEIFORM SIGN URU TIMES A +12339 ; [.4B57.0020.0002] # CUNEIFORM SIGN URU TIMES ASHGAB +1233A ; [.4B58.0020.0002] # CUNEIFORM SIGN URU TIMES BAR +1233B ; [.4B59.0020.0002] # CUNEIFORM SIGN URU TIMES DUN +1233C ; [.4B5A.0020.0002] # CUNEIFORM SIGN URU TIMES GA +1233D ; [.4B5B.0020.0002] # CUNEIFORM SIGN URU TIMES GAL +1233E ; [.4B5C.0020.0002] # CUNEIFORM SIGN URU TIMES GAN2 TENU +1233F ; [.4B5D.0020.0002] # CUNEIFORM SIGN URU TIMES GAR +12340 ; [.4B5E.0020.0002] # CUNEIFORM SIGN URU TIMES GU +12341 ; [.4B5F.0020.0002] # CUNEIFORM SIGN URU TIMES HA +12342 ; [.4B60.0020.0002] # CUNEIFORM SIGN URU TIMES IGI +12343 ; [.4B61.0020.0002] # CUNEIFORM SIGN URU TIMES IM +12344 ; [.4B62.0020.0002] # CUNEIFORM SIGN URU TIMES ISH +12345 ; [.4B63.0020.0002] # CUNEIFORM SIGN URU TIMES KI +12346 ; [.4B64.0020.0002] # CUNEIFORM SIGN URU TIMES LUM +12347 ; [.4B65.0020.0002] # CUNEIFORM SIGN URU TIMES MIN +12348 ; [.4B66.0020.0002] # CUNEIFORM SIGN URU TIMES PA +12349 ; [.4B67.0020.0002] # CUNEIFORM SIGN URU TIMES SHE +1234A ; [.4B68.0020.0002] # CUNEIFORM SIGN URU TIMES SIG4 +1234B ; [.4B69.0020.0002] # CUNEIFORM SIGN URU TIMES TU +1234C ; [.4B6A.0020.0002] # CUNEIFORM SIGN URU TIMES U PLUS GUD +1234D ; [.4B6B.0020.0002] # CUNEIFORM SIGN URU TIMES UD +1234E ; [.4B6C.0020.0002] # CUNEIFORM SIGN URU TIMES URUDA +1234F ; [.4B6D.0020.0002] # CUNEIFORM SIGN URUDA +12350 ; [.4B6E.0020.0002] # CUNEIFORM SIGN URUDA TIMES U +12351 ; [.4B6F.0020.0002] # CUNEIFORM SIGN USH +12352 ; [.4B70.0020.0002] # CUNEIFORM SIGN USH TIMES A +12353 ; [.4B71.0020.0002] # CUNEIFORM SIGN USH TIMES KU +12354 ; [.4B72.0020.0002] # CUNEIFORM SIGN USH TIMES KUR +12355 ; [.4B73.0020.0002] # CUNEIFORM SIGN USH TIMES TAK4 +12356 ; [.4B74.0020.0002] # CUNEIFORM SIGN USHX +12357 ; [.4B75.0020.0002] # CUNEIFORM SIGN USH2 +12358 ; [.4B76.0020.0002] # CUNEIFORM SIGN USHUMX +12359 ; [.4B77.0020.0002] # CUNEIFORM SIGN UTUKI +1235A ; [.4B78.0020.0002] # CUNEIFORM SIGN UZ3 +1235B ; [.4B79.0020.0002] # CUNEIFORM SIGN UZ3 TIMES KASKAL +1235C ; [.4B7A.0020.0002] # CUNEIFORM SIGN UZU +1235D ; [.4B7B.0020.0002] # CUNEIFORM SIGN ZA +1235E ; [.4B7C.0020.0002] # CUNEIFORM SIGN ZA TENU +1235F ; [.4B7D.0020.0002] # CUNEIFORM SIGN ZA SQUARED TIMES KUR +12360 ; [.4B7E.0020.0002] # CUNEIFORM SIGN ZAG +12361 ; [.4B7F.0020.0002] # CUNEIFORM SIGN ZAMX +12362 ; [.4B80.0020.0002] # CUNEIFORM SIGN ZE2 +12363 ; [.4B81.0020.0002] # CUNEIFORM SIGN ZI +12364 ; [.4B82.0020.0002] # CUNEIFORM SIGN ZI OVER ZI +12365 ; [.4B83.0020.0002] # CUNEIFORM SIGN ZI3 +12366 ; [.4B84.0020.0002] # CUNEIFORM SIGN ZIB +12367 ; [.4B85.0020.0002] # CUNEIFORM SIGN ZIB KABA TENU +12368 ; [.4B86.0020.0002] # CUNEIFORM SIGN ZIG +12369 ; [.4B87.0020.0002] # CUNEIFORM SIGN ZIZ2 +1236A ; [.4B88.0020.0002] # CUNEIFORM SIGN ZU +1236B ; [.4B89.0020.0002] # CUNEIFORM SIGN ZU5 +1236C ; [.4B8A.0020.0002] # CUNEIFORM SIGN ZU5 TIMES A +1236D ; [.4B8B.0020.0002] # CUNEIFORM SIGN ZUBUR +1236E ; [.4B8C.0020.0002] # CUNEIFORM SIGN ZUM +1236F ; [.4B8D.0020.0002] # CUNEIFORM SIGN KAP ELAMITE +12370 ; [.4B8E.0020.0002] # CUNEIFORM SIGN AB TIMES NUN +12371 ; [.4B8F.0020.0002] # CUNEIFORM SIGN AB2 TIMES A +12372 ; [.4B90.0020.0002] # CUNEIFORM SIGN AMAR TIMES KUG +12373 ; [.4B91.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH +12374 ; [.4B92.0020.0002] # CUNEIFORM SIGN DAG3 +12375 ; [.4B93.0020.0002] # CUNEIFORM SIGN DISH PLUS SHU +12376 ; [.4B94.0020.0002] # CUNEIFORM SIGN DUB TIMES SHE +12377 ; [.4B95.0020.0002] # CUNEIFORM SIGN EZEN TIMES GUD +12378 ; [.4B96.0020.0002] # CUNEIFORM SIGN EZEN TIMES SHE +12379 ; [.4B97.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A +1237A ; [.4B98.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 +1237B ; [.4B99.0020.0002] # CUNEIFORM SIGN GE22 +1237C ; [.4B9A.0020.0002] # CUNEIFORM SIGN GIG +1237D ; [.4B9B.0020.0002] # CUNEIFORM SIGN HUSH +1237E ; [.4B9C.0020.0002] # CUNEIFORM SIGN KA TIMES ANSHE +1237F ; [.4B9D.0020.0002] # CUNEIFORM SIGN KA TIMES ASH3 +12380 ; [.4B9E.0020.0002] # CUNEIFORM SIGN KA TIMES GISH +12381 ; [.4B9F.0020.0002] # CUNEIFORM SIGN KA TIMES GUD +12382 ; [.4BA0.0020.0002] # CUNEIFORM SIGN KA TIMES HI TIMES ASH2 +12383 ; [.4BA1.0020.0002] # CUNEIFORM SIGN KA TIMES LUM +12384 ; [.4BA2.0020.0002] # CUNEIFORM SIGN KA TIMES PA +12385 ; [.4BA3.0020.0002] # CUNEIFORM SIGN KA TIMES SHUL +12386 ; [.4BA4.0020.0002] # CUNEIFORM SIGN KA TIMES TU +12387 ; [.4BA5.0020.0002] # CUNEIFORM SIGN KA TIMES UR2 +12388 ; [.4BA6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GI +12389 ; [.4BA7.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG TIMES BAD +1238A ; [.4BA8.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL +1238B ; [.4BA9.0020.0002] # CUNEIFORM SIGN LU2 TIMES SHU +1238C ; [.4BAA.0020.0002] # CUNEIFORM SIGN MESH +1238D ; [.4BAB.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES ZA +1238E ; [.4BAC.0020.0002] # CUNEIFORM SIGN NA4 +1238F ; [.4BAD.0020.0002] # CUNEIFORM SIGN NIN +12390 ; [.4BAE.0020.0002] # CUNEIFORM SIGN NIN9 +12391 ; [.4BAF.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES BAL +12392 ; [.4BB0.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GI +12393 ; [.4BB1.0020.0002] # CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES +12394 ; [.4BB2.0020.0002] # CUNEIFORM SIGN PESH2 ASTERISK +12395 ; [.4BB3.0020.0002] # CUNEIFORM SIGN PIR2 +12396 ; [.4BB4.0020.0002] # CUNEIFORM SIGN SAG TIMES IGI GUNU +12397 ; [.4BB5.0020.0002] # CUNEIFORM SIGN TI2 +12398 ; [.4BB6.0020.0002] # CUNEIFORM SIGN UM TIMES ME +12399 ; [.4BB7.0020.0002] # CUNEIFORM SIGN U U +12480 ; [.4BB8.0020.0002] # CUNEIFORM SIGN AB TIMES NUN TENU +12481 ; [.4BB9.0020.0002] # CUNEIFORM SIGN AB TIMES SHU2 +12482 ; [.4BBA.0020.0002] # CUNEIFORM SIGN AD TIMES ESH2 +12483 ; [.4BBB.0020.0002] # CUNEIFORM SIGN BAD TIMES DISH TENU +12484 ; [.4BBC.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES AB2 +12485 ; [.4BBD.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES NI +12486 ; [.4BBE.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES ZA +12487 ; [.4BBF.0020.0002] # CUNEIFORM SIGN BU OVER BU TIMES NA2 +12488 ; [.4BC0.0020.0002] # CUNEIFORM SIGN DA TIMES TAK4 +12489 ; [.4BC1.0020.0002] # CUNEIFORM SIGN DAG TIMES KUR +1248A ; [.4BC2.0020.0002] # CUNEIFORM SIGN DIM TIMES IGI +1248B ; [.4BC3.0020.0002] # CUNEIFORM SIGN DIM TIMES U U U +1248C ; [.4BC4.0020.0002] # CUNEIFORM SIGN DIM2 TIMES UD +1248D ; [.4BC5.0020.0002] # CUNEIFORM SIGN DUG TIMES ANSHE +1248E ; [.4BC6.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH +1248F ; [.4BC7.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH AT LEFT +12490 ; [.4BC8.0020.0002] # CUNEIFORM SIGN DUG TIMES DIN +12491 ; [.4BC9.0020.0002] # CUNEIFORM SIGN DUG TIMES DUN +12492 ; [.4BCA.0020.0002] # CUNEIFORM SIGN DUG TIMES ERIN2 +12493 ; [.4BCB.0020.0002] # CUNEIFORM SIGN DUG TIMES GA +12494 ; [.4BCC.0020.0002] # CUNEIFORM SIGN DUG TIMES GI +12495 ; [.4BCD.0020.0002] # CUNEIFORM SIGN DUG TIMES GIR2 GUNU +12496 ; [.4BCE.0020.0002] # CUNEIFORM SIGN DUG TIMES GISH +12497 ; [.4BCF.0020.0002] # CUNEIFORM SIGN DUG TIMES HA +12498 ; [.4BD0.0020.0002] # CUNEIFORM SIGN DUG TIMES HI +12499 ; [.4BD1.0020.0002] # CUNEIFORM SIGN DUG TIMES IGI GUNU +1249A ; [.4BD2.0020.0002] # CUNEIFORM SIGN DUG TIMES KASKAL +1249B ; [.4BD3.0020.0002] # CUNEIFORM SIGN DUG TIMES KUR +1249C ; [.4BD4.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 +1249D ; [.4BD5.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL +1249E ; [.4BD6.0020.0002] # CUNEIFORM SIGN DUG TIMES LAK-020 +1249F ; [.4BD7.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM +124A0 ; [.4BD8.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM TIMES KUR +124A1 ; [.4BD9.0020.0002] # CUNEIFORM SIGN DUG TIMES LUH PLUS GISH +124A2 ; [.4BDA.0020.0002] # CUNEIFORM SIGN DUG TIMES MASH +124A3 ; [.4BDB.0020.0002] # CUNEIFORM SIGN DUG TIMES MES +124A4 ; [.4BDC.0020.0002] # CUNEIFORM SIGN DUG TIMES MI +124A5 ; [.4BDD.0020.0002] # CUNEIFORM SIGN DUG TIMES NI +124A6 ; [.4BDE.0020.0002] # CUNEIFORM SIGN DUG TIMES PI +124A7 ; [.4BDF.0020.0002] # CUNEIFORM SIGN DUG TIMES SHE +124A8 ; [.4BE0.0020.0002] # CUNEIFORM SIGN DUG TIMES SI GUNU +124A9 ; [.4BE1.0020.0002] # CUNEIFORM SIGN E2 TIMES KUR +124AA ; [.4BE2.0020.0002] # CUNEIFORM SIGN E2 TIMES PAP +124AB ; [.4BE3.0020.0002] # CUNEIFORM SIGN ERIN2 X +124AC ; [.4BE4.0020.0002] # CUNEIFORM SIGN ESH2 CROSSING ESH2 +124AD ; [.4BE5.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ASH +124AE ; [.4BE6.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES HI +124AF ; [.4BE7.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU +124B0 ; [.4BE8.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LA +124B1 ; [.4BE9.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LAL +124B2 ; [.4BEA.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ME +124B3 ; [.4BEB.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES MES +124B4 ; [.4BEC.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES SU +124B5 ; [.4BED.0020.0002] # CUNEIFORM SIGN EZEN TIMES SU +124B6 ; [.4BEE.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAHAR2 +124B7 ; [.4BEF.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM GUNU +124B8 ; [.4BF0.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU +124B9 ; [.4BF1.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL +124BA ; [.4BF2.0020.0002] # CUNEIFORM SIGN GA2 TIMES EREN +124BB ; [.4BF3.0020.0002] # CUNEIFORM SIGN GA2 TIMES GA +124BC ; [.4BF4.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS DI +124BD ; [.4BF5.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS NE +124BE ; [.4BF6.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS A +124BF ; [.4BF7.0020.0002] # CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL +124C0 ; [.4BF8.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM +124C1 ; [.4BF9.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR +124C2 ; [.4BFA.0020.0002] # CUNEIFORM SIGN GA2 TIMES LUH +124C3 ; [.4BFB.0020.0002] # CUNEIFORM SIGN GA2 TIMES MUSH +124C4 ; [.4BFC.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE +124C5 ; [.4BFD.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS E2 +124C6 ; [.4BFE.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS GI +124C7 ; [.4BFF.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHIM +124C8 ; [.4C00.0020.0002] # CUNEIFORM SIGN GA2 TIMES ZIZ2 +124C9 ; [.4C01.0020.0002] # CUNEIFORM SIGN GABA ROTATED NINETY DEGREES +124CA ; [.4C02.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES U +124CB ; [.4C03.0020.0002] # CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH +124CC ; [.4C04.0020.0002] # CUNEIFORM SIGN GU2 TIMES IGI GUNU +124CD ; [.4C05.0020.0002] # CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4 +124CE ; [.4C06.0020.0002] # CUNEIFORM SIGN HA TENU GUNU +124CF ; [.4C07.0020.0002] # CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH +124D0 ; [.4C08.0020.0002] # CUNEIFORM SIGN KA TIMES BU +124D1 ; [.4C09.0020.0002] # CUNEIFORM SIGN KA TIMES KA +124D2 ; [.4C0A.0020.0002] # CUNEIFORM SIGN KA TIMES U U U +124D3 ; [.4C0B.0020.0002] # CUNEIFORM SIGN KA TIMES UR +124D4 ; [.4C0C.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU +124D5 ; [.4C0D.0020.0002] # CUNEIFORM SIGN LAK-003 +124D6 ; [.4C0E.0020.0002] # CUNEIFORM SIGN LAK-021 +124D7 ; [.4C0F.0020.0002] # CUNEIFORM SIGN LAK-025 +124D8 ; [.4C10.0020.0002] # CUNEIFORM SIGN LAK-030 +124D9 ; [.4C11.0020.0002] # CUNEIFORM SIGN LAK-050 +124DA ; [.4C12.0020.0002] # CUNEIFORM SIGN LAK-051 +124DB ; [.4C13.0020.0002] # CUNEIFORM SIGN LAK-062 +124DC ; [.4C14.0020.0002] # CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU +124DD ; [.4C15.0020.0002] # CUNEIFORM SIGN LAK-080 +124DE ; [.4C16.0020.0002] # CUNEIFORM SIGN LAK-081 OVER LAK-081 +124DF ; [.4C17.0020.0002] # CUNEIFORM SIGN LAK-092 +124E0 ; [.4C18.0020.0002] # CUNEIFORM SIGN LAK-130 +124E1 ; [.4C19.0020.0002] # CUNEIFORM SIGN LAK-142 +124E2 ; [.4C1A.0020.0002] # CUNEIFORM SIGN LAK-210 +124E3 ; [.4C1B.0020.0002] # CUNEIFORM SIGN LAK-219 +124E4 ; [.4C1C.0020.0002] # CUNEIFORM SIGN LAK-220 +124E5 ; [.4C1D.0020.0002] # CUNEIFORM SIGN LAK-225 +124E6 ; [.4C1E.0020.0002] # CUNEIFORM SIGN LAK-228 +124E7 ; [.4C1F.0020.0002] # CUNEIFORM SIGN LAK-238 +124E8 ; [.4C20.0020.0002] # CUNEIFORM SIGN LAK-265 +124E9 ; [.4C21.0020.0002] # CUNEIFORM SIGN LAK-266 +124EA ; [.4C22.0020.0002] # CUNEIFORM SIGN LAK-343 +124EB ; [.4C23.0020.0002] # CUNEIFORM SIGN LAK-347 +124EC ; [.4C24.0020.0002] # CUNEIFORM SIGN LAK-348 +124ED ; [.4C25.0020.0002] # CUNEIFORM SIGN LAK-383 +124EE ; [.4C26.0020.0002] # CUNEIFORM SIGN LAK-384 +124EF ; [.4C27.0020.0002] # CUNEIFORM SIGN LAK-390 +124F0 ; [.4C28.0020.0002] # CUNEIFORM SIGN LAK-441 +124F1 ; [.4C29.0020.0002] # CUNEIFORM SIGN LAK-449 +124F2 ; [.4C2A.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES GU +124F3 ; [.4C2B.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES IGI +124F4 ; [.4C2C.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3 +124F5 ; [.4C2D.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3 +124F6 ; [.4C2E.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA +124F7 ; [.4C2F.0020.0002] # CUNEIFORM SIGN LAK-450 +124F8 ; [.4C30.0020.0002] # CUNEIFORM SIGN LAK-457 +124F9 ; [.4C31.0020.0002] # CUNEIFORM SIGN LAK-470 +124FA ; [.4C32.0020.0002] # CUNEIFORM SIGN LAK-483 +124FB ; [.4C33.0020.0002] # CUNEIFORM SIGN LAK-490 +124FC ; [.4C34.0020.0002] # CUNEIFORM SIGN LAK-492 +124FD ; [.4C35.0020.0002] # CUNEIFORM SIGN LAK-493 +124FE ; [.4C36.0020.0002] # CUNEIFORM SIGN LAK-495 +124FF ; [.4C37.0020.0002] # CUNEIFORM SIGN LAK-550 +12500 ; [.4C38.0020.0002] # CUNEIFORM SIGN LAK-608 +12501 ; [.4C39.0020.0002] # CUNEIFORM SIGN LAK-617 +12502 ; [.4C3A.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES ASH +12503 ; [.4C3B.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES BAD +12504 ; [.4C3C.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU +12505 ; [.4C3D.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES KU3 +12506 ; [.4C3E.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES LA +12507 ; [.4C3F.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TAR +12508 ; [.4C40.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TE +12509 ; [.4C41.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES U2 +1250A ; [.4C42.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES UD +1250B ; [.4C43.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES URUDA +1250C ; [.4C44.0020.0002] # CUNEIFORM SIGN LAK-636 +1250D ; [.4C45.0020.0002] # CUNEIFORM SIGN LAK-648 +1250E ; [.4C46.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES DUB +1250F ; [.4C47.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES GA +12510 ; [.4C48.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI +12511 ; [.4C49.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI GUNU +12512 ; [.4C4A.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES NI +12513 ; [.4C4B.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3 +12514 ; [.4C4C.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI +12515 ; [.4C4D.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES UD +12516 ; [.4C4E.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES URUDA +12517 ; [.4C4F.0020.0002] # CUNEIFORM SIGN LAK-724 +12518 ; [.4C50.0020.0002] # CUNEIFORM SIGN LAK-749 +12519 ; [.4C51.0020.0002] # CUNEIFORM SIGN LU2 GUNU TIMES ASH +1251A ; [.4C52.0020.0002] # CUNEIFORM SIGN LU2 TIMES DISH +1251B ; [.4C53.0020.0002] # CUNEIFORM SIGN LU2 TIMES HAL +1251C ; [.4C54.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP +1251D ; [.4C55.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3 +1251E ; [.4C56.0020.0002] # CUNEIFORM SIGN LU2 TIMES TAK4 +1251F ; [.4C57.0020.0002] # CUNEIFORM SIGN MI PLUS ZA7 +12520 ; [.4C58.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES GA +12521 ; [.4C59.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK +12522 ; [.4C5A.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES DIM GUNU +12523 ; [.4C5B.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GISH +12524 ; [.4C5C.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUL +12525 ; [.4C5D.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES HI +12526 ; [.4C5E.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES KESH2 +12527 ; [.4C5F.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES LAK-050 +12528 ; [.4C60.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES MASH +12529 ; [.4C61.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP +1252A ; [.4C62.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U +1252B ; [.4C63.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U PLUS U +1252C ; [.4C64.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES URUDA +1252D ; [.4C65.0020.0002] # CUNEIFORM SIGN SAG GUNU TIMES HA +1252E ; [.4C66.0020.0002] # CUNEIFORM SIGN SAG TIMES EN +1252F ; [.4C67.0020.0002] # CUNEIFORM SIGN SAG TIMES SHE AT LEFT +12530 ; [.4C68.0020.0002] # CUNEIFORM SIGN SAG TIMES TAK4 +12531 ; [.4C69.0020.0002] # CUNEIFORM SIGN SHA6 TENU +12532 ; [.4C6A.0020.0002] # CUNEIFORM SIGN SHE OVER SHE +12533 ; [.4C6B.0020.0002] # CUNEIFORM SIGN SHE PLUS HUB2 +12534 ; [.4C6C.0020.0002] # CUNEIFORM SIGN SHE PLUS NAM2 +12535 ; [.4C6D.0020.0002] # CUNEIFORM SIGN SHE PLUS SAR +12536 ; [.4C6E.0020.0002] # CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI +12537 ; [.4C6F.0020.0002] # CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN +12538 ; [.4C70.0020.0002] # CUNEIFORM SIGN SI TIMES TAK4 +12539 ; [.4C71.0020.0002] # CUNEIFORM SIGN TAK4 PLUS SAG +1253A ; [.4C72.0020.0002] # CUNEIFORM SIGN TUM TIMES GAN2 TENU +1253B ; [.4C73.0020.0002] # CUNEIFORM SIGN TUM TIMES THREE DISH +1253C ; [.4C74.0020.0002] # CUNEIFORM SIGN UR2 INVERTED +1253D ; [.4C75.0020.0002] # CUNEIFORM SIGN UR2 TIMES UD +1253E ; [.4C76.0020.0002] # CUNEIFORM SIGN URU TIMES DARA3 +1253F ; [.4C77.0020.0002] # CUNEIFORM SIGN URU TIMES LAK-668 +12540 ; [.4C78.0020.0002] # CUNEIFORM SIGN URU TIMES LU3 +12541 ; [.4C79.0020.0002] # CUNEIFORM SIGN ZA7 +12542 ; [.4C7A.0020.0002] # CUNEIFORM SIGN ZU OVER ZU PLUS SAR +12543 ; [.4C7B.0020.0002] # CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000 ; [.4C7C.0020.0002] # EGYPTIAN HIEROGLYPH A001 +13001 ; [.4C7D.0020.0002] # EGYPTIAN HIEROGLYPH A002 +13002 ; [.4C7E.0020.0002] # EGYPTIAN HIEROGLYPH A003 +13003 ; [.4C7F.0020.0002] # EGYPTIAN HIEROGLYPH A004 +13004 ; [.4C80.0020.0002] # EGYPTIAN HIEROGLYPH A005 +13005 ; [.4C81.0020.0002] # EGYPTIAN HIEROGLYPH A005A +13006 ; [.4C82.0020.0002] # EGYPTIAN HIEROGLYPH A006 +13007 ; [.4C83.0020.0002] # EGYPTIAN HIEROGLYPH A006A +13008 ; [.4C84.0020.0002] # EGYPTIAN HIEROGLYPH A006B +13009 ; [.4C85.0020.0002] # EGYPTIAN HIEROGLYPH A007 +1300A ; [.4C86.0020.0002] # EGYPTIAN HIEROGLYPH A008 +1300B ; [.4C87.0020.0002] # EGYPTIAN HIEROGLYPH A009 +1300C ; [.4C88.0020.0002] # EGYPTIAN HIEROGLYPH A010 +1300D ; [.4C89.0020.0002] # EGYPTIAN HIEROGLYPH A011 +1300E ; [.4C8A.0020.0002] # EGYPTIAN HIEROGLYPH A012 +1300F ; [.4C8B.0020.0002] # EGYPTIAN HIEROGLYPH A013 +13010 ; [.4C8C.0020.0002] # EGYPTIAN HIEROGLYPH A014 +13011 ; [.4C8D.0020.0002] # EGYPTIAN HIEROGLYPH A014A +13012 ; [.4C8E.0020.0002] # EGYPTIAN HIEROGLYPH A015 +13013 ; [.4C8F.0020.0002] # EGYPTIAN HIEROGLYPH A016 +13014 ; [.4C90.0020.0002] # EGYPTIAN HIEROGLYPH A017 +13015 ; [.4C91.0020.0002] # EGYPTIAN HIEROGLYPH A017A +13016 ; [.4C92.0020.0002] # EGYPTIAN HIEROGLYPH A018 +13017 ; [.4C93.0020.0002] # EGYPTIAN HIEROGLYPH A019 +13018 ; [.4C94.0020.0002] # EGYPTIAN HIEROGLYPH A020 +13019 ; [.4C95.0020.0002] # EGYPTIAN HIEROGLYPH A021 +1301A ; [.4C96.0020.0002] # EGYPTIAN HIEROGLYPH A022 +1301B ; [.4C97.0020.0002] # EGYPTIAN HIEROGLYPH A023 +1301C ; [.4C98.0020.0002] # EGYPTIAN HIEROGLYPH A024 +1301D ; [.4C99.0020.0002] # EGYPTIAN HIEROGLYPH A025 +1301E ; [.4C9A.0020.0002] # EGYPTIAN HIEROGLYPH A026 +1301F ; [.4C9B.0020.0002] # EGYPTIAN HIEROGLYPH A027 +13020 ; [.4C9C.0020.0002] # EGYPTIAN HIEROGLYPH A028 +13021 ; [.4C9D.0020.0002] # EGYPTIAN HIEROGLYPH A029 +13022 ; [.4C9E.0020.0002] # EGYPTIAN HIEROGLYPH A030 +13023 ; [.4C9F.0020.0002] # EGYPTIAN HIEROGLYPH A031 +13024 ; [.4CA0.0020.0002] # EGYPTIAN HIEROGLYPH A032 +13025 ; [.4CA1.0020.0002] # EGYPTIAN HIEROGLYPH A032A +13026 ; [.4CA2.0020.0002] # EGYPTIAN HIEROGLYPH A033 +13027 ; [.4CA3.0020.0002] # EGYPTIAN HIEROGLYPH A034 +13028 ; [.4CA4.0020.0002] # EGYPTIAN HIEROGLYPH A035 +13029 ; [.4CA5.0020.0002] # EGYPTIAN HIEROGLYPH A036 +1302A ; [.4CA6.0020.0002] # EGYPTIAN HIEROGLYPH A037 +1302B ; [.4CA7.0020.0002] # EGYPTIAN HIEROGLYPH A038 +1302C ; [.4CA8.0020.0002] # EGYPTIAN HIEROGLYPH A039 +1302D ; [.4CA9.0020.0002] # EGYPTIAN HIEROGLYPH A040 +1302E ; [.4CAA.0020.0002] # EGYPTIAN HIEROGLYPH A040A +1302F ; [.4CAB.0020.0002] # EGYPTIAN HIEROGLYPH A041 +13030 ; [.4CAC.0020.0002] # EGYPTIAN HIEROGLYPH A042 +13031 ; [.4CAD.0020.0002] # EGYPTIAN HIEROGLYPH A042A +13032 ; [.4CAE.0020.0002] # EGYPTIAN HIEROGLYPH A043 +13033 ; [.4CAF.0020.0002] # EGYPTIAN HIEROGLYPH A043A +13034 ; [.4CB0.0020.0002] # EGYPTIAN HIEROGLYPH A044 +13035 ; [.4CB1.0020.0002] # EGYPTIAN HIEROGLYPH A045 +13036 ; [.4CB2.0020.0002] # EGYPTIAN HIEROGLYPH A045A +13037 ; [.4CB3.0020.0002] # EGYPTIAN HIEROGLYPH A046 +13038 ; [.4CB4.0020.0002] # EGYPTIAN HIEROGLYPH A047 +13039 ; [.4CB5.0020.0002] # EGYPTIAN HIEROGLYPH A048 +1303A ; [.4CB6.0020.0002] # EGYPTIAN HIEROGLYPH A049 +1303B ; [.4CB7.0020.0002] # EGYPTIAN HIEROGLYPH A050 +1303C ; [.4CB8.0020.0002] # EGYPTIAN HIEROGLYPH A051 +1303D ; [.4CB9.0020.0002] # EGYPTIAN HIEROGLYPH A052 +1303E ; [.4CBA.0020.0002] # EGYPTIAN HIEROGLYPH A053 +1303F ; [.4CBB.0020.0002] # EGYPTIAN HIEROGLYPH A054 +13040 ; [.4CBC.0020.0002] # EGYPTIAN HIEROGLYPH A055 +13041 ; [.4CBD.0020.0002] # EGYPTIAN HIEROGLYPH A056 +13042 ; [.4CBE.0020.0002] # EGYPTIAN HIEROGLYPH A057 +13043 ; [.4CBF.0020.0002] # EGYPTIAN HIEROGLYPH A058 +13044 ; [.4CC0.0020.0002] # EGYPTIAN HIEROGLYPH A059 +13045 ; [.4CC1.0020.0002] # EGYPTIAN HIEROGLYPH A060 +13046 ; [.4CC2.0020.0002] # EGYPTIAN HIEROGLYPH A061 +13047 ; [.4CC3.0020.0002] # EGYPTIAN HIEROGLYPH A062 +13048 ; [.4CC4.0020.0002] # EGYPTIAN HIEROGLYPH A063 +13049 ; [.4CC5.0020.0002] # EGYPTIAN HIEROGLYPH A064 +1304A ; [.4CC6.0020.0002] # EGYPTIAN HIEROGLYPH A065 +1304B ; [.4CC7.0020.0002] # EGYPTIAN HIEROGLYPH A066 +1304C ; [.4CC8.0020.0002] # EGYPTIAN HIEROGLYPH A067 +1304D ; [.4CC9.0020.0002] # EGYPTIAN HIEROGLYPH A068 +1304E ; [.4CCA.0020.0002] # EGYPTIAN HIEROGLYPH A069 +1304F ; [.4CCB.0020.0002] # EGYPTIAN HIEROGLYPH A070 +13050 ; [.4CCC.0020.0002] # EGYPTIAN HIEROGLYPH B001 +13051 ; [.4CCD.0020.0002] # EGYPTIAN HIEROGLYPH B002 +13052 ; [.4CCE.0020.0002] # EGYPTIAN HIEROGLYPH B003 +13053 ; [.4CCF.0020.0002] # EGYPTIAN HIEROGLYPH B004 +13054 ; [.4CD0.0020.0002] # EGYPTIAN HIEROGLYPH B005 +13055 ; [.4CD1.0020.0002] # EGYPTIAN HIEROGLYPH B005A +13056 ; [.4CD2.0020.0002] # EGYPTIAN HIEROGLYPH B006 +13057 ; [.4CD3.0020.0002] # EGYPTIAN HIEROGLYPH B007 +13058 ; [.4CD4.0020.0002] # EGYPTIAN HIEROGLYPH B008 +13059 ; [.4CD5.0020.0002] # EGYPTIAN HIEROGLYPH B009 +1305A ; [.4CD6.0020.0002] # EGYPTIAN HIEROGLYPH C001 +1305B ; [.4CD7.0020.0002] # EGYPTIAN HIEROGLYPH C002 +1305C ; [.4CD8.0020.0002] # EGYPTIAN HIEROGLYPH C002A +1305D ; [.4CD9.0020.0002] # EGYPTIAN HIEROGLYPH C002B +1305E ; [.4CDA.0020.0002] # EGYPTIAN HIEROGLYPH C002C +1305F ; [.4CDB.0020.0002] # EGYPTIAN HIEROGLYPH C003 +13060 ; [.4CDC.0020.0002] # EGYPTIAN HIEROGLYPH C004 +13061 ; [.4CDD.0020.0002] # EGYPTIAN HIEROGLYPH C005 +13062 ; [.4CDE.0020.0002] # EGYPTIAN HIEROGLYPH C006 +13063 ; [.4CDF.0020.0002] # EGYPTIAN HIEROGLYPH C007 +13064 ; [.4CE0.0020.0002] # EGYPTIAN HIEROGLYPH C008 +13065 ; [.4CE1.0020.0002] # EGYPTIAN HIEROGLYPH C009 +13066 ; [.4CE2.0020.0002] # EGYPTIAN HIEROGLYPH C010 +13067 ; [.4CE3.0020.0002] # EGYPTIAN HIEROGLYPH C010A +13068 ; [.4CE4.0020.0002] # EGYPTIAN HIEROGLYPH C011 +13069 ; [.4CE5.0020.0002] # EGYPTIAN HIEROGLYPH C012 +1306A ; [.4CE6.0020.0002] # EGYPTIAN HIEROGLYPH C013 +1306B ; [.4CE7.0020.0002] # EGYPTIAN HIEROGLYPH C014 +1306C ; [.4CE8.0020.0002] # EGYPTIAN HIEROGLYPH C015 +1306D ; [.4CE9.0020.0002] # EGYPTIAN HIEROGLYPH C016 +1306E ; [.4CEA.0020.0002] # EGYPTIAN HIEROGLYPH C017 +1306F ; [.4CEB.0020.0002] # EGYPTIAN HIEROGLYPH C018 +13070 ; [.4CEC.0020.0002] # EGYPTIAN HIEROGLYPH C019 +13071 ; [.4CED.0020.0002] # EGYPTIAN HIEROGLYPH C020 +13072 ; [.4CEE.0020.0002] # EGYPTIAN HIEROGLYPH C021 +13073 ; [.4CEF.0020.0002] # EGYPTIAN HIEROGLYPH C022 +13074 ; [.4CF0.0020.0002] # EGYPTIAN HIEROGLYPH C023 +13075 ; [.4CF1.0020.0002] # EGYPTIAN HIEROGLYPH C024 +13076 ; [.4CF2.0020.0002] # EGYPTIAN HIEROGLYPH D001 +13077 ; [.4CF3.0020.0002] # EGYPTIAN HIEROGLYPH D002 +13078 ; [.4CF4.0020.0002] # EGYPTIAN HIEROGLYPH D003 +13079 ; [.4CF5.0020.0002] # EGYPTIAN HIEROGLYPH D004 +1307A ; [.4CF6.0020.0002] # EGYPTIAN HIEROGLYPH D005 +1307B ; [.4CF7.0020.0002] # EGYPTIAN HIEROGLYPH D006 +1307C ; [.4CF8.0020.0002] # EGYPTIAN HIEROGLYPH D007 +1307D ; [.4CF9.0020.0002] # EGYPTIAN HIEROGLYPH D008 +1307E ; [.4CFA.0020.0002] # EGYPTIAN HIEROGLYPH D008A +1307F ; [.4CFB.0020.0002] # EGYPTIAN HIEROGLYPH D009 +13080 ; [.4CFC.0020.0002] # EGYPTIAN HIEROGLYPH D010 +13081 ; [.4CFD.0020.0002] # EGYPTIAN HIEROGLYPH D011 +13082 ; [.4CFE.0020.0002] # EGYPTIAN HIEROGLYPH D012 +13083 ; [.4CFF.0020.0002] # EGYPTIAN HIEROGLYPH D013 +13084 ; [.4D00.0020.0002] # EGYPTIAN HIEROGLYPH D014 +13085 ; [.4D01.0020.0002] # EGYPTIAN HIEROGLYPH D015 +13086 ; [.4D02.0020.0002] # EGYPTIAN HIEROGLYPH D016 +13087 ; [.4D03.0020.0002] # EGYPTIAN HIEROGLYPH D017 +13088 ; [.4D04.0020.0002] # EGYPTIAN HIEROGLYPH D018 +13089 ; [.4D05.0020.0002] # EGYPTIAN HIEROGLYPH D019 +1308A ; [.4D06.0020.0002] # EGYPTIAN HIEROGLYPH D020 +1308B ; [.4D07.0020.0002] # EGYPTIAN HIEROGLYPH D021 +1308C ; [.4D08.0020.0002] # EGYPTIAN HIEROGLYPH D022 +1308D ; [.4D09.0020.0002] # EGYPTIAN HIEROGLYPH D023 +1308E ; [.4D0A.0020.0002] # EGYPTIAN HIEROGLYPH D024 +1308F ; [.4D0B.0020.0002] # EGYPTIAN HIEROGLYPH D025 +13090 ; [.4D0C.0020.0002] # EGYPTIAN HIEROGLYPH D026 +13091 ; [.4D0D.0020.0002] # EGYPTIAN HIEROGLYPH D027 +13092 ; [.4D0E.0020.0002] # EGYPTIAN HIEROGLYPH D027A +13093 ; [.4D0F.0020.0002] # EGYPTIAN HIEROGLYPH D028 +13094 ; [.4D10.0020.0002] # EGYPTIAN HIEROGLYPH D029 +13095 ; [.4D11.0020.0002] # EGYPTIAN HIEROGLYPH D030 +13096 ; [.4D12.0020.0002] # EGYPTIAN HIEROGLYPH D031 +13097 ; [.4D13.0020.0002] # EGYPTIAN HIEROGLYPH D031A +13098 ; [.4D14.0020.0002] # EGYPTIAN HIEROGLYPH D032 +13099 ; [.4D15.0020.0002] # EGYPTIAN HIEROGLYPH D033 +1309A ; [.4D16.0020.0002] # EGYPTIAN HIEROGLYPH D034 +1309B ; [.4D17.0020.0002] # EGYPTIAN HIEROGLYPH D034A +1309C ; [.4D18.0020.0002] # EGYPTIAN HIEROGLYPH D035 +1309D ; [.4D19.0020.0002] # EGYPTIAN HIEROGLYPH D036 +1309E ; [.4D1A.0020.0002] # EGYPTIAN HIEROGLYPH D037 +1309F ; [.4D1B.0020.0002] # EGYPTIAN HIEROGLYPH D038 +130A0 ; [.4D1C.0020.0002] # EGYPTIAN HIEROGLYPH D039 +130A1 ; [.4D1D.0020.0002] # EGYPTIAN HIEROGLYPH D040 +130A2 ; [.4D1E.0020.0002] # EGYPTIAN HIEROGLYPH D041 +130A3 ; [.4D1F.0020.0002] # EGYPTIAN HIEROGLYPH D042 +130A4 ; [.4D20.0020.0002] # EGYPTIAN HIEROGLYPH D043 +130A5 ; [.4D21.0020.0002] # EGYPTIAN HIEROGLYPH D044 +130A6 ; [.4D22.0020.0002] # EGYPTIAN HIEROGLYPH D045 +130A7 ; [.4D23.0020.0002] # EGYPTIAN HIEROGLYPH D046 +130A8 ; [.4D24.0020.0002] # EGYPTIAN HIEROGLYPH D046A +130A9 ; [.4D25.0020.0002] # EGYPTIAN HIEROGLYPH D047 +130AA ; [.4D26.0020.0002] # EGYPTIAN HIEROGLYPH D048 +130AB ; [.4D27.0020.0002] # EGYPTIAN HIEROGLYPH D048A +130AC ; [.4D28.0020.0002] # EGYPTIAN HIEROGLYPH D049 +130AD ; [.4D29.0020.0002] # EGYPTIAN HIEROGLYPH D050 +130AE ; [.4D2A.0020.0002] # EGYPTIAN HIEROGLYPH D050A +130AF ; [.4D2B.0020.0002] # EGYPTIAN HIEROGLYPH D050B +130B0 ; [.4D2C.0020.0002] # EGYPTIAN HIEROGLYPH D050C +130B1 ; [.4D2D.0020.0002] # EGYPTIAN HIEROGLYPH D050D +130B2 ; [.4D2E.0020.0002] # EGYPTIAN HIEROGLYPH D050E +130B3 ; [.4D2F.0020.0002] # EGYPTIAN HIEROGLYPH D050F +130B4 ; [.4D30.0020.0002] # EGYPTIAN HIEROGLYPH D050G +130B5 ; [.4D31.0020.0002] # EGYPTIAN HIEROGLYPH D050H +130B6 ; [.4D32.0020.0002] # EGYPTIAN HIEROGLYPH D050I +130B7 ; [.4D33.0020.0002] # EGYPTIAN HIEROGLYPH D051 +130B8 ; [.4D34.0020.0002] # EGYPTIAN HIEROGLYPH D052 +130B9 ; [.4D35.0020.0002] # EGYPTIAN HIEROGLYPH D052A +130BA ; [.4D36.0020.0002] # EGYPTIAN HIEROGLYPH D053 +130BB ; [.4D37.0020.0002] # EGYPTIAN HIEROGLYPH D054 +130BC ; [.4D38.0020.0002] # EGYPTIAN HIEROGLYPH D054A +130BD ; [.4D39.0020.0002] # EGYPTIAN HIEROGLYPH D055 +130BE ; [.4D3A.0020.0002] # EGYPTIAN HIEROGLYPH D056 +130BF ; [.4D3B.0020.0002] # EGYPTIAN HIEROGLYPH D057 +130C0 ; [.4D3C.0020.0002] # EGYPTIAN HIEROGLYPH D058 +130C1 ; [.4D3D.0020.0002] # EGYPTIAN HIEROGLYPH D059 +130C2 ; [.4D3E.0020.0002] # EGYPTIAN HIEROGLYPH D060 +130C3 ; [.4D3F.0020.0002] # EGYPTIAN HIEROGLYPH D061 +130C4 ; [.4D40.0020.0002] # EGYPTIAN HIEROGLYPH D062 +130C5 ; [.4D41.0020.0002] # EGYPTIAN HIEROGLYPH D063 +130C6 ; [.4D42.0020.0002] # EGYPTIAN HIEROGLYPH D064 +130C7 ; [.4D43.0020.0002] # EGYPTIAN HIEROGLYPH D065 +130C8 ; [.4D44.0020.0002] # EGYPTIAN HIEROGLYPH D066 +130C9 ; [.4D45.0020.0002] # EGYPTIAN HIEROGLYPH D067 +130CA ; [.4D46.0020.0002] # EGYPTIAN HIEROGLYPH D067A +130CB ; [.4D47.0020.0002] # EGYPTIAN HIEROGLYPH D067B +130CC ; [.4D48.0020.0002] # EGYPTIAN HIEROGLYPH D067C +130CD ; [.4D49.0020.0002] # EGYPTIAN HIEROGLYPH D067D +130CE ; [.4D4A.0020.0002] # EGYPTIAN HIEROGLYPH D067E +130CF ; [.4D4B.0020.0002] # EGYPTIAN HIEROGLYPH D067F +130D0 ; [.4D4C.0020.0002] # EGYPTIAN HIEROGLYPH D067G +130D1 ; [.4D4D.0020.0002] # EGYPTIAN HIEROGLYPH D067H +130D2 ; [.4D4E.0020.0002] # EGYPTIAN HIEROGLYPH E001 +130D3 ; [.4D4F.0020.0002] # EGYPTIAN HIEROGLYPH E002 +130D4 ; [.4D50.0020.0002] # EGYPTIAN HIEROGLYPH E003 +130D5 ; [.4D51.0020.0002] # EGYPTIAN HIEROGLYPH E004 +130D6 ; [.4D52.0020.0002] # EGYPTIAN HIEROGLYPH E005 +130D7 ; [.4D53.0020.0002] # EGYPTIAN HIEROGLYPH E006 +130D8 ; [.4D54.0020.0002] # EGYPTIAN HIEROGLYPH E007 +130D9 ; [.4D55.0020.0002] # EGYPTIAN HIEROGLYPH E008 +130DA ; [.4D56.0020.0002] # EGYPTIAN HIEROGLYPH E008A +130DB ; [.4D57.0020.0002] # EGYPTIAN HIEROGLYPH E009 +130DC ; [.4D58.0020.0002] # EGYPTIAN HIEROGLYPH E009A +130DD ; [.4D59.0020.0002] # EGYPTIAN HIEROGLYPH E010 +130DE ; [.4D5A.0020.0002] # EGYPTIAN HIEROGLYPH E011 +130DF ; [.4D5B.0020.0002] # EGYPTIAN HIEROGLYPH E012 +130E0 ; [.4D5C.0020.0002] # EGYPTIAN HIEROGLYPH E013 +130E1 ; [.4D5D.0020.0002] # EGYPTIAN HIEROGLYPH E014 +130E2 ; [.4D5E.0020.0002] # EGYPTIAN HIEROGLYPH E015 +130E3 ; [.4D5F.0020.0002] # EGYPTIAN HIEROGLYPH E016 +130E4 ; [.4D60.0020.0002] # EGYPTIAN HIEROGLYPH E016A +130E5 ; [.4D61.0020.0002] # EGYPTIAN HIEROGLYPH E017 +130E6 ; [.4D62.0020.0002] # EGYPTIAN HIEROGLYPH E017A +130E7 ; [.4D63.0020.0002] # EGYPTIAN HIEROGLYPH E018 +130E8 ; [.4D64.0020.0002] # EGYPTIAN HIEROGLYPH E019 +130E9 ; [.4D65.0020.0002] # EGYPTIAN HIEROGLYPH E020 +130EA ; [.4D66.0020.0002] # EGYPTIAN HIEROGLYPH E020A +130EB ; [.4D67.0020.0002] # EGYPTIAN HIEROGLYPH E021 +130EC ; [.4D68.0020.0002] # EGYPTIAN HIEROGLYPH E022 +130ED ; [.4D69.0020.0002] # EGYPTIAN HIEROGLYPH E023 +130EE ; [.4D6A.0020.0002] # EGYPTIAN HIEROGLYPH E024 +130EF ; [.4D6B.0020.0002] # EGYPTIAN HIEROGLYPH E025 +130F0 ; [.4D6C.0020.0002] # EGYPTIAN HIEROGLYPH E026 +130F1 ; [.4D6D.0020.0002] # EGYPTIAN HIEROGLYPH E027 +130F2 ; [.4D6E.0020.0002] # EGYPTIAN HIEROGLYPH E028 +130F3 ; [.4D6F.0020.0002] # EGYPTIAN HIEROGLYPH E028A +130F4 ; [.4D70.0020.0002] # EGYPTIAN HIEROGLYPH E029 +130F5 ; [.4D71.0020.0002] # EGYPTIAN HIEROGLYPH E030 +130F6 ; [.4D72.0020.0002] # EGYPTIAN HIEROGLYPH E031 +130F7 ; [.4D73.0020.0002] # EGYPTIAN HIEROGLYPH E032 +130F8 ; [.4D74.0020.0002] # EGYPTIAN HIEROGLYPH E033 +130F9 ; [.4D75.0020.0002] # EGYPTIAN HIEROGLYPH E034 +130FA ; [.4D76.0020.0002] # EGYPTIAN HIEROGLYPH E034A +130FB ; [.4D77.0020.0002] # EGYPTIAN HIEROGLYPH E036 +130FC ; [.4D78.0020.0002] # EGYPTIAN HIEROGLYPH E037 +130FD ; [.4D79.0020.0002] # EGYPTIAN HIEROGLYPH E038 +130FE ; [.4D7A.0020.0002] # EGYPTIAN HIEROGLYPH F001 +130FF ; [.4D7B.0020.0002] # EGYPTIAN HIEROGLYPH F001A +13100 ; [.4D7C.0020.0002] # EGYPTIAN HIEROGLYPH F002 +13101 ; [.4D7D.0020.0002] # EGYPTIAN HIEROGLYPH F003 +13102 ; [.4D7E.0020.0002] # EGYPTIAN HIEROGLYPH F004 +13103 ; [.4D7F.0020.0002] # EGYPTIAN HIEROGLYPH F005 +13104 ; [.4D80.0020.0002] # EGYPTIAN HIEROGLYPH F006 +13105 ; [.4D81.0020.0002] # EGYPTIAN HIEROGLYPH F007 +13106 ; [.4D82.0020.0002] # EGYPTIAN HIEROGLYPH F008 +13107 ; [.4D83.0020.0002] # EGYPTIAN HIEROGLYPH F009 +13108 ; [.4D84.0020.0002] # EGYPTIAN HIEROGLYPH F010 +13109 ; [.4D85.0020.0002] # EGYPTIAN HIEROGLYPH F011 +1310A ; [.4D86.0020.0002] # EGYPTIAN HIEROGLYPH F012 +1310B ; [.4D87.0020.0002] # EGYPTIAN HIEROGLYPH F013 +1310C ; [.4D88.0020.0002] # EGYPTIAN HIEROGLYPH F013A +1310D ; [.4D89.0020.0002] # EGYPTIAN HIEROGLYPH F014 +1310E ; [.4D8A.0020.0002] # EGYPTIAN HIEROGLYPH F015 +1310F ; [.4D8B.0020.0002] # EGYPTIAN HIEROGLYPH F016 +13110 ; [.4D8C.0020.0002] # EGYPTIAN HIEROGLYPH F017 +13111 ; [.4D8D.0020.0002] # EGYPTIAN HIEROGLYPH F018 +13112 ; [.4D8E.0020.0002] # EGYPTIAN HIEROGLYPH F019 +13113 ; [.4D8F.0020.0002] # EGYPTIAN HIEROGLYPH F020 +13114 ; [.4D90.0020.0002] # EGYPTIAN HIEROGLYPH F021 +13115 ; [.4D91.0020.0002] # EGYPTIAN HIEROGLYPH F021A +13116 ; [.4D92.0020.0002] # EGYPTIAN HIEROGLYPH F022 +13117 ; [.4D93.0020.0002] # EGYPTIAN HIEROGLYPH F023 +13118 ; [.4D94.0020.0002] # EGYPTIAN HIEROGLYPH F024 +13119 ; [.4D95.0020.0002] # EGYPTIAN HIEROGLYPH F025 +1311A ; [.4D96.0020.0002] # EGYPTIAN HIEROGLYPH F026 +1311B ; [.4D97.0020.0002] # EGYPTIAN HIEROGLYPH F027 +1311C ; [.4D98.0020.0002] # EGYPTIAN HIEROGLYPH F028 +1311D ; [.4D99.0020.0002] # EGYPTIAN HIEROGLYPH F029 +1311E ; [.4D9A.0020.0002] # EGYPTIAN HIEROGLYPH F030 +1311F ; [.4D9B.0020.0002] # EGYPTIAN HIEROGLYPH F031 +13120 ; [.4D9C.0020.0002] # EGYPTIAN HIEROGLYPH F031A +13121 ; [.4D9D.0020.0002] # EGYPTIAN HIEROGLYPH F032 +13122 ; [.4D9E.0020.0002] # EGYPTIAN HIEROGLYPH F033 +13123 ; [.4D9F.0020.0002] # EGYPTIAN HIEROGLYPH F034 +13124 ; [.4DA0.0020.0002] # EGYPTIAN HIEROGLYPH F035 +13125 ; [.4DA1.0020.0002] # EGYPTIAN HIEROGLYPH F036 +13126 ; [.4DA2.0020.0002] # EGYPTIAN HIEROGLYPH F037 +13127 ; [.4DA3.0020.0002] # EGYPTIAN HIEROGLYPH F037A +13128 ; [.4DA4.0020.0002] # EGYPTIAN HIEROGLYPH F038 +13129 ; [.4DA5.0020.0002] # EGYPTIAN HIEROGLYPH F038A +1312A ; [.4DA6.0020.0002] # EGYPTIAN HIEROGLYPH F039 +1312B ; [.4DA7.0020.0002] # EGYPTIAN HIEROGLYPH F040 +1312C ; [.4DA8.0020.0002] # EGYPTIAN HIEROGLYPH F041 +1312D ; [.4DA9.0020.0002] # EGYPTIAN HIEROGLYPH F042 +1312E ; [.4DAA.0020.0002] # EGYPTIAN HIEROGLYPH F043 +1312F ; [.4DAB.0020.0002] # EGYPTIAN HIEROGLYPH F044 +13130 ; [.4DAC.0020.0002] # EGYPTIAN HIEROGLYPH F045 +13131 ; [.4DAD.0020.0002] # EGYPTIAN HIEROGLYPH F045A +13132 ; [.4DAE.0020.0002] # EGYPTIAN HIEROGLYPH F046 +13133 ; [.4DAF.0020.0002] # EGYPTIAN HIEROGLYPH F046A +13134 ; [.4DB0.0020.0002] # EGYPTIAN HIEROGLYPH F047 +13135 ; [.4DB1.0020.0002] # EGYPTIAN HIEROGLYPH F047A +13136 ; [.4DB2.0020.0002] # EGYPTIAN HIEROGLYPH F048 +13137 ; [.4DB3.0020.0002] # EGYPTIAN HIEROGLYPH F049 +13138 ; [.4DB4.0020.0002] # EGYPTIAN HIEROGLYPH F050 +13139 ; [.4DB5.0020.0002] # EGYPTIAN HIEROGLYPH F051 +1313A ; [.4DB6.0020.0002] # EGYPTIAN HIEROGLYPH F051A +1313B ; [.4DB7.0020.0002] # EGYPTIAN HIEROGLYPH F051B +1313C ; [.4DB8.0020.0002] # EGYPTIAN HIEROGLYPH F051C +1313D ; [.4DB9.0020.0002] # EGYPTIAN HIEROGLYPH F052 +1313E ; [.4DBA.0020.0002] # EGYPTIAN HIEROGLYPH F053 +1313F ; [.4DBB.0020.0002] # EGYPTIAN HIEROGLYPH G001 +13140 ; [.4DBC.0020.0002] # EGYPTIAN HIEROGLYPH G002 +13141 ; [.4DBD.0020.0002] # EGYPTIAN HIEROGLYPH G003 +13142 ; [.4DBE.0020.0002] # EGYPTIAN HIEROGLYPH G004 +13143 ; [.4DBF.0020.0002] # EGYPTIAN HIEROGLYPH G005 +13144 ; [.4DC0.0020.0002] # EGYPTIAN HIEROGLYPH G006 +13145 ; [.4DC1.0020.0002] # EGYPTIAN HIEROGLYPH G006A +13146 ; [.4DC2.0020.0002] # EGYPTIAN HIEROGLYPH G007 +13147 ; [.4DC3.0020.0002] # EGYPTIAN HIEROGLYPH G007A +13148 ; [.4DC4.0020.0002] # EGYPTIAN HIEROGLYPH G007B +13149 ; [.4DC5.0020.0002] # EGYPTIAN HIEROGLYPH G008 +1314A ; [.4DC6.0020.0002] # EGYPTIAN HIEROGLYPH G009 +1314B ; [.4DC7.0020.0002] # EGYPTIAN HIEROGLYPH G010 +1314C ; [.4DC8.0020.0002] # EGYPTIAN HIEROGLYPH G011 +1314D ; [.4DC9.0020.0002] # EGYPTIAN HIEROGLYPH G011A +1314E ; [.4DCA.0020.0002] # EGYPTIAN HIEROGLYPH G012 +1314F ; [.4DCB.0020.0002] # EGYPTIAN HIEROGLYPH G013 +13150 ; [.4DCC.0020.0002] # EGYPTIAN HIEROGLYPH G014 +13151 ; [.4DCD.0020.0002] # EGYPTIAN HIEROGLYPH G015 +13152 ; [.4DCE.0020.0002] # EGYPTIAN HIEROGLYPH G016 +13153 ; [.4DCF.0020.0002] # EGYPTIAN HIEROGLYPH G017 +13154 ; [.4DD0.0020.0002] # EGYPTIAN HIEROGLYPH G018 +13155 ; [.4DD1.0020.0002] # EGYPTIAN HIEROGLYPH G019 +13156 ; [.4DD2.0020.0002] # EGYPTIAN HIEROGLYPH G020 +13157 ; [.4DD3.0020.0002] # EGYPTIAN HIEROGLYPH G020A +13158 ; [.4DD4.0020.0002] # EGYPTIAN HIEROGLYPH G021 +13159 ; [.4DD5.0020.0002] # EGYPTIAN HIEROGLYPH G022 +1315A ; [.4DD6.0020.0002] # EGYPTIAN HIEROGLYPH G023 +1315B ; [.4DD7.0020.0002] # EGYPTIAN HIEROGLYPH G024 +1315C ; [.4DD8.0020.0002] # EGYPTIAN HIEROGLYPH G025 +1315D ; [.4DD9.0020.0002] # EGYPTIAN HIEROGLYPH G026 +1315E ; [.4DDA.0020.0002] # EGYPTIAN HIEROGLYPH G026A +1315F ; [.4DDB.0020.0002] # EGYPTIAN HIEROGLYPH G027 +13160 ; [.4DDC.0020.0002] # EGYPTIAN HIEROGLYPH G028 +13161 ; [.4DDD.0020.0002] # EGYPTIAN HIEROGLYPH G029 +13162 ; [.4DDE.0020.0002] # EGYPTIAN HIEROGLYPH G030 +13163 ; [.4DDF.0020.0002] # EGYPTIAN HIEROGLYPH G031 +13164 ; [.4DE0.0020.0002] # EGYPTIAN HIEROGLYPH G032 +13165 ; [.4DE1.0020.0002] # EGYPTIAN HIEROGLYPH G033 +13166 ; [.4DE2.0020.0002] # EGYPTIAN HIEROGLYPH G034 +13167 ; [.4DE3.0020.0002] # EGYPTIAN HIEROGLYPH G035 +13168 ; [.4DE4.0020.0002] # EGYPTIAN HIEROGLYPH G036 +13169 ; [.4DE5.0020.0002] # EGYPTIAN HIEROGLYPH G036A +1316A ; [.4DE6.0020.0002] # EGYPTIAN HIEROGLYPH G037 +1316B ; [.4DE7.0020.0002] # EGYPTIAN HIEROGLYPH G037A +1316C ; [.4DE8.0020.0002] # EGYPTIAN HIEROGLYPH G038 +1316D ; [.4DE9.0020.0002] # EGYPTIAN HIEROGLYPH G039 +1316E ; [.4DEA.0020.0002] # EGYPTIAN HIEROGLYPH G040 +1316F ; [.4DEB.0020.0002] # EGYPTIAN HIEROGLYPH G041 +13170 ; [.4DEC.0020.0002] # EGYPTIAN HIEROGLYPH G042 +13171 ; [.4DED.0020.0002] # EGYPTIAN HIEROGLYPH G043 +13172 ; [.4DEE.0020.0002] # EGYPTIAN HIEROGLYPH G043A +13173 ; [.4DEF.0020.0002] # EGYPTIAN HIEROGLYPH G044 +13174 ; [.4DF0.0020.0002] # EGYPTIAN HIEROGLYPH G045 +13175 ; [.4DF1.0020.0002] # EGYPTIAN HIEROGLYPH G045A +13176 ; [.4DF2.0020.0002] # EGYPTIAN HIEROGLYPH G046 +13177 ; [.4DF3.0020.0002] # EGYPTIAN HIEROGLYPH G047 +13178 ; [.4DF4.0020.0002] # EGYPTIAN HIEROGLYPH G048 +13179 ; [.4DF5.0020.0002] # EGYPTIAN HIEROGLYPH G049 +1317A ; [.4DF6.0020.0002] # EGYPTIAN HIEROGLYPH G050 +1317B ; [.4DF7.0020.0002] # EGYPTIAN HIEROGLYPH G051 +1317C ; [.4DF8.0020.0002] # EGYPTIAN HIEROGLYPH G052 +1317D ; [.4DF9.0020.0002] # EGYPTIAN HIEROGLYPH G053 +1317E ; [.4DFA.0020.0002] # EGYPTIAN HIEROGLYPH G054 +1317F ; [.4DFB.0020.0002] # EGYPTIAN HIEROGLYPH H001 +13180 ; [.4DFC.0020.0002] # EGYPTIAN HIEROGLYPH H002 +13181 ; [.4DFD.0020.0002] # EGYPTIAN HIEROGLYPH H003 +13182 ; [.4DFE.0020.0002] # EGYPTIAN HIEROGLYPH H004 +13183 ; [.4DFF.0020.0002] # EGYPTIAN HIEROGLYPH H005 +13184 ; [.4E00.0020.0002] # EGYPTIAN HIEROGLYPH H006 +13185 ; [.4E01.0020.0002] # EGYPTIAN HIEROGLYPH H006A +13186 ; [.4E02.0020.0002] # EGYPTIAN HIEROGLYPH H007 +13187 ; [.4E03.0020.0002] # EGYPTIAN HIEROGLYPH H008 +13188 ; [.4E04.0020.0002] # EGYPTIAN HIEROGLYPH I001 +13189 ; [.4E05.0020.0002] # EGYPTIAN HIEROGLYPH I002 +1318A ; [.4E06.0020.0002] # EGYPTIAN HIEROGLYPH I003 +1318B ; [.4E07.0020.0002] # EGYPTIAN HIEROGLYPH I004 +1318C ; [.4E08.0020.0002] # EGYPTIAN HIEROGLYPH I005 +1318D ; [.4E09.0020.0002] # EGYPTIAN HIEROGLYPH I005A +1318E ; [.4E0A.0020.0002] # EGYPTIAN HIEROGLYPH I006 +1318F ; [.4E0B.0020.0002] # EGYPTIAN HIEROGLYPH I007 +13190 ; [.4E0C.0020.0002] # EGYPTIAN HIEROGLYPH I008 +13191 ; [.4E0D.0020.0002] # EGYPTIAN HIEROGLYPH I009 +13192 ; [.4E0E.0020.0002] # EGYPTIAN HIEROGLYPH I009A +13193 ; [.4E0F.0020.0002] # EGYPTIAN HIEROGLYPH I010 +13194 ; [.4E10.0020.0002] # EGYPTIAN HIEROGLYPH I010A +13195 ; [.4E11.0020.0002] # EGYPTIAN HIEROGLYPH I011 +13196 ; [.4E12.0020.0002] # EGYPTIAN HIEROGLYPH I011A +13197 ; [.4E13.0020.0002] # EGYPTIAN HIEROGLYPH I012 +13198 ; [.4E14.0020.0002] # EGYPTIAN HIEROGLYPH I013 +13199 ; [.4E15.0020.0002] # EGYPTIAN HIEROGLYPH I014 +1319A ; [.4E16.0020.0002] # EGYPTIAN HIEROGLYPH I015 +1319B ; [.4E17.0020.0002] # EGYPTIAN HIEROGLYPH K001 +1319C ; [.4E18.0020.0002] # EGYPTIAN HIEROGLYPH K002 +1319D ; [.4E19.0020.0002] # EGYPTIAN HIEROGLYPH K003 +1319E ; [.4E1A.0020.0002] # EGYPTIAN HIEROGLYPH K004 +1319F ; [.4E1B.0020.0002] # EGYPTIAN HIEROGLYPH K005 +131A0 ; [.4E1C.0020.0002] # EGYPTIAN HIEROGLYPH K006 +131A1 ; [.4E1D.0020.0002] # EGYPTIAN HIEROGLYPH K007 +131A2 ; [.4E1E.0020.0002] # EGYPTIAN HIEROGLYPH K008 +131A3 ; [.4E1F.0020.0002] # EGYPTIAN HIEROGLYPH L001 +131A4 ; [.4E20.0020.0002] # EGYPTIAN HIEROGLYPH L002 +131A5 ; [.4E21.0020.0002] # EGYPTIAN HIEROGLYPH L002A +131A6 ; [.4E22.0020.0002] # EGYPTIAN HIEROGLYPH L003 +131A7 ; [.4E23.0020.0002] # EGYPTIAN HIEROGLYPH L004 +131A8 ; [.4E24.0020.0002] # EGYPTIAN HIEROGLYPH L005 +131A9 ; [.4E25.0020.0002] # EGYPTIAN HIEROGLYPH L006 +131AA ; [.4E26.0020.0002] # EGYPTIAN HIEROGLYPH L006A +131AB ; [.4E27.0020.0002] # EGYPTIAN HIEROGLYPH L007 +131AC ; [.4E28.0020.0002] # EGYPTIAN HIEROGLYPH L008 +131AD ; [.4E29.0020.0002] # EGYPTIAN HIEROGLYPH M001 +131AE ; [.4E2A.0020.0002] # EGYPTIAN HIEROGLYPH M001A +131AF ; [.4E2B.0020.0002] # EGYPTIAN HIEROGLYPH M001B +131B0 ; [.4E2C.0020.0002] # EGYPTIAN HIEROGLYPH M002 +131B1 ; [.4E2D.0020.0002] # EGYPTIAN HIEROGLYPH M003 +131B2 ; [.4E2E.0020.0002] # EGYPTIAN HIEROGLYPH M003A +131B3 ; [.4E2F.0020.0002] # EGYPTIAN HIEROGLYPH M004 +131B4 ; [.4E30.0020.0002] # EGYPTIAN HIEROGLYPH M005 +131B5 ; [.4E31.0020.0002] # EGYPTIAN HIEROGLYPH M006 +131B6 ; [.4E32.0020.0002] # EGYPTIAN HIEROGLYPH M007 +131B7 ; [.4E33.0020.0002] # EGYPTIAN HIEROGLYPH M008 +131B8 ; [.4E34.0020.0002] # EGYPTIAN HIEROGLYPH M009 +131B9 ; [.4E35.0020.0002] # EGYPTIAN HIEROGLYPH M010 +131BA ; [.4E36.0020.0002] # EGYPTIAN HIEROGLYPH M010A +131BB ; [.4E37.0020.0002] # EGYPTIAN HIEROGLYPH M011 +131BC ; [.4E38.0020.0002] # EGYPTIAN HIEROGLYPH M012 +131BD ; [.4E39.0020.0002] # EGYPTIAN HIEROGLYPH M012A +131BE ; [.4E3A.0020.0002] # EGYPTIAN HIEROGLYPH M012B +131BF ; [.4E3B.0020.0002] # EGYPTIAN HIEROGLYPH M012C +131C0 ; [.4E3C.0020.0002] # EGYPTIAN HIEROGLYPH M012D +131C1 ; [.4E3D.0020.0002] # EGYPTIAN HIEROGLYPH M012E +131C2 ; [.4E3E.0020.0002] # EGYPTIAN HIEROGLYPH M012F +131C3 ; [.4E3F.0020.0002] # EGYPTIAN HIEROGLYPH M012G +131C4 ; [.4E40.0020.0002] # EGYPTIAN HIEROGLYPH M012H +131C5 ; [.4E41.0020.0002] # EGYPTIAN HIEROGLYPH M013 +131C6 ; [.4E42.0020.0002] # EGYPTIAN HIEROGLYPH M014 +131C7 ; [.4E43.0020.0002] # EGYPTIAN HIEROGLYPH M015 +131C8 ; [.4E44.0020.0002] # EGYPTIAN HIEROGLYPH M015A +131C9 ; [.4E45.0020.0002] # EGYPTIAN HIEROGLYPH M016 +131CA ; [.4E46.0020.0002] # EGYPTIAN HIEROGLYPH M016A +131CB ; [.4E47.0020.0002] # EGYPTIAN HIEROGLYPH M017 +131CC ; [.4E48.0020.0002] # EGYPTIAN HIEROGLYPH M017A +131CD ; [.4E49.0020.0002] # EGYPTIAN HIEROGLYPH M018 +131CE ; [.4E4A.0020.0002] # EGYPTIAN HIEROGLYPH M019 +131CF ; [.4E4B.0020.0002] # EGYPTIAN HIEROGLYPH M020 +131D0 ; [.4E4C.0020.0002] # EGYPTIAN HIEROGLYPH M021 +131D1 ; [.4E4D.0020.0002] # EGYPTIAN HIEROGLYPH M022 +131D2 ; [.4E4E.0020.0002] # EGYPTIAN HIEROGLYPH M022A +131D3 ; [.4E4F.0020.0002] # EGYPTIAN HIEROGLYPH M023 +131D4 ; [.4E50.0020.0002] # EGYPTIAN HIEROGLYPH M024 +131D5 ; [.4E51.0020.0002] # EGYPTIAN HIEROGLYPH M024A +131D6 ; [.4E52.0020.0002] # EGYPTIAN HIEROGLYPH M025 +131D7 ; [.4E53.0020.0002] # EGYPTIAN HIEROGLYPH M026 +131D8 ; [.4E54.0020.0002] # EGYPTIAN HIEROGLYPH M027 +131D9 ; [.4E55.0020.0002] # EGYPTIAN HIEROGLYPH M028 +131DA ; [.4E56.0020.0002] # EGYPTIAN HIEROGLYPH M028A +131DB ; [.4E57.0020.0002] # EGYPTIAN HIEROGLYPH M029 +131DC ; [.4E58.0020.0002] # EGYPTIAN HIEROGLYPH M030 +131DD ; [.4E59.0020.0002] # EGYPTIAN HIEROGLYPH M031 +131DE ; [.4E5A.0020.0002] # EGYPTIAN HIEROGLYPH M031A +131DF ; [.4E5B.0020.0002] # EGYPTIAN HIEROGLYPH M032 +131E0 ; [.4E5C.0020.0002] # EGYPTIAN HIEROGLYPH M033 +131E1 ; [.4E5D.0020.0002] # EGYPTIAN HIEROGLYPH M033A +131E2 ; [.4E5E.0020.0002] # EGYPTIAN HIEROGLYPH M033B +131E3 ; [.4E5F.0020.0002] # EGYPTIAN HIEROGLYPH M034 +131E4 ; [.4E60.0020.0002] # EGYPTIAN HIEROGLYPH M035 +131E5 ; [.4E61.0020.0002] # EGYPTIAN HIEROGLYPH M036 +131E6 ; [.4E62.0020.0002] # EGYPTIAN HIEROGLYPH M037 +131E7 ; [.4E63.0020.0002] # EGYPTIAN HIEROGLYPH M038 +131E8 ; [.4E64.0020.0002] # EGYPTIAN HIEROGLYPH M039 +131E9 ; [.4E65.0020.0002] # EGYPTIAN HIEROGLYPH M040 +131EA ; [.4E66.0020.0002] # EGYPTIAN HIEROGLYPH M040A +131EB ; [.4E67.0020.0002] # EGYPTIAN HIEROGLYPH M041 +131EC ; [.4E68.0020.0002] # EGYPTIAN HIEROGLYPH M042 +131ED ; [.4E69.0020.0002] # EGYPTIAN HIEROGLYPH M043 +131EE ; [.4E6A.0020.0002] # EGYPTIAN HIEROGLYPH M044 +131EF ; [.4E6B.0020.0002] # EGYPTIAN HIEROGLYPH N001 +131F0 ; [.4E6C.0020.0002] # EGYPTIAN HIEROGLYPH N002 +131F1 ; [.4E6D.0020.0002] # EGYPTIAN HIEROGLYPH N003 +131F2 ; [.4E6E.0020.0002] # EGYPTIAN HIEROGLYPH N004 +131F3 ; [.4E6F.0020.0002] # EGYPTIAN HIEROGLYPH N005 +131F4 ; [.4E70.0020.0002] # EGYPTIAN HIEROGLYPH N006 +131F5 ; [.4E71.0020.0002] # EGYPTIAN HIEROGLYPH N007 +131F6 ; [.4E72.0020.0002] # EGYPTIAN HIEROGLYPH N008 +131F7 ; [.4E73.0020.0002] # EGYPTIAN HIEROGLYPH N009 +131F8 ; [.4E74.0020.0002] # EGYPTIAN HIEROGLYPH N010 +131F9 ; [.4E75.0020.0002] # EGYPTIAN HIEROGLYPH N011 +131FA ; [.4E76.0020.0002] # EGYPTIAN HIEROGLYPH N012 +131FB ; [.4E77.0020.0002] # EGYPTIAN HIEROGLYPH N013 +131FC ; [.4E78.0020.0002] # EGYPTIAN HIEROGLYPH N014 +131FD ; [.4E79.0020.0002] # EGYPTIAN HIEROGLYPH N015 +131FE ; [.4E7A.0020.0002] # EGYPTIAN HIEROGLYPH N016 +131FF ; [.4E7B.0020.0002] # EGYPTIAN HIEROGLYPH N017 +13200 ; [.4E7C.0020.0002] # EGYPTIAN HIEROGLYPH N018 +13201 ; [.4E7D.0020.0002] # EGYPTIAN HIEROGLYPH N018A +13202 ; [.4E7E.0020.0002] # EGYPTIAN HIEROGLYPH N018B +13203 ; [.4E7F.0020.0002] # EGYPTIAN HIEROGLYPH N019 +13204 ; [.4E80.0020.0002] # EGYPTIAN HIEROGLYPH N020 +13205 ; [.4E81.0020.0002] # EGYPTIAN HIEROGLYPH N021 +13206 ; [.4E82.0020.0002] # EGYPTIAN HIEROGLYPH N022 +13207 ; [.4E83.0020.0002] # EGYPTIAN HIEROGLYPH N023 +13208 ; [.4E84.0020.0002] # EGYPTIAN HIEROGLYPH N024 +13209 ; [.4E85.0020.0002] # EGYPTIAN HIEROGLYPH N025 +1320A ; [.4E86.0020.0002] # EGYPTIAN HIEROGLYPH N025A +1320B ; [.4E87.0020.0002] # EGYPTIAN HIEROGLYPH N026 +1320C ; [.4E88.0020.0002] # EGYPTIAN HIEROGLYPH N027 +1320D ; [.4E89.0020.0002] # EGYPTIAN HIEROGLYPH N028 +1320E ; [.4E8A.0020.0002] # EGYPTIAN HIEROGLYPH N029 +1320F ; [.4E8B.0020.0002] # EGYPTIAN HIEROGLYPH N030 +13210 ; [.4E8C.0020.0002] # EGYPTIAN HIEROGLYPH N031 +13211 ; [.4E8D.0020.0002] # EGYPTIAN HIEROGLYPH N032 +13212 ; [.4E8E.0020.0002] # EGYPTIAN HIEROGLYPH N033 +13213 ; [.4E8F.0020.0002] # EGYPTIAN HIEROGLYPH N033A +13214 ; [.4E90.0020.0002] # EGYPTIAN HIEROGLYPH N034 +13215 ; [.4E91.0020.0002] # EGYPTIAN HIEROGLYPH N034A +13216 ; [.4E92.0020.0002] # EGYPTIAN HIEROGLYPH N035 +13217 ; [.4E93.0020.0002] # EGYPTIAN HIEROGLYPH N035A +13218 ; [.4E94.0020.0002] # EGYPTIAN HIEROGLYPH N036 +13219 ; [.4E95.0020.0002] # EGYPTIAN HIEROGLYPH N037 +1321A ; [.4E96.0020.0002] # EGYPTIAN HIEROGLYPH N037A +1321B ; [.4E97.0020.0002] # EGYPTIAN HIEROGLYPH N038 +1321C ; [.4E98.0020.0002] # EGYPTIAN HIEROGLYPH N039 +1321D ; [.4E99.0020.0002] # EGYPTIAN HIEROGLYPH N040 +1321E ; [.4E9A.0020.0002] # EGYPTIAN HIEROGLYPH N041 +1321F ; [.4E9B.0020.0002] # EGYPTIAN HIEROGLYPH N042 +13220 ; [.4E9C.0020.0002] # EGYPTIAN HIEROGLYPH NL001 +13221 ; [.4E9D.0020.0002] # EGYPTIAN HIEROGLYPH NL002 +13222 ; [.4E9E.0020.0002] # EGYPTIAN HIEROGLYPH NL003 +13223 ; [.4E9F.0020.0002] # EGYPTIAN HIEROGLYPH NL004 +13224 ; [.4EA0.0020.0002] # EGYPTIAN HIEROGLYPH NL005 +13225 ; [.4EA1.0020.0002] # EGYPTIAN HIEROGLYPH NL005A +13226 ; [.4EA2.0020.0002] # EGYPTIAN HIEROGLYPH NL006 +13227 ; [.4EA3.0020.0002] # EGYPTIAN HIEROGLYPH NL007 +13228 ; [.4EA4.0020.0002] # EGYPTIAN HIEROGLYPH NL008 +13229 ; [.4EA5.0020.0002] # EGYPTIAN HIEROGLYPH NL009 +1322A ; [.4EA6.0020.0002] # EGYPTIAN HIEROGLYPH NL010 +1322B ; [.4EA7.0020.0002] # EGYPTIAN HIEROGLYPH NL011 +1322C ; [.4EA8.0020.0002] # EGYPTIAN HIEROGLYPH NL012 +1322D ; [.4EA9.0020.0002] # EGYPTIAN HIEROGLYPH NL013 +1322E ; [.4EAA.0020.0002] # EGYPTIAN HIEROGLYPH NL014 +1322F ; [.4EAB.0020.0002] # EGYPTIAN HIEROGLYPH NL015 +13230 ; [.4EAC.0020.0002] # EGYPTIAN HIEROGLYPH NL016 +13231 ; [.4EAD.0020.0002] # EGYPTIAN HIEROGLYPH NL017 +13232 ; [.4EAE.0020.0002] # EGYPTIAN HIEROGLYPH NL017A +13233 ; [.4EAF.0020.0002] # EGYPTIAN HIEROGLYPH NL018 +13234 ; [.4EB0.0020.0002] # EGYPTIAN HIEROGLYPH NL019 +13235 ; [.4EB1.0020.0002] # EGYPTIAN HIEROGLYPH NL020 +13236 ; [.4EB2.0020.0002] # EGYPTIAN HIEROGLYPH NU001 +13237 ; [.4EB3.0020.0002] # EGYPTIAN HIEROGLYPH NU002 +13238 ; [.4EB4.0020.0002] # EGYPTIAN HIEROGLYPH NU003 +13239 ; [.4EB5.0020.0002] # EGYPTIAN HIEROGLYPH NU004 +1323A ; [.4EB6.0020.0002] # EGYPTIAN HIEROGLYPH NU005 +1323B ; [.4EB7.0020.0002] # EGYPTIAN HIEROGLYPH NU006 +1323C ; [.4EB8.0020.0002] # EGYPTIAN HIEROGLYPH NU007 +1323D ; [.4EB9.0020.0002] # EGYPTIAN HIEROGLYPH NU008 +1323E ; [.4EBA.0020.0002] # EGYPTIAN HIEROGLYPH NU009 +1323F ; [.4EBB.0020.0002] # EGYPTIAN HIEROGLYPH NU010 +13240 ; [.4EBC.0020.0002] # EGYPTIAN HIEROGLYPH NU010A +13241 ; [.4EBD.0020.0002] # EGYPTIAN HIEROGLYPH NU011 +13242 ; [.4EBE.0020.0002] # EGYPTIAN HIEROGLYPH NU011A +13243 ; [.4EBF.0020.0002] # EGYPTIAN HIEROGLYPH NU012 +13244 ; [.4EC0.0020.0002] # EGYPTIAN HIEROGLYPH NU013 +13245 ; [.4EC1.0020.0002] # EGYPTIAN HIEROGLYPH NU014 +13246 ; [.4EC2.0020.0002] # EGYPTIAN HIEROGLYPH NU015 +13247 ; [.4EC3.0020.0002] # EGYPTIAN HIEROGLYPH NU016 +13248 ; [.4EC4.0020.0002] # EGYPTIAN HIEROGLYPH NU017 +13249 ; [.4EC5.0020.0002] # EGYPTIAN HIEROGLYPH NU018 +1324A ; [.4EC6.0020.0002] # EGYPTIAN HIEROGLYPH NU018A +1324B ; [.4EC7.0020.0002] # EGYPTIAN HIEROGLYPH NU019 +1324C ; [.4EC8.0020.0002] # EGYPTIAN HIEROGLYPH NU020 +1324D ; [.4EC9.0020.0002] # EGYPTIAN HIEROGLYPH NU021 +1324E ; [.4ECA.0020.0002] # EGYPTIAN HIEROGLYPH NU022 +1324F ; [.4ECB.0020.0002] # EGYPTIAN HIEROGLYPH NU022A +13250 ; [.4ECC.0020.0002] # EGYPTIAN HIEROGLYPH O001 +13251 ; [.4ECD.0020.0002] # EGYPTIAN HIEROGLYPH O001A +13252 ; [.4ECE.0020.0002] # EGYPTIAN HIEROGLYPH O002 +13253 ; [.4ECF.0020.0002] # EGYPTIAN HIEROGLYPH O003 +13254 ; [.4ED0.0020.0002] # EGYPTIAN HIEROGLYPH O004 +13255 ; [.4ED1.0020.0002] # EGYPTIAN HIEROGLYPH O005 +13256 ; [.4ED2.0020.0002] # EGYPTIAN HIEROGLYPH O005A +13257 ; [.4ED3.0020.0002] # EGYPTIAN HIEROGLYPH O006 +13258 ; [.4ED4.0020.0002] # EGYPTIAN HIEROGLYPH O006A +13259 ; [.4ED5.0020.0002] # EGYPTIAN HIEROGLYPH O006B +1325A ; [.4ED6.0020.0002] # EGYPTIAN HIEROGLYPH O006C +1325B ; [.4ED7.0020.0002] # EGYPTIAN HIEROGLYPH O006D +1325C ; [.4ED8.0020.0002] # EGYPTIAN HIEROGLYPH O006E +1325D ; [.4ED9.0020.0002] # EGYPTIAN HIEROGLYPH O006F +1325E ; [.4EDA.0020.0002] # EGYPTIAN HIEROGLYPH O007 +1325F ; [.4EDB.0020.0002] # EGYPTIAN HIEROGLYPH O008 +13260 ; [.4EDC.0020.0002] # EGYPTIAN HIEROGLYPH O009 +13261 ; [.4EDD.0020.0002] # EGYPTIAN HIEROGLYPH O010 +13262 ; [.4EDE.0020.0002] # EGYPTIAN HIEROGLYPH O010A +13263 ; [.4EDF.0020.0002] # EGYPTIAN HIEROGLYPH O010B +13264 ; [.4EE0.0020.0002] # EGYPTIAN HIEROGLYPH O010C +13265 ; [.4EE1.0020.0002] # EGYPTIAN HIEROGLYPH O011 +13266 ; [.4EE2.0020.0002] # EGYPTIAN HIEROGLYPH O012 +13267 ; [.4EE3.0020.0002] # EGYPTIAN HIEROGLYPH O013 +13268 ; [.4EE4.0020.0002] # EGYPTIAN HIEROGLYPH O014 +13269 ; [.4EE5.0020.0002] # EGYPTIAN HIEROGLYPH O015 +1326A ; [.4EE6.0020.0002] # EGYPTIAN HIEROGLYPH O016 +1326B ; [.4EE7.0020.0002] # EGYPTIAN HIEROGLYPH O017 +1326C ; [.4EE8.0020.0002] # EGYPTIAN HIEROGLYPH O018 +1326D ; [.4EE9.0020.0002] # EGYPTIAN HIEROGLYPH O019 +1326E ; [.4EEA.0020.0002] # EGYPTIAN HIEROGLYPH O019A +1326F ; [.4EEB.0020.0002] # EGYPTIAN HIEROGLYPH O020 +13270 ; [.4EEC.0020.0002] # EGYPTIAN HIEROGLYPH O020A +13271 ; [.4EED.0020.0002] # EGYPTIAN HIEROGLYPH O021 +13272 ; [.4EEE.0020.0002] # EGYPTIAN HIEROGLYPH O022 +13273 ; [.4EEF.0020.0002] # EGYPTIAN HIEROGLYPH O023 +13274 ; [.4EF0.0020.0002] # EGYPTIAN HIEROGLYPH O024 +13275 ; [.4EF1.0020.0002] # EGYPTIAN HIEROGLYPH O024A +13276 ; [.4EF2.0020.0002] # EGYPTIAN HIEROGLYPH O025 +13277 ; [.4EF3.0020.0002] # EGYPTIAN HIEROGLYPH O025A +13278 ; [.4EF4.0020.0002] # EGYPTIAN HIEROGLYPH O026 +13279 ; [.4EF5.0020.0002] # EGYPTIAN HIEROGLYPH O027 +1327A ; [.4EF6.0020.0002] # EGYPTIAN HIEROGLYPH O028 +1327B ; [.4EF7.0020.0002] # EGYPTIAN HIEROGLYPH O029 +1327C ; [.4EF8.0020.0002] # EGYPTIAN HIEROGLYPH O029A +1327D ; [.4EF9.0020.0002] # EGYPTIAN HIEROGLYPH O030 +1327E ; [.4EFA.0020.0002] # EGYPTIAN HIEROGLYPH O030A +1327F ; [.4EFB.0020.0002] # EGYPTIAN HIEROGLYPH O031 +13280 ; [.4EFC.0020.0002] # EGYPTIAN HIEROGLYPH O032 +13281 ; [.4EFD.0020.0002] # EGYPTIAN HIEROGLYPH O033 +13282 ; [.4EFE.0020.0002] # EGYPTIAN HIEROGLYPH O033A +13283 ; [.4EFF.0020.0002] # EGYPTIAN HIEROGLYPH O034 +13284 ; [.4F00.0020.0002] # EGYPTIAN HIEROGLYPH O035 +13285 ; [.4F01.0020.0002] # EGYPTIAN HIEROGLYPH O036 +13286 ; [.4F02.0020.0002] # EGYPTIAN HIEROGLYPH O036A +13287 ; [.4F03.0020.0002] # EGYPTIAN HIEROGLYPH O036B +13288 ; [.4F04.0020.0002] # EGYPTIAN HIEROGLYPH O036C +13289 ; [.4F05.0020.0002] # EGYPTIAN HIEROGLYPH O036D +1328A ; [.4F06.0020.0002] # EGYPTIAN HIEROGLYPH O037 +1328B ; [.4F07.0020.0002] # EGYPTIAN HIEROGLYPH O038 +1328C ; [.4F08.0020.0002] # EGYPTIAN HIEROGLYPH O039 +1328D ; [.4F09.0020.0002] # EGYPTIAN HIEROGLYPH O040 +1328E ; [.4F0A.0020.0002] # EGYPTIAN HIEROGLYPH O041 +1328F ; [.4F0B.0020.0002] # EGYPTIAN HIEROGLYPH O042 +13290 ; [.4F0C.0020.0002] # EGYPTIAN HIEROGLYPH O043 +13291 ; [.4F0D.0020.0002] # EGYPTIAN HIEROGLYPH O044 +13292 ; [.4F0E.0020.0002] # EGYPTIAN HIEROGLYPH O045 +13293 ; [.4F0F.0020.0002] # EGYPTIAN HIEROGLYPH O046 +13294 ; [.4F10.0020.0002] # EGYPTIAN HIEROGLYPH O047 +13295 ; [.4F11.0020.0002] # EGYPTIAN HIEROGLYPH O048 +13296 ; [.4F12.0020.0002] # EGYPTIAN HIEROGLYPH O049 +13297 ; [.4F13.0020.0002] # EGYPTIAN HIEROGLYPH O050 +13298 ; [.4F14.0020.0002] # EGYPTIAN HIEROGLYPH O050A +13299 ; [.4F15.0020.0002] # EGYPTIAN HIEROGLYPH O050B +1329A ; [.4F16.0020.0002] # EGYPTIAN HIEROGLYPH O051 +1329B ; [.4F17.0020.0002] # EGYPTIAN HIEROGLYPH P001 +1329C ; [.4F18.0020.0002] # EGYPTIAN HIEROGLYPH P001A +1329D ; [.4F19.0020.0002] # EGYPTIAN HIEROGLYPH P002 +1329E ; [.4F1A.0020.0002] # EGYPTIAN HIEROGLYPH P003 +1329F ; [.4F1B.0020.0002] # EGYPTIAN HIEROGLYPH P003A +132A0 ; [.4F1C.0020.0002] # EGYPTIAN HIEROGLYPH P004 +132A1 ; [.4F1D.0020.0002] # EGYPTIAN HIEROGLYPH P005 +132A2 ; [.4F1E.0020.0002] # EGYPTIAN HIEROGLYPH P006 +132A3 ; [.4F1F.0020.0002] # EGYPTIAN HIEROGLYPH P007 +132A4 ; [.4F20.0020.0002] # EGYPTIAN HIEROGLYPH P008 +132A5 ; [.4F21.0020.0002] # EGYPTIAN HIEROGLYPH P009 +132A6 ; [.4F22.0020.0002] # EGYPTIAN HIEROGLYPH P010 +132A7 ; [.4F23.0020.0002] # EGYPTIAN HIEROGLYPH P011 +132A8 ; [.4F24.0020.0002] # EGYPTIAN HIEROGLYPH Q001 +132A9 ; [.4F25.0020.0002] # EGYPTIAN HIEROGLYPH Q002 +132AA ; [.4F26.0020.0002] # EGYPTIAN HIEROGLYPH Q003 +132AB ; [.4F27.0020.0002] # EGYPTIAN HIEROGLYPH Q004 +132AC ; [.4F28.0020.0002] # EGYPTIAN HIEROGLYPH Q005 +132AD ; [.4F29.0020.0002] # EGYPTIAN HIEROGLYPH Q006 +132AE ; [.4F2A.0020.0002] # EGYPTIAN HIEROGLYPH Q007 +132AF ; [.4F2B.0020.0002] # EGYPTIAN HIEROGLYPH R001 +132B0 ; [.4F2C.0020.0002] # EGYPTIAN HIEROGLYPH R002 +132B1 ; [.4F2D.0020.0002] # EGYPTIAN HIEROGLYPH R002A +132B2 ; [.4F2E.0020.0002] # EGYPTIAN HIEROGLYPH R003 +132B3 ; [.4F2F.0020.0002] # EGYPTIAN HIEROGLYPH R003A +132B4 ; [.4F30.0020.0002] # EGYPTIAN HIEROGLYPH R003B +132B5 ; [.4F31.0020.0002] # EGYPTIAN HIEROGLYPH R004 +132B6 ; [.4F32.0020.0002] # EGYPTIAN HIEROGLYPH R005 +132B7 ; [.4F33.0020.0002] # EGYPTIAN HIEROGLYPH R006 +132B8 ; [.4F34.0020.0002] # EGYPTIAN HIEROGLYPH R007 +132B9 ; [.4F35.0020.0002] # EGYPTIAN HIEROGLYPH R008 +132BA ; [.4F36.0020.0002] # EGYPTIAN HIEROGLYPH R009 +132BB ; [.4F37.0020.0002] # EGYPTIAN HIEROGLYPH R010 +132BC ; [.4F38.0020.0002] # EGYPTIAN HIEROGLYPH R010A +132BD ; [.4F39.0020.0002] # EGYPTIAN HIEROGLYPH R011 +132BE ; [.4F3A.0020.0002] # EGYPTIAN HIEROGLYPH R012 +132BF ; [.4F3B.0020.0002] # EGYPTIAN HIEROGLYPH R013 +132C0 ; [.4F3C.0020.0002] # EGYPTIAN HIEROGLYPH R014 +132C1 ; [.4F3D.0020.0002] # EGYPTIAN HIEROGLYPH R015 +132C2 ; [.4F3E.0020.0002] # EGYPTIAN HIEROGLYPH R016 +132C3 ; [.4F3F.0020.0002] # EGYPTIAN HIEROGLYPH R016A +132C4 ; [.4F40.0020.0002] # EGYPTIAN HIEROGLYPH R017 +132C5 ; [.4F41.0020.0002] # EGYPTIAN HIEROGLYPH R018 +132C6 ; [.4F42.0020.0002] # EGYPTIAN HIEROGLYPH R019 +132C7 ; [.4F43.0020.0002] # EGYPTIAN HIEROGLYPH R020 +132C8 ; [.4F44.0020.0002] # EGYPTIAN HIEROGLYPH R021 +132C9 ; [.4F45.0020.0002] # EGYPTIAN HIEROGLYPH R022 +132CA ; [.4F46.0020.0002] # EGYPTIAN HIEROGLYPH R023 +132CB ; [.4F47.0020.0002] # EGYPTIAN HIEROGLYPH R024 +132CC ; [.4F48.0020.0002] # EGYPTIAN HIEROGLYPH R025 +132CD ; [.4F49.0020.0002] # EGYPTIAN HIEROGLYPH R026 +132CE ; [.4F4A.0020.0002] # EGYPTIAN HIEROGLYPH R027 +132CF ; [.4F4B.0020.0002] # EGYPTIAN HIEROGLYPH R028 +132D0 ; [.4F4C.0020.0002] # EGYPTIAN HIEROGLYPH R029 +132D1 ; [.4F4D.0020.0002] # EGYPTIAN HIEROGLYPH S001 +132D2 ; [.4F4E.0020.0002] # EGYPTIAN HIEROGLYPH S002 +132D3 ; [.4F4F.0020.0002] # EGYPTIAN HIEROGLYPH S002A +132D4 ; [.4F50.0020.0002] # EGYPTIAN HIEROGLYPH S003 +132D5 ; [.4F51.0020.0002] # EGYPTIAN HIEROGLYPH S004 +132D6 ; [.4F52.0020.0002] # EGYPTIAN HIEROGLYPH S005 +132D7 ; [.4F53.0020.0002] # EGYPTIAN HIEROGLYPH S006 +132D8 ; [.4F54.0020.0002] # EGYPTIAN HIEROGLYPH S006A +132D9 ; [.4F55.0020.0002] # EGYPTIAN HIEROGLYPH S007 +132DA ; [.4F56.0020.0002] # EGYPTIAN HIEROGLYPH S008 +132DB ; [.4F57.0020.0002] # EGYPTIAN HIEROGLYPH S009 +132DC ; [.4F58.0020.0002] # EGYPTIAN HIEROGLYPH S010 +132DD ; [.4F59.0020.0002] # EGYPTIAN HIEROGLYPH S011 +132DE ; [.4F5A.0020.0002] # EGYPTIAN HIEROGLYPH S012 +132DF ; [.4F5B.0020.0002] # EGYPTIAN HIEROGLYPH S013 +132E0 ; [.4F5C.0020.0002] # EGYPTIAN HIEROGLYPH S014 +132E1 ; [.4F5D.0020.0002] # EGYPTIAN HIEROGLYPH S014A +132E2 ; [.4F5E.0020.0002] # EGYPTIAN HIEROGLYPH S014B +132E3 ; [.4F5F.0020.0002] # EGYPTIAN HIEROGLYPH S015 +132E4 ; [.4F60.0020.0002] # EGYPTIAN HIEROGLYPH S016 +132E5 ; [.4F61.0020.0002] # EGYPTIAN HIEROGLYPH S017 +132E6 ; [.4F62.0020.0002] # EGYPTIAN HIEROGLYPH S017A +132E7 ; [.4F63.0020.0002] # EGYPTIAN HIEROGLYPH S018 +132E8 ; [.4F64.0020.0002] # EGYPTIAN HIEROGLYPH S019 +132E9 ; [.4F65.0020.0002] # EGYPTIAN HIEROGLYPH S020 +132EA ; [.4F66.0020.0002] # EGYPTIAN HIEROGLYPH S021 +132EB ; [.4F67.0020.0002] # EGYPTIAN HIEROGLYPH S022 +132EC ; [.4F68.0020.0002] # EGYPTIAN HIEROGLYPH S023 +132ED ; [.4F69.0020.0002] # EGYPTIAN HIEROGLYPH S024 +132EE ; [.4F6A.0020.0002] # EGYPTIAN HIEROGLYPH S025 +132EF ; [.4F6B.0020.0002] # EGYPTIAN HIEROGLYPH S026 +132F0 ; [.4F6C.0020.0002] # EGYPTIAN HIEROGLYPH S026A +132F1 ; [.4F6D.0020.0002] # EGYPTIAN HIEROGLYPH S026B +132F2 ; [.4F6E.0020.0002] # EGYPTIAN HIEROGLYPH S027 +132F3 ; [.4F6F.0020.0002] # EGYPTIAN HIEROGLYPH S028 +132F4 ; [.4F70.0020.0002] # EGYPTIAN HIEROGLYPH S029 +132F5 ; [.4F71.0020.0002] # EGYPTIAN HIEROGLYPH S030 +132F6 ; [.4F72.0020.0002] # EGYPTIAN HIEROGLYPH S031 +132F7 ; [.4F73.0020.0002] # EGYPTIAN HIEROGLYPH S032 +132F8 ; [.4F74.0020.0002] # EGYPTIAN HIEROGLYPH S033 +132F9 ; [.4F75.0020.0002] # EGYPTIAN HIEROGLYPH S034 +132FA ; [.4F76.0020.0002] # EGYPTIAN HIEROGLYPH S035 +132FB ; [.4F77.0020.0002] # EGYPTIAN HIEROGLYPH S035A +132FC ; [.4F78.0020.0002] # EGYPTIAN HIEROGLYPH S036 +132FD ; [.4F79.0020.0002] # EGYPTIAN HIEROGLYPH S037 +132FE ; [.4F7A.0020.0002] # EGYPTIAN HIEROGLYPH S038 +132FF ; [.4F7B.0020.0002] # EGYPTIAN HIEROGLYPH S039 +13300 ; [.4F7C.0020.0002] # EGYPTIAN HIEROGLYPH S040 +13301 ; [.4F7D.0020.0002] # EGYPTIAN HIEROGLYPH S041 +13302 ; [.4F7E.0020.0002] # EGYPTIAN HIEROGLYPH S042 +13303 ; [.4F7F.0020.0002] # EGYPTIAN HIEROGLYPH S043 +13304 ; [.4F80.0020.0002] # EGYPTIAN HIEROGLYPH S044 +13305 ; [.4F81.0020.0002] # EGYPTIAN HIEROGLYPH S045 +13306 ; [.4F82.0020.0002] # EGYPTIAN HIEROGLYPH S046 +13307 ; [.4F83.0020.0002] # EGYPTIAN HIEROGLYPH T001 +13308 ; [.4F84.0020.0002] # EGYPTIAN HIEROGLYPH T002 +13309 ; [.4F85.0020.0002] # EGYPTIAN HIEROGLYPH T003 +1330A ; [.4F86.0020.0002] # EGYPTIAN HIEROGLYPH T003A +1330B ; [.4F87.0020.0002] # EGYPTIAN HIEROGLYPH T004 +1330C ; [.4F88.0020.0002] # EGYPTIAN HIEROGLYPH T005 +1330D ; [.4F89.0020.0002] # EGYPTIAN HIEROGLYPH T006 +1330E ; [.4F8A.0020.0002] # EGYPTIAN HIEROGLYPH T007 +1330F ; [.4F8B.0020.0002] # EGYPTIAN HIEROGLYPH T007A +13310 ; [.4F8C.0020.0002] # EGYPTIAN HIEROGLYPH T008 +13311 ; [.4F8D.0020.0002] # EGYPTIAN HIEROGLYPH T008A +13312 ; [.4F8E.0020.0002] # EGYPTIAN HIEROGLYPH T009 +13313 ; [.4F8F.0020.0002] # EGYPTIAN HIEROGLYPH T009A +13314 ; [.4F90.0020.0002] # EGYPTIAN HIEROGLYPH T010 +13315 ; [.4F91.0020.0002] # EGYPTIAN HIEROGLYPH T011 +13316 ; [.4F92.0020.0002] # EGYPTIAN HIEROGLYPH T011A +13317 ; [.4F93.0020.0002] # EGYPTIAN HIEROGLYPH T012 +13318 ; [.4F94.0020.0002] # EGYPTIAN HIEROGLYPH T013 +13319 ; [.4F95.0020.0002] # EGYPTIAN HIEROGLYPH T014 +1331A ; [.4F96.0020.0002] # EGYPTIAN HIEROGLYPH T015 +1331B ; [.4F97.0020.0002] # EGYPTIAN HIEROGLYPH T016 +1331C ; [.4F98.0020.0002] # EGYPTIAN HIEROGLYPH T016A +1331D ; [.4F99.0020.0002] # EGYPTIAN HIEROGLYPH T017 +1331E ; [.4F9A.0020.0002] # EGYPTIAN HIEROGLYPH T018 +1331F ; [.4F9B.0020.0002] # EGYPTIAN HIEROGLYPH T019 +13320 ; [.4F9C.0020.0002] # EGYPTIAN HIEROGLYPH T020 +13321 ; [.4F9D.0020.0002] # EGYPTIAN HIEROGLYPH T021 +13322 ; [.4F9E.0020.0002] # EGYPTIAN HIEROGLYPH T022 +13323 ; [.4F9F.0020.0002] # EGYPTIAN HIEROGLYPH T023 +13324 ; [.4FA0.0020.0002] # EGYPTIAN HIEROGLYPH T024 +13325 ; [.4FA1.0020.0002] # EGYPTIAN HIEROGLYPH T025 +13326 ; [.4FA2.0020.0002] # EGYPTIAN HIEROGLYPH T026 +13327 ; [.4FA3.0020.0002] # EGYPTIAN HIEROGLYPH T027 +13328 ; [.4FA4.0020.0002] # EGYPTIAN HIEROGLYPH T028 +13329 ; [.4FA5.0020.0002] # EGYPTIAN HIEROGLYPH T029 +1332A ; [.4FA6.0020.0002] # EGYPTIAN HIEROGLYPH T030 +1332B ; [.4FA7.0020.0002] # EGYPTIAN HIEROGLYPH T031 +1332C ; [.4FA8.0020.0002] # EGYPTIAN HIEROGLYPH T032 +1332D ; [.4FA9.0020.0002] # EGYPTIAN HIEROGLYPH T032A +1332E ; [.4FAA.0020.0002] # EGYPTIAN HIEROGLYPH T033 +1332F ; [.4FAB.0020.0002] # EGYPTIAN HIEROGLYPH T033A +13330 ; [.4FAC.0020.0002] # EGYPTIAN HIEROGLYPH T034 +13331 ; [.4FAD.0020.0002] # EGYPTIAN HIEROGLYPH T035 +13332 ; [.4FAE.0020.0002] # EGYPTIAN HIEROGLYPH T036 +13333 ; [.4FAF.0020.0002] # EGYPTIAN HIEROGLYPH U001 +13334 ; [.4FB0.0020.0002] # EGYPTIAN HIEROGLYPH U002 +13335 ; [.4FB1.0020.0002] # EGYPTIAN HIEROGLYPH U003 +13336 ; [.4FB2.0020.0002] # EGYPTIAN HIEROGLYPH U004 +13337 ; [.4FB3.0020.0002] # EGYPTIAN HIEROGLYPH U005 +13338 ; [.4FB4.0020.0002] # EGYPTIAN HIEROGLYPH U006 +13339 ; [.4FB5.0020.0002] # EGYPTIAN HIEROGLYPH U006A +1333A ; [.4FB6.0020.0002] # EGYPTIAN HIEROGLYPH U006B +1333B ; [.4FB7.0020.0002] # EGYPTIAN HIEROGLYPH U007 +1333C ; [.4FB8.0020.0002] # EGYPTIAN HIEROGLYPH U008 +1333D ; [.4FB9.0020.0002] # EGYPTIAN HIEROGLYPH U009 +1333E ; [.4FBA.0020.0002] # EGYPTIAN HIEROGLYPH U010 +1333F ; [.4FBB.0020.0002] # EGYPTIAN HIEROGLYPH U011 +13340 ; [.4FBC.0020.0002] # EGYPTIAN HIEROGLYPH U012 +13341 ; [.4FBD.0020.0002] # EGYPTIAN HIEROGLYPH U013 +13342 ; [.4FBE.0020.0002] # EGYPTIAN HIEROGLYPH U014 +13343 ; [.4FBF.0020.0002] # EGYPTIAN HIEROGLYPH U015 +13344 ; [.4FC0.0020.0002] # EGYPTIAN HIEROGLYPH U016 +13345 ; [.4FC1.0020.0002] # EGYPTIAN HIEROGLYPH U017 +13346 ; [.4FC2.0020.0002] # EGYPTIAN HIEROGLYPH U018 +13347 ; [.4FC3.0020.0002] # EGYPTIAN HIEROGLYPH U019 +13348 ; [.4FC4.0020.0002] # EGYPTIAN HIEROGLYPH U020 +13349 ; [.4FC5.0020.0002] # EGYPTIAN HIEROGLYPH U021 +1334A ; [.4FC6.0020.0002] # EGYPTIAN HIEROGLYPH U022 +1334B ; [.4FC7.0020.0002] # EGYPTIAN HIEROGLYPH U023 +1334C ; [.4FC8.0020.0002] # EGYPTIAN HIEROGLYPH U023A +1334D ; [.4FC9.0020.0002] # EGYPTIAN HIEROGLYPH U024 +1334E ; [.4FCA.0020.0002] # EGYPTIAN HIEROGLYPH U025 +1334F ; [.4FCB.0020.0002] # EGYPTIAN HIEROGLYPH U026 +13350 ; [.4FCC.0020.0002] # EGYPTIAN HIEROGLYPH U027 +13351 ; [.4FCD.0020.0002] # EGYPTIAN HIEROGLYPH U028 +13352 ; [.4FCE.0020.0002] # EGYPTIAN HIEROGLYPH U029 +13353 ; [.4FCF.0020.0002] # EGYPTIAN HIEROGLYPH U029A +13354 ; [.4FD0.0020.0002] # EGYPTIAN HIEROGLYPH U030 +13355 ; [.4FD1.0020.0002] # EGYPTIAN HIEROGLYPH U031 +13356 ; [.4FD2.0020.0002] # EGYPTIAN HIEROGLYPH U032 +13357 ; [.4FD3.0020.0002] # EGYPTIAN HIEROGLYPH U032A +13358 ; [.4FD4.0020.0002] # EGYPTIAN HIEROGLYPH U033 +13359 ; [.4FD5.0020.0002] # EGYPTIAN HIEROGLYPH U034 +1335A ; [.4FD6.0020.0002] # EGYPTIAN HIEROGLYPH U035 +1335B ; [.4FD7.0020.0002] # EGYPTIAN HIEROGLYPH U036 +1335C ; [.4FD8.0020.0002] # EGYPTIAN HIEROGLYPH U037 +1335D ; [.4FD9.0020.0002] # EGYPTIAN HIEROGLYPH U038 +1335E ; [.4FDA.0020.0002] # EGYPTIAN HIEROGLYPH U039 +1335F ; [.4FDB.0020.0002] # EGYPTIAN HIEROGLYPH U040 +13360 ; [.4FDC.0020.0002] # EGYPTIAN HIEROGLYPH U041 +13361 ; [.4FDD.0020.0002] # EGYPTIAN HIEROGLYPH U042 +13362 ; [.4FDE.0020.0002] # EGYPTIAN HIEROGLYPH V001 +13363 ; [.4FDF.0020.0002] # EGYPTIAN HIEROGLYPH V001A +13364 ; [.4FE0.0020.0002] # EGYPTIAN HIEROGLYPH V001B +13365 ; [.4FE1.0020.0002] # EGYPTIAN HIEROGLYPH V001C +13366 ; [.4FE2.0020.0002] # EGYPTIAN HIEROGLYPH V001D +13367 ; [.4FE3.0020.0002] # EGYPTIAN HIEROGLYPH V001E +13368 ; [.4FE4.0020.0002] # EGYPTIAN HIEROGLYPH V001F +13369 ; [.4FE5.0020.0002] # EGYPTIAN HIEROGLYPH V001G +1336A ; [.4FE6.0020.0002] # EGYPTIAN HIEROGLYPH V001H +1336B ; [.4FE7.0020.0002] # EGYPTIAN HIEROGLYPH V001I +1336C ; [.4FE8.0020.0002] # EGYPTIAN HIEROGLYPH V002 +1336D ; [.4FE9.0020.0002] # EGYPTIAN HIEROGLYPH V002A +1336E ; [.4FEA.0020.0002] # EGYPTIAN HIEROGLYPH V003 +1336F ; [.4FEB.0020.0002] # EGYPTIAN HIEROGLYPH V004 +13370 ; [.4FEC.0020.0002] # EGYPTIAN HIEROGLYPH V005 +13371 ; [.4FED.0020.0002] # EGYPTIAN HIEROGLYPH V006 +13372 ; [.4FEE.0020.0002] # EGYPTIAN HIEROGLYPH V007 +13373 ; [.4FEF.0020.0002] # EGYPTIAN HIEROGLYPH V007A +13374 ; [.4FF0.0020.0002] # EGYPTIAN HIEROGLYPH V007B +13375 ; [.4FF1.0020.0002] # EGYPTIAN HIEROGLYPH V008 +13376 ; [.4FF2.0020.0002] # EGYPTIAN HIEROGLYPH V009 +13377 ; [.4FF3.0020.0002] # EGYPTIAN HIEROGLYPH V010 +13378 ; [.4FF4.0020.0002] # EGYPTIAN HIEROGLYPH V011 +13379 ; [.4FF5.0020.0002] # EGYPTIAN HIEROGLYPH V011A +1337A ; [.4FF6.0020.0002] # EGYPTIAN HIEROGLYPH V011B +1337B ; [.4FF7.0020.0002] # EGYPTIAN HIEROGLYPH V011C +1337C ; [.4FF8.0020.0002] # EGYPTIAN HIEROGLYPH V012 +1337D ; [.4FF9.0020.0002] # EGYPTIAN HIEROGLYPH V012A +1337E ; [.4FFA.0020.0002] # EGYPTIAN HIEROGLYPH V012B +1337F ; [.4FFB.0020.0002] # EGYPTIAN HIEROGLYPH V013 +13380 ; [.4FFC.0020.0002] # EGYPTIAN HIEROGLYPH V014 +13381 ; [.4FFD.0020.0002] # EGYPTIAN HIEROGLYPH V015 +13382 ; [.4FFE.0020.0002] # EGYPTIAN HIEROGLYPH V016 +13383 ; [.4FFF.0020.0002] # EGYPTIAN HIEROGLYPH V017 +13384 ; [.5000.0020.0002] # EGYPTIAN HIEROGLYPH V018 +13385 ; [.5001.0020.0002] # EGYPTIAN HIEROGLYPH V019 +13386 ; [.5002.0020.0002] # EGYPTIAN HIEROGLYPH V020 +13387 ; [.5003.0020.0002] # EGYPTIAN HIEROGLYPH V020A +13388 ; [.5004.0020.0002] # EGYPTIAN HIEROGLYPH V020B +13389 ; [.5005.0020.0002] # EGYPTIAN HIEROGLYPH V020C +1338A ; [.5006.0020.0002] # EGYPTIAN HIEROGLYPH V020D +1338B ; [.5007.0020.0002] # EGYPTIAN HIEROGLYPH V020E +1338C ; [.5008.0020.0002] # EGYPTIAN HIEROGLYPH V020F +1338D ; [.5009.0020.0002] # EGYPTIAN HIEROGLYPH V020G +1338E ; [.500A.0020.0002] # EGYPTIAN HIEROGLYPH V020H +1338F ; [.500B.0020.0002] # EGYPTIAN HIEROGLYPH V020I +13390 ; [.500C.0020.0002] # EGYPTIAN HIEROGLYPH V020J +13391 ; [.500D.0020.0002] # EGYPTIAN HIEROGLYPH V020K +13392 ; [.500E.0020.0002] # EGYPTIAN HIEROGLYPH V020L +13393 ; [.500F.0020.0002] # EGYPTIAN HIEROGLYPH V021 +13394 ; [.5010.0020.0002] # EGYPTIAN HIEROGLYPH V022 +13395 ; [.5011.0020.0002] # EGYPTIAN HIEROGLYPH V023 +13396 ; [.5012.0020.0002] # EGYPTIAN HIEROGLYPH V023A +13397 ; [.5013.0020.0002] # EGYPTIAN HIEROGLYPH V024 +13398 ; [.5014.0020.0002] # EGYPTIAN HIEROGLYPH V025 +13399 ; [.5015.0020.0002] # EGYPTIAN HIEROGLYPH V026 +1339A ; [.5016.0020.0002] # EGYPTIAN HIEROGLYPH V027 +1339B ; [.5017.0020.0002] # EGYPTIAN HIEROGLYPH V028 +1339C ; [.5018.0020.0002] # EGYPTIAN HIEROGLYPH V028A +1339D ; [.5019.0020.0002] # EGYPTIAN HIEROGLYPH V029 +1339E ; [.501A.0020.0002] # EGYPTIAN HIEROGLYPH V029A +1339F ; [.501B.0020.0002] # EGYPTIAN HIEROGLYPH V030 +133A0 ; [.501C.0020.0002] # EGYPTIAN HIEROGLYPH V030A +133A1 ; [.501D.0020.0002] # EGYPTIAN HIEROGLYPH V031 +133A2 ; [.501E.0020.0002] # EGYPTIAN HIEROGLYPH V031A +133A3 ; [.501F.0020.0002] # EGYPTIAN HIEROGLYPH V032 +133A4 ; [.5020.0020.0002] # EGYPTIAN HIEROGLYPH V033 +133A5 ; [.5021.0020.0002] # EGYPTIAN HIEROGLYPH V033A +133A6 ; [.5022.0020.0002] # EGYPTIAN HIEROGLYPH V034 +133A7 ; [.5023.0020.0002] # EGYPTIAN HIEROGLYPH V035 +133A8 ; [.5024.0020.0002] # EGYPTIAN HIEROGLYPH V036 +133A9 ; [.5025.0020.0002] # EGYPTIAN HIEROGLYPH V037 +133AA ; [.5026.0020.0002] # EGYPTIAN HIEROGLYPH V037A +133AB ; [.5027.0020.0002] # EGYPTIAN HIEROGLYPH V038 +133AC ; [.5028.0020.0002] # EGYPTIAN HIEROGLYPH V039 +133AD ; [.5029.0020.0002] # EGYPTIAN HIEROGLYPH V040 +133AE ; [.502A.0020.0002] # EGYPTIAN HIEROGLYPH V040A +133AF ; [.502B.0020.0002] # EGYPTIAN HIEROGLYPH W001 +133B0 ; [.502C.0020.0002] # EGYPTIAN HIEROGLYPH W002 +133B1 ; [.502D.0020.0002] # EGYPTIAN HIEROGLYPH W003 +133B2 ; [.502E.0020.0002] # EGYPTIAN HIEROGLYPH W003A +133B3 ; [.502F.0020.0002] # EGYPTIAN HIEROGLYPH W004 +133B4 ; [.5030.0020.0002] # EGYPTIAN HIEROGLYPH W005 +133B5 ; [.5031.0020.0002] # EGYPTIAN HIEROGLYPH W006 +133B6 ; [.5032.0020.0002] # EGYPTIAN HIEROGLYPH W007 +133B7 ; [.5033.0020.0002] # EGYPTIAN HIEROGLYPH W008 +133B8 ; [.5034.0020.0002] # EGYPTIAN HIEROGLYPH W009 +133B9 ; [.5035.0020.0002] # EGYPTIAN HIEROGLYPH W009A +133BA ; [.5036.0020.0002] # EGYPTIAN HIEROGLYPH W010 +133BB ; [.5037.0020.0002] # EGYPTIAN HIEROGLYPH W010A +133BC ; [.5038.0020.0002] # EGYPTIAN HIEROGLYPH W011 +133BD ; [.5039.0020.0002] # EGYPTIAN HIEROGLYPH W012 +133BE ; [.503A.0020.0002] # EGYPTIAN HIEROGLYPH W013 +133BF ; [.503B.0020.0002] # EGYPTIAN HIEROGLYPH W014 +133C0 ; [.503C.0020.0002] # EGYPTIAN HIEROGLYPH W014A +133C1 ; [.503D.0020.0002] # EGYPTIAN HIEROGLYPH W015 +133C2 ; [.503E.0020.0002] # EGYPTIAN HIEROGLYPH W016 +133C3 ; [.503F.0020.0002] # EGYPTIAN HIEROGLYPH W017 +133C4 ; [.5040.0020.0002] # EGYPTIAN HIEROGLYPH W017A +133C5 ; [.5041.0020.0002] # EGYPTIAN HIEROGLYPH W018 +133C6 ; [.5042.0020.0002] # EGYPTIAN HIEROGLYPH W018A +133C7 ; [.5043.0020.0002] # EGYPTIAN HIEROGLYPH W019 +133C8 ; [.5044.0020.0002] # EGYPTIAN HIEROGLYPH W020 +133C9 ; [.5045.0020.0002] # EGYPTIAN HIEROGLYPH W021 +133CA ; [.5046.0020.0002] # EGYPTIAN HIEROGLYPH W022 +133CB ; [.5047.0020.0002] # EGYPTIAN HIEROGLYPH W023 +133CC ; [.5048.0020.0002] # EGYPTIAN HIEROGLYPH W024 +133CD ; [.5049.0020.0002] # EGYPTIAN HIEROGLYPH W024A +133CE ; [.504A.0020.0002] # EGYPTIAN HIEROGLYPH W025 +133CF ; [.504B.0020.0002] # EGYPTIAN HIEROGLYPH X001 +133D0 ; [.504C.0020.0002] # EGYPTIAN HIEROGLYPH X002 +133D1 ; [.504D.0020.0002] # EGYPTIAN HIEROGLYPH X003 +133D2 ; [.504E.0020.0002] # EGYPTIAN HIEROGLYPH X004 +133D3 ; [.504F.0020.0002] # EGYPTIAN HIEROGLYPH X004A +133D4 ; [.5050.0020.0002] # EGYPTIAN HIEROGLYPH X004B +133D5 ; [.5051.0020.0002] # EGYPTIAN HIEROGLYPH X005 +133D6 ; [.5052.0020.0002] # EGYPTIAN HIEROGLYPH X006 +133D7 ; [.5053.0020.0002] # EGYPTIAN HIEROGLYPH X006A +133D8 ; [.5054.0020.0002] # EGYPTIAN HIEROGLYPH X007 +133D9 ; [.5055.0020.0002] # EGYPTIAN HIEROGLYPH X008 +133DA ; [.5056.0020.0002] # EGYPTIAN HIEROGLYPH X008A +133DB ; [.5057.0020.0002] # EGYPTIAN HIEROGLYPH Y001 +133DC ; [.5058.0020.0002] # EGYPTIAN HIEROGLYPH Y001A +133DD ; [.5059.0020.0002] # EGYPTIAN HIEROGLYPH Y002 +133DE ; [.505A.0020.0002] # EGYPTIAN HIEROGLYPH Y003 +133DF ; [.505B.0020.0002] # EGYPTIAN HIEROGLYPH Y004 +133E0 ; [.505C.0020.0002] # EGYPTIAN HIEROGLYPH Y005 +133E1 ; [.505D.0020.0002] # EGYPTIAN HIEROGLYPH Y006 +133E2 ; [.505E.0020.0002] # EGYPTIAN HIEROGLYPH Y007 +133E3 ; [.505F.0020.0002] # EGYPTIAN HIEROGLYPH Y008 +133E4 ; [.5060.0020.0002] # EGYPTIAN HIEROGLYPH Z001 +133E5 ; [.5061.0020.0002] # EGYPTIAN HIEROGLYPH Z002 +133E6 ; [.5062.0020.0002] # EGYPTIAN HIEROGLYPH Z002A +133E7 ; [.5063.0020.0002] # EGYPTIAN HIEROGLYPH Z002B +133E8 ; [.5064.0020.0002] # EGYPTIAN HIEROGLYPH Z002C +133E9 ; [.5065.0020.0002] # EGYPTIAN HIEROGLYPH Z002D +133EA ; [.5066.0020.0002] # EGYPTIAN HIEROGLYPH Z003 +133EB ; [.5067.0020.0002] # EGYPTIAN HIEROGLYPH Z003A +133EC ; [.5068.0020.0002] # EGYPTIAN HIEROGLYPH Z003B +133ED ; [.5069.0020.0002] # EGYPTIAN HIEROGLYPH Z004 +133EE ; [.506A.0020.0002] # EGYPTIAN HIEROGLYPH Z004A +133EF ; [.506B.0020.0002] # EGYPTIAN HIEROGLYPH Z005 +133F0 ; [.506C.0020.0002] # EGYPTIAN HIEROGLYPH Z005A +133F1 ; [.506D.0020.0002] # EGYPTIAN HIEROGLYPH Z006 +133F2 ; [.506E.0020.0002] # EGYPTIAN HIEROGLYPH Z007 +133F3 ; [.506F.0020.0002] # EGYPTIAN HIEROGLYPH Z008 +133F4 ; [.5070.0020.0002] # EGYPTIAN HIEROGLYPH Z009 +133F5 ; [.5071.0020.0002] # EGYPTIAN HIEROGLYPH Z010 +133F6 ; [.5072.0020.0002] # EGYPTIAN HIEROGLYPH Z011 +133F7 ; [.5073.0020.0002] # EGYPTIAN HIEROGLYPH Z012 +133F8 ; [.5074.0020.0002] # EGYPTIAN HIEROGLYPH Z013 +133F9 ; [.5075.0020.0002] # EGYPTIAN HIEROGLYPH Z014 +133FA ; [.5076.0020.0002] # EGYPTIAN HIEROGLYPH Z015 +133FB ; [.5077.0020.0002] # EGYPTIAN HIEROGLYPH Z015A +133FC ; [.5078.0020.0002] # EGYPTIAN HIEROGLYPH Z015B +133FD ; [.5079.0020.0002] # EGYPTIAN HIEROGLYPH Z015C +133FE ; [.507A.0020.0002] # EGYPTIAN HIEROGLYPH Z015D +133FF ; [.507B.0020.0002] # EGYPTIAN HIEROGLYPH Z015E +13400 ; [.507C.0020.0002] # EGYPTIAN HIEROGLYPH Z015F +13401 ; [.507D.0020.0002] # EGYPTIAN HIEROGLYPH Z015G +13402 ; [.507E.0020.0002] # EGYPTIAN HIEROGLYPH Z015H +13403 ; [.507F.0020.0002] # EGYPTIAN HIEROGLYPH Z015I +13404 ; [.5080.0020.0002] # EGYPTIAN HIEROGLYPH Z016 +13405 ; [.5081.0020.0002] # EGYPTIAN HIEROGLYPH Z016A +13406 ; [.5082.0020.0002] # EGYPTIAN HIEROGLYPH Z016B +13407 ; [.5083.0020.0002] # EGYPTIAN HIEROGLYPH Z016C +13408 ; [.5084.0020.0002] # EGYPTIAN HIEROGLYPH Z016D +13409 ; [.5085.0020.0002] # EGYPTIAN HIEROGLYPH Z016E +1340A ; [.5086.0020.0002] # EGYPTIAN HIEROGLYPH Z016F +1340B ; [.5087.0020.0002] # EGYPTIAN HIEROGLYPH Z016G +1340C ; [.5088.0020.0002] # EGYPTIAN HIEROGLYPH Z016H +1340D ; [.5089.0020.0002] # EGYPTIAN HIEROGLYPH AA001 +1340E ; [.508A.0020.0002] # EGYPTIAN HIEROGLYPH AA002 +1340F ; [.508B.0020.0002] # EGYPTIAN HIEROGLYPH AA003 +13410 ; [.508C.0020.0002] # EGYPTIAN HIEROGLYPH AA004 +13411 ; [.508D.0020.0002] # EGYPTIAN HIEROGLYPH AA005 +13412 ; [.508E.0020.0002] # EGYPTIAN HIEROGLYPH AA006 +13413 ; [.508F.0020.0002] # EGYPTIAN HIEROGLYPH AA007 +13414 ; [.5090.0020.0002] # EGYPTIAN HIEROGLYPH AA007A +13415 ; [.5091.0020.0002] # EGYPTIAN HIEROGLYPH AA007B +13416 ; [.5092.0020.0002] # EGYPTIAN HIEROGLYPH AA008 +13417 ; [.5093.0020.0002] # EGYPTIAN HIEROGLYPH AA009 +13418 ; [.5094.0020.0002] # EGYPTIAN HIEROGLYPH AA010 +13419 ; [.5095.0020.0002] # EGYPTIAN HIEROGLYPH AA011 +1341A ; [.5096.0020.0002] # EGYPTIAN HIEROGLYPH AA012 +1341B ; [.5097.0020.0002] # EGYPTIAN HIEROGLYPH AA013 +1341C ; [.5098.0020.0002] # EGYPTIAN HIEROGLYPH AA014 +1341D ; [.5099.0020.0002] # EGYPTIAN HIEROGLYPH AA015 +1341E ; [.509A.0020.0002] # EGYPTIAN HIEROGLYPH AA016 +1341F ; [.509B.0020.0002] # EGYPTIAN HIEROGLYPH AA017 +13420 ; [.509C.0020.0002] # EGYPTIAN HIEROGLYPH AA018 +13421 ; [.509D.0020.0002] # EGYPTIAN HIEROGLYPH AA019 +13422 ; [.509E.0020.0002] # EGYPTIAN HIEROGLYPH AA020 +13423 ; [.509F.0020.0002] # EGYPTIAN HIEROGLYPH AA021 +13424 ; [.50A0.0020.0002] # EGYPTIAN HIEROGLYPH AA022 +13425 ; [.50A1.0020.0002] # EGYPTIAN HIEROGLYPH AA023 +13426 ; [.50A2.0020.0002] # EGYPTIAN HIEROGLYPH AA024 +13427 ; [.50A3.0020.0002] # EGYPTIAN HIEROGLYPH AA025 +13428 ; [.50A4.0020.0002] # EGYPTIAN HIEROGLYPH AA026 +13429 ; [.50A5.0020.0002] # EGYPTIAN HIEROGLYPH AA027 +1342A ; [.50A6.0020.0002] # EGYPTIAN HIEROGLYPH AA028 +1342B ; [.50A7.0020.0002] # EGYPTIAN HIEROGLYPH AA029 +1342C ; [.50A8.0020.0002] # EGYPTIAN HIEROGLYPH AA030 +1342D ; [.50A9.0020.0002] # EGYPTIAN HIEROGLYPH AA031 +1342E ; [.50AA.0020.0002] # EGYPTIAN HIEROGLYPH AA032 +109A0 ; [.50AB.0020.0002] # MEROITIC CURSIVE LETTER A +10980 ; [.50AB.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER A +109A1 ; [.50AC.0020.0002] # MEROITIC CURSIVE LETTER E +10981 ; [.50AC.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER E +109A2 ; [.50AD.0020.0002] # MEROITIC CURSIVE LETTER I +10982 ; [.50AD.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER I +109A3 ; [.50AE.0020.0002] # MEROITIC CURSIVE LETTER O +10983 ; [.50AE.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER O +109A4 ; [.50AF.0020.0002] # MEROITIC CURSIVE LETTER YA +10984 ; [.50AF.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER YA +109A5 ; [.50B0.0020.0002] # MEROITIC CURSIVE LETTER WA +10985 ; [.50B0.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER WA +109A6 ; [.50B1.0020.0002] # MEROITIC CURSIVE LETTER BA +10986 ; [.50B1.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER BA +10987 ; [.50B1.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER BA-2 +109A7 ; [.50B2.0020.0002] # MEROITIC CURSIVE LETTER PA +10988 ; [.50B2.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER PA +109A8 ; [.50B3.0020.0002] # MEROITIC CURSIVE LETTER MA +10989 ; [.50B3.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER MA +109A9 ; [.50B4.0020.0002] # MEROITIC CURSIVE LETTER NA +1098A ; [.50B4.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER NA +1098B ; [.50B4.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER NA-2 +109AA ; [.50B5.0020.0002] # MEROITIC CURSIVE LETTER NE +1098C ; [.50B5.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER NE +1098D ; [.50B5.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER NE-2 +109AB ; [.50B6.0020.0002] # MEROITIC CURSIVE LETTER RA +1098E ; [.50B6.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER RA +1098F ; [.50B6.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER RA-2 +109AC ; [.50B7.0020.0002] # MEROITIC CURSIVE LETTER LA +10990 ; [.50B7.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER LA +109AD ; [.50B8.0020.0002] # MEROITIC CURSIVE LETTER KHA +10991 ; [.50B8.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER KHA +109AE ; [.50B9.0020.0002] # MEROITIC CURSIVE LETTER HHA +10992 ; [.50B9.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER HHA +109AF ; [.50BA.0020.0002] # MEROITIC CURSIVE LETTER SA +109B0 ; [.50BA.0020.0004][.0000.010B.0004] # MEROITIC CURSIVE LETTER ARCHAIC SA +10993 ; [.50BA.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER SA +10994 ; [.50BA.0020.0004][.0000.010D.0004] # MEROITIC HIEROGLYPHIC LETTER SA-2 +109B1 ; [.50BB.0020.0002] # MEROITIC CURSIVE LETTER SE +10995 ; [.50BB.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER SE +109B2 ; [.50BC.0020.0002] # MEROITIC CURSIVE LETTER KA +10996 ; [.50BC.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER KA +109B3 ; [.50BD.0020.0002] # MEROITIC CURSIVE LETTER QA +10997 ; [.50BD.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER QA +109B4 ; [.50BE.0020.0002] # MEROITIC CURSIVE LETTER TA +10998 ; [.50BE.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER TA +10999 ; [.50BE.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER TA-2 +109B5 ; [.50BF.0020.0002] # MEROITIC CURSIVE LETTER TE +1099A ; [.50BF.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER TE +1099B ; [.50BF.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER TE-2 +109B6 ; [.50C0.0020.0002] # MEROITIC CURSIVE LETTER TO +1099C ; [.50C0.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER TO +109B7 ; [.50C1.0020.0002] # MEROITIC CURSIVE LETTER DA +1099D ; [.50C1.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER DA +109BE ; [.50C2.0020.0002] # MEROITIC CURSIVE LOGOGRAM RMT +109BF ; [.50C3.0020.0002] # MEROITIC CURSIVE LOGOGRAM IMN +1099E ; [.50C4.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ +1099F ; [.50C5.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +14400 ; [.50C6.0020.0002] # ANATOLIAN HIEROGLYPH A001 +14401 ; [.50C7.0020.0002] # ANATOLIAN HIEROGLYPH A002 +14402 ; [.50C8.0020.0002] # ANATOLIAN HIEROGLYPH A003 +14403 ; [.50C9.0020.0002] # ANATOLIAN HIEROGLYPH A004 +14404 ; [.50CA.0020.0002] # ANATOLIAN HIEROGLYPH A005 +14405 ; [.50CB.0020.0002] # ANATOLIAN HIEROGLYPH A006 +14406 ; [.50CC.0020.0002] # ANATOLIAN HIEROGLYPH A007 +14407 ; [.50CD.0020.0002] # ANATOLIAN HIEROGLYPH A008 +14408 ; [.50CE.0020.0002] # ANATOLIAN HIEROGLYPH A009 +14409 ; [.50CF.0020.0002] # ANATOLIAN HIEROGLYPH A010 +1440A ; [.50D0.0020.0002] # ANATOLIAN HIEROGLYPH A010A +1440B ; [.50D1.0020.0002] # ANATOLIAN HIEROGLYPH A011 +1440C ; [.50D2.0020.0002] # ANATOLIAN HIEROGLYPH A012 +1440D ; [.50D3.0020.0002] # ANATOLIAN HIEROGLYPH A013 +1440E ; [.50D4.0020.0002] # ANATOLIAN HIEROGLYPH A014 +1440F ; [.50D5.0020.0002] # ANATOLIAN HIEROGLYPH A015 +14410 ; [.50D6.0020.0002] # ANATOLIAN HIEROGLYPH A016 +14411 ; [.50D7.0020.0002] # ANATOLIAN HIEROGLYPH A017 +14412 ; [.50D8.0020.0002] # ANATOLIAN HIEROGLYPH A018 +14413 ; [.50D9.0020.0002] # ANATOLIAN HIEROGLYPH A019 +14414 ; [.50DA.0020.0002] # ANATOLIAN HIEROGLYPH A020 +14415 ; [.50DB.0020.0002] # ANATOLIAN HIEROGLYPH A021 +14416 ; [.50DC.0020.0002] # ANATOLIAN HIEROGLYPH A022 +14417 ; [.50DD.0020.0002] # ANATOLIAN HIEROGLYPH A023 +14418 ; [.50DE.0020.0002] # ANATOLIAN HIEROGLYPH A024 +14419 ; [.50DF.0020.0002] # ANATOLIAN HIEROGLYPH A025 +1441A ; [.50E0.0020.0002] # ANATOLIAN HIEROGLYPH A026 +1441B ; [.50E1.0020.0002] # ANATOLIAN HIEROGLYPH A026A +1441C ; [.50E2.0020.0002] # ANATOLIAN HIEROGLYPH A027 +1441D ; [.50E3.0020.0002] # ANATOLIAN HIEROGLYPH A028 +1441E ; [.50E4.0020.0002] # ANATOLIAN HIEROGLYPH A029 +1441F ; [.50E5.0020.0002] # ANATOLIAN HIEROGLYPH A030 +14420 ; [.50E6.0020.0002] # ANATOLIAN HIEROGLYPH A031 +14421 ; [.50E7.0020.0002] # ANATOLIAN HIEROGLYPH A032 +14422 ; [.50E8.0020.0002] # ANATOLIAN HIEROGLYPH A033 +14423 ; [.50E9.0020.0002] # ANATOLIAN HIEROGLYPH A034 +14424 ; [.50EA.0020.0002] # ANATOLIAN HIEROGLYPH A035 +14425 ; [.50EB.0020.0002] # ANATOLIAN HIEROGLYPH A036 +14426 ; [.50EC.0020.0002] # ANATOLIAN HIEROGLYPH A037 +14427 ; [.50ED.0020.0002] # ANATOLIAN HIEROGLYPH A038 +14428 ; [.50EE.0020.0002] # ANATOLIAN HIEROGLYPH A039 +14429 ; [.50EF.0020.0002] # ANATOLIAN HIEROGLYPH A039A +1442A ; [.50F0.0020.0002] # ANATOLIAN HIEROGLYPH A040 +1442B ; [.50F1.0020.0002] # ANATOLIAN HIEROGLYPH A041 +1442C ; [.50F2.0020.0002] # ANATOLIAN HIEROGLYPH A041A +1442D ; [.50F3.0020.0002] # ANATOLIAN HIEROGLYPH A042 +1442E ; [.50F4.0020.0002] # ANATOLIAN HIEROGLYPH A043 +1442F ; [.50F5.0020.0002] # ANATOLIAN HIEROGLYPH A044 +14430 ; [.50F6.0020.0002] # ANATOLIAN HIEROGLYPH A045 +14431 ; [.50F7.0020.0002] # ANATOLIAN HIEROGLYPH A045A +14432 ; [.50F8.0020.0002] # ANATOLIAN HIEROGLYPH A046 +14433 ; [.50F9.0020.0002] # ANATOLIAN HIEROGLYPH A046A +14434 ; [.50FA.0020.0002] # ANATOLIAN HIEROGLYPH A046B +14435 ; [.50FB.0020.0002] # ANATOLIAN HIEROGLYPH A047 +14436 ; [.50FC.0020.0002] # ANATOLIAN HIEROGLYPH A048 +14437 ; [.50FD.0020.0002] # ANATOLIAN HIEROGLYPH A049 +14438 ; [.50FE.0020.0002] # ANATOLIAN HIEROGLYPH A050 +14439 ; [.50FF.0020.0002] # ANATOLIAN HIEROGLYPH A051 +1443A ; [.5100.0020.0002] # ANATOLIAN HIEROGLYPH A052 +1443B ; [.5101.0020.0002] # ANATOLIAN HIEROGLYPH A053 +1443C ; [.5102.0020.0002] # ANATOLIAN HIEROGLYPH A054 +1443D ; [.5103.0020.0002] # ANATOLIAN HIEROGLYPH A055 +1443E ; [.5104.0020.0002] # ANATOLIAN HIEROGLYPH A056 +1443F ; [.5105.0020.0002] # ANATOLIAN HIEROGLYPH A057 +14440 ; [.5106.0020.0002] # ANATOLIAN HIEROGLYPH A058 +14441 ; [.5107.0020.0002] # ANATOLIAN HIEROGLYPH A059 +14442 ; [.5108.0020.0002] # ANATOLIAN HIEROGLYPH A060 +14443 ; [.5109.0020.0002] # ANATOLIAN HIEROGLYPH A061 +14444 ; [.510A.0020.0002] # ANATOLIAN HIEROGLYPH A062 +14445 ; [.510B.0020.0002] # ANATOLIAN HIEROGLYPH A063 +14446 ; [.510C.0020.0002] # ANATOLIAN HIEROGLYPH A064 +14447 ; [.510D.0020.0002] # ANATOLIAN HIEROGLYPH A065 +14448 ; [.510E.0020.0002] # ANATOLIAN HIEROGLYPH A066 +14449 ; [.510F.0020.0002] # ANATOLIAN HIEROGLYPH A066A +1444A ; [.5110.0020.0002] # ANATOLIAN HIEROGLYPH A066B +1444B ; [.5111.0020.0002] # ANATOLIAN HIEROGLYPH A066C +1444C ; [.5112.0020.0002] # ANATOLIAN HIEROGLYPH A067 +1444D ; [.5113.0020.0002] # ANATOLIAN HIEROGLYPH A068 +1444E ; [.5114.0020.0002] # ANATOLIAN HIEROGLYPH A069 +1444F ; [.5115.0020.0002] # ANATOLIAN HIEROGLYPH A070 +14450 ; [.5116.0020.0002] # ANATOLIAN HIEROGLYPH A071 +14451 ; [.5117.0020.0002] # ANATOLIAN HIEROGLYPH A072 +14452 ; [.5118.0020.0002] # ANATOLIAN HIEROGLYPH A073 +14453 ; [.5119.0020.0002] # ANATOLIAN HIEROGLYPH A074 +14454 ; [.511A.0020.0002] # ANATOLIAN HIEROGLYPH A075 +14455 ; [.511B.0020.0002] # ANATOLIAN HIEROGLYPH A076 +14456 ; [.511C.0020.0002] # ANATOLIAN HIEROGLYPH A077 +14457 ; [.511D.0020.0002] # ANATOLIAN HIEROGLYPH A078 +14458 ; [.511E.0020.0002] # ANATOLIAN HIEROGLYPH A079 +14459 ; [.511F.0020.0002] # ANATOLIAN HIEROGLYPH A080 +1445A ; [.5120.0020.0002] # ANATOLIAN HIEROGLYPH A081 +1445B ; [.5121.0020.0002] # ANATOLIAN HIEROGLYPH A082 +1445C ; [.5122.0020.0002] # ANATOLIAN HIEROGLYPH A083 +1445D ; [.5123.0020.0002] # ANATOLIAN HIEROGLYPH A084 +1445E ; [.5124.0020.0002] # ANATOLIAN HIEROGLYPH A085 +1445F ; [.5125.0020.0002] # ANATOLIAN HIEROGLYPH A086 +14460 ; [.5126.0020.0002] # ANATOLIAN HIEROGLYPH A087 +14461 ; [.5127.0020.0002] # ANATOLIAN HIEROGLYPH A088 +14462 ; [.5128.0020.0002] # ANATOLIAN HIEROGLYPH A089 +14463 ; [.5129.0020.0002] # ANATOLIAN HIEROGLYPH A090 +14464 ; [.512A.0020.0002] # ANATOLIAN HIEROGLYPH A091 +14465 ; [.512B.0020.0002] # ANATOLIAN HIEROGLYPH A092 +14466 ; [.512C.0020.0002] # ANATOLIAN HIEROGLYPH A093 +14467 ; [.512D.0020.0002] # ANATOLIAN HIEROGLYPH A094 +14468 ; [.512E.0020.0002] # ANATOLIAN HIEROGLYPH A095 +14469 ; [.512F.0020.0002] # ANATOLIAN HIEROGLYPH A096 +1446A ; [.5130.0020.0002] # ANATOLIAN HIEROGLYPH A097 +1446B ; [.5131.0020.0002] # ANATOLIAN HIEROGLYPH A097A +1446C ; [.5132.0020.0002] # ANATOLIAN HIEROGLYPH A098 +1446D ; [.5133.0020.0002] # ANATOLIAN HIEROGLYPH A098A +1446E ; [.5134.0020.0002] # ANATOLIAN HIEROGLYPH A099 +1446F ; [.5135.0020.0002] # ANATOLIAN HIEROGLYPH A100 +14470 ; [.5136.0020.0002] # ANATOLIAN HIEROGLYPH A100A +14471 ; [.5137.0020.0002] # ANATOLIAN HIEROGLYPH A101 +14472 ; [.5138.0020.0002] # ANATOLIAN HIEROGLYPH A101A +14473 ; [.5139.0020.0002] # ANATOLIAN HIEROGLYPH A102 +14474 ; [.513A.0020.0002] # ANATOLIAN HIEROGLYPH A102A +14475 ; [.513B.0020.0002] # ANATOLIAN HIEROGLYPH A103 +14476 ; [.513C.0020.0002] # ANATOLIAN HIEROGLYPH A104 +14477 ; [.513D.0020.0002] # ANATOLIAN HIEROGLYPH A104A +14478 ; [.513E.0020.0002] # ANATOLIAN HIEROGLYPH A104B +14479 ; [.513F.0020.0002] # ANATOLIAN HIEROGLYPH A104C +1447A ; [.5140.0020.0002] # ANATOLIAN HIEROGLYPH A105 +1447B ; [.5141.0020.0002] # ANATOLIAN HIEROGLYPH A105A +1447C ; [.5142.0020.0002] # ANATOLIAN HIEROGLYPH A105B +1447D ; [.5143.0020.0002] # ANATOLIAN HIEROGLYPH A106 +1447E ; [.5144.0020.0002] # ANATOLIAN HIEROGLYPH A107 +1447F ; [.5145.0020.0002] # ANATOLIAN HIEROGLYPH A107A +14480 ; [.5146.0020.0002] # ANATOLIAN HIEROGLYPH A107B +14481 ; [.5147.0020.0002] # ANATOLIAN HIEROGLYPH A107C +14482 ; [.5148.0020.0002] # ANATOLIAN HIEROGLYPH A108 +14483 ; [.5149.0020.0002] # ANATOLIAN HIEROGLYPH A109 +14484 ; [.514A.0020.0002] # ANATOLIAN HIEROGLYPH A110 +14485 ; [.514B.0020.0002] # ANATOLIAN HIEROGLYPH A110A +14486 ; [.514C.0020.0002] # ANATOLIAN HIEROGLYPH A110B +14487 ; [.514D.0020.0002] # ANATOLIAN HIEROGLYPH A111 +14488 ; [.514E.0020.0002] # ANATOLIAN HIEROGLYPH A112 +14489 ; [.514F.0020.0002] # ANATOLIAN HIEROGLYPH A113 +1448A ; [.5150.0020.0002] # ANATOLIAN HIEROGLYPH A114 +1448B ; [.5151.0020.0002] # ANATOLIAN HIEROGLYPH A115 +1448C ; [.5152.0020.0002] # ANATOLIAN HIEROGLYPH A115A +1448D ; [.5153.0020.0002] # ANATOLIAN HIEROGLYPH A116 +1448E ; [.5154.0020.0002] # ANATOLIAN HIEROGLYPH A117 +1448F ; [.5155.0020.0002] # ANATOLIAN HIEROGLYPH A118 +14490 ; [.5156.0020.0002] # ANATOLIAN HIEROGLYPH A119 +14491 ; [.5157.0020.0002] # ANATOLIAN HIEROGLYPH A120 +14492 ; [.5158.0020.0002] # ANATOLIAN HIEROGLYPH A121 +14493 ; [.5159.0020.0002] # ANATOLIAN HIEROGLYPH A122 +14494 ; [.515A.0020.0002] # ANATOLIAN HIEROGLYPH A123 +14495 ; [.515B.0020.0002] # ANATOLIAN HIEROGLYPH A124 +14496 ; [.515C.0020.0002] # ANATOLIAN HIEROGLYPH A125 +14497 ; [.515D.0020.0002] # ANATOLIAN HIEROGLYPH A125A +14498 ; [.515E.0020.0002] # ANATOLIAN HIEROGLYPH A126 +14499 ; [.515F.0020.0002] # ANATOLIAN HIEROGLYPH A127 +1449A ; [.5160.0020.0002] # ANATOLIAN HIEROGLYPH A128 +1449B ; [.5161.0020.0002] # ANATOLIAN HIEROGLYPH A129 +1449C ; [.5162.0020.0002] # ANATOLIAN HIEROGLYPH A130 +1449D ; [.5163.0020.0002] # ANATOLIAN HIEROGLYPH A131 +1449E ; [.5164.0020.0002] # ANATOLIAN HIEROGLYPH A132 +1449F ; [.5165.0020.0002] # ANATOLIAN HIEROGLYPH A133 +144A0 ; [.5166.0020.0002] # ANATOLIAN HIEROGLYPH A134 +144A1 ; [.5167.0020.0002] # ANATOLIAN HIEROGLYPH A135 +144A2 ; [.5168.0020.0002] # ANATOLIAN HIEROGLYPH A135A +144A3 ; [.5169.0020.0002] # ANATOLIAN HIEROGLYPH A136 +144A4 ; [.516A.0020.0002] # ANATOLIAN HIEROGLYPH A137 +144A5 ; [.516B.0020.0002] # ANATOLIAN HIEROGLYPH A138 +144A6 ; [.516C.0020.0002] # ANATOLIAN HIEROGLYPH A139 +144A7 ; [.516D.0020.0002] # ANATOLIAN HIEROGLYPH A140 +144A8 ; [.516E.0020.0002] # ANATOLIAN HIEROGLYPH A141 +144A9 ; [.516F.0020.0002] # ANATOLIAN HIEROGLYPH A142 +144AA ; [.5170.0020.0002] # ANATOLIAN HIEROGLYPH A143 +144AB ; [.5171.0020.0002] # ANATOLIAN HIEROGLYPH A144 +144AC ; [.5172.0020.0002] # ANATOLIAN HIEROGLYPH A145 +144AD ; [.5173.0020.0002] # ANATOLIAN HIEROGLYPH A146 +144AE ; [.5174.0020.0002] # ANATOLIAN HIEROGLYPH A147 +144AF ; [.5175.0020.0002] # ANATOLIAN HIEROGLYPH A148 +144B0 ; [.5176.0020.0002] # ANATOLIAN HIEROGLYPH A149 +144B1 ; [.5177.0020.0002] # ANATOLIAN HIEROGLYPH A150 +144B2 ; [.5178.0020.0002] # ANATOLIAN HIEROGLYPH A151 +144B3 ; [.5179.0020.0002] # ANATOLIAN HIEROGLYPH A152 +144B4 ; [.517A.0020.0002] # ANATOLIAN HIEROGLYPH A153 +144B5 ; [.517B.0020.0002] # ANATOLIAN HIEROGLYPH A154 +144B6 ; [.517C.0020.0002] # ANATOLIAN HIEROGLYPH A155 +144B7 ; [.517D.0020.0002] # ANATOLIAN HIEROGLYPH A156 +144B8 ; [.517E.0020.0002] # ANATOLIAN HIEROGLYPH A157 +144B9 ; [.517F.0020.0002] # ANATOLIAN HIEROGLYPH A158 +144BA ; [.5180.0020.0002] # ANATOLIAN HIEROGLYPH A159 +144BB ; [.5181.0020.0002] # ANATOLIAN HIEROGLYPH A160 +144BC ; [.5182.0020.0002] # ANATOLIAN HIEROGLYPH A161 +144BD ; [.5183.0020.0002] # ANATOLIAN HIEROGLYPH A162 +144BE ; [.5184.0020.0002] # ANATOLIAN HIEROGLYPH A163 +144BF ; [.5185.0020.0002] # ANATOLIAN HIEROGLYPH A164 +144C0 ; [.5186.0020.0002] # ANATOLIAN HIEROGLYPH A165 +144C1 ; [.5187.0020.0002] # ANATOLIAN HIEROGLYPH A166 +144C2 ; [.5188.0020.0002] # ANATOLIAN HIEROGLYPH A167 +144C3 ; [.5189.0020.0002] # ANATOLIAN HIEROGLYPH A168 +144C4 ; [.518A.0020.0002] # ANATOLIAN HIEROGLYPH A169 +144C5 ; [.518B.0020.0002] # ANATOLIAN HIEROGLYPH A170 +144C6 ; [.518C.0020.0002] # ANATOLIAN HIEROGLYPH A171 +144C7 ; [.518D.0020.0002] # ANATOLIAN HIEROGLYPH A172 +144C8 ; [.518E.0020.0002] # ANATOLIAN HIEROGLYPH A173 +144C9 ; [.518F.0020.0002] # ANATOLIAN HIEROGLYPH A174 +144CA ; [.5190.0020.0002] # ANATOLIAN HIEROGLYPH A175 +144CB ; [.5191.0020.0002] # ANATOLIAN HIEROGLYPH A176 +144CC ; [.5192.0020.0002] # ANATOLIAN HIEROGLYPH A177 +144CD ; [.5193.0020.0002] # ANATOLIAN HIEROGLYPH A178 +144CE ; [.5194.0020.0002] # ANATOLIAN HIEROGLYPH A179 +144CF ; [.5195.0020.0002] # ANATOLIAN HIEROGLYPH A180 +144D0 ; [.5196.0020.0002] # ANATOLIAN HIEROGLYPH A181 +144D1 ; [.5197.0020.0002] # ANATOLIAN HIEROGLYPH A182 +144D2 ; [.5198.0020.0002] # ANATOLIAN HIEROGLYPH A183 +144D3 ; [.5199.0020.0002] # ANATOLIAN HIEROGLYPH A184 +144D4 ; [.519A.0020.0002] # ANATOLIAN HIEROGLYPH A185 +144D5 ; [.519B.0020.0002] # ANATOLIAN HIEROGLYPH A186 +144D6 ; [.519C.0020.0002] # ANATOLIAN HIEROGLYPH A187 +144D7 ; [.519D.0020.0002] # ANATOLIAN HIEROGLYPH A188 +144D8 ; [.519E.0020.0002] # ANATOLIAN HIEROGLYPH A189 +144D9 ; [.519F.0020.0002] # ANATOLIAN HIEROGLYPH A190 +144DA ; [.51A0.0020.0002] # ANATOLIAN HIEROGLYPH A191 +144DB ; [.51A1.0020.0002] # ANATOLIAN HIEROGLYPH A192 +144DC ; [.51A2.0020.0002] # ANATOLIAN HIEROGLYPH A193 +144DD ; [.51A3.0020.0002] # ANATOLIAN HIEROGLYPH A194 +144DE ; [.51A4.0020.0002] # ANATOLIAN HIEROGLYPH A195 +144DF ; [.51A5.0020.0002] # ANATOLIAN HIEROGLYPH A196 +144E0 ; [.51A6.0020.0002] # ANATOLIAN HIEROGLYPH A197 +144E1 ; [.51A7.0020.0002] # ANATOLIAN HIEROGLYPH A198 +144E2 ; [.51A8.0020.0002] # ANATOLIAN HIEROGLYPH A199 +144E3 ; [.51A9.0020.0002] # ANATOLIAN HIEROGLYPH A200 +144E4 ; [.51AA.0020.0002] # ANATOLIAN HIEROGLYPH A201 +144E5 ; [.51AB.0020.0002] # ANATOLIAN HIEROGLYPH A202 +144E6 ; [.51AC.0020.0002] # ANATOLIAN HIEROGLYPH A202A +144E7 ; [.51AD.0020.0002] # ANATOLIAN HIEROGLYPH A202B +144E8 ; [.51AE.0020.0002] # ANATOLIAN HIEROGLYPH A203 +144E9 ; [.51AF.0020.0002] # ANATOLIAN HIEROGLYPH A204 +144EA ; [.51B0.0020.0002] # ANATOLIAN HIEROGLYPH A205 +144EB ; [.51B1.0020.0002] # ANATOLIAN HIEROGLYPH A206 +144EC ; [.51B2.0020.0002] # ANATOLIAN HIEROGLYPH A207 +144ED ; [.51B3.0020.0002] # ANATOLIAN HIEROGLYPH A207A +144EE ; [.51B4.0020.0002] # ANATOLIAN HIEROGLYPH A208 +144EF ; [.51B5.0020.0002] # ANATOLIAN HIEROGLYPH A209 +144F0 ; [.51B6.0020.0002] # ANATOLIAN HIEROGLYPH A209A +144F1 ; [.51B7.0020.0002] # ANATOLIAN HIEROGLYPH A210 +144F2 ; [.51B8.0020.0002] # ANATOLIAN HIEROGLYPH A211 +144F3 ; [.51B9.0020.0002] # ANATOLIAN HIEROGLYPH A212 +144F4 ; [.51BA.0020.0002] # ANATOLIAN HIEROGLYPH A213 +144F5 ; [.51BB.0020.0002] # ANATOLIAN HIEROGLYPH A214 +144F6 ; [.51BC.0020.0002] # ANATOLIAN HIEROGLYPH A215 +144F7 ; [.51BD.0020.0002] # ANATOLIAN HIEROGLYPH A215A +144F8 ; [.51BE.0020.0002] # ANATOLIAN HIEROGLYPH A216 +144F9 ; [.51BF.0020.0002] # ANATOLIAN HIEROGLYPH A216A +144FA ; [.51C0.0020.0002] # ANATOLIAN HIEROGLYPH A217 +144FB ; [.51C1.0020.0002] # ANATOLIAN HIEROGLYPH A218 +144FC ; [.51C2.0020.0002] # ANATOLIAN HIEROGLYPH A219 +144FD ; [.51C3.0020.0002] # ANATOLIAN HIEROGLYPH A220 +144FE ; [.51C4.0020.0002] # ANATOLIAN HIEROGLYPH A221 +144FF ; [.51C5.0020.0002] # ANATOLIAN HIEROGLYPH A222 +14500 ; [.51C6.0020.0002] # ANATOLIAN HIEROGLYPH A223 +14501 ; [.51C7.0020.0002] # ANATOLIAN HIEROGLYPH A224 +14502 ; [.51C8.0020.0002] # ANATOLIAN HIEROGLYPH A225 +14503 ; [.51C9.0020.0002] # ANATOLIAN HIEROGLYPH A226 +14504 ; [.51CA.0020.0002] # ANATOLIAN HIEROGLYPH A227 +14505 ; [.51CB.0020.0002] # ANATOLIAN HIEROGLYPH A227A +14506 ; [.51CC.0020.0002] # ANATOLIAN HIEROGLYPH A228 +14507 ; [.51CD.0020.0002] # ANATOLIAN HIEROGLYPH A229 +14508 ; [.51CE.0020.0002] # ANATOLIAN HIEROGLYPH A230 +14509 ; [.51CF.0020.0002] # ANATOLIAN HIEROGLYPH A231 +1450A ; [.51D0.0020.0002] # ANATOLIAN HIEROGLYPH A232 +1450B ; [.51D1.0020.0002] # ANATOLIAN HIEROGLYPH A233 +1450C ; [.51D2.0020.0002] # ANATOLIAN HIEROGLYPH A234 +1450D ; [.51D3.0020.0002] # ANATOLIAN HIEROGLYPH A235 +1450E ; [.51D4.0020.0002] # ANATOLIAN HIEROGLYPH A236 +1450F ; [.51D5.0020.0002] # ANATOLIAN HIEROGLYPH A237 +14510 ; [.51D6.0020.0002] # ANATOLIAN HIEROGLYPH A238 +14511 ; [.51D7.0020.0002] # ANATOLIAN HIEROGLYPH A239 +14512 ; [.51D8.0020.0002] # ANATOLIAN HIEROGLYPH A240 +14513 ; [.51D9.0020.0002] # ANATOLIAN HIEROGLYPH A241 +14514 ; [.51DA.0020.0002] # ANATOLIAN HIEROGLYPH A242 +14515 ; [.51DB.0020.0002] # ANATOLIAN HIEROGLYPH A243 +14516 ; [.51DC.0020.0002] # ANATOLIAN HIEROGLYPH A244 +14517 ; [.51DD.0020.0002] # ANATOLIAN HIEROGLYPH A245 +14518 ; [.51DE.0020.0002] # ANATOLIAN HIEROGLYPH A246 +14519 ; [.51DF.0020.0002] # ANATOLIAN HIEROGLYPH A247 +1451A ; [.51E0.0020.0002] # ANATOLIAN HIEROGLYPH A248 +1451B ; [.51E1.0020.0002] # ANATOLIAN HIEROGLYPH A249 +1451C ; [.51E2.0020.0002] # ANATOLIAN HIEROGLYPH A250 +1451D ; [.51E3.0020.0002] # ANATOLIAN HIEROGLYPH A251 +1451E ; [.51E4.0020.0002] # ANATOLIAN HIEROGLYPH A252 +1451F ; [.51E5.0020.0002] # ANATOLIAN HIEROGLYPH A253 +14520 ; [.51E6.0020.0002] # ANATOLIAN HIEROGLYPH A254 +14521 ; [.51E7.0020.0002] # ANATOLIAN HIEROGLYPH A255 +14522 ; [.51E8.0020.0002] # ANATOLIAN HIEROGLYPH A256 +14523 ; [.51E9.0020.0002] # ANATOLIAN HIEROGLYPH A257 +14524 ; [.51EA.0020.0002] # ANATOLIAN HIEROGLYPH A258 +14525 ; [.51EB.0020.0002] # ANATOLIAN HIEROGLYPH A259 +14526 ; [.51EC.0020.0002] # ANATOLIAN HIEROGLYPH A260 +14527 ; [.51ED.0020.0002] # ANATOLIAN HIEROGLYPH A261 +14528 ; [.51EE.0020.0002] # ANATOLIAN HIEROGLYPH A262 +14529 ; [.51EF.0020.0002] # ANATOLIAN HIEROGLYPH A263 +1452A ; [.51F0.0020.0002] # ANATOLIAN HIEROGLYPH A264 +1452B ; [.51F1.0020.0002] # ANATOLIAN HIEROGLYPH A265 +1452C ; [.51F2.0020.0002] # ANATOLIAN HIEROGLYPH A266 +1452D ; [.51F3.0020.0002] # ANATOLIAN HIEROGLYPH A267 +1452E ; [.51F4.0020.0002] # ANATOLIAN HIEROGLYPH A267A +1452F ; [.51F5.0020.0002] # ANATOLIAN HIEROGLYPH A268 +14530 ; [.51F6.0020.0002] # ANATOLIAN HIEROGLYPH A269 +14531 ; [.51F7.0020.0002] # ANATOLIAN HIEROGLYPH A270 +14532 ; [.51F8.0020.0002] # ANATOLIAN HIEROGLYPH A271 +14533 ; [.51F9.0020.0002] # ANATOLIAN HIEROGLYPH A272 +14534 ; [.51FA.0020.0002] # ANATOLIAN HIEROGLYPH A273 +14535 ; [.51FB.0020.0002] # ANATOLIAN HIEROGLYPH A274 +14536 ; [.51FC.0020.0002] # ANATOLIAN HIEROGLYPH A275 +14537 ; [.51FD.0020.0002] # ANATOLIAN HIEROGLYPH A276 +14538 ; [.51FE.0020.0002] # ANATOLIAN HIEROGLYPH A277 +14539 ; [.51FF.0020.0002] # ANATOLIAN HIEROGLYPH A278 +1453A ; [.5200.0020.0002] # ANATOLIAN HIEROGLYPH A279 +1453B ; [.5201.0020.0002] # ANATOLIAN HIEROGLYPH A280 +1453C ; [.5202.0020.0002] # ANATOLIAN HIEROGLYPH A281 +1453D ; [.5203.0020.0002] # ANATOLIAN HIEROGLYPH A282 +1453E ; [.5204.0020.0002] # ANATOLIAN HIEROGLYPH A283 +1453F ; [.5205.0020.0002] # ANATOLIAN HIEROGLYPH A284 +14540 ; [.5206.0020.0002] # ANATOLIAN HIEROGLYPH A285 +14541 ; [.5207.0020.0002] # ANATOLIAN HIEROGLYPH A286 +14542 ; [.5208.0020.0002] # ANATOLIAN HIEROGLYPH A287 +14543 ; [.5209.0020.0002] # ANATOLIAN HIEROGLYPH A288 +14544 ; [.520A.0020.0002] # ANATOLIAN HIEROGLYPH A289 +14545 ; [.520B.0020.0002] # ANATOLIAN HIEROGLYPH A289A +14546 ; [.520C.0020.0002] # ANATOLIAN HIEROGLYPH A290 +14547 ; [.520D.0020.0002] # ANATOLIAN HIEROGLYPH A291 +14548 ; [.520E.0020.0002] # ANATOLIAN HIEROGLYPH A292 +14549 ; [.520F.0020.0002] # ANATOLIAN HIEROGLYPH A293 +1454A ; [.5210.0020.0002] # ANATOLIAN HIEROGLYPH A294 +1454B ; [.5211.0020.0002] # ANATOLIAN HIEROGLYPH A294A +1454C ; [.5212.0020.0002] # ANATOLIAN HIEROGLYPH A295 +1454D ; [.5213.0020.0002] # ANATOLIAN HIEROGLYPH A296 +1454E ; [.5214.0020.0002] # ANATOLIAN HIEROGLYPH A297 +1454F ; [.5215.0020.0002] # ANATOLIAN HIEROGLYPH A298 +14550 ; [.5216.0020.0002] # ANATOLIAN HIEROGLYPH A299 +14551 ; [.5217.0020.0002] # ANATOLIAN HIEROGLYPH A299A +14552 ; [.5218.0020.0002] # ANATOLIAN HIEROGLYPH A300 +14553 ; [.5219.0020.0002] # ANATOLIAN HIEROGLYPH A301 +14554 ; [.521A.0020.0002] # ANATOLIAN HIEROGLYPH A302 +14555 ; [.521B.0020.0002] # ANATOLIAN HIEROGLYPH A303 +14556 ; [.521C.0020.0002] # ANATOLIAN HIEROGLYPH A304 +14557 ; [.521D.0020.0002] # ANATOLIAN HIEROGLYPH A305 +14558 ; [.521E.0020.0002] # ANATOLIAN HIEROGLYPH A306 +14559 ; [.521F.0020.0002] # ANATOLIAN HIEROGLYPH A307 +1455A ; [.5220.0020.0002] # ANATOLIAN HIEROGLYPH A308 +1455B ; [.5221.0020.0002] # ANATOLIAN HIEROGLYPH A309 +1455C ; [.5222.0020.0002] # ANATOLIAN HIEROGLYPH A309A +1455D ; [.5223.0020.0002] # ANATOLIAN HIEROGLYPH A310 +1455E ; [.5224.0020.0002] # ANATOLIAN HIEROGLYPH A311 +1455F ; [.5225.0020.0002] # ANATOLIAN HIEROGLYPH A312 +14560 ; [.5226.0020.0002] # ANATOLIAN HIEROGLYPH A313 +14561 ; [.5227.0020.0002] # ANATOLIAN HIEROGLYPH A314 +14562 ; [.5228.0020.0002] # ANATOLIAN HIEROGLYPH A315 +14563 ; [.5229.0020.0002] # ANATOLIAN HIEROGLYPH A316 +14564 ; [.522A.0020.0002] # ANATOLIAN HIEROGLYPH A317 +14565 ; [.522B.0020.0002] # ANATOLIAN HIEROGLYPH A318 +14566 ; [.522C.0020.0002] # ANATOLIAN HIEROGLYPH A319 +14567 ; [.522D.0020.0002] # ANATOLIAN HIEROGLYPH A320 +14568 ; [.522E.0020.0002] # ANATOLIAN HIEROGLYPH A321 +14569 ; [.522F.0020.0002] # ANATOLIAN HIEROGLYPH A322 +1456A ; [.5230.0020.0002] # ANATOLIAN HIEROGLYPH A323 +1456B ; [.5231.0020.0002] # ANATOLIAN HIEROGLYPH A324 +1456C ; [.5232.0020.0002] # ANATOLIAN HIEROGLYPH A325 +1456D ; [.5233.0020.0002] # ANATOLIAN HIEROGLYPH A326 +1456E ; [.5234.0020.0002] # ANATOLIAN HIEROGLYPH A327 +1456F ; [.5235.0020.0002] # ANATOLIAN HIEROGLYPH A328 +14570 ; [.5236.0020.0002] # ANATOLIAN HIEROGLYPH A329 +14571 ; [.5237.0020.0002] # ANATOLIAN HIEROGLYPH A329A +14572 ; [.5238.0020.0002] # ANATOLIAN HIEROGLYPH A330 +14573 ; [.5239.0020.0002] # ANATOLIAN HIEROGLYPH A331 +14574 ; [.523A.0020.0002] # ANATOLIAN HIEROGLYPH A332A +14575 ; [.523B.0020.0002] # ANATOLIAN HIEROGLYPH A332B +14576 ; [.523C.0020.0002] # ANATOLIAN HIEROGLYPH A332C +14577 ; [.523D.0020.0002] # ANATOLIAN HIEROGLYPH A333 +14578 ; [.523E.0020.0002] # ANATOLIAN HIEROGLYPH A334 +14579 ; [.523F.0020.0002] # ANATOLIAN HIEROGLYPH A335 +1457A ; [.5240.0020.0002] # ANATOLIAN HIEROGLYPH A336 +1457B ; [.5241.0020.0002] # ANATOLIAN HIEROGLYPH A336A +1457C ; [.5242.0020.0002] # ANATOLIAN HIEROGLYPH A336B +1457D ; [.5243.0020.0002] # ANATOLIAN HIEROGLYPH A336C +1457E ; [.5244.0020.0002] # ANATOLIAN HIEROGLYPH A337 +1457F ; [.5245.0020.0002] # ANATOLIAN HIEROGLYPH A338 +14580 ; [.5246.0020.0002] # ANATOLIAN HIEROGLYPH A339 +14581 ; [.5247.0020.0002] # ANATOLIAN HIEROGLYPH A340 +14582 ; [.5248.0020.0002] # ANATOLIAN HIEROGLYPH A341 +14583 ; [.5249.0020.0002] # ANATOLIAN HIEROGLYPH A342 +14584 ; [.524A.0020.0002] # ANATOLIAN HIEROGLYPH A343 +14585 ; [.524B.0020.0002] # ANATOLIAN HIEROGLYPH A344 +14586 ; [.524C.0020.0002] # ANATOLIAN HIEROGLYPH A345 +14587 ; [.524D.0020.0002] # ANATOLIAN HIEROGLYPH A346 +14588 ; [.524E.0020.0002] # ANATOLIAN HIEROGLYPH A347 +14589 ; [.524F.0020.0002] # ANATOLIAN HIEROGLYPH A348 +1458A ; [.5250.0020.0002] # ANATOLIAN HIEROGLYPH A349 +1458B ; [.5251.0020.0002] # ANATOLIAN HIEROGLYPH A350 +1458C ; [.5252.0020.0002] # ANATOLIAN HIEROGLYPH A351 +1458D ; [.5253.0020.0002] # ANATOLIAN HIEROGLYPH A352 +1458E ; [.5254.0020.0002] # ANATOLIAN HIEROGLYPH A353 +1458F ; [.5255.0020.0002] # ANATOLIAN HIEROGLYPH A354 +14590 ; [.5256.0020.0002] # ANATOLIAN HIEROGLYPH A355 +14591 ; [.5257.0020.0002] # ANATOLIAN HIEROGLYPH A356 +14592 ; [.5258.0020.0002] # ANATOLIAN HIEROGLYPH A357 +14593 ; [.5259.0020.0002] # ANATOLIAN HIEROGLYPH A358 +14594 ; [.525A.0020.0002] # ANATOLIAN HIEROGLYPH A359 +14595 ; [.525B.0020.0002] # ANATOLIAN HIEROGLYPH A359A +14596 ; [.525C.0020.0002] # ANATOLIAN HIEROGLYPH A360 +14597 ; [.525D.0020.0002] # ANATOLIAN HIEROGLYPH A361 +14598 ; [.525E.0020.0002] # ANATOLIAN HIEROGLYPH A362 +14599 ; [.525F.0020.0002] # ANATOLIAN HIEROGLYPH A363 +1459A ; [.5260.0020.0002] # ANATOLIAN HIEROGLYPH A364 +1459B ; [.5261.0020.0002] # ANATOLIAN HIEROGLYPH A364A +1459C ; [.5262.0020.0002] # ANATOLIAN HIEROGLYPH A365 +1459D ; [.5263.0020.0002] # ANATOLIAN HIEROGLYPH A366 +1459E ; [.5264.0020.0002] # ANATOLIAN HIEROGLYPH A367 +1459F ; [.5265.0020.0002] # ANATOLIAN HIEROGLYPH A368 +145A0 ; [.5266.0020.0002] # ANATOLIAN HIEROGLYPH A368A +145A1 ; [.5267.0020.0002] # ANATOLIAN HIEROGLYPH A369 +145A2 ; [.5268.0020.0002] # ANATOLIAN HIEROGLYPH A370 +145A3 ; [.5269.0020.0002] # ANATOLIAN HIEROGLYPH A371 +145A4 ; [.526A.0020.0002] # ANATOLIAN HIEROGLYPH A371A +145A5 ; [.526B.0020.0002] # ANATOLIAN HIEROGLYPH A372 +145A6 ; [.526C.0020.0002] # ANATOLIAN HIEROGLYPH A373 +145A7 ; [.526D.0020.0002] # ANATOLIAN HIEROGLYPH A374 +145A8 ; [.526E.0020.0002] # ANATOLIAN HIEROGLYPH A375 +145A9 ; [.526F.0020.0002] # ANATOLIAN HIEROGLYPH A376 +145AA ; [.5270.0020.0002] # ANATOLIAN HIEROGLYPH A377 +145AB ; [.5271.0020.0002] # ANATOLIAN HIEROGLYPH A378 +145AC ; [.5272.0020.0002] # ANATOLIAN HIEROGLYPH A379 +145AD ; [.5273.0020.0002] # ANATOLIAN HIEROGLYPH A380 +145AE ; [.5274.0020.0002] # ANATOLIAN HIEROGLYPH A381 +145AF ; [.5275.0020.0002] # ANATOLIAN HIEROGLYPH A381A +145B0 ; [.5276.0020.0002] # ANATOLIAN HIEROGLYPH A382 +145B1 ; [.5277.0020.0002] # ANATOLIAN HIEROGLYPH A383 RA OR RI +145B2 ; [.5278.0020.0002] # ANATOLIAN HIEROGLYPH A383A +145B3 ; [.5279.0020.0002] # ANATOLIAN HIEROGLYPH A384 +145B4 ; [.527A.0020.0002] # ANATOLIAN HIEROGLYPH A385 +145B5 ; [.527B.0020.0002] # ANATOLIAN HIEROGLYPH A386 +145B6 ; [.527C.0020.0002] # ANATOLIAN HIEROGLYPH A386A +145B7 ; [.527D.0020.0002] # ANATOLIAN HIEROGLYPH A387 +145B8 ; [.527E.0020.0002] # ANATOLIAN HIEROGLYPH A388 +145B9 ; [.527F.0020.0002] # ANATOLIAN HIEROGLYPH A389 +145BA ; [.5280.0020.0002] # ANATOLIAN HIEROGLYPH A390 +145BB ; [.5281.0020.0002] # ANATOLIAN HIEROGLYPH A391 +145BC ; [.5282.0020.0002] # ANATOLIAN HIEROGLYPH A392 +145BD ; [.5283.0020.0002] # ANATOLIAN HIEROGLYPH A393 EIGHT +145BE ; [.5284.0020.0002] # ANATOLIAN HIEROGLYPH A394 +145BF ; [.5285.0020.0002] # ANATOLIAN HIEROGLYPH A395 +145C0 ; [.5286.0020.0002] # ANATOLIAN HIEROGLYPH A396 +145C1 ; [.5287.0020.0002] # ANATOLIAN HIEROGLYPH A397 +145C2 ; [.5288.0020.0002] # ANATOLIAN HIEROGLYPH A398 +145C3 ; [.5289.0020.0002] # ANATOLIAN HIEROGLYPH A399 +145C4 ; [.528A.0020.0002] # ANATOLIAN HIEROGLYPH A400 +145C5 ; [.528B.0020.0002] # ANATOLIAN HIEROGLYPH A401 +145C6 ; [.528C.0020.0002] # ANATOLIAN HIEROGLYPH A402 +145C7 ; [.528D.0020.0002] # ANATOLIAN HIEROGLYPH A403 +145C8 ; [.528E.0020.0002] # ANATOLIAN HIEROGLYPH A404 +145C9 ; [.528F.0020.0002] # ANATOLIAN HIEROGLYPH A405 +145CA ; [.5290.0020.0002] # ANATOLIAN HIEROGLYPH A406 +145CB ; [.5291.0020.0002] # ANATOLIAN HIEROGLYPH A407 +145CC ; [.5292.0020.0002] # ANATOLIAN HIEROGLYPH A408 +145CD ; [.5293.0020.0002] # ANATOLIAN HIEROGLYPH A409 +145CE ; [.5294.0020.0002] # ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK +145CF ; [.5295.0020.0002] # ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK +145D0 ; [.5296.0020.0002] # ANATOLIAN HIEROGLYPH A411 +145D1 ; [.5297.0020.0002] # ANATOLIAN HIEROGLYPH A412 +145D2 ; [.5298.0020.0002] # ANATOLIAN HIEROGLYPH A413 +145D3 ; [.5299.0020.0002] # ANATOLIAN HIEROGLYPH A414 +145D4 ; [.529A.0020.0002] # ANATOLIAN HIEROGLYPH A415 +145D5 ; [.529B.0020.0002] # ANATOLIAN HIEROGLYPH A416 +145D6 ; [.529C.0020.0002] # ANATOLIAN HIEROGLYPH A417 +145D7 ; [.529D.0020.0002] # ANATOLIAN HIEROGLYPH A418 +145D8 ; [.529E.0020.0002] # ANATOLIAN HIEROGLYPH A419 +145D9 ; [.529F.0020.0002] # ANATOLIAN HIEROGLYPH A420 +145DA ; [.52A0.0020.0002] # ANATOLIAN HIEROGLYPH A421 +145DB ; [.52A1.0020.0002] # ANATOLIAN HIEROGLYPH A422 +145DC ; [.52A2.0020.0002] # ANATOLIAN HIEROGLYPH A423 +145DD ; [.52A3.0020.0002] # ANATOLIAN HIEROGLYPH A424 +145DE ; [.52A4.0020.0002] # ANATOLIAN HIEROGLYPH A425 +145DF ; [.52A5.0020.0002] # ANATOLIAN HIEROGLYPH A426 +145E0 ; [.52A6.0020.0002] # ANATOLIAN HIEROGLYPH A427 +145E1 ; [.52A7.0020.0002] # ANATOLIAN HIEROGLYPH A428 +145E2 ; [.52A8.0020.0002] # ANATOLIAN HIEROGLYPH A429 +145E3 ; [.52A9.0020.0002] # ANATOLIAN HIEROGLYPH A430 +145E4 ; [.52AA.0020.0002] # ANATOLIAN HIEROGLYPH A431 +145E5 ; [.52AB.0020.0002] # ANATOLIAN HIEROGLYPH A432 +145E6 ; [.52AC.0020.0002] # ANATOLIAN HIEROGLYPH A433 +145E7 ; [.52AD.0020.0002] # ANATOLIAN HIEROGLYPH A434 +145E8 ; [.52AE.0020.0002] # ANATOLIAN HIEROGLYPH A435 +145E9 ; [.52AF.0020.0002] # ANATOLIAN HIEROGLYPH A436 +145EA ; [.52B0.0020.0002] # ANATOLIAN HIEROGLYPH A437 +145EB ; [.52B1.0020.0002] # ANATOLIAN HIEROGLYPH A438 +145EC ; [.52B2.0020.0002] # ANATOLIAN HIEROGLYPH A439 +145ED ; [.52B3.0020.0002] # ANATOLIAN HIEROGLYPH A440 +145EE ; [.52B4.0020.0002] # ANATOLIAN HIEROGLYPH A441 +145EF ; [.52B5.0020.0002] # ANATOLIAN HIEROGLYPH A442 +145F0 ; [.52B6.0020.0002] # ANATOLIAN HIEROGLYPH A443 +145F1 ; [.52B7.0020.0002] # ANATOLIAN HIEROGLYPH A444 +145F2 ; [.52B8.0020.0002] # ANATOLIAN HIEROGLYPH A445 +145F3 ; [.52B9.0020.0002] # ANATOLIAN HIEROGLYPH A446 +145F4 ; [.52BA.0020.0002] # ANATOLIAN HIEROGLYPH A447 +145F5 ; [.52BB.0020.0002] # ANATOLIAN HIEROGLYPH A448 +145F6 ; [.52BC.0020.0002] # ANATOLIAN HIEROGLYPH A449 +145F7 ; [.52BD.0020.0002] # ANATOLIAN HIEROGLYPH A450 +145F8 ; [.52BE.0020.0002] # ANATOLIAN HIEROGLYPH A450A +145F9 ; [.52BF.0020.0002] # ANATOLIAN HIEROGLYPH A451 +145FA ; [.52C0.0020.0002] # ANATOLIAN HIEROGLYPH A452 +145FB ; [.52C1.0020.0002] # ANATOLIAN HIEROGLYPH A453 +145FC ; [.52C2.0020.0002] # ANATOLIAN HIEROGLYPH A454 +145FD ; [.52C3.0020.0002] # ANATOLIAN HIEROGLYPH A455 +145FE ; [.52C4.0020.0002] # ANATOLIAN HIEROGLYPH A456 +145FF ; [.52C5.0020.0002] # ANATOLIAN HIEROGLYPH A457 +14600 ; [.52C6.0020.0002] # ANATOLIAN HIEROGLYPH A457A +14601 ; [.52C7.0020.0002] # ANATOLIAN HIEROGLYPH A458 +14602 ; [.52C8.0020.0002] # ANATOLIAN HIEROGLYPH A459 +14603 ; [.52C9.0020.0002] # ANATOLIAN HIEROGLYPH A460 +14604 ; [.52CA.0020.0002] # ANATOLIAN HIEROGLYPH A461 +14605 ; [.52CB.0020.0002] # ANATOLIAN HIEROGLYPH A462 +14606 ; [.52CC.0020.0002] # ANATOLIAN HIEROGLYPH A463 +14607 ; [.52CD.0020.0002] # ANATOLIAN HIEROGLYPH A464 +14608 ; [.52CE.0020.0002] # ANATOLIAN HIEROGLYPH A465 +14609 ; [.52CF.0020.0002] # ANATOLIAN HIEROGLYPH A466 +1460A ; [.52D0.0020.0002] # ANATOLIAN HIEROGLYPH A467 +1460B ; [.52D1.0020.0002] # ANATOLIAN HIEROGLYPH A468 +1460C ; [.52D2.0020.0002] # ANATOLIAN HIEROGLYPH A469 +1460D ; [.52D3.0020.0002] # ANATOLIAN HIEROGLYPH A470 +1460E ; [.52D4.0020.0002] # ANATOLIAN HIEROGLYPH A471 +1460F ; [.52D5.0020.0002] # ANATOLIAN HIEROGLYPH A472 +14610 ; [.52D6.0020.0002] # ANATOLIAN HIEROGLYPH A473 +14611 ; [.52D7.0020.0002] # ANATOLIAN HIEROGLYPH A474 +14612 ; [.52D8.0020.0002] # ANATOLIAN HIEROGLYPH A475 +14613 ; [.52D9.0020.0002] # ANATOLIAN HIEROGLYPH A476 +14614 ; [.52DA.0020.0002] # ANATOLIAN HIEROGLYPH A477 +14615 ; [.52DB.0020.0002] # ANATOLIAN HIEROGLYPH A478 +14616 ; [.52DC.0020.0002] # ANATOLIAN HIEROGLYPH A479 +14617 ; [.52DD.0020.0002] # ANATOLIAN HIEROGLYPH A480 +14618 ; [.52DE.0020.0002] # ANATOLIAN HIEROGLYPH A481 +14619 ; [.52DF.0020.0002] # ANATOLIAN HIEROGLYPH A482 +1461A ; [.52E0.0020.0002] # ANATOLIAN HIEROGLYPH A483 +1461B ; [.52E1.0020.0002] # ANATOLIAN HIEROGLYPH A484 +1461C ; [.52E2.0020.0002] # ANATOLIAN HIEROGLYPH A485 +1461D ; [.52E3.0020.0002] # ANATOLIAN HIEROGLYPH A486 +1461E ; [.52E4.0020.0002] # ANATOLIAN HIEROGLYPH A487 +1461F ; [.52E5.0020.0002] # ANATOLIAN HIEROGLYPH A488 +14620 ; [.52E6.0020.0002] # ANATOLIAN HIEROGLYPH A489 +14621 ; [.52E7.0020.0002] # ANATOLIAN HIEROGLYPH A490 +14622 ; [.52E8.0020.0002] # ANATOLIAN HIEROGLYPH A491 +14623 ; [.52E9.0020.0002] # ANATOLIAN HIEROGLYPH A492 +14624 ; [.52EA.0020.0002] # ANATOLIAN HIEROGLYPH A493 +14625 ; [.52EB.0020.0002] # ANATOLIAN HIEROGLYPH A494 +14626 ; [.52EC.0020.0002] # ANATOLIAN HIEROGLYPH A495 +14627 ; [.52ED.0020.0002] # ANATOLIAN HIEROGLYPH A496 +14628 ; [.52EE.0020.0002] # ANATOLIAN HIEROGLYPH A497 +14629 ; [.52EF.0020.0002] # ANATOLIAN HIEROGLYPH A501 +1462A ; [.52F0.0020.0002] # ANATOLIAN HIEROGLYPH A502 +1462B ; [.52F1.0020.0002] # ANATOLIAN HIEROGLYPH A503 +1462C ; [.52F2.0020.0002] # ANATOLIAN HIEROGLYPH A504 +1462D ; [.52F3.0020.0002] # ANATOLIAN HIEROGLYPH A505 +1462E ; [.52F4.0020.0002] # ANATOLIAN HIEROGLYPH A506 +1462F ; [.52F5.0020.0002] # ANATOLIAN HIEROGLYPH A507 +14630 ; [.52F6.0020.0002] # ANATOLIAN HIEROGLYPH A508 +14631 ; [.52F7.0020.0002] # ANATOLIAN HIEROGLYPH A509 +14632 ; [.52F8.0020.0002] # ANATOLIAN HIEROGLYPH A510 +14633 ; [.52F9.0020.0002] # ANATOLIAN HIEROGLYPH A511 +14634 ; [.52FA.0020.0002] # ANATOLIAN HIEROGLYPH A512 +14635 ; [.52FB.0020.0002] # ANATOLIAN HIEROGLYPH A513 +14636 ; [.52FC.0020.0002] # ANATOLIAN HIEROGLYPH A514 +14637 ; [.52FD.0020.0002] # ANATOLIAN HIEROGLYPH A515 +14638 ; [.52FE.0020.0002] # ANATOLIAN HIEROGLYPH A516 +14639 ; [.52FF.0020.0002] # ANATOLIAN HIEROGLYPH A517 +1463A ; [.5300.0020.0002] # ANATOLIAN HIEROGLYPH A518 +1463B ; [.5301.0020.0002] # ANATOLIAN HIEROGLYPH A519 +1463C ; [.5302.0020.0002] # ANATOLIAN HIEROGLYPH A520 +1463D ; [.5303.0020.0002] # ANATOLIAN HIEROGLYPH A521 +1463E ; [.5304.0020.0002] # ANATOLIAN HIEROGLYPH A522 +1463F ; [.5305.0020.0002] # ANATOLIAN HIEROGLYPH A523 +14640 ; [.5306.0020.0002] # ANATOLIAN HIEROGLYPH A524 +14641 ; [.5307.0020.0002] # ANATOLIAN HIEROGLYPH A525 +14642 ; [.5308.0020.0002] # ANATOLIAN HIEROGLYPH A526 +14643 ; [.5309.0020.0002] # ANATOLIAN HIEROGLYPH A527 +14644 ; [.530A.0020.0002] # ANATOLIAN HIEROGLYPH A528 +14645 ; [.530B.0020.0002] # ANATOLIAN HIEROGLYPH A529 +14646 ; [.530C.0020.0002] # ANATOLIAN HIEROGLYPH A530 +2F00 ; [.FB40.0020.0004][.CE00.0000.0000] # KANGXI RADICAL ONE +3220 ; [*0310.0020.0004][.FB40.0020.0004][.CE00.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH ONE +3280 ; [.FB40.0020.0006][.CE00.0000.0000] # CIRCLED IDEOGRAPH ONE +3192 ; [.FB40.0020.0014][.CE00.0000.0000] # IDEOGRAPHIC ANNOTATION ONE MARK +1F229 ; [.FB40.0020.001C][.CE00.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E00 +319C ; [.FB40.0020.0014][.CE01.0000.0000] # IDEOGRAPHIC ANNOTATION FOURTH MARK +3226 ; [*0310.0020.0004][.FB40.0020.0004][.CE03.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SEVEN +3286 ; [.FB40.0020.0006][.CE03.0000.0000] # CIRCLED IDEOGRAPH SEVEN +3222 ; [*0310.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH THREE +1F241 ; [*0372.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 +3282 ; [.FB40.0020.0006][.CE09.0000.0000] # CIRCLED IDEOGRAPH THREE +3194 ; [.FB40.0020.0014][.CE09.0000.0000] # IDEOGRAPHIC ANNOTATION THREE MARK +1F22A ; [.FB40.0020.001C][.CE09.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E09 +32A4 ; [.FB40.0020.0006][.CE0A.0000.0000] # CIRCLED IDEOGRAPH HIGH +3196 ; [.FB40.0020.0014][.CE0A.0000.0000] # IDEOGRAPHIC ANNOTATION TOP MARK +32A6 ; [.FB40.0020.0006][.CE0B.0000.0000] # CIRCLED IDEOGRAPH LOW +3198 ; [.FB40.0020.0014][.CE0B.0000.0000] # IDEOGRAPHIC ANNOTATION BOTTOM MARK +F967 ; [.FB40.0020.0002][.CE0D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F967 +319B ; [.FB40.0020.0014][.CE19.0000.0000] # IDEOGRAPHIC ANNOTATION THIRD MARK +FA70 ; [.FB40.0020.0002][.CE26.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA70 +2F01 ; [.FB40.0020.0004][.CE28.0000.0000] # KANGXI RADICAL LINE +2EA6 ; [.FB40.0020.0004][.CE2C.0000.0000] # CJK RADICAL SIMPLIFIED HALF TREE TRUNK +32A5 ; [.FB40.0020.0006][.CE2D.0000.0000] # CIRCLED IDEOGRAPH CENTRE +3197 ; [.FB40.0020.0014][.CE2D.0000.0000] # IDEOGRAPHIC ANNOTATION MIDDLE MARK +1F22D ; [.FB40.0020.001C][.CE2D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E2D +F905 ; [.FB40.0020.0002][.CE32.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F905 +2F02 ; [.FB40.0020.0004][.CE36.0000.0000] # KANGXI RADICAL DOT +2E80 ; [.FB40.0020.0004][.CE36.0000.0000][.0000.010B.0004] # CJK RADICAL REPEAT +2F801 ; [.FB40.0020.0002][.CE38.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F801 +F95E ; [.FB40.0020.0002][.CE39.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95E +2F800 ; [.FB40.0020.0002][.CE3D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F800 +2F03 ; [.FB40.0020.0004][.CE3F.0000.0000] # KANGXI RADICAL SLASH +2F802 ; [.FB40.0020.0002][.CE41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F802 +2F04 ; [.FB40.0020.0004][.CE59.0000.0000] # KANGXI RADICAL SECOND +319A ; [.FB40.0020.0014][.CE59.0000.0000] # IDEOGRAPHIC ANNOTATION SECOND MARK +2E84 ; [.FB40.0020.0004][.CE59.0000.0000][.0000.010B.0004] # CJK RADICAL SECOND THREE +2E83 ; [.FB40.0020.0004][.CE5A.0000.0000] # CJK RADICAL SECOND TWO +2E82 ; [.FB40.0020.0004][.CE5B.0000.0000] # CJK RADICAL SECOND ONE +3228 ; [*0310.0020.0004][.FB40.0020.0004][.CE5D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH NINE +3288 ; [.FB40.0020.0006][.CE5D.0000.0000] # CIRCLED IDEOGRAPH NINE +F91B ; [.FB40.0020.0002][.CE82.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91B +2F05 ; [.FB40.0020.0004][.CE85.0000.0000] # KANGXI RADICAL HOOK +F9BA ; [.FB40.0020.0002][.CE86.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BA +2F06 ; [.FB40.0020.0004][.CE8C.0000.0000] # KANGXI RADICAL TWO +3221 ; [*0310.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH TWO +1F242 ; [*0372.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C +3281 ; [.FB40.0020.0006][.CE8C.0000.0000] # CIRCLED IDEOGRAPH TWO +3193 ; [.FB40.0020.0014][.CE8C.0000.0000] # IDEOGRAPHIC ANNOTATION TWO MARK +1F214 ; [.FB40.0020.001C][.CE8C.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E8C +3224 ; [*0310.0020.0004][.FB40.0020.0004][.CE94.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FIVE +3284 ; [.FB40.0020.0006][.CE94.0000.0000] # CIRCLED IDEOGRAPH FIVE +2F07 ; [.FB40.0020.0004][.CEA0.0000.0000] # KANGXI RADICAL LID +1F218 ; [.FB40.0020.001C][.CEA4.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4EA4 +F977 ; [.FB40.0020.0002][.CEAE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F977 +2F08 ; [.FB40.0020.0004][.CEBA.0000.0000] # KANGXI RADICAL MAN +319F ; [.FB40.0020.0014][.CEBA.0000.0000] # IDEOGRAPHIC ANNOTATION MAN MARK +2E85 ; [.FB40.0020.0004][.CEBB.0000.0000] # CJK RADICAL PERSON +F9FD ; [.FB40.0020.0002][.CEC0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FD +2F819 ; [.FB40.0020.0002][.CECC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F819 +3239 ; [*0310.0020.0004][.FB40.0020.0004][.CEE3.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH REPRESENT +F9A8 ; [.FB40.0020.0002][.CEE4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A8 +323D ; [*0310.0020.0004][.FB40.0020.0004][.CF01.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH ENTERPRISE +32AD ; [.FB40.0020.0006][.CF01.0000.0000] # CIRCLED IDEOGRAPH ENTERPRISE +3241 ; [*0310.0020.0004][.FB40.0020.0004][.CF11.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH REST +32A1 ; [.FB40.0020.0006][.CF11.0000.0000] # CIRCLED IDEOGRAPH REST +2F804 ; [.FB40.0020.0002][.CF60.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F804 +FA73 ; [.FB40.0020.0002][.CF80.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA73 +F92D ; [.FB40.0020.0002][.CF86.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92D +F9B5 ; [.FB40.0020.0002][.CF8B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B5 +FA30 ; [.FB40.0020.0002][.CFAE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA30 +2F805 ; [.FB40.0020.0002][.CFAE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F805 +2F806 ; [.FB40.0020.0002][.CFBB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F806 +F965 ; [.FB40.0020.0002][.CFBF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F965 +2F807 ; [.FB40.0020.0002][.D002.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F807 +F9D4 ; [.FB40.0020.0002][.D02B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D4 +2F808 ; [.FB40.0020.0002][.D07A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F808 +2F809 ; [.FB40.0020.0002][.D099.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F809 +2F80B ; [.FB40.0020.0002][.D0CF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F80B +F9BB ; [.FB40.0020.0002][.D0DA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BB +FA31 ; [.FB40.0020.0002][.D0E7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA31 +2F80A ; [.FB40.0020.0002][.D0E7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F80A +329D ; [.FB40.0020.0006][.D12A.0000.0000] # CIRCLED IDEOGRAPH EXCELLENT +2F09 ; [.FB40.0020.0004][.D13F.0000.0000] # KANGXI RADICAL LEGS +FA0C ; [.FB40.0020.0002][.D140.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA0C +FA74 ; [.FB40.0020.0002][.D145.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA74 +FA32 ; [.FB40.0020.0002][.D14D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA32 +2F80E ; [.FB40.0020.0002][.D14D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F80E +2F80F ; [.FB40.0020.0002][.D154.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F80F +2F810 ; [.FB40.0020.0002][.D164.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F810 +2F0A ; [.FB40.0020.0004][.D165.0000.0000] # KANGXI RADICAL ENTER +2F814 ; [.FB40.0020.0002][.D167.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F814 +FA72 ; [.FB40.0020.0002][.D168.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA72 +F978 ; [.FB40.0020.0002][.D169.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F978 +2F0B ; [.FB40.0020.0004][.D16B.0000.0000] # KANGXI RADICAL EIGHT +3227 ; [*0310.0020.0004][.FB40.0020.0004][.D16B.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH EIGHT +3287 ; [.FB40.0020.0006][.D16B.0000.0000] # CIRCLED IDEOGRAPH EIGHT +F9D1 ; [.FB40.0020.0002][.D16D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D1 +3225 ; [*0310.0020.0004][.FB40.0020.0004][.D16D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SIX +3285 ; [.FB40.0020.0006][.D16D.0000.0000] # CIRCLED IDEOGRAPH SIX +2F811 ; [.FB40.0020.0002][.D177.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F811 +FA75 ; [.FB40.0020.0002][.D180.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA75 +2F0C ; [.FB40.0020.0004][.D182.0000.0000] # KANGXI RADICAL DOWN BOX +2E86 ; [.FB40.0020.0004][.D182.0000.0000][.0000.010B.0004] # CJK RADICAL BOX +2F815 ; [.FB40.0020.0002][.D18D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F815 +1F21E ; [.FB40.0020.001C][.D18D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-518D +2F8D2 ; [.FB40.0020.0002][.D192.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D2 +2F8D3 ; [.FB40.0020.0002][.D195.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D3 +2F0D ; [.FB40.0020.0004][.D196.0000.0000] # KANGXI RADICAL COVER +2F817 ; [.FB40.0020.0002][.D197.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F817 +32A2 ; [.FB40.0020.0006][.D199.0000.0000] # CIRCLED IDEOGRAPH COPY +2F818 ; [.FB40.0020.0002][.D1A4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F818 +2F0E ; [.FB40.0020.0004][.D1AB.0000.0000] # KANGXI RADICAL ICE +2F81A ; [.FB40.0020.0002][.D1AC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81A +FA71 ; [.FB40.0020.0002][.D1B5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA71 +2F81B ; [.FB40.0020.0002][.D1B5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81B +F92E ; [.FB40.0020.0002][.D1B7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92E +F979 ; [.FB40.0020.0002][.D1C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F979 +F955 ; [.FB40.0020.0002][.D1CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F955 +F954 ; [.FB40.0020.0002][.D1DC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F954 +FA15 ; [.FB40.0020.0002][.D1DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA15 +2F0F ; [.FB40.0020.0004][.D1E0.0000.0000] # KANGXI RADICAL TABLE +2E87 ; [.FB40.0020.0004][.D1E0.0000.0000][.0000.010B.0004] # CJK RADICAL TABLE +2F81D ; [.FB40.0020.0002][.D1F5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81D +2F10 ; [.FB40.0020.0004][.D1F5.0000.0000] # KANGXI RADICAL OPEN BOX +2F11 ; [.FB40.0020.0004][.D200.0000.0000] # KANGXI RADICAL KNIFE +2E88 ; [.FB40.0020.0004][.D200.0000.0000][.0000.010B.0004] # CJK RADICAL KNIFE ONE +2E89 ; [.FB40.0020.0004][.D202.0000.0000] # CJK RADICAL KNIFE TWO +2F81E ; [.FB40.0020.0002][.D203.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81E +FA00 ; [.FB40.0020.0002][.D207.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA00 +2F850 ; [.FB40.0020.0002][.D207.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F850 +F99C ; [.FB40.0020.0002][.D217.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99C +1F220 ; [.FB40.0020.001C][.D21D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-521D +F9DD ; [.FB40.0020.0002][.D229.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DD +F9FF ; [.FB40.0020.0002][.D23A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FF +2F820 ; [.FB40.0020.0002][.D23B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F820 +2F821 ; [.FB40.0020.0002][.D246.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F821 +1F21C ; [.FB40.0020.001C][.D24D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-524D +2F822 ; [.FB40.0020.0002][.D272.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F822 +1F239 ; [.FB40.0020.001C][.D272.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5272 +2F823 ; [.FB40.0020.0002][.D277.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F823 +F9C7 ; [.FB40.0020.0002][.D289.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C7 +F98A ; [.FB40.0020.0002][.D29B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98A +2F12 ; [.FB40.0020.0004][.D29B.0000.0000] # KANGXI RADICAL POWER +F99D ; [.FB40.0020.0002][.D2A3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99D +2F992 ; [.FB40.0020.0002][.D2B3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F992 +3238 ; [*0310.0020.0004][.FB40.0020.0004][.D2B4.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH LABOR +3298 ; [.FB40.0020.0006][.D2B4.0000.0000] # CIRCLED IDEOGRAPH LABOR +FA76 ; [.FB40.0020.0002][.D2C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA76 +2F825 ; [.FB40.0020.0002][.D2C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F825 +FA33 ; [.FB40.0020.0002][.D2C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA33 +2F826 ; [.FB40.0020.0002][.D2C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F826 +F952 ; [.FB40.0020.0002][.D2D2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F952 +1F247 ; [*0372.0020.0004][.FB40.0020.0004][.D2DD.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD +F92F ; [.FB40.0020.0002][.D2DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92F +FA34 ; [.FB40.0020.0002][.D2E4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA34 +2F827 ; [.FB40.0020.0002][.D2E4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F827 +F97F ; [.FB40.0020.0002][.D2F5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97F +2F13 ; [.FB40.0020.0004][.D2F9.0000.0000] # KANGXI RADICAL WRAP +FA77 ; [.FB40.0020.0002][.D2FA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA77 +2F828 ; [.FB40.0020.0002][.D2FA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F828 +2F829 ; [.FB40.0020.0002][.D305.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F829 +2F82A ; [.FB40.0020.0002][.D306.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82A +2F14 ; [.FB40.0020.0004][.D315.0000.0000] # KANGXI RADICAL SPOON +F963 ; [.FB40.0020.0002][.D317.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F963 +2F82B ; [.FB40.0020.0002][.D317.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82B +2F15 ; [.FB40.0020.0004][.D31A.0000.0000] # KANGXI RADICAL RIGHT OPEN BOX +2F16 ; [.FB40.0020.0004][.D338.0000.0000] # KANGXI RADICAL HIDING ENCLOSURE +32A9 ; [.FB40.0020.0006][.D33B.0000.0000] # CIRCLED IDEOGRAPH MEDICINE +F9EB ; [.FB40.0020.0002][.D33F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EB +2F17 ; [.FB40.0020.0004][.D341.0000.0000] # KANGXI RADICAL TEN +3038 ; [.FB40.0020.0004][.D341.0000.0000] # HANGZHOU NUMERAL TEN +3229 ; [*0310.0020.0004][.FB40.0020.0004][.D341.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH TEN +3289 ; [.FB40.0020.0006][.D341.0000.0000] # CIRCLED IDEOGRAPH TEN +3039 ; [.FB40.0020.0004][.D344.0000.0000] # HANGZHOU NUMERAL TWENTY +303A ; [.FB40.0020.0004][.D345.0000.0000] # HANGZHOU NUMERAL THIRTY +2F82C ; [.FB40.0020.0002][.D349.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82C +FA35 ; [.FB40.0020.0002][.D351.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA35 +2F82D ; [.FB40.0020.0002][.D351.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82D +323F ; [*0310.0020.0004][.FB40.0020.0004][.D354.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH ALLIANCE +32AF ; [.FB40.0020.0006][.D354.0000.0000] # CIRCLED IDEOGRAPH ALLIANCE +2F82E ; [.FB40.0020.0002][.D35A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82E +2F18 ; [.FB40.0020.0004][.D35C.0000.0000] # KANGXI RADICAL DIVINATION +2E8A ; [.FB40.0020.0004][.D35C.0000.0000][.0000.010B.0004] # CJK RADICAL DIVINATION +2F19 ; [.FB40.0020.0004][.D369.0000.0000] # KANGXI RADICAL SEAL +2E8B ; [.FB40.0020.0004][.D369.0000.0000][.0000.010B.0004] # CJK RADICAL SEAL +329E ; [.FB40.0020.0006][.D370.0000.0000] # CIRCLED IDEOGRAPH PRINT +2F82F ; [.FB40.0020.0002][.D373.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82F +F91C ; [.FB40.0020.0002][.D375.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91C +2F830 ; [.FB40.0020.0002][.D37D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F830 +2F831 ; [.FB40.0020.0002][.D37F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F831 +2F832 ; [.FB40.0020.0002][.D37F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F832 +2F833 ; [.FB40.0020.0002][.D37F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F833 +2F1A ; [.FB40.0020.0004][.D382.0000.0000] # KANGXI RADICAL CLIFF +2E81 ; [.FB40.0020.0004][.D382.0000.0000][.0000.010B.0004] # CJK RADICAL CLIFF +2F1B ; [.FB40.0020.0004][.D3B6.0000.0000] # KANGXI RADICAL PRIVATE +F96B ; [.FB40.0020.0002][.D3C3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96B +2F1C ; [.FB40.0020.0004][.D3C8.0000.0000] # KANGXI RADICAL AGAIN +2F836 ; [.FB40.0020.0002][.D3CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F836 +1F212 ; [.FB40.0020.001C][.D3CC.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-53CC +2F837 ; [.FB40.0020.0002][.D3DF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F837 +2F1D ; [.FB40.0020.0004][.D3E3.0000.0000] # KANGXI RADICAL MOUTH +F906 ; [.FB40.0020.0002][.D3E5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F906 +2F839 ; [.FB40.0020.0002][.D3EB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F839 +1F251 ; [.FB40.0020.0006][.D3EF.0000.0000] # CIRCLED IDEOGRAPH ACCEPT +2F83A ; [.FB40.0020.0002][.D3F1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83A +32A8 ; [.FB40.0020.0006][.D3F3.0000.0000] # CIRCLED IDEOGRAPH RIGHT +1F22E ; [.FB40.0020.001C][.D3F3.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-53F3 +2F83B ; [.FB40.0020.0002][.D406.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83B +1F234 ; [.FB40.0020.001C][.D408.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5408 +3234 ; [*0310.0020.0004][.FB40.0020.0004][.D40D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH NAME +3294 ; [.FB40.0020.0006][.D40D.0000.0000] # CIRCLED IDEOGRAPH NAME +F9DE ; [.FB40.0020.0002][.D40F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DE +F9ED ; [.FB40.0020.0002][.D41D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9ED +2F83D ; [.FB40.0020.0002][.D438.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83D +1F225 ; [.FB40.0020.001C][.D439.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5439 +F980 ; [.FB40.0020.0002][.D442.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F980 +2F83E ; [.FB40.0020.0002][.D448.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83E +2F83F ; [.FB40.0020.0002][.D468.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83F +323A ; [*0310.0020.0004][.FB40.0020.0004][.D47C.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH CALL +2F83C ; [.FB40.0020.0002][.D49E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83C +2F840 ; [.FB40.0020.0002][.D4A2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F840 +F99E ; [.FB40.0020.0002][.D4BD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99E +2F841 ; [.FB40.0020.0002][.D4F6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F841 +2F842 ; [.FB40.0020.0002][.D510.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F842 +3244 ; [.FB40.0020.0006][.D54F.0000.0000] # CIRCLED IDEOGRAPH QUESTION +2F843 ; [.FB40.0020.0002][.D553.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F843 +FA79 ; [.FB40.0020.0002][.D555.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA79 +2F844 ; [.FB40.0020.0002][.D563.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F844 +2F845 ; [.FB40.0020.0002][.D584.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F845 +2F846 ; [.FB40.0020.0002][.D584.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F846 +F90B ; [.FB40.0020.0002][.D587.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90B +FA7A ; [.FB40.0020.0002][.D599.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA7A +2F847 ; [.FB40.0020.0002][.D599.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F847 +FA36 ; [.FB40.0020.0002][.D59D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA36 +FA78 ; [.FB40.0020.0002][.D59D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA78 +2F848 ; [.FB40.0020.0002][.D5AB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F848 +2F849 ; [.FB40.0020.0002][.D5B3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F849 +1F23A ; [.FB40.0020.001C][.D5B6.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-55B6 +FA0D ; [.FB40.0020.0002][.D5C0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA0D +2F84A ; [.FB40.0020.0002][.D5C2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84A +FA7B ; [.FB40.0020.0002][.D5E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA7B +FA37 ; [.FB40.0020.0002][.D606.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA37 +2F84C ; [.FB40.0020.0002][.D606.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84C +2F84E ; [.FB40.0020.0002][.D651.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84E +FA38 ; [.FB40.0020.0002][.D668.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA38 +2F84F ; [.FB40.0020.0002][.D674.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84F +2F1E ; [.FB40.0020.0004][.D6D7.0000.0000] # KANGXI RADICAL ENCLOSURE +3223 ; [*0310.0020.0004][.FB40.0020.0004][.D6DB.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FOUR +3283 ; [.FB40.0020.0006][.D6DB.0000.0000] # CIRCLED IDEOGRAPH FOUR +3195 ; [.FB40.0020.0014][.D6DB.0000.0000] # IDEOGRAPHIC ANNOTATION FOUR MARK +F9A9 ; [.FB40.0020.0002][.D6F9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A9 +2F84B ; [.FB40.0020.0002][.D716.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84B +2F84D ; [.FB40.0020.0002][.D717.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84D +2F1F ; [.FB40.0020.0004][.D71F.0000.0000] # KANGXI RADICAL EARTH +322F ; [*0310.0020.0004][.FB40.0020.0004][.D71F.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH EARTH +328F ; [.FB40.0020.0006][.D71F.0000.0000] # CIRCLED IDEOGRAPH EARTH +319E ; [.FB40.0020.0014][.D730.0000.0000] # IDEOGRAPHIC ANNOTATION EARTH MARK +2F855 ; [.FB40.0020.0002][.D78B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F855 +2F852 ; [.FB40.0020.0002][.D7CE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F852 +2F853 ; [.FB40.0020.0002][.D7F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F853 +2F854 ; [.FB40.0020.0002][.D80D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F854 +2F857 ; [.FB40.0020.0002][.D831.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F857 +2F856 ; [.FB40.0020.0002][.D832.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F856 +FA39 ; [.FB40.0020.0002][.D840.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA39 +FA10 ; [.FB40.0020.0002][.D85A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA10 +FA7C ; [.FB40.0020.0002][.D85A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA7C +F96C ; [.FB40.0020.0002][.D85E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96C +FA3A ; [.FB40.0020.0002][.D8A8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA3A +2F858 ; [.FB40.0020.0002][.D8AC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F858 +FA7D ; [.FB40.0020.0002][.D8B3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA7D +F94A ; [.FB40.0020.0002][.D8D8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F94A +F942 ; [.FB40.0020.0002][.D8DF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F942 +2F20 ; [.FB40.0020.0004][.D8EB.0000.0000] # KANGXI RADICAL SCHOLAR +2F851 ; [.FB40.0020.0002][.D8EE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F851 +1F224 ; [.FB40.0020.001C][.D8F0.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-58F0 +2F85A ; [.FB40.0020.0002][.D8F2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F85A +2F85B ; [.FB40.0020.0002][.D8F7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F85B +2F21 ; [.FB40.0020.0004][.D902.0000.0000] # KANGXI RADICAL GO +2F85C ; [.FB40.0020.0002][.D906.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F85C +2F22 ; [.FB40.0020.0004][.D90A.0000.0000] # KANGXI RADICAL GO SLOWLY +2F23 ; [.FB40.0020.0004][.D915.0000.0000] # KANGXI RADICAL EVENING +2F85D ; [.FB40.0020.0002][.D91A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F85D +1F215 ; [.FB40.0020.001C][.D91A.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-591A +32B0 ; [.FB40.0020.0006][.D91C.0000.0000] # CIRCLED IDEOGRAPH NIGHT +2F85E ; [.FB40.0020.0002][.D922.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F85E +2F24 ; [.FB40.0020.0004][.D927.0000.0000] # KANGXI RADICAL BIG +337D ; [.FB40.0020.001C][.D927.0000.0000][.FB40.0020.001C][.EB63.0000.0000] # SQUARE ERA NAME TAISYOU +319D ; [.FB40.0020.0014][.D929.0000.0000] # IDEOGRAPHIC ANNOTATION HEAVEN MARK +1F217 ; [.FB40.0020.001C][.D929.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5929 +FA7E ; [.FB40.0020.0002][.D944.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA7E +F90C ; [.FB40.0020.0002][.D948.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90C +F909 ; [.FB40.0020.0002][.D951.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F909 +FA7F ; [.FB40.0020.0002][.D954.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA7F +2F85F ; [.FB40.0020.0002][.D962.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F85F +F981 ; [.FB40.0020.0002][.D973.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F981 +2F25 ; [.FB40.0020.0004][.D973.0000.0000] # KANGXI RADICAL WOMAN +329B ; [.FB40.0020.0006][.D973.0000.0000] # CIRCLED IDEOGRAPH FEMALE +2F865 ; [.FB40.0020.0002][.D9D8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F865 +2F862 ; [.FB40.0020.0002][.D9EC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F862 +2F863 ; [.FB40.0020.0002][.DA1B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F863 +2F864 ; [.FB40.0020.0002][.DA27.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F864 +FA80 ; [.FB40.0020.0002][.DA62.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA80 +2F866 ; [.FB40.0020.0002][.DA66.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F866 +2F986 ; [.FB40.0020.0002][.DAB5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F986 +2F869 ; [.FB40.0020.0002][.DB08.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F869 +FA81 ; [.FB40.0020.0002][.DB28.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA81 +2F86A ; [.FB40.0020.0002][.DB3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86A +2F86B ; [.FB40.0020.0002][.DB3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86B +2F26 ; [.FB40.0020.0004][.DB50.0000.0000] # KANGXI RADICAL CHILD +1F211 ; [.FB40.0020.001C][.DB57.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5B57 +323B ; [*0310.0020.0004][.FB40.0020.0004][.DB66.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH STUDY +32AB ; [.FB40.0020.0006][.DB66.0000.0000] # CIRCLED IDEOGRAPH STUDY +2F27 ; [.FB40.0020.0004][.DB80.0000.0000] # KANGXI RADICAL ROOF +FA04 ; [.FB40.0020.0002][.DB85.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA04 +1F243 ; [*0372.0020.0004][.FB40.0020.0004][.DB89.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 +32AA ; [.FB40.0020.0006][.DB97.0000.0000] # CIRCLED IDEOGRAPH RELIGION +2F86D ; [.FB40.0020.0002][.DBC3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86D +2F86E ; [.FB40.0020.0002][.DBD8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86E +F95F ; [.FB40.0020.0002][.DBE7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95F +F9AA ; [.FB40.0020.0002][.DBE7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AA +2F86F ; [.FB40.0020.0002][.DBE7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86F +F9BC ; [.FB40.0020.0002][.DBEE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BC +2F870 ; [.FB40.0020.0002][.DBF3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F870 +2F28 ; [.FB40.0020.0004][.DBF8.0000.0000] # KANGXI RADICAL INCH +2F872 ; [.FB40.0020.0002][.DBFF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F872 +2F873 ; [.FB40.0020.0002][.DC06.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F873 +2F29 ; [.FB40.0020.0004][.DC0F.0000.0000] # KANGXI RADICAL SMALL +2E8C ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.010B.0004] # CJK RADICAL SMALL ONE +2E8D ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.010C.0004] # CJK RADICAL SMALL TWO +2F875 ; [.FB40.0020.0002][.DC22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F875 +2E90 ; [.FB40.0020.0004][.DC22.0000.0000] # CJK RADICAL LAME THREE +2F2A ; [.FB40.0020.0004][.DC22.0000.0000] # KANGXI RADICAL LAME +2E8E ; [.FB40.0020.0004][.DC22.0000.0000][.0000.010B.0004] # CJK RADICAL LAME ONE +2E8F ; [.FB40.0020.0004][.DC23.0000.0000] # CJK RADICAL LAME TWO +2E91 ; [.FB40.0020.0004][.DC23.0000.0000][.0000.010B.0004] # CJK RADICAL LAME FOUR +2F2B ; [.FB40.0020.0004][.DC38.0000.0000] # KANGXI RADICAL CORPSE +F9BD ; [.FB40.0020.0002][.DC3F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BD +2F877 ; [.FB40.0020.0002][.DC60.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F877 +F94B ; [.FB40.0020.0002][.DC62.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F94B +FA3B ; [.FB40.0020.0002][.DC64.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA3B +F9DF ; [.FB40.0020.0002][.DC65.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DF +FA3C ; [.FB40.0020.0002][.DC6E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA3C +2F878 ; [.FB40.0020.0002][.DC6E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F878 +2F2C ; [.FB40.0020.0004][.DC6E.0000.0000] # KANGXI RADICAL SPROUT +2F2D ; [.FB40.0020.0004][.DC71.0000.0000] # KANGXI RADICAL MOUNTAIN +2F87A ; [.FB40.0020.0002][.DC8D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F87A +2F879 ; [.FB40.0020.0002][.DCC0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F879 +F9D5 ; [.FB40.0020.0002][.DD19.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D5 +2F87C ; [.FB40.0020.0002][.DD43.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F87C +F921 ; [.FB40.0020.0002][.DD50.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F921 +2F87F ; [.FB40.0020.0002][.DD6B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F87F +2F87E ; [.FB40.0020.0002][.DD6E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F87E +2F880 ; [.FB40.0020.0002][.DD7C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F880 +2F9F4 ; [.FB40.0020.0002][.DDB2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F4 +F9AB ; [.FB40.0020.0002][.DDBA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AB +2F2E ; [.FB40.0020.0004][.DDDB.0000.0000] # KANGXI RADICAL RIVER +2F881 ; [.FB40.0020.0002][.DDE1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F881 +2F882 ; [.FB40.0020.0002][.DDE2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F882 +2F2F ; [.FB40.0020.0004][.DDE5.0000.0000] # KANGXI RADICAL WORK +32A7 ; [.FB40.0020.0006][.DDE6.0000.0000] # CIRCLED IDEOGRAPH LEFT +1F22C ; [.FB40.0020.001C][.DDE6.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5DE6 +2F30 ; [.FB40.0020.0004][.DDF1.0000.0000] # KANGXI RADICAL ONESELF +2E92 ; [.FB40.0020.0004][.DDF3.0000.0000] # CJK RADICAL SNAKE +2F884 ; [.FB40.0020.0002][.DDFD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F884 +2F31 ; [.FB40.0020.0004][.DDFE.0000.0000] # KANGXI RADICAL TURBAN +2F885 ; [.FB40.0020.0002][.DE28.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F885 +2F886 ; [.FB40.0020.0002][.DE3D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F886 +2F887 ; [.FB40.0020.0002][.DE69.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F887 +2F32 ; [.FB40.0020.0004][.DE72.0000.0000] # KANGXI RADICAL DRY +337B ; [.FB40.0020.001C][.DE73.0000.0000][.FB40.0020.001C][.E210.0000.0000] # SQUARE ERA NAME HEISEI +F98E ; [.FB40.0020.0002][.DE74.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98E +2E93 ; [.FB40.0020.0004][.DE7A.0000.0000] # CJK RADICAL THREAD +2F33 ; [.FB40.0020.0004][.DE7A.0000.0000] # KANGXI RADICAL SHORT THREAD +3245 ; [.FB40.0020.0006][.DE7C.0000.0000] # CIRCLED IDEOGRAPH KINDERGARTEN +2F34 ; [.FB40.0020.0004][.DE7F.0000.0000] # KANGXI RADICAL DOTTED CLIFF +FA01 ; [.FB40.0020.0002][.DEA6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA01 +2F88B ; [.FB40.0020.0002][.DEB0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F88B +2F88C ; [.FB40.0020.0002][.DEB3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F88C +2F88D ; [.FB40.0020.0002][.DEB6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F88D +F9A2 ; [.FB40.0020.0002][.DEC9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A2 +F928 ; [.FB40.0020.0002][.DECA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F928 +2F88E ; [.FB40.0020.0002][.DECA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F88E +FA82 ; [.FB40.0020.0002][.DED2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA82 +FA0B ; [.FB40.0020.0002][.DED3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA0B +FA83 ; [.FB40.0020.0002][.DED9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA83 +F982 ; [.FB40.0020.0002][.DEEC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F982 +2F35 ; [.FB40.0020.0004][.DEF4.0000.0000] # KANGXI RADICAL LONG STRIDE +2F890 ; [.FB40.0020.0002][.DEFE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F890 +2F36 ; [.FB40.0020.0004][.DEFE.0000.0000] # KANGXI RADICAL TWO HANDS +F943 ; [.FB40.0020.0002][.DF04.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F943 +2F37 ; [.FB40.0020.0004][.DF0B.0000.0000] # KANGXI RADICAL SHOOT +2F38 ; [.FB40.0020.0004][.DF13.0000.0000] # KANGXI RADICAL BOW +2F894 ; [.FB40.0020.0002][.DF22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F894 +2F895 ; [.FB40.0020.0002][.DF22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F895 +2F39 ; [.FB40.0020.0004][.DF50.0000.0000] # KANGXI RADICAL SNOUT +2E95 ; [.FB40.0020.0004][.DF50.0000.0000][.0000.010B.0004] # CJK RADICAL SNOUT TWO +2E94 ; [.FB40.0020.0004][.DF51.0000.0000] # CJK RADICAL SNOUT ONE +2F874 ; [.FB40.0020.0002][.DF53.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F874 +2F3A ; [.FB40.0020.0004][.DF61.0000.0000] # KANGXI RADICAL BRISTLE +2F899 ; [.FB40.0020.0002][.DF62.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F899 +FA84 ; [.FB40.0020.0002][.DF69.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA84 +2F89A ; [.FB40.0020.0002][.DF6B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89A +2F3B ; [.FB40.0020.0004][.DF73.0000.0000] # KANGXI RADICAL STEP +F9D8 ; [.FB40.0020.0002][.DF8B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D8 +1F21D ; [.FB40.0020.001C][.DF8C.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5F8C +1F250 ; [.FB40.0020.0006][.DF97.0000.0000] # CIRCLED IDEOGRAPH ADVANTAGE +2F89C ; [.FB40.0020.0002][.DF9A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89C +F966 ; [.FB40.0020.0002][.DFA9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F966 +FA85 ; [.FB40.0020.0002][.DFAD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA85 +2F3C ; [.FB40.0020.0004][.DFC3.0000.0000] # KANGXI RADICAL HEART +2E97 ; [.FB40.0020.0004][.DFC3.0000.0000][.0000.010B.0004] # CJK RADICAL HEART TWO +2E96 ; [.FB40.0020.0004][.DFC4.0000.0000] # CJK RADICAL HEART ONE +2F89D ; [.FB40.0020.0002][.DFCD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89D +2F89E ; [.FB40.0020.0002][.DFD7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89E +F9A3 ; [.FB40.0020.0002][.DFF5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A3 +2F89F ; [.FB40.0020.0002][.DFF9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89F +F960 ; [.FB40.0020.0002][.E012.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F960 +F9AC ; [.FB40.0020.0002][.E01C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AC +FA6B ; [.FB40.0020.0002][.E075.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA6B +2F8A0 ; [.FB40.0020.0002][.E081.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A0 +FA3D ; [.FB40.0020.0002][.E094.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA3D +2F8A3 ; [.FB40.0020.0002][.E094.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A3 +2F8A5 ; [.FB40.0020.0002][.E0C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A5 +FA86 ; [.FB40.0020.0002][.E0D8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA86 +F9B9 ; [.FB40.0020.0002][.E0E1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B9 +FA88 ; [.FB40.0020.0002][.E108.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA88 +F9D9 ; [.FB40.0020.0002][.E144.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D9 +2F8A6 ; [.FB40.0020.0002][.E148.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A6 +2F8A7 ; [.FB40.0020.0002][.E14C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A7 +2F8A9 ; [.FB40.0020.0002][.E14C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A9 +FA87 ; [.FB40.0020.0002][.E14E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA87 +2F8A8 ; [.FB40.0020.0002][.E14E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A8 +FA8A ; [.FB40.0020.0002][.E160.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA8A +FA3E ; [.FB40.0020.0002][.E168.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA3E +2F8AA ; [.FB40.0020.0002][.E17A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8AA +FA3F ; [.FB40.0020.0002][.E18E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA3F +FA89 ; [.FB40.0020.0002][.E18E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA89 +2F8AB ; [.FB40.0020.0002][.E18E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8AB +F98F ; [.FB40.0020.0002][.E190.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98F +2F8AD ; [.FB40.0020.0002][.E1A4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8AD +2F8AE ; [.FB40.0020.0002][.E1AF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8AE +2F8AC ; [.FB40.0020.0002][.E1B2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8AC +2F8AF ; [.FB40.0020.0002][.E1DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8AF +FA40 ; [.FB40.0020.0002][.E1F2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA40 +FA8B ; [.FB40.0020.0002][.E1F2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA8B +2F8B0 ; [.FB40.0020.0002][.E1F2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B0 +F90D ; [.FB40.0020.0002][.E1F6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90D +2F8B1 ; [.FB40.0020.0002][.E1F6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B1 +F990 ; [.FB40.0020.0002][.E200.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F990 +2F3D ; [.FB40.0020.0004][.E208.0000.0000] # KANGXI RADICAL HALBERD +2F8B2 ; [.FB40.0020.0002][.E210.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B2 +2F8B3 ; [.FB40.0020.0002][.E21B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B3 +F9D2 ; [.FB40.0020.0002][.E22E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D2 +FA8C ; [.FB40.0020.0002][.E234.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA8C +2F3E ; [.FB40.0020.0004][.E236.0000.0000] # KANGXI RADICAL DOOR +2F3F ; [.FB40.0020.0004][.E24B.0000.0000] # KANGXI RADICAL HAND +1F210 ; [.FB40.0020.001C][.E24B.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-624B +2E98 ; [.FB40.0020.0004][.E24C.0000.0000] # CJK RADICAL HAND +1F245 ; [*0372.0020.0004][.FB40.0020.0004][.E253.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 +1F231 ; [.FB40.0020.001C][.E253.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6253 +2F8B4 ; [.FB40.0020.0002][.E25D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B4 +1F227 ; [.FB40.0020.001C][.E295.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6295 +2F8B5 ; [.FB40.0020.0002][.E2B1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B5 +F925 ; [.FB40.0020.0002][.E2C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F925 +F95B ; [.FB40.0020.0002][.E2CF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95B +FA02 ; [.FB40.0020.0002][.E2D3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA02 +2F8B6 ; [.FB40.0020.0002][.E2D4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B6 +2F8BA ; [.FB40.0020.0002][.E2FC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8BA +F973 ; [.FB40.0020.0002][.E2FE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F973 +1F22F ; [.FB40.0020.001C][.E307.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6307 +2F8B9 ; [.FB40.0020.0002][.E33D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B9 +2F8B7 ; [.FB40.0020.0002][.E350.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B7 +1F228 ; [.FB40.0020.001C][.E355.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6355 +2F8BB ; [.FB40.0020.0002][.E368.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8BB +F9A4 ; [.FB40.0020.0002][.E37B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A4 +2F8BC ; [.FB40.0020.0002][.E383.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8BC +F975 ; [.FB40.0020.0002][.E3A0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F975 +2F8C1 ; [.FB40.0020.0002][.E3A9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C1 +FA8D ; [.FB40.0020.0002][.E3C4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA8D +2F8C0 ; [.FB40.0020.0002][.E3C5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C0 +2F8BD ; [.FB40.0020.0002][.E3E4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8BD +FA8E ; [.FB40.0020.0002][.E41C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA8E +2F8BF ; [.FB40.0020.0002][.E422.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8BF +FA8F ; [.FB40.0020.0002][.E452.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA8F +2F8C3 ; [.FB40.0020.0002][.E469.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C3 +2F8C6 ; [.FB40.0020.0002][.E477.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C6 +2F8C4 ; [.FB40.0020.0002][.E47E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C4 +F991 ; [.FB40.0020.0002][.E49A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F991 +2F8C5 ; [.FB40.0020.0002][.E49D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C5 +F930 ; [.FB40.0020.0002][.E4C4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F930 +2F40 ; [.FB40.0020.0004][.E52F.0000.0000] # KANGXI RADICAL BRANCH +2F41 ; [.FB40.0020.0004][.E534.0000.0000] # KANGXI RADICAL RAP +2E99 ; [.FB40.0020.0004][.E535.0000.0000] # CJK RADICAL RAP +FA41 ; [.FB40.0020.0002][.E54F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA41 +2F8C8 ; [.FB40.0020.0002][.E54F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C8 +FA90 ; [.FB40.0020.0002][.E556.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA90 +1F248 ; [*0372.0020.0004][.FB40.0020.0004][.E557.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +2F8C9 ; [.FB40.0020.0002][.E56C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C9 +F969 ; [.FB40.0020.0002][.E578.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F969 +2F42 ; [.FB40.0020.0004][.E587.0000.0000] # KANGXI RADICAL SCRIPT +3246 ; [.FB40.0020.0006][.E587.0000.0000] # CIRCLED IDEOGRAPH SCHOOL +2F43 ; [.FB40.0020.0004][.E597.0000.0000] # KANGXI RADICAL DIPPER +F9BE ; [.FB40.0020.0002][.E599.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BE +1F21B ; [.FB40.0020.001C][.E599.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6599 +2F44 ; [.FB40.0020.0004][.E5A4.0000.0000] # KANGXI RADICAL AXE +1F21F ; [.FB40.0020.001C][.E5B0.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-65B0 +2F45 ; [.FB40.0020.0004][.E5B9.0000.0000] # KANGXI RADICAL SQUARE +F983 ; [.FB40.0020.0002][.E5C5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F983 +2F46 ; [.FB40.0020.0004][.E5E0.0000.0000] # KANGXI RADICAL NOT +2E9B ; [.FB40.0020.0004][.E5E1.0000.0000] # CJK RADICAL CHOKE +FA42 ; [.FB40.0020.0002][.E5E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA42 +2F8CB ; [.FB40.0020.0002][.E5E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CB +2F47 ; [.FB40.0020.0004][.E5E5.0000.0000] # KANGXI RADICAL SUN +3230 ; [*0310.0020.0004][.FB40.0020.0004][.E5E5.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SUN +3290 ; [.FB40.0020.0006][.E5E5.0000.0000] # CIRCLED IDEOGRAPH SUN +2E9C ; [.FB40.0020.0004][.E5E5.0000.0000][.0000.010B.0004] # CJK RADICAL SUN +337E ; [.FB40.0020.001C][.E60E.0000.0000][.FB40.0020.001C][.ECBB.0000.0000] # SQUARE ERA NAME MEIZI +F9E0 ; [.FB40.0020.0002][.E613.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E0 +1F219 ; [.FB40.0020.001C][.E620.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6620 +337C ; [.FB40.0020.001C][.E62D.0000.0000][.FB40.0020.001C][.D48C.0000.0000] # SQUARE ERA NAME SYOUWA +2F8CD ; [.FB40.0020.0002][.E649.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CD +FA12 ; [.FB40.0020.0002][.E674.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA12 +FA91 ; [.FB40.0020.0002][.E674.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA91 +F9C5 ; [.FB40.0020.0002][.E688.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C5 +FA43 ; [.FB40.0020.0002][.E691.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA43 +2F8CF ; [.FB40.0020.0002][.E691.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CF +2F8D5 ; [.FB40.0020.0002][.E69C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D5 +FA06 ; [.FB40.0020.0002][.E6B4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA06 +F98B ; [.FB40.0020.0002][.E6C6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98B +2F48 ; [.FB40.0020.0004][.E6F0.0000.0000] # KANGXI RADICAL SAY +F901 ; [.FB40.0020.0002][.E6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F901 +2F8CC ; [.FB40.0020.0002][.E6F8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CC +2F8D4 ; [.FB40.0020.0002][.E700.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D4 +2F49 ; [.FB40.0020.0004][.E708.0000.0000] # KANGXI RADICAL MOON +322A ; [*0310.0020.0004][.FB40.0020.0004][.E708.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH MOON +328A ; [.FB40.0020.0006][.E708.0000.0000] # CIRCLED IDEOGRAPH MOON +1F237 ; [.FB40.0020.001C][.E708.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6708 +2E9D ; [.FB40.0020.0004][.E708.0000.0000][.0000.010B.0004] # CJK RADICAL MOON +3232 ; [*0310.0020.0004][.FB40.0020.0004][.E709.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH HAVE +3292 ; [.FB40.0020.0006][.E709.0000.0000] # CIRCLED IDEOGRAPH HAVE +1F236 ; [.FB40.0020.001C][.E709.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6709 +F929 ; [.FB40.0020.0002][.E717.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F929 +FA92 ; [.FB40.0020.0002][.E717.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA92 +2F8D8 ; [.FB40.0020.0002][.E717.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D8 +FA93 ; [.FB40.0020.0002][.E71B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA93 +2F8D9 ; [.FB40.0020.0002][.E71B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D9 +2F8DA ; [.FB40.0020.0002][.E721.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DA +2F4A ; [.FB40.0020.0004][.E728.0000.0000] # KANGXI RADICAL TREE +322D ; [*0310.0020.0004][.FB40.0020.0004][.E728.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH WOOD +328D ; [.FB40.0020.0006][.E728.0000.0000] # CIRCLED IDEOGRAPH WOOD +1F240 ; [*0372.0020.0004][.FB40.0020.0004][.E72C.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C +F9E1 ; [.FB40.0020.0002][.E74E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E1 +2F8DC ; [.FB40.0020.0002][.E753.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DC +FA94 ; [.FB40.0020.0002][.E756.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA94 +2F8DB ; [.FB40.0020.0002][.E75E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DB +F9C8 ; [.FB40.0020.0002][.E77B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C8 +2F8E0 ; [.FB40.0020.0002][.E785.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E0 +F9F4 ; [.FB40.0020.0002][.E797.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F4 +F9C9 ; [.FB40.0020.0002][.E7F3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C9 +2F8DF ; [.FB40.0020.0002][.E7FA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DF +F9DA ; [.FB40.0020.0002][.E817.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DA +2F8E5 ; [.FB40.0020.0002][.E81F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E5 +3231 ; [*0310.0020.0004][.FB40.0020.0004][.E82A.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH STOCK +3291 ; [.FB40.0020.0006][.E82A.0000.0000] # CIRCLED IDEOGRAPH STOCK +337F ; [.FB40.0020.001C][.E82A.0000.0000][.FB40.0020.001C][.DF0F.0000.0000][.FB40.0020.001C][.CF1A.0000.0000][.FB40.0020.001C][.F93E.0000.0000] # SQUARE CORPORATION +2F8E1 ; [.FB40.0020.0002][.E852.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E1 +F97A ; [.FB40.0020.0002][.E881.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97A +FA44 ; [.FB40.0020.0002][.E885.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA44 +2F8E2 ; [.FB40.0020.0002][.E885.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E2 +2F8E4 ; [.FB40.0020.0002][.E88E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E4 +F9E2 ; [.FB40.0020.0002][.E8A8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E2 +2F8E6 ; [.FB40.0020.0002][.E914.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E6 +2F8E8 ; [.FB40.0020.0002][.E942.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E8 +2F8E9 ; [.FB40.0020.0002][.E9A3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E9 +2F8EA ; [.FB40.0020.0002][.E9EA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8EA +F914 ; [.FB40.0020.0002][.EA02.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F914 +F95C ; [.FB40.0020.0002][.EA02.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95C +F9BF ; [.FB40.0020.0002][.EA02.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BF +F94C ; [.FB40.0020.0002][.EA13.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F94C +2F8EB ; [.FB40.0020.0002][.EAA8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8EB +F931 ; [.FB40.0020.0002][.EAD3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F931 +2F8ED ; [.FB40.0020.0002][.EADB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8ED +F91D ; [.FB40.0020.0002][.EB04.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91D +2F4B ; [.FB40.0020.0004][.EB20.0000.0000] # KANGXI RADICAL LACK +2F8EF ; [.FB40.0020.0002][.EB21.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8EF +2F8F1 ; [.FB40.0020.0002][.EB54.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F1 +2F4C ; [.FB40.0020.0004][.EB62.0000.0000] # KANGXI RADICAL STOP +32A3 ; [.FB40.0020.0006][.EB63.0000.0000] # CIRCLED IDEOGRAPH CORRECT +2F8F3 ; [.FB40.0020.0002][.EB72.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F3 +F98C ; [.FB40.0020.0002][.EB77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98C +FA95 ; [.FB40.0020.0002][.EB79.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA95 +2F4D ; [.FB40.0020.0004][.EB79.0000.0000] # KANGXI RADICAL DEATH +2E9E ; [.FB40.0020.0004][.EB7A.0000.0000][.0000.010B.0004] # CJK RADICAL DEATH +2F8F4 ; [.FB40.0020.0002][.EB9F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F4 +F9A5 ; [.FB40.0020.0002][.EBAE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A5 +2F4E ; [.FB40.0020.0004][.EBB3.0000.0000] # KANGXI RADICAL WEAPON +F970 ; [.FB40.0020.0002][.EBBA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F970 +FA96 ; [.FB40.0020.0002][.EBBA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA96 +2F8F5 ; [.FB40.0020.0002][.EBBA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F5 +2F8F6 ; [.FB40.0020.0002][.EBBB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F6 +2F4F ; [.FB40.0020.0004][.EBCB.0000.0000] # KANGXI RADICAL DO NOT +2E9F ; [.FB40.0020.0004][.EBCD.0000.0000] # CJK RADICAL MOTHER +2F50 ; [.FB40.0020.0004][.EBD4.0000.0000] # KANGXI RADICAL COMPARE +2F51 ; [.FB40.0020.0004][.EBDB.0000.0000] # KANGXI RADICAL FUR +2F52 ; [.FB40.0020.0004][.EC0F.0000.0000] # KANGXI RADICAL CLAN +2EA0 ; [.FB40.0020.0004][.EC11.0000.0000] # CJK RADICAL CIVILIAN +2F53 ; [.FB40.0020.0004][.EC14.0000.0000] # KANGXI RADICAL STEAM +2F54 ; [.FB40.0020.0004][.EC34.0000.0000] # KANGXI RADICAL WATER +322C ; [*0310.0020.0004][.FB40.0020.0004][.EC34.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH WATER +328C ; [.FB40.0020.0006][.EC34.0000.0000] # CIRCLED IDEOGRAPH WATER +2EA1 ; [.FB40.0020.0004][.EC35.0000.0000] # CJK RADICAL WATER ONE +2EA2 ; [.FB40.0020.0004][.EC3A.0000.0000] # CJK RADICAL WATER TWO +2F8FA ; [.FB40.0020.0002][.EC4E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8FA +2F8FE ; [.FB40.0020.0002][.EC67.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8FE +F972 ; [.FB40.0020.0002][.EC88.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F972 +2F8FC ; [.FB40.0020.0002][.ECBF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8FC +F968 ; [.FB40.0020.0002][.ECCC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F968 +2F8FD ; [.FB40.0020.0002][.ECCD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8FD +F9E3 ; [.FB40.0020.0002][.ECE5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E3 +329F ; [.FB40.0020.0006][.ECE8.0000.0000] # CIRCLED IDEOGRAPH ATTENTION +2F8FF ; [.FB40.0020.0002][.ED16.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8FF +F915 ; [.FB40.0020.0002][.ED1B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F915 +FA05 ; [.FB40.0020.0002][.ED1E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA05 +2F907 ; [.FB40.0020.0002][.ED34.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F907 +2F900 ; [.FB40.0020.0002][.ED3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F900 +F9CA ; [.FB40.0020.0002][.ED41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9CA +FA97 ; [.FB40.0020.0002][.ED41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA97 +2F902 ; [.FB40.0020.0002][.ED41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F902 +2F903 ; [.FB40.0020.0002][.ED69.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F903 +F92A ; [.FB40.0020.0002][.ED6A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92A +FA45 ; [.FB40.0020.0002][.ED77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA45 +2F901 ; [.FB40.0020.0002][.ED77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F901 +2F904 ; [.FB40.0020.0002][.ED78.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F904 +2F905 ; [.FB40.0020.0002][.ED85.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F905 +F9F5 ; [.FB40.0020.0002][.EDCB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F5 +F94D ; [.FB40.0020.0002][.EDDA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F94D +F9D6 ; [.FB40.0020.0002][.EDEA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D6 +2F90E ; [.FB40.0020.0002][.EDF9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F90E +FA46 ; [.FB40.0020.0002][.EE1A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA46 +2F908 ; [.FB40.0020.0002][.EE2F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F908 +2F909 ; [.FB40.0020.0002][.EE6E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F909 +1F235 ; [.FB40.0020.001C][.EE80.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6E80 +F9CB ; [.FB40.0020.0002][.EE9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9CB +F9EC ; [.FB40.0020.0002][.EEBA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EC +2F90C ; [.FB40.0020.0002][.EEC7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F90C +FA99 ; [.FB40.0020.0002][.EECB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA99 +2F90B ; [.FB40.0020.0002][.EECB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F90B +F904 ; [.FB40.0020.0002][.EED1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F904 +FA98 ; [.FB40.0020.0002][.EEDB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA98 +F94E ; [.FB40.0020.0002][.EF0F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F94E +1F226 ; [.FB40.0020.001C][.EF14.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6F14 +FA47 ; [.FB40.0020.0002][.EF22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA47 +FA9A ; [.FB40.0020.0002][.EF22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9A +F992 ; [.FB40.0020.0002][.EF23.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F992 +2F90F ; [.FB40.0020.0002][.EF6E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F90F +2F912 ; [.FB40.0020.0002][.EFC6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F912 +F922 ; [.FB40.0020.0002][.EFEB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F922 +F984 ; [.FB40.0020.0002][.EFFE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F984 +2F915 ; [.FB40.0020.0002][.F01B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F915 +FA9B ; [.FB40.0020.0002][.F01E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9B +2F914 ; [.FB40.0020.0002][.F01E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F914 +2F913 ; [.FB40.0020.0002][.F039.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F913 +2F917 ; [.FB40.0020.0002][.F04A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F917 +2F55 ; [.FB40.0020.0004][.F06B.0000.0000] # KANGXI RADICAL FIRE +322B ; [*0310.0020.0004][.FB40.0020.0004][.F06B.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FIRE +328B ; [.FB40.0020.0006][.F06B.0000.0000] # CIRCLED IDEOGRAPH FIRE +2EA3 ; [.FB40.0020.0004][.F06C.0000.0000] # CJK RADICAL FIRE +2F835 ; [.FB40.0020.0002][.F070.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F835 +2F919 ; [.FB40.0020.0002][.F077.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F919 +2F918 ; [.FB40.0020.0002][.F07D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F918 +F9FB ; [.FB40.0020.0002][.F099.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FB +2F91A ; [.FB40.0020.0002][.F0AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F91A +1F244 ; [*0372.0020.0004][.FB40.0020.0004][.F0B9.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 +F99F ; [.FB40.0020.0002][.F0C8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99F +F916 ; [.FB40.0020.0002][.F0D9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F916 +1F21A ; [.FB40.0020.001C][.F121.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7121 +2F91C ; [.FB40.0020.0002][.F145.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F91C +F993 ; [.FB40.0020.0002][.F149.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F993 +FA48 ; [.FB40.0020.0002][.F16E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA48 +FA9C ; [.FB40.0020.0002][.F16E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9C +2F91E ; [.FB40.0020.0002][.F19C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F91E +F9C0 ; [.FB40.0020.0002][.F1CE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C0 +F9EE ; [.FB40.0020.0002][.F1D0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EE +F932 ; [.FB40.0020.0002][.F210.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F932 +F91E ; [.FB40.0020.0002][.F21B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91E +2F920 ; [.FB40.0020.0002][.F228.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F920 +2F56 ; [.FB40.0020.0004][.F22A.0000.0000] # KANGXI RADICAL CLAW +FA49 ; [.FB40.0020.0002][.F22B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA49 +2EA4 ; [.FB40.0020.0004][.F22B.0000.0000] # CJK RADICAL PAW ONE +2EA5 ; [.FB40.0020.0004][.F22B.0000.0000][.0000.010B.0004] # CJK RADICAL PAW TWO +FA9E ; [.FB40.0020.0002][.F235.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9E +2F921 ; [.FB40.0020.0002][.F235.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F921 +2F57 ; [.FB40.0020.0004][.F236.0000.0000] # KANGXI RADICAL FATHER +2F58 ; [.FB40.0020.0004][.F23B.0000.0000] # KANGXI RADICAL DOUBLE X +2F59 ; [.FB40.0020.0004][.F23F.0000.0000] # KANGXI RADICAL HALF TREE TRUNK +2F5A ; [.FB40.0020.0004][.F247.0000.0000] # KANGXI RADICAL SLICE +2F922 ; [.FB40.0020.0002][.F250.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F922 +2F5B ; [.FB40.0020.0004][.F259.0000.0000] # KANGXI RADICAL FANG +2F5C ; [.FB40.0020.0004][.F25B.0000.0000] # KANGXI RADICAL COW +2EA7 ; [.FB40.0020.0004][.F25B.0000.0000][.0000.010B.0004] # CJK RADICAL COW +F946 ; [.FB40.0020.0002][.F262.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F946 +3235 ; [*0310.0020.0004][.FB40.0020.0004][.F279.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SPECIAL +3295 ; [.FB40.0020.0006][.F279.0000.0000] # CIRCLED IDEOGRAPH SPECIAL +2F924 ; [.FB40.0020.0002][.F280.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F924 +2F925 ; [.FB40.0020.0002][.F295.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F925 +2F5D ; [.FB40.0020.0004][.F2AC.0000.0000] # KANGXI RADICAL DOG +2EA8 ; [.FB40.0020.0004][.F2AD.0000.0000] # CJK RADICAL DOG +FA9F ; [.FB40.0020.0002][.F2AF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9F +F9FA ; [.FB40.0020.0002][.F2C0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FA +F92B ; [.FB40.0020.0002][.F2FC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92B +FA16 ; [.FB40.0020.0002][.F32A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA16 +FAA0 ; [.FB40.0020.0002][.F32A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA0 +F9A7 ; [.FB40.0020.0002][.F375.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A7 +2F928 ; [.FB40.0020.0002][.F37A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F928 +2F5E ; [.FB40.0020.0004][.F384.0000.0000] # KANGXI RADICAL PROFOUND +F961 ; [.FB40.0020.0002][.F387.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F961 +F9DB ; [.FB40.0020.0002][.F387.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DB +2F5F ; [.FB40.0020.0004][.F389.0000.0000] # KANGXI RADICAL JADE +2F929 ; [.FB40.0020.0002][.F38B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F929 +2EA9 ; [.FB40.0020.0004][.F38B.0000.0000][.0000.010B.0004] # CJK RADICAL JADE +2F92B ; [.FB40.0020.0002][.F3A5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F92B +F9AD ; [.FB40.0020.0002][.F3B2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AD +F917 ; [.FB40.0020.0002][.F3DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F917 +F9E4 ; [.FB40.0020.0002][.F406.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E4 +F9CC ; [.FB40.0020.0002][.F409.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9CC +FA4A ; [.FB40.0020.0002][.F422.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4A +2F92E ; [.FB40.0020.0002][.F447.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F92E +2F92F ; [.FB40.0020.0002][.F45C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F92F +F9AE ; [.FB40.0020.0002][.F469.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AE +FAA1 ; [.FB40.0020.0002][.F471.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA1 +2F930 ; [.FB40.0020.0002][.F471.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F930 +2F931 ; [.FB40.0020.0002][.F485.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F931 +F994 ; [.FB40.0020.0002][.F489.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F994 +F9EF ; [.FB40.0020.0002][.F498.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EF +2F932 ; [.FB40.0020.0002][.F4CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F932 +2F60 ; [.FB40.0020.0004][.F4DC.0000.0000] # KANGXI RADICAL MELON +2F61 ; [.FB40.0020.0004][.F4E6.0000.0000] # KANGXI RADICAL TILE +FAA2 ; [.FB40.0020.0002][.F506.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA2 +2F62 ; [.FB40.0020.0004][.F518.0000.0000] # KANGXI RADICAL SWEET +2F63 ; [.FB40.0020.0004][.F51F.0000.0000] # KANGXI RADICAL LIFE +1F222 ; [.FB40.0020.001C][.F51F.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-751F +2F934 ; [.FB40.0020.0002][.F524.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F934 +2F64 ; [.FB40.0020.0004][.F528.0000.0000] # KANGXI RADICAL USE +2F65 ; [.FB40.0020.0004][.F530.0000.0000] # KANGXI RADICAL FIELD +3199 ; [.FB40.0020.0014][.F532.0000.0000] # IDEOGRAPHIC ANNOTATION FIRST MARK +1F238 ; [.FB40.0020.001C][.F533.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7533 +329A ; [.FB40.0020.0006][.F537.0000.0000] # CIRCLED IDEOGRAPH MALE +FAA3 ; [.FB40.0020.0002][.F53B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA3 +2F936 ; [.FB40.0020.0002][.F53E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F936 +F9CD ; [.FB40.0020.0002][.F559.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9CD +F976 ; [.FB40.0020.0002][.F565.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F976 +F962 ; [.FB40.0020.0002][.F570.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F962 +2F938 ; [.FB40.0020.0002][.F570.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F938 +2F66 ; [.FB40.0020.0004][.F58B.0000.0000] # KANGXI RADICAL BOLT OF CLOTH +2EAA ; [.FB40.0020.0004][.F58B.0000.0000][.0000.010B.0004] # CJK RADICAL BOLT OF CLOTH +2F67 ; [.FB40.0020.0004][.F592.0000.0000] # KANGXI RADICAL SICKNESS +F9E5 ; [.FB40.0020.0002][.F5E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E5 +2F93A ; [.FB40.0020.0002][.F610.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F93A +FAA4 ; [.FB40.0020.0002][.F61D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA4 +FAA5 ; [.FB40.0020.0002][.F61F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA5 +F9C1 ; [.FB40.0020.0002][.F642.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C1 +F90E ; [.FB40.0020.0002][.F669.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90E +2F68 ; [.FB40.0020.0004][.F676.0000.0000] # KANGXI RADICAL DOTTED TENT +2F69 ; [.FB40.0020.0004][.F67D.0000.0000] # KANGXI RADICAL WHITE +2F6A ; [.FB40.0020.0004][.F6AE.0000.0000] # KANGXI RADICAL SKIN +2F6B ; [.FB40.0020.0004][.F6BF.0000.0000] # KANGXI RADICAL DISH +FA17 ; [.FB40.0020.0002][.F6CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA17 +FAA6 ; [.FB40.0020.0002][.F6CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA6 +1F246 ; [*0372.0020.0004][.FB40.0020.0004][.F6D7.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 +FAA7 ; [.FB40.0020.0002][.F6DB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA7 +323C ; [*0310.0020.0004][.FB40.0020.0004][.F6E3.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SUPERVISE +32AC ; [.FB40.0020.0006][.F6E3.0000.0000] # CIRCLED IDEOGRAPH SUPERVISE +F933 ; [.FB40.0020.0002][.F6E7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F933 +2F6C ; [.FB40.0020.0004][.F6EE.0000.0000] # KANGXI RADICAL EYE +2EAB ; [.FB40.0020.0004][.F6EE.0000.0000][.0000.010B.0004] # CJK RADICAL EYE +FAA8 ; [.FB40.0020.0002][.F6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA8 +2F940 ; [.FB40.0020.0002][.F6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F940 +F96D ; [.FB40.0020.0002][.F701.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96D +2F945 ; [.FB40.0020.0002][.F71E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F945 +2F946 ; [.FB40.0020.0002][.F71F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F946 +2F947 ; [.FB40.0020.0002][.F71F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F947 +FAAA ; [.FB40.0020.0002][.F740.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAAA +FAA9 ; [.FB40.0020.0002][.F74A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA9 +2F948 ; [.FB40.0020.0002][.F74A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F948 +2F94A ; [.FB40.0020.0002][.F78B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F94A +FA9D ; [.FB40.0020.0002][.F7A7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9D +2F6D ; [.FB40.0020.0004][.F7DB.0000.0000] # KANGXI RADICAL SPEAR +2F6E ; [.FB40.0020.0004][.F7E2.0000.0000] # KANGXI RADICAL ARROW +2F6F ; [.FB40.0020.0004][.F7F3.0000.0000] # KANGXI RADICAL STONE +2F94E ; [.FB40.0020.0002][.F84E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F94E +F9CE ; [.FB40.0020.0002][.F86B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9CE +F93B ; [.FB40.0020.0002][.F88C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93B +2F94F ; [.FB40.0020.0002][.F88C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F94F +FA4B ; [.FB40.0020.0002][.F891.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4B +F947 ; [.FB40.0020.0002][.F8CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F947 +FAAB ; [.FB40.0020.0002][.F8CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAAB +2F950 ; [.FB40.0020.0002][.F8CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F950 +F964 ; [.FB40.0020.0002][.F8FB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F964 +F985 ; [.FB40.0020.0002][.F92A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F985 +2F70 ; [.FB40.0020.0004][.F93A.0000.0000] # KANGXI RADICAL SPIRIT +2EAC ; [.FB40.0020.0004][.F93A.0000.0000][.0000.010B.0004] # CJK RADICAL SPIRIT ONE +2EAD ; [.FB40.0020.0004][.F93B.0000.0000] # CJK RADICAL SPIRIT TWO +FA18 ; [.FB40.0020.0002][.F93C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA18 +FA4C ; [.FB40.0020.0002][.F93E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4C +3233 ; [*0310.0020.0004][.FB40.0020.0004][.F93E.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SOCIETY +3293 ; [.FB40.0020.0006][.F93E.0000.0000] # CIRCLED IDEOGRAPH SOCIETY +FA4E ; [.FB40.0020.0002][.F948.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4E +FA4D ; [.FB40.0020.0002][.F949.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4D +FA4F ; [.FB40.0020.0002][.F950.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4F +FA50 ; [.FB40.0020.0002][.F956.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA50 +2F953 ; [.FB40.0020.0002][.F956.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F953 +FA51 ; [.FB40.0020.0002][.F95D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA51 +3237 ; [*0310.0020.0004][.FB40.0020.0004][.F95D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH CONGRATULATION +3297 ; [.FB40.0020.0006][.F95D.0000.0000] # CIRCLED IDEOGRAPH CONGRATULATION +FA19 ; [.FB40.0020.0002][.F95E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA19 +FA1A ; [.FB40.0020.0002][.F965.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA1A +3240 ; [*0310.0020.0004][.FB40.0020.0004][.F96D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FESTIVAL +F93C ; [.FB40.0020.0002][.F97F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93C +1F232 ; [.FB40.0020.001C][.F981.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7981 +FA52 ; [.FB40.0020.0002][.F98D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA52 +FA53 ; [.FB40.0020.0002][.F98E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA53 +FA1B ; [.FB40.0020.0002][.F98F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA1B +2F956 ; [.FB40.0020.0002][.F98F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F956 +F9B6 ; [.FB40.0020.0002][.F9AE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B6 +2F71 ; [.FB40.0020.0004][.F9B8.0000.0000] # KANGXI RADICAL TRACK +2F72 ; [.FB40.0020.0004][.F9BE.0000.0000] # KANGXI RADICAL GRAIN +F995 ; [.FB40.0020.0002][.F9CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F995 +3299 ; [.FB40.0020.0006][.F9D8.0000.0000] # CIRCLED IDEOGRAPH SECRET +2F957 ; [.FB40.0020.0002][.F9EB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F957 +F956 ; [.FB40.0020.0002][.FA1C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F956 +FA54 ; [.FB40.0020.0002][.FA40.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA54 +2F959 ; [.FB40.0020.0002][.FA40.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F959 +2F95A ; [.FB40.0020.0002][.FA4A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F95A +2F95B ; [.FB40.0020.0002][.FA4F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F95B +2F73 ; [.FB40.0020.0004][.FA74.0000.0000] # KANGXI RADICAL CAVE +1F233 ; [.FB40.0020.001C][.FA7A.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7A7A +FA55 ; [.FB40.0020.0002][.FA81.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA55 +FAAC ; [.FB40.0020.0002][.FAB1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAAC +F9F7 ; [.FB40.0020.0002][.FACB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F7 +2F74 ; [.FB40.0020.0004][.FACB.0000.0000] # KANGXI RADICAL STAND +2F95F ; [.FB40.0020.0002][.FAEE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F95F +2F75 ; [.FB40.0020.0004][.FAF9.0000.0000] # KANGXI RADICAL BAMBOO +2EAE ; [.FB40.0020.0004][.FAF9.0000.0000][.0000.010B.0004] # CJK RADICAL BAMBOO +F9F8 ; [.FB40.0020.0002][.FB20.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F8 +3247 ; [.FB40.0020.0006][.FB8F.0000.0000] # CIRCLED IDEOGRAPH KOTO +FA56 ; [.FB40.0020.0002][.FBC0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA56 +FAAD ; [.FB40.0020.0002][.FBC0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAAD +2F962 ; [.FB40.0020.0002][.FBC6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F962 +2F963 ; [.FB40.0020.0002][.FBC9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F963 +F9A6 ; [.FB40.0020.0002][.FC3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A6 +F944 ; [.FB40.0020.0002][.FC60.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F944 +2F76 ; [.FB40.0020.0004][.FC73.0000.0000] # KANGXI RADICAL RICE +FAAE ; [.FB40.0020.0002][.FC7B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAAE +F9F9 ; [.FB40.0020.0002][.FC92.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F9 +FA1D ; [.FB40.0020.0002][.FCBE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA1D +2F966 ; [.FB40.0020.0002][.FCD2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F966 +FA03 ; [.FB40.0020.0002][.FCD6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA03 +2F969 ; [.FB40.0020.0002][.FCE3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F969 +F97B ; [.FB40.0020.0002][.FCE7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97B +2F968 ; [.FB40.0020.0002][.FCE8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F968 +2F77 ; [.FB40.0020.0004][.FCF8.0000.0000] # KANGXI RADICAL SILK +2EAF ; [.FB40.0020.0004][.FCF9.0000.0000] # CJK RADICAL SILK +2F96A ; [.FB40.0020.0002][.FD00.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F96A +F9CF ; [.FB40.0020.0002][.FD10.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9CF +F96A ; [.FB40.0020.0002][.FD22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96A +F94F ; [.FB40.0020.0002][.FD2F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F94F +1F221 ; [.FB40.0020.001C][.FD42.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7D42 +FAAF ; [.FB40.0020.0002][.FD5B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAAF +2F96C ; [.FB40.0020.0002][.FD63.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F96C +F93D ; [.FB40.0020.0002][.FDA0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93D +F957 ; [.FB40.0020.0002][.FDBE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F957 +2F96E ; [.FB40.0020.0002][.FDC7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F96E +F996 ; [.FB40.0020.0002][.FDF4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F996 +FA57 ; [.FB40.0020.0002][.FDF4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA57 +FAB0 ; [.FB40.0020.0002][.FDF4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB0 +2F96F ; [.FB40.0020.0002][.FE02.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F96F +FA58 ; [.FB40.0020.0002][.FE09.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA58 +F950 ; [.FB40.0020.0002][.FE37.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F950 +FA59 ; [.FB40.0020.0002][.FE41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA59 +2F970 ; [.FB40.0020.0002][.FE45.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F970 +2EB0 ; [.FB40.0020.0004][.FE9F.0000.0000] # CJK RADICAL C-SIMPLIFIED SILK +2F78 ; [.FB40.0020.0004][.FF36.0000.0000] # KANGXI RADICAL JAR +FAB1 ; [.FB40.0020.0002][.FF3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB1 +2F79 ; [.FB40.0020.0004][.FF51.0000.0000] # KANGXI RADICAL NET +2EB2 ; [.FB40.0020.0004][.FF52.0000.0000] # CJK RADICAL NET TWO +2EB5 ; [.FB40.0020.0004][.FF52.0000.0000][.0000.010B.0004] # CJK RADICAL MESH +2EB1 ; [.FB40.0020.0004][.FF53.0000.0000] # CJK RADICAL NET ONE +2EB3 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.010B.0004] # CJK RADICAL NET THREE +2EB4 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.010C.0004] # CJK RADICAL NET FOUR +FA5A ; [.FB40.0020.0002][.FF72.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5A +F9E6 ; [.FB40.0020.0002][.FF79.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E6 +2F976 ; [.FB40.0020.0002][.FF7A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F976 +F90F ; [.FB40.0020.0002][.FF85.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90F +2F7A ; [.FB40.0020.0004][.FF8A.0000.0000] # KANGXI RADICAL SHEEP +2EB6 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.010B.0004] # CJK RADICAL SHEEP +2EB7 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.010C.0004] # CJK RADICAL RAM +2EB8 ; [.FB40.0020.0004][.FF8B.0000.0000] # CJK RADICAL EWE +2F978 ; [.FB40.0020.0002][.FF95.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F978 +F9AF ; [.FB40.0020.0002][.FF9A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AF +FA1E ; [.FB40.0020.0002][.FFBD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA1E +2F7B ; [.FB40.0020.0004][.FFBD.0000.0000] # KANGXI RADICAL FEATHER +2F979 ; [.FB40.0020.0002][.FFFA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F979 +F934 ; [.FB41.0020.0002][.8001.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F934 +2F7C ; [.FB41.0020.0004][.8001.0000.0000] # KANGXI RADICAL OLD +2EB9 ; [.FB41.0020.0004][.8002.0000.0000] # CJK RADICAL OLD +FA5B ; [.FB41.0020.0002][.8005.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5B +FAB2 ; [.FB41.0020.0002][.8005.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB2 +2F97A ; [.FB41.0020.0002][.8005.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F97A +2F7D ; [.FB41.0020.0004][.800C.0000.0000] # KANGXI RADICAL AND +2F7E ; [.FB41.0020.0004][.8012.0000.0000] # KANGXI RADICAL PLOW +2F7F ; [.FB41.0020.0004][.8033.0000.0000] # KANGXI RADICAL EAR +F9B0 ; [.FB41.0020.0002][.8046.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B0 +2F97D ; [.FB41.0020.0002][.8060.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F97D +F997 ; [.FB41.0020.0002][.806F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F997 +2F97F ; [.FB41.0020.0002][.8070.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F97F +F945 ; [.FB41.0020.0002][.807E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F945 +2F80 ; [.FB41.0020.0004][.807F.0000.0000] # KANGXI RADICAL BRUSH +2EBB ; [.FB41.0020.0004][.807F.0000.0000][.0000.010B.0004] # CJK RADICAL BRUSH TWO +2EBA ; [.FB41.0020.0004][.8080.0000.0000] # CJK RADICAL BRUSH ONE +2F81 ; [.FB41.0020.0004][.8089.0000.0000] # KANGXI RADICAL MEAT +2EBC ; [.FB41.0020.0004][.8089.0000.0000][.0000.010B.0004] # CJK RADICAL MEAT +F953 ; [.FB41.0020.0002][.808B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F953 +2F8D6 ; [.FB41.0020.0002][.80AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D6 +2F982 ; [.FB41.0020.0002][.80B2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F982 +2F983 ; [.FB41.0020.0002][.8103.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F983 +2F985 ; [.FB41.0020.0002][.813E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F985 +F926 ; [.FB41.0020.0002][.81D8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F926 +2F82 ; [.FB41.0020.0004][.81E3.0000.0000] # KANGXI RADICAL MINISTER +F9F6 ; [.FB41.0020.0002][.81E8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F6 +2F83 ; [.FB41.0020.0004][.81EA.0000.0000] # KANGXI RADICAL SELF +3242 ; [*0310.0020.0004][.FB41.0020.0004][.81EA.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SELF +FA5C ; [.FB41.0020.0002][.81ED.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5C +2F84 ; [.FB41.0020.0004][.81F3.0000.0000] # KANGXI RADICAL ARRIVE +3243 ; [*0310.0020.0004][.FB41.0020.0004][.81F3.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH REACH +2F85 ; [.FB41.0020.0004][.81FC.0000.0000] # KANGXI RADICAL MORTAR +2EBD ; [.FB41.0020.0004][.81FC.0000.0000][.0000.010B.0004] # CJK RADICAL MORTAR +2F893 ; [.FB41.0020.0002][.8201.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F893 +2F98B ; [.FB41.0020.0002][.8201.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98B +2F98C ; [.FB41.0020.0002][.8204.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98C +2F86 ; [.FB41.0020.0004][.820C.0000.0000] # KANGXI RADICAL TONGUE +FA6D ; [.FB41.0020.0002][.8218.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA6D +2F87 ; [.FB41.0020.0004][.821B.0000.0000] # KANGXI RADICAL OPPOSE +2F88 ; [.FB41.0020.0004][.821F.0000.0000] # KANGXI RADICAL BOAT +2F89 ; [.FB41.0020.0004][.826E.0000.0000] # KANGXI RADICAL STOPPING +F97C ; [.FB41.0020.0002][.826F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97C +2F8A ; [.FB41.0020.0004][.8272.0000.0000] # KANGXI RADICAL COLOR +2F8B ; [.FB41.0020.0004][.8278.0000.0000] # KANGXI RADICAL GRASS +FA5D ; [.FB41.0020.0002][.8279.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5D +FA5E ; [.FB41.0020.0002][.8279.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5E +2EBE ; [.FB41.0020.0004][.8279.0000.0000] # CJK RADICAL GRASS ONE +2EBF ; [.FB41.0020.0004][.8279.0000.0000][.0000.010B.0004] # CJK RADICAL GRASS TWO +2EC0 ; [.FB41.0020.0004][.8279.0000.0000][.0000.010C.0004] # CJK RADICAL GRASS THREE +2F990 ; [.FB41.0020.0002][.828B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F990 +2F98F ; [.FB41.0020.0002][.8291.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98F +2F991 ; [.FB41.0020.0002][.829D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F991 +2F993 ; [.FB41.0020.0002][.82B1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F993 +2F994 ; [.FB41.0020.0002][.82B3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F994 +2F995 ; [.FB41.0020.0002][.82BD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F995 +F974 ; [.FB41.0020.0002][.82E5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F974 +2F998 ; [.FB41.0020.0002][.82E5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F998 +2F996 ; [.FB41.0020.0002][.82E6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F996 +2F999 ; [.FB41.0020.0002][.831D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F999 +2F99C ; [.FB41.0020.0002][.8323.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F99C +F9FE ; [.FB41.0020.0002][.8336.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FE +FAB3 ; [.FB41.0020.0002][.8352.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB3 +2F9A0 ; [.FB41.0020.0002][.8353.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A0 +2F99A ; [.FB41.0020.0002][.8363.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F99A +2F99B ; [.FB41.0020.0002][.83AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F99B +2F99D ; [.FB41.0020.0002][.83BD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F99D +F93E ; [.FB41.0020.0002][.83C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93E +2F9A1 ; [.FB41.0020.0002][.83CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A1 +2F9A2 ; [.FB41.0020.0002][.83CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A2 +2F9A3 ; [.FB41.0020.0002][.83DC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A3 +2F99E ; [.FB41.0020.0002][.83E7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F99E +FAB4 ; [.FB41.0020.0002][.83EF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB4 +F958 ; [.FB41.0020.0002][.83F1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F958 +F918 ; [.FB41.0020.0002][.843D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F918 +F96E ; [.FB41.0020.0002][.8449.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96E +FA5F ; [.FB41.0020.0002][.8457.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5F +2F99F ; [.FB41.0020.0002][.8457.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F99F +F999 ; [.FB41.0020.0002][.84EE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F999 +2F9A8 ; [.FB41.0020.0002][.84F1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A8 +2F9A9 ; [.FB41.0020.0002][.84F3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A9 +F9C2 ; [.FB41.0020.0002][.84FC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C2 +2F9AA ; [.FB41.0020.0002][.8516.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9AA +2F9AC ; [.FB41.0020.0002][.8564.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9AC +F923 ; [.FB41.0020.0002][.85CD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F923 +F9F0 ; [.FB41.0020.0002][.85FA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F0 +F935 ; [.FB41.0020.0002][.8606.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F935 +FA20 ; [.FB41.0020.0002][.8612.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA20 +F91F ; [.FB41.0020.0002][.862D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91F +F910 ; [.FB41.0020.0002][.863F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F910 +2F8C ; [.FB41.0020.0004][.864D.0000.0000] # KANGXI RADICAL TIGER +2EC1 ; [.FB41.0020.0004][.864E.0000.0000] # CJK RADICAL TIGER +2F9B3 ; [.FB41.0020.0002][.8650.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B3 +F936 ; [.FB41.0020.0002][.865C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F936 +2F9B4 ; [.FB41.0020.0002][.865C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B4 +2F9B5 ; [.FB41.0020.0002][.8667.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B5 +2F9B6 ; [.FB41.0020.0002][.8669.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B6 +2F8D ; [.FB41.0020.0004][.866B.0000.0000] # KANGXI RADICAL INSECT +2F9B8 ; [.FB41.0020.0002][.8688.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B8 +2F9B7 ; [.FB41.0020.0002][.86A9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B7 +2F9BA ; [.FB41.0020.0002][.86E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9BA +2F9B9 ; [.FB41.0020.0002][.870E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B9 +2F9BC ; [.FB41.0020.0002][.8728.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9BC +2F9BD ; [.FB41.0020.0002][.876B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9BD +FAB5 ; [.FB41.0020.0002][.8779.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB5 +2F9BB ; [.FB41.0020.0002][.8779.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9BB +2F9BE ; [.FB41.0020.0002][.8786.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9BE +F911 ; [.FB41.0020.0002][.87BA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F911 +2F9C0 ; [.FB41.0020.0002][.87E1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C0 +2F9C1 ; [.FB41.0020.0002][.8801.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C1 +F927 ; [.FB41.0020.0002][.881F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F927 +2F8E ; [.FB41.0020.0004][.8840.0000.0000] # KANGXI RADICAL BLOOD +FA08 ; [.FB41.0020.0002][.884C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA08 +2F8F ; [.FB41.0020.0004][.884C.0000.0000] # KANGXI RADICAL WALK ENCLOSURE +2F9C3 ; [.FB41.0020.0002][.8860.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C3 +2F9C4 ; [.FB41.0020.0002][.8863.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C4 +2F90 ; [.FB41.0020.0004][.8863.0000.0000] # KANGXI RADICAL CLOTHES +2EC2 ; [.FB41.0020.0004][.8864.0000.0000] # CJK RADICAL CLOTHES +F9A0 ; [.FB41.0020.0002][.88C2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A0 +F9E7 ; [.FB41.0020.0002][.88CF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E7 +2F9C6 ; [.FB41.0020.0002][.88D7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C6 +2F9C7 ; [.FB41.0020.0002][.88DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C7 +F9E8 ; [.FB41.0020.0002][.88E1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E8 +F912 ; [.FB41.0020.0002][.88F8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F912 +2F9C9 ; [.FB41.0020.0002][.88FA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C9 +FA60 ; [.FB41.0020.0002][.8910.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA60 +FAB6 ; [.FB41.0020.0002][.8941.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB6 +F924 ; [.FB41.0020.0002][.8964.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F924 +2F91 ; [.FB41.0020.0004][.897E.0000.0000] # KANGXI RADICAL WEST +2EC4 ; [.FB41.0020.0004][.897F.0000.0000] # CJK RADICAL WEST TWO +2EC3 ; [.FB41.0020.0004][.8980.0000.0000] # CJK RADICAL WEST ONE +FAB7 ; [.FB41.0020.0002][.8986.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB7 +FA0A ; [.FB41.0020.0002][.898B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA0A +2F92 ; [.FB41.0020.0004][.898B.0000.0000] # KANGXI RADICAL SEE +FA61 ; [.FB41.0020.0002][.8996.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA61 +FAB8 ; [.FB41.0020.0002][.8996.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB8 +2EC5 ; [.FB41.0020.0004][.89C1.0000.0000] # CJK RADICAL C-SIMPLIFIED SEE +2EC6 ; [.FB41.0020.0004][.89D2.0000.0000] # CJK RADICAL SIMPLIFIED HORN +2F93 ; [.FB41.0020.0004][.89D2.0000.0000] # KANGXI RADICAL HORN +2EC7 ; [.FB41.0020.0004][.89D2.0000.0000][.0000.010B.0004] # CJK RADICAL HORN +1F216 ; [.FB41.0020.001C][.89E3.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-89E3 +2F94 ; [.FB41.0020.0004][.8A00.0000.0000] # KANGXI RADICAL SPEECH +2F9CF ; [.FB41.0020.0002][.8AA0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9CF +F96F ; [.FB41.0020.0002][.8AAA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96F +F9A1 ; [.FB41.0020.0002][.8AAA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A1 +FAB9 ; [.FB41.0020.0002][.8ABF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB9 +FABB ; [.FB41.0020.0002][.8ACB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FABB +F97D ; [.FB41.0020.0002][.8AD2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97D +F941 ; [.FB41.0020.0002][.8AD6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F941 +FABE ; [.FB41.0020.0002][.8AED.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FABE +2F9D0 ; [.FB41.0020.0002][.8AED.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D0 +FA22 ; [.FB41.0020.0002][.8AF8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA22 +FABA ; [.FB41.0020.0002][.8AF8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FABA +F95D ; [.FB41.0020.0002][.8AFE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95D +FABD ; [.FB41.0020.0002][.8AFE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FABD +FA62 ; [.FB41.0020.0002][.8B01.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA62 +FABC ; [.FB41.0020.0002][.8B01.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FABC +FA63 ; [.FB41.0020.0002][.8B39.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA63 +FABF ; [.FB41.0020.0002][.8B39.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FABF +F9FC ; [.FB41.0020.0002][.8B58.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FC +F95A ; [.FB41.0020.0002][.8B80.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95A +FAC0 ; [.FB41.0020.0002][.8B8A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC0 +2F9D1 ; [.FB41.0020.0002][.8B8A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D1 +2EC8 ; [.FB41.0020.0004][.8BA0.0000.0000] # CJK RADICAL C-SIMPLIFIED SPEECH +2F95 ; [.FB41.0020.0004][.8C37.0000.0000] # KANGXI RADICAL VALLEY +2F96 ; [.FB41.0020.0004][.8C46.0000.0000] # KANGXI RADICAL BEAN +F900 ; [.FB41.0020.0002][.8C48.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F900 +2F9D2 ; [.FB41.0020.0002][.8C55.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D2 +2F97 ; [.FB41.0020.0004][.8C55.0000.0000] # KANGXI RADICAL PIG +2F98 ; [.FB41.0020.0004][.8C78.0000.0000] # KANGXI RADICAL BADGER +2F99 ; [.FB41.0020.0004][.8C9D.0000.0000] # KANGXI RADICAL SHELL +3236 ; [*0310.0020.0004][.FB41.0020.0004][.8CA1.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FINANCIAL +3296 ; [.FB41.0020.0006][.8CA1.0000.0000] # CIRCLED IDEOGRAPH FINANCIAL +1F223 ; [.FB41.0020.001C][.8CA9.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-8CA9 +2F9D4 ; [.FB41.0020.0002][.8CAB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D4 +2F9D5 ; [.FB41.0020.0002][.8CC1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D5 +F948 ; [.FB41.0020.0002][.8CC2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F948 +323E ; [*0310.0020.0004][.FB41.0020.0004][.8CC7.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH RESOURCE +32AE ; [.FB41.0020.0006][.8CC7.0000.0000] # CIRCLED IDEOGRAPH RESOURCE +F903 ; [.FB41.0020.0002][.8CC8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F903 +FA64 ; [.FB41.0020.0002][.8CD3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA64 +FA65 ; [.FB41.0020.0002][.8D08.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA65 +FAC1 ; [.FB41.0020.0002][.8D08.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC1 +2F9D6 ; [.FB41.0020.0002][.8D1B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D6 +2EC9 ; [.FB41.0020.0004][.8D1D.0000.0000] # CJK RADICAL C-SIMPLIFIED SHELL +2F9A ; [.FB41.0020.0004][.8D64.0000.0000] # KANGXI RADICAL RED +2F9B ; [.FB41.0020.0004][.8D70.0000.0000] # KANGXI RADICAL RUN +1F230 ; [.FB41.0020.001C][.8D70.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-8D70 +2F9D7 ; [.FB41.0020.0002][.8D77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D7 +2F9C ; [.FB41.0020.0004][.8DB3.0000.0000] # KANGXI RADICAL FOOT +2ECA ; [.FB41.0020.0004][.8DB3.0000.0000][.0000.010B.0004] # CJK RADICAL FOOT +2F9DB ; [.FB41.0020.0002][.8DBC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DB +2F9DA ; [.FB41.0020.0002][.8DCB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DA +F937 ; [.FB41.0020.0002][.8DEF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F937 +2F9DC ; [.FB41.0020.0002][.8DF0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DC +2F9D ; [.FB41.0020.0004][.8EAB.0000.0000] # KANGXI RADICAL BODY +F902 ; [.FB41.0020.0002][.8ECA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F902 +2F9E ; [.FB41.0020.0004][.8ECA.0000.0000] # KANGXI RADICAL CART +2F9DE ; [.FB41.0020.0002][.8ED4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DE +F998 ; [.FB41.0020.0002][.8F26.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F998 +F9D7 ; [.FB41.0020.0002][.8F2A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D7 +FAC2 ; [.FB41.0020.0002][.8F38.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC2 +2F9DF ; [.FB41.0020.0002][.8F38.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DF +FA07 ; [.FB41.0020.0002][.8F3B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA07 +F98D ; [.FB41.0020.0002][.8F62.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98D +2ECB ; [.FB41.0020.0004][.8F66.0000.0000] # CJK RADICAL C-SIMPLIFIED CART +2F9F ; [.FB41.0020.0004][.8F9B.0000.0000] # KANGXI RADICAL BITTER +2F98D ; [.FB41.0020.0002][.8F9E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98D +F971 ; [.FB41.0020.0002][.8FB0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F971 +2FA0 ; [.FB41.0020.0004][.8FB0.0000.0000] # KANGXI RADICAL MORNING +2FA1 ; [.FB41.0020.0004][.8FB5.0000.0000] # KANGXI RADICAL WALK +FA66 ; [.FB41.0020.0002][.8FB6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA66 +2ECC ; [.FB41.0020.0004][.8FB6.0000.0000] # CJK RADICAL SIMPLIFIED WALK +2ECD ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.010B.0004] # CJK RADICAL WALK ONE +2ECE ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.010C.0004] # CJK RADICAL WALK TWO +F99A ; [.FB41.0020.0002][.9023.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99A +FA25 ; [.FB41.0020.0002][.9038.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA25 +FA67 ; [.FB41.0020.0002][.9038.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA67 +1F22B ; [.FB41.0020.001C][.904A.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-904A +329C ; [.FB41.0020.0006][.9069.0000.0000] # CIRCLED IDEOGRAPH SUITABLE +FAC3 ; [.FB41.0020.0002][.9072.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC3 +F9C3 ; [.FB41.0020.0002][.907C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C3 +F913 ; [.FB41.0020.0002][.908F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F913 +2FA2 ; [.FB41.0020.0004][.9091.0000.0000] # KANGXI RADICAL CITY +2ECF ; [.FB41.0020.0004][.9091.0000.0000][.0000.010B.0004] # CJK RADICAL CITY +2F9E2 ; [.FB41.0020.0002][.9094.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E2 +F92C ; [.FB41.0020.0002][.90CE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92C +FA2E ; [.FB41.0020.0002][.90DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2E +2F9E3 ; [.FB41.0020.0002][.90F1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E3 +FA26 ; [.FB41.0020.0002][.90FD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA26 +2F9E4 ; [.FB41.0020.0002][.9111.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E4 +2F9E6 ; [.FB41.0020.0002][.911B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E6 +2FA3 ; [.FB41.0020.0004][.9149.0000.0000] # KANGXI RADICAL WINE +F919 ; [.FB41.0020.0002][.916A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F919 +FAC4 ; [.FB41.0020.0002][.9199.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC4 +F9B7 ; [.FB41.0020.0002][.91B4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B7 +2FA4 ; [.FB41.0020.0004][.91C6.0000.0000] # KANGXI RADICAL DISTINGUISH +F9E9 ; [.FB41.0020.0002][.91CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E9 +2FA5 ; [.FB41.0020.0004][.91CC.0000.0000] # KANGXI RADICAL VILLAGE +F97E ; [.FB41.0020.0002][.91CF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97E +F90A ; [.FB41.0020.0002][.91D1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90A +2FA6 ; [.FB41.0020.0004][.91D1.0000.0000] # KANGXI RADICAL GOLD +322E ; [*0310.0020.0004][.FB41.0020.0004][.91D1.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH METAL +328E ; [.FB41.0020.0006][.91D1.0000.0000] # CIRCLED IDEOGRAPH METAL +F9B1 ; [.FB41.0020.0002][.9234.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B1 +2F9E7 ; [.FB41.0020.0002][.9238.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E7 +FAC5 ; [.FB41.0020.0002][.9276.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC5 +2F9EA ; [.FB41.0020.0002][.927C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9EA +2F9E8 ; [.FB41.0020.0002][.92D7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E8 +2F9E9 ; [.FB41.0020.0002][.92D8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E9 +F93F ; [.FB41.0020.0002][.9304.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93F +F99B ; [.FB41.0020.0002][.934A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99B +2F9EB ; [.FB41.0020.0002][.93F9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9EB +2F9EC ; [.FB41.0020.0002][.9415.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9EC +2ED0 ; [.FB41.0020.0004][.9485.0000.0000] # CJK RADICAL C-SIMPLIFIED GOLD +2ED1 ; [.FB41.0020.0004][.9577.0000.0000] # CJK RADICAL LONG ONE +2FA7 ; [.FB41.0020.0004][.9577.0000.0000] # KANGXI RADICAL LONG +2ED2 ; [.FB41.0020.0004][.9578.0000.0000] # CJK RADICAL LONG TWO +2ED3 ; [.FB41.0020.0004][.957F.0000.0000] # CJK RADICAL C-SIMPLIFIED LONG +2FA8 ; [.FB41.0020.0004][.9580.0000.0000] # KANGXI RADICAL GATE +2F9EE ; [.FB41.0020.0002][.958B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9EE +F986 ; [.FB41.0020.0002][.95AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F986 +2F9F0 ; [.FB41.0020.0002][.95B7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F0 +2ED4 ; [.FB41.0020.0004][.95E8.0000.0000] # CJK RADICAL C-SIMPLIFIED GATE +2FA9 ; [.FB41.0020.0004][.961C.0000.0000] # KANGXI RADICAL MOUND +2ED5 ; [.FB41.0020.0004][.961C.0000.0000][.0000.010B.0004] # CJK RADICAL MOUND ONE +2ED6 ; [.FB41.0020.0004][.961D.0000.0000] # CJK RADICAL MOUND TWO +F9C6 ; [.FB41.0020.0002][.962E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C6 +F951 ; [.FB41.0020.0002][.964B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F951 +FA09 ; [.FB41.0020.0002][.964D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA09 +F959 ; [.FB41.0020.0002][.9675.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F959 +F9D3 ; [.FB41.0020.0002][.9678.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D3 +FAC6 ; [.FB41.0020.0002][.967C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC6 +F9DC ; [.FB41.0020.0002][.9686.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DC +F9F1 ; [.FB41.0020.0002][.96A3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F1 +2FAA ; [.FB41.0020.0004][.96B6.0000.0000] # KANGXI RADICAL SLAVE +FA2F ; [.FB41.0020.0002][.96B7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2F +F9B8 ; [.FB41.0020.0002][.96B8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B8 +2FAB ; [.FB41.0020.0004][.96B9.0000.0000] # KANGXI RADICAL SHORT TAILED BIRD +2F9F3 ; [.FB41.0020.0002][.96C3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F3 +F9EA ; [.FB41.0020.0002][.96E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EA +FA68 ; [.FB41.0020.0002][.96E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA68 +FAC7 ; [.FB41.0020.0002][.96E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC7 +2FAC ; [.FB41.0020.0004][.96E8.0000.0000] # KANGXI RADICAL RAIN +2ED7 ; [.FB41.0020.0004][.96E8.0000.0000][.0000.010B.0004] # CJK RADICAL RAIN +F9B2 ; [.FB41.0020.0002][.96F6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B2 +F949 ; [.FB41.0020.0002][.96F7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F949 +2F9F5 ; [.FB41.0020.0002][.9723.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F5 +F938 ; [.FB41.0020.0002][.9732.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F938 +F9B3 ; [.FB41.0020.0002][.9748.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B3 +2FAD ; [.FB41.0020.0004][.9751.0000.0000] # KANGXI RADICAL BLUE +2ED8 ; [.FB41.0020.0004][.9752.0000.0000] # CJK RADICAL BLUE +FA1C ; [.FB41.0020.0002][.9756.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA1C +FAC8 ; [.FB41.0020.0002][.9756.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC8 +2FAE ; [.FB41.0020.0004][.975E.0000.0000] # KANGXI RADICAL WRONG +2FAF ; [.FB41.0020.0004][.9762.0000.0000] # KANGXI RADICAL FACE +2FB0 ; [.FB41.0020.0004][.9769.0000.0000] # KANGXI RADICAL LEATHER +2FB1 ; [.FB41.0020.0004][.97CB.0000.0000] # KANGXI RADICAL TANNED LEATHER +FAC9 ; [.FB41.0020.0002][.97DB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC9 +2F9FA ; [.FB41.0020.0002][.97E0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9FA +2ED9 ; [.FB41.0020.0004][.97E6.0000.0000] # CJK RADICAL C-SIMPLIFIED TANNED LEATHER +2FB2 ; [.FB41.0020.0004][.97ED.0000.0000] # KANGXI RADICAL LEEK +2FB3 ; [.FB41.0020.0004][.97F3.0000.0000] # KANGXI RADICAL SOUND +FA69 ; [.FB41.0020.0002][.97FF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA69 +FACA ; [.FB41.0020.0002][.97FF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACA +2FB4 ; [.FB41.0020.0004][.9801.0000.0000] # KANGXI RADICAL LEAF +32A0 ; [.FB41.0020.0006][.9805.0000.0000] # CIRCLED IDEOGRAPH ITEM +FACB ; [.FB41.0020.0002][.980B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACB +2F9FE ; [.FB41.0020.0002][.980B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9FE +2F9FF ; [.FB41.0020.0002][.980B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9FF +F9B4 ; [.FB41.0020.0002][.9818.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B4 +2FA00 ; [.FB41.0020.0002][.9829.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA00 +FA6A ; [.FB41.0020.0002][.983B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA6A +FACC ; [.FB41.0020.0002][.983B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACC +F9D0 ; [.FB41.0020.0002][.985E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D0 +2EDA ; [.FB41.0020.0004][.9875.0000.0000] # CJK RADICAL C-SIMPLIFIED LEAF +2FB5 ; [.FB41.0020.0004][.98A8.0000.0000] # KANGXI RADICAL WIND +2EDB ; [.FB41.0020.0004][.98CE.0000.0000] # CJK RADICAL C-SIMPLIFIED WIND +2FB6 ; [.FB41.0020.0004][.98DB.0000.0000] # KANGXI RADICAL FLY +2EDC ; [.FB41.0020.0004][.98DE.0000.0000] # CJK RADICAL C-SIMPLIFIED FLY +2EDD ; [.FB41.0020.0004][.98DF.0000.0000] # CJK RADICAL EAT ONE +2FB7 ; [.FB41.0020.0004][.98DF.0000.0000] # KANGXI RADICAL EAT +2EDF ; [.FB41.0020.0004][.98E0.0000.0000] # CJK RADICAL EAT THREE +2EDE ; [.FB41.0020.0004][.98E0.0000.0000][.0000.010B.0004] # CJK RADICAL EAT TWO +2FA02 ; [.FB41.0020.0002][.98E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA02 +FA2A ; [.FB41.0020.0002][.98EF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2A +FA2B ; [.FB41.0020.0002][.98FC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2B +FA2C ; [.FB41.0020.0002][.9928.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2C +2FA04 ; [.FB41.0020.0002][.9929.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA04 +2EE0 ; [.FB41.0020.0004][.9963.0000.0000] # CJK RADICAL C-SIMPLIFIED EAT +2FB8 ; [.FB41.0020.0004][.9996.0000.0000] # KANGXI RADICAL HEAD +2EE1 ; [.FB41.0020.0004][.9996.0000.0000][.0000.010B.0004] # CJK RADICAL HEAD +2FB9 ; [.FB41.0020.0004][.9999.0000.0000] # KANGXI RADICAL FRAGRANT +2FA05 ; [.FB41.0020.0002][.99A7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA05 +2FBA ; [.FB41.0020.0004][.99AC.0000.0000] # KANGXI RADICAL HORSE +2FA06 ; [.FB41.0020.0002][.99C2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA06 +F91A ; [.FB41.0020.0002][.99F1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91A +2FA07 ; [.FB41.0020.0002][.99FE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA07 +F987 ; [.FB41.0020.0002][.9A6A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F987 +2EE2 ; [.FB41.0020.0004][.9A6C.0000.0000] # CJK RADICAL C-SIMPLIFIED HORSE +2FBB ; [.FB41.0020.0004][.9AA8.0000.0000] # KANGXI RADICAL BONE +2EE3 ; [.FB41.0020.0004][.9AA8.0000.0000][.0000.010B.0004] # CJK RADICAL BONE +2FBC ; [.FB41.0020.0004][.9AD8.0000.0000] # KANGXI RADICAL TALL +2FBD ; [.FB41.0020.0004][.9ADF.0000.0000] # KANGXI RADICAL HAIR +FACD ; [.FB41.0020.0002][.9B12.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACD +2FA0A ; [.FB41.0020.0002][.9B12.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA0A +2FBE ; [.FB41.0020.0004][.9B25.0000.0000] # KANGXI RADICAL FIGHT +2FBF ; [.FB41.0020.0004][.9B2F.0000.0000] # KANGXI RADICAL SACRIFICIAL WINE +2FC0 ; [.FB41.0020.0004][.9B32.0000.0000] # KANGXI RADICAL CAULDRON +2FC1 ; [.FB41.0020.0004][.9B3C.0000.0000] # KANGXI RADICAL GHOST +2EE4 ; [.FB41.0020.0004][.9B3C.0000.0000][.0000.010B.0004] # CJK RADICAL GHOST +2FC2 ; [.FB41.0020.0004][.9B5A.0000.0000] # KANGXI RADICAL FISH +F939 ; [.FB41.0020.0002][.9B6F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F939 +2FA0B ; [.FB41.0020.0002][.9C40.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA0B +F9F2 ; [.FB41.0020.0002][.9C57.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F2 +2EE5 ; [.FB41.0020.0004][.9C7C.0000.0000] # CJK RADICAL C-SIMPLIFIED FISH +2FC3 ; [.FB41.0020.0004][.9CE5.0000.0000] # KANGXI RADICAL BIRD +2FA0C ; [.FB41.0020.0002][.9CFD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA0C +2FA0F ; [.FB41.0020.0002][.9D67.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA0F +FA2D ; [.FB41.0020.0002][.9DB4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2D +F93A ; [.FB41.0020.0002][.9DFA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93A +F920 ; [.FB41.0020.0002][.9E1E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F920 +2EE6 ; [.FB41.0020.0004][.9E1F.0000.0000] # CJK RADICAL C-SIMPLIFIED BIRD +2FC4 ; [.FB41.0020.0004][.9E75.0000.0000] # KANGXI RADICAL SALT +2EE7 ; [.FB41.0020.0004][.9E75.0000.0000][.0000.010B.0004] # CJK RADICAL C-SIMPLIFIED SALT +F940 ; [.FB41.0020.0002][.9E7F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F940 +2FC5 ; [.FB41.0020.0004][.9E7F.0000.0000] # KANGXI RADICAL DEER +F988 ; [.FB41.0020.0002][.9E97.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F988 +F9F3 ; [.FB41.0020.0002][.9E9F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F3 +2FC6 ; [.FB41.0020.0004][.9EA5.0000.0000] # KANGXI RADICAL WHEAT +2EE8 ; [.FB41.0020.0004][.9EA6.0000.0000] # CJK RADICAL SIMPLIFIED WHEAT +2FA15 ; [.FB41.0020.0002][.9EBB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA15 +2FC7 ; [.FB41.0020.0004][.9EBB.0000.0000] # KANGXI RADICAL HEMP +2FC8 ; [.FB41.0020.0004][.9EC3.0000.0000] # KANGXI RADICAL YELLOW +2EE9 ; [.FB41.0020.0004][.9EC4.0000.0000] # CJK RADICAL SIMPLIFIED YELLOW +2FC9 ; [.FB41.0020.0004][.9ECD.0000.0000] # KANGXI RADICAL MILLET +F989 ; [.FB41.0020.0002][.9ECE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F989 +2FCA ; [.FB41.0020.0004][.9ED1.0000.0000] # KANGXI RADICAL BLACK +2FA17 ; [.FB41.0020.0002][.9EF9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA17 +2FCB ; [.FB41.0020.0004][.9EF9.0000.0000] # KANGXI RADICAL EMBROIDERY +2FCC ; [.FB41.0020.0004][.9EFD.0000.0000] # KANGXI RADICAL FROG +2FA18 ; [.FB41.0020.0002][.9EFE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA18 +2EEA ; [.FB41.0020.0004][.9EFE.0000.0000] # CJK RADICAL C-SIMPLIFIED FROG +2FA19 ; [.FB41.0020.0002][.9F05.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA19 +2FCD ; [.FB41.0020.0004][.9F0E.0000.0000] # KANGXI RADICAL TRIPOD +2FA1A ; [.FB41.0020.0002][.9F0F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA1A +2FCE ; [.FB41.0020.0004][.9F13.0000.0000] # KANGXI RADICAL DRUM +2FA1B ; [.FB41.0020.0002][.9F16.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA1B +2FCF ; [.FB41.0020.0004][.9F20.0000.0000] # KANGXI RADICAL RAT +2FA1C ; [.FB41.0020.0002][.9F3B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA1C +2FD0 ; [.FB41.0020.0004][.9F3B.0000.0000] # KANGXI RADICAL NOSE +FAD8 ; [.FB41.0020.0002][.9F43.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD8 +2FD1 ; [.FB41.0020.0004][.9F4A.0000.0000] # KANGXI RADICAL EVEN +2EEB ; [.FB41.0020.0004][.9F4A.0000.0000][.0000.010B.0004] # CJK RADICAL J-SIMPLIFIED EVEN +2EEC ; [.FB41.0020.0004][.9F50.0000.0000] # CJK RADICAL C-SIMPLIFIED EVEN +2FD2 ; [.FB41.0020.0004][.9F52.0000.0000] # KANGXI RADICAL TOOTH +2EED ; [.FB41.0020.0004][.9F52.0000.0000][.0000.010B.0004] # CJK RADICAL J-SIMPLIFIED TOOTH +2EEE ; [.FB41.0020.0004][.9F7F.0000.0000] # CJK RADICAL C-SIMPLIFIED TOOTH +F9C4 ; [.FB41.0020.0002][.9F8D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C4 +2FD3 ; [.FB41.0020.0004][.9F8D.0000.0000] # KANGXI RADICAL DRAGON +2EEF ; [.FB41.0020.0004][.9F8D.0000.0000][.0000.010B.0004] # CJK RADICAL J-SIMPLIFIED DRAGON +FAD9 ; [.FB41.0020.0002][.9F8E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD9 +2EF0 ; [.FB41.0020.0004][.9F99.0000.0000] # CJK RADICAL C-SIMPLIFIED DRAGON +F907 ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F907 +F908 ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F908 +FACE ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACE +2FD4 ; [.FB41.0020.0004][.9F9C.0000.0000] # KANGXI RADICAL TURTLE +2EF1 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.010B.0004] # CJK RADICAL TURTLE +2EF2 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.010C.0004] # CJK RADICAL J-SIMPLIFIED TURTLE +2EF3 ; [.FB41.0020.0004][.9F9F.0000.0000] # CJK RADICAL C-SIMPLIFIED TURTLE +2FD5 ; [.FB41.0020.0004][.9FA0.0000.0000] # KANGXI RADICAL FLUTE +FA0E ; [.FB41.0020.0002][.FA0E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA0E +FA0F ; [.FB41.0020.0002][.FA0F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA0F +FA11 ; [.FB41.0020.0002][.FA11.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA11 +FA13 ; [.FB41.0020.0002][.FA13.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA13 +FA14 ; [.FB41.0020.0002][.FA14.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA14 +FA1F ; [.FB41.0020.0002][.FA1F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA1F +FA21 ; [.FB41.0020.0002][.FA21.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA21 +FA23 ; [.FB41.0020.0002][.FA23.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA23 +FA24 ; [.FB41.0020.0002][.FA24.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA24 +FA27 ; [.FB41.0020.0002][.FA27.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA27 +FA28 ; [.FB41.0020.0002][.FA28.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA28 +FA29 ; [.FB41.0020.0002][.FA29.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA29 +2F80C ; [.FB80.0020.0002][.B49E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F80C +2F813 ; [.FB80.0020.0002][.B4B9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F813 +2F9CA ; [.FB80.0020.0002][.B4BB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9CA +2F81F ; [.FB80.0020.0002][.B4DF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81F +2F824 ; [.FB80.0020.0002][.B515.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F824 +2F867 ; [.FB80.0020.0002][.B6EE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F867 +2F868 ; [.FB80.0020.0002][.B6FC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F868 +2F876 ; [.FB80.0020.0002][.B781.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F876 +2F883 ; [.FB80.0020.0002][.B82F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F883 +2F888 ; [.FB80.0020.0002][.B862.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F888 +2F88A ; [.FB80.0020.0002][.B87C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F88A +2F896 ; [.FB80.0020.0002][.B8C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F896 +2F89B ; [.FB80.0020.0002][.B8E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89B +2F8A2 ; [.FB80.0020.0002][.B91C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A2 +2F8A1 ; [.FB80.0020.0002][.B93A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A1 +2F8C2 ; [.FB80.0020.0002][.BA2E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C2 +2F8C7 ; [.FB80.0020.0002][.BA6C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C7 +2F8D1 ; [.FB80.0020.0002][.BAE4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D1 +2F8D0 ; [.FB80.0020.0002][.BB08.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D0 +2F8CE ; [.FB80.0020.0002][.BB19.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CE +2F8DE ; [.FB80.0020.0002][.BB49.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DE +FAD2 ; [.FB80.0020.0002][.BB9D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD2 +2F8E7 ; [.FB80.0020.0002][.BB9D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E7 +2F8EE ; [.FB80.0020.0002][.BC18.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8EE +2F8F2 ; [.FB80.0020.0002][.BC4E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F2 +2F90A ; [.FB80.0020.0002][.BD33.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F90A +2F916 ; [.FB80.0020.0002][.BD96.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F916 +2F92A ; [.FB80.0020.0002][.BEAC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F92A +2F92C ; [.FB80.0020.0002][.BEB8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F92C +2F92D ; [.FB80.0020.0002][.BEB8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F92D +2F933 ; [.FB80.0020.0002][.BF1B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F933 +2F93E ; [.FB80.0020.0002][.BFFC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F93E +2F93F ; [.FB80.0020.0002][.C008.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F93F +FAD3 ; [.FB80.0020.0002][.C018.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD3 +FAD4 ; [.FB80.0020.0002][.C039.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD4 +2F949 ; [.FB80.0020.0002][.C039.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F949 +2F94B ; [.FB80.0020.0002][.C046.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F94B +2F94C ; [.FB80.0020.0002][.C096.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F94C +2F951 ; [.FB80.0020.0002][.C0E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F951 +2F958 ; [.FB80.0020.0002][.C12F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F958 +2F960 ; [.FB80.0020.0002][.C202.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F960 +2F964 ; [.FB80.0020.0002][.C227.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F964 +2F967 ; [.FB80.0020.0002][.C2A0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F967 +2F96D ; [.FB80.0020.0002][.C301.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F96D +2F971 ; [.FB80.0020.0002][.C334.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F971 +2F974 ; [.FB80.0020.0002][.C359.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F974 +2F981 ; [.FB80.0020.0002][.C3D5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F981 +2F8D7 ; [.FB80.0020.0002][.C3D9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D7 +2F984 ; [.FB80.0020.0002][.C40B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F984 +2F98E ; [.FB80.0020.0002][.C46B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98E +2F9A7 ; [.FB80.0020.0002][.C52B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A7 +2F9AE ; [.FB80.0020.0002][.C55D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9AE +2F9AF ; [.FB80.0020.0002][.C561.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9AF +2F9B2 ; [.FB80.0020.0002][.C56B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B2 +2F9BF ; [.FB80.0020.0002][.C5D7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9BF +2F9C2 ; [.FB80.0020.0002][.C5F9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C2 +2F9C8 ; [.FB80.0020.0002][.C635.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C8 +2F9CD ; [.FB80.0020.0002][.C6BE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9CD +2F9CE ; [.FB80.0020.0002][.C6C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9CE +2F9EF ; [.FB80.0020.0002][.C995.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9EF +2F9F2 ; [.FB80.0020.0002][.C9E6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F2 +2F9F8 ; [.FB80.0020.0002][.CA6E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F8 +2F9F9 ; [.FB80.0020.0002][.CA76.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F9 +2F9FC ; [.FB80.0020.0002][.CAB2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9FC +2FA03 ; [.FB80.0020.0002][.CB33.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA03 +2FA08 ; [.FB80.0020.0002][.CBCE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA08 +2FA0D ; [.FB80.0020.0002][.CCCE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA0D +2FA0E ; [.FB80.0020.0002][.CCED.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA0E +2FA11 ; [.FB80.0020.0002][.CCF8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA11 +2FA16 ; [.FB80.0020.0002][.CD56.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA16 +2F803 ; [.FB84.0020.0002][.8122.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F803 +2F812 ; [.FB84.0020.0002][.851C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F812 +2F91B ; [.FB84.0020.0002][.8525.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F91B +2F816 ; [.FB84.0020.0002][.854B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F816 +2F80D ; [.FB84.0020.0002][.863A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F80D +2F9D9 ; [.FB84.0020.0002][.8804.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D9 +2F9DD ; [.FB84.0020.0002][.88DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DD +2F834 ; [.FB84.0020.0002][.8A2C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F834 +2F838 ; [.FB84.0020.0002][.8B63.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F838 +2F859 ; [.FB84.0020.0002][.94E4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F859 +2F860 ; [.FB84.0020.0002][.96A8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F860 +2F861 ; [.FB84.0020.0002][.96EA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F861 +2F86C ; [.FB84.0020.0002][.99C8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86C +2F871 ; [.FB84.0020.0002][.9B18.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F871 +2F8F8 ; [.FB84.0020.0002][.9D0B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F8 +2F87B ; [.FB84.0020.0002][.9DE4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F87B +2F87D ; [.FB84.0020.0002][.9DE6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F87D +2F889 ; [.FB84.0020.0002][.A183.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F889 +2F939 ; [.FB84.0020.0002][.A19F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F939 +2F891 ; [.FB84.0020.0002][.A331.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F891 +2F892 ; [.FB84.0020.0002][.A331.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F892 +2F8A4 ; [.FB84.0020.0002][.A6D4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8A4 +FAD0 ; [.FB84.0020.0002][.A844.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD0 +FACF ; [.FB84.0020.0002][.A84A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACF +2F8B8 ; [.FB84.0020.0002][.AB0C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B8 +2F8BE ; [.FB84.0020.0002][.ABF1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8BE +2F8CA ; [.FB84.0020.0002][.B00A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CA +2F897 ; [.FB84.0020.0002][.B2B8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F897 +2F980 ; [.FB84.0020.0002][.B35F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F980 +2F989 ; [.FB84.0020.0002][.B393.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F989 +2F98A ; [.FB84.0020.0002][.B39C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98A +2F8DD ; [.FB84.0020.0002][.B3C3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DD +FAD1 ; [.FB84.0020.0002][.B3D5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD1 +2F8E3 ; [.FB84.0020.0002][.B46D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E3 +2F8EC ; [.FB84.0020.0002][.B6A3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8EC +2F8F0 ; [.FB84.0020.0002][.B8A7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F0 +2F8F7 ; [.FB84.0020.0002][.BA8D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F7 +2F8F9 ; [.FB84.0020.0002][.BAFA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F9 +2F8FB ; [.FB84.0020.0002][.BCBC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8FB +2F906 ; [.FB84.0020.0002][.BD1E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F906 +2F90D ; [.FB84.0020.0002][.BED1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F90D +2F910 ; [.FB84.0020.0002][.BF5E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F910 +2F911 ; [.FB84.0020.0002][.BF8E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F911 +2F91D ; [.FB84.0020.0002][.C263.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F91D +FA6C ; [.FB84.0020.0002][.C2EE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA6C +2F91F ; [.FB84.0020.0002][.C3AB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F91F +2F923 ; [.FB84.0020.0002][.C608.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F923 +2F926 ; [.FB84.0020.0002][.C735.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F926 +2F927 ; [.FB84.0020.0002][.C814.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F927 +2F935 ; [.FB84.0020.0002][.CC36.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F935 +2F937 ; [.FB84.0020.0002][.CC92.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F937 +2F93B ; [.FB84.0020.0002][.CFA1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F93B +2F93C ; [.FB84.0020.0002][.CFB8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F93C +2F93D ; [.FB84.0020.0002][.D044.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F93D +2F942 ; [.FB84.0020.0002][.D0F2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F942 +2F941 ; [.FB84.0020.0002][.D0F3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F941 +2F943 ; [.FB84.0020.0002][.D119.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F943 +2F944 ; [.FB84.0020.0002][.D133.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F944 +FAD5 ; [.FB84.0020.0002][.D249.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD5 +2F94D ; [.FB84.0020.0002][.D41D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F94D +2F952 ; [.FB84.0020.0002][.D626.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F952 +2F954 ; [.FB84.0020.0002][.D69A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F954 +2F955 ; [.FB84.0020.0002][.D6C5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F955 +2F95C ; [.FB84.0020.0002][.D97C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F95C +2F95D ; [.FB84.0020.0002][.DAA7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F95D +2F95E ; [.FB84.0020.0002][.DAA7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F95E +2F961 ; [.FB84.0020.0002][.DBAB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F961 +2F965 ; [.FB84.0020.0002][.DC80.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F965 +FAD6 ; [.FB84.0020.0002][.DCD0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD6 +2F96B ; [.FB84.0020.0002][.DF86.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F96B +2F898 ; [.FB84.0020.0002][.E1DA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F898 +2F972 ; [.FB84.0020.0002][.E228.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F972 +2F973 ; [.FB84.0020.0002][.E247.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F973 +2F975 ; [.FB84.0020.0002][.E2D9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F975 +2F977 ; [.FB84.0020.0002][.E33E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F977 +2F97B ; [.FB84.0020.0002][.E4DA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F97B +2F97C ; [.FB84.0020.0002][.E523.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F97C +2F97E ; [.FB84.0020.0002][.E5A8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F97E +2F987 ; [.FB84.0020.0002][.E7A7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F987 +2F988 ; [.FB84.0020.0002][.E7B5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F988 +2F997 ; [.FB84.0020.0002][.EB3C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F997 +2F9A4 ; [.FB84.0020.0002][.EC36.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A4 +2F9A6 ; [.FB84.0020.0002][.ECD5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A6 +2F9A5 ; [.FB84.0020.0002][.ED6B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9A5 +2F9AD ; [.FB84.0020.0002][.EF2C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9AD +2F9B0 ; [.FB84.0020.0002][.EFB1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B0 +2F9B1 ; [.FB84.0020.0002][.F0D2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9B1 +2F9AB ; [.FB84.0020.0002][.F3CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9AB +2F9C5 ; [.FB84.0020.0002][.F667.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9C5 +2F9CB ; [.FB84.0020.0002][.F8AE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9CB +2F9CC ; [.FB84.0020.0002][.F966.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9CC +2F9D3 ; [.FB84.0020.0002][.FCA8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D3 +FAD7 ; [.FB84.0020.0002][.FED3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD7 +2F9D8 ; [.FB84.0020.0002][.FF2F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D8 +2F9E0 ; [.FB85.0020.0002][.85D2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E0 +2F9E1 ; [.FB85.0020.0002][.85ED.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E1 +2F9E5 ; [.FB85.0020.0002][.872E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E5 +2F9ED ; [.FB85.0020.0002][.8BFA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9ED +2F9F1 ; [.FB85.0020.0002][.8D77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F1 +2F9F6 ; [.FB85.0020.0002][.9145.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F6 +2F81C ; [.FB85.0020.0002][.91DF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81C +2F9F7 ; [.FB85.0020.0002][.921A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F7 +2F9FB ; [.FB85.0020.0002][.940A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9FB +2F9FD ; [.FB85.0020.0002][.9496.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9FD +2FA01 ; [.FB85.0020.0002][.95B6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA01 +2FA09 ; [.FB85.0020.0002][.9B30.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA09 +2FA10 ; [.FB85.0020.0002][.A0CE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA10 +2FA12 ; [.FB85.0020.0002][.A105.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA12 +2FA13 ; [.FB85.0020.0002][.A20E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA13 +2FA14 ; [.FB85.0020.0002][.A291.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA14 +2F88F ; [.FB85.0020.0002][.A392.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F88F +2FA1D ; [.FB85.0020.0002][.A600.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA1D +FFFD ; [.FFFD.0020.0002] # REPLACEMENT CHARACTER diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index e4b08a26ee..ea85176f33 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -737,10 +737,11 @@ Length should be adjusted when the standard changes.") (defun parse-collation-line (line) (destructuring-bind (%code-points %keys) (split-string line #\;) (let* ((code-points (parse-codepoints %code-points)) + (%keys (subseq %keys 0 (search " #" %keys))) (keys - (remove - "" - (split-string (remove #\[ (remove #\Space %keys)) #\]) :test #'string=)) + (remove + "" + (split-string (remove #\[ (remove #\Space %keys)) #\]) :test #'string=)) (ret (loop for key in keys for variable-p = (position #\* key) @@ -759,7 +760,7 @@ Length should be adjusted when the standard changes.") (with-input-txt-file (stream "allkeys") (loop with hash = (make-hash-table :test #'equal) for line = (read-line stream nil nil) while line - unless (eql 0 (position #\# line)) + unless (or (string= line "") (eql 0 (position #\@ line)) (eql 0 (position #\# line))) do (multiple-value-bind (codepoints keys) (parse-collation-line line) (setf (gethash codepoints hash) keys)) finally (return hash)))) From 5a6e6b950be33e8a3dbab01e1d37ee6a2fec5409 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 27 Jun 2022 14:15:49 +0100 Subject: [PATCH 3608/4023] Fix typos in SB-UNICODE:LINE-BREAK-CLASS Clearly no-one has used East Asian-style line break class resolution in a while, or at least not with success. --- src/code/target-unicode.lisp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 09d66c92e1..7f937bbeb7 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -242,8 +242,8 @@ If the character is not a Hangul syllable or Jamo, returns NIL" (defun line-break-class (character &key resolve) "Returns the line breaking class of CHARACTER, as specified in UAX #14. If :RESOLVE is NIL, returns the character class found in the property file. -If :RESOLVE is non-NIL, centain line-breaking classes will be mapped to othec -classes as specified in the applicable standards. Addinionally, if :RESOLVE +If :RESOLVE is non-NIL, certain line-breaking classes will be mapped to other +classes as specified in the applicable standards. Additionally, if :RESOLVE is :EAST-ASIAN, Ambigious (class :AI) characters will be mapped to the Ideographic (:ID) class instead of Alphabetic (:AL)." (when (and resolve (listp character)) (setf character (car character))) @@ -260,7 +260,7 @@ Ideographic (:ID) class instead of Alphabetic (:AL)." (when resolve (setf raw-class (case raw-class - (:ai (if (eql resolve :east-asion) :ID :AL)) + (:ai (if (eql resolve :east-asian) :ID :AL)) ; If we see :CM when resolving, we have a CM that isn't subject ; to LB9, so we do LB10 ((:xx :cm) :al) From 97cc198e3ca2d242d096d452ed460bf51b8b2e67 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 27 Jun 2022 14:28:35 +0100 Subject: [PATCH 3609/4023] Consistency checks for hand-encoded data Fail early if we are missing entries in our East Asian width, script, line break class, general category or bidi class tables. --- tools-for-build/ucd.lisp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index ea85176f33..2be22ba6a9 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -83,6 +83,10 @@ do (setf (gethash string hash) index)) hash)) +(defun index-or-lose (key table kind) + (or (gethash key table) + (error "unknown ~A: ~S" kind key))) + (defun clear-flag (bit integer) (logandc2 integer (ash 1 bit))) @@ -169,7 +173,7 @@ Length should be adjusted when the standard changes.") (split-string (string-right-trim " " (subseq line 0 (position #\# line))) #\;) (let ((range (parse-codepoint-range codepoints)) - (index (gethash value *east-asian-widths*))) + (index (index-or-lose value *east-asian-widths* "East Asian width"))) (loop for i from (car range) to (cadr range) do (setf (gethash i hash) index)))) finally (return hash))) @@ -184,7 +188,7 @@ Length should be adjusted when the standard changes.") (split-string (string-right-trim " " (subseq line 0 (position #\# line))) #\;) (let ((range (parse-codepoint-range codepoints)) - (index (gethash (subseq value 1) *scripts*))) + (index (index-or-lose (subseq value 1) *scripts* "script"))) (loop for i from (car range) to (cadr range) do (setf (gethash i hash) index)))) finally (return hash))) @@ -198,9 +202,13 @@ Length should be adjusted when the standard changes.") do (destructuring-bind (codepoints value) (split-string (string-right-trim " " (subseq line 0 (position #\# line))) #\;) - (let ((range (parse-codepoint-range codepoints)) - ;; Hangul syllables temporarily go to "Unkwown" - (index (gethash value *line-break-classes* 0))) + (let* ((range (parse-codepoint-range codepoints)) + ;; Hangul syllables are marked as "Unknown", and programmatically + ;; handled in SB-UNICODE:LINE-BREAK-CLASS + (value + (or (and (member value '("JL" "JV" "JT" "H2" "H3") :test 'string=) "XX") + value)) + (index (index-or-lose value *line-break-classes* "line break"))) (loop for i from (car range) to (cadr range) do (setf (gethash i hash) index)))) finally (return hash))) @@ -419,12 +427,9 @@ Length should be adjusted when the standard changes.") (progn (setf *block-first* code-point) nil) - (let* ((gc-index (or (gethash general-category *general-categories*) - (error "unknown general category ~A" - general-category))) - (bidi-index (or (gethash bidi-class *bidi-classes*) - (error "unknown bidirectional class ~A" - bidi-class))) + (let* ((gc-index + (index-or-lose general-category *general-categories* "general category")) + (bidi-index (index-or-lose bidi-class *bidi-classes* "bidirectional class")) (ccc (parse-integer canonical-combining-class)) (digit-index (if (string= "" digit) 128 ; non-digits have high bit (let ((%digit (parse-integer digit))) From 88311d66650188a580b9094cf2f8b3f8991054f1 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 27 Jun 2022 15:38:04 +0100 Subject: [PATCH 3610/4023] Remove stray data file It exists and is read in tests/data; no need for this other copy. --- tools-for-build/GraphemeBreakProperty.txt | 1336 --------------------- 1 file changed, 1336 deletions(-) delete mode 100644 tools-for-build/GraphemeBreakProperty.txt diff --git a/tools-for-build/GraphemeBreakProperty.txt b/tools-for-build/GraphemeBreakProperty.txt deleted file mode 100644 index fba2ee8793..0000000000 --- a/tools-for-build/GraphemeBreakProperty.txt +++ /dev/null @@ -1,1336 +0,0 @@ -# GraphemeBreakProperty-8.0.0.txt -# Date: 2015-02-13, 13:47:14 GMT [MD] -# -# Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ - -# ================================================ - -# Property: Grapheme_Cluster_Break - -# All code points not explicitly listed for Grapheme_Cluster_Break -# have the value Other (XX). - -# @missing: 0000..10FFFF; Other - -# ================================================ - -000D ; CR # Cc <control-000D> - -# Total code points: 1 - -# ================================================ - -000A ; LF # Cc <control-000A> - -# Total code points: 1 - -# ================================================ - -0000..0009 ; Control # Cc [10] <control-0000>..<control-0009> -000B..000C ; Control # Cc [2] <control-000B>..<control-000C> -000E..001F ; Control # Cc [18] <control-000E>..<control-001F> -007F..009F ; Control # Cc [33] <control-007F>..<control-009F> -00AD ; Control # Cf SOFT HYPHEN -0600..0605 ; Control # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE -061C ; Control # Cf ARABIC LETTER MARK -06DD ; Control # Cf ARABIC END OF AYAH -070F ; Control # Cf SYRIAC ABBREVIATION MARK -180E ; Control # Cf MONGOLIAN VOWEL SEPARATOR -200B ; Control # Cf ZERO WIDTH SPACE -200E..200F ; Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK -2028 ; Control # Zl LINE SEPARATOR -2029 ; Control # Zp PARAGRAPH SEPARATOR -202A..202E ; Control # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -2060..2064 ; Control # Cf [5] WORD JOINER..INVISIBLE PLUS -2065 ; Control # Cn <reserved-2065> -2066..206F ; Control # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES -D800..DFFF ; Control # Cs [2048] <surrogate-D800>..<surrogate-DFFF> -FEFF ; Control # Cf ZERO WIDTH NO-BREAK SPACE -FFF0..FFF8 ; Control # Cn [9] <reserved-FFF0>..<reserved-FFF8> -FFF9..FFFB ; Control # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -110BD ; Control # Cf KAITHI NUMBER SIGN -1BCA0..1BCA3 ; Control # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP -1D173..1D17A ; Control # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -E0000 ; Control # Cn <reserved-E0000> -E0001 ; Control # Cf LANGUAGE TAG -E0002..E001F ; Control # Cn [30] <reserved-E0002>..<reserved-E001F> -E0020..E007F ; Control # Cf [96] TAG SPACE..CANCEL TAG -E0080..E00FF ; Control # Cn [128] <reserved-E0080>..<reserved-E00FF> -E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> - -# Total code points: 6030 - -# ================================================ - -0300..036F ; Extend # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X -0483..0487 ; Extend # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE -0488..0489 ; Extend # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -0591..05BD ; Extend # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG -05BF ; Extend # Mn HEBREW POINT RAFE -05C1..05C2 ; Extend # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C4..05C5 ; Extend # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; Extend # Mn HEBREW POINT QAMATS QATAN -0610..061A ; Extend # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA -064B..065F ; Extend # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW -0670 ; Extend # Mn ARABIC LETTER SUPERSCRIPT ALEF -06D6..06DC ; Extend # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DF..06E4 ; Extend # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E7..06E8 ; Extend # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06EA..06ED ; Extend # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -0711 ; Extend # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0730..074A ; Extend # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -07A6..07B0 ; Extend # Mn [11] THAANA ABAFILI..THAANA SUKUN -07EB..07F3 ; Extend # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE -0816..0819 ; Extend # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH -081B..0823 ; Extend # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A -0825..0827 ; Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U -0829..082D ; Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA -0859..085B ; Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK -08E3..0902 ; Extend # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA -093A ; Extend # Mn DEVANAGARI VOWEL SIGN OE -093C ; Extend # Mn DEVANAGARI SIGN NUKTA -0941..0948 ; Extend # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -094D ; Extend # Mn DEVANAGARI SIGN VIRAMA -0951..0957 ; Extend # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE -0962..0963 ; Extend # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0981 ; Extend # Mn BENGALI SIGN CANDRABINDU -09BC ; Extend # Mn BENGALI SIGN NUKTA -09BE ; Extend # Mc BENGALI VOWEL SIGN AA -09C1..09C4 ; Extend # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09CD ; Extend # Mn BENGALI SIGN VIRAMA -09D7 ; Extend # Mc BENGALI AU LENGTH MARK -09E2..09E3 ; Extend # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -0A01..0A02 ; Extend # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A3C ; Extend # Mn GURMUKHI SIGN NUKTA -0A41..0A42 ; Extend # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; Extend # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; Extend # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A51 ; Extend # Mn GURMUKHI SIGN UDAAT -0A70..0A71 ; Extend # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A75 ; Extend # Mn GURMUKHI SIGN YAKASH -0A81..0A82 ; Extend # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0ABC ; Extend # Mn GUJARATI SIGN NUKTA -0AC1..0AC5 ; Extend # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; Extend # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0ACD ; Extend # Mn GUJARATI SIGN VIRAMA -0AE2..0AE3 ; Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0B01 ; Extend # Mn ORIYA SIGN CANDRABINDU -0B3C ; Extend # Mn ORIYA SIGN NUKTA -0B3E ; Extend # Mc ORIYA VOWEL SIGN AA -0B3F ; Extend # Mn ORIYA VOWEL SIGN I -0B41..0B44 ; Extend # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR -0B4D ; Extend # Mn ORIYA SIGN VIRAMA -0B56 ; Extend # Mn ORIYA AI LENGTH MARK -0B57 ; Extend # Mc ORIYA AU LENGTH MARK -0B62..0B63 ; Extend # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -0B82 ; Extend # Mn TAMIL SIGN ANUSVARA -0BBE ; Extend # Mc TAMIL VOWEL SIGN AA -0BC0 ; Extend # Mn TAMIL VOWEL SIGN II -0BCD ; Extend # Mn TAMIL SIGN VIRAMA -0BD7 ; Extend # Mc TAMIL AU LENGTH MARK -0C00 ; Extend # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE -0C3E..0C40 ; Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C46..0C48 ; Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; Extend # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C62..0C63 ; Extend # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL -0C81 ; Extend # Mn KANNADA SIGN CANDRABINDU -0CBC ; Extend # Mn KANNADA SIGN NUKTA -0CBF ; Extend # Mn KANNADA VOWEL SIGN I -0CC2 ; Extend # Mc KANNADA VOWEL SIGN UU -0CC6 ; Extend # Mn KANNADA VOWEL SIGN E -0CCC..0CCD ; Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6 ; Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CE2..0CE3 ; Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0D01 ; Extend # Mn MALAYALAM SIGN CANDRABINDU -0D3E ; Extend # Mc MALAYALAM VOWEL SIGN AA -0D41..0D44 ; Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR -0D4D ; Extend # Mn MALAYALAM SIGN VIRAMA -0D57 ; Extend # Mc MALAYALAM AU LENGTH MARK -0D62..0D63 ; Extend # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -0DCA ; Extend # Mn SINHALA SIGN AL-LAKUNA -0DCF ; Extend # Mc SINHALA VOWEL SIGN AELA-PILLA -0DD2..0DD4 ; Extend # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; Extend # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DDF ; Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA -0E31 ; Extend # Mn THAI CHARACTER MAI HAN-AKAT -0E34..0E3A ; Extend # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E47..0E4E ; Extend # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0EB1 ; Extend # Mn LAO VOWEL SIGN MAI KAN -0EB4..0EB9 ; Extend # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; Extend # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EC8..0ECD ; Extend # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -0F18..0F19 ; Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F35 ; Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F37 ; Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F39 ; Extend # Mn TIBETAN MARK TSA -PHRU -0F71..0F7E ; Extend # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F80..0F84 ; Extend # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F86..0F87 ; Extend # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F8D..0F97 ; Extend # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; Extend # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FC6 ; Extend # Mn TIBETAN SYMBOL PADMA GDAN -102D..1030 ; Extend # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1032..1037 ; Extend # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW -1039..103A ; Extend # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT -103D..103E ; Extend # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA -1058..1059 ; Extend # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -105E..1060 ; Extend # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA -1071..1074 ; Extend # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE -1082 ; Extend # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1085..1086 ; Extend # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y -108D ; Extend # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -109D ; Extend # Mn MYANMAR VOWEL SIGN AITON AI -135D..135F ; Extend # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK -1712..1714 ; Extend # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA -1732..1734 ; Extend # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD -1752..1753 ; Extend # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1772..1773 ; Extend # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -17B4..17B5 ; Extend # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -17B7..17BD ; Extend # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17C6 ; Extend # Mn KHMER SIGN NIKAHIT -17C9..17D3 ; Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17DD ; Extend # Mn KHMER SIGN ATTHACAN -180B..180D ; Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -18A9 ; Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA -1920..1922 ; Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1927..1928 ; Extend # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1932 ; Extend # Mn LIMBU SMALL LETTER ANUSVARA -1939..193B ; Extend # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1A17..1A18 ; Extend # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U -1A1B ; Extend # Mn BUGINESE VOWEL SIGN AE -1A56 ; Extend # Mn TAI THAM CONSONANT SIGN MEDIAL LA -1A58..1A5E ; Extend # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA -1A60 ; Extend # Mn TAI THAM SIGN SAKOT -1A62 ; Extend # Mn TAI THAM VOWEL SIGN MAI SAT -1A65..1A6C ; Extend # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW -1A73..1A7C ; Extend # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN -1A7F ; Extend # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT -1AB0..1ABD ; Extend # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW -1ABE ; Extend # Me COMBINING PARENTHESES OVERLAY -1B00..1B03 ; Extend # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG -1B34 ; Extend # Mn BALINESE SIGN REREKAN -1B36..1B3A ; Extend # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA -1B3C ; Extend # Mn BALINESE VOWEL SIGN LA LENGA -1B42 ; Extend # Mn BALINESE VOWEL SIGN PEPET -1B6B..1B73 ; Extend # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG -1B80..1B81 ; Extend # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR -1BA2..1BA5 ; Extend # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU -1BA8..1BA9 ; Extend # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG -1BAB..1BAD ; Extend # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA -1BE6 ; Extend # Mn BATAK SIGN TOMPI -1BE8..1BE9 ; Extend # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE -1BED ; Extend # Mn BATAK VOWEL SIGN KARO O -1BEF..1BF1 ; Extend # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H -1C2C..1C33 ; Extend # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T -1C36..1C37 ; Extend # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA -1CD0..1CD2 ; Extend # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA -1CD4..1CE0 ; Extend # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA -1CE2..1CE8 ; Extend # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL -1CED ; Extend # Mn VEDIC SIGN TIRYAK -1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE -1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1DC0..1DF5 ; Extend # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE -1DFC..1DFF ; Extend # Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -200C..200D ; Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER -20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20DD..20E0 ; Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E1 ; Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E2..20E4 ; Extend # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -20E5..20F0 ; Extend # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE -2CEF..2CF1 ; Extend # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS -2D7F ; Extend # Mn TIFINAGH CONSONANT JOINER -2DE0..2DFF ; Extend # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -302A..302D ; Extend # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK -302E..302F ; Extend # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK -3099..309A ; Extend # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -A66F ; Extend # Mn COMBINING CYRILLIC VZMET -A670..A672 ; Extend # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN -A674..A67D ; Extend # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK -A69E..A69F ; Extend # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E -A6F0..A6F1 ; Extend # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS -A802 ; Extend # Mn SYLOTI NAGRI SIGN DVISVARA -A806 ; Extend # Mn SYLOTI NAGRI SIGN HASANTA -A80B ; Extend # Mn SYLOTI NAGRI SIGN ANUSVARA -A825..A826 ; Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A8C4 ; Extend # Mn SAURASHTRA SIGN VIRAMA -A8E0..A8F1 ; Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA -A926..A92D ; Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU -A947..A951 ; Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R -A980..A982 ; Extend # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR -A9B3 ; Extend # Mn JAVANESE SIGN CECAK TELU -A9B6..A9B9 ; Extend # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT -A9BC ; Extend # Mn JAVANESE VOWEL SIGN PEPET -A9E5 ; Extend # Mn MYANMAR SIGN SHAN SAW -AA29..AA2E ; Extend # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE -AA31..AA32 ; Extend # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE -AA35..AA36 ; Extend # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA -AA43 ; Extend # Mn CHAM CONSONANT SIGN FINAL NG -AA4C ; Extend # Mn CHAM CONSONANT SIGN FINAL M -AA7C ; Extend # Mn MYANMAR SIGN TAI LAING TONE-2 -AAB0 ; Extend # Mn TAI VIET MAI KANG -AAB2..AAB4 ; Extend # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U -AAB7..AAB8 ; Extend # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA -AABE..AABF ; Extend # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK -AAC1 ; Extend # Mn TAI VIET TONE MAI THO -AAEC..AAED ; Extend # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI -AAF6 ; Extend # Mn MEETEI MAYEK VIRAMA -ABE5 ; Extend # Mn MEETEI MAYEK VOWEL SIGN ANAP -ABE8 ; Extend # Mn MEETEI MAYEK VOWEL SIGN UNAP -ABED ; Extend # Mn MEETEI MAYEK APUN IYEK -FB1E ; Extend # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FE00..FE0F ; Extend # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE2F ; Extend # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF -FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -101FD ; Extend # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -102E0 ; Extend # Mn COPTIC EPACT THOUSANDS MARK -10376..1037A ; Extend # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII -10A01..10A03 ; Extend # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R -10A05..10A06 ; Extend # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -10A0C..10A0F ; Extend # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA -10A38..10A3A ; Extend # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW -10A3F ; Extend # Mn KHAROSHTHI VIRAMA -10AE5..10AE6 ; Extend # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW -11001 ; Extend # Mn BRAHMI SIGN ANUSVARA -11038..11046 ; Extend # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA -1107F..11081 ; Extend # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA -110B3..110B6 ; Extend # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI -110B9..110BA ; Extend # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA -11100..11102 ; Extend # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA -11127..1112B ; Extend # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU -1112D..11134 ; Extend # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA -11173 ; Extend # Mn MAHAJANI SIGN NUKTA -11180..11181 ; Extend # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA -111B6..111BE ; Extend # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O -111CA..111CC ; Extend # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK -1122F..11231 ; Extend # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI -11234 ; Extend # Mn KHOJKI SIGN ANUSVARA -11236..11237 ; Extend # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA -112DF ; Extend # Mn KHUDAWADI SIGN ANUSVARA -112E3..112EA ; Extend # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA -11300..11301 ; Extend # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU -1133C ; Extend # Mn GRANTHA SIGN NUKTA -1133E ; Extend # Mc GRANTHA VOWEL SIGN AA -11340 ; Extend # Mn GRANTHA VOWEL SIGN II -11357 ; Extend # Mc GRANTHA AU LENGTH MARK -11366..1136C ; Extend # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX -11370..11374 ; Extend # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA -114B0 ; Extend # Mc TIRHUTA VOWEL SIGN AA -114B3..114B8 ; Extend # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL -114BA ; Extend # Mn TIRHUTA VOWEL SIGN SHORT E -114BD ; Extend # Mc TIRHUTA VOWEL SIGN SHORT O -114BF..114C0 ; Extend # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA -114C2..114C3 ; Extend # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA -115AF ; Extend # Mc SIDDHAM VOWEL SIGN AA -115B2..115B5 ; Extend # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR -115BC..115BD ; Extend # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA -115BF..115C0 ; Extend # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA -115DC..115DD ; Extend # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU -11633..1163A ; Extend # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI -1163D ; Extend # Mn MODI SIGN ANUSVARA -1163F..11640 ; Extend # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA -116AB ; Extend # Mn TAKRI SIGN ANUSVARA -116AD ; Extend # Mn TAKRI VOWEL SIGN AA -116B0..116B5 ; Extend # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU -116B7 ; Extend # Mn TAKRI SIGN NUKTA -1171D..1171F ; Extend # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA -11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU -11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER -16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE -16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM -16F8F..16F92 ; Extend # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW -1BC9D..1BC9E ; Extend # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK -1D165 ; Extend # Mc MUSICAL SYMBOL COMBINING STEM -1D167..1D169 ; Extend # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D16E..1D172 ; Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 -1D17B..1D182 ; Extend # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; Extend # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; Extend # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D242..1D244 ; Extend # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME -1DA00..1DA36 ; Extend # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN -1DA3B..1DA6C ; Extend # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT -1DA75 ; Extend # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS -1DA84 ; Extend # Mn SIGNWRITING LOCATION HEAD NECK -1DA9B..1DA9F ; Extend # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 -1DAA1..1DAAF ; Extend # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 -1E8D0..1E8D6 ; Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS -E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 - -# Total code points: 1610 - -# ================================================ - -1F1E6..1F1FF ; Regional_Indicator # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z - -# Total code points: 26 - -# ================================================ - -0903 ; SpacingMark # Mc DEVANAGARI SIGN VISARGA -093B ; SpacingMark # Mc DEVANAGARI VOWEL SIGN OOE -093E..0940 ; SpacingMark # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0949..094C ; SpacingMark # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -094E..094F ; SpacingMark # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW -0982..0983 ; SpacingMark # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -09BF..09C0 ; SpacingMark # Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II -09C7..09C8 ; SpacingMark # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; SpacingMark # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -0A03 ; SpacingMark # Mc GURMUKHI SIGN VISARGA -0A3E..0A40 ; SpacingMark # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A83 ; SpacingMark # Mc GUJARATI SIGN VISARGA -0ABE..0AC0 ; SpacingMark # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC9 ; SpacingMark # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; SpacingMark # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0B02..0B03 ; SpacingMark # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B40 ; SpacingMark # Mc ORIYA VOWEL SIGN II -0B47..0B48 ; SpacingMark # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; SpacingMark # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0BBF ; SpacingMark # Mc TAMIL VOWEL SIGN I -0BC1..0BC2 ; SpacingMark # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; SpacingMark # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; SpacingMark # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0C01..0C03 ; SpacingMark # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C41..0C44 ; SpacingMark # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C82..0C83 ; SpacingMark # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0CBE ; SpacingMark # Mc KANNADA VOWEL SIGN AA -0CC0..0CC1 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U -0CC3..0CC4 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR -0CC7..0CC8 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; SpacingMark # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0D02..0D03 ; SpacingMark # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D3F..0D40 ; SpacingMark # Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II -0D46..0D48 ; SpacingMark # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; SpacingMark # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D82..0D83 ; SpacingMark # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0DD0..0DD1 ; SpacingMark # Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD8..0DDE ; SpacingMark # Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -0DF2..0DF3 ; SpacingMark # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0E33 ; SpacingMark # Lo THAI CHARACTER SARA AM -0EB3 ; SpacingMark # Lo LAO VOWEL SIGN AM -0F3E..0F3F ; SpacingMark # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F7F ; SpacingMark # Mc TIBETAN SIGN RNAM BCAD -1031 ; SpacingMark # Mc MYANMAR VOWEL SIGN E -103B..103C ; SpacingMark # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA -1056..1057 ; SpacingMark # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1084 ; SpacingMark # Mc MYANMAR VOWEL SIGN SHAN E -17B6 ; SpacingMark # Mc KHMER VOWEL SIGN AA -17BE..17C5 ; SpacingMark # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C7..17C8 ; SpacingMark # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -1923..1926 ; SpacingMark # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1929..192B ; SpacingMark # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; SpacingMark # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1933..1938 ; SpacingMark # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1A19..1A1A ; SpacingMark # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O -1A55 ; SpacingMark # Mc TAI THAM CONSONANT SIGN MEDIAL RA -1A57 ; SpacingMark # Mc TAI THAM CONSONANT SIGN LA TANG LAI -1A6D..1A72 ; SpacingMark # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI -1B04 ; SpacingMark # Mc BALINESE SIGN BISAH -1B35 ; SpacingMark # Mc BALINESE VOWEL SIGN TEDUNG -1B3B ; SpacingMark # Mc BALINESE VOWEL SIGN RA REPA TEDUNG -1B3D..1B41 ; SpacingMark # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG -1B43..1B44 ; SpacingMark # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG -1B82 ; SpacingMark # Mc SUNDANESE SIGN PANGWISAD -1BA1 ; SpacingMark # Mc SUNDANESE CONSONANT SIGN PAMINGKAL -1BA6..1BA7 ; SpacingMark # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG -1BAA ; SpacingMark # Mc SUNDANESE SIGN PAMAAEH -1BE7 ; SpacingMark # Mc BATAK VOWEL SIGN E -1BEA..1BEC ; SpacingMark # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O -1BEE ; SpacingMark # Mc BATAK VOWEL SIGN U -1BF2..1BF3 ; SpacingMark # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN -1C24..1C2B ; SpacingMark # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU -1C34..1C35 ; SpacingMark # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG -1CE1 ; SpacingMark # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA -1CF2..1CF3 ; SpacingMark # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA -A823..A824 ; SpacingMark # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I -A827 ; SpacingMark # Mc SYLOTI NAGRI VOWEL SIGN OO -A880..A881 ; SpacingMark # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA -A8B4..A8C3 ; SpacingMark # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A952..A953 ; SpacingMark # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA -A983 ; SpacingMark # Mc JAVANESE SIGN WIGNYAN -A9B4..A9B5 ; SpacingMark # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG -A9BA..A9BB ; SpacingMark # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE -A9BD..A9C0 ; SpacingMark # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON -AA2F..AA30 ; SpacingMark # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI -AA33..AA34 ; SpacingMark # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA -AA4D ; SpacingMark # Mc CHAM CONSONANT SIGN FINAL H -AAEB ; SpacingMark # Mc MEETEI MAYEK VOWEL SIGN II -AAEE..AAEF ; SpacingMark # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU -AAF5 ; SpacingMark # Mc MEETEI MAYEK VOWEL SIGN VISARGA -ABE3..ABE4 ; SpacingMark # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP -ABE6..ABE7 ; SpacingMark # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP -ABE9..ABEA ; SpacingMark # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG -ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK -11000 ; SpacingMark # Mc BRAHMI SIGN CANDRABINDU -11002 ; SpacingMark # Mc BRAHMI SIGN VISARGA -11082 ; SpacingMark # Mc KAITHI SIGN VISARGA -110B0..110B2 ; SpacingMark # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II -110B7..110B8 ; SpacingMark # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU -1112C ; SpacingMark # Mc CHAKMA VOWEL SIGN E -11182 ; SpacingMark # Mc SHARADA SIGN VISARGA -111B3..111B5 ; SpacingMark # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II -111BF..111C0 ; SpacingMark # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA -1122C..1122E ; SpacingMark # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II -11232..11233 ; SpacingMark # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU -11235 ; SpacingMark # Mc KHOJKI SIGN VIRAMA -112E0..112E2 ; SpacingMark # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II -11302..11303 ; SpacingMark # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA -1133F ; SpacingMark # Mc GRANTHA VOWEL SIGN I -11341..11344 ; SpacingMark # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR -11347..11348 ; SpacingMark # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI -1134B..1134D ; SpacingMark # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA -11362..11363 ; SpacingMark # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL -114B1..114B2 ; SpacingMark # Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II -114B9 ; SpacingMark # Mc TIRHUTA VOWEL SIGN E -114BB..114BC ; SpacingMark # Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O -114BE ; SpacingMark # Mc TIRHUTA VOWEL SIGN AU -114C1 ; SpacingMark # Mc TIRHUTA SIGN VISARGA -115B0..115B1 ; SpacingMark # Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II -115B8..115BB ; SpacingMark # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU -115BE ; SpacingMark # Mc SIDDHAM SIGN VISARGA -11630..11632 ; SpacingMark # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II -1163B..1163C ; SpacingMark # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU -1163E ; SpacingMark # Mc MODI SIGN VISARGA -116AC ; SpacingMark # Mc TAKRI SIGN VISARGA -116AE..116AF ; SpacingMark # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II -116B6 ; SpacingMark # Mc TAKRI SIGN VIRAMA -11720..11721 ; SpacingMark # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA -11726 ; SpacingMark # Mc AHOM VOWEL SIGN E -16F51..16F7E ; SpacingMark # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG -1D166 ; SpacingMark # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D16D ; SpacingMark # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT - -# Total code points: 330 - -# ================================================ - -1100..115F ; L # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER -A960..A97C ; L # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH - -# Total code points: 125 - -# ================================================ - -1160..11A7 ; V # Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE -D7B0..D7C6 ; V # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E - -# Total code points: 95 - -# ================================================ - -11A8..11FF ; T # Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN -D7CB..D7FB ; T # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH - -# Total code points: 137 - -# ================================================ - -AC00 ; LV # Lo HANGUL SYLLABLE GA -AC1C ; LV # Lo HANGUL SYLLABLE GAE -AC38 ; LV # Lo HANGUL SYLLABLE GYA -AC54 ; LV # Lo HANGUL SYLLABLE GYAE -AC70 ; LV # Lo HANGUL SYLLABLE GEO -AC8C ; LV # Lo HANGUL SYLLABLE GE -ACA8 ; LV # Lo HANGUL SYLLABLE GYEO -ACC4 ; LV # Lo HANGUL SYLLABLE GYE -ACE0 ; LV # Lo HANGUL SYLLABLE GO -ACFC ; LV # Lo HANGUL SYLLABLE GWA -AD18 ; LV # Lo HANGUL SYLLABLE GWAE -AD34 ; LV # Lo HANGUL SYLLABLE GOE -AD50 ; LV # Lo HANGUL SYLLABLE GYO -AD6C ; LV # Lo HANGUL SYLLABLE GU -AD88 ; LV # Lo HANGUL SYLLABLE GWEO -ADA4 ; LV # Lo HANGUL SYLLABLE GWE -ADC0 ; LV # Lo HANGUL SYLLABLE GWI -ADDC ; LV # Lo HANGUL SYLLABLE GYU -ADF8 ; LV # Lo HANGUL SYLLABLE GEU -AE14 ; LV # Lo HANGUL SYLLABLE GYI -AE30 ; LV # Lo HANGUL SYLLABLE GI -AE4C ; LV # Lo HANGUL SYLLABLE GGA -AE68 ; LV # Lo HANGUL SYLLABLE GGAE -AE84 ; LV # Lo HANGUL SYLLABLE GGYA -AEA0 ; LV # Lo HANGUL SYLLABLE GGYAE -AEBC ; LV # Lo HANGUL SYLLABLE GGEO -AED8 ; LV # Lo HANGUL SYLLABLE GGE -AEF4 ; LV # Lo HANGUL SYLLABLE GGYEO -AF10 ; LV # Lo HANGUL SYLLABLE GGYE -AF2C ; LV # Lo HANGUL SYLLABLE GGO -AF48 ; LV # Lo HANGUL SYLLABLE GGWA -AF64 ; LV # Lo HANGUL SYLLABLE GGWAE -AF80 ; LV # Lo HANGUL SYLLABLE GGOE -AF9C ; LV # Lo HANGUL SYLLABLE GGYO -AFB8 ; LV # Lo HANGUL SYLLABLE GGU -AFD4 ; LV # Lo HANGUL SYLLABLE GGWEO -AFF0 ; LV # Lo HANGUL SYLLABLE GGWE -B00C ; LV # Lo HANGUL SYLLABLE GGWI -B028 ; LV # Lo HANGUL SYLLABLE GGYU -B044 ; LV # Lo HANGUL SYLLABLE GGEU -B060 ; LV # Lo HANGUL SYLLABLE GGYI -B07C ; LV # Lo HANGUL SYLLABLE GGI -B098 ; LV # Lo HANGUL SYLLABLE NA -B0B4 ; LV # Lo HANGUL SYLLABLE NAE -B0D0 ; LV # Lo HANGUL SYLLABLE NYA -B0EC ; LV # Lo HANGUL SYLLABLE NYAE -B108 ; LV # Lo HANGUL SYLLABLE NEO -B124 ; LV # Lo HANGUL SYLLABLE NE -B140 ; LV # Lo HANGUL SYLLABLE NYEO -B15C ; LV # Lo HANGUL SYLLABLE NYE -B178 ; LV # Lo HANGUL SYLLABLE NO -B194 ; LV # Lo HANGUL SYLLABLE NWA -B1B0 ; LV # Lo HANGUL SYLLABLE NWAE -B1CC ; LV # Lo HANGUL SYLLABLE NOE -B1E8 ; LV # Lo HANGUL SYLLABLE NYO -B204 ; LV # Lo HANGUL SYLLABLE NU -B220 ; LV # Lo HANGUL SYLLABLE NWEO -B23C ; LV # Lo HANGUL SYLLABLE NWE -B258 ; LV # Lo HANGUL SYLLABLE NWI -B274 ; LV # Lo HANGUL SYLLABLE NYU -B290 ; LV # Lo HANGUL SYLLABLE NEU -B2AC ; LV # Lo HANGUL SYLLABLE NYI -B2C8 ; LV # Lo HANGUL SYLLABLE NI -B2E4 ; LV # Lo HANGUL SYLLABLE DA -B300 ; LV # Lo HANGUL SYLLABLE DAE -B31C ; LV # Lo HANGUL SYLLABLE DYA -B338 ; LV # Lo HANGUL SYLLABLE DYAE -B354 ; LV # Lo HANGUL SYLLABLE DEO -B370 ; LV # Lo HANGUL SYLLABLE DE -B38C ; LV # Lo HANGUL SYLLABLE DYEO -B3A8 ; LV # Lo HANGUL SYLLABLE DYE -B3C4 ; LV # Lo HANGUL SYLLABLE DO -B3E0 ; LV # Lo HANGUL SYLLABLE DWA -B3FC ; LV # Lo HANGUL SYLLABLE DWAE -B418 ; LV # Lo HANGUL SYLLABLE DOE -B434 ; LV # Lo HANGUL SYLLABLE DYO -B450 ; LV # Lo HANGUL SYLLABLE DU -B46C ; LV # Lo HANGUL SYLLABLE DWEO -B488 ; LV # Lo HANGUL SYLLABLE DWE -B4A4 ; LV # Lo HANGUL SYLLABLE DWI -B4C0 ; LV # Lo HANGUL SYLLABLE DYU -B4DC ; LV # Lo HANGUL SYLLABLE DEU -B4F8 ; LV # Lo HANGUL SYLLABLE DYI -B514 ; LV # Lo HANGUL SYLLABLE DI -B530 ; LV # Lo HANGUL SYLLABLE DDA -B54C ; LV # Lo HANGUL SYLLABLE DDAE -B568 ; LV # Lo HANGUL SYLLABLE DDYA -B584 ; LV # Lo HANGUL SYLLABLE DDYAE -B5A0 ; LV # Lo HANGUL SYLLABLE DDEO -B5BC ; LV # Lo HANGUL SYLLABLE DDE -B5D8 ; LV # Lo HANGUL SYLLABLE DDYEO -B5F4 ; LV # Lo HANGUL SYLLABLE DDYE -B610 ; LV # Lo HANGUL SYLLABLE DDO -B62C ; LV # Lo HANGUL SYLLABLE DDWA -B648 ; LV # Lo HANGUL SYLLABLE DDWAE -B664 ; LV # Lo HANGUL SYLLABLE DDOE -B680 ; LV # Lo HANGUL SYLLABLE DDYO -B69C ; LV # Lo HANGUL SYLLABLE DDU -B6B8 ; LV # Lo HANGUL SYLLABLE DDWEO -B6D4 ; LV # Lo HANGUL SYLLABLE DDWE -B6F0 ; LV # Lo HANGUL SYLLABLE DDWI -B70C ; LV # Lo HANGUL SYLLABLE DDYU -B728 ; LV # Lo HANGUL SYLLABLE DDEU -B744 ; LV # Lo HANGUL SYLLABLE DDYI -B760 ; LV # Lo HANGUL SYLLABLE DDI -B77C ; LV # Lo HANGUL SYLLABLE RA -B798 ; LV # Lo HANGUL SYLLABLE RAE -B7B4 ; LV # Lo HANGUL SYLLABLE RYA -B7D0 ; LV # Lo HANGUL SYLLABLE RYAE -B7EC ; LV # Lo HANGUL SYLLABLE REO -B808 ; LV # Lo HANGUL SYLLABLE RE -B824 ; LV # Lo HANGUL SYLLABLE RYEO -B840 ; LV # Lo HANGUL SYLLABLE RYE -B85C ; LV # Lo HANGUL SYLLABLE RO -B878 ; LV # Lo HANGUL SYLLABLE RWA -B894 ; LV # Lo HANGUL SYLLABLE RWAE -B8B0 ; LV # Lo HANGUL SYLLABLE ROE -B8CC ; LV # Lo HANGUL SYLLABLE RYO -B8E8 ; LV # Lo HANGUL SYLLABLE RU -B904 ; LV # Lo HANGUL SYLLABLE RWEO -B920 ; LV # Lo HANGUL SYLLABLE RWE -B93C ; LV # Lo HANGUL SYLLABLE RWI -B958 ; LV # Lo HANGUL SYLLABLE RYU -B974 ; LV # Lo HANGUL SYLLABLE REU -B990 ; LV # Lo HANGUL SYLLABLE RYI -B9AC ; LV # Lo HANGUL SYLLABLE RI -B9C8 ; LV # Lo HANGUL SYLLABLE MA -B9E4 ; LV # Lo HANGUL SYLLABLE MAE -BA00 ; LV # Lo HANGUL SYLLABLE MYA -BA1C ; LV # Lo HANGUL SYLLABLE MYAE -BA38 ; LV # Lo HANGUL SYLLABLE MEO -BA54 ; LV # Lo HANGUL SYLLABLE ME -BA70 ; LV # Lo HANGUL SYLLABLE MYEO -BA8C ; LV # Lo HANGUL SYLLABLE MYE -BAA8 ; LV # Lo HANGUL SYLLABLE MO -BAC4 ; LV # Lo HANGUL SYLLABLE MWA -BAE0 ; LV # Lo HANGUL SYLLABLE MWAE -BAFC ; LV # Lo HANGUL SYLLABLE MOE -BB18 ; LV # Lo HANGUL SYLLABLE MYO -BB34 ; LV # Lo HANGUL SYLLABLE MU -BB50 ; LV # Lo HANGUL SYLLABLE MWEO -BB6C ; LV # Lo HANGUL SYLLABLE MWE -BB88 ; LV # Lo HANGUL SYLLABLE MWI -BBA4 ; LV # Lo HANGUL SYLLABLE MYU -BBC0 ; LV # Lo HANGUL SYLLABLE MEU -BBDC ; LV # Lo HANGUL SYLLABLE MYI -BBF8 ; LV # Lo HANGUL SYLLABLE MI -BC14 ; LV # Lo HANGUL SYLLABLE BA -BC30 ; LV # Lo HANGUL SYLLABLE BAE -BC4C ; LV # Lo HANGUL SYLLABLE BYA -BC68 ; LV # Lo HANGUL SYLLABLE BYAE -BC84 ; LV # Lo HANGUL SYLLABLE BEO -BCA0 ; LV # Lo HANGUL SYLLABLE BE -BCBC ; LV # Lo HANGUL SYLLABLE BYEO -BCD8 ; LV # Lo HANGUL SYLLABLE BYE -BCF4 ; LV # Lo HANGUL SYLLABLE BO -BD10 ; LV # Lo HANGUL SYLLABLE BWA -BD2C ; LV # Lo HANGUL SYLLABLE BWAE -BD48 ; LV # Lo HANGUL SYLLABLE BOE -BD64 ; LV # Lo HANGUL SYLLABLE BYO -BD80 ; LV # Lo HANGUL SYLLABLE BU -BD9C ; LV # Lo HANGUL SYLLABLE BWEO -BDB8 ; LV # Lo HANGUL SYLLABLE BWE -BDD4 ; LV # Lo HANGUL SYLLABLE BWI -BDF0 ; LV # Lo HANGUL SYLLABLE BYU -BE0C ; LV # Lo HANGUL SYLLABLE BEU -BE28 ; LV # Lo HANGUL SYLLABLE BYI -BE44 ; LV # Lo HANGUL SYLLABLE BI -BE60 ; LV # Lo HANGUL SYLLABLE BBA -BE7C ; LV # Lo HANGUL SYLLABLE BBAE -BE98 ; LV # Lo HANGUL SYLLABLE BBYA -BEB4 ; LV # Lo HANGUL SYLLABLE BBYAE -BED0 ; LV # Lo HANGUL SYLLABLE BBEO -BEEC ; LV # Lo HANGUL SYLLABLE BBE -BF08 ; LV # Lo HANGUL SYLLABLE BBYEO -BF24 ; LV # Lo HANGUL SYLLABLE BBYE -BF40 ; LV # Lo HANGUL SYLLABLE BBO -BF5C ; LV # Lo HANGUL SYLLABLE BBWA -BF78 ; LV # Lo HANGUL SYLLABLE BBWAE -BF94 ; LV # Lo HANGUL SYLLABLE BBOE -BFB0 ; LV # Lo HANGUL SYLLABLE BBYO -BFCC ; LV # Lo HANGUL SYLLABLE BBU -BFE8 ; LV # Lo HANGUL SYLLABLE BBWEO -C004 ; LV # Lo HANGUL SYLLABLE BBWE -C020 ; LV # Lo HANGUL SYLLABLE BBWI -C03C ; LV # Lo HANGUL SYLLABLE BBYU -C058 ; LV # Lo HANGUL SYLLABLE BBEU -C074 ; LV # Lo HANGUL SYLLABLE BBYI -C090 ; LV # Lo HANGUL SYLLABLE BBI -C0AC ; LV # Lo HANGUL SYLLABLE SA -C0C8 ; LV # Lo HANGUL SYLLABLE SAE -C0E4 ; LV # Lo HANGUL SYLLABLE SYA -C100 ; LV # Lo HANGUL SYLLABLE SYAE -C11C ; LV # Lo HANGUL SYLLABLE SEO -C138 ; LV # Lo HANGUL SYLLABLE SE -C154 ; LV # Lo HANGUL SYLLABLE SYEO -C170 ; LV # Lo HANGUL SYLLABLE SYE -C18C ; LV # Lo HANGUL SYLLABLE SO -C1A8 ; LV # Lo HANGUL SYLLABLE SWA -C1C4 ; LV # Lo HANGUL SYLLABLE SWAE -C1E0 ; LV # Lo HANGUL SYLLABLE SOE -C1FC ; LV # Lo HANGUL SYLLABLE SYO -C218 ; LV # Lo HANGUL SYLLABLE SU -C234 ; LV # Lo HANGUL SYLLABLE SWEO -C250 ; LV # Lo HANGUL SYLLABLE SWE -C26C ; LV # Lo HANGUL SYLLABLE SWI -C288 ; LV # Lo HANGUL SYLLABLE SYU -C2A4 ; LV # Lo HANGUL SYLLABLE SEU -C2C0 ; LV # Lo HANGUL SYLLABLE SYI -C2DC ; LV # Lo HANGUL SYLLABLE SI -C2F8 ; LV # Lo HANGUL SYLLABLE SSA -C314 ; LV # Lo HANGUL SYLLABLE SSAE -C330 ; LV # Lo HANGUL SYLLABLE SSYA -C34C ; LV # Lo HANGUL SYLLABLE SSYAE -C368 ; LV # Lo HANGUL SYLLABLE SSEO -C384 ; LV # Lo HANGUL SYLLABLE SSE -C3A0 ; LV # Lo HANGUL SYLLABLE SSYEO -C3BC ; LV # Lo HANGUL SYLLABLE SSYE -C3D8 ; LV # Lo HANGUL SYLLABLE SSO -C3F4 ; LV # Lo HANGUL SYLLABLE SSWA -C410 ; LV # Lo HANGUL SYLLABLE SSWAE -C42C ; LV # Lo HANGUL SYLLABLE SSOE -C448 ; LV # Lo HANGUL SYLLABLE SSYO -C464 ; LV # Lo HANGUL SYLLABLE SSU -C480 ; LV # Lo HANGUL SYLLABLE SSWEO -C49C ; LV # Lo HANGUL SYLLABLE SSWE -C4B8 ; LV # Lo HANGUL SYLLABLE SSWI -C4D4 ; LV # Lo HANGUL SYLLABLE SSYU -C4F0 ; LV # Lo HANGUL SYLLABLE SSEU -C50C ; LV # Lo HANGUL SYLLABLE SSYI -C528 ; LV # Lo HANGUL SYLLABLE SSI -C544 ; LV # Lo HANGUL SYLLABLE A -C560 ; LV # Lo HANGUL SYLLABLE AE -C57C ; LV # Lo HANGUL SYLLABLE YA -C598 ; LV # Lo HANGUL SYLLABLE YAE -C5B4 ; LV # Lo HANGUL SYLLABLE EO -C5D0 ; LV # Lo HANGUL SYLLABLE E -C5EC ; LV # Lo HANGUL SYLLABLE YEO -C608 ; LV # Lo HANGUL SYLLABLE YE -C624 ; LV # Lo HANGUL SYLLABLE O -C640 ; LV # Lo HANGUL SYLLABLE WA -C65C ; LV # Lo HANGUL SYLLABLE WAE -C678 ; LV # Lo HANGUL SYLLABLE OE -C694 ; LV # Lo HANGUL SYLLABLE YO -C6B0 ; LV # Lo HANGUL SYLLABLE U -C6CC ; LV # Lo HANGUL SYLLABLE WEO -C6E8 ; LV # Lo HANGUL SYLLABLE WE -C704 ; LV # Lo HANGUL SYLLABLE WI -C720 ; LV # Lo HANGUL SYLLABLE YU -C73C ; LV # Lo HANGUL SYLLABLE EU -C758 ; LV # Lo HANGUL SYLLABLE YI -C774 ; LV # Lo HANGUL SYLLABLE I -C790 ; LV # Lo HANGUL SYLLABLE JA -C7AC ; LV # Lo HANGUL SYLLABLE JAE -C7C8 ; LV # Lo HANGUL SYLLABLE JYA -C7E4 ; LV # Lo HANGUL SYLLABLE JYAE -C800 ; LV # Lo HANGUL SYLLABLE JEO -C81C ; LV # Lo HANGUL SYLLABLE JE -C838 ; LV # Lo HANGUL SYLLABLE JYEO -C854 ; LV # Lo HANGUL SYLLABLE JYE -C870 ; LV # Lo HANGUL SYLLABLE JO -C88C ; LV # Lo HANGUL SYLLABLE JWA -C8A8 ; LV # Lo HANGUL SYLLABLE JWAE -C8C4 ; LV # Lo HANGUL SYLLABLE JOE -C8E0 ; LV # Lo HANGUL SYLLABLE JYO -C8FC ; LV # Lo HANGUL SYLLABLE JU -C918 ; LV # Lo HANGUL SYLLABLE JWEO -C934 ; LV # Lo HANGUL SYLLABLE JWE -C950 ; LV # Lo HANGUL SYLLABLE JWI -C96C ; LV # Lo HANGUL SYLLABLE JYU -C988 ; LV # Lo HANGUL SYLLABLE JEU -C9A4 ; LV # Lo HANGUL SYLLABLE JYI -C9C0 ; LV # Lo HANGUL SYLLABLE JI -C9DC ; LV # Lo HANGUL SYLLABLE JJA -C9F8 ; LV # Lo HANGUL SYLLABLE JJAE -CA14 ; LV # Lo HANGUL SYLLABLE JJYA -CA30 ; LV # Lo HANGUL SYLLABLE JJYAE -CA4C ; LV # Lo HANGUL SYLLABLE JJEO -CA68 ; LV # Lo HANGUL SYLLABLE JJE -CA84 ; LV # Lo HANGUL SYLLABLE JJYEO -CAA0 ; LV # Lo HANGUL SYLLABLE JJYE -CABC ; LV # Lo HANGUL SYLLABLE JJO -CAD8 ; LV # Lo HANGUL SYLLABLE JJWA -CAF4 ; LV # Lo HANGUL SYLLABLE JJWAE -CB10 ; LV # Lo HANGUL SYLLABLE JJOE -CB2C ; LV # Lo HANGUL SYLLABLE JJYO -CB48 ; LV # Lo HANGUL SYLLABLE JJU -CB64 ; LV # Lo HANGUL SYLLABLE JJWEO -CB80 ; LV # Lo HANGUL SYLLABLE JJWE -CB9C ; LV # Lo HANGUL SYLLABLE JJWI -CBB8 ; LV # Lo HANGUL SYLLABLE JJYU -CBD4 ; LV # Lo HANGUL SYLLABLE JJEU -CBF0 ; LV # Lo HANGUL SYLLABLE JJYI -CC0C ; LV # Lo HANGUL SYLLABLE JJI -CC28 ; LV # Lo HANGUL SYLLABLE CA -CC44 ; LV # Lo HANGUL SYLLABLE CAE -CC60 ; LV # Lo HANGUL SYLLABLE CYA -CC7C ; LV # Lo HANGUL SYLLABLE CYAE -CC98 ; LV # Lo HANGUL SYLLABLE CEO -CCB4 ; LV # Lo HANGUL SYLLABLE CE -CCD0 ; LV # Lo HANGUL SYLLABLE CYEO -CCEC ; LV # Lo HANGUL SYLLABLE CYE -CD08 ; LV # Lo HANGUL SYLLABLE CO -CD24 ; LV # Lo HANGUL SYLLABLE CWA -CD40 ; LV # Lo HANGUL SYLLABLE CWAE -CD5C ; LV # Lo HANGUL SYLLABLE COE -CD78 ; LV # Lo HANGUL SYLLABLE CYO -CD94 ; LV # Lo HANGUL SYLLABLE CU -CDB0 ; LV # Lo HANGUL SYLLABLE CWEO -CDCC ; LV # Lo HANGUL SYLLABLE CWE -CDE8 ; LV # Lo HANGUL SYLLABLE CWI -CE04 ; LV # Lo HANGUL SYLLABLE CYU -CE20 ; LV # Lo HANGUL SYLLABLE CEU -CE3C ; LV # Lo HANGUL SYLLABLE CYI -CE58 ; LV # Lo HANGUL SYLLABLE CI -CE74 ; LV # Lo HANGUL SYLLABLE KA -CE90 ; LV # Lo HANGUL SYLLABLE KAE -CEAC ; LV # Lo HANGUL SYLLABLE KYA -CEC8 ; LV # Lo HANGUL SYLLABLE KYAE -CEE4 ; LV # Lo HANGUL SYLLABLE KEO -CF00 ; LV # Lo HANGUL SYLLABLE KE -CF1C ; LV # Lo HANGUL SYLLABLE KYEO -CF38 ; LV # Lo HANGUL SYLLABLE KYE -CF54 ; LV # Lo HANGUL SYLLABLE KO -CF70 ; LV # Lo HANGUL SYLLABLE KWA -CF8C ; LV # Lo HANGUL SYLLABLE KWAE -CFA8 ; LV # Lo HANGUL SYLLABLE KOE -CFC4 ; LV # Lo HANGUL SYLLABLE KYO -CFE0 ; LV # Lo HANGUL SYLLABLE KU -CFFC ; LV # Lo HANGUL SYLLABLE KWEO -D018 ; LV # Lo HANGUL SYLLABLE KWE -D034 ; LV # Lo HANGUL SYLLABLE KWI -D050 ; LV # Lo HANGUL SYLLABLE KYU -D06C ; LV # Lo HANGUL SYLLABLE KEU -D088 ; LV # Lo HANGUL SYLLABLE KYI -D0A4 ; LV # Lo HANGUL SYLLABLE KI -D0C0 ; LV # Lo HANGUL SYLLABLE TA -D0DC ; LV # Lo HANGUL SYLLABLE TAE -D0F8 ; LV # Lo HANGUL SYLLABLE TYA -D114 ; LV # Lo HANGUL SYLLABLE TYAE -D130 ; LV # Lo HANGUL SYLLABLE TEO -D14C ; LV # Lo HANGUL SYLLABLE TE -D168 ; LV # Lo HANGUL SYLLABLE TYEO -D184 ; LV # Lo HANGUL SYLLABLE TYE -D1A0 ; LV # Lo HANGUL SYLLABLE TO -D1BC ; LV # Lo HANGUL SYLLABLE TWA -D1D8 ; LV # Lo HANGUL SYLLABLE TWAE -D1F4 ; LV # Lo HANGUL SYLLABLE TOE -D210 ; LV # Lo HANGUL SYLLABLE TYO -D22C ; LV # Lo HANGUL SYLLABLE TU -D248 ; LV # Lo HANGUL SYLLABLE TWEO -D264 ; LV # Lo HANGUL SYLLABLE TWE -D280 ; LV # Lo HANGUL SYLLABLE TWI -D29C ; LV # Lo HANGUL SYLLABLE TYU -D2B8 ; LV # Lo HANGUL SYLLABLE TEU -D2D4 ; LV # Lo HANGUL SYLLABLE TYI -D2F0 ; LV # Lo HANGUL SYLLABLE TI -D30C ; LV # Lo HANGUL SYLLABLE PA -D328 ; LV # Lo HANGUL SYLLABLE PAE -D344 ; LV # Lo HANGUL SYLLABLE PYA -D360 ; LV # Lo HANGUL SYLLABLE PYAE -D37C ; LV # Lo HANGUL SYLLABLE PEO -D398 ; LV # Lo HANGUL SYLLABLE PE -D3B4 ; LV # Lo HANGUL SYLLABLE PYEO -D3D0 ; LV # Lo HANGUL SYLLABLE PYE -D3EC ; LV # Lo HANGUL SYLLABLE PO -D408 ; LV # Lo HANGUL SYLLABLE PWA -D424 ; LV # Lo HANGUL SYLLABLE PWAE -D440 ; LV # Lo HANGUL SYLLABLE POE -D45C ; LV # Lo HANGUL SYLLABLE PYO -D478 ; LV # Lo HANGUL SYLLABLE PU -D494 ; LV # Lo HANGUL SYLLABLE PWEO -D4B0 ; LV # Lo HANGUL SYLLABLE PWE -D4CC ; LV # Lo HANGUL SYLLABLE PWI -D4E8 ; LV # Lo HANGUL SYLLABLE PYU -D504 ; LV # Lo HANGUL SYLLABLE PEU -D520 ; LV # Lo HANGUL SYLLABLE PYI -D53C ; LV # Lo HANGUL SYLLABLE PI -D558 ; LV # Lo HANGUL SYLLABLE HA -D574 ; LV # Lo HANGUL SYLLABLE HAE -D590 ; LV # Lo HANGUL SYLLABLE HYA -D5AC ; LV # Lo HANGUL SYLLABLE HYAE -D5C8 ; LV # Lo HANGUL SYLLABLE HEO -D5E4 ; LV # Lo HANGUL SYLLABLE HE -D600 ; LV # Lo HANGUL SYLLABLE HYEO -D61C ; LV # Lo HANGUL SYLLABLE HYE -D638 ; LV # Lo HANGUL SYLLABLE HO -D654 ; LV # Lo HANGUL SYLLABLE HWA -D670 ; LV # Lo HANGUL SYLLABLE HWAE -D68C ; LV # Lo HANGUL SYLLABLE HOE -D6A8 ; LV # Lo HANGUL SYLLABLE HYO -D6C4 ; LV # Lo HANGUL SYLLABLE HU -D6E0 ; LV # Lo HANGUL SYLLABLE HWEO -D6FC ; LV # Lo HANGUL SYLLABLE HWE -D718 ; LV # Lo HANGUL SYLLABLE HWI -D734 ; LV # Lo HANGUL SYLLABLE HYU -D750 ; LV # Lo HANGUL SYLLABLE HEU -D76C ; LV # Lo HANGUL SYLLABLE HYI -D788 ; LV # Lo HANGUL SYLLABLE HI - -# Total code points: 399 - -# ================================================ - -AC01..AC1B ; LVT # Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH -AC1D..AC37 ; LVT # Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH -AC39..AC53 ; LVT # Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH -AC55..AC6F ; LVT # Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH -AC71..AC8B ; LVT # Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH -AC8D..ACA7 ; LVT # Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH -ACA9..ACC3 ; LVT # Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH -ACC5..ACDF ; LVT # Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH -ACE1..ACFB ; LVT # Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH -ACFD..AD17 ; LVT # Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH -AD19..AD33 ; LVT # Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH -AD35..AD4F ; LVT # Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH -AD51..AD6B ; LVT # Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH -AD6D..AD87 ; LVT # Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH -AD89..ADA3 ; LVT # Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH -ADA5..ADBF ; LVT # Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH -ADC1..ADDB ; LVT # Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH -ADDD..ADF7 ; LVT # Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH -ADF9..AE13 ; LVT # Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH -AE15..AE2F ; LVT # Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH -AE31..AE4B ; LVT # Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH -AE4D..AE67 ; LVT # Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH -AE69..AE83 ; LVT # Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH -AE85..AE9F ; LVT # Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH -AEA1..AEBB ; LVT # Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH -AEBD..AED7 ; LVT # Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH -AED9..AEF3 ; LVT # Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH -AEF5..AF0F ; LVT # Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH -AF11..AF2B ; LVT # Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH -AF2D..AF47 ; LVT # Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH -AF49..AF63 ; LVT # Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH -AF65..AF7F ; LVT # Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH -AF81..AF9B ; LVT # Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH -AF9D..AFB7 ; LVT # Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH -AFB9..AFD3 ; LVT # Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH -AFD5..AFEF ; LVT # Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH -AFF1..B00B ; LVT # Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH -B00D..B027 ; LVT # Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH -B029..B043 ; LVT # Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH -B045..B05F ; LVT # Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH -B061..B07B ; LVT # Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH -B07D..B097 ; LVT # Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH -B099..B0B3 ; LVT # Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH -B0B5..B0CF ; LVT # Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH -B0D1..B0EB ; LVT # Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH -B0ED..B107 ; LVT # Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH -B109..B123 ; LVT # Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH -B125..B13F ; LVT # Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH -B141..B15B ; LVT # Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH -B15D..B177 ; LVT # Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH -B179..B193 ; LVT # Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH -B195..B1AF ; LVT # Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH -B1B1..B1CB ; LVT # Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH -B1CD..B1E7 ; LVT # Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH -B1E9..B203 ; LVT # Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH -B205..B21F ; LVT # Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH -B221..B23B ; LVT # Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH -B23D..B257 ; LVT # Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH -B259..B273 ; LVT # Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH -B275..B28F ; LVT # Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH -B291..B2AB ; LVT # Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH -B2AD..B2C7 ; LVT # Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH -B2C9..B2E3 ; LVT # Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH -B2E5..B2FF ; LVT # Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH -B301..B31B ; LVT # Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH -B31D..B337 ; LVT # Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH -B339..B353 ; LVT # Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH -B355..B36F ; LVT # Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH -B371..B38B ; LVT # Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH -B38D..B3A7 ; LVT # Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH -B3A9..B3C3 ; LVT # Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH -B3C5..B3DF ; LVT # Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH -B3E1..B3FB ; LVT # Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH -B3FD..B417 ; LVT # Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH -B419..B433 ; LVT # Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH -B435..B44F ; LVT # Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH -B451..B46B ; LVT # Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH -B46D..B487 ; LVT # Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH -B489..B4A3 ; LVT # Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH -B4A5..B4BF ; LVT # Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH -B4C1..B4DB ; LVT # Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH -B4DD..B4F7 ; LVT # Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH -B4F9..B513 ; LVT # Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH -B515..B52F ; LVT # Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH -B531..B54B ; LVT # Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH -B54D..B567 ; LVT # Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH -B569..B583 ; LVT # Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH -B585..B59F ; LVT # Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH -B5A1..B5BB ; LVT # Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH -B5BD..B5D7 ; LVT # Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH -B5D9..B5F3 ; LVT # Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH -B5F5..B60F ; LVT # Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH -B611..B62B ; LVT # Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH -B62D..B647 ; LVT # Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH -B649..B663 ; LVT # Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH -B665..B67F ; LVT # Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH -B681..B69B ; LVT # Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH -B69D..B6B7 ; LVT # Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH -B6B9..B6D3 ; LVT # Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH -B6D5..B6EF ; LVT # Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH -B6F1..B70B ; LVT # Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH -B70D..B727 ; LVT # Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH -B729..B743 ; LVT # Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH -B745..B75F ; LVT # Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH -B761..B77B ; LVT # Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH -B77D..B797 ; LVT # Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH -B799..B7B3 ; LVT # Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH -B7B5..B7CF ; LVT # Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH -B7D1..B7EB ; LVT # Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH -B7ED..B807 ; LVT # Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH -B809..B823 ; LVT # Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH -B825..B83F ; LVT # Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH -B841..B85B ; LVT # Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH -B85D..B877 ; LVT # Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH -B879..B893 ; LVT # Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH -B895..B8AF ; LVT # Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH -B8B1..B8CB ; LVT # Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH -B8CD..B8E7 ; LVT # Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH -B8E9..B903 ; LVT # Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH -B905..B91F ; LVT # Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH -B921..B93B ; LVT # Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH -B93D..B957 ; LVT # Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH -B959..B973 ; LVT # Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH -B975..B98F ; LVT # Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH -B991..B9AB ; LVT # Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH -B9AD..B9C7 ; LVT # Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH -B9C9..B9E3 ; LVT # Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH -B9E5..B9FF ; LVT # Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH -BA01..BA1B ; LVT # Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH -BA1D..BA37 ; LVT # Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH -BA39..BA53 ; LVT # Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH -BA55..BA6F ; LVT # Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH -BA71..BA8B ; LVT # Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH -BA8D..BAA7 ; LVT # Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH -BAA9..BAC3 ; LVT # Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH -BAC5..BADF ; LVT # Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH -BAE1..BAFB ; LVT # Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH -BAFD..BB17 ; LVT # Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH -BB19..BB33 ; LVT # Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH -BB35..BB4F ; LVT # Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH -BB51..BB6B ; LVT # Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH -BB6D..BB87 ; LVT # Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH -BB89..BBA3 ; LVT # Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH -BBA5..BBBF ; LVT # Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH -BBC1..BBDB ; LVT # Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH -BBDD..BBF7 ; LVT # Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH -BBF9..BC13 ; LVT # Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH -BC15..BC2F ; LVT # Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH -BC31..BC4B ; LVT # Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH -BC4D..BC67 ; LVT # Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH -BC69..BC83 ; LVT # Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH -BC85..BC9F ; LVT # Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH -BCA1..BCBB ; LVT # Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH -BCBD..BCD7 ; LVT # Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH -BCD9..BCF3 ; LVT # Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH -BCF5..BD0F ; LVT # Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH -BD11..BD2B ; LVT # Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH -BD2D..BD47 ; LVT # Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH -BD49..BD63 ; LVT # Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH -BD65..BD7F ; LVT # Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH -BD81..BD9B ; LVT # Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH -BD9D..BDB7 ; LVT # Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH -BDB9..BDD3 ; LVT # Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH -BDD5..BDEF ; LVT # Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH -BDF1..BE0B ; LVT # Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH -BE0D..BE27 ; LVT # Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH -BE29..BE43 ; LVT # Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH -BE45..BE5F ; LVT # Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH -BE61..BE7B ; LVT # Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH -BE7D..BE97 ; LVT # Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH -BE99..BEB3 ; LVT # Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH -BEB5..BECF ; LVT # Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH -BED1..BEEB ; LVT # Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH -BEED..BF07 ; LVT # Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH -BF09..BF23 ; LVT # Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH -BF25..BF3F ; LVT # Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH -BF41..BF5B ; LVT # Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH -BF5D..BF77 ; LVT # Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH -BF79..BF93 ; LVT # Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH -BF95..BFAF ; LVT # Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH -BFB1..BFCB ; LVT # Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH -BFCD..BFE7 ; LVT # Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH -BFE9..C003 ; LVT # Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH -C005..C01F ; LVT # Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH -C021..C03B ; LVT # Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH -C03D..C057 ; LVT # Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH -C059..C073 ; LVT # Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH -C075..C08F ; LVT # Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH -C091..C0AB ; LVT # Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH -C0AD..C0C7 ; LVT # Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH -C0C9..C0E3 ; LVT # Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH -C0E5..C0FF ; LVT # Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH -C101..C11B ; LVT # Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH -C11D..C137 ; LVT # Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH -C139..C153 ; LVT # Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH -C155..C16F ; LVT # Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH -C171..C18B ; LVT # Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH -C18D..C1A7 ; LVT # Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH -C1A9..C1C3 ; LVT # Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH -C1C5..C1DF ; LVT # Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH -C1E1..C1FB ; LVT # Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH -C1FD..C217 ; LVT # Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH -C219..C233 ; LVT # Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH -C235..C24F ; LVT # Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH -C251..C26B ; LVT # Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH -C26D..C287 ; LVT # Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH -C289..C2A3 ; LVT # Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH -C2A5..C2BF ; LVT # Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH -C2C1..C2DB ; LVT # Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH -C2DD..C2F7 ; LVT # Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH -C2F9..C313 ; LVT # Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH -C315..C32F ; LVT # Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH -C331..C34B ; LVT # Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH -C34D..C367 ; LVT # Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH -C369..C383 ; LVT # Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH -C385..C39F ; LVT # Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH -C3A1..C3BB ; LVT # Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH -C3BD..C3D7 ; LVT # Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH -C3D9..C3F3 ; LVT # Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH -C3F5..C40F ; LVT # Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH -C411..C42B ; LVT # Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH -C42D..C447 ; LVT # Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH -C449..C463 ; LVT # Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH -C465..C47F ; LVT # Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH -C481..C49B ; LVT # Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH -C49D..C4B7 ; LVT # Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH -C4B9..C4D3 ; LVT # Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH -C4D5..C4EF ; LVT # Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH -C4F1..C50B ; LVT # Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH -C50D..C527 ; LVT # Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH -C529..C543 ; LVT # Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH -C545..C55F ; LVT # Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH -C561..C57B ; LVT # Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH -C57D..C597 ; LVT # Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH -C599..C5B3 ; LVT # Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH -C5B5..C5CF ; LVT # Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH -C5D1..C5EB ; LVT # Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH -C5ED..C607 ; LVT # Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH -C609..C623 ; LVT # Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH -C625..C63F ; LVT # Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH -C641..C65B ; LVT # Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH -C65D..C677 ; LVT # Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH -C679..C693 ; LVT # Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH -C695..C6AF ; LVT # Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH -C6B1..C6CB ; LVT # Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH -C6CD..C6E7 ; LVT # Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH -C6E9..C703 ; LVT # Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH -C705..C71F ; LVT # Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH -C721..C73B ; LVT # Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH -C73D..C757 ; LVT # Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH -C759..C773 ; LVT # Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH -C775..C78F ; LVT # Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH -C791..C7AB ; LVT # Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH -C7AD..C7C7 ; LVT # Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH -C7C9..C7E3 ; LVT # Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH -C7E5..C7FF ; LVT # Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH -C801..C81B ; LVT # Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH -C81D..C837 ; LVT # Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH -C839..C853 ; LVT # Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH -C855..C86F ; LVT # Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH -C871..C88B ; LVT # Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH -C88D..C8A7 ; LVT # Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH -C8A9..C8C3 ; LVT # Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH -C8C5..C8DF ; LVT # Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH -C8E1..C8FB ; LVT # Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH -C8FD..C917 ; LVT # Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH -C919..C933 ; LVT # Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH -C935..C94F ; LVT # Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH -C951..C96B ; LVT # Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH -C96D..C987 ; LVT # Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH -C989..C9A3 ; LVT # Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH -C9A5..C9BF ; LVT # Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH -C9C1..C9DB ; LVT # Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH -C9DD..C9F7 ; LVT # Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH -C9F9..CA13 ; LVT # Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH -CA15..CA2F ; LVT # Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH -CA31..CA4B ; LVT # Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH -CA4D..CA67 ; LVT # Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH -CA69..CA83 ; LVT # Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH -CA85..CA9F ; LVT # Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH -CAA1..CABB ; LVT # Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH -CABD..CAD7 ; LVT # Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH -CAD9..CAF3 ; LVT # Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH -CAF5..CB0F ; LVT # Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH -CB11..CB2B ; LVT # Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH -CB2D..CB47 ; LVT # Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH -CB49..CB63 ; LVT # Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH -CB65..CB7F ; LVT # Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH -CB81..CB9B ; LVT # Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH -CB9D..CBB7 ; LVT # Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH -CBB9..CBD3 ; LVT # Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH -CBD5..CBEF ; LVT # Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH -CBF1..CC0B ; LVT # Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH -CC0D..CC27 ; LVT # Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH -CC29..CC43 ; LVT # Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH -CC45..CC5F ; LVT # Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH -CC61..CC7B ; LVT # Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH -CC7D..CC97 ; LVT # Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH -CC99..CCB3 ; LVT # Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH -CCB5..CCCF ; LVT # Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH -CCD1..CCEB ; LVT # Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH -CCED..CD07 ; LVT # Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH -CD09..CD23 ; LVT # Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH -CD25..CD3F ; LVT # Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH -CD41..CD5B ; LVT # Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH -CD5D..CD77 ; LVT # Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH -CD79..CD93 ; LVT # Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH -CD95..CDAF ; LVT # Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH -CDB1..CDCB ; LVT # Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH -CDCD..CDE7 ; LVT # Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH -CDE9..CE03 ; LVT # Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH -CE05..CE1F ; LVT # Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH -CE21..CE3B ; LVT # Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH -CE3D..CE57 ; LVT # Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH -CE59..CE73 ; LVT # Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH -CE75..CE8F ; LVT # Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH -CE91..CEAB ; LVT # Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH -CEAD..CEC7 ; LVT # Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH -CEC9..CEE3 ; LVT # Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH -CEE5..CEFF ; LVT # Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH -CF01..CF1B ; LVT # Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH -CF1D..CF37 ; LVT # Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH -CF39..CF53 ; LVT # Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH -CF55..CF6F ; LVT # Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH -CF71..CF8B ; LVT # Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH -CF8D..CFA7 ; LVT # Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH -CFA9..CFC3 ; LVT # Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH -CFC5..CFDF ; LVT # Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH -CFE1..CFFB ; LVT # Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH -CFFD..D017 ; LVT # Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH -D019..D033 ; LVT # Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH -D035..D04F ; LVT # Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH -D051..D06B ; LVT # Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH -D06D..D087 ; LVT # Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH -D089..D0A3 ; LVT # Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH -D0A5..D0BF ; LVT # Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH -D0C1..D0DB ; LVT # Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH -D0DD..D0F7 ; LVT # Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH -D0F9..D113 ; LVT # Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH -D115..D12F ; LVT # Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH -D131..D14B ; LVT # Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH -D14D..D167 ; LVT # Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH -D169..D183 ; LVT # Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH -D185..D19F ; LVT # Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH -D1A1..D1BB ; LVT # Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH -D1BD..D1D7 ; LVT # Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH -D1D9..D1F3 ; LVT # Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH -D1F5..D20F ; LVT # Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH -D211..D22B ; LVT # Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH -D22D..D247 ; LVT # Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH -D249..D263 ; LVT # Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH -D265..D27F ; LVT # Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH -D281..D29B ; LVT # Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH -D29D..D2B7 ; LVT # Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH -D2B9..D2D3 ; LVT # Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH -D2D5..D2EF ; LVT # Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH -D2F1..D30B ; LVT # Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH -D30D..D327 ; LVT # Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH -D329..D343 ; LVT # Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH -D345..D35F ; LVT # Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH -D361..D37B ; LVT # Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH -D37D..D397 ; LVT # Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH -D399..D3B3 ; LVT # Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH -D3B5..D3CF ; LVT # Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH -D3D1..D3EB ; LVT # Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH -D3ED..D407 ; LVT # Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH -D409..D423 ; LVT # Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH -D425..D43F ; LVT # Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH -D441..D45B ; LVT # Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH -D45D..D477 ; LVT # Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH -D479..D493 ; LVT # Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH -D495..D4AF ; LVT # Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH -D4B1..D4CB ; LVT # Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH -D4CD..D4E7 ; LVT # Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH -D4E9..D503 ; LVT # Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH -D505..D51F ; LVT # Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH -D521..D53B ; LVT # Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH -D53D..D557 ; LVT # Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH -D559..D573 ; LVT # Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH -D575..D58F ; LVT # Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH -D591..D5AB ; LVT # Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH -D5AD..D5C7 ; LVT # Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH -D5C9..D5E3 ; LVT # Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH -D5E5..D5FF ; LVT # Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH -D601..D61B ; LVT # Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH -D61D..D637 ; LVT # Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH -D639..D653 ; LVT # Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH -D655..D66F ; LVT # Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH -D671..D68B ; LVT # Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH -D68D..D6A7 ; LVT # Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH -D6A9..D6C3 ; LVT # Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH -D6C5..D6DF ; LVT # Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH -D6E1..D6FB ; LVT # Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH -D6FD..D717 ; LVT # Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH -D719..D733 ; LVT # Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH -D735..D74F ; LVT # Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH -D751..D76B ; LVT # Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH -D76D..D787 ; LVT # Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH -D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH - -# Total code points: 10773 - -# EOF From 758fb82b2abf83f294f56ac54179f9db0080f8e8 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 27 Jun 2022 15:38:23 +0100 Subject: [PATCH 3611/4023] Cosmetic comment fixes --- src/code/target-char.lisp | 4 ++-- tools-for-build/ucd.lisp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/target-char.lisp b/src/code/target-char.lisp index 96b2c24294..f97ec8474b 100644 --- a/src/code/target-char.lisp +++ b/src/code/target-char.lisp @@ -359,7 +359,7 @@ ;;; The character database is made of several arrays. ;;; +CHARACTER-MISC-DATABASE+ is an array of bytes that encode character -;;; attributes. Each entry in the misc database is +misc-width+ (currently 9) +;;; attributes. Each entry in the misc database is +MISC-WIDTH+ (currently 9) ;;; bytes wide. Within each entry, the bytes represent: general category, BIDI ;;; class, canonical combining class, digit value, decomposition info, other ;;; flags, script, line break class, and age, respectively. Several of the @@ -392,7 +392,7 @@ ;;; codepoint, all times two to account for the widtth of the entries. The ;;; value in +CHARACTER-LOW-PAGES+ at this point is the misc entry number. To ;;; transform a misc entry number into an index into -;;; +CHARACTER-MISC-DATABASE+, multiply it by +misc-width*. This gives the +;;; +CHARACTER-MISC-DATABASE+, multiply it by +MISC-WIDTH+. This gives the ;;; index of the start of the charater's misc entry in ;;; +CHARACTER-MISC-DATABASE+. ;;; diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index 2be22ba6a9..1488bd5d82 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -585,7 +585,7 @@ Length should be adjusted when the standard changes.") :element-type '(unsigned-byte 8)) (setf (gethash "output/CaseFolding.txt" *ucd-outputs*) 'made) ;; KLUDGE: it's inefficient, though simple, to do the I/O - ;; byte-by-bite. + ;; byte-by-byte. (do ((inbyte (read-byte in nil nil) (read-byte in nil nil)) (eszet (map '(vector (unsigned-byte 8)) 'char-code "<eszet>")) (eszet-count 0) From bce63ffcfc276b775c046c4ab90c3e04ebb4ee2e Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 27 Jun 2022 15:43:55 +0100 Subject: [PATCH 3612/4023] Update some data files to Unicode 8.0 The update in c. 2019 missed these; two of them are comment-changes only; one adds some additional test cases. --- tests/data/HangulSyllableType.txt | 6 +++--- tests/data/NormalizationTest.txt | 18 +++++++++++++++--- tools-for-build/Jamo.txt | 8 ++++---- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/tests/data/HangulSyllableType.txt b/tests/data/HangulSyllableType.txt index f15f592699..e30a82b82d 100644 --- a/tests/data/HangulSyllableType.txt +++ b/tests/data/HangulSyllableType.txt @@ -1,8 +1,8 @@ -# HangulSyllableType-7.0.0.txt -# Date: 2013-11-27, 09:54:39 GMT [MD] +# HangulSyllableType-8.0.0.txt +# Date: 2014-12-16, 23:07:45 GMT [MD] # # Unicode Character Database -# Copyright (c) 1991-2013 Unicode, Inc. +# Copyright (c) 1991-2014 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ diff --git a/tests/data/NormalizationTest.txt b/tests/data/NormalizationTest.txt index 23c1e51d5f..0290080998 100644 --- a/tests/data/NormalizationTest.txt +++ b/tests/data/NormalizationTest.txt @@ -1,8 +1,8 @@ -# NormalizationTest-7.0.0.txt -# Date: 2013-11-27, 09:54:41 GMT [MD] +# NormalizationTest-8.0.0.txt +# Date: 2015-02-13, 13:30:27 GMT [MD] # # Unicode Character Database -# Copyright (c) 1991-2013 Unicode, Inc. +# Copyright (c) 1991-2015 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # @@ -17523,6 +17523,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 085A 059A 0316 302A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062; # (a◌࡚◌֚◌̖◌〪b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC VOCALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 059A 0316 302A 085B 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062; # (a◌֚◌̖◌〪◌࡛b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MANDAIC GEMINATION MARK, LATIN SMALL LETTER B 0061 085B 059A 0316 302A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062; # (a◌࡛◌֚◌̖◌〪b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC GEMINATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 059A 0316 302A 08E3 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062; # (a◌֚◌̖◌〪◌ࣣb; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC TURNED DAMMA BELOW, LATIN SMALL LETTER B +0061 08E3 059A 0316 302A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062; # (a◌ࣣ◌֚◌̖◌〪b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TURNED DAMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 0315 0300 05AE 08E4 0062;00E0 05AE 08E4 0315 0062;0061 05AE 0300 08E4 0315 0062;00E0 05AE 08E4 0315 0062;0061 05AE 0300 08E4 0315 0062; # (a◌̕◌̀◌֮◌ࣤb; à◌֮◌ࣤ◌̕b; a◌֮◌̀◌ࣤ◌̕b; à◌֮◌ࣤ◌̕b; a◌֮◌̀◌ࣤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY FATHA, LATIN SMALL LETTER B 0061 08E4 0315 0300 05AE 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062; # (a◌ࣤ◌̕◌̀◌֮b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY FATHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 0315 0300 05AE 08E5 0062;00E0 05AE 08E5 0315 0062;0061 05AE 0300 08E5 0315 0062;00E0 05AE 08E5 0315 0062;0061 05AE 0300 08E5 0315 0062; # (a◌̕◌̀◌֮◌ࣥb; à◌֮◌ࣥ◌̕b; a◌֮◌̀◌ࣥ◌̕b; à◌֮◌ࣥ◌̕b; a◌֮◌̀◌ࣥ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY DAMMA, LATIN SMALL LETTER B @@ -18135,6 +18137,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 A67C 0315 0300 05AE 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062; # (a◌꙼◌̕◌̀◌֮b; a◌֮◌꙼◌̀◌̕b; a◌֮◌꙼◌̀◌̕b; a◌֮◌꙼◌̀◌̕b; a◌֮◌꙼◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC KAVYKA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 0315 0300 05AE A67D 0062;00E0 05AE A67D 0315 0062;0061 05AE 0300 A67D 0315 0062;00E0 05AE A67D 0315 0062;0061 05AE 0300 A67D 0315 0062; # (a◌̕◌̀◌֮◌꙽b; à◌֮◌꙽◌̕b; a◌֮◌̀◌꙽◌̕b; à◌֮◌꙽◌̕b; a◌֮◌̀◌꙽◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC PAYEROK, LATIN SMALL LETTER B 0061 A67D 0315 0300 05AE 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062; # (a◌꙽◌̕◌̀◌֮b; a◌֮◌꙽◌̀◌̕b; a◌֮◌꙽◌̀◌̕b; a◌֮◌꙽◌̀◌̕b; a◌֮◌꙽◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC PAYEROK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A69E 0062;00E0 05AE A69E 0315 0062;0061 05AE 0300 A69E 0315 0062;00E0 05AE A69E 0315 0062;0061 05AE 0300 A69E 0315 0062; # (a◌̕◌̀◌֮◌ꚞb; à◌֮◌ꚞ◌̕b; a◌֮◌̀◌ꚞ◌̕b; à◌֮◌ꚞ◌̕b; a◌֮◌̀◌ꚞ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER EF, LATIN SMALL LETTER B +0061 A69E 0315 0300 05AE 0062;0061 05AE A69E 0300 0315 0062;0061 05AE A69E 0300 0315 0062;0061 05AE A69E 0300 0315 0062;0061 05AE A69E 0300 0315 0062; # (a◌ꚞ◌̕◌̀◌֮b; a◌֮◌ꚞ◌̀◌̕b; a◌֮◌ꚞ◌̀◌̕b; a◌֮◌ꚞ◌̀◌̕b; a◌֮◌ꚞ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER EF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 0315 0300 05AE A69F 0062;00E0 05AE A69F 0315 0062;0061 05AE 0300 A69F 0315 0062;00E0 05AE A69F 0315 0062;0061 05AE 0300 A69F 0315 0062; # (a◌̕◌̀◌֮◌ꚟb; à◌֮◌ꚟ◌̕b; a◌֮◌̀◌ꚟ◌̕b; à◌֮◌ꚟ◌̕b; a◌֮◌̀◌ꚟ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER IOTIFIED E, LATIN SMALL LETTER B 0061 A69F 0315 0300 05AE 0062;0061 05AE A69F 0300 0315 0062;0061 05AE A69F 0300 0315 0062;0061 05AE A69F 0300 0315 0062;0061 05AE A69F 0300 0315 0062; # (a◌ꚟ◌̕◌̀◌֮b; a◌֮◌ꚟ◌̀◌̕b; a◌֮◌ꚟ◌̀◌̕b; a◌֮◌ꚟ◌̀◌̕b; a◌֮◌ꚟ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER IOTIFIED E, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 0315 0300 05AE A6F0 0062;00E0 05AE A6F0 0315 0062;0061 05AE 0300 A6F0 0315 0062;00E0 05AE A6F0 0315 0062;0061 05AE 0300 A6F0 0315 0062; # (a◌̕◌̀◌֮◌꛰b; à◌֮◌꛰◌̕b; a◌֮◌̀◌꛰◌̕b; à◌֮◌꛰◌̕b; a◌֮◌̀◌꛰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BAMUM COMBINING MARK KOQNDON, LATIN SMALL LETTER B @@ -18245,6 +18249,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 FE2C 059A 0316 302A 0062;0061 302A FE2C 0316 059A 0062;0061 302A FE2C 0316 059A 0062;0061 302A FE2C 0316 059A 0062;0061 302A FE2C 0316 059A 0062; # (a◌︬◌֚◌̖◌〪b; a◌〪◌︬◌̖◌֚b; a◌〪◌︬◌̖◌֚b; a◌〪◌︬◌̖◌֚b; a◌〪◌︬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 059A 0316 302A FE2D 0062;0061 302A 0316 FE2D 059A 0062;0061 302A 0316 FE2D 059A 0062;0061 302A 0316 FE2D 059A 0062;0061 302A 0316 FE2D 059A 0062; # (a◌֚◌̖◌〪◌︭b; a◌〪◌̖◌︭◌֚b; a◌〪◌̖◌︭◌֚b; a◌〪◌̖◌︭◌֚b; a◌〪◌̖◌︭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING CONJOINING MACRON BELOW, LATIN SMALL LETTER B 0061 FE2D 059A 0316 302A 0062;0061 302A FE2D 0316 059A 0062;0061 302A FE2D 0316 059A 0062;0061 302A FE2D 0316 059A 0062;0061 302A FE2D 0316 059A 0062; # (a◌︭◌֚◌̖◌〪b; a◌〪◌︭◌̖◌֚b; a◌〪◌︭◌̖◌֚b; a◌〪◌︭◌̖◌֚b; a◌〪◌︭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CONJOINING MACRON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE FE2E 0062;00E0 05AE FE2E 0315 0062;0061 05AE 0300 FE2E 0315 0062;00E0 05AE FE2E 0315 0062;0061 05AE 0300 FE2E 0315 0062; # (a◌̕◌̀◌֮◌︮b; à◌֮◌︮◌̕b; a◌֮◌̀◌︮◌̕b; à◌֮◌︮◌̕b; a◌֮◌̀◌︮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC TITLO LEFT HALF, LATIN SMALL LETTER B +0061 FE2E 0315 0300 05AE 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062; # (a◌︮◌̕◌̀◌֮b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC TITLO LEFT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE2F 0062;00E0 05AE FE2F 0315 0062;0061 05AE 0300 FE2F 0315 0062;00E0 05AE FE2F 0315 0062;0061 05AE 0300 FE2F 0315 0062; # (a◌̕◌̀◌֮◌︯b; à◌֮◌︯◌̕b; a◌֮◌̀◌︯◌̕b; à◌֮◌︯◌̕b; a◌֮◌̀◌︯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC TITLO RIGHT HALF, LATIN SMALL LETTER B +0061 FE2F 0315 0300 05AE 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062; # (a◌︯◌̕◌̀◌֮b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC TITLO RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 059A 0316 302A 101FD 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062; # (a◌֚◌̖◌〪◌𐇽b; a◌〪◌̖◌𐇽◌֚b; a◌〪◌̖◌𐇽◌֚b; a◌〪◌̖◌𐇽◌֚b; a◌〪◌̖◌𐇽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, LATIN SMALL LETTER B 0061 101FD 059A 0316 302A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062; # (a◌𐇽◌֚◌̖◌〪b; a◌〪◌𐇽◌̖◌֚b; a◌〪◌𐇽◌̖◌֚b; a◌〪◌𐇽◌̖◌֚b; a◌〪◌𐇽◌̖◌֚b; ) LATIN SMALL LETTER A, PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 059A 0316 302A 102E0 0062;0061 302A 0316 102E0 059A 0062;0061 302A 0316 102E0 059A 0062;0061 302A 0316 102E0 059A 0062;0061 302A 0316 102E0 059A 0062; # (a◌֚◌̖◌〪◌𐋠b; a◌〪◌̖◌𐋠◌֚b; a◌〪◌̖◌𐋠◌֚b; a◌〪◌̖◌𐋠◌֚b; a◌〪◌̖◌𐋠◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COPTIC EPACT THOUSANDS MARK, LATIN SMALL LETTER B @@ -18297,6 +18305,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 11173 3099 093C 0334 0062;0061 0334 11173 093C 3099 0062;0061 0334 11173 093C 3099 0062;0061 0334 11173 093C 3099 0062;0061 0334 11173 093C 3099 0062; # (a◌𑅳◌゙◌़◌̴b; a◌̴◌𑅳◌़◌゙b; a◌̴◌𑅳◌़◌゙b; a◌̴◌𑅳◌़◌゙b; a◌̴◌𑅳◌़◌゙b; ) LATIN SMALL LETTER A, MAHAJANI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 05B0 094D 3099 111C0 0062;0061 3099 094D 111C0 05B0 0062;0061 3099 094D 111C0 05B0 0062;0061 3099 094D 111C0 05B0 0062;0061 3099 094D 111C0 05B0 0062; # (a◌ְ◌्◌゙𑇀b; a◌゙◌्𑇀◌ְb; a◌゙◌्𑇀◌ְb; a◌゙◌्𑇀◌ְb; a◌゙◌्𑇀◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SHARADA SIGN VIRAMA, LATIN SMALL LETTER B 0061 111C0 05B0 094D 3099 0062;0061 3099 111C0 094D 05B0 0062;0061 3099 111C0 094D 05B0 0062;0061 3099 111C0 094D 05B0 0062;0061 3099 111C0 094D 05B0 0062; # (a𑇀◌ְ◌्◌゙b; a◌゙𑇀◌्◌ְb; a◌゙𑇀◌्◌ְb; a◌゙𑇀◌्◌ְb; a◌゙𑇀◌्◌ְb; ) LATIN SMALL LETTER A, SHARADA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 0334 111CA 0062;0061 0334 093C 111CA 3099 0062;0061 0334 093C 111CA 3099 0062;0061 0334 093C 111CA 3099 0062;0061 0334 093C 111CA 3099 0062; # (a◌゙◌़◌̴◌𑇊b; a◌̴◌़◌𑇊◌゙b; a◌̴◌़◌𑇊◌゙b; a◌̴◌़◌𑇊◌゙b; a◌̴◌़◌𑇊◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, SHARADA SIGN NUKTA, LATIN SMALL LETTER B +0061 111CA 3099 093C 0334 0062;0061 0334 111CA 093C 3099 0062;0061 0334 111CA 093C 3099 0062;0061 0334 111CA 093C 3099 0062;0061 0334 111CA 093C 3099 0062; # (a◌𑇊◌゙◌़◌̴b; a◌̴◌𑇊◌़◌゙b; a◌̴◌𑇊◌़◌゙b; a◌̴◌𑇊◌़◌゙b; a◌̴◌𑇊◌़◌゙b; ) LATIN SMALL LETTER A, SHARADA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 05B0 094D 3099 11235 0062;0061 3099 094D 11235 05B0 0062;0061 3099 094D 11235 05B0 0062;0061 3099 094D 11235 05B0 0062;0061 3099 094D 11235 05B0 0062; # (a◌ְ◌्◌゙𑈵b; a◌゙◌्𑈵◌ְb; a◌゙◌्𑈵◌ְb; a◌゙◌्𑈵◌ְb; a◌゙◌्𑈵◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHOJKI SIGN VIRAMA, LATIN SMALL LETTER B 0061 11235 05B0 094D 3099 0062;0061 3099 11235 094D 05B0 0062;0061 3099 11235 094D 05B0 0062;0061 3099 11235 094D 05B0 0062;0061 3099 11235 094D 05B0 0062; # (a𑈵◌ְ◌्◌゙b; a◌゙𑈵◌्◌ְb; a◌゙𑈵◌्◌ְb; a◌゙𑈵◌्◌ְb; a◌゙𑈵◌्◌ְb; ) LATIN SMALL LETTER A, KHOJKI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 3099 093C 0334 11236 0062;0061 0334 093C 11236 3099 0062;0061 0334 093C 11236 3099 0062;0061 0334 093C 11236 3099 0062;0061 0334 093C 11236 3099 0062; # (a◌゙◌़◌̴◌𑈶b; a◌̴◌़◌𑈶◌゙b; a◌̴◌़◌𑈶◌゙b; a◌̴◌़◌𑈶◌゙b; a◌̴◌़◌𑈶◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, KHOJKI SIGN NUKTA, LATIN SMALL LETTER B @@ -18347,6 +18357,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 116B6 05B0 094D 3099 0062;0061 3099 116B6 094D 05B0 0062;0061 3099 116B6 094D 05B0 0062;0061 3099 116B6 094D 05B0 0062;0061 3099 116B6 094D 05B0 0062; # (a𑚶◌ְ◌्◌゙b; a◌゙𑚶◌्◌ְb; a◌゙𑚶◌्◌ְb; a◌゙𑚶◌्◌ְb; a◌゙𑚶◌्◌ְb; ) LATIN SMALL LETTER A, TAKRI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 3099 093C 0334 116B7 0062;0061 0334 093C 116B7 3099 0062;0061 0334 093C 116B7 3099 0062;0061 0334 093C 116B7 3099 0062;0061 0334 093C 116B7 3099 0062; # (a◌゙◌़◌̴◌𑚷b; a◌̴◌़◌𑚷◌゙b; a◌̴◌़◌𑚷◌゙b; a◌̴◌़◌𑚷◌゙b; a◌̴◌़◌𑚷◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, TAKRI SIGN NUKTA, LATIN SMALL LETTER B 0061 116B7 3099 093C 0334 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062; # (a◌𑚷◌゙◌़◌̴b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; ) LATIN SMALL LETTER A, TAKRI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05B0 094D 3099 1172B 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062; # (a◌ְ◌्◌゙◌𑜫b; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, AHOM SIGN KILLER, LATIN SMALL LETTER B +0061 1172B 05B0 094D 3099 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062; # (a◌𑜫◌ְ◌्◌゙b; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; ) LATIN SMALL LETTER A, AHOM SIGN KILLER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 093C 0334 16AF0 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062; # (a◌़◌̴◌𖫰b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING HIGH TONE, LATIN SMALL LETTER B 0061 16AF0 093C 0334 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062; # (a◌𖫰◌़◌̴b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING HIGH TONE, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 093C 0334 16AF1 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062; # (a◌़◌̴◌𖫱b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING LOW TONE, LATIN SMALL LETTER B diff --git a/tools-for-build/Jamo.txt b/tools-for-build/Jamo.txt index 16101246f3..8f7c5937ae 100644 --- a/tools-for-build/Jamo.txt +++ b/tools-for-build/Jamo.txt @@ -1,14 +1,14 @@ -# Jamo-7.0.0.txt -# Date: 2014-01-23, 00:00:00 GMT [KW, LI] +# Jamo-8.0.0.txt +# Date: 2015-01-20, 01:30:00 GMT [KW, LI] # # Unicode Character Database -# Copyright (c) 1991-2014 Unicode, Inc. +# Copyright (c) 1991-2015 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # # This file defines the Jamo_Short_Name property. # -# See Section 3.12 of The Unicode Standard, Version 7.0 +# See Section 3.12 of The Unicode Standard, Version 8.0 # for more information. # # Each line contains two fields, separated by a semicolon. From 2d6559efdb1e753b304013b7b8472ed82fafa039 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Wed, 29 Jun 2022 21:43:41 +0100 Subject: [PATCH 3613/4023] Minor quality-of-life improvement to unicode breaking tests On failure, display the line, its number in the file, the expected result, and the actual result. --- tests/unicode-breaking.pure.lisp | 42 +++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/tests/unicode-breaking.pure.lisp b/tests/unicode-breaking.pure.lisp index 8c439422a9..08470cf3d8 100644 --- a/tests/unicode-breaking.pure.lisp +++ b/tests/unicode-breaking.pure.lisp @@ -37,17 +37,21 @@ (remove "" (split-string string #\Space) :test #'string=)))) (if (not (or (cdr list) singleton-list)) (car list) list))) -(defun test-line (fn line) +(defun test-line (fn line n) (let ((relevant-portion (subseq line 0 (position #\# line)))) (when (string/= relevant-portion "") - (let ((string - (coerce (mapcar - #'code-char - (parse-codepoints - (remove +mul+ (remove +div+ relevant-portion)))) - 'string))) - (assert (equalp (funcall fn string) - (line-to-clusters relevant-portion))))))) + (let* ((string + (coerce (mapcar + #'code-char + (parse-codepoints + (remove +mul+ (remove +div+ relevant-portion)))) + 'string)) + (actual (funcall fn string)) + (expected (line-to-clusters relevant-portion))) + (assert (equalp actual expected) + () + "~@<line ~D: ~S - expected: ~S, actual: ~S~@:>" + n line expected actual))))) (defun test-graphemes () (declare (optimize (debug 2))) @@ -55,8 +59,9 @@ :skipped-on (not :sb-unicode)) (with-open-file (s "data/GraphemeBreakTest.txt" :external-format :utf8) (loop for line = (read-line s nil nil) + for n from 0 while line - do (test-line #'graphemes (remove #\Tab line)))))) + do (test-line #'graphemes (remove #\Tab line) n))))) (test-graphemes) @@ -66,8 +71,9 @@ :skipped-on (not :sb-unicode)) (with-open-file (s "data/WordBreakTest.txt" :external-format :utf8) (loop for line = (read-line s nil nil) + for n from 0 while line - do (test-line #'words (remove #\Tab line)))))) + do (test-line #'words (remove #\Tab line) n))))) (test-words) @@ -77,8 +83,9 @@ :skipped-on (not :sb-unicode)) (with-open-file (s "data/SentenceBreakTest.txt" :external-format :utf8) (loop for line = (read-line s nil nil) + for n from 0 while line - do (test-line #'sentences (remove #\Tab line)))))) + do (test-line #'sentences (remove #\Tab line) n))))) (test-sentences) @@ -110,6 +117,7 @@ (setf (gethash s line-break-exceptions) t)) (with-open-file (s "data/LineBreakTest.txt" :external-format :utf8) (loop for line = (read-line s nil nil) + for n from 0 while line do (let ((string (subseq line 0 (max 0 (1- (or (position #\# line) 1)))))) (unless (string= string "") @@ -118,5 +126,11 @@ (string-from-line-break-line string))) (actual (substitute :can :must annotated))) (if (gethash string line-break-exceptions) - (assert (not (equal expected actual))) - (assert (equal expected actual)))))))))) + (assert (not (equal expected actual)) + () + "~@<line ~D: ~S - expected: ~S, actual; ~S~:@>" + n string expected actual) + (assert (equal expected actual) + () + "~@<line ~D: ~S - expected: ~S, actual; ~S~:@>" + n string expected actual))))))))) From 9bb057ba50597c9983f8154035cf95c4a5e41d7f Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 1 Jul 2022 14:55:50 +0100 Subject: [PATCH 3614/4023] Extract a macro encapsulating conversion of utf8 data files to ascii It makes the existing ucd.lisp marginally cleaner, and is groundwork for the update to Unicode 9. --- tools-for-build/ucd.lisp | 111 ++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index 1488bd5d82..e1f9217b31 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -18,6 +18,52 @@ (setf (gethash (format nil "tools-for-build/~A.txt" ,name) *ucd-inputs*) 'used) ,@body)) +(defmacro with-input-utf8-file ((s name &key (eszets 0)) &body body) + ;; KLUDGE: CaseFolding.txt as distributed by Unicode contains a + ;; non-ASCII character, an eszet, within a comment to act as an + ;; example. We can't in general assume that our host lisp will let + ;; us read that, and we can't portably write that we don't care + ;; about the text content of anything on a line after a hash because + ;; text decoding happens at a lower level. So here we rewrite the + ;; CaseFolding.txt file to exclude the UTF-8 sequence corresponding + ;; to the eszet character. + (let ((in (gensym "IN")) + (out (gensym "OUT"))) + `(let ((filename (format nil "~A.txt" ,name))) + (with-open-file (,in (make-pathname :name ,name :type "txt" + :defaults *unicode-character-database*) + :element-type '(unsigned-byte 8)) + (setf (gethash (format nil "tools-for-build/~A.txt" ,name) *ucd-inputs*) 'used) + (with-open-file (,out (make-pathname :name ,name :type "txt" + :defaults *output-directory*) + :element-type '(unsigned-byte 8) + :direction :output + :if-exists :supersede + :if-does-not-exist :create) + (setf (gethash (format nil "output/~A.txt" ,name) *ucd-outputs*) 'made) + (do ((inbyte (read-byte ,in nil nil) (read-byte ,in nil nil)) + (eszet (map '(vector (unsigned-byte 8)) 'char-code "<eszet>")) + (eszet-count 0)) + ((null inbyte) + (unless (= eszet-count ,eszets) + (error "Unexpected number of eszets in ~A: ~D (expected ~D)" + filename eszet-count ,eszets))) + (cond + ((= inbyte #xc3) + (let ((second (read-byte ,in nil nil))) + (cond + ((null second) + (error "No continuation after #xc3 in ~A" filename)) + ((= second #x9f) (incf eszet-count) (write-sequence eszet ,out)) + (t (error "Unexpected continuation after #xc3 in ~A: #x~X" + filename second))))) + ((>= inbyte #x7f) + (error "Unexpected octet in ~A: #x~X" filename inbyte)) + (t (write-byte inbyte ,out)))))) + (with-open-file (,s (make-pathname :name ,name :type "txt" + :defaults *output-directory*)) + ,@body)))) + (defmacro with-output-dat-file ((s name) &body body) `(with-open-file (,s (make-pathname :name ,name :type "dat" :defaults *output-directory*) @@ -565,61 +611,18 @@ Length should be adjusted when the standard changes.") (setf (ucd-misc (gethash code-point *ucd-entries*)) new-misc)))))) (defun fixup-casefolding () - ;; KLUDGE: CaseFolding.txt as distributed by Unicode contains a - ;; non-ASCII character, an eszet, within a comment to act as an - ;; example. We can't in general assume that our host lisp will let - ;; us read that, and we can't portably write that we don't care - ;; about the text content of anything on a line after a hash because - ;; text decoding happens at a lower level. So here we rewrite the - ;; CaseFolding.txt file to exclude the UTF-8 sequence corresponding - ;; to the eszet character. - (with-open-file (in (make-pathname :name "CaseFolding" :type "txt" - :defaults *unicode-character-database*) - :element-type '(unsigned-byte 8)) - (setf (gethash "tools-for-build/CaseFolding.txt" *ucd-inputs*) 'used) - (with-open-file (out (make-pathname :name "CaseFolding" :type "txt" - :defaults *output-directory*) - :direction :output - :if-exists :supersede - :if-does-not-exist :create - :element-type '(unsigned-byte 8)) - (setf (gethash "output/CaseFolding.txt" *ucd-outputs*) 'made) - ;; KLUDGE: it's inefficient, though simple, to do the I/O - ;; byte-by-byte. - (do ((inbyte (read-byte in nil nil) (read-byte in nil nil)) - (eszet (map '(vector (unsigned-byte 8)) 'char-code "<eszet>")) - (eszet-count 0) - (filename "CaseFolding.txt")) - ((null inbyte) - (unless (= eszet-count 1) - (error "Unexpected number of eszets in ~A: ~D" - filename eszet-count))) - (cond - ((= inbyte #xc3) - (let ((second (read-byte in nil nil))) - (cond - ((null second) - (error "No continuation after #xc3 in ~A" filename)) - ((= second #x9f) (incf eszet-count) (write-sequence eszet out)) - (t (error "Unexpected continuation after #xc3 in ~A: #x~X" - filename second))))) - ((>= inbyte #x7f) - (error "Unexpected octet in ~A: #x~X" filename inbyte)) - (t (write-byte inbyte out)))))) - (with-open-file (s (make-pathname :name "CaseFolding" :type "txt" - :defaults *output-directory*)) - (setf (gethash "tools-for-build/CaseFolding.txt" *ucd-inputs*) 'used) + (with-input-utf8-file (s "CaseFolding" :eszets 1) (loop for line = (read-line s nil nil) - while line - unless (or (not (position #\; line)) (equal (position #\# line) 0)) - do (destructuring-bind (original type mapping comment) - (split-string line #\;) - (declare (ignore comment)) - (let ((cp (parse-integer original :radix 16)) - (fold (parse-codepoints mapping :singleton-list nil))) - (unless (or (string= type " S") (string= type " T")) - (when (not (equal (cdr (gethash cp *case-mapping*)) fold)) - (push (cons cp fold) *different-casefolds*)))))))) + while line + unless (or (not (position #\; line)) (equal (position #\# line) 0)) + do (destructuring-bind (original type mapping comment) + (split-string line #\;) + (declare (ignore comment)) + (let ((cp (parse-integer original :radix 16)) + (fold (parse-codepoints mapping :singleton-list nil))) + (unless (or (string= type " S") (string= type " T")) + (when (not (equal (cdr (gethash cp *case-mapping*)) fold)) + (push (cons cp fold) *different-casefolds*)))))))) (defun fixup-ages () (let ((age (sort From 9828de6e71912a798df1c2c5a613e318648fb12a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 2 Jul 2022 13:36:24 +0300 Subject: [PATCH 3615/4023] Discard the second value of UNARY-TRUNCATE without using a dummy. As it may conflict with the previously derived type. Reported by Eric Marsden. --- src/compiler/float-tran.lisp | 9 +++++---- src/compiler/fndb.lisp | 6 ++++-- tests/arith.pure.lisp | 8 ++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index de29518110..8efc3d6428 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1570,10 +1570,11 @@ (deftransform %unary-truncate ((x) (double-float)) `(%unary-truncate/double-float x)) -(deftransform unary-truncate ((x) * * :result result) - (if (lvar-single-value-p result) - `(values (%unary-truncate x) x) - (give-up-ir1-transform))) +(deftransform unary-truncate ((x) * * :result result :node node) + (unless (lvar-single-value-p result) + (give-up-ir1-transform)) + (derive-node-type node (single-value-type (node-derived-type node)) :from-scratch t) + `(%unary-truncate x)) (macrolet ((def (type) `(deftransform unary-truncate ((number) (,type)) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index f3b2b79d1b..d0b42d1fa7 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -347,9 +347,11 @@ (defknown unary-truncate (real) (values integer real) (movable foldable flushable)) -(defknown unary-truncate-single-float-to-bignum (single-float) (values bignum (eql $0f0))) +(defknown unary-truncate-single-float-to-bignum (single-float) (values bignum (eql $0f0)) + (foldable movable flushable)) (defknown unary-truncate-double-float-to-bignum (double-float) (values bignum #+64-bit (eql $0d0) - #-64-bit double-float)) + #-64-bit double-float) + (foldable movable flushable)) (defknown %multiply-high (word word) word (movable foldable flushable)) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index d9b6bfb517..e60d4302f4 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -1070,3 +1070,11 @@ (logand most-positive-fixnum (- (the fixnum a) most-negative-fixnum))) ((10) 10))) + +(with-test (:name :unary-truncate-discard-second-value) + (checked-compile-and-assert + () + `(lambda (a) + (truncate (expt (complex a 0) 0)) + 1) + ((1) 1))) From e20b4d522f43aafb12168403178e8f9c13dc0840 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Wed, 29 Jun 2022 21:46:24 +0100 Subject: [PATCH 3616/4023] Update to Unicode 9.0 As well as updates to data files, this involves minor changes to the build process to accommodate the fact that Unicode data files now contain copyright/registered symbols, and updates to the collation and grapheme/word/line-breaking algorithms. --- make-host-1.lisp | 14 +- src/code/target-unicode.lisp | 286 +- tests/data/CollationTest_SHIFTED_SHORT.txt | 5356 +- tests/data/DerivedBidiClass.txt | 124 +- tests/data/GraphemeBreakProperty.txt | 127 +- tests/data/GraphemeBreakTest.txt | 561 +- tests/data/HangulSyllableType.txt | 11 +- tests/data/LineBreakTest.txt | 7502 ++- tests/data/NormalizationTest.txt | 140 +- tests/data/SentenceBreakProperty.txt | 86 +- tests/data/SentenceBreakTest.txt | 714 +- tests/data/WordBreakProperty.txt | 139 +- tests/data/WordBreakTest.txt | 841 +- tests/data/line-break-exceptions.lisp-expr | 4 +- tests/unicode-properties.pure.lisp | 24 +- tools-for-build/BidiMirroring.txt | 14 +- tools-for-build/Blocks.txt | 19 +- tools-for-build/CaseFolding.txt | 91 +- tools-for-build/CompositionExclusions.txt | 12 +- tools-for-build/DerivedAge.txt | 73 +- tools-for-build/DerivedNormalizationProps.txt | 110 +- tools-for-build/EastAsianWidth.txt | 288 +- tools-for-build/Jamo.txt | 10 +- tools-for-build/LineBreak.txt | 282 +- tools-for-build/NormalizationCorrections.txt | 12 +- tools-for-build/PropList.txt | 222 +- tools-for-build/Scripts.txt | 157 +- tools-for-build/SpecialCasing.txt | 11 +- tools-for-build/UnicodeData.txt | 1383 +- tools-for-build/allkeys.txt | 55501 ++++++++-------- tools-for-build/more-ucd-consts.lisp-expr | 8 +- tools-for-build/ucd.lisp | 67 +- 32 files changed, 41613 insertions(+), 32576 deletions(-) diff --git a/make-host-1.lisp b/make-host-1.lisp index 09d02c10db..0fe6c495cd 100644 --- a/make-host-1.lisp +++ b/make-host-1.lisp @@ -89,21 +89,33 @@ "tools-for-build/DerivedNormalizationProps.txt" "tools-for-build/more-ucd-consts.lisp-expr")) (outputs '("output/bidi-mirrors.lisp-expr" - "output/block-ranges.lisp-expr" + "output/BidiMirroring.txt" "output/block-names.lisp-expr" + "output/block-ranges.lisp-expr" + "output/Blocks.txt" "output/case.dat" "output/CaseFolding.txt" "output/casepages.dat" "output/casepages.lisp-expr" "output/collation.dat" "output/comp.dat" + "output/CompositionExclusions.txt" "output/confusables.lisp-expr" "output/decomp.dat" + "output/DerivedAge.txt" + "output/DerivedNormalizationProps.txt" + "output/EastAsianWidth.txt" "output/foldcases.lisp-expr" + "output/Jamo.txt" + "output/LineBreak.txt" "output/misc-properties.lisp-expr" "output/n-collation-entries.lisp-expr" + "output/NormalizationCorrections.txt" "output/numerics.lisp-expr" "output/other-collation-info.lisp-expr" + "output/PropList.txt" + "output/Scripts.txt" + "output/SpecialCasing.txt" "output/titlecases.lisp-expr" "output/ucd1-names.lisp-expr" "output/ucdhigh.dat" diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 7f937bbeb7..1fcb87629d 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -262,7 +262,7 @@ Ideographic (:ID) class instead of Alphabetic (:AL)." (case raw-class (:ai (if (eql resolve :east-asian) :ID :AL)) ; If we see :CM when resolving, we have a CM that isn't subject - ; to LB9, so we do LB10 + ; to LB9, so we do LB10 (:ZWJ handled in LINE-BREAK-ANNOTATE) ((:xx :cm) :al) (:sa (if (member (general-category character) '(:Mn :Mc)) :CM :AL)) @@ -769,10 +769,46 @@ The result is not guaranteed to have the same length as the input." ;;; In all the breaking methods: ;;; (brk) establishes a break between `first` and `second` ;;; (nobrk) prevents a break between `first` and `second` -;;; Setting flag=T/state=:nobrk-next prevents a break between `second` and `htird` +;;; Setting flag=T/state=:nobrk-next prevents a break between `second` and `third` + +;;; Unicode 9.0-10.0 only: obsoleted in 11.0 +(defun emoji-grapheme-break-class (char) + (let ((code (char-code char)) + (e-base + #(#x261D + #x26F9 + #x270A #x270B #x270C #x270D + #x1F385 + #x1F3C3 #x1F3C4 + #x1F3CA #x1F3CB + #x1F442 #x1F443 + #x1F446 #x1F447 #x1F448 #x1F449 #x1F44A #x1F44B #x1F44C #x1F44D #x1F44E #x1F44F #x1F450 + #x1F46E + #x1F470 #x1F471 #x1F472 #x1F473 #x1F474 #x1F475 #x1F476 #x1F477 #x1F478 + #x1F47C + #x1F481 #x1F482 #x1F483 + #x1F485 #x1F486 #x1F487 + #x1F4AA + #x1F575 + #x1F57A + #x1F590 + #x1F595 #x1F596 + #x1F645 #x1F646 #x1F647 + #x1F64B #x1F64C #x1F64D #x1F64E #x1F64F + #x1F6A3 + #x1F6B4 #x1F6B5 #x1F6B6 + #x1F6C0 + #x1F918 #x1F919 #x1F91A #x1F91B #x1F91C #x1F91D #x1F91E + #x1F926 + #x1F930 + #x1F933 #x1F934 #x1F935 #x1F936 #x1F937 #x1F938 #x1F939 + #x1F93C #x1F93D #x1F93E))) + (cond + ((binary-search code e-base) :e-base) + ((<= #x1F3FB code #x1F3FF) :e-modifier) + ((or (= code #x2764) (= code #x1F48B) (= code #x1F5E8)) :glue-after-zwj) + ((<= #x1F466 code #x1F469) :e-base-gaz)))) -;; Word breaking sets this to make their algorithms less tricky -(defvar *other-break-special-graphemes* nil) (defun grapheme-break-class (char) "Returns the grapheme breaking class of CHARACTER, as specified in UAX #29." (let ((cp (when char (char-code char))) @@ -787,36 +823,53 @@ The result is not guaranteed to have the same length as the input." ((not char) nil) ((= cp 10) :LF) ((= cp 13) :CR) - ((or (member gc '(:Mn :Me)) - (proplist-p char :other-grapheme-extend) - (and *other-break-special-graphemes* - (member gc '(:Mc :Cf)) (not (<= #x200B cp #x200D)))) - :extend) - ((or (member gc '(:Zl :Zp :Cc :Cs :Cf)) + ((or (and (member gc '(:Zl :Zp :Cc :Cs :Cf)) + (not (proplist-p char :prepended-concatenation-mark)) + (not (<= #x200C cp #x200D)) + ;; not documented but in the normative file + (not (<= #xE0020 cp #xE007F))) ;; From Cn and Default_Ignorable_Code_Point (eql cp #x2065) (eql cp #xE0000) (<= #xFFF0 cp #xFFF8) (<= #xE0002 cp #xE001F) (<= #xE0080 cp #xE00FF) (<= #xE01F0 cp #xE0FFF)) :control) + ((or (member gc '(:Mn :Me)) + (proplist-p char :other-grapheme-extend)) + :extend) + ((= cp #x200D) :zwj) ((<= #x1F1E6 cp #x1F1FF) :regional-indicator) + ((or + ;; Consonant_Preceding_Repha + (= cp #x0D4E) (= cp #x11941) (= cp #x11D46) + ;; Consonant_Prefixed + (<= #x111C2 cp #x111C3) (= cp #x1193F) (= cp #x11A3A) (<= #x11A84 cp #x11A89) + (proplist-p char :prepended-concatenation-mark)) + :prepend) ((and (or (eql gc :Mc) (eql cp #x0E33) (eql cp #x0EB3)) (not (binary-search cp not-spacing-mark))) :spacing-mark) - (t (hangul-syllable-type char))))) + ((hangul-syllable-type char)) + ((emoji-grapheme-break-class char))))) (macrolet ((def (name extendedp) `(defun ,name (function string) - (do ((length (length string)) - (start 0) - (end 1 (1+ end)) - (c1 nil) - (c2 (and (> (length string) 0) (grapheme-break-class (char string 0))))) - ((>= end length) - (if (= end length) (progn (funcall function string start end) nil))) + (do* ((length (length string)) + (start 0) + (end 1 (1+ end)) + (c1 nil) + (c2 (and (> (length string) 0) (grapheme-break-class (char string 0)))) + (emoji-modifier-sequence-p nil) + (nri (if (eql c2 :regional-indicator) 1 0))) + ((>= end length) + (if (= end length) (progn (funcall function string start end) nil))) (flet ((brk () (funcall function string start end) (setf start end))) (declare (truly-dynamic-extent #'brk)) (shiftf c1 c2 (grapheme-break-class (char string end))) + (if (eql c2 :regional-indicator) (incf nri) (setf nri 0)) + (setf emoji-modifier-sequence-p + (or (member c1 '(:e-base :e-base-gaz)) + (and emoji-modifier-sequence-p (eql c1 :extend)))) (cond ((and (eql c1 :cr) (eql c2 :lf))) ((or (member c1 '(:control :cr :lf)) @@ -826,10 +879,12 @@ The result is not guaranteed to have the same length as the input." (and (or (eql c1 :v) (eql c1 :lv)) (or (eql c2 :v) (eql c2 :t))) (and (eql c2 :t) (or (eql c1 :lvt) (eql c1 :t))))) - ((and (eql c1 :regional-indicator) (eql c2 :regional-indicator))) - ((eql c2 :extend)) + ((member c2 '(:extend :zwj))) ,@(when extendedp - `(((or (eql c2 :spacing-mark) (eql c1 :prepend))))) + `(((or (eql c2 :spacing-mark) (eql c1 :prepend))))) + ((and emoji-modifier-sequence-p (eql c2 :e-modifier))) + ((and (eql c1 :zwj) (member c2 '(:glue-after-zwj :e-base-gaz)))) + ((and (eql c1 :regional-indicator) (eql c2 :regional-indicator) (evenp nri))) (t (brk)))))))) (def map-legacy-grapheme-boundaries nil) (def map-grapheme-boundaries t)) @@ -876,11 +931,10 @@ grapheme breaking rules specified in UAX #29, returning a list of strings." ((not char) nil) ((= cp 10) :LF) ((= cp 13) :CR) - ((= cp #x27) :single-quote) - ((= cp #x22) :double-quote) ((ordered-ranges-member cp newlines) :newline) ((or (eql (grapheme-break-class char) :extend) (eql gc :mc)) :extend) + ((= cp #x200D) :zwj) ((<= #x1F1E6 cp #x1F1FF) :regional-indicator) ((and (eql gc :Cf) (not (<= #x200B cp #x200D))) :format) ((or (eql (script char) :katakana) @@ -890,12 +944,15 @@ grapheme breaking rules specified in UAX #29, returning a list of strings." (not (or (ideographic-p char) (eql (line-break-class char) :sa) (eql (script char) :hiragana)))) :aletter) + ((= cp #x27) :single-quote) + ((= cp #x22) :double-quote) ((binary-search cp midnumlet) :midnumlet) ((binary-search cp midletter) :midletter) ((binary-search cp midnum) :midnum) ((or (and (eql gc :Nd) (not (<= #xFF10 cp #xFF19))) ;Fullwidth digits (eql cp #x066B)) :numeric) - ((eql gc :Pc) :extendnumlet) + ((or (eql gc :Pc) (= cp #x202F)) :extendnumlet) + ((emoji-grapheme-break-class char)) (t nil)))) (defmacro flatpush (thing list) @@ -909,28 +966,52 @@ grapheme breaking rules specified in UAX #29, returning a list of strings." (defun words (string) "Breaks STRING into words according to the default word breaking rules specified in UAX #29. Returns a list of strings" - (let ((chars (mapcar - #'(lambda (s) - (let ((l (coerce s 'list))) - (if (cdr l) l (car l)))) - (let ((*other-break-special-graphemes* t)) (graphemes string)))) - words word flag) + (let ((chars (coerce string 'list)) + words word flag) (flatpush (car chars) word) (do ((first (car chars) second) (tail (cdr chars) (cdr tail)) - (second (cadr chars) (cadr tail))) + (second (cadr chars) (cadr tail)) + (nri 0)) ((not first) (nreverse (mapcar #'(lambda (l) (coerce l 'string)) words))) - (flet ((brk () (push (nreverse word) words) (setf word nil) (flatpush second word)) + (flet ((extended-word-break-class (list) + (loop for tail on list + for thing = (car tail) + for class = (word-break-class thing) + while thing + unless (or (eql class :format) (eql class :extend) (eql class :zwj)) + return class)) + (brk () (push (nreverse word) words) (setf word nil) (flatpush second word)) (nobrk () (flatpush second word))) (let ((c1 (word-break-class first)) (c2 (word-break-class second)) - (c3 (when (and tail (cdr tail)) (word-break-class (cadr tail))))) + (c3 (extended-word-break-class (cdr tail)))) + (when (eql c1 :regional-indicator) + (incf nri (if (atom first) 1 (count :regional-indicator first :key #'word-break-class)))) (cond - (flag (nobrk) (setf flag nil)) + ;; handle multiple no-breaks + (flag + (nobrk) + (unless (or (eql c2 :format) (eql c2 :extend) (eql c2 :zwj)) + (setf flag nil))) + ((and (eql c1 :cr) (eql c2 :lf)) (nobrk)) ;; CR+LF are bound together by the grapheme clustering ((or (eql c1 :newline) (eql c1 :cr) (eql c1 :lf) (eql c2 :newline) (eql c2 :cr) (eql c2 :lf)) (brk)) - ((or (eql c2 :format) (eql c2 :extend)) (nobrk)) + ((and (eql c1 :zwj) + (or (eql c2 :glue-after-zwj) (eql c2 :e-base-gaz))) + (nobrk)) + ((or (eql c2 :format) (eql c2 :extend) (eql c2 :zwj)) + ;; handle Any x (Format|Extend|ZWJ) + (nobrk) + ;; handle "Ignore except after sot, CR, LF, Newline [and ZWJ]" + (unless (member c1 '(:cr :lf :newline :zwj)) + ;; so that the next iteration preserves first: + (setf second first) + ;; so that we don't spuriously count the preserved first + ;; as a new regional-indicator: + (when (eql c1 :regional-indicator) + (decf nri (if (atom first) 1 (count :regional-indicator first :key #'word-break-class)))))) ((and (or (eql c1 :aletter) (eql c1 :hebrew-letter)) (or (eql c2 :aletter) (eql c2 :hebrew-letter))) (nobrk)) ((and (or (eql c1 :aletter) (eql c1 :hebrew-letter)) @@ -956,7 +1037,11 @@ word breaking rules specified in UAX #29. Returns a list of strings" '(:aletter :hebrew-letter :katakana :numeric :extendnumlet)) (eql c1 :extendnumlet))) (nobrk)) - ((and (eql c1 :regional-indicator) (eql c2 :regional-indicator)) (nobrk)) + ((and (or (eql c1 :e-base) (eql c1 :e-base-gaz)) + (eql c2 :e-modifier)) + (nobrk)) + ((and (eql c1 :regional-indicator) (eql c2 :regional-indicator) (oddp nri)) + (nobrk)) (t (brk)))))))) (defun sentence-break-class (char) @@ -974,6 +1059,7 @@ word breaking rules specified in UAX #29. Returns a list of strings" ((= cp 10) :LF) ((= cp 13) :CR) ((or (eql (grapheme-break-class char) :extend) + (= cp #x200D) (eql gc :mc)) :extend) ((or (eql cp #x0085) (<= #x2028 cp #x2029)) :sep) ((and (eql gc :Cf) (not (<= #x200C cp #x200D))) :format) @@ -985,7 +1071,7 @@ word breaking rules specified in UAX #29. Returns a list of strings" (<= #x066B cp #x066C)) :numeric) ((binary-search cp aterms) :aterm) ((binary-search cp scontinues) :scontinue) - ((proplist-p char :sterm) :sterm) + ((proplist-p char :sentence-terminal) :sterm) ((and (or (member gc '(:Po :Ps :Pe :Pf :Pi)) (eql (line-break-class char) :qu))) :close) @@ -1101,14 +1187,15 @@ sentence breaking rules specified in UAX #29" (when (and cluster (or - (not (eql type :cm)) - (and (eql type :cm) + (not (or (eql type :cm) (eql type :zwj))) + (and (or (eql type :cm) (eql type :zwj)) (member last-seen '(nil :BK :CR :LF :NL :SP :ZW))))) (if (cdr cluster) (push (nreverse cluster) clusters) (push (car cluster) clusters)) (setf cluster nil)) - (unless (eql type :cm) (setf last-seen type)) + (unless (or (eql type :cm) (eql type :zwj)) + (setf last-seen type)) (push char cluster)) (if (cdr cluster) (push (nreverse cluster) clusters) @@ -1118,7 +1205,7 @@ sentence breaking rules specified in UAX #29" (defun line-break-annotate (string) (let ((chars (line-prebreak string)) first second t1 t2 tail (ret (list :cant)) - state after-spaces) + state after-spaces nri) (macrolet ((cmpush (thing) (let ((gthing (gensym))) `(let ((,gthing ,thing)) @@ -1130,7 +1217,9 @@ sentence breaking rules specified in UAX #29" (between (a b action) (let ((atest (if (eql a :any) t (if (listp a) - `(member t1 ,a) + (if (eql (car a) 'not) + `(not (member t1 ,(cadr a))) + `(member t1 ,a)) `(eql t1 ,a)))) (btest (if (eql b :any) t (if (listp b) @@ -1170,73 +1259,78 @@ sentence breaking rules specified in UAX #29" (setf first (car chars)) (setf tail (cdr chars)) (setf second (car tail)) + (setf nri 0) (tagbody - top + top (when (not first) (go end)) (setf t1 (line-break-class first :resolve t)) (setf t2 (line-break-class second :resolve t)) - (between :any :nil :must) + (if (and (eql t1 :ri) (eql t2 :ri)) (incf nri) (setf nri 0)) + (between :any :nil :must) ; LB3 (when (and (eql state :eat-spaces) (eql t2 :sp)) - (cmpush :cant) (cmpush second) (go tail)) - (between :bk :any :must) - (between :cr :lf :cant) - (between '(:cr :lf :nl) :any :must) - (between :any '(:zw :bk :cr :lf :nl) :cant) + (cmpush :cant) (cmpush second) (go tail)) + (between :bk :any :must) ; LB4 + (between :cr :lf :cant) ; LB5 + (between '(:cr :lf :nl) :any :must) ; LB5 + (between :any '(:zw :bk :cr :lf :nl) :cant) ; LB6, LB7 (when after-spaces (cmpush after-spaces) (cmpush second) (setf state nil after-spaces nil) (go tail)) - (after-spaces :zw :any :can) - (between :any :wj :cant) - (between :wj :any :cant) - (between :gl :any :cant) - (between '(:ZW :WJ :SY :SG :SA :RI :QU :PR :PO :OP :NU :NS :NL - :LF :IS :IN :ID :HL :GL :EX :CR :CP :CM :CL :CJ :CB - :BK :BB :B2 :AL :AI :JL :JV :JT :H2 :H3 :XX) - :gl :cant) - (between :any '(:cl :cp :ex :is :sy) :cant) - (after-spaces :op :any :cant) - (after-spaces :qu :op :cant) - (after-spaces '(:cl :cp) :ns :cant) - (after-spaces :b2 :b2 :cant) - (between :any :sp :cant) ;; Goes here to deal with after-spaces - (between :sp :any :can) - (between :any :qu :cant) - (between :qu :any :cant) - (between :any :cb :can) - (between :cb :any :can) + (after-spaces :zw :any :can) ; LB8 + (between :zwj '(:id :eb :em) :cant) ; LB8a + ;; LB9 and LB10 (for CM) handled in LINE-BREAK-CLASS / LINE-PREBREAK + (when (eql t1 :zwj) (setf t1 :al)) ; LB10 (for ZWJ) + (when (eql t2 :zwj) (setf t2 :al)) ; LB10 (for ZWJ) + (between :any :wj :cant) ; LB11 + (between :wj :any :cant) ; LB11 + (between :gl :any :cant) ; LB12 + (between (not '(:sp :ba :hy)) :gl :cant) ; LB12a + (between :any '(:cl :cp :ex :is :sy) :cant) ; LB13 + (after-spaces :op :any :cant) ; LB14 + (after-spaces :qu :op :cant) ; LB15 + (after-spaces '(:cl :cp) :ns :cant) ; LB16 + (after-spaces :b2 :b2 :cant) ; LB17 + (between :any :sp :cant) ; LB7, here after all AFTER-SPACES calls + (between :sp :any :can) ; LB18 + (between :any :qu :cant) ; LB19 + (between :qu :any :cant) ; LB19 + (between :any :cb :can) ; LB20 + (between :cb :any :can) ; LB20 (when (and (eql t1 :hl) (member t2 '(:hy :ba))) (cmpush :cant) (cmpush second) (setf first second tail (cdr tail)) (setf second (car tail)) (cmpush (if second :cant :must)) (cmpush second) - (setf after-spaces :can) (go tail)) - (between :any '(:ba :hy :ns) :cant) - (between :bb :any :cant) - (between :sy :hl :cant) - (between '(:al :hl :ex :id :in :nu) :in :cant) - (between :id :po :cant) - (between '(:al :hl) :nu :cant) - (between '(:nu :po) '(:al :hl) :cant) - (between :pr '(:id :al :hl) :cant) - (between '(:cl :cp :nu) '(:po :pr) :cant) - (between :nu '(:po :pr :nu) :cant) - (between '(:po :pr) :op :cant) - (between '(:po :pr :hy :is :sy) :nu :cant) - (between :jl '(:jl :jv :h2 :h3) :cant) - (between '(:jv :h2) '(:jv :jt) :cant) - (between '(:jt :h3) :jt :cant) - (between '(:jl :jv :jt :h2 :h3) '(:in :po) :cant) - (between :pr '(:jl :jv :jt :h2 :h3) :cant) - (between '(:al :hl :is) '(:al :hl) :cant) - (between '(:al :hl :nu) :op :cant) - (between :cp '(:al :hl :nu) :cant) - (between :ri :ri :cant) - (between :any :any :can) - tail + (setf after-spaces :can) (go tail)) ; LB21a + (between :any '(:ba :hy :ns) :cant) ; LB21 + (between :bb :any :cant) ; LB21 + (between :sy :hl :cant) ; LB21b + (between '(:al :hl :ex :id :eb :em :in :nu) :in :cant) ; LB22 + (between '(:al :hl) :nu :cant) ; LB23 + (between :nu '(:al :hl) :cant) ; LB23 + (between :pr '(:id :eb :em) :cant) ; LB23a + (between '(:id :eb :em) :po :cant) ; LB23a + (between '(:pr :po) '(:al :hl) :cant) ; LB24 + (between '(:al :hl) '(:pr :po) :cant) ; LB24 + (between '(:cl :cp :nu) '(:po :pr) :cant) ; LB25, first six cases + (between '(:po :pr) :op :cant) ; LB25, two ? x OP cases + (between '(:po :pr :hy :is :sy :nu) :nu :cant) ; LB25, six ? x NU cases + (between :jl '(:jl :jv :h2 :h3) :cant) ; LB26 + (between '(:jv :h2) '(:jv :jt) :cant) ; LB26 + (between '(:jt :h3) :jt :cant) ; LB26 + (between '(:jl :jv :jt :h2 :h3) '(:in :po) :cant) ; LB27 + (between :pr '(:jl :jv :jt :h2 :h3) :cant) ; LB27 + (between '(:al :hl :is) '(:al :hl) :cant) ; LB28, LB29 + (between '(:al :hl :nu) :op :cant) ; LB30 + (between :cp '(:al :hl :nu) :cant) ; LB30 + (between :ri :ri (if (oddp nri) :cant :can)) ; LB30a + (between :eb :em :cant) + (between :any :any :can) ; LB31 + tail (setf first second) (setf tail (cdr tail)) (setf second (car tail)) (go top) - end) + end) ;; LB3 satisfied by (:any :nil) -> :must (setf ret (nreverse ret)) ret))) @@ -1334,14 +1428,16 @@ it defaults to 80 characters" (unpack-collation-key packed-key) (when (char= (code-char 0) char2 char3) (let* ((unified-ideograph-p (proplist-p char1 :unified-ideograph)) + (tangut-p (<= #x17000 code1 #x18AFF)) (base (cond ((and unified-ideograph-p (or (<= #x4E00 code1 #x9FFF) (<= #xF900 code1 #xFAFF))) #xFB40) (unified-ideograph-p #xFB80) + (tangut-p #xFB00) (t #xFBC0))) - (a (+ base (ash code1 -15))) - (b (logior #.(ash 1 15) (logand code1 #x7FFF)))) + (a (+ base (if tangut-p 0 (ash code1 -15)))) + (b (logior #x8000 (if tangut-p (- code1 #x17000) (logand code1 #x7FFF))))) (list (list a #x20 #x2) (list b 0 0)))))))) (defun sort-key (string) diff --git a/tests/data/CollationTest_SHIFTED_SHORT.txt b/tests/data/CollationTest_SHIFTED_SHORT.txt index 1218f220d4..8091f9c864 100644 --- a/tests/data/CollationTest_SHIFTED_SHORT.txt +++ b/tests/data/CollationTest_SHIFTED_SHORT.txt @@ -1,7 +1,10 @@ -# File: CollationTest_SHIFTED_SHORT.txt -# UCA Version: 8.0.0 -# UCD Version: 8.0.0 -# Generated: 2015-05-14 [MS] +# CollationTest_SHIFTED_SHORT.txt +# Date: 2016-04-04, 20:31:42 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# UCA Version: 9.0.0 +# UCD Version: 9.0.0 # For a description of the format and usage, see CollationTest.html 0009 0021 @@ -120,6 +123,8 @@ FE58 003F 2E3B 003F 2053 0021 2053 003F +2E43 0021 +2E43 003F 2E17 0021 2E17 003F 2E40 0021 @@ -431,6 +436,21 @@ A6F4 003F 0749 0021 074A 0021 07FA 0021 +08D4 0021 +08D5 0021 +08D6 0021 +08D7 0021 +08D8 0021 +08D9 0021 +08DA 0021 +08DB 0021 +08DC 0021 +08DD 0021 +08DE 0021 +08DF 0021 +08E0 0021 +08E1 0021 +08E2 0021 08EA 0021 08EB 0021 08EC 0021 @@ -1126,6 +1146,9 @@ FF01 003F 07F9 003F 1944 0021 1944 003F +1E95E 0334 +1E95E 0021 +1E95E 003F 0000 003F 0001 003F 0002 003F @@ -1271,6 +1294,21 @@ FF01 003F 0749 003F 074A 003F 07FA 003F +08D4 003F +08D5 003F +08D6 003F +08D7 003F +08D8 003F +08D9 003F +08DA 003F +08DB 003F +08DC 003F +08DD 003F +08DE 003F +08DF 003F +08E0 003F +08E1 003F +08E2 003F 08EA 003F 08EB 003F 08EC 003F @@ -1985,6 +2023,9 @@ AAF1 003F 11143 0334 11143 0021 11143 003F +1E95F 0334 +1E95F 0021 +1E95F 003F 203D 0021 203D 003F 2E18 0021 @@ -2149,6 +2190,12 @@ ABEB 003F 11239 0334 11239 0021 11239 003F +1144B 0334 +1144B 0021 +1144B 003F +1144C 0334 +1144C 0021 +1144C 003F 115C2 0334 115C2 0021 115C2 003F @@ -2167,6 +2214,12 @@ ABEB 003F 1173D 0334 1173D 0021 1173D 003F +11C41 0334 +11C41 0021 +11C41 003F +11C42 0334 +11C42 0021 +11C42 003F 16A6E 0334 16A6E 0021 16A6E 003F @@ -2850,6 +2903,8 @@ FF05 003F 2E1E 003F 2E1F 0021 2E1F 003F +2E44 0021 +2E44 003F A67E 0021 A67E 003F 055A 0021 @@ -2882,6 +2937,45 @@ A67E 003F 085E 003F 1800 0021 1800 003F +11660 0334 +11660 0021 +11660 003F +11661 0334 +11661 0021 +11661 003F +11662 0334 +11662 0021 +11662 003F +11663 0334 +11663 0021 +11663 003F +11664 0334 +11664 0021 +11664 003F +11665 0334 +11665 0021 +11665 003F +11666 0334 +11666 0021 +11666 003F +11667 0334 +11667 0021 +11667 003F +11668 0334 +11668 0021 +11668 003F +11669 0334 +11669 0021 +11669 003F +1166A 0334 +1166A 0021 +1166A 003F +1166B 0334 +1166B 0021 +1166B 003F +1166C 0334 +1166C 0021 +1166C 003F 0970 0021 0970 003F A8F8 0021 @@ -2952,6 +3046,12 @@ AADF 003F 0FD9 003F 0FDA 0021 0FDA 003F +11C70 0334 +11C70 0021 +11C70 003F +11C71 0334 +11C71 0021 +11C71 003F 1C3D 0021 1C3D 003F 1C3E 0021 @@ -3069,6 +3169,15 @@ AA5C 003F 10A58 0334 10A58 0021 10A58 003F +11C43 0334 +11C43 0021 +11C43 003F +11C44 0334 +11C44 0021 +11C44 003F +11C45 0334 +11C45 0021 +11C45 003F 10B39 0334 10B39 0021 10B39 003F @@ -3144,6 +3253,21 @@ AA5C 003F 1123D 0334 1123D 0021 1123D 003F +1144D 0334 +1144D 0021 +1144D 003F +1144E 0334 +1144E 0021 +1144E 003F +1144F 0334 +1144F 0021 +1144F 003F +1145B 0334 +1145B 0021 +1145B 003F +1145D 0334 +1145D 0021 +1145D 003F 114C6 0334 114C6 0021 114C6 003F @@ -3273,12 +3397,12 @@ FFE3 003F 02D9 0021 02D9 003F 00A8 0300 0334 +00A8 0334 0300 00A8 0334 0340 -00A8 0340 0334 1FED 0334 00A8 0301 0334 +00A8 0334 0301 00A8 0334 0341 -00A8 0341 0334 1FEE 0334 00A8 0334 0342 00A8 0342 0334 @@ -3301,13 +3425,13 @@ FFE3 003F 00B8 003F 02DB 0021 02DB 003F +1FBF 0300 0334 1FBF 0334 0300 -1FBF 0334 0340 1FBF 0340 0334 1FCD 0334 1FBF 0301 0334 1FBF 0334 0301 -1FBF 0334 0341 +1FBF 0341 0334 1FCE 0334 1FBF 0334 0342 1FBF 0342 0334 @@ -3323,13 +3447,13 @@ FFE3 003F 1FCE 003F 1FCF 003F 1FDD 0334 +1FFE 0300 0334 1FFE 0334 0300 1FFE 0334 0340 -1FFE 0340 0334 1FDE 0334 1FFE 0301 0334 +1FFE 0334 0301 1FFE 0334 0341 -1FFE 0341 0334 1FDF 0334 1FFE 0334 0342 1FFE 0342 0334 @@ -3627,6 +3751,8 @@ FBC1 003F 0BFA 003F 0C7F 0021 0C7F 003F +0D4F 0021 +0D4F 003F 0D79 0021 0D79 003F A828 0021 @@ -5312,6 +5438,14 @@ FF5E 003F 23F9 003F 23FA 0021 23FA 003F +23FB 0021 +23FB 003F +23FC 0021 +23FC 003F +23FD 0021 +23FD 003F +23FE 0021 +23FE 003F 2400 0021 2400 003F 2401 0021 @@ -9392,6 +9526,12 @@ A4C6 003F 1018C 0334 1018C 0021 1018C 003F +1018D 0334 +1018D 0021 +1018D 003F +1018E 0334 +1018E 0021 +1018E 003F 10190 0334 10190 0021 10190 003F @@ -10600,24 +10740,24 @@ A4C6 003F 1D15F 0334 1D158 0334 1D165 1D16E 1D158 1D165 0334 1D16E -1D158 1D165 1D16E 0334 +1D15F 0334 1D16E 1D15F 1D16E 0334 1D160 0334 1D158 1D165 0334 1D16F -1D158 1D165 1D16F 0334 +1D15F 0334 1D16F 1D15F 1D16F 0334 1D161 0334 -1D158 0334 1D165 1D170 1D158 1D165 0334 1D170 +1D158 1D165 1D170 0334 1D15F 1D170 0334 1D162 0334 -1D158 0334 1D165 1D171 1D158 1D165 0334 1D171 -1D15F 0334 1D171 +1D158 1D165 1D171 0334 +1D15F 1D171 0334 1D163 0334 -1D158 0334 1D165 1D172 1D158 1D165 0334 1D172 -1D15F 0334 1D172 +1D158 1D165 1D172 0334 +1D15F 1D172 0334 1D164 0334 1D158 0021 1D15F 0021 @@ -10791,12 +10931,13 @@ A4C6 003F 1D1B9 1D165 0334 1D1BB 0334 1D1B9 0334 1D165 1D16E -1D1B9 1D165 0334 1D16E +1D1B9 1D165 1D16E 0334 1D1BB 0334 1D16E +1D1BB 1D16E 0334 1D1BD 0334 1D1B9 0334 1D165 1D16F 1D1B9 1D165 0334 1D16F -1D1BB 0334 1D16F +1D1B9 1D165 1D16F 0334 1D1BB 1D16F 0334 1D1BF 0334 1D1B9 0021 @@ -10811,14 +10952,15 @@ A4C6 003F 1D1BA 0334 1D165 1D1BA 1D165 0334 1D1BC 0334 +1D1BA 1D165 0334 1D16E 1D1BA 1D165 1D16E 0334 1D1BC 0334 1D16E 1D1BC 1D16E 0334 1D1BE 0334 1D1BA 0334 1D165 1D16F -1D1BA 1D165 0334 1D16F 1D1BA 1D165 1D16F 0334 1D1BC 0334 1D16F +1D1BC 1D16F 0334 1D1C0 0334 1D1BA 0021 1D1BC 0021 @@ -13732,6 +13874,9 @@ A4C6 003F 1F579 0334 1F579 0021 1F579 003F +1F57A 0334 +1F57A 0021 +1F57A 003F 1F57B 0334 1F57B 0021 1F57B 003F @@ -13855,6 +14000,9 @@ A4C6 003F 1F5A3 0334 1F5A3 0021 1F5A3 003F +1F5A4 0334 +1F5A4 0021 +1F5A4 003F 1F5A5 0334 1F5A5 0021 1F5A5 003F @@ -14155,6 +14303,168 @@ A4C6 003F 1F918 0334 1F918 0021 1F918 003F +1F919 0334 +1F919 0021 +1F919 003F +1F91A 0334 +1F91A 0021 +1F91A 003F +1F91B 0334 +1F91B 0021 +1F91B 003F +1F91C 0334 +1F91C 0021 +1F91C 003F +1F91D 0334 +1F91D 0021 +1F91D 003F +1F91E 0334 +1F91E 0021 +1F91E 003F +1F920 0334 +1F920 0021 +1F920 003F +1F921 0334 +1F921 0021 +1F921 003F +1F922 0334 +1F922 0021 +1F922 003F +1F923 0334 +1F923 0021 +1F923 003F +1F924 0334 +1F924 0021 +1F924 003F +1F925 0334 +1F925 0021 +1F925 003F +1F926 0334 +1F926 0021 +1F926 003F +1F927 0334 +1F927 0021 +1F927 003F +1F930 0334 +1F930 0021 +1F930 003F +1F933 0334 +1F933 0021 +1F933 003F +1F934 0334 +1F934 0021 +1F934 003F +1F935 0334 +1F935 0021 +1F935 003F +1F936 0334 +1F936 0021 +1F936 003F +1F937 0334 +1F937 0021 +1F937 003F +1F938 0334 +1F938 0021 +1F938 003F +1F939 0334 +1F939 0021 +1F939 003F +1F93A 0334 +1F93A 0021 +1F93A 003F +1F93B 0334 +1F93B 0021 +1F93B 003F +1F93C 0334 +1F93C 0021 +1F93C 003F +1F93D 0334 +1F93D 0021 +1F93D 003F +1F93E 0334 +1F93E 0021 +1F93E 003F +1F940 0334 +1F940 0021 +1F940 003F +1F941 0334 +1F941 0021 +1F941 003F +1F942 0334 +1F942 0021 +1F942 003F +1F943 0334 +1F943 0021 +1F943 003F +1F944 0334 +1F944 0021 +1F944 003F +1F945 0334 +1F945 0021 +1F945 003F +1F946 0334 +1F946 0021 +1F946 003F +1F947 0334 +1F947 0021 +1F947 003F +1F948 0334 +1F948 0021 +1F948 003F +1F949 0334 +1F949 0021 +1F949 003F +1F94A 0334 +1F94A 0021 +1F94A 003F +1F94B 0334 +1F94B 0021 +1F94B 003F +1F950 0334 +1F950 0021 +1F950 003F +1F951 0334 +1F951 0021 +1F951 003F +1F952 0334 +1F952 0021 +1F952 003F +1F953 0334 +1F953 0021 +1F953 003F +1F954 0334 +1F954 0021 +1F954 003F +1F955 0334 +1F955 0021 +1F955 003F +1F956 0334 +1F956 0021 +1F956 003F +1F957 0334 +1F957 0021 +1F957 003F +1F958 0334 +1F958 0021 +1F958 003F +1F959 0334 +1F959 0021 +1F959 003F +1F95A 0334 +1F95A 0021 +1F95A 003F +1F95B 0334 +1F95B 0021 +1F95B 003F +1F95C 0334 +1F95C 0021 +1F95C 003F +1F95D 0334 +1F95D 0021 +1F95D 003F +1F95E 0334 +1F95E 0021 +1F95E 003F 1F980 0334 1F980 0021 1F980 003F @@ -14170,6 +14480,45 @@ A4C6 003F 1F984 0334 1F984 0021 1F984 003F +1F985 0334 +1F985 0021 +1F985 003F +1F986 0334 +1F986 0021 +1F986 003F +1F987 0334 +1F987 0021 +1F987 003F +1F988 0334 +1F988 0021 +1F988 003F +1F989 0334 +1F989 0021 +1F989 003F +1F98A 0334 +1F98A 0021 +1F98A 003F +1F98B 0334 +1F98B 0021 +1F98B 003F +1F98C 0334 +1F98C 0021 +1F98C 003F +1F98D 0334 +1F98D 0021 +1F98D 003F +1F98E 0334 +1F98E 0021 +1F98E 003F +1F98F 0334 +1F98F 0021 +1F98F 003F +1F990 0334 +1F990 0021 +1F990 003F +1F991 0334 +1F991 0021 +1F991 003F 1F9C0 0334 1F9C0 0021 1F9C0 003F @@ -14800,6 +15149,12 @@ A4C6 003F 1F6D0 0334 1F6D0 0021 1F6D0 003F +1F6D1 0334 +1F6D1 0021 +1F6D1 003F +1F6D2 0334 +1F6D2 0021 +1F6D2 003F 1F6E0 0334 1F6E0 0021 1F6E0 003F @@ -14851,6 +15206,15 @@ A4C6 003F 1F6F3 0334 1F6F3 0021 1F6F3 003F +1F6F4 0334 +1F6F4 0021 +1F6F4 003F +1F6F5 0334 +1F6F5 0021 +1F6F5 003F +1F6F6 0334 +1F6F6 0021 +1F6F6 003F 1F700 0334 1F700 0021 1F700 003F @@ -17680,6 +18044,20 @@ A835 003F 0BF1 003F 0BF2 0021 0BF2 003F +0D58 0021 +0D58 003F +0D59 0021 +0D59 003F +0D5A 0021 +0D5A 003F +0D5B 0021 +0D5B 003F +0D5C 0021 +0D5C 003F +0D5D 0021 +0D5D 003F +0D5E 0021 +0D5E 003F 0D70 0021 0D70 003F 0D71 0021 @@ -17692,6 +18070,12 @@ A835 003F 0D74 003F 0D75 0021 0D75 003F +0D76 0021 +0D76 003F +0D77 0021 +0D77 003F +0D78 0021 +0D78 003F 1372 0021 1372 003F 1373 0021 @@ -18271,6 +18655,36 @@ A835 003F 10A47 0334 10A47 0021 10A47 003F +11C63 0334 +11C63 0021 +11C63 003F +11C64 0334 +11C64 0021 +11C64 003F +11C65 0334 +11C65 0021 +11C65 003F +11C66 0334 +11C66 0021 +11C66 003F +11C67 0334 +11C67 0021 +11C67 003F +11C68 0334 +11C68 0021 +11C68 003F +11C69 0334 +11C69 0021 +11C69 003F +11C6A 0334 +11C6A 0021 +11C6A 003F +11C6B 0334 +11C6B 0021 +11C6B 003F +11C6C 0334 +11C6C 0021 +11C6C 003F 111EA 0334 111EA 0021 111EA 003F @@ -18705,6 +19119,7 @@ A835 003F 1DCE 0021 1DD1 0021 1DF5 0021 +1DFB 0021 1DFE 0021 20F0 0021 2CEF 0021 @@ -18765,6 +19180,7 @@ A67D 0021 1DCE 003F 1DD1 003F 1DF5 003F +1DFB 003F 1DFE 003F 20F0 003F 2CEF 003F @@ -19115,6 +19531,20 @@ FF9F 003F 0749 0334 0334 074A 074A 0334 +08D4 0334 +08D5 0334 +08D6 0334 +08D7 0334 +08D8 0334 +08D9 0334 +08DA 0334 +08DB 0334 +08DC 0334 +08DD 0334 +08DE 0334 +08DF 0334 +08E0 0334 +08E1 0334 0334 08EA 08EA 0334 0334 08EB @@ -19265,6 +19695,7 @@ FE2B 0334 FE2C 0334 0334 FE2D FE2D 0334 +0334 FE2F FE2F 0334 0334 102E0 102E0 0334 @@ -19896,8 +20327,8 @@ E01EF 0334 0342 0334 0308 0334 0334 0308 -0308 0334 0301 -0308 0334 0341 +0308 0301 0334 +0308 0341 0334 0334 0344 0344 0334 030B 0334 @@ -20004,6 +20435,7 @@ E01EF 0334 1DD1 0334 0334 1DF5 1DF5 0334 +1DFB 0334 0334 1DFE 1DFE 0334 0334 20F0 @@ -20185,6 +20617,7 @@ FE29 0334 FE20 0334 0334 0483 0483 0334 +0334 FE2E FE2E 0334 0334 A66F A66F 0334 @@ -20330,6 +20763,7 @@ FB1E 0334 065D 0334 0334 065E 065E 0334 +0334 08E3 08E3 0334 0334 08F7 08F7 0334 @@ -20409,6 +20843,13 @@ FB1E 0334 A6F0 0334 0334 A6F1 A6F1 0334 +1E944 0334 +1E945 0334 +1E946 0334 +1E94A 0334 +1E947 0334 +1E948 0334 +1E949 0334 0334 093C 093C 0334 0334 09BC @@ -20433,6 +20874,7 @@ A9B3 0334 110BA 0334 0334 11173 11173 0334 +0334 111CA 111CA 0334 0334 11236 11236 0334 @@ -20440,6 +20882,7 @@ A9B3 0334 112E9 0334 0334 1133C 1133C 0334 +11446 0334 0334 114C3 114C3 0334 0334 115C0 @@ -20748,11 +21191,14 @@ FE7C 003F FC63 0021 FC63 003F 0652 0021 +1123E 0021 0652 003F +1123E 003F FE7F 0021 FE7F 003F FE7E 0021 FE7E 003F +1123E 0334 0653 0021 0653 003F 0654 0021 @@ -20876,6 +21322,20 @@ A6F1 003F 16AF4 0021 16AF4 003F 16AF4 0334 +1E944 0021 +1E945 0021 +1E946 0021 +1E944 003F +1E945 003F +1E946 003F +1E94A 0021 +1E94A 003F +1E947 0021 +1E947 003F +1E948 0021 +1E948 003F +1E949 0021 +1E949 003F 093C 0021 09BC 0021 0A3C 0021 @@ -20892,6 +21352,7 @@ A9B3 0021 11236 0021 112E9 0021 1133C 0021 +11446 0021 114C3 0021 115C0 0021 116B7 0021 @@ -20911,6 +21372,7 @@ A9B3 003F 11236 003F 112E9 003F 1133C 003F +11446 003F 114C3 003F 115C0 003F 116B7 003F @@ -20926,15 +21388,19 @@ A9B3 003F 0D01 0021 1B00 0021 1B01 0021 +A8C5 0021 A980 0021 11000 0021 11080 0021 11100 0021 11180 0021 11301 0021 +11443 0021 114BF 0021 115BC 0021 11640 0021 +11C3C 0021 +11CB6 0021 0900 003F 0901 003F 0981 003F @@ -20947,22 +21413,29 @@ A980 0021 0D01 003F 1B00 003F 1B01 003F +A8C5 003F A980 003F 11000 003F 11080 003F 11100 003F 11180 003F 11301 003F +11443 003F 114BF 003F 115BC 003F 11640 003F +11C3C 003F +11CB6 003F 11000 0334 11080 0334 11180 0334 11301 0334 +11443 0334 114BF 0334 115BC 0334 11640 0334 +11C3C 0334 +11CB6 0334 0902 0021 0982 0021 0A02 0021 @@ -20992,10 +21465,13 @@ A981 0021 112DF 0021 11300 0021 11302 0021 +11444 0021 114C0 0021 115BD 0021 1163D 0021 116AB 0021 +11C3D 0021 +11CB5 0021 0902 003F 0982 003F 0A02 003F @@ -21025,10 +21501,13 @@ A981 003F 112DF 003F 11300 003F 11302 003F +11444 003F 114C0 003F 115BD 003F 1163D 003F 116AB 003F +11C3D 003F +11CB5 003F 10A0E 0334 11001 0334 11081 0334 @@ -21037,10 +21516,13 @@ A981 003F 112DF 0334 11300 0334 11302 0334 +11444 0334 114C0 0334 115BD 0334 1163D 0334 116AB 0334 +11C3D 0334 +11CB5 0334 0903 0021 0983 0021 0A03 0021 @@ -21065,10 +21547,12 @@ A983 0021 11102 0021 11182 0021 11303 0021 +11445 0021 114C1 0021 115BE 0021 1163E 0021 116AC 0021 +11C3E 0021 0903 003F 0983 003F 0A03 003F @@ -21093,18 +21577,22 @@ A983 003F 11102 003F 11182 003F 11303 003F +11445 003F 114C1 003F 115BE 003F 1163E 003F 116AC 003F +11C3E 003F 11002 0334 11082 0334 11182 0334 11303 0334 +11445 0334 114C1 0334 115BE 0334 1163E 0334 116AC 0334 +11C3E 0334 0A70 0021 0A70 003F 0A71 0021 @@ -21348,6 +21836,12 @@ AAF4 0062 303B 0061 303B 0041 303B 0062 +16FE0 0021 +16FE0 003F +16FE0 0334 +16FE0 0061 +16FE0 0041 +16FE0 0062 3031 0021 3031 003F 3032 0021 @@ -21710,13 +22204,16 @@ ABF0 0021 11136 0021 111D0 0021 112F0 0021 +11450 0021 114D0 0021 11650 0021 116C0 0021 11730 0021 118E0 0021 +11C50 0021 16A60 0021 16B50 0021 +1E950 0021 0030 003F 0660 003F 06F0 003F @@ -21763,13 +22260,16 @@ ABF0 003F 11136 003F 111D0 003F 112F0 003F +11450 003F 114D0 003F 11650 003F 116C0 003F 11730 003F 118E0 003F +11C50 003F 16A60 003F 16B50 003F +1E950 003F FF10 0021 FF10 003F 1F101 0334 @@ -21809,13 +22309,16 @@ FF10 003F 11136 0334 111D0 0334 112F0 0334 +11450 0334 114D0 0334 11650 0334 116C0 0334 11730 0334 118E0 0334 +11C50 0334 16A60 0334 16B50 0334 +1E950 0334 1D7CE 0334 1D7D8 0334 1D7E2 0334 @@ -21874,13 +22377,16 @@ ABF0 0061 11136 0061 111D0 0061 112F0 0061 +11450 0061 114D0 0061 11650 0061 116C0 0061 11730 0061 118E0 0061 +11C50 0061 16A60 0061 16B50 0061 +1E950 0061 0030 0041 0660 0041 06F0 0041 @@ -21927,13 +22433,16 @@ ABF0 0041 11136 0041 111D0 0041 112F0 0041 +11450 0041 114D0 0041 11650 0041 116C0 0041 11730 0041 118E0 0041 +11C50 0041 16A60 0041 16B50 0041 +1E950 0041 FF10 0061 FF10 0041 1F101 0061 @@ -22010,13 +22519,16 @@ ABF0 0062 11136 0062 111D0 0062 112F0 0062 +11450 0062 114D0 0062 11650 0062 116C0 0062 11730 0062 118E0 0062 +11C50 0062 16A60 0062 16B50 0062 +1E950 0062 FF10 0062 1F101 0062 1F100 0062 @@ -22110,11 +22622,14 @@ ABF1 0021 111D1 0021 111E1 0021 112F1 0021 +11451 0021 114D1 0021 11651 0021 116C1 0021 11731 0021 118E1 0021 +11C51 0021 +11C5A 0021 12415 0021 1241E 0021 1242C 0021 @@ -22125,6 +22640,7 @@ ABF1 0021 16B51 0021 1D360 0021 1E8C7 0021 +1E951 0021 0031 003F 0661 003F 06F1 003F @@ -22198,11 +22714,14 @@ ABF1 003F 111D1 003F 111E1 003F 112F1 003F +11451 003F 114D1 003F 11651 003F 116C1 003F 11731 003F 118E1 003F +11C51 003F +11C5A 003F 12415 003F 1241E 003F 1242C 003F @@ -22213,6 +22732,7 @@ ABF1 003F 16B51 003F 1D360 003F 1E8C7 003F +1E951 003F FF11 0021 FF11 003F 2474 0021 @@ -22281,11 +22801,14 @@ FF11 003F 111D1 0334 111E1 0334 112F1 0334 +11451 0334 114D1 0334 11651 0334 116C1 0334 11731 0334 118E1 0334 +11C51 0334 +11C5A 0334 12415 0334 1241E 0334 1242C 0334 @@ -22296,6 +22819,7 @@ FF11 003F 16B51 0334 1D360 0334 1E8C7 0334 +1E951 0334 1D7CF 0334 1D7D9 0334 1D7E3 0334 @@ -22406,6 +22930,12 @@ FF11 003F 24EC 003F 00BD 0021 00BD 003F +1F1A4 0021 +1F1A4 003F +1F1A4 0334 +1F1A4 0061 +1F1A4 0041 +1F1A4 0062 247F 0061 2493 0061 247F 0041 @@ -22754,11 +23284,14 @@ ABF1 0061 111D1 0061 111E1 0061 112F1 0061 +11451 0061 114D1 0061 11651 0061 116C1 0061 11731 0061 118E1 0061 +11C51 0061 +11C5A 0061 12415 0061 1241E 0061 1242C 0061 @@ -22769,6 +23302,7 @@ ABF1 0061 16B51 0061 1D360 0061 1E8C7 0061 +1E951 0061 0031 0041 0661 0041 06F1 0041 @@ -22842,11 +23376,14 @@ ABF1 0041 111D1 0041 111E1 0041 112F1 0041 +11451 0041 114D1 0041 11651 0041 116C1 0041 11731 0041 118E1 0041 +11C51 0041 +11C5A 0041 12415 0041 1241E 0041 1242C 0041 @@ -22857,6 +23394,7 @@ ABF1 0041 16B51 0041 1D360 0041 1E8C7 0041 +1E951 0041 FF11 0061 FF11 0041 2474 0061 @@ -22966,11 +23504,14 @@ ABF1 0062 111D1 0062 111E1 0062 112F1 0062 +11451 0062 114D1 0062 11651 0062 116C1 0062 11731 0062 118E1 0062 +11C51 0062 +11C5A 0062 12415 0062 1241E 0062 1242C 0062 @@ -22981,6 +23522,7 @@ ABF1 0062 16B51 0062 1D360 0062 1E8C7 0062 +1E951 0062 FF11 0062 2474 0062 1F102 0062 @@ -23080,11 +23622,14 @@ ABF2 0021 111D2 0021 111E2 0021 112F2 0021 +11452 0021 114D2 0021 11652 0021 116C2 0021 11732 0021 118E2 0021 +11C52 0021 +11C5B 0021 12400 0021 12416 0021 1241F 0021 @@ -23099,6 +23644,7 @@ ABF2 0021 16B52 0021 1D361 0021 1E8C8 0021 +1E952 0021 0032 003F 0662 003F 06F2 003F @@ -23165,11 +23711,14 @@ ABF2 003F 111D2 003F 111E2 003F 112F2 003F +11452 003F 114D2 003F 11652 003F 116C2 003F 11732 003F 118E2 003F +11C52 003F +11C5B 003F 12400 003F 12416 003F 1241F 003F @@ -23184,6 +23733,7 @@ ABF2 003F 16B52 003F 1D361 003F 1E8C8 003F +1E952 003F FF12 0021 FF12 003F 2475 0021 @@ -23244,11 +23794,14 @@ FF12 003F 111D2 0334 111E2 0334 112F2 0334 +11452 0334 114D2 0334 11652 0334 116C2 0334 11732 0334 118E2 0334 +11C52 0334 +11C5B 0334 12400 0334 12416 0334 1241F 0334 @@ -23263,6 +23816,7 @@ FF12 003F 16B52 0334 1D361 0334 1E8C8 0334 +1E952 0334 1D7D0 0334 1D7DA 0334 1D7E4 0334 @@ -23320,6 +23874,12 @@ FF12 003F 336D 0062 3252 0021 3252 003F +1F1A2 0021 +1F1A2 003F +1F1A2 0334 +1F1A2 0061 +1F1A2 0041 +1F1A2 0062 3252 0061 3252 0041 3252 0062 @@ -23489,11 +24049,14 @@ ABF2 0061 111D2 0061 111E2 0061 112F2 0061 +11452 0061 114D2 0061 11652 0061 116C2 0061 11732 0061 118E2 0061 +11C52 0061 +11C5B 0061 12400 0061 12416 0061 1241F 0061 @@ -23508,6 +24071,7 @@ ABF2 0061 16B52 0061 1D361 0061 1E8C8 0061 +1E952 0061 0032 0041 0662 0041 06F2 0041 @@ -23574,11 +24138,14 @@ ABF2 0041 111D2 0041 111E2 0041 112F2 0041 +11452 0041 114D2 0041 11652 0041 116C2 0041 11732 0041 118E2 0041 +11C52 0041 +11C5B 0041 12400 0041 12416 0041 1241F 0041 @@ -23593,6 +24160,7 @@ ABF2 0041 16B52 0041 1D361 0041 1E8C8 0041 +1E952 0041 FF12 0061 FF12 0041 2475 0061 @@ -23693,11 +24261,14 @@ ABF2 0062 111D2 0062 111E2 0062 112F2 0062 +11452 0062 114D2 0062 11652 0062 116C2 0062 11732 0062 118E2 0062 +11C52 0062 +11C5B 0062 12400 0062 12416 0062 1241F 0062 @@ -23712,6 +24283,7 @@ ABF2 0062 16B52 0062 1D361 0062 1E8C8 0062 +1E952 0062 FF12 0062 2475 0062 1F103 0062 @@ -23729,6 +24301,18 @@ FF12 0062 278B 0062 00B2 0062 2082 0062 +1F19D 0021 +1F19D 003F +1F19D 0334 +1F19D 0061 +1F19D 0041 +1F19D 0062 +1F19C 0021 +1F19C 003F +1F19C 0334 +1F19C 0061 +1F19C 0041 +1F19C 0062 33E1 0021 33E1 003F 33E1 0061 @@ -23805,11 +24389,14 @@ ABF3 0021 111D3 0021 111E3 0021 112F3 0021 +11453 0021 114D3 0021 11653 0021 116C3 0021 11733 0021 118E3 0021 +11C53 0021 +11C5C 0021 12401 0021 12408 0021 12417 0021 @@ -23829,6 +24416,7 @@ ABF3 0021 16B53 0021 1D362 0021 1E8C9 0021 +1E953 0021 0033 003F 0663 003F 06F3 003F @@ -23890,11 +24478,14 @@ ABF3 003F 111D3 003F 111E3 003F 112F3 003F +11453 003F 114D3 003F 11653 003F 116C3 003F 11733 003F 118E3 003F +11C53 003F +11C5C 003F 12401 003F 12408 003F 12417 003F @@ -23914,6 +24505,7 @@ ABF3 003F 16B53 003F 1D362 003F 1E8C9 003F +1E953 003F FF13 0021 FF13 003F 2476 0021 @@ -23969,11 +24561,14 @@ FF13 003F 111D3 0334 111E3 0334 112F3 0334 +11453 0334 114D3 0334 11653 0334 116C3 0334 11733 0334 118E3 0334 +11C53 0334 +11C5C 0334 12401 0334 12408 0334 12417 0334 @@ -23993,6 +24588,7 @@ FF13 003F 16B53 0334 1D362 0334 1E8C9 0334 +1E953 0334 1D7D1 0334 1D7DB 0334 1D7E5 0334 @@ -24139,11 +24735,14 @@ ABF3 0061 111D3 0061 111E3 0061 112F3 0061 +11453 0061 114D3 0061 11653 0061 116C3 0061 11733 0061 118E3 0061 +11C53 0061 +11C5C 0061 12401 0061 12408 0061 12417 0061 @@ -24163,6 +24762,7 @@ ABF3 0061 16B53 0061 1D362 0061 1E8C9 0061 +1E953 0061 0033 0041 0663 0041 06F3 0041 @@ -24224,11 +24824,14 @@ ABF3 0041 111D3 0041 111E3 0041 112F3 0041 +11453 0041 114D3 0041 11653 0041 116C3 0041 11733 0041 118E3 0041 +11C53 0041 +11C5C 0041 12401 0041 12408 0041 12417 0041 @@ -24248,6 +24851,7 @@ ABF3 0041 16B53 0041 1D362 0041 1E8C9 0041 +1E953 0041 FF13 0061 FF13 0041 2476 0061 @@ -24343,11 +24947,14 @@ ABF3 0062 111D3 0062 111E3 0062 112F3 0062 +11453 0062 114D3 0062 11653 0062 116C3 0062 11733 0062 118E3 0062 +11C53 0062 +11C5C 0062 12401 0062 12408 0062 12417 0062 @@ -24367,6 +24974,7 @@ ABF3 0062 16B53 0062 1D362 0062 1E8C9 0062 +1E953 0062 FF13 0062 2476 0062 1F104 0062 @@ -24384,6 +24992,12 @@ FF13 0062 278C 0062 00B3 0062 2083 0062 +1F19B 0021 +1F19B 003F +1F19B 0334 +1F19B 0061 +1F19B 0041 +1F19B 0062 33E2 0021 33E2 003F 33E2 0061 @@ -24457,11 +25071,14 @@ ABF4 0021 111D4 0021 111E4 0021 112F4 0021 +11454 0021 114D4 0021 11654 0021 116C4 0021 11734 0021 118E4 0021 +11C54 0021 +11C5D 0021 12402 0021 12409 0021 1240F 0021 @@ -24482,6 +25099,7 @@ ABF4 0021 16B54 0021 1D363 0021 1E8CA 0021 +1E954 0021 0034 003F 0664 003F 06F4 003F @@ -24540,11 +25158,14 @@ ABF4 003F 111D4 003F 111E4 003F 112F4 003F +11454 003F 114D4 003F 11654 003F 116C4 003F 11734 003F 118E4 003F +11C54 003F +11C5D 003F 12402 003F 12409 003F 1240F 003F @@ -24565,6 +25186,7 @@ ABF4 003F 16B54 003F 1D363 003F 1E8CA 003F +1E954 003F FF14 0021 FF14 003F 2477 0021 @@ -24619,11 +25241,14 @@ FF14 003F 111D4 0334 111E4 0334 112F4 0334 +11454 0334 114D4 0334 11654 0334 116C4 0334 11734 0334 118E4 0334 +11C54 0334 +11C5D 0334 12402 0334 12409 0334 1240F 0334 @@ -24644,6 +25269,7 @@ FF14 003F 16B54 0334 1D363 0334 1E8CA 0334 +1E954 0334 1D7D2 0334 1D7DC 0334 1D7E6 0334 @@ -24767,11 +25393,14 @@ ABF4 0061 111D4 0061 111E4 0061 112F4 0061 +11454 0061 114D4 0061 11654 0061 116C4 0061 11734 0061 118E4 0061 +11C54 0061 +11C5D 0061 12402 0061 12409 0061 1240F 0061 @@ -24792,6 +25421,7 @@ ABF4 0061 16B54 0061 1D363 0061 1E8CA 0061 +1E954 0061 0034 0041 0664 0041 06F4 0041 @@ -24850,11 +25480,14 @@ ABF4 0041 111D4 0041 111E4 0041 112F4 0041 +11454 0041 114D4 0041 11654 0041 116C4 0041 11734 0041 118E4 0041 +11C54 0041 +11C5D 0041 12402 0041 12409 0041 1240F 0041 @@ -24875,6 +25508,7 @@ ABF4 0041 16B54 0041 1D363 0041 1E8CA 0041 +1E954 0041 FF14 0061 FF14 0041 2477 0061 @@ -24967,11 +25601,14 @@ ABF4 0062 111D4 0062 111E4 0062 112F4 0062 +11454 0062 114D4 0062 11654 0062 116C4 0062 11734 0062 118E4 0062 +11C54 0062 +11C5D 0062 12402 0062 12409 0062 1240F 0062 @@ -24992,6 +25629,7 @@ ABF4 0062 16B54 0062 1D363 0062 1E8CA 0062 +1E954 0062 FF14 0062 2477 0062 1F105 0062 @@ -25009,6 +25647,12 @@ FF14 0062 278D 0062 2074 0062 2084 0062 +1F19E 0021 +1F19E 003F +1F19E 0334 +1F19E 0061 +1F19E 0041 +1F19E 0062 33E3 0021 33E3 003F 33E3 0061 @@ -25086,11 +25730,14 @@ ABF5 0021 111D5 0021 111E5 0021 112F5 0021 +11455 0021 114D5 0021 11655 0021 116C5 0021 11735 0021 118E5 0021 +11C55 0021 +11C5E 0021 12403 0021 1240A 0021 12410 0021 @@ -25107,6 +25754,7 @@ ABF5 0021 16B55 0021 1D364 0021 1E8CB 0021 +1E955 0021 0035 003F 0665 003F 06F5 003F @@ -25169,11 +25817,14 @@ ABF5 003F 111D5 003F 111E5 003F 112F5 003F +11455 003F 114D5 003F 11655 003F 116C5 003F 11735 003F 118E5 003F +11C55 003F +11C5E 003F 12403 003F 1240A 003F 12410 003F @@ -25190,6 +25841,7 @@ ABF5 003F 16B55 003F 1D364 003F 1E8CB 003F +1E955 003F FF15 0021 FF15 003F 2478 0021 @@ -25248,11 +25900,14 @@ FF15 003F 111D5 0334 111E5 0334 112F5 0334 +11455 0334 114D5 0334 11655 0334 116C5 0334 11735 0334 118E5 0334 +11C55 0334 +11C5E 0334 12403 0334 1240A 0334 12410 0334 @@ -25269,6 +25924,7 @@ FF15 003F 16B55 0334 1D364 0334 1E8CB 0334 +1E955 0334 1D7D3 0334 1D7DD 0334 1D7E7 0334 @@ -25284,6 +25940,12 @@ FF15 003F 32BF 0041 324C 0062 32BF 0062 +1F1A0 0021 +1F1A0 003F +1F1A0 0334 +1F1A0 0061 +1F1A0 0041 +1F1A0 0062 215A 0021 215A 003F 215A 0061 @@ -25356,11 +26018,14 @@ ABF5 0061 111D5 0061 111E5 0061 112F5 0061 +11455 0061 114D5 0061 11655 0061 116C5 0061 11735 0061 118E5 0061 +11C55 0061 +11C5E 0061 12403 0061 1240A 0061 12410 0061 @@ -25377,6 +26042,7 @@ ABF5 0061 16B55 0061 1D364 0061 1E8CB 0061 +1E955 0061 0035 0041 0665 0041 06F5 0041 @@ -25439,11 +26105,14 @@ ABF5 0041 111D5 0041 111E5 0041 112F5 0041 +11455 0041 114D5 0041 11655 0041 116C5 0041 11735 0041 118E5 0041 +11C55 0041 +11C5E 0041 12403 0041 1240A 0041 12410 0041 @@ -25460,6 +26129,7 @@ ABF5 0041 16B55 0041 1D364 0041 1E8CB 0041 +1E955 0041 FF15 0061 FF15 0041 2478 0061 @@ -25556,11 +26226,14 @@ ABF5 0062 111D5 0062 111E5 0062 112F5 0062 +11455 0062 114D5 0062 11655 0062 116C5 0062 11735 0062 118E5 0062 +11C55 0062 +11C5E 0062 12403 0062 1240A 0062 12410 0062 @@ -25577,6 +26250,7 @@ ABF5 0062 16B55 0062 1D364 0062 1E8CB 0062 +1E955 0062 FF15 0062 2478 0062 1F106 0062 @@ -25661,11 +26335,14 @@ ABF6 0021 111D6 0021 111E6 0021 112F6 0021 +11456 0021 114D6 0021 11656 0021 116C6 0021 11736 0021 118E6 0021 +11C56 0021 +11C5F 0021 12404 0021 1240B 0021 12411 0021 @@ -25678,6 +26355,7 @@ ABF6 0021 16B56 0021 1D365 0021 1E8CC 0021 +1E956 0021 0036 003F 0666 003F 06F6 003F @@ -25730,11 +26408,14 @@ ABF6 003F 111D6 003F 111E6 003F 112F6 003F +11456 003F 114D6 003F 11656 003F 116C6 003F 11736 003F 118E6 003F +11C56 003F +11C5F 003F 12404 003F 1240B 003F 12411 003F @@ -25747,6 +26428,7 @@ ABF6 003F 16B56 003F 1D365 003F 1E8CC 003F +1E956 003F FF16 0021 FF16 003F 2479 0021 @@ -25794,11 +26476,14 @@ FF16 003F 111D6 0334 111E6 0334 112F6 0334 +11456 0334 114D6 0334 11656 0334 116C6 0334 11736 0334 118E6 0334 +11C56 0334 +11C5F 0334 12404 0334 1240B 0334 12411 0334 @@ -25811,6 +26496,7 @@ FF16 003F 16B56 0334 1D365 0334 1E8CC 0334 +1E956 0334 1D7D4 0334 1D7DE 0334 1D7E8 0334 @@ -25821,6 +26507,12 @@ FF16 003F 324D 0061 324D 0041 324D 0062 +1F1A3 0021 +1F1A3 003F +1F1A3 0334 +1F1A3 0061 +1F1A3 0041 +1F1A3 0062 0036 0061 0666 0061 06F6 0061 @@ -25873,11 +26565,14 @@ ABF6 0061 111D6 0061 111E6 0061 112F6 0061 +11456 0061 114D6 0061 11656 0061 116C6 0061 11736 0061 118E6 0061 +11C56 0061 +11C5F 0061 12404 0061 1240B 0061 12411 0061 @@ -25890,6 +26585,7 @@ ABF6 0061 16B56 0061 1D365 0061 1E8CC 0061 +1E956 0061 0036 0041 0666 0041 06F6 0041 @@ -25942,11 +26638,14 @@ ABF6 0041 111D6 0041 111E6 0041 112F6 0041 +11456 0041 114D6 0041 11656 0041 116C6 0041 11736 0041 118E6 0041 +11C56 0041 +11C5F 0041 12404 0041 1240B 0041 12411 0041 @@ -25959,6 +26658,7 @@ ABF6 0041 16B56 0041 1D365 0041 1E8CC 0041 +1E956 0041 FF16 0061 FF16 0041 2479 0061 @@ -26045,11 +26745,14 @@ ABF6 0062 111D6 0062 111E6 0062 112F6 0062 +11456 0062 114D6 0062 11656 0062 116C6 0062 11736 0062 118E6 0062 +11C56 0062 +11C5F 0062 12404 0062 1240B 0062 12411 0062 @@ -26062,6 +26765,7 @@ ABF6 0062 16B56 0062 1D365 0062 1E8CC 0062 +1E956 0062 FF16 0062 2479 0062 1F107 0062 @@ -26145,11 +26849,14 @@ ABF7 0021 111D7 0021 111E7 0021 112F7 0021 +11457 0021 114D7 0021 11657 0021 116C7 0021 11737 0021 118E7 0021 +11C57 0021 +11C60 0021 12405 0021 1240C 0021 12412 0021 @@ -26163,6 +26870,7 @@ ABF7 0021 16B57 0021 1D366 0021 1E8CD 0021 +1E957 0021 0037 003F 0667 003F 06F7 003F @@ -26214,11 +26922,14 @@ ABF7 003F 111D7 003F 111E7 003F 112F7 003F +11457 003F 114D7 003F 11657 003F 116C7 003F 11737 003F 118E7 003F +11C57 003F +11C60 003F 12405 003F 1240C 003F 12412 003F @@ -26232,6 +26943,7 @@ ABF7 003F 16B57 003F 1D366 003F 1E8CD 003F +1E957 003F FF17 0021 FF17 003F 247A 0021 @@ -26279,11 +26991,14 @@ FF17 003F 111D7 0334 111E7 0334 112F7 0334 +11457 0334 114D7 0334 11657 0334 116C7 0334 11737 0334 118E7 0334 +11C57 0334 +11C60 0334 12405 0334 1240C 0334 12412 0334 @@ -26297,6 +27012,7 @@ FF17 003F 16B57 0334 1D366 0334 1E8CD 0334 +1E957 0334 1D7D5 0334 1D7DF 0334 1D7E9 0334 @@ -26307,6 +27023,12 @@ FF17 003F 324E 0061 324E 0041 324E 0062 +1F1A1 0021 +1F1A1 003F +1F1A1 0334 +1F1A1 0061 +1F1A1 0041 +1F1A1 0062 215E 0021 215E 003F 215E 0061 @@ -26363,11 +27085,14 @@ ABF7 0061 111D7 0061 111E7 0061 112F7 0061 +11457 0061 114D7 0061 11657 0061 116C7 0061 11737 0061 118E7 0061 +11C57 0061 +11C60 0061 12405 0061 1240C 0061 12412 0061 @@ -26381,6 +27106,7 @@ ABF7 0061 16B57 0061 1D366 0061 1E8CD 0061 +1E957 0061 0037 0041 0667 0041 06F7 0041 @@ -26432,11 +27158,14 @@ ABF7 0041 111D7 0041 111E7 0041 112F7 0041 +11457 0041 114D7 0041 11657 0041 116C7 0041 11737 0041 118E7 0041 +11C57 0041 +11C60 0041 12405 0041 1240C 0041 12412 0041 @@ -26450,6 +27179,7 @@ ABF7 0041 16B57 0041 1D366 0041 1E8CD 0041 +1E957 0041 FF17 0061 FF17 0041 247A 0061 @@ -26535,11 +27265,14 @@ ABF7 0062 111D7 0062 111E7 0062 112F7 0062 +11457 0062 114D7 0062 11657 0062 116C7 0062 11737 0062 118E7 0062 +11C57 0062 +11C60 0062 12405 0062 1240C 0062 12412 0062 @@ -26553,6 +27286,7 @@ ABF7 0062 16B57 0062 1D366 0062 1E8CD 0062 +1E957 0062 FF17 0062 247A 0062 1F108 0062 @@ -26636,11 +27370,14 @@ ABF8 0021 111D8 0021 111E8 0021 112F8 0021 +11458 0021 114D8 0021 11658 0021 116C8 0021 11738 0021 118E8 0021 +11C58 0021 +11C61 0021 12406 0021 1240D 0021 12413 0021 @@ -26653,6 +27390,7 @@ ABF8 0021 16B58 0021 1D367 0021 1E8CE 0021 +1E958 0021 0038 003F 0668 003F 06F8 003F @@ -26704,11 +27442,14 @@ ABF8 003F 111D8 003F 111E8 003F 112F8 003F +11458 003F 114D8 003F 11658 003F 116C8 003F 11738 003F 118E8 003F +11C58 003F +11C61 003F 12406 003F 1240D 003F 12413 003F @@ -26721,6 +27462,7 @@ ABF8 003F 16B58 003F 1D367 003F 1E8CE 003F +1E958 003F FF18 0021 FF18 003F 247B 0021 @@ -26768,11 +27510,14 @@ FF18 003F 111D8 0334 111E8 0334 112F8 0334 +11458 0334 114D8 0334 11658 0334 116C8 0334 11738 0334 118E8 0334 +11C58 0334 +11C61 0334 12406 0334 1240D 0334 12413 0334 @@ -26785,6 +27530,7 @@ FF18 003F 16B58 0334 1D367 0334 1E8CE 0334 +1E958 0334 1D7D6 0334 1D7E0 0334 1D7EA 0334 @@ -26846,11 +27592,14 @@ ABF8 0061 111D8 0061 111E8 0061 112F8 0061 +11458 0061 114D8 0061 11658 0061 116C8 0061 11738 0061 118E8 0061 +11C58 0061 +11C61 0061 12406 0061 1240D 0061 12413 0061 @@ -26863,6 +27612,7 @@ ABF8 0061 16B58 0061 1D367 0061 1E8CE 0061 +1E958 0061 0038 0041 0668 0041 06F8 0041 @@ -26914,11 +27664,14 @@ ABF8 0041 111D8 0041 111E8 0041 112F8 0041 +11458 0041 114D8 0041 11658 0041 116C8 0041 11738 0041 118E8 0041 +11C58 0041 +11C61 0041 12406 0041 1240D 0041 12413 0041 @@ -26931,6 +27684,7 @@ ABF8 0041 16B58 0041 1D367 0041 1E8CE 0041 +1E958 0041 FF18 0061 FF18 0041 247B 0061 @@ -27016,11 +27770,14 @@ ABF8 0062 111D8 0062 111E8 0062 112F8 0062 +11458 0062 114D8 0062 11658 0062 116C8 0062 11738 0062 118E8 0062 +11C58 0062 +11C61 0062 12406 0062 1240D 0062 12413 0062 @@ -27033,6 +27790,7 @@ ABF8 0062 16B58 0062 1D367 0062 1E8CE 0062 +1E958 0062 FF18 0062 247B 0062 1F109 0062 @@ -27050,6 +27808,12 @@ FF18 0062 2791 0062 2078 0062 2088 0062 +1F19F 0021 +1F19F 003F +1F19F 0334 +1F19F 0061 +1F19F 0041 +1F19F 0062 33E7 0021 33E7 003F 33E7 0061 @@ -27116,11 +27880,14 @@ ABF9 0021 111D9 0021 111E9 0021 112F9 0021 +11459 0021 114D9 0021 11659 0021 116C9 0021 11739 0021 118E9 0021 +11C59 0021 +11C62 0021 12407 0021 1240E 0021 12414 0021 @@ -27135,6 +27902,7 @@ ABF9 0021 16B59 0021 1D368 0021 1E8CF 0021 +1E959 0021 0039 003F 0669 003F 06F9 003F @@ -27186,11 +27954,14 @@ ABF9 003F 111D9 003F 111E9 003F 112F9 003F +11459 003F 114D9 003F 11659 003F 116C9 003F 11739 003F 118E9 003F +11C59 003F +11C62 003F 12407 003F 1240E 003F 12414 003F @@ -27205,6 +27976,7 @@ ABF9 003F 16B59 003F 1D368 003F 1E8CF 003F +1E959 003F FF19 0021 FF19 003F 247C 0021 @@ -27252,11 +28024,14 @@ FF19 003F 111D9 0334 111E9 0334 112F9 0334 +11459 0334 114D9 0334 11659 0334 116C9 0334 11739 0334 118E9 0334 +11C59 0334 +11C62 0334 12407 0334 1240E 0334 12414 0334 @@ -27271,6 +28046,7 @@ FF19 003F 16B59 0334 1D368 0334 1E8CF 0334 +1E959 0334 1D7D7 0334 1D7E1 0334 1D7EB 0334 @@ -27327,11 +28103,14 @@ ABF9 0061 111D9 0061 111E9 0061 112F9 0061 +11459 0061 114D9 0061 11659 0061 116C9 0061 11739 0061 118E9 0061 +11C59 0061 +11C62 0061 12407 0061 1240E 0061 12414 0061 @@ -27346,6 +28125,7 @@ ABF9 0061 16B59 0061 1D368 0061 1E8CF 0061 +1E959 0061 0039 0041 0669 0041 06F9 0041 @@ -27397,11 +28177,14 @@ ABF9 0041 111D9 0041 111E9 0041 112F9 0041 +11459 0041 114D9 0041 11659 0041 116C9 0041 11739 0041 118E9 0041 +11C59 0041 +11C62 0041 12407 0041 1240E 0041 12414 0041 @@ -27416,6 +28199,7 @@ ABF9 0041 16B59 0041 1D368 0041 1E8CF 0041 +1E959 0041 FF19 0061 FF19 0041 247C 0061 @@ -27501,11 +28285,14 @@ ABF9 0062 111D9 0062 111E9 0062 112F9 0062 +11459 0062 114D9 0062 11659 0062 116C9 0062 11739 0062 118E9 0062 +11C59 0062 +11C62 0062 12407 0062 1240E 0062 12414 0062 @@ -27520,6 +28307,7 @@ ABF9 0062 16B59 0062 1D368 0062 1E8CF 0062 +1E959 0062 FF19 0062 247C 0062 1F10A 0062 @@ -27610,6 +28398,7 @@ FE58 0061 2E3A 0061 2E3B 0061 2053 0061 +2E43 0061 2E17 0061 2E40 0061 301C 0061 @@ -27703,6 +28492,7 @@ FF01 0061 055C 0061 07F9 0061 1944 0061 +1E95E 0061 2048 0061 2047 0061 003F 0061 @@ -27722,6 +28512,7 @@ A60F 0061 A6F7 0061 AAF1 0061 11143 0061 +1E95F 0061 203D 0061 2E18 0061 2026 0061 @@ -27797,12 +28588,16 @@ ABEB 0061 111C6 0061 11238 0061 11239 0061 +1144B 0061 +1144C 0061 115C2 0061 115C3 0061 11641 0061 11642 0061 1173C 0061 1173D 0061 +11C41 0061 +11C42 0061 16A6E 0061 16A6F 0061 1C7E 0061 @@ -28130,6 +28925,7 @@ FF05 0061 2E1B 0061 2E1E 0061 2E1F 0061 +2E44 0061 A67E 0061 055A 0061 055B 0061 @@ -28146,6 +28942,19 @@ A67E 0061 070D 0061 085E 0061 1800 0061 +11660 0061 +11661 0061 +11662 0061 +11663 0061 +11664 0061 +11665 0061 +11666 0061 +11667 0061 +11668 0061 +11669 0061 +1166A 0061 +1166B 0061 +1166C 0061 0970 0061 A8F8 0061 A8F9 0061 @@ -28181,6 +28990,8 @@ AADF 0061 0FD4 0061 0FD9 0061 0FDA 0061 +11C70 0061 +11C71 0061 1C3D 0061 1C3E 0061 1C3F 0061 @@ -28233,6 +29044,9 @@ AA5C 0061 10A54 0061 10A55 0061 10A58 0061 +11C43 0061 +11C44 0061 +11C45 0061 10B39 0061 10AF0 0061 10AF1 0061 @@ -28258,6 +29072,11 @@ AA5C 0061 1123B 0061 1123C 0061 1123D 0061 +1144D 0061 +1144E 0061 +1144F 0061 +1145B 0061 +1145D 0061 114C6 0061 115C1 0061 115C4 0061 @@ -28465,6 +29284,7 @@ FBC1 0061 0BF8 0061 0BFA 0061 0C7F 0061 +0D4F 0061 0D79 0061 A828 0061 A829 0061 @@ -29258,6 +30078,10 @@ FF5E 0061 23F8 0061 23F9 0061 23FA 0061 +23FB 0061 +23FC 0061 +23FD 0061 +23FE 0061 2400 0061 2401 0061 2402 0061 @@ -31227,6 +32051,8 @@ A4C6 0061 10188 0061 10189 0061 1018C 0061 +1018D 0061 +1018E 0061 10190 0061 10191 0061 10192 0061 @@ -32662,6 +33488,7 @@ A4C6 0061 1F577 0061 1F578 0061 1F579 0061 +1F57A 0061 1F57B 0061 1F57C 0061 1F57D 0061 @@ -32703,6 +33530,7 @@ A4C6 0061 1F5A1 0061 1F5A2 0061 1F5A3 0061 +1F5A4 0061 1F5A5 0061 1F5A6 0061 1F5A7 0061 @@ -32803,11 +33631,78 @@ A4C6 0061 1F916 0061 1F917 0061 1F918 0061 +1F919 0061 +1F91A 0061 +1F91B 0061 +1F91C 0061 +1F91D 0061 +1F91E 0061 +1F920 0061 +1F921 0061 +1F922 0061 +1F923 0061 +1F924 0061 +1F925 0061 +1F926 0061 +1F927 0061 +1F930 0061 +1F933 0061 +1F934 0061 +1F935 0061 +1F936 0061 +1F937 0061 +1F938 0061 +1F939 0061 +1F93A 0061 +1F93B 0061 +1F93C 0061 +1F93D 0061 +1F93E 0061 +1F940 0061 +1F941 0061 +1F942 0061 +1F943 0061 +1F944 0061 +1F945 0061 +1F946 0061 +1F947 0061 +1F948 0061 +1F949 0061 +1F94A 0061 +1F94B 0061 +1F950 0061 +1F951 0061 +1F952 0061 +1F953 0061 +1F954 0061 +1F955 0061 +1F956 0061 +1F957 0061 +1F958 0061 +1F959 0061 +1F95A 0061 +1F95B 0061 +1F95C 0061 +1F95D 0061 +1F95E 0061 1F980 0061 1F981 0061 1F982 0061 1F983 0061 1F984 0061 +1F985 0061 +1F986 0061 +1F987 0061 +1F988 0061 +1F989 0061 +1F98A 0061 +1F98B 0061 +1F98C 0061 +1F98D 0061 +1F98E 0061 +1F98F 0061 +1F990 0061 +1F991 0061 1F9C0 0061 1F600 0061 1F601 0061 @@ -33018,6 +33913,8 @@ A4C6 0061 1F6CE 0061 1F6CF 0061 1F6D0 0061 +1F6D1 0061 +1F6D2 0061 1F6E0 0061 1F6E1 0061 1F6E2 0061 @@ -33035,6 +33932,9 @@ A4C6 0061 1F6F1 0061 1F6F2 0061 1F6F3 0061 +1F6F4 0061 +1F6F5 0061 +1F6F6 0061 1F700 0061 1F701 0061 1F702 0061 @@ -34005,12 +34905,22 @@ A835 0061 0BF0 0061 0BF1 0061 0BF2 0061 +0D58 0061 +0D59 0061 +0D5A 0061 +0D5B 0061 +0D5C 0061 +0D5D 0061 +0D5E 0061 0D70 0061 0D71 0061 0D72 0061 0D73 0061 0D74 0061 0D75 0061 +0D76 0061 +0D77 0061 +0D78 0061 1372 0061 1373 0061 1374 0061 @@ -34210,6 +35120,16 @@ A835 0061 10A45 0061 10A46 0061 10A47 0061 +11C63 0061 +11C64 0061 +11C65 0061 +11C66 0061 +11C67 0061 +11C68 0061 +11C69 0061 +11C6A 0061 +11C6B 0061 +11C6C 0061 111EA 0061 111EB 0061 111EC 0061 @@ -34463,6 +35383,21 @@ A835 0061 0749 0061 074A 0061 07FA 0061 +08D4 0061 +08D5 0061 +08D6 0061 +08D7 0061 +08D8 0061 +08D9 0061 +08DA 0061 +08DB 0061 +08DC 0061 +08DD 0061 +08DE 0061 +08DF 0061 +08E0 0061 +08E1 0061 +08E2 0061 08EA 0061 08EB 0061 08EC 0061 @@ -35232,6 +36167,7 @@ FE58 0041 2E3A 0041 2E3B 0041 2053 0041 +2E43 0041 2E17 0041 2E40 0041 301C 0041 @@ -35325,6 +36261,7 @@ FF01 0041 055C 0041 07F9 0041 1944 0041 +1E95E 0041 2048 0041 2047 0041 003F 0041 @@ -35344,6 +36281,7 @@ A60F 0041 A6F7 0041 AAF1 0041 11143 0041 +1E95F 0041 203D 0041 2E18 0041 2026 0041 @@ -35419,12 +36357,16 @@ ABEB 0041 111C6 0041 11238 0041 11239 0041 +1144B 0041 +1144C 0041 115C2 0041 115C3 0041 11641 0041 11642 0041 1173C 0041 1173D 0041 +11C41 0041 +11C42 0041 16A6E 0041 16A6F 0041 1C7E 0041 @@ -35752,6 +36694,7 @@ FF05 0041 2E1B 0041 2E1E 0041 2E1F 0041 +2E44 0041 A67E 0041 055A 0041 055B 0041 @@ -35768,6 +36711,19 @@ A67E 0041 070D 0041 085E 0041 1800 0041 +11660 0041 +11661 0041 +11662 0041 +11663 0041 +11664 0041 +11665 0041 +11666 0041 +11667 0041 +11668 0041 +11669 0041 +1166A 0041 +1166B 0041 +1166C 0041 0970 0041 A8F8 0041 A8F9 0041 @@ -35803,6 +36759,8 @@ AADF 0041 0FD4 0041 0FD9 0041 0FDA 0041 +11C70 0041 +11C71 0041 1C3D 0041 1C3E 0041 1C3F 0041 @@ -35855,6 +36813,9 @@ AA5C 0041 10A54 0041 10A55 0041 10A58 0041 +11C43 0041 +11C44 0041 +11C45 0041 10B39 0041 10AF0 0041 10AF1 0041 @@ -35880,6 +36841,11 @@ AA5C 0041 1123B 0041 1123C 0041 1123D 0041 +1144D 0041 +1144E 0041 +1144F 0041 +1145B 0041 +1145D 0041 114C6 0041 115C1 0041 115C4 0041 @@ -36087,6 +37053,7 @@ FBC1 0041 0BF8 0041 0BFA 0041 0C7F 0041 +0D4F 0041 0D79 0041 A828 0041 A829 0041 @@ -36880,6 +37847,10 @@ FF5E 0041 23F8 0041 23F9 0041 23FA 0041 +23FB 0041 +23FC 0041 +23FD 0041 +23FE 0041 2400 0041 2401 0041 2402 0041 @@ -38849,6 +39820,8 @@ A4C6 0041 10188 0041 10189 0041 1018C 0041 +1018D 0041 +1018E 0041 10190 0041 10191 0041 10192 0041 @@ -40284,6 +41257,7 @@ A4C6 0041 1F577 0041 1F578 0041 1F579 0041 +1F57A 0041 1F57B 0041 1F57C 0041 1F57D 0041 @@ -40325,6 +41299,7 @@ A4C6 0041 1F5A1 0041 1F5A2 0041 1F5A3 0041 +1F5A4 0041 1F5A5 0041 1F5A6 0041 1F5A7 0041 @@ -40425,11 +41400,78 @@ A4C6 0041 1F916 0041 1F917 0041 1F918 0041 +1F919 0041 +1F91A 0041 +1F91B 0041 +1F91C 0041 +1F91D 0041 +1F91E 0041 +1F920 0041 +1F921 0041 +1F922 0041 +1F923 0041 +1F924 0041 +1F925 0041 +1F926 0041 +1F927 0041 +1F930 0041 +1F933 0041 +1F934 0041 +1F935 0041 +1F936 0041 +1F937 0041 +1F938 0041 +1F939 0041 +1F93A 0041 +1F93B 0041 +1F93C 0041 +1F93D 0041 +1F93E 0041 +1F940 0041 +1F941 0041 +1F942 0041 +1F943 0041 +1F944 0041 +1F945 0041 +1F946 0041 +1F947 0041 +1F948 0041 +1F949 0041 +1F94A 0041 +1F94B 0041 +1F950 0041 +1F951 0041 +1F952 0041 +1F953 0041 +1F954 0041 +1F955 0041 +1F956 0041 +1F957 0041 +1F958 0041 +1F959 0041 +1F95A 0041 +1F95B 0041 +1F95C 0041 +1F95D 0041 +1F95E 0041 1F980 0041 1F981 0041 1F982 0041 1F983 0041 1F984 0041 +1F985 0041 +1F986 0041 +1F987 0041 +1F988 0041 +1F989 0041 +1F98A 0041 +1F98B 0041 +1F98C 0041 +1F98D 0041 +1F98E 0041 +1F98F 0041 +1F990 0041 +1F991 0041 1F9C0 0041 1F600 0041 1F601 0041 @@ -40640,6 +41682,8 @@ A4C6 0041 1F6CE 0041 1F6CF 0041 1F6D0 0041 +1F6D1 0041 +1F6D2 0041 1F6E0 0041 1F6E1 0041 1F6E2 0041 @@ -40657,6 +41701,9 @@ A4C6 0041 1F6F1 0041 1F6F2 0041 1F6F3 0041 +1F6F4 0041 +1F6F5 0041 +1F6F6 0041 1F700 0041 1F701 0041 1F702 0041 @@ -41627,12 +42674,22 @@ A835 0041 0BF0 0041 0BF1 0041 0BF2 0041 +0D58 0041 +0D59 0041 +0D5A 0041 +0D5B 0041 +0D5C 0041 +0D5D 0041 +0D5E 0041 0D70 0041 0D71 0041 0D72 0041 0D73 0041 0D74 0041 0D75 0041 +0D76 0041 +0D77 0041 +0D78 0041 1372 0041 1373 0041 1374 0041 @@ -41832,6 +42889,16 @@ A835 0041 10A45 0041 10A46 0041 10A47 0041 +11C63 0041 +11C64 0041 +11C65 0041 +11C66 0041 +11C67 0041 +11C68 0041 +11C69 0041 +11C6A 0041 +11C6B 0041 +11C6C 0041 111EA 0041 111EB 0041 111EC 0041 @@ -42085,6 +43152,21 @@ A835 0041 0749 0041 074A 0041 07FA 0041 +08D4 0041 +08D5 0041 +08D6 0041 +08D7 0041 +08D8 0041 +08D9 0041 +08DA 0041 +08DB 0041 +08DC 0041 +08DD 0041 +08DE 0041 +08DF 0041 +08E0 0041 +08E1 0041 +08E2 0041 08EA 0041 08EB 0041 08EC 0041 @@ -42968,14 +44050,14 @@ A79A 003F 00E1 0334 0041 0301 0334 0041 0334 0301 -0041 0334 0341 0041 0341 0334 +00C1 0334 0061 0300 0334 0061 0334 0300 0061 0340 0334 00E0 0334 +0041 0300 0334 0041 0334 0300 -0041 0334 0340 0041 0340 0334 00C0 0334 0061 0306 0334 @@ -42984,35 +44066,35 @@ A79A 003F 0041 0306 0334 0041 0334 0306 0102 0334 -0061 0306 0301 0334 -0061 0334 0306 0301 -0061 0334 0306 0341 0103 0301 0334 +0103 0334 0301 +0103 0334 0341 +0103 0341 0334 0041 0306 0301 0334 -0041 0306 0334 0301 -0041 0306 0334 0341 0041 0306 0341 0334 -0061 0306 0340 0334 +0102 0301 0334 +0102 0341 0334 0061 0334 0306 0300 -0103 0334 0340 +0103 0300 0334 +0103 0340 0334 1EB1 0334 -0041 0306 0334 0300 -0041 0306 0334 0340 +0041 0306 0300 0334 0041 0306 0340 0334 -1EB0 0334 +0102 0300 0334 +0102 0340 0334 +0061 0306 0303 0334 0061 0306 0334 0303 -0061 0334 0306 0303 0103 0303 0334 -1EB5 0334 -0041 0306 0303 0334 -0041 0306 0334 0303 +0103 0334 0303 0041 0334 0306 0303 0102 0303 0334 +0102 0334 0303 +1EB4 0334 0061 0306 0309 0334 -0061 0306 0334 0309 +0103 0309 0334 0103 0334 0309 1EB3 0334 -0041 0334 0306 0309 +0041 0306 0334 0309 0102 0309 0334 0102 0334 0309 1EB2 0334 @@ -43023,33 +44105,33 @@ A79A 003F 0041 0334 0302 00C2 0334 0061 0302 0301 0334 -0061 0302 0334 0341 -0061 0334 0302 0301 -00E2 0334 0301 -0041 0302 0301 0334 +0061 0302 0341 0334 +00E2 0301 0334 +00E2 0341 0334 0041 0302 0334 0301 -00C2 0334 0301 +00C2 0301 0334 00C2 0341 0334 -0061 0302 0334 0340 -0061 0334 0302 0300 -00E2 0334 0300 -1EA7 0334 +1EA4 0334 +0061 0302 0300 0334 +0061 0302 0340 0334 +00E2 0300 0334 +00E2 0340 0334 0041 0302 0334 0300 +0041 0302 0334 0340 00C2 0300 0334 00C2 0340 0334 -1EA6 0334 0061 0302 0303 0334 0061 0302 0334 0303 -0061 0334 0302 0303 00E2 0303 0334 -0041 0302 0303 0334 +00E2 0334 0303 0041 0302 0334 0303 -0041 0334 0302 0303 +00C2 0303 0334 00C2 0334 0303 -0061 0302 0309 0334 +1EAA 0334 0061 0302 0334 0309 0061 0334 0302 0309 00E2 0334 0309 +1EA9 0334 0041 0302 0309 0334 0041 0334 0302 0309 00C2 0309 0334 @@ -43067,14 +44149,14 @@ A79A 003F 0041 0334 030A 00C5 0334 212B 0334 +0061 030A 0334 0301 0061 030A 0334 0341 -0061 0334 030A 0341 00E5 0334 0301 -01FB 0334 -0041 030A 0301 0334 +00E5 0334 0341 0041 0334 030A 0301 0041 0334 030A 0341 -00C5 0341 0334 +212B 0301 0334 +212B 0341 0334 0061 0308 0334 0061 0334 0308 00E4 0334 @@ -43083,12 +44165,12 @@ A79A 003F 00C4 0334 0061 0308 0304 0334 0061 0308 0334 0304 -00E4 0304 0334 -00E4 0334 0304 -0041 0308 0304 0334 -0041 0308 0334 0304 +0061 0334 0308 0304 +01DF 0334 0041 0334 0308 0304 00C4 0304 0334 +00C4 0334 0304 +01DE 0334 0061 0303 0334 0061 0334 0303 00E3 0334 @@ -43101,14 +44183,14 @@ A79A 003F 0041 0307 0334 0041 0334 0307 0226 0334 +0061 0307 0304 0334 0061 0307 0334 0304 0061 0334 0307 0304 -0227 0304 0334 -0227 0334 0304 -0041 0307 0304 0334 -0041 0307 0334 0304 +01E1 0334 0041 0334 0307 0304 01E0 0334 +0226 0304 0334 +0226 0334 0304 0061 0328 0334 0061 0334 0328 0105 0334 @@ -43145,22 +44227,22 @@ A79A 003F 0041 0323 0334 0041 0334 0323 1EA0 0334 -0061 0323 0306 0334 -0061 0334 0306 0323 -0061 0334 0323 0306 -1EA1 0306 0334 +0061 0306 0323 0334 +0061 0306 0334 0323 +0103 0323 0334 +1EA1 0334 0306 0041 0334 0306 0323 -0041 0334 0323 0306 0102 0323 0334 -1EB6 0334 -0061 0302 0334 0323 -0061 0334 0323 0302 +0102 0334 0323 +1EA0 0334 0306 +00E2 0323 0334 +00E2 0334 0323 1EA1 0302 0334 -1EA1 0334 0302 +1EAD 0334 0041 0302 0334 0323 00C2 0323 0334 +00C2 0334 0323 1EA0 0302 0334 -1EAC 0334 0061 0325 0334 0061 0334 0325 1E01 0334 @@ -43278,6 +44360,7 @@ A79A 003F 1DCE 0061 1DD1 0061 1DF5 0061 +1DFB 0061 1DFE 0061 20F0 0061 2CEF 0061 @@ -43338,6 +44421,7 @@ A67D 0061 1DCE 0041 1DD1 0041 1DF5 0041 +1DFB 0041 1DFE 0041 20F0 0041 2CEF 0041 @@ -43726,7 +44810,9 @@ FE7C 0041 FC63 0061 FC63 0041 0652 0061 +1123E 0061 0652 0041 +1123E 0041 FE7F 0061 FE7F 0041 FE7E 0061 @@ -43849,6 +44935,20 @@ A6F1 0041 16AF3 0041 16AF4 0061 16AF4 0041 +1E944 0061 +1E945 0061 +1E946 0061 +1E944 0041 +1E945 0041 +1E946 0041 +1E94A 0061 +1E94A 0041 +1E947 0061 +1E947 0041 +1E948 0061 +1E948 0041 +1E949 0061 +1E949 0041 093C 0061 09BC 0061 0A3C 0061 @@ -43865,6 +44965,7 @@ A9B3 0061 11236 0061 112E9 0061 1133C 0061 +11446 0061 114C3 0061 115C0 0061 116B7 0061 @@ -43884,6 +44985,7 @@ A9B3 0041 11236 0041 112E9 0041 1133C 0041 +11446 0041 114C3 0041 115C0 0041 116B7 0041 @@ -43899,15 +45001,19 @@ A9B3 0041 0D01 0061 1B00 0061 1B01 0061 +A8C5 0061 A980 0061 11000 0061 11080 0061 11100 0061 11180 0061 11301 0061 +11443 0061 114BF 0061 115BC 0061 11640 0061 +11C3C 0061 +11CB6 0061 0900 0041 0901 0041 0981 0041 @@ -43920,15 +45026,19 @@ A980 0061 0D01 0041 1B00 0041 1B01 0041 +A8C5 0041 A980 0041 11000 0041 11080 0041 11100 0041 11180 0041 11301 0041 +11443 0041 114BF 0041 115BC 0041 11640 0041 +11C3C 0041 +11CB6 0041 0902 0061 0982 0061 0A02 0061 @@ -43958,10 +45068,13 @@ A981 0061 112DF 0061 11300 0061 11302 0061 +11444 0061 114C0 0061 115BD 0061 1163D 0061 116AB 0061 +11C3D 0061 +11CB5 0061 0902 0041 0982 0041 0A02 0041 @@ -43991,10 +45104,13 @@ A981 0041 112DF 0041 11300 0041 11302 0041 +11444 0041 114C0 0041 115BD 0041 1163D 0041 116AB 0041 +11C3D 0041 +11CB5 0041 0903 0061 0983 0061 0A03 0061 @@ -44019,10 +45135,12 @@ A983 0061 11102 0061 11182 0061 11303 0061 +11445 0061 114C1 0061 115BE 0061 1163E 0061 116AC 0061 +11C3E 0061 0903 0041 0983 0041 0A03 0041 @@ -44047,10 +45165,12 @@ A983 0041 11102 0041 11182 0041 11303 0041 +11445 0041 114C1 0041 115BE 0041 1163E 0041 116AC 0041 +11C3E 0041 0A70 0061 0A70 0041 0A71 0061 @@ -44557,9 +45677,9 @@ A79A 0062 00E6 0334 0301 00E6 0334 0341 01FD 0334 +00C6 0301 0334 00C6 0334 0301 00C6 0334 0341 -00C6 0341 0334 01FC 0334 00E6 0304 0334 00E6 0334 0304 @@ -44852,6 +45972,7 @@ FE58 0062 2E3A 0062 2E3B 0062 2053 0062 +2E43 0062 2E17 0062 2E40 0062 301C 0062 @@ -44945,6 +46066,7 @@ FF01 0062 055C 0062 07F9 0062 1944 0062 +1E95E 0062 2048 0062 2047 0062 003F 0062 @@ -44964,6 +46086,7 @@ A60F 0062 A6F7 0062 AAF1 0062 11143 0062 +1E95F 0062 203D 0062 2E18 0062 2026 0062 @@ -45039,12 +46162,16 @@ ABEB 0062 111C6 0062 11238 0062 11239 0062 +1144B 0062 +1144C 0062 115C2 0062 115C3 0062 11641 0062 11642 0062 1173C 0062 1173D 0062 +11C41 0062 +11C42 0062 16A6E 0062 16A6F 0062 1C7E 0062 @@ -45372,6 +46499,7 @@ FF05 0062 2E1B 0062 2E1E 0062 2E1F 0062 +2E44 0062 A67E 0062 055A 0062 055B 0062 @@ -45388,6 +46516,19 @@ A67E 0062 070D 0062 085E 0062 1800 0062 +11660 0062 +11661 0062 +11662 0062 +11663 0062 +11664 0062 +11665 0062 +11666 0062 +11667 0062 +11668 0062 +11669 0062 +1166A 0062 +1166B 0062 +1166C 0062 0970 0062 A8F8 0062 A8F9 0062 @@ -45423,6 +46564,8 @@ AADF 0062 0FD4 0062 0FD9 0062 0FDA 0062 +11C70 0062 +11C71 0062 1C3D 0062 1C3E 0062 1C3F 0062 @@ -45475,6 +46618,9 @@ AA5C 0062 10A54 0062 10A55 0062 10A58 0062 +11C43 0062 +11C44 0062 +11C45 0062 10B39 0062 10AF0 0062 10AF1 0062 @@ -45500,6 +46646,11 @@ AA5C 0062 1123B 0062 1123C 0062 1123D 0062 +1144D 0062 +1144E 0062 +1144F 0062 +1145B 0062 +1145D 0062 114C6 0062 115C1 0062 115C4 0062 @@ -45707,6 +46858,7 @@ FBC1 0062 0BF8 0062 0BFA 0062 0C7F 0062 +0D4F 0062 0D79 0062 A828 0062 A829 0062 @@ -46500,6 +47652,10 @@ FF5E 0062 23F8 0062 23F9 0062 23FA 0062 +23FB 0062 +23FC 0062 +23FD 0062 +23FE 0062 2400 0062 2401 0062 2402 0062 @@ -48469,6 +49625,8 @@ A4C6 0062 10188 0062 10189 0062 1018C 0062 +1018D 0062 +1018E 0062 10190 0062 10191 0062 10192 0062 @@ -49904,6 +51062,7 @@ A4C6 0062 1F577 0062 1F578 0062 1F579 0062 +1F57A 0062 1F57B 0062 1F57C 0062 1F57D 0062 @@ -49945,6 +51104,7 @@ A4C6 0062 1F5A1 0062 1F5A2 0062 1F5A3 0062 +1F5A4 0062 1F5A5 0062 1F5A6 0062 1F5A7 0062 @@ -50045,11 +51205,78 @@ A4C6 0062 1F916 0062 1F917 0062 1F918 0062 +1F919 0062 +1F91A 0062 +1F91B 0062 +1F91C 0062 +1F91D 0062 +1F91E 0062 +1F920 0062 +1F921 0062 +1F922 0062 +1F923 0062 +1F924 0062 +1F925 0062 +1F926 0062 +1F927 0062 +1F930 0062 +1F933 0062 +1F934 0062 +1F935 0062 +1F936 0062 +1F937 0062 +1F938 0062 +1F939 0062 +1F93A 0062 +1F93B 0062 +1F93C 0062 +1F93D 0062 +1F93E 0062 +1F940 0062 +1F941 0062 +1F942 0062 +1F943 0062 +1F944 0062 +1F945 0062 +1F946 0062 +1F947 0062 +1F948 0062 +1F949 0062 +1F94A 0062 +1F94B 0062 +1F950 0062 +1F951 0062 +1F952 0062 +1F953 0062 +1F954 0062 +1F955 0062 +1F956 0062 +1F957 0062 +1F958 0062 +1F959 0062 +1F95A 0062 +1F95B 0062 +1F95C 0062 +1F95D 0062 +1F95E 0062 1F980 0062 1F981 0062 1F982 0062 1F983 0062 1F984 0062 +1F985 0062 +1F986 0062 +1F987 0062 +1F988 0062 +1F989 0062 +1F98A 0062 +1F98B 0062 +1F98C 0062 +1F98D 0062 +1F98E 0062 +1F98F 0062 +1F990 0062 +1F991 0062 1F9C0 0062 1F600 0062 1F601 0062 @@ -50260,6 +51487,8 @@ A4C6 0062 1F6CE 0062 1F6CF 0062 1F6D0 0062 +1F6D1 0062 +1F6D2 0062 1F6E0 0062 1F6E1 0062 1F6E2 0062 @@ -50277,6 +51506,9 @@ A4C6 0062 1F6F1 0062 1F6F2 0062 1F6F3 0062 +1F6F4 0062 +1F6F5 0062 +1F6F6 0062 1F700 0062 1F701 0062 1F702 0062 @@ -51247,12 +52479,22 @@ A835 0062 0BF0 0062 0BF1 0062 0BF2 0062 +0D58 0062 +0D59 0062 +0D5A 0062 +0D5B 0062 +0D5C 0062 +0D5D 0062 +0D5E 0062 0D70 0062 0D71 0062 0D72 0062 0D73 0062 0D74 0062 0D75 0062 +0D76 0062 +0D77 0062 +0D78 0062 1372 0062 1373 0062 1374 0062 @@ -51452,6 +52694,16 @@ A835 0062 10A45 0062 10A46 0062 10A47 0062 +11C63 0062 +11C64 0062 +11C65 0062 +11C66 0062 +11C67 0062 +11C68 0062 +11C69 0062 +11C6A 0062 +11C6B 0062 +11C6C 0062 111EA 0062 111EB 0062 111EC 0062 @@ -51705,6 +52957,21 @@ A835 0062 0749 0062 074A 0062 07FA 0062 +08D4 0062 +08D5 0062 +08D6 0062 +08D7 0062 +08D8 0062 +08D9 0062 +08DA 0062 +08DB 0062 +08DC 0062 +08DD 0062 +08DE 0062 +08DF 0062 +08E0 0062 +08E1 0062 +08E2 0062 08EA 0062 08EB 0062 08EC 0062 @@ -52600,6 +53867,7 @@ FF22 003F 1DCE 0062 1DD1 0062 1DF5 0062 +1DFB 0062 1DFE 0062 20F0 0062 2CEF 0062 @@ -52797,6 +54065,7 @@ FE7D 0062 FE7C 0062 FC63 0062 0652 0062 +1123E 0062 FE7F 0062 FE7E 0062 0653 0062 @@ -52858,6 +54127,13 @@ A6F1 0062 16AF2 0062 16AF3 0062 16AF4 0062 +1E944 0062 +1E945 0062 +1E946 0062 +1E94A 0062 +1E947 0062 +1E948 0062 +1E949 0062 093C 0062 09BC 0062 0A3C 0062 @@ -52874,6 +54150,7 @@ A9B3 0062 11236 0062 112E9 0062 1133C 0062 +11446 0062 114C3 0062 115C0 0062 116B7 0062 @@ -52889,15 +54166,19 @@ A9B3 0062 0D01 0062 1B00 0062 1B01 0062 +A8C5 0062 A980 0062 11000 0062 11080 0062 11100 0062 11180 0062 11301 0062 +11443 0062 114BF 0062 115BC 0062 11640 0062 +11C3C 0062 +11CB6 0062 0902 0062 0982 0062 0A02 0062 @@ -52927,10 +54208,13 @@ A981 0062 112DF 0062 11300 0062 11302 0062 +11444 0062 114C0 0062 115BD 0062 1163D 0062 116AB 0062 +11C3D 0062 +11CB5 0062 0903 0062 0983 0062 0A03 0062 @@ -52955,10 +54239,12 @@ A983 0062 11102 0062 11182 0062 11303 0062 +11445 0062 114C1 0062 115BE 0062 1163E 0062 116AC 0062 +11C3E 0062 0A70 0062 0A71 0062 1B03 0062 @@ -53407,12 +54693,12 @@ FF23 003F 1F172 0334 0063 0301 0334 0063 0334 0301 +0063 0334 0341 0063 0341 0334 -0107 0334 0043 0301 0334 0043 0334 0301 0043 0334 0341 -0106 0334 +0043 0341 0334 0063 0302 0334 0063 0334 0302 0109 0334 @@ -53438,13 +54724,13 @@ FF23 003F 0043 0334 0327 00C7 0334 0063 0327 0334 0301 -0063 0334 0301 0327 -00E7 0341 0334 -0107 0334 0327 +0063 0327 0334 0341 +0063 0341 0334 0327 +1E09 0334 +0043 0301 0327 0334 0043 0334 0327 0301 0043 0334 0327 0341 -0043 0334 0341 0327 -0106 0327 0334 +0043 0341 0327 0334 0334 0368 0368 0334 0334 1DD7 @@ -53838,6 +55124,8 @@ FF24 003F 1F153 003F 1D48 0021 1D48 003F +1F1A5 0021 +1F1A5 003F 1D30 0021 1F133 0021 1F173 0021 @@ -53899,6 +55187,7 @@ FF24 003F 1D63F 0334 1D673 0334 1F153 0334 +1F1A5 0334 1F133 0334 1F173 0334 0064 030C 0334 @@ -54039,6 +55328,8 @@ FF24 0041 1F153 0041 1D48 0061 1D48 0041 +1F1A5 0061 +1F1A5 0041 3372 0021 3372 003F 1D30 0061 @@ -54135,6 +55426,7 @@ FF24 0062 24B9 0062 1F153 0062 1D48 0062 +1F1A5 0062 33C8 0021 33C8 003F 1D30 0062 @@ -54521,17 +55813,17 @@ FF25 003F 1F134 0334 1F174 0334 0065 0301 0334 +0065 0334 0301 0065 0334 0341 0065 0341 0334 -00E9 0334 0045 0301 0334 0045 0334 0301 +0045 0334 0341 0045 0341 0334 -00C9 0334 0065 0300 0334 +0065 0334 0300 0065 0334 0340 0065 0340 0334 -00E8 0334 0045 0300 0334 0045 0334 0300 0045 0334 0340 @@ -54548,34 +55840,34 @@ FF25 003F 0045 0302 0334 0045 0334 0302 00CA 0334 +0065 0302 0334 0301 0065 0302 0334 0341 0065 0334 0302 0301 -00EA 0301 0334 -1EBF 0334 +00EA 0334 0301 +0045 0302 0334 0301 0045 0302 0334 0341 -0045 0334 0302 0341 00CA 0334 0301 -00CA 0341 0334 +00CA 0334 0341 +0065 0302 0334 0300 0065 0302 0334 0340 -0065 0334 0302 0300 -0065 0334 0302 0340 -00EA 0300 0334 +00EA 0334 0300 +1EC1 0334 +0045 0302 0334 0300 0045 0302 0334 0340 -0045 0334 0302 0340 00CA 0334 0300 -1EC0 0334 +00CA 0334 0340 +0065 0302 0303 0334 0065 0302 0334 0303 0065 0334 0302 0303 00EA 0303 0334 -00EA 0334 0303 0045 0302 0303 0334 0045 0302 0334 0303 -0045 0334 0302 0303 00CA 0303 0334 +1EC4 0334 0065 0302 0309 0334 0065 0302 0334 0309 -0065 0334 0302 0309 -00EA 0334 0309 +00EA 0309 0334 +1EC3 0334 0045 0302 0309 0334 0045 0302 0334 0309 00CA 0309 0334 @@ -54610,14 +55902,14 @@ FF25 003F 0045 0327 0334 0045 0334 0327 0228 0334 -0065 0327 0334 0306 -0065 0334 0306 0327 -0115 0334 0327 +0065 0334 0327 0306 +0115 0327 0334 +0229 0334 0306 1E1D 0334 -0045 0327 0334 0306 -0045 0334 0306 0327 -0045 0334 0327 0306 +0045 0306 0327 0334 0114 0327 0334 +0114 0334 0327 +0228 0334 0306 0065 0328 0334 0065 0334 0328 0119 0334 @@ -54630,8 +55922,8 @@ FF25 003F 0045 0304 0334 0045 0334 0304 0112 0334 -0065 0304 0334 0301 -0065 0334 0304 0341 +0113 0301 0334 +0113 0334 0301 0113 0334 0341 0113 0341 0334 0045 0304 0334 0301 @@ -54639,13 +55931,13 @@ FF25 003F 0112 0301 0334 0112 0341 0334 0065 0304 0334 0300 +0065 0304 0334 0340 0065 0334 0304 0300 -0113 0340 0334 -1E15 0334 +0065 0334 0304 0340 0045 0304 0334 0300 -0112 0300 0334 -0112 0334 0300 -0112 0340 0334 +0045 0304 0334 0340 +0045 0334 0304 0300 +0045 0334 0304 0340 0065 0309 0334 0065 0334 0309 1EBB 0334 @@ -54671,13 +55963,13 @@ FF25 003F 0045 0334 0323 1EB8 0334 0065 0302 0334 0323 -0065 0323 0302 0334 -0065 0334 0302 0323 -00EA 0334 0323 +0065 0323 0334 0302 +0065 0334 0323 0302 +1EB9 0334 0302 0045 0302 0323 0334 0045 0302 0334 0323 -0045 0323 0334 0302 -00CA 0323 0334 +0045 0334 0323 0302 +1EB8 0334 0302 0065 032D 0334 0065 0334 032D 1E19 0334 @@ -55654,13 +56946,13 @@ A7A0 003F 1F156 0334 1F136 0334 1F176 0334 +0067 0301 0334 0067 0334 0301 0067 0334 0341 0067 0341 0334 -01F5 0334 0047 0301 0334 +0047 0334 0301 0047 0334 0341 -0047 0341 0334 01F4 0334 0067 0306 0334 0067 0334 0306 @@ -56383,11 +57675,29 @@ A7F8 0062 1E2B 0062 1E2A 0062 1E96 0062 +1F1A6 0021 +1F1A6 003F +1F1A6 0334 +1F1A6 0061 +1F1A6 0041 +1F1A6 0062 +1F1A7 0021 +1F1A7 003F +1F1A7 0334 +1F1A7 0061 +1F1A7 0041 +1F1A7 0062 32CC 0021 32CC 003F 32CC 0061 32CC 0041 32CC 0062 +1F1A8 0021 +1F1A8 003F +1F1A8 0334 +1F1A8 0061 +1F1A8 0041 +1F1A8 0062 33CB 0021 33CB 003F 3371 0021 @@ -56675,20 +57985,20 @@ FF29 003F 1F138 0334 1F178 0334 0069 0301 0334 +0069 0334 0301 0069 0334 0341 -0069 0341 0334 00ED 0334 0049 0301 0334 0049 0334 0301 0049 0334 0341 00CD 0334 0069 0300 0334 +0069 0334 0300 0069 0334 0340 -0069 0340 0334 00EC 0334 +0049 0300 0334 0049 0334 0300 0049 0334 0340 -0049 0340 0334 00CC 0334 0069 0306 0334 0069 0334 0306 @@ -56715,13 +58025,13 @@ FF29 003F 0049 0334 0308 00CF 0334 0069 0308 0301 0334 -0069 0308 0334 0341 00EF 0301 0334 -00EF 0334 0341 +00EF 0341 0334 +1E2F 0334 0049 0308 0334 0301 -0049 0308 0341 0334 -00CF 0334 0301 -1E2E 0334 +0049 0308 0334 0341 +00CF 0301 0334 +00CF 0341 0334 0069 0303 0334 0069 0334 0303 0129 0334 @@ -57088,13 +58398,18 @@ FF29 0062 1D6A4 0062 026A 0021 026A 003F +A7AE 0021 +A7AE 003F 1DA6 0021 1DA6 003F 026A 0061 026A 0041 +A7AE 0061 +A7AE 0041 1DA6 0061 1DA6 0041 026A 0062 +A7AE 0062 1DA6 0062 A7FE 0021 A7FE 003F @@ -57622,10 +58937,10 @@ A7A2 003F 006B 0301 0334 006B 0334 0301 006B 0334 0341 -006B 0341 0334 -004B 0301 0334 -004B 0334 0341 -212A 0334 0341 +1E31 0334 +004B 0334 0301 +1E30 0334 +212A 0301 0334 212A 0341 0334 006B 030C 0334 006B 0334 030C @@ -57638,9 +58953,9 @@ A7A2 003F 006B 0334 0327 0137 0334 004B 0327 0334 -004B 0334 0327 0136 0334 212A 0327 0334 +212A 0334 0327 006B 0323 0334 006B 0334 0323 1E33 0334 @@ -58120,11 +59435,11 @@ FF2C 003F 1F17B 0334 006C 0301 0334 006C 0334 0301 -006C 0341 0334 +006C 0334 0341 013A 0334 004C 0301 0334 +004C 0334 0301 004C 0334 0341 -004C 0341 0334 0139 0334 006C 030C 0334 006C 0334 030C @@ -58145,13 +59460,13 @@ FF2C 003F 004C 0334 0323 1E36 0334 006C 0304 0323 0334 -006C 0323 0304 0334 -006C 0334 0304 0323 006C 0334 0323 0304 -004C 0323 0304 0334 -004C 0334 0304 0323 +1E37 0304 0334 +1E37 0334 0304 +004C 0304 0323 0334 004C 0334 0323 0304 1E36 0304 0334 +1E36 0334 0304 006C 032D 0334 006C 0334 032D 1E3D 0334 @@ -58428,6 +59743,12 @@ FF2C 0062 33D2 0061 33D2 0041 33D2 0062 +1F1A9 0021 +1F1A9 003F +1F1A9 0334 +1F1A9 0061 +1F1A9 0041 +1F1A9 0062 02AA 0021 02AA 003F 02AA 0061 @@ -58750,11 +60071,11 @@ FF2D 003F 1F13C 0334 1F17C 0334 006D 0301 0334 -006D 0334 0341 +006D 0334 0301 006D 0341 0334 1E3F 0334 +004D 0301 0334 004D 0334 0301 -004D 0334 0341 004D 0341 0334 1E3E 0334 006D 0307 0334 @@ -59255,21 +60576,21 @@ A7A4 003F 1F13D 0334 1F17D 0334 006E 0301 0334 -006E 0334 0341 +006E 0334 0301 006E 0341 0334 0144 0334 004E 0301 0334 004E 0334 0301 -004E 0334 0341 +004E 0341 0334 0143 0334 006E 0300 0334 +006E 0334 0300 006E 0334 0340 006E 0340 0334 -01F9 0334 004E 0300 0334 004E 0334 0300 004E 0334 0340 -01F8 0334 +004E 0340 0334 006E 030C 0334 006E 0334 030C 0148 0334 @@ -59847,13 +61168,13 @@ A79C 003F 01FF 003F 01FE 0021 01FE 003F +00F8 0301 0334 00F8 0334 0301 00F8 0334 0341 -00F8 0341 0334 01FF 0334 00D8 0301 0334 +00D8 0334 0301 00D8 0334 0341 -00D8 0341 0334 01FE 0334 01EB 0021 01EB 003F @@ -59951,14 +61272,14 @@ A79C 003F 1F17E 0334 006F 0301 0334 006F 0334 0301 -006F 0334 0341 +006F 0341 0334 00F3 0334 004F 0301 0334 004F 0334 0301 004F 0341 0334 00D3 0334 +006F 0300 0334 006F 0334 0300 -006F 0334 0340 006F 0340 0334 00F2 0334 004F 0300 0334 @@ -59977,36 +61298,36 @@ A79C 003F 004F 0302 0334 004F 0334 0302 00D4 0334 -006F 0302 0334 0301 -006F 0302 0334 0341 +00F4 0301 0334 +00F4 0334 0301 00F4 0334 0341 -00F4 0341 0334 -004F 0302 0334 0341 -004F 0334 0302 0301 -004F 0334 0302 0341 +1ED1 0334 +00D4 0301 0334 +00D4 0334 0301 +00D4 0334 0341 00D4 0341 0334 006F 0302 0334 0300 006F 0302 0334 0340 -00F4 0334 0340 +00F4 0334 0300 1ED3 0334 +004F 0302 0334 0300 +004F 0302 0334 0340 004F 0334 0302 0300 -004F 0334 0302 0340 -00D4 0300 0334 -00D4 0340 0334 +1ED2 0334 006F 0302 0303 0334 -006F 0302 0334 0303 +006F 0334 0302 0303 00F4 0303 0334 -1ED7 0334 +00F4 0334 0303 004F 0302 0303 0334 -004F 0302 0334 0303 004F 0334 0302 0303 -1ED6 0334 +00D4 0303 0334 +00D4 0334 0303 006F 0302 0309 0334 +006F 0302 0334 0309 006F 0334 0302 0309 00F4 0334 0309 -1ED5 0334 004F 0302 0309 0334 -00D4 0309 0334 +004F 0302 0334 0309 00D4 0334 0309 1ED4 0334 006F 030C 0334 @@ -60024,11 +61345,11 @@ A79C 003F 006F 0308 0304 0334 006F 0308 0334 0304 00F6 0304 0334 -022B 0334 +00F6 0334 0304 004F 0308 0334 0304 +004F 0334 0308 0304 00D6 0304 0334 00D6 0334 0304 -022A 0334 006F 030B 0334 006F 0334 030B 0151 0334 @@ -60042,28 +61363,28 @@ A79C 003F 004F 0334 0303 00D5 0334 006F 0303 0301 0334 -006F 0303 0341 0334 -00F5 0301 0334 00F5 0334 0301 -004F 0303 0334 0301 -004F 0303 0341 0334 +00F5 0334 0341 +1E4D 0334 004F 0334 0303 0301 004F 0334 0303 0341 -006F 0303 0308 0334 +00D5 0334 0301 +00D5 0334 0341 +006F 0303 0334 0308 006F 0334 0303 0308 00F5 0308 0334 -00F5 0334 0308 +1E4F 0334 +004F 0303 0334 0308 004F 0334 0303 0308 00D5 0308 0334 -00D5 0334 0308 1E4E 0334 -006F 0303 0304 0334 -006F 0303 0334 0304 +006F 0334 0303 0304 +00F5 0304 0334 00F5 0334 0304 022D 0334 -004F 0303 0304 0334 -004F 0303 0334 0304 004F 0334 0303 0304 +00D5 0304 0334 +00D5 0334 0304 022C 0334 006F 0307 0334 006F 0334 0307 @@ -60072,27 +61393,27 @@ A79C 003F 004F 0334 0307 022E 0334 006F 0307 0304 0334 -006F 0334 0307 0304 -022F 0304 0334 +006F 0307 0334 0304 022F 0334 0304 -004F 0307 0304 0334 +0231 0334 004F 0334 0307 0304 022E 0304 0334 022E 0334 0304 +0230 0334 006F 0328 0334 006F 0334 0328 01EB 0334 004F 0328 0334 004F 0334 0328 01EA 0334 -006F 0304 0328 0334 006F 0304 0334 0328 -006F 0334 0328 0304 -01EB 0334 0304 +006F 0334 0304 0328 +014D 0334 0328 +01ED 0334 004F 0304 0334 0328 -004F 0328 0334 0304 +004F 0334 0328 0304 014C 0334 0328 -01EA 0334 0304 +01EC 0334 006F 0304 0334 006F 0334 0304 014D 0334 @@ -60101,20 +61422,20 @@ A79C 003F 014C 0334 006F 0304 0301 0334 014D 0301 0334 -014D 0334 0341 +014D 0341 0334 1E53 0334 004F 0304 0301 0334 004F 0334 0304 0301 004F 0334 0304 0341 -014C 0341 0334 +1E52 0334 +006F 0304 0300 0334 014D 0300 0334 -014D 0334 0340 014D 0340 0334 1E51 0334 -004F 0304 0300 0334 004F 0334 0304 0300 004F 0334 0304 0340 014C 0300 0334 +014C 0340 0334 006F 0309 0334 006F 0334 0309 1ECF 0334 @@ -60139,45 +61460,45 @@ A79C 003F 004F 031B 0334 004F 0334 031B 01A0 0334 -006F 0301 0334 031B 006F 031B 0301 0334 -006F 031B 0334 0341 -00F3 0334 031B -004F 0301 0334 031B -004F 031B 0341 0334 +006F 031B 0341 0334 +006F 0334 0301 031B +006F 0334 0341 031B +004F 0301 031B 0334 004F 0341 0334 031B +01A0 0334 0301 01A0 0334 0341 +006F 0300 0334 031B +006F 031B 0334 0300 006F 031B 0334 0340 -006F 031B 0340 0334 006F 0340 0334 031B -01A1 0340 0334 -004F 0300 0334 031B -01A0 0334 0340 -01A0 0340 0334 -1EDC 0334 -006F 0303 031B 0334 -006F 031B 0334 0303 +004F 0300 031B 0334 +004F 0340 0334 031B +00D2 031B 0334 +01A0 0334 0300 +006F 031B 0303 0334 006F 0334 0303 031B -01A1 0334 0303 -004F 0334 031B 0303 -00D5 031B 0334 -00D5 0334 031B -01A0 0303 0334 +006F 0334 031B 0303 +1EE1 0334 +004F 0303 031B 0334 +004F 0303 0334 031B +004F 031B 0303 0334 +004F 031B 0334 0303 006F 0334 0309 031B -006F 0334 031B 0309 01A1 0334 0309 1ECF 0334 031B -004F 0309 0334 031B -01A0 0309 0334 +1EDF 0334 +004F 0334 031B 0309 01A0 0334 0309 +1ECE 031B 0334 1ECE 0334 031B -006F 031B 0323 0334 -006F 031B 0334 0323 -006F 0323 031B 0334 -01A1 0323 0334 -004F 0323 0334 031B -004F 0334 031B 0323 -01A0 0334 0323 +006F 0334 0323 031B +1ECD 031B 0334 +1ECD 0334 031B +1EE3 0334 +004F 031B 0323 0334 +004F 031B 0334 0323 +1ECC 031B 0334 1EE2 0334 006F 0323 0334 006F 0334 0323 @@ -60185,14 +61506,14 @@ A79C 003F 004F 0323 0334 004F 0334 0323 1ECC 0334 -006F 0302 0323 0334 -006F 0302 0334 0323 -006F 0334 0323 0302 -1ECD 0334 0302 -004F 0302 0323 0334 -004F 0323 0302 0334 -1ECC 0302 0334 -1ECC 0334 0302 +006F 0334 0302 0323 +00F4 0323 0334 +00F4 0334 0323 +1ED9 0334 +004F 0323 0334 0302 +004F 0334 0323 0302 +00D4 0323 0334 +00D4 0334 0323 0334 0366 0366 0334 0334 1DF3 @@ -60908,8 +62229,8 @@ FF30 003F 1F18A 0334 0070 0301 0334 0070 0334 0301 -0070 0334 0341 0070 0341 0334 +1E55 0334 0050 0301 0334 0050 0334 0301 0050 0341 0334 @@ -61632,12 +62953,12 @@ A7A6 003F 1F181 0334 0072 0301 0334 0072 0334 0301 +0072 0334 0341 0072 0341 0334 -0155 0334 0052 0301 0334 0052 0334 0301 -0052 0334 0341 0052 0341 0334 +0154 0334 0072 030C 0334 0072 0334 030C 0159 0334 @@ -61674,14 +62995,14 @@ A7A6 003F 0052 0323 0334 0052 0334 0323 1E5A 0334 -0072 0323 0304 0334 +0072 0334 0304 0323 0072 0334 0323 0304 1E5B 0334 0304 1E5D 0334 +0052 0304 0334 0323 0052 0323 0304 0334 +0052 0323 0334 0304 0052 0334 0304 0323 -0052 0334 0323 0304 -1E5C 0334 0072 0331 0334 0072 0334 0331 1E5F 0334 @@ -62263,21 +63584,21 @@ A7A8 003F 1F142 0334 1F182 0334 0073 0301 0334 +0073 0334 0301 0073 0334 0341 0073 0341 0334 -015B 0334 +0053 0301 0334 0053 0334 0301 0053 0334 0341 0053 0341 0334 -015A 0334 0073 0301 0307 0334 0073 0334 0301 0307 0073 0334 0341 0307 -1E65 0334 +0073 0341 0334 0307 0053 0301 0334 0307 -0053 0334 0301 0307 -0053 0341 0307 0334 0053 0341 0334 0307 +015A 0307 0334 +1E64 0334 0073 0302 0334 0073 0334 0302 015D 0334 @@ -62292,12 +63613,12 @@ A7A8 003F 0160 0334 0073 030C 0307 0334 0073 030C 0334 0307 -0073 0334 030C 0307 +0161 0307 0334 0161 0334 0307 0053 030C 0307 0334 -0053 030C 0334 0307 -0053 0334 030C 0307 0160 0307 0334 +0160 0334 0307 +1E66 0334 0073 0307 0334 0073 0334 0307 1E61 0334 @@ -62317,13 +63638,13 @@ A7A8 003F 0053 0334 0323 1E62 0334 0073 0323 0334 0307 -0073 0334 0323 0307 +1E61 0323 0334 1E61 0334 0323 1E63 0307 0334 -0053 0323 0307 0334 -0053 0334 0307 0323 -1E62 0307 0334 -1E62 0334 0307 +0053 0307 0323 0334 +0053 0307 0334 0323 +0053 0323 0334 0307 +1E60 0323 0334 0073 0326 0334 0073 0334 0326 0219 0334 @@ -62563,6 +63884,12 @@ A784 0062 1F14C 0061 1F14C 0041 1F14C 0062 +1F1AA 0021 +1F1AA 003F +1F1AA 0334 +1F1AA 0061 +1F1AA 0041 +1F1AA 0062 2120 0021 2120 003F 2120 0061 @@ -63451,7 +64778,7 @@ A79E 003F 0055 0301 0334 0055 0334 0301 0055 0334 0341 -00DA 0334 +0055 0341 0334 0075 0300 0334 0075 0334 0300 0075 0334 0340 @@ -63459,7 +64786,7 @@ A79E 003F 0055 0300 0334 0055 0334 0300 0055 0334 0340 -00D9 0334 +0055 0340 0334 0075 0306 0334 0075 0334 0306 016D 0334 @@ -63490,38 +64817,38 @@ A79E 003F 0055 0308 0334 0055 0334 0308 00DC 0334 +0075 0308 0301 0334 0075 0308 0334 0301 -0075 0334 0344 -0075 0344 0334 -01D8 0334 -0055 0308 0301 0334 -0055 0334 0308 0301 -00DC 0301 0334 +0075 0308 0334 0341 +0075 0308 0341 0334 +0055 0334 0344 +0055 0344 0334 00DC 0334 0301 -0075 0308 0340 0334 +00DC 0334 0341 +0075 0334 0308 0300 0075 0334 0308 0340 00FC 0300 0334 -00FC 0334 0340 -0055 0308 0300 0334 -0055 0308 0334 0300 -0055 0308 0340 0334 -00DC 0334 0300 -0075 0308 0334 030C +00FC 0340 0334 +0055 0334 0308 0300 +0055 0334 0308 0340 +00DC 0300 0334 +00DC 0340 0334 0075 0334 0308 030C +00FC 030C 0334 00FC 0334 030C 01DA 0334 0055 0308 030C 0334 -0055 0308 0334 030C +0055 0334 0308 030C 00DC 030C 0334 -01D9 0334 +00DC 0334 030C 0075 0308 0304 0334 0075 0308 0334 0304 00FC 0304 0334 -01D6 0334 +00FC 0334 0304 +0055 0308 0304 0334 0055 0308 0334 0304 0055 0334 0308 0304 00DC 0334 0304 -01D5 0334 0075 030B 0334 0075 0334 030B 0171 0334 @@ -63534,14 +64861,14 @@ A79E 003F 0055 0303 0334 0055 0334 0303 0168 0334 -0075 0303 0334 0301 -0075 0303 0334 0341 -0169 0301 0334 +0075 0303 0301 0334 +0075 0303 0341 0334 +0169 0334 0301 0169 0334 0341 0055 0303 0301 0334 -0055 0303 0334 0301 -0168 0301 0334 -1E78 0334 +0055 0303 0341 0334 +0168 0334 0301 +0168 0334 0341 0075 0328 0334 0075 0334 0328 0173 0334 @@ -63554,14 +64881,14 @@ A79E 003F 0055 0304 0334 0055 0334 0304 016A 0334 -0075 0304 0308 0334 0075 0304 0334 0308 +0075 0334 0304 0308 016B 0308 0334 -1E7B 0334 +016B 0334 0308 +0055 0304 0308 0334 0055 0304 0334 0308 0055 0334 0304 0308 016A 0308 0334 -016A 0334 0308 0075 0309 0334 0075 0334 0309 1EE7 0334 @@ -63586,46 +64913,46 @@ A79E 003F 0055 031B 0334 0055 0334 031B 01AF 0334 -0075 0301 0334 031B -0075 031B 0341 0334 -01B0 0301 0334 -1EE9 0334 -0055 0334 0341 031B -01AF 0334 0301 -01AF 0334 0341 -1EE8 0334 -0075 031B 0340 0334 -0075 0334 0340 031B -0075 0340 0334 031B -00F9 031B 0334 -0055 0300 031B 0334 -00D9 0334 031B -01AF 0334 0340 -01AF 0340 0334 -0075 0303 031B 0334 +0075 0301 031B 0334 +0075 0334 031B 0301 +0075 0334 031B 0341 +0075 0341 031B 0334 +0055 0301 0334 031B +0055 031B 0334 0301 +0055 031B 0334 0341 +0055 0341 0334 031B +0075 0300 031B 0334 +00F9 0334 031B +01B0 0300 0334 +01B0 0340 0334 +0055 0300 0334 031B +0055 031B 0334 0300 +0055 031B 0334 0340 +0055 0340 0334 031B +0075 0303 0334 031B 0075 031B 0334 0303 +0075 0334 031B 0303 0169 0334 031B -01B0 0303 0334 -0055 0303 0334 031B 0055 031B 0303 0334 -01AF 0303 0334 -01AF 0334 0303 -0075 0309 0334 031B -01B0 0309 0334 +0055 0334 0303 031B +0055 0334 031B 0303 +0168 031B 0334 +0075 031B 0309 0334 +0075 0334 0309 031B 01B0 0334 0309 -1EE7 0334 031B +1EED 0334 0055 031B 0309 0334 -0055 031B 0334 0309 -0055 0334 031B 0309 -01AF 0309 0334 -0075 031B 0323 0334 +0055 0334 0309 031B +01AF 0334 0309 +1EE6 0334 031B 0075 031B 0334 0323 0075 0323 0334 031B 0075 0334 031B 0323 +1EF1 0334 +0055 031B 0323 0334 0055 0323 031B 0334 -01AF 0323 0334 -01AF 0334 0323 -1EE4 031B 0334 +0055 0334 031B 0323 +0055 0334 0323 031B 0075 0323 0334 0075 0334 0323 1EE5 0334 @@ -63971,6 +65298,12 @@ A79E 0062 1E76 0062 1E75 0062 1E74 0062 +1F1AB 0021 +1F1AB 003F +1F1AB 0334 +1F1AB 0061 +1F1AB 0041 +1F1AB 0062 1F199 0334 1F199 0021 1F199 003F @@ -64456,6 +65789,12 @@ FF36 0062 33DE 0061 33DE 0041 33DE 0062 +1F1AC 0021 +1F1AC 003F +1F1AC 0334 +1F1AC 0061 +1F1AC 0041 +1F1AC 0062 1F19A 0021 1F19A 003F 1F19A 0334 @@ -64679,20 +66018,20 @@ FF37 003F 1F146 0334 1F186 0334 0077 0301 0334 +0077 0334 0301 0077 0334 0341 -0077 0341 0334 1E83 0334 0057 0301 0334 0057 0334 0301 0057 0334 0341 -0057 0341 0334 +1E82 0334 0077 0300 0334 0077 0334 0300 0077 0334 0340 -0077 0340 0334 +1E81 0334 0057 0300 0334 +0057 0334 0300 0057 0334 0340 -0057 0340 0334 1E80 0334 0077 0302 0334 0077 0334 0302 @@ -65411,18 +66750,18 @@ FF39 003F 0079 0301 0334 0079 0334 0301 0079 0334 0341 -0079 0341 0334 +00FD 0334 0059 0301 0334 0059 0334 0301 -0059 0341 0334 +0059 0334 0341 00DD 0334 +0079 0300 0334 0079 0334 0300 0079 0334 0340 -0079 0340 0334 1EF3 0334 +0059 0300 0334 0059 0334 0300 0059 0334 0340 -0059 0340 0334 1EF2 0334 0079 0302 0334 0079 0334 0302 @@ -65822,11 +67161,11 @@ FF3A 003F 1F189 0334 007A 0301 0334 007A 0334 0301 -007A 0341 0334 +007A 0334 0341 017A 0334 005A 0301 0334 +005A 0334 0301 005A 0334 0341 -005A 0341 0334 0179 0334 007A 0302 0334 007A 0334 0302 @@ -66639,63 +67978,63 @@ A724 0062 0391 0313 0334 0391 0334 0313 0391 0334 0343 -1F08 0334 -03B1 0313 0341 0334 -03B1 0334 0343 0301 -03B1 0334 0343 0341 -1F00 0334 0301 -0391 0334 0313 0301 -0391 0334 0313 0341 -1F08 0301 0334 -1F0C 0334 -03B1 0334 0313 0301 0345 -03B1 0334 0345 0313 0301 -03B1 0343 0301 0345 0334 -1F00 0334 0345 0301 -0391 0334 0343 0301 0345 -0391 0343 0334 0345 0341 -0391 0345 0313 0334 0341 -1FBC 0334 0343 0341 -03B1 0334 0343 0300 -03B1 0334 0343 0340 -1F00 0334 0300 -1F02 0334 -0391 0334 0313 0300 -0391 0334 0313 0340 -1F08 0300 0334 -1F0A 0334 -03B1 0343 0300 0345 0334 -03B1 0343 0345 0334 0340 -03B1 0345 0313 0300 0334 -1F00 0345 0340 0334 -0391 0343 0334 0345 0340 -0391 0345 0313 0334 0340 -1F08 0300 0345 0334 -1FBC 0334 0343 0340 +0391 0343 0334 +03B1 0343 0334 0301 +03B1 0343 0334 0341 +1F00 0301 0334 +1F00 0341 0334 +0391 0313 0334 0301 +0391 0313 0334 0341 +1F08 0334 0301 +1F08 0334 0341 +03B1 0345 0334 0313 0341 +03B1 0345 0343 0334 0301 +1FB3 0334 0343 0341 +1FB3 0343 0334 0341 +0391 0313 0341 0334 0345 +0391 0313 0345 0334 0341 +0391 0313 0345 0341 0334 +0391 0334 0345 0343 0341 +03B1 0343 0334 0300 +03B1 0343 0334 0340 +1F00 0300 0334 +1F00 0340 0334 +0391 0313 0334 0300 +0391 0313 0334 0340 +1F08 0334 0300 +1F08 0334 0340 +03B1 0313 0334 0340 0345 +03B1 0313 0345 0300 0334 +03B1 0345 0334 0313 0340 +1FB3 0313 0300 0334 +0391 0334 0313 0345 0340 +0391 0345 0313 0334 0300 +1F88 0340 0334 +1FBC 0343 0300 0334 03B1 0313 0334 0342 -03B1 0313 0342 0334 03B1 0334 0343 0342 -03B1 0343 0342 0334 +03B1 0343 0334 0342 +1F00 0342 0334 0391 0334 0313 0342 -0391 0343 0334 0342 -0391 0343 0342 0334 -1F08 0342 0334 -03B1 0334 0343 0342 0345 -03B1 0345 0343 0342 0334 -1F00 0334 0345 0342 -1FB3 0343 0342 0334 -0391 0345 0313 0334 0342 -1F08 0342 0345 0334 -1FBC 0313 0334 0342 -1FBC 0334 0343 0342 -03B1 0313 0334 0345 -03B1 0343 0334 0345 -03B1 0345 0313 0334 -03B1 0345 0343 0334 -0391 0334 0313 0345 -0391 0334 0345 0343 -0391 0345 0313 0334 -1FBC 0334 0313 +0391 0334 0343 0342 +1F08 0334 0342 +1F0E 0334 +03B1 0313 0334 0342 0345 +03B1 0313 0345 0342 0334 +03B1 0345 0334 0313 0342 +1F80 0342 0334 +0391 0313 0342 0334 0345 +0391 0313 0345 0334 0342 +0391 0334 0345 0343 0342 +1FBC 0343 0342 0334 +03B1 0313 0345 0334 +1F00 0334 0345 +1FB3 0313 0334 +1FB3 0334 0313 +0391 0343 0334 0345 +0391 0345 0334 0343 +1F08 0345 0334 +1FBC 0313 0334 03B1 0314 0334 03B1 0334 0314 1F01 0334 @@ -66703,85 +68042,85 @@ A724 0062 0391 0334 0314 1F09 0334 03B1 0314 0334 0301 -03B1 0334 0314 0341 +03B1 0334 0314 0301 1F01 0301 0334 -1F05 0334 -0391 0314 0301 0334 -0391 0334 0314 0301 -0391 0334 0314 0341 -1F09 0341 0334 -03B1 0334 0314 0301 0345 -03B1 0334 0314 0345 0301 -03B1 0345 0334 0314 0341 -1F01 0334 0341 0345 -0391 0334 0314 0341 0345 -1F09 0301 0334 0345 -1F09 0334 0345 0301 -1F09 0345 0341 0334 -03B1 0314 0300 0334 -03B1 0314 0334 0340 -03B1 0314 0340 0334 -03B1 0334 0314 0300 -0391 0314 0334 0300 -0391 0314 0334 0340 -1F09 0300 0334 -1F09 0340 0334 -03B1 0314 0334 0300 0345 -03B1 0314 0345 0340 0334 -1F81 0340 0334 -1F83 0334 -0391 0334 0345 0314 0300 -1F09 0334 0345 0300 -1F0B 0345 0334 -1FBC 0314 0300 0334 +1F01 0341 0334 +1F09 0301 0334 +1F09 0334 0301 +1F09 0334 0341 +1F0D 0334 +03B1 0314 0334 0341 0345 +03B1 0314 0345 0301 0334 +1F01 0301 0345 0334 +1F01 0334 0345 0341 +0391 0345 0334 0314 0301 +1F09 0301 0345 0334 +1F09 0334 0341 0345 +1F09 0345 0334 0301 +03B1 0314 0334 0300 +1F01 0300 0334 +1F01 0340 0334 +1F03 0334 +0391 0334 0314 0300 +0391 0334 0314 0340 +1F09 0334 0300 +1F09 0334 0340 +1F01 0334 0345 0340 +1F01 0340 0345 0334 +1F81 0300 0334 +1FB3 0314 0340 0334 +0391 0314 0334 0340 0345 +0391 0314 0345 0300 0334 +1F09 0340 0334 0345 +1F09 0345 0334 0300 03B1 0314 0334 0342 -03B1 0314 0342 0334 03B1 0334 0314 0342 +1F01 0334 0342 1F01 0342 0334 -0391 0314 0342 0334 +0391 0314 0334 0342 0391 0334 0314 0342 -1F09 0342 0334 +1F09 0334 0342 1F0F 0334 03B1 0314 0342 0334 0345 -03B1 0314 0345 0342 0334 -03B1 0345 0334 0314 0342 +03B1 0314 0345 0334 0342 1F81 0342 0334 -0391 0314 0342 0334 0345 +1FB3 0314 0342 0334 +0391 0314 0334 0342 0345 0391 0314 0345 0342 0334 -1F09 0342 0334 0345 -1F8F 0334 -03B1 0334 0314 0345 -03B1 0334 0345 0314 +1F09 0334 0345 0342 +1F09 0342 0345 0334 1F01 0345 0334 +1F81 0334 1FB3 0314 0334 -0391 0334 0314 0345 -0391 0345 0314 0334 -1F09 0334 0345 +1FB3 0334 0314 +0391 0314 0345 0334 +0391 0334 0345 0314 1F89 0334 +1FBC 0334 0314 03AC 0334 -03B1 0301 0334 -03B1 0341 0334 +03B1 0334 0301 +03B1 0334 0341 1F71 0334 0391 0301 0334 0391 0334 0301 0391 0334 0341 0391 0341 0334 -03AC 0345 0334 -03B1 0301 0334 0345 -03B1 0301 0345 0334 -03B1 0334 0341 0345 +03B1 0334 0345 0301 +03B1 0334 0345 0341 +03B1 0341 0345 0334 +1FB4 0334 03B1 0300 0334 03B1 0334 0300 03B1 0334 0340 1F70 0334 +0391 0300 0334 0391 0334 0300 0391 0334 0340 0391 0340 0334 -1FBA 0334 -03B1 0334 0300 0345 -03B1 0340 0334 0345 -03B1 0345 0300 0334 -1FB3 0300 0334 +03B1 0334 0345 0300 +03B1 0334 0345 0340 +03B1 0340 0345 0334 +1FB2 0334 03B1 0306 0334 03B1 0334 0306 1FB0 0334 @@ -66791,10 +68130,10 @@ A724 0062 03B1 0334 0342 03B1 0342 0334 1FB6 0334 -03B1 0334 0342 0345 +1FB3 0334 0342 1FB3 0342 0334 1FB6 0334 0345 -1FB7 0334 +1FB6 0345 0334 03B1 0304 0334 03B1 0334 0304 1FB1 0334 @@ -67338,63 +68677,63 @@ A724 0062 03B5 0343 0334 1F10 0334 0395 0313 0334 +0395 0334 0313 0395 0334 0343 0395 0343 0334 -1F18 0334 -03B5 0313 0301 0334 -03B5 0343 0301 0334 -03B5 0343 0341 0334 -1F10 0334 0301 -0395 0313 0341 0334 -0395 0343 0334 0341 -1F18 0301 0334 -1F18 0334 0301 -03B5 0313 0300 0334 +03B5 0334 0343 0301 +03B5 0334 0343 0341 +03B5 0343 0334 0301 +1F14 0334 +0395 0313 0334 0301 +0395 0313 0334 0341 +0395 0334 0313 0301 +0395 0334 0313 0341 +03B5 0334 0343 0300 +03B5 0343 0334 0300 03B5 0343 0334 0340 -1F10 0334 0300 -1F10 0334 0340 +1F12 0334 +0395 0313 0334 0300 0395 0313 0334 0340 -0395 0313 0340 0334 -0395 0343 0334 0340 -1F18 0334 0300 +0395 0334 0313 0300 +0395 0334 0313 0340 03B5 0314 0334 03B5 0334 0314 1F11 0334 0395 0314 0334 0395 0334 0314 1F19 0334 -03B5 0314 0334 0341 -03B5 0314 0341 0334 +03B5 0314 0334 0301 03B5 0334 0314 0301 -1F15 0334 +1F11 0301 0334 +1F11 0341 0334 0395 0314 0334 0301 0395 0314 0334 0341 0395 0334 0314 0301 -1F19 0341 0334 -03B5 0314 0300 0334 +0395 0334 0314 0341 03B5 0314 0334 0300 03B5 0314 0334 0340 03B5 0334 0314 0300 -0395 0314 0334 0340 -0395 0314 0340 0334 +03B5 0334 0314 0340 0395 0334 0314 0300 -1F19 0340 0334 +0395 0334 0314 0340 +1F19 0334 0300 +1F19 0334 0340 03AD 0334 -03B5 0334 0301 -03B5 0334 0341 +03B5 0301 0334 +03B5 0341 0334 1F73 0334 0388 0334 0395 0301 0334 -0395 0334 0301 +0395 0341 0334 1FC9 0334 +03B5 0300 0334 03B5 0334 0300 -03B5 0334 0340 03B5 0340 0334 1F72 0334 0395 0300 0334 0395 0334 0300 +0395 0334 0340 0395 0340 0334 -1FC8 0334 03B5 0061 03B5 0041 03F5 0061 @@ -67743,162 +69082,162 @@ A724 0062 1D722 0334 1D75C 0334 1D796 0334 +03B7 0313 0334 03B7 0334 0313 -03B7 0334 0343 03B7 0343 0334 1F20 0334 0397 0313 0334 0397 0334 0313 0397 0334 0343 -1F28 0334 -03B7 0334 0313 0341 -03B7 0334 0343 0341 +0397 0343 0334 +03B7 0343 0301 0334 +03B7 0343 0334 0301 +03B7 0343 0334 0341 03B7 0343 0341 0334 -1F20 0341 0334 -0397 0313 0334 0301 +0397 0313 0301 0334 0397 0313 0341 0334 -0397 0334 0313 0301 -0397 0334 0313 0341 -03B7 0313 0301 0334 0345 -03B7 0313 0345 0334 0301 -03B7 0343 0341 0334 0345 -03B7 0345 0343 0341 0334 -0397 0343 0334 0341 0345 -0397 0343 0334 0345 0341 -1FCC 0313 0341 0334 -1FCC 0343 0341 0334 -03B7 0334 0313 0340 -03B7 0334 0343 0340 +1F28 0334 0301 +1F28 0334 0341 +03B7 0345 0343 0334 0341 +1F20 0301 0345 0334 +1F20 0345 0334 0301 +1FC3 0313 0334 0301 +0397 0334 0313 0345 0301 +1F28 0334 0341 0345 +1F28 0345 0301 0334 +1FCC 0343 0334 0301 +03B7 0343 0334 0300 +03B7 0343 0334 0340 1F20 0300 0334 -1F20 0334 0340 -0397 0313 0300 0334 +1F20 0340 0334 0397 0334 0313 0300 0397 0334 0313 0340 -0397 0343 0300 0334 -03B7 0313 0345 0334 0300 -03B7 0313 0345 0340 0334 -03B7 0343 0345 0340 0334 -1FC3 0334 0313 0300 -0397 0313 0334 0300 0345 -0397 0343 0334 0345 0340 -0397 0343 0340 0345 0334 -1F28 0300 0334 0345 +1F28 0334 0300 +1F28 0334 0340 +03B7 0334 0313 0340 0345 +03B7 0343 0334 0345 0340 +03B7 0345 0334 0343 0340 +1FC3 0313 0334 0300 +0397 0334 0313 0345 0300 +0397 0345 0313 0334 0340 +1FCC 0334 0343 0300 +1FCC 0343 0334 0300 03B7 0313 0342 0334 03B7 0334 0313 0342 -1F20 0334 0342 -1F20 0342 0334 +03B7 0334 0343 0342 +03B7 0343 0342 0334 +0397 0313 0342 0334 0397 0334 0313 0342 -0397 0343 0334 0342 -1F28 0334 0342 -1F2E 0334 -03B7 0313 0345 0334 0342 -03B7 0313 0345 0342 0334 -03B7 0334 0313 0342 0345 -1F20 0334 0345 0342 -0397 0334 0343 0342 0345 -0397 0343 0334 0345 0342 -1F28 0334 0345 0342 -1F28 0342 0345 0334 +0397 0334 0343 0342 +0397 0343 0342 0334 +03B7 0345 0343 0334 0342 +1F20 0342 0334 0345 +1F20 0345 0334 0342 +1F26 0345 0334 +0397 0334 0313 0345 0342 +1F2E 0345 0334 +1FCC 0334 0343 0342 +1FCC 0343 0334 0342 03B7 0334 0343 0345 +03B7 0343 0334 0345 +03B7 0345 0334 0343 03B7 0345 0343 0334 -1FC3 0313 0334 -1FC3 0343 0334 +0397 0313 0334 0345 0397 0334 0313 0345 0397 0345 0313 0334 -1FCC 0313 0334 -1FCC 0343 0334 +1F28 0345 0334 03B7 0314 0334 03B7 0334 0314 1F21 0334 0397 0314 0334 0397 0334 0314 1F29 0334 -03B7 0314 0301 0334 -03B7 0314 0341 0334 +03B7 0314 0334 0301 03B7 0334 0314 0301 -1F21 0334 0341 -0397 0314 0301 0334 +1F21 0301 0334 +1F21 0341 0334 0397 0334 0314 0301 1F29 0334 0301 +1F29 0334 0341 1F2D 0334 -03B7 0314 0301 0345 0334 -03B7 0314 0334 0345 0301 -03B7 0314 0334 0345 0341 -03B7 0314 0345 0334 0301 -0397 0314 0334 0345 0341 -0397 0334 0314 0345 0301 -1F29 0334 0301 0345 -1F29 0341 0345 0334 -03B7 0334 0314 0300 -03B7 0334 0314 0340 -1F21 0334 0300 -1F21 0334 0340 +1F25 0334 0345 +1F25 0345 0334 +1FC3 0314 0334 0341 +1FC3 0334 0314 0301 +0397 0334 0314 0345 0341 +0397 0334 0345 0314 0341 +0397 0345 0314 0301 0334 +1F2D 0345 0334 +03B7 0314 0334 0300 +1F21 0300 0334 +1F21 0340 0334 +1F23 0334 +0397 0314 0334 0300 0397 0314 0334 0340 -0397 0334 0314 0300 1F29 0334 0300 -1F2B 0334 -03B7 0314 0334 0345 0340 -03B7 0314 0345 0340 0334 -1F21 0300 0334 0345 -1FC3 0314 0334 0300 -0397 0314 0340 0334 0345 -0397 0334 0314 0345 0300 -1F29 0334 0340 0345 -1F9B 0334 +1F29 0334 0340 +1F23 0334 0345 +1F93 0334 +1FC3 0314 0334 0340 +1FC3 0334 0314 0300 +0397 0334 0314 0345 0340 +0397 0334 0345 0314 0340 +1F29 0334 0300 0345 +1F29 0345 0340 0334 03B7 0314 0334 0342 +03B7 0314 0342 0334 03B7 0334 0314 0342 -1F21 0334 0342 1F21 0342 0334 0397 0314 0334 0342 +0397 0314 0342 0334 0397 0334 0314 0342 1F29 0334 0342 -1F29 0342 0334 -03B7 0314 0334 0345 0342 -1F21 0334 0345 0342 -1F27 0334 0345 -1F97 0334 -0397 0314 0334 0345 0342 -0397 0314 0342 0334 0345 +03B7 0334 0314 0342 0345 +1F27 0345 0334 +1FC3 0314 0334 0342 +1FC3 0334 0314 0342 +0397 0334 0314 0345 0342 +0397 0334 0345 0314 0342 +0397 0345 0314 0334 0342 1F2F 0345 0334 -1FCC 0314 0342 0334 -03B7 0314 0334 0345 +03B7 0314 0345 0334 03B7 0334 0314 0345 -03B7 0345 0314 0334 -1FC3 0334 0314 +03B7 0334 0345 0314 +1F91 0334 0397 0314 0345 0334 0397 0334 0314 0345 0397 0345 0314 0334 -1FCC 0314 0334 +0397 0345 0334 0314 +03AE 0334 03B7 0301 0334 -03B7 0334 0341 +03B7 0334 0301 03B7 0341 0334 -1F75 0334 -0389 0334 +0397 0301 0334 0397 0334 0301 0397 0334 0341 -1FCB 0334 -03B7 0334 0301 0345 -03B7 0334 0345 0301 -03B7 0345 0334 0341 -1FC3 0334 0301 +0397 0341 0334 +03B7 0301 0334 0345 +03B7 0301 0345 0334 +1FC3 0301 0334 +1FC3 0341 0334 03B7 0300 0334 03B7 0334 0300 -03B7 0334 0340 03B7 0340 0334 +1F74 0334 +0397 0300 0334 0397 0334 0300 -0397 0334 0340 0397 0340 0334 1FCA 0334 -03B7 0334 0345 0300 -03B7 0340 0334 0345 -03B7 0345 0334 0340 -1FC2 0334 +03B7 0300 0334 0345 +03B7 0300 0345 0334 +1FC3 0300 0334 +1FC3 0340 0334 03B7 0334 0342 03B7 0342 0334 1FC6 0334 -03B7 0342 0345 0334 +03B7 0342 0334 0345 03B7 0345 0334 0342 -1FC3 0342 0334 +1FC6 0334 0345 1FC6 0345 0334 03B7 0334 0345 03B7 0345 0334 @@ -68327,96 +69666,96 @@ A724 0062 1D724 0334 1D75E 0334 1D798 0334 +03B9 0313 0334 03B9 0334 0313 03B9 0334 0343 -1FBE 0313 0334 -1FBE 0343 0334 +03B9 0343 0334 0399 0313 0334 +0399 0334 0313 0399 0334 0343 0399 0343 0334 -1F38 0334 +03B9 0334 0343 0301 +03B9 0343 0301 0334 +03B9 0343 0341 0334 1F34 0334 -1FBE 0313 0334 0301 -1FBE 0313 0334 0341 -1FBE 0343 0341 0334 0399 0313 0301 0334 -0399 0343 0341 0334 -1F38 0341 0334 -1F3C 0334 +0399 0313 0341 0334 +0399 0334 0313 0301 +0399 0334 0313 0341 03B9 0334 0343 0300 -1F30 0340 0334 -1FBE 0313 0334 0300 -1FBE 0313 0334 0340 +1F32 0334 +1FBE 0343 0300 0334 +1FBE 0343 0340 0334 0399 0313 0300 0334 -0399 0343 0340 0334 -1F38 0340 0334 -1F3A 0334 -1FBE 0313 0334 0342 -1FBE 0313 0342 0334 -1FBE 0334 0313 0342 +0399 0313 0340 0334 +0399 0334 0313 0300 +0399 0334 0313 0340 +03B9 0334 0343 0342 +03B9 0343 0334 0342 +03B9 0343 0342 0334 1FBE 0343 0334 0342 0399 0313 0342 0334 0399 0334 0313 0342 +0399 0343 0342 0334 1F38 0334 0342 -1F3E 0334 03B9 0314 0334 03B9 0334 0314 1F31 0334 -1FBE 0314 0334 +1FBE 0334 0314 0399 0314 0334 0399 0334 0314 1F39 0334 -03B9 0314 0301 0334 -03B9 0314 0341 0334 -1F31 0341 0334 -1FBE 0334 0314 0301 +1F31 0334 0301 +1F31 0334 0341 +1FBE 0314 0301 0334 +1FBE 0314 0341 0334 0399 0314 0301 0334 0399 0314 0341 0334 1F39 0334 0301 -1F39 0341 0334 -03B9 0314 0340 0334 +1F39 0334 0341 +1F31 0300 0334 +1F31 0334 0300 +1F31 0334 0340 1F33 0334 -1FBE 0314 0334 0340 -1FBE 0334 0314 0300 -0399 0314 0334 0300 -0399 0314 0334 0340 -1F39 0300 0334 +0399 0314 0300 0334 +0399 0314 0340 0334 1F39 0334 0300 +1F39 0334 0340 +03B9 0314 0334 0342 03B9 0314 0342 0334 03B9 0334 0314 0342 -1F31 0334 0342 -1F31 0342 0334 +1FBE 0314 0342 0334 0399 0314 0342 0334 0399 0334 0314 0342 -1F39 0342 0334 +1F39 0334 0342 1F3F 0334 +03AF 0334 03B9 0301 0334 -1FBE 0334 0301 -1FBE 0334 0341 -1FBE 0341 0334 +03B9 0341 0334 +1FBE 0301 0334 038A 0334 -0399 0334 0301 -0399 0334 0341 +0399 0301 0334 +0399 0341 0334 1FDB 0334 +03B9 0300 0334 03B9 0340 0334 -1F76 0334 1FBE 0300 0334 1FBE 0340 0334 0399 0300 0334 0399 0334 0300 0399 0334 0340 -1FDA 0334 +0399 0340 0334 +03B9 0306 0334 03B9 0334 0306 -1FBE 0306 0334 1FBE 0334 0306 1FD0 0334 0399 0306 0334 0399 0334 0306 1FD8 0334 +03B9 0334 0342 03B9 0342 0334 1FBE 0334 0342 1FBE 0342 0334 -1FD6 0334 03B9 0308 0334 03B9 0334 0308 03CA 0334 @@ -68424,22 +69763,22 @@ A724 0062 0399 0308 0334 0399 0334 0308 03AA 0334 -03B9 0308 0301 0334 -03B9 0334 0344 -1FBE 0308 0341 0334 -1FBE 0344 0334 -03B9 0308 0334 0340 -03B9 0308 0340 0334 -03CA 0340 0334 +0390 0334 +03B9 0308 0334 0301 +03B9 0308 0334 0341 +1FD3 0334 +03B9 0308 0334 0300 +1FBE 0308 0300 0334 1FBE 0308 0340 0334 +1FD2 0334 03B9 0308 0334 0342 -03B9 0334 0308 0342 +03CA 0342 0334 1FBE 0308 0334 0342 1FBE 0308 0342 0334 03B9 0304 0334 03B9 0334 0304 -1FBE 0304 0334 1FBE 0334 0304 +1FD1 0334 0399 0304 0334 0399 0334 0304 1FD9 0334 @@ -69110,59 +70449,59 @@ A724 0062 1D764 0334 1D79E 0334 03BF 0313 0334 +03BF 0334 0313 03BF 0334 0343 -03BF 0343 0334 1F40 0334 039F 0313 0334 039F 0334 0313 039F 0334 0343 -1F48 0334 -03BF 0313 0334 0301 -03BF 0313 0334 0341 -03BF 0313 0341 0334 -03BF 0334 0343 0341 -039F 0313 0334 0301 -039F 0313 0341 0334 -039F 0343 0301 0334 -1F48 0341 0334 -03BF 0313 0334 0300 -03BF 0313 0334 0340 -03BF 0313 0340 0334 -03BF 0343 0300 0334 -039F 0313 0334 0300 -039F 0313 0340 0334 -039F 0343 0300 0334 -1F48 0340 0334 +039F 0343 0334 +03BF 0334 0313 0301 +03BF 0334 0313 0341 +1F40 0301 0334 +1F40 0341 0334 +039F 0334 0343 0301 +039F 0334 0343 0341 +1F48 0334 0301 +1F48 0334 0341 +03BF 0334 0313 0300 +03BF 0334 0313 0340 +1F40 0300 0334 +1F40 0340 0334 +039F 0343 0334 0300 +039F 0343 0334 0340 +1F48 0334 0300 +1F48 0334 0340 03BF 0314 0334 03BF 0334 0314 1F41 0334 039F 0314 0334 039F 0334 0314 1F49 0334 -03BF 0314 0334 0301 +03BF 0334 0314 0301 +03BF 0334 0314 0341 1F41 0301 0334 -1F41 0334 0341 -1F45 0334 -039F 0314 0301 0334 -039F 0314 0334 0341 +1F41 0341 0334 +039F 0314 0334 0301 039F 0334 0314 0301 +1F49 0334 0301 1F49 0334 0341 -03BF 0314 0334 0300 -03BF 0314 0340 0334 -1F41 0334 0340 -1F43 0334 -039F 0314 0300 0334 -039F 0314 0334 0340 +03BF 0334 0314 0300 +03BF 0334 0314 0340 +1F41 0300 0334 +1F41 0340 0334 +039F 0314 0334 0300 +039F 0334 0314 0300 +1F49 0334 0300 1F49 0334 0340 -1F49 0340 0334 03BF 0334 0301 03BF 0334 0341 -03BF 0341 0334 03CC 0334 -039F 0301 0334 +1F79 0334 +038C 0334 039F 0334 0301 039F 0334 0341 -039F 0341 0334 +1FF9 0334 03BF 0300 0334 03BF 0334 0300 03BF 0334 0340 @@ -69470,8 +70809,8 @@ A724 0062 1D72C 0334 1D766 0334 1D7A0 0334 +03C1 0313 0334 03C1 0334 0313 -03C1 0334 0343 03C1 0343 0334 1FE4 0334 03C1 0314 0334 @@ -69871,20 +71210,20 @@ A724 0062 1D7A4 0334 03C5 0313 0334 03C5 0334 0313 -03C5 0334 0343 03C5 0343 0334 -03C5 0334 0313 0341 -03C5 0334 0343 0341 +1F50 0334 +03C5 0313 0301 0334 +03C5 0313 0341 0334 1F50 0334 0301 -1F50 0334 0341 +1F54 0334 +03C5 0313 0300 0334 03C5 0313 0340 0334 -03C5 0334 0343 0340 -1F50 0334 0340 +1F50 0334 0300 1F52 0334 -03C5 0334 0313 0342 -03C5 0334 0343 0342 -03C5 0343 0334 0342 +03C5 0313 0342 0334 +03C5 0343 0342 0334 1F50 0334 0342 +1F50 0342 0334 03C5 0314 0334 03C5 0334 0314 1F51 0334 @@ -69892,48 +71231,48 @@ A724 0062 03A5 0334 0314 1F59 0334 03C5 0314 0301 0334 -03C5 0314 0334 0341 -03C5 0334 0314 0341 -1F51 0334 0301 -03A5 0314 0341 0334 -03A5 0334 0314 0341 +03C5 0314 0341 0334 +1F51 0301 0334 +1F51 0341 0334 +03A5 0314 0301 0334 +1F59 0334 0301 1F59 0334 0341 1F5D 0334 -03C5 0314 0334 0340 -03C5 0334 0314 0300 -1F51 0334 0300 -1F53 0334 +03C5 0314 0300 0334 +03C5 0314 0340 0334 +1F51 0300 0334 +1F51 0340 0334 +03A5 0314 0300 0334 03A5 0314 0340 0334 -03A5 0334 0314 0340 +1F59 0334 0300 1F59 0334 0340 -1F59 0340 0334 -03C5 0314 0334 0342 +03C5 0314 0342 0334 03C5 0334 0314 0342 +1F51 0334 0342 1F51 0342 0334 -1F57 0334 +03A5 0314 0334 0342 03A5 0314 0342 0334 -03A5 0334 0314 0342 1F59 0334 0342 -1F59 0342 0334 -03C5 0334 0301 +1F5F 0334 +03C5 0301 0334 03C5 0341 0334 03CD 0334 1F7B 0334 038E 0334 03A5 0301 0334 -03A5 0334 0341 03A5 0341 0334 +1FEB 0334 03D2 0301 0334 03D2 0334 0301 -03D2 0341 0334 +03D2 0334 0341 03D3 0334 03C5 0300 0334 03C5 0334 0300 -03C5 0334 0340 03C5 0340 0334 +1F7A 0334 03A5 0300 0334 03A5 0334 0300 -03A5 0334 0340 +03A5 0340 0334 1FEA 0334 03C5 0306 0334 03C5 0334 0306 @@ -69954,17 +71293,17 @@ A724 0062 03D2 0334 0308 03D4 0334 03B0 0334 -03C5 0308 0341 0334 -03C5 0344 0334 -03CB 0341 0334 -03C5 0308 0300 0334 -03C5 0308 0340 0334 +03C5 0334 0308 0301 +03C5 0334 0308 0341 +03CB 0301 0334 +03C5 0334 0308 0300 03CB 0300 0334 -03CB 0334 0300 -03C5 0334 0308 0342 +03CB 0340 0334 +1FE2 0334 +03C5 0308 0334 0342 +03C5 0308 0342 0334 03CB 0334 0342 03CB 0342 0334 -1FE7 0334 03C5 0304 0334 03C5 0334 0304 1FE1 0334 @@ -70493,70 +71832,70 @@ A724 0062 1D734 0334 1D76E 0334 1D7A8 0334 +03C9 0313 0334 03C9 0334 0313 03C9 0334 0343 03C9 0343 0334 -1F60 0334 03A9 0313 0334 +03A9 0334 0313 +03A9 0334 0343 03A9 0343 0334 -2126 0334 0313 -2126 0334 0343 -03C9 0313 0334 0301 -03C9 0334 0343 0301 +03C9 0343 0334 0301 +03C9 0343 0334 0341 +1F60 0301 0334 1F60 0341 0334 -1F64 0334 1F68 0334 0301 -1F6C 0334 -2126 0313 0341 0334 +1F68 0334 0341 2126 0334 0313 0301 -03C9 0334 0313 0301 0345 -03C9 0345 0313 0334 0341 -1F60 0341 0334 0345 -1FA0 0334 0301 +2126 0334 0313 0341 +1F64 0334 0345 +1F64 0345 0334 +1FA0 0301 0334 +1FF3 0313 0341 0334 +03A9 0313 0334 0345 0341 +03A9 0343 0345 0341 0334 1FFC 0343 0334 0341 -2126 0313 0334 0345 0301 -2126 0313 0345 0341 0334 -2126 0345 0343 0334 0301 -03C9 0313 0334 0300 -03C9 0334 0343 0300 +2126 0345 0313 0334 0341 +03C9 0343 0334 0300 +03C9 0343 0334 0340 +1F60 0300 0334 1F60 0340 0334 -1F62 0334 1F68 0334 0300 +1F68 0334 0340 2126 0334 0313 0300 2126 0334 0313 0340 -2126 0343 0334 0300 -03C9 0313 0345 0334 0300 -03C9 0345 0313 0334 0340 -1F60 0345 0340 0334 -1FA0 0334 0300 -03A9 0343 0345 0340 0334 -1FFC 0313 0340 0334 +03C9 0334 0343 0300 0345 +03C9 0343 0334 0340 0345 +03C9 0343 0345 0300 0334 +1F62 0334 0345 +03A9 0313 0334 0345 0340 +03A9 0313 0340 0334 0345 +03A9 0313 0340 0345 0334 1FFC 0343 0334 0340 -2126 0334 0343 0340 0345 -03C9 0313 0334 0342 03C9 0313 0342 0334 -03C9 0334 0343 0342 -03C9 0343 0334 0342 -1F68 0342 0334 +03C9 0343 0342 0334 +1F60 0334 0342 +1F60 0342 0334 +1F68 0334 0342 1F6E 0334 +2126 0313 0342 0334 2126 0334 0313 0342 -2126 0343 0342 0334 -03C9 0343 0342 0345 0334 -03C9 0345 0313 0334 0342 -03C9 0345 0343 0342 0334 -1FF3 0313 0342 0334 -1F6E 0334 0345 -1FA8 0334 0342 -1FFC 0343 0334 0342 -2126 0313 0342 0345 0334 -03C9 0313 0334 0345 -03C9 0313 0345 0334 -03C9 0334 0345 0313 -1FF3 0334 0343 -03A9 0345 0334 0343 -1F68 0334 0345 -2126 0345 0313 0334 -2126 0345 0343 0334 +03C9 0343 0334 0342 0345 +03C9 0343 0345 0342 0334 +1F66 0334 0345 +1F66 0345 0334 +03A9 0313 0334 0345 0342 +03A9 0313 0342 0345 0334 +03A9 0334 0343 0345 0342 +1FFC 0334 0343 0342 +03C9 0334 0343 0345 +03C9 0345 0343 0334 +1F60 0334 0345 +1FF3 0334 0313 +03A9 0334 0313 0345 +03A9 0345 0313 0334 +1F68 0345 0334 +1FFC 0313 0334 03C9 0314 0334 03C9 0334 0314 1F61 0334 @@ -70564,100 +71903,100 @@ A724 0062 03A9 0334 0314 1F69 0334 2126 0334 0314 -03C9 0314 0301 0334 -03C9 0314 0341 0334 +1F61 0301 0334 1F61 0334 0301 -1F65 0334 -1F69 0301 0334 +1F61 0334 0341 +1F61 0341 0334 1F69 0334 0301 -2126 0334 0314 0301 -2126 0334 0314 0341 -03C9 0314 0334 0345 0301 -03C9 0345 0314 0334 0301 +1F69 0334 0341 +1F6D 0334 +2126 0314 0334 0301 +03C9 0314 0334 0301 0345 1F61 0301 0345 0334 -1F65 0345 0334 -03A9 0314 0301 0345 0334 -03A9 0345 0334 0314 0301 -2126 0314 0345 0341 0334 +1F61 0345 0334 0301 +1FA1 0341 0334 +1FA9 0334 0341 +2126 0334 0345 0314 0341 +2126 0345 0314 0334 0301 2126 0345 0334 0314 0341 03C9 0314 0334 0300 03C9 0314 0334 0340 -03C9 0314 0340 0334 03C9 0334 0314 0300 -1F69 0300 0334 -2126 0314 0300 0334 -2126 0314 0334 0340 -2126 0334 0314 0340 +1F63 0334 +03A9 0314 0334 0300 +03A9 0314 0334 0340 +03A9 0334 0314 0300 +03A9 0334 0314 0340 +03C9 0314 0300 0345 0334 03C9 0314 0334 0345 0300 -03C9 0314 0345 0300 0334 -03C9 0345 0314 0300 0334 -03C9 0345 0314 0334 0300 -03A9 0314 0300 0345 0334 -03A9 0345 0334 0314 0300 -1F6B 0345 0334 -2126 0345 0334 0314 0340 +1F61 0340 0334 0345 +1F61 0345 0334 0300 +03A9 0314 0334 0300 0345 +1FA9 0334 0340 +2126 0334 0345 0314 0340 +2126 0345 0314 0334 0300 +03C9 0314 0334 0342 03C9 0314 0342 0334 -03C9 0334 0314 0342 1F61 0334 0342 -1F67 0334 -03A9 0314 0334 0342 -1F69 0342 0334 +1F61 0342 0334 +1F69 0334 0342 1F6F 0334 2126 0314 0334 0342 -03C9 0314 0334 0345 0342 -03C9 0334 0314 0342 0345 -03C9 0345 0314 0334 0342 -1FF3 0314 0342 0334 -03A9 0334 0345 0314 0342 -03A9 0345 0334 0314 0342 -2126 0314 0334 0342 0345 -2126 0345 0334 0314 0342 -03C9 0334 0345 0314 -03C9 0345 0314 0334 +2126 0334 0314 0342 +03C9 0314 0345 0334 0342 +1F61 0334 0345 0342 +1F61 0342 0345 0334 +1F67 0345 0334 +1F6F 0345 0334 +1FA9 0334 0342 +2126 0334 0345 0314 0342 +2126 0345 0314 0334 0342 +03C9 0334 0314 0345 +1F61 0334 0345 1F61 0345 0334 -1FF3 0334 0314 -1F69 0334 0345 -2126 0314 0334 0345 +1FA1 0334 2126 0314 0345 0334 -2126 0334 0314 0345 -03C9 0334 0301 -03C9 0334 0341 +2126 0334 0345 0314 +2126 0345 0314 0334 +2126 0345 0334 0314 +03C9 0301 0334 03C9 0341 0334 03CE 0334 +1F7D 0334 +038F 0334 03A9 0301 0334 -03A9 0334 0341 +03A9 0341 0334 2126 0301 0334 -2126 0341 0334 -03C9 0345 0301 0334 -1F7D 0334 0345 -1FF3 0334 0341 +03C9 0301 0345 0334 +03C9 0334 0345 0301 +03C9 0341 0345 0334 1FF4 0334 +03C9 0300 0334 03C9 0334 0300 -03C9 0334 0340 03C9 0340 0334 1F7C 0334 03A9 0300 0334 -03A9 0334 0300 -03A9 0334 0340 +03A9 0340 0334 2126 0300 0334 -03C9 0340 0334 0345 -03C9 0345 0334 0340 -1F7C 0334 0345 +2126 0340 0334 +03C9 0300 0345 0334 +03C9 0334 0345 0300 +03C9 0334 0345 0340 1FF2 0334 03C9 0334 0342 03C9 0342 0334 1FF6 0334 +03C9 0334 0342 0345 03C9 0334 0345 0342 03C9 0345 0342 0334 1FF3 0334 0342 -1FF6 0334 0345 03C9 0334 0345 03C9 0345 0334 1FF3 0334 03A9 0334 0345 03A9 0345 0334 1FFC 0334 -2126 0334 0345 +2126 0345 0334 1FF3 0021 1FF3 003F 1FFC 0021 @@ -71577,7 +72916,9 @@ AB65 0062 0411 0062 0432 0021 0432 003F +1C80 0021 2DE1 0021 +1C80 003F 2DE1 003F 0412 0021 0412 003F @@ -71585,11 +72926,14 @@ AB65 0062 2DE1 0334 0432 0061 0432 0041 +1C80 0061 2DE1 0061 +1C80 0041 2DE1 0041 0412 0061 0412 0041 0432 0062 +1C80 0062 2DE1 0062 0412 0062 0433 0021 @@ -71605,10 +72949,10 @@ AB65 0062 0433 0301 0334 0433 0334 0301 0433 0334 0341 -0433 0341 0334 +0453 0334 0403 0334 +0413 0301 0334 0413 0334 0301 -0413 0334 0341 0413 0341 0334 0491 0021 0491 003F @@ -71679,7 +73023,9 @@ AB65 0062 04F6 0062 0434 0021 0434 003F +1C81 0021 2DE3 0021 +1C81 003F 2DE3 003F 0414 0021 0414 003F @@ -71687,11 +73033,14 @@ AB65 0062 2DE3 0334 0434 0061 0434 0041 +1C81 0061 2DE3 0061 +1C81 0041 2DE3 0041 0414 0061 0414 0041 0434 0062 +1C81 0062 2DE3 0062 0414 0062 0501 0021 @@ -71772,13 +73121,13 @@ A662 0062 0451 003F 0401 0021 0401 003F +0435 0300 0334 0435 0334 0300 0435 0334 0340 -0435 0340 0334 0450 0334 +0400 0334 0415 0300 0334 0415 0334 0300 -0415 0334 0340 0415 0340 0334 0435 0306 0334 0435 0334 0306 @@ -72071,10 +73420,10 @@ A675 003F 0438 0300 0334 0438 0334 0300 0438 0334 0340 -0438 0340 0334 +045D 0334 040D 0334 0418 0300 0334 -0418 0334 0340 +0418 0334 0300 0418 0340 0334 0438 0308 0334 0438 0334 0308 @@ -72577,6 +73926,7 @@ A666 0062 050A 0062 043E 0021 043E 003F +1C82 0021 2DEA 0021 A669 0021 A66B 0021 @@ -72584,6 +73934,7 @@ A66D 0021 A66E 0021 A699 0021 A69B 0021 +1C82 003F 2DEA 003F A669 003F A66B 003F @@ -72617,6 +73968,7 @@ A69A 003F 2DEA 0334 043E 0061 043E 0041 +1C82 0061 2DEA 0061 A669 0061 A66B 0061 @@ -72624,6 +73976,7 @@ A66D 0061 A66E 0061 A699 0061 A69B 0061 +1C82 0041 2DEA 0041 A669 0041 A66B 0041 @@ -72648,6 +74001,7 @@ A69A 0041 04E6 0061 04E6 0041 043E 0062 +1C82 0062 2DEA 0062 A669 0062 A66B 0062 @@ -72775,7 +74129,9 @@ A69A 0062 0516 0062 0441 0021 0441 003F +1C83 0021 2DED 0021 +1C83 003F 2DED 003F 0421 0021 0421 003F @@ -72783,11 +74139,14 @@ A69A 0062 2DED 0334 0441 0061 0441 0041 +1C83 0061 2DED 0061 +1C83 0041 2DED 0041 0421 0061 0421 0041 0441 0062 +1C83 0062 2DED 0062 0421 0062 2DF5 0021 @@ -72819,7 +74178,11 @@ A69A 0062 04AA 0062 0442 0021 0442 003F +1C84 0021 +1C85 0021 2DEE 0021 +1C84 003F +1C85 003F 2DEE 003F 0422 0021 0422 003F @@ -72827,11 +74190,17 @@ A69A 0062 2DEE 0334 0442 0061 0442 0041 +1C84 0061 +1C85 0061 2DEE 0061 +1C84 0041 +1C85 0041 2DEE 0041 0422 0061 0422 0041 0442 0062 +1C84 0062 +1C85 0062 2DEE 0062 0422 0062 A68D 0021 @@ -72987,7 +74356,9 @@ A677 0062 04B0 0062 A64B 0021 A64B 003F +1C88 0021 2DF9 0021 +1C88 003F 2DF9 003F A64A 0021 A64A 003F @@ -72995,11 +74366,14 @@ A64A 003F 2DF9 0334 A64B 0061 A64B 0041 +1C88 0061 2DF9 0061 +1C88 0041 2DF9 0041 A64A 0061 A64A 0041 A64B 0062 +1C88 0062 2DF9 0062 A64A 0062 0479 0021 @@ -73018,6 +74392,7 @@ A69E 0021 A69E 003F 0424 0021 0424 003F +0334 A69E A69E 0334 0444 0061 0444 0041 @@ -73408,7 +74783,9 @@ A67F 0041 A67F 0062 044A 0021 044A 003F +1C86 0021 A678 0021 +1C86 003F A678 003F 042A 0021 042A 003F @@ -73418,13 +74795,16 @@ A69C 003F A678 0334 044A 0061 044A 0041 +1C86 0061 A678 0061 +1C86 0041 A678 0041 042A 0061 042A 0041 A69C 0061 A69C 0041 044A 0062 +1C86 0062 A678 0062 042A 0062 A69C 0062 @@ -73505,7 +74885,9 @@ A69D 0062 048C 0062 0463 0021 0463 003F +1C87 0021 2DFA 0021 +1C87 003F 2DFA 003F 0462 0021 0462 003F @@ -73513,11 +74895,14 @@ A69D 0062 2DFA 0334 0463 0061 0463 0041 +1C87 0061 2DFA 0061 +1C87 0041 2DFA 0041 0462 0061 0462 0041 0463 0062 +1C87 0062 2DFA 0062 0462 0062 A653 0021 @@ -73833,73 +75218,115 @@ A65E 0062 04C0 0062 2C30 0021 2C30 003F +1E000 0021 +1E000 003F 2C00 0021 2C00 003F +1E000 0334 2C30 0061 2C30 0041 +1E000 0061 +1E000 0041 2C00 0061 2C00 0041 2C30 0062 +1E000 0062 2C00 0062 2C31 0021 2C31 003F +1E001 0021 +1E001 003F 2C01 0021 2C01 003F +1E001 0334 2C31 0061 2C31 0041 +1E001 0061 +1E001 0041 2C01 0061 2C01 0041 2C31 0062 +1E001 0062 2C01 0062 2C32 0021 2C32 003F +1E002 0021 +1E002 003F 2C02 0021 2C02 003F +1E002 0334 2C32 0061 2C32 0041 +1E002 0061 +1E002 0041 2C02 0061 2C02 0041 2C32 0062 +1E002 0062 2C02 0062 2C33 0021 2C33 003F +1E003 0021 +1E003 003F 2C03 0021 2C03 003F +1E003 0334 2C33 0061 2C33 0041 +1E003 0061 +1E003 0041 2C03 0061 2C03 0041 2C33 0062 +1E003 0062 2C03 0062 2C34 0021 2C34 003F +1E004 0021 +1E004 003F 2C04 0021 2C04 003F +1E004 0334 2C34 0061 2C34 0041 +1E004 0061 +1E004 0041 2C04 0061 2C04 0041 2C34 0062 +1E004 0062 2C04 0062 2C35 0021 2C35 003F +1E005 0021 +1E005 003F 2C05 0021 2C05 003F +1E005 0334 2C35 0061 2C35 0041 +1E005 0061 +1E005 0041 2C05 0061 2C05 0041 2C35 0062 +1E005 0062 2C05 0062 2C36 0021 2C36 003F +1E006 0021 +1E006 003F 2C06 0021 2C06 003F +1E006 0334 2C36 0061 2C36 0041 +1E006 0061 +1E006 0041 2C06 0061 2C06 0041 2C36 0062 +1E006 0062 2C06 0062 2C37 0021 2C37 003F @@ -73913,173 +75340,275 @@ A65E 0062 2C07 0062 2C38 0021 2C38 003F +1E008 0021 +1E008 003F 2C08 0021 2C08 003F +1E008 0334 2C38 0061 2C38 0041 +1E008 0061 +1E008 0041 2C08 0061 2C08 0041 2C38 0062 +1E008 0062 2C08 0062 2C39 0021 2C39 003F +1E009 0021 +1E009 003F 2C09 0021 2C09 003F +1E009 0334 2C39 0061 2C39 0041 +1E009 0061 +1E009 0041 2C09 0061 2C09 0041 2C39 0062 +1E009 0062 2C09 0062 2C3A 0021 2C3A 003F +1E00A 0021 +1E00A 003F 2C0A 0021 2C0A 003F +1E00A 0334 2C3A 0061 2C3A 0041 +1E00A 0061 +1E00A 0041 2C0A 0061 2C0A 0041 2C3A 0062 +1E00A 0062 2C0A 0062 2C3B 0021 2C3B 003F +1E00B 0021 +1E00B 003F 2C0B 0021 2C0B 003F +1E00B 0334 2C3B 0061 2C3B 0041 +1E00B 0061 +1E00B 0041 2C0B 0061 2C0B 0041 2C3B 0062 +1E00B 0062 2C0B 0062 2C3C 0021 2C3C 003F +1E00C 0021 +1E00C 003F 2C0C 0021 2C0C 003F +1E00C 0334 2C3C 0061 2C3C 0041 +1E00C 0061 +1E00C 0041 2C0C 0061 2C0C 0041 2C3C 0062 +1E00C 0062 2C0C 0062 2C3D 0021 2C3D 003F +1E00D 0021 +1E00D 003F 2C0D 0021 2C0D 003F +1E00D 0334 2C3D 0061 2C3D 0041 +1E00D 0061 +1E00D 0041 2C0D 0061 2C0D 0041 2C3D 0062 +1E00D 0062 2C0D 0062 2C3E 0021 2C3E 003F +1E00E 0021 +1E00E 003F 2C0E 0021 2C0E 003F +1E00E 0334 2C3E 0061 2C3E 0041 +1E00E 0061 +1E00E 0041 2C0E 0061 2C0E 0041 2C3E 0062 +1E00E 0062 2C0E 0062 2C3F 0021 2C3F 003F +1E00F 0021 +1E00F 003F 2C0F 0021 2C0F 003F +1E00F 0334 2C3F 0061 2C3F 0041 +1E00F 0061 +1E00F 0041 2C0F 0061 2C0F 0041 2C3F 0062 +1E00F 0062 2C0F 0062 2C40 0021 2C40 003F +1E010 0021 +1E010 003F 2C10 0021 2C10 003F +1E010 0334 2C40 0061 2C40 0041 +1E010 0061 +1E010 0041 2C10 0061 2C10 0041 2C40 0062 +1E010 0062 2C10 0062 2C41 0021 2C41 003F +1E011 0021 +1E011 003F 2C11 0021 2C11 003F +1E011 0334 2C41 0061 2C41 0041 +1E011 0061 +1E011 0041 2C11 0061 2C11 0041 2C41 0062 +1E011 0062 2C11 0062 2C42 0021 2C42 003F +1E012 0021 +1E012 003F 2C12 0021 2C12 003F +1E012 0334 2C42 0061 2C42 0041 +1E012 0061 +1E012 0041 2C12 0061 2C12 0041 2C42 0062 +1E012 0062 2C12 0062 2C43 0021 2C43 003F +1E013 0021 +1E013 003F 2C13 0021 2C13 003F +1E013 0334 2C43 0061 2C43 0041 +1E013 0061 +1E013 0041 2C13 0061 2C13 0041 2C43 0062 +1E013 0062 2C13 0062 2C44 0021 2C44 003F +1E014 0021 +1E014 003F 2C14 0021 2C14 003F +1E014 0334 2C44 0061 2C44 0041 +1E014 0061 +1E014 0041 2C14 0061 2C14 0041 2C44 0062 +1E014 0062 2C14 0062 2C45 0021 2C45 003F +1E015 0021 +1E015 003F 2C15 0021 2C15 003F +1E015 0334 2C45 0061 2C45 0041 +1E015 0061 +1E015 0041 2C15 0061 2C15 0041 2C45 0062 +1E015 0062 2C15 0062 2C46 0021 2C46 003F +1E016 0021 +1E016 003F 2C16 0021 2C16 003F +1E016 0334 2C46 0061 2C46 0041 +1E016 0061 +1E016 0041 2C16 0061 2C16 0041 2C46 0062 +1E016 0062 2C16 0062 2C47 0021 2C47 003F +1E017 0021 +1E017 003F 2C17 0021 2C17 003F +1E017 0334 2C47 0061 2C47 0041 +1E017 0061 +1E017 0041 2C17 0061 2C17 0041 2C47 0062 +1E017 0062 2C17 0062 2C48 0021 2C48 003F +1E018 0021 +1E018 003F 2C18 0021 2C18 003F +1E018 0334 2C48 0061 2C48 0041 +1E018 0061 +1E018 0041 2C18 0061 2C18 0041 2C48 0062 +1E018 0062 2C18 0062 2C49 0021 2C49 003F @@ -74103,73 +75632,115 @@ A65E 0062 2C1A 0062 2C4B 0021 2C4B 003F +1E01B 0021 +1E01B 003F 2C1B 0021 2C1B 003F +1E01B 0334 2C4B 0061 2C4B 0041 +1E01B 0061 +1E01B 0041 2C1B 0061 2C1B 0041 2C4B 0062 +1E01B 0062 2C1B 0062 2C4C 0021 2C4C 003F +1E01C 0021 +1E01C 003F 2C1C 0021 2C1C 003F +1E01C 0334 2C4C 0061 2C4C 0041 +1E01C 0061 +1E01C 0041 2C1C 0061 2C1C 0041 2C4C 0062 +1E01C 0062 2C1C 0062 2C4D 0021 2C4D 003F +1E01D 0021 +1E01D 003F 2C1D 0021 2C1D 003F +1E01D 0334 2C4D 0061 2C4D 0041 +1E01D 0061 +1E01D 0041 2C1D 0061 2C1D 0041 2C4D 0062 +1E01D 0062 2C1D 0062 2C4E 0021 2C4E 003F +1E01E 0021 +1E01E 003F 2C1E 0021 2C1E 003F +1E01E 0334 2C4E 0061 2C4E 0041 +1E01E 0061 +1E01E 0041 2C1E 0061 2C1E 0041 2C4E 0062 +1E01E 0062 2C1E 0062 2C4F 0021 2C4F 003F +1E01F 0021 +1E01F 003F 2C1F 0021 2C1F 003F +1E01F 0334 2C4F 0061 2C4F 0041 +1E01F 0061 +1E01F 0041 2C1F 0061 2C1F 0041 2C4F 0062 +1E01F 0062 2C1F 0062 2C50 0021 2C50 003F +1E020 0021 +1E020 003F 2C20 0021 2C20 003F +1E020 0334 2C50 0061 2C50 0041 +1E020 0061 +1E020 0041 2C20 0061 2C20 0041 2C50 0062 +1E020 0062 2C20 0062 2C51 0021 2C51 003F +1E021 0021 +1E021 003F 2C21 0021 2C21 003F +1E021 0334 2C51 0061 2C51 0041 +1E021 0061 +1E021 0041 2C21 0061 2C21 0041 2C51 0062 +1E021 0062 2C21 0062 2C52 0021 2C52 003F @@ -74183,23 +75754,35 @@ A65E 0062 2C22 0062 2C53 0021 2C53 003F +1E023 0021 +1E023 003F 2C23 0021 2C23 003F +1E023 0334 2C53 0061 2C53 0041 +1E023 0061 +1E023 0041 2C23 0061 2C23 0041 2C53 0062 +1E023 0062 2C23 0062 2C54 0021 2C54 003F +1E024 0021 +1E024 003F 2C24 0021 2C24 003F +1E024 0334 2C54 0061 2C54 0041 +1E024 0061 +1E024 0041 2C24 0061 2C24 0041 2C54 0062 +1E024 0062 2C24 0062 2C55 0021 2C55 003F @@ -74213,53 +75796,83 @@ A65E 0062 2C25 0062 2C56 0021 2C56 003F +1E026 0021 +1E026 003F 2C26 0021 2C26 003F +1E026 0334 2C56 0061 2C56 0041 +1E026 0061 +1E026 0041 2C26 0061 2C26 0041 2C56 0062 +1E026 0062 2C26 0062 2C57 0021 2C57 003F +1E027 0021 +1E027 003F 2C27 0021 2C27 003F +1E027 0334 2C57 0061 2C57 0041 +1E027 0061 +1E027 0041 2C27 0061 2C27 0041 2C57 0062 +1E027 0062 2C27 0062 2C58 0021 2C58 003F +1E028 0021 +1E028 003F 2C28 0021 2C28 003F +1E028 0334 2C58 0061 2C58 0041 +1E028 0061 +1E028 0041 2C28 0061 2C28 0041 2C58 0062 +1E028 0062 2C28 0062 2C59 0021 2C59 003F +1E029 0021 +1E029 003F 2C29 0021 2C29 003F +1E029 0334 2C59 0061 2C59 0041 +1E029 0061 +1E029 0041 2C29 0061 2C29 0041 2C59 0062 +1E029 0062 2C29 0062 2C5A 0021 2C5A 003F +1E02A 0021 +1E02A 003F 2C2A 0021 2C2A 003F +1E02A 0334 2C5A 0061 2C5A 0041 +1E02A 0061 +1E02A 0041 2C2A 0061 2C2A 0041 2C5A 0062 +1E02A 0062 2C2A 0062 2C5B 0021 2C5B 003F @@ -76054,14 +77667,14 @@ FB2A 0334 05E9 0334 05BC 05E9 05BC 0334 FB49 0334 -05E9 0334 05C2 05BC +05E9 05BC 0334 05C2 +05E9 05BC 05C2 0334 05E9 05C2 0334 05BC 05E9 05C2 05BC 0334 -FB49 0334 05C2 -05E9 0334 05C1 05BC 05E9 05BC 0334 05C1 +05E9 05BC 05C1 0334 +05E9 05C1 0334 05BC FB2C 0334 -FB49 0334 05C1 FB2B 0021 FB2B 003F FB2A 0021 @@ -77118,6 +78731,16 @@ FB5A 0062 08A1 0061 08A1 0041 08A1 0062 +08B6 0021 +08B6 003F +08B6 0061 +08B6 0041 +08B6 0062 +08B7 0021 +08B7 003F +08B7 0061 +08B7 0041 +08B7 0062 0629 0021 0629 003F FE94 0021 @@ -77558,6 +79181,11 @@ FB64 0062 FB65 0062 FB63 0062 FB62 0062 +08B8 0021 +08B8 003F +08B8 0061 +08B8 0041 +08B8 0062 062C 0021 062C 003F 1EE02 0021 @@ -78428,6 +80056,11 @@ FB8A 0062 08B2 0061 08B2 0041 08B2 0062 +08B9 0021 +08B9 003F +08B9 0061 +08B9 0041 +08B9 0062 0633 0021 0633 003F 1EE0E 0021 @@ -79859,6 +81492,11 @@ FC32 0062 06A2 0061 06A2 0041 06A2 0062 +08BB 0021 +08BB 003F +08BB 0061 +08BB 0041 +08BB 0062 06A3 0021 06A3 003F 06A3 0061 @@ -80082,6 +81720,11 @@ FC36 0062 06A7 0061 06A7 0041 06A7 0062 +08BC 0021 +08BC 003F +08BC 0061 +08BC 0041 +08BC 0062 06A8 0021 06A8 003F 06A8 0061 @@ -81153,6 +82796,11 @@ FB9E 0041 1EE5D 0062 FB9F 0062 FB9E 0062 +08BD 0021 +08BD 003F +08BD 0061 +08BD 0041 +08BD 0062 06BB 0021 06BB 003F FBA2 0021 @@ -81898,6 +83546,11 @@ FBE4 0062 0777 0061 0777 0041 0777 0062 +08BA 0021 +08BA 003F +08BA 0061 +08BA 0041 +08BA 0062 06D2 0021 06D2 003F FBAF 0021 @@ -88238,6 +89891,11 @@ A8FB 0062 0CF2 0061 0CF2 0041 0CF2 0062 +0C80 0021 +0C80 003F +0C80 0061 +0C80 0041 +0C80 0062 0CBE 0021 0CBE 003F 0CBE 0061 @@ -88611,11 +90269,21 @@ A8FB 0062 0D2E 0061 0D2E 0041 0D2E 0062 +0D54 0021 +0D54 003F +0D54 0061 +0D54 0041 +0D54 0062 0D2F 0021 0D2F 003F 0D2F 0061 0D2F 0041 0D2F 0062 +0D55 0021 +0D55 003F +0D55 0061 +0D55 0041 +0D55 0062 0D30 0021 0D30 003F 0D30 0061 @@ -88681,6 +90349,11 @@ A8FB 0062 0D34 0061 0D34 0041 0D34 0062 +0D56 0021 +0D56 003F +0D56 0061 +0D56 0041 +0D56 0062 0D31 0021 0D31 003F 0D31 0061 @@ -89213,7 +90886,7 @@ A8FB 0062 0DD9 0DCF 0334 0DCA 0DD9 0DCF 0DCA 0334 0DDC 0334 0DCA -0DDD 0334 +0DDC 0DCA 0334 0DD9 0DCF 0DCA 0061 0DDC 0DCA 0061 0DDD 0061 @@ -92364,6 +94037,432 @@ A8C4 0062 1135D 0061 1135D 0041 1135D 0062 +11449 0021 +11449 003F +11449 0334 +11449 0061 +11449 0041 +11449 0062 +1144A 0021 +1144A 003F +1144A 0334 +1144A 0061 +1144A 0041 +1144A 0062 +11400 0021 +11400 003F +11400 0334 +11400 0061 +11400 0041 +11400 0062 +11401 0021 +11401 003F +11401 0334 +11401 0061 +11401 0041 +11401 0062 +11402 0021 +11402 003F +11402 0334 +11402 0061 +11402 0041 +11402 0062 +11403 0021 +11403 003F +11403 0334 +11403 0061 +11403 0041 +11403 0062 +11404 0021 +11404 003F +11404 0334 +11404 0061 +11404 0041 +11404 0062 +11405 0021 +11405 003F +11405 0334 +11405 0061 +11405 0041 +11405 0062 +11406 0021 +11406 003F +11406 0334 +11406 0061 +11406 0041 +11406 0062 +11407 0021 +11407 003F +11407 0334 +11407 0061 +11407 0041 +11407 0062 +11408 0021 +11408 003F +11408 0334 +11408 0061 +11408 0041 +11408 0062 +11409 0021 +11409 003F +11409 0334 +11409 0061 +11409 0041 +11409 0062 +1140A 0021 +1140A 003F +1140A 0334 +1140A 0061 +1140A 0041 +1140A 0062 +1140B 0021 +1140B 003F +1140B 0334 +1140B 0061 +1140B 0041 +1140B 0062 +1140C 0021 +1140C 003F +1140C 0334 +1140C 0061 +1140C 0041 +1140C 0062 +1140D 0021 +1140D 003F +1140D 0334 +1140D 0061 +1140D 0041 +1140D 0062 +1140E 0021 +1140E 003F +1140E 0334 +1140E 0061 +1140E 0041 +1140E 0062 +1140F 0021 +1140F 003F +1140F 0334 +1140F 0061 +1140F 0041 +1140F 0062 +11410 0021 +11410 003F +11410 0334 +11410 0061 +11410 0041 +11410 0062 +11411 0021 +11411 003F +11411 0334 +11411 0061 +11411 0041 +11411 0062 +11412 0021 +11412 003F +11412 0334 +11412 0061 +11412 0041 +11412 0062 +11413 0021 +11413 003F +11413 0334 +11413 0061 +11413 0041 +11413 0062 +11414 0021 +11414 003F +11414 0334 +11414 0061 +11414 0041 +11414 0062 +11415 0021 +11415 003F +11415 0334 +11415 0061 +11415 0041 +11415 0062 +11416 0021 +11416 003F +11416 0334 +11416 0061 +11416 0041 +11416 0062 +11417 0021 +11417 003F +11417 0334 +11417 0061 +11417 0041 +11417 0062 +11418 0021 +11418 003F +11418 0334 +11418 0061 +11418 0041 +11418 0062 +11419 0021 +11419 003F +11419 0334 +11419 0061 +11419 0041 +11419 0062 +1141A 0021 +1141A 003F +1141A 0334 +1141A 0061 +1141A 0041 +1141A 0062 +1141B 0021 +1141B 003F +1141B 0334 +1141B 0061 +1141B 0041 +1141B 0062 +1141C 0021 +1141C 003F +1141C 0334 +1141C 0061 +1141C 0041 +1141C 0062 +1141D 0021 +1141D 003F +1141D 0334 +1141D 0061 +1141D 0041 +1141D 0062 +1141E 0021 +1141E 003F +1141E 0334 +1141E 0061 +1141E 0041 +1141E 0062 +1141F 0021 +1141F 003F +1141F 0334 +1141F 0061 +1141F 0041 +1141F 0062 +11420 0021 +11420 003F +11420 0334 +11420 0061 +11420 0041 +11420 0062 +11421 0021 +11421 003F +11421 0334 +11421 0061 +11421 0041 +11421 0062 +11422 0021 +11422 003F +11422 0334 +11422 0061 +11422 0041 +11422 0062 +11423 0021 +11423 003F +11423 0334 +11423 0061 +11423 0041 +11423 0062 +11424 0021 +11424 003F +11424 0334 +11424 0061 +11424 0041 +11424 0062 +11425 0021 +11425 003F +11425 0334 +11425 0061 +11425 0041 +11425 0062 +11426 0021 +11426 003F +11426 0334 +11426 0061 +11426 0041 +11426 0062 +11427 0021 +11427 003F +11427 0334 +11427 0061 +11427 0041 +11427 0062 +11428 0021 +11428 003F +11428 0334 +11428 0061 +11428 0041 +11428 0062 +11429 0021 +11429 003F +11429 0334 +11429 0061 +11429 0041 +11429 0062 +1142A 0021 +1142A 003F +1142A 0334 +1142A 0061 +1142A 0041 +1142A 0062 +1142B 0021 +1142B 003F +1142B 0334 +1142B 0061 +1142B 0041 +1142B 0062 +1142C 0021 +1142C 003F +1142C 0334 +1142C 0061 +1142C 0041 +1142C 0062 +1142D 0021 +1142D 003F +1142D 0334 +1142D 0061 +1142D 0041 +1142D 0062 +1142E 0021 +1142E 003F +1142E 0334 +1142E 0061 +1142E 0041 +1142E 0062 +1142F 0021 +1142F 003F +1142F 0334 +1142F 0061 +1142F 0041 +1142F 0062 +11430 0021 +11430 003F +11430 0334 +11430 0061 +11430 0041 +11430 0062 +11431 0021 +11431 003F +11431 0334 +11431 0061 +11431 0041 +11431 0062 +11432 0021 +11432 003F +11432 0334 +11432 0061 +11432 0041 +11432 0062 +11433 0021 +11433 003F +11433 0334 +11433 0061 +11433 0041 +11433 0062 +11434 0021 +11434 003F +11434 0334 +11434 0061 +11434 0041 +11434 0062 +11447 0021 +11447 003F +11447 0334 +11447 0061 +11447 0041 +11447 0062 +11448 0021 +11448 003F +11448 0334 +11448 0061 +11448 0041 +11448 0062 +11435 0021 +11435 003F +11435 0334 +11435 0061 +11435 0041 +11435 0062 +11436 0021 +11436 003F +11436 0334 +11436 0061 +11436 0041 +11436 0062 +11437 0021 +11437 003F +11437 0334 +11437 0061 +11437 0041 +11437 0062 +11438 0021 +11438 003F +11438 0334 +11438 0061 +11438 0041 +11438 0062 +11439 0021 +11439 003F +11439 0334 +11439 0061 +11439 0041 +11439 0062 +1143A 0021 +1143A 003F +1143A 0334 +1143A 0061 +1143A 0041 +1143A 0062 +1143B 0021 +1143B 003F +1143B 0334 +1143B 0061 +1143B 0041 +1143B 0062 +1143C 0021 +1143C 003F +1143C 0334 +1143C 0061 +1143C 0041 +1143C 0062 +1143D 0021 +1143D 003F +1143D 0334 +1143D 0061 +1143D 0041 +1143D 0062 +1143E 0021 +1143E 003F +1143E 0334 +1143E 0061 +1143E 0041 +1143E 0062 +1143F 0021 +1143F 003F +1143F 0334 +1143F 0061 +1143F 0041 +1143F 0062 +11440 0021 +11440 003F +11440 0334 +11440 0061 +11440 0041 +11440 0062 +11441 0021 +11441 003F +11441 0334 +11441 0061 +11441 0041 +11441 0062 +11442 0021 +11442 003F +11442 0334 +11442 0061 +11442 0041 +11442 0062 114C7 0021 114C7 003F 114C7 0334 @@ -94125,6 +96224,7 @@ A8C4 0062 1172A 0062 1172B 0021 1172B 003F +0334 1172B 1172B 0334 1172B 0061 1172B 0041 @@ -95075,6 +97175,366 @@ A8C4 0062 10A3F 0061 10A3F 0041 10A3F 0062 +11C00 0021 +11C00 003F +11C00 0334 +11C00 0061 +11C00 0041 +11C00 0062 +11C01 0021 +11C01 003F +11C01 0334 +11C01 0061 +11C01 0041 +11C01 0062 +11C02 0021 +11C02 003F +11C02 0334 +11C02 0061 +11C02 0041 +11C02 0062 +11C03 0021 +11C03 003F +11C03 0334 +11C03 0061 +11C03 0041 +11C03 0062 +11C04 0021 +11C04 003F +11C04 0334 +11C04 0061 +11C04 0041 +11C04 0062 +11C05 0021 +11C05 003F +11C05 0334 +11C05 0061 +11C05 0041 +11C05 0062 +11C06 0021 +11C06 003F +11C06 0334 +11C06 0061 +11C06 0041 +11C06 0062 +11C07 0021 +11C07 003F +11C07 0334 +11C07 0061 +11C07 0041 +11C07 0062 +11C08 0021 +11C08 003F +11C08 0334 +11C08 0061 +11C08 0041 +11C08 0062 +11C0A 0021 +11C0A 003F +11C0A 0334 +11C0A 0061 +11C0A 0041 +11C0A 0062 +11C0B 0021 +11C0B 003F +11C0B 0334 +11C0B 0061 +11C0B 0041 +11C0B 0062 +11C0C 0021 +11C0C 003F +11C0C 0334 +11C0C 0061 +11C0C 0041 +11C0C 0062 +11C0D 0021 +11C0D 003F +11C0D 0334 +11C0D 0061 +11C0D 0041 +11C0D 0062 +11C0E 0021 +11C0E 003F +11C0E 0334 +11C0E 0061 +11C0E 0041 +11C0E 0062 +11C0F 0021 +11C0F 003F +11C0F 0334 +11C0F 0061 +11C0F 0041 +11C0F 0062 +11C10 0021 +11C10 003F +11C10 0334 +11C10 0061 +11C10 0041 +11C10 0062 +11C11 0021 +11C11 003F +11C11 0334 +11C11 0061 +11C11 0041 +11C11 0062 +11C12 0021 +11C12 003F +11C12 0334 +11C12 0061 +11C12 0041 +11C12 0062 +11C13 0021 +11C13 003F +11C13 0334 +11C13 0061 +11C13 0041 +11C13 0062 +11C14 0021 +11C14 003F +11C14 0334 +11C14 0061 +11C14 0041 +11C14 0062 +11C15 0021 +11C15 003F +11C15 0334 +11C15 0061 +11C15 0041 +11C15 0062 +11C16 0021 +11C16 003F +11C16 0334 +11C16 0061 +11C16 0041 +11C16 0062 +11C17 0021 +11C17 003F +11C17 0334 +11C17 0061 +11C17 0041 +11C17 0062 +11C18 0021 +11C18 003F +11C18 0334 +11C18 0061 +11C18 0041 +11C18 0062 +11C19 0021 +11C19 003F +11C19 0334 +11C19 0061 +11C19 0041 +11C19 0062 +11C1A 0021 +11C1A 003F +11C1A 0334 +11C1A 0061 +11C1A 0041 +11C1A 0062 +11C1B 0021 +11C1B 003F +11C1B 0334 +11C1B 0061 +11C1B 0041 +11C1B 0062 +11C1C 0021 +11C1C 003F +11C1C 0334 +11C1C 0061 +11C1C 0041 +11C1C 0062 +11C1D 0021 +11C1D 003F +11C1D 0334 +11C1D 0061 +11C1D 0041 +11C1D 0062 +11C1E 0021 +11C1E 003F +11C1E 0334 +11C1E 0061 +11C1E 0041 +11C1E 0062 +11C1F 0021 +11C1F 003F +11C1F 0334 +11C1F 0061 +11C1F 0041 +11C1F 0062 +11C20 0021 +11C20 003F +11C20 0334 +11C20 0061 +11C20 0041 +11C20 0062 +11C21 0021 +11C21 003F +11C21 0334 +11C21 0061 +11C21 0041 +11C21 0062 +11C22 0021 +11C22 003F +11C22 0334 +11C22 0061 +11C22 0041 +11C22 0062 +11C23 0021 +11C23 003F +11C23 0334 +11C23 0061 +11C23 0041 +11C23 0062 +11C24 0021 +11C24 003F +11C24 0334 +11C24 0061 +11C24 0041 +11C24 0062 +11C25 0021 +11C25 003F +11C25 0334 +11C25 0061 +11C25 0041 +11C25 0062 +11C26 0021 +11C26 003F +11C26 0334 +11C26 0061 +11C26 0041 +11C26 0062 +11C27 0021 +11C27 003F +11C27 0334 +11C27 0061 +11C27 0041 +11C27 0062 +11C28 0021 +11C28 003F +11C28 0334 +11C28 0061 +11C28 0041 +11C28 0062 +11C29 0021 +11C29 003F +11C29 0334 +11C29 0061 +11C29 0041 +11C29 0062 +11C2A 0021 +11C2A 003F +11C2A 0334 +11C2A 0061 +11C2A 0041 +11C2A 0062 +11C2B 0021 +11C2B 003F +11C2B 0334 +11C2B 0061 +11C2B 0041 +11C2B 0062 +11C2C 0021 +11C2C 003F +11C2C 0334 +11C2C 0061 +11C2C 0041 +11C2C 0062 +11C2D 0021 +11C2D 003F +11C2D 0334 +11C2D 0061 +11C2D 0041 +11C2D 0062 +11C2E 0021 +11C2E 003F +11C2E 0334 +11C2E 0061 +11C2E 0041 +11C2E 0062 +11C40 0021 +11C40 003F +11C40 0334 +11C40 0061 +11C40 0041 +11C40 0062 +11C2F 0021 +11C2F 003F +11C2F 0334 +11C2F 0061 +11C2F 0041 +11C2F 0062 +11C30 0021 +11C30 003F +11C30 0334 +11C30 0061 +11C30 0041 +11C30 0062 +11C31 0021 +11C31 003F +11C31 0334 +11C31 0061 +11C31 0041 +11C31 0062 +11C32 0021 +11C32 003F +11C32 0334 +11C32 0061 +11C32 0041 +11C32 0062 +11C33 0021 +11C33 003F +11C33 0334 +11C33 0061 +11C33 0041 +11C33 0062 +11C34 0021 +11C34 003F +11C34 0334 +11C34 0061 +11C34 0041 +11C34 0062 +11C35 0021 +11C35 003F +11C35 0334 +11C35 0061 +11C35 0041 +11C35 0062 +11C36 0021 +11C36 003F +11C36 0334 +11C36 0061 +11C36 0041 +11C36 0062 +11C38 0021 +11C38 003F +11C38 0334 +11C38 0061 +11C38 0041 +11C38 0062 +11C39 0021 +11C39 003F +11C39 0334 +11C39 0061 +11C39 0041 +11C39 0062 +11C3A 0021 +11C3A 003F +11C3A 0334 +11C3A 0061 +11C3A 0041 +11C3A 0062 +11C3B 0021 +11C3B 003F +11C3B 0334 +11C3B 0061 +11C3B 0041 +11C3B 0062 +11C3F 0021 +11C3F 003F +11C3F 0334 +11C3F 0061 +11C3F 0041 +11C3F 0062 0E01 0021 0E01 003F 0E01 0061 @@ -101534,10 +103994,10 @@ AADC 0062 0F73 0021 0F71 0F72 003F 0F73 003F -0334 0F73 +0334 0F71 0F72 +0F71 0334 0F72 0F71 0F72 0334 0F72 0334 0F71 -0F72 0F71 0334 0F71 0F72 0061 0F73 0061 0F71 0591 0F72 0061 @@ -101560,7 +104020,7 @@ AADC 0062 0334 0F80 0F71 0334 0F81 0F71 0334 0F80 -0F71 0F80 0334 +0F80 0334 0F71 0F71 0F80 0061 0F81 0061 0F71 0591 0F80 0061 @@ -101580,10 +104040,10 @@ AADC 0062 0F75 0021 0F71 0F74 003F 0F75 003F -0334 0F74 0F71 +0334 0F71 0F74 +0334 0F75 0F71 0334 0F74 0F71 0F74 0334 -0F74 0334 0F71 0F71 0F74 0061 0F75 0061 0F71 0591 0F74 0061 @@ -101608,9 +104068,9 @@ AADC 0062 0F76 0062 0FB2 0F80 0062 0F76 0F71 0334 +0FB2 0334 0F71 0F80 +0FB2 0334 0F80 0F71 0FB2 0334 0F81 -0FB2 0F80 0334 0F71 -0FB2 0F80 0F71 0334 0F77 0021 0FB2 0F71 0F80 0021 0FB2 0F81 0021 @@ -101647,10 +104107,10 @@ AADC 0062 0FB3 0F80 0041 0F78 0062 0FB3 0F80 0062 -0F78 0334 0F71 0F78 0F71 0334 0FB3 0334 0F71 0F80 -0FB3 0334 0F81 +0FB3 0334 0F80 0F71 +0FB3 0F71 0334 0F80 0F79 0021 0FB3 0F71 0F80 0021 0FB3 0F81 0021 @@ -101707,6 +104167,390 @@ AADC 0062 0F84 0061 0F84 0041 0F84 0062 +11C72 0021 +11C72 003F +11C72 0334 +11C72 0061 +11C72 0041 +11C72 0062 +11C92 0021 +11C92 003F +11C92 0334 +11C92 0061 +11C92 0041 +11C92 0062 +11C73 0021 +11C73 003F +11C73 0334 +11C73 0061 +11C73 0041 +11C73 0062 +11C93 0021 +11C93 003F +11C93 0334 +11C93 0061 +11C93 0041 +11C93 0062 +11C74 0021 +11C74 003F +11C74 0334 +11C74 0061 +11C74 0041 +11C74 0062 +11C94 0021 +11C94 003F +11C94 0334 +11C94 0061 +11C94 0041 +11C94 0062 +11C75 0021 +11C75 003F +11C75 0334 +11C75 0061 +11C75 0041 +11C75 0062 +11C95 0021 +11C95 003F +11C95 0334 +11C95 0061 +11C95 0041 +11C95 0062 +11C76 0021 +11C76 003F +11C76 0334 +11C76 0061 +11C76 0041 +11C76 0062 +11C96 0021 +11C96 003F +11C96 0334 +11C96 0061 +11C96 0041 +11C96 0062 +11C77 0021 +11C77 003F +11C77 0334 +11C77 0061 +11C77 0041 +11C77 0062 +11C97 0021 +11C97 003F +11C97 0334 +11C97 0061 +11C97 0041 +11C97 0062 +11C78 0021 +11C78 003F +11C78 0334 +11C78 0061 +11C78 0041 +11C78 0062 +11C98 0021 +11C98 003F +11C98 0334 +11C98 0061 +11C98 0041 +11C98 0062 +11C79 0021 +11C79 003F +11C79 0334 +11C79 0061 +11C79 0041 +11C79 0062 +11C99 0021 +11C99 003F +11C99 0334 +11C99 0061 +11C99 0041 +11C99 0062 +11C7A 0021 +11C7A 003F +11C7A 0334 +11C7A 0061 +11C7A 0041 +11C7A 0062 +11C9A 0021 +11C9A 003F +11C9A 0334 +11C9A 0061 +11C9A 0041 +11C9A 0062 +11C7B 0021 +11C7B 003F +11C7B 0334 +11C7B 0061 +11C7B 0041 +11C7B 0062 +11C9B 0021 +11C9B 003F +11C9B 0334 +11C9B 0061 +11C9B 0041 +11C9B 0062 +11C7C 0021 +11C7C 003F +11C7C 0334 +11C7C 0061 +11C7C 0041 +11C7C 0062 +11C9C 0021 +11C9C 003F +11C9C 0334 +11C9C 0061 +11C9C 0041 +11C9C 0062 +11C7D 0021 +11C7D 003F +11C7D 0334 +11C7D 0061 +11C7D 0041 +11C7D 0062 +11C9D 0021 +11C9D 003F +11C9D 0334 +11C9D 0061 +11C9D 0041 +11C9D 0062 +11C7E 0021 +11C7E 003F +11C7E 0334 +11C7E 0061 +11C7E 0041 +11C7E 0062 +11C9E 0021 +11C9E 003F +11C9E 0334 +11C9E 0061 +11C9E 0041 +11C9E 0062 +11C7F 0021 +11C7F 003F +11C7F 0334 +11C7F 0061 +11C7F 0041 +11C7F 0062 +11C9F 0021 +11C9F 003F +11C9F 0334 +11C9F 0061 +11C9F 0041 +11C9F 0062 +11C80 0021 +11C80 003F +11C80 0334 +11C80 0061 +11C80 0041 +11C80 0062 +11CA0 0021 +11CA0 003F +11CA0 0334 +11CA0 0061 +11CA0 0041 +11CA0 0062 +11C81 0021 +11C81 003F +11C81 0334 +11C81 0061 +11C81 0041 +11C81 0062 +11CA1 0021 +11CA1 003F +11CA1 0334 +11CA1 0061 +11CA1 0041 +11CA1 0062 +11C82 0021 +11C82 003F +11C82 0334 +11C82 0061 +11C82 0041 +11C82 0062 +11CA2 0021 +11CA2 003F +11CA2 0334 +11CA2 0061 +11CA2 0041 +11CA2 0062 +11C83 0021 +11C83 003F +11C83 0334 +11C83 0061 +11C83 0041 +11C83 0062 +11CA3 0021 +11CA3 003F +11CA3 0334 +11CA3 0061 +11CA3 0041 +11CA3 0062 +11C84 0021 +11C84 003F +11C84 0334 +11C84 0061 +11C84 0041 +11C84 0062 +11CA4 0021 +11CA4 003F +11CA4 0334 +11CA4 0061 +11CA4 0041 +11CA4 0062 +11C85 0021 +11C85 003F +11C85 0334 +11C85 0061 +11C85 0041 +11C85 0062 +11CA5 0021 +11CA5 003F +11CA5 0334 +11CA5 0061 +11CA5 0041 +11CA5 0062 +11C86 0021 +11C86 003F +11C86 0334 +11C86 0061 +11C86 0041 +11C86 0062 +11CA6 0021 +11CA6 003F +11CA6 0334 +11CA6 0061 +11CA6 0041 +11CA6 0062 +11C87 0021 +11C87 003F +11C87 0334 +11C87 0061 +11C87 0041 +11C87 0062 +11CA7 0021 +11CA7 003F +11CA7 0334 +11CA7 0061 +11CA7 0041 +11CA7 0062 +11C88 0021 +11C88 003F +11C88 0334 +11C88 0061 +11C88 0041 +11C88 0062 +11C89 0021 +11C89 003F +11C89 0334 +11C89 0061 +11C89 0041 +11C89 0062 +11CA9 0021 +11CA9 003F +11CA9 0334 +11CA9 0061 +11CA9 0041 +11CA9 0062 +11C8A 0021 +11C8A 003F +11C8A 0334 +11C8A 0061 +11C8A 0041 +11C8A 0062 +11CAA 0021 +11CAA 003F +11CAA 0334 +11CAA 0061 +11CAA 0041 +11CAA 0062 +11C8B 0021 +11C8B 003F +11C8B 0334 +11C8B 0061 +11C8B 0041 +11C8B 0062 +11CAB 0021 +11CAB 003F +11CAB 0334 +11CAB 0061 +11CAB 0041 +11CAB 0062 +11C8C 0021 +11C8C 003F +11C8C 0334 +11C8C 0061 +11C8C 0041 +11C8C 0062 +11CAC 0021 +11CAC 003F +11CAC 0334 +11CAC 0061 +11CAC 0041 +11CAC 0062 +11C8D 0021 +11C8D 003F +11C8D 0334 +11C8D 0061 +11C8D 0041 +11C8D 0062 +11CAD 0021 +11CAD 003F +11CAD 0334 +11CAD 0061 +11CAD 0041 +11CAD 0062 +11C8E 0021 +11C8E 003F +11C8E 0334 +11C8E 0061 +11C8E 0041 +11C8E 0062 +11CAE 0021 +11CAE 003F +11CAE 0334 +11CAE 0061 +11CAE 0041 +11CAE 0062 +11C8F 0021 +11C8F 003F +11C8F 0334 +11C8F 0061 +11C8F 0041 +11C8F 0062 +11CAF 0021 +11CAF 003F +11CAF 0334 +11CAF 0061 +11CAF 0041 +11CAF 0062 +11CB0 0021 +11CB0 003F +11CB0 0334 +11CB0 0061 +11CB0 0041 +11CB0 0062 +11CB1 0021 +11CB1 003F +11CB1 0334 +11CB1 0061 +11CB1 0041 +11CB1 0062 +11CB2 0021 +11CB2 003F +11CB2 0334 +11CB2 0061 +11CB2 0041 +11CB2 0062 +11CB3 0021 +11CB3 003F +11CB3 0334 +11CB3 0061 +11CB3 0041 +11CB3 0062 +11CB4 0021 +11CB4 003F +11CB4 0334 +11CB4 0061 +11CB4 0041 +11CB4 0062 1C00 0021 1C00 003F 1C00 0061 @@ -110381,6 +113225,438 @@ ABBF 0062 13F5 0041 13FD 0062 13F5 0062 +104D8 0021 +104D8 003F +104B0 0021 +104B0 003F +104D8 0334 +104B0 0334 +104D8 0061 +104D8 0041 +104B0 0061 +104B0 0041 +104D8 0062 +104B0 0062 +104D9 0021 +104D9 003F +104B1 0021 +104B1 003F +104D9 0334 +104B1 0334 +104D9 0061 +104D9 0041 +104B1 0061 +104B1 0041 +104D9 0062 +104B1 0062 +104DA 0021 +104DA 003F +104B2 0021 +104B2 003F +104DA 0334 +104B2 0334 +104DA 0061 +104DA 0041 +104B2 0061 +104B2 0041 +104DA 0062 +104B2 0062 +104DB 0021 +104DB 003F +104B3 0021 +104B3 003F +104DB 0334 +104B3 0334 +104DB 0061 +104DB 0041 +104B3 0061 +104B3 0041 +104DB 0062 +104B3 0062 +104DC 0021 +104DC 003F +104B4 0021 +104B4 003F +104DC 0334 +104B4 0334 +104DC 0061 +104DC 0041 +104B4 0061 +104B4 0041 +104DC 0062 +104B4 0062 +104DD 0021 +104DD 003F +104B5 0021 +104B5 003F +104DD 0334 +104B5 0334 +104DD 0061 +104DD 0041 +104B5 0061 +104B5 0041 +104DD 0062 +104B5 0062 +104DE 0021 +104DE 003F +104B6 0021 +104B6 003F +104DE 0334 +104B6 0334 +104DE 0061 +104DE 0041 +104B6 0061 +104B6 0041 +104DE 0062 +104B6 0062 +104DF 0021 +104DF 003F +104B7 0021 +104B7 003F +104DF 0334 +104B7 0334 +104DF 0061 +104DF 0041 +104B7 0061 +104B7 0041 +104DF 0062 +104B7 0062 +104E0 0021 +104E0 003F +104B8 0021 +104B8 003F +104E0 0334 +104B8 0334 +104E0 0061 +104E0 0041 +104B8 0061 +104B8 0041 +104E0 0062 +104B8 0062 +104E1 0021 +104E1 003F +104B9 0021 +104B9 003F +104E1 0334 +104B9 0334 +104E1 0061 +104E1 0041 +104B9 0061 +104B9 0041 +104E1 0062 +104B9 0062 +104E2 0021 +104E2 003F +104BA 0021 +104BA 003F +104E2 0334 +104BA 0334 +104E2 0061 +104E2 0041 +104BA 0061 +104BA 0041 +104E2 0062 +104BA 0062 +104E3 0021 +104E3 003F +104BB 0021 +104BB 003F +104E3 0334 +104BB 0334 +104E3 0061 +104E3 0041 +104BB 0061 +104BB 0041 +104E3 0062 +104BB 0062 +104E4 0021 +104E4 003F +104BC 0021 +104BC 003F +104E4 0334 +104BC 0334 +104E4 0061 +104E4 0041 +104BC 0061 +104BC 0041 +104E4 0062 +104BC 0062 +104E5 0021 +104E5 003F +104BD 0021 +104BD 003F +104E5 0334 +104BD 0334 +104E5 0061 +104E5 0041 +104BD 0061 +104BD 0041 +104E5 0062 +104BD 0062 +104E6 0021 +104E6 003F +104BE 0021 +104BE 003F +104E6 0334 +104BE 0334 +104E6 0061 +104E6 0041 +104BE 0061 +104BE 0041 +104E6 0062 +104BE 0062 +104E7 0021 +104E7 003F +104BF 0021 +104BF 003F +104E7 0334 +104BF 0334 +104E7 0061 +104E7 0041 +104BF 0061 +104BF 0041 +104E7 0062 +104BF 0062 +104E8 0021 +104E8 003F +104C0 0021 +104C0 003F +104E8 0334 +104C0 0334 +104E8 0061 +104E8 0041 +104C0 0061 +104C0 0041 +104E8 0062 +104C0 0062 +104E9 0021 +104E9 003F +104C1 0021 +104C1 003F +104E9 0334 +104C1 0334 +104E9 0061 +104E9 0041 +104C1 0061 +104C1 0041 +104E9 0062 +104C1 0062 +104EA 0021 +104EA 003F +104C2 0021 +104C2 003F +104EA 0334 +104C2 0334 +104EA 0061 +104EA 0041 +104C2 0061 +104C2 0041 +104EA 0062 +104C2 0062 +104EB 0021 +104EB 003F +104C3 0021 +104C3 003F +104EB 0334 +104C3 0334 +104EB 0061 +104EB 0041 +104C3 0061 +104C3 0041 +104EB 0062 +104C3 0062 +104EC 0021 +104EC 003F +104C4 0021 +104C4 003F +104EC 0334 +104C4 0334 +104EC 0061 +104EC 0041 +104C4 0061 +104C4 0041 +104EC 0062 +104C4 0062 +104ED 0021 +104ED 003F +104C5 0021 +104C5 003F +104ED 0334 +104C5 0334 +104ED 0061 +104ED 0041 +104C5 0061 +104C5 0041 +104ED 0062 +104C5 0062 +104EE 0021 +104EE 003F +104C6 0021 +104C6 003F +104EE 0334 +104C6 0334 +104EE 0061 +104EE 0041 +104C6 0061 +104C6 0041 +104EE 0062 +104C6 0062 +104EF 0021 +104EF 003F +104C7 0021 +104C7 003F +104EF 0334 +104C7 0334 +104EF 0061 +104EF 0041 +104C7 0061 +104C7 0041 +104EF 0062 +104C7 0062 +104F0 0021 +104F0 003F +104C8 0021 +104C8 003F +104F0 0334 +104C8 0334 +104F0 0061 +104F0 0041 +104C8 0061 +104C8 0041 +104F0 0062 +104C8 0062 +104F1 0021 +104F1 003F +104C9 0021 +104C9 003F +104F1 0334 +104C9 0334 +104F1 0061 +104F1 0041 +104C9 0061 +104C9 0041 +104F1 0062 +104C9 0062 +104F2 0021 +104F2 003F +104CA 0021 +104CA 003F +104F2 0334 +104CA 0334 +104F2 0061 +104F2 0041 +104CA 0061 +104CA 0041 +104F2 0062 +104CA 0062 +104F3 0021 +104F3 003F +104CB 0021 +104CB 003F +104F3 0334 +104CB 0334 +104F3 0061 +104F3 0041 +104CB 0061 +104CB 0041 +104F3 0062 +104CB 0062 +104F4 0021 +104F4 003F +104CC 0021 +104CC 003F +104F4 0334 +104CC 0334 +104F4 0061 +104F4 0041 +104CC 0061 +104CC 0041 +104F4 0062 +104CC 0062 +104F5 0021 +104F5 003F +104CD 0021 +104CD 003F +104F5 0334 +104CD 0334 +104F5 0061 +104F5 0041 +104CD 0061 +104CD 0041 +104F5 0062 +104CD 0062 +104F6 0021 +104F6 003F +104CE 0021 +104CE 003F +104F6 0334 +104CE 0334 +104F6 0061 +104F6 0041 +104CE 0061 +104CE 0041 +104F6 0062 +104CE 0062 +104F7 0021 +104F7 003F +104CF 0021 +104CF 003F +104F7 0334 +104CF 0334 +104F7 0061 +104F7 0041 +104CF 0061 +104CF 0041 +104F7 0062 +104CF 0062 +104F8 0021 +104F8 003F +104D0 0021 +104D0 003F +104F8 0334 +104D0 0334 +104F8 0061 +104F8 0041 +104D0 0061 +104D0 0041 +104F8 0062 +104D0 0062 +104F9 0021 +104F9 003F +104D1 0021 +104D1 003F +104F9 0334 +104D1 0334 +104F9 0061 +104F9 0041 +104D1 0061 +104D1 0041 +104F9 0062 +104D1 0062 +104FA 0021 +104FA 003F +104D2 0021 +104D2 003F +104FA 0334 +104D2 0334 +104FA 0061 +104FA 0041 +104D2 0061 +104D2 0041 +104FA 0062 +104D2 0062 +104FB 0021 +104FB 003F +104D3 0021 +104D3 003F +104FB 0334 +104D3 0334 +104FB 0061 +104FB 0041 +104D3 0061 +104D3 0041 +104FB 0062 +104D3 0062 1401 0021 1401 003F 1401 0061 @@ -122137,6 +125413,414 @@ A6EF 0062 1E8C4 0061 1E8C4 0041 1E8C4 0062 +1E922 0021 +1E922 003F +1E900 0021 +1E900 003F +1E922 0334 +1E900 0334 +1E922 0061 +1E922 0041 +1E900 0061 +1E900 0041 +1E922 0062 +1E900 0062 +1E923 0021 +1E923 003F +1E901 0021 +1E901 003F +1E923 0334 +1E901 0334 +1E923 0061 +1E923 0041 +1E901 0061 +1E901 0041 +1E923 0062 +1E901 0062 +1E924 0021 +1E924 003F +1E902 0021 +1E902 003F +1E924 0334 +1E902 0334 +1E924 0061 +1E924 0041 +1E902 0061 +1E902 0041 +1E924 0062 +1E902 0062 +1E925 0021 +1E925 003F +1E903 0021 +1E903 003F +1E925 0334 +1E903 0334 +1E925 0061 +1E925 0041 +1E903 0061 +1E903 0041 +1E925 0062 +1E903 0062 +1E926 0021 +1E926 003F +1E904 0021 +1E904 003F +1E926 0334 +1E904 0334 +1E926 0061 +1E926 0041 +1E904 0061 +1E904 0041 +1E926 0062 +1E904 0062 +1E927 0021 +1E927 003F +1E905 0021 +1E905 003F +1E927 0334 +1E905 0334 +1E927 0061 +1E927 0041 +1E905 0061 +1E905 0041 +1E927 0062 +1E905 0062 +1E928 0021 +1E928 003F +1E906 0021 +1E906 003F +1E928 0334 +1E906 0334 +1E928 0061 +1E928 0041 +1E906 0061 +1E906 0041 +1E928 0062 +1E906 0062 +1E929 0021 +1E929 003F +1E907 0021 +1E907 003F +1E929 0334 +1E907 0334 +1E929 0061 +1E929 0041 +1E907 0061 +1E907 0041 +1E929 0062 +1E907 0062 +1E92A 0021 +1E92A 003F +1E908 0021 +1E908 003F +1E92A 0334 +1E908 0334 +1E92A 0061 +1E92A 0041 +1E908 0061 +1E908 0041 +1E92A 0062 +1E908 0062 +1E92B 0021 +1E92B 003F +1E909 0021 +1E909 003F +1E92B 0334 +1E909 0334 +1E92B 0061 +1E92B 0041 +1E909 0061 +1E909 0041 +1E92B 0062 +1E909 0062 +1E92C 0021 +1E92C 003F +1E90A 0021 +1E90A 003F +1E92C 0334 +1E90A 0334 +1E92C 0061 +1E92C 0041 +1E90A 0061 +1E90A 0041 +1E92C 0062 +1E90A 0062 +1E92D 0021 +1E92D 003F +1E90B 0021 +1E90B 003F +1E92D 0334 +1E90B 0334 +1E92D 0061 +1E92D 0041 +1E90B 0061 +1E90B 0041 +1E92D 0062 +1E90B 0062 +1E92E 0021 +1E92E 003F +1E90C 0021 +1E90C 003F +1E92E 0334 +1E90C 0334 +1E92E 0061 +1E92E 0041 +1E90C 0061 +1E90C 0041 +1E92E 0062 +1E90C 0062 +1E92F 0021 +1E92F 003F +1E90D 0021 +1E90D 003F +1E92F 0334 +1E90D 0334 +1E92F 0061 +1E92F 0041 +1E90D 0061 +1E90D 0041 +1E92F 0062 +1E90D 0062 +1E930 0021 +1E930 003F +1E90E 0021 +1E90E 003F +1E930 0334 +1E90E 0334 +1E930 0061 +1E930 0041 +1E90E 0061 +1E90E 0041 +1E930 0062 +1E90E 0062 +1E931 0021 +1E931 003F +1E90F 0021 +1E90F 003F +1E931 0334 +1E90F 0334 +1E931 0061 +1E931 0041 +1E90F 0061 +1E90F 0041 +1E931 0062 +1E90F 0062 +1E932 0021 +1E932 003F +1E910 0021 +1E910 003F +1E932 0334 +1E910 0334 +1E932 0061 +1E932 0041 +1E910 0061 +1E910 0041 +1E932 0062 +1E910 0062 +1E933 0021 +1E933 003F +1E911 0021 +1E911 003F +1E933 0334 +1E911 0334 +1E933 0061 +1E933 0041 +1E911 0061 +1E911 0041 +1E933 0062 +1E911 0062 +1E934 0021 +1E934 003F +1E912 0021 +1E912 003F +1E934 0334 +1E912 0334 +1E934 0061 +1E934 0041 +1E912 0061 +1E912 0041 +1E934 0062 +1E912 0062 +1E935 0021 +1E935 003F +1E913 0021 +1E913 003F +1E935 0334 +1E913 0334 +1E935 0061 +1E935 0041 +1E913 0061 +1E913 0041 +1E935 0062 +1E913 0062 +1E936 0021 +1E936 003F +1E914 0021 +1E914 003F +1E936 0334 +1E914 0334 +1E936 0061 +1E936 0041 +1E914 0061 +1E914 0041 +1E936 0062 +1E914 0062 +1E937 0021 +1E937 003F +1E915 0021 +1E915 003F +1E937 0334 +1E915 0334 +1E937 0061 +1E937 0041 +1E915 0061 +1E915 0041 +1E937 0062 +1E915 0062 +1E938 0021 +1E938 003F +1E916 0021 +1E916 003F +1E938 0334 +1E916 0334 +1E938 0061 +1E938 0041 +1E916 0061 +1E916 0041 +1E938 0062 +1E916 0062 +1E939 0021 +1E939 003F +1E917 0021 +1E917 003F +1E939 0334 +1E917 0334 +1E939 0061 +1E939 0041 +1E917 0061 +1E917 0041 +1E939 0062 +1E917 0062 +1E93A 0021 +1E93A 003F +1E918 0021 +1E918 003F +1E93A 0334 +1E918 0334 +1E93A 0061 +1E93A 0041 +1E918 0061 +1E918 0041 +1E93A 0062 +1E918 0062 +1E93B 0021 +1E93B 003F +1E919 0021 +1E919 003F +1E93B 0334 +1E919 0334 +1E93B 0061 +1E93B 0041 +1E919 0061 +1E919 0041 +1E93B 0062 +1E919 0062 +1E93C 0021 +1E93C 003F +1E91A 0021 +1E91A 003F +1E93C 0334 +1E91A 0334 +1E93C 0061 +1E93C 0041 +1E91A 0061 +1E91A 0041 +1E93C 0062 +1E91A 0062 +1E93D 0021 +1E93D 003F +1E91B 0021 +1E91B 003F +1E93D 0334 +1E91B 0334 +1E93D 0061 +1E93D 0041 +1E91B 0061 +1E91B 0041 +1E93D 0062 +1E91B 0062 +1E93E 0021 +1E93E 003F +1E91C 0021 +1E91C 003F +1E93E 0334 +1E91C 0334 +1E93E 0061 +1E93E 0041 +1E91C 0061 +1E91C 0041 +1E93E 0062 +1E91C 0062 +1E93F 0021 +1E93F 003F +1E91D 0021 +1E91D 003F +1E93F 0334 +1E91D 0334 +1E93F 0061 +1E93F 0041 +1E91D 0061 +1E91D 0041 +1E93F 0062 +1E91D 0062 +1E940 0021 +1E940 003F +1E91E 0021 +1E91E 003F +1E940 0334 +1E91E 0334 +1E940 0061 +1E940 0041 +1E91E 0061 +1E91E 0041 +1E940 0062 +1E91E 0062 +1E941 0021 +1E941 003F +1E91F 0021 +1E91F 003F +1E941 0334 +1E91F 0334 +1E941 0061 +1E941 0041 +1E91F 0061 +1E91F 0041 +1E941 0062 +1E91F 0062 +1E942 0021 +1E942 003F +1E920 0021 +1E920 003F +1E942 0334 +1E920 0334 +1E942 0061 +1E942 0041 +1E920 0061 +1E920 0041 +1E942 0062 +1E920 0062 +1E943 0021 +1E943 003F +1E921 0021 +1E921 003F +1E943 0334 +1E921 0334 +1E943 0061 +1E943 0041 +1E921 0061 +1E921 0041 +1E943 0062 +1E921 0062 1100 0021 1100 003F 3200 0021 @@ -162229,6 +165913,72 @@ A4F7 0062 14646 0061 14646 0041 14646 0062 +17000 0021 +17000 003F +17000 0334 +17000 0061 +17000 0041 +17000 0062 +17001 0021 +17001 003F +17001 0334 +17001 0061 +17001 0041 +17001 0062 +17002 0021 +17002 003F +17002 0334 +17002 0061 +17002 0041 +17002 0062 +17003 0021 +17003 003F +17003 0334 +17003 0061 +17003 0041 +17003 0062 +17004 0021 +17004 003F +17004 0334 +17004 0061 +17004 0041 +17004 0062 +18800 0021 +18800 003F +18800 0334 +18800 0061 +18800 0041 +18800 0062 +18801 0021 +18801 003F +18801 0334 +18801 0061 +18801 0041 +18801 0062 +18802 0021 +18802 003F +18802 0334 +18802 0061 +18802 0041 +18802 0062 +18803 0021 +18803 003F +18803 0334 +18803 0061 +18803 0041 +18803 0062 +18804 0021 +18804 003F +18804 0334 +18804 0061 +18804 0041 +18804 0062 +18AF2 0021 +18AF2 003F +18AF2 0334 +18AF2 0061 +18AF2 0041 +18AF2 0062 4E00 0021 4E00 003F 3220 0021 @@ -168327,6 +172077,12 @@ FA26 0062 2FA3 0061 2FA3 0041 2FA3 0062 +1F23B 0021 +1F23B 003F +1F23B 0334 +1F23B 0061 +1F23B 0041 +1F23B 0062 F919 0021 F919 003F F919 0061 diff --git a/tests/data/DerivedBidiClass.txt b/tests/data/DerivedBidiClass.txt index 9ec885e719..451cef2a63 100644 --- a/tests/data/DerivedBidiClass.txt +++ b/tests/data/DerivedBidiClass.txt @@ -1,10 +1,11 @@ -# DerivedBidiClass-8.0.0.txt -# Date: 2015-02-13, 13:47:08 GMT [MD] +# DerivedBidiClass-9.0.0.txt +# Date: 2016-06-01, 10:34:22 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # ================================================ @@ -214,6 +215,7 @@ 0C60..0C61 ; L # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL 0C66..0C6F ; L # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE 0C7F ; L # So TELUGU SIGN TUUMU +0C80 ; L # Lo KANNADA SIGN SPACING CANDRABINDU 0C82..0C83 ; L # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA 0C85..0C8C ; L # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L 0C8E..0C90 ; L # Lo [3] KANNADA LETTER E..KANNADA LETTER AI @@ -241,10 +243,13 @@ 0D46..0D48 ; L # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI 0D4A..0D4C ; L # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU 0D4E ; L # Lo MALAYALAM LETTER DOT REPH +0D4F ; L # So MALAYALAM SIGN PARA +0D54..0D56 ; L # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL 0D57 ; L # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E ; L # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH 0D5F..0D61 ; L # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL 0D66..0D6F ; L # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D75 ; L # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS +0D70..0D78 ; L # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS 0D79 ; L # So MALAYALAM DATE MARK 0D7A..0D7F ; L # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K 0D82..0D83 ; L # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA @@ -386,7 +391,8 @@ 1820..1842 ; L # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI 1843 ; L # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN 1844..1877 ; L # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; L # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +1880..1884 ; L # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1887..18A8 ; L # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA 18AA ; L # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA 18B0..18F5 ; L # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S 1900..191E ; L # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA @@ -449,6 +455,7 @@ 1C5A..1C77 ; L # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH 1C78..1C7D ; L # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD 1C7E..1C7F ; L # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80..1C88 ; L # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK 1CC0..1CC7 ; L # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA 1CD3 ; L # Po VEDIC SIGN NIHSHVASA 1CE1 ; L # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA @@ -592,7 +599,7 @@ A771..A787 ; L # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR A789..A78A ; L # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN A78B..A78E ; L # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; L # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7AD ; L # L& [30] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER L WITH BELT +A790..A7AE ; L # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I A7B0..A7B7 ; L # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA A7F7 ; L # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I A7F8..A7F9 ; L # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE @@ -715,6 +722,7 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 10102 ; L # Po AEGEAN CHECK MARK 10107..10133 ; L # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND 10137..1013F ; L # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +1018D..1018E ; L # So [2] GREEK INDICTION SIGN..NOMISMA SIGN 101D0..101FC ; L # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND 10280..1029C ; L # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X 102A0..102D0 ; L # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 @@ -734,6 +742,8 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 10400..1044F ; L # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW 10450..1049D ; L # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO 104A0..104A9 ; L # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3 ; L # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; L # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA 10500..10527 ; L # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE 10530..10563 ; L # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW 1056F ; L # Po CAUCASIAN ALBANIAN CITATION MARK @@ -805,6 +815,15 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 11357 ; L # Mc GRANTHA AU LENGTH MARK 1135D..11361 ; L # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL 11362..11363 ; L # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11400..11434 ; L # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; L # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11440..11441 ; L # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11445 ; L # Mc NEWA SIGN VISARGA +11447..1144A ; L # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F ; L # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; L # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145B ; L # Po NEWA PLACEHOLDER MARK +1145D ; L # Po NEWA INSERTION SIGN 11480..114AF ; L # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA 114B0..114B2 ; L # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II 114B9 ; L # Mc TIRHUTA VOWEL SIGN E @@ -844,6 +863,20 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 118EA..118F2 ; L # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY 118FF ; L # Lo WARANG CITI OM 11AC0..11AF8 ; L # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; L # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; L # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; L # Mc BHAIKSUKI VOWEL SIGN AA +11C3E ; L # Mc BHAIKSUKI SIGN VISARGA +11C3F ; L # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; L # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; L # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; L # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; L # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C70..11C71 ; L # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; L # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11CA9 ; L # Mc MARCHEN SUBJOINED LETTER YA +11CB1 ; L # Mc MARCHEN VOWEL SIGN I +11CB4 ; L # Mc MARCHEN VOWEL SIGN O 12000..12399 ; L # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; L # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12470..12474 ; L # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON @@ -870,6 +903,9 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 16F50 ; L # Lo MIAO LETTER NASALIZATION 16F51..16F7E ; L # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 16F93..16F9F ; L # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0 ; L # Lm TANGUT ITERATION MARK +17000..187EC ; L # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +18800..18AF2 ; L # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 1B000..1B001 ; L # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE 1BC00..1BC6A ; L # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; L # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -930,9 +966,9 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 1DA87..1DA8B ; L # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS 1F110..1F12E ; L # So [31] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ 1F130..1F169 ; L # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z -1F170..1F19A ; L # So [43] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VS +1F170..1F1AC ; L # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD 1F1E6..1F202 ; L # So [29] REGIONAL INDICATOR SYMBOL LETTER A..SQUARED KATAKANA SA -1F210..1F23A ; L # So [43] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F210..1F23B ; L # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240..1F248 ; L # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F250..1F251 ; L # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT 20000..2A6D6 ; L # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 @@ -943,8 +979,8 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER F0000..FFFFD ; L # Co [65534] <private-use-F0000>..<private-use-FFFFD> 100000..10FFFD; L # Co [65534] <private-use-100000>..<private-use-10FFFD> -# The above property value applies to 848999 code points not listed here. -# Total code points: 1097474 +# The above property value applies to 841609 code points not listed here. +# Total code points: 1097280 # ================================================ @@ -1084,10 +1120,16 @@ FB46..FB4F ; R # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE AL 1E800..1E8C4 ; R # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON 1E8C5..1E8C6 ; R # Cn [2] <reserved-1E8C5>..<reserved-1E8C6> 1E8C7..1E8CF ; R # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE -1E8D7..1EDFF ; R # Cn [1321] <reserved-1E8D7>..<reserved-1EDFF> +1E8D7..1E8FF ; R # Cn [41] <reserved-1E8D7>..<reserved-1E8FF> +1E900..1E943 ; R # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E94B..1E94F ; R # Cn [5] <reserved-1E94B>..<reserved-1E94F> +1E950..1E959 ; R # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95A..1E95D ; R # Cn [4] <reserved-1E95A>..<reserved-1E95D> +1E95E..1E95F ; R # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +1E960..1EDFF ; R # Cn [1184] <reserved-1E960>..<reserved-1EDFF> 1EF00..1EFFF ; R # Cn [256] <reserved-1EF00>..<reserved-1EFFF> -# Total code points: 4077 +# Total code points: 4070 # ================================================ @@ -1170,9 +1212,10 @@ FFE5..FFE6 ; ET # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN 0660..0669 ; AN # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE 066B..066C ; AN # Po [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR 06DD ; AN # Cf ARABIC END OF AYAH +08E2 ; AN # Cf ARABIC DISPUTED END OF AYAH 10E60..10E7E ; AN # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS -# Total code points: 50 +# Total code points: 51 # ================================================ @@ -1400,7 +1443,7 @@ FF1A ; CS # Po FULLWIDTH COLON 239B..23B3 ; ON # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM 23B4..23DB ; ON # So [40] TOP SQUARE BRACKET..FUSE 23DC..23E1 ; ON # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23FA ; ON # So [25] WHITE TRAPEZIUM..BLACK CIRCLE FOR RECORD +23E2..23FE ; ON # So [29] WHITE TRAPEZIUM..POWER SLEEP SYMBOL 2400..2426 ; ON # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A ; ON # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 2460..2487 ; ON # No [40] CIRCLED DIGIT ONE..PARENTHESIZED NUMBER TWENTY @@ -1529,6 +1572,7 @@ FF1A ; CS # Po FULLWIDTH COLON 2E40 ; ON # Pd DOUBLE HYPHEN 2E41 ; ON # Po REVERSED COMMA 2E42 ; ON # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E44 ; ON # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK 2E80..2E99 ; ON # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3 ; ON # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5 ; ON # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE @@ -1675,6 +1719,7 @@ FFFC..FFFD ; ON # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTE 1091F ; ON # Po PHOENICIAN WORD SEPARATOR 10B39..10B3F ; ON # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION 11052..11065 ; ON # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11660..1166C ; ON # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT 1D200..1D241 ; ON # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D245 ; ON # So GREEK MUSICAL LEIMMA 1D300..1D356 ; ON # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING @@ -1694,11 +1739,9 @@ FFFC..FFFD ; ON # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTE 1F16A..1F16B ; ON # So [2] RAISED MC SIGN..RAISED MD SIGN 1F300..1F3FA ; ON # So [251] CYCLONE..AMPHORA 1F3FB..1F3FF ; ON # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F579 ; ON # So [378] RAT..JOYSTICK -1F57B..1F5A3 ; ON # So [41] LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX -1F5A5..1F6D0 ; ON # So [300] DESKTOP COMPUTER..PLACE OF WORSHIP +1F400..1F6D2 ; ON # So [723] RAT..SHOPPING TROLLEY 1F6E0..1F6EC ; ON # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING -1F6F0..1F6F3 ; ON # So [4] SATELLITE..PASSENGER SHIP +1F6F0..1F6F6 ; ON # So [7] SATELLITE..CANOE 1F700..1F773 ; ON # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F780..1F7D4 ; ON # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR 1F800..1F80B ; ON # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -1706,11 +1749,16 @@ FFFC..FFFD ; ON # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTE 1F850..1F859 ; ON # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW 1F860..1F887 ; ON # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW 1F890..1F8AD ; ON # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910..1F918 ; ON # So [9] ZIPPER-MOUTH FACE..SIGN OF THE HORNS -1F980..1F984 ; ON # So [5] CRAB..UNICORN FACE +1F910..1F91E ; ON # So [15] ZIPPER-MOUTH FACE..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F920..1F927 ; ON # So [8] FACE WITH COWBOY HAT..SNEEZING FACE +1F930 ; ON # So PREGNANT WOMAN +1F933..1F93E ; ON # So [12] SELFIE..HANDBALL +1F940..1F94B ; ON # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM +1F950..1F95E ; ON # So [15] CROISSANT..PANCAKES +1F980..1F991 ; ON # So [18] CRAB..SQUID 1F9C0 ; ON # So CHEESE WEDGE -# Total code points: 5174 +# Total code points: 5267 # ================================================ @@ -1784,6 +1832,7 @@ FFFFE..FFFFF ; BN # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> 0825..0827 ; NSM # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U 0829..082D ; NSM # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA 0859..085B ; NSM # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +08D4..08E1 ; NSM # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA 08E3..0902 ; NSM # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA 093A ; NSM # Mn DEVANAGARI VOWEL SIGN OE 093C ; NSM # Mn DEVANAGARI SIGN NUKTA @@ -1876,6 +1925,7 @@ FFFFE..FFFFF ; BN # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> 17C9..17D3 ; NSM # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT 17DD ; NSM # Mn KHMER SIGN ATTHACAN 180B..180D ; NSM # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +1885..1886 ; NSM # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA 18A9 ; NSM # Mn MONGOLIAN LETTER ALI GALI DAGALGA 1920..1922 ; NSM # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U 1927..1928 ; NSM # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O @@ -1915,7 +1965,7 @@ FFFFE..FFFFF ; BN # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> 1CF4 ; NSM # Mn VEDIC TONE CANDRA ABOVE 1CF8..1CF9 ; NSM # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1DC0..1DF5 ; NSM # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE -1DFC..1DFF ; NSM # Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1DFB..1DFF ; NSM # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 20D0..20DC ; NSM # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0 ; NSM # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 20E1 ; NSM # Mn COMBINING LEFT RIGHT ARROW ABOVE @@ -1935,7 +1985,7 @@ A802 ; NSM # Mn SYLOTI NAGRI SIGN DVISVARA A806 ; NSM # Mn SYLOTI NAGRI SIGN HASANTA A80B ; NSM # Mn SYLOTI NAGRI SIGN ANUSVARA A825..A826 ; NSM # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A8C4 ; NSM # Mn SAURASHTRA SIGN VIRAMA +A8C4..A8C5 ; NSM # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU A8E0..A8F1 ; NSM # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA A926..A92D ; NSM # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU A947..A951 ; NSM # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R @@ -1987,6 +2037,7 @@ FE20..FE2F ; NSM # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC 1122F..11231 ; NSM # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI 11234 ; NSM # Mn KHOJKI SIGN ANUSVARA 11236..11237 ; NSM # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +1123E ; NSM # Mn KHOJKI SIGN SUKUN 112DF ; NSM # Mn KHUDAWADI SIGN ANUSVARA 112E3..112EA ; NSM # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA 11300..11301 ; NSM # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU @@ -1994,6 +2045,9 @@ FE20..FE2F ; NSM # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC 11340 ; NSM # Mn GRANTHA VOWEL SIGN II 11366..1136C ; NSM # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX 11370..11374 ; NSM # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11438..1143F ; NSM # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11442..11444 ; NSM # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11446 ; NSM # Mn NEWA SIGN NUKTA 114B3..114B8 ; NSM # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL 114BA ; NSM # Mn TIRHUTA VOWEL SIGN SHORT E 114BF..114C0 ; NSM # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA @@ -2012,6 +2066,12 @@ FE20..FE2F ; NSM # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC 1171D..1171F ; NSM # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA 11722..11725 ; NSM # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11727..1172B ; NSM # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11C30..11C36 ; NSM # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; NSM # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C92..11CA7 ; NSM # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CAA..11CB0 ; NSM # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB2..11CB3 ; NSM # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB5..11CB6 ; NSM # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 16AF0..16AF4 ; NSM # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; NSM # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F8F..16F92 ; NSM # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW @@ -2027,10 +2087,16 @@ FE20..FE2F ; NSM # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC 1DA84 ; NSM # Mn SIGNWRITING LOCATION HEAD NECK 1DA9B..1DA9F ; NSM # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF ; NSM # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006 ; NSM # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; NSM # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; NSM # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; NSM # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; NSM # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA 1E8D0..1E8D6 ; NSM # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E94A ; NSM # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA E0100..E01EF ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 1578 +# Total code points: 1700 # ================================================ @@ -2066,7 +2132,9 @@ E0100..E01EF ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 07B1 ; AL # Lo THAANA LETTER NAA 07B2..07BF ; AL # Cn [14] <reserved-07B2>..<reserved-07BF> 08A0..08B4 ; AL # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW -08B5..08E2 ; AL # Cn [46] <reserved-08B5>..<reserved-08E2> +08B5 ; AL # Cn <reserved-08B5> +08B6..08BD ; AL # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08BE..08D3 ; AL # Cn [22] <reserved-08BE>..<reserved-08D3> FB50..FBB1 ; AL # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM FBB2..FBC1 ; AL # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW FBC2..FBD2 ; AL # Cn [17] <reserved-FBC2>..<reserved-FBD2> @@ -2151,7 +2219,7 @@ FEFD..FEFE ; AL # Cn [2] <reserved-FEFD>..<reserved-FEFE> 1EEBC..1EEEF ; AL # Cn [52] <reserved-1EEBC>..<reserved-1EEEF> 1EEF2..1EEFF ; AL # Cn [14] <reserved-1EEF2>..<reserved-1EEFF> -# Total code points: 1435 +# Total code points: 1420 # ================================================ diff --git a/tests/data/GraphemeBreakProperty.txt b/tests/data/GraphemeBreakProperty.txt index fba2ee8793..c5e94a3762 100644 --- a/tests/data/GraphemeBreakProperty.txt +++ b/tests/data/GraphemeBreakProperty.txt @@ -1,10 +1,11 @@ -# GraphemeBreakProperty-8.0.0.txt -# Date: 2015-02-13, 13:47:14 GMT [MD] +# GraphemeBreakProperty-9.0.0.txt +# Date: 2016-06-03, 22:23:55 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # ================================================ @@ -17,6 +18,18 @@ # ================================================ +0600..0605 ; Prepend # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +06DD ; Prepend # Cf ARABIC END OF AYAH +070F ; Prepend # Cf SYRIAC ABBREVIATION MARK +08E2 ; Prepend # Cf ARABIC DISPUTED END OF AYAH +0D4E ; Prepend # Lo MALAYALAM LETTER DOT REPH +110BD ; Prepend # Cf KAITHI NUMBER SIGN +111C2..111C3 ; Prepend # Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA + +# Total code points: 13 + +# ================================================ + 000D ; CR # Cc <control-000D> # Total code points: 1 @@ -34,10 +47,7 @@ 000E..001F ; Control # Cc [18] <control-000E>..<control-001F> 007F..009F ; Control # Cc [33] <control-007F>..<control-009F> 00AD ; Control # Cf SOFT HYPHEN -0600..0605 ; Control # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE 061C ; Control # Cf ARABIC LETTER MARK -06DD ; Control # Cf ARABIC END OF AYAH -070F ; Control # Cf SYRIAC ABBREVIATION MARK 180E ; Control # Cf MONGOLIAN VOWEL SEPARATOR 200B ; Control # Cf ZERO WIDTH SPACE 200E..200F ; Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK @@ -51,17 +61,15 @@ D800..DFFF ; Control # Cs [2048] <surrogate-D800>..<surrogate-DFFF> FEFF ; Control # Cf ZERO WIDTH NO-BREAK SPACE FFF0..FFF8 ; Control # Cn [9] <reserved-FFF0>..<reserved-FFF8> FFF9..FFFB ; Control # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -110BD ; Control # Cf KAITHI NUMBER SIGN 1BCA0..1BCA3 ; Control # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP 1D173..1D17A ; Control # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE E0000 ; Control # Cn <reserved-E0000> E0001 ; Control # Cf LANGUAGE TAG E0002..E001F ; Control # Cn [30] <reserved-E0002>..<reserved-E001F> -E0020..E007F ; Control # Cf [96] TAG SPACE..CANCEL TAG E0080..E00FF ; Control # Cn [128] <reserved-E0080>..<reserved-E00FF> E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> -# Total code points: 6030 +# Total code points: 5925 # ================================================ @@ -89,6 +97,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> 0825..0827 ; Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U 0829..082D ; Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA 0859..085B ; Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +08D4..08E1 ; Extend # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA 08E3..0902 ; Extend # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA 093A ; Extend # Mn DEVANAGARI VOWEL SIGN OE 093C ; Extend # Mn DEVANAGARI SIGN NUKTA @@ -195,6 +204,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> 17C9..17D3 ; Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT 17DD ; Extend # Mn KHMER SIGN ATTHACAN 180B..180D ; Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +1885..1886 ; Extend # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA 18A9 ; Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA 1920..1922 ; Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U 1927..1928 ; Extend # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O @@ -234,8 +244,8 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> 1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE 1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1DC0..1DF5 ; Extend # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE -1DFC..1DFF ; Extend # Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -200C..200D ; Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +1DFB..1DFF ; Extend # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +200C ; Extend # Cf ZERO WIDTH NON-JOINER 20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0 ; Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 20E1 ; Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE @@ -256,7 +266,7 @@ A802 ; Extend # Mn SYLOTI NAGRI SIGN DVISVARA A806 ; Extend # Mn SYLOTI NAGRI SIGN HASANTA A80B ; Extend # Mn SYLOTI NAGRI SIGN ANUSVARA A825..A826 ; Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A8C4 ; Extend # Mn SAURASHTRA SIGN VIRAMA +A8C4..A8C5 ; Extend # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU A8E0..A8F1 ; Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA A926..A92D ; Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU A947..A951 ; Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R @@ -309,6 +319,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 1122F..11231 ; Extend # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI 11234 ; Extend # Mn KHOJKI SIGN ANUSVARA 11236..11237 ; Extend # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +1123E ; Extend # Mn KHOJKI SIGN SUKUN 112DF ; Extend # Mn KHUDAWADI SIGN ANUSVARA 112E3..112EA ; Extend # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA 11300..11301 ; Extend # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU @@ -318,6 +329,9 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11357 ; Extend # Mc GRANTHA AU LENGTH MARK 11366..1136C ; Extend # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX 11370..11374 ; Extend # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11438..1143F ; Extend # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11442..11444 ; Extend # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11446 ; Extend # Mn NEWA SIGN NUKTA 114B0 ; Extend # Mc TIRHUTA VOWEL SIGN AA 114B3..114B8 ; Extend # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL 114BA ; Extend # Mn TIRHUTA VOWEL SIGN SHORT E @@ -339,6 +353,13 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 1171D..1171F ; Extend # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA 11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11C30..11C36 ; Extend # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Extend # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3F ; Extend # Mn BHAIKSUKI SIGN VIRAMA +11C92..11CA7 ; Extend # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CAA..11CB0 ; Extend # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB2..11CB3 ; Extend # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB5..11CB6 ; Extend # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F8F..16F92 ; Extend # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW @@ -356,10 +377,17 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 1DA84 ; Extend # Mn SIGNWRITING LOCATION HEAD NECK 1DA9B..1DA9F ; Extend # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF ; Extend # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006 ; Extend # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Extend # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Extend # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Extend # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA 1E8D0..1E8D6 ; Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E94A ; Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 1610 +# Total code points: 1828 # ================================================ @@ -482,6 +510,9 @@ ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK 11347..11348 ; SpacingMark # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI 1134B..1134D ; SpacingMark # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA 11362..11363 ; SpacingMark # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11435..11437 ; SpacingMark # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11440..11441 ; SpacingMark # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11445 ; SpacingMark # Mc NEWA SIGN VISARGA 114B1..114B2 ; SpacingMark # Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II 114B9 ; SpacingMark # Mc TIRHUTA VOWEL SIGN E 114BB..114BC ; SpacingMark # Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O @@ -498,11 +529,16 @@ ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK 116B6 ; SpacingMark # Mc TAKRI SIGN VIRAMA 11720..11721 ; SpacingMark # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA 11726 ; SpacingMark # Mc AHOM VOWEL SIGN E +11C2F ; SpacingMark # Mc BHAIKSUKI VOWEL SIGN AA +11C3E ; SpacingMark # Mc BHAIKSUKI SIGN VISARGA +11CA9 ; SpacingMark # Mc MARCHEN SUBJOINED LETTER YA +11CB1 ; SpacingMark # Mc MARCHEN VOWEL SIGN I +11CB4 ; SpacingMark # Mc MARCHEN VOWEL SIGN O 16F51..16F7E ; SpacingMark # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 1D166 ; SpacingMark # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D16D ; SpacingMark # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT -# Total code points: 330 +# Total code points: 341 # ================================================ @@ -1333,4 +1369,63 @@ D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH # Total code points: 10773 +# ================================================ + +261D ; E_Base # So WHITE UP POINTING INDEX +26F9 ; E_Base # So PERSON WITH BALL +270A..270D ; E_Base # So [4] RAISED FIST..WRITING HAND +1F385 ; E_Base # So FATHER CHRISTMAS +1F3C3..1F3C4 ; E_Base # So [2] RUNNER..SURFER +1F3CA..1F3CB ; E_Base # So [2] SWIMMER..WEIGHT LIFTER +1F442..1F443 ; E_Base # So [2] EAR..NOSE +1F446..1F450 ; E_Base # So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN +1F46E ; E_Base # So POLICE OFFICER +1F470..1F478 ; E_Base # So [9] BRIDE WITH VEIL..PRINCESS +1F47C ; E_Base # So BABY ANGEL +1F481..1F483 ; E_Base # So [3] INFORMATION DESK PERSON..DANCER +1F485..1F487 ; E_Base # So [3] NAIL POLISH..HAIRCUT +1F4AA ; E_Base # So FLEXED BICEPS +1F575 ; E_Base # So SLEUTH OR SPY +1F57A ; E_Base # So MAN DANCING +1F590 ; E_Base # So RAISED HAND WITH FINGERS SPLAYED +1F595..1F596 ; E_Base # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F645..1F647 ; E_Base # So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY +1F64B..1F64F ; E_Base # So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS +1F6A3 ; E_Base # So ROWBOAT +1F6B4..1F6B6 ; E_Base # So [3] BICYCLIST..PEDESTRIAN +1F6C0 ; E_Base # So BATH +1F918..1F91E ; E_Base # So [7] SIGN OF THE HORNS..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F926 ; E_Base # So FACE PALM +1F930 ; E_Base # So PREGNANT WOMAN +1F933..1F939 ; E_Base # So [7] SELFIE..JUGGLING +1F93C..1F93E ; E_Base # So [3] WRESTLERS..HANDBALL + +# Total code points: 79 + +# ================================================ + +1F3FB..1F3FF ; E_Modifier # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 + +# Total code points: 5 + +# ================================================ + +200D ; ZWJ # Cf ZERO WIDTH JOINER + +# Total code points: 1 + +# ================================================ + +2764 ; Glue_After_Zwj # So HEAVY BLACK HEART +1F48B ; Glue_After_Zwj # So KISS MARK +1F5E8 ; Glue_After_Zwj # So LEFT SPEECH BUBBLE + +# Total code points: 3 + +# ================================================ + +1F466..1F469 ; E_Base_GAZ # So [4] BOY..WOMAN + +# Total code points: 4 + # EOF diff --git a/tests/data/GraphemeBreakTest.txt b/tests/data/GraphemeBreakTest.txt index a3ed239c95..4bb4b1369b 100644 --- a/tests/data/GraphemeBreakTest.txt +++ b/tests/data/GraphemeBreakTest.txt @@ -1,10 +1,11 @@ -# GraphemeBreakTest-8.0.0.txt -# Date: 2015-02-13, 13:47:15 GMT [MD] +# GraphemeBreakTest-9.0.0.txt +# Date: 2016-06-02, 18:28:17 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Default Grapheme Break Test # @@ -30,6 +31,8 @@ ÷ 0020 × 0308 ÷ 0001 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 0020 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 0020 × 0308 × 0300 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 0020 ÷ 0600 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0020 × 0308 ÷ 0600 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0020 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0020 × 0308 × 0903 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0020 ÷ 1100 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -42,8 +45,18 @@ ÷ 0020 × 0308 ÷ AC00 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0020 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0020 × 0308 ÷ AC01 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0020 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0020 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0020 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0020 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0020 ÷ 261D ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0020 × 0308 ÷ 261D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0020 ÷ 1F3FB ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0020 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0020 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0020 × 0308 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0020 ÷ 2764 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0020 × 0308 ÷ 2764 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0020 ÷ 1F466 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0020 × 0308 ÷ 1F466 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0020 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0020 × 0308 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0020 ÷ D800 ÷ # ÷ [0.2] SPACE (Other) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] @@ -58,6 +71,8 @@ ÷ 000D ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 000D ÷ 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 000D ÷ 0600 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 000D ÷ 0903 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 000D ÷ 0308 × 0903 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 000D ÷ 1100 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -70,8 +85,18 @@ ÷ 000D ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 000D ÷ AC01 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 000D ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000D ÷ 261D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000D ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000D ÷ 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 000D ÷ 2764 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000D ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] BOY (EBG) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000D ÷ 0378 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 000D ÷ D800 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <surrogate-D800> (Control) ÷ [0.3] @@ -86,6 +111,8 @@ ÷ 000A ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 000A ÷ 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 000A ÷ 0600 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 000A ÷ 0903 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 000A ÷ 0308 × 0903 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 000A ÷ 1100 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -98,8 +125,18 @@ ÷ 000A ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 000A ÷ AC01 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 000A ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000A ÷ 261D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000A ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000A ÷ 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 000A ÷ 2764 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000A ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] BOY (EBG) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000A ÷ 0378 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 000A ÷ D800 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <surrogate-D800> (Control) ÷ [0.3] @@ -114,6 +151,8 @@ ÷ 0001 ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 0001 ÷ 0300 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 0001 ÷ 0308 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 0001 ÷ 0600 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0001 ÷ 0903 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0001 ÷ 0308 × 0903 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0001 ÷ 1100 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -126,8 +165,18 @@ ÷ 0001 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0001 ÷ AC01 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0001 ÷ 261D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0001 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0001 ÷ 200D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0001 ÷ 0308 × 200D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0001 ÷ 2764 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0001 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] BOY (EBG) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0001 ÷ 0378 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0001 ÷ D800 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] <surrogate-D800> (Control) ÷ [0.3] @@ -142,6 +191,8 @@ ÷ 0300 × 0308 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 0300 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0300 × 0308 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0300 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0300 × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0300 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -154,12 +205,62 @@ ÷ 0300 × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0300 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0300 × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0300 ÷ 261D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0300 × 0308 ÷ 261D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0300 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0300 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0300 ÷ 2764 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0300 × 0308 ÷ 2764 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0300 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0300 × 0308 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0300 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0300 × 0308 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0300 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] ÷ 0300 × 0308 ÷ D800 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 0600 × 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] SPACE (Other) ÷ [0.3] +÷ 0600 × 0308 ÷ 0020 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0600 ÷ 000D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0600 × 0308 ÷ 000D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0600 ÷ 000A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0600 × 0308 ÷ 000A ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0600 ÷ 0001 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 0600 × 0308 ÷ 0001 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 0600 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 0600 × 0308 × 0300 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 0600 × 0600 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0600 × 0308 ÷ 0600 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0600 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0600 × 0308 × 0903 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 0600 × 1100 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0600 × 0308 ÷ 1100 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 0600 × 1160 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0600 × 0308 ÷ 1160 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 0600 × 11A8 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0600 × 0308 ÷ 11A8 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 0600 × AC00 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0600 × 0308 ÷ AC00 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 0600 × AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0600 × 0308 ÷ AC01 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 0600 × 1F1E6 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0600 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0600 × 261D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0600 × 0308 ÷ 261D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0600 × 1F3FB ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0600 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0600 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0600 × 0308 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0600 × 2764 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0600 × 0308 ÷ 2764 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0600 × 1F466 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] BOY (EBG) ÷ [0.3] +÷ 0600 × 0308 ÷ 1F466 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0600 × 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] <reserved-0378> (Other) ÷ [0.3] +÷ 0600 × 0308 ÷ 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 0600 ÷ D800 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 0600 × 0308 ÷ D800 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] ÷ 0903 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0903 × 0308 ÷ 0020 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0903 ÷ 000D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] @@ -170,6 +271,8 @@ ÷ 0903 × 0308 ÷ 0001 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 0903 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 0903 × 0308 × 0300 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 0903 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0903 × 0308 ÷ 0600 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0903 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0903 × 0308 × 0903 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0903 ÷ 1100 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -182,8 +285,18 @@ ÷ 0903 × 0308 ÷ AC00 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0903 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0903 × 0308 ÷ AC01 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0903 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0903 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0903 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0903 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0903 ÷ 261D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0903 × 0308 ÷ 261D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0903 ÷ 1F3FB ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0903 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0903 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0903 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0903 ÷ 2764 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0903 × 0308 ÷ 2764 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0903 ÷ 1F466 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0903 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0903 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0903 × 0308 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0903 ÷ D800 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] @@ -198,6 +311,8 @@ ÷ 1100 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 1100 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 1100 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 1100 ÷ 0600 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1100 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 1100 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 1100 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 1100 × 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -210,8 +325,18 @@ ÷ 1100 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 1100 × AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 1100 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1100 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 1100 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 1100 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1100 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1100 ÷ 261D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1100 × 0308 ÷ 261D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1100 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1100 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1100 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1100 × 0308 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1100 ÷ 2764 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1100 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1100 ÷ 1F466 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1100 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1100 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 1100 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 1100 ÷ D800 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] @@ -226,6 +351,8 @@ ÷ 1160 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 1160 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 1160 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 1160 ÷ 0600 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1160 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 1160 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 1160 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 1160 ÷ 1100 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -238,8 +365,18 @@ ÷ 1160 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 1160 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 1160 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1160 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 1160 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 1160 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1160 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1160 ÷ 261D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1160 × 0308 ÷ 261D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1160 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1160 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1160 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1160 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1160 ÷ 2764 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1160 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1160 ÷ 1F466 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1160 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1160 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 1160 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 1160 ÷ D800 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] @@ -254,6 +391,8 @@ ÷ 11A8 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 11A8 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 11A8 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 11A8 ÷ 0600 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 11A8 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 11A8 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 11A8 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -266,8 +405,18 @@ ÷ 11A8 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 11A8 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 11A8 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 11A8 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 11A8 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 11A8 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 11A8 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 11A8 ÷ 261D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 11A8 × 0308 ÷ 261D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 11A8 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 11A8 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 11A8 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 11A8 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 11A8 ÷ 2764 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 11A8 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 11A8 ÷ 1F466 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 11A8 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 11A8 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 11A8 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 11A8 ÷ D800 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] @@ -282,6 +431,8 @@ ÷ AC00 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ AC00 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ AC00 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ AC00 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ AC00 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ AC00 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ AC00 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ AC00 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -294,8 +445,18 @@ ÷ AC00 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ AC00 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ AC00 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ AC00 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ AC00 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ AC00 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ AC00 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ AC00 ÷ 261D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ AC00 × 0308 ÷ 261D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ AC00 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ AC00 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ AC00 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ AC00 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ AC00 ÷ 2764 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ AC00 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ AC00 ÷ 1F466 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ AC00 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ AC00 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ AC00 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ AC00 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] @@ -310,6 +471,8 @@ ÷ AC01 × 0308 ÷ 0001 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ AC01 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ AC01 × 0308 × 0300 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ AC01 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ AC01 × 0308 ÷ 0600 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ AC01 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ AC01 × 0308 × 0903 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ AC01 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -322,40 +485,262 @@ ÷ AC01 × 0308 ÷ AC00 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ AC01 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ AC01 × 0308 ÷ AC01 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ AC01 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ AC01 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ AC01 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ AC01 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ AC01 ÷ 261D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ AC01 × 0308 ÷ 261D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ AC01 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ AC01 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ AC01 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ AC01 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ AC01 ÷ 2764 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ AC01 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ AC01 ÷ 1F466 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ AC01 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ AC01 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ AC01 × 0308 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ AC01 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] ÷ AC01 × 0308 ÷ D800 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] -÷ 1F1E6 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] -÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] -÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] -÷ 1F1E6 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1F1E6 × 0308 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 1F1E6 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 1F1E6 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 1F1E6 ÷ 11A8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 11A8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 1F1E6 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 1F1E6 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] -÷ 1F1E6 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 1F1E6 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0020 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 1F1E6 ÷ 0600 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0600 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1F1E6 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F1E6 × 0308 × 0903 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F1E6 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1100 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F1E6 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1160 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1F1E6 ÷ 11A8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 11A8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1F1E6 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ AC00 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1F1E6 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ AC01 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F1E6 ÷ 261D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 261D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F1E6 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1F1E6 ÷ 2764 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 2764 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F1E6 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F1E6 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 1F1E6 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ D800 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 261D ÷ 0020 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 261D × 0308 ÷ 0020 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 261D ÷ 000D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 261D × 0308 ÷ 000D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 261D ÷ 000A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 261D × 0308 ÷ 000A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 261D ÷ 0001 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 261D × 0308 ÷ 0001 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 261D × 0300 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 261D × 0308 × 0300 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 261D ÷ 0600 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 261D × 0308 ÷ 0600 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 261D × 0903 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 261D × 0308 × 0903 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 261D ÷ 1100 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 261D × 0308 ÷ 1100 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 261D ÷ 1160 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 261D × 0308 ÷ 1160 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 261D ÷ 11A8 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 261D × 0308 ÷ 11A8 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 261D ÷ AC00 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 261D × 0308 ÷ AC00 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 261D ÷ AC01 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 261D × 0308 ÷ AC01 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 261D ÷ 1F1E6 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 261D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 261D ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 261D × 0308 ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 261D × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 261D × 0308 × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 261D × 200D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 261D × 0308 × 200D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 261D ÷ 2764 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 261D × 0308 ÷ 2764 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 261D ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 261D × 0308 ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 261D ÷ 0378 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 261D × 0308 ÷ 0378 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 261D ÷ D800 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 261D × 0308 ÷ D800 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 1F3FB ÷ 0020 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0020 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1F3FB ÷ 000D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 000D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F3FB ÷ 000A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 000A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F3FB ÷ 0001 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0001 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 1F3FB × 0300 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 1F3FB × 0308 × 0300 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 1F3FB ÷ 0600 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0600 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1F3FB × 0903 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F3FB × 0308 × 0903 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F3FB ÷ 1100 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 1100 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F3FB ÷ 1160 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 1160 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1F3FB ÷ 11A8 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 11A8 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1F3FB ÷ AC00 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1F3FB × 0308 ÷ AC00 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1F3FB ÷ AC01 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F3FB × 0308 ÷ AC01 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F3FB ÷ 1F1E6 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F3FB ÷ 261D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 261D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F3FB ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F3FB × 200D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1F3FB × 0308 × 200D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1F3FB ÷ 2764 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 2764 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F3FB ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F3FB ÷ 0378 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0378 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 1F3FB ÷ D800 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 1F3FB × 0308 ÷ D800 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 200D ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 200D × 0308 ÷ 0020 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 200D × 0308 ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 200D ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 200D × 0308 ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 200D ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 200D × 0308 ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 200D × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 200D × 0308 × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 200D ÷ 0600 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 200D × 0308 ÷ 0600 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 200D × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 200D × 0308 × 0903 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 200D ÷ 1100 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 200D × 0308 ÷ 1100 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 200D ÷ 1160 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 200D × 0308 ÷ 1160 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 200D ÷ 11A8 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 200D × 0308 ÷ 11A8 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 200D ÷ AC00 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 200D × 0308 ÷ AC00 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 200D ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 200D × 0308 ÷ AC01 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 200D ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 200D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 200D ÷ 261D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 200D × 0308 ÷ 261D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 200D ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 200D × 0308 ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 200D × 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 0308 ÷ 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] BOY (EBG) ÷ [0.3] +÷ 200D × 0308 ÷ 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 200D ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 200D × 0308 ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 200D ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 200D × 0308 ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 2764 ÷ 0020 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 2764 × 0308 ÷ 0020 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 2764 ÷ 000D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 2764 × 0308 ÷ 000D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 2764 ÷ 000A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 2764 × 0308 ÷ 000A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 2764 ÷ 0001 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 2764 × 0308 ÷ 0001 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 2764 × 0300 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 2764 × 0308 × 0300 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 2764 ÷ 0600 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 2764 × 0308 ÷ 0600 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 2764 × 0903 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 2764 × 0308 × 0903 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 2764 ÷ 1100 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 2764 × 0308 ÷ 1100 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 2764 ÷ 1160 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 2764 × 0308 ÷ 1160 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 2764 ÷ 11A8 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 2764 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 2764 ÷ AC00 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 2764 × 0308 ÷ AC00 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 2764 ÷ AC01 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 2764 × 0308 ÷ AC01 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 2764 ÷ 1F1E6 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 2764 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 2764 ÷ 261D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 2764 × 0308 ÷ 261D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 2764 ÷ 1F3FB ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 2764 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 2764 × 200D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 2764 × 0308 × 200D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 2764 ÷ 2764 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 2764 × 0308 ÷ 2764 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 2764 ÷ 1F466 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 2764 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 2764 ÷ 0378 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 2764 × 0308 ÷ 0378 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 2764 ÷ D800 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 2764 × 0308 ÷ D800 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 1F466 ÷ 0020 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0020 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1F466 ÷ 000D ÷ # ÷ [0.2] BOY (EBG) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F466 × 0308 ÷ 000D ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F466 ÷ 000A ÷ # ÷ [0.2] BOY (EBG) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F466 × 0308 ÷ 000A ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F466 ÷ 0001 ÷ # ÷ [0.2] BOY (EBG) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0001 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 1F466 × 0300 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 1F466 × 0308 × 0300 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 1F466 ÷ 0600 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0600 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 1F466 × 0903 ÷ # ÷ [0.2] BOY (EBG) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F466 × 0308 × 0903 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 1F466 ÷ 1100 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F466 × 0308 ÷ 1100 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F466 ÷ 1160 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1F466 × 0308 ÷ 1160 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 1F466 ÷ 11A8 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1F466 × 0308 ÷ 11A8 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 1F466 ÷ AC00 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1F466 × 0308 ÷ AC00 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 1F466 ÷ AC01 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F466 × 0308 ÷ AC01 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 1F466 ÷ 1F1E6 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F466 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F466 ÷ 261D ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F466 × 0308 ÷ 261D ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F466 × 0308 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F466 × 200D ÷ # ÷ [0.2] BOY (EBG) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1F466 × 0308 × 200D ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 1F466 ÷ 2764 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F466 × 0308 ÷ 2764 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F466 × 0308 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F466 ÷ 0378 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0378 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 1F466 ÷ D800 ÷ # ÷ [0.2] BOY (EBG) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 1F466 × 0308 ÷ D800 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] ÷ 0378 ÷ 0020 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0378 × 0308 ÷ 0020 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 0378 ÷ 000D ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] @@ -366,6 +751,8 @@ ÷ 0378 × 0308 ÷ 0001 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ 0378 × 0300 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ 0378 × 0308 × 0300 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 0378 ÷ 0600 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 0378 × 0308 ÷ 0600 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ 0378 × 0903 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0378 × 0308 × 0903 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ 0378 ÷ 1100 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -378,8 +765,18 @@ ÷ 0378 × 0308 ÷ AC00 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ 0378 ÷ AC01 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ 0378 × 0308 ÷ AC01 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 0378 ÷ 1F1E6 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0378 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0378 ÷ 1F1E6 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0378 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0378 ÷ 261D ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0378 × 0308 ÷ 261D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0378 ÷ 1F3FB ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0378 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0378 × 200D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0378 × 0308 × 200D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0378 ÷ 2764 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0378 × 0308 ÷ 2764 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0378 ÷ 1F466 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0378 × 0308 ÷ 1F466 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0378 ÷ 0378 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0378 × 0308 ÷ 0378 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 0378 ÷ D800 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] @@ -394,6 +791,8 @@ ÷ D800 ÷ 0308 ÷ 0001 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] ÷ D800 ÷ 0300 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] ÷ D800 ÷ 0308 × 0300 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ D800 ÷ 0600 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 0600 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ÷ D800 ÷ 0903 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ D800 ÷ 0308 × 0903 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ÷ D800 ÷ 1100 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] @@ -406,23 +805,45 @@ ÷ D800 ÷ 0308 ÷ AC00 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ÷ D800 ÷ AC01 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ÷ D800 ÷ 0308 ÷ AC01 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ D800 ÷ 1F1E6 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ D800 ÷ 1F1E6 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ D800 ÷ 261D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ D800 ÷ 1F3FB ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ D800 ÷ 200D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ D800 ÷ 0308 × 200D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ D800 ÷ 2764 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ D800 ÷ 1F466 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] BOY (EBG) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ D800 ÷ 0378 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3] ÷ D800 ÷ 0308 ÷ 0378 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ D800 ÷ D800 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] <surrogate-D800> (Control) ÷ [0.3] ÷ D800 ÷ 0308 ÷ D800 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] -÷ 0061 ÷ 1F1E6 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] -÷ 1F1F7 × 1F1FA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) ÷ [0.3] -÷ 1F1F7 × 1F1FA × 1F1F8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) ÷ [0.3] -÷ 1F1F7 × 1F1FA × 1F1F8 × 1F1EA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER E (Regional_Indicator) ÷ [0.3] -÷ 1F1F7 × 1F1FA ÷ 200B ÷ 1F1F8 × 1F1EA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) ÷ [5.0] ZERO WIDTH SPACE (Control) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER E (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 × 200D ÷ 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [9.0] ZERO WIDTH JOINER (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 × 1F1E7 × 200D ÷ 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [8.1] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [9.0] ZERO WIDTH JOINER (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3] -÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (Extend) ÷ [999.0] ARABIC LETTER NOON (Other) ÷ [0.3] -÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (Other) × [9.0] ZERO WIDTH JOINER (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 000D × 000A ÷ 0061 ÷ 000A ÷ 0308 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN SMALL LETTER A (Other) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [0.3] +÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [0.3] +÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] ARABIC LETTER NOON (Other) ÷ [0.3] +÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (Other) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 1100 × 1100 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [6.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ AC00 × 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [7.0] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ AC01 × 11A8 ÷ 1100 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [8.0] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 × 200D ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 200D ÷ 1F1E7 × 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 × 1F1E9 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) × [13.0] REGIONAL INDICATOR SYMBOL LETTER D (RI) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 0061 × 0308 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 × 0903 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 0061 ÷ 0600 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Other) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) × [9.2] LATIN SMALL LETTER B (Other) ÷ [0.3] +÷ 261D × 1F3FB ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 200D × 1F466 × 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] BOY (EBG) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 200D × 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] BOY (EBG) ÷ [0.3] +÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3] # -# Lines: 402 +# Lines: 822 # # EOF diff --git a/tests/data/HangulSyllableType.txt b/tests/data/HangulSyllableType.txt index e30a82b82d..951787bc0c 100644 --- a/tests/data/HangulSyllableType.txt +++ b/tests/data/HangulSyllableType.txt @@ -1,10 +1,11 @@ -# HangulSyllableType-8.0.0.txt -# Date: 2014-12-16, 23:07:45 GMT [MD] +# HangulSyllableType-9.0.0.txt +# Date: 2016-03-02, 18:55:01 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2014 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # ================================================ diff --git a/tests/data/LineBreakTest.txt b/tests/data/LineBreakTest.txt index 7f2e2cc54f..05efcf5a44 100644 --- a/tests/data/LineBreakTest.txt +++ b/tests/data/LineBreakTest.txt @@ -1,10 +1,11 @@ -# LineBreakTest-8.0.0.txt -# Date: 2015-04-30, 09:40:15 GMT [MD] +# LineBreakTest-9.0.0.txt +# Date: 2016-06-18, 00:42:06 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Default Line Break Test # @@ -24,6088 +25,7094 @@ # × 0023 × 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] NUMBER SIGN (AL) ÷ [0.3] × 0023 × 0020 ÷ 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0023 × 0308 × 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0023 × 0308 × 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0023 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 0023 × 0020 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0023 × 0308 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0023 × 0308 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0023 × 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0023 × 0020 ÷ 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0023 × 0308 × 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0023 × 0308 × 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0023 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 0023 × 0020 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0023 × 0308 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0023 × 0308 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0023 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0023 × 0020 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0023 × 0308 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0023 × 0308 × 0020 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0023 × 0308 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0023 × 0308 × 0020 × 000B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0023 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0023 × 0020 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0023 × 0308 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0023 × 0308 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0023 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0023 × 0020 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0023 × 0308 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0023 × 0308 × 0020 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0023 × 0308 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0023 × 0308 × 0020 × 007D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0023 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0023 × 0020 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0023 × 0308 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0023 × 0308 × 0020 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0023 × 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0023 × 0020 ÷ 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0023 × 0308 × 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0023 × 0308 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0023 × 0308 × 0020 × 0029 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0023 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0023 × 0020 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0023 × 0308 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0023 × 0308 × 0020 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0023 × 0308 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0023 × 0308 × 0020 × 000D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0023 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0023 × 0020 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0023 × 0308 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0023 × 0308 × 0020 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0023 × 0308 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0023 × 0308 × 0020 × 0021 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0023 × 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0023 × 0020 ÷ 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0023 × 0308 × 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0023 × 0308 × 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0023 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0023 × 0020 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0023 × 0308 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0023 × 0308 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0023 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0023 × 0020 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0023 × 0308 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0023 × 0308 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0023 × 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0023 × 0020 ÷ 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0023 × 0308 × 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0023 × 0308 × 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0023 × 002D ÷ # × [0.3] NUMBER SIGN (AL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0023 × 0020 ÷ 002D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0023 × 0308 × 002D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 002D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0023 × 0308 × 002D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 002D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0023 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] WATCH (ID) ÷ [0.3] × 0023 × 0020 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0023 × 0308 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0023 × 0308 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 231A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0023 × 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] × 0023 × 0020 ÷ 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0023 × 0308 × 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0023 × 0308 × 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0023 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [13.02] COMMA (IS) ÷ [0.3] × 0023 × 0020 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0023 × 0308 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0023 × 0308 × 0020 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0023 × 0308 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0023 × 0308 × 0020 × 002C ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0023 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0023 × 0020 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0023 × 0308 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0023 × 0308 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0023 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0023 × 0020 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0023 × 0308 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0023 × 0308 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0023 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0023 × 0020 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0023 × 0308 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0023 × 0308 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0023 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0023 × 0020 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0023 × 0308 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0023 × 0308 × 0020 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0023 × 0308 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0023 × 0308 × 0020 × 000A ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0023 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0023 × 0020 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0023 × 0308 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0023 × 0308 × 0020 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0023 × 0308 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0023 × 0308 × 0020 × 0085 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0023 × 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0023 × 0020 ÷ 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0023 × 0308 × 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0023 × 0308 × 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0023 × 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3] × 0023 × 0020 ÷ 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0023 × 0308 × 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0023 × 0308 × 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0023 × 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] × 0023 × 0020 ÷ 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0023 × 0308 × 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0023 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 0023 × 0308 × 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0023 × 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [24.03] PERCENT SIGN (PO) ÷ [0.3] × 0023 × 0020 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0023 × 0308 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0023 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0023 × 0308 × 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0023 × 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] × 0023 × 0020 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0023 × 0308 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0023 × 0308 × 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0023 × 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0023 × 0020 ÷ 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0023 × 0308 × 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0023 × 0308 × 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0023 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [0.3] × 0023 × 0020 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0023 × 0308 × 0020 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0023 × 0308 × 0020 × 0020 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0023 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0023 × 0020 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0023 × 0308 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0023 × 0308 × 0020 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0023 × 0308 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0023 × 0308 × 0020 × 002F ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0023 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0023 × 0020 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0023 × 0308 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0023 × 0308 × 0020 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0023 × 0308 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0023 × 0308 × 0020 × 2060 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0023 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0023 × 0020 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0023 × 0308 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0023 × 0308 × 0020 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0023 × 0308 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0023 × 0308 × 0020 × 200B ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0023 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0023 × 0020 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0023 × 0308 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0023 × 0308 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0023 ÷ 261D ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0023 × 0020 ÷ 261D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0023 × 0308 ÷ 261D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 261D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0023 ÷ 1F3FB ÷ # × [0.3] NUMBER SIGN (AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0023 × 0020 ÷ 1F3FB ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0023 × 0308 ÷ 1F3FB ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0023 × 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0023 × 0020 ÷ 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0023 × 0308 × 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0023 × 200D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0023 × 0020 ÷ 200D ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0023 × 0308 × 200D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 200D ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0023 × 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0023 × 0020 ÷ 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0023 × 0308 × 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0023 × 0308 × 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0023 × 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0023 × 0020 ÷ 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0023 × 0308 × 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0023 × 0308 × 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0023 × 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0023 × 0020 ÷ 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0023 × 0308 × 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0023 × 0308 × 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0023 × 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0023 × 0020 ÷ 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0023 × 0308 × 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0023 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0023 × 0308 × 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0023 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] NUMBER SIGN (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 2014 ÷ 0023 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 2014 × 0020 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 2014 × 0308 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 2014 × 0308 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 2014 × 2014 ÷ # × [0.3] EM DASH (B2) × [17.0] EM DASH (B2) ÷ [0.3] × 2014 × 0020 × 2014 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [17.0] EM DASH (B2) ÷ [0.3] -× 2014 × 0308 × 2014 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [17.0] EM DASH (B2) ÷ [0.3] -× 2014 × 0308 × 0020 × 2014 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [17.0] EM DASH (B2) ÷ [0.3] +× 2014 × 0308 × 2014 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [17.0] EM DASH (B2) ÷ [0.3] +× 2014 × 0308 × 0020 × 2014 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [17.0] EM DASH (B2) ÷ [0.3] × 2014 × 0009 ÷ # × [0.3] EM DASH (B2) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 2014 × 0020 ÷ 0009 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 2014 × 0308 × 0009 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 2014 × 0308 × 0009 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 2014 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 2014 × 0020 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 2014 × 0308 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 2014 × 0308 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 2014 × 000B ÷ # × [0.3] EM DASH (B2) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 2014 × 0020 × 000B ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 2014 × 0308 × 000B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 2014 × 0308 × 0020 × 000B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 2014 × 0308 × 000B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 2014 × 0308 × 0020 × 000B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 2014 ÷ FFFC ÷ # × [0.3] EM DASH (B2) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 2014 × 0020 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 2014 × 0308 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 2014 × 0308 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 2014 × 007D ÷ # × [0.3] EM DASH (B2) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 2014 × 0020 × 007D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 2014 × 0308 × 007D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 2014 × 0308 × 0020 × 007D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 2014 × 0308 × 007D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 2014 × 0308 × 0020 × 007D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 2014 × 0029 ÷ # × [0.3] EM DASH (B2) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 2014 × 0020 × 0029 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2014 × 0308 × 0029 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2014 × 0308 × 0020 × 0029 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2014 × 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 2014 × 0020 ÷ 0001 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 2014 × 0308 × 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 2014 × 0308 × 0029 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 2014 × 0308 × 0020 × 0029 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 2014 × 000D ÷ # × [0.3] EM DASH (B2) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 2014 × 0020 × 000D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 2014 × 0308 × 000D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 2014 × 0308 × 0020 × 000D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 2014 × 0308 × 000D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 2014 × 0308 × 0020 × 000D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 2014 × 0021 ÷ # × [0.3] EM DASH (B2) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 2014 × 0020 × 0021 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 2014 × 0308 × 0021 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 2014 × 0308 × 0020 × 0021 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 2014 × 0308 × 0021 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 2014 × 0308 × 0020 × 0021 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 2014 × 00A0 ÷ # × [0.3] EM DASH (B2) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 2014 × 0020 ÷ 00A0 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 2014 × 0308 × 00A0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 2014 × 0308 × 00A0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 2014 ÷ AC00 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 2014 × 0020 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 2014 × 0308 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 2014 × 0308 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 2014 ÷ AC01 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 2014 × 0020 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 2014 × 0308 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 2014 × 0308 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 2014 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 2014 × 0020 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 2014 × 0308 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 2014 × 0308 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 2014 × 002D ÷ # × [0.3] EM DASH (B2) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 2014 × 0020 ÷ 002D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 2014 × 0308 × 002D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 002D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 2014 × 0308 × 002D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 002D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 2014 ÷ 231A ÷ # × [0.3] EM DASH (B2) ÷ [999.0] WATCH (ID) ÷ [0.3] × 2014 × 0020 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 2014 × 0308 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 2014 × 0308 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 231A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 2014 ÷ 2024 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 2014 × 0020 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 2014 × 0308 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 2014 × 0308 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 2014 × 002C ÷ # × [0.3] EM DASH (B2) × [13.02] COMMA (IS) ÷ [0.3] × 2014 × 0020 × 002C ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 2014 × 0308 × 002C ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 2014 × 0308 × 0020 × 002C ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 2014 × 0308 × 002C ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 2014 × 0308 × 0020 × 002C ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 2014 ÷ 1100 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 2014 × 0020 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 2014 × 0308 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 2014 × 0308 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 2014 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 2014 × 0020 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 2014 × 0308 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 2014 × 0308 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 2014 ÷ 1160 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 2014 × 0020 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 2014 × 0308 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 2014 × 0308 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 2014 × 000A ÷ # × [0.3] EM DASH (B2) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 2014 × 0020 × 000A ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 2014 × 0308 × 000A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 2014 × 0308 × 0020 × 000A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 2014 × 0308 × 000A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 2014 × 0308 × 0020 × 000A ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 2014 × 0085 ÷ # × [0.3] EM DASH (B2) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 2014 × 0020 × 0085 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 2014 × 0308 × 0085 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 2014 × 0308 × 0020 × 0085 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 2014 × 0308 × 0085 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 2014 × 0308 × 0020 × 0085 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 2014 × 17D6 ÷ # × [0.3] EM DASH (B2) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 2014 × 0020 ÷ 17D6 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 2014 × 0308 × 17D6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 2014 × 0308 × 17D6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 2014 ÷ 0030 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 2014 × 0020 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 2014 × 0308 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 2014 × 0308 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 2014 ÷ 0028 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 2014 × 0020 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 2014 × 0308 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 2014 × 0308 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 2014 ÷ 0025 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 2014 × 0020 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 2014 × 0308 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 2014 × 0308 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 2014 ÷ 0024 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 2014 × 0020 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 2014 × 0308 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 2014 × 0308 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 2014 × 0022 ÷ # × [0.3] EM DASH (B2) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 2014 × 0020 ÷ 0022 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 2014 × 0308 × 0022 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 2014 × 0308 × 0022 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 2014 × 0020 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [0.3] × 2014 × 0020 × 0020 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 2014 × 0308 × 0020 × 0020 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 2014 × 0308 × 0020 × 0020 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 2014 × 002F ÷ # × [0.3] EM DASH (B2) × [13.02] SOLIDUS (SY) ÷ [0.3] × 2014 × 0020 × 002F ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 2014 × 0308 × 002F ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 2014 × 0308 × 0020 × 002F ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 2014 × 0308 × 002F ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 2014 × 0308 × 0020 × 002F ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 2014 × 2060 ÷ # × [0.3] EM DASH (B2) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 2014 × 0020 × 2060 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 2014 × 0308 × 2060 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 2014 × 0308 × 0020 × 2060 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 2014 × 0308 × 2060 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 2014 × 0308 × 0020 × 2060 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 2014 × 200B ÷ # × [0.3] EM DASH (B2) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 2014 × 0020 × 200B ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 2014 × 0308 × 200B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 2014 × 0308 × 0020 × 200B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 2014 × 0308 × 200B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 2014 × 0308 × 0020 × 200B ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 2014 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 2014 × 0020 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 2014 × 0308 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2014 × 0308 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2014 ÷ 261D ÷ # × [0.3] EM DASH (B2) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2014 × 0020 ÷ 261D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2014 × 0308 ÷ 261D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 261D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2014 ÷ 1F3FB ÷ # × [0.3] EM DASH (B2) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2014 × 0020 ÷ 1F3FB ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2014 × 0308 ÷ 1F3FB ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2014 × 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2014 × 0020 ÷ 0001 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2014 × 0308 × 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2014 × 200D ÷ # × [0.3] EM DASH (B2) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2014 × 0020 ÷ 200D ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2014 × 0308 × 200D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 200D ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 2014 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 2014 × 0020 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 2014 × 0308 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 2014 × 0308 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 2014 ÷ 50005 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 2014 × 0020 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 2014 × 0308 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 2014 × 0308 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 2014 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 2014 × 0020 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 2014 × 0308 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 2014 × 0308 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 2014 × 3041 ÷ # × [0.3] EM DASH (B2) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 2014 × 0020 ÷ 3041 ÷ # × [0.3] EM DASH (B2) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 2014 × 0308 × 3041 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 2014 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 2014 × 0308 × 3041 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 2014 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EM DASH (B2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0009 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 0009 × 0020 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0009 × 0308 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0009 × 0308 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0009 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 0009 × 0020 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0009 × 0308 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0009 × 0308 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0009 × 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0009 × 0020 ÷ 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0009 × 0308 × 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0009 × 0308 × 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0009 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 0009 × 0020 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0009 × 0308 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0009 × 0308 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0009 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0009 × 0020 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0009 × 0308 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0009 × 0308 × 0020 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0009 × 0308 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0009 × 0308 × 0020 × 000B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0009 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0009 × 0020 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0009 × 0308 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0009 × 0308 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0009 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0009 × 0020 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0009 × 0308 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0009 × 0308 × 0020 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0009 × 0308 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0009 × 0308 × 0020 × 007D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0009 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0009 × 0020 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0009 × 0308 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0009 × 0308 × 0020 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0009 × 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0009 × 0020 ÷ 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0009 × 0308 × 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0009 × 0308 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0009 × 0308 × 0020 × 0029 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0009 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0009 × 0020 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0009 × 0308 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0009 × 0308 × 0020 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0009 × 0308 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0009 × 0308 × 0020 × 000D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0009 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0009 × 0020 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0009 × 0308 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0009 × 0308 × 0020 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0009 × 0308 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0009 × 0308 × 0020 × 0021 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0009 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0009 × 0020 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0009 × 0308 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0009 × 0308 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0009 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0009 × 0020 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0009 × 0308 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0009 × 0308 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0009 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0009 × 0020 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0009 × 0308 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0009 × 0308 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0009 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0009 × 0020 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0009 × 0308 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0009 × 0308 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0009 × 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0009 × 0020 ÷ 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0009 × 0308 × 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0009 × 0308 × 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0009 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] WATCH (ID) ÷ [0.3] × 0009 × 0020 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0009 × 0308 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0009 × 0308 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0009 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 0009 × 0020 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0009 × 0308 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0009 × 0308 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0009 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.02] COMMA (IS) ÷ [0.3] × 0009 × 0020 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0009 × 0308 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0009 × 0308 × 0020 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0009 × 0308 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0009 × 0308 × 0020 × 002C ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0009 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0009 × 0020 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0009 × 0308 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0009 × 0308 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0009 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0009 × 0020 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0009 × 0308 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0009 × 0308 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0009 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0009 × 0020 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0009 × 0308 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0009 × 0308 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0009 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0009 × 0020 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0009 × 0308 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0009 × 0308 × 0020 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0009 × 0308 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0009 × 0308 × 0020 × 000A ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0009 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0009 × 0020 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0009 × 0308 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0009 × 0308 × 0020 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0009 × 0308 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0009 × 0308 × 0020 × 0085 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0009 × 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0009 × 0020 ÷ 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0009 × 0308 × 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0009 × 0308 × 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0009 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 0009 × 0020 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0009 × 0308 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0009 × 0308 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0009 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0009 × 0020 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0009 × 0308 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0009 × 0308 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0009 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 0009 × 0020 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0009 × 0308 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0009 × 0308 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0009 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 0009 × 0020 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0009 × 0308 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0009 × 0308 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0009 × 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0009 × 0020 ÷ 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0009 × 0308 × 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0009 × 0308 × 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0009 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [0.3] × 0009 × 0020 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0009 × 0308 × 0020 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0009 × 0308 × 0020 × 0020 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0009 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0009 × 0020 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0009 × 0308 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0009 × 0308 × 0020 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0009 × 0308 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0009 × 0308 × 0020 × 002F ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0009 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0009 × 0020 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0009 × 0308 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0009 × 0308 × 0020 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0009 × 0308 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0009 × 0308 × 0020 × 2060 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0009 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0009 × 0020 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0009 × 0308 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0009 × 0308 × 0020 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0009 × 0308 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0009 × 0308 × 0020 × 200B ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0009 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0009 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0009 × 0308 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0009 × 0308 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0009 ÷ 261D ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0009 × 0020 ÷ 261D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0009 × 0308 ÷ 261D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 261D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0009 ÷ 1F3FB ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0009 × 0020 ÷ 1F3FB ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0009 × 0308 ÷ 1F3FB ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0009 × 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0009 × 0020 ÷ 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0009 × 0308 × 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0009 × 200D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0009 × 0020 ÷ 200D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0009 × 0308 × 200D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 200D ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0009 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0009 × 0020 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0009 × 0308 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0009 × 0308 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0009 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0009 × 0020 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0009 × 0308 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0009 × 0308 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0009 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0009 × 0020 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0009 × 0308 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0009 × 0308 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0009 × 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0009 × 0020 ÷ 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0009 × 0308 × 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0009 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0009 × 0308 × 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0009 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <CHARACTER TABULATION> (BA) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 00B4 × 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] NUMBER SIGN (AL) ÷ [0.3] × 00B4 × 0020 ÷ 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 00B4 × 0308 × 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] NUMBER SIGN (AL) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 00B4 × 0308 × 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] NUMBER SIGN (AL) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 00B4 × 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] EM DASH (B2) ÷ [0.3] × 00B4 × 0020 ÷ 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 00B4 × 0308 × 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] EM DASH (B2) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 00B4 × 0308 × 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] EM DASH (B2) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 00B4 × 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 00B4 × 0020 ÷ 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 00B4 × 0308 × 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 00B4 × 0308 × 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 00B4 × 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] ACUTE ACCENT (BB) ÷ [0.3] × 00B4 × 0020 ÷ 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 00B4 × 0308 × 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] ACUTE ACCENT (BB) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 00B4 × 0308 × 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] ACUTE ACCENT (BB) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 00B4 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 00B4 × 0020 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 00B4 × 0308 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 00B4 × 0308 × 0020 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 00B4 × 0308 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 00B4 × 0308 × 0020 × 000B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 00B4 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 00B4 × 0020 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 00B4 × 0308 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 00B4 × 0308 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 00B4 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 00B4 × 0020 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 00B4 × 0308 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 00B4 × 0308 × 0020 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 00B4 × 0308 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 00B4 × 0308 × 0020 × 007D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 00B4 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 00B4 × 0020 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00B4 × 0308 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00B4 × 0308 × 0020 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00B4 × 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 00B4 × 0020 ÷ 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 00B4 × 0308 × 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 00B4 × 0308 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 00B4 × 0308 × 0020 × 0029 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 00B4 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 00B4 × 0020 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 00B4 × 0308 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 00B4 × 0308 × 0020 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 00B4 × 0308 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 00B4 × 0308 × 0020 × 000D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 00B4 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 00B4 × 0020 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 00B4 × 0308 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 00B4 × 0308 × 0020 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 00B4 × 0308 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 00B4 × 0308 × 0020 × 0021 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 00B4 × 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 00B4 × 0020 ÷ 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 00B4 × 0308 × 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 00B4 × 0308 × 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 00B4 × AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 00B4 × 0020 ÷ AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 00B4 × 0308 × AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 00B4 × 0308 × AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 00B4 × AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 00B4 × 0020 ÷ AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 00B4 × 0308 × AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 00B4 × 0308 × AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 00B4 × 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HEBREW LETTER ALEF (HL) ÷ [0.3] × 00B4 × 0020 ÷ 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 00B4 × 0308 × 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 00B4 × 0308 × 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 00B4 × 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 00B4 × 0020 ÷ 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 00B4 × 0308 × 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 00B4 × 0308 × 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 002D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 00B4 × 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] WATCH (ID) ÷ [0.3] × 00B4 × 0020 ÷ 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 00B4 × 0308 × 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] WATCH (ID) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 00B4 × 0308 × 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] WATCH (ID) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 231A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 00B4 × 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] ONE DOT LEADER (IN) ÷ [0.3] × 00B4 × 0020 ÷ 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 00B4 × 0308 × 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] ONE DOT LEADER (IN) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 00B4 × 0308 × 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] ONE DOT LEADER (IN) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 00B4 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [13.02] COMMA (IS) ÷ [0.3] × 00B4 × 0020 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 00B4 × 0308 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 00B4 × 0308 × 0020 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 00B4 × 0308 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 00B4 × 0308 × 0020 × 002C ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 00B4 × 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 00B4 × 0020 ÷ 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 00B4 × 0308 × 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 00B4 × 0308 × 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 00B4 × 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 00B4 × 0020 ÷ 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 00B4 × 0308 × 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 00B4 × 0308 × 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 00B4 × 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 00B4 × 0020 ÷ 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 00B4 × 0308 × 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 00B4 × 0308 × 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 00B4 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 00B4 × 0020 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 00B4 × 0308 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 00B4 × 0308 × 0020 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 00B4 × 0308 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 00B4 × 0308 × 0020 × 000A ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 00B4 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 00B4 × 0020 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 00B4 × 0308 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 00B4 × 0308 × 0020 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 00B4 × 0308 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 00B4 × 0308 × 0020 × 0085 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 00B4 × 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 00B4 × 0020 ÷ 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 00B4 × 0308 × 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 00B4 × 0308 × 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 00B4 × 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] DIGIT ZERO (NU) ÷ [0.3] × 00B4 × 0020 ÷ 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 00B4 × 0308 × 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] DIGIT ZERO (NU) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 00B4 × 0308 × 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] DIGIT ZERO (NU) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 00B4 × 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] LEFT PARENTHESIS (OP) ÷ [0.3] × 00B4 × 0020 ÷ 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 00B4 × 0308 × 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] LEFT PARENTHESIS (OP) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 00B4 × 0308 × 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] LEFT PARENTHESIS (OP) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 00B4 × 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] PERCENT SIGN (PO) ÷ [0.3] × 00B4 × 0020 ÷ 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 00B4 × 0308 × 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] PERCENT SIGN (PO) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 00B4 × 0308 × 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] PERCENT SIGN (PO) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 00B4 × 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] DOLLAR SIGN (PR) ÷ [0.3] × 00B4 × 0020 ÷ 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 00B4 × 0308 × 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] DOLLAR SIGN (PR) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 00B4 × 0308 × 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] DOLLAR SIGN (PR) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 00B4 × 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 00B4 × 0020 ÷ 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 00B4 × 0308 × 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 00B4 × 0308 × 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 00B4 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [0.3] × 00B4 × 0020 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 00B4 × 0308 × 0020 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 00B4 × 0308 × 0020 × 0020 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 00B4 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [13.02] SOLIDUS (SY) ÷ [0.3] × 00B4 × 0020 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 00B4 × 0308 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 00B4 × 0308 × 0020 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 00B4 × 0308 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 00B4 × 0308 × 0020 × 002F ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 00B4 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 00B4 × 0020 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 00B4 × 0308 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 00B4 × 0308 × 0020 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 00B4 × 0308 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 00B4 × 0308 × 0020 × 2060 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 00B4 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 00B4 × 0020 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 00B4 × 0308 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 00B4 × 0308 × 0020 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 00B4 × 0308 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 00B4 × 0308 × 0020 × 200B ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 00B4 × 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 00B4 × 0020 ÷ 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 00B4 × 0308 × 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00B4 × 0308 × 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00B4 × 261D ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00B4 × 0020 ÷ 261D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00B4 × 0308 × 261D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 261D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00B4 × 1F3FB ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00B4 × 0020 ÷ 1F3FB ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00B4 × 0308 × 1F3FB ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00B4 × 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00B4 × 0020 ÷ 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00B4 × 0308 × 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00B4 × 200D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00B4 × 0020 ÷ 200D ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00B4 × 0308 × 200D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 200D ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 00B4 × 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] SECTION SIGN (AI_AL) ÷ [0.3] × 00B4 × 0020 ÷ 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 00B4 × 0308 × 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] SECTION SIGN (AI_AL) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 00B4 × 0308 × 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] SECTION SIGN (AI_AL) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 00B4 × 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] <reserved-50005> (XX_AL) ÷ [0.3] × 00B4 × 0020 ÷ 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 00B4 × 0308 × 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] <reserved-50005> (XX_AL) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 00B4 × 0308 × 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] <reserved-50005> (XX_AL) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 00B4 × 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.04] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 00B4 × 0020 ÷ 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 00B4 × 0308 × 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.04] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 00B4 × 0308 × 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.04] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 00B4 × 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 00B4 × 0020 ÷ 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 00B4 × 0308 × 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 00B4 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 00B4 × 0308 × 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 00B4 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ACUTE ACCENT (BB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 000B ÷ 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] NUMBER SIGN (AL) ÷ [0.3] × 000B ÷ 0020 ÷ 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 000B ÷ 0308 × 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 000B ÷ 0308 × 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 000B ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] EM DASH (B2) ÷ [0.3] × 000B ÷ 0020 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 000B ÷ 0308 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 000B ÷ 0308 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 000B ÷ 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 000B ÷ 0020 ÷ 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 000B ÷ 0308 × 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 000B ÷ 0308 × 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 000B ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] ACUTE ACCENT (BB) ÷ [0.3] × 000B ÷ 0020 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 000B ÷ 0308 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 000B ÷ 0308 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 000B ÷ 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <LINE TABULATION> (BK) ÷ [0.3] × 000B ÷ 0020 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 000B ÷ 0308 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 000B ÷ 0308 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 000B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 000B ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 000B ÷ 0020 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 000B ÷ 0308 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 000B ÷ 0308 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 000B ÷ 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 000B ÷ 0020 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 000B ÷ 0308 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 000B ÷ 0308 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 007D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 000B ÷ 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] RIGHT PARENTHESIS (CP) ÷ [0.3] × 000B ÷ 0020 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000B ÷ 0308 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000B ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <START OF HEADING> (CM) ÷ [0.3] -× 000B ÷ 0020 ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 000B ÷ 0308 × 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 000B ÷ 0308 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 000B ÷ 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 000B ÷ 0020 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 000B ÷ 0308 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 000B ÷ 0308 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 000D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 000B ÷ 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] EXCLAMATION MARK (EX) ÷ [0.3] × 000B ÷ 0020 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 000B ÷ 0308 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 000B ÷ 0308 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 000B ÷ 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] NO-BREAK SPACE (GL) ÷ [0.3] × 000B ÷ 0020 ÷ 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 000B ÷ 0308 × 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 000B ÷ 0308 × 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 000B ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 000B ÷ 0020 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 000B ÷ 0308 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 000B ÷ 0308 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 000B ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 000B ÷ 0020 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 000B ÷ 0308 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 000B ÷ 0308 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 000B ÷ 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 000B ÷ 0020 ÷ 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 000B ÷ 0308 × 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 000B ÷ 0308 × 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 000B ÷ 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HYPHEN-MINUS (HY) ÷ [0.3] × 000B ÷ 0020 ÷ 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 000B ÷ 0308 × 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 000B ÷ 0308 × 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 000B ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] WATCH (ID) ÷ [0.3] × 000B ÷ 0020 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 000B ÷ 0308 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 000B ÷ 0308 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 000B ÷ 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] ONE DOT LEADER (IN) ÷ [0.3] × 000B ÷ 0020 ÷ 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 000B ÷ 0308 × 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 000B ÷ 0308 × 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 000B ÷ 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMMA (IS) ÷ [0.3] × 000B ÷ 0020 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 000B ÷ 0308 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 000B ÷ 0308 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 002C ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 000B ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 000B ÷ 0020 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 000B ÷ 0308 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 000B ÷ 0308 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 000B ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 000B ÷ 0020 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 000B ÷ 0308 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 000B ÷ 0308 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 000B ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 000B ÷ 0020 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 000B ÷ 0308 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 000B ÷ 0308 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 000B ÷ 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 000B ÷ 0020 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 000B ÷ 0308 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 000B ÷ 0308 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 000A ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 000B ÷ 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 000B ÷ 0020 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 000B ÷ 0308 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 000B ÷ 0308 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 000B ÷ 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 000B ÷ 0020 ÷ 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 000B ÷ 0308 × 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 000B ÷ 0308 × 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 000B ÷ 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] DIGIT ZERO (NU) ÷ [0.3] × 000B ÷ 0020 ÷ 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 000B ÷ 0308 × 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 000B ÷ 0308 × 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 000B ÷ 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 000B ÷ 0020 ÷ 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 000B ÷ 0308 × 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 000B ÷ 0308 × 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 000B ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] PERCENT SIGN (PO) ÷ [0.3] × 000B ÷ 0020 ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 000B ÷ 0308 ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 000B ÷ 0308 × 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 000B ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] DOLLAR SIGN (PR) ÷ [0.3] × 000B ÷ 0020 ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 000B ÷ 0308 ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 000B ÷ 0308 × 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 000B ÷ 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] QUOTATION MARK (QU) ÷ [0.3] × 000B ÷ 0020 ÷ 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 000B ÷ 0308 × 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 000B ÷ 0308 × 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 000B ÷ 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [0.3] × 000B ÷ 0020 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 000B ÷ 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SOLIDUS (SY) ÷ [0.3] × 000B ÷ 0020 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 000B ÷ 0308 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 000B ÷ 0308 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 002F ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 000B ÷ 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] WORD JOINER (WJ) ÷ [0.3] × 000B ÷ 0020 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 000B ÷ 0308 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 000B ÷ 0308 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 000B ÷ 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 000B ÷ 0020 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 000B ÷ 0308 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 000B ÷ 0308 × 0020 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 000B ÷ 0308 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 000B ÷ 0308 × 0020 × 200B ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 000B ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 000B ÷ 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 000B ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000B ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000B ÷ 261D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000B ÷ 0020 ÷ 261D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000B ÷ 0308 ÷ 261D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000B ÷ 1F3FB ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000B ÷ 0020 ÷ 1F3FB ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000B ÷ 0308 ÷ 1F3FB ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000B ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000B ÷ 0020 ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000B ÷ 0308 × 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000B ÷ 200D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000B ÷ 0020 ÷ 200D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000B ÷ 0308 × 200D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 000B ÷ 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SECTION SIGN (AI_AL) ÷ [0.3] × 000B ÷ 0020 ÷ 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 000B ÷ 0308 × 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 000B ÷ 0308 × 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 000B ÷ 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] <reserved-50005> (XX_AL) ÷ [0.3] × 000B ÷ 0020 ÷ 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 000B ÷ 0308 × 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 000B ÷ 0308 × 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 000B ÷ 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 000B ÷ 0020 ÷ 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 000B ÷ 0308 × 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 000B ÷ 0308 × 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 000B ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 000B ÷ 0020 ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 000B ÷ 0308 × 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 000B ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 000B ÷ 0308 × 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 000B ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × FFFC ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] NUMBER SIGN (AL) ÷ [0.3] × FFFC × 0020 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× FFFC × 0308 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] NUMBER SIGN (AL) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× FFFC × 0308 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] NUMBER SIGN (AL) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0023 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × FFFC ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] EM DASH (B2) ÷ [0.3] × FFFC × 0020 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× FFFC × 0308 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] EM DASH (B2) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× FFFC × 0308 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] EM DASH (B2) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 2014 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × FFFC ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] <CHARACTER TABULATION> (BA) ÷ [0.3] × FFFC × 0020 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× FFFC × 0308 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] <CHARACTER TABULATION> (BA) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× FFFC × 0308 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] <CHARACTER TABULATION> (BA) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0009 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × FFFC ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] ACUTE ACCENT (BB) ÷ [0.3] × FFFC × 0020 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× FFFC × 0308 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] ACUTE ACCENT (BB) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× FFFC × 0308 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] ACUTE ACCENT (BB) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × FFFC × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × FFFC × 0020 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× FFFC × 0308 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× FFFC × 0308 × 0020 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× FFFC × 0308 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× FFFC × 0308 × 0020 × 000B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × FFFC ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × FFFC × 0020 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× FFFC × 0308 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× FFFC × 0308 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ FFFC ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × FFFC × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × FFFC × 0020 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× FFFC × 0308 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× FFFC × 0308 × 0020 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× FFFC × 0308 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× FFFC × 0308 × 0020 × 007D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × FFFC × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × FFFC × 0020 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× FFFC × 0308 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× FFFC × 0308 × 0020 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× FFFC × 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× FFFC × 0020 ÷ 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× FFFC × 0308 × 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× FFFC × 0308 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× FFFC × 0308 × 0020 × 0029 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × FFFC × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × FFFC × 0020 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× FFFC × 0308 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× FFFC × 0308 × 0020 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× FFFC × 0308 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× FFFC × 0308 × 0020 × 000D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × FFFC × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × FFFC × 0020 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× FFFC × 0308 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× FFFC × 0308 × 0020 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× FFFC × 0308 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× FFFC × 0308 × 0020 × 0021 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × FFFC × 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × FFFC × 0020 ÷ 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× FFFC × 0308 × 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× FFFC × 0308 × 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × FFFC ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] × FFFC × 0020 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× FFFC × 0308 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× FFFC × 0308 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ AC00 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × FFFC ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × FFFC × 0020 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× FFFC × 0308 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× FFFC × 0308 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ AC01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × FFFC ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HEBREW LETTER ALEF (HL) ÷ [0.3] × FFFC × 0020 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× FFFC × 0308 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HEBREW LETTER ALEF (HL) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× FFFC × 0308 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HEBREW LETTER ALEF (HL) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × FFFC ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HYPHEN-MINUS (HY) ÷ [0.3] × FFFC × 0020 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× FFFC × 0308 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HYPHEN-MINUS (HY) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× FFFC × 0308 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HYPHEN-MINUS (HY) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 002D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × FFFC ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] WATCH (ID) ÷ [0.3] × FFFC × 0020 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× FFFC × 0308 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] WATCH (ID) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× FFFC × 0308 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] WATCH (ID) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 231A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × FFFC ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] ONE DOT LEADER (IN) ÷ [0.3] × FFFC × 0020 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× FFFC × 0308 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] ONE DOT LEADER (IN) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× FFFC × 0308 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] ONE DOT LEADER (IN) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 2024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × FFFC × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.02] COMMA (IS) ÷ [0.3] × FFFC × 0020 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× FFFC × 0308 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× FFFC × 0308 × 0020 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× FFFC × 0308 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× FFFC × 0308 × 0020 × 002C ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × FFFC ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × FFFC × 0020 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× FFFC × 0308 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× FFFC × 0308 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 1100 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × FFFC ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × FFFC × 0020 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× FFFC × 0308 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× FFFC × 0308 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × FFFC ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × FFFC × 0020 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× FFFC × 0308 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× FFFC × 0308 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 1160 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × FFFC × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × FFFC × 0020 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× FFFC × 0308 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× FFFC × 0308 × 0020 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× FFFC × 0308 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× FFFC × 0308 × 0020 × 000A ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × FFFC × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × FFFC × 0020 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× FFFC × 0308 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× FFFC × 0308 × 0020 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× FFFC × 0308 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× FFFC × 0308 × 0020 × 0085 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × FFFC ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × FFFC × 0020 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× FFFC × 0308 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× FFFC × 0308 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × FFFC ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] DIGIT ZERO (NU) ÷ [0.3] × FFFC × 0020 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× FFFC × 0308 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] DIGIT ZERO (NU) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× FFFC × 0308 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] DIGIT ZERO (NU) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0030 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × FFFC ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] LEFT PARENTHESIS (OP) ÷ [0.3] × FFFC × 0020 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× FFFC × 0308 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] LEFT PARENTHESIS (OP) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× FFFC × 0308 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] LEFT PARENTHESIS (OP) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0028 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × FFFC ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] PERCENT SIGN (PO) ÷ [0.3] × FFFC × 0020 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× FFFC × 0308 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] PERCENT SIGN (PO) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× FFFC × 0308 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] PERCENT SIGN (PO) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0025 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × FFFC ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] DOLLAR SIGN (PR) ÷ [0.3] × FFFC × 0020 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× FFFC × 0308 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] DOLLAR SIGN (PR) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× FFFC × 0308 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] DOLLAR SIGN (PR) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0024 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × FFFC × 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × FFFC × 0020 ÷ 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× FFFC × 0308 × 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× FFFC × 0308 × 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0022 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × FFFC × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [0.3] × FFFC × 0020 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× FFFC × 0308 × 0020 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× FFFC × 0308 × 0020 × 0020 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × FFFC × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [13.02] SOLIDUS (SY) ÷ [0.3] × FFFC × 0020 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× FFFC × 0308 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× FFFC × 0308 × 0020 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× FFFC × 0308 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× FFFC × 0308 × 0020 × 002F ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × FFFC × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [11.01] WORD JOINER (WJ) ÷ [0.3] × FFFC × 0020 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× FFFC × 0308 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× FFFC × 0308 × 0020 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× FFFC × 0308 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× FFFC × 0308 × 0020 × 2060 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × FFFC × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × FFFC × 0020 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× FFFC × 0308 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× FFFC × 0308 × 0020 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× FFFC × 0308 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× FFFC × 0308 × 0020 × 200B ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × FFFC ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × FFFC × 0020 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× FFFC × 0308 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× FFFC × 0308 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× FFFC ÷ 261D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× FFFC × 0020 ÷ 261D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× FFFC × 0308 ÷ 261D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 261D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× FFFC ÷ 1F3FB ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× FFFC × 0020 ÷ 1F3FB ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× FFFC × 0308 ÷ 1F3FB ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× FFFC × 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× FFFC × 0020 ÷ 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× FFFC × 0308 × 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0001 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× FFFC × 200D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× FFFC × 0020 ÷ 200D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× FFFC × 0308 × 200D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 200D ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × FFFC ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] SECTION SIGN (AI_AL) ÷ [0.3] × FFFC × 0020 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× FFFC × 0308 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] SECTION SIGN (AI_AL) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× FFFC × 0308 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] SECTION SIGN (AI_AL) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × FFFC ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] <reserved-50005> (XX_AL) ÷ [0.3] × FFFC × 0020 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× FFFC × 0308 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] <reserved-50005> (XX_AL) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× FFFC × 0308 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] <reserved-50005> (XX_AL) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 50005 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × FFFC ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × FFFC × 0020 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× FFFC × 0308 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× FFFC × 0308 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × FFFC ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × FFFC × 0020 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× FFFC × 0308 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× FFFC × 0308 × 0020 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× FFFC × 0308 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× FFFC × 0308 × 0020 ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 007D ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 007D × 0020 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 007D × 0308 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 007D × 0308 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 007D ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 007D × 0020 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 007D × 0308 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 007D × 0308 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 007D × 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 007D × 0020 ÷ 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 007D × 0308 × 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 007D × 0308 × 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 007D ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 007D × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 007D × 0308 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 007D × 0308 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 007D × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 007D × 0020 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 007D × 0308 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 007D × 0308 × 0020 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 007D × 0308 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 007D × 0308 × 0020 × 000B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 007D ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 007D × 0020 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 007D × 0308 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 007D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 007D × 0308 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 007D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 007D × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 007D × 0020 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 007D × 0308 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 007D × 0308 × 0020 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 007D × 0308 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 007D × 0308 × 0020 × 007D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 007D × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 007D × 0020 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 007D × 0308 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 007D × 0308 × 0020 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 007D × 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 007D × 0020 ÷ 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 007D × 0308 × 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 007D × 0308 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 007D × 0308 × 0020 × 0029 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 007D × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 007D × 0020 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 007D × 0308 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 007D × 0308 × 0020 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 007D × 0308 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 007D × 0308 × 0020 × 000D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 007D × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 007D × 0020 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 007D × 0308 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 007D × 0308 × 0020 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 007D × 0308 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 007D × 0308 × 0020 × 0021 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 007D × 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 007D × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 007D × 0308 × 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 007D × 0308 × 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 007D ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 007D × 0020 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 007D × 0308 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 007D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 007D × 0308 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 007D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 007D ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 007D × 0020 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 007D × 0308 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 007D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 007D × 0308 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 007D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 007D ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 007D × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 007D × 0308 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 007D × 0308 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 007D × 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 007D × 0020 ÷ 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 007D × 0308 × 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 007D × 0308 × 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 002D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 007D ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] WATCH (ID) ÷ [0.3] × 007D × 0020 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 007D × 0308 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 007D × 0308 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 231A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 007D ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 007D × 0020 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 007D × 0308 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 007D × 0308 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 007D × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.02] COMMA (IS) ÷ [0.3] × 007D × 0020 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 007D × 0308 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 007D × 0308 × 0020 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 007D × 0308 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 007D × 0308 × 0020 × 002C ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 007D ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 007D × 0020 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 007D × 0308 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 007D × 0308 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 007D ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 007D × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 007D × 0308 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 007D × 0308 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 007D ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 007D × 0020 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 007D × 0308 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 007D × 0308 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 007D × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 007D × 0020 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 007D × 0308 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 007D × 0308 × 0020 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 007D × 0308 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 007D × 0308 × 0020 × 000A ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 007D × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 007D × 0020 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 007D × 0308 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 007D × 0308 × 0020 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 007D × 0308 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 007D × 0308 × 0020 × 0085 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 007D × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 007D × 0020 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 007D × 0308 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 007D × 0308 × 0020 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 007D × 0308 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 007D × 0308 × 0020 × 17D6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 007D ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 007D × 0020 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 007D × 0308 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 007D × 0308 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 007D ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 007D × 0020 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 007D × 0308 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 007D × 0308 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 007D ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 007D × 0020 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 007D × 0308 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 007D × 0308 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 007D ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 007D × 0020 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 007D × 0308 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 007D × 0308 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 007D × 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 007D × 0020 ÷ 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 007D × 0308 × 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 007D × 0308 × 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 007D × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [0.3] × 007D × 0020 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 007D × 0308 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 007D × 0308 × 0020 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 007D × 0308 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 007D × 0308 × 0020 × 0020 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 007D × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [13.02] SOLIDUS (SY) ÷ [0.3] × 007D × 0020 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 007D × 0308 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 007D × 0308 × 0020 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 007D × 0308 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 007D × 0308 × 0020 × 002F ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 007D × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 007D × 0020 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 007D × 0308 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 007D × 0308 × 0020 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 007D × 0308 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 007D × 0308 × 0020 × 2060 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 007D × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 007D × 0020 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 007D × 0308 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 007D × 0308 × 0020 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 007D × 0308 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 007D × 0308 × 0020 × 200B ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 007D ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 007D × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 007D × 0308 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 007D × 0308 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 007D ÷ 261D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 007D × 0020 ÷ 261D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 007D × 0308 ÷ 261D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 261D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 007D ÷ 1F3FB ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 007D × 0020 ÷ 1F3FB ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 007D × 0308 ÷ 1F3FB ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 007D × 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 007D × 0020 ÷ 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 007D × 0308 × 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 007D × 200D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 007D × 0020 ÷ 200D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 007D × 0308 × 200D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 200D ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 007D ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 007D × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 007D × 0308 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 007D × 0308 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 007D ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 007D × 0020 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 007D × 0308 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 007D × 0308 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 007D ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 007D × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 007D × 0308 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 007D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 007D × 0308 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 007D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 007D × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 007D × 0020 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 007D × 0308 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 007D × 0308 × 0020 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 007D × 0308 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 007D × 0308 × 0020 × 3041 ÷ # × [0.3] RIGHT CURLY BRACKET (CL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0029 × 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] NUMBER SIGN (AL) ÷ [0.3] × 0029 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0029 × 0308 × 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] NUMBER SIGN (AL) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0029 × 0308 × 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] NUMBER SIGN (AL) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0029 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 0029 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0029 × 0308 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0029 × 0308 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0029 × 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0029 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0029 × 0308 × 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0029 × 0308 × 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0029 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 0029 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0029 × 0308 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0029 × 0308 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0029 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0029 × 0020 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0029 × 0308 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0029 × 0308 × 0020 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0029 × 0308 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0029 × 0308 × 0020 × 000B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0029 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0029 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0029 × 0308 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0029 × 0308 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0029 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0029 × 0020 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0029 × 0308 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0029 × 0308 × 0020 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0029 × 0308 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0029 × 0308 × 0020 × 007D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0029 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0029 × 0020 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0029 × 0308 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0029 × 0308 × 0020 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0029 × 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0029 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0029 × 0308 × 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0029 × 0308 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0029 × 0308 × 0020 × 0029 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0029 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0029 × 0020 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0029 × 0308 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0029 × 0308 × 0020 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0029 × 0308 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0029 × 0308 × 0020 × 000D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0029 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0029 × 0020 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0029 × 0308 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0029 × 0308 × 0020 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0029 × 0308 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0029 × 0308 × 0020 × 0021 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0029 × 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0029 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0029 × 0308 × 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0029 × 0308 × 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0029 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0029 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0029 × 0308 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0029 × 0308 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0029 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0029 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0029 × 0308 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0029 × 0308 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0029 × 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0029 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0029 × 0308 × 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0029 × 0308 × 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0029 × 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0029 × 0020 ÷ 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0029 × 0308 × 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0029 × 0308 × 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 002D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0029 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] WATCH (ID) ÷ [0.3] × 0029 × 0020 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0029 × 0308 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0029 × 0308 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 231A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0029 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 0029 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0029 × 0308 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0029 × 0308 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0029 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.02] COMMA (IS) ÷ [0.3] × 0029 × 0020 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0029 × 0308 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0029 × 0308 × 0020 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0029 × 0308 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0029 × 0308 × 0020 × 002C ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0029 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0029 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0029 × 0308 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0029 × 0308 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0029 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0029 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0029 × 0308 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0029 × 0308 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0029 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0029 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0029 × 0308 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0029 × 0308 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0029 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0029 × 0020 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0029 × 0308 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0029 × 0308 × 0020 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0029 × 0308 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0029 × 0308 × 0020 × 000A ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0029 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0029 × 0020 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0029 × 0308 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0029 × 0308 × 0020 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0029 × 0308 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0029 × 0308 × 0020 × 0085 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0029 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0029 × 0020 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0029 × 0308 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0029 × 0308 × 0020 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0029 × 0308 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0029 × 0308 × 0020 × 17D6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [16.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0029 × 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] DIGIT ZERO (NU) ÷ [0.3] × 0029 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0029 × 0308 × 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] DIGIT ZERO (NU) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0029 × 0308 × 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] DIGIT ZERO (NU) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0029 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0029 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0029 × 0308 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0029 × 0308 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0029 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 0029 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0029 × 0308 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0029 × 0308 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0029 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 0029 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0029 × 0308 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0029 × 0308 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0029 × 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0029 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0029 × 0308 × 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0029 × 0308 × 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0029 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [0.3] × 0029 × 0020 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0029 × 0308 × 0020 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0029 × 0308 × 0020 × 0020 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0029 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0029 × 0020 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0029 × 0308 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0029 × 0308 × 0020 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0029 × 0308 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0029 × 0308 × 0020 × 002F ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0029 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0029 × 0020 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0029 × 0308 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0029 × 0308 × 0020 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0029 × 0308 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0029 × 0308 × 0020 × 2060 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0029 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0029 × 0020 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0029 × 0308 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0029 × 0308 × 0020 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0029 × 0308 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0029 × 0308 × 0020 × 200B ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0029 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0029 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0029 × 0308 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0029 × 0308 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0029 ÷ 261D ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0029 × 0020 ÷ 261D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0029 × 0308 ÷ 261D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 261D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0029 ÷ 1F3FB ÷ # × [0.3] RIGHT PARENTHESIS (CP) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0029 × 0020 ÷ 1F3FB ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0029 × 0308 ÷ 1F3FB ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0029 × 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0029 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0029 × 0308 × 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0029 × 200D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0029 × 0020 ÷ 200D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0029 × 0308 × 200D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 200D ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0029 × 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] SECTION SIGN (AI_AL) ÷ [0.3] × 0029 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0029 × 0308 × 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] SECTION SIGN (AI_AL) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0029 × 0308 × 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] SECTION SIGN (AI_AL) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0029 × 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] <reserved-50005> (XX_AL) ÷ [0.3] × 0029 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0029 × 0308 × 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] <reserved-50005> (XX_AL) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0029 × 0308 × 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] <reserved-50005> (XX_AL) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0029 × 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [30.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0029 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0029 × 0308 × 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [30.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0029 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0029 × 0308 × 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0029 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0029 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0029 × 0020 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0029 × 0308 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0029 × 0308 × 0020 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0001 × 0023 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 0001 × 0020 ÷ 0023 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0001 × 0308 × 0023 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0001 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0001 × 0020 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0001 × 0308 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0001 × 0009 ÷ # × [0.3] <START OF HEADING> (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0001 × 0020 ÷ 0009 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0001 × 0308 × 0009 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0001 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0001 × 0020 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0001 × 0308 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0001 × 000B ÷ # × [0.3] <START OF HEADING> (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0001 × 0020 × 000B ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0001 × 0308 × 000B ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0001 × 0308 × 0020 × 000B ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0001 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0001 × 0020 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0001 × 0308 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0001 × 007D ÷ # × [0.3] <START OF HEADING> (CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0001 × 0020 × 007D ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0001 × 0308 × 007D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0001 × 0308 × 0020 × 007D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0001 × 0029 ÷ # × [0.3] <START OF HEADING> (CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0001 × 0020 × 0029 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0001 × 0308 × 0029 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0001 × 0308 × 0020 × 0029 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0001 × 0001 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0001 × 0020 ÷ 0001 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0001 × 0308 × 0001 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0001 × 000D ÷ # × [0.3] <START OF HEADING> (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0001 × 0020 × 000D ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0001 × 0308 × 000D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0001 × 0308 × 0020 × 000D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0001 × 0021 ÷ # × [0.3] <START OF HEADING> (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0001 × 0020 × 0021 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0001 × 0308 × 0021 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0001 × 0308 × 0020 × 0021 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0001 × 00A0 ÷ # × [0.3] <START OF HEADING> (CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3] -× 0001 × 0020 ÷ 00A0 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0001 × 0308 × 00A0 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0001 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0001 × 0020 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0001 × 0308 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0001 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0001 × 0020 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0001 × 0308 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0001 × 05D0 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0001 × 0020 ÷ 05D0 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0001 × 0308 × 05D0 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0001 × 002D ÷ # × [0.3] <START OF HEADING> (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0001 × 0020 ÷ 002D ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0001 × 0308 × 002D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0001 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0001 × 0020 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0001 × 0308 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0001 × 2024 ÷ # × [0.3] <START OF HEADING> (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 0001 × 0020 ÷ 2024 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0001 × 0308 × 2024 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0001 × 002C ÷ # × [0.3] <START OF HEADING> (CM) × [13.04] COMMA (IS) ÷ [0.3] -× 0001 × 0020 × 002C ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0001 × 0308 × 002C ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.04] COMMA (IS) ÷ [0.3] -× 0001 × 0308 × 0020 × 002C ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0001 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0001 × 0020 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0001 × 0308 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0001 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0001 × 0020 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0001 × 0308 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0001 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0001 × 0020 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0001 × 0308 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0001 × 000A ÷ # × [0.3] <START OF HEADING> (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0001 × 0020 × 000A ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0001 × 0308 × 000A ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0001 × 0308 × 0020 × 000A ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0001 × 0085 ÷ # × [0.3] <START OF HEADING> (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0001 × 0020 × 0085 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0001 × 0308 × 0085 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0001 × 0308 × 0020 × 0085 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0001 × 17D6 ÷ # × [0.3] <START OF HEADING> (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0001 × 0020 ÷ 17D6 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0001 × 0308 × 17D6 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0001 × 0030 ÷ # × [0.3] <START OF HEADING> (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 0001 × 0020 ÷ 0030 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0001 × 0308 × 0030 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0001 × 0028 ÷ # × [0.3] <START OF HEADING> (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0001 × 0020 ÷ 0028 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0001 × 0308 × 0028 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0001 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0001 × 0020 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0001 × 0308 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0001 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0001 × 0020 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0001 × 0308 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0001 × 0022 ÷ # × [0.3] <START OF HEADING> (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0001 × 0020 ÷ 0022 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0001 × 0308 × 0022 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0001 × 0020 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0001 × 0020 × 0020 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0001 × 0308 × 0020 × 0020 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0001 × 002F ÷ # × [0.3] <START OF HEADING> (CM) × [13.04] SOLIDUS (SY) ÷ [0.3] -× 0001 × 0020 × 002F ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0001 × 0308 × 002F ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [13.04] SOLIDUS (SY) ÷ [0.3] -× 0001 × 0308 × 0020 × 002F ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0001 × 2060 ÷ # × [0.3] <START OF HEADING> (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0001 × 0020 × 2060 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0001 × 0308 × 2060 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0001 × 0308 × 0020 × 2060 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0001 × 200B ÷ # × [0.3] <START OF HEADING> (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0001 × 0020 × 200B ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0001 × 0308 × 200B ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0001 × 0308 × 0020 × 200B ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0001 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0001 × 0020 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0001 × 0308 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0001 × 00A7 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0001 × 0020 ÷ 00A7 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0001 × 0308 × 00A7 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0001 × 50005 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0001 × 0020 ÷ 50005 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0001 × 0308 × 50005 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0001 × 0E01 ÷ # × [0.3] <START OF HEADING> (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0001 × 0020 ÷ 0E01 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0001 × 0308 × 0E01 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0001 × 3041 ÷ # × [0.3] <START OF HEADING> (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0001 × 0020 ÷ 3041 ÷ # × [0.3] <START OF HEADING> (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0001 × 0308 × 3041 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0001 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <START OF HEADING> (CM) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0029 × 0308 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0029 × 0308 × 0020 × 3041 ÷ # × [0.3] RIGHT PARENTHESIS (CP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [16.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 000D ÷ 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] NUMBER SIGN (AL) ÷ [0.3] × 000D ÷ 0020 ÷ 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 000D ÷ 0308 × 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 000D ÷ 0308 × 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 000D ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] EM DASH (B2) ÷ [0.3] × 000D ÷ 0020 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 000D ÷ 0308 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 000D ÷ 0308 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 000D ÷ 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <CHARACTER TABULATION> (BA) ÷ [0.3] × 000D ÷ 0020 ÷ 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 000D ÷ 0308 × 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 000D ÷ 0308 × 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 000D ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] ACUTE ACCENT (BB) ÷ [0.3] × 000D ÷ 0020 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 000D ÷ 0308 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 000D ÷ 0308 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 000D ÷ 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <LINE TABULATION> (BK) ÷ [0.3] × 000D ÷ 0020 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 000D ÷ 0308 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 000D ÷ 0308 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 000B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 000D ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 000D ÷ 0020 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 000D ÷ 0308 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 000D ÷ 0308 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 000D ÷ 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 000D ÷ 0020 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 000D ÷ 0308 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 000D ÷ 0308 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 007D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 000D ÷ 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 000D ÷ 0020 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000D ÷ 0308 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000D ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <START OF HEADING> (CM) ÷ [0.3] -× 000D ÷ 0020 ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 000D ÷ 0308 × 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 000D ÷ 0308 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 000D ÷ 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 000D ÷ 0020 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 000D ÷ 0308 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 000D ÷ 0308 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 000D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 000D ÷ 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] EXCLAMATION MARK (EX) ÷ [0.3] × 000D ÷ 0020 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 000D ÷ 0308 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 000D ÷ 0308 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 000D ÷ 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] NO-BREAK SPACE (GL) ÷ [0.3] × 000D ÷ 0020 ÷ 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 000D ÷ 0308 × 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 000D ÷ 0308 × 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 000D ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 000D ÷ 0020 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 000D ÷ 0308 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 000D ÷ 0308 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 000D ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 000D ÷ 0020 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 000D ÷ 0308 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 000D ÷ 0308 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 000D ÷ 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HEBREW LETTER ALEF (HL) ÷ [0.3] × 000D ÷ 0020 ÷ 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 000D ÷ 0308 × 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 000D ÷ 0308 × 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 000D ÷ 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HYPHEN-MINUS (HY) ÷ [0.3] × 000D ÷ 0020 ÷ 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 000D ÷ 0308 × 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 000D ÷ 0308 × 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 000D ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] WATCH (ID) ÷ [0.3] × 000D ÷ 0020 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 000D ÷ 0308 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 000D ÷ 0308 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 000D ÷ 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] ONE DOT LEADER (IN) ÷ [0.3] × 000D ÷ 0020 ÷ 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 000D ÷ 0308 × 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 000D ÷ 0308 × 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 000D ÷ 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMMA (IS) ÷ [0.3] × 000D ÷ 0020 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 000D ÷ 0308 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 000D ÷ 0308 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 002C ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 000D ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 000D ÷ 0020 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 000D ÷ 0308 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 000D ÷ 0308 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 000D ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 000D ÷ 0020 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 000D ÷ 0308 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 000D ÷ 0308 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 000D ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 000D ÷ 0020 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 000D ÷ 0308 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 000D ÷ 0308 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 000D × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) × [5.01] <LINE FEED (LF)> (LF) ÷ [0.3] × 000D ÷ 0020 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 000D ÷ 0308 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 000D ÷ 0308 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 000A ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 000D ÷ 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 000D ÷ 0020 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 000D ÷ 0308 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 000D ÷ 0308 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 000D ÷ 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 000D ÷ 0020 ÷ 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 000D ÷ 0308 × 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 000D ÷ 0308 × 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 000D ÷ 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] DIGIT ZERO (NU) ÷ [0.3] × 000D ÷ 0020 ÷ 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 000D ÷ 0308 × 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 000D ÷ 0308 × 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 000D ÷ 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] LEFT PARENTHESIS (OP) ÷ [0.3] × 000D ÷ 0020 ÷ 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 000D ÷ 0308 × 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 000D ÷ 0308 × 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 000D ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] PERCENT SIGN (PO) ÷ [0.3] × 000D ÷ 0020 ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 000D ÷ 0308 ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 000D ÷ 0308 × 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 000D ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] DOLLAR SIGN (PR) ÷ [0.3] × 000D ÷ 0020 ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 000D ÷ 0308 ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 000D ÷ 0308 × 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 000D ÷ 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] QUOTATION MARK (QU) ÷ [0.3] × 000D ÷ 0020 ÷ 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 000D ÷ 0308 × 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 000D ÷ 0308 × 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 000D ÷ 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [0.3] × 000D ÷ 0020 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 000D ÷ 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SOLIDUS (SY) ÷ [0.3] × 000D ÷ 0020 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 000D ÷ 0308 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 000D ÷ 0308 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 002F ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 000D ÷ 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] WORD JOINER (WJ) ÷ [0.3] × 000D ÷ 0020 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 000D ÷ 0308 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 000D ÷ 0308 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 000D ÷ 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 000D ÷ 0020 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 000D ÷ 0308 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 000D ÷ 0308 × 0020 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 000D ÷ 0308 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 000D ÷ 0308 × 0020 × 200B ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 000D ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 000D ÷ 0020 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 000D ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000D ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000D ÷ 261D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000D ÷ 0020 ÷ 261D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000D ÷ 0308 ÷ 261D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000D ÷ 1F3FB ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000D ÷ 0020 ÷ 1F3FB ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000D ÷ 0308 ÷ 1F3FB ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000D ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000D ÷ 0020 ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000D ÷ 0308 × 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000D ÷ 200D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000D ÷ 0020 ÷ 200D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000D ÷ 0308 × 200D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 000D ÷ 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SECTION SIGN (AI_AL) ÷ [0.3] × 000D ÷ 0020 ÷ 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 000D ÷ 0308 × 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 000D ÷ 0308 × 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 000D ÷ 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] <reserved-50005> (XX_AL) ÷ [0.3] × 000D ÷ 0020 ÷ 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 000D ÷ 0308 × 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 000D ÷ 0308 × 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 000D ÷ 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 000D ÷ 0020 ÷ 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 000D ÷ 0308 × 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 000D ÷ 0308 × 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 000D ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 000D ÷ 0020 ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 000D ÷ 0308 × 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 000D ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 000D ÷ 0308 × 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 000D ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0021 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 0021 × 0020 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0021 × 0308 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0021 × 0308 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0021 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 0021 × 0020 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0021 × 0308 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0021 × 0308 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0021 × 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0021 × 0020 ÷ 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0021 × 0308 × 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0021 × 0308 × 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0021 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 0021 × 0020 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0021 × 0308 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0021 × 0308 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0021 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0021 × 0020 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0021 × 0308 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0021 × 0308 × 0020 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0021 × 0308 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0021 × 0308 × 0020 × 000B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0021 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0021 × 0020 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0021 × 0308 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0021 × 0308 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0021 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0021 × 0020 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0021 × 0308 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0021 × 0308 × 0020 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0021 × 0308 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0021 × 0308 × 0020 × 007D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0021 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0021 × 0020 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0021 × 0308 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0021 × 0308 × 0020 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0021 × 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0021 × 0020 ÷ 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0021 × 0308 × 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0021 × 0308 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0021 × 0308 × 0020 × 0029 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0021 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0021 × 0020 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0021 × 0308 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0021 × 0308 × 0020 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0021 × 0308 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0021 × 0308 × 0020 × 000D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0021 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0021 × 0020 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0021 × 0308 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0021 × 0308 × 0020 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0021 × 0308 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0021 × 0308 × 0020 × 0021 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0021 × 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0021 × 0020 ÷ 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0021 × 0308 × 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0021 × 0308 × 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0021 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0021 × 0020 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0021 × 0308 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0021 × 0308 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0021 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0021 × 0020 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0021 × 0308 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0021 × 0308 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0021 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0021 × 0020 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0021 × 0308 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0021 × 0308 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0021 × 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0021 × 0020 ÷ 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0021 × 0308 × 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0021 × 0308 × 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 002D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0021 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] WATCH (ID) ÷ [0.3] × 0021 × 0020 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0021 × 0308 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0021 × 0308 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 231A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0021 × 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [22.02] ONE DOT LEADER (IN) ÷ [0.3] × 0021 × 0020 ÷ 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0021 × 0308 × 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [22.02] ONE DOT LEADER (IN) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0021 × 0308 × 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.02] ONE DOT LEADER (IN) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0021 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.02] COMMA (IS) ÷ [0.3] × 0021 × 0020 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0021 × 0308 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0021 × 0308 × 0020 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0021 × 0308 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0021 × 0308 × 0020 × 002C ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0021 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0021 × 0020 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0021 × 0308 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0021 × 0308 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0021 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0021 × 0020 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0021 × 0308 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0021 × 0308 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0021 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0021 × 0020 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0021 × 0308 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0021 × 0308 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0021 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0021 × 0020 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0021 × 0308 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0021 × 0308 × 0020 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0021 × 0308 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0021 × 0308 × 0020 × 000A ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0021 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0021 × 0020 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0021 × 0308 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0021 × 0308 × 0020 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0021 × 0308 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0021 × 0308 × 0020 × 0085 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0021 × 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0021 × 0020 ÷ 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0021 × 0308 × 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0021 × 0308 × 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0021 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 0021 × 0020 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0021 × 0308 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0021 × 0308 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0021 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0021 × 0020 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0021 × 0308 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0021 × 0308 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0021 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 0021 × 0020 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0021 × 0308 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0021 × 0308 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0021 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 0021 × 0020 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0021 × 0308 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0021 × 0308 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0021 × 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0021 × 0020 ÷ 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0021 × 0308 × 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0021 × 0308 × 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0021 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [0.3] × 0021 × 0020 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0021 × 0308 × 0020 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0021 × 0308 × 0020 × 0020 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0021 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0021 × 0020 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0021 × 0308 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0021 × 0308 × 0020 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0021 × 0308 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0021 × 0308 × 0020 × 002F ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0021 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0021 × 0020 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0021 × 0308 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0021 × 0308 × 0020 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0021 × 0308 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0021 × 0308 × 0020 × 2060 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0021 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0021 × 0020 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0021 × 0308 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0021 × 0308 × 0020 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0021 × 0308 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0021 × 0308 × 0020 × 200B ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0021 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0021 × 0020 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0021 × 0308 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0021 × 0308 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0021 ÷ 261D ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0021 × 0020 ÷ 261D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0021 × 0308 ÷ 261D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 261D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0021 ÷ 1F3FB ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0021 × 0020 ÷ 1F3FB ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0021 × 0308 ÷ 1F3FB ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0021 × 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0021 × 0020 ÷ 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0021 × 0308 × 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0021 × 200D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0021 × 0020 ÷ 200D ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0021 × 0308 × 200D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 200D ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0021 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0021 × 0020 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0021 × 0308 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0021 × 0308 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0021 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0021 × 0020 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0021 × 0308 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0021 × 0308 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0021 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0021 × 0020 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0021 × 0308 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0021 × 0308 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0021 × 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0021 × 0020 ÷ 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0021 × 0308 × 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0021 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0021 × 0308 × 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0021 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EXCLAMATION MARK (EX) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 00A0 × 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] NUMBER SIGN (AL) ÷ [0.3] × 00A0 × 0020 ÷ 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 00A0 × 0308 × 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] NUMBER SIGN (AL) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 00A0 × 0308 × 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] NUMBER SIGN (AL) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 00A0 × 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] EM DASH (B2) ÷ [0.3] × 00A0 × 0020 ÷ 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 00A0 × 0308 × 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] EM DASH (B2) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 00A0 × 0308 × 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] EM DASH (B2) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 00A0 × 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 00A0 × 0020 ÷ 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 00A0 × 0308 × 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 00A0 × 0308 × 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 00A0 × 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] ACUTE ACCENT (BB) ÷ [0.3] × 00A0 × 0020 ÷ 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 00A0 × 0308 × 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] ACUTE ACCENT (BB) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 00A0 × 0308 × 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] ACUTE ACCENT (BB) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 00A0 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 00A0 × 0020 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 00A0 × 0308 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 00A0 × 0308 × 0020 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 00A0 × 0308 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 00A0 × 0308 × 0020 × 000B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 00A0 × FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 00A0 × 0020 ÷ FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 00A0 × 0308 × FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 00A0 × 0308 × FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 00A0 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 00A0 × 0020 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 00A0 × 0308 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 00A0 × 0308 × 0020 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 00A0 × 0308 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 00A0 × 0308 × 0020 × 007D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 00A0 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] RIGHT PARENTHESIS (CP) ÷ [0.3] × 00A0 × 0020 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00A0 × 0308 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00A0 × 0308 × 0020 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00A0 × 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 00A0 × 0020 ÷ 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 00A0 × 0308 × 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 00A0 × 0308 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 00A0 × 0308 × 0020 × 0029 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 00A0 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 00A0 × 0020 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 00A0 × 0308 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 00A0 × 0308 × 0020 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 00A0 × 0308 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 00A0 × 0308 × 0020 × 000D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 00A0 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] EXCLAMATION MARK (EX) ÷ [0.3] × 00A0 × 0020 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 00A0 × 0308 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] EXCLAMATION MARK (EX) ÷ [0.3] -× 00A0 × 0308 × 0020 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 00A0 × 0308 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] EXCLAMATION MARK (EX) ÷ [0.3] +× 00A0 × 0308 × 0020 × 0021 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 00A0 × 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] NO-BREAK SPACE (GL) ÷ [0.3] × 00A0 × 0020 ÷ 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 00A0 × 0308 × 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 00A0 × 0308 × 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 00A0 × AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 00A0 × 0020 ÷ AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 00A0 × 0308 × AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 00A0 × 0308 × AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 00A0 × AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 00A0 × 0020 ÷ AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 00A0 × 0308 × AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 00A0 × 0308 × AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 00A0 × 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 00A0 × 0020 ÷ 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 00A0 × 0308 × 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 00A0 × 0308 × 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 00A0 × 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HYPHEN-MINUS (HY) ÷ [0.3] × 00A0 × 0020 ÷ 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 00A0 × 0308 × 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 00A0 × 0308 × 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 002D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 00A0 × 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] WATCH (ID) ÷ [0.3] × 00A0 × 0020 ÷ 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 00A0 × 0308 × 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] WATCH (ID) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 00A0 × 0308 × 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] WATCH (ID) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 231A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 00A0 × 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] ONE DOT LEADER (IN) ÷ [0.3] × 00A0 × 0020 ÷ 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 00A0 × 0308 × 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] ONE DOT LEADER (IN) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 00A0 × 0308 × 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] ONE DOT LEADER (IN) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 00A0 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] COMMA (IS) ÷ [0.3] × 00A0 × 0020 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 00A0 × 0308 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] COMMA (IS) ÷ [0.3] -× 00A0 × 0308 × 0020 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 00A0 × 0308 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] COMMA (IS) ÷ [0.3] +× 00A0 × 0308 × 0020 × 002C ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 00A0 × 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 00A0 × 0020 ÷ 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 00A0 × 0308 × 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 00A0 × 0308 × 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 00A0 × 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 00A0 × 0020 ÷ 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 00A0 × 0308 × 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 00A0 × 0308 × 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 00A0 × 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 00A0 × 0020 ÷ 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 00A0 × 0308 × 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 00A0 × 0308 × 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 00A0 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 00A0 × 0020 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 00A0 × 0308 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 00A0 × 0308 × 0020 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 00A0 × 0308 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 00A0 × 0308 × 0020 × 000A ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 00A0 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 00A0 × 0020 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 00A0 × 0308 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 00A0 × 0308 × 0020 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 00A0 × 0308 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 00A0 × 0308 × 0020 × 0085 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 00A0 × 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 00A0 × 0020 ÷ 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 00A0 × 0308 × 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 00A0 × 0308 × 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 00A0 × 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] DIGIT ZERO (NU) ÷ [0.3] × 00A0 × 0020 ÷ 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 00A0 × 0308 × 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] DIGIT ZERO (NU) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 00A0 × 0308 × 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] DIGIT ZERO (NU) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 00A0 × 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 00A0 × 0020 ÷ 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 00A0 × 0308 × 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 00A0 × 0308 × 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 00A0 × 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] PERCENT SIGN (PO) ÷ [0.3] × 00A0 × 0020 ÷ 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 00A0 × 0308 × 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] PERCENT SIGN (PO) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 00A0 × 0308 × 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] PERCENT SIGN (PO) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 00A0 × 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] DOLLAR SIGN (PR) ÷ [0.3] × 00A0 × 0020 ÷ 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 00A0 × 0308 × 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] DOLLAR SIGN (PR) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 00A0 × 0308 × 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] DOLLAR SIGN (PR) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 00A0 × 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] QUOTATION MARK (QU) ÷ [0.3] × 00A0 × 0020 ÷ 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 00A0 × 0308 × 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] QUOTATION MARK (QU) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 00A0 × 0308 × 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] QUOTATION MARK (QU) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 00A0 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [0.3] × 00A0 × 0020 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 00A0 × 0308 × 0020 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 00A0 × 0308 × 0020 × 0020 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 00A0 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] SOLIDUS (SY) ÷ [0.3] × 00A0 × 0020 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 00A0 × 0308 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] SOLIDUS (SY) ÷ [0.3] -× 00A0 × 0308 × 0020 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 00A0 × 0308 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] SOLIDUS (SY) ÷ [0.3] +× 00A0 × 0308 × 0020 × 002F ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 00A0 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 00A0 × 0020 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 00A0 × 0308 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 00A0 × 0308 × 0020 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 00A0 × 0308 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 00A0 × 0308 × 0020 × 2060 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 00A0 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 00A0 × 0020 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 00A0 × 0308 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 00A0 × 0308 × 0020 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 00A0 × 0308 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 00A0 × 0308 × 0020 × 200B ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 00A0 × 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 00A0 × 0020 ÷ 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 00A0 × 0308 × 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00A0 × 0308 × 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00A0 × 261D ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00A0 × 0020 ÷ 261D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00A0 × 0308 × 261D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 261D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00A0 × 1F3FB ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00A0 × 0020 ÷ 1F3FB ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00A0 × 0308 × 1F3FB ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00A0 × 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00A0 × 0020 ÷ 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00A0 × 0308 × 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00A0 × 200D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00A0 × 0020 ÷ 200D ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00A0 × 0308 × 200D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 200D ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 00A0 × 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] SECTION SIGN (AI_AL) ÷ [0.3] × 00A0 × 0020 ÷ 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 00A0 × 0308 × 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 00A0 × 0308 × 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 00A0 × 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] <reserved-50005> (XX_AL) ÷ [0.3] × 00A0 × 0020 ÷ 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 00A0 × 0308 × 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 00A0 × 0308 × 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 00A0 × 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 00A0 × 0020 ÷ 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 00A0 × 0308 × 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 00A0 × 0308 × 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 00A0 × 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [12.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 00A0 × 0020 ÷ 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 00A0 × 0308 × 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [12.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 00A0 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 00A0 × 0308 × 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 00A0 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] NO-BREAK SPACE (GL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × AC00 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × AC00 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× AC00 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× AC00 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × AC00 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] EM DASH (B2) ÷ [0.3] × AC00 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× AC00 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× AC00 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × AC00 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × AC00 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× AC00 × 0308 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× AC00 × 0308 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × AC00 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × AC00 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× AC00 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× AC00 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × AC00 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × AC00 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× AC00 × 0308 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× AC00 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× AC00 × 0308 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× AC00 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × AC00 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × AC00 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× AC00 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× AC00 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × AC00 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × AC00 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× AC00 × 0308 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× AC00 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× AC00 × 0308 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× AC00 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × AC00 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × AC00 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× AC00 × 0308 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× AC00 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× AC00 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× AC00 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× AC00 × 0308 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× AC00 × 0308 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× AC00 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × AC00 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × AC00 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× AC00 × 0308 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× AC00 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× AC00 × 0308 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× AC00 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × AC00 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × AC00 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× AC00 × 0308 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× AC00 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× AC00 × 0308 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× AC00 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × AC00 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × AC00 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× AC00 × 0308 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× AC00 × 0308 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × AC00 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × AC00 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× AC00 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× AC00 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × AC00 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × AC00 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× AC00 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× AC00 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × AC00 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × AC00 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× AC00 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× AC00 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × AC00 × 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × AC00 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× AC00 × 0308 × 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× AC00 × 0308 × 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × AC00 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] WATCH (ID) ÷ [0.3] × AC00 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× AC00 × 0308 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× AC00 × 0308 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × AC00 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] × AC00 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× AC00 × 0308 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× AC00 × 0308 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × AC00 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.02] COMMA (IS) ÷ [0.3] × AC00 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× AC00 × 0308 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× AC00 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× AC00 × 0308 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× AC00 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × AC00 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × AC00 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× AC00 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× AC00 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × AC00 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × AC00 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× AC00 × 0308 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× AC00 × 0308 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × AC00 × 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × AC00 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× AC00 × 0308 × 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× AC00 × 0308 × 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × AC00 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × AC00 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× AC00 × 0308 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× AC00 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× AC00 × 0308 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× AC00 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × AC00 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × AC00 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× AC00 × 0308 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× AC00 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× AC00 × 0308 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× AC00 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × AC00 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × AC00 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× AC00 × 0308 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× AC00 × 0308 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × AC00 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × AC00 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× AC00 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× AC00 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × AC00 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × AC00 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× AC00 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× AC00 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × AC00 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [27.02] PERCENT SIGN (PO) ÷ [0.3] × AC00 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× AC00 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× AC00 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × AC00 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × AC00 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× AC00 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× AC00 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × AC00 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × AC00 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× AC00 × 0308 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× AC00 × 0308 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × AC00 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [0.3] × AC00 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× AC00 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× AC00 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × AC00 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [13.02] SOLIDUS (SY) ÷ [0.3] × AC00 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× AC00 × 0308 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× AC00 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× AC00 × 0308 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× AC00 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × AC00 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [11.01] WORD JOINER (WJ) ÷ [0.3] × AC00 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× AC00 × 0308 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× AC00 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× AC00 × 0308 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× AC00 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × AC00 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × AC00 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× AC00 × 0308 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× AC00 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× AC00 × 0308 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× AC00 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × AC00 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × AC00 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× AC00 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× AC00 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× AC00 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× AC00 × 0020 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× AC00 × 0308 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× AC00 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× AC00 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× AC00 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× AC00 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× AC00 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× AC00 × 0308 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× AC00 × 200D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× AC00 × 0020 ÷ 200D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× AC00 × 0308 × 200D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × AC00 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × AC00 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× AC00 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× AC00 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × AC00 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × AC00 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× AC00 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× AC00 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × AC00 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × AC00 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× AC00 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× AC00 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × AC00 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × AC00 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× AC00 × 0308 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× AC00 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× AC00 × 0308 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× AC00 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × AC01 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × AC01 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× AC01 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× AC01 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × AC01 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] EM DASH (B2) ÷ [0.3] × AC01 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× AC01 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× AC01 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × AC01 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × AC01 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× AC01 × 0308 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× AC01 × 0308 × 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × AC01 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × AC01 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× AC01 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× AC01 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × AC01 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × AC01 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× AC01 × 0308 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× AC01 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× AC01 × 0308 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× AC01 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × AC01 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × AC01 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× AC01 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× AC01 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × AC01 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × AC01 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× AC01 × 0308 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× AC01 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× AC01 × 0308 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× AC01 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × AC01 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × AC01 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× AC01 × 0308 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× AC01 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× AC01 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× AC01 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× AC01 × 0308 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× AC01 × 0308 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× AC01 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × AC01 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × AC01 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× AC01 × 0308 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× AC01 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× AC01 × 0308 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× AC01 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × AC01 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × AC01 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× AC01 × 0308 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× AC01 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× AC01 × 0308 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× AC01 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × AC01 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × AC01 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× AC01 × 0308 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× AC01 × 0308 × 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × AC01 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × AC01 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× AC01 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× AC01 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × AC01 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × AC01 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× AC01 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× AC01 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × AC01 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × AC01 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× AC01 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× AC01 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × AC01 × 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × AC01 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× AC01 × 0308 × 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× AC01 × 0308 × 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × AC01 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] WATCH (ID) ÷ [0.3] × AC01 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× AC01 × 0308 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× AC01 × 0308 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × AC01 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] × AC01 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× AC01 × 0308 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× AC01 × 0308 × 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × AC01 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.02] COMMA (IS) ÷ [0.3] × AC01 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× AC01 × 0308 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× AC01 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× AC01 × 0308 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× AC01 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × AC01 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × AC01 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× AC01 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× AC01 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × AC01 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × AC01 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× AC01 × 0308 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× AC01 × 0308 × 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × AC01 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × AC01 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× AC01 × 0308 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× AC01 × 0308 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × AC01 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × AC01 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× AC01 × 0308 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× AC01 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× AC01 × 0308 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× AC01 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × AC01 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × AC01 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× AC01 × 0308 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× AC01 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× AC01 × 0308 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× AC01 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × AC01 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × AC01 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× AC01 × 0308 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× AC01 × 0308 × 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × AC01 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × AC01 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× AC01 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× AC01 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × AC01 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × AC01 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× AC01 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× AC01 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × AC01 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [27.02] PERCENT SIGN (PO) ÷ [0.3] × AC01 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× AC01 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× AC01 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × AC01 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × AC01 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× AC01 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× AC01 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × AC01 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × AC01 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× AC01 × 0308 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× AC01 × 0308 × 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × AC01 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [0.3] × AC01 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× AC01 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× AC01 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × AC01 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [13.02] SOLIDUS (SY) ÷ [0.3] × AC01 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× AC01 × 0308 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× AC01 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× AC01 × 0308 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× AC01 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × AC01 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [11.01] WORD JOINER (WJ) ÷ [0.3] × AC01 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× AC01 × 0308 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× AC01 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× AC01 × 0308 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× AC01 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × AC01 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × AC01 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× AC01 × 0308 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× AC01 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× AC01 × 0308 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× AC01 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × AC01 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × AC01 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× AC01 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× AC01 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× AC01 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× AC01 × 0020 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× AC01 × 0308 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× AC01 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× AC01 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× AC01 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× AC01 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× AC01 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× AC01 × 0308 × 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× AC01 × 200D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× AC01 × 0020 ÷ 200D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× AC01 × 0308 × 200D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × AC01 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × AC01 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× AC01 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× AC01 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × AC01 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × AC01 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× AC01 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× AC01 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × AC01 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × AC01 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× AC01 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× AC01 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × AC01 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × AC01 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× AC01 × 0308 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× AC01 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× AC01 × 0308 × 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× AC01 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 05D0 × 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] NUMBER SIGN (AL) ÷ [0.3] × 05D0 × 0020 ÷ 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 05D0 × 0308 × 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 05D0 × 0308 × 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 05D0 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 05D0 × 0020 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 05D0 × 0308 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 05D0 × 0308 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 05D0 × 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 05D0 × 0020 ÷ 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 05D0 × 0308 × 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 05D0 × 0308 × 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 05D0 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 05D0 × 0020 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 05D0 × 0308 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 05D0 × 0308 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 05D0 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 05D0 × 0020 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 05D0 × 0308 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 05D0 × 0308 × 0020 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 05D0 × 0308 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 05D0 × 0308 × 0020 × 000B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 05D0 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 05D0 × 0020 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 05D0 × 0308 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 05D0 × 0308 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 05D0 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 05D0 × 0020 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 05D0 × 0308 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 05D0 × 0308 × 0020 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 05D0 × 0308 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 05D0 × 0308 × 0020 × 007D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 05D0 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 05D0 × 0020 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 05D0 × 0308 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 05D0 × 0308 × 0020 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 05D0 × 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 05D0 × 0020 ÷ 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 05D0 × 0308 × 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 05D0 × 0308 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 05D0 × 0308 × 0020 × 0029 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 05D0 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 05D0 × 0020 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 05D0 × 0308 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 05D0 × 0308 × 0020 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 05D0 × 0308 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 05D0 × 0308 × 0020 × 000D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 05D0 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 05D0 × 0020 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 05D0 × 0308 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 05D0 × 0308 × 0020 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 05D0 × 0308 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 05D0 × 0308 × 0020 × 0021 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 05D0 × 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 05D0 × 0020 ÷ 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 05D0 × 0308 × 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 05D0 × 0308 × 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 05D0 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 05D0 × 0020 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 05D0 × 0308 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 05D0 × 0308 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 05D0 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 05D0 × 0020 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 05D0 × 0308 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 05D0 × 0308 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 05D0 × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 05D0 × 0020 ÷ 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 05D0 × 0308 × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 05D0 × 0308 × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 05D0 × 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 05D0 × 0020 ÷ 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 05D0 × 0308 × 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 05D0 × 0308 × 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 05D0 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] WATCH (ID) ÷ [0.3] × 05D0 × 0020 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 05D0 × 0308 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 05D0 × 0308 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 05D0 × 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] × 05D0 × 0020 ÷ 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 05D0 × 0308 × 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 05D0 × 0308 × 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 05D0 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.02] COMMA (IS) ÷ [0.3] × 05D0 × 0020 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 05D0 × 0308 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 05D0 × 0308 × 0020 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 05D0 × 0308 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 05D0 × 0308 × 0020 × 002C ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 05D0 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 05D0 × 0020 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 05D0 × 0308 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 05D0 × 0308 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 05D0 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 05D0 × 0020 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 05D0 × 0308 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 05D0 × 0308 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 05D0 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 05D0 × 0020 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 05D0 × 0308 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 05D0 × 0308 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 05D0 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 05D0 × 0020 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 05D0 × 0308 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 05D0 × 0308 × 0020 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 05D0 × 0308 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 05D0 × 0308 × 0020 × 000A ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 05D0 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 05D0 × 0020 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 05D0 × 0308 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 05D0 × 0308 × 0020 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 05D0 × 0308 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 05D0 × 0308 × 0020 × 0085 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 05D0 × 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 05D0 × 0020 ÷ 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 05D0 × 0308 × 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 05D0 × 0308 × 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 05D0 × 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [23.02] DIGIT ZERO (NU) ÷ [0.3] × 05D0 × 0020 ÷ 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 05D0 × 0308 × 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 05D0 × 0308 × 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 05D0 × 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] × 05D0 × 0020 ÷ 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 05D0 × 0308 × 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 05D0 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 05D0 × 0308 × 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 05D0 × 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [24.03] PERCENT SIGN (PO) ÷ [0.3] × 05D0 × 0020 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 05D0 × 0308 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 05D0 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 05D0 × 0308 × 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 05D0 × 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] × 05D0 × 0020 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 05D0 × 0308 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 05D0 × 0308 × 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 05D0 × 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 05D0 × 0020 ÷ 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 05D0 × 0308 × 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 05D0 × 0308 × 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 05D0 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [0.3] × 05D0 × 0020 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 05D0 × 0308 × 0020 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 05D0 × 0308 × 0020 × 0020 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 05D0 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [13.02] SOLIDUS (SY) ÷ [0.3] × 05D0 × 0020 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 05D0 × 0308 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 05D0 × 0308 × 0020 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 05D0 × 0308 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 05D0 × 0308 × 0020 × 002F ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 05D0 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 05D0 × 0020 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 05D0 × 0308 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 05D0 × 0308 × 0020 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 05D0 × 0308 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 05D0 × 0308 × 0020 × 2060 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 05D0 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 05D0 × 0020 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 05D0 × 0308 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 05D0 × 0308 × 0020 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 05D0 × 0308 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 05D0 × 0308 × 0020 × 200B ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 05D0 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 05D0 × 0020 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 05D0 × 0308 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 05D0 × 0308 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 05D0 ÷ 261D ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 05D0 × 0020 ÷ 261D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 05D0 × 0308 ÷ 261D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 05D0 ÷ 1F3FB ÷ # × [0.3] HEBREW LETTER ALEF (HL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 05D0 × 0020 ÷ 1F3FB ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 05D0 × 0308 ÷ 1F3FB ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 05D0 × 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 05D0 × 0020 ÷ 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 05D0 × 0308 × 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 05D0 × 200D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 05D0 × 0020 ÷ 200D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 05D0 × 0308 × 200D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 05D0 × 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] × 05D0 × 0020 ÷ 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 05D0 × 0308 × 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 05D0 × 0308 × 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 05D0 × 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] × 05D0 × 0020 ÷ 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 05D0 × 0308 × 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 05D0 × 0308 × 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 05D0 × 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 05D0 × 0020 ÷ 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 05D0 × 0308 × 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 05D0 × 0308 × 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 05D0 × 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 05D0 × 0020 ÷ 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 05D0 × 0308 × 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 05D0 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 05D0 × 0308 × 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 05D0 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 002D ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 002D × 0020 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 002D × 0308 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 002D × 0308 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 002D ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 002D × 0020 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 002D × 0308 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 002D × 0308 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 002D × 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 002D × 0020 ÷ 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 002D × 0308 × 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 002D × 0308 × 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 002D ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 002D × 0020 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 002D × 0308 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 002D × 0308 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 002D × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 002D × 0020 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 002D × 0308 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 002D × 0308 × 0020 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 002D × 0308 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 002D × 0308 × 0020 × 000B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 002D ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 002D × 0020 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 002D × 0308 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 002D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 002D × 0308 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 002D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 002D × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 002D × 0020 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 002D × 0308 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 002D × 0308 × 0020 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 002D × 0308 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 002D × 0308 × 0020 × 007D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 002D × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 002D × 0020 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002D × 0308 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002D × 0308 × 0020 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002D × 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 002D × 0020 ÷ 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 002D × 0308 × 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 002D × 0308 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 002D × 0308 × 0020 × 0029 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 002D × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 002D × 0020 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 002D × 0308 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 002D × 0308 × 0020 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 002D × 0308 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 002D × 0308 × 0020 × 000D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 002D × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 002D × 0020 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 002D × 0308 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 002D × 0308 × 0020 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 002D × 0308 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 002D × 0308 × 0020 × 0021 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 002D ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3] × 002D × 0020 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 002D × 0308 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 002D × 0308 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 002D ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 002D × 0020 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 002D × 0308 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 002D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 002D × 0308 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 002D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 002D ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 002D × 0020 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 002D × 0308 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 002D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 002D × 0308 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 002D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 002D ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 002D × 0020 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 002D × 0308 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 002D × 0308 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 002D × 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 002D × 0020 ÷ 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 002D × 0308 × 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 002D × 0308 × 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 002D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 002D ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] WATCH (ID) ÷ [0.3] × 002D × 0020 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 002D × 0308 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 002D × 0308 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 231A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 002D ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 002D × 0020 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 002D × 0308 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 002D × 0308 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 002D × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.02] COMMA (IS) ÷ [0.3] × 002D × 0020 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 002D × 0308 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 002D × 0308 × 0020 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 002D × 0308 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 002D × 0308 × 0020 × 002C ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 002D ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 002D × 0020 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 002D × 0308 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 002D × 0308 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 002D ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 002D × 0020 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 002D × 0308 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 002D × 0308 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 002D ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 002D × 0020 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 002D × 0308 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 002D × 0308 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 002D × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 002D × 0020 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 002D × 0308 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 002D × 0308 × 0020 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 002D × 0308 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 002D × 0308 × 0020 × 000A ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 002D × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 002D × 0020 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 002D × 0308 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 002D × 0308 × 0020 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 002D × 0308 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 002D × 0308 × 0020 × 0085 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 002D × 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 002D × 0020 ÷ 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 002D × 0308 × 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 002D × 0308 × 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 002D × 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [25.02] DIGIT ZERO (NU) ÷ [0.3] × 002D × 0020 ÷ 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 002D × 0308 × 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [25.02] DIGIT ZERO (NU) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 002D × 0308 × 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.02] DIGIT ZERO (NU) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 002D ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 002D × 0020 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 002D × 0308 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 002D × 0308 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 002D ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 002D × 0020 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 002D × 0308 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 002D × 0308 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 002D ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 002D × 0020 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 002D × 0308 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 002D × 0308 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 002D × 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 002D × 0020 ÷ 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 002D × 0308 × 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 002D × 0308 × 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 002D × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [0.3] × 002D × 0020 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 002D × 0308 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 002D × 0308 × 0020 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 002D × 0308 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 002D × 0308 × 0020 × 0020 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 002D × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [13.02] SOLIDUS (SY) ÷ [0.3] × 002D × 0020 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 002D × 0308 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 002D × 0308 × 0020 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 002D × 0308 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 002D × 0308 × 0020 × 002F ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 002D × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 002D × 0020 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 002D × 0308 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 002D × 0308 × 0020 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 002D × 0308 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 002D × 0308 × 0020 × 2060 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 002D × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 002D × 0020 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 002D × 0308 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 002D × 0308 × 0020 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 002D × 0308 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 002D × 0308 × 0020 × 200B ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 002D ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 002D × 0020 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 002D × 0308 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002D × 0308 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002D ÷ 261D ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002D × 0020 ÷ 261D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002D × 0308 ÷ 261D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 261D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002D ÷ 1F3FB ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002D × 0020 ÷ 1F3FB ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002D × 0308 ÷ 1F3FB ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002D × 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002D × 0020 ÷ 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002D × 0308 × 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002D × 200D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002D × 0020 ÷ 200D ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002D × 0308 × 200D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 200D ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 002D ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 002D × 0020 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 002D × 0308 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 002D × 0308 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 002D ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 002D × 0020 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 002D × 0308 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 002D × 0308 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 002D ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 002D × 0020 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 002D × 0308 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 002D × 0308 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 002D × 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 002D × 0020 ÷ 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 002D × 0308 × 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 002D × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 002D × 0308 × 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 002D × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HYPHEN-MINUS (HY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 231A ÷ 0023 ÷ # × [0.3] WATCH (ID) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 231A × 0020 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 231A × 0308 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 231A × 0308 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 231A ÷ 2014 ÷ # × [0.3] WATCH (ID) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 231A × 0020 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 231A × 0308 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 231A × 0308 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 231A × 0009 ÷ # × [0.3] WATCH (ID) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 231A × 0020 ÷ 0009 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 231A × 0308 × 0009 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 231A × 0308 × 0009 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 231A ÷ 00B4 ÷ # × [0.3] WATCH (ID) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 231A × 0020 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 231A × 0308 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 231A × 0308 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 231A × 000B ÷ # × [0.3] WATCH (ID) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 231A × 0020 × 000B ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 231A × 0308 × 000B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 231A × 0308 × 0020 × 000B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 231A × 0308 × 000B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 231A × 0308 × 0020 × 000B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 231A ÷ FFFC ÷ # × [0.3] WATCH (ID) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 231A × 0020 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 231A × 0308 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 231A × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 231A × 0308 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 231A × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 231A × 007D ÷ # × [0.3] WATCH (ID) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 231A × 0020 × 007D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 231A × 0308 × 007D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 231A × 0308 × 0020 × 007D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 231A × 0308 × 007D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 231A × 0308 × 0020 × 007D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 231A × 0029 ÷ # × [0.3] WATCH (ID) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 231A × 0020 × 0029 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 231A × 0308 × 0029 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 231A × 0308 × 0020 × 0029 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 231A × 0001 ÷ # × [0.3] WATCH (ID) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 231A × 0020 ÷ 0001 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 231A × 0308 × 0001 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 231A × 0308 × 0029 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 231A × 0308 × 0020 × 0029 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 231A × 000D ÷ # × [0.3] WATCH (ID) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 231A × 0020 × 000D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 231A × 0308 × 000D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 231A × 0308 × 0020 × 000D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 231A × 0308 × 000D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 231A × 0308 × 0020 × 000D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 231A × 0021 ÷ # × [0.3] WATCH (ID) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 231A × 0020 × 0021 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 231A × 0308 × 0021 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 231A × 0308 × 0020 × 0021 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 231A × 0308 × 0021 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 231A × 0308 × 0020 × 0021 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 231A × 00A0 ÷ # × [0.3] WATCH (ID) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 231A × 0020 ÷ 00A0 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 231A × 0308 × 00A0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 231A × 0308 × 00A0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 231A ÷ AC00 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 231A × 0020 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 231A × 0308 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 231A × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 231A × 0308 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 231A × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 231A ÷ AC01 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 231A × 0020 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 231A × 0308 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 231A × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 231A × 0308 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 231A × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 231A ÷ 05D0 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 231A × 0020 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 231A × 0308 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 231A × 0308 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 231A × 002D ÷ # × [0.3] WATCH (ID) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 231A × 0020 ÷ 002D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 231A × 0308 × 002D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 002D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 231A × 0308 × 002D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 002D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 231A ÷ 231A ÷ # × [0.3] WATCH (ID) ÷ [999.0] WATCH (ID) ÷ [0.3] × 231A × 0020 ÷ 231A ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 231A × 0308 ÷ 231A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 231A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 231A × 0308 ÷ 231A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 231A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 231A × 2024 ÷ # × [0.3] WATCH (ID) × [22.03] ONE DOT LEADER (IN) ÷ [0.3] × 231A × 0020 ÷ 2024 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 231A × 0308 × 2024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 231A × 0308 × 2024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 231A × 002C ÷ # × [0.3] WATCH (ID) × [13.02] COMMA (IS) ÷ [0.3] × 231A × 0020 × 002C ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 231A × 0308 × 002C ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 231A × 0308 × 0020 × 002C ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 231A × 0308 × 002C ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 231A × 0308 × 0020 × 002C ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 231A ÷ 1100 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 231A × 0020 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 231A × 0308 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 231A × 0308 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 231A ÷ 11A8 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 231A × 0020 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 231A × 0308 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 231A × 0308 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 231A ÷ 1160 ÷ # × [0.3] WATCH (ID) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 231A × 0020 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 231A × 0308 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 231A × 0308 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 231A × 000A ÷ # × [0.3] WATCH (ID) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 231A × 0020 × 000A ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 231A × 0308 × 000A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 231A × 0308 × 0020 × 000A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 231A × 0308 × 000A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 231A × 0308 × 0020 × 000A ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 231A × 0085 ÷ # × [0.3] WATCH (ID) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 231A × 0020 × 0085 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 231A × 0308 × 0085 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 231A × 0308 × 0020 × 0085 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 231A × 0308 × 0085 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 231A × 0308 × 0020 × 0085 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 231A × 17D6 ÷ # × [0.3] WATCH (ID) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 231A × 0020 ÷ 17D6 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 231A × 0308 × 17D6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 231A × 0308 × 17D6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 231A ÷ 0030 ÷ # × [0.3] WATCH (ID) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 231A × 0020 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 231A × 0308 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 231A × 0308 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 231A ÷ 0028 ÷ # × [0.3] WATCH (ID) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 231A × 0020 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 231A × 0308 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 231A × 0025 ÷ # × [0.3] WATCH (ID) × [23.01] PERCENT SIGN (PO) ÷ [0.3] +× 231A × 0308 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 231A × 0025 ÷ # × [0.3] WATCH (ID) × [23.13] PERCENT SIGN (PO) ÷ [0.3] × 231A × 0020 ÷ 0025 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 231A × 0308 × 0025 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [23.01] PERCENT SIGN (PO) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 231A × 0308 × 0025 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.13] PERCENT SIGN (PO) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 231A ÷ 0024 ÷ # × [0.3] WATCH (ID) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 231A × 0020 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 231A × 0308 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 231A × 0308 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 231A × 0022 ÷ # × [0.3] WATCH (ID) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 231A × 0020 ÷ 0022 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 231A × 0308 × 0022 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 231A × 0308 × 0022 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 231A × 0020 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [0.3] × 231A × 0020 × 0020 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 231A × 0308 × 0020 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 231A × 0308 × 0020 × 0020 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 231A × 0308 × 0020 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 231A × 0308 × 0020 × 0020 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 231A × 002F ÷ # × [0.3] WATCH (ID) × [13.02] SOLIDUS (SY) ÷ [0.3] × 231A × 0020 × 002F ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 231A × 0308 × 002F ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 231A × 0308 × 0020 × 002F ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 231A × 0308 × 002F ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 231A × 0308 × 0020 × 002F ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 231A × 2060 ÷ # × [0.3] WATCH (ID) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 231A × 0020 × 2060 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 231A × 0308 × 2060 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 231A × 0308 × 0020 × 2060 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 231A × 0308 × 2060 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 231A × 0308 × 0020 × 2060 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 231A × 200B ÷ # × [0.3] WATCH (ID) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 231A × 0020 × 200B ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 231A × 0308 × 200B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 231A × 0308 × 0020 × 200B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 231A × 0308 × 200B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 231A × 0308 × 0020 × 200B ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 231A ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 231A × 0020 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 231A × 0308 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 231A × 0308 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 231A ÷ 261D ÷ # × [0.3] WATCH (ID) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 231A × 0020 ÷ 261D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 231A × 0308 ÷ 261D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 261D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 231A ÷ 1F3FB ÷ # × [0.3] WATCH (ID) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 231A × 0020 ÷ 1F3FB ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 231A × 0308 ÷ 1F3FB ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 231A × 0001 ÷ # × [0.3] WATCH (ID) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 231A × 0020 ÷ 0001 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 231A × 0308 × 0001 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 231A × 200D ÷ # × [0.3] WATCH (ID) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 231A × 0020 ÷ 200D ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 231A × 0308 × 200D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 200D ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 231A ÷ 00A7 ÷ # × [0.3] WATCH (ID) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 231A × 0020 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 231A × 0308 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 231A × 0308 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 231A ÷ 50005 ÷ # × [0.3] WATCH (ID) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 231A × 0020 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 231A × 0308 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 231A × 0308 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 231A ÷ 0E01 ÷ # × [0.3] WATCH (ID) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 231A × 0020 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 231A × 0308 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 231A × 0308 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 231A × 3041 ÷ # × [0.3] WATCH (ID) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 231A × 0020 ÷ 3041 ÷ # × [0.3] WATCH (ID) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 231A × 0308 × 3041 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 231A × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 231A × 0308 × 3041 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 231A × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WATCH (ID) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 2024 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 2024 × 0020 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 2024 × 0308 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 2024 × 0308 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 2024 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 2024 × 0020 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 2024 × 0308 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 2024 × 0308 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 2024 × 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 2024 × 0020 ÷ 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 2024 × 0308 × 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 2024 × 0308 × 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 2024 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 2024 × 0020 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 2024 × 0308 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 2024 × 0308 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 2024 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 2024 × 0020 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 2024 × 0308 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 2024 × 0308 × 0020 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 2024 × 0308 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 2024 × 0308 × 0020 × 000B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 2024 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 2024 × 0020 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 2024 × 0308 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 2024 × 0308 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 2024 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 2024 × 0020 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 2024 × 0308 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 2024 × 0308 × 0020 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 2024 × 0308 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 2024 × 0308 × 0020 × 007D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 2024 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 2024 × 0020 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2024 × 0308 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2024 × 0308 × 0020 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2024 × 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 2024 × 0020 ÷ 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 2024 × 0308 × 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 2024 × 0308 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 2024 × 0308 × 0020 × 0029 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 2024 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 2024 × 0020 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 2024 × 0308 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 2024 × 0308 × 0020 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 2024 × 0308 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 2024 × 0308 × 0020 × 000D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 2024 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 2024 × 0020 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 2024 × 0308 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 2024 × 0308 × 0020 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 2024 × 0308 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 2024 × 0308 × 0020 × 0021 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 2024 × 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 2024 × 0020 ÷ 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 2024 × 0308 × 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 2024 × 0308 × 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 2024 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 2024 × 0020 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 2024 × 0308 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 2024 × 0308 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 2024 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 2024 × 0020 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 2024 × 0308 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 2024 × 0308 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 2024 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 2024 × 0020 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 2024 × 0308 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 2024 × 0308 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 2024 × 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 2024 × 0020 ÷ 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 2024 × 0308 × 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 2024 × 0308 × 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 002D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 2024 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] WATCH (ID) ÷ [0.3] × 2024 × 0020 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 2024 × 0308 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 2024 × 0308 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 231A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 2024 × 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [22.04] ONE DOT LEADER (IN) ÷ [0.3] × 2024 × 0020 ÷ 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 2024 × 0308 × 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [22.04] ONE DOT LEADER (IN) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 2024 × 0308 × 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.04] ONE DOT LEADER (IN) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 2024 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [13.02] COMMA (IS) ÷ [0.3] × 2024 × 0020 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 2024 × 0308 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 2024 × 0308 × 0020 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 2024 × 0308 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 2024 × 0308 × 0020 × 002C ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 2024 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 2024 × 0020 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 2024 × 0308 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 2024 × 0308 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 2024 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 2024 × 0020 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 2024 × 0308 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 2024 × 0308 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 2024 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 2024 × 0020 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 2024 × 0308 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 2024 × 0308 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 2024 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 2024 × 0020 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 2024 × 0308 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 2024 × 0308 × 0020 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 2024 × 0308 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 2024 × 0308 × 0020 × 000A ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 2024 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 2024 × 0020 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 2024 × 0308 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 2024 × 0308 × 0020 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 2024 × 0308 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 2024 × 0308 × 0020 × 0085 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 2024 × 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 2024 × 0020 ÷ 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 2024 × 0308 × 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 2024 × 0308 × 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 2024 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 2024 × 0020 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 2024 × 0308 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 2024 × 0308 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 2024 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 2024 × 0020 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 2024 × 0308 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 2024 × 0308 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 2024 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 2024 × 0020 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 2024 × 0308 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 2024 × 0308 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 2024 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 2024 × 0020 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 2024 × 0308 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 2024 × 0308 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 2024 × 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 2024 × 0020 ÷ 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 2024 × 0308 × 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 2024 × 0308 × 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 2024 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [0.3] × 2024 × 0020 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 2024 × 0308 × 0020 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 2024 × 0308 × 0020 × 0020 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 2024 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [13.02] SOLIDUS (SY) ÷ [0.3] × 2024 × 0020 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 2024 × 0308 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 2024 × 0308 × 0020 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 2024 × 0308 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 2024 × 0308 × 0020 × 002F ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 2024 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 2024 × 0020 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 2024 × 0308 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 2024 × 0308 × 0020 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 2024 × 0308 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 2024 × 0308 × 0020 × 2060 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 2024 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 2024 × 0020 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 2024 × 0308 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 2024 × 0308 × 0020 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 2024 × 0308 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 2024 × 0308 × 0020 × 200B ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 2024 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 2024 × 0020 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 2024 × 0308 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2024 × 0308 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2024 ÷ 261D ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2024 × 0020 ÷ 261D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2024 × 0308 ÷ 261D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 261D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2024 ÷ 1F3FB ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2024 × 0020 ÷ 1F3FB ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2024 × 0308 ÷ 1F3FB ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2024 × 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2024 × 0020 ÷ 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2024 × 0308 × 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2024 × 200D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2024 × 0020 ÷ 200D ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2024 × 0308 × 200D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 200D ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 2024 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 2024 × 0020 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 2024 × 0308 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 2024 × 0308 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 2024 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 2024 × 0020 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 2024 × 0308 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 2024 × 0308 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 2024 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 2024 × 0020 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 2024 × 0308 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 2024 × 0308 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 2024 × 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 2024 × 0020 ÷ 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 2024 × 0308 × 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 2024 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 2024 × 0308 × 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 2024 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ONE DOT LEADER (IN) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 002C × 0023 ÷ # × [0.3] COMMA (IS) × [29.0] NUMBER SIGN (AL) ÷ [0.3] × 002C × 0020 ÷ 0023 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 002C × 0308 × 0023 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] NUMBER SIGN (AL) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0023 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 002C × 0308 × 0023 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] NUMBER SIGN (AL) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0023 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 002C ÷ 2014 ÷ # × [0.3] COMMA (IS) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 002C × 0020 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 002C × 0308 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 002C × 0308 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 2014 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 002C × 0009 ÷ # × [0.3] COMMA (IS) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 002C × 0020 ÷ 0009 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 002C × 0308 × 0009 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0009 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 002C × 0308 × 0009 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0009 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 002C ÷ 00B4 ÷ # × [0.3] COMMA (IS) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 002C × 0020 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 002C × 0308 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 002C × 0308 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 002C × 000B ÷ # × [0.3] COMMA (IS) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 002C × 0020 × 000B ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 002C × 0308 × 000B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 002C × 0308 × 0020 × 000B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 002C × 0308 × 000B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 002C × 0308 × 0020 × 000B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 002C ÷ FFFC ÷ # × [0.3] COMMA (IS) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 002C × 0020 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 002C × 0308 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 002C × 0308 × 0020 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 002C × 0308 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 002C × 0308 × 0020 ÷ FFFC ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 002C × 007D ÷ # × [0.3] COMMA (IS) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 002C × 0020 × 007D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 002C × 0308 × 007D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 002C × 0308 × 0020 × 007D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 002C × 0308 × 007D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 002C × 0308 × 0020 × 007D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 002C × 0029 ÷ # × [0.3] COMMA (IS) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 002C × 0020 × 0029 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002C × 0308 × 0029 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002C × 0308 × 0020 × 0029 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002C × 0001 ÷ # × [0.3] COMMA (IS) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 002C × 0020 ÷ 0001 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 002C × 0308 × 0001 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0001 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 002C × 0308 × 0029 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 002C × 0308 × 0020 × 0029 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 002C × 000D ÷ # × [0.3] COMMA (IS) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 002C × 0020 × 000D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 002C × 0308 × 000D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 002C × 0308 × 0020 × 000D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 002C × 0308 × 000D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 002C × 0308 × 0020 × 000D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 002C × 0021 ÷ # × [0.3] COMMA (IS) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 002C × 0020 × 0021 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 002C × 0308 × 0021 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 002C × 0308 × 0020 × 0021 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 002C × 0308 × 0021 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 002C × 0308 × 0020 × 0021 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 002C × 00A0 ÷ # × [0.3] COMMA (IS) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 002C × 0020 ÷ 00A0 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 002C × 0308 × 00A0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 002C × 0308 × 00A0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 002C ÷ AC00 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 002C × 0020 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 002C × 0308 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 002C × 0308 × 0020 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 002C × 0308 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 002C × 0308 × 0020 ÷ AC00 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 002C ÷ AC01 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 002C × 0020 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 002C × 0308 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 002C × 0308 × 0020 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 002C × 0308 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 002C × 0308 × 0020 ÷ AC01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 002C × 05D0 ÷ # × [0.3] COMMA (IS) × [29.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 002C × 0020 ÷ 05D0 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 002C × 0308 × 05D0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 002C × 0308 × 05D0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 002C × 002D ÷ # × [0.3] COMMA (IS) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 002C × 0020 ÷ 002D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 002C × 0308 × 002D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 002D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 002C × 0308 × 002D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 002D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 002C ÷ 231A ÷ # × [0.3] COMMA (IS) ÷ [999.0] WATCH (ID) ÷ [0.3] × 002C × 0020 ÷ 231A ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 002C × 0308 ÷ 231A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 231A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 002C × 0308 ÷ 231A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 231A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 002C ÷ 2024 ÷ # × [0.3] COMMA (IS) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 002C × 0020 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 002C × 0308 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 002C × 0308 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 2024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 002C × 002C ÷ # × [0.3] COMMA (IS) × [13.02] COMMA (IS) ÷ [0.3] × 002C × 0020 × 002C ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 002C × 0308 × 002C ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 002C × 0308 × 0020 × 002C ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 002C × 0308 × 002C ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 002C × 0308 × 0020 × 002C ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 002C ÷ 1100 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 002C × 0020 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 002C × 0308 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 002C × 0308 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 1100 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 002C ÷ 11A8 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 002C × 0020 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 002C × 0308 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 002C × 0308 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 002C ÷ 1160 ÷ # × [0.3] COMMA (IS) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 002C × 0020 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 002C × 0308 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 002C × 0308 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 1160 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 002C × 000A ÷ # × [0.3] COMMA (IS) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 002C × 0020 × 000A ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 002C × 0308 × 000A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 002C × 0308 × 0020 × 000A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 002C × 0308 × 000A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 002C × 0308 × 0020 × 000A ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 002C × 0085 ÷ # × [0.3] COMMA (IS) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 002C × 0020 × 0085 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 002C × 0308 × 0085 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 002C × 0308 × 0020 × 0085 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 002C × 0308 × 0085 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 002C × 0308 × 0020 × 0085 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 002C × 17D6 ÷ # × [0.3] COMMA (IS) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 002C × 0020 ÷ 17D6 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 002C × 0308 × 17D6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 002C × 0308 × 17D6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 002C ÷ 0030 ÷ # × [0.3] COMMA (IS) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 002C × 0020 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 002C × 0308 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 002C × 0308 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0030 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 002C ÷ 0028 ÷ # × [0.3] COMMA (IS) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 002C × 0020 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 002C × 0308 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 002C × 0308 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0028 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 002C ÷ 0025 ÷ # × [0.3] COMMA (IS) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 002C × 0020 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 002C × 0308 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 002C × 0308 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0025 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 002C ÷ 0024 ÷ # × [0.3] COMMA (IS) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 002C × 0020 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 002C × 0308 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 002C × 0308 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0024 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 002C × 0022 ÷ # × [0.3] COMMA (IS) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 002C × 0020 ÷ 0022 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 002C × 0308 × 0022 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0022 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 002C × 0308 × 0022 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0022 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 002C × 0020 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [0.3] × 002C × 0020 × 0020 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 002C × 0308 × 0020 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 002C × 0308 × 0020 × 0020 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 002C × 0308 × 0020 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 002C × 0308 × 0020 × 0020 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 002C × 002F ÷ # × [0.3] COMMA (IS) × [13.02] SOLIDUS (SY) ÷ [0.3] × 002C × 0020 × 002F ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 002C × 0308 × 002F ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 002C × 0308 × 0020 × 002F ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 002C × 0308 × 002F ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 002C × 0308 × 0020 × 002F ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 002C × 2060 ÷ # × [0.3] COMMA (IS) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 002C × 0020 × 2060 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 002C × 0308 × 2060 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 002C × 0308 × 0020 × 2060 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 002C × 0308 × 2060 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 002C × 0308 × 0020 × 2060 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 002C × 200B ÷ # × [0.3] COMMA (IS) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 002C × 0020 × 200B ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 002C × 0308 × 200B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 002C × 0308 × 0020 × 200B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 002C × 0308 × 200B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 002C × 0308 × 0020 × 200B ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 002C ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 002C × 0020 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 002C × 0308 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002C × 0308 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002C ÷ 261D ÷ # × [0.3] COMMA (IS) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002C × 0020 ÷ 261D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002C × 0308 ÷ 261D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 261D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002C ÷ 1F3FB ÷ # × [0.3] COMMA (IS) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002C × 0020 ÷ 1F3FB ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002C × 0308 ÷ 1F3FB ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002C × 0001 ÷ # × [0.3] COMMA (IS) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002C × 0020 ÷ 0001 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002C × 0308 × 0001 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0001 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002C × 200D ÷ # × [0.3] COMMA (IS) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002C × 0020 ÷ 200D ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002C × 0308 × 200D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 200D ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 002C × 00A7 ÷ # × [0.3] COMMA (IS) × [29.0] SECTION SIGN (AI_AL) ÷ [0.3] × 002C × 0020 ÷ 00A7 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 002C × 0308 × 00A7 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 002C × 0308 × 00A7 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 002C × 50005 ÷ # × [0.3] COMMA (IS) × [29.0] <reserved-50005> (XX_AL) ÷ [0.3] × 002C × 0020 ÷ 50005 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 002C × 0308 × 50005 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 50005 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 002C × 0308 × 50005 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 50005 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 002C × 0E01 ÷ # × [0.3] COMMA (IS) × [29.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 002C × 0020 ÷ 0E01 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 002C × 0308 × 0E01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [29.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 002C × 0308 × 0E01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [29.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 002C × 3041 ÷ # × [0.3] COMMA (IS) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 002C × 0020 ÷ 3041 ÷ # × [0.3] COMMA (IS) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 002C × 0308 × 3041 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 002C × 0308 × 0020 ÷ 3041 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 002C × 0308 × 3041 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 002C × 0308 × 0020 ÷ 3041 ÷ # × [0.3] COMMA (IS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 1100 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 1100 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 1100 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 1100 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 1100 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 1100 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 1100 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 1100 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 1100 × 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 1100 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 1100 × 0308 × 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1100 × 0308 × 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 1100 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 1100 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 1100 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1100 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 1100 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 1100 × 0020 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 1100 × 0308 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 1100 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1100 × 0308 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1100 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 1100 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 1100 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 1100 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1100 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 1100 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 1100 × 0020 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 1100 × 0308 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 1100 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1100 × 0308 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1100 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 1100 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 1100 × 0020 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1100 × 0308 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1100 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1100 × 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 1100 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 1100 × 0308 × 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 1100 × 0308 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 1100 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 1100 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 1100 × 0020 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 1100 × 0308 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 1100 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1100 × 0308 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1100 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 1100 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 1100 × 0020 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 1100 × 0308 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 1100 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1100 × 0308 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1100 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 1100 × 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 1100 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 1100 × 0308 × 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 1100 × 0308 × 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 1100 × AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 1100 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 1100 × 0308 × AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [26.01] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1100 × 0308 × AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.01] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 1100 × AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 1100 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 1100 × 0308 × AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [26.01] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1100 × 0308 × AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.01] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 1100 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 1100 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 1100 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1100 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 1100 × 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 1100 × 0020 ÷ 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 1100 × 0308 × 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 1100 × 0308 × 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 1100 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] WATCH (ID) ÷ [0.3] × 1100 × 0020 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 1100 × 0308 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 1100 × 0308 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 1100 × 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] × 1100 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 1100 × 0308 × 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 1100 × 0308 × 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 1100 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.02] COMMA (IS) ÷ [0.3] × 1100 × 0020 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 1100 × 0308 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 1100 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 1100 × 0308 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 1100 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 1100 × 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 1100 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 1100 × 0308 × 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [26.01] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1100 × 0308 × 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.01] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 1100 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 1100 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 1100 × 0308 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1100 × 0308 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 1100 × 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 1100 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 1100 × 0308 × 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [26.01] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1100 × 0308 × 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.01] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 1100 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 1100 × 0020 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 1100 × 0308 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 1100 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1100 × 0308 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1100 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 1100 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 1100 × 0020 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 1100 × 0308 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 1100 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1100 × 0308 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1100 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 1100 × 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 1100 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 1100 × 0308 × 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1100 × 0308 × 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 1100 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 1100 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 1100 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 1100 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 1100 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 1100 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 1100 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1100 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 1100 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [27.02] PERCENT SIGN (PO) ÷ [0.3] × 1100 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 1100 × 0308 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 1100 × 0308 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 1100 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 1100 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 1100 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1100 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 1100 × 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 1100 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 1100 × 0308 × 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 1100 × 0308 × 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 1100 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [0.3] × 1100 × 0020 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 1100 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 1100 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 1100 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [13.02] SOLIDUS (SY) ÷ [0.3] × 1100 × 0020 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 1100 × 0308 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 1100 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 1100 × 0308 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 1100 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 1100 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 1100 × 0020 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 1100 × 0308 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 1100 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1100 × 0308 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1100 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 1100 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 1100 × 0020 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 1100 × 0308 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 1100 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1100 × 0308 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1100 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 1100 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 1100 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 1100 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1100 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1100 ÷ 261D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1100 × 0020 ÷ 261D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1100 × 0308 ÷ 261D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1100 ÷ 1F3FB ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1100 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1100 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1100 × 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1100 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1100 × 0308 × 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1100 × 200D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1100 × 0020 ÷ 200D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1100 × 0308 × 200D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 1100 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 1100 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 1100 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1100 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 1100 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 1100 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 1100 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1100 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 1100 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 1100 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 1100 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1100 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 1100 × 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 1100 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 1100 × 0308 × 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 1100 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1100 × 0308 × 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1100 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 11A8 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 11A8 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 11A8 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 11A8 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 11A8 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 11A8 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 11A8 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 11A8 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 11A8 × 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 11A8 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 11A8 × 0308 × 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 11A8 × 0308 × 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 11A8 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 11A8 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 11A8 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 11A8 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 11A8 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 11A8 × 0020 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 11A8 × 0308 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 11A8 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 11A8 × 0308 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 11A8 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 11A8 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 11A8 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 11A8 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 11A8 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 11A8 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 11A8 × 0020 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 11A8 × 0308 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 11A8 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 11A8 × 0308 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 11A8 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 11A8 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 11A8 × 0020 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 11A8 × 0308 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 11A8 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 11A8 × 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 11A8 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 11A8 × 0308 × 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 11A8 × 0308 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 11A8 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 11A8 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 11A8 × 0020 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 11A8 × 0308 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 11A8 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 11A8 × 0308 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 11A8 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 11A8 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 11A8 × 0020 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 11A8 × 0308 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 11A8 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 11A8 × 0308 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 11A8 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 11A8 × 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 11A8 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 11A8 × 0308 × 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 11A8 × 0308 × 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 11A8 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 11A8 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 11A8 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 11A8 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 11A8 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 11A8 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 11A8 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 11A8 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 11A8 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 11A8 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 11A8 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 11A8 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 11A8 × 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 11A8 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 11A8 × 0308 × 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 11A8 × 0308 × 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 11A8 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] WATCH (ID) ÷ [0.3] × 11A8 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 11A8 × 0308 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 11A8 × 0308 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 11A8 × 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] × 11A8 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 11A8 × 0308 × 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 11A8 × 0308 × 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 11A8 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.02] COMMA (IS) ÷ [0.3] × 11A8 × 0020 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 11A8 × 0308 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 11A8 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 11A8 × 0308 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 11A8 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 11A8 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 11A8 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 11A8 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 11A8 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 11A8 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 11A8 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 11A8 × 0308 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 11A8 × 0308 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 11A8 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 11A8 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 11A8 × 0308 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 11A8 × 0308 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 11A8 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 11A8 × 0020 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 11A8 × 0308 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 11A8 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 11A8 × 0308 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 11A8 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 11A8 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 11A8 × 0020 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 11A8 × 0308 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 11A8 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 11A8 × 0308 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 11A8 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 11A8 × 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 11A8 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 11A8 × 0308 × 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 11A8 × 0308 × 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 11A8 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 11A8 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 11A8 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 11A8 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 11A8 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 11A8 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 11A8 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 11A8 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 11A8 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [27.02] PERCENT SIGN (PO) ÷ [0.3] × 11A8 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 11A8 × 0308 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 11A8 × 0308 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 11A8 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 11A8 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 11A8 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 11A8 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 11A8 × 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 11A8 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 11A8 × 0308 × 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 11A8 × 0308 × 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 11A8 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [0.3] × 11A8 × 0020 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 11A8 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 11A8 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 11A8 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [13.02] SOLIDUS (SY) ÷ [0.3] × 11A8 × 0020 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 11A8 × 0308 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 11A8 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 11A8 × 0308 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 11A8 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 11A8 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 11A8 × 0020 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 11A8 × 0308 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 11A8 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 11A8 × 0308 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 11A8 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 11A8 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 11A8 × 0020 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 11A8 × 0308 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 11A8 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 11A8 × 0308 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 11A8 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 11A8 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 11A8 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 11A8 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 11A8 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 11A8 ÷ 261D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 11A8 × 0020 ÷ 261D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 11A8 × 0308 ÷ 261D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 11A8 ÷ 1F3FB ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 11A8 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 11A8 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 11A8 × 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 11A8 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 11A8 × 0308 × 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 11A8 × 200D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 11A8 × 0020 ÷ 200D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 11A8 × 0308 × 200D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 11A8 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 11A8 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 11A8 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 11A8 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 11A8 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 11A8 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 11A8 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 11A8 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 11A8 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 11A8 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 11A8 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 11A8 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 11A8 × 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 11A8 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 11A8 × 0308 × 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 11A8 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 11A8 × 0308 × 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 11A8 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 1160 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 1160 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 1160 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 1160 × 0308 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 1160 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 1160 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 1160 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 1160 × 0308 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 1160 × 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 1160 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 1160 × 0308 × 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1160 × 0308 × 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 1160 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 1160 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 1160 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1160 × 0308 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 1160 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 1160 × 0020 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 1160 × 0308 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 1160 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1160 × 0308 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1160 × 0308 × 0020 × 000B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 1160 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 1160 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 1160 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1160 × 0308 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 1160 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 1160 × 0020 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 1160 × 0308 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 1160 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1160 × 0308 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1160 × 0308 × 0020 × 007D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 1160 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 1160 × 0020 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1160 × 0308 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1160 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1160 × 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 1160 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 1160 × 0308 × 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 1160 × 0308 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 1160 × 0308 × 0020 × 0029 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 1160 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 1160 × 0020 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 1160 × 0308 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 1160 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1160 × 0308 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1160 × 0308 × 0020 × 000D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 1160 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 1160 × 0020 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 1160 × 0308 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 1160 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1160 × 0308 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1160 × 0308 × 0020 × 0021 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 1160 × 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 1160 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 1160 × 0308 × 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 1160 × 0308 × 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 1160 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 1160 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 1160 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1160 × 0308 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 1160 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 1160 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 1160 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1160 × 0308 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 1160 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 1160 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 1160 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1160 × 0308 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 1160 × 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 1160 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 1160 × 0308 × 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 1160 × 0308 × 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 1160 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] WATCH (ID) ÷ [0.3] × 1160 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 1160 × 0308 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 1160 × 0308 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 1160 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] × 1160 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 1160 × 0308 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 1160 × 0308 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 1160 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.02] COMMA (IS) ÷ [0.3] × 1160 × 0020 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 1160 × 0308 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 1160 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 1160 × 0308 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 1160 × 0308 × 0020 × 002C ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 1160 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 1160 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 1160 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1160 × 0308 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 1160 × 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 1160 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 1160 × 0308 × 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1160 × 0308 × 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 1160 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 1160 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 1160 × 0308 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1160 × 0308 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 1160 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 1160 × 0020 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 1160 × 0308 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 1160 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1160 × 0308 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1160 × 0308 × 0020 × 000A ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 1160 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 1160 × 0020 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 1160 × 0308 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 1160 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1160 × 0308 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1160 × 0308 × 0020 × 0085 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 1160 × 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 1160 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 1160 × 0308 × 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1160 × 0308 × 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 1160 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 1160 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 1160 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 1160 × 0308 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 1160 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 1160 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 1160 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1160 × 0308 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 1160 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.02] PERCENT SIGN (PO) ÷ [0.3] × 1160 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 1160 × 0308 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 1160 × 0308 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 1160 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 1160 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 1160 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1160 × 0308 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 1160 × 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 1160 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 1160 × 0308 × 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 1160 × 0308 × 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 1160 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [0.3] × 1160 × 0020 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 1160 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 1160 × 0308 × 0020 × 0020 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 1160 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [13.02] SOLIDUS (SY) ÷ [0.3] × 1160 × 0020 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 1160 × 0308 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 1160 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 1160 × 0308 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 1160 × 0308 × 0020 × 002F ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 1160 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 1160 × 0020 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 1160 × 0308 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 1160 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1160 × 0308 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1160 × 0308 × 0020 × 2060 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 1160 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 1160 × 0020 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 1160 × 0308 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 1160 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1160 × 0308 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1160 × 0308 × 0020 × 200B ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 1160 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 1160 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 1160 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1160 × 0308 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1160 ÷ 261D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1160 × 0020 ÷ 261D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1160 × 0308 ÷ 261D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1160 ÷ 1F3FB ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1160 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1160 × 0308 ÷ 1F3FB ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1160 × 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1160 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1160 × 0308 × 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1160 × 200D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1160 × 0020 ÷ 200D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1160 × 0308 × 200D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 1160 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 1160 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 1160 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1160 × 0308 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 1160 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 1160 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 1160 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1160 × 0308 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 1160 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 1160 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 1160 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1160 × 0308 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 1160 × 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 1160 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 1160 × 0308 × 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 1160 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1160 × 0308 × 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1160 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 000A ÷ 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] NUMBER SIGN (AL) ÷ [0.3] × 000A ÷ 0020 ÷ 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 000A ÷ 0308 × 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 000A ÷ 0308 × 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 000A ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] EM DASH (B2) ÷ [0.3] × 000A ÷ 0020 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 000A ÷ 0308 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 000A ÷ 0308 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 000A ÷ 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <CHARACTER TABULATION> (BA) ÷ [0.3] × 000A ÷ 0020 ÷ 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 000A ÷ 0308 × 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 000A ÷ 0308 × 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 000A ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] ACUTE ACCENT (BB) ÷ [0.3] × 000A ÷ 0020 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 000A ÷ 0308 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 000A ÷ 0308 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 000A ÷ 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <LINE TABULATION> (BK) ÷ [0.3] × 000A ÷ 0020 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 000A ÷ 0308 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 000A ÷ 0308 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 000B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 000A ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 000A ÷ 0020 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 000A ÷ 0308 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 000A ÷ 0308 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 000A ÷ 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 000A ÷ 0020 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 000A ÷ 0308 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 000A ÷ 0308 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 007D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 000A ÷ 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] RIGHT PARENTHESIS (CP) ÷ [0.3] × 000A ÷ 0020 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000A ÷ 0308 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 000A ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <START OF HEADING> (CM) ÷ [0.3] -× 000A ÷ 0020 ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 000A ÷ 0308 × 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 000A ÷ 0308 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 000A ÷ 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 000A ÷ 0020 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 000A ÷ 0308 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 000A ÷ 0308 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 000D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 000A ÷ 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] EXCLAMATION MARK (EX) ÷ [0.3] × 000A ÷ 0020 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 000A ÷ 0308 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 000A ÷ 0308 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 000A ÷ 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] NO-BREAK SPACE (GL) ÷ [0.3] × 000A ÷ 0020 ÷ 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 000A ÷ 0308 × 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 000A ÷ 0308 × 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 000A ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 000A ÷ 0020 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 000A ÷ 0308 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 000A ÷ 0308 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 000A ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 000A ÷ 0020 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 000A ÷ 0308 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 000A ÷ 0308 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 000A ÷ 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HEBREW LETTER ALEF (HL) ÷ [0.3] × 000A ÷ 0020 ÷ 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 000A ÷ 0308 × 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 000A ÷ 0308 × 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 000A ÷ 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HYPHEN-MINUS (HY) ÷ [0.3] × 000A ÷ 0020 ÷ 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 000A ÷ 0308 × 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 000A ÷ 0308 × 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 000A ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] WATCH (ID) ÷ [0.3] × 000A ÷ 0020 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 000A ÷ 0308 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 000A ÷ 0308 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 000A ÷ 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] ONE DOT LEADER (IN) ÷ [0.3] × 000A ÷ 0020 ÷ 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 000A ÷ 0308 × 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 000A ÷ 0308 × 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 000A ÷ 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMMA (IS) ÷ [0.3] × 000A ÷ 0020 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 000A ÷ 0308 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 000A ÷ 0308 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 002C ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 000A ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 000A ÷ 0020 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 000A ÷ 0308 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 000A ÷ 0308 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 000A ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 000A ÷ 0020 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 000A ÷ 0308 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 000A ÷ 0308 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 000A ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 000A ÷ 0020 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 000A ÷ 0308 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 000A ÷ 0308 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 000A ÷ 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <LINE FEED (LF)> (LF) ÷ [0.3] × 000A ÷ 0020 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 000A ÷ 0308 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 000A ÷ 0308 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 000A ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 000A ÷ 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 000A ÷ 0020 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 000A ÷ 0308 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 000A ÷ 0308 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 000A ÷ 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 000A ÷ 0020 ÷ 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 000A ÷ 0308 × 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 000A ÷ 0308 × 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 000A ÷ 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] DIGIT ZERO (NU) ÷ [0.3] × 000A ÷ 0020 ÷ 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 000A ÷ 0308 × 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 000A ÷ 0308 × 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 000A ÷ 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] LEFT PARENTHESIS (OP) ÷ [0.3] × 000A ÷ 0020 ÷ 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 000A ÷ 0308 × 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 000A ÷ 0308 × 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 000A ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] PERCENT SIGN (PO) ÷ [0.3] × 000A ÷ 0020 ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 000A ÷ 0308 ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 000A ÷ 0308 × 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 000A ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] DOLLAR SIGN (PR) ÷ [0.3] × 000A ÷ 0020 ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 000A ÷ 0308 ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 000A ÷ 0308 × 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 000A ÷ 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] QUOTATION MARK (QU) ÷ [0.3] × 000A ÷ 0020 ÷ 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 000A ÷ 0308 × 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 000A ÷ 0308 × 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 000A ÷ 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [0.3] × 000A ÷ 0020 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 000A ÷ 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SOLIDUS (SY) ÷ [0.3] × 000A ÷ 0020 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 000A ÷ 0308 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 000A ÷ 0308 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 002F ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 000A ÷ 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] WORD JOINER (WJ) ÷ [0.3] × 000A ÷ 0020 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 000A ÷ 0308 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 000A ÷ 0308 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 000A ÷ 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 000A ÷ 0020 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 000A ÷ 0308 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 000A ÷ 0308 × 0020 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 000A ÷ 0308 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 000A ÷ 0308 × 0020 × 200B ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 000A ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 000A ÷ 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 000A ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000A ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 000A ÷ 261D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000A ÷ 0020 ÷ 261D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000A ÷ 0308 ÷ 261D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 000A ÷ 1F3FB ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000A ÷ 0020 ÷ 1F3FB ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000A ÷ 0308 ÷ 1F3FB ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 000A ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000A ÷ 0020 ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000A ÷ 0308 × 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 000A ÷ 200D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000A ÷ 0020 ÷ 200D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000A ÷ 0308 × 200D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 000A ÷ 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SECTION SIGN (AI_AL) ÷ [0.3] × 000A ÷ 0020 ÷ 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 000A ÷ 0308 × 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 000A ÷ 0308 × 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 000A ÷ 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] <reserved-50005> (XX_AL) ÷ [0.3] × 000A ÷ 0020 ÷ 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 000A ÷ 0308 × 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 000A ÷ 0308 × 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 000A ÷ 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 000A ÷ 0020 ÷ 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 000A ÷ 0308 × 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 000A ÷ 0308 × 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 000A ÷ 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 000A ÷ 0020 ÷ 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 000A ÷ 0308 × 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 000A ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 000A ÷ 0308 × 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 000A ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0085 ÷ 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] NUMBER SIGN (AL) ÷ [0.3] × 0085 ÷ 0020 ÷ 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0085 ÷ 0308 × 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0085 ÷ 0308 × 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0085 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] EM DASH (B2) ÷ [0.3] × 0085 ÷ 0020 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0085 ÷ 0308 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0085 ÷ 0308 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0085 ÷ 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0085 ÷ 0020 ÷ 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0085 ÷ 0308 × 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0085 ÷ 0308 × 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0085 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] ACUTE ACCENT (BB) ÷ [0.3] × 0085 ÷ 0020 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0085 ÷ 0308 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0085 ÷ 0308 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0085 ÷ 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <LINE TABULATION> (BK) ÷ [0.3] × 0085 ÷ 0020 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0085 ÷ 0308 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0085 ÷ 0308 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 000B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0085 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0085 ÷ 0020 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0085 ÷ 0308 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0085 ÷ 0308 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0085 ÷ 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0085 ÷ 0020 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0085 ÷ 0308 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0085 ÷ 0308 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 007D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0085 ÷ 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0085 ÷ 0020 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0085 ÷ 0308 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0085 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <START OF HEADING> (CM) ÷ [0.3] -× 0085 ÷ 0020 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0085 ÷ 0308 × 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0085 ÷ 0308 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 0029 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0085 ÷ 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0085 ÷ 0020 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0085 ÷ 0308 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0085 ÷ 0308 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 000D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0085 ÷ 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] EXCLAMATION MARK (EX) ÷ [0.3] × 0085 ÷ 0020 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0085 ÷ 0308 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0085 ÷ 0308 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 0021 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0085 ÷ 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] NO-BREAK SPACE (GL) ÷ [0.3] × 0085 ÷ 0020 ÷ 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0085 ÷ 0308 × 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0085 ÷ 0308 × 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0085 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0085 ÷ 0020 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0085 ÷ 0308 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0085 ÷ 0308 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0085 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0085 ÷ 0020 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0085 ÷ 0308 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0085 ÷ 0308 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0085 ÷ 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0085 ÷ 0020 ÷ 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0085 ÷ 0308 × 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0085 ÷ 0308 × 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0085 ÷ 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HYPHEN-MINUS (HY) ÷ [0.3] × 0085 ÷ 0020 ÷ 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0085 ÷ 0308 × 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0085 ÷ 0308 × 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0085 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] WATCH (ID) ÷ [0.3] × 0085 ÷ 0020 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0085 ÷ 0308 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0085 ÷ 0308 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0085 ÷ 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] ONE DOT LEADER (IN) ÷ [0.3] × 0085 ÷ 0020 ÷ 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0085 ÷ 0308 × 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0085 ÷ 0308 × 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0085 ÷ 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMMA (IS) ÷ [0.3] × 0085 ÷ 0020 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0085 ÷ 0308 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0085 ÷ 0308 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 002C ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0085 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0085 ÷ 0020 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0085 ÷ 0308 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0085 ÷ 0308 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0085 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0085 ÷ 0020 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0085 ÷ 0308 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0085 ÷ 0308 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0085 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0085 ÷ 0020 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0085 ÷ 0308 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0085 ÷ 0308 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0085 ÷ 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <LINE FEED (LF)> (LF) ÷ [0.3] × 0085 ÷ 0020 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0085 ÷ 0308 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0085 ÷ 0308 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 000A ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0085 ÷ 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0085 ÷ 0020 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0085 ÷ 0308 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0085 ÷ 0308 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 0085 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0085 ÷ 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0085 ÷ 0020 ÷ 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0085 ÷ 0308 × 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0085 ÷ 0308 × 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0085 ÷ 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] DIGIT ZERO (NU) ÷ [0.3] × 0085 ÷ 0020 ÷ 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0085 ÷ 0308 × 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0085 ÷ 0308 × 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0085 ÷ 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] LEFT PARENTHESIS (OP) ÷ [0.3] × 0085 ÷ 0020 ÷ 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0085 ÷ 0308 × 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0085 ÷ 0308 × 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0085 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] PERCENT SIGN (PO) ÷ [0.3] × 0085 ÷ 0020 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0085 ÷ 0308 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0085 ÷ 0308 × 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0085 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] DOLLAR SIGN (PR) ÷ [0.3] × 0085 ÷ 0020 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0085 ÷ 0308 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0085 ÷ 0308 × 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0085 ÷ 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] QUOTATION MARK (QU) ÷ [0.3] × 0085 ÷ 0020 ÷ 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0085 ÷ 0308 × 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0085 ÷ 0308 × 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0085 ÷ 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [0.3] × 0085 ÷ 0020 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 0020 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0085 ÷ 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SOLIDUS (SY) ÷ [0.3] × 0085 ÷ 0020 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0085 ÷ 0308 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0085 ÷ 0308 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 002F ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0085 ÷ 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] WORD JOINER (WJ) ÷ [0.3] × 0085 ÷ 0020 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0085 ÷ 0308 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0085 ÷ 0308 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 2060 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0085 ÷ 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0085 ÷ 0020 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0085 ÷ 0308 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0085 ÷ 0308 × 0020 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0085 ÷ 0308 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0085 ÷ 0308 × 0020 × 200B ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0085 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0085 ÷ 0020 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0085 ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0085 ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0085 ÷ 261D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0085 ÷ 0020 ÷ 261D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0085 ÷ 0308 ÷ 261D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0085 ÷ 1F3FB ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0085 ÷ 0020 ÷ 1F3FB ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0085 ÷ 0308 ÷ 1F3FB ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0085 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0085 ÷ 0020 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0085 ÷ 0308 × 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0085 ÷ 200D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0085 ÷ 0020 ÷ 200D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0085 ÷ 0308 × 200D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0085 ÷ 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SECTION SIGN (AI_AL) ÷ [0.3] × 0085 ÷ 0020 ÷ 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0085 ÷ 0308 × 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0085 ÷ 0308 × 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0085 ÷ 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] <reserved-50005> (XX_AL) ÷ [0.3] × 0085 ÷ 0020 ÷ 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0085 ÷ 0308 × 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0085 ÷ 0308 × 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0085 ÷ 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0085 ÷ 0020 ÷ 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0085 ÷ 0308 × 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0085 ÷ 0308 × 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0085 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0085 ÷ 0020 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0085 ÷ 0308 × 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0085 ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0085 ÷ 0308 × 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0085 ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 17D6 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 17D6 × 0020 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 17D6 × 0308 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 17D6 × 0308 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 17D6 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 17D6 × 0020 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 17D6 × 0308 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 17D6 × 0308 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 17D6 × 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 17D6 × 0020 ÷ 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 17D6 × 0308 × 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 17D6 × 0308 × 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 17D6 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 17D6 × 0020 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 17D6 × 0308 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 17D6 × 0308 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 17D6 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 17D6 × 0020 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 17D6 × 0308 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 17D6 × 0308 × 0020 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 17D6 × 0308 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 17D6 × 0308 × 0020 × 000B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 17D6 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 17D6 × 0020 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 17D6 × 0308 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 17D6 × 0308 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 17D6 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 17D6 × 0020 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 17D6 × 0308 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 17D6 × 0308 × 0020 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 17D6 × 0308 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 17D6 × 0308 × 0020 × 007D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 17D6 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 17D6 × 0020 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 17D6 × 0308 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 17D6 × 0308 × 0020 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 17D6 × 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 17D6 × 0020 ÷ 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 17D6 × 0308 × 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 17D6 × 0308 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 17D6 × 0308 × 0020 × 0029 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 17D6 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 17D6 × 0020 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 17D6 × 0308 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 17D6 × 0308 × 0020 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 17D6 × 0308 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 17D6 × 0308 × 0020 × 000D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 17D6 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 17D6 × 0020 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 17D6 × 0308 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 17D6 × 0308 × 0020 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 17D6 × 0308 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 17D6 × 0308 × 0020 × 0021 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 17D6 × 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 17D6 × 0020 ÷ 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 17D6 × 0308 × 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 17D6 × 0308 × 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 17D6 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 17D6 × 0020 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 17D6 × 0308 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 17D6 × 0308 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 17D6 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 17D6 × 0020 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 17D6 × 0308 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 17D6 × 0308 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 17D6 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 17D6 × 0020 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 17D6 × 0308 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 17D6 × 0308 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 17D6 × 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 17D6 × 0020 ÷ 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 17D6 × 0308 × 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 17D6 × 0308 × 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 002D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 17D6 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] WATCH (ID) ÷ [0.3] × 17D6 × 0020 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 17D6 × 0308 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 17D6 × 0308 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 231A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 17D6 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 17D6 × 0020 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 17D6 × 0308 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 17D6 × 0308 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 17D6 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.02] COMMA (IS) ÷ [0.3] × 17D6 × 0020 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 17D6 × 0308 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 17D6 × 0308 × 0020 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 17D6 × 0308 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 17D6 × 0308 × 0020 × 002C ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 17D6 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 17D6 × 0020 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 17D6 × 0308 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 17D6 × 0308 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 17D6 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 17D6 × 0020 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 17D6 × 0308 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 17D6 × 0308 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 17D6 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 17D6 × 0020 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 17D6 × 0308 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 17D6 × 0308 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 17D6 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 17D6 × 0020 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 17D6 × 0308 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 17D6 × 0308 × 0020 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 17D6 × 0308 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 17D6 × 0308 × 0020 × 000A ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 17D6 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 17D6 × 0020 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 17D6 × 0308 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 17D6 × 0308 × 0020 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 17D6 × 0308 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 17D6 × 0308 × 0020 × 0085 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 17D6 × 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 17D6 × 0020 ÷ 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 17D6 × 0308 × 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 17D6 × 0308 × 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 17D6 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 17D6 × 0020 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 17D6 × 0308 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 17D6 × 0308 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 17D6 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 17D6 × 0020 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 17D6 × 0308 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 17D6 × 0308 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 17D6 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 17D6 × 0020 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 17D6 × 0308 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 17D6 × 0308 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 17D6 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 17D6 × 0020 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 17D6 × 0308 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 17D6 × 0308 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 17D6 × 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 17D6 × 0020 ÷ 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 17D6 × 0308 × 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 17D6 × 0308 × 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 17D6 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [0.3] × 17D6 × 0020 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 17D6 × 0308 × 0020 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 17D6 × 0308 × 0020 × 0020 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 17D6 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [13.02] SOLIDUS (SY) ÷ [0.3] × 17D6 × 0020 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 17D6 × 0308 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 17D6 × 0308 × 0020 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 17D6 × 0308 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 17D6 × 0308 × 0020 × 002F ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 17D6 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 17D6 × 0020 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 17D6 × 0308 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 17D6 × 0308 × 0020 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 17D6 × 0308 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 17D6 × 0308 × 0020 × 2060 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 17D6 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 17D6 × 0020 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 17D6 × 0308 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 17D6 × 0308 × 0020 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 17D6 × 0308 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 17D6 × 0308 × 0020 × 200B ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 17D6 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 17D6 × 0020 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 17D6 × 0308 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 17D6 × 0308 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 17D6 ÷ 261D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 17D6 × 0020 ÷ 261D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 17D6 × 0308 ÷ 261D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 261D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 17D6 ÷ 1F3FB ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 17D6 × 0020 ÷ 1F3FB ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 17D6 × 0308 ÷ 1F3FB ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 17D6 × 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 17D6 × 0020 ÷ 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 17D6 × 0308 × 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 17D6 × 200D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 17D6 × 0020 ÷ 200D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 17D6 × 0308 × 200D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 200D ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 17D6 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 17D6 × 0020 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 17D6 × 0308 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 17D6 × 0308 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 17D6 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 17D6 × 0020 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 17D6 × 0308 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 17D6 × 0308 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 17D6 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 17D6 × 0020 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 17D6 × 0308 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 17D6 × 0308 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 17D6 × 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 17D6 × 0020 ÷ 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 17D6 × 0308 × 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 17D6 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 17D6 × 0308 × 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 17D6 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] KHMER SIGN CAMNUC PII KUUH (NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0030 × 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] NUMBER SIGN (AL) ÷ [0.3] × 0030 × 0020 ÷ 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0030 × 0308 × 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] NUMBER SIGN (AL) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0030 × 0308 × 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] NUMBER SIGN (AL) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0030 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 0030 × 0020 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0030 × 0308 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0030 × 0308 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0030 × 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0030 × 0020 ÷ 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0030 × 0308 × 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0030 × 0308 × 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0030 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 0030 × 0020 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0030 × 0308 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0030 × 0308 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0030 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0030 × 0020 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0030 × 0308 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0030 × 0308 × 0020 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0030 × 0308 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0030 × 0308 × 0020 × 000B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0030 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0030 × 0020 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0030 × 0308 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0030 × 0308 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0030 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [25.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0030 × 0020 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0030 × 0308 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0030 × 0308 × 0020 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0030 × 0308 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0030 × 0308 × 0020 × 007D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0030 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [25.04] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0030 × 0020 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0030 × 0308 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.04] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0030 × 0308 × 0020 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0030 × 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0030 × 0020 ÷ 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0030 × 0308 × 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0030 × 0308 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.04] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0030 × 0308 × 0020 × 0029 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0030 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0030 × 0020 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0030 × 0308 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0030 × 0308 × 0020 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0030 × 0308 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0030 × 0308 × 0020 × 000D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0030 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0030 × 0020 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0030 × 0308 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0030 × 0308 × 0020 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0030 × 0308 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0030 × 0308 × 0020 × 0021 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0030 × 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0030 × 0020 ÷ 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0030 × 0308 × 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0030 × 0308 × 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0030 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0030 × 0020 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0030 × 0308 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0030 × 0308 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0030 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0030 × 0020 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0030 × 0308 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0030 × 0308 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0030 × 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0030 × 0020 ÷ 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0030 × 0308 × 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0030 × 0308 × 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0030 × 002D ÷ # × [0.3] DIGIT ZERO (NU) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0030 × 0020 ÷ 002D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0030 × 0308 × 002D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 002D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0030 × 0308 × 002D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 002D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0030 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] WATCH (ID) ÷ [0.3] × 0030 × 0020 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0030 × 0308 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0030 × 0308 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 231A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0030 × 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [22.05] ONE DOT LEADER (IN) ÷ [0.3] × 0030 × 0020 ÷ 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0030 × 0308 × 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [22.05] ONE DOT LEADER (IN) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0030 × 0308 × 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.05] ONE DOT LEADER (IN) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0030 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [25.03] COMMA (IS) ÷ [0.3] × 0030 × 0020 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0030 × 0308 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.03] COMMA (IS) ÷ [0.3] -× 0030 × 0308 × 0020 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0030 × 0308 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.03] COMMA (IS) ÷ [0.3] +× 0030 × 0308 × 0020 × 002C ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0030 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0030 × 0020 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0030 × 0308 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0030 × 0308 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0030 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0030 × 0020 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0030 × 0308 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0030 × 0308 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0030 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0030 × 0020 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0030 × 0308 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0030 × 0308 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0030 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0030 × 0020 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0030 × 0308 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0030 × 0308 × 0020 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0030 × 0308 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0030 × 0308 × 0020 × 000A ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0030 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0030 × 0020 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0030 × 0308 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0030 × 0308 × 0020 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0030 × 0308 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0030 × 0308 × 0020 × 0085 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0030 × 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0030 × 0020 ÷ 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0030 × 0308 × 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0030 × 0308 × 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0030 × 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [25.03] DIGIT ZERO (NU) ÷ [0.3] × 0030 × 0020 ÷ 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0030 × 0308 × 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.03] DIGIT ZERO (NU) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0030 × 0308 × 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.03] DIGIT ZERO (NU) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0030 × 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] × 0030 × 0020 ÷ 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0030 × 0308 × 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0030 × 0308 × 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0030 × 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [25.05] PERCENT SIGN (PO) ÷ [0.3] × 0030 × 0020 ÷ 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0030 × 0308 × 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.05] PERCENT SIGN (PO) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0030 × 0308 × 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.05] PERCENT SIGN (PO) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0030 × 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [25.05] DOLLAR SIGN (PR) ÷ [0.3] × 0030 × 0020 ÷ 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0030 × 0308 × 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.05] DOLLAR SIGN (PR) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0030 × 0308 × 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.05] DOLLAR SIGN (PR) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0030 × 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0030 × 0020 ÷ 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0030 × 0308 × 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0030 × 0308 × 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0030 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [0.3] × 0030 × 0020 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0030 × 0308 × 0020 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0030 × 0308 × 0020 × 0020 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0030 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [25.03] SOLIDUS (SY) ÷ [0.3] × 0030 × 0020 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0030 × 0308 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [25.03] SOLIDUS (SY) ÷ [0.3] -× 0030 × 0308 × 0020 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0030 × 0308 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.03] SOLIDUS (SY) ÷ [0.3] +× 0030 × 0308 × 0020 × 002F ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0030 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0030 × 0020 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0030 × 0308 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0030 × 0308 × 0020 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0030 × 0308 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0030 × 0308 × 0020 × 2060 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0030 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0030 × 0020 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0030 × 0308 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0030 × 0308 × 0020 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0030 × 0308 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0030 × 0308 × 0020 × 200B ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0030 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0030 × 0020 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0030 × 0308 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0030 × 0308 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0030 ÷ 261D ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0030 × 0020 ÷ 261D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0030 × 0308 ÷ 261D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 261D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0030 ÷ 1F3FB ÷ # × [0.3] DIGIT ZERO (NU) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0030 × 0020 ÷ 1F3FB ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0030 × 0308 ÷ 1F3FB ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0030 × 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0030 × 0020 ÷ 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0030 × 0308 × 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0030 × 200D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0030 × 0020 ÷ 200D ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0030 × 0308 × 200D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 200D ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0030 × 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] SECTION SIGN (AI_AL) ÷ [0.3] × 0030 × 0020 ÷ 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0030 × 0308 × 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] SECTION SIGN (AI_AL) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0030 × 0308 × 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] SECTION SIGN (AI_AL) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0030 × 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] <reserved-50005> (XX_AL) ÷ [0.3] × 0030 × 0020 ÷ 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0030 × 0308 × 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] <reserved-50005> (XX_AL) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0030 × 0308 × 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] <reserved-50005> (XX_AL) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0030 × 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [23.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0030 × 0020 ÷ 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0030 × 0308 × 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0030 × 0308 × 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0030 × 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0030 × 0020 ÷ 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0030 × 0308 × 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0030 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0030 × 0308 × 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0030 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] DIGIT ZERO (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0028 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] NUMBER SIGN (AL) ÷ [0.3] × 0028 × 0020 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] NUMBER SIGN (AL) ÷ [0.3] -× 0028 × 0308 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] NUMBER SIGN (AL) ÷ [0.3] -× 0028 × 0308 × 0020 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] NUMBER SIGN (AL) ÷ [0.3] +× 0028 × 0308 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] NUMBER SIGN (AL) ÷ [0.3] +× 0028 × 0308 × 0020 × 0023 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] NUMBER SIGN (AL) ÷ [0.3] × 0028 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] EM DASH (B2) ÷ [0.3] × 0028 × 0020 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] EM DASH (B2) ÷ [0.3] -× 0028 × 0308 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] EM DASH (B2) ÷ [0.3] -× 0028 × 0308 × 0020 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] EM DASH (B2) ÷ [0.3] +× 0028 × 0308 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] EM DASH (B2) ÷ [0.3] +× 0028 × 0308 × 0020 × 2014 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] EM DASH (B2) ÷ [0.3] × 0028 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0028 × 0020 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0028 × 0308 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0028 × 0308 × 0020 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0028 × 0308 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0028 × 0308 × 0020 × 0009 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0028 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] ACUTE ACCENT (BB) ÷ [0.3] × 0028 × 0020 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0028 × 0308 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0028 × 0308 × 0020 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0028 × 0308 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0028 × 0308 × 0020 × 00B4 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] ACUTE ACCENT (BB) ÷ [0.3] × 0028 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0028 × 0020 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0028 × 0308 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0028 × 0308 × 0020 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0028 × 0308 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0028 × 0308 × 0020 × 000B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0028 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0028 × 0020 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0028 × 0308 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0028 × 0308 × 0020 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0028 × 0308 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0028 × 0308 × 0020 × FFFC ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0028 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0028 × 0020 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0028 × 0308 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0028 × 0308 × 0020 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0028 × 0308 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0028 × 0308 × 0020 × 007D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0028 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0028 × 0020 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0028 × 0308 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0028 × 0308 × 0020 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0028 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0028 × 0020 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] <START OF HEADING> (CM) ÷ [0.3] -× 0028 × 0308 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0028 × 0308 × 0020 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] <START OF HEADING> (CM) ÷ [0.3] +× 0028 × 0308 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0028 × 0308 × 0020 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0028 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0028 × 0020 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0028 × 0308 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0028 × 0308 × 0020 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0028 × 0308 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0028 × 0308 × 0020 × 000D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0028 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0028 × 0020 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0028 × 0308 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0028 × 0308 × 0020 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0028 × 0308 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0028 × 0308 × 0020 × 0021 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0028 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0028 × 0020 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0028 × 0308 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0028 × 0308 × 0020 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0028 × 0308 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0028 × 0308 × 0020 × 00A0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0028 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0028 × 0020 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0028 × 0308 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0028 × 0308 × 0020 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0028 × 0308 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0028 × 0308 × 0020 × AC00 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0028 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0028 × 0020 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0028 × 0308 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0028 × 0308 × 0020 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0028 × 0308 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0028 × 0308 × 0020 × AC01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0028 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0028 × 0020 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0028 × 0308 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0028 × 0308 × 0020 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0028 × 0308 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0028 × 0308 × 0020 × 05D0 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0028 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0028 × 0020 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0028 × 0308 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0028 × 0308 × 0020 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0028 × 0308 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0028 × 0308 × 0020 × 002D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0028 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] WATCH (ID) ÷ [0.3] × 0028 × 0020 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] WATCH (ID) ÷ [0.3] -× 0028 × 0308 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] WATCH (ID) ÷ [0.3] -× 0028 × 0308 × 0020 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] WATCH (ID) ÷ [0.3] +× 0028 × 0308 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] WATCH (ID) ÷ [0.3] +× 0028 × 0308 × 0020 × 231A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] WATCH (ID) ÷ [0.3] × 0028 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] ONE DOT LEADER (IN) ÷ [0.3] × 0028 × 0020 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0028 × 0308 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0028 × 0308 × 0020 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0028 × 0308 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0028 × 0308 × 0020 × 2024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] ONE DOT LEADER (IN) ÷ [0.3] × 0028 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.02] COMMA (IS) ÷ [0.3] × 0028 × 0020 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0028 × 0308 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0028 × 0308 × 0020 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0028 × 0308 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0028 × 0308 × 0020 × 002C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0028 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0028 × 0020 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0028 × 0308 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0028 × 0308 × 0020 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0028 × 0308 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0028 × 0308 × 0020 × 1100 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0028 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0028 × 0020 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0028 × 0308 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0028 × 0308 × 0020 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0028 × 0308 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0028 × 0308 × 0020 × 11A8 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0028 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0028 × 0020 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0028 × 0308 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0028 × 0308 × 0020 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0028 × 0308 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0028 × 0308 × 0020 × 1160 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0028 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0028 × 0020 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0028 × 0308 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0028 × 0308 × 0020 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0028 × 0308 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0028 × 0308 × 0020 × 000A ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0028 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0028 × 0020 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0028 × 0308 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0028 × 0308 × 0020 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0028 × 0308 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0028 × 0308 × 0020 × 0085 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0028 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0028 × 0020 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0028 × 0308 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0028 × 0308 × 0020 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0028 × 0308 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0028 × 0308 × 0020 × 17D6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0028 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] DIGIT ZERO (NU) ÷ [0.3] × 0028 × 0020 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] DIGIT ZERO (NU) ÷ [0.3] -× 0028 × 0308 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] DIGIT ZERO (NU) ÷ [0.3] -× 0028 × 0308 × 0020 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] DIGIT ZERO (NU) ÷ [0.3] +× 0028 × 0308 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] DIGIT ZERO (NU) ÷ [0.3] +× 0028 × 0308 × 0020 × 0030 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] DIGIT ZERO (NU) ÷ [0.3] × 0028 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0028 × 0020 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0028 × 0308 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0028 × 0308 × 0020 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0028 × 0308 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0028 × 0308 × 0020 × 0028 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0028 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] PERCENT SIGN (PO) ÷ [0.3] × 0028 × 0020 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] PERCENT SIGN (PO) ÷ [0.3] -× 0028 × 0308 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] PERCENT SIGN (PO) ÷ [0.3] -× 0028 × 0308 × 0020 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] PERCENT SIGN (PO) ÷ [0.3] +× 0028 × 0308 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] PERCENT SIGN (PO) ÷ [0.3] +× 0028 × 0308 × 0020 × 0025 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] PERCENT SIGN (PO) ÷ [0.3] × 0028 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] DOLLAR SIGN (PR) ÷ [0.3] × 0028 × 0020 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0028 × 0308 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0028 × 0308 × 0020 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0028 × 0308 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0028 × 0308 × 0020 × 0024 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] DOLLAR SIGN (PR) ÷ [0.3] × 0028 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] QUOTATION MARK (QU) ÷ [0.3] × 0028 × 0020 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] QUOTATION MARK (QU) ÷ [0.3] -× 0028 × 0308 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] QUOTATION MARK (QU) ÷ [0.3] -× 0028 × 0308 × 0020 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] QUOTATION MARK (QU) ÷ [0.3] +× 0028 × 0308 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] QUOTATION MARK (QU) ÷ [0.3] +× 0028 × 0308 × 0020 × 0022 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] QUOTATION MARK (QU) ÷ [0.3] × 0028 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) ÷ [0.3] × 0028 × 0020 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0028 × 0308 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0028 × 0308 × 0020 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0028 × 0308 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0028 × 0308 × 0020 × 0020 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0028 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0028 × 0020 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0028 × 0308 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0028 × 0308 × 0020 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0028 × 0308 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0028 × 0308 × 0020 × 002F ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0028 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0028 × 0020 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0028 × 0308 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0028 × 0308 × 0020 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0028 × 0308 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0028 × 0308 × 0020 × 2060 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0028 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0028 × 0020 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0028 × 0308 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0028 × 0308 × 0020 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0028 × 0308 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0028 × 0308 × 0020 × 200B ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0028 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0028 × 0020 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0028 × 0308 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0028 × 0308 × 0020 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0028 × 0308 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0028 × 0308 × 0020 × 1F1E6 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0028 × 261D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0028 × 0020 × 261D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0028 × 0308 × 261D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0028 × 0308 × 0020 × 261D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0028 × 1F3FB ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0028 × 0020 × 1F3FB ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0028 × 0308 × 1F3FB ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0028 × 0308 × 0020 × 1F3FB ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0028 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0028 × 0020 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0028 × 0308 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0028 × 0308 × 0020 × 0001 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0028 × 200D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0028 × 0020 × 200D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0028 × 0308 × 200D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0028 × 0308 × 0020 × 200D ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0028 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0028 × 0020 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0028 × 0308 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0028 × 0308 × 0020 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0028 × 0308 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0028 × 0308 × 0020 × 00A7 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0028 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0028 × 0020 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0028 × 0308 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0028 × 0308 × 0020 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0028 × 0308 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0028 × 0308 × 0020 × 50005 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0028 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0028 × 0020 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0028 × 0308 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0028 × 0308 × 0020 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0028 × 0308 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0028 × 0308 × 0020 × 0E01 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0028 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0028 × 0020 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0028 × 0308 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0028 × 0308 × 0020 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0025 × 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] NUMBER SIGN (AL) ÷ [0.3] +× 0028 × 0308 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0028 × 0308 × 0020 × 3041 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [14.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0025 × 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] NUMBER SIGN (AL) ÷ [0.3] × 0025 × 0020 ÷ 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0025 × 0308 × 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] NUMBER SIGN (AL) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0025 × 0308 × 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] NUMBER SIGN (AL) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0025 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 0025 × 0020 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0025 × 0308 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0025 × 0308 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0025 × 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0025 × 0020 ÷ 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0025 × 0308 × 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0025 × 0308 × 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0025 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 0025 × 0020 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0025 × 0308 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0025 × 0308 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0025 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0025 × 0020 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0025 × 0308 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0025 × 0308 × 0020 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0025 × 0308 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0025 × 0308 × 0020 × 000B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0025 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0025 × 0020 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0025 × 0308 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0025 × 0308 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0025 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0025 × 0020 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0025 × 0308 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0025 × 0308 × 0020 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0025 × 0308 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0025 × 0308 × 0020 × 007D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0025 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0025 × 0020 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0025 × 0308 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0025 × 0308 × 0020 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0025 × 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0025 × 0020 ÷ 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0025 × 0308 × 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0025 × 0308 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0025 × 0308 × 0020 × 0029 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0025 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0025 × 0020 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0025 × 0308 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0025 × 0308 × 0020 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0025 × 0308 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0025 × 0308 × 0020 × 000D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0025 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0025 × 0020 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0025 × 0308 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0025 × 0308 × 0020 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0025 × 0308 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0025 × 0308 × 0020 × 0021 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0025 × 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0025 × 0020 ÷ 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0025 × 0308 × 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0025 × 0308 × 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0025 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0025 × 0020 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0025 × 0308 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0025 × 0308 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0025 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0025 × 0020 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0025 × 0308 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0025 × 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0025 × 0308 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0025 × 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0025 × 0020 ÷ 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0025 × 0308 × 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0025 × 0308 × 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0025 × 002D ÷ # × [0.3] PERCENT SIGN (PO) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0025 × 0020 ÷ 002D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0025 × 0308 × 002D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 002D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0025 × 0308 × 002D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 002D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0025 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] WATCH (ID) ÷ [0.3] × 0025 × 0020 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0025 × 0308 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0025 × 0308 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 231A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0025 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 0025 × 0020 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0025 × 0308 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0025 × 0308 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0025 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [13.02] COMMA (IS) ÷ [0.3] × 0025 × 0020 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0025 × 0308 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0025 × 0308 × 0020 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0025 × 0308 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0025 × 0308 × 0020 × 002C ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0025 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0025 × 0020 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0025 × 0308 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0025 × 0308 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0025 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0025 × 0020 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0025 × 0308 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0025 × 0308 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0025 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0025 × 0020 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0025 × 0308 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0025 × 0308 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0025 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0025 × 0020 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0025 × 0308 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0025 × 0308 × 0020 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0025 × 0308 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0025 × 0308 × 0020 × 000A ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0025 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0025 × 0020 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0025 × 0308 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0025 × 0308 × 0020 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0025 × 0308 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0025 × 0308 × 0020 × 0085 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0025 × 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0025 × 0020 ÷ 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0025 × 0308 × 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0025 × 0308 × 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0025 × 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [25.01] DIGIT ZERO (NU) ÷ [0.3] × 0025 × 0020 ÷ 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0025 × 0308 × 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [25.01] DIGIT ZERO (NU) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0025 × 0308 × 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.01] DIGIT ZERO (NU) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0025 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0025 × 0020 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0025 × 0308 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0025 × 0308 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0025 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 0025 × 0020 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0025 × 0308 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0025 × 0308 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0025 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 0025 × 0020 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0025 × 0308 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0025 × 0308 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0025 × 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0025 × 0020 ÷ 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0025 × 0308 × 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0025 × 0308 × 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0025 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [0.3] × 0025 × 0020 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0025 × 0308 × 0020 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0025 × 0308 × 0020 × 0020 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0025 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0025 × 0020 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0025 × 0308 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0025 × 0308 × 0020 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0025 × 0308 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0025 × 0308 × 0020 × 002F ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0025 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0025 × 0020 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0025 × 0308 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0025 × 0308 × 0020 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0025 × 0308 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0025 × 0308 × 0020 × 2060 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0025 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0025 × 0020 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0025 × 0308 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0025 × 0308 × 0020 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0025 × 0308 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0025 × 0308 × 0020 × 200B ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0025 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0025 × 0020 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0025 × 0308 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0025 × 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] SECTION SIGN (AI_AL) ÷ [0.3] +× 0025 × 0308 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0025 ÷ 261D ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0025 × 0020 ÷ 261D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0025 × 0308 ÷ 261D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 261D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0025 ÷ 1F3FB ÷ # × [0.3] PERCENT SIGN (PO) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0025 × 0020 ÷ 1F3FB ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0025 × 0308 ÷ 1F3FB ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0025 × 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0025 × 0020 ÷ 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0025 × 0308 × 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0025 × 200D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0025 × 0020 ÷ 200D ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0025 × 0308 × 200D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 200D ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0025 × 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3] × 0025 × 0020 ÷ 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0025 × 0308 × 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] SECTION SIGN (AI_AL) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0025 × 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] <reserved-50005> (XX_AL) ÷ [0.3] +× 0025 × 0308 × 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0025 × 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3] × 0025 × 0020 ÷ 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0025 × 0308 × 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] <reserved-50005> (XX_AL) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0025 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [24.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0025 × 0308 × 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0025 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0025 × 0020 ÷ 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0025 × 0308 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [24.03] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0025 × 0308 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0025 × 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0025 × 0020 ÷ 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0025 × 0308 × 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0025 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0025 × 0308 × 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0025 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] PERCENT SIGN (PO) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0024 × 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] NUMBER SIGN (AL) ÷ [0.3] × 0024 × 0020 ÷ 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0024 × 0308 × 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] NUMBER SIGN (AL) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0024 × 0308 × 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] NUMBER SIGN (AL) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0024 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 0024 × 0020 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0024 × 0308 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0024 × 0308 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0024 × 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0024 × 0020 ÷ 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0024 × 0308 × 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0024 × 0308 × 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0024 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 0024 × 0020 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0024 × 0308 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0024 × 0308 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0024 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0024 × 0020 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0024 × 0308 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0024 × 0308 × 0020 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0024 × 0308 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0024 × 0308 × 0020 × 000B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0024 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0024 × 0020 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0024 × 0308 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0024 × 0308 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0024 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0024 × 0020 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0024 × 0308 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0024 × 0308 × 0020 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0024 × 0308 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0024 × 0308 × 0020 × 007D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0024 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0024 × 0020 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0024 × 0308 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0024 × 0308 × 0020 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0024 × 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0024 × 0020 ÷ 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0024 × 0308 × 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0024 × 0308 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0024 × 0308 × 0020 × 0029 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0024 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0024 × 0020 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0024 × 0308 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0024 × 0308 × 0020 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0024 × 0308 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0024 × 0308 × 0020 × 000D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0024 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0024 × 0020 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0024 × 0308 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0024 × 0308 × 0020 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0024 × 0308 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0024 × 0308 × 0020 × 0021 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0024 × 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0024 × 0020 ÷ 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0024 × 0308 × 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0024 × 0308 × 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0024 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0024 × 0020 ÷ AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0024 × 0308 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0024 × 0308 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0024 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0024 × 0020 ÷ AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0024 × 0308 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0024 × 0308 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0024 × 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0024 × 0020 ÷ 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0024 × 0308 × 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0024 × 0308 × 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0024 × 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0024 × 0020 ÷ 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0024 × 0308 × 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0024 × 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [24.01] WATCH (ID) ÷ [0.3] +× 0024 × 0308 × 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 002D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0024 × 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [23.12] WATCH (ID) ÷ [0.3] × 0024 × 0020 ÷ 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0024 × 0308 × 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.01] WATCH (ID) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0024 × 0308 × 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.12] WATCH (ID) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 231A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0024 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 0024 × 0020 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0024 × 0308 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0024 × 0308 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0024 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [13.02] COMMA (IS) ÷ [0.3] × 0024 × 0020 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0024 × 0308 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0024 × 0308 × 0020 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0024 × 0308 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0024 × 0308 × 0020 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0024 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0024 × 0020 ÷ 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0024 × 0308 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0024 × 0308 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0024 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0024 × 0020 ÷ 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0024 × 0308 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0024 × 0308 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0024 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0024 × 0020 ÷ 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0024 × 0308 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0024 × 0308 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0024 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0024 × 0020 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0024 × 0308 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0024 × 0308 × 0020 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0024 × 0308 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0024 × 0308 × 0020 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0024 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0024 × 0020 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0024 × 0308 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0024 × 0308 × 0020 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0024 × 0308 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0024 × 0308 × 0020 × 0085 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0024 × 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0024 × 0020 ÷ 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0024 × 0308 × 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0024 × 0308 × 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0024 × 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [25.01] DIGIT ZERO (NU) ÷ [0.3] × 0024 × 0020 ÷ 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0024 × 0308 × 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [25.01] DIGIT ZERO (NU) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0024 × 0308 × 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [25.01] DIGIT ZERO (NU) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0024 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0024 × 0020 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0024 × 0308 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0024 × 0308 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0024 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 0024 × 0020 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0024 × 0308 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0024 × 0308 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0024 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 0024 × 0020 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0024 × 0308 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0024 × 0308 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0024 × 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0024 × 0020 ÷ 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0024 × 0308 × 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0024 × 0308 × 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0024 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [0.3] × 0024 × 0020 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0024 × 0308 × 0020 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0024 × 0308 × 0020 × 0020 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0024 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0024 × 0020 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0024 × 0308 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0024 × 0308 × 0020 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0024 × 0308 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0024 × 0308 × 0020 × 002F ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0024 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0024 × 0020 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0024 × 0308 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0024 × 0308 × 0020 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0024 × 0308 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0024 × 0308 × 0020 × 2060 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0024 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0024 × 0020 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0024 × 0308 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0024 × 0308 × 0020 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0024 × 0308 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0024 × 0308 × 0020 × 200B ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0024 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0024 × 0020 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0024 × 0308 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0024 × 0308 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0024 × 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [23.12] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0024 × 0020 ÷ 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0024 × 0308 × 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.12] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0024 × 1F3FB ÷ # × [0.3] DOLLAR SIGN (PR) × [23.12] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0024 × 0020 ÷ 1F3FB ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0024 × 0308 × 1F3FB ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.12] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0024 × 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0024 × 0020 ÷ 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0024 × 0308 × 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0024 × 200D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0024 × 0020 ÷ 200D ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0024 × 0308 × 200D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 200D ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0024 × 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3] × 0024 × 0020 ÷ 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0024 × 0308 × 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0024 × 0308 × 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] SECTION SIGN (AI_AL) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0024 × 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3] × 0024 × 0020 ÷ 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0024 × 0308 × 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0024 × 0308 × 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] <reserved-50005> (XX_AL) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0024 × 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0024 × 0020 ÷ 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0024 × 0308 × 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0024 × 0308 × 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0024 × 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0024 × 0020 ÷ 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0024 × 0308 × 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0024 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0024 × 0308 × 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0024 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0022 × 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] NUMBER SIGN (AL) ÷ [0.3] × 0022 × 0020 ÷ 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0022 × 0308 × 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] NUMBER SIGN (AL) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0022 × 0308 × 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] NUMBER SIGN (AL) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0022 × 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] EM DASH (B2) ÷ [0.3] × 0022 × 0020 ÷ 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0022 × 0308 × 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] EM DASH (B2) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0022 × 0308 × 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] EM DASH (B2) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0022 × 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0022 × 0020 ÷ 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0022 × 0308 × 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0022 × 0308 × 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0022 × 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] ACUTE ACCENT (BB) ÷ [0.3] × 0022 × 0020 ÷ 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0022 × 0308 × 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] ACUTE ACCENT (BB) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0022 × 0308 × 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] ACUTE ACCENT (BB) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0022 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0022 × 0020 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0022 × 0308 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0022 × 0308 × 0020 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0022 × 0308 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0022 × 0308 × 0020 × 000B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0022 × FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0022 × 0020 ÷ FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0022 × 0308 × FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0022 × 0308 × FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0022 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0022 × 0020 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0022 × 0308 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0022 × 0308 × 0020 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0022 × 0308 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0022 × 0308 × 0020 × 007D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0022 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0022 × 0020 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0022 × 0308 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0022 × 0308 × 0020 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0022 × 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0022 × 0020 ÷ 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0022 × 0308 × 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0022 × 0308 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0022 × 0308 × 0020 × 0029 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0022 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0022 × 0020 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0022 × 0308 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0022 × 0308 × 0020 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0022 × 0308 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0022 × 0308 × 0020 × 000D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0022 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0022 × 0020 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0022 × 0308 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0022 × 0308 × 0020 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0022 × 0308 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0022 × 0308 × 0020 × 0021 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0022 × 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0022 × 0020 ÷ 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0022 × 0308 × 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0022 × 0308 × 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0022 × AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0022 × 0020 ÷ AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0022 × 0308 × AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0022 × 0308 × AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0022 × AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0022 × 0020 ÷ AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0022 × 0308 × AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0022 × 0308 × AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0022 × 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0022 × 0020 ÷ 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0022 × 0308 × 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0022 × 0308 × 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0022 × 002D ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0022 × 0020 ÷ 002D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0022 × 0308 × 002D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 002D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0022 × 0308 × 002D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 002D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0022 × 231A ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] WATCH (ID) ÷ [0.3] × 0022 × 0020 ÷ 231A ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0022 × 0308 × 231A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] WATCH (ID) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 231A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0022 × 0308 × 231A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] WATCH (ID) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 231A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0022 × 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] ONE DOT LEADER (IN) ÷ [0.3] × 0022 × 0020 ÷ 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0022 × 0308 × 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] ONE DOT LEADER (IN) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0022 × 0308 × 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] ONE DOT LEADER (IN) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0022 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [13.02] COMMA (IS) ÷ [0.3] × 0022 × 0020 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0022 × 0308 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0022 × 0308 × 0020 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0022 × 0308 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0022 × 0308 × 0020 × 002C ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0022 × 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0022 × 0020 ÷ 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0022 × 0308 × 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0022 × 0308 × 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0022 × 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0022 × 0020 ÷ 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0022 × 0308 × 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0022 × 0308 × 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0022 × 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0022 × 0020 ÷ 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0022 × 0308 × 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0022 × 0308 × 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0022 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0022 × 0020 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0022 × 0308 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0022 × 0308 × 0020 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0022 × 0308 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0022 × 0308 × 0020 × 000A ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0022 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0022 × 0020 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0022 × 0308 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0022 × 0308 × 0020 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0022 × 0308 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0022 × 0308 × 0020 × 0085 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0022 × 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0022 × 0020 ÷ 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0022 × 0308 × 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0022 × 0308 × 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0022 × 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] DIGIT ZERO (NU) ÷ [0.3] × 0022 × 0020 ÷ 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0022 × 0308 × 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] DIGIT ZERO (NU) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0022 × 0308 × 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] DIGIT ZERO (NU) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0022 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0022 × 0020 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0022 × 0308 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0022 × 0308 × 0020 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0022 × 0308 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0022 × 0308 × 0020 × 0028 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0022 × 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] PERCENT SIGN (PO) ÷ [0.3] × 0022 × 0020 ÷ 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0022 × 0308 × 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] PERCENT SIGN (PO) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0022 × 0308 × 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] PERCENT SIGN (PO) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0022 × 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] DOLLAR SIGN (PR) ÷ [0.3] × 0022 × 0020 ÷ 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0022 × 0308 × 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] DOLLAR SIGN (PR) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0022 × 0308 × 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] DOLLAR SIGN (PR) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0022 × 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0022 × 0020 ÷ 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0022 × 0308 × 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0022 × 0308 × 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0022 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [0.3] × 0022 × 0020 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0022 × 0308 × 0020 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0022 × 0308 × 0020 × 0020 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0022 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0022 × 0020 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0022 × 0308 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0022 × 0308 × 0020 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0022 × 0308 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0022 × 0308 × 0020 × 002F ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0022 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0022 × 0020 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0022 × 0308 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0022 × 0308 × 0020 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0022 × 0308 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0022 × 0308 × 0020 × 2060 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0022 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0022 × 0020 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0022 × 0308 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0022 × 0308 × 0020 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0022 × 0308 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0022 × 0308 × 0020 × 200B ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0022 × 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0022 × 0020 ÷ 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0022 × 0308 × 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0022 × 0308 × 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0022 × 261D ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0022 × 0020 ÷ 261D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0022 × 0308 × 261D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 261D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0022 × 1F3FB ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0022 × 0020 ÷ 1F3FB ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0022 × 0308 × 1F3FB ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0022 × 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0022 × 0020 ÷ 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0022 × 0308 × 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0022 × 200D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0022 × 0020 ÷ 200D ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0022 × 0308 × 200D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 200D ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0022 × 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] SECTION SIGN (AI_AL) ÷ [0.3] × 0022 × 0020 ÷ 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0022 × 0308 × 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] SECTION SIGN (AI_AL) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0022 × 0308 × 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] SECTION SIGN (AI_AL) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0022 × 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] <reserved-50005> (XX_AL) ÷ [0.3] × 0022 × 0020 ÷ 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0022 × 0308 × 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] <reserved-50005> (XX_AL) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0022 × 0308 × 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] <reserved-50005> (XX_AL) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0022 × 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0022 × 0020 ÷ 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0022 × 0308 × 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0022 × 0308 × 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0022 × 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [19.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0022 × 0020 ÷ 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0022 × 0308 × 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0022 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0022 × 0308 × 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0022 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0020 ÷ 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0020 × 0020 ÷ 0023 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0020 ÷ 0308 × 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0020 ÷ 0308 × 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0020 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0020 × 0020 ÷ 2014 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0020 ÷ 0308 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0020 ÷ 0308 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0020 ÷ 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0020 × 0020 ÷ 0009 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0020 ÷ 0308 × 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0020 ÷ 0308 × 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0020 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0020 × 0020 ÷ 00B4 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0020 ÷ 0308 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0020 ÷ 0308 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0020 × 000B ÷ # × [0.3] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0020 × 0020 × 000B ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0020 ÷ 0308 × 000B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 000B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0020 ÷ 0308 × 000B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 000B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0020 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0020 × 0020 ÷ FFFC ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0020 ÷ 0308 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0020 ÷ 0308 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0020 × 007D ÷ # × [0.3] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0020 × 0020 × 007D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0020 ÷ 0308 × 007D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 007D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0020 ÷ 0308 × 007D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 007D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0020 × 0029 ÷ # × [0.3] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0020 × 0020 × 0029 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0020 ÷ 0308 × 0029 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 0029 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0020 × 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0020 ÷ 0308 × 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0020 ÷ 0308 × 0029 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 0029 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0020 × 000D ÷ # × [0.3] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0020 × 0020 × 000D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0020 ÷ 0308 × 000D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 000D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0020 ÷ 0308 × 000D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 000D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0020 × 0021 ÷ # × [0.3] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0020 × 0020 × 0021 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0020 ÷ 0308 × 0021 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 0021 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0020 ÷ 0308 × 0021 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 0021 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0020 ÷ 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0020 × 0020 ÷ 00A0 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0020 ÷ 0308 × 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0020 ÷ 0308 × 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0020 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0020 × 0020 ÷ AC00 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0020 ÷ 0308 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0020 ÷ 0308 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0020 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0020 × 0020 ÷ AC01 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0020 ÷ 0308 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0020 ÷ 0308 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0020 ÷ 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0020 × 0020 ÷ 05D0 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0020 ÷ 0308 × 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0020 ÷ 0308 × 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0020 ÷ 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0020 × 0020 ÷ 002D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0020 ÷ 0308 × 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0020 ÷ 0308 × 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0020 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0020 × 0020 ÷ 231A ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0020 ÷ 0308 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0020 ÷ 0308 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0020 ÷ 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0020 × 0020 ÷ 2024 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0020 ÷ 0308 × 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0020 ÷ 0308 × 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0020 × 002C ÷ # × [0.3] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0020 × 0020 × 002C ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0020 ÷ 0308 × 002C ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 002C ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0020 ÷ 0308 × 002C ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 002C ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0020 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0020 × 0020 ÷ 1100 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0020 ÷ 0308 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0020 ÷ 0308 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0020 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0020 × 0020 ÷ 11A8 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0020 ÷ 0308 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0020 ÷ 0308 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0020 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0020 × 0020 ÷ 1160 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0020 ÷ 0308 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0020 ÷ 0308 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0020 × 000A ÷ # × [0.3] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0020 × 0020 × 000A ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0020 ÷ 0308 × 000A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 000A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0020 ÷ 0308 × 000A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 000A ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0020 × 0085 ÷ # × [0.3] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0020 × 0020 × 0085 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0020 ÷ 0308 × 0085 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 0085 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0020 ÷ 0308 × 0085 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 0085 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0020 ÷ 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0020 × 0020 ÷ 17D6 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0020 ÷ 0308 × 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0020 ÷ 0308 × 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0020 ÷ 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0020 × 0020 ÷ 0030 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0020 ÷ 0308 × 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0020 ÷ 0308 × 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0020 ÷ 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0020 × 0020 ÷ 0028 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0020 ÷ 0308 × 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0020 ÷ 0308 × 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 0020 ÷ 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0020 × 0020 ÷ 0025 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0020 ÷ 0308 ÷ 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0020 ÷ 0308 × 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 0020 ÷ 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0020 × 0020 ÷ 0024 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0020 ÷ 0308 ÷ 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0020 ÷ 0308 × 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0020 ÷ 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0020 × 0020 ÷ 0022 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0020 ÷ 0308 × 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0020 ÷ 0308 × 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0020 × 0020 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0020 × 0020 × 0020 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 0020 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 0020 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0020 × 002F ÷ # × [0.3] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0020 × 0020 × 002F ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0020 ÷ 0308 × 002F ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 002F ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0020 ÷ 0308 × 002F ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 002F ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0020 × 2060 ÷ # × [0.3] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0020 × 0020 × 2060 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0020 ÷ 0308 × 2060 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 2060 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0020 ÷ 0308 × 2060 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 2060 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0020 × 200B ÷ # × [0.3] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0020 × 0020 × 200B ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0020 ÷ 0308 × 200B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0020 ÷ 0308 × 0020 × 200B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0020 ÷ 0308 × 200B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0020 ÷ 0308 × 0020 × 200B ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0020 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0020 × 0020 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0020 ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0020 ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0020 ÷ 261D ÷ # × [0.3] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0020 × 0020 ÷ 261D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0020 ÷ 0308 ÷ 261D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0020 ÷ 1F3FB ÷ # × [0.3] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0020 × 0020 ÷ 1F3FB ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0020 ÷ 0308 ÷ 1F3FB ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0020 × 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0020 ÷ 0308 × 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0020 ÷ 200D ÷ # × [0.3] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0020 × 0020 ÷ 200D ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0020 ÷ 0308 × 200D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0020 ÷ 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0020 × 0020 ÷ 00A7 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0020 ÷ 0308 × 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0020 ÷ 0308 × 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0020 ÷ 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0020 × 0020 ÷ 50005 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0020 ÷ 0308 × 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0020 ÷ 0308 × 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0020 ÷ 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0020 × 0020 ÷ 0E01 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0020 ÷ 0308 × 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0020 ÷ 0308 × 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0020 ÷ 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0020 × 0020 ÷ 3041 ÷ # × [0.3] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0020 ÷ 0308 × 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0020 ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0020 ÷ 0308 × 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0020 ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 002F ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 002F × 0020 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 002F × 0308 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 002F × 0308 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0023 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 002F ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 002F × 0020 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 002F × 0308 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 002F × 0308 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 2014 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 002F × 0009 ÷ # × [0.3] SOLIDUS (SY) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 002F × 0020 ÷ 0009 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 002F × 0308 × 0009 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0009 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 002F × 0308 × 0009 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0009 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 002F ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 002F × 0020 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 002F × 0308 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 002F × 0308 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 002F × 000B ÷ # × [0.3] SOLIDUS (SY) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 002F × 0020 × 000B ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 002F × 0308 × 000B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 002F × 0308 × 0020 × 000B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 002F × 0308 × 000B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 002F × 0308 × 0020 × 000B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 002F ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 002F × 0020 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 002F × 0308 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 002F × 0308 × 0020 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 002F × 0308 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 002F × 0308 × 0020 ÷ FFFC ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 002F × 007D ÷ # × [0.3] SOLIDUS (SY) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 002F × 0020 × 007D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 002F × 0308 × 007D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 002F × 0308 × 0020 × 007D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 002F × 0308 × 007D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 002F × 0308 × 0020 × 007D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 002F × 0029 ÷ # × [0.3] SOLIDUS (SY) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 002F × 0020 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002F × 0308 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002F × 0308 × 0020 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 002F × 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 002F × 0020 ÷ 0001 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 002F × 0308 × 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 002F × 0308 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 002F × 0308 × 0020 × 0029 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 002F × 000D ÷ # × [0.3] SOLIDUS (SY) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 002F × 0020 × 000D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 002F × 0308 × 000D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 002F × 0308 × 0020 × 000D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 002F × 0308 × 000D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 002F × 0308 × 0020 × 000D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 002F × 0021 ÷ # × [0.3] SOLIDUS (SY) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 002F × 0020 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 002F × 0308 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 002F × 0308 × 0020 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 002F × 0308 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 002F × 0308 × 0020 × 0021 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 002F × 00A0 ÷ # × [0.3] SOLIDUS (SY) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 002F × 0020 ÷ 00A0 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 002F × 0308 × 00A0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 002F × 0308 × 00A0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 002F ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 002F × 0020 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 002F × 0308 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 002F × 0308 × 0020 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 002F × 0308 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 002F × 0308 × 0020 ÷ AC00 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 002F ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 002F × 0020 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 002F × 0308 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 002F × 0308 × 0020 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 002F × 0308 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 002F × 0308 × 0020 ÷ AC01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 002F × 05D0 ÷ # × [0.3] SOLIDUS (SY) × [21.2] HEBREW LETTER ALEF (HL) ÷ [0.3] × 002F × 0020 ÷ 05D0 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 002F × 0308 × 05D0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.2] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 002F × 0308 × 05D0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.2] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 002F × 002D ÷ # × [0.3] SOLIDUS (SY) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 002F × 0020 ÷ 002D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 002F × 0308 × 002D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 002D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 002F × 0308 × 002D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 002D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 002F ÷ 231A ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] WATCH (ID) ÷ [0.3] × 002F × 0020 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 002F × 0308 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 002F × 0308 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 231A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 002F ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 002F × 0020 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 002F × 0308 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 002F × 0308 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 2024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 002F × 002C ÷ # × [0.3] SOLIDUS (SY) × [13.02] COMMA (IS) ÷ [0.3] × 002F × 0020 × 002C ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 002F × 0308 × 002C ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 002F × 0308 × 0020 × 002C ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 002F × 0308 × 002C ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 002F × 0308 × 0020 × 002C ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 002F ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 002F × 0020 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 002F × 0308 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 002F × 0308 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 1100 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 002F ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 002F × 0020 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 002F × 0308 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 002F × 0308 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 002F ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 002F × 0020 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 002F × 0308 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 002F × 0308 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 1160 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 002F × 000A ÷ # × [0.3] SOLIDUS (SY) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 002F × 0020 × 000A ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 002F × 0308 × 000A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 002F × 0308 × 0020 × 000A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 002F × 0308 × 000A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 002F × 0308 × 0020 × 000A ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 002F × 0085 ÷ # × [0.3] SOLIDUS (SY) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 002F × 0020 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 002F × 0308 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 002F × 0308 × 0020 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 002F × 0308 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 002F × 0308 × 0020 × 0085 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 002F × 17D6 ÷ # × [0.3] SOLIDUS (SY) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 002F × 0020 ÷ 17D6 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 002F × 0308 × 17D6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 002F × 0308 × 17D6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 002F ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 002F × 0020 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 002F × 0308 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 002F × 0308 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0030 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 002F ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 002F × 0020 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 002F × 0308 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 002F × 0308 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0028 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 002F ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 002F × 0020 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 002F × 0308 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 002F × 0308 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0025 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 002F ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 002F × 0020 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 002F × 0308 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 002F × 0308 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0024 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 002F × 0022 ÷ # × [0.3] SOLIDUS (SY) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 002F × 0020 ÷ 0022 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 002F × 0308 × 0022 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0022 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 002F × 0308 × 0022 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0022 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 002F × 0020 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [0.3] × 002F × 0020 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 002F × 0308 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 002F × 0308 × 0020 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 002F × 0308 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 002F × 0308 × 0020 × 0020 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 002F × 002F ÷ # × [0.3] SOLIDUS (SY) × [13.02] SOLIDUS (SY) ÷ [0.3] × 002F × 0020 × 002F ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 002F × 0308 × 002F ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 002F × 0308 × 0020 × 002F ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 002F × 0308 × 002F ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 002F × 0308 × 0020 × 002F ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 002F × 2060 ÷ # × [0.3] SOLIDUS (SY) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 002F × 0020 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 002F × 0308 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 002F × 0308 × 0020 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 002F × 0308 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 002F × 0308 × 0020 × 2060 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 002F × 200B ÷ # × [0.3] SOLIDUS (SY) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 002F × 0020 × 200B ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 002F × 0308 × 200B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 002F × 0308 × 0020 × 200B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 002F × 0308 × 200B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 002F × 0308 × 0020 × 200B ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 002F ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 002F × 0020 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 002F × 0308 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002F × 0308 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 002F ÷ 261D ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002F × 0020 ÷ 261D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002F × 0308 ÷ 261D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 261D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 002F ÷ 1F3FB ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002F × 0020 ÷ 1F3FB ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002F × 0308 ÷ 1F3FB ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 002F × 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002F × 0020 ÷ 0001 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002F × 0308 × 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0001 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 002F × 200D ÷ # × [0.3] SOLIDUS (SY) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002F × 0020 ÷ 200D ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002F × 0308 × 200D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 200D ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 002F ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 002F × 0020 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 002F × 0308 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 002F × 0308 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 002F ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 002F × 0020 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 002F × 0308 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 002F × 0308 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 50005 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 002F ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 002F × 0020 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 002F × 0308 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 002F × 0308 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 002F × 3041 ÷ # × [0.3] SOLIDUS (SY) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 002F × 0020 ÷ 3041 ÷ # × [0.3] SOLIDUS (SY) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 002F × 0308 × 3041 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 002F × 0308 × 0020 ÷ 3041 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 002F × 0308 × 3041 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 002F × 0308 × 0020 ÷ 3041 ÷ # × [0.3] SOLIDUS (SY) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 2060 × 0023 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] NUMBER SIGN (AL) ÷ [0.3] × 2060 × 0020 ÷ 0023 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 2060 × 0308 × 0023 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] NUMBER SIGN (AL) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 2060 × 0308 × 0023 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] NUMBER SIGN (AL) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 2060 × 2014 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] EM DASH (B2) ÷ [0.3] × 2060 × 0020 ÷ 2014 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 2060 × 0308 × 2014 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] EM DASH (B2) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 2060 × 0308 × 2014 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] EM DASH (B2) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 2060 × 0009 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] <CHARACTER TABULATION> (BA) ÷ [0.3] × 2060 × 0020 ÷ 0009 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 2060 × 0308 × 0009 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 2060 × 0308 × 0009 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 2060 × 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] ACUTE ACCENT (BB) ÷ [0.3] × 2060 × 0020 ÷ 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 2060 × 0308 × 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] ACUTE ACCENT (BB) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 2060 × 0308 × 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] ACUTE ACCENT (BB) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 2060 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 2060 × 0020 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 2060 × 0308 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 2060 × 0308 × 0020 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 2060 × 0308 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 2060 × 0308 × 0020 × 000B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 2060 × FFFC ÷ # × [0.3] WORD JOINER (WJ) × [11.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 2060 × 0020 ÷ FFFC ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 2060 × 0308 × FFFC ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 2060 × 0308 × FFFC ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 2060 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [11.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 2060 × 0020 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 2060 × 0308 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 2060 × 0308 × 0020 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 2060 × 0308 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 2060 × 0308 × 0020 × 007D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 2060 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 2060 × 0020 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2060 × 0308 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2060 × 0308 × 0020 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 2060 × 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 2060 × 0020 ÷ 0001 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 2060 × 0308 × 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 2060 × 0308 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 2060 × 0308 × 0020 × 0029 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 2060 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 2060 × 0020 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 2060 × 0308 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 2060 × 0308 × 0020 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 2060 × 0308 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 2060 × 0308 × 0020 × 000D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 2060 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] EXCLAMATION MARK (EX) ÷ [0.3] × 2060 × 0020 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 2060 × 0308 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] EXCLAMATION MARK (EX) ÷ [0.3] -× 2060 × 0308 × 0020 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 2060 × 0308 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] EXCLAMATION MARK (EX) ÷ [0.3] +× 2060 × 0308 × 0020 × 0021 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 2060 × 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] NO-BREAK SPACE (GL) ÷ [0.3] × 2060 × 0020 ÷ 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 2060 × 0308 × 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] NO-BREAK SPACE (GL) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 2060 × 0308 × 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] NO-BREAK SPACE (GL) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 2060 × AC00 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 2060 × 0020 ÷ AC00 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 2060 × 0308 × AC00 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 2060 × 0308 × AC00 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 2060 × AC01 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 2060 × 0020 ÷ AC01 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 2060 × 0308 × AC01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 2060 × 0308 × AC01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 2060 × 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HEBREW LETTER ALEF (HL) ÷ [0.3] × 2060 × 0020 ÷ 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 2060 × 0308 × 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 2060 × 0308 × 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 2060 × 002D ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HYPHEN-MINUS (HY) ÷ [0.3] × 2060 × 0020 ÷ 002D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 2060 × 0308 × 002D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 002D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 2060 × 0308 × 002D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 002D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 2060 × 231A ÷ # × [0.3] WORD JOINER (WJ) × [11.02] WATCH (ID) ÷ [0.3] × 2060 × 0020 ÷ 231A ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 2060 × 0308 × 231A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] WATCH (ID) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 231A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 2060 × 0308 × 231A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] WATCH (ID) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 231A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 2060 × 2024 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] ONE DOT LEADER (IN) ÷ [0.3] × 2060 × 0020 ÷ 2024 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 2060 × 0308 × 2024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] ONE DOT LEADER (IN) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 2060 × 0308 × 2024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] ONE DOT LEADER (IN) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 2060 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [11.02] COMMA (IS) ÷ [0.3] × 2060 × 0020 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 2060 × 0308 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] COMMA (IS) ÷ [0.3] -× 2060 × 0308 × 0020 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 2060 × 0308 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] COMMA (IS) ÷ [0.3] +× 2060 × 0308 × 0020 × 002C ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 2060 × 1100 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 2060 × 0020 ÷ 1100 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 2060 × 0308 × 1100 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 2060 × 0308 × 1100 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 2060 × 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 2060 × 0020 ÷ 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 2060 × 0308 × 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 2060 × 0308 × 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 2060 × 1160 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 2060 × 0020 ÷ 1160 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 2060 × 0308 × 1160 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 2060 × 0308 × 1160 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 2060 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 2060 × 0020 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 2060 × 0308 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 2060 × 0308 × 0020 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 2060 × 0308 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 2060 × 0308 × 0020 × 000A ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 2060 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 2060 × 0020 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 2060 × 0308 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 2060 × 0308 × 0020 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 2060 × 0308 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 2060 × 0308 × 0020 × 0085 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 2060 × 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 2060 × 0020 ÷ 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 2060 × 0308 × 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 2060 × 0308 × 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 2060 × 0030 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] DIGIT ZERO (NU) ÷ [0.3] × 2060 × 0020 ÷ 0030 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 2060 × 0308 × 0030 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] DIGIT ZERO (NU) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 2060 × 0308 × 0030 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] DIGIT ZERO (NU) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 2060 × 0028 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] LEFT PARENTHESIS (OP) ÷ [0.3] × 2060 × 0020 ÷ 0028 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 2060 × 0308 × 0028 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] LEFT PARENTHESIS (OP) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 2060 × 0308 × 0028 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] LEFT PARENTHESIS (OP) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 2060 × 0025 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] PERCENT SIGN (PO) ÷ [0.3] × 2060 × 0020 ÷ 0025 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 2060 × 0308 × 0025 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] PERCENT SIGN (PO) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 2060 × 0308 × 0025 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] PERCENT SIGN (PO) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 2060 × 0024 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] DOLLAR SIGN (PR) ÷ [0.3] × 2060 × 0020 ÷ 0024 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 2060 × 0308 × 0024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] DOLLAR SIGN (PR) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 2060 × 0308 × 0024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] DOLLAR SIGN (PR) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 2060 × 0022 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] QUOTATION MARK (QU) ÷ [0.3] × 2060 × 0020 ÷ 0022 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 2060 × 0308 × 0022 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] QUOTATION MARK (QU) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 2060 × 0308 × 0022 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] QUOTATION MARK (QU) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 2060 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [0.3] × 2060 × 0020 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 2060 × 0308 × 0020 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 2060 × 0308 × 0020 × 0020 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 2060 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [11.02] SOLIDUS (SY) ÷ [0.3] × 2060 × 0020 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 2060 × 0308 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] SOLIDUS (SY) ÷ [0.3] -× 2060 × 0308 × 0020 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 2060 × 0308 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] SOLIDUS (SY) ÷ [0.3] +× 2060 × 0308 × 0020 × 002F ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 2060 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 2060 × 0020 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 2060 × 0308 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 2060 × 0308 × 0020 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 2060 × 0308 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 2060 × 0308 × 0020 × 2060 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 2060 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 2060 × 0020 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 2060 × 0308 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 2060 × 0308 × 0020 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 2060 × 0308 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 2060 × 0308 × 0020 × 200B ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 2060 × 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 2060 × 0020 ÷ 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 2060 × 0308 × 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2060 × 0308 × 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 2060 × 261D ÷ # × [0.3] WORD JOINER (WJ) × [11.02] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2060 × 0020 ÷ 261D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2060 × 0308 × 261D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 261D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 2060 × 1F3FB ÷ # × [0.3] WORD JOINER (WJ) × [11.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2060 × 0020 ÷ 1F3FB ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2060 × 0308 × 1F3FB ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 2060 × 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2060 × 0020 ÷ 0001 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2060 × 0308 × 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 2060 × 200D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2060 × 0020 ÷ 200D ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2060 × 0308 × 200D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 200D ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 2060 × 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] SECTION SIGN (AI_AL) ÷ [0.3] × 2060 × 0020 ÷ 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 2060 × 0308 × 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] SECTION SIGN (AI_AL) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 2060 × 0308 × 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] SECTION SIGN (AI_AL) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 2060 × 50005 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] <reserved-50005> (XX_AL) ÷ [0.3] × 2060 × 0020 ÷ 50005 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 2060 × 0308 × 50005 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] <reserved-50005> (XX_AL) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 2060 × 0308 × 50005 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] <reserved-50005> (XX_AL) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 2060 × 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 2060 × 0020 ÷ 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 2060 × 0308 × 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 2060 × 0308 × 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 2060 × 3041 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 2060 × 0020 ÷ 3041 ÷ # × [0.3] WORD JOINER (WJ) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 2060 × 0308 × 3041 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [11.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 2060 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 2060 × 0308 × 3041 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 2060 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WORD JOINER (WJ) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 200B ÷ 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] NUMBER SIGN (AL) ÷ [0.3] × 200B × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] NUMBER SIGN (AL) ÷ [0.3] -× 200B ÷ 0308 × 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 200B ÷ 0308 × 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 200B ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] EM DASH (B2) ÷ [0.3] × 200B × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] EM DASH (B2) ÷ [0.3] -× 200B ÷ 0308 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 200B ÷ 0308 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 200B ÷ 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 200B × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 200B ÷ 0308 × 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 200B ÷ 0308 × 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 200B ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] ACUTE ACCENT (BB) ÷ [0.3] × 200B × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] ACUTE ACCENT (BB) ÷ [0.3] -× 200B ÷ 0308 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 200B ÷ 0308 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 200B × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 200B × 0020 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 200B ÷ 0308 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 200B ÷ 0308 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 000B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 200B ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 200B × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 200B ÷ 0308 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 200B ÷ 0308 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 200B ÷ 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 200B × 0020 ÷ 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 200B ÷ 0308 × 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 200B ÷ 0308 × 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 007D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 200B ÷ 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] RIGHT PARENTHESIS (CP) ÷ [0.3] × 200B × 0020 ÷ 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 200B ÷ 0308 × 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 200B ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] <START OF HEADING> (CM) ÷ [0.3] -× 200B × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] <START OF HEADING> (CM) ÷ [0.3] -× 200B ÷ 0308 × 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 200B ÷ 0308 × 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 0029 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 200B × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 200B × 0020 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 200B ÷ 0308 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 200B ÷ 0308 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 000D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 200B ÷ 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] EXCLAMATION MARK (EX) ÷ [0.3] × 200B × 0020 ÷ 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] EXCLAMATION MARK (EX) ÷ [0.3] -× 200B ÷ 0308 × 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 200B ÷ 0308 × 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 0021 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 200B ÷ 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] NO-BREAK SPACE (GL) ÷ [0.3] × 200B × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 200B ÷ 0308 × 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 200B ÷ 0308 × 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 200B ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 200B × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 200B ÷ 0308 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 200B ÷ 0308 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 200B ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 200B × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 200B ÷ 0308 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 200B ÷ 0308 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 200B ÷ 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 200B × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 200B ÷ 0308 × 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 200B ÷ 0308 × 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 200B ÷ 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HYPHEN-MINUS (HY) ÷ [0.3] × 200B × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 200B ÷ 0308 × 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 200B ÷ 0308 × 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 200B ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] WATCH (ID) ÷ [0.3] × 200B × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] WATCH (ID) ÷ [0.3] -× 200B ÷ 0308 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 200B ÷ 0308 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 200B ÷ 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] ONE DOT LEADER (IN) ÷ [0.3] × 200B × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] ONE DOT LEADER (IN) ÷ [0.3] -× 200B ÷ 0308 × 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 200B ÷ 0308 × 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 200B ÷ 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMMA (IS) ÷ [0.3] × 200B × 0020 ÷ 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] COMMA (IS) ÷ [0.3] -× 200B ÷ 0308 × 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 200B ÷ 0308 × 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 002C ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 200B ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 200B × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 200B ÷ 0308 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 200B ÷ 0308 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 200B ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 200B × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 200B ÷ 0308 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 200B ÷ 0308 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 200B ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 200B × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 200B ÷ 0308 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 200B ÷ 0308 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 200B × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 200B × 0020 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 200B ÷ 0308 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 200B ÷ 0308 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 000A ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 200B × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 200B × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 200B ÷ 0308 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 200B ÷ 0308 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 200B ÷ 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 200B × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 200B ÷ 0308 × 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 200B ÷ 0308 × 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 200B ÷ 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] DIGIT ZERO (NU) ÷ [0.3] × 200B × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] DIGIT ZERO (NU) ÷ [0.3] -× 200B ÷ 0308 × 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 200B ÷ 0308 × 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 200B ÷ 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 200B × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 200B ÷ 0308 × 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 200B ÷ 0308 × 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 200B ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] PERCENT SIGN (PO) ÷ [0.3] × 200B × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] PERCENT SIGN (PO) ÷ [0.3] -× 200B ÷ 0308 ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 200B ÷ 0308 × 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 200B ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] DOLLAR SIGN (PR) ÷ [0.3] × 200B × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] DOLLAR SIGN (PR) ÷ [0.3] -× 200B ÷ 0308 ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 200B ÷ 0308 × 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 200B ÷ 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] QUOTATION MARK (QU) ÷ [0.3] × 200B × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] QUOTATION MARK (QU) ÷ [0.3] -× 200B ÷ 0308 × 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 200B ÷ 0308 × 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 200B × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [0.3] × 200B × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 200B ÷ 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] SOLIDUS (SY) ÷ [0.3] × 200B × 0020 ÷ 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] SOLIDUS (SY) ÷ [0.3] -× 200B ÷ 0308 × 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 200B ÷ 0308 × 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 002F ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 200B ÷ 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] WORD JOINER (WJ) ÷ [0.3] × 200B × 0020 ÷ 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] WORD JOINER (WJ) ÷ [0.3] -× 200B ÷ 0308 × 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 200B ÷ 0308 × 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 2060 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 200B × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 200B × 0020 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 200B ÷ 0308 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 200B ÷ 0308 × 0020 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 200B ÷ 0308 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 200B ÷ 0308 × 0020 × 200B ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 200B ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 200B × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 200B ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 200B ÷ 0308 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 200B ÷ 261D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 200B × 0020 ÷ 261D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 200B ÷ 0308 ÷ 261D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 261D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 200B ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 200B × 0020 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 200B ÷ 0308 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 200B ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 200B × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 200B ÷ 0308 × 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 200B ÷ 200D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 200B × 0020 ÷ 200D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 200B ÷ 0308 × 200D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 200D ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 200B ÷ 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] SECTION SIGN (AI_AL) ÷ [0.3] × 200B × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 200B ÷ 0308 × 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 200B ÷ 0308 × 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 200B ÷ 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] <reserved-50005> (XX_AL) ÷ [0.3] × 200B × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 200B ÷ 0308 × 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 200B ÷ 0308 × 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 200B ÷ 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 200B × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 200B ÷ 0308 × 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 200B ÷ 0308 × 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 200B ÷ 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 200B × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) × [7.01] SPACE (SP) ÷ [8.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 200B ÷ 0308 × 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 200B ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 200B ÷ 0308 × 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 200B ÷ 0308 × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH SPACE (ZW) ÷ [8.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 1F1E6 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 1F1E6 × 0020 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 1F1E6 × 0308 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 1F1E6 × 0308 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 1F1E6 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 1F1E6 × 0020 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 1F1E6 × 0308 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 1F1E6 × 0308 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 1F1E6 × 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 1F1E6 × 0020 ÷ 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 1F1E6 × 0308 × 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1F1E6 × 0308 × 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 1F1E6 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 1F1E6 × 0020 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 1F1E6 × 0308 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1F1E6 × 0308 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 1F1E6 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 1F1E6 × 0020 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 1F1E6 × 0308 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1F1E6 × 0308 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 000B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 1F1E6 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 1F1E6 × 0020 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 1F1E6 × 0308 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1F1E6 × 0308 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 1F1E6 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 1F1E6 × 0020 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 1F1E6 × 0308 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1F1E6 × 0308 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 007D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 1F1E6 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 1F1E6 × 0020 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1F1E6 × 0308 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 1F1E6 × 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 1F1E6 × 0020 ÷ 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 1F1E6 × 0308 × 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 1F1E6 × 0308 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 0029 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 1F1E6 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 1F1E6 × 0020 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 1F1E6 × 0308 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1F1E6 × 0308 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 000D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 1F1E6 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 1F1E6 × 0020 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 1F1E6 × 0308 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1F1E6 × 0308 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 0021 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 1F1E6 × 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 1F1E6 × 0020 ÷ 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 1F1E6 × 0308 × 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 1F1E6 × 0308 × 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 1F1E6 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 1F1E6 × 0020 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 1F1E6 × 0308 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1F1E6 × 0308 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 1F1E6 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 1F1E6 × 0020 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 1F1E6 × 0308 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1F1E6 × 0308 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 1F1E6 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 1F1E6 × 0020 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 1F1E6 × 0308 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1F1E6 × 0308 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 1F1E6 × 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 1F1E6 × 0020 ÷ 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 1F1E6 × 0308 × 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 1F1E6 × 0308 × 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 002D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 1F1E6 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WATCH (ID) ÷ [0.3] × 1F1E6 × 0020 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 1F1E6 × 0308 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 1F1E6 × 0308 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 231A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 1F1E6 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 1F1E6 × 0020 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 1F1E6 × 0308 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 1F1E6 × 0308 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 1F1E6 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.02] COMMA (IS) ÷ [0.3] × 1F1E6 × 0020 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 1F1E6 × 0308 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 1F1E6 × 0308 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 002C ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 1F1E6 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 1F1E6 × 0020 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 1F1E6 × 0308 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1F1E6 × 0308 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 1F1E6 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 1F1E6 × 0020 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 1F1E6 × 0308 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1F1E6 × 0308 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 1F1E6 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 1F1E6 × 0020 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 1F1E6 × 0308 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1F1E6 × 0308 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 1F1E6 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 1F1E6 × 0020 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 1F1E6 × 0308 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1F1E6 × 0308 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 000A ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 1F1E6 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 1F1E6 × 0020 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 1F1E6 × 0308 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1F1E6 × 0308 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 0085 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 1F1E6 × 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 1F1E6 × 0020 ÷ 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 1F1E6 × 0308 × 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1F1E6 × 0308 × 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 1F1E6 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 1F1E6 × 0020 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 1F1E6 × 0308 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 1F1E6 × 0308 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 1F1E6 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 1F1E6 × 0020 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 1F1E6 × 0308 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1F1E6 × 0308 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 1F1E6 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 1F1E6 × 0020 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 1F1E6 × 0308 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 1F1E6 × 0308 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 1F1E6 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 1F1E6 × 0020 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 1F1E6 × 0308 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1F1E6 × 0308 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 1F1E6 × 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 1F1E6 × 0020 ÷ 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 1F1E6 × 0308 × 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 1F1E6 × 0308 × 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 1F1E6 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [0.3] × 1F1E6 × 0020 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 0020 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 1F1E6 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [13.02] SOLIDUS (SY) ÷ [0.3] × 1F1E6 × 0020 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 1F1E6 × 0308 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 1F1E6 × 0308 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 002F ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 1F1E6 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 1F1E6 × 0020 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 1F1E6 × 0308 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1F1E6 × 0308 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 2060 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 1F1E6 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 1F1E6 × 0020 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 1F1E6 × 0308 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 1F1E6 × 0308 × 0020 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1F1E6 × 0308 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1F1E6 × 0308 × 0020 × 200B ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 1F1E6 × 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 1F1E6 × 0020 ÷ 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 1F1E6 × 0308 × 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [30.11] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1F1E6 × 0308 × 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.11] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1F1E6 ÷ 261D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1F1E6 × 0020 ÷ 261D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1F1E6 × 0308 ÷ 261D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 261D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1F1E6 ÷ 1F3FB ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1F1E6 × 0020 ÷ 1F3FB ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1F1E6 × 0308 ÷ 1F3FB ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1F1E6 × 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1F1E6 × 0020 ÷ 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1F1E6 × 0308 × 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1F1E6 × 200D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1F1E6 × 0020 ÷ 200D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1F1E6 × 0308 × 200D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 200D ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 1F1E6 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 1F1E6 × 0020 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 1F1E6 × 0308 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1F1E6 × 0308 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 1F1E6 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 1F1E6 × 0020 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 1F1E6 × 0308 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1F1E6 × 0308 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 1F1E6 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 1F1E6 × 0020 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 1F1E6 × 0308 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1F1E6 × 0308 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 1F1E6 × 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 1F1E6 × 0020 ÷ 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 1F1E6 × 0308 × 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 1F1E6 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1F1E6 × 0308 × 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1F1E6 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 261D ÷ 0023 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 261D × 0020 ÷ 0023 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 261D × 0308 ÷ 0023 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 261D ÷ 2014 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 261D × 0020 ÷ 2014 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 261D × 0308 ÷ 2014 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 261D × 0009 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 261D × 0020 ÷ 0009 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 261D × 0308 × 0009 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 261D ÷ 00B4 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 261D × 0020 ÷ 00B4 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 261D × 0308 ÷ 00B4 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 261D × 000B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 261D × 0020 × 000B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 261D × 0308 × 000B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 261D × 0308 × 0020 × 000B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 261D ÷ FFFC ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 261D × 0020 ÷ FFFC ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 261D × 0308 ÷ FFFC ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 261D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 261D × 007D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 261D × 0020 × 007D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 261D × 0308 × 007D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 261D × 0308 × 0020 × 007D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 261D × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 261D × 0020 × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 261D × 0308 × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 261D × 0308 × 0020 × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 261D × 000D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 261D × 0020 × 000D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 261D × 0308 × 000D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 261D × 0308 × 0020 × 000D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 261D × 0021 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 261D × 0020 × 0021 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 261D × 0308 × 0021 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 261D × 0308 × 0020 × 0021 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 261D × 00A0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] +× 261D × 0020 ÷ 00A0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 261D × 0308 × 00A0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 261D ÷ AC00 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 261D × 0020 ÷ AC00 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 261D × 0308 ÷ AC00 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 261D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 261D ÷ AC01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 261D × 0020 ÷ AC01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 261D × 0308 ÷ AC01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 261D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 261D ÷ 05D0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 261D × 0020 ÷ 05D0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 261D × 0308 ÷ 05D0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 261D × 002D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 261D × 0020 ÷ 002D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 261D × 0308 × 002D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 002D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 261D ÷ 231A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 261D × 0020 ÷ 231A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 261D × 0308 ÷ 231A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 231A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 261D × 2024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [22.03] ONE DOT LEADER (IN) ÷ [0.3] +× 261D × 0020 ÷ 2024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 261D × 0308 × 2024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 261D × 002C ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] COMMA (IS) ÷ [0.3] +× 261D × 0020 × 002C ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 261D × 0308 × 002C ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 261D × 0308 × 0020 × 002C ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 261D ÷ 1100 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 261D × 0020 ÷ 1100 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 261D × 0308 ÷ 1100 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 261D ÷ 11A8 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 261D × 0020 ÷ 11A8 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 261D × 0308 ÷ 11A8 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 261D ÷ 1160 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 261D × 0020 ÷ 1160 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 261D × 0308 ÷ 1160 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 261D × 000A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 261D × 0020 × 000A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 261D × 0308 × 000A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 261D × 0308 × 0020 × 000A ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 261D × 0085 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 261D × 0020 × 0085 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 261D × 0308 × 0085 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 261D × 0308 × 0020 × 0085 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 261D × 17D6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 261D × 0020 ÷ 17D6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 261D × 0308 × 17D6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 261D ÷ 0030 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 261D × 0020 ÷ 0030 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 261D × 0308 ÷ 0030 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 261D ÷ 0028 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 261D × 0020 ÷ 0028 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 261D × 0308 ÷ 0028 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 261D × 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [23.13] PERCENT SIGN (PO) ÷ [0.3] +× 261D × 0020 ÷ 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 261D × 0308 × 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.13] PERCENT SIGN (PO) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 261D ÷ 0024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 261D × 0020 ÷ 0024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 261D × 0308 ÷ 0024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 261D × 0022 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 261D × 0020 ÷ 0022 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 261D × 0308 × 0022 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 261D × 0020 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [0.3] +× 261D × 0020 × 0020 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 261D × 0308 × 0020 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 261D × 0308 × 0020 × 0020 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 261D × 002F ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 261D × 0020 × 002F ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 261D × 0308 × 002F ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 261D × 0308 × 0020 × 002F ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 261D × 2060 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 261D × 0020 × 2060 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 261D × 0308 × 2060 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 261D × 0308 × 0020 × 2060 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 261D × 200B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 261D × 0020 × 200B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 261D × 0308 × 200B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 261D × 0308 × 0020 × 200B ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 261D ÷ 1F1E6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 261D × 0020 ÷ 1F1E6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 261D × 0308 ÷ 1F1E6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 261D ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 261D × 0020 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 261D × 0308 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 261D × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 261D × 0020 ÷ 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 261D × 0308 × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 261D × 0001 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 261D × 0020 ÷ 0001 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 261D × 0308 × 0001 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 261D × 200D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 261D × 0020 ÷ 200D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 261D × 0308 × 200D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 200D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 261D ÷ 00A7 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 261D × 0020 ÷ 00A7 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 261D × 0308 ÷ 00A7 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 261D ÷ 50005 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 261D × 0020 ÷ 50005 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 261D × 0308 ÷ 50005 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 261D ÷ 0E01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 261D × 0020 ÷ 0E01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 261D × 0308 ÷ 0E01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 261D × 3041 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 261D × 0020 ÷ 3041 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 261D × 0308 × 3041 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 261D × 0308 × 0020 ÷ 3041 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1F3FB ÷ 0023 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 1F3FB × 0020 ÷ 0023 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 1F3FB × 0308 ÷ 0023 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0023 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 1F3FB ÷ 2014 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 1F3FB × 0020 ÷ 2014 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 1F3FB × 0308 ÷ 2014 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 2014 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 1F3FB × 0009 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1F3FB × 0020 ÷ 0009 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1F3FB × 0308 × 0009 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0009 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 1F3FB ÷ 00B4 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1F3FB × 0020 ÷ 00B4 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1F3FB × 0308 ÷ 00B4 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 1F3FB × 000B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1F3FB × 0020 × 000B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1F3FB × 0308 × 000B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 000B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 1F3FB ÷ FFFC ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1F3FB × 0020 ÷ FFFC ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1F3FB × 0308 ÷ FFFC ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ FFFC ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 1F3FB × 007D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1F3FB × 0020 × 007D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1F3FB × 0308 × 007D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 007D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 1F3FB × 0029 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 1F3FB × 0020 × 0029 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 1F3FB × 0308 × 0029 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 0029 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 1F3FB × 000D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1F3FB × 0020 × 000D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1F3FB × 0308 × 000D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 000D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 1F3FB × 0021 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1F3FB × 0020 × 0021 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1F3FB × 0308 × 0021 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 0021 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 1F3FB × 00A0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] +× 1F3FB × 0020 ÷ 00A0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 1F3FB × 0308 × 00A0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 1F3FB ÷ AC00 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1F3FB × 0020 ÷ AC00 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1F3FB × 0308 ÷ AC00 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ AC00 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 1F3FB ÷ AC01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1F3FB × 0020 ÷ AC01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1F3FB × 0308 ÷ AC01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ AC01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 1F3FB ÷ 05D0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1F3FB × 0020 ÷ 05D0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1F3FB × 0308 ÷ 05D0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 1F3FB × 002D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 1F3FB × 0020 ÷ 002D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 1F3FB × 0308 × 002D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 002D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 1F3FB ÷ 231A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 1F3FB × 0020 ÷ 231A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 1F3FB × 0308 ÷ 231A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 231A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 1F3FB × 2024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3] +× 1F3FB × 0020 ÷ 2024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 1F3FB × 0308 × 2024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.03] ONE DOT LEADER (IN) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 2024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 1F3FB × 002C ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.02] COMMA (IS) ÷ [0.3] +× 1F3FB × 0020 × 002C ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 1F3FB × 0308 × 002C ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 002C ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 1F3FB ÷ 1100 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1F3FB × 0020 ÷ 1100 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1F3FB × 0308 ÷ 1100 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 1100 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 1F3FB ÷ 11A8 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1F3FB × 0020 ÷ 11A8 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1F3FB × 0308 ÷ 11A8 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1F3FB ÷ 1160 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1F3FB × 0020 ÷ 1160 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1F3FB × 0308 ÷ 1160 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 1160 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1F3FB × 000A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1F3FB × 0020 × 000A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1F3FB × 0308 × 000A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 000A ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 1F3FB × 0085 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1F3FB × 0020 × 0085 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1F3FB × 0308 × 0085 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 0085 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 1F3FB × 17D6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1F3FB × 0020 ÷ 17D6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1F3FB × 0308 × 17D6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 1F3FB ÷ 0030 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 1F3FB × 0020 ÷ 0030 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 1F3FB × 0308 ÷ 0030 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0030 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 1F3FB ÷ 0028 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1F3FB × 0020 ÷ 0028 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1F3FB × 0308 ÷ 0028 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0028 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 1F3FB × 0025 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [23.13] PERCENT SIGN (PO) ÷ [0.3] +× 1F3FB × 0020 ÷ 0025 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 1F3FB × 0308 × 0025 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.13] PERCENT SIGN (PO) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0025 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 1F3FB ÷ 0024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1F3FB × 0020 ÷ 0024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1F3FB × 0308 ÷ 0024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0024 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 1F3FB × 0022 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 1F3FB × 0020 ÷ 0022 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 1F3FB × 0308 × 0022 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0022 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 1F3FB × 0020 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [0.3] +× 1F3FB × 0020 × 0020 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 0020 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 1F3FB × 002F ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 1F3FB × 0020 × 002F ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 1F3FB × 0308 × 002F ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 002F ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 1F3FB × 2060 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1F3FB × 0020 × 2060 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1F3FB × 0308 × 2060 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 2060 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 1F3FB × 200B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1F3FB × 0020 × 200B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1F3FB × 0308 × 200B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1F3FB × 0308 × 0020 × 200B ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 1F3FB ÷ 1F1E6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1F3FB × 0020 ÷ 1F1E6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1F3FB × 0308 ÷ 1F1E6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 1F3FB ÷ 261D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1F3FB × 0020 ÷ 261D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1F3FB × 0308 ÷ 261D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 261D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 1F3FB ÷ 1F3FB ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1F3FB × 0020 ÷ 1F3FB ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1F3FB × 0308 ÷ 1F3FB ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 1F3FB × 0001 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1F3FB × 0020 ÷ 0001 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1F3FB × 0308 × 0001 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0001 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 1F3FB × 200D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1F3FB × 0020 ÷ 200D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1F3FB × 0308 × 200D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 200D ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 1F3FB ÷ 00A7 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1F3FB × 0020 ÷ 00A7 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1F3FB × 0308 ÷ 00A7 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 1F3FB ÷ 50005 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1F3FB × 0020 ÷ 50005 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1F3FB × 0308 ÷ 50005 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 50005 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 1F3FB ÷ 0E01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1F3FB × 0020 ÷ 0E01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1F3FB × 0308 ÷ 0E01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1F3FB × 3041 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1F3FB × 0020 ÷ 3041 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1F3FB × 0308 × 3041 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 1F3FB × 0308 × 0020 ÷ 3041 ÷ # × [0.3] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0001 × 0023 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 0001 × 0020 ÷ 0023 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0001 × 0308 × 0023 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0001 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0001 × 0020 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0001 × 0308 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0001 × 0009 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0001 × 0020 ÷ 0009 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0001 × 0308 × 0009 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0001 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0001 × 0020 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0001 × 0308 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0001 × 000B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0001 × 0020 × 000B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0001 × 0308 × 000B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0001 × 0308 × 0020 × 000B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0001 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0001 × 0020 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0001 × 0308 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0001 × 007D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0001 × 0020 × 007D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0001 × 0308 × 007D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0001 × 0308 × 0020 × 007D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0001 × 0029 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0001 × 0020 × 0029 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0001 × 0308 × 0029 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0001 × 0308 × 0020 × 0029 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0001 × 000D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0001 × 0020 × 000D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0001 × 0308 × 000D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0001 × 0308 × 0020 × 000D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0001 × 0021 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0001 × 0020 × 0021 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0001 × 0308 × 0021 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0001 × 0308 × 0020 × 0021 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0001 × 00A0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3] +× 0001 × 0020 ÷ 00A0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0001 × 0308 × 00A0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0001 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0001 × 0020 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0001 × 0308 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0001 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0001 × 0020 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0001 × 0308 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0001 × 05D0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0001 × 0020 ÷ 05D0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0001 × 0308 × 05D0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0001 × 002D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0001 × 0020 ÷ 002D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0001 × 0308 × 002D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0001 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0001 × 0020 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0001 × 0308 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0001 × 2024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 0001 × 0020 ÷ 2024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0001 × 0308 × 2024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0001 × 002C ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.04] COMMA (IS) ÷ [0.3] +× 0001 × 0020 × 002C ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0001 × 0308 × 002C ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] COMMA (IS) ÷ [0.3] +× 0001 × 0308 × 0020 × 002C ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0001 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0001 × 0020 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0001 × 0308 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0001 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0001 × 0020 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0001 × 0308 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0001 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0001 × 0020 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0001 × 0308 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0001 × 000A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0001 × 0020 × 000A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0001 × 0308 × 000A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0001 × 0308 × 0020 × 000A ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0001 × 0085 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0001 × 0020 × 0085 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0001 × 0308 × 0085 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0001 × 0308 × 0020 × 0085 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0001 × 17D6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0001 × 0020 ÷ 17D6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0001 × 0308 × 17D6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0001 × 0030 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 0001 × 0020 ÷ 0030 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0001 × 0308 × 0030 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0001 × 0028 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0001 × 0020 ÷ 0028 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0001 × 0308 × 0028 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0001 × 0025 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 0001 × 0020 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0001 × 0308 × 0025 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0001 × 0024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 0001 × 0020 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0001 × 0308 × 0024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0001 × 0022 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0001 × 0020 ÷ 0022 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0001 × 0308 × 0022 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0001 × 0020 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0001 × 0020 × 0020 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0001 × 0308 × 0020 × 0020 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0001 × 002F ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [13.04] SOLIDUS (SY) ÷ [0.3] +× 0001 × 0020 × 002F ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0001 × 0308 × 002F ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] SOLIDUS (SY) ÷ [0.3] +× 0001 × 0308 × 0020 × 002F ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0001 × 2060 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0001 × 0020 × 2060 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0001 × 0308 × 2060 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0001 × 0308 × 0020 × 2060 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0001 × 200B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0001 × 0020 × 200B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0001 × 0308 × 200B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0001 × 0308 × 0020 × 200B ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0001 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0001 × 0020 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0001 × 0308 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0001 ÷ 261D ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0001 × 0020 ÷ 261D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0001 × 0308 ÷ 261D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 261D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0001 ÷ 1F3FB ÷ # × [0.3] <START OF HEADING> (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0001 × 0020 ÷ 1F3FB ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0001 × 0308 ÷ 1F3FB ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0001 × 0001 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0001 × 0020 ÷ 0001 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0001 × 0308 × 0001 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0001 × 200D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0001 × 0020 ÷ 200D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0001 × 0308 × 200D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 200D ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0001 × 00A7 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0001 × 0020 ÷ 00A7 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0001 × 0308 × 00A7 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0001 × 50005 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0001 × 0020 ÷ 50005 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0001 × 0308 × 50005 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0001 × 0E01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0001 × 0020 ÷ 0E01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0001 × 0308 × 0E01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0001 × 3041 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0001 × 0020 ÷ 3041 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0001 × 0308 × 3041 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0001 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <START OF HEADING> (CM1_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 200D × 0023 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 200D × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 200D × 0308 × 0023 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0023 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 200D ÷ 2014 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 200D × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 200D × 0308 ÷ 2014 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 2014 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 200D × 0009 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 200D × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 200D × 0308 × 0009 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0009 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 200D ÷ 00B4 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 200D × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 200D × 0308 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 200D × 000B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 200D × 0020 × 000B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 200D × 0308 × 000B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 200D × 0308 × 0020 × 000B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 200D ÷ FFFC ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 200D × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 200D × 0308 ÷ FFFC ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 200D × 0308 × 0020 ÷ FFFC ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 200D × 007D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 200D × 0020 × 007D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 200D × 0308 × 007D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 200D × 0308 × 0020 × 007D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 200D × 0029 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 200D × 0020 × 0029 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 200D × 0308 × 0029 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 200D × 0308 × 0020 × 0029 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 200D × 000D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 200D × 0020 × 000D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 200D × 0308 × 000D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 200D × 0308 × 0020 × 000D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 200D × 0021 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 200D × 0020 × 0021 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 200D × 0308 × 0021 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 200D × 0308 × 0020 × 0021 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 200D × 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3] +× 200D × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 200D × 0308 × 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 200D ÷ AC00 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 200D × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 200D × 0308 ÷ AC00 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 200D × 0308 × 0020 ÷ AC00 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 200D ÷ AC01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 200D × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 200D × 0308 ÷ AC01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 200D × 0308 × 0020 ÷ AC01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 200D × 05D0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 200D × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 200D × 0308 × 05D0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 200D × 002D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 200D × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 200D × 0308 × 002D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 002D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 200D × 231A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [8.1] WATCH (ID) ÷ [0.3] +× 200D × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 200D × 0308 ÷ 231A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 231A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 200D × 2024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 200D × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 200D × 0308 × 2024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 2024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 200D × 002C ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] COMMA (IS) ÷ [0.3] +× 200D × 0020 × 002C ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 200D × 0308 × 002C ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] COMMA (IS) ÷ [0.3] +× 200D × 0308 × 0020 × 002C ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 200D ÷ 1100 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 200D × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 200D × 0308 ÷ 1100 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 1100 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 200D ÷ 11A8 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 200D × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 200D × 0308 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 200D ÷ 1160 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 200D × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 200D × 0308 ÷ 1160 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 1160 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 200D × 000A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 200D × 0020 × 000A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 200D × 0308 × 000A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 200D × 0308 × 0020 × 000A ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 200D × 0085 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 200D × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 200D × 0308 × 0085 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 200D × 0308 × 0020 × 0085 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 200D × 17D6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 200D × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 200D × 0308 × 17D6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 200D × 0030 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 200D × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 200D × 0308 × 0030 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0030 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 200D × 0028 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 200D × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 200D × 0308 × 0028 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0028 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 200D × 0025 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 200D × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 200D × 0308 × 0025 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0025 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 200D × 0024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 200D × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 200D × 0308 × 0024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0024 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 200D × 0022 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 200D × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 200D × 0308 × 0022 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0022 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 200D × 0020 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 200D × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 200D × 0308 × 0020 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 200D × 0308 × 0020 × 0020 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 200D × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] SOLIDUS (SY) ÷ [0.3] +× 200D × 0020 × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 200D × 0308 × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.04] SOLIDUS (SY) ÷ [0.3] +× 200D × 0308 × 0020 × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 200D × 2060 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 200D × 0020 × 2060 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 200D × 0308 × 2060 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 200D × 0308 × 0020 × 2060 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 200D × 200B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 200D × 0020 × 200B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 200D × 0308 × 200B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 200D × 0308 × 0020 × 200B ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 200D ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 200D × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 200D × 0308 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 200D × 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [8.1] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 200D × 0020 ÷ 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 200D × 0308 ÷ 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 200D × 1F3FB ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [8.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 200D × 0020 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 200D × 0308 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 200D × 0001 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 200D × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 200D × 0308 × 0001 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0001 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 200D × 200D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 200D × 0020 ÷ 200D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 200D × 0308 × 200D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 200D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 200D × 00A7 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 200D × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 200D × 0308 × 00A7 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 200D × 50005 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 200D × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 200D × 0308 × 50005 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 50005 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 200D × 0E01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 200D × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 200D × 0308 × 0E01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 200D × 3041 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 200D × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 200D × 0308 × 3041 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 200D × 0308 × 0020 ÷ 3041 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 00A7 × 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] NUMBER SIGN (AL) ÷ [0.3] × 00A7 × 0020 ÷ 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 00A7 × 0308 × 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 00A7 × 0308 × 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 00A7 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 00A7 × 0020 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 00A7 × 0308 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 00A7 × 0308 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 00A7 × 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 00A7 × 0020 ÷ 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 00A7 × 0308 × 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 00A7 × 0308 × 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 00A7 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 00A7 × 0020 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 00A7 × 0308 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 00A7 × 0308 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 00A7 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 00A7 × 0020 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 00A7 × 0308 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 00A7 × 0308 × 0020 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 00A7 × 0308 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 00A7 × 0308 × 0020 × 000B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 00A7 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 00A7 × 0020 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 00A7 × 0308 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 00A7 × 0308 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 00A7 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 00A7 × 0020 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 00A7 × 0308 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 00A7 × 0308 × 0020 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 00A7 × 0308 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 00A7 × 0308 × 0020 × 007D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 00A7 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 00A7 × 0020 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00A7 × 0308 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00A7 × 0308 × 0020 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 00A7 × 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 00A7 × 0020 ÷ 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 00A7 × 0308 × 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 00A7 × 0308 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 00A7 × 0308 × 0020 × 0029 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 00A7 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 00A7 × 0020 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 00A7 × 0308 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 00A7 × 0308 × 0020 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 00A7 × 0308 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 00A7 × 0308 × 0020 × 000D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 00A7 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 00A7 × 0020 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 00A7 × 0308 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 00A7 × 0308 × 0020 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 00A7 × 0308 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 00A7 × 0308 × 0020 × 0021 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 00A7 × 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 00A7 × 0020 ÷ 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 00A7 × 0308 × 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 00A7 × 0308 × 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 00A7 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 00A7 × 0020 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 00A7 × 0308 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 00A7 × 0308 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 00A7 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 00A7 × 0020 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 00A7 × 0308 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 00A7 × 0308 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 00A7 × 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 00A7 × 0020 ÷ 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 00A7 × 0308 × 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 00A7 × 0308 × 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 00A7 × 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 00A7 × 0020 ÷ 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 00A7 × 0308 × 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 00A7 × 0308 × 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 002D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 00A7 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] WATCH (ID) ÷ [0.3] × 00A7 × 0020 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 00A7 × 0308 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 00A7 × 0308 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 231A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 00A7 × 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] × 00A7 × 0020 ÷ 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 00A7 × 0308 × 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 00A7 × 0308 × 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 00A7 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.02] COMMA (IS) ÷ [0.3] × 00A7 × 0020 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 00A7 × 0308 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 00A7 × 0308 × 0020 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 00A7 × 0308 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 00A7 × 0308 × 0020 × 002C ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 00A7 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 00A7 × 0020 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 00A7 × 0308 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 00A7 × 0308 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 00A7 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 00A7 × 0020 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 00A7 × 0308 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 00A7 × 0308 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 00A7 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 00A7 × 0020 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 00A7 × 0308 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 00A7 × 0308 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 00A7 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 00A7 × 0020 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 00A7 × 0308 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 00A7 × 0308 × 0020 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 00A7 × 0308 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 00A7 × 0308 × 0020 × 000A ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 00A7 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 00A7 × 0020 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 00A7 × 0308 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 00A7 × 0308 × 0020 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 00A7 × 0308 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 00A7 × 0308 × 0020 × 0085 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 00A7 × 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 00A7 × 0020 ÷ 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 00A7 × 0308 × 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 00A7 × 0308 × 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 00A7 × 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3] × 00A7 × 0020 ÷ 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 00A7 × 0308 × 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 00A7 × 0308 × 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 00A7 × 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] × 00A7 × 0020 ÷ 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 00A7 × 0308 × 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 00A7 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 00A7 × 0308 × 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 00A7 × 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [24.03] PERCENT SIGN (PO) ÷ [0.3] × 00A7 × 0020 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 00A7 × 0308 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 00A7 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 00A7 × 0308 × 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 00A7 × 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] × 00A7 × 0020 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 00A7 × 0308 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 00A7 × 0308 × 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 00A7 × 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 00A7 × 0020 ÷ 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 00A7 × 0308 × 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 00A7 × 0308 × 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 00A7 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [0.3] × 00A7 × 0020 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 00A7 × 0308 × 0020 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 00A7 × 0308 × 0020 × 0020 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 00A7 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [13.02] SOLIDUS (SY) ÷ [0.3] × 00A7 × 0020 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 00A7 × 0308 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 00A7 × 0308 × 0020 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 00A7 × 0308 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 00A7 × 0308 × 0020 × 002F ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 00A7 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 00A7 × 0020 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 00A7 × 0308 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 00A7 × 0308 × 0020 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 00A7 × 0308 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 00A7 × 0308 × 0020 × 2060 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 00A7 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 00A7 × 0020 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 00A7 × 0308 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 00A7 × 0308 × 0020 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 00A7 × 0308 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 00A7 × 0308 × 0020 × 200B ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 00A7 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 00A7 × 0020 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 00A7 × 0308 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00A7 × 0308 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 00A7 ÷ 261D ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00A7 × 0020 ÷ 261D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00A7 × 0308 ÷ 261D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 261D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 00A7 ÷ 1F3FB ÷ # × [0.3] SECTION SIGN (AI_AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00A7 × 0020 ÷ 1F3FB ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00A7 × 0308 ÷ 1F3FB ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 00A7 × 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00A7 × 0020 ÷ 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00A7 × 0308 × 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 00A7 × 200D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00A7 × 0020 ÷ 200D ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00A7 × 0308 × 200D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 200D ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 00A7 × 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] × 00A7 × 0020 ÷ 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 00A7 × 0308 × 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 00A7 × 0308 × 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 00A7 × 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] × 00A7 × 0020 ÷ 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 00A7 × 0308 × 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 00A7 × 0308 × 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 00A7 × 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 00A7 × 0020 ÷ 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 00A7 × 0308 × 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 00A7 × 0308 × 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 00A7 × 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 00A7 × 0020 ÷ 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 00A7 × 0308 × 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 00A7 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 00A7 × 0308 × 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 00A7 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] SECTION SIGN (AI_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 50005 × 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] NUMBER SIGN (AL) ÷ [0.3] × 50005 × 0020 ÷ 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 50005 × 0308 × 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 50005 × 0308 × 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 50005 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 50005 × 0020 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 50005 × 0308 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 50005 × 0308 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 50005 × 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 50005 × 0020 ÷ 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 50005 × 0308 × 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 50005 × 0308 × 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 50005 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 50005 × 0020 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 50005 × 0308 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 50005 × 0308 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 50005 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 50005 × 0020 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 50005 × 0308 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 50005 × 0308 × 0020 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 50005 × 0308 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 50005 × 0308 × 0020 × 000B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 50005 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 50005 × 0020 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 50005 × 0308 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 50005 × 0308 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 50005 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 50005 × 0020 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 50005 × 0308 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 50005 × 0308 × 0020 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 50005 × 0308 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 50005 × 0308 × 0020 × 007D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 50005 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 50005 × 0020 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 50005 × 0308 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 50005 × 0308 × 0020 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 50005 × 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 50005 × 0020 ÷ 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 50005 × 0308 × 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 50005 × 0308 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 50005 × 0308 × 0020 × 0029 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 50005 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 50005 × 0020 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 50005 × 0308 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 50005 × 0308 × 0020 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 50005 × 0308 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 50005 × 0308 × 0020 × 000D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 50005 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 50005 × 0020 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 50005 × 0308 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 50005 × 0308 × 0020 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 50005 × 0308 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 50005 × 0308 × 0020 × 0021 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 50005 × 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 50005 × 0020 ÷ 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 50005 × 0308 × 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 50005 × 0308 × 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 50005 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 50005 × 0020 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 50005 × 0308 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 50005 × 0308 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 50005 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 50005 × 0020 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 50005 × 0308 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 50005 × 0308 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 50005 × 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 50005 × 0020 ÷ 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 50005 × 0308 × 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 50005 × 0308 × 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 50005 × 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 50005 × 0020 ÷ 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 50005 × 0308 × 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 50005 × 0308 × 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 002D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 50005 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] WATCH (ID) ÷ [0.3] × 50005 × 0020 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 50005 × 0308 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 50005 × 0308 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 231A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 50005 × 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] × 50005 × 0020 ÷ 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 50005 × 0308 × 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 50005 × 0308 × 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 50005 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.02] COMMA (IS) ÷ [0.3] × 50005 × 0020 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 50005 × 0308 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 50005 × 0308 × 0020 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 50005 × 0308 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 50005 × 0308 × 0020 × 002C ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 50005 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 50005 × 0020 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 50005 × 0308 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 50005 × 0308 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 50005 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 50005 × 0020 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 50005 × 0308 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 50005 × 0308 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 50005 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 50005 × 0020 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 50005 × 0308 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 50005 × 0308 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 50005 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 50005 × 0020 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 50005 × 0308 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 50005 × 0308 × 0020 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 50005 × 0308 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 50005 × 0308 × 0020 × 000A ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 50005 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 50005 × 0020 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 50005 × 0308 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 50005 × 0308 × 0020 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 50005 × 0308 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 50005 × 0308 × 0020 × 0085 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 50005 × 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 50005 × 0020 ÷ 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 50005 × 0308 × 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 50005 × 0308 × 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 50005 × 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3] × 50005 × 0020 ÷ 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 50005 × 0308 × 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 50005 × 0308 × 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 50005 × 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] × 50005 × 0020 ÷ 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 50005 × 0308 × 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 50005 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 50005 × 0308 × 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 50005 × 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [24.03] PERCENT SIGN (PO) ÷ [0.3] × 50005 × 0020 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 50005 × 0308 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 50005 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 50005 × 0308 × 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 50005 × 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] × 50005 × 0020 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 50005 × 0308 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 50005 × 0308 × 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 50005 × 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 50005 × 0020 ÷ 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 50005 × 0308 × 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 50005 × 0308 × 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 50005 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [0.3] × 50005 × 0020 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 50005 × 0308 × 0020 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 50005 × 0308 × 0020 × 0020 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 50005 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [13.02] SOLIDUS (SY) ÷ [0.3] × 50005 × 0020 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 50005 × 0308 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 50005 × 0308 × 0020 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 50005 × 0308 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 50005 × 0308 × 0020 × 002F ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 50005 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 50005 × 0020 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 50005 × 0308 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 50005 × 0308 × 0020 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 50005 × 0308 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 50005 × 0308 × 0020 × 2060 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 50005 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 50005 × 0020 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 50005 × 0308 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 50005 × 0308 × 0020 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 50005 × 0308 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 50005 × 0308 × 0020 × 200B ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 50005 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 50005 × 0020 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 50005 × 0308 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 50005 × 0308 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 50005 ÷ 261D ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 50005 × 0020 ÷ 261D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 50005 × 0308 ÷ 261D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 261D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 50005 ÷ 1F3FB ÷ # × [0.3] <reserved-50005> (XX_AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 50005 × 0020 ÷ 1F3FB ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 50005 × 0308 ÷ 1F3FB ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 50005 × 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 50005 × 0020 ÷ 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 50005 × 0308 × 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 50005 × 200D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 50005 × 0020 ÷ 200D ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 50005 × 0308 × 200D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 200D ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 50005 × 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] × 50005 × 0020 ÷ 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 50005 × 0308 × 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 50005 × 0308 × 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 50005 × 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] × 50005 × 0020 ÷ 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 50005 × 0308 × 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 50005 × 0308 × 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 50005 × 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 50005 × 0020 ÷ 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 50005 × 0308 × 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 50005 × 0308 × 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 50005 × 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 50005 × 0020 ÷ 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 50005 × 0308 × 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 50005 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 50005 × 0308 × 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 50005 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] <reserved-50005> (XX_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0E01 × 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] NUMBER SIGN (AL) ÷ [0.3] × 0E01 × 0020 ÷ 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 0E01 × 0308 × 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 0E01 × 0308 × 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] NUMBER SIGN (AL) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 0E01 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 0E01 × 0020 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 0E01 × 0308 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 0E01 × 0308 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 0E01 × 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0E01 × 0020 ÷ 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0E01 × 0308 × 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0E01 × 0308 × 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 0E01 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 0E01 × 0020 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0E01 × 0308 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0E01 × 0308 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 0E01 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0E01 × 0020 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0E01 × 0308 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 0E01 × 0308 × 0020 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0E01 × 0308 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 0E01 × 0308 × 0020 × 000B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 0E01 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0E01 × 0020 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0E01 × 0308 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0E01 × 0308 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 0E01 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0E01 × 0020 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0E01 × 0308 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0E01 × 0308 × 0020 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0E01 × 0308 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0E01 × 0308 × 0020 × 007D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0E01 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0E01 × 0020 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0E01 × 0308 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0E01 × 0308 × 0020 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0E01 × 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0E01 × 0020 ÷ 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 0E01 × 0308 × 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 0E01 × 0308 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0E01 × 0308 × 0020 × 0029 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0E01 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0E01 × 0020 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0E01 × 0308 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 0E01 × 0308 × 0020 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0E01 × 0308 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 0E01 × 0308 × 0020 × 000D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 0E01 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0E01 × 0020 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0E01 × 0308 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0E01 × 0308 × 0020 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0E01 × 0308 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 0E01 × 0308 × 0020 × 0021 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0E01 × 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 0E01 × 0020 ÷ 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 0E01 × 0308 × 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 0E01 × 0308 × 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 0E01 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0E01 × 0020 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0E01 × 0308 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0E01 × 0308 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 0E01 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0E01 × 0020 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0E01 × 0308 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0E01 × 0308 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 0E01 × 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0E01 × 0020 ÷ 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0E01 × 0308 × 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0E01 × 0308 × 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 0E01 × 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 0E01 × 0020 ÷ 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 0E01 × 0308 × 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 0E01 × 0308 × 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 002D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 0E01 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] WATCH (ID) ÷ [0.3] × 0E01 × 0020 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 0E01 × 0308 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 0E01 × 0308 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 231A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 0E01 × 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] × 0E01 × 0020 ÷ 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 0E01 × 0308 × 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 0E01 × 0308 × 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 0E01 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.02] COMMA (IS) ÷ [0.3] × 0E01 × 0020 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 0E01 × 0308 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 0E01 × 0308 × 0020 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 0E01 × 0308 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 0E01 × 0308 × 0020 × 002C ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 0E01 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0E01 × 0020 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0E01 × 0308 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0E01 × 0308 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 0E01 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0E01 × 0020 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0E01 × 0308 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0E01 × 0308 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 0E01 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0E01 × 0020 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0E01 × 0308 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0E01 × 0308 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 0E01 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0E01 × 0020 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0E01 × 0308 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 0E01 × 0308 × 0020 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0E01 × 0308 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 0E01 × 0308 × 0020 × 000A ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 0E01 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0E01 × 0020 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0E01 × 0308 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 0E01 × 0308 × 0020 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0E01 × 0308 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 0E01 × 0308 × 0020 × 0085 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 0E01 × 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0E01 × 0020 ÷ 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0E01 × 0308 × 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0E01 × 0308 × 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 0E01 × 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3] × 0E01 × 0020 ÷ 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 0E01 × 0308 × 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 0E01 × 0308 × 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 0E01 × 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] × 0E01 × 0020 ÷ 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0E01 × 0308 × 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 0E01 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 0E01 × 0308 × 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 0E01 × 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [24.03] PERCENT SIGN (PO) ÷ [0.3] × 0E01 × 0020 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0E01 × 0308 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 0E01 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0E01 × 0308 × 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] PERCENT SIGN (PO) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 0E01 × 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] × 0E01 × 0020 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0E01 × 0308 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 0E01 × 0308 × 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [24.03] DOLLAR SIGN (PR) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 0E01 × 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 0E01 × 0020 ÷ 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 0E01 × 0308 × 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 0E01 × 0308 × 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 0E01 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [0.3] × 0E01 × 0020 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 0E01 × 0308 × 0020 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0E01 × 0308 × 0020 × 0020 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 0E01 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0E01 × 0020 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 0E01 × 0308 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 0E01 × 0308 × 0020 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 0E01 × 0308 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 0E01 × 0308 × 0020 × 002F ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 0E01 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0E01 × 0020 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0E01 × 0308 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 0E01 × 0308 × 0020 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0E01 × 0308 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 0E01 × 0308 × 0020 × 2060 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 0E01 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0E01 × 0020 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0E01 × 0308 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 0E01 × 0308 × 0020 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0E01 × 0308 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 0E01 × 0308 × 0020 × 200B ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 0E01 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 0E01 × 0020 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0E01 × 0308 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0E01 × 0308 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 0E01 ÷ 261D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0E01 × 0020 ÷ 261D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0E01 × 0308 ÷ 261D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 261D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0E01 ÷ 1F3FB ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0E01 × 0020 ÷ 1F3FB ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0E01 × 0308 ÷ 1F3FB ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0E01 × 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0E01 × 0020 ÷ 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0E01 × 0308 × 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 0E01 × 200D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0E01 × 0020 ÷ 200D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0E01 × 0308 × 200D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 200D ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 0E01 × 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0E01 × 0020 ÷ 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0E01 × 0308 × 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0E01 × 0308 × 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 0E01 × 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0E01 × 0020 ÷ 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0E01 × 0308 × 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0E01 × 0308 × 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 0E01 × 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0E01 × 0020 ÷ 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0E01 × 0308 × 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0E01 × 0308 × 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [28.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 0E01 × 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 0E01 × 0020 ÷ 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0E01 × 0308 × 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 0E01 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0E01 × 0308 × 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0E01 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 3041 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] × 3041 × 0020 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] -× 3041 × 0308 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] +× 3041 × 0308 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] NUMBER SIGN (AL) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0023 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NUMBER SIGN (AL) ÷ [0.3] × 3041 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] EM DASH (B2) ÷ [0.3] × 3041 × 0020 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] -× 3041 × 0308 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] +× 3041 × 0308 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EM DASH (B2) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 2014 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EM DASH (B2) ÷ [0.3] × 3041 × 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] × 3041 × 0020 ÷ 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 3041 × 0308 × 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 3041 × 0308 × 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.01] <CHARACTER TABULATION> (BA) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0009 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <CHARACTER TABULATION> (BA) ÷ [0.3] × 3041 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] × 3041 × 0020 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] -× 3041 × 0308 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] +× 3041 × 0308 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ACUTE ACCENT (BB) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 00B4 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ACUTE ACCENT (BB) ÷ [0.3] × 3041 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 3041 × 0020 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 3041 × 0308 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] -× 3041 × 0308 × 0020 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 3041 × 0308 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] +× 3041 × 0308 × 0020 × 000B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE TABULATION> (BK) ÷ [0.3] × 3041 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 3041 × 0020 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 3041 × 0308 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 3041 × 0308 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] × 3041 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 3041 × 0020 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 3041 × 0308 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 3041 × 0308 × 0020 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 3041 × 0308 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 3041 × 0308 × 0020 × 007D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 3041 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 3041 × 0020 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 3041 × 0308 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 3041 × 0308 × 0020 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 3041 × 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 3041 × 0020 ÷ 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] -× 3041 × 0308 × 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [9.0] <START OF HEADING> (CM) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM) ÷ [0.3] +× 3041 × 0308 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 3041 × 0308 × 0020 × 0029 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 3041 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 3041 × 0020 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 3041 × 0308 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -× 3041 × 0308 × 0020 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 3041 × 0308 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +× 3041 × 0308 × 0020 × 000D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] × 3041 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 3041 × 0020 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 3041 × 0308 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 3041 × 0308 × 0020 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 3041 × 0308 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] +× 3041 × 0308 × 0020 × 0021 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 3041 × 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [12.1] NO-BREAK SPACE (GL) ÷ [0.3] × 3041 × 0020 ÷ 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] -× 3041 × 0308 × 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] +× 3041 × 0308 × 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3] × 3041 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 3041 × 0020 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 3041 × 0308 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 3041 × 0308 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3] × 3041 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 3041 × 0020 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 3041 × 0308 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 3041 × 0308 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3] × 3041 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 3041 × 0020 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 3041 × 0308 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 3041 × 0308 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HEBREW LETTER ALEF (HL) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 05D0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3] × 3041 × 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] × 3041 × 0020 ÷ 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] -× 3041 × 0308 × 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] +× 3041 × 0308 × 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HYPHEN-MINUS (HY) ÷ [0.3] × 3041 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] WATCH (ID) ÷ [0.3] × 3041 × 0020 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] -× 3041 × 0308 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] WATCH (ID) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] +× 3041 × 0308 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WATCH (ID) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 231A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WATCH (ID) ÷ [0.3] × 3041 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] × 3041 × 0020 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] -× 3041 × 0308 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] +× 3041 × 0308 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] ONE DOT LEADER (IN) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 2024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ONE DOT LEADER (IN) ÷ [0.3] × 3041 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.02] COMMA (IS) ÷ [0.3] × 3041 × 0020 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] -× 3041 × 0308 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] COMMA (IS) ÷ [0.3] -× 3041 × 0308 × 0020 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] +× 3041 × 0308 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3] +× 3041 × 0308 × 0020 × 002C ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3] × 3041 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 3041 × 0020 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 3041 × 0308 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 3041 × 0308 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3] × 3041 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 3041 × 0020 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 3041 × 0308 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 3041 × 0308 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] × 3041 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 3041 × 0020 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 3041 × 0308 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 3041 × 0308 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] × 3041 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 3041 × 0020 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 3041 × 0308 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] -× 3041 × 0308 × 0020 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 3041 × 0308 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] +× 3041 × 0308 × 0020 × 000A ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3] × 3041 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 3041 × 0020 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 3041 × 0308 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] -× 3041 × 0308 × 0020 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 3041 × 0308 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] +× 3041 × 0308 × 0020 × 0085 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [6.0] <NEXT LINE (NEL)> (NL) ÷ [0.3] × 3041 × 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 3041 × 0020 ÷ 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 3041 × 0308 × 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 3041 × 0308 × 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 17D6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] KHMER SIGN CAMNUC PII KUUH (NS) ÷ [0.3] × 3041 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] × 3041 × 0020 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] -× 3041 × 0308 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] +× 3041 × 0308 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DIGIT ZERO (NU) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0030 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DIGIT ZERO (NU) ÷ [0.3] × 3041 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 3041 × 0020 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 3041 × 0308 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 3041 × 0308 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT PARENTHESIS (OP) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0028 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT PARENTHESIS (OP) ÷ [0.3] × 3041 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] × 3041 × 0020 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] -× 3041 × 0308 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] +× 3041 × 0308 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] PERCENT SIGN (PO) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3] × 3041 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] × 3041 × 0020 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] -× 3041 × 0308 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] +× 3041 × 0308 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0024 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3] × 3041 × 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [19.01] QUOTATION MARK (QU) ÷ [0.3] × 3041 × 0020 ÷ 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] -× 3041 × 0308 × 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] +× 3041 × 0308 × 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] QUOTATION MARK (QU) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0022 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] QUOTATION MARK (QU) ÷ [0.3] × 3041 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [0.3] × 3041 × 0020 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 3041 × 0308 × 0020 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 3041 × 0308 × 0020 × 0020 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [0.3] × 3041 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [13.02] SOLIDUS (SY) ÷ [0.3] × 3041 × 0020 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] -× 3041 × 0308 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [13.03] SOLIDUS (SY) ÷ [0.3] -× 3041 × 0308 × 0020 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] +× 3041 × 0308 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] SOLIDUS (SY) ÷ [0.3] +× 3041 × 0308 × 0020 × 002F ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] SOLIDUS (SY) ÷ [0.3] × 3041 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 3041 × 0020 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 3041 × 0308 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] -× 3041 × 0308 × 0020 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 3041 × 0308 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 3041 × 0308 × 0020 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [11.01] WORD JOINER (WJ) ÷ [0.3] × 3041 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 3041 × 0020 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 3041 × 0308 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] -× 3041 × 0308 × 0020 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 3041 × 0308 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] +× 3041 × 0308 × 0020 × 200B ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [0.3] × 3041 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] × 3041 × 0020 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 3041 × 0308 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 3041 × 0308 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 1F1E6 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +× 3041 ÷ 261D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 3041 × 0020 ÷ 261D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 3041 × 0308 ÷ 261D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 261D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 3041 ÷ 1F3FB ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 3041 × 0020 ÷ 1F3FB ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 3041 × 0308 ÷ 1F3FB ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 3041 × 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 3041 × 0020 ÷ 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 3041 × 0308 × 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0001 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <START OF HEADING> (CM1_CM) ÷ [0.3] +× 3041 × 200D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 3041 × 0020 ÷ 200D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 3041 × 0308 × 200D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 200D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) ÷ [0.3] × 3041 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] × 3041 × 0020 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 3041 × 0308 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 3041 × 0308 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] SECTION SIGN (AI_AL) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 00A7 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] SECTION SIGN (AI_AL) ÷ [0.3] × 3041 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] × 3041 × 0020 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 3041 × 0308 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 3041 × 0308 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] <reserved-50005> (XX_AL) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 50005 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] <reserved-50005> (XX_AL) ÷ [0.3] × 3041 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 3041 × 0020 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 3041 × 0308 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 3041 × 0308 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 0E01 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] × 3041 × 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] × 3041 × 0020 ÷ 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 3041 × 0308 × 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] -× 3041 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 3041 × 0308 × 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [21.03] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 3041 × 0308 × 0020 ÷ 3041 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 000D × 000A ÷ 0061 × 000A ÷ 0308 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) × [5.01] <LINE FEED (LF)> (LF) ÷ [5.03] LATIN SMALL LETTER A (AL) × [6.0] <LINE FEED (LF)> (LF) ÷ [5.03] COMBINING DIAERESIS (CM1_CM) ÷ [0.3] +× 0061 × 0308 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [0.3] +× 0020 ÷ 200D × 0646 ÷ # × [0.3] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [28.0] ARABIC LETTER NOON (AL) ÷ [0.3] +× 0646 × 200D × 0020 ÷ # × [0.3] ARABIC LETTER NOON (AL) × [9.0] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 000B ÷ 3041 ÷ # × [0.3] <LINE TABULATION> (BK) ÷ [4.0] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 000D ÷ 3041 ÷ # × [0.3] <CARRIAGE RETURN (CR)> (CR) ÷ [5.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 0085 ÷ 3041 ÷ # × [0.3] <NEXT LINE (NEL)> (NL) ÷ [5.04] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 200D × 261D ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [8.1] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 3041 × 2060 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [11.01] WORD JOINER (WJ) ÷ [0.3] +× 2060 × 3041 ÷ # × [0.3] WORD JOINER (WJ) × [11.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 3041 × 0308 × 00A0 ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3] +× 200D × 00A0 ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [12.3] NO-BREAK SPACE (GL) ÷ [0.3] +× 200D × 002F ÷ # × [0.3] ZERO WIDTH JOINER (ZWJ_O_ZWJ_CM) × [13.04] SOLIDUS (SY) ÷ [0.3] +× 2014 × 2014 ÷ # × [0.3] EM DASH (B2) × [17.0] EM DASH (B2) ÷ [0.3] +× 3041 ÷ FFFC ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [20.01] OBJECT REPLACEMENT CHARACTER (CB) ÷ [0.3] +× FFFC ÷ 3041 ÷ # × [0.3] OBJECT REPLACEMENT CHARACTER (CB) ÷ [20.02] HIRAGANA LETTER SMALL A (CJ_NS) ÷ [0.3] +× 3041 × 002D ÷ # × [0.3] HIRAGANA LETTER SMALL A (CJ_NS) × [21.02] HYPHEN-MINUS (HY) ÷ [0.3] +× 0E01 × 2024 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [22.01] ONE DOT LEADER (IN) ÷ [0.3] +× 0021 × 2024 ÷ # × [0.3] EXCLAMATION MARK (EX) × [22.02] ONE DOT LEADER (IN) ÷ [0.3] +× 2024 × 2024 ÷ # × [0.3] ONE DOT LEADER (IN) × [22.04] ONE DOT LEADER (IN) ÷ [0.3] +× 0030 × 2024 ÷ # × [0.3] DIGIT ZERO (NU) × [22.05] ONE DOT LEADER (IN) ÷ [0.3] +× 261D × 0025 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [23.13] PERCENT SIGN (PO) ÷ [0.3] +× 0E01 × 0030 ÷ # × [0.3] THAI CHARACTER KO KAI (SA_AL) × [23.02] DIGIT ZERO (NU) ÷ [0.3] +× 0024 × 261D ÷ # × [0.3] DOLLAR SIGN (PR) × [23.12] WHITE UP POINTING INDEX (EB) ÷ [0.3] +× 0024 × 0E01 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 0025 × 0E01 ÷ # × [0.3] PERCENT SIGN (PO) × [24.02] THAI CHARACTER KO KAI (SA_AL) ÷ [0.3] +× 1100 × 1160 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [26.01] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 1160 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 11A8 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3] +× 1160 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.01] ONE DOT LEADER (IN) ÷ [0.3] +× 1160 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.02] PERCENT SIGN (PO) ÷ [0.3] +× 0024 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3] +× 261D × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3] +× 0066 × 0069 × 006E × 0061 × 006C ÷ # × [0.3] LATIN SMALL LETTER F (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER L (AL) ÷ [0.3] × 0063 × 0061 × 006E × 0027 × 0074 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [19.01] APOSTROPHE (QU) × [19.02] LATIN SMALL LETTER T (AL) ÷ [0.3] × 0063 × 0061 × 006E × 2019 × 0074 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [19.01] RIGHT SINGLE QUOTATION MARK (QU) × [19.02] LATIN SMALL LETTER T (AL) ÷ [0.3] × 0027 × 0063 × 0061 × 006E × 0027 × 0020 ÷ 006E × 006F × 0074 ÷ # × [0.3] APOSTROPHE (QU) × [19.02] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [19.01] APOSTROPHE (QU) × [7.01] SPACE (SP) ÷ [18.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER T (AL) ÷ [0.3] @@ -6119,8 +7126,8 @@ × 4E00 × 002E ÷ 4E00 × 002E ÷ # × [0.3] CJK UNIFIED IDEOGRAPH-4E00 (ID) × [13.02] FULL STOP (IS) ÷ [999.0] CJK UNIFIED IDEOGRAPH-4E00 (ID) × [13.02] FULL STOP (IS) ÷ [0.3] × 0061 × 0020 × 0020 ÷ 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) ÷ [18.0] LATIN SMALL LETTER B (AL) ÷ [0.3] × 0061 × 0020 × 0020 × 200B ÷ 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [7.01] SPACE (SP) × [7.01] SPACE (SP) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [8.0] LATIN SMALL LETTER B (AL) ÷ [0.3] -× 0061 × 0020 ÷ 0308 × 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [28.0] LATIN SMALL LETTER B (AL) ÷ [0.3] -× 0031 × 0308 × 0062 × 0028 × 0061 × 0029 × 002D ÷ 0028 × 0062 × 0029 ÷ # × [0.3] DIGIT ONE (NU) × [9.0] COMBINING DIAERESIS (CM) × [23.03] LATIN SMALL LETTER B (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER A (AL) × [13.02] RIGHT PARENTHESIS (CP) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER B (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 0020 ÷ 0308 × 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [28.0] LATIN SMALL LETTER B (AL) ÷ [0.3] +× 0031 × 0308 × 0062 × 0028 × 0061 × 0029 × 002D ÷ 0028 × 0062 × 0029 ÷ # × [0.3] DIGIT ONE (NU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [23.03] LATIN SMALL LETTER B (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER A (AL) × [13.02] RIGHT PARENTHESIS (CP) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER B (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0067 × 0069 × 0076 × 0065 × 0020 ÷ 0062 × 006F × 006F × 006B × 0028 × 0073 × 0029 × 002E ÷ # × [0.3] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER V (AL) × [28.0] LATIN SMALL LETTER E (AL) × [7.01] SPACE (SP) ÷ [18.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER K (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] FULL STOP (IS) ÷ [0.3] × 307E ÷ 0028 × 3059 × 0029 ÷ # × [0.3] HIRAGANA LETTER MA (ID) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] HIRAGANA LETTER SU (ID) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0066 × 0069 × 006E × 0064 × 0020 × 002E × 0063 × 006F × 006D ÷ # × [0.3] LATIN SMALL LETTER F (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER D (AL) × [7.01] SPACE (SP) × [13.02] FULL STOP (IS) × [29.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER M (AL) ÷ [0.3] @@ -6133,12 +7140,12 @@ × 0063 × 006F × 0064 × 0065 × 0028 × 0073 × 002E × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] FULL STOP (IS) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0063 × 006F × 0064 × 0065 × 0028 × 0073 × 0029 × 0021 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] × 0063 × 006F × 0064 × 0065 × 0028 × 0073 × 0021 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.01] EXCLAMATION MARK (EX) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0063 × 006F × 0064 × 0065 ÷ 005C ÷ 0028 × 0073 ÷ 005C × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) ÷ [999.0] REVERSE SOLIDUS (PR) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) ÷ [999.0] REVERSE SOLIDUS (PR) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0063 × 006F × 0064 × 0065 × 005C ÷ 0028 × 0073 × 005C × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [24.03] REVERSE SOLIDUS (PR) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [24.03] REVERSE SOLIDUS (PR) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0063 × 006F × 0064 × 0065 × 0028 × 0020 × 0073 × 0020 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] LATIN SMALL LETTER S (AL) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0063 × 006F × 0064 × 0065 × 007B × 0073 × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0063 × 006F × 0064 × 0065 × 007B × 0073 × 007D × 002E ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [13.02] FULL STOP (IS) ÷ [0.3] × 0063 × 006F × 0064 × 0065 × 007B × 0073 × 007D × 0021 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [13.01] EXCLAMATION MARK (EX) ÷ [0.3] -× 0063 × 006F × 0064 × 0065 ÷ 005C ÷ 007B × 0073 ÷ 005C × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) ÷ [999.0] REVERSE SOLIDUS (PR) ÷ [999.0] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) ÷ [999.0] REVERSE SOLIDUS (PR) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0063 × 006F × 0064 × 0065 × 005C ÷ 007B × 0073 × 005C × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [24.03] REVERSE SOLIDUS (PR) ÷ [999.0] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER S (AL) × [24.03] REVERSE SOLIDUS (PR) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0063 × 006F × 0064 × 0065 × 007B × 0020 × 0073 × 0020 × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [28.0] LATIN SMALL LETTER E (AL) × [30.01] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] LATIN SMALL LETTER S (AL) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] × 0063 × 006F × 0064 × 0028 × 0065 × 0029 ÷ 2026 ÷ 0028 × 0073 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] HORIZONTAL ELLIPSIS (IN) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0028 × 0063 × 006F × 0064 × 0028 × 0065 × 0029 ÷ 2026 × 0029 × 0073 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER D (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] HORIZONTAL ELLIPSIS (IN) × [13.02] RIGHT PARENTHESIS (CP) × [30.02] LATIN SMALL LETTER S (AL) ÷ [0.3] @@ -6156,19 +7163,19 @@ × 007B × 0063 × 006F × 006E × 007D × 002D ÷ 006C × 0061 × 006E × 0067 ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LATIN SMALL LETTER L (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER G (AL) ÷ [0.3] × 007B × 0063 × 006F × 006E × 007D × 00AD ÷ 006C × 0061 × 006E × 0067 ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [21.01] SOFT HYPHEN (BA) ÷ [999.0] LATIN SMALL LETTER L (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER G (AL) ÷ [0.3] × 007B × 0063 × 006F × 006E × 007D × 2011 × 006C × 0061 × 006E × 0067 ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [13.02] RIGHT CURLY BRACKET (CL) × [12.1] NON-BREAKING HYPHEN (GL) × [12.0] LATIN SMALL LETTER L (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER G (AL) ÷ [0.3] -× 0063 × 0072 × 0065 × 0301 × 0028 × 0065 × 0301 × 0029 ÷ 0028 × 0065 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0063 × 0072 × 0065 × 0301 × 005B × 0065 × 0072 × 007C ÷ 0065 × 0301 × 0028 × 0065 × 0029 ÷ 0028 × 0073 × 0029 × 005D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT SQUARE BRACKET (OP) × [14.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [21.01] VERTICAL LINE (BA) ÷ [999.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] RIGHT SQUARE BRACKET (CP) ÷ [0.3] -× 0063 × 0072 × 0065 × 0301 × 007B × 0065 × 0072 × 007C ÷ 0065 × 0301 × 0028 × 0065 × 0029 ÷ 0028 × 0073 × 0029 × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [21.01] VERTICAL LINE (BA) ÷ [999.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 0308 × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 00AB × 0308 × 00BB × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.01] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 00AB × 0020 ÷ 0308 × 0020 ÷ 00BB × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 0020 × 0028 × 0020 × 0308 × 0020 × 0029 × 0020 ÷ 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 202F × 0028 × 0020 × 0308 × 0020 × 0029 × 202F × 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 0308 × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 00AB × 0308 × 00BB × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM) × [19.01] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 00AB × 0020 ÷ 0308 × 0020 ÷ 00BB × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 0020 × 007B × 0020 × 0308 × 0020 × 007D × 0020 ÷ 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] -× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 202F × 007B × 0020 × 0308 × 0020 × 007D × 202F × 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0063 × 0072 × 0065 × 0301 × 0028 × 0065 × 0301 × 0029 ÷ 0028 × 0065 × 0029 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0063 × 0072 × 0065 × 0301 × 005B × 0065 × 0072 × 007C ÷ 0065 × 0301 × 0028 × 0065 × 0029 ÷ 0028 × 0073 × 0029 × 005D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT SQUARE BRACKET (OP) × [14.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [21.01] VERTICAL LINE (BA) ÷ [999.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] RIGHT SQUARE BRACKET (CP) ÷ [0.3] +× 0063 × 0072 × 0065 × 0301 × 007B × 0065 × 0072 × 007C ÷ 0065 × 0301 × 0028 × 0065 × 0029 ÷ 0028 × 0073 × 0029 × 007D ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [21.01] VERTICAL LINE (BA) ÷ [999.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING ACUTE ACCENT (CM1_CM) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER S (AL) × [13.02] RIGHT PARENTHESIS (CP) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 0308 × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 00AB × 0308 × 00BB × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 0028 × 00AB × 0020 ÷ 0308 × 0020 ÷ 00BB × 0029 ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 0020 × 0028 × 0020 × 0308 × 0020 × 0029 × 0020 ÷ 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 202F × 0028 × 0020 × 0308 × 0020 × 0029 × 202F × 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] LEFT PARENTHESIS (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 0308 × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 00AB × 0308 × 00BB × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [9.0] COMBINING DIAERESIS (CM1_CM) × [19.01] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 007B × 00AB × 0020 ÷ 0308 × 0020 ÷ 00BB × 007D ÷ 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [30.01] LEFT CURLY BRACKET (OP) × [14.0] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) ÷ [18.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 0020 × 007B × 0020 × 0308 × 0020 × 007D × 0020 ÷ 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [7.01] SPACE (SP) × [15.0] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) × [7.01] SPACE (SP) ÷ [18.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] +× 0061 × 006D × 0062 × 0069 × 0067 × 0075 × 00AB × 202F × 007B × 0020 × 0308 × 0020 × 007D × 202F × 00BB × 0028 × 0065 × 0308 × 0029 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER M (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER G (AL) × [28.0] LATIN SMALL LETTER U (AL) × [19.01] LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] LEFT CURLY BRACKET (OP) × [7.01] SPACE (SP) × [14.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] RIGHT CURLY BRACKET (CL) × [12.1] NARROW NO-BREAK SPACE (GL) × [12.0] RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (QU) × [15.0] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER E (AL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] RIGHT PARENTHESIS (CP) ÷ [0.3] × 0028 × 0063 × 007A × 0065 × 0072 × 0077 × 006F × 006E × 006F × 00AD ÷ 2011 × 0029 × 006E × 0069 × 0065 × 0062 × 0069 × 0065 × 0073 × 006B × 0061 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER Z (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER W (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER O (AL) × [21.01] SOFT HYPHEN (BA) ÷ [999.0] NON-BREAKING HYPHEN (GL) × [12.0] RIGHT PARENTHESIS (CP) × [30.02] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER S (AL) × [28.0] LATIN SMALL LETTER K (AL) × [28.0] LATIN SMALL LETTER A (AL) ÷ [0.3] × 0028 × 0063 × 007A × 0065 × 0072 × 0077 × 006F × 006E × 006F × 00AD × 0029 × 2011 × 006E × 0069 × 0065 × 0062 × 0069 × 0065 × 0073 × 006B × 0061 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER Z (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER W (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER O (AL) × [21.01] SOFT HYPHEN (BA) × [13.02] RIGHT PARENTHESIS (CP) × [12.1] NON-BREAKING HYPHEN (GL) × [12.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER S (AL) × [28.0] LATIN SMALL LETTER K (AL) × [28.0] LATIN SMALL LETTER A (AL) ÷ [0.3] × 0028 × 0063 × 007A × 0065 × 0072 × 0077 × 006F × 006E × 006F × 0029 × 00AD ÷ 2011 × 006E × 0069 × 0065 × 0062 × 0069 × 0065 × 0073 × 006B × 0061 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER Z (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER R (AL) × [28.0] LATIN SMALL LETTER W (AL) × [28.0] LATIN SMALL LETTER O (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER O (AL) × [13.02] RIGHT PARENTHESIS (CP) × [21.01] SOFT HYPHEN (BA) ÷ [999.0] NON-BREAKING HYPHEN (GL) × [12.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER B (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER E (AL) × [28.0] LATIN SMALL LETTER S (AL) × [28.0] LATIN SMALL LETTER K (AL) × [28.0] LATIN SMALL LETTER A (AL) ÷ [0.3] @@ -6187,10 +7194,10 @@ × 0028 × 30CB × 30E5 × 30FC × 0029 × 30FB ÷ 30E8 × 30FC ÷ 30AF ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] KATAKANA LETTER NI (ID) × [21.03] KATAKANA LETTER SMALL YU (CJ_NS) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) × [13.02] RIGHT PARENTHESIS (CP) × [16.0] KATAKANA MIDDLE DOT (NS) ÷ [999.0] KATAKANA LETTER YO (ID) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) ÷ [999.0] KATAKANA LETTER KU (ID) ÷ [0.3] × 007B × 30CB × 30E5 × 30FC × 30FB × 007D ÷ 30E8 × 30FC ÷ 30AF ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] KATAKANA LETTER NI (ID) × [21.03] KATAKANA LETTER SMALL YU (CJ_NS) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) × [21.03] KATAKANA MIDDLE DOT (NS) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] KATAKANA LETTER YO (ID) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) ÷ [999.0] KATAKANA LETTER KU (ID) ÷ [0.3] × 007B × 30CB × 30E5 × 30FC × 007D × 30FB ÷ 30E8 × 30FC ÷ 30AF ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] KATAKANA LETTER NI (ID) × [21.03] KATAKANA LETTER SMALL YU (CJ_NS) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) × [13.02] RIGHT CURLY BRACKET (CL) × [16.0] KATAKANA MIDDLE DOT (NS) ÷ [999.0] KATAKANA LETTER YO (ID) × [21.03] KATAKANA-HIRAGANA PROLONGED SOUND MARK (CJ_NS) ÷ [999.0] KATAKANA LETTER KU (ID) ÷ [0.3] -× 0028 × 1850 × 1846 × 1851 × 1846 ÷ 1806 × 0029 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [13.02] RIGHT PARENTHESIS (CP) × [30.02] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM) ÷ [0.3] -× 0028 × 1850 × 1846 × 1851 × 1846 × 0029 ÷ 1806 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [21.04] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM) ÷ [0.3] -× 007B × 1850 × 1846 × 1851 × 1846 ÷ 1806 × 007D ÷ 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM) ÷ [0.3] -× 007B × 1850 × 1846 × 1851 × 1846 × 007D ÷ 1806 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [21.04] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM) ÷ [0.3] +× 0028 × 1850 × 1846 × 1851 × 1846 ÷ 1806 × 0029 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [13.02] RIGHT PARENTHESIS (CP) × [30.02] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM1_CM) ÷ [0.3] +× 0028 × 1850 × 1846 × 1851 × 1846 × 0029 ÷ 1806 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [13.02] RIGHT PARENTHESIS (CP) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [21.04] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM1_CM) ÷ [0.3] +× 007B × 1850 × 1846 × 1851 × 1846 ÷ 1806 × 007D ÷ 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM1_CM) ÷ [0.3] +× 007B × 1850 × 1846 × 1851 × 1846 × 007D ÷ 1806 × 182A × 1822 × 1834 × 1822 × 182D × 180C ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] MONGOLIAN LETTER TODO TA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [28.0] MONGOLIAN LETTER TODO DA (AL) × [28.0] MONGOLIAN LETTER TODO O (AL) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] MONGOLIAN TODO SOFT HYPHEN (BB) × [21.04] MONGOLIAN LETTER BA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER CHA (AL) × [28.0] MONGOLIAN LETTER I (AL) × [28.0] MONGOLIAN LETTER GA (AL) × [9.0] MONGOLIAN FREE VARIATION SELECTOR TWO (CM1_CM) ÷ [0.3] × 0028 × 0068 × 0074 × 0074 × 0070 × 003A × 002F × 002F × 0029 × 0078 × 006E × 002D × 002D ÷ 0061 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] LATIN SMALL LETTER H (AL) × [28.0] LATIN SMALL LETTER T (AL) × [28.0] LATIN SMALL LETTER T (AL) × [28.0] LATIN SMALL LETTER P (AL) × [13.02] COLON (IS) × [13.02] SOLIDUS (SY) × [13.02] SOLIDUS (SY) × [13.02] RIGHT PARENTHESIS (CP) × [30.02] LATIN SMALL LETTER X (AL) × [28.0] LATIN SMALL LETTER N (AL) × [21.02] HYPHEN-MINUS (HY) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LATIN SMALL LETTER A (AL) ÷ [0.3] × 007B × 0068 × 0074 × 0074 × 0070 × 003A × 002F × 002F × 007D ÷ 0078 × 006E × 002D × 002D ÷ 0061 ÷ # × [0.3] LEFT CURLY BRACKET (OP) × [14.0] LATIN SMALL LETTER H (AL) × [28.0] LATIN SMALL LETTER T (AL) × [28.0] LATIN SMALL LETTER T (AL) × [28.0] LATIN SMALL LETTER P (AL) × [13.02] COLON (IS) × [13.02] SOLIDUS (SY) × [13.02] SOLIDUS (SY) × [13.02] RIGHT CURLY BRACKET (CL) ÷ [999.0] LATIN SMALL LETTER X (AL) × [28.0] LATIN SMALL LETTER N (AL) × [21.02] HYPHEN-MINUS (HY) × [21.02] HYPHEN-MINUS (HY) ÷ [999.0] LATIN SMALL LETTER A (AL) ÷ [0.3] × 0028 × 0030 × 002C × 0031 × 0029 × 002B × 0028 × 0032 × 002C × 0033 × 0029 × 2295 × 0028 × 2212 × 0034 × 002C × 0035 × 0029 × 2296 × 0028 × 0036 × 002C × 0037 × 0029 ÷ # × [0.3] LEFT PARENTHESIS (OP) × [14.0] DIGIT ZERO (NU) × [25.03] COMMA (IS) × [25.04] DIGIT ONE (NU) × [25.04] RIGHT PARENTHESIS (CP) × [25.05] PLUS SIGN (PR) × [25.01] LEFT PARENTHESIS (OP) × [14.0] DIGIT TWO (NU) × [25.03] COMMA (IS) × [25.04] DIGIT THREE (NU) × [25.04] RIGHT PARENTHESIS (CP) × [30.02] CIRCLED PLUS (AI_AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] MINUS SIGN (PR) × [25.01] DIGIT FOUR (NU) × [25.03] COMMA (IS) × [25.04] DIGIT FIVE (NU) × [25.04] RIGHT PARENTHESIS (CP) × [30.02] CIRCLED MINUS (AL) × [30.01] LEFT PARENTHESIS (OP) × [14.0] DIGIT SIX (NU) × [25.03] COMMA (IS) × [25.04] DIGIT SEVEN (NU) × [25.04] RIGHT PARENTHESIS (CP) ÷ [0.3] @@ -6199,8 +7206,8 @@ × 0061 × 0062 × 0020 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER B (AL) × [7.01] SPACE (SP) ÷ [0.3] × 0061 × 0062 × 0020 ÷ 0063 ÷ # × [0.3] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER B (AL) × [7.01] SPACE (SP) ÷ [18.0] LATIN SMALL LETTER C (AL) ÷ [0.3] × 0061 ÷ 307E ÷ # × [0.3] LATIN SMALL LETTER A (AL) ÷ [999.0] HIRAGANA LETTER MA (ID) ÷ [0.3] -× 0939 × 093F × 0928 × 094D × 0926 × 0940 × 0020 ÷ # × [0.3] DEVANAGARI LETTER HA (AL) × [9.0] DEVANAGARI VOWEL SIGN I (CM) × [28.0] DEVANAGARI LETTER NA (AL) × [9.0] DEVANAGARI SIGN VIRAMA (CM) × [28.0] DEVANAGARI LETTER DA (AL) × [9.0] DEVANAGARI VOWEL SIGN II (CM) × [7.01] SPACE (SP) ÷ [0.3] -× 092F × 0938 × 0917 × 0941 × 091A × 093F × 0924 × 0940 × 092F × 0938 × 093E × 0020 ÷ # × [0.3] DEVANAGARI LETTER YA (AL) × [28.0] DEVANAGARI LETTER SA (AL) × [28.0] DEVANAGARI LETTER GA (AL) × [9.0] DEVANAGARI VOWEL SIGN U (CM) × [28.0] DEVANAGARI LETTER CA (AL) × [9.0] DEVANAGARI VOWEL SIGN I (CM) × [28.0] DEVANAGARI LETTER TA (AL) × [9.0] DEVANAGARI VOWEL SIGN II (CM) × [28.0] DEVANAGARI LETTER YA (AL) × [28.0] DEVANAGARI LETTER SA (AL) × [9.0] DEVANAGARI VOWEL SIGN AA (CM) × [7.01] SPACE (SP) ÷ [0.3] +× 0939 × 093F × 0928 × 094D × 0926 × 0940 × 0020 ÷ # × [0.3] DEVANAGARI LETTER HA (AL) × [9.0] DEVANAGARI VOWEL SIGN I (CM1_CM) × [28.0] DEVANAGARI LETTER NA (AL) × [9.0] DEVANAGARI SIGN VIRAMA (CM1_CM) × [28.0] DEVANAGARI LETTER DA (AL) × [9.0] DEVANAGARI VOWEL SIGN II (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] +× 092F × 0938 × 0917 × 0941 × 091A × 093F × 0924 × 0940 × 092F × 0938 × 093E × 0020 ÷ # × [0.3] DEVANAGARI LETTER YA (AL) × [28.0] DEVANAGARI LETTER SA (AL) × [28.0] DEVANAGARI LETTER GA (AL) × [9.0] DEVANAGARI VOWEL SIGN U (CM1_CM) × [28.0] DEVANAGARI LETTER CA (AL) × [9.0] DEVANAGARI VOWEL SIGN I (CM1_CM) × [28.0] DEVANAGARI LETTER TA (AL) × [9.0] DEVANAGARI VOWEL SIGN II (CM1_CM) × [28.0] DEVANAGARI LETTER YA (AL) × [28.0] DEVANAGARI LETTER SA (AL) × [9.0] DEVANAGARI VOWEL SIGN AA (CM1_CM) × [7.01] SPACE (SP) ÷ [0.3] × 5370 ÷ 672C ÷ # × [0.3] CJK UNIFIED IDEOGRAPH-5370 (ID) ÷ [999.0] CJK UNIFIED IDEOGRAPH-672C (ID) ÷ [0.3] × 8AAD ÷ 3080 ÷ # × [0.3] CJK UNIFIED IDEOGRAPH-8AAD (ID) ÷ [999.0] HIRAGANA LETTER MU (ID) ÷ [0.3] × 5165 ÷ 529B ÷ 3057 ÷ 30A8 ÷ # × [0.3] CJK UNIFIED IDEOGRAPH-5165 (ID) ÷ [999.0] CJK UNIFIED IDEOGRAPH-529B (ID) ÷ [999.0] HIRAGANA LETTER SI (ID) ÷ [999.0] KATAKANA LETTER E (ID) ÷ [0.3] @@ -6324,16 +7331,11 @@ × 3057 × 3001 ÷ 0061 × 0062 ÷ 3068 ÷ # × [0.3] HIRAGANA LETTER SI (ID) × [13.02] IDEOGRAPHIC COMMA (CL) ÷ [999.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER B (AL) ÷ [999.0] HIRAGANA LETTER TO (ID) ÷ [0.3] × 0061 ÷ 1F1E6 ÷ 0062 ÷ # × [0.3] LATIN SMALL LETTER A (AL) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER B (AL) ÷ [0.3] × 1F1F7 × 1F1FA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) ÷ [0.3] -× 1F1F7 × 1F1FA × 1F1F8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER S (RI) ÷ [0.3] -× 1F1F7 × 1F1FA × 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3] -× 1F1F7 × 1F1FA × 200B ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3] +× 1F1F7 × 1F1FA ÷ 1F1F8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) ÷ [30.13] REGIONAL INDICATOR SYMBOL LETTER S (RI) ÷ [0.3] +× 1F1F7 × 1F1FA ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) ÷ [30.13] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3] +× 1F1F7 × 1F1FA × 200B ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.12] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3] × 05D0 × 002D × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.02] HYPHEN-MINUS (HY) × [21.1] HEBREW LETTER ALEF (HL) ÷ [0.3] -× 1F1E6 × 1F1E7 × 1F1E8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [0.3] -× 1F1E6 × 200D × 1F1E7 × 1F1E8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (CM) × [30.11] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [0.3] -× 1F1E6 × 1F1E7 × 200D × 1F1E8 ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [9.0] ZERO WIDTH JOINER (CM) × [30.11] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [0.3] -× 0020 ÷ 200D × 0646 ÷ # × [0.3] SPACE (SP) ÷ [18.0] ZERO WIDTH JOINER (CM) × [28.0] ARABIC LETTER NOON (AL) ÷ [0.3] -× 0646 × 200D × 0020 ÷ # × [0.3] ARABIC LETTER NOON (AL) × [9.0] ZERO WIDTH JOINER (CM) × [7.01] SPACE (SP) ÷ [0.3] # -# Lines: 6311 +# Lines: 7312 # # EOF diff --git a/tests/data/NormalizationTest.txt b/tests/data/NormalizationTest.txt index 0290080998..e133fa8a78 100644 --- a/tests/data/NormalizationTest.txt +++ b/tests/data/NormalizationTest.txt @@ -1,10 +1,11 @@ -# NormalizationTest-8.0.0.txt -# Date: 2015-02-13, 13:30:27 GMT [MD] +# NormalizationTest-9.0.0.txt +# Date: 2016-04-04, 11:41:55 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Normalization Test Suite # Format: @@ -63,6 +64,8 @@ 0045 0300 0304;00C8 0304;0045 0300 0304;00C8 0304;0045 0300 0304; # (E◌̀◌̄; È◌̄; E◌̀◌̄; È◌̄; E◌̀◌̄; ) LATIN CAPITAL LETTER E, COMBINING GRAVE ACCENT, COMBINING MACRON 05B8 05B9 05B1 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F; # (◌ָ◌ֹ◌ֱ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ) HEBREW POINT QAMATS, HEBREW POINT HOLAM, HEBREW POINT HATAF SEGOL, HEBREW ACCENT ETNAHTA, HEBREW PUNCTUATION SOF PASUQ, HEBREW POINT SHEVA, HEBREW ACCENT ILUY, HEBREW ACCENT QARNEY PARA 0592 05B7 05BC 05A5 05B0 05C0 05C4 05AD;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4; # (◌֒◌ַ◌ּ◌֥◌ְ׀◌ׄ◌֭; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ) HEBREW ACCENT SEGOL, HEBREW POINT PATAH, HEBREW POINT DAGESH OR MAPIQ, HEBREW ACCENT MERKHA, HEBREW POINT SHEVA, HEBREW PUNCTUATION PASEQ, HEBREW MARK UPPER DOT, HEBREW ACCENT DEHI +1100 AC00 11A8;1100 AC01;1100 1100 1161 11A8;1100 AC01;1100 1100 1161 11A8; # (ᄀ각; ᄀ각; ᄀ각; ᄀ각; ᄀ각; ) HANGUL CHOSEONG KIYEOK, HANGUL SYLLABLE GA, HANGUL JONGSEONG KIYEOK +1100 AC00 11A8 11A8;1100 AC01 11A8;1100 1100 1161 11A8 11A8;1100 AC01 11A8;1100 1100 1161 11A8 11A8; # (ᄀ각ᆨ; ᄀ각ᆨ; ᄀ각ᆨ; ᄀ각ᆨ; ᄀ각ᆨ; ) HANGUL CHOSEONG KIYEOK, HANGUL SYLLABLE GA, HANGUL JONGSEONG KIYEOK, HANGUL JONGSEONG KIYEOK # @Part1 # Character by character test # All characters not explicitly occurring in c1 of Part 1 have identical NFC, D, KC, KD forms. @@ -16407,6 +16410,7 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 1F238;1F238;1F238;7533;7533; # (🈸; 🈸; 🈸; 申; 申; ) SQUARED CJK UNIFIED IDEOGRAPH-7533 1F239;1F239;1F239;5272;5272; # (🈹; 🈹; 🈹; 割; 割; ) SQUARED CJK UNIFIED IDEOGRAPH-5272 1F23A;1F23A;1F23A;55B6;55B6; # (🈺; 🈺; 🈺; 営; 営; ) SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F23B;1F23B;1F23B;914D;914D; # (🈻; 🈻; 🈻; 配; 配; ) SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240;1F240;1F240;3014 672C 3015;3014 672C 3015; # (🉀; 🉀; 🉀; 〔本〕; 〔本〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C 1F241;1F241;1F241;3014 4E09 3015;3014 4E09 3015; # (🉁; 🉁; 🉁; 〔三〕; 〔三〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 1F242;1F242;1F242;3014 4E8C 3015;3014 4E8C 3015; # (🉂; 🉂; 🉂; 〔二〕; 〔二〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C @@ -17523,6 +17527,34 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 085A 059A 0316 302A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062; # (a◌࡚◌֚◌̖◌〪b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC VOCALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 059A 0316 302A 085B 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062; # (a◌֚◌̖◌〪◌࡛b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MANDAIC GEMINATION MARK, LATIN SMALL LETTER B 0061 085B 059A 0316 302A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062; # (a◌࡛◌֚◌̖◌〪b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC GEMINATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D4 0062;00E0 05AE 08D4 0315 0062;0061 05AE 0300 08D4 0315 0062;00E0 05AE 08D4 0315 0062;0061 05AE 0300 08D4 0315 0062; # (a◌̕◌̀◌֮◌ࣔb; à◌֮◌ࣔ◌̕b; a◌֮◌̀◌ࣔ◌̕b; à◌֮◌ࣔ◌̕b; a◌֮◌̀◌ࣔ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AR-RUB, LATIN SMALL LETTER B +0061 08D4 0315 0300 05AE 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062; # (a◌ࣔ◌̕◌̀◌֮b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AR-RUB, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D5 0062;00E0 05AE 08D5 0315 0062;0061 05AE 0300 08D5 0315 0062;00E0 05AE 08D5 0315 0062;0061 05AE 0300 08D5 0315 0062; # (a◌̕◌̀◌֮◌ࣕb; à◌֮◌ࣕ◌̕b; a◌֮◌̀◌ࣕ◌̕b; à◌֮◌ࣕ◌̕b; a◌֮◌̀◌ࣕ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SAD, LATIN SMALL LETTER B +0061 08D5 0315 0300 05AE 0062;0061 05AE 08D5 0300 0315 0062;0061 05AE 08D5 0300 0315 0062;0061 05AE 08D5 0300 0315 0062;0061 05AE 08D5 0300 0315 0062; # (a◌ࣕ◌̕◌̀◌֮b; a◌֮◌ࣕ◌̀◌̕b; a◌֮◌ࣕ◌̀◌̕b; a◌֮◌ࣕ◌̀◌̕b; a◌֮◌ࣕ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH SAD, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D6 0062;00E0 05AE 08D6 0315 0062;0061 05AE 0300 08D6 0315 0062;00E0 05AE 08D6 0315 0062;0061 05AE 0300 08D6 0315 0062; # (a◌̕◌̀◌֮◌ࣖb; à◌֮◌ࣖ◌̕b; a◌֮◌̀◌ࣖ◌̕b; à◌֮◌ࣖ◌̕b; a◌֮◌̀◌ࣖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH AIN, LATIN SMALL LETTER B +0061 08D6 0315 0300 05AE 0062;0061 05AE 08D6 0300 0315 0062;0061 05AE 08D6 0300 0315 0062;0061 05AE 08D6 0300 0315 0062;0061 05AE 08D6 0300 0315 0062; # (a◌ࣖ◌̕◌̀◌֮b; a◌֮◌ࣖ◌̀◌̕b; a◌֮◌ࣖ◌̀◌̕b; a◌֮◌ࣖ◌̀◌̕b; a◌֮◌ࣖ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH AIN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D7 0062;00E0 05AE 08D7 0315 0062;0061 05AE 0300 08D7 0315 0062;00E0 05AE 08D7 0315 0062;0061 05AE 0300 08D7 0315 0062; # (a◌̕◌̀◌֮◌ࣗb; à◌֮◌ࣗ◌̕b; a◌֮◌̀◌ࣗ◌̕b; à◌֮◌ࣗ◌̕b; a◌֮◌̀◌ࣗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH QAF, LATIN SMALL LETTER B +0061 08D7 0315 0300 05AE 0062;0061 05AE 08D7 0300 0315 0062;0061 05AE 08D7 0300 0315 0062;0061 05AE 08D7 0300 0315 0062;0061 05AE 08D7 0300 0315 0062; # (a◌ࣗ◌̕◌̀◌֮b; a◌֮◌ࣗ◌̀◌̕b; a◌֮◌ࣗ◌̀◌̕b; a◌֮◌ࣗ◌̀◌̕b; a◌֮◌ࣗ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH QAF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D8 0062;00E0 05AE 08D8 0315 0062;0061 05AE 0300 08D8 0315 0062;00E0 05AE 08D8 0315 0062;0061 05AE 0300 08D8 0315 0062; # (a◌̕◌̀◌֮◌ࣘb; à◌֮◌ࣘ◌̕b; a◌֮◌̀◌ࣘ◌̕b; à◌֮◌ࣘ◌̕b; a◌֮◌̀◌ࣘ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH NOON WITH KASRA, LATIN SMALL LETTER B +0061 08D8 0315 0300 05AE 0062;0061 05AE 08D8 0300 0315 0062;0061 05AE 08D8 0300 0315 0062;0061 05AE 08D8 0300 0315 0062;0061 05AE 08D8 0300 0315 0062; # (a◌ࣘ◌̕◌̀◌֮b; a◌֮◌ࣘ◌̀◌̕b; a◌֮◌ࣘ◌̀◌̕b; a◌֮◌ࣘ◌̀◌̕b; a◌֮◌ࣘ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH NOON WITH KASRA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D9 0062;00E0 05AE 08D9 0315 0062;0061 05AE 0300 08D9 0315 0062;00E0 05AE 08D9 0315 0062;0061 05AE 0300 08D9 0315 0062; # (a◌̕◌̀◌֮◌ࣙb; à◌֮◌ࣙ◌̕b; a◌֮◌̀◌ࣙ◌̕b; à◌֮◌ࣙ◌̕b; a◌֮◌̀◌ࣙ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL LOW NOON WITH KASRA, LATIN SMALL LETTER B +0061 08D9 0315 0300 05AE 0062;0061 05AE 08D9 0300 0315 0062;0061 05AE 08D9 0300 0315 0062;0061 05AE 08D9 0300 0315 0062;0061 05AE 08D9 0300 0315 0062; # (a◌ࣙ◌̕◌̀◌֮b; a◌֮◌ࣙ◌̀◌̕b; a◌֮◌ࣙ◌̀◌̕b; a◌֮◌ࣙ◌̀◌̕b; a◌֮◌ࣙ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW NOON WITH KASRA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DA 0062;00E0 05AE 08DA 0315 0062;0061 05AE 0300 08DA 0315 0062;00E0 05AE 08DA 0315 0062;0061 05AE 0300 08DA 0315 0062; # (a◌̕◌̀◌֮◌ࣚb; à◌֮◌ࣚ◌̕b; a◌֮◌̀◌ࣚ◌̕b; à◌֮◌ࣚ◌̕b; a◌֮◌̀◌ࣚ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD ATH-THALATHA, LATIN SMALL LETTER B +0061 08DA 0315 0300 05AE 0062;0061 05AE 08DA 0300 0315 0062;0061 05AE 08DA 0300 0315 0062;0061 05AE 08DA 0300 0315 0062;0061 05AE 08DA 0300 0315 0062; # (a◌ࣚ◌̕◌̀◌֮b; a◌֮◌ࣚ◌̀◌̕b; a◌֮◌ࣚ◌̀◌̕b; a◌֮◌ࣚ◌̀◌̕b; a◌֮◌ࣚ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD ATH-THALATHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DB 0062;00E0 05AE 08DB 0315 0062;0061 05AE 0300 08DB 0315 0062;00E0 05AE 08DB 0315 0062;0061 05AE 0300 08DB 0315 0062; # (a◌̕◌̀◌֮◌ࣛb; à◌֮◌ࣛ◌̕b; a◌֮◌̀◌ࣛ◌̕b; à◌֮◌ࣛ◌̕b; a◌֮◌̀◌ࣛ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AS-SAJDA, LATIN SMALL LETTER B +0061 08DB 0315 0300 05AE 0062;0061 05AE 08DB 0300 0315 0062;0061 05AE 08DB 0300 0315 0062;0061 05AE 08DB 0300 0315 0062;0061 05AE 08DB 0300 0315 0062; # (a◌ࣛ◌̕◌̀◌֮b; a◌֮◌ࣛ◌̀◌̕b; a◌֮◌ࣛ◌̀◌̕b; a◌֮◌ࣛ◌̀◌̕b; a◌֮◌ࣛ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AS-SAJDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DC 0062;00E0 05AE 08DC 0315 0062;0061 05AE 0300 08DC 0315 0062;00E0 05AE 08DC 0315 0062;0061 05AE 0300 08DC 0315 0062; # (a◌̕◌̀◌֮◌ࣜb; à◌֮◌ࣜ◌̕b; a◌֮◌̀◌ࣜ◌̕b; à◌֮◌ࣜ◌̕b; a◌֮◌̀◌ࣜ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AN-NISF, LATIN SMALL LETTER B +0061 08DC 0315 0300 05AE 0062;0061 05AE 08DC 0300 0315 0062;0061 05AE 08DC 0300 0315 0062;0061 05AE 08DC 0300 0315 0062;0061 05AE 08DC 0300 0315 0062; # (a◌ࣜ◌̕◌̀◌֮b; a◌֮◌ࣜ◌̀◌̕b; a◌֮◌ࣜ◌̀◌̕b; a◌֮◌ࣜ◌̀◌̕b; a◌֮◌ࣜ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AN-NISF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DD 0062;00E0 05AE 08DD 0315 0062;0061 05AE 0300 08DD 0315 0062;00E0 05AE 08DD 0315 0062;0061 05AE 0300 08DD 0315 0062; # (a◌̕◌̀◌֮◌ࣝb; à◌֮◌ࣝ◌̕b; a◌֮◌̀◌ࣝ◌̕b; à◌֮◌ࣝ◌̕b; a◌֮◌̀◌ࣝ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD SAKTA, LATIN SMALL LETTER B +0061 08DD 0315 0300 05AE 0062;0061 05AE 08DD 0300 0315 0062;0061 05AE 08DD 0300 0315 0062;0061 05AE 08DD 0300 0315 0062;0061 05AE 08DD 0300 0315 0062; # (a◌ࣝ◌̕◌̀◌֮b; a◌֮◌ࣝ◌̀◌̕b; a◌֮◌ࣝ◌̀◌̕b; a◌֮◌ࣝ◌̀◌̕b; a◌֮◌ࣝ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD SAKTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DE 0062;00E0 05AE 08DE 0315 0062;0061 05AE 0300 08DE 0315 0062;00E0 05AE 08DE 0315 0062;0061 05AE 0300 08DE 0315 0062; # (a◌̕◌̀◌֮◌ࣞb; à◌֮◌ࣞ◌̕b; a◌֮◌̀◌ࣞ◌̕b; à◌֮◌ࣞ◌̕b; a◌֮◌̀◌ࣞ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD QIF, LATIN SMALL LETTER B +0061 08DE 0315 0300 05AE 0062;0061 05AE 08DE 0300 0315 0062;0061 05AE 08DE 0300 0315 0062;0061 05AE 08DE 0300 0315 0062;0061 05AE 08DE 0300 0315 0062; # (a◌ࣞ◌̕◌̀◌֮b; a◌֮◌ࣞ◌̀◌̕b; a◌֮◌ࣞ◌̀◌̕b; a◌֮◌ࣞ◌̀◌̕b; a◌֮◌ࣞ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD QIF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DF 0062;00E0 05AE 08DF 0315 0062;0061 05AE 0300 08DF 0315 0062;00E0 05AE 08DF 0315 0062;0061 05AE 0300 08DF 0315 0062; # (a◌̕◌̀◌֮◌ࣟb; à◌֮◌ࣟ◌̕b; a◌֮◌̀◌ࣟ◌̕b; à◌֮◌ࣟ◌̕b; a◌֮◌̀◌ࣟ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD WAQFA, LATIN SMALL LETTER B +0061 08DF 0315 0300 05AE 0062;0061 05AE 08DF 0300 0315 0062;0061 05AE 08DF 0300 0315 0062;0061 05AE 08DF 0300 0315 0062;0061 05AE 08DF 0300 0315 0062; # (a◌ࣟ◌̕◌̀◌֮b; a◌֮◌ࣟ◌̀◌̕b; a◌֮◌ࣟ◌̀◌̕b; a◌֮◌ࣟ◌̀◌̕b; a◌֮◌ࣟ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD WAQFA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08E0 0062;00E0 05AE 08E0 0315 0062;0061 05AE 0300 08E0 0315 0062;00E0 05AE 08E0 0315 0062;0061 05AE 0300 08E0 0315 0062; # (a◌̕◌̀◌֮◌࣠b; à◌֮◌࣠◌̕b; a◌֮◌̀◌࣠◌̕b; à◌֮◌࣠◌̕b; a◌֮◌̀◌࣠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH FOOTNOTE MARKER, LATIN SMALL LETTER B +0061 08E0 0315 0300 05AE 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062; # (a◌࣠◌̕◌̀◌֮b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH FOOTNOTE MARKER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08E1 0062;00E0 05AE 08E1 0315 0062;0061 05AE 0300 08E1 0315 0062;00E0 05AE 08E1 0315 0062;0061 05AE 0300 08E1 0315 0062; # (a◌̕◌̀◌֮◌࣡b; à◌֮◌࣡◌̕b; a◌֮◌̀◌࣡◌̕b; à◌֮◌࣡◌̕b; a◌֮◌̀◌࣡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SIGN SAFHA, LATIN SMALL LETTER B +0061 08E1 0315 0300 05AE 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062; # (a◌࣡◌̕◌̀◌֮b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH SIGN SAFHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 059A 0316 302A 08E3 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062; # (a◌֚◌̖◌〪◌ࣣb; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC TURNED DAMMA BELOW, LATIN SMALL LETTER B 0061 08E3 059A 0316 302A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062; # (a◌ࣣ◌֚◌̖◌〪b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TURNED DAMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 0315 0300 05AE 08E4 0062;00E0 05AE 08E4 0315 0062;0061 05AE 0300 08E4 0315 0062;00E0 05AE 08E4 0315 0062;0061 05AE 0300 08E4 0315 0062; # (a◌̕◌̀◌֮◌ࣤb; à◌֮◌ࣤ◌̕b; a◌֮◌̀◌ࣤ◌̕b; à◌֮◌ࣤ◌̕b; a◌֮◌̀◌ࣤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY FATHA, LATIN SMALL LETTER B @@ -17967,6 +17999,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 1DF4 0315 0300 05AE 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062; # (a◌ᷴ◌̕◌̀◌֮b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER U WITH DIAERESIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 0315 0300 05AE 1DF5 0062;00E0 05AE 1DF5 0315 0062;0061 05AE 0300 1DF5 0315 0062;00E0 05AE 1DF5 0315 0062;0061 05AE 0300 1DF5 0315 0062; # (a◌̕◌̀◌֮◌᷵b; à◌֮◌᷵◌̕b; a◌֮◌̀◌᷵◌̕b; à◌֮◌᷵◌̕b; a◌֮◌̀◌᷵◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING UP TACK ABOVE, LATIN SMALL LETTER B 0061 1DF5 0315 0300 05AE 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062; # (a◌᷵◌̕◌̀◌֮b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING UP TACK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DFB 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062; # (a◌̕◌̀◌֮◌᷻b; à◌֮◌᷻◌̕b; a◌֮◌̀◌᷻◌̕b; à◌֮◌᷻◌̕b; a◌֮◌̀◌᷻◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DELETION MARK, LATIN SMALL LETTER B +0061 1DFB 0315 0300 05AE 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062; # (a◌᷻◌̕◌̀◌֮b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DELETION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 035D 035C 0315 1DFC 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062; # (a◌͝◌͜◌̕◌᷼b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE INVERTED BREVE BELOW, LATIN SMALL LETTER B 0061 1DFC 035D 035C 0315 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062; # (a◌᷼◌͝◌͜◌̕b; a◌̕◌᷼◌͜◌͝b; a◌̕◌᷼◌͜◌͝b; a◌̕◌᷼◌͜◌͝b; a◌̕◌᷼◌͜◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE INVERTED BREVE BELOW, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B 0061 059A 0316 302A 1DFD 0062;0061 302A 0316 1DFD 059A 0062;0061 302A 0316 1DFD 059A 0062;0061 302A 0316 1DFD 059A 0062;0061 302A 0316 1DFD 059A 0062; # (a◌֚◌̖◌〪◌᷽b; a◌〪◌̖◌᷽◌֚b; a◌〪◌̖◌᷽◌֚b; a◌〪◌̖◌᷽◌֚b; a◌〪◌̖◌᷽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING ALMOST EQUAL TO BELOW, LATIN SMALL LETTER B @@ -18343,6 +18377,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 11373 0315 0300 05AE 0062;0061 05AE 11373 0300 0315 0062;0061 05AE 11373 0300 0315 0062;0061 05AE 11373 0300 0315 0062;0061 05AE 11373 0300 0315 0062; # (a◌𑍳◌̕◌̀◌֮b; a◌֮◌𑍳◌̀◌̕b; a◌֮◌𑍳◌̀◌̕b; a◌֮◌𑍳◌̀◌̕b; a◌֮◌𑍳◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA LETTER VI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 0315 0300 05AE 11374 0062;00E0 05AE 11374 0315 0062;0061 05AE 0300 11374 0315 0062;00E0 05AE 11374 0315 0062;0061 05AE 0300 11374 0315 0062; # (a◌̕◌̀◌֮◌𑍴b; à◌֮◌𑍴◌̕b; a◌֮◌̀◌𑍴◌̕b; à◌֮◌𑍴◌̕b; a◌֮◌̀◌𑍴◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA LETTER PA, LATIN SMALL LETTER B 0061 11374 0315 0300 05AE 0062;0061 05AE 11374 0300 0315 0062;0061 05AE 11374 0300 0315 0062;0061 05AE 11374 0300 0315 0062;0061 05AE 11374 0300 0315 0062; # (a◌𑍴◌̕◌̀◌֮b; a◌֮◌𑍴◌̀◌̕b; a◌֮◌𑍴◌̀◌̕b; a◌֮◌𑍴◌̀◌̕b; a◌֮◌𑍴◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA LETTER PA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 11442 0062;0061 3099 094D 11442 05B0 0062;0061 3099 094D 11442 05B0 0062;0061 3099 094D 11442 05B0 0062;0061 3099 094D 11442 05B0 0062; # (a◌ְ◌्◌゙◌𑑂b; a◌゙◌्◌𑑂◌ְb; a◌゙◌्◌𑑂◌ְb; a◌゙◌्◌𑑂◌ְb; a◌゙◌्◌𑑂◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, NEWA SIGN VIRAMA, LATIN SMALL LETTER B +0061 11442 05B0 094D 3099 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062; # (a◌𑑂◌ְ◌्◌゙b; a◌゙◌𑑂◌्◌ְb; a◌゙◌𑑂◌्◌ְb; a◌゙◌𑑂◌्◌ְb; a◌゙◌𑑂◌्◌ְb; ) LATIN SMALL LETTER A, NEWA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 0334 11446 0062;0061 0334 093C 11446 3099 0062;0061 0334 093C 11446 3099 0062;0061 0334 093C 11446 3099 0062;0061 0334 093C 11446 3099 0062; # (a◌゙◌़◌̴◌𑑆b; a◌̴◌़◌𑑆◌゙b; a◌̴◌़◌𑑆◌゙b; a◌̴◌़◌𑑆◌゙b; a◌̴◌़◌𑑆◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, NEWA SIGN NUKTA, LATIN SMALL LETTER B +0061 11446 3099 093C 0334 0062;0061 0334 11446 093C 3099 0062;0061 0334 11446 093C 3099 0062;0061 0334 11446 093C 3099 0062;0061 0334 11446 093C 3099 0062; # (a◌𑑆◌゙◌़◌̴b; a◌̴◌𑑆◌़◌゙b; a◌̴◌𑑆◌़◌゙b; a◌̴◌𑑆◌़◌゙b; a◌̴◌𑑆◌़◌゙b; ) LATIN SMALL LETTER A, NEWA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 05B0 094D 3099 114C2 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062; # (a◌ְ◌्◌゙◌𑓂b; a◌゙◌्◌𑓂◌ְb; a◌゙◌्◌𑓂◌ְb; a◌゙◌्◌𑓂◌ְb; a◌゙◌्◌𑓂◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TIRHUTA SIGN VIRAMA, LATIN SMALL LETTER B 0061 114C2 05B0 094D 3099 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062; # (a◌𑓂◌ְ◌्◌゙b; a◌゙◌𑓂◌्◌ְb; a◌゙◌𑓂◌्◌ְb; a◌゙◌𑓂◌्◌ְb; a◌゙◌𑓂◌्◌ְb; ) LATIN SMALL LETTER A, TIRHUTA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 3099 093C 0334 114C3 0062;0061 0334 093C 114C3 3099 0062;0061 0334 093C 114C3 3099 0062;0061 0334 093C 114C3 3099 0062;0061 0334 093C 114C3 3099 0062; # (a◌゙◌़◌̴◌𑓃b; a◌̴◌़◌𑓃◌゙b; a◌̴◌़◌𑓃◌゙b; a◌̴◌़◌𑓃◌゙b; a◌̴◌़◌𑓃◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, TIRHUTA SIGN NUKTA, LATIN SMALL LETTER B @@ -18359,6 +18397,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 116B7 3099 093C 0334 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062; # (a◌𑚷◌゙◌़◌̴b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; ) LATIN SMALL LETTER A, TAKRI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 05B0 094D 3099 1172B 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062; # (a◌ְ◌्◌゙◌𑜫b; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, AHOM SIGN KILLER, LATIN SMALL LETTER B 0061 1172B 05B0 094D 3099 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062; # (a◌𑜫◌ְ◌्◌゙b; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; ) LATIN SMALL LETTER A, AHOM SIGN KILLER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11C3F 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062; # (a◌ְ◌्◌゙◌𑰿b; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BHAIKSUKI SIGN VIRAMA, LATIN SMALL LETTER B +0061 11C3F 05B0 094D 3099 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062; # (a◌𑰿◌ְ◌्◌゙b; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; ) LATIN SMALL LETTER A, BHAIKSUKI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 093C 0334 16AF0 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062; # (a◌़◌̴◌𖫰b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING HIGH TONE, LATIN SMALL LETTER B 0061 16AF0 093C 0334 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062; # (a◌𖫰◌़◌̴b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING HIGH TONE, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 093C 0334 16AF1 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062; # (a◌़◌̴◌𖫱b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING LOW TONE, LATIN SMALL LETTER B @@ -18451,6 +18491,82 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 1D243 0315 0300 05AE 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062; # (a◌𝉃◌̕◌̀◌֮b; a◌֮◌𝉃◌̀◌̕b; a◌֮◌𝉃◌̀◌̕b; a◌֮◌𝉃◌̀◌̕b; a◌֮◌𝉃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK MUSICAL TETRASEME, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 0315 0300 05AE 1D244 0062;00E0 05AE 1D244 0315 0062;0061 05AE 0300 1D244 0315 0062;00E0 05AE 1D244 0315 0062;0061 05AE 0300 1D244 0315 0062; # (a◌̕◌̀◌֮◌𝉄b; à◌֮◌𝉄◌̕b; a◌֮◌̀◌𝉄◌̕b; à◌֮◌𝉄◌̕b; a◌֮◌̀◌𝉄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK MUSICAL PENTASEME, LATIN SMALL LETTER B 0061 1D244 0315 0300 05AE 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062; # (a◌𝉄◌̕◌̀◌֮b; a◌֮◌𝉄◌̀◌̕b; a◌֮◌𝉄◌̀◌̕b; a◌֮◌𝉄◌̀◌̕b; a◌֮◌𝉄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK MUSICAL PENTASEME, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E000 0062;00E0 05AE 1E000 0315 0062;0061 05AE 0300 1E000 0315 0062;00E0 05AE 1E000 0315 0062;0061 05AE 0300 1E000 0315 0062; # (a◌̕◌̀◌֮◌𞀀b; à◌֮◌𞀀◌̕b; a◌֮◌̀◌𞀀◌̕b; à◌֮◌𞀀◌̕b; a◌֮◌̀◌𞀀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER AZU, LATIN SMALL LETTER B +0061 1E000 0315 0300 05AE 0062;0061 05AE 1E000 0300 0315 0062;0061 05AE 1E000 0300 0315 0062;0061 05AE 1E000 0300 0315 0062;0061 05AE 1E000 0300 0315 0062; # (a◌𞀀◌̕◌̀◌֮b; a◌֮◌𞀀◌̀◌̕b; a◌֮◌𞀀◌̀◌̕b; a◌֮◌𞀀◌̀◌̕b; a◌֮◌𞀀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER AZU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E001 0062;00E0 05AE 1E001 0315 0062;0061 05AE 0300 1E001 0315 0062;00E0 05AE 1E001 0315 0062;0061 05AE 0300 1E001 0315 0062; # (a◌̕◌̀◌֮◌𞀁b; à◌֮◌𞀁◌̕b; a◌֮◌̀◌𞀁◌̕b; à◌֮◌𞀁◌̕b; a◌֮◌̀◌𞀁◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER BUKY, LATIN SMALL LETTER B +0061 1E001 0315 0300 05AE 0062;0061 05AE 1E001 0300 0315 0062;0061 05AE 1E001 0300 0315 0062;0061 05AE 1E001 0300 0315 0062;0061 05AE 1E001 0300 0315 0062; # (a◌𞀁◌̕◌̀◌֮b; a◌֮◌𞀁◌̀◌̕b; a◌֮◌𞀁◌̀◌̕b; a◌֮◌𞀁◌̀◌̕b; a◌֮◌𞀁◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER BUKY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E002 0062;00E0 05AE 1E002 0315 0062;0061 05AE 0300 1E002 0315 0062;00E0 05AE 1E002 0315 0062;0061 05AE 0300 1E002 0315 0062; # (a◌̕◌̀◌֮◌𞀂b; à◌֮◌𞀂◌̕b; a◌֮◌̀◌𞀂◌̕b; à◌֮◌𞀂◌̕b; a◌֮◌̀◌𞀂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER VEDE, LATIN SMALL LETTER B +0061 1E002 0315 0300 05AE 0062;0061 05AE 1E002 0300 0315 0062;0061 05AE 1E002 0300 0315 0062;0061 05AE 1E002 0300 0315 0062;0061 05AE 1E002 0300 0315 0062; # (a◌𞀂◌̕◌̀◌֮b; a◌֮◌𞀂◌̀◌̕b; a◌֮◌𞀂◌̀◌̕b; a◌֮◌𞀂◌̀◌̕b; a◌֮◌𞀂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER VEDE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E003 0062;00E0 05AE 1E003 0315 0062;0061 05AE 0300 1E003 0315 0062;00E0 05AE 1E003 0315 0062;0061 05AE 0300 1E003 0315 0062; # (a◌̕◌̀◌֮◌𞀃b; à◌֮◌𞀃◌̕b; a◌֮◌̀◌𞀃◌̕b; à◌֮◌𞀃◌̕b; a◌֮◌̀◌𞀃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER GLAGOLI, LATIN SMALL LETTER B +0061 1E003 0315 0300 05AE 0062;0061 05AE 1E003 0300 0315 0062;0061 05AE 1E003 0300 0315 0062;0061 05AE 1E003 0300 0315 0062;0061 05AE 1E003 0300 0315 0062; # (a◌𞀃◌̕◌̀◌֮b; a◌֮◌𞀃◌̀◌̕b; a◌֮◌𞀃◌̀◌̕b; a◌֮◌𞀃◌̀◌̕b; a◌֮◌𞀃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER GLAGOLI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E004 0062;00E0 05AE 1E004 0315 0062;0061 05AE 0300 1E004 0315 0062;00E0 05AE 1E004 0315 0062;0061 05AE 0300 1E004 0315 0062; # (a◌̕◌̀◌֮◌𞀄b; à◌֮◌𞀄◌̕b; a◌֮◌̀◌𞀄◌̕b; à◌֮◌𞀄◌̕b; a◌֮◌̀◌𞀄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER DOBRO, LATIN SMALL LETTER B +0061 1E004 0315 0300 05AE 0062;0061 05AE 1E004 0300 0315 0062;0061 05AE 1E004 0300 0315 0062;0061 05AE 1E004 0300 0315 0062;0061 05AE 1E004 0300 0315 0062; # (a◌𞀄◌̕◌̀◌֮b; a◌֮◌𞀄◌̀◌̕b; a◌֮◌𞀄◌̀◌̕b; a◌֮◌𞀄◌̀◌̕b; a◌֮◌𞀄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER DOBRO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E005 0062;00E0 05AE 1E005 0315 0062;0061 05AE 0300 1E005 0315 0062;00E0 05AE 1E005 0315 0062;0061 05AE 0300 1E005 0315 0062; # (a◌̕◌̀◌֮◌𞀅b; à◌֮◌𞀅◌̕b; a◌֮◌̀◌𞀅◌̕b; à◌֮◌𞀅◌̕b; a◌֮◌̀◌𞀅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YESTU, LATIN SMALL LETTER B +0061 1E005 0315 0300 05AE 0062;0061 05AE 1E005 0300 0315 0062;0061 05AE 1E005 0300 0315 0062;0061 05AE 1E005 0300 0315 0062;0061 05AE 1E005 0300 0315 0062; # (a◌𞀅◌̕◌̀◌֮b; a◌֮◌𞀅◌̀◌̕b; a◌֮◌𞀅◌̀◌̕b; a◌֮◌𞀅◌̀◌̕b; a◌֮◌𞀅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YESTU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E006 0062;00E0 05AE 1E006 0315 0062;0061 05AE 0300 1E006 0315 0062;00E0 05AE 1E006 0315 0062;0061 05AE 0300 1E006 0315 0062; # (a◌̕◌̀◌֮◌𞀆b; à◌֮◌𞀆◌̕b; a◌֮◌̀◌𞀆◌̕b; à◌֮◌𞀆◌̕b; a◌֮◌̀◌𞀆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER ZHIVETE, LATIN SMALL LETTER B +0061 1E006 0315 0300 05AE 0062;0061 05AE 1E006 0300 0315 0062;0061 05AE 1E006 0300 0315 0062;0061 05AE 1E006 0300 0315 0062;0061 05AE 1E006 0300 0315 0062; # (a◌𞀆◌̕◌̀◌֮b; a◌֮◌𞀆◌̀◌̕b; a◌֮◌𞀆◌̀◌̕b; a◌֮◌𞀆◌̀◌̕b; a◌֮◌𞀆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER ZHIVETE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E008 0062;00E0 05AE 1E008 0315 0062;0061 05AE 0300 1E008 0315 0062;00E0 05AE 1E008 0315 0062;0061 05AE 0300 1E008 0315 0062; # (a◌̕◌̀◌֮◌𞀈b; à◌֮◌𞀈◌̕b; a◌֮◌̀◌𞀈◌̕b; à◌֮◌𞀈◌̕b; a◌֮◌̀◌𞀈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER ZEMLJA, LATIN SMALL LETTER B +0061 1E008 0315 0300 05AE 0062;0061 05AE 1E008 0300 0315 0062;0061 05AE 1E008 0300 0315 0062;0061 05AE 1E008 0300 0315 0062;0061 05AE 1E008 0300 0315 0062; # (a◌𞀈◌̕◌̀◌֮b; a◌֮◌𞀈◌̀◌̕b; a◌֮◌𞀈◌̀◌̕b; a◌֮◌𞀈◌̀◌̕b; a◌֮◌𞀈◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER ZEMLJA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E009 0062;00E0 05AE 1E009 0315 0062;0061 05AE 0300 1E009 0315 0062;00E0 05AE 1E009 0315 0062;0061 05AE 0300 1E009 0315 0062; # (a◌̕◌̀◌֮◌𞀉b; à◌֮◌𞀉◌̕b; a◌֮◌̀◌𞀉◌̕b; à◌֮◌𞀉◌̕b; a◌֮◌̀◌𞀉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER IZHE, LATIN SMALL LETTER B +0061 1E009 0315 0300 05AE 0062;0061 05AE 1E009 0300 0315 0062;0061 05AE 1E009 0300 0315 0062;0061 05AE 1E009 0300 0315 0062;0061 05AE 1E009 0300 0315 0062; # (a◌𞀉◌̕◌̀◌֮b; a◌֮◌𞀉◌̀◌̕b; a◌֮◌𞀉◌̀◌̕b; a◌֮◌𞀉◌̀◌̕b; a◌֮◌𞀉◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER IZHE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00A 0062;00E0 05AE 1E00A 0315 0062;0061 05AE 0300 1E00A 0315 0062;00E0 05AE 1E00A 0315 0062;0061 05AE 0300 1E00A 0315 0062; # (a◌̕◌̀◌֮◌𞀊b; à◌֮◌𞀊◌̕b; a◌֮◌̀◌𞀊◌̕b; à◌֮◌𞀊◌̕b; a◌֮◌̀◌𞀊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER INITIAL IZHE, LATIN SMALL LETTER B +0061 1E00A 0315 0300 05AE 0062;0061 05AE 1E00A 0300 0315 0062;0061 05AE 1E00A 0300 0315 0062;0061 05AE 1E00A 0300 0315 0062;0061 05AE 1E00A 0300 0315 0062; # (a◌𞀊◌̕◌̀◌֮b; a◌֮◌𞀊◌̀◌̕b; a◌֮◌𞀊◌̀◌̕b; a◌֮◌𞀊◌̀◌̕b; a◌֮◌𞀊◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER INITIAL IZHE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00B 0062;00E0 05AE 1E00B 0315 0062;0061 05AE 0300 1E00B 0315 0062;00E0 05AE 1E00B 0315 0062;0061 05AE 0300 1E00B 0315 0062; # (a◌̕◌̀◌֮◌𞀋b; à◌֮◌𞀋◌̕b; a◌֮◌̀◌𞀋◌̕b; à◌֮◌𞀋◌̕b; a◌֮◌̀◌𞀋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER I, LATIN SMALL LETTER B +0061 1E00B 0315 0300 05AE 0062;0061 05AE 1E00B 0300 0315 0062;0061 05AE 1E00B 0300 0315 0062;0061 05AE 1E00B 0300 0315 0062;0061 05AE 1E00B 0300 0315 0062; # (a◌𞀋◌̕◌̀◌֮b; a◌֮◌𞀋◌̀◌̕b; a◌֮◌𞀋◌̀◌̕b; a◌֮◌𞀋◌̀◌̕b; a◌֮◌𞀋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00C 0062;00E0 05AE 1E00C 0315 0062;0061 05AE 0300 1E00C 0315 0062;00E0 05AE 1E00C 0315 0062;0061 05AE 0300 1E00C 0315 0062; # (a◌̕◌̀◌֮◌𞀌b; à◌֮◌𞀌◌̕b; a◌֮◌̀◌𞀌◌̕b; à◌֮◌𞀌◌̕b; a◌֮◌̀◌𞀌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER DJERVI, LATIN SMALL LETTER B +0061 1E00C 0315 0300 05AE 0062;0061 05AE 1E00C 0300 0315 0062;0061 05AE 1E00C 0300 0315 0062;0061 05AE 1E00C 0300 0315 0062;0061 05AE 1E00C 0300 0315 0062; # (a◌𞀌◌̕◌̀◌֮b; a◌֮◌𞀌◌̀◌̕b; a◌֮◌𞀌◌̀◌̕b; a◌֮◌𞀌◌̀◌̕b; a◌֮◌𞀌◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER DJERVI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00D 0062;00E0 05AE 1E00D 0315 0062;0061 05AE 0300 1E00D 0315 0062;00E0 05AE 1E00D 0315 0062;0061 05AE 0300 1E00D 0315 0062; # (a◌̕◌̀◌֮◌𞀍b; à◌֮◌𞀍◌̕b; a◌֮◌̀◌𞀍◌̕b; à◌֮◌𞀍◌̕b; a◌֮◌̀◌𞀍◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER KAKO, LATIN SMALL LETTER B +0061 1E00D 0315 0300 05AE 0062;0061 05AE 1E00D 0300 0315 0062;0061 05AE 1E00D 0300 0315 0062;0061 05AE 1E00D 0300 0315 0062;0061 05AE 1E00D 0300 0315 0062; # (a◌𞀍◌̕◌̀◌֮b; a◌֮◌𞀍◌̀◌̕b; a◌֮◌𞀍◌̀◌̕b; a◌֮◌𞀍◌̀◌̕b; a◌֮◌𞀍◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER KAKO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00E 0062;00E0 05AE 1E00E 0315 0062;0061 05AE 0300 1E00E 0315 0062;00E0 05AE 1E00E 0315 0062;0061 05AE 0300 1E00E 0315 0062; # (a◌̕◌̀◌֮◌𞀎b; à◌֮◌𞀎◌̕b; a◌֮◌̀◌𞀎◌̕b; à◌֮◌𞀎◌̕b; a◌֮◌̀◌𞀎◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER LJUDIJE, LATIN SMALL LETTER B +0061 1E00E 0315 0300 05AE 0062;0061 05AE 1E00E 0300 0315 0062;0061 05AE 1E00E 0300 0315 0062;0061 05AE 1E00E 0300 0315 0062;0061 05AE 1E00E 0300 0315 0062; # (a◌𞀎◌̕◌̀◌֮b; a◌֮◌𞀎◌̀◌̕b; a◌֮◌𞀎◌̀◌̕b; a◌֮◌𞀎◌̀◌̕b; a◌֮◌𞀎◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER LJUDIJE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00F 0062;00E0 05AE 1E00F 0315 0062;0061 05AE 0300 1E00F 0315 0062;00E0 05AE 1E00F 0315 0062;0061 05AE 0300 1E00F 0315 0062; # (a◌̕◌̀◌֮◌𞀏b; à◌֮◌𞀏◌̕b; a◌֮◌̀◌𞀏◌̕b; à◌֮◌𞀏◌̕b; a◌֮◌̀◌𞀏◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER MYSLITE, LATIN SMALL LETTER B +0061 1E00F 0315 0300 05AE 0062;0061 05AE 1E00F 0300 0315 0062;0061 05AE 1E00F 0300 0315 0062;0061 05AE 1E00F 0300 0315 0062;0061 05AE 1E00F 0300 0315 0062; # (a◌𞀏◌̕◌̀◌֮b; a◌֮◌𞀏◌̀◌̕b; a◌֮◌𞀏◌̀◌̕b; a◌֮◌𞀏◌̀◌̕b; a◌֮◌𞀏◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER MYSLITE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E010 0062;00E0 05AE 1E010 0315 0062;0061 05AE 0300 1E010 0315 0062;00E0 05AE 1E010 0315 0062;0061 05AE 0300 1E010 0315 0062; # (a◌̕◌̀◌֮◌𞀐b; à◌֮◌𞀐◌̕b; a◌֮◌̀◌𞀐◌̕b; à◌֮◌𞀐◌̕b; a◌֮◌̀◌𞀐◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER NASHI, LATIN SMALL LETTER B +0061 1E010 0315 0300 05AE 0062;0061 05AE 1E010 0300 0315 0062;0061 05AE 1E010 0300 0315 0062;0061 05AE 1E010 0300 0315 0062;0061 05AE 1E010 0300 0315 0062; # (a◌𞀐◌̕◌̀◌֮b; a◌֮◌𞀐◌̀◌̕b; a◌֮◌𞀐◌̀◌̕b; a◌֮◌𞀐◌̀◌̕b; a◌֮◌𞀐◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER NASHI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E011 0062;00E0 05AE 1E011 0315 0062;0061 05AE 0300 1E011 0315 0062;00E0 05AE 1E011 0315 0062;0061 05AE 0300 1E011 0315 0062; # (a◌̕◌̀◌֮◌𞀑b; à◌֮◌𞀑◌̕b; a◌֮◌̀◌𞀑◌̕b; à◌֮◌𞀑◌̕b; a◌֮◌̀◌𞀑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER ONU, LATIN SMALL LETTER B +0061 1E011 0315 0300 05AE 0062;0061 05AE 1E011 0300 0315 0062;0061 05AE 1E011 0300 0315 0062;0061 05AE 1E011 0300 0315 0062;0061 05AE 1E011 0300 0315 0062; # (a◌𞀑◌̕◌̀◌֮b; a◌֮◌𞀑◌̀◌̕b; a◌֮◌𞀑◌̀◌̕b; a◌֮◌𞀑◌̀◌̕b; a◌֮◌𞀑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER ONU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E012 0062;00E0 05AE 1E012 0315 0062;0061 05AE 0300 1E012 0315 0062;00E0 05AE 1E012 0315 0062;0061 05AE 0300 1E012 0315 0062; # (a◌̕◌̀◌֮◌𞀒b; à◌֮◌𞀒◌̕b; a◌֮◌̀◌𞀒◌̕b; à◌֮◌𞀒◌̕b; a◌֮◌̀◌𞀒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER POKOJI, LATIN SMALL LETTER B +0061 1E012 0315 0300 05AE 0062;0061 05AE 1E012 0300 0315 0062;0061 05AE 1E012 0300 0315 0062;0061 05AE 1E012 0300 0315 0062;0061 05AE 1E012 0300 0315 0062; # (a◌𞀒◌̕◌̀◌֮b; a◌֮◌𞀒◌̀◌̕b; a◌֮◌𞀒◌̀◌̕b; a◌֮◌𞀒◌̀◌̕b; a◌֮◌𞀒◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER POKOJI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E013 0062;00E0 05AE 1E013 0315 0062;0061 05AE 0300 1E013 0315 0062;00E0 05AE 1E013 0315 0062;0061 05AE 0300 1E013 0315 0062; # (a◌̕◌̀◌֮◌𞀓b; à◌֮◌𞀓◌̕b; a◌֮◌̀◌𞀓◌̕b; à◌֮◌𞀓◌̕b; a◌֮◌̀◌𞀓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER RITSI, LATIN SMALL LETTER B +0061 1E013 0315 0300 05AE 0062;0061 05AE 1E013 0300 0315 0062;0061 05AE 1E013 0300 0315 0062;0061 05AE 1E013 0300 0315 0062;0061 05AE 1E013 0300 0315 0062; # (a◌𞀓◌̕◌̀◌֮b; a◌֮◌𞀓◌̀◌̕b; a◌֮◌𞀓◌̀◌̕b; a◌֮◌𞀓◌̀◌̕b; a◌֮◌𞀓◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER RITSI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E014 0062;00E0 05AE 1E014 0315 0062;0061 05AE 0300 1E014 0315 0062;00E0 05AE 1E014 0315 0062;0061 05AE 0300 1E014 0315 0062; # (a◌̕◌̀◌֮◌𞀔b; à◌֮◌𞀔◌̕b; a◌֮◌̀◌𞀔◌̕b; à◌֮◌𞀔◌̕b; a◌֮◌̀◌𞀔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER SLOVO, LATIN SMALL LETTER B +0061 1E014 0315 0300 05AE 0062;0061 05AE 1E014 0300 0315 0062;0061 05AE 1E014 0300 0315 0062;0061 05AE 1E014 0300 0315 0062;0061 05AE 1E014 0300 0315 0062; # (a◌𞀔◌̕◌̀◌֮b; a◌֮◌𞀔◌̀◌̕b; a◌֮◌𞀔◌̀◌̕b; a◌֮◌𞀔◌̀◌̕b; a◌֮◌𞀔◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER SLOVO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E015 0062;00E0 05AE 1E015 0315 0062;0061 05AE 0300 1E015 0315 0062;00E0 05AE 1E015 0315 0062;0061 05AE 0300 1E015 0315 0062; # (a◌̕◌̀◌֮◌𞀕b; à◌֮◌𞀕◌̕b; a◌֮◌̀◌𞀕◌̕b; à◌֮◌𞀕◌̕b; a◌֮◌̀◌𞀕◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER TVRIDO, LATIN SMALL LETTER B +0061 1E015 0315 0300 05AE 0062;0061 05AE 1E015 0300 0315 0062;0061 05AE 1E015 0300 0315 0062;0061 05AE 1E015 0300 0315 0062;0061 05AE 1E015 0300 0315 0062; # (a◌𞀕◌̕◌̀◌֮b; a◌֮◌𞀕◌̀◌̕b; a◌֮◌𞀕◌̀◌̕b; a◌֮◌𞀕◌̀◌̕b; a◌֮◌𞀕◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER TVRIDO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E016 0062;00E0 05AE 1E016 0315 0062;0061 05AE 0300 1E016 0315 0062;00E0 05AE 1E016 0315 0062;0061 05AE 0300 1E016 0315 0062; # (a◌̕◌̀◌֮◌𞀖b; à◌֮◌𞀖◌̕b; a◌֮◌̀◌𞀖◌̕b; à◌֮◌𞀖◌̕b; a◌֮◌̀◌𞀖◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER UKU, LATIN SMALL LETTER B +0061 1E016 0315 0300 05AE 0062;0061 05AE 1E016 0300 0315 0062;0061 05AE 1E016 0300 0315 0062;0061 05AE 1E016 0300 0315 0062;0061 05AE 1E016 0300 0315 0062; # (a◌𞀖◌̕◌̀◌֮b; a◌֮◌𞀖◌̀◌̕b; a◌֮◌𞀖◌̀◌̕b; a◌֮◌𞀖◌̀◌̕b; a◌֮◌𞀖◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER UKU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E017 0062;00E0 05AE 1E017 0315 0062;0061 05AE 0300 1E017 0315 0062;00E0 05AE 1E017 0315 0062;0061 05AE 0300 1E017 0315 0062; # (a◌̕◌̀◌֮◌𞀗b; à◌֮◌𞀗◌̕b; a◌֮◌̀◌𞀗◌̕b; à◌֮◌𞀗◌̕b; a◌֮◌̀◌𞀗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER FRITU, LATIN SMALL LETTER B +0061 1E017 0315 0300 05AE 0062;0061 05AE 1E017 0300 0315 0062;0061 05AE 1E017 0300 0315 0062;0061 05AE 1E017 0300 0315 0062;0061 05AE 1E017 0300 0315 0062; # (a◌𞀗◌̕◌̀◌֮b; a◌֮◌𞀗◌̀◌̕b; a◌֮◌𞀗◌̀◌̕b; a◌֮◌𞀗◌̀◌̕b; a◌֮◌𞀗◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER FRITU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E018 0062;00E0 05AE 1E018 0315 0062;0061 05AE 0300 1E018 0315 0062;00E0 05AE 1E018 0315 0062;0061 05AE 0300 1E018 0315 0062; # (a◌̕◌̀◌֮◌𞀘b; à◌֮◌𞀘◌̕b; a◌֮◌̀◌𞀘◌̕b; à◌֮◌𞀘◌̕b; a◌֮◌̀◌𞀘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER HERU, LATIN SMALL LETTER B +0061 1E018 0315 0300 05AE 0062;0061 05AE 1E018 0300 0315 0062;0061 05AE 1E018 0300 0315 0062;0061 05AE 1E018 0300 0315 0062;0061 05AE 1E018 0300 0315 0062; # (a◌𞀘◌̕◌̀◌֮b; a◌֮◌𞀘◌̀◌̕b; a◌֮◌𞀘◌̀◌̕b; a◌֮◌𞀘◌̀◌̕b; a◌֮◌𞀘◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER HERU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01B 0062;00E0 05AE 1E01B 0315 0062;0061 05AE 0300 1E01B 0315 0062;00E0 05AE 1E01B 0315 0062;0061 05AE 0300 1E01B 0315 0062; # (a◌̕◌̀◌֮◌𞀛b; à◌֮◌𞀛◌̕b; a◌֮◌̀◌𞀛◌̕b; à◌֮◌𞀛◌̕b; a◌֮◌̀◌𞀛◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER SHTA, LATIN SMALL LETTER B +0061 1E01B 0315 0300 05AE 0062;0061 05AE 1E01B 0300 0315 0062;0061 05AE 1E01B 0300 0315 0062;0061 05AE 1E01B 0300 0315 0062;0061 05AE 1E01B 0300 0315 0062; # (a◌𞀛◌̕◌̀◌֮b; a◌֮◌𞀛◌̀◌̕b; a◌֮◌𞀛◌̀◌̕b; a◌֮◌𞀛◌̀◌̕b; a◌֮◌𞀛◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER SHTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01C 0062;00E0 05AE 1E01C 0315 0062;0061 05AE 0300 1E01C 0315 0062;00E0 05AE 1E01C 0315 0062;0061 05AE 0300 1E01C 0315 0062; # (a◌̕◌̀◌֮◌𞀜b; à◌֮◌𞀜◌̕b; a◌֮◌̀◌𞀜◌̕b; à◌֮◌𞀜◌̕b; a◌֮◌̀◌𞀜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER TSI, LATIN SMALL LETTER B +0061 1E01C 0315 0300 05AE 0062;0061 05AE 1E01C 0300 0315 0062;0061 05AE 1E01C 0300 0315 0062;0061 05AE 1E01C 0300 0315 0062;0061 05AE 1E01C 0300 0315 0062; # (a◌𞀜◌̕◌̀◌֮b; a◌֮◌𞀜◌̀◌̕b; a◌֮◌𞀜◌̀◌̕b; a◌֮◌𞀜◌̀◌̕b; a◌֮◌𞀜◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER TSI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01D 0062;00E0 05AE 1E01D 0315 0062;0061 05AE 0300 1E01D 0315 0062;00E0 05AE 1E01D 0315 0062;0061 05AE 0300 1E01D 0315 0062; # (a◌̕◌̀◌֮◌𞀝b; à◌֮◌𞀝◌̕b; a◌֮◌̀◌𞀝◌̕b; à◌֮◌𞀝◌̕b; a◌֮◌̀◌𞀝◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER CHRIVI, LATIN SMALL LETTER B +0061 1E01D 0315 0300 05AE 0062;0061 05AE 1E01D 0300 0315 0062;0061 05AE 1E01D 0300 0315 0062;0061 05AE 1E01D 0300 0315 0062;0061 05AE 1E01D 0300 0315 0062; # (a◌𞀝◌̕◌̀◌֮b; a◌֮◌𞀝◌̀◌̕b; a◌֮◌𞀝◌̀◌̕b; a◌֮◌𞀝◌̀◌̕b; a◌֮◌𞀝◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER CHRIVI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01E 0062;00E0 05AE 1E01E 0315 0062;0061 05AE 0300 1E01E 0315 0062;00E0 05AE 1E01E 0315 0062;0061 05AE 0300 1E01E 0315 0062; # (a◌̕◌̀◌֮◌𞀞b; à◌֮◌𞀞◌̕b; a◌֮◌̀◌𞀞◌̕b; à◌֮◌𞀞◌̕b; a◌֮◌̀◌𞀞◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER SHA, LATIN SMALL LETTER B +0061 1E01E 0315 0300 05AE 0062;0061 05AE 1E01E 0300 0315 0062;0061 05AE 1E01E 0300 0315 0062;0061 05AE 1E01E 0300 0315 0062;0061 05AE 1E01E 0300 0315 0062; # (a◌𞀞◌̕◌̀◌֮b; a◌֮◌𞀞◌̀◌̕b; a◌֮◌𞀞◌̀◌̕b; a◌֮◌𞀞◌̀◌̕b; a◌֮◌𞀞◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER SHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01F 0062;00E0 05AE 1E01F 0315 0062;0061 05AE 0300 1E01F 0315 0062;00E0 05AE 1E01F 0315 0062;0061 05AE 0300 1E01F 0315 0062; # (a◌̕◌̀◌֮◌𞀟b; à◌֮◌𞀟◌̕b; a◌֮◌̀◌𞀟◌̕b; à◌֮◌𞀟◌̕b; a◌֮◌̀◌𞀟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YERU, LATIN SMALL LETTER B +0061 1E01F 0315 0300 05AE 0062;0061 05AE 1E01F 0300 0315 0062;0061 05AE 1E01F 0300 0315 0062;0061 05AE 1E01F 0300 0315 0062;0061 05AE 1E01F 0300 0315 0062; # (a◌𞀟◌̕◌̀◌֮b; a◌֮◌𞀟◌̀◌̕b; a◌֮◌𞀟◌̀◌̕b; a◌֮◌𞀟◌̀◌̕b; a◌֮◌𞀟◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YERU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E020 0062;00E0 05AE 1E020 0315 0062;0061 05AE 0300 1E020 0315 0062;00E0 05AE 1E020 0315 0062;0061 05AE 0300 1E020 0315 0062; # (a◌̕◌̀◌֮◌𞀠b; à◌֮◌𞀠◌̕b; a◌֮◌̀◌𞀠◌̕b; à◌֮◌𞀠◌̕b; a◌֮◌̀◌𞀠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YERI, LATIN SMALL LETTER B +0061 1E020 0315 0300 05AE 0062;0061 05AE 1E020 0300 0315 0062;0061 05AE 1E020 0300 0315 0062;0061 05AE 1E020 0300 0315 0062;0061 05AE 1E020 0300 0315 0062; # (a◌𞀠◌̕◌̀◌֮b; a◌֮◌𞀠◌̀◌̕b; a◌֮◌𞀠◌̀◌̕b; a◌֮◌𞀠◌̀◌̕b; a◌֮◌𞀠◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YERI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E021 0062;00E0 05AE 1E021 0315 0062;0061 05AE 0300 1E021 0315 0062;00E0 05AE 1E021 0315 0062;0061 05AE 0300 1E021 0315 0062; # (a◌̕◌̀◌֮◌𞀡b; à◌֮◌𞀡◌̕b; a◌֮◌̀◌𞀡◌̕b; à◌֮◌𞀡◌̕b; a◌֮◌̀◌𞀡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YATI, LATIN SMALL LETTER B +0061 1E021 0315 0300 05AE 0062;0061 05AE 1E021 0300 0315 0062;0061 05AE 1E021 0300 0315 0062;0061 05AE 1E021 0300 0315 0062;0061 05AE 1E021 0300 0315 0062; # (a◌𞀡◌̕◌̀◌֮b; a◌֮◌𞀡◌̀◌̕b; a◌֮◌𞀡◌̀◌̕b; a◌֮◌𞀡◌̀◌̕b; a◌֮◌𞀡◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YATI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E023 0062;00E0 05AE 1E023 0315 0062;0061 05AE 0300 1E023 0315 0062;00E0 05AE 1E023 0315 0062;0061 05AE 0300 1E023 0315 0062; # (a◌̕◌̀◌֮◌𞀣b; à◌֮◌𞀣◌̕b; a◌֮◌̀◌𞀣◌̕b; à◌֮◌𞀣◌̕b; a◌֮◌̀◌𞀣◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YU, LATIN SMALL LETTER B +0061 1E023 0315 0300 05AE 0062;0061 05AE 1E023 0300 0315 0062;0061 05AE 1E023 0300 0315 0062;0061 05AE 1E023 0300 0315 0062;0061 05AE 1E023 0300 0315 0062; # (a◌𞀣◌̕◌̀◌֮b; a◌֮◌𞀣◌̀◌̕b; a◌֮◌𞀣◌̀◌̕b; a◌֮◌𞀣◌̀◌̕b; a◌֮◌𞀣◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E024 0062;00E0 05AE 1E024 0315 0062;0061 05AE 0300 1E024 0315 0062;00E0 05AE 1E024 0315 0062;0061 05AE 0300 1E024 0315 0062; # (a◌̕◌̀◌֮◌𞀤b; à◌֮◌𞀤◌̕b; a◌֮◌̀◌𞀤◌̕b; à◌֮◌𞀤◌̕b; a◌֮◌̀◌𞀤◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER SMALL YUS, LATIN SMALL LETTER B +0061 1E024 0315 0300 05AE 0062;0061 05AE 1E024 0300 0315 0062;0061 05AE 1E024 0300 0315 0062;0061 05AE 1E024 0300 0315 0062;0061 05AE 1E024 0300 0315 0062; # (a◌𞀤◌̕◌̀◌֮b; a◌֮◌𞀤◌̀◌̕b; a◌֮◌𞀤◌̀◌̕b; a◌֮◌𞀤◌̀◌̕b; a◌֮◌𞀤◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER SMALL YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E026 0062;00E0 05AE 1E026 0315 0062;0061 05AE 0300 1E026 0315 0062;00E0 05AE 1E026 0315 0062;0061 05AE 0300 1E026 0315 0062; # (a◌̕◌̀◌֮◌𞀦b; à◌֮◌𞀦◌̕b; a◌֮◌̀◌𞀦◌̕b; à◌֮◌𞀦◌̕b; a◌֮◌̀◌𞀦◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YO, LATIN SMALL LETTER B +0061 1E026 0315 0300 05AE 0062;0061 05AE 1E026 0300 0315 0062;0061 05AE 1E026 0300 0315 0062;0061 05AE 1E026 0300 0315 0062;0061 05AE 1E026 0300 0315 0062; # (a◌𞀦◌̕◌̀◌֮b; a◌֮◌𞀦◌̀◌̕b; a◌֮◌𞀦◌̀◌̕b; a◌֮◌𞀦◌̀◌̕b; a◌֮◌𞀦◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E027 0062;00E0 05AE 1E027 0315 0062;0061 05AE 0300 1E027 0315 0062;00E0 05AE 1E027 0315 0062;0061 05AE 0300 1E027 0315 0062; # (a◌̕◌̀◌֮◌𞀧b; à◌֮◌𞀧◌̕b; a◌֮◌̀◌𞀧◌̕b; à◌֮◌𞀧◌̕b; a◌֮◌̀◌𞀧◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS, LATIN SMALL LETTER B +0061 1E027 0315 0300 05AE 0062;0061 05AE 1E027 0300 0315 0062;0061 05AE 1E027 0300 0315 0062;0061 05AE 1E027 0300 0315 0062;0061 05AE 1E027 0300 0315 0062; # (a◌𞀧◌̕◌̀◌֮b; a◌֮◌𞀧◌̀◌̕b; a◌֮◌𞀧◌̀◌̕b; a◌֮◌𞀧◌̀◌̕b; a◌֮◌𞀧◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E028 0062;00E0 05AE 1E028 0315 0062;0061 05AE 0300 1E028 0315 0062;00E0 05AE 1E028 0315 0062;0061 05AE 0300 1E028 0315 0062; # (a◌̕◌̀◌֮◌𞀨b; à◌֮◌𞀨◌̕b; a◌֮◌̀◌𞀨◌̕b; à◌֮◌𞀨◌̕b; a◌֮◌̀◌𞀨◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER BIG YUS, LATIN SMALL LETTER B +0061 1E028 0315 0300 05AE 0062;0061 05AE 1E028 0300 0315 0062;0061 05AE 1E028 0300 0315 0062;0061 05AE 1E028 0300 0315 0062;0061 05AE 1E028 0300 0315 0062; # (a◌𞀨◌̕◌̀◌֮b; a◌֮◌𞀨◌̀◌̕b; a◌֮◌𞀨◌̀◌̕b; a◌֮◌𞀨◌̀◌̕b; a◌֮◌𞀨◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E029 0062;00E0 05AE 1E029 0315 0062;0061 05AE 0300 1E029 0315 0062;00E0 05AE 1E029 0315 0062;0061 05AE 0300 1E029 0315 0062; # (a◌̕◌̀◌֮◌𞀩b; à◌֮◌𞀩◌̕b; a◌֮◌̀◌𞀩◌̕b; à◌֮◌𞀩◌̕b; a◌֮◌̀◌𞀩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER IOTATED BIG YUS, LATIN SMALL LETTER B +0061 1E029 0315 0300 05AE 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062; # (a◌𞀩◌̕◌̀◌֮b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER IOTATED BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E02A 0062;00E0 05AE 1E02A 0315 0062;0061 05AE 0300 1E02A 0315 0062;00E0 05AE 1E02A 0315 0062;0061 05AE 0300 1E02A 0315 0062; # (a◌̕◌̀◌֮◌𞀪b; à◌֮◌𞀪◌̕b; a◌֮◌̀◌𞀪◌̕b; à◌֮◌𞀪◌̕b; a◌֮◌̀◌𞀪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER FITA, LATIN SMALL LETTER B +0061 1E02A 0315 0300 05AE 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062; # (a◌𞀪◌̕◌̀◌֮b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER FITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 059A 0316 302A 1E8D0 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062; # (a◌֚◌̖◌〪◌𞣐b; a◌〪◌̖◌𞣐◌֚b; a◌〪◌̖◌𞣐◌֚b; a◌〪◌̖◌𞣐◌֚b; a◌〪◌̖◌𞣐◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER TEENS, LATIN SMALL LETTER B 0061 1E8D0 059A 0316 302A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062; # (a◌𞣐◌֚◌̖◌〪b; a◌〪◌𞣐◌̖◌֚b; a◌〪◌𞣐◌̖◌֚b; a◌〪◌𞣐◌̖◌֚b; a◌〪◌𞣐◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TEENS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 059A 0316 302A 1E8D1 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062; # (a◌֚◌̖◌〪◌𞣑b; a◌〪◌̖◌𞣑◌֚b; a◌〪◌̖◌𞣑◌֚b; a◌〪◌̖◌𞣑◌֚b; a◌〪◌̖◌𞣑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER TENS, LATIN SMALL LETTER B @@ -18465,6 +18581,20 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 1E8D5 059A 0316 302A 0062;0061 302A 1E8D5 0316 059A 0062;0061 302A 1E8D5 0316 059A 0062;0061 302A 1E8D5 0316 059A 0062;0061 302A 1E8D5 0316 059A 0062; # (a◌𞣕◌֚◌̖◌〪b; a◌〪◌𞣕◌̖◌֚b; a◌〪◌𞣕◌̖◌֚b; a◌〪◌𞣕◌̖◌֚b; a◌〪◌𞣕◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 059A 0316 302A 1E8D6 0062;0061 302A 0316 1E8D6 059A 0062;0061 302A 0316 1E8D6 059A 0062;0061 302A 0316 1E8D6 059A 0062;0061 302A 0316 1E8D6 059A 0062; # (a◌֚◌̖◌〪◌𞣖b; a◌〪◌̖◌𞣖◌֚b; a◌〪◌̖◌𞣖◌֚b; a◌〪◌̖◌𞣖◌֚b; a◌〪◌̖◌𞣖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER MILLIONS, LATIN SMALL LETTER B 0061 1E8D6 059A 0316 302A 0062;0061 302A 1E8D6 0316 059A 0062;0061 302A 1E8D6 0316 059A 0062;0061 302A 1E8D6 0316 059A 0062;0061 302A 1E8D6 0316 059A 0062; # (a◌𞣖◌֚◌̖◌〪b; a◌〪◌𞣖◌̖◌֚b; a◌〪◌𞣖◌̖◌֚b; a◌〪◌𞣖◌̖◌֚b; a◌〪◌𞣖◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER MILLIONS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E944 0062;00E0 05AE 1E944 0315 0062;0061 05AE 0300 1E944 0315 0062;00E0 05AE 1E944 0315 0062;0061 05AE 0300 1E944 0315 0062; # (a◌̕◌̀◌֮◌𞥄b; à◌֮◌𞥄◌̕b; a◌֮◌̀◌𞥄◌̕b; à◌֮◌𞥄◌̕b; a◌֮◌̀◌𞥄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM ALIF LENGTHENER, LATIN SMALL LETTER B +0061 1E944 0315 0300 05AE 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062; # (a◌𞥄◌̕◌̀◌֮b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM ALIF LENGTHENER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E945 0062;00E0 05AE 1E945 0315 0062;0061 05AE 0300 1E945 0315 0062;00E0 05AE 1E945 0315 0062;0061 05AE 0300 1E945 0315 0062; # (a◌̕◌̀◌֮◌𞥅b; à◌֮◌𞥅◌̕b; a◌֮◌̀◌𞥅◌̕b; à◌֮◌𞥅◌̕b; a◌֮◌̀◌𞥅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM VOWEL LENGTHENER, LATIN SMALL LETTER B +0061 1E945 0315 0300 05AE 0062;0061 05AE 1E945 0300 0315 0062;0061 05AE 1E945 0300 0315 0062;0061 05AE 1E945 0300 0315 0062;0061 05AE 1E945 0300 0315 0062; # (a◌𞥅◌̕◌̀◌֮b; a◌֮◌𞥅◌̀◌̕b; a◌֮◌𞥅◌̀◌̕b; a◌֮◌𞥅◌̀◌̕b; a◌֮◌𞥅◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM VOWEL LENGTHENER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E946 0062;00E0 05AE 1E946 0315 0062;0061 05AE 0300 1E946 0315 0062;00E0 05AE 1E946 0315 0062;0061 05AE 0300 1E946 0315 0062; # (a◌̕◌̀◌֮◌𞥆b; à◌֮◌𞥆◌̕b; a◌֮◌̀◌𞥆◌̕b; à◌֮◌𞥆◌̕b; a◌֮◌̀◌𞥆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM GEMINATION MARK, LATIN SMALL LETTER B +0061 1E946 0315 0300 05AE 0062;0061 05AE 1E946 0300 0315 0062;0061 05AE 1E946 0300 0315 0062;0061 05AE 1E946 0300 0315 0062;0061 05AE 1E946 0300 0315 0062; # (a◌𞥆◌̕◌̀◌֮b; a◌֮◌𞥆◌̀◌̕b; a◌֮◌𞥆◌̀◌̕b; a◌֮◌𞥆◌̀◌̕b; a◌֮◌𞥆◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM GEMINATION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E947 0062;00E0 05AE 1E947 0315 0062;0061 05AE 0300 1E947 0315 0062;00E0 05AE 1E947 0315 0062;0061 05AE 0300 1E947 0315 0062; # (a◌̕◌̀◌֮◌𞥇b; à◌֮◌𞥇◌̕b; a◌֮◌̀◌𞥇◌̕b; à◌֮◌𞥇◌̕b; a◌֮◌̀◌𞥇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM HAMZA, LATIN SMALL LETTER B +0061 1E947 0315 0300 05AE 0062;0061 05AE 1E947 0300 0315 0062;0061 05AE 1E947 0300 0315 0062;0061 05AE 1E947 0300 0315 0062;0061 05AE 1E947 0300 0315 0062; # (a◌𞥇◌̕◌̀◌֮b; a◌֮◌𞥇◌̀◌̕b; a◌֮◌𞥇◌̀◌̕b; a◌֮◌𞥇◌̀◌̕b; a◌֮◌𞥇◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM HAMZA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E948 0062;00E0 05AE 1E948 0315 0062;0061 05AE 0300 1E948 0315 0062;00E0 05AE 1E948 0315 0062;0061 05AE 0300 1E948 0315 0062; # (a◌̕◌̀◌֮◌𞥈b; à◌֮◌𞥈◌̕b; a◌֮◌̀◌𞥈◌̕b; à◌֮◌𞥈◌̕b; a◌֮◌̀◌𞥈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM CONSONANT MODIFIER, LATIN SMALL LETTER B +0061 1E948 0315 0300 05AE 0062;0061 05AE 1E948 0300 0315 0062;0061 05AE 1E948 0300 0315 0062;0061 05AE 1E948 0300 0315 0062;0061 05AE 1E948 0300 0315 0062; # (a◌𞥈◌̕◌̀◌֮b; a◌֮◌𞥈◌̀◌̕b; a◌֮◌𞥈◌̀◌̕b; a◌֮◌𞥈◌̀◌̕b; a◌֮◌𞥈◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM CONSONANT MODIFIER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E949 0062;00E0 05AE 1E949 0315 0062;0061 05AE 0300 1E949 0315 0062;00E0 05AE 1E949 0315 0062;0061 05AE 0300 1E949 0315 0062; # (a◌̕◌̀◌֮◌𞥉b; à◌֮◌𞥉◌̕b; a◌֮◌̀◌𞥉◌̕b; à◌֮◌𞥉◌̕b; a◌֮◌̀◌𞥉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM GEMINATE CONSONANT MODIFIER, LATIN SMALL LETTER B +0061 1E949 0315 0300 05AE 0062;0061 05AE 1E949 0300 0315 0062;0061 05AE 1E949 0300 0315 0062;0061 05AE 1E949 0300 0315 0062;0061 05AE 1E949 0300 0315 0062; # (a◌𞥉◌̕◌̀◌֮b; a◌֮◌𞥉◌̀◌̕b; a◌֮◌𞥉◌̀◌̕b; a◌֮◌𞥉◌̀◌̕b; a◌֮◌𞥉◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM GEMINATE CONSONANT MODIFIER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 3099 093C 0334 1E94A 0062;0061 0334 093C 1E94A 3099 0062;0061 0334 093C 1E94A 3099 0062;0061 0334 093C 1E94A 3099 0062;0061 0334 093C 1E94A 3099 0062; # (a◌゙◌़◌̴◌𞥊b; a◌̴◌़◌𞥊◌゙b; a◌̴◌़◌𞥊◌゙b; a◌̴◌़◌𞥊◌゙b; a◌̴◌़◌𞥊◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, ADLAM NUKTA, LATIN SMALL LETTER B +0061 1E94A 3099 093C 0334 0062;0061 0334 1E94A 093C 3099 0062;0061 0334 1E94A 093C 3099 0062;0061 0334 1E94A 093C 3099 0062;0061 0334 1E94A 093C 3099 0062; # (a◌𞥊◌゙◌़◌̴b; a◌̴◌𞥊◌़◌゙b; a◌̴◌𞥊◌़◌゙b; a◌̴◌𞥊◌़◌゙b; a◌̴◌𞥊◌़◌゙b; ) LATIN SMALL LETTER A, ADLAM NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B # @Part3 # PRI #29 Test # diff --git a/tests/data/SentenceBreakProperty.txt b/tests/data/SentenceBreakProperty.txt index 8dd1abff0f..9309493cf7 100644 --- a/tests/data/SentenceBreakProperty.txt +++ b/tests/data/SentenceBreakProperty.txt @@ -1,10 +1,11 @@ -# SentenceBreakProperty-8.0.0.txt -# Date: 2015-03-11, 22:29:43 GMT [MD] +# SentenceBreakProperty-9.0.0.txt +# Date: 2016-06-01, 10:34:38 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # ================================================ @@ -53,6 +54,7 @@ 0825..0827 ; Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U 0829..082D ; Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA 0859..085B ; Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +08D4..08E1 ; Extend # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA 08E3..0902 ; Extend # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA 0903 ; Extend # Mc DEVANAGARI SIGN VISARGA 093A ; Extend # Mn DEVANAGARI VOWEL SIGN OE @@ -207,6 +209,7 @@ 17C9..17D3 ; Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT 17DD ; Extend # Mn KHMER SIGN ATTHACAN 180B..180D ; Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +1885..1886 ; Extend # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA 18A9 ; Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA 1920..1922 ; Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U 1923..1926 ; Extend # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU @@ -273,7 +276,7 @@ 1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE 1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1DC0..1DF5 ; Extend # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE -1DFC..1DFF ; Extend # Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1DFB..1DFF ; Extend # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 200C..200D ; Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0 ; Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH @@ -299,7 +302,7 @@ A825..A826 ; Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL A827 ; Extend # Mc SYLOTI NAGRI VOWEL SIGN OO A880..A881 ; Extend # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA A8B4..A8C3 ; Extend # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8C4 ; Extend # Mn SAURASHTRA SIGN VIRAMA +A8C4..A8C5 ; Extend # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU A8E0..A8F1 ; Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA A926..A92D ; Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU A947..A951 ; Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R @@ -381,6 +384,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11234 ; Extend # Mn KHOJKI SIGN ANUSVARA 11235 ; Extend # Mc KHOJKI SIGN VIRAMA 11236..11237 ; Extend # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +1123E ; Extend # Mn KHOJKI SIGN SUKUN 112DF ; Extend # Mn KHUDAWADI SIGN ANUSVARA 112E0..112E2 ; Extend # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II 112E3..112EA ; Extend # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA @@ -396,6 +400,12 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11362..11363 ; Extend # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL 11366..1136C ; Extend # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX 11370..11374 ; Extend # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11435..11437 ; Extend # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Extend # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Extend # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; Extend # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; Extend # Mc NEWA SIGN VISARGA +11446 ; Extend # Mn NEWA SIGN NUKTA 114B0..114B2 ; Extend # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II 114B3..114B8 ; Extend # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL 114B9 ; Extend # Mc TIRHUTA VOWEL SIGN E @@ -429,6 +439,18 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11726 ; Extend # Mc AHOM VOWEL SIGN E 11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11C2F ; Extend # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Extend # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Extend # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Extend # Mc BHAIKSUKI SIGN VISARGA +11C3F ; Extend # Mn BHAIKSUKI SIGN VIRAMA +11C92..11CA7 ; Extend # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Extend # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Extend # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Extend # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Extend # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Extend # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Extend # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F51..16F7E ; Extend # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG @@ -447,10 +469,17 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 1DA84 ; Extend # Mn SIGNWRITING LOCATION HEAD NECK 1DA9B..1DA9F ; Extend # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF ; Extend # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006 ; Extend # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Extend # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Extend # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Extend # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA 1E8D0..1E8D6 ; Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E94A ; Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 1967 +# Total code points: 2197 # ================================================ @@ -467,6 +496,7 @@ E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 061C ; Format # Cf ARABIC LETTER MARK 06DD ; Format # Cf ARABIC END OF AYAH 070F ; Format # Cf SYRIAC ABBREVIATION MARK +08E2 ; Format # Cf ARABIC DISPUTED END OF AYAH 180E ; Format # Cf MONGOLIAN VOWEL SEPARATOR 200B ; Format # Cf ZERO WIDTH SPACE 200E..200F ; Format # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK @@ -479,9 +509,8 @@ FFF9..FFFB ; Format # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANN 1BCA0..1BCA3 ; Format # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP 1D173..1D17A ; Format # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE E0001 ; Format # Cf LANGUAGE TAG -E0020..E007F ; Format # Cf [96] TAG SPACE..CANCEL TAG -# Total code points: 148 +# Total code points: 53 # ================================================ @@ -776,6 +805,7 @@ E0020..E007F ; Format # Cf [96] TAG SPACE..CANCEL TAG 052F ; Lower # L& CYRILLIC SMALL LETTER EL WITH DESCENDER 0561..0587 ; Lower # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN 13F8..13FD ; Lower # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1C80..1C88 ; Lower # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK 1D00..1D2B ; Lower # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL 1D2C..1D6A ; Lower # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI 1D6B..1D77 ; Lower # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G @@ -1118,6 +1148,7 @@ FB00..FB06 ; Lower # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE S FB13..FB17 ; Lower # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH FF41..FF5A ; Lower # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z 10428..1044F ; Lower # L& [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW +104D8..104FB ; Lower # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA 10CC0..10CF2 ; Lower # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US 118C0..118DF ; Lower # L& [32] WARANG CITI SMALL LETTER NGAA..WARANG CITI SMALL LETTER VIYO 1D41A..1D433 ; Lower # L& [26] MATHEMATICAL BOLD SMALL A..MATHEMATICAL BOLD SMALL Z @@ -1148,8 +1179,9 @@ FF41..FF5A ; Lower # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN 1D7AA..1D7C2 ; Lower # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA 1D7C4..1D7C9 ; Lower # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL 1D7CB ; Lower # L& MATHEMATICAL BOLD SMALL DIGAMMA +1E922..1E943 ; Lower # L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA -# Total code points: 2172 +# Total code points: 2251 # ================================================ @@ -1745,11 +1777,12 @@ A7A2 ; Upper # L& LATIN CAPITAL LETTER K WITH OBLIQUE STROKE A7A4 ; Upper # L& LATIN CAPITAL LETTER N WITH OBLIQUE STROKE A7A6 ; Upper # L& LATIN CAPITAL LETTER R WITH OBLIQUE STROKE A7A8 ; Upper # L& LATIN CAPITAL LETTER S WITH OBLIQUE STROKE -A7AA..A7AD ; Upper # L& [4] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER L WITH BELT +A7AA..A7AE ; Upper # L& [5] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER SMALL CAPITAL I A7B0..A7B4 ; Upper # L& [5] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER BETA A7B6 ; Upper # L& LATIN CAPITAL LETTER OMEGA FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z 10400..10427 ; Upper # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW +104B0..104D3 ; Upper # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA 10C80..10CB2 ; Upper # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US 118A0..118BF ; Upper # L& [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO 1D400..1D419 ; Upper # L& [26] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL BOLD CAPITAL Z @@ -1783,11 +1816,12 @@ FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT 1D756..1D76E ; Upper # L& [25] MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA 1D790..1D7A8 ; Upper # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA 1D7CA ; Upper # L& MATHEMATICAL BOLD CAPITAL DIGAMMA +1E900..1E921 ; Upper # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA 1F130..1F149 ; Upper # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z 1F150..1F169 ; Upper # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Upper # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 1782 +# Total code points: 1853 # ================================================ @@ -1826,6 +1860,7 @@ FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT 0828 ; OLetter # Lm SAMARITAN MODIFIER LETTER I 0840..0858 ; OLetter # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN 08A0..08B4 ; OLetter # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; OLetter # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON 0904..0939 ; OLetter # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA 093D ; OLetter # Lo DEVANAGARI SIGN AVAGRAHA 0950 ; OLetter # Lo DEVANAGARI OM @@ -1891,6 +1926,7 @@ FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT 0C3D ; OLetter # Lo TELUGU SIGN AVAGRAHA 0C58..0C5A ; OLetter # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA 0C60..0C61 ; OLetter # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C80 ; OLetter # Lo KANNADA SIGN SPACING CANDRABINDU 0C85..0C8C ; OLetter # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L 0C8E..0C90 ; OLetter # Lo [3] KANNADA LETTER E..KANNADA LETTER AI 0C92..0CA8 ; OLetter # Lo [23] KANNADA LETTER O..KANNADA LETTER NA @@ -1905,6 +1941,7 @@ FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT 0D12..0D3A ; OLetter # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA 0D3D ; OLetter # Lo MALAYALAM SIGN AVAGRAHA 0D4E ; OLetter # Lo MALAYALAM LETTER DOT REPH +0D54..0D56 ; OLetter # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL 0D5F..0D61 ; OLetter # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL 0D7A..0D7F ; OLetter # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K 0D85..0D96 ; OLetter # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA @@ -1983,7 +2020,8 @@ FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT 1820..1842 ; OLetter # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI 1843 ; OLetter # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN 1844..1877 ; OLetter # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; OLetter # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +1880..1884 ; OLetter # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1887..18A8 ; OLetter # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA 18AA ; OLetter # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA 18B0..18F5 ; OLetter # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S 1900..191E ; OLetter # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA @@ -2207,6 +2245,8 @@ FFDA..FFDC ; OLetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1133D ; OLetter # Lo GRANTHA SIGN AVAGRAHA 11350 ; OLetter # Lo GRANTHA OM 1135D..11361 ; OLetter # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11400..11434 ; OLetter # Lo [53] NEWA LETTER A..NEWA LETTER HA +11447..1144A ; OLetter # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI 11480..114AF ; OLetter # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA 114C4..114C5 ; OLetter # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG 114C7 ; OLetter # Lo TIRHUTA OM @@ -2218,6 +2258,10 @@ FFDA..FFDC ; OLetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 11700..11719 ; OLetter # Lo [26] AHOM LETTER KA..AHOM LETTER JHA 118FF ; OLetter # Lo WARANG CITI OM 11AC0..11AF8 ; OLetter # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; OLetter # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; OLetter # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C40 ; OLetter # Lo BHAIKSUKI SIGN AVAGRAHA +11C72..11C8F ; OLetter # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A 12000..12399 ; OLetter # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; OLetter # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; OLetter # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU @@ -2233,6 +2277,9 @@ FFDA..FFDC ; OLetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 16F00..16F44 ; OLetter # Lo [69] MIAO LETTER PA..MIAO LETTER HHA 16F50 ; OLetter # Lo MIAO LETTER NASALIZATION 16F93..16F9F ; OLetter # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0 ; OLetter # Lm TANGUT ITERATION MARK +17000..187EC ; OLetter # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +18800..18AF2 ; OLetter # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 1B000..1B001 ; OLetter # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE 1BC00..1BC6A ; OLetter # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; OLetter # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -2278,7 +2325,7 @@ FFDA..FFDC ; OLetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 2B820..2CEA1 ; OLetter # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2F800..2FA1D ; OLetter # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 106002 +# Total code points: 113027 # ================================================ @@ -2325,16 +2372,19 @@ ABF0..ABF9 ; Numeric # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT N 11136..1113F ; Numeric # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE 111D0..111D9 ; Numeric # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE 112F0..112F9 ; Numeric # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11450..11459 ; Numeric # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE 114D0..114D9 ; Numeric # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE 11650..11659 ; Numeric # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE 116C0..116C9 ; Numeric # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE 11730..11739 ; Numeric # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE 118E0..118E9 ; Numeric # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +11C50..11C59 ; Numeric # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE 16A60..16A69 ; Numeric # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE 16B50..16B59 ; Numeric # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE 1D7CE..1D7FF ; Numeric # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1E950..1E959 ; Numeric # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE -# Total code points: 542 +# Total code points: 572 # ================================================ @@ -2398,10 +2448,12 @@ FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP 11238..11239 ; STerm # Po [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA 1123B..1123C ; STerm # Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK 112A9 ; STerm # Po MULTANI SECTION MARK +1144B..1144C ; STerm # Po [2] NEWA DANDA..NEWA DOUBLE DANDA 115C2..115C3 ; STerm # Po [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA 115C9..115D7 ; STerm # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES 11641..11642 ; STerm # Po [2] MODI DANDA..MODI DOUBLE DANDA 1173C..1173E ; STerm # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11C41..11C42 ; STerm # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA 16A6E..16A6F ; STerm # Po [2] MRO DANDA..MRO DOUBLE DANDA 16AF5 ; STerm # Po BASSA VAH FULL STOP 16B37..16B38 ; STerm # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB @@ -2409,7 +2461,7 @@ FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP 1BC9F ; STerm # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA88 ; STerm # Po SIGNWRITING FULL STOP -# Total code points: 117 +# Total code points: 121 # ================================================ diff --git a/tests/data/SentenceBreakTest.txt b/tests/data/SentenceBreakTest.txt index 279e6db06d..c7b6465c0c 100644 --- a/tests/data/SentenceBreakTest.txt +++ b/tests/data/SentenceBreakTest.txt @@ -1,10 +1,11 @@ -# SentenceBreakTest-8.0.0.txt -# Date: 2015-04-30, 09:40:15 GMT [MD] +# SentenceBreakTest-9.0.0.txt +# Date: 2016-06-02, 18:28:30 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Default Sentence Break Test # @@ -20,272 +21,272 @@ # # These samples may be extended or changed in the future. # -÷ 0001 × 0001 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0001 × 0308 × 0001 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0001 × 000D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0001 × 0308 × 000D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0001 × 000A ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0001 × 0308 × 000A ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0001 × 0085 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0001 × 0308 × 0085 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0001 × 0009 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0001 × 0308 × 0009 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0001 × 0061 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0001 × 0308 × 0061 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0001 × 0041 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0001 × 0308 × 0041 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0001 × 01BB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0001 × 0308 × 01BB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0001 × 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0001 × 0308 × 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0001 × 002E ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0001 × 0308 × 002E ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0001 × 0021 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0001 × 0308 × 0021 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0001 × 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0001 × 0308 × 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0001 × 002C ÷ # ÷ [0.2] <START OF HEADING> (Other) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 0001 × 0308 × 002C ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 0001 × 0001 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0001 × 0308 × 0001 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0001 × 000D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0001 × 0308 × 000D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0001 × 000A ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0001 × 0308 × 000A ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0001 × 0085 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0001 × 0308 × 0085 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0001 × 0009 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0001 × 0308 × 0009 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0001 × 0061 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0001 × 0308 × 0061 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0001 × 0041 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0001 × 0308 × 0041 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0001 × 01BB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0001 × 0308 × 01BB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0001 × 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0001 × 0308 × 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0001 × 002E ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0001 × 0308 × 002E ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0001 × 0021 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0001 × 0308 × 0021 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0001 × 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0001 × 0308 × 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0001 × 002C ÷ # ÷ [0.2] <START OF HEADING> (Other) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0001 × 0308 × 002C ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 0001 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0001 × 0308 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0001 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0001 × 0308 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 000D ÷ 0001 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 000D ÷ 0308 × 0001 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 000D ÷ 0308 × 0001 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 000D ÷ 000D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 000D ÷ 0308 × 000D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 000D ÷ 0308 × 000D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] ÷ 000D × 000A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 000D ÷ 0308 × 000A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 000D ÷ 0308 × 000A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] ÷ 000D ÷ 0085 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 000D ÷ 0308 × 0085 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 000D ÷ 0308 × 0085 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] ÷ 000D ÷ 0009 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 000D ÷ 0308 × 0009 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 000D ÷ 0308 × 0009 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] ÷ 000D ÷ 0061 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 000D ÷ 0308 × 0061 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 000D ÷ 0308 × 0061 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] ÷ 000D ÷ 0041 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 000D ÷ 0308 × 0041 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 000D ÷ 0308 × 0041 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] ÷ 000D ÷ 01BB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 000D ÷ 0308 × 01BB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 000D ÷ 0308 × 01BB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] ÷ 000D ÷ 0030 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 000D ÷ 0308 × 0030 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000D ÷ 0308 × 0030 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 000D ÷ 002E ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3] -÷ 000D ÷ 0308 × 002E ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] +÷ 000D ÷ 0308 × 002E ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] ÷ 000D ÷ 0021 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 000D ÷ 0308 × 0021 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 000D ÷ 0308 × 0021 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] ÷ 000D ÷ 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 000D ÷ 0308 × 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 000D ÷ 0308 × 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] ÷ 000D ÷ 002C ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMMA (SContinue) ÷ [0.3] -÷ 000D ÷ 0308 × 002C ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 000D ÷ 0308 × 002C ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 000D ÷ 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000D ÷ 0308 × 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000D ÷ 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 000A ÷ 0001 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 000A ÷ 0308 × 0001 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 000A ÷ 0308 × 0001 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 000A ÷ 000D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 000A ÷ 0308 × 000D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 000A ÷ 0308 × 000D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] ÷ 000A ÷ 000A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 000A ÷ 0308 × 000A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 000A ÷ 0308 × 000A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] ÷ 000A ÷ 0085 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 000A ÷ 0308 × 0085 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 000A ÷ 0308 × 0085 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] ÷ 000A ÷ 0009 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 000A ÷ 0308 × 0009 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 000A ÷ 0308 × 0009 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] ÷ 000A ÷ 0061 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 000A ÷ 0308 × 0061 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 000A ÷ 0308 × 0061 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] ÷ 000A ÷ 0041 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 000A ÷ 0308 × 0041 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 000A ÷ 0308 × 0041 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] ÷ 000A ÷ 01BB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 000A ÷ 0308 × 01BB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 000A ÷ 0308 × 01BB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] ÷ 000A ÷ 0030 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 000A ÷ 0308 × 0030 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 000A ÷ 0308 × 0030 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 000A ÷ 002E ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3] -÷ 000A ÷ 0308 × 002E ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] +÷ 000A ÷ 0308 × 002E ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] ÷ 000A ÷ 0021 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 000A ÷ 0308 × 0021 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 000A ÷ 0308 × 0021 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] ÷ 000A ÷ 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 000A ÷ 0308 × 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 000A ÷ 0308 × 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] ÷ 000A ÷ 002C ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMMA (SContinue) ÷ [0.3] -÷ 000A ÷ 0308 × 002C ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 000A ÷ 0308 × 002C ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 000A ÷ 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000A ÷ 0308 × 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000A ÷ 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0085 ÷ 0001 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0085 ÷ 0308 × 0001 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0085 ÷ 0308 × 0001 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 0085 ÷ 000D ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0085 ÷ 0308 × 000D ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0085 ÷ 0308 × 000D ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] ÷ 0085 ÷ 000A ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0085 ÷ 0308 × 000A ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0085 ÷ 0308 × 000A ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] ÷ 0085 ÷ 0085 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0085 ÷ 0308 × 0085 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0085 ÷ 0308 × 0085 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] ÷ 0085 ÷ 0009 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0085 ÷ 0308 × 0009 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0085 ÷ 0308 × 0009 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] ÷ 0085 ÷ 0061 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0085 ÷ 0308 × 0061 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0085 ÷ 0308 × 0061 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] ÷ 0085 ÷ 0041 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0085 ÷ 0308 × 0041 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0085 ÷ 0308 × 0041 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] ÷ 0085 ÷ 01BB ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0085 ÷ 0308 × 01BB ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0085 ÷ 0308 × 01BB ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] ÷ 0085 ÷ 0030 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0085 ÷ 0308 × 0030 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0085 ÷ 0308 × 0030 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0085 ÷ 002E ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0085 ÷ 0308 × 002E ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0085 ÷ 0308 × 002E ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] ÷ 0085 ÷ 0021 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0085 ÷ 0308 × 0021 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0085 ÷ 0308 × 0021 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] ÷ 0085 ÷ 0022 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0085 ÷ 0308 × 0022 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0085 ÷ 0308 × 0022 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] ÷ 0085 ÷ 002C ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMMA (SContinue) ÷ [0.3] -÷ 0085 ÷ 0308 × 002C ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 0085 ÷ 0308 × 002C ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 0085 ÷ 00AD ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0085 ÷ 0308 × 00AD ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0085 ÷ 0300 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0085 ÷ 0308 × 0300 ÷ # ÷ [0.2] <NEXT LINE (NEL)> (Sep) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 0009 × 0001 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0009 × 0308 × 0001 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0009 × 000D ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0009 × 0308 × 000D ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0009 × 000A ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0009 × 0308 × 000A ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0009 × 0085 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0009 × 0308 × 0085 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0009 × 0009 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0009 × 0308 × 0009 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0009 × 0061 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0009 × 0308 × 0061 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0009 × 0041 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0009 × 0308 × 0041 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0009 × 01BB ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0009 × 0308 × 01BB ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0009 × 0030 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0009 × 0308 × 0030 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0009 × 002E ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0009 × 0308 × 002E ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0009 × 0021 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0009 × 0308 × 0021 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0009 × 0022 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0009 × 0308 × 0022 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0009 × 002C ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 0009 × 0308 × 002C ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 0009 × 0001 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0009 × 0308 × 0001 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0009 × 000D ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0009 × 0308 × 000D ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0009 × 000A ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0009 × 0308 × 000A ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0009 × 0085 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0009 × 0308 × 0085 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0009 × 0009 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0009 × 0308 × 0009 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0009 × 0061 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0009 × 0308 × 0061 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0009 × 0041 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0009 × 0308 × 0041 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0009 × 01BB ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0009 × 0308 × 01BB ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0009 × 0030 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0009 × 0308 × 0030 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0009 × 002E ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0009 × 0308 × 002E ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0009 × 0021 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0009 × 0308 × 0021 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0009 × 0022 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0009 × 0308 × 0022 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0009 × 002C ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0009 × 0308 × 002C ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 0009 × 00AD ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0009 × 0308 × 00AD ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0009 × 0300 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0009 × 0308 × 0300 ÷ # ÷ [0.2] <CHARACTER TABULATION> (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 0061 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0061 × 0308 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0061 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0061 × 0308 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0061 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0061 × 0308 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0061 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0061 × 0308 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0061 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0061 × 0308 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0061 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0061 × 0308 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0061 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0061 × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0061 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0061 × 0308 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0061 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0061 × 0308 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0061 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0061 × 0308 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0061 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0061 × 0308 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0061 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0061 × 0308 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0061 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 0061 × 0308 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 0061 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0061 × 0308 × 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0061 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0061 × 0308 × 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0061 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0061 × 0308 × 000A ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0061 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0061 × 0308 × 0085 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0061 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0061 × 0308 × 0009 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0061 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0061 × 0308 × 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0061 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0061 × 0308 × 0041 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0061 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0061 × 0308 × 01BB ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0061 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 × 0308 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0061 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0061 × 0308 × 002E ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0061 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0061 × 0308 × 0021 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0061 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0061 × 0308 × 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0061 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0061 × 0308 × 002C ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 0061 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0061 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 0041 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0041 × 0308 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0041 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0041 × 0308 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0041 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0041 × 0308 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0041 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0041 × 0308 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0041 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0041 × 0308 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0041 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0041 × 0308 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0041 × 0308 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0041 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0041 × 0308 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0041 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0041 × 0308 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0041 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0041 × 0308 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0041 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0041 × 0308 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0041 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0041 × 0308 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0041 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 0041 × 0308 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 0041 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0041 × 0308 × 0001 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0041 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0041 × 0308 × 000D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0041 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0041 × 0308 × 000A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0041 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0041 × 0308 × 0085 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0041 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0041 × 0308 × 0009 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0041 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0041 × 0308 × 0061 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0041 × 0308 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0041 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0041 × 0308 × 01BB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0041 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0041 × 0308 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0041 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0041 × 0308 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0041 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0041 × 0308 × 0021 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0041 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0041 × 0308 × 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0041 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0041 × 0308 × 002C ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 0041 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0041 × 0308 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0041 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0041 × 0308 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 01BB × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 01BB × 0308 × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 01BB × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 01BB × 0308 × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 01BB × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 01BB × 0308 × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 01BB × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 01BB × 0308 × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 01BB × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 01BB × 0308 × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 01BB × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 01BB × 0308 × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 01BB × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 01BB × 0308 × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 01BB × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 01BB × 0308 × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 01BB × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 01BB × 0308 × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 01BB × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 01BB × 0308 × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 01BB × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 01BB × 0308 × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 01BB × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 01BB × 0308 × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 01BB × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 01BB × 0308 × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 01BB × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 01BB × 0308 × 0001 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 01BB × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 01BB × 0308 × 000D ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 01BB × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 01BB × 0308 × 000A ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 01BB × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 01BB × 0308 × 0085 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 01BB × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 01BB × 0308 × 0009 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 01BB × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 01BB × 0308 × 0061 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 01BB × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 01BB × 0308 × 0041 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 01BB × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 01BB × 0308 × 01BB ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 01BB × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 01BB × 0308 × 0030 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 01BB × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 01BB × 0308 × 002E ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 01BB × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 01BB × 0308 × 0021 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 01BB × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 01BB × 0308 × 0022 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 01BB × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 01BB × 0308 × 002C ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 01BB × 00AD ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 01BB × 0308 × 00AD ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 01BB × 0300 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 01BB × 0308 × 0300 ÷ # ÷ [0.2] LATIN LETTER TWO WITH STROKE (OLetter) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 0030 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0030 × 0308 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0030 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0030 × 0308 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0030 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0030 × 0308 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0030 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0030 × 0308 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0030 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0030 × 0308 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0030 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0030 × 0308 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0030 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0030 × 0308 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0030 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0030 × 0308 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0030 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0030 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0030 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0030 × 0308 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0030 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0030 × 0308 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0030 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0030 × 0308 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0030 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 0030 × 0308 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 0030 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0030 × 0308 × 0001 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0030 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0030 × 0308 × 000D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0030 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0030 × 0308 × 000A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0030 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0030 × 0308 × 0085 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0030 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0030 × 0308 × 0009 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0030 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0030 × 0308 × 0061 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0030 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0030 × 0308 × 0041 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0030 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0030 × 0308 × 01BB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0030 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0030 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0030 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0030 × 0308 × 002E ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0030 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0030 × 0308 × 0021 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0030 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0030 × 0308 × 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0030 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0030 × 0308 × 002C ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 0030 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0030 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0030 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] @@ -350,180 +351,179 @@ ÷ 0021 × 0308 × 00AD ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0021 × 0300 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0021 × 0308 × 0300 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 0022 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0022 × 0308 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0022 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0022 × 0308 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0022 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0022 × 0308 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0022 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0022 × 0308 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0022 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0022 × 0308 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0022 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0022 × 0308 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0022 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0022 × 0308 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0022 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0022 × 0308 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0022 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0022 × 0308 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0022 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0022 × 0308 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0022 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0022 × 0308 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0022 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0022 × 0308 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0022 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 0022 × 0308 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 0022 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0022 × 0308 × 0001 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0022 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0022 × 0308 × 000D ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0022 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0022 × 0308 × 000A ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0022 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0022 × 0308 × 0085 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0022 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0022 × 0308 × 0009 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0022 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0022 × 0308 × 0061 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0022 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0022 × 0308 × 0041 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0022 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0022 × 0308 × 01BB ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0022 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0022 × 0308 × 0030 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0022 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0022 × 0308 × 002E ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0022 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0022 × 0308 × 0021 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0022 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0022 × 0308 × 0022 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0022 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0022 × 0308 × 002C ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 0022 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0022 × 0308 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0022 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0022 × 0308 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 002C × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 002C × 0308 × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 002C × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 002C × 0308 × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 002C × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 002C × 0308 × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 002C × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 002C × 0308 × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 002C × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 002C × 0308 × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 002C × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 002C × 0308 × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 002C × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 002C × 0308 × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 002C × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 002C × 0308 × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 002C × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 002C × 0308 × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 002C × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 002C × 0308 × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 002C × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 002C × 0308 × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 002C × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 002C × 0308 × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 002C × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 002C × 0308 × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 002C × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 002C × 0308 × 0001 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 002C × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 002C × 0308 × 000D ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 002C × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 002C × 0308 × 000A ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 002C × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 002C × 0308 × 0085 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 002C × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 002C × 0308 × 0009 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 002C × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 002C × 0308 × 0061 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 002C × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 002C × 0308 × 0041 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 002C × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 002C × 0308 × 01BB ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 002C × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002C × 0308 × 0030 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 002C × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 002C × 0308 × 002E ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 002C × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 002C × 0308 × 0021 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 002C × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 002C × 0308 × 0022 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 002C × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 002C × 0308 × 002C ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 002C × 00AD ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 002C × 0300 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] COMMA (SContinue) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 00AD × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 00AD × 0308 × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 00AD × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 00AD × 0308 × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 00AD × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 00AD × 0308 × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 00AD × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 00AD × 0308 × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 00AD × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 00AD × 0308 × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 00AD × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 00AD × 0308 × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 00AD × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 00AD × 0308 × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 00AD × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 00AD × 0308 × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 00AD × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 00AD × 0308 × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 00AD × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 00AD × 0308 × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 00AD × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 00AD × 0308 × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 00AD × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 00AD × 0308 × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 00AD × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 00AD × 0308 × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 00AD × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 00AD × 0308 × 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 00AD × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 00AD × 0308 × 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 00AD × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 00AD × 0308 × 000A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 00AD × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 00AD × 0308 × 0085 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 00AD × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 00AD × 0308 × 0009 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 00AD × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 00AD × 0308 × 0061 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 00AD × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 00AD × 0308 × 0041 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 00AD × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 00AD × 0308 × 01BB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 00AD × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 00AD × 0308 × 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 00AD × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 00AD × 0308 × 002E ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 00AD × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 00AD × 0308 × 0021 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 00AD × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 00AD × 0308 × 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 00AD × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 00AD × 0308 × 002C ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 00AD × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 00AD × 0308 × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 00AD × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 00AD × 0308 × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 0300 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0300 × 0308 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 0300 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0300 × 0308 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 0300 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0300 × 0308 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 0300 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0300 × 0308 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] -÷ 0300 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0300 × 0308 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] -÷ 0300 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0300 × 0308 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] -÷ 0300 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0300 × 0308 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] -÷ 0300 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0300 × 0308 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] -÷ 0300 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0300 × 0308 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 0300 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0300 × 0308 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0300 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0300 × 0308 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] EXCLAMATION MARK (STerm) ÷ [0.3] -÷ 0300 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0300 × 0308 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] QUOTATION MARK (Close) ÷ [0.3] -÷ 0300 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] -÷ 0300 × 0308 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [12.0] COMMA (SContinue) ÷ [0.3] +÷ 0300 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0300 × 0308 × 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 0300 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0300 × 0308 × 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 0300 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0300 × 0308 × 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 0300 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0300 × 0308 × 0085 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <NEXT LINE (NEL)> (Sep) ÷ [0.3] +÷ 0300 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0300 × 0308 × 0009 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] <CHARACTER TABULATION> (Sp) ÷ [0.3] +÷ 0300 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0300 × 0308 × 0061 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN SMALL LETTER A (Lower) ÷ [0.3] +÷ 0300 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0300 × 0308 × 0041 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER A (Upper) ÷ [0.3] +÷ 0300 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0300 × 0308 × 01BB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN LETTER TWO WITH STROKE (OLetter) ÷ [0.3] +÷ 0300 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0300 × 0308 × 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0300 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0300 × 0308 × 002E ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0300 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0300 × 0308 × 0021 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] EXCLAMATION MARK (STerm) ÷ [0.3] +÷ 0300 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0300 × 0308 × 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] QUOTATION MARK (Close) ÷ [0.3] +÷ 0300 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] +÷ 0300 × 0308 × 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [998.0] COMMA (SContinue) ÷ [0.3] ÷ 0300 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0300 × 0308 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 0028 × 0022 × 0047 × 006F × 002E × 0022 × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [12.0] QUOTATION MARK (Close) × [12.0] LATIN CAPITAL LETTER G (Upper) × [12.0] LATIN SMALL LETTER O (Lower) × [12.0] FULL STOP (ATerm) × [9.0] QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [12.0] LATIN CAPITAL LETTER H (Upper) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] SPACE (Sp) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] LATIN SMALL LETTER I (Lower) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3] -÷ 0028 × 201C × 0047 × 006F × 003F × 201D × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [12.0] LEFT DOUBLE QUOTATION MARK (Close) × [12.0] LATIN CAPITAL LETTER G (Upper) × [12.0] LATIN SMALL LETTER O (Lower) × [12.0] QUESTION MARK (STerm) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [12.0] LATIN CAPITAL LETTER H (Upper) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] SPACE (Sp) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] LATIN SMALL LETTER I (Lower) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3] -÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E × 0020 × 0069 × 0073 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER I (Lower) × [12.0] LATIN SMALL LETTER S (Lower) ÷ [0.3] -÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 003F × 0020 ÷ 0048 × 0065 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] QUESTION MARK (STerm) × [9.0] SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) ÷ [0.3] -÷ 0033 × 002E × 0034 ÷ # ÷ [0.2] DIGIT THREE (Numeric) × [12.0] FULL STOP (ATerm) × [6.0] DIGIT FOUR (Numeric) ÷ [0.3] -÷ 0063 × 002E × 0064 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3] -÷ 0043 × 002E × 0064 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [12.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3] -÷ 0063 × 002E × 0044 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3] -÷ 0043 × 002E × 0044 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [12.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 2018 × 0028 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [12.0] LEFT PARENTHESIS (Close) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 2018 × 0028 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [12.0] LEFT PARENTHESIS (Close) × [12.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 0029 × 000A ÷ 0308 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [12.0] LATIN CAPITAL LETTER T (Upper) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 0074 × 0068 × 0065 × 0020 × 0072 × 0065 × 0073 × 0070 × 002E × 0020 × 006C × 0065 × 0061 × 0064 × 0065 × 0072 × 0073 × 0020 × 0061 × 0072 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER H (Lower) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] SPACE (Sp) × [12.0] LATIN SMALL LETTER R (Lower) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER S (Lower) × [12.0] LATIN SMALL LETTER P (Lower) × [12.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER L (Lower) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER A (Lower) × [12.0] LATIN SMALL LETTER D (Lower) × [12.0] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER R (Lower) × [12.0] LATIN SMALL LETTER S (Lower) × [12.0] SPACE (Sp) × [12.0] LATIN SMALL LETTER A (Lower) × [12.0] LATIN SMALL LETTER R (Lower) × [12.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] -÷ 5B57 × 002E ÷ 5B57 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [12.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E ÷ 5B83 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3] -÷ 0065 × 0074 × 0063 × 002E × 3002 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [12.0] LATIN SMALL LETTER T (Lower) × [12.0] LATIN SMALL LETTER C (Lower) × [12.0] FULL STOP (ATerm) × [8.1] IDEOGRAPHIC FULL STOP (STerm) ÷ [0.3] -÷ 5B57 × 3002 ÷ 5B83 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [12.0] IDEOGRAPHIC FULL STOP (STerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3] +÷ 000D × 000A ÷ 0061 × 000A ÷ 0308 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE FEED (LF)> (LF) ÷ [4.0] LATIN SMALL LETTER A (Lower) × [998.0] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3] +÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (Lower) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3] +÷ 0020 × 200D × 0646 ÷ # ÷ [0.2] SPACE (Sp) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [998.0] ARABIC LETTER NOON (OLetter) ÷ [0.3] +÷ 0646 × 200D × 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (OLetter) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [998.0] SPACE (Sp) ÷ [0.3] +÷ 0028 × 0022 × 0047 × 006F × 002E × 0022 × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [998.0] QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER G (Upper) × [998.0] LATIN SMALL LETTER O (Lower) × [998.0] FULL STOP (ATerm) × [9.0] QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3] +÷ 0028 × 201C × 0047 × 006F × 003F × 201D × 0029 × 0020 ÷ 0028 × 0048 × 0065 × 0020 × 0064 × 0069 × 0064 × 002E × 0029 ÷ # ÷ [0.2] LEFT PARENTHESIS (Close) × [998.0] LEFT DOUBLE QUOTATION MARK (Close) × [998.0] LATIN CAPITAL LETTER G (Upper) × [998.0] LATIN SMALL LETTER O (Lower) × [998.0] QUESTION MARK (STerm) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] SPACE (Sp) ÷ [11.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) ÷ [0.3] +÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E × 0020 × 0069 × 0073 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER I (Lower) × [998.0] LATIN SMALL LETTER S (Lower) ÷ [0.3] +÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 003F × 0020 ÷ 0048 × 0065 ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUESTION MARK (STerm) × [9.0] SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0055 × 002E × 0053 × 002E × 0041 × 0300 × 002E ÷ # ÷ [0.2] LATIN CAPITAL LETTER U (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER S (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) ÷ [0.3] +÷ 0033 × 002E × 0034 ÷ # ÷ [0.2] DIGIT THREE (Numeric) × [998.0] FULL STOP (ATerm) × [6.0] DIGIT FOUR (Numeric) ÷ [0.3] +÷ 0063 × 002E × 0064 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3] +÷ 0043 × 002E × 0064 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [998.0] FULL STOP (ATerm) × [8.0] LATIN SMALL LETTER D (Lower) ÷ [0.3] +÷ 0063 × 002E × 0044 ÷ # ÷ [0.2] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3] +÷ 0043 × 002E × 0044 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (Upper) × [998.0] FULL STOP (ATerm) × [7.0] LATIN CAPITAL LETTER D (Upper) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 2018 × 0028 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [998.0] LEFT PARENTHESIS (Close) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 ÷ 2018 × 0028 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [998.0] LEFT PARENTHESIS (Close) × [998.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 × 0074 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.0] RIGHT PARENTHESIS (Close) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [8.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 00A0 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [9.0] NO-BREAK SPACE (Sp) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 2019 × 0308 ÷ 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 0029 × 000A ÷ 0308 × 0054 × 0068 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [9.0] RIGHT PARENTHESIS (Close) × [9.0] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 0074 × 0068 × 0065 × 0020 × 0072 × 0065 × 0073 × 0070 × 002E × 0020 × 006C × 0065 × 0061 × 0064 × 0065 × 0072 × 0073 × 0020 × 0061 × 0072 × 0065 ÷ # ÷ [0.2] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER H (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER S (Lower) × [998.0] LATIN SMALL LETTER P (Lower) × [998.0] FULL STOP (ATerm) × [8.0] SPACE (Sp) × [8.0] LATIN SMALL LETTER L (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER D (Lower) × [998.0] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER S (Lower) × [998.0] SPACE (Sp) × [998.0] LATIN SMALL LETTER A (Lower) × [998.0] LATIN SMALL LETTER R (Lower) × [998.0] LATIN SMALL LETTER E (Lower) ÷ [0.3] +÷ 5B57 × 002E ÷ 5B57 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [998.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E ÷ 5B83 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3] +÷ 0065 × 0074 × 0063 × 002E × 3002 ÷ # ÷ [0.2] LATIN SMALL LETTER E (Lower) × [998.0] LATIN SMALL LETTER T (Lower) × [998.0] LATIN SMALL LETTER C (Lower) × [998.0] FULL STOP (ATerm) × [8.1] IDEOGRAPHIC FULL STOP (STerm) ÷ [0.3] +÷ 5B57 × 3002 ÷ 5B83 ÷ # ÷ [0.2] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [998.0] IDEOGRAPHIC FULL STOP (STerm) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) ÷ [0.3] ÷ 0021 × 0020 × 0020 ÷ # ÷ [0.2] EXCLAMATION MARK (STerm) × [9.0] SPACE (Sp) × [10.0] SPACE (Sp) ÷ [0.3] -÷ 2060 × 0028 × 2060 × 0022 × 2060 × 0047 × 2060 × 006F × 2060 × 002E × 2060 × 0022 × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0028 × 2060 × 201C × 2060 × 0047 × 2060 × 006F × 2060 × 003F × 2060 × 201D × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LEFT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 0020 × 2060 × 0069 × 2060 × 0073 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 003F × 2060 × 0020 × 2060 ÷ 0048 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0033 × 2060 × 002E × 2060 × 0034 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] DIGIT THREE (Numeric) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [6.0] DIGIT FOUR (Numeric) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0063 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0043 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0063 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0043 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 2018 × 2060 × 0028 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 2018 × 2060 × 0028 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 000A ÷ 2060 × 0308 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] <LINE FEED (LF)> (LF) ÷ [4.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 0020 × 2060 × 0072 × 2060 × 0065 × 2060 × 0073 × 2060 × 0070 × 2060 × 002E × 2060 × 0020 × 2060 × 006C × 2060 × 0065 × 2060 × 0061 × 2060 × 0064 × 2060 × 0065 × 2060 × 0072 × 2060 × 0073 × 2060 × 0020 × 2060 × 0061 × 2060 × 0072 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER P (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER L (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 5B57 × 2060 × 002E × 2060 ÷ 5B57 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 3002 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.1] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 5B57 × 2060 × 3002 × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [12.0] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 × 0021 × 2060 × 0020 × 2060 × 0020 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [12.0] EXCLAMATION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [10.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 1F1E6 × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Other) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (Other) × [12.0] REGIONAL INDICATOR SYMBOL LETTER C (Other) ÷ [0.3] -÷ 1F1E6 × 200D × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Other) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (Other) × [12.0] REGIONAL INDICATOR SYMBOL LETTER C (Other) ÷ [0.3] -÷ 1F1E6 × 1F1E7 × 200D × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Other) × [12.0] REGIONAL INDICATOR SYMBOL LETTER B (Other) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [12.0] REGIONAL INDICATOR SYMBOL LETTER C (Other) ÷ [0.3] -÷ 0020 × 200D × 0646 ÷ # ÷ [0.2] SPACE (Sp) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [12.0] ARABIC LETTER NOON (OLetter) ÷ [0.3] -÷ 0646 × 200D × 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (OLetter) × [5.0] ZERO WIDTH JOINER (Extend_FE) × [12.0] SPACE (Sp) ÷ [0.3] +÷ 2060 × 0028 × 2060 × 0022 × 2060 × 0047 × 2060 × 006F × 2060 × 002E × 2060 × 0022 × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0028 × 2060 × 201C × 2060 × 0047 × 2060 × 006F × 2060 × 003F × 2060 × 201D × 2060 × 0029 × 2060 × 0020 × 2060 ÷ 0028 × 2060 × 0048 × 2060 × 0065 × 2060 × 0020 × 2060 × 0064 × 2060 × 0069 × 2060 × 0064 × 2060 × 002E × 2060 × 0029 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER G (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER O (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT DOUBLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 0020 × 2060 × 0069 × 2060 × 0073 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER I (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 003F × 2060 × 0020 × 2060 ÷ 0048 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] QUESTION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER H (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0055 × 2060 × 002E × 2060 × 0053 × 2060 × 002E × 2060 × 0041 × 2060 × 0300 × 002E × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER U (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER S (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER A (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING GRAVE ACCENT (Extend_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0033 × 2060 × 002E × 2060 × 0034 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] DIGIT THREE (Numeric) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [6.0] DIGIT FOUR (Numeric) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0063 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0043 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0063 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0043 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER C (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (Upper) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 2018 × 2060 × 0028 × 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 ÷ 2018 × 2060 × 0028 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] LEFT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LEFT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [8.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [8.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 00A0 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] NO-BREAK SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 2019 × 2060 × 0308 ÷ 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT SINGLE QUOTATION MARK (Close) × [5.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) ÷ [11.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 0029 × 2060 × 000A ÷ 2060 × 0308 × 2060 × 0054 × 2060 × 0068 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [9.0] RIGHT PARENTHESIS (Close) × [5.0] WORD JOINER (Format_FE) × [9.0] <LINE FEED (LF)> (LF) ÷ [4.0] WORD JOINER (Format_FE) × [5.0] COMBINING DIAERESIS (Extend_FE) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN CAPITAL LETTER T (Upper) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0074 × 2060 × 0068 × 2060 × 0065 × 2060 × 0020 × 2060 × 0072 × 2060 × 0065 × 2060 × 0073 × 2060 × 0070 × 2060 × 002E × 2060 × 0020 × 2060 × 006C × 2060 × 0065 × 2060 × 0061 × 2060 × 0064 × 2060 × 0065 × 2060 × 0072 × 2060 × 0073 × 2060 × 0020 × 2060 × 0061 × 2060 × 0072 × 2060 × 0065 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER H (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER P (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [8.0] LATIN SMALL LETTER L (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER D (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER S (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER A (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER R (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 5B57 × 2060 × 002E × 2060 ÷ 5B57 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0065 × 2060 × 0074 × 2060 × 0063 × 2060 × 002E × 2060 × 3002 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER E (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER T (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] LATIN SMALL LETTER C (Lower) × [5.0] WORD JOINER (Format_FE) × [998.0] FULL STOP (ATerm) × [5.0] WORD JOINER (Format_FE) × [8.1] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 5B57 × 2060 × 3002 × 2060 ÷ 5B83 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] CJK UNIFIED IDEOGRAPH-5B57 (OLetter) × [5.0] WORD JOINER (Format_FE) × [998.0] IDEOGRAPHIC FULL STOP (STerm) × [5.0] WORD JOINER (Format_FE) ÷ [11.0] CJK UNIFIED IDEOGRAPH-5B83 (OLetter) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2060 × 0021 × 2060 × 0020 × 2060 × 0020 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) × [998.0] EXCLAMATION MARK (STerm) × [5.0] WORD JOINER (Format_FE) × [9.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [10.0] SPACE (Sp) × [5.0] WORD JOINER (Format_FE) × [5.0] WORD JOINER (Format_FE) ÷ [0.3] # -# Lines: 503 +# Lines: 502 # # EOF diff --git a/tests/data/WordBreakProperty.txt b/tests/data/WordBreakProperty.txt index dc8e82020f..6ccba54650 100644 --- a/tests/data/WordBreakProperty.txt +++ b/tests/data/WordBreakProperty.txt @@ -1,10 +1,11 @@ -# WordBreakProperty-8.0.0.txt -# Date: 2015-02-14, 10:26:15 GMT [MD] +# WordBreakProperty-9.0.0.txt +# Date: 2016-06-01, 10:34:38 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # ================================================ @@ -89,6 +90,7 @@ FB46..FB4F ; Hebrew_Letter # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW 0825..0827 ; Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U 0829..082D ; Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA 0859..085B ; Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +08D4..08E1 ; Extend # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA 08E3..0902 ; Extend # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA 0903 ; Extend # Mc DEVANAGARI SIGN VISARGA 093A ; Extend # Mn DEVANAGARI VOWEL SIGN OE @@ -243,6 +245,7 @@ FB46..FB4F ; Hebrew_Letter # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW 17C9..17D3 ; Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT 17DD ; Extend # Mn KHMER SIGN ATTHACAN 180B..180D ; Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +1885..1886 ; Extend # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA 18A9 ; Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA 1920..1922 ; Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U 1923..1926 ; Extend # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU @@ -309,8 +312,8 @@ FB46..FB4F ; Hebrew_Letter # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW 1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE 1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1DC0..1DF5 ; Extend # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE -1DFC..1DFF ; Extend # Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -200C..200D ; Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +1DFB..1DFF ; Extend # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +200C ; Extend # Cf ZERO WIDTH NON-JOINER 20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0 ; Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 20E1 ; Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE @@ -335,7 +338,7 @@ A825..A826 ; Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL A827 ; Extend # Mc SYLOTI NAGRI VOWEL SIGN OO A880..A881 ; Extend # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA A8B4..A8C3 ; Extend # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8C4 ; Extend # Mn SAURASHTRA SIGN VIRAMA +A8C4..A8C5 ; Extend # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU A8E0..A8F1 ; Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA A926..A92D ; Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU A947..A951 ; Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R @@ -417,6 +420,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11234 ; Extend # Mn KHOJKI SIGN ANUSVARA 11235 ; Extend # Mc KHOJKI SIGN VIRAMA 11236..11237 ; Extend # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +1123E ; Extend # Mn KHOJKI SIGN SUKUN 112DF ; Extend # Mn KHUDAWADI SIGN ANUSVARA 112E0..112E2 ; Extend # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II 112E3..112EA ; Extend # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA @@ -432,6 +436,12 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11362..11363 ; Extend # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL 11366..1136C ; Extend # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX 11370..11374 ; Extend # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11435..11437 ; Extend # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Extend # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Extend # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; Extend # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; Extend # Mc NEWA SIGN VISARGA +11446 ; Extend # Mn NEWA SIGN NUKTA 114B0..114B2 ; Extend # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II 114B3..114B8 ; Extend # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL 114B9 ; Extend # Mc TIRHUTA VOWEL SIGN E @@ -465,6 +475,18 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11726 ; Extend # Mc AHOM VOWEL SIGN E 11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11C2F ; Extend # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Extend # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Extend # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Extend # Mc BHAIKSUKI SIGN VISARGA +11C3F ; Extend # Mn BHAIKSUKI SIGN VIRAMA +11C92..11CA7 ; Extend # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Extend # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Extend # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Extend # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Extend # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Extend # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Extend # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F51..16F7E ; Extend # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG @@ -483,10 +505,17 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 1DA84 ; Extend # Mn SIGNWRITING LOCATION HEAD NECK 1DA9B..1DA9F ; Extend # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF ; Extend # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006 ; Extend # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Extend # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Extend # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Extend # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA 1E8D0..1E8D6 ; Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E94A ; Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 1967 +# Total code points: 2196 # ================================================ @@ -501,6 +530,7 @@ E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 061C ; Format # Cf ARABIC LETTER MARK 06DD ; Format # Cf ARABIC END OF AYAH 070F ; Format # Cf SYRIAC ABBREVIATION MARK +08E2 ; Format # Cf ARABIC DISPUTED END OF AYAH 180E ; Format # Cf MONGOLIAN VOWEL SEPARATOR 200E..200F ; Format # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK 202A..202E ; Format # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE @@ -512,9 +542,8 @@ FFF9..FFFB ; Format # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANN 1BCA0..1BCA3 ; Format # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP 1D173..1D17A ; Format # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE E0001 ; Format # Cf LANGUAGE TAG -E0020..E007F ; Format # Cf [96] TAG SPACE..CANCEL TAG -# Total code points: 147 +# Total code points: 52 # ================================================ @@ -595,6 +624,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 0828 ; ALetter # Lm SAMARITAN MODIFIER LETTER I 0840..0858 ; ALetter # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN 08A0..08B4 ; ALetter # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; ALetter # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON 0904..0939 ; ALetter # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA 093D ; ALetter # Lo DEVANAGARI SIGN AVAGRAHA 0950 ; ALetter # Lo DEVANAGARI OM @@ -660,6 +690,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 0C3D ; ALetter # Lo TELUGU SIGN AVAGRAHA 0C58..0C5A ; ALetter # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA 0C60..0C61 ; ALetter # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C80 ; ALetter # Lo KANNADA SIGN SPACING CANDRABINDU 0C85..0C8C ; ALetter # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L 0C8E..0C90 ; ALetter # Lo [3] KANNADA LETTER E..KANNADA LETTER AI 0C92..0CA8 ; ALetter # Lo [23] KANNADA LETTER O..KANNADA LETTER NA @@ -674,6 +705,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 0D12..0D3A ; ALetter # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA 0D3D ; ALetter # Lo MALAYALAM SIGN AVAGRAHA 0D4E ; ALetter # Lo MALAYALAM LETTER DOT REPH +0D54..0D56 ; ALetter # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL 0D5F..0D61 ; ALetter # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL 0D7A..0D7F ; ALetter # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K 0D85..0D96 ; ALetter # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA @@ -724,7 +756,8 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 1820..1842 ; ALetter # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI 1843 ; ALetter # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN 1844..1877 ; ALetter # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; ALetter # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +1880..1884 ; ALetter # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1887..18A8 ; ALetter # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA 18AA ; ALetter # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA 18B0..18F5 ; ALetter # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S 1900..191E ; ALetter # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA @@ -738,6 +771,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 1C4D..1C4F ; ALetter # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA 1C5A..1C77 ; ALetter # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH 1C78..1C7D ; ALetter # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C80..1C88 ; ALetter # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK 1CE9..1CEC ; ALetter # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL 1CEE..1CF1 ; ALetter # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA 1CF5..1CF6 ; ALetter # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA @@ -839,7 +873,7 @@ A771..A787 ; ALetter # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER IN A788 ; ALetter # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A78B..A78E ; ALetter # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; ALetter # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7AD ; ALetter # L& [30] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER L WITH BELT +A790..A7AE ; ALetter # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I A7B0..A7B7 ; ALetter # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA A7F7 ; ALetter # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I A7F8..A7F9 ; ALetter # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE @@ -915,6 +949,8 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 103D1..103D5 ; ALetter # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED 10400..1044F ; ALetter # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW 10450..1049D ; ALetter # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104B0..104D3 ; ALetter # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; ALetter # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA 10500..10527 ; ALetter # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE 10530..10563 ; ALetter # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW 10600..10736 ; ALetter # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 @@ -976,6 +1012,8 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1133D ; ALetter # Lo GRANTHA SIGN AVAGRAHA 11350 ; ALetter # Lo GRANTHA OM 1135D..11361 ; ALetter # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11400..11434 ; ALetter # Lo [53] NEWA LETTER A..NEWA LETTER HA +11447..1144A ; ALetter # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI 11480..114AF ; ALetter # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA 114C4..114C5 ; ALetter # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG 114C7 ; ALetter # Lo TIRHUTA OM @@ -987,6 +1025,10 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 118A0..118DF ; ALetter # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO 118FF ; ALetter # Lo WARANG CITI OM 11AC0..11AF8 ; ALetter # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08 ; ALetter # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; ALetter # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C40 ; ALetter # Lo BHAIKSUKI SIGN AVAGRAHA +11C72..11C8F ; ALetter # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A 12000..12399 ; ALetter # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; ALetter # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; ALetter # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU @@ -1002,6 +1044,7 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 16F00..16F44 ; ALetter # Lo [69] MIAO LETTER PA..MIAO LETTER HHA 16F50 ; ALetter # Lo MIAO LETTER NASALIZATION 16F93..16F9F ; ALetter # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0 ; ALetter # Lm TANGUT ITERATION MARK 1BC00..1BC6A ; ALetter # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; ALetter # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK 1BC80..1BC88 ; ALetter # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL @@ -1037,6 +1080,7 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1D7AA..1D7C2 ; ALetter # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA 1D7C4..1D7CB ; ALetter # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1E800..1E8C4 ; ALetter # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E900..1E943 ; ALetter # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA 1EE00..1EE03 ; ALetter # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F ; ALetter # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF 1EE21..1EE22 ; ALetter # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM @@ -1074,7 +1118,7 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1F150..1F169 ; ALetter # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; ALetter # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 27697 +# Total code points: 27992 # ================================================ @@ -1166,26 +1210,89 @@ ABF0..ABF9 ; Numeric # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT N 11136..1113F ; Numeric # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE 111D0..111D9 ; Numeric # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE 112F0..112F9 ; Numeric # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11450..11459 ; Numeric # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE 114D0..114D9 ; Numeric # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE 11650..11659 ; Numeric # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE 116C0..116C9 ; Numeric # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE 11730..11739 ; Numeric # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE 118E0..118E9 ; Numeric # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +11C50..11C59 ; Numeric # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE 16A60..16A69 ; Numeric # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE 16B50..16B59 ; Numeric # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE 1D7CE..1D7FF ; Numeric # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1E950..1E959 ; Numeric # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE -# Total code points: 541 +# Total code points: 571 # ================================================ 005F ; ExtendNumLet # Pc LOW LINE +202F ; ExtendNumLet # Zs NARROW NO-BREAK SPACE 203F..2040 ; ExtendNumLet # Pc [2] UNDERTIE..CHARACTER TIE 2054 ; ExtendNumLet # Pc INVERTED UNDERTIE FE33..FE34 ; ExtendNumLet # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE FE4D..FE4F ; ExtendNumLet # Pc [3] DASHED LOW LINE..WAVY LOW LINE FF3F ; ExtendNumLet # Pc FULLWIDTH LOW LINE -# Total code points: 10 +# Total code points: 11 + +# ================================================ + +261D ; E_Base # So WHITE UP POINTING INDEX +26F9 ; E_Base # So PERSON WITH BALL +270A..270D ; E_Base # So [4] RAISED FIST..WRITING HAND +1F385 ; E_Base # So FATHER CHRISTMAS +1F3C3..1F3C4 ; E_Base # So [2] RUNNER..SURFER +1F3CA..1F3CB ; E_Base # So [2] SWIMMER..WEIGHT LIFTER +1F442..1F443 ; E_Base # So [2] EAR..NOSE +1F446..1F450 ; E_Base # So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN +1F46E ; E_Base # So POLICE OFFICER +1F470..1F478 ; E_Base # So [9] BRIDE WITH VEIL..PRINCESS +1F47C ; E_Base # So BABY ANGEL +1F481..1F483 ; E_Base # So [3] INFORMATION DESK PERSON..DANCER +1F485..1F487 ; E_Base # So [3] NAIL POLISH..HAIRCUT +1F4AA ; E_Base # So FLEXED BICEPS +1F575 ; E_Base # So SLEUTH OR SPY +1F57A ; E_Base # So MAN DANCING +1F590 ; E_Base # So RAISED HAND WITH FINGERS SPLAYED +1F595..1F596 ; E_Base # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F645..1F647 ; E_Base # So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY +1F64B..1F64F ; E_Base # So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS +1F6A3 ; E_Base # So ROWBOAT +1F6B4..1F6B6 ; E_Base # So [3] BICYCLIST..PEDESTRIAN +1F6C0 ; E_Base # So BATH +1F918..1F91E ; E_Base # So [7] SIGN OF THE HORNS..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F926 ; E_Base # So FACE PALM +1F930 ; E_Base # So PREGNANT WOMAN +1F933..1F939 ; E_Base # So [7] SELFIE..JUGGLING +1F93C..1F93E ; E_Base # So [3] WRESTLERS..HANDBALL + +# Total code points: 79 + +# ================================================ + +1F3FB..1F3FF ; E_Modifier # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 + +# Total code points: 5 + +# ================================================ + +200D ; ZWJ # Cf ZERO WIDTH JOINER + +# Total code points: 1 + +# ================================================ + +2764 ; Glue_After_Zwj # So HEAVY BLACK HEART +1F48B ; Glue_After_Zwj # So KISS MARK +1F5E8 ; Glue_After_Zwj # So LEFT SPEECH BUBBLE + +# Total code points: 3 + +# ================================================ + +1F466..1F469 ; E_Base_GAZ # So [4] BOY..WOMAN + +# Total code points: 4 # EOF diff --git a/tests/data/WordBreakTest.txt b/tests/data/WordBreakTest.txt index 7e163f1e41..a3a4b0548e 100644 --- a/tests/data/WordBreakTest.txt +++ b/tests/data/WordBreakTest.txt @@ -1,10 +1,11 @@ -# WordBreakTest-8.0.0.txt -# Date: 2015-05-02, 14:48:55 GMT [MD] +# WordBreakTest-9.0.0.txt +# Date: 2016-06-02, 18:28:31 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Default Word Break Test # @@ -42,18 +43,28 @@ ÷ 0001 × 0308 ÷ 0030 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0001 ÷ 005F ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0001 × 0308 ÷ 005F ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0001 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0001 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0001 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0001 ÷ 05D0 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0001 × 0308 ÷ 05D0 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0001 ÷ 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0001 × 0308 ÷ 0022 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0001 ÷ 0027 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0001 × 0308 ÷ 0027 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0001 ÷ 261D ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0001 × 0308 ÷ 261D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0001 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0001 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0001 ÷ 2764 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0001 × 0308 ÷ 2764 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0001 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0001 × 0308 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0001 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0001 × 0308 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0001 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0001 × 0308 × 0300 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0001 × 200D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0001 × 0308 × 200D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0001 ÷ 0061 × 2060 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0001 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0001 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -94,18 +105,28 @@ ÷ 000D ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 000D ÷ 005F ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 005F ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 000D ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 000D ÷ 05D0 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 000D ÷ 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 000D ÷ 0027 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000D ÷ 261D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000D ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000D ÷ 2764 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000D ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] BOY (EBG) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000D ÷ 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000D ÷ 0308 × 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000D ÷ 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 000D ÷ 0308 × 0300 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000D ÷ 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 000D ÷ 0061 × 2060 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 000D ÷ 0061 ÷ 003A ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -146,18 +167,28 @@ ÷ 000A ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 000A ÷ 005F ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 005F ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 000A ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 000A ÷ 05D0 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 000A ÷ 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 000A ÷ 0027 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000A ÷ 261D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000A ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000A ÷ 2764 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000A ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] BOY (EBG) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000A ÷ 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000A ÷ 0308 × 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000A ÷ 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 000A ÷ 0308 × 0300 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000A ÷ 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 000A ÷ 0061 × 2060 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 000A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -198,18 +229,28 @@ ÷ 000B ÷ 0308 ÷ 0030 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 000B ÷ 005F ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 000B ÷ 0308 ÷ 005F ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 000B ÷ 1F1E6 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 000B ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 000B ÷ 1F1E6 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 1F1E6 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 000B ÷ 05D0 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 000B ÷ 0308 ÷ 05D0 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 000B ÷ 0022 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 000B ÷ 0308 ÷ 0022 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 000B ÷ 0027 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 000B ÷ 0308 ÷ 0027 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 000B ÷ 261D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 000B ÷ 1F3FB ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 000B ÷ 2764 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000B ÷ 1F466 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] BOY (EBG) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000B ÷ 00AD ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000B ÷ 0308 × 00AD ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 000B ÷ 0300 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 000B ÷ 0308 × 0300 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 000B ÷ 200D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 000B ÷ 0308 × 200D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 000B ÷ 0061 × 2060 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 000B ÷ 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 000B ÷ 0061 ÷ 003A ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -250,18 +291,28 @@ ÷ 3031 × 0308 ÷ 0030 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 3031 × 005F ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 3031 × 0308 × 005F ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 3031 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 3031 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 3031 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 3031 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 3031 ÷ 05D0 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 3031 × 0308 ÷ 05D0 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 3031 ÷ 0022 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 3031 × 0308 ÷ 0022 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 3031 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 3031 × 0308 ÷ 0027 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 3031 ÷ 261D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 3031 × 0308 ÷ 261D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 3031 ÷ 1F3FB ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 3031 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 3031 ÷ 2764 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 3031 × 0308 ÷ 2764 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 3031 ÷ 1F466 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 3031 × 0308 ÷ 1F466 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 3031 × 00AD ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 3031 × 0308 × 00AD ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 3031 × 0300 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 3031 × 0308 × 0300 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 3031 × 200D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 3031 × 0308 × 200D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 3031 ÷ 0061 × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 3031 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 3031 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -302,18 +353,28 @@ ÷ 0041 × 0308 × 0030 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0041 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0041 × 0308 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0041 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0041 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0041 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0041 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0041 × 05D0 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0041 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0041 ÷ 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0041 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0041 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0041 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0041 ÷ 261D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0041 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0041 ÷ 1F3FB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0041 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0041 ÷ 2764 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0041 × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0041 ÷ 1F466 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0041 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0041 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0041 × 0308 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0041 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0041 × 0308 × 0300 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0041 × 200D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0041 × 0308 × 200D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0041 × 0061 × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0041 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0041 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -354,18 +415,28 @@ ÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 003A ÷ 005F ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 003A ÷ 05D0 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 003A × 0308 ÷ 05D0 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 003A ÷ 0022 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 003A ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 003A ÷ 261D ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 003A ÷ 2764 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 003A × 0308 ÷ 2764 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 003A ÷ 1F466 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 003A × 00AD ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 003A × 0300 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 003A × 200D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 003A × 0308 × 200D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 003A ÷ 0061 × 2060 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 003A × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 003A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -406,18 +477,28 @@ ÷ 002C × 0308 ÷ 0030 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 002C ÷ 005F ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 002C ÷ 05D0 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 002C ÷ 0022 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 002C ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002C ÷ 261D ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 002C ÷ 2764 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 002C × 0308 ÷ 2764 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 002C ÷ 1F466 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 002C × 00AD ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 002C × 0300 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002C × 200D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 002C × 0308 × 200D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -458,18 +539,28 @@ ÷ 002E × 0308 ÷ 0030 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 002E ÷ 005F ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 002E × 0308 ÷ 005F ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 002E ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 002E × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 002E ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 002E × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 002E ÷ 05D0 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 002E × 0308 ÷ 05D0 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 002E ÷ 0022 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 002E × 0308 ÷ 0022 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 002E ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 002E × 0308 ÷ 0027 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 002E ÷ 261D ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 002E × 0308 ÷ 261D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 002E ÷ 1F3FB ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 002E × 0308 ÷ 1F3FB ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 002E ÷ 2764 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 002E × 0308 ÷ 2764 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 002E ÷ 1F466 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 002E × 0308 ÷ 1F466 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 002E × 00AD ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 002E × 0308 × 00AD ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 002E × 0300 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 002E × 0308 × 0300 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 002E × 200D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 002E × 0308 × 200D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 002E ÷ 0061 × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 002E × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 002E ÷ 0061 ÷ 003A ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -510,18 +601,28 @@ ÷ 0030 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [8.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0030 × 005F ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0030 × 0308 × 005F ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0030 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0030 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0030 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0030 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0030 × 05D0 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0030 × 0308 × 05D0 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0030 ÷ 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0030 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0030 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0030 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0030 ÷ 261D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0030 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0030 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0030 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0030 ÷ 2764 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0030 × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0030 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0030 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0030 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0030 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0030 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0030 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0030 × 200D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0030 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0030 × 0061 × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0030 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) × [10.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0030 × 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -562,18 +663,28 @@ ÷ 005F × 0308 × 0030 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 005F × 005F ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 005F × 0308 × 005F ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 005F ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 005F × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 005F ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 005F × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 005F × 05D0 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 005F × 0308 × 05D0 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 005F ÷ 0022 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 005F × 0308 ÷ 0022 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 005F ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 005F × 0308 ÷ 0027 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 005F ÷ 261D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 005F × 0308 ÷ 261D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 005F ÷ 1F3FB ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 005F × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 005F ÷ 2764 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 005F × 0308 ÷ 2764 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 005F ÷ 1F466 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 005F × 0308 ÷ 1F466 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 005F × 00AD ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 005F × 0308 × 00AD ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 005F × 0300 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 005F × 0308 × 0300 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 005F × 200D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 005F × 0308 × 200D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 005F × 0061 × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 005F × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 005F × 0061 ÷ 003A ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -592,58 +703,68 @@ ÷ 005F × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] ÷ 005F × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 005F × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 1F1E6 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] -÷ 1F1E6 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] -÷ 1F1E6 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] -÷ 1F1E6 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 1F1E6 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 1F1E6 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] -÷ 1F1E6 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 1F1E6 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 × 0308 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.3] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] -÷ 1F1E6 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] -÷ 1F1E6 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 1F1E6 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] -÷ 1F1E6 × 0308 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] -÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 1F1E6 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 1F1E6 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 1F1E6 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 1F1E6 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 1F1E6 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 1F1E6 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 1F1E6 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 1F1E6 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 1F1E6 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0001 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 1F1E6 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F1E6 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F1E6 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 000B ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 1F1E6 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 3031 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 1F1E6 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0041 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F1E6 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 002E ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 1F1E6 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0030 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 1F1E6 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 005F ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 1F1E6 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [15.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F1E6 × 0308 × 1F1E6 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [15.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F1E6 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 05D0 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 1F1E6 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0022 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 1F1E6 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 ÷ 261D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 261D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F1E6 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F1E6 ÷ 2764 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 2764 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F1E6 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F1E6 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0308 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 1F1E6 × 0308 × 0300 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 1F1E6 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F1E6 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F1E6 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F1E6 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 05D0 ÷ 0001 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 05D0 × 0308 ÷ 0001 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 05D0 ÷ 000D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] @@ -666,18 +787,28 @@ ÷ 05D0 × 0308 × 0030 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 05D0 × 005F ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 05D0 × 0308 × 005F ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 05D0 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 05D0 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 05D0 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 05D0 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 05D0 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 05D0 × 0308 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 05D0 ÷ 0022 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 05D0 × 0308 ÷ 0022 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 05D0 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 05D0 × 0308 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 05D0 ÷ 261D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 05D0 × 0308 ÷ 261D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 05D0 ÷ 1F3FB ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 05D0 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 05D0 ÷ 2764 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 05D0 × 0308 ÷ 2764 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 05D0 ÷ 1F466 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 05D0 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 05D0 × 00AD ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 05D0 × 0308 × 00AD ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 05D0 × 0300 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 05D0 × 0308 × 0300 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 05D0 × 200D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 05D0 × 0308 × 200D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 05D0 × 0061 × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 05D0 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 05D0 × 0061 ÷ 003A ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -718,18 +849,28 @@ ÷ 0022 × 0308 ÷ 0030 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0022 ÷ 005F ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0022 × 0308 ÷ 005F ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0022 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0022 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0022 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0022 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0022 ÷ 05D0 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0022 × 0308 ÷ 05D0 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0022 ÷ 0022 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0022 × 0308 ÷ 0022 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0022 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0022 × 0308 ÷ 0027 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0022 ÷ 261D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0022 × 0308 ÷ 261D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0022 ÷ 1F3FB ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0022 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0022 ÷ 2764 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0022 × 0308 ÷ 2764 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0022 ÷ 1F466 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0022 × 0308 ÷ 1F466 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0022 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0022 × 0308 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0022 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0022 × 0308 × 0300 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0022 × 200D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0022 × 0308 × 200D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0022 ÷ 0061 × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0022 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0022 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -770,18 +911,28 @@ ÷ 0027 × 0308 ÷ 0030 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0027 ÷ 005F ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0027 ÷ 05D0 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0027 × 0308 ÷ 05D0 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0027 ÷ 0022 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0027 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0027 ÷ 261D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0027 ÷ 2764 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0027 × 0308 ÷ 2764 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0027 × 00AD ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0027 × 0300 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0027 × 200D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0027 ÷ 0061 × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0027 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0027 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -800,6 +951,254 @@ ÷ 0027 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] ÷ 0027 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0027 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 261D ÷ 0001 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 261D × 0308 ÷ 0001 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 261D ÷ 000D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 261D × 0308 ÷ 000D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 261D ÷ 000A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 261D × 0308 ÷ 000A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 261D ÷ 000B ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 261D × 0308 ÷ 000B ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 261D ÷ 3031 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 261D × 0308 ÷ 3031 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 261D ÷ 0041 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 261D × 0308 ÷ 0041 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 261D ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 261D × 0308 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 261D ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 261D × 0308 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 261D ÷ 002E ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 261D × 0308 ÷ 002E ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 261D ÷ 0030 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 261D × 0308 ÷ 0030 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 261D ÷ 005F ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 261D × 0308 ÷ 005F ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 261D ÷ 1F1E6 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 261D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 261D ÷ 05D0 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 261D × 0308 ÷ 05D0 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 261D ÷ 0022 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 261D × 0308 ÷ 0022 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 261D ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 261D × 0308 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 261D ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 261D × 0308 ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 261D × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 261D × 0308 × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 261D ÷ 2764 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 261D × 0308 ÷ 2764 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 261D ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 261D × 0308 ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 261D × 00AD ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 261D × 0308 × 00AD ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 261D × 0300 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 261D × 0308 × 0300 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 261D × 200D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 261D × 0308 × 200D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 261D ÷ 0061 × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 261D × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 261D ÷ 0061 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 261D × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 261D ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 261D × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 261D ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 261D × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 261D ÷ 0061 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 261D × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 261D ÷ 0031 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 261D × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 261D ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 261D × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 261D ÷ 0031 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 261D × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 261D ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 261D × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F3FB ÷ 0001 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0001 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 1F3FB ÷ 000D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 000D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F3FB ÷ 000A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 000A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F3FB ÷ 000B ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 000B ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 1F3FB ÷ 3031 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 3031 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 1F3FB ÷ 0041 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0041 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F3FB ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F3FB ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F3FB ÷ 002E ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 002E ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 1F3FB ÷ 0030 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0030 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 1F3FB ÷ 005F ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 005F ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 1F3FB ÷ 1F1E6 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F3FB ÷ 05D0 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 05D0 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 1F3FB ÷ 0022 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0022 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 1F3FB ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F3FB ÷ 261D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 261D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F3FB ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F3FB ÷ 2764 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 2764 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F3FB ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F3FB × 00AD ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 1F3FB × 0308 × 00AD ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 1F3FB × 0300 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 1F3FB × 0308 × 0300 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 1F3FB × 200D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 1F3FB × 0308 × 200D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 1F3FB ÷ 0061 × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F3FB ÷ 0061 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F3FB ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F3FB ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F3FB ÷ 0061 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F3FB ÷ 0031 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F3FB ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F3FB ÷ 0031 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F3FB ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2764 ÷ 0001 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 2764 × 0308 ÷ 0001 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 2764 ÷ 000D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 2764 × 0308 ÷ 000D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 2764 ÷ 000A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 2764 × 0308 ÷ 000A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 2764 ÷ 000B ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 2764 × 0308 ÷ 000B ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 2764 ÷ 3031 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 2764 × 0308 ÷ 3031 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 2764 ÷ 0041 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 2764 × 0308 ÷ 0041 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 2764 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2764 × 0308 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2764 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2764 × 0308 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2764 ÷ 002E ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 2764 × 0308 ÷ 002E ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 2764 ÷ 0030 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 2764 × 0308 ÷ 0030 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 2764 ÷ 005F ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 2764 × 0308 ÷ 005F ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 2764 ÷ 1F1E6 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 2764 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 2764 ÷ 05D0 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 2764 × 0308 ÷ 05D0 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 2764 ÷ 0022 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 2764 × 0308 ÷ 0022 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 2764 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2764 × 0308 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2764 ÷ 261D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 2764 × 0308 ÷ 261D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 2764 ÷ 1F3FB ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 2764 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 2764 ÷ 2764 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 2764 × 0308 ÷ 2764 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 2764 ÷ 1F466 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 2764 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 2764 × 00AD ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 2764 × 0308 × 00AD ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 2764 × 0300 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 2764 × 0308 × 0300 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 2764 × 200D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 2764 × 0308 × 200D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 2764 ÷ 0061 × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2764 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2764 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2764 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2764 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2764 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2764 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2764 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2764 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2764 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2764 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2764 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2764 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2764 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2764 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2764 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2764 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2764 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F466 ÷ 0001 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0001 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 1F466 ÷ 000D ÷ # ÷ [0.2] BOY (EBG) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F466 × 0308 ÷ 000D ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 1F466 ÷ 000A ÷ # ÷ [0.2] BOY (EBG) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F466 × 0308 ÷ 000A ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 1F466 ÷ 000B ÷ # ÷ [0.2] BOY (EBG) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 1F466 × 0308 ÷ 000B ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 1F466 ÷ 3031 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 1F466 × 0308 ÷ 3031 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 1F466 ÷ 0041 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0041 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F466 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F466 × 0308 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F466 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F466 × 0308 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F466 ÷ 002E ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 1F466 × 0308 ÷ 002E ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 1F466 ÷ 0030 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0030 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 1F466 ÷ 005F ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 1F466 × 0308 ÷ 005F ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 1F466 ÷ 1F1E6 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F466 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 1F466 ÷ 05D0 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 1F466 × 0308 ÷ 05D0 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 1F466 ÷ 0022 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0022 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 1F466 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F466 ÷ 261D ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F466 × 0308 ÷ 261D ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F466 × 0308 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 1F466 ÷ 2764 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F466 × 0308 ÷ 2764 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F466 × 0308 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 1F466 × 00AD ÷ # ÷ [0.2] BOY (EBG) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 1F466 × 0308 × 00AD ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 1F466 × 0300 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 1F466 × 0308 × 0300 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 1F466 × 200D ÷ # ÷ [0.2] BOY (EBG) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 1F466 × 0308 × 200D ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 1F466 ÷ 0061 × 2060 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F466 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F466 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F466 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F466 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F466 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 1F466 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 1F466 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 1F466 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 1F466 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 00AD ÷ 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 00AD × 0308 ÷ 0001 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 00AD ÷ 000D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] @@ -822,18 +1221,28 @@ ÷ 00AD × 0308 ÷ 0030 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 00AD ÷ 005F ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 00AD × 0308 ÷ 005F ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 00AD ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 00AD × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 00AD ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 00AD × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 00AD ÷ 05D0 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 00AD × 0308 ÷ 05D0 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 00AD ÷ 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 00AD × 0308 ÷ 0022 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 00AD ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 00AD × 0308 ÷ 0027 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 00AD ÷ 261D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 00AD × 0308 ÷ 261D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 00AD ÷ 1F3FB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 00AD × 0308 ÷ 1F3FB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 00AD ÷ 2764 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 00AD × 0308 ÷ 2764 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 00AD ÷ 1F466 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 00AD × 0308 ÷ 1F466 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 00AD × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 00AD × 0308 × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 00AD × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 00AD × 0308 × 0300 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 00AD × 200D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 00AD × 0308 × 200D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 00AD ÷ 0061 × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 00AD × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 00AD ÷ 0061 ÷ 003A ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -874,18 +1283,28 @@ ÷ 0300 × 0308 ÷ 0030 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0300 ÷ 005F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0300 × 0308 ÷ 005F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0300 ÷ 05D0 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0300 × 0308 ÷ 05D0 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0300 ÷ 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0300 × 0308 ÷ 0022 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0300 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0300 × 0308 ÷ 0027 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0300 ÷ 261D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0300 × 0308 ÷ 261D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0300 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0300 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0300 ÷ 2764 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0300 × 0308 ÷ 2764 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0300 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0300 × 0308 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0300 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0300 × 0308 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0300 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0300 × 0308 × 0300 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0300 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0300 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0300 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -904,6 +1323,68 @@ ÷ 0300 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] ÷ 0300 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0300 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 200D × 0308 ÷ 0001 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 200D ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 200D × 0308 ÷ 000D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 200D ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 200D × 0308 ÷ 000A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 200D ÷ 000B ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 200D × 0308 ÷ 000B ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 200D ÷ 3031 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 200D × 0308 ÷ 3031 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 200D ÷ 0041 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 200D × 0308 ÷ 0041 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 200D ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D × 0308 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D × 0308 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D ÷ 002E ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 200D × 0308 ÷ 002E ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 200D ÷ 0030 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 200D × 0308 ÷ 0030 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 200D ÷ 005F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 200D × 0308 ÷ 005F ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 200D ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 200D × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 200D ÷ 05D0 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 200D × 0308 ÷ 05D0 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 200D ÷ 0022 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 200D × 0308 ÷ 0022 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 200D ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D × 0308 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D ÷ 261D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 200D × 0308 ÷ 261D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 200D ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 200D × 0308 ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 200D × 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 0308 ÷ 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) ÷ [0.3] +÷ 200D × 0308 ÷ 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 200D × 00AD ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 200D × 0308 × 00AD ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 200D × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 200D × 0308 × 0300 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 200D ÷ 0061 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D ÷ 0061 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D ÷ 0061 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D ÷ 0031 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 200D ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 200D ÷ 0031 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 200D ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 200D × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 2060 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 0061 × 2060 × 0308 ÷ 0001 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 0061 × 2060 ÷ 000D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] @@ -926,18 +1407,28 @@ ÷ 0061 × 2060 × 0308 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0061 × 2060 × 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0061 × 2060 × 0308 × 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0061 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0061 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0061 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0061 × 2060 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 × 2060 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 × 2060 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 × 2060 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0061 × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 × 2060 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 × 2060 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 × 2060 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 × 2060 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 × 2060 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 × 2060 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 × 2060 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0061 × 2060 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 × 2060 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 × 2060 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0061 × 2060 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 2060 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 2060 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -978,18 +1469,28 @@ ÷ 0061 ÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0061 ÷ 003A ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0061 ÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0061 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0061 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0061 × 003A × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 × 003A × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 ÷ 003A ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 ÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 ÷ 003A ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0061 ÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 003A × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 ÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 ÷ 003A × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0061 ÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 003A × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0061 × 003A × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 003A × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 003A × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -1030,18 +1531,28 @@ ÷ 0061 ÷ 0027 × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0061 ÷ 0027 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0061 ÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0061 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0061 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0061 × 0027 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 × 0027 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 ÷ 0027 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 ÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 ÷ 0027 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0061 ÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 0027 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 ÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 ÷ 0027 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0061 ÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0061 × 0027 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 0027 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 0027 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -1082,18 +1593,28 @@ ÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0061 ÷ 0027 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0061 × 0027 × 2060 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 × 0027 × 2060 × 0308 × 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0061 × 0027 × 2060 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 0027 × 2060 × 0308 × 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [7.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 × 0027 × 2060 × 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -1134,18 +1655,28 @@ ÷ 0061 ÷ 002C × 0308 ÷ 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0061 ÷ 002C ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0061 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0061 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0061 ÷ 002C ÷ 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0061 ÷ 002C ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0061 ÷ 002C ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 002C × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0061 ÷ 002C × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 × 200D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0061 ÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0061 ÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -1186,18 +1717,28 @@ ÷ 0031 ÷ 003A × 0308 ÷ 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0031 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0031 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 003A × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0031 ÷ 003A × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -1238,18 +1779,28 @@ ÷ 0031 × 0027 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0031 ÷ 0027 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0031 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0031 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0031 ÷ 0027 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0031 ÷ 0027 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0031 ÷ 0027 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 0027 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0031 ÷ 0027 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0031 ÷ 0027 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 ÷ 0027 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -1290,18 +1841,28 @@ ÷ 0031 × 002C × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0031 ÷ 002C ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0031 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0031 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0031 ÷ 002C ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0031 ÷ 002C ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0031 ÷ 002C ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 002C × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0031 ÷ 002C × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0031 ÷ 002C ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 ÷ 002C ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -1342,18 +1903,28 @@ ÷ 0031 × 002E × 2060 × 0308 × 0030 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 ÷ 005F ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 0031 ÷ 002E × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] -÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 ÷ 05D0 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0022 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0027 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 × 0300 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 × 200D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] @@ -1372,35 +1943,33 @@ ÷ 0031 × 002E × 2060 × 0308 × 0031 ÷ 002C ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] ÷ 0031 × 002E × 2060 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 0031 × 002E × 2060 × 0308 × 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [11.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 0063 × 0061 × 006E × 0027 × 0074 ÷ # ÷ [0.2] LATIN SMALL LETTER C (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER N (ALetter) × [6.0] APOSTROPHE (Single_Quote) × [7.0] LATIN SMALL LETTER T (ALetter) ÷ [0.3] -÷ 0063 × 0061 × 006E × 2019 × 0074 ÷ # ÷ [0.2] LATIN SMALL LETTER C (ALetter) × [5.0] LATIN SMALL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER N (ALetter) × [6.0] RIGHT SINGLE QUOTATION MARK (MidNumLet) × [7.0] LATIN SMALL LETTER T (ALetter) ÷ [0.3] -÷ 0061 × 0062 × 00AD × 0062 × 0079 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [5.0] LATIN SMALL LETTER B (ALetter) × [4.0] SOFT HYPHEN (Format_FE) × [5.0] LATIN SMALL LETTER B (ALetter) × [5.0] LATIN SMALL LETTER Y (ALetter) ÷ [0.3] -÷ 0061 ÷ 0024 ÷ 002D ÷ 0033 × 0034 × 002C × 0035 × 0036 × 0037 × 002E × 0031 × 0034 ÷ 0025 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] DOLLAR SIGN (Other) ÷ [999.0] HYPHEN-MINUS (Other) ÷ [999.0] DIGIT THREE (Numeric) × [8.0] DIGIT FOUR (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT FIVE (Numeric) × [8.0] DIGIT SIX (Numeric) × [8.0] DIGIT SEVEN (Numeric) × [12.0] FULL STOP (MidNumLet) × [11.0] DIGIT ONE (Numeric) × [8.0] DIGIT FOUR (Numeric) ÷ [999.0] PERCENT SIGN (Other) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] -÷ 0033 × 0061 ÷ # ÷ [0.2] DIGIT THREE (Numeric) × [10.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] -÷ 0063 × 002E × 0064 ÷ # ÷ [0.2] LATIN SMALL LETTER C (ALetter) × [6.0] FULL STOP (MidNumLet) × [7.0] LATIN SMALL LETTER D (ALetter) ÷ [0.3] -÷ 0043 × 002E × 0064 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (ALetter) × [6.0] FULL STOP (MidNumLet) × [7.0] LATIN SMALL LETTER D (ALetter) ÷ [0.3] -÷ 0063 × 002E × 0044 ÷ # ÷ [0.2] LATIN SMALL LETTER C (ALetter) × [6.0] FULL STOP (MidNumLet) × [7.0] LATIN CAPITAL LETTER D (ALetter) ÷ [0.3] -÷ 0043 × 002E × 0044 ÷ # ÷ [0.2] LATIN CAPITAL LETTER C (ALetter) × [6.0] FULL STOP (MidNumLet) × [7.0] LATIN CAPITAL LETTER D (ALetter) ÷ [0.3] -÷ 2060 ÷ 0063 × 2060 × 0061 × 2060 × 006E × 2060 × 0027 × 2060 × 0074 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER N (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER T (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 ÷ 0063 × 2060 × 0061 × 2060 × 006E × 2060 × 2019 × 2060 × 0074 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER N (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] RIGHT SINGLE QUOTATION MARK (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER T (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 ÷ 0061 × 2060 × 0062 × 2060 × 00AD × 2060 × 0062 × 2060 × 0079 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER B (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER B (ALetter) × [4.0] WORD JOINER (Format_FE) × [5.0] LATIN SMALL LETTER Y (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 ÷ 0061 × 2060 ÷ 0024 × 2060 ÷ 002D × 2060 ÷ 0033 × 2060 × 0034 × 2060 × 002C × 2060 × 0035 × 2060 × 0036 × 2060 × 0037 × 2060 × 002E × 2060 × 0031 × 2060 × 0034 × 2060 ÷ 0025 × 2060 ÷ 0062 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DOLLAR SIGN (Other) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HYPHEN-MINUS (Other) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] DIGIT THREE (Numeric) × [4.0] WORD JOINER (Format_FE) × [8.0] DIGIT FOUR (Numeric) × [4.0] WORD JOINER (Format_FE) × [12.0] COMMA (MidNum) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT FIVE (Numeric) × [4.0] WORD JOINER (Format_FE) × [8.0] DIGIT SIX (Numeric) × [4.0] WORD JOINER (Format_FE) × [8.0] DIGIT SEVEN (Numeric) × [4.0] WORD JOINER (Format_FE) × [12.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [11.0] DIGIT ONE (Numeric) × [4.0] WORD JOINER (Format_FE) × [8.0] DIGIT FOUR (Numeric) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] PERCENT SIGN (Other) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER B (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 ÷ 0033 × 2060 × 0061 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] DIGIT THREE (Numeric) × [4.0] WORD JOINER (Format_FE) × [10.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 ÷ 0063 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER D (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 ÷ 0043 × 2060 × 002E × 2060 × 0064 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN CAPITAL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN SMALL LETTER D (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 ÷ 0063 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN SMALL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2060 ÷ 0043 × 2060 × 002E × 2060 × 0044 × 2060 × 2060 ÷ # ÷ [0.2] WORD JOINER (Format_FE) ÷ [999.0] LATIN CAPITAL LETTER C (ALetter) × [4.0] WORD JOINER (Format_FE) × [6.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [7.0] LATIN CAPITAL LETTER D (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 0061 ÷ 1F1E6 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] -÷ 1F1F7 × 1F1FA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) ÷ [0.3] -÷ 1F1F7 × 1F1FA × 1F1F8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) ÷ [0.3] -÷ 1F1F7 × 1F1FA × 1F1F8 × 1F1EA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER E (Regional_Indicator) ÷ [0.3] -÷ 1F1F7 × 1F1FA ÷ 200B ÷ 1F1F8 × 1F1EA ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER R (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER U (Regional_Indicator) ÷ [999.0] ZERO WIDTH SPACE (Other) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER S (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER E (Regional_Indicator) ÷ [0.3] +÷ 000D × 000A ÷ 0061 ÷ 000A ÷ 0308 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) × [3.0] <LINE FEED (LF)> (LF) ÷ [3.1] LATIN SMALL LETTER A (ALetter) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [0.3] +÷ 0061 × 0308 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [0.3] +÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] ARABIC LETTER NOON (ALetter) ÷ [0.3] +÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (ALetter) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0041 × 0041 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN CAPITAL LETTER A (ALetter) × [5.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0041 × 003A × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [6.0] COLON (MidLetter) × [7.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0041 ÷ 003A ÷ 003A ÷ 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 05D0 × 0027 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.1] APOSTROPHE (Single_Quote) ÷ [0.3] ÷ 05D0 × 0022 × 05D0 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [7.2] QUOTATION MARK (Double_Quote) × [7.3] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] -÷ 1F1E6 × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 × 200D × 1F1E7 × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [4.0] ZERO WIDTH JOINER (Extend_FE) × [13.3] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3] -÷ 1F1E6 × 1F1E7 × 200D × 1F1E8 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (Regional_Indicator) × [13.3] REGIONAL INDICATOR SYMBOL LETTER B (Regional_Indicator) × [4.0] ZERO WIDTH JOINER (Extend_FE) × [13.3] REGIONAL INDICATOR SYMBOL LETTER C (Regional_Indicator) ÷ [0.3] -÷ 0020 × 200D ÷ 0646 ÷ # ÷ [0.2] SPACE (Other) × [4.0] ZERO WIDTH JOINER (Extend_FE) ÷ [999.0] ARABIC LETTER NOON (ALetter) ÷ [0.3] -÷ 0646 × 200D ÷ 0020 ÷ # ÷ [0.2] ARABIC LETTER NOON (ALetter) × [4.0] ZERO WIDTH JOINER (Extend_FE) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 0041 × 0030 × 0030 × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [9.0] DIGIT ZERO (Numeric) × [8.0] DIGIT ZERO (Numeric) × [10.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 0030 × 002C × 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [12.0] COMMA (MidNum) × [11.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 0030 ÷ 002C ÷ 002C ÷ 0030 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 3031 × 3031 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 0041 × 005F × 0030 × 005F × 3031 × 005F ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ZERO (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] VERTICAL KANA REPEAT MARK (Katakana) × [13.1] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 0041 × 005F × 005F × 0041 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [15.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 × 200D ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 200D × 1F1E7 ÷ 1F1E8 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 0061 ÷ 1F1E6 × 1F1E7 ÷ 1F1E8 × 1F1E9 ÷ 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER B (RI) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER C (RI) × [16.0] REGIONAL INDICATOR SYMBOL LETTER D (RI) ÷ [999.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] +÷ 261D × 1F3FB ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 200D × 1F466 × 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 200D × 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) ÷ [0.3] +÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 0061 × 0308 × 200D × 0308 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] ÷ 0031 × 005F × 0031 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] ÷ 0031 × 005F × 0061 ÷ 003A ÷ 003A ÷ 0031 ÷ # ÷ [0.2] DIGIT ONE (Numeric) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] DIGIT ONE (Numeric) ÷ [0.3] @@ -1510,6 +2079,6 @@ ÷ 0061 × 005F × 0031 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] ÷ 0061 × 005F × 0061 ÷ 002C ÷ 002C ÷ 0061 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [13.1] LOW LINE (ExtendNumLet) × [13.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] COMMA (MidNum) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [0.3] # -# Lines: 1489 +# Lines: 2057 # # EOF diff --git a/tests/data/line-break-exceptions.lisp-expr b/tests/data/line-break-exceptions.lisp-expr index ad393a8337..944337aab4 100644 --- a/tests/data/line-break-exceptions.lisp-expr +++ b/tests/data/line-break-exceptions.lisp-expr @@ -20,8 +20,8 @@ "× 002F ÷ 0030 ÷" ; "/0" UAX#14 25.14: SY × NU "× 002F × 0308 ÷ 0030 ÷" ; "/<combining diaresis>0" UAX#14 25.14: SY × NU "× 0065 × 0071 × 0075 × 0061 × 006C × 0073 × 0020 × 002E ÷ 0033 × 0035 × 0020 ÷ 0063 × 0065 × 006E × 0074 × 0073 ÷" ; "equals .35 cents" UAX#14 25.12: IS × NU - "× 0063 × 006F × 0064 × 0065 ÷ 005C ÷ 0028 × 0073 ÷ 005C × 0029 ÷" ; "code\(s\)" UAX#14 25.9: PR × OP - "× 0063 × 006F × 0064 × 0065 ÷ 005C ÷ 007B × 0073 ÷ 005C × 007D ÷" ; "code\{s\}" UAX#14 25.9: PR × OP + "× 0063 × 006F × 0064 × 0065 × 005C ÷ 0028 × 0073 × 005C × 0029 ÷" ; "code\(s\)" UAX#14 25.9: PR × OP + "× 0063 × 006F × 0064 × 0065 × 005C ÷ 007B × 0073 × 005C × 007D ÷" ; "code\{s\}" UAX#14 25.9: PR × OP "× 0061 × 002E ÷ 0032 × 0020 ÷" ; "a.2 " UAX#14 25.12: IS × NU "× 0061 × 002E ÷ 0032 × 0020 ÷ 0915 ÷" ; "a.2 क" UAX#14 25.12: IS × NU "× 0061 × 002E ÷ 0032 × 0020 ÷ 672C ÷" ; "a.2 本" UAX#14 25.12: IS × NU diff --git a/tests/unicode-properties.pure.lisp b/tests/unicode-properties.pure.lisp index 6b3da6fdae..bb85acb888 100644 --- a/tests/unicode-properties.pure.lisp +++ b/tests/unicode-properties.pure.lisp @@ -139,7 +139,7 @@ Wanted ~S, got ~S." (defun test-bidi-class () (declare (optimize (debug 2))) - (with-open-file (s "data/DerivedBidiClass.txt" :external-format :ascii) + (with-open-file (s "data/DerivedBidiClass.txt" :external-format :utf-8) (with-test (:name (:bidi-class)) (loop for line = (read-line s nil nil) while line @@ -150,7 +150,7 @@ Wanted ~S, got ~S." (defun test-hangul-syllable-type () (declare (optimize (debug 2))) - (with-open-file (s "data/HangulSyllableType.txt" :external-format :ascii) + (with-open-file (s "data/HangulSyllableType.txt" :external-format :utf-8) (with-test (:name (:hangul-syllable-type)) (loop for line = (read-line s nil nil) while line @@ -162,7 +162,7 @@ Wanted ~S, got ~S." (defun test-east-asian-width () (declare (optimize (debug 2))) (with-open-file (s "../tools-for-build/EastAsianWidth.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:east-asian-width)) (loop for line = (read-line s nil nil) while line @@ -174,7 +174,7 @@ Wanted ~S, got ~S." (defun test-script () (declare (optimize (debug 2))) (with-open-file (s "../tools-for-build/Scripts.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:script)) (loop for line = (read-line s nil nil) while line @@ -186,7 +186,7 @@ Wanted ~S, got ~S." (defun test-block () (declare (optimize (debug 2))) (with-open-file (s "../tools-for-build/Blocks.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:block)) (loop for line = (read-line s nil nil) while line @@ -203,7 +203,7 @@ Wanted ~S, got ~S." (defun test-proplist () (declare (optimize (debug 2))) (with-open-file (s "../tools-for-build/PropList.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:proplist)) (loop for line = (read-line s nil nil) while line @@ -228,7 +228,7 @@ Wanted ~S, got ~S." (defun test-bidi-mirroring-glyph () (declare (optimize (debug 2))) (with-open-file (s "../tools-for-build/BidiMirroring.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:bidi-mirroring-glyph) :skipped-on (not :sb-unicode)) (loop for line = (read-line s nil nil) @@ -251,7 +251,7 @@ Wanted ~S, got ~S." (defun test-age () (declare (optimize (debug 2))) (with-open-file (s "../tools-for-build/DerivedAge.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:age)) (loop for line = (read-line s nil nil) while line @@ -275,7 +275,7 @@ Wanted ~S, got ~S." (defun test-grapheme-break-class () (declare (optimize (debug 2))) (with-open-file (s "data/GraphemeBreakProperty.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:grapheme-break-class)) (loop for line = (read-line s nil nil) while line @@ -289,7 +289,7 @@ Wanted ~S, got ~S." (defun test-word-break-class () (declare (optimize (debug 2))) (with-open-file (s "data/WordBreakProperty.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:word-break-class)) (loop for line = (read-line s nil nil) while line @@ -302,7 +302,7 @@ Wanted ~S, got ~S." (defun test-sentence-break-class () (declare (optimize (debug 2))) (with-open-file (s "data/SentenceBreakProperty.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:sentence-break-class)) (loop for line = (read-line s nil nil) while line @@ -314,7 +314,7 @@ Wanted ~S, got ~S." (defun test-line-break-class () (declare (optimize (debug 2))) (with-open-file (s "../tools-for-build/LineBreak.txt" - :external-format :ascii) + :external-format :utf-8) (with-test (:name (:line-break-class)) (loop for line = (read-line s nil nil) while line diff --git a/tools-for-build/BidiMirroring.txt b/tools-for-build/BidiMirroring.txt index fbc60f1ab6..68142c5e32 100644 --- a/tools-for-build/BidiMirroring.txt +++ b/tools-for-build/BidiMirroring.txt @@ -1,19 +1,21 @@ -# BidiMirroring-8.0.0.txt -# Date: 2015-01-20, 18:30:00 GMT [KW, LI] +# BidiMirroring-9.0.0.txt +# Date: 2016-01-21, 22:00:00 GMT [KW, LI] +# © 2016 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ # # Bidi_Mirroring_Glyph Property # # This file is an informative contributory data file in the # Unicode Character Database. # -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# # This data file lists characters that have the Bidi_Mirrored=Yes property # value, for which there is another Unicode character that typically has a glyph # that is the mirror image of the original character's glyph. # -# The repertoire covered by the file is Unicode 8.0.0. +# The repertoire covered by the file is Unicode 9.0.0. # # The file contains a list of lines with mappings from one code point # to another one for character-based mirroring. diff --git a/tools-for-build/Blocks.txt b/tools-for-build/Blocks.txt index 0a4a580763..74c41e58a8 100644 --- a/tools-for-build/Blocks.txt +++ b/tools-for-build/Blocks.txt @@ -1,9 +1,9 @@ -# Blocks-8.0.0.txt -# Date: 2014-11-10, 23:04:00 GMT [KW] +# Blocks-9.0.0.txt +# Date: 2016-02-05, 23:48:00 GMT [KW] +# © 2016 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2014 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # # Format: @@ -93,6 +93,7 @@ 1BC0..1BFF; Batak 1C00..1C4F; Lepcha 1C50..1C7F; Ol Chiki +1C80..1C8F; Cyrillic Extended-C 1CC0..1CCF; Sundanese Supplement 1CD0..1CFF; Vedic Extensions 1D00..1D7F; Phonetic Extensions @@ -209,6 +210,7 @@ FFF0..FFFF; Specials 10400..1044F; Deseret 10450..1047F; Shavian 10480..104AF; Osmanya +104B0..104FF; Osage 10500..1052F; Elbasan 10530..1056F; Caucasian Albanian 10600..1077F; Linear A @@ -243,13 +245,17 @@ FFF0..FFFF; Specials 11280..112AF; Multani 112B0..112FF; Khudawadi 11300..1137F; Grantha +11400..1147F; Newa 11480..114DF; Tirhuta 11580..115FF; Siddham 11600..1165F; Modi +11660..1167F; Mongolian Supplement 11680..116CF; Takri 11700..1173F; Ahom 118A0..118FF; Warang Citi 11AC0..11AFF; Pau Cin Hau +11C00..11C6F; Bhaiksuki +11C70..11CBF; Marchen 12000..123FF; Cuneiform 12400..1247F; Cuneiform Numbers and Punctuation 12480..1254F; Early Dynastic Cuneiform @@ -260,6 +266,9 @@ FFF0..FFFF; Specials 16AD0..16AFF; Bassa Vah 16B00..16B8F; Pahawh Hmong 16F00..16F9F; Miao +16FE0..16FFF; Ideographic Symbols and Punctuation +17000..187FF; Tangut +18800..18AFF; Tangut Components 1B000..1B0FF; Kana Supplement 1BC00..1BC9F; Duployan 1BCA0..1BCAF; Shorthand Format Controls @@ -270,7 +279,9 @@ FFF0..FFFF; Specials 1D360..1D37F; Counting Rod Numerals 1D400..1D7FF; Mathematical Alphanumeric Symbols 1D800..1DAAF; Sutton SignWriting +1E000..1E02F; Glagolitic Supplement 1E800..1E8DF; Mende Kikakui +1E900..1E95F; Adlam 1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols 1F000..1F02F; Mahjong Tiles 1F030..1F09F; Domino Tiles diff --git a/tools-for-build/CaseFolding.txt b/tools-for-build/CaseFolding.txt index 0197a6c40f..372ee68bd8 100644 --- a/tools-for-build/CaseFolding.txt +++ b/tools-for-build/CaseFolding.txt @@ -1,10 +1,11 @@ -# CaseFolding-8.0.0.txt -# Date: 2015-01-13, 18:16:36 GMT [MD] +# CaseFolding-9.0.0.txt +# Date: 2016-03-02, 18:54:54 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Case Folding Properties # @@ -593,6 +594,15 @@ 13FB; C; 13F3; # CHEROKEE SMALL LETTER YU 13FC; C; 13F4; # CHEROKEE SMALL LETTER YV 13FD; C; 13F5; # CHEROKEE SMALL LETTER MV +1C80; C; 0432; # CYRILLIC SMALL LETTER ROUNDED VE +1C81; C; 0434; # CYRILLIC SMALL LETTER LONG-LEGGED DE +1C82; C; 043E; # CYRILLIC SMALL LETTER NARROW O +1C83; C; 0441; # CYRILLIC SMALL LETTER WIDE ES +1C84; C; 0442; # CYRILLIC SMALL LETTER TALL TE +1C85; C; 0442; # CYRILLIC SMALL LETTER THREE-LEGGED TE +1C86; C; 044A; # CYRILLIC SMALL LETTER TALL HARD SIGN +1C87; C; 0463; # CYRILLIC SMALL LETTER TALL YAT +1C88; C; A64B; # CYRILLIC SMALL LETTER UNBLENDED UK 1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW 1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE 1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW @@ -1163,6 +1173,7 @@ A7AA; C; 0266; # LATIN CAPITAL LETTER H WITH HOOK A7AB; C; 025C; # LATIN CAPITAL LETTER REVERSED OPEN E A7AC; C; 0261; # LATIN CAPITAL LETTER SCRIPT G A7AD; C; 026C; # LATIN CAPITAL LETTER L WITH BELT +A7AE; C; 026A; # LATIN CAPITAL LETTER SMALL CAPITAL I A7B0; C; 029E; # LATIN CAPITAL LETTER TURNED K A7B1; C; 0287; # LATIN CAPITAL LETTER TURNED T A7B2; C; 029D; # LATIN CAPITAL LETTER J WITH CROSSED-TAIL @@ -1327,6 +1338,42 @@ FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z 10425; C; 1044D; # DESERET CAPITAL LETTER ENG 10426; C; 1044E; # DESERET CAPITAL LETTER OI 10427; C; 1044F; # DESERET CAPITAL LETTER EW +104B0; C; 104D8; # OSAGE CAPITAL LETTER A +104B1; C; 104D9; # OSAGE CAPITAL LETTER AI +104B2; C; 104DA; # OSAGE CAPITAL LETTER AIN +104B3; C; 104DB; # OSAGE CAPITAL LETTER AH +104B4; C; 104DC; # OSAGE CAPITAL LETTER BRA +104B5; C; 104DD; # OSAGE CAPITAL LETTER CHA +104B6; C; 104DE; # OSAGE CAPITAL LETTER EHCHA +104B7; C; 104DF; # OSAGE CAPITAL LETTER E +104B8; C; 104E0; # OSAGE CAPITAL LETTER EIN +104B9; C; 104E1; # OSAGE CAPITAL LETTER HA +104BA; C; 104E2; # OSAGE CAPITAL LETTER HYA +104BB; C; 104E3; # OSAGE CAPITAL LETTER I +104BC; C; 104E4; # OSAGE CAPITAL LETTER KA +104BD; C; 104E5; # OSAGE CAPITAL LETTER EHKA +104BE; C; 104E6; # OSAGE CAPITAL LETTER KYA +104BF; C; 104E7; # OSAGE CAPITAL LETTER LA +104C0; C; 104E8; # OSAGE CAPITAL LETTER MA +104C1; C; 104E9; # OSAGE CAPITAL LETTER NA +104C2; C; 104EA; # OSAGE CAPITAL LETTER O +104C3; C; 104EB; # OSAGE CAPITAL LETTER OIN +104C4; C; 104EC; # OSAGE CAPITAL LETTER PA +104C5; C; 104ED; # OSAGE CAPITAL LETTER EHPA +104C6; C; 104EE; # OSAGE CAPITAL LETTER SA +104C7; C; 104EF; # OSAGE CAPITAL LETTER SHA +104C8; C; 104F0; # OSAGE CAPITAL LETTER TA +104C9; C; 104F1; # OSAGE CAPITAL LETTER EHTA +104CA; C; 104F2; # OSAGE CAPITAL LETTER TSA +104CB; C; 104F3; # OSAGE CAPITAL LETTER EHTSA +104CC; C; 104F4; # OSAGE CAPITAL LETTER TSHA +104CD; C; 104F5; # OSAGE CAPITAL LETTER DHA +104CE; C; 104F6; # OSAGE CAPITAL LETTER U +104CF; C; 104F7; # OSAGE CAPITAL LETTER WA +104D0; C; 104F8; # OSAGE CAPITAL LETTER KHA +104D1; C; 104F9; # OSAGE CAPITAL LETTER GHA +104D2; C; 104FA; # OSAGE CAPITAL LETTER ZA +104D3; C; 104FB; # OSAGE CAPITAL LETTER ZHA 10C80; C; 10CC0; # OLD HUNGARIAN CAPITAL LETTER A 10C81; C; 10CC1; # OLD HUNGARIAN CAPITAL LETTER AA 10C82; C; 10CC2; # OLD HUNGARIAN CAPITAL LETTER EB @@ -1410,5 +1457,39 @@ FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z 118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU 118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII 118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO +1E900; C; 1E922; # ADLAM CAPITAL LETTER ALIF +1E901; C; 1E923; # ADLAM CAPITAL LETTER DAALI +1E902; C; 1E924; # ADLAM CAPITAL LETTER LAAM +1E903; C; 1E925; # ADLAM CAPITAL LETTER MIIM +1E904; C; 1E926; # ADLAM CAPITAL LETTER BA +1E905; C; 1E927; # ADLAM CAPITAL LETTER SINNYIIYHE +1E906; C; 1E928; # ADLAM CAPITAL LETTER PE +1E907; C; 1E929; # ADLAM CAPITAL LETTER BHE +1E908; C; 1E92A; # ADLAM CAPITAL LETTER RA +1E909; C; 1E92B; # ADLAM CAPITAL LETTER E +1E90A; C; 1E92C; # ADLAM CAPITAL LETTER FA +1E90B; C; 1E92D; # ADLAM CAPITAL LETTER I +1E90C; C; 1E92E; # ADLAM CAPITAL LETTER O +1E90D; C; 1E92F; # ADLAM CAPITAL LETTER DHA +1E90E; C; 1E930; # ADLAM CAPITAL LETTER YHE +1E90F; C; 1E931; # ADLAM CAPITAL LETTER WAW +1E910; C; 1E932; # ADLAM CAPITAL LETTER NUN +1E911; C; 1E933; # ADLAM CAPITAL LETTER KAF +1E912; C; 1E934; # ADLAM CAPITAL LETTER YA +1E913; C; 1E935; # ADLAM CAPITAL LETTER U +1E914; C; 1E936; # ADLAM CAPITAL LETTER JIIM +1E915; C; 1E937; # ADLAM CAPITAL LETTER CHI +1E916; C; 1E938; # ADLAM CAPITAL LETTER HA +1E917; C; 1E939; # ADLAM CAPITAL LETTER QAAF +1E918; C; 1E93A; # ADLAM CAPITAL LETTER GA +1E919; C; 1E93B; # ADLAM CAPITAL LETTER NYA +1E91A; C; 1E93C; # ADLAM CAPITAL LETTER TU +1E91B; C; 1E93D; # ADLAM CAPITAL LETTER NHA +1E91C; C; 1E93E; # ADLAM CAPITAL LETTER VA +1E91D; C; 1E93F; # ADLAM CAPITAL LETTER KHA +1E91E; C; 1E940; # ADLAM CAPITAL LETTER GBE +1E91F; C; 1E941; # ADLAM CAPITAL LETTER ZAL +1E920; C; 1E942; # ADLAM CAPITAL LETTER KPO +1E921; C; 1E943; # ADLAM CAPITAL LETTER SHA # # EOF diff --git a/tools-for-build/CompositionExclusions.txt b/tools-for-build/CompositionExclusions.txt index a4324b8ce8..1999ed1328 100644 --- a/tools-for-build/CompositionExclusions.txt +++ b/tools-for-build/CompositionExclusions.txt @@ -1,5 +1,10 @@ -# CompositionExclusions-8.0.0.txt -# Date: 2015-02-19, 00:30:00 GMT [KW, LI] +# CompositionExclusions-9.0.0.txt +# Date: 2016-01-21, 22:00:00 GMT [KW, LI] +# © 2016 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ # # This file lists the characters for the Composition Exclusion Table # defined in UAX #15, Unicode Normalization Forms. @@ -7,9 +12,6 @@ # This file is a normative contributory data file in the # Unicode Character Database. # -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# # For more information, see # http://www.unicode.org/unicode/reports/tr15/#Primary_Exclusion_List_Table # diff --git a/tools-for-build/DerivedAge.txt b/tools-for-build/DerivedAge.txt index f1b0addb1c..e9c7cd65f7 100644 --- a/tools-for-build/DerivedAge.txt +++ b/tools-for-build/DerivedAge.txt @@ -1,10 +1,11 @@ -# DerivedAge-8.0.0.txt -# Date: 2015-02-13, 13:30:18 GMT [MD] +# DerivedAge-9.0.0.txt +# Date: 2016-03-02, 18:54:54 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Unicode Character Database: Derived Property Data # This file shows when various code points were first assigned in Unicode. @@ -1535,4 +1536,66 @@ FE2E..FE2F ; 8.0 # [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILL # Total code points: 7716 +# ================================================ + +# Age=V9_0 + +# Newly assigned in Unicode 9.0.0 (June, 2016) + +08B6..08BD ; 9.0 # [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08D4..08E1 ; 9.0 # [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA +08E2 ; 9.0 # ARABIC DISPUTED END OF AYAH +0C80 ; 9.0 # KANNADA SIGN SPACING CANDRABINDU +0D4F ; 9.0 # MALAYALAM SIGN PARA +0D54..0D56 ; 9.0 # [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D58..0D5E ; 9.0 # [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D76..0D78 ; 9.0 # [3] MALAYALAM FRACTION ONE SIXTEENTH..MALAYALAM FRACTION THREE SIXTEENTHS +1C80..1C88 ; 9.0 # [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1DFB ; 9.0 # COMBINING DELETION MARK +23FB..23FE ; 9.0 # [4] POWER SYMBOL..POWER SLEEP SYMBOL +2E43..2E44 ; 9.0 # [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK +A7AE ; 9.0 # LATIN CAPITAL LETTER SMALL CAPITAL I +A8C5 ; 9.0 # SAURASHTRA SIGN CANDRABINDU +1018D..1018E ; 9.0 # [2] GREEK INDICTION SIGN..NOMISMA SIGN +104B0..104D3 ; 9.0 # [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; 9.0 # [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +1123E ; 9.0 # KHOJKI SIGN SUKUN +11400..11459 ; 9.0 # [90] NEWA LETTER A..NEWA DIGIT NINE +1145B ; 9.0 # NEWA PLACEHOLDER MARK +1145D ; 9.0 # NEWA INSERTION SIGN +11660..1166C ; 9.0 # [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +11C00..11C08 ; 9.0 # [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C36 ; 9.0 # [45] BHAIKSUKI LETTER E..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C45 ; 9.0 # [14] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI GAP FILLER-2 +11C50..11C6C ; 9.0 # [29] BHAIKSUKI DIGIT ZERO..BHAIKSUKI HUNDREDS UNIT MARK +11C70..11C8F ; 9.0 # [32] MARCHEN HEAD MARK..MARCHEN LETTER A +11C92..11CA7 ; 9.0 # [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9..11CB6 ; 9.0 # [14] MARCHEN SUBJOINED LETTER YA..MARCHEN SIGN CANDRABINDU +16FE0 ; 9.0 # TANGUT ITERATION MARK +17000..187EC ; 9.0 # [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +18800..18AF2 ; 9.0 # [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +1E000..1E006 ; 9.0 # [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; 9.0 # [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; 9.0 # [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; 9.0 # [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; 9.0 # [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E900..1E94A ; 9.0 # [75] ADLAM CAPITAL LETTER ALIF..ADLAM NUKTA +1E950..1E959 ; 9.0 # [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; 9.0 # [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +1F19B..1F1AC ; 9.0 # [18] SQUARED THREE D..SQUARED VOD +1F23B ; 9.0 # SQUARED CJK UNIFIED IDEOGRAPH-914D +1F57A ; 9.0 # MAN DANCING +1F5A4 ; 9.0 # BLACK HEART +1F6D1..1F6D2 ; 9.0 # [2] OCTAGONAL SIGN..SHOPPING TROLLEY +1F6F4..1F6F6 ; 9.0 # [3] SCOOTER..CANOE +1F919..1F91E ; 9.0 # [6] CALL ME HAND..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F920..1F927 ; 9.0 # [8] FACE WITH COWBOY HAT..SNEEZING FACE +1F930 ; 9.0 # PREGNANT WOMAN +1F933..1F93E ; 9.0 # [12] SELFIE..HANDBALL +1F940..1F94B ; 9.0 # [12] WILTED FLOWER..MARTIAL ARTS UNIFORM +1F950..1F95E ; 9.0 # [15] CROISSANT..PANCAKES +1F985..1F991 ; 9.0 # [13] EAGLE..SQUID + +# Total code points: 7500 + # EOF diff --git a/tools-for-build/DerivedNormalizationProps.txt b/tools-for-build/DerivedNormalizationProps.txt index 6492493da3..089bd42abe 100644 --- a/tools-for-build/DerivedNormalizationProps.txt +++ b/tools-for-build/DerivedNormalizationProps.txt @@ -1,10 +1,11 @@ -# DerivedNormalizationProps-8.0.0.txt -# Date: 2015-02-13, 13:30:23 GMT [MD] +# DerivedNormalizationProps-9.0.0.txt +# Date: 2016-03-02, 18:54:59 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # ================================================ @@ -1679,12 +1680,12 @@ FFED..FFEE ; NFKD_QC; N # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CI 1F16A..1F16B ; NFKD_QC; N # So [2] RAISED MC SIGN..RAISED MD SIGN 1F190 ; NFKD_QC; N # So SQUARE DJ 1F200..1F202 ; NFKD_QC; N # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA -1F210..1F23A ; NFKD_QC; N # So [43] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F210..1F23B ; NFKD_QC; N # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240..1F248 ; NFKD_QC; N # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F250..1F251 ; NFKD_QC; N # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT 2F800..2FA1D ; NFKD_QC; N # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 16893 +# Total code points: 16894 # ================================================ @@ -2082,12 +2083,12 @@ FFED..FFEE ; NFKC_QC; N # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CI 1F16A..1F16B ; NFKC_QC; N # So [2] RAISED MC SIGN..RAISED MD SIGN 1F190 ; NFKC_QC; N # So SQUARE DJ 1F200..1F202 ; NFKC_QC; N # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA -1F210..1F23A ; NFKC_QC; N # So [43] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F210..1F23B ; NFKC_QC; N # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240..1F248 ; NFKC_QC; N # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F250..1F251 ; NFKC_QC; N # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT 2F800..2FA1D ; NFKC_QC; N # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 4793 +# Total code points: 4794 # ================================================ @@ -3513,6 +3514,14 @@ FFE3 ; Expands_On_NFKC # Sk FULLWIDTH MACRON 17B4..17B5 ; NFKC_CF; # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA 180B..180D ; NFKC_CF; # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE 180E ; NFKC_CF; # Cf MONGOLIAN VOWEL SEPARATOR +1C80 ; NFKC_CF; 0432 # L& CYRILLIC SMALL LETTER ROUNDED VE +1C81 ; NFKC_CF; 0434 # L& CYRILLIC SMALL LETTER LONG-LEGGED DE +1C82 ; NFKC_CF; 043E # L& CYRILLIC SMALL LETTER NARROW O +1C83 ; NFKC_CF; 0441 # L& CYRILLIC SMALL LETTER WIDE ES +1C84..1C85 ; NFKC_CF; 0442 # L& [2] CYRILLIC SMALL LETTER TALL TE..CYRILLIC SMALL LETTER THREE-LEGGED TE +1C86 ; NFKC_CF; 044A # L& CYRILLIC SMALL LETTER TALL HARD SIGN +1C87 ; NFKC_CF; 0463 # L& CYRILLIC SMALL LETTER TALL YAT +1C88 ; NFKC_CF; A64B # L& CYRILLIC SMALL LETTER UNBLENDED UK 1D2C ; NFKC_CF; 0061 # Lm MODIFIER LETTER CAPITAL A 1D2D ; NFKC_CF; 00E6 # Lm MODIFIER LETTER CAPITAL AE 1D2E ; NFKC_CF; 0062 # Lm MODIFIER LETTER CAPITAL B @@ -5263,6 +5272,7 @@ A7AA ; NFKC_CF; 0266 # L& LATIN CAPITAL LETTER H WITH H A7AB ; NFKC_CF; 025C # L& LATIN CAPITAL LETTER REVERSED OPEN E A7AC ; NFKC_CF; 0261 # L& LATIN CAPITAL LETTER SCRIPT G A7AD ; NFKC_CF; 026C # L& LATIN CAPITAL LETTER L WITH BELT +A7AE ; NFKC_CF; 026A # L& LATIN CAPITAL LETTER SMALL CAPITAL I A7B0 ; NFKC_CF; 029E # L& LATIN CAPITAL LETTER TURNED K A7B1 ; NFKC_CF; 0287 # L& LATIN CAPITAL LETTER TURNED T A7B2 ; NFKC_CF; 029D # L& LATIN CAPITAL LETTER J WITH CROSSED-TAIL @@ -6731,6 +6741,42 @@ FFF0..FFF8 ; NFKC_CF; # Cn [9] <reserved-FFF0>..<reserved-FF 10425 ; NFKC_CF; 1044D # L& DESERET CAPITAL LETTER ENG 10426 ; NFKC_CF; 1044E # L& DESERET CAPITAL LETTER OI 10427 ; NFKC_CF; 1044F # L& DESERET CAPITAL LETTER EW +104B0 ; NFKC_CF; 104D8 # L& OSAGE CAPITAL LETTER A +104B1 ; NFKC_CF; 104D9 # L& OSAGE CAPITAL LETTER AI +104B2 ; NFKC_CF; 104DA # L& OSAGE CAPITAL LETTER AIN +104B3 ; NFKC_CF; 104DB # L& OSAGE CAPITAL LETTER AH +104B4 ; NFKC_CF; 104DC # L& OSAGE CAPITAL LETTER BRA +104B5 ; NFKC_CF; 104DD # L& OSAGE CAPITAL LETTER CHA +104B6 ; NFKC_CF; 104DE # L& OSAGE CAPITAL LETTER EHCHA +104B7 ; NFKC_CF; 104DF # L& OSAGE CAPITAL LETTER E +104B8 ; NFKC_CF; 104E0 # L& OSAGE CAPITAL LETTER EIN +104B9 ; NFKC_CF; 104E1 # L& OSAGE CAPITAL LETTER HA +104BA ; NFKC_CF; 104E2 # L& OSAGE CAPITAL LETTER HYA +104BB ; NFKC_CF; 104E3 # L& OSAGE CAPITAL LETTER I +104BC ; NFKC_CF; 104E4 # L& OSAGE CAPITAL LETTER KA +104BD ; NFKC_CF; 104E5 # L& OSAGE CAPITAL LETTER EHKA +104BE ; NFKC_CF; 104E6 # L& OSAGE CAPITAL LETTER KYA +104BF ; NFKC_CF; 104E7 # L& OSAGE CAPITAL LETTER LA +104C0 ; NFKC_CF; 104E8 # L& OSAGE CAPITAL LETTER MA +104C1 ; NFKC_CF; 104E9 # L& OSAGE CAPITAL LETTER NA +104C2 ; NFKC_CF; 104EA # L& OSAGE CAPITAL LETTER O +104C3 ; NFKC_CF; 104EB # L& OSAGE CAPITAL LETTER OIN +104C4 ; NFKC_CF; 104EC # L& OSAGE CAPITAL LETTER PA +104C5 ; NFKC_CF; 104ED # L& OSAGE CAPITAL LETTER EHPA +104C6 ; NFKC_CF; 104EE # L& OSAGE CAPITAL LETTER SA +104C7 ; NFKC_CF; 104EF # L& OSAGE CAPITAL LETTER SHA +104C8 ; NFKC_CF; 104F0 # L& OSAGE CAPITAL LETTER TA +104C9 ; NFKC_CF; 104F1 # L& OSAGE CAPITAL LETTER EHTA +104CA ; NFKC_CF; 104F2 # L& OSAGE CAPITAL LETTER TSA +104CB ; NFKC_CF; 104F3 # L& OSAGE CAPITAL LETTER EHTSA +104CC ; NFKC_CF; 104F4 # L& OSAGE CAPITAL LETTER TSHA +104CD ; NFKC_CF; 104F5 # L& OSAGE CAPITAL LETTER DHA +104CE ; NFKC_CF; 104F6 # L& OSAGE CAPITAL LETTER U +104CF ; NFKC_CF; 104F7 # L& OSAGE CAPITAL LETTER WA +104D0 ; NFKC_CF; 104F8 # L& OSAGE CAPITAL LETTER KHA +104D1 ; NFKC_CF; 104F9 # L& OSAGE CAPITAL LETTER GHA +104D2 ; NFKC_CF; 104FA # L& OSAGE CAPITAL LETTER ZA +104D3 ; NFKC_CF; 104FB # L& OSAGE CAPITAL LETTER ZHA 10C80 ; NFKC_CF; 10CC0 # L& OLD HUNGARIAN CAPITAL LETTER A 10C81 ; NFKC_CF; 10CC1 # L& OLD HUNGARIAN CAPITAL LETTER AA 10C82 ; NFKC_CF; 10CC2 # L& OLD HUNGARIAN CAPITAL LETTER EB @@ -7819,6 +7865,40 @@ FFF0..FFF8 ; NFKC_CF; # Cn [9] <reserved-FFF0>..<reserved-FF 1D7FD ; NFKC_CF; 0037 # Nd MATHEMATICAL MONOSPACE DIGIT SEVEN 1D7FE ; NFKC_CF; 0038 # Nd MATHEMATICAL MONOSPACE DIGIT EIGHT 1D7FF ; NFKC_CF; 0039 # Nd MATHEMATICAL MONOSPACE DIGIT NINE +1E900 ; NFKC_CF; 1E922 # L& ADLAM CAPITAL LETTER ALIF +1E901 ; NFKC_CF; 1E923 # L& ADLAM CAPITAL LETTER DAALI +1E902 ; NFKC_CF; 1E924 # L& ADLAM CAPITAL LETTER LAAM +1E903 ; NFKC_CF; 1E925 # L& ADLAM CAPITAL LETTER MIIM +1E904 ; NFKC_CF; 1E926 # L& ADLAM CAPITAL LETTER BA +1E905 ; NFKC_CF; 1E927 # L& ADLAM CAPITAL LETTER SINNYIIYHE +1E906 ; NFKC_CF; 1E928 # L& ADLAM CAPITAL LETTER PE +1E907 ; NFKC_CF; 1E929 # L& ADLAM CAPITAL LETTER BHE +1E908 ; NFKC_CF; 1E92A # L& ADLAM CAPITAL LETTER RA +1E909 ; NFKC_CF; 1E92B # L& ADLAM CAPITAL LETTER E +1E90A ; NFKC_CF; 1E92C # L& ADLAM CAPITAL LETTER FA +1E90B ; NFKC_CF; 1E92D # L& ADLAM CAPITAL LETTER I +1E90C ; NFKC_CF; 1E92E # L& ADLAM CAPITAL LETTER O +1E90D ; NFKC_CF; 1E92F # L& ADLAM CAPITAL LETTER DHA +1E90E ; NFKC_CF; 1E930 # L& ADLAM CAPITAL LETTER YHE +1E90F ; NFKC_CF; 1E931 # L& ADLAM CAPITAL LETTER WAW +1E910 ; NFKC_CF; 1E932 # L& ADLAM CAPITAL LETTER NUN +1E911 ; NFKC_CF; 1E933 # L& ADLAM CAPITAL LETTER KAF +1E912 ; NFKC_CF; 1E934 # L& ADLAM CAPITAL LETTER YA +1E913 ; NFKC_CF; 1E935 # L& ADLAM CAPITAL LETTER U +1E914 ; NFKC_CF; 1E936 # L& ADLAM CAPITAL LETTER JIIM +1E915 ; NFKC_CF; 1E937 # L& ADLAM CAPITAL LETTER CHI +1E916 ; NFKC_CF; 1E938 # L& ADLAM CAPITAL LETTER HA +1E917 ; NFKC_CF; 1E939 # L& ADLAM CAPITAL LETTER QAAF +1E918 ; NFKC_CF; 1E93A # L& ADLAM CAPITAL LETTER GA +1E919 ; NFKC_CF; 1E93B # L& ADLAM CAPITAL LETTER NYA +1E91A ; NFKC_CF; 1E93C # L& ADLAM CAPITAL LETTER TU +1E91B ; NFKC_CF; 1E93D # L& ADLAM CAPITAL LETTER NHA +1E91C ; NFKC_CF; 1E93E # L& ADLAM CAPITAL LETTER VA +1E91D ; NFKC_CF; 1E93F # L& ADLAM CAPITAL LETTER KHA +1E91E ; NFKC_CF; 1E940 # L& ADLAM CAPITAL LETTER GBE +1E91F ; NFKC_CF; 1E941 # L& ADLAM CAPITAL LETTER ZAL +1E920 ; NFKC_CF; 1E942 # L& ADLAM CAPITAL LETTER KPO +1E921 ; NFKC_CF; 1E943 # L& ADLAM CAPITAL LETTER SHA 1EE00 ; NFKC_CF; 0627 # Lo ARABIC MATHEMATICAL ALEF 1EE01 ; NFKC_CF; 0628 # Lo ARABIC MATHEMATICAL BEH 1EE02 ; NFKC_CF; 062C # Lo ARABIC MATHEMATICAL JEEM @@ -8083,6 +8163,7 @@ FFF0..FFF8 ; NFKC_CF; # Cn [9] <reserved-FFF0>..<reserved-FF 1F238 ; NFKC_CF; 7533 # So SQUARED CJK UNIFIED IDEOGRAPH-7533 1F239 ; NFKC_CF; 5272 # So SQUARED CJK UNIFIED IDEOGRAPH-5272 1F23A ; NFKC_CF; 55B6 # So SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F23B ; NFKC_CF; 914D # So SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240 ; NFKC_CF; 3014 672C 3015 # So TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C 1F241 ; NFKC_CF; 3014 4E09 3015 # So TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 1F242 ; NFKC_CF; 3014 4E8C 3015 # So TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C @@ -8634,7 +8715,7 @@ E0080..E00FF ; NFKC_CF; # Cn [128] <reserved-E0080>..<reserved-E E0100..E01EF ; NFKC_CF; # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 E01F0..E0FFF ; NFKC_CF; # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> -# Total code points: 10146 +# Total code points: 10227 # ================================================ @@ -8972,6 +9053,7 @@ E01F0..E0FFF ; NFKC_CF; # Cn [3600] <reserved-E01F0>..<reserved- 17B4..17B5 ; Changes_When_NFKC_Casefolded # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA 180B..180D ; Changes_When_NFKC_Casefolded # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE 180E ; Changes_When_NFKC_Casefolded # Cf MONGOLIAN VOWEL SEPARATOR +1C80..1C88 ; Changes_When_NFKC_Casefolded # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK 1D2C..1D2E ; Changes_When_NFKC_Casefolded # Lm [3] MODIFIER LETTER CAPITAL A..MODIFIER LETTER CAPITAL B 1D30..1D3A ; Changes_When_NFKC_Casefolded # Lm [11] MODIFIER LETTER CAPITAL D..MODIFIER LETTER CAPITAL N 1D3C..1D4D ; Changes_When_NFKC_Casefolded # Lm [18] MODIFIER LETTER CAPITAL O..MODIFIER LETTER SMALL G @@ -9389,7 +9471,7 @@ A7A2 ; Changes_When_NFKC_Casefolded # L& LATIN CAPITAL LETTER K W A7A4 ; Changes_When_NFKC_Casefolded # L& LATIN CAPITAL LETTER N WITH OBLIQUE STROKE A7A6 ; Changes_When_NFKC_Casefolded # L& LATIN CAPITAL LETTER R WITH OBLIQUE STROKE A7A8 ; Changes_When_NFKC_Casefolded # L& LATIN CAPITAL LETTER S WITH OBLIQUE STROKE -A7AA..A7AD ; Changes_When_NFKC_Casefolded # L& [4] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER L WITH BELT +A7AA..A7AE ; Changes_When_NFKC_Casefolded # L& [5] LATIN CAPITAL LETTER H WITH HOOK..LATIN CAPITAL LETTER SMALL CAPITAL I A7B0..A7B4 ; Changes_When_NFKC_Casefolded # L& [5] LATIN CAPITAL LETTER TURNED K..LATIN CAPITAL LETTER BETA A7B6 ; Changes_When_NFKC_Casefolded # L& LATIN CAPITAL LETTER OMEGA A7F8..A7F9 ; Changes_When_NFKC_Casefolded # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE @@ -9519,6 +9601,7 @@ FFE9..FFEC ; Changes_When_NFKC_Casefolded # Sm [4] HALFWIDTH LEFTWARDS ARRO FFED..FFEE ; Changes_When_NFKC_Casefolded # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE FFF0..FFF8 ; Changes_When_NFKC_Casefolded # Cn [9] <reserved-FFF0>..<reserved-FFF8> 10400..10427 ; Changes_When_NFKC_Casefolded # L& [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW +104B0..104D3 ; Changes_When_NFKC_Casefolded # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA 10C80..10CB2 ; Changes_When_NFKC_Casefolded # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US 118A0..118BF ; Changes_When_NFKC_Casefolded # L& [32] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI CAPITAL LETTER VIYO 1BCA0..1BCA3 ; Changes_When_NFKC_Casefolded # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP @@ -9566,6 +9649,7 @@ FFF0..FFF8 ; Changes_When_NFKC_Casefolded # Cn [9] <reserved-FFF0>..<reserv 1D7C3 ; Changes_When_NFKC_Casefolded # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL 1D7C4..1D7CB ; Changes_When_NFKC_Casefolded # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1D7CE..1D7FF ; Changes_When_NFKC_Casefolded # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1E900..1E921 ; Changes_When_NFKC_Casefolded # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA 1EE00..1EE03 ; Changes_When_NFKC_Casefolded # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F ; Changes_When_NFKC_Casefolded # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF 1EE21..1EE22 ; Changes_When_NFKC_Casefolded # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM @@ -9605,7 +9689,7 @@ FFF0..FFF8 ; Changes_When_NFKC_Casefolded # Cn [9] <reserved-FFF0>..<reserv 1F16A..1F16B ; Changes_When_NFKC_Casefolded # So [2] RAISED MC SIGN..RAISED MD SIGN 1F190 ; Changes_When_NFKC_Casefolded # So SQUARE DJ 1F200..1F202 ; Changes_When_NFKC_Casefolded # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA -1F210..1F23A ; Changes_When_NFKC_Casefolded # So [43] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F210..1F23B ; Changes_When_NFKC_Casefolded # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240..1F248 ; Changes_When_NFKC_Casefolded # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F250..1F251 ; Changes_When_NFKC_Casefolded # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT 2F800..2FA1D ; Changes_When_NFKC_Casefolded # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D @@ -9617,6 +9701,6 @@ E0080..E00FF ; Changes_When_NFKC_Casefolded # Cn [128] <reserved-E0080>..<reser E0100..E01EF ; Changes_When_NFKC_Casefolded # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 E01F0..E0FFF ; Changes_When_NFKC_Casefolded # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> -# Total code points: 10146 +# Total code points: 10227 # EOF diff --git a/tools-for-build/EastAsianWidth.txt b/tools-for-build/EastAsianWidth.txt index b72970e171..5a2ede5d59 100644 --- a/tools-for-build/EastAsianWidth.txt +++ b/tools-for-build/EastAsianWidth.txt @@ -1,35 +1,34 @@ -# EastAsianWidth-8.0.0.txt -# Date: 2015-02-10, 21:00:00 GMT [KW, LI] +# EastAsianWidth-9.0.0.txt +# Date: 2016-05-27, 17:00:00 GMT [KW, LI] +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ # # East_Asian_Width Property # # This file is an informative contributory data file in the # Unicode Character Database. # -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# # The format is two fields separated by a semicolon. # Field 0: Unicode code point value or range of code point values # Field 1: East_Asian_Width property, consisting of one of the following values: -# "N", "A", "H", "W", "F", "Na" +# "A", "F", "H", "N", "Na", "W" # - All code points, assigned or unassigned, that are not listed -# explicitly are given the value "N". -# The unassigned code points that default to "W" include ranges in the -# following blocks: -# CJK Unified Ideographs Extension A: U+3400..U+4DBF -# CJK Unified Ideographs: U+4E00..U+9FFF -# CJK Compatibility Ideographs: U+F900..U+FAFF -# CJK Unified Ideographs Extension B: U+20000..U+2A6DF -# CJK Unified Ideographs Extension C: U+2A700..U+2B73F -# CJK Unified Ideographs Extension D: U+2B740..U+2B81F -# CJK Unified Ideographs Extension E: U+2B820..U+2CEAF -# CJK Compatibility Ideographs Supplement: U+2F800..U+2FA1F -# and any other reserved code points on -# Planes 2 and 3: U+20000..U+2FFFD -# U+30000..U+3FFFD -# - Character ranges are specified as for other property files in -# the Unicode Character Database. +# explicitly are given the value "N". +# - The unassigned code points in the following blocks default to "W": +# CJK Unified Ideographs Extension A: U+3400..U+4DBF +# CJK Unified Ideographs: U+4E00..U+9FFF +# CJK Compatibility Ideographs: U+F900..U+FAFF +# - All undesignated code points in Planes 2 and 3, whether inside or +# outside of allocated blocks, default to "W": +# Plane 2: U+20000..U+2FFFD +# Plane 3: U+30000..U+3FFFD +# +# Character ranges are specified as for other property files in the +# Unicode Character Database. # # For legacy reasons, there are no spaces before or after the semicolon # which separates the two fields. The comments following the number sign @@ -330,6 +329,9 @@ 0859..085B;N # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK 085E;N # Po MANDAIC PUNCTUATION 08A0..08B4;N # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD;N # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08D4..08E1;N # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA +08E2;N # Cf ARABIC DISPUTED END OF AYAH 08E3..08FF;N # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA 0900..0902;N # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA 0903;N # Mc DEVANAGARI SIGN VISARGA @@ -491,6 +493,7 @@ 0C66..0C6F;N # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE 0C78..0C7E;N # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR 0C7F;N # So TELUGU SIGN TUUMU +0C80;N # Lo KANNADA SIGN SPACING CANDRABINDU 0C81;N # Mn KANNADA SIGN CANDRABINDU 0C82..0C83;N # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA 0C85..0C8C;N # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L @@ -525,11 +528,14 @@ 0D4A..0D4C;N # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU 0D4D;N # Mn MALAYALAM SIGN VIRAMA 0D4E;N # Lo MALAYALAM LETTER DOT REPH +0D4F;N # So MALAYALAM SIGN PARA +0D54..0D56;N # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL 0D57;N # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E;N # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH 0D5F..0D61;N # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL 0D62..0D63;N # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 0D66..0D6F;N # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D75;N # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS +0D70..0D78;N # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS 0D79;N # So MALAYALAM DATE MARK 0D7A..0D7F;N # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K 0D82..0D83;N # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA @@ -732,7 +738,9 @@ 1820..1842;N # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI 1843;N # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN 1844..1877;N # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8;N # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +1880..1884;N # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886;N # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8;N # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA 18A9;N # Mn MONGOLIAN LETTER ALI GALI DAGALGA 18AA;N # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA 18B0..18F5;N # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S @@ -832,6 +840,7 @@ 1C5A..1C77;N # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH 1C78..1C7D;N # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD 1C7E..1C7F;N # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80..1C88;N # Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK 1CC0..1CC7;N # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA 1CD0..1CD2;N # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA 1CD3;N # Po VEDIC SIGN NIHSHVASA @@ -853,7 +862,7 @@ 1D80..1D9A;N # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK 1D9B..1DBF;N # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA 1DC0..1DF5;N # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE -1DFC..1DFF;N # Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1DFB..1DFF;N # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 1E00..1EFF;N # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP 1F00..1F15;N # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA 1F18..1F1D;N # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA @@ -1092,7 +1101,9 @@ 230B;N # Pe RIGHT FLOOR 230C..2311;N # So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE 2312;A # So ARC -2313..231F;N # So [13] SEGMENT..BOTTOM RIGHT CORNER +2313..2319;N # So [7] SEGMENT..TURNED NOT SIGN +231A..231B;W # So [2] WATCH..HOURGLASS +231C..231F;N # So [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER 2320..2321;N # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL 2322..2328;N # So [7] FROWN..KEYBOARD 2329;W # Ps LEFT-POINTING ANGLE BRACKET @@ -1103,7 +1114,13 @@ 239B..23B3;N # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM 23B4..23DB;N # So [40] TOP SQUARE BRACKET..FUSE 23DC..23E1;N # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23FA;N # So [25] WHITE TRAPEZIUM..BLACK CIRCLE FOR RECORD +23E2..23E8;N # So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL +23E9..23EC;W # So [4] BLACK RIGHT-POINTING DOUBLE TRIANGLE..BLACK DOWN-POINTING DOUBLE TRIANGLE +23ED..23EF;N # So [3] BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +23F0;W # So ALARM CLOCK +23F1..23F2;N # So [2] STOPWATCH..TIMER CLOCK +23F3;W # So HOURGLASS WITH FLOWING SAND +23F4..23FE;N # So [11] BLACK MEDIUM LEFT-POINTING TRIANGLE..POWER SLEEP SYMBOL 2400..2426;N # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A;N # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 2460..249B;A # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP @@ -1142,7 +1159,9 @@ 25E6..25EE;N # So [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK 25EF;A # So LARGE CIRCLE 25F0..25F7;N # So [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8..25FF;N # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +25F8..25FC;N # Sm [5] UPPER LEFT TRIANGLE..BLACK MEDIUM SQUARE +25FD..25FE;W # Sm [2] WHITE MEDIUM SMALL SQUARE..BLACK MEDIUM SMALL SQUARE +25FF;N # Sm LOWER RIGHT TRIANGLE 2600..2604;N # So [5] BLACK SUN WITH RAYS..COMET 2605..2606;A # So [2] BLACK STAR..WHITE STAR 2607..2608;N # So [2] LIGHTNING..THUNDERSTORM @@ -1150,7 +1169,7 @@ 260A..260D;N # So [4] ASCENDING NODE..OPPOSITION 260E..260F;A # So [2] BLACK TELEPHONE..WHITE TELEPHONE 2610..2613;N # So [4] BALLOT BOX..SALTIRE -2614..2615;A # So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE +2614..2615;W # So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE 2616..261B;N # So [6] WHITE SHOGI PIECE..BLACK RIGHT POINTING INDEX 261C;A # So WHITE LEFT POINTING INDEX 261D;N # So WHITE UP POINTING INDEX @@ -1159,7 +1178,9 @@ 2640;A # So FEMALE SIGN 2641;N # So EARTH 2642;A # So MALE SIGN -2643..265F;N # So [29] JUPITER..BLACK CHESS PAWN +2643..2647;N # So [5] JUPITER..PLUTO +2648..2653;W # So [12] ARIES..PISCES +2654..265F;N # So [12] WHITE CHESS KING..BLACK CHESS PAWN 2660..2661;A # So [2] BLACK SPADE SUIT..WHITE HEART SUIT 2662;N # So WHITE DIAMOND SUIT 2663..2665;A # So [3] BLACK CLUB SUIT..BLACK HEART SUIT @@ -1169,22 +1190,56 @@ 266C..266D;A # So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN 266E;N # So MUSIC NATURAL SIGN 266F;A # Sm MUSIC SHARP SIGN -2670..269D;N # So [46] WEST SYRIAC CROSS..OUTLINED WHITE STAR +2670..267E;N # So [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN +267F;W # So WHEELCHAIR SYMBOL +2680..2692;N # So [19] DIE FACE-1..HAMMER AND PICK +2693;W # So ANCHOR +2694..269D;N # So [10] CROSSED SWORDS..OUTLINED WHITE STAR 269E..269F;A # So [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT -26A0..26BD;N # So [30] WARNING SIGN..SOCCER BALL -26BE..26BF;A # So [2] BASEBALL..SQUARED KEY +26A0;N # So WARNING SIGN +26A1;W # So HIGH VOLTAGE SIGN +26A2..26A9;N # So [8] DOUBLED FEMALE SIGN..HORIZONTAL MALE WITH STROKE SIGN +26AA..26AB;W # So [2] MEDIUM WHITE CIRCLE..MEDIUM BLACK CIRCLE +26AC..26BC;N # So [17] MEDIUM SMALL WHITE CIRCLE..SESQUIQUADRATE +26BD..26BE;W # So [2] SOCCER BALL..BASEBALL +26BF;A # So SQUARED KEY 26C0..26C3;N # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING -26C4..26CD;A # So [10] SNOWMAN WITHOUT SNOW..DISABLED CAR -26CE;N # So OPHIUCHUS -26CF..26E1;A # So [19] PICK..RESTRICTED LEFT ENTRY-2 +26C4..26C5;W # So [2] SNOWMAN WITHOUT SNOW..SUN BEHIND CLOUD +26C6..26CD;A # So [8] RAIN..DISABLED CAR +26CE;W # So OPHIUCHUS +26CF..26D3;A # So [5] PICK..CHAINS +26D4;W # So NO ENTRY +26D5..26E1;A # So [13] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..RESTRICTED LEFT ENTRY-2 26E2;N # So ASTRONOMICAL SYMBOL FOR URANUS 26E3;A # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE 26E4..26E7;N # So [4] PENTAGRAM..INVERTED PENTAGRAM -26E8..26FF;A # So [24] BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE -2700..273C;N # So [61] BLACK SAFETY SCISSORS..OPEN CENTRE TEARDROP-SPOKED ASTERISK +26E8..26E9;A # So [2] BLACK CROSS ON SHIELD..SHINTO SHRINE +26EA;W # So CHURCH +26EB..26F1;A # So [7] CASTLE..UMBRELLA ON GROUND +26F2..26F3;W # So [2] FOUNTAIN..FLAG IN HOLE +26F4;A # So FERRY +26F5;W # So SAILBOAT +26F6..26F9;A # So [4] SQUARE FOUR CORNERS..PERSON WITH BALL +26FA;W # So TENT +26FB..26FC;A # So [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL +26FD;W # So FUEL PUMP +26FE..26FF;A # So [2] CUP ON BLACK SQUARE..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +2700..2704;N # So [5] BLACK SAFETY SCISSORS..WHITE SCISSORS +2705;W # So WHITE HEAVY CHECK MARK +2706..2709;N # So [4] TELEPHONE LOCATION SIGN..ENVELOPE +270A..270B;W # So [2] RAISED FIST..RAISED HAND +270C..2727;N # So [28] VICTORY HAND..WHITE FOUR POINTED STAR +2728;W # So SPARKLES +2729..273C;N # So [20] STRESS OUTLINED WHITE STAR..OPEN CENTRE TEARDROP-SPOKED ASTERISK 273D;A # So HEAVY TEARDROP-SPOKED ASTERISK -273E..2756;N # So [25] SIX PETALLED BLACK AND WHITE FLORETTE..BLACK DIAMOND MINUS WHITE X -2757;A # So HEAVY EXCLAMATION MARK SYMBOL +273E..274B;N # So [14] SIX PETALLED BLACK AND WHITE FLORETTE..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274C;W # So CROSS MARK +274D;N # So SHADOWED WHITE CIRCLE +274E;W # So NEGATIVE SQUARED CROSS MARK +274F..2752;N # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2753..2755;W # So [3] BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT +2756;N # So BLACK DIAMOND MINUS WHITE X +2757;W # So HEAVY EXCLAMATION MARK SYMBOL 2758..2767;N # So [16] LIGHT VERTICAL BAR..ROTATED FLORAL HEART BULLET 2768;N # Ps MEDIUM LEFT PARENTHESIS ORNAMENT 2769;N # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT @@ -1202,7 +1257,12 @@ 2775;N # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT 2776..277F;A # No [10] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED NUMBER TEN 2780..2793;N # No [20] DINGBAT CIRCLED SANS-SERIF DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -2794..27BF;N # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +2794;N # So HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795..2797;W # So [3] HEAVY PLUS SIGN..HEAVY DIVISION SIGN +2798..27AF;N # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B0;W # So CURLY LOOP +27B1..27BE;N # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27BF;W # So DOUBLE CURLY LOOP 27C0..27C4;N # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET 27C5;N # Ps LEFT S-SHAPED BAG DELIMITER 27C6;N # Pe RIGHT S-SHAPED BAG DELIMITER @@ -1253,12 +1313,17 @@ 29FD;N # Pe RIGHT-POINTING CURVED ANGLE BRACKET 29FE..29FF;N # Sm [2] TINY..MINY 2A00..2AFF;N # Sm [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR -2B00..2B2F;N # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +2B00..2B1A;N # So [27] NORTH EAST WHITE ARROW..DOTTED SQUARE +2B1B..2B1C;W # So [2] BLACK LARGE SQUARE..WHITE LARGE SQUARE +2B1D..2B2F;N # So [19] BLACK VERY SMALL SQUARE..WHITE VERTICAL ELLIPSE 2B30..2B44;N # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET 2B45..2B46;N # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW 2B47..2B4C;N # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B4D..2B54;N # So [8] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..WHITE RIGHT-POINTING PENTAGON -2B55..2B59;A # So [5] HEAVY LARGE CIRCLE..HEAVY CIRCLED SALTIRE +2B4D..2B4F;N # So [3] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW +2B50;W # So WHITE MEDIUM STAR +2B51..2B54;N # So [4] BLACK SMALL STAR..WHITE RIGHT-POINTING PENTAGON +2B55;W # So HEAVY LARGE CIRCLE +2B56..2B59;A # So [4] HEAVY OVAL WITH OVAL INSIDE..HEAVY CIRCLED SALTIRE 2B5A..2B73;N # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR 2B76..2B95;N # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW 2B98..2BB9;N # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX @@ -1332,6 +1397,7 @@ 2E40;N # Pd DOUBLE HYPHEN 2E41;N # Po REVERSED COMMA 2E42;N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E44;N # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK 2E80..2E99;W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3;W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5;W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE @@ -1450,7 +1516,7 @@ A788;N # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A789..A78A;N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN A78B..A78E;N # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F;N # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7AD;N # L& [30] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER L WITH BELT +A790..A7AE;N # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I A7B0..A7B7;N # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA A7F7;N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I A7F8..A7F9;N # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE @@ -1476,7 +1542,7 @@ A874..A877;N # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SH A880..A881;N # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA A882..A8B3;N # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA A8B4..A8C3;N # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8C4;N # Mn SAURASHTRA SIGN VIRAMA +A8C4..A8C5;N # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU A8CE..A8CF;N # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA A8D0..A8D9;N # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE A8E0..A8F1;N # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA @@ -1726,7 +1792,7 @@ FFFD;A # So REPLACEMENT CHARACTER 10175..10178;N # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN 10179..10189;N # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN 1018A..1018B;N # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN -1018C;N # So GREEK SINUSOID SIGN +1018C..1018E;N # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN 10190..1019B;N # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN 101A0;N # So GREEK SYMBOL TAU RHO 101D0..101FC;N # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND @@ -1753,6 +1819,8 @@ FFFD;A # So REPLACEMENT CHARACTER 10450..1047F;N # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW 10480..1049D;N # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO 104A0..104A9;N # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3;N # Lu [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB;N # Ll [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA 10500..10527;N # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE 10530..10563;N # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW 1056F;N # Po CAUCASIAN ALBANIAN CITATION MARK @@ -1880,6 +1948,7 @@ FFFD;A # So REPLACEMENT CHARACTER 11235;N # Mc KHOJKI SIGN VIRAMA 11236..11237;N # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 11238..1123D;N # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123E;N # Mn KHOJKI SIGN SUKUN 11280..11286;N # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288;N # Lo MULTANI LETTER GHA 1128A..1128D;N # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -1912,6 +1981,18 @@ FFFD;A # So REPLACEMENT CHARACTER 11362..11363;N # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL 11366..1136C;N # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX 11370..11374;N # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11400..11434;N # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437;N # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F;N # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441;N # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444;N # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445;N # Mc NEWA SIGN VISARGA +11446;N # Mn NEWA SIGN NUKTA +11447..1144A;N # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F;N # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459;N # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145B;N # Po NEWA PLACEHOLDER MARK +1145D;N # Po NEWA INSERTION SIGN 11480..114AF;N # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA 114B0..114B2;N # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II 114B3..114B8;N # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL @@ -1945,6 +2026,7 @@ FFFD;A # So REPLACEMENT CHARACTER 11641..11643;N # Po [3] MODI DANDA..MODI ABBREVIATION SIGN 11644;N # Lo MODI SIGN HUVA 11650..11659;N # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11660..1166C;N # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT 11680..116AA;N # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA 116AB;N # Mn TAKRI SIGN ANUSVARA 116AC;N # Mc TAKRI SIGN VISARGA @@ -1969,6 +2051,26 @@ FFFD;A # So REPLACEMENT CHARACTER 118EA..118F2;N # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY 118FF;N # Lo WARANG CITI OM 11AC0..11AF8;N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08;N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E;N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F;N # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36;N # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D;N # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E;N # Mc BHAIKSUKI SIGN VISARGA +11C3F;N # Mn BHAIKSUKI SIGN VIRAMA +11C40;N # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45;N # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59;N # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C;N # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C70..11C71;N # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F;N # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7;N # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9;N # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0;N # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1;N # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3;N # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4;N # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6;N # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 12000..12399;N # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E;N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12470..12474;N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON @@ -1998,6 +2100,9 @@ FFFD;A # So REPLACEMENT CHARACTER 16F51..16F7E;N # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 16F8F..16F92;N # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW 16F93..16F9F;N # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0;W # Lm TANGUT ITERATION MARK +17000..187EC;W # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +18800..18AF2;W # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 1B000..1B001;W # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE 1BC00..1BC6A;N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C;N # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -2079,9 +2184,18 @@ FFFD;A # So REPLACEMENT CHARACTER 1DA87..1DA8B;N # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS 1DA9B..1DA9F;N # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF;N # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006;N # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018;N # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021;N # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024;N # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A;N # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA 1E800..1E8C4;N # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON 1E8C7..1E8CF;N # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE 1E8D0..1E8D6;N # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900..1E943;N # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A;N # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E950..1E959;N # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F;N # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK 1EE00..1EE03;N # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F;N # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF 1EE21..1EE22;N # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM @@ -2116,11 +2230,14 @@ FFFD;A # So REPLACEMENT CHARACTER 1EEA5..1EEA9;N # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH 1EEAB..1EEBB;N # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1EEF0..1EEF1;N # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -1F000..1F02B;N # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK +1F000..1F003;N # So [4] MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND +1F004;W # So MAHJONG TILE RED DRAGON +1F005..1F02B;N # So [39] MAHJONG TILE GREEN DRAGON..MAHJONG TILE BACK 1F030..1F093;N # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 1F0A0..1F0AE;N # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES 1F0B1..1F0BF;N # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER -1F0C1..1F0CF;N # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +1F0C1..1F0CE;N # So [14] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD KING OF DIAMONDS +1F0CF;W # So PLAYING CARD BLACK JOKER 1F0D1..1F0F5;N # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 1F100..1F10A;A # No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA 1F10B..1F10C;N # No [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO @@ -2128,22 +2245,64 @@ FFFD;A # So REPLACEMENT CHARACTER 1F12E;N # So CIRCLED WZ 1F130..1F169;A # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F16A..1F16B;N # So [2] RAISED MC SIGN..RAISED MD SIGN -1F170..1F19A;A # So [43] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VS +1F170..1F18D;A # So [30] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED SA +1F18E;W # So NEGATIVE SQUARED AB +1F18F..1F190;A # So [2] NEGATIVE SQUARED WC..SQUARE DJ +1F191..1F19A;W # So [10] SQUARED CL..SQUARED VS +1F19B..1F1AC;A # So [18] SQUARED THREE D..SQUARED VOD 1F1E6..1F1FF;N # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z 1F200..1F202;W # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA -1F210..1F23A;W # So [43] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F210..1F23B;W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240..1F248;W # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F250..1F251;W # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT -1F300..1F3FA;N # So [251] CYCLONE..AMPHORA -1F3FB..1F3FF;N # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F579;N # So [378] RAT..JOYSTICK -1F57B..1F5A3;N # So [41] LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX -1F5A5..1F5FF;N # So [91] DESKTOP COMPUTER..MOYAI -1F600..1F64F;N # So [80] GRINNING FACE..PERSON WITH FOLDED HANDS +1F300..1F320;W # So [33] CYCLONE..SHOOTING STAR +1F321..1F32C;N # So [12] THERMOMETER..WIND BLOWING FACE +1F32D..1F335;W # So [9] HOT DOG..CACTUS +1F336;N # So HOT PEPPER +1F337..1F37C;W # So [70] TULIP..BABY BOTTLE +1F37D;N # So FORK AND KNIFE WITH PLATE +1F37E..1F393;W # So [22] BOTTLE WITH POPPING CORK..GRADUATION CAP +1F394..1F39F;N # So [12] HEART WITH TIP ON THE LEFT..ADMISSION TICKETS +1F3A0..1F3CA;W # So [43] CAROUSEL HORSE..SWIMMER +1F3CB..1F3CE;N # So [4] WEIGHT LIFTER..RACING CAR +1F3CF..1F3D3;W # So [5] CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL +1F3D4..1F3DF;N # So [12] SNOW CAPPED MOUNTAIN..STADIUM +1F3E0..1F3F0;W # So [17] HOUSE BUILDING..EUROPEAN CASTLE +1F3F1..1F3F3;N # So [3] WHITE PENNANT..WAVING WHITE FLAG +1F3F4;W # So WAVING BLACK FLAG +1F3F5..1F3F7;N # So [3] ROSETTE..LABEL +1F3F8..1F3FA;W # So [3] BADMINTON RACQUET AND SHUTTLECOCK..AMPHORA +1F3FB..1F3FF;W # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F43E;W # So [63] RAT..PAW PRINTS +1F43F;N # So CHIPMUNK +1F440;W # So EYES +1F441;N # So EYE +1F442..1F4FC;W # So [187] EAR..VIDEOCASSETTE +1F4FD..1F4FE;N # So [2] FILM PROJECTOR..PORTABLE STEREO +1F4FF..1F53D;W # So [63] PRAYER BEADS..DOWN-POINTING SMALL RED TRIANGLE +1F53E..1F54A;N # So [13] LOWER RIGHT SHADOWED WHITE CIRCLE..DOVE OF PEACE +1F54B..1F54E;W # So [4] KAABA..MENORAH WITH NINE BRANCHES +1F54F;N # So BOWL OF HYGIEIA +1F550..1F567;W # So [24] CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY +1F568..1F579;N # So [18] RIGHT SPEAKER..JOYSTICK +1F57A;W # So MAN DANCING +1F57B..1F594;N # So [26] LEFT HAND TELEPHONE RECEIVER..REVERSED VICTORY HAND +1F595..1F596;W # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597..1F5A3;N # So [13] WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX +1F5A4;W # So BLACK HEART +1F5A5..1F5FA;N # So [86] DESKTOP COMPUTER..WORLD MAP +1F5FB..1F5FF;W # So [5] MOUNT FUJI..MOYAI +1F600..1F64F;W # So [80] GRINNING FACE..PERSON WITH FOLDED HANDS 1F650..1F67F;N # So [48] NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD -1F680..1F6D0;N # So [81] ROCKET..PLACE OF WORSHIP -1F6E0..1F6EC;N # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING +1F680..1F6C5;W # So [70] ROCKET..LEFT LUGGAGE +1F6C6..1F6CB;N # So [6] TRIANGLE WITH ROUNDED CORNERS..COUCH AND LAMP +1F6CC;W # So SLEEPING ACCOMMODATION +1F6CD..1F6CF;N # So [3] SHOPPING BAGS..BED +1F6D0..1F6D2;W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY +1F6E0..1F6EA;N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE +1F6EB..1F6EC;W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING 1F6F0..1F6F3;N # So [4] SATELLITE..PASSENGER SHIP +1F6F4..1F6F6;W # So [3] SCOOTER..CANOE 1F700..1F773;N # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F780..1F7D4;N # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR 1F800..1F80B;N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -2151,9 +2310,14 @@ FFFD;A # So REPLACEMENT CHARACTER 1F850..1F859;N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW 1F860..1F887;N # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW 1F890..1F8AD;N # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910..1F918;N # So [9] ZIPPER-MOUTH FACE..SIGN OF THE HORNS -1F980..1F984;N # So [5] CRAB..UNICORN FACE -1F9C0;N # So CHEESE WEDGE +1F910..1F91E;W # So [15] ZIPPER-MOUTH FACE..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F920..1F927;W # So [8] FACE WITH COWBOY HAT..SNEEZING FACE +1F930;W # So PREGNANT WOMAN +1F933..1F93E;W # So [12] SELFIE..HANDBALL +1F940..1F94B;W # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM +1F950..1F95E;W # So [15] CROISSANT..PANCAKES +1F980..1F991;W # So [18] CRAB..SQUID +1F9C0;W # So CHEESE WEDGE 20000..2A6D6;W # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2A6D7..2A6FF;W # Cn [41] <reserved-2A6D7>..<reserved-2A6FF> 2A700..2B734;W # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 diff --git a/tools-for-build/Jamo.txt b/tools-for-build/Jamo.txt index 8f7c5937ae..13111e1001 100644 --- a/tools-for-build/Jamo.txt +++ b/tools-for-build/Jamo.txt @@ -1,14 +1,14 @@ -# Jamo-8.0.0.txt -# Date: 2015-01-20, 01:30:00 GMT [KW, LI] +# Jamo-9.0.0.txt +# Date: 2016-01-21, 22:00:00 GMT [KW, LI] +# © 2016 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # # This file defines the Jamo_Short_Name property. # -# See Section 3.12 of The Unicode Standard, Version 8.0 +# See Section 3.12 of The Unicode Standard, Version 9.0 # for more information. # # Each line contains two fields, separated by a semicolon. diff --git a/tools-for-build/LineBreak.txt b/tools-for-build/LineBreak.txt index b627f874d0..5f09ad728b 100644 --- a/tools-for-build/LineBreak.txt +++ b/tools-for-build/LineBreak.txt @@ -1,45 +1,45 @@ -# LineBreak-8.0.0.txt -# Date: 2015-02-13, 09:15:00 GMT [KW, LI] +# LineBreak-9.0.0.txt +# Date: 2016-05-26, 01:00:00 GMT [KW, LI] +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ # # Line_Break Property # # This file is a normative contributory data file in the # Unicode Character Database. -# It contains both normative and informative data. -# -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html # # The format is two fields separated by a semicolon. # Field 0: Unicode code point value or range of code point values # Field 1: Line_Break property, consisting of one of the following values: -# Normative: -# "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW", -# "NL", "WJ", "JL", "JV", "JT", "H2", "H3" -# Informative: -# "XX", "OP", "CL", "CP", "QU", "NS", "EX", "SY", -# "IS", "PR", "PO", "NU", "AL", "ID", "IN", "HY", -# "BB", "BA", "SA", "AI", "B2", "HL", "CJ", "RI" +# Non-tailorable: +# "BK", "CM", "CR", "GL", "LF", "NL", "SP", "WJ", "ZW", "ZWJ" +# Tailorable: +# "AI", "AL", "B2", "BA", "BB", "CB", "CJ", "CL", "CP", "EB", +# "EM", "EX", "H2", "H3", "HL", "HY", "ID", "IN", "IS", "JL", +# "JT", "JV", "NS", "NU", "OP", "PO", "PR", "QU", "RI", "SA", +# "SG", "SY", "XX" # - All code points, assigned and unassigned, that are not listed -# explicitly are given the value "XX". -# The unassigned code points that default to "ID" include ranges in the -# following blocks: -# CJK Unified Ideographs Extension A: U+3400..U+4DBF -# CJK Unified Ideographs: U+4E00..U+9FFF -# CJK Compatibility Ideographs: U+F900..U+FAFF -# CJK Unified Ideographs Extension B: U+20000..U+2A6DF -# CJK Unified Ideographs Extension C: U+2A700..U+2B73F -# CJK Unified Ideographs Extension D: U+2B740..U+2B81F -# CJK Unified Ideographs Extension E: U+2B820..U+2CEAF -# CJK Compatibility Ideographs Supplement: U+2F800..U+2FA1F -# and any other reserved code points on -# Planes 2 and 3: U+20000..U+2FFFD -# U+30000..U+3FFFD -# The unassigned code points that default to "PR" comprise a range in the -# following block: -# Currency Symbols: U+20A0..U+20CF -# - Character ranges are specified as for other property files in -# the Unicode Character Database. +# explicitly are given the value "XX". +# - The unassigned code points in the following blocks default to "ID": +# CJK Unified Ideographs Extension A: U+3400..U+4DBF +# CJK Unified Ideographs: U+4E00..U+9FFF +# CJK Compatibility Ideographs: U+F900..U+FAFF +# - All undesignated code points in Planes 2 and 3, whether inside or +# outside of allocated blocks, default to "ID": +# Plane 2: U+20000..U+2FFFD +# Plane 3: U+30000..U+3FFFD +# - All unassigned code points in the following Plane 1 range, whether +# inside or outside of allocated blocks, also default to "ID": +# Plane 1 range: U+1F000..U+1FFFD +# - The unassigned code points in the following block default to "PR": +# Currency Symbols: U+20A0..U+20CF +# +# Character ranges are specified as for other property files in the +# Unicode Character Database. # # For legacy reasons, there are no spaces before or after the semicolon # which separates the two fields. The comments following the number sign @@ -274,6 +274,9 @@ 0859..085B;CM # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK 085E;AL # Po MANDAIC PUNCTUATION 08A0..08B4;AL # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD;AL # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08D4..08E1;CM # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA +08E2;AL # Cf ARABIC DISPUTED END OF AYAH 08E3..08FF;CM # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA 0900..0902;CM # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA 0903;CM # Mc DEVANAGARI SIGN VISARGA @@ -436,6 +439,7 @@ 0C66..0C6F;NU # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE 0C78..0C7E;AL # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR 0C7F;AL # So TELUGU SIGN TUUMU +0C80;AL # Lo KANNADA SIGN SPACING CANDRABINDU 0C81;CM # Mn KANNADA SIGN CANDRABINDU 0C82..0C83;CM # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA 0C85..0C8C;AL # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L @@ -470,11 +474,14 @@ 0D4A..0D4C;CM # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU 0D4D;CM # Mn MALAYALAM SIGN VIRAMA 0D4E;AL # Lo MALAYALAM LETTER DOT REPH +0D4F;AL # So MALAYALAM SIGN PARA +0D54..0D56;AL # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL 0D57;CM # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E;AL # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH 0D5F..0D61;AL # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL 0D62..0D63;CM # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 0D66..0D6F;NU # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D75;AL # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS +0D70..0D78;AL # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS 0D79;PO # So MALAYALAM DATE MARK 0D7A..0D7F;AL # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K 0D82..0D83;CM # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA @@ -700,7 +707,9 @@ 1820..1842;AL # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI 1843;AL # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN 1844..1877;AL # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8;AL # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +1880..1884;AL # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886;CM # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8;AL # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA 18A9;CM # Mn MONGOLIAN LETTER ALI GALI DAGALGA 18AA;AL # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA 18B0..18F5;AL # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S @@ -802,6 +811,7 @@ 1C5A..1C77;AL # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH 1C78..1C7D;AL # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD 1C7E..1C7F;BA # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80..1C88;AL # Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK 1CC0..1CC7;AL # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA 1CD0..1CD2;CM # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA 1CD3;AL # Po VEDIC SIGN NIHSHVASA @@ -823,7 +833,7 @@ 1D80..1D9A;AL # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK 1D9B..1DBF;AL # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA 1DC0..1DF5;CM # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE -1DFC..1DFF;CM # Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1DFB..1DFF;CM # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 1E00..1EFF;AL # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP 1F00..1F15;AL # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA 1F18..1F1D;AL # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA @@ -855,7 +865,9 @@ 2007;GL # Zs FIGURE SPACE 2008..200A;BA # Zs [3] PUNCTUATION SPACE..HAIR SPACE 200B;ZW # Cf ZERO WIDTH SPACE -200C..200F;CM # Cf [4] ZERO WIDTH NON-JOINER..RIGHT-TO-LEFT MARK +200C;CM # Cf ZERO WIDTH NON-JOINER +200D;ZWJ # Cf ZERO WIDTH JOINER +200E..200F;CM # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK 2010;BA # Pd HYPHEN 2011;GL # Pd NON-BREAKING HYPHEN 2012..2013;BA # Pd [2] FIGURE DASH..EN DASH @@ -1091,7 +1103,7 @@ 23DC..23E1;AL # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET 23E2..23EF;AL # So [14] WHITE TRAPEZIUM..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR 23F0..23F3;ID # So [4] ALARM CLOCK..HOURGLASS WITH FLOWING SAND -23F4..23FA;AL # So [7] BLACK MEDIUM LEFT-POINTING TRIANGLE..BLACK CIRCLE FOR RECORD +23F4..23FE;AL # So [11] BLACK MEDIUM LEFT-POINTING TRIANGLE..POWER SLEEP SYMBOL 2400..2426;AL # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A;AL # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 2460..249B;AI # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP @@ -1143,7 +1155,9 @@ 2616..2617;AI # So [2] WHITE SHOGI PIECE..BLACK SHOGI PIECE 2618;ID # So SHAMROCK 2619;AL # So REVERSED ROTATED FLORAL HEART BULLET -261A..261F;ID # So [6] BLACK LEFT POINTING INDEX..WHITE DOWN POINTING INDEX +261A..261C;ID # So [3] BLACK LEFT POINTING INDEX..WHITE LEFT POINTING INDEX +261D;EB # So WHITE UP POINTING INDEX +261E..261F;ID # So [2] WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX 2620..2638;AL # So [25] SKULL AND CROSSBONES..WHEEL OF DHARMA 2639..263B;ID # So [3] WHITE FROWNING FACE..BLACK SMILING FACE 263C..263F;AL # So [4] WHITE SUN WITH RAYS..MERCURY @@ -1188,19 +1202,23 @@ 26EB..26F0;AI # So [6] CASTLE..MOUNTAIN 26F1..26F5;ID # So [5] UMBRELLA ON GROUND..SAILBOAT 26F6;AI # So SQUARE FOUR CORNERS -26F7..26FA;ID # So [4] SKIER..TENT +26F7..26F8;ID # So [2] SKIER..ICE SKATE +26F9;EB # So PERSON WITH BALL +26FA;ID # So TENT 26FB..26FC;AI # So [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL 26FD..26FF;ID # So [3] FUEL PUMP..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE 2700..2704;ID # So [5] BLACK SAFETY SCISSORS..WHITE SCISSORS 2705..2707;AL # So [3] WHITE HEAVY CHECK MARK..TAPE DRIVE -2708..270D;ID # So [6] AIRPLANE..WRITING HAND +2708..2709;ID # So [2] AIRPLANE..ENVELOPE +270A..270D;EB # So [4] RAISED FIST..WRITING HAND 270E..2756;AL # So [73] LOWER RIGHT PENCIL..BLACK DIAMOND MINUS WHITE X 2757;AI # So HEAVY EXCLAMATION MARK SYMBOL 2758..275A;AL # So [3] LIGHT VERTICAL BAR..HEAVY VERTICAL BAR 275B..2760;QU # So [6] HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT..HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT 2761;AL # So CURVED STEM PARAGRAPH SIGN ORNAMENT 2762..2763;EX # So [2] HEAVY EXCLAMATION MARK ORNAMENT..HEAVY HEART EXCLAMATION MARK ORNAMENT -2764..2767;AL # So [4] HEAVY BLACK HEART..ROTATED FLORAL HEART BULLET +2764;ID # So HEAVY BLACK HEART +2765..2767;AL # So [3] ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET 2768;OP # Ps MEDIUM LEFT PARENTHESIS ORNAMENT 2769;CL # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT 276A;OP # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT @@ -1355,6 +1373,7 @@ 2E40;BA # Pd DOUBLE HYPHEN 2E41;BA # Po REVERSED COMMA 2E42;OP # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E44;BA # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK 2E80..2E99;ID # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3;ID # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5;ID # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE @@ -1519,7 +1538,7 @@ A788;AL # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT A789..A78A;AL # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN A78B..A78E;AL # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F;AL # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7AD;AL # L& [30] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER L WITH BELT +A790..A7AE;AL # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I A7B0..A7B7;AL # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA A7F7;AL # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I A7F8..A7F9;AL # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE @@ -1546,7 +1565,7 @@ A876..A877;EX # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD A880..A881;CM # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA A882..A8B3;AL # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA A8B4..A8C3;CM # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8C4;CM # Mn SAURASHTRA SIGN VIRAMA +A8C4..A8C5;CM # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU A8CE..A8CF;BA # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA A8D0..A8D9;NU # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE A8E0..A8F1;CM # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA @@ -2574,16 +2593,16 @@ FF62;OP # Ps HALFWIDTH LEFT CORNER BRACKET FF63;CL # Pe HALFWIDTH RIGHT CORNER BRACKET FF64;CL # Po HALFWIDTH IDEOGRAPHIC COMMA FF65;NS # Po HALFWIDTH KATAKANA MIDDLE DOT -FF66;AL # Lo HALFWIDTH KATAKANA LETTER WO +FF66;ID # Lo HALFWIDTH KATAKANA LETTER WO FF67..FF6F;CJ # Lo [9] HALFWIDTH KATAKANA LETTER SMALL A..HALFWIDTH KATAKANA LETTER SMALL TU FF70;CJ # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D;AL # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF71..FF9D;ID # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N FF9E..FF9F;NS # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0..FFBE;AL # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7;AL # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF;AL # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7;AL # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC;AL # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +FFA0..FFBE;ID # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7;ID # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF;ID # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7;ID # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC;ID # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I FFE0;PO # Sc FULLWIDTH CENT SIGN FFE1;PR # Sc FULLWIDTH POUND SIGN FFE2;ID # Sm FULLWIDTH NOT SIGN @@ -2610,7 +2629,7 @@ FFFD;AI # So REPLACEMENT CHARACTER 10175..10178;AL # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN 10179..10189;AL # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN 1018A..1018B;AL # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN -1018C;AL # So GREEK SINUSOID SIGN +1018C..1018E;AL # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN 10190..1019B;AL # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN 101A0;AL # So GREEK SYMBOL TAU RHO 101D0..101FC;AL # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND @@ -2637,6 +2656,8 @@ FFFD;AI # So REPLACEMENT CHARACTER 10450..1047F;AL # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW 10480..1049D;AL # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO 104A0..104A9;NU # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3;AL # Lu [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB;AL # Ll [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA 10500..10527;AL # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE 10530..10563;AL # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW 1056F;AL # Po CAUCASIAN ALBANIAN CITATION MARK @@ -2774,6 +2795,7 @@ FFFD;AI # So REPLACEMENT CHARACTER 1123A;AL # Po KHOJKI WORD SEPARATOR 1123B..1123C;BA # Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK 1123D;AL # Po KHOJKI ABBREVIATION SIGN +1123E;CM # Mn KHOJKI SIGN SUKUN 11280..11286;AL # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288;AL # Lo MULTANI LETTER GHA 1128A..1128D;AL # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -2806,6 +2828,19 @@ FFFD;AI # So REPLACEMENT CHARACTER 11362..11363;CM # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL 11366..1136C;CM # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX 11370..11374;CM # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11400..11434;AL # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437;CM # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F;CM # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441;CM # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444;CM # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445;CM # Mc NEWA SIGN VISARGA +11446;CM # Mn NEWA SIGN NUKTA +11447..1144A;AL # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144E;BA # Po [4] NEWA DANDA..NEWA GAP FILLER +1144F;AL # Po NEWA ABBREVIATION SIGN +11450..11459;NU # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145B;BA # Po NEWA PLACEHOLDER MARK +1145D;AL # Po NEWA INSERTION SIGN 11480..114AF;AL # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA 114B0..114B2;CM # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II 114B3..114B8;CM # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL @@ -2844,6 +2879,7 @@ FFFD;AI # So REPLACEMENT CHARACTER 11643;AL # Po MODI ABBREVIATION SIGN 11644;AL # Lo MODI SIGN HUVA 11650..11659;NU # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11660..1166C;BB # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT 11680..116AA;AL # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA 116AB;CM # Mn TAKRI SIGN ANUSVARA 116AC;CM # Mc TAKRI SIGN VISARGA @@ -2868,6 +2904,27 @@ FFFD;AI # So REPLACEMENT CHARACTER 118EA..118F2;AL # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY 118FF;AL # Lo WARANG CITI OM 11AC0..11AF8;AL # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11C00..11C08;AL # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E;AL # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F;CM # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36;CM # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D;CM # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E;CM # Mc BHAIKSUKI SIGN VISARGA +11C3F;CM # Mn BHAIKSUKI SIGN VIRAMA +11C40;AL # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45;BA # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59;NU # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C;AL # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C70;BB # Po MARCHEN HEAD MARK +11C71;EX # Po MARCHEN MARK SHAD +11C72..11C8F;AL # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7;CM # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9;CM # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0;CM # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1;CM # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3;CM # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4;CM # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6;CM # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 12000..12399;AL # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E;AL # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12470..12474;BA # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON @@ -2914,6 +2971,9 @@ FFFD;AI # So REPLACEMENT CHARACTER 16F51..16F7E;CM # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 16F8F..16F92;CM # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW 16F93..16F9F;AL # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0;NS # Lm TANGUT ITERATION MARK +17000..187EC;ID # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +18800..18AF2;ID # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 1B000..1B001;ID # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE 1BC00..1BC6A;AL # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C;AL # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK @@ -2996,9 +3056,18 @@ FFFD;AI # So REPLACEMENT CHARACTER 1DA8B;AL # Po SIGNWRITING PARENTHESIS 1DA9B..1DA9F;CM # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 1DAA1..1DAAF;CM # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1E000..1E006;CM # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018;CM # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021;CM # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024;CM # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A;CM # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA 1E800..1E8C4;AL # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON 1E8C7..1E8CF;AL # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE 1E8D0..1E8D6;CM # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900..1E943;AL # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A;CM # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E950..1E959;NU # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F;OP # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK 1EE00..1EE03;AL # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F;AL # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF 1EE21..1EE22;AL # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM @@ -3034,37 +3103,75 @@ FFFD;AI # So REPLACEMENT CHARACTER 1EEAB..1EEBB;AL # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1EEF0..1EEF1;AL # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL 1F000..1F02B;ID # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK +1F02C..1F02F;ID # Cn [4] <reserved-1F02C>..<reserved-1F02F> 1F030..1F093;ID # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F094..1F09F;ID # Cn [12] <reserved-1F094>..<reserved-1F09F> 1F0A0..1F0AE;ID # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0AF..1F0B0;ID # Cn [2] <reserved-1F0AF>..<reserved-1F0B0> 1F0B1..1F0BF;ID # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C0;ID # Cn <reserved-1F0C0> 1F0C1..1F0CF;ID # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +1F0D0;ID # Cn <reserved-1F0D0> 1F0D1..1F0F5;ID # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F0F6..1F0FF;ID # Cn [10] <reserved-1F0F6>..<reserved-1F0FF> 1F100..1F10C;AI # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F10F;ID # Cn [3] <reserved-1F10D>..<reserved-1F10F> 1F110..1F12D;AI # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD 1F12E;AL # So CIRCLED WZ +1F12F;ID # Cn <reserved-1F12F> 1F130..1F169;AI # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F16A..1F16B;AL # So [2] RAISED MC SIGN..RAISED MD SIGN -1F170..1F19A;AI # So [43] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VS +1F16C..1F16F;ID # Cn [4] <reserved-1F16C>..<reserved-1F16F> +1F170..1F1AC;AI # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD +1F1AD..1F1E5;ID # Cn [57] <reserved-1F1AD>..<reserved-1F1E5> 1F1E6..1F1FF;RI # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z 1F200..1F202;ID # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA -1F210..1F23A;ID # So [43] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F203..1F20F;ID # Cn [13] <reserved-1F203>..<reserved-1F20F> +1F210..1F23B;ID # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F23C..1F23F;ID # Cn [4] <reserved-1F23C>..<reserved-1F23F> 1F240..1F248;ID # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F249..1F24F;ID # Cn [7] <reserved-1F249>..<reserved-1F24F> 1F250..1F251;ID # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT -1F300..1F39B;ID # So [156] CYCLONE..CONTROL KNOBS +1F252..1F2FF;ID # Cn [174] <reserved-1F252>..<reserved-1F2FF> +1F300..1F384;ID # So [133] CYCLONE..CHRISTMAS TREE +1F385;EB # So FATHER CHRISTMAS +1F386..1F39B;ID # So [22] FIREWORKS..CONTROL KNOBS 1F39C..1F39D;AL # So [2] BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES 1F39E..1F3B4;ID # So [23] FILM FRAMES..FLOWER PLAYING CARDS 1F3B5..1F3B6;AL # So [2] MUSICAL NOTE..MULTIPLE MUSICAL NOTES 1F3B7..1F3BB;ID # So [5] SAXOPHONE..VIOLIN 1F3BC;AL # So MUSICAL SCORE -1F3BD..1F3FA;ID # So [62] RUNNING SHIRT WITH SASH..AMPHORA -1F3FB..1F3FF;AL # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F49F;ID # So [160] RAT..HEART DECORATION +1F3BD..1F3C2;ID # So [6] RUNNING SHIRT WITH SASH..SNOWBOARDER +1F3C3..1F3C4;EB # So [2] RUNNER..SURFER +1F3C5..1F3C9;ID # So [5] SPORTS MEDAL..RUGBY FOOTBALL +1F3CA..1F3CB;EB # So [2] SWIMMER..WEIGHT LIFTER +1F3CC..1F3FA;ID # So [47] GOLFER..AMPHORA +1F3FB..1F3FF;EM # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F441;ID # So [66] RAT..EYE +1F442..1F443;EB # So [2] EAR..NOSE +1F444..1F445;ID # So [2] MOUTH..TONGUE +1F446..1F450;EB # So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN +1F451..1F465;ID # So [21] CROWN..BUSTS IN SILHOUETTE +1F466..1F469;EB # So [4] BOY..WOMAN +1F46A..1F46D;ID # So [4] FAMILY..TWO WOMEN HOLDING HANDS +1F46E;EB # So POLICE OFFICER +1F46F;ID # So WOMAN WITH BUNNY EARS +1F470..1F478;EB # So [9] BRIDE WITH VEIL..PRINCESS +1F479..1F47B;ID # So [3] JAPANESE OGRE..GHOST +1F47C;EB # So BABY ANGEL +1F47D..1F480;ID # So [4] EXTRATERRESTRIAL ALIEN..SKULL +1F481..1F483;EB # So [3] INFORMATION DESK PERSON..DANCER +1F484;ID # So LIPSTICK +1F485..1F487;EB # So [3] NAIL POLISH..HAIRCUT +1F488..1F49F;ID # So [24] BARBER POLE..HEART DECORATION 1F4A0;AL # So DIAMOND SHAPE WITH A DOT INSIDE 1F4A1;ID # So ELECTRIC LIGHT BULB 1F4A2;AL # So ANGER SYMBOL 1F4A3;ID # So BOMB 1F4A4;AL # So SLEEPING SYMBOL -1F4A5..1F4AE;ID # So [10] COLLISION SYMBOL..WHITE FLOWER +1F4A5..1F4A9;ID # So [5] COLLISION SYMBOL..PILE OF POO +1F4AA;EB # So FLEXED BICEPS +1F4AB..1F4AE;ID # So [4] DIZZY SYMBOL..WHITE FLOWER 1F4AF;AL # So HUNDRED POINTS SYMBOL 1F4B0;ID # So MONEY BAG 1F4B1..1F4B2;AL # So [2] CURRENCY EXCHANGE..HEAVY DOLLAR SIGN @@ -3074,31 +3181,74 @@ FFFD;AI # So REPLACEMENT CHARACTER 1F517..1F524;AL # So [14] LINK SYMBOL..INPUT SYMBOL FOR LATIN LETTERS 1F525..1F531;ID # So [13] FIRE..TRIDENT EMBLEM 1F532..1F549;AL # So [24] BLACK SQUARE BUTTON..OM SYMBOL -1F54A..1F579;ID # So [48] DOVE OF PEACE..JOYSTICK -1F57B..1F5A3;ID # So [41] LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX -1F5A5..1F5D3;ID # So [47] DESKTOP COMPUTER..SPIRAL CALENDAR PAD +1F54A..1F574;ID # So [43] DOVE OF PEACE..MAN IN BUSINESS SUIT LEVITATING +1F575;EB # So SLEUTH OR SPY +1F576..1F579;ID # So [4] DARK SUNGLASSES..JOYSTICK +1F57A;EB # So MAN DANCING +1F57B..1F58F;ID # So [21] LEFT HAND TELEPHONE RECEIVER..TURNED OK HAND SIGN +1F590;EB # So RAISED HAND WITH FINGERS SPLAYED +1F591..1F594;ID # So [4] REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND +1F595..1F596;EB # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597..1F5D3;ID # So [61] WHITE DOWN POINTING LEFT HAND INDEX..SPIRAL CALENDAR PAD 1F5D4..1F5DB;AL # So [8] DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL 1F5DC..1F5F3;ID # So [24] COMPRESSION..BALLOT BOX WITH BALLOT 1F5F4..1F5F9;AL # So [6] BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK 1F5FA..1F5FF;ID # So [6] WORLD MAP..MOYAI -1F600..1F64F;ID # So [80] GRINNING FACE..PERSON WITH FOLDED HANDS +1F600..1F644;ID # So [69] GRINNING FACE..FACE WITH ROLLING EYES +1F645..1F647;EB # So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY +1F648..1F64A;ID # So [3] SEE-NO-EVIL MONKEY..SPEAK-NO-EVIL MONKEY +1F64B..1F64F;EB # So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS 1F650..1F675;AL # So [38] NORTH WEST POINTING LEAF..SWASH AMPERSAND ORNAMENT 1F676..1F678;QU # So [3] SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT..SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT 1F679..1F67B;NS # So [3] HEAVY INTERROBANG ORNAMENT..HEAVY SANS-SERIF INTERROBANG ORNAMENT 1F67C..1F67F;AL # So [4] VERY HEAVY SOLIDUS..REVERSE CHECKER BOARD -1F680..1F6D0;ID # So [81] ROCKET..PLACE OF WORSHIP +1F680..1F6A2;ID # So [35] ROCKET..SHIP +1F6A3;EB # So ROWBOAT +1F6A4..1F6B3;ID # So [16] SPEEDBOAT..NO BICYCLES +1F6B4..1F6B6;EB # So [3] BICYCLIST..PEDESTRIAN +1F6B7..1F6BF;ID # So [9] NO PEDESTRIANS..SHOWER +1F6C0;EB # So BATH +1F6C1..1F6D2;ID # So [18] BATHTUB..SHOPPING TROLLEY +1F6D3..1F6DF;ID # Cn [13] <reserved-1F6D3>..<reserved-1F6DF> 1F6E0..1F6EC;ID # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING -1F6F0..1F6F3;ID # So [4] SATELLITE..PASSENGER SHIP +1F6ED..1F6EF;ID # Cn [3] <reserved-1F6ED>..<reserved-1F6EF> +1F6F0..1F6F6;ID # So [7] SATELLITE..CANOE +1F6F7..1F6FF;ID # Cn [9] <reserved-1F6F7>..<reserved-1F6FF> 1F700..1F773;AL # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE +1F774..1F77F;ID # Cn [12] <reserved-1F774>..<reserved-1F77F> 1F780..1F7D4;AL # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR +1F7D5..1F7FF;ID # Cn [43] <reserved-1F7D5>..<reserved-1F7FF> 1F800..1F80B;AL # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80C..1F80F;ID # Cn [4] <reserved-1F80C>..<reserved-1F80F> 1F810..1F847;AL # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F848..1F84F;ID # Cn [8] <reserved-1F848>..<reserved-1F84F> 1F850..1F859;AL # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F85A..1F85F;ID # Cn [6] <reserved-1F85A>..<reserved-1F85F> 1F860..1F887;AL # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F888..1F88F;ID # Cn [8] <reserved-1F888>..<reserved-1F88F> 1F890..1F8AD;AL # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910..1F918;ID # So [9] ZIPPER-MOUTH FACE..SIGN OF THE HORNS -1F980..1F984;ID # So [5] CRAB..UNICORN FACE +1F8AE..1F90F;ID # Cn [98] <reserved-1F8AE>..<reserved-1F90F> +1F910..1F917;ID # So [8] ZIPPER-MOUTH FACE..HUGGING FACE +1F918..1F91E;EB # So [7] SIGN OF THE HORNS..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F91F;ID # Cn <reserved-1F91F> +1F920..1F925;ID # So [6] FACE WITH COWBOY HAT..LYING FACE +1F926;EB # So FACE PALM +1F927;ID # So SNEEZING FACE +1F928..1F92F;ID # Cn [8] <reserved-1F928>..<reserved-1F92F> +1F930;EB # So PREGNANT WOMAN +1F931..1F932;ID # Cn [2] <reserved-1F931>..<reserved-1F932> +1F933..1F939;EB # So [7] SELFIE..JUGGLING +1F93A..1F93B;ID # So [2] FENCER..MODERN PENTATHLON +1F93C..1F93E;EB # So [3] WRESTLERS..HANDBALL +1F93F;ID # Cn <reserved-1F93F> +1F940..1F94B;ID # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM +1F94C..1F94F;ID # Cn [4] <reserved-1F94C>..<reserved-1F94F> +1F950..1F95E;ID # So [15] CROISSANT..PANCAKES +1F95F..1F97F;ID # Cn [33] <reserved-1F95F>..<reserved-1F97F> +1F980..1F991;ID # So [18] CRAB..SQUID +1F992..1F9BF;ID # Cn [46] <reserved-1F992>..<reserved-1F9BF> 1F9C0;ID # So CHEESE WEDGE +1F9C1..1FFFD;ID # Cn [1597] <reserved-1F9C1>..<reserved-1FFFD> 20000..2A6D6;ID # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2A6D7..2A6FF;ID # Cn [41] <reserved-2A6D7>..<reserved-2A6FF> 2A700..2B734;ID # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 diff --git a/tools-for-build/NormalizationCorrections.txt b/tools-for-build/NormalizationCorrections.txt index 04fc10d11c..836d29c100 100644 --- a/tools-for-build/NormalizationCorrections.txt +++ b/tools-for-build/NormalizationCorrections.txt @@ -1,12 +1,14 @@ -# NormalizationCorrections-8.0.0.txt -# Date: 2015-03-07, 01:30:00 GMT [KW, LI] +# NormalizationCorrections-9.0.0.txt +# Date: 2016-01-21, 22:00:00 GMT [KW, LI] +# © 2016 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ # # This file is a normative contributory data file in the # Unicode Character Database. # -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# # The normalization stability policy of the Unicode Consortium # ordinarily precludes any change to the decomposition # for any character, once established in a relevant version diff --git a/tools-for-build/PropList.txt b/tools-for-build/PropList.txt index 2eb2926e07..a8c0da7135 100644 --- a/tools-for-build/PropList.txt +++ b/tools-for-build/PropList.txt @@ -1,10 +1,11 @@ -# PropList-8.0.0.txt -# Date: 2015-05-16, 17:50:38 GMT [MD] +# PropList-9.0.0.txt +# Date: 2016-06-01, 10:34:30 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # ================================================ @@ -192,10 +193,14 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA 111DE..111DF ; Terminal_Punctuation # Po [2] SHARADA SECTION MARK-1..SHARADA SECTION MARK-2 11238..1123C ; Terminal_Punctuation # Po [5] KHOJKI DANDA..KHOJKI DOUBLE SECTION MARK 112A9 ; Terminal_Punctuation # Po MULTANI SECTION MARK +1144B..1144D ; Terminal_Punctuation # Po [3] NEWA DANDA..NEWA COMMA +1145B ; Terminal_Punctuation # Po NEWA PLACEHOLDER MARK 115C2..115C5 ; Terminal_Punctuation # Po [4] SIDDHAM DANDA..SIDDHAM SEPARATOR BAR 115C9..115D7 ; Terminal_Punctuation # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES 11641..11642 ; Terminal_Punctuation # Po [2] MODI DANDA..MODI DOUBLE DANDA 1173C..1173E ; Terminal_Punctuation # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR +11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD 12470..12474 ; Terminal_Punctuation # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON 16A6E..16A6F ; Terminal_Punctuation # Po [2] MRO DANDA..MRO DOUBLE DANDA 16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP @@ -204,7 +209,7 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA 1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON -# Total code points: 238 +# Total code points: 246 # ================================================ @@ -429,6 +434,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L 081B..0823 ; Other_Alphabetic # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A 0825..0827 ; Other_Alphabetic # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U 0829..082C ; Other_Alphabetic # Mn [4] SAMARITAN VOWEL SIGN LONG I..SAMARITAN VOWEL SIGN SUKUN +08D4..08DF ; Other_Alphabetic # Mn [12] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH WORD WAQFA 08E3..08E9 ; Other_Alphabetic # Mn [7] ARABIC TURNED DAMMA BELOW..ARABIC CURLY KASRATAN 08F0..0902 ; Other_Alphabetic # Mn [19] ARABIC OPEN FATHATAN..DEVANAGARI SIGN ANUSVARA 0903 ; Other_Alphabetic # Mc DEVANAGARI SIGN VISARGA @@ -556,6 +562,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L 17BE..17C5 ; Other_Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU 17C6 ; Other_Alphabetic # Mn KHMER SIGN NIKAHIT 17C7..17C8 ; Other_Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +1885..1886 ; Other_Alphabetic # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA 18A9 ; Other_Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA 1920..1922 ; Other_Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U 1923..1926 ; Other_Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU @@ -613,6 +620,7 @@ A825..A826 ; Other_Alphabetic # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NA A827 ; Other_Alphabetic # Mc SYLOTI NAGRI VOWEL SIGN OO A880..A881 ; Other_Alphabetic # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA A8B4..A8C3 ; Other_Alphabetic # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C5 ; Other_Alphabetic # Mn SAURASHTRA SIGN CANDRABINDU A926..A92A ; Other_Alphabetic # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O A947..A951 ; Other_Alphabetic # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R A952 ; Other_Alphabetic # Mc REJANG CONSONANT SIGN H @@ -671,6 +679,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 11232..11233 ; Other_Alphabetic # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU 11234 ; Other_Alphabetic # Mn KHOJKI SIGN ANUSVARA 11237 ; Other_Alphabetic # Mn KHOJKI SIGN SHADDA +1123E ; Other_Alphabetic # Mn KHOJKI SIGN SUKUN 112DF ; Other_Alphabetic # Mn KHUDAWADI SIGN ANUSVARA 112E0..112E2 ; Other_Alphabetic # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II 112E3..112E8 ; Other_Alphabetic # Mn [6] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN AU @@ -683,6 +692,11 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 1134B..1134C ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN OO..GRANTHA VOWEL SIGN AU 11357 ; Other_Alphabetic # Mc GRANTHA AU LENGTH MARK 11362..11363 ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11435..11437 ; Other_Alphabetic # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Other_Alphabetic # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Other_Alphabetic # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11443..11444 ; Other_Alphabetic # Mn [2] NEWA SIGN CANDRABINDU..NEWA SIGN ANUSVARA +11445 ; Other_Alphabetic # Mc NEWA SIGN VISARGA 114B0..114B2 ; Other_Alphabetic # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II 114B3..114B8 ; Other_Alphabetic # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL 114B9 ; Other_Alphabetic # Mc TIRHUTA VOWEL SIGN E @@ -712,14 +726,31 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 11722..11725 ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E 11727..1172A ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM +11C2F ; Other_Alphabetic # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Other_Alphabetic # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Other_Alphabetic # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Other_Alphabetic # Mc BHAIKSUKI SIGN VISARGA +11C92..11CA7 ; Other_Alphabetic # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Other_Alphabetic # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Other_Alphabetic # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Other_Alphabetic # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Other_Alphabetic # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Other_Alphabetic # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Other_Alphabetic # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 16B30..16B36 ; Other_Alphabetic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F51..16F7E ; Other_Alphabetic # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 1BC9E ; Other_Alphabetic # Mn DUPLOYAN DOUBLE MARK +1E000..1E006 ; Other_Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Other_Alphabetic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Other_Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Other_Alphabetic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Other_Alphabetic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E947 ; Other_Alphabetic # Mn ADLAM HAMZA 1F130..1F149 ; Other_Alphabetic # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z 1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 1116 +# Total code points: 1238 # ================================================ @@ -731,13 +762,15 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 4E00..9FD5 ; Ideographic # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5 F900..FA6D ; Ideographic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +17000..187EC ; Ideographic # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +18800..18AF2 ; Ideographic # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2A700..2B734 ; Ideographic # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 2B740..2B81D ; Ideographic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Ideographic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 81404 +# Total code points: 88284 # ================================================ @@ -906,12 +939,15 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON 1134D ; Diacritic # Mc GRANTHA SIGN VIRAMA 11366..1136C ; Diacritic # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX 11370..11374 ; Diacritic # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11442 ; Diacritic # Mn NEWA SIGN VIRAMA +11446 ; Diacritic # Mn NEWA SIGN NUKTA 114C2..114C3 ; Diacritic # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA 115BF..115C0 ; Diacritic # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA 1163F ; Diacritic # Mn MODI SIGN VIRAMA 116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA 116B7 ; Diacritic # Mn TAKRI SIGN NUKTA 1172B ; Diacritic # Mn AHOM SIGN KILLER +11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA 16AF0..16AF4 ; Diacritic # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW 16F93..16F9F ; Diacritic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 @@ -921,8 +957,10 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON 1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO 1E8D0..1E8D6 ; Diacritic # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK +1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA -# Total code points: 773 +# Total code points: 782 # ================================================ @@ -952,8 +990,10 @@ FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND 1135D ; Extender # Lo GRANTHA SIGN PLUTA 115C6..115C8 ; Extender # Po [3] SIDDHAM REPETITION MARK-1..SIDDHAM REPETITION MARK-3 16B42..16B43 ; Extender # Lm [2] PAHAWH HMONG SIGN VOS NRUA..PAHAWH HMONG SIGN IB YAM +16FE0 ; Extender # Lm TANGUT ITERATION MARK +1E944..1E946 ; Extender # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK -# Total code points: 38 +# Total code points: 42 # ================================================ @@ -1027,7 +1067,7 @@ FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] <noncharacter-FFFFE>..<noncha 0D57 ; Other_Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK 0DCF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA 0DDF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA -200C..200D ; Other_Grapheme_Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +200C ; Other_Grapheme_Extend # Cf ZERO WIDTH NON-JOINER 302E..302F ; Other_Grapheme_Extend # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK 1133E ; Other_Grapheme_Extend # Mc GRANTHA VOWEL SIGN AA @@ -1037,8 +1077,9 @@ FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND 115AF ; Other_Grapheme_Extend # Mc SIDDHAM VOWEL SIGN AA 1D165 ; Other_Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM 1D16E..1D172 ; Other_Grapheme_Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 +E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG -# Total code points: 30 +# Total code points: 125 # ================================================ @@ -1106,9 +1147,8 @@ E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] <reserved-E01F0>. 2329 ; Deprecated # Ps LEFT-POINTING ANGLE BRACKET 232A ; Deprecated # Pe RIGHT-POINTING ANGLE BRACKET E0001 ; Deprecated # Cf LANGUAGE TAG -E007F ; Deprecated # Cf CANCEL TAG -# Total code points: 16 +# Total code points: 15 # ================================================ @@ -1160,11 +1200,12 @@ AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET # ================================================ +1885..1886 ; Other_ID_Start # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA 2118 ; Other_ID_Start # Sm SCRIPT CAPITAL P 212E ; Other_ID_Start # So ESTIMATED SYMBOL 309B..309C ; Other_ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -# Total code points: 4 +# Total code points: 6 # ================================================ @@ -1177,72 +1218,74 @@ AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET # ================================================ -0021 ; STerm # Po EXCLAMATION MARK -002E ; STerm # Po FULL STOP -003F ; STerm # Po QUESTION MARK -0589 ; STerm # Po ARMENIAN FULL STOP -061F ; STerm # Po ARABIC QUESTION MARK -06D4 ; STerm # Po ARABIC FULL STOP -0700..0702 ; STerm # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP -07F9 ; STerm # Po NKO EXCLAMATION MARK -0964..0965 ; STerm # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA -104A..104B ; STerm # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION -1362 ; STerm # Po ETHIOPIC FULL STOP -1367..1368 ; STerm # Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR -166E ; STerm # Po CANADIAN SYLLABICS FULL STOP -1735..1736 ; STerm # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION -1803 ; STerm # Po MONGOLIAN FULL STOP -1809 ; STerm # Po MONGOLIAN MANCHU FULL STOP -1944..1945 ; STerm # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK -1AA8..1AAB ; STerm # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU -1B5A..1B5B ; STerm # Po [2] BALINESE PANTI..BALINESE PAMADA -1B5E..1B5F ; STerm # Po [2] BALINESE CARIK SIKI..BALINESE CARIK PAREREN -1C3B..1C3C ; STerm # Po [2] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION NYET THYOOM TA-ROL -1C7E..1C7F ; STerm # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD -203C..203D ; STerm # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG -2047..2049 ; STerm # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK -2E2E ; STerm # Po REVERSED QUESTION MARK -2E3C ; STerm # Po STENOGRAPHIC FULL STOP -3002 ; STerm # Po IDEOGRAPHIC FULL STOP -A4FF ; STerm # Po LISU PUNCTUATION FULL STOP -A60E..A60F ; STerm # Po [2] VAI FULL STOP..VAI QUESTION MARK -A6F3 ; STerm # Po BAMUM FULL STOP -A6F7 ; STerm # Po BAMUM QUESTION MARK -A876..A877 ; STerm # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD -A8CE..A8CF ; STerm # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA -A92F ; STerm # Po KAYAH LI SIGN SHYA -A9C8..A9C9 ; STerm # Po [2] JAVANESE PADA LINGSA..JAVANESE PADA LUNGSI -AA5D..AA5F ; STerm # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA -AAF0..AAF1 ; STerm # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM -ABEB ; STerm # Po MEETEI MAYEK CHEIKHEI -FE52 ; STerm # Po SMALL FULL STOP -FE56..FE57 ; STerm # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK -FF01 ; STerm # Po FULLWIDTH EXCLAMATION MARK -FF0E ; STerm # Po FULLWIDTH FULL STOP -FF1F ; STerm # Po FULLWIDTH QUESTION MARK -FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP -10A56..10A57 ; STerm # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA -11047..11048 ; STerm # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA -110BE..110C1 ; STerm # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA -11141..11143 ; STerm # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK -111C5..111C6 ; STerm # Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA -111CD ; STerm # Po SHARADA SUTRA MARK -111DE..111DF ; STerm # Po [2] SHARADA SECTION MARK-1..SHARADA SECTION MARK-2 -11238..11239 ; STerm # Po [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA -1123B..1123C ; STerm # Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK -112A9 ; STerm # Po MULTANI SECTION MARK -115C2..115C3 ; STerm # Po [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA -115C9..115D7 ; STerm # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES -11641..11642 ; STerm # Po [2] MODI DANDA..MODI DOUBLE DANDA -1173C..1173E ; STerm # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI -16A6E..16A6F ; STerm # Po [2] MRO DANDA..MRO DOUBLE DANDA -16AF5 ; STerm # Po BASSA VAH FULL STOP -16B37..16B38 ; STerm # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB -16B44 ; STerm # Po PAHAWH HMONG SIGN XAUS -1BC9F ; STerm # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP -1DA88 ; STerm # Po SIGNWRITING FULL STOP - -# Total code points: 120 +0021 ; Sentence_Terminal # Po EXCLAMATION MARK +002E ; Sentence_Terminal # Po FULL STOP +003F ; Sentence_Terminal # Po QUESTION MARK +0589 ; Sentence_Terminal # Po ARMENIAN FULL STOP +061F ; Sentence_Terminal # Po ARABIC QUESTION MARK +06D4 ; Sentence_Terminal # Po ARABIC FULL STOP +0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP +07F9 ; Sentence_Terminal # Po NKO EXCLAMATION MARK +0964..0965 ; Sentence_Terminal # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +104A..104B ; Sentence_Terminal # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +1362 ; Sentence_Terminal # Po ETHIOPIC FULL STOP +1367..1368 ; Sentence_Terminal # Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +166E ; Sentence_Terminal # Po CANADIAN SYLLABICS FULL STOP +1735..1736 ; Sentence_Terminal # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1803 ; Sentence_Terminal # Po MONGOLIAN FULL STOP +1809 ; Sentence_Terminal # Po MONGOLIAN MANCHU FULL STOP +1944..1945 ; Sentence_Terminal # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1AA8..1AAB ; Sentence_Terminal # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU +1B5A..1B5B ; Sentence_Terminal # Po [2] BALINESE PANTI..BALINESE PAMADA +1B5E..1B5F ; Sentence_Terminal # Po [2] BALINESE CARIK SIKI..BALINESE CARIK PAREREN +1C3B..1C3C ; Sentence_Terminal # Po [2] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION NYET THYOOM TA-ROL +1C7E..1C7F ; Sentence_Terminal # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +203C..203D ; Sentence_Terminal # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +2047..2049 ; Sentence_Terminal # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +2E2E ; Sentence_Terminal # Po REVERSED QUESTION MARK +2E3C ; Sentence_Terminal # Po STENOGRAPHIC FULL STOP +3002 ; Sentence_Terminal # Po IDEOGRAPHIC FULL STOP +A4FF ; Sentence_Terminal # Po LISU PUNCTUATION FULL STOP +A60E..A60F ; Sentence_Terminal # Po [2] VAI FULL STOP..VAI QUESTION MARK +A6F3 ; Sentence_Terminal # Po BAMUM FULL STOP +A6F7 ; Sentence_Terminal # Po BAMUM QUESTION MARK +A876..A877 ; Sentence_Terminal # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD +A8CE..A8CF ; Sentence_Terminal # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A92F ; Sentence_Terminal # Po KAYAH LI SIGN SHYA +A9C8..A9C9 ; Sentence_Terminal # Po [2] JAVANESE PADA LINGSA..JAVANESE PADA LUNGSI +AA5D..AA5F ; Sentence_Terminal # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA +AAF0..AAF1 ; Sentence_Terminal # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +ABEB ; Sentence_Terminal # Po MEETEI MAYEK CHEIKHEI +FE52 ; Sentence_Terminal # Po SMALL FULL STOP +FE56..FE57 ; Sentence_Terminal # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK +FF01 ; Sentence_Terminal # Po FULLWIDTH EXCLAMATION MARK +FF0E ; Sentence_Terminal # Po FULLWIDTH FULL STOP +FF1F ; Sentence_Terminal # Po FULLWIDTH QUESTION MARK +FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP +10A56..10A57 ; Sentence_Terminal # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA +11047..11048 ; Sentence_Terminal # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA +110BE..110C1 ; Sentence_Terminal # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +11141..11143 ; Sentence_Terminal # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK +111C5..111C6 ; Sentence_Terminal # Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA +111CD ; Sentence_Terminal # Po SHARADA SUTRA MARK +111DE..111DF ; Sentence_Terminal # Po [2] SHARADA SECTION MARK-1..SHARADA SECTION MARK-2 +11238..11239 ; Sentence_Terminal # Po [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA +1123B..1123C ; Sentence_Terminal # Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK +112A9 ; Sentence_Terminal # Po MULTANI SECTION MARK +1144B..1144C ; Sentence_Terminal # Po [2] NEWA DANDA..NEWA DOUBLE DANDA +115C2..115C3 ; Sentence_Terminal # Po [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA +115C9..115D7 ; Sentence_Terminal # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +11641..11642 ; Sentence_Terminal # Po [2] MODI DANDA..MODI DOUBLE DANDA +1173C..1173E ; Sentence_Terminal # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA +16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA +16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP +16B37..16B38 ; Sentence_Terminal # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB +16B44 ; Sentence_Terminal # Po PAHAWH HMONG SIGN XAUS +1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP + +# Total code points: 124 # ================================================ @@ -1359,8 +1402,8 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S 239B..23B3 ; Pattern_Syntax # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM 23B4..23DB ; Pattern_Syntax # So [40] TOP SQUARE BRACKET..FUSE 23DC..23E1 ; Pattern_Syntax # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23FA ; Pattern_Syntax # So [25] WHITE TRAPEZIUM..BLACK CIRCLE FOR RECORD -23FB..23FF ; Pattern_Syntax # Cn [5] <reserved-23FB>..<reserved-23FF> +23E2..23FE ; Pattern_Syntax # So [29] WHITE TRAPEZIUM..POWER SLEEP SYMBOL +23FF ; Pattern_Syntax # Cn <reserved-23FF> 2400..2426 ; Pattern_Syntax # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO 2427..243F ; Pattern_Syntax # Cn [25] <reserved-2427>..<reserved-243F> 2440..244A ; Pattern_Syntax # So [11] OCR HOOK..OCR DOUBLE BACKSLASH @@ -1490,7 +1533,8 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S 2E40 ; Pattern_Syntax # Pd DOUBLE HYPHEN 2E41 ; Pattern_Syntax # Po REVERSED COMMA 2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E7F ; Pattern_Syntax # Cn [61] <reserved-2E43>..<reserved-2E7F> +2E43..2E44 ; Pattern_Syntax # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK +2E45..2E7F ; Pattern_Syntax # Cn [59] <reserved-2E45>..<reserved-2E7F> 3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK 3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET 3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET @@ -1522,4 +1566,14 @@ FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT # Total code points: 2760 +# ================================================ + +0600..0605 ; Prepended_Concatenation_Mark # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +06DD ; Prepended_Concatenation_Mark # Cf ARABIC END OF AYAH +070F ; Prepended_Concatenation_Mark # Cf SYRIAC ABBREVIATION MARK +08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH +110BD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN + +# Total code points: 10 + # EOF diff --git a/tools-for-build/Scripts.txt b/tools-for-build/Scripts.txt index 7e42740407..687994b58e 100644 --- a/tools-for-build/Scripts.txt +++ b/tools-for-build/Scripts.txt @@ -1,10 +1,11 @@ -# Scripts-8.0.0.txt -# Date: 2015-03-11, 22:29:42 GMT [MD] +# Scripts-9.0.0.txt +# Date: 2016-06-01, 10:34:37 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # For more information, see: # UAX #24, Unicode Script Property: http://www.unicode.org/reports/tr24/ # Especially the sections: @@ -96,6 +97,7 @@ 061F ; Common # Po ARABIC QUESTION MARK 0640 ; Common # Lm ARABIC TATWEEL 06DD ; Common # Cf ARABIC END OF AYAH +08E2 ; Common # Cf ARABIC DISPUTED END OF AYAH 0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA 0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT 0FD5..0FD8 ; Common # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS @@ -223,7 +225,7 @@ 239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM 23B4..23DB ; Common # So [40] TOP SQUARE BRACKET..FUSE 23DC..23E1 ; Common # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23FA ; Common # So [25] WHITE TRAPEZIUM..BLACK CIRCLE FOR RECORD +23E2..23FE ; Common # So [29] WHITE TRAPEZIUM..POWER SLEEP SYMBOL 2400..2426 ; Common # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP @@ -348,6 +350,7 @@ 2E40 ; Common # Pd DOUBLE HYPHEN 2E41 ; Common # Po REVERSED COMMA 2E42 ; Common # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E44 ; Common # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK 2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID 3000 ; Common # Zs IDEOGRAPHIC SPACE 3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK @@ -572,19 +575,17 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR 1F100..1F10C ; Common # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO 1F110..1F12E ; Common # So [31] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ 1F130..1F16B ; Common # So [60] SQUARED LATIN CAPITAL LETTER A..RAISED MD SIGN -1F170..1F19A ; Common # So [43] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VS +1F170..1F1AC ; Common # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD 1F1E6..1F1FF ; Common # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z 1F201..1F202 ; Common # So [2] SQUARED KATAKANA KOKO..SQUARED KATAKANA SA -1F210..1F23A ; Common # So [43] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F210..1F23B ; Common # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240..1F248 ; Common # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F250..1F251 ; Common # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT 1F300..1F3FA ; Common # So [251] CYCLONE..AMPHORA 1F3FB..1F3FF ; Common # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F579 ; Common # So [378] RAT..JOYSTICK -1F57B..1F5A3 ; Common # So [41] LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX -1F5A5..1F6D0 ; Common # So [300] DESKTOP COMPUTER..PLACE OF WORSHIP +1F400..1F6D2 ; Common # So [723] RAT..SHOPPING TROLLEY 1F6E0..1F6EC ; Common # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING -1F6F0..1F6F3 ; Common # So [4] SATELLITE..PASSENGER SHIP +1F6F0..1F6F6 ; Common # So [7] SATELLITE..CANOE 1F700..1F773 ; Common # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F780..1F7D4 ; Common # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR 1F800..1F80B ; Common # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -592,13 +593,18 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR 1F850..1F859 ; Common # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW 1F860..1F887 ; Common # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW 1F890..1F8AD ; Common # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910..1F918 ; Common # So [9] ZIPPER-MOUTH FACE..SIGN OF THE HORNS -1F980..1F984 ; Common # So [5] CRAB..UNICORN FACE +1F910..1F91E ; Common # So [15] ZIPPER-MOUTH FACE..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F920..1F927 ; Common # So [8] FACE WITH COWBOY HAT..SNEEZING FACE +1F930 ; Common # So PREGNANT WOMAN +1F933..1F93E ; Common # So [12] SELFIE..HANDBALL +1F940..1F94B ; Common # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM +1F950..1F95E ; Common # So [15] CROISSANT..PANCAKES +1F980..1F991 ; Common # So [18] CRAB..SQUID 1F9C0 ; Common # So CHEESE WEDGE E0001 ; Common # Cf LANGUAGE TAG E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG -# Total code points: 7179 +# Total code points: 7279 # ================================================ @@ -641,7 +647,7 @@ A770 ; Latin # Lm MODIFIER LETTER US A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T A78B..A78E ; Latin # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; Latin # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7AD ; Latin # L& [30] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER L WITH BELT +A790..A7AE ; Latin # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I A7B0..A7B7 ; Latin # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA A7F7 ; Latin # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I A7F8..A7F9 ; Latin # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE @@ -654,7 +660,7 @@ FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE S FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -# Total code points: 1349 +# Total code points: 1350 # ================================================ @@ -708,13 +714,13 @@ AB65 ; Greek # L& GREEK LETTER SMALL CAPITAL OMEGA 10175..10178 ; Greek # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN 10179..10189 ; Greek # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN 1018A..1018B ; Greek # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN -1018C ; Greek # So GREEK SINUSOID SIGN +1018C..1018E ; Greek # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN 101A0 ; Greek # So GREEK SYMBOL TAU RHO 1D200..1D241 ; Greek # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D242..1D244 ; Greek # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME 1D245 ; Greek # So GREEK MUSICAL LEIMMA -# Total code points: 516 +# Total code points: 518 # ================================================ @@ -724,6 +730,7 @@ AB65 ; Greek # L& GREEK LETTER SMALL CAPITAL OMEGA 0487 ; Cyrillic # Mn COMBINING CYRILLIC POKRYTIE 0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN 048A..052F ; Cyrillic # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +1C80..1C88 ; Cyrillic # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK 1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL 1D78 ; Cyrillic # Lm MODIFIER LETTER CYRILLIC EN 2DE0..2DFF ; Cyrillic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS @@ -740,7 +747,7 @@ A69C..A69D ; Cyrillic # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER A69E..A69F ; Cyrillic # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E FE2E..FE2F ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF -# Total code points: 434 +# Total code points: 443 # ================================================ @@ -815,6 +822,8 @@ FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATU 06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V 0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE 08A0..08B4 ; Arabic # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; Arabic # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08D4..08E1 ; Arabic # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA 08E3..08FF ; Arabic # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM FBB2..FBC1 ; Arabic # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW @@ -862,7 +871,7 @@ FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA 1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -# Total code points: 1257 +# Total code points: 1279 # ================================================ @@ -1086,6 +1095,7 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM # ================================================ +0C80 ; Kannada # Lo KANNADA SIGN SPACING CANDRABINDU 0C81 ; Kannada # Mn KANNADA SIGN CANDRABINDU 0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA 0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L @@ -1109,7 +1119,7 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM 0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2 ; Kannada # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -# Total code points: 87 +# Total code points: 88 # ================================================ @@ -1125,15 +1135,18 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM 0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU 0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA 0D4E ; Malayalam # Lo MALAYALAM LETTER DOT REPH +0D4F ; Malayalam # So MALAYALAM SIGN PARA +0D54..0D56 ; Malayalam # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL 0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E ; Malayalam # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH 0D5F..0D61 ; Malayalam # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL 0D62..0D63 ; Malayalam # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D75 ; Malayalam # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS +0D70..0D78 ; Malayalam # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS 0D79 ; Malayalam # So MALAYALAM DATE MARK 0D7A..0D7F ; Malayalam # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K -# Total code points: 100 +# Total code points: 114 # ================================================ @@ -1436,11 +1449,14 @@ AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETT 1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI 1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN 1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; Mongolian # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +1880..1884 ; Mongolian # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; Mongolian # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; Mongolian # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA 18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA 18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +11660..1166C ; Mongolian # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT -# Total code points: 153 +# Total code points: 166 # ================================================ @@ -1543,7 +1559,7 @@ A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE 1CF4 ; Inherited # Mn VEDIC TONE CANDRA ABOVE 1CF8..1CF9 ; Inherited # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1DC0..1DF5 ; Inherited # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE -1DFC..1DFF ; Inherited # Mn [4] COMBINING DOUBLE INVERTED BREVE BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1DFB..1DFF ; Inherited # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH @@ -1562,7 +1578,7 @@ FE20..FE2D ; Inherited # Mn [14] COMBINING LIGATURE LEFT HALF..COMBINING CON 1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 563 +# Total code points: 564 # ================================================ @@ -1705,8 +1721,13 @@ E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-2 2C00..2C2E ; Glagolitic # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE 2C30..2C5E ; Glagolitic # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE +1E000..1E006 ; Glagolitic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Glagolitic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Glagolitic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Glagolitic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Glagolitic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA -# Total code points: 94 +# Total code points: 132 # ================================================ @@ -1872,11 +1893,11 @@ A62A..A62B ; Vai # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO A880..A881 ; Saurashtra # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA A882..A8B3 ; Saurashtra # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA A8B4..A8C3 ; Saurashtra # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8C4 ; Saurashtra # Mn SAURASHTRA SIGN VIRAMA +A8C4..A8C5 ; Saurashtra # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU A8CE..A8CF ; Saurashtra # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA A8D0..A8D9 ; Saurashtra # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE -# Total code points: 81 +# Total code points: 82 # ================================================ @@ -2314,8 +2335,9 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI 11235 ; Khojki # Mc KHOJKI SIGN VIRAMA 11236..11237 ; Khojki # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 11238..1123D ; Khojki # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123E ; Khojki # Mn KHOJKI SIGN SUKUN -# Total code points: 61 +# Total code points: 62 # ================================================ @@ -2536,4 +2558,75 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI # Total code points: 672 +# ================================================ + +1E900..1E943 ; Adlam # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; Adlam # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E950..1E959 ; Adlam # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; Adlam # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK + +# Total code points: 87 + +# ================================================ + +11C00..11C08 ; Bhaiksuki # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; Bhaiksuki # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; Bhaiksuki # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Bhaiksuki # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Bhaiksuki # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Bhaiksuki # Mc BHAIKSUKI SIGN VISARGA +11C3F ; Bhaiksuki # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; Bhaiksuki # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; Bhaiksuki # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; Bhaiksuki # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; Bhaiksuki # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK + +# Total code points: 97 + +# ================================================ + +11C70..11C71 ; Marchen # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; Marchen # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; Marchen # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Marchen # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Marchen # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Marchen # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Marchen # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Marchen # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Marchen # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + +# Total code points: 68 + +# ================================================ + +11400..11434 ; Newa # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; Newa # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Newa # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Newa # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; Newa # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; Newa # Mc NEWA SIGN VISARGA +11446 ; Newa # Mn NEWA SIGN NUKTA +11447..1144A ; Newa # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F ; Newa # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; Newa # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145B ; Newa # Po NEWA PLACEHOLDER MARK +1145D ; Newa # Po NEWA INSERTION SIGN + +# Total code points: 92 + +# ================================================ + +104B0..104D3 ; Osage # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; Osage # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA + +# Total code points: 72 + +# ================================================ + +16FE0 ; Tangut # Lm TANGUT ITERATION MARK +17000..187EC ; Tangut # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +18800..18AF2 ; Tangut # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 + +# Total code points: 6881 + # EOF diff --git a/tools-for-build/SpecialCasing.txt b/tools-for-build/SpecialCasing.txt index 8de6462f18..b23fa7f768 100644 --- a/tools-for-build/SpecialCasing.txt +++ b/tools-for-build/SpecialCasing.txt @@ -1,10 +1,11 @@ -# SpecialCasing-8.0.0.txt -# Date: 2014-12-16, 23:08:04 GMT [MD] +# SpecialCasing-9.0.0.txt +# Date: 2016-03-02, 18:55:13 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2014 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Special Casing # diff --git a/tools-for-build/UnicodeData.txt b/tools-for-build/UnicodeData.txt index aa0e914f84..a756976461 100644 --- a/tools-for-build/UnicodeData.txt +++ b/tools-for-build/UnicodeData.txt @@ -616,7 +616,7 @@ 0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; 0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 -026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;A7AE;;A7AE 026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD 026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; @@ -2093,6 +2093,29 @@ 08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; 08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; 08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08B6;ARABIC LETTER BEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; +08B7;ARABIC LETTER PEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; +08B8;ARABIC LETTER TEH WITH SMALL TEH ABOVE;Lo;0;AL;;;;;N;;;;; +08B9;ARABIC LETTER REH WITH SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; +08BA;ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; +08BB;ARABIC LETTER AFRICAN FEH;Lo;0;AL;;;;;N;;;;; +08BC;ARABIC LETTER AFRICAN QAF;Lo;0;AL;;;;;N;;;;; +08BD;ARABIC LETTER AFRICAN NOON;Lo;0;AL;;;;;N;;;;; +08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;; +08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;; +08D6;ARABIC SMALL HIGH AIN;Mn;230;NSM;;;;;N;;;;; +08D7;ARABIC SMALL HIGH QAF;Mn;230;NSM;;;;;N;;;;; +08D8;ARABIC SMALL HIGH NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; +08D9;ARABIC SMALL LOW NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; +08DA;ARABIC SMALL HIGH WORD ATH-THALATHA;Mn;230;NSM;;;;;N;;;;; +08DB;ARABIC SMALL HIGH WORD AS-SAJDA;Mn;230;NSM;;;;;N;;;;; +08DC;ARABIC SMALL HIGH WORD AN-NISF;Mn;230;NSM;;;;;N;;;;; +08DD;ARABIC SMALL HIGH WORD SAKTA;Mn;230;NSM;;;;;N;;;;; +08DE;ARABIC SMALL HIGH WORD QIF;Mn;230;NSM;;;;;N;;;;; +08DF;ARABIC SMALL HIGH WORD WAQFA;Mn;230;NSM;;;;;N;;;;; +08E0;ARABIC SMALL HIGH FOOTNOTE MARKER;Mn;230;NSM;;;;;N;;;;; +08E1;ARABIC SMALL HIGH SIGN SAFHA;Mn;230;NSM;;;;;N;;;;; +08E2;ARABIC DISPUTED END OF AYAH;Cf;0;AN;;;;;N;;;;; 08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; 08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; 08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; @@ -2765,6 +2788,7 @@ 0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; 0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; 0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; +0C80;KANNADA SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; 0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2923,7 +2947,18 @@ 0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; 0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; +0D4F;MALAYALAM SIGN PARA;So;0;L;;;;;N;;;;; +0D54;MALAYALAM LETTER CHILLU M;Lo;0;L;;;;;N;;;;; +0D55;MALAYALAM LETTER CHILLU Y;Lo;0;L;;;;;N;;;;; +0D56;MALAYALAM LETTER CHILLU LLL;Lo;0;L;;;;;N;;;;; 0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D58;MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;; +0D59;MALAYALAM FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;; +0D5A;MALAYALAM FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;; +0D5B;MALAYALAM FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;; +0D5C;MALAYALAM FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;; +0D5D;MALAYALAM FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;; +0D5E;MALAYALAM FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;; 0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; 0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; @@ -2945,6 +2980,9 @@ 0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; 0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; 0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D76;MALAYALAM FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0D77;MALAYALAM FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0D78;MALAYALAM FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; 0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; 0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; 0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; @@ -5458,8 +5496,8 @@ 1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; 1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; 1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; -1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; -1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Mn;0;NSM;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Mn;0;NSM;;;;;N;;;;; 1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; 1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; 1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; @@ -6319,6 +6357,15 @@ 1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; 1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; 1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; +1C80;CYRILLIC SMALL LETTER ROUNDED VE;Ll;0;L;;;;;N;;;0412;;0412 +1C81;CYRILLIC SMALL LETTER LONG-LEGGED DE;Ll;0;L;;;;;N;;;0414;;0414 +1C82;CYRILLIC SMALL LETTER NARROW O;Ll;0;L;;;;;N;;;041E;;041E +1C83;CYRILLIC SMALL LETTER WIDE ES;Ll;0;L;;;;;N;;;0421;;0421 +1C84;CYRILLIC SMALL LETTER TALL TE;Ll;0;L;;;;;N;;;0422;;0422 +1C85;CYRILLIC SMALL LETTER THREE-LEGGED TE;Ll;0;L;;;;;N;;;0422;;0422 +1C86;CYRILLIC SMALL LETTER TALL HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +1C87;CYRILLIC SMALL LETTER TALL YAT;Ll;0;L;;;;;N;;;0462;;0462 +1C88;CYRILLIC SMALL LETTER UNBLENDED UK;Ll;0;L;;;;;N;;;A64A;;A64A 1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; 1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; 1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; @@ -6614,6 +6661,7 @@ 1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;; 1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; 1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; 1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; @@ -8083,6 +8131,10 @@ 23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; 23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; 23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; +23FB;POWER SYMBOL;So;0;ON;;;;;N;;;;; +23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;; +23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;; +23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;; 2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; 2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; 2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; @@ -10561,6 +10613,8 @@ 2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; 2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; 2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;; +2E44;DOUBLE SUSPENSION MARK;Po;0;ON;;;;;N;;;;; 2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; 2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; 2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; @@ -13889,6 +13943,7 @@ A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; +A7AE;LATIN CAPITAL LETTER SMALL CAPITAL I;Lu;0;L;;;;;N;;;;026A; A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; @@ -14085,6 +14140,7 @@ A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8C5;SAURASHTRA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; @@ -16834,6 +16890,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; 1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; 1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; +1018D;GREEK INDICTION SIGN;So;0;L;;;;;N;;;;; +1018E;NOMISMA SIGN;So;0;L;;;;;N;;;;; 10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; 10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; 10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; @@ -17354,6 +17412,78 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104B0;OSAGE CAPITAL LETTER A;Lu;0;L;;;;;N;;;;104D8; +104B1;OSAGE CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;104D9; +104B2;OSAGE CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;104DA; +104B3;OSAGE CAPITAL LETTER AH;Lu;0;L;;;;;N;;;;104DB; +104B4;OSAGE CAPITAL LETTER BRA;Lu;0;L;;;;;N;;;;104DC; +104B5;OSAGE CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;104DD; +104B6;OSAGE CAPITAL LETTER EHCHA;Lu;0;L;;;;;N;;;;104DE; +104B7;OSAGE CAPITAL LETTER E;Lu;0;L;;;;;N;;;;104DF; +104B8;OSAGE CAPITAL LETTER EIN;Lu;0;L;;;;;N;;;;104E0; +104B9;OSAGE CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;104E1; +104BA;OSAGE CAPITAL LETTER HYA;Lu;0;L;;;;;N;;;;104E2; +104BB;OSAGE CAPITAL LETTER I;Lu;0;L;;;;;N;;;;104E3; +104BC;OSAGE CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;104E4; +104BD;OSAGE CAPITAL LETTER EHKA;Lu;0;L;;;;;N;;;;104E5; +104BE;OSAGE CAPITAL LETTER KYA;Lu;0;L;;;;;N;;;;104E6; +104BF;OSAGE CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;104E7; +104C0;OSAGE CAPITAL LETTER MA;Lu;0;L;;;;;N;;;;104E8; +104C1;OSAGE CAPITAL LETTER NA;Lu;0;L;;;;;N;;;;104E9; +104C2;OSAGE CAPITAL LETTER O;Lu;0;L;;;;;N;;;;104EA; +104C3;OSAGE CAPITAL LETTER OIN;Lu;0;L;;;;;N;;;;104EB; +104C4;OSAGE CAPITAL LETTER PA;Lu;0;L;;;;;N;;;;104EC; +104C5;OSAGE CAPITAL LETTER EHPA;Lu;0;L;;;;;N;;;;104ED; +104C6;OSAGE CAPITAL LETTER SA;Lu;0;L;;;;;N;;;;104EE; +104C7;OSAGE CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;104EF; +104C8;OSAGE CAPITAL LETTER TA;Lu;0;L;;;;;N;;;;104F0; +104C9;OSAGE CAPITAL LETTER EHTA;Lu;0;L;;;;;N;;;;104F1; +104CA;OSAGE CAPITAL LETTER TSA;Lu;0;L;;;;;N;;;;104F2; +104CB;OSAGE CAPITAL LETTER EHTSA;Lu;0;L;;;;;N;;;;104F3; +104CC;OSAGE CAPITAL LETTER TSHA;Lu;0;L;;;;;N;;;;104F4; +104CD;OSAGE CAPITAL LETTER DHA;Lu;0;L;;;;;N;;;;104F5; +104CE;OSAGE CAPITAL LETTER U;Lu;0;L;;;;;N;;;;104F6; +104CF;OSAGE CAPITAL LETTER WA;Lu;0;L;;;;;N;;;;104F7; +104D0;OSAGE CAPITAL LETTER KHA;Lu;0;L;;;;;N;;;;104F8; +104D1;OSAGE CAPITAL LETTER GHA;Lu;0;L;;;;;N;;;;104F9; +104D2;OSAGE CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;104FA; +104D3;OSAGE CAPITAL LETTER ZHA;Lu;0;L;;;;;N;;;;104FB; +104D8;OSAGE SMALL LETTER A;Ll;0;L;;;;;N;;;104B0;;104B0 +104D9;OSAGE SMALL LETTER AI;Ll;0;L;;;;;N;;;104B1;;104B1 +104DA;OSAGE SMALL LETTER AIN;Ll;0;L;;;;;N;;;104B2;;104B2 +104DB;OSAGE SMALL LETTER AH;Ll;0;L;;;;;N;;;104B3;;104B3 +104DC;OSAGE SMALL LETTER BRA;Ll;0;L;;;;;N;;;104B4;;104B4 +104DD;OSAGE SMALL LETTER CHA;Ll;0;L;;;;;N;;;104B5;;104B5 +104DE;OSAGE SMALL LETTER EHCHA;Ll;0;L;;;;;N;;;104B6;;104B6 +104DF;OSAGE SMALL LETTER E;Ll;0;L;;;;;N;;;104B7;;104B7 +104E0;OSAGE SMALL LETTER EIN;Ll;0;L;;;;;N;;;104B8;;104B8 +104E1;OSAGE SMALL LETTER HA;Ll;0;L;;;;;N;;;104B9;;104B9 +104E2;OSAGE SMALL LETTER HYA;Ll;0;L;;;;;N;;;104BA;;104BA +104E3;OSAGE SMALL LETTER I;Ll;0;L;;;;;N;;;104BB;;104BB +104E4;OSAGE SMALL LETTER KA;Ll;0;L;;;;;N;;;104BC;;104BC +104E5;OSAGE SMALL LETTER EHKA;Ll;0;L;;;;;N;;;104BD;;104BD +104E6;OSAGE SMALL LETTER KYA;Ll;0;L;;;;;N;;;104BE;;104BE +104E7;OSAGE SMALL LETTER LA;Ll;0;L;;;;;N;;;104BF;;104BF +104E8;OSAGE SMALL LETTER MA;Ll;0;L;;;;;N;;;104C0;;104C0 +104E9;OSAGE SMALL LETTER NA;Ll;0;L;;;;;N;;;104C1;;104C1 +104EA;OSAGE SMALL LETTER O;Ll;0;L;;;;;N;;;104C2;;104C2 +104EB;OSAGE SMALL LETTER OIN;Ll;0;L;;;;;N;;;104C3;;104C3 +104EC;OSAGE SMALL LETTER PA;Ll;0;L;;;;;N;;;104C4;;104C4 +104ED;OSAGE SMALL LETTER EHPA;Ll;0;L;;;;;N;;;104C5;;104C5 +104EE;OSAGE SMALL LETTER SA;Ll;0;L;;;;;N;;;104C6;;104C6 +104EF;OSAGE SMALL LETTER SHA;Ll;0;L;;;;;N;;;104C7;;104C7 +104F0;OSAGE SMALL LETTER TA;Ll;0;L;;;;;N;;;104C8;;104C8 +104F1;OSAGE SMALL LETTER EHTA;Ll;0;L;;;;;N;;;104C9;;104C9 +104F2;OSAGE SMALL LETTER TSA;Ll;0;L;;;;;N;;;104CA;;104CA +104F3;OSAGE SMALL LETTER EHTSA;Ll;0;L;;;;;N;;;104CB;;104CB +104F4;OSAGE SMALL LETTER TSHA;Ll;0;L;;;;;N;;;104CC;;104CC +104F5;OSAGE SMALL LETTER DHA;Ll;0;L;;;;;N;;;104CD;;104CD +104F6;OSAGE SMALL LETTER U;Ll;0;L;;;;;N;;;104CE;;104CE +104F7;OSAGE SMALL LETTER WA;Ll;0;L;;;;;N;;;104CF;;104CF +104F8;OSAGE SMALL LETTER KHA;Ll;0;L;;;;;N;;;104D0;;104D0 +104F9;OSAGE SMALL LETTER GHA;Ll;0;L;;;;;N;;;104D1;;104D1 +104FA;OSAGE SMALL LETTER ZA;Ll;0;L;;;;;N;;;104D2;;104D2 +104FB;OSAGE SMALL LETTER ZHA;Ll;0;L;;;;;N;;;104D3;;104D3 10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; 10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; 10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; @@ -19180,6 +19310,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; 1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; 1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +1123E;KHOJKI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; 11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; 11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; 11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; @@ -19372,6 +19503,98 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; 11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; 11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; +11400;NEWA LETTER A;Lo;0;L;;;;;N;;;;; +11401;NEWA LETTER AA;Lo;0;L;;;;;N;;;;; +11402;NEWA LETTER I;Lo;0;L;;;;;N;;;;; +11403;NEWA LETTER II;Lo;0;L;;;;;N;;;;; +11404;NEWA LETTER U;Lo;0;L;;;;;N;;;;; +11405;NEWA LETTER UU;Lo;0;L;;;;;N;;;;; +11406;NEWA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11407;NEWA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11408;NEWA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11409;NEWA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1140A;NEWA LETTER E;Lo;0;L;;;;;N;;;;; +1140B;NEWA LETTER AI;Lo;0;L;;;;;N;;;;; +1140C;NEWA LETTER O;Lo;0;L;;;;;N;;;;; +1140D;NEWA LETTER AU;Lo;0;L;;;;;N;;;;; +1140E;NEWA LETTER KA;Lo;0;L;;;;;N;;;;; +1140F;NEWA LETTER KHA;Lo;0;L;;;;;N;;;;; +11410;NEWA LETTER GA;Lo;0;L;;;;;N;;;;; +11411;NEWA LETTER GHA;Lo;0;L;;;;;N;;;;; +11412;NEWA LETTER NGA;Lo;0;L;;;;;N;;;;; +11413;NEWA LETTER NGHA;Lo;0;L;;;;;N;;;;; +11414;NEWA LETTER CA;Lo;0;L;;;;;N;;;;; +11415;NEWA LETTER CHA;Lo;0;L;;;;;N;;;;; +11416;NEWA LETTER JA;Lo;0;L;;;;;N;;;;; +11417;NEWA LETTER JHA;Lo;0;L;;;;;N;;;;; +11418;NEWA LETTER NYA;Lo;0;L;;;;;N;;;;; +11419;NEWA LETTER NYHA;Lo;0;L;;;;;N;;;;; +1141A;NEWA LETTER TTA;Lo;0;L;;;;;N;;;;; +1141B;NEWA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1141C;NEWA LETTER DDA;Lo;0;L;;;;;N;;;;; +1141D;NEWA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1141E;NEWA LETTER NNA;Lo;0;L;;;;;N;;;;; +1141F;NEWA LETTER TA;Lo;0;L;;;;;N;;;;; +11420;NEWA LETTER THA;Lo;0;L;;;;;N;;;;; +11421;NEWA LETTER DA;Lo;0;L;;;;;N;;;;; +11422;NEWA LETTER DHA;Lo;0;L;;;;;N;;;;; +11423;NEWA LETTER NA;Lo;0;L;;;;;N;;;;; +11424;NEWA LETTER NHA;Lo;0;L;;;;;N;;;;; +11425;NEWA LETTER PA;Lo;0;L;;;;;N;;;;; +11426;NEWA LETTER PHA;Lo;0;L;;;;;N;;;;; +11427;NEWA LETTER BA;Lo;0;L;;;;;N;;;;; +11428;NEWA LETTER BHA;Lo;0;L;;;;;N;;;;; +11429;NEWA LETTER MA;Lo;0;L;;;;;N;;;;; +1142A;NEWA LETTER MHA;Lo;0;L;;;;;N;;;;; +1142B;NEWA LETTER YA;Lo;0;L;;;;;N;;;;; +1142C;NEWA LETTER RA;Lo;0;L;;;;;N;;;;; +1142D;NEWA LETTER RHA;Lo;0;L;;;;;N;;;;; +1142E;NEWA LETTER LA;Lo;0;L;;;;;N;;;;; +1142F;NEWA LETTER LHA;Lo;0;L;;;;;N;;;;; +11430;NEWA LETTER WA;Lo;0;L;;;;;N;;;;; +11431;NEWA LETTER SHA;Lo;0;L;;;;;N;;;;; +11432;NEWA LETTER SSA;Lo;0;L;;;;;N;;;;; +11433;NEWA LETTER SA;Lo;0;L;;;;;N;;;;; +11434;NEWA LETTER HA;Lo;0;L;;;;;N;;;;; +11435;NEWA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11436;NEWA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11437;NEWA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11438;NEWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11439;NEWA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1143A;NEWA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1143B;NEWA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +1143C;NEWA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1143D;NEWA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +1143E;NEWA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1143F;NEWA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11440;NEWA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11441;NEWA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11442;NEWA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11443;NEWA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11444;NEWA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11445;NEWA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11446;NEWA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11447;NEWA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +11448;NEWA SIGN FINAL ANUSVARA;Lo;0;L;;;;;N;;;;; +11449;NEWA OM;Lo;0;L;;;;;N;;;;; +1144A;NEWA SIDDHI;Lo;0;L;;;;;N;;;;; +1144B;NEWA DANDA;Po;0;L;;;;;N;;;;; +1144C;NEWA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1144D;NEWA COMMA;Po;0;L;;;;;N;;;;; +1144E;NEWA GAP FILLER;Po;0;L;;;;;N;;;;; +1144F;NEWA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11450;NEWA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11451;NEWA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11452;NEWA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11453;NEWA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11454;NEWA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11455;NEWA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11456;NEWA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11457;NEWA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11458;NEWA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11459;NEWA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;; +1145D;NEWA INSERTION SIGN;Po;0;L;;;;;N;;;;; 11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; 11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; 11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; @@ -19625,6 +19848,19 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11660;MONGOLIAN BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11661;MONGOLIAN ROTATED BIRGA;Po;0;ON;;;;;N;;;;; +11662;MONGOLIAN DOUBLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11663;MONGOLIAN TRIPLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11664;MONGOLIAN BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11665;MONGOLIAN ROTATED BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11666;MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11667;MONGOLIAN INVERTED BIRGA;Po;0;ON;;;;;N;;;;; +11668;MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11669;MONGOLIAN SWIRL BIRGA;Po;0;ON;;;;;N;;;;; +1166A;MONGOLIAN SWIRL BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +1166B;MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +1166C;MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; 11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; 11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; 11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; @@ -19889,6 +20125,171 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; 11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; 11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11C00;BHAIKSUKI LETTER A;Lo;0;L;;;;;N;;;;; +11C01;BHAIKSUKI LETTER AA;Lo;0;L;;;;;N;;;;; +11C02;BHAIKSUKI LETTER I;Lo;0;L;;;;;N;;;;; +11C03;BHAIKSUKI LETTER II;Lo;0;L;;;;;N;;;;; +11C04;BHAIKSUKI LETTER U;Lo;0;L;;;;;N;;;;; +11C05;BHAIKSUKI LETTER UU;Lo;0;L;;;;;N;;;;; +11C06;BHAIKSUKI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11C07;BHAIKSUKI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11C08;BHAIKSUKI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11C0A;BHAIKSUKI LETTER E;Lo;0;L;;;;;N;;;;; +11C0B;BHAIKSUKI LETTER AI;Lo;0;L;;;;;N;;;;; +11C0C;BHAIKSUKI LETTER O;Lo;0;L;;;;;N;;;;; +11C0D;BHAIKSUKI LETTER AU;Lo;0;L;;;;;N;;;;; +11C0E;BHAIKSUKI LETTER KA;Lo;0;L;;;;;N;;;;; +11C0F;BHAIKSUKI LETTER KHA;Lo;0;L;;;;;N;;;;; +11C10;BHAIKSUKI LETTER GA;Lo;0;L;;;;;N;;;;; +11C11;BHAIKSUKI LETTER GHA;Lo;0;L;;;;;N;;;;; +11C12;BHAIKSUKI LETTER NGA;Lo;0;L;;;;;N;;;;; +11C13;BHAIKSUKI LETTER CA;Lo;0;L;;;;;N;;;;; +11C14;BHAIKSUKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11C15;BHAIKSUKI LETTER JA;Lo;0;L;;;;;N;;;;; +11C16;BHAIKSUKI LETTER JHA;Lo;0;L;;;;;N;;;;; +11C17;BHAIKSUKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11C18;BHAIKSUKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11C19;BHAIKSUKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11C1A;BHAIKSUKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11C1B;BHAIKSUKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11C1C;BHAIKSUKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11C1D;BHAIKSUKI LETTER TA;Lo;0;L;;;;;N;;;;; +11C1E;BHAIKSUKI LETTER THA;Lo;0;L;;;;;N;;;;; +11C1F;BHAIKSUKI LETTER DA;Lo;0;L;;;;;N;;;;; +11C20;BHAIKSUKI LETTER DHA;Lo;0;L;;;;;N;;;;; +11C21;BHAIKSUKI LETTER NA;Lo;0;L;;;;;N;;;;; +11C22;BHAIKSUKI LETTER PA;Lo;0;L;;;;;N;;;;; +11C23;BHAIKSUKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11C24;BHAIKSUKI LETTER BA;Lo;0;L;;;;;N;;;;; +11C25;BHAIKSUKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11C26;BHAIKSUKI LETTER MA;Lo;0;L;;;;;N;;;;; +11C27;BHAIKSUKI LETTER YA;Lo;0;L;;;;;N;;;;; +11C28;BHAIKSUKI LETTER RA;Lo;0;L;;;;;N;;;;; +11C29;BHAIKSUKI LETTER LA;Lo;0;L;;;;;N;;;;; +11C2A;BHAIKSUKI LETTER VA;Lo;0;L;;;;;N;;;;; +11C2B;BHAIKSUKI LETTER SHA;Lo;0;L;;;;;N;;;;; +11C2C;BHAIKSUKI LETTER SSA;Lo;0;L;;;;;N;;;;; +11C2D;BHAIKSUKI LETTER SA;Lo;0;L;;;;;N;;;;; +11C2E;BHAIKSUKI LETTER HA;Lo;0;L;;;;;N;;;;; +11C2F;BHAIKSUKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11C30;BHAIKSUKI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11C31;BHAIKSUKI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11C32;BHAIKSUKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11C33;BHAIKSUKI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11C34;BHAIKSUKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11C35;BHAIKSUKI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11C36;BHAIKSUKI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11C38;BHAIKSUKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11C39;BHAIKSUKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11C3A;BHAIKSUKI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11C3B;BHAIKSUKI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11C3C;BHAIKSUKI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11C3D;BHAIKSUKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11C3E;BHAIKSUKI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11C3F;BHAIKSUKI SIGN VIRAMA;Mn;9;L;;;;;N;;;;; +11C40;BHAIKSUKI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +11C41;BHAIKSUKI DANDA;Po;0;L;;;;;N;;;;; +11C42;BHAIKSUKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11C43;BHAIKSUKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +11C44;BHAIKSUKI GAP FILLER-1;Po;0;L;;;;;N;;;;; +11C45;BHAIKSUKI GAP FILLER-2;Po;0;L;;;;;N;;;;; +11C50;BHAIKSUKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11C51;BHAIKSUKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11C52;BHAIKSUKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11C53;BHAIKSUKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11C54;BHAIKSUKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11C55;BHAIKSUKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11C56;BHAIKSUKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11C57;BHAIKSUKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11C58;BHAIKSUKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11C59;BHAIKSUKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11C5A;BHAIKSUKI NUMBER ONE;No;0;L;;;;1;N;;;;; +11C5B;BHAIKSUKI NUMBER TWO;No;0;L;;;;2;N;;;;; +11C5C;BHAIKSUKI NUMBER THREE;No;0;L;;;;3;N;;;;; +11C5D;BHAIKSUKI NUMBER FOUR;No;0;L;;;;4;N;;;;; +11C5E;BHAIKSUKI NUMBER FIVE;No;0;L;;;;5;N;;;;; +11C5F;BHAIKSUKI NUMBER SIX;No;0;L;;;;6;N;;;;; +11C60;BHAIKSUKI NUMBER SEVEN;No;0;L;;;;7;N;;;;; +11C61;BHAIKSUKI NUMBER EIGHT;No;0;L;;;;8;N;;;;; +11C62;BHAIKSUKI NUMBER NINE;No;0;L;;;;9;N;;;;; +11C63;BHAIKSUKI NUMBER TEN;No;0;L;;;;10;N;;;;; +11C64;BHAIKSUKI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +11C65;BHAIKSUKI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +11C66;BHAIKSUKI NUMBER FORTY;No;0;L;;;;40;N;;;;; +11C67;BHAIKSUKI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +11C68;BHAIKSUKI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +11C69;BHAIKSUKI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +11C6A;BHAIKSUKI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +11C6B;BHAIKSUKI NUMBER NINETY;No;0;L;;;;90;N;;;;; +11C6C;BHAIKSUKI HUNDREDS UNIT MARK;No;0;L;;;;100;N;;;;; +11C70;MARCHEN HEAD MARK;Po;0;L;;;;;N;;;;; +11C71;MARCHEN MARK SHAD;Po;0;L;;;;;N;;;;; +11C72;MARCHEN LETTER KA;Lo;0;L;;;;;N;;;;; +11C73;MARCHEN LETTER KHA;Lo;0;L;;;;;N;;;;; +11C74;MARCHEN LETTER GA;Lo;0;L;;;;;N;;;;; +11C75;MARCHEN LETTER NGA;Lo;0;L;;;;;N;;;;; +11C76;MARCHEN LETTER CA;Lo;0;L;;;;;N;;;;; +11C77;MARCHEN LETTER CHA;Lo;0;L;;;;;N;;;;; +11C78;MARCHEN LETTER JA;Lo;0;L;;;;;N;;;;; +11C79;MARCHEN LETTER NYA;Lo;0;L;;;;;N;;;;; +11C7A;MARCHEN LETTER TA;Lo;0;L;;;;;N;;;;; +11C7B;MARCHEN LETTER THA;Lo;0;L;;;;;N;;;;; +11C7C;MARCHEN LETTER DA;Lo;0;L;;;;;N;;;;; +11C7D;MARCHEN LETTER NA;Lo;0;L;;;;;N;;;;; +11C7E;MARCHEN LETTER PA;Lo;0;L;;;;;N;;;;; +11C7F;MARCHEN LETTER PHA;Lo;0;L;;;;;N;;;;; +11C80;MARCHEN LETTER BA;Lo;0;L;;;;;N;;;;; +11C81;MARCHEN LETTER MA;Lo;0;L;;;;;N;;;;; +11C82;MARCHEN LETTER TSA;Lo;0;L;;;;;N;;;;; +11C83;MARCHEN LETTER TSHA;Lo;0;L;;;;;N;;;;; +11C84;MARCHEN LETTER DZA;Lo;0;L;;;;;N;;;;; +11C85;MARCHEN LETTER WA;Lo;0;L;;;;;N;;;;; +11C86;MARCHEN LETTER ZHA;Lo;0;L;;;;;N;;;;; +11C87;MARCHEN LETTER ZA;Lo;0;L;;;;;N;;;;; +11C88;MARCHEN LETTER -A;Lo;0;L;;;;;N;;;;; +11C89;MARCHEN LETTER YA;Lo;0;L;;;;;N;;;;; +11C8A;MARCHEN LETTER RA;Lo;0;L;;;;;N;;;;; +11C8B;MARCHEN LETTER LA;Lo;0;L;;;;;N;;;;; +11C8C;MARCHEN LETTER SHA;Lo;0;L;;;;;N;;;;; +11C8D;MARCHEN LETTER SA;Lo;0;L;;;;;N;;;;; +11C8E;MARCHEN LETTER HA;Lo;0;L;;;;;N;;;;; +11C8F;MARCHEN LETTER A;Lo;0;L;;;;;N;;;;; +11C92;MARCHEN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +11C93;MARCHEN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +11C94;MARCHEN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +11C95;MARCHEN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +11C96;MARCHEN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +11C97;MARCHEN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +11C98;MARCHEN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +11C99;MARCHEN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +11C9A;MARCHEN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +11C9B;MARCHEN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +11C9C;MARCHEN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +11C9D;MARCHEN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +11C9E;MARCHEN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +11C9F;MARCHEN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +11CA0;MARCHEN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +11CA1;MARCHEN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +11CA2;MARCHEN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +11CA3;MARCHEN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +11CA4;MARCHEN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +11CA5;MARCHEN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +11CA6;MARCHEN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +11CA7;MARCHEN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +11CA9;MARCHEN SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +11CAA;MARCHEN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +11CAB;MARCHEN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +11CAC;MARCHEN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +11CAD;MARCHEN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +11CAE;MARCHEN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +11CAF;MARCHEN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +11CB0;MARCHEN VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11CB1;MARCHEN VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11CB2;MARCHEN VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11CB3;MARCHEN VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; 12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; 12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; @@ -23685,6 +24086,764 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; 16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; 16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; +16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;; +17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;; +187EC;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;; +18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;; +18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;; +18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;; +18803;TANGUT COMPONENT-004;Lo;0;L;;;;;N;;;;; +18804;TANGUT COMPONENT-005;Lo;0;L;;;;;N;;;;; +18805;TANGUT COMPONENT-006;Lo;0;L;;;;;N;;;;; +18806;TANGUT COMPONENT-007;Lo;0;L;;;;;N;;;;; +18807;TANGUT COMPONENT-008;Lo;0;L;;;;;N;;;;; +18808;TANGUT COMPONENT-009;Lo;0;L;;;;;N;;;;; +18809;TANGUT COMPONENT-010;Lo;0;L;;;;;N;;;;; +1880A;TANGUT COMPONENT-011;Lo;0;L;;;;;N;;;;; +1880B;TANGUT COMPONENT-012;Lo;0;L;;;;;N;;;;; +1880C;TANGUT COMPONENT-013;Lo;0;L;;;;;N;;;;; +1880D;TANGUT COMPONENT-014;Lo;0;L;;;;;N;;;;; +1880E;TANGUT COMPONENT-015;Lo;0;L;;;;;N;;;;; +1880F;TANGUT COMPONENT-016;Lo;0;L;;;;;N;;;;; +18810;TANGUT COMPONENT-017;Lo;0;L;;;;;N;;;;; +18811;TANGUT COMPONENT-018;Lo;0;L;;;;;N;;;;; +18812;TANGUT COMPONENT-019;Lo;0;L;;;;;N;;;;; +18813;TANGUT COMPONENT-020;Lo;0;L;;;;;N;;;;; +18814;TANGUT COMPONENT-021;Lo;0;L;;;;;N;;;;; +18815;TANGUT COMPONENT-022;Lo;0;L;;;;;N;;;;; +18816;TANGUT COMPONENT-023;Lo;0;L;;;;;N;;;;; +18817;TANGUT COMPONENT-024;Lo;0;L;;;;;N;;;;; +18818;TANGUT COMPONENT-025;Lo;0;L;;;;;N;;;;; +18819;TANGUT COMPONENT-026;Lo;0;L;;;;;N;;;;; +1881A;TANGUT COMPONENT-027;Lo;0;L;;;;;N;;;;; +1881B;TANGUT COMPONENT-028;Lo;0;L;;;;;N;;;;; +1881C;TANGUT COMPONENT-029;Lo;0;L;;;;;N;;;;; +1881D;TANGUT COMPONENT-030;Lo;0;L;;;;;N;;;;; +1881E;TANGUT COMPONENT-031;Lo;0;L;;;;;N;;;;; +1881F;TANGUT COMPONENT-032;Lo;0;L;;;;;N;;;;; +18820;TANGUT COMPONENT-033;Lo;0;L;;;;;N;;;;; +18821;TANGUT COMPONENT-034;Lo;0;L;;;;;N;;;;; +18822;TANGUT COMPONENT-035;Lo;0;L;;;;;N;;;;; +18823;TANGUT COMPONENT-036;Lo;0;L;;;;;N;;;;; +18824;TANGUT COMPONENT-037;Lo;0;L;;;;;N;;;;; +18825;TANGUT COMPONENT-038;Lo;0;L;;;;;N;;;;; +18826;TANGUT COMPONENT-039;Lo;0;L;;;;;N;;;;; +18827;TANGUT COMPONENT-040;Lo;0;L;;;;;N;;;;; +18828;TANGUT COMPONENT-041;Lo;0;L;;;;;N;;;;; +18829;TANGUT COMPONENT-042;Lo;0;L;;;;;N;;;;; +1882A;TANGUT COMPONENT-043;Lo;0;L;;;;;N;;;;; +1882B;TANGUT COMPONENT-044;Lo;0;L;;;;;N;;;;; +1882C;TANGUT COMPONENT-045;Lo;0;L;;;;;N;;;;; +1882D;TANGUT COMPONENT-046;Lo;0;L;;;;;N;;;;; +1882E;TANGUT COMPONENT-047;Lo;0;L;;;;;N;;;;; +1882F;TANGUT COMPONENT-048;Lo;0;L;;;;;N;;;;; +18830;TANGUT COMPONENT-049;Lo;0;L;;;;;N;;;;; +18831;TANGUT COMPONENT-050;Lo;0;L;;;;;N;;;;; +18832;TANGUT COMPONENT-051;Lo;0;L;;;;;N;;;;; +18833;TANGUT COMPONENT-052;Lo;0;L;;;;;N;;;;; +18834;TANGUT COMPONENT-053;Lo;0;L;;;;;N;;;;; +18835;TANGUT COMPONENT-054;Lo;0;L;;;;;N;;;;; +18836;TANGUT COMPONENT-055;Lo;0;L;;;;;N;;;;; +18837;TANGUT COMPONENT-056;Lo;0;L;;;;;N;;;;; +18838;TANGUT COMPONENT-057;Lo;0;L;;;;;N;;;;; +18839;TANGUT COMPONENT-058;Lo;0;L;;;;;N;;;;; +1883A;TANGUT COMPONENT-059;Lo;0;L;;;;;N;;;;; +1883B;TANGUT COMPONENT-060;Lo;0;L;;;;;N;;;;; +1883C;TANGUT COMPONENT-061;Lo;0;L;;;;;N;;;;; +1883D;TANGUT COMPONENT-062;Lo;0;L;;;;;N;;;;; +1883E;TANGUT COMPONENT-063;Lo;0;L;;;;;N;;;;; +1883F;TANGUT COMPONENT-064;Lo;0;L;;;;;N;;;;; +18840;TANGUT COMPONENT-065;Lo;0;L;;;;;N;;;;; +18841;TANGUT COMPONENT-066;Lo;0;L;;;;;N;;;;; +18842;TANGUT COMPONENT-067;Lo;0;L;;;;;N;;;;; +18843;TANGUT COMPONENT-068;Lo;0;L;;;;;N;;;;; +18844;TANGUT COMPONENT-069;Lo;0;L;;;;;N;;;;; +18845;TANGUT COMPONENT-070;Lo;0;L;;;;;N;;;;; +18846;TANGUT COMPONENT-071;Lo;0;L;;;;;N;;;;; +18847;TANGUT COMPONENT-072;Lo;0;L;;;;;N;;;;; +18848;TANGUT COMPONENT-073;Lo;0;L;;;;;N;;;;; +18849;TANGUT COMPONENT-074;Lo;0;L;;;;;N;;;;; +1884A;TANGUT COMPONENT-075;Lo;0;L;;;;;N;;;;; +1884B;TANGUT COMPONENT-076;Lo;0;L;;;;;N;;;;; +1884C;TANGUT COMPONENT-077;Lo;0;L;;;;;N;;;;; +1884D;TANGUT COMPONENT-078;Lo;0;L;;;;;N;;;;; +1884E;TANGUT COMPONENT-079;Lo;0;L;;;;;N;;;;; +1884F;TANGUT COMPONENT-080;Lo;0;L;;;;;N;;;;; +18850;TANGUT COMPONENT-081;Lo;0;L;;;;;N;;;;; +18851;TANGUT COMPONENT-082;Lo;0;L;;;;;N;;;;; +18852;TANGUT COMPONENT-083;Lo;0;L;;;;;N;;;;; +18853;TANGUT COMPONENT-084;Lo;0;L;;;;;N;;;;; +18854;TANGUT COMPONENT-085;Lo;0;L;;;;;N;;;;; +18855;TANGUT COMPONENT-086;Lo;0;L;;;;;N;;;;; +18856;TANGUT COMPONENT-087;Lo;0;L;;;;;N;;;;; +18857;TANGUT COMPONENT-088;Lo;0;L;;;;;N;;;;; +18858;TANGUT COMPONENT-089;Lo;0;L;;;;;N;;;;; +18859;TANGUT COMPONENT-090;Lo;0;L;;;;;N;;;;; +1885A;TANGUT COMPONENT-091;Lo;0;L;;;;;N;;;;; +1885B;TANGUT COMPONENT-092;Lo;0;L;;;;;N;;;;; +1885C;TANGUT COMPONENT-093;Lo;0;L;;;;;N;;;;; +1885D;TANGUT COMPONENT-094;Lo;0;L;;;;;N;;;;; +1885E;TANGUT COMPONENT-095;Lo;0;L;;;;;N;;;;; +1885F;TANGUT COMPONENT-096;Lo;0;L;;;;;N;;;;; +18860;TANGUT COMPONENT-097;Lo;0;L;;;;;N;;;;; +18861;TANGUT COMPONENT-098;Lo;0;L;;;;;N;;;;; +18862;TANGUT COMPONENT-099;Lo;0;L;;;;;N;;;;; +18863;TANGUT COMPONENT-100;Lo;0;L;;;;;N;;;;; +18864;TANGUT COMPONENT-101;Lo;0;L;;;;;N;;;;; +18865;TANGUT COMPONENT-102;Lo;0;L;;;;;N;;;;; +18866;TANGUT COMPONENT-103;Lo;0;L;;;;;N;;;;; +18867;TANGUT COMPONENT-104;Lo;0;L;;;;;N;;;;; +18868;TANGUT COMPONENT-105;Lo;0;L;;;;;N;;;;; +18869;TANGUT COMPONENT-106;Lo;0;L;;;;;N;;;;; +1886A;TANGUT COMPONENT-107;Lo;0;L;;;;;N;;;;; +1886B;TANGUT COMPONENT-108;Lo;0;L;;;;;N;;;;; +1886C;TANGUT COMPONENT-109;Lo;0;L;;;;;N;;;;; +1886D;TANGUT COMPONENT-110;Lo;0;L;;;;;N;;;;; +1886E;TANGUT COMPONENT-111;Lo;0;L;;;;;N;;;;; +1886F;TANGUT COMPONENT-112;Lo;0;L;;;;;N;;;;; +18870;TANGUT COMPONENT-113;Lo;0;L;;;;;N;;;;; +18871;TANGUT COMPONENT-114;Lo;0;L;;;;;N;;;;; +18872;TANGUT COMPONENT-115;Lo;0;L;;;;;N;;;;; +18873;TANGUT COMPONENT-116;Lo;0;L;;;;;N;;;;; +18874;TANGUT COMPONENT-117;Lo;0;L;;;;;N;;;;; +18875;TANGUT COMPONENT-118;Lo;0;L;;;;;N;;;;; +18876;TANGUT COMPONENT-119;Lo;0;L;;;;;N;;;;; +18877;TANGUT COMPONENT-120;Lo;0;L;;;;;N;;;;; +18878;TANGUT COMPONENT-121;Lo;0;L;;;;;N;;;;; +18879;TANGUT COMPONENT-122;Lo;0;L;;;;;N;;;;; +1887A;TANGUT COMPONENT-123;Lo;0;L;;;;;N;;;;; +1887B;TANGUT COMPONENT-124;Lo;0;L;;;;;N;;;;; +1887C;TANGUT COMPONENT-125;Lo;0;L;;;;;N;;;;; +1887D;TANGUT COMPONENT-126;Lo;0;L;;;;;N;;;;; +1887E;TANGUT COMPONENT-127;Lo;0;L;;;;;N;;;;; +1887F;TANGUT COMPONENT-128;Lo;0;L;;;;;N;;;;; +18880;TANGUT COMPONENT-129;Lo;0;L;;;;;N;;;;; +18881;TANGUT COMPONENT-130;Lo;0;L;;;;;N;;;;; +18882;TANGUT COMPONENT-131;Lo;0;L;;;;;N;;;;; +18883;TANGUT COMPONENT-132;Lo;0;L;;;;;N;;;;; +18884;TANGUT COMPONENT-133;Lo;0;L;;;;;N;;;;; +18885;TANGUT COMPONENT-134;Lo;0;L;;;;;N;;;;; +18886;TANGUT COMPONENT-135;Lo;0;L;;;;;N;;;;; +18887;TANGUT COMPONENT-136;Lo;0;L;;;;;N;;;;; +18888;TANGUT COMPONENT-137;Lo;0;L;;;;;N;;;;; +18889;TANGUT COMPONENT-138;Lo;0;L;;;;;N;;;;; +1888A;TANGUT COMPONENT-139;Lo;0;L;;;;;N;;;;; +1888B;TANGUT COMPONENT-140;Lo;0;L;;;;;N;;;;; +1888C;TANGUT COMPONENT-141;Lo;0;L;;;;;N;;;;; +1888D;TANGUT COMPONENT-142;Lo;0;L;;;;;N;;;;; +1888E;TANGUT COMPONENT-143;Lo;0;L;;;;;N;;;;; +1888F;TANGUT COMPONENT-144;Lo;0;L;;;;;N;;;;; +18890;TANGUT COMPONENT-145;Lo;0;L;;;;;N;;;;; +18891;TANGUT COMPONENT-146;Lo;0;L;;;;;N;;;;; +18892;TANGUT COMPONENT-147;Lo;0;L;;;;;N;;;;; +18893;TANGUT COMPONENT-148;Lo;0;L;;;;;N;;;;; +18894;TANGUT COMPONENT-149;Lo;0;L;;;;;N;;;;; +18895;TANGUT COMPONENT-150;Lo;0;L;;;;;N;;;;; +18896;TANGUT COMPONENT-151;Lo;0;L;;;;;N;;;;; +18897;TANGUT COMPONENT-152;Lo;0;L;;;;;N;;;;; +18898;TANGUT COMPONENT-153;Lo;0;L;;;;;N;;;;; +18899;TANGUT COMPONENT-154;Lo;0;L;;;;;N;;;;; +1889A;TANGUT COMPONENT-155;Lo;0;L;;;;;N;;;;; +1889B;TANGUT COMPONENT-156;Lo;0;L;;;;;N;;;;; +1889C;TANGUT COMPONENT-157;Lo;0;L;;;;;N;;;;; +1889D;TANGUT COMPONENT-158;Lo;0;L;;;;;N;;;;; +1889E;TANGUT COMPONENT-159;Lo;0;L;;;;;N;;;;; +1889F;TANGUT COMPONENT-160;Lo;0;L;;;;;N;;;;; +188A0;TANGUT COMPONENT-161;Lo;0;L;;;;;N;;;;; +188A1;TANGUT COMPONENT-162;Lo;0;L;;;;;N;;;;; +188A2;TANGUT COMPONENT-163;Lo;0;L;;;;;N;;;;; +188A3;TANGUT COMPONENT-164;Lo;0;L;;;;;N;;;;; +188A4;TANGUT COMPONENT-165;Lo;0;L;;;;;N;;;;; +188A5;TANGUT COMPONENT-166;Lo;0;L;;;;;N;;;;; +188A6;TANGUT COMPONENT-167;Lo;0;L;;;;;N;;;;; +188A7;TANGUT COMPONENT-168;Lo;0;L;;;;;N;;;;; +188A8;TANGUT COMPONENT-169;Lo;0;L;;;;;N;;;;; +188A9;TANGUT COMPONENT-170;Lo;0;L;;;;;N;;;;; +188AA;TANGUT COMPONENT-171;Lo;0;L;;;;;N;;;;; +188AB;TANGUT COMPONENT-172;Lo;0;L;;;;;N;;;;; +188AC;TANGUT COMPONENT-173;Lo;0;L;;;;;N;;;;; +188AD;TANGUT COMPONENT-174;Lo;0;L;;;;;N;;;;; +188AE;TANGUT COMPONENT-175;Lo;0;L;;;;;N;;;;; +188AF;TANGUT COMPONENT-176;Lo;0;L;;;;;N;;;;; +188B0;TANGUT COMPONENT-177;Lo;0;L;;;;;N;;;;; +188B1;TANGUT COMPONENT-178;Lo;0;L;;;;;N;;;;; +188B2;TANGUT COMPONENT-179;Lo;0;L;;;;;N;;;;; +188B3;TANGUT COMPONENT-180;Lo;0;L;;;;;N;;;;; +188B4;TANGUT COMPONENT-181;Lo;0;L;;;;;N;;;;; +188B5;TANGUT COMPONENT-182;Lo;0;L;;;;;N;;;;; +188B6;TANGUT COMPONENT-183;Lo;0;L;;;;;N;;;;; +188B7;TANGUT COMPONENT-184;Lo;0;L;;;;;N;;;;; +188B8;TANGUT COMPONENT-185;Lo;0;L;;;;;N;;;;; +188B9;TANGUT COMPONENT-186;Lo;0;L;;;;;N;;;;; +188BA;TANGUT COMPONENT-187;Lo;0;L;;;;;N;;;;; +188BB;TANGUT COMPONENT-188;Lo;0;L;;;;;N;;;;; +188BC;TANGUT COMPONENT-189;Lo;0;L;;;;;N;;;;; +188BD;TANGUT COMPONENT-190;Lo;0;L;;;;;N;;;;; +188BE;TANGUT COMPONENT-191;Lo;0;L;;;;;N;;;;; +188BF;TANGUT COMPONENT-192;Lo;0;L;;;;;N;;;;; +188C0;TANGUT COMPONENT-193;Lo;0;L;;;;;N;;;;; +188C1;TANGUT COMPONENT-194;Lo;0;L;;;;;N;;;;; +188C2;TANGUT COMPONENT-195;Lo;0;L;;;;;N;;;;; +188C3;TANGUT COMPONENT-196;Lo;0;L;;;;;N;;;;; +188C4;TANGUT COMPONENT-197;Lo;0;L;;;;;N;;;;; +188C5;TANGUT COMPONENT-198;Lo;0;L;;;;;N;;;;; +188C6;TANGUT COMPONENT-199;Lo;0;L;;;;;N;;;;; +188C7;TANGUT COMPONENT-200;Lo;0;L;;;;;N;;;;; +188C8;TANGUT COMPONENT-201;Lo;0;L;;;;;N;;;;; +188C9;TANGUT COMPONENT-202;Lo;0;L;;;;;N;;;;; +188CA;TANGUT COMPONENT-203;Lo;0;L;;;;;N;;;;; +188CB;TANGUT COMPONENT-204;Lo;0;L;;;;;N;;;;; +188CC;TANGUT COMPONENT-205;Lo;0;L;;;;;N;;;;; +188CD;TANGUT COMPONENT-206;Lo;0;L;;;;;N;;;;; +188CE;TANGUT COMPONENT-207;Lo;0;L;;;;;N;;;;; +188CF;TANGUT COMPONENT-208;Lo;0;L;;;;;N;;;;; +188D0;TANGUT COMPONENT-209;Lo;0;L;;;;;N;;;;; +188D1;TANGUT COMPONENT-210;Lo;0;L;;;;;N;;;;; +188D2;TANGUT COMPONENT-211;Lo;0;L;;;;;N;;;;; +188D3;TANGUT COMPONENT-212;Lo;0;L;;;;;N;;;;; +188D4;TANGUT COMPONENT-213;Lo;0;L;;;;;N;;;;; +188D5;TANGUT COMPONENT-214;Lo;0;L;;;;;N;;;;; +188D6;TANGUT COMPONENT-215;Lo;0;L;;;;;N;;;;; +188D7;TANGUT COMPONENT-216;Lo;0;L;;;;;N;;;;; +188D8;TANGUT COMPONENT-217;Lo;0;L;;;;;N;;;;; +188D9;TANGUT COMPONENT-218;Lo;0;L;;;;;N;;;;; +188DA;TANGUT COMPONENT-219;Lo;0;L;;;;;N;;;;; +188DB;TANGUT COMPONENT-220;Lo;0;L;;;;;N;;;;; +188DC;TANGUT COMPONENT-221;Lo;0;L;;;;;N;;;;; +188DD;TANGUT COMPONENT-222;Lo;0;L;;;;;N;;;;; +188DE;TANGUT COMPONENT-223;Lo;0;L;;;;;N;;;;; +188DF;TANGUT COMPONENT-224;Lo;0;L;;;;;N;;;;; +188E0;TANGUT COMPONENT-225;Lo;0;L;;;;;N;;;;; +188E1;TANGUT COMPONENT-226;Lo;0;L;;;;;N;;;;; +188E2;TANGUT COMPONENT-227;Lo;0;L;;;;;N;;;;; +188E3;TANGUT COMPONENT-228;Lo;0;L;;;;;N;;;;; +188E4;TANGUT COMPONENT-229;Lo;0;L;;;;;N;;;;; +188E5;TANGUT COMPONENT-230;Lo;0;L;;;;;N;;;;; +188E6;TANGUT COMPONENT-231;Lo;0;L;;;;;N;;;;; +188E7;TANGUT COMPONENT-232;Lo;0;L;;;;;N;;;;; +188E8;TANGUT COMPONENT-233;Lo;0;L;;;;;N;;;;; +188E9;TANGUT COMPONENT-234;Lo;0;L;;;;;N;;;;; +188EA;TANGUT COMPONENT-235;Lo;0;L;;;;;N;;;;; +188EB;TANGUT COMPONENT-236;Lo;0;L;;;;;N;;;;; +188EC;TANGUT COMPONENT-237;Lo;0;L;;;;;N;;;;; +188ED;TANGUT COMPONENT-238;Lo;0;L;;;;;N;;;;; +188EE;TANGUT COMPONENT-239;Lo;0;L;;;;;N;;;;; +188EF;TANGUT COMPONENT-240;Lo;0;L;;;;;N;;;;; +188F0;TANGUT COMPONENT-241;Lo;0;L;;;;;N;;;;; +188F1;TANGUT COMPONENT-242;Lo;0;L;;;;;N;;;;; +188F2;TANGUT COMPONENT-243;Lo;0;L;;;;;N;;;;; +188F3;TANGUT COMPONENT-244;Lo;0;L;;;;;N;;;;; +188F4;TANGUT COMPONENT-245;Lo;0;L;;;;;N;;;;; +188F5;TANGUT COMPONENT-246;Lo;0;L;;;;;N;;;;; +188F6;TANGUT COMPONENT-247;Lo;0;L;;;;;N;;;;; +188F7;TANGUT COMPONENT-248;Lo;0;L;;;;;N;;;;; +188F8;TANGUT COMPONENT-249;Lo;0;L;;;;;N;;;;; +188F9;TANGUT COMPONENT-250;Lo;0;L;;;;;N;;;;; +188FA;TANGUT COMPONENT-251;Lo;0;L;;;;;N;;;;; +188FB;TANGUT COMPONENT-252;Lo;0;L;;;;;N;;;;; +188FC;TANGUT COMPONENT-253;Lo;0;L;;;;;N;;;;; +188FD;TANGUT COMPONENT-254;Lo;0;L;;;;;N;;;;; +188FE;TANGUT COMPONENT-255;Lo;0;L;;;;;N;;;;; +188FF;TANGUT COMPONENT-256;Lo;0;L;;;;;N;;;;; +18900;TANGUT COMPONENT-257;Lo;0;L;;;;;N;;;;; +18901;TANGUT COMPONENT-258;Lo;0;L;;;;;N;;;;; +18902;TANGUT COMPONENT-259;Lo;0;L;;;;;N;;;;; +18903;TANGUT COMPONENT-260;Lo;0;L;;;;;N;;;;; +18904;TANGUT COMPONENT-261;Lo;0;L;;;;;N;;;;; +18905;TANGUT COMPONENT-262;Lo;0;L;;;;;N;;;;; +18906;TANGUT COMPONENT-263;Lo;0;L;;;;;N;;;;; +18907;TANGUT COMPONENT-264;Lo;0;L;;;;;N;;;;; +18908;TANGUT COMPONENT-265;Lo;0;L;;;;;N;;;;; +18909;TANGUT COMPONENT-266;Lo;0;L;;;;;N;;;;; +1890A;TANGUT COMPONENT-267;Lo;0;L;;;;;N;;;;; +1890B;TANGUT COMPONENT-268;Lo;0;L;;;;;N;;;;; +1890C;TANGUT COMPONENT-269;Lo;0;L;;;;;N;;;;; +1890D;TANGUT COMPONENT-270;Lo;0;L;;;;;N;;;;; +1890E;TANGUT COMPONENT-271;Lo;0;L;;;;;N;;;;; +1890F;TANGUT COMPONENT-272;Lo;0;L;;;;;N;;;;; +18910;TANGUT COMPONENT-273;Lo;0;L;;;;;N;;;;; +18911;TANGUT COMPONENT-274;Lo;0;L;;;;;N;;;;; +18912;TANGUT COMPONENT-275;Lo;0;L;;;;;N;;;;; +18913;TANGUT COMPONENT-276;Lo;0;L;;;;;N;;;;; +18914;TANGUT COMPONENT-277;Lo;0;L;;;;;N;;;;; +18915;TANGUT COMPONENT-278;Lo;0;L;;;;;N;;;;; +18916;TANGUT COMPONENT-279;Lo;0;L;;;;;N;;;;; +18917;TANGUT COMPONENT-280;Lo;0;L;;;;;N;;;;; +18918;TANGUT COMPONENT-281;Lo;0;L;;;;;N;;;;; +18919;TANGUT COMPONENT-282;Lo;0;L;;;;;N;;;;; +1891A;TANGUT COMPONENT-283;Lo;0;L;;;;;N;;;;; +1891B;TANGUT COMPONENT-284;Lo;0;L;;;;;N;;;;; +1891C;TANGUT COMPONENT-285;Lo;0;L;;;;;N;;;;; +1891D;TANGUT COMPONENT-286;Lo;0;L;;;;;N;;;;; +1891E;TANGUT COMPONENT-287;Lo;0;L;;;;;N;;;;; +1891F;TANGUT COMPONENT-288;Lo;0;L;;;;;N;;;;; +18920;TANGUT COMPONENT-289;Lo;0;L;;;;;N;;;;; +18921;TANGUT COMPONENT-290;Lo;0;L;;;;;N;;;;; +18922;TANGUT COMPONENT-291;Lo;0;L;;;;;N;;;;; +18923;TANGUT COMPONENT-292;Lo;0;L;;;;;N;;;;; +18924;TANGUT COMPONENT-293;Lo;0;L;;;;;N;;;;; +18925;TANGUT COMPONENT-294;Lo;0;L;;;;;N;;;;; +18926;TANGUT COMPONENT-295;Lo;0;L;;;;;N;;;;; +18927;TANGUT COMPONENT-296;Lo;0;L;;;;;N;;;;; +18928;TANGUT COMPONENT-297;Lo;0;L;;;;;N;;;;; +18929;TANGUT COMPONENT-298;Lo;0;L;;;;;N;;;;; +1892A;TANGUT COMPONENT-299;Lo;0;L;;;;;N;;;;; +1892B;TANGUT COMPONENT-300;Lo;0;L;;;;;N;;;;; +1892C;TANGUT COMPONENT-301;Lo;0;L;;;;;N;;;;; +1892D;TANGUT COMPONENT-302;Lo;0;L;;;;;N;;;;; +1892E;TANGUT COMPONENT-303;Lo;0;L;;;;;N;;;;; +1892F;TANGUT COMPONENT-304;Lo;0;L;;;;;N;;;;; +18930;TANGUT COMPONENT-305;Lo;0;L;;;;;N;;;;; +18931;TANGUT COMPONENT-306;Lo;0;L;;;;;N;;;;; +18932;TANGUT COMPONENT-307;Lo;0;L;;;;;N;;;;; +18933;TANGUT COMPONENT-308;Lo;0;L;;;;;N;;;;; +18934;TANGUT COMPONENT-309;Lo;0;L;;;;;N;;;;; +18935;TANGUT COMPONENT-310;Lo;0;L;;;;;N;;;;; +18936;TANGUT COMPONENT-311;Lo;0;L;;;;;N;;;;; +18937;TANGUT COMPONENT-312;Lo;0;L;;;;;N;;;;; +18938;TANGUT COMPONENT-313;Lo;0;L;;;;;N;;;;; +18939;TANGUT COMPONENT-314;Lo;0;L;;;;;N;;;;; +1893A;TANGUT COMPONENT-315;Lo;0;L;;;;;N;;;;; +1893B;TANGUT COMPONENT-316;Lo;0;L;;;;;N;;;;; +1893C;TANGUT COMPONENT-317;Lo;0;L;;;;;N;;;;; +1893D;TANGUT COMPONENT-318;Lo;0;L;;;;;N;;;;; +1893E;TANGUT COMPONENT-319;Lo;0;L;;;;;N;;;;; +1893F;TANGUT COMPONENT-320;Lo;0;L;;;;;N;;;;; +18940;TANGUT COMPONENT-321;Lo;0;L;;;;;N;;;;; +18941;TANGUT COMPONENT-322;Lo;0;L;;;;;N;;;;; +18942;TANGUT COMPONENT-323;Lo;0;L;;;;;N;;;;; +18943;TANGUT COMPONENT-324;Lo;0;L;;;;;N;;;;; +18944;TANGUT COMPONENT-325;Lo;0;L;;;;;N;;;;; +18945;TANGUT COMPONENT-326;Lo;0;L;;;;;N;;;;; +18946;TANGUT COMPONENT-327;Lo;0;L;;;;;N;;;;; +18947;TANGUT COMPONENT-328;Lo;0;L;;;;;N;;;;; +18948;TANGUT COMPONENT-329;Lo;0;L;;;;;N;;;;; +18949;TANGUT COMPONENT-330;Lo;0;L;;;;;N;;;;; +1894A;TANGUT COMPONENT-331;Lo;0;L;;;;;N;;;;; +1894B;TANGUT COMPONENT-332;Lo;0;L;;;;;N;;;;; +1894C;TANGUT COMPONENT-333;Lo;0;L;;;;;N;;;;; +1894D;TANGUT COMPONENT-334;Lo;0;L;;;;;N;;;;; +1894E;TANGUT COMPONENT-335;Lo;0;L;;;;;N;;;;; +1894F;TANGUT COMPONENT-336;Lo;0;L;;;;;N;;;;; +18950;TANGUT COMPONENT-337;Lo;0;L;;;;;N;;;;; +18951;TANGUT COMPONENT-338;Lo;0;L;;;;;N;;;;; +18952;TANGUT COMPONENT-339;Lo;0;L;;;;;N;;;;; +18953;TANGUT COMPONENT-340;Lo;0;L;;;;;N;;;;; +18954;TANGUT COMPONENT-341;Lo;0;L;;;;;N;;;;; +18955;TANGUT COMPONENT-342;Lo;0;L;;;;;N;;;;; +18956;TANGUT COMPONENT-343;Lo;0;L;;;;;N;;;;; +18957;TANGUT COMPONENT-344;Lo;0;L;;;;;N;;;;; +18958;TANGUT COMPONENT-345;Lo;0;L;;;;;N;;;;; +18959;TANGUT COMPONENT-346;Lo;0;L;;;;;N;;;;; +1895A;TANGUT COMPONENT-347;Lo;0;L;;;;;N;;;;; +1895B;TANGUT COMPONENT-348;Lo;0;L;;;;;N;;;;; +1895C;TANGUT COMPONENT-349;Lo;0;L;;;;;N;;;;; +1895D;TANGUT COMPONENT-350;Lo;0;L;;;;;N;;;;; +1895E;TANGUT COMPONENT-351;Lo;0;L;;;;;N;;;;; +1895F;TANGUT COMPONENT-352;Lo;0;L;;;;;N;;;;; +18960;TANGUT COMPONENT-353;Lo;0;L;;;;;N;;;;; +18961;TANGUT COMPONENT-354;Lo;0;L;;;;;N;;;;; +18962;TANGUT COMPONENT-355;Lo;0;L;;;;;N;;;;; +18963;TANGUT COMPONENT-356;Lo;0;L;;;;;N;;;;; +18964;TANGUT COMPONENT-357;Lo;0;L;;;;;N;;;;; +18965;TANGUT COMPONENT-358;Lo;0;L;;;;;N;;;;; +18966;TANGUT COMPONENT-359;Lo;0;L;;;;;N;;;;; +18967;TANGUT COMPONENT-360;Lo;0;L;;;;;N;;;;; +18968;TANGUT COMPONENT-361;Lo;0;L;;;;;N;;;;; +18969;TANGUT COMPONENT-362;Lo;0;L;;;;;N;;;;; +1896A;TANGUT COMPONENT-363;Lo;0;L;;;;;N;;;;; +1896B;TANGUT COMPONENT-364;Lo;0;L;;;;;N;;;;; +1896C;TANGUT COMPONENT-365;Lo;0;L;;;;;N;;;;; +1896D;TANGUT COMPONENT-366;Lo;0;L;;;;;N;;;;; +1896E;TANGUT COMPONENT-367;Lo;0;L;;;;;N;;;;; +1896F;TANGUT COMPONENT-368;Lo;0;L;;;;;N;;;;; +18970;TANGUT COMPONENT-369;Lo;0;L;;;;;N;;;;; +18971;TANGUT COMPONENT-370;Lo;0;L;;;;;N;;;;; +18972;TANGUT COMPONENT-371;Lo;0;L;;;;;N;;;;; +18973;TANGUT COMPONENT-372;Lo;0;L;;;;;N;;;;; +18974;TANGUT COMPONENT-373;Lo;0;L;;;;;N;;;;; +18975;TANGUT COMPONENT-374;Lo;0;L;;;;;N;;;;; +18976;TANGUT COMPONENT-375;Lo;0;L;;;;;N;;;;; +18977;TANGUT COMPONENT-376;Lo;0;L;;;;;N;;;;; +18978;TANGUT COMPONENT-377;Lo;0;L;;;;;N;;;;; +18979;TANGUT COMPONENT-378;Lo;0;L;;;;;N;;;;; +1897A;TANGUT COMPONENT-379;Lo;0;L;;;;;N;;;;; +1897B;TANGUT COMPONENT-380;Lo;0;L;;;;;N;;;;; +1897C;TANGUT COMPONENT-381;Lo;0;L;;;;;N;;;;; +1897D;TANGUT COMPONENT-382;Lo;0;L;;;;;N;;;;; +1897E;TANGUT COMPONENT-383;Lo;0;L;;;;;N;;;;; +1897F;TANGUT COMPONENT-384;Lo;0;L;;;;;N;;;;; +18980;TANGUT COMPONENT-385;Lo;0;L;;;;;N;;;;; +18981;TANGUT COMPONENT-386;Lo;0;L;;;;;N;;;;; +18982;TANGUT COMPONENT-387;Lo;0;L;;;;;N;;;;; +18983;TANGUT COMPONENT-388;Lo;0;L;;;;;N;;;;; +18984;TANGUT COMPONENT-389;Lo;0;L;;;;;N;;;;; +18985;TANGUT COMPONENT-390;Lo;0;L;;;;;N;;;;; +18986;TANGUT COMPONENT-391;Lo;0;L;;;;;N;;;;; +18987;TANGUT COMPONENT-392;Lo;0;L;;;;;N;;;;; +18988;TANGUT COMPONENT-393;Lo;0;L;;;;;N;;;;; +18989;TANGUT COMPONENT-394;Lo;0;L;;;;;N;;;;; +1898A;TANGUT COMPONENT-395;Lo;0;L;;;;;N;;;;; +1898B;TANGUT COMPONENT-396;Lo;0;L;;;;;N;;;;; +1898C;TANGUT COMPONENT-397;Lo;0;L;;;;;N;;;;; +1898D;TANGUT COMPONENT-398;Lo;0;L;;;;;N;;;;; +1898E;TANGUT COMPONENT-399;Lo;0;L;;;;;N;;;;; +1898F;TANGUT COMPONENT-400;Lo;0;L;;;;;N;;;;; +18990;TANGUT COMPONENT-401;Lo;0;L;;;;;N;;;;; +18991;TANGUT COMPONENT-402;Lo;0;L;;;;;N;;;;; +18992;TANGUT COMPONENT-403;Lo;0;L;;;;;N;;;;; +18993;TANGUT COMPONENT-404;Lo;0;L;;;;;N;;;;; +18994;TANGUT COMPONENT-405;Lo;0;L;;;;;N;;;;; +18995;TANGUT COMPONENT-406;Lo;0;L;;;;;N;;;;; +18996;TANGUT COMPONENT-407;Lo;0;L;;;;;N;;;;; +18997;TANGUT COMPONENT-408;Lo;0;L;;;;;N;;;;; +18998;TANGUT COMPONENT-409;Lo;0;L;;;;;N;;;;; +18999;TANGUT COMPONENT-410;Lo;0;L;;;;;N;;;;; +1899A;TANGUT COMPONENT-411;Lo;0;L;;;;;N;;;;; +1899B;TANGUT COMPONENT-412;Lo;0;L;;;;;N;;;;; +1899C;TANGUT COMPONENT-413;Lo;0;L;;;;;N;;;;; +1899D;TANGUT COMPONENT-414;Lo;0;L;;;;;N;;;;; +1899E;TANGUT COMPONENT-415;Lo;0;L;;;;;N;;;;; +1899F;TANGUT COMPONENT-416;Lo;0;L;;;;;N;;;;; +189A0;TANGUT COMPONENT-417;Lo;0;L;;;;;N;;;;; +189A1;TANGUT COMPONENT-418;Lo;0;L;;;;;N;;;;; +189A2;TANGUT COMPONENT-419;Lo;0;L;;;;;N;;;;; +189A3;TANGUT COMPONENT-420;Lo;0;L;;;;;N;;;;; +189A4;TANGUT COMPONENT-421;Lo;0;L;;;;;N;;;;; +189A5;TANGUT COMPONENT-422;Lo;0;L;;;;;N;;;;; +189A6;TANGUT COMPONENT-423;Lo;0;L;;;;;N;;;;; +189A7;TANGUT COMPONENT-424;Lo;0;L;;;;;N;;;;; +189A8;TANGUT COMPONENT-425;Lo;0;L;;;;;N;;;;; +189A9;TANGUT COMPONENT-426;Lo;0;L;;;;;N;;;;; +189AA;TANGUT COMPONENT-427;Lo;0;L;;;;;N;;;;; +189AB;TANGUT COMPONENT-428;Lo;0;L;;;;;N;;;;; +189AC;TANGUT COMPONENT-429;Lo;0;L;;;;;N;;;;; +189AD;TANGUT COMPONENT-430;Lo;0;L;;;;;N;;;;; +189AE;TANGUT COMPONENT-431;Lo;0;L;;;;;N;;;;; +189AF;TANGUT COMPONENT-432;Lo;0;L;;;;;N;;;;; +189B0;TANGUT COMPONENT-433;Lo;0;L;;;;;N;;;;; +189B1;TANGUT COMPONENT-434;Lo;0;L;;;;;N;;;;; +189B2;TANGUT COMPONENT-435;Lo;0;L;;;;;N;;;;; +189B3;TANGUT COMPONENT-436;Lo;0;L;;;;;N;;;;; +189B4;TANGUT COMPONENT-437;Lo;0;L;;;;;N;;;;; +189B5;TANGUT COMPONENT-438;Lo;0;L;;;;;N;;;;; +189B6;TANGUT COMPONENT-439;Lo;0;L;;;;;N;;;;; +189B7;TANGUT COMPONENT-440;Lo;0;L;;;;;N;;;;; +189B8;TANGUT COMPONENT-441;Lo;0;L;;;;;N;;;;; +189B9;TANGUT COMPONENT-442;Lo;0;L;;;;;N;;;;; +189BA;TANGUT COMPONENT-443;Lo;0;L;;;;;N;;;;; +189BB;TANGUT COMPONENT-444;Lo;0;L;;;;;N;;;;; +189BC;TANGUT COMPONENT-445;Lo;0;L;;;;;N;;;;; +189BD;TANGUT COMPONENT-446;Lo;0;L;;;;;N;;;;; +189BE;TANGUT COMPONENT-447;Lo;0;L;;;;;N;;;;; +189BF;TANGUT COMPONENT-448;Lo;0;L;;;;;N;;;;; +189C0;TANGUT COMPONENT-449;Lo;0;L;;;;;N;;;;; +189C1;TANGUT COMPONENT-450;Lo;0;L;;;;;N;;;;; +189C2;TANGUT COMPONENT-451;Lo;0;L;;;;;N;;;;; +189C3;TANGUT COMPONENT-452;Lo;0;L;;;;;N;;;;; +189C4;TANGUT COMPONENT-453;Lo;0;L;;;;;N;;;;; +189C5;TANGUT COMPONENT-454;Lo;0;L;;;;;N;;;;; +189C6;TANGUT COMPONENT-455;Lo;0;L;;;;;N;;;;; +189C7;TANGUT COMPONENT-456;Lo;0;L;;;;;N;;;;; +189C8;TANGUT COMPONENT-457;Lo;0;L;;;;;N;;;;; +189C9;TANGUT COMPONENT-458;Lo;0;L;;;;;N;;;;; +189CA;TANGUT COMPONENT-459;Lo;0;L;;;;;N;;;;; +189CB;TANGUT COMPONENT-460;Lo;0;L;;;;;N;;;;; +189CC;TANGUT COMPONENT-461;Lo;0;L;;;;;N;;;;; +189CD;TANGUT COMPONENT-462;Lo;0;L;;;;;N;;;;; +189CE;TANGUT COMPONENT-463;Lo;0;L;;;;;N;;;;; +189CF;TANGUT COMPONENT-464;Lo;0;L;;;;;N;;;;; +189D0;TANGUT COMPONENT-465;Lo;0;L;;;;;N;;;;; +189D1;TANGUT COMPONENT-466;Lo;0;L;;;;;N;;;;; +189D2;TANGUT COMPONENT-467;Lo;0;L;;;;;N;;;;; +189D3;TANGUT COMPONENT-468;Lo;0;L;;;;;N;;;;; +189D4;TANGUT COMPONENT-469;Lo;0;L;;;;;N;;;;; +189D5;TANGUT COMPONENT-470;Lo;0;L;;;;;N;;;;; +189D6;TANGUT COMPONENT-471;Lo;0;L;;;;;N;;;;; +189D7;TANGUT COMPONENT-472;Lo;0;L;;;;;N;;;;; +189D8;TANGUT COMPONENT-473;Lo;0;L;;;;;N;;;;; +189D9;TANGUT COMPONENT-474;Lo;0;L;;;;;N;;;;; +189DA;TANGUT COMPONENT-475;Lo;0;L;;;;;N;;;;; +189DB;TANGUT COMPONENT-476;Lo;0;L;;;;;N;;;;; +189DC;TANGUT COMPONENT-477;Lo;0;L;;;;;N;;;;; +189DD;TANGUT COMPONENT-478;Lo;0;L;;;;;N;;;;; +189DE;TANGUT COMPONENT-479;Lo;0;L;;;;;N;;;;; +189DF;TANGUT COMPONENT-480;Lo;0;L;;;;;N;;;;; +189E0;TANGUT COMPONENT-481;Lo;0;L;;;;;N;;;;; +189E1;TANGUT COMPONENT-482;Lo;0;L;;;;;N;;;;; +189E2;TANGUT COMPONENT-483;Lo;0;L;;;;;N;;;;; +189E3;TANGUT COMPONENT-484;Lo;0;L;;;;;N;;;;; +189E4;TANGUT COMPONENT-485;Lo;0;L;;;;;N;;;;; +189E5;TANGUT COMPONENT-486;Lo;0;L;;;;;N;;;;; +189E6;TANGUT COMPONENT-487;Lo;0;L;;;;;N;;;;; +189E7;TANGUT COMPONENT-488;Lo;0;L;;;;;N;;;;; +189E8;TANGUT COMPONENT-489;Lo;0;L;;;;;N;;;;; +189E9;TANGUT COMPONENT-490;Lo;0;L;;;;;N;;;;; +189EA;TANGUT COMPONENT-491;Lo;0;L;;;;;N;;;;; +189EB;TANGUT COMPONENT-492;Lo;0;L;;;;;N;;;;; +189EC;TANGUT COMPONENT-493;Lo;0;L;;;;;N;;;;; +189ED;TANGUT COMPONENT-494;Lo;0;L;;;;;N;;;;; +189EE;TANGUT COMPONENT-495;Lo;0;L;;;;;N;;;;; +189EF;TANGUT COMPONENT-496;Lo;0;L;;;;;N;;;;; +189F0;TANGUT COMPONENT-497;Lo;0;L;;;;;N;;;;; +189F1;TANGUT COMPONENT-498;Lo;0;L;;;;;N;;;;; +189F2;TANGUT COMPONENT-499;Lo;0;L;;;;;N;;;;; +189F3;TANGUT COMPONENT-500;Lo;0;L;;;;;N;;;;; +189F4;TANGUT COMPONENT-501;Lo;0;L;;;;;N;;;;; +189F5;TANGUT COMPONENT-502;Lo;0;L;;;;;N;;;;; +189F6;TANGUT COMPONENT-503;Lo;0;L;;;;;N;;;;; +189F7;TANGUT COMPONENT-504;Lo;0;L;;;;;N;;;;; +189F8;TANGUT COMPONENT-505;Lo;0;L;;;;;N;;;;; +189F9;TANGUT COMPONENT-506;Lo;0;L;;;;;N;;;;; +189FA;TANGUT COMPONENT-507;Lo;0;L;;;;;N;;;;; +189FB;TANGUT COMPONENT-508;Lo;0;L;;;;;N;;;;; +189FC;TANGUT COMPONENT-509;Lo;0;L;;;;;N;;;;; +189FD;TANGUT COMPONENT-510;Lo;0;L;;;;;N;;;;; +189FE;TANGUT COMPONENT-511;Lo;0;L;;;;;N;;;;; +189FF;TANGUT COMPONENT-512;Lo;0;L;;;;;N;;;;; +18A00;TANGUT COMPONENT-513;Lo;0;L;;;;;N;;;;; +18A01;TANGUT COMPONENT-514;Lo;0;L;;;;;N;;;;; +18A02;TANGUT COMPONENT-515;Lo;0;L;;;;;N;;;;; +18A03;TANGUT COMPONENT-516;Lo;0;L;;;;;N;;;;; +18A04;TANGUT COMPONENT-517;Lo;0;L;;;;;N;;;;; +18A05;TANGUT COMPONENT-518;Lo;0;L;;;;;N;;;;; +18A06;TANGUT COMPONENT-519;Lo;0;L;;;;;N;;;;; +18A07;TANGUT COMPONENT-520;Lo;0;L;;;;;N;;;;; +18A08;TANGUT COMPONENT-521;Lo;0;L;;;;;N;;;;; +18A09;TANGUT COMPONENT-522;Lo;0;L;;;;;N;;;;; +18A0A;TANGUT COMPONENT-523;Lo;0;L;;;;;N;;;;; +18A0B;TANGUT COMPONENT-524;Lo;0;L;;;;;N;;;;; +18A0C;TANGUT COMPONENT-525;Lo;0;L;;;;;N;;;;; +18A0D;TANGUT COMPONENT-526;Lo;0;L;;;;;N;;;;; +18A0E;TANGUT COMPONENT-527;Lo;0;L;;;;;N;;;;; +18A0F;TANGUT COMPONENT-528;Lo;0;L;;;;;N;;;;; +18A10;TANGUT COMPONENT-529;Lo;0;L;;;;;N;;;;; +18A11;TANGUT COMPONENT-530;Lo;0;L;;;;;N;;;;; +18A12;TANGUT COMPONENT-531;Lo;0;L;;;;;N;;;;; +18A13;TANGUT COMPONENT-532;Lo;0;L;;;;;N;;;;; +18A14;TANGUT COMPONENT-533;Lo;0;L;;;;;N;;;;; +18A15;TANGUT COMPONENT-534;Lo;0;L;;;;;N;;;;; +18A16;TANGUT COMPONENT-535;Lo;0;L;;;;;N;;;;; +18A17;TANGUT COMPONENT-536;Lo;0;L;;;;;N;;;;; +18A18;TANGUT COMPONENT-537;Lo;0;L;;;;;N;;;;; +18A19;TANGUT COMPONENT-538;Lo;0;L;;;;;N;;;;; +18A1A;TANGUT COMPONENT-539;Lo;0;L;;;;;N;;;;; +18A1B;TANGUT COMPONENT-540;Lo;0;L;;;;;N;;;;; +18A1C;TANGUT COMPONENT-541;Lo;0;L;;;;;N;;;;; +18A1D;TANGUT COMPONENT-542;Lo;0;L;;;;;N;;;;; +18A1E;TANGUT COMPONENT-543;Lo;0;L;;;;;N;;;;; +18A1F;TANGUT COMPONENT-544;Lo;0;L;;;;;N;;;;; +18A20;TANGUT COMPONENT-545;Lo;0;L;;;;;N;;;;; +18A21;TANGUT COMPONENT-546;Lo;0;L;;;;;N;;;;; +18A22;TANGUT COMPONENT-547;Lo;0;L;;;;;N;;;;; +18A23;TANGUT COMPONENT-548;Lo;0;L;;;;;N;;;;; +18A24;TANGUT COMPONENT-549;Lo;0;L;;;;;N;;;;; +18A25;TANGUT COMPONENT-550;Lo;0;L;;;;;N;;;;; +18A26;TANGUT COMPONENT-551;Lo;0;L;;;;;N;;;;; +18A27;TANGUT COMPONENT-552;Lo;0;L;;;;;N;;;;; +18A28;TANGUT COMPONENT-553;Lo;0;L;;;;;N;;;;; +18A29;TANGUT COMPONENT-554;Lo;0;L;;;;;N;;;;; +18A2A;TANGUT COMPONENT-555;Lo;0;L;;;;;N;;;;; +18A2B;TANGUT COMPONENT-556;Lo;0;L;;;;;N;;;;; +18A2C;TANGUT COMPONENT-557;Lo;0;L;;;;;N;;;;; +18A2D;TANGUT COMPONENT-558;Lo;0;L;;;;;N;;;;; +18A2E;TANGUT COMPONENT-559;Lo;0;L;;;;;N;;;;; +18A2F;TANGUT COMPONENT-560;Lo;0;L;;;;;N;;;;; +18A30;TANGUT COMPONENT-561;Lo;0;L;;;;;N;;;;; +18A31;TANGUT COMPONENT-562;Lo;0;L;;;;;N;;;;; +18A32;TANGUT COMPONENT-563;Lo;0;L;;;;;N;;;;; +18A33;TANGUT COMPONENT-564;Lo;0;L;;;;;N;;;;; +18A34;TANGUT COMPONENT-565;Lo;0;L;;;;;N;;;;; +18A35;TANGUT COMPONENT-566;Lo;0;L;;;;;N;;;;; +18A36;TANGUT COMPONENT-567;Lo;0;L;;;;;N;;;;; +18A37;TANGUT COMPONENT-568;Lo;0;L;;;;;N;;;;; +18A38;TANGUT COMPONENT-569;Lo;0;L;;;;;N;;;;; +18A39;TANGUT COMPONENT-570;Lo;0;L;;;;;N;;;;; +18A3A;TANGUT COMPONENT-571;Lo;0;L;;;;;N;;;;; +18A3B;TANGUT COMPONENT-572;Lo;0;L;;;;;N;;;;; +18A3C;TANGUT COMPONENT-573;Lo;0;L;;;;;N;;;;; +18A3D;TANGUT COMPONENT-574;Lo;0;L;;;;;N;;;;; +18A3E;TANGUT COMPONENT-575;Lo;0;L;;;;;N;;;;; +18A3F;TANGUT COMPONENT-576;Lo;0;L;;;;;N;;;;; +18A40;TANGUT COMPONENT-577;Lo;0;L;;;;;N;;;;; +18A41;TANGUT COMPONENT-578;Lo;0;L;;;;;N;;;;; +18A42;TANGUT COMPONENT-579;Lo;0;L;;;;;N;;;;; +18A43;TANGUT COMPONENT-580;Lo;0;L;;;;;N;;;;; +18A44;TANGUT COMPONENT-581;Lo;0;L;;;;;N;;;;; +18A45;TANGUT COMPONENT-582;Lo;0;L;;;;;N;;;;; +18A46;TANGUT COMPONENT-583;Lo;0;L;;;;;N;;;;; +18A47;TANGUT COMPONENT-584;Lo;0;L;;;;;N;;;;; +18A48;TANGUT COMPONENT-585;Lo;0;L;;;;;N;;;;; +18A49;TANGUT COMPONENT-586;Lo;0;L;;;;;N;;;;; +18A4A;TANGUT COMPONENT-587;Lo;0;L;;;;;N;;;;; +18A4B;TANGUT COMPONENT-588;Lo;0;L;;;;;N;;;;; +18A4C;TANGUT COMPONENT-589;Lo;0;L;;;;;N;;;;; +18A4D;TANGUT COMPONENT-590;Lo;0;L;;;;;N;;;;; +18A4E;TANGUT COMPONENT-591;Lo;0;L;;;;;N;;;;; +18A4F;TANGUT COMPONENT-592;Lo;0;L;;;;;N;;;;; +18A50;TANGUT COMPONENT-593;Lo;0;L;;;;;N;;;;; +18A51;TANGUT COMPONENT-594;Lo;0;L;;;;;N;;;;; +18A52;TANGUT COMPONENT-595;Lo;0;L;;;;;N;;;;; +18A53;TANGUT COMPONENT-596;Lo;0;L;;;;;N;;;;; +18A54;TANGUT COMPONENT-597;Lo;0;L;;;;;N;;;;; +18A55;TANGUT COMPONENT-598;Lo;0;L;;;;;N;;;;; +18A56;TANGUT COMPONENT-599;Lo;0;L;;;;;N;;;;; +18A57;TANGUT COMPONENT-600;Lo;0;L;;;;;N;;;;; +18A58;TANGUT COMPONENT-601;Lo;0;L;;;;;N;;;;; +18A59;TANGUT COMPONENT-602;Lo;0;L;;;;;N;;;;; +18A5A;TANGUT COMPONENT-603;Lo;0;L;;;;;N;;;;; +18A5B;TANGUT COMPONENT-604;Lo;0;L;;;;;N;;;;; +18A5C;TANGUT COMPONENT-605;Lo;0;L;;;;;N;;;;; +18A5D;TANGUT COMPONENT-606;Lo;0;L;;;;;N;;;;; +18A5E;TANGUT COMPONENT-607;Lo;0;L;;;;;N;;;;; +18A5F;TANGUT COMPONENT-608;Lo;0;L;;;;;N;;;;; +18A60;TANGUT COMPONENT-609;Lo;0;L;;;;;N;;;;; +18A61;TANGUT COMPONENT-610;Lo;0;L;;;;;N;;;;; +18A62;TANGUT COMPONENT-611;Lo;0;L;;;;;N;;;;; +18A63;TANGUT COMPONENT-612;Lo;0;L;;;;;N;;;;; +18A64;TANGUT COMPONENT-613;Lo;0;L;;;;;N;;;;; +18A65;TANGUT COMPONENT-614;Lo;0;L;;;;;N;;;;; +18A66;TANGUT COMPONENT-615;Lo;0;L;;;;;N;;;;; +18A67;TANGUT COMPONENT-616;Lo;0;L;;;;;N;;;;; +18A68;TANGUT COMPONENT-617;Lo;0;L;;;;;N;;;;; +18A69;TANGUT COMPONENT-618;Lo;0;L;;;;;N;;;;; +18A6A;TANGUT COMPONENT-619;Lo;0;L;;;;;N;;;;; +18A6B;TANGUT COMPONENT-620;Lo;0;L;;;;;N;;;;; +18A6C;TANGUT COMPONENT-621;Lo;0;L;;;;;N;;;;; +18A6D;TANGUT COMPONENT-622;Lo;0;L;;;;;N;;;;; +18A6E;TANGUT COMPONENT-623;Lo;0;L;;;;;N;;;;; +18A6F;TANGUT COMPONENT-624;Lo;0;L;;;;;N;;;;; +18A70;TANGUT COMPONENT-625;Lo;0;L;;;;;N;;;;; +18A71;TANGUT COMPONENT-626;Lo;0;L;;;;;N;;;;; +18A72;TANGUT COMPONENT-627;Lo;0;L;;;;;N;;;;; +18A73;TANGUT COMPONENT-628;Lo;0;L;;;;;N;;;;; +18A74;TANGUT COMPONENT-629;Lo;0;L;;;;;N;;;;; +18A75;TANGUT COMPONENT-630;Lo;0;L;;;;;N;;;;; +18A76;TANGUT COMPONENT-631;Lo;0;L;;;;;N;;;;; +18A77;TANGUT COMPONENT-632;Lo;0;L;;;;;N;;;;; +18A78;TANGUT COMPONENT-633;Lo;0;L;;;;;N;;;;; +18A79;TANGUT COMPONENT-634;Lo;0;L;;;;;N;;;;; +18A7A;TANGUT COMPONENT-635;Lo;0;L;;;;;N;;;;; +18A7B;TANGUT COMPONENT-636;Lo;0;L;;;;;N;;;;; +18A7C;TANGUT COMPONENT-637;Lo;0;L;;;;;N;;;;; +18A7D;TANGUT COMPONENT-638;Lo;0;L;;;;;N;;;;; +18A7E;TANGUT COMPONENT-639;Lo;0;L;;;;;N;;;;; +18A7F;TANGUT COMPONENT-640;Lo;0;L;;;;;N;;;;; +18A80;TANGUT COMPONENT-641;Lo;0;L;;;;;N;;;;; +18A81;TANGUT COMPONENT-642;Lo;0;L;;;;;N;;;;; +18A82;TANGUT COMPONENT-643;Lo;0;L;;;;;N;;;;; +18A83;TANGUT COMPONENT-644;Lo;0;L;;;;;N;;;;; +18A84;TANGUT COMPONENT-645;Lo;0;L;;;;;N;;;;; +18A85;TANGUT COMPONENT-646;Lo;0;L;;;;;N;;;;; +18A86;TANGUT COMPONENT-647;Lo;0;L;;;;;N;;;;; +18A87;TANGUT COMPONENT-648;Lo;0;L;;;;;N;;;;; +18A88;TANGUT COMPONENT-649;Lo;0;L;;;;;N;;;;; +18A89;TANGUT COMPONENT-650;Lo;0;L;;;;;N;;;;; +18A8A;TANGUT COMPONENT-651;Lo;0;L;;;;;N;;;;; +18A8B;TANGUT COMPONENT-652;Lo;0;L;;;;;N;;;;; +18A8C;TANGUT COMPONENT-653;Lo;0;L;;;;;N;;;;; +18A8D;TANGUT COMPONENT-654;Lo;0;L;;;;;N;;;;; +18A8E;TANGUT COMPONENT-655;Lo;0;L;;;;;N;;;;; +18A8F;TANGUT COMPONENT-656;Lo;0;L;;;;;N;;;;; +18A90;TANGUT COMPONENT-657;Lo;0;L;;;;;N;;;;; +18A91;TANGUT COMPONENT-658;Lo;0;L;;;;;N;;;;; +18A92;TANGUT COMPONENT-659;Lo;0;L;;;;;N;;;;; +18A93;TANGUT COMPONENT-660;Lo;0;L;;;;;N;;;;; +18A94;TANGUT COMPONENT-661;Lo;0;L;;;;;N;;;;; +18A95;TANGUT COMPONENT-662;Lo;0;L;;;;;N;;;;; +18A96;TANGUT COMPONENT-663;Lo;0;L;;;;;N;;;;; +18A97;TANGUT COMPONENT-664;Lo;0;L;;;;;N;;;;; +18A98;TANGUT COMPONENT-665;Lo;0;L;;;;;N;;;;; +18A99;TANGUT COMPONENT-666;Lo;0;L;;;;;N;;;;; +18A9A;TANGUT COMPONENT-667;Lo;0;L;;;;;N;;;;; +18A9B;TANGUT COMPONENT-668;Lo;0;L;;;;;N;;;;; +18A9C;TANGUT COMPONENT-669;Lo;0;L;;;;;N;;;;; +18A9D;TANGUT COMPONENT-670;Lo;0;L;;;;;N;;;;; +18A9E;TANGUT COMPONENT-671;Lo;0;L;;;;;N;;;;; +18A9F;TANGUT COMPONENT-672;Lo;0;L;;;;;N;;;;; +18AA0;TANGUT COMPONENT-673;Lo;0;L;;;;;N;;;;; +18AA1;TANGUT COMPONENT-674;Lo;0;L;;;;;N;;;;; +18AA2;TANGUT COMPONENT-675;Lo;0;L;;;;;N;;;;; +18AA3;TANGUT COMPONENT-676;Lo;0;L;;;;;N;;;;; +18AA4;TANGUT COMPONENT-677;Lo;0;L;;;;;N;;;;; +18AA5;TANGUT COMPONENT-678;Lo;0;L;;;;;N;;;;; +18AA6;TANGUT COMPONENT-679;Lo;0;L;;;;;N;;;;; +18AA7;TANGUT COMPONENT-680;Lo;0;L;;;;;N;;;;; +18AA8;TANGUT COMPONENT-681;Lo;0;L;;;;;N;;;;; +18AA9;TANGUT COMPONENT-682;Lo;0;L;;;;;N;;;;; +18AAA;TANGUT COMPONENT-683;Lo;0;L;;;;;N;;;;; +18AAB;TANGUT COMPONENT-684;Lo;0;L;;;;;N;;;;; +18AAC;TANGUT COMPONENT-685;Lo;0;L;;;;;N;;;;; +18AAD;TANGUT COMPONENT-686;Lo;0;L;;;;;N;;;;; +18AAE;TANGUT COMPONENT-687;Lo;0;L;;;;;N;;;;; +18AAF;TANGUT COMPONENT-688;Lo;0;L;;;;;N;;;;; +18AB0;TANGUT COMPONENT-689;Lo;0;L;;;;;N;;;;; +18AB1;TANGUT COMPONENT-690;Lo;0;L;;;;;N;;;;; +18AB2;TANGUT COMPONENT-691;Lo;0;L;;;;;N;;;;; +18AB3;TANGUT COMPONENT-692;Lo;0;L;;;;;N;;;;; +18AB4;TANGUT COMPONENT-693;Lo;0;L;;;;;N;;;;; +18AB5;TANGUT COMPONENT-694;Lo;0;L;;;;;N;;;;; +18AB6;TANGUT COMPONENT-695;Lo;0;L;;;;;N;;;;; +18AB7;TANGUT COMPONENT-696;Lo;0;L;;;;;N;;;;; +18AB8;TANGUT COMPONENT-697;Lo;0;L;;;;;N;;;;; +18AB9;TANGUT COMPONENT-698;Lo;0;L;;;;;N;;;;; +18ABA;TANGUT COMPONENT-699;Lo;0;L;;;;;N;;;;; +18ABB;TANGUT COMPONENT-700;Lo;0;L;;;;;N;;;;; +18ABC;TANGUT COMPONENT-701;Lo;0;L;;;;;N;;;;; +18ABD;TANGUT COMPONENT-702;Lo;0;L;;;;;N;;;;; +18ABE;TANGUT COMPONENT-703;Lo;0;L;;;;;N;;;;; +18ABF;TANGUT COMPONENT-704;Lo;0;L;;;;;N;;;;; +18AC0;TANGUT COMPONENT-705;Lo;0;L;;;;;N;;;;; +18AC1;TANGUT COMPONENT-706;Lo;0;L;;;;;N;;;;; +18AC2;TANGUT COMPONENT-707;Lo;0;L;;;;;N;;;;; +18AC3;TANGUT COMPONENT-708;Lo;0;L;;;;;N;;;;; +18AC4;TANGUT COMPONENT-709;Lo;0;L;;;;;N;;;;; +18AC5;TANGUT COMPONENT-710;Lo;0;L;;;;;N;;;;; +18AC6;TANGUT COMPONENT-711;Lo;0;L;;;;;N;;;;; +18AC7;TANGUT COMPONENT-712;Lo;0;L;;;;;N;;;;; +18AC8;TANGUT COMPONENT-713;Lo;0;L;;;;;N;;;;; +18AC9;TANGUT COMPONENT-714;Lo;0;L;;;;;N;;;;; +18ACA;TANGUT COMPONENT-715;Lo;0;L;;;;;N;;;;; +18ACB;TANGUT COMPONENT-716;Lo;0;L;;;;;N;;;;; +18ACC;TANGUT COMPONENT-717;Lo;0;L;;;;;N;;;;; +18ACD;TANGUT COMPONENT-718;Lo;0;L;;;;;N;;;;; +18ACE;TANGUT COMPONENT-719;Lo;0;L;;;;;N;;;;; +18ACF;TANGUT COMPONENT-720;Lo;0;L;;;;;N;;;;; +18AD0;TANGUT COMPONENT-721;Lo;0;L;;;;;N;;;;; +18AD1;TANGUT COMPONENT-722;Lo;0;L;;;;;N;;;;; +18AD2;TANGUT COMPONENT-723;Lo;0;L;;;;;N;;;;; +18AD3;TANGUT COMPONENT-724;Lo;0;L;;;;;N;;;;; +18AD4;TANGUT COMPONENT-725;Lo;0;L;;;;;N;;;;; +18AD5;TANGUT COMPONENT-726;Lo;0;L;;;;;N;;;;; +18AD6;TANGUT COMPONENT-727;Lo;0;L;;;;;N;;;;; +18AD7;TANGUT COMPONENT-728;Lo;0;L;;;;;N;;;;; +18AD8;TANGUT COMPONENT-729;Lo;0;L;;;;;N;;;;; +18AD9;TANGUT COMPONENT-730;Lo;0;L;;;;;N;;;;; +18ADA;TANGUT COMPONENT-731;Lo;0;L;;;;;N;;;;; +18ADB;TANGUT COMPONENT-732;Lo;0;L;;;;;N;;;;; +18ADC;TANGUT COMPONENT-733;Lo;0;L;;;;;N;;;;; +18ADD;TANGUT COMPONENT-734;Lo;0;L;;;;;N;;;;; +18ADE;TANGUT COMPONENT-735;Lo;0;L;;;;;N;;;;; +18ADF;TANGUT COMPONENT-736;Lo;0;L;;;;;N;;;;; +18AE0;TANGUT COMPONENT-737;Lo;0;L;;;;;N;;;;; +18AE1;TANGUT COMPONENT-738;Lo;0;L;;;;;N;;;;; +18AE2;TANGUT COMPONENT-739;Lo;0;L;;;;;N;;;;; +18AE3;TANGUT COMPONENT-740;Lo;0;L;;;;;N;;;;; +18AE4;TANGUT COMPONENT-741;Lo;0;L;;;;;N;;;;; +18AE5;TANGUT COMPONENT-742;Lo;0;L;;;;;N;;;;; +18AE6;TANGUT COMPONENT-743;Lo;0;L;;;;;N;;;;; +18AE7;TANGUT COMPONENT-744;Lo;0;L;;;;;N;;;;; +18AE8;TANGUT COMPONENT-745;Lo;0;L;;;;;N;;;;; +18AE9;TANGUT COMPONENT-746;Lo;0;L;;;;;N;;;;; +18AEA;TANGUT COMPONENT-747;Lo;0;L;;;;;N;;;;; +18AEB;TANGUT COMPONENT-748;Lo;0;L;;;;;N;;;;; +18AEC;TANGUT COMPONENT-749;Lo;0;L;;;;;N;;;;; +18AED;TANGUT COMPONENT-750;Lo;0;L;;;;;N;;;;; +18AEE;TANGUT COMPONENT-751;Lo;0;L;;;;;N;;;;; +18AEF;TANGUT COMPONENT-752;Lo;0;L;;;;;N;;;;; +18AF0;TANGUT COMPONENT-753;Lo;0;L;;;;;N;;;;; +18AF1;TANGUT COMPONENT-754;Lo;0;L;;;;;N;;;;; +18AF2;TANGUT COMPONENT-755;Lo;0;L;;;;;N;;;;; 1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; 1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; 1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; @@ -26154,6 +27313,44 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; 1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; 1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; +1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;; +1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;; +1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;; +1E003;COMBINING GLAGOLITIC LETTER GLAGOLI;Mn;230;NSM;;;;;N;;;;; +1E004;COMBINING GLAGOLITIC LETTER DOBRO;Mn;230;NSM;;;;;N;;;;; +1E005;COMBINING GLAGOLITIC LETTER YESTU;Mn;230;NSM;;;;;N;;;;; +1E006;COMBINING GLAGOLITIC LETTER ZHIVETE;Mn;230;NSM;;;;;N;;;;; +1E008;COMBINING GLAGOLITIC LETTER ZEMLJA;Mn;230;NSM;;;;;N;;;;; +1E009;COMBINING GLAGOLITIC LETTER IZHE;Mn;230;NSM;;;;;N;;;;; +1E00A;COMBINING GLAGOLITIC LETTER INITIAL IZHE;Mn;230;NSM;;;;;N;;;;; +1E00B;COMBINING GLAGOLITIC LETTER I;Mn;230;NSM;;;;;N;;;;; +1E00C;COMBINING GLAGOLITIC LETTER DJERVI;Mn;230;NSM;;;;;N;;;;; +1E00D;COMBINING GLAGOLITIC LETTER KAKO;Mn;230;NSM;;;;;N;;;;; +1E00E;COMBINING GLAGOLITIC LETTER LJUDIJE;Mn;230;NSM;;;;;N;;;;; +1E00F;COMBINING GLAGOLITIC LETTER MYSLITE;Mn;230;NSM;;;;;N;;;;; +1E010;COMBINING GLAGOLITIC LETTER NASHI;Mn;230;NSM;;;;;N;;;;; +1E011;COMBINING GLAGOLITIC LETTER ONU;Mn;230;NSM;;;;;N;;;;; +1E012;COMBINING GLAGOLITIC LETTER POKOJI;Mn;230;NSM;;;;;N;;;;; +1E013;COMBINING GLAGOLITIC LETTER RITSI;Mn;230;NSM;;;;;N;;;;; +1E014;COMBINING GLAGOLITIC LETTER SLOVO;Mn;230;NSM;;;;;N;;;;; +1E015;COMBINING GLAGOLITIC LETTER TVRIDO;Mn;230;NSM;;;;;N;;;;; +1E016;COMBINING GLAGOLITIC LETTER UKU;Mn;230;NSM;;;;;N;;;;; +1E017;COMBINING GLAGOLITIC LETTER FRITU;Mn;230;NSM;;;;;N;;;;; +1E018;COMBINING GLAGOLITIC LETTER HERU;Mn;230;NSM;;;;;N;;;;; +1E01B;COMBINING GLAGOLITIC LETTER SHTA;Mn;230;NSM;;;;;N;;;;; +1E01C;COMBINING GLAGOLITIC LETTER TSI;Mn;230;NSM;;;;;N;;;;; +1E01D;COMBINING GLAGOLITIC LETTER CHRIVI;Mn;230;NSM;;;;;N;;;;; +1E01E;COMBINING GLAGOLITIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +1E01F;COMBINING GLAGOLITIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +1E020;COMBINING GLAGOLITIC LETTER YERI;Mn;230;NSM;;;;;N;;;;; +1E021;COMBINING GLAGOLITIC LETTER YATI;Mn;230;NSM;;;;;N;;;;; +1E023;COMBINING GLAGOLITIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +1E024;COMBINING GLAGOLITIC LETTER SMALL YUS;Mn;230;NSM;;;;;N;;;;; +1E026;COMBINING GLAGOLITIC LETTER YO;Mn;230;NSM;;;;;N;;;;; +1E027;COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS;Mn;230;NSM;;;;;N;;;;; +1E028;COMBINING GLAGOLITIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +1E029;COMBINING GLAGOLITIC LETTER IOTATED BIG YUS;Mn;230;NSM;;;;;N;;;;; +1E02A;COMBINING GLAGOLITIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; 1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; 1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; 1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; @@ -26367,6 +27564,93 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; 1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; 1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; +1E900;ADLAM CAPITAL LETTER ALIF;Lu;0;R;;;;;N;;;;1E922; +1E901;ADLAM CAPITAL LETTER DAALI;Lu;0;R;;;;;N;;;;1E923; +1E902;ADLAM CAPITAL LETTER LAAM;Lu;0;R;;;;;N;;;;1E924; +1E903;ADLAM CAPITAL LETTER MIIM;Lu;0;R;;;;;N;;;;1E925; +1E904;ADLAM CAPITAL LETTER BA;Lu;0;R;;;;;N;;;;1E926; +1E905;ADLAM CAPITAL LETTER SINNYIIYHE;Lu;0;R;;;;;N;;;;1E927; +1E906;ADLAM CAPITAL LETTER PE;Lu;0;R;;;;;N;;;;1E928; +1E907;ADLAM CAPITAL LETTER BHE;Lu;0;R;;;;;N;;;;1E929; +1E908;ADLAM CAPITAL LETTER RA;Lu;0;R;;;;;N;;;;1E92A; +1E909;ADLAM CAPITAL LETTER E;Lu;0;R;;;;;N;;;;1E92B; +1E90A;ADLAM CAPITAL LETTER FA;Lu;0;R;;;;;N;;;;1E92C; +1E90B;ADLAM CAPITAL LETTER I;Lu;0;R;;;;;N;;;;1E92D; +1E90C;ADLAM CAPITAL LETTER O;Lu;0;R;;;;;N;;;;1E92E; +1E90D;ADLAM CAPITAL LETTER DHA;Lu;0;R;;;;;N;;;;1E92F; +1E90E;ADLAM CAPITAL LETTER YHE;Lu;0;R;;;;;N;;;;1E930; +1E90F;ADLAM CAPITAL LETTER WAW;Lu;0;R;;;;;N;;;;1E931; +1E910;ADLAM CAPITAL LETTER NUN;Lu;0;R;;;;;N;;;;1E932; +1E911;ADLAM CAPITAL LETTER KAF;Lu;0;R;;;;;N;;;;1E933; +1E912;ADLAM CAPITAL LETTER YA;Lu;0;R;;;;;N;;;;1E934; +1E913;ADLAM CAPITAL LETTER U;Lu;0;R;;;;;N;;;;1E935; +1E914;ADLAM CAPITAL LETTER JIIM;Lu;0;R;;;;;N;;;;1E936; +1E915;ADLAM CAPITAL LETTER CHI;Lu;0;R;;;;;N;;;;1E937; +1E916;ADLAM CAPITAL LETTER HA;Lu;0;R;;;;;N;;;;1E938; +1E917;ADLAM CAPITAL LETTER QAAF;Lu;0;R;;;;;N;;;;1E939; +1E918;ADLAM CAPITAL LETTER GA;Lu;0;R;;;;;N;;;;1E93A; +1E919;ADLAM CAPITAL LETTER NYA;Lu;0;R;;;;;N;;;;1E93B; +1E91A;ADLAM CAPITAL LETTER TU;Lu;0;R;;;;;N;;;;1E93C; +1E91B;ADLAM CAPITAL LETTER NHA;Lu;0;R;;;;;N;;;;1E93D; +1E91C;ADLAM CAPITAL LETTER VA;Lu;0;R;;;;;N;;;;1E93E; +1E91D;ADLAM CAPITAL LETTER KHA;Lu;0;R;;;;;N;;;;1E93F; +1E91E;ADLAM CAPITAL LETTER GBE;Lu;0;R;;;;;N;;;;1E940; +1E91F;ADLAM CAPITAL LETTER ZAL;Lu;0;R;;;;;N;;;;1E941; +1E920;ADLAM CAPITAL LETTER KPO;Lu;0;R;;;;;N;;;;1E942; +1E921;ADLAM CAPITAL LETTER SHA;Lu;0;R;;;;;N;;;;1E943; +1E922;ADLAM SMALL LETTER ALIF;Ll;0;R;;;;;N;;;1E900;;1E900 +1E923;ADLAM SMALL LETTER DAALI;Ll;0;R;;;;;N;;;1E901;;1E901 +1E924;ADLAM SMALL LETTER LAAM;Ll;0;R;;;;;N;;;1E902;;1E902 +1E925;ADLAM SMALL LETTER MIIM;Ll;0;R;;;;;N;;;1E903;;1E903 +1E926;ADLAM SMALL LETTER BA;Ll;0;R;;;;;N;;;1E904;;1E904 +1E927;ADLAM SMALL LETTER SINNYIIYHE;Ll;0;R;;;;;N;;;1E905;;1E905 +1E928;ADLAM SMALL LETTER PE;Ll;0;R;;;;;N;;;1E906;;1E906 +1E929;ADLAM SMALL LETTER BHE;Ll;0;R;;;;;N;;;1E907;;1E907 +1E92A;ADLAM SMALL LETTER RA;Ll;0;R;;;;;N;;;1E908;;1E908 +1E92B;ADLAM SMALL LETTER E;Ll;0;R;;;;;N;;;1E909;;1E909 +1E92C;ADLAM SMALL LETTER FA;Ll;0;R;;;;;N;;;1E90A;;1E90A +1E92D;ADLAM SMALL LETTER I;Ll;0;R;;;;;N;;;1E90B;;1E90B +1E92E;ADLAM SMALL LETTER O;Ll;0;R;;;;;N;;;1E90C;;1E90C +1E92F;ADLAM SMALL LETTER DHA;Ll;0;R;;;;;N;;;1E90D;;1E90D +1E930;ADLAM SMALL LETTER YHE;Ll;0;R;;;;;N;;;1E90E;;1E90E +1E931;ADLAM SMALL LETTER WAW;Ll;0;R;;;;;N;;;1E90F;;1E90F +1E932;ADLAM SMALL LETTER NUN;Ll;0;R;;;;;N;;;1E910;;1E910 +1E933;ADLAM SMALL LETTER KAF;Ll;0;R;;;;;N;;;1E911;;1E911 +1E934;ADLAM SMALL LETTER YA;Ll;0;R;;;;;N;;;1E912;;1E912 +1E935;ADLAM SMALL LETTER U;Ll;0;R;;;;;N;;;1E913;;1E913 +1E936;ADLAM SMALL LETTER JIIM;Ll;0;R;;;;;N;;;1E914;;1E914 +1E937;ADLAM SMALL LETTER CHI;Ll;0;R;;;;;N;;;1E915;;1E915 +1E938;ADLAM SMALL LETTER HA;Ll;0;R;;;;;N;;;1E916;;1E916 +1E939;ADLAM SMALL LETTER QAAF;Ll;0;R;;;;;N;;;1E917;;1E917 +1E93A;ADLAM SMALL LETTER GA;Ll;0;R;;;;;N;;;1E918;;1E918 +1E93B;ADLAM SMALL LETTER NYA;Ll;0;R;;;;;N;;;1E919;;1E919 +1E93C;ADLAM SMALL LETTER TU;Ll;0;R;;;;;N;;;1E91A;;1E91A +1E93D;ADLAM SMALL LETTER NHA;Ll;0;R;;;;;N;;;1E91B;;1E91B +1E93E;ADLAM SMALL LETTER VA;Ll;0;R;;;;;N;;;1E91C;;1E91C +1E93F;ADLAM SMALL LETTER KHA;Ll;0;R;;;;;N;;;1E91D;;1E91D +1E940;ADLAM SMALL LETTER GBE;Ll;0;R;;;;;N;;;1E91E;;1E91E +1E941;ADLAM SMALL LETTER ZAL;Ll;0;R;;;;;N;;;1E91F;;1E91F +1E942;ADLAM SMALL LETTER KPO;Ll;0;R;;;;;N;;;1E920;;1E920 +1E943;ADLAM SMALL LETTER SHA;Ll;0;R;;;;;N;;;1E921;;1E921 +1E944;ADLAM ALIF LENGTHENER;Mn;230;NSM;;;;;N;;;;; +1E945;ADLAM VOWEL LENGTHENER;Mn;230;NSM;;;;;N;;;;; +1E946;ADLAM GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1E947;ADLAM HAMZA;Mn;230;NSM;;;;;N;;;;; +1E948;ADLAM CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; +1E949;ADLAM GEMINATE CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; +1E94A;ADLAM NUKTA;Mn;7;NSM;;;;;N;;;;; +1E950;ADLAM DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +1E951;ADLAM DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +1E952;ADLAM DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +1E953;ADLAM DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +1E954;ADLAM DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +1E955;ADLAM DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +1E956;ADLAM DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +1E957;ADLAM DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +1E958;ADLAM DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +1E959;ADLAM DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +1E95E;ADLAM INITIAL EXCLAMATION MARK;Po;0;R;;;;;N;;;;; +1E95F;ADLAM INITIAL QUESTION MARK;Po;0;R;;;;;N;;;;; 1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL;<font> 0627;;;;N;;;;; 1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;; 1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; @@ -26883,6 +28167,24 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F198;SQUARED SOS;So;0;L;;;;;N;;;;; 1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; 1F19A;SQUARED VS;So;0;L;;;;;N;;;;; +1F19B;SQUARED THREE D;So;0;L;;;;;N;;;;; +1F19C;SQUARED SECOND SCREEN;So;0;L;;;;;N;;;;; +1F19D;SQUARED TWO K;So;0;L;;;;;N;;;;; +1F19E;SQUARED FOUR K;So;0;L;;;;;N;;;;; +1F19F;SQUARED EIGHT K;So;0;L;;;;;N;;;;; +1F1A0;SQUARED FIVE POINT ONE;So;0;L;;;;;N;;;;; +1F1A1;SQUARED SEVEN POINT ONE;So;0;L;;;;;N;;;;; +1F1A2;SQUARED TWENTY-TWO POINT TWO;So;0;L;;;;;N;;;;; +1F1A3;SQUARED SIXTY P;So;0;L;;;;;N;;;;; +1F1A4;SQUARED ONE HUNDRED TWENTY P;So;0;L;;;;;N;;;;; +1F1A5;SQUARED LATIN SMALL LETTER D;So;0;L;;;;;N;;;;; +1F1A6;SQUARED HC;So;0;L;;;;;N;;;;; +1F1A7;SQUARED HDR;So;0;L;;;;;N;;;;; +1F1A8;SQUARED HI-RES;So;0;L;;;;;N;;;;; +1F1A9;SQUARED LOSSLESS;So;0;L;;;;;N;;;;; +1F1AA;SQUARED SHV;So;0;L;;;;;N;;;;; +1F1AB;SQUARED UHD;So;0;L;;;;;N;;;;; +1F1AC;SQUARED VOD;So;0;L;;;;;N;;;;; 1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; 1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; 1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; @@ -26955,6 +28257,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L;<square> 7533;;;;N;;;;; 1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L;<square> 5272;;;;N;;;;; 1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L;<square> 55B6;;;;N;;;;; +1F23B;SQUARED CJK UNIFIED IDEOGRAPH-914D;So;0;L;<square> 914D;;;;N;;;;; 1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L;<compat> 3014 672C 3015;;;;N;;;;; 1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<compat> 3014 4E09 3015;;;;N;;;;; 1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<compat> 3014 4E8C 3015;;;;N;;;;; @@ -27600,6 +28903,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F577;SPIDER;So;0;ON;;;;;N;;;;; 1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; 1F579;JOYSTICK;So;0;ON;;;;;N;;;;; +1F57A;MAN DANCING;So;0;ON;;;;;N;;;;; 1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; 1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; 1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; @@ -27641,6 +28945,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; 1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; 1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A4;BLACK HEART;So;0;ON;;;;;N;;;;; 1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; 1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; 1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; @@ -27941,6 +29246,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; 1F6CF;BED;So;0;ON;;;;;N;;;;; 1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; +1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;; +1F6D2;SHOPPING TROLLEY;So;0;ON;;;;;N;;;;; 1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; 1F6E1;SHIELD;So;0;ON;;;;;N;;;;; 1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; @@ -27958,6 +29265,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; 1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; 1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; +1F6F4;SCOOTER;So;0;ON;;;;;N;;;;; +1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;; +1F6F6;CANOE;So;0;ON;;;;;N;;;;; 1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; 1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; 1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; @@ -28316,11 +29626,78 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; 1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; 1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; +1F919;CALL ME HAND;So;0;ON;;;;;N;;;;; +1F91A;RAISED BACK OF HAND;So;0;ON;;;;;N;;;;; +1F91B;LEFT-FACING FIST;So;0;ON;;;;;N;;;;; +1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;; +1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;; +1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;; +1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;; +1F921;CLOWN FACE;So;0;ON;;;;;N;;;;; +1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;; +1F923;ROLLING ON THE FLOOR LAUGHING;So;0;ON;;;;;N;;;;; +1F924;DROOLING FACE;So;0;ON;;;;;N;;;;; +1F925;LYING FACE;So;0;ON;;;;;N;;;;; +1F926;FACE PALM;So;0;ON;;;;;N;;;;; +1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;; +1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;; +1F933;SELFIE;So;0;ON;;;;;N;;;;; +1F934;PRINCE;So;0;ON;;;;;N;;;;; +1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;; +1F936;MOTHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F937;SHRUG;So;0;ON;;;;;N;;;;; +1F938;PERSON DOING CARTWHEEL;So;0;ON;;;;;N;;;;; +1F939;JUGGLING;So;0;ON;;;;;N;;;;; +1F93A;FENCER;So;0;ON;;;;;N;;;;; +1F93B;MODERN PENTATHLON;So;0;ON;;;;;N;;;;; +1F93C;WRESTLERS;So;0;ON;;;;;N;;;;; +1F93D;WATER POLO;So;0;ON;;;;;N;;;;; +1F93E;HANDBALL;So;0;ON;;;;;N;;;;; +1F940;WILTED FLOWER;So;0;ON;;;;;N;;;;; +1F941;DRUM WITH DRUMSTICKS;So;0;ON;;;;;N;;;;; +1F942;CLINKING GLASSES;So;0;ON;;;;;N;;;;; +1F943;TUMBLER GLASS;So;0;ON;;;;;N;;;;; +1F944;SPOON;So;0;ON;;;;;N;;;;; +1F945;GOAL NET;So;0;ON;;;;;N;;;;; +1F946;RIFLE;So;0;ON;;;;;N;;;;; +1F947;FIRST PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F948;SECOND PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;; +1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;; +1F950;CROISSANT;So;0;ON;;;;;N;;;;; +1F951;AVOCADO;So;0;ON;;;;;N;;;;; +1F952;CUCUMBER;So;0;ON;;;;;N;;;;; +1F953;BACON;So;0;ON;;;;;N;;;;; +1F954;POTATO;So;0;ON;;;;;N;;;;; +1F955;CARROT;So;0;ON;;;;;N;;;;; +1F956;BAGUETTE BREAD;So;0;ON;;;;;N;;;;; +1F957;GREEN SALAD;So;0;ON;;;;;N;;;;; +1F958;SHALLOW PAN OF FOOD;So;0;ON;;;;;N;;;;; +1F959;STUFFED FLATBREAD;So;0;ON;;;;;N;;;;; +1F95A;EGG;So;0;ON;;;;;N;;;;; +1F95B;GLASS OF MILK;So;0;ON;;;;;N;;;;; +1F95C;PEANUTS;So;0;ON;;;;;N;;;;; +1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;; +1F95E;PANCAKES;So;0;ON;;;;;N;;;;; 1F980;CRAB;So;0;ON;;;;;N;;;;; 1F981;LION FACE;So;0;ON;;;;;N;;;;; 1F982;SCORPION;So;0;ON;;;;;N;;;;; 1F983;TURKEY;So;0;ON;;;;;N;;;;; 1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; +1F985;EAGLE;So;0;ON;;;;;N;;;;; +1F986;DUCK;So;0;ON;;;;;N;;;;; +1F987;BAT;So;0;ON;;;;;N;;;;; +1F988;SHARK;So;0;ON;;;;;N;;;;; +1F989;OWL;So;0;ON;;;;;N;;;;; +1F98A;FOX FACE;So;0;ON;;;;;N;;;;; +1F98B;BUTTERFLY;So;0;ON;;;;;N;;;;; +1F98C;DEER;So;0;ON;;;;;N;;;;; +1F98D;GORILLA;So;0;ON;;;;;N;;;;; +1F98E;LIZARD;So;0;ON;;;;;N;;;;; +1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;; +1F990;SHRIMP;So;0;ON;;;;;N;;;;; +1F991;SQUID;So;0;ON;;;;;N;;;;; 1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; 20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;; 2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;; diff --git a/tools-for-build/allkeys.txt b/tools-for-build/allkeys.txt index e1c34b8fee..9c92b5e2ac 100644 --- a/tools-for-build/allkeys.txt +++ b/tools-for-build/allkeys.txt @@ -1,21 +1,22 @@ -# unidata-8.0.0.txt -# Date: 2015-02-18, 15:42:57 GMT [KW] +# allkeys-9.0.0.txt +# Date: 2016-05-16, 18:21:19 GMT [KW] +# Copyright 2016 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # This file defines the Default Unicode Collation Element Table # (DUCET) for the Unicode Collation Algorithm # -# Copyright (c) 2001-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# # See UTS #10, Unicode Collation Algorithm, for more information. # # Diagnostic weight ranges -# Primary weight range: 0200..530C (20749) -# Secondary weight range: 0020..010F (240) -# Variant secondaries: 010B..010F (5) +# Primary weight range: 0200..54A3 (21156) +# Secondary weight range: 0020..0114 (245) +# Variant secondaries: 0110..0114 (5) # Tertiary weight range: 0002..001F (30) # -@version 8.0.0 +@version 9.0.0 + +@implicitweights 17000..18AFF; FB00 # Tangut and Tangut Components 0000 ; [.0000.0000.0000] # NULL (in ISO 6429) 0001 ; [.0000.0000.0000] # START OF HEADING (in ISO 6429) @@ -79,6 +80,7 @@ 00AD ; [.0000.0000.0000] # SOFT HYPHEN 061C ; [.0000.0000.0000] # ARABIC LETTER MARK 070F ; [.0000.0000.0000] # SYRIAC ABBREVIATION MARK +08E2 ; [.0000.0000.0000] # ARABIC DISPUTED END OF AYAH 180B ; [.0000.0000.0000] # MONGOLIAN FREE VARIATION SELECTOR ONE 180C ; [.0000.0000.0000] # MONGOLIAN FREE VARIATION SELECTOR TWO 180D ; [.0000.0000.0000] # MONGOLIAN FREE VARIATION SELECTOR THREE @@ -479,135 +481,135 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 000C ; [*0204.0020.0002] # FORM FEED (in ISO 6429) 000D ; [*0205.0020.0002] # CARRIAGE RETURN (in ISO 6429) 0020 ; [*0209.0020.0002] # SPACE -0021 ; [*025F.0020.0002] # EXCLAMATION MARK -0022 ; [*0305.0020.0002] # QUOTATION MARK -0023 ; [*0391.0020.0002] # NUMBER SIGN -0025 ; [*0392.0020.0002] # PERCENT SIGN -0026 ; [*038F.0020.0002] # AMPERSAND -0027 ; [*02FE.0020.0002] # APOSTROPHE -0028 ; [*0310.0020.0002] # LEFT PARENTHESIS -0029 ; [*0311.0020.0002] # RIGHT PARENTHESIS -002A ; [*0388.0020.0002] # ASTERISK -002B ; [*05F6.0020.0002] # PLUS SIGN -002C ; [*0221.0020.0002] # COMMA +0021 ; [*0260.0020.0002] # EXCLAMATION MARK +0022 ; [*030C.0020.0002] # QUOTATION MARK +0023 ; [*0398.0020.0002] # NUMBER SIGN +0025 ; [*0399.0020.0002] # PERCENT SIGN +0026 ; [*0396.0020.0002] # AMPERSAND +0027 ; [*0305.0020.0002] # APOSTROPHE +0028 ; [*0317.0020.0002] # LEFT PARENTHESIS +0029 ; [*0318.0020.0002] # RIGHT PARENTHESIS +002A ; [*038F.0020.0002] # ASTERISK +002B ; [*0616.0020.0002] # PLUS SIGN +002C ; [*0222.0020.0002] # COMMA 002D ; [*020D.0020.0002] # HYPHEN-MINUS -002E ; [*0274.0020.0002] # FULL STOP -002F ; [*038D.0020.0002] # SOLIDUS -003A ; [*0238.0020.0002] # COLON -003B ; [*0233.0020.0002] # SEMICOLON -003C ; [*05FA.0020.0002] # LESS-THAN SIGN -003D ; [*05FB.0020.0002] # EQUALS SIGN -003E ; [*05FC.0020.0002] # GREATER-THAN SIGN -003F ; [*0264.0020.0002] # QUESTION MARK -0040 ; [*0387.0020.0002] # COMMERCIAL AT -005B ; [*0312.0020.0002] # LEFT SQUARE BRACKET -005C ; [*038E.0020.0002] # REVERSE SOLIDUS -005D ; [*0313.0020.0002] # RIGHT SQUARE BRACKET -005E ; [*0466.0020.0002] # CIRCUMFLEX ACCENT +002E ; [*0277.0020.0002] # FULL STOP +002F ; [*0394.0020.0002] # SOLIDUS +003A ; [*0239.0020.0002] # COLON +003B ; [*0234.0020.0002] # SEMICOLON +003C ; [*061A.0020.0002] # LESS-THAN SIGN +003D ; [*061B.0020.0002] # EQUALS SIGN +003E ; [*061C.0020.0002] # GREATER-THAN SIGN +003F ; [*0266.0020.0002] # QUESTION MARK +0040 ; [*038E.0020.0002] # COMMERCIAL AT +005B ; [*0319.0020.0002] # LEFT SQUARE BRACKET +005C ; [*0395.0020.0002] # REVERSE SOLIDUS +005D ; [*031A.0020.0002] # RIGHT SQUARE BRACKET +005E ; [*0485.0020.0002] # CIRCUMFLEX ACCENT 005F ; [*020B.0020.0002] # LOW LINE -0060 ; [*0463.0020.0002] # GRAVE ACCENT -007B ; [*0314.0020.0002] # LEFT CURLY BRACKET -007C ; [*05FE.0020.0002] # VERTICAL LINE -007D ; [*0315.0020.0002] # RIGHT CURLY BRACKET -007E ; [*0600.0020.0002] # TILDE +0060 ; [*0482.0020.0002] # GRAVE ACCENT +007B ; [*031B.0020.0002] # LEFT CURLY BRACKET +007C ; [*061E.0020.0002] # VERTICAL LINE +007D ; [*031C.0020.0002] # RIGHT CURLY BRACKET +007E ; [*0620.0020.0002] # TILDE 0085 ; [*0206.0020.0002] # NEXT LINE (in ISO 6429) 00A0 ; [*0209.0020.001B] # NO-BREAK SPACE -00A1 ; [*0260.0020.0002] # INVERTED EXCLAMATION MARK -00A6 ; [*05FF.0020.0002] # BROKEN BAR -00A7 ; [*0382.0020.0002] # SECTION SIGN -00A8 ; [*046A.0020.0002] # DIAERESIS -00A9 ; [*0564.0020.0002] # COPYRIGHT SIGN -00AB ; [*030E.0020.0002] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00AC ; [*05FD.0020.0002] # NOT SIGN -00AE ; [*0565.0020.0002] # REGISTERED SIGN -00AF ; [*0467.0020.0002] # MACRON -00B0 ; [*04D7.0020.0002] # DEGREE SIGN -00B1 ; [*05F7.0020.0002] # PLUS-MINUS SIGN -00B4 ; [*0464.0020.0002] # ACUTE ACCENT -00B6 ; [*0384.0020.0002] # PILCROW SIGN -00B7 ; [*0288.0020.0002] # MIDDLE DOT -00B8 ; [*046D.0020.0002] # CEDILLA -00BB ; [*030F.0020.0002] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -00BF ; [*0265.0020.0002] # INVERTED QUESTION MARK -00D7 ; [*05F9.0020.0002] # MULTIPLICATION SIGN -00F7 ; [*05F8.0020.0002] # DIVISION SIGN -02B9 ; [*0474.0020.0002] # MODIFIER LETTER PRIME -02BA ; [*0476.0020.0002] # MODIFIER LETTER DOUBLE PRIME -02C2 ; [*0477.0020.0002] # MODIFIER LETTER LEFT ARROWHEAD -02C3 ; [*0478.0020.0002] # MODIFIER LETTER RIGHT ARROWHEAD -02C4 ; [*0479.0020.0002] # MODIFIER LETTER UP ARROWHEAD -02C5 ; [*047A.0020.0002] # MODIFIER LETTER DOWN ARROWHEAD -02C6 ; [*047B.0020.0002] # MODIFIER LETTER CIRCUMFLEX ACCENT -02C7 ; [*047C.0020.0002] # CARON -02C8 ; [*047D.0020.0002] # MODIFIER LETTER VERTICAL LINE -02C9 ; [*047E.0020.0002] # MODIFIER LETTER MACRON -02CA ; [*047F.0020.0002] # MODIFIER LETTER ACUTE ACCENT -02CB ; [*0480.0020.0002] # MODIFIER LETTER GRAVE ACCENT -02CC ; [*0481.0020.0002] # MODIFIER LETTER LOW VERTICAL LINE -02CD ; [*0482.0020.0002] # MODIFIER LETTER LOW MACRON -02CE ; [*0483.0020.0002] # MODIFIER LETTER LOW GRAVE ACCENT -02CF ; [*0484.0020.0002] # MODIFIER LETTER LOW ACUTE ACCENT -02D2 ; [*0485.0020.0002] # MODIFIER LETTER CENTRED RIGHT HALF RING -02D3 ; [*0486.0020.0002] # MODIFIER LETTER CENTRED LEFT HALF RING -02D4 ; [*0487.0020.0002] # MODIFIER LETTER UP TACK -02D5 ; [*0488.0020.0002] # MODIFIER LETTER DOWN TACK -02D6 ; [*0489.0020.0002] # MODIFIER LETTER PLUS SIGN -02D7 ; [*048A.0020.0002] # MODIFIER LETTER MINUS SIGN -02D8 ; [*0468.0020.0002] # BREVE -02D9 ; [*0469.0020.0002] # DOT ABOVE -02DA ; [*046B.0020.0002] # RING ABOVE -02DB ; [*046E.0020.0002] # OGONEK -02DC ; [*0465.0020.0002] # SMALL TILDE -02DD ; [*046C.0020.0002] # DOUBLE ACUTE ACCENT -02DE ; [*048B.0020.0002] # MODIFIER LETTER RHOTIC HOOK -02DF ; [*048C.0020.0002] # MODIFIER LETTER CROSS ACCENT -02E5 ; [*048D.0020.0002] # MODIFIER LETTER EXTRA-HIGH TONE BAR -02E6 ; [*048E.0020.0002] # MODIFIER LETTER HIGH TONE BAR -02E7 ; [*048F.0020.0002] # MODIFIER LETTER MID TONE BAR -02E8 ; [*0490.0020.0002] # MODIFIER LETTER LOW TONE BAR -02E9 ; [*0491.0020.0002] # MODIFIER LETTER EXTRA-LOW TONE BAR -02EA ; [*0492.0020.0002] # MODIFIER LETTER YIN DEPARTING TONE MARK -02EB ; [*0493.0020.0002] # MODIFIER LETTER YANG DEPARTING TONE MARK -02EC ; [*0494.0020.0002] # MODIFIER LETTER VOICING -02ED ; [*0495.0020.0002] # MODIFIER LETTER UNASPIRATED -02EF ; [*0496.0020.0002] # MODIFIER LETTER LOW DOWN ARROWHEAD -02F0 ; [*0497.0020.0002] # MODIFIER LETTER LOW UP ARROWHEAD -02F1 ; [*0498.0020.0002] # MODIFIER LETTER LOW LEFT ARROWHEAD -02F2 ; [*0499.0020.0002] # MODIFIER LETTER LOW RIGHT ARROWHEAD -02F3 ; [*049A.0020.0002] # MODIFIER LETTER LOW RING -02F4 ; [*049B.0020.0002] # MODIFIER LETTER MIDDLE GRAVE ACCENT -02F5 ; [*049C.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT -02F6 ; [*049D.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT -02F7 ; [*049E.0020.0002] # MODIFIER LETTER LOW TILDE -02F8 ; [*049F.0020.0002] # MODIFIER LETTER RAISED COLON -02F9 ; [*04A0.0020.0002] # MODIFIER LETTER BEGIN HIGH TONE -02FA ; [*04A1.0020.0002] # MODIFIER LETTER END HIGH TONE -02FB ; [*04A2.0020.0002] # MODIFIER LETTER BEGIN LOW TONE -02FC ; [*04A3.0020.0002] # MODIFIER LETTER END LOW TONE -02FD ; [*04A4.0020.0002] # MODIFIER LETTER SHELF -02FE ; [*04A5.0020.0002] # MODIFIER LETTER OPEN SHELF -02FF ; [*04A6.0020.0002] # MODIFIER LETTER LOW LEFT ARROW +00A1 ; [*0261.0020.0002] # INVERTED EXCLAMATION MARK +00A6 ; [*061F.0020.0002] # BROKEN BAR +00A7 ; [*0389.0020.0002] # SECTION SIGN +00A8 ; [*0489.0020.0002] # DIAERESIS +00A9 ; [*0584.0020.0002] # COPYRIGHT SIGN +00AB ; [*0315.0020.0002] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; [*061D.0020.0002] # NOT SIGN +00AE ; [*0585.0020.0002] # REGISTERED SIGN +00AF ; [*0486.0020.0002] # MACRON +00B0 ; [*04F6.0020.0002] # DEGREE SIGN +00B1 ; [*0617.0020.0002] # PLUS-MINUS SIGN +00B4 ; [*0483.0020.0002] # ACUTE ACCENT +00B6 ; [*038B.0020.0002] # PILCROW SIGN +00B7 ; [*028B.0020.0002] # MIDDLE DOT +00B8 ; [*048C.0020.0002] # CEDILLA +00BB ; [*0316.0020.0002] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BF ; [*0267.0020.0002] # INVERTED QUESTION MARK +00D7 ; [*0619.0020.0002] # MULTIPLICATION SIGN +00F7 ; [*0618.0020.0002] # DIVISION SIGN +02B9 ; [*0493.0020.0002] # MODIFIER LETTER PRIME +02BA ; [*0495.0020.0002] # MODIFIER LETTER DOUBLE PRIME +02C2 ; [*0496.0020.0002] # MODIFIER LETTER LEFT ARROWHEAD +02C3 ; [*0497.0020.0002] # MODIFIER LETTER RIGHT ARROWHEAD +02C4 ; [*0498.0020.0002] # MODIFIER LETTER UP ARROWHEAD +02C5 ; [*0499.0020.0002] # MODIFIER LETTER DOWN ARROWHEAD +02C6 ; [*049A.0020.0002] # MODIFIER LETTER CIRCUMFLEX ACCENT +02C7 ; [*049B.0020.0002] # CARON +02C8 ; [*049C.0020.0002] # MODIFIER LETTER VERTICAL LINE +02C9 ; [*049D.0020.0002] # MODIFIER LETTER MACRON +02CA ; [*049E.0020.0002] # MODIFIER LETTER ACUTE ACCENT +02CB ; [*049F.0020.0002] # MODIFIER LETTER GRAVE ACCENT +02CC ; [*04A0.0020.0002] # MODIFIER LETTER LOW VERTICAL LINE +02CD ; [*04A1.0020.0002] # MODIFIER LETTER LOW MACRON +02CE ; [*04A2.0020.0002] # MODIFIER LETTER LOW GRAVE ACCENT +02CF ; [*04A3.0020.0002] # MODIFIER LETTER LOW ACUTE ACCENT +02D2 ; [*04A4.0020.0002] # MODIFIER LETTER CENTRED RIGHT HALF RING +02D3 ; [*04A5.0020.0002] # MODIFIER LETTER CENTRED LEFT HALF RING +02D4 ; [*04A6.0020.0002] # MODIFIER LETTER UP TACK +02D5 ; [*04A7.0020.0002] # MODIFIER LETTER DOWN TACK +02D6 ; [*04A8.0020.0002] # MODIFIER LETTER PLUS SIGN +02D7 ; [*04A9.0020.0002] # MODIFIER LETTER MINUS SIGN +02D8 ; [*0487.0020.0002] # BREVE +02D9 ; [*0488.0020.0002] # DOT ABOVE +02DA ; [*048A.0020.0002] # RING ABOVE +02DB ; [*048D.0020.0002] # OGONEK +02DC ; [*0484.0020.0002] # SMALL TILDE +02DD ; [*048B.0020.0002] # DOUBLE ACUTE ACCENT +02DE ; [*04AA.0020.0002] # MODIFIER LETTER RHOTIC HOOK +02DF ; [*04AB.0020.0002] # MODIFIER LETTER CROSS ACCENT +02E5 ; [*04AC.0020.0002] # MODIFIER LETTER EXTRA-HIGH TONE BAR +02E6 ; [*04AD.0020.0002] # MODIFIER LETTER HIGH TONE BAR +02E7 ; [*04AE.0020.0002] # MODIFIER LETTER MID TONE BAR +02E8 ; [*04AF.0020.0002] # MODIFIER LETTER LOW TONE BAR +02E9 ; [*04B0.0020.0002] # MODIFIER LETTER EXTRA-LOW TONE BAR +02EA ; [*04B1.0020.0002] # MODIFIER LETTER YIN DEPARTING TONE MARK +02EB ; [*04B2.0020.0002] # MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; [*04B3.0020.0002] # MODIFIER LETTER VOICING +02ED ; [*04B4.0020.0002] # MODIFIER LETTER UNASPIRATED +02EF ; [*04B5.0020.0002] # MODIFIER LETTER LOW DOWN ARROWHEAD +02F0 ; [*04B6.0020.0002] # MODIFIER LETTER LOW UP ARROWHEAD +02F1 ; [*04B7.0020.0002] # MODIFIER LETTER LOW LEFT ARROWHEAD +02F2 ; [*04B8.0020.0002] # MODIFIER LETTER LOW RIGHT ARROWHEAD +02F3 ; [*04B9.0020.0002] # MODIFIER LETTER LOW RING +02F4 ; [*04BA.0020.0002] # MODIFIER LETTER MIDDLE GRAVE ACCENT +02F5 ; [*04BB.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT +02F6 ; [*04BC.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT +02F7 ; [*04BD.0020.0002] # MODIFIER LETTER LOW TILDE +02F8 ; [*04BE.0020.0002] # MODIFIER LETTER RAISED COLON +02F9 ; [*04BF.0020.0002] # MODIFIER LETTER BEGIN HIGH TONE +02FA ; [*04C0.0020.0002] # MODIFIER LETTER END HIGH TONE +02FB ; [*04C1.0020.0002] # MODIFIER LETTER BEGIN LOW TONE +02FC ; [*04C2.0020.0002] # MODIFIER LETTER END LOW TONE +02FD ; [*04C3.0020.0002] # MODIFIER LETTER SHELF +02FE ; [*04C4.0020.0002] # MODIFIER LETTER OPEN SHELF +02FF ; [*04C5.0020.0002] # MODIFIER LETTER LOW LEFT ARROW 034F ; [.0000.0000.0000] # COMBINING GRAPHEME JOINER -0374 ; [*0474.0020.0002] # GREEK NUMERAL SIGN -0375 ; [*0475.0020.0002] # GREEK LOWER NUMERAL SIGN -037E ; [*0233.0020.0002] # GREEK QUESTION MARK -0384 ; [*0464.0020.0002] # GREEK TONOS -0385 ; [*046A.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA TONOS -0387 ; [*0288.0020.0002] # GREEK ANO TELEIA -03F6 ; [*05F1.0020.0002] # GREEK REVERSED LUNATE EPSILON SYMBOL -0482 ; [*04D8.0020.0002] # CYRILLIC THOUSANDS SIGN +0374 ; [*0493.0020.0002] # GREEK NUMERAL SIGN +0375 ; [*0494.0020.0002] # GREEK LOWER NUMERAL SIGN +037E ; [*0234.0020.0002] # GREEK QUESTION MARK +0384 ; [*0483.0020.0002] # GREEK TONOS +0385 ; [*0489.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA TONOS +0387 ; [*028B.0020.0002] # GREEK ANO TELEIA +03F6 ; [*0611.0020.0002] # GREEK REVERSED LUNATE EPSILON SYMBOL +0482 ; [*04F7.0020.0002] # CYRILLIC THOUSANDS SIGN 0488 ; [.0000.0000.0000] # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN 0489 ; [.0000.0000.0000] # COMBINING CYRILLIC MILLIONS SIGN -055A ; [*03C3.0020.0002] # ARMENIAN APOSTROPHE -055B ; [*03C4.0020.0002] # ARMENIAN EMPHASIS MARK -055C ; [*0261.0020.0002] # ARMENIAN EXCLAMATION MARK -055D ; [*0225.0020.0002] # ARMENIAN COMMA -055E ; [*0267.0020.0002] # ARMENIAN QUESTION MARK -055F ; [*03C5.0020.0002] # ARMENIAN ABBREVIATION MARK -0589 ; [*0239.0020.0002] # ARMENIAN FULL STOP +055A ; [*03CB.0020.0002] # ARMENIAN APOSTROPHE +055B ; [*03CC.0020.0002] # ARMENIAN EMPHASIS MARK +055C ; [*0262.0020.0002] # ARMENIAN EXCLAMATION MARK +055D ; [*0226.0020.0002] # ARMENIAN COMMA +055E ; [*0269.0020.0002] # ARMENIAN QUESTION MARK +055F ; [*03CD.0020.0002] # ARMENIAN ABBREVIATION MARK +0589 ; [*023A.0020.0002] # ARMENIAN FULL STOP 058A ; [*020E.0020.0002] # ARMENIAN HYPHEN -058D ; [*04D9.0020.0002] # RIGHT-FACING ARMENIAN ETERNITY SIGN -058E ; [*04DA.0020.0002] # LEFT-FACING ARMENIAN ETERNITY SIGN +058D ; [*04F8.0020.0002] # RIGHT-FACING ARMENIAN ETERNITY SIGN +058E ; [*04F9.0020.0002] # LEFT-FACING ARMENIAN ETERNITY SIGN 0591 ; [.0000.0000.0000] # HEBREW ACCENT ETNAHTA 0592 ; [.0000.0000.0000] # HEBREW ACCENT SEGOL 0593 ; [.0000.0000.0000] # HEBREW ACCENT SHALSHELET @@ -640,29 +642,29 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 05AE ; [.0000.0000.0000] # HEBREW ACCENT ZINOR 05AF ; [.0000.0000.0000] # HEBREW MARK MASORA CIRCLE 05BD ; [.0000.0000.0000] # HEBREW POINT METEG -05BE ; [*03C6.0020.0002] # HEBREW PUNCTUATION MAQAF -05C0 ; [*03C7.0020.0002] # HEBREW PUNCTUATION PASEQ -05C3 ; [*03C8.0020.0002] # HEBREW PUNCTUATION SOF PASUQ +05BE ; [*03CE.0020.0002] # HEBREW PUNCTUATION MAQAF +05C0 ; [*03CF.0020.0002] # HEBREW PUNCTUATION PASEQ +05C3 ; [*03D0.0020.0002] # HEBREW PUNCTUATION SOF PASUQ 05C4 ; [.0000.0000.0000] # HEBREW MARK UPPER DOT 05C5 ; [.0000.0000.0000] # HEBREW MARK LOWER DOT -05C6 ; [*03C9.0020.0002] # HEBREW PUNCTUATION NUN HAFUKHA -05F3 ; [*03CA.0020.0002] # HEBREW PUNCTUATION GERESH -05F4 ; [*03CB.0020.0002] # HEBREW PUNCTUATION GERSHAYIM +05C6 ; [*03D1.0020.0002] # HEBREW PUNCTUATION NUN HAFUKHA +05F3 ; [*03D2.0020.0002] # HEBREW PUNCTUATION GERESH +05F4 ; [*03D3.0020.0002] # HEBREW PUNCTUATION GERSHAYIM 0600 ; [.0000.0000.0000] # ARABIC NUMBER SIGN 0601 ; [.0000.0000.0000] # ARABIC SIGN SANAH 0602 ; [.0000.0000.0000] # ARABIC FOOTNOTE MARKER 0603 ; [.0000.0000.0000] # ARABIC SIGN SAFHA 0604 ; [.0000.0000.0000] # ARABIC SIGN SAMVAT 0605 ; [.0000.0000.0000] # ARABIC NUMBER MARK ABOVE -0606 ; [*060D.0020.0002] # ARABIC-INDIC CUBE ROOT -0607 ; [*060F.0020.0002] # ARABIC-INDIC FOURTH ROOT -0608 ; [*04DB.0020.0002] # ARABIC RAY -0609 ; [*0395.0020.0002] # ARABIC-INDIC PER MILLE SIGN -060A ; [*0397.0020.0002] # ARABIC-INDIC PER TEN THOUSAND SIGN -060C ; [*0226.0020.0002] # ARABIC COMMA -060D ; [*0227.0020.0002] # ARABIC DATE SEPARATOR -060E ; [*04DE.0020.0002] # ARABIC POETIC VERSE SIGN -060F ; [*04DF.0020.0002] # ARABIC SIGN MISRA +0606 ; [*062D.0020.0002] # ARABIC-INDIC CUBE ROOT +0607 ; [*062F.0020.0002] # ARABIC-INDIC FOURTH ROOT +0608 ; [*04FA.0020.0002] # ARABIC RAY +0609 ; [*039C.0020.0002] # ARABIC-INDIC PER MILLE SIGN +060A ; [*039E.0020.0002] # ARABIC-INDIC PER TEN THOUSAND SIGN +060C ; [*0227.0020.0002] # ARABIC COMMA +060D ; [*0228.0020.0002] # ARABIC DATE SEPARATOR +060E ; [*04FD.0020.0002] # ARABIC POETIC VERSE SIGN +060F ; [*04FE.0020.0002] # ARABIC SIGN MISRA 0610 ; [.0000.0000.0000] # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM 0611 ; [.0000.0000.0000] # ARABIC SIGN ALAYHE ASSALLAM 0612 ; [.0000.0000.0000] # ARABIC SIGN RAHMATULLAH ALAYHE @@ -674,15 +676,15 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 0618 ; [.0000.0000.0000] # ARABIC SMALL FATHA 0619 ; [.0000.0000.0000] # ARABIC SMALL DAMMA 061A ; [.0000.0000.0000] # ARABIC SMALL KASRA -061B ; [*0234.0020.0002] # ARABIC SEMICOLON -061E ; [*023A.0020.0002] # ARABIC TRIPLE DOT PUNCTUATION MARK -061F ; [*0268.0020.0002] # ARABIC QUESTION MARK +061B ; [*0235.0020.0002] # ARABIC SEMICOLON +061E ; [*023B.0020.0002] # ARABIC TRIPLE DOT PUNCTUATION MARK +061F ; [*026A.0020.0002] # ARABIC QUESTION MARK 0640 ; [.0000.0000.0000] # ARABIC TATWEEL -066A ; [*0393.0020.0002] # ARABIC PERCENT SIGN -066B ; [*0228.0020.0002] # ARABIC DECIMAL SEPARATOR -066C ; [*0229.0020.0002] # ARABIC THOUSANDS SEPARATOR -066D ; [*038B.0020.0002] # ARABIC FIVE POINTED STAR -06D4 ; [*0276.0020.0002] # ARABIC FULL STOP +066A ; [*039A.0020.0002] # ARABIC PERCENT SIGN +066B ; [*0229.0020.0002] # ARABIC DECIMAL SEPARATOR +066C ; [*022A.0020.0002] # ARABIC THOUSANDS SEPARATOR +066D ; [*0392.0020.0002] # ARABIC FIVE POINTED STAR +06D4 ; [*0279.0020.0002] # ARABIC FULL STOP 06D6 ; [.0000.0000.0000] # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA 06D7 ; [.0000.0000.0000] # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA 06D8 ; [.0000.0000.0000] # ARABIC SMALL HIGH MEEM INITIAL FORM @@ -691,7 +693,7 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 06DB ; [.0000.0000.0000] # ARABIC SMALL HIGH THREE DOTS 06DC ; [.0000.0000.0000] # ARABIC SMALL HIGH SEEN 06DD ; [.0000.0000.0000] # ARABIC END OF AYAH -06DE ; [*04E0.0020.0002] # ARABIC START OF RUB EL HIZB +06DE ; [*04FF.0020.0002] # ARABIC START OF RUB EL HIZB 06DF ; [.0000.0000.0000] # ARABIC SMALL HIGH ROUNDED ZERO 06E0 ; [.0000.0000.0000] # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO 06E1 ; [.0000.0000.0000] # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH @@ -700,25 +702,25 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 06E4 ; [.0000.0000.0000] # ARABIC SMALL HIGH MADDA 06E7 ; [.0000.0000.0000] # ARABIC SMALL HIGH YEH 06E8 ; [.0000.0000.0000] # ARABIC SMALL HIGH NOON -06E9 ; [*04E1.0020.0002] # ARABIC PLACE OF SAJDAH +06E9 ; [*0500.0020.0002] # ARABIC PLACE OF SAJDAH 06EA ; [.0000.0000.0000] # ARABIC EMPTY CENTRE LOW STOP 06EB ; [.0000.0000.0000] # ARABIC EMPTY CENTRE HIGH STOP 06EC ; [.0000.0000.0000] # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE 06ED ; [.0000.0000.0000] # ARABIC SMALL LOW MEEM -0700 ; [*02BD.0020.0002] # SYRIAC END OF PARAGRAPH -0701 ; [*0277.0020.0002] # SYRIAC SUPRALINEAR FULL STOP -0702 ; [*0278.0020.0002] # SYRIAC SUBLINEAR FULL STOP -0703 ; [*023B.0020.0002] # SYRIAC SUPRALINEAR COLON -0704 ; [*023C.0020.0002] # SYRIAC SUBLINEAR COLON -0705 ; [*023D.0020.0002] # SYRIAC HORIZONTAL COLON -0706 ; [*023E.0020.0002] # SYRIAC COLON SKEWED LEFT -0707 ; [*023F.0020.0002] # SYRIAC COLON SKEWED RIGHT -0708 ; [*0240.0020.0002] # SYRIAC SUPRALINEAR COLON SKEWED LEFT -0709 ; [*0269.0020.0002] # SYRIAC SUBLINEAR COLON SKEWED RIGHT -070A ; [*03CC.0020.0002] # SYRIAC CONTRACTION -070B ; [*03CD.0020.0002] # SYRIAC HARKLEAN OBELUS -070C ; [*03CE.0020.0002] # SYRIAC HARKLEAN METOBELUS -070D ; [*03CF.0020.0002] # SYRIAC HARKLEAN ASTERISCUS +0700 ; [*02C4.0020.0002] # SYRIAC END OF PARAGRAPH +0701 ; [*027A.0020.0002] # SYRIAC SUPRALINEAR FULL STOP +0702 ; [*027B.0020.0002] # SYRIAC SUBLINEAR FULL STOP +0703 ; [*023C.0020.0002] # SYRIAC SUPRALINEAR COLON +0704 ; [*023D.0020.0002] # SYRIAC SUBLINEAR COLON +0705 ; [*023E.0020.0002] # SYRIAC HORIZONTAL COLON +0706 ; [*023F.0020.0002] # SYRIAC COLON SKEWED LEFT +0707 ; [*0240.0020.0002] # SYRIAC COLON SKEWED RIGHT +0708 ; [*0241.0020.0002] # SYRIAC SUPRALINEAR COLON SKEWED LEFT +0709 ; [*026B.0020.0002] # SYRIAC SUBLINEAR COLON SKEWED RIGHT +070A ; [*03D4.0020.0002] # SYRIAC CONTRACTION +070B ; [*03D5.0020.0002] # SYRIAC HARKLEAN OBELUS +070C ; [*03D6.0020.0002] # SYRIAC HARKLEAN METOBELUS +070D ; [*03D7.0020.0002] # SYRIAC HARKLEAN ASTERISCUS 0740 ; [.0000.0000.0000] # SYRIAC FEMININE DOT 0743 ; [.0000.0000.0000] # SYRIAC TWO VERTICAL DOTS ABOVE 0744 ; [.0000.0000.0000] # SYRIAC TWO VERTICAL DOTS BELOW @@ -726,27 +728,41 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 0748 ; [.0000.0000.0000] # SYRIAC OBLIQUE LINE BELOW 0749 ; [.0000.0000.0000] # SYRIAC MUSIC 074A ; [.0000.0000.0000] # SYRIAC BARREKH -07F6 ; [*04F3.0020.0002] # NKO SYMBOL OO DENNEN -07F7 ; [*02BE.0020.0002] # NKO SYMBOL GBAKURUNEN -07F8 ; [*022A.0020.0002] # NKO COMMA -07F9 ; [*0262.0020.0002] # NKO EXCLAMATION MARK +07F6 ; [*0512.0020.0002] # NKO SYMBOL OO DENNEN +07F7 ; [*02C5.0020.0002] # NKO SYMBOL GBAKURUNEN +07F8 ; [*022B.0020.0002] # NKO COMMA +07F9 ; [*0263.0020.0002] # NKO EXCLAMATION MARK 07FA ; [.0000.0000.0000] # NKO LAJANYALAN -0830 ; [*0241.0020.0002] # SAMARITAN PUNCTUATION NEQUDAA -0831 ; [*0242.0020.0002] # SAMARITAN PUNCTUATION AFSAAQ -0832 ; [*0243.0020.0002] # SAMARITAN PUNCTUATION ANGED -0833 ; [*0244.0020.0002] # SAMARITAN PUNCTUATION BAU -0834 ; [*0245.0020.0002] # SAMARITAN PUNCTUATION ATMAAU -0835 ; [*0246.0020.0002] # SAMARITAN PUNCTUATION SHIYYAALAA -0836 ; [*0247.0020.0002] # SAMARITAN ABBREVIATION MARK -0837 ; [*0248.0020.0002] # SAMARITAN PUNCTUATION MELODIC QITSA -0838 ; [*0249.0020.0002] # SAMARITAN PUNCTUATION ZIQAA -0839 ; [*024A.0020.0002] # SAMARITAN PUNCTUATION QITSA -083A ; [*024B.0020.0002] # SAMARITAN PUNCTUATION ZAEF -083B ; [*024C.0020.0002] # SAMARITAN PUNCTUATION TURU -083C ; [*024D.0020.0002] # SAMARITAN PUNCTUATION ARKAANU -083D ; [*024E.0020.0002] # SAMARITAN PUNCTUATION SOF MASHFAAT -083E ; [*024F.0020.0002] # SAMARITAN PUNCTUATION ANNAAU -085E ; [*03D0.0020.0002] # MANDAIC PUNCTUATION +0830 ; [*0242.0020.0002] # SAMARITAN PUNCTUATION NEQUDAA +0831 ; [*0243.0020.0002] # SAMARITAN PUNCTUATION AFSAAQ +0832 ; [*0244.0020.0002] # SAMARITAN PUNCTUATION ANGED +0833 ; [*0245.0020.0002] # SAMARITAN PUNCTUATION BAU +0834 ; [*0246.0020.0002] # SAMARITAN PUNCTUATION ATMAAU +0835 ; [*0247.0020.0002] # SAMARITAN PUNCTUATION SHIYYAALAA +0836 ; [*0248.0020.0002] # SAMARITAN ABBREVIATION MARK +0837 ; [*0249.0020.0002] # SAMARITAN PUNCTUATION MELODIC QITSA +0838 ; [*024A.0020.0002] # SAMARITAN PUNCTUATION ZIQAA +0839 ; [*024B.0020.0002] # SAMARITAN PUNCTUATION QITSA +083A ; [*024C.0020.0002] # SAMARITAN PUNCTUATION ZAEF +083B ; [*024D.0020.0002] # SAMARITAN PUNCTUATION TURU +083C ; [*024E.0020.0002] # SAMARITAN PUNCTUATION ARKAANU +083D ; [*024F.0020.0002] # SAMARITAN PUNCTUATION SOF MASHFAAT +083E ; [*0250.0020.0002] # SAMARITAN PUNCTUATION ANNAAU +085E ; [*03D8.0020.0002] # MANDAIC PUNCTUATION +08D4 ; [.0000.0000.0000] # ARABIC SMALL HIGH WORD AR-RUB +08D5 ; [.0000.0000.0000] # ARABIC SMALL HIGH SAD +08D6 ; [.0000.0000.0000] # ARABIC SMALL HIGH AIN +08D7 ; [.0000.0000.0000] # ARABIC SMALL HIGH QAF +08D8 ; [.0000.0000.0000] # ARABIC SMALL HIGH NOON WITH KASRA +08D9 ; [.0000.0000.0000] # ARABIC SMALL LOW NOON WITH KASRA +08DA ; [.0000.0000.0000] # ARABIC SMALL HIGH WORD ATH-THALATHA +08DB ; [.0000.0000.0000] # ARABIC SMALL HIGH WORD AS-SAJDA +08DC ; [.0000.0000.0000] # ARABIC SMALL HIGH WORD AN-NISF +08DD ; [.0000.0000.0000] # ARABIC SMALL HIGH WORD SAKTA +08DE ; [.0000.0000.0000] # ARABIC SMALL HIGH WORD QIF +08DF ; [.0000.0000.0000] # ARABIC SMALL HIGH WORD WAQFA +08E0 ; [.0000.0000.0000] # ARABIC SMALL HIGH FOOTNOTE MARKER +08E1 ; [.0000.0000.0000] # ARABIC SMALL HIGH SIGN SAFHA 08EA ; [.0000.0000.0000] # ARABIC TONE ONE DOT ABOVE 08EB ; [.0000.0000.0000] # ARABIC TONE TWO DOTS ABOVE 08EC ; [.0000.0000.0000] # ARABIC TONE LOOP ABOVE @@ -756,259 +772,270 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 08F3 ; [.0000.0000.0000] # ARABIC SMALL HIGH WAW 0951 ; [.0000.0000.0000] # DEVANAGARI STRESS SIGN UDATTA 0952 ; [.0000.0000.0000] # DEVANAGARI STRESS SIGN ANUDATTA -0964 ; [*028B.0020.0002] # DEVANAGARI DANDA -0965 ; [*028C.0020.0002] # DEVANAGARI DOUBLE DANDA -0970 ; [*03D2.0020.0002] # DEVANAGARI ABBREVIATION SIGN -09F4 ; [*1A26.0020.0002] # BENGALI CURRENCY NUMERATOR ONE -09F5 ; [*1A27.0020.0002] # BENGALI CURRENCY NUMERATOR TWO -09F6 ; [*1A28.0020.0002] # BENGALI CURRENCY NUMERATOR THREE -09F7 ; [*1A29.0020.0002] # BENGALI CURRENCY NUMERATOR FOUR -09F8 ; [*1A2A.0020.0002] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR -09F9 ; [*1A2B.0020.0002] # BENGALI CURRENCY DENOMINATOR SIXTEEN -09FA ; [*04F4.0020.0002] # BENGALI ISSHAR -0AF0 ; [*03D7.0020.0002] # GUJARATI ABBREVIATION SIGN -0B70 ; [*04F5.0020.0002] # ORIYA ISSHAR -0B72 ; [*1A2C.0020.0002] # ORIYA FRACTION ONE QUARTER -0B73 ; [*1A2D.0020.0002] # ORIYA FRACTION ONE HALF -0B74 ; [*1A2E.0020.0002] # ORIYA FRACTION THREE QUARTERS -0B75 ; [*1A2F.0020.0002] # ORIYA FRACTION ONE SIXTEENTH -0B76 ; [*1A30.0020.0002] # ORIYA FRACTION ONE EIGHTH -0B77 ; [*1A31.0020.0002] # ORIYA FRACTION THREE SIXTEENTHS -0BF0 ; [*1A38.0020.0002] # TAMIL NUMBER TEN -0BF1 ; [*1A39.0020.0002] # TAMIL NUMBER ONE HUNDRED -0BF2 ; [*1A3A.0020.0002] # TAMIL NUMBER ONE THOUSAND -0BF3 ; [*04F6.0020.0002] # TAMIL DAY SIGN -0BF4 ; [*04F7.0020.0002] # TAMIL MONTH SIGN -0BF5 ; [*04F8.0020.0002] # TAMIL YEAR SIGN -0BF6 ; [*04F9.0020.0002] # TAMIL DEBIT SIGN -0BF7 ; [*04FA.0020.0002] # TAMIL CREDIT SIGN -0BF8 ; [*04FB.0020.0002] # TAMIL AS ABOVE SIGN -0BFA ; [*04FC.0020.0002] # TAMIL NUMBER SIGN -0C7F ; [*04FD.0020.0002] # TELUGU SIGN TUUMU -0D70 ; [*1A3B.0020.0002] # MALAYALAM NUMBER TEN -0D71 ; [*1A3C.0020.0002] # MALAYALAM NUMBER ONE HUNDRED -0D72 ; [*1A3D.0020.0002] # MALAYALAM NUMBER ONE THOUSAND -0D73 ; [*1A3E.0020.0002] # MALAYALAM FRACTION ONE QUARTER -0D74 ; [*1A3F.0020.0002] # MALAYALAM FRACTION ONE HALF -0D75 ; [*1A40.0020.0002] # MALAYALAM FRACTION THREE QUARTERS -0D79 ; [*04FE.0020.0002] # MALAYALAM DATE MARK -0DF4 ; [*03D8.0020.0002] # SINHALA PUNCTUATION KUNDDALIYA -0E4F ; [*03D9.0020.0002] # THAI CHARACTER FONGMAN -0E5A ; [*03DA.0020.0002] # THAI CHARACTER ANGKHANKHU -0E5B ; [*03DB.0020.0002] # THAI CHARACTER KHOMUT -0F01 ; [*0506.0020.0002] # TIBETAN MARK GTER YIG MGO TRUNCATED A -0F02 ; [*0507.0020.0002] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA -0F03 ; [*0508.0020.0002] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA -0F04 ; [*03DE.0020.0002] # TIBETAN MARK INITIAL YIG MGO MDUN MA -0F05 ; [*03DF.0020.0002] # TIBETAN MARK CLOSING YIG MGO SGAB MA -0F06 ; [*03E0.0020.0002] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA -0F07 ; [*03E1.0020.0002] # TIBETAN MARK YIG MGO TSHEG SHAD MA -0F08 ; [*03E2.0020.0002] # TIBETAN MARK SBRUL SHAD -0F09 ; [*03E3.0020.0002] # TIBETAN MARK BSKUR YIG MGO -0F0A ; [*03E4.0020.0002] # TIBETAN MARK BKA- SHOG YIG MGO -0F0B ; [*03E7.0020.0002] # TIBETAN MARK INTERSYLLABIC TSHEG -0F0C ; [*03E7.0020.001B] # TIBETAN MARK DELIMITER TSHEG BSTAR -0F0D ; [*03E8.0020.0002] # TIBETAN MARK SHAD -0F0E ; [*03E9.0020.0002] # TIBETAN MARK NYIS SHAD -0F0F ; [*03EA.0020.0002] # TIBETAN MARK TSHEG SHAD -0F10 ; [*03EB.0020.0002] # TIBETAN MARK NYIS TSHEG SHAD -0F11 ; [*03EC.0020.0002] # TIBETAN MARK RIN CHEN SPUNGS SHAD -0F12 ; [*03ED.0020.0002] # TIBETAN MARK RGYA GRAM SHAD -0F13 ; [*0509.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN -0F14 ; [*0257.0020.0002] # TIBETAN MARK GTER TSHEG -0F15 ; [*050A.0020.0002] # TIBETAN LOGOTYPE SIGN CHAD RTAGS -0F16 ; [*050B.0020.0002] # TIBETAN LOGOTYPE SIGN LHAG RTAGS -0F17 ; [*050C.0020.0002] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0964 ; [*028E.0020.0002] # DEVANAGARI DANDA +0965 ; [*028F.0020.0002] # DEVANAGARI DOUBLE DANDA +0970 ; [*03E7.0020.0002] # DEVANAGARI ABBREVIATION SIGN +09F4 ; [*1A96.0020.0002] # BENGALI CURRENCY NUMERATOR ONE +09F5 ; [*1A97.0020.0002] # BENGALI CURRENCY NUMERATOR TWO +09F6 ; [*1A98.0020.0002] # BENGALI CURRENCY NUMERATOR THREE +09F7 ; [*1A99.0020.0002] # BENGALI CURRENCY NUMERATOR FOUR +09F8 ; [*1A9A.0020.0002] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +09F9 ; [*1A9B.0020.0002] # BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; [*0513.0020.0002] # BENGALI ISSHAR +0AF0 ; [*03EC.0020.0002] # GUJARATI ABBREVIATION SIGN +0B70 ; [*0514.0020.0002] # ORIYA ISSHAR +0B72 ; [*1A9C.0020.0002] # ORIYA FRACTION ONE QUARTER +0B73 ; [*1A9D.0020.0002] # ORIYA FRACTION ONE HALF +0B74 ; [*1A9E.0020.0002] # ORIYA FRACTION THREE QUARTERS +0B75 ; [*1A9F.0020.0002] # ORIYA FRACTION ONE SIXTEENTH +0B76 ; [*1AA0.0020.0002] # ORIYA FRACTION ONE EIGHTH +0B77 ; [*1AA1.0020.0002] # ORIYA FRACTION THREE SIXTEENTHS +0BF0 ; [*1AA8.0020.0002] # TAMIL NUMBER TEN +0BF1 ; [*1AA9.0020.0002] # TAMIL NUMBER ONE HUNDRED +0BF2 ; [*1AAA.0020.0002] # TAMIL NUMBER ONE THOUSAND +0BF3 ; [*0515.0020.0002] # TAMIL DAY SIGN +0BF4 ; [*0516.0020.0002] # TAMIL MONTH SIGN +0BF5 ; [*0517.0020.0002] # TAMIL YEAR SIGN +0BF6 ; [*0518.0020.0002] # TAMIL DEBIT SIGN +0BF7 ; [*0519.0020.0002] # TAMIL CREDIT SIGN +0BF8 ; [*051A.0020.0002] # TAMIL AS ABOVE SIGN +0BFA ; [*051B.0020.0002] # TAMIL NUMBER SIGN +0C7F ; [*051C.0020.0002] # TELUGU SIGN TUUMU +0D4F ; [*051D.0020.0002] # MALAYALAM SIGN PARA +0D58 ; [*1AAB.0020.0002] # MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH +0D59 ; [*1AAC.0020.0002] # MALAYALAM FRACTION ONE FORTIETH +0D5A ; [*1AAD.0020.0002] # MALAYALAM FRACTION THREE EIGHTIETHS +0D5B ; [*1AAE.0020.0002] # MALAYALAM FRACTION ONE TWENTIETH +0D5C ; [*1AAF.0020.0002] # MALAYALAM FRACTION ONE TENTH +0D5D ; [*1AB0.0020.0002] # MALAYALAM FRACTION THREE TWENTIETHS +0D5E ; [*1AB1.0020.0002] # MALAYALAM FRACTION ONE FIFTH +0D70 ; [*1AB2.0020.0002] # MALAYALAM NUMBER TEN +0D71 ; [*1AB3.0020.0002] # MALAYALAM NUMBER ONE HUNDRED +0D72 ; [*1AB4.0020.0002] # MALAYALAM NUMBER ONE THOUSAND +0D73 ; [*1AB5.0020.0002] # MALAYALAM FRACTION ONE QUARTER +0D74 ; [*1AB6.0020.0002] # MALAYALAM FRACTION ONE HALF +0D75 ; [*1AB7.0020.0002] # MALAYALAM FRACTION THREE QUARTERS +0D76 ; [*1AB8.0020.0002] # MALAYALAM FRACTION ONE SIXTEENTH +0D77 ; [*1AB9.0020.0002] # MALAYALAM FRACTION ONE EIGHTH +0D78 ; [*1ABA.0020.0002] # MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; [*051E.0020.0002] # MALAYALAM DATE MARK +0DF4 ; [*03ED.0020.0002] # SINHALA PUNCTUATION KUNDDALIYA +0E4F ; [*03EE.0020.0002] # THAI CHARACTER FONGMAN +0E5A ; [*03EF.0020.0002] # THAI CHARACTER ANGKHANKHU +0E5B ; [*03F0.0020.0002] # THAI CHARACTER KHOMUT +0F01 ; [*0526.0020.0002] # TIBETAN MARK GTER YIG MGO TRUNCATED A +0F02 ; [*0527.0020.0002] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA +0F03 ; [*0528.0020.0002] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04 ; [*03F3.0020.0002] # TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05 ; [*03F4.0020.0002] # TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06 ; [*03F5.0020.0002] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA +0F07 ; [*03F6.0020.0002] # TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08 ; [*03F7.0020.0002] # TIBETAN MARK SBRUL SHAD +0F09 ; [*03F8.0020.0002] # TIBETAN MARK BSKUR YIG MGO +0F0A ; [*03F9.0020.0002] # TIBETAN MARK BKA- SHOG YIG MGO +0F0B ; [*03FC.0020.0002] # TIBETAN MARK INTERSYLLABIC TSHEG +0F0C ; [*03FC.0020.001B] # TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D ; [*03FD.0020.0002] # TIBETAN MARK SHAD +0F0E ; [*03FE.0020.0002] # TIBETAN MARK NYIS SHAD +0F0F ; [*03FF.0020.0002] # TIBETAN MARK TSHEG SHAD +0F10 ; [*0400.0020.0002] # TIBETAN MARK NYIS TSHEG SHAD +0F11 ; [*0401.0020.0002] # TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12 ; [*0402.0020.0002] # TIBETAN MARK RGYA GRAM SHAD +0F13 ; [*0529.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; [*0258.0020.0002] # TIBETAN MARK GTER TSHEG +0F15 ; [*052A.0020.0002] # TIBETAN LOGOTYPE SIGN CHAD RTAGS +0F16 ; [*052B.0020.0002] # TIBETAN LOGOTYPE SIGN LHAG RTAGS +0F17 ; [*052C.0020.0002] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS 0F18 ; [.0000.0000.0000] # TIBETAN ASTROLOGICAL SIGN -KHYUD PA 0F19 ; [.0000.0000.0000] # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F1A ; [*050D.0020.0002] # TIBETAN SIGN RDEL DKAR GCIG -0F1B ; [*050E.0020.0002] # TIBETAN SIGN RDEL DKAR GNYIS -0F1C ; [*050F.0020.0002] # TIBETAN SIGN RDEL DKAR GSUM -0F1D ; [*0510.0020.0002] # TIBETAN SIGN RDEL NAG GCIG -0F1E ; [*0511.0020.0002] # TIBETAN SIGN RDEL NAG GNYIS -0F1F ; [*0512.0020.0002] # TIBETAN SIGN RDEL DKAR RDEL NAG -0F34 ; [*0513.0020.0002] # TIBETAN MARK BSDUS RTAGS +0F1A ; [*052D.0020.0002] # TIBETAN SIGN RDEL DKAR GCIG +0F1B ; [*052E.0020.0002] # TIBETAN SIGN RDEL DKAR GNYIS +0F1C ; [*052F.0020.0002] # TIBETAN SIGN RDEL DKAR GSUM +0F1D ; [*0530.0020.0002] # TIBETAN SIGN RDEL NAG GCIG +0F1E ; [*0531.0020.0002] # TIBETAN SIGN RDEL NAG GNYIS +0F1F ; [*0532.0020.0002] # TIBETAN SIGN RDEL DKAR RDEL NAG +0F34 ; [*0533.0020.0002] # TIBETAN MARK BSDUS RTAGS 0F35 ; [.0000.0000.0000] # TIBETAN MARK NGAS BZUNG NYI ZLA -0F36 ; [*0514.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F36 ; [*0534.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN 0F37 ; [.0000.0000.0000] # TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F38 ; [*0515.0020.0002] # TIBETAN MARK CHE MGO -0F3A ; [*0316.0020.0002] # TIBETAN MARK GUG RTAGS GYON -0F3B ; [*0317.0020.0002] # TIBETAN MARK GUG RTAGS GYAS -0F3C ; [*0318.0020.0002] # TIBETAN MARK ANG KHANG GYON -0F3D ; [*0319.0020.0002] # TIBETAN MARK ANG KHANG GYAS +0F38 ; [*0535.0020.0002] # TIBETAN MARK CHE MGO +0F3A ; [*031D.0020.0002] # TIBETAN MARK GUG RTAGS GYON +0F3B ; [*031E.0020.0002] # TIBETAN MARK GUG RTAGS GYAS +0F3C ; [*031F.0020.0002] # TIBETAN MARK ANG KHANG GYON +0F3D ; [*0320.0020.0002] # TIBETAN MARK ANG KHANG GYAS 0F3E ; [.0000.0000.0000] # TIBETAN SIGN YAR TSHES 0F3F ; [.0000.0000.0000] # TIBETAN SIGN MAR TSHES 0F82 ; [.0000.0000.0000] # TIBETAN SIGN NYI ZLA NAA DA 0F83 ; [.0000.0000.0000] # TIBETAN SIGN SNA LDAN -0F85 ; [*03EE.0020.0002] # TIBETAN MARK PALUTA +0F85 ; [*0403.0020.0002] # TIBETAN MARK PALUTA 0F86 ; [.0000.0000.0000] # TIBETAN SIGN LCI RTAGS 0F87 ; [.0000.0000.0000] # TIBETAN SIGN YANG RTAGS -0FBE ; [*0516.0020.0002] # TIBETAN KU RU KHA -0FBF ; [*0517.0020.0002] # TIBETAN KU RU KHA BZHI MIG CAN -0FC0 ; [*0518.0020.0002] # TIBETAN CANTILLATION SIGN HEAVY BEAT -0FC1 ; [*0519.0020.0002] # TIBETAN CANTILLATION SIGN LIGHT BEAT -0FC2 ; [*051A.0020.0002] # TIBETAN CANTILLATION SIGN CANG TE-U -0FC3 ; [*051B.0020.0002] # TIBETAN CANTILLATION SIGN SBUB -CHAL -0FC4 ; [*051C.0020.0002] # TIBETAN SYMBOL DRIL BU -0FC5 ; [*051D.0020.0002] # TIBETAN SYMBOL RDO RJE +0FBE ; [*0536.0020.0002] # TIBETAN KU RU KHA +0FBF ; [*0537.0020.0002] # TIBETAN KU RU KHA BZHI MIG CAN +0FC0 ; [*0538.0020.0002] # TIBETAN CANTILLATION SIGN HEAVY BEAT +0FC1 ; [*0539.0020.0002] # TIBETAN CANTILLATION SIGN LIGHT BEAT +0FC2 ; [*053A.0020.0002] # TIBETAN CANTILLATION SIGN CANG TE-U +0FC3 ; [*053B.0020.0002] # TIBETAN CANTILLATION SIGN SBUB -CHAL +0FC4 ; [*053C.0020.0002] # TIBETAN SYMBOL DRIL BU +0FC5 ; [*053D.0020.0002] # TIBETAN SYMBOL RDO RJE 0FC6 ; [.0000.0000.0000] # TIBETAN SYMBOL PADMA GDAN -0FC7 ; [*051E.0020.0002] # TIBETAN SYMBOL RDO RJE RGYA GRAM -0FC8 ; [*051F.0020.0002] # TIBETAN SYMBOL PHUR PA -0FC9 ; [*0520.0020.0002] # TIBETAN SYMBOL NOR BU -0FCA ; [*0521.0020.0002] # TIBETAN SYMBOL NOR BU NYIS -KHYIL -0FCB ; [*0522.0020.0002] # TIBETAN SYMBOL NOR BU GSUM -KHYIL -0FCC ; [*0523.0020.0002] # TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCE ; [*0524.0020.0002] # TIBETAN SIGN RDEL NAG RDEL DKAR -0FCF ; [*0525.0020.0002] # TIBETAN SIGN RDEL NAG GSUM -0FD0 ; [*03E5.0020.0002] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN -0FD1 ; [*03E6.0020.0002] # TIBETAN MARK MNYAM YIG GI MGO RGYAN -0FD2 ; [*03EF.0020.0002] # TIBETAN MARK NYIS TSHEG -0FD3 ; [*03F0.0020.0002] # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA -0FD4 ; [*03F1.0020.0002] # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA -0FD5 ; [*0526.0020.0002] # RIGHT-FACING SVASTI SIGN -0FD6 ; [*0527.0020.0002] # LEFT-FACING SVASTI SIGN -0FD7 ; [*0528.0020.0002] # RIGHT-FACING SVASTI SIGN WITH DOTS -0FD8 ; [*0529.0020.0002] # LEFT-FACING SVASTI SIGN WITH DOTS -0FD9 ; [*03F2.0020.0002] # TIBETAN MARK LEADING MCHAN RTAGS -0FDA ; [*03F3.0020.0002] # TIBETAN MARK TRAILING MCHAN RTAGS -104A ; [*0296.0020.0002] # MYANMAR SIGN LITTLE SECTION -104B ; [*0297.0020.0002] # MYANMAR SIGN SECTION -104C ; [*03F7.0020.0002] # MYANMAR SYMBOL LOCATIVE -104D ; [*03F8.0020.0002] # MYANMAR SYMBOL COMPLETED -104E ; [*03F9.0020.0002] # MYANMAR SYMBOL AFOREMENTIONED -104F ; [*03FA.0020.0002] # MYANMAR SYMBOL GENITIVE -109E ; [*052B.0020.0002] # MYANMAR SYMBOL SHAN ONE -109F ; [*052C.0020.0002] # MYANMAR SYMBOL SHAN EXCLAMATION -10FB ; [*02BF.0020.0002] # GEORGIAN PARAGRAPH SEPARATOR -1360 ; [*02C0.0020.0002] # ETHIOPIC SECTION MARK -1361 ; [*0250.0020.0002] # ETHIOPIC WORDSPACE -1362 ; [*0279.0020.0002] # ETHIOPIC FULL STOP -1363 ; [*0251.0020.0002] # ETHIOPIC COMMA -1364 ; [*0252.0020.0002] # ETHIOPIC SEMICOLON -1365 ; [*0253.0020.0002] # ETHIOPIC COLON -1366 ; [*0254.0020.0002] # ETHIOPIC PREFACE COLON -1367 ; [*026A.0020.0002] # ETHIOPIC QUESTION MARK -1368 ; [*02C1.0020.0002] # ETHIOPIC PARAGRAPH SEPARATOR -1372 ; [*1A41.0020.0002] # ETHIOPIC NUMBER TEN -1373 ; [*1A42.0020.0002] # ETHIOPIC NUMBER TWENTY -1374 ; [*1A43.0020.0002] # ETHIOPIC NUMBER THIRTY -1375 ; [*1A44.0020.0002] # ETHIOPIC NUMBER FORTY -1376 ; [*1A45.0020.0002] # ETHIOPIC NUMBER FIFTY -1377 ; [*1A46.0020.0002] # ETHIOPIC NUMBER SIXTY -1378 ; [*1A47.0020.0002] # ETHIOPIC NUMBER SEVENTY -1379 ; [*1A48.0020.0002] # ETHIOPIC NUMBER EIGHTY -137A ; [*1A49.0020.0002] # ETHIOPIC NUMBER NINETY -137B ; [*1A4A.0020.0002] # ETHIOPIC NUMBER HUNDRED -137C ; [*1A4B.0020.0002] # ETHIOPIC NUMBER TEN THOUSAND -1390 ; [*04A7.0020.0002] # ETHIOPIC TONAL MARK YIZET -1391 ; [*04A8.0020.0002] # ETHIOPIC TONAL MARK DERET -1392 ; [*04A9.0020.0002] # ETHIOPIC TONAL MARK RIKRIK -1393 ; [*04AA.0020.0002] # ETHIOPIC TONAL MARK SHORT RIKRIK -1394 ; [*04AB.0020.0002] # ETHIOPIC TONAL MARK DIFAT -1395 ; [*04AC.0020.0002] # ETHIOPIC TONAL MARK KENAT -1396 ; [*04AD.0020.0002] # ETHIOPIC TONAL MARK CHIRET -1397 ; [*04AE.0020.0002] # ETHIOPIC TONAL MARK HIDET -1398 ; [*04AF.0020.0002] # ETHIOPIC TONAL MARK DERET-HIDET -1399 ; [*04B0.0020.0002] # ETHIOPIC TONAL MARK KURT +0FC7 ; [*053E.0020.0002] # TIBETAN SYMBOL RDO RJE RGYA GRAM +0FC8 ; [*053F.0020.0002] # TIBETAN SYMBOL PHUR PA +0FC9 ; [*0540.0020.0002] # TIBETAN SYMBOL NOR BU +0FCA ; [*0541.0020.0002] # TIBETAN SYMBOL NOR BU NYIS -KHYIL +0FCB ; [*0542.0020.0002] # TIBETAN SYMBOL NOR BU GSUM -KHYIL +0FCC ; [*0543.0020.0002] # TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE ; [*0544.0020.0002] # TIBETAN SIGN RDEL NAG RDEL DKAR +0FCF ; [*0545.0020.0002] # TIBETAN SIGN RDEL NAG GSUM +0FD0 ; [*03FA.0020.0002] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN +0FD1 ; [*03FB.0020.0002] # TIBETAN MARK MNYAM YIG GI MGO RGYAN +0FD2 ; [*0404.0020.0002] # TIBETAN MARK NYIS TSHEG +0FD3 ; [*0405.0020.0002] # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA +0FD4 ; [*0406.0020.0002] # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5 ; [*0546.0020.0002] # RIGHT-FACING SVASTI SIGN +0FD6 ; [*0547.0020.0002] # LEFT-FACING SVASTI SIGN +0FD7 ; [*0548.0020.0002] # RIGHT-FACING SVASTI SIGN WITH DOTS +0FD8 ; [*0549.0020.0002] # LEFT-FACING SVASTI SIGN WITH DOTS +0FD9 ; [*0407.0020.0002] # TIBETAN MARK LEADING MCHAN RTAGS +0FDA ; [*0408.0020.0002] # TIBETAN MARK TRAILING MCHAN RTAGS +104A ; [*0299.0020.0002] # MYANMAR SIGN LITTLE SECTION +104B ; [*029A.0020.0002] # MYANMAR SIGN SECTION +104C ; [*040E.0020.0002] # MYANMAR SYMBOL LOCATIVE +104D ; [*040F.0020.0002] # MYANMAR SYMBOL COMPLETED +104E ; [*0410.0020.0002] # MYANMAR SYMBOL AFOREMENTIONED +104F ; [*0411.0020.0002] # MYANMAR SYMBOL GENITIVE +109E ; [*054B.0020.0002] # MYANMAR SYMBOL SHAN ONE +109F ; [*054C.0020.0002] # MYANMAR SYMBOL SHAN EXCLAMATION +10FB ; [*02C6.0020.0002] # GEORGIAN PARAGRAPH SEPARATOR +1360 ; [*02C7.0020.0002] # ETHIOPIC SECTION MARK +1361 ; [*0251.0020.0002] # ETHIOPIC WORDSPACE +1362 ; [*027C.0020.0002] # ETHIOPIC FULL STOP +1363 ; [*0252.0020.0002] # ETHIOPIC COMMA +1364 ; [*0253.0020.0002] # ETHIOPIC SEMICOLON +1365 ; [*0254.0020.0002] # ETHIOPIC COLON +1366 ; [*0255.0020.0002] # ETHIOPIC PREFACE COLON +1367 ; [*026C.0020.0002] # ETHIOPIC QUESTION MARK +1368 ; [*02C8.0020.0002] # ETHIOPIC PARAGRAPH SEPARATOR +1372 ; [*1ABB.0020.0002] # ETHIOPIC NUMBER TEN +1373 ; [*1ABC.0020.0002] # ETHIOPIC NUMBER TWENTY +1374 ; [*1ABD.0020.0002] # ETHIOPIC NUMBER THIRTY +1375 ; [*1ABE.0020.0002] # ETHIOPIC NUMBER FORTY +1376 ; [*1ABF.0020.0002] # ETHIOPIC NUMBER FIFTY +1377 ; [*1AC0.0020.0002] # ETHIOPIC NUMBER SIXTY +1378 ; [*1AC1.0020.0002] # ETHIOPIC NUMBER SEVENTY +1379 ; [*1AC2.0020.0002] # ETHIOPIC NUMBER EIGHTY +137A ; [*1AC3.0020.0002] # ETHIOPIC NUMBER NINETY +137B ; [*1AC4.0020.0002] # ETHIOPIC NUMBER HUNDRED +137C ; [*1AC5.0020.0002] # ETHIOPIC NUMBER TEN THOUSAND +1390 ; [*04C6.0020.0002] # ETHIOPIC TONAL MARK YIZET +1391 ; [*04C7.0020.0002] # ETHIOPIC TONAL MARK DERET +1392 ; [*04C8.0020.0002] # ETHIOPIC TONAL MARK RIKRIK +1393 ; [*04C9.0020.0002] # ETHIOPIC TONAL MARK SHORT RIKRIK +1394 ; [*04CA.0020.0002] # ETHIOPIC TONAL MARK DIFAT +1395 ; [*04CB.0020.0002] # ETHIOPIC TONAL MARK KENAT +1396 ; [*04CC.0020.0002] # ETHIOPIC TONAL MARK CHIRET +1397 ; [*04CD.0020.0002] # ETHIOPIC TONAL MARK HIDET +1398 ; [*04CE.0020.0002] # ETHIOPIC TONAL MARK DERET-HIDET +1399 ; [*04CF.0020.0002] # ETHIOPIC TONAL MARK KURT 1400 ; [*020F.0020.0002] # CANADIAN SYLLABICS HYPHEN -166D ; [*0407.0020.0002] # CANADIAN SYLLABICS CHI SIGN -166E ; [*027C.0020.0002] # CANADIAN SYLLABICS FULL STOP +166D ; [*041E.0020.0002] # CANADIAN SYLLABICS CHI SIGN +166E ; [*027F.0020.0002] # CANADIAN SYLLABICS FULL STOP 1680 ; [*0209.0020.0004] # OGHAM SPACE MARK -169B ; [*031A.0020.0002] # OGHAM FEATHER MARK -169C ; [*031B.0020.0002] # OGHAM REVERSED FEATHER MARK -16EB ; [*025B.0020.0002] # RUNIC SINGLE PUNCTUATION -16EC ; [*025C.0020.0002] # RUNIC MULTIPLE PUNCTUATION -16ED ; [*025D.0020.0002] # RUNIC CROSS PUNCTUATION -1735 ; [*0293.0020.0002] # PHILIPPINE SINGLE PUNCTUATION -1736 ; [*0294.0020.0002] # PHILIPPINE DOUBLE PUNCTUATION +169B ; [*0321.0020.0002] # OGHAM FEATHER MARK +169C ; [*0322.0020.0002] # OGHAM REVERSED FEATHER MARK +16EB ; [*025C.0020.0002] # RUNIC SINGLE PUNCTUATION +16EC ; [*025D.0020.0002] # RUNIC MULTIPLE PUNCTUATION +16ED ; [*025E.0020.0002] # RUNIC CROSS PUNCTUATION +1735 ; [*0296.0020.0002] # PHILIPPINE SINGLE PUNCTUATION +1736 ; [*0297.0020.0002] # PHILIPPINE DOUBLE PUNCTUATION 17B4 ; [.0000.0000.0000] # KHMER VOWEL INHERENT AQ 17B5 ; [.0000.0000.0000] # KHMER VOWEL INHERENT AA 17D3 ; [.0000.0000.0000] # KHMER SIGN BATHAMASAT -17D4 ; [*0298.0020.0002] # KHMER SIGN KHAN -17D5 ; [*0299.0020.0002] # KHMER SIGN BARIYOOSAN -17D6 ; [*0258.0020.0002] # KHMER SIGN CAMNUC PII KUUH -17D8 ; [*03FB.0020.0002] # KHMER SIGN BEYYAL -17D9 ; [*03FC.0020.0002] # KHMER SIGN PHNAEK MUAN -17DA ; [*03FD.0020.0002] # KHMER SIGN KOOMUUT -1800 ; [*03D1.0020.0002] # MONGOLIAN BIRGA -1801 ; [*0275.0020.0002] # MONGOLIAN ELLIPSIS -1802 ; [*022B.0020.0002] # MONGOLIAN COMMA -1803 ; [*027A.0020.0002] # MONGOLIAN FULL STOP -1804 ; [*0255.0020.0002] # MONGOLIAN COLON -1805 ; [*0256.0020.0002] # MONGOLIAN FOUR DOTS +17D4 ; [*029B.0020.0002] # KHMER SIGN KHAN +17D5 ; [*029C.0020.0002] # KHMER SIGN BARIYOOSAN +17D6 ; [*0259.0020.0002] # KHMER SIGN CAMNUC PII KUUH +17D8 ; [*0412.0020.0002] # KHMER SIGN BEYYAL +17D9 ; [*0413.0020.0002] # KHMER SIGN PHNAEK MUAN +17DA ; [*0414.0020.0002] # KHMER SIGN KOOMUUT +1800 ; [*03D9.0020.0002] # MONGOLIAN BIRGA +1801 ; [*0278.0020.0002] # MONGOLIAN ELLIPSIS +1802 ; [*022C.0020.0002] # MONGOLIAN COMMA +1803 ; [*027D.0020.0002] # MONGOLIAN FULL STOP +1804 ; [*0256.0020.0002] # MONGOLIAN COLON +1805 ; [*0257.0020.0002] # MONGOLIAN FOUR DOTS 1806 ; [*0211.0020.0002] # MONGOLIAN TODO SOFT HYPHEN 1807 ; [*0212.0020.0002] # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER -1808 ; [*022C.0020.0002] # MONGOLIAN MANCHU COMMA -1809 ; [*027B.0020.0002] # MONGOLIAN MANCHU FULL STOP +1808 ; [*022D.0020.0002] # MONGOLIAN MANCHU COMMA +1809 ; [*027E.0020.0002] # MONGOLIAN MANCHU FULL STOP 180A ; [.0000.0000.0000] # MONGOLIAN NIRUGU -1940 ; [*052A.0020.0002] # LIMBU SIGN LOO -1944 ; [*0263.0020.0002] # LIMBU EXCLAMATION MARK -1945 ; [*026B.0020.0002] # LIMBU QUESTION MARK -19E0 ; [*0531.0020.0002] # KHMER SYMBOL PATHAMASAT -19E1 ; [*0532.0020.0002] # KHMER SYMBOL MUOY KOET -19E2 ; [*0533.0020.0002] # KHMER SYMBOL PII KOET -19E3 ; [*0534.0020.0002] # KHMER SYMBOL BEI KOET -19E4 ; [*0535.0020.0002] # KHMER SYMBOL BUON KOET -19E5 ; [*0536.0020.0002] # KHMER SYMBOL PRAM KOET -19E6 ; [*0537.0020.0002] # KHMER SYMBOL PRAM-MUOY KOET -19E7 ; [*0538.0020.0002] # KHMER SYMBOL PRAM-PII KOET -19E8 ; [*0539.0020.0002] # KHMER SYMBOL PRAM-BEI KOET -19E9 ; [*053A.0020.0002] # KHMER SYMBOL PRAM-BUON KOET -19EA ; [*053B.0020.0002] # KHMER SYMBOL DAP KOET -19EB ; [*053C.0020.0002] # KHMER SYMBOL DAP-MUOY KOET -19EC ; [*053D.0020.0002] # KHMER SYMBOL DAP-PII KOET -19ED ; [*053E.0020.0002] # KHMER SYMBOL DAP-BEI KOET -19EE ; [*053F.0020.0002] # KHMER SYMBOL DAP-BUON KOET -19EF ; [*0540.0020.0002] # KHMER SYMBOL DAP-PRAM KOET -19F0 ; [*0541.0020.0002] # KHMER SYMBOL TUTEYASAT -19F1 ; [*0542.0020.0002] # KHMER SYMBOL MUOY ROC -19F2 ; [*0543.0020.0002] # KHMER SYMBOL PII ROC -19F3 ; [*0544.0020.0002] # KHMER SYMBOL BEI ROC -19F4 ; [*0545.0020.0002] # KHMER SYMBOL BUON ROC -19F5 ; [*0546.0020.0002] # KHMER SYMBOL PRAM ROC -19F6 ; [*0547.0020.0002] # KHMER SYMBOL PRAM-MUOY ROC -19F7 ; [*0548.0020.0002] # KHMER SYMBOL PRAM-PII ROC -19F8 ; [*0549.0020.0002] # KHMER SYMBOL PRAM-BEI ROC -19F9 ; [*054A.0020.0002] # KHMER SYMBOL PRAM-BUON ROC -19FA ; [*054B.0020.0002] # KHMER SYMBOL DAP ROC -19FB ; [*054C.0020.0002] # KHMER SYMBOL DAP-MUOY ROC -19FC ; [*054D.0020.0002] # KHMER SYMBOL DAP-PII ROC -19FD ; [*054E.0020.0002] # KHMER SYMBOL DAP-BEI ROC -19FE ; [*054F.0020.0002] # KHMER SYMBOL DAP-BUON ROC -19FF ; [*0550.0020.0002] # KHMER SYMBOL DAP-PRAM ROC -1A1E ; [*02C2.0020.0002] # BUGINESE PALLAWA -1A1F ; [*02C3.0020.0002] # BUGINESE END OF SECTION +1940 ; [*054A.0020.0002] # LIMBU SIGN LOO +1944 ; [*0264.0020.0002] # LIMBU EXCLAMATION MARK +1945 ; [*026D.0020.0002] # LIMBU QUESTION MARK +19E0 ; [*0551.0020.0002] # KHMER SYMBOL PATHAMASAT +19E1 ; [*0552.0020.0002] # KHMER SYMBOL MUOY KOET +19E2 ; [*0553.0020.0002] # KHMER SYMBOL PII KOET +19E3 ; [*0554.0020.0002] # KHMER SYMBOL BEI KOET +19E4 ; [*0555.0020.0002] # KHMER SYMBOL BUON KOET +19E5 ; [*0556.0020.0002] # KHMER SYMBOL PRAM KOET +19E6 ; [*0557.0020.0002] # KHMER SYMBOL PRAM-MUOY KOET +19E7 ; [*0558.0020.0002] # KHMER SYMBOL PRAM-PII KOET +19E8 ; [*0559.0020.0002] # KHMER SYMBOL PRAM-BEI KOET +19E9 ; [*055A.0020.0002] # KHMER SYMBOL PRAM-BUON KOET +19EA ; [*055B.0020.0002] # KHMER SYMBOL DAP KOET +19EB ; [*055C.0020.0002] # KHMER SYMBOL DAP-MUOY KOET +19EC ; [*055D.0020.0002] # KHMER SYMBOL DAP-PII KOET +19ED ; [*055E.0020.0002] # KHMER SYMBOL DAP-BEI KOET +19EE ; [*055F.0020.0002] # KHMER SYMBOL DAP-BUON KOET +19EF ; [*0560.0020.0002] # KHMER SYMBOL DAP-PRAM KOET +19F0 ; [*0561.0020.0002] # KHMER SYMBOL TUTEYASAT +19F1 ; [*0562.0020.0002] # KHMER SYMBOL MUOY ROC +19F2 ; [*0563.0020.0002] # KHMER SYMBOL PII ROC +19F3 ; [*0564.0020.0002] # KHMER SYMBOL BEI ROC +19F4 ; [*0565.0020.0002] # KHMER SYMBOL BUON ROC +19F5 ; [*0566.0020.0002] # KHMER SYMBOL PRAM ROC +19F6 ; [*0567.0020.0002] # KHMER SYMBOL PRAM-MUOY ROC +19F7 ; [*0568.0020.0002] # KHMER SYMBOL PRAM-PII ROC +19F8 ; [*0569.0020.0002] # KHMER SYMBOL PRAM-BEI ROC +19F9 ; [*056A.0020.0002] # KHMER SYMBOL PRAM-BUON ROC +19FA ; [*056B.0020.0002] # KHMER SYMBOL DAP ROC +19FB ; [*056C.0020.0002] # KHMER SYMBOL DAP-MUOY ROC +19FC ; [*056D.0020.0002] # KHMER SYMBOL DAP-PII ROC +19FD ; [*056E.0020.0002] # KHMER SYMBOL DAP-BEI ROC +19FE ; [*056F.0020.0002] # KHMER SYMBOL DAP-BUON ROC +19FF ; [*0570.0020.0002] # KHMER SYMBOL DAP-PRAM ROC +1A1E ; [*02C9.0020.0002] # BUGINESE PALLAWA +1A1F ; [*02CA.0020.0002] # BUGINESE END OF SECTION 1A7F ; [.0000.0000.0000] # TAI THAM COMBINING CRYPTOGRAMMIC DOT -1AA0 ; [*03FE.0020.0002] # TAI THAM SIGN WIANG -1AA1 ; [*03FF.0020.0002] # TAI THAM SIGN WIANGWAAK -1AA2 ; [*0400.0020.0002] # TAI THAM SIGN SAWAN -1AA3 ; [*0401.0020.0002] # TAI THAM SIGN KEOW -1AA4 ; [*0402.0020.0002] # TAI THAM SIGN HOY -1AA5 ; [*0403.0020.0002] # TAI THAM SIGN DOKMAI -1AA6 ; [*0404.0020.0002] # TAI THAM SIGN REVERSED ROTATED RANA -1AA8 ; [*029A.0020.0002] # TAI THAM SIGN KAAN -1AA9 ; [*029B.0020.0002] # TAI THAM SIGN KAANKUU -1AAA ; [*029C.0020.0002] # TAI THAM SIGN SATKAAN -1AAB ; [*029D.0020.0002] # TAI THAM SIGN SATKAANKUU -1AAC ; [*0405.0020.0002] # TAI THAM SIGN HANG -1AAD ; [*0406.0020.0002] # TAI THAM SIGN CAANG -1B5A ; [*02C4.0020.0002] # BALINESE PANTI -1B5B ; [*02C5.0020.0002] # BALINESE PAMADA -1B5C ; [*027D.0020.0002] # BALINESE WINDU -1B5D ; [*0259.0020.0002] # BALINESE CARIK PAMUNGKAH -1B5E ; [*029E.0020.0002] # BALINESE CARIK SIKI -1B5F ; [*029F.0020.0002] # BALINESE CARIK PAREREN +1AA0 ; [*0415.0020.0002] # TAI THAM SIGN WIANG +1AA1 ; [*0416.0020.0002] # TAI THAM SIGN WIANGWAAK +1AA2 ; [*0417.0020.0002] # TAI THAM SIGN SAWAN +1AA3 ; [*0418.0020.0002] # TAI THAM SIGN KEOW +1AA4 ; [*0419.0020.0002] # TAI THAM SIGN HOY +1AA5 ; [*041A.0020.0002] # TAI THAM SIGN DOKMAI +1AA6 ; [*041B.0020.0002] # TAI THAM SIGN REVERSED ROTATED RANA +1AA8 ; [*029D.0020.0002] # TAI THAM SIGN KAAN +1AA9 ; [*029E.0020.0002] # TAI THAM SIGN KAANKUU +1AAA ; [*029F.0020.0002] # TAI THAM SIGN SATKAAN +1AAB ; [*02A0.0020.0002] # TAI THAM SIGN SATKAANKUU +1AAC ; [*041C.0020.0002] # TAI THAM SIGN HANG +1AAD ; [*041D.0020.0002] # TAI THAM SIGN CAANG +1B5A ; [*02CB.0020.0002] # BALINESE PANTI +1B5B ; [*02CC.0020.0002] # BALINESE PAMADA +1B5C ; [*0280.0020.0002] # BALINESE WINDU +1B5D ; [*025A.0020.0002] # BALINESE CARIK PAMUNGKAH +1B5E ; [*02A1.0020.0002] # BALINESE CARIK SIKI +1B5F ; [*02A2.0020.0002] # BALINESE CARIK PAREREN 1B60 ; [*0210.0020.0002] # BALINESE PAMENENG -1B61 ; [*0551.0020.0002] # BALINESE MUSICAL SYMBOL DONG -1B62 ; [*0552.0020.0002] # BALINESE MUSICAL SYMBOL DENG -1B63 ; [*0553.0020.0002] # BALINESE MUSICAL SYMBOL DUNG -1B64 ; [*0554.0020.0002] # BALINESE MUSICAL SYMBOL DANG -1B65 ; [*0555.0020.0002] # BALINESE MUSICAL SYMBOL DANG SURANG -1B66 ; [*0556.0020.0002] # BALINESE MUSICAL SYMBOL DING -1B67 ; [*0557.0020.0002] # BALINESE MUSICAL SYMBOL DAENG -1B68 ; [*0558.0020.0002] # BALINESE MUSICAL SYMBOL DEUNG -1B69 ; [*0559.0020.0002] # BALINESE MUSICAL SYMBOL DAING -1B6A ; [*055A.0020.0002] # BALINESE MUSICAL SYMBOL DANG GEDE +1B61 ; [*0571.0020.0002] # BALINESE MUSICAL SYMBOL DONG +1B62 ; [*0572.0020.0002] # BALINESE MUSICAL SYMBOL DENG +1B63 ; [*0573.0020.0002] # BALINESE MUSICAL SYMBOL DUNG +1B64 ; [*0574.0020.0002] # BALINESE MUSICAL SYMBOL DANG +1B65 ; [*0575.0020.0002] # BALINESE MUSICAL SYMBOL DANG SURANG +1B66 ; [*0576.0020.0002] # BALINESE MUSICAL SYMBOL DING +1B67 ; [*0577.0020.0002] # BALINESE MUSICAL SYMBOL DAENG +1B68 ; [*0578.0020.0002] # BALINESE MUSICAL SYMBOL DEUNG +1B69 ; [*0579.0020.0002] # BALINESE MUSICAL SYMBOL DAING +1B6A ; [*057A.0020.0002] # BALINESE MUSICAL SYMBOL DANG GEDE 1B6B ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING TEGEH 1B6C ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING ENDEP 1B6D ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL @@ -1018,34 +1045,34 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 1B71 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN 1B72 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING BENDE 1B73 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING GONG -1B74 ; [*055B.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG -1B75 ; [*055C.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG -1B76 ; [*055D.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK -1B77 ; [*055E.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK -1B78 ; [*055F.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG -1B79 ; [*0560.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG -1B7A ; [*0561.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK -1B7B ; [*0562.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK -1B7C ; [*0563.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING -1BFC ; [*0413.0020.0002] # BATAK SYMBOL BINDU NA METEK -1BFD ; [*0414.0020.0002] # BATAK SYMBOL BINDU PINARBORAS -1BFE ; [*0415.0020.0002] # BATAK SYMBOL BINDU JUDUL -1BFF ; [*0416.0020.0002] # BATAK SYMBOL BINDU PANGOLAT -1C3B ; [*028F.0020.0002] # LEPCHA PUNCTUATION TA-ROL -1C3C ; [*0290.0020.0002] # LEPCHA PUNCTUATION NYET THYOOM TA-ROL -1C3D ; [*03F4.0020.0002] # LEPCHA PUNCTUATION CER-WA -1C3E ; [*03F5.0020.0002] # LEPCHA PUNCTUATION TSHOOK CER-WA -1C3F ; [*03F6.0020.0002] # LEPCHA PUNCTUATION TSHOOK -1C7E ; [*02BB.0020.0002] # OL CHIKI PUNCTUATION MUCAAD -1C7F ; [*02BC.0020.0002] # OL CHIKI PUNCTUATION DOUBLE MUCAAD -1CC0 ; [*0408.0020.0002] # SUNDANESE PUNCTUATION BINDU SURYA -1CC1 ; [*0409.0020.0002] # SUNDANESE PUNCTUATION BINDU PANGLONG -1CC2 ; [*040A.0020.0002] # SUNDANESE PUNCTUATION BINDU PURNAMA -1CC3 ; [*040B.0020.0002] # SUNDANESE PUNCTUATION BINDU CAKRA -1CC4 ; [*040C.0020.0002] # SUNDANESE PUNCTUATION BINDU LEU SATANGA -1CC5 ; [*040D.0020.0002] # SUNDANESE PUNCTUATION BINDU KA SATANGA -1CC6 ; [*040E.0020.0002] # SUNDANESE PUNCTUATION BINDU DA SATANGA -1CC7 ; [*040F.0020.0002] # SUNDANESE PUNCTUATION BINDU BA SATANGA +1B74 ; [*057B.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG +1B75 ; [*057C.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG +1B76 ; [*057D.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK +1B77 ; [*057E.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK +1B78 ; [*057F.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG +1B79 ; [*0580.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG +1B7A ; [*0581.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK +1B7B ; [*0582.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK +1B7C ; [*0583.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1BFC ; [*042A.0020.0002] # BATAK SYMBOL BINDU NA METEK +1BFD ; [*042B.0020.0002] # BATAK SYMBOL BINDU PINARBORAS +1BFE ; [*042C.0020.0002] # BATAK SYMBOL BINDU JUDUL +1BFF ; [*042D.0020.0002] # BATAK SYMBOL BINDU PANGOLAT +1C3B ; [*0292.0020.0002] # LEPCHA PUNCTUATION TA-ROL +1C3C ; [*0293.0020.0002] # LEPCHA PUNCTUATION NYET THYOOM TA-ROL +1C3D ; [*040B.0020.0002] # LEPCHA PUNCTUATION CER-WA +1C3E ; [*040C.0020.0002] # LEPCHA PUNCTUATION TSHOOK CER-WA +1C3F ; [*040D.0020.0002] # LEPCHA PUNCTUATION TSHOOK +1C7E ; [*02C2.0020.0002] # OL CHIKI PUNCTUATION MUCAAD +1C7F ; [*02C3.0020.0002] # OL CHIKI PUNCTUATION DOUBLE MUCAAD +1CC0 ; [*041F.0020.0002] # SUNDANESE PUNCTUATION BINDU SURYA +1CC1 ; [*0420.0020.0002] # SUNDANESE PUNCTUATION BINDU PANGLONG +1CC2 ; [*0421.0020.0002] # SUNDANESE PUNCTUATION BINDU PURNAMA +1CC3 ; [*0422.0020.0002] # SUNDANESE PUNCTUATION BINDU CAKRA +1CC4 ; [*0423.0020.0002] # SUNDANESE PUNCTUATION BINDU LEU SATANGA +1CC5 ; [*0424.0020.0002] # SUNDANESE PUNCTUATION BINDU KA SATANGA +1CC6 ; [*0425.0020.0002] # SUNDANESE PUNCTUATION BINDU DA SATANGA +1CC7 ; [*0426.0020.0002] # SUNDANESE PUNCTUATION BINDU BA SATANGA 1CD0 ; [.0000.0000.0000] # VEDIC TONE KARSHANA 1CD1 ; [.0000.0000.0000] # VEDIC TONE SHARA 1CD2 ; [.0000.0000.0000] # VEDIC TONE PRENKHA @@ -1074,21 +1101,21 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 1CF4 ; [.0000.0000.0000] # VEDIC TONE CANDRA ABOVE 1CF8 ; [.0000.0000.0000] # VEDIC TONE RING ABOVE 1CF9 ; [.0000.0000.0000] # VEDIC TONE DOUBLE RING ABOVE -1FBD ; [*046F.0020.0002] # GREEK KORONIS -1FBF ; [*046F.0020.0002] # GREEK PSILI -1FC0 ; [*0471.0020.0002] # GREEK PERISPOMENI -1FC1 ; [*046A.0020.0002][.0000.002A.0002] # GREEK DIALYTIKA AND PERISPOMENI -1FCD ; [*046F.0020.0002][.0000.0025.0002] # GREEK PSILI AND VARIA -1FCE ; [*046F.0020.0002][.0000.0024.0002] # GREEK PSILI AND OXIA -1FCF ; [*046F.0020.0002][.0000.002A.0002] # GREEK PSILI AND PERISPOMENI -1FDD ; [*0470.0020.0002][.0000.0025.0002] # GREEK DASIA AND VARIA -1FDE ; [*0470.0020.0002][.0000.0024.0002] # GREEK DASIA AND OXIA -1FDF ; [*0470.0020.0002][.0000.002A.0002] # GREEK DASIA AND PERISPOMENI -1FED ; [*046A.0020.0002][.0000.0025.0002] # GREEK DIALYTIKA AND VARIA -1FEE ; [*046A.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA AND OXIA -1FEF ; [*0463.0020.0002] # GREEK VARIA -1FFD ; [*0464.0020.0002] # GREEK OXIA -1FFE ; [*0470.0020.0002] # GREEK DASIA +1FBD ; [*048E.0020.0002] # GREEK KORONIS +1FBF ; [*048E.0020.0002] # GREEK PSILI +1FC0 ; [*0490.0020.0002] # GREEK PERISPOMENI +1FC1 ; [*0489.0020.0002][.0000.002A.0002] # GREEK DIALYTIKA AND PERISPOMENI +1FCD ; [*048E.0020.0002][.0000.0025.0002] # GREEK PSILI AND VARIA +1FCE ; [*048E.0020.0002][.0000.0024.0002] # GREEK PSILI AND OXIA +1FCF ; [*048E.0020.0002][.0000.002A.0002] # GREEK PSILI AND PERISPOMENI +1FDD ; [*048F.0020.0002][.0000.0025.0002] # GREEK DASIA AND VARIA +1FDE ; [*048F.0020.0002][.0000.0024.0002] # GREEK DASIA AND OXIA +1FDF ; [*048F.0020.0002][.0000.002A.0002] # GREEK DASIA AND PERISPOMENI +1FED ; [*0489.0020.0002][.0000.0025.0002] # GREEK DIALYTIKA AND VARIA +1FEE ; [*0489.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA AND OXIA +1FEF ; [*0482.0020.0002] # GREEK VARIA +1FFD ; [*0483.0020.0002] # GREEK OXIA +1FFE ; [*048F.0020.0002] # GREEK DASIA 2000 ; [*0209.0020.0004] # EN QUAD 2001 ; [*0209.0020.0004] # EM QUAD 2002 ; [*0209.0020.0004] # EN SPACE @@ -1106,2863 +1133,2869 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 2013 ; [*0215.0020.0002] # EN DASH 2014 ; [*0216.0020.0002] # EM DASH 2015 ; [*0217.0020.0002] # HORIZONTAL BAR -2016 ; [*037C.0020.0002] # DOUBLE VERTICAL LINE +2016 ; [*0383.0020.0002] # DOUBLE VERTICAL LINE 2017 ; [*020C.0020.0002] # DOUBLE LOW LINE -2018 ; [*02FF.0020.0002] # LEFT SINGLE QUOTATION MARK -2019 ; [*0300.0020.0002] # RIGHT SINGLE QUOTATION MARK -201A ; [*0301.0020.0002] # SINGLE LOW-9 QUOTATION MARK -201B ; [*0302.0020.0002] # SINGLE HIGH-REVERSED-9 QUOTATION MARK -201C ; [*0306.0020.0002] # LEFT DOUBLE QUOTATION MARK -201D ; [*0307.0020.0002] # RIGHT DOUBLE QUOTATION MARK -201E ; [*0308.0020.0002] # DOUBLE LOW-9 QUOTATION MARK -201F ; [*0309.0020.0002] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK -2020 ; [*0398.0020.0002] # DAGGER -2021 ; [*0399.0020.0002] # DOUBLE DAGGER -2022 ; [*039D.0020.0002] # BULLET -2023 ; [*039E.0020.0002] # TRIANGULAR BULLET -2024 ; [*0274.0020.0004] # ONE DOT LEADER -2025 ; [*0274.0020.0004][*0274.0020.0004] # TWO DOT LEADER -2026 ; [*0274.0020.0004][*0274.0020.0004][*0274.0020.0004] # HORIZONTAL ELLIPSIS -2027 ; [*039F.0020.0002] # HYPHENATION POINT +2018 ; [*0306.0020.0002] # LEFT SINGLE QUOTATION MARK +2019 ; [*0307.0020.0002] # RIGHT SINGLE QUOTATION MARK +201A ; [*0308.0020.0002] # SINGLE LOW-9 QUOTATION MARK +201B ; [*0309.0020.0002] # SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C ; [*030D.0020.0002] # LEFT DOUBLE QUOTATION MARK +201D ; [*030E.0020.0002] # RIGHT DOUBLE QUOTATION MARK +201E ; [*030F.0020.0002] # DOUBLE LOW-9 QUOTATION MARK +201F ; [*0310.0020.0002] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020 ; [*039F.0020.0002] # DAGGER +2021 ; [*03A0.0020.0002] # DOUBLE DAGGER +2022 ; [*03A4.0020.0002] # BULLET +2023 ; [*03A5.0020.0002] # TRIANGULAR BULLET +2024 ; [*0277.0020.0004] # ONE DOT LEADER +2025 ; [*0277.0020.0004][*0277.0020.0004] # TWO DOT LEADER +2026 ; [*0277.0020.0004][*0277.0020.0004][*0277.0020.0004] # HORIZONTAL ELLIPSIS +2027 ; [*03A6.0020.0002] # HYPHENATION POINT 2028 ; [*0207.0020.0002] # LINE SEPARATOR 2029 ; [*0208.0020.0002] # PARAGRAPH SEPARATOR 202F ; [*0209.0020.001B] # NARROW NO-BREAK SPACE -2030 ; [*0394.0020.0002] # PER MILLE SIGN -2031 ; [*0396.0020.0002] # PER TEN THOUSAND SIGN -2032 ; [*03A3.0020.0002] # PRIME -2033 ; [*03A3.0020.0004][*03A3.0020.0004] # DOUBLE PRIME -2034 ; [*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004] # TRIPLE PRIME -2035 ; [*03A4.0020.0002] # REVERSED PRIME -2036 ; [*03A4.0020.0004][*03A4.0020.0004] # REVERSED DOUBLE PRIME -2037 ; [*03A4.0020.0004][*03A4.0020.0004][*03A4.0020.0004] # REVERSED TRIPLE PRIME -2038 ; [*03A7.0020.0002] # CARET -2039 ; [*0303.0020.0002] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A ; [*0304.0020.0002] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -203B ; [*03A8.0020.0002] # REFERENCE MARK -203C ; [*025F.0020.0004][*025F.0020.0004] # DOUBLE EXCLAMATION MARK -203D ; [*0272.0020.0002] # INTERROBANG +2030 ; [*039B.0020.0002] # PER MILLE SIGN +2031 ; [*039D.0020.0002] # PER TEN THOUSAND SIGN +2032 ; [*03AA.0020.0002] # PRIME +2033 ; [*03AA.0020.0004][*03AA.0020.0004] # DOUBLE PRIME +2034 ; [*03AA.0020.0004][*03AA.0020.0004][*03AA.0020.0004] # TRIPLE PRIME +2035 ; [*03AB.0020.0002] # REVERSED PRIME +2036 ; [*03AB.0020.0004][*03AB.0020.0004] # REVERSED DOUBLE PRIME +2037 ; [*03AB.0020.0004][*03AB.0020.0004][*03AB.0020.0004] # REVERSED TRIPLE PRIME +2038 ; [*03AE.0020.0002] # CARET +2039 ; [*030A.0020.0002] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; [*030B.0020.0002] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B ; [*03AF.0020.0002] # REFERENCE MARK +203C ; [*0260.0020.0004][*0260.0020.0004] # DOUBLE EXCLAMATION MARK +203D ; [*0275.0020.0002] # INTERROBANG 203E ; [*020A.0020.0002] # OVERLINE -203F ; [*03A9.0020.0002] # UNDERTIE -2040 ; [*03AB.0020.0002] # CHARACTER TIE -2041 ; [*03AD.0020.0002] # CARET INSERTION POINT -2042 ; [*03AE.0020.0002] # ASTERISM -2043 ; [*03A0.0020.0002] # HYPHEN BULLET -2044 ; [*0606.0020.0002] # FRACTION SLASH -2045 ; [*031C.0020.0002] # LEFT SQUARE BRACKET WITH QUILL -2046 ; [*031D.0020.0002] # RIGHT SQUARE BRACKET WITH QUILL -2047 ; [*0264.0020.0004][*0264.0020.0004] # DOUBLE QUESTION MARK -2048 ; [*0264.0020.0004][*025F.0020.0004] # QUESTION EXCLAMATION MARK -2049 ; [*025F.0020.0004][*0264.0020.0004] # EXCLAMATION QUESTION MARK -204A ; [*0390.0020.0002] # TIRONIAN SIGN ET -204B ; [*0385.0020.0002] # REVERSED PILCROW SIGN -204C ; [*03A1.0020.0002] # BLACK LEFTWARDS BULLET -204D ; [*03A2.0020.0002] # BLACK RIGHTWARDS BULLET -204E ; [*0389.0020.0002] # LOW ASTERISK -204F ; [*0235.0020.0002] # REVERSED SEMICOLON -2050 ; [*03AC.0020.0002] # CLOSE UP -2051 ; [*038A.0020.0002] # TWO ASTERISKS ALIGNED VERTICALLY -2052 ; [*0602.0020.0002] # COMMERCIAL MINUS SIGN +203F ; [*03B0.0020.0002] # UNDERTIE +2040 ; [*03B2.0020.0002] # CHARACTER TIE +2041 ; [*03B4.0020.0002] # CARET INSERTION POINT +2042 ; [*03B5.0020.0002] # ASTERISM +2043 ; [*03A7.0020.0002] # HYPHEN BULLET +2044 ; [*0626.0020.0002] # FRACTION SLASH +2045 ; [*0323.0020.0002] # LEFT SQUARE BRACKET WITH QUILL +2046 ; [*0324.0020.0002] # RIGHT SQUARE BRACKET WITH QUILL +2047 ; [*0266.0020.0004][*0266.0020.0004] # DOUBLE QUESTION MARK +2048 ; [*0266.0020.0004][*0260.0020.0004] # QUESTION EXCLAMATION MARK +2049 ; [*0260.0020.0004][*0266.0020.0004] # EXCLAMATION QUESTION MARK +204A ; [*0397.0020.0002] # TIRONIAN SIGN ET +204B ; [*038C.0020.0002] # REVERSED PILCROW SIGN +204C ; [*03A8.0020.0002] # BLACK LEFTWARDS BULLET +204D ; [*03A9.0020.0002] # BLACK RIGHTWARDS BULLET +204E ; [*0390.0020.0002] # LOW ASTERISK +204F ; [*0236.0020.0002] # REVERSED SEMICOLON +2050 ; [*03B3.0020.0002] # CLOSE UP +2051 ; [*0391.0020.0002] # TWO ASTERISKS ALIGNED VERTICALLY +2052 ; [*0622.0020.0002] # COMMERCIAL MINUS SIGN 2053 ; [*021A.0020.0002] # SWUNG DASH -2054 ; [*03AA.0020.0002] # INVERTED UNDERTIE -2055 ; [*02E1.0020.0002] # FLOWER PUNCTUATION MARK -2056 ; [*02E2.0020.0002] # THREE DOT PUNCTUATION -2057 ; [*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004][*03A3.0020.0004] # QUADRUPLE PRIME -2058 ; [*02E3.0020.0002] # FOUR DOT PUNCTUATION -2059 ; [*02E4.0020.0002] # FIVE DOT PUNCTUATION -205A ; [*02E5.0020.0002] # TWO DOT PUNCTUATION -205B ; [*02E6.0020.0002] # FOUR DOT MARK -205C ; [*02E7.0020.0002] # DOTTED CROSS -205D ; [*02E8.0020.0002] # TRICOLON -205E ; [*02E9.0020.0002] # VERTICAL FOUR DOTS +2054 ; [*03B1.0020.0002] # INVERTED UNDERTIE +2055 ; [*02E8.0020.0002] # FLOWER PUNCTUATION MARK +2056 ; [*02E9.0020.0002] # THREE DOT PUNCTUATION +2057 ; [*03AA.0020.0004][*03AA.0020.0004][*03AA.0020.0004][*03AA.0020.0004] # QUADRUPLE PRIME +2058 ; [*02EA.0020.0002] # FOUR DOT PUNCTUATION +2059 ; [*02EB.0020.0002] # FIVE DOT PUNCTUATION +205A ; [*02EC.0020.0002] # TWO DOT PUNCTUATION +205B ; [*02ED.0020.0002] # FOUR DOT MARK +205C ; [*02EE.0020.0002] # DOTTED CROSS +205D ; [*02EF.0020.0002] # TRICOLON +205E ; [*02F0.0020.0002] # VERTICAL FOUR DOTS 205F ; [*0209.0020.0004] # MEDIUM MATHEMATICAL SPACE 2061 ; [.0000.0000.0000] # FUNCTION APPLICATION 2062 ; [.0000.0000.0000] # INVISIBLE TIMES 2063 ; [.0000.0000.0000] # INVISIBLE SEPARATOR 2064 ; [.0000.0000.0000] # INVISIBLE PLUS -207A ; [*05F6.0020.0014] # SUPERSCRIPT PLUS SIGN -207B ; [*0601.0020.0014] # SUPERSCRIPT MINUS -207C ; [*05FB.0020.0014] # SUPERSCRIPT EQUALS SIGN -207D ; [*0310.0020.0014] # SUPERSCRIPT LEFT PARENTHESIS -207E ; [*0311.0020.0014] # SUPERSCRIPT RIGHT PARENTHESIS -208A ; [*05F6.0020.0015] # SUBSCRIPT PLUS SIGN -208B ; [*0601.0020.0015] # SUBSCRIPT MINUS -208C ; [*05FB.0020.0015] # SUBSCRIPT EQUALS SIGN -208D ; [*0310.0020.0015] # SUBSCRIPT LEFT PARENTHESIS -208E ; [*0311.0020.0015] # SUBSCRIPT RIGHT PARENTHESIS -2104 ; [*0566.0020.0002] # CENTRE LINE SYMBOL -2108 ; [*0567.0020.0002] # SCRUPLE -2114 ; [*0568.0020.0002] # L B BAR SYMBOL -2117 ; [*0569.0020.0002] # SOUND RECORDING COPYRIGHT -2118 ; [*056A.0020.0002] # SCRIPT CAPITAL P -211E ; [*056B.0020.0002] # PRESCRIPTION TAKE -211F ; [*056C.0020.0002] # RESPONSE -2123 ; [*056D.0020.0002] # VERSICLE -2125 ; [*056E.0020.0002] # OUNCE SIGN -2127 ; [*056F.0020.0002] # INVERTED OHM SIGN -2129 ; [*0570.0020.0002] # TURNED GREEK SMALL LETTER IOTA -212E ; [*0571.0020.0002] # ESTIMATED SYMBOL -213A ; [*0572.0020.0002] # ROTATED CAPITAL Q -2140 ; [*05F5.0020.0005] # DOUBLE-STRUCK N-ARY SUMMATION -2141 ; [*0573.0020.0002] # TURNED SANS-SERIF CAPITAL G -2142 ; [*0574.0020.0002] # TURNED SANS-SERIF CAPITAL L -2143 ; [*0575.0020.0002] # REVERSED SANS-SERIF CAPITAL L -2144 ; [*0576.0020.0002] # TURNED SANS-SERIF CAPITAL Y -214A ; [*0577.0020.0002] # PROPERTY LINE -214B ; [*0691.0020.0002] # TURNED AMPERSAND -214C ; [*0578.0020.0002] # PER SIGN -214F ; [*0579.0020.0002] # SYMBOL FOR SAMARITAN SOURCE -2180 ; [*1A4C.0020.0002] # ROMAN NUMERAL ONE THOUSAND C D -2181 ; [*1A4D.0020.0002] # ROMAN NUMERAL FIVE THOUSAND -2182 ; [*1A4E.0020.0002] # ROMAN NUMERAL TEN THOUSAND -2186 ; [*1A4F.0020.0002] # ROMAN NUMERAL FIFTY EARLY FORM -2187 ; [*1A50.0020.0002] # ROMAN NUMERAL FIFTY THOUSAND -2188 ; [*1A51.0020.0002] # ROMAN NUMERAL ONE HUNDRED THOUSAND -218A ; [*057A.0020.0002] # TURNED DIGIT TWO -218B ; [*057B.0020.0002] # TURNED DIGIT THREE -2190 ; [*057C.0020.0002] # LEFTWARDS ARROW -2191 ; [*057E.0020.0002] # UPWARDS ARROW -2192 ; [*057D.0020.0002] # RIGHTWARDS ARROW -2193 ; [*057F.0020.0002] # DOWNWARDS ARROW -2194 ; [*0580.0020.0002] # LEFT RIGHT ARROW -2195 ; [*0581.0020.0002] # UP DOWN ARROW -2196 ; [*0582.0020.0002] # NORTH WEST ARROW -2197 ; [*0583.0020.0002] # NORTH EAST ARROW -2198 ; [*0584.0020.0002] # SOUTH EAST ARROW -2199 ; [*0585.0020.0002] # SOUTH WEST ARROW -219A ; [*057C.0020.0002][.0000.002F.0002] # LEFTWARDS ARROW WITH STROKE -219B ; [*057D.0020.0002][.0000.002F.0002] # RIGHTWARDS ARROW WITH STROKE -219C ; [*0586.0020.0002] # LEFTWARDS WAVE ARROW -219D ; [*0587.0020.0002] # RIGHTWARDS WAVE ARROW -219E ; [*0588.0020.0002] # LEFTWARDS TWO HEADED ARROW -219F ; [*0589.0020.0002] # UPWARDS TWO HEADED ARROW -21A0 ; [*058A.0020.0002] # RIGHTWARDS TWO HEADED ARROW -21A1 ; [*058B.0020.0002] # DOWNWARDS TWO HEADED ARROW -21A2 ; [*058C.0020.0002] # LEFTWARDS ARROW WITH TAIL -21A3 ; [*058D.0020.0002] # RIGHTWARDS ARROW WITH TAIL -21A4 ; [*058E.0020.0002] # LEFTWARDS ARROW FROM BAR -21A5 ; [*058F.0020.0002] # UPWARDS ARROW FROM BAR -21A6 ; [*0590.0020.0002] # RIGHTWARDS ARROW FROM BAR -21A7 ; [*0591.0020.0002] # DOWNWARDS ARROW FROM BAR -21A8 ; [*0592.0020.0002] # UP DOWN ARROW WITH BASE -21A9 ; [*0593.0020.0002] # LEFTWARDS ARROW WITH HOOK -21AA ; [*0594.0020.0002] # RIGHTWARDS ARROW WITH HOOK -21AB ; [*0595.0020.0002] # LEFTWARDS ARROW WITH LOOP -21AC ; [*0596.0020.0002] # RIGHTWARDS ARROW WITH LOOP -21AD ; [*0597.0020.0002] # LEFT RIGHT WAVE ARROW -21AE ; [*0580.0020.0002][.0000.002F.0002] # LEFT RIGHT ARROW WITH STROKE -21AF ; [*0598.0020.0002] # DOWNWARDS ZIGZAG ARROW -21B0 ; [*0599.0020.0002] # UPWARDS ARROW WITH TIP LEFTWARDS -21B1 ; [*059A.0020.0002] # UPWARDS ARROW WITH TIP RIGHTWARDS -21B2 ; [*059B.0020.0002] # DOWNWARDS ARROW WITH TIP LEFTWARDS -21B3 ; [*059C.0020.0002] # DOWNWARDS ARROW WITH TIP RIGHTWARDS -21B4 ; [*059D.0020.0002] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS -21B5 ; [*059E.0020.0002] # DOWNWARDS ARROW WITH CORNER LEFTWARDS -21B6 ; [*059F.0020.0002] # ANTICLOCKWISE TOP SEMICIRCLE ARROW -21B7 ; [*05A0.0020.0002] # CLOCKWISE TOP SEMICIRCLE ARROW -21B8 ; [*05A1.0020.0002] # NORTH WEST ARROW TO LONG BAR -21B9 ; [*05A2.0020.0002] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR -21BA ; [*05A3.0020.0002] # ANTICLOCKWISE OPEN CIRCLE ARROW -21BB ; [*05A4.0020.0002] # CLOCKWISE OPEN CIRCLE ARROW -21BC ; [*05A5.0020.0002] # LEFTWARDS HARPOON WITH BARB UPWARDS -21BD ; [*05A6.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWNWARDS -21BE ; [*05A7.0020.0002] # UPWARDS HARPOON WITH BARB RIGHTWARDS -21BF ; [*05A8.0020.0002] # UPWARDS HARPOON WITH BARB LEFTWARDS -21C0 ; [*05A9.0020.0002] # RIGHTWARDS HARPOON WITH BARB UPWARDS -21C1 ; [*05AA.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS -21C2 ; [*05AB.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS -21C3 ; [*05AC.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFTWARDS -21C4 ; [*05AD.0020.0002] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW -21C5 ; [*05AE.0020.0002] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW -21C6 ; [*05AF.0020.0002] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW -21C7 ; [*05B0.0020.0002] # LEFTWARDS PAIRED ARROWS -21C8 ; [*05B1.0020.0002] # UPWARDS PAIRED ARROWS -21C9 ; [*05B2.0020.0002] # RIGHTWARDS PAIRED ARROWS -21CA ; [*05B3.0020.0002] # DOWNWARDS PAIRED ARROWS -21CB ; [*05B4.0020.0002] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON -21CC ; [*05B5.0020.0002] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON -21CD ; [*05B6.0020.0002][.0000.002F.0002] # LEFTWARDS DOUBLE ARROW WITH STROKE -21CE ; [*05BA.0020.0002][.0000.002F.0002] # LEFT RIGHT DOUBLE ARROW WITH STROKE -21CF ; [*05B8.0020.0002][.0000.002F.0002] # RIGHTWARDS DOUBLE ARROW WITH STROKE -21D0 ; [*05B6.0020.0002] # LEFTWARDS DOUBLE ARROW -21D1 ; [*05B7.0020.0002] # UPWARDS DOUBLE ARROW -21D2 ; [*05B8.0020.0002] # RIGHTWARDS DOUBLE ARROW -21D3 ; [*05B9.0020.0002] # DOWNWARDS DOUBLE ARROW -21D4 ; [*05BA.0020.0002] # LEFT RIGHT DOUBLE ARROW -21D5 ; [*05BB.0020.0002] # UP DOWN DOUBLE ARROW -21D6 ; [*05BC.0020.0002] # NORTH WEST DOUBLE ARROW -21D7 ; [*05BD.0020.0002] # NORTH EAST DOUBLE ARROW -21D8 ; [*05BE.0020.0002] # SOUTH EAST DOUBLE ARROW -21D9 ; [*05BF.0020.0002] # SOUTH WEST DOUBLE ARROW -21DA ; [*05C0.0020.0002] # LEFTWARDS TRIPLE ARROW -21DB ; [*05C1.0020.0002] # RIGHTWARDS TRIPLE ARROW -21DC ; [*05C2.0020.0002] # LEFTWARDS SQUIGGLE ARROW -21DD ; [*05C3.0020.0002] # RIGHTWARDS SQUIGGLE ARROW -21DE ; [*05C4.0020.0002] # UPWARDS ARROW WITH DOUBLE STROKE -21DF ; [*05C5.0020.0002] # DOWNWARDS ARROW WITH DOUBLE STROKE -21E0 ; [*05C6.0020.0002] # LEFTWARDS DASHED ARROW -21E1 ; [*05C7.0020.0002] # UPWARDS DASHED ARROW -21E2 ; [*05C8.0020.0002] # RIGHTWARDS DASHED ARROW -21E3 ; [*05C9.0020.0002] # DOWNWARDS DASHED ARROW -21E4 ; [*05CA.0020.0002] # LEFTWARDS ARROW TO BAR -21E5 ; [*05CB.0020.0002] # RIGHTWARDS ARROW TO BAR -21E6 ; [*05CC.0020.0002] # LEFTWARDS WHITE ARROW -21E7 ; [*05CD.0020.0002] # UPWARDS WHITE ARROW -21E8 ; [*05CE.0020.0002] # RIGHTWARDS WHITE ARROW -21E9 ; [*05CF.0020.0002] # DOWNWARDS WHITE ARROW -21EA ; [*05D0.0020.0002] # UPWARDS WHITE ARROW FROM BAR -21EB ; [*05D1.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL -21EC ; [*05D2.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR -21ED ; [*05D3.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR -21EE ; [*05D4.0020.0002] # UPWARDS WHITE DOUBLE ARROW -21EF ; [*05D5.0020.0002] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL -21F0 ; [*05D6.0020.0002] # RIGHTWARDS WHITE ARROW FROM WALL -21F1 ; [*05D7.0020.0002] # NORTH WEST ARROW TO CORNER -21F2 ; [*05D8.0020.0002] # SOUTH EAST ARROW TO CORNER -21F3 ; [*05D9.0020.0002] # UP DOWN WHITE ARROW -21F4 ; [*05DA.0020.0002] # RIGHT ARROW WITH SMALL CIRCLE -21F5 ; [*05DB.0020.0002] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW -21F6 ; [*05DC.0020.0002] # THREE RIGHTWARDS ARROWS -21F7 ; [*05DD.0020.0002] # LEFTWARDS ARROW WITH VERTICAL STROKE -21F8 ; [*05DE.0020.0002] # RIGHTWARDS ARROW WITH VERTICAL STROKE -21F9 ; [*05DF.0020.0002] # LEFT RIGHT ARROW WITH VERTICAL STROKE -21FA ; [*05E0.0020.0002] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE -21FB ; [*05E1.0020.0002] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE -21FC ; [*05E2.0020.0002] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE -21FD ; [*05E3.0020.0002] # LEFTWARDS OPEN-HEADED ARROW -21FE ; [*05E4.0020.0002] # RIGHTWARDS OPEN-HEADED ARROW -21FF ; [*05E5.0020.0002] # LEFT RIGHT OPEN-HEADED ARROW -2200 ; [*05E6.0020.0002] # FOR ALL -2201 ; [*05E7.0020.0002] # COMPLEMENT -2202 ; [*05E8.0020.0002] # PARTIAL DIFFERENTIAL -2203 ; [*05E9.0020.0002] # THERE EXISTS -2204 ; [*05E9.0020.0002][.0000.002F.0002] # THERE DOES NOT EXIST -2205 ; [*05EA.0020.0002] # EMPTY SET -2206 ; [*05EB.0020.0002] # INCREMENT -2207 ; [*05EC.0020.0002] # NABLA -2208 ; [*05ED.0020.0002] # ELEMENT OF -2209 ; [*05ED.0020.0002][.0000.002F.0002] # NOT AN ELEMENT OF -220A ; [*05EE.0020.0002] # SMALL ELEMENT OF -220B ; [*05EF.0020.0002] # CONTAINS AS MEMBER -220C ; [*05EF.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS MEMBER -220D ; [*05F0.0020.0002] # SMALL CONTAINS AS MEMBER -220E ; [*05F2.0020.0002] # END OF PROOF -220F ; [*05F3.0020.0002] # N-ARY PRODUCT -2210 ; [*05F4.0020.0002] # N-ARY COPRODUCT -2211 ; [*05F5.0020.0002] # N-ARY SUMMATION -2212 ; [*0601.0020.0002] # MINUS SIGN -2213 ; [*0603.0020.0002] # MINUS-OR-PLUS SIGN -2214 ; [*0604.0020.0002] # DOT PLUS -2215 ; [*0605.0020.0002] # DIVISION SLASH -2216 ; [*0607.0020.0002] # SET MINUS -2217 ; [*0608.0020.0002] # ASTERISK OPERATOR -2218 ; [*0609.0020.0002] # RING OPERATOR -2219 ; [*060A.0020.0002] # BULLET OPERATOR -221A ; [*060B.0020.0002] # SQUARE ROOT -221B ; [*060C.0020.0002] # CUBE ROOT -221C ; [*060E.0020.0002] # FOURTH ROOT -221D ; [*0610.0020.0002] # PROPORTIONAL TO -221E ; [*0611.0020.0002] # INFINITY -221F ; [*0612.0020.0002] # RIGHT ANGLE -2220 ; [*0613.0020.0002] # ANGLE -2221 ; [*0614.0020.0002] # MEASURED ANGLE -2222 ; [*0615.0020.0002] # SPHERICAL ANGLE -2223 ; [*0616.0020.0002] # DIVIDES -2224 ; [*0616.0020.0002][.0000.002F.0002] # DOES NOT DIVIDE -2225 ; [*0617.0020.0002] # PARALLEL TO -2226 ; [*0617.0020.0002][.0000.002F.0002] # NOT PARALLEL TO -2227 ; [*0618.0020.0002] # LOGICAL AND -2228 ; [*0619.0020.0002] # LOGICAL OR -2229 ; [*061A.0020.0002] # INTERSECTION -222A ; [*061B.0020.0002] # UNION -222B ; [*061C.0020.0002] # INTEGRAL -222C ; [*061C.0020.0004][*061C.0020.0004] # DOUBLE INTEGRAL -222D ; [*061C.0020.0004][*061C.0020.0004][*061C.0020.0004] # TRIPLE INTEGRAL -222E ; [*061D.0020.0002] # CONTOUR INTEGRAL -222F ; [*061D.0020.0004][*061D.0020.0004] # SURFACE INTEGRAL -2230 ; [*061D.0020.0004][*061D.0020.0004][*061D.0020.0004] # VOLUME INTEGRAL -2231 ; [*061E.0020.0002] # CLOCKWISE INTEGRAL -2232 ; [*061F.0020.0002] # CLOCKWISE CONTOUR INTEGRAL -2233 ; [*0620.0020.0002] # ANTICLOCKWISE CONTOUR INTEGRAL -2234 ; [*0621.0020.0002] # THEREFORE -2235 ; [*0622.0020.0002] # BECAUSE -2236 ; [*0623.0020.0002] # RATIO -2237 ; [*0624.0020.0002] # PROPORTION -2238 ; [*0625.0020.0002] # DOT MINUS -2239 ; [*0626.0020.0002] # EXCESS -223A ; [*0627.0020.0002] # GEOMETRIC PROPORTION -223B ; [*0628.0020.0002] # HOMOTHETIC -223C ; [*0629.0020.0002] # TILDE OPERATOR -223D ; [*062A.0020.0002] # REVERSED TILDE -223E ; [*062B.0020.0002] # INVERTED LAZY S -223F ; [*062C.0020.0002] # SINE WAVE -2240 ; [*062D.0020.0002] # WREATH PRODUCT -2241 ; [*0629.0020.0002][.0000.002F.0002] # NOT TILDE -2242 ; [*062E.0020.0002] # MINUS TILDE -2243 ; [*062F.0020.0002] # ASYMPTOTICALLY EQUAL TO -2244 ; [*062F.0020.0002][.0000.002F.0002] # NOT ASYMPTOTICALLY EQUAL TO -2245 ; [*0630.0020.0002] # APPROXIMATELY EQUAL TO -2246 ; [*0631.0020.0002] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO -2247 ; [*0630.0020.0002][.0000.002F.0002] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO -2248 ; [*0632.0020.0002] # ALMOST EQUAL TO -2249 ; [*0632.0020.0002][.0000.002F.0002] # NOT ALMOST EQUAL TO -224A ; [*0633.0020.0002] # ALMOST EQUAL OR EQUAL TO -224B ; [*0634.0020.0002] # TRIPLE TILDE -224C ; [*0635.0020.0002] # ALL EQUAL TO -224D ; [*0636.0020.0002] # EQUIVALENT TO -224E ; [*0637.0020.0002] # GEOMETRICALLY EQUIVALENT TO -224F ; [*0638.0020.0002] # DIFFERENCE BETWEEN -2250 ; [*0639.0020.0002] # APPROACHES THE LIMIT -2251 ; [*063A.0020.0002] # GEOMETRICALLY EQUAL TO -2252 ; [*063B.0020.0002] # APPROXIMATELY EQUAL TO OR THE IMAGE OF -2253 ; [*063C.0020.0002] # IMAGE OF OR APPROXIMATELY EQUAL TO -2254 ; [*063D.0020.0002] # COLON EQUALS -2255 ; [*063E.0020.0002] # EQUALS COLON -2256 ; [*063F.0020.0002] # RING IN EQUAL TO -2257 ; [*0640.0020.0002] # RING EQUAL TO -2258 ; [*0641.0020.0002] # CORRESPONDS TO -2259 ; [*0642.0020.0002] # ESTIMATES -225A ; [*0643.0020.0002] # EQUIANGULAR TO -225B ; [*0644.0020.0002] # STAR EQUALS -225C ; [*0645.0020.0002] # DELTA EQUAL TO -225D ; [*0646.0020.0002] # EQUAL TO BY DEFINITION -225E ; [*0647.0020.0002] # MEASURED BY -225F ; [*0648.0020.0002] # QUESTIONED EQUAL TO -2260 ; [*05FB.0020.0002][.0000.002F.0002] # NOT EQUAL TO -2261 ; [*0649.0020.0002] # IDENTICAL TO -2262 ; [*0649.0020.0002][.0000.002F.0002] # NOT IDENTICAL TO -2263 ; [*064A.0020.0002] # STRICTLY EQUIVALENT TO -2264 ; [*064B.0020.0002] # LESS-THAN OR EQUAL TO -2265 ; [*064C.0020.0002] # GREATER-THAN OR EQUAL TO -2266 ; [*064D.0020.0002] # LESS-THAN OVER EQUAL TO -2267 ; [*064E.0020.0002] # GREATER-THAN OVER EQUAL TO -2268 ; [*064F.0020.0002] # LESS-THAN BUT NOT EQUAL TO -2269 ; [*0650.0020.0002] # GREATER-THAN BUT NOT EQUAL TO -226A ; [*0651.0020.0002] # MUCH LESS-THAN -226B ; [*0652.0020.0002] # MUCH GREATER-THAN -226C ; [*0653.0020.0002] # BETWEEN -226D ; [*0636.0020.0002][.0000.002F.0002] # NOT EQUIVALENT TO -226E ; [*05FA.0020.0002][.0000.002F.0002] # NOT LESS-THAN -226F ; [*05FC.0020.0002][.0000.002F.0002] # NOT GREATER-THAN -2270 ; [*064B.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUAL TO -2271 ; [*064C.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUAL TO -2272 ; [*0654.0020.0002] # LESS-THAN OR EQUIVALENT TO -2273 ; [*0655.0020.0002] # GREATER-THAN OR EQUIVALENT TO -2274 ; [*0654.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUIVALENT TO -2275 ; [*0655.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUIVALENT TO -2276 ; [*0656.0020.0002] # LESS-THAN OR GREATER-THAN -2277 ; [*0657.0020.0002] # GREATER-THAN OR LESS-THAN -2278 ; [*0656.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR GREATER-THAN -2279 ; [*0657.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR LESS-THAN -227A ; [*0658.0020.0002] # PRECEDES -227B ; [*0659.0020.0002] # SUCCEEDS -227C ; [*065A.0020.0002] # PRECEDES OR EQUAL TO -227D ; [*065B.0020.0002] # SUCCEEDS OR EQUAL TO -227E ; [*065C.0020.0002] # PRECEDES OR EQUIVALENT TO -227F ; [*065D.0020.0002] # SUCCEEDS OR EQUIVALENT TO -2280 ; [*0658.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE -2281 ; [*0659.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED -2282 ; [*065E.0020.0002] # SUBSET OF -2283 ; [*065F.0020.0002] # SUPERSET OF -2284 ; [*065E.0020.0002][.0000.002F.0002] # NOT A SUBSET OF -2285 ; [*065F.0020.0002][.0000.002F.0002] # NOT A SUPERSET OF -2286 ; [*0660.0020.0002] # SUBSET OF OR EQUAL TO -2287 ; [*0661.0020.0002] # SUPERSET OF OR EQUAL TO -2288 ; [*0660.0020.0002][.0000.002F.0002] # NEITHER A SUBSET OF NOR EQUAL TO -2289 ; [*0661.0020.0002][.0000.002F.0002] # NEITHER A SUPERSET OF NOR EQUAL TO -228A ; [*0662.0020.0002] # SUBSET OF WITH NOT EQUAL TO -228B ; [*0663.0020.0002] # SUPERSET OF WITH NOT EQUAL TO -228C ; [*0664.0020.0002] # MULTISET -228D ; [*0665.0020.0002] # MULTISET MULTIPLICATION -228E ; [*0666.0020.0002] # MULTISET UNION -228F ; [*0667.0020.0002] # SQUARE IMAGE OF -2290 ; [*0668.0020.0002] # SQUARE ORIGINAL OF -2291 ; [*0669.0020.0002] # SQUARE IMAGE OF OR EQUAL TO -2292 ; [*066A.0020.0002] # SQUARE ORIGINAL OF OR EQUAL TO -2293 ; [*066B.0020.0002] # SQUARE CAP -2294 ; [*066C.0020.0002] # SQUARE CUP -2295 ; [*066D.0020.0002] # CIRCLED PLUS -2296 ; [*066E.0020.0002] # CIRCLED MINUS -2297 ; [*066F.0020.0002] # CIRCLED TIMES -2298 ; [*0670.0020.0002] # CIRCLED DIVISION SLASH -2299 ; [*0671.0020.0002] # CIRCLED DOT OPERATOR -229A ; [*0672.0020.0002] # CIRCLED RING OPERATOR -229B ; [*0673.0020.0002] # CIRCLED ASTERISK OPERATOR -229C ; [*0674.0020.0002] # CIRCLED EQUALS -229D ; [*0675.0020.0002] # CIRCLED DASH -229E ; [*0676.0020.0002] # SQUARED PLUS -229F ; [*0677.0020.0002] # SQUARED MINUS -22A0 ; [*0678.0020.0002] # SQUARED TIMES -22A1 ; [*0679.0020.0002] # SQUARED DOT OPERATOR -22A2 ; [*067A.0020.0002] # RIGHT TACK -22A3 ; [*067B.0020.0002] # LEFT TACK -22A4 ; [*067C.0020.0002] # DOWN TACK -22A5 ; [*067D.0020.0002] # UP TACK -22A6 ; [*067E.0020.0002] # ASSERTION -22A7 ; [*067F.0020.0002] # MODELS -22A8 ; [*0680.0020.0002] # TRUE -22A9 ; [*0681.0020.0002] # FORCES -22AA ; [*0682.0020.0002] # TRIPLE VERTICAL BAR RIGHT TURNSTILE -22AB ; [*0683.0020.0002] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE -22AC ; [*067A.0020.0002][.0000.002F.0002] # DOES NOT PROVE -22AD ; [*0680.0020.0002][.0000.002F.0002] # NOT TRUE -22AE ; [*0681.0020.0002][.0000.002F.0002] # DOES NOT FORCE -22AF ; [*0683.0020.0002][.0000.002F.0002] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE -22B0 ; [*0684.0020.0002] # PRECEDES UNDER RELATION -22B1 ; [*0685.0020.0002] # SUCCEEDS UNDER RELATION -22B2 ; [*0686.0020.0002] # NORMAL SUBGROUP OF -22B3 ; [*0687.0020.0002] # CONTAINS AS NORMAL SUBGROUP -22B4 ; [*0688.0020.0002] # NORMAL SUBGROUP OF OR EQUAL TO -22B5 ; [*0689.0020.0002] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO -22B6 ; [*068A.0020.0002] # ORIGINAL OF -22B7 ; [*068B.0020.0002] # IMAGE OF -22B8 ; [*068C.0020.0002] # MULTIMAP -22B9 ; [*068D.0020.0002] # HERMITIAN CONJUGATE MATRIX -22BA ; [*068E.0020.0002] # INTERCALATE -22BB ; [*068F.0020.0002] # XOR -22BC ; [*0690.0020.0002] # NAND -22BD ; [*0692.0020.0002] # NOR -22BE ; [*0693.0020.0002] # RIGHT ANGLE WITH ARC -22BF ; [*0694.0020.0002] # RIGHT TRIANGLE -22C0 ; [*0695.0020.0002] # N-ARY LOGICAL AND -22C1 ; [*0696.0020.0002] # N-ARY LOGICAL OR -22C2 ; [*0697.0020.0002] # N-ARY INTERSECTION -22C3 ; [*0698.0020.0002] # N-ARY UNION -22C4 ; [*0699.0020.0002] # DIAMOND OPERATOR -22C5 ; [*069A.0020.0002] # DOT OPERATOR -22C6 ; [*069B.0020.0002] # STAR OPERATOR -22C7 ; [*069C.0020.0002] # DIVISION TIMES -22C8 ; [*069D.0020.0002] # BOWTIE -22C9 ; [*069E.0020.0002] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT -22CA ; [*069F.0020.0002] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT -22CB ; [*06A0.0020.0002] # LEFT SEMIDIRECT PRODUCT -22CC ; [*06A1.0020.0002] # RIGHT SEMIDIRECT PRODUCT -22CD ; [*06A2.0020.0002] # REVERSED TILDE EQUALS -22CE ; [*06A3.0020.0002] # CURLY LOGICAL OR -22CF ; [*06A4.0020.0002] # CURLY LOGICAL AND -22D0 ; [*06A5.0020.0002] # DOUBLE SUBSET -22D1 ; [*06A6.0020.0002] # DOUBLE SUPERSET -22D2 ; [*06A7.0020.0002] # DOUBLE INTERSECTION -22D3 ; [*06A8.0020.0002] # DOUBLE UNION -22D4 ; [*06A9.0020.0002] # PITCHFORK -22D5 ; [*06AA.0020.0002] # EQUAL AND PARALLEL TO -22D6 ; [*06AB.0020.0002] # LESS-THAN WITH DOT -22D7 ; [*06AC.0020.0002] # GREATER-THAN WITH DOT -22D8 ; [*06AD.0020.0002] # VERY MUCH LESS-THAN -22D9 ; [*06AE.0020.0002] # VERY MUCH GREATER-THAN -22DA ; [*06AF.0020.0002] # LESS-THAN EQUAL TO OR GREATER-THAN -22DB ; [*06B0.0020.0002] # GREATER-THAN EQUAL TO OR LESS-THAN -22DC ; [*06B1.0020.0002] # EQUAL TO OR LESS-THAN -22DD ; [*06B2.0020.0002] # EQUAL TO OR GREATER-THAN -22DE ; [*06B3.0020.0002] # EQUAL TO OR PRECEDES -22DF ; [*06B4.0020.0002] # EQUAL TO OR SUCCEEDS -22E0 ; [*065A.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE OR EQUAL -22E1 ; [*065B.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED OR EQUAL -22E2 ; [*0669.0020.0002][.0000.002F.0002] # NOT SQUARE IMAGE OF OR EQUAL TO -22E3 ; [*066A.0020.0002][.0000.002F.0002] # NOT SQUARE ORIGINAL OF OR EQUAL TO -22E4 ; [*06B5.0020.0002] # SQUARE IMAGE OF OR NOT EQUAL TO -22E5 ; [*06B6.0020.0002] # SQUARE ORIGINAL OF OR NOT EQUAL TO -22E6 ; [*06B7.0020.0002] # LESS-THAN BUT NOT EQUIVALENT TO -22E7 ; [*06B8.0020.0002] # GREATER-THAN BUT NOT EQUIVALENT TO -22E8 ; [*06B9.0020.0002] # PRECEDES BUT NOT EQUIVALENT TO -22E9 ; [*06BA.0020.0002] # SUCCEEDS BUT NOT EQUIVALENT TO -22EA ; [*0686.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF -22EB ; [*0687.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP -22EC ; [*0688.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF OR EQUAL TO -22ED ; [*0689.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL -22EE ; [*06BB.0020.0002] # VERTICAL ELLIPSIS -22EF ; [*06BC.0020.0002] # MIDLINE HORIZONTAL ELLIPSIS -22F0 ; [*06BD.0020.0002] # UP RIGHT DIAGONAL ELLIPSIS -22F1 ; [*06BE.0020.0002] # DOWN RIGHT DIAGONAL ELLIPSIS -22F2 ; [*06BF.0020.0002] # ELEMENT OF WITH LONG HORIZONTAL STROKE -22F3 ; [*06C0.0020.0002] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22F4 ; [*06C1.0020.0002] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22F5 ; [*06C2.0020.0002] # ELEMENT OF WITH DOT ABOVE -22F6 ; [*06C3.0020.0002] # ELEMENT OF WITH OVERBAR -22F7 ; [*06C4.0020.0002] # SMALL ELEMENT OF WITH OVERBAR -22F8 ; [*06C5.0020.0002] # ELEMENT OF WITH UNDERBAR -22F9 ; [*06C6.0020.0002] # ELEMENT OF WITH TWO HORIZONTAL STROKES -22FA ; [*06C7.0020.0002] # CONTAINS WITH LONG HORIZONTAL STROKE -22FB ; [*06C8.0020.0002] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22FC ; [*06C9.0020.0002] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22FD ; [*06CA.0020.0002] # CONTAINS WITH OVERBAR -22FE ; [*06CB.0020.0002] # SMALL CONTAINS WITH OVERBAR -22FF ; [*06CC.0020.0002] # Z NOTATION BAG MEMBERSHIP -2300 ; [*06CD.0020.0002] # DIAMETER SIGN -2301 ; [*06CE.0020.0002] # ELECTRIC ARROW -2302 ; [*06CF.0020.0002] # HOUSE -2303 ; [*06D0.0020.0002] # UP ARROWHEAD -2304 ; [*06D1.0020.0002] # DOWN ARROWHEAD -2305 ; [*06D2.0020.0002] # PROJECTIVE -2306 ; [*06D3.0020.0002] # PERSPECTIVE -2307 ; [*06D4.0020.0002] # WAVY LINE -2308 ; [*031E.0020.0002] # LEFT CEILING -2309 ; [*031F.0020.0002] # RIGHT CEILING -230A ; [*0320.0020.0002] # LEFT FLOOR -230B ; [*0321.0020.0002] # RIGHT FLOOR -230C ; [*06D5.0020.0002] # BOTTOM RIGHT CROP -230D ; [*06D6.0020.0002] # BOTTOM LEFT CROP -230E ; [*06D7.0020.0002] # TOP RIGHT CROP -230F ; [*06D8.0020.0002] # TOP LEFT CROP -2310 ; [*06D9.0020.0002] # REVERSED NOT SIGN -2311 ; [*06DA.0020.0002] # SQUARE LOZENGE -2312 ; [*06DB.0020.0002] # ARC -2313 ; [*06DC.0020.0002] # SEGMENT -2314 ; [*06DD.0020.0002] # SECTOR -2315 ; [*06DE.0020.0002] # TELEPHONE RECORDER -2316 ; [*06DF.0020.0002] # POSITION INDICATOR -2317 ; [*06E0.0020.0002] # VIEWDATA SQUARE -2318 ; [*06E1.0020.0002] # PLACE OF INTEREST SIGN -2319 ; [*06E2.0020.0002] # TURNED NOT SIGN -231A ; [*06E3.0020.0002] # WATCH -231B ; [*06E4.0020.0002] # HOURGLASS -231C ; [*06E5.0020.0002] # TOP LEFT CORNER -231D ; [*06E6.0020.0002] # TOP RIGHT CORNER -231E ; [*06E7.0020.0002] # BOTTOM LEFT CORNER -231F ; [*06E8.0020.0002] # BOTTOM RIGHT CORNER -2320 ; [*06E9.0020.0002] # TOP HALF INTEGRAL -2321 ; [*06EA.0020.0002] # BOTTOM HALF INTEGRAL -2322 ; [*06EB.0020.0002] # FROWN -2323 ; [*06EC.0020.0002] # SMILE -2324 ; [*06ED.0020.0002] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS -2325 ; [*06EE.0020.0002] # OPTION KEY -2326 ; [*06EF.0020.0002] # ERASE TO THE RIGHT -2327 ; [*06F0.0020.0002] # X IN A RECTANGLE BOX -2328 ; [*06F1.0020.0002] # KEYBOARD -2329 ; [*0368.0020.0002] # LEFT-POINTING ANGLE BRACKET -232A ; [*0369.0020.0002] # RIGHT-POINTING ANGLE BRACKET -232B ; [*06F2.0020.0002] # ERASE TO THE LEFT -232C ; [*06F3.0020.0002] # BENZENE RING -232D ; [*06F4.0020.0002] # CYLINDRICITY -232E ; [*06F5.0020.0002] # ALL AROUND-PROFILE -232F ; [*06F6.0020.0002] # SYMMETRY -2330 ; [*06F7.0020.0002] # TOTAL RUNOUT -2331 ; [*06F8.0020.0002] # DIMENSION ORIGIN -2332 ; [*06F9.0020.0002] # CONICAL TAPER -2333 ; [*06FA.0020.0002] # SLOPE -2334 ; [*06FB.0020.0002] # COUNTERBORE -2335 ; [*06FC.0020.0002] # COUNTERSINK -2336 ; [*06FD.0020.0002] # APL FUNCTIONAL SYMBOL I-BEAM -2337 ; [*06FE.0020.0002] # APL FUNCTIONAL SYMBOL SQUISH QUAD -2338 ; [*06FF.0020.0002] # APL FUNCTIONAL SYMBOL QUAD EQUAL -2339 ; [*0700.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIVIDE -233A ; [*0701.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIAMOND -233B ; [*0702.0020.0002] # APL FUNCTIONAL SYMBOL QUAD JOT -233C ; [*0703.0020.0002] # APL FUNCTIONAL SYMBOL QUAD CIRCLE -233D ; [*0704.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STILE -233E ; [*0705.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE JOT -233F ; [*0706.0020.0002] # APL FUNCTIONAL SYMBOL SLASH BAR -2340 ; [*0707.0020.0002] # APL FUNCTIONAL SYMBOL BACKSLASH BAR -2341 ; [*0708.0020.0002] # APL FUNCTIONAL SYMBOL QUAD SLASH -2342 ; [*0709.0020.0002] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH -2343 ; [*070A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN -2344 ; [*070B.0020.0002] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN -2345 ; [*070C.0020.0002] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE -2346 ; [*070D.0020.0002] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE -2347 ; [*070E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW -2348 ; [*070F.0020.0002] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW -2349 ; [*0710.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH -234A ; [*0711.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR -234B ; [*0712.0020.0002] # APL FUNCTIONAL SYMBOL DELTA STILE -234C ; [*0713.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET -234D ; [*0714.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DELTA -234E ; [*0715.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK JOT -234F ; [*0716.0020.0002] # APL FUNCTIONAL SYMBOL UPWARDS VANE -2350 ; [*0717.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW -2351 ; [*0718.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR -2352 ; [*0719.0020.0002] # APL FUNCTIONAL SYMBOL DEL STILE -2353 ; [*071A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UP CARET -2354 ; [*071B.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DEL -2355 ; [*071C.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK JOT -2356 ; [*071D.0020.0002] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE -2357 ; [*071E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW -2358 ; [*071F.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR -2359 ; [*0720.0020.0002] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR -235A ; [*0721.0020.0002] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR -235B ; [*0722.0020.0002] # APL FUNCTIONAL SYMBOL JOT UNDERBAR -235C ; [*0723.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR -235D ; [*0724.0020.0002] # APL FUNCTIONAL SYMBOL UP SHOE JOT -235E ; [*0725.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE QUAD -235F ; [*0726.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STAR -2360 ; [*0727.0020.0002] # APL FUNCTIONAL SYMBOL QUAD COLON -2361 ; [*0728.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS -2362 ; [*0729.0020.0002] # APL FUNCTIONAL SYMBOL DEL DIAERESIS -2363 ; [*072A.0020.0002] # APL FUNCTIONAL SYMBOL STAR DIAERESIS -2364 ; [*072B.0020.0002] # APL FUNCTIONAL SYMBOL JOT DIAERESIS -2365 ; [*072C.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS -2366 ; [*072D.0020.0002] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE -2367 ; [*072E.0020.0002] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE -2368 ; [*072F.0020.0002] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS -2369 ; [*0730.0020.0002] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS -236A ; [*0731.0020.0002] # APL FUNCTIONAL SYMBOL COMMA BAR -236B ; [*0732.0020.0002] # APL FUNCTIONAL SYMBOL DEL TILDE -236C ; [*0733.0020.0002] # APL FUNCTIONAL SYMBOL ZILDE -236D ; [*0734.0020.0002] # APL FUNCTIONAL SYMBOL STILE TILDE -236E ; [*0735.0020.0002] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR -236F ; [*0736.0020.0002] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL -2370 ; [*0737.0020.0002] # APL FUNCTIONAL SYMBOL QUAD QUESTION -2371 ; [*0738.0020.0002] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE -2372 ; [*0739.0020.0002] # APL FUNCTIONAL SYMBOL UP CARET TILDE -2373 ; [*073A.0020.0002] # APL FUNCTIONAL SYMBOL IOTA -2374 ; [*073B.0020.0002] # APL FUNCTIONAL SYMBOL RHO -2375 ; [*073C.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA -2376 ; [*073D.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR -2377 ; [*073E.0020.0002] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR -2378 ; [*073F.0020.0002] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR -2379 ; [*0740.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR -237A ; [*0741.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA -237B ; [*0742.0020.0002] # NOT CHECK MARK -237C ; [*0743.0020.0002] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -237D ; [*0744.0020.0002] # SHOULDERED OPEN BOX -237E ; [*0745.0020.0002] # BELL SYMBOL -237F ; [*0746.0020.0002] # VERTICAL LINE WITH MIDDLE DOT -2380 ; [*0747.0020.0002] # INSERTION SYMBOL -2381 ; [*0748.0020.0002] # CONTINUOUS UNDERLINE SYMBOL -2382 ; [*0749.0020.0002] # DISCONTINUOUS UNDERLINE SYMBOL -2383 ; [*074A.0020.0002] # EMPHASIS SYMBOL -2384 ; [*074B.0020.0002] # COMPOSITION SYMBOL -2385 ; [*074C.0020.0002] # WHITE SQUARE WITH CENTRE VERTICAL LINE -2386 ; [*074D.0020.0002] # ENTER SYMBOL -2387 ; [*074E.0020.0002] # ALTERNATIVE KEY SYMBOL -2388 ; [*074F.0020.0002] # HELM SYMBOL -2389 ; [*0750.0020.0002] # CIRCLED HORIZONTAL BAR WITH NOTCH -238A ; [*0751.0020.0002] # CIRCLED TRIANGLE DOWN -238B ; [*0752.0020.0002] # BROKEN CIRCLE WITH NORTHWEST ARROW -238C ; [*0753.0020.0002] # UNDO SYMBOL -238D ; [*0754.0020.0002] # MONOSTABLE SYMBOL -238E ; [*0755.0020.0002] # HYSTERESIS SYMBOL -238F ; [*0756.0020.0002] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL -2390 ; [*0757.0020.0002] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL -2391 ; [*0758.0020.0002] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL -2392 ; [*0759.0020.0002] # PASSIVE-PULL-UP-OUTPUT SYMBOL -2393 ; [*075A.0020.0002] # DIRECT CURRENT SYMBOL FORM TWO -2394 ; [*075B.0020.0002] # SOFTWARE-FUNCTION SYMBOL -2395 ; [*075C.0020.0002] # APL FUNCTIONAL SYMBOL QUAD -2396 ; [*075D.0020.0002] # DECIMAL SEPARATOR KEY SYMBOL -2397 ; [*075E.0020.0002] # PREVIOUS PAGE -2398 ; [*075F.0020.0002] # NEXT PAGE -2399 ; [*0760.0020.0002] # PRINT SCREEN SYMBOL -239A ; [*0761.0020.0002] # CLEAR SCREEN SYMBOL -239B ; [*0762.0020.0002] # LEFT PARENTHESIS UPPER HOOK -239C ; [*0763.0020.0002] # LEFT PARENTHESIS EXTENSION -239D ; [*0764.0020.0002] # LEFT PARENTHESIS LOWER HOOK -239E ; [*0765.0020.0002] # RIGHT PARENTHESIS UPPER HOOK -239F ; [*0766.0020.0002] # RIGHT PARENTHESIS EXTENSION -23A0 ; [*0767.0020.0002] # RIGHT PARENTHESIS LOWER HOOK -23A1 ; [*0768.0020.0002] # LEFT SQUARE BRACKET UPPER CORNER -23A2 ; [*0769.0020.0002] # LEFT SQUARE BRACKET EXTENSION -23A3 ; [*076A.0020.0002] # LEFT SQUARE BRACKET LOWER CORNER -23A4 ; [*076B.0020.0002] # RIGHT SQUARE BRACKET UPPER CORNER -23A5 ; [*076C.0020.0002] # RIGHT SQUARE BRACKET EXTENSION -23A6 ; [*076D.0020.0002] # RIGHT SQUARE BRACKET LOWER CORNER -23A7 ; [*076E.0020.0002] # LEFT CURLY BRACKET UPPER HOOK -23A8 ; [*076F.0020.0002] # LEFT CURLY BRACKET MIDDLE PIECE -23A9 ; [*0770.0020.0002] # LEFT CURLY BRACKET LOWER HOOK -23AA ; [*0771.0020.0002] # CURLY BRACKET EXTENSION -23AB ; [*0772.0020.0002] # RIGHT CURLY BRACKET UPPER HOOK -23AC ; [*0773.0020.0002] # RIGHT CURLY BRACKET MIDDLE PIECE -23AD ; [*0774.0020.0002] # RIGHT CURLY BRACKET LOWER HOOK -23AE ; [*0775.0020.0002] # INTEGRAL EXTENSION -23AF ; [*0776.0020.0002] # HORIZONTAL LINE EXTENSION -23B0 ; [*0777.0020.0002] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION -23B1 ; [*0778.0020.0002] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION -23B2 ; [*0779.0020.0002] # SUMMATION TOP -23B3 ; [*077A.0020.0002] # SUMMATION BOTTOM -23B4 ; [*077B.0020.0002] # TOP SQUARE BRACKET -23B5 ; [*077C.0020.0002] # BOTTOM SQUARE BRACKET -23B6 ; [*077D.0020.0002] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET -23B7 ; [*077E.0020.0002] # RADICAL SYMBOL BOTTOM -23B8 ; [*077F.0020.0002] # LEFT VERTICAL BOX LINE -23B9 ; [*0780.0020.0002] # RIGHT VERTICAL BOX LINE -23BA ; [*0781.0020.0002] # HORIZONTAL SCAN LINE-1 -23BB ; [*0782.0020.0002] # HORIZONTAL SCAN LINE-3 -23BC ; [*0783.0020.0002] # HORIZONTAL SCAN LINE-7 -23BD ; [*0784.0020.0002] # HORIZONTAL SCAN LINE-9 -23BE ; [*0785.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT -23BF ; [*0786.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT -23C0 ; [*0787.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE -23C1 ; [*0788.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE -23C2 ; [*0789.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE -23C3 ; [*078A.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE -23C4 ; [*078B.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE -23C5 ; [*078C.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE -23C6 ; [*078D.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE -23C7 ; [*078E.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE -23C8 ; [*078F.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE -23C9 ; [*0790.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL -23CA ; [*0791.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL -23CB ; [*0792.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT -23CC ; [*0793.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT -23CD ; [*0794.0020.0002] # SQUARE FOOT -23CE ; [*0795.0020.0002] # RETURN SYMBOL -23CF ; [*0796.0020.0002] # EJECT SYMBOL -23D0 ; [*0797.0020.0002] # VERTICAL LINE EXTENSION -23D1 ; [*0798.0020.0002] # METRICAL BREVE -23D2 ; [*0799.0020.0002] # METRICAL LONG OVER SHORT -23D3 ; [*079A.0020.0002] # METRICAL SHORT OVER LONG -23D4 ; [*079B.0020.0002] # METRICAL LONG OVER TWO SHORTS -23D5 ; [*079C.0020.0002] # METRICAL TWO SHORTS OVER LONG -23D6 ; [*079D.0020.0002] # METRICAL TWO SHORTS JOINED -23D7 ; [*079E.0020.0002] # METRICAL TRISEME -23D8 ; [*079F.0020.0002] # METRICAL TETRASEME -23D9 ; [*07A0.0020.0002] # METRICAL PENTASEME -23DA ; [*07A1.0020.0002] # EARTH GROUND -23DB ; [*07A2.0020.0002] # FUSE -23DC ; [*07A3.0020.0002] # TOP PARENTHESIS -23DD ; [*07A4.0020.0002] # BOTTOM PARENTHESIS -23DE ; [*07A5.0020.0002] # TOP CURLY BRACKET -23DF ; [*07A6.0020.0002] # BOTTOM CURLY BRACKET -23E0 ; [*07A7.0020.0002] # TOP TORTOISE SHELL BRACKET -23E1 ; [*07A8.0020.0002] # BOTTOM TORTOISE SHELL BRACKET -23E2 ; [*07A9.0020.0002] # WHITE TRAPEZIUM -23E3 ; [*07AA.0020.0002] # BENZENE RING WITH CIRCLE -23E4 ; [*07AB.0020.0002] # STRAIGHTNESS -23E5 ; [*07AC.0020.0002] # FLATNESS -23E6 ; [*07AD.0020.0002] # AC CURRENT -23E7 ; [*07AE.0020.0002] # ELECTRICAL INTERSECTION -23E8 ; [*07AF.0020.0002] # DECIMAL EXPONENT SYMBOL -23E9 ; [*07B0.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE -23EA ; [*07B1.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE -23EB ; [*07B2.0020.0002] # BLACK UP-POINTING DOUBLE TRIANGLE -23EC ; [*07B3.0020.0002] # BLACK DOWN-POINTING DOUBLE TRIANGLE -23ED ; [*07B4.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR -23EE ; [*07B5.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR -23EF ; [*07B6.0020.0002] # BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR -23F0 ; [*07B7.0020.0002] # ALARM CLOCK -23F1 ; [*07B8.0020.0002] # STOPWATCH -23F2 ; [*07B9.0020.0002] # TIMER CLOCK -23F3 ; [*07BA.0020.0002] # HOURGLASS WITH FLOWING SAND -23F4 ; [*07BB.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE -23F5 ; [*07BC.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE -23F6 ; [*07BD.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE -23F7 ; [*07BE.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE -23F8 ; [*07BF.0020.0002] # DOUBLE VERTICAL BAR -23F9 ; [*07C0.0020.0002] # BLACK SQUARE FOR STOP -23FA ; [*07C1.0020.0002] # BLACK CIRCLE FOR RECORD -2400 ; [*07C2.0020.0002] # SYMBOL FOR NULL -2401 ; [*07C3.0020.0002] # SYMBOL FOR START OF HEADING -2402 ; [*07C4.0020.0002] # SYMBOL FOR START OF TEXT -2403 ; [*07C5.0020.0002] # SYMBOL FOR END OF TEXT -2404 ; [*07C6.0020.0002] # SYMBOL FOR END OF TRANSMISSION -2405 ; [*07C7.0020.0002] # SYMBOL FOR ENQUIRY -2406 ; [*07C8.0020.0002] # SYMBOL FOR ACKNOWLEDGE -2407 ; [*07C9.0020.0002] # SYMBOL FOR BELL -2408 ; [*07CA.0020.0002] # SYMBOL FOR BACKSPACE -2409 ; [*07CB.0020.0002] # SYMBOL FOR HORIZONTAL TABULATION -240A ; [*07CC.0020.0002] # SYMBOL FOR LINE FEED -240B ; [*07CD.0020.0002] # SYMBOL FOR VERTICAL TABULATION -240C ; [*07CE.0020.0002] # SYMBOL FOR FORM FEED -240D ; [*07CF.0020.0002] # SYMBOL FOR CARRIAGE RETURN -240E ; [*07D0.0020.0002] # SYMBOL FOR SHIFT OUT -240F ; [*07D1.0020.0002] # SYMBOL FOR SHIFT IN -2410 ; [*07D2.0020.0002] # SYMBOL FOR DATA LINK ESCAPE -2411 ; [*07D3.0020.0002] # SYMBOL FOR DEVICE CONTROL ONE -2412 ; [*07D4.0020.0002] # SYMBOL FOR DEVICE CONTROL TWO -2413 ; [*07D5.0020.0002] # SYMBOL FOR DEVICE CONTROL THREE -2414 ; [*07D6.0020.0002] # SYMBOL FOR DEVICE CONTROL FOUR -2415 ; [*07D7.0020.0002] # SYMBOL FOR NEGATIVE ACKNOWLEDGE -2416 ; [*07D8.0020.0002] # SYMBOL FOR SYNCHRONOUS IDLE -2417 ; [*07D9.0020.0002] # SYMBOL FOR END OF TRANSMISSION BLOCK -2418 ; [*07DA.0020.0002] # SYMBOL FOR CANCEL -2419 ; [*07DB.0020.0002] # SYMBOL FOR END OF MEDIUM -241A ; [*07DC.0020.0002] # SYMBOL FOR SUBSTITUTE -241B ; [*07DD.0020.0002] # SYMBOL FOR ESCAPE -241C ; [*07DE.0020.0002] # SYMBOL FOR FILE SEPARATOR -241D ; [*07DF.0020.0002] # SYMBOL FOR GROUP SEPARATOR -241E ; [*07E0.0020.0002] # SYMBOL FOR RECORD SEPARATOR -241F ; [*07E1.0020.0002] # SYMBOL FOR UNIT SEPARATOR -2420 ; [*07E2.0020.0002] # SYMBOL FOR SPACE -2421 ; [*07E3.0020.0002] # SYMBOL FOR DELETE -2422 ; [*07E4.0020.0002] # BLANK SYMBOL -2423 ; [*07E5.0020.0002] # OPEN BOX -2424 ; [*07E6.0020.0002] # SYMBOL FOR NEWLINE -2425 ; [*07E7.0020.0002] # SYMBOL FOR DELETE FORM TWO -2426 ; [*07E8.0020.0002] # SYMBOL FOR SUBSTITUTE FORM TWO -2440 ; [*07E9.0020.0002] # OCR HOOK -2441 ; [*07EA.0020.0002] # OCR CHAIR -2442 ; [*07EB.0020.0002] # OCR FORK -2443 ; [*07EC.0020.0002] # OCR INVERTED FORK -2444 ; [*07ED.0020.0002] # OCR BELT BUCKLE -2445 ; [*07EE.0020.0002] # OCR BOW TIE -2446 ; [*07EF.0020.0002] # OCR BRANCH BANK IDENTIFICATION -2447 ; [*07F0.0020.0002] # OCR AMOUNT OF CHECK -2448 ; [*07F1.0020.0002] # OCR DASH -2449 ; [*07F2.0020.0002] # OCR CUSTOMER ACCOUNT NUMBER -244A ; [*07F3.0020.0002] # OCR DOUBLE BACKSLASH -2500 ; [*07F4.0020.0002] # BOX DRAWINGS LIGHT HORIZONTAL -2501 ; [*07F5.0020.0002] # BOX DRAWINGS HEAVY HORIZONTAL -2502 ; [*07F6.0020.0002] # BOX DRAWINGS LIGHT VERTICAL -2503 ; [*07F7.0020.0002] # BOX DRAWINGS HEAVY VERTICAL -2504 ; [*07F8.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL -2505 ; [*07F9.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL -2506 ; [*07FA.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL -2507 ; [*07FB.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL -2508 ; [*07FC.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL -2509 ; [*07FD.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL -250A ; [*07FE.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL -250B ; [*07FF.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL -250C ; [*0800.0020.0002] # BOX DRAWINGS LIGHT DOWN AND RIGHT -250D ; [*0801.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY -250E ; [*0802.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT -250F ; [*0803.0020.0002] # BOX DRAWINGS HEAVY DOWN AND RIGHT -2510 ; [*0804.0020.0002] # BOX DRAWINGS LIGHT DOWN AND LEFT -2511 ; [*0805.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY -2512 ; [*0806.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT -2513 ; [*0807.0020.0002] # BOX DRAWINGS HEAVY DOWN AND LEFT -2514 ; [*0808.0020.0002] # BOX DRAWINGS LIGHT UP AND RIGHT -2515 ; [*0809.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY -2516 ; [*080A.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT -2517 ; [*080B.0020.0002] # BOX DRAWINGS HEAVY UP AND RIGHT -2518 ; [*080C.0020.0002] # BOX DRAWINGS LIGHT UP AND LEFT -2519 ; [*080D.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY -251A ; [*080E.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT -251B ; [*080F.0020.0002] # BOX DRAWINGS HEAVY UP AND LEFT -251C ; [*0810.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT -251D ; [*0811.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY -251E ; [*0812.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT -251F ; [*0813.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT -2520 ; [*0814.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT -2521 ; [*0815.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY -2522 ; [*0816.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY -2523 ; [*0817.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT -2524 ; [*0818.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND LEFT -2525 ; [*0819.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY -2526 ; [*081A.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT -2527 ; [*081B.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT -2528 ; [*081C.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT -2529 ; [*081D.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY -252A ; [*081E.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY -252B ; [*081F.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND LEFT -252C ; [*0820.0020.0002] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL -252D ; [*0821.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT -252E ; [*0822.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT -252F ; [*0823.0020.0002] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY -2530 ; [*0824.0020.0002] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT -2531 ; [*0825.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY -2532 ; [*0826.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY -2533 ; [*0827.0020.0002] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL -2534 ; [*0828.0020.0002] # BOX DRAWINGS LIGHT UP AND HORIZONTAL -2535 ; [*0829.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT -2536 ; [*082A.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT -2537 ; [*082B.0020.0002] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY -2538 ; [*082C.0020.0002] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT -2539 ; [*082D.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY -253A ; [*082E.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY -253B ; [*082F.0020.0002] # BOX DRAWINGS HEAVY UP AND HORIZONTAL -253C ; [*0830.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL -253D ; [*0831.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT -253E ; [*0832.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT -253F ; [*0833.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY -2540 ; [*0834.0020.0002] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT -2541 ; [*0835.0020.0002] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT -2542 ; [*0836.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT -2543 ; [*0837.0020.0002] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT -2544 ; [*0838.0020.0002] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT -2545 ; [*0839.0020.0002] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT -2546 ; [*083A.0020.0002] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT -2547 ; [*083B.0020.0002] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY -2548 ; [*083C.0020.0002] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY -2549 ; [*083D.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY -254A ; [*083E.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY -254B ; [*083F.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL -254C ; [*0840.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL -254D ; [*0841.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL -254E ; [*0842.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL -254F ; [*0843.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL -2550 ; [*0844.0020.0002] # BOX DRAWINGS DOUBLE HORIZONTAL -2551 ; [*0845.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL -2552 ; [*0846.0020.0002] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE -2553 ; [*0847.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE -2554 ; [*0848.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND RIGHT -2555 ; [*0849.0020.0002] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE -2556 ; [*084A.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE -2557 ; [*084B.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND LEFT -2558 ; [*084C.0020.0002] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE -2559 ; [*084D.0020.0002] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE -255A ; [*084E.0020.0002] # BOX DRAWINGS DOUBLE UP AND RIGHT -255B ; [*084F.0020.0002] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE -255C ; [*0850.0020.0002] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE -255D ; [*0851.0020.0002] # BOX DRAWINGS DOUBLE UP AND LEFT -255E ; [*0852.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE -255F ; [*0853.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE -2560 ; [*0854.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT -2561 ; [*0855.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE -2562 ; [*0856.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE -2563 ; [*0857.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT -2564 ; [*0858.0020.0002] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE -2565 ; [*0859.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE -2566 ; [*085A.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL -2567 ; [*085B.0020.0002] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE -2568 ; [*085C.0020.0002] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE -2569 ; [*085D.0020.0002] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL -256A ; [*085E.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE -256B ; [*085F.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE -256C ; [*0860.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL -256D ; [*0861.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT -256E ; [*0862.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT -256F ; [*0863.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND LEFT -2570 ; [*0864.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND RIGHT -2571 ; [*0865.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT -2572 ; [*0866.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT -2573 ; [*0867.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL CROSS -2574 ; [*0868.0020.0002] # BOX DRAWINGS LIGHT LEFT -2575 ; [*0869.0020.0002] # BOX DRAWINGS LIGHT UP -2576 ; [*086A.0020.0002] # BOX DRAWINGS LIGHT RIGHT -2577 ; [*086B.0020.0002] # BOX DRAWINGS LIGHT DOWN -2578 ; [*086C.0020.0002] # BOX DRAWINGS HEAVY LEFT -2579 ; [*086D.0020.0002] # BOX DRAWINGS HEAVY UP -257A ; [*086E.0020.0002] # BOX DRAWINGS HEAVY RIGHT -257B ; [*086F.0020.0002] # BOX DRAWINGS HEAVY DOWN -257C ; [*0870.0020.0002] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT -257D ; [*0871.0020.0002] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN -257E ; [*0872.0020.0002] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT -257F ; [*0873.0020.0002] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN -2580 ; [*0874.0020.0002] # UPPER HALF BLOCK -2581 ; [*0875.0020.0002] # LOWER ONE EIGHTH BLOCK -2582 ; [*0876.0020.0002] # LOWER ONE QUARTER BLOCK -2583 ; [*0877.0020.0002] # LOWER THREE EIGHTHS BLOCK -2584 ; [*0878.0020.0002] # LOWER HALF BLOCK -2585 ; [*0879.0020.0002] # LOWER FIVE EIGHTHS BLOCK -2586 ; [*087A.0020.0002] # LOWER THREE QUARTERS BLOCK -2587 ; [*087B.0020.0002] # LOWER SEVEN EIGHTHS BLOCK -2588 ; [*087C.0020.0002] # FULL BLOCK -2589 ; [*087D.0020.0002] # LEFT SEVEN EIGHTHS BLOCK -258A ; [*087E.0020.0002] # LEFT THREE QUARTERS BLOCK -258B ; [*087F.0020.0002] # LEFT FIVE EIGHTHS BLOCK -258C ; [*0880.0020.0002] # LEFT HALF BLOCK -258D ; [*0881.0020.0002] # LEFT THREE EIGHTHS BLOCK -258E ; [*0882.0020.0002] # LEFT ONE QUARTER BLOCK -258F ; [*0883.0020.0002] # LEFT ONE EIGHTH BLOCK -2590 ; [*0884.0020.0002] # RIGHT HALF BLOCK -2591 ; [*0885.0020.0002] # LIGHT SHADE -2592 ; [*0886.0020.0002] # MEDIUM SHADE -2593 ; [*0887.0020.0002] # DARK SHADE -2594 ; [*0888.0020.0002] # UPPER ONE EIGHTH BLOCK -2595 ; [*0889.0020.0002] # RIGHT ONE EIGHTH BLOCK -2596 ; [*088A.0020.0002] # QUADRANT LOWER LEFT -2597 ; [*088B.0020.0002] # QUADRANT LOWER RIGHT -2598 ; [*088C.0020.0002] # QUADRANT UPPER LEFT -2599 ; [*088D.0020.0002] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT -259A ; [*088E.0020.0002] # QUADRANT UPPER LEFT AND LOWER RIGHT -259B ; [*088F.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT -259C ; [*0890.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT -259D ; [*0891.0020.0002] # QUADRANT UPPER RIGHT -259E ; [*0892.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT -259F ; [*0893.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT -25A0 ; [*0894.0020.0002] # BLACK SQUARE -25A1 ; [*0895.0020.0002] # WHITE SQUARE -25A2 ; [*0896.0020.0002] # WHITE SQUARE WITH ROUNDED CORNERS -25A3 ; [*0897.0020.0002] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE -25A4 ; [*0898.0020.0002] # SQUARE WITH HORIZONTAL FILL -25A5 ; [*0899.0020.0002] # SQUARE WITH VERTICAL FILL -25A6 ; [*089A.0020.0002] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL -25A7 ; [*089B.0020.0002] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL -25A8 ; [*089C.0020.0002] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL -25A9 ; [*089D.0020.0002] # SQUARE WITH DIAGONAL CROSSHATCH FILL -25AA ; [*089E.0020.0002] # BLACK SMALL SQUARE -25AB ; [*089F.0020.0002] # WHITE SMALL SQUARE -25AC ; [*08A0.0020.0002] # BLACK RECTANGLE -25AD ; [*08A1.0020.0002] # WHITE RECTANGLE -25AE ; [*08A2.0020.0002] # BLACK VERTICAL RECTANGLE -25AF ; [*08A3.0020.0002] # WHITE VERTICAL RECTANGLE -25B0 ; [*08A4.0020.0002] # BLACK PARALLELOGRAM -25B1 ; [*08A5.0020.0002] # WHITE PARALLELOGRAM -25B2 ; [*08A6.0020.0002] # BLACK UP-POINTING TRIANGLE -25B3 ; [*08A7.0020.0002] # WHITE UP-POINTING TRIANGLE -25B4 ; [*08A8.0020.0002] # BLACK UP-POINTING SMALL TRIANGLE -25B5 ; [*08A9.0020.0002] # WHITE UP-POINTING SMALL TRIANGLE -25B6 ; [*08AA.0020.0002] # BLACK RIGHT-POINTING TRIANGLE -25B7 ; [*08AB.0020.0002] # WHITE RIGHT-POINTING TRIANGLE -25B8 ; [*08AC.0020.0002] # BLACK RIGHT-POINTING SMALL TRIANGLE -25B9 ; [*08AD.0020.0002] # WHITE RIGHT-POINTING SMALL TRIANGLE -25BA ; [*08AE.0020.0002] # BLACK RIGHT-POINTING POINTER -25BB ; [*08AF.0020.0002] # WHITE RIGHT-POINTING POINTER -25BC ; [*08B0.0020.0002] # BLACK DOWN-POINTING TRIANGLE -25BD ; [*08B1.0020.0002] # WHITE DOWN-POINTING TRIANGLE -25BE ; [*08B2.0020.0002] # BLACK DOWN-POINTING SMALL TRIANGLE -25BF ; [*08B3.0020.0002] # WHITE DOWN-POINTING SMALL TRIANGLE -25C0 ; [*08B4.0020.0002] # BLACK LEFT-POINTING TRIANGLE -25C1 ; [*08B5.0020.0002] # WHITE LEFT-POINTING TRIANGLE -25C2 ; [*08B6.0020.0002] # BLACK LEFT-POINTING SMALL TRIANGLE -25C3 ; [*08B7.0020.0002] # WHITE LEFT-POINTING SMALL TRIANGLE -25C4 ; [*08B8.0020.0002] # BLACK LEFT-POINTING POINTER -25C5 ; [*08B9.0020.0002] # WHITE LEFT-POINTING POINTER -25C6 ; [*08BA.0020.0002] # BLACK DIAMOND -25C7 ; [*08BB.0020.0002] # WHITE DIAMOND -25C8 ; [*08BC.0020.0002] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND -25C9 ; [*08BD.0020.0002] # FISHEYE -25CA ; [*08BE.0020.0002] # LOZENGE -25CB ; [*08BF.0020.0002] # WHITE CIRCLE -25CC ; [*08C0.0020.0002] # DOTTED CIRCLE -25CD ; [*08C1.0020.0002] # CIRCLE WITH VERTICAL FILL -25CE ; [*08C2.0020.0002] # BULLSEYE -25CF ; [*08C3.0020.0002] # BLACK CIRCLE -25D0 ; [*08C4.0020.0002] # CIRCLE WITH LEFT HALF BLACK -25D1 ; [*08C5.0020.0002] # CIRCLE WITH RIGHT HALF BLACK -25D2 ; [*08C6.0020.0002] # CIRCLE WITH LOWER HALF BLACK -25D3 ; [*08C7.0020.0002] # CIRCLE WITH UPPER HALF BLACK -25D4 ; [*08C8.0020.0002] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK -25D5 ; [*08C9.0020.0002] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK -25D6 ; [*08CA.0020.0002] # LEFT HALF BLACK CIRCLE -25D7 ; [*08CB.0020.0002] # RIGHT HALF BLACK CIRCLE -25D8 ; [*08CC.0020.0002] # INVERSE BULLET -25D9 ; [*08CD.0020.0002] # INVERSE WHITE CIRCLE -25DA ; [*08CE.0020.0002] # UPPER HALF INVERSE WHITE CIRCLE -25DB ; [*08CF.0020.0002] # LOWER HALF INVERSE WHITE CIRCLE -25DC ; [*08D0.0020.0002] # UPPER LEFT QUADRANT CIRCULAR ARC -25DD ; [*08D1.0020.0002] # UPPER RIGHT QUADRANT CIRCULAR ARC -25DE ; [*08D2.0020.0002] # LOWER RIGHT QUADRANT CIRCULAR ARC -25DF ; [*08D3.0020.0002] # LOWER LEFT QUADRANT CIRCULAR ARC -25E0 ; [*08D4.0020.0002] # UPPER HALF CIRCLE -25E1 ; [*08D5.0020.0002] # LOWER HALF CIRCLE -25E2 ; [*08D6.0020.0002] # BLACK LOWER RIGHT TRIANGLE -25E3 ; [*08D7.0020.0002] # BLACK LOWER LEFT TRIANGLE -25E4 ; [*08D8.0020.0002] # BLACK UPPER LEFT TRIANGLE -25E5 ; [*08D9.0020.0002] # BLACK UPPER RIGHT TRIANGLE -25E6 ; [*08DA.0020.0002] # WHITE BULLET -25E7 ; [*08DB.0020.0002] # SQUARE WITH LEFT HALF BLACK -25E8 ; [*08DC.0020.0002] # SQUARE WITH RIGHT HALF BLACK -25E9 ; [*08DD.0020.0002] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK -25EA ; [*08DE.0020.0002] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK -25EB ; [*08DF.0020.0002] # WHITE SQUARE WITH VERTICAL BISECTING LINE -25EC ; [*08E0.0020.0002] # WHITE UP-POINTING TRIANGLE WITH DOT -25ED ; [*08E1.0020.0002] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK -25EE ; [*08E2.0020.0002] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK -25EF ; [*08E3.0020.0002] # LARGE CIRCLE -25F0 ; [*08E4.0020.0002] # WHITE SQUARE WITH UPPER LEFT QUADRANT -25F1 ; [*08E5.0020.0002] # WHITE SQUARE WITH LOWER LEFT QUADRANT -25F2 ; [*08E6.0020.0002] # WHITE SQUARE WITH LOWER RIGHT QUADRANT -25F3 ; [*08E7.0020.0002] # WHITE SQUARE WITH UPPER RIGHT QUADRANT -25F4 ; [*08E8.0020.0002] # WHITE CIRCLE WITH UPPER LEFT QUADRANT -25F5 ; [*08E9.0020.0002] # WHITE CIRCLE WITH LOWER LEFT QUADRANT -25F6 ; [*08EA.0020.0002] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT -25F7 ; [*08EB.0020.0002] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8 ; [*08EC.0020.0002] # UPPER LEFT TRIANGLE -25F9 ; [*08ED.0020.0002] # UPPER RIGHT TRIANGLE -25FA ; [*08EE.0020.0002] # LOWER LEFT TRIANGLE -25FB ; [*08EF.0020.0002] # WHITE MEDIUM SQUARE -25FC ; [*08F0.0020.0002] # BLACK MEDIUM SQUARE -25FD ; [*08F1.0020.0002] # WHITE MEDIUM SMALL SQUARE -25FE ; [*08F2.0020.0002] # BLACK MEDIUM SMALL SQUARE -25FF ; [*08F3.0020.0002] # LOWER RIGHT TRIANGLE -2600 ; [*08F4.0020.0002] # BLACK SUN WITH RAYS -2601 ; [*08F5.0020.0002] # CLOUD -2602 ; [*08F6.0020.0002] # UMBRELLA -2603 ; [*08F7.0020.0002] # SNOWMAN -2604 ; [*08F8.0020.0002] # COMET -2605 ; [*08F9.0020.0002] # BLACK STAR -2606 ; [*08FA.0020.0002] # WHITE STAR -2607 ; [*08FB.0020.0002] # LIGHTNING -2608 ; [*08FC.0020.0002] # THUNDERSTORM -2609 ; [*08FD.0020.0002] # SUN -260A ; [*08FE.0020.0002] # ASCENDING NODE -260B ; [*08FF.0020.0002] # DESCENDING NODE -260C ; [*0900.0020.0002] # CONJUNCTION -260D ; [*0901.0020.0002] # OPPOSITION -260E ; [*0902.0020.0002] # BLACK TELEPHONE -260F ; [*0903.0020.0002] # WHITE TELEPHONE -2610 ; [*0904.0020.0002] # BALLOT BOX -2611 ; [*0905.0020.0002] # BALLOT BOX WITH CHECK -2612 ; [*0906.0020.0002] # BALLOT BOX WITH X -2613 ; [*0907.0020.0002] # SALTIRE -2614 ; [*0908.0020.0002] # UMBRELLA WITH RAIN DROPS -2615 ; [*0909.0020.0002] # HOT BEVERAGE -2616 ; [*090A.0020.0002] # WHITE SHOGI PIECE -2617 ; [*090B.0020.0002] # BLACK SHOGI PIECE -2618 ; [*090C.0020.0002] # SHAMROCK -2619 ; [*090D.0020.0002] # REVERSED ROTATED FLORAL HEART BULLET -261A ; [*090E.0020.0002] # BLACK LEFT POINTING INDEX -261B ; [*090F.0020.0002] # BLACK RIGHT POINTING INDEX -261C ; [*0910.0020.0002] # WHITE LEFT POINTING INDEX -261D ; [*0911.0020.0002] # WHITE UP POINTING INDEX -261E ; [*0912.0020.0002] # WHITE RIGHT POINTING INDEX -261F ; [*0913.0020.0002] # WHITE DOWN POINTING INDEX -2620 ; [*0914.0020.0002] # SKULL AND CROSSBONES -2621 ; [*0915.0020.0002] # CAUTION SIGN -2622 ; [*0916.0020.0002] # RADIOACTIVE SIGN -2623 ; [*0917.0020.0002] # BIOHAZARD SIGN -2624 ; [*0918.0020.0002] # CADUCEUS -2625 ; [*0919.0020.0002] # ANKH -2626 ; [*091A.0020.0002] # ORTHODOX CROSS -2627 ; [*091B.0020.0002] # CHI RHO -2628 ; [*091C.0020.0002] # CROSS OF LORRAINE -2629 ; [*091D.0020.0002] # CROSS OF JERUSALEM -262A ; [*091E.0020.0002] # STAR AND CRESCENT -262B ; [*091F.0020.0002] # FARSI SYMBOL -262C ; [*0920.0020.0002] # ADI SHAKTI -262D ; [*0921.0020.0002] # HAMMER AND SICKLE -262E ; [*0922.0020.0002] # PEACE SYMBOL -262F ; [*0923.0020.0002] # YIN YANG -2630 ; [*0E7E.0020.0002] # TRIGRAM FOR HEAVEN -2631 ; [*0E7F.0020.0002] # TRIGRAM FOR LAKE -2632 ; [*0E80.0020.0002] # TRIGRAM FOR FIRE -2633 ; [*0E81.0020.0002] # TRIGRAM FOR THUNDER -2634 ; [*0E82.0020.0002] # TRIGRAM FOR WIND -2635 ; [*0E83.0020.0002] # TRIGRAM FOR WATER -2636 ; [*0E84.0020.0002] # TRIGRAM FOR MOUNTAIN -2637 ; [*0E85.0020.0002] # TRIGRAM FOR EARTH -2638 ; [*0924.0020.0002] # WHEEL OF DHARMA -2639 ; [*0925.0020.0002] # WHITE FROWNING FACE -263A ; [*0926.0020.0002] # WHITE SMILING FACE -263B ; [*0927.0020.0002] # BLACK SMILING FACE -263C ; [*0928.0020.0002] # WHITE SUN WITH RAYS -263D ; [*0929.0020.0002] # FIRST QUARTER MOON -263E ; [*092A.0020.0002] # LAST QUARTER MOON -263F ; [*092B.0020.0002] # MERCURY -2640 ; [*092C.0020.0002] # FEMALE SIGN -2641 ; [*092D.0020.0002] # EARTH -2642 ; [*092E.0020.0002] # MALE SIGN -2643 ; [*092F.0020.0002] # JUPITER -2644 ; [*0930.0020.0002] # SATURN -2645 ; [*0931.0020.0002] # URANUS -2646 ; [*0932.0020.0002] # NEPTUNE -2647 ; [*0933.0020.0002] # PLUTO -2648 ; [*0934.0020.0002] # ARIES -2649 ; [*0935.0020.0002] # TAURUS -264A ; [*0936.0020.0002] # GEMINI -264B ; [*0937.0020.0002] # CANCER -264C ; [*0938.0020.0002] # LEO -264D ; [*0939.0020.0002] # VIRGO -264E ; [*093A.0020.0002] # LIBRA -264F ; [*093B.0020.0002] # SCORPIUS -2650 ; [*093C.0020.0002] # SAGITTARIUS -2651 ; [*093D.0020.0002] # CAPRICORN -2652 ; [*093E.0020.0002] # AQUARIUS -2653 ; [*093F.0020.0002] # PISCES -2654 ; [*0940.0020.0002] # WHITE CHESS KING -2655 ; [*0941.0020.0002] # WHITE CHESS QUEEN -2656 ; [*0942.0020.0002] # WHITE CHESS ROOK -2657 ; [*0943.0020.0002] # WHITE CHESS BISHOP -2658 ; [*0944.0020.0002] # WHITE CHESS KNIGHT -2659 ; [*0945.0020.0002] # WHITE CHESS PAWN -265A ; [*0946.0020.0002] # BLACK CHESS KING -265B ; [*0947.0020.0002] # BLACK CHESS QUEEN -265C ; [*0948.0020.0002] # BLACK CHESS ROOK -265D ; [*0949.0020.0002] # BLACK CHESS BISHOP -265E ; [*094A.0020.0002] # BLACK CHESS KNIGHT -265F ; [*094B.0020.0002] # BLACK CHESS PAWN -2660 ; [*094C.0020.0002] # BLACK SPADE SUIT -2661 ; [*094D.0020.0002] # WHITE HEART SUIT -2662 ; [*094E.0020.0002] # WHITE DIAMOND SUIT -2663 ; [*094F.0020.0002] # BLACK CLUB SUIT -2664 ; [*0950.0020.0002] # WHITE SPADE SUIT -2665 ; [*0951.0020.0002] # BLACK HEART SUIT -2666 ; [*0952.0020.0002] # BLACK DIAMOND SUIT -2667 ; [*0953.0020.0002] # WHITE CLUB SUIT -2668 ; [*0954.0020.0002] # HOT SPRINGS -2669 ; [*0955.0020.0002] # QUARTER NOTE -266A ; [*0956.0020.0002] # EIGHTH NOTE -266B ; [*0957.0020.0002] # BEAMED EIGHTH NOTES -266C ; [*0958.0020.0002] # BEAMED SIXTEENTH NOTES -266D ; [*10CD.0020.0002] # MUSIC FLAT SIGN -266E ; [*10CE.0020.0002] # MUSIC NATURAL SIGN -266F ; [*10CF.0020.0002] # MUSIC SHARP SIGN -2670 ; [*0959.0020.0002] # WEST SYRIAC CROSS -2671 ; [*095A.0020.0002] # EAST SYRIAC CROSS -2672 ; [*095B.0020.0002] # UNIVERSAL RECYCLING SYMBOL -2673 ; [*095C.0020.0002] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS -2674 ; [*095D.0020.0002] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS -2675 ; [*095E.0020.0002] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS -2676 ; [*095F.0020.0002] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS -2677 ; [*0960.0020.0002] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS -2678 ; [*0961.0020.0002] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS -2679 ; [*0962.0020.0002] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS -267A ; [*0963.0020.0002] # RECYCLING SYMBOL FOR GENERIC MATERIALS -267B ; [*0964.0020.0002] # BLACK UNIVERSAL RECYCLING SYMBOL -267C ; [*0965.0020.0002] # RECYCLED PAPER SYMBOL -267D ; [*0966.0020.0002] # PARTIALLY-RECYCLED PAPER SYMBOL -267E ; [*0967.0020.0002] # PERMANENT PAPER SIGN -267F ; [*0968.0020.0002] # WHEELCHAIR SYMBOL -2680 ; [*0969.0020.0002] # DIE FACE-1 -2681 ; [*096A.0020.0002] # DIE FACE-2 -2682 ; [*096B.0020.0002] # DIE FACE-3 -2683 ; [*096C.0020.0002] # DIE FACE-4 -2684 ; [*096D.0020.0002] # DIE FACE-5 -2685 ; [*096E.0020.0002] # DIE FACE-6 -2686 ; [*096F.0020.0002] # WHITE CIRCLE WITH DOT RIGHT -2687 ; [*0970.0020.0002] # WHITE CIRCLE WITH TWO DOTS -2688 ; [*0971.0020.0002] # BLACK CIRCLE WITH WHITE DOT RIGHT -2689 ; [*0972.0020.0002] # BLACK CIRCLE WITH TWO WHITE DOTS -268A ; [*0E78.0020.0002] # MONOGRAM FOR YANG -268B ; [*0E79.0020.0002] # MONOGRAM FOR YIN -268C ; [*0E7A.0020.0002] # DIGRAM FOR GREATER YANG -268D ; [*0E7B.0020.0002] # DIGRAM FOR LESSER YIN -268E ; [*0E7C.0020.0002] # DIGRAM FOR LESSER YANG -268F ; [*0E7D.0020.0002] # DIGRAM FOR GREATER YIN -2690 ; [*0973.0020.0002] # WHITE FLAG -2691 ; [*0974.0020.0002] # BLACK FLAG -2692 ; [*0975.0020.0002] # HAMMER AND PICK -2693 ; [*0976.0020.0002] # ANCHOR -2694 ; [*0977.0020.0002] # CROSSED SWORDS -2695 ; [*0978.0020.0002] # STAFF OF AESCULAPIUS -2696 ; [*0979.0020.0002] # SCALES -2697 ; [*097A.0020.0002] # ALEMBIC -2698 ; [*097B.0020.0002] # FLOWER -2699 ; [*097C.0020.0002] # GEAR -269A ; [*097D.0020.0002] # STAFF OF HERMES -269B ; [*097E.0020.0002] # ATOM SYMBOL -269C ; [*097F.0020.0002] # FLEUR-DE-LIS -269D ; [*0980.0020.0002] # OUTLINED WHITE STAR -269E ; [*0981.0020.0002] # THREE LINES CONVERGING RIGHT -269F ; [*0982.0020.0002] # THREE LINES CONVERGING LEFT -26A0 ; [*0983.0020.0002] # WARNING SIGN -26A1 ; [*0984.0020.0002] # HIGH VOLTAGE SIGN -26A2 ; [*0985.0020.0002] # DOUBLED FEMALE SIGN -26A3 ; [*0986.0020.0002] # DOUBLED MALE SIGN -26A4 ; [*0987.0020.0002] # INTERLOCKED FEMALE AND MALE SIGN -26A5 ; [*0988.0020.0002] # MALE AND FEMALE SIGN -26A6 ; [*0989.0020.0002] # MALE WITH STROKE SIGN -26A7 ; [*098A.0020.0002] # MALE WITH STROKE AND MALE AND FEMALE SIGN -26A8 ; [*098B.0020.0002] # VERTICAL MALE WITH STROKE SIGN -26A9 ; [*098C.0020.0002] # HORIZONTAL MALE WITH STROKE SIGN -26AA ; [*098D.0020.0002] # MEDIUM WHITE CIRCLE -26AB ; [*098E.0020.0002] # MEDIUM BLACK CIRCLE -26AC ; [*098F.0020.0002] # MEDIUM SMALL WHITE CIRCLE -26AD ; [*0990.0020.0002] # MARRIAGE SYMBOL -26AE ; [*0991.0020.0002] # DIVORCE SYMBOL -26AF ; [*0992.0020.0002] # UNMARRIED PARTNERSHIP SYMBOL -26B0 ; [*0993.0020.0002] # COFFIN -26B1 ; [*0994.0020.0002] # FUNERAL URN -26B2 ; [*0995.0020.0002] # NEUTER -26B3 ; [*0996.0020.0002] # CERES -26B4 ; [*0997.0020.0002] # PALLAS -26B5 ; [*0998.0020.0002] # JUNO -26B6 ; [*0999.0020.0002] # VESTA -26B7 ; [*099A.0020.0002] # CHIRON -26B8 ; [*099B.0020.0002] # BLACK MOON LILITH -26B9 ; [*099C.0020.0002] # SEXTILE -26BA ; [*099D.0020.0002] # SEMISEXTILE -26BB ; [*099E.0020.0002] # QUINCUNX -26BC ; [*099F.0020.0002] # SESQUIQUADRATE -26BD ; [*09A0.0020.0002] # SOCCER BALL -26BE ; [*09A1.0020.0002] # BASEBALL -26BF ; [*09A2.0020.0002] # SQUARED KEY -26C0 ; [*09A3.0020.0002] # WHITE DRAUGHTS MAN -26C1 ; [*09A4.0020.0002] # WHITE DRAUGHTS KING -26C2 ; [*09A5.0020.0002] # BLACK DRAUGHTS MAN -26C3 ; [*09A6.0020.0002] # BLACK DRAUGHTS KING -26C4 ; [*09A7.0020.0002] # SNOWMAN WITHOUT SNOW -26C5 ; [*09A8.0020.0002] # SUN BEHIND CLOUD -26C6 ; [*09A9.0020.0002] # RAIN -26C7 ; [*09AA.0020.0002] # BLACK SNOWMAN -26C8 ; [*09AB.0020.0002] # THUNDER CLOUD AND RAIN -26C9 ; [*09AC.0020.0002] # TURNED WHITE SHOGI PIECE -26CA ; [*09AD.0020.0002] # TURNED BLACK SHOGI PIECE -26CB ; [*09AE.0020.0002] # WHITE DIAMOND IN SQUARE -26CC ; [*09AF.0020.0002] # CROSSING LANES -26CD ; [*09B0.0020.0002] # DISABLED CAR -26CE ; [*09B1.0020.0002] # OPHIUCHUS -26CF ; [*09B2.0020.0002] # PICK -26D0 ; [*09B3.0020.0002] # CAR SLIDING -26D1 ; [*09B4.0020.0002] # HELMET WITH WHITE CROSS -26D2 ; [*09B5.0020.0002] # CIRCLED CROSSING LANES -26D3 ; [*09B6.0020.0002] # CHAINS -26D4 ; [*09B7.0020.0002] # NO ENTRY -26D5 ; [*09B8.0020.0002] # ALTERNATE ONE-WAY LEFT WAY TRAFFIC -26D6 ; [*09B9.0020.0002] # BLACK TWO-WAY LEFT WAY TRAFFIC -26D7 ; [*09BA.0020.0002] # WHITE TWO-WAY LEFT WAY TRAFFIC -26D8 ; [*09BB.0020.0002] # BLACK LEFT LANE MERGE -26D9 ; [*09BC.0020.0002] # WHITE LEFT LANE MERGE -26DA ; [*09BD.0020.0002] # DRIVE SLOW SIGN -26DB ; [*09BE.0020.0002] # HEAVY WHITE DOWN-POINTING TRIANGLE -26DC ; [*09BF.0020.0002] # LEFT CLOSED ENTRY -26DD ; [*09C0.0020.0002] # SQUARED SALTIRE -26DE ; [*09C1.0020.0002] # FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE -26DF ; [*09C2.0020.0002] # BLACK TRUCK -26E0 ; [*09C3.0020.0002] # RESTRICTED LEFT ENTRY-1 -26E1 ; [*09C4.0020.0002] # RESTRICTED LEFT ENTRY-2 -26E2 ; [*09C5.0020.0002] # ASTRONOMICAL SYMBOL FOR URANUS -26E3 ; [*09C6.0020.0002] # HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE -26E4 ; [*09C7.0020.0002] # PENTAGRAM -26E5 ; [*09C8.0020.0002] # RIGHT-HANDED INTERLACED PENTAGRAM -26E6 ; [*09C9.0020.0002] # LEFT-HANDED INTERLACED PENTAGRAM -26E7 ; [*09CA.0020.0002] # INVERTED PENTAGRAM -26E8 ; [*09CB.0020.0002] # BLACK CROSS ON SHIELD -26E9 ; [*09CC.0020.0002] # SHINTO SHRINE -26EA ; [*09CD.0020.0002] # CHURCH -26EB ; [*09CE.0020.0002] # CASTLE -26EC ; [*09CF.0020.0002] # HISTORIC SITE -26ED ; [*09D0.0020.0002] # GEAR WITHOUT HUB -26EE ; [*09D1.0020.0002] # GEAR WITH HANDLES -26EF ; [*09D2.0020.0002] # MAP SYMBOL FOR LIGHTHOUSE -26F0 ; [*09D3.0020.0002] # MOUNTAIN -26F1 ; [*09D4.0020.0002] # UMBRELLA ON GROUND -26F2 ; [*09D5.0020.0002] # FOUNTAIN -26F3 ; [*09D6.0020.0002] # FLAG IN HOLE -26F4 ; [*09D7.0020.0002] # FERRY -26F5 ; [*09D8.0020.0002] # SAILBOAT -26F6 ; [*09D9.0020.0002] # SQUARE FOUR CORNERS -26F7 ; [*09DA.0020.0002] # SKIER -26F8 ; [*09DB.0020.0002] # ICE SKATE -26F9 ; [*09DC.0020.0002] # PERSON WITH BALL -26FA ; [*09DD.0020.0002] # TENT -26FB ; [*09DE.0020.0002] # JAPANESE BANK SYMBOL -26FC ; [*09DF.0020.0002] # HEADSTONE GRAVEYARD SYMBOL -26FD ; [*09E0.0020.0002] # FUEL PUMP -26FE ; [*09E1.0020.0002] # CUP ON BLACK SQUARE -26FF ; [*09E2.0020.0002] # WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE -2700 ; [*09FD.0020.0002] # BLACK SAFETY SCISSORS -2701 ; [*09FE.0020.0002] # UPPER BLADE SCISSORS -2702 ; [*09FF.0020.0002] # BLACK SCISSORS -2703 ; [*0A00.0020.0002] # LOWER BLADE SCISSORS -2704 ; [*0A01.0020.0002] # WHITE SCISSORS -2705 ; [*0A02.0020.0002] # WHITE HEAVY CHECK MARK -2706 ; [*0A03.0020.0002] # TELEPHONE LOCATION SIGN -2707 ; [*0A04.0020.0002] # TAPE DRIVE -2708 ; [*0A05.0020.0002] # AIRPLANE -2709 ; [*0A06.0020.0002] # ENVELOPE -270A ; [*0A07.0020.0002] # RAISED FIST -270B ; [*0A08.0020.0002] # RAISED HAND -270C ; [*0A09.0020.0002] # VICTORY HAND -270D ; [*0A0A.0020.0002] # WRITING HAND -270E ; [*0A0B.0020.0002] # LOWER RIGHT PENCIL -270F ; [*0A0C.0020.0002] # PENCIL -2710 ; [*0A0D.0020.0002] # UPPER RIGHT PENCIL -2711 ; [*0A0E.0020.0002] # WHITE NIB -2712 ; [*0A0F.0020.0002] # BLACK NIB -2713 ; [*0A10.0020.0002] # CHECK MARK -2714 ; [*0A11.0020.0002] # HEAVY CHECK MARK -2715 ; [*0A12.0020.0002] # MULTIPLICATION X -2716 ; [*0A13.0020.0002] # HEAVY MULTIPLICATION X -2717 ; [*0A14.0020.0002] # BALLOT X -2718 ; [*0A15.0020.0002] # HEAVY BALLOT X -2719 ; [*0A16.0020.0002] # OUTLINED GREEK CROSS -271A ; [*0A17.0020.0002] # HEAVY GREEK CROSS -271B ; [*0A18.0020.0002] # OPEN CENTRE CROSS -271C ; [*0A19.0020.0002] # HEAVY OPEN CENTRE CROSS -271D ; [*0A1A.0020.0002] # LATIN CROSS -271E ; [*0A1B.0020.0002] # SHADOWED WHITE LATIN CROSS -271F ; [*0A1C.0020.0002] # OUTLINED LATIN CROSS -2720 ; [*0A1D.0020.0002] # MALTESE CROSS -2721 ; [*0A1E.0020.0002] # STAR OF DAVID -2722 ; [*0A1F.0020.0002] # FOUR TEARDROP-SPOKED ASTERISK -2723 ; [*0A20.0020.0002] # FOUR BALLOON-SPOKED ASTERISK -2724 ; [*0A21.0020.0002] # HEAVY FOUR BALLOON-SPOKED ASTERISK -2725 ; [*0A22.0020.0002] # FOUR CLUB-SPOKED ASTERISK -2726 ; [*0A23.0020.0002] # BLACK FOUR POINTED STAR -2727 ; [*0A24.0020.0002] # WHITE FOUR POINTED STAR -2728 ; [*0A25.0020.0002] # SPARKLES -2729 ; [*0A26.0020.0002] # STRESS OUTLINED WHITE STAR -272A ; [*0A27.0020.0002] # CIRCLED WHITE STAR -272B ; [*0A28.0020.0002] # OPEN CENTRE BLACK STAR -272C ; [*0A29.0020.0002] # BLACK CENTRE WHITE STAR -272D ; [*0A2A.0020.0002] # OUTLINED BLACK STAR -272E ; [*0A2B.0020.0002] # HEAVY OUTLINED BLACK STAR -272F ; [*0A2C.0020.0002] # PINWHEEL STAR -2730 ; [*0A2D.0020.0002] # SHADOWED WHITE STAR -2731 ; [*0A2E.0020.0002] # HEAVY ASTERISK -2732 ; [*0A2F.0020.0002] # OPEN CENTRE ASTERISK -2733 ; [*0A30.0020.0002] # EIGHT SPOKED ASTERISK -2734 ; [*0A31.0020.0002] # EIGHT POINTED BLACK STAR -2735 ; [*0A32.0020.0002] # EIGHT POINTED PINWHEEL STAR -2736 ; [*0A33.0020.0002] # SIX POINTED BLACK STAR -2737 ; [*0A34.0020.0002] # EIGHT POINTED RECTILINEAR BLACK STAR -2738 ; [*0A35.0020.0002] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR -2739 ; [*0A36.0020.0002] # TWELVE POINTED BLACK STAR -273A ; [*0A37.0020.0002] # SIXTEEN POINTED ASTERISK -273B ; [*0A38.0020.0002] # TEARDROP-SPOKED ASTERISK -273C ; [*0A39.0020.0002] # OPEN CENTRE TEARDROP-SPOKED ASTERISK -273D ; [*0A3A.0020.0002] # HEAVY TEARDROP-SPOKED ASTERISK -273E ; [*0A3B.0020.0002] # SIX PETALLED BLACK AND WHITE FLORETTE -273F ; [*0A3C.0020.0002] # BLACK FLORETTE -2740 ; [*0A3D.0020.0002] # WHITE FLORETTE -2741 ; [*0A3E.0020.0002] # EIGHT PETALLED OUTLINED BLACK FLORETTE -2742 ; [*0A3F.0020.0002] # CIRCLED OPEN CENTRE EIGHT POINTED STAR -2743 ; [*0A40.0020.0002] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK -2744 ; [*0A41.0020.0002] # SNOWFLAKE -2745 ; [*0A42.0020.0002] # TIGHT TRIFOLIATE SNOWFLAKE -2746 ; [*0A43.0020.0002] # HEAVY CHEVRON SNOWFLAKE -2747 ; [*0A44.0020.0002] # SPARKLE -2748 ; [*0A45.0020.0002] # HEAVY SPARKLE -2749 ; [*0A46.0020.0002] # BALLOON-SPOKED ASTERISK -274A ; [*0A47.0020.0002] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274B ; [*0A48.0020.0002] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274C ; [*0A49.0020.0002] # CROSS MARK -274D ; [*0A4A.0020.0002] # SHADOWED WHITE CIRCLE -274E ; [*0A4B.0020.0002] # NEGATIVE SQUARED CROSS MARK -274F ; [*0A4C.0020.0002] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE -2750 ; [*0A4D.0020.0002] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE -2751 ; [*0A4E.0020.0002] # LOWER RIGHT SHADOWED WHITE SQUARE -2752 ; [*0A4F.0020.0002] # UPPER RIGHT SHADOWED WHITE SQUARE -2753 ; [*0A50.0020.0002] # BLACK QUESTION MARK ORNAMENT -2754 ; [*0A51.0020.0002] # WHITE QUESTION MARK ORNAMENT -2755 ; [*0A52.0020.0002] # WHITE EXCLAMATION MARK ORNAMENT -2756 ; [*0A53.0020.0002] # BLACK DIAMOND MINUS WHITE X -2757 ; [*0A54.0020.0002] # HEAVY EXCLAMATION MARK SYMBOL -2758 ; [*0A55.0020.0002] # LIGHT VERTICAL BAR -2759 ; [*0A56.0020.0002] # MEDIUM VERTICAL BAR -275A ; [*0A57.0020.0002] # HEAVY VERTICAL BAR -275B ; [*0A58.0020.0002] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT -275C ; [*0A59.0020.0002] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT -275D ; [*0A5A.0020.0002] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT -275E ; [*0A5B.0020.0002] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -275F ; [*0A5C.0020.0002] # HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT -2760 ; [*0A5D.0020.0002] # HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT -2761 ; [*0A5E.0020.0002] # CURVED STEM PARAGRAPH SIGN ORNAMENT -2762 ; [*0A5F.0020.0002] # HEAVY EXCLAMATION MARK ORNAMENT -2763 ; [*0A60.0020.0002] # HEAVY HEART EXCLAMATION MARK ORNAMENT -2764 ; [*0A61.0020.0002] # HEAVY BLACK HEART -2765 ; [*0A62.0020.0002] # ROTATED HEAVY BLACK HEART BULLET -2766 ; [*0A63.0020.0002] # FLORAL HEART -2767 ; [*0A64.0020.0002] # ROTATED FLORAL HEART BULLET -2768 ; [*0346.0020.0002] # MEDIUM LEFT PARENTHESIS ORNAMENT -2769 ; [*0347.0020.0002] # MEDIUM RIGHT PARENTHESIS ORNAMENT -276A ; [*0348.0020.0002] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276B ; [*0349.0020.0002] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276C ; [*034A.0020.0002] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276D ; [*034B.0020.0002] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276E ; [*034C.0020.0002] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -276F ; [*034D.0020.0002] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770 ; [*034E.0020.0002] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2771 ; [*034F.0020.0002] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2772 ; [*0350.0020.0002] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -2773 ; [*0351.0020.0002] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -2774 ; [*0352.0020.0002] # MEDIUM LEFT CURLY BRACKET ORNAMENT -2775 ; [*0353.0020.0002] # MEDIUM RIGHT CURLY BRACKET ORNAMENT -2794 ; [*0A65.0020.0002] # HEAVY WIDE-HEADED RIGHTWARDS ARROW -2795 ; [*0A66.0020.0002] # HEAVY PLUS SIGN -2796 ; [*0A67.0020.0002] # HEAVY MINUS SIGN -2797 ; [*0A68.0020.0002] # HEAVY DIVISION SIGN -2798 ; [*0A69.0020.0002] # HEAVY SOUTH EAST ARROW -2799 ; [*0A6A.0020.0002] # HEAVY RIGHTWARDS ARROW -279A ; [*0A6B.0020.0002] # HEAVY NORTH EAST ARROW -279B ; [*0A6C.0020.0002] # DRAFTING POINT RIGHTWARDS ARROW -279C ; [*0A6D.0020.0002] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW -279D ; [*0A6E.0020.0002] # TRIANGLE-HEADED RIGHTWARDS ARROW -279E ; [*0A6F.0020.0002] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW -279F ; [*0A70.0020.0002] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW -27A0 ; [*0A71.0020.0002] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW -27A1 ; [*0A72.0020.0002] # BLACK RIGHTWARDS ARROW -27A2 ; [*0A73.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD -27A3 ; [*0A74.0020.0002] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD -27A4 ; [*0A75.0020.0002] # BLACK RIGHTWARDS ARROWHEAD -27A5 ; [*0A76.0020.0002] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW -27A6 ; [*0A77.0020.0002] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW -27A7 ; [*0A78.0020.0002] # SQUAT BLACK RIGHTWARDS ARROW -27A8 ; [*0A79.0020.0002] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW -27A9 ; [*0A7A.0020.0002] # RIGHT-SHADED WHITE RIGHTWARDS ARROW -27AA ; [*0A7B.0020.0002] # LEFT-SHADED WHITE RIGHTWARDS ARROW -27AB ; [*0A7C.0020.0002] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW -27AC ; [*0A7D.0020.0002] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW -27AD ; [*0A7E.0020.0002] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27AE ; [*0A7F.0020.0002] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27AF ; [*0A80.0020.0002] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B0 ; [*0A81.0020.0002] # CURLY LOOP -27B1 ; [*0A82.0020.0002] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B2 ; [*0A83.0020.0002] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW -27B3 ; [*0A84.0020.0002] # WHITE-FEATHERED RIGHTWARDS ARROW -27B4 ; [*0A85.0020.0002] # BLACK-FEATHERED SOUTH EAST ARROW -27B5 ; [*0A86.0020.0002] # BLACK-FEATHERED RIGHTWARDS ARROW -27B6 ; [*0A87.0020.0002] # BLACK-FEATHERED NORTH EAST ARROW -27B7 ; [*0A88.0020.0002] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW -27B8 ; [*0A89.0020.0002] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW -27B9 ; [*0A8A.0020.0002] # HEAVY BLACK-FEATHERED NORTH EAST ARROW -27BA ; [*0A8B.0020.0002] # TEARDROP-BARBED RIGHTWARDS ARROW -27BB ; [*0A8C.0020.0002] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW -27BC ; [*0A8D.0020.0002] # WEDGE-TAILED RIGHTWARDS ARROW -27BD ; [*0A8E.0020.0002] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW -27BE ; [*0A8F.0020.0002] # OPEN-OUTLINED RIGHTWARDS ARROW -27BF ; [*0A90.0020.0002] # DOUBLE CURLY LOOP -27C0 ; [*0A91.0020.0002] # THREE DIMENSIONAL ANGLE -27C1 ; [*0A92.0020.0002] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE -27C2 ; [*0A93.0020.0002] # PERPENDICULAR -27C3 ; [*0A94.0020.0002] # OPEN SUBSET -27C4 ; [*0A95.0020.0002] # OPEN SUPERSET -27C5 ; [*033A.0020.0002] # LEFT S-SHAPED BAG DELIMITER -27C6 ; [*033B.0020.0002] # RIGHT S-SHAPED BAG DELIMITER -27C7 ; [*0A96.0020.0002] # OR WITH DOT INSIDE -27C8 ; [*0A97.0020.0002] # REVERSE SOLIDUS PRECEDING SUBSET -27C9 ; [*0A98.0020.0002] # SUPERSET PRECEDING SOLIDUS -27CA ; [*0A99.0020.0002] # VERTICAL BAR WITH HORIZONTAL STROKE -27CB ; [*0A9A.0020.0002] # MATHEMATICAL RISING DIAGONAL -27CC ; [*0A9B.0020.0002] # LONG DIVISION -27CD ; [*0A9C.0020.0002] # MATHEMATICAL FALLING DIAGONAL -27CE ; [*0A9D.0020.0002] # SQUARED LOGICAL AND -27CF ; [*0A9E.0020.0002] # SQUARED LOGICAL OR -27D0 ; [*0A9F.0020.0002] # WHITE DIAMOND WITH CENTRED DOT -27D1 ; [*0AA0.0020.0002] # AND WITH DOT -27D2 ; [*0AA1.0020.0002] # ELEMENT OF OPENING UPWARDS -27D3 ; [*0AA2.0020.0002] # LOWER RIGHT CORNER WITH DOT -27D4 ; [*0AA3.0020.0002] # UPPER LEFT CORNER WITH DOT -27D5 ; [*0AA4.0020.0002] # LEFT OUTER JOIN -27D6 ; [*0AA5.0020.0002] # RIGHT OUTER JOIN -27D7 ; [*0AA6.0020.0002] # FULL OUTER JOIN -27D8 ; [*0AA7.0020.0002] # LARGE UP TACK -27D9 ; [*0AA8.0020.0002] # LARGE DOWN TACK -27DA ; [*0AA9.0020.0002] # LEFT AND RIGHT DOUBLE TURNSTILE -27DB ; [*0AAA.0020.0002] # LEFT AND RIGHT TACK -27DC ; [*0AAB.0020.0002] # LEFT MULTIMAP -27DD ; [*0AAC.0020.0002] # LONG RIGHT TACK -27DE ; [*0AAD.0020.0002] # LONG LEFT TACK -27DF ; [*0AAE.0020.0002] # UP TACK WITH CIRCLE ABOVE -27E0 ; [*0AAF.0020.0002] # LOZENGE DIVIDED BY HORIZONTAL RULE -27E1 ; [*0AB0.0020.0002] # WHITE CONCAVE-SIDED DIAMOND -27E2 ; [*0AB1.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK -27E3 ; [*0AB2.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK -27E4 ; [*0AB3.0020.0002] # WHITE SQUARE WITH LEFTWARDS TICK -27E5 ; [*0AB4.0020.0002] # WHITE SQUARE WITH RIGHTWARDS TICK -27E6 ; [*033C.0020.0002] # MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E7 ; [*033D.0020.0002] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E8 ; [*033E.0020.0002] # MATHEMATICAL LEFT ANGLE BRACKET -27E9 ; [*033F.0020.0002] # MATHEMATICAL RIGHT ANGLE BRACKET -27EA ; [*0340.0020.0002] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EB ; [*0341.0020.0002] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27EC ; [*0342.0020.0002] # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -27ED ; [*0343.0020.0002] # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -27EE ; [*0344.0020.0002] # MATHEMATICAL LEFT FLATTENED PARENTHESIS -27EF ; [*0345.0020.0002] # MATHEMATICAL RIGHT FLATTENED PARENTHESIS -27F0 ; [*0AB5.0020.0002] # UPWARDS QUADRUPLE ARROW -27F1 ; [*0AB6.0020.0002] # DOWNWARDS QUADRUPLE ARROW -27F2 ; [*0AB7.0020.0002] # ANTICLOCKWISE GAPPED CIRCLE ARROW -27F3 ; [*0AB8.0020.0002] # CLOCKWISE GAPPED CIRCLE ARROW -27F4 ; [*0AB9.0020.0002] # RIGHT ARROW WITH CIRCLED PLUS -27F5 ; [*0ABA.0020.0002] # LONG LEFTWARDS ARROW -27F6 ; [*0ABB.0020.0002] # LONG RIGHTWARDS ARROW -27F7 ; [*0ABC.0020.0002] # LONG LEFT RIGHT ARROW -27F8 ; [*0ABD.0020.0002] # LONG LEFTWARDS DOUBLE ARROW -27F9 ; [*0ABE.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW -27FA ; [*0ABF.0020.0002] # LONG LEFT RIGHT DOUBLE ARROW -27FB ; [*0AC0.0020.0002] # LONG LEFTWARDS ARROW FROM BAR -27FC ; [*0AC1.0020.0002] # LONG RIGHTWARDS ARROW FROM BAR -27FD ; [*0AC2.0020.0002] # LONG LEFTWARDS DOUBLE ARROW FROM BAR -27FE ; [*0AC3.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR -27FF ; [*0AC4.0020.0002] # LONG RIGHTWARDS SQUIGGLE ARROW -2800 ; [*0D78.0020.0002] # BRAILLE PATTERN BLANK -2801 ; [*0D79.0020.0002] # BRAILLE PATTERN DOTS-1 -2802 ; [*0D7A.0020.0002] # BRAILLE PATTERN DOTS-2 -2803 ; [*0D7B.0020.0002] # BRAILLE PATTERN DOTS-12 -2804 ; [*0D7C.0020.0002] # BRAILLE PATTERN DOTS-3 -2805 ; [*0D7D.0020.0002] # BRAILLE PATTERN DOTS-13 -2806 ; [*0D7E.0020.0002] # BRAILLE PATTERN DOTS-23 -2807 ; [*0D7F.0020.0002] # BRAILLE PATTERN DOTS-123 -2808 ; [*0D80.0020.0002] # BRAILLE PATTERN DOTS-4 -2809 ; [*0D81.0020.0002] # BRAILLE PATTERN DOTS-14 -280A ; [*0D82.0020.0002] # BRAILLE PATTERN DOTS-24 -280B ; [*0D83.0020.0002] # BRAILLE PATTERN DOTS-124 -280C ; [*0D84.0020.0002] # BRAILLE PATTERN DOTS-34 -280D ; [*0D85.0020.0002] # BRAILLE PATTERN DOTS-134 -280E ; [*0D86.0020.0002] # BRAILLE PATTERN DOTS-234 -280F ; [*0D87.0020.0002] # BRAILLE PATTERN DOTS-1234 -2810 ; [*0D88.0020.0002] # BRAILLE PATTERN DOTS-5 -2811 ; [*0D89.0020.0002] # BRAILLE PATTERN DOTS-15 -2812 ; [*0D8A.0020.0002] # BRAILLE PATTERN DOTS-25 -2813 ; [*0D8B.0020.0002] # BRAILLE PATTERN DOTS-125 -2814 ; [*0D8C.0020.0002] # BRAILLE PATTERN DOTS-35 -2815 ; [*0D8D.0020.0002] # BRAILLE PATTERN DOTS-135 -2816 ; [*0D8E.0020.0002] # BRAILLE PATTERN DOTS-235 -2817 ; [*0D8F.0020.0002] # BRAILLE PATTERN DOTS-1235 -2818 ; [*0D90.0020.0002] # BRAILLE PATTERN DOTS-45 -2819 ; [*0D91.0020.0002] # BRAILLE PATTERN DOTS-145 -281A ; [*0D92.0020.0002] # BRAILLE PATTERN DOTS-245 -281B ; [*0D93.0020.0002] # BRAILLE PATTERN DOTS-1245 -281C ; [*0D94.0020.0002] # BRAILLE PATTERN DOTS-345 -281D ; [*0D95.0020.0002] # BRAILLE PATTERN DOTS-1345 -281E ; [*0D96.0020.0002] # BRAILLE PATTERN DOTS-2345 -281F ; [*0D97.0020.0002] # BRAILLE PATTERN DOTS-12345 -2820 ; [*0D98.0020.0002] # BRAILLE PATTERN DOTS-6 -2821 ; [*0D99.0020.0002] # BRAILLE PATTERN DOTS-16 -2822 ; [*0D9A.0020.0002] # BRAILLE PATTERN DOTS-26 -2823 ; [*0D9B.0020.0002] # BRAILLE PATTERN DOTS-126 -2824 ; [*0D9C.0020.0002] # BRAILLE PATTERN DOTS-36 -2825 ; [*0D9D.0020.0002] # BRAILLE PATTERN DOTS-136 -2826 ; [*0D9E.0020.0002] # BRAILLE PATTERN DOTS-236 -2827 ; [*0D9F.0020.0002] # BRAILLE PATTERN DOTS-1236 -2828 ; [*0DA0.0020.0002] # BRAILLE PATTERN DOTS-46 -2829 ; [*0DA1.0020.0002] # BRAILLE PATTERN DOTS-146 -282A ; [*0DA2.0020.0002] # BRAILLE PATTERN DOTS-246 -282B ; [*0DA3.0020.0002] # BRAILLE PATTERN DOTS-1246 -282C ; [*0DA4.0020.0002] # BRAILLE PATTERN DOTS-346 -282D ; [*0DA5.0020.0002] # BRAILLE PATTERN DOTS-1346 -282E ; [*0DA6.0020.0002] # BRAILLE PATTERN DOTS-2346 -282F ; [*0DA7.0020.0002] # BRAILLE PATTERN DOTS-12346 -2830 ; [*0DA8.0020.0002] # BRAILLE PATTERN DOTS-56 -2831 ; [*0DA9.0020.0002] # BRAILLE PATTERN DOTS-156 -2832 ; [*0DAA.0020.0002] # BRAILLE PATTERN DOTS-256 -2833 ; [*0DAB.0020.0002] # BRAILLE PATTERN DOTS-1256 -2834 ; [*0DAC.0020.0002] # BRAILLE PATTERN DOTS-356 -2835 ; [*0DAD.0020.0002] # BRAILLE PATTERN DOTS-1356 -2836 ; [*0DAE.0020.0002] # BRAILLE PATTERN DOTS-2356 -2837 ; [*0DAF.0020.0002] # BRAILLE PATTERN DOTS-12356 -2838 ; [*0DB0.0020.0002] # BRAILLE PATTERN DOTS-456 -2839 ; [*0DB1.0020.0002] # BRAILLE PATTERN DOTS-1456 -283A ; [*0DB2.0020.0002] # BRAILLE PATTERN DOTS-2456 -283B ; [*0DB3.0020.0002] # BRAILLE PATTERN DOTS-12456 -283C ; [*0DB4.0020.0002] # BRAILLE PATTERN DOTS-3456 -283D ; [*0DB5.0020.0002] # BRAILLE PATTERN DOTS-13456 -283E ; [*0DB6.0020.0002] # BRAILLE PATTERN DOTS-23456 -283F ; [*0DB7.0020.0002] # BRAILLE PATTERN DOTS-123456 -2840 ; [*0DB8.0020.0002] # BRAILLE PATTERN DOTS-7 -2841 ; [*0DB9.0020.0002] # BRAILLE PATTERN DOTS-17 -2842 ; [*0DBA.0020.0002] # BRAILLE PATTERN DOTS-27 -2843 ; [*0DBB.0020.0002] # BRAILLE PATTERN DOTS-127 -2844 ; [*0DBC.0020.0002] # BRAILLE PATTERN DOTS-37 -2845 ; [*0DBD.0020.0002] # BRAILLE PATTERN DOTS-137 -2846 ; [*0DBE.0020.0002] # BRAILLE PATTERN DOTS-237 -2847 ; [*0DBF.0020.0002] # BRAILLE PATTERN DOTS-1237 -2848 ; [*0DC0.0020.0002] # BRAILLE PATTERN DOTS-47 -2849 ; [*0DC1.0020.0002] # BRAILLE PATTERN DOTS-147 -284A ; [*0DC2.0020.0002] # BRAILLE PATTERN DOTS-247 -284B ; [*0DC3.0020.0002] # BRAILLE PATTERN DOTS-1247 -284C ; [*0DC4.0020.0002] # BRAILLE PATTERN DOTS-347 -284D ; [*0DC5.0020.0002] # BRAILLE PATTERN DOTS-1347 -284E ; [*0DC6.0020.0002] # BRAILLE PATTERN DOTS-2347 -284F ; [*0DC7.0020.0002] # BRAILLE PATTERN DOTS-12347 -2850 ; [*0DC8.0020.0002] # BRAILLE PATTERN DOTS-57 -2851 ; [*0DC9.0020.0002] # BRAILLE PATTERN DOTS-157 -2852 ; [*0DCA.0020.0002] # BRAILLE PATTERN DOTS-257 -2853 ; [*0DCB.0020.0002] # BRAILLE PATTERN DOTS-1257 -2854 ; [*0DCC.0020.0002] # BRAILLE PATTERN DOTS-357 -2855 ; [*0DCD.0020.0002] # BRAILLE PATTERN DOTS-1357 -2856 ; [*0DCE.0020.0002] # BRAILLE PATTERN DOTS-2357 -2857 ; [*0DCF.0020.0002] # BRAILLE PATTERN DOTS-12357 -2858 ; [*0DD0.0020.0002] # BRAILLE PATTERN DOTS-457 -2859 ; [*0DD1.0020.0002] # BRAILLE PATTERN DOTS-1457 -285A ; [*0DD2.0020.0002] # BRAILLE PATTERN DOTS-2457 -285B ; [*0DD3.0020.0002] # BRAILLE PATTERN DOTS-12457 -285C ; [*0DD4.0020.0002] # BRAILLE PATTERN DOTS-3457 -285D ; [*0DD5.0020.0002] # BRAILLE PATTERN DOTS-13457 -285E ; [*0DD6.0020.0002] # BRAILLE PATTERN DOTS-23457 -285F ; [*0DD7.0020.0002] # BRAILLE PATTERN DOTS-123457 -2860 ; [*0DD8.0020.0002] # BRAILLE PATTERN DOTS-67 -2861 ; [*0DD9.0020.0002] # BRAILLE PATTERN DOTS-167 -2862 ; [*0DDA.0020.0002] # BRAILLE PATTERN DOTS-267 -2863 ; [*0DDB.0020.0002] # BRAILLE PATTERN DOTS-1267 -2864 ; [*0DDC.0020.0002] # BRAILLE PATTERN DOTS-367 -2865 ; [*0DDD.0020.0002] # BRAILLE PATTERN DOTS-1367 -2866 ; [*0DDE.0020.0002] # BRAILLE PATTERN DOTS-2367 -2867 ; [*0DDF.0020.0002] # BRAILLE PATTERN DOTS-12367 -2868 ; [*0DE0.0020.0002] # BRAILLE PATTERN DOTS-467 -2869 ; [*0DE1.0020.0002] # BRAILLE PATTERN DOTS-1467 -286A ; [*0DE2.0020.0002] # BRAILLE PATTERN DOTS-2467 -286B ; [*0DE3.0020.0002] # BRAILLE PATTERN DOTS-12467 -286C ; [*0DE4.0020.0002] # BRAILLE PATTERN DOTS-3467 -286D ; [*0DE5.0020.0002] # BRAILLE PATTERN DOTS-13467 -286E ; [*0DE6.0020.0002] # BRAILLE PATTERN DOTS-23467 -286F ; [*0DE7.0020.0002] # BRAILLE PATTERN DOTS-123467 -2870 ; [*0DE8.0020.0002] # BRAILLE PATTERN DOTS-567 -2871 ; [*0DE9.0020.0002] # BRAILLE PATTERN DOTS-1567 -2872 ; [*0DEA.0020.0002] # BRAILLE PATTERN DOTS-2567 -2873 ; [*0DEB.0020.0002] # BRAILLE PATTERN DOTS-12567 -2874 ; [*0DEC.0020.0002] # BRAILLE PATTERN DOTS-3567 -2875 ; [*0DED.0020.0002] # BRAILLE PATTERN DOTS-13567 -2876 ; [*0DEE.0020.0002] # BRAILLE PATTERN DOTS-23567 -2877 ; [*0DEF.0020.0002] # BRAILLE PATTERN DOTS-123567 -2878 ; [*0DF0.0020.0002] # BRAILLE PATTERN DOTS-4567 -2879 ; [*0DF1.0020.0002] # BRAILLE PATTERN DOTS-14567 -287A ; [*0DF2.0020.0002] # BRAILLE PATTERN DOTS-24567 -287B ; [*0DF3.0020.0002] # BRAILLE PATTERN DOTS-124567 -287C ; [*0DF4.0020.0002] # BRAILLE PATTERN DOTS-34567 -287D ; [*0DF5.0020.0002] # BRAILLE PATTERN DOTS-134567 -287E ; [*0DF6.0020.0002] # BRAILLE PATTERN DOTS-234567 -287F ; [*0DF7.0020.0002] # BRAILLE PATTERN DOTS-1234567 -2880 ; [*0DF8.0020.0002] # BRAILLE PATTERN DOTS-8 -2881 ; [*0DF9.0020.0002] # BRAILLE PATTERN DOTS-18 -2882 ; [*0DFA.0020.0002] # BRAILLE PATTERN DOTS-28 -2883 ; [*0DFB.0020.0002] # BRAILLE PATTERN DOTS-128 -2884 ; [*0DFC.0020.0002] # BRAILLE PATTERN DOTS-38 -2885 ; [*0DFD.0020.0002] # BRAILLE PATTERN DOTS-138 -2886 ; [*0DFE.0020.0002] # BRAILLE PATTERN DOTS-238 -2887 ; [*0DFF.0020.0002] # BRAILLE PATTERN DOTS-1238 -2888 ; [*0E00.0020.0002] # BRAILLE PATTERN DOTS-48 -2889 ; [*0E01.0020.0002] # BRAILLE PATTERN DOTS-148 -288A ; [*0E02.0020.0002] # BRAILLE PATTERN DOTS-248 -288B ; [*0E03.0020.0002] # BRAILLE PATTERN DOTS-1248 -288C ; [*0E04.0020.0002] # BRAILLE PATTERN DOTS-348 -288D ; [*0E05.0020.0002] # BRAILLE PATTERN DOTS-1348 -288E ; [*0E06.0020.0002] # BRAILLE PATTERN DOTS-2348 -288F ; [*0E07.0020.0002] # BRAILLE PATTERN DOTS-12348 -2890 ; [*0E08.0020.0002] # BRAILLE PATTERN DOTS-58 -2891 ; [*0E09.0020.0002] # BRAILLE PATTERN DOTS-158 -2892 ; [*0E0A.0020.0002] # BRAILLE PATTERN DOTS-258 -2893 ; [*0E0B.0020.0002] # BRAILLE PATTERN DOTS-1258 -2894 ; [*0E0C.0020.0002] # BRAILLE PATTERN DOTS-358 -2895 ; [*0E0D.0020.0002] # BRAILLE PATTERN DOTS-1358 -2896 ; [*0E0E.0020.0002] # BRAILLE PATTERN DOTS-2358 -2897 ; [*0E0F.0020.0002] # BRAILLE PATTERN DOTS-12358 -2898 ; [*0E10.0020.0002] # BRAILLE PATTERN DOTS-458 -2899 ; [*0E11.0020.0002] # BRAILLE PATTERN DOTS-1458 -289A ; [*0E12.0020.0002] # BRAILLE PATTERN DOTS-2458 -289B ; [*0E13.0020.0002] # BRAILLE PATTERN DOTS-12458 -289C ; [*0E14.0020.0002] # BRAILLE PATTERN DOTS-3458 -289D ; [*0E15.0020.0002] # BRAILLE PATTERN DOTS-13458 -289E ; [*0E16.0020.0002] # BRAILLE PATTERN DOTS-23458 -289F ; [*0E17.0020.0002] # BRAILLE PATTERN DOTS-123458 -28A0 ; [*0E18.0020.0002] # BRAILLE PATTERN DOTS-68 -28A1 ; [*0E19.0020.0002] # BRAILLE PATTERN DOTS-168 -28A2 ; [*0E1A.0020.0002] # BRAILLE PATTERN DOTS-268 -28A3 ; [*0E1B.0020.0002] # BRAILLE PATTERN DOTS-1268 -28A4 ; [*0E1C.0020.0002] # BRAILLE PATTERN DOTS-368 -28A5 ; [*0E1D.0020.0002] # BRAILLE PATTERN DOTS-1368 -28A6 ; [*0E1E.0020.0002] # BRAILLE PATTERN DOTS-2368 -28A7 ; [*0E1F.0020.0002] # BRAILLE PATTERN DOTS-12368 -28A8 ; [*0E20.0020.0002] # BRAILLE PATTERN DOTS-468 -28A9 ; [*0E21.0020.0002] # BRAILLE PATTERN DOTS-1468 -28AA ; [*0E22.0020.0002] # BRAILLE PATTERN DOTS-2468 -28AB ; [*0E23.0020.0002] # BRAILLE PATTERN DOTS-12468 -28AC ; [*0E24.0020.0002] # BRAILLE PATTERN DOTS-3468 -28AD ; [*0E25.0020.0002] # BRAILLE PATTERN DOTS-13468 -28AE ; [*0E26.0020.0002] # BRAILLE PATTERN DOTS-23468 -28AF ; [*0E27.0020.0002] # BRAILLE PATTERN DOTS-123468 -28B0 ; [*0E28.0020.0002] # BRAILLE PATTERN DOTS-568 -28B1 ; [*0E29.0020.0002] # BRAILLE PATTERN DOTS-1568 -28B2 ; [*0E2A.0020.0002] # BRAILLE PATTERN DOTS-2568 -28B3 ; [*0E2B.0020.0002] # BRAILLE PATTERN DOTS-12568 -28B4 ; [*0E2C.0020.0002] # BRAILLE PATTERN DOTS-3568 -28B5 ; [*0E2D.0020.0002] # BRAILLE PATTERN DOTS-13568 -28B6 ; [*0E2E.0020.0002] # BRAILLE PATTERN DOTS-23568 -28B7 ; [*0E2F.0020.0002] # BRAILLE PATTERN DOTS-123568 -28B8 ; [*0E30.0020.0002] # BRAILLE PATTERN DOTS-4568 -28B9 ; [*0E31.0020.0002] # BRAILLE PATTERN DOTS-14568 -28BA ; [*0E32.0020.0002] # BRAILLE PATTERN DOTS-24568 -28BB ; [*0E33.0020.0002] # BRAILLE PATTERN DOTS-124568 -28BC ; [*0E34.0020.0002] # BRAILLE PATTERN DOTS-34568 -28BD ; [*0E35.0020.0002] # BRAILLE PATTERN DOTS-134568 -28BE ; [*0E36.0020.0002] # BRAILLE PATTERN DOTS-234568 -28BF ; [*0E37.0020.0002] # BRAILLE PATTERN DOTS-1234568 -28C0 ; [*0E38.0020.0002] # BRAILLE PATTERN DOTS-78 -28C1 ; [*0E39.0020.0002] # BRAILLE PATTERN DOTS-178 -28C2 ; [*0E3A.0020.0002] # BRAILLE PATTERN DOTS-278 -28C3 ; [*0E3B.0020.0002] # BRAILLE PATTERN DOTS-1278 -28C4 ; [*0E3C.0020.0002] # BRAILLE PATTERN DOTS-378 -28C5 ; [*0E3D.0020.0002] # BRAILLE PATTERN DOTS-1378 -28C6 ; [*0E3E.0020.0002] # BRAILLE PATTERN DOTS-2378 -28C7 ; [*0E3F.0020.0002] # BRAILLE PATTERN DOTS-12378 -28C8 ; [*0E40.0020.0002] # BRAILLE PATTERN DOTS-478 -28C9 ; [*0E41.0020.0002] # BRAILLE PATTERN DOTS-1478 -28CA ; [*0E42.0020.0002] # BRAILLE PATTERN DOTS-2478 -28CB ; [*0E43.0020.0002] # BRAILLE PATTERN DOTS-12478 -28CC ; [*0E44.0020.0002] # BRAILLE PATTERN DOTS-3478 -28CD ; [*0E45.0020.0002] # BRAILLE PATTERN DOTS-13478 -28CE ; [*0E46.0020.0002] # BRAILLE PATTERN DOTS-23478 -28CF ; [*0E47.0020.0002] # BRAILLE PATTERN DOTS-123478 -28D0 ; [*0E48.0020.0002] # BRAILLE PATTERN DOTS-578 -28D1 ; [*0E49.0020.0002] # BRAILLE PATTERN DOTS-1578 -28D2 ; [*0E4A.0020.0002] # BRAILLE PATTERN DOTS-2578 -28D3 ; [*0E4B.0020.0002] # BRAILLE PATTERN DOTS-12578 -28D4 ; [*0E4C.0020.0002] # BRAILLE PATTERN DOTS-3578 -28D5 ; [*0E4D.0020.0002] # BRAILLE PATTERN DOTS-13578 -28D6 ; [*0E4E.0020.0002] # BRAILLE PATTERN DOTS-23578 -28D7 ; [*0E4F.0020.0002] # BRAILLE PATTERN DOTS-123578 -28D8 ; [*0E50.0020.0002] # BRAILLE PATTERN DOTS-4578 -28D9 ; [*0E51.0020.0002] # BRAILLE PATTERN DOTS-14578 -28DA ; [*0E52.0020.0002] # BRAILLE PATTERN DOTS-24578 -28DB ; [*0E53.0020.0002] # BRAILLE PATTERN DOTS-124578 -28DC ; [*0E54.0020.0002] # BRAILLE PATTERN DOTS-34578 -28DD ; [*0E55.0020.0002] # BRAILLE PATTERN DOTS-134578 -28DE ; [*0E56.0020.0002] # BRAILLE PATTERN DOTS-234578 -28DF ; [*0E57.0020.0002] # BRAILLE PATTERN DOTS-1234578 -28E0 ; [*0E58.0020.0002] # BRAILLE PATTERN DOTS-678 -28E1 ; [*0E59.0020.0002] # BRAILLE PATTERN DOTS-1678 -28E2 ; [*0E5A.0020.0002] # BRAILLE PATTERN DOTS-2678 -28E3 ; [*0E5B.0020.0002] # BRAILLE PATTERN DOTS-12678 -28E4 ; [*0E5C.0020.0002] # BRAILLE PATTERN DOTS-3678 -28E5 ; [*0E5D.0020.0002] # BRAILLE PATTERN DOTS-13678 -28E6 ; [*0E5E.0020.0002] # BRAILLE PATTERN DOTS-23678 -28E7 ; [*0E5F.0020.0002] # BRAILLE PATTERN DOTS-123678 -28E8 ; [*0E60.0020.0002] # BRAILLE PATTERN DOTS-4678 -28E9 ; [*0E61.0020.0002] # BRAILLE PATTERN DOTS-14678 -28EA ; [*0E62.0020.0002] # BRAILLE PATTERN DOTS-24678 -28EB ; [*0E63.0020.0002] # BRAILLE PATTERN DOTS-124678 -28EC ; [*0E64.0020.0002] # BRAILLE PATTERN DOTS-34678 -28ED ; [*0E65.0020.0002] # BRAILLE PATTERN DOTS-134678 -28EE ; [*0E66.0020.0002] # BRAILLE PATTERN DOTS-234678 -28EF ; [*0E67.0020.0002] # BRAILLE PATTERN DOTS-1234678 -28F0 ; [*0E68.0020.0002] # BRAILLE PATTERN DOTS-5678 -28F1 ; [*0E69.0020.0002] # BRAILLE PATTERN DOTS-15678 -28F2 ; [*0E6A.0020.0002] # BRAILLE PATTERN DOTS-25678 -28F3 ; [*0E6B.0020.0002] # BRAILLE PATTERN DOTS-125678 -28F4 ; [*0E6C.0020.0002] # BRAILLE PATTERN DOTS-35678 -28F5 ; [*0E6D.0020.0002] # BRAILLE PATTERN DOTS-135678 -28F6 ; [*0E6E.0020.0002] # BRAILLE PATTERN DOTS-235678 -28F7 ; [*0E6F.0020.0002] # BRAILLE PATTERN DOTS-1235678 -28F8 ; [*0E70.0020.0002] # BRAILLE PATTERN DOTS-45678 -28F9 ; [*0E71.0020.0002] # BRAILLE PATTERN DOTS-145678 -28FA ; [*0E72.0020.0002] # BRAILLE PATTERN DOTS-245678 -28FB ; [*0E73.0020.0002] # BRAILLE PATTERN DOTS-1245678 -28FC ; [*0E74.0020.0002] # BRAILLE PATTERN DOTS-345678 -28FD ; [*0E75.0020.0002] # BRAILLE PATTERN DOTS-1345678 -28FE ; [*0E76.0020.0002] # BRAILLE PATTERN DOTS-2345678 -28FF ; [*0E77.0020.0002] # BRAILLE PATTERN DOTS-12345678 -2900 ; [*0AC5.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE -2901 ; [*0AC6.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE -2902 ; [*0AC7.0020.0002] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE -2903 ; [*0AC8.0020.0002] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE -2904 ; [*0AC9.0020.0002] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE -2905 ; [*0ACA.0020.0002] # RIGHTWARDS TWO-HEADED ARROW FROM BAR -2906 ; [*0ACB.0020.0002] # LEFTWARDS DOUBLE ARROW FROM BAR -2907 ; [*0ACC.0020.0002] # RIGHTWARDS DOUBLE ARROW FROM BAR -2908 ; [*0ACD.0020.0002] # DOWNWARDS ARROW WITH HORIZONTAL STROKE -2909 ; [*0ACE.0020.0002] # UPWARDS ARROW WITH HORIZONTAL STROKE -290A ; [*0ACF.0020.0002] # UPWARDS TRIPLE ARROW -290B ; [*0AD0.0020.0002] # DOWNWARDS TRIPLE ARROW -290C ; [*0AD1.0020.0002] # LEFTWARDS DOUBLE DASH ARROW -290D ; [*0AD2.0020.0002] # RIGHTWARDS DOUBLE DASH ARROW -290E ; [*0AD3.0020.0002] # LEFTWARDS TRIPLE DASH ARROW -290F ; [*0AD4.0020.0002] # RIGHTWARDS TRIPLE DASH ARROW -2910 ; [*0AD5.0020.0002] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW -2911 ; [*0AD6.0020.0002] # RIGHTWARDS ARROW WITH DOTTED STEM -2912 ; [*0AD7.0020.0002] # UPWARDS ARROW TO BAR -2913 ; [*0AD8.0020.0002] # DOWNWARDS ARROW TO BAR -2914 ; [*0AD9.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE -2915 ; [*0ADA.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -2916 ; [*0ADB.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL -2917 ; [*0ADC.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE -2918 ; [*0ADD.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -2919 ; [*0ADE.0020.0002] # LEFTWARDS ARROW-TAIL -291A ; [*0ADF.0020.0002] # RIGHTWARDS ARROW-TAIL -291B ; [*0AE0.0020.0002] # LEFTWARDS DOUBLE ARROW-TAIL -291C ; [*0AE1.0020.0002] # RIGHTWARDS DOUBLE ARROW-TAIL -291D ; [*0AE2.0020.0002] # LEFTWARDS ARROW TO BLACK DIAMOND -291E ; [*0AE3.0020.0002] # RIGHTWARDS ARROW TO BLACK DIAMOND -291F ; [*0AE4.0020.0002] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND -2920 ; [*0AE5.0020.0002] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND -2921 ; [*0AE6.0020.0002] # NORTH WEST AND SOUTH EAST ARROW -2922 ; [*0AE7.0020.0002] # NORTH EAST AND SOUTH WEST ARROW -2923 ; [*0AE8.0020.0002] # NORTH WEST ARROW WITH HOOK -2924 ; [*0AE9.0020.0002] # NORTH EAST ARROW WITH HOOK -2925 ; [*0AEA.0020.0002] # SOUTH EAST ARROW WITH HOOK -2926 ; [*0AEB.0020.0002] # SOUTH WEST ARROW WITH HOOK -2927 ; [*0AEC.0020.0002] # NORTH WEST ARROW AND NORTH EAST ARROW -2928 ; [*0AED.0020.0002] # NORTH EAST ARROW AND SOUTH EAST ARROW -2929 ; [*0AEE.0020.0002] # SOUTH EAST ARROW AND SOUTH WEST ARROW -292A ; [*0AEF.0020.0002] # SOUTH WEST ARROW AND NORTH WEST ARROW -292B ; [*0AF0.0020.0002] # RISING DIAGONAL CROSSING FALLING DIAGONAL -292C ; [*0AF1.0020.0002] # FALLING DIAGONAL CROSSING RISING DIAGONAL -292D ; [*0AF2.0020.0002] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW -292E ; [*0AF3.0020.0002] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW -292F ; [*0AF4.0020.0002] # FALLING DIAGONAL CROSSING NORTH EAST ARROW -2930 ; [*0AF5.0020.0002] # RISING DIAGONAL CROSSING SOUTH EAST ARROW -2931 ; [*0AF6.0020.0002] # NORTH EAST ARROW CROSSING NORTH WEST ARROW -2932 ; [*0AF7.0020.0002] # NORTH WEST ARROW CROSSING NORTH EAST ARROW -2933 ; [*0AF8.0020.0002] # WAVE ARROW POINTING DIRECTLY RIGHT -2934 ; [*0AF9.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS -2935 ; [*0AFA.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS -2936 ; [*0AFB.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS -2937 ; [*0AFC.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS -2938 ; [*0AFD.0020.0002] # RIGHT-SIDE ARC CLOCKWISE ARROW -2939 ; [*0AFE.0020.0002] # LEFT-SIDE ARC ANTICLOCKWISE ARROW -293A ; [*0AFF.0020.0002] # TOP ARC ANTICLOCKWISE ARROW -293B ; [*0B00.0020.0002] # BOTTOM ARC ANTICLOCKWISE ARROW -293C ; [*0B01.0020.0002] # TOP ARC CLOCKWISE ARROW WITH MINUS -293D ; [*0B02.0020.0002] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS -293E ; [*0B03.0020.0002] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW -293F ; [*0B04.0020.0002] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW -2940 ; [*0B05.0020.0002] # ANTICLOCKWISE CLOSED CIRCLE ARROW -2941 ; [*0B06.0020.0002] # CLOCKWISE CLOSED CIRCLE ARROW -2942 ; [*0B07.0020.0002] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW -2943 ; [*0B08.0020.0002] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW -2944 ; [*0B09.0020.0002] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW -2945 ; [*0B0A.0020.0002] # RIGHTWARDS ARROW WITH PLUS BELOW -2946 ; [*0B0B.0020.0002] # LEFTWARDS ARROW WITH PLUS BELOW -2947 ; [*0B0C.0020.0002] # RIGHTWARDS ARROW THROUGH X -2948 ; [*0B0D.0020.0002] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE -2949 ; [*0B0E.0020.0002] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE -294A ; [*0B0F.0020.0002] # LEFT BARB UP RIGHT BARB DOWN HARPOON -294B ; [*0B10.0020.0002] # LEFT BARB DOWN RIGHT BARB UP HARPOON -294C ; [*0B11.0020.0002] # UP BARB RIGHT DOWN BARB LEFT HARPOON -294D ; [*0B12.0020.0002] # UP BARB LEFT DOWN BARB RIGHT HARPOON -294E ; [*0B13.0020.0002] # LEFT BARB UP RIGHT BARB UP HARPOON -294F ; [*0B14.0020.0002] # UP BARB RIGHT DOWN BARB RIGHT HARPOON -2950 ; [*0B15.0020.0002] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON -2951 ; [*0B16.0020.0002] # UP BARB LEFT DOWN BARB LEFT HARPOON -2952 ; [*0B17.0020.0002] # LEFTWARDS HARPOON WITH BARB UP TO BAR -2953 ; [*0B18.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP TO BAR -2954 ; [*0B19.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT TO BAR -2955 ; [*0B1A.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR -2956 ; [*0B1B.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR -2957 ; [*0B1C.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR -2958 ; [*0B1D.0020.0002] # UPWARDS HARPOON WITH BARB LEFT TO BAR -2959 ; [*0B1E.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR -295A ; [*0B1F.0020.0002] # LEFTWARDS HARPOON WITH BARB UP FROM BAR -295B ; [*0B20.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR -295C ; [*0B21.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR -295D ; [*0B22.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR -295E ; [*0B23.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR -295F ; [*0B24.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR -2960 ; [*0B25.0020.0002] # UPWARDS HARPOON WITH BARB LEFT FROM BAR -2961 ; [*0B26.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR -2962 ; [*0B27.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN -2963 ; [*0B28.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT -2964 ; [*0B29.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN -2965 ; [*0B2A.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT -2966 ; [*0B2B.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP -2967 ; [*0B2C.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN -2968 ; [*0B2D.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP -2969 ; [*0B2E.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN -296A ; [*0B2F.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH -296B ; [*0B30.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH -296C ; [*0B31.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH -296D ; [*0B32.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH -296E ; [*0B33.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT -296F ; [*0B34.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT -2970 ; [*0B35.0020.0002] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD -2971 ; [*0B36.0020.0002] # EQUALS SIGN ABOVE RIGHTWARDS ARROW -2972 ; [*0B37.0020.0002] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW -2973 ; [*0B38.0020.0002] # LEFTWARDS ARROW ABOVE TILDE OPERATOR -2974 ; [*0B39.0020.0002] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR -2975 ; [*0B3A.0020.0002] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO -2976 ; [*0B3B.0020.0002] # LESS-THAN ABOVE LEFTWARDS ARROW -2977 ; [*0B3C.0020.0002] # LEFTWARDS ARROW THROUGH LESS-THAN -2978 ; [*0B3D.0020.0002] # GREATER-THAN ABOVE RIGHTWARDS ARROW -2979 ; [*0B3E.0020.0002] # SUBSET ABOVE RIGHTWARDS ARROW -297A ; [*0B3F.0020.0002] # LEFTWARDS ARROW THROUGH SUBSET -297B ; [*0B40.0020.0002] # SUPERSET ABOVE LEFTWARDS ARROW -297C ; [*0B41.0020.0002] # LEFT FISH TAIL -297D ; [*0B42.0020.0002] # RIGHT FISH TAIL -297E ; [*0B43.0020.0002] # UP FISH TAIL -297F ; [*0B44.0020.0002] # DOWN FISH TAIL -2980 ; [*0B45.0020.0002] # TRIPLE VERTICAL BAR DELIMITER -2981 ; [*0B46.0020.0002] # Z NOTATION SPOT -2982 ; [*0B47.0020.0002] # Z NOTATION TYPE COLON -2983 ; [*0324.0020.0002] # LEFT WHITE CURLY BRACKET -2984 ; [*0325.0020.0002] # RIGHT WHITE CURLY BRACKET -2985 ; [*0326.0020.0002] # LEFT WHITE PARENTHESIS -2986 ; [*0327.0020.0002] # RIGHT WHITE PARENTHESIS -2987 ; [*0328.0020.0002] # Z NOTATION LEFT IMAGE BRACKET -2988 ; [*0329.0020.0002] # Z NOTATION RIGHT IMAGE BRACKET -2989 ; [*032A.0020.0002] # Z NOTATION LEFT BINDING BRACKET -298A ; [*032B.0020.0002] # Z NOTATION RIGHT BINDING BRACKET -298B ; [*032C.0020.0002] # LEFT SQUARE BRACKET WITH UNDERBAR -298C ; [*032D.0020.0002] # RIGHT SQUARE BRACKET WITH UNDERBAR -298D ; [*032E.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298E ; [*032F.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -298F ; [*0330.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990 ; [*0331.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2991 ; [*0332.0020.0002] # LEFT ANGLE BRACKET WITH DOT -2992 ; [*0333.0020.0002] # RIGHT ANGLE BRACKET WITH DOT -2993 ; [*0334.0020.0002] # LEFT ARC LESS-THAN BRACKET -2994 ; [*0335.0020.0002] # RIGHT ARC GREATER-THAN BRACKET -2995 ; [*0336.0020.0002] # DOUBLE LEFT ARC GREATER-THAN BRACKET -2996 ; [*0337.0020.0002] # DOUBLE RIGHT ARC LESS-THAN BRACKET -2997 ; [*0338.0020.0002] # LEFT BLACK TORTOISE SHELL BRACKET -2998 ; [*0339.0020.0002] # RIGHT BLACK TORTOISE SHELL BRACKET -2999 ; [*0B48.0020.0002] # DOTTED FENCE -299A ; [*0B49.0020.0002] # VERTICAL ZIGZAG LINE -299B ; [*0B4A.0020.0002] # MEASURED ANGLE OPENING LEFT -299C ; [*0B4B.0020.0002] # RIGHT ANGLE VARIANT WITH SQUARE -299D ; [*0B4C.0020.0002] # MEASURED RIGHT ANGLE WITH DOT -299E ; [*0B4D.0020.0002] # ANGLE WITH S INSIDE -299F ; [*0B4E.0020.0002] # ACUTE ANGLE -29A0 ; [*0B4F.0020.0002] # SPHERICAL ANGLE OPENING LEFT -29A1 ; [*0B50.0020.0002] # SPHERICAL ANGLE OPENING UP -29A2 ; [*0B51.0020.0002] # TURNED ANGLE -29A3 ; [*0B52.0020.0002] # REVERSED ANGLE -29A4 ; [*0B53.0020.0002] # ANGLE WITH UNDERBAR -29A5 ; [*0B54.0020.0002] # REVERSED ANGLE WITH UNDERBAR -29A6 ; [*0B55.0020.0002] # OBLIQUE ANGLE OPENING UP -29A7 ; [*0B56.0020.0002] # OBLIQUE ANGLE OPENING DOWN -29A8 ; [*0B57.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT -29A9 ; [*0B58.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT -29AA ; [*0B59.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT -29AB ; [*0B5A.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT -29AC ; [*0B5B.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP -29AD ; [*0B5C.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP -29AE ; [*0B5D.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN -29AF ; [*0B5E.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN -29B0 ; [*0B5F.0020.0002] # REVERSED EMPTY SET -29B1 ; [*0B60.0020.0002] # EMPTY SET WITH OVERBAR -29B2 ; [*0B61.0020.0002] # EMPTY SET WITH SMALL CIRCLE ABOVE -29B3 ; [*0B62.0020.0002] # EMPTY SET WITH RIGHT ARROW ABOVE -29B4 ; [*0B63.0020.0002] # EMPTY SET WITH LEFT ARROW ABOVE -29B5 ; [*0B64.0020.0002] # CIRCLE WITH HORIZONTAL BAR -29B6 ; [*0B65.0020.0002] # CIRCLED VERTICAL BAR -29B7 ; [*0B66.0020.0002] # CIRCLED PARALLEL -29B8 ; [*0B67.0020.0002] # CIRCLED REVERSE SOLIDUS -29B9 ; [*0B68.0020.0002] # CIRCLED PERPENDICULAR -29BA ; [*0B69.0020.0002] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR -29BB ; [*0B6A.0020.0002] # CIRCLE WITH SUPERIMPOSED X -29BC ; [*0B6B.0020.0002] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN -29BD ; [*0B6C.0020.0002] # UP ARROW THROUGH CIRCLE -29BE ; [*0B6D.0020.0002] # CIRCLED WHITE BULLET -29BF ; [*0B6E.0020.0002] # CIRCLED BULLET -29C0 ; [*0B6F.0020.0002] # CIRCLED LESS-THAN -29C1 ; [*0B70.0020.0002] # CIRCLED GREATER-THAN -29C2 ; [*0B71.0020.0002] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT -29C3 ; [*0B72.0020.0002] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT -29C4 ; [*0B73.0020.0002] # SQUARED RISING DIAGONAL SLASH -29C5 ; [*0B74.0020.0002] # SQUARED FALLING DIAGONAL SLASH -29C6 ; [*0B75.0020.0002] # SQUARED ASTERISK -29C7 ; [*0B76.0020.0002] # SQUARED SMALL CIRCLE -29C8 ; [*0B77.0020.0002] # SQUARED SQUARE -29C9 ; [*0B78.0020.0002] # TWO JOINED SQUARES -29CA ; [*0B79.0020.0002] # TRIANGLE WITH DOT ABOVE -29CB ; [*0B7A.0020.0002] # TRIANGLE WITH UNDERBAR -29CC ; [*0B7B.0020.0002] # S IN TRIANGLE -29CD ; [*0B7C.0020.0002] # TRIANGLE WITH SERIFS AT BOTTOM -29CE ; [*0B7D.0020.0002] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE -29CF ; [*0B7E.0020.0002] # LEFT TRIANGLE BESIDE VERTICAL BAR -29D0 ; [*0B7F.0020.0002] # VERTICAL BAR BESIDE RIGHT TRIANGLE -29D1 ; [*0B80.0020.0002] # BOWTIE WITH LEFT HALF BLACK -29D2 ; [*0B81.0020.0002] # BOWTIE WITH RIGHT HALF BLACK -29D3 ; [*0B82.0020.0002] # BLACK BOWTIE -29D4 ; [*0B83.0020.0002] # TIMES WITH LEFT HALF BLACK -29D5 ; [*0B84.0020.0002] # TIMES WITH RIGHT HALF BLACK -29D6 ; [*0B85.0020.0002] # WHITE HOURGLASS -29D7 ; [*0B86.0020.0002] # BLACK HOURGLASS -29D8 ; [*037E.0020.0002] # LEFT WIGGLY FENCE -29D9 ; [*037F.0020.0002] # RIGHT WIGGLY FENCE -29DA ; [*0380.0020.0002] # LEFT DOUBLE WIGGLY FENCE -29DB ; [*0381.0020.0002] # RIGHT DOUBLE WIGGLY FENCE -29DC ; [*0B87.0020.0002] # INCOMPLETE INFINITY -29DD ; [*0B88.0020.0002] # TIE OVER INFINITY -29DE ; [*0B89.0020.0002] # INFINITY NEGATED WITH VERTICAL BAR -29DF ; [*0B8A.0020.0002] # DOUBLE-ENDED MULTIMAP -29E0 ; [*0B8B.0020.0002] # SQUARE WITH CONTOURED OUTLINE -29E1 ; [*0B8C.0020.0002] # INCREASES AS -29E2 ; [*0B8D.0020.0002] # SHUFFLE PRODUCT -29E3 ; [*0B8E.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL -29E4 ; [*0B8F.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE -29E5 ; [*0B90.0020.0002] # IDENTICAL TO AND SLANTED PARALLEL -29E6 ; [*0B91.0020.0002] # GLEICH STARK -29E7 ; [*0B92.0020.0002] # THERMODYNAMIC -29E8 ; [*0B93.0020.0002] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK -29E9 ; [*0B94.0020.0002] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK -29EA ; [*0B95.0020.0002] # BLACK DIAMOND WITH DOWN ARROW -29EB ; [*0B96.0020.0002] # BLACK LOZENGE -29EC ; [*0B97.0020.0002] # WHITE CIRCLE WITH DOWN ARROW -29ED ; [*0B98.0020.0002] # BLACK CIRCLE WITH DOWN ARROW -29EE ; [*0B99.0020.0002] # ERROR-BARRED WHITE SQUARE -29EF ; [*0B9A.0020.0002] # ERROR-BARRED BLACK SQUARE -29F0 ; [*0B9B.0020.0002] # ERROR-BARRED WHITE DIAMOND -29F1 ; [*0B9C.0020.0002] # ERROR-BARRED BLACK DIAMOND -29F2 ; [*0B9D.0020.0002] # ERROR-BARRED WHITE CIRCLE -29F3 ; [*0B9E.0020.0002] # ERROR-BARRED BLACK CIRCLE -29F4 ; [*0B9F.0020.0002] # RULE-DELAYED -29F5 ; [*0BA0.0020.0002] # REVERSE SOLIDUS OPERATOR -29F6 ; [*0BA1.0020.0002] # SOLIDUS WITH OVERBAR -29F7 ; [*0BA2.0020.0002] # REVERSE SOLIDUS WITH HORIZONTAL STROKE -29F8 ; [*0BA3.0020.0002] # BIG SOLIDUS -29F9 ; [*0BA4.0020.0002] # BIG REVERSE SOLIDUS -29FA ; [*0BA5.0020.0002] # DOUBLE PLUS -29FB ; [*0BA6.0020.0002] # TRIPLE PLUS -29FC ; [*0322.0020.0002] # LEFT-POINTING CURVED ANGLE BRACKET -29FD ; [*0323.0020.0002] # RIGHT-POINTING CURVED ANGLE BRACKET -29FE ; [*0BA7.0020.0002] # TINY -29FF ; [*0BA8.0020.0002] # MINY -2A00 ; [*0BA9.0020.0002] # N-ARY CIRCLED DOT OPERATOR -2A01 ; [*0BAA.0020.0002] # N-ARY CIRCLED PLUS OPERATOR -2A02 ; [*0BAB.0020.0002] # N-ARY CIRCLED TIMES OPERATOR -2A03 ; [*0BAC.0020.0002] # N-ARY UNION OPERATOR WITH DOT -2A04 ; [*0BAD.0020.0002] # N-ARY UNION OPERATOR WITH PLUS -2A05 ; [*0BAE.0020.0002] # N-ARY SQUARE INTERSECTION OPERATOR -2A06 ; [*0BAF.0020.0002] # N-ARY SQUARE UNION OPERATOR -2A07 ; [*0BB0.0020.0002] # TWO LOGICAL AND OPERATOR -2A08 ; [*0BB1.0020.0002] # TWO LOGICAL OR OPERATOR -2A09 ; [*0BB2.0020.0002] # N-ARY TIMES OPERATOR -2A0A ; [*0BB3.0020.0002] # MODULO TWO SUM -2A0B ; [*0BB4.0020.0002] # SUMMATION WITH INTEGRAL -2A0C ; [*061C.0020.0004][*061C.0020.0004][*061C.0020.0004][*061C.0020.0004] # QUADRUPLE INTEGRAL OPERATOR -2A0D ; [*0BB5.0020.0002] # FINITE PART INTEGRAL -2A0E ; [*0BB6.0020.0002] # INTEGRAL WITH DOUBLE STROKE -2A0F ; [*0BB7.0020.0002] # INTEGRAL AVERAGE WITH SLASH -2A10 ; [*0BB8.0020.0002] # CIRCULATION FUNCTION -2A11 ; [*0BB9.0020.0002] # ANTICLOCKWISE INTEGRATION -2A12 ; [*0BBA.0020.0002] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE -2A13 ; [*0BBB.0020.0002] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE -2A14 ; [*0BBC.0020.0002] # LINE INTEGRATION NOT INCLUDING THE POLE -2A15 ; [*0BBD.0020.0002] # INTEGRAL AROUND A POINT OPERATOR -2A16 ; [*0BBE.0020.0002] # QUATERNION INTEGRAL OPERATOR -2A17 ; [*0BBF.0020.0002] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK -2A18 ; [*0BC0.0020.0002] # INTEGRAL WITH TIMES SIGN -2A19 ; [*0BC1.0020.0002] # INTEGRAL WITH INTERSECTION -2A1A ; [*0BC2.0020.0002] # INTEGRAL WITH UNION -2A1B ; [*0BC3.0020.0002] # INTEGRAL WITH OVERBAR -2A1C ; [*0BC4.0020.0002] # INTEGRAL WITH UNDERBAR -2A1D ; [*0BC5.0020.0002] # JOIN -2A1E ; [*0BC6.0020.0002] # LARGE LEFT TRIANGLE OPERATOR -2A1F ; [*0BC7.0020.0002] # Z NOTATION SCHEMA COMPOSITION -2A20 ; [*0BC8.0020.0002] # Z NOTATION SCHEMA PIPING -2A21 ; [*0BC9.0020.0002] # Z NOTATION SCHEMA PROJECTION -2A22 ; [*0BCA.0020.0002] # PLUS SIGN WITH SMALL CIRCLE ABOVE -2A23 ; [*0BCB.0020.0002] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE -2A24 ; [*0BCC.0020.0002] # PLUS SIGN WITH TILDE ABOVE -2A25 ; [*0BCD.0020.0002] # PLUS SIGN WITH DOT BELOW -2A26 ; [*0BCE.0020.0002] # PLUS SIGN WITH TILDE BELOW -2A27 ; [*0BCF.0020.0002] # PLUS SIGN WITH SUBSCRIPT TWO -2A28 ; [*0BD0.0020.0002] # PLUS SIGN WITH BLACK TRIANGLE -2A29 ; [*0BD1.0020.0002] # MINUS SIGN WITH COMMA ABOVE -2A2A ; [*0BD2.0020.0002] # MINUS SIGN WITH DOT BELOW -2A2B ; [*0BD3.0020.0002] # MINUS SIGN WITH FALLING DOTS -2A2C ; [*0BD4.0020.0002] # MINUS SIGN WITH RISING DOTS -2A2D ; [*0BD5.0020.0002] # PLUS SIGN IN LEFT HALF CIRCLE -2A2E ; [*0BD6.0020.0002] # PLUS SIGN IN RIGHT HALF CIRCLE -2A2F ; [*0BD7.0020.0002] # VECTOR OR CROSS PRODUCT -2A30 ; [*0BD8.0020.0002] # MULTIPLICATION SIGN WITH DOT ABOVE -2A31 ; [*0BD9.0020.0002] # MULTIPLICATION SIGN WITH UNDERBAR -2A32 ; [*0BDA.0020.0002] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED -2A33 ; [*0BDB.0020.0002] # SMASH PRODUCT -2A34 ; [*0BDC.0020.0002] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE -2A35 ; [*0BDD.0020.0002] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE -2A36 ; [*0BDE.0020.0002] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT -2A37 ; [*0BDF.0020.0002] # MULTIPLICATION SIGN IN DOUBLE CIRCLE -2A38 ; [*0BE0.0020.0002] # CIRCLED DIVISION SIGN -2A39 ; [*0BE1.0020.0002] # PLUS SIGN IN TRIANGLE -2A3A ; [*0BE2.0020.0002] # MINUS SIGN IN TRIANGLE -2A3B ; [*0BE3.0020.0002] # MULTIPLICATION SIGN IN TRIANGLE -2A3C ; [*0BE4.0020.0002] # INTERIOR PRODUCT -2A3D ; [*0BE5.0020.0002] # RIGHTHAND INTERIOR PRODUCT -2A3E ; [*0BE6.0020.0002] # Z NOTATION RELATIONAL COMPOSITION -2A3F ; [*0BE7.0020.0002] # AMALGAMATION OR COPRODUCT -2A40 ; [*0BE8.0020.0002] # INTERSECTION WITH DOT -2A41 ; [*0BE9.0020.0002] # UNION WITH MINUS SIGN -2A42 ; [*0BEA.0020.0002] # UNION WITH OVERBAR -2A43 ; [*0BEB.0020.0002] # INTERSECTION WITH OVERBAR -2A44 ; [*0BEC.0020.0002] # INTERSECTION WITH LOGICAL AND -2A45 ; [*0BED.0020.0002] # UNION WITH LOGICAL OR -2A46 ; [*0BEE.0020.0002] # UNION ABOVE INTERSECTION -2A47 ; [*0BEF.0020.0002] # INTERSECTION ABOVE UNION -2A48 ; [*0BF0.0020.0002] # UNION ABOVE BAR ABOVE INTERSECTION -2A49 ; [*0BF1.0020.0002] # INTERSECTION ABOVE BAR ABOVE UNION -2A4A ; [*0BF2.0020.0002] # UNION BESIDE AND JOINED WITH UNION -2A4B ; [*0BF3.0020.0002] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION -2A4C ; [*0BF4.0020.0002] # CLOSED UNION WITH SERIFS -2A4D ; [*0BF5.0020.0002] # CLOSED INTERSECTION WITH SERIFS -2A4E ; [*0BF6.0020.0002] # DOUBLE SQUARE INTERSECTION -2A4F ; [*0BF7.0020.0002] # DOUBLE SQUARE UNION -2A50 ; [*0BF8.0020.0002] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT -2A51 ; [*0BF9.0020.0002] # LOGICAL AND WITH DOT ABOVE -2A52 ; [*0BFA.0020.0002] # LOGICAL OR WITH DOT ABOVE -2A53 ; [*0BFB.0020.0002] # DOUBLE LOGICAL AND -2A54 ; [*0BFC.0020.0002] # DOUBLE LOGICAL OR -2A55 ; [*0BFD.0020.0002] # TWO INTERSECTING LOGICAL AND -2A56 ; [*0BFE.0020.0002] # TWO INTERSECTING LOGICAL OR -2A57 ; [*0BFF.0020.0002] # SLOPING LARGE OR -2A58 ; [*0C00.0020.0002] # SLOPING LARGE AND -2A59 ; [*0C01.0020.0002] # LOGICAL OR OVERLAPPING LOGICAL AND -2A5A ; [*0C02.0020.0002] # LOGICAL AND WITH MIDDLE STEM -2A5B ; [*0C03.0020.0002] # LOGICAL OR WITH MIDDLE STEM -2A5C ; [*0C04.0020.0002] # LOGICAL AND WITH HORIZONTAL DASH -2A5D ; [*0C05.0020.0002] # LOGICAL OR WITH HORIZONTAL DASH -2A5E ; [*0C06.0020.0002] # LOGICAL AND WITH DOUBLE OVERBAR -2A5F ; [*0C07.0020.0002] # LOGICAL AND WITH UNDERBAR -2A60 ; [*0C08.0020.0002] # LOGICAL AND WITH DOUBLE UNDERBAR -2A61 ; [*0C09.0020.0002] # SMALL VEE WITH UNDERBAR -2A62 ; [*0C0A.0020.0002] # LOGICAL OR WITH DOUBLE OVERBAR -2A63 ; [*0C0B.0020.0002] # LOGICAL OR WITH DOUBLE UNDERBAR -2A64 ; [*0C0C.0020.0002] # Z NOTATION DOMAIN ANTIRESTRICTION -2A65 ; [*0C0D.0020.0002] # Z NOTATION RANGE ANTIRESTRICTION -2A66 ; [*0C0E.0020.0002] # EQUALS SIGN WITH DOT BELOW -2A67 ; [*0C0F.0020.0002] # IDENTICAL WITH DOT ABOVE -2A68 ; [*0C10.0020.0002] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE -2A69 ; [*0C11.0020.0002] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE -2A6A ; [*0C12.0020.0002] # TILDE OPERATOR WITH DOT ABOVE -2A6B ; [*0C13.0020.0002] # TILDE OPERATOR WITH RISING DOTS -2A6C ; [*0C14.0020.0002] # SIMILAR MINUS SIMILAR -2A6D ; [*0C15.0020.0002] # CONGRUENT WITH DOT ABOVE -2A6E ; [*0C16.0020.0002] # EQUALS WITH ASTERISK -2A6F ; [*0C17.0020.0002] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT -2A70 ; [*0C18.0020.0002] # APPROXIMATELY EQUAL OR EQUAL TO -2A71 ; [*0C19.0020.0002] # EQUALS SIGN ABOVE PLUS SIGN -2A72 ; [*0C1A.0020.0002] # PLUS SIGN ABOVE EQUALS SIGN -2A73 ; [*0C1B.0020.0002] # EQUALS SIGN ABOVE TILDE OPERATOR -2A74 ; [*0238.0020.0004][*0238.0020.0004][*05FB.0020.0004] # DOUBLE COLON EQUAL -2A75 ; [*05FB.0020.0004][*05FB.0020.0004] # TWO CONSECUTIVE EQUALS SIGNS -2A76 ; [*05FB.0020.0004][*05FB.0020.0004][*05FB.0020.0004] # THREE CONSECUTIVE EQUALS SIGNS -2A77 ; [*0C1C.0020.0002] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW -2A78 ; [*0C1D.0020.0002] # EQUIVALENT WITH FOUR DOTS ABOVE -2A79 ; [*0C1E.0020.0002] # LESS-THAN WITH CIRCLE INSIDE -2A7A ; [*0C1F.0020.0002] # GREATER-THAN WITH CIRCLE INSIDE -2A7B ; [*0C20.0020.0002] # LESS-THAN WITH QUESTION MARK ABOVE -2A7C ; [*0C21.0020.0002] # GREATER-THAN WITH QUESTION MARK ABOVE -2A7D ; [*0C22.0020.0002] # LESS-THAN OR SLANTED EQUAL TO -2A7E ; [*0C23.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO -2A7F ; [*0C24.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE -2A80 ; [*0C25.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE -2A81 ; [*0C26.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE -2A82 ; [*0C27.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE -2A83 ; [*0C28.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT -2A84 ; [*0C29.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT -2A85 ; [*0C2A.0020.0002] # LESS-THAN OR APPROXIMATE -2A86 ; [*0C2B.0020.0002] # GREATER-THAN OR APPROXIMATE -2A87 ; [*0C2C.0020.0002] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO -2A88 ; [*0C2D.0020.0002] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO -2A89 ; [*0C2E.0020.0002] # LESS-THAN AND NOT APPROXIMATE -2A8A ; [*0C2F.0020.0002] # GREATER-THAN AND NOT APPROXIMATE -2A8B ; [*0C30.0020.0002] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN -2A8C ; [*0C31.0020.0002] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN -2A8D ; [*0C32.0020.0002] # LESS-THAN ABOVE SIMILAR OR EQUAL -2A8E ; [*0C33.0020.0002] # GREATER-THAN ABOVE SIMILAR OR EQUAL -2A8F ; [*0C34.0020.0002] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN -2A90 ; [*0C35.0020.0002] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN -2A91 ; [*0C36.0020.0002] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL -2A92 ; [*0C37.0020.0002] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL -2A93 ; [*0C38.0020.0002] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL -2A94 ; [*0C39.0020.0002] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL -2A95 ; [*0C3A.0020.0002] # SLANTED EQUAL TO OR LESS-THAN -2A96 ; [*0C3B.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN -2A97 ; [*0C3C.0020.0002] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE -2A98 ; [*0C3D.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE -2A99 ; [*0C3E.0020.0002] # DOUBLE-LINE EQUAL TO OR LESS-THAN -2A9A ; [*0C3F.0020.0002] # DOUBLE-LINE EQUAL TO OR GREATER-THAN -2A9B ; [*0C40.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN -2A9C ; [*0C41.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN -2A9D ; [*0C42.0020.0002] # SIMILAR OR LESS-THAN -2A9E ; [*0C43.0020.0002] # SIMILAR OR GREATER-THAN -2A9F ; [*0C44.0020.0002] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN -2AA0 ; [*0C45.0020.0002] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN -2AA1 ; [*0C46.0020.0002] # DOUBLE NESTED LESS-THAN -2AA2 ; [*0C47.0020.0002] # DOUBLE NESTED GREATER-THAN -2AA3 ; [*0C48.0020.0002] # DOUBLE NESTED LESS-THAN WITH UNDERBAR -2AA4 ; [*0C49.0020.0002] # GREATER-THAN OVERLAPPING LESS-THAN -2AA5 ; [*0C4A.0020.0002] # GREATER-THAN BESIDE LESS-THAN -2AA6 ; [*0C4B.0020.0002] # LESS-THAN CLOSED BY CURVE -2AA7 ; [*0C4C.0020.0002] # GREATER-THAN CLOSED BY CURVE -2AA8 ; [*0C4D.0020.0002] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL -2AA9 ; [*0C4E.0020.0002] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL -2AAA ; [*0C4F.0020.0002] # SMALLER THAN -2AAB ; [*0C50.0020.0002] # LARGER THAN -2AAC ; [*0C51.0020.0002] # SMALLER THAN OR EQUAL TO -2AAD ; [*0C52.0020.0002] # LARGER THAN OR EQUAL TO -2AAE ; [*0C53.0020.0002] # EQUALS SIGN WITH BUMPY ABOVE -2AAF ; [*0C54.0020.0002] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN -2AB0 ; [*0C55.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN -2AB1 ; [*0C56.0020.0002] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO -2AB2 ; [*0C57.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO -2AB3 ; [*0C58.0020.0002] # PRECEDES ABOVE EQUALS SIGN -2AB4 ; [*0C59.0020.0002] # SUCCEEDS ABOVE EQUALS SIGN -2AB5 ; [*0C5A.0020.0002] # PRECEDES ABOVE NOT EQUAL TO -2AB6 ; [*0C5B.0020.0002] # SUCCEEDS ABOVE NOT EQUAL TO -2AB7 ; [*0C5C.0020.0002] # PRECEDES ABOVE ALMOST EQUAL TO -2AB8 ; [*0C5D.0020.0002] # SUCCEEDS ABOVE ALMOST EQUAL TO -2AB9 ; [*0C5E.0020.0002] # PRECEDES ABOVE NOT ALMOST EQUAL TO -2ABA ; [*0C5F.0020.0002] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO -2ABB ; [*0C60.0020.0002] # DOUBLE PRECEDES -2ABC ; [*0C61.0020.0002] # DOUBLE SUCCEEDS -2ABD ; [*0C62.0020.0002] # SUBSET WITH DOT -2ABE ; [*0C63.0020.0002] # SUPERSET WITH DOT -2ABF ; [*0C64.0020.0002] # SUBSET WITH PLUS SIGN BELOW -2AC0 ; [*0C65.0020.0002] # SUPERSET WITH PLUS SIGN BELOW -2AC1 ; [*0C66.0020.0002] # SUBSET WITH MULTIPLICATION SIGN BELOW -2AC2 ; [*0C67.0020.0002] # SUPERSET WITH MULTIPLICATION SIGN BELOW -2AC3 ; [*0C68.0020.0002] # SUBSET OF OR EQUAL TO WITH DOT ABOVE -2AC4 ; [*0C69.0020.0002] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE -2AC5 ; [*0C6A.0020.0002] # SUBSET OF ABOVE EQUALS SIGN -2AC6 ; [*0C6B.0020.0002] # SUPERSET OF ABOVE EQUALS SIGN -2AC7 ; [*0C6C.0020.0002] # SUBSET OF ABOVE TILDE OPERATOR -2AC8 ; [*0C6D.0020.0002] # SUPERSET OF ABOVE TILDE OPERATOR -2AC9 ; [*0C6E.0020.0002] # SUBSET OF ABOVE ALMOST EQUAL TO -2ACA ; [*0C6F.0020.0002] # SUPERSET OF ABOVE ALMOST EQUAL TO -2ACB ; [*0C70.0020.0002] # SUBSET OF ABOVE NOT EQUAL TO -2ACC ; [*0C71.0020.0002] # SUPERSET OF ABOVE NOT EQUAL TO -2ACD ; [*0C72.0020.0002] # SQUARE LEFT OPEN BOX OPERATOR -2ACE ; [*0C73.0020.0002] # SQUARE RIGHT OPEN BOX OPERATOR -2ACF ; [*0C74.0020.0002] # CLOSED SUBSET -2AD0 ; [*0C75.0020.0002] # CLOSED SUPERSET -2AD1 ; [*0C76.0020.0002] # CLOSED SUBSET OR EQUAL TO -2AD2 ; [*0C77.0020.0002] # CLOSED SUPERSET OR EQUAL TO -2AD3 ; [*0C78.0020.0002] # SUBSET ABOVE SUPERSET -2AD4 ; [*0C79.0020.0002] # SUPERSET ABOVE SUBSET -2AD5 ; [*0C7A.0020.0002] # SUBSET ABOVE SUBSET -2AD6 ; [*0C7B.0020.0002] # SUPERSET ABOVE SUPERSET -2AD7 ; [*0C7C.0020.0002] # SUPERSET BESIDE SUBSET -2AD8 ; [*0C7D.0020.0002] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET -2AD9 ; [*0C7E.0020.0002] # ELEMENT OF OPENING DOWNWARDS -2ADA ; [*0C7F.0020.0002] # PITCHFORK WITH TEE TOP -2ADB ; [*0C80.0020.0002] # TRANSVERSAL INTERSECTION -2ADC ; [*0C81.0020.0002][.0000.002F.0002] # FORKING -2ADD ; [*0C81.0020.0002] # NONFORKING -2ADE ; [*0C82.0020.0002] # SHORT LEFT TACK -2ADF ; [*0C83.0020.0002] # SHORT DOWN TACK -2AE0 ; [*0C84.0020.0002] # SHORT UP TACK -2AE1 ; [*0C85.0020.0002] # PERPENDICULAR WITH S -2AE2 ; [*0C86.0020.0002] # VERTICAL BAR TRIPLE RIGHT TURNSTILE -2AE3 ; [*0C87.0020.0002] # DOUBLE VERTICAL BAR LEFT TURNSTILE -2AE4 ; [*0C88.0020.0002] # VERTICAL BAR DOUBLE LEFT TURNSTILE -2AE5 ; [*0C89.0020.0002] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE -2AE6 ; [*0C8A.0020.0002] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL -2AE7 ; [*0C8B.0020.0002] # SHORT DOWN TACK WITH OVERBAR -2AE8 ; [*0C8C.0020.0002] # SHORT UP TACK WITH UNDERBAR -2AE9 ; [*0C8D.0020.0002] # SHORT UP TACK ABOVE SHORT DOWN TACK -2AEA ; [*0C8E.0020.0002] # DOUBLE DOWN TACK -2AEB ; [*0C8F.0020.0002] # DOUBLE UP TACK -2AEC ; [*0C90.0020.0002] # DOUBLE STROKE NOT SIGN -2AED ; [*0C91.0020.0002] # REVERSED DOUBLE STROKE NOT SIGN -2AEE ; [*0C92.0020.0002] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH -2AEF ; [*0C93.0020.0002] # VERTICAL LINE WITH CIRCLE ABOVE -2AF0 ; [*0C94.0020.0002] # VERTICAL LINE WITH CIRCLE BELOW -2AF1 ; [*0C95.0020.0002] # DOWN TACK WITH CIRCLE BELOW -2AF2 ; [*0C96.0020.0002] # PARALLEL WITH HORIZONTAL STROKE -2AF3 ; [*0C97.0020.0002] # PARALLEL WITH TILDE OPERATOR -2AF4 ; [*0C98.0020.0002] # TRIPLE VERTICAL BAR BINARY RELATION -2AF5 ; [*0C99.0020.0002] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE -2AF6 ; [*0C9A.0020.0002] # TRIPLE COLON OPERATOR -2AF7 ; [*0C9B.0020.0002] # TRIPLE NESTED LESS-THAN -2AF8 ; [*0C9C.0020.0002] # TRIPLE NESTED GREATER-THAN -2AF9 ; [*0C9D.0020.0002] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO -2AFA ; [*0C9E.0020.0002] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO -2AFB ; [*0C9F.0020.0002] # TRIPLE SOLIDUS BINARY RELATION -2AFC ; [*0CA0.0020.0002] # LARGE TRIPLE VERTICAL BAR OPERATOR -2AFD ; [*0CA1.0020.0002] # DOUBLE SOLIDUS OPERATOR -2AFE ; [*0CA2.0020.0002] # WHITE VERTICAL BAR -2AFF ; [*0CA3.0020.0002] # N-ARY WHITE VERTICAL BAR -2B00 ; [*0CA4.0020.0002] # NORTH EAST WHITE ARROW -2B01 ; [*0CA5.0020.0002] # NORTH WEST WHITE ARROW -2B02 ; [*0CA6.0020.0002] # SOUTH EAST WHITE ARROW -2B03 ; [*0CA7.0020.0002] # SOUTH WEST WHITE ARROW -2B04 ; [*0CA8.0020.0002] # LEFT RIGHT WHITE ARROW -2B05 ; [*0CA9.0020.0002] # LEFTWARDS BLACK ARROW -2B06 ; [*0CAA.0020.0002] # UPWARDS BLACK ARROW -2B07 ; [*0CAB.0020.0002] # DOWNWARDS BLACK ARROW -2B08 ; [*0CAC.0020.0002] # NORTH EAST BLACK ARROW -2B09 ; [*0CAD.0020.0002] # NORTH WEST BLACK ARROW -2B0A ; [*0CAE.0020.0002] # SOUTH EAST BLACK ARROW -2B0B ; [*0CAF.0020.0002] # SOUTH WEST BLACK ARROW -2B0C ; [*0CB0.0020.0002] # LEFT RIGHT BLACK ARROW -2B0D ; [*0CB1.0020.0002] # UP DOWN BLACK ARROW -2B0E ; [*0CB2.0020.0002] # RIGHTWARDS ARROW WITH TIP DOWNWARDS -2B0F ; [*0CB3.0020.0002] # RIGHTWARDS ARROW WITH TIP UPWARDS -2B10 ; [*0CB4.0020.0002] # LEFTWARDS ARROW WITH TIP DOWNWARDS -2B11 ; [*0CB5.0020.0002] # LEFTWARDS ARROW WITH TIP UPWARDS -2B12 ; [*0CB6.0020.0002] # SQUARE WITH TOP HALF BLACK -2B13 ; [*0CB7.0020.0002] # SQUARE WITH BOTTOM HALF BLACK -2B14 ; [*0CB8.0020.0002] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK -2B15 ; [*0CB9.0020.0002] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK -2B16 ; [*0CBA.0020.0002] # DIAMOND WITH LEFT HALF BLACK -2B17 ; [*0CBB.0020.0002] # DIAMOND WITH RIGHT HALF BLACK -2B18 ; [*0CBC.0020.0002] # DIAMOND WITH TOP HALF BLACK -2B19 ; [*0CBD.0020.0002] # DIAMOND WITH BOTTOM HALF BLACK -2B1A ; [*0CBE.0020.0002] # DOTTED SQUARE -2B1B ; [*0CBF.0020.0002] # BLACK LARGE SQUARE -2B1C ; [*0CC0.0020.0002] # WHITE LARGE SQUARE -2B1D ; [*0CC1.0020.0002] # BLACK VERY SMALL SQUARE -2B1E ; [*0CC2.0020.0002] # WHITE VERY SMALL SQUARE -2B1F ; [*0CC3.0020.0002] # BLACK PENTAGON -2B20 ; [*0CC4.0020.0002] # WHITE PENTAGON -2B21 ; [*0CC5.0020.0002] # WHITE HEXAGON -2B22 ; [*0CC6.0020.0002] # BLACK HEXAGON -2B23 ; [*0CC7.0020.0002] # HORIZONTAL BLACK HEXAGON -2B24 ; [*0CC8.0020.0002] # BLACK LARGE CIRCLE -2B25 ; [*0CC9.0020.0002] # BLACK MEDIUM DIAMOND -2B26 ; [*0CCA.0020.0002] # WHITE MEDIUM DIAMOND -2B27 ; [*0CCB.0020.0002] # BLACK MEDIUM LOZENGE -2B28 ; [*0CCC.0020.0002] # WHITE MEDIUM LOZENGE -2B29 ; [*0CCD.0020.0002] # BLACK SMALL DIAMOND -2B2A ; [*0CCE.0020.0002] # BLACK SMALL LOZENGE -2B2B ; [*0CCF.0020.0002] # WHITE SMALL LOZENGE -2B2C ; [*0CD0.0020.0002] # BLACK HORIZONTAL ELLIPSE -2B2D ; [*0CD1.0020.0002] # WHITE HORIZONTAL ELLIPSE -2B2E ; [*0CD2.0020.0002] # BLACK VERTICAL ELLIPSE -2B2F ; [*0CD3.0020.0002] # WHITE VERTICAL ELLIPSE -2B30 ; [*0CD4.0020.0002] # LEFT ARROW WITH SMALL CIRCLE -2B31 ; [*0CD5.0020.0002] # THREE LEFTWARDS ARROWS -2B32 ; [*0CD6.0020.0002] # LEFT ARROW WITH CIRCLED PLUS -2B33 ; [*0CD7.0020.0002] # LONG LEFTWARDS SQUIGGLE ARROW -2B34 ; [*0CD8.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE -2B35 ; [*0CD9.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE -2B36 ; [*0CDA.0020.0002] # LEFTWARDS TWO-HEADED ARROW FROM BAR -2B37 ; [*0CDB.0020.0002] # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW -2B38 ; [*0CDC.0020.0002] # LEFTWARDS ARROW WITH DOTTED STEM -2B39 ; [*0CDD.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE -2B3A ; [*0CDE.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -2B3B ; [*0CDF.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL -2B3C ; [*0CE0.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE -2B3D ; [*0CE1.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -2B3E ; [*0CE2.0020.0002] # LEFTWARDS ARROW THROUGH X -2B3F ; [*0CE3.0020.0002] # WAVE ARROW POINTING DIRECTLY LEFT -2B40 ; [*0CE4.0020.0002] # EQUALS SIGN ABOVE LEFTWARDS ARROW -2B41 ; [*0CE5.0020.0002] # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW -2B42 ; [*0CE6.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO -2B43 ; [*0CE7.0020.0002] # RIGHTWARDS ARROW THROUGH GREATER-THAN -2B44 ; [*0CE8.0020.0002] # RIGHTWARDS ARROW THROUGH SUPERSET -2B45 ; [*0CE9.0020.0002] # LEFTWARDS QUADRUPLE ARROW -2B46 ; [*0CEA.0020.0002] # RIGHTWARDS QUADRUPLE ARROW -2B47 ; [*0CEB.0020.0002] # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW -2B48 ; [*0CEC.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO -2B49 ; [*0CED.0020.0002] # TILDE OPERATOR ABOVE LEFTWARDS ARROW -2B4A ; [*0CEE.0020.0002] # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO -2B4B ; [*0CEF.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B4C ; [*0CF0.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B4D ; [*0CF1.0020.0002] # DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW -2B4E ; [*0CF2.0020.0002] # SHORT SLANTED NORTH ARROW -2B4F ; [*0CF3.0020.0002] # SHORT BACKSLANTED SOUTH ARROW -2B50 ; [*0CF4.0020.0002] # WHITE MEDIUM STAR -2B51 ; [*0CF5.0020.0002] # BLACK SMALL STAR -2B52 ; [*0CF6.0020.0002] # WHITE SMALL STAR -2B53 ; [*0CF7.0020.0002] # BLACK RIGHT-POINTING PENTAGON -2B54 ; [*0CF8.0020.0002] # WHITE RIGHT-POINTING PENTAGON -2B55 ; [*0CF9.0020.0002] # HEAVY LARGE CIRCLE -2B56 ; [*0CFA.0020.0002] # HEAVY OVAL WITH OVAL INSIDE -2B57 ; [*0CFB.0020.0002] # HEAVY CIRCLE WITH CIRCLE INSIDE -2B58 ; [*0CFC.0020.0002] # HEAVY CIRCLE -2B59 ; [*0CFD.0020.0002] # HEAVY CIRCLED SALTIRE -2B5A ; [*0CFE.0020.0002] # SLANTED NORTH ARROW WITH HOOKED HEAD -2B5B ; [*0CFF.0020.0002] # BACKSLANTED SOUTH ARROW WITH HOOKED TAIL -2B5C ; [*0D00.0020.0002] # SLANTED NORTH ARROW WITH HORIZONTAL TAIL -2B5D ; [*0D01.0020.0002] # BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL -2B5E ; [*0D02.0020.0002] # BENT ARROW POINTING DOWNWARDS THEN NORTH EAST -2B5F ; [*0D03.0020.0002] # SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST -2B60 ; [*0D04.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW -2B61 ; [*0D05.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW -2B62 ; [*0D06.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW -2B63 ; [*0D07.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW -2B64 ; [*0D08.0020.0002] # LEFT RIGHT TRIANGLE-HEADED ARROW -2B65 ; [*0D09.0020.0002] # UP DOWN TRIANGLE-HEADED ARROW -2B66 ; [*0D0A.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW -2B67 ; [*0D0B.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW -2B68 ; [*0D0C.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW -2B69 ; [*0D0D.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW -2B6A ; [*0D0E.0020.0002] # LEFTWARDS TRIANGLE-HEADED DASHED ARROW -2B6B ; [*0D0F.0020.0002] # UPWARDS TRIANGLE-HEADED DASHED ARROW -2B6C ; [*0D10.0020.0002] # RIGHTWARDS TRIANGLE-HEADED DASHED ARROW -2B6D ; [*0D11.0020.0002] # DOWNWARDS TRIANGLE-HEADED DASHED ARROW -2B6E ; [*0D12.0020.0002] # CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW -2B6F ; [*0D13.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW -2B70 ; [*0D14.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW TO BAR -2B71 ; [*0D15.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW TO BAR -2B72 ; [*0D16.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR -2B73 ; [*0D17.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW TO BAR -2B76 ; [*0D18.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW TO BAR -2B77 ; [*0D19.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW TO BAR -2B78 ; [*0D1A.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW TO BAR -2B79 ; [*0D1B.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW TO BAR -2B7A ; [*0D1C.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -2B7B ; [*0D1D.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -2B7C ; [*0D1E.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -2B7D ; [*0D1F.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -2B7E ; [*0D20.0020.0002] # HORIZONTAL TAB KEY -2B7F ; [*0D21.0020.0002] # VERTICAL TAB KEY -2B80 ; [*0D22.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW -2B81 ; [*0D23.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW -2B82 ; [*0D24.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW -2B83 ; [*0D25.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW -2B84 ; [*0D26.0020.0002] # LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS -2B85 ; [*0D27.0020.0002] # UPWARDS TRIANGLE-HEADED PAIRED ARROWS -2B86 ; [*0D28.0020.0002] # RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS -2B87 ; [*0D29.0020.0002] # DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS -2B88 ; [*0D2A.0020.0002] # LEFTWARDS BLACK CIRCLED WHITE ARROW -2B89 ; [*0D2B.0020.0002] # UPWARDS BLACK CIRCLED WHITE ARROW -2B8A ; [*0D2C.0020.0002] # RIGHTWARDS BLACK CIRCLED WHITE ARROW -2B8B ; [*0D2D.0020.0002] # DOWNWARDS BLACK CIRCLED WHITE ARROW -2B8C ; [*0D2E.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW -2B8D ; [*0D2F.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW -2B8E ; [*0D30.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW -2B8F ; [*0D31.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW -2B90 ; [*0D32.0020.0002] # RETURN LEFT -2B91 ; [*0D33.0020.0002] # RETURN RIGHT -2B92 ; [*0D34.0020.0002] # NEWLINE LEFT -2B93 ; [*0D35.0020.0002] # NEWLINE RIGHT -2B94 ; [*0D36.0020.0002] # FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE -2B95 ; [*0D37.0020.0002] # RIGHTWARDS BLACK ARROW -2B98 ; [*0D38.0020.0002] # THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD -2B99 ; [*0D39.0020.0002] # THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD -2B9A ; [*0D3A.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD -2B9B ; [*0D3B.0020.0002] # THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD -2B9C ; [*0D3C.0020.0002] # BLACK LEFTWARDS EQUILATERAL ARROWHEAD -2B9D ; [*0D3D.0020.0002] # BLACK UPWARDS EQUILATERAL ARROWHEAD -2B9E ; [*0D3E.0020.0002] # BLACK RIGHTWARDS EQUILATERAL ARROWHEAD -2B9F ; [*0D3F.0020.0002] # BLACK DOWNWARDS EQUILATERAL ARROWHEAD -2BA0 ; [*0D40.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS -2BA1 ; [*0D41.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS -2BA2 ; [*0D42.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS -2BA3 ; [*0D43.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS -2BA4 ; [*0D44.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS -2BA5 ; [*0D45.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS -2BA6 ; [*0D46.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS -2BA7 ; [*0D47.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS -2BA8 ; [*0D48.0020.0002] # BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW -2BA9 ; [*0D49.0020.0002] # BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW -2BAA ; [*0D4A.0020.0002] # BLACK CURVED UPWARDS AND LEFTWARDS ARROW -2BAB ; [*0D4B.0020.0002] # BLACK CURVED UPWARDS AND RIGHTWARDS ARROW -2BAC ; [*0D4C.0020.0002] # BLACK CURVED LEFTWARDS AND UPWARDS ARROW -2BAD ; [*0D4D.0020.0002] # BLACK CURVED RIGHTWARDS AND UPWARDS ARROW -2BAE ; [*0D4E.0020.0002] # BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW -2BAF ; [*0D4F.0020.0002] # BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW -2BB0 ; [*0D50.0020.0002] # RIBBON ARROW DOWN LEFT -2BB1 ; [*0D51.0020.0002] # RIBBON ARROW DOWN RIGHT -2BB2 ; [*0D52.0020.0002] # RIBBON ARROW UP LEFT -2BB3 ; [*0D53.0020.0002] # RIBBON ARROW UP RIGHT -2BB4 ; [*0D54.0020.0002] # RIBBON ARROW LEFT UP -2BB5 ; [*0D55.0020.0002] # RIBBON ARROW RIGHT UP -2BB6 ; [*0D56.0020.0002] # RIBBON ARROW LEFT DOWN -2BB7 ; [*0D57.0020.0002] # RIBBON ARROW RIGHT DOWN -2BB8 ; [*0D58.0020.0002] # UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR -2BB9 ; [*0D59.0020.0002] # UP ARROWHEAD IN A RECTANGLE BOX -2BBD ; [*0D5A.0020.0002] # BALLOT BOX WITH LIGHT X -2BBE ; [*0D5B.0020.0002] # CIRCLED X -2BBF ; [*0D5C.0020.0002] # CIRCLED BOLD X -2BC0 ; [*0D5D.0020.0002] # BLACK SQUARE CENTRED -2BC1 ; [*0D5E.0020.0002] # BLACK DIAMOND CENTRED -2BC2 ; [*0D5F.0020.0002] # TURNED BLACK PENTAGON -2BC3 ; [*0D60.0020.0002] # HORIZONTAL BLACK OCTAGON -2BC4 ; [*0D61.0020.0002] # BLACK OCTAGON -2BC5 ; [*0D62.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE CENTRED -2BC6 ; [*0D63.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED -2BC7 ; [*0D64.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED -2BC8 ; [*0D65.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED -2BCA ; [*0D66.0020.0002] # TOP HALF BLACK CIRCLE -2BCB ; [*0D67.0020.0002] # BOTTOM HALF BLACK CIRCLE -2BCC ; [*0D68.0020.0002] # LIGHT FOUR POINTED BLACK CUSP -2BCD ; [*0D69.0020.0002] # ROTATED LIGHT FOUR POINTED BLACK CUSP -2BCE ; [*0D6A.0020.0002] # WHITE FOUR POINTED CUSP -2BCF ; [*0D6B.0020.0002] # ROTATED WHITE FOUR POINTED CUSP -2BD0 ; [*0D6C.0020.0002] # SQUARE POSITION INDICATOR -2BD1 ; [*0D6D.0020.0002] # UNCERTAINTY SIGN -2BEC ; [*0D6E.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2BED ; [*0D6F.0020.0002] # UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2BEE ; [*0D70.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2BEF ; [*0D71.0020.0002] # DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2CE5 ; [*0D72.0020.0002] # COPTIC SYMBOL MI RO -2CE6 ; [*0D73.0020.0002] # COPTIC SYMBOL PI RO -2CE7 ; [*0D74.0020.0002] # COPTIC SYMBOL STAUROS -2CE8 ; [*0D75.0020.0002] # COPTIC SYMBOL TAU RO -2CE9 ; [*0D76.0020.0002] # COPTIC SYMBOL KHI RO -2CEA ; [*0D77.0020.0002] # COPTIC SYMBOL SHIMA SIMA -2CF9 ; [*027E.0020.0002] # COPTIC OLD NUBIAN FULL STOP -2CFA ; [*026C.0020.0002] # COPTIC OLD NUBIAN DIRECT QUESTION MARK -2CFB ; [*026D.0020.0002] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK -2CFC ; [*02EF.0020.0002] # COPTIC OLD NUBIAN VERSE DIVIDER -2CFD ; [*1A68.0020.0002] # COPTIC FRACTION ONE HALF -2CFE ; [*027F.0020.0002] # COPTIC FULL STOP -2CFF ; [*02F0.0020.0002] # COPTIC MORPHOLOGICAL DIVIDER -2D70 ; [*0410.0020.0002] # TIFINAGH SEPARATOR MARK +207A ; [*0616.0020.0014] # SUPERSCRIPT PLUS SIGN +207B ; [*0621.0020.0014] # SUPERSCRIPT MINUS +207C ; [*061B.0020.0014] # SUPERSCRIPT EQUALS SIGN +207D ; [*0317.0020.0014] # SUPERSCRIPT LEFT PARENTHESIS +207E ; [*0318.0020.0014] # SUPERSCRIPT RIGHT PARENTHESIS +208A ; [*0616.0020.0015] # SUBSCRIPT PLUS SIGN +208B ; [*0621.0020.0015] # SUBSCRIPT MINUS +208C ; [*061B.0020.0015] # SUBSCRIPT EQUALS SIGN +208D ; [*0317.0020.0015] # SUBSCRIPT LEFT PARENTHESIS +208E ; [*0318.0020.0015] # SUBSCRIPT RIGHT PARENTHESIS +2104 ; [*0586.0020.0002] # CENTRE LINE SYMBOL +2108 ; [*0587.0020.0002] # SCRUPLE +2114 ; [*0588.0020.0002] # L B BAR SYMBOL +2117 ; [*0589.0020.0002] # SOUND RECORDING COPYRIGHT +2118 ; [*058A.0020.0002] # SCRIPT CAPITAL P +211E ; [*058B.0020.0002] # PRESCRIPTION TAKE +211F ; [*058C.0020.0002] # RESPONSE +2123 ; [*058D.0020.0002] # VERSICLE +2125 ; [*058E.0020.0002] # OUNCE SIGN +2127 ; [*058F.0020.0002] # INVERTED OHM SIGN +2129 ; [*0590.0020.0002] # TURNED GREEK SMALL LETTER IOTA +212E ; [*0591.0020.0002] # ESTIMATED SYMBOL +213A ; [*0592.0020.0002] # ROTATED CAPITAL Q +2140 ; [*0615.0020.0005] # DOUBLE-STRUCK N-ARY SUMMATION +2141 ; [*0593.0020.0002] # TURNED SANS-SERIF CAPITAL G +2142 ; [*0594.0020.0002] # TURNED SANS-SERIF CAPITAL L +2143 ; [*0595.0020.0002] # REVERSED SANS-SERIF CAPITAL L +2144 ; [*0596.0020.0002] # TURNED SANS-SERIF CAPITAL Y +214A ; [*0597.0020.0002] # PROPERTY LINE +214B ; [*06B1.0020.0002] # TURNED AMPERSAND +214C ; [*0598.0020.0002] # PER SIGN +214F ; [*0599.0020.0002] # SYMBOL FOR SAMARITAN SOURCE +2180 ; [*1AC6.0020.0002] # ROMAN NUMERAL ONE THOUSAND C D +2181 ; [*1AC7.0020.0002] # ROMAN NUMERAL FIVE THOUSAND +2182 ; [*1AC8.0020.0002] # ROMAN NUMERAL TEN THOUSAND +2186 ; [*1AC9.0020.0002] # ROMAN NUMERAL FIFTY EARLY FORM +2187 ; [*1ACA.0020.0002] # ROMAN NUMERAL FIFTY THOUSAND +2188 ; [*1ACB.0020.0002] # ROMAN NUMERAL ONE HUNDRED THOUSAND +218A ; [*059A.0020.0002] # TURNED DIGIT TWO +218B ; [*059B.0020.0002] # TURNED DIGIT THREE +2190 ; [*059C.0020.0002] # LEFTWARDS ARROW +2191 ; [*059E.0020.0002] # UPWARDS ARROW +2192 ; [*059D.0020.0002] # RIGHTWARDS ARROW +2193 ; [*059F.0020.0002] # DOWNWARDS ARROW +2194 ; [*05A0.0020.0002] # LEFT RIGHT ARROW +2195 ; [*05A1.0020.0002] # UP DOWN ARROW +2196 ; [*05A2.0020.0002] # NORTH WEST ARROW +2197 ; [*05A3.0020.0002] # NORTH EAST ARROW +2198 ; [*05A4.0020.0002] # SOUTH EAST ARROW +2199 ; [*05A5.0020.0002] # SOUTH WEST ARROW +219A ; [*059C.0020.0002][.0000.002F.0002] # LEFTWARDS ARROW WITH STROKE +219B ; [*059D.0020.0002][.0000.002F.0002] # RIGHTWARDS ARROW WITH STROKE +219C ; [*05A6.0020.0002] # LEFTWARDS WAVE ARROW +219D ; [*05A7.0020.0002] # RIGHTWARDS WAVE ARROW +219E ; [*05A8.0020.0002] # LEFTWARDS TWO HEADED ARROW +219F ; [*05A9.0020.0002] # UPWARDS TWO HEADED ARROW +21A0 ; [*05AA.0020.0002] # RIGHTWARDS TWO HEADED ARROW +21A1 ; [*05AB.0020.0002] # DOWNWARDS TWO HEADED ARROW +21A2 ; [*05AC.0020.0002] # LEFTWARDS ARROW WITH TAIL +21A3 ; [*05AD.0020.0002] # RIGHTWARDS ARROW WITH TAIL +21A4 ; [*05AE.0020.0002] # LEFTWARDS ARROW FROM BAR +21A5 ; [*05AF.0020.0002] # UPWARDS ARROW FROM BAR +21A6 ; [*05B0.0020.0002] # RIGHTWARDS ARROW FROM BAR +21A7 ; [*05B1.0020.0002] # DOWNWARDS ARROW FROM BAR +21A8 ; [*05B2.0020.0002] # UP DOWN ARROW WITH BASE +21A9 ; [*05B3.0020.0002] # LEFTWARDS ARROW WITH HOOK +21AA ; [*05B4.0020.0002] # RIGHTWARDS ARROW WITH HOOK +21AB ; [*05B5.0020.0002] # LEFTWARDS ARROW WITH LOOP +21AC ; [*05B6.0020.0002] # RIGHTWARDS ARROW WITH LOOP +21AD ; [*05B7.0020.0002] # LEFT RIGHT WAVE ARROW +21AE ; [*05A0.0020.0002][.0000.002F.0002] # LEFT RIGHT ARROW WITH STROKE +21AF ; [*05B8.0020.0002] # DOWNWARDS ZIGZAG ARROW +21B0 ; [*05B9.0020.0002] # UPWARDS ARROW WITH TIP LEFTWARDS +21B1 ; [*05BA.0020.0002] # UPWARDS ARROW WITH TIP RIGHTWARDS +21B2 ; [*05BB.0020.0002] # DOWNWARDS ARROW WITH TIP LEFTWARDS +21B3 ; [*05BC.0020.0002] # DOWNWARDS ARROW WITH TIP RIGHTWARDS +21B4 ; [*05BD.0020.0002] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS +21B5 ; [*05BE.0020.0002] # DOWNWARDS ARROW WITH CORNER LEFTWARDS +21B6 ; [*05BF.0020.0002] # ANTICLOCKWISE TOP SEMICIRCLE ARROW +21B7 ; [*05C0.0020.0002] # CLOCKWISE TOP SEMICIRCLE ARROW +21B8 ; [*05C1.0020.0002] # NORTH WEST ARROW TO LONG BAR +21B9 ; [*05C2.0020.0002] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA ; [*05C3.0020.0002] # ANTICLOCKWISE OPEN CIRCLE ARROW +21BB ; [*05C4.0020.0002] # CLOCKWISE OPEN CIRCLE ARROW +21BC ; [*05C5.0020.0002] # LEFTWARDS HARPOON WITH BARB UPWARDS +21BD ; [*05C6.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWNWARDS +21BE ; [*05C7.0020.0002] # UPWARDS HARPOON WITH BARB RIGHTWARDS +21BF ; [*05C8.0020.0002] # UPWARDS HARPOON WITH BARB LEFTWARDS +21C0 ; [*05C9.0020.0002] # RIGHTWARDS HARPOON WITH BARB UPWARDS +21C1 ; [*05CA.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS +21C2 ; [*05CB.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS +21C3 ; [*05CC.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFTWARDS +21C4 ; [*05CD.0020.0002] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW +21C5 ; [*05CE.0020.0002] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +21C6 ; [*05CF.0020.0002] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW +21C7 ; [*05D0.0020.0002] # LEFTWARDS PAIRED ARROWS +21C8 ; [*05D1.0020.0002] # UPWARDS PAIRED ARROWS +21C9 ; [*05D2.0020.0002] # RIGHTWARDS PAIRED ARROWS +21CA ; [*05D3.0020.0002] # DOWNWARDS PAIRED ARROWS +21CB ; [*05D4.0020.0002] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +21CC ; [*05D5.0020.0002] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +21CD ; [*05D6.0020.0002][.0000.002F.0002] # LEFTWARDS DOUBLE ARROW WITH STROKE +21CE ; [*05DA.0020.0002][.0000.002F.0002] # LEFT RIGHT DOUBLE ARROW WITH STROKE +21CF ; [*05D8.0020.0002][.0000.002F.0002] # RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0 ; [*05D6.0020.0002] # LEFTWARDS DOUBLE ARROW +21D1 ; [*05D7.0020.0002] # UPWARDS DOUBLE ARROW +21D2 ; [*05D8.0020.0002] # RIGHTWARDS DOUBLE ARROW +21D3 ; [*05D9.0020.0002] # DOWNWARDS DOUBLE ARROW +21D4 ; [*05DA.0020.0002] # LEFT RIGHT DOUBLE ARROW +21D5 ; [*05DB.0020.0002] # UP DOWN DOUBLE ARROW +21D6 ; [*05DC.0020.0002] # NORTH WEST DOUBLE ARROW +21D7 ; [*05DD.0020.0002] # NORTH EAST DOUBLE ARROW +21D8 ; [*05DE.0020.0002] # SOUTH EAST DOUBLE ARROW +21D9 ; [*05DF.0020.0002] # SOUTH WEST DOUBLE ARROW +21DA ; [*05E0.0020.0002] # LEFTWARDS TRIPLE ARROW +21DB ; [*05E1.0020.0002] # RIGHTWARDS TRIPLE ARROW +21DC ; [*05E2.0020.0002] # LEFTWARDS SQUIGGLE ARROW +21DD ; [*05E3.0020.0002] # RIGHTWARDS SQUIGGLE ARROW +21DE ; [*05E4.0020.0002] # UPWARDS ARROW WITH DOUBLE STROKE +21DF ; [*05E5.0020.0002] # DOWNWARDS ARROW WITH DOUBLE STROKE +21E0 ; [*05E6.0020.0002] # LEFTWARDS DASHED ARROW +21E1 ; [*05E7.0020.0002] # UPWARDS DASHED ARROW +21E2 ; [*05E8.0020.0002] # RIGHTWARDS DASHED ARROW +21E3 ; [*05E9.0020.0002] # DOWNWARDS DASHED ARROW +21E4 ; [*05EA.0020.0002] # LEFTWARDS ARROW TO BAR +21E5 ; [*05EB.0020.0002] # RIGHTWARDS ARROW TO BAR +21E6 ; [*05EC.0020.0002] # LEFTWARDS WHITE ARROW +21E7 ; [*05ED.0020.0002] # UPWARDS WHITE ARROW +21E8 ; [*05EE.0020.0002] # RIGHTWARDS WHITE ARROW +21E9 ; [*05EF.0020.0002] # DOWNWARDS WHITE ARROW +21EA ; [*05F0.0020.0002] # UPWARDS WHITE ARROW FROM BAR +21EB ; [*05F1.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL +21EC ; [*05F2.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR +21ED ; [*05F3.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR +21EE ; [*05F4.0020.0002] # UPWARDS WHITE DOUBLE ARROW +21EF ; [*05F5.0020.0002] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL +21F0 ; [*05F6.0020.0002] # RIGHTWARDS WHITE ARROW FROM WALL +21F1 ; [*05F7.0020.0002] # NORTH WEST ARROW TO CORNER +21F2 ; [*05F8.0020.0002] # SOUTH EAST ARROW TO CORNER +21F3 ; [*05F9.0020.0002] # UP DOWN WHITE ARROW +21F4 ; [*05FA.0020.0002] # RIGHT ARROW WITH SMALL CIRCLE +21F5 ; [*05FB.0020.0002] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +21F6 ; [*05FC.0020.0002] # THREE RIGHTWARDS ARROWS +21F7 ; [*05FD.0020.0002] # LEFTWARDS ARROW WITH VERTICAL STROKE +21F8 ; [*05FE.0020.0002] # RIGHTWARDS ARROW WITH VERTICAL STROKE +21F9 ; [*05FF.0020.0002] # LEFT RIGHT ARROW WITH VERTICAL STROKE +21FA ; [*0600.0020.0002] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FB ; [*0601.0020.0002] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FC ; [*0602.0020.0002] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE +21FD ; [*0603.0020.0002] # LEFTWARDS OPEN-HEADED ARROW +21FE ; [*0604.0020.0002] # RIGHTWARDS OPEN-HEADED ARROW +21FF ; [*0605.0020.0002] # LEFT RIGHT OPEN-HEADED ARROW +2200 ; [*0606.0020.0002] # FOR ALL +2201 ; [*0607.0020.0002] # COMPLEMENT +2202 ; [*0608.0020.0002] # PARTIAL DIFFERENTIAL +2203 ; [*0609.0020.0002] # THERE EXISTS +2204 ; [*0609.0020.0002][.0000.002F.0002] # THERE DOES NOT EXIST +2205 ; [*060A.0020.0002] # EMPTY SET +2206 ; [*060B.0020.0002] # INCREMENT +2207 ; [*060C.0020.0002] # NABLA +2208 ; [*060D.0020.0002] # ELEMENT OF +2209 ; [*060D.0020.0002][.0000.002F.0002] # NOT AN ELEMENT OF +220A ; [*060E.0020.0002] # SMALL ELEMENT OF +220B ; [*060F.0020.0002] # CONTAINS AS MEMBER +220C ; [*060F.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS MEMBER +220D ; [*0610.0020.0002] # SMALL CONTAINS AS MEMBER +220E ; [*0612.0020.0002] # END OF PROOF +220F ; [*0613.0020.0002] # N-ARY PRODUCT +2210 ; [*0614.0020.0002] # N-ARY COPRODUCT +2211 ; [*0615.0020.0002] # N-ARY SUMMATION +2212 ; [*0621.0020.0002] # MINUS SIGN +2213 ; [*0623.0020.0002] # MINUS-OR-PLUS SIGN +2214 ; [*0624.0020.0002] # DOT PLUS +2215 ; [*0625.0020.0002] # DIVISION SLASH +2216 ; [*0627.0020.0002] # SET MINUS +2217 ; [*0628.0020.0002] # ASTERISK OPERATOR +2218 ; [*0629.0020.0002] # RING OPERATOR +2219 ; [*062A.0020.0002] # BULLET OPERATOR +221A ; [*062B.0020.0002] # SQUARE ROOT +221B ; [*062C.0020.0002] # CUBE ROOT +221C ; [*062E.0020.0002] # FOURTH ROOT +221D ; [*0630.0020.0002] # PROPORTIONAL TO +221E ; [*0631.0020.0002] # INFINITY +221F ; [*0632.0020.0002] # RIGHT ANGLE +2220 ; [*0633.0020.0002] # ANGLE +2221 ; [*0634.0020.0002] # MEASURED ANGLE +2222 ; [*0635.0020.0002] # SPHERICAL ANGLE +2223 ; [*0636.0020.0002] # DIVIDES +2224 ; [*0636.0020.0002][.0000.002F.0002] # DOES NOT DIVIDE +2225 ; [*0637.0020.0002] # PARALLEL TO +2226 ; [*0637.0020.0002][.0000.002F.0002] # NOT PARALLEL TO +2227 ; [*0638.0020.0002] # LOGICAL AND +2228 ; [*0639.0020.0002] # LOGICAL OR +2229 ; [*063A.0020.0002] # INTERSECTION +222A ; [*063B.0020.0002] # UNION +222B ; [*063C.0020.0002] # INTEGRAL +222C ; [*063C.0020.0004][*063C.0020.0004] # DOUBLE INTEGRAL +222D ; [*063C.0020.0004][*063C.0020.0004][*063C.0020.0004] # TRIPLE INTEGRAL +222E ; [*063D.0020.0002] # CONTOUR INTEGRAL +222F ; [*063D.0020.0004][*063D.0020.0004] # SURFACE INTEGRAL +2230 ; [*063D.0020.0004][*063D.0020.0004][*063D.0020.0004] # VOLUME INTEGRAL +2231 ; [*063E.0020.0002] # CLOCKWISE INTEGRAL +2232 ; [*063F.0020.0002] # CLOCKWISE CONTOUR INTEGRAL +2233 ; [*0640.0020.0002] # ANTICLOCKWISE CONTOUR INTEGRAL +2234 ; [*0641.0020.0002] # THEREFORE +2235 ; [*0642.0020.0002] # BECAUSE +2236 ; [*0643.0020.0002] # RATIO +2237 ; [*0644.0020.0002] # PROPORTION +2238 ; [*0645.0020.0002] # DOT MINUS +2239 ; [*0646.0020.0002] # EXCESS +223A ; [*0647.0020.0002] # GEOMETRIC PROPORTION +223B ; [*0648.0020.0002] # HOMOTHETIC +223C ; [*0649.0020.0002] # TILDE OPERATOR +223D ; [*064A.0020.0002] # REVERSED TILDE +223E ; [*064B.0020.0002] # INVERTED LAZY S +223F ; [*064C.0020.0002] # SINE WAVE +2240 ; [*064D.0020.0002] # WREATH PRODUCT +2241 ; [*0649.0020.0002][.0000.002F.0002] # NOT TILDE +2242 ; [*064E.0020.0002] # MINUS TILDE +2243 ; [*064F.0020.0002] # ASYMPTOTICALLY EQUAL TO +2244 ; [*064F.0020.0002][.0000.002F.0002] # NOT ASYMPTOTICALLY EQUAL TO +2245 ; [*0650.0020.0002] # APPROXIMATELY EQUAL TO +2246 ; [*0651.0020.0002] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +2247 ; [*0650.0020.0002][.0000.002F.0002] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248 ; [*0652.0020.0002] # ALMOST EQUAL TO +2249 ; [*0652.0020.0002][.0000.002F.0002] # NOT ALMOST EQUAL TO +224A ; [*0653.0020.0002] # ALMOST EQUAL OR EQUAL TO +224B ; [*0654.0020.0002] # TRIPLE TILDE +224C ; [*0655.0020.0002] # ALL EQUAL TO +224D ; [*0656.0020.0002] # EQUIVALENT TO +224E ; [*0657.0020.0002] # GEOMETRICALLY EQUIVALENT TO +224F ; [*0658.0020.0002] # DIFFERENCE BETWEEN +2250 ; [*0659.0020.0002] # APPROACHES THE LIMIT +2251 ; [*065A.0020.0002] # GEOMETRICALLY EQUAL TO +2252 ; [*065B.0020.0002] # APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253 ; [*065C.0020.0002] # IMAGE OF OR APPROXIMATELY EQUAL TO +2254 ; [*065D.0020.0002] # COLON EQUALS +2255 ; [*065E.0020.0002] # EQUALS COLON +2256 ; [*065F.0020.0002] # RING IN EQUAL TO +2257 ; [*0660.0020.0002] # RING EQUAL TO +2258 ; [*0661.0020.0002] # CORRESPONDS TO +2259 ; [*0662.0020.0002] # ESTIMATES +225A ; [*0663.0020.0002] # EQUIANGULAR TO +225B ; [*0664.0020.0002] # STAR EQUALS +225C ; [*0665.0020.0002] # DELTA EQUAL TO +225D ; [*0666.0020.0002] # EQUAL TO BY DEFINITION +225E ; [*0667.0020.0002] # MEASURED BY +225F ; [*0668.0020.0002] # QUESTIONED EQUAL TO +2260 ; [*061B.0020.0002][.0000.002F.0002] # NOT EQUAL TO +2261 ; [*0669.0020.0002] # IDENTICAL TO +2262 ; [*0669.0020.0002][.0000.002F.0002] # NOT IDENTICAL TO +2263 ; [*066A.0020.0002] # STRICTLY EQUIVALENT TO +2264 ; [*066B.0020.0002] # LESS-THAN OR EQUAL TO +2265 ; [*066C.0020.0002] # GREATER-THAN OR EQUAL TO +2266 ; [*066D.0020.0002] # LESS-THAN OVER EQUAL TO +2267 ; [*066E.0020.0002] # GREATER-THAN OVER EQUAL TO +2268 ; [*066F.0020.0002] # LESS-THAN BUT NOT EQUAL TO +2269 ; [*0670.0020.0002] # GREATER-THAN BUT NOT EQUAL TO +226A ; [*0671.0020.0002] # MUCH LESS-THAN +226B ; [*0672.0020.0002] # MUCH GREATER-THAN +226C ; [*0673.0020.0002] # BETWEEN +226D ; [*0656.0020.0002][.0000.002F.0002] # NOT EQUIVALENT TO +226E ; [*061A.0020.0002][.0000.002F.0002] # NOT LESS-THAN +226F ; [*061C.0020.0002][.0000.002F.0002] # NOT GREATER-THAN +2270 ; [*066B.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUAL TO +2271 ; [*066C.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUAL TO +2272 ; [*0674.0020.0002] # LESS-THAN OR EQUIVALENT TO +2273 ; [*0675.0020.0002] # GREATER-THAN OR EQUIVALENT TO +2274 ; [*0674.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUIVALENT TO +2275 ; [*0675.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUIVALENT TO +2276 ; [*0676.0020.0002] # LESS-THAN OR GREATER-THAN +2277 ; [*0677.0020.0002] # GREATER-THAN OR LESS-THAN +2278 ; [*0676.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR GREATER-THAN +2279 ; [*0677.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR LESS-THAN +227A ; [*0678.0020.0002] # PRECEDES +227B ; [*0679.0020.0002] # SUCCEEDS +227C ; [*067A.0020.0002] # PRECEDES OR EQUAL TO +227D ; [*067B.0020.0002] # SUCCEEDS OR EQUAL TO +227E ; [*067C.0020.0002] # PRECEDES OR EQUIVALENT TO +227F ; [*067D.0020.0002] # SUCCEEDS OR EQUIVALENT TO +2280 ; [*0678.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE +2281 ; [*0679.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED +2282 ; [*067E.0020.0002] # SUBSET OF +2283 ; [*067F.0020.0002] # SUPERSET OF +2284 ; [*067E.0020.0002][.0000.002F.0002] # NOT A SUBSET OF +2285 ; [*067F.0020.0002][.0000.002F.0002] # NOT A SUPERSET OF +2286 ; [*0680.0020.0002] # SUBSET OF OR EQUAL TO +2287 ; [*0681.0020.0002] # SUPERSET OF OR EQUAL TO +2288 ; [*0680.0020.0002][.0000.002F.0002] # NEITHER A SUBSET OF NOR EQUAL TO +2289 ; [*0681.0020.0002][.0000.002F.0002] # NEITHER A SUPERSET OF NOR EQUAL TO +228A ; [*0682.0020.0002] # SUBSET OF WITH NOT EQUAL TO +228B ; [*0683.0020.0002] # SUPERSET OF WITH NOT EQUAL TO +228C ; [*0684.0020.0002] # MULTISET +228D ; [*0685.0020.0002] # MULTISET MULTIPLICATION +228E ; [*0686.0020.0002] # MULTISET UNION +228F ; [*0687.0020.0002] # SQUARE IMAGE OF +2290 ; [*0688.0020.0002] # SQUARE ORIGINAL OF +2291 ; [*0689.0020.0002] # SQUARE IMAGE OF OR EQUAL TO +2292 ; [*068A.0020.0002] # SQUARE ORIGINAL OF OR EQUAL TO +2293 ; [*068B.0020.0002] # SQUARE CAP +2294 ; [*068C.0020.0002] # SQUARE CUP +2295 ; [*068D.0020.0002] # CIRCLED PLUS +2296 ; [*068E.0020.0002] # CIRCLED MINUS +2297 ; [*068F.0020.0002] # CIRCLED TIMES +2298 ; [*0690.0020.0002] # CIRCLED DIVISION SLASH +2299 ; [*0691.0020.0002] # CIRCLED DOT OPERATOR +229A ; [*0692.0020.0002] # CIRCLED RING OPERATOR +229B ; [*0693.0020.0002] # CIRCLED ASTERISK OPERATOR +229C ; [*0694.0020.0002] # CIRCLED EQUALS +229D ; [*0695.0020.0002] # CIRCLED DASH +229E ; [*0696.0020.0002] # SQUARED PLUS +229F ; [*0697.0020.0002] # SQUARED MINUS +22A0 ; [*0698.0020.0002] # SQUARED TIMES +22A1 ; [*0699.0020.0002] # SQUARED DOT OPERATOR +22A2 ; [*069A.0020.0002] # RIGHT TACK +22A3 ; [*069B.0020.0002] # LEFT TACK +22A4 ; [*069C.0020.0002] # DOWN TACK +22A5 ; [*069D.0020.0002] # UP TACK +22A6 ; [*069E.0020.0002] # ASSERTION +22A7 ; [*069F.0020.0002] # MODELS +22A8 ; [*06A0.0020.0002] # TRUE +22A9 ; [*06A1.0020.0002] # FORCES +22AA ; [*06A2.0020.0002] # TRIPLE VERTICAL BAR RIGHT TURNSTILE +22AB ; [*06A3.0020.0002] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22AC ; [*069A.0020.0002][.0000.002F.0002] # DOES NOT PROVE +22AD ; [*06A0.0020.0002][.0000.002F.0002] # NOT TRUE +22AE ; [*06A1.0020.0002][.0000.002F.0002] # DOES NOT FORCE +22AF ; [*06A3.0020.0002][.0000.002F.0002] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22B0 ; [*06A4.0020.0002] # PRECEDES UNDER RELATION +22B1 ; [*06A5.0020.0002] # SUCCEEDS UNDER RELATION +22B2 ; [*06A6.0020.0002] # NORMAL SUBGROUP OF +22B3 ; [*06A7.0020.0002] # CONTAINS AS NORMAL SUBGROUP +22B4 ; [*06A8.0020.0002] # NORMAL SUBGROUP OF OR EQUAL TO +22B5 ; [*06A9.0020.0002] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6 ; [*06AA.0020.0002] # ORIGINAL OF +22B7 ; [*06AB.0020.0002] # IMAGE OF +22B8 ; [*06AC.0020.0002] # MULTIMAP +22B9 ; [*06AD.0020.0002] # HERMITIAN CONJUGATE MATRIX +22BA ; [*06AE.0020.0002] # INTERCALATE +22BB ; [*06AF.0020.0002] # XOR +22BC ; [*06B0.0020.0002] # NAND +22BD ; [*06B2.0020.0002] # NOR +22BE ; [*06B3.0020.0002] # RIGHT ANGLE WITH ARC +22BF ; [*06B4.0020.0002] # RIGHT TRIANGLE +22C0 ; [*06B5.0020.0002] # N-ARY LOGICAL AND +22C1 ; [*06B6.0020.0002] # N-ARY LOGICAL OR +22C2 ; [*06B7.0020.0002] # N-ARY INTERSECTION +22C3 ; [*06B8.0020.0002] # N-ARY UNION +22C4 ; [*06B9.0020.0002] # DIAMOND OPERATOR +22C5 ; [*06BA.0020.0002] # DOT OPERATOR +22C6 ; [*06BB.0020.0002] # STAR OPERATOR +22C7 ; [*06BC.0020.0002] # DIVISION TIMES +22C8 ; [*06BD.0020.0002] # BOWTIE +22C9 ; [*06BE.0020.0002] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA ; [*06BF.0020.0002] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB ; [*06C0.0020.0002] # LEFT SEMIDIRECT PRODUCT +22CC ; [*06C1.0020.0002] # RIGHT SEMIDIRECT PRODUCT +22CD ; [*06C2.0020.0002] # REVERSED TILDE EQUALS +22CE ; [*06C3.0020.0002] # CURLY LOGICAL OR +22CF ; [*06C4.0020.0002] # CURLY LOGICAL AND +22D0 ; [*06C5.0020.0002] # DOUBLE SUBSET +22D1 ; [*06C6.0020.0002] # DOUBLE SUPERSET +22D2 ; [*06C7.0020.0002] # DOUBLE INTERSECTION +22D3 ; [*06C8.0020.0002] # DOUBLE UNION +22D4 ; [*06C9.0020.0002] # PITCHFORK +22D5 ; [*06CA.0020.0002] # EQUAL AND PARALLEL TO +22D6 ; [*06CB.0020.0002] # LESS-THAN WITH DOT +22D7 ; [*06CC.0020.0002] # GREATER-THAN WITH DOT +22D8 ; [*06CD.0020.0002] # VERY MUCH LESS-THAN +22D9 ; [*06CE.0020.0002] # VERY MUCH GREATER-THAN +22DA ; [*06CF.0020.0002] # LESS-THAN EQUAL TO OR GREATER-THAN +22DB ; [*06D0.0020.0002] # GREATER-THAN EQUAL TO OR LESS-THAN +22DC ; [*06D1.0020.0002] # EQUAL TO OR LESS-THAN +22DD ; [*06D2.0020.0002] # EQUAL TO OR GREATER-THAN +22DE ; [*06D3.0020.0002] # EQUAL TO OR PRECEDES +22DF ; [*06D4.0020.0002] # EQUAL TO OR SUCCEEDS +22E0 ; [*067A.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE OR EQUAL +22E1 ; [*067B.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED OR EQUAL +22E2 ; [*0689.0020.0002][.0000.002F.0002] # NOT SQUARE IMAGE OF OR EQUAL TO +22E3 ; [*068A.0020.0002][.0000.002F.0002] # NOT SQUARE ORIGINAL OF OR EQUAL TO +22E4 ; [*06D5.0020.0002] # SQUARE IMAGE OF OR NOT EQUAL TO +22E5 ; [*06D6.0020.0002] # SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6 ; [*06D7.0020.0002] # LESS-THAN BUT NOT EQUIVALENT TO +22E7 ; [*06D8.0020.0002] # GREATER-THAN BUT NOT EQUIVALENT TO +22E8 ; [*06D9.0020.0002] # PRECEDES BUT NOT EQUIVALENT TO +22E9 ; [*06DA.0020.0002] # SUCCEEDS BUT NOT EQUIVALENT TO +22EA ; [*06A6.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF +22EB ; [*06A7.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC ; [*06A8.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED ; [*06A9.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +22EE ; [*06DB.0020.0002] # VERTICAL ELLIPSIS +22EF ; [*06DC.0020.0002] # MIDLINE HORIZONTAL ELLIPSIS +22F0 ; [*06DD.0020.0002] # UP RIGHT DIAGONAL ELLIPSIS +22F1 ; [*06DE.0020.0002] # DOWN RIGHT DIAGONAL ELLIPSIS +22F2 ; [*06DF.0020.0002] # ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3 ; [*06E0.0020.0002] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4 ; [*06E1.0020.0002] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F5 ; [*06E2.0020.0002] # ELEMENT OF WITH DOT ABOVE +22F6 ; [*06E3.0020.0002] # ELEMENT OF WITH OVERBAR +22F7 ; [*06E4.0020.0002] # SMALL ELEMENT OF WITH OVERBAR +22F8 ; [*06E5.0020.0002] # ELEMENT OF WITH UNDERBAR +22F9 ; [*06E6.0020.0002] # ELEMENT OF WITH TWO HORIZONTAL STROKES +22FA ; [*06E7.0020.0002] # CONTAINS WITH LONG HORIZONTAL STROKE +22FB ; [*06E8.0020.0002] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC ; [*06E9.0020.0002] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD ; [*06EA.0020.0002] # CONTAINS WITH OVERBAR +22FE ; [*06EB.0020.0002] # SMALL CONTAINS WITH OVERBAR +22FF ; [*06EC.0020.0002] # Z NOTATION BAG MEMBERSHIP +2300 ; [*06ED.0020.0002] # DIAMETER SIGN +2301 ; [*06EE.0020.0002] # ELECTRIC ARROW +2302 ; [*06EF.0020.0002] # HOUSE +2303 ; [*06F0.0020.0002] # UP ARROWHEAD +2304 ; [*06F1.0020.0002] # DOWN ARROWHEAD +2305 ; [*06F2.0020.0002] # PROJECTIVE +2306 ; [*06F3.0020.0002] # PERSPECTIVE +2307 ; [*06F4.0020.0002] # WAVY LINE +2308 ; [*0325.0020.0002] # LEFT CEILING +2309 ; [*0326.0020.0002] # RIGHT CEILING +230A ; [*0327.0020.0002] # LEFT FLOOR +230B ; [*0328.0020.0002] # RIGHT FLOOR +230C ; [*06F5.0020.0002] # BOTTOM RIGHT CROP +230D ; [*06F6.0020.0002] # BOTTOM LEFT CROP +230E ; [*06F7.0020.0002] # TOP RIGHT CROP +230F ; [*06F8.0020.0002] # TOP LEFT CROP +2310 ; [*06F9.0020.0002] # REVERSED NOT SIGN +2311 ; [*06FA.0020.0002] # SQUARE LOZENGE +2312 ; [*06FB.0020.0002] # ARC +2313 ; [*06FC.0020.0002] # SEGMENT +2314 ; [*06FD.0020.0002] # SECTOR +2315 ; [*06FE.0020.0002] # TELEPHONE RECORDER +2316 ; [*06FF.0020.0002] # POSITION INDICATOR +2317 ; [*0700.0020.0002] # VIEWDATA SQUARE +2318 ; [*0701.0020.0002] # PLACE OF INTEREST SIGN +2319 ; [*0702.0020.0002] # TURNED NOT SIGN +231A ; [*0703.0020.0002] # WATCH +231B ; [*0704.0020.0002] # HOURGLASS +231C ; [*0705.0020.0002] # TOP LEFT CORNER +231D ; [*0706.0020.0002] # TOP RIGHT CORNER +231E ; [*0707.0020.0002] # BOTTOM LEFT CORNER +231F ; [*0708.0020.0002] # BOTTOM RIGHT CORNER +2320 ; [*0709.0020.0002] # TOP HALF INTEGRAL +2321 ; [*070A.0020.0002] # BOTTOM HALF INTEGRAL +2322 ; [*070B.0020.0002] # FROWN +2323 ; [*070C.0020.0002] # SMILE +2324 ; [*070D.0020.0002] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS +2325 ; [*070E.0020.0002] # OPTION KEY +2326 ; [*070F.0020.0002] # ERASE TO THE RIGHT +2327 ; [*0710.0020.0002] # X IN A RECTANGLE BOX +2328 ; [*0711.0020.0002] # KEYBOARD +2329 ; [*036F.0020.0002] # LEFT-POINTING ANGLE BRACKET +232A ; [*0370.0020.0002] # RIGHT-POINTING ANGLE BRACKET +232B ; [*0712.0020.0002] # ERASE TO THE LEFT +232C ; [*0713.0020.0002] # BENZENE RING +232D ; [*0714.0020.0002] # CYLINDRICITY +232E ; [*0715.0020.0002] # ALL AROUND-PROFILE +232F ; [*0716.0020.0002] # SYMMETRY +2330 ; [*0717.0020.0002] # TOTAL RUNOUT +2331 ; [*0718.0020.0002] # DIMENSION ORIGIN +2332 ; [*0719.0020.0002] # CONICAL TAPER +2333 ; [*071A.0020.0002] # SLOPE +2334 ; [*071B.0020.0002] # COUNTERBORE +2335 ; [*071C.0020.0002] # COUNTERSINK +2336 ; [*071D.0020.0002] # APL FUNCTIONAL SYMBOL I-BEAM +2337 ; [*071E.0020.0002] # APL FUNCTIONAL SYMBOL SQUISH QUAD +2338 ; [*071F.0020.0002] # APL FUNCTIONAL SYMBOL QUAD EQUAL +2339 ; [*0720.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIVIDE +233A ; [*0721.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIAMOND +233B ; [*0722.0020.0002] # APL FUNCTIONAL SYMBOL QUAD JOT +233C ; [*0723.0020.0002] # APL FUNCTIONAL SYMBOL QUAD CIRCLE +233D ; [*0724.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STILE +233E ; [*0725.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE JOT +233F ; [*0726.0020.0002] # APL FUNCTIONAL SYMBOL SLASH BAR +2340 ; [*0727.0020.0002] # APL FUNCTIONAL SYMBOL BACKSLASH BAR +2341 ; [*0728.0020.0002] # APL FUNCTIONAL SYMBOL QUAD SLASH +2342 ; [*0729.0020.0002] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH +2343 ; [*072A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN +2344 ; [*072B.0020.0002] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN +2345 ; [*072C.0020.0002] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE +2346 ; [*072D.0020.0002] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE +2347 ; [*072E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW +2348 ; [*072F.0020.0002] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW +2349 ; [*0730.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH +234A ; [*0731.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR +234B ; [*0732.0020.0002] # APL FUNCTIONAL SYMBOL DELTA STILE +234C ; [*0733.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET +234D ; [*0734.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DELTA +234E ; [*0735.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK JOT +234F ; [*0736.0020.0002] # APL FUNCTIONAL SYMBOL UPWARDS VANE +2350 ; [*0737.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +2351 ; [*0738.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR +2352 ; [*0739.0020.0002] # APL FUNCTIONAL SYMBOL DEL STILE +2353 ; [*073A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UP CARET +2354 ; [*073B.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DEL +2355 ; [*073C.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK JOT +2356 ; [*073D.0020.0002] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE +2357 ; [*073E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +2358 ; [*073F.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR +2359 ; [*0740.0020.0002] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR +235A ; [*0741.0020.0002] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR +235B ; [*0742.0020.0002] # APL FUNCTIONAL SYMBOL JOT UNDERBAR +235C ; [*0743.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR +235D ; [*0744.0020.0002] # APL FUNCTIONAL SYMBOL UP SHOE JOT +235E ; [*0745.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE QUAD +235F ; [*0746.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STAR +2360 ; [*0747.0020.0002] # APL FUNCTIONAL SYMBOL QUAD COLON +2361 ; [*0748.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS +2362 ; [*0749.0020.0002] # APL FUNCTIONAL SYMBOL DEL DIAERESIS +2363 ; [*074A.0020.0002] # APL FUNCTIONAL SYMBOL STAR DIAERESIS +2364 ; [*074B.0020.0002] # APL FUNCTIONAL SYMBOL JOT DIAERESIS +2365 ; [*074C.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS +2366 ; [*074D.0020.0002] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE +2367 ; [*074E.0020.0002] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE +2368 ; [*074F.0020.0002] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS +2369 ; [*0750.0020.0002] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS +236A ; [*0751.0020.0002] # APL FUNCTIONAL SYMBOL COMMA BAR +236B ; [*0752.0020.0002] # APL FUNCTIONAL SYMBOL DEL TILDE +236C ; [*0753.0020.0002] # APL FUNCTIONAL SYMBOL ZILDE +236D ; [*0754.0020.0002] # APL FUNCTIONAL SYMBOL STILE TILDE +236E ; [*0755.0020.0002] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR +236F ; [*0756.0020.0002] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL +2370 ; [*0757.0020.0002] # APL FUNCTIONAL SYMBOL QUAD QUESTION +2371 ; [*0758.0020.0002] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE +2372 ; [*0759.0020.0002] # APL FUNCTIONAL SYMBOL UP CARET TILDE +2373 ; [*075A.0020.0002] # APL FUNCTIONAL SYMBOL IOTA +2374 ; [*075B.0020.0002] # APL FUNCTIONAL SYMBOL RHO +2375 ; [*075C.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA +2376 ; [*075D.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR +2377 ; [*075E.0020.0002] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR +2378 ; [*075F.0020.0002] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR +2379 ; [*0760.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR +237A ; [*0761.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA +237B ; [*0762.0020.0002] # NOT CHECK MARK +237C ; [*0763.0020.0002] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D ; [*0764.0020.0002] # SHOULDERED OPEN BOX +237E ; [*0765.0020.0002] # BELL SYMBOL +237F ; [*0766.0020.0002] # VERTICAL LINE WITH MIDDLE DOT +2380 ; [*0767.0020.0002] # INSERTION SYMBOL +2381 ; [*0768.0020.0002] # CONTINUOUS UNDERLINE SYMBOL +2382 ; [*0769.0020.0002] # DISCONTINUOUS UNDERLINE SYMBOL +2383 ; [*076A.0020.0002] # EMPHASIS SYMBOL +2384 ; [*076B.0020.0002] # COMPOSITION SYMBOL +2385 ; [*076C.0020.0002] # WHITE SQUARE WITH CENTRE VERTICAL LINE +2386 ; [*076D.0020.0002] # ENTER SYMBOL +2387 ; [*076E.0020.0002] # ALTERNATIVE KEY SYMBOL +2388 ; [*076F.0020.0002] # HELM SYMBOL +2389 ; [*0770.0020.0002] # CIRCLED HORIZONTAL BAR WITH NOTCH +238A ; [*0771.0020.0002] # CIRCLED TRIANGLE DOWN +238B ; [*0772.0020.0002] # BROKEN CIRCLE WITH NORTHWEST ARROW +238C ; [*0773.0020.0002] # UNDO SYMBOL +238D ; [*0774.0020.0002] # MONOSTABLE SYMBOL +238E ; [*0775.0020.0002] # HYSTERESIS SYMBOL +238F ; [*0776.0020.0002] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL +2390 ; [*0777.0020.0002] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL +2391 ; [*0778.0020.0002] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL +2392 ; [*0779.0020.0002] # PASSIVE-PULL-UP-OUTPUT SYMBOL +2393 ; [*077A.0020.0002] # DIRECT CURRENT SYMBOL FORM TWO +2394 ; [*077B.0020.0002] # SOFTWARE-FUNCTION SYMBOL +2395 ; [*077C.0020.0002] # APL FUNCTIONAL SYMBOL QUAD +2396 ; [*077D.0020.0002] # DECIMAL SEPARATOR KEY SYMBOL +2397 ; [*077E.0020.0002] # PREVIOUS PAGE +2398 ; [*077F.0020.0002] # NEXT PAGE +2399 ; [*0780.0020.0002] # PRINT SCREEN SYMBOL +239A ; [*0781.0020.0002] # CLEAR SCREEN SYMBOL +239B ; [*0782.0020.0002] # LEFT PARENTHESIS UPPER HOOK +239C ; [*0783.0020.0002] # LEFT PARENTHESIS EXTENSION +239D ; [*0784.0020.0002] # LEFT PARENTHESIS LOWER HOOK +239E ; [*0785.0020.0002] # RIGHT PARENTHESIS UPPER HOOK +239F ; [*0786.0020.0002] # RIGHT PARENTHESIS EXTENSION +23A0 ; [*0787.0020.0002] # RIGHT PARENTHESIS LOWER HOOK +23A1 ; [*0788.0020.0002] # LEFT SQUARE BRACKET UPPER CORNER +23A2 ; [*0789.0020.0002] # LEFT SQUARE BRACKET EXTENSION +23A3 ; [*078A.0020.0002] # LEFT SQUARE BRACKET LOWER CORNER +23A4 ; [*078B.0020.0002] # RIGHT SQUARE BRACKET UPPER CORNER +23A5 ; [*078C.0020.0002] # RIGHT SQUARE BRACKET EXTENSION +23A6 ; [*078D.0020.0002] # RIGHT SQUARE BRACKET LOWER CORNER +23A7 ; [*078E.0020.0002] # LEFT CURLY BRACKET UPPER HOOK +23A8 ; [*078F.0020.0002] # LEFT CURLY BRACKET MIDDLE PIECE +23A9 ; [*0790.0020.0002] # LEFT CURLY BRACKET LOWER HOOK +23AA ; [*0791.0020.0002] # CURLY BRACKET EXTENSION +23AB ; [*0792.0020.0002] # RIGHT CURLY BRACKET UPPER HOOK +23AC ; [*0793.0020.0002] # RIGHT CURLY BRACKET MIDDLE PIECE +23AD ; [*0794.0020.0002] # RIGHT CURLY BRACKET LOWER HOOK +23AE ; [*0795.0020.0002] # INTEGRAL EXTENSION +23AF ; [*0796.0020.0002] # HORIZONTAL LINE EXTENSION +23B0 ; [*0797.0020.0002] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +23B1 ; [*0798.0020.0002] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +23B2 ; [*0799.0020.0002] # SUMMATION TOP +23B3 ; [*079A.0020.0002] # SUMMATION BOTTOM +23B4 ; [*079B.0020.0002] # TOP SQUARE BRACKET +23B5 ; [*079C.0020.0002] # BOTTOM SQUARE BRACKET +23B6 ; [*079D.0020.0002] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7 ; [*079E.0020.0002] # RADICAL SYMBOL BOTTOM +23B8 ; [*079F.0020.0002] # LEFT VERTICAL BOX LINE +23B9 ; [*07A0.0020.0002] # RIGHT VERTICAL BOX LINE +23BA ; [*07A1.0020.0002] # HORIZONTAL SCAN LINE-1 +23BB ; [*07A2.0020.0002] # HORIZONTAL SCAN LINE-3 +23BC ; [*07A3.0020.0002] # HORIZONTAL SCAN LINE-7 +23BD ; [*07A4.0020.0002] # HORIZONTAL SCAN LINE-9 +23BE ; [*07A5.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT +23BF ; [*07A6.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT +23C0 ; [*07A7.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE +23C1 ; [*07A8.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE +23C2 ; [*07A9.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE +23C3 ; [*07AA.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE +23C4 ; [*07AB.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE +23C5 ; [*07AC.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE +23C6 ; [*07AD.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE +23C7 ; [*07AE.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE +23C8 ; [*07AF.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE +23C9 ; [*07B0.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL +23CA ; [*07B1.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL +23CB ; [*07B2.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT +23CC ; [*07B3.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT +23CD ; [*07B4.0020.0002] # SQUARE FOOT +23CE ; [*07B5.0020.0002] # RETURN SYMBOL +23CF ; [*07B6.0020.0002] # EJECT SYMBOL +23D0 ; [*07B7.0020.0002] # VERTICAL LINE EXTENSION +23D1 ; [*07B8.0020.0002] # METRICAL BREVE +23D2 ; [*07B9.0020.0002] # METRICAL LONG OVER SHORT +23D3 ; [*07BA.0020.0002] # METRICAL SHORT OVER LONG +23D4 ; [*07BB.0020.0002] # METRICAL LONG OVER TWO SHORTS +23D5 ; [*07BC.0020.0002] # METRICAL TWO SHORTS OVER LONG +23D6 ; [*07BD.0020.0002] # METRICAL TWO SHORTS JOINED +23D7 ; [*07BE.0020.0002] # METRICAL TRISEME +23D8 ; [*07BF.0020.0002] # METRICAL TETRASEME +23D9 ; [*07C0.0020.0002] # METRICAL PENTASEME +23DA ; [*07C1.0020.0002] # EARTH GROUND +23DB ; [*07C2.0020.0002] # FUSE +23DC ; [*07C3.0020.0002] # TOP PARENTHESIS +23DD ; [*07C4.0020.0002] # BOTTOM PARENTHESIS +23DE ; [*07C5.0020.0002] # TOP CURLY BRACKET +23DF ; [*07C6.0020.0002] # BOTTOM CURLY BRACKET +23E0 ; [*07C7.0020.0002] # TOP TORTOISE SHELL BRACKET +23E1 ; [*07C8.0020.0002] # BOTTOM TORTOISE SHELL BRACKET +23E2 ; [*07C9.0020.0002] # WHITE TRAPEZIUM +23E3 ; [*07CA.0020.0002] # BENZENE RING WITH CIRCLE +23E4 ; [*07CB.0020.0002] # STRAIGHTNESS +23E5 ; [*07CC.0020.0002] # FLATNESS +23E6 ; [*07CD.0020.0002] # AC CURRENT +23E7 ; [*07CE.0020.0002] # ELECTRICAL INTERSECTION +23E8 ; [*07CF.0020.0002] # DECIMAL EXPONENT SYMBOL +23E9 ; [*07D0.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE +23EA ; [*07D1.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE +23EB ; [*07D2.0020.0002] # BLACK UP-POINTING DOUBLE TRIANGLE +23EC ; [*07D3.0020.0002] # BLACK DOWN-POINTING DOUBLE TRIANGLE +23ED ; [*07D4.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR +23EE ; [*07D5.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR +23EF ; [*07D6.0020.0002] # BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +23F0 ; [*07D7.0020.0002] # ALARM CLOCK +23F1 ; [*07D8.0020.0002] # STOPWATCH +23F2 ; [*07D9.0020.0002] # TIMER CLOCK +23F3 ; [*07DA.0020.0002] # HOURGLASS WITH FLOWING SAND +23F4 ; [*07DB.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE +23F5 ; [*07DC.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE +23F6 ; [*07DD.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE +23F7 ; [*07DE.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE +23F8 ; [*07DF.0020.0002] # DOUBLE VERTICAL BAR +23F9 ; [*07E0.0020.0002] # BLACK SQUARE FOR STOP +23FA ; [*07E1.0020.0002] # BLACK CIRCLE FOR RECORD +23FB ; [*07E2.0020.0002] # POWER SYMBOL +23FC ; [*07E3.0020.0002] # POWER ON-OFF SYMBOL +23FD ; [*07E4.0020.0002] # POWER ON SYMBOL +23FE ; [*07E5.0020.0002] # POWER SLEEP SYMBOL +2400 ; [*07E6.0020.0002] # SYMBOL FOR NULL +2401 ; [*07E7.0020.0002] # SYMBOL FOR START OF HEADING +2402 ; [*07E8.0020.0002] # SYMBOL FOR START OF TEXT +2403 ; [*07E9.0020.0002] # SYMBOL FOR END OF TEXT +2404 ; [*07EA.0020.0002] # SYMBOL FOR END OF TRANSMISSION +2405 ; [*07EB.0020.0002] # SYMBOL FOR ENQUIRY +2406 ; [*07EC.0020.0002] # SYMBOL FOR ACKNOWLEDGE +2407 ; [*07ED.0020.0002] # SYMBOL FOR BELL +2408 ; [*07EE.0020.0002] # SYMBOL FOR BACKSPACE +2409 ; [*07EF.0020.0002] # SYMBOL FOR HORIZONTAL TABULATION +240A ; [*07F0.0020.0002] # SYMBOL FOR LINE FEED +240B ; [*07F1.0020.0002] # SYMBOL FOR VERTICAL TABULATION +240C ; [*07F2.0020.0002] # SYMBOL FOR FORM FEED +240D ; [*07F3.0020.0002] # SYMBOL FOR CARRIAGE RETURN +240E ; [*07F4.0020.0002] # SYMBOL FOR SHIFT OUT +240F ; [*07F5.0020.0002] # SYMBOL FOR SHIFT IN +2410 ; [*07F6.0020.0002] # SYMBOL FOR DATA LINK ESCAPE +2411 ; [*07F7.0020.0002] # SYMBOL FOR DEVICE CONTROL ONE +2412 ; [*07F8.0020.0002] # SYMBOL FOR DEVICE CONTROL TWO +2413 ; [*07F9.0020.0002] # SYMBOL FOR DEVICE CONTROL THREE +2414 ; [*07FA.0020.0002] # SYMBOL FOR DEVICE CONTROL FOUR +2415 ; [*07FB.0020.0002] # SYMBOL FOR NEGATIVE ACKNOWLEDGE +2416 ; [*07FC.0020.0002] # SYMBOL FOR SYNCHRONOUS IDLE +2417 ; [*07FD.0020.0002] # SYMBOL FOR END OF TRANSMISSION BLOCK +2418 ; [*07FE.0020.0002] # SYMBOL FOR CANCEL +2419 ; [*07FF.0020.0002] # SYMBOL FOR END OF MEDIUM +241A ; [*0800.0020.0002] # SYMBOL FOR SUBSTITUTE +241B ; [*0801.0020.0002] # SYMBOL FOR ESCAPE +241C ; [*0802.0020.0002] # SYMBOL FOR FILE SEPARATOR +241D ; [*0803.0020.0002] # SYMBOL FOR GROUP SEPARATOR +241E ; [*0804.0020.0002] # SYMBOL FOR RECORD SEPARATOR +241F ; [*0805.0020.0002] # SYMBOL FOR UNIT SEPARATOR +2420 ; [*0806.0020.0002] # SYMBOL FOR SPACE +2421 ; [*0807.0020.0002] # SYMBOL FOR DELETE +2422 ; [*0808.0020.0002] # BLANK SYMBOL +2423 ; [*0809.0020.0002] # OPEN BOX +2424 ; [*080A.0020.0002] # SYMBOL FOR NEWLINE +2425 ; [*080B.0020.0002] # SYMBOL FOR DELETE FORM TWO +2426 ; [*080C.0020.0002] # SYMBOL FOR SUBSTITUTE FORM TWO +2440 ; [*080D.0020.0002] # OCR HOOK +2441 ; [*080E.0020.0002] # OCR CHAIR +2442 ; [*080F.0020.0002] # OCR FORK +2443 ; [*0810.0020.0002] # OCR INVERTED FORK +2444 ; [*0811.0020.0002] # OCR BELT BUCKLE +2445 ; [*0812.0020.0002] # OCR BOW TIE +2446 ; [*0813.0020.0002] # OCR BRANCH BANK IDENTIFICATION +2447 ; [*0814.0020.0002] # OCR AMOUNT OF CHECK +2448 ; [*0815.0020.0002] # OCR DASH +2449 ; [*0816.0020.0002] # OCR CUSTOMER ACCOUNT NUMBER +244A ; [*0817.0020.0002] # OCR DOUBLE BACKSLASH +2500 ; [*0818.0020.0002] # BOX DRAWINGS LIGHT HORIZONTAL +2501 ; [*0819.0020.0002] # BOX DRAWINGS HEAVY HORIZONTAL +2502 ; [*081A.0020.0002] # BOX DRAWINGS LIGHT VERTICAL +2503 ; [*081B.0020.0002] # BOX DRAWINGS HEAVY VERTICAL +2504 ; [*081C.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +2505 ; [*081D.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +2506 ; [*081E.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +2507 ; [*081F.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +2508 ; [*0820.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +2509 ; [*0821.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +250A ; [*0822.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +250B ; [*0823.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +250C ; [*0824.0020.0002] # BOX DRAWINGS LIGHT DOWN AND RIGHT +250D ; [*0825.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +250E ; [*0826.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +250F ; [*0827.0020.0002] # BOX DRAWINGS HEAVY DOWN AND RIGHT +2510 ; [*0828.0020.0002] # BOX DRAWINGS LIGHT DOWN AND LEFT +2511 ; [*0829.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +2512 ; [*082A.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +2513 ; [*082B.0020.0002] # BOX DRAWINGS HEAVY DOWN AND LEFT +2514 ; [*082C.0020.0002] # BOX DRAWINGS LIGHT UP AND RIGHT +2515 ; [*082D.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +2516 ; [*082E.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +2517 ; [*082F.0020.0002] # BOX DRAWINGS HEAVY UP AND RIGHT +2518 ; [*0830.0020.0002] # BOX DRAWINGS LIGHT UP AND LEFT +2519 ; [*0831.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY +251A ; [*0832.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT +251B ; [*0833.0020.0002] # BOX DRAWINGS HEAVY UP AND LEFT +251C ; [*0834.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +251D ; [*0835.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +251E ; [*0836.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +251F ; [*0837.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +2520 ; [*0838.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +2521 ; [*0839.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +2522 ; [*083A.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +2523 ; [*083B.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT +2524 ; [*083C.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND LEFT +2525 ; [*083D.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +2526 ; [*083E.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +2527 ; [*083F.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +2528 ; [*0840.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +2529 ; [*0841.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +252A ; [*0842.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +252B ; [*0843.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND LEFT +252C ; [*0844.0020.0002] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +252D ; [*0845.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +252E ; [*0846.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +252F ; [*0847.0020.0002] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +2530 ; [*0848.0020.0002] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +2531 ; [*0849.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +2532 ; [*084A.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +2533 ; [*084B.0020.0002] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +2534 ; [*084C.0020.0002] # BOX DRAWINGS LIGHT UP AND HORIZONTAL +2535 ; [*084D.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +2536 ; [*084E.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +2537 ; [*084F.0020.0002] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +2538 ; [*0850.0020.0002] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +2539 ; [*0851.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +253A ; [*0852.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +253B ; [*0853.0020.0002] # BOX DRAWINGS HEAVY UP AND HORIZONTAL +253C ; [*0854.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +253D ; [*0855.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +253E ; [*0856.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +253F ; [*0857.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +2540 ; [*0858.0020.0002] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +2541 ; [*0859.0020.0002] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +2542 ; [*085A.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +2543 ; [*085B.0020.0002] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +2544 ; [*085C.0020.0002] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +2545 ; [*085D.0020.0002] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +2546 ; [*085E.0020.0002] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +2547 ; [*085F.0020.0002] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +2548 ; [*0860.0020.0002] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +2549 ; [*0861.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +254A ; [*0862.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +254B ; [*0863.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C ; [*0864.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +254D ; [*0865.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +254E ; [*0866.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +254F ; [*0867.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550 ; [*0868.0020.0002] # BOX DRAWINGS DOUBLE HORIZONTAL +2551 ; [*0869.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL +2552 ; [*086A.0020.0002] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +2553 ; [*086B.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +2554 ; [*086C.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND RIGHT +2555 ; [*086D.0020.0002] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +2556 ; [*086E.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +2557 ; [*086F.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND LEFT +2558 ; [*0870.0020.0002] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +2559 ; [*0871.0020.0002] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +255A ; [*0872.0020.0002] # BOX DRAWINGS DOUBLE UP AND RIGHT +255B ; [*0873.0020.0002] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +255C ; [*0874.0020.0002] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +255D ; [*0875.0020.0002] # BOX DRAWINGS DOUBLE UP AND LEFT +255E ; [*0876.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +255F ; [*0877.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +2560 ; [*0878.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +2561 ; [*0879.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +2562 ; [*087A.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +2563 ; [*087B.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT +2564 ; [*087C.0020.0002] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +2565 ; [*087D.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +2566 ; [*087E.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +2567 ; [*087F.0020.0002] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +2568 ; [*0880.0020.0002] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +2569 ; [*0881.0020.0002] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL +256A ; [*0882.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +256B ; [*0883.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256C ; [*0884.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +256D ; [*0885.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +256E ; [*0886.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT +256F ; [*0887.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND LEFT +2570 ; [*0888.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND RIGHT +2571 ; [*0889.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +2572 ; [*088A.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +2573 ; [*088B.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL CROSS +2574 ; [*088C.0020.0002] # BOX DRAWINGS LIGHT LEFT +2575 ; [*088D.0020.0002] # BOX DRAWINGS LIGHT UP +2576 ; [*088E.0020.0002] # BOX DRAWINGS LIGHT RIGHT +2577 ; [*088F.0020.0002] # BOX DRAWINGS LIGHT DOWN +2578 ; [*0890.0020.0002] # BOX DRAWINGS HEAVY LEFT +2579 ; [*0891.0020.0002] # BOX DRAWINGS HEAVY UP +257A ; [*0892.0020.0002] # BOX DRAWINGS HEAVY RIGHT +257B ; [*0893.0020.0002] # BOX DRAWINGS HEAVY DOWN +257C ; [*0894.0020.0002] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +257D ; [*0895.0020.0002] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN +257E ; [*0896.0020.0002] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +257F ; [*0897.0020.0002] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580 ; [*0898.0020.0002] # UPPER HALF BLOCK +2581 ; [*0899.0020.0002] # LOWER ONE EIGHTH BLOCK +2582 ; [*089A.0020.0002] # LOWER ONE QUARTER BLOCK +2583 ; [*089B.0020.0002] # LOWER THREE EIGHTHS BLOCK +2584 ; [*089C.0020.0002] # LOWER HALF BLOCK +2585 ; [*089D.0020.0002] # LOWER FIVE EIGHTHS BLOCK +2586 ; [*089E.0020.0002] # LOWER THREE QUARTERS BLOCK +2587 ; [*089F.0020.0002] # LOWER SEVEN EIGHTHS BLOCK +2588 ; [*08A0.0020.0002] # FULL BLOCK +2589 ; [*08A1.0020.0002] # LEFT SEVEN EIGHTHS BLOCK +258A ; [*08A2.0020.0002] # LEFT THREE QUARTERS BLOCK +258B ; [*08A3.0020.0002] # LEFT FIVE EIGHTHS BLOCK +258C ; [*08A4.0020.0002] # LEFT HALF BLOCK +258D ; [*08A5.0020.0002] # LEFT THREE EIGHTHS BLOCK +258E ; [*08A6.0020.0002] # LEFT ONE QUARTER BLOCK +258F ; [*08A7.0020.0002] # LEFT ONE EIGHTH BLOCK +2590 ; [*08A8.0020.0002] # RIGHT HALF BLOCK +2591 ; [*08A9.0020.0002] # LIGHT SHADE +2592 ; [*08AA.0020.0002] # MEDIUM SHADE +2593 ; [*08AB.0020.0002] # DARK SHADE +2594 ; [*08AC.0020.0002] # UPPER ONE EIGHTH BLOCK +2595 ; [*08AD.0020.0002] # RIGHT ONE EIGHTH BLOCK +2596 ; [*08AE.0020.0002] # QUADRANT LOWER LEFT +2597 ; [*08AF.0020.0002] # QUADRANT LOWER RIGHT +2598 ; [*08B0.0020.0002] # QUADRANT UPPER LEFT +2599 ; [*08B1.0020.0002] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +259A ; [*08B2.0020.0002] # QUADRANT UPPER LEFT AND LOWER RIGHT +259B ; [*08B3.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +259C ; [*08B4.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +259D ; [*08B5.0020.0002] # QUADRANT UPPER RIGHT +259E ; [*08B6.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT +259F ; [*08B7.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0 ; [*08B8.0020.0002] # BLACK SQUARE +25A1 ; [*08B9.0020.0002] # WHITE SQUARE +25A2 ; [*08BA.0020.0002] # WHITE SQUARE WITH ROUNDED CORNERS +25A3 ; [*08BB.0020.0002] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE +25A4 ; [*08BC.0020.0002] # SQUARE WITH HORIZONTAL FILL +25A5 ; [*08BD.0020.0002] # SQUARE WITH VERTICAL FILL +25A6 ; [*08BE.0020.0002] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL +25A7 ; [*08BF.0020.0002] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +25A8 ; [*08C0.0020.0002] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +25A9 ; [*08C1.0020.0002] # SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA ; [*08C2.0020.0002] # BLACK SMALL SQUARE +25AB ; [*08C3.0020.0002] # WHITE SMALL SQUARE +25AC ; [*08C4.0020.0002] # BLACK RECTANGLE +25AD ; [*08C5.0020.0002] # WHITE RECTANGLE +25AE ; [*08C6.0020.0002] # BLACK VERTICAL RECTANGLE +25AF ; [*08C7.0020.0002] # WHITE VERTICAL RECTANGLE +25B0 ; [*08C8.0020.0002] # BLACK PARALLELOGRAM +25B1 ; [*08C9.0020.0002] # WHITE PARALLELOGRAM +25B2 ; [*08CA.0020.0002] # BLACK UP-POINTING TRIANGLE +25B3 ; [*08CB.0020.0002] # WHITE UP-POINTING TRIANGLE +25B4 ; [*08CC.0020.0002] # BLACK UP-POINTING SMALL TRIANGLE +25B5 ; [*08CD.0020.0002] # WHITE UP-POINTING SMALL TRIANGLE +25B6 ; [*08CE.0020.0002] # BLACK RIGHT-POINTING TRIANGLE +25B7 ; [*08CF.0020.0002] # WHITE RIGHT-POINTING TRIANGLE +25B8 ; [*08D0.0020.0002] # BLACK RIGHT-POINTING SMALL TRIANGLE +25B9 ; [*08D1.0020.0002] # WHITE RIGHT-POINTING SMALL TRIANGLE +25BA ; [*08D2.0020.0002] # BLACK RIGHT-POINTING POINTER +25BB ; [*08D3.0020.0002] # WHITE RIGHT-POINTING POINTER +25BC ; [*08D4.0020.0002] # BLACK DOWN-POINTING TRIANGLE +25BD ; [*08D5.0020.0002] # WHITE DOWN-POINTING TRIANGLE +25BE ; [*08D6.0020.0002] # BLACK DOWN-POINTING SMALL TRIANGLE +25BF ; [*08D7.0020.0002] # WHITE DOWN-POINTING SMALL TRIANGLE +25C0 ; [*08D8.0020.0002] # BLACK LEFT-POINTING TRIANGLE +25C1 ; [*08D9.0020.0002] # WHITE LEFT-POINTING TRIANGLE +25C2 ; [*08DA.0020.0002] # BLACK LEFT-POINTING SMALL TRIANGLE +25C3 ; [*08DB.0020.0002] # WHITE LEFT-POINTING SMALL TRIANGLE +25C4 ; [*08DC.0020.0002] # BLACK LEFT-POINTING POINTER +25C5 ; [*08DD.0020.0002] # WHITE LEFT-POINTING POINTER +25C6 ; [*08DE.0020.0002] # BLACK DIAMOND +25C7 ; [*08DF.0020.0002] # WHITE DIAMOND +25C8 ; [*08E0.0020.0002] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9 ; [*08E1.0020.0002] # FISHEYE +25CA ; [*08E2.0020.0002] # LOZENGE +25CB ; [*08E3.0020.0002] # WHITE CIRCLE +25CC ; [*08E4.0020.0002] # DOTTED CIRCLE +25CD ; [*08E5.0020.0002] # CIRCLE WITH VERTICAL FILL +25CE ; [*08E6.0020.0002] # BULLSEYE +25CF ; [*08E7.0020.0002] # BLACK CIRCLE +25D0 ; [*08E8.0020.0002] # CIRCLE WITH LEFT HALF BLACK +25D1 ; [*08E9.0020.0002] # CIRCLE WITH RIGHT HALF BLACK +25D2 ; [*08EA.0020.0002] # CIRCLE WITH LOWER HALF BLACK +25D3 ; [*08EB.0020.0002] # CIRCLE WITH UPPER HALF BLACK +25D4 ; [*08EC.0020.0002] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK +25D5 ; [*08ED.0020.0002] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +25D6 ; [*08EE.0020.0002] # LEFT HALF BLACK CIRCLE +25D7 ; [*08EF.0020.0002] # RIGHT HALF BLACK CIRCLE +25D8 ; [*08F0.0020.0002] # INVERSE BULLET +25D9 ; [*08F1.0020.0002] # INVERSE WHITE CIRCLE +25DA ; [*08F2.0020.0002] # UPPER HALF INVERSE WHITE CIRCLE +25DB ; [*08F3.0020.0002] # LOWER HALF INVERSE WHITE CIRCLE +25DC ; [*08F4.0020.0002] # UPPER LEFT QUADRANT CIRCULAR ARC +25DD ; [*08F5.0020.0002] # UPPER RIGHT QUADRANT CIRCULAR ARC +25DE ; [*08F6.0020.0002] # LOWER RIGHT QUADRANT CIRCULAR ARC +25DF ; [*08F7.0020.0002] # LOWER LEFT QUADRANT CIRCULAR ARC +25E0 ; [*08F8.0020.0002] # UPPER HALF CIRCLE +25E1 ; [*08F9.0020.0002] # LOWER HALF CIRCLE +25E2 ; [*08FA.0020.0002] # BLACK LOWER RIGHT TRIANGLE +25E3 ; [*08FB.0020.0002] # BLACK LOWER LEFT TRIANGLE +25E4 ; [*08FC.0020.0002] # BLACK UPPER LEFT TRIANGLE +25E5 ; [*08FD.0020.0002] # BLACK UPPER RIGHT TRIANGLE +25E6 ; [*08FE.0020.0002] # WHITE BULLET +25E7 ; [*08FF.0020.0002] # SQUARE WITH LEFT HALF BLACK +25E8 ; [*0900.0020.0002] # SQUARE WITH RIGHT HALF BLACK +25E9 ; [*0901.0020.0002] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +25EA ; [*0902.0020.0002] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +25EB ; [*0903.0020.0002] # WHITE SQUARE WITH VERTICAL BISECTING LINE +25EC ; [*0904.0020.0002] # WHITE UP-POINTING TRIANGLE WITH DOT +25ED ; [*0905.0020.0002] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK +25EE ; [*0906.0020.0002] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF ; [*0907.0020.0002] # LARGE CIRCLE +25F0 ; [*0908.0020.0002] # WHITE SQUARE WITH UPPER LEFT QUADRANT +25F1 ; [*0909.0020.0002] # WHITE SQUARE WITH LOWER LEFT QUADRANT +25F2 ; [*090A.0020.0002] # WHITE SQUARE WITH LOWER RIGHT QUADRANT +25F3 ; [*090B.0020.0002] # WHITE SQUARE WITH UPPER RIGHT QUADRANT +25F4 ; [*090C.0020.0002] # WHITE CIRCLE WITH UPPER LEFT QUADRANT +25F5 ; [*090D.0020.0002] # WHITE CIRCLE WITH LOWER LEFT QUADRANT +25F6 ; [*090E.0020.0002] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT +25F7 ; [*090F.0020.0002] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8 ; [*0910.0020.0002] # UPPER LEFT TRIANGLE +25F9 ; [*0911.0020.0002] # UPPER RIGHT TRIANGLE +25FA ; [*0912.0020.0002] # LOWER LEFT TRIANGLE +25FB ; [*0913.0020.0002] # WHITE MEDIUM SQUARE +25FC ; [*0914.0020.0002] # BLACK MEDIUM SQUARE +25FD ; [*0915.0020.0002] # WHITE MEDIUM SMALL SQUARE +25FE ; [*0916.0020.0002] # BLACK MEDIUM SMALL SQUARE +25FF ; [*0917.0020.0002] # LOWER RIGHT TRIANGLE +2600 ; [*0918.0020.0002] # BLACK SUN WITH RAYS +2601 ; [*0919.0020.0002] # CLOUD +2602 ; [*091A.0020.0002] # UMBRELLA +2603 ; [*091B.0020.0002] # SNOWMAN +2604 ; [*091C.0020.0002] # COMET +2605 ; [*091D.0020.0002] # BLACK STAR +2606 ; [*091E.0020.0002] # WHITE STAR +2607 ; [*091F.0020.0002] # LIGHTNING +2608 ; [*0920.0020.0002] # THUNDERSTORM +2609 ; [*0921.0020.0002] # SUN +260A ; [*0922.0020.0002] # ASCENDING NODE +260B ; [*0923.0020.0002] # DESCENDING NODE +260C ; [*0924.0020.0002] # CONJUNCTION +260D ; [*0925.0020.0002] # OPPOSITION +260E ; [*0926.0020.0002] # BLACK TELEPHONE +260F ; [*0927.0020.0002] # WHITE TELEPHONE +2610 ; [*0928.0020.0002] # BALLOT BOX +2611 ; [*0929.0020.0002] # BALLOT BOX WITH CHECK +2612 ; [*092A.0020.0002] # BALLOT BOX WITH X +2613 ; [*092B.0020.0002] # SALTIRE +2614 ; [*092C.0020.0002] # UMBRELLA WITH RAIN DROPS +2615 ; [*092D.0020.0002] # HOT BEVERAGE +2616 ; [*092E.0020.0002] # WHITE SHOGI PIECE +2617 ; [*092F.0020.0002] # BLACK SHOGI PIECE +2618 ; [*0930.0020.0002] # SHAMROCK +2619 ; [*0931.0020.0002] # REVERSED ROTATED FLORAL HEART BULLET +261A ; [*0932.0020.0002] # BLACK LEFT POINTING INDEX +261B ; [*0933.0020.0002] # BLACK RIGHT POINTING INDEX +261C ; [*0934.0020.0002] # WHITE LEFT POINTING INDEX +261D ; [*0935.0020.0002] # WHITE UP POINTING INDEX +261E ; [*0936.0020.0002] # WHITE RIGHT POINTING INDEX +261F ; [*0937.0020.0002] # WHITE DOWN POINTING INDEX +2620 ; [*0938.0020.0002] # SKULL AND CROSSBONES +2621 ; [*0939.0020.0002] # CAUTION SIGN +2622 ; [*093A.0020.0002] # RADIOACTIVE SIGN +2623 ; [*093B.0020.0002] # BIOHAZARD SIGN +2624 ; [*093C.0020.0002] # CADUCEUS +2625 ; [*093D.0020.0002] # ANKH +2626 ; [*093E.0020.0002] # ORTHODOX CROSS +2627 ; [*093F.0020.0002] # CHI RHO +2628 ; [*0940.0020.0002] # CROSS OF LORRAINE +2629 ; [*0941.0020.0002] # CROSS OF JERUSALEM +262A ; [*0942.0020.0002] # STAR AND CRESCENT +262B ; [*0943.0020.0002] # FARSI SYMBOL +262C ; [*0944.0020.0002] # ADI SHAKTI +262D ; [*0945.0020.0002] # HAMMER AND SICKLE +262E ; [*0946.0020.0002] # PEACE SYMBOL +262F ; [*0947.0020.0002] # YIN YANG +2630 ; [*0EA2.0020.0002] # TRIGRAM FOR HEAVEN +2631 ; [*0EA3.0020.0002] # TRIGRAM FOR LAKE +2632 ; [*0EA4.0020.0002] # TRIGRAM FOR FIRE +2633 ; [*0EA5.0020.0002] # TRIGRAM FOR THUNDER +2634 ; [*0EA6.0020.0002] # TRIGRAM FOR WIND +2635 ; [*0EA7.0020.0002] # TRIGRAM FOR WATER +2636 ; [*0EA8.0020.0002] # TRIGRAM FOR MOUNTAIN +2637 ; [*0EA9.0020.0002] # TRIGRAM FOR EARTH +2638 ; [*0948.0020.0002] # WHEEL OF DHARMA +2639 ; [*0949.0020.0002] # WHITE FROWNING FACE +263A ; [*094A.0020.0002] # WHITE SMILING FACE +263B ; [*094B.0020.0002] # BLACK SMILING FACE +263C ; [*094C.0020.0002] # WHITE SUN WITH RAYS +263D ; [*094D.0020.0002] # FIRST QUARTER MOON +263E ; [*094E.0020.0002] # LAST QUARTER MOON +263F ; [*094F.0020.0002] # MERCURY +2640 ; [*0950.0020.0002] # FEMALE SIGN +2641 ; [*0951.0020.0002] # EARTH +2642 ; [*0952.0020.0002] # MALE SIGN +2643 ; [*0953.0020.0002] # JUPITER +2644 ; [*0954.0020.0002] # SATURN +2645 ; [*0955.0020.0002] # URANUS +2646 ; [*0956.0020.0002] # NEPTUNE +2647 ; [*0957.0020.0002] # PLUTO +2648 ; [*0958.0020.0002] # ARIES +2649 ; [*0959.0020.0002] # TAURUS +264A ; [*095A.0020.0002] # GEMINI +264B ; [*095B.0020.0002] # CANCER +264C ; [*095C.0020.0002] # LEO +264D ; [*095D.0020.0002] # VIRGO +264E ; [*095E.0020.0002] # LIBRA +264F ; [*095F.0020.0002] # SCORPIUS +2650 ; [*0960.0020.0002] # SAGITTARIUS +2651 ; [*0961.0020.0002] # CAPRICORN +2652 ; [*0962.0020.0002] # AQUARIUS +2653 ; [*0963.0020.0002] # PISCES +2654 ; [*0964.0020.0002] # WHITE CHESS KING +2655 ; [*0965.0020.0002] # WHITE CHESS QUEEN +2656 ; [*0966.0020.0002] # WHITE CHESS ROOK +2657 ; [*0967.0020.0002] # WHITE CHESS BISHOP +2658 ; [*0968.0020.0002] # WHITE CHESS KNIGHT +2659 ; [*0969.0020.0002] # WHITE CHESS PAWN +265A ; [*096A.0020.0002] # BLACK CHESS KING +265B ; [*096B.0020.0002] # BLACK CHESS QUEEN +265C ; [*096C.0020.0002] # BLACK CHESS ROOK +265D ; [*096D.0020.0002] # BLACK CHESS BISHOP +265E ; [*096E.0020.0002] # BLACK CHESS KNIGHT +265F ; [*096F.0020.0002] # BLACK CHESS PAWN +2660 ; [*0970.0020.0002] # BLACK SPADE SUIT +2661 ; [*0971.0020.0002] # WHITE HEART SUIT +2662 ; [*0972.0020.0002] # WHITE DIAMOND SUIT +2663 ; [*0973.0020.0002] # BLACK CLUB SUIT +2664 ; [*0974.0020.0002] # WHITE SPADE SUIT +2665 ; [*0975.0020.0002] # BLACK HEART SUIT +2666 ; [*0976.0020.0002] # BLACK DIAMOND SUIT +2667 ; [*0977.0020.0002] # WHITE CLUB SUIT +2668 ; [*0978.0020.0002] # HOT SPRINGS +2669 ; [*0979.0020.0002] # QUARTER NOTE +266A ; [*097A.0020.0002] # EIGHTH NOTE +266B ; [*097B.0020.0002] # BEAMED EIGHTH NOTES +266C ; [*097C.0020.0002] # BEAMED SIXTEENTH NOTES +266D ; [*10F3.0020.0002] # MUSIC FLAT SIGN +266E ; [*10F4.0020.0002] # MUSIC NATURAL SIGN +266F ; [*10F5.0020.0002] # MUSIC SHARP SIGN +2670 ; [*097D.0020.0002] # WEST SYRIAC CROSS +2671 ; [*097E.0020.0002] # EAST SYRIAC CROSS +2672 ; [*097F.0020.0002] # UNIVERSAL RECYCLING SYMBOL +2673 ; [*0980.0020.0002] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS +2674 ; [*0981.0020.0002] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS +2675 ; [*0982.0020.0002] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS +2676 ; [*0983.0020.0002] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS +2677 ; [*0984.0020.0002] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS +2678 ; [*0985.0020.0002] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS +2679 ; [*0986.0020.0002] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS +267A ; [*0987.0020.0002] # RECYCLING SYMBOL FOR GENERIC MATERIALS +267B ; [*0988.0020.0002] # BLACK UNIVERSAL RECYCLING SYMBOL +267C ; [*0989.0020.0002] # RECYCLED PAPER SYMBOL +267D ; [*098A.0020.0002] # PARTIALLY-RECYCLED PAPER SYMBOL +267E ; [*098B.0020.0002] # PERMANENT PAPER SIGN +267F ; [*098C.0020.0002] # WHEELCHAIR SYMBOL +2680 ; [*098D.0020.0002] # DIE FACE-1 +2681 ; [*098E.0020.0002] # DIE FACE-2 +2682 ; [*098F.0020.0002] # DIE FACE-3 +2683 ; [*0990.0020.0002] # DIE FACE-4 +2684 ; [*0991.0020.0002] # DIE FACE-5 +2685 ; [*0992.0020.0002] # DIE FACE-6 +2686 ; [*0993.0020.0002] # WHITE CIRCLE WITH DOT RIGHT +2687 ; [*0994.0020.0002] # WHITE CIRCLE WITH TWO DOTS +2688 ; [*0995.0020.0002] # BLACK CIRCLE WITH WHITE DOT RIGHT +2689 ; [*0996.0020.0002] # BLACK CIRCLE WITH TWO WHITE DOTS +268A ; [*0E9C.0020.0002] # MONOGRAM FOR YANG +268B ; [*0E9D.0020.0002] # MONOGRAM FOR YIN +268C ; [*0E9E.0020.0002] # DIGRAM FOR GREATER YANG +268D ; [*0E9F.0020.0002] # DIGRAM FOR LESSER YIN +268E ; [*0EA0.0020.0002] # DIGRAM FOR LESSER YANG +268F ; [*0EA1.0020.0002] # DIGRAM FOR GREATER YIN +2690 ; [*0997.0020.0002] # WHITE FLAG +2691 ; [*0998.0020.0002] # BLACK FLAG +2692 ; [*0999.0020.0002] # HAMMER AND PICK +2693 ; [*099A.0020.0002] # ANCHOR +2694 ; [*099B.0020.0002] # CROSSED SWORDS +2695 ; [*099C.0020.0002] # STAFF OF AESCULAPIUS +2696 ; [*099D.0020.0002] # SCALES +2697 ; [*099E.0020.0002] # ALEMBIC +2698 ; [*099F.0020.0002] # FLOWER +2699 ; [*09A0.0020.0002] # GEAR +269A ; [*09A1.0020.0002] # STAFF OF HERMES +269B ; [*09A2.0020.0002] # ATOM SYMBOL +269C ; [*09A3.0020.0002] # FLEUR-DE-LIS +269D ; [*09A4.0020.0002] # OUTLINED WHITE STAR +269E ; [*09A5.0020.0002] # THREE LINES CONVERGING RIGHT +269F ; [*09A6.0020.0002] # THREE LINES CONVERGING LEFT +26A0 ; [*09A7.0020.0002] # WARNING SIGN +26A1 ; [*09A8.0020.0002] # HIGH VOLTAGE SIGN +26A2 ; [*09A9.0020.0002] # DOUBLED FEMALE SIGN +26A3 ; [*09AA.0020.0002] # DOUBLED MALE SIGN +26A4 ; [*09AB.0020.0002] # INTERLOCKED FEMALE AND MALE SIGN +26A5 ; [*09AC.0020.0002] # MALE AND FEMALE SIGN +26A6 ; [*09AD.0020.0002] # MALE WITH STROKE SIGN +26A7 ; [*09AE.0020.0002] # MALE WITH STROKE AND MALE AND FEMALE SIGN +26A8 ; [*09AF.0020.0002] # VERTICAL MALE WITH STROKE SIGN +26A9 ; [*09B0.0020.0002] # HORIZONTAL MALE WITH STROKE SIGN +26AA ; [*09B1.0020.0002] # MEDIUM WHITE CIRCLE +26AB ; [*09B2.0020.0002] # MEDIUM BLACK CIRCLE +26AC ; [*09B3.0020.0002] # MEDIUM SMALL WHITE CIRCLE +26AD ; [*09B4.0020.0002] # MARRIAGE SYMBOL +26AE ; [*09B5.0020.0002] # DIVORCE SYMBOL +26AF ; [*09B6.0020.0002] # UNMARRIED PARTNERSHIP SYMBOL +26B0 ; [*09B7.0020.0002] # COFFIN +26B1 ; [*09B8.0020.0002] # FUNERAL URN +26B2 ; [*09B9.0020.0002] # NEUTER +26B3 ; [*09BA.0020.0002] # CERES +26B4 ; [*09BB.0020.0002] # PALLAS +26B5 ; [*09BC.0020.0002] # JUNO +26B6 ; [*09BD.0020.0002] # VESTA +26B7 ; [*09BE.0020.0002] # CHIRON +26B8 ; [*09BF.0020.0002] # BLACK MOON LILITH +26B9 ; [*09C0.0020.0002] # SEXTILE +26BA ; [*09C1.0020.0002] # SEMISEXTILE +26BB ; [*09C2.0020.0002] # QUINCUNX +26BC ; [*09C3.0020.0002] # SESQUIQUADRATE +26BD ; [*09C4.0020.0002] # SOCCER BALL +26BE ; [*09C5.0020.0002] # BASEBALL +26BF ; [*09C6.0020.0002] # SQUARED KEY +26C0 ; [*09C7.0020.0002] # WHITE DRAUGHTS MAN +26C1 ; [*09C8.0020.0002] # WHITE DRAUGHTS KING +26C2 ; [*09C9.0020.0002] # BLACK DRAUGHTS MAN +26C3 ; [*09CA.0020.0002] # BLACK DRAUGHTS KING +26C4 ; [*09CB.0020.0002] # SNOWMAN WITHOUT SNOW +26C5 ; [*09CC.0020.0002] # SUN BEHIND CLOUD +26C6 ; [*09CD.0020.0002] # RAIN +26C7 ; [*09CE.0020.0002] # BLACK SNOWMAN +26C8 ; [*09CF.0020.0002] # THUNDER CLOUD AND RAIN +26C9 ; [*09D0.0020.0002] # TURNED WHITE SHOGI PIECE +26CA ; [*09D1.0020.0002] # TURNED BLACK SHOGI PIECE +26CB ; [*09D2.0020.0002] # WHITE DIAMOND IN SQUARE +26CC ; [*09D3.0020.0002] # CROSSING LANES +26CD ; [*09D4.0020.0002] # DISABLED CAR +26CE ; [*09D5.0020.0002] # OPHIUCHUS +26CF ; [*09D6.0020.0002] # PICK +26D0 ; [*09D7.0020.0002] # CAR SLIDING +26D1 ; [*09D8.0020.0002] # HELMET WITH WHITE CROSS +26D2 ; [*09D9.0020.0002] # CIRCLED CROSSING LANES +26D3 ; [*09DA.0020.0002] # CHAINS +26D4 ; [*09DB.0020.0002] # NO ENTRY +26D5 ; [*09DC.0020.0002] # ALTERNATE ONE-WAY LEFT WAY TRAFFIC +26D6 ; [*09DD.0020.0002] # BLACK TWO-WAY LEFT WAY TRAFFIC +26D7 ; [*09DE.0020.0002] # WHITE TWO-WAY LEFT WAY TRAFFIC +26D8 ; [*09DF.0020.0002] # BLACK LEFT LANE MERGE +26D9 ; [*09E0.0020.0002] # WHITE LEFT LANE MERGE +26DA ; [*09E1.0020.0002] # DRIVE SLOW SIGN +26DB ; [*09E2.0020.0002] # HEAVY WHITE DOWN-POINTING TRIANGLE +26DC ; [*09E3.0020.0002] # LEFT CLOSED ENTRY +26DD ; [*09E4.0020.0002] # SQUARED SALTIRE +26DE ; [*09E5.0020.0002] # FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE +26DF ; [*09E6.0020.0002] # BLACK TRUCK +26E0 ; [*09E7.0020.0002] # RESTRICTED LEFT ENTRY-1 +26E1 ; [*09E8.0020.0002] # RESTRICTED LEFT ENTRY-2 +26E2 ; [*09E9.0020.0002] # ASTRONOMICAL SYMBOL FOR URANUS +26E3 ; [*09EA.0020.0002] # HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E4 ; [*09EB.0020.0002] # PENTAGRAM +26E5 ; [*09EC.0020.0002] # RIGHT-HANDED INTERLACED PENTAGRAM +26E6 ; [*09ED.0020.0002] # LEFT-HANDED INTERLACED PENTAGRAM +26E7 ; [*09EE.0020.0002] # INVERTED PENTAGRAM +26E8 ; [*09EF.0020.0002] # BLACK CROSS ON SHIELD +26E9 ; [*09F0.0020.0002] # SHINTO SHRINE +26EA ; [*09F1.0020.0002] # CHURCH +26EB ; [*09F2.0020.0002] # CASTLE +26EC ; [*09F3.0020.0002] # HISTORIC SITE +26ED ; [*09F4.0020.0002] # GEAR WITHOUT HUB +26EE ; [*09F5.0020.0002] # GEAR WITH HANDLES +26EF ; [*09F6.0020.0002] # MAP SYMBOL FOR LIGHTHOUSE +26F0 ; [*09F7.0020.0002] # MOUNTAIN +26F1 ; [*09F8.0020.0002] # UMBRELLA ON GROUND +26F2 ; [*09F9.0020.0002] # FOUNTAIN +26F3 ; [*09FA.0020.0002] # FLAG IN HOLE +26F4 ; [*09FB.0020.0002] # FERRY +26F5 ; [*09FC.0020.0002] # SAILBOAT +26F6 ; [*09FD.0020.0002] # SQUARE FOUR CORNERS +26F7 ; [*09FE.0020.0002] # SKIER +26F8 ; [*09FF.0020.0002] # ICE SKATE +26F9 ; [*0A00.0020.0002] # PERSON WITH BALL +26FA ; [*0A01.0020.0002] # TENT +26FB ; [*0A02.0020.0002] # JAPANESE BANK SYMBOL +26FC ; [*0A03.0020.0002] # HEADSTONE GRAVEYARD SYMBOL +26FD ; [*0A04.0020.0002] # FUEL PUMP +26FE ; [*0A05.0020.0002] # CUP ON BLACK SQUARE +26FF ; [*0A06.0020.0002] # WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +2700 ; [*0A21.0020.0002] # BLACK SAFETY SCISSORS +2701 ; [*0A22.0020.0002] # UPPER BLADE SCISSORS +2702 ; [*0A23.0020.0002] # BLACK SCISSORS +2703 ; [*0A24.0020.0002] # LOWER BLADE SCISSORS +2704 ; [*0A25.0020.0002] # WHITE SCISSORS +2705 ; [*0A26.0020.0002] # WHITE HEAVY CHECK MARK +2706 ; [*0A27.0020.0002] # TELEPHONE LOCATION SIGN +2707 ; [*0A28.0020.0002] # TAPE DRIVE +2708 ; [*0A29.0020.0002] # AIRPLANE +2709 ; [*0A2A.0020.0002] # ENVELOPE +270A ; [*0A2B.0020.0002] # RAISED FIST +270B ; [*0A2C.0020.0002] # RAISED HAND +270C ; [*0A2D.0020.0002] # VICTORY HAND +270D ; [*0A2E.0020.0002] # WRITING HAND +270E ; [*0A2F.0020.0002] # LOWER RIGHT PENCIL +270F ; [*0A30.0020.0002] # PENCIL +2710 ; [*0A31.0020.0002] # UPPER RIGHT PENCIL +2711 ; [*0A32.0020.0002] # WHITE NIB +2712 ; [*0A33.0020.0002] # BLACK NIB +2713 ; [*0A34.0020.0002] # CHECK MARK +2714 ; [*0A35.0020.0002] # HEAVY CHECK MARK +2715 ; [*0A36.0020.0002] # MULTIPLICATION X +2716 ; [*0A37.0020.0002] # HEAVY MULTIPLICATION X +2717 ; [*0A38.0020.0002] # BALLOT X +2718 ; [*0A39.0020.0002] # HEAVY BALLOT X +2719 ; [*0A3A.0020.0002] # OUTLINED GREEK CROSS +271A ; [*0A3B.0020.0002] # HEAVY GREEK CROSS +271B ; [*0A3C.0020.0002] # OPEN CENTRE CROSS +271C ; [*0A3D.0020.0002] # HEAVY OPEN CENTRE CROSS +271D ; [*0A3E.0020.0002] # LATIN CROSS +271E ; [*0A3F.0020.0002] # SHADOWED WHITE LATIN CROSS +271F ; [*0A40.0020.0002] # OUTLINED LATIN CROSS +2720 ; [*0A41.0020.0002] # MALTESE CROSS +2721 ; [*0A42.0020.0002] # STAR OF DAVID +2722 ; [*0A43.0020.0002] # FOUR TEARDROP-SPOKED ASTERISK +2723 ; [*0A44.0020.0002] # FOUR BALLOON-SPOKED ASTERISK +2724 ; [*0A45.0020.0002] # HEAVY FOUR BALLOON-SPOKED ASTERISK +2725 ; [*0A46.0020.0002] # FOUR CLUB-SPOKED ASTERISK +2726 ; [*0A47.0020.0002] # BLACK FOUR POINTED STAR +2727 ; [*0A48.0020.0002] # WHITE FOUR POINTED STAR +2728 ; [*0A49.0020.0002] # SPARKLES +2729 ; [*0A4A.0020.0002] # STRESS OUTLINED WHITE STAR +272A ; [*0A4B.0020.0002] # CIRCLED WHITE STAR +272B ; [*0A4C.0020.0002] # OPEN CENTRE BLACK STAR +272C ; [*0A4D.0020.0002] # BLACK CENTRE WHITE STAR +272D ; [*0A4E.0020.0002] # OUTLINED BLACK STAR +272E ; [*0A4F.0020.0002] # HEAVY OUTLINED BLACK STAR +272F ; [*0A50.0020.0002] # PINWHEEL STAR +2730 ; [*0A51.0020.0002] # SHADOWED WHITE STAR +2731 ; [*0A52.0020.0002] # HEAVY ASTERISK +2732 ; [*0A53.0020.0002] # OPEN CENTRE ASTERISK +2733 ; [*0A54.0020.0002] # EIGHT SPOKED ASTERISK +2734 ; [*0A55.0020.0002] # EIGHT POINTED BLACK STAR +2735 ; [*0A56.0020.0002] # EIGHT POINTED PINWHEEL STAR +2736 ; [*0A57.0020.0002] # SIX POINTED BLACK STAR +2737 ; [*0A58.0020.0002] # EIGHT POINTED RECTILINEAR BLACK STAR +2738 ; [*0A59.0020.0002] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +2739 ; [*0A5A.0020.0002] # TWELVE POINTED BLACK STAR +273A ; [*0A5B.0020.0002] # SIXTEEN POINTED ASTERISK +273B ; [*0A5C.0020.0002] # TEARDROP-SPOKED ASTERISK +273C ; [*0A5D.0020.0002] # OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D ; [*0A5E.0020.0002] # HEAVY TEARDROP-SPOKED ASTERISK +273E ; [*0A5F.0020.0002] # SIX PETALLED BLACK AND WHITE FLORETTE +273F ; [*0A60.0020.0002] # BLACK FLORETTE +2740 ; [*0A61.0020.0002] # WHITE FLORETTE +2741 ; [*0A62.0020.0002] # EIGHT PETALLED OUTLINED BLACK FLORETTE +2742 ; [*0A63.0020.0002] # CIRCLED OPEN CENTRE EIGHT POINTED STAR +2743 ; [*0A64.0020.0002] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +2744 ; [*0A65.0020.0002] # SNOWFLAKE +2745 ; [*0A66.0020.0002] # TIGHT TRIFOLIATE SNOWFLAKE +2746 ; [*0A67.0020.0002] # HEAVY CHEVRON SNOWFLAKE +2747 ; [*0A68.0020.0002] # SPARKLE +2748 ; [*0A69.0020.0002] # HEAVY SPARKLE +2749 ; [*0A6A.0020.0002] # BALLOON-SPOKED ASTERISK +274A ; [*0A6B.0020.0002] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274B ; [*0A6C.0020.0002] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274C ; [*0A6D.0020.0002] # CROSS MARK +274D ; [*0A6E.0020.0002] # SHADOWED WHITE CIRCLE +274E ; [*0A6F.0020.0002] # NEGATIVE SQUARED CROSS MARK +274F ; [*0A70.0020.0002] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE +2750 ; [*0A71.0020.0002] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE +2751 ; [*0A72.0020.0002] # LOWER RIGHT SHADOWED WHITE SQUARE +2752 ; [*0A73.0020.0002] # UPPER RIGHT SHADOWED WHITE SQUARE +2753 ; [*0A74.0020.0002] # BLACK QUESTION MARK ORNAMENT +2754 ; [*0A75.0020.0002] # WHITE QUESTION MARK ORNAMENT +2755 ; [*0A76.0020.0002] # WHITE EXCLAMATION MARK ORNAMENT +2756 ; [*0A77.0020.0002] # BLACK DIAMOND MINUS WHITE X +2757 ; [*0A78.0020.0002] # HEAVY EXCLAMATION MARK SYMBOL +2758 ; [*0A79.0020.0002] # LIGHT VERTICAL BAR +2759 ; [*0A7A.0020.0002] # MEDIUM VERTICAL BAR +275A ; [*0A7B.0020.0002] # HEAVY VERTICAL BAR +275B ; [*0A7C.0020.0002] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT +275C ; [*0A7D.0020.0002] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT +275D ; [*0A7E.0020.0002] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +275E ; [*0A7F.0020.0002] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +275F ; [*0A80.0020.0002] # HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT +2760 ; [*0A81.0020.0002] # HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +2761 ; [*0A82.0020.0002] # CURVED STEM PARAGRAPH SIGN ORNAMENT +2762 ; [*0A83.0020.0002] # HEAVY EXCLAMATION MARK ORNAMENT +2763 ; [*0A84.0020.0002] # HEAVY HEART EXCLAMATION MARK ORNAMENT +2764 ; [*0A85.0020.0002] # HEAVY BLACK HEART +2765 ; [*0A86.0020.0002] # ROTATED HEAVY BLACK HEART BULLET +2766 ; [*0A87.0020.0002] # FLORAL HEART +2767 ; [*0A88.0020.0002] # ROTATED FLORAL HEART BULLET +2768 ; [*034D.0020.0002] # MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; [*034E.0020.0002] # MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; [*034F.0020.0002] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; [*0350.0020.0002] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; [*0351.0020.0002] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; [*0352.0020.0002] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; [*0353.0020.0002] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; [*0354.0020.0002] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; [*0355.0020.0002] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; [*0356.0020.0002] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; [*0357.0020.0002] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; [*0358.0020.0002] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; [*0359.0020.0002] # MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; [*035A.0020.0002] # MEDIUM RIGHT CURLY BRACKET ORNAMENT +2794 ; [*0A89.0020.0002] # HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795 ; [*0A8A.0020.0002] # HEAVY PLUS SIGN +2796 ; [*0A8B.0020.0002] # HEAVY MINUS SIGN +2797 ; [*0A8C.0020.0002] # HEAVY DIVISION SIGN +2798 ; [*0A8D.0020.0002] # HEAVY SOUTH EAST ARROW +2799 ; [*0A8E.0020.0002] # HEAVY RIGHTWARDS ARROW +279A ; [*0A8F.0020.0002] # HEAVY NORTH EAST ARROW +279B ; [*0A90.0020.0002] # DRAFTING POINT RIGHTWARDS ARROW +279C ; [*0A91.0020.0002] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW +279D ; [*0A92.0020.0002] # TRIANGLE-HEADED RIGHTWARDS ARROW +279E ; [*0A93.0020.0002] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +279F ; [*0A94.0020.0002] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A0 ; [*0A95.0020.0002] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A1 ; [*0A96.0020.0002] # BLACK RIGHTWARDS ARROW +27A2 ; [*0A97.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +27A3 ; [*0A98.0020.0002] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +27A4 ; [*0A99.0020.0002] # BLACK RIGHTWARDS ARROWHEAD +27A5 ; [*0A9A.0020.0002] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +27A6 ; [*0A9B.0020.0002] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +27A7 ; [*0A9C.0020.0002] # SQUAT BLACK RIGHTWARDS ARROW +27A8 ; [*0A9D.0020.0002] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +27A9 ; [*0A9E.0020.0002] # RIGHT-SHADED WHITE RIGHTWARDS ARROW +27AA ; [*0A9F.0020.0002] # LEFT-SHADED WHITE RIGHTWARDS ARROW +27AB ; [*0AA0.0020.0002] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AC ; [*0AA1.0020.0002] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AD ; [*0AA2.0020.0002] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AE ; [*0AA3.0020.0002] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AF ; [*0AA4.0020.0002] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B0 ; [*0AA5.0020.0002] # CURLY LOOP +27B1 ; [*0AA6.0020.0002] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B2 ; [*0AA7.0020.0002] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW +27B3 ; [*0AA8.0020.0002] # WHITE-FEATHERED RIGHTWARDS ARROW +27B4 ; [*0AA9.0020.0002] # BLACK-FEATHERED SOUTH EAST ARROW +27B5 ; [*0AAA.0020.0002] # BLACK-FEATHERED RIGHTWARDS ARROW +27B6 ; [*0AAB.0020.0002] # BLACK-FEATHERED NORTH EAST ARROW +27B7 ; [*0AAC.0020.0002] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW +27B8 ; [*0AAD.0020.0002] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +27B9 ; [*0AAE.0020.0002] # HEAVY BLACK-FEATHERED NORTH EAST ARROW +27BA ; [*0AAF.0020.0002] # TEARDROP-BARBED RIGHTWARDS ARROW +27BB ; [*0AB0.0020.0002] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +27BC ; [*0AB1.0020.0002] # WEDGE-TAILED RIGHTWARDS ARROW +27BD ; [*0AB2.0020.0002] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW +27BE ; [*0AB3.0020.0002] # OPEN-OUTLINED RIGHTWARDS ARROW +27BF ; [*0AB4.0020.0002] # DOUBLE CURLY LOOP +27C0 ; [*0AB5.0020.0002] # THREE DIMENSIONAL ANGLE +27C1 ; [*0AB6.0020.0002] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE +27C2 ; [*0AB7.0020.0002] # PERPENDICULAR +27C3 ; [*0AB8.0020.0002] # OPEN SUBSET +27C4 ; [*0AB9.0020.0002] # OPEN SUPERSET +27C5 ; [*0341.0020.0002] # LEFT S-SHAPED BAG DELIMITER +27C6 ; [*0342.0020.0002] # RIGHT S-SHAPED BAG DELIMITER +27C7 ; [*0ABA.0020.0002] # OR WITH DOT INSIDE +27C8 ; [*0ABB.0020.0002] # REVERSE SOLIDUS PRECEDING SUBSET +27C9 ; [*0ABC.0020.0002] # SUPERSET PRECEDING SOLIDUS +27CA ; [*0ABD.0020.0002] # VERTICAL BAR WITH HORIZONTAL STROKE +27CB ; [*0ABE.0020.0002] # MATHEMATICAL RISING DIAGONAL +27CC ; [*0ABF.0020.0002] # LONG DIVISION +27CD ; [*0AC0.0020.0002] # MATHEMATICAL FALLING DIAGONAL +27CE ; [*0AC1.0020.0002] # SQUARED LOGICAL AND +27CF ; [*0AC2.0020.0002] # SQUARED LOGICAL OR +27D0 ; [*0AC3.0020.0002] # WHITE DIAMOND WITH CENTRED DOT +27D1 ; [*0AC4.0020.0002] # AND WITH DOT +27D2 ; [*0AC5.0020.0002] # ELEMENT OF OPENING UPWARDS +27D3 ; [*0AC6.0020.0002] # LOWER RIGHT CORNER WITH DOT +27D4 ; [*0AC7.0020.0002] # UPPER LEFT CORNER WITH DOT +27D5 ; [*0AC8.0020.0002] # LEFT OUTER JOIN +27D6 ; [*0AC9.0020.0002] # RIGHT OUTER JOIN +27D7 ; [*0ACA.0020.0002] # FULL OUTER JOIN +27D8 ; [*0ACB.0020.0002] # LARGE UP TACK +27D9 ; [*0ACC.0020.0002] # LARGE DOWN TACK +27DA ; [*0ACD.0020.0002] # LEFT AND RIGHT DOUBLE TURNSTILE +27DB ; [*0ACE.0020.0002] # LEFT AND RIGHT TACK +27DC ; [*0ACF.0020.0002] # LEFT MULTIMAP +27DD ; [*0AD0.0020.0002] # LONG RIGHT TACK +27DE ; [*0AD1.0020.0002] # LONG LEFT TACK +27DF ; [*0AD2.0020.0002] # UP TACK WITH CIRCLE ABOVE +27E0 ; [*0AD3.0020.0002] # LOZENGE DIVIDED BY HORIZONTAL RULE +27E1 ; [*0AD4.0020.0002] # WHITE CONCAVE-SIDED DIAMOND +27E2 ; [*0AD5.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +27E3 ; [*0AD6.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +27E4 ; [*0AD7.0020.0002] # WHITE SQUARE WITH LEFTWARDS TICK +27E5 ; [*0AD8.0020.0002] # WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; [*0343.0020.0002] # MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; [*0344.0020.0002] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; [*0345.0020.0002] # MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; [*0346.0020.0002] # MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; [*0347.0020.0002] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; [*0348.0020.0002] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; [*0349.0020.0002] # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; [*034A.0020.0002] # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; [*034B.0020.0002] # MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; [*034C.0020.0002] # MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0 ; [*0AD9.0020.0002] # UPWARDS QUADRUPLE ARROW +27F1 ; [*0ADA.0020.0002] # DOWNWARDS QUADRUPLE ARROW +27F2 ; [*0ADB.0020.0002] # ANTICLOCKWISE GAPPED CIRCLE ARROW +27F3 ; [*0ADC.0020.0002] # CLOCKWISE GAPPED CIRCLE ARROW +27F4 ; [*0ADD.0020.0002] # RIGHT ARROW WITH CIRCLED PLUS +27F5 ; [*0ADE.0020.0002] # LONG LEFTWARDS ARROW +27F6 ; [*0ADF.0020.0002] # LONG RIGHTWARDS ARROW +27F7 ; [*0AE0.0020.0002] # LONG LEFT RIGHT ARROW +27F8 ; [*0AE1.0020.0002] # LONG LEFTWARDS DOUBLE ARROW +27F9 ; [*0AE2.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW +27FA ; [*0AE3.0020.0002] # LONG LEFT RIGHT DOUBLE ARROW +27FB ; [*0AE4.0020.0002] # LONG LEFTWARDS ARROW FROM BAR +27FC ; [*0AE5.0020.0002] # LONG RIGHTWARDS ARROW FROM BAR +27FD ; [*0AE6.0020.0002] # LONG LEFTWARDS DOUBLE ARROW FROM BAR +27FE ; [*0AE7.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR +27FF ; [*0AE8.0020.0002] # LONG RIGHTWARDS SQUIGGLE ARROW +2800 ; [*0D9C.0020.0002] # BRAILLE PATTERN BLANK +2801 ; [*0D9D.0020.0002] # BRAILLE PATTERN DOTS-1 +2802 ; [*0D9E.0020.0002] # BRAILLE PATTERN DOTS-2 +2803 ; [*0D9F.0020.0002] # BRAILLE PATTERN DOTS-12 +2804 ; [*0DA0.0020.0002] # BRAILLE PATTERN DOTS-3 +2805 ; [*0DA1.0020.0002] # BRAILLE PATTERN DOTS-13 +2806 ; [*0DA2.0020.0002] # BRAILLE PATTERN DOTS-23 +2807 ; [*0DA3.0020.0002] # BRAILLE PATTERN DOTS-123 +2808 ; [*0DA4.0020.0002] # BRAILLE PATTERN DOTS-4 +2809 ; [*0DA5.0020.0002] # BRAILLE PATTERN DOTS-14 +280A ; [*0DA6.0020.0002] # BRAILLE PATTERN DOTS-24 +280B ; [*0DA7.0020.0002] # BRAILLE PATTERN DOTS-124 +280C ; [*0DA8.0020.0002] # BRAILLE PATTERN DOTS-34 +280D ; [*0DA9.0020.0002] # BRAILLE PATTERN DOTS-134 +280E ; [*0DAA.0020.0002] # BRAILLE PATTERN DOTS-234 +280F ; [*0DAB.0020.0002] # BRAILLE PATTERN DOTS-1234 +2810 ; [*0DAC.0020.0002] # BRAILLE PATTERN DOTS-5 +2811 ; [*0DAD.0020.0002] # BRAILLE PATTERN DOTS-15 +2812 ; [*0DAE.0020.0002] # BRAILLE PATTERN DOTS-25 +2813 ; [*0DAF.0020.0002] # BRAILLE PATTERN DOTS-125 +2814 ; [*0DB0.0020.0002] # BRAILLE PATTERN DOTS-35 +2815 ; [*0DB1.0020.0002] # BRAILLE PATTERN DOTS-135 +2816 ; [*0DB2.0020.0002] # BRAILLE PATTERN DOTS-235 +2817 ; [*0DB3.0020.0002] # BRAILLE PATTERN DOTS-1235 +2818 ; [*0DB4.0020.0002] # BRAILLE PATTERN DOTS-45 +2819 ; [*0DB5.0020.0002] # BRAILLE PATTERN DOTS-145 +281A ; [*0DB6.0020.0002] # BRAILLE PATTERN DOTS-245 +281B ; [*0DB7.0020.0002] # BRAILLE PATTERN DOTS-1245 +281C ; [*0DB8.0020.0002] # BRAILLE PATTERN DOTS-345 +281D ; [*0DB9.0020.0002] # BRAILLE PATTERN DOTS-1345 +281E ; [*0DBA.0020.0002] # BRAILLE PATTERN DOTS-2345 +281F ; [*0DBB.0020.0002] # BRAILLE PATTERN DOTS-12345 +2820 ; [*0DBC.0020.0002] # BRAILLE PATTERN DOTS-6 +2821 ; [*0DBD.0020.0002] # BRAILLE PATTERN DOTS-16 +2822 ; [*0DBE.0020.0002] # BRAILLE PATTERN DOTS-26 +2823 ; [*0DBF.0020.0002] # BRAILLE PATTERN DOTS-126 +2824 ; [*0DC0.0020.0002] # BRAILLE PATTERN DOTS-36 +2825 ; [*0DC1.0020.0002] # BRAILLE PATTERN DOTS-136 +2826 ; [*0DC2.0020.0002] # BRAILLE PATTERN DOTS-236 +2827 ; [*0DC3.0020.0002] # BRAILLE PATTERN DOTS-1236 +2828 ; [*0DC4.0020.0002] # BRAILLE PATTERN DOTS-46 +2829 ; [*0DC5.0020.0002] # BRAILLE PATTERN DOTS-146 +282A ; [*0DC6.0020.0002] # BRAILLE PATTERN DOTS-246 +282B ; [*0DC7.0020.0002] # BRAILLE PATTERN DOTS-1246 +282C ; [*0DC8.0020.0002] # BRAILLE PATTERN DOTS-346 +282D ; [*0DC9.0020.0002] # BRAILLE PATTERN DOTS-1346 +282E ; [*0DCA.0020.0002] # BRAILLE PATTERN DOTS-2346 +282F ; [*0DCB.0020.0002] # BRAILLE PATTERN DOTS-12346 +2830 ; [*0DCC.0020.0002] # BRAILLE PATTERN DOTS-56 +2831 ; [*0DCD.0020.0002] # BRAILLE PATTERN DOTS-156 +2832 ; [*0DCE.0020.0002] # BRAILLE PATTERN DOTS-256 +2833 ; [*0DCF.0020.0002] # BRAILLE PATTERN DOTS-1256 +2834 ; [*0DD0.0020.0002] # BRAILLE PATTERN DOTS-356 +2835 ; [*0DD1.0020.0002] # BRAILLE PATTERN DOTS-1356 +2836 ; [*0DD2.0020.0002] # BRAILLE PATTERN DOTS-2356 +2837 ; [*0DD3.0020.0002] # BRAILLE PATTERN DOTS-12356 +2838 ; [*0DD4.0020.0002] # BRAILLE PATTERN DOTS-456 +2839 ; [*0DD5.0020.0002] # BRAILLE PATTERN DOTS-1456 +283A ; [*0DD6.0020.0002] # BRAILLE PATTERN DOTS-2456 +283B ; [*0DD7.0020.0002] # BRAILLE PATTERN DOTS-12456 +283C ; [*0DD8.0020.0002] # BRAILLE PATTERN DOTS-3456 +283D ; [*0DD9.0020.0002] # BRAILLE PATTERN DOTS-13456 +283E ; [*0DDA.0020.0002] # BRAILLE PATTERN DOTS-23456 +283F ; [*0DDB.0020.0002] # BRAILLE PATTERN DOTS-123456 +2840 ; [*0DDC.0020.0002] # BRAILLE PATTERN DOTS-7 +2841 ; [*0DDD.0020.0002] # BRAILLE PATTERN DOTS-17 +2842 ; [*0DDE.0020.0002] # BRAILLE PATTERN DOTS-27 +2843 ; [*0DDF.0020.0002] # BRAILLE PATTERN DOTS-127 +2844 ; [*0DE0.0020.0002] # BRAILLE PATTERN DOTS-37 +2845 ; [*0DE1.0020.0002] # BRAILLE PATTERN DOTS-137 +2846 ; [*0DE2.0020.0002] # BRAILLE PATTERN DOTS-237 +2847 ; [*0DE3.0020.0002] # BRAILLE PATTERN DOTS-1237 +2848 ; [*0DE4.0020.0002] # BRAILLE PATTERN DOTS-47 +2849 ; [*0DE5.0020.0002] # BRAILLE PATTERN DOTS-147 +284A ; [*0DE6.0020.0002] # BRAILLE PATTERN DOTS-247 +284B ; [*0DE7.0020.0002] # BRAILLE PATTERN DOTS-1247 +284C ; [*0DE8.0020.0002] # BRAILLE PATTERN DOTS-347 +284D ; [*0DE9.0020.0002] # BRAILLE PATTERN DOTS-1347 +284E ; [*0DEA.0020.0002] # BRAILLE PATTERN DOTS-2347 +284F ; [*0DEB.0020.0002] # BRAILLE PATTERN DOTS-12347 +2850 ; [*0DEC.0020.0002] # BRAILLE PATTERN DOTS-57 +2851 ; [*0DED.0020.0002] # BRAILLE PATTERN DOTS-157 +2852 ; [*0DEE.0020.0002] # BRAILLE PATTERN DOTS-257 +2853 ; [*0DEF.0020.0002] # BRAILLE PATTERN DOTS-1257 +2854 ; [*0DF0.0020.0002] # BRAILLE PATTERN DOTS-357 +2855 ; [*0DF1.0020.0002] # BRAILLE PATTERN DOTS-1357 +2856 ; [*0DF2.0020.0002] # BRAILLE PATTERN DOTS-2357 +2857 ; [*0DF3.0020.0002] # BRAILLE PATTERN DOTS-12357 +2858 ; [*0DF4.0020.0002] # BRAILLE PATTERN DOTS-457 +2859 ; [*0DF5.0020.0002] # BRAILLE PATTERN DOTS-1457 +285A ; [*0DF6.0020.0002] # BRAILLE PATTERN DOTS-2457 +285B ; [*0DF7.0020.0002] # BRAILLE PATTERN DOTS-12457 +285C ; [*0DF8.0020.0002] # BRAILLE PATTERN DOTS-3457 +285D ; [*0DF9.0020.0002] # BRAILLE PATTERN DOTS-13457 +285E ; [*0DFA.0020.0002] # BRAILLE PATTERN DOTS-23457 +285F ; [*0DFB.0020.0002] # BRAILLE PATTERN DOTS-123457 +2860 ; [*0DFC.0020.0002] # BRAILLE PATTERN DOTS-67 +2861 ; [*0DFD.0020.0002] # BRAILLE PATTERN DOTS-167 +2862 ; [*0DFE.0020.0002] # BRAILLE PATTERN DOTS-267 +2863 ; [*0DFF.0020.0002] # BRAILLE PATTERN DOTS-1267 +2864 ; [*0E00.0020.0002] # BRAILLE PATTERN DOTS-367 +2865 ; [*0E01.0020.0002] # BRAILLE PATTERN DOTS-1367 +2866 ; [*0E02.0020.0002] # BRAILLE PATTERN DOTS-2367 +2867 ; [*0E03.0020.0002] # BRAILLE PATTERN DOTS-12367 +2868 ; [*0E04.0020.0002] # BRAILLE PATTERN DOTS-467 +2869 ; [*0E05.0020.0002] # BRAILLE PATTERN DOTS-1467 +286A ; [*0E06.0020.0002] # BRAILLE PATTERN DOTS-2467 +286B ; [*0E07.0020.0002] # BRAILLE PATTERN DOTS-12467 +286C ; [*0E08.0020.0002] # BRAILLE PATTERN DOTS-3467 +286D ; [*0E09.0020.0002] # BRAILLE PATTERN DOTS-13467 +286E ; [*0E0A.0020.0002] # BRAILLE PATTERN DOTS-23467 +286F ; [*0E0B.0020.0002] # BRAILLE PATTERN DOTS-123467 +2870 ; [*0E0C.0020.0002] # BRAILLE PATTERN DOTS-567 +2871 ; [*0E0D.0020.0002] # BRAILLE PATTERN DOTS-1567 +2872 ; [*0E0E.0020.0002] # BRAILLE PATTERN DOTS-2567 +2873 ; [*0E0F.0020.0002] # BRAILLE PATTERN DOTS-12567 +2874 ; [*0E10.0020.0002] # BRAILLE PATTERN DOTS-3567 +2875 ; [*0E11.0020.0002] # BRAILLE PATTERN DOTS-13567 +2876 ; [*0E12.0020.0002] # BRAILLE PATTERN DOTS-23567 +2877 ; [*0E13.0020.0002] # BRAILLE PATTERN DOTS-123567 +2878 ; [*0E14.0020.0002] # BRAILLE PATTERN DOTS-4567 +2879 ; [*0E15.0020.0002] # BRAILLE PATTERN DOTS-14567 +287A ; [*0E16.0020.0002] # BRAILLE PATTERN DOTS-24567 +287B ; [*0E17.0020.0002] # BRAILLE PATTERN DOTS-124567 +287C ; [*0E18.0020.0002] # BRAILLE PATTERN DOTS-34567 +287D ; [*0E19.0020.0002] # BRAILLE PATTERN DOTS-134567 +287E ; [*0E1A.0020.0002] # BRAILLE PATTERN DOTS-234567 +287F ; [*0E1B.0020.0002] # BRAILLE PATTERN DOTS-1234567 +2880 ; [*0E1C.0020.0002] # BRAILLE PATTERN DOTS-8 +2881 ; [*0E1D.0020.0002] # BRAILLE PATTERN DOTS-18 +2882 ; [*0E1E.0020.0002] # BRAILLE PATTERN DOTS-28 +2883 ; [*0E1F.0020.0002] # BRAILLE PATTERN DOTS-128 +2884 ; [*0E20.0020.0002] # BRAILLE PATTERN DOTS-38 +2885 ; [*0E21.0020.0002] # BRAILLE PATTERN DOTS-138 +2886 ; [*0E22.0020.0002] # BRAILLE PATTERN DOTS-238 +2887 ; [*0E23.0020.0002] # BRAILLE PATTERN DOTS-1238 +2888 ; [*0E24.0020.0002] # BRAILLE PATTERN DOTS-48 +2889 ; [*0E25.0020.0002] # BRAILLE PATTERN DOTS-148 +288A ; [*0E26.0020.0002] # BRAILLE PATTERN DOTS-248 +288B ; [*0E27.0020.0002] # BRAILLE PATTERN DOTS-1248 +288C ; [*0E28.0020.0002] # BRAILLE PATTERN DOTS-348 +288D ; [*0E29.0020.0002] # BRAILLE PATTERN DOTS-1348 +288E ; [*0E2A.0020.0002] # BRAILLE PATTERN DOTS-2348 +288F ; [*0E2B.0020.0002] # BRAILLE PATTERN DOTS-12348 +2890 ; [*0E2C.0020.0002] # BRAILLE PATTERN DOTS-58 +2891 ; [*0E2D.0020.0002] # BRAILLE PATTERN DOTS-158 +2892 ; [*0E2E.0020.0002] # BRAILLE PATTERN DOTS-258 +2893 ; [*0E2F.0020.0002] # BRAILLE PATTERN DOTS-1258 +2894 ; [*0E30.0020.0002] # BRAILLE PATTERN DOTS-358 +2895 ; [*0E31.0020.0002] # BRAILLE PATTERN DOTS-1358 +2896 ; [*0E32.0020.0002] # BRAILLE PATTERN DOTS-2358 +2897 ; [*0E33.0020.0002] # BRAILLE PATTERN DOTS-12358 +2898 ; [*0E34.0020.0002] # BRAILLE PATTERN DOTS-458 +2899 ; [*0E35.0020.0002] # BRAILLE PATTERN DOTS-1458 +289A ; [*0E36.0020.0002] # BRAILLE PATTERN DOTS-2458 +289B ; [*0E37.0020.0002] # BRAILLE PATTERN DOTS-12458 +289C ; [*0E38.0020.0002] # BRAILLE PATTERN DOTS-3458 +289D ; [*0E39.0020.0002] # BRAILLE PATTERN DOTS-13458 +289E ; [*0E3A.0020.0002] # BRAILLE PATTERN DOTS-23458 +289F ; [*0E3B.0020.0002] # BRAILLE PATTERN DOTS-123458 +28A0 ; [*0E3C.0020.0002] # BRAILLE PATTERN DOTS-68 +28A1 ; [*0E3D.0020.0002] # BRAILLE PATTERN DOTS-168 +28A2 ; [*0E3E.0020.0002] # BRAILLE PATTERN DOTS-268 +28A3 ; [*0E3F.0020.0002] # BRAILLE PATTERN DOTS-1268 +28A4 ; [*0E40.0020.0002] # BRAILLE PATTERN DOTS-368 +28A5 ; [*0E41.0020.0002] # BRAILLE PATTERN DOTS-1368 +28A6 ; [*0E42.0020.0002] # BRAILLE PATTERN DOTS-2368 +28A7 ; [*0E43.0020.0002] # BRAILLE PATTERN DOTS-12368 +28A8 ; [*0E44.0020.0002] # BRAILLE PATTERN DOTS-468 +28A9 ; [*0E45.0020.0002] # BRAILLE PATTERN DOTS-1468 +28AA ; [*0E46.0020.0002] # BRAILLE PATTERN DOTS-2468 +28AB ; [*0E47.0020.0002] # BRAILLE PATTERN DOTS-12468 +28AC ; [*0E48.0020.0002] # BRAILLE PATTERN DOTS-3468 +28AD ; [*0E49.0020.0002] # BRAILLE PATTERN DOTS-13468 +28AE ; [*0E4A.0020.0002] # BRAILLE PATTERN DOTS-23468 +28AF ; [*0E4B.0020.0002] # BRAILLE PATTERN DOTS-123468 +28B0 ; [*0E4C.0020.0002] # BRAILLE PATTERN DOTS-568 +28B1 ; [*0E4D.0020.0002] # BRAILLE PATTERN DOTS-1568 +28B2 ; [*0E4E.0020.0002] # BRAILLE PATTERN DOTS-2568 +28B3 ; [*0E4F.0020.0002] # BRAILLE PATTERN DOTS-12568 +28B4 ; [*0E50.0020.0002] # BRAILLE PATTERN DOTS-3568 +28B5 ; [*0E51.0020.0002] # BRAILLE PATTERN DOTS-13568 +28B6 ; [*0E52.0020.0002] # BRAILLE PATTERN DOTS-23568 +28B7 ; [*0E53.0020.0002] # BRAILLE PATTERN DOTS-123568 +28B8 ; [*0E54.0020.0002] # BRAILLE PATTERN DOTS-4568 +28B9 ; [*0E55.0020.0002] # BRAILLE PATTERN DOTS-14568 +28BA ; [*0E56.0020.0002] # BRAILLE PATTERN DOTS-24568 +28BB ; [*0E57.0020.0002] # BRAILLE PATTERN DOTS-124568 +28BC ; [*0E58.0020.0002] # BRAILLE PATTERN DOTS-34568 +28BD ; [*0E59.0020.0002] # BRAILLE PATTERN DOTS-134568 +28BE ; [*0E5A.0020.0002] # BRAILLE PATTERN DOTS-234568 +28BF ; [*0E5B.0020.0002] # BRAILLE PATTERN DOTS-1234568 +28C0 ; [*0E5C.0020.0002] # BRAILLE PATTERN DOTS-78 +28C1 ; [*0E5D.0020.0002] # BRAILLE PATTERN DOTS-178 +28C2 ; [*0E5E.0020.0002] # BRAILLE PATTERN DOTS-278 +28C3 ; [*0E5F.0020.0002] # BRAILLE PATTERN DOTS-1278 +28C4 ; [*0E60.0020.0002] # BRAILLE PATTERN DOTS-378 +28C5 ; [*0E61.0020.0002] # BRAILLE PATTERN DOTS-1378 +28C6 ; [*0E62.0020.0002] # BRAILLE PATTERN DOTS-2378 +28C7 ; [*0E63.0020.0002] # BRAILLE PATTERN DOTS-12378 +28C8 ; [*0E64.0020.0002] # BRAILLE PATTERN DOTS-478 +28C9 ; [*0E65.0020.0002] # BRAILLE PATTERN DOTS-1478 +28CA ; [*0E66.0020.0002] # BRAILLE PATTERN DOTS-2478 +28CB ; [*0E67.0020.0002] # BRAILLE PATTERN DOTS-12478 +28CC ; [*0E68.0020.0002] # BRAILLE PATTERN DOTS-3478 +28CD ; [*0E69.0020.0002] # BRAILLE PATTERN DOTS-13478 +28CE ; [*0E6A.0020.0002] # BRAILLE PATTERN DOTS-23478 +28CF ; [*0E6B.0020.0002] # BRAILLE PATTERN DOTS-123478 +28D0 ; [*0E6C.0020.0002] # BRAILLE PATTERN DOTS-578 +28D1 ; [*0E6D.0020.0002] # BRAILLE PATTERN DOTS-1578 +28D2 ; [*0E6E.0020.0002] # BRAILLE PATTERN DOTS-2578 +28D3 ; [*0E6F.0020.0002] # BRAILLE PATTERN DOTS-12578 +28D4 ; [*0E70.0020.0002] # BRAILLE PATTERN DOTS-3578 +28D5 ; [*0E71.0020.0002] # BRAILLE PATTERN DOTS-13578 +28D6 ; [*0E72.0020.0002] # BRAILLE PATTERN DOTS-23578 +28D7 ; [*0E73.0020.0002] # BRAILLE PATTERN DOTS-123578 +28D8 ; [*0E74.0020.0002] # BRAILLE PATTERN DOTS-4578 +28D9 ; [*0E75.0020.0002] # BRAILLE PATTERN DOTS-14578 +28DA ; [*0E76.0020.0002] # BRAILLE PATTERN DOTS-24578 +28DB ; [*0E77.0020.0002] # BRAILLE PATTERN DOTS-124578 +28DC ; [*0E78.0020.0002] # BRAILLE PATTERN DOTS-34578 +28DD ; [*0E79.0020.0002] # BRAILLE PATTERN DOTS-134578 +28DE ; [*0E7A.0020.0002] # BRAILLE PATTERN DOTS-234578 +28DF ; [*0E7B.0020.0002] # BRAILLE PATTERN DOTS-1234578 +28E0 ; [*0E7C.0020.0002] # BRAILLE PATTERN DOTS-678 +28E1 ; [*0E7D.0020.0002] # BRAILLE PATTERN DOTS-1678 +28E2 ; [*0E7E.0020.0002] # BRAILLE PATTERN DOTS-2678 +28E3 ; [*0E7F.0020.0002] # BRAILLE PATTERN DOTS-12678 +28E4 ; [*0E80.0020.0002] # BRAILLE PATTERN DOTS-3678 +28E5 ; [*0E81.0020.0002] # BRAILLE PATTERN DOTS-13678 +28E6 ; [*0E82.0020.0002] # BRAILLE PATTERN DOTS-23678 +28E7 ; [*0E83.0020.0002] # BRAILLE PATTERN DOTS-123678 +28E8 ; [*0E84.0020.0002] # BRAILLE PATTERN DOTS-4678 +28E9 ; [*0E85.0020.0002] # BRAILLE PATTERN DOTS-14678 +28EA ; [*0E86.0020.0002] # BRAILLE PATTERN DOTS-24678 +28EB ; [*0E87.0020.0002] # BRAILLE PATTERN DOTS-124678 +28EC ; [*0E88.0020.0002] # BRAILLE PATTERN DOTS-34678 +28ED ; [*0E89.0020.0002] # BRAILLE PATTERN DOTS-134678 +28EE ; [*0E8A.0020.0002] # BRAILLE PATTERN DOTS-234678 +28EF ; [*0E8B.0020.0002] # BRAILLE PATTERN DOTS-1234678 +28F0 ; [*0E8C.0020.0002] # BRAILLE PATTERN DOTS-5678 +28F1 ; [*0E8D.0020.0002] # BRAILLE PATTERN DOTS-15678 +28F2 ; [*0E8E.0020.0002] # BRAILLE PATTERN DOTS-25678 +28F3 ; [*0E8F.0020.0002] # BRAILLE PATTERN DOTS-125678 +28F4 ; [*0E90.0020.0002] # BRAILLE PATTERN DOTS-35678 +28F5 ; [*0E91.0020.0002] # BRAILLE PATTERN DOTS-135678 +28F6 ; [*0E92.0020.0002] # BRAILLE PATTERN DOTS-235678 +28F7 ; [*0E93.0020.0002] # BRAILLE PATTERN DOTS-1235678 +28F8 ; [*0E94.0020.0002] # BRAILLE PATTERN DOTS-45678 +28F9 ; [*0E95.0020.0002] # BRAILLE PATTERN DOTS-145678 +28FA ; [*0E96.0020.0002] # BRAILLE PATTERN DOTS-245678 +28FB ; [*0E97.0020.0002] # BRAILLE PATTERN DOTS-1245678 +28FC ; [*0E98.0020.0002] # BRAILLE PATTERN DOTS-345678 +28FD ; [*0E99.0020.0002] # BRAILLE PATTERN DOTS-1345678 +28FE ; [*0E9A.0020.0002] # BRAILLE PATTERN DOTS-2345678 +28FF ; [*0E9B.0020.0002] # BRAILLE PATTERN DOTS-12345678 +2900 ; [*0AE9.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2901 ; [*0AEA.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2902 ; [*0AEB.0020.0002] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2903 ; [*0AEC.0020.0002] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2904 ; [*0AED.0020.0002] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +2905 ; [*0AEE.0020.0002] # RIGHTWARDS TWO-HEADED ARROW FROM BAR +2906 ; [*0AEF.0020.0002] # LEFTWARDS DOUBLE ARROW FROM BAR +2907 ; [*0AF0.0020.0002] # RIGHTWARDS DOUBLE ARROW FROM BAR +2908 ; [*0AF1.0020.0002] # DOWNWARDS ARROW WITH HORIZONTAL STROKE +2909 ; [*0AF2.0020.0002] # UPWARDS ARROW WITH HORIZONTAL STROKE +290A ; [*0AF3.0020.0002] # UPWARDS TRIPLE ARROW +290B ; [*0AF4.0020.0002] # DOWNWARDS TRIPLE ARROW +290C ; [*0AF5.0020.0002] # LEFTWARDS DOUBLE DASH ARROW +290D ; [*0AF6.0020.0002] # RIGHTWARDS DOUBLE DASH ARROW +290E ; [*0AF7.0020.0002] # LEFTWARDS TRIPLE DASH ARROW +290F ; [*0AF8.0020.0002] # RIGHTWARDS TRIPLE DASH ARROW +2910 ; [*0AF9.0020.0002] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +2911 ; [*0AFA.0020.0002] # RIGHTWARDS ARROW WITH DOTTED STEM +2912 ; [*0AFB.0020.0002] # UPWARDS ARROW TO BAR +2913 ; [*0AFC.0020.0002] # DOWNWARDS ARROW TO BAR +2914 ; [*0AFD.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2915 ; [*0AFE.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2916 ; [*0AFF.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL +2917 ; [*0B00.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2918 ; [*0B01.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2919 ; [*0B02.0020.0002] # LEFTWARDS ARROW-TAIL +291A ; [*0B03.0020.0002] # RIGHTWARDS ARROW-TAIL +291B ; [*0B04.0020.0002] # LEFTWARDS DOUBLE ARROW-TAIL +291C ; [*0B05.0020.0002] # RIGHTWARDS DOUBLE ARROW-TAIL +291D ; [*0B06.0020.0002] # LEFTWARDS ARROW TO BLACK DIAMOND +291E ; [*0B07.0020.0002] # RIGHTWARDS ARROW TO BLACK DIAMOND +291F ; [*0B08.0020.0002] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +2920 ; [*0B09.0020.0002] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +2921 ; [*0B0A.0020.0002] # NORTH WEST AND SOUTH EAST ARROW +2922 ; [*0B0B.0020.0002] # NORTH EAST AND SOUTH WEST ARROW +2923 ; [*0B0C.0020.0002] # NORTH WEST ARROW WITH HOOK +2924 ; [*0B0D.0020.0002] # NORTH EAST ARROW WITH HOOK +2925 ; [*0B0E.0020.0002] # SOUTH EAST ARROW WITH HOOK +2926 ; [*0B0F.0020.0002] # SOUTH WEST ARROW WITH HOOK +2927 ; [*0B10.0020.0002] # NORTH WEST ARROW AND NORTH EAST ARROW +2928 ; [*0B11.0020.0002] # NORTH EAST ARROW AND SOUTH EAST ARROW +2929 ; [*0B12.0020.0002] # SOUTH EAST ARROW AND SOUTH WEST ARROW +292A ; [*0B13.0020.0002] # SOUTH WEST ARROW AND NORTH WEST ARROW +292B ; [*0B14.0020.0002] # RISING DIAGONAL CROSSING FALLING DIAGONAL +292C ; [*0B15.0020.0002] # FALLING DIAGONAL CROSSING RISING DIAGONAL +292D ; [*0B16.0020.0002] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW +292E ; [*0B17.0020.0002] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW +292F ; [*0B18.0020.0002] # FALLING DIAGONAL CROSSING NORTH EAST ARROW +2930 ; [*0B19.0020.0002] # RISING DIAGONAL CROSSING SOUTH EAST ARROW +2931 ; [*0B1A.0020.0002] # NORTH EAST ARROW CROSSING NORTH WEST ARROW +2932 ; [*0B1B.0020.0002] # NORTH WEST ARROW CROSSING NORTH EAST ARROW +2933 ; [*0B1C.0020.0002] # WAVE ARROW POINTING DIRECTLY RIGHT +2934 ; [*0B1D.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS +2935 ; [*0B1E.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +2936 ; [*0B1F.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +2937 ; [*0B20.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +2938 ; [*0B21.0020.0002] # RIGHT-SIDE ARC CLOCKWISE ARROW +2939 ; [*0B22.0020.0002] # LEFT-SIDE ARC ANTICLOCKWISE ARROW +293A ; [*0B23.0020.0002] # TOP ARC ANTICLOCKWISE ARROW +293B ; [*0B24.0020.0002] # BOTTOM ARC ANTICLOCKWISE ARROW +293C ; [*0B25.0020.0002] # TOP ARC CLOCKWISE ARROW WITH MINUS +293D ; [*0B26.0020.0002] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS +293E ; [*0B27.0020.0002] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW +293F ; [*0B28.0020.0002] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW +2940 ; [*0B29.0020.0002] # ANTICLOCKWISE CLOSED CIRCLE ARROW +2941 ; [*0B2A.0020.0002] # CLOCKWISE CLOSED CIRCLE ARROW +2942 ; [*0B2B.0020.0002] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW +2943 ; [*0B2C.0020.0002] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW +2944 ; [*0B2D.0020.0002] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW +2945 ; [*0B2E.0020.0002] # RIGHTWARDS ARROW WITH PLUS BELOW +2946 ; [*0B2F.0020.0002] # LEFTWARDS ARROW WITH PLUS BELOW +2947 ; [*0B30.0020.0002] # RIGHTWARDS ARROW THROUGH X +2948 ; [*0B31.0020.0002] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE +2949 ; [*0B32.0020.0002] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +294A ; [*0B33.0020.0002] # LEFT BARB UP RIGHT BARB DOWN HARPOON +294B ; [*0B34.0020.0002] # LEFT BARB DOWN RIGHT BARB UP HARPOON +294C ; [*0B35.0020.0002] # UP BARB RIGHT DOWN BARB LEFT HARPOON +294D ; [*0B36.0020.0002] # UP BARB LEFT DOWN BARB RIGHT HARPOON +294E ; [*0B37.0020.0002] # LEFT BARB UP RIGHT BARB UP HARPOON +294F ; [*0B38.0020.0002] # UP BARB RIGHT DOWN BARB RIGHT HARPOON +2950 ; [*0B39.0020.0002] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON +2951 ; [*0B3A.0020.0002] # UP BARB LEFT DOWN BARB LEFT HARPOON +2952 ; [*0B3B.0020.0002] # LEFTWARDS HARPOON WITH BARB UP TO BAR +2953 ; [*0B3C.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP TO BAR +2954 ; [*0B3D.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT TO BAR +2955 ; [*0B3E.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +2956 ; [*0B3F.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR +2957 ; [*0B40.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +2958 ; [*0B41.0020.0002] # UPWARDS HARPOON WITH BARB LEFT TO BAR +2959 ; [*0B42.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR +295A ; [*0B43.0020.0002] # LEFTWARDS HARPOON WITH BARB UP FROM BAR +295B ; [*0B44.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR +295C ; [*0B45.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR +295D ; [*0B46.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +295E ; [*0B47.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +295F ; [*0B48.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +2960 ; [*0B49.0020.0002] # UPWARDS HARPOON WITH BARB LEFT FROM BAR +2961 ; [*0B4A.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +2962 ; [*0B4B.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +2963 ; [*0B4C.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2964 ; [*0B4D.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2965 ; [*0B4E.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +2966 ; [*0B4F.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +2967 ; [*0B50.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2968 ; [*0B51.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +2969 ; [*0B52.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +296A ; [*0B53.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296B ; [*0B54.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296C ; [*0B55.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296D ; [*0B56.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296E ; [*0B57.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +296F ; [*0B58.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2970 ; [*0B59.0020.0002] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD +2971 ; [*0B5A.0020.0002] # EQUALS SIGN ABOVE RIGHTWARDS ARROW +2972 ; [*0B5B.0020.0002] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2973 ; [*0B5C.0020.0002] # LEFTWARDS ARROW ABOVE TILDE OPERATOR +2974 ; [*0B5D.0020.0002] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR +2975 ; [*0B5E.0020.0002] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +2976 ; [*0B5F.0020.0002] # LESS-THAN ABOVE LEFTWARDS ARROW +2977 ; [*0B60.0020.0002] # LEFTWARDS ARROW THROUGH LESS-THAN +2978 ; [*0B61.0020.0002] # GREATER-THAN ABOVE RIGHTWARDS ARROW +2979 ; [*0B62.0020.0002] # SUBSET ABOVE RIGHTWARDS ARROW +297A ; [*0B63.0020.0002] # LEFTWARDS ARROW THROUGH SUBSET +297B ; [*0B64.0020.0002] # SUPERSET ABOVE LEFTWARDS ARROW +297C ; [*0B65.0020.0002] # LEFT FISH TAIL +297D ; [*0B66.0020.0002] # RIGHT FISH TAIL +297E ; [*0B67.0020.0002] # UP FISH TAIL +297F ; [*0B68.0020.0002] # DOWN FISH TAIL +2980 ; [*0B69.0020.0002] # TRIPLE VERTICAL BAR DELIMITER +2981 ; [*0B6A.0020.0002] # Z NOTATION SPOT +2982 ; [*0B6B.0020.0002] # Z NOTATION TYPE COLON +2983 ; [*032B.0020.0002] # LEFT WHITE CURLY BRACKET +2984 ; [*032C.0020.0002] # RIGHT WHITE CURLY BRACKET +2985 ; [*032D.0020.0002] # LEFT WHITE PARENTHESIS +2986 ; [*032E.0020.0002] # RIGHT WHITE PARENTHESIS +2987 ; [*032F.0020.0002] # Z NOTATION LEFT IMAGE BRACKET +2988 ; [*0330.0020.0002] # Z NOTATION RIGHT IMAGE BRACKET +2989 ; [*0331.0020.0002] # Z NOTATION LEFT BINDING BRACKET +298A ; [*0332.0020.0002] # Z NOTATION RIGHT BINDING BRACKET +298B ; [*0333.0020.0002] # LEFT SQUARE BRACKET WITH UNDERBAR +298C ; [*0334.0020.0002] # RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; [*0335.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; [*0336.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; [*0337.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; [*0338.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; [*0339.0020.0002] # LEFT ANGLE BRACKET WITH DOT +2992 ; [*033A.0020.0002] # RIGHT ANGLE BRACKET WITH DOT +2993 ; [*033B.0020.0002] # LEFT ARC LESS-THAN BRACKET +2994 ; [*033C.0020.0002] # RIGHT ARC GREATER-THAN BRACKET +2995 ; [*033D.0020.0002] # DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; [*033E.0020.0002] # DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; [*033F.0020.0002] # LEFT BLACK TORTOISE SHELL BRACKET +2998 ; [*0340.0020.0002] # RIGHT BLACK TORTOISE SHELL BRACKET +2999 ; [*0B6C.0020.0002] # DOTTED FENCE +299A ; [*0B6D.0020.0002] # VERTICAL ZIGZAG LINE +299B ; [*0B6E.0020.0002] # MEASURED ANGLE OPENING LEFT +299C ; [*0B6F.0020.0002] # RIGHT ANGLE VARIANT WITH SQUARE +299D ; [*0B70.0020.0002] # MEASURED RIGHT ANGLE WITH DOT +299E ; [*0B71.0020.0002] # ANGLE WITH S INSIDE +299F ; [*0B72.0020.0002] # ACUTE ANGLE +29A0 ; [*0B73.0020.0002] # SPHERICAL ANGLE OPENING LEFT +29A1 ; [*0B74.0020.0002] # SPHERICAL ANGLE OPENING UP +29A2 ; [*0B75.0020.0002] # TURNED ANGLE +29A3 ; [*0B76.0020.0002] # REVERSED ANGLE +29A4 ; [*0B77.0020.0002] # ANGLE WITH UNDERBAR +29A5 ; [*0B78.0020.0002] # REVERSED ANGLE WITH UNDERBAR +29A6 ; [*0B79.0020.0002] # OBLIQUE ANGLE OPENING UP +29A7 ; [*0B7A.0020.0002] # OBLIQUE ANGLE OPENING DOWN +29A8 ; [*0B7B.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +29A9 ; [*0B7C.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +29AA ; [*0B7D.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +29AB ; [*0B7E.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +29AC ; [*0B7F.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +29AD ; [*0B80.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +29AE ; [*0B81.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +29AF ; [*0B82.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +29B0 ; [*0B83.0020.0002] # REVERSED EMPTY SET +29B1 ; [*0B84.0020.0002] # EMPTY SET WITH OVERBAR +29B2 ; [*0B85.0020.0002] # EMPTY SET WITH SMALL CIRCLE ABOVE +29B3 ; [*0B86.0020.0002] # EMPTY SET WITH RIGHT ARROW ABOVE +29B4 ; [*0B87.0020.0002] # EMPTY SET WITH LEFT ARROW ABOVE +29B5 ; [*0B88.0020.0002] # CIRCLE WITH HORIZONTAL BAR +29B6 ; [*0B89.0020.0002] # CIRCLED VERTICAL BAR +29B7 ; [*0B8A.0020.0002] # CIRCLED PARALLEL +29B8 ; [*0B8B.0020.0002] # CIRCLED REVERSE SOLIDUS +29B9 ; [*0B8C.0020.0002] # CIRCLED PERPENDICULAR +29BA ; [*0B8D.0020.0002] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR +29BB ; [*0B8E.0020.0002] # CIRCLE WITH SUPERIMPOSED X +29BC ; [*0B8F.0020.0002] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +29BD ; [*0B90.0020.0002] # UP ARROW THROUGH CIRCLE +29BE ; [*0B91.0020.0002] # CIRCLED WHITE BULLET +29BF ; [*0B92.0020.0002] # CIRCLED BULLET +29C0 ; [*0B93.0020.0002] # CIRCLED LESS-THAN +29C1 ; [*0B94.0020.0002] # CIRCLED GREATER-THAN +29C2 ; [*0B95.0020.0002] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT +29C3 ; [*0B96.0020.0002] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +29C4 ; [*0B97.0020.0002] # SQUARED RISING DIAGONAL SLASH +29C5 ; [*0B98.0020.0002] # SQUARED FALLING DIAGONAL SLASH +29C6 ; [*0B99.0020.0002] # SQUARED ASTERISK +29C7 ; [*0B9A.0020.0002] # SQUARED SMALL CIRCLE +29C8 ; [*0B9B.0020.0002] # SQUARED SQUARE +29C9 ; [*0B9C.0020.0002] # TWO JOINED SQUARES +29CA ; [*0B9D.0020.0002] # TRIANGLE WITH DOT ABOVE +29CB ; [*0B9E.0020.0002] # TRIANGLE WITH UNDERBAR +29CC ; [*0B9F.0020.0002] # S IN TRIANGLE +29CD ; [*0BA0.0020.0002] # TRIANGLE WITH SERIFS AT BOTTOM +29CE ; [*0BA1.0020.0002] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE +29CF ; [*0BA2.0020.0002] # LEFT TRIANGLE BESIDE VERTICAL BAR +29D0 ; [*0BA3.0020.0002] # VERTICAL BAR BESIDE RIGHT TRIANGLE +29D1 ; [*0BA4.0020.0002] # BOWTIE WITH LEFT HALF BLACK +29D2 ; [*0BA5.0020.0002] # BOWTIE WITH RIGHT HALF BLACK +29D3 ; [*0BA6.0020.0002] # BLACK BOWTIE +29D4 ; [*0BA7.0020.0002] # TIMES WITH LEFT HALF BLACK +29D5 ; [*0BA8.0020.0002] # TIMES WITH RIGHT HALF BLACK +29D6 ; [*0BA9.0020.0002] # WHITE HOURGLASS +29D7 ; [*0BAA.0020.0002] # BLACK HOURGLASS +29D8 ; [*0385.0020.0002] # LEFT WIGGLY FENCE +29D9 ; [*0386.0020.0002] # RIGHT WIGGLY FENCE +29DA ; [*0387.0020.0002] # LEFT DOUBLE WIGGLY FENCE +29DB ; [*0388.0020.0002] # RIGHT DOUBLE WIGGLY FENCE +29DC ; [*0BAB.0020.0002] # INCOMPLETE INFINITY +29DD ; [*0BAC.0020.0002] # TIE OVER INFINITY +29DE ; [*0BAD.0020.0002] # INFINITY NEGATED WITH VERTICAL BAR +29DF ; [*0BAE.0020.0002] # DOUBLE-ENDED MULTIMAP +29E0 ; [*0BAF.0020.0002] # SQUARE WITH CONTOURED OUTLINE +29E1 ; [*0BB0.0020.0002] # INCREASES AS +29E2 ; [*0BB1.0020.0002] # SHUFFLE PRODUCT +29E3 ; [*0BB2.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL +29E4 ; [*0BB3.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +29E5 ; [*0BB4.0020.0002] # IDENTICAL TO AND SLANTED PARALLEL +29E6 ; [*0BB5.0020.0002] # GLEICH STARK +29E7 ; [*0BB6.0020.0002] # THERMODYNAMIC +29E8 ; [*0BB7.0020.0002] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +29E9 ; [*0BB8.0020.0002] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +29EA ; [*0BB9.0020.0002] # BLACK DIAMOND WITH DOWN ARROW +29EB ; [*0BBA.0020.0002] # BLACK LOZENGE +29EC ; [*0BBB.0020.0002] # WHITE CIRCLE WITH DOWN ARROW +29ED ; [*0BBC.0020.0002] # BLACK CIRCLE WITH DOWN ARROW +29EE ; [*0BBD.0020.0002] # ERROR-BARRED WHITE SQUARE +29EF ; [*0BBE.0020.0002] # ERROR-BARRED BLACK SQUARE +29F0 ; [*0BBF.0020.0002] # ERROR-BARRED WHITE DIAMOND +29F1 ; [*0BC0.0020.0002] # ERROR-BARRED BLACK DIAMOND +29F2 ; [*0BC1.0020.0002] # ERROR-BARRED WHITE CIRCLE +29F3 ; [*0BC2.0020.0002] # ERROR-BARRED BLACK CIRCLE +29F4 ; [*0BC3.0020.0002] # RULE-DELAYED +29F5 ; [*0BC4.0020.0002] # REVERSE SOLIDUS OPERATOR +29F6 ; [*0BC5.0020.0002] # SOLIDUS WITH OVERBAR +29F7 ; [*0BC6.0020.0002] # REVERSE SOLIDUS WITH HORIZONTAL STROKE +29F8 ; [*0BC7.0020.0002] # BIG SOLIDUS +29F9 ; [*0BC8.0020.0002] # BIG REVERSE SOLIDUS +29FA ; [*0BC9.0020.0002] # DOUBLE PLUS +29FB ; [*0BCA.0020.0002] # TRIPLE PLUS +29FC ; [*0329.0020.0002] # LEFT-POINTING CURVED ANGLE BRACKET +29FD ; [*032A.0020.0002] # RIGHT-POINTING CURVED ANGLE BRACKET +29FE ; [*0BCB.0020.0002] # TINY +29FF ; [*0BCC.0020.0002] # MINY +2A00 ; [*0BCD.0020.0002] # N-ARY CIRCLED DOT OPERATOR +2A01 ; [*0BCE.0020.0002] # N-ARY CIRCLED PLUS OPERATOR +2A02 ; [*0BCF.0020.0002] # N-ARY CIRCLED TIMES OPERATOR +2A03 ; [*0BD0.0020.0002] # N-ARY UNION OPERATOR WITH DOT +2A04 ; [*0BD1.0020.0002] # N-ARY UNION OPERATOR WITH PLUS +2A05 ; [*0BD2.0020.0002] # N-ARY SQUARE INTERSECTION OPERATOR +2A06 ; [*0BD3.0020.0002] # N-ARY SQUARE UNION OPERATOR +2A07 ; [*0BD4.0020.0002] # TWO LOGICAL AND OPERATOR +2A08 ; [*0BD5.0020.0002] # TWO LOGICAL OR OPERATOR +2A09 ; [*0BD6.0020.0002] # N-ARY TIMES OPERATOR +2A0A ; [*0BD7.0020.0002] # MODULO TWO SUM +2A0B ; [*0BD8.0020.0002] # SUMMATION WITH INTEGRAL +2A0C ; [*063C.0020.0004][*063C.0020.0004][*063C.0020.0004][*063C.0020.0004] # QUADRUPLE INTEGRAL OPERATOR +2A0D ; [*0BD9.0020.0002] # FINITE PART INTEGRAL +2A0E ; [*0BDA.0020.0002] # INTEGRAL WITH DOUBLE STROKE +2A0F ; [*0BDB.0020.0002] # INTEGRAL AVERAGE WITH SLASH +2A10 ; [*0BDC.0020.0002] # CIRCULATION FUNCTION +2A11 ; [*0BDD.0020.0002] # ANTICLOCKWISE INTEGRATION +2A12 ; [*0BDE.0020.0002] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +2A13 ; [*0BDF.0020.0002] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +2A14 ; [*0BE0.0020.0002] # LINE INTEGRATION NOT INCLUDING THE POLE +2A15 ; [*0BE1.0020.0002] # INTEGRAL AROUND A POINT OPERATOR +2A16 ; [*0BE2.0020.0002] # QUATERNION INTEGRAL OPERATOR +2A17 ; [*0BE3.0020.0002] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +2A18 ; [*0BE4.0020.0002] # INTEGRAL WITH TIMES SIGN +2A19 ; [*0BE5.0020.0002] # INTEGRAL WITH INTERSECTION +2A1A ; [*0BE6.0020.0002] # INTEGRAL WITH UNION +2A1B ; [*0BE7.0020.0002] # INTEGRAL WITH OVERBAR +2A1C ; [*0BE8.0020.0002] # INTEGRAL WITH UNDERBAR +2A1D ; [*0BE9.0020.0002] # JOIN +2A1E ; [*0BEA.0020.0002] # LARGE LEFT TRIANGLE OPERATOR +2A1F ; [*0BEB.0020.0002] # Z NOTATION SCHEMA COMPOSITION +2A20 ; [*0BEC.0020.0002] # Z NOTATION SCHEMA PIPING +2A21 ; [*0BED.0020.0002] # Z NOTATION SCHEMA PROJECTION +2A22 ; [*0BEE.0020.0002] # PLUS SIGN WITH SMALL CIRCLE ABOVE +2A23 ; [*0BEF.0020.0002] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +2A24 ; [*0BF0.0020.0002] # PLUS SIGN WITH TILDE ABOVE +2A25 ; [*0BF1.0020.0002] # PLUS SIGN WITH DOT BELOW +2A26 ; [*0BF2.0020.0002] # PLUS SIGN WITH TILDE BELOW +2A27 ; [*0BF3.0020.0002] # PLUS SIGN WITH SUBSCRIPT TWO +2A28 ; [*0BF4.0020.0002] # PLUS SIGN WITH BLACK TRIANGLE +2A29 ; [*0BF5.0020.0002] # MINUS SIGN WITH COMMA ABOVE +2A2A ; [*0BF6.0020.0002] # MINUS SIGN WITH DOT BELOW +2A2B ; [*0BF7.0020.0002] # MINUS SIGN WITH FALLING DOTS +2A2C ; [*0BF8.0020.0002] # MINUS SIGN WITH RISING DOTS +2A2D ; [*0BF9.0020.0002] # PLUS SIGN IN LEFT HALF CIRCLE +2A2E ; [*0BFA.0020.0002] # PLUS SIGN IN RIGHT HALF CIRCLE +2A2F ; [*0BFB.0020.0002] # VECTOR OR CROSS PRODUCT +2A30 ; [*0BFC.0020.0002] # MULTIPLICATION SIGN WITH DOT ABOVE +2A31 ; [*0BFD.0020.0002] # MULTIPLICATION SIGN WITH UNDERBAR +2A32 ; [*0BFE.0020.0002] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED +2A33 ; [*0BFF.0020.0002] # SMASH PRODUCT +2A34 ; [*0C00.0020.0002] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35 ; [*0C01.0020.0002] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A36 ; [*0C02.0020.0002] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +2A37 ; [*0C03.0020.0002] # MULTIPLICATION SIGN IN DOUBLE CIRCLE +2A38 ; [*0C04.0020.0002] # CIRCLED DIVISION SIGN +2A39 ; [*0C05.0020.0002] # PLUS SIGN IN TRIANGLE +2A3A ; [*0C06.0020.0002] # MINUS SIGN IN TRIANGLE +2A3B ; [*0C07.0020.0002] # MULTIPLICATION SIGN IN TRIANGLE +2A3C ; [*0C08.0020.0002] # INTERIOR PRODUCT +2A3D ; [*0C09.0020.0002] # RIGHTHAND INTERIOR PRODUCT +2A3E ; [*0C0A.0020.0002] # Z NOTATION RELATIONAL COMPOSITION +2A3F ; [*0C0B.0020.0002] # AMALGAMATION OR COPRODUCT +2A40 ; [*0C0C.0020.0002] # INTERSECTION WITH DOT +2A41 ; [*0C0D.0020.0002] # UNION WITH MINUS SIGN +2A42 ; [*0C0E.0020.0002] # UNION WITH OVERBAR +2A43 ; [*0C0F.0020.0002] # INTERSECTION WITH OVERBAR +2A44 ; [*0C10.0020.0002] # INTERSECTION WITH LOGICAL AND +2A45 ; [*0C11.0020.0002] # UNION WITH LOGICAL OR +2A46 ; [*0C12.0020.0002] # UNION ABOVE INTERSECTION +2A47 ; [*0C13.0020.0002] # INTERSECTION ABOVE UNION +2A48 ; [*0C14.0020.0002] # UNION ABOVE BAR ABOVE INTERSECTION +2A49 ; [*0C15.0020.0002] # INTERSECTION ABOVE BAR ABOVE UNION +2A4A ; [*0C16.0020.0002] # UNION BESIDE AND JOINED WITH UNION +2A4B ; [*0C17.0020.0002] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION +2A4C ; [*0C18.0020.0002] # CLOSED UNION WITH SERIFS +2A4D ; [*0C19.0020.0002] # CLOSED INTERSECTION WITH SERIFS +2A4E ; [*0C1A.0020.0002] # DOUBLE SQUARE INTERSECTION +2A4F ; [*0C1B.0020.0002] # DOUBLE SQUARE UNION +2A50 ; [*0C1C.0020.0002] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT +2A51 ; [*0C1D.0020.0002] # LOGICAL AND WITH DOT ABOVE +2A52 ; [*0C1E.0020.0002] # LOGICAL OR WITH DOT ABOVE +2A53 ; [*0C1F.0020.0002] # DOUBLE LOGICAL AND +2A54 ; [*0C20.0020.0002] # DOUBLE LOGICAL OR +2A55 ; [*0C21.0020.0002] # TWO INTERSECTING LOGICAL AND +2A56 ; [*0C22.0020.0002] # TWO INTERSECTING LOGICAL OR +2A57 ; [*0C23.0020.0002] # SLOPING LARGE OR +2A58 ; [*0C24.0020.0002] # SLOPING LARGE AND +2A59 ; [*0C25.0020.0002] # LOGICAL OR OVERLAPPING LOGICAL AND +2A5A ; [*0C26.0020.0002] # LOGICAL AND WITH MIDDLE STEM +2A5B ; [*0C27.0020.0002] # LOGICAL OR WITH MIDDLE STEM +2A5C ; [*0C28.0020.0002] # LOGICAL AND WITH HORIZONTAL DASH +2A5D ; [*0C29.0020.0002] # LOGICAL OR WITH HORIZONTAL DASH +2A5E ; [*0C2A.0020.0002] # LOGICAL AND WITH DOUBLE OVERBAR +2A5F ; [*0C2B.0020.0002] # LOGICAL AND WITH UNDERBAR +2A60 ; [*0C2C.0020.0002] # LOGICAL AND WITH DOUBLE UNDERBAR +2A61 ; [*0C2D.0020.0002] # SMALL VEE WITH UNDERBAR +2A62 ; [*0C2E.0020.0002] # LOGICAL OR WITH DOUBLE OVERBAR +2A63 ; [*0C2F.0020.0002] # LOGICAL OR WITH DOUBLE UNDERBAR +2A64 ; [*0C30.0020.0002] # Z NOTATION DOMAIN ANTIRESTRICTION +2A65 ; [*0C31.0020.0002] # Z NOTATION RANGE ANTIRESTRICTION +2A66 ; [*0C32.0020.0002] # EQUALS SIGN WITH DOT BELOW +2A67 ; [*0C33.0020.0002] # IDENTICAL WITH DOT ABOVE +2A68 ; [*0C34.0020.0002] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE +2A69 ; [*0C35.0020.0002] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE +2A6A ; [*0C36.0020.0002] # TILDE OPERATOR WITH DOT ABOVE +2A6B ; [*0C37.0020.0002] # TILDE OPERATOR WITH RISING DOTS +2A6C ; [*0C38.0020.0002] # SIMILAR MINUS SIMILAR +2A6D ; [*0C39.0020.0002] # CONGRUENT WITH DOT ABOVE +2A6E ; [*0C3A.0020.0002] # EQUALS WITH ASTERISK +2A6F ; [*0C3B.0020.0002] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +2A70 ; [*0C3C.0020.0002] # APPROXIMATELY EQUAL OR EQUAL TO +2A71 ; [*0C3D.0020.0002] # EQUALS SIGN ABOVE PLUS SIGN +2A72 ; [*0C3E.0020.0002] # PLUS SIGN ABOVE EQUALS SIGN +2A73 ; [*0C3F.0020.0002] # EQUALS SIGN ABOVE TILDE OPERATOR +2A74 ; [*0239.0020.0004][*0239.0020.0004][*061B.0020.0004] # DOUBLE COLON EQUAL +2A75 ; [*061B.0020.0004][*061B.0020.0004] # TWO CONSECUTIVE EQUALS SIGNS +2A76 ; [*061B.0020.0004][*061B.0020.0004][*061B.0020.0004] # THREE CONSECUTIVE EQUALS SIGNS +2A77 ; [*0C40.0020.0002] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +2A78 ; [*0C41.0020.0002] # EQUIVALENT WITH FOUR DOTS ABOVE +2A79 ; [*0C42.0020.0002] # LESS-THAN WITH CIRCLE INSIDE +2A7A ; [*0C43.0020.0002] # GREATER-THAN WITH CIRCLE INSIDE +2A7B ; [*0C44.0020.0002] # LESS-THAN WITH QUESTION MARK ABOVE +2A7C ; [*0C45.0020.0002] # GREATER-THAN WITH QUESTION MARK ABOVE +2A7D ; [*0C46.0020.0002] # LESS-THAN OR SLANTED EQUAL TO +2A7E ; [*0C47.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO +2A7F ; [*0C48.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80 ; [*0C49.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81 ; [*0C4A.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82 ; [*0C4B.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83 ; [*0C4C.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84 ; [*0C4D.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A85 ; [*0C4E.0020.0002] # LESS-THAN OR APPROXIMATE +2A86 ; [*0C4F.0020.0002] # GREATER-THAN OR APPROXIMATE +2A87 ; [*0C50.0020.0002] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO +2A88 ; [*0C51.0020.0002] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +2A89 ; [*0C52.0020.0002] # LESS-THAN AND NOT APPROXIMATE +2A8A ; [*0C53.0020.0002] # GREATER-THAN AND NOT APPROXIMATE +2A8B ; [*0C54.0020.0002] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +2A8C ; [*0C55.0020.0002] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +2A8D ; [*0C56.0020.0002] # LESS-THAN ABOVE SIMILAR OR EQUAL +2A8E ; [*0C57.0020.0002] # GREATER-THAN ABOVE SIMILAR OR EQUAL +2A8F ; [*0C58.0020.0002] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +2A90 ; [*0C59.0020.0002] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +2A91 ; [*0C5A.0020.0002] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92 ; [*0C5B.0020.0002] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93 ; [*0C5C.0020.0002] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94 ; [*0C5D.0020.0002] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95 ; [*0C5E.0020.0002] # SLANTED EQUAL TO OR LESS-THAN +2A96 ; [*0C5F.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN +2A97 ; [*0C60.0020.0002] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98 ; [*0C61.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99 ; [*0C62.0020.0002] # DOUBLE-LINE EQUAL TO OR LESS-THAN +2A9A ; [*0C63.0020.0002] # DOUBLE-LINE EQUAL TO OR GREATER-THAN +2A9B ; [*0C64.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C ; [*0C65.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2A9D ; [*0C66.0020.0002] # SIMILAR OR LESS-THAN +2A9E ; [*0C67.0020.0002] # SIMILAR OR GREATER-THAN +2A9F ; [*0C68.0020.0002] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +2AA0 ; [*0C69.0020.0002] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +2AA1 ; [*0C6A.0020.0002] # DOUBLE NESTED LESS-THAN +2AA2 ; [*0C6B.0020.0002] # DOUBLE NESTED GREATER-THAN +2AA3 ; [*0C6C.0020.0002] # DOUBLE NESTED LESS-THAN WITH UNDERBAR +2AA4 ; [*0C6D.0020.0002] # GREATER-THAN OVERLAPPING LESS-THAN +2AA5 ; [*0C6E.0020.0002] # GREATER-THAN BESIDE LESS-THAN +2AA6 ; [*0C6F.0020.0002] # LESS-THAN CLOSED BY CURVE +2AA7 ; [*0C70.0020.0002] # GREATER-THAN CLOSED BY CURVE +2AA8 ; [*0C71.0020.0002] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9 ; [*0C72.0020.0002] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA ; [*0C73.0020.0002] # SMALLER THAN +2AAB ; [*0C74.0020.0002] # LARGER THAN +2AAC ; [*0C75.0020.0002] # SMALLER THAN OR EQUAL TO +2AAD ; [*0C76.0020.0002] # LARGER THAN OR EQUAL TO +2AAE ; [*0C77.0020.0002] # EQUALS SIGN WITH BUMPY ABOVE +2AAF ; [*0C78.0020.0002] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +2AB0 ; [*0C79.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +2AB1 ; [*0C7A.0020.0002] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +2AB2 ; [*0C7B.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +2AB3 ; [*0C7C.0020.0002] # PRECEDES ABOVE EQUALS SIGN +2AB4 ; [*0C7D.0020.0002] # SUCCEEDS ABOVE EQUALS SIGN +2AB5 ; [*0C7E.0020.0002] # PRECEDES ABOVE NOT EQUAL TO +2AB6 ; [*0C7F.0020.0002] # SUCCEEDS ABOVE NOT EQUAL TO +2AB7 ; [*0C80.0020.0002] # PRECEDES ABOVE ALMOST EQUAL TO +2AB8 ; [*0C81.0020.0002] # SUCCEEDS ABOVE ALMOST EQUAL TO +2AB9 ; [*0C82.0020.0002] # PRECEDES ABOVE NOT ALMOST EQUAL TO +2ABA ; [*0C83.0020.0002] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO +2ABB ; [*0C84.0020.0002] # DOUBLE PRECEDES +2ABC ; [*0C85.0020.0002] # DOUBLE SUCCEEDS +2ABD ; [*0C86.0020.0002] # SUBSET WITH DOT +2ABE ; [*0C87.0020.0002] # SUPERSET WITH DOT +2ABF ; [*0C88.0020.0002] # SUBSET WITH PLUS SIGN BELOW +2AC0 ; [*0C89.0020.0002] # SUPERSET WITH PLUS SIGN BELOW +2AC1 ; [*0C8A.0020.0002] # SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2 ; [*0C8B.0020.0002] # SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3 ; [*0C8C.0020.0002] # SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4 ; [*0C8D.0020.0002] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5 ; [*0C8E.0020.0002] # SUBSET OF ABOVE EQUALS SIGN +2AC6 ; [*0C8F.0020.0002] # SUPERSET OF ABOVE EQUALS SIGN +2AC7 ; [*0C90.0020.0002] # SUBSET OF ABOVE TILDE OPERATOR +2AC8 ; [*0C91.0020.0002] # SUPERSET OF ABOVE TILDE OPERATOR +2AC9 ; [*0C92.0020.0002] # SUBSET OF ABOVE ALMOST EQUAL TO +2ACA ; [*0C93.0020.0002] # SUPERSET OF ABOVE ALMOST EQUAL TO +2ACB ; [*0C94.0020.0002] # SUBSET OF ABOVE NOT EQUAL TO +2ACC ; [*0C95.0020.0002] # SUPERSET OF ABOVE NOT EQUAL TO +2ACD ; [*0C96.0020.0002] # SQUARE LEFT OPEN BOX OPERATOR +2ACE ; [*0C97.0020.0002] # SQUARE RIGHT OPEN BOX OPERATOR +2ACF ; [*0C98.0020.0002] # CLOSED SUBSET +2AD0 ; [*0C99.0020.0002] # CLOSED SUPERSET +2AD1 ; [*0C9A.0020.0002] # CLOSED SUBSET OR EQUAL TO +2AD2 ; [*0C9B.0020.0002] # CLOSED SUPERSET OR EQUAL TO +2AD3 ; [*0C9C.0020.0002] # SUBSET ABOVE SUPERSET +2AD4 ; [*0C9D.0020.0002] # SUPERSET ABOVE SUBSET +2AD5 ; [*0C9E.0020.0002] # SUBSET ABOVE SUBSET +2AD6 ; [*0C9F.0020.0002] # SUPERSET ABOVE SUPERSET +2AD7 ; [*0CA0.0020.0002] # SUPERSET BESIDE SUBSET +2AD8 ; [*0CA1.0020.0002] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +2AD9 ; [*0CA2.0020.0002] # ELEMENT OF OPENING DOWNWARDS +2ADA ; [*0CA3.0020.0002] # PITCHFORK WITH TEE TOP +2ADB ; [*0CA4.0020.0002] # TRANSVERSAL INTERSECTION +2ADC ; [*0CA5.0020.0002][.0000.002F.0002] # FORKING +2ADD ; [*0CA5.0020.0002] # NONFORKING +2ADE ; [*0CA6.0020.0002] # SHORT LEFT TACK +2ADF ; [*0CA7.0020.0002] # SHORT DOWN TACK +2AE0 ; [*0CA8.0020.0002] # SHORT UP TACK +2AE1 ; [*0CA9.0020.0002] # PERPENDICULAR WITH S +2AE2 ; [*0CAA.0020.0002] # VERTICAL BAR TRIPLE RIGHT TURNSTILE +2AE3 ; [*0CAB.0020.0002] # DOUBLE VERTICAL BAR LEFT TURNSTILE +2AE4 ; [*0CAC.0020.0002] # VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE5 ; [*0CAD.0020.0002] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE6 ; [*0CAE.0020.0002] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +2AE7 ; [*0CAF.0020.0002] # SHORT DOWN TACK WITH OVERBAR +2AE8 ; [*0CB0.0020.0002] # SHORT UP TACK WITH UNDERBAR +2AE9 ; [*0CB1.0020.0002] # SHORT UP TACK ABOVE SHORT DOWN TACK +2AEA ; [*0CB2.0020.0002] # DOUBLE DOWN TACK +2AEB ; [*0CB3.0020.0002] # DOUBLE UP TACK +2AEC ; [*0CB4.0020.0002] # DOUBLE STROKE NOT SIGN +2AED ; [*0CB5.0020.0002] # REVERSED DOUBLE STROKE NOT SIGN +2AEE ; [*0CB6.0020.0002] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +2AEF ; [*0CB7.0020.0002] # VERTICAL LINE WITH CIRCLE ABOVE +2AF0 ; [*0CB8.0020.0002] # VERTICAL LINE WITH CIRCLE BELOW +2AF1 ; [*0CB9.0020.0002] # DOWN TACK WITH CIRCLE BELOW +2AF2 ; [*0CBA.0020.0002] # PARALLEL WITH HORIZONTAL STROKE +2AF3 ; [*0CBB.0020.0002] # PARALLEL WITH TILDE OPERATOR +2AF4 ; [*0CBC.0020.0002] # TRIPLE VERTICAL BAR BINARY RELATION +2AF5 ; [*0CBD.0020.0002] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE +2AF6 ; [*0CBE.0020.0002] # TRIPLE COLON OPERATOR +2AF7 ; [*0CBF.0020.0002] # TRIPLE NESTED LESS-THAN +2AF8 ; [*0CC0.0020.0002] # TRIPLE NESTED GREATER-THAN +2AF9 ; [*0CC1.0020.0002] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +2AFA ; [*0CC2.0020.0002] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +2AFB ; [*0CC3.0020.0002] # TRIPLE SOLIDUS BINARY RELATION +2AFC ; [*0CC4.0020.0002] # LARGE TRIPLE VERTICAL BAR OPERATOR +2AFD ; [*0CC5.0020.0002] # DOUBLE SOLIDUS OPERATOR +2AFE ; [*0CC6.0020.0002] # WHITE VERTICAL BAR +2AFF ; [*0CC7.0020.0002] # N-ARY WHITE VERTICAL BAR +2B00 ; [*0CC8.0020.0002] # NORTH EAST WHITE ARROW +2B01 ; [*0CC9.0020.0002] # NORTH WEST WHITE ARROW +2B02 ; [*0CCA.0020.0002] # SOUTH EAST WHITE ARROW +2B03 ; [*0CCB.0020.0002] # SOUTH WEST WHITE ARROW +2B04 ; [*0CCC.0020.0002] # LEFT RIGHT WHITE ARROW +2B05 ; [*0CCD.0020.0002] # LEFTWARDS BLACK ARROW +2B06 ; [*0CCE.0020.0002] # UPWARDS BLACK ARROW +2B07 ; [*0CCF.0020.0002] # DOWNWARDS BLACK ARROW +2B08 ; [*0CD0.0020.0002] # NORTH EAST BLACK ARROW +2B09 ; [*0CD1.0020.0002] # NORTH WEST BLACK ARROW +2B0A ; [*0CD2.0020.0002] # SOUTH EAST BLACK ARROW +2B0B ; [*0CD3.0020.0002] # SOUTH WEST BLACK ARROW +2B0C ; [*0CD4.0020.0002] # LEFT RIGHT BLACK ARROW +2B0D ; [*0CD5.0020.0002] # UP DOWN BLACK ARROW +2B0E ; [*0CD6.0020.0002] # RIGHTWARDS ARROW WITH TIP DOWNWARDS +2B0F ; [*0CD7.0020.0002] # RIGHTWARDS ARROW WITH TIP UPWARDS +2B10 ; [*0CD8.0020.0002] # LEFTWARDS ARROW WITH TIP DOWNWARDS +2B11 ; [*0CD9.0020.0002] # LEFTWARDS ARROW WITH TIP UPWARDS +2B12 ; [*0CDA.0020.0002] # SQUARE WITH TOP HALF BLACK +2B13 ; [*0CDB.0020.0002] # SQUARE WITH BOTTOM HALF BLACK +2B14 ; [*0CDC.0020.0002] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK +2B15 ; [*0CDD.0020.0002] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK +2B16 ; [*0CDE.0020.0002] # DIAMOND WITH LEFT HALF BLACK +2B17 ; [*0CDF.0020.0002] # DIAMOND WITH RIGHT HALF BLACK +2B18 ; [*0CE0.0020.0002] # DIAMOND WITH TOP HALF BLACK +2B19 ; [*0CE1.0020.0002] # DIAMOND WITH BOTTOM HALF BLACK +2B1A ; [*0CE2.0020.0002] # DOTTED SQUARE +2B1B ; [*0CE3.0020.0002] # BLACK LARGE SQUARE +2B1C ; [*0CE4.0020.0002] # WHITE LARGE SQUARE +2B1D ; [*0CE5.0020.0002] # BLACK VERY SMALL SQUARE +2B1E ; [*0CE6.0020.0002] # WHITE VERY SMALL SQUARE +2B1F ; [*0CE7.0020.0002] # BLACK PENTAGON +2B20 ; [*0CE8.0020.0002] # WHITE PENTAGON +2B21 ; [*0CE9.0020.0002] # WHITE HEXAGON +2B22 ; [*0CEA.0020.0002] # BLACK HEXAGON +2B23 ; [*0CEB.0020.0002] # HORIZONTAL BLACK HEXAGON +2B24 ; [*0CEC.0020.0002] # BLACK LARGE CIRCLE +2B25 ; [*0CED.0020.0002] # BLACK MEDIUM DIAMOND +2B26 ; [*0CEE.0020.0002] # WHITE MEDIUM DIAMOND +2B27 ; [*0CEF.0020.0002] # BLACK MEDIUM LOZENGE +2B28 ; [*0CF0.0020.0002] # WHITE MEDIUM LOZENGE +2B29 ; [*0CF1.0020.0002] # BLACK SMALL DIAMOND +2B2A ; [*0CF2.0020.0002] # BLACK SMALL LOZENGE +2B2B ; [*0CF3.0020.0002] # WHITE SMALL LOZENGE +2B2C ; [*0CF4.0020.0002] # BLACK HORIZONTAL ELLIPSE +2B2D ; [*0CF5.0020.0002] # WHITE HORIZONTAL ELLIPSE +2B2E ; [*0CF6.0020.0002] # BLACK VERTICAL ELLIPSE +2B2F ; [*0CF7.0020.0002] # WHITE VERTICAL ELLIPSE +2B30 ; [*0CF8.0020.0002] # LEFT ARROW WITH SMALL CIRCLE +2B31 ; [*0CF9.0020.0002] # THREE LEFTWARDS ARROWS +2B32 ; [*0CFA.0020.0002] # LEFT ARROW WITH CIRCLED PLUS +2B33 ; [*0CFB.0020.0002] # LONG LEFTWARDS SQUIGGLE ARROW +2B34 ; [*0CFC.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2B35 ; [*0CFD.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2B36 ; [*0CFE.0020.0002] # LEFTWARDS TWO-HEADED ARROW FROM BAR +2B37 ; [*0CFF.0020.0002] # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW +2B38 ; [*0D00.0020.0002] # LEFTWARDS ARROW WITH DOTTED STEM +2B39 ; [*0D01.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2B3A ; [*0D02.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2B3B ; [*0D03.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL +2B3C ; [*0D04.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2B3D ; [*0D05.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2B3E ; [*0D06.0020.0002] # LEFTWARDS ARROW THROUGH X +2B3F ; [*0D07.0020.0002] # WAVE ARROW POINTING DIRECTLY LEFT +2B40 ; [*0D08.0020.0002] # EQUALS SIGN ABOVE LEFTWARDS ARROW +2B41 ; [*0D09.0020.0002] # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW +2B42 ; [*0D0A.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO +2B43 ; [*0D0B.0020.0002] # RIGHTWARDS ARROW THROUGH GREATER-THAN +2B44 ; [*0D0C.0020.0002] # RIGHTWARDS ARROW THROUGH SUPERSET +2B45 ; [*0D0D.0020.0002] # LEFTWARDS QUADRUPLE ARROW +2B46 ; [*0D0E.0020.0002] # RIGHTWARDS QUADRUPLE ARROW +2B47 ; [*0D0F.0020.0002] # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2B48 ; [*0D10.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO +2B49 ; [*0D11.0020.0002] # TILDE OPERATOR ABOVE LEFTWARDS ARROW +2B4A ; [*0D12.0020.0002] # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO +2B4B ; [*0D13.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4C ; [*0D14.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D ; [*0D15.0020.0002] # DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW +2B4E ; [*0D16.0020.0002] # SHORT SLANTED NORTH ARROW +2B4F ; [*0D17.0020.0002] # SHORT BACKSLANTED SOUTH ARROW +2B50 ; [*0D18.0020.0002] # WHITE MEDIUM STAR +2B51 ; [*0D19.0020.0002] # BLACK SMALL STAR +2B52 ; [*0D1A.0020.0002] # WHITE SMALL STAR +2B53 ; [*0D1B.0020.0002] # BLACK RIGHT-POINTING PENTAGON +2B54 ; [*0D1C.0020.0002] # WHITE RIGHT-POINTING PENTAGON +2B55 ; [*0D1D.0020.0002] # HEAVY LARGE CIRCLE +2B56 ; [*0D1E.0020.0002] # HEAVY OVAL WITH OVAL INSIDE +2B57 ; [*0D1F.0020.0002] # HEAVY CIRCLE WITH CIRCLE INSIDE +2B58 ; [*0D20.0020.0002] # HEAVY CIRCLE +2B59 ; [*0D21.0020.0002] # HEAVY CIRCLED SALTIRE +2B5A ; [*0D22.0020.0002] # SLANTED NORTH ARROW WITH HOOKED HEAD +2B5B ; [*0D23.0020.0002] # BACKSLANTED SOUTH ARROW WITH HOOKED TAIL +2B5C ; [*0D24.0020.0002] # SLANTED NORTH ARROW WITH HORIZONTAL TAIL +2B5D ; [*0D25.0020.0002] # BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL +2B5E ; [*0D26.0020.0002] # BENT ARROW POINTING DOWNWARDS THEN NORTH EAST +2B5F ; [*0D27.0020.0002] # SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST +2B60 ; [*0D28.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW +2B61 ; [*0D29.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW +2B62 ; [*0D2A.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW +2B63 ; [*0D2B.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW +2B64 ; [*0D2C.0020.0002] # LEFT RIGHT TRIANGLE-HEADED ARROW +2B65 ; [*0D2D.0020.0002] # UP DOWN TRIANGLE-HEADED ARROW +2B66 ; [*0D2E.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW +2B67 ; [*0D2F.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW +2B68 ; [*0D30.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW +2B69 ; [*0D31.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW +2B6A ; [*0D32.0020.0002] # LEFTWARDS TRIANGLE-HEADED DASHED ARROW +2B6B ; [*0D33.0020.0002] # UPWARDS TRIANGLE-HEADED DASHED ARROW +2B6C ; [*0D34.0020.0002] # RIGHTWARDS TRIANGLE-HEADED DASHED ARROW +2B6D ; [*0D35.0020.0002] # DOWNWARDS TRIANGLE-HEADED DASHED ARROW +2B6E ; [*0D36.0020.0002] # CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW +2B6F ; [*0D37.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW +2B70 ; [*0D38.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW TO BAR +2B71 ; [*0D39.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW TO BAR +2B72 ; [*0D3A.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR +2B73 ; [*0D3B.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76 ; [*0D3C.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW TO BAR +2B77 ; [*0D3D.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW TO BAR +2B78 ; [*0D3E.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW TO BAR +2B79 ; [*0D3F.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW TO BAR +2B7A ; [*0D40.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7B ; [*0D41.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7C ; [*0D42.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7D ; [*0D43.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7E ; [*0D44.0020.0002] # HORIZONTAL TAB KEY +2B7F ; [*0D45.0020.0002] # VERTICAL TAB KEY +2B80 ; [*0D46.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW +2B81 ; [*0D47.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW +2B82 ; [*0D48.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW +2B83 ; [*0D49.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW +2B84 ; [*0D4A.0020.0002] # LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS +2B85 ; [*0D4B.0020.0002] # UPWARDS TRIANGLE-HEADED PAIRED ARROWS +2B86 ; [*0D4C.0020.0002] # RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS +2B87 ; [*0D4D.0020.0002] # DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS +2B88 ; [*0D4E.0020.0002] # LEFTWARDS BLACK CIRCLED WHITE ARROW +2B89 ; [*0D4F.0020.0002] # UPWARDS BLACK CIRCLED WHITE ARROW +2B8A ; [*0D50.0020.0002] # RIGHTWARDS BLACK CIRCLED WHITE ARROW +2B8B ; [*0D51.0020.0002] # DOWNWARDS BLACK CIRCLED WHITE ARROW +2B8C ; [*0D52.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW +2B8D ; [*0D53.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW +2B8E ; [*0D54.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW +2B8F ; [*0D55.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW +2B90 ; [*0D56.0020.0002] # RETURN LEFT +2B91 ; [*0D57.0020.0002] # RETURN RIGHT +2B92 ; [*0D58.0020.0002] # NEWLINE LEFT +2B93 ; [*0D59.0020.0002] # NEWLINE RIGHT +2B94 ; [*0D5A.0020.0002] # FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE +2B95 ; [*0D5B.0020.0002] # RIGHTWARDS BLACK ARROW +2B98 ; [*0D5C.0020.0002] # THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD +2B99 ; [*0D5D.0020.0002] # THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD +2B9A ; [*0D5E.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD +2B9B ; [*0D5F.0020.0002] # THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD +2B9C ; [*0D60.0020.0002] # BLACK LEFTWARDS EQUILATERAL ARROWHEAD +2B9D ; [*0D61.0020.0002] # BLACK UPWARDS EQUILATERAL ARROWHEAD +2B9E ; [*0D62.0020.0002] # BLACK RIGHTWARDS EQUILATERAL ARROWHEAD +2B9F ; [*0D63.0020.0002] # BLACK DOWNWARDS EQUILATERAL ARROWHEAD +2BA0 ; [*0D64.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS +2BA1 ; [*0D65.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS +2BA2 ; [*0D66.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS +2BA3 ; [*0D67.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS +2BA4 ; [*0D68.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS +2BA5 ; [*0D69.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS +2BA6 ; [*0D6A.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS +2BA7 ; [*0D6B.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS +2BA8 ; [*0D6C.0020.0002] # BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW +2BA9 ; [*0D6D.0020.0002] # BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +2BAA ; [*0D6E.0020.0002] # BLACK CURVED UPWARDS AND LEFTWARDS ARROW +2BAB ; [*0D6F.0020.0002] # BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +2BAC ; [*0D70.0020.0002] # BLACK CURVED LEFTWARDS AND UPWARDS ARROW +2BAD ; [*0D71.0020.0002] # BLACK CURVED RIGHTWARDS AND UPWARDS ARROW +2BAE ; [*0D72.0020.0002] # BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW +2BAF ; [*0D73.0020.0002] # BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW +2BB0 ; [*0D74.0020.0002] # RIBBON ARROW DOWN LEFT +2BB1 ; [*0D75.0020.0002] # RIBBON ARROW DOWN RIGHT +2BB2 ; [*0D76.0020.0002] # RIBBON ARROW UP LEFT +2BB3 ; [*0D77.0020.0002] # RIBBON ARROW UP RIGHT +2BB4 ; [*0D78.0020.0002] # RIBBON ARROW LEFT UP +2BB5 ; [*0D79.0020.0002] # RIBBON ARROW RIGHT UP +2BB6 ; [*0D7A.0020.0002] # RIBBON ARROW LEFT DOWN +2BB7 ; [*0D7B.0020.0002] # RIBBON ARROW RIGHT DOWN +2BB8 ; [*0D7C.0020.0002] # UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR +2BB9 ; [*0D7D.0020.0002] # UP ARROWHEAD IN A RECTANGLE BOX +2BBD ; [*0D7E.0020.0002] # BALLOT BOX WITH LIGHT X +2BBE ; [*0D7F.0020.0002] # CIRCLED X +2BBF ; [*0D80.0020.0002] # CIRCLED BOLD X +2BC0 ; [*0D81.0020.0002] # BLACK SQUARE CENTRED +2BC1 ; [*0D82.0020.0002] # BLACK DIAMOND CENTRED +2BC2 ; [*0D83.0020.0002] # TURNED BLACK PENTAGON +2BC3 ; [*0D84.0020.0002] # HORIZONTAL BLACK OCTAGON +2BC4 ; [*0D85.0020.0002] # BLACK OCTAGON +2BC5 ; [*0D86.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE CENTRED +2BC6 ; [*0D87.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED +2BC7 ; [*0D88.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED +2BC8 ; [*0D89.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +2BCA ; [*0D8A.0020.0002] # TOP HALF BLACK CIRCLE +2BCB ; [*0D8B.0020.0002] # BOTTOM HALF BLACK CIRCLE +2BCC ; [*0D8C.0020.0002] # LIGHT FOUR POINTED BLACK CUSP +2BCD ; [*0D8D.0020.0002] # ROTATED LIGHT FOUR POINTED BLACK CUSP +2BCE ; [*0D8E.0020.0002] # WHITE FOUR POINTED CUSP +2BCF ; [*0D8F.0020.0002] # ROTATED WHITE FOUR POINTED CUSP +2BD0 ; [*0D90.0020.0002] # SQUARE POSITION INDICATOR +2BD1 ; [*0D91.0020.0002] # UNCERTAINTY SIGN +2BEC ; [*0D92.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BED ; [*0D93.0020.0002] # UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BEE ; [*0D94.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BEF ; [*0D95.0020.0002] # DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2CE5 ; [*0D96.0020.0002] # COPTIC SYMBOL MI RO +2CE6 ; [*0D97.0020.0002] # COPTIC SYMBOL PI RO +2CE7 ; [*0D98.0020.0002] # COPTIC SYMBOL STAUROS +2CE8 ; [*0D99.0020.0002] # COPTIC SYMBOL TAU RO +2CE9 ; [*0D9A.0020.0002] # COPTIC SYMBOL KHI RO +2CEA ; [*0D9B.0020.0002] # COPTIC SYMBOL SHIMA SIMA +2CF9 ; [*0281.0020.0002] # COPTIC OLD NUBIAN FULL STOP +2CFA ; [*026E.0020.0002] # COPTIC OLD NUBIAN DIRECT QUESTION MARK +2CFB ; [*026F.0020.0002] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2CFC ; [*02F6.0020.0002] # COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; [*1AE2.0020.0002] # COPTIC FRACTION ONE HALF +2CFE ; [*0282.0020.0002] # COPTIC FULL STOP +2CFF ; [*02F7.0020.0002] # COPTIC MORPHOLOGICAL DIVIDER +2D70 ; [*0427.0020.0002] # TIFINAGH SEPARATOR MARK 2D7F ; [.0000.0000.0000] # TIFINAGH CONSONANT JOINER -2E00 ; [*03AF.0020.0002] # RIGHT ANGLE SUBSTITUTION MARKER -2E01 ; [*03B0.0020.0002] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER -2E02 ; [*0354.0020.0002] # LEFT SUBSTITUTION BRACKET -2E03 ; [*0355.0020.0002] # RIGHT SUBSTITUTION BRACKET -2E04 ; [*0356.0020.0002] # LEFT DOTTED SUBSTITUTION BRACKET -2E05 ; [*0357.0020.0002] # RIGHT DOTTED SUBSTITUTION BRACKET -2E06 ; [*03B1.0020.0002] # RAISED INTERPOLATION MARKER -2E07 ; [*03B2.0020.0002] # RAISED DOTTED INTERPOLATION MARKER -2E08 ; [*03B3.0020.0002] # DOTTED TRANSPOSITION MARKER -2E09 ; [*0358.0020.0002] # LEFT TRANSPOSITION BRACKET -2E0A ; [*0359.0020.0002] # RIGHT TRANSPOSITION BRACKET -2E0B ; [*03B4.0020.0002] # RAISED SQUARE -2E0C ; [*035A.0020.0002] # LEFT RAISED OMISSION BRACKET -2E0D ; [*035B.0020.0002] # RIGHT RAISED OMISSION BRACKET -2E0E ; [*03B5.0020.0002] # EDITORIAL CORONIS -2E0F ; [*03B6.0020.0002] # PARAGRAPHOS -2E10 ; [*03B7.0020.0002] # FORKED PARAGRAPHOS -2E11 ; [*03B8.0020.0002] # REVERSED FORKED PARAGRAPHOS -2E12 ; [*03B9.0020.0002] # HYPODIASTOLE -2E13 ; [*03BA.0020.0002] # DOTTED OBELOS -2E14 ; [*03BB.0020.0002] # DOWNWARDS ANCORA -2E15 ; [*03BC.0020.0002] # UPWARDS ANCORA -2E16 ; [*03BD.0020.0002] # DOTTED RIGHT-POINTING ANGLE -2E17 ; [*021B.0020.0002] # DOUBLE OBLIQUE HYPHEN -2E18 ; [*0273.0020.0002] # INVERTED INTERROBANG -2E19 ; [*02F1.0020.0002] # PALM BRANCH -2E1A ; [*03BE.0020.0002] # HYPHEN WITH DIAERESIS -2E1B ; [*03BF.0020.0002] # TILDE WITH RING ABOVE -2E1C ; [*035C.0020.0002] # LEFT LOW PARAPHRASE BRACKET -2E1D ; [*035D.0020.0002] # RIGHT LOW PARAPHRASE BRACKET -2E1E ; [*03C0.0020.0002] # TILDE WITH DOT ABOVE -2E1F ; [*03C1.0020.0002] # TILDE WITH DOT BELOW -2E20 ; [*035E.0020.0002] # LEFT VERTICAL BAR WITH QUILL -2E21 ; [*035F.0020.0002] # RIGHT VERTICAL BAR WITH QUILL -2E22 ; [*0360.0020.0002] # TOP LEFT HALF BRACKET -2E23 ; [*0361.0020.0002] # TOP RIGHT HALF BRACKET -2E24 ; [*0362.0020.0002] # BOTTOM LEFT HALF BRACKET -2E25 ; [*0363.0020.0002] # BOTTOM RIGHT HALF BRACKET -2E26 ; [*0364.0020.0002] # LEFT SIDEWAYS U BRACKET -2E27 ; [*0365.0020.0002] # RIGHT SIDEWAYS U BRACKET -2E28 ; [*0366.0020.0002] # LEFT DOUBLE PARENTHESIS -2E29 ; [*0367.0020.0002] # RIGHT DOUBLE PARENTHESIS -2E2A ; [*02EA.0020.0002] # TWO DOTS OVER ONE DOT PUNCTUATION -2E2B ; [*02EB.0020.0002] # ONE DOT OVER TWO DOTS PUNCTUATION -2E2C ; [*02EC.0020.0002] # SQUARED FOUR DOT PUNCTUATION -2E2D ; [*02ED.0020.0002] # FIVE DOT MARK -2E2E ; [*0266.0020.0002] # REVERSED QUESTION MARK -2E30 ; [*0280.0020.0002] # RING POINT -2E31 ; [*0289.0020.0002] # WORD SEPARATOR MIDDLE DOT -2E32 ; [*0223.0020.0002] # TURNED COMMA -2E33 ; [*028A.0020.0002] # RAISED DOT -2E34 ; [*0222.0020.0002] # RAISED COMMA -2E35 ; [*0236.0020.0002] # TURNED SEMICOLON -2E36 ; [*039A.0020.0002] # DAGGER WITH LEFT GUARD -2E37 ; [*039B.0020.0002] # DAGGER WITH RIGHT GUARD -2E38 ; [*039C.0020.0002] # TURNED DAGGER -2E39 ; [*0383.0020.0002] # TOP HALF SECTION SIGN +2E00 ; [*03B6.0020.0002] # RIGHT ANGLE SUBSTITUTION MARKER +2E01 ; [*03B7.0020.0002] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; [*035B.0020.0002] # LEFT SUBSTITUTION BRACKET +2E03 ; [*035C.0020.0002] # RIGHT SUBSTITUTION BRACKET +2E04 ; [*035D.0020.0002] # LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; [*035E.0020.0002] # RIGHT DOTTED SUBSTITUTION BRACKET +2E06 ; [*03B8.0020.0002] # RAISED INTERPOLATION MARKER +2E07 ; [*03B9.0020.0002] # RAISED DOTTED INTERPOLATION MARKER +2E08 ; [*03BA.0020.0002] # DOTTED TRANSPOSITION MARKER +2E09 ; [*035F.0020.0002] # LEFT TRANSPOSITION BRACKET +2E0A ; [*0360.0020.0002] # RIGHT TRANSPOSITION BRACKET +2E0B ; [*03BB.0020.0002] # RAISED SQUARE +2E0C ; [*0361.0020.0002] # LEFT RAISED OMISSION BRACKET +2E0D ; [*0362.0020.0002] # RIGHT RAISED OMISSION BRACKET +2E0E ; [*03BC.0020.0002] # EDITORIAL CORONIS +2E0F ; [*03BD.0020.0002] # PARAGRAPHOS +2E10 ; [*03BE.0020.0002] # FORKED PARAGRAPHOS +2E11 ; [*03BF.0020.0002] # REVERSED FORKED PARAGRAPHOS +2E12 ; [*03C0.0020.0002] # HYPODIASTOLE +2E13 ; [*03C1.0020.0002] # DOTTED OBELOS +2E14 ; [*03C2.0020.0002] # DOWNWARDS ANCORA +2E15 ; [*03C3.0020.0002] # UPWARDS ANCORA +2E16 ; [*03C4.0020.0002] # DOTTED RIGHT-POINTING ANGLE +2E17 ; [*021C.0020.0002] # DOUBLE OBLIQUE HYPHEN +2E18 ; [*0276.0020.0002] # INVERTED INTERROBANG +2E19 ; [*02F8.0020.0002] # PALM BRANCH +2E1A ; [*03C5.0020.0002] # HYPHEN WITH DIAERESIS +2E1B ; [*03C6.0020.0002] # TILDE WITH RING ABOVE +2E1C ; [*0363.0020.0002] # LEFT LOW PARAPHRASE BRACKET +2E1D ; [*0364.0020.0002] # RIGHT LOW PARAPHRASE BRACKET +2E1E ; [*03C7.0020.0002] # TILDE WITH DOT ABOVE +2E1F ; [*03C8.0020.0002] # TILDE WITH DOT BELOW +2E20 ; [*0365.0020.0002] # LEFT VERTICAL BAR WITH QUILL +2E21 ; [*0366.0020.0002] # RIGHT VERTICAL BAR WITH QUILL +2E22 ; [*0367.0020.0002] # TOP LEFT HALF BRACKET +2E23 ; [*0368.0020.0002] # TOP RIGHT HALF BRACKET +2E24 ; [*0369.0020.0002] # BOTTOM LEFT HALF BRACKET +2E25 ; [*036A.0020.0002] # BOTTOM RIGHT HALF BRACKET +2E26 ; [*036B.0020.0002] # LEFT SIDEWAYS U BRACKET +2E27 ; [*036C.0020.0002] # RIGHT SIDEWAYS U BRACKET +2E28 ; [*036D.0020.0002] # LEFT DOUBLE PARENTHESIS +2E29 ; [*036E.0020.0002] # RIGHT DOUBLE PARENTHESIS +2E2A ; [*02F1.0020.0002] # TWO DOTS OVER ONE DOT PUNCTUATION +2E2B ; [*02F2.0020.0002] # ONE DOT OVER TWO DOTS PUNCTUATION +2E2C ; [*02F3.0020.0002] # SQUARED FOUR DOT PUNCTUATION +2E2D ; [*02F4.0020.0002] # FIVE DOT MARK +2E2E ; [*0268.0020.0002] # REVERSED QUESTION MARK +2E30 ; [*0283.0020.0002] # RING POINT +2E31 ; [*028C.0020.0002] # WORD SEPARATOR MIDDLE DOT +2E32 ; [*0224.0020.0002] # TURNED COMMA +2E33 ; [*028D.0020.0002] # RAISED DOT +2E34 ; [*0223.0020.0002] # RAISED COMMA +2E35 ; [*0237.0020.0002] # TURNED SEMICOLON +2E36 ; [*03A1.0020.0002] # DAGGER WITH LEFT GUARD +2E37 ; [*03A2.0020.0002] # DAGGER WITH RIGHT GUARD +2E38 ; [*03A3.0020.0002] # TURNED DAGGER +2E39 ; [*038A.0020.0002] # TOP HALF SECTION SIGN 2E3A ; [*0218.0020.0002] # TWO-EM DASH 2E3B ; [*0219.0020.0002] # THREE-EM DASH -2E3C ; [*0281.0020.0002] # STENOGRAPHIC FULL STOP -2E3D ; [*02EE.0020.0002] # VERTICAL SIX DOTS -2E3E ; [*037D.0020.0002] # WIGGLY VERTICAL LINE -2E3F ; [*0386.0020.0002] # CAPITULUM -2E40 ; [*021C.0020.0002] # DOUBLE HYPHEN -2E41 ; [*0224.0020.0002] # REVERSED COMMA -2E42 ; [*030A.0020.0002] # DOUBLE LOW-REVERSED-9 QUOTATION MARK -2FF0 ; [*19EB.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT -2FF1 ; [*19EC.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW -2FF2 ; [*19ED.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT -2FF3 ; [*19EE.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW -2FF4 ; [*19EF.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND -2FF5 ; [*19F0.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE -2FF6 ; [*19F1.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW -2FF7 ; [*19F2.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT -2FF8 ; [*19F3.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT -2FF9 ; [*19F4.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT -2FFA ; [*19F5.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT -2FFB ; [*19F6.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +2E3C ; [*0284.0020.0002] # STENOGRAPHIC FULL STOP +2E3D ; [*02F5.0020.0002] # VERTICAL SIX DOTS +2E3E ; [*0384.0020.0002] # WIGGLY VERTICAL LINE +2E3F ; [*038D.0020.0002] # CAPITULUM +2E40 ; [*021D.0020.0002] # DOUBLE HYPHEN +2E41 ; [*0225.0020.0002] # REVERSED COMMA +2E42 ; [*0311.0020.0002] # DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43 ; [*021B.0020.0002] # DASH WITH LEFT UPTURN +2E44 ; [*03C9.0020.0002] # DOUBLE SUSPENSION MARK +2FF0 ; [*1A5B.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT +2FF1 ; [*1A5C.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF2 ; [*1A5D.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT +2FF3 ; [*1A5E.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW +2FF4 ; [*1A5F.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND +2FF5 ; [*1A60.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE +2FF6 ; [*1A61.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW +2FF7 ; [*1A62.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT +2FF8 ; [*1A63.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT +2FF9 ; [*1A64.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT +2FFA ; [*1A65.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT +2FFB ; [*1A66.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID 3000 ; [*0209.0020.0003] # IDEOGRAPHIC SPACE -3001 ; [*0230.0020.0002] # IDEOGRAPHIC COMMA -3002 ; [*0287.0020.0002] # IDEOGRAPHIC FULL STOP -3003 ; [*03A5.0020.0002] # DITTO MARK -3004 ; [*1A1B.0020.0002] # JAPANESE INDUSTRIAL STANDARD SYMBOL -3008 ; [*0368.0020.0002] # LEFT ANGLE BRACKET -3009 ; [*0369.0020.0002] # RIGHT ANGLE BRACKET -300A ; [*036A.0020.0002] # LEFT DOUBLE ANGLE BRACKET -300B ; [*036B.0020.0002] # RIGHT DOUBLE ANGLE BRACKET -300C ; [*036C.0020.0002] # LEFT CORNER BRACKET -300D ; [*036D.0020.0002] # RIGHT CORNER BRACKET -300E ; [*036E.0020.0002] # LEFT WHITE CORNER BRACKET -300F ; [*036F.0020.0002] # RIGHT WHITE CORNER BRACKET -3010 ; [*0370.0020.0002] # LEFT BLACK LENTICULAR BRACKET -3011 ; [*0371.0020.0002] # RIGHT BLACK LENTICULAR BRACKET -3012 ; [*1A1C.0020.0002] # POSTAL MARK -3013 ; [*1A1D.0020.0002] # GETA MARK -3014 ; [*0372.0020.0002] # LEFT TORTOISE SHELL BRACKET -3015 ; [*0373.0020.0002] # RIGHT TORTOISE SHELL BRACKET -3016 ; [*0374.0020.0002] # LEFT WHITE LENTICULAR BRACKET -3017 ; [*0375.0020.0002] # RIGHT WHITE LENTICULAR BRACKET -3018 ; [*0376.0020.0002] # LEFT WHITE TORTOISE SHELL BRACKET -3019 ; [*0377.0020.0002] # RIGHT WHITE TORTOISE SHELL BRACKET -301A ; [*0378.0020.0002] # LEFT WHITE SQUARE BRACKET -301B ; [*0379.0020.0002] # RIGHT WHITE SQUARE BRACKET -301C ; [*021D.0020.0002] # WAVE DASH -301D ; [*030B.0020.0002] # REVERSED DOUBLE PRIME QUOTATION MARK -301E ; [*030C.0020.0002] # DOUBLE PRIME QUOTATION MARK -301F ; [*030D.0020.0002] # LOW DOUBLE PRIME QUOTATION MARK -3020 ; [*1A1E.0020.0002] # POSTAL MARK FACE -3030 ; [*021E.0020.0002] # WAVY DASH -3036 ; [*1A1C.0020.0004] # CIRCLED POSTAL MARK -3037 ; [*1A1F.0020.0002] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -303D ; [*03A6.0020.0002] # PART ALTERNATION MARK -303E ; [*1A20.0020.0002] # IDEOGRAPHIC VARIATION INDICATOR -303F ; [*1A21.0020.0002] # IDEOGRAPHIC HALF FILL SPACE -309B ; [*0472.0020.0002] # KATAKANA-HIRAGANA VOICED SOUND MARK -309C ; [*0473.0020.0002] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -30A0 ; [*021F.0020.0002] # KATAKANA-HIRAGANA DOUBLE HYPHEN -30FB ; [*0220.0020.0002] # KATAKANA MIDDLE DOT -3190 ; [*1A22.0020.0002] # IDEOGRAPHIC ANNOTATION LINKING MARK -3191 ; [*1A23.0020.0002] # IDEOGRAPHIC ANNOTATION REVERSE MARK -31C0 ; [*19F7.0020.0002] # CJK STROKE T -31C1 ; [*19F8.0020.0002] # CJK STROKE WG -31C2 ; [*19F9.0020.0002] # CJK STROKE XG -31C3 ; [*19FA.0020.0002] # CJK STROKE BXG -31C4 ; [*19FB.0020.0002] # CJK STROKE SW -31C5 ; [*19FC.0020.0002] # CJK STROKE HZZ -31C6 ; [*19FD.0020.0002] # CJK STROKE HZG -31C7 ; [*19FE.0020.0002] # CJK STROKE HP -31C8 ; [*19FF.0020.0002] # CJK STROKE HZWG -31C9 ; [*1A00.0020.0002] # CJK STROKE SZWG -31CA ; [*1A01.0020.0002] # CJK STROKE HZT -31CB ; [*1A02.0020.0002] # CJK STROKE HZZP -31CC ; [*1A03.0020.0002] # CJK STROKE HPWG -31CD ; [*1A04.0020.0002] # CJK STROKE HZW -31CE ; [*1A05.0020.0002] # CJK STROKE HZZZ -31CF ; [*1A06.0020.0002] # CJK STROKE N -31D0 ; [*1A07.0020.0002] # CJK STROKE H -31D1 ; [*1A08.0020.0002] # CJK STROKE S -31D2 ; [*1A09.0020.0002] # CJK STROKE P -31D3 ; [*1A0A.0020.0002] # CJK STROKE SP -31D4 ; [*1A0B.0020.0002] # CJK STROKE D -31D5 ; [*1A0C.0020.0002] # CJK STROKE HZ -31D6 ; [*1A0D.0020.0002] # CJK STROKE HG -31D7 ; [*1A0E.0020.0002] # CJK STROKE SZ -31D8 ; [*1A0F.0020.0002] # CJK STROKE SWZ -31D9 ; [*1A10.0020.0002] # CJK STROKE ST -31DA ; [*1A11.0020.0002] # CJK STROKE SG -31DB ; [*1A12.0020.0002] # CJK STROKE PD -31DC ; [*1A13.0020.0002] # CJK STROKE PZ -31DD ; [*1A14.0020.0002] # CJK STROKE TN -31DE ; [*1A15.0020.0002] # CJK STROKE SZZ -31DF ; [*1A16.0020.0002] # CJK STROKE SWG -31E0 ; [*1A17.0020.0002] # CJK STROKE HXWG -31E1 ; [*1A18.0020.0002] # CJK STROKE HZZZG -31E2 ; [*1A19.0020.0002] # CJK STROKE PG -31E3 ; [*1A1A.0020.0002] # CJK STROKE Q -327F ; [*1A24.0020.0002] # KOREAN STANDARD SYMBOL -4DC0 ; [*0E86.0020.0002] # HEXAGRAM FOR THE CREATIVE HEAVEN -4DC1 ; [*0E87.0020.0002] # HEXAGRAM FOR THE RECEPTIVE EARTH -4DC2 ; [*0E88.0020.0002] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING -4DC3 ; [*0E89.0020.0002] # HEXAGRAM FOR YOUTHFUL FOLLY -4DC4 ; [*0E8A.0020.0002] # HEXAGRAM FOR WAITING -4DC5 ; [*0E8B.0020.0002] # HEXAGRAM FOR CONFLICT -4DC6 ; [*0E8C.0020.0002] # HEXAGRAM FOR THE ARMY -4DC7 ; [*0E8D.0020.0002] # HEXAGRAM FOR HOLDING TOGETHER -4DC8 ; [*0E8E.0020.0002] # HEXAGRAM FOR SMALL TAMING -4DC9 ; [*0E8F.0020.0002] # HEXAGRAM FOR TREADING -4DCA ; [*0E90.0020.0002] # HEXAGRAM FOR PEACE -4DCB ; [*0E91.0020.0002] # HEXAGRAM FOR STANDSTILL -4DCC ; [*0E92.0020.0002] # HEXAGRAM FOR FELLOWSHIP -4DCD ; [*0E93.0020.0002] # HEXAGRAM FOR GREAT POSSESSION -4DCE ; [*0E94.0020.0002] # HEXAGRAM FOR MODESTY -4DCF ; [*0E95.0020.0002] # HEXAGRAM FOR ENTHUSIASM -4DD0 ; [*0E96.0020.0002] # HEXAGRAM FOR FOLLOWING -4DD1 ; [*0E97.0020.0002] # HEXAGRAM FOR WORK ON THE DECAYED -4DD2 ; [*0E98.0020.0002] # HEXAGRAM FOR APPROACH -4DD3 ; [*0E99.0020.0002] # HEXAGRAM FOR CONTEMPLATION -4DD4 ; [*0E9A.0020.0002] # HEXAGRAM FOR BITING THROUGH -4DD5 ; [*0E9B.0020.0002] # HEXAGRAM FOR GRACE -4DD6 ; [*0E9C.0020.0002] # HEXAGRAM FOR SPLITTING APART -4DD7 ; [*0E9D.0020.0002] # HEXAGRAM FOR RETURN -4DD8 ; [*0E9E.0020.0002] # HEXAGRAM FOR INNOCENCE -4DD9 ; [*0E9F.0020.0002] # HEXAGRAM FOR GREAT TAMING -4DDA ; [*0EA0.0020.0002] # HEXAGRAM FOR MOUTH CORNERS -4DDB ; [*0EA1.0020.0002] # HEXAGRAM FOR GREAT PREPONDERANCE -4DDC ; [*0EA2.0020.0002] # HEXAGRAM FOR THE ABYSMAL WATER -4DDD ; [*0EA3.0020.0002] # HEXAGRAM FOR THE CLINGING FIRE -4DDE ; [*0EA4.0020.0002] # HEXAGRAM FOR INFLUENCE -4DDF ; [*0EA5.0020.0002] # HEXAGRAM FOR DURATION -4DE0 ; [*0EA6.0020.0002] # HEXAGRAM FOR RETREAT -4DE1 ; [*0EA7.0020.0002] # HEXAGRAM FOR GREAT POWER -4DE2 ; [*0EA8.0020.0002] # HEXAGRAM FOR PROGRESS -4DE3 ; [*0EA9.0020.0002] # HEXAGRAM FOR DARKENING OF THE LIGHT -4DE4 ; [*0EAA.0020.0002] # HEXAGRAM FOR THE FAMILY -4DE5 ; [*0EAB.0020.0002] # HEXAGRAM FOR OPPOSITION -4DE6 ; [*0EAC.0020.0002] # HEXAGRAM FOR OBSTRUCTION -4DE7 ; [*0EAD.0020.0002] # HEXAGRAM FOR DELIVERANCE -4DE8 ; [*0EAE.0020.0002] # HEXAGRAM FOR DECREASE -4DE9 ; [*0EAF.0020.0002] # HEXAGRAM FOR INCREASE -4DEA ; [*0EB0.0020.0002] # HEXAGRAM FOR BREAKTHROUGH -4DEB ; [*0EB1.0020.0002] # HEXAGRAM FOR COMING TO MEET -4DEC ; [*0EB2.0020.0002] # HEXAGRAM FOR GATHERING TOGETHER -4DED ; [*0EB3.0020.0002] # HEXAGRAM FOR PUSHING UPWARD -4DEE ; [*0EB4.0020.0002] # HEXAGRAM FOR OPPRESSION -4DEF ; [*0EB5.0020.0002] # HEXAGRAM FOR THE WELL -4DF0 ; [*0EB6.0020.0002] # HEXAGRAM FOR REVOLUTION -4DF1 ; [*0EB7.0020.0002] # HEXAGRAM FOR THE CAULDRON -4DF2 ; [*0EB8.0020.0002] # HEXAGRAM FOR THE AROUSING THUNDER -4DF3 ; [*0EB9.0020.0002] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN -4DF4 ; [*0EBA.0020.0002] # HEXAGRAM FOR DEVELOPMENT -4DF5 ; [*0EBB.0020.0002] # HEXAGRAM FOR THE MARRYING MAIDEN -4DF6 ; [*0EBC.0020.0002] # HEXAGRAM FOR ABUNDANCE -4DF7 ; [*0EBD.0020.0002] # HEXAGRAM FOR THE WANDERER -4DF8 ; [*0EBE.0020.0002] # HEXAGRAM FOR THE GENTLE WIND -4DF9 ; [*0EBF.0020.0002] # HEXAGRAM FOR THE JOYOUS LAKE -4DFA ; [*0EC0.0020.0002] # HEXAGRAM FOR DISPERSION -4DFB ; [*0EC1.0020.0002] # HEXAGRAM FOR LIMITATION -4DFC ; [*0EC2.0020.0002] # HEXAGRAM FOR INNER TRUTH -4DFD ; [*0EC3.0020.0002] # HEXAGRAM FOR SMALL PREPONDERANCE -4DFE ; [*0EC4.0020.0002] # HEXAGRAM FOR AFTER COMPLETION -4DFF ; [*0EC5.0020.0002] # HEXAGRAM FOR BEFORE COMPLETION -A490 ; [*0F1D.0020.0002] # YI RADICAL QOT -A491 ; [*0F1E.0020.0002] # YI RADICAL LI -A492 ; [*0F1F.0020.0002] # YI RADICAL KIT -A493 ; [*0F20.0020.0002] # YI RADICAL NYIP -A494 ; [*0F21.0020.0002] # YI RADICAL CYP -A495 ; [*0F22.0020.0002] # YI RADICAL SSI -A496 ; [*0F23.0020.0002] # YI RADICAL GGOP -A497 ; [*0F24.0020.0002] # YI RADICAL GEP -A498 ; [*0F25.0020.0002] # YI RADICAL MI -A499 ; [*0F26.0020.0002] # YI RADICAL HXIT -A49A ; [*0F27.0020.0002] # YI RADICAL LYR -A49B ; [*0F28.0020.0002] # YI RADICAL BBUT -A49C ; [*0F29.0020.0002] # YI RADICAL MOP -A49D ; [*0F2A.0020.0002] # YI RADICAL YO -A49E ; [*0F2B.0020.0002] # YI RADICAL PUT -A49F ; [*0F2C.0020.0002] # YI RADICAL HXUO -A4A0 ; [*0F2D.0020.0002] # YI RADICAL TAT -A4A1 ; [*0F2E.0020.0002] # YI RADICAL GA -A4A2 ; [*0F2F.0020.0002] # YI RADICAL ZUP -A4A3 ; [*0F30.0020.0002] # YI RADICAL CYT -A4A4 ; [*0F31.0020.0002] # YI RADICAL DDUR -A4A5 ; [*0F32.0020.0002] # YI RADICAL BUR -A4A6 ; [*0F33.0020.0002] # YI RADICAL GGUO -A4A7 ; [*0F34.0020.0002] # YI RADICAL NYOP -A4A8 ; [*0F35.0020.0002] # YI RADICAL TU -A4A9 ; [*0F36.0020.0002] # YI RADICAL OP -A4AA ; [*0F37.0020.0002] # YI RADICAL JJUT -A4AB ; [*0F38.0020.0002] # YI RADICAL ZOT -A4AC ; [*0F39.0020.0002] # YI RADICAL PYT -A4AD ; [*0F3A.0020.0002] # YI RADICAL HMO -A4AE ; [*0F3B.0020.0002] # YI RADICAL YIT -A4AF ; [*0F3C.0020.0002] # YI RADICAL VUR -A4B0 ; [*0F3D.0020.0002] # YI RADICAL SHY -A4B1 ; [*0F3E.0020.0002] # YI RADICAL VEP -A4B2 ; [*0F3F.0020.0002] # YI RADICAL ZA -A4B3 ; [*0F40.0020.0002] # YI RADICAL JO -A4B4 ; [*0F41.0020.0002] # YI RADICAL NZUP -A4B5 ; [*0F42.0020.0002] # YI RADICAL JJY -A4B6 ; [*0F43.0020.0002] # YI RADICAL GOT -A4B7 ; [*0F44.0020.0002] # YI RADICAL JJIE -A4B8 ; [*0F45.0020.0002] # YI RADICAL WO -A4B9 ; [*0F46.0020.0002] # YI RADICAL DU -A4BA ; [*0F47.0020.0002] # YI RADICAL SHUR -A4BB ; [*0F48.0020.0002] # YI RADICAL LIE -A4BC ; [*0F49.0020.0002] # YI RADICAL CY -A4BD ; [*0F4A.0020.0002] # YI RADICAL CUOP -A4BE ; [*0F4B.0020.0002] # YI RADICAL CIP -A4BF ; [*0F4C.0020.0002] # YI RADICAL HXOP -A4C0 ; [*0F4D.0020.0002] # YI RADICAL SHAT -A4C1 ; [*0F4E.0020.0002] # YI RADICAL ZUR -A4C2 ; [*0F4F.0020.0002] # YI RADICAL SHOP -A4C3 ; [*0F50.0020.0002] # YI RADICAL CHE -A4C4 ; [*0F51.0020.0002] # YI RADICAL ZZIET -A4C5 ; [*0F52.0020.0002] # YI RADICAL NBIE -A4C6 ; [*0F53.0020.0002] # YI RADICAL KE -A4FE ; [*022D.0020.0002] # LISU PUNCTUATION COMMA -A4FF ; [*0282.0020.0002] # LISU PUNCTUATION FULL STOP -A60D ; [*022E.0020.0002] # VAI COMMA -A60E ; [*0283.0020.0002] # VAI FULL STOP -A60F ; [*026E.0020.0002] # VAI QUESTION MARK +3001 ; [*0231.0020.0002] # IDEOGRAPHIC COMMA +3002 ; [*028A.0020.0002] # IDEOGRAPHIC FULL STOP +3003 ; [*03AC.0020.0002] # DITTO MARK +3004 ; [*1A8B.0020.0002] # JAPANESE INDUSTRIAL STANDARD SYMBOL +3008 ; [*036F.0020.0002] # LEFT ANGLE BRACKET +3009 ; [*0370.0020.0002] # RIGHT ANGLE BRACKET +300A ; [*0371.0020.0002] # LEFT DOUBLE ANGLE BRACKET +300B ; [*0372.0020.0002] # RIGHT DOUBLE ANGLE BRACKET +300C ; [*0373.0020.0002] # LEFT CORNER BRACKET +300D ; [*0374.0020.0002] # RIGHT CORNER BRACKET +300E ; [*0375.0020.0002] # LEFT WHITE CORNER BRACKET +300F ; [*0376.0020.0002] # RIGHT WHITE CORNER BRACKET +3010 ; [*0377.0020.0002] # LEFT BLACK LENTICULAR BRACKET +3011 ; [*0378.0020.0002] # RIGHT BLACK LENTICULAR BRACKET +3012 ; [*1A8C.0020.0002] # POSTAL MARK +3013 ; [*1A8D.0020.0002] # GETA MARK +3014 ; [*0379.0020.0002] # LEFT TORTOISE SHELL BRACKET +3015 ; [*037A.0020.0002] # RIGHT TORTOISE SHELL BRACKET +3016 ; [*037B.0020.0002] # LEFT WHITE LENTICULAR BRACKET +3017 ; [*037C.0020.0002] # RIGHT WHITE LENTICULAR BRACKET +3018 ; [*037D.0020.0002] # LEFT WHITE TORTOISE SHELL BRACKET +3019 ; [*037E.0020.0002] # RIGHT WHITE TORTOISE SHELL BRACKET +301A ; [*037F.0020.0002] # LEFT WHITE SQUARE BRACKET +301B ; [*0380.0020.0002] # RIGHT WHITE SQUARE BRACKET +301C ; [*021E.0020.0002] # WAVE DASH +301D ; [*0312.0020.0002] # REVERSED DOUBLE PRIME QUOTATION MARK +301E ; [*0313.0020.0002] # DOUBLE PRIME QUOTATION MARK +301F ; [*0314.0020.0002] # LOW DOUBLE PRIME QUOTATION MARK +3020 ; [*1A8E.0020.0002] # POSTAL MARK FACE +3030 ; [*021F.0020.0002] # WAVY DASH +3036 ; [*1A8C.0020.0004] # CIRCLED POSTAL MARK +3037 ; [*1A8F.0020.0002] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +303D ; [*03AD.0020.0002] # PART ALTERNATION MARK +303E ; [*1A90.0020.0002] # IDEOGRAPHIC VARIATION INDICATOR +303F ; [*1A91.0020.0002] # IDEOGRAPHIC HALF FILL SPACE +309B ; [*0491.0020.0002] # KATAKANA-HIRAGANA VOICED SOUND MARK +309C ; [*0492.0020.0002] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30A0 ; [*0220.0020.0002] # KATAKANA-HIRAGANA DOUBLE HYPHEN +30FB ; [*0221.0020.0002] # KATAKANA MIDDLE DOT +3190 ; [*1A92.0020.0002] # IDEOGRAPHIC ANNOTATION LINKING MARK +3191 ; [*1A93.0020.0002] # IDEOGRAPHIC ANNOTATION REVERSE MARK +31C0 ; [*1A67.0020.0002] # CJK STROKE T +31C1 ; [*1A68.0020.0002] # CJK STROKE WG +31C2 ; [*1A69.0020.0002] # CJK STROKE XG +31C3 ; [*1A6A.0020.0002] # CJK STROKE BXG +31C4 ; [*1A6B.0020.0002] # CJK STROKE SW +31C5 ; [*1A6C.0020.0002] # CJK STROKE HZZ +31C6 ; [*1A6D.0020.0002] # CJK STROKE HZG +31C7 ; [*1A6E.0020.0002] # CJK STROKE HP +31C8 ; [*1A6F.0020.0002] # CJK STROKE HZWG +31C9 ; [*1A70.0020.0002] # CJK STROKE SZWG +31CA ; [*1A71.0020.0002] # CJK STROKE HZT +31CB ; [*1A72.0020.0002] # CJK STROKE HZZP +31CC ; [*1A73.0020.0002] # CJK STROKE HPWG +31CD ; [*1A74.0020.0002] # CJK STROKE HZW +31CE ; [*1A75.0020.0002] # CJK STROKE HZZZ +31CF ; [*1A76.0020.0002] # CJK STROKE N +31D0 ; [*1A77.0020.0002] # CJK STROKE H +31D1 ; [*1A78.0020.0002] # CJK STROKE S +31D2 ; [*1A79.0020.0002] # CJK STROKE P +31D3 ; [*1A7A.0020.0002] # CJK STROKE SP +31D4 ; [*1A7B.0020.0002] # CJK STROKE D +31D5 ; [*1A7C.0020.0002] # CJK STROKE HZ +31D6 ; [*1A7D.0020.0002] # CJK STROKE HG +31D7 ; [*1A7E.0020.0002] # CJK STROKE SZ +31D8 ; [*1A7F.0020.0002] # CJK STROKE SWZ +31D9 ; [*1A80.0020.0002] # CJK STROKE ST +31DA ; [*1A81.0020.0002] # CJK STROKE SG +31DB ; [*1A82.0020.0002] # CJK STROKE PD +31DC ; [*1A83.0020.0002] # CJK STROKE PZ +31DD ; [*1A84.0020.0002] # CJK STROKE TN +31DE ; [*1A85.0020.0002] # CJK STROKE SZZ +31DF ; [*1A86.0020.0002] # CJK STROKE SWG +31E0 ; [*1A87.0020.0002] # CJK STROKE HXWG +31E1 ; [*1A88.0020.0002] # CJK STROKE HZZZG +31E2 ; [*1A89.0020.0002] # CJK STROKE PG +31E3 ; [*1A8A.0020.0002] # CJK STROKE Q +327F ; [*1A94.0020.0002] # KOREAN STANDARD SYMBOL +4DC0 ; [*0EAA.0020.0002] # HEXAGRAM FOR THE CREATIVE HEAVEN +4DC1 ; [*0EAB.0020.0002] # HEXAGRAM FOR THE RECEPTIVE EARTH +4DC2 ; [*0EAC.0020.0002] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING +4DC3 ; [*0EAD.0020.0002] # HEXAGRAM FOR YOUTHFUL FOLLY +4DC4 ; [*0EAE.0020.0002] # HEXAGRAM FOR WAITING +4DC5 ; [*0EAF.0020.0002] # HEXAGRAM FOR CONFLICT +4DC6 ; [*0EB0.0020.0002] # HEXAGRAM FOR THE ARMY +4DC7 ; [*0EB1.0020.0002] # HEXAGRAM FOR HOLDING TOGETHER +4DC8 ; [*0EB2.0020.0002] # HEXAGRAM FOR SMALL TAMING +4DC9 ; [*0EB3.0020.0002] # HEXAGRAM FOR TREADING +4DCA ; [*0EB4.0020.0002] # HEXAGRAM FOR PEACE +4DCB ; [*0EB5.0020.0002] # HEXAGRAM FOR STANDSTILL +4DCC ; [*0EB6.0020.0002] # HEXAGRAM FOR FELLOWSHIP +4DCD ; [*0EB7.0020.0002] # HEXAGRAM FOR GREAT POSSESSION +4DCE ; [*0EB8.0020.0002] # HEXAGRAM FOR MODESTY +4DCF ; [*0EB9.0020.0002] # HEXAGRAM FOR ENTHUSIASM +4DD0 ; [*0EBA.0020.0002] # HEXAGRAM FOR FOLLOWING +4DD1 ; [*0EBB.0020.0002] # HEXAGRAM FOR WORK ON THE DECAYED +4DD2 ; [*0EBC.0020.0002] # HEXAGRAM FOR APPROACH +4DD3 ; [*0EBD.0020.0002] # HEXAGRAM FOR CONTEMPLATION +4DD4 ; [*0EBE.0020.0002] # HEXAGRAM FOR BITING THROUGH +4DD5 ; [*0EBF.0020.0002] # HEXAGRAM FOR GRACE +4DD6 ; [*0EC0.0020.0002] # HEXAGRAM FOR SPLITTING APART +4DD7 ; [*0EC1.0020.0002] # HEXAGRAM FOR RETURN +4DD8 ; [*0EC2.0020.0002] # HEXAGRAM FOR INNOCENCE +4DD9 ; [*0EC3.0020.0002] # HEXAGRAM FOR GREAT TAMING +4DDA ; [*0EC4.0020.0002] # HEXAGRAM FOR MOUTH CORNERS +4DDB ; [*0EC5.0020.0002] # HEXAGRAM FOR GREAT PREPONDERANCE +4DDC ; [*0EC6.0020.0002] # HEXAGRAM FOR THE ABYSMAL WATER +4DDD ; [*0EC7.0020.0002] # HEXAGRAM FOR THE CLINGING FIRE +4DDE ; [*0EC8.0020.0002] # HEXAGRAM FOR INFLUENCE +4DDF ; [*0EC9.0020.0002] # HEXAGRAM FOR DURATION +4DE0 ; [*0ECA.0020.0002] # HEXAGRAM FOR RETREAT +4DE1 ; [*0ECB.0020.0002] # HEXAGRAM FOR GREAT POWER +4DE2 ; [*0ECC.0020.0002] # HEXAGRAM FOR PROGRESS +4DE3 ; [*0ECD.0020.0002] # HEXAGRAM FOR DARKENING OF THE LIGHT +4DE4 ; [*0ECE.0020.0002] # HEXAGRAM FOR THE FAMILY +4DE5 ; [*0ECF.0020.0002] # HEXAGRAM FOR OPPOSITION +4DE6 ; [*0ED0.0020.0002] # HEXAGRAM FOR OBSTRUCTION +4DE7 ; [*0ED1.0020.0002] # HEXAGRAM FOR DELIVERANCE +4DE8 ; [*0ED2.0020.0002] # HEXAGRAM FOR DECREASE +4DE9 ; [*0ED3.0020.0002] # HEXAGRAM FOR INCREASE +4DEA ; [*0ED4.0020.0002] # HEXAGRAM FOR BREAKTHROUGH +4DEB ; [*0ED5.0020.0002] # HEXAGRAM FOR COMING TO MEET +4DEC ; [*0ED6.0020.0002] # HEXAGRAM FOR GATHERING TOGETHER +4DED ; [*0ED7.0020.0002] # HEXAGRAM FOR PUSHING UPWARD +4DEE ; [*0ED8.0020.0002] # HEXAGRAM FOR OPPRESSION +4DEF ; [*0ED9.0020.0002] # HEXAGRAM FOR THE WELL +4DF0 ; [*0EDA.0020.0002] # HEXAGRAM FOR REVOLUTION +4DF1 ; [*0EDB.0020.0002] # HEXAGRAM FOR THE CAULDRON +4DF2 ; [*0EDC.0020.0002] # HEXAGRAM FOR THE AROUSING THUNDER +4DF3 ; [*0EDD.0020.0002] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN +4DF4 ; [*0EDE.0020.0002] # HEXAGRAM FOR DEVELOPMENT +4DF5 ; [*0EDF.0020.0002] # HEXAGRAM FOR THE MARRYING MAIDEN +4DF6 ; [*0EE0.0020.0002] # HEXAGRAM FOR ABUNDANCE +4DF7 ; [*0EE1.0020.0002] # HEXAGRAM FOR THE WANDERER +4DF8 ; [*0EE2.0020.0002] # HEXAGRAM FOR THE GENTLE WIND +4DF9 ; [*0EE3.0020.0002] # HEXAGRAM FOR THE JOYOUS LAKE +4DFA ; [*0EE4.0020.0002] # HEXAGRAM FOR DISPERSION +4DFB ; [*0EE5.0020.0002] # HEXAGRAM FOR LIMITATION +4DFC ; [*0EE6.0020.0002] # HEXAGRAM FOR INNER TRUTH +4DFD ; [*0EE7.0020.0002] # HEXAGRAM FOR SMALL PREPONDERANCE +4DFE ; [*0EE8.0020.0002] # HEXAGRAM FOR AFTER COMPLETION +4DFF ; [*0EE9.0020.0002] # HEXAGRAM FOR BEFORE COMPLETION +A490 ; [*0F41.0020.0002] # YI RADICAL QOT +A491 ; [*0F42.0020.0002] # YI RADICAL LI +A492 ; [*0F43.0020.0002] # YI RADICAL KIT +A493 ; [*0F44.0020.0002] # YI RADICAL NYIP +A494 ; [*0F45.0020.0002] # YI RADICAL CYP +A495 ; [*0F46.0020.0002] # YI RADICAL SSI +A496 ; [*0F47.0020.0002] # YI RADICAL GGOP +A497 ; [*0F48.0020.0002] # YI RADICAL GEP +A498 ; [*0F49.0020.0002] # YI RADICAL MI +A499 ; [*0F4A.0020.0002] # YI RADICAL HXIT +A49A ; [*0F4B.0020.0002] # YI RADICAL LYR +A49B ; [*0F4C.0020.0002] # YI RADICAL BBUT +A49C ; [*0F4D.0020.0002] # YI RADICAL MOP +A49D ; [*0F4E.0020.0002] # YI RADICAL YO +A49E ; [*0F4F.0020.0002] # YI RADICAL PUT +A49F ; [*0F50.0020.0002] # YI RADICAL HXUO +A4A0 ; [*0F51.0020.0002] # YI RADICAL TAT +A4A1 ; [*0F52.0020.0002] # YI RADICAL GA +A4A2 ; [*0F53.0020.0002] # YI RADICAL ZUP +A4A3 ; [*0F54.0020.0002] # YI RADICAL CYT +A4A4 ; [*0F55.0020.0002] # YI RADICAL DDUR +A4A5 ; [*0F56.0020.0002] # YI RADICAL BUR +A4A6 ; [*0F57.0020.0002] # YI RADICAL GGUO +A4A7 ; [*0F58.0020.0002] # YI RADICAL NYOP +A4A8 ; [*0F59.0020.0002] # YI RADICAL TU +A4A9 ; [*0F5A.0020.0002] # YI RADICAL OP +A4AA ; [*0F5B.0020.0002] # YI RADICAL JJUT +A4AB ; [*0F5C.0020.0002] # YI RADICAL ZOT +A4AC ; [*0F5D.0020.0002] # YI RADICAL PYT +A4AD ; [*0F5E.0020.0002] # YI RADICAL HMO +A4AE ; [*0F5F.0020.0002] # YI RADICAL YIT +A4AF ; [*0F60.0020.0002] # YI RADICAL VUR +A4B0 ; [*0F61.0020.0002] # YI RADICAL SHY +A4B1 ; [*0F62.0020.0002] # YI RADICAL VEP +A4B2 ; [*0F63.0020.0002] # YI RADICAL ZA +A4B3 ; [*0F64.0020.0002] # YI RADICAL JO +A4B4 ; [*0F65.0020.0002] # YI RADICAL NZUP +A4B5 ; [*0F66.0020.0002] # YI RADICAL JJY +A4B6 ; [*0F67.0020.0002] # YI RADICAL GOT +A4B7 ; [*0F68.0020.0002] # YI RADICAL JJIE +A4B8 ; [*0F69.0020.0002] # YI RADICAL WO +A4B9 ; [*0F6A.0020.0002] # YI RADICAL DU +A4BA ; [*0F6B.0020.0002] # YI RADICAL SHUR +A4BB ; [*0F6C.0020.0002] # YI RADICAL LIE +A4BC ; [*0F6D.0020.0002] # YI RADICAL CY +A4BD ; [*0F6E.0020.0002] # YI RADICAL CUOP +A4BE ; [*0F6F.0020.0002] # YI RADICAL CIP +A4BF ; [*0F70.0020.0002] # YI RADICAL HXOP +A4C0 ; [*0F71.0020.0002] # YI RADICAL SHAT +A4C1 ; [*0F72.0020.0002] # YI RADICAL ZUR +A4C2 ; [*0F73.0020.0002] # YI RADICAL SHOP +A4C3 ; [*0F74.0020.0002] # YI RADICAL CHE +A4C4 ; [*0F75.0020.0002] # YI RADICAL ZZIET +A4C5 ; [*0F76.0020.0002] # YI RADICAL NBIE +A4C6 ; [*0F77.0020.0002] # YI RADICAL KE +A4FE ; [*022E.0020.0002] # LISU PUNCTUATION COMMA +A4FF ; [*0285.0020.0002] # LISU PUNCTUATION FULL STOP +A60D ; [*022F.0020.0002] # VAI COMMA +A60E ; [*0286.0020.0002] # VAI FULL STOP +A60F ; [*0270.0020.0002] # VAI QUESTION MARK A670 ; [.0000.0000.0000] # COMBINING CYRILLIC TEN MILLIONS SIGN A671 ; [.0000.0000.0000] # COMBINING CYRILLIC HUNDRED MILLIONS SIGN A672 ; [.0000.0000.0000] # COMBINING CYRILLIC THOUSAND MILLIONS SIGN -A673 ; [*038C.0020.0002] # SLAVONIC ASTERISK -A67E ; [*03C2.0020.0002] # CYRILLIC KAVYKA -A6F2 ; [*02D0.0020.0002] # BAMUM NJAEMLI -A6F3 ; [*0284.0020.0002] # BAMUM FULL STOP -A6F4 ; [*025E.0020.0002] # BAMUM COLON -A6F5 ; [*022F.0020.0002] # BAMUM COMMA -A6F6 ; [*0237.0020.0002] # BAMUM SEMICOLON -A6F7 ; [*026F.0020.0002] # BAMUM QUESTION MARK -A700 ; [*04B1.0020.0002] # MODIFIER LETTER CHINESE TONE YIN PING -A701 ; [*04B2.0020.0002] # MODIFIER LETTER CHINESE TONE YANG PING -A702 ; [*04B3.0020.0002] # MODIFIER LETTER CHINESE TONE YIN SHANG -A703 ; [*04B4.0020.0002] # MODIFIER LETTER CHINESE TONE YANG SHANG -A704 ; [*04B5.0020.0002] # MODIFIER LETTER CHINESE TONE YIN QU -A705 ; [*04B6.0020.0002] # MODIFIER LETTER CHINESE TONE YANG QU -A706 ; [*04B7.0020.0002] # MODIFIER LETTER CHINESE TONE YIN RU -A707 ; [*04B8.0020.0002] # MODIFIER LETTER CHINESE TONE YANG RU -A708 ; [*04B9.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR -A709 ; [*04BA.0020.0002] # MODIFIER LETTER HIGH DOTTED TONE BAR -A70A ; [*04BB.0020.0002] # MODIFIER LETTER MID DOTTED TONE BAR -A70B ; [*04BC.0020.0002] # MODIFIER LETTER LOW DOTTED TONE BAR -A70C ; [*04BD.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR -A70D ; [*04BE.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR -A70E ; [*04BF.0020.0002] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR -A70F ; [*04C0.0020.0002] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR -A710 ; [*04C1.0020.0002] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR -A711 ; [*04C2.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR -A712 ; [*04C3.0020.0002] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR -A713 ; [*04C4.0020.0002] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR -A714 ; [*04C5.0020.0002] # MODIFIER LETTER MID LEFT-STEM TONE BAR -A715 ; [*04C6.0020.0002] # MODIFIER LETTER LOW LEFT-STEM TONE BAR -A716 ; [*04C7.0020.0002] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR -A717 ; [*04C8.0020.0002] # MODIFIER LETTER DOT VERTICAL BAR -A718 ; [*04C9.0020.0002] # MODIFIER LETTER DOT SLASH -A719 ; [*04CA.0020.0002] # MODIFIER LETTER DOT HORIZONTAL BAR -A71A ; [*04CB.0020.0002] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE -A71B ; [*04CC.0020.0002] # MODIFIER LETTER RAISED UP ARROW -A71C ; [*04CD.0020.0002] # MODIFIER LETTER RAISED DOWN ARROW -A71D ; [*04CE.0020.0002] # MODIFIER LETTER RAISED EXCLAMATION MARK -A71E ; [*04CF.0020.0002] # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK -A71F ; [*04D0.0020.0002] # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK -A720 ; [*04D1.0020.0002] # MODIFIER LETTER STRESS AND HIGH TONE -A721 ; [*04D2.0020.0002] # MODIFIER LETTER STRESS AND LOW TONE -A788 ; [*04D3.0020.0002] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT -A789 ; [*04D4.0020.0002] # MODIFIER LETTER COLON -A78A ; [*04D5.0020.0002] # MODIFIER LETTER SHORT EQUALS SIGN -A828 ; [*04FF.0020.0002] # SYLOTI NAGRI POETRY MARK-1 -A829 ; [*0500.0020.0002] # SYLOTI NAGRI POETRY MARK-2 -A82A ; [*0501.0020.0002] # SYLOTI NAGRI POETRY MARK-3 -A82B ; [*0502.0020.0002] # SYLOTI NAGRI POETRY MARK-4 -A830 ; [*1A32.0020.0002] # NORTH INDIC FRACTION ONE QUARTER -A831 ; [*1A33.0020.0002] # NORTH INDIC FRACTION ONE HALF -A832 ; [*1A34.0020.0002] # NORTH INDIC FRACTION THREE QUARTERS -A833 ; [*1A35.0020.0002] # NORTH INDIC FRACTION ONE SIXTEENTH -A834 ; [*1A36.0020.0002] # NORTH INDIC FRACTION ONE EIGHTH -A835 ; [*1A37.0020.0002] # NORTH INDIC FRACTION THREE SIXTEENTHS -A836 ; [*0503.0020.0002] # NORTH INDIC QUARTER MARK -A837 ; [*0504.0020.0002] # NORTH INDIC PLACEHOLDER MARK -A839 ; [*0505.0020.0002] # NORTH INDIC QUANTITY MARK -A874 ; [*0411.0020.0002] # PHAGS-PA SINGLE HEAD MARK -A875 ; [*0412.0020.0002] # PHAGS-PA DOUBLE HEAD MARK -A876 ; [*0291.0020.0002] # PHAGS-PA MARK SHAD -A877 ; [*0292.0020.0002] # PHAGS-PA MARK DOUBLE SHAD -A8CE ; [*028D.0020.0002] # SAURASHTRA DANDA -A8CF ; [*028E.0020.0002] # SAURASHTRA DOUBLE DANDA +A673 ; [*0393.0020.0002] # SLAVONIC ASTERISK +A67E ; [*03CA.0020.0002] # CYRILLIC KAVYKA +A6F2 ; [*02D7.0020.0002] # BAMUM NJAEMLI +A6F3 ; [*0287.0020.0002] # BAMUM FULL STOP +A6F4 ; [*025F.0020.0002] # BAMUM COLON +A6F5 ; [*0230.0020.0002] # BAMUM COMMA +A6F6 ; [*0238.0020.0002] # BAMUM SEMICOLON +A6F7 ; [*0271.0020.0002] # BAMUM QUESTION MARK +A700 ; [*04D0.0020.0002] # MODIFIER LETTER CHINESE TONE YIN PING +A701 ; [*04D1.0020.0002] # MODIFIER LETTER CHINESE TONE YANG PING +A702 ; [*04D2.0020.0002] # MODIFIER LETTER CHINESE TONE YIN SHANG +A703 ; [*04D3.0020.0002] # MODIFIER LETTER CHINESE TONE YANG SHANG +A704 ; [*04D4.0020.0002] # MODIFIER LETTER CHINESE TONE YIN QU +A705 ; [*04D5.0020.0002] # MODIFIER LETTER CHINESE TONE YANG QU +A706 ; [*04D6.0020.0002] # MODIFIER LETTER CHINESE TONE YIN RU +A707 ; [*04D7.0020.0002] # MODIFIER LETTER CHINESE TONE YANG RU +A708 ; [*04D8.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR +A709 ; [*04D9.0020.0002] # MODIFIER LETTER HIGH DOTTED TONE BAR +A70A ; [*04DA.0020.0002] # MODIFIER LETTER MID DOTTED TONE BAR +A70B ; [*04DB.0020.0002] # MODIFIER LETTER LOW DOTTED TONE BAR +A70C ; [*04DC.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR +A70D ; [*04DD.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR +A70E ; [*04DE.0020.0002] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR +A70F ; [*04DF.0020.0002] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR +A710 ; [*04E0.0020.0002] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR +A711 ; [*04E1.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR +A712 ; [*04E2.0020.0002] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR +A713 ; [*04E3.0020.0002] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR +A714 ; [*04E4.0020.0002] # MODIFIER LETTER MID LEFT-STEM TONE BAR +A715 ; [*04E5.0020.0002] # MODIFIER LETTER LOW LEFT-STEM TONE BAR +A716 ; [*04E6.0020.0002] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717 ; [*04E7.0020.0002] # MODIFIER LETTER DOT VERTICAL BAR +A718 ; [*04E8.0020.0002] # MODIFIER LETTER DOT SLASH +A719 ; [*04E9.0020.0002] # MODIFIER LETTER DOT HORIZONTAL BAR +A71A ; [*04EA.0020.0002] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE +A71B ; [*04EB.0020.0002] # MODIFIER LETTER RAISED UP ARROW +A71C ; [*04EC.0020.0002] # MODIFIER LETTER RAISED DOWN ARROW +A71D ; [*04ED.0020.0002] # MODIFIER LETTER RAISED EXCLAMATION MARK +A71E ; [*04EE.0020.0002] # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK +A71F ; [*04EF.0020.0002] # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720 ; [*04F0.0020.0002] # MODIFIER LETTER STRESS AND HIGH TONE +A721 ; [*04F1.0020.0002] # MODIFIER LETTER STRESS AND LOW TONE +A788 ; [*04F2.0020.0002] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789 ; [*04F3.0020.0002] # MODIFIER LETTER COLON +A78A ; [*04F4.0020.0002] # MODIFIER LETTER SHORT EQUALS SIGN +A828 ; [*051F.0020.0002] # SYLOTI NAGRI POETRY MARK-1 +A829 ; [*0520.0020.0002] # SYLOTI NAGRI POETRY MARK-2 +A82A ; [*0521.0020.0002] # SYLOTI NAGRI POETRY MARK-3 +A82B ; [*0522.0020.0002] # SYLOTI NAGRI POETRY MARK-4 +A830 ; [*1AA2.0020.0002] # NORTH INDIC FRACTION ONE QUARTER +A831 ; [*1AA3.0020.0002] # NORTH INDIC FRACTION ONE HALF +A832 ; [*1AA4.0020.0002] # NORTH INDIC FRACTION THREE QUARTERS +A833 ; [*1AA5.0020.0002] # NORTH INDIC FRACTION ONE SIXTEENTH +A834 ; [*1AA6.0020.0002] # NORTH INDIC FRACTION ONE EIGHTH +A835 ; [*1AA7.0020.0002] # NORTH INDIC FRACTION THREE SIXTEENTHS +A836 ; [*0523.0020.0002] # NORTH INDIC QUARTER MARK +A837 ; [*0524.0020.0002] # NORTH INDIC PLACEHOLDER MARK +A839 ; [*0525.0020.0002] # NORTH INDIC QUANTITY MARK +A874 ; [*0428.0020.0002] # PHAGS-PA SINGLE HEAD MARK +A875 ; [*0429.0020.0002] # PHAGS-PA DOUBLE HEAD MARK +A876 ; [*0294.0020.0002] # PHAGS-PA MARK SHAD +A877 ; [*0295.0020.0002] # PHAGS-PA MARK DOUBLE SHAD +A8CE ; [*0290.0020.0002] # SAURASHTRA DANDA +A8CF ; [*0291.0020.0002] # SAURASHTRA DOUBLE DANDA A8E0 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT ZERO A8E1 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT ONE A8E2 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT TWO @@ -3981,71 +4014,71 @@ A8EE ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER PA A8EF ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER RA A8F0 ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER VI A8F1 ; [.0000.0000.0000] # COMBINING DEVANAGARI SIGN AVAGRAHA -A8F8 ; [*03D3.0020.0002] # DEVANAGARI SIGN PUSHPIKA -A8F9 ; [*03D4.0020.0002] # DEVANAGARI GAP FILLER -A8FA ; [*03D5.0020.0002] # DEVANAGARI CARET -A8FC ; [*03D6.0020.0002] # DEVANAGARI SIGN SIDDHAM -A92E ; [*0417.0020.0002] # KAYAH LI SIGN CWI -A92F ; [*0295.0020.0002] # KAYAH LI SIGN SHYA -A95F ; [*02D1.0020.0002] # REJANG SECTION MARK -A9C1 ; [*02C6.0020.0002] # JAVANESE LEFT RERENGGAN -A9C2 ; [*02C7.0020.0002] # JAVANESE RIGHT RERENGGAN -A9C3 ; [*02C8.0020.0002] # JAVANESE PADA ANDAP -A9C4 ; [*02C9.0020.0002] # JAVANESE PADA MADYA -A9C5 ; [*02CA.0020.0002] # JAVANESE PADA LUHUR -A9C6 ; [*02CB.0020.0002] # JAVANESE PADA WINDU -A9C7 ; [*025A.0020.0002] # JAVANESE PADA PANGKAT -A9C8 ; [*02A0.0020.0002] # JAVANESE PADA LINGSA -A9C9 ; [*02A1.0020.0002] # JAVANESE PADA LUNGSI -A9CA ; [*02CC.0020.0002] # JAVANESE PADA ADEG -A9CB ; [*02CD.0020.0002] # JAVANESE PADA ADEG ADEG -A9CC ; [*02CE.0020.0002] # JAVANESE PADA PISELEH -A9CD ; [*02CF.0020.0002] # JAVANESE TURNED PADA PISELEH -A9DE ; [*0418.0020.0002] # JAVANESE PADA TIRTA TUMETES -A9DF ; [*0419.0020.0002] # JAVANESE PADA ISEN-ISEN -AA5C ; [*041A.0020.0002] # CHAM PUNCTUATION SPIRAL -AA5D ; [*02A2.0020.0002] # CHAM PUNCTUATION DANDA -AA5E ; [*02A3.0020.0002] # CHAM PUNCTUATION DOUBLE DANDA -AA5F ; [*02A4.0020.0002] # CHAM PUNCTUATION TRIPLE DANDA -AA77 ; [*052D.0020.0002] # MYANMAR SYMBOL AITON EXCLAMATION -AA78 ; [*052E.0020.0002] # MYANMAR SYMBOL AITON ONE -AA79 ; [*052F.0020.0002] # MYANMAR SYMBOL AITON TWO -AADE ; [*03DC.0020.0002] # TAI VIET SYMBOL HO HOI -AADF ; [*03DD.0020.0002] # TAI VIET SYMBOL KOI KOI -AAF0 ; [*02A5.0020.0002] # MEETEI MAYEK CHEIKHAN -AAF1 ; [*0270.0020.0002] # MEETEI MAYEK AHANG KHUDAM -AB5B ; [*04D6.0020.0002] # MODIFIER BREVE WITH INVERTED BREVE -ABEB ; [*02A6.0020.0002] # MEETEI MAYEK CHEIKHEI -FB29 ; [*05F6.0020.0005] # HEBREW LETTER ALTERNATIVE PLUS SIGN -FBB2 ; [*04E3.0020.0002] # ARABIC SYMBOL DOT ABOVE -FBB3 ; [*04E4.0020.0002] # ARABIC SYMBOL DOT BELOW -FBB4 ; [*04E5.0020.0002] # ARABIC SYMBOL TWO DOTS ABOVE -FBB5 ; [*04E6.0020.0002] # ARABIC SYMBOL TWO DOTS BELOW -FBB6 ; [*04E7.0020.0002] # ARABIC SYMBOL THREE DOTS ABOVE -FBB7 ; [*04E8.0020.0002] # ARABIC SYMBOL THREE DOTS BELOW -FBB8 ; [*04E9.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE -FBB9 ; [*04EA.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW -FBBA ; [*04EB.0020.0002] # ARABIC SYMBOL FOUR DOTS ABOVE -FBBB ; [*04EC.0020.0002] # ARABIC SYMBOL FOUR DOTS BELOW -FBBC ; [*04ED.0020.0002] # ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW -FBBD ; [*04EE.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE -FBBE ; [*04EF.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY BELOW -FBBF ; [*04F0.0020.0002] # ARABIC SYMBOL RING -FBC0 ; [*04F1.0020.0002] # ARABIC SYMBOL SMALL TAH ABOVE -FBC1 ; [*04F2.0020.0002] # ARABIC SYMBOL SMALL TAH BELOW -FD3E ; [*037A.0020.0002] # ORNATE LEFT PARENTHESIS -FD3F ; [*037B.0020.0002] # ORNATE RIGHT PARENTHESIS -FDFD ; [*04E2.0020.0002] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM -FE10 ; [*0221.0020.0016] # PRESENTATION FORM FOR VERTICAL COMMA -FE11 ; [*0230.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA -FE12 ; [*0287.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP -FE13 ; [*0238.0020.0016] # PRESENTATION FORM FOR VERTICAL COLON -FE14 ; [*0233.0020.0016] # PRESENTATION FORM FOR VERTICAL SEMICOLON -FE15 ; [*025F.0020.0016] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK -FE16 ; [*0264.0020.0016] # PRESENTATION FORM FOR VERTICAL QUESTION MARK -FE17 ; [*0374.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -FE18 ; [*0375.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -FE19 ; [*0274.0020.0016][*0274.0020.0016][*0274.0020.0016] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +A8F8 ; [*03E8.0020.0002] # DEVANAGARI SIGN PUSHPIKA +A8F9 ; [*03E9.0020.0002] # DEVANAGARI GAP FILLER +A8FA ; [*03EA.0020.0002] # DEVANAGARI CARET +A8FC ; [*03EB.0020.0002] # DEVANAGARI SIGN SIDDHAM +A92E ; [*042E.0020.0002] # KAYAH LI SIGN CWI +A92F ; [*0298.0020.0002] # KAYAH LI SIGN SHYA +A95F ; [*02D8.0020.0002] # REJANG SECTION MARK +A9C1 ; [*02CD.0020.0002] # JAVANESE LEFT RERENGGAN +A9C2 ; [*02CE.0020.0002] # JAVANESE RIGHT RERENGGAN +A9C3 ; [*02CF.0020.0002] # JAVANESE PADA ANDAP +A9C4 ; [*02D0.0020.0002] # JAVANESE PADA MADYA +A9C5 ; [*02D1.0020.0002] # JAVANESE PADA LUHUR +A9C6 ; [*02D2.0020.0002] # JAVANESE PADA WINDU +A9C7 ; [*025B.0020.0002] # JAVANESE PADA PANGKAT +A9C8 ; [*02A3.0020.0002] # JAVANESE PADA LINGSA +A9C9 ; [*02A4.0020.0002] # JAVANESE PADA LUNGSI +A9CA ; [*02D3.0020.0002] # JAVANESE PADA ADEG +A9CB ; [*02D4.0020.0002] # JAVANESE PADA ADEG ADEG +A9CC ; [*02D5.0020.0002] # JAVANESE PADA PISELEH +A9CD ; [*02D6.0020.0002] # JAVANESE TURNED PADA PISELEH +A9DE ; [*042F.0020.0002] # JAVANESE PADA TIRTA TUMETES +A9DF ; [*0430.0020.0002] # JAVANESE PADA ISEN-ISEN +AA5C ; [*0431.0020.0002] # CHAM PUNCTUATION SPIRAL +AA5D ; [*02A5.0020.0002] # CHAM PUNCTUATION DANDA +AA5E ; [*02A6.0020.0002] # CHAM PUNCTUATION DOUBLE DANDA +AA5F ; [*02A7.0020.0002] # CHAM PUNCTUATION TRIPLE DANDA +AA77 ; [*054D.0020.0002] # MYANMAR SYMBOL AITON EXCLAMATION +AA78 ; [*054E.0020.0002] # MYANMAR SYMBOL AITON ONE +AA79 ; [*054F.0020.0002] # MYANMAR SYMBOL AITON TWO +AADE ; [*03F1.0020.0002] # TAI VIET SYMBOL HO HOI +AADF ; [*03F2.0020.0002] # TAI VIET SYMBOL KOI KOI +AAF0 ; [*02A8.0020.0002] # MEETEI MAYEK CHEIKHAN +AAF1 ; [*0272.0020.0002] # MEETEI MAYEK AHANG KHUDAM +AB5B ; [*04F5.0020.0002] # MODIFIER BREVE WITH INVERTED BREVE +ABEB ; [*02A9.0020.0002] # MEETEI MAYEK CHEIKHEI +FB29 ; [*0616.0020.0005] # HEBREW LETTER ALTERNATIVE PLUS SIGN +FBB2 ; [*0502.0020.0002] # ARABIC SYMBOL DOT ABOVE +FBB3 ; [*0503.0020.0002] # ARABIC SYMBOL DOT BELOW +FBB4 ; [*0504.0020.0002] # ARABIC SYMBOL TWO DOTS ABOVE +FBB5 ; [*0505.0020.0002] # ARABIC SYMBOL TWO DOTS BELOW +FBB6 ; [*0506.0020.0002] # ARABIC SYMBOL THREE DOTS ABOVE +FBB7 ; [*0507.0020.0002] # ARABIC SYMBOL THREE DOTS BELOW +FBB8 ; [*0508.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE +FBB9 ; [*0509.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW +FBBA ; [*050A.0020.0002] # ARABIC SYMBOL FOUR DOTS ABOVE +FBBB ; [*050B.0020.0002] # ARABIC SYMBOL FOUR DOTS BELOW +FBBC ; [*050C.0020.0002] # ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW +FBBD ; [*050D.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE +FBBE ; [*050E.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY BELOW +FBBF ; [*050F.0020.0002] # ARABIC SYMBOL RING +FBC0 ; [*0510.0020.0002] # ARABIC SYMBOL SMALL TAH ABOVE +FBC1 ; [*0511.0020.0002] # ARABIC SYMBOL SMALL TAH BELOW +FD3E ; [*0381.0020.0002] # ORNATE LEFT PARENTHESIS +FD3F ; [*0382.0020.0002] # ORNATE RIGHT PARENTHESIS +FDFD ; [*0501.0020.0002] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE10 ; [*0222.0020.0016] # PRESENTATION FORM FOR VERTICAL COMMA +FE11 ; [*0231.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA +FE12 ; [*028A.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13 ; [*0239.0020.0016] # PRESENTATION FORM FOR VERTICAL COLON +FE14 ; [*0234.0020.0016] # PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15 ; [*0260.0020.0016] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +FE16 ; [*0266.0020.0016] # PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; [*037B.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; [*037C.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; [*0277.0020.0016][*0277.0020.0016][*0277.0020.0016] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS FE21 ; [.0000.0000.0000] # COMBINING LIGATURE RIGHT HALF FE23 ; [.0000.0000.0000] # COMBINING DOUBLE TILDE RIGHT HALF FE24 ; [.0000.0000.0000] # COMBINING MACRON LEFT HALF @@ -4057,31 +4090,31 @@ FE2B ; [.0000.0000.0000] # COMBINING MACRON LEFT HALF BELOW FE2C ; [.0000.0000.0000] # COMBINING MACRON RIGHT HALF BELOW FE2D ; [.0000.0000.0000] # COMBINING CONJOINING MACRON BELOW FE2F ; [.0000.0000.0000] # COMBINING CYRILLIC TITLO RIGHT HALF -FE30 ; [*0274.0020.0016][*0274.0020.0016] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE30 ; [*0277.0020.0016][*0277.0020.0016] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER FE31 ; [*0216.0020.0016] # PRESENTATION FORM FOR VERTICAL EM DASH FE32 ; [*0215.0020.0016] # PRESENTATION FORM FOR VERTICAL EN DASH FE33 ; [*020B.0020.0016] # PRESENTATION FORM FOR VERTICAL LOW LINE FE34 ; [*020B.0020.0016] # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE35 ; [*0310.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; [*0311.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; [*0314.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; [*0315.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE39 ; [*0372.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3A ; [*0373.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3B ; [*0370.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3C ; [*0371.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3D ; [*036A.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3E ; [*036B.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE3F ; [*0368.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE40 ; [*0369.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE41 ; [*036C.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE42 ; [*036D.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE43 ; [*036E.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE44 ; [*036F.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -FE45 ; [*0231.0020.0002] # SESAME DOT -FE46 ; [*0232.0020.0002] # WHITE SESAME DOT -FE47 ; [*0312.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; [*0313.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE35 ; [*0317.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; [*0318.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; [*031B.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; [*031C.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; [*0379.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; [*037A.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; [*0377.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; [*0378.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; [*0371.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; [*0372.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; [*036F.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; [*0370.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; [*0373.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; [*0374.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; [*0375.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; [*0376.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45 ; [*0232.0020.0002] # SESAME DOT +FE46 ; [*0233.0020.0002] # WHITE SESAME DOT +FE47 ; [*0319.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; [*031A.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET FE49 ; [*020A.0020.0004] # DASHED OVERLINE FE4A ; [*020A.0020.0004] # CENTRELINE OVERLINE FE4B ; [*020A.0020.0004] # WAVY OVERLINE @@ -4089,487 +4122,489 @@ FE4C ; [*020A.0020.0004] # DOUBLE WAVY OVERLINE FE4D ; [*020B.0020.0004] # DASHED LOW LINE FE4E ; [*020B.0020.0004] # CENTRELINE LOW LINE FE4F ; [*020B.0020.0004] # WAVY LOW LINE -FE50 ; [*0221.0020.000F] # SMALL COMMA -FE51 ; [*0230.0020.000F] # SMALL IDEOGRAPHIC COMMA -FE52 ; [*0274.0020.000F] # SMALL FULL STOP -FE54 ; [*0233.0020.000F] # SMALL SEMICOLON -FE55 ; [*0238.0020.000F] # SMALL COLON -FE56 ; [*0264.0020.000F] # SMALL QUESTION MARK -FE57 ; [*025F.0020.000F] # SMALL EXCLAMATION MARK +FE50 ; [*0222.0020.000F] # SMALL COMMA +FE51 ; [*0231.0020.000F] # SMALL IDEOGRAPHIC COMMA +FE52 ; [*0277.0020.000F] # SMALL FULL STOP +FE54 ; [*0234.0020.000F] # SMALL SEMICOLON +FE55 ; [*0239.0020.000F] # SMALL COLON +FE56 ; [*0266.0020.000F] # SMALL QUESTION MARK +FE57 ; [*0260.0020.000F] # SMALL EXCLAMATION MARK FE58 ; [*0216.0020.000F] # SMALL EM DASH -FE59 ; [*0310.0020.000F] # SMALL LEFT PARENTHESIS -FE5A ; [*0311.0020.000F] # SMALL RIGHT PARENTHESIS -FE5B ; [*0314.0020.000F] # SMALL LEFT CURLY BRACKET -FE5C ; [*0315.0020.000F] # SMALL RIGHT CURLY BRACKET -FE5D ; [*0372.0020.000F] # SMALL LEFT TORTOISE SHELL BRACKET -FE5E ; [*0373.0020.000F] # SMALL RIGHT TORTOISE SHELL BRACKET -FE5F ; [*0391.0020.000F] # SMALL NUMBER SIGN -FE60 ; [*038F.0020.000F] # SMALL AMPERSAND -FE61 ; [*0388.0020.000F] # SMALL ASTERISK -FE62 ; [*05F6.0020.000F] # SMALL PLUS SIGN +FE59 ; [*0317.0020.000F] # SMALL LEFT PARENTHESIS +FE5A ; [*0318.0020.000F] # SMALL RIGHT PARENTHESIS +FE5B ; [*031B.0020.000F] # SMALL LEFT CURLY BRACKET +FE5C ; [*031C.0020.000F] # SMALL RIGHT CURLY BRACKET +FE5D ; [*0379.0020.000F] # SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; [*037A.0020.000F] # SMALL RIGHT TORTOISE SHELL BRACKET +FE5F ; [*0398.0020.000F] # SMALL NUMBER SIGN +FE60 ; [*0396.0020.000F] # SMALL AMPERSAND +FE61 ; [*038F.0020.000F] # SMALL ASTERISK +FE62 ; [*0616.0020.000F] # SMALL PLUS SIGN FE63 ; [*020D.0020.000F] # SMALL HYPHEN-MINUS -FE64 ; [*05FA.0020.000F] # SMALL LESS-THAN SIGN -FE65 ; [*05FC.0020.000F] # SMALL GREATER-THAN SIGN -FE66 ; [*05FB.0020.000F] # SMALL EQUALS SIGN -FE68 ; [*038E.0020.000F] # SMALL REVERSE SOLIDUS -FE6A ; [*0392.0020.000F] # SMALL PERCENT SIGN -FE6B ; [*0387.0020.000F] # SMALL COMMERCIAL AT +FE64 ; [*061A.0020.000F] # SMALL LESS-THAN SIGN +FE65 ; [*061C.0020.000F] # SMALL GREATER-THAN SIGN +FE66 ; [*061B.0020.000F] # SMALL EQUALS SIGN +FE68 ; [*0395.0020.000F] # SMALL REVERSE SOLIDUS +FE6A ; [*0399.0020.000F] # SMALL PERCENT SIGN +FE6B ; [*038E.0020.000F] # SMALL COMMERCIAL AT FE73 ; [.0000.0000.0000] # ARABIC TAIL FRAGMENT -FF01 ; [*025F.0020.0003] # FULLWIDTH EXCLAMATION MARK -FF02 ; [*0305.0020.0003] # FULLWIDTH QUOTATION MARK -FF03 ; [*0391.0020.0003] # FULLWIDTH NUMBER SIGN -FF05 ; [*0392.0020.0003] # FULLWIDTH PERCENT SIGN -FF06 ; [*038F.0020.0003] # FULLWIDTH AMPERSAND -FF07 ; [*02FE.0020.0003] # FULLWIDTH APOSTROPHE -FF08 ; [*0310.0020.0003] # FULLWIDTH LEFT PARENTHESIS -FF09 ; [*0311.0020.0003] # FULLWIDTH RIGHT PARENTHESIS -FF0A ; [*0388.0020.0003] # FULLWIDTH ASTERISK -FF0B ; [*05F6.0020.0003] # FULLWIDTH PLUS SIGN -FF0C ; [*0221.0020.0003] # FULLWIDTH COMMA +FF01 ; [*0260.0020.0003] # FULLWIDTH EXCLAMATION MARK +FF02 ; [*030C.0020.0003] # FULLWIDTH QUOTATION MARK +FF03 ; [*0398.0020.0003] # FULLWIDTH NUMBER SIGN +FF05 ; [*0399.0020.0003] # FULLWIDTH PERCENT SIGN +FF06 ; [*0396.0020.0003] # FULLWIDTH AMPERSAND +FF07 ; [*0305.0020.0003] # FULLWIDTH APOSTROPHE +FF08 ; [*0317.0020.0003] # FULLWIDTH LEFT PARENTHESIS +FF09 ; [*0318.0020.0003] # FULLWIDTH RIGHT PARENTHESIS +FF0A ; [*038F.0020.0003] # FULLWIDTH ASTERISK +FF0B ; [*0616.0020.0003] # FULLWIDTH PLUS SIGN +FF0C ; [*0222.0020.0003] # FULLWIDTH COMMA FF0D ; [*020D.0020.0003] # FULLWIDTH HYPHEN-MINUS -FF0E ; [*0274.0020.0003] # FULLWIDTH FULL STOP -FF0F ; [*038D.0020.0003] # FULLWIDTH SOLIDUS -FF1A ; [*0238.0020.0003] # FULLWIDTH COLON -FF1B ; [*0233.0020.0003] # FULLWIDTH SEMICOLON -FF1C ; [*05FA.0020.0003] # FULLWIDTH LESS-THAN SIGN -FF1D ; [*05FB.0020.0003] # FULLWIDTH EQUALS SIGN -FF1E ; [*05FC.0020.0003] # FULLWIDTH GREATER-THAN SIGN -FF1F ; [*0264.0020.0003] # FULLWIDTH QUESTION MARK -FF20 ; [*0387.0020.0003] # FULLWIDTH COMMERCIAL AT -FF3B ; [*0312.0020.0003] # FULLWIDTH LEFT SQUARE BRACKET -FF3C ; [*038E.0020.0003] # FULLWIDTH REVERSE SOLIDUS -FF3D ; [*0313.0020.0003] # FULLWIDTH RIGHT SQUARE BRACKET -FF3E ; [*0466.0020.0003] # FULLWIDTH CIRCUMFLEX ACCENT +FF0E ; [*0277.0020.0003] # FULLWIDTH FULL STOP +FF0F ; [*0394.0020.0003] # FULLWIDTH SOLIDUS +FF1A ; [*0239.0020.0003] # FULLWIDTH COLON +FF1B ; [*0234.0020.0003] # FULLWIDTH SEMICOLON +FF1C ; [*061A.0020.0003] # FULLWIDTH LESS-THAN SIGN +FF1D ; [*061B.0020.0003] # FULLWIDTH EQUALS SIGN +FF1E ; [*061C.0020.0003] # FULLWIDTH GREATER-THAN SIGN +FF1F ; [*0266.0020.0003] # FULLWIDTH QUESTION MARK +FF20 ; [*038E.0020.0003] # FULLWIDTH COMMERCIAL AT +FF3B ; [*0319.0020.0003] # FULLWIDTH LEFT SQUARE BRACKET +FF3C ; [*0395.0020.0003] # FULLWIDTH REVERSE SOLIDUS +FF3D ; [*031A.0020.0003] # FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; [*0485.0020.0003] # FULLWIDTH CIRCUMFLEX ACCENT FF3F ; [*020B.0020.0003] # FULLWIDTH LOW LINE -FF40 ; [*0463.0020.0003] # FULLWIDTH GRAVE ACCENT -FF5B ; [*0314.0020.0003] # FULLWIDTH LEFT CURLY BRACKET -FF5C ; [*05FE.0020.0003] # FULLWIDTH VERTICAL LINE -FF5D ; [*0315.0020.0003] # FULLWIDTH RIGHT CURLY BRACKET -FF5E ; [*0600.0020.0003] # FULLWIDTH TILDE -FF5F ; [*0326.0020.0003] # FULLWIDTH LEFT WHITE PARENTHESIS -FF60 ; [*0327.0020.0003] # FULLWIDTH RIGHT WHITE PARENTHESIS -FF61 ; [*0287.0020.0012] # HALFWIDTH IDEOGRAPHIC FULL STOP -FF62 ; [*036C.0020.0012] # HALFWIDTH LEFT CORNER BRACKET -FF63 ; [*036D.0020.0012] # HALFWIDTH RIGHT CORNER BRACKET -FF64 ; [*0230.0020.0012] # HALFWIDTH IDEOGRAPHIC COMMA -FF65 ; [*0220.0020.0012] # HALFWIDTH KATAKANA MIDDLE DOT -FFE2 ; [*05FD.0020.0003] # FULLWIDTH NOT SIGN -FFE3 ; [*0467.0020.0003] # FULLWIDTH MACRON -FFE4 ; [*05FF.0020.0003] # FULLWIDTH BROKEN BAR -FFE8 ; [*07F6.0020.0012] # HALFWIDTH FORMS LIGHT VERTICAL -FFE9 ; [*057C.0020.0012] # HALFWIDTH LEFTWARDS ARROW -FFEA ; [*057E.0020.0012] # HALFWIDTH UPWARDS ARROW -FFEB ; [*057D.0020.0012] # HALFWIDTH RIGHTWARDS ARROW -FFEC ; [*057F.0020.0012] # HALFWIDTH DOWNWARDS ARROW -FFED ; [*0894.0020.0012] # HALFWIDTH BLACK SQUARE -FFEE ; [*08BF.0020.0012] # HALFWIDTH WHITE CIRCLE -FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER -10100 ; [*02F3.0020.0002] # AEGEAN WORD SEPARATOR LINE -10101 ; [*02F4.0020.0002] # AEGEAN WORD SEPARATOR DOT -10102 ; [*02F5.0020.0002] # AEGEAN CHECK MARK -10110 ; [*1A6F.0020.0002] # AEGEAN NUMBER TEN -10111 ; [*1A70.0020.0002] # AEGEAN NUMBER TWENTY -10112 ; [*1A71.0020.0002] # AEGEAN NUMBER THIRTY -10113 ; [*1A72.0020.0002] # AEGEAN NUMBER FORTY -10114 ; [*1A73.0020.0002] # AEGEAN NUMBER FIFTY -10115 ; [*1A74.0020.0002] # AEGEAN NUMBER SIXTY -10116 ; [*1A75.0020.0002] # AEGEAN NUMBER SEVENTY -10117 ; [*1A76.0020.0002] # AEGEAN NUMBER EIGHTY -10118 ; [*1A77.0020.0002] # AEGEAN NUMBER NINETY -10119 ; [*1A78.0020.0002] # AEGEAN NUMBER ONE HUNDRED -1011A ; [*1A79.0020.0002] # AEGEAN NUMBER TWO HUNDRED -1011B ; [*1A7A.0020.0002] # AEGEAN NUMBER THREE HUNDRED -1011C ; [*1A7B.0020.0002] # AEGEAN NUMBER FOUR HUNDRED -1011D ; [*1A7C.0020.0002] # AEGEAN NUMBER FIVE HUNDRED -1011E ; [*1A7D.0020.0002] # AEGEAN NUMBER SIX HUNDRED -1011F ; [*1A7E.0020.0002] # AEGEAN NUMBER SEVEN HUNDRED -10120 ; [*1A7F.0020.0002] # AEGEAN NUMBER EIGHT HUNDRED -10121 ; [*1A80.0020.0002] # AEGEAN NUMBER NINE HUNDRED -10122 ; [*1A81.0020.0002] # AEGEAN NUMBER ONE THOUSAND -10123 ; [*1A82.0020.0002] # AEGEAN NUMBER TWO THOUSAND -10124 ; [*1A83.0020.0002] # AEGEAN NUMBER THREE THOUSAND -10125 ; [*1A84.0020.0002] # AEGEAN NUMBER FOUR THOUSAND -10126 ; [*1A85.0020.0002] # AEGEAN NUMBER FIVE THOUSAND -10127 ; [*1A86.0020.0002] # AEGEAN NUMBER SIX THOUSAND -10128 ; [*1A87.0020.0002] # AEGEAN NUMBER SEVEN THOUSAND -10129 ; [*1A88.0020.0002] # AEGEAN NUMBER EIGHT THOUSAND -1012A ; [*1A89.0020.0002] # AEGEAN NUMBER NINE THOUSAND -1012B ; [*1A8A.0020.0002] # AEGEAN NUMBER TEN THOUSAND -1012C ; [*1A8B.0020.0002] # AEGEAN NUMBER TWENTY THOUSAND -1012D ; [*1A8C.0020.0002] # AEGEAN NUMBER THIRTY THOUSAND -1012E ; [*1A8D.0020.0002] # AEGEAN NUMBER FORTY THOUSAND -1012F ; [*1A8E.0020.0002] # AEGEAN NUMBER FIFTY THOUSAND -10130 ; [*1A8F.0020.0002] # AEGEAN NUMBER SIXTY THOUSAND -10131 ; [*1A90.0020.0002] # AEGEAN NUMBER SEVENTY THOUSAND -10132 ; [*1A91.0020.0002] # AEGEAN NUMBER EIGHTY THOUSAND -10133 ; [*1A92.0020.0002] # AEGEAN NUMBER NINETY THOUSAND -10137 ; [*0F54.0020.0002] # AEGEAN WEIGHT BASE UNIT -10138 ; [*0F55.0020.0002] # AEGEAN WEIGHT FIRST SUBUNIT -10139 ; [*0F56.0020.0002] # AEGEAN WEIGHT SECOND SUBUNIT -1013A ; [*0F57.0020.0002] # AEGEAN WEIGHT THIRD SUBUNIT -1013B ; [*0F58.0020.0002] # AEGEAN WEIGHT FOURTH SUBUNIT -1013C ; [*0F59.0020.0002] # AEGEAN DRY MEASURE FIRST SUBUNIT -1013D ; [*0F5A.0020.0002] # AEGEAN LIQUID MEASURE FIRST SUBUNIT -1013E ; [*0F5B.0020.0002] # AEGEAN MEASURE SECOND SUBUNIT -1013F ; [*0F5C.0020.0002] # AEGEAN MEASURE THIRD SUBUNIT -10140 ; [*1A93.0020.0002] # GREEK ACROPHONIC ATTIC ONE QUARTER -10141 ; [*1A94.0020.0002] # GREEK ACROPHONIC ATTIC ONE HALF -10144 ; [*1A95.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY -10145 ; [*1A96.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED -10146 ; [*1A97.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND -10147 ; [*1A98.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND -10149 ; [*1A99.0020.0002] # GREEK ACROPHONIC ATTIC TEN TALENTS -1014A ; [*1A9A.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY TALENTS -1014B ; [*1A9B.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS -1014C ; [*1A9C.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS -1014D ; [*1A9D.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS -1014E ; [*1A9E.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS -10150 ; [*1A9F.0020.0002] # GREEK ACROPHONIC ATTIC TEN STATERS -10151 ; [*1AA0.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY STATERS -10152 ; [*1AA1.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS -10153 ; [*1AA2.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS -10154 ; [*1AA3.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS -10155 ; [*1AA4.0020.0002] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS -10156 ; [*1AA5.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS -10157 ; [*1AA6.0020.0002] # GREEK ACROPHONIC ATTIC TEN MNAS -10160 ; [*1AA7.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN -10161 ; [*1AA8.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM -10162 ; [*1AA9.0020.0002] # GREEK ACROPHONIC HERMIONIAN TEN -10163 ; [*1AAA.0020.0002] # GREEK ACROPHONIC MESSENIAN TEN -10164 ; [*1AAB.0020.0002] # GREEK ACROPHONIC THESPIAN TEN -10165 ; [*1AAC.0020.0002] # GREEK ACROPHONIC THESPIAN THIRTY -10166 ; [*1AAD.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY -10167 ; [*1AAE.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM -10168 ; [*1AAF.0020.0002] # GREEK ACROPHONIC HERMIONIAN FIFTY -10169 ; [*1AB0.0020.0002] # GREEK ACROPHONIC THESPIAN FIFTY -1016A ; [*1AB1.0020.0002] # GREEK ACROPHONIC THESPIAN ONE HUNDRED -1016B ; [*1AB2.0020.0002] # GREEK ACROPHONIC THESPIAN THREE HUNDRED -1016C ; [*1AB3.0020.0002] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED -1016D ; [*1AB4.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED -1016E ; [*1AB5.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED -1016F ; [*1AB6.0020.0002] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED -10170 ; [*1AB7.0020.0002] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED -10171 ; [*1AB8.0020.0002] # GREEK ACROPHONIC THESPIAN ONE THOUSAND -10172 ; [*1AB9.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND -10174 ; [*1ABA.0020.0002] # GREEK ACROPHONIC STRATIAN FIFTY MNAS -10175 ; [*1ABB.0020.0002] # GREEK ONE HALF SIGN -10176 ; [*1ABC.0020.0002] # GREEK ONE HALF SIGN ALTERNATE FORM -10177 ; [*1ABD.0020.0002] # GREEK TWO THIRDS SIGN -10178 ; [*1ABE.0020.0002] # GREEK THREE QUARTERS SIGN -10179 ; [*0F5D.0020.0002] # GREEK YEAR SIGN -1017A ; [*0F5E.0020.0002] # GREEK TALENT SIGN -1017B ; [*0F5F.0020.0002] # GREEK DRACHMA SIGN -1017C ; [*0F60.0020.0002] # GREEK OBOL SIGN -1017D ; [*0F61.0020.0002] # GREEK TWO OBOLS SIGN -1017E ; [*0F62.0020.0002] # GREEK THREE OBOLS SIGN -1017F ; [*0F63.0020.0002] # GREEK FOUR OBOLS SIGN -10180 ; [*0F64.0020.0002] # GREEK FIVE OBOLS SIGN -10181 ; [*0F65.0020.0002] # GREEK METRETES SIGN -10182 ; [*0F66.0020.0002] # GREEK KYATHOS BASE SIGN -10183 ; [*0F67.0020.0002] # GREEK LITRA SIGN -10184 ; [*0F68.0020.0002] # GREEK OUNKIA SIGN -10185 ; [*0F69.0020.0002] # GREEK XESTES SIGN -10186 ; [*0F6A.0020.0002] # GREEK ARTABE SIGN -10187 ; [*0F6B.0020.0002] # GREEK AROURA SIGN -10188 ; [*0F6C.0020.0002] # GREEK GRAMMA SIGN -10189 ; [*0F6D.0020.0002] # GREEK TRYBLION BASE SIGN -1018B ; [*1ABF.0020.0002] # GREEK ONE QUARTER SIGN -1018C ; [*0F6E.0020.0002] # GREEK SINUSOID SIGN -10190 ; [*0F6F.0020.0002] # ROMAN SEXTANS SIGN -10191 ; [*0F70.0020.0002] # ROMAN UNCIA SIGN -10192 ; [*0F71.0020.0002] # ROMAN SEMUNCIA SIGN -10193 ; [*0F72.0020.0002] # ROMAN SEXTULA SIGN -10194 ; [*0F73.0020.0002] # ROMAN DIMIDIA SEXTULA SIGN -10195 ; [*0F74.0020.0002] # ROMAN SILIQUA SIGN -10196 ; [*0F75.0020.0002] # ROMAN DENARIUS SIGN -10197 ; [*0F76.0020.0002] # ROMAN QUINARIUS SIGN -10198 ; [*0F77.0020.0002] # ROMAN SESTERTIUS SIGN -10199 ; [*0F78.0020.0002] # ROMAN DUPONDIUS SIGN -1019A ; [*0F79.0020.0002] # ROMAN AS SIGN -1019B ; [*0F7A.0020.0002] # ROMAN CENTURIAL SIGN -101A0 ; [*0F7B.0020.0002] # GREEK SYMBOL TAU RHO -101D0 ; [*0F7C.0020.0002] # PHAISTOS DISC SIGN PEDESTRIAN -101D1 ; [*0F7D.0020.0002] # PHAISTOS DISC SIGN PLUMED HEAD -101D2 ; [*0F7E.0020.0002] # PHAISTOS DISC SIGN TATTOOED HEAD -101D3 ; [*0F7F.0020.0002] # PHAISTOS DISC SIGN CAPTIVE -101D4 ; [*0F80.0020.0002] # PHAISTOS DISC SIGN CHILD -101D5 ; [*0F81.0020.0002] # PHAISTOS DISC SIGN WOMAN -101D6 ; [*0F82.0020.0002] # PHAISTOS DISC SIGN HELMET -101D7 ; [*0F83.0020.0002] # PHAISTOS DISC SIGN GAUNTLET -101D8 ; [*0F84.0020.0002] # PHAISTOS DISC SIGN TIARA -101D9 ; [*0F85.0020.0002] # PHAISTOS DISC SIGN ARROW -101DA ; [*0F86.0020.0002] # PHAISTOS DISC SIGN BOW -101DB ; [*0F87.0020.0002] # PHAISTOS DISC SIGN SHIELD -101DC ; [*0F88.0020.0002] # PHAISTOS DISC SIGN CLUB -101DD ; [*0F89.0020.0002] # PHAISTOS DISC SIGN MANACLES -101DE ; [*0F8A.0020.0002] # PHAISTOS DISC SIGN MATTOCK -101DF ; [*0F8B.0020.0002] # PHAISTOS DISC SIGN SAW -101E0 ; [*0F8C.0020.0002] # PHAISTOS DISC SIGN LID -101E1 ; [*0F8D.0020.0002] # PHAISTOS DISC SIGN BOOMERANG -101E2 ; [*0F8E.0020.0002] # PHAISTOS DISC SIGN CARPENTRY PLANE -101E3 ; [*0F8F.0020.0002] # PHAISTOS DISC SIGN DOLIUM -101E4 ; [*0F90.0020.0002] # PHAISTOS DISC SIGN COMB -101E5 ; [*0F91.0020.0002] # PHAISTOS DISC SIGN SLING -101E6 ; [*0F92.0020.0002] # PHAISTOS DISC SIGN COLUMN -101E7 ; [*0F93.0020.0002] # PHAISTOS DISC SIGN BEEHIVE -101E8 ; [*0F94.0020.0002] # PHAISTOS DISC SIGN SHIP -101E9 ; [*0F95.0020.0002] # PHAISTOS DISC SIGN HORN -101EA ; [*0F96.0020.0002] # PHAISTOS DISC SIGN HIDE -101EB ; [*0F97.0020.0002] # PHAISTOS DISC SIGN BULLS LEG -101EC ; [*0F98.0020.0002] # PHAISTOS DISC SIGN CAT -101ED ; [*0F99.0020.0002] # PHAISTOS DISC SIGN RAM -101EE ; [*0F9A.0020.0002] # PHAISTOS DISC SIGN EAGLE -101EF ; [*0F9B.0020.0002] # PHAISTOS DISC SIGN DOVE -101F0 ; [*0F9C.0020.0002] # PHAISTOS DISC SIGN TUNNY -101F1 ; [*0F9D.0020.0002] # PHAISTOS DISC SIGN BEE -101F2 ; [*0F9E.0020.0002] # PHAISTOS DISC SIGN PLANE TREE -101F3 ; [*0F9F.0020.0002] # PHAISTOS DISC SIGN VINE -101F4 ; [*0FA0.0020.0002] # PHAISTOS DISC SIGN PAPYRUS -101F5 ; [*0FA1.0020.0002] # PHAISTOS DISC SIGN ROSETTE -101F6 ; [*0FA2.0020.0002] # PHAISTOS DISC SIGN LILY -101F7 ; [*0FA3.0020.0002] # PHAISTOS DISC SIGN OX BACK -101F8 ; [*0FA4.0020.0002] # PHAISTOS DISC SIGN FLUTE -101F9 ; [*0FA5.0020.0002] # PHAISTOS DISC SIGN GRATER -101FA ; [*0FA6.0020.0002] # PHAISTOS DISC SIGN STRAINER -101FB ; [*0FA7.0020.0002] # PHAISTOS DISC SIGN SMALL AXE -101FC ; [*0FA8.0020.0002] # PHAISTOS DISC SIGN WAVY BAND +FF40 ; [*0482.0020.0003] # FULLWIDTH GRAVE ACCENT +FF5B ; [*031B.0020.0003] # FULLWIDTH LEFT CURLY BRACKET +FF5C ; [*061E.0020.0003] # FULLWIDTH VERTICAL LINE +FF5D ; [*031C.0020.0003] # FULLWIDTH RIGHT CURLY BRACKET +FF5E ; [*0620.0020.0003] # FULLWIDTH TILDE +FF5F ; [*032D.0020.0003] # FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; [*032E.0020.0003] # FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; [*028A.0020.0012] # HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; [*0373.0020.0012] # HALFWIDTH LEFT CORNER BRACKET +FF63 ; [*0374.0020.0012] # HALFWIDTH RIGHT CORNER BRACKET +FF64 ; [*0231.0020.0012] # HALFWIDTH IDEOGRAPHIC COMMA +FF65 ; [*0221.0020.0012] # HALFWIDTH KATAKANA MIDDLE DOT +FFE2 ; [*061D.0020.0003] # FULLWIDTH NOT SIGN +FFE3 ; [*0486.0020.0003] # FULLWIDTH MACRON +FFE4 ; [*061F.0020.0003] # FULLWIDTH BROKEN BAR +FFE8 ; [*081A.0020.0012] # HALFWIDTH FORMS LIGHT VERTICAL +FFE9 ; [*059C.0020.0012] # HALFWIDTH LEFTWARDS ARROW +FFEA ; [*059E.0020.0012] # HALFWIDTH UPWARDS ARROW +FFEB ; [*059D.0020.0012] # HALFWIDTH RIGHTWARDS ARROW +FFEC ; [*059F.0020.0012] # HALFWIDTH DOWNWARDS ARROW +FFED ; [*08B8.0020.0012] # HALFWIDTH BLACK SQUARE +FFEE ; [*08E3.0020.0012] # HALFWIDTH WHITE CIRCLE +FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER +10100 ; [*02FA.0020.0002] # AEGEAN WORD SEPARATOR LINE +10101 ; [*02FB.0020.0002] # AEGEAN WORD SEPARATOR DOT +10102 ; [*02FC.0020.0002] # AEGEAN CHECK MARK +10110 ; [*1AE9.0020.0002] # AEGEAN NUMBER TEN +10111 ; [*1AEA.0020.0002] # AEGEAN NUMBER TWENTY +10112 ; [*1AEB.0020.0002] # AEGEAN NUMBER THIRTY +10113 ; [*1AEC.0020.0002] # AEGEAN NUMBER FORTY +10114 ; [*1AED.0020.0002] # AEGEAN NUMBER FIFTY +10115 ; [*1AEE.0020.0002] # AEGEAN NUMBER SIXTY +10116 ; [*1AEF.0020.0002] # AEGEAN NUMBER SEVENTY +10117 ; [*1AF0.0020.0002] # AEGEAN NUMBER EIGHTY +10118 ; [*1AF1.0020.0002] # AEGEAN NUMBER NINETY +10119 ; [*1AF2.0020.0002] # AEGEAN NUMBER ONE HUNDRED +1011A ; [*1AF3.0020.0002] # AEGEAN NUMBER TWO HUNDRED +1011B ; [*1AF4.0020.0002] # AEGEAN NUMBER THREE HUNDRED +1011C ; [*1AF5.0020.0002] # AEGEAN NUMBER FOUR HUNDRED +1011D ; [*1AF6.0020.0002] # AEGEAN NUMBER FIVE HUNDRED +1011E ; [*1AF7.0020.0002] # AEGEAN NUMBER SIX HUNDRED +1011F ; [*1AF8.0020.0002] # AEGEAN NUMBER SEVEN HUNDRED +10120 ; [*1AF9.0020.0002] # AEGEAN NUMBER EIGHT HUNDRED +10121 ; [*1AFA.0020.0002] # AEGEAN NUMBER NINE HUNDRED +10122 ; [*1AFB.0020.0002] # AEGEAN NUMBER ONE THOUSAND +10123 ; [*1AFC.0020.0002] # AEGEAN NUMBER TWO THOUSAND +10124 ; [*1AFD.0020.0002] # AEGEAN NUMBER THREE THOUSAND +10125 ; [*1AFE.0020.0002] # AEGEAN NUMBER FOUR THOUSAND +10126 ; [*1AFF.0020.0002] # AEGEAN NUMBER FIVE THOUSAND +10127 ; [*1B00.0020.0002] # AEGEAN NUMBER SIX THOUSAND +10128 ; [*1B01.0020.0002] # AEGEAN NUMBER SEVEN THOUSAND +10129 ; [*1B02.0020.0002] # AEGEAN NUMBER EIGHT THOUSAND +1012A ; [*1B03.0020.0002] # AEGEAN NUMBER NINE THOUSAND +1012B ; [*1B04.0020.0002] # AEGEAN NUMBER TEN THOUSAND +1012C ; [*1B05.0020.0002] # AEGEAN NUMBER TWENTY THOUSAND +1012D ; [*1B06.0020.0002] # AEGEAN NUMBER THIRTY THOUSAND +1012E ; [*1B07.0020.0002] # AEGEAN NUMBER FORTY THOUSAND +1012F ; [*1B08.0020.0002] # AEGEAN NUMBER FIFTY THOUSAND +10130 ; [*1B09.0020.0002] # AEGEAN NUMBER SIXTY THOUSAND +10131 ; [*1B0A.0020.0002] # AEGEAN NUMBER SEVENTY THOUSAND +10132 ; [*1B0B.0020.0002] # AEGEAN NUMBER EIGHTY THOUSAND +10133 ; [*1B0C.0020.0002] # AEGEAN NUMBER NINETY THOUSAND +10137 ; [*0F78.0020.0002] # AEGEAN WEIGHT BASE UNIT +10138 ; [*0F79.0020.0002] # AEGEAN WEIGHT FIRST SUBUNIT +10139 ; [*0F7A.0020.0002] # AEGEAN WEIGHT SECOND SUBUNIT +1013A ; [*0F7B.0020.0002] # AEGEAN WEIGHT THIRD SUBUNIT +1013B ; [*0F7C.0020.0002] # AEGEAN WEIGHT FOURTH SUBUNIT +1013C ; [*0F7D.0020.0002] # AEGEAN DRY MEASURE FIRST SUBUNIT +1013D ; [*0F7E.0020.0002] # AEGEAN LIQUID MEASURE FIRST SUBUNIT +1013E ; [*0F7F.0020.0002] # AEGEAN MEASURE SECOND SUBUNIT +1013F ; [*0F80.0020.0002] # AEGEAN MEASURE THIRD SUBUNIT +10140 ; [*1B0D.0020.0002] # GREEK ACROPHONIC ATTIC ONE QUARTER +10141 ; [*1B0E.0020.0002] # GREEK ACROPHONIC ATTIC ONE HALF +10144 ; [*1B0F.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY +10145 ; [*1B10.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED +10146 ; [*1B11.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND +10147 ; [*1B12.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND +10149 ; [*1B13.0020.0002] # GREEK ACROPHONIC ATTIC TEN TALENTS +1014A ; [*1B14.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY TALENTS +1014B ; [*1B15.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS +1014C ; [*1B16.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS +1014D ; [*1B17.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS +1014E ; [*1B18.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS +10150 ; [*1B19.0020.0002] # GREEK ACROPHONIC ATTIC TEN STATERS +10151 ; [*1B1A.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY STATERS +10152 ; [*1B1B.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS +10153 ; [*1B1C.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS +10154 ; [*1B1D.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS +10155 ; [*1B1E.0020.0002] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS +10156 ; [*1B1F.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS +10157 ; [*1B20.0020.0002] # GREEK ACROPHONIC ATTIC TEN MNAS +10160 ; [*1B21.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN +10161 ; [*1B22.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM +10162 ; [*1B23.0020.0002] # GREEK ACROPHONIC HERMIONIAN TEN +10163 ; [*1B24.0020.0002] # GREEK ACROPHONIC MESSENIAN TEN +10164 ; [*1B25.0020.0002] # GREEK ACROPHONIC THESPIAN TEN +10165 ; [*1B26.0020.0002] # GREEK ACROPHONIC THESPIAN THIRTY +10166 ; [*1B27.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY +10167 ; [*1B28.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM +10168 ; [*1B29.0020.0002] # GREEK ACROPHONIC HERMIONIAN FIFTY +10169 ; [*1B2A.0020.0002] # GREEK ACROPHONIC THESPIAN FIFTY +1016A ; [*1B2B.0020.0002] # GREEK ACROPHONIC THESPIAN ONE HUNDRED +1016B ; [*1B2C.0020.0002] # GREEK ACROPHONIC THESPIAN THREE HUNDRED +1016C ; [*1B2D.0020.0002] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED +1016D ; [*1B2E.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED +1016E ; [*1B2F.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED +1016F ; [*1B30.0020.0002] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED +10170 ; [*1B31.0020.0002] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED +10171 ; [*1B32.0020.0002] # GREEK ACROPHONIC THESPIAN ONE THOUSAND +10172 ; [*1B33.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND +10174 ; [*1B34.0020.0002] # GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175 ; [*1B35.0020.0002] # GREEK ONE HALF SIGN +10176 ; [*1B36.0020.0002] # GREEK ONE HALF SIGN ALTERNATE FORM +10177 ; [*1B37.0020.0002] # GREEK TWO THIRDS SIGN +10178 ; [*1B38.0020.0002] # GREEK THREE QUARTERS SIGN +10179 ; [*0F81.0020.0002] # GREEK YEAR SIGN +1017A ; [*0F82.0020.0002] # GREEK TALENT SIGN +1017B ; [*0F83.0020.0002] # GREEK DRACHMA SIGN +1017C ; [*0F84.0020.0002] # GREEK OBOL SIGN +1017D ; [*0F85.0020.0002] # GREEK TWO OBOLS SIGN +1017E ; [*0F86.0020.0002] # GREEK THREE OBOLS SIGN +1017F ; [*0F87.0020.0002] # GREEK FOUR OBOLS SIGN +10180 ; [*0F88.0020.0002] # GREEK FIVE OBOLS SIGN +10181 ; [*0F89.0020.0002] # GREEK METRETES SIGN +10182 ; [*0F8A.0020.0002] # GREEK KYATHOS BASE SIGN +10183 ; [*0F8B.0020.0002] # GREEK LITRA SIGN +10184 ; [*0F8C.0020.0002] # GREEK OUNKIA SIGN +10185 ; [*0F8D.0020.0002] # GREEK XESTES SIGN +10186 ; [*0F8E.0020.0002] # GREEK ARTABE SIGN +10187 ; [*0F8F.0020.0002] # GREEK AROURA SIGN +10188 ; [*0F90.0020.0002] # GREEK GRAMMA SIGN +10189 ; [*0F91.0020.0002] # GREEK TRYBLION BASE SIGN +1018B ; [*1B39.0020.0002] # GREEK ONE QUARTER SIGN +1018C ; [*0F92.0020.0002] # GREEK SINUSOID SIGN +1018D ; [*0F93.0020.0002] # GREEK INDICTION SIGN +1018E ; [*0F94.0020.0002] # NOMISMA SIGN +10190 ; [*0F95.0020.0002] # ROMAN SEXTANS SIGN +10191 ; [*0F96.0020.0002] # ROMAN UNCIA SIGN +10192 ; [*0F97.0020.0002] # ROMAN SEMUNCIA SIGN +10193 ; [*0F98.0020.0002] # ROMAN SEXTULA SIGN +10194 ; [*0F99.0020.0002] # ROMAN DIMIDIA SEXTULA SIGN +10195 ; [*0F9A.0020.0002] # ROMAN SILIQUA SIGN +10196 ; [*0F9B.0020.0002] # ROMAN DENARIUS SIGN +10197 ; [*0F9C.0020.0002] # ROMAN QUINARIUS SIGN +10198 ; [*0F9D.0020.0002] # ROMAN SESTERTIUS SIGN +10199 ; [*0F9E.0020.0002] # ROMAN DUPONDIUS SIGN +1019A ; [*0F9F.0020.0002] # ROMAN AS SIGN +1019B ; [*0FA0.0020.0002] # ROMAN CENTURIAL SIGN +101A0 ; [*0FA1.0020.0002] # GREEK SYMBOL TAU RHO +101D0 ; [*0FA2.0020.0002] # PHAISTOS DISC SIGN PEDESTRIAN +101D1 ; [*0FA3.0020.0002] # PHAISTOS DISC SIGN PLUMED HEAD +101D2 ; [*0FA4.0020.0002] # PHAISTOS DISC SIGN TATTOOED HEAD +101D3 ; [*0FA5.0020.0002] # PHAISTOS DISC SIGN CAPTIVE +101D4 ; [*0FA6.0020.0002] # PHAISTOS DISC SIGN CHILD +101D5 ; [*0FA7.0020.0002] # PHAISTOS DISC SIGN WOMAN +101D6 ; [*0FA8.0020.0002] # PHAISTOS DISC SIGN HELMET +101D7 ; [*0FA9.0020.0002] # PHAISTOS DISC SIGN GAUNTLET +101D8 ; [*0FAA.0020.0002] # PHAISTOS DISC SIGN TIARA +101D9 ; [*0FAB.0020.0002] # PHAISTOS DISC SIGN ARROW +101DA ; [*0FAC.0020.0002] # PHAISTOS DISC SIGN BOW +101DB ; [*0FAD.0020.0002] # PHAISTOS DISC SIGN SHIELD +101DC ; [*0FAE.0020.0002] # PHAISTOS DISC SIGN CLUB +101DD ; [*0FAF.0020.0002] # PHAISTOS DISC SIGN MANACLES +101DE ; [*0FB0.0020.0002] # PHAISTOS DISC SIGN MATTOCK +101DF ; [*0FB1.0020.0002] # PHAISTOS DISC SIGN SAW +101E0 ; [*0FB2.0020.0002] # PHAISTOS DISC SIGN LID +101E1 ; [*0FB3.0020.0002] # PHAISTOS DISC SIGN BOOMERANG +101E2 ; [*0FB4.0020.0002] # PHAISTOS DISC SIGN CARPENTRY PLANE +101E3 ; [*0FB5.0020.0002] # PHAISTOS DISC SIGN DOLIUM +101E4 ; [*0FB6.0020.0002] # PHAISTOS DISC SIGN COMB +101E5 ; [*0FB7.0020.0002] # PHAISTOS DISC SIGN SLING +101E6 ; [*0FB8.0020.0002] # PHAISTOS DISC SIGN COLUMN +101E7 ; [*0FB9.0020.0002] # PHAISTOS DISC SIGN BEEHIVE +101E8 ; [*0FBA.0020.0002] # PHAISTOS DISC SIGN SHIP +101E9 ; [*0FBB.0020.0002] # PHAISTOS DISC SIGN HORN +101EA ; [*0FBC.0020.0002] # PHAISTOS DISC SIGN HIDE +101EB ; [*0FBD.0020.0002] # PHAISTOS DISC SIGN BULLS LEG +101EC ; [*0FBE.0020.0002] # PHAISTOS DISC SIGN CAT +101ED ; [*0FBF.0020.0002] # PHAISTOS DISC SIGN RAM +101EE ; [*0FC0.0020.0002] # PHAISTOS DISC SIGN EAGLE +101EF ; [*0FC1.0020.0002] # PHAISTOS DISC SIGN DOVE +101F0 ; [*0FC2.0020.0002] # PHAISTOS DISC SIGN TUNNY +101F1 ; [*0FC3.0020.0002] # PHAISTOS DISC SIGN BEE +101F2 ; [*0FC4.0020.0002] # PHAISTOS DISC SIGN PLANE TREE +101F3 ; [*0FC5.0020.0002] # PHAISTOS DISC SIGN VINE +101F4 ; [*0FC6.0020.0002] # PHAISTOS DISC SIGN PAPYRUS +101F5 ; [*0FC7.0020.0002] # PHAISTOS DISC SIGN ROSETTE +101F6 ; [*0FC8.0020.0002] # PHAISTOS DISC SIGN LILY +101F7 ; [*0FC9.0020.0002] # PHAISTOS DISC SIGN OX BACK +101F8 ; [*0FCA.0020.0002] # PHAISTOS DISC SIGN FLUTE +101F9 ; [*0FCB.0020.0002] # PHAISTOS DISC SIGN GRATER +101FA ; [*0FCC.0020.0002] # PHAISTOS DISC SIGN STRAINER +101FB ; [*0FCD.0020.0002] # PHAISTOS DISC SIGN SMALL AXE +101FC ; [*0FCE.0020.0002] # PHAISTOS DISC SIGN WAVY BAND 102E0 ; [.0000.0000.0000] # COPTIC EPACT THOUSANDS MARK -102EA ; [*1AC0.0020.0002] # COPTIC EPACT NUMBER TEN -102EB ; [*1AC1.0020.0002] # COPTIC EPACT NUMBER TWENTY -102EC ; [*1AC2.0020.0002] # COPTIC EPACT NUMBER THIRTY -102ED ; [*1AC3.0020.0002] # COPTIC EPACT NUMBER FORTY -102EE ; [*1AC4.0020.0002] # COPTIC EPACT NUMBER FIFTY -102EF ; [*1AC5.0020.0002] # COPTIC EPACT NUMBER SIXTY -102F0 ; [*1AC6.0020.0002] # COPTIC EPACT NUMBER SEVENTY -102F1 ; [*1AC7.0020.0002] # COPTIC EPACT NUMBER EIGHTY -102F2 ; [*1AC8.0020.0002] # COPTIC EPACT NUMBER NINETY -102F3 ; [*1AC9.0020.0002] # COPTIC EPACT NUMBER ONE HUNDRED -102F4 ; [*1ACA.0020.0002] # COPTIC EPACT NUMBER TWO HUNDRED -102F5 ; [*1ACB.0020.0002] # COPTIC EPACT NUMBER THREE HUNDRED -102F6 ; [*1ACC.0020.0002] # COPTIC EPACT NUMBER FOUR HUNDRED -102F7 ; [*1ACD.0020.0002] # COPTIC EPACT NUMBER FIVE HUNDRED -102F8 ; [*1ACE.0020.0002] # COPTIC EPACT NUMBER SIX HUNDRED -102F9 ; [*1ACF.0020.0002] # COPTIC EPACT NUMBER SEVEN HUNDRED -102FA ; [*1AD0.0020.0002] # COPTIC EPACT NUMBER EIGHT HUNDRED -102FB ; [*1AD1.0020.0002] # COPTIC EPACT NUMBER NINE HUNDRED -10322 ; [*1A69.0020.0002] # OLD ITALIC NUMERAL TEN -10323 ; [*1A6A.0020.0002] # OLD ITALIC NUMERAL FIFTY -1039F ; [*02F6.0020.0002] # UGARITIC WORD DIVIDER -103D0 ; [*02F7.0020.0002] # OLD PERSIAN WORD DIVIDER -103D3 ; [*1AD2.0020.0002] # OLD PERSIAN NUMBER TEN -103D4 ; [*1AD3.0020.0002] # OLD PERSIAN NUMBER TWENTY -103D5 ; [*1AD4.0020.0002] # OLD PERSIAN NUMBER HUNDRED -1056F ; [*041B.0020.0002] # CAUCASIAN ALBANIAN CITATION MARK -10857 ; [*02D2.0020.0002] # IMPERIAL ARAMAIC SECTION SIGN -1085B ; [*1AE4.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN -1085C ; [*1AE5.0020.0002] # IMPERIAL ARAMAIC NUMBER TWENTY -1085D ; [*1AE6.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE HUNDRED -1085E ; [*1AE7.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE THOUSAND -1085F ; [*1AE8.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN THOUSAND -10877 ; [*0FA9.0020.0002] # PALMYRENE LEFT-POINTING FLEURON -10878 ; [*0FAA.0020.0002] # PALMYRENE RIGHT-POINTING FLEURON -1087E ; [*1AD5.0020.0002] # PALMYRENE NUMBER TEN -1087F ; [*1AD6.0020.0002] # PALMYRENE NUMBER TWENTY -108AD ; [*1AD7.0020.0002] # NABATAEAN NUMBER TEN -108AE ; [*1AD8.0020.0002] # NABATAEAN NUMBER TWENTY -108AF ; [*1AD9.0020.0002] # NABATAEAN NUMBER ONE HUNDRED -108FD ; [*1ADA.0020.0002] # HATRAN NUMBER TEN -108FE ; [*1ADB.0020.0002] # HATRAN NUMBER TWENTY -108FF ; [*1ADC.0020.0002] # HATRAN NUMBER ONE HUNDRED -10917 ; [*1AE1.0020.0002] # PHOENICIAN NUMBER TEN -10918 ; [*1AE2.0020.0002] # PHOENICIAN NUMBER TWENTY -10919 ; [*1AE3.0020.0002] # PHOENICIAN NUMBER ONE HUNDRED -1091F ; [*02F8.0020.0002] # PHOENICIAN WORD SEPARATOR -1093F ; [*02F2.0020.0002] # LYDIAN TRIANGULAR MARK -109BC ; [*1B59.0020.0002] # MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS -109BD ; [*1B4E.0020.0002] # MEROITIC CURSIVE FRACTION ONE HALF -109C9 ; [*1B23.0020.0002] # MEROITIC CURSIVE NUMBER TEN -109CA ; [*1B24.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY -109CB ; [*1B25.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY -109CC ; [*1B26.0020.0002] # MEROITIC CURSIVE NUMBER FORTY -109CD ; [*1B27.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY -109CE ; [*1B28.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY -109CF ; [*1B29.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY -109D2 ; [*1B2A.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED -109D3 ; [*1B2B.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED -109D4 ; [*1B2C.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED -109D5 ; [*1B2D.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED -109D6 ; [*1B2E.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED -109D7 ; [*1B2F.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED -109D8 ; [*1B30.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED -109D9 ; [*1B31.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED -109DA ; [*1B32.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED -109DB ; [*1B33.0020.0002] # MEROITIC CURSIVE NUMBER ONE THOUSAND -109DC ; [*1B34.0020.0002] # MEROITIC CURSIVE NUMBER TWO THOUSAND -109DD ; [*1B35.0020.0002] # MEROITIC CURSIVE NUMBER THREE THOUSAND -109DE ; [*1B36.0020.0002] # MEROITIC CURSIVE NUMBER FOUR THOUSAND -109DF ; [*1B37.0020.0002] # MEROITIC CURSIVE NUMBER FIVE THOUSAND -109E0 ; [*1B38.0020.0002] # MEROITIC CURSIVE NUMBER SIX THOUSAND -109E1 ; [*1B39.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN THOUSAND -109E2 ; [*1B3A.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT THOUSAND -109E3 ; [*1B3B.0020.0002] # MEROITIC CURSIVE NUMBER NINE THOUSAND -109E4 ; [*1B3C.0020.0002] # MEROITIC CURSIVE NUMBER TEN THOUSAND -109E5 ; [*1B3D.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY THOUSAND -109E6 ; [*1B3E.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY THOUSAND -109E7 ; [*1B3F.0020.0002] # MEROITIC CURSIVE NUMBER FORTY THOUSAND -109E8 ; [*1B40.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY THOUSAND -109E9 ; [*1B41.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY THOUSAND -109EA ; [*1B42.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY THOUSAND -109EB ; [*1B43.0020.0002] # MEROITIC CURSIVE NUMBER EIGHTY THOUSAND -109EC ; [*1B44.0020.0002] # MEROITIC CURSIVE NUMBER NINETY THOUSAND -109ED ; [*1B45.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND -109EE ; [*1B46.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND -109EF ; [*1B47.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND -109F0 ; [*1B48.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND -109F1 ; [*1B49.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND -109F2 ; [*1B4A.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND -109F3 ; [*1B4B.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND -109F4 ; [*1B4C.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND -109F5 ; [*1B4D.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND -109F6 ; [*1B4F.0020.0002] # MEROITIC CURSIVE FRACTION ONE TWELFTH -109F7 ; [*1B50.0020.0002] # MEROITIC CURSIVE FRACTION TWO TWELFTHS -109F8 ; [*1B51.0020.0002] # MEROITIC CURSIVE FRACTION THREE TWELFTHS -109F9 ; [*1B52.0020.0002] # MEROITIC CURSIVE FRACTION FOUR TWELFTHS -109FA ; [*1B53.0020.0002] # MEROITIC CURSIVE FRACTION FIVE TWELFTHS -109FB ; [*1B54.0020.0002] # MEROITIC CURSIVE FRACTION SIX TWELFTHS -109FC ; [*1B55.0020.0002] # MEROITIC CURSIVE FRACTION SEVEN TWELFTHS -109FD ; [*1B56.0020.0002] # MEROITIC CURSIVE FRACTION EIGHT TWELFTHS -109FE ; [*1B57.0020.0002] # MEROITIC CURSIVE FRACTION NINE TWELFTHS -109FF ; [*1B58.0020.0002] # MEROITIC CURSIVE FRACTION TEN TWELFTHS -10A44 ; [*1B04.0020.0002] # KHAROSHTHI NUMBER TEN -10A45 ; [*1B05.0020.0002] # KHAROSHTHI NUMBER TWENTY -10A46 ; [*1B06.0020.0002] # KHAROSHTHI NUMBER ONE HUNDRED -10A47 ; [*1B07.0020.0002] # KHAROSHTHI NUMBER ONE THOUSAND -10A50 ; [*0421.0020.0002] # KHAROSHTHI PUNCTUATION DOT -10A51 ; [*0422.0020.0002] # KHAROSHTHI PUNCTUATION SMALL CIRCLE -10A52 ; [*0423.0020.0002] # KHAROSHTHI PUNCTUATION CIRCLE -10A53 ; [*0424.0020.0002] # KHAROSHTHI PUNCTUATION CRESCENT BAR -10A54 ; [*0425.0020.0002] # KHAROSHTHI PUNCTUATION MANGALAM -10A55 ; [*0426.0020.0002] # KHAROSHTHI PUNCTUATION LOTUS -10A56 ; [*02A7.0020.0002] # KHAROSHTHI PUNCTUATION DANDA -10A57 ; [*02A8.0020.0002] # KHAROSHTHI PUNCTUATION DOUBLE DANDA -10A58 ; [*0427.0020.0002] # KHAROSHTHI PUNCTUATION LINES -10A7E ; [*1ADD.0020.0002] # OLD SOUTH ARABIAN NUMBER FIFTY -10A7F ; [*1ADE.0020.0002] # OLD SOUTH ARABIAN NUMERIC INDICATOR -10A9E ; [*1ADF.0020.0002] # OLD NORTH ARABIAN NUMBER TEN -10A9F ; [*1AE0.0020.0002] # OLD NORTH ARABIAN NUMBER TWENTY -10AED ; [*1AE9.0020.0002] # MANICHAEAN NUMBER TEN -10AEE ; [*1AEA.0020.0002] # MANICHAEAN NUMBER TWENTY -10AEF ; [*1AEB.0020.0002] # MANICHAEAN NUMBER ONE HUNDRED -10AF0 ; [*0429.0020.0002] # MANICHAEAN PUNCTUATION STAR -10AF1 ; [*042A.0020.0002] # MANICHAEAN PUNCTUATION FLEURON -10AF2 ; [*042B.0020.0002] # MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT -10AF3 ; [*042C.0020.0002] # MANICHAEAN PUNCTUATION DOT WITHIN DOT -10AF4 ; [*042D.0020.0002] # MANICHAEAN PUNCTUATION DOT -10AF5 ; [*042E.0020.0002] # MANICHAEAN PUNCTUATION TWO DOTS -10AF6 ; [*042F.0020.0002] # MANICHAEAN PUNCTUATION LINE FILLER -10B39 ; [*0428.0020.0002] # AVESTAN ABBREVIATION MARK -10B3A ; [*02D3.0020.0002] # TINY TWO DOTS OVER ONE DOT PUNCTUATION -10B3B ; [*02D4.0020.0002] # SMALL TWO DOTS OVER ONE DOT PUNCTUATION -10B3C ; [*02D5.0020.0002] # LARGE TWO DOTS OVER ONE DOT PUNCTUATION -10B3D ; [*02D6.0020.0002] # LARGE ONE DOT OVER TWO DOTS PUNCTUATION -10B3E ; [*02D7.0020.0002] # LARGE TWO RINGS OVER ONE RING PUNCTUATION -10B3F ; [*02D8.0020.0002] # LARGE ONE RING OVER TWO RINGS PUNCTUATION -10B5C ; [*1AEC.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TEN -10B5D ; [*1AED.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWENTY -10B5E ; [*1AEE.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED -10B5F ; [*1AEF.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND -10B7C ; [*1AF0.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TEN -10B7D ; [*1AF1.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWENTY -10B7E ; [*1AF2.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED -10B7F ; [*1AF3.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND -10B99 ; [*0430.0020.0002] # PSALTER PAHLAVI SECTION MARK -10B9A ; [*0431.0020.0002] # PSALTER PAHLAVI TURNED SECTION MARK -10B9B ; [*0432.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH CROSS -10B9C ; [*0433.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH DOT -10BAD ; [*1AF4.0020.0002] # PSALTER PAHLAVI NUMBER TEN -10BAE ; [*1AF5.0020.0002] # PSALTER PAHLAVI NUMBER TWENTY -10BAF ; [*1AF6.0020.0002] # PSALTER PAHLAVI NUMBER ONE HUNDRED -10CFC ; [*1A6B.0020.0002] # OLD HUNGARIAN NUMBER TEN -10CFD ; [*1A6C.0020.0002] # OLD HUNGARIAN NUMBER FIFTY -10CFE ; [*1A6D.0020.0002] # OLD HUNGARIAN NUMBER ONE HUNDRED -10CFF ; [*1A6E.0020.0002] # OLD HUNGARIAN NUMBER ONE THOUSAND -10E69 ; [*1A52.0020.0002] # RUMI NUMBER TEN -10E6A ; [*1A53.0020.0002] # RUMI NUMBER TWENTY -10E6B ; [*1A54.0020.0002] # RUMI NUMBER THIRTY -10E6C ; [*1A55.0020.0002] # RUMI NUMBER FORTY -10E6D ; [*1A56.0020.0002] # RUMI NUMBER FIFTY -10E6E ; [*1A57.0020.0002] # RUMI NUMBER SIXTY -10E6F ; [*1A58.0020.0002] # RUMI NUMBER SEVENTY -10E70 ; [*1A59.0020.0002] # RUMI NUMBER EIGHTY -10E71 ; [*1A5A.0020.0002] # RUMI NUMBER NINETY -10E72 ; [*1A5B.0020.0002] # RUMI NUMBER ONE HUNDRED -10E73 ; [*1A5C.0020.0002] # RUMI NUMBER TWO HUNDRED -10E74 ; [*1A5D.0020.0002] # RUMI NUMBER THREE HUNDRED -10E75 ; [*1A5E.0020.0002] # RUMI NUMBER FOUR HUNDRED -10E76 ; [*1A5F.0020.0002] # RUMI NUMBER FIVE HUNDRED -10E77 ; [*1A60.0020.0002] # RUMI NUMBER SIX HUNDRED -10E78 ; [*1A61.0020.0002] # RUMI NUMBER SEVEN HUNDRED -10E79 ; [*1A62.0020.0002] # RUMI NUMBER EIGHT HUNDRED -10E7A ; [*1A63.0020.0002] # RUMI NUMBER NINE HUNDRED -10E7B ; [*1A64.0020.0002] # RUMI FRACTION ONE HALF -10E7C ; [*1A65.0020.0002] # RUMI FRACTION ONE QUARTER -10E7D ; [*1A66.0020.0002] # RUMI FRACTION ONE THIRD -10E7E ; [*1A67.0020.0002] # RUMI FRACTION TWO THIRDS -11047 ; [*02A9.0020.0002] # BRAHMI DANDA -11048 ; [*02AA.0020.0002] # BRAHMI DOUBLE DANDA -11049 ; [*041C.0020.0002] # BRAHMI PUNCTUATION DOT -1104A ; [*041D.0020.0002] # BRAHMI PUNCTUATION DOUBLE DOT -1104B ; [*041E.0020.0002] # BRAHMI PUNCTUATION LINE -1104C ; [*041F.0020.0002] # BRAHMI PUNCTUATION CRESCENT BAR -1104D ; [*0420.0020.0002] # BRAHMI PUNCTUATION LOTUS -1105B ; [*1AF9.0020.0002] # BRAHMI NUMBER TEN -1105C ; [*1AFA.0020.0002] # BRAHMI NUMBER TWENTY -1105D ; [*1AFB.0020.0002] # BRAHMI NUMBER THIRTY -1105E ; [*1AFC.0020.0002] # BRAHMI NUMBER FORTY -1105F ; [*1AFD.0020.0002] # BRAHMI NUMBER FIFTY -11060 ; [*1AFE.0020.0002] # BRAHMI NUMBER SIXTY -11061 ; [*1AFF.0020.0002] # BRAHMI NUMBER SEVENTY -11062 ; [*1B00.0020.0002] # BRAHMI NUMBER EIGHTY -11063 ; [*1B01.0020.0002] # BRAHMI NUMBER NINETY -11064 ; [*1B02.0020.0002] # BRAHMI NUMBER ONE HUNDRED -11065 ; [*1B03.0020.0002] # BRAHMI NUMBER ONE THOUSAND -110BB ; [*0434.0020.0002] # KAITHI ABBREVIATION SIGN -110BC ; [*0435.0020.0002] # KAITHI ENUMERATION SIGN +102EA ; [*1B3A.0020.0002] # COPTIC EPACT NUMBER TEN +102EB ; [*1B3B.0020.0002] # COPTIC EPACT NUMBER TWENTY +102EC ; [*1B3C.0020.0002] # COPTIC EPACT NUMBER THIRTY +102ED ; [*1B3D.0020.0002] # COPTIC EPACT NUMBER FORTY +102EE ; [*1B3E.0020.0002] # COPTIC EPACT NUMBER FIFTY +102EF ; [*1B3F.0020.0002] # COPTIC EPACT NUMBER SIXTY +102F0 ; [*1B40.0020.0002] # COPTIC EPACT NUMBER SEVENTY +102F1 ; [*1B41.0020.0002] # COPTIC EPACT NUMBER EIGHTY +102F2 ; [*1B42.0020.0002] # COPTIC EPACT NUMBER NINETY +102F3 ; [*1B43.0020.0002] # COPTIC EPACT NUMBER ONE HUNDRED +102F4 ; [*1B44.0020.0002] # COPTIC EPACT NUMBER TWO HUNDRED +102F5 ; [*1B45.0020.0002] # COPTIC EPACT NUMBER THREE HUNDRED +102F6 ; [*1B46.0020.0002] # COPTIC EPACT NUMBER FOUR HUNDRED +102F7 ; [*1B47.0020.0002] # COPTIC EPACT NUMBER FIVE HUNDRED +102F8 ; [*1B48.0020.0002] # COPTIC EPACT NUMBER SIX HUNDRED +102F9 ; [*1B49.0020.0002] # COPTIC EPACT NUMBER SEVEN HUNDRED +102FA ; [*1B4A.0020.0002] # COPTIC EPACT NUMBER EIGHT HUNDRED +102FB ; [*1B4B.0020.0002] # COPTIC EPACT NUMBER NINE HUNDRED +10322 ; [*1AE3.0020.0002] # OLD ITALIC NUMERAL TEN +10323 ; [*1AE4.0020.0002] # OLD ITALIC NUMERAL FIFTY +1039F ; [*02FD.0020.0002] # UGARITIC WORD DIVIDER +103D0 ; [*02FE.0020.0002] # OLD PERSIAN WORD DIVIDER +103D3 ; [*1B4C.0020.0002] # OLD PERSIAN NUMBER TEN +103D4 ; [*1B4D.0020.0002] # OLD PERSIAN NUMBER TWENTY +103D5 ; [*1B4E.0020.0002] # OLD PERSIAN NUMBER HUNDRED +1056F ; [*0432.0020.0002] # CAUCASIAN ALBANIAN CITATION MARK +10857 ; [*02D9.0020.0002] # IMPERIAL ARAMAIC SECTION SIGN +1085B ; [*1B5E.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN +1085C ; [*1B5F.0020.0002] # IMPERIAL ARAMAIC NUMBER TWENTY +1085D ; [*1B60.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE HUNDRED +1085E ; [*1B61.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE THOUSAND +1085F ; [*1B62.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10877 ; [*0FCF.0020.0002] # PALMYRENE LEFT-POINTING FLEURON +10878 ; [*0FD0.0020.0002] # PALMYRENE RIGHT-POINTING FLEURON +1087E ; [*1B4F.0020.0002] # PALMYRENE NUMBER TEN +1087F ; [*1B50.0020.0002] # PALMYRENE NUMBER TWENTY +108AD ; [*1B51.0020.0002] # NABATAEAN NUMBER TEN +108AE ; [*1B52.0020.0002] # NABATAEAN NUMBER TWENTY +108AF ; [*1B53.0020.0002] # NABATAEAN NUMBER ONE HUNDRED +108FD ; [*1B54.0020.0002] # HATRAN NUMBER TEN +108FE ; [*1B55.0020.0002] # HATRAN NUMBER TWENTY +108FF ; [*1B56.0020.0002] # HATRAN NUMBER ONE HUNDRED +10917 ; [*1B5B.0020.0002] # PHOENICIAN NUMBER TEN +10918 ; [*1B5C.0020.0002] # PHOENICIAN NUMBER TWENTY +10919 ; [*1B5D.0020.0002] # PHOENICIAN NUMBER ONE HUNDRED +1091F ; [*02FF.0020.0002] # PHOENICIAN WORD SEPARATOR +1093F ; [*02F9.0020.0002] # LYDIAN TRIANGULAR MARK +109BC ; [*1BDD.0020.0002] # MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS +109BD ; [*1BD2.0020.0002] # MEROITIC CURSIVE FRACTION ONE HALF +109C9 ; [*1BA7.0020.0002] # MEROITIC CURSIVE NUMBER TEN +109CA ; [*1BA8.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY +109CB ; [*1BA9.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY +109CC ; [*1BAA.0020.0002] # MEROITIC CURSIVE NUMBER FORTY +109CD ; [*1BAB.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY +109CE ; [*1BAC.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY +109CF ; [*1BAD.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY +109D2 ; [*1BAE.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED +109D3 ; [*1BAF.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED +109D4 ; [*1BB0.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED +109D5 ; [*1BB1.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED +109D6 ; [*1BB2.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED +109D7 ; [*1BB3.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED +109D8 ; [*1BB4.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED +109D9 ; [*1BB5.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED +109DA ; [*1BB6.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED +109DB ; [*1BB7.0020.0002] # MEROITIC CURSIVE NUMBER ONE THOUSAND +109DC ; [*1BB8.0020.0002] # MEROITIC CURSIVE NUMBER TWO THOUSAND +109DD ; [*1BB9.0020.0002] # MEROITIC CURSIVE NUMBER THREE THOUSAND +109DE ; [*1BBA.0020.0002] # MEROITIC CURSIVE NUMBER FOUR THOUSAND +109DF ; [*1BBB.0020.0002] # MEROITIC CURSIVE NUMBER FIVE THOUSAND +109E0 ; [*1BBC.0020.0002] # MEROITIC CURSIVE NUMBER SIX THOUSAND +109E1 ; [*1BBD.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN THOUSAND +109E2 ; [*1BBE.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT THOUSAND +109E3 ; [*1BBF.0020.0002] # MEROITIC CURSIVE NUMBER NINE THOUSAND +109E4 ; [*1BC0.0020.0002] # MEROITIC CURSIVE NUMBER TEN THOUSAND +109E5 ; [*1BC1.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY THOUSAND +109E6 ; [*1BC2.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY THOUSAND +109E7 ; [*1BC3.0020.0002] # MEROITIC CURSIVE NUMBER FORTY THOUSAND +109E8 ; [*1BC4.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY THOUSAND +109E9 ; [*1BC5.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY THOUSAND +109EA ; [*1BC6.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY THOUSAND +109EB ; [*1BC7.0020.0002] # MEROITIC CURSIVE NUMBER EIGHTY THOUSAND +109EC ; [*1BC8.0020.0002] # MEROITIC CURSIVE NUMBER NINETY THOUSAND +109ED ; [*1BC9.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND +109EE ; [*1BCA.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND +109EF ; [*1BCB.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND +109F0 ; [*1BCC.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND +109F1 ; [*1BCD.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND +109F2 ; [*1BCE.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND +109F3 ; [*1BCF.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND +109F4 ; [*1BD0.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND +109F5 ; [*1BD1.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND +109F6 ; [*1BD3.0020.0002] # MEROITIC CURSIVE FRACTION ONE TWELFTH +109F7 ; [*1BD4.0020.0002] # MEROITIC CURSIVE FRACTION TWO TWELFTHS +109F8 ; [*1BD5.0020.0002] # MEROITIC CURSIVE FRACTION THREE TWELFTHS +109F9 ; [*1BD6.0020.0002] # MEROITIC CURSIVE FRACTION FOUR TWELFTHS +109FA ; [*1BD7.0020.0002] # MEROITIC CURSIVE FRACTION FIVE TWELFTHS +109FB ; [*1BD8.0020.0002] # MEROITIC CURSIVE FRACTION SIX TWELFTHS +109FC ; [*1BD9.0020.0002] # MEROITIC CURSIVE FRACTION SEVEN TWELFTHS +109FD ; [*1BDA.0020.0002] # MEROITIC CURSIVE FRACTION EIGHT TWELFTHS +109FE ; [*1BDB.0020.0002] # MEROITIC CURSIVE FRACTION NINE TWELFTHS +109FF ; [*1BDC.0020.0002] # MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A44 ; [*1B7E.0020.0002] # KHAROSHTHI NUMBER TEN +10A45 ; [*1B7F.0020.0002] # KHAROSHTHI NUMBER TWENTY +10A46 ; [*1B80.0020.0002] # KHAROSHTHI NUMBER ONE HUNDRED +10A47 ; [*1B81.0020.0002] # KHAROSHTHI NUMBER ONE THOUSAND +10A50 ; [*0438.0020.0002] # KHAROSHTHI PUNCTUATION DOT +10A51 ; [*0439.0020.0002] # KHAROSHTHI PUNCTUATION SMALL CIRCLE +10A52 ; [*043A.0020.0002] # KHAROSHTHI PUNCTUATION CIRCLE +10A53 ; [*043B.0020.0002] # KHAROSHTHI PUNCTUATION CRESCENT BAR +10A54 ; [*043C.0020.0002] # KHAROSHTHI PUNCTUATION MANGALAM +10A55 ; [*043D.0020.0002] # KHAROSHTHI PUNCTUATION LOTUS +10A56 ; [*02AA.0020.0002] # KHAROSHTHI PUNCTUATION DANDA +10A57 ; [*02AB.0020.0002] # KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58 ; [*043E.0020.0002] # KHAROSHTHI PUNCTUATION LINES +10A7E ; [*1B57.0020.0002] # OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; [*1B58.0020.0002] # OLD SOUTH ARABIAN NUMERIC INDICATOR +10A9E ; [*1B59.0020.0002] # OLD NORTH ARABIAN NUMBER TEN +10A9F ; [*1B5A.0020.0002] # OLD NORTH ARABIAN NUMBER TWENTY +10AED ; [*1B63.0020.0002] # MANICHAEAN NUMBER TEN +10AEE ; [*1B64.0020.0002] # MANICHAEAN NUMBER TWENTY +10AEF ; [*1B65.0020.0002] # MANICHAEAN NUMBER ONE HUNDRED +10AF0 ; [*0443.0020.0002] # MANICHAEAN PUNCTUATION STAR +10AF1 ; [*0444.0020.0002] # MANICHAEAN PUNCTUATION FLEURON +10AF2 ; [*0445.0020.0002] # MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT +10AF3 ; [*0446.0020.0002] # MANICHAEAN PUNCTUATION DOT WITHIN DOT +10AF4 ; [*0447.0020.0002] # MANICHAEAN PUNCTUATION DOT +10AF5 ; [*0448.0020.0002] # MANICHAEAN PUNCTUATION TWO DOTS +10AF6 ; [*0449.0020.0002] # MANICHAEAN PUNCTUATION LINE FILLER +10B39 ; [*0442.0020.0002] # AVESTAN ABBREVIATION MARK +10B3A ; [*02DA.0020.0002] # TINY TWO DOTS OVER ONE DOT PUNCTUATION +10B3B ; [*02DB.0020.0002] # SMALL TWO DOTS OVER ONE DOT PUNCTUATION +10B3C ; [*02DC.0020.0002] # LARGE TWO DOTS OVER ONE DOT PUNCTUATION +10B3D ; [*02DD.0020.0002] # LARGE ONE DOT OVER TWO DOTS PUNCTUATION +10B3E ; [*02DE.0020.0002] # LARGE TWO RINGS OVER ONE RING PUNCTUATION +10B3F ; [*02DF.0020.0002] # LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B5C ; [*1B66.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TEN +10B5D ; [*1B67.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWENTY +10B5E ; [*1B68.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED +10B5F ; [*1B69.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B7C ; [*1B6A.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TEN +10B7D ; [*1B6B.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWENTY +10B7E ; [*1B6C.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED +10B7F ; [*1B6D.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B99 ; [*044A.0020.0002] # PSALTER PAHLAVI SECTION MARK +10B9A ; [*044B.0020.0002] # PSALTER PAHLAVI TURNED SECTION MARK +10B9B ; [*044C.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH CROSS +10B9C ; [*044D.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH DOT +10BAD ; [*1B6E.0020.0002] # PSALTER PAHLAVI NUMBER TEN +10BAE ; [*1B6F.0020.0002] # PSALTER PAHLAVI NUMBER TWENTY +10BAF ; [*1B70.0020.0002] # PSALTER PAHLAVI NUMBER ONE HUNDRED +10CFC ; [*1AE5.0020.0002] # OLD HUNGARIAN NUMBER TEN +10CFD ; [*1AE6.0020.0002] # OLD HUNGARIAN NUMBER FIFTY +10CFE ; [*1AE7.0020.0002] # OLD HUNGARIAN NUMBER ONE HUNDRED +10CFF ; [*1AE8.0020.0002] # OLD HUNGARIAN NUMBER ONE THOUSAND +10E69 ; [*1ACC.0020.0002] # RUMI NUMBER TEN +10E6A ; [*1ACD.0020.0002] # RUMI NUMBER TWENTY +10E6B ; [*1ACE.0020.0002] # RUMI NUMBER THIRTY +10E6C ; [*1ACF.0020.0002] # RUMI NUMBER FORTY +10E6D ; [*1AD0.0020.0002] # RUMI NUMBER FIFTY +10E6E ; [*1AD1.0020.0002] # RUMI NUMBER SIXTY +10E6F ; [*1AD2.0020.0002] # RUMI NUMBER SEVENTY +10E70 ; [*1AD3.0020.0002] # RUMI NUMBER EIGHTY +10E71 ; [*1AD4.0020.0002] # RUMI NUMBER NINETY +10E72 ; [*1AD5.0020.0002] # RUMI NUMBER ONE HUNDRED +10E73 ; [*1AD6.0020.0002] # RUMI NUMBER TWO HUNDRED +10E74 ; [*1AD7.0020.0002] # RUMI NUMBER THREE HUNDRED +10E75 ; [*1AD8.0020.0002] # RUMI NUMBER FOUR HUNDRED +10E76 ; [*1AD9.0020.0002] # RUMI NUMBER FIVE HUNDRED +10E77 ; [*1ADA.0020.0002] # RUMI NUMBER SIX HUNDRED +10E78 ; [*1ADB.0020.0002] # RUMI NUMBER SEVEN HUNDRED +10E79 ; [*1ADC.0020.0002] # RUMI NUMBER EIGHT HUNDRED +10E7A ; [*1ADD.0020.0002] # RUMI NUMBER NINE HUNDRED +10E7B ; [*1ADE.0020.0002] # RUMI FRACTION ONE HALF +10E7C ; [*1ADF.0020.0002] # RUMI FRACTION ONE QUARTER +10E7D ; [*1AE0.0020.0002] # RUMI FRACTION ONE THIRD +10E7E ; [*1AE1.0020.0002] # RUMI FRACTION TWO THIRDS +11047 ; [*02AC.0020.0002] # BRAHMI DANDA +11048 ; [*02AD.0020.0002] # BRAHMI DOUBLE DANDA +11049 ; [*0433.0020.0002] # BRAHMI PUNCTUATION DOT +1104A ; [*0434.0020.0002] # BRAHMI PUNCTUATION DOUBLE DOT +1104B ; [*0435.0020.0002] # BRAHMI PUNCTUATION LINE +1104C ; [*0436.0020.0002] # BRAHMI PUNCTUATION CRESCENT BAR +1104D ; [*0437.0020.0002] # BRAHMI PUNCTUATION LOTUS +1105B ; [*1B73.0020.0002] # BRAHMI NUMBER TEN +1105C ; [*1B74.0020.0002] # BRAHMI NUMBER TWENTY +1105D ; [*1B75.0020.0002] # BRAHMI NUMBER THIRTY +1105E ; [*1B76.0020.0002] # BRAHMI NUMBER FORTY +1105F ; [*1B77.0020.0002] # BRAHMI NUMBER FIFTY +11060 ; [*1B78.0020.0002] # BRAHMI NUMBER SIXTY +11061 ; [*1B79.0020.0002] # BRAHMI NUMBER SEVENTY +11062 ; [*1B7A.0020.0002] # BRAHMI NUMBER EIGHTY +11063 ; [*1B7B.0020.0002] # BRAHMI NUMBER NINETY +11064 ; [*1B7C.0020.0002] # BRAHMI NUMBER ONE HUNDRED +11065 ; [*1B7D.0020.0002] # BRAHMI NUMBER ONE THOUSAND +110BB ; [*044E.0020.0002] # KAITHI ABBREVIATION SIGN +110BC ; [*044F.0020.0002] # KAITHI ENUMERATION SIGN 110BD ; [.0000.0000.0000] # KAITHI NUMBER SIGN -110BE ; [*02D9.0020.0002] # KAITHI SECTION MARK -110BF ; [*02DA.0020.0002] # KAITHI DOUBLE SECTION MARK -110C0 ; [*02AB.0020.0002] # KAITHI DANDA -110C1 ; [*02AC.0020.0002] # KAITHI DOUBLE DANDA -11140 ; [*02DB.0020.0002] # CHAKMA SECTION MARK -11141 ; [*02AD.0020.0002] # CHAKMA DANDA -11142 ; [*02AE.0020.0002] # CHAKMA DOUBLE DANDA -11143 ; [*0271.0020.0002] # CHAKMA QUESTION MARK -11174 ; [*0436.0020.0002] # MAHAJANI ABBREVIATION SIGN -11175 ; [*0437.0020.0002] # MAHAJANI SECTION MARK -111C5 ; [*02AF.0020.0002] # SHARADA DANDA -111C6 ; [*02B0.0020.0002] # SHARADA DOUBLE DANDA -111C7 ; [*0439.0020.0002] # SHARADA ABBREVIATION SIGN -111C8 ; [*02DC.0020.0002] # SHARADA SEPARATOR -111C9 ; [*043A.0020.0002] # SHARADA SANDHI MARK -111CD ; [*0438.0020.0002] # SHARADA SUTRA MARK -111DB ; [*043B.0020.0002] # SHARADA SIGN SIDDHAM -111DD ; [*043C.0020.0002] # SHARADA CONTINUATION SIGN -111DE ; [*02DD.0020.0002] # SHARADA SECTION MARK-1 -111DF ; [*02DE.0020.0002] # SHARADA SECTION MARK-2 -111EA ; [*1B08.0020.0002] # SINHALA ARCHAIC NUMBER TEN -111EB ; [*1B09.0020.0002] # SINHALA ARCHAIC NUMBER TWENTY -111EC ; [*1B0A.0020.0002] # SINHALA ARCHAIC NUMBER THIRTY -111ED ; [*1B0B.0020.0002] # SINHALA ARCHAIC NUMBER FORTY -111EE ; [*1B0C.0020.0002] # SINHALA ARCHAIC NUMBER FIFTY -111EF ; [*1B0D.0020.0002] # SINHALA ARCHAIC NUMBER SIXTY -111F0 ; [*1B0E.0020.0002] # SINHALA ARCHAIC NUMBER SEVENTY -111F1 ; [*1B0F.0020.0002] # SINHALA ARCHAIC NUMBER EIGHTY -111F2 ; [*1B10.0020.0002] # SINHALA ARCHAIC NUMBER NINETY -111F3 ; [*1B11.0020.0002] # SINHALA ARCHAIC NUMBER ONE HUNDRED -111F4 ; [*1B12.0020.0002] # SINHALA ARCHAIC NUMBER ONE THOUSAND -11238 ; [*02B1.0020.0002] # KHOJKI DANDA -11239 ; [*02B2.0020.0002] # KHOJKI DOUBLE DANDA -1123A ; [*043D.0020.0002] # KHOJKI WORD SEPARATOR -1123B ; [*043E.0020.0002] # KHOJKI SECTION MARK -1123C ; [*043F.0020.0002] # KHOJKI DOUBLE SECTION MARK -1123D ; [*0440.0020.0002] # KHOJKI ABBREVIATION SIGN -112A9 ; [*02DF.0020.0002] # MULTANI SECTION MARK +110BE ; [*02E0.0020.0002] # KAITHI SECTION MARK +110BF ; [*02E1.0020.0002] # KAITHI DOUBLE SECTION MARK +110C0 ; [*02AE.0020.0002] # KAITHI DANDA +110C1 ; [*02AF.0020.0002] # KAITHI DOUBLE DANDA +11140 ; [*02E2.0020.0002] # CHAKMA SECTION MARK +11141 ; [*02B0.0020.0002] # CHAKMA DANDA +11142 ; [*02B1.0020.0002] # CHAKMA DOUBLE DANDA +11143 ; [*0273.0020.0002] # CHAKMA QUESTION MARK +11174 ; [*0450.0020.0002] # MAHAJANI ABBREVIATION SIGN +11175 ; [*0451.0020.0002] # MAHAJANI SECTION MARK +111C5 ; [*02B2.0020.0002] # SHARADA DANDA +111C6 ; [*02B3.0020.0002] # SHARADA DOUBLE DANDA +111C7 ; [*0453.0020.0002] # SHARADA ABBREVIATION SIGN +111C8 ; [*02E3.0020.0002] # SHARADA SEPARATOR +111C9 ; [*0454.0020.0002] # SHARADA SANDHI MARK +111CD ; [*0452.0020.0002] # SHARADA SUTRA MARK +111DB ; [*0455.0020.0002] # SHARADA SIGN SIDDHAM +111DD ; [*0456.0020.0002] # SHARADA CONTINUATION SIGN +111DE ; [*02E4.0020.0002] # SHARADA SECTION MARK-1 +111DF ; [*02E5.0020.0002] # SHARADA SECTION MARK-2 +111EA ; [*1B8C.0020.0002] # SINHALA ARCHAIC NUMBER TEN +111EB ; [*1B8D.0020.0002] # SINHALA ARCHAIC NUMBER TWENTY +111EC ; [*1B8E.0020.0002] # SINHALA ARCHAIC NUMBER THIRTY +111ED ; [*1B8F.0020.0002] # SINHALA ARCHAIC NUMBER FORTY +111EE ; [*1B90.0020.0002] # SINHALA ARCHAIC NUMBER FIFTY +111EF ; [*1B91.0020.0002] # SINHALA ARCHAIC NUMBER SIXTY +111F0 ; [*1B92.0020.0002] # SINHALA ARCHAIC NUMBER SEVENTY +111F1 ; [*1B93.0020.0002] # SINHALA ARCHAIC NUMBER EIGHTY +111F2 ; [*1B94.0020.0002] # SINHALA ARCHAIC NUMBER NINETY +111F3 ; [*1B95.0020.0002] # SINHALA ARCHAIC NUMBER ONE HUNDRED +111F4 ; [*1B96.0020.0002] # SINHALA ARCHAIC NUMBER ONE THOUSAND +11238 ; [*02B4.0020.0002] # KHOJKI DANDA +11239 ; [*02B5.0020.0002] # KHOJKI DOUBLE DANDA +1123A ; [*0457.0020.0002] # KHOJKI WORD SEPARATOR +1123B ; [*0458.0020.0002] # KHOJKI SECTION MARK +1123C ; [*0459.0020.0002] # KHOJKI DOUBLE SECTION MARK +1123D ; [*045A.0020.0002] # KHOJKI ABBREVIATION SIGN +112A9 ; [*02E6.0020.0002] # MULTANI SECTION MARK 11366 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT ZERO 11367 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT ONE 11368 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT TWO @@ -4582,446 +4617,483 @@ FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER 11372 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER NA 11373 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER VI 11374 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER PA -114C6 ; [*0441.0020.0002] # TIRHUTA ABBREVIATION SIGN -115C1 ; [*0442.0020.0002] # SIDDHAM SIGN SIDDHAM -115C2 ; [*02B3.0020.0002] # SIDDHAM DANDA -115C3 ; [*02B4.0020.0002] # SIDDHAM DOUBLE DANDA -115C4 ; [*0443.0020.0002] # SIDDHAM SEPARATOR DOT -115C5 ; [*0444.0020.0002] # SIDDHAM SEPARATOR BAR -115C6 ; [*0445.0020.0002] # SIDDHAM REPETITION MARK-1 -115C7 ; [*0446.0020.0002] # SIDDHAM REPETITION MARK-2 -115C8 ; [*0447.0020.0002] # SIDDHAM REPETITION MARK-3 -115C9 ; [*0448.0020.0002] # SIDDHAM END OF TEXT MARK -115CA ; [*0449.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS -115CB ; [*044A.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS -115CC ; [*044B.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS -115CD ; [*044C.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS -115CE ; [*044D.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS -115CF ; [*044E.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING -115D0 ; [*044F.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING WITH RAYS -115D1 ; [*0450.0020.0002] # SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS -115D2 ; [*0451.0020.0002] # SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS -115D3 ; [*0452.0020.0002] # SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS -115D4 ; [*0453.0020.0002] # SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS -115D5 ; [*0454.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND RAYS -115D6 ; [*0455.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES -115D7 ; [*0456.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES -11641 ; [*02B5.0020.0002] # MODI DANDA -11642 ; [*02B6.0020.0002] # MODI DOUBLE DANDA -11643 ; [*0457.0020.0002] # MODI ABBREVIATION SIGN -1173A ; [*1AF7.0020.0002] # AHOM NUMBER TEN -1173B ; [*1AF8.0020.0002] # AHOM NUMBER TWENTY -1173C ; [*02B7.0020.0002] # AHOM SIGN SMALL SECTION -1173D ; [*02B8.0020.0002] # AHOM SIGN SECTION -1173E ; [*02E0.0020.0002] # AHOM SIGN RULAI -1173F ; [*0530.0020.0002] # AHOM SYMBOL VI -118EA ; [*1B13.0020.0002] # WARANG CITI NUMBER TEN -118EB ; [*1B14.0020.0002] # WARANG CITI NUMBER TWENTY -118EC ; [*1B15.0020.0002] # WARANG CITI NUMBER THIRTY -118ED ; [*1B16.0020.0002] # WARANG CITI NUMBER FORTY -118EE ; [*1B17.0020.0002] # WARANG CITI NUMBER FIFTY -118EF ; [*1B18.0020.0002] # WARANG CITI NUMBER SIXTY -118F0 ; [*1B19.0020.0002] # WARANG CITI NUMBER SEVENTY -118F1 ; [*1B1A.0020.0002] # WARANG CITI NUMBER EIGHTY -118F2 ; [*1B1B.0020.0002] # WARANG CITI NUMBER NINETY -12432 ; [*1B5A.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH -12433 ; [*1B5B.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN -1245A ; [*1B5C.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH -1245B ; [*1B5D.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH -1245C ; [*1B5E.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH -1245D ; [*1B5F.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A -1245E ; [*1B60.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A -1245F ; [*1B61.0020.0002] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH -12460 ; [*1B62.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH -12461 ; [*1B63.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH -12462 ; [*1B64.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER -12463 ; [*1B65.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER GUR -12464 ; [*1B66.0020.0002] # CUNEIFORM NUMERIC SIGN ONE HALF GUR -12465 ; [*1B67.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD -12466 ; [*1B68.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS -12467 ; [*1B69.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FORTY -12468 ; [*1B6A.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FIFTY -12470 ; [*02F9.0020.0002] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER -12471 ; [*02FA.0020.0002] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON -12472 ; [*02FB.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON -12473 ; [*02FC.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON -12474 ; [*02FD.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON -16A6E ; [*02B9.0020.0002] # MRO DANDA -16A6F ; [*02BA.0020.0002] # MRO DOUBLE DANDA -16AF5 ; [*0285.0020.0002] # BASSA VAH FULL STOP -16B37 ; [*0458.0020.0002] # PAHAWH HMONG SIGN VOS THOM -16B38 ; [*0459.0020.0002] # PAHAWH HMONG SIGN VOS TSHAB CEEB -16B39 ; [*045A.0020.0002] # PAHAWH HMONG SIGN CIM CHEEM -16B3A ; [*045B.0020.0002] # PAHAWH HMONG SIGN VOS THIAB -16B3B ; [*045C.0020.0002] # PAHAWH HMONG SIGN VOS FEEM -16B3C ; [*0FAB.0020.0002] # PAHAWH HMONG SIGN XYEEM NTXIV -16B3D ; [*0FAC.0020.0002] # PAHAWH HMONG SIGN XYEEM RHO -16B3E ; [*0FAD.0020.0002] # PAHAWH HMONG SIGN XYEEM TOV -16B3F ; [*0FAE.0020.0002] # PAHAWH HMONG SIGN XYEEM FAIB -16B44 ; [*045D.0020.0002] # PAHAWH HMONG SIGN XAUS -16B45 ; [*0FAF.0020.0002] # PAHAWH HMONG SIGN CIM TSOV ROG -16B5B ; [*1B1C.0020.0002] # PAHAWH HMONG NUMBER TENS -16B5C ; [*1B1D.0020.0002] # PAHAWH HMONG NUMBER HUNDREDS -16B5D ; [*1B1E.0020.0002] # PAHAWH HMONG NUMBER TEN THOUSANDS -16B5E ; [*1B1F.0020.0002] # PAHAWH HMONG NUMBER MILLIONS -16B5F ; [*1B20.0020.0002] # PAHAWH HMONG NUMBER HUNDRED MILLIONS -16B60 ; [*1B21.0020.0002] # PAHAWH HMONG NUMBER TEN BILLIONS -16B61 ; [*1B22.0020.0002] # PAHAWH HMONG NUMBER TRILLIONS -1BC9C ; [*11A0.0020.0002] # DUPLOYAN SIGN O WITH CROSS -1BC9F ; [*0286.0020.0002] # DUPLOYAN PUNCTUATION CHINOOK FULL STOP -1D000 ; [*0FB0.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILI -1D001 ; [*0FB1.0020.0002] # BYZANTINE MUSICAL SYMBOL DASEIA -1D002 ; [*0FB2.0020.0002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI -1D003 ; [*0FB3.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON -1D004 ; [*0FB4.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI -1D005 ; [*0FB5.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON -1D006 ; [*0FB6.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI -1D007 ; [*0FB7.0020.0002] # BYZANTINE MUSICAL SYMBOL KATHISTI -1D008 ; [*0FB8.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMATIKI -1D009 ; [*0FB9.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI -1D00A ; [*0FBA.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS -1D00B ; [*0FBB.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI -1D00C ; [*0FBC.0020.0002] # BYZANTINE MUSICAL SYMBOL KREMASTI -1D00D ; [*0FBD.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON -1D00E ; [*0FBE.0020.0002] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON -1D00F ; [*0FBF.0020.0002] # BYZANTINE MUSICAL SYMBOL TELEIA -1D010 ; [*0FC0.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA -1D011 ; [*0FC1.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS -1D012 ; [*0FC2.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI -1D013 ; [*0FC3.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNEVMA -1D014 ; [*0FC4.0020.0002] # BYZANTINE MUSICAL SYMBOL THITA -1D015 ; [*0FC5.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION -1D016 ; [*0FC6.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION -1D017 ; [*0FC7.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILON -1D018 ; [*0FC8.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILON -1D019 ; [*0FC9.0020.0002] # BYZANTINE MUSICAL SYMBOL VATHY -1D01A ; [*0FCA.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION -1D01B ; [*0FCB.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION -1D01C ; [*0FCC.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION -1D01D ; [*0FCD.0020.0002] # BYZANTINE MUSICAL SYMBOL SAXIMATA -1D01E ; [*0FCE.0020.0002] # BYZANTINE MUSICAL SYMBOL PARICHON -1D01F ; [*0FCF.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA -1D020 ; [*0FD0.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION -1D021 ; [*0FD1.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION -1D022 ; [*0FD2.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION -1D023 ; [*0FD3.0020.0002] # BYZANTINE MUSICAL SYMBOL APOTHEMA -1D024 ; [*0FD4.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA -1D025 ; [*0FD5.0020.0002] # BYZANTINE MUSICAL SYMBOL REVMA -1D026 ; [*0FD6.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION -1D027 ; [*0FD7.0020.0002] # BYZANTINE MUSICAL SYMBOL TINAGMA -1D028 ; [*0FD8.0020.0002] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA -1D029 ; [*0FD9.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA -1D02A ; [*0FDA.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION -1D02B ; [*0FDB.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU -1D02C ; [*0FDC.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION -1D02D ; [*0FDD.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA -1D02E ; [*0FDE.0020.0002] # BYZANTINE MUSICAL SYMBOL LEMOI -1D02F ; [*0FDF.0020.0002] # BYZANTINE MUSICAL SYMBOL DYO -1D030 ; [*0FE0.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIA -1D031 ; [*0FE1.0020.0002] # BYZANTINE MUSICAL SYMBOL TESSERA -1D032 ; [*0FE2.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMATA -1D033 ; [*0FE3.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO -1D034 ; [*0FE4.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION -1D035 ; [*0FE5.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORA -1D036 ; [*0FE6.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION -1D037 ; [*0FE7.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON -1D038 ; [*0FE8.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON -1D039 ; [*0FE9.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON -1D03A ; [*0FEA.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA -1D03B ; [*0FEB.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION -1D03C ; [*0FEC.0020.0002] # BYZANTINE MUSICAL SYMBOL RAPISMA -1D03D ; [*0FED.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION -1D03E ; [*0FEE.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION -1D03F ; [*0FEF.0020.0002] # BYZANTINE MUSICAL SYMBOL ICHADIN -1D040 ; [*0FF0.0020.0002] # BYZANTINE MUSICAL SYMBOL NANA -1D041 ; [*0FF1.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASMA -1D042 ; [*0FF2.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO -1D043 ; [*0FF3.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO -1D044 ; [*0FF4.0020.0002] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA -1D045 ; [*0FF5.0020.0002] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA -1D046 ; [*0FF6.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON NEO -1D047 ; [*0FF7.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON NEO -1D048 ; [*0FF8.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA NEO -1D049 ; [*0FF9.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTI -1D04A ; [*0FFA.0020.0002] # BYZANTINE MUSICAL SYMBOL KOUFISMA -1D04B ; [*0FFB.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA -1D04C ; [*0FFC.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA -1D04D ; [*0FFD.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON NEO -1D04E ; [*0FFE.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO -1D04F ; [*0FFF.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO -1D050 ; [*1000.0020.0002] # BYZANTINE MUSICAL SYMBOL YPSILI -1D051 ; [*1001.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO -1D052 ; [*1002.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO -1D053 ; [*1003.0020.0002] # BYZANTINE MUSICAL SYMBOL YPORROI -1D054 ; [*1004.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON -1D055 ; [*1005.0020.0002] # BYZANTINE MUSICAL SYMBOL ELAFRON -1D056 ; [*1006.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILI -1D057 ; [*1007.0020.0002] # BYZANTINE MUSICAL SYMBOL MIKRON ISON -1D058 ; [*1008.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA NEO -1D059 ; [*1009.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA NEO -1D05A ; [*100A.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO -1D05B ; [*100B.0020.0002] # BYZANTINE MUSICAL SYMBOL OMALON -1D05C ; [*100C.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA -1D05D ; [*100D.0020.0002] # BYZANTINE MUSICAL SYMBOL LYGISMA -1D05E ; [*100E.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO -1D05F ; [*100F.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO -1D060 ; [*1010.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA -1D061 ; [*1011.0020.0002] # BYZANTINE MUSICAL SYMBOL KYLISMA -1D062 ; [*1012.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA -1D063 ; [*1013.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO -1D064 ; [*1014.0020.0002] # BYZANTINE MUSICAL SYMBOL EKSTREPTON -1D065 ; [*1015.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO -1D066 ; [*1016.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMA -1D067 ; [*1017.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO -1D068 ; [*1018.0020.0002] # BYZANTINE MUSICAL SYMBOL EPEGERMA -1D069 ; [*1019.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA NEO -1D06A ; [*101A.0020.0002] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA -1D06B ; [*101B.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON -1D06C ; [*101C.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA -1D06D ; [*101D.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA -1D06E ; [*101E.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA -1D06F ; [*101F.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA -1D070 ; [*1020.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA -1D071 ; [*1021.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA -1D072 ; [*1022.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON -1D073 ; [*1023.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON -1D074 ; [*1024.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON -1D075 ; [*1025.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO -1D076 ; [*1026.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO -1D077 ; [*1027.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO -1D078 ; [*1028.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN -1D079 ; [*1029.0020.0002] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES -1D07A ; [*102A.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVASMA -1D07B ; [*102B.0020.0002] # BYZANTINE MUSICAL SYMBOL ENDOFONON -1D07C ; [*102C.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN KATO -1D07D ; [*102D.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN ANO -1D07E ; [*102E.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS -1D07F ; [*102F.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA ANO -1D080 ; [*1030.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION -1D081 ; [*1031.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION -1D082 ; [*1032.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO -1D083 ; [*1033.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO -1D084 ; [*1034.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA NEO -1D085 ; [*1035.0020.0002] # BYZANTINE MUSICAL SYMBOL APLI -1D086 ; [*1036.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI -1D087 ; [*1037.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIPLI -1D088 ; [*1038.0020.0002] # BYZANTINE MUSICAL SYMBOL TETRAPLI -1D089 ; [*1039.0020.0002] # BYZANTINE MUSICAL SYMBOL KORONIS -1D08A ; [*103A.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU -1D08B ; [*103B.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON -1D08C ; [*103C.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON -1D08D ; [*103D.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON -1D08E ; [*103E.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU -1D08F ; [*103F.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO -1D090 ; [*1040.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA -1D091 ; [*1041.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA -1D092 ; [*1042.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON -1D093 ; [*1043.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO -1D094 ; [*1044.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO -1D095 ; [*1045.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA -1D096 ; [*1046.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIGORGON -1D097 ; [*1047.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGON -1D098 ; [*1048.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIDIARGON -1D099 ; [*1049.0020.0002] # BYZANTINE MUSICAL SYMBOL DIARGON -1D09A ; [*104A.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI -1D09B ; [*104B.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI -1D09C ; [*104C.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI -1D09D ; [*104D.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA -1D09E ; [*104E.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI MESI -1D09F ; [*104F.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI -1D0A0 ; [*1050.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI -1D0A1 ; [*1051.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI -1D0A2 ; [*1052.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS -1D0A3 ; [*1053.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS -1D0A4 ; [*1054.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS -1D0A5 ; [*1055.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS -1D0A6 ; [*1056.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS -1D0A7 ; [*1057.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS -1D0A8 ; [*1058.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS -1D0A9 ; [*1059.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS -1D0AA ; [*105A.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS -1D0AB ; [*105B.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS -1D0AC ; [*105C.0020.0002] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS -1D0AD ; [*105D.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS -1D0AE ; [*105E.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS -1D0AF ; [*105F.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS -1D0B0 ; [*1060.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS -1D0B1 ; [*1061.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS -1D0B2 ; [*1062.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS -1D0B3 ; [*1063.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS -1D0B4 ; [*1064.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN -1D0B5 ; [*1065.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN -1D0B6 ; [*1066.0020.0002] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU -1D0B7 ; [*1067.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFONON -1D0B8 ; [*1068.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORON -1D0B9 ; [*1069.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU -1D0BA ; [*106A.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA -1D0BB ; [*106B.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA -1D0BC ; [*106C.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS -1D0BD ; [*106D.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI -1D0BE ; [*106E.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI -1D0BF ; [*106F.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE -1D0C0 ; [*1070.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO -1D0C1 ; [*1071.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO -1D0C2 ; [*1072.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO -1D0C3 ; [*1073.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS -1D0C4 ; [*1074.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS -1D0C5 ; [*1075.0020.0002] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS -1D0C6 ; [*1076.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI -1D0C7 ; [*1077.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO -1D0C8 ; [*1078.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS -1D0C9 ; [*1079.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA KLITON -1D0CA ; [*107A.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI -1D0CB ; [*107B.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION -1D0CC ; [*107C.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA -1D0CD ; [*107D.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION -1D0CE ; [*107E.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION -1D0CF ; [*107F.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION -1D0D0 ; [*1080.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA -1D0D1 ; [*1081.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA -1D0D2 ; [*1082.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA -1D0D3 ; [*1083.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA -1D0D4 ; [*1084.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA -1D0D5 ; [*1085.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA -1D0D6 ; [*1086.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA -1D0D7 ; [*1087.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA -1D0D8 ; [*1088.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS -1D0D9 ; [*1089.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS -1D0DA ; [*108A.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI -1D0DB ; [*108B.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI -1D0DC ; [*108C.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI -1D0DD ; [*108D.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS -1D0DE ; [*108E.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS -1D0DF ; [*108F.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU -1D0E0 ; [*1090.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU -1D0E1 ; [*1091.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU -1D0E2 ; [*1092.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS -1D0E3 ; [*1093.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU -1D0E4 ; [*1094.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU -1D0E5 ; [*1095.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU -1D0E6 ; [*1096.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG -1D0E7 ; [*1097.0020.0002] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU -1D0E8 ; [*1098.0020.0002] # BYZANTINE MUSICAL SYMBOL STIGMA -1D0E9 ; [*1099.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA -1D0EA ; [*109A.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU -1D0EB ; [*109B.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA -1D0EC ; [*109C.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI -1D0ED ; [*109D.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE -1D0EE ; [*109E.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO -1D0EF ; [*109F.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI -1D0F0 ; [*10A0.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO -1D0F1 ; [*10A1.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO -1D0F2 ; [*10A2.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO -1D0F3 ; [*10A3.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO -1D0F4 ; [*10A4.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA KATO -1D0F5 ; [*10A5.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D100 ; [*10A6.0020.0002] # MUSICAL SYMBOL SINGLE BARLINE -1D101 ; [*10A7.0020.0002] # MUSICAL SYMBOL DOUBLE BARLINE -1D102 ; [*10A8.0020.0002] # MUSICAL SYMBOL FINAL BARLINE -1D103 ; [*10A9.0020.0002] # MUSICAL SYMBOL REVERSE FINAL BARLINE -1D104 ; [*10AA.0020.0002] # MUSICAL SYMBOL DASHED BARLINE -1D105 ; [*10AB.0020.0002] # MUSICAL SYMBOL SHORT BARLINE -1D106 ; [*10AC.0020.0002] # MUSICAL SYMBOL LEFT REPEAT SIGN -1D107 ; [*10AD.0020.0002] # MUSICAL SYMBOL RIGHT REPEAT SIGN -1D108 ; [*10AE.0020.0002] # MUSICAL SYMBOL REPEAT DOTS -1D109 ; [*10AF.0020.0002] # MUSICAL SYMBOL DAL SEGNO -1D10A ; [*10B0.0020.0002] # MUSICAL SYMBOL DA CAPO -1D10B ; [*10B1.0020.0002] # MUSICAL SYMBOL SEGNO -1D10C ; [*10B2.0020.0002] # MUSICAL SYMBOL CODA -1D10D ; [*10B3.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-1 -1D10E ; [*10B4.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-2 -1D10F ; [*10B5.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-3 -1D110 ; [*10B6.0020.0002] # MUSICAL SYMBOL FERMATA -1D111 ; [*10B7.0020.0002] # MUSICAL SYMBOL FERMATA BELOW -1D112 ; [*10B8.0020.0002] # MUSICAL SYMBOL BREATH MARK -1D113 ; [*10B9.0020.0002] # MUSICAL SYMBOL CAESURA -1D114 ; [*10BA.0020.0002] # MUSICAL SYMBOL BRACE -1D115 ; [*10BB.0020.0002] # MUSICAL SYMBOL BRACKET -1D116 ; [*10BC.0020.0002] # MUSICAL SYMBOL ONE-LINE STAFF -1D117 ; [*10BD.0020.0002] # MUSICAL SYMBOL TWO-LINE STAFF -1D118 ; [*10BE.0020.0002] # MUSICAL SYMBOL THREE-LINE STAFF -1D119 ; [*10BF.0020.0002] # MUSICAL SYMBOL FOUR-LINE STAFF -1D11A ; [*10C0.0020.0002] # MUSICAL SYMBOL FIVE-LINE STAFF -1D11B ; [*10C1.0020.0002] # MUSICAL SYMBOL SIX-LINE STAFF -1D11C ; [*10C2.0020.0002] # MUSICAL SYMBOL SIX-STRING FRETBOARD -1D11D ; [*10C3.0020.0002] # MUSICAL SYMBOL FOUR-STRING FRETBOARD -1D11E ; [*10C4.0020.0002] # MUSICAL SYMBOL G CLEF -1D11F ; [*10C5.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA ALTA -1D120 ; [*10C6.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA BASSA -1D121 ; [*10C7.0020.0002] # MUSICAL SYMBOL C CLEF -1D122 ; [*10C8.0020.0002] # MUSICAL SYMBOL F CLEF -1D123 ; [*10C9.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA ALTA -1D124 ; [*10CA.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA BASSA -1D125 ; [*10CB.0020.0002] # MUSICAL SYMBOL DRUM CLEF-1 -1D126 ; [*10CC.0020.0002] # MUSICAL SYMBOL DRUM CLEF-2 -1D129 ; [*10E0.0020.0002] # MUSICAL SYMBOL MULTIPLE MEASURE REST -1D12A ; [*10D0.0020.0002] # MUSICAL SYMBOL DOUBLE SHARP -1D12B ; [*10D1.0020.0002] # MUSICAL SYMBOL DOUBLE FLAT -1D12C ; [*10D2.0020.0002] # MUSICAL SYMBOL FLAT UP -1D12D ; [*10D3.0020.0002] # MUSICAL SYMBOL FLAT DOWN -1D12E ; [*10D4.0020.0002] # MUSICAL SYMBOL NATURAL UP -1D12F ; [*10D5.0020.0002] # MUSICAL SYMBOL NATURAL DOWN -1D130 ; [*10D6.0020.0002] # MUSICAL SYMBOL SHARP UP -1D131 ; [*10D7.0020.0002] # MUSICAL SYMBOL SHARP DOWN -1D132 ; [*10D8.0020.0002] # MUSICAL SYMBOL QUARTER TONE SHARP -1D133 ; [*10D9.0020.0002] # MUSICAL SYMBOL QUARTER TONE FLAT -1D134 ; [*10DA.0020.0002] # MUSICAL SYMBOL COMMON TIME -1D135 ; [*10DB.0020.0002] # MUSICAL SYMBOL CUT TIME -1D136 ; [*10DC.0020.0002] # MUSICAL SYMBOL OTTAVA ALTA -1D137 ; [*10DD.0020.0002] # MUSICAL SYMBOL OTTAVA BASSA -1D138 ; [*10DE.0020.0002] # MUSICAL SYMBOL QUINDICESIMA ALTA -1D139 ; [*10DF.0020.0002] # MUSICAL SYMBOL QUINDICESIMA BASSA -1D13A ; [*10E1.0020.0002] # MUSICAL SYMBOL MULTI REST -1D13B ; [*10E2.0020.0002] # MUSICAL SYMBOL WHOLE REST -1D13C ; [*10E3.0020.0002] # MUSICAL SYMBOL HALF REST -1D13D ; [*10E4.0020.0002] # MUSICAL SYMBOL QUARTER REST -1D13E ; [*10E5.0020.0002] # MUSICAL SYMBOL EIGHTH REST -1D13F ; [*10E6.0020.0002] # MUSICAL SYMBOL SIXTEENTH REST -1D140 ; [*10E7.0020.0002] # MUSICAL SYMBOL THIRTY-SECOND REST -1D141 ; [*10E8.0020.0002] # MUSICAL SYMBOL SIXTY-FOURTH REST -1D142 ; [*10E9.0020.0002] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST -1D143 ; [*10EA.0020.0002] # MUSICAL SYMBOL X NOTEHEAD -1D144 ; [*10EB.0020.0002] # MUSICAL SYMBOL PLUS NOTEHEAD -1D145 ; [*10EC.0020.0002] # MUSICAL SYMBOL CIRCLE X NOTEHEAD -1D146 ; [*10ED.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE -1D147 ; [*10EE.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK -1D148 ; [*10EF.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE -1D149 ; [*10F0.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK -1D14A ; [*10F1.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE -1D14B ; [*10F2.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK -1D14C ; [*10F3.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE -1D14D ; [*10F4.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK -1D14E ; [*10F5.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE -1D14F ; [*10F6.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK -1D150 ; [*10F7.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE -1D151 ; [*10F8.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK -1D152 ; [*10F9.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD WHITE -1D153 ; [*10FA.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD BLACK -1D154 ; [*10FB.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE -1D155 ; [*10FC.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK -1D156 ; [*10FD.0020.0002] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD -1D157 ; [*10FE.0020.0002] # MUSICAL SYMBOL VOID NOTEHEAD -1D158 ; [*10FF.0020.0002] # MUSICAL SYMBOL NOTEHEAD BLACK -1D159 ; [*1100.0020.0002] # MUSICAL SYMBOL NULL NOTEHEAD -1D15A ; [*1101.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE -1D15B ; [*1102.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK -1D15C ; [*1103.0020.0002] # MUSICAL SYMBOL BREVE -1D15D ; [*1104.0020.0002] # MUSICAL SYMBOL WHOLE NOTE -1D15E ; [*10FE.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL HALF NOTE -1D15F ; [*10FF.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL QUARTER NOTE -1D160 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL EIGHTH NOTE -1D161 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTEENTH NOTE -1D162 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL THIRTY-SECOND NOTE -1D163 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTY-FOURTH NOTE -1D164 ; [*10FF.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1144B ; [*02B6.0020.0002] # NEWA DANDA +1144C ; [*02B7.0020.0002] # NEWA DOUBLE DANDA +1144D ; [*045B.0020.0002] # NEWA COMMA +1144E ; [*045C.0020.0002] # NEWA GAP FILLER +1144F ; [*045D.0020.0002] # NEWA ABBREVIATION SIGN +1145B ; [*045E.0020.0002] # NEWA PLACEHOLDER MARK +1145D ; [*045F.0020.0002] # NEWA INSERTION SIGN +114C6 ; [*0460.0020.0002] # TIRHUTA ABBREVIATION SIGN +115C1 ; [*0461.0020.0002] # SIDDHAM SIGN SIDDHAM +115C2 ; [*02B8.0020.0002] # SIDDHAM DANDA +115C3 ; [*02B9.0020.0002] # SIDDHAM DOUBLE DANDA +115C4 ; [*0462.0020.0002] # SIDDHAM SEPARATOR DOT +115C5 ; [*0463.0020.0002] # SIDDHAM SEPARATOR BAR +115C6 ; [*0464.0020.0002] # SIDDHAM REPETITION MARK-1 +115C7 ; [*0465.0020.0002] # SIDDHAM REPETITION MARK-2 +115C8 ; [*0466.0020.0002] # SIDDHAM REPETITION MARK-3 +115C9 ; [*0467.0020.0002] # SIDDHAM END OF TEXT MARK +115CA ; [*0468.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS +115CB ; [*0469.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS +115CC ; [*046A.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS +115CD ; [*046B.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS +115CE ; [*046C.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS +115CF ; [*046D.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING +115D0 ; [*046E.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING WITH RAYS +115D1 ; [*046F.0020.0002] # SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS +115D2 ; [*0470.0020.0002] # SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS +115D3 ; [*0471.0020.0002] # SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS +115D4 ; [*0472.0020.0002] # SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS +115D5 ; [*0473.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND RAYS +115D6 ; [*0474.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES +115D7 ; [*0475.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +11641 ; [*02BA.0020.0002] # MODI DANDA +11642 ; [*02BB.0020.0002] # MODI DOUBLE DANDA +11643 ; [*0476.0020.0002] # MODI ABBREVIATION SIGN +11660 ; [*03DA.0020.0002] # MONGOLIAN BIRGA WITH ORNAMENT +11661 ; [*03DB.0020.0002] # MONGOLIAN ROTATED BIRGA +11662 ; [*03DC.0020.0002] # MONGOLIAN DOUBLE BIRGA WITH ORNAMENT +11663 ; [*03DD.0020.0002] # MONGOLIAN TRIPLE BIRGA WITH ORNAMENT +11664 ; [*03DE.0020.0002] # MONGOLIAN BIRGA WITH DOUBLE ORNAMENT +11665 ; [*03DF.0020.0002] # MONGOLIAN ROTATED BIRGA WITH ORNAMENT +11666 ; [*03E0.0020.0002] # MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT +11667 ; [*03E1.0020.0002] # MONGOLIAN INVERTED BIRGA +11668 ; [*03E2.0020.0002] # MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT +11669 ; [*03E3.0020.0002] # MONGOLIAN SWIRL BIRGA +1166A ; [*03E4.0020.0002] # MONGOLIAN SWIRL BIRGA WITH ORNAMENT +1166B ; [*03E5.0020.0002] # MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT +1166C ; [*03E6.0020.0002] # MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +1173A ; [*1B71.0020.0002] # AHOM NUMBER TEN +1173B ; [*1B72.0020.0002] # AHOM NUMBER TWENTY +1173C ; [*02BC.0020.0002] # AHOM SIGN SMALL SECTION +1173D ; [*02BD.0020.0002] # AHOM SIGN SECTION +1173E ; [*02E7.0020.0002] # AHOM SIGN RULAI +1173F ; [*0550.0020.0002] # AHOM SYMBOL VI +118EA ; [*1B97.0020.0002] # WARANG CITI NUMBER TEN +118EB ; [*1B98.0020.0002] # WARANG CITI NUMBER TWENTY +118EC ; [*1B99.0020.0002] # WARANG CITI NUMBER THIRTY +118ED ; [*1B9A.0020.0002] # WARANG CITI NUMBER FORTY +118EE ; [*1B9B.0020.0002] # WARANG CITI NUMBER FIFTY +118EF ; [*1B9C.0020.0002] # WARANG CITI NUMBER SIXTY +118F0 ; [*1B9D.0020.0002] # WARANG CITI NUMBER SEVENTY +118F1 ; [*1B9E.0020.0002] # WARANG CITI NUMBER EIGHTY +118F2 ; [*1B9F.0020.0002] # WARANG CITI NUMBER NINETY +11C41 ; [*02BE.0020.0002] # BHAIKSUKI DANDA +11C42 ; [*02BF.0020.0002] # BHAIKSUKI DOUBLE DANDA +11C43 ; [*043F.0020.0002] # BHAIKSUKI WORD SEPARATOR +11C44 ; [*0440.0020.0002] # BHAIKSUKI GAP FILLER-1 +11C45 ; [*0441.0020.0002] # BHAIKSUKI GAP FILLER-2 +11C63 ; [*1B82.0020.0002] # BHAIKSUKI NUMBER TEN +11C64 ; [*1B83.0020.0002] # BHAIKSUKI NUMBER TWENTY +11C65 ; [*1B84.0020.0002] # BHAIKSUKI NUMBER THIRTY +11C66 ; [*1B85.0020.0002] # BHAIKSUKI NUMBER FORTY +11C67 ; [*1B86.0020.0002] # BHAIKSUKI NUMBER FIFTY +11C68 ; [*1B87.0020.0002] # BHAIKSUKI NUMBER SIXTY +11C69 ; [*1B88.0020.0002] # BHAIKSUKI NUMBER SEVENTY +11C6A ; [*1B89.0020.0002] # BHAIKSUKI NUMBER EIGHTY +11C6B ; [*1B8A.0020.0002] # BHAIKSUKI NUMBER NINETY +11C6C ; [*1B8B.0020.0002] # BHAIKSUKI HUNDREDS UNIT MARK +11C70 ; [*0409.0020.0002] # MARCHEN HEAD MARK +11C71 ; [*040A.0020.0002] # MARCHEN MARK SHAD +12432 ; [*1BDE.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH +12433 ; [*1BDF.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN +1245A ; [*1BE0.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH +1245B ; [*1BE1.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH +1245C ; [*1BE2.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH +1245D ; [*1BE3.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A +1245E ; [*1BE4.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A +1245F ; [*1BE5.0020.0002] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH +12460 ; [*1BE6.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH +12461 ; [*1BE7.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH +12462 ; [*1BE8.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER +12463 ; [*1BE9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER GUR +12464 ; [*1BEA.0020.0002] # CUNEIFORM NUMERIC SIGN ONE HALF GUR +12465 ; [*1BEB.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD +12466 ; [*1BEC.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS +12467 ; [*1BED.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FORTY +12468 ; [*1BEE.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FIFTY +12470 ; [*0300.0020.0002] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER +12471 ; [*0301.0020.0002] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON +12472 ; [*0302.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON +12473 ; [*0303.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON +12474 ; [*0304.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +16A6E ; [*02C0.0020.0002] # MRO DANDA +16A6F ; [*02C1.0020.0002] # MRO DOUBLE DANDA +16AF5 ; [*0288.0020.0002] # BASSA VAH FULL STOP +16B37 ; [*0477.0020.0002] # PAHAWH HMONG SIGN VOS THOM +16B38 ; [*0478.0020.0002] # PAHAWH HMONG SIGN VOS TSHAB CEEB +16B39 ; [*0479.0020.0002] # PAHAWH HMONG SIGN CIM CHEEM +16B3A ; [*047A.0020.0002] # PAHAWH HMONG SIGN VOS THIAB +16B3B ; [*047B.0020.0002] # PAHAWH HMONG SIGN VOS FEEM +16B3C ; [*0FD1.0020.0002] # PAHAWH HMONG SIGN XYEEM NTXIV +16B3D ; [*0FD2.0020.0002] # PAHAWH HMONG SIGN XYEEM RHO +16B3E ; [*0FD3.0020.0002] # PAHAWH HMONG SIGN XYEEM TOV +16B3F ; [*0FD4.0020.0002] # PAHAWH HMONG SIGN XYEEM FAIB +16B44 ; [*047C.0020.0002] # PAHAWH HMONG SIGN XAUS +16B45 ; [*0FD5.0020.0002] # PAHAWH HMONG SIGN CIM TSOV ROG +16B5B ; [*1BA0.0020.0002] # PAHAWH HMONG NUMBER TENS +16B5C ; [*1BA1.0020.0002] # PAHAWH HMONG NUMBER HUNDREDS +16B5D ; [*1BA2.0020.0002] # PAHAWH HMONG NUMBER TEN THOUSANDS +16B5E ; [*1BA3.0020.0002] # PAHAWH HMONG NUMBER MILLIONS +16B5F ; [*1BA4.0020.0002] # PAHAWH HMONG NUMBER HUNDRED MILLIONS +16B60 ; [*1BA5.0020.0002] # PAHAWH HMONG NUMBER TEN BILLIONS +16B61 ; [*1BA6.0020.0002] # PAHAWH HMONG NUMBER TRILLIONS +1BC9C ; [*11C6.0020.0002] # DUPLOYAN SIGN O WITH CROSS +1BC9F ; [*0289.0020.0002] # DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1D000 ; [*0FD6.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILI +1D001 ; [*0FD7.0020.0002] # BYZANTINE MUSICAL SYMBOL DASEIA +1D002 ; [*0FD8.0020.0002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI +1D003 ; [*0FD9.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON +1D004 ; [*0FDA.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI +1D005 ; [*0FDB.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON +1D006 ; [*0FDC.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI +1D007 ; [*0FDD.0020.0002] # BYZANTINE MUSICAL SYMBOL KATHISTI +1D008 ; [*0FDE.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMATIKI +1D009 ; [*0FDF.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI +1D00A ; [*0FE0.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS +1D00B ; [*0FE1.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI +1D00C ; [*0FE2.0020.0002] # BYZANTINE MUSICAL SYMBOL KREMASTI +1D00D ; [*0FE3.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON +1D00E ; [*0FE4.0020.0002] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON +1D00F ; [*0FE5.0020.0002] # BYZANTINE MUSICAL SYMBOL TELEIA +1D010 ; [*0FE6.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA +1D011 ; [*0FE7.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS +1D012 ; [*0FE8.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI +1D013 ; [*0FE9.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNEVMA +1D014 ; [*0FEA.0020.0002] # BYZANTINE MUSICAL SYMBOL THITA +1D015 ; [*0FEB.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION +1D016 ; [*0FEC.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION +1D017 ; [*0FED.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILON +1D018 ; [*0FEE.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILON +1D019 ; [*0FEF.0020.0002] # BYZANTINE MUSICAL SYMBOL VATHY +1D01A ; [*0FF0.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION +1D01B ; [*0FF1.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION +1D01C ; [*0FF2.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION +1D01D ; [*0FF3.0020.0002] # BYZANTINE MUSICAL SYMBOL SAXIMATA +1D01E ; [*0FF4.0020.0002] # BYZANTINE MUSICAL SYMBOL PARICHON +1D01F ; [*0FF5.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA +1D020 ; [*0FF6.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION +1D021 ; [*0FF7.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION +1D022 ; [*0FF8.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION +1D023 ; [*0FF9.0020.0002] # BYZANTINE MUSICAL SYMBOL APOTHEMA +1D024 ; [*0FFA.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA +1D025 ; [*0FFB.0020.0002] # BYZANTINE MUSICAL SYMBOL REVMA +1D026 ; [*0FFC.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION +1D027 ; [*0FFD.0020.0002] # BYZANTINE MUSICAL SYMBOL TINAGMA +1D028 ; [*0FFE.0020.0002] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA +1D029 ; [*0FFF.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA +1D02A ; [*1000.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION +1D02B ; [*1001.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU +1D02C ; [*1002.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION +1D02D ; [*1003.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA +1D02E ; [*1004.0020.0002] # BYZANTINE MUSICAL SYMBOL LEMOI +1D02F ; [*1005.0020.0002] # BYZANTINE MUSICAL SYMBOL DYO +1D030 ; [*1006.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIA +1D031 ; [*1007.0020.0002] # BYZANTINE MUSICAL SYMBOL TESSERA +1D032 ; [*1008.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMATA +1D033 ; [*1009.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO +1D034 ; [*100A.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION +1D035 ; [*100B.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORA +1D036 ; [*100C.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION +1D037 ; [*100D.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON +1D038 ; [*100E.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON +1D039 ; [*100F.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON +1D03A ; [*1010.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA +1D03B ; [*1011.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION +1D03C ; [*1012.0020.0002] # BYZANTINE MUSICAL SYMBOL RAPISMA +1D03D ; [*1013.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION +1D03E ; [*1014.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION +1D03F ; [*1015.0020.0002] # BYZANTINE MUSICAL SYMBOL ICHADIN +1D040 ; [*1016.0020.0002] # BYZANTINE MUSICAL SYMBOL NANA +1D041 ; [*1017.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASMA +1D042 ; [*1018.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO +1D043 ; [*1019.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO +1D044 ; [*101A.0020.0002] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA +1D045 ; [*101B.0020.0002] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA +1D046 ; [*101C.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON NEO +1D047 ; [*101D.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON NEO +1D048 ; [*101E.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA NEO +1D049 ; [*101F.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTI +1D04A ; [*1020.0020.0002] # BYZANTINE MUSICAL SYMBOL KOUFISMA +1D04B ; [*1021.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA +1D04C ; [*1022.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA +1D04D ; [*1023.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON NEO +1D04E ; [*1024.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO +1D04F ; [*1025.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO +1D050 ; [*1026.0020.0002] # BYZANTINE MUSICAL SYMBOL YPSILI +1D051 ; [*1027.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO +1D052 ; [*1028.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO +1D053 ; [*1029.0020.0002] # BYZANTINE MUSICAL SYMBOL YPORROI +1D054 ; [*102A.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON +1D055 ; [*102B.0020.0002] # BYZANTINE MUSICAL SYMBOL ELAFRON +1D056 ; [*102C.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILI +1D057 ; [*102D.0020.0002] # BYZANTINE MUSICAL SYMBOL MIKRON ISON +1D058 ; [*102E.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA NEO +1D059 ; [*102F.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA NEO +1D05A ; [*1030.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO +1D05B ; [*1031.0020.0002] # BYZANTINE MUSICAL SYMBOL OMALON +1D05C ; [*1032.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA +1D05D ; [*1033.0020.0002] # BYZANTINE MUSICAL SYMBOL LYGISMA +1D05E ; [*1034.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO +1D05F ; [*1035.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO +1D060 ; [*1036.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA +1D061 ; [*1037.0020.0002] # BYZANTINE MUSICAL SYMBOL KYLISMA +1D062 ; [*1038.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA +1D063 ; [*1039.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO +1D064 ; [*103A.0020.0002] # BYZANTINE MUSICAL SYMBOL EKSTREPTON +1D065 ; [*103B.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO +1D066 ; [*103C.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMA +1D067 ; [*103D.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO +1D068 ; [*103E.0020.0002] # BYZANTINE MUSICAL SYMBOL EPEGERMA +1D069 ; [*103F.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA NEO +1D06A ; [*1040.0020.0002] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA +1D06B ; [*1041.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON +1D06C ; [*1042.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA +1D06D ; [*1043.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA +1D06E ; [*1044.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA +1D06F ; [*1045.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA +1D070 ; [*1046.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA +1D071 ; [*1047.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA +1D072 ; [*1048.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON +1D073 ; [*1049.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON +1D074 ; [*104A.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON +1D075 ; [*104B.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO +1D076 ; [*104C.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO +1D077 ; [*104D.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO +1D078 ; [*104E.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN +1D079 ; [*104F.0020.0002] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES +1D07A ; [*1050.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVASMA +1D07B ; [*1051.0020.0002] # BYZANTINE MUSICAL SYMBOL ENDOFONON +1D07C ; [*1052.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN KATO +1D07D ; [*1053.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN ANO +1D07E ; [*1054.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS +1D07F ; [*1055.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA ANO +1D080 ; [*1056.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION +1D081 ; [*1057.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION +1D082 ; [*1058.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO +1D083 ; [*1059.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO +1D084 ; [*105A.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA NEO +1D085 ; [*105B.0020.0002] # BYZANTINE MUSICAL SYMBOL APLI +1D086 ; [*105C.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI +1D087 ; [*105D.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIPLI +1D088 ; [*105E.0020.0002] # BYZANTINE MUSICAL SYMBOL TETRAPLI +1D089 ; [*105F.0020.0002] # BYZANTINE MUSICAL SYMBOL KORONIS +1D08A ; [*1060.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU +1D08B ; [*1061.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON +1D08C ; [*1062.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON +1D08D ; [*1063.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON +1D08E ; [*1064.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU +1D08F ; [*1065.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO +1D090 ; [*1066.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA +1D091 ; [*1067.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA +1D092 ; [*1068.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON +1D093 ; [*1069.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO +1D094 ; [*106A.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO +1D095 ; [*106B.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA +1D096 ; [*106C.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIGORGON +1D097 ; [*106D.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGON +1D098 ; [*106E.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIDIARGON +1D099 ; [*106F.0020.0002] # BYZANTINE MUSICAL SYMBOL DIARGON +1D09A ; [*1070.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI +1D09B ; [*1071.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI +1D09C ; [*1072.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI +1D09D ; [*1073.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA +1D09E ; [*1074.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI MESI +1D09F ; [*1075.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI +1D0A0 ; [*1076.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI +1D0A1 ; [*1077.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI +1D0A2 ; [*1078.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS +1D0A3 ; [*1079.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS +1D0A4 ; [*107A.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS +1D0A5 ; [*107B.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS +1D0A6 ; [*107C.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS +1D0A7 ; [*107D.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS +1D0A8 ; [*107E.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS +1D0A9 ; [*107F.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS +1D0AA ; [*1080.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS +1D0AB ; [*1081.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS +1D0AC ; [*1082.0020.0002] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS +1D0AD ; [*1083.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS +1D0AE ; [*1084.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS +1D0AF ; [*1085.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS +1D0B0 ; [*1086.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS +1D0B1 ; [*1087.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS +1D0B2 ; [*1088.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS +1D0B3 ; [*1089.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS +1D0B4 ; [*108A.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN +1D0B5 ; [*108B.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN +1D0B6 ; [*108C.0020.0002] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU +1D0B7 ; [*108D.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFONON +1D0B8 ; [*108E.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORON +1D0B9 ; [*108F.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU +1D0BA ; [*1090.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA +1D0BB ; [*1091.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA +1D0BC ; [*1092.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS +1D0BD ; [*1093.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI +1D0BE ; [*1094.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI +1D0BF ; [*1095.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE +1D0C0 ; [*1096.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO +1D0C1 ; [*1097.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO +1D0C2 ; [*1098.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO +1D0C3 ; [*1099.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS +1D0C4 ; [*109A.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS +1D0C5 ; [*109B.0020.0002] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS +1D0C6 ; [*109C.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI +1D0C7 ; [*109D.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO +1D0C8 ; [*109E.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS +1D0C9 ; [*109F.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA KLITON +1D0CA ; [*10A0.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI +1D0CB ; [*10A1.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION +1D0CC ; [*10A2.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA +1D0CD ; [*10A3.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION +1D0CE ; [*10A4.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION +1D0CF ; [*10A5.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION +1D0D0 ; [*10A6.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA +1D0D1 ; [*10A7.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA +1D0D2 ; [*10A8.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA +1D0D3 ; [*10A9.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA +1D0D4 ; [*10AA.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA +1D0D5 ; [*10AB.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA +1D0D6 ; [*10AC.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA +1D0D7 ; [*10AD.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA +1D0D8 ; [*10AE.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS +1D0D9 ; [*10AF.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS +1D0DA ; [*10B0.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI +1D0DB ; [*10B1.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI +1D0DC ; [*10B2.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI +1D0DD ; [*10B3.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS +1D0DE ; [*10B4.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS +1D0DF ; [*10B5.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU +1D0E0 ; [*10B6.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU +1D0E1 ; [*10B7.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU +1D0E2 ; [*10B8.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS +1D0E3 ; [*10B9.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU +1D0E4 ; [*10BA.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU +1D0E5 ; [*10BB.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU +1D0E6 ; [*10BC.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG +1D0E7 ; [*10BD.0020.0002] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU +1D0E8 ; [*10BE.0020.0002] # BYZANTINE MUSICAL SYMBOL STIGMA +1D0E9 ; [*10BF.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA +1D0EA ; [*10C0.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU +1D0EB ; [*10C1.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA +1D0EC ; [*10C2.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI +1D0ED ; [*10C3.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE +1D0EE ; [*10C4.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO +1D0EF ; [*10C5.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI +1D0F0 ; [*10C6.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO +1D0F1 ; [*10C7.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO +1D0F2 ; [*10C8.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO +1D0F3 ; [*10C9.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO +1D0F4 ; [*10CA.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA KATO +1D0F5 ; [*10CB.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100 ; [*10CC.0020.0002] # MUSICAL SYMBOL SINGLE BARLINE +1D101 ; [*10CD.0020.0002] # MUSICAL SYMBOL DOUBLE BARLINE +1D102 ; [*10CE.0020.0002] # MUSICAL SYMBOL FINAL BARLINE +1D103 ; [*10CF.0020.0002] # MUSICAL SYMBOL REVERSE FINAL BARLINE +1D104 ; [*10D0.0020.0002] # MUSICAL SYMBOL DASHED BARLINE +1D105 ; [*10D1.0020.0002] # MUSICAL SYMBOL SHORT BARLINE +1D106 ; [*10D2.0020.0002] # MUSICAL SYMBOL LEFT REPEAT SIGN +1D107 ; [*10D3.0020.0002] # MUSICAL SYMBOL RIGHT REPEAT SIGN +1D108 ; [*10D4.0020.0002] # MUSICAL SYMBOL REPEAT DOTS +1D109 ; [*10D5.0020.0002] # MUSICAL SYMBOL DAL SEGNO +1D10A ; [*10D6.0020.0002] # MUSICAL SYMBOL DA CAPO +1D10B ; [*10D7.0020.0002] # MUSICAL SYMBOL SEGNO +1D10C ; [*10D8.0020.0002] # MUSICAL SYMBOL CODA +1D10D ; [*10D9.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-1 +1D10E ; [*10DA.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-2 +1D10F ; [*10DB.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-3 +1D110 ; [*10DC.0020.0002] # MUSICAL SYMBOL FERMATA +1D111 ; [*10DD.0020.0002] # MUSICAL SYMBOL FERMATA BELOW +1D112 ; [*10DE.0020.0002] # MUSICAL SYMBOL BREATH MARK +1D113 ; [*10DF.0020.0002] # MUSICAL SYMBOL CAESURA +1D114 ; [*10E0.0020.0002] # MUSICAL SYMBOL BRACE +1D115 ; [*10E1.0020.0002] # MUSICAL SYMBOL BRACKET +1D116 ; [*10E2.0020.0002] # MUSICAL SYMBOL ONE-LINE STAFF +1D117 ; [*10E3.0020.0002] # MUSICAL SYMBOL TWO-LINE STAFF +1D118 ; [*10E4.0020.0002] # MUSICAL SYMBOL THREE-LINE STAFF +1D119 ; [*10E5.0020.0002] # MUSICAL SYMBOL FOUR-LINE STAFF +1D11A ; [*10E6.0020.0002] # MUSICAL SYMBOL FIVE-LINE STAFF +1D11B ; [*10E7.0020.0002] # MUSICAL SYMBOL SIX-LINE STAFF +1D11C ; [*10E8.0020.0002] # MUSICAL SYMBOL SIX-STRING FRETBOARD +1D11D ; [*10E9.0020.0002] # MUSICAL SYMBOL FOUR-STRING FRETBOARD +1D11E ; [*10EA.0020.0002] # MUSICAL SYMBOL G CLEF +1D11F ; [*10EB.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA ALTA +1D120 ; [*10EC.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA BASSA +1D121 ; [*10ED.0020.0002] # MUSICAL SYMBOL C CLEF +1D122 ; [*10EE.0020.0002] # MUSICAL SYMBOL F CLEF +1D123 ; [*10EF.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA ALTA +1D124 ; [*10F0.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA BASSA +1D125 ; [*10F1.0020.0002] # MUSICAL SYMBOL DRUM CLEF-1 +1D126 ; [*10F2.0020.0002] # MUSICAL SYMBOL DRUM CLEF-2 +1D129 ; [*1106.0020.0002] # MUSICAL SYMBOL MULTIPLE MEASURE REST +1D12A ; [*10F6.0020.0002] # MUSICAL SYMBOL DOUBLE SHARP +1D12B ; [*10F7.0020.0002] # MUSICAL SYMBOL DOUBLE FLAT +1D12C ; [*10F8.0020.0002] # MUSICAL SYMBOL FLAT UP +1D12D ; [*10F9.0020.0002] # MUSICAL SYMBOL FLAT DOWN +1D12E ; [*10FA.0020.0002] # MUSICAL SYMBOL NATURAL UP +1D12F ; [*10FB.0020.0002] # MUSICAL SYMBOL NATURAL DOWN +1D130 ; [*10FC.0020.0002] # MUSICAL SYMBOL SHARP UP +1D131 ; [*10FD.0020.0002] # MUSICAL SYMBOL SHARP DOWN +1D132 ; [*10FE.0020.0002] # MUSICAL SYMBOL QUARTER TONE SHARP +1D133 ; [*10FF.0020.0002] # MUSICAL SYMBOL QUARTER TONE FLAT +1D134 ; [*1100.0020.0002] # MUSICAL SYMBOL COMMON TIME +1D135 ; [*1101.0020.0002] # MUSICAL SYMBOL CUT TIME +1D136 ; [*1102.0020.0002] # MUSICAL SYMBOL OTTAVA ALTA +1D137 ; [*1103.0020.0002] # MUSICAL SYMBOL OTTAVA BASSA +1D138 ; [*1104.0020.0002] # MUSICAL SYMBOL QUINDICESIMA ALTA +1D139 ; [*1105.0020.0002] # MUSICAL SYMBOL QUINDICESIMA BASSA +1D13A ; [*1107.0020.0002] # MUSICAL SYMBOL MULTI REST +1D13B ; [*1108.0020.0002] # MUSICAL SYMBOL WHOLE REST +1D13C ; [*1109.0020.0002] # MUSICAL SYMBOL HALF REST +1D13D ; [*110A.0020.0002] # MUSICAL SYMBOL QUARTER REST +1D13E ; [*110B.0020.0002] # MUSICAL SYMBOL EIGHTH REST +1D13F ; [*110C.0020.0002] # MUSICAL SYMBOL SIXTEENTH REST +1D140 ; [*110D.0020.0002] # MUSICAL SYMBOL THIRTY-SECOND REST +1D141 ; [*110E.0020.0002] # MUSICAL SYMBOL SIXTY-FOURTH REST +1D142 ; [*110F.0020.0002] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST +1D143 ; [*1110.0020.0002] # MUSICAL SYMBOL X NOTEHEAD +1D144 ; [*1111.0020.0002] # MUSICAL SYMBOL PLUS NOTEHEAD +1D145 ; [*1112.0020.0002] # MUSICAL SYMBOL CIRCLE X NOTEHEAD +1D146 ; [*1113.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE +1D147 ; [*1114.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK +1D148 ; [*1115.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE +1D149 ; [*1116.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK +1D14A ; [*1117.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE +1D14B ; [*1118.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK +1D14C ; [*1119.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE +1D14D ; [*111A.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK +1D14E ; [*111B.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE +1D14F ; [*111C.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK +1D150 ; [*111D.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE +1D151 ; [*111E.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK +1D152 ; [*111F.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD WHITE +1D153 ; [*1120.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD BLACK +1D154 ; [*1121.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE +1D155 ; [*1122.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK +1D156 ; [*1123.0020.0002] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD +1D157 ; [*1124.0020.0002] # MUSICAL SYMBOL VOID NOTEHEAD +1D158 ; [*1125.0020.0002] # MUSICAL SYMBOL NOTEHEAD BLACK +1D159 ; [*1126.0020.0002] # MUSICAL SYMBOL NULL NOTEHEAD +1D15A ; [*1127.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE +1D15B ; [*1128.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK +1D15C ; [*1129.0020.0002] # MUSICAL SYMBOL BREVE +1D15D ; [*112A.0020.0002] # MUSICAL SYMBOL WHOLE NOTE +1D15E ; [*1124.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL HALF NOTE +1D15F ; [*1125.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL QUARTER NOTE +1D160 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL EIGHTH NOTE +1D161 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTEENTH NOTE +1D162 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE 1D165 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING STEM 1D166 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D167 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-1 1D168 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-2 1D169 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-3 -1D16A ; [*1105.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-1 -1D16B ; [*1106.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-2 -1D16C ; [*1107.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16A ; [*112B.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-1 +1D16B ; [*112C.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-2 +1D16C ; [*112D.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-3 1D16D ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING AUGMENTATION DOT 1D16E ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-1 1D16F ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-2 @@ -5036,8 +5108,8 @@ FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER 1D180 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING MARCATO-STACCATO 1D181 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING ACCENT-STACCATO 1D182 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING LOURE -1D183 ; [*1108.0020.0002] # MUSICAL SYMBOL ARPEGGIATO UP -1D184 ; [*1109.0020.0002] # MUSICAL SYMBOL ARPEGGIATO DOWN +1D183 ; [*112E.0020.0002] # MUSICAL SYMBOL ARPEGGIATO UP +1D184 ; [*112F.0020.0002] # MUSICAL SYMBOL ARPEGGIATO DOWN 1D185 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOIT 1D186 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING RIP 1D187 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLIP @@ -5045,787 +5117,787 @@ FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER 1D189 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING BEND 1D18A ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOUBLE TONGUE 1D18B ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D18C ; [*110A.0020.0002] # MUSICAL SYMBOL RINFORZANDO -1D18D ; [*110B.0020.0002] # MUSICAL SYMBOL SUBITO -1D18E ; [*110C.0020.0002] # MUSICAL SYMBOL Z -1D18F ; [*110D.0020.0002] # MUSICAL SYMBOL PIANO -1D190 ; [*110E.0020.0002] # MUSICAL SYMBOL MEZZO -1D191 ; [*110F.0020.0002] # MUSICAL SYMBOL FORTE -1D192 ; [*1110.0020.0002] # MUSICAL SYMBOL CRESCENDO -1D193 ; [*1111.0020.0002] # MUSICAL SYMBOL DECRESCENDO -1D194 ; [*1112.0020.0002] # MUSICAL SYMBOL GRACE NOTE SLASH -1D195 ; [*1113.0020.0002] # MUSICAL SYMBOL GRACE NOTE NO SLASH -1D196 ; [*1114.0020.0002] # MUSICAL SYMBOL TR -1D197 ; [*1115.0020.0002] # MUSICAL SYMBOL TURN -1D198 ; [*1116.0020.0002] # MUSICAL SYMBOL INVERTED TURN -1D199 ; [*1117.0020.0002] # MUSICAL SYMBOL TURN SLASH -1D19A ; [*1118.0020.0002] # MUSICAL SYMBOL TURN UP -1D19B ; [*1119.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-1 -1D19C ; [*111A.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-2 -1D19D ; [*111B.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-3 -1D19E ; [*111C.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-4 -1D19F ; [*111D.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-5 -1D1A0 ; [*111E.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-6 -1D1A1 ; [*111F.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-7 -1D1A2 ; [*1120.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-8 -1D1A3 ; [*1121.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-9 -1D1A4 ; [*1122.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-10 -1D1A5 ; [*1123.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-11 -1D1A6 ; [*1124.0020.0002] # MUSICAL SYMBOL HAUPTSTIMME -1D1A7 ; [*1125.0020.0002] # MUSICAL SYMBOL NEBENSTIMME -1D1A8 ; [*1126.0020.0002] # MUSICAL SYMBOL END OF STIMME -1D1A9 ; [*1127.0020.0002] # MUSICAL SYMBOL DEGREE SLASH +1D18C ; [*1130.0020.0002] # MUSICAL SYMBOL RINFORZANDO +1D18D ; [*1131.0020.0002] # MUSICAL SYMBOL SUBITO +1D18E ; [*1132.0020.0002] # MUSICAL SYMBOL Z +1D18F ; [*1133.0020.0002] # MUSICAL SYMBOL PIANO +1D190 ; [*1134.0020.0002] # MUSICAL SYMBOL MEZZO +1D191 ; [*1135.0020.0002] # MUSICAL SYMBOL FORTE +1D192 ; [*1136.0020.0002] # MUSICAL SYMBOL CRESCENDO +1D193 ; [*1137.0020.0002] # MUSICAL SYMBOL DECRESCENDO +1D194 ; [*1138.0020.0002] # MUSICAL SYMBOL GRACE NOTE SLASH +1D195 ; [*1139.0020.0002] # MUSICAL SYMBOL GRACE NOTE NO SLASH +1D196 ; [*113A.0020.0002] # MUSICAL SYMBOL TR +1D197 ; [*113B.0020.0002] # MUSICAL SYMBOL TURN +1D198 ; [*113C.0020.0002] # MUSICAL SYMBOL INVERTED TURN +1D199 ; [*113D.0020.0002] # MUSICAL SYMBOL TURN SLASH +1D19A ; [*113E.0020.0002] # MUSICAL SYMBOL TURN UP +1D19B ; [*113F.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-1 +1D19C ; [*1140.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-2 +1D19D ; [*1141.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-3 +1D19E ; [*1142.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-4 +1D19F ; [*1143.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-5 +1D1A0 ; [*1144.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-6 +1D1A1 ; [*1145.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-7 +1D1A2 ; [*1146.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-8 +1D1A3 ; [*1147.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-9 +1D1A4 ; [*1148.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-10 +1D1A5 ; [*1149.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-11 +1D1A6 ; [*114A.0020.0002] # MUSICAL SYMBOL HAUPTSTIMME +1D1A7 ; [*114B.0020.0002] # MUSICAL SYMBOL NEBENSTIMME +1D1A8 ; [*114C.0020.0002] # MUSICAL SYMBOL END OF STIMME +1D1A9 ; [*114D.0020.0002] # MUSICAL SYMBOL DEGREE SLASH 1D1AA ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOWN BOW 1D1AB ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING UP BOW 1D1AC ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING HARMONIC 1D1AD ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D1AE ; [*1128.0020.0002] # MUSICAL SYMBOL PEDAL MARK -1D1AF ; [*1129.0020.0002] # MUSICAL SYMBOL PEDAL UP MARK -1D1B0 ; [*112A.0020.0002] # MUSICAL SYMBOL HALF PEDAL MARK -1D1B1 ; [*112B.0020.0002] # MUSICAL SYMBOL GLISSANDO UP -1D1B2 ; [*112C.0020.0002] # MUSICAL SYMBOL GLISSANDO DOWN -1D1B3 ; [*112D.0020.0002] # MUSICAL SYMBOL WITH FINGERNAILS -1D1B4 ; [*112E.0020.0002] # MUSICAL SYMBOL DAMP -1D1B5 ; [*112F.0020.0002] # MUSICAL SYMBOL DAMP ALL -1D1B6 ; [*1130.0020.0002] # MUSICAL SYMBOL MAXIMA -1D1B7 ; [*1131.0020.0002] # MUSICAL SYMBOL LONGA -1D1B8 ; [*1132.0020.0002] # MUSICAL SYMBOL BREVIS -1D1B9 ; [*1133.0020.0002] # MUSICAL SYMBOL SEMIBREVIS WHITE -1D1BA ; [*1134.0020.0002] # MUSICAL SYMBOL SEMIBREVIS BLACK -1D1BB ; [*1133.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA -1D1BC ; [*1134.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA BLACK -1D1BD ; [*1133.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA WHITE -1D1BE ; [*1134.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA BLACK -1D1BF ; [*1133.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA WHITE -1D1C0 ; [*1134.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA BLACK -1D1C1 ; [*1135.0020.0002] # MUSICAL SYMBOL LONGA PERFECTA REST -1D1C2 ; [*1136.0020.0002] # MUSICAL SYMBOL LONGA IMPERFECTA REST -1D1C3 ; [*1137.0020.0002] # MUSICAL SYMBOL BREVIS REST -1D1C4 ; [*1138.0020.0002] # MUSICAL SYMBOL SEMIBREVIS REST -1D1C5 ; [*1139.0020.0002] # MUSICAL SYMBOL MINIMA REST -1D1C6 ; [*113A.0020.0002] # MUSICAL SYMBOL SEMIMINIMA REST -1D1C7 ; [*113B.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA -1D1C8 ; [*113C.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA -1D1C9 ; [*113D.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 -1D1CA ; [*113E.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA -1D1CB ; [*113F.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA -1D1CC ; [*1140.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 -1D1CD ; [*1141.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 -1D1CE ; [*1142.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 -1D1CF ; [*1143.0020.0002] # MUSICAL SYMBOL CROIX -1D1D0 ; [*1144.0020.0002] # MUSICAL SYMBOL GREGORIAN C CLEF -1D1D1 ; [*1145.0020.0002] # MUSICAL SYMBOL GREGORIAN F CLEF -1D1D2 ; [*1146.0020.0002] # MUSICAL SYMBOL SQUARE B -1D1D3 ; [*1147.0020.0002] # MUSICAL SYMBOL VIRGA -1D1D4 ; [*1148.0020.0002] # MUSICAL SYMBOL PODATUS -1D1D5 ; [*1149.0020.0002] # MUSICAL SYMBOL CLIVIS -1D1D6 ; [*114A.0020.0002] # MUSICAL SYMBOL SCANDICUS -1D1D7 ; [*114B.0020.0002] # MUSICAL SYMBOL CLIMACUS -1D1D8 ; [*114C.0020.0002] # MUSICAL SYMBOL TORCULUS -1D1D9 ; [*114D.0020.0002] # MUSICAL SYMBOL PORRECTUS -1D1DA ; [*114E.0020.0002] # MUSICAL SYMBOL PORRECTUS FLEXUS -1D1DB ; [*114F.0020.0002] # MUSICAL SYMBOL SCANDICUS FLEXUS -1D1DC ; [*1150.0020.0002] # MUSICAL SYMBOL TORCULUS RESUPINUS -1D1DD ; [*1151.0020.0002] # MUSICAL SYMBOL PES SUBPUNCTIS -1D1DE ; [*1152.0020.0002] # MUSICAL SYMBOL KIEVAN C CLEF -1D1DF ; [*1153.0020.0002] # MUSICAL SYMBOL KIEVAN END OF PIECE -1D1E0 ; [*1154.0020.0002] # MUSICAL SYMBOL KIEVAN FINAL NOTE -1D1E1 ; [*1155.0020.0002] # MUSICAL SYMBOL KIEVAN RECITATIVE MARK -1D1E2 ; [*1156.0020.0002] # MUSICAL SYMBOL KIEVAN WHOLE NOTE -1D1E3 ; [*1157.0020.0002] # MUSICAL SYMBOL KIEVAN HALF NOTE -1D1E4 ; [*1158.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN -1D1E5 ; [*1159.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP -1D1E6 ; [*115A.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN -1D1E7 ; [*115B.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP -1D1E8 ; [*115C.0020.0002] # MUSICAL SYMBOL KIEVAN FLAT SIGN -1D200 ; [*115D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-1 -1D201 ; [*115E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-2 -1D202 ; [*115F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-3 -1D203 ; [*1160.0020.0002] # GREEK VOCAL NOTATION SYMBOL-4 -1D204 ; [*1161.0020.0002] # GREEK VOCAL NOTATION SYMBOL-5 -1D205 ; [*1162.0020.0002] # GREEK VOCAL NOTATION SYMBOL-6 -1D206 ; [*1163.0020.0002] # GREEK VOCAL NOTATION SYMBOL-7 -1D207 ; [*1164.0020.0002] # GREEK VOCAL NOTATION SYMBOL-8 -1D208 ; [*1165.0020.0002] # GREEK VOCAL NOTATION SYMBOL-9 -1D209 ; [*1166.0020.0002] # GREEK VOCAL NOTATION SYMBOL-10 -1D20A ; [*1167.0020.0002] # GREEK VOCAL NOTATION SYMBOL-11 -1D20B ; [*1168.0020.0002] # GREEK VOCAL NOTATION SYMBOL-12 -1D20C ; [*1169.0020.0002] # GREEK VOCAL NOTATION SYMBOL-13 -1D20D ; [*116A.0020.0002] # GREEK VOCAL NOTATION SYMBOL-14 -1D20E ; [*116B.0020.0002] # GREEK VOCAL NOTATION SYMBOL-15 -1D20F ; [*116C.0020.0002] # GREEK VOCAL NOTATION SYMBOL-16 -1D210 ; [*116D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-17 -1D211 ; [*116E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-18 -1D212 ; [*116F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-19 -1D213 ; [*1170.0020.0002] # GREEK VOCAL NOTATION SYMBOL-20 -1D214 ; [*1171.0020.0002] # GREEK VOCAL NOTATION SYMBOL-21 -1D215 ; [*1172.0020.0002] # GREEK VOCAL NOTATION SYMBOL-22 -1D216 ; [*1173.0020.0002] # GREEK VOCAL NOTATION SYMBOL-23 -1D217 ; [*1174.0020.0002] # GREEK VOCAL NOTATION SYMBOL-24 -1D218 ; [*1175.0020.0002] # GREEK VOCAL NOTATION SYMBOL-50 -1D219 ; [*1176.0020.0002] # GREEK VOCAL NOTATION SYMBOL-51 -1D21A ; [*1177.0020.0002] # GREEK VOCAL NOTATION SYMBOL-52 -1D21B ; [*1178.0020.0002] # GREEK VOCAL NOTATION SYMBOL-53 -1D21C ; [*1179.0020.0002] # GREEK VOCAL NOTATION SYMBOL-54 -1D21D ; [*117A.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-1 -1D21E ; [*117B.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-2 -1D21F ; [*117C.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-4 -1D220 ; [*117D.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-5 -1D221 ; [*117E.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-7 -1D222 ; [*117F.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-8 -1D223 ; [*1180.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-11 -1D224 ; [*1181.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-12 -1D225 ; [*1182.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-13 -1D226 ; [*1183.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-14 -1D227 ; [*1184.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-17 -1D228 ; [*1185.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-18 -1D229 ; [*1186.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-19 -1D22A ; [*1187.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-23 -1D22B ; [*1188.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-24 -1D22C ; [*1189.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-25 -1D22D ; [*118A.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-26 -1D22E ; [*118B.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-27 -1D22F ; [*118C.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-29 -1D230 ; [*118D.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-30 -1D231 ; [*118E.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-32 -1D232 ; [*118F.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-36 -1D233 ; [*1190.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-37 -1D234 ; [*1191.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-38 -1D235 ; [*1192.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-39 -1D236 ; [*1193.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-40 -1D237 ; [*1194.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-42 -1D238 ; [*1195.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-43 -1D239 ; [*1196.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-45 -1D23A ; [*1197.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-47 -1D23B ; [*1198.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-48 -1D23C ; [*1199.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-49 -1D23D ; [*119A.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-50 -1D23E ; [*119B.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-51 -1D23F ; [*119C.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-52 -1D240 ; [*119D.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-53 -1D241 ; [*119E.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D1AE ; [*114E.0020.0002] # MUSICAL SYMBOL PEDAL MARK +1D1AF ; [*114F.0020.0002] # MUSICAL SYMBOL PEDAL UP MARK +1D1B0 ; [*1150.0020.0002] # MUSICAL SYMBOL HALF PEDAL MARK +1D1B1 ; [*1151.0020.0002] # MUSICAL SYMBOL GLISSANDO UP +1D1B2 ; [*1152.0020.0002] # MUSICAL SYMBOL GLISSANDO DOWN +1D1B3 ; [*1153.0020.0002] # MUSICAL SYMBOL WITH FINGERNAILS +1D1B4 ; [*1154.0020.0002] # MUSICAL SYMBOL DAMP +1D1B5 ; [*1155.0020.0002] # MUSICAL SYMBOL DAMP ALL +1D1B6 ; [*1156.0020.0002] # MUSICAL SYMBOL MAXIMA +1D1B7 ; [*1157.0020.0002] # MUSICAL SYMBOL LONGA +1D1B8 ; [*1158.0020.0002] # MUSICAL SYMBOL BREVIS +1D1B9 ; [*1159.0020.0002] # MUSICAL SYMBOL SEMIBREVIS WHITE +1D1BA ; [*115A.0020.0002] # MUSICAL SYMBOL SEMIBREVIS BLACK +1D1BB ; [*1159.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA +1D1BC ; [*115A.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA BLACK +1D1BD ; [*1159.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE ; [*115A.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF ; [*1159.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA WHITE +1D1C0 ; [*115A.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA BLACK +1D1C1 ; [*115B.0020.0002] # MUSICAL SYMBOL LONGA PERFECTA REST +1D1C2 ; [*115C.0020.0002] # MUSICAL SYMBOL LONGA IMPERFECTA REST +1D1C3 ; [*115D.0020.0002] # MUSICAL SYMBOL BREVIS REST +1D1C4 ; [*115E.0020.0002] # MUSICAL SYMBOL SEMIBREVIS REST +1D1C5 ; [*115F.0020.0002] # MUSICAL SYMBOL MINIMA REST +1D1C6 ; [*1160.0020.0002] # MUSICAL SYMBOL SEMIMINIMA REST +1D1C7 ; [*1161.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA +1D1C8 ; [*1162.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA +1D1C9 ; [*1163.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 +1D1CA ; [*1164.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA +1D1CB ; [*1165.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA +1D1CC ; [*1166.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 +1D1CD ; [*1167.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 +1D1CE ; [*1168.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 +1D1CF ; [*1169.0020.0002] # MUSICAL SYMBOL CROIX +1D1D0 ; [*116A.0020.0002] # MUSICAL SYMBOL GREGORIAN C CLEF +1D1D1 ; [*116B.0020.0002] # MUSICAL SYMBOL GREGORIAN F CLEF +1D1D2 ; [*116C.0020.0002] # MUSICAL SYMBOL SQUARE B +1D1D3 ; [*116D.0020.0002] # MUSICAL SYMBOL VIRGA +1D1D4 ; [*116E.0020.0002] # MUSICAL SYMBOL PODATUS +1D1D5 ; [*116F.0020.0002] # MUSICAL SYMBOL CLIVIS +1D1D6 ; [*1170.0020.0002] # MUSICAL SYMBOL SCANDICUS +1D1D7 ; [*1171.0020.0002] # MUSICAL SYMBOL CLIMACUS +1D1D8 ; [*1172.0020.0002] # MUSICAL SYMBOL TORCULUS +1D1D9 ; [*1173.0020.0002] # MUSICAL SYMBOL PORRECTUS +1D1DA ; [*1174.0020.0002] # MUSICAL SYMBOL PORRECTUS FLEXUS +1D1DB ; [*1175.0020.0002] # MUSICAL SYMBOL SCANDICUS FLEXUS +1D1DC ; [*1176.0020.0002] # MUSICAL SYMBOL TORCULUS RESUPINUS +1D1DD ; [*1177.0020.0002] # MUSICAL SYMBOL PES SUBPUNCTIS +1D1DE ; [*1178.0020.0002] # MUSICAL SYMBOL KIEVAN C CLEF +1D1DF ; [*1179.0020.0002] # MUSICAL SYMBOL KIEVAN END OF PIECE +1D1E0 ; [*117A.0020.0002] # MUSICAL SYMBOL KIEVAN FINAL NOTE +1D1E1 ; [*117B.0020.0002] # MUSICAL SYMBOL KIEVAN RECITATIVE MARK +1D1E2 ; [*117C.0020.0002] # MUSICAL SYMBOL KIEVAN WHOLE NOTE +1D1E3 ; [*117D.0020.0002] # MUSICAL SYMBOL KIEVAN HALF NOTE +1D1E4 ; [*117E.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN +1D1E5 ; [*117F.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP +1D1E6 ; [*1180.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN +1D1E7 ; [*1181.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP +1D1E8 ; [*1182.0020.0002] # MUSICAL SYMBOL KIEVAN FLAT SIGN +1D200 ; [*1183.0020.0002] # GREEK VOCAL NOTATION SYMBOL-1 +1D201 ; [*1184.0020.0002] # GREEK VOCAL NOTATION SYMBOL-2 +1D202 ; [*1185.0020.0002] # GREEK VOCAL NOTATION SYMBOL-3 +1D203 ; [*1186.0020.0002] # GREEK VOCAL NOTATION SYMBOL-4 +1D204 ; [*1187.0020.0002] # GREEK VOCAL NOTATION SYMBOL-5 +1D205 ; [*1188.0020.0002] # GREEK VOCAL NOTATION SYMBOL-6 +1D206 ; [*1189.0020.0002] # GREEK VOCAL NOTATION SYMBOL-7 +1D207 ; [*118A.0020.0002] # GREEK VOCAL NOTATION SYMBOL-8 +1D208 ; [*118B.0020.0002] # GREEK VOCAL NOTATION SYMBOL-9 +1D209 ; [*118C.0020.0002] # GREEK VOCAL NOTATION SYMBOL-10 +1D20A ; [*118D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-11 +1D20B ; [*118E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-12 +1D20C ; [*118F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-13 +1D20D ; [*1190.0020.0002] # GREEK VOCAL NOTATION SYMBOL-14 +1D20E ; [*1191.0020.0002] # GREEK VOCAL NOTATION SYMBOL-15 +1D20F ; [*1192.0020.0002] # GREEK VOCAL NOTATION SYMBOL-16 +1D210 ; [*1193.0020.0002] # GREEK VOCAL NOTATION SYMBOL-17 +1D211 ; [*1194.0020.0002] # GREEK VOCAL NOTATION SYMBOL-18 +1D212 ; [*1195.0020.0002] # GREEK VOCAL NOTATION SYMBOL-19 +1D213 ; [*1196.0020.0002] # GREEK VOCAL NOTATION SYMBOL-20 +1D214 ; [*1197.0020.0002] # GREEK VOCAL NOTATION SYMBOL-21 +1D215 ; [*1198.0020.0002] # GREEK VOCAL NOTATION SYMBOL-22 +1D216 ; [*1199.0020.0002] # GREEK VOCAL NOTATION SYMBOL-23 +1D217 ; [*119A.0020.0002] # GREEK VOCAL NOTATION SYMBOL-24 +1D218 ; [*119B.0020.0002] # GREEK VOCAL NOTATION SYMBOL-50 +1D219 ; [*119C.0020.0002] # GREEK VOCAL NOTATION SYMBOL-51 +1D21A ; [*119D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-52 +1D21B ; [*119E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-53 +1D21C ; [*119F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-54 +1D21D ; [*11A0.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-1 +1D21E ; [*11A1.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-2 +1D21F ; [*11A2.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-4 +1D220 ; [*11A3.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-5 +1D221 ; [*11A4.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-7 +1D222 ; [*11A5.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-8 +1D223 ; [*11A6.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-11 +1D224 ; [*11A7.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-12 +1D225 ; [*11A8.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-13 +1D226 ; [*11A9.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-14 +1D227 ; [*11AA.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-17 +1D228 ; [*11AB.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-18 +1D229 ; [*11AC.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-19 +1D22A ; [*11AD.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-23 +1D22B ; [*11AE.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-24 +1D22C ; [*11AF.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-25 +1D22D ; [*11B0.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-26 +1D22E ; [*11B1.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-27 +1D22F ; [*11B2.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-29 +1D230 ; [*11B3.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-30 +1D231 ; [*11B4.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-32 +1D232 ; [*11B5.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-36 +1D233 ; [*11B6.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-37 +1D234 ; [*11B7.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-38 +1D235 ; [*11B8.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-39 +1D236 ; [*11B9.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-40 +1D237 ; [*11BA.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-42 +1D238 ; [*11BB.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-43 +1D239 ; [*11BC.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-45 +1D23A ; [*11BD.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-47 +1D23B ; [*11BE.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-48 +1D23C ; [*11BF.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-49 +1D23D ; [*11C0.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-50 +1D23E ; [*11C1.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-51 +1D23F ; [*11C2.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-52 +1D240 ; [*11C3.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-53 +1D241 ; [*11C4.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D242 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL TRISEME 1D243 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL TETRASEME 1D244 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL PENTASEME -1D245 ; [*119F.0020.0002] # GREEK MUSICAL LEIMMA -1D300 ; [*0EC6.0020.0002] # MONOGRAM FOR EARTH -1D301 ; [*0EC7.0020.0002] # DIGRAM FOR HEAVENLY EARTH -1D302 ; [*0EC8.0020.0002] # DIGRAM FOR HUMAN EARTH -1D303 ; [*0EC9.0020.0002] # DIGRAM FOR EARTHLY HEAVEN -1D304 ; [*0ECA.0020.0002] # DIGRAM FOR EARTHLY HUMAN -1D305 ; [*0ECB.0020.0002] # DIGRAM FOR EARTH -1D306 ; [*0ECC.0020.0002] # TETRAGRAM FOR CENTRE -1D307 ; [*0ECD.0020.0002] # TETRAGRAM FOR FULL CIRCLE -1D308 ; [*0ECE.0020.0002] # TETRAGRAM FOR MIRED -1D309 ; [*0ECF.0020.0002] # TETRAGRAM FOR BARRIER -1D30A ; [*0ED0.0020.0002] # TETRAGRAM FOR KEEPING SMALL -1D30B ; [*0ED1.0020.0002] # TETRAGRAM FOR CONTRARIETY -1D30C ; [*0ED2.0020.0002] # TETRAGRAM FOR ASCENT -1D30D ; [*0ED3.0020.0002] # TETRAGRAM FOR OPPOSITION -1D30E ; [*0ED4.0020.0002] # TETRAGRAM FOR BRANCHING OUT -1D30F ; [*0ED5.0020.0002] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION -1D310 ; [*0ED6.0020.0002] # TETRAGRAM FOR DIVERGENCE -1D311 ; [*0ED7.0020.0002] # TETRAGRAM FOR YOUTHFULNESS -1D312 ; [*0ED8.0020.0002] # TETRAGRAM FOR INCREASE -1D313 ; [*0ED9.0020.0002] # TETRAGRAM FOR PENETRATION -1D314 ; [*0EDA.0020.0002] # TETRAGRAM FOR REACH -1D315 ; [*0EDB.0020.0002] # TETRAGRAM FOR CONTACT -1D316 ; [*0EDC.0020.0002] # TETRAGRAM FOR HOLDING BACK -1D317 ; [*0EDD.0020.0002] # TETRAGRAM FOR WAITING -1D318 ; [*0EDE.0020.0002] # TETRAGRAM FOR FOLLOWING -1D319 ; [*0EDF.0020.0002] # TETRAGRAM FOR ADVANCE -1D31A ; [*0EE0.0020.0002] # TETRAGRAM FOR RELEASE -1D31B ; [*0EE1.0020.0002] # TETRAGRAM FOR RESISTANCE -1D31C ; [*0EE2.0020.0002] # TETRAGRAM FOR EASE -1D31D ; [*0EE3.0020.0002] # TETRAGRAM FOR JOY -1D31E ; [*0EE4.0020.0002] # TETRAGRAM FOR CONTENTION -1D31F ; [*0EE5.0020.0002] # TETRAGRAM FOR ENDEAVOUR -1D320 ; [*0EE6.0020.0002] # TETRAGRAM FOR DUTIES -1D321 ; [*0EE7.0020.0002] # TETRAGRAM FOR CHANGE -1D322 ; [*0EE8.0020.0002] # TETRAGRAM FOR DECISIVENESS -1D323 ; [*0EE9.0020.0002] # TETRAGRAM FOR BOLD RESOLUTION -1D324 ; [*0EEA.0020.0002] # TETRAGRAM FOR PACKING -1D325 ; [*0EEB.0020.0002] # TETRAGRAM FOR LEGION -1D326 ; [*0EEC.0020.0002] # TETRAGRAM FOR CLOSENESS -1D327 ; [*0EED.0020.0002] # TETRAGRAM FOR KINSHIP -1D328 ; [*0EEE.0020.0002] # TETRAGRAM FOR GATHERING -1D329 ; [*0EEF.0020.0002] # TETRAGRAM FOR STRENGTH -1D32A ; [*0EF0.0020.0002] # TETRAGRAM FOR PURITY -1D32B ; [*0EF1.0020.0002] # TETRAGRAM FOR FULLNESS -1D32C ; [*0EF2.0020.0002] # TETRAGRAM FOR RESIDENCE -1D32D ; [*0EF3.0020.0002] # TETRAGRAM FOR LAW OR MODEL -1D32E ; [*0EF4.0020.0002] # TETRAGRAM FOR RESPONSE -1D32F ; [*0EF5.0020.0002] # TETRAGRAM FOR GOING TO MEET -1D330 ; [*0EF6.0020.0002] # TETRAGRAM FOR ENCOUNTERS -1D331 ; [*0EF7.0020.0002] # TETRAGRAM FOR STOVE -1D332 ; [*0EF8.0020.0002] # TETRAGRAM FOR GREATNESS -1D333 ; [*0EF9.0020.0002] # TETRAGRAM FOR ENLARGEMENT -1D334 ; [*0EFA.0020.0002] # TETRAGRAM FOR PATTERN -1D335 ; [*0EFB.0020.0002] # TETRAGRAM FOR RITUAL -1D336 ; [*0EFC.0020.0002] # TETRAGRAM FOR FLIGHT -1D337 ; [*0EFD.0020.0002] # TETRAGRAM FOR VASTNESS OR WASTING -1D338 ; [*0EFE.0020.0002] # TETRAGRAM FOR CONSTANCY -1D339 ; [*0EFF.0020.0002] # TETRAGRAM FOR MEASURE -1D33A ; [*0F00.0020.0002] # TETRAGRAM FOR ETERNITY -1D33B ; [*0F01.0020.0002] # TETRAGRAM FOR UNITY -1D33C ; [*0F02.0020.0002] # TETRAGRAM FOR DIMINISHMENT -1D33D ; [*0F03.0020.0002] # TETRAGRAM FOR CLOSED MOUTH -1D33E ; [*0F04.0020.0002] # TETRAGRAM FOR GUARDEDNESS -1D33F ; [*0F05.0020.0002] # TETRAGRAM FOR GATHERING IN -1D340 ; [*0F06.0020.0002] # TETRAGRAM FOR MASSING -1D341 ; [*0F07.0020.0002] # TETRAGRAM FOR ACCUMULATION -1D342 ; [*0F08.0020.0002] # TETRAGRAM FOR EMBELLISHMENT -1D343 ; [*0F09.0020.0002] # TETRAGRAM FOR DOUBT -1D344 ; [*0F0A.0020.0002] # TETRAGRAM FOR WATCH -1D345 ; [*0F0B.0020.0002] # TETRAGRAM FOR SINKING -1D346 ; [*0F0C.0020.0002] # TETRAGRAM FOR INNER -1D347 ; [*0F0D.0020.0002] # TETRAGRAM FOR DEPARTURE -1D348 ; [*0F0E.0020.0002] # TETRAGRAM FOR DARKENING -1D349 ; [*0F0F.0020.0002] # TETRAGRAM FOR DIMMING -1D34A ; [*0F10.0020.0002] # TETRAGRAM FOR EXHAUSTION -1D34B ; [*0F11.0020.0002] # TETRAGRAM FOR SEVERANCE -1D34C ; [*0F12.0020.0002] # TETRAGRAM FOR STOPPAGE -1D34D ; [*0F13.0020.0002] # TETRAGRAM FOR HARDNESS -1D34E ; [*0F14.0020.0002] # TETRAGRAM FOR COMPLETION -1D34F ; [*0F15.0020.0002] # TETRAGRAM FOR CLOSURE -1D350 ; [*0F16.0020.0002] # TETRAGRAM FOR FAILURE -1D351 ; [*0F17.0020.0002] # TETRAGRAM FOR AGGRAVATION -1D352 ; [*0F18.0020.0002] # TETRAGRAM FOR COMPLIANCE -1D353 ; [*0F19.0020.0002] # TETRAGRAM FOR ON THE VERGE -1D354 ; [*0F1A.0020.0002] # TETRAGRAM FOR DIFFICULTIES -1D355 ; [*0F1B.0020.0002] # TETRAGRAM FOR LABOURING -1D356 ; [*0F1C.0020.0002] # TETRAGRAM FOR FOSTERING -1D369 ; [*1B6B.0020.0002] # COUNTING ROD TENS DIGIT ONE -1D36A ; [*1B6C.0020.0002] # COUNTING ROD TENS DIGIT TWO -1D36B ; [*1B6D.0020.0002] # COUNTING ROD TENS DIGIT THREE -1D36C ; [*1B6E.0020.0002] # COUNTING ROD TENS DIGIT FOUR -1D36D ; [*1B6F.0020.0002] # COUNTING ROD TENS DIGIT FIVE -1D36E ; [*1B70.0020.0002] # COUNTING ROD TENS DIGIT SIX -1D36F ; [*1B71.0020.0002] # COUNTING ROD TENS DIGIT SEVEN -1D370 ; [*1B72.0020.0002] # COUNTING ROD TENS DIGIT EIGHT -1D371 ; [*1B73.0020.0002] # COUNTING ROD TENS DIGIT NINE -1D6C1 ; [*05EC.0020.0005] # MATHEMATICAL BOLD NABLA -1D6DB ; [*05E8.0020.0005] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6FB ; [*05EC.0020.0005] # MATHEMATICAL ITALIC NABLA -1D715 ; [*05E8.0020.0005] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D735 ; [*05EC.0020.0005] # MATHEMATICAL BOLD ITALIC NABLA -1D74F ; [*05E8.0020.0005] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D76F ; [*05EC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD NABLA -1D789 ; [*05E8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D7A9 ; [*05EC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7C3 ; [*05E8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D800 ; [*17CF.0020.0002] # SIGNWRITING HAND-FIST INDEX -1D801 ; [*17D0.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX -1D802 ; [*17D1.0020.0002] # SIGNWRITING HAND-CUP INDEX -1D803 ; [*17D2.0020.0002] # SIGNWRITING HAND-OVAL INDEX -1D804 ; [*17D3.0020.0002] # SIGNWRITING HAND-HINGE INDEX -1D805 ; [*17D4.0020.0002] # SIGNWRITING HAND-ANGLE INDEX -1D806 ; [*17D5.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT -1D807 ; [*17D6.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX BENT -1D808 ; [*17D7.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT -1D809 ; [*17D8.0020.0002] # SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE -1D80A ; [*17D9.0020.0002] # SIGNWRITING HAND-FIST INDEX CUPPED -1D80B ; [*17DA.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED -1D80C ; [*17DB.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED LOW -1D80D ; [*17DC.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX HINGE -1D80E ; [*17DD.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE -1D80F ; [*17DE.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE -1D810 ; [*17DF.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT -1D811 ; [*17E0.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES -1D812 ; [*17E1.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED -1D813 ; [*17E2.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED -1D814 ; [*17E3.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP -1D815 ; [*17E4.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED -1D816 ; [*17E5.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT -1D817 ; [*17E6.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT -1D818 ; [*17E7.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED -1D819 ; [*17E8.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED -1D81A ; [*17E9.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED -1D81B ; [*17EA.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED -1D81C ; [*17EB.0020.0002] # SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX -1D81D ; [*17EC.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE -1D81E ; [*17ED.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB -1D81F ; [*17EE.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB -1D820 ; [*17EF.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT -1D821 ; [*17F0.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT -1D822 ; [*17F1.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT -1D823 ; [*17F2.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE -1D824 ; [*17F3.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE -1D825 ; [*17F4.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED -1D826 ; [*17F5.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE -1D827 ; [*17F6.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD -1D828 ; [*17F7.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED -1D829 ; [*17F8.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED -1D82A ; [*17F9.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED -1D82B ; [*17FA.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED -1D82C ; [*17FB.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT -1D82D ; [*17FC.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE -1D82E ; [*17FD.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED -1D82F ; [*17FE.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT -1D830 ; [*17FF.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP -1D831 ; [*1800.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP -1D832 ; [*1801.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE -1D833 ; [*1802.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE -1D834 ; [*1803.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD -1D835 ; [*1804.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD -1D836 ; [*1805.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP -1D837 ; [*1806.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP -1D838 ; [*1807.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP -1D839 ; [*1808.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED -1D83A ; [*1809.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP -1D83B ; [*180A.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP -1D83C ; [*180B.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP -1D83D ; [*180C.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED -1D83E ; [*180D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT -1D83F ; [*180E.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED -1D840 ; [*180F.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP -1D841 ; [*1810.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED -1D842 ; [*1811.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP -1D843 ; [*1812.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED -1D844 ; [*1813.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS -1D845 ; [*1814.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS BENT -1D846 ; [*1815.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS HINGED -1D847 ; [*1816.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED -1D848 ; [*1817.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT -1D849 ; [*1818.0020.0002] # SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED -1D84A ; [*1819.0020.0002] # SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT -1D84B ; [*181A.0020.0002] # SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED -1D84C ; [*181B.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD -1D84D ; [*181C.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD -1D84E ; [*181D.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT -1D84F ; [*181E.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT -1D850 ; [*181F.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT -1D851 ; [*1820.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT -1D852 ; [*1821.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD -1D853 ; [*1822.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD -1D854 ; [*1823.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN -1D855 ; [*1824.0020.0002] # SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN -1D856 ; [*1825.0020.0002] # SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD -1D857 ; [*1826.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED -1D858 ; [*1827.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE -1D859 ; [*1828.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB -1D85A ; [*1829.0020.0002] # SIGNWRITING HAND-FLAT -1D85B ; [*182A.0020.0002] # SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS -1D85C ; [*182B.0020.0002] # SIGNWRITING HAND-FLAT HEEL -1D85D ; [*182C.0020.0002] # SIGNWRITING HAND-FLAT THUMB SIDE -1D85E ; [*182D.0020.0002] # SIGNWRITING HAND-FLAT HEEL THUMB SIDE -1D85F ; [*182E.0020.0002] # SIGNWRITING HAND-FLAT THUMB BENT -1D860 ; [*182F.0020.0002] # SIGNWRITING HAND-FLAT THUMB FORWARD -1D861 ; [*1830.0020.0002] # SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE -1D862 ; [*1831.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE -1D863 ; [*1832.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE -1D864 ; [*1833.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT -1D865 ; [*1834.0020.0002] # SIGNWRITING HAND-FLAT SPLIT LITTLE -1D866 ; [*1835.0020.0002] # SIGNWRITING HAND-CLAW -1D867 ; [*1836.0020.0002] # SIGNWRITING HAND-CLAW THUMB SIDE -1D868 ; [*1837.0020.0002] # SIGNWRITING HAND-CLAW NO THUMB -1D869 ; [*1838.0020.0002] # SIGNWRITING HAND-CLAW THUMB FORWARD -1D86A ; [*1839.0020.0002] # SIGNWRITING HAND-HOOK CURLICUE -1D86B ; [*183A.0020.0002] # SIGNWRITING HAND-HOOK -1D86C ; [*183B.0020.0002] # SIGNWRITING HAND-CUP OPEN -1D86D ; [*183C.0020.0002] # SIGNWRITING HAND-CUP -1D86E ; [*183D.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB SIDE -1D86F ; [*183E.0020.0002] # SIGNWRITING HAND-CUP THUMB SIDE -1D870 ; [*183F.0020.0002] # SIGNWRITING HAND-CUP OPEN NO THUMB -1D871 ; [*1840.0020.0002] # SIGNWRITING HAND-CUP NO THUMB -1D872 ; [*1841.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB FORWARD -1D873 ; [*1842.0020.0002] # SIGNWRITING HAND-CUP THUMB FORWARD -1D874 ; [*1843.0020.0002] # SIGNWRITING HAND-CURLICUE OPEN -1D875 ; [*1844.0020.0002] # SIGNWRITING HAND-CURLICUE -1D876 ; [*1845.0020.0002] # SIGNWRITING HAND-CIRCLE -1D877 ; [*1846.0020.0002] # SIGNWRITING HAND-OVAL -1D878 ; [*1847.0020.0002] # SIGNWRITING HAND-OVAL THUMB SIDE -1D879 ; [*1848.0020.0002] # SIGNWRITING HAND-OVAL NO THUMB -1D87A ; [*1849.0020.0002] # SIGNWRITING HAND-OVAL THUMB FORWARD -1D87B ; [*184A.0020.0002] # SIGNWRITING HAND-HINGE OPEN -1D87C ; [*184B.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB FORWARD -1D87D ; [*184C.0020.0002] # SIGNWRITING HAND-HINGE -1D87E ; [*184D.0020.0002] # SIGNWRITING HAND-HINGE SMALL -1D87F ; [*184E.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB SIDE -1D880 ; [*184F.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE -1D881 ; [*1850.0020.0002] # SIGNWRITING HAND-HINGE OPEN NO THUMB -1D882 ; [*1851.0020.0002] # SIGNWRITING HAND-HINGE NO THUMB -1D883 ; [*1852.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX -1D884 ; [*1853.0020.0002] # SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING -1D885 ; [*1854.0020.0002] # SIGNWRITING HAND-ANGLE -1D886 ; [*1855.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING -1D887 ; [*1856.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING -1D888 ; [*1857.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING -1D889 ; [*1858.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE RING -1D88A ; [*1859.0020.0002] # SIGNWRITING HAND-HINGE LITTLE -1D88B ; [*185A.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT -1D88C ; [*185B.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED -1D88D ; [*185C.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED -1D88E ; [*185D.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN -1D88F ; [*185E.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT -1D890 ; [*185F.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED -1D891 ; [*1860.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED -1D892 ; [*1861.0020.0002] # SIGNWRITING HAND-FIST LITTLE UP -1D893 ; [*1862.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP -1D894 ; [*1863.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE UP -1D895 ; [*1864.0020.0002] # SIGNWRITING HAND-OVAL LITTLE UP -1D896 ; [*1865.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE UP -1D897 ; [*1866.0020.0002] # SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE -1D898 ; [*1867.0020.0002] # SIGNWRITING HAND-FIST LITTLE BENT -1D899 ; [*1868.0020.0002] # SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB -1D89A ; [*1869.0020.0002] # SIGNWRITING HAND-FIST LITTLE THUMB -1D89B ; [*186A.0020.0002] # SIGNWRITING HAND-HINGE LITTLE THUMB -1D89C ; [*186B.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX THUMB -1D89D ; [*186C.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX THUMB -1D89E ; [*186D.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT -1D89F ; [*186E.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB -1D8A0 ; [*186F.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX -1D8A1 ; [*1870.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE INDEX -1D8A2 ; [*1871.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX -1D8A3 ; [*1872.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX -1D8A4 ; [*1873.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE -1D8A5 ; [*1874.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE -1D8A6 ; [*1875.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE -1D8A7 ; [*1876.0020.0002] # SIGNWRITING HAND-HINGE RING -1D8A8 ; [*1877.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE -1D8A9 ; [*1878.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE -1D8AA ; [*1879.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE -1D8AB ; [*187A.0020.0002] # SIGNWRITING HAND-FIST RING DOWN -1D8AC ; [*187B.0020.0002] # SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE -1D8AD ; [*187C.0020.0002] # SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS -1D8AE ; [*187D.0020.0002] # SIGNWRITING HAND-FIST RING UP -1D8AF ; [*187E.0020.0002] # SIGNWRITING HAND-FIST RING RAISED KNUCKLE -1D8B0 ; [*187F.0020.0002] # SIGNWRITING HAND-FIST RING LITTLE -1D8B1 ; [*1880.0020.0002] # SIGNWRITING HAND-CIRCLE RING LITTLE -1D8B2 ; [*1881.0020.0002] # SIGNWRITING HAND-OVAL RING LITTLE -1D8B3 ; [*1882.0020.0002] # SIGNWRITING HAND-ANGLE RING LITTLE -1D8B4 ; [*1883.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE -1D8B5 ; [*1884.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE CONJOINED -1D8B6 ; [*1885.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES -1D8B7 ; [*1886.0020.0002] # SIGNWRITING HAND-FIST RING INDEX -1D8B8 ; [*1887.0020.0002] # SIGNWRITING HAND-FIST RING THUMB -1D8B9 ; [*1888.0020.0002] # SIGNWRITING HAND-HOOK RING THUMB -1D8BA ; [*1889.0020.0002] # SIGNWRITING HAND-FIST INDEX RING LITTLE -1D8BB ; [*188A.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX RING LITTLE -1D8BC ; [*188B.0020.0002] # SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON -1D8BD ; [*188C.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT -1D8BE ; [*188D.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE IN -1D8BF ; [*188E.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER -1D8C0 ; [*188F.0020.0002] # SIGNWRITING HAND-CUP INDEX RING LITTLE -1D8C1 ; [*1890.0020.0002] # SIGNWRITING HAND-HINGE INDEX RING LITTLE -1D8C2 ; [*1891.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT -1D8C3 ; [*1892.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE -1D8C4 ; [*1893.0020.0002] # SIGNWRITING HAND-FIST MIDDLE DOWN -1D8C5 ; [*1894.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE -1D8C6 ; [*1895.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP -1D8C7 ; [*1896.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE UP -1D8C8 ; [*1897.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE -1D8C9 ; [*1898.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE -1D8CA ; [*1899.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE THUMB -1D8CB ; [*189A.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE -1D8CC ; [*189B.0020.0002] # SIGNWRITING HAND-FIST MIDDLE LITTLE -1D8CD ; [*189C.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RING LITTLE -1D8CE ; [*189D.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE -1D8CF ; [*189E.0020.0002] # SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON -1D8D0 ; [*189F.0020.0002] # SIGNWRITING HAND-CUP MIDDLE RING LITTLE -1D8D1 ; [*18A0.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE RING LITTLE -1D8D2 ; [*18A1.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT -1D8D3 ; [*18A2.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN -1D8D4 ; [*18A3.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE -1D8D5 ; [*18A4.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT -1D8D6 ; [*18A5.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED -1D8D7 ; [*18A6.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE -1D8D8 ; [*18A7.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT -1D8D9 ; [*18A8.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN -1D8DA ; [*18A9.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED -1D8DB ; [*18AA.0020.0002] # SIGNWRITING HAND-HINGE INDEX HINGED -1D8DC ; [*18AB.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE -1D8DD ; [*18AC.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SIDE -1D8DE ; [*18AD.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL -1D8DF ; [*18AE.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED -1D8E0 ; [*18AF.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT -1D8E1 ; [*18B0.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT -1D8E2 ; [*18B1.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT -1D8E3 ; [*18B2.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE -1D8E4 ; [*18B3.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT -1D8E5 ; [*18B4.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT -1D8E6 ; [*18B5.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOK -1D8E7 ; [*18B6.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURLICUE -1D8E8 ; [*18B7.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE -1D8E9 ; [*18B8.0020.0002] # SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE -1D8EA ; [*18B9.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER -1D8EB ; [*18BA.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLE -1D8EC ; [*18BB.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB -1D8ED ; [*18BC.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB OPEN -1D8EE ; [*18BD.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB OPEN -1D8EF ; [*18BE.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB LARGE -1D8F0 ; [*18BF.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB -1D8F1 ; [*18C0.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SMALL -1D8F2 ; [*18C1.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB OUT -1D8F3 ; [*18C2.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB IN -1D8F4 ; [*18C3.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB -1D8F5 ; [*18C4.0020.0002] # SIGNWRITING HAND-FIST THUMB -1D8F6 ; [*18C5.0020.0002] # SIGNWRITING HAND-FIST THUMB HEEL -1D8F7 ; [*18C6.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL -1D8F8 ; [*18C7.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE CONJOINED -1D8F9 ; [*18C8.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE BENT -1D8FA ; [*18C9.0020.0002] # SIGNWRITING HAND-FIST THUMB FORWARD -1D8FB ; [*18CA.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE -1D8FC ; [*18CB.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING -1D8FD ; [*18CC.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE -1D8FE ; [*18CD.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS -1D8FF ; [*18CE.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS -1D900 ; [*18CF.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS -1D901 ; [*18D0.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS -1D902 ; [*18D1.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES -1D903 ; [*18D2.0020.0002] # SIGNWRITING HAND-FIST -1D904 ; [*18D3.0020.0002] # SIGNWRITING HAND-FIST HEEL -1D905 ; [*18D4.0020.0002] # SIGNWRITING TOUCH SINGLE -1D906 ; [*18D5.0020.0002] # SIGNWRITING TOUCH MULTIPLE -1D907 ; [*18D6.0020.0002] # SIGNWRITING TOUCH BETWEEN -1D908 ; [*18D7.0020.0002] # SIGNWRITING GRASP SINGLE -1D909 ; [*18D8.0020.0002] # SIGNWRITING GRASP MULTIPLE -1D90A ; [*18D9.0020.0002] # SIGNWRITING GRASP BETWEEN -1D90B ; [*18DA.0020.0002] # SIGNWRITING STRIKE SINGLE -1D90C ; [*18DB.0020.0002] # SIGNWRITING STRIKE MULTIPLE -1D90D ; [*18DC.0020.0002] # SIGNWRITING STRIKE BETWEEN -1D90E ; [*18DD.0020.0002] # SIGNWRITING BRUSH SINGLE -1D90F ; [*18DE.0020.0002] # SIGNWRITING BRUSH MULTIPLE -1D910 ; [*18DF.0020.0002] # SIGNWRITING BRUSH BETWEEN -1D911 ; [*18E0.0020.0002] # SIGNWRITING RUB SINGLE -1D912 ; [*18E1.0020.0002] # SIGNWRITING RUB MULTIPLE -1D913 ; [*18E2.0020.0002] # SIGNWRITING RUB BETWEEN -1D914 ; [*18E3.0020.0002] # SIGNWRITING SURFACE SYMBOLS -1D915 ; [*18E4.0020.0002] # SIGNWRITING SURFACE BETWEEN -1D916 ; [*18E5.0020.0002] # SIGNWRITING SQUEEZE LARGE SINGLE -1D917 ; [*18E6.0020.0002] # SIGNWRITING SQUEEZE SMALL SINGLE -1D918 ; [*18E7.0020.0002] # SIGNWRITING SQUEEZE LARGE MULTIPLE -1D919 ; [*18E8.0020.0002] # SIGNWRITING SQUEEZE SMALL MULTIPLE -1D91A ; [*18E9.0020.0002] # SIGNWRITING SQUEEZE SEQUENTIAL -1D91B ; [*18EA.0020.0002] # SIGNWRITING FLICK LARGE SINGLE -1D91C ; [*18EB.0020.0002] # SIGNWRITING FLICK SMALL SINGLE -1D91D ; [*18EC.0020.0002] # SIGNWRITING FLICK LARGE MULTIPLE -1D91E ; [*18ED.0020.0002] # SIGNWRITING FLICK SMALL MULTIPLE -1D91F ; [*18EE.0020.0002] # SIGNWRITING FLICK SEQUENTIAL -1D920 ; [*18EF.0020.0002] # SIGNWRITING SQUEEZE FLICK ALTERNATING -1D921 ; [*18F0.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE -1D922 ; [*18F1.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL -1D923 ; [*18F2.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL -1D924 ; [*18F3.0020.0002] # SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL -1D925 ; [*18F4.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE -1D926 ; [*18F5.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL -1D927 ; [*18F6.0020.0002] # SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS -1D928 ; [*18F7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT -1D929 ; [*18F8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT -1D92A ; [*18F9.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL -1D92B ; [*18FA.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM -1D92C ; [*18FB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE -1D92D ; [*18FC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST -1D92E ; [*18FD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX -1D92F ; [*18FE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT -1D930 ; [*18FF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX -1D931 ; [*1900.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING -1D932 ; [*1901.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX -1D933 ; [*1902.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CROSS -1D934 ; [*1903.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT -1D935 ; [*1904.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX -1D936 ; [*1905.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING -1D937 ; [*1906.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX -1D938 ; [*1907.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL -1D939 ; [*1908.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM -1D93A ; [*1909.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE -1D93B ; [*190A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL -1D93C ; [*190B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM -1D93D ; [*190C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE -1D93E ; [*190D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION -1D93F ; [*190E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL -1D940 ; [*190F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM -1D941 ; [*1910.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE -1D942 ; [*1911.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL -1D943 ; [*1912.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM -1D944 ; [*1913.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE -1D945 ; [*1914.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL -1D946 ; [*1915.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM -1D947 ; [*1916.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE -1D948 ; [*1917.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL -1D949 ; [*1918.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM -1D94A ; [*1919.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE -1D94B ; [*191A.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE -1D94C ; [*191B.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE -1D94D ; [*191C.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING -1D94E ; [*191D.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE -1D94F ; [*191E.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE -1D950 ; [*191F.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING -1D951 ; [*1920.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE SHAKING -1D952 ; [*1921.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE -1D953 ; [*1922.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE -1D954 ; [*1923.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE -1D955 ; [*1924.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL -1D956 ; [*1925.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM -1D957 ; [*1926.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE -1D958 ; [*1927.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST -1D959 ; [*1928.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL -1D95A ; [*1929.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM -1D95B ; [*192A.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE -1D95C ; [*192B.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST -1D95D ; [*192C.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL -1D95E ; [*192D.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM -1D95F ; [*192E.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE -1D960 ; [*192F.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST -1D961 ; [*1930.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL -1D962 ; [*1931.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM -1D963 ; [*1932.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE -1D964 ; [*1933.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST -1D965 ; [*1934.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL -1D966 ; [*1935.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM -1D967 ; [*1936.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE -1D968 ; [*1937.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST -1D969 ; [*1938.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX -1D96A ; [*1939.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT -1D96B ; [*193A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX -1D96C ; [*193B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING -1D96D ; [*193C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX -1D96E ; [*193D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CROSS -1D96F ; [*193E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT -1D970 ; [*193F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX -1D971 ; [*1940.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT -1D972 ; [*1941.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX -1D973 ; [*1942.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BEND -1D974 ; [*1943.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL -1D975 ; [*1944.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM -1D976 ; [*1945.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE -1D977 ; [*1946.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CHECK -1D978 ; [*1947.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL -1D979 ; [*1948.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM -1D97A ; [*1949.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE -1D97B ; [*194A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL -1D97C ; [*194B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM -1D97D ; [*194C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE -1D97E ; [*194D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL -1D97F ; [*194E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM -1D980 ; [*194F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE -1D981 ; [*1950.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE -1D982 ; [*1951.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE -1D983 ; [*1952.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING -1D984 ; [*1953.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE -1D985 ; [*1954.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE -1D986 ; [*1955.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING -1D987 ; [*1956.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE SHAKING -1D988 ; [*1957.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL -1D989 ; [*1958.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM -1D98A ; [*1959.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE -1D98B ; [*195A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST -1D98C ; [*195B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL -1D98D ; [*195C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM -1D98E ; [*195D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE -1D98F ; [*195E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST -1D990 ; [*195F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL -1D991 ; [*1960.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM -1D992 ; [*1961.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL -1D993 ; [*1962.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM -1D994 ; [*1963.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE -1D995 ; [*1964.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL -1D996 ; [*1965.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM -1D997 ; [*1966.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE -1D998 ; [*1967.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE -1D999 ; [*1968.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL -1D99A ; [*1969.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM -1D99B ; [*196A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE -1D99C ; [*196B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL -1D99D ; [*196C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM -1D99E ; [*196D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE -1D99F ; [*196E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT -1D9A0 ; [*196F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL -1D9A1 ; [*1970.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM -1D9A2 ; [*1971.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE -1D9A3 ; [*1972.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE -1D9A4 ; [*1973.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATE -1D9A5 ; [*1974.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SHAKING -1D9A6 ; [*1975.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL -1D9A7 ; [*1976.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL -1D9A8 ; [*1977.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL -1D9A9 ; [*1978.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL -1D9AA ; [*1979.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL -1D9AB ; [*197A.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL -1D9AC ; [*197B.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL -1D9AD ; [*197C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST -1D9AE ; [*197D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST -1D9AF ; [*197E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST -1D9B0 ; [*197F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST -1D9B1 ; [*1980.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST -1D9B2 ; [*1981.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST -1D9B3 ; [*1982.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST -1D9B4 ; [*1983.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL -1D9B5 ; [*1984.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM -1D9B6 ; [*1985.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE -1D9B7 ; [*1986.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL -1D9B8 ; [*1987.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE -1D9B9 ; [*1988.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE -1D9BA ; [*1989.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE -1D9BB ; [*198A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE -1D9BC ; [*198B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE -1D9BD ; [*198C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE -1D9BE ; [*198D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE -1D9BF ; [*198E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE -1D9C0 ; [*198F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE -1D9C1 ; [*1990.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL -1D9C2 ; [*1991.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE -1D9C3 ; [*1992.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING -1D9C4 ; [*1993.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING -1D9C5 ; [*1994.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING -1D9C6 ; [*1995.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL -1D9C7 ; [*1996.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE -1D9C8 ; [*1997.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE -1D9C9 ; [*1998.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE -1D9CA ; [*1999.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE -1D9CB ; [*199A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE -1D9CC ; [*199B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE -1D9CD ; [*199C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE -1D9CE ; [*199D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE -1D9CF ; [*199E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE -1D9D0 ; [*199F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL -1D9D1 ; [*19A0.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE -1D9D2 ; [*19A1.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR -1D9D3 ; [*19A2.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR -1D9D4 ; [*19A3.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR -1D9D5 ; [*19A4.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL -1D9D6 ; [*19A5.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM -1D9D7 ; [*19A6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE -1D9D8 ; [*19A7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST -1D9D9 ; [*19A8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED -1D9DA ; [*19A9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL -1D9DB ; [*19AA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL -1D9DC ; [*19AB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE -1D9DD ; [*19AC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL -1D9DE ; [*19AD.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE -1D9DF ; [*19AE.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE -1D9E0 ; [*19AF.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE -1D9E1 ; [*19B0.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING -1D9E2 ; [*19B1.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL -1D9E3 ; [*19B2.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE -1D9E4 ; [*19B3.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE -1D9E5 ; [*19B4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE -1D9E6 ; [*19B5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE -1D9E7 ; [*19B6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE -1D9E8 ; [*19B7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE -1D9E9 ; [*19B8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE -1D9EA ; [*19B9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE -1D9EB ; [*19BA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE -1D9EC ; [*19BB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE -1D9ED ; [*19BC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE -1D9EE ; [*19BD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE -1D9EF ; [*19BE.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE -1D9F0 ; [*19BF.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE -1D9F1 ; [*19C0.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE -1D9F2 ; [*19C1.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE -1D9F3 ; [*19C2.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE -1D9F4 ; [*19C3.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE -1D9F5 ; [*19C4.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD SMALL -1D9F6 ; [*19C5.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD LARGE -1D9F7 ; [*19C6.0020.0002] # SIGNWRITING DYNAMIC FAST -1D9F8 ; [*19C7.0020.0002] # SIGNWRITING DYNAMIC SLOW -1D9F9 ; [*19C8.0020.0002] # SIGNWRITING DYNAMIC TENSE -1D9FA ; [*19C9.0020.0002] # SIGNWRITING DYNAMIC RELAXED -1D9FB ; [*19CA.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS -1D9FC ; [*19CB.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING -1D9FD ; [*19CC.0020.0002] # SIGNWRITING DYNAMIC EVERY OTHER TIME -1D9FE ; [*19CD.0020.0002] # SIGNWRITING DYNAMIC GRADUAL -1D9FF ; [*19CE.0020.0002] # SIGNWRITING HEAD +1D245 ; [*11C5.0020.0002] # GREEK MUSICAL LEIMMA +1D300 ; [*0EEA.0020.0002] # MONOGRAM FOR EARTH +1D301 ; [*0EEB.0020.0002] # DIGRAM FOR HEAVENLY EARTH +1D302 ; [*0EEC.0020.0002] # DIGRAM FOR HUMAN EARTH +1D303 ; [*0EED.0020.0002] # DIGRAM FOR EARTHLY HEAVEN +1D304 ; [*0EEE.0020.0002] # DIGRAM FOR EARTHLY HUMAN +1D305 ; [*0EEF.0020.0002] # DIGRAM FOR EARTH +1D306 ; [*0EF0.0020.0002] # TETRAGRAM FOR CENTRE +1D307 ; [*0EF1.0020.0002] # TETRAGRAM FOR FULL CIRCLE +1D308 ; [*0EF2.0020.0002] # TETRAGRAM FOR MIRED +1D309 ; [*0EF3.0020.0002] # TETRAGRAM FOR BARRIER +1D30A ; [*0EF4.0020.0002] # TETRAGRAM FOR KEEPING SMALL +1D30B ; [*0EF5.0020.0002] # TETRAGRAM FOR CONTRARIETY +1D30C ; [*0EF6.0020.0002] # TETRAGRAM FOR ASCENT +1D30D ; [*0EF7.0020.0002] # TETRAGRAM FOR OPPOSITION +1D30E ; [*0EF8.0020.0002] # TETRAGRAM FOR BRANCHING OUT +1D30F ; [*0EF9.0020.0002] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION +1D310 ; [*0EFA.0020.0002] # TETRAGRAM FOR DIVERGENCE +1D311 ; [*0EFB.0020.0002] # TETRAGRAM FOR YOUTHFULNESS +1D312 ; [*0EFC.0020.0002] # TETRAGRAM FOR INCREASE +1D313 ; [*0EFD.0020.0002] # TETRAGRAM FOR PENETRATION +1D314 ; [*0EFE.0020.0002] # TETRAGRAM FOR REACH +1D315 ; [*0EFF.0020.0002] # TETRAGRAM FOR CONTACT +1D316 ; [*0F00.0020.0002] # TETRAGRAM FOR HOLDING BACK +1D317 ; [*0F01.0020.0002] # TETRAGRAM FOR WAITING +1D318 ; [*0F02.0020.0002] # TETRAGRAM FOR FOLLOWING +1D319 ; [*0F03.0020.0002] # TETRAGRAM FOR ADVANCE +1D31A ; [*0F04.0020.0002] # TETRAGRAM FOR RELEASE +1D31B ; [*0F05.0020.0002] # TETRAGRAM FOR RESISTANCE +1D31C ; [*0F06.0020.0002] # TETRAGRAM FOR EASE +1D31D ; [*0F07.0020.0002] # TETRAGRAM FOR JOY +1D31E ; [*0F08.0020.0002] # TETRAGRAM FOR CONTENTION +1D31F ; [*0F09.0020.0002] # TETRAGRAM FOR ENDEAVOUR +1D320 ; [*0F0A.0020.0002] # TETRAGRAM FOR DUTIES +1D321 ; [*0F0B.0020.0002] # TETRAGRAM FOR CHANGE +1D322 ; [*0F0C.0020.0002] # TETRAGRAM FOR DECISIVENESS +1D323 ; [*0F0D.0020.0002] # TETRAGRAM FOR BOLD RESOLUTION +1D324 ; [*0F0E.0020.0002] # TETRAGRAM FOR PACKING +1D325 ; [*0F0F.0020.0002] # TETRAGRAM FOR LEGION +1D326 ; [*0F10.0020.0002] # TETRAGRAM FOR CLOSENESS +1D327 ; [*0F11.0020.0002] # TETRAGRAM FOR KINSHIP +1D328 ; [*0F12.0020.0002] # TETRAGRAM FOR GATHERING +1D329 ; [*0F13.0020.0002] # TETRAGRAM FOR STRENGTH +1D32A ; [*0F14.0020.0002] # TETRAGRAM FOR PURITY +1D32B ; [*0F15.0020.0002] # TETRAGRAM FOR FULLNESS +1D32C ; [*0F16.0020.0002] # TETRAGRAM FOR RESIDENCE +1D32D ; [*0F17.0020.0002] # TETRAGRAM FOR LAW OR MODEL +1D32E ; [*0F18.0020.0002] # TETRAGRAM FOR RESPONSE +1D32F ; [*0F19.0020.0002] # TETRAGRAM FOR GOING TO MEET +1D330 ; [*0F1A.0020.0002] # TETRAGRAM FOR ENCOUNTERS +1D331 ; [*0F1B.0020.0002] # TETRAGRAM FOR STOVE +1D332 ; [*0F1C.0020.0002] # TETRAGRAM FOR GREATNESS +1D333 ; [*0F1D.0020.0002] # TETRAGRAM FOR ENLARGEMENT +1D334 ; [*0F1E.0020.0002] # TETRAGRAM FOR PATTERN +1D335 ; [*0F1F.0020.0002] # TETRAGRAM FOR RITUAL +1D336 ; [*0F20.0020.0002] # TETRAGRAM FOR FLIGHT +1D337 ; [*0F21.0020.0002] # TETRAGRAM FOR VASTNESS OR WASTING +1D338 ; [*0F22.0020.0002] # TETRAGRAM FOR CONSTANCY +1D339 ; [*0F23.0020.0002] # TETRAGRAM FOR MEASURE +1D33A ; [*0F24.0020.0002] # TETRAGRAM FOR ETERNITY +1D33B ; [*0F25.0020.0002] # TETRAGRAM FOR UNITY +1D33C ; [*0F26.0020.0002] # TETRAGRAM FOR DIMINISHMENT +1D33D ; [*0F27.0020.0002] # TETRAGRAM FOR CLOSED MOUTH +1D33E ; [*0F28.0020.0002] # TETRAGRAM FOR GUARDEDNESS +1D33F ; [*0F29.0020.0002] # TETRAGRAM FOR GATHERING IN +1D340 ; [*0F2A.0020.0002] # TETRAGRAM FOR MASSING +1D341 ; [*0F2B.0020.0002] # TETRAGRAM FOR ACCUMULATION +1D342 ; [*0F2C.0020.0002] # TETRAGRAM FOR EMBELLISHMENT +1D343 ; [*0F2D.0020.0002] # TETRAGRAM FOR DOUBT +1D344 ; [*0F2E.0020.0002] # TETRAGRAM FOR WATCH +1D345 ; [*0F2F.0020.0002] # TETRAGRAM FOR SINKING +1D346 ; [*0F30.0020.0002] # TETRAGRAM FOR INNER +1D347 ; [*0F31.0020.0002] # TETRAGRAM FOR DEPARTURE +1D348 ; [*0F32.0020.0002] # TETRAGRAM FOR DARKENING +1D349 ; [*0F33.0020.0002] # TETRAGRAM FOR DIMMING +1D34A ; [*0F34.0020.0002] # TETRAGRAM FOR EXHAUSTION +1D34B ; [*0F35.0020.0002] # TETRAGRAM FOR SEVERANCE +1D34C ; [*0F36.0020.0002] # TETRAGRAM FOR STOPPAGE +1D34D ; [*0F37.0020.0002] # TETRAGRAM FOR HARDNESS +1D34E ; [*0F38.0020.0002] # TETRAGRAM FOR COMPLETION +1D34F ; [*0F39.0020.0002] # TETRAGRAM FOR CLOSURE +1D350 ; [*0F3A.0020.0002] # TETRAGRAM FOR FAILURE +1D351 ; [*0F3B.0020.0002] # TETRAGRAM FOR AGGRAVATION +1D352 ; [*0F3C.0020.0002] # TETRAGRAM FOR COMPLIANCE +1D353 ; [*0F3D.0020.0002] # TETRAGRAM FOR ON THE VERGE +1D354 ; [*0F3E.0020.0002] # TETRAGRAM FOR DIFFICULTIES +1D355 ; [*0F3F.0020.0002] # TETRAGRAM FOR LABOURING +1D356 ; [*0F40.0020.0002] # TETRAGRAM FOR FOSTERING +1D369 ; [*1BEF.0020.0002] # COUNTING ROD TENS DIGIT ONE +1D36A ; [*1BF0.0020.0002] # COUNTING ROD TENS DIGIT TWO +1D36B ; [*1BF1.0020.0002] # COUNTING ROD TENS DIGIT THREE +1D36C ; [*1BF2.0020.0002] # COUNTING ROD TENS DIGIT FOUR +1D36D ; [*1BF3.0020.0002] # COUNTING ROD TENS DIGIT FIVE +1D36E ; [*1BF4.0020.0002] # COUNTING ROD TENS DIGIT SIX +1D36F ; [*1BF5.0020.0002] # COUNTING ROD TENS DIGIT SEVEN +1D370 ; [*1BF6.0020.0002] # COUNTING ROD TENS DIGIT EIGHT +1D371 ; [*1BF7.0020.0002] # COUNTING ROD TENS DIGIT NINE +1D6C1 ; [*060C.0020.0005] # MATHEMATICAL BOLD NABLA +1D6DB ; [*0608.0020.0005] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6FB ; [*060C.0020.0005] # MATHEMATICAL ITALIC NABLA +1D715 ; [*0608.0020.0005] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D735 ; [*060C.0020.0005] # MATHEMATICAL BOLD ITALIC NABLA +1D74F ; [*0608.0020.0005] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D76F ; [*060C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD NABLA +1D789 ; [*0608.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D7A9 ; [*060C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7C3 ; [*0608.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D800 ; [*183F.0020.0002] # SIGNWRITING HAND-FIST INDEX +1D801 ; [*1840.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX +1D802 ; [*1841.0020.0002] # SIGNWRITING HAND-CUP INDEX +1D803 ; [*1842.0020.0002] # SIGNWRITING HAND-OVAL INDEX +1D804 ; [*1843.0020.0002] # SIGNWRITING HAND-HINGE INDEX +1D805 ; [*1844.0020.0002] # SIGNWRITING HAND-ANGLE INDEX +1D806 ; [*1845.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT +1D807 ; [*1846.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX BENT +1D808 ; [*1847.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT +1D809 ; [*1848.0020.0002] # SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE +1D80A ; [*1849.0020.0002] # SIGNWRITING HAND-FIST INDEX CUPPED +1D80B ; [*184A.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED +1D80C ; [*184B.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED LOW +1D80D ; [*184C.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX HINGE +1D80E ; [*184D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE +1D80F ; [*184E.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE +1D810 ; [*184F.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT +1D811 ; [*1850.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES +1D812 ; [*1851.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED +1D813 ; [*1852.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED +1D814 ; [*1853.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP +1D815 ; [*1854.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED +1D816 ; [*1855.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT +1D817 ; [*1856.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT +1D818 ; [*1857.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED +1D819 ; [*1858.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED +1D81A ; [*1859.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED +1D81B ; [*185A.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED +1D81C ; [*185B.0020.0002] # SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX +1D81D ; [*185C.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE +1D81E ; [*185D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB +1D81F ; [*185E.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB +1D820 ; [*185F.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT +1D821 ; [*1860.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT +1D822 ; [*1861.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT +1D823 ; [*1862.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE +1D824 ; [*1863.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE +1D825 ; [*1864.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED +1D826 ; [*1865.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE +1D827 ; [*1866.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD +1D828 ; [*1867.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED +1D829 ; [*1868.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED +1D82A ; [*1869.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED +1D82B ; [*186A.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED +1D82C ; [*186B.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT +1D82D ; [*186C.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE +1D82E ; [*186D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED +1D82F ; [*186E.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT +1D830 ; [*186F.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP +1D831 ; [*1870.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP +1D832 ; [*1871.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE +1D833 ; [*1872.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE +1D834 ; [*1873.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD +1D835 ; [*1874.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD +1D836 ; [*1875.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP +1D837 ; [*1876.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP +1D838 ; [*1877.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP +1D839 ; [*1878.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED +1D83A ; [*1879.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP +1D83B ; [*187A.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP +1D83C ; [*187B.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP +1D83D ; [*187C.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED +1D83E ; [*187D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT +1D83F ; [*187E.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED +1D840 ; [*187F.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP +1D841 ; [*1880.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED +1D842 ; [*1881.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP +1D843 ; [*1882.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED +1D844 ; [*1883.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS +1D845 ; [*1884.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS BENT +1D846 ; [*1885.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS HINGED +1D847 ; [*1886.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED +1D848 ; [*1887.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT +1D849 ; [*1888.0020.0002] # SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED +1D84A ; [*1889.0020.0002] # SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT +1D84B ; [*188A.0020.0002] # SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED +1D84C ; [*188B.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD +1D84D ; [*188C.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD +1D84E ; [*188D.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT +1D84F ; [*188E.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT +1D850 ; [*188F.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT +1D851 ; [*1890.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT +1D852 ; [*1891.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD +1D853 ; [*1892.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD +1D854 ; [*1893.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN +1D855 ; [*1894.0020.0002] # SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN +1D856 ; [*1895.0020.0002] # SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD +1D857 ; [*1896.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED +1D858 ; [*1897.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE +1D859 ; [*1898.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB +1D85A ; [*1899.0020.0002] # SIGNWRITING HAND-FLAT +1D85B ; [*189A.0020.0002] # SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS +1D85C ; [*189B.0020.0002] # SIGNWRITING HAND-FLAT HEEL +1D85D ; [*189C.0020.0002] # SIGNWRITING HAND-FLAT THUMB SIDE +1D85E ; [*189D.0020.0002] # SIGNWRITING HAND-FLAT HEEL THUMB SIDE +1D85F ; [*189E.0020.0002] # SIGNWRITING HAND-FLAT THUMB BENT +1D860 ; [*189F.0020.0002] # SIGNWRITING HAND-FLAT THUMB FORWARD +1D861 ; [*18A0.0020.0002] # SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE +1D862 ; [*18A1.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE +1D863 ; [*18A2.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE +1D864 ; [*18A3.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT +1D865 ; [*18A4.0020.0002] # SIGNWRITING HAND-FLAT SPLIT LITTLE +1D866 ; [*18A5.0020.0002] # SIGNWRITING HAND-CLAW +1D867 ; [*18A6.0020.0002] # SIGNWRITING HAND-CLAW THUMB SIDE +1D868 ; [*18A7.0020.0002] # SIGNWRITING HAND-CLAW NO THUMB +1D869 ; [*18A8.0020.0002] # SIGNWRITING HAND-CLAW THUMB FORWARD +1D86A ; [*18A9.0020.0002] # SIGNWRITING HAND-HOOK CURLICUE +1D86B ; [*18AA.0020.0002] # SIGNWRITING HAND-HOOK +1D86C ; [*18AB.0020.0002] # SIGNWRITING HAND-CUP OPEN +1D86D ; [*18AC.0020.0002] # SIGNWRITING HAND-CUP +1D86E ; [*18AD.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB SIDE +1D86F ; [*18AE.0020.0002] # SIGNWRITING HAND-CUP THUMB SIDE +1D870 ; [*18AF.0020.0002] # SIGNWRITING HAND-CUP OPEN NO THUMB +1D871 ; [*18B0.0020.0002] # SIGNWRITING HAND-CUP NO THUMB +1D872 ; [*18B1.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB FORWARD +1D873 ; [*18B2.0020.0002] # SIGNWRITING HAND-CUP THUMB FORWARD +1D874 ; [*18B3.0020.0002] # SIGNWRITING HAND-CURLICUE OPEN +1D875 ; [*18B4.0020.0002] # SIGNWRITING HAND-CURLICUE +1D876 ; [*18B5.0020.0002] # SIGNWRITING HAND-CIRCLE +1D877 ; [*18B6.0020.0002] # SIGNWRITING HAND-OVAL +1D878 ; [*18B7.0020.0002] # SIGNWRITING HAND-OVAL THUMB SIDE +1D879 ; [*18B8.0020.0002] # SIGNWRITING HAND-OVAL NO THUMB +1D87A ; [*18B9.0020.0002] # SIGNWRITING HAND-OVAL THUMB FORWARD +1D87B ; [*18BA.0020.0002] # SIGNWRITING HAND-HINGE OPEN +1D87C ; [*18BB.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB FORWARD +1D87D ; [*18BC.0020.0002] # SIGNWRITING HAND-HINGE +1D87E ; [*18BD.0020.0002] # SIGNWRITING HAND-HINGE SMALL +1D87F ; [*18BE.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB SIDE +1D880 ; [*18BF.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE +1D881 ; [*18C0.0020.0002] # SIGNWRITING HAND-HINGE OPEN NO THUMB +1D882 ; [*18C1.0020.0002] # SIGNWRITING HAND-HINGE NO THUMB +1D883 ; [*18C2.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX +1D884 ; [*18C3.0020.0002] # SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING +1D885 ; [*18C4.0020.0002] # SIGNWRITING HAND-ANGLE +1D886 ; [*18C5.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING +1D887 ; [*18C6.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING +1D888 ; [*18C7.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING +1D889 ; [*18C8.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE RING +1D88A ; [*18C9.0020.0002] # SIGNWRITING HAND-HINGE LITTLE +1D88B ; [*18CA.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT +1D88C ; [*18CB.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED +1D88D ; [*18CC.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED +1D88E ; [*18CD.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN +1D88F ; [*18CE.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT +1D890 ; [*18CF.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED +1D891 ; [*18D0.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED +1D892 ; [*18D1.0020.0002] # SIGNWRITING HAND-FIST LITTLE UP +1D893 ; [*18D2.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP +1D894 ; [*18D3.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE UP +1D895 ; [*18D4.0020.0002] # SIGNWRITING HAND-OVAL LITTLE UP +1D896 ; [*18D5.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE UP +1D897 ; [*18D6.0020.0002] # SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE +1D898 ; [*18D7.0020.0002] # SIGNWRITING HAND-FIST LITTLE BENT +1D899 ; [*18D8.0020.0002] # SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB +1D89A ; [*18D9.0020.0002] # SIGNWRITING HAND-FIST LITTLE THUMB +1D89B ; [*18DA.0020.0002] # SIGNWRITING HAND-HINGE LITTLE THUMB +1D89C ; [*18DB.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX THUMB +1D89D ; [*18DC.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX THUMB +1D89E ; [*18DD.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT +1D89F ; [*18DE.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB +1D8A0 ; [*18DF.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX +1D8A1 ; [*18E0.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE INDEX +1D8A2 ; [*18E1.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX +1D8A3 ; [*18E2.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX +1D8A4 ; [*18E3.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE +1D8A5 ; [*18E4.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE +1D8A6 ; [*18E5.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE +1D8A7 ; [*18E6.0020.0002] # SIGNWRITING HAND-HINGE RING +1D8A8 ; [*18E7.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE +1D8A9 ; [*18E8.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE +1D8AA ; [*18E9.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE +1D8AB ; [*18EA.0020.0002] # SIGNWRITING HAND-FIST RING DOWN +1D8AC ; [*18EB.0020.0002] # SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE +1D8AD ; [*18EC.0020.0002] # SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS +1D8AE ; [*18ED.0020.0002] # SIGNWRITING HAND-FIST RING UP +1D8AF ; [*18EE.0020.0002] # SIGNWRITING HAND-FIST RING RAISED KNUCKLE +1D8B0 ; [*18EF.0020.0002] # SIGNWRITING HAND-FIST RING LITTLE +1D8B1 ; [*18F0.0020.0002] # SIGNWRITING HAND-CIRCLE RING LITTLE +1D8B2 ; [*18F1.0020.0002] # SIGNWRITING HAND-OVAL RING LITTLE +1D8B3 ; [*18F2.0020.0002] # SIGNWRITING HAND-ANGLE RING LITTLE +1D8B4 ; [*18F3.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE +1D8B5 ; [*18F4.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE CONJOINED +1D8B6 ; [*18F5.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES +1D8B7 ; [*18F6.0020.0002] # SIGNWRITING HAND-FIST RING INDEX +1D8B8 ; [*18F7.0020.0002] # SIGNWRITING HAND-FIST RING THUMB +1D8B9 ; [*18F8.0020.0002] # SIGNWRITING HAND-HOOK RING THUMB +1D8BA ; [*18F9.0020.0002] # SIGNWRITING HAND-FIST INDEX RING LITTLE +1D8BB ; [*18FA.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX RING LITTLE +1D8BC ; [*18FB.0020.0002] # SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON +1D8BD ; [*18FC.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT +1D8BE ; [*18FD.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE IN +1D8BF ; [*18FE.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER +1D8C0 ; [*18FF.0020.0002] # SIGNWRITING HAND-CUP INDEX RING LITTLE +1D8C1 ; [*1900.0020.0002] # SIGNWRITING HAND-HINGE INDEX RING LITTLE +1D8C2 ; [*1901.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT +1D8C3 ; [*1902.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE +1D8C4 ; [*1903.0020.0002] # SIGNWRITING HAND-FIST MIDDLE DOWN +1D8C5 ; [*1904.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE +1D8C6 ; [*1905.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP +1D8C7 ; [*1906.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE UP +1D8C8 ; [*1907.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE +1D8C9 ; [*1908.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE +1D8CA ; [*1909.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE THUMB +1D8CB ; [*190A.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE +1D8CC ; [*190B.0020.0002] # SIGNWRITING HAND-FIST MIDDLE LITTLE +1D8CD ; [*190C.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RING LITTLE +1D8CE ; [*190D.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE +1D8CF ; [*190E.0020.0002] # SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON +1D8D0 ; [*190F.0020.0002] # SIGNWRITING HAND-CUP MIDDLE RING LITTLE +1D8D1 ; [*1910.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE RING LITTLE +1D8D2 ; [*1911.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT +1D8D3 ; [*1912.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN +1D8D4 ; [*1913.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE +1D8D5 ; [*1914.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT +1D8D6 ; [*1915.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED +1D8D7 ; [*1916.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE +1D8D8 ; [*1917.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT +1D8D9 ; [*1918.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN +1D8DA ; [*1919.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED +1D8DB ; [*191A.0020.0002] # SIGNWRITING HAND-HINGE INDEX HINGED +1D8DC ; [*191B.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE +1D8DD ; [*191C.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SIDE +1D8DE ; [*191D.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL +1D8DF ; [*191E.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED +1D8E0 ; [*191F.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT +1D8E1 ; [*1920.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT +1D8E2 ; [*1921.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT +1D8E3 ; [*1922.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE +1D8E4 ; [*1923.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT +1D8E5 ; [*1924.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT +1D8E6 ; [*1925.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOK +1D8E7 ; [*1926.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURLICUE +1D8E8 ; [*1927.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE +1D8E9 ; [*1928.0020.0002] # SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE +1D8EA ; [*1929.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER +1D8EB ; [*192A.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLE +1D8EC ; [*192B.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB +1D8ED ; [*192C.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB OPEN +1D8EE ; [*192D.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB OPEN +1D8EF ; [*192E.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB LARGE +1D8F0 ; [*192F.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB +1D8F1 ; [*1930.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SMALL +1D8F2 ; [*1931.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB OUT +1D8F3 ; [*1932.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB IN +1D8F4 ; [*1933.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB +1D8F5 ; [*1934.0020.0002] # SIGNWRITING HAND-FIST THUMB +1D8F6 ; [*1935.0020.0002] # SIGNWRITING HAND-FIST THUMB HEEL +1D8F7 ; [*1936.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL +1D8F8 ; [*1937.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE CONJOINED +1D8F9 ; [*1938.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE BENT +1D8FA ; [*1939.0020.0002] # SIGNWRITING HAND-FIST THUMB FORWARD +1D8FB ; [*193A.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE +1D8FC ; [*193B.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING +1D8FD ; [*193C.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE +1D8FE ; [*193D.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS +1D8FF ; [*193E.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS +1D900 ; [*193F.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS +1D901 ; [*1940.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS +1D902 ; [*1941.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES +1D903 ; [*1942.0020.0002] # SIGNWRITING HAND-FIST +1D904 ; [*1943.0020.0002] # SIGNWRITING HAND-FIST HEEL +1D905 ; [*1944.0020.0002] # SIGNWRITING TOUCH SINGLE +1D906 ; [*1945.0020.0002] # SIGNWRITING TOUCH MULTIPLE +1D907 ; [*1946.0020.0002] # SIGNWRITING TOUCH BETWEEN +1D908 ; [*1947.0020.0002] # SIGNWRITING GRASP SINGLE +1D909 ; [*1948.0020.0002] # SIGNWRITING GRASP MULTIPLE +1D90A ; [*1949.0020.0002] # SIGNWRITING GRASP BETWEEN +1D90B ; [*194A.0020.0002] # SIGNWRITING STRIKE SINGLE +1D90C ; [*194B.0020.0002] # SIGNWRITING STRIKE MULTIPLE +1D90D ; [*194C.0020.0002] # SIGNWRITING STRIKE BETWEEN +1D90E ; [*194D.0020.0002] # SIGNWRITING BRUSH SINGLE +1D90F ; [*194E.0020.0002] # SIGNWRITING BRUSH MULTIPLE +1D910 ; [*194F.0020.0002] # SIGNWRITING BRUSH BETWEEN +1D911 ; [*1950.0020.0002] # SIGNWRITING RUB SINGLE +1D912 ; [*1951.0020.0002] # SIGNWRITING RUB MULTIPLE +1D913 ; [*1952.0020.0002] # SIGNWRITING RUB BETWEEN +1D914 ; [*1953.0020.0002] # SIGNWRITING SURFACE SYMBOLS +1D915 ; [*1954.0020.0002] # SIGNWRITING SURFACE BETWEEN +1D916 ; [*1955.0020.0002] # SIGNWRITING SQUEEZE LARGE SINGLE +1D917 ; [*1956.0020.0002] # SIGNWRITING SQUEEZE SMALL SINGLE +1D918 ; [*1957.0020.0002] # SIGNWRITING SQUEEZE LARGE MULTIPLE +1D919 ; [*1958.0020.0002] # SIGNWRITING SQUEEZE SMALL MULTIPLE +1D91A ; [*1959.0020.0002] # SIGNWRITING SQUEEZE SEQUENTIAL +1D91B ; [*195A.0020.0002] # SIGNWRITING FLICK LARGE SINGLE +1D91C ; [*195B.0020.0002] # SIGNWRITING FLICK SMALL SINGLE +1D91D ; [*195C.0020.0002] # SIGNWRITING FLICK LARGE MULTIPLE +1D91E ; [*195D.0020.0002] # SIGNWRITING FLICK SMALL MULTIPLE +1D91F ; [*195E.0020.0002] # SIGNWRITING FLICK SEQUENTIAL +1D920 ; [*195F.0020.0002] # SIGNWRITING SQUEEZE FLICK ALTERNATING +1D921 ; [*1960.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE +1D922 ; [*1961.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL +1D923 ; [*1962.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL +1D924 ; [*1963.0020.0002] # SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL +1D925 ; [*1964.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE +1D926 ; [*1965.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL +1D927 ; [*1966.0020.0002] # SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS +1D928 ; [*1967.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT +1D929 ; [*1968.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT +1D92A ; [*1969.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL +1D92B ; [*196A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM +1D92C ; [*196B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE +1D92D ; [*196C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST +1D92E ; [*196D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX +1D92F ; [*196E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT +1D930 ; [*196F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX +1D931 ; [*1970.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING +1D932 ; [*1971.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX +1D933 ; [*1972.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CROSS +1D934 ; [*1973.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT +1D935 ; [*1974.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX +1D936 ; [*1975.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING +1D937 ; [*1976.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX +1D938 ; [*1977.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL +1D939 ; [*1978.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM +1D93A ; [*1979.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE +1D93B ; [*197A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL +1D93C ; [*197B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM +1D93D ; [*197C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE +1D93E ; [*197D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION +1D93F ; [*197E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL +1D940 ; [*197F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM +1D941 ; [*1980.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE +1D942 ; [*1981.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL +1D943 ; [*1982.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM +1D944 ; [*1983.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE +1D945 ; [*1984.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL +1D946 ; [*1985.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM +1D947 ; [*1986.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE +1D948 ; [*1987.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL +1D949 ; [*1988.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM +1D94A ; [*1989.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE +1D94B ; [*198A.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE +1D94C ; [*198B.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE +1D94D ; [*198C.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING +1D94E ; [*198D.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE +1D94F ; [*198E.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE +1D950 ; [*198F.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING +1D951 ; [*1990.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE SHAKING +1D952 ; [*1991.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE +1D953 ; [*1992.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE +1D954 ; [*1993.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE +1D955 ; [*1994.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL +1D956 ; [*1995.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM +1D957 ; [*1996.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE +1D958 ; [*1997.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST +1D959 ; [*1998.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL +1D95A ; [*1999.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM +1D95B ; [*199A.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE +1D95C ; [*199B.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST +1D95D ; [*199C.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL +1D95E ; [*199D.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM +1D95F ; [*199E.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE +1D960 ; [*199F.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST +1D961 ; [*19A0.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL +1D962 ; [*19A1.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM +1D963 ; [*19A2.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE +1D964 ; [*19A3.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST +1D965 ; [*19A4.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL +1D966 ; [*19A5.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM +1D967 ; [*19A6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE +1D968 ; [*19A7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST +1D969 ; [*19A8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX +1D96A ; [*19A9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT +1D96B ; [*19AA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX +1D96C ; [*19AB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING +1D96D ; [*19AC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX +1D96E ; [*19AD.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CROSS +1D96F ; [*19AE.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT +1D970 ; [*19AF.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX +1D971 ; [*19B0.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT +1D972 ; [*19B1.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX +1D973 ; [*19B2.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BEND +1D974 ; [*19B3.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL +1D975 ; [*19B4.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM +1D976 ; [*19B5.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE +1D977 ; [*19B6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CHECK +1D978 ; [*19B7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL +1D979 ; [*19B8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM +1D97A ; [*19B9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE +1D97B ; [*19BA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL +1D97C ; [*19BB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM +1D97D ; [*19BC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE +1D97E ; [*19BD.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL +1D97F ; [*19BE.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM +1D980 ; [*19BF.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE +1D981 ; [*19C0.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE +1D982 ; [*19C1.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE +1D983 ; [*19C2.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING +1D984 ; [*19C3.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE +1D985 ; [*19C4.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE +1D986 ; [*19C5.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING +1D987 ; [*19C6.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE SHAKING +1D988 ; [*19C7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL +1D989 ; [*19C8.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM +1D98A ; [*19C9.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE +1D98B ; [*19CA.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST +1D98C ; [*19CB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL +1D98D ; [*19CC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM +1D98E ; [*19CD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE +1D98F ; [*19CE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST +1D990 ; [*19CF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL +1D991 ; [*19D0.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM +1D992 ; [*19D1.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL +1D993 ; [*19D2.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM +1D994 ; [*19D3.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE +1D995 ; [*19D4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL +1D996 ; [*19D5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM +1D997 ; [*19D6.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE +1D998 ; [*19D7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE +1D999 ; [*19D8.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL +1D99A ; [*19D9.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM +1D99B ; [*19DA.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE +1D99C ; [*19DB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL +1D99D ; [*19DC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM +1D99E ; [*19DD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE +1D99F ; [*19DE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT +1D9A0 ; [*19DF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL +1D9A1 ; [*19E0.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM +1D9A2 ; [*19E1.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE +1D9A3 ; [*19E2.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE +1D9A4 ; [*19E3.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATE +1D9A5 ; [*19E4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SHAKING +1D9A6 ; [*19E5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL +1D9A7 ; [*19E6.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL +1D9A8 ; [*19E7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL +1D9A9 ; [*19E8.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL +1D9AA ; [*19E9.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL +1D9AB ; [*19EA.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL +1D9AC ; [*19EB.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL +1D9AD ; [*19EC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST +1D9AE ; [*19ED.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST +1D9AF ; [*19EE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST +1D9B0 ; [*19EF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST +1D9B1 ; [*19F0.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST +1D9B2 ; [*19F1.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST +1D9B3 ; [*19F2.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST +1D9B4 ; [*19F3.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL +1D9B5 ; [*19F4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM +1D9B6 ; [*19F5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE +1D9B7 ; [*19F6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL +1D9B8 ; [*19F7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE +1D9B9 ; [*19F8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE +1D9BA ; [*19F9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE +1D9BB ; [*19FA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE +1D9BC ; [*19FB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE +1D9BD ; [*19FC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE +1D9BE ; [*19FD.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE +1D9BF ; [*19FE.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE +1D9C0 ; [*19FF.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE +1D9C1 ; [*1A00.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL +1D9C2 ; [*1A01.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE +1D9C3 ; [*1A02.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING +1D9C4 ; [*1A03.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING +1D9C5 ; [*1A04.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING +1D9C6 ; [*1A05.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL +1D9C7 ; [*1A06.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE +1D9C8 ; [*1A07.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE +1D9C9 ; [*1A08.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE +1D9CA ; [*1A09.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE +1D9CB ; [*1A0A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE +1D9CC ; [*1A0B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE +1D9CD ; [*1A0C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE +1D9CE ; [*1A0D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE +1D9CF ; [*1A0E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE +1D9D0 ; [*1A0F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL +1D9D1 ; [*1A10.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE +1D9D2 ; [*1A11.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR +1D9D3 ; [*1A12.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR +1D9D4 ; [*1A13.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR +1D9D5 ; [*1A14.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL +1D9D6 ; [*1A15.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM +1D9D7 ; [*1A16.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE +1D9D8 ; [*1A17.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST +1D9D9 ; [*1A18.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED +1D9DA ; [*1A19.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL +1D9DB ; [*1A1A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL +1D9DC ; [*1A1B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE +1D9DD ; [*1A1C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL +1D9DE ; [*1A1D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE +1D9DF ; [*1A1E.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE +1D9E0 ; [*1A1F.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE +1D9E1 ; [*1A20.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING +1D9E2 ; [*1A21.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL +1D9E3 ; [*1A22.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE +1D9E4 ; [*1A23.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE +1D9E5 ; [*1A24.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE +1D9E6 ; [*1A25.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE +1D9E7 ; [*1A26.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE +1D9E8 ; [*1A27.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE +1D9E9 ; [*1A28.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE +1D9EA ; [*1A29.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE +1D9EB ; [*1A2A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE +1D9EC ; [*1A2B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE +1D9ED ; [*1A2C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE +1D9EE ; [*1A2D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE +1D9EF ; [*1A2E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE +1D9F0 ; [*1A2F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE +1D9F1 ; [*1A30.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE +1D9F2 ; [*1A31.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE +1D9F3 ; [*1A32.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE +1D9F4 ; [*1A33.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE +1D9F5 ; [*1A34.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD SMALL +1D9F6 ; [*1A35.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD LARGE +1D9F7 ; [*1A36.0020.0002] # SIGNWRITING DYNAMIC FAST +1D9F8 ; [*1A37.0020.0002] # SIGNWRITING DYNAMIC SLOW +1D9F9 ; [*1A38.0020.0002] # SIGNWRITING DYNAMIC TENSE +1D9FA ; [*1A39.0020.0002] # SIGNWRITING DYNAMIC RELAXED +1D9FB ; [*1A3A.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS +1D9FC ; [*1A3B.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING +1D9FD ; [*1A3C.0020.0002] # SIGNWRITING DYNAMIC EVERY OTHER TIME +1D9FE ; [*1A3D.0020.0002] # SIGNWRITING DYNAMIC GRADUAL +1D9FF ; [*1A3E.0020.0002] # SIGNWRITING HEAD 1DA00 ; [.0000.0000.0000] # SIGNWRITING HEAD RIM 1DA01 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT 1DA02 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT @@ -5881,10 +5953,10 @@ FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER 1DA34 ; [.0000.0000.0000] # SIGNWRITING NOSE WIGGLES 1DA35 ; [.0000.0000.0000] # SIGNWRITING AIR BLOWING OUT 1DA36 ; [.0000.0000.0000] # SIGNWRITING AIR SUCKING IN -1DA37 ; [*19CF.0020.0002] # SIGNWRITING AIR BLOW SMALL ROTATIONS -1DA38 ; [*19D0.0020.0002] # SIGNWRITING AIR SUCK SMALL ROTATIONS -1DA39 ; [*19D1.0020.0002] # SIGNWRITING BREATH INHALE -1DA3A ; [*19D2.0020.0002] # SIGNWRITING BREATH EXHALE +1DA37 ; [*1A3F.0020.0002] # SIGNWRITING AIR BLOW SMALL ROTATIONS +1DA38 ; [*1A40.0020.0002] # SIGNWRITING AIR SUCK SMALL ROTATIONS +1DA39 ; [*1A41.0020.0002] # SIGNWRITING BREATH INHALE +1DA3A ; [*1A42.0020.0002] # SIGNWRITING BREATH EXHALE 1DA3B ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED NEUTRAL 1DA3C ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED FORWARD 1DA3D ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED CONTACT @@ -5935,37 +6007,37 @@ FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER 1DA6A ; [.0000.0000.0000] # SIGNWRITING NECK 1DA6B ; [.0000.0000.0000] # SIGNWRITING HAIR 1DA6C ; [.0000.0000.0000] # SIGNWRITING EXCITEMENT -1DA6D ; [*19D3.0020.0002] # SIGNWRITING SHOULDER HIP SPINE -1DA6E ; [*19D4.0020.0002] # SIGNWRITING SHOULDER HIP POSITIONS -1DA6F ; [*19D5.0020.0002] # SIGNWRITING WALLPLANE SHOULDER HIP MOVE -1DA70 ; [*19D6.0020.0002] # SIGNWRITING FLOORPLANE SHOULDER HIP MOVE -1DA71 ; [*19D7.0020.0002] # SIGNWRITING SHOULDER TILTING FROM WAIST -1DA72 ; [*19D8.0020.0002] # SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH -1DA73 ; [*19D9.0020.0002] # SIGNWRITING TORSO-WALLPLANE CURVED BEND -1DA74 ; [*19DA.0020.0002] # SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA6D ; [*1A43.0020.0002] # SIGNWRITING SHOULDER HIP SPINE +1DA6E ; [*1A44.0020.0002] # SIGNWRITING SHOULDER HIP POSITIONS +1DA6F ; [*1A45.0020.0002] # SIGNWRITING WALLPLANE SHOULDER HIP MOVE +1DA70 ; [*1A46.0020.0002] # SIGNWRITING FLOORPLANE SHOULDER HIP MOVE +1DA71 ; [*1A47.0020.0002] # SIGNWRITING SHOULDER TILTING FROM WAIST +1DA72 ; [*1A48.0020.0002] # SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH +1DA73 ; [*1A49.0020.0002] # SIGNWRITING TORSO-WALLPLANE CURVED BEND +1DA74 ; [*1A4A.0020.0002] # SIGNWRITING TORSO-FLOORPLANE TWISTING 1DA75 ; [.0000.0000.0000] # SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS -1DA76 ; [*19DB.0020.0002] # SIGNWRITING LIMB COMBINATION -1DA77 ; [*19DC.0020.0002] # SIGNWRITING LIMB LENGTH-1 -1DA78 ; [*19DD.0020.0002] # SIGNWRITING LIMB LENGTH-2 -1DA79 ; [*19DE.0020.0002] # SIGNWRITING LIMB LENGTH-3 -1DA7A ; [*19DF.0020.0002] # SIGNWRITING LIMB LENGTH-4 -1DA7B ; [*19E0.0020.0002] # SIGNWRITING LIMB LENGTH-5 -1DA7C ; [*19E1.0020.0002] # SIGNWRITING LIMB LENGTH-6 -1DA7D ; [*19E2.0020.0002] # SIGNWRITING LIMB LENGTH-7 -1DA7E ; [*19E3.0020.0002] # SIGNWRITING FINGER -1DA7F ; [*19E4.0020.0002] # SIGNWRITING LOCATION-WALLPLANE SPACE -1DA80 ; [*19E5.0020.0002] # SIGNWRITING LOCATION-FLOORPLANE SPACE -1DA81 ; [*19E6.0020.0002] # SIGNWRITING LOCATION HEIGHT -1DA82 ; [*19E7.0020.0002] # SIGNWRITING LOCATION WIDTH -1DA83 ; [*19E8.0020.0002] # SIGNWRITING LOCATION DEPTH +1DA76 ; [*1A4B.0020.0002] # SIGNWRITING LIMB COMBINATION +1DA77 ; [*1A4C.0020.0002] # SIGNWRITING LIMB LENGTH-1 +1DA78 ; [*1A4D.0020.0002] # SIGNWRITING LIMB LENGTH-2 +1DA79 ; [*1A4E.0020.0002] # SIGNWRITING LIMB LENGTH-3 +1DA7A ; [*1A4F.0020.0002] # SIGNWRITING LIMB LENGTH-4 +1DA7B ; [*1A50.0020.0002] # SIGNWRITING LIMB LENGTH-5 +1DA7C ; [*1A51.0020.0002] # SIGNWRITING LIMB LENGTH-6 +1DA7D ; [*1A52.0020.0002] # SIGNWRITING LIMB LENGTH-7 +1DA7E ; [*1A53.0020.0002] # SIGNWRITING FINGER +1DA7F ; [*1A54.0020.0002] # SIGNWRITING LOCATION-WALLPLANE SPACE +1DA80 ; [*1A55.0020.0002] # SIGNWRITING LOCATION-FLOORPLANE SPACE +1DA81 ; [*1A56.0020.0002] # SIGNWRITING LOCATION HEIGHT +1DA82 ; [*1A57.0020.0002] # SIGNWRITING LOCATION WIDTH +1DA83 ; [*1A58.0020.0002] # SIGNWRITING LOCATION DEPTH 1DA84 ; [.0000.0000.0000] # SIGNWRITING LOCATION HEAD NECK -1DA85 ; [*19E9.0020.0002] # SIGNWRITING LOCATION TORSO -1DA86 ; [*19EA.0020.0002] # SIGNWRITING LOCATION LIMBS DIGITS -1DA87 ; [*045E.0020.0002] # SIGNWRITING COMMA -1DA88 ; [*045F.0020.0002] # SIGNWRITING FULL STOP -1DA89 ; [*0460.0020.0002] # SIGNWRITING SEMICOLON -1DA8A ; [*0461.0020.0002] # SIGNWRITING COLON -1DA8B ; [*0462.0020.0002] # SIGNWRITING PARENTHESIS +1DA85 ; [*1A59.0020.0002] # SIGNWRITING LOCATION TORSO +1DA86 ; [*1A5A.0020.0002] # SIGNWRITING LOCATION LIMBS DIGITS +1DA87 ; [*047D.0020.0002] # SIGNWRITING COMMA +1DA88 ; [*047E.0020.0002] # SIGNWRITING FULL STOP +1DA89 ; [*047F.0020.0002] # SIGNWRITING SEMICOLON +1DA8A ; [*0480.0020.0002] # SIGNWRITING COLON +1DA8B ; [*0481.0020.0002] # SIGNWRITING PARENTHESIS 1DA9B ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-2 1DA9C ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-3 1DA9D ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-4 @@ -5993,1616 +6065,1692 @@ FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER 1E8D4 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS 1E8D5 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS 1E8D6 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER MILLIONS -1EEF0 ; [*04DC.0020.0002] # ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL -1EEF1 ; [*04DD.0020.0002] # ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -1F000 ; [*11A1.0020.0002] # MAHJONG TILE EAST WIND -1F001 ; [*11A2.0020.0002] # MAHJONG TILE SOUTH WIND -1F002 ; [*11A3.0020.0002] # MAHJONG TILE WEST WIND -1F003 ; [*11A4.0020.0002] # MAHJONG TILE NORTH WIND -1F004 ; [*11A5.0020.0002] # MAHJONG TILE RED DRAGON -1F005 ; [*11A6.0020.0002] # MAHJONG TILE GREEN DRAGON -1F006 ; [*11A7.0020.0002] # MAHJONG TILE WHITE DRAGON -1F007 ; [*11A8.0020.0002] # MAHJONG TILE ONE OF CHARACTERS -1F008 ; [*11A9.0020.0002] # MAHJONG TILE TWO OF CHARACTERS -1F009 ; [*11AA.0020.0002] # MAHJONG TILE THREE OF CHARACTERS -1F00A ; [*11AB.0020.0002] # MAHJONG TILE FOUR OF CHARACTERS -1F00B ; [*11AC.0020.0002] # MAHJONG TILE FIVE OF CHARACTERS -1F00C ; [*11AD.0020.0002] # MAHJONG TILE SIX OF CHARACTERS -1F00D ; [*11AE.0020.0002] # MAHJONG TILE SEVEN OF CHARACTERS -1F00E ; [*11AF.0020.0002] # MAHJONG TILE EIGHT OF CHARACTERS -1F00F ; [*11B0.0020.0002] # MAHJONG TILE NINE OF CHARACTERS -1F010 ; [*11B1.0020.0002] # MAHJONG TILE ONE OF BAMBOOS -1F011 ; [*11B2.0020.0002] # MAHJONG TILE TWO OF BAMBOOS -1F012 ; [*11B3.0020.0002] # MAHJONG TILE THREE OF BAMBOOS -1F013 ; [*11B4.0020.0002] # MAHJONG TILE FOUR OF BAMBOOS -1F014 ; [*11B5.0020.0002] # MAHJONG TILE FIVE OF BAMBOOS -1F015 ; [*11B6.0020.0002] # MAHJONG TILE SIX OF BAMBOOS -1F016 ; [*11B7.0020.0002] # MAHJONG TILE SEVEN OF BAMBOOS -1F017 ; [*11B8.0020.0002] # MAHJONG TILE EIGHT OF BAMBOOS -1F018 ; [*11B9.0020.0002] # MAHJONG TILE NINE OF BAMBOOS -1F019 ; [*11BA.0020.0002] # MAHJONG TILE ONE OF CIRCLES -1F01A ; [*11BB.0020.0002] # MAHJONG TILE TWO OF CIRCLES -1F01B ; [*11BC.0020.0002] # MAHJONG TILE THREE OF CIRCLES -1F01C ; [*11BD.0020.0002] # MAHJONG TILE FOUR OF CIRCLES -1F01D ; [*11BE.0020.0002] # MAHJONG TILE FIVE OF CIRCLES -1F01E ; [*11BF.0020.0002] # MAHJONG TILE SIX OF CIRCLES -1F01F ; [*11C0.0020.0002] # MAHJONG TILE SEVEN OF CIRCLES -1F020 ; [*11C1.0020.0002] # MAHJONG TILE EIGHT OF CIRCLES -1F021 ; [*11C2.0020.0002] # MAHJONG TILE NINE OF CIRCLES -1F022 ; [*11C3.0020.0002] # MAHJONG TILE PLUM -1F023 ; [*11C4.0020.0002] # MAHJONG TILE ORCHID -1F024 ; [*11C5.0020.0002] # MAHJONG TILE BAMBOO -1F025 ; [*11C6.0020.0002] # MAHJONG TILE CHRYSANTHEMUM -1F026 ; [*11C7.0020.0002] # MAHJONG TILE SPRING -1F027 ; [*11C8.0020.0002] # MAHJONG TILE SUMMER -1F028 ; [*11C9.0020.0002] # MAHJONG TILE AUTUMN -1F029 ; [*11CA.0020.0002] # MAHJONG TILE WINTER -1F02A ; [*11CB.0020.0002] # MAHJONG TILE JOKER -1F02B ; [*11CC.0020.0002] # MAHJONG TILE BACK -1F030 ; [*11CD.0020.0002] # DOMINO TILE HORIZONTAL BACK -1F031 ; [*11CE.0020.0002] # DOMINO TILE HORIZONTAL-00-00 -1F032 ; [*11CF.0020.0002] # DOMINO TILE HORIZONTAL-00-01 -1F033 ; [*11D0.0020.0002] # DOMINO TILE HORIZONTAL-00-02 -1F034 ; [*11D1.0020.0002] # DOMINO TILE HORIZONTAL-00-03 -1F035 ; [*11D2.0020.0002] # DOMINO TILE HORIZONTAL-00-04 -1F036 ; [*11D3.0020.0002] # DOMINO TILE HORIZONTAL-00-05 -1F037 ; [*11D4.0020.0002] # DOMINO TILE HORIZONTAL-00-06 -1F038 ; [*11D5.0020.0002] # DOMINO TILE HORIZONTAL-01-00 -1F039 ; [*11D6.0020.0002] # DOMINO TILE HORIZONTAL-01-01 -1F03A ; [*11D7.0020.0002] # DOMINO TILE HORIZONTAL-01-02 -1F03B ; [*11D8.0020.0002] # DOMINO TILE HORIZONTAL-01-03 -1F03C ; [*11D9.0020.0002] # DOMINO TILE HORIZONTAL-01-04 -1F03D ; [*11DA.0020.0002] # DOMINO TILE HORIZONTAL-01-05 -1F03E ; [*11DB.0020.0002] # DOMINO TILE HORIZONTAL-01-06 -1F03F ; [*11DC.0020.0002] # DOMINO TILE HORIZONTAL-02-00 -1F040 ; [*11DD.0020.0002] # DOMINO TILE HORIZONTAL-02-01 -1F041 ; [*11DE.0020.0002] # DOMINO TILE HORIZONTAL-02-02 -1F042 ; [*11DF.0020.0002] # DOMINO TILE HORIZONTAL-02-03 -1F043 ; [*11E0.0020.0002] # DOMINO TILE HORIZONTAL-02-04 -1F044 ; [*11E1.0020.0002] # DOMINO TILE HORIZONTAL-02-05 -1F045 ; [*11E2.0020.0002] # DOMINO TILE HORIZONTAL-02-06 -1F046 ; [*11E3.0020.0002] # DOMINO TILE HORIZONTAL-03-00 -1F047 ; [*11E4.0020.0002] # DOMINO TILE HORIZONTAL-03-01 -1F048 ; [*11E5.0020.0002] # DOMINO TILE HORIZONTAL-03-02 -1F049 ; [*11E6.0020.0002] # DOMINO TILE HORIZONTAL-03-03 -1F04A ; [*11E7.0020.0002] # DOMINO TILE HORIZONTAL-03-04 -1F04B ; [*11E8.0020.0002] # DOMINO TILE HORIZONTAL-03-05 -1F04C ; [*11E9.0020.0002] # DOMINO TILE HORIZONTAL-03-06 -1F04D ; [*11EA.0020.0002] # DOMINO TILE HORIZONTAL-04-00 -1F04E ; [*11EB.0020.0002] # DOMINO TILE HORIZONTAL-04-01 -1F04F ; [*11EC.0020.0002] # DOMINO TILE HORIZONTAL-04-02 -1F050 ; [*11ED.0020.0002] # DOMINO TILE HORIZONTAL-04-03 -1F051 ; [*11EE.0020.0002] # DOMINO TILE HORIZONTAL-04-04 -1F052 ; [*11EF.0020.0002] # DOMINO TILE HORIZONTAL-04-05 -1F053 ; [*11F0.0020.0002] # DOMINO TILE HORIZONTAL-04-06 -1F054 ; [*11F1.0020.0002] # DOMINO TILE HORIZONTAL-05-00 -1F055 ; [*11F2.0020.0002] # DOMINO TILE HORIZONTAL-05-01 -1F056 ; [*11F3.0020.0002] # DOMINO TILE HORIZONTAL-05-02 -1F057 ; [*11F4.0020.0002] # DOMINO TILE HORIZONTAL-05-03 -1F058 ; [*11F5.0020.0002] # DOMINO TILE HORIZONTAL-05-04 -1F059 ; [*11F6.0020.0002] # DOMINO TILE HORIZONTAL-05-05 -1F05A ; [*11F7.0020.0002] # DOMINO TILE HORIZONTAL-05-06 -1F05B ; [*11F8.0020.0002] # DOMINO TILE HORIZONTAL-06-00 -1F05C ; [*11F9.0020.0002] # DOMINO TILE HORIZONTAL-06-01 -1F05D ; [*11FA.0020.0002] # DOMINO TILE HORIZONTAL-06-02 -1F05E ; [*11FB.0020.0002] # DOMINO TILE HORIZONTAL-06-03 -1F05F ; [*11FC.0020.0002] # DOMINO TILE HORIZONTAL-06-04 -1F060 ; [*11FD.0020.0002] # DOMINO TILE HORIZONTAL-06-05 -1F061 ; [*11FE.0020.0002] # DOMINO TILE HORIZONTAL-06-06 -1F062 ; [*11FF.0020.0002] # DOMINO TILE VERTICAL BACK -1F063 ; [*1200.0020.0002] # DOMINO TILE VERTICAL-00-00 -1F064 ; [*1201.0020.0002] # DOMINO TILE VERTICAL-00-01 -1F065 ; [*1202.0020.0002] # DOMINO TILE VERTICAL-00-02 -1F066 ; [*1203.0020.0002] # DOMINO TILE VERTICAL-00-03 -1F067 ; [*1204.0020.0002] # DOMINO TILE VERTICAL-00-04 -1F068 ; [*1205.0020.0002] # DOMINO TILE VERTICAL-00-05 -1F069 ; [*1206.0020.0002] # DOMINO TILE VERTICAL-00-06 -1F06A ; [*1207.0020.0002] # DOMINO TILE VERTICAL-01-00 -1F06B ; [*1208.0020.0002] # DOMINO TILE VERTICAL-01-01 -1F06C ; [*1209.0020.0002] # DOMINO TILE VERTICAL-01-02 -1F06D ; [*120A.0020.0002] # DOMINO TILE VERTICAL-01-03 -1F06E ; [*120B.0020.0002] # DOMINO TILE VERTICAL-01-04 -1F06F ; [*120C.0020.0002] # DOMINO TILE VERTICAL-01-05 -1F070 ; [*120D.0020.0002] # DOMINO TILE VERTICAL-01-06 -1F071 ; [*120E.0020.0002] # DOMINO TILE VERTICAL-02-00 -1F072 ; [*120F.0020.0002] # DOMINO TILE VERTICAL-02-01 -1F073 ; [*1210.0020.0002] # DOMINO TILE VERTICAL-02-02 -1F074 ; [*1211.0020.0002] # DOMINO TILE VERTICAL-02-03 -1F075 ; [*1212.0020.0002] # DOMINO TILE VERTICAL-02-04 -1F076 ; [*1213.0020.0002] # DOMINO TILE VERTICAL-02-05 -1F077 ; [*1214.0020.0002] # DOMINO TILE VERTICAL-02-06 -1F078 ; [*1215.0020.0002] # DOMINO TILE VERTICAL-03-00 -1F079 ; [*1216.0020.0002] # DOMINO TILE VERTICAL-03-01 -1F07A ; [*1217.0020.0002] # DOMINO TILE VERTICAL-03-02 -1F07B ; [*1218.0020.0002] # DOMINO TILE VERTICAL-03-03 -1F07C ; [*1219.0020.0002] # DOMINO TILE VERTICAL-03-04 -1F07D ; [*121A.0020.0002] # DOMINO TILE VERTICAL-03-05 -1F07E ; [*121B.0020.0002] # DOMINO TILE VERTICAL-03-06 -1F07F ; [*121C.0020.0002] # DOMINO TILE VERTICAL-04-00 -1F080 ; [*121D.0020.0002] # DOMINO TILE VERTICAL-04-01 -1F081 ; [*121E.0020.0002] # DOMINO TILE VERTICAL-04-02 -1F082 ; [*121F.0020.0002] # DOMINO TILE VERTICAL-04-03 -1F083 ; [*1220.0020.0002] # DOMINO TILE VERTICAL-04-04 -1F084 ; [*1221.0020.0002] # DOMINO TILE VERTICAL-04-05 -1F085 ; [*1222.0020.0002] # DOMINO TILE VERTICAL-04-06 -1F086 ; [*1223.0020.0002] # DOMINO TILE VERTICAL-05-00 -1F087 ; [*1224.0020.0002] # DOMINO TILE VERTICAL-05-01 -1F088 ; [*1225.0020.0002] # DOMINO TILE VERTICAL-05-02 -1F089 ; [*1226.0020.0002] # DOMINO TILE VERTICAL-05-03 -1F08A ; [*1227.0020.0002] # DOMINO TILE VERTICAL-05-04 -1F08B ; [*1228.0020.0002] # DOMINO TILE VERTICAL-05-05 -1F08C ; [*1229.0020.0002] # DOMINO TILE VERTICAL-05-06 -1F08D ; [*122A.0020.0002] # DOMINO TILE VERTICAL-06-00 -1F08E ; [*122B.0020.0002] # DOMINO TILE VERTICAL-06-01 -1F08F ; [*122C.0020.0002] # DOMINO TILE VERTICAL-06-02 -1F090 ; [*122D.0020.0002] # DOMINO TILE VERTICAL-06-03 -1F091 ; [*122E.0020.0002] # DOMINO TILE VERTICAL-06-04 -1F092 ; [*122F.0020.0002] # DOMINO TILE VERTICAL-06-05 -1F093 ; [*1230.0020.0002] # DOMINO TILE VERTICAL-06-06 -1F0A0 ; [*1231.0020.0002] # PLAYING CARD BACK -1F0A1 ; [*1232.0020.0002] # PLAYING CARD ACE OF SPADES -1F0A2 ; [*1233.0020.0002] # PLAYING CARD TWO OF SPADES -1F0A3 ; [*1234.0020.0002] # PLAYING CARD THREE OF SPADES -1F0A4 ; [*1235.0020.0002] # PLAYING CARD FOUR OF SPADES -1F0A5 ; [*1236.0020.0002] # PLAYING CARD FIVE OF SPADES -1F0A6 ; [*1237.0020.0002] # PLAYING CARD SIX OF SPADES -1F0A7 ; [*1238.0020.0002] # PLAYING CARD SEVEN OF SPADES -1F0A8 ; [*1239.0020.0002] # PLAYING CARD EIGHT OF SPADES -1F0A9 ; [*123A.0020.0002] # PLAYING CARD NINE OF SPADES -1F0AA ; [*123B.0020.0002] # PLAYING CARD TEN OF SPADES -1F0AB ; [*123C.0020.0002] # PLAYING CARD JACK OF SPADES -1F0AC ; [*123D.0020.0002] # PLAYING CARD KNIGHT OF SPADES -1F0AD ; [*123E.0020.0002] # PLAYING CARD QUEEN OF SPADES -1F0AE ; [*123F.0020.0002] # PLAYING CARD KING OF SPADES -1F0B1 ; [*1240.0020.0002] # PLAYING CARD ACE OF HEARTS -1F0B2 ; [*1241.0020.0002] # PLAYING CARD TWO OF HEARTS -1F0B3 ; [*1242.0020.0002] # PLAYING CARD THREE OF HEARTS -1F0B4 ; [*1243.0020.0002] # PLAYING CARD FOUR OF HEARTS -1F0B5 ; [*1244.0020.0002] # PLAYING CARD FIVE OF HEARTS -1F0B6 ; [*1245.0020.0002] # PLAYING CARD SIX OF HEARTS -1F0B7 ; [*1246.0020.0002] # PLAYING CARD SEVEN OF HEARTS -1F0B8 ; [*1247.0020.0002] # PLAYING CARD EIGHT OF HEARTS -1F0B9 ; [*1248.0020.0002] # PLAYING CARD NINE OF HEARTS -1F0BA ; [*1249.0020.0002] # PLAYING CARD TEN OF HEARTS -1F0BB ; [*124A.0020.0002] # PLAYING CARD JACK OF HEARTS -1F0BC ; [*124B.0020.0002] # PLAYING CARD KNIGHT OF HEARTS -1F0BD ; [*124C.0020.0002] # PLAYING CARD QUEEN OF HEARTS -1F0BE ; [*124D.0020.0002] # PLAYING CARD KING OF HEARTS -1F0BF ; [*124E.0020.0002] # PLAYING CARD RED JOKER -1F0C1 ; [*124F.0020.0002] # PLAYING CARD ACE OF DIAMONDS -1F0C2 ; [*1250.0020.0002] # PLAYING CARD TWO OF DIAMONDS -1F0C3 ; [*1251.0020.0002] # PLAYING CARD THREE OF DIAMONDS -1F0C4 ; [*1252.0020.0002] # PLAYING CARD FOUR OF DIAMONDS -1F0C5 ; [*1253.0020.0002] # PLAYING CARD FIVE OF DIAMONDS -1F0C6 ; [*1254.0020.0002] # PLAYING CARD SIX OF DIAMONDS -1F0C7 ; [*1255.0020.0002] # PLAYING CARD SEVEN OF DIAMONDS -1F0C8 ; [*1256.0020.0002] # PLAYING CARD EIGHT OF DIAMONDS -1F0C9 ; [*1257.0020.0002] # PLAYING CARD NINE OF DIAMONDS -1F0CA ; [*1258.0020.0002] # PLAYING CARD TEN OF DIAMONDS -1F0CB ; [*1259.0020.0002] # PLAYING CARD JACK OF DIAMONDS -1F0CC ; [*125A.0020.0002] # PLAYING CARD KNIGHT OF DIAMONDS -1F0CD ; [*125B.0020.0002] # PLAYING CARD QUEEN OF DIAMONDS -1F0CE ; [*125C.0020.0002] # PLAYING CARD KING OF DIAMONDS -1F0CF ; [*125D.0020.0002] # PLAYING CARD BLACK JOKER -1F0D1 ; [*125E.0020.0002] # PLAYING CARD ACE OF CLUBS -1F0D2 ; [*125F.0020.0002] # PLAYING CARD TWO OF CLUBS -1F0D3 ; [*1260.0020.0002] # PLAYING CARD THREE OF CLUBS -1F0D4 ; [*1261.0020.0002] # PLAYING CARD FOUR OF CLUBS -1F0D5 ; [*1262.0020.0002] # PLAYING CARD FIVE OF CLUBS -1F0D6 ; [*1263.0020.0002] # PLAYING CARD SIX OF CLUBS -1F0D7 ; [*1264.0020.0002] # PLAYING CARD SEVEN OF CLUBS -1F0D8 ; [*1265.0020.0002] # PLAYING CARD EIGHT OF CLUBS -1F0D9 ; [*1266.0020.0002] # PLAYING CARD NINE OF CLUBS -1F0DA ; [*1267.0020.0002] # PLAYING CARD TEN OF CLUBS -1F0DB ; [*1268.0020.0002] # PLAYING CARD JACK OF CLUBS -1F0DC ; [*1269.0020.0002] # PLAYING CARD KNIGHT OF CLUBS -1F0DD ; [*126A.0020.0002] # PLAYING CARD QUEEN OF CLUBS -1F0DE ; [*126B.0020.0002] # PLAYING CARD KING OF CLUBS -1F0DF ; [*126C.0020.0002] # PLAYING CARD WHITE JOKER -1F0E0 ; [*126D.0020.0002] # PLAYING CARD FOOL -1F0E1 ; [*126E.0020.0002] # PLAYING CARD TRUMP-1 -1F0E2 ; [*126F.0020.0002] # PLAYING CARD TRUMP-2 -1F0E3 ; [*1270.0020.0002] # PLAYING CARD TRUMP-3 -1F0E4 ; [*1271.0020.0002] # PLAYING CARD TRUMP-4 -1F0E5 ; [*1272.0020.0002] # PLAYING CARD TRUMP-5 -1F0E6 ; [*1273.0020.0002] # PLAYING CARD TRUMP-6 -1F0E7 ; [*1274.0020.0002] # PLAYING CARD TRUMP-7 -1F0E8 ; [*1275.0020.0002] # PLAYING CARD TRUMP-8 -1F0E9 ; [*1276.0020.0002] # PLAYING CARD TRUMP-9 -1F0EA ; [*1277.0020.0002] # PLAYING CARD TRUMP-10 -1F0EB ; [*1278.0020.0002] # PLAYING CARD TRUMP-11 -1F0EC ; [*1279.0020.0002] # PLAYING CARD TRUMP-12 -1F0ED ; [*127A.0020.0002] # PLAYING CARD TRUMP-13 -1F0EE ; [*127B.0020.0002] # PLAYING CARD TRUMP-14 -1F0EF ; [*127C.0020.0002] # PLAYING CARD TRUMP-15 -1F0F0 ; [*127D.0020.0002] # PLAYING CARD TRUMP-16 -1F0F1 ; [*127E.0020.0002] # PLAYING CARD TRUMP-17 -1F0F2 ; [*127F.0020.0002] # PLAYING CARD TRUMP-18 -1F0F3 ; [*1280.0020.0002] # PLAYING CARD TRUMP-19 -1F0F4 ; [*1281.0020.0002] # PLAYING CARD TRUMP-20 -1F0F5 ; [*1282.0020.0002] # PLAYING CARD TRUMP-21 -1F1E6 ; [*09E3.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER A -1F1E7 ; [*09E4.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER B -1F1E8 ; [*09E5.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER C -1F1E9 ; [*09E6.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER D -1F1EA ; [*09E7.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER E -1F1EB ; [*09E8.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER F -1F1EC ; [*09E9.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER G -1F1ED ; [*09EA.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER H -1F1EE ; [*09EB.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER I -1F1EF ; [*09EC.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER J -1F1F0 ; [*09ED.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER K -1F1F1 ; [*09EE.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER L -1F1F2 ; [*09EF.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER M -1F1F3 ; [*09F0.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER N -1F1F4 ; [*09F1.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER O -1F1F5 ; [*09F2.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER P -1F1F6 ; [*09F3.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Q -1F1F7 ; [*09F4.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER R -1F1F8 ; [*09F5.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER S -1F1F9 ; [*09F6.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER T -1F1FA ; [*09F7.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER U -1F1FB ; [*09F8.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER V -1F1FC ; [*09F9.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER W -1F1FD ; [*09FA.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER X -1F1FE ; [*09FB.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Y -1F1FF ; [*09FC.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Z -1F300 ; [*1283.0020.0002] # CYCLONE -1F301 ; [*1284.0020.0002] # FOGGY -1F302 ; [*1285.0020.0002] # CLOSED UMBRELLA -1F303 ; [*1286.0020.0002] # NIGHT WITH STARS -1F304 ; [*1287.0020.0002] # SUNRISE OVER MOUNTAINS -1F305 ; [*1288.0020.0002] # SUNRISE -1F306 ; [*1289.0020.0002] # CITYSCAPE AT DUSK -1F307 ; [*128A.0020.0002] # SUNSET OVER BUILDINGS -1F308 ; [*128B.0020.0002] # RAINBOW -1F309 ; [*128C.0020.0002] # BRIDGE AT NIGHT -1F30A ; [*128D.0020.0002] # WATER WAVE -1F30B ; [*128E.0020.0002] # VOLCANO -1F30C ; [*128F.0020.0002] # MILKY WAY -1F30D ; [*1290.0020.0002] # EARTH GLOBE EUROPE-AFRICA -1F30E ; [*1291.0020.0002] # EARTH GLOBE AMERICAS -1F30F ; [*1292.0020.0002] # EARTH GLOBE ASIA-AUSTRALIA -1F310 ; [*1293.0020.0002] # GLOBE WITH MERIDIANS -1F311 ; [*1294.0020.0002] # NEW MOON SYMBOL -1F312 ; [*1295.0020.0002] # WAXING CRESCENT MOON SYMBOL -1F313 ; [*1296.0020.0002] # FIRST QUARTER MOON SYMBOL -1F314 ; [*1297.0020.0002] # WAXING GIBBOUS MOON SYMBOL -1F315 ; [*1298.0020.0002] # FULL MOON SYMBOL -1F316 ; [*1299.0020.0002] # WANING GIBBOUS MOON SYMBOL -1F317 ; [*129A.0020.0002] # LAST QUARTER MOON SYMBOL -1F318 ; [*129B.0020.0002] # WANING CRESCENT MOON SYMBOL -1F319 ; [*129C.0020.0002] # CRESCENT MOON -1F31A ; [*129D.0020.0002] # NEW MOON WITH FACE -1F31B ; [*129E.0020.0002] # FIRST QUARTER MOON WITH FACE -1F31C ; [*129F.0020.0002] # LAST QUARTER MOON WITH FACE -1F31D ; [*12A0.0020.0002] # FULL MOON WITH FACE -1F31E ; [*12A1.0020.0002] # SUN WITH FACE -1F31F ; [*12A2.0020.0002] # GLOWING STAR -1F320 ; [*12A3.0020.0002] # SHOOTING STAR -1F321 ; [*12A4.0020.0002] # THERMOMETER -1F322 ; [*12A5.0020.0002] # BLACK DROPLET -1F323 ; [*12A6.0020.0002] # WHITE SUN -1F324 ; [*12A7.0020.0002] # WHITE SUN WITH SMALL CLOUD -1F325 ; [*12A8.0020.0002] # WHITE SUN BEHIND CLOUD -1F326 ; [*12A9.0020.0002] # WHITE SUN BEHIND CLOUD WITH RAIN -1F327 ; [*12AA.0020.0002] # CLOUD WITH RAIN -1F328 ; [*12AB.0020.0002] # CLOUD WITH SNOW -1F329 ; [*12AC.0020.0002] # CLOUD WITH LIGHTNING -1F32A ; [*12AD.0020.0002] # CLOUD WITH TORNADO -1F32B ; [*12AE.0020.0002] # FOG -1F32C ; [*12AF.0020.0002] # WIND BLOWING FACE -1F32D ; [*12B0.0020.0002] # HOT DOG -1F32E ; [*12B1.0020.0002] # TACO -1F32F ; [*12B2.0020.0002] # BURRITO -1F330 ; [*12B3.0020.0002] # CHESTNUT -1F331 ; [*12B4.0020.0002] # SEEDLING -1F332 ; [*12B5.0020.0002] # EVERGREEN TREE -1F333 ; [*12B6.0020.0002] # DECIDUOUS TREE -1F334 ; [*12B7.0020.0002] # PALM TREE -1F335 ; [*12B8.0020.0002] # CACTUS -1F336 ; [*12B9.0020.0002] # HOT PEPPER -1F337 ; [*12BA.0020.0002] # TULIP -1F338 ; [*12BB.0020.0002] # CHERRY BLOSSOM -1F339 ; [*12BC.0020.0002] # ROSE -1F33A ; [*12BD.0020.0002] # HIBISCUS -1F33B ; [*12BE.0020.0002] # SUNFLOWER -1F33C ; [*12BF.0020.0002] # BLOSSOM -1F33D ; [*12C0.0020.0002] # EAR OF MAIZE -1F33E ; [*12C1.0020.0002] # EAR OF RICE -1F33F ; [*12C2.0020.0002] # HERB -1F340 ; [*12C3.0020.0002] # FOUR LEAF CLOVER -1F341 ; [*12C4.0020.0002] # MAPLE LEAF -1F342 ; [*12C5.0020.0002] # FALLEN LEAF -1F343 ; [*12C6.0020.0002] # LEAF FLUTTERING IN WIND -1F344 ; [*12C7.0020.0002] # MUSHROOM -1F345 ; [*12C8.0020.0002] # TOMATO -1F346 ; [*12C9.0020.0002] # AUBERGINE -1F347 ; [*12CA.0020.0002] # GRAPES -1F348 ; [*12CB.0020.0002] # MELON -1F349 ; [*12CC.0020.0002] # WATERMELON -1F34A ; [*12CD.0020.0002] # TANGERINE -1F34B ; [*12CE.0020.0002] # LEMON -1F34C ; [*12CF.0020.0002] # BANANA -1F34D ; [*12D0.0020.0002] # PINEAPPLE -1F34E ; [*12D1.0020.0002] # RED APPLE -1F34F ; [*12D2.0020.0002] # GREEN APPLE -1F350 ; [*12D3.0020.0002] # PEAR -1F351 ; [*12D4.0020.0002] # PEACH -1F352 ; [*12D5.0020.0002] # CHERRIES -1F353 ; [*12D6.0020.0002] # STRAWBERRY -1F354 ; [*12D7.0020.0002] # HAMBURGER -1F355 ; [*12D8.0020.0002] # SLICE OF PIZZA -1F356 ; [*12D9.0020.0002] # MEAT ON BONE -1F357 ; [*12DA.0020.0002] # POULTRY LEG -1F358 ; [*12DB.0020.0002] # RICE CRACKER -1F359 ; [*12DC.0020.0002] # RICE BALL -1F35A ; [*12DD.0020.0002] # COOKED RICE -1F35B ; [*12DE.0020.0002] # CURRY AND RICE -1F35C ; [*12DF.0020.0002] # STEAMING BOWL -1F35D ; [*12E0.0020.0002] # SPAGHETTI -1F35E ; [*12E1.0020.0002] # BREAD -1F35F ; [*12E2.0020.0002] # FRENCH FRIES -1F360 ; [*12E3.0020.0002] # ROASTED SWEET POTATO -1F361 ; [*12E4.0020.0002] # DANGO -1F362 ; [*12E5.0020.0002] # ODEN -1F363 ; [*12E6.0020.0002] # SUSHI -1F364 ; [*12E7.0020.0002] # FRIED SHRIMP -1F365 ; [*12E8.0020.0002] # FISH CAKE WITH SWIRL DESIGN -1F366 ; [*12E9.0020.0002] # SOFT ICE CREAM -1F367 ; [*12EA.0020.0002] # SHAVED ICE -1F368 ; [*12EB.0020.0002] # ICE CREAM -1F369 ; [*12EC.0020.0002] # DOUGHNUT -1F36A ; [*12ED.0020.0002] # COOKIE -1F36B ; [*12EE.0020.0002] # CHOCOLATE BAR -1F36C ; [*12EF.0020.0002] # CANDY -1F36D ; [*12F0.0020.0002] # LOLLIPOP -1F36E ; [*12F1.0020.0002] # CUSTARD -1F36F ; [*12F2.0020.0002] # HONEY POT -1F370 ; [*12F3.0020.0002] # SHORTCAKE -1F371 ; [*12F4.0020.0002] # BENTO BOX -1F372 ; [*12F5.0020.0002] # POT OF FOOD -1F373 ; [*12F6.0020.0002] # COOKING -1F374 ; [*12F7.0020.0002] # FORK AND KNIFE -1F375 ; [*12F8.0020.0002] # TEACUP WITHOUT HANDLE -1F376 ; [*12F9.0020.0002] # SAKE BOTTLE AND CUP -1F377 ; [*12FA.0020.0002] # WINE GLASS -1F378 ; [*12FB.0020.0002] # COCKTAIL GLASS -1F379 ; [*12FC.0020.0002] # TROPICAL DRINK -1F37A ; [*12FD.0020.0002] # BEER MUG -1F37B ; [*12FE.0020.0002] # CLINKING BEER MUGS -1F37C ; [*12FF.0020.0002] # BABY BOTTLE -1F37D ; [*1300.0020.0002] # FORK AND KNIFE WITH PLATE -1F37E ; [*1301.0020.0002] # BOTTLE WITH POPPING CORK -1F37F ; [*1302.0020.0002] # POPCORN -1F380 ; [*1303.0020.0002] # RIBBON -1F381 ; [*1304.0020.0002] # WRAPPED PRESENT -1F382 ; [*1305.0020.0002] # BIRTHDAY CAKE -1F383 ; [*1306.0020.0002] # JACK-O-LANTERN -1F384 ; [*1307.0020.0002] # CHRISTMAS TREE -1F385 ; [*1308.0020.0002] # FATHER CHRISTMAS -1F386 ; [*1309.0020.0002] # FIREWORKS -1F387 ; [*130A.0020.0002] # FIREWORK SPARKLER -1F388 ; [*130B.0020.0002] # BALLOON -1F389 ; [*130C.0020.0002] # PARTY POPPER -1F38A ; [*130D.0020.0002] # CONFETTI BALL -1F38B ; [*130E.0020.0002] # TANABATA TREE -1F38C ; [*130F.0020.0002] # CROSSED FLAGS -1F38D ; [*1310.0020.0002] # PINE DECORATION -1F38E ; [*1311.0020.0002] # JAPANESE DOLLS -1F38F ; [*1312.0020.0002] # CARP STREAMER -1F390 ; [*1313.0020.0002] # WIND CHIME -1F391 ; [*1314.0020.0002] # MOON VIEWING CEREMONY -1F392 ; [*1315.0020.0002] # SCHOOL SATCHEL -1F393 ; [*1316.0020.0002] # GRADUATION CAP -1F394 ; [*1317.0020.0002] # HEART WITH TIP ON THE LEFT -1F395 ; [*1318.0020.0002] # BOUQUET OF FLOWERS -1F396 ; [*1319.0020.0002] # MILITARY MEDAL -1F397 ; [*131A.0020.0002] # REMINDER RIBBON -1F398 ; [*131B.0020.0002] # MUSICAL KEYBOARD WITH JACKS -1F399 ; [*131C.0020.0002] # STUDIO MICROPHONE -1F39A ; [*131D.0020.0002] # LEVEL SLIDER -1F39B ; [*131E.0020.0002] # CONTROL KNOBS -1F39C ; [*131F.0020.0002] # BEAMED ASCENDING MUSICAL NOTES -1F39D ; [*1320.0020.0002] # BEAMED DESCENDING MUSICAL NOTES -1F39E ; [*1321.0020.0002] # FILM FRAMES -1F39F ; [*1322.0020.0002] # ADMISSION TICKETS -1F3A0 ; [*1323.0020.0002] # CAROUSEL HORSE -1F3A1 ; [*1324.0020.0002] # FERRIS WHEEL -1F3A2 ; [*1325.0020.0002] # ROLLER COASTER -1F3A3 ; [*1326.0020.0002] # FISHING POLE AND FISH -1F3A4 ; [*1327.0020.0002] # MICROPHONE -1F3A5 ; [*1328.0020.0002] # MOVIE CAMERA -1F3A6 ; [*1329.0020.0002] # CINEMA -1F3A7 ; [*132A.0020.0002] # HEADPHONE -1F3A8 ; [*132B.0020.0002] # ARTIST PALETTE -1F3A9 ; [*132C.0020.0002] # TOP HAT -1F3AA ; [*132D.0020.0002] # CIRCUS TENT -1F3AB ; [*132E.0020.0002] # TICKET -1F3AC ; [*132F.0020.0002] # CLAPPER BOARD -1F3AD ; [*1330.0020.0002] # PERFORMING ARTS -1F3AE ; [*1331.0020.0002] # VIDEO GAME -1F3AF ; [*1332.0020.0002] # DIRECT HIT -1F3B0 ; [*1333.0020.0002] # SLOT MACHINE -1F3B1 ; [*1334.0020.0002] # BILLIARDS -1F3B2 ; [*1335.0020.0002] # GAME DIE -1F3B3 ; [*1336.0020.0002] # BOWLING -1F3B4 ; [*1337.0020.0002] # FLOWER PLAYING CARDS -1F3B5 ; [*1338.0020.0002] # MUSICAL NOTE -1F3B6 ; [*1339.0020.0002] # MULTIPLE MUSICAL NOTES -1F3B7 ; [*133A.0020.0002] # SAXOPHONE -1F3B8 ; [*133B.0020.0002] # GUITAR -1F3B9 ; [*133C.0020.0002] # MUSICAL KEYBOARD -1F3BA ; [*133D.0020.0002] # TRUMPET -1F3BB ; [*133E.0020.0002] # VIOLIN -1F3BC ; [*133F.0020.0002] # MUSICAL SCORE -1F3BD ; [*1340.0020.0002] # RUNNING SHIRT WITH SASH -1F3BE ; [*1341.0020.0002] # TENNIS RACQUET AND BALL -1F3BF ; [*1342.0020.0002] # SKI AND SKI BOOT -1F3C0 ; [*1343.0020.0002] # BASKETBALL AND HOOP -1F3C1 ; [*1344.0020.0002] # CHEQUERED FLAG -1F3C2 ; [*1345.0020.0002] # SNOWBOARDER -1F3C3 ; [*1346.0020.0002] # RUNNER -1F3C4 ; [*1347.0020.0002] # SURFER -1F3C5 ; [*1348.0020.0002] # SPORTS MEDAL -1F3C6 ; [*1349.0020.0002] # TROPHY -1F3C7 ; [*134A.0020.0002] # HORSE RACING -1F3C8 ; [*134B.0020.0002] # AMERICAN FOOTBALL -1F3C9 ; [*134C.0020.0002] # RUGBY FOOTBALL -1F3CA ; [*134D.0020.0002] # SWIMMER -1F3CB ; [*134E.0020.0002] # WEIGHT LIFTER -1F3CC ; [*134F.0020.0002] # GOLFER -1F3CD ; [*1350.0020.0002] # RACING MOTORCYCLE -1F3CE ; [*1351.0020.0002] # RACING CAR -1F3CF ; [*1352.0020.0002] # CRICKET BAT AND BALL -1F3D0 ; [*1353.0020.0002] # VOLLEYBALL -1F3D1 ; [*1354.0020.0002] # FIELD HOCKEY STICK AND BALL -1F3D2 ; [*1355.0020.0002] # ICE HOCKEY STICK AND PUCK -1F3D3 ; [*1356.0020.0002] # TABLE TENNIS PADDLE AND BALL -1F3D4 ; [*1357.0020.0002] # SNOW CAPPED MOUNTAIN -1F3D5 ; [*1358.0020.0002] # CAMPING -1F3D6 ; [*1359.0020.0002] # BEACH WITH UMBRELLA -1F3D7 ; [*135A.0020.0002] # BUILDING CONSTRUCTION -1F3D8 ; [*135B.0020.0002] # HOUSE BUILDINGS -1F3D9 ; [*135C.0020.0002] # CITYSCAPE -1F3DA ; [*135D.0020.0002] # DERELICT HOUSE BUILDING -1F3DB ; [*135E.0020.0002] # CLASSICAL BUILDING -1F3DC ; [*135F.0020.0002] # DESERT -1F3DD ; [*1360.0020.0002] # DESERT ISLAND -1F3DE ; [*1361.0020.0002] # NATIONAL PARK -1F3DF ; [*1362.0020.0002] # STADIUM -1F3E0 ; [*1363.0020.0002] # HOUSE BUILDING -1F3E1 ; [*1364.0020.0002] # HOUSE WITH GARDEN -1F3E2 ; [*1365.0020.0002] # OFFICE BUILDING -1F3E3 ; [*1366.0020.0002] # JAPANESE POST OFFICE -1F3E4 ; [*1367.0020.0002] # EUROPEAN POST OFFICE -1F3E5 ; [*1368.0020.0002] # HOSPITAL -1F3E6 ; [*1369.0020.0002] # BANK -1F3E7 ; [*136A.0020.0002] # AUTOMATED TELLER MACHINE -1F3E8 ; [*136B.0020.0002] # HOTEL -1F3E9 ; [*136C.0020.0002] # LOVE HOTEL -1F3EA ; [*136D.0020.0002] # CONVENIENCE STORE -1F3EB ; [*136E.0020.0002] # SCHOOL -1F3EC ; [*136F.0020.0002] # DEPARTMENT STORE -1F3ED ; [*1370.0020.0002] # FACTORY -1F3EE ; [*1371.0020.0002] # IZAKAYA LANTERN -1F3EF ; [*1372.0020.0002] # JAPANESE CASTLE -1F3F0 ; [*1373.0020.0002] # EUROPEAN CASTLE -1F3F1 ; [*1374.0020.0002] # WHITE PENNANT -1F3F2 ; [*1375.0020.0002] # BLACK PENNANT -1F3F3 ; [*1376.0020.0002] # WAVING WHITE FLAG -1F3F4 ; [*1377.0020.0002] # WAVING BLACK FLAG -1F3F5 ; [*1378.0020.0002] # ROSETTE -1F3F6 ; [*1379.0020.0002] # BLACK ROSETTE -1F3F7 ; [*137A.0020.0002] # LABEL -1F3F8 ; [*137B.0020.0002] # BADMINTON RACQUET AND SHUTTLECOCK -1F3F9 ; [*137C.0020.0002] # BOW AND ARROW -1F3FA ; [*137D.0020.0002] # AMPHORA -1F3FB ; [*137E.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-1-2 -1F3FC ; [*137F.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-3 -1F3FD ; [*1380.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-4 -1F3FE ; [*1381.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-5 -1F3FF ; [*1382.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400 ; [*1383.0020.0002] # RAT -1F401 ; [*1384.0020.0002] # MOUSE -1F402 ; [*1385.0020.0002] # OX -1F403 ; [*1386.0020.0002] # WATER BUFFALO -1F404 ; [*1387.0020.0002] # COW -1F405 ; [*1388.0020.0002] # TIGER -1F406 ; [*1389.0020.0002] # LEOPARD -1F407 ; [*138A.0020.0002] # RABBIT -1F408 ; [*138B.0020.0002] # CAT -1F409 ; [*138C.0020.0002] # DRAGON -1F40A ; [*138D.0020.0002] # CROCODILE -1F40B ; [*138E.0020.0002] # WHALE -1F40C ; [*138F.0020.0002] # SNAIL -1F40D ; [*1390.0020.0002] # SNAKE -1F40E ; [*1391.0020.0002] # HORSE -1F40F ; [*1392.0020.0002] # RAM -1F410 ; [*1393.0020.0002] # GOAT -1F411 ; [*1394.0020.0002] # SHEEP -1F412 ; [*1395.0020.0002] # MONKEY -1F413 ; [*1396.0020.0002] # ROOSTER -1F414 ; [*1397.0020.0002] # CHICKEN -1F415 ; [*1398.0020.0002] # DOG -1F416 ; [*1399.0020.0002] # PIG -1F417 ; [*139A.0020.0002] # BOAR -1F418 ; [*139B.0020.0002] # ELEPHANT -1F419 ; [*139C.0020.0002] # OCTOPUS -1F41A ; [*139D.0020.0002] # SPIRAL SHELL -1F41B ; [*139E.0020.0002] # BUG -1F41C ; [*139F.0020.0002] # ANT -1F41D ; [*13A0.0020.0002] # HONEYBEE -1F41E ; [*13A1.0020.0002] # LADY BEETLE -1F41F ; [*13A2.0020.0002] # FISH -1F420 ; [*13A3.0020.0002] # TROPICAL FISH -1F421 ; [*13A4.0020.0002] # BLOWFISH -1F422 ; [*13A5.0020.0002] # TURTLE -1F423 ; [*13A6.0020.0002] # HATCHING CHICK -1F424 ; [*13A7.0020.0002] # BABY CHICK -1F425 ; [*13A8.0020.0002] # FRONT-FACING BABY CHICK -1F426 ; [*13A9.0020.0002] # BIRD -1F427 ; [*13AA.0020.0002] # PENGUIN -1F428 ; [*13AB.0020.0002] # KOALA -1F429 ; [*13AC.0020.0002] # POODLE -1F42A ; [*13AD.0020.0002] # DROMEDARY CAMEL -1F42B ; [*13AE.0020.0002] # BACTRIAN CAMEL -1F42C ; [*13AF.0020.0002] # DOLPHIN -1F42D ; [*13B0.0020.0002] # MOUSE FACE -1F42E ; [*13B1.0020.0002] # COW FACE -1F42F ; [*13B2.0020.0002] # TIGER FACE -1F430 ; [*13B3.0020.0002] # RABBIT FACE -1F431 ; [*13B4.0020.0002] # CAT FACE -1F432 ; [*13B5.0020.0002] # DRAGON FACE -1F433 ; [*13B6.0020.0002] # SPOUTING WHALE -1F434 ; [*13B7.0020.0002] # HORSE FACE -1F435 ; [*13B8.0020.0002] # MONKEY FACE -1F436 ; [*13B9.0020.0002] # DOG FACE -1F437 ; [*13BA.0020.0002] # PIG FACE -1F438 ; [*13BB.0020.0002] # FROG FACE -1F439 ; [*13BC.0020.0002] # HAMSTER FACE -1F43A ; [*13BD.0020.0002] # WOLF FACE -1F43B ; [*13BE.0020.0002] # BEAR FACE -1F43C ; [*13BF.0020.0002] # PANDA FACE -1F43D ; [*13C0.0020.0002] # PIG NOSE -1F43E ; [*13C1.0020.0002] # PAW PRINTS -1F43F ; [*13C2.0020.0002] # CHIPMUNK -1F440 ; [*13C3.0020.0002] # EYES -1F441 ; [*13C4.0020.0002] # EYE -1F442 ; [*13C5.0020.0002] # EAR -1F443 ; [*13C6.0020.0002] # NOSE -1F444 ; [*13C7.0020.0002] # MOUTH -1F445 ; [*13C8.0020.0002] # TONGUE -1F446 ; [*13C9.0020.0002] # WHITE UP POINTING BACKHAND INDEX -1F447 ; [*13CA.0020.0002] # WHITE DOWN POINTING BACKHAND INDEX -1F448 ; [*13CB.0020.0002] # WHITE LEFT POINTING BACKHAND INDEX -1F449 ; [*13CC.0020.0002] # WHITE RIGHT POINTING BACKHAND INDEX -1F44A ; [*13CD.0020.0002] # FISTED HAND SIGN -1F44B ; [*13CE.0020.0002] # WAVING HAND SIGN -1F44C ; [*13CF.0020.0002] # OK HAND SIGN -1F44D ; [*13D0.0020.0002] # THUMBS UP SIGN -1F44E ; [*13D1.0020.0002] # THUMBS DOWN SIGN -1F44F ; [*13D2.0020.0002] # CLAPPING HANDS SIGN -1F450 ; [*13D3.0020.0002] # OPEN HANDS SIGN -1F451 ; [*13D4.0020.0002] # CROWN -1F452 ; [*13D5.0020.0002] # WOMANS HAT -1F453 ; [*13D6.0020.0002] # EYEGLASSES -1F454 ; [*13D7.0020.0002] # NECKTIE -1F455 ; [*13D8.0020.0002] # T-SHIRT -1F456 ; [*13D9.0020.0002] # JEANS -1F457 ; [*13DA.0020.0002] # DRESS -1F458 ; [*13DB.0020.0002] # KIMONO -1F459 ; [*13DC.0020.0002] # BIKINI -1F45A ; [*13DD.0020.0002] # WOMANS CLOTHES -1F45B ; [*13DE.0020.0002] # PURSE -1F45C ; [*13DF.0020.0002] # HANDBAG -1F45D ; [*13E0.0020.0002] # POUCH -1F45E ; [*13E1.0020.0002] # MANS SHOE -1F45F ; [*13E2.0020.0002] # ATHLETIC SHOE -1F460 ; [*13E3.0020.0002] # HIGH-HEELED SHOE -1F461 ; [*13E4.0020.0002] # WOMANS SANDAL -1F462 ; [*13E5.0020.0002] # WOMANS BOOTS -1F463 ; [*13E6.0020.0002] # FOOTPRINTS -1F464 ; [*13E7.0020.0002] # BUST IN SILHOUETTE -1F465 ; [*13E8.0020.0002] # BUSTS IN SILHOUETTE -1F466 ; [*13E9.0020.0002] # BOY -1F467 ; [*13EA.0020.0002] # GIRL -1F468 ; [*13EB.0020.0002] # MAN -1F469 ; [*13EC.0020.0002] # WOMAN -1F46A ; [*13ED.0020.0002] # FAMILY -1F46B ; [*13EE.0020.0002] # MAN AND WOMAN HOLDING HANDS -1F46C ; [*13EF.0020.0002] # TWO MEN HOLDING HANDS -1F46D ; [*13F0.0020.0002] # TWO WOMEN HOLDING HANDS -1F46E ; [*13F1.0020.0002] # POLICE OFFICER -1F46F ; [*13F2.0020.0002] # WOMAN WITH BUNNY EARS -1F470 ; [*13F3.0020.0002] # BRIDE WITH VEIL -1F471 ; [*13F4.0020.0002] # PERSON WITH BLOND HAIR -1F472 ; [*13F5.0020.0002] # MAN WITH GUA PI MAO -1F473 ; [*13F6.0020.0002] # MAN WITH TURBAN -1F474 ; [*13F7.0020.0002] # OLDER MAN -1F475 ; [*13F8.0020.0002] # OLDER WOMAN -1F476 ; [*13F9.0020.0002] # BABY -1F477 ; [*13FA.0020.0002] # CONSTRUCTION WORKER -1F478 ; [*13FB.0020.0002] # PRINCESS -1F479 ; [*13FC.0020.0002] # JAPANESE OGRE -1F47A ; [*13FD.0020.0002] # JAPANESE GOBLIN -1F47B ; [*13FE.0020.0002] # GHOST -1F47C ; [*13FF.0020.0002] # BABY ANGEL -1F47D ; [*1400.0020.0002] # EXTRATERRESTRIAL ALIEN -1F47E ; [*1401.0020.0002] # ALIEN MONSTER -1F47F ; [*1402.0020.0002] # IMP -1F480 ; [*1403.0020.0002] # SKULL -1F481 ; [*1404.0020.0002] # INFORMATION DESK PERSON -1F482 ; [*1405.0020.0002] # GUARDSMAN -1F483 ; [*1406.0020.0002] # DANCER -1F484 ; [*1407.0020.0002] # LIPSTICK -1F485 ; [*1408.0020.0002] # NAIL POLISH -1F486 ; [*1409.0020.0002] # FACE MASSAGE -1F487 ; [*140A.0020.0002] # HAIRCUT -1F488 ; [*140B.0020.0002] # BARBER POLE -1F489 ; [*140C.0020.0002] # SYRINGE -1F48A ; [*140D.0020.0002] # PILL -1F48B ; [*140E.0020.0002] # KISS MARK -1F48C ; [*140F.0020.0002] # LOVE LETTER -1F48D ; [*1410.0020.0002] # RING -1F48E ; [*1411.0020.0002] # GEM STONE -1F48F ; [*1412.0020.0002] # KISS -1F490 ; [*1413.0020.0002] # BOUQUET -1F491 ; [*1414.0020.0002] # COUPLE WITH HEART -1F492 ; [*1415.0020.0002] # WEDDING -1F493 ; [*1416.0020.0002] # BEATING HEART -1F494 ; [*1417.0020.0002] # BROKEN HEART -1F495 ; [*1418.0020.0002] # TWO HEARTS -1F496 ; [*1419.0020.0002] # SPARKLING HEART -1F497 ; [*141A.0020.0002] # GROWING HEART -1F498 ; [*141B.0020.0002] # HEART WITH ARROW -1F499 ; [*141C.0020.0002] # BLUE HEART -1F49A ; [*141D.0020.0002] # GREEN HEART -1F49B ; [*141E.0020.0002] # YELLOW HEART -1F49C ; [*141F.0020.0002] # PURPLE HEART -1F49D ; [*1420.0020.0002] # HEART WITH RIBBON -1F49E ; [*1421.0020.0002] # REVOLVING HEARTS -1F49F ; [*1422.0020.0002] # HEART DECORATION -1F4A0 ; [*1423.0020.0002] # DIAMOND SHAPE WITH A DOT INSIDE -1F4A1 ; [*1424.0020.0002] # ELECTRIC LIGHT BULB -1F4A2 ; [*1425.0020.0002] # ANGER SYMBOL -1F4A3 ; [*1426.0020.0002] # BOMB -1F4A4 ; [*1427.0020.0002] # SLEEPING SYMBOL -1F4A5 ; [*1428.0020.0002] # COLLISION SYMBOL -1F4A6 ; [*1429.0020.0002] # SPLASHING SWEAT SYMBOL -1F4A7 ; [*142A.0020.0002] # DROPLET -1F4A8 ; [*142B.0020.0002] # DASH SYMBOL -1F4A9 ; [*142C.0020.0002] # PILE OF POO -1F4AA ; [*142D.0020.0002] # FLEXED BICEPS -1F4AB ; [*142E.0020.0002] # DIZZY SYMBOL -1F4AC ; [*142F.0020.0002] # SPEECH BALLOON -1F4AD ; [*1430.0020.0002] # THOUGHT BALLOON -1F4AE ; [*1431.0020.0002] # WHITE FLOWER -1F4AF ; [*1432.0020.0002] # HUNDRED POINTS SYMBOL -1F4B0 ; [*1433.0020.0002] # MONEY BAG -1F4B1 ; [*1434.0020.0002] # CURRENCY EXCHANGE -1F4B2 ; [*1435.0020.0002] # HEAVY DOLLAR SIGN -1F4B3 ; [*1436.0020.0002] # CREDIT CARD -1F4B4 ; [*1437.0020.0002] # BANKNOTE WITH YEN SIGN -1F4B5 ; [*1438.0020.0002] # BANKNOTE WITH DOLLAR SIGN -1F4B6 ; [*1439.0020.0002] # BANKNOTE WITH EURO SIGN -1F4B7 ; [*143A.0020.0002] # BANKNOTE WITH POUND SIGN -1F4B8 ; [*143B.0020.0002] # MONEY WITH WINGS -1F4B9 ; [*143C.0020.0002] # CHART WITH UPWARDS TREND AND YEN SIGN -1F4BA ; [*143D.0020.0002] # SEAT -1F4BB ; [*143E.0020.0002] # PERSONAL COMPUTER -1F4BC ; [*143F.0020.0002] # BRIEFCASE -1F4BD ; [*1440.0020.0002] # MINIDISC -1F4BE ; [*1441.0020.0002] # FLOPPY DISK -1F4BF ; [*1442.0020.0002] # OPTICAL DISC -1F4C0 ; [*1443.0020.0002] # DVD -1F4C1 ; [*1444.0020.0002] # FILE FOLDER -1F4C2 ; [*1445.0020.0002] # OPEN FILE FOLDER -1F4C3 ; [*1446.0020.0002] # PAGE WITH CURL -1F4C4 ; [*1447.0020.0002] # PAGE FACING UP -1F4C5 ; [*1448.0020.0002] # CALENDAR -1F4C6 ; [*1449.0020.0002] # TEAR-OFF CALENDAR -1F4C7 ; [*144A.0020.0002] # CARD INDEX -1F4C8 ; [*144B.0020.0002] # CHART WITH UPWARDS TREND -1F4C9 ; [*144C.0020.0002] # CHART WITH DOWNWARDS TREND -1F4CA ; [*144D.0020.0002] # BAR CHART -1F4CB ; [*144E.0020.0002] # CLIPBOARD -1F4CC ; [*144F.0020.0002] # PUSHPIN -1F4CD ; [*1450.0020.0002] # ROUND PUSHPIN -1F4CE ; [*1451.0020.0002] # PAPERCLIP -1F4CF ; [*1452.0020.0002] # STRAIGHT RULER -1F4D0 ; [*1453.0020.0002] # TRIANGULAR RULER -1F4D1 ; [*1454.0020.0002] # BOOKMARK TABS -1F4D2 ; [*1455.0020.0002] # LEDGER -1F4D3 ; [*1456.0020.0002] # NOTEBOOK -1F4D4 ; [*1457.0020.0002] # NOTEBOOK WITH DECORATIVE COVER -1F4D5 ; [*1458.0020.0002] # CLOSED BOOK -1F4D6 ; [*1459.0020.0002] # OPEN BOOK -1F4D7 ; [*145A.0020.0002] # GREEN BOOK -1F4D8 ; [*145B.0020.0002] # BLUE BOOK -1F4D9 ; [*145C.0020.0002] # ORANGE BOOK -1F4DA ; [*145D.0020.0002] # BOOKS -1F4DB ; [*145E.0020.0002] # NAME BADGE -1F4DC ; [*145F.0020.0002] # SCROLL -1F4DD ; [*1460.0020.0002] # MEMO -1F4DE ; [*1461.0020.0002] # TELEPHONE RECEIVER -1F4DF ; [*1462.0020.0002] # PAGER -1F4E0 ; [*1463.0020.0002] # FAX MACHINE -1F4E1 ; [*1464.0020.0002] # SATELLITE ANTENNA -1F4E2 ; [*1465.0020.0002] # PUBLIC ADDRESS LOUDSPEAKER -1F4E3 ; [*1466.0020.0002] # CHEERING MEGAPHONE -1F4E4 ; [*1467.0020.0002] # OUTBOX TRAY -1F4E5 ; [*1468.0020.0002] # INBOX TRAY -1F4E6 ; [*1469.0020.0002] # PACKAGE -1F4E7 ; [*146A.0020.0002] # E-MAIL SYMBOL -1F4E8 ; [*146B.0020.0002] # INCOMING ENVELOPE -1F4E9 ; [*146C.0020.0002] # ENVELOPE WITH DOWNWARDS ARROW ABOVE -1F4EA ; [*146D.0020.0002] # CLOSED MAILBOX WITH LOWERED FLAG -1F4EB ; [*146E.0020.0002] # CLOSED MAILBOX WITH RAISED FLAG -1F4EC ; [*146F.0020.0002] # OPEN MAILBOX WITH RAISED FLAG -1F4ED ; [*1470.0020.0002] # OPEN MAILBOX WITH LOWERED FLAG -1F4EE ; [*1471.0020.0002] # POSTBOX -1F4EF ; [*1472.0020.0002] # POSTAL HORN -1F4F0 ; [*1473.0020.0002] # NEWSPAPER -1F4F1 ; [*1474.0020.0002] # MOBILE PHONE -1F4F2 ; [*1475.0020.0002] # MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT -1F4F3 ; [*1476.0020.0002] # VIBRATION MODE -1F4F4 ; [*1477.0020.0002] # MOBILE PHONE OFF -1F4F5 ; [*1478.0020.0002] # NO MOBILE PHONES -1F4F6 ; [*1479.0020.0002] # ANTENNA WITH BARS -1F4F7 ; [*147A.0020.0002] # CAMERA -1F4F8 ; [*147B.0020.0002] # CAMERA WITH FLASH -1F4F9 ; [*147C.0020.0002] # VIDEO CAMERA -1F4FA ; [*147D.0020.0002] # TELEVISION -1F4FB ; [*147E.0020.0002] # RADIO -1F4FC ; [*147F.0020.0002] # VIDEOCASSETTE -1F4FD ; [*1480.0020.0002] # FILM PROJECTOR -1F4FE ; [*1481.0020.0002] # PORTABLE STEREO -1F4FF ; [*1482.0020.0002] # PRAYER BEADS -1F500 ; [*1483.0020.0002] # TWISTED RIGHTWARDS ARROWS -1F501 ; [*1484.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS -1F502 ; [*1485.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY -1F503 ; [*1486.0020.0002] # CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS -1F504 ; [*1487.0020.0002] # ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS -1F505 ; [*1488.0020.0002] # LOW BRIGHTNESS SYMBOL -1F506 ; [*1489.0020.0002] # HIGH BRIGHTNESS SYMBOL -1F507 ; [*148A.0020.0002] # SPEAKER WITH CANCELLATION STROKE -1F508 ; [*148B.0020.0002] # SPEAKER -1F509 ; [*148C.0020.0002] # SPEAKER WITH ONE SOUND WAVE -1F50A ; [*148D.0020.0002] # SPEAKER WITH THREE SOUND WAVES -1F50B ; [*148E.0020.0002] # BATTERY -1F50C ; [*148F.0020.0002] # ELECTRIC PLUG -1F50D ; [*1490.0020.0002] # LEFT-POINTING MAGNIFYING GLASS -1F50E ; [*1491.0020.0002] # RIGHT-POINTING MAGNIFYING GLASS -1F50F ; [*1492.0020.0002] # LOCK WITH INK PEN -1F510 ; [*1493.0020.0002] # CLOSED LOCK WITH KEY -1F511 ; [*1494.0020.0002] # KEY -1F512 ; [*1495.0020.0002] # LOCK -1F513 ; [*1496.0020.0002] # OPEN LOCK -1F514 ; [*1497.0020.0002] # BELL -1F515 ; [*1498.0020.0002] # BELL WITH CANCELLATION STROKE -1F516 ; [*1499.0020.0002] # BOOKMARK -1F517 ; [*149A.0020.0002] # LINK SYMBOL -1F518 ; [*149B.0020.0002] # RADIO BUTTON -1F519 ; [*149C.0020.0002] # BACK WITH LEFTWARDS ARROW ABOVE -1F51A ; [*149D.0020.0002] # END WITH LEFTWARDS ARROW ABOVE -1F51B ; [*149E.0020.0002] # ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE -1F51C ; [*149F.0020.0002] # SOON WITH RIGHTWARDS ARROW ABOVE -1F51D ; [*14A0.0020.0002] # TOP WITH UPWARDS ARROW ABOVE -1F51E ; [*14A1.0020.0002] # NO ONE UNDER EIGHTEEN SYMBOL -1F51F ; [*14A2.0020.0002] # KEYCAP TEN -1F520 ; [*14A3.0020.0002] # INPUT SYMBOL FOR LATIN CAPITAL LETTERS -1F521 ; [*14A4.0020.0002] # INPUT SYMBOL FOR LATIN SMALL LETTERS -1F522 ; [*14A5.0020.0002] # INPUT SYMBOL FOR NUMBERS -1F523 ; [*14A6.0020.0002] # INPUT SYMBOL FOR SYMBOLS -1F524 ; [*14A7.0020.0002] # INPUT SYMBOL FOR LATIN LETTERS -1F525 ; [*14A8.0020.0002] # FIRE -1F526 ; [*14A9.0020.0002] # ELECTRIC TORCH -1F527 ; [*14AA.0020.0002] # WRENCH -1F528 ; [*14AB.0020.0002] # HAMMER -1F529 ; [*14AC.0020.0002] # NUT AND BOLT -1F52A ; [*14AD.0020.0002] # HOCHO -1F52B ; [*14AE.0020.0002] # PISTOL -1F52C ; [*14AF.0020.0002] # MICROSCOPE -1F52D ; [*14B0.0020.0002] # TELESCOPE -1F52E ; [*14B1.0020.0002] # CRYSTAL BALL -1F52F ; [*14B2.0020.0002] # SIX POINTED STAR WITH MIDDLE DOT -1F530 ; [*14B3.0020.0002] # JAPANESE SYMBOL FOR BEGINNER -1F531 ; [*14B4.0020.0002] # TRIDENT EMBLEM -1F532 ; [*14B5.0020.0002] # BLACK SQUARE BUTTON -1F533 ; [*14B6.0020.0002] # WHITE SQUARE BUTTON -1F534 ; [*14B7.0020.0002] # LARGE RED CIRCLE -1F535 ; [*14B8.0020.0002] # LARGE BLUE CIRCLE -1F536 ; [*14B9.0020.0002] # LARGE ORANGE DIAMOND -1F537 ; [*14BA.0020.0002] # LARGE BLUE DIAMOND -1F538 ; [*14BB.0020.0002] # SMALL ORANGE DIAMOND -1F539 ; [*14BC.0020.0002] # SMALL BLUE DIAMOND -1F53A ; [*14BD.0020.0002] # UP-POINTING RED TRIANGLE -1F53B ; [*14BE.0020.0002] # DOWN-POINTING RED TRIANGLE -1F53C ; [*14BF.0020.0002] # UP-POINTING SMALL RED TRIANGLE -1F53D ; [*14C0.0020.0002] # DOWN-POINTING SMALL RED TRIANGLE -1F53E ; [*14C1.0020.0002] # LOWER RIGHT SHADOWED WHITE CIRCLE -1F53F ; [*14C2.0020.0002] # UPPER RIGHT SHADOWED WHITE CIRCLE -1F540 ; [*14C3.0020.0002] # CIRCLED CROSS POMMEE -1F541 ; [*14C4.0020.0002] # CROSS POMMEE WITH HALF-CIRCLE BELOW -1F542 ; [*14C5.0020.0002] # CROSS POMMEE -1F543 ; [*14C6.0020.0002] # NOTCHED LEFT SEMICIRCLE WITH THREE DOTS -1F544 ; [*14C7.0020.0002] # NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS -1F545 ; [*14C8.0020.0002] # SYMBOL FOR MARKS CHAPTER -1F546 ; [*14C9.0020.0002] # WHITE LATIN CROSS -1F547 ; [*14CA.0020.0002] # HEAVY LATIN CROSS -1F548 ; [*14CB.0020.0002] # CELTIC CROSS -1F549 ; [*14CC.0020.0002] # OM SYMBOL -1F54A ; [*14CD.0020.0002] # DOVE OF PEACE -1F54B ; [*14CE.0020.0002] # KAABA -1F54C ; [*14CF.0020.0002] # MOSQUE -1F54D ; [*14D0.0020.0002] # SYNAGOGUE -1F54E ; [*14D1.0020.0002] # MENORAH WITH NINE BRANCHES -1F54F ; [*14D2.0020.0002] # BOWL OF HYGIEIA -1F550 ; [*14D3.0020.0002] # CLOCK FACE ONE OCLOCK -1F551 ; [*14D4.0020.0002] # CLOCK FACE TWO OCLOCK -1F552 ; [*14D5.0020.0002] # CLOCK FACE THREE OCLOCK -1F553 ; [*14D6.0020.0002] # CLOCK FACE FOUR OCLOCK -1F554 ; [*14D7.0020.0002] # CLOCK FACE FIVE OCLOCK -1F555 ; [*14D8.0020.0002] # CLOCK FACE SIX OCLOCK -1F556 ; [*14D9.0020.0002] # CLOCK FACE SEVEN OCLOCK -1F557 ; [*14DA.0020.0002] # CLOCK FACE EIGHT OCLOCK -1F558 ; [*14DB.0020.0002] # CLOCK FACE NINE OCLOCK -1F559 ; [*14DC.0020.0002] # CLOCK FACE TEN OCLOCK -1F55A ; [*14DD.0020.0002] # CLOCK FACE ELEVEN OCLOCK -1F55B ; [*14DE.0020.0002] # CLOCK FACE TWELVE OCLOCK -1F55C ; [*14DF.0020.0002] # CLOCK FACE ONE-THIRTY -1F55D ; [*14E0.0020.0002] # CLOCK FACE TWO-THIRTY -1F55E ; [*14E1.0020.0002] # CLOCK FACE THREE-THIRTY -1F55F ; [*14E2.0020.0002] # CLOCK FACE FOUR-THIRTY -1F560 ; [*14E3.0020.0002] # CLOCK FACE FIVE-THIRTY -1F561 ; [*14E4.0020.0002] # CLOCK FACE SIX-THIRTY -1F562 ; [*14E5.0020.0002] # CLOCK FACE SEVEN-THIRTY -1F563 ; [*14E6.0020.0002] # CLOCK FACE EIGHT-THIRTY -1F564 ; [*14E7.0020.0002] # CLOCK FACE NINE-THIRTY -1F565 ; [*14E8.0020.0002] # CLOCK FACE TEN-THIRTY -1F566 ; [*14E9.0020.0002] # CLOCK FACE ELEVEN-THIRTY -1F567 ; [*14EA.0020.0002] # CLOCK FACE TWELVE-THIRTY -1F568 ; [*14EB.0020.0002] # RIGHT SPEAKER -1F569 ; [*14EC.0020.0002] # RIGHT SPEAKER WITH ONE SOUND WAVE -1F56A ; [*14ED.0020.0002] # RIGHT SPEAKER WITH THREE SOUND WAVES -1F56B ; [*14EE.0020.0002] # BULLHORN -1F56C ; [*14EF.0020.0002] # BULLHORN WITH SOUND WAVES -1F56D ; [*14F0.0020.0002] # RINGING BELL -1F56E ; [*14F1.0020.0002] # BOOK -1F56F ; [*14F2.0020.0002] # CANDLE -1F570 ; [*14F3.0020.0002] # MANTELPIECE CLOCK -1F571 ; [*14F4.0020.0002] # BLACK SKULL AND CROSSBONES -1F572 ; [*14F5.0020.0002] # NO PIRACY -1F573 ; [*14F6.0020.0002] # HOLE -1F574 ; [*14F7.0020.0002] # MAN IN BUSINESS SUIT LEVITATING -1F575 ; [*14F8.0020.0002] # SLEUTH OR SPY -1F576 ; [*14F9.0020.0002] # DARK SUNGLASSES -1F577 ; [*14FA.0020.0002] # SPIDER -1F578 ; [*14FB.0020.0002] # SPIDER WEB -1F579 ; [*14FC.0020.0002] # JOYSTICK -1F57B ; [*14FD.0020.0002] # LEFT HAND TELEPHONE RECEIVER -1F57C ; [*14FE.0020.0002] # TELEPHONE RECEIVER WITH PAGE -1F57D ; [*14FF.0020.0002] # RIGHT HAND TELEPHONE RECEIVER -1F57E ; [*1500.0020.0002] # WHITE TOUCHTONE TELEPHONE -1F57F ; [*1501.0020.0002] # BLACK TOUCHTONE TELEPHONE -1F580 ; [*1502.0020.0002] # TELEPHONE ON TOP OF MODEM -1F581 ; [*1503.0020.0002] # CLAMSHELL MOBILE PHONE -1F582 ; [*1504.0020.0002] # BACK OF ENVELOPE -1F583 ; [*1505.0020.0002] # STAMPED ENVELOPE -1F584 ; [*1506.0020.0002] # ENVELOPE WITH LIGHTNING -1F585 ; [*1507.0020.0002] # FLYING ENVELOPE -1F586 ; [*1508.0020.0002] # PEN OVER STAMPED ENVELOPE -1F587 ; [*1509.0020.0002] # LINKED PAPERCLIPS -1F588 ; [*150A.0020.0002] # BLACK PUSHPIN -1F589 ; [*150B.0020.0002] # LOWER LEFT PENCIL -1F58A ; [*150C.0020.0002] # LOWER LEFT BALLPOINT PEN -1F58B ; [*150D.0020.0002] # LOWER LEFT FOUNTAIN PEN -1F58C ; [*150E.0020.0002] # LOWER LEFT PAINTBRUSH -1F58D ; [*150F.0020.0002] # LOWER LEFT CRAYON -1F58E ; [*1510.0020.0002] # LEFT WRITING HAND -1F58F ; [*1511.0020.0002] # TURNED OK HAND SIGN -1F590 ; [*1512.0020.0002] # RAISED HAND WITH FINGERS SPLAYED -1F591 ; [*1513.0020.0002] # REVERSED RAISED HAND WITH FINGERS SPLAYED -1F592 ; [*1514.0020.0002] # REVERSED THUMBS UP SIGN -1F593 ; [*1515.0020.0002] # REVERSED THUMBS DOWN SIGN -1F594 ; [*1516.0020.0002] # REVERSED VICTORY HAND -1F595 ; [*1517.0020.0002] # REVERSED HAND WITH MIDDLE FINGER EXTENDED -1F596 ; [*1518.0020.0002] # RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS -1F597 ; [*1519.0020.0002] # WHITE DOWN POINTING LEFT HAND INDEX -1F598 ; [*151A.0020.0002] # SIDEWAYS WHITE LEFT POINTING INDEX -1F599 ; [*151B.0020.0002] # SIDEWAYS WHITE RIGHT POINTING INDEX -1F59A ; [*151C.0020.0002] # SIDEWAYS BLACK LEFT POINTING INDEX -1F59B ; [*151D.0020.0002] # SIDEWAYS BLACK RIGHT POINTING INDEX -1F59C ; [*151E.0020.0002] # BLACK LEFT POINTING BACKHAND INDEX -1F59D ; [*151F.0020.0002] # BLACK RIGHT POINTING BACKHAND INDEX -1F59E ; [*1520.0020.0002] # SIDEWAYS WHITE UP POINTING INDEX -1F59F ; [*1521.0020.0002] # SIDEWAYS WHITE DOWN POINTING INDEX -1F5A0 ; [*1522.0020.0002] # SIDEWAYS BLACK UP POINTING INDEX -1F5A1 ; [*1523.0020.0002] # SIDEWAYS BLACK DOWN POINTING INDEX -1F5A2 ; [*1524.0020.0002] # BLACK UP POINTING BACKHAND INDEX -1F5A3 ; [*1525.0020.0002] # BLACK DOWN POINTING BACKHAND INDEX -1F5A5 ; [*1526.0020.0002] # DESKTOP COMPUTER -1F5A6 ; [*1527.0020.0002] # KEYBOARD AND MOUSE -1F5A7 ; [*1528.0020.0002] # THREE NETWORKED COMPUTERS -1F5A8 ; [*1529.0020.0002] # PRINTER -1F5A9 ; [*152A.0020.0002] # POCKET CALCULATOR -1F5AA ; [*152B.0020.0002] # BLACK HARD SHELL FLOPPY DISK -1F5AB ; [*152C.0020.0002] # WHITE HARD SHELL FLOPPY DISK -1F5AC ; [*152D.0020.0002] # SOFT SHELL FLOPPY DISK -1F5AD ; [*152E.0020.0002] # TAPE CARTRIDGE -1F5AE ; [*152F.0020.0002] # WIRED KEYBOARD -1F5AF ; [*1530.0020.0002] # ONE BUTTON MOUSE -1F5B0 ; [*1531.0020.0002] # TWO BUTTON MOUSE -1F5B1 ; [*1532.0020.0002] # THREE BUTTON MOUSE -1F5B2 ; [*1533.0020.0002] # TRACKBALL -1F5B3 ; [*1534.0020.0002] # OLD PERSONAL COMPUTER -1F5B4 ; [*1535.0020.0002] # HARD DISK -1F5B5 ; [*1536.0020.0002] # SCREEN -1F5B6 ; [*1537.0020.0002] # PRINTER ICON -1F5B7 ; [*1538.0020.0002] # FAX ICON -1F5B8 ; [*1539.0020.0002] # OPTICAL DISC ICON -1F5B9 ; [*153A.0020.0002] # DOCUMENT WITH TEXT -1F5BA ; [*153B.0020.0002] # DOCUMENT WITH TEXT AND PICTURE -1F5BB ; [*153C.0020.0002] # DOCUMENT WITH PICTURE -1F5BC ; [*153D.0020.0002] # FRAME WITH PICTURE -1F5BD ; [*153E.0020.0002] # FRAME WITH TILES -1F5BE ; [*153F.0020.0002] # FRAME WITH AN X -1F5BF ; [*1540.0020.0002] # BLACK FOLDER -1F5C0 ; [*1541.0020.0002] # FOLDER -1F5C1 ; [*1542.0020.0002] # OPEN FOLDER -1F5C2 ; [*1543.0020.0002] # CARD INDEX DIVIDERS -1F5C3 ; [*1544.0020.0002] # CARD FILE BOX -1F5C4 ; [*1545.0020.0002] # FILE CABINET -1F5C5 ; [*1546.0020.0002] # EMPTY NOTE -1F5C6 ; [*1547.0020.0002] # EMPTY NOTE PAGE -1F5C7 ; [*1548.0020.0002] # EMPTY NOTE PAD -1F5C8 ; [*1549.0020.0002] # NOTE -1F5C9 ; [*154A.0020.0002] # NOTE PAGE -1F5CA ; [*154B.0020.0002] # NOTE PAD -1F5CB ; [*154C.0020.0002] # EMPTY DOCUMENT -1F5CC ; [*154D.0020.0002] # EMPTY PAGE -1F5CD ; [*154E.0020.0002] # EMPTY PAGES -1F5CE ; [*154F.0020.0002] # DOCUMENT -1F5CF ; [*1550.0020.0002] # PAGE -1F5D0 ; [*1551.0020.0002] # PAGES -1F5D1 ; [*1552.0020.0002] # WASTEBASKET -1F5D2 ; [*1553.0020.0002] # SPIRAL NOTE PAD -1F5D3 ; [*1554.0020.0002] # SPIRAL CALENDAR PAD -1F5D4 ; [*1555.0020.0002] # DESKTOP WINDOW -1F5D5 ; [*1556.0020.0002] # MINIMIZE -1F5D6 ; [*1557.0020.0002] # MAXIMIZE -1F5D7 ; [*1558.0020.0002] # OVERLAP -1F5D8 ; [*1559.0020.0002] # CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS -1F5D9 ; [*155A.0020.0002] # CANCELLATION X -1F5DA ; [*155B.0020.0002] # INCREASE FONT SIZE SYMBOL -1F5DB ; [*155C.0020.0002] # DECREASE FONT SIZE SYMBOL -1F5DC ; [*155D.0020.0002] # COMPRESSION -1F5DD ; [*155E.0020.0002] # OLD KEY -1F5DE ; [*155F.0020.0002] # ROLLED-UP NEWSPAPER -1F5DF ; [*1560.0020.0002] # PAGE WITH CIRCLED TEXT -1F5E0 ; [*1561.0020.0002] # STOCK CHART -1F5E1 ; [*1562.0020.0002] # DAGGER KNIFE -1F5E2 ; [*1563.0020.0002] # LIPS -1F5E3 ; [*1564.0020.0002] # SPEAKING HEAD IN SILHOUETTE -1F5E4 ; [*1565.0020.0002] # THREE RAYS ABOVE -1F5E5 ; [*1566.0020.0002] # THREE RAYS BELOW -1F5E6 ; [*1567.0020.0002] # THREE RAYS LEFT -1F5E7 ; [*1568.0020.0002] # THREE RAYS RIGHT -1F5E8 ; [*1569.0020.0002] # LEFT SPEECH BUBBLE -1F5E9 ; [*156A.0020.0002] # RIGHT SPEECH BUBBLE -1F5EA ; [*156B.0020.0002] # TWO SPEECH BUBBLES -1F5EB ; [*156C.0020.0002] # THREE SPEECH BUBBLES -1F5EC ; [*156D.0020.0002] # LEFT THOUGHT BUBBLE -1F5ED ; [*156E.0020.0002] # RIGHT THOUGHT BUBBLE -1F5EE ; [*156F.0020.0002] # LEFT ANGER BUBBLE -1F5EF ; [*1570.0020.0002] # RIGHT ANGER BUBBLE -1F5F0 ; [*1571.0020.0002] # MOOD BUBBLE -1F5F1 ; [*1572.0020.0002] # LIGHTNING MOOD BUBBLE -1F5F2 ; [*1573.0020.0002] # LIGHTNING MOOD -1F5F3 ; [*1574.0020.0002] # BALLOT BOX WITH BALLOT -1F5F4 ; [*1575.0020.0002] # BALLOT SCRIPT X -1F5F5 ; [*1576.0020.0002] # BALLOT BOX WITH SCRIPT X -1F5F6 ; [*1577.0020.0002] # BALLOT BOLD SCRIPT X -1F5F7 ; [*1578.0020.0002] # BALLOT BOX WITH BOLD SCRIPT X -1F5F8 ; [*1579.0020.0002] # LIGHT CHECK MARK -1F5F9 ; [*157A.0020.0002] # BALLOT BOX WITH BOLD CHECK -1F5FA ; [*157B.0020.0002] # WORLD MAP -1F5FB ; [*157C.0020.0002] # MOUNT FUJI -1F5FC ; [*157D.0020.0002] # TOKYO TOWER -1F5FD ; [*157E.0020.0002] # STATUE OF LIBERTY -1F5FE ; [*157F.0020.0002] # SILHOUETTE OF JAPAN -1F5FF ; [*1580.0020.0002] # MOYAI -1F600 ; [*1590.0020.0002] # GRINNING FACE -1F601 ; [*1591.0020.0002] # GRINNING FACE WITH SMILING EYES -1F602 ; [*1592.0020.0002] # FACE WITH TEARS OF JOY -1F603 ; [*1593.0020.0002] # SMILING FACE WITH OPEN MOUTH -1F604 ; [*1594.0020.0002] # SMILING FACE WITH OPEN MOUTH AND SMILING EYES -1F605 ; [*1595.0020.0002] # SMILING FACE WITH OPEN MOUTH AND COLD SWEAT -1F606 ; [*1596.0020.0002] # SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES -1F607 ; [*1597.0020.0002] # SMILING FACE WITH HALO -1F608 ; [*1598.0020.0002] # SMILING FACE WITH HORNS -1F609 ; [*1599.0020.0002] # WINKING FACE -1F60A ; [*159A.0020.0002] # SMILING FACE WITH SMILING EYES -1F60B ; [*159B.0020.0002] # FACE SAVOURING DELICIOUS FOOD -1F60C ; [*159C.0020.0002] # RELIEVED FACE -1F60D ; [*159D.0020.0002] # SMILING FACE WITH HEART-SHAPED EYES -1F60E ; [*159E.0020.0002] # SMILING FACE WITH SUNGLASSES -1F60F ; [*159F.0020.0002] # SMIRKING FACE -1F610 ; [*15A0.0020.0002] # NEUTRAL FACE -1F611 ; [*15A1.0020.0002] # EXPRESSIONLESS FACE -1F612 ; [*15A2.0020.0002] # UNAMUSED FACE -1F613 ; [*15A3.0020.0002] # FACE WITH COLD SWEAT -1F614 ; [*15A4.0020.0002] # PENSIVE FACE -1F615 ; [*15A5.0020.0002] # CONFUSED FACE -1F616 ; [*15A6.0020.0002] # CONFOUNDED FACE -1F617 ; [*15A7.0020.0002] # KISSING FACE -1F618 ; [*15A8.0020.0002] # FACE THROWING A KISS -1F619 ; [*15A9.0020.0002] # KISSING FACE WITH SMILING EYES -1F61A ; [*15AA.0020.0002] # KISSING FACE WITH CLOSED EYES -1F61B ; [*15AB.0020.0002] # FACE WITH STUCK-OUT TONGUE -1F61C ; [*15AC.0020.0002] # FACE WITH STUCK-OUT TONGUE AND WINKING EYE -1F61D ; [*15AD.0020.0002] # FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES -1F61E ; [*15AE.0020.0002] # DISAPPOINTED FACE -1F61F ; [*15AF.0020.0002] # WORRIED FACE -1F620 ; [*15B0.0020.0002] # ANGRY FACE -1F621 ; [*15B1.0020.0002] # POUTING FACE -1F622 ; [*15B2.0020.0002] # CRYING FACE -1F623 ; [*15B3.0020.0002] # PERSEVERING FACE -1F624 ; [*15B4.0020.0002] # FACE WITH LOOK OF TRIUMPH -1F625 ; [*15B5.0020.0002] # DISAPPOINTED BUT RELIEVED FACE -1F626 ; [*15B6.0020.0002] # FROWNING FACE WITH OPEN MOUTH -1F627 ; [*15B7.0020.0002] # ANGUISHED FACE -1F628 ; [*15B8.0020.0002] # FEARFUL FACE -1F629 ; [*15B9.0020.0002] # WEARY FACE -1F62A ; [*15BA.0020.0002] # SLEEPY FACE -1F62B ; [*15BB.0020.0002] # TIRED FACE -1F62C ; [*15BC.0020.0002] # GRIMACING FACE -1F62D ; [*15BD.0020.0002] # LOUDLY CRYING FACE -1F62E ; [*15BE.0020.0002] # FACE WITH OPEN MOUTH -1F62F ; [*15BF.0020.0002] # HUSHED FACE -1F630 ; [*15C0.0020.0002] # FACE WITH OPEN MOUTH AND COLD SWEAT -1F631 ; [*15C1.0020.0002] # FACE SCREAMING IN FEAR -1F632 ; [*15C2.0020.0002] # ASTONISHED FACE -1F633 ; [*15C3.0020.0002] # FLUSHED FACE -1F634 ; [*15C4.0020.0002] # SLEEPING FACE -1F635 ; [*15C5.0020.0002] # DIZZY FACE -1F636 ; [*15C6.0020.0002] # FACE WITHOUT MOUTH -1F637 ; [*15C7.0020.0002] # FACE WITH MEDICAL MASK -1F638 ; [*15C8.0020.0002] # GRINNING CAT FACE WITH SMILING EYES -1F639 ; [*15C9.0020.0002] # CAT FACE WITH TEARS OF JOY -1F63A ; [*15CA.0020.0002] # SMILING CAT FACE WITH OPEN MOUTH -1F63B ; [*15CB.0020.0002] # SMILING CAT FACE WITH HEART-SHAPED EYES -1F63C ; [*15CC.0020.0002] # CAT FACE WITH WRY SMILE -1F63D ; [*15CD.0020.0002] # KISSING CAT FACE WITH CLOSED EYES -1F63E ; [*15CE.0020.0002] # POUTING CAT FACE -1F63F ; [*15CF.0020.0002] # CRYING CAT FACE -1F640 ; [*15D0.0020.0002] # WEARY CAT FACE -1F641 ; [*15D1.0020.0002] # SLIGHTLY FROWNING FACE -1F642 ; [*15D2.0020.0002] # SLIGHTLY SMILING FACE -1F643 ; [*15D3.0020.0002] # UPSIDE-DOWN FACE -1F644 ; [*15D4.0020.0002] # FACE WITH ROLLING EYES -1F645 ; [*15D5.0020.0002] # FACE WITH NO GOOD GESTURE -1F646 ; [*15D6.0020.0002] # FACE WITH OK GESTURE -1F647 ; [*15D7.0020.0002] # PERSON BOWING DEEPLY -1F648 ; [*15D8.0020.0002] # SEE-NO-EVIL MONKEY -1F649 ; [*15D9.0020.0002] # HEAR-NO-EVIL MONKEY -1F64A ; [*15DA.0020.0002] # SPEAK-NO-EVIL MONKEY -1F64B ; [*15DB.0020.0002] # HAPPY PERSON RAISING ONE HAND -1F64C ; [*15DC.0020.0002] # PERSON RAISING BOTH HANDS IN CELEBRATION -1F64D ; [*15DD.0020.0002] # PERSON FROWNING -1F64E ; [*15DE.0020.0002] # PERSON WITH POUTING FACE -1F64F ; [*15DF.0020.0002] # PERSON WITH FOLDED HANDS -1F650 ; [*15E0.0020.0002] # NORTH WEST POINTING LEAF -1F651 ; [*15E1.0020.0002] # SOUTH WEST POINTING LEAF -1F652 ; [*15E2.0020.0002] # NORTH EAST POINTING LEAF -1F653 ; [*15E3.0020.0002] # SOUTH EAST POINTING LEAF -1F654 ; [*15E4.0020.0002] # TURNED NORTH WEST POINTING LEAF -1F655 ; [*15E5.0020.0002] # TURNED SOUTH WEST POINTING LEAF -1F656 ; [*15E6.0020.0002] # TURNED NORTH EAST POINTING LEAF -1F657 ; [*15E7.0020.0002] # TURNED SOUTH EAST POINTING LEAF -1F658 ; [*15E8.0020.0002] # NORTH WEST POINTING VINE LEAF -1F659 ; [*15E9.0020.0002] # SOUTH WEST POINTING VINE LEAF -1F65A ; [*15EA.0020.0002] # NORTH EAST POINTING VINE LEAF -1F65B ; [*15EB.0020.0002] # SOUTH EAST POINTING VINE LEAF -1F65C ; [*15EC.0020.0002] # HEAVY NORTH WEST POINTING VINE LEAF -1F65D ; [*15ED.0020.0002] # HEAVY SOUTH WEST POINTING VINE LEAF -1F65E ; [*15EE.0020.0002] # HEAVY NORTH EAST POINTING VINE LEAF -1F65F ; [*15EF.0020.0002] # HEAVY SOUTH EAST POINTING VINE LEAF -1F660 ; [*15F0.0020.0002] # NORTH WEST POINTING BUD -1F661 ; [*15F1.0020.0002] # SOUTH WEST POINTING BUD -1F662 ; [*15F2.0020.0002] # NORTH EAST POINTING BUD -1F663 ; [*15F3.0020.0002] # SOUTH EAST POINTING BUD -1F664 ; [*15F4.0020.0002] # HEAVY NORTH WEST POINTING BUD -1F665 ; [*15F5.0020.0002] # HEAVY SOUTH WEST POINTING BUD -1F666 ; [*15F6.0020.0002] # HEAVY NORTH EAST POINTING BUD -1F667 ; [*15F7.0020.0002] # HEAVY SOUTH EAST POINTING BUD -1F668 ; [*15F8.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT -1F669 ; [*15F9.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE -1F66A ; [*15FA.0020.0002] # SOLID QUILT SQUARE ORNAMENT -1F66B ; [*15FB.0020.0002] # SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE -1F66C ; [*15FC.0020.0002] # LEFTWARDS ROCKET -1F66D ; [*15FD.0020.0002] # UPWARDS ROCKET -1F66E ; [*15FE.0020.0002] # RIGHTWARDS ROCKET -1F66F ; [*15FF.0020.0002] # DOWNWARDS ROCKET -1F670 ; [*1600.0020.0002] # SCRIPT LIGATURE ET ORNAMENT -1F671 ; [*1601.0020.0002] # HEAVY SCRIPT LIGATURE ET ORNAMENT -1F672 ; [*1602.0020.0002] # LIGATURE OPEN ET ORNAMENT -1F673 ; [*1603.0020.0002] # HEAVY LIGATURE OPEN ET ORNAMENT -1F674 ; [*1604.0020.0002] # HEAVY AMPERSAND ORNAMENT -1F675 ; [*1605.0020.0002] # SWASH AMPERSAND ORNAMENT -1F676 ; [*1606.0020.0002] # SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT -1F677 ; [*1607.0020.0002] # SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -1F678 ; [*1608.0020.0002] # SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT -1F679 ; [*1609.0020.0002] # HEAVY INTERROBANG ORNAMENT -1F67A ; [*160A.0020.0002] # SANS-SERIF INTERROBANG ORNAMENT -1F67B ; [*160B.0020.0002] # HEAVY SANS-SERIF INTERROBANG ORNAMENT -1F67C ; [*160C.0020.0002] # VERY HEAVY SOLIDUS -1F67D ; [*160D.0020.0002] # VERY HEAVY REVERSE SOLIDUS -1F67E ; [*160E.0020.0002] # CHECKER BOARD -1F67F ; [*160F.0020.0002] # REVERSE CHECKER BOARD -1F680 ; [*1610.0020.0002] # ROCKET -1F681 ; [*1611.0020.0002] # HELICOPTER -1F682 ; [*1612.0020.0002] # STEAM LOCOMOTIVE -1F683 ; [*1613.0020.0002] # RAILWAY CAR -1F684 ; [*1614.0020.0002] # HIGH-SPEED TRAIN -1F685 ; [*1615.0020.0002] # HIGH-SPEED TRAIN WITH BULLET NOSE -1F686 ; [*1616.0020.0002] # TRAIN -1F687 ; [*1617.0020.0002] # METRO -1F688 ; [*1618.0020.0002] # LIGHT RAIL -1F689 ; [*1619.0020.0002] # STATION -1F68A ; [*161A.0020.0002] # TRAM -1F68B ; [*161B.0020.0002] # TRAM CAR -1F68C ; [*161C.0020.0002] # BUS -1F68D ; [*161D.0020.0002] # ONCOMING BUS -1F68E ; [*161E.0020.0002] # TROLLEYBUS -1F68F ; [*161F.0020.0002] # BUS STOP -1F690 ; [*1620.0020.0002] # MINIBUS -1F691 ; [*1621.0020.0002] # AMBULANCE -1F692 ; [*1622.0020.0002] # FIRE ENGINE -1F693 ; [*1623.0020.0002] # POLICE CAR -1F694 ; [*1624.0020.0002] # ONCOMING POLICE CAR -1F695 ; [*1625.0020.0002] # TAXI -1F696 ; [*1626.0020.0002] # ONCOMING TAXI -1F697 ; [*1627.0020.0002] # AUTOMOBILE -1F698 ; [*1628.0020.0002] # ONCOMING AUTOMOBILE -1F699 ; [*1629.0020.0002] # RECREATIONAL VEHICLE -1F69A ; [*162A.0020.0002] # DELIVERY TRUCK -1F69B ; [*162B.0020.0002] # ARTICULATED LORRY -1F69C ; [*162C.0020.0002] # TRACTOR -1F69D ; [*162D.0020.0002] # MONORAIL -1F69E ; [*162E.0020.0002] # MOUNTAIN RAILWAY -1F69F ; [*162F.0020.0002] # SUSPENSION RAILWAY -1F6A0 ; [*1630.0020.0002] # MOUNTAIN CABLEWAY -1F6A1 ; [*1631.0020.0002] # AERIAL TRAMWAY -1F6A2 ; [*1632.0020.0002] # SHIP -1F6A3 ; [*1633.0020.0002] # ROWBOAT -1F6A4 ; [*1634.0020.0002] # SPEEDBOAT -1F6A5 ; [*1635.0020.0002] # HORIZONTAL TRAFFIC LIGHT -1F6A6 ; [*1636.0020.0002] # VERTICAL TRAFFIC LIGHT -1F6A7 ; [*1637.0020.0002] # CONSTRUCTION SIGN -1F6A8 ; [*1638.0020.0002] # POLICE CARS REVOLVING LIGHT -1F6A9 ; [*1639.0020.0002] # TRIANGULAR FLAG ON POST -1F6AA ; [*163A.0020.0002] # DOOR -1F6AB ; [*163B.0020.0002] # NO ENTRY SIGN -1F6AC ; [*163C.0020.0002] # SMOKING SYMBOL -1F6AD ; [*163D.0020.0002] # NO SMOKING SYMBOL -1F6AE ; [*163E.0020.0002] # PUT LITTER IN ITS PLACE SYMBOL -1F6AF ; [*163F.0020.0002] # DO NOT LITTER SYMBOL -1F6B0 ; [*1640.0020.0002] # POTABLE WATER SYMBOL -1F6B1 ; [*1641.0020.0002] # NON-POTABLE WATER SYMBOL -1F6B2 ; [*1642.0020.0002] # BICYCLE -1F6B3 ; [*1643.0020.0002] # NO BICYCLES -1F6B4 ; [*1644.0020.0002] # BICYCLIST -1F6B5 ; [*1645.0020.0002] # MOUNTAIN BICYCLIST -1F6B6 ; [*1646.0020.0002] # PEDESTRIAN -1F6B7 ; [*1647.0020.0002] # NO PEDESTRIANS -1F6B8 ; [*1648.0020.0002] # CHILDREN CROSSING -1F6B9 ; [*1649.0020.0002] # MENS SYMBOL -1F6BA ; [*164A.0020.0002] # WOMENS SYMBOL -1F6BB ; [*164B.0020.0002] # RESTROOM -1F6BC ; [*164C.0020.0002] # BABY SYMBOL -1F6BD ; [*164D.0020.0002] # TOILET -1F6BE ; [*164E.0020.0002] # WATER CLOSET -1F6BF ; [*164F.0020.0002] # SHOWER -1F6C0 ; [*1650.0020.0002] # BATH -1F6C1 ; [*1651.0020.0002] # BATHTUB -1F6C2 ; [*1652.0020.0002] # PASSPORT CONTROL -1F6C3 ; [*1653.0020.0002] # CUSTOMS -1F6C4 ; [*1654.0020.0002] # BAGGAGE CLAIM -1F6C5 ; [*1655.0020.0002] # LEFT LUGGAGE -1F6C6 ; [*1656.0020.0002] # TRIANGLE WITH ROUNDED CORNERS -1F6C7 ; [*1657.0020.0002] # PROHIBITED SIGN -1F6C8 ; [*1658.0020.0002] # CIRCLED INFORMATION SOURCE -1F6C9 ; [*1659.0020.0002] # BOYS SYMBOL -1F6CA ; [*165A.0020.0002] # GIRLS SYMBOL -1F6CB ; [*165B.0020.0002] # COUCH AND LAMP -1F6CC ; [*165C.0020.0002] # SLEEPING ACCOMMODATION -1F6CD ; [*165D.0020.0002] # SHOPPING BAGS -1F6CE ; [*165E.0020.0002] # BELLHOP BELL -1F6CF ; [*165F.0020.0002] # BED -1F6D0 ; [*1660.0020.0002] # PLACE OF WORSHIP -1F6E0 ; [*1661.0020.0002] # HAMMER AND WRENCH -1F6E1 ; [*1662.0020.0002] # SHIELD -1F6E2 ; [*1663.0020.0002] # OIL DRUM -1F6E3 ; [*1664.0020.0002] # MOTORWAY -1F6E4 ; [*1665.0020.0002] # RAILWAY TRACK -1F6E5 ; [*1666.0020.0002] # MOTOR BOAT -1F6E6 ; [*1667.0020.0002] # UP-POINTING MILITARY AIRPLANE -1F6E7 ; [*1668.0020.0002] # UP-POINTING AIRPLANE -1F6E8 ; [*1669.0020.0002] # UP-POINTING SMALL AIRPLANE -1F6E9 ; [*166A.0020.0002] # SMALL AIRPLANE -1F6EA ; [*166B.0020.0002] # NORTHEAST-POINTING AIRPLANE -1F6EB ; [*166C.0020.0002] # AIRPLANE DEPARTURE -1F6EC ; [*166D.0020.0002] # AIRPLANE ARRIVING -1F6F0 ; [*166E.0020.0002] # SATELLITE -1F6F1 ; [*166F.0020.0002] # ONCOMING FIRE ENGINE -1F6F2 ; [*1670.0020.0002] # DIESEL LOCOMOTIVE -1F6F3 ; [*1671.0020.0002] # PASSENGER SHIP -1F700 ; [*1672.0020.0002] # ALCHEMICAL SYMBOL FOR QUINTESSENCE -1F701 ; [*1673.0020.0002] # ALCHEMICAL SYMBOL FOR AIR -1F702 ; [*1674.0020.0002] # ALCHEMICAL SYMBOL FOR FIRE -1F703 ; [*1675.0020.0002] # ALCHEMICAL SYMBOL FOR EARTH -1F704 ; [*1676.0020.0002] # ALCHEMICAL SYMBOL FOR WATER -1F705 ; [*1677.0020.0002] # ALCHEMICAL SYMBOL FOR AQUAFORTIS -1F706 ; [*1678.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA -1F707 ; [*1679.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA-2 -1F708 ; [*167A.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE -1F709 ; [*167B.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE-2 -1F70A ; [*167C.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR -1F70B ; [*167D.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-2 -1F70C ; [*167E.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-3 -1F70D ; [*167F.0020.0002] # ALCHEMICAL SYMBOL FOR SULFUR -1F70E ; [*1680.0020.0002] # ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR -1F70F ; [*1681.0020.0002] # ALCHEMICAL SYMBOL FOR BLACK SULFUR -1F710 ; [*1682.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE -1F711 ; [*1683.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 -1F712 ; [*1684.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 -1F713 ; [*1685.0020.0002] # ALCHEMICAL SYMBOL FOR CINNABAR -1F714 ; [*1686.0020.0002] # ALCHEMICAL SYMBOL FOR SALT -1F715 ; [*1687.0020.0002] # ALCHEMICAL SYMBOL FOR NITRE -1F716 ; [*1688.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL -1F717 ; [*1689.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL-2 -1F718 ; [*168A.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT -1F719 ; [*168B.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT-2 -1F71A ; [*168C.0020.0002] # ALCHEMICAL SYMBOL FOR GOLD -1F71B ; [*168D.0020.0002] # ALCHEMICAL SYMBOL FOR SILVER -1F71C ; [*168E.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE -1F71D ; [*168F.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE-2 -1F71E ; [*1690.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF IRON -1F71F ; [*1691.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF IRON -1F720 ; [*1692.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ORE -1F721 ; [*1693.0020.0002] # ALCHEMICAL SYMBOL FOR IRON-COPPER ORE -1F722 ; [*1694.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER -1F723 ; [*1695.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER -1F724 ; [*1696.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 -1F725 ; [*1697.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE -1F726 ; [*1698.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE -1F727 ; [*1699.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER -1F728 ; [*169A.0020.0002] # ALCHEMICAL SYMBOL FOR VERDIGRIS -1F729 ; [*169B.0020.0002] # ALCHEMICAL SYMBOL FOR TIN ORE -1F72A ; [*169C.0020.0002] # ALCHEMICAL SYMBOL FOR LEAD ORE -1F72B ; [*169D.0020.0002] # ALCHEMICAL SYMBOL FOR ANTIMONY ORE -1F72C ; [*169E.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY -1F72D ; [*169F.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY -1F72E ; [*16A0.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY -1F72F ; [*16A1.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY -1F730 ; [*16A2.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY -1F731 ; [*16A3.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 -1F732 ; [*16A4.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS -1F733 ; [*16A5.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-2 -1F734 ; [*16A6.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-3 -1F735 ; [*16A7.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-4 -1F736 ; [*16A8.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI -1F737 ; [*16A9.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI-2 -1F738 ; [*16AA.0020.0002] # ALCHEMICAL SYMBOL FOR MARCASITE -1F739 ; [*16AB.0020.0002] # ALCHEMICAL SYMBOL FOR SAL-AMMONIAC -1F73A ; [*16AC.0020.0002] # ALCHEMICAL SYMBOL FOR ARSENIC -1F73B ; [*16AD.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR -1F73C ; [*16AE.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR-2 -1F73D ; [*16AF.0020.0002] # ALCHEMICAL SYMBOL FOR AURIPIGMENT -1F73E ; [*16B0.0020.0002] # ALCHEMICAL SYMBOL FOR BISMUTH ORE -1F73F ; [*16B1.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR -1F740 ; [*16B2.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR-2 -1F741 ; [*16B3.0020.0002] # ALCHEMICAL SYMBOL FOR QUICK LIME -1F742 ; [*16B4.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX -1F743 ; [*16B5.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-2 -1F744 ; [*16B6.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-3 -1F745 ; [*16B7.0020.0002] # ALCHEMICAL SYMBOL FOR ALUM -1F746 ; [*16B8.0020.0002] # ALCHEMICAL SYMBOL FOR OIL -1F747 ; [*16B9.0020.0002] # ALCHEMICAL SYMBOL FOR SPIRIT -1F748 ; [*16BA.0020.0002] # ALCHEMICAL SYMBOL FOR TINCTURE -1F749 ; [*16BB.0020.0002] # ALCHEMICAL SYMBOL FOR GUM -1F74A ; [*16BC.0020.0002] # ALCHEMICAL SYMBOL FOR WAX -1F74B ; [*16BD.0020.0002] # ALCHEMICAL SYMBOL FOR POWDER -1F74C ; [*16BE.0020.0002] # ALCHEMICAL SYMBOL FOR CALX -1F74D ; [*16BF.0020.0002] # ALCHEMICAL SYMBOL FOR TUTTY -1F74E ; [*16C0.0020.0002] # ALCHEMICAL SYMBOL FOR CAPUT MORTUUM -1F74F ; [*16C1.0020.0002] # ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE -1F750 ; [*16C2.0020.0002] # ALCHEMICAL SYMBOL FOR CADUCEUS -1F751 ; [*16C3.0020.0002] # ALCHEMICAL SYMBOL FOR TRIDENT -1F752 ; [*16C4.0020.0002] # ALCHEMICAL SYMBOL FOR STARRED TRIDENT -1F753 ; [*16C5.0020.0002] # ALCHEMICAL SYMBOL FOR LODESTONE -1F754 ; [*16C6.0020.0002] # ALCHEMICAL SYMBOL FOR SOAP -1F755 ; [*16C7.0020.0002] # ALCHEMICAL SYMBOL FOR URINE -1F756 ; [*16C8.0020.0002] # ALCHEMICAL SYMBOL FOR HORSE DUNG -1F757 ; [*16C9.0020.0002] # ALCHEMICAL SYMBOL FOR ASHES -1F758 ; [*16CA.0020.0002] # ALCHEMICAL SYMBOL FOR POT ASHES -1F759 ; [*16CB.0020.0002] # ALCHEMICAL SYMBOL FOR BRICK -1F75A ; [*16CC.0020.0002] # ALCHEMICAL SYMBOL FOR POWDERED BRICK -1F75B ; [*16CD.0020.0002] # ALCHEMICAL SYMBOL FOR AMALGAM -1F75C ; [*16CE.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM -1F75D ; [*16CF.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 -1F75E ; [*16D0.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATION -1F75F ; [*16D1.0020.0002] # ALCHEMICAL SYMBOL FOR PRECIPITATE -1F760 ; [*16D2.0020.0002] # ALCHEMICAL SYMBOL FOR DISTILL -1F761 ; [*16D3.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE -1F762 ; [*16D4.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE-2 -1F763 ; [*16D5.0020.0002] # ALCHEMICAL SYMBOL FOR PURIFY -1F764 ; [*16D6.0020.0002] # ALCHEMICAL SYMBOL FOR PUTREFACTION -1F765 ; [*16D7.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE -1F766 ; [*16D8.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-2 -1F767 ; [*16D9.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-3 -1F768 ; [*16DA.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-4 -1F769 ; [*16DB.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-5 -1F76A ; [*16DC.0020.0002] # ALCHEMICAL SYMBOL FOR ALEMBIC -1F76B ; [*16DD.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF MARY -1F76C ; [*16DE.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF VAPOURS -1F76D ; [*16DF.0020.0002] # ALCHEMICAL SYMBOL FOR RETORT -1F76E ; [*16E0.0020.0002] # ALCHEMICAL SYMBOL FOR HOUR -1F76F ; [*16E1.0020.0002] # ALCHEMICAL SYMBOL FOR NIGHT -1F770 ; [*16E2.0020.0002] # ALCHEMICAL SYMBOL FOR DAY-NIGHT -1F771 ; [*16E3.0020.0002] # ALCHEMICAL SYMBOL FOR MONTH -1F772 ; [*16E4.0020.0002] # ALCHEMICAL SYMBOL FOR HALF DRAM -1F773 ; [*16E5.0020.0002] # ALCHEMICAL SYMBOL FOR HALF OUNCE -1F780 ; [*16E6.0020.0002] # BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE -1F781 ; [*16E7.0020.0002] # BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE -1F782 ; [*16E8.0020.0002] # BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE -1F783 ; [*16E9.0020.0002] # BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE -1F784 ; [*16EA.0020.0002] # BLACK SLIGHTLY SMALL CIRCLE -1F785 ; [*16EB.0020.0002] # MEDIUM BOLD WHITE CIRCLE -1F786 ; [*16EC.0020.0002] # BOLD WHITE CIRCLE -1F787 ; [*16ED.0020.0002] # HEAVY WHITE CIRCLE -1F788 ; [*16EE.0020.0002] # VERY HEAVY WHITE CIRCLE -1F789 ; [*16EF.0020.0002] # EXTREMELY HEAVY WHITE CIRCLE -1F78A ; [*16F0.0020.0002] # WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE -1F78B ; [*16F1.0020.0002] # ROUND TARGET -1F78C ; [*16F2.0020.0002] # BLACK TINY SQUARE -1F78D ; [*16F3.0020.0002] # BLACK SLIGHTLY SMALL SQUARE -1F78E ; [*16F4.0020.0002] # LIGHT WHITE SQUARE -1F78F ; [*16F5.0020.0002] # MEDIUM WHITE SQUARE -1F790 ; [*16F6.0020.0002] # BOLD WHITE SQUARE -1F791 ; [*16F7.0020.0002] # HEAVY WHITE SQUARE -1F792 ; [*16F8.0020.0002] # VERY HEAVY WHITE SQUARE -1F793 ; [*16F9.0020.0002] # EXTREMELY HEAVY WHITE SQUARE -1F794 ; [*16FA.0020.0002] # WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE -1F795 ; [*16FB.0020.0002] # WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE -1F796 ; [*16FC.0020.0002] # SQUARE TARGET -1F797 ; [*16FD.0020.0002] # BLACK TINY DIAMOND -1F798 ; [*16FE.0020.0002] # BLACK VERY SMALL DIAMOND -1F799 ; [*16FF.0020.0002] # BLACK MEDIUM SMALL DIAMOND -1F79A ; [*1700.0020.0002] # WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND -1F79B ; [*1701.0020.0002] # WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND -1F79C ; [*1702.0020.0002] # DIAMOND TARGET -1F79D ; [*1703.0020.0002] # BLACK TINY LOZENGE -1F79E ; [*1704.0020.0002] # BLACK VERY SMALL LOZENGE -1F79F ; [*1705.0020.0002] # BLACK MEDIUM SMALL LOZENGE -1F7A0 ; [*1706.0020.0002] # WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE -1F7A1 ; [*1707.0020.0002] # THIN GREEK CROSS -1F7A2 ; [*1708.0020.0002] # LIGHT GREEK CROSS -1F7A3 ; [*1709.0020.0002] # MEDIUM GREEK CROSS -1F7A4 ; [*170A.0020.0002] # BOLD GREEK CROSS -1F7A5 ; [*170B.0020.0002] # VERY BOLD GREEK CROSS -1F7A6 ; [*170C.0020.0002] # VERY HEAVY GREEK CROSS -1F7A7 ; [*170D.0020.0002] # EXTREMELY HEAVY GREEK CROSS -1F7A8 ; [*170E.0020.0002] # THIN SALTIRE -1F7A9 ; [*170F.0020.0002] # LIGHT SALTIRE -1F7AA ; [*1710.0020.0002] # MEDIUM SALTIRE -1F7AB ; [*1711.0020.0002] # BOLD SALTIRE -1F7AC ; [*1712.0020.0002] # HEAVY SALTIRE -1F7AD ; [*1713.0020.0002] # VERY HEAVY SALTIRE -1F7AE ; [*1714.0020.0002] # EXTREMELY HEAVY SALTIRE -1F7AF ; [*1715.0020.0002] # LIGHT FIVE SPOKED ASTERISK -1F7B0 ; [*1716.0020.0002] # MEDIUM FIVE SPOKED ASTERISK -1F7B1 ; [*1717.0020.0002] # BOLD FIVE SPOKED ASTERISK -1F7B2 ; [*1718.0020.0002] # HEAVY FIVE SPOKED ASTERISK -1F7B3 ; [*1719.0020.0002] # VERY HEAVY FIVE SPOKED ASTERISK -1F7B4 ; [*171A.0020.0002] # EXTREMELY HEAVY FIVE SPOKED ASTERISK -1F7B5 ; [*171B.0020.0002] # LIGHT SIX SPOKED ASTERISK -1F7B6 ; [*171C.0020.0002] # MEDIUM SIX SPOKED ASTERISK -1F7B7 ; [*171D.0020.0002] # BOLD SIX SPOKED ASTERISK -1F7B8 ; [*171E.0020.0002] # HEAVY SIX SPOKED ASTERISK -1F7B9 ; [*171F.0020.0002] # VERY HEAVY SIX SPOKED ASTERISK -1F7BA ; [*1720.0020.0002] # EXTREMELY HEAVY SIX SPOKED ASTERISK -1F7BB ; [*1721.0020.0002] # LIGHT EIGHT SPOKED ASTERISK -1F7BC ; [*1722.0020.0002] # MEDIUM EIGHT SPOKED ASTERISK -1F7BD ; [*1723.0020.0002] # BOLD EIGHT SPOKED ASTERISK -1F7BE ; [*1724.0020.0002] # HEAVY EIGHT SPOKED ASTERISK -1F7BF ; [*1725.0020.0002] # VERY HEAVY EIGHT SPOKED ASTERISK -1F7C0 ; [*1726.0020.0002] # LIGHT THREE POINTED BLACK STAR -1F7C1 ; [*1727.0020.0002] # MEDIUM THREE POINTED BLACK STAR -1F7C2 ; [*1728.0020.0002] # THREE POINTED BLACK STAR -1F7C3 ; [*1729.0020.0002] # MEDIUM THREE POINTED PINWHEEL STAR -1F7C4 ; [*172A.0020.0002] # LIGHT FOUR POINTED BLACK STAR -1F7C5 ; [*172B.0020.0002] # MEDIUM FOUR POINTED BLACK STAR -1F7C6 ; [*172C.0020.0002] # FOUR POINTED BLACK STAR -1F7C7 ; [*172D.0020.0002] # MEDIUM FOUR POINTED PINWHEEL STAR -1F7C8 ; [*172E.0020.0002] # REVERSE LIGHT FOUR POINTED PINWHEEL STAR -1F7C9 ; [*172F.0020.0002] # LIGHT FIVE POINTED BLACK STAR -1F7CA ; [*1730.0020.0002] # HEAVY FIVE POINTED BLACK STAR -1F7CB ; [*1731.0020.0002] # MEDIUM SIX POINTED BLACK STAR -1F7CC ; [*1732.0020.0002] # HEAVY SIX POINTED BLACK STAR -1F7CD ; [*1733.0020.0002] # SIX POINTED PINWHEEL STAR -1F7CE ; [*1734.0020.0002] # MEDIUM EIGHT POINTED BLACK STAR -1F7CF ; [*1735.0020.0002] # HEAVY EIGHT POINTED BLACK STAR -1F7D0 ; [*1736.0020.0002] # VERY HEAVY EIGHT POINTED BLACK STAR -1F7D1 ; [*1737.0020.0002] # HEAVY EIGHT POINTED PINWHEEL STAR -1F7D2 ; [*1738.0020.0002] # LIGHT TWELVE POINTED BLACK STAR -1F7D3 ; [*1739.0020.0002] # HEAVY TWELVE POINTED BLACK STAR -1F7D4 ; [*173A.0020.0002] # HEAVY TWELVE POINTED PINWHEEL STAR -1F800 ; [*173B.0020.0002] # LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -1F801 ; [*173C.0020.0002] # UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -1F802 ; [*173D.0020.0002] # RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -1F803 ; [*173E.0020.0002] # DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -1F804 ; [*173F.0020.0002] # LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -1F805 ; [*1740.0020.0002] # UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -1F806 ; [*1741.0020.0002] # RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -1F807 ; [*1742.0020.0002] # DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -1F808 ; [*1743.0020.0002] # LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F809 ; [*1744.0020.0002] # UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F80A ; [*1745.0020.0002] # RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F80B ; [*1746.0020.0002] # DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F810 ; [*1747.0020.0002] # LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -1F811 ; [*1748.0020.0002] # UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -1F812 ; [*1749.0020.0002] # RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -1F813 ; [*174A.0020.0002] # DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -1F814 ; [*174B.0020.0002] # LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F815 ; [*174C.0020.0002] # UPWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F816 ; [*174D.0020.0002] # RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F817 ; [*174E.0020.0002] # DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F818 ; [*174F.0020.0002] # HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F819 ; [*1750.0020.0002] # HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F81A ; [*1751.0020.0002] # HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F81B ; [*1752.0020.0002] # HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F81C ; [*1753.0020.0002] # HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -1F81D ; [*1754.0020.0002] # HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -1F81E ; [*1755.0020.0002] # HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -1F81F ; [*1756.0020.0002] # HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -1F820 ; [*1757.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -1F821 ; [*1758.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -1F822 ; [*1759.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -1F823 ; [*175A.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -1F824 ; [*175B.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -1F825 ; [*175C.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -1F826 ; [*175D.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -1F827 ; [*175E.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -1F828 ; [*175F.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -1F829 ; [*1760.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -1F82A ; [*1761.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -1F82B ; [*1762.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -1F82C ; [*1763.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -1F82D ; [*1764.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -1F82E ; [*1765.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -1F82F ; [*1766.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -1F830 ; [*1767.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -1F831 ; [*1768.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -1F832 ; [*1769.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -1F833 ; [*176A.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -1F834 ; [*176B.0020.0002] # LEFTWARDS FINGER-POST ARROW -1F835 ; [*176C.0020.0002] # UPWARDS FINGER-POST ARROW -1F836 ; [*176D.0020.0002] # RIGHTWARDS FINGER-POST ARROW -1F837 ; [*176E.0020.0002] # DOWNWARDS FINGER-POST ARROW -1F838 ; [*176F.0020.0002] # LEFTWARDS SQUARED ARROW -1F839 ; [*1770.0020.0002] # UPWARDS SQUARED ARROW -1F83A ; [*1771.0020.0002] # RIGHTWARDS SQUARED ARROW -1F83B ; [*1772.0020.0002] # DOWNWARDS SQUARED ARROW -1F83C ; [*1773.0020.0002] # LEFTWARDS COMPRESSED ARROW -1F83D ; [*1774.0020.0002] # UPWARDS COMPRESSED ARROW -1F83E ; [*1775.0020.0002] # RIGHTWARDS COMPRESSED ARROW -1F83F ; [*1776.0020.0002] # DOWNWARDS COMPRESSED ARROW -1F840 ; [*1777.0020.0002] # LEFTWARDS HEAVY COMPRESSED ARROW -1F841 ; [*1778.0020.0002] # UPWARDS HEAVY COMPRESSED ARROW -1F842 ; [*1779.0020.0002] # RIGHTWARDS HEAVY COMPRESSED ARROW -1F843 ; [*177A.0020.0002] # DOWNWARDS HEAVY COMPRESSED ARROW -1F844 ; [*177B.0020.0002] # LEFTWARDS HEAVY ARROW -1F845 ; [*177C.0020.0002] # UPWARDS HEAVY ARROW -1F846 ; [*177D.0020.0002] # RIGHTWARDS HEAVY ARROW -1F847 ; [*177E.0020.0002] # DOWNWARDS HEAVY ARROW -1F850 ; [*177F.0020.0002] # LEFTWARDS SANS-SERIF ARROW -1F851 ; [*1780.0020.0002] # UPWARDS SANS-SERIF ARROW -1F852 ; [*1781.0020.0002] # RIGHTWARDS SANS-SERIF ARROW -1F853 ; [*1782.0020.0002] # DOWNWARDS SANS-SERIF ARROW -1F854 ; [*1783.0020.0002] # NORTH WEST SANS-SERIF ARROW -1F855 ; [*1784.0020.0002] # NORTH EAST SANS-SERIF ARROW -1F856 ; [*1785.0020.0002] # SOUTH EAST SANS-SERIF ARROW -1F857 ; [*1786.0020.0002] # SOUTH WEST SANS-SERIF ARROW -1F858 ; [*1787.0020.0002] # LEFT RIGHT SANS-SERIF ARROW -1F859 ; [*1788.0020.0002] # UP DOWN SANS-SERIF ARROW -1F860 ; [*1789.0020.0002] # WIDE-HEADED LEFTWARDS LIGHT BARB ARROW -1F861 ; [*178A.0020.0002] # WIDE-HEADED UPWARDS LIGHT BARB ARROW -1F862 ; [*178B.0020.0002] # WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW -1F863 ; [*178C.0020.0002] # WIDE-HEADED DOWNWARDS LIGHT BARB ARROW -1F864 ; [*178D.0020.0002] # WIDE-HEADED NORTH WEST LIGHT BARB ARROW -1F865 ; [*178E.0020.0002] # WIDE-HEADED NORTH EAST LIGHT BARB ARROW -1F866 ; [*178F.0020.0002] # WIDE-HEADED SOUTH EAST LIGHT BARB ARROW -1F867 ; [*1790.0020.0002] # WIDE-HEADED SOUTH WEST LIGHT BARB ARROW -1F868 ; [*1791.0020.0002] # WIDE-HEADED LEFTWARDS BARB ARROW -1F869 ; [*1792.0020.0002] # WIDE-HEADED UPWARDS BARB ARROW -1F86A ; [*1793.0020.0002] # WIDE-HEADED RIGHTWARDS BARB ARROW -1F86B ; [*1794.0020.0002] # WIDE-HEADED DOWNWARDS BARB ARROW -1F86C ; [*1795.0020.0002] # WIDE-HEADED NORTH WEST BARB ARROW -1F86D ; [*1796.0020.0002] # WIDE-HEADED NORTH EAST BARB ARROW -1F86E ; [*1797.0020.0002] # WIDE-HEADED SOUTH EAST BARB ARROW -1F86F ; [*1798.0020.0002] # WIDE-HEADED SOUTH WEST BARB ARROW -1F870 ; [*1799.0020.0002] # WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW -1F871 ; [*179A.0020.0002] # WIDE-HEADED UPWARDS MEDIUM BARB ARROW -1F872 ; [*179B.0020.0002] # WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW -1F873 ; [*179C.0020.0002] # WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW -1F874 ; [*179D.0020.0002] # WIDE-HEADED NORTH WEST MEDIUM BARB ARROW -1F875 ; [*179E.0020.0002] # WIDE-HEADED NORTH EAST MEDIUM BARB ARROW -1F876 ; [*179F.0020.0002] # WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW -1F877 ; [*17A0.0020.0002] # WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW -1F878 ; [*17A1.0020.0002] # WIDE-HEADED LEFTWARDS HEAVY BARB ARROW -1F879 ; [*17A2.0020.0002] # WIDE-HEADED UPWARDS HEAVY BARB ARROW -1F87A ; [*17A3.0020.0002] # WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW -1F87B ; [*17A4.0020.0002] # WIDE-HEADED DOWNWARDS HEAVY BARB ARROW -1F87C ; [*17A5.0020.0002] # WIDE-HEADED NORTH WEST HEAVY BARB ARROW -1F87D ; [*17A6.0020.0002] # WIDE-HEADED NORTH EAST HEAVY BARB ARROW -1F87E ; [*17A7.0020.0002] # WIDE-HEADED SOUTH EAST HEAVY BARB ARROW -1F87F ; [*17A8.0020.0002] # WIDE-HEADED SOUTH WEST HEAVY BARB ARROW -1F880 ; [*17A9.0020.0002] # WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW -1F881 ; [*17AA.0020.0002] # WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW -1F882 ; [*17AB.0020.0002] # WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW -1F883 ; [*17AC.0020.0002] # WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW -1F884 ; [*17AD.0020.0002] # WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW -1F885 ; [*17AE.0020.0002] # WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW -1F886 ; [*17AF.0020.0002] # WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW -1F887 ; [*17B0.0020.0002] # WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW -1F890 ; [*17B1.0020.0002] # LEFTWARDS TRIANGLE ARROWHEAD -1F891 ; [*17B2.0020.0002] # UPWARDS TRIANGLE ARROWHEAD -1F892 ; [*17B3.0020.0002] # RIGHTWARDS TRIANGLE ARROWHEAD -1F893 ; [*17B4.0020.0002] # DOWNWARDS TRIANGLE ARROWHEAD -1F894 ; [*17B5.0020.0002] # LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -1F895 ; [*17B6.0020.0002] # UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -1F896 ; [*17B7.0020.0002] # RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -1F897 ; [*17B8.0020.0002] # DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -1F898 ; [*17B9.0020.0002] # LEFTWARDS ARROW WITH NOTCHED TAIL -1F899 ; [*17BA.0020.0002] # UPWARDS ARROW WITH NOTCHED TAIL -1F89A ; [*17BB.0020.0002] # RIGHTWARDS ARROW WITH NOTCHED TAIL -1F89B ; [*17BC.0020.0002] # DOWNWARDS ARROW WITH NOTCHED TAIL -1F89C ; [*17BD.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE -1F89D ; [*17BE.0020.0002] # HEAVY ARROW SHAFT WIDTH TWO THIRDS -1F89E ; [*17BF.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE HALF -1F89F ; [*17C0.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE THIRD -1F8A0 ; [*17C1.0020.0002] # LEFTWARDS BOTTOM-SHADED WHITE ARROW -1F8A1 ; [*17C2.0020.0002] # RIGHTWARDS BOTTOM SHADED WHITE ARROW -1F8A2 ; [*17C3.0020.0002] # LEFTWARDS TOP SHADED WHITE ARROW -1F8A3 ; [*17C4.0020.0002] # RIGHTWARDS TOP SHADED WHITE ARROW -1F8A4 ; [*17C5.0020.0002] # LEFTWARDS LEFT-SHADED WHITE ARROW -1F8A5 ; [*17C6.0020.0002] # RIGHTWARDS RIGHT-SHADED WHITE ARROW -1F8A6 ; [*17C7.0020.0002] # LEFTWARDS RIGHT-SHADED WHITE ARROW -1F8A7 ; [*17C8.0020.0002] # RIGHTWARDS LEFT-SHADED WHITE ARROW -1F8A8 ; [*17C9.0020.0002] # LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW -1F8A9 ; [*17CA.0020.0002] # RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW -1F8AA ; [*17CB.0020.0002] # LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW -1F8AB ; [*17CC.0020.0002] # RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW -1F8AC ; [*17CD.0020.0002] # WHITE ARROW SHAFT WIDTH ONE -1F8AD ; [*17CE.0020.0002] # WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910 ; [*1581.0020.0002] # ZIPPER-MOUTH FACE -1F911 ; [*1582.0020.0002] # MONEY-MOUTH FACE -1F912 ; [*1583.0020.0002] # FACE WITH THERMOMETER -1F913 ; [*1584.0020.0002] # NERD FACE -1F914 ; [*1585.0020.0002] # THINKING FACE -1F915 ; [*1586.0020.0002] # FACE WITH HEAD-BANDAGE -1F916 ; [*1587.0020.0002] # ROBOT FACE -1F917 ; [*1588.0020.0002] # HUGGING FACE -1F918 ; [*1589.0020.0002] # SIGN OF THE HORNS -1F980 ; [*158A.0020.0002] # CRAB -1F981 ; [*158B.0020.0002] # LION FACE -1F982 ; [*158C.0020.0002] # SCORPION -1F983 ; [*158D.0020.0002] # TURKEY -1F984 ; [*158E.0020.0002] # UNICORN FACE -1F9C0 ; [*158F.0020.0002] # CHEESE WEDGE +1E95E ; [*0265.0020.0002] # ADLAM INITIAL EXCLAMATION MARK +1E95F ; [*0274.0020.0002] # ADLAM INITIAL QUESTION MARK +1EEF0 ; [*04FB.0020.0002] # ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL +1EEF1 ; [*04FC.0020.0002] # ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000 ; [*11C7.0020.0002] # MAHJONG TILE EAST WIND +1F001 ; [*11C8.0020.0002] # MAHJONG TILE SOUTH WIND +1F002 ; [*11C9.0020.0002] # MAHJONG TILE WEST WIND +1F003 ; [*11CA.0020.0002] # MAHJONG TILE NORTH WIND +1F004 ; [*11CB.0020.0002] # MAHJONG TILE RED DRAGON +1F005 ; [*11CC.0020.0002] # MAHJONG TILE GREEN DRAGON +1F006 ; [*11CD.0020.0002] # MAHJONG TILE WHITE DRAGON +1F007 ; [*11CE.0020.0002] # MAHJONG TILE ONE OF CHARACTERS +1F008 ; [*11CF.0020.0002] # MAHJONG TILE TWO OF CHARACTERS +1F009 ; [*11D0.0020.0002] # MAHJONG TILE THREE OF CHARACTERS +1F00A ; [*11D1.0020.0002] # MAHJONG TILE FOUR OF CHARACTERS +1F00B ; [*11D2.0020.0002] # MAHJONG TILE FIVE OF CHARACTERS +1F00C ; [*11D3.0020.0002] # MAHJONG TILE SIX OF CHARACTERS +1F00D ; [*11D4.0020.0002] # MAHJONG TILE SEVEN OF CHARACTERS +1F00E ; [*11D5.0020.0002] # MAHJONG TILE EIGHT OF CHARACTERS +1F00F ; [*11D6.0020.0002] # MAHJONG TILE NINE OF CHARACTERS +1F010 ; [*11D7.0020.0002] # MAHJONG TILE ONE OF BAMBOOS +1F011 ; [*11D8.0020.0002] # MAHJONG TILE TWO OF BAMBOOS +1F012 ; [*11D9.0020.0002] # MAHJONG TILE THREE OF BAMBOOS +1F013 ; [*11DA.0020.0002] # MAHJONG TILE FOUR OF BAMBOOS +1F014 ; [*11DB.0020.0002] # MAHJONG TILE FIVE OF BAMBOOS +1F015 ; [*11DC.0020.0002] # MAHJONG TILE SIX OF BAMBOOS +1F016 ; [*11DD.0020.0002] # MAHJONG TILE SEVEN OF BAMBOOS +1F017 ; [*11DE.0020.0002] # MAHJONG TILE EIGHT OF BAMBOOS +1F018 ; [*11DF.0020.0002] # MAHJONG TILE NINE OF BAMBOOS +1F019 ; [*11E0.0020.0002] # MAHJONG TILE ONE OF CIRCLES +1F01A ; [*11E1.0020.0002] # MAHJONG TILE TWO OF CIRCLES +1F01B ; [*11E2.0020.0002] # MAHJONG TILE THREE OF CIRCLES +1F01C ; [*11E3.0020.0002] # MAHJONG TILE FOUR OF CIRCLES +1F01D ; [*11E4.0020.0002] # MAHJONG TILE FIVE OF CIRCLES +1F01E ; [*11E5.0020.0002] # MAHJONG TILE SIX OF CIRCLES +1F01F ; [*11E6.0020.0002] # MAHJONG TILE SEVEN OF CIRCLES +1F020 ; [*11E7.0020.0002] # MAHJONG TILE EIGHT OF CIRCLES +1F021 ; [*11E8.0020.0002] # MAHJONG TILE NINE OF CIRCLES +1F022 ; [*11E9.0020.0002] # MAHJONG TILE PLUM +1F023 ; [*11EA.0020.0002] # MAHJONG TILE ORCHID +1F024 ; [*11EB.0020.0002] # MAHJONG TILE BAMBOO +1F025 ; [*11EC.0020.0002] # MAHJONG TILE CHRYSANTHEMUM +1F026 ; [*11ED.0020.0002] # MAHJONG TILE SPRING +1F027 ; [*11EE.0020.0002] # MAHJONG TILE SUMMER +1F028 ; [*11EF.0020.0002] # MAHJONG TILE AUTUMN +1F029 ; [*11F0.0020.0002] # MAHJONG TILE WINTER +1F02A ; [*11F1.0020.0002] # MAHJONG TILE JOKER +1F02B ; [*11F2.0020.0002] # MAHJONG TILE BACK +1F030 ; [*11F3.0020.0002] # DOMINO TILE HORIZONTAL BACK +1F031 ; [*11F4.0020.0002] # DOMINO TILE HORIZONTAL-00-00 +1F032 ; [*11F5.0020.0002] # DOMINO TILE HORIZONTAL-00-01 +1F033 ; [*11F6.0020.0002] # DOMINO TILE HORIZONTAL-00-02 +1F034 ; [*11F7.0020.0002] # DOMINO TILE HORIZONTAL-00-03 +1F035 ; [*11F8.0020.0002] # DOMINO TILE HORIZONTAL-00-04 +1F036 ; [*11F9.0020.0002] # DOMINO TILE HORIZONTAL-00-05 +1F037 ; [*11FA.0020.0002] # DOMINO TILE HORIZONTAL-00-06 +1F038 ; [*11FB.0020.0002] # DOMINO TILE HORIZONTAL-01-00 +1F039 ; [*11FC.0020.0002] # DOMINO TILE HORIZONTAL-01-01 +1F03A ; [*11FD.0020.0002] # DOMINO TILE HORIZONTAL-01-02 +1F03B ; [*11FE.0020.0002] # DOMINO TILE HORIZONTAL-01-03 +1F03C ; [*11FF.0020.0002] # DOMINO TILE HORIZONTAL-01-04 +1F03D ; [*1200.0020.0002] # DOMINO TILE HORIZONTAL-01-05 +1F03E ; [*1201.0020.0002] # DOMINO TILE HORIZONTAL-01-06 +1F03F ; [*1202.0020.0002] # DOMINO TILE HORIZONTAL-02-00 +1F040 ; [*1203.0020.0002] # DOMINO TILE HORIZONTAL-02-01 +1F041 ; [*1204.0020.0002] # DOMINO TILE HORIZONTAL-02-02 +1F042 ; [*1205.0020.0002] # DOMINO TILE HORIZONTAL-02-03 +1F043 ; [*1206.0020.0002] # DOMINO TILE HORIZONTAL-02-04 +1F044 ; [*1207.0020.0002] # DOMINO TILE HORIZONTAL-02-05 +1F045 ; [*1208.0020.0002] # DOMINO TILE HORIZONTAL-02-06 +1F046 ; [*1209.0020.0002] # DOMINO TILE HORIZONTAL-03-00 +1F047 ; [*120A.0020.0002] # DOMINO TILE HORIZONTAL-03-01 +1F048 ; [*120B.0020.0002] # DOMINO TILE HORIZONTAL-03-02 +1F049 ; [*120C.0020.0002] # DOMINO TILE HORIZONTAL-03-03 +1F04A ; [*120D.0020.0002] # DOMINO TILE HORIZONTAL-03-04 +1F04B ; [*120E.0020.0002] # DOMINO TILE HORIZONTAL-03-05 +1F04C ; [*120F.0020.0002] # DOMINO TILE HORIZONTAL-03-06 +1F04D ; [*1210.0020.0002] # DOMINO TILE HORIZONTAL-04-00 +1F04E ; [*1211.0020.0002] # DOMINO TILE HORIZONTAL-04-01 +1F04F ; [*1212.0020.0002] # DOMINO TILE HORIZONTAL-04-02 +1F050 ; [*1213.0020.0002] # DOMINO TILE HORIZONTAL-04-03 +1F051 ; [*1214.0020.0002] # DOMINO TILE HORIZONTAL-04-04 +1F052 ; [*1215.0020.0002] # DOMINO TILE HORIZONTAL-04-05 +1F053 ; [*1216.0020.0002] # DOMINO TILE HORIZONTAL-04-06 +1F054 ; [*1217.0020.0002] # DOMINO TILE HORIZONTAL-05-00 +1F055 ; [*1218.0020.0002] # DOMINO TILE HORIZONTAL-05-01 +1F056 ; [*1219.0020.0002] # DOMINO TILE HORIZONTAL-05-02 +1F057 ; [*121A.0020.0002] # DOMINO TILE HORIZONTAL-05-03 +1F058 ; [*121B.0020.0002] # DOMINO TILE HORIZONTAL-05-04 +1F059 ; [*121C.0020.0002] # DOMINO TILE HORIZONTAL-05-05 +1F05A ; [*121D.0020.0002] # DOMINO TILE HORIZONTAL-05-06 +1F05B ; [*121E.0020.0002] # DOMINO TILE HORIZONTAL-06-00 +1F05C ; [*121F.0020.0002] # DOMINO TILE HORIZONTAL-06-01 +1F05D ; [*1220.0020.0002] # DOMINO TILE HORIZONTAL-06-02 +1F05E ; [*1221.0020.0002] # DOMINO TILE HORIZONTAL-06-03 +1F05F ; [*1222.0020.0002] # DOMINO TILE HORIZONTAL-06-04 +1F060 ; [*1223.0020.0002] # DOMINO TILE HORIZONTAL-06-05 +1F061 ; [*1224.0020.0002] # DOMINO TILE HORIZONTAL-06-06 +1F062 ; [*1225.0020.0002] # DOMINO TILE VERTICAL BACK +1F063 ; [*1226.0020.0002] # DOMINO TILE VERTICAL-00-00 +1F064 ; [*1227.0020.0002] # DOMINO TILE VERTICAL-00-01 +1F065 ; [*1228.0020.0002] # DOMINO TILE VERTICAL-00-02 +1F066 ; [*1229.0020.0002] # DOMINO TILE VERTICAL-00-03 +1F067 ; [*122A.0020.0002] # DOMINO TILE VERTICAL-00-04 +1F068 ; [*122B.0020.0002] # DOMINO TILE VERTICAL-00-05 +1F069 ; [*122C.0020.0002] # DOMINO TILE VERTICAL-00-06 +1F06A ; [*122D.0020.0002] # DOMINO TILE VERTICAL-01-00 +1F06B ; [*122E.0020.0002] # DOMINO TILE VERTICAL-01-01 +1F06C ; [*122F.0020.0002] # DOMINO TILE VERTICAL-01-02 +1F06D ; [*1230.0020.0002] # DOMINO TILE VERTICAL-01-03 +1F06E ; [*1231.0020.0002] # DOMINO TILE VERTICAL-01-04 +1F06F ; [*1232.0020.0002] # DOMINO TILE VERTICAL-01-05 +1F070 ; [*1233.0020.0002] # DOMINO TILE VERTICAL-01-06 +1F071 ; [*1234.0020.0002] # DOMINO TILE VERTICAL-02-00 +1F072 ; [*1235.0020.0002] # DOMINO TILE VERTICAL-02-01 +1F073 ; [*1236.0020.0002] # DOMINO TILE VERTICAL-02-02 +1F074 ; [*1237.0020.0002] # DOMINO TILE VERTICAL-02-03 +1F075 ; [*1238.0020.0002] # DOMINO TILE VERTICAL-02-04 +1F076 ; [*1239.0020.0002] # DOMINO TILE VERTICAL-02-05 +1F077 ; [*123A.0020.0002] # DOMINO TILE VERTICAL-02-06 +1F078 ; [*123B.0020.0002] # DOMINO TILE VERTICAL-03-00 +1F079 ; [*123C.0020.0002] # DOMINO TILE VERTICAL-03-01 +1F07A ; [*123D.0020.0002] # DOMINO TILE VERTICAL-03-02 +1F07B ; [*123E.0020.0002] # DOMINO TILE VERTICAL-03-03 +1F07C ; [*123F.0020.0002] # DOMINO TILE VERTICAL-03-04 +1F07D ; [*1240.0020.0002] # DOMINO TILE VERTICAL-03-05 +1F07E ; [*1241.0020.0002] # DOMINO TILE VERTICAL-03-06 +1F07F ; [*1242.0020.0002] # DOMINO TILE VERTICAL-04-00 +1F080 ; [*1243.0020.0002] # DOMINO TILE VERTICAL-04-01 +1F081 ; [*1244.0020.0002] # DOMINO TILE VERTICAL-04-02 +1F082 ; [*1245.0020.0002] # DOMINO TILE VERTICAL-04-03 +1F083 ; [*1246.0020.0002] # DOMINO TILE VERTICAL-04-04 +1F084 ; [*1247.0020.0002] # DOMINO TILE VERTICAL-04-05 +1F085 ; [*1248.0020.0002] # DOMINO TILE VERTICAL-04-06 +1F086 ; [*1249.0020.0002] # DOMINO TILE VERTICAL-05-00 +1F087 ; [*124A.0020.0002] # DOMINO TILE VERTICAL-05-01 +1F088 ; [*124B.0020.0002] # DOMINO TILE VERTICAL-05-02 +1F089 ; [*124C.0020.0002] # DOMINO TILE VERTICAL-05-03 +1F08A ; [*124D.0020.0002] # DOMINO TILE VERTICAL-05-04 +1F08B ; [*124E.0020.0002] # DOMINO TILE VERTICAL-05-05 +1F08C ; [*124F.0020.0002] # DOMINO TILE VERTICAL-05-06 +1F08D ; [*1250.0020.0002] # DOMINO TILE VERTICAL-06-00 +1F08E ; [*1251.0020.0002] # DOMINO TILE VERTICAL-06-01 +1F08F ; [*1252.0020.0002] # DOMINO TILE VERTICAL-06-02 +1F090 ; [*1253.0020.0002] # DOMINO TILE VERTICAL-06-03 +1F091 ; [*1254.0020.0002] # DOMINO TILE VERTICAL-06-04 +1F092 ; [*1255.0020.0002] # DOMINO TILE VERTICAL-06-05 +1F093 ; [*1256.0020.0002] # DOMINO TILE VERTICAL-06-06 +1F0A0 ; [*1257.0020.0002] # PLAYING CARD BACK +1F0A1 ; [*1258.0020.0002] # PLAYING CARD ACE OF SPADES +1F0A2 ; [*1259.0020.0002] # PLAYING CARD TWO OF SPADES +1F0A3 ; [*125A.0020.0002] # PLAYING CARD THREE OF SPADES +1F0A4 ; [*125B.0020.0002] # PLAYING CARD FOUR OF SPADES +1F0A5 ; [*125C.0020.0002] # PLAYING CARD FIVE OF SPADES +1F0A6 ; [*125D.0020.0002] # PLAYING CARD SIX OF SPADES +1F0A7 ; [*125E.0020.0002] # PLAYING CARD SEVEN OF SPADES +1F0A8 ; [*125F.0020.0002] # PLAYING CARD EIGHT OF SPADES +1F0A9 ; [*1260.0020.0002] # PLAYING CARD NINE OF SPADES +1F0AA ; [*1261.0020.0002] # PLAYING CARD TEN OF SPADES +1F0AB ; [*1262.0020.0002] # PLAYING CARD JACK OF SPADES +1F0AC ; [*1263.0020.0002] # PLAYING CARD KNIGHT OF SPADES +1F0AD ; [*1264.0020.0002] # PLAYING CARD QUEEN OF SPADES +1F0AE ; [*1265.0020.0002] # PLAYING CARD KING OF SPADES +1F0B1 ; [*1266.0020.0002] # PLAYING CARD ACE OF HEARTS +1F0B2 ; [*1267.0020.0002] # PLAYING CARD TWO OF HEARTS +1F0B3 ; [*1268.0020.0002] # PLAYING CARD THREE OF HEARTS +1F0B4 ; [*1269.0020.0002] # PLAYING CARD FOUR OF HEARTS +1F0B5 ; [*126A.0020.0002] # PLAYING CARD FIVE OF HEARTS +1F0B6 ; [*126B.0020.0002] # PLAYING CARD SIX OF HEARTS +1F0B7 ; [*126C.0020.0002] # PLAYING CARD SEVEN OF HEARTS +1F0B8 ; [*126D.0020.0002] # PLAYING CARD EIGHT OF HEARTS +1F0B9 ; [*126E.0020.0002] # PLAYING CARD NINE OF HEARTS +1F0BA ; [*126F.0020.0002] # PLAYING CARD TEN OF HEARTS +1F0BB ; [*1270.0020.0002] # PLAYING CARD JACK OF HEARTS +1F0BC ; [*1271.0020.0002] # PLAYING CARD KNIGHT OF HEARTS +1F0BD ; [*1272.0020.0002] # PLAYING CARD QUEEN OF HEARTS +1F0BE ; [*1273.0020.0002] # PLAYING CARD KING OF HEARTS +1F0BF ; [*1274.0020.0002] # PLAYING CARD RED JOKER +1F0C1 ; [*1275.0020.0002] # PLAYING CARD ACE OF DIAMONDS +1F0C2 ; [*1276.0020.0002] # PLAYING CARD TWO OF DIAMONDS +1F0C3 ; [*1277.0020.0002] # PLAYING CARD THREE OF DIAMONDS +1F0C4 ; [*1278.0020.0002] # PLAYING CARD FOUR OF DIAMONDS +1F0C5 ; [*1279.0020.0002] # PLAYING CARD FIVE OF DIAMONDS +1F0C6 ; [*127A.0020.0002] # PLAYING CARD SIX OF DIAMONDS +1F0C7 ; [*127B.0020.0002] # PLAYING CARD SEVEN OF DIAMONDS +1F0C8 ; [*127C.0020.0002] # PLAYING CARD EIGHT OF DIAMONDS +1F0C9 ; [*127D.0020.0002] # PLAYING CARD NINE OF DIAMONDS +1F0CA ; [*127E.0020.0002] # PLAYING CARD TEN OF DIAMONDS +1F0CB ; [*127F.0020.0002] # PLAYING CARD JACK OF DIAMONDS +1F0CC ; [*1280.0020.0002] # PLAYING CARD KNIGHT OF DIAMONDS +1F0CD ; [*1281.0020.0002] # PLAYING CARD QUEEN OF DIAMONDS +1F0CE ; [*1282.0020.0002] # PLAYING CARD KING OF DIAMONDS +1F0CF ; [*1283.0020.0002] # PLAYING CARD BLACK JOKER +1F0D1 ; [*1284.0020.0002] # PLAYING CARD ACE OF CLUBS +1F0D2 ; [*1285.0020.0002] # PLAYING CARD TWO OF CLUBS +1F0D3 ; [*1286.0020.0002] # PLAYING CARD THREE OF CLUBS +1F0D4 ; [*1287.0020.0002] # PLAYING CARD FOUR OF CLUBS +1F0D5 ; [*1288.0020.0002] # PLAYING CARD FIVE OF CLUBS +1F0D6 ; [*1289.0020.0002] # PLAYING CARD SIX OF CLUBS +1F0D7 ; [*128A.0020.0002] # PLAYING CARD SEVEN OF CLUBS +1F0D8 ; [*128B.0020.0002] # PLAYING CARD EIGHT OF CLUBS +1F0D9 ; [*128C.0020.0002] # PLAYING CARD NINE OF CLUBS +1F0DA ; [*128D.0020.0002] # PLAYING CARD TEN OF CLUBS +1F0DB ; [*128E.0020.0002] # PLAYING CARD JACK OF CLUBS +1F0DC ; [*128F.0020.0002] # PLAYING CARD KNIGHT OF CLUBS +1F0DD ; [*1290.0020.0002] # PLAYING CARD QUEEN OF CLUBS +1F0DE ; [*1291.0020.0002] # PLAYING CARD KING OF CLUBS +1F0DF ; [*1292.0020.0002] # PLAYING CARD WHITE JOKER +1F0E0 ; [*1293.0020.0002] # PLAYING CARD FOOL +1F0E1 ; [*1294.0020.0002] # PLAYING CARD TRUMP-1 +1F0E2 ; [*1295.0020.0002] # PLAYING CARD TRUMP-2 +1F0E3 ; [*1296.0020.0002] # PLAYING CARD TRUMP-3 +1F0E4 ; [*1297.0020.0002] # PLAYING CARD TRUMP-4 +1F0E5 ; [*1298.0020.0002] # PLAYING CARD TRUMP-5 +1F0E6 ; [*1299.0020.0002] # PLAYING CARD TRUMP-6 +1F0E7 ; [*129A.0020.0002] # PLAYING CARD TRUMP-7 +1F0E8 ; [*129B.0020.0002] # PLAYING CARD TRUMP-8 +1F0E9 ; [*129C.0020.0002] # PLAYING CARD TRUMP-9 +1F0EA ; [*129D.0020.0002] # PLAYING CARD TRUMP-10 +1F0EB ; [*129E.0020.0002] # PLAYING CARD TRUMP-11 +1F0EC ; [*129F.0020.0002] # PLAYING CARD TRUMP-12 +1F0ED ; [*12A0.0020.0002] # PLAYING CARD TRUMP-13 +1F0EE ; [*12A1.0020.0002] # PLAYING CARD TRUMP-14 +1F0EF ; [*12A2.0020.0002] # PLAYING CARD TRUMP-15 +1F0F0 ; [*12A3.0020.0002] # PLAYING CARD TRUMP-16 +1F0F1 ; [*12A4.0020.0002] # PLAYING CARD TRUMP-17 +1F0F2 ; [*12A5.0020.0002] # PLAYING CARD TRUMP-18 +1F0F3 ; [*12A6.0020.0002] # PLAYING CARD TRUMP-19 +1F0F4 ; [*12A7.0020.0002] # PLAYING CARD TRUMP-20 +1F0F5 ; [*12A8.0020.0002] # PLAYING CARD TRUMP-21 +1F1E6 ; [*0A07.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER A +1F1E7 ; [*0A08.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER B +1F1E8 ; [*0A09.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER C +1F1E9 ; [*0A0A.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER D +1F1EA ; [*0A0B.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER E +1F1EB ; [*0A0C.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER F +1F1EC ; [*0A0D.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER G +1F1ED ; [*0A0E.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER H +1F1EE ; [*0A0F.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER I +1F1EF ; [*0A10.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER J +1F1F0 ; [*0A11.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER K +1F1F1 ; [*0A12.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER L +1F1F2 ; [*0A13.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER M +1F1F3 ; [*0A14.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER N +1F1F4 ; [*0A15.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER O +1F1F5 ; [*0A16.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER P +1F1F6 ; [*0A17.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Q +1F1F7 ; [*0A18.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER R +1F1F8 ; [*0A19.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER S +1F1F9 ; [*0A1A.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER T +1F1FA ; [*0A1B.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER U +1F1FB ; [*0A1C.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER V +1F1FC ; [*0A1D.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER W +1F1FD ; [*0A1E.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER X +1F1FE ; [*0A1F.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Y +1F1FF ; [*0A20.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Z +1F300 ; [*12A9.0020.0002] # CYCLONE +1F301 ; [*12AA.0020.0002] # FOGGY +1F302 ; [*12AB.0020.0002] # CLOSED UMBRELLA +1F303 ; [*12AC.0020.0002] # NIGHT WITH STARS +1F304 ; [*12AD.0020.0002] # SUNRISE OVER MOUNTAINS +1F305 ; [*12AE.0020.0002] # SUNRISE +1F306 ; [*12AF.0020.0002] # CITYSCAPE AT DUSK +1F307 ; [*12B0.0020.0002] # SUNSET OVER BUILDINGS +1F308 ; [*12B1.0020.0002] # RAINBOW +1F309 ; [*12B2.0020.0002] # BRIDGE AT NIGHT +1F30A ; [*12B3.0020.0002] # WATER WAVE +1F30B ; [*12B4.0020.0002] # VOLCANO +1F30C ; [*12B5.0020.0002] # MILKY WAY +1F30D ; [*12B6.0020.0002] # EARTH GLOBE EUROPE-AFRICA +1F30E ; [*12B7.0020.0002] # EARTH GLOBE AMERICAS +1F30F ; [*12B8.0020.0002] # EARTH GLOBE ASIA-AUSTRALIA +1F310 ; [*12B9.0020.0002] # GLOBE WITH MERIDIANS +1F311 ; [*12BA.0020.0002] # NEW MOON SYMBOL +1F312 ; [*12BB.0020.0002] # WAXING CRESCENT MOON SYMBOL +1F313 ; [*12BC.0020.0002] # FIRST QUARTER MOON SYMBOL +1F314 ; [*12BD.0020.0002] # WAXING GIBBOUS MOON SYMBOL +1F315 ; [*12BE.0020.0002] # FULL MOON SYMBOL +1F316 ; [*12BF.0020.0002] # WANING GIBBOUS MOON SYMBOL +1F317 ; [*12C0.0020.0002] # LAST QUARTER MOON SYMBOL +1F318 ; [*12C1.0020.0002] # WANING CRESCENT MOON SYMBOL +1F319 ; [*12C2.0020.0002] # CRESCENT MOON +1F31A ; [*12C3.0020.0002] # NEW MOON WITH FACE +1F31B ; [*12C4.0020.0002] # FIRST QUARTER MOON WITH FACE +1F31C ; [*12C5.0020.0002] # LAST QUARTER MOON WITH FACE +1F31D ; [*12C6.0020.0002] # FULL MOON WITH FACE +1F31E ; [*12C7.0020.0002] # SUN WITH FACE +1F31F ; [*12C8.0020.0002] # GLOWING STAR +1F320 ; [*12C9.0020.0002] # SHOOTING STAR +1F321 ; [*12CA.0020.0002] # THERMOMETER +1F322 ; [*12CB.0020.0002] # BLACK DROPLET +1F323 ; [*12CC.0020.0002] # WHITE SUN +1F324 ; [*12CD.0020.0002] # WHITE SUN WITH SMALL CLOUD +1F325 ; [*12CE.0020.0002] # WHITE SUN BEHIND CLOUD +1F326 ; [*12CF.0020.0002] # WHITE SUN BEHIND CLOUD WITH RAIN +1F327 ; [*12D0.0020.0002] # CLOUD WITH RAIN +1F328 ; [*12D1.0020.0002] # CLOUD WITH SNOW +1F329 ; [*12D2.0020.0002] # CLOUD WITH LIGHTNING +1F32A ; [*12D3.0020.0002] # CLOUD WITH TORNADO +1F32B ; [*12D4.0020.0002] # FOG +1F32C ; [*12D5.0020.0002] # WIND BLOWING FACE +1F32D ; [*12D6.0020.0002] # HOT DOG +1F32E ; [*12D7.0020.0002] # TACO +1F32F ; [*12D8.0020.0002] # BURRITO +1F330 ; [*12D9.0020.0002] # CHESTNUT +1F331 ; [*12DA.0020.0002] # SEEDLING +1F332 ; [*12DB.0020.0002] # EVERGREEN TREE +1F333 ; [*12DC.0020.0002] # DECIDUOUS TREE +1F334 ; [*12DD.0020.0002] # PALM TREE +1F335 ; [*12DE.0020.0002] # CACTUS +1F336 ; [*12DF.0020.0002] # HOT PEPPER +1F337 ; [*12E0.0020.0002] # TULIP +1F338 ; [*12E1.0020.0002] # CHERRY BLOSSOM +1F339 ; [*12E2.0020.0002] # ROSE +1F33A ; [*12E3.0020.0002] # HIBISCUS +1F33B ; [*12E4.0020.0002] # SUNFLOWER +1F33C ; [*12E5.0020.0002] # BLOSSOM +1F33D ; [*12E6.0020.0002] # EAR OF MAIZE +1F33E ; [*12E7.0020.0002] # EAR OF RICE +1F33F ; [*12E8.0020.0002] # HERB +1F340 ; [*12E9.0020.0002] # FOUR LEAF CLOVER +1F341 ; [*12EA.0020.0002] # MAPLE LEAF +1F342 ; [*12EB.0020.0002] # FALLEN LEAF +1F343 ; [*12EC.0020.0002] # LEAF FLUTTERING IN WIND +1F344 ; [*12ED.0020.0002] # MUSHROOM +1F345 ; [*12EE.0020.0002] # TOMATO +1F346 ; [*12EF.0020.0002] # AUBERGINE +1F347 ; [*12F0.0020.0002] # GRAPES +1F348 ; [*12F1.0020.0002] # MELON +1F349 ; [*12F2.0020.0002] # WATERMELON +1F34A ; [*12F3.0020.0002] # TANGERINE +1F34B ; [*12F4.0020.0002] # LEMON +1F34C ; [*12F5.0020.0002] # BANANA +1F34D ; [*12F6.0020.0002] # PINEAPPLE +1F34E ; [*12F7.0020.0002] # RED APPLE +1F34F ; [*12F8.0020.0002] # GREEN APPLE +1F350 ; [*12F9.0020.0002] # PEAR +1F351 ; [*12FA.0020.0002] # PEACH +1F352 ; [*12FB.0020.0002] # CHERRIES +1F353 ; [*12FC.0020.0002] # STRAWBERRY +1F354 ; [*12FD.0020.0002] # HAMBURGER +1F355 ; [*12FE.0020.0002] # SLICE OF PIZZA +1F356 ; [*12FF.0020.0002] # MEAT ON BONE +1F357 ; [*1300.0020.0002] # POULTRY LEG +1F358 ; [*1301.0020.0002] # RICE CRACKER +1F359 ; [*1302.0020.0002] # RICE BALL +1F35A ; [*1303.0020.0002] # COOKED RICE +1F35B ; [*1304.0020.0002] # CURRY AND RICE +1F35C ; [*1305.0020.0002] # STEAMING BOWL +1F35D ; [*1306.0020.0002] # SPAGHETTI +1F35E ; [*1307.0020.0002] # BREAD +1F35F ; [*1308.0020.0002] # FRENCH FRIES +1F360 ; [*1309.0020.0002] # ROASTED SWEET POTATO +1F361 ; [*130A.0020.0002] # DANGO +1F362 ; [*130B.0020.0002] # ODEN +1F363 ; [*130C.0020.0002] # SUSHI +1F364 ; [*130D.0020.0002] # FRIED SHRIMP +1F365 ; [*130E.0020.0002] # FISH CAKE WITH SWIRL DESIGN +1F366 ; [*130F.0020.0002] # SOFT ICE CREAM +1F367 ; [*1310.0020.0002] # SHAVED ICE +1F368 ; [*1311.0020.0002] # ICE CREAM +1F369 ; [*1312.0020.0002] # DOUGHNUT +1F36A ; [*1313.0020.0002] # COOKIE +1F36B ; [*1314.0020.0002] # CHOCOLATE BAR +1F36C ; [*1315.0020.0002] # CANDY +1F36D ; [*1316.0020.0002] # LOLLIPOP +1F36E ; [*1317.0020.0002] # CUSTARD +1F36F ; [*1318.0020.0002] # HONEY POT +1F370 ; [*1319.0020.0002] # SHORTCAKE +1F371 ; [*131A.0020.0002] # BENTO BOX +1F372 ; [*131B.0020.0002] # POT OF FOOD +1F373 ; [*131C.0020.0002] # COOKING +1F374 ; [*131D.0020.0002] # FORK AND KNIFE +1F375 ; [*131E.0020.0002] # TEACUP WITHOUT HANDLE +1F376 ; [*131F.0020.0002] # SAKE BOTTLE AND CUP +1F377 ; [*1320.0020.0002] # WINE GLASS +1F378 ; [*1321.0020.0002] # COCKTAIL GLASS +1F379 ; [*1322.0020.0002] # TROPICAL DRINK +1F37A ; [*1323.0020.0002] # BEER MUG +1F37B ; [*1324.0020.0002] # CLINKING BEER MUGS +1F37C ; [*1325.0020.0002] # BABY BOTTLE +1F37D ; [*1326.0020.0002] # FORK AND KNIFE WITH PLATE +1F37E ; [*1327.0020.0002] # BOTTLE WITH POPPING CORK +1F37F ; [*1328.0020.0002] # POPCORN +1F380 ; [*1329.0020.0002] # RIBBON +1F381 ; [*132A.0020.0002] # WRAPPED PRESENT +1F382 ; [*132B.0020.0002] # BIRTHDAY CAKE +1F383 ; [*132C.0020.0002] # JACK-O-LANTERN +1F384 ; [*132D.0020.0002] # CHRISTMAS TREE +1F385 ; [*132E.0020.0002] # FATHER CHRISTMAS +1F386 ; [*132F.0020.0002] # FIREWORKS +1F387 ; [*1330.0020.0002] # FIREWORK SPARKLER +1F388 ; [*1331.0020.0002] # BALLOON +1F389 ; [*1332.0020.0002] # PARTY POPPER +1F38A ; [*1333.0020.0002] # CONFETTI BALL +1F38B ; [*1334.0020.0002] # TANABATA TREE +1F38C ; [*1335.0020.0002] # CROSSED FLAGS +1F38D ; [*1336.0020.0002] # PINE DECORATION +1F38E ; [*1337.0020.0002] # JAPANESE DOLLS +1F38F ; [*1338.0020.0002] # CARP STREAMER +1F390 ; [*1339.0020.0002] # WIND CHIME +1F391 ; [*133A.0020.0002] # MOON VIEWING CEREMONY +1F392 ; [*133B.0020.0002] # SCHOOL SATCHEL +1F393 ; [*133C.0020.0002] # GRADUATION CAP +1F394 ; [*133D.0020.0002] # HEART WITH TIP ON THE LEFT +1F395 ; [*133E.0020.0002] # BOUQUET OF FLOWERS +1F396 ; [*133F.0020.0002] # MILITARY MEDAL +1F397 ; [*1340.0020.0002] # REMINDER RIBBON +1F398 ; [*1341.0020.0002] # MUSICAL KEYBOARD WITH JACKS +1F399 ; [*1342.0020.0002] # STUDIO MICROPHONE +1F39A ; [*1343.0020.0002] # LEVEL SLIDER +1F39B ; [*1344.0020.0002] # CONTROL KNOBS +1F39C ; [*1345.0020.0002] # BEAMED ASCENDING MUSICAL NOTES +1F39D ; [*1346.0020.0002] # BEAMED DESCENDING MUSICAL NOTES +1F39E ; [*1347.0020.0002] # FILM FRAMES +1F39F ; [*1348.0020.0002] # ADMISSION TICKETS +1F3A0 ; [*1349.0020.0002] # CAROUSEL HORSE +1F3A1 ; [*134A.0020.0002] # FERRIS WHEEL +1F3A2 ; [*134B.0020.0002] # ROLLER COASTER +1F3A3 ; [*134C.0020.0002] # FISHING POLE AND FISH +1F3A4 ; [*134D.0020.0002] # MICROPHONE +1F3A5 ; [*134E.0020.0002] # MOVIE CAMERA +1F3A6 ; [*134F.0020.0002] # CINEMA +1F3A7 ; [*1350.0020.0002] # HEADPHONE +1F3A8 ; [*1351.0020.0002] # ARTIST PALETTE +1F3A9 ; [*1352.0020.0002] # TOP HAT +1F3AA ; [*1353.0020.0002] # CIRCUS TENT +1F3AB ; [*1354.0020.0002] # TICKET +1F3AC ; [*1355.0020.0002] # CLAPPER BOARD +1F3AD ; [*1356.0020.0002] # PERFORMING ARTS +1F3AE ; [*1357.0020.0002] # VIDEO GAME +1F3AF ; [*1358.0020.0002] # DIRECT HIT +1F3B0 ; [*1359.0020.0002] # SLOT MACHINE +1F3B1 ; [*135A.0020.0002] # BILLIARDS +1F3B2 ; [*135B.0020.0002] # GAME DIE +1F3B3 ; [*135C.0020.0002] # BOWLING +1F3B4 ; [*135D.0020.0002] # FLOWER PLAYING CARDS +1F3B5 ; [*135E.0020.0002] # MUSICAL NOTE +1F3B6 ; [*135F.0020.0002] # MULTIPLE MUSICAL NOTES +1F3B7 ; [*1360.0020.0002] # SAXOPHONE +1F3B8 ; [*1361.0020.0002] # GUITAR +1F3B9 ; [*1362.0020.0002] # MUSICAL KEYBOARD +1F3BA ; [*1363.0020.0002] # TRUMPET +1F3BB ; [*1364.0020.0002] # VIOLIN +1F3BC ; [*1365.0020.0002] # MUSICAL SCORE +1F3BD ; [*1366.0020.0002] # RUNNING SHIRT WITH SASH +1F3BE ; [*1367.0020.0002] # TENNIS RACQUET AND BALL +1F3BF ; [*1368.0020.0002] # SKI AND SKI BOOT +1F3C0 ; [*1369.0020.0002] # BASKETBALL AND HOOP +1F3C1 ; [*136A.0020.0002] # CHEQUERED FLAG +1F3C2 ; [*136B.0020.0002] # SNOWBOARDER +1F3C3 ; [*136C.0020.0002] # RUNNER +1F3C4 ; [*136D.0020.0002] # SURFER +1F3C5 ; [*136E.0020.0002] # SPORTS MEDAL +1F3C6 ; [*136F.0020.0002] # TROPHY +1F3C7 ; [*1370.0020.0002] # HORSE RACING +1F3C8 ; [*1371.0020.0002] # AMERICAN FOOTBALL +1F3C9 ; [*1372.0020.0002] # RUGBY FOOTBALL +1F3CA ; [*1373.0020.0002] # SWIMMER +1F3CB ; [*1374.0020.0002] # WEIGHT LIFTER +1F3CC ; [*1375.0020.0002] # GOLFER +1F3CD ; [*1376.0020.0002] # RACING MOTORCYCLE +1F3CE ; [*1377.0020.0002] # RACING CAR +1F3CF ; [*1378.0020.0002] # CRICKET BAT AND BALL +1F3D0 ; [*1379.0020.0002] # VOLLEYBALL +1F3D1 ; [*137A.0020.0002] # FIELD HOCKEY STICK AND BALL +1F3D2 ; [*137B.0020.0002] # ICE HOCKEY STICK AND PUCK +1F3D3 ; [*137C.0020.0002] # TABLE TENNIS PADDLE AND BALL +1F3D4 ; [*137D.0020.0002] # SNOW CAPPED MOUNTAIN +1F3D5 ; [*137E.0020.0002] # CAMPING +1F3D6 ; [*137F.0020.0002] # BEACH WITH UMBRELLA +1F3D7 ; [*1380.0020.0002] # BUILDING CONSTRUCTION +1F3D8 ; [*1381.0020.0002] # HOUSE BUILDINGS +1F3D9 ; [*1382.0020.0002] # CITYSCAPE +1F3DA ; [*1383.0020.0002] # DERELICT HOUSE BUILDING +1F3DB ; [*1384.0020.0002] # CLASSICAL BUILDING +1F3DC ; [*1385.0020.0002] # DESERT +1F3DD ; [*1386.0020.0002] # DESERT ISLAND +1F3DE ; [*1387.0020.0002] # NATIONAL PARK +1F3DF ; [*1388.0020.0002] # STADIUM +1F3E0 ; [*1389.0020.0002] # HOUSE BUILDING +1F3E1 ; [*138A.0020.0002] # HOUSE WITH GARDEN +1F3E2 ; [*138B.0020.0002] # OFFICE BUILDING +1F3E3 ; [*138C.0020.0002] # JAPANESE POST OFFICE +1F3E4 ; [*138D.0020.0002] # EUROPEAN POST OFFICE +1F3E5 ; [*138E.0020.0002] # HOSPITAL +1F3E6 ; [*138F.0020.0002] # BANK +1F3E7 ; [*1390.0020.0002] # AUTOMATED TELLER MACHINE +1F3E8 ; [*1391.0020.0002] # HOTEL +1F3E9 ; [*1392.0020.0002] # LOVE HOTEL +1F3EA ; [*1393.0020.0002] # CONVENIENCE STORE +1F3EB ; [*1394.0020.0002] # SCHOOL +1F3EC ; [*1395.0020.0002] # DEPARTMENT STORE +1F3ED ; [*1396.0020.0002] # FACTORY +1F3EE ; [*1397.0020.0002] # IZAKAYA LANTERN +1F3EF ; [*1398.0020.0002] # JAPANESE CASTLE +1F3F0 ; [*1399.0020.0002] # EUROPEAN CASTLE +1F3F1 ; [*139A.0020.0002] # WHITE PENNANT +1F3F2 ; [*139B.0020.0002] # BLACK PENNANT +1F3F3 ; [*139C.0020.0002] # WAVING WHITE FLAG +1F3F4 ; [*139D.0020.0002] # WAVING BLACK FLAG +1F3F5 ; [*139E.0020.0002] # ROSETTE +1F3F6 ; [*139F.0020.0002] # BLACK ROSETTE +1F3F7 ; [*13A0.0020.0002] # LABEL +1F3F8 ; [*13A1.0020.0002] # BADMINTON RACQUET AND SHUTTLECOCK +1F3F9 ; [*13A2.0020.0002] # BOW AND ARROW +1F3FA ; [*13A3.0020.0002] # AMPHORA +1F3FB ; [*13A4.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-1-2 +1F3FC ; [*13A5.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-3 +1F3FD ; [*13A6.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-4 +1F3FE ; [*13A7.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-5 +1F3FF ; [*13A8.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400 ; [*13A9.0020.0002] # RAT +1F401 ; [*13AA.0020.0002] # MOUSE +1F402 ; [*13AB.0020.0002] # OX +1F403 ; [*13AC.0020.0002] # WATER BUFFALO +1F404 ; [*13AD.0020.0002] # COW +1F405 ; [*13AE.0020.0002] # TIGER +1F406 ; [*13AF.0020.0002] # LEOPARD +1F407 ; [*13B0.0020.0002] # RABBIT +1F408 ; [*13B1.0020.0002] # CAT +1F409 ; [*13B2.0020.0002] # DRAGON +1F40A ; [*13B3.0020.0002] # CROCODILE +1F40B ; [*13B4.0020.0002] # WHALE +1F40C ; [*13B5.0020.0002] # SNAIL +1F40D ; [*13B6.0020.0002] # SNAKE +1F40E ; [*13B7.0020.0002] # HORSE +1F40F ; [*13B8.0020.0002] # RAM +1F410 ; [*13B9.0020.0002] # GOAT +1F411 ; [*13BA.0020.0002] # SHEEP +1F412 ; [*13BB.0020.0002] # MONKEY +1F413 ; [*13BC.0020.0002] # ROOSTER +1F414 ; [*13BD.0020.0002] # CHICKEN +1F415 ; [*13BE.0020.0002] # DOG +1F416 ; [*13BF.0020.0002] # PIG +1F417 ; [*13C0.0020.0002] # BOAR +1F418 ; [*13C1.0020.0002] # ELEPHANT +1F419 ; [*13C2.0020.0002] # OCTOPUS +1F41A ; [*13C3.0020.0002] # SPIRAL SHELL +1F41B ; [*13C4.0020.0002] # BUG +1F41C ; [*13C5.0020.0002] # ANT +1F41D ; [*13C6.0020.0002] # HONEYBEE +1F41E ; [*13C7.0020.0002] # LADY BEETLE +1F41F ; [*13C8.0020.0002] # FISH +1F420 ; [*13C9.0020.0002] # TROPICAL FISH +1F421 ; [*13CA.0020.0002] # BLOWFISH +1F422 ; [*13CB.0020.0002] # TURTLE +1F423 ; [*13CC.0020.0002] # HATCHING CHICK +1F424 ; [*13CD.0020.0002] # BABY CHICK +1F425 ; [*13CE.0020.0002] # FRONT-FACING BABY CHICK +1F426 ; [*13CF.0020.0002] # BIRD +1F427 ; [*13D0.0020.0002] # PENGUIN +1F428 ; [*13D1.0020.0002] # KOALA +1F429 ; [*13D2.0020.0002] # POODLE +1F42A ; [*13D3.0020.0002] # DROMEDARY CAMEL +1F42B ; [*13D4.0020.0002] # BACTRIAN CAMEL +1F42C ; [*13D5.0020.0002] # DOLPHIN +1F42D ; [*13D6.0020.0002] # MOUSE FACE +1F42E ; [*13D7.0020.0002] # COW FACE +1F42F ; [*13D8.0020.0002] # TIGER FACE +1F430 ; [*13D9.0020.0002] # RABBIT FACE +1F431 ; [*13DA.0020.0002] # CAT FACE +1F432 ; [*13DB.0020.0002] # DRAGON FACE +1F433 ; [*13DC.0020.0002] # SPOUTING WHALE +1F434 ; [*13DD.0020.0002] # HORSE FACE +1F435 ; [*13DE.0020.0002] # MONKEY FACE +1F436 ; [*13DF.0020.0002] # DOG FACE +1F437 ; [*13E0.0020.0002] # PIG FACE +1F438 ; [*13E1.0020.0002] # FROG FACE +1F439 ; [*13E2.0020.0002] # HAMSTER FACE +1F43A ; [*13E3.0020.0002] # WOLF FACE +1F43B ; [*13E4.0020.0002] # BEAR FACE +1F43C ; [*13E5.0020.0002] # PANDA FACE +1F43D ; [*13E6.0020.0002] # PIG NOSE +1F43E ; [*13E7.0020.0002] # PAW PRINTS +1F43F ; [*13E8.0020.0002] # CHIPMUNK +1F440 ; [*13E9.0020.0002] # EYES +1F441 ; [*13EA.0020.0002] # EYE +1F442 ; [*13EB.0020.0002] # EAR +1F443 ; [*13EC.0020.0002] # NOSE +1F444 ; [*13ED.0020.0002] # MOUTH +1F445 ; [*13EE.0020.0002] # TONGUE +1F446 ; [*13EF.0020.0002] # WHITE UP POINTING BACKHAND INDEX +1F447 ; [*13F0.0020.0002] # WHITE DOWN POINTING BACKHAND INDEX +1F448 ; [*13F1.0020.0002] # WHITE LEFT POINTING BACKHAND INDEX +1F449 ; [*13F2.0020.0002] # WHITE RIGHT POINTING BACKHAND INDEX +1F44A ; [*13F3.0020.0002] # FISTED HAND SIGN +1F44B ; [*13F4.0020.0002] # WAVING HAND SIGN +1F44C ; [*13F5.0020.0002] # OK HAND SIGN +1F44D ; [*13F6.0020.0002] # THUMBS UP SIGN +1F44E ; [*13F7.0020.0002] # THUMBS DOWN SIGN +1F44F ; [*13F8.0020.0002] # CLAPPING HANDS SIGN +1F450 ; [*13F9.0020.0002] # OPEN HANDS SIGN +1F451 ; [*13FA.0020.0002] # CROWN +1F452 ; [*13FB.0020.0002] # WOMANS HAT +1F453 ; [*13FC.0020.0002] # EYEGLASSES +1F454 ; [*13FD.0020.0002] # NECKTIE +1F455 ; [*13FE.0020.0002] # T-SHIRT +1F456 ; [*13FF.0020.0002] # JEANS +1F457 ; [*1400.0020.0002] # DRESS +1F458 ; [*1401.0020.0002] # KIMONO +1F459 ; [*1402.0020.0002] # BIKINI +1F45A ; [*1403.0020.0002] # WOMANS CLOTHES +1F45B ; [*1404.0020.0002] # PURSE +1F45C ; [*1405.0020.0002] # HANDBAG +1F45D ; [*1406.0020.0002] # POUCH +1F45E ; [*1407.0020.0002] # MANS SHOE +1F45F ; [*1408.0020.0002] # ATHLETIC SHOE +1F460 ; [*1409.0020.0002] # HIGH-HEELED SHOE +1F461 ; [*140A.0020.0002] # WOMANS SANDAL +1F462 ; [*140B.0020.0002] # WOMANS BOOTS +1F463 ; [*140C.0020.0002] # FOOTPRINTS +1F464 ; [*140D.0020.0002] # BUST IN SILHOUETTE +1F465 ; [*140E.0020.0002] # BUSTS IN SILHOUETTE +1F466 ; [*140F.0020.0002] # BOY +1F467 ; [*1410.0020.0002] # GIRL +1F468 ; [*1411.0020.0002] # MAN +1F469 ; [*1412.0020.0002] # WOMAN +1F46A ; [*1413.0020.0002] # FAMILY +1F46B ; [*1414.0020.0002] # MAN AND WOMAN HOLDING HANDS +1F46C ; [*1415.0020.0002] # TWO MEN HOLDING HANDS +1F46D ; [*1416.0020.0002] # TWO WOMEN HOLDING HANDS +1F46E ; [*1417.0020.0002] # POLICE OFFICER +1F46F ; [*1418.0020.0002] # WOMAN WITH BUNNY EARS +1F470 ; [*1419.0020.0002] # BRIDE WITH VEIL +1F471 ; [*141A.0020.0002] # PERSON WITH BLOND HAIR +1F472 ; [*141B.0020.0002] # MAN WITH GUA PI MAO +1F473 ; [*141C.0020.0002] # MAN WITH TURBAN +1F474 ; [*141D.0020.0002] # OLDER MAN +1F475 ; [*141E.0020.0002] # OLDER WOMAN +1F476 ; [*141F.0020.0002] # BABY +1F477 ; [*1420.0020.0002] # CONSTRUCTION WORKER +1F478 ; [*1421.0020.0002] # PRINCESS +1F479 ; [*1422.0020.0002] # JAPANESE OGRE +1F47A ; [*1423.0020.0002] # JAPANESE GOBLIN +1F47B ; [*1424.0020.0002] # GHOST +1F47C ; [*1425.0020.0002] # BABY ANGEL +1F47D ; [*1426.0020.0002] # EXTRATERRESTRIAL ALIEN +1F47E ; [*1427.0020.0002] # ALIEN MONSTER +1F47F ; [*1428.0020.0002] # IMP +1F480 ; [*1429.0020.0002] # SKULL +1F481 ; [*142A.0020.0002] # INFORMATION DESK PERSON +1F482 ; [*142B.0020.0002] # GUARDSMAN +1F483 ; [*142C.0020.0002] # DANCER +1F484 ; [*142D.0020.0002] # LIPSTICK +1F485 ; [*142E.0020.0002] # NAIL POLISH +1F486 ; [*142F.0020.0002] # FACE MASSAGE +1F487 ; [*1430.0020.0002] # HAIRCUT +1F488 ; [*1431.0020.0002] # BARBER POLE +1F489 ; [*1432.0020.0002] # SYRINGE +1F48A ; [*1433.0020.0002] # PILL +1F48B ; [*1434.0020.0002] # KISS MARK +1F48C ; [*1435.0020.0002] # LOVE LETTER +1F48D ; [*1436.0020.0002] # RING +1F48E ; [*1437.0020.0002] # GEM STONE +1F48F ; [*1438.0020.0002] # KISS +1F490 ; [*1439.0020.0002] # BOUQUET +1F491 ; [*143A.0020.0002] # COUPLE WITH HEART +1F492 ; [*143B.0020.0002] # WEDDING +1F493 ; [*143C.0020.0002] # BEATING HEART +1F494 ; [*143D.0020.0002] # BROKEN HEART +1F495 ; [*143E.0020.0002] # TWO HEARTS +1F496 ; [*143F.0020.0002] # SPARKLING HEART +1F497 ; [*1440.0020.0002] # GROWING HEART +1F498 ; [*1441.0020.0002] # HEART WITH ARROW +1F499 ; [*1442.0020.0002] # BLUE HEART +1F49A ; [*1443.0020.0002] # GREEN HEART +1F49B ; [*1444.0020.0002] # YELLOW HEART +1F49C ; [*1445.0020.0002] # PURPLE HEART +1F49D ; [*1446.0020.0002] # HEART WITH RIBBON +1F49E ; [*1447.0020.0002] # REVOLVING HEARTS +1F49F ; [*1448.0020.0002] # HEART DECORATION +1F4A0 ; [*1449.0020.0002] # DIAMOND SHAPE WITH A DOT INSIDE +1F4A1 ; [*144A.0020.0002] # ELECTRIC LIGHT BULB +1F4A2 ; [*144B.0020.0002] # ANGER SYMBOL +1F4A3 ; [*144C.0020.0002] # BOMB +1F4A4 ; [*144D.0020.0002] # SLEEPING SYMBOL +1F4A5 ; [*144E.0020.0002] # COLLISION SYMBOL +1F4A6 ; [*144F.0020.0002] # SPLASHING SWEAT SYMBOL +1F4A7 ; [*1450.0020.0002] # DROPLET +1F4A8 ; [*1451.0020.0002] # DASH SYMBOL +1F4A9 ; [*1452.0020.0002] # PILE OF POO +1F4AA ; [*1453.0020.0002] # FLEXED BICEPS +1F4AB ; [*1454.0020.0002] # DIZZY SYMBOL +1F4AC ; [*1455.0020.0002] # SPEECH BALLOON +1F4AD ; [*1456.0020.0002] # THOUGHT BALLOON +1F4AE ; [*1457.0020.0002] # WHITE FLOWER +1F4AF ; [*1458.0020.0002] # HUNDRED POINTS SYMBOL +1F4B0 ; [*1459.0020.0002] # MONEY BAG +1F4B1 ; [*145A.0020.0002] # CURRENCY EXCHANGE +1F4B2 ; [*145B.0020.0002] # HEAVY DOLLAR SIGN +1F4B3 ; [*145C.0020.0002] # CREDIT CARD +1F4B4 ; [*145D.0020.0002] # BANKNOTE WITH YEN SIGN +1F4B5 ; [*145E.0020.0002] # BANKNOTE WITH DOLLAR SIGN +1F4B6 ; [*145F.0020.0002] # BANKNOTE WITH EURO SIGN +1F4B7 ; [*1460.0020.0002] # BANKNOTE WITH POUND SIGN +1F4B8 ; [*1461.0020.0002] # MONEY WITH WINGS +1F4B9 ; [*1462.0020.0002] # CHART WITH UPWARDS TREND AND YEN SIGN +1F4BA ; [*1463.0020.0002] # SEAT +1F4BB ; [*1464.0020.0002] # PERSONAL COMPUTER +1F4BC ; [*1465.0020.0002] # BRIEFCASE +1F4BD ; [*1466.0020.0002] # MINIDISC +1F4BE ; [*1467.0020.0002] # FLOPPY DISK +1F4BF ; [*1468.0020.0002] # OPTICAL DISC +1F4C0 ; [*1469.0020.0002] # DVD +1F4C1 ; [*146A.0020.0002] # FILE FOLDER +1F4C2 ; [*146B.0020.0002] # OPEN FILE FOLDER +1F4C3 ; [*146C.0020.0002] # PAGE WITH CURL +1F4C4 ; [*146D.0020.0002] # PAGE FACING UP +1F4C5 ; [*146E.0020.0002] # CALENDAR +1F4C6 ; [*146F.0020.0002] # TEAR-OFF CALENDAR +1F4C7 ; [*1470.0020.0002] # CARD INDEX +1F4C8 ; [*1471.0020.0002] # CHART WITH UPWARDS TREND +1F4C9 ; [*1472.0020.0002] # CHART WITH DOWNWARDS TREND +1F4CA ; [*1473.0020.0002] # BAR CHART +1F4CB ; [*1474.0020.0002] # CLIPBOARD +1F4CC ; [*1475.0020.0002] # PUSHPIN +1F4CD ; [*1476.0020.0002] # ROUND PUSHPIN +1F4CE ; [*1477.0020.0002] # PAPERCLIP +1F4CF ; [*1478.0020.0002] # STRAIGHT RULER +1F4D0 ; [*1479.0020.0002] # TRIANGULAR RULER +1F4D1 ; [*147A.0020.0002] # BOOKMARK TABS +1F4D2 ; [*147B.0020.0002] # LEDGER +1F4D3 ; [*147C.0020.0002] # NOTEBOOK +1F4D4 ; [*147D.0020.0002] # NOTEBOOK WITH DECORATIVE COVER +1F4D5 ; [*147E.0020.0002] # CLOSED BOOK +1F4D6 ; [*147F.0020.0002] # OPEN BOOK +1F4D7 ; [*1480.0020.0002] # GREEN BOOK +1F4D8 ; [*1481.0020.0002] # BLUE BOOK +1F4D9 ; [*1482.0020.0002] # ORANGE BOOK +1F4DA ; [*1483.0020.0002] # BOOKS +1F4DB ; [*1484.0020.0002] # NAME BADGE +1F4DC ; [*1485.0020.0002] # SCROLL +1F4DD ; [*1486.0020.0002] # MEMO +1F4DE ; [*1487.0020.0002] # TELEPHONE RECEIVER +1F4DF ; [*1488.0020.0002] # PAGER +1F4E0 ; [*1489.0020.0002] # FAX MACHINE +1F4E1 ; [*148A.0020.0002] # SATELLITE ANTENNA +1F4E2 ; [*148B.0020.0002] # PUBLIC ADDRESS LOUDSPEAKER +1F4E3 ; [*148C.0020.0002] # CHEERING MEGAPHONE +1F4E4 ; [*148D.0020.0002] # OUTBOX TRAY +1F4E5 ; [*148E.0020.0002] # INBOX TRAY +1F4E6 ; [*148F.0020.0002] # PACKAGE +1F4E7 ; [*1490.0020.0002] # E-MAIL SYMBOL +1F4E8 ; [*1491.0020.0002] # INCOMING ENVELOPE +1F4E9 ; [*1492.0020.0002] # ENVELOPE WITH DOWNWARDS ARROW ABOVE +1F4EA ; [*1493.0020.0002] # CLOSED MAILBOX WITH LOWERED FLAG +1F4EB ; [*1494.0020.0002] # CLOSED MAILBOX WITH RAISED FLAG +1F4EC ; [*1495.0020.0002] # OPEN MAILBOX WITH RAISED FLAG +1F4ED ; [*1496.0020.0002] # OPEN MAILBOX WITH LOWERED FLAG +1F4EE ; [*1497.0020.0002] # POSTBOX +1F4EF ; [*1498.0020.0002] # POSTAL HORN +1F4F0 ; [*1499.0020.0002] # NEWSPAPER +1F4F1 ; [*149A.0020.0002] # MOBILE PHONE +1F4F2 ; [*149B.0020.0002] # MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT +1F4F3 ; [*149C.0020.0002] # VIBRATION MODE +1F4F4 ; [*149D.0020.0002] # MOBILE PHONE OFF +1F4F5 ; [*149E.0020.0002] # NO MOBILE PHONES +1F4F6 ; [*149F.0020.0002] # ANTENNA WITH BARS +1F4F7 ; [*14A0.0020.0002] # CAMERA +1F4F8 ; [*14A1.0020.0002] # CAMERA WITH FLASH +1F4F9 ; [*14A2.0020.0002] # VIDEO CAMERA +1F4FA ; [*14A3.0020.0002] # TELEVISION +1F4FB ; [*14A4.0020.0002] # RADIO +1F4FC ; [*14A5.0020.0002] # VIDEOCASSETTE +1F4FD ; [*14A6.0020.0002] # FILM PROJECTOR +1F4FE ; [*14A7.0020.0002] # PORTABLE STEREO +1F4FF ; [*14A8.0020.0002] # PRAYER BEADS +1F500 ; [*14A9.0020.0002] # TWISTED RIGHTWARDS ARROWS +1F501 ; [*14AA.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS +1F502 ; [*14AB.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY +1F503 ; [*14AC.0020.0002] # CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS +1F504 ; [*14AD.0020.0002] # ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS +1F505 ; [*14AE.0020.0002] # LOW BRIGHTNESS SYMBOL +1F506 ; [*14AF.0020.0002] # HIGH BRIGHTNESS SYMBOL +1F507 ; [*14B0.0020.0002] # SPEAKER WITH CANCELLATION STROKE +1F508 ; [*14B1.0020.0002] # SPEAKER +1F509 ; [*14B2.0020.0002] # SPEAKER WITH ONE SOUND WAVE +1F50A ; [*14B3.0020.0002] # SPEAKER WITH THREE SOUND WAVES +1F50B ; [*14B4.0020.0002] # BATTERY +1F50C ; [*14B5.0020.0002] # ELECTRIC PLUG +1F50D ; [*14B6.0020.0002] # LEFT-POINTING MAGNIFYING GLASS +1F50E ; [*14B7.0020.0002] # RIGHT-POINTING MAGNIFYING GLASS +1F50F ; [*14B8.0020.0002] # LOCK WITH INK PEN +1F510 ; [*14B9.0020.0002] # CLOSED LOCK WITH KEY +1F511 ; [*14BA.0020.0002] # KEY +1F512 ; [*14BB.0020.0002] # LOCK +1F513 ; [*14BC.0020.0002] # OPEN LOCK +1F514 ; [*14BD.0020.0002] # BELL +1F515 ; [*14BE.0020.0002] # BELL WITH CANCELLATION STROKE +1F516 ; [*14BF.0020.0002] # BOOKMARK +1F517 ; [*14C0.0020.0002] # LINK SYMBOL +1F518 ; [*14C1.0020.0002] # RADIO BUTTON +1F519 ; [*14C2.0020.0002] # BACK WITH LEFTWARDS ARROW ABOVE +1F51A ; [*14C3.0020.0002] # END WITH LEFTWARDS ARROW ABOVE +1F51B ; [*14C4.0020.0002] # ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE +1F51C ; [*14C5.0020.0002] # SOON WITH RIGHTWARDS ARROW ABOVE +1F51D ; [*14C6.0020.0002] # TOP WITH UPWARDS ARROW ABOVE +1F51E ; [*14C7.0020.0002] # NO ONE UNDER EIGHTEEN SYMBOL +1F51F ; [*14C8.0020.0002] # KEYCAP TEN +1F520 ; [*14C9.0020.0002] # INPUT SYMBOL FOR LATIN CAPITAL LETTERS +1F521 ; [*14CA.0020.0002] # INPUT SYMBOL FOR LATIN SMALL LETTERS +1F522 ; [*14CB.0020.0002] # INPUT SYMBOL FOR NUMBERS +1F523 ; [*14CC.0020.0002] # INPUT SYMBOL FOR SYMBOLS +1F524 ; [*14CD.0020.0002] # INPUT SYMBOL FOR LATIN LETTERS +1F525 ; [*14CE.0020.0002] # FIRE +1F526 ; [*14CF.0020.0002] # ELECTRIC TORCH +1F527 ; [*14D0.0020.0002] # WRENCH +1F528 ; [*14D1.0020.0002] # HAMMER +1F529 ; [*14D2.0020.0002] # NUT AND BOLT +1F52A ; [*14D3.0020.0002] # HOCHO +1F52B ; [*14D4.0020.0002] # PISTOL +1F52C ; [*14D5.0020.0002] # MICROSCOPE +1F52D ; [*14D6.0020.0002] # TELESCOPE +1F52E ; [*14D7.0020.0002] # CRYSTAL BALL +1F52F ; [*14D8.0020.0002] # SIX POINTED STAR WITH MIDDLE DOT +1F530 ; [*14D9.0020.0002] # JAPANESE SYMBOL FOR BEGINNER +1F531 ; [*14DA.0020.0002] # TRIDENT EMBLEM +1F532 ; [*14DB.0020.0002] # BLACK SQUARE BUTTON +1F533 ; [*14DC.0020.0002] # WHITE SQUARE BUTTON +1F534 ; [*14DD.0020.0002] # LARGE RED CIRCLE +1F535 ; [*14DE.0020.0002] # LARGE BLUE CIRCLE +1F536 ; [*14DF.0020.0002] # LARGE ORANGE DIAMOND +1F537 ; [*14E0.0020.0002] # LARGE BLUE DIAMOND +1F538 ; [*14E1.0020.0002] # SMALL ORANGE DIAMOND +1F539 ; [*14E2.0020.0002] # SMALL BLUE DIAMOND +1F53A ; [*14E3.0020.0002] # UP-POINTING RED TRIANGLE +1F53B ; [*14E4.0020.0002] # DOWN-POINTING RED TRIANGLE +1F53C ; [*14E5.0020.0002] # UP-POINTING SMALL RED TRIANGLE +1F53D ; [*14E6.0020.0002] # DOWN-POINTING SMALL RED TRIANGLE +1F53E ; [*14E7.0020.0002] # LOWER RIGHT SHADOWED WHITE CIRCLE +1F53F ; [*14E8.0020.0002] # UPPER RIGHT SHADOWED WHITE CIRCLE +1F540 ; [*14E9.0020.0002] # CIRCLED CROSS POMMEE +1F541 ; [*14EA.0020.0002] # CROSS POMMEE WITH HALF-CIRCLE BELOW +1F542 ; [*14EB.0020.0002] # CROSS POMMEE +1F543 ; [*14EC.0020.0002] # NOTCHED LEFT SEMICIRCLE WITH THREE DOTS +1F544 ; [*14ED.0020.0002] # NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS +1F545 ; [*14EE.0020.0002] # SYMBOL FOR MARKS CHAPTER +1F546 ; [*14EF.0020.0002] # WHITE LATIN CROSS +1F547 ; [*14F0.0020.0002] # HEAVY LATIN CROSS +1F548 ; [*14F1.0020.0002] # CELTIC CROSS +1F549 ; [*14F2.0020.0002] # OM SYMBOL +1F54A ; [*14F3.0020.0002] # DOVE OF PEACE +1F54B ; [*14F4.0020.0002] # KAABA +1F54C ; [*14F5.0020.0002] # MOSQUE +1F54D ; [*14F6.0020.0002] # SYNAGOGUE +1F54E ; [*14F7.0020.0002] # MENORAH WITH NINE BRANCHES +1F54F ; [*14F8.0020.0002] # BOWL OF HYGIEIA +1F550 ; [*14F9.0020.0002] # CLOCK FACE ONE OCLOCK +1F551 ; [*14FA.0020.0002] # CLOCK FACE TWO OCLOCK +1F552 ; [*14FB.0020.0002] # CLOCK FACE THREE OCLOCK +1F553 ; [*14FC.0020.0002] # CLOCK FACE FOUR OCLOCK +1F554 ; [*14FD.0020.0002] # CLOCK FACE FIVE OCLOCK +1F555 ; [*14FE.0020.0002] # CLOCK FACE SIX OCLOCK +1F556 ; [*14FF.0020.0002] # CLOCK FACE SEVEN OCLOCK +1F557 ; [*1500.0020.0002] # CLOCK FACE EIGHT OCLOCK +1F558 ; [*1501.0020.0002] # CLOCK FACE NINE OCLOCK +1F559 ; [*1502.0020.0002] # CLOCK FACE TEN OCLOCK +1F55A ; [*1503.0020.0002] # CLOCK FACE ELEVEN OCLOCK +1F55B ; [*1504.0020.0002] # CLOCK FACE TWELVE OCLOCK +1F55C ; [*1505.0020.0002] # CLOCK FACE ONE-THIRTY +1F55D ; [*1506.0020.0002] # CLOCK FACE TWO-THIRTY +1F55E ; [*1507.0020.0002] # CLOCK FACE THREE-THIRTY +1F55F ; [*1508.0020.0002] # CLOCK FACE FOUR-THIRTY +1F560 ; [*1509.0020.0002] # CLOCK FACE FIVE-THIRTY +1F561 ; [*150A.0020.0002] # CLOCK FACE SIX-THIRTY +1F562 ; [*150B.0020.0002] # CLOCK FACE SEVEN-THIRTY +1F563 ; [*150C.0020.0002] # CLOCK FACE EIGHT-THIRTY +1F564 ; [*150D.0020.0002] # CLOCK FACE NINE-THIRTY +1F565 ; [*150E.0020.0002] # CLOCK FACE TEN-THIRTY +1F566 ; [*150F.0020.0002] # CLOCK FACE ELEVEN-THIRTY +1F567 ; [*1510.0020.0002] # CLOCK FACE TWELVE-THIRTY +1F568 ; [*1511.0020.0002] # RIGHT SPEAKER +1F569 ; [*1512.0020.0002] # RIGHT SPEAKER WITH ONE SOUND WAVE +1F56A ; [*1513.0020.0002] # RIGHT SPEAKER WITH THREE SOUND WAVES +1F56B ; [*1514.0020.0002] # BULLHORN +1F56C ; [*1515.0020.0002] # BULLHORN WITH SOUND WAVES +1F56D ; [*1516.0020.0002] # RINGING BELL +1F56E ; [*1517.0020.0002] # BOOK +1F56F ; [*1518.0020.0002] # CANDLE +1F570 ; [*1519.0020.0002] # MANTELPIECE CLOCK +1F571 ; [*151A.0020.0002] # BLACK SKULL AND CROSSBONES +1F572 ; [*151B.0020.0002] # NO PIRACY +1F573 ; [*151C.0020.0002] # HOLE +1F574 ; [*151D.0020.0002] # MAN IN BUSINESS SUIT LEVITATING +1F575 ; [*151E.0020.0002] # SLEUTH OR SPY +1F576 ; [*151F.0020.0002] # DARK SUNGLASSES +1F577 ; [*1520.0020.0002] # SPIDER +1F578 ; [*1521.0020.0002] # SPIDER WEB +1F579 ; [*1522.0020.0002] # JOYSTICK +1F57A ; [*1523.0020.0002] # MAN DANCING +1F57B ; [*1524.0020.0002] # LEFT HAND TELEPHONE RECEIVER +1F57C ; [*1525.0020.0002] # TELEPHONE RECEIVER WITH PAGE +1F57D ; [*1526.0020.0002] # RIGHT HAND TELEPHONE RECEIVER +1F57E ; [*1527.0020.0002] # WHITE TOUCHTONE TELEPHONE +1F57F ; [*1528.0020.0002] # BLACK TOUCHTONE TELEPHONE +1F580 ; [*1529.0020.0002] # TELEPHONE ON TOP OF MODEM +1F581 ; [*152A.0020.0002] # CLAMSHELL MOBILE PHONE +1F582 ; [*152B.0020.0002] # BACK OF ENVELOPE +1F583 ; [*152C.0020.0002] # STAMPED ENVELOPE +1F584 ; [*152D.0020.0002] # ENVELOPE WITH LIGHTNING +1F585 ; [*152E.0020.0002] # FLYING ENVELOPE +1F586 ; [*152F.0020.0002] # PEN OVER STAMPED ENVELOPE +1F587 ; [*1530.0020.0002] # LINKED PAPERCLIPS +1F588 ; [*1531.0020.0002] # BLACK PUSHPIN +1F589 ; [*1532.0020.0002] # LOWER LEFT PENCIL +1F58A ; [*1533.0020.0002] # LOWER LEFT BALLPOINT PEN +1F58B ; [*1534.0020.0002] # LOWER LEFT FOUNTAIN PEN +1F58C ; [*1535.0020.0002] # LOWER LEFT PAINTBRUSH +1F58D ; [*1536.0020.0002] # LOWER LEFT CRAYON +1F58E ; [*1537.0020.0002] # LEFT WRITING HAND +1F58F ; [*1538.0020.0002] # TURNED OK HAND SIGN +1F590 ; [*1539.0020.0002] # RAISED HAND WITH FINGERS SPLAYED +1F591 ; [*153A.0020.0002] # REVERSED RAISED HAND WITH FINGERS SPLAYED +1F592 ; [*153B.0020.0002] # REVERSED THUMBS UP SIGN +1F593 ; [*153C.0020.0002] # REVERSED THUMBS DOWN SIGN +1F594 ; [*153D.0020.0002] # REVERSED VICTORY HAND +1F595 ; [*153E.0020.0002] # REVERSED HAND WITH MIDDLE FINGER EXTENDED +1F596 ; [*153F.0020.0002] # RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597 ; [*1540.0020.0002] # WHITE DOWN POINTING LEFT HAND INDEX +1F598 ; [*1541.0020.0002] # SIDEWAYS WHITE LEFT POINTING INDEX +1F599 ; [*1542.0020.0002] # SIDEWAYS WHITE RIGHT POINTING INDEX +1F59A ; [*1543.0020.0002] # SIDEWAYS BLACK LEFT POINTING INDEX +1F59B ; [*1544.0020.0002] # SIDEWAYS BLACK RIGHT POINTING INDEX +1F59C ; [*1545.0020.0002] # BLACK LEFT POINTING BACKHAND INDEX +1F59D ; [*1546.0020.0002] # BLACK RIGHT POINTING BACKHAND INDEX +1F59E ; [*1547.0020.0002] # SIDEWAYS WHITE UP POINTING INDEX +1F59F ; [*1548.0020.0002] # SIDEWAYS WHITE DOWN POINTING INDEX +1F5A0 ; [*1549.0020.0002] # SIDEWAYS BLACK UP POINTING INDEX +1F5A1 ; [*154A.0020.0002] # SIDEWAYS BLACK DOWN POINTING INDEX +1F5A2 ; [*154B.0020.0002] # BLACK UP POINTING BACKHAND INDEX +1F5A3 ; [*154C.0020.0002] # BLACK DOWN POINTING BACKHAND INDEX +1F5A4 ; [*154D.0020.0002] # BLACK HEART +1F5A5 ; [*154E.0020.0002] # DESKTOP COMPUTER +1F5A6 ; [*154F.0020.0002] # KEYBOARD AND MOUSE +1F5A7 ; [*1550.0020.0002] # THREE NETWORKED COMPUTERS +1F5A8 ; [*1551.0020.0002] # PRINTER +1F5A9 ; [*1552.0020.0002] # POCKET CALCULATOR +1F5AA ; [*1553.0020.0002] # BLACK HARD SHELL FLOPPY DISK +1F5AB ; [*1554.0020.0002] # WHITE HARD SHELL FLOPPY DISK +1F5AC ; [*1555.0020.0002] # SOFT SHELL FLOPPY DISK +1F5AD ; [*1556.0020.0002] # TAPE CARTRIDGE +1F5AE ; [*1557.0020.0002] # WIRED KEYBOARD +1F5AF ; [*1558.0020.0002] # ONE BUTTON MOUSE +1F5B0 ; [*1559.0020.0002] # TWO BUTTON MOUSE +1F5B1 ; [*155A.0020.0002] # THREE BUTTON MOUSE +1F5B2 ; [*155B.0020.0002] # TRACKBALL +1F5B3 ; [*155C.0020.0002] # OLD PERSONAL COMPUTER +1F5B4 ; [*155D.0020.0002] # HARD DISK +1F5B5 ; [*155E.0020.0002] # SCREEN +1F5B6 ; [*155F.0020.0002] # PRINTER ICON +1F5B7 ; [*1560.0020.0002] # FAX ICON +1F5B8 ; [*1561.0020.0002] # OPTICAL DISC ICON +1F5B9 ; [*1562.0020.0002] # DOCUMENT WITH TEXT +1F5BA ; [*1563.0020.0002] # DOCUMENT WITH TEXT AND PICTURE +1F5BB ; [*1564.0020.0002] # DOCUMENT WITH PICTURE +1F5BC ; [*1565.0020.0002] # FRAME WITH PICTURE +1F5BD ; [*1566.0020.0002] # FRAME WITH TILES +1F5BE ; [*1567.0020.0002] # FRAME WITH AN X +1F5BF ; [*1568.0020.0002] # BLACK FOLDER +1F5C0 ; [*1569.0020.0002] # FOLDER +1F5C1 ; [*156A.0020.0002] # OPEN FOLDER +1F5C2 ; [*156B.0020.0002] # CARD INDEX DIVIDERS +1F5C3 ; [*156C.0020.0002] # CARD FILE BOX +1F5C4 ; [*156D.0020.0002] # FILE CABINET +1F5C5 ; [*156E.0020.0002] # EMPTY NOTE +1F5C6 ; [*156F.0020.0002] # EMPTY NOTE PAGE +1F5C7 ; [*1570.0020.0002] # EMPTY NOTE PAD +1F5C8 ; [*1571.0020.0002] # NOTE +1F5C9 ; [*1572.0020.0002] # NOTE PAGE +1F5CA ; [*1573.0020.0002] # NOTE PAD +1F5CB ; [*1574.0020.0002] # EMPTY DOCUMENT +1F5CC ; [*1575.0020.0002] # EMPTY PAGE +1F5CD ; [*1576.0020.0002] # EMPTY PAGES +1F5CE ; [*1577.0020.0002] # DOCUMENT +1F5CF ; [*1578.0020.0002] # PAGE +1F5D0 ; [*1579.0020.0002] # PAGES +1F5D1 ; [*157A.0020.0002] # WASTEBASKET +1F5D2 ; [*157B.0020.0002] # SPIRAL NOTE PAD +1F5D3 ; [*157C.0020.0002] # SPIRAL CALENDAR PAD +1F5D4 ; [*157D.0020.0002] # DESKTOP WINDOW +1F5D5 ; [*157E.0020.0002] # MINIMIZE +1F5D6 ; [*157F.0020.0002] # MAXIMIZE +1F5D7 ; [*1580.0020.0002] # OVERLAP +1F5D8 ; [*1581.0020.0002] # CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS +1F5D9 ; [*1582.0020.0002] # CANCELLATION X +1F5DA ; [*1583.0020.0002] # INCREASE FONT SIZE SYMBOL +1F5DB ; [*1584.0020.0002] # DECREASE FONT SIZE SYMBOL +1F5DC ; [*1585.0020.0002] # COMPRESSION +1F5DD ; [*1586.0020.0002] # OLD KEY +1F5DE ; [*1587.0020.0002] # ROLLED-UP NEWSPAPER +1F5DF ; [*1588.0020.0002] # PAGE WITH CIRCLED TEXT +1F5E0 ; [*1589.0020.0002] # STOCK CHART +1F5E1 ; [*158A.0020.0002] # DAGGER KNIFE +1F5E2 ; [*158B.0020.0002] # LIPS +1F5E3 ; [*158C.0020.0002] # SPEAKING HEAD IN SILHOUETTE +1F5E4 ; [*158D.0020.0002] # THREE RAYS ABOVE +1F5E5 ; [*158E.0020.0002] # THREE RAYS BELOW +1F5E6 ; [*158F.0020.0002] # THREE RAYS LEFT +1F5E7 ; [*1590.0020.0002] # THREE RAYS RIGHT +1F5E8 ; [*1591.0020.0002] # LEFT SPEECH BUBBLE +1F5E9 ; [*1592.0020.0002] # RIGHT SPEECH BUBBLE +1F5EA ; [*1593.0020.0002] # TWO SPEECH BUBBLES +1F5EB ; [*1594.0020.0002] # THREE SPEECH BUBBLES +1F5EC ; [*1595.0020.0002] # LEFT THOUGHT BUBBLE +1F5ED ; [*1596.0020.0002] # RIGHT THOUGHT BUBBLE +1F5EE ; [*1597.0020.0002] # LEFT ANGER BUBBLE +1F5EF ; [*1598.0020.0002] # RIGHT ANGER BUBBLE +1F5F0 ; [*1599.0020.0002] # MOOD BUBBLE +1F5F1 ; [*159A.0020.0002] # LIGHTNING MOOD BUBBLE +1F5F2 ; [*159B.0020.0002] # LIGHTNING MOOD +1F5F3 ; [*159C.0020.0002] # BALLOT BOX WITH BALLOT +1F5F4 ; [*159D.0020.0002] # BALLOT SCRIPT X +1F5F5 ; [*159E.0020.0002] # BALLOT BOX WITH SCRIPT X +1F5F6 ; [*159F.0020.0002] # BALLOT BOLD SCRIPT X +1F5F7 ; [*15A0.0020.0002] # BALLOT BOX WITH BOLD SCRIPT X +1F5F8 ; [*15A1.0020.0002] # LIGHT CHECK MARK +1F5F9 ; [*15A2.0020.0002] # BALLOT BOX WITH BOLD CHECK +1F5FA ; [*15A3.0020.0002] # WORLD MAP +1F5FB ; [*15A4.0020.0002] # MOUNT FUJI +1F5FC ; [*15A5.0020.0002] # TOKYO TOWER +1F5FD ; [*15A6.0020.0002] # STATUE OF LIBERTY +1F5FE ; [*15A7.0020.0002] # SILHOUETTE OF JAPAN +1F5FF ; [*15A8.0020.0002] # MOYAI +1F600 ; [*15FB.0020.0002] # GRINNING FACE +1F601 ; [*15FC.0020.0002] # GRINNING FACE WITH SMILING EYES +1F602 ; [*15FD.0020.0002] # FACE WITH TEARS OF JOY +1F603 ; [*15FE.0020.0002] # SMILING FACE WITH OPEN MOUTH +1F604 ; [*15FF.0020.0002] # SMILING FACE WITH OPEN MOUTH AND SMILING EYES +1F605 ; [*1600.0020.0002] # SMILING FACE WITH OPEN MOUTH AND COLD SWEAT +1F606 ; [*1601.0020.0002] # SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES +1F607 ; [*1602.0020.0002] # SMILING FACE WITH HALO +1F608 ; [*1603.0020.0002] # SMILING FACE WITH HORNS +1F609 ; [*1604.0020.0002] # WINKING FACE +1F60A ; [*1605.0020.0002] # SMILING FACE WITH SMILING EYES +1F60B ; [*1606.0020.0002] # FACE SAVOURING DELICIOUS FOOD +1F60C ; [*1607.0020.0002] # RELIEVED FACE +1F60D ; [*1608.0020.0002] # SMILING FACE WITH HEART-SHAPED EYES +1F60E ; [*1609.0020.0002] # SMILING FACE WITH SUNGLASSES +1F60F ; [*160A.0020.0002] # SMIRKING FACE +1F610 ; [*160B.0020.0002] # NEUTRAL FACE +1F611 ; [*160C.0020.0002] # EXPRESSIONLESS FACE +1F612 ; [*160D.0020.0002] # UNAMUSED FACE +1F613 ; [*160E.0020.0002] # FACE WITH COLD SWEAT +1F614 ; [*160F.0020.0002] # PENSIVE FACE +1F615 ; [*1610.0020.0002] # CONFUSED FACE +1F616 ; [*1611.0020.0002] # CONFOUNDED FACE +1F617 ; [*1612.0020.0002] # KISSING FACE +1F618 ; [*1613.0020.0002] # FACE THROWING A KISS +1F619 ; [*1614.0020.0002] # KISSING FACE WITH SMILING EYES +1F61A ; [*1615.0020.0002] # KISSING FACE WITH CLOSED EYES +1F61B ; [*1616.0020.0002] # FACE WITH STUCK-OUT TONGUE +1F61C ; [*1617.0020.0002] # FACE WITH STUCK-OUT TONGUE AND WINKING EYE +1F61D ; [*1618.0020.0002] # FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES +1F61E ; [*1619.0020.0002] # DISAPPOINTED FACE +1F61F ; [*161A.0020.0002] # WORRIED FACE +1F620 ; [*161B.0020.0002] # ANGRY FACE +1F621 ; [*161C.0020.0002] # POUTING FACE +1F622 ; [*161D.0020.0002] # CRYING FACE +1F623 ; [*161E.0020.0002] # PERSEVERING FACE +1F624 ; [*161F.0020.0002] # FACE WITH LOOK OF TRIUMPH +1F625 ; [*1620.0020.0002] # DISAPPOINTED BUT RELIEVED FACE +1F626 ; [*1621.0020.0002] # FROWNING FACE WITH OPEN MOUTH +1F627 ; [*1622.0020.0002] # ANGUISHED FACE +1F628 ; [*1623.0020.0002] # FEARFUL FACE +1F629 ; [*1624.0020.0002] # WEARY FACE +1F62A ; [*1625.0020.0002] # SLEEPY FACE +1F62B ; [*1626.0020.0002] # TIRED FACE +1F62C ; [*1627.0020.0002] # GRIMACING FACE +1F62D ; [*1628.0020.0002] # LOUDLY CRYING FACE +1F62E ; [*1629.0020.0002] # FACE WITH OPEN MOUTH +1F62F ; [*162A.0020.0002] # HUSHED FACE +1F630 ; [*162B.0020.0002] # FACE WITH OPEN MOUTH AND COLD SWEAT +1F631 ; [*162C.0020.0002] # FACE SCREAMING IN FEAR +1F632 ; [*162D.0020.0002] # ASTONISHED FACE +1F633 ; [*162E.0020.0002] # FLUSHED FACE +1F634 ; [*162F.0020.0002] # SLEEPING FACE +1F635 ; [*1630.0020.0002] # DIZZY FACE +1F636 ; [*1631.0020.0002] # FACE WITHOUT MOUTH +1F637 ; [*1632.0020.0002] # FACE WITH MEDICAL MASK +1F638 ; [*1633.0020.0002] # GRINNING CAT FACE WITH SMILING EYES +1F639 ; [*1634.0020.0002] # CAT FACE WITH TEARS OF JOY +1F63A ; [*1635.0020.0002] # SMILING CAT FACE WITH OPEN MOUTH +1F63B ; [*1636.0020.0002] # SMILING CAT FACE WITH HEART-SHAPED EYES +1F63C ; [*1637.0020.0002] # CAT FACE WITH WRY SMILE +1F63D ; [*1638.0020.0002] # KISSING CAT FACE WITH CLOSED EYES +1F63E ; [*1639.0020.0002] # POUTING CAT FACE +1F63F ; [*163A.0020.0002] # CRYING CAT FACE +1F640 ; [*163B.0020.0002] # WEARY CAT FACE +1F641 ; [*163C.0020.0002] # SLIGHTLY FROWNING FACE +1F642 ; [*163D.0020.0002] # SLIGHTLY SMILING FACE +1F643 ; [*163E.0020.0002] # UPSIDE-DOWN FACE +1F644 ; [*163F.0020.0002] # FACE WITH ROLLING EYES +1F645 ; [*1640.0020.0002] # FACE WITH NO GOOD GESTURE +1F646 ; [*1641.0020.0002] # FACE WITH OK GESTURE +1F647 ; [*1642.0020.0002] # PERSON BOWING DEEPLY +1F648 ; [*1643.0020.0002] # SEE-NO-EVIL MONKEY +1F649 ; [*1644.0020.0002] # HEAR-NO-EVIL MONKEY +1F64A ; [*1645.0020.0002] # SPEAK-NO-EVIL MONKEY +1F64B ; [*1646.0020.0002] # HAPPY PERSON RAISING ONE HAND +1F64C ; [*1647.0020.0002] # PERSON RAISING BOTH HANDS IN CELEBRATION +1F64D ; [*1648.0020.0002] # PERSON FROWNING +1F64E ; [*1649.0020.0002] # PERSON WITH POUTING FACE +1F64F ; [*164A.0020.0002] # PERSON WITH FOLDED HANDS +1F650 ; [*164B.0020.0002] # NORTH WEST POINTING LEAF +1F651 ; [*164C.0020.0002] # SOUTH WEST POINTING LEAF +1F652 ; [*164D.0020.0002] # NORTH EAST POINTING LEAF +1F653 ; [*164E.0020.0002] # SOUTH EAST POINTING LEAF +1F654 ; [*164F.0020.0002] # TURNED NORTH WEST POINTING LEAF +1F655 ; [*1650.0020.0002] # TURNED SOUTH WEST POINTING LEAF +1F656 ; [*1651.0020.0002] # TURNED NORTH EAST POINTING LEAF +1F657 ; [*1652.0020.0002] # TURNED SOUTH EAST POINTING LEAF +1F658 ; [*1653.0020.0002] # NORTH WEST POINTING VINE LEAF +1F659 ; [*1654.0020.0002] # SOUTH WEST POINTING VINE LEAF +1F65A ; [*1655.0020.0002] # NORTH EAST POINTING VINE LEAF +1F65B ; [*1656.0020.0002] # SOUTH EAST POINTING VINE LEAF +1F65C ; [*1657.0020.0002] # HEAVY NORTH WEST POINTING VINE LEAF +1F65D ; [*1658.0020.0002] # HEAVY SOUTH WEST POINTING VINE LEAF +1F65E ; [*1659.0020.0002] # HEAVY NORTH EAST POINTING VINE LEAF +1F65F ; [*165A.0020.0002] # HEAVY SOUTH EAST POINTING VINE LEAF +1F660 ; [*165B.0020.0002] # NORTH WEST POINTING BUD +1F661 ; [*165C.0020.0002] # SOUTH WEST POINTING BUD +1F662 ; [*165D.0020.0002] # NORTH EAST POINTING BUD +1F663 ; [*165E.0020.0002] # SOUTH EAST POINTING BUD +1F664 ; [*165F.0020.0002] # HEAVY NORTH WEST POINTING BUD +1F665 ; [*1660.0020.0002] # HEAVY SOUTH WEST POINTING BUD +1F666 ; [*1661.0020.0002] # HEAVY NORTH EAST POINTING BUD +1F667 ; [*1662.0020.0002] # HEAVY SOUTH EAST POINTING BUD +1F668 ; [*1663.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT +1F669 ; [*1664.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE +1F66A ; [*1665.0020.0002] # SOLID QUILT SQUARE ORNAMENT +1F66B ; [*1666.0020.0002] # SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE +1F66C ; [*1667.0020.0002] # LEFTWARDS ROCKET +1F66D ; [*1668.0020.0002] # UPWARDS ROCKET +1F66E ; [*1669.0020.0002] # RIGHTWARDS ROCKET +1F66F ; [*166A.0020.0002] # DOWNWARDS ROCKET +1F670 ; [*166B.0020.0002] # SCRIPT LIGATURE ET ORNAMENT +1F671 ; [*166C.0020.0002] # HEAVY SCRIPT LIGATURE ET ORNAMENT +1F672 ; [*166D.0020.0002] # LIGATURE OPEN ET ORNAMENT +1F673 ; [*166E.0020.0002] # HEAVY LIGATURE OPEN ET ORNAMENT +1F674 ; [*166F.0020.0002] # HEAVY AMPERSAND ORNAMENT +1F675 ; [*1670.0020.0002] # SWASH AMPERSAND ORNAMENT +1F676 ; [*1671.0020.0002] # SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +1F677 ; [*1672.0020.0002] # SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +1F678 ; [*1673.0020.0002] # SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +1F679 ; [*1674.0020.0002] # HEAVY INTERROBANG ORNAMENT +1F67A ; [*1675.0020.0002] # SANS-SERIF INTERROBANG ORNAMENT +1F67B ; [*1676.0020.0002] # HEAVY SANS-SERIF INTERROBANG ORNAMENT +1F67C ; [*1677.0020.0002] # VERY HEAVY SOLIDUS +1F67D ; [*1678.0020.0002] # VERY HEAVY REVERSE SOLIDUS +1F67E ; [*1679.0020.0002] # CHECKER BOARD +1F67F ; [*167A.0020.0002] # REVERSE CHECKER BOARD +1F680 ; [*167B.0020.0002] # ROCKET +1F681 ; [*167C.0020.0002] # HELICOPTER +1F682 ; [*167D.0020.0002] # STEAM LOCOMOTIVE +1F683 ; [*167E.0020.0002] # RAILWAY CAR +1F684 ; [*167F.0020.0002] # HIGH-SPEED TRAIN +1F685 ; [*1680.0020.0002] # HIGH-SPEED TRAIN WITH BULLET NOSE +1F686 ; [*1681.0020.0002] # TRAIN +1F687 ; [*1682.0020.0002] # METRO +1F688 ; [*1683.0020.0002] # LIGHT RAIL +1F689 ; [*1684.0020.0002] # STATION +1F68A ; [*1685.0020.0002] # TRAM +1F68B ; [*1686.0020.0002] # TRAM CAR +1F68C ; [*1687.0020.0002] # BUS +1F68D ; [*1688.0020.0002] # ONCOMING BUS +1F68E ; [*1689.0020.0002] # TROLLEYBUS +1F68F ; [*168A.0020.0002] # BUS STOP +1F690 ; [*168B.0020.0002] # MINIBUS +1F691 ; [*168C.0020.0002] # AMBULANCE +1F692 ; [*168D.0020.0002] # FIRE ENGINE +1F693 ; [*168E.0020.0002] # POLICE CAR +1F694 ; [*168F.0020.0002] # ONCOMING POLICE CAR +1F695 ; [*1690.0020.0002] # TAXI +1F696 ; [*1691.0020.0002] # ONCOMING TAXI +1F697 ; [*1692.0020.0002] # AUTOMOBILE +1F698 ; [*1693.0020.0002] # ONCOMING AUTOMOBILE +1F699 ; [*1694.0020.0002] # RECREATIONAL VEHICLE +1F69A ; [*1695.0020.0002] # DELIVERY TRUCK +1F69B ; [*1696.0020.0002] # ARTICULATED LORRY +1F69C ; [*1697.0020.0002] # TRACTOR +1F69D ; [*1698.0020.0002] # MONORAIL +1F69E ; [*1699.0020.0002] # MOUNTAIN RAILWAY +1F69F ; [*169A.0020.0002] # SUSPENSION RAILWAY +1F6A0 ; [*169B.0020.0002] # MOUNTAIN CABLEWAY +1F6A1 ; [*169C.0020.0002] # AERIAL TRAMWAY +1F6A2 ; [*169D.0020.0002] # SHIP +1F6A3 ; [*169E.0020.0002] # ROWBOAT +1F6A4 ; [*169F.0020.0002] # SPEEDBOAT +1F6A5 ; [*16A0.0020.0002] # HORIZONTAL TRAFFIC LIGHT +1F6A6 ; [*16A1.0020.0002] # VERTICAL TRAFFIC LIGHT +1F6A7 ; [*16A2.0020.0002] # CONSTRUCTION SIGN +1F6A8 ; [*16A3.0020.0002] # POLICE CARS REVOLVING LIGHT +1F6A9 ; [*16A4.0020.0002] # TRIANGULAR FLAG ON POST +1F6AA ; [*16A5.0020.0002] # DOOR +1F6AB ; [*16A6.0020.0002] # NO ENTRY SIGN +1F6AC ; [*16A7.0020.0002] # SMOKING SYMBOL +1F6AD ; [*16A8.0020.0002] # NO SMOKING SYMBOL +1F6AE ; [*16A9.0020.0002] # PUT LITTER IN ITS PLACE SYMBOL +1F6AF ; [*16AA.0020.0002] # DO NOT LITTER SYMBOL +1F6B0 ; [*16AB.0020.0002] # POTABLE WATER SYMBOL +1F6B1 ; [*16AC.0020.0002] # NON-POTABLE WATER SYMBOL +1F6B2 ; [*16AD.0020.0002] # BICYCLE +1F6B3 ; [*16AE.0020.0002] # NO BICYCLES +1F6B4 ; [*16AF.0020.0002] # BICYCLIST +1F6B5 ; [*16B0.0020.0002] # MOUNTAIN BICYCLIST +1F6B6 ; [*16B1.0020.0002] # PEDESTRIAN +1F6B7 ; [*16B2.0020.0002] # NO PEDESTRIANS +1F6B8 ; [*16B3.0020.0002] # CHILDREN CROSSING +1F6B9 ; [*16B4.0020.0002] # MENS SYMBOL +1F6BA ; [*16B5.0020.0002] # WOMENS SYMBOL +1F6BB ; [*16B6.0020.0002] # RESTROOM +1F6BC ; [*16B7.0020.0002] # BABY SYMBOL +1F6BD ; [*16B8.0020.0002] # TOILET +1F6BE ; [*16B9.0020.0002] # WATER CLOSET +1F6BF ; [*16BA.0020.0002] # SHOWER +1F6C0 ; [*16BB.0020.0002] # BATH +1F6C1 ; [*16BC.0020.0002] # BATHTUB +1F6C2 ; [*16BD.0020.0002] # PASSPORT CONTROL +1F6C3 ; [*16BE.0020.0002] # CUSTOMS +1F6C4 ; [*16BF.0020.0002] # BAGGAGE CLAIM +1F6C5 ; [*16C0.0020.0002] # LEFT LUGGAGE +1F6C6 ; [*16C1.0020.0002] # TRIANGLE WITH ROUNDED CORNERS +1F6C7 ; [*16C2.0020.0002] # PROHIBITED SIGN +1F6C8 ; [*16C3.0020.0002] # CIRCLED INFORMATION SOURCE +1F6C9 ; [*16C4.0020.0002] # BOYS SYMBOL +1F6CA ; [*16C5.0020.0002] # GIRLS SYMBOL +1F6CB ; [*16C6.0020.0002] # COUCH AND LAMP +1F6CC ; [*16C7.0020.0002] # SLEEPING ACCOMMODATION +1F6CD ; [*16C8.0020.0002] # SHOPPING BAGS +1F6CE ; [*16C9.0020.0002] # BELLHOP BELL +1F6CF ; [*16CA.0020.0002] # BED +1F6D0 ; [*16CB.0020.0002] # PLACE OF WORSHIP +1F6D1 ; [*16CC.0020.0002] # OCTAGONAL SIGN +1F6D2 ; [*16CD.0020.0002] # SHOPPING TROLLEY +1F6E0 ; [*16CE.0020.0002] # HAMMER AND WRENCH +1F6E1 ; [*16CF.0020.0002] # SHIELD +1F6E2 ; [*16D0.0020.0002] # OIL DRUM +1F6E3 ; [*16D1.0020.0002] # MOTORWAY +1F6E4 ; [*16D2.0020.0002] # RAILWAY TRACK +1F6E5 ; [*16D3.0020.0002] # MOTOR BOAT +1F6E6 ; [*16D4.0020.0002] # UP-POINTING MILITARY AIRPLANE +1F6E7 ; [*16D5.0020.0002] # UP-POINTING AIRPLANE +1F6E8 ; [*16D6.0020.0002] # UP-POINTING SMALL AIRPLANE +1F6E9 ; [*16D7.0020.0002] # SMALL AIRPLANE +1F6EA ; [*16D8.0020.0002] # NORTHEAST-POINTING AIRPLANE +1F6EB ; [*16D9.0020.0002] # AIRPLANE DEPARTURE +1F6EC ; [*16DA.0020.0002] # AIRPLANE ARRIVING +1F6F0 ; [*16DB.0020.0002] # SATELLITE +1F6F1 ; [*16DC.0020.0002] # ONCOMING FIRE ENGINE +1F6F2 ; [*16DD.0020.0002] # DIESEL LOCOMOTIVE +1F6F3 ; [*16DE.0020.0002] # PASSENGER SHIP +1F6F4 ; [*16DF.0020.0002] # SCOOTER +1F6F5 ; [*16E0.0020.0002] # MOTOR SCOOTER +1F6F6 ; [*16E1.0020.0002] # CANOE +1F700 ; [*16E2.0020.0002] # ALCHEMICAL SYMBOL FOR QUINTESSENCE +1F701 ; [*16E3.0020.0002] # ALCHEMICAL SYMBOL FOR AIR +1F702 ; [*16E4.0020.0002] # ALCHEMICAL SYMBOL FOR FIRE +1F703 ; [*16E5.0020.0002] # ALCHEMICAL SYMBOL FOR EARTH +1F704 ; [*16E6.0020.0002] # ALCHEMICAL SYMBOL FOR WATER +1F705 ; [*16E7.0020.0002] # ALCHEMICAL SYMBOL FOR AQUAFORTIS +1F706 ; [*16E8.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA +1F707 ; [*16E9.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA-2 +1F708 ; [*16EA.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE +1F709 ; [*16EB.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE-2 +1F70A ; [*16EC.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR +1F70B ; [*16ED.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-2 +1F70C ; [*16EE.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-3 +1F70D ; [*16EF.0020.0002] # ALCHEMICAL SYMBOL FOR SULFUR +1F70E ; [*16F0.0020.0002] # ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR +1F70F ; [*16F1.0020.0002] # ALCHEMICAL SYMBOL FOR BLACK SULFUR +1F710 ; [*16F2.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE +1F711 ; [*16F3.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 +1F712 ; [*16F4.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 +1F713 ; [*16F5.0020.0002] # ALCHEMICAL SYMBOL FOR CINNABAR +1F714 ; [*16F6.0020.0002] # ALCHEMICAL SYMBOL FOR SALT +1F715 ; [*16F7.0020.0002] # ALCHEMICAL SYMBOL FOR NITRE +1F716 ; [*16F8.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL +1F717 ; [*16F9.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL-2 +1F718 ; [*16FA.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT +1F719 ; [*16FB.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT-2 +1F71A ; [*16FC.0020.0002] # ALCHEMICAL SYMBOL FOR GOLD +1F71B ; [*16FD.0020.0002] # ALCHEMICAL SYMBOL FOR SILVER +1F71C ; [*16FE.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE +1F71D ; [*16FF.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE-2 +1F71E ; [*1700.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF IRON +1F71F ; [*1701.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF IRON +1F720 ; [*1702.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ORE +1F721 ; [*1703.0020.0002] # ALCHEMICAL SYMBOL FOR IRON-COPPER ORE +1F722 ; [*1704.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER +1F723 ; [*1705.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER +1F724 ; [*1706.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 +1F725 ; [*1707.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE +1F726 ; [*1708.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE +1F727 ; [*1709.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER +1F728 ; [*170A.0020.0002] # ALCHEMICAL SYMBOL FOR VERDIGRIS +1F729 ; [*170B.0020.0002] # ALCHEMICAL SYMBOL FOR TIN ORE +1F72A ; [*170C.0020.0002] # ALCHEMICAL SYMBOL FOR LEAD ORE +1F72B ; [*170D.0020.0002] # ALCHEMICAL SYMBOL FOR ANTIMONY ORE +1F72C ; [*170E.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY +1F72D ; [*170F.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY +1F72E ; [*1710.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY +1F72F ; [*1711.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY +1F730 ; [*1712.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY +1F731 ; [*1713.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 +1F732 ; [*1714.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS +1F733 ; [*1715.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-2 +1F734 ; [*1716.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-3 +1F735 ; [*1717.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-4 +1F736 ; [*1718.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI +1F737 ; [*1719.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI-2 +1F738 ; [*171A.0020.0002] # ALCHEMICAL SYMBOL FOR MARCASITE +1F739 ; [*171B.0020.0002] # ALCHEMICAL SYMBOL FOR SAL-AMMONIAC +1F73A ; [*171C.0020.0002] # ALCHEMICAL SYMBOL FOR ARSENIC +1F73B ; [*171D.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR +1F73C ; [*171E.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR-2 +1F73D ; [*171F.0020.0002] # ALCHEMICAL SYMBOL FOR AURIPIGMENT +1F73E ; [*1720.0020.0002] # ALCHEMICAL SYMBOL FOR BISMUTH ORE +1F73F ; [*1721.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR +1F740 ; [*1722.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR-2 +1F741 ; [*1723.0020.0002] # ALCHEMICAL SYMBOL FOR QUICK LIME +1F742 ; [*1724.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX +1F743 ; [*1725.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-2 +1F744 ; [*1726.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-3 +1F745 ; [*1727.0020.0002] # ALCHEMICAL SYMBOL FOR ALUM +1F746 ; [*1728.0020.0002] # ALCHEMICAL SYMBOL FOR OIL +1F747 ; [*1729.0020.0002] # ALCHEMICAL SYMBOL FOR SPIRIT +1F748 ; [*172A.0020.0002] # ALCHEMICAL SYMBOL FOR TINCTURE +1F749 ; [*172B.0020.0002] # ALCHEMICAL SYMBOL FOR GUM +1F74A ; [*172C.0020.0002] # ALCHEMICAL SYMBOL FOR WAX +1F74B ; [*172D.0020.0002] # ALCHEMICAL SYMBOL FOR POWDER +1F74C ; [*172E.0020.0002] # ALCHEMICAL SYMBOL FOR CALX +1F74D ; [*172F.0020.0002] # ALCHEMICAL SYMBOL FOR TUTTY +1F74E ; [*1730.0020.0002] # ALCHEMICAL SYMBOL FOR CAPUT MORTUUM +1F74F ; [*1731.0020.0002] # ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE +1F750 ; [*1732.0020.0002] # ALCHEMICAL SYMBOL FOR CADUCEUS +1F751 ; [*1733.0020.0002] # ALCHEMICAL SYMBOL FOR TRIDENT +1F752 ; [*1734.0020.0002] # ALCHEMICAL SYMBOL FOR STARRED TRIDENT +1F753 ; [*1735.0020.0002] # ALCHEMICAL SYMBOL FOR LODESTONE +1F754 ; [*1736.0020.0002] # ALCHEMICAL SYMBOL FOR SOAP +1F755 ; [*1737.0020.0002] # ALCHEMICAL SYMBOL FOR URINE +1F756 ; [*1738.0020.0002] # ALCHEMICAL SYMBOL FOR HORSE DUNG +1F757 ; [*1739.0020.0002] # ALCHEMICAL SYMBOL FOR ASHES +1F758 ; [*173A.0020.0002] # ALCHEMICAL SYMBOL FOR POT ASHES +1F759 ; [*173B.0020.0002] # ALCHEMICAL SYMBOL FOR BRICK +1F75A ; [*173C.0020.0002] # ALCHEMICAL SYMBOL FOR POWDERED BRICK +1F75B ; [*173D.0020.0002] # ALCHEMICAL SYMBOL FOR AMALGAM +1F75C ; [*173E.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM +1F75D ; [*173F.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 +1F75E ; [*1740.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATION +1F75F ; [*1741.0020.0002] # ALCHEMICAL SYMBOL FOR PRECIPITATE +1F760 ; [*1742.0020.0002] # ALCHEMICAL SYMBOL FOR DISTILL +1F761 ; [*1743.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE +1F762 ; [*1744.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE-2 +1F763 ; [*1745.0020.0002] # ALCHEMICAL SYMBOL FOR PURIFY +1F764 ; [*1746.0020.0002] # ALCHEMICAL SYMBOL FOR PUTREFACTION +1F765 ; [*1747.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE +1F766 ; [*1748.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-2 +1F767 ; [*1749.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-3 +1F768 ; [*174A.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-4 +1F769 ; [*174B.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-5 +1F76A ; [*174C.0020.0002] # ALCHEMICAL SYMBOL FOR ALEMBIC +1F76B ; [*174D.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF MARY +1F76C ; [*174E.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF VAPOURS +1F76D ; [*174F.0020.0002] # ALCHEMICAL SYMBOL FOR RETORT +1F76E ; [*1750.0020.0002] # ALCHEMICAL SYMBOL FOR HOUR +1F76F ; [*1751.0020.0002] # ALCHEMICAL SYMBOL FOR NIGHT +1F770 ; [*1752.0020.0002] # ALCHEMICAL SYMBOL FOR DAY-NIGHT +1F771 ; [*1753.0020.0002] # ALCHEMICAL SYMBOL FOR MONTH +1F772 ; [*1754.0020.0002] # ALCHEMICAL SYMBOL FOR HALF DRAM +1F773 ; [*1755.0020.0002] # ALCHEMICAL SYMBOL FOR HALF OUNCE +1F780 ; [*1756.0020.0002] # BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE +1F781 ; [*1757.0020.0002] # BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE +1F782 ; [*1758.0020.0002] # BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE +1F783 ; [*1759.0020.0002] # BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE +1F784 ; [*175A.0020.0002] # BLACK SLIGHTLY SMALL CIRCLE +1F785 ; [*175B.0020.0002] # MEDIUM BOLD WHITE CIRCLE +1F786 ; [*175C.0020.0002] # BOLD WHITE CIRCLE +1F787 ; [*175D.0020.0002] # HEAVY WHITE CIRCLE +1F788 ; [*175E.0020.0002] # VERY HEAVY WHITE CIRCLE +1F789 ; [*175F.0020.0002] # EXTREMELY HEAVY WHITE CIRCLE +1F78A ; [*1760.0020.0002] # WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE +1F78B ; [*1761.0020.0002] # ROUND TARGET +1F78C ; [*1762.0020.0002] # BLACK TINY SQUARE +1F78D ; [*1763.0020.0002] # BLACK SLIGHTLY SMALL SQUARE +1F78E ; [*1764.0020.0002] # LIGHT WHITE SQUARE +1F78F ; [*1765.0020.0002] # MEDIUM WHITE SQUARE +1F790 ; [*1766.0020.0002] # BOLD WHITE SQUARE +1F791 ; [*1767.0020.0002] # HEAVY WHITE SQUARE +1F792 ; [*1768.0020.0002] # VERY HEAVY WHITE SQUARE +1F793 ; [*1769.0020.0002] # EXTREMELY HEAVY WHITE SQUARE +1F794 ; [*176A.0020.0002] # WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE +1F795 ; [*176B.0020.0002] # WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE +1F796 ; [*176C.0020.0002] # SQUARE TARGET +1F797 ; [*176D.0020.0002] # BLACK TINY DIAMOND +1F798 ; [*176E.0020.0002] # BLACK VERY SMALL DIAMOND +1F799 ; [*176F.0020.0002] # BLACK MEDIUM SMALL DIAMOND +1F79A ; [*1770.0020.0002] # WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND +1F79B ; [*1771.0020.0002] # WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND +1F79C ; [*1772.0020.0002] # DIAMOND TARGET +1F79D ; [*1773.0020.0002] # BLACK TINY LOZENGE +1F79E ; [*1774.0020.0002] # BLACK VERY SMALL LOZENGE +1F79F ; [*1775.0020.0002] # BLACK MEDIUM SMALL LOZENGE +1F7A0 ; [*1776.0020.0002] # WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE +1F7A1 ; [*1777.0020.0002] # THIN GREEK CROSS +1F7A2 ; [*1778.0020.0002] # LIGHT GREEK CROSS +1F7A3 ; [*1779.0020.0002] # MEDIUM GREEK CROSS +1F7A4 ; [*177A.0020.0002] # BOLD GREEK CROSS +1F7A5 ; [*177B.0020.0002] # VERY BOLD GREEK CROSS +1F7A6 ; [*177C.0020.0002] # VERY HEAVY GREEK CROSS +1F7A7 ; [*177D.0020.0002] # EXTREMELY HEAVY GREEK CROSS +1F7A8 ; [*177E.0020.0002] # THIN SALTIRE +1F7A9 ; [*177F.0020.0002] # LIGHT SALTIRE +1F7AA ; [*1780.0020.0002] # MEDIUM SALTIRE +1F7AB ; [*1781.0020.0002] # BOLD SALTIRE +1F7AC ; [*1782.0020.0002] # HEAVY SALTIRE +1F7AD ; [*1783.0020.0002] # VERY HEAVY SALTIRE +1F7AE ; [*1784.0020.0002] # EXTREMELY HEAVY SALTIRE +1F7AF ; [*1785.0020.0002] # LIGHT FIVE SPOKED ASTERISK +1F7B0 ; [*1786.0020.0002] # MEDIUM FIVE SPOKED ASTERISK +1F7B1 ; [*1787.0020.0002] # BOLD FIVE SPOKED ASTERISK +1F7B2 ; [*1788.0020.0002] # HEAVY FIVE SPOKED ASTERISK +1F7B3 ; [*1789.0020.0002] # VERY HEAVY FIVE SPOKED ASTERISK +1F7B4 ; [*178A.0020.0002] # EXTREMELY HEAVY FIVE SPOKED ASTERISK +1F7B5 ; [*178B.0020.0002] # LIGHT SIX SPOKED ASTERISK +1F7B6 ; [*178C.0020.0002] # MEDIUM SIX SPOKED ASTERISK +1F7B7 ; [*178D.0020.0002] # BOLD SIX SPOKED ASTERISK +1F7B8 ; [*178E.0020.0002] # HEAVY SIX SPOKED ASTERISK +1F7B9 ; [*178F.0020.0002] # VERY HEAVY SIX SPOKED ASTERISK +1F7BA ; [*1790.0020.0002] # EXTREMELY HEAVY SIX SPOKED ASTERISK +1F7BB ; [*1791.0020.0002] # LIGHT EIGHT SPOKED ASTERISK +1F7BC ; [*1792.0020.0002] # MEDIUM EIGHT SPOKED ASTERISK +1F7BD ; [*1793.0020.0002] # BOLD EIGHT SPOKED ASTERISK +1F7BE ; [*1794.0020.0002] # HEAVY EIGHT SPOKED ASTERISK +1F7BF ; [*1795.0020.0002] # VERY HEAVY EIGHT SPOKED ASTERISK +1F7C0 ; [*1796.0020.0002] # LIGHT THREE POINTED BLACK STAR +1F7C1 ; [*1797.0020.0002] # MEDIUM THREE POINTED BLACK STAR +1F7C2 ; [*1798.0020.0002] # THREE POINTED BLACK STAR +1F7C3 ; [*1799.0020.0002] # MEDIUM THREE POINTED PINWHEEL STAR +1F7C4 ; [*179A.0020.0002] # LIGHT FOUR POINTED BLACK STAR +1F7C5 ; [*179B.0020.0002] # MEDIUM FOUR POINTED BLACK STAR +1F7C6 ; [*179C.0020.0002] # FOUR POINTED BLACK STAR +1F7C7 ; [*179D.0020.0002] # MEDIUM FOUR POINTED PINWHEEL STAR +1F7C8 ; [*179E.0020.0002] # REVERSE LIGHT FOUR POINTED PINWHEEL STAR +1F7C9 ; [*179F.0020.0002] # LIGHT FIVE POINTED BLACK STAR +1F7CA ; [*17A0.0020.0002] # HEAVY FIVE POINTED BLACK STAR +1F7CB ; [*17A1.0020.0002] # MEDIUM SIX POINTED BLACK STAR +1F7CC ; [*17A2.0020.0002] # HEAVY SIX POINTED BLACK STAR +1F7CD ; [*17A3.0020.0002] # SIX POINTED PINWHEEL STAR +1F7CE ; [*17A4.0020.0002] # MEDIUM EIGHT POINTED BLACK STAR +1F7CF ; [*17A5.0020.0002] # HEAVY EIGHT POINTED BLACK STAR +1F7D0 ; [*17A6.0020.0002] # VERY HEAVY EIGHT POINTED BLACK STAR +1F7D1 ; [*17A7.0020.0002] # HEAVY EIGHT POINTED PINWHEEL STAR +1F7D2 ; [*17A8.0020.0002] # LIGHT TWELVE POINTED BLACK STAR +1F7D3 ; [*17A9.0020.0002] # HEAVY TWELVE POINTED BLACK STAR +1F7D4 ; [*17AA.0020.0002] # HEAVY TWELVE POINTED PINWHEEL STAR +1F800 ; [*17AB.0020.0002] # LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F801 ; [*17AC.0020.0002] # UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F802 ; [*17AD.0020.0002] # RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F803 ; [*17AE.0020.0002] # DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F804 ; [*17AF.0020.0002] # LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F805 ; [*17B0.0020.0002] # UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F806 ; [*17B1.0020.0002] # RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F807 ; [*17B2.0020.0002] # DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F808 ; [*17B3.0020.0002] # LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F809 ; [*17B4.0020.0002] # UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80A ; [*17B5.0020.0002] # RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80B ; [*17B6.0020.0002] # DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810 ; [*17B7.0020.0002] # LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F811 ; [*17B8.0020.0002] # UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F812 ; [*17B9.0020.0002] # RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F813 ; [*17BA.0020.0002] # DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F814 ; [*17BB.0020.0002] # LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F815 ; [*17BC.0020.0002] # UPWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F816 ; [*17BD.0020.0002] # RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F817 ; [*17BE.0020.0002] # DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F818 ; [*17BF.0020.0002] # HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F819 ; [*17C0.0020.0002] # HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81A ; [*17C1.0020.0002] # HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81B ; [*17C2.0020.0002] # HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81C ; [*17C3.0020.0002] # HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81D ; [*17C4.0020.0002] # HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81E ; [*17C5.0020.0002] # HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81F ; [*17C6.0020.0002] # HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F820 ; [*17C7.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F821 ; [*17C8.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F822 ; [*17C9.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F823 ; [*17CA.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F824 ; [*17CB.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F825 ; [*17CC.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F826 ; [*17CD.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F827 ; [*17CE.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F828 ; [*17CF.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F829 ; [*17D0.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82A ; [*17D1.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82B ; [*17D2.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82C ; [*17D3.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82D ; [*17D4.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82E ; [*17D5.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82F ; [*17D6.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F830 ; [*17D7.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F831 ; [*17D8.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F832 ; [*17D9.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F833 ; [*17DA.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F834 ; [*17DB.0020.0002] # LEFTWARDS FINGER-POST ARROW +1F835 ; [*17DC.0020.0002] # UPWARDS FINGER-POST ARROW +1F836 ; [*17DD.0020.0002] # RIGHTWARDS FINGER-POST ARROW +1F837 ; [*17DE.0020.0002] # DOWNWARDS FINGER-POST ARROW +1F838 ; [*17DF.0020.0002] # LEFTWARDS SQUARED ARROW +1F839 ; [*17E0.0020.0002] # UPWARDS SQUARED ARROW +1F83A ; [*17E1.0020.0002] # RIGHTWARDS SQUARED ARROW +1F83B ; [*17E2.0020.0002] # DOWNWARDS SQUARED ARROW +1F83C ; [*17E3.0020.0002] # LEFTWARDS COMPRESSED ARROW +1F83D ; [*17E4.0020.0002] # UPWARDS COMPRESSED ARROW +1F83E ; [*17E5.0020.0002] # RIGHTWARDS COMPRESSED ARROW +1F83F ; [*17E6.0020.0002] # DOWNWARDS COMPRESSED ARROW +1F840 ; [*17E7.0020.0002] # LEFTWARDS HEAVY COMPRESSED ARROW +1F841 ; [*17E8.0020.0002] # UPWARDS HEAVY COMPRESSED ARROW +1F842 ; [*17E9.0020.0002] # RIGHTWARDS HEAVY COMPRESSED ARROW +1F843 ; [*17EA.0020.0002] # DOWNWARDS HEAVY COMPRESSED ARROW +1F844 ; [*17EB.0020.0002] # LEFTWARDS HEAVY ARROW +1F845 ; [*17EC.0020.0002] # UPWARDS HEAVY ARROW +1F846 ; [*17ED.0020.0002] # RIGHTWARDS HEAVY ARROW +1F847 ; [*17EE.0020.0002] # DOWNWARDS HEAVY ARROW +1F850 ; [*17EF.0020.0002] # LEFTWARDS SANS-SERIF ARROW +1F851 ; [*17F0.0020.0002] # UPWARDS SANS-SERIF ARROW +1F852 ; [*17F1.0020.0002] # RIGHTWARDS SANS-SERIF ARROW +1F853 ; [*17F2.0020.0002] # DOWNWARDS SANS-SERIF ARROW +1F854 ; [*17F3.0020.0002] # NORTH WEST SANS-SERIF ARROW +1F855 ; [*17F4.0020.0002] # NORTH EAST SANS-SERIF ARROW +1F856 ; [*17F5.0020.0002] # SOUTH EAST SANS-SERIF ARROW +1F857 ; [*17F6.0020.0002] # SOUTH WEST SANS-SERIF ARROW +1F858 ; [*17F7.0020.0002] # LEFT RIGHT SANS-SERIF ARROW +1F859 ; [*17F8.0020.0002] # UP DOWN SANS-SERIF ARROW +1F860 ; [*17F9.0020.0002] # WIDE-HEADED LEFTWARDS LIGHT BARB ARROW +1F861 ; [*17FA.0020.0002] # WIDE-HEADED UPWARDS LIGHT BARB ARROW +1F862 ; [*17FB.0020.0002] # WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW +1F863 ; [*17FC.0020.0002] # WIDE-HEADED DOWNWARDS LIGHT BARB ARROW +1F864 ; [*17FD.0020.0002] # WIDE-HEADED NORTH WEST LIGHT BARB ARROW +1F865 ; [*17FE.0020.0002] # WIDE-HEADED NORTH EAST LIGHT BARB ARROW +1F866 ; [*17FF.0020.0002] # WIDE-HEADED SOUTH EAST LIGHT BARB ARROW +1F867 ; [*1800.0020.0002] # WIDE-HEADED SOUTH WEST LIGHT BARB ARROW +1F868 ; [*1801.0020.0002] # WIDE-HEADED LEFTWARDS BARB ARROW +1F869 ; [*1802.0020.0002] # WIDE-HEADED UPWARDS BARB ARROW +1F86A ; [*1803.0020.0002] # WIDE-HEADED RIGHTWARDS BARB ARROW +1F86B ; [*1804.0020.0002] # WIDE-HEADED DOWNWARDS BARB ARROW +1F86C ; [*1805.0020.0002] # WIDE-HEADED NORTH WEST BARB ARROW +1F86D ; [*1806.0020.0002] # WIDE-HEADED NORTH EAST BARB ARROW +1F86E ; [*1807.0020.0002] # WIDE-HEADED SOUTH EAST BARB ARROW +1F86F ; [*1808.0020.0002] # WIDE-HEADED SOUTH WEST BARB ARROW +1F870 ; [*1809.0020.0002] # WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW +1F871 ; [*180A.0020.0002] # WIDE-HEADED UPWARDS MEDIUM BARB ARROW +1F872 ; [*180B.0020.0002] # WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW +1F873 ; [*180C.0020.0002] # WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW +1F874 ; [*180D.0020.0002] # WIDE-HEADED NORTH WEST MEDIUM BARB ARROW +1F875 ; [*180E.0020.0002] # WIDE-HEADED NORTH EAST MEDIUM BARB ARROW +1F876 ; [*180F.0020.0002] # WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW +1F877 ; [*1810.0020.0002] # WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW +1F878 ; [*1811.0020.0002] # WIDE-HEADED LEFTWARDS HEAVY BARB ARROW +1F879 ; [*1812.0020.0002] # WIDE-HEADED UPWARDS HEAVY BARB ARROW +1F87A ; [*1813.0020.0002] # WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW +1F87B ; [*1814.0020.0002] # WIDE-HEADED DOWNWARDS HEAVY BARB ARROW +1F87C ; [*1815.0020.0002] # WIDE-HEADED NORTH WEST HEAVY BARB ARROW +1F87D ; [*1816.0020.0002] # WIDE-HEADED NORTH EAST HEAVY BARB ARROW +1F87E ; [*1817.0020.0002] # WIDE-HEADED SOUTH EAST HEAVY BARB ARROW +1F87F ; [*1818.0020.0002] # WIDE-HEADED SOUTH WEST HEAVY BARB ARROW +1F880 ; [*1819.0020.0002] # WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW +1F881 ; [*181A.0020.0002] # WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW +1F882 ; [*181B.0020.0002] # WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW +1F883 ; [*181C.0020.0002] # WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW +1F884 ; [*181D.0020.0002] # WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW +1F885 ; [*181E.0020.0002] # WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW +1F886 ; [*181F.0020.0002] # WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW +1F887 ; [*1820.0020.0002] # WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890 ; [*1821.0020.0002] # LEFTWARDS TRIANGLE ARROWHEAD +1F891 ; [*1822.0020.0002] # UPWARDS TRIANGLE ARROWHEAD +1F892 ; [*1823.0020.0002] # RIGHTWARDS TRIANGLE ARROWHEAD +1F893 ; [*1824.0020.0002] # DOWNWARDS TRIANGLE ARROWHEAD +1F894 ; [*1825.0020.0002] # LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F895 ; [*1826.0020.0002] # UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F896 ; [*1827.0020.0002] # RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F897 ; [*1828.0020.0002] # DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F898 ; [*1829.0020.0002] # LEFTWARDS ARROW WITH NOTCHED TAIL +1F899 ; [*182A.0020.0002] # UPWARDS ARROW WITH NOTCHED TAIL +1F89A ; [*182B.0020.0002] # RIGHTWARDS ARROW WITH NOTCHED TAIL +1F89B ; [*182C.0020.0002] # DOWNWARDS ARROW WITH NOTCHED TAIL +1F89C ; [*182D.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE +1F89D ; [*182E.0020.0002] # HEAVY ARROW SHAFT WIDTH TWO THIRDS +1F89E ; [*182F.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE HALF +1F89F ; [*1830.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE THIRD +1F8A0 ; [*1831.0020.0002] # LEFTWARDS BOTTOM-SHADED WHITE ARROW +1F8A1 ; [*1832.0020.0002] # RIGHTWARDS BOTTOM SHADED WHITE ARROW +1F8A2 ; [*1833.0020.0002] # LEFTWARDS TOP SHADED WHITE ARROW +1F8A3 ; [*1834.0020.0002] # RIGHTWARDS TOP SHADED WHITE ARROW +1F8A4 ; [*1835.0020.0002] # LEFTWARDS LEFT-SHADED WHITE ARROW +1F8A5 ; [*1836.0020.0002] # RIGHTWARDS RIGHT-SHADED WHITE ARROW +1F8A6 ; [*1837.0020.0002] # LEFTWARDS RIGHT-SHADED WHITE ARROW +1F8A7 ; [*1838.0020.0002] # RIGHTWARDS LEFT-SHADED WHITE ARROW +1F8A8 ; [*1839.0020.0002] # LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW +1F8A9 ; [*183A.0020.0002] # RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW +1F8AA ; [*183B.0020.0002] # LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW +1F8AB ; [*183C.0020.0002] # RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW +1F8AC ; [*183D.0020.0002] # WHITE ARROW SHAFT WIDTH ONE +1F8AD ; [*183E.0020.0002] # WHITE ARROW SHAFT WIDTH TWO THIRDS +1F910 ; [*15A9.0020.0002] # ZIPPER-MOUTH FACE +1F911 ; [*15AA.0020.0002] # MONEY-MOUTH FACE +1F912 ; [*15AB.0020.0002] # FACE WITH THERMOMETER +1F913 ; [*15AC.0020.0002] # NERD FACE +1F914 ; [*15AD.0020.0002] # THINKING FACE +1F915 ; [*15AE.0020.0002] # FACE WITH HEAD-BANDAGE +1F916 ; [*15AF.0020.0002] # ROBOT FACE +1F917 ; [*15B0.0020.0002] # HUGGING FACE +1F918 ; [*15B1.0020.0002] # SIGN OF THE HORNS +1F919 ; [*15B2.0020.0002] # CALL ME HAND +1F91A ; [*15B3.0020.0002] # RAISED BACK OF HAND +1F91B ; [*15B4.0020.0002] # LEFT-FACING FIST +1F91C ; [*15B5.0020.0002] # RIGHT-FACING FIST +1F91D ; [*15B6.0020.0002] # HANDSHAKE +1F91E ; [*15B7.0020.0002] # HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F920 ; [*15B8.0020.0002] # FACE WITH COWBOY HAT +1F921 ; [*15B9.0020.0002] # CLOWN FACE +1F922 ; [*15BA.0020.0002] # NAUSEATED FACE +1F923 ; [*15BB.0020.0002] # ROLLING ON THE FLOOR LAUGHING +1F924 ; [*15BC.0020.0002] # DROOLING FACE +1F925 ; [*15BD.0020.0002] # LYING FACE +1F926 ; [*15BE.0020.0002] # FACE PALM +1F927 ; [*15BF.0020.0002] # SNEEZING FACE +1F930 ; [*15C0.0020.0002] # PREGNANT WOMAN +1F933 ; [*15C1.0020.0002] # SELFIE +1F934 ; [*15C2.0020.0002] # PRINCE +1F935 ; [*15C3.0020.0002] # MAN IN TUXEDO +1F936 ; [*15C4.0020.0002] # MOTHER CHRISTMAS +1F937 ; [*15C5.0020.0002] # SHRUG +1F938 ; [*15C6.0020.0002] # PERSON DOING CARTWHEEL +1F939 ; [*15C7.0020.0002] # JUGGLING +1F93A ; [*15C8.0020.0002] # FENCER +1F93B ; [*15C9.0020.0002] # MODERN PENTATHLON +1F93C ; [*15CA.0020.0002] # WRESTLERS +1F93D ; [*15CB.0020.0002] # WATER POLO +1F93E ; [*15CC.0020.0002] # HANDBALL +1F940 ; [*15CD.0020.0002] # WILTED FLOWER +1F941 ; [*15CE.0020.0002] # DRUM WITH DRUMSTICKS +1F942 ; [*15CF.0020.0002] # CLINKING GLASSES +1F943 ; [*15D0.0020.0002] # TUMBLER GLASS +1F944 ; [*15D1.0020.0002] # SPOON +1F945 ; [*15D2.0020.0002] # GOAL NET +1F946 ; [*15D3.0020.0002] # RIFLE +1F947 ; [*15D4.0020.0002] # FIRST PLACE MEDAL +1F948 ; [*15D5.0020.0002] # SECOND PLACE MEDAL +1F949 ; [*15D6.0020.0002] # THIRD PLACE MEDAL +1F94A ; [*15D7.0020.0002] # BOXING GLOVE +1F94B ; [*15D8.0020.0002] # MARTIAL ARTS UNIFORM +1F950 ; [*15D9.0020.0002] # CROISSANT +1F951 ; [*15DA.0020.0002] # AVOCADO +1F952 ; [*15DB.0020.0002] # CUCUMBER +1F953 ; [*15DC.0020.0002] # BACON +1F954 ; [*15DD.0020.0002] # POTATO +1F955 ; [*15DE.0020.0002] # CARROT +1F956 ; [*15DF.0020.0002] # BAGUETTE BREAD +1F957 ; [*15E0.0020.0002] # GREEN SALAD +1F958 ; [*15E1.0020.0002] # SHALLOW PAN OF FOOD +1F959 ; [*15E2.0020.0002] # STUFFED FLATBREAD +1F95A ; [*15E3.0020.0002] # EGG +1F95B ; [*15E4.0020.0002] # GLASS OF MILK +1F95C ; [*15E5.0020.0002] # PEANUTS +1F95D ; [*15E6.0020.0002] # KIWIFRUIT +1F95E ; [*15E7.0020.0002] # PANCAKES +1F980 ; [*15E8.0020.0002] # CRAB +1F981 ; [*15E9.0020.0002] # LION FACE +1F982 ; [*15EA.0020.0002] # SCORPION +1F983 ; [*15EB.0020.0002] # TURKEY +1F984 ; [*15EC.0020.0002] # UNICORN FACE +1F985 ; [*15ED.0020.0002] # EAGLE +1F986 ; [*15EE.0020.0002] # DUCK +1F987 ; [*15EF.0020.0002] # BAT +1F988 ; [*15F0.0020.0002] # SHARK +1F989 ; [*15F1.0020.0002] # OWL +1F98A ; [*15F2.0020.0002] # FOX FACE +1F98B ; [*15F3.0020.0002] # BUTTERFLY +1F98C ; [*15F4.0020.0002] # DEER +1F98D ; [*15F5.0020.0002] # GORILLA +1F98E ; [*15F6.0020.0002] # LIZARD +1F98F ; [*15F7.0020.0002] # RHINOCEROS +1F990 ; [*15F8.0020.0002] # SHRIMP +1F991 ; [*15F9.0020.0002] # SQUID +1F9C0 ; [*15FA.0020.0002] # CHEESE WEDGE 0332 ; [.0000.0021.0002] # COMBINING LOW LINE 0313 ; [.0000.0022.0002] # COMBINING COMMA ABOVE 0343 ; [.0000.0022.0002] # COMBINING GREEK KORONIS @@ -7684,6 +7832,7 @@ FFFC ; [*1A25.0020.0002] # OBJECT REPLACEMENT CHARACTER 1DCE ; [.0000.0033.0002] # COMBINING OGONEK ABOVE 1DD1 ; [.0000.0033.0002] # COMBINING UR ABOVE 1DF5 ; [.0000.0033.0002] # COMBINING UP TACK ABOVE +1DFB ; [.0000.0033.0002] # COMBINING DELETION MARK 1DFE ; [.0000.0033.0002] # COMBINING LEFT ARROWHEAD ABOVE 20F0 ; [.0000.0033.0002] # COMBINING ASTERISK ABOVE 2CEF ; [.0000.0033.0002] # COPTIC COMBINING NI ABOVE @@ -7879,6 +8028,7 @@ FE7D ; [.0000.0080.0018] # ARABIC SHADDA MEDIAL FORM FE7C ; [.0000.0080.001A] # ARABIC SHADDA ISOLATED FORM FC63 ; [.0000.0080.001A][.0000.0098.001A] # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM 0652 ; [.0000.0081.0002] # ARABIC SUKUN +1123E ; [.0000.0081.0002] # KHOJKI SIGN SUKUN FE7F ; [.0000.0081.0018] # ARABIC SUKUN MEDIAL FORM FE7E ; [.0000.0081.001A] # ARABIC SUKUN ISOLATED FORM 0653 ; [.0000.0082.0002] # ARABIC MADDAH ABOVE @@ -7940,20642 +8090,21112 @@ A6F1 ; [.0000.00B7.0002] # BAMUM COMBINING MARK TUKWENTIS 16AF2 ; [.0000.00BA.0002] # BASSA VAH COMBINING MID TONE 16AF3 ; [.0000.00BB.0002] # BASSA VAH COMBINING LOW-MID TONE 16AF4 ; [.0000.00BC.0002] # BASSA VAH COMBINING HIGH-LOW TONE -093C ; [.0000.00BD.0002] # DEVANAGARI SIGN NUKTA -09BC ; [.0000.00BD.0002] # BENGALI SIGN NUKTA -0A3C ; [.0000.00BD.0002] # GURMUKHI SIGN NUKTA -0ABC ; [.0000.00BD.0002] # GUJARATI SIGN NUKTA -0B3C ; [.0000.00BD.0002] # ORIYA SIGN NUKTA -0CBC ; [.0000.00BD.0002] # KANNADA SIGN NUKTA -1B34 ; [.0000.00BD.0002] # BALINESE SIGN REREKAN -1BE6 ; [.0000.00BD.0002] # BATAK SIGN TOMPI -1C37 ; [.0000.00BD.0002] # LEPCHA SIGN NUKTA -A9B3 ; [.0000.00BD.0002] # JAVANESE SIGN CECAK TELU -110BA ; [.0000.00BD.0002] # KAITHI SIGN NUKTA -11173 ; [.0000.00BD.0002] # MAHAJANI SIGN NUKTA -111CA ; [.0000.00BD.0002] # SHARADA SIGN NUKTA -11236 ; [.0000.00BD.0002] # KHOJKI SIGN NUKTA -112E9 ; [.0000.00BD.0002] # KHUDAWADI SIGN NUKTA -1133C ; [.0000.00BD.0002] # GRANTHA SIGN NUKTA -114C3 ; [.0000.00BD.0002] # TIRHUTA SIGN NUKTA -115C0 ; [.0000.00BD.0002] # SIDDHAM SIGN NUKTA -116B7 ; [.0000.00BD.0002] # TAKRI SIGN NUKTA -0900 ; [.0000.00BE.0002] # DEVANAGARI SIGN INVERTED CANDRABINDU -0901 ; [.0000.00BE.0002] # DEVANAGARI SIGN CANDRABINDU -0981 ; [.0000.00BE.0002] # BENGALI SIGN CANDRABINDU -0A01 ; [.0000.00BE.0002] # GURMUKHI SIGN ADAK BINDI -0A81 ; [.0000.00BE.0002] # GUJARATI SIGN CANDRABINDU -0B01 ; [.0000.00BE.0002] # ORIYA SIGN CANDRABINDU -0C00 ; [.0000.00BE.0002] # TELUGU SIGN COMBINING CANDRABINDU ABOVE -0C01 ; [.0000.00BE.0002] # TELUGU SIGN CANDRABINDU -0C81 ; [.0000.00BE.0002] # KANNADA SIGN CANDRABINDU -0D01 ; [.0000.00BE.0002] # MALAYALAM SIGN CANDRABINDU -1B00 ; [.0000.00BE.0002] # BALINESE SIGN ULU RICEM -1B01 ; [.0000.00BE.0002] # BALINESE SIGN ULU CANDRA -A980 ; [.0000.00BE.0002] # JAVANESE SIGN PANYANGGA -11000 ; [.0000.00BE.0002] # BRAHMI SIGN CANDRABINDU -11080 ; [.0000.00BE.0002] # KAITHI SIGN CANDRABINDU -11100 ; [.0000.00BE.0002] # CHAKMA SIGN CANDRABINDU -11180 ; [.0000.00BE.0002] # SHARADA SIGN CANDRABINDU -11301 ; [.0000.00BE.0002] # GRANTHA SIGN CANDRABINDU -114BF ; [.0000.00BE.0002] # TIRHUTA SIGN CANDRABINDU -115BC ; [.0000.00BE.0002] # SIDDHAM SIGN CANDRABINDU -11640 ; [.0000.00BE.0002] # MODI SIGN ARDHACANDRA -0902 ; [.0000.00BF.0002] # DEVANAGARI SIGN ANUSVARA -0982 ; [.0000.00BF.0002] # BENGALI SIGN ANUSVARA -0A02 ; [.0000.00BF.0002] # GURMUKHI SIGN BINDI -0A82 ; [.0000.00BF.0002] # GUJARATI SIGN ANUSVARA -0B02 ; [.0000.00BF.0002] # ORIYA SIGN ANUSVARA -0B82 ; [.0000.00BF.0002] # TAMIL SIGN ANUSVARA -0C02 ; [.0000.00BF.0002] # TELUGU SIGN ANUSVARA -0C82 ; [.0000.00BF.0002] # KANNADA SIGN ANUSVARA -0D02 ; [.0000.00BF.0002] # MALAYALAM SIGN ANUSVARA -0D82 ; [.0000.00BF.0002] # SINHALA SIGN ANUSVARAYA -0F7E ; [.0000.00BF.0002] # TIBETAN SIGN RJES SU NGA RO -1036 ; [.0000.00BF.0002] # MYANMAR SIGN ANUSVARA -17C6 ; [.0000.00BF.0002] # KHMER SIGN NIKAHIT -1A74 ; [.0000.00BF.0002] # TAI THAM SIGN MAI KANG -1B02 ; [.0000.00BF.0002] # BALINESE SIGN CECEK -1B80 ; [.0000.00BF.0002] # SUNDANESE SIGN PANYECEK -1CED ; [.0000.00BF.0002] # VEDIC SIGN TIRYAK -A80B ; [.0000.00BF.0002] # SYLOTI NAGRI SIGN ANUSVARA -A880 ; [.0000.00BF.0002] # SAURASHTRA SIGN ANUSVARA -A981 ; [.0000.00BF.0002] # JAVANESE SIGN CECAK -10A0E ; [.0000.00BF.0002] # KHAROSHTHI SIGN ANUSVARA -11001 ; [.0000.00BF.0002] # BRAHMI SIGN ANUSVARA -11081 ; [.0000.00BF.0002] # KAITHI SIGN ANUSVARA -11101 ; [.0000.00BF.0002] # CHAKMA SIGN ANUSVARA -11181 ; [.0000.00BF.0002] # SHARADA SIGN ANUSVARA -11234 ; [.0000.00BF.0002] # KHOJKI SIGN ANUSVARA -112DF ; [.0000.00BF.0002] # KHUDAWADI SIGN ANUSVARA -11300 ; [.0000.00BF.0002] # GRANTHA SIGN COMBINING ANUSVARA ABOVE -11302 ; [.0000.00BF.0002] # GRANTHA SIGN ANUSVARA -114C0 ; [.0000.00BF.0002] # TIRHUTA SIGN ANUSVARA -115BD ; [.0000.00BF.0002] # SIDDHAM SIGN ANUSVARA -1163D ; [.0000.00BF.0002] # MODI SIGN ANUSVARA -116AB ; [.0000.00BF.0002] # TAKRI SIGN ANUSVARA -0903 ; [.0000.00C0.0002] # DEVANAGARI SIGN VISARGA -0983 ; [.0000.00C0.0002] # BENGALI SIGN VISARGA -0A03 ; [.0000.00C0.0002] # GURMUKHI SIGN VISARGA -0A83 ; [.0000.00C0.0002] # GUJARATI SIGN VISARGA -0B03 ; [.0000.00C0.0002] # ORIYA SIGN VISARGA -0C03 ; [.0000.00C0.0002] # TELUGU SIGN VISARGA -0C83 ; [.0000.00C0.0002] # KANNADA SIGN VISARGA -0D03 ; [.0000.00C0.0002] # MALAYALAM SIGN VISARGA -0D83 ; [.0000.00C0.0002] # SINHALA SIGN VISARGAYA -0F7F ; [.0000.00C0.0002] # TIBETAN SIGN RNAM BCAD -1038 ; [.0000.00C0.0002] # MYANMAR SIGN VISARGA -17C7 ; [.0000.00C0.0002] # KHMER SIGN REAHMUK -1B04 ; [.0000.00C0.0002] # BALINESE SIGN BISAH -1B82 ; [.0000.00C0.0002] # SUNDANESE SIGN PANGWISAD -1CF2 ; [.0000.00C0.0002] # VEDIC SIGN ARDHAVISARGA -1CF3 ; [.0000.00C0.0002] # VEDIC SIGN ROTATED ARDHAVISARGA -A881 ; [.0000.00C0.0002] # SAURASHTRA SIGN VISARGA -A983 ; [.0000.00C0.0002] # JAVANESE SIGN WIGNYAN -10A0F ; [.0000.00C0.0002] # KHAROSHTHI SIGN VISARGA -11002 ; [.0000.00C0.0002] # BRAHMI SIGN VISARGA -11082 ; [.0000.00C0.0002] # KAITHI SIGN VISARGA -11102 ; [.0000.00C0.0002] # CHAKMA SIGN VISARGA -11182 ; [.0000.00C0.0002] # SHARADA SIGN VISARGA -11303 ; [.0000.00C0.0002] # GRANTHA SIGN VISARGA -114C1 ; [.0000.00C0.0002] # TIRHUTA SIGN VISARGA -115BE ; [.0000.00C0.0002] # SIDDHAM SIGN VISARGA -1163E ; [.0000.00C0.0002] # MODI SIGN VISARGA -116AC ; [.0000.00C0.0002] # TAKRI SIGN VISARGA -0A70 ; [.0000.00C1.0002] # GURMUKHI TIPPI -0A71 ; [.0000.00C2.0002] # GURMUKHI ADDAK -1B03 ; [.0000.00C3.0002] # BALINESE SIGN SURANG -A982 ; [.0000.00C4.0002] # JAVANESE SIGN LAYAR -1B81 ; [.0000.00C5.0002] # SUNDANESE SIGN PANGLAYAR -ABEC ; [.0000.00C6.0002] # MEETEI MAYEK LUM IYEK -10A38 ; [.0000.00C7.0002] # KHAROSHTHI SIGN BAR ABOVE -10A39 ; [.0000.00C8.0002] # KHAROSHTHI SIGN CAUDA -10A3A ; [.0000.00C9.0002] # KHAROSHTHI SIGN DOT BELOW -111CB ; [.0000.00CA.0002] # SHARADA VOWEL MODIFIER MARK -111CC ; [.0000.00CB.0002] # SHARADA EXTRA SHORT VOWEL MARK -0E4E ; [.0000.00CC.0002] # THAI CHARACTER YAMAKKAN -0E47 ; [.0000.00CD.0002] # THAI CHARACTER MAITAIKHU -0E48 ; [.0000.00CE.0002] # THAI CHARACTER MAI EK -0E49 ; [.0000.00CF.0002] # THAI CHARACTER MAI THO -0E4A ; [.0000.00D0.0002] # THAI CHARACTER MAI TRI -0E4B ; [.0000.00D1.0002] # THAI CHARACTER MAI CHATTAWA -0E4C ; [.0000.00D2.0002] # THAI CHARACTER THANTHAKHAT -0E4D ; [.0000.00D3.0002] # THAI CHARACTER NIKHAHIT -0EC8 ; [.0000.00D4.0002] # LAO TONE MAI EK -0EC9 ; [.0000.00D5.0002] # LAO TONE MAI THO -0ECA ; [.0000.00D6.0002] # LAO TONE MAI TI -0ECB ; [.0000.00D7.0002] # LAO TONE MAI CATAWA -0ECC ; [.0000.00D8.0002] # LAO CANCELLATION MARK -0ECD ; [.0000.00D9.0002] # LAO NIGGAHITA -AABF ; [.0000.00DA.0002] # TAI VIET TONE MAI EK -AAC1 ; [.0000.00DB.0002] # TAI VIET TONE MAI THO -0F39 ; [.0000.00DC.0002] # TIBETAN MARK TSA -PHRU -A92B ; [.0000.00DD.0002] # KAYAH LI TONE PLOPHU -A92C ; [.0000.00DE.0002] # KAYAH LI TONE CALYA -A92D ; [.0000.00DF.0002] # KAYAH LI TONE CALYA PLOPHU -1037 ; [.0000.00E0.0002] # MYANMAR SIGN DOT BELOW -17C8 ; [.0000.00E1.0002] # KHMER SIGN YUUKALEAPINTU -17C9 ; [.0000.00E2.0002] # KHMER SIGN MUUSIKATOAN -17CA ; [.0000.00E3.0002] # KHMER SIGN TRIISAP -1A75 ; [.0000.00E4.0002] # TAI THAM SIGN TONE-1 -1A76 ; [.0000.00E5.0002] # TAI THAM SIGN TONE-2 -1A77 ; [.0000.00E6.0002] # TAI THAM SIGN KHUEN TONE-3 -1A78 ; [.0000.00E7.0002] # TAI THAM SIGN KHUEN TONE-4 -1A79 ; [.0000.00E8.0002] # TAI THAM SIGN KHUEN TONE-5 -1A7A ; [.0000.00E9.0002] # TAI THAM SIGN RA HAAM -1A7B ; [.0000.00EA.0002] # TAI THAM SIGN MAI SAM -1A7C ; [.0000.00EB.0002] # TAI THAM SIGN KHUEN-LUE KARAN -1939 ; [.0000.00EC.0002] # LIMBU SIGN MUKPHRENG -193A ; [.0000.00ED.0002] # LIMBU SIGN KEMPHRENG -193B ; [.0000.00EE.0002] # LIMBU SIGN SA-I -16B30 ; [.0000.00EF.0002] # PAHAWH HMONG MARK CIM TUB -16B31 ; [.0000.00F0.0002] # PAHAWH HMONG MARK CIM SO -16B32 ; [.0000.00F1.0002] # PAHAWH HMONG MARK CIM KES -16B33 ; [.0000.00F2.0002] # PAHAWH HMONG MARK CIM KHAV -16B34 ; [.0000.00F3.0002] # PAHAWH HMONG MARK CIM SUAM -16B35 ; [.0000.00F4.0002] # PAHAWH HMONG MARK CIM HOM -16B36 ; [.0000.00F5.0002] # PAHAWH HMONG MARK CIM TAUM -302A ; [.0000.00F6.0002] # IDEOGRAPHIC LEVEL TONE MARK -302B ; [.0000.00F7.0002] # IDEOGRAPHIC RISING TONE MARK -302C ; [.0000.00F8.0002] # IDEOGRAPHIC DEPARTING TONE MARK -302D ; [.0000.00F9.0002] # IDEOGRAPHIC ENTERING TONE MARK -302E ; [.0000.00FA.0002] # HANGUL SINGLE DOT TONE MARK -302F ; [.0000.00FB.0002] # HANGUL DOUBLE DOT TONE MARK -20D0 ; [.0000.00FC.0002] # COMBINING LEFT HARPOON ABOVE -20D1 ; [.0000.00FD.0002] # COMBINING RIGHT HARPOON ABOVE -20D2 ; [.0000.00FE.0002] # COMBINING LONG VERTICAL LINE OVERLAY -20D3 ; [.0000.00FE.0002] # COMBINING SHORT VERTICAL LINE OVERLAY -20D4 ; [.0000.00FF.0002] # COMBINING ANTICLOCKWISE ARROW ABOVE -20D5 ; [.0000.0100.0002] # COMBINING CLOCKWISE ARROW ABOVE -20D6 ; [.0000.0101.0002] # COMBINING LEFT ARROW ABOVE -20D7 ; [.0000.0102.0002] # COMBINING RIGHT ARROW ABOVE -20DB ; [.0000.0103.0002] # COMBINING THREE DOTS ABOVE -20DC ; [.0000.0104.0002] # COMBINING FOUR DOTS ABOVE -20E1 ; [.0000.0105.0002] # COMBINING LEFT RIGHT ARROW ABOVE -20E6 ; [.0000.0106.0002] # COMBINING DOUBLE VERTICAL STROKE OVERLAY -20E7 ; [.0000.0107.0002] # COMBINING ANNUITY SYMBOL -20E8 ; [.0000.0108.0002] # COMBINING TRIPLE UNDERDOT -20E9 ; [.0000.0109.0002] # COMBINING WIDE BRIDGE ABOVE -101FD ; [.0000.010A.0002] # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -02D0 ; [.1B74.0020.0002] # MODIFIER LETTER TRIANGULAR COLON -02D1 ; [.1B75.0020.0002] # MODIFIER LETTER HALF TRIANGULAR COLON -0971 ; [.1B76.0020.0002] # DEVANAGARI SIGN HIGH SPACING DOT -0E46 ; [.1B77.0020.0002] # THAI CHARACTER MAIYAMOK -0EC6 ; [.1B78.0020.0002] # LAO KO LA -17D7 ; [.1B79.0020.0002] # KHMER SIGN LEK TOO -1AA7 ; [.1B7A.0020.0002] # TAI THAM SIGN MAI YAMOK -A9CF ; [.1B7B.0020.0002] # JAVANESE PANGRANGKEP -A9E6 ; [.1B7C.0020.0002] # MYANMAR MODIFIER LETTER SHAN REDUPLICATION -AA70 ; [.1B7D.0020.0002] # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION -AADD ; [.1B7E.0020.0002] # TAI VIET SYMBOL SAM -AAF3 ; [.1B7F.0020.0002] # MEETEI MAYEK SYLLABLE REPETITION MARK -AAF4 ; [.1B80.0020.0002] # MEETEI MAYEK WORD REPETITION MARK -16B42 ; [.1B81.0020.0002] # PAHAWH HMONG SIGN VOS NRUA -16B43 ; [.1B82.0020.0002] # PAHAWH HMONG SIGN IB YAM -3005 ; [.1B83.0020.0002] # IDEOGRAPHIC ITERATION MARK -303B ; [.1B84.0020.0002] # VERTICAL IDEOGRAPHIC ITERATION MARK -3031 ; [.1B85.0020.0002] # VERTICAL KANA REPEAT MARK -3032 ; [.1B85.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK -3033 ; [.1B86.0020.0002] # VERTICAL KANA REPEAT MARK UPPER HALF -3034 ; [.1B86.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF -3035 ; [.1B87.0020.0002] # VERTICAL KANA REPEAT MARK LOWER HALF -309D ; [.1B88.0020.0002] # HIRAGANA ITERATION MARK -309E ; [.1B88.0020.0002][.0000.0037.0002] # HIRAGANA VOICED ITERATION MARK -30FC ; [.1B89.0020.0002] # KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF70 ; [.1B89.0020.0012] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -30FD ; [.1B8A.0020.0002] # KATAKANA ITERATION MARK -30FE ; [.1B8A.0020.0002][.0000.0037.0002] # KATAKANA VOICED ITERATION MARK -00A4 ; [.1B8B.0020.0002] # CURRENCY SIGN -00A2 ; [.1B8C.0020.0002] # CENT SIGN -FFE0 ; [.1B8C.0020.0003] # FULLWIDTH CENT SIGN -0024 ; [.1B8D.0020.0002] # DOLLAR SIGN -FF04 ; [.1B8D.0020.0003] # FULLWIDTH DOLLAR SIGN -FE69 ; [.1B8D.0020.000F] # SMALL DOLLAR SIGN -00A3 ; [.1B8E.0020.0002] # POUND SIGN -FFE1 ; [.1B8E.0020.0003] # FULLWIDTH POUND SIGN -00A5 ; [.1B8F.0020.0002] # YEN SIGN -FFE5 ; [.1B8F.0020.0003] # FULLWIDTH YEN SIGN -058F ; [.1B90.0020.0002] # ARMENIAN DRAM SIGN -060B ; [.1B91.0020.0002] # AFGHANI SIGN -09F2 ; [.1B92.0020.0002] # BENGALI RUPEE MARK -09F3 ; [.1B93.0020.0002] # BENGALI RUPEE SIGN -09FB ; [.1B94.0020.0002] # BENGALI GANDA MARK -0AF1 ; [.1B95.0020.0002] # GUJARATI RUPEE SIGN -A838 ; [.1B96.0020.0002] # NORTH INDIC RUPEE MARK -0BF9 ; [.1B97.0020.0002] # TAMIL RUPEE SIGN -0E3F ; [.1B98.0020.0002] # THAI CURRENCY SYMBOL BAHT -17DB ; [.1B99.0020.0002] # KHMER CURRENCY SYMBOL RIEL -20A0 ; [.1B9A.0020.0002] # EURO-CURRENCY SIGN -20A1 ; [.1B9B.0020.0002] # COLON SIGN -20A2 ; [.1B9C.0020.0002] # CRUZEIRO SIGN -20A3 ; [.1B9D.0020.0002] # FRENCH FRANC SIGN -20A4 ; [.1B9E.0020.0002] # LIRA SIGN -20A5 ; [.1B9F.0020.0002] # MILL SIGN -20A6 ; [.1BA0.0020.0002] # NAIRA SIGN -20A7 ; [.1BA1.0020.0002] # PESETA SIGN -20A9 ; [.1BA2.0020.0002] # WON SIGN -FFE6 ; [.1BA2.0020.0003] # FULLWIDTH WON SIGN -20AA ; [.1BA3.0020.0002] # NEW SHEQEL SIGN -20AB ; [.1BA4.0020.0002] # DONG SIGN -20AC ; [.1BA5.0020.0002] # EURO SIGN -20AD ; [.1BA6.0020.0002] # KIP SIGN -20AE ; [.1BA7.0020.0002] # TUGRIK SIGN -20AF ; [.1BA8.0020.0002] # DRACHMA SIGN -20B0 ; [.1BA9.0020.0002] # GERMAN PENNY SIGN -20B1 ; [.1BAA.0020.0002] # PESO SIGN -20B2 ; [.1BAB.0020.0002] # GUARANI SIGN -20B3 ; [.1BAC.0020.0002] # AUSTRAL SIGN -20B4 ; [.1BAD.0020.0002] # HRYVNIA SIGN -20B5 ; [.1BAE.0020.0002] # CEDI SIGN -20B6 ; [.1BAF.0020.0002] # LIVRE TOURNOIS SIGN -20B7 ; [.1BB0.0020.0002] # SPESMILO SIGN -20B8 ; [.1BB1.0020.0002] # TENGE SIGN -20B9 ; [.1BB2.0020.0002] # INDIAN RUPEE SIGN -20BA ; [.1BB3.0020.0002] # TURKISH LIRA SIGN -20BB ; [.1BB4.0020.0002] # NORDIC MARK SIGN -20BC ; [.1BB5.0020.0002] # MANAT SIGN -20BD ; [.1BB6.0020.0002] # RUBLE SIGN -20BE ; [.1BB7.0020.0002] # LARI SIGN -0030 ; [.1BB8.0020.0002] # DIGIT ZERO -0660 ; [.1BB8.0020.0002] # ARABIC-INDIC DIGIT ZERO -06F0 ; [.1BB8.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ZERO -07C0 ; [.1BB8.0020.0002] # NKO DIGIT ZERO -0966 ; [.1BB8.0020.0002] # DEVANAGARI DIGIT ZERO -09E6 ; [.1BB8.0020.0002] # BENGALI DIGIT ZERO -0A66 ; [.1BB8.0020.0002] # GURMUKHI DIGIT ZERO -0AE6 ; [.1BB8.0020.0002] # GUJARATI DIGIT ZERO -0B66 ; [.1BB8.0020.0002] # ORIYA DIGIT ZERO -0BE6 ; [.1BB8.0020.0002] # TAMIL DIGIT ZERO -0C66 ; [.1BB8.0020.0002] # TELUGU DIGIT ZERO -0C78 ; [.1BB8.0020.0002] # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR -0CE6 ; [.1BB8.0020.0002] # KANNADA DIGIT ZERO -0D66 ; [.1BB8.0020.0002] # MALAYALAM DIGIT ZERO -0DE6 ; [.1BB8.0020.0002] # SINHALA LITH DIGIT ZERO -0E50 ; [.1BB8.0020.0002] # THAI DIGIT ZERO -0ED0 ; [.1BB8.0020.0002] # LAO DIGIT ZERO -0F20 ; [.1BB8.0020.0002] # TIBETAN DIGIT ZERO -1040 ; [.1BB8.0020.0002] # MYANMAR DIGIT ZERO -1090 ; [.1BB8.0020.0002] # MYANMAR SHAN DIGIT ZERO -17E0 ; [.1BB8.0020.0002] # KHMER DIGIT ZERO -17F0 ; [.1BB8.0020.0002] # KHMER SYMBOL LEK ATTAK SON -1810 ; [.1BB8.0020.0002] # MONGOLIAN DIGIT ZERO -1946 ; [.1BB8.0020.0002] # LIMBU DIGIT ZERO -19D0 ; [.1BB8.0020.0002] # NEW TAI LUE DIGIT ZERO -1A80 ; [.1BB8.0020.0002] # TAI THAM HORA DIGIT ZERO -1A90 ; [.1BB8.0020.0002] # TAI THAM THAM DIGIT ZERO -1B50 ; [.1BB8.0020.0002] # BALINESE DIGIT ZERO -1BB0 ; [.1BB8.0020.0002] # SUNDANESE DIGIT ZERO -1C40 ; [.1BB8.0020.0002] # LEPCHA DIGIT ZERO -1C50 ; [.1BB8.0020.0002] # OL CHIKI DIGIT ZERO -3007 ; [.1BB8.0020.0002] # IDEOGRAPHIC NUMBER ZERO -A620 ; [.1BB8.0020.0002] # VAI DIGIT ZERO -A8D0 ; [.1BB8.0020.0002] # SAURASHTRA DIGIT ZERO -A900 ; [.1BB8.0020.0002] # KAYAH LI DIGIT ZERO -A9D0 ; [.1BB8.0020.0002] # JAVANESE DIGIT ZERO -A9F0 ; [.1BB8.0020.0002] # MYANMAR TAI LAING DIGIT ZERO -AA50 ; [.1BB8.0020.0002] # CHAM DIGIT ZERO -ABF0 ; [.1BB8.0020.0002] # MEETEI MAYEK DIGIT ZERO -1018A ; [.1BB8.0020.0002] # GREEK ZERO SIGN -104A0 ; [.1BB8.0020.0002] # OSMANYA DIGIT ZERO -11066 ; [.1BB8.0020.0002] # BRAHMI DIGIT ZERO -110F0 ; [.1BB8.0020.0002] # SORA SOMPENG DIGIT ZERO -11136 ; [.1BB8.0020.0002] # CHAKMA DIGIT ZERO -111D0 ; [.1BB8.0020.0002] # SHARADA DIGIT ZERO -112F0 ; [.1BB8.0020.0002] # KHUDAWADI DIGIT ZERO -114D0 ; [.1BB8.0020.0002] # TIRHUTA DIGIT ZERO -11650 ; [.1BB8.0020.0002] # MODI DIGIT ZERO -116C0 ; [.1BB8.0020.0002] # TAKRI DIGIT ZERO -11730 ; [.1BB8.0020.0002] # AHOM DIGIT ZERO -118E0 ; [.1BB8.0020.0002] # WARANG CITI DIGIT ZERO -16A60 ; [.1BB8.0020.0002] # MRO DIGIT ZERO -16B50 ; [.1BB8.0020.0002] # PAHAWH HMONG DIGIT ZERO -FF10 ; [.1BB8.0020.0003] # FULLWIDTH DIGIT ZERO -0F33 ; [.1BB8.0020.0004] # TIBETAN DIGIT HALF ZERO -1F100 ; [.1BB8.0020.0004][*0274.0020.0004] # DIGIT ZERO FULL STOP -1F101 ; [.1BB8.0020.0004][*0221.0020.0004] # DIGIT ZERO COMMA -1D7CE ; [.1BB8.0020.0005] # MATHEMATICAL BOLD DIGIT ZERO -1D7D8 ; [.1BB8.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO -1D7E2 ; [.1BB8.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ZERO -1D7EC ; [.1BB8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO -1D7F6 ; [.1BB8.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ZERO -24EA ; [.1BB8.0020.0006] # CIRCLED DIGIT ZERO -24FF ; [.1BB8.0020.0006] # NEGATIVE CIRCLED DIGIT ZERO -1F10B ; [.1BB8.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ZERO -1F10C ; [.1BB8.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO -2070 ; [.1BB8.0020.0014] # SUPERSCRIPT ZERO -2080 ; [.1BB8.0020.0015] # SUBSCRIPT ZERO -2189 ; [.1BB8.0020.001E][*0606.0020.001E][.1BBB.0020.001E] # VULGAR FRACTION ZERO THIRDS -3358 ; [.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO -0031 ; [.1BB9.0020.0002] # DIGIT ONE -0661 ; [.1BB9.0020.0002] # ARABIC-INDIC DIGIT ONE -06F1 ; [.1BB9.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ONE -07C1 ; [.1BB9.0020.0002] # NKO DIGIT ONE -0967 ; [.1BB9.0020.0002] # DEVANAGARI DIGIT ONE -09E7 ; [.1BB9.0020.0002] # BENGALI DIGIT ONE -0A67 ; [.1BB9.0020.0002] # GURMUKHI DIGIT ONE -0AE7 ; [.1BB9.0020.0002] # GUJARATI DIGIT ONE -0B67 ; [.1BB9.0020.0002] # ORIYA DIGIT ONE -0BE7 ; [.1BB9.0020.0002] # TAMIL DIGIT ONE -0C67 ; [.1BB9.0020.0002] # TELUGU DIGIT ONE -0C79 ; [.1BB9.0020.0002] # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR -0C7C ; [.1BB9.0020.0002] # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR -0CE7 ; [.1BB9.0020.0002] # KANNADA DIGIT ONE -0D67 ; [.1BB9.0020.0002] # MALAYALAM DIGIT ONE -0DE7 ; [.1BB9.0020.0002] # SINHALA LITH DIGIT ONE -0E51 ; [.1BB9.0020.0002] # THAI DIGIT ONE -0ED1 ; [.1BB9.0020.0002] # LAO DIGIT ONE -0F21 ; [.1BB9.0020.0002] # TIBETAN DIGIT ONE -1041 ; [.1BB9.0020.0002] # MYANMAR DIGIT ONE -1091 ; [.1BB9.0020.0002] # MYANMAR SHAN DIGIT ONE -1369 ; [.1BB9.0020.0002] # ETHIOPIC DIGIT ONE -17E1 ; [.1BB9.0020.0002] # KHMER DIGIT ONE -17F1 ; [.1BB9.0020.0002] # KHMER SYMBOL LEK ATTAK MUOY -1811 ; [.1BB9.0020.0002] # MONGOLIAN DIGIT ONE -1947 ; [.1BB9.0020.0002] # LIMBU DIGIT ONE -19D1 ; [.1BB9.0020.0002] # NEW TAI LUE DIGIT ONE -19DA ; [.1BB9.0020.0002] # NEW TAI LUE THAM DIGIT ONE -1A81 ; [.1BB9.0020.0002] # TAI THAM HORA DIGIT ONE -1A91 ; [.1BB9.0020.0002] # TAI THAM THAM DIGIT ONE -1B51 ; [.1BB9.0020.0002] # BALINESE DIGIT ONE -1BB1 ; [.1BB9.0020.0002] # SUNDANESE DIGIT ONE -1C41 ; [.1BB9.0020.0002] # LEPCHA DIGIT ONE -1C51 ; [.1BB9.0020.0002] # OL CHIKI DIGIT ONE -3021 ; [.1BB9.0020.0002] # HANGZHOU NUMERAL ONE -A621 ; [.1BB9.0020.0002] # VAI DIGIT ONE -A8D1 ; [.1BB9.0020.0002] # SAURASHTRA DIGIT ONE -A901 ; [.1BB9.0020.0002] # KAYAH LI DIGIT ONE -A9D1 ; [.1BB9.0020.0002] # JAVANESE DIGIT ONE -A9F1 ; [.1BB9.0020.0002] # MYANMAR TAI LAING DIGIT ONE -AA51 ; [.1BB9.0020.0002] # CHAM DIGIT ONE -ABF1 ; [.1BB9.0020.0002] # MEETEI MAYEK DIGIT ONE -10107 ; [.1BB9.0020.0002] # AEGEAN NUMBER ONE -10142 ; [.1BB9.0020.0002] # GREEK ACROPHONIC ATTIC ONE DRACHMA -10158 ; [.1BB9.0020.0002] # GREEK ACROPHONIC HERAEUM ONE PLETHRON -10159 ; [.1BB9.0020.0002] # GREEK ACROPHONIC THESPIAN ONE -1015A ; [.1BB9.0020.0002] # GREEK ACROPHONIC HERMIONIAN ONE -102E1 ; [.1BB9.0020.0002] # COPTIC EPACT DIGIT ONE -10320 ; [.1BB9.0020.0002] # OLD ITALIC NUMERAL ONE -103D1 ; [.1BB9.0020.0002] # OLD PERSIAN NUMBER ONE -104A1 ; [.1BB9.0020.0002] # OSMANYA DIGIT ONE -10858 ; [.1BB9.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE -10879 ; [.1BB9.0020.0002] # PALMYRENE NUMBER ONE -108A7 ; [.1BB9.0020.0002] # NABATAEAN NUMBER ONE -108FB ; [.1BB9.0020.0002] # HATRAN NUMBER ONE -10916 ; [.1BB9.0020.0002] # PHOENICIAN NUMBER ONE -109C0 ; [.1BB9.0020.0002] # MEROITIC CURSIVE NUMBER ONE -10A40 ; [.1BB9.0020.0002] # KHAROSHTHI DIGIT ONE -10A7D ; [.1BB9.0020.0002] # OLD SOUTH ARABIAN NUMBER ONE -10A9D ; [.1BB9.0020.0002] # OLD NORTH ARABIAN NUMBER ONE -10AEB ; [.1BB9.0020.0002] # MANICHAEAN NUMBER ONE -10B58 ; [.1BB9.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE -10B78 ; [.1BB9.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE -10BA9 ; [.1BB9.0020.0002] # PSALTER PAHLAVI NUMBER ONE -10CFA ; [.1BB9.0020.0002] # OLD HUNGARIAN NUMBER ONE -10E60 ; [.1BB9.0020.0002] # RUMI DIGIT ONE -11052 ; [.1BB9.0020.0002] # BRAHMI NUMBER ONE -11067 ; [.1BB9.0020.0002] # BRAHMI DIGIT ONE -110F1 ; [.1BB9.0020.0002] # SORA SOMPENG DIGIT ONE -11137 ; [.1BB9.0020.0002] # CHAKMA DIGIT ONE -111D1 ; [.1BB9.0020.0002] # SHARADA DIGIT ONE -111E1 ; [.1BB9.0020.0002] # SINHALA ARCHAIC DIGIT ONE -112F1 ; [.1BB9.0020.0002] # KHUDAWADI DIGIT ONE -114D1 ; [.1BB9.0020.0002] # TIRHUTA DIGIT ONE -11651 ; [.1BB9.0020.0002] # MODI DIGIT ONE -116C1 ; [.1BB9.0020.0002] # TAKRI DIGIT ONE -11731 ; [.1BB9.0020.0002] # AHOM DIGIT ONE -118E1 ; [.1BB9.0020.0002] # WARANG CITI DIGIT ONE -12415 ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESH2 -1241E ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESHU -1242C ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE SHARU -12434 ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BURU -1244F ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BAN2 -12458 ; [.1BB9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE ESHE3 -16A61 ; [.1BB9.0020.0002] # MRO DIGIT ONE -16B51 ; [.1BB9.0020.0002] # PAHAWH HMONG DIGIT ONE -1D360 ; [.1BB9.0020.0002] # COUNTING ROD UNIT DIGIT ONE -1E8C7 ; [.1BB9.0020.0002] # MENDE KIKAKUI DIGIT ONE -FF11 ; [.1BB9.0020.0003] # FULLWIDTH DIGIT ONE -0F2A ; [.1BB9.0020.0004] # TIBETAN DIGIT HALF ONE -2474 ; [*0310.0020.0004][.1BB9.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT ONE -2488 ; [.1BB9.0020.0004][*0274.0020.0004] # DIGIT ONE FULL STOP -1F102 ; [.1BB9.0020.0004][*0221.0020.0004] # DIGIT ONE COMMA -1D7CF ; [.1BB9.0020.0005] # MATHEMATICAL BOLD DIGIT ONE -1D7D9 ; [.1BB9.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE -1D7E3 ; [.1BB9.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ONE -1D7ED ; [.1BB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE -1D7F7 ; [.1BB9.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ONE -2460 ; [.1BB9.0020.0006] # CIRCLED DIGIT ONE -24F5 ; [.1BB9.0020.0006] # DOUBLE CIRCLED DIGIT ONE -2776 ; [.1BB9.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT ONE -2780 ; [.1BB9.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE -278A ; [.1BB9.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE -00B9 ; [.1BB9.0020.0014] # SUPERSCRIPT ONE -2081 ; [.1BB9.0020.0015] # SUBSCRIPT ONE -215F ; [.1BB9.0020.001E][*0606.0020.001E] # FRACTION NUMERATOR ONE -247D ; [*0310.0020.0004][.1BB9.0020.0004][.1BB8.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER TEN -2491 ; [.1BB9.0020.0004][.1BB8.0020.0004][*0274.0020.0004] # NUMBER TEN FULL STOP -2469 ; [.1BB9.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER TEN -24FE ; [.1BB9.0020.0006][.1BB8.0020.0006] # DOUBLE CIRCLED NUMBER TEN -277F ; [.1BB9.0020.0006][.1BB8.0020.0006] # DINGBAT NEGATIVE CIRCLED NUMBER TEN -2789 ; [.1BB9.0020.0006][.1BB8.0020.0006] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN -2793 ; [.1BB9.0020.0006][.1BB8.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -3248 ; [.1BB9.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER TEN ON BLACK SQUARE -33E9 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN -32C9 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER -3362 ; [.1BB9.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN -247E ; [*0310.0020.0004][.1BB9.0020.0004][.1BB9.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER ELEVEN -2492 ; [.1BB9.0020.0004][.1BB9.0020.0004][*0274.0020.0004] # NUMBER ELEVEN FULL STOP -246A ; [.1BB9.0020.0006][.1BB9.0020.0006] # CIRCLED NUMBER ELEVEN -24EB ; [.1BB9.0020.0006][.1BB9.0020.0006] # NEGATIVE CIRCLED NUMBER ELEVEN -2152 ; [.1BB9.0020.001E][*0606.0020.001E][.1BB9.0020.001E][.1BB8.0020.001E] # VULGAR FRACTION ONE TENTH -33EA ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN -32CA ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER -3363 ; [.1BB9.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN -247F ; [*0310.0020.0004][.1BB9.0020.0004][.1BBA.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER TWELVE -2493 ; [.1BB9.0020.0004][.1BBA.0020.0004][*0274.0020.0004] # NUMBER TWELVE FULL STOP -246B ; [.1BB9.0020.0006][.1BBA.0020.0006] # CIRCLED NUMBER TWELVE -24EC ; [.1BB9.0020.0006][.1BBA.0020.0006] # NEGATIVE CIRCLED NUMBER TWELVE -00BD ; [.1BB9.0020.001E][*0606.0020.001E][.1BBA.0020.001E] # VULGAR FRACTION ONE HALF -33EB ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE -32CB ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER -3364 ; [.1BB9.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE -2480 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBB.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER THIRTEEN -2494 ; [.1BB9.0020.0004][.1BBB.0020.0004][*0274.0020.0004] # NUMBER THIRTEEN FULL STOP -246C ; [.1BB9.0020.0006][.1BBB.0020.0006] # CIRCLED NUMBER THIRTEEN -24ED ; [.1BB9.0020.0006][.1BBB.0020.0006] # NEGATIVE CIRCLED NUMBER THIRTEEN -2153 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBB.0020.001E] # VULGAR FRACTION ONE THIRD -33EC ; [.1BB9.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN -3365 ; [.1BB9.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN -2481 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBC.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER FOURTEEN -2495 ; [.1BB9.0020.0004][.1BBC.0020.0004][*0274.0020.0004] # NUMBER FOURTEEN FULL STOP -246D ; [.1BB9.0020.0006][.1BBC.0020.0006] # CIRCLED NUMBER FOURTEEN -24EE ; [.1BB9.0020.0006][.1BBC.0020.0006] # NEGATIVE CIRCLED NUMBER FOURTEEN -00BC ; [.1BB9.0020.001E][*0606.0020.001E][.1BBC.0020.001E] # VULGAR FRACTION ONE QUARTER -33ED ; [.1BB9.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN -3366 ; [.1BB9.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN -2482 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBD.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER FIFTEEN -2496 ; [.1BB9.0020.0004][.1BBD.0020.0004][*0274.0020.0004] # NUMBER FIFTEEN FULL STOP -246E ; [.1BB9.0020.0006][.1BBD.0020.0006] # CIRCLED NUMBER FIFTEEN -24EF ; [.1BB9.0020.0006][.1BBD.0020.0006] # NEGATIVE CIRCLED NUMBER FIFTEEN -2155 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBD.0020.001E] # VULGAR FRACTION ONE FIFTH -33EE ; [.1BB9.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN -3367 ; [.1BB9.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN -2483 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBE.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER SIXTEEN -2497 ; [.1BB9.0020.0004][.1BBE.0020.0004][*0274.0020.0004] # NUMBER SIXTEEN FULL STOP -246F ; [.1BB9.0020.0006][.1BBE.0020.0006] # CIRCLED NUMBER SIXTEEN -24F0 ; [.1BB9.0020.0006][.1BBE.0020.0006] # NEGATIVE CIRCLED NUMBER SIXTEEN -2159 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBE.0020.001E] # VULGAR FRACTION ONE SIXTH -33EF ; [.1BB9.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN -3368 ; [.1BB9.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN -2484 ; [*0310.0020.0004][.1BB9.0020.0004][.1BBF.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER SEVENTEEN -2498 ; [.1BB9.0020.0004][.1BBF.0020.0004][*0274.0020.0004] # NUMBER SEVENTEEN FULL STOP -2470 ; [.1BB9.0020.0006][.1BBF.0020.0006] # CIRCLED NUMBER SEVENTEEN -24F1 ; [.1BB9.0020.0006][.1BBF.0020.0006] # NEGATIVE CIRCLED NUMBER SEVENTEEN -2150 ; [.1BB9.0020.001E][*0606.0020.001E][.1BBF.0020.001E] # VULGAR FRACTION ONE SEVENTH -33F0 ; [.1BB9.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN -3369 ; [.1BB9.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN -2485 ; [*0310.0020.0004][.1BB9.0020.0004][.1BC0.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER EIGHTEEN -2499 ; [.1BB9.0020.0004][.1BC0.0020.0004][*0274.0020.0004] # NUMBER EIGHTEEN FULL STOP -2471 ; [.1BB9.0020.0006][.1BC0.0020.0006] # CIRCLED NUMBER EIGHTEEN -24F2 ; [.1BB9.0020.0006][.1BC0.0020.0006] # NEGATIVE CIRCLED NUMBER EIGHTEEN -215B ; [.1BB9.0020.001E][*0606.0020.001E][.1BC0.0020.001E] # VULGAR FRACTION ONE EIGHTH -33F1 ; [.1BB9.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN -336A ; [.1BB9.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN -2486 ; [*0310.0020.0004][.1BB9.0020.0004][.1BC1.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER NINETEEN -249A ; [.1BB9.0020.0004][.1BC1.0020.0004][*0274.0020.0004] # NUMBER NINETEEN FULL STOP -2472 ; [.1BB9.0020.0006][.1BC1.0020.0006] # CIRCLED NUMBER NINETEEN -24F3 ; [.1BB9.0020.0006][.1BC1.0020.0006] # NEGATIVE CIRCLED NUMBER NINETEEN -2151 ; [.1BB9.0020.001E][*0606.0020.001E][.1BC1.0020.001E] # VULGAR FRACTION ONE NINTH -33F2 ; [.1BB9.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN -336B ; [.1BB9.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN -33E0 ; [.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE -32C0 ; [.1BB9.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY -3359 ; [.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE -0032 ; [.1BBA.0020.0002] # DIGIT TWO -0662 ; [.1BBA.0020.0002] # ARABIC-INDIC DIGIT TWO -06F2 ; [.1BBA.0020.0002] # EXTENDED ARABIC-INDIC DIGIT TWO -07C2 ; [.1BBA.0020.0002] # NKO DIGIT TWO -0968 ; [.1BBA.0020.0002] # DEVANAGARI DIGIT TWO -09E8 ; [.1BBA.0020.0002] # BENGALI DIGIT TWO -0A68 ; [.1BBA.0020.0002] # GURMUKHI DIGIT TWO -0AE8 ; [.1BBA.0020.0002] # GUJARATI DIGIT TWO -0B68 ; [.1BBA.0020.0002] # ORIYA DIGIT TWO -0BE8 ; [.1BBA.0020.0002] # TAMIL DIGIT TWO -0C68 ; [.1BBA.0020.0002] # TELUGU DIGIT TWO -0C7A ; [.1BBA.0020.0002] # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR -0C7D ; [.1BBA.0020.0002] # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR -0CE8 ; [.1BBA.0020.0002] # KANNADA DIGIT TWO -0D68 ; [.1BBA.0020.0002] # MALAYALAM DIGIT TWO -0DE8 ; [.1BBA.0020.0002] # SINHALA LITH DIGIT TWO -0E52 ; [.1BBA.0020.0002] # THAI DIGIT TWO -0ED2 ; [.1BBA.0020.0002] # LAO DIGIT TWO -0F22 ; [.1BBA.0020.0002] # TIBETAN DIGIT TWO -1042 ; [.1BBA.0020.0002] # MYANMAR DIGIT TWO -1092 ; [.1BBA.0020.0002] # MYANMAR SHAN DIGIT TWO -136A ; [.1BBA.0020.0002] # ETHIOPIC DIGIT TWO -17E2 ; [.1BBA.0020.0002] # KHMER DIGIT TWO -17F2 ; [.1BBA.0020.0002] # KHMER SYMBOL LEK ATTAK PII -1812 ; [.1BBA.0020.0002] # MONGOLIAN DIGIT TWO -1948 ; [.1BBA.0020.0002] # LIMBU DIGIT TWO -19D2 ; [.1BBA.0020.0002] # NEW TAI LUE DIGIT TWO -1A82 ; [.1BBA.0020.0002] # TAI THAM HORA DIGIT TWO -1A92 ; [.1BBA.0020.0002] # TAI THAM THAM DIGIT TWO -1B52 ; [.1BBA.0020.0002] # BALINESE DIGIT TWO -1BB2 ; [.1BBA.0020.0002] # SUNDANESE DIGIT TWO -1C42 ; [.1BBA.0020.0002] # LEPCHA DIGIT TWO -1C52 ; [.1BBA.0020.0002] # OL CHIKI DIGIT TWO -3022 ; [.1BBA.0020.0002] # HANGZHOU NUMERAL TWO -A622 ; [.1BBA.0020.0002] # VAI DIGIT TWO -A8D2 ; [.1BBA.0020.0002] # SAURASHTRA DIGIT TWO -A902 ; [.1BBA.0020.0002] # KAYAH LI DIGIT TWO -A9D2 ; [.1BBA.0020.0002] # JAVANESE DIGIT TWO -A9F2 ; [.1BBA.0020.0002] # MYANMAR TAI LAING DIGIT TWO -AA52 ; [.1BBA.0020.0002] # CHAM DIGIT TWO -ABF2 ; [.1BBA.0020.0002] # MEETEI MAYEK DIGIT TWO -10108 ; [.1BBA.0020.0002] # AEGEAN NUMBER TWO -1015B ; [.1BBA.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO -1015C ; [.1BBA.0020.0002] # GREEK ACROPHONIC THESPIAN TWO -1015D ; [.1BBA.0020.0002] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS -1015E ; [.1BBA.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS -102E2 ; [.1BBA.0020.0002] # COPTIC EPACT DIGIT TWO -103D2 ; [.1BBA.0020.0002] # OLD PERSIAN NUMBER TWO -104A2 ; [.1BBA.0020.0002] # OSMANYA DIGIT TWO -10859 ; [.1BBA.0020.0002] # IMPERIAL ARAMAIC NUMBER TWO -1087A ; [.1BBA.0020.0002] # PALMYRENE NUMBER TWO -108A8 ; [.1BBA.0020.0002] # NABATAEAN NUMBER TWO -1091A ; [.1BBA.0020.0002] # PHOENICIAN NUMBER TWO -109C1 ; [.1BBA.0020.0002] # MEROITIC CURSIVE NUMBER TWO -10A41 ; [.1BBA.0020.0002] # KHAROSHTHI DIGIT TWO -10B59 ; [.1BBA.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWO -10B79 ; [.1BBA.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWO -10BAA ; [.1BBA.0020.0002] # PSALTER PAHLAVI NUMBER TWO -10E61 ; [.1BBA.0020.0002] # RUMI DIGIT TWO -11053 ; [.1BBA.0020.0002] # BRAHMI NUMBER TWO -11068 ; [.1BBA.0020.0002] # BRAHMI DIGIT TWO -110F2 ; [.1BBA.0020.0002] # SORA SOMPENG DIGIT TWO -11138 ; [.1BBA.0020.0002] # CHAKMA DIGIT TWO -111D2 ; [.1BBA.0020.0002] # SHARADA DIGIT TWO -111E2 ; [.1BBA.0020.0002] # SINHALA ARCHAIC DIGIT TWO -112F2 ; [.1BBA.0020.0002] # KHUDAWADI DIGIT TWO -114D2 ; [.1BBA.0020.0002] # TIRHUTA DIGIT TWO -11652 ; [.1BBA.0020.0002] # MODI DIGIT TWO -116C2 ; [.1BBA.0020.0002] # TAKRI DIGIT TWO -11732 ; [.1BBA.0020.0002] # AHOM DIGIT TWO -118E2 ; [.1BBA.0020.0002] # WARANG CITI DIGIT TWO -12400 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH -12416 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESH2 -1241F ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESHU -12423 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHAR2 -1242D ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHARU -12435 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BURU -1244A ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH TENU -12450 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BAN2 -12456 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAMIN -12459 ; [.1BBA.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ESHE3 -16A62 ; [.1BBA.0020.0002] # MRO DIGIT TWO -16B52 ; [.1BBA.0020.0002] # PAHAWH HMONG DIGIT TWO -1D361 ; [.1BBA.0020.0002] # COUNTING ROD UNIT DIGIT TWO -1E8C8 ; [.1BBA.0020.0002] # MENDE KIKAKUI DIGIT TWO -FF12 ; [.1BBA.0020.0003] # FULLWIDTH DIGIT TWO -0F2B ; [.1BBA.0020.0004] # TIBETAN DIGIT HALF TWO -2475 ; [*0310.0020.0004][.1BBA.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT TWO -2489 ; [.1BBA.0020.0004][*0274.0020.0004] # DIGIT TWO FULL STOP -1F103 ; [.1BBA.0020.0004][*0221.0020.0004] # DIGIT TWO COMMA -1D7D0 ; [.1BBA.0020.0005] # MATHEMATICAL BOLD DIGIT TWO -1D7DA ; [.1BBA.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO -1D7E4 ; [.1BBA.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT TWO -1D7EE ; [.1BBA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO -1D7F8 ; [.1BBA.0020.0005] # MATHEMATICAL MONOSPACE DIGIT TWO -2461 ; [.1BBA.0020.0006] # CIRCLED DIGIT TWO -24F6 ; [.1BBA.0020.0006] # DOUBLE CIRCLED DIGIT TWO -2777 ; [.1BBA.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT TWO -2781 ; [.1BBA.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO -278B ; [.1BBA.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO -00B2 ; [.1BBA.0020.0014] # SUPERSCRIPT TWO -2082 ; [.1BBA.0020.0015] # SUBSCRIPT TWO -2487 ; [*0310.0020.0004][.1BBA.0020.0004][.1BB8.0020.0004][*0311.0020.0004] # PARENTHESIZED NUMBER TWENTY -249B ; [.1BBA.0020.0004][.1BB8.0020.0004][*0274.0020.0004] # NUMBER TWENTY FULL STOP -2473 ; [.1BBA.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER TWENTY -24F4 ; [.1BBA.0020.0006][.1BB8.0020.0006] # NEGATIVE CIRCLED NUMBER TWENTY -3249 ; [.1BBA.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER TWENTY ON BLACK SQUARE -33F3 ; [.1BBA.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY -336C ; [.1BBA.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY -3251 ; [.1BBA.0020.0006][.1BB9.0020.0006] # CIRCLED NUMBER TWENTY ONE -33F4 ; [.1BBA.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE -336D ; [.1BBA.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE -3252 ; [.1BBA.0020.0006][.1BBA.0020.0006] # CIRCLED NUMBER TWENTY TWO -33F5 ; [.1BBA.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO -336E ; [.1BBA.0020.0004][.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO -3253 ; [.1BBA.0020.0006][.1BBB.0020.0006] # CIRCLED NUMBER TWENTY THREE -2154 ; [.1BBA.0020.001E][*0606.0020.001E][.1BBB.0020.001E] # VULGAR FRACTION TWO THIRDS -33F6 ; [.1BBA.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE -336F ; [.1BBA.0020.0004][.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE -3254 ; [.1BBA.0020.0006][.1BBC.0020.0006] # CIRCLED NUMBER TWENTY FOUR -33F7 ; [.1BBA.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR -3370 ; [.1BBA.0020.0004][.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR -3255 ; [.1BBA.0020.0006][.1BBD.0020.0006] # CIRCLED NUMBER TWENTY FIVE -2156 ; [.1BBA.0020.001E][*0606.0020.001E][.1BBD.0020.001E] # VULGAR FRACTION TWO FIFTHS -33F8 ; [.1BBA.0020.0004][.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE -3256 ; [.1BBA.0020.0006][.1BBE.0020.0006] # CIRCLED NUMBER TWENTY SIX -33F9 ; [.1BBA.0020.0004][.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX -3257 ; [.1BBA.0020.0006][.1BBF.0020.0006] # CIRCLED NUMBER TWENTY SEVEN -33FA ; [.1BBA.0020.0004][.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN -3258 ; [.1BBA.0020.0006][.1BC0.0020.0006] # CIRCLED NUMBER TWENTY EIGHT -33FB ; [.1BBA.0020.0004][.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT -3259 ; [.1BBA.0020.0006][.1BC1.0020.0006] # CIRCLED NUMBER TWENTY NINE -33FC ; [.1BBA.0020.0004][.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE -33E1 ; [.1BBA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO -32C1 ; [.1BBA.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY -335A ; [.1BBA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO -0033 ; [.1BBB.0020.0002] # DIGIT THREE -0663 ; [.1BBB.0020.0002] # ARABIC-INDIC DIGIT THREE -06F3 ; [.1BBB.0020.0002] # EXTENDED ARABIC-INDIC DIGIT THREE -07C3 ; [.1BBB.0020.0002] # NKO DIGIT THREE -0969 ; [.1BBB.0020.0002] # DEVANAGARI DIGIT THREE -09E9 ; [.1BBB.0020.0002] # BENGALI DIGIT THREE -0A69 ; [.1BBB.0020.0002] # GURMUKHI DIGIT THREE -0AE9 ; [.1BBB.0020.0002] # GUJARATI DIGIT THREE -0B69 ; [.1BBB.0020.0002] # ORIYA DIGIT THREE -0BE9 ; [.1BBB.0020.0002] # TAMIL DIGIT THREE -0C69 ; [.1BBB.0020.0002] # TELUGU DIGIT THREE -0C7B ; [.1BBB.0020.0002] # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR -0C7E ; [.1BBB.0020.0002] # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR -0CE9 ; [.1BBB.0020.0002] # KANNADA DIGIT THREE -0D69 ; [.1BBB.0020.0002] # MALAYALAM DIGIT THREE -0DE9 ; [.1BBB.0020.0002] # SINHALA LITH DIGIT THREE -0E53 ; [.1BBB.0020.0002] # THAI DIGIT THREE -0ED3 ; [.1BBB.0020.0002] # LAO DIGIT THREE -0F23 ; [.1BBB.0020.0002] # TIBETAN DIGIT THREE -1043 ; [.1BBB.0020.0002] # MYANMAR DIGIT THREE -1093 ; [.1BBB.0020.0002] # MYANMAR SHAN DIGIT THREE -136B ; [.1BBB.0020.0002] # ETHIOPIC DIGIT THREE -17E3 ; [.1BBB.0020.0002] # KHMER DIGIT THREE -17F3 ; [.1BBB.0020.0002] # KHMER SYMBOL LEK ATTAK BEI -1813 ; [.1BBB.0020.0002] # MONGOLIAN DIGIT THREE -1949 ; [.1BBB.0020.0002] # LIMBU DIGIT THREE -19D3 ; [.1BBB.0020.0002] # NEW TAI LUE DIGIT THREE -1A83 ; [.1BBB.0020.0002] # TAI THAM HORA DIGIT THREE -1A93 ; [.1BBB.0020.0002] # TAI THAM THAM DIGIT THREE -1B53 ; [.1BBB.0020.0002] # BALINESE DIGIT THREE -1BB3 ; [.1BBB.0020.0002] # SUNDANESE DIGIT THREE -1C43 ; [.1BBB.0020.0002] # LEPCHA DIGIT THREE -1C53 ; [.1BBB.0020.0002] # OL CHIKI DIGIT THREE -3023 ; [.1BBB.0020.0002] # HANGZHOU NUMERAL THREE -A623 ; [.1BBB.0020.0002] # VAI DIGIT THREE -A8D3 ; [.1BBB.0020.0002] # SAURASHTRA DIGIT THREE -A903 ; [.1BBB.0020.0002] # KAYAH LI DIGIT THREE -A9D3 ; [.1BBB.0020.0002] # JAVANESE DIGIT THREE -A9F3 ; [.1BBB.0020.0002] # MYANMAR TAI LAING DIGIT THREE -AA53 ; [.1BBB.0020.0002] # CHAM DIGIT THREE -ABF3 ; [.1BBB.0020.0002] # MEETEI MAYEK DIGIT THREE -10109 ; [.1BBB.0020.0002] # AEGEAN NUMBER THREE -102E3 ; [.1BBB.0020.0002] # COPTIC EPACT DIGIT THREE -104A3 ; [.1BBB.0020.0002] # OSMANYA DIGIT THREE -1085A ; [.1BBB.0020.0002] # IMPERIAL ARAMAIC NUMBER THREE -1087B ; [.1BBB.0020.0002] # PALMYRENE NUMBER THREE -108A9 ; [.1BBB.0020.0002] # NABATAEAN NUMBER THREE -1091B ; [.1BBB.0020.0002] # PHOENICIAN NUMBER THREE -109C2 ; [.1BBB.0020.0002] # MEROITIC CURSIVE NUMBER THREE -10A42 ; [.1BBB.0020.0002] # KHAROSHTHI DIGIT THREE -10B5A ; [.1BBB.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER THREE -10B7A ; [.1BBB.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER THREE -10BAB ; [.1BBB.0020.0002] # PSALTER PAHLAVI NUMBER THREE -10E62 ; [.1BBB.0020.0002] # RUMI DIGIT THREE -11054 ; [.1BBB.0020.0002] # BRAHMI NUMBER THREE -11069 ; [.1BBB.0020.0002] # BRAHMI DIGIT THREE -110F3 ; [.1BBB.0020.0002] # SORA SOMPENG DIGIT THREE -11139 ; [.1BBB.0020.0002] # CHAKMA DIGIT THREE -111D3 ; [.1BBB.0020.0002] # SHARADA DIGIT THREE -111E3 ; [.1BBB.0020.0002] # SINHALA ARCHAIC DIGIT THREE -112F3 ; [.1BBB.0020.0002] # KHUDAWADI DIGIT THREE -114D3 ; [.1BBB.0020.0002] # TIRHUTA DIGIT THREE -11653 ; [.1BBB.0020.0002] # MODI DIGIT THREE -116C3 ; [.1BBB.0020.0002] # TAKRI DIGIT THREE -11733 ; [.1BBB.0020.0002] # AHOM DIGIT THREE -118E3 ; [.1BBB.0020.0002] # WARANG CITI DIGIT THREE -12401 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH -12408 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE DISH -12417 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESH2 -12420 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESHU -12424 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 -12425 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM -1242E ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU -1242F ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM -12436 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU -12437 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM -1243A ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16 -1243B ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21 -1244B ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH TENU -12451 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BAN2 -12457 ; [.1BBB.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAESH -16A63 ; [.1BBB.0020.0002] # MRO DIGIT THREE -16B53 ; [.1BBB.0020.0002] # PAHAWH HMONG DIGIT THREE -1D362 ; [.1BBB.0020.0002] # COUNTING ROD UNIT DIGIT THREE -1E8C9 ; [.1BBB.0020.0002] # MENDE KIKAKUI DIGIT THREE -FF13 ; [.1BBB.0020.0003] # FULLWIDTH DIGIT THREE -0F2C ; [.1BBB.0020.0004] # TIBETAN DIGIT HALF THREE -2476 ; [*0310.0020.0004][.1BBB.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT THREE -248A ; [.1BBB.0020.0004][*0274.0020.0004] # DIGIT THREE FULL STOP -1F104 ; [.1BBB.0020.0004][*0221.0020.0004] # DIGIT THREE COMMA -1D7D1 ; [.1BBB.0020.0005] # MATHEMATICAL BOLD DIGIT THREE -1D7DB ; [.1BBB.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE -1D7E5 ; [.1BBB.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT THREE -1D7EF ; [.1BBB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE -1D7F9 ; [.1BBB.0020.0005] # MATHEMATICAL MONOSPACE DIGIT THREE -2462 ; [.1BBB.0020.0006] # CIRCLED DIGIT THREE -24F7 ; [.1BBB.0020.0006] # DOUBLE CIRCLED DIGIT THREE -2778 ; [.1BBB.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT THREE -2782 ; [.1BBB.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE -278C ; [.1BBB.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE -00B3 ; [.1BBB.0020.0014] # SUPERSCRIPT THREE -2083 ; [.1BBB.0020.0015] # SUBSCRIPT THREE -324A ; [.1BBB.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER THIRTY ON BLACK SQUARE -325A ; [.1BBB.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER THIRTY -33FD ; [.1BBB.0020.0004][.1BB8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY -325B ; [.1BBB.0020.0006][.1BB9.0020.0006] # CIRCLED NUMBER THIRTY ONE -33FE ; [.1BBB.0020.0004][.1BB9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE -325C ; [.1BBB.0020.0006][.1BBA.0020.0006] # CIRCLED NUMBER THIRTY TWO -325D ; [.1BBB.0020.0006][.1BBB.0020.0006] # CIRCLED NUMBER THIRTY THREE -325E ; [.1BBB.0020.0006][.1BBC.0020.0006] # CIRCLED NUMBER THIRTY FOUR -00BE ; [.1BBB.0020.001E][*0606.0020.001E][.1BBC.0020.001E] # VULGAR FRACTION THREE QUARTERS -325F ; [.1BBB.0020.0006][.1BBD.0020.0006] # CIRCLED NUMBER THIRTY FIVE -2157 ; [.1BBB.0020.001E][*0606.0020.001E][.1BBD.0020.001E] # VULGAR FRACTION THREE FIFTHS -32B1 ; [.1BBB.0020.0006][.1BBE.0020.0006] # CIRCLED NUMBER THIRTY SIX -32B2 ; [.1BBB.0020.0006][.1BBF.0020.0006] # CIRCLED NUMBER THIRTY SEVEN -32B3 ; [.1BBB.0020.0006][.1BC0.0020.0006] # CIRCLED NUMBER THIRTY EIGHT -215C ; [.1BBB.0020.001E][*0606.0020.001E][.1BC0.0020.001E] # VULGAR FRACTION THREE EIGHTHS -32B4 ; [.1BBB.0020.0006][.1BC1.0020.0006] # CIRCLED NUMBER THIRTY NINE -33E2 ; [.1BBB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE -32C2 ; [.1BBB.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH -335B ; [.1BBB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE -0034 ; [.1BBC.0020.0002] # DIGIT FOUR -0664 ; [.1BBC.0020.0002] # ARABIC-INDIC DIGIT FOUR -06F4 ; [.1BBC.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FOUR -07C4 ; [.1BBC.0020.0002] # NKO DIGIT FOUR -096A ; [.1BBC.0020.0002] # DEVANAGARI DIGIT FOUR -09EA ; [.1BBC.0020.0002] # BENGALI DIGIT FOUR -0A6A ; [.1BBC.0020.0002] # GURMUKHI DIGIT FOUR -0AEA ; [.1BBC.0020.0002] # GUJARATI DIGIT FOUR -0B6A ; [.1BBC.0020.0002] # ORIYA DIGIT FOUR -0BEA ; [.1BBC.0020.0002] # TAMIL DIGIT FOUR -0C6A ; [.1BBC.0020.0002] # TELUGU DIGIT FOUR -0CEA ; [.1BBC.0020.0002] # KANNADA DIGIT FOUR -0D6A ; [.1BBC.0020.0002] # MALAYALAM DIGIT FOUR -0DEA ; [.1BBC.0020.0002] # SINHALA LITH DIGIT FOUR -0E54 ; [.1BBC.0020.0002] # THAI DIGIT FOUR -0ED4 ; [.1BBC.0020.0002] # LAO DIGIT FOUR -0F24 ; [.1BBC.0020.0002] # TIBETAN DIGIT FOUR -1044 ; [.1BBC.0020.0002] # MYANMAR DIGIT FOUR -1094 ; [.1BBC.0020.0002] # MYANMAR SHAN DIGIT FOUR -136C ; [.1BBC.0020.0002] # ETHIOPIC DIGIT FOUR -17E4 ; [.1BBC.0020.0002] # KHMER DIGIT FOUR -17F4 ; [.1BBC.0020.0002] # KHMER SYMBOL LEK ATTAK BUON -1814 ; [.1BBC.0020.0002] # MONGOLIAN DIGIT FOUR -194A ; [.1BBC.0020.0002] # LIMBU DIGIT FOUR -19D4 ; [.1BBC.0020.0002] # NEW TAI LUE DIGIT FOUR -1A84 ; [.1BBC.0020.0002] # TAI THAM HORA DIGIT FOUR -1A94 ; [.1BBC.0020.0002] # TAI THAM THAM DIGIT FOUR -1B54 ; [.1BBC.0020.0002] # BALINESE DIGIT FOUR -1BB4 ; [.1BBC.0020.0002] # SUNDANESE DIGIT FOUR -1C44 ; [.1BBC.0020.0002] # LEPCHA DIGIT FOUR -1C54 ; [.1BBC.0020.0002] # OL CHIKI DIGIT FOUR -3024 ; [.1BBC.0020.0002] # HANGZHOU NUMERAL FOUR -A624 ; [.1BBC.0020.0002] # VAI DIGIT FOUR -A8D4 ; [.1BBC.0020.0002] # SAURASHTRA DIGIT FOUR -A904 ; [.1BBC.0020.0002] # KAYAH LI DIGIT FOUR -A9D4 ; [.1BBC.0020.0002] # JAVANESE DIGIT FOUR -A9F4 ; [.1BBC.0020.0002] # MYANMAR TAI LAING DIGIT FOUR -AA54 ; [.1BBC.0020.0002] # CHAM DIGIT FOUR -ABF4 ; [.1BBC.0020.0002] # MEETEI MAYEK DIGIT FOUR -1010A ; [.1BBC.0020.0002] # AEGEAN NUMBER FOUR -102E4 ; [.1BBC.0020.0002] # COPTIC EPACT DIGIT FOUR -104A4 ; [.1BBC.0020.0002] # OSMANYA DIGIT FOUR -1087C ; [.1BBC.0020.0002] # PALMYRENE NUMBER FOUR -108AA ; [.1BBC.0020.0002] # NABATAEAN NUMBER FOUR -108AB ; [.1BBC.0020.0002] # NABATAEAN CRUCIFORM NUMBER FOUR -109C3 ; [.1BBC.0020.0002] # MEROITIC CURSIVE NUMBER FOUR -10A43 ; [.1BBC.0020.0002] # KHAROSHTHI DIGIT FOUR -10B5B ; [.1BBC.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER FOUR -10B7B ; [.1BBC.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER FOUR -10BAC ; [.1BBC.0020.0002] # PSALTER PAHLAVI NUMBER FOUR -10E63 ; [.1BBC.0020.0002] # RUMI DIGIT FOUR -11055 ; [.1BBC.0020.0002] # BRAHMI NUMBER FOUR -1106A ; [.1BBC.0020.0002] # BRAHMI DIGIT FOUR -110F4 ; [.1BBC.0020.0002] # SORA SOMPENG DIGIT FOUR -1113A ; [.1BBC.0020.0002] # CHAKMA DIGIT FOUR -111D4 ; [.1BBC.0020.0002] # SHARADA DIGIT FOUR -111E4 ; [.1BBC.0020.0002] # SINHALA ARCHAIC DIGIT FOUR -112F4 ; [.1BBC.0020.0002] # KHUDAWADI DIGIT FOUR -114D4 ; [.1BBC.0020.0002] # TIRHUTA DIGIT FOUR -11654 ; [.1BBC.0020.0002] # MODI DIGIT FOUR -116C4 ; [.1BBC.0020.0002] # TAKRI DIGIT FOUR -11734 ; [.1BBC.0020.0002] # AHOM DIGIT FOUR -118E4 ; [.1BBC.0020.0002] # WARANG CITI DIGIT FOUR -12402 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH -12409 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR DISH -1240F ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U -12418 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESH2 -12421 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESHU -12426 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHAR2 -12430 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHARU -12438 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BURU -1243C ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU -1243D ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4 -1243E ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A -1243F ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B -1244C ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU -12452 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 -12453 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM -12469 ; [.1BBC.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM -16A64 ; [.1BBC.0020.0002] # MRO DIGIT FOUR -16B54 ; [.1BBC.0020.0002] # PAHAWH HMONG DIGIT FOUR -1D363 ; [.1BBC.0020.0002] # COUNTING ROD UNIT DIGIT FOUR -1E8CA ; [.1BBC.0020.0002] # MENDE KIKAKUI DIGIT FOUR -FF14 ; [.1BBC.0020.0003] # FULLWIDTH DIGIT FOUR -0F2D ; [.1BBC.0020.0004] # TIBETAN DIGIT HALF FOUR -2477 ; [*0310.0020.0004][.1BBC.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT FOUR -248B ; [.1BBC.0020.0004][*0274.0020.0004] # DIGIT FOUR FULL STOP -1F105 ; [.1BBC.0020.0004][*0221.0020.0004] # DIGIT FOUR COMMA -1D7D2 ; [.1BBC.0020.0005] # MATHEMATICAL BOLD DIGIT FOUR -1D7DC ; [.1BBC.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR -1D7E6 ; [.1BBC.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FOUR -1D7F0 ; [.1BBC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR -1D7FA ; [.1BBC.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FOUR -2463 ; [.1BBC.0020.0006] # CIRCLED DIGIT FOUR -24F8 ; [.1BBC.0020.0006] # DOUBLE CIRCLED DIGIT FOUR -2779 ; [.1BBC.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR -2783 ; [.1BBC.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR -278D ; [.1BBC.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR -2074 ; [.1BBC.0020.0014] # SUPERSCRIPT FOUR -2084 ; [.1BBC.0020.0015] # SUBSCRIPT FOUR -324B ; [.1BBC.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER FORTY ON BLACK SQUARE -32B5 ; [.1BBC.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER FORTY -32B6 ; [.1BBC.0020.0006][.1BB9.0020.0006] # CIRCLED NUMBER FORTY ONE -32B7 ; [.1BBC.0020.0006][.1BBA.0020.0006] # CIRCLED NUMBER FORTY TWO -32B8 ; [.1BBC.0020.0006][.1BBB.0020.0006] # CIRCLED NUMBER FORTY THREE -32B9 ; [.1BBC.0020.0006][.1BBC.0020.0006] # CIRCLED NUMBER FORTY FOUR -32BA ; [.1BBC.0020.0006][.1BBD.0020.0006] # CIRCLED NUMBER FORTY FIVE -2158 ; [.1BBC.0020.001E][*0606.0020.001E][.1BBD.0020.001E] # VULGAR FRACTION FOUR FIFTHS -32BB ; [.1BBC.0020.0006][.1BBE.0020.0006] # CIRCLED NUMBER FORTY SIX -32BC ; [.1BBC.0020.0006][.1BBF.0020.0006] # CIRCLED NUMBER FORTY SEVEN -32BD ; [.1BBC.0020.0006][.1BC0.0020.0006] # CIRCLED NUMBER FORTY EIGHT -32BE ; [.1BBC.0020.0006][.1BC1.0020.0006] # CIRCLED NUMBER FORTY NINE -33E3 ; [.1BBC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR -32C3 ; [.1BBC.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL -335C ; [.1BBC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR -0035 ; [.1BBD.0020.0002] # DIGIT FIVE -0665 ; [.1BBD.0020.0002] # ARABIC-INDIC DIGIT FIVE -06F5 ; [.1BBD.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FIVE -07C5 ; [.1BBD.0020.0002] # NKO DIGIT FIVE -096B ; [.1BBD.0020.0002] # DEVANAGARI DIGIT FIVE -09EB ; [.1BBD.0020.0002] # BENGALI DIGIT FIVE -0A6B ; [.1BBD.0020.0002] # GURMUKHI DIGIT FIVE -0AEB ; [.1BBD.0020.0002] # GUJARATI DIGIT FIVE -0B6B ; [.1BBD.0020.0002] # ORIYA DIGIT FIVE -0BEB ; [.1BBD.0020.0002] # TAMIL DIGIT FIVE -0C6B ; [.1BBD.0020.0002] # TELUGU DIGIT FIVE -0CEB ; [.1BBD.0020.0002] # KANNADA DIGIT FIVE -0D6B ; [.1BBD.0020.0002] # MALAYALAM DIGIT FIVE -0DEB ; [.1BBD.0020.0002] # SINHALA LITH DIGIT FIVE -0E55 ; [.1BBD.0020.0002] # THAI DIGIT FIVE -0ED5 ; [.1BBD.0020.0002] # LAO DIGIT FIVE -0F25 ; [.1BBD.0020.0002] # TIBETAN DIGIT FIVE -1045 ; [.1BBD.0020.0002] # MYANMAR DIGIT FIVE -1095 ; [.1BBD.0020.0002] # MYANMAR SHAN DIGIT FIVE -136D ; [.1BBD.0020.0002] # ETHIOPIC DIGIT FIVE -17E5 ; [.1BBD.0020.0002] # KHMER DIGIT FIVE -17F5 ; [.1BBD.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM -1815 ; [.1BBD.0020.0002] # MONGOLIAN DIGIT FIVE -194B ; [.1BBD.0020.0002] # LIMBU DIGIT FIVE -19D5 ; [.1BBD.0020.0002] # NEW TAI LUE DIGIT FIVE -1A85 ; [.1BBD.0020.0002] # TAI THAM HORA DIGIT FIVE -1A95 ; [.1BBD.0020.0002] # TAI THAM THAM DIGIT FIVE -1B55 ; [.1BBD.0020.0002] # BALINESE DIGIT FIVE -1BB5 ; [.1BBD.0020.0002] # SUNDANESE DIGIT FIVE -1C45 ; [.1BBD.0020.0002] # LEPCHA DIGIT FIVE -1C55 ; [.1BBD.0020.0002] # OL CHIKI DIGIT FIVE -3025 ; [.1BBD.0020.0002] # HANGZHOU NUMERAL FIVE -A625 ; [.1BBD.0020.0002] # VAI DIGIT FIVE -A8D5 ; [.1BBD.0020.0002] # SAURASHTRA DIGIT FIVE -A905 ; [.1BBD.0020.0002] # KAYAH LI DIGIT FIVE -A9D5 ; [.1BBD.0020.0002] # JAVANESE DIGIT FIVE -A9F5 ; [.1BBD.0020.0002] # MYANMAR TAI LAING DIGIT FIVE -AA55 ; [.1BBD.0020.0002] # CHAM DIGIT FIVE -ABF5 ; [.1BBD.0020.0002] # MEETEI MAYEK DIGIT FIVE -1010B ; [.1BBD.0020.0002] # AEGEAN NUMBER FIVE -10143 ; [.1BBD.0020.0002] # GREEK ACROPHONIC ATTIC FIVE -10148 ; [.1BBD.0020.0002] # GREEK ACROPHONIC ATTIC FIVE TALENTS -1014F ; [.1BBD.0020.0002] # GREEK ACROPHONIC ATTIC FIVE STATERS -1015F ; [.1BBD.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE -10173 ; [.1BBD.0020.0002] # GREEK ACROPHONIC DELPHIC FIVE MNAS -102E5 ; [.1BBD.0020.0002] # COPTIC EPACT DIGIT FIVE -10321 ; [.1BBD.0020.0002] # OLD ITALIC NUMERAL FIVE -104A5 ; [.1BBD.0020.0002] # OSMANYA DIGIT FIVE -1087D ; [.1BBD.0020.0002] # PALMYRENE NUMBER FIVE -108AC ; [.1BBD.0020.0002] # NABATAEAN NUMBER FIVE -108FC ; [.1BBD.0020.0002] # HATRAN NUMBER FIVE -109C4 ; [.1BBD.0020.0002] # MEROITIC CURSIVE NUMBER FIVE -10AEC ; [.1BBD.0020.0002] # MANICHAEAN NUMBER FIVE -10CFB ; [.1BBD.0020.0002] # OLD HUNGARIAN NUMBER FIVE -10E64 ; [.1BBD.0020.0002] # RUMI DIGIT FIVE -11056 ; [.1BBD.0020.0002] # BRAHMI NUMBER FIVE -1106B ; [.1BBD.0020.0002] # BRAHMI DIGIT FIVE -110F5 ; [.1BBD.0020.0002] # SORA SOMPENG DIGIT FIVE -1113B ; [.1BBD.0020.0002] # CHAKMA DIGIT FIVE -111D5 ; [.1BBD.0020.0002] # SHARADA DIGIT FIVE -111E5 ; [.1BBD.0020.0002] # SINHALA ARCHAIC DIGIT FIVE -112F5 ; [.1BBD.0020.0002] # KHUDAWADI DIGIT FIVE -114D5 ; [.1BBD.0020.0002] # TIRHUTA DIGIT FIVE -11655 ; [.1BBD.0020.0002] # MODI DIGIT FIVE -116C5 ; [.1BBD.0020.0002] # TAKRI DIGIT FIVE -11735 ; [.1BBD.0020.0002] # AHOM DIGIT FIVE -118E5 ; [.1BBD.0020.0002] # WARANG CITI DIGIT FIVE -12403 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH -1240A ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE DISH -12410 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U -12419 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESH2 -12422 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESHU -12427 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHAR2 -12431 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHARU -12439 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BURU -1244D ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU -12454 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 -12455 ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM -1246A ; [.1BBD.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM -16A65 ; [.1BBD.0020.0002] # MRO DIGIT FIVE -16B55 ; [.1BBD.0020.0002] # PAHAWH HMONG DIGIT FIVE -1D364 ; [.1BBD.0020.0002] # COUNTING ROD UNIT DIGIT FIVE -1E8CB ; [.1BBD.0020.0002] # MENDE KIKAKUI DIGIT FIVE -FF15 ; [.1BBD.0020.0003] # FULLWIDTH DIGIT FIVE -0F2E ; [.1BBD.0020.0004] # TIBETAN DIGIT HALF FIVE -2478 ; [*0310.0020.0004][.1BBD.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT FIVE -248C ; [.1BBD.0020.0004][*0274.0020.0004] # DIGIT FIVE FULL STOP -1F106 ; [.1BBD.0020.0004][*0221.0020.0004] # DIGIT FIVE COMMA -1D7D3 ; [.1BBD.0020.0005] # MATHEMATICAL BOLD DIGIT FIVE -1D7DD ; [.1BBD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE -1D7E7 ; [.1BBD.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FIVE -1D7F1 ; [.1BBD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE -1D7FB ; [.1BBD.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FIVE -2464 ; [.1BBD.0020.0006] # CIRCLED DIGIT FIVE -24F9 ; [.1BBD.0020.0006] # DOUBLE CIRCLED DIGIT FIVE -277A ; [.1BBD.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE -2784 ; [.1BBD.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE -278E ; [.1BBD.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE -2075 ; [.1BBD.0020.0014] # SUPERSCRIPT FIVE -2085 ; [.1BBD.0020.0015] # SUBSCRIPT FIVE -324C ; [.1BBD.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER FIFTY ON BLACK SQUARE -32BF ; [.1BBD.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER FIFTY -215A ; [.1BBD.0020.001E][*0606.0020.001E][.1BBE.0020.001E] # VULGAR FRACTION FIVE SIXTHS -215D ; [.1BBD.0020.001E][*0606.0020.001E][.1BC0.0020.001E] # VULGAR FRACTION FIVE EIGHTHS -33E4 ; [.1BBD.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE -32C4 ; [.1BBD.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY -335D ; [.1BBD.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE -0036 ; [.1BBE.0020.0002] # DIGIT SIX -0666 ; [.1BBE.0020.0002] # ARABIC-INDIC DIGIT SIX -06F6 ; [.1BBE.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SIX -07C6 ; [.1BBE.0020.0002] # NKO DIGIT SIX -096C ; [.1BBE.0020.0002] # DEVANAGARI DIGIT SIX -09EC ; [.1BBE.0020.0002] # BENGALI DIGIT SIX -0A6C ; [.1BBE.0020.0002] # GURMUKHI DIGIT SIX -0AEC ; [.1BBE.0020.0002] # GUJARATI DIGIT SIX -0B6C ; [.1BBE.0020.0002] # ORIYA DIGIT SIX -0BEC ; [.1BBE.0020.0002] # TAMIL DIGIT SIX -0C6C ; [.1BBE.0020.0002] # TELUGU DIGIT SIX -0CEC ; [.1BBE.0020.0002] # KANNADA DIGIT SIX -0D6C ; [.1BBE.0020.0002] # MALAYALAM DIGIT SIX -0DEC ; [.1BBE.0020.0002] # SINHALA LITH DIGIT SIX -0E56 ; [.1BBE.0020.0002] # THAI DIGIT SIX -0ED6 ; [.1BBE.0020.0002] # LAO DIGIT SIX -0F26 ; [.1BBE.0020.0002] # TIBETAN DIGIT SIX -1046 ; [.1BBE.0020.0002] # MYANMAR DIGIT SIX -1096 ; [.1BBE.0020.0002] # MYANMAR SHAN DIGIT SIX -136E ; [.1BBE.0020.0002] # ETHIOPIC DIGIT SIX -17E6 ; [.1BBE.0020.0002] # KHMER DIGIT SIX -17F6 ; [.1BBE.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-MUOY -1816 ; [.1BBE.0020.0002] # MONGOLIAN DIGIT SIX -194C ; [.1BBE.0020.0002] # LIMBU DIGIT SIX -19D6 ; [.1BBE.0020.0002] # NEW TAI LUE DIGIT SIX -1A86 ; [.1BBE.0020.0002] # TAI THAM HORA DIGIT SIX -1A96 ; [.1BBE.0020.0002] # TAI THAM THAM DIGIT SIX -1B56 ; [.1BBE.0020.0002] # BALINESE DIGIT SIX -1BB6 ; [.1BBE.0020.0002] # SUNDANESE DIGIT SIX -1C46 ; [.1BBE.0020.0002] # LEPCHA DIGIT SIX -1C56 ; [.1BBE.0020.0002] # OL CHIKI DIGIT SIX -2185 ; [.1BBE.0020.0002] # ROMAN NUMERAL SIX LATE FORM -3026 ; [.1BBE.0020.0002] # HANGZHOU NUMERAL SIX -A626 ; [.1BBE.0020.0002] # VAI DIGIT SIX -A8D6 ; [.1BBE.0020.0002] # SAURASHTRA DIGIT SIX -A906 ; [.1BBE.0020.0002] # KAYAH LI DIGIT SIX -A9D6 ; [.1BBE.0020.0002] # JAVANESE DIGIT SIX -A9F6 ; [.1BBE.0020.0002] # MYANMAR TAI LAING DIGIT SIX -AA56 ; [.1BBE.0020.0002] # CHAM DIGIT SIX -ABF6 ; [.1BBE.0020.0002] # MEETEI MAYEK DIGIT SIX -1010C ; [.1BBE.0020.0002] # AEGEAN NUMBER SIX -102E6 ; [.1BBE.0020.0002] # COPTIC EPACT DIGIT SIX -104A6 ; [.1BBE.0020.0002] # OSMANYA DIGIT SIX -109C5 ; [.1BBE.0020.0002] # MEROITIC CURSIVE NUMBER SIX -10E65 ; [.1BBE.0020.0002] # RUMI DIGIT SIX -11057 ; [.1BBE.0020.0002] # BRAHMI NUMBER SIX -1106C ; [.1BBE.0020.0002] # BRAHMI DIGIT SIX -110F6 ; [.1BBE.0020.0002] # SORA SOMPENG DIGIT SIX -1113C ; [.1BBE.0020.0002] # CHAKMA DIGIT SIX -111D6 ; [.1BBE.0020.0002] # SHARADA DIGIT SIX -111E6 ; [.1BBE.0020.0002] # SINHALA ARCHAIC DIGIT SIX -112F6 ; [.1BBE.0020.0002] # KHUDAWADI DIGIT SIX -114D6 ; [.1BBE.0020.0002] # TIRHUTA DIGIT SIX -11656 ; [.1BBE.0020.0002] # MODI DIGIT SIX -116C6 ; [.1BBE.0020.0002] # TAKRI DIGIT SIX -11736 ; [.1BBE.0020.0002] # AHOM DIGIT SIX -118E6 ; [.1BBE.0020.0002] # WARANG CITI DIGIT SIX -12404 ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH -1240B ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX DISH -12411 ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U -1241A ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX GESH2 -12428 ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX SHAR2 -12440 ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9 -1244E ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH TENU -1246B ; [.1BBE.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM -16A66 ; [.1BBE.0020.0002] # MRO DIGIT SIX -16B56 ; [.1BBE.0020.0002] # PAHAWH HMONG DIGIT SIX -1D365 ; [.1BBE.0020.0002] # COUNTING ROD UNIT DIGIT SIX -1E8CC ; [.1BBE.0020.0002] # MENDE KIKAKUI DIGIT SIX -FF16 ; [.1BBE.0020.0003] # FULLWIDTH DIGIT SIX -0F2F ; [.1BBE.0020.0004] # TIBETAN DIGIT HALF SIX -2479 ; [*0310.0020.0004][.1BBE.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT SIX -248D ; [.1BBE.0020.0004][*0274.0020.0004] # DIGIT SIX FULL STOP -1F107 ; [.1BBE.0020.0004][*0221.0020.0004] # DIGIT SIX COMMA -1D7D4 ; [.1BBE.0020.0005] # MATHEMATICAL BOLD DIGIT SIX -1D7DE ; [.1BBE.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX -1D7E8 ; [.1BBE.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SIX -1D7F2 ; [.1BBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX -1D7FC ; [.1BBE.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SIX -2465 ; [.1BBE.0020.0006] # CIRCLED DIGIT SIX -24FA ; [.1BBE.0020.0006] # DOUBLE CIRCLED DIGIT SIX -277B ; [.1BBE.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SIX -2785 ; [.1BBE.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX -278F ; [.1BBE.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX -2076 ; [.1BBE.0020.0014] # SUPERSCRIPT SIX -2086 ; [.1BBE.0020.0015] # SUBSCRIPT SIX -324D ; [.1BBE.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER SIXTY ON BLACK SQUARE -33E5 ; [.1BBE.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX -32C5 ; [.1BBE.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE -335E ; [.1BBE.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX -0037 ; [.1BBF.0020.0002] # DIGIT SEVEN -0667 ; [.1BBF.0020.0002] # ARABIC-INDIC DIGIT SEVEN -06F7 ; [.1BBF.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SEVEN -07C7 ; [.1BBF.0020.0002] # NKO DIGIT SEVEN -096D ; [.1BBF.0020.0002] # DEVANAGARI DIGIT SEVEN -09ED ; [.1BBF.0020.0002] # BENGALI DIGIT SEVEN -0A6D ; [.1BBF.0020.0002] # GURMUKHI DIGIT SEVEN -0AED ; [.1BBF.0020.0002] # GUJARATI DIGIT SEVEN -0B6D ; [.1BBF.0020.0002] # ORIYA DIGIT SEVEN -0BED ; [.1BBF.0020.0002] # TAMIL DIGIT SEVEN -0C6D ; [.1BBF.0020.0002] # TELUGU DIGIT SEVEN -0CED ; [.1BBF.0020.0002] # KANNADA DIGIT SEVEN -0D6D ; [.1BBF.0020.0002] # MALAYALAM DIGIT SEVEN -0DED ; [.1BBF.0020.0002] # SINHALA LITH DIGIT SEVEN -0E57 ; [.1BBF.0020.0002] # THAI DIGIT SEVEN -0ED7 ; [.1BBF.0020.0002] # LAO DIGIT SEVEN -0F27 ; [.1BBF.0020.0002] # TIBETAN DIGIT SEVEN -1047 ; [.1BBF.0020.0002] # MYANMAR DIGIT SEVEN -1097 ; [.1BBF.0020.0002] # MYANMAR SHAN DIGIT SEVEN -136F ; [.1BBF.0020.0002] # ETHIOPIC DIGIT SEVEN -17E7 ; [.1BBF.0020.0002] # KHMER DIGIT SEVEN -17F7 ; [.1BBF.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-PII -1817 ; [.1BBF.0020.0002] # MONGOLIAN DIGIT SEVEN -194D ; [.1BBF.0020.0002] # LIMBU DIGIT SEVEN -19D7 ; [.1BBF.0020.0002] # NEW TAI LUE DIGIT SEVEN -1A87 ; [.1BBF.0020.0002] # TAI THAM HORA DIGIT SEVEN -1A97 ; [.1BBF.0020.0002] # TAI THAM THAM DIGIT SEVEN -1B57 ; [.1BBF.0020.0002] # BALINESE DIGIT SEVEN -1BB7 ; [.1BBF.0020.0002] # SUNDANESE DIGIT SEVEN -1C47 ; [.1BBF.0020.0002] # LEPCHA DIGIT SEVEN -1C57 ; [.1BBF.0020.0002] # OL CHIKI DIGIT SEVEN -3027 ; [.1BBF.0020.0002] # HANGZHOU NUMERAL SEVEN -A627 ; [.1BBF.0020.0002] # VAI DIGIT SEVEN -A8D7 ; [.1BBF.0020.0002] # SAURASHTRA DIGIT SEVEN -A907 ; [.1BBF.0020.0002] # KAYAH LI DIGIT SEVEN -A9D7 ; [.1BBF.0020.0002] # JAVANESE DIGIT SEVEN -A9F7 ; [.1BBF.0020.0002] # MYANMAR TAI LAING DIGIT SEVEN -AA57 ; [.1BBF.0020.0002] # CHAM DIGIT SEVEN -ABF7 ; [.1BBF.0020.0002] # MEETEI MAYEK DIGIT SEVEN -1010D ; [.1BBF.0020.0002] # AEGEAN NUMBER SEVEN -102E7 ; [.1BBF.0020.0002] # COPTIC EPACT DIGIT SEVEN -104A7 ; [.1BBF.0020.0002] # OSMANYA DIGIT SEVEN -109C6 ; [.1BBF.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN -10E66 ; [.1BBF.0020.0002] # RUMI DIGIT SEVEN -11058 ; [.1BBF.0020.0002] # BRAHMI NUMBER SEVEN -1106D ; [.1BBF.0020.0002] # BRAHMI DIGIT SEVEN -110F7 ; [.1BBF.0020.0002] # SORA SOMPENG DIGIT SEVEN -1113D ; [.1BBF.0020.0002] # CHAKMA DIGIT SEVEN -111D7 ; [.1BBF.0020.0002] # SHARADA DIGIT SEVEN -111E7 ; [.1BBF.0020.0002] # SINHALA ARCHAIC DIGIT SEVEN -112F7 ; [.1BBF.0020.0002] # KHUDAWADI DIGIT SEVEN -114D7 ; [.1BBF.0020.0002] # TIRHUTA DIGIT SEVEN -11657 ; [.1BBF.0020.0002] # MODI DIGIT SEVEN -116C7 ; [.1BBF.0020.0002] # TAKRI DIGIT SEVEN -11737 ; [.1BBF.0020.0002] # AHOM DIGIT SEVEN -118E7 ; [.1BBF.0020.0002] # WARANG CITI DIGIT SEVEN -12405 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN ASH -1240C ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN DISH -12412 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U -1241B ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN GESH2 -12429 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2 -12441 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3 -12442 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A -12443 ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B -1246C ; [.1BBF.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM -16A67 ; [.1BBF.0020.0002] # MRO DIGIT SEVEN -16B57 ; [.1BBF.0020.0002] # PAHAWH HMONG DIGIT SEVEN -1D366 ; [.1BBF.0020.0002] # COUNTING ROD UNIT DIGIT SEVEN -1E8CD ; [.1BBF.0020.0002] # MENDE KIKAKUI DIGIT SEVEN -FF17 ; [.1BBF.0020.0003] # FULLWIDTH DIGIT SEVEN -0F30 ; [.1BBF.0020.0004] # TIBETAN DIGIT HALF SEVEN -247A ; [*0310.0020.0004][.1BBF.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT SEVEN -248E ; [.1BBF.0020.0004][*0274.0020.0004] # DIGIT SEVEN FULL STOP -1F108 ; [.1BBF.0020.0004][*0221.0020.0004] # DIGIT SEVEN COMMA -1D7D5 ; [.1BBF.0020.0005] # MATHEMATICAL BOLD DIGIT SEVEN -1D7DF ; [.1BBF.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN -1D7E9 ; [.1BBF.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SEVEN -1D7F3 ; [.1BBF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN -1D7FD ; [.1BBF.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SEVEN -2466 ; [.1BBF.0020.0006] # CIRCLED DIGIT SEVEN -24FB ; [.1BBF.0020.0006] # DOUBLE CIRCLED DIGIT SEVEN -277C ; [.1BBF.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN -2786 ; [.1BBF.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN -2790 ; [.1BBF.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN -2077 ; [.1BBF.0020.0014] # SUPERSCRIPT SEVEN -2087 ; [.1BBF.0020.0015] # SUBSCRIPT SEVEN -324E ; [.1BBF.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER SEVENTY ON BLACK SQUARE -215E ; [.1BBF.0020.001E][*0606.0020.001E][.1BC0.0020.001E] # VULGAR FRACTION SEVEN EIGHTHS -33E6 ; [.1BBF.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN -32C6 ; [.1BBF.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY -335F ; [.1BBF.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN -0038 ; [.1BC0.0020.0002] # DIGIT EIGHT -0668 ; [.1BC0.0020.0002] # ARABIC-INDIC DIGIT EIGHT -06F8 ; [.1BC0.0020.0002] # EXTENDED ARABIC-INDIC DIGIT EIGHT -07C8 ; [.1BC0.0020.0002] # NKO DIGIT EIGHT -096E ; [.1BC0.0020.0002] # DEVANAGARI DIGIT EIGHT -09EE ; [.1BC0.0020.0002] # BENGALI DIGIT EIGHT -0A6E ; [.1BC0.0020.0002] # GURMUKHI DIGIT EIGHT -0AEE ; [.1BC0.0020.0002] # GUJARATI DIGIT EIGHT -0B6E ; [.1BC0.0020.0002] # ORIYA DIGIT EIGHT -0BEE ; [.1BC0.0020.0002] # TAMIL DIGIT EIGHT -0C6E ; [.1BC0.0020.0002] # TELUGU DIGIT EIGHT -0CEE ; [.1BC0.0020.0002] # KANNADA DIGIT EIGHT -0D6E ; [.1BC0.0020.0002] # MALAYALAM DIGIT EIGHT -0DEE ; [.1BC0.0020.0002] # SINHALA LITH DIGIT EIGHT -0E58 ; [.1BC0.0020.0002] # THAI DIGIT EIGHT -0ED8 ; [.1BC0.0020.0002] # LAO DIGIT EIGHT -0F28 ; [.1BC0.0020.0002] # TIBETAN DIGIT EIGHT -1048 ; [.1BC0.0020.0002] # MYANMAR DIGIT EIGHT -1098 ; [.1BC0.0020.0002] # MYANMAR SHAN DIGIT EIGHT -1370 ; [.1BC0.0020.0002] # ETHIOPIC DIGIT EIGHT -17E8 ; [.1BC0.0020.0002] # KHMER DIGIT EIGHT -17F8 ; [.1BC0.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BEI -1818 ; [.1BC0.0020.0002] # MONGOLIAN DIGIT EIGHT -194E ; [.1BC0.0020.0002] # LIMBU DIGIT EIGHT -19D8 ; [.1BC0.0020.0002] # NEW TAI LUE DIGIT EIGHT -1A88 ; [.1BC0.0020.0002] # TAI THAM HORA DIGIT EIGHT -1A98 ; [.1BC0.0020.0002] # TAI THAM THAM DIGIT EIGHT -1B58 ; [.1BC0.0020.0002] # BALINESE DIGIT EIGHT -1BB8 ; [.1BC0.0020.0002] # SUNDANESE DIGIT EIGHT -1C48 ; [.1BC0.0020.0002] # LEPCHA DIGIT EIGHT -1C58 ; [.1BC0.0020.0002] # OL CHIKI DIGIT EIGHT -3028 ; [.1BC0.0020.0002] # HANGZHOU NUMERAL EIGHT -A628 ; [.1BC0.0020.0002] # VAI DIGIT EIGHT -A8D8 ; [.1BC0.0020.0002] # SAURASHTRA DIGIT EIGHT -A908 ; [.1BC0.0020.0002] # KAYAH LI DIGIT EIGHT -A9D8 ; [.1BC0.0020.0002] # JAVANESE DIGIT EIGHT -A9F8 ; [.1BC0.0020.0002] # MYANMAR TAI LAING DIGIT EIGHT -AA58 ; [.1BC0.0020.0002] # CHAM DIGIT EIGHT -ABF8 ; [.1BC0.0020.0002] # MEETEI MAYEK DIGIT EIGHT -1010E ; [.1BC0.0020.0002] # AEGEAN NUMBER EIGHT -102E8 ; [.1BC0.0020.0002] # COPTIC EPACT DIGIT EIGHT -104A8 ; [.1BC0.0020.0002] # OSMANYA DIGIT EIGHT -109C7 ; [.1BC0.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT -10E67 ; [.1BC0.0020.0002] # RUMI DIGIT EIGHT -11059 ; [.1BC0.0020.0002] # BRAHMI NUMBER EIGHT -1106E ; [.1BC0.0020.0002] # BRAHMI DIGIT EIGHT -110F8 ; [.1BC0.0020.0002] # SORA SOMPENG DIGIT EIGHT -1113E ; [.1BC0.0020.0002] # CHAKMA DIGIT EIGHT -111D8 ; [.1BC0.0020.0002] # SHARADA DIGIT EIGHT -111E8 ; [.1BC0.0020.0002] # SINHALA ARCHAIC DIGIT EIGHT -112F8 ; [.1BC0.0020.0002] # KHUDAWADI DIGIT EIGHT -114D8 ; [.1BC0.0020.0002] # TIRHUTA DIGIT EIGHT -11658 ; [.1BC0.0020.0002] # MODI DIGIT EIGHT -116C8 ; [.1BC0.0020.0002] # TAKRI DIGIT EIGHT -11738 ; [.1BC0.0020.0002] # AHOM DIGIT EIGHT -118E8 ; [.1BC0.0020.0002] # WARANG CITI DIGIT EIGHT -12406 ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT ASH -1240D ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT DISH -12413 ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U -1241C ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT GESH2 -1242A ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2 -12444 ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU -12445 ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3 -1246D ; [.1BC0.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM -16A68 ; [.1BC0.0020.0002] # MRO DIGIT EIGHT -16B58 ; [.1BC0.0020.0002] # PAHAWH HMONG DIGIT EIGHT -1D367 ; [.1BC0.0020.0002] # COUNTING ROD UNIT DIGIT EIGHT -1E8CE ; [.1BC0.0020.0002] # MENDE KIKAKUI DIGIT EIGHT -FF18 ; [.1BC0.0020.0003] # FULLWIDTH DIGIT EIGHT -0F31 ; [.1BC0.0020.0004] # TIBETAN DIGIT HALF EIGHT -247B ; [*0310.0020.0004][.1BC0.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT EIGHT -248F ; [.1BC0.0020.0004][*0274.0020.0004] # DIGIT EIGHT FULL STOP -1F109 ; [.1BC0.0020.0004][*0221.0020.0004] # DIGIT EIGHT COMMA -1D7D6 ; [.1BC0.0020.0005] # MATHEMATICAL BOLD DIGIT EIGHT -1D7E0 ; [.1BC0.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT -1D7EA ; [.1BC0.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT EIGHT -1D7F4 ; [.1BC0.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT -1D7FE ; [.1BC0.0020.0005] # MATHEMATICAL MONOSPACE DIGIT EIGHT -2467 ; [.1BC0.0020.0006] # CIRCLED DIGIT EIGHT -24FC ; [.1BC0.0020.0006] # DOUBLE CIRCLED DIGIT EIGHT -277D ; [.1BC0.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT -2787 ; [.1BC0.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT -2791 ; [.1BC0.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT -2078 ; [.1BC0.0020.0014] # SUPERSCRIPT EIGHT -2088 ; [.1BC0.0020.0015] # SUBSCRIPT EIGHT -324F ; [.1BC0.0020.0006][.1BB8.0020.0006] # CIRCLED NUMBER EIGHTY ON BLACK SQUARE -33E7 ; [.1BC0.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT -32C7 ; [.1BC0.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST -3360 ; [.1BC0.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT -0039 ; [.1BC1.0020.0002] # DIGIT NINE -0669 ; [.1BC1.0020.0002] # ARABIC-INDIC DIGIT NINE -06F9 ; [.1BC1.0020.0002] # EXTENDED ARABIC-INDIC DIGIT NINE -07C9 ; [.1BC1.0020.0002] # NKO DIGIT NINE -096F ; [.1BC1.0020.0002] # DEVANAGARI DIGIT NINE -09EF ; [.1BC1.0020.0002] # BENGALI DIGIT NINE -0A6F ; [.1BC1.0020.0002] # GURMUKHI DIGIT NINE -0AEF ; [.1BC1.0020.0002] # GUJARATI DIGIT NINE -0B6F ; [.1BC1.0020.0002] # ORIYA DIGIT NINE -0BEF ; [.1BC1.0020.0002] # TAMIL DIGIT NINE -0C6F ; [.1BC1.0020.0002] # TELUGU DIGIT NINE -0CEF ; [.1BC1.0020.0002] # KANNADA DIGIT NINE -0D6F ; [.1BC1.0020.0002] # MALAYALAM DIGIT NINE -0DEF ; [.1BC1.0020.0002] # SINHALA LITH DIGIT NINE -0E59 ; [.1BC1.0020.0002] # THAI DIGIT NINE -0ED9 ; [.1BC1.0020.0002] # LAO DIGIT NINE -0F29 ; [.1BC1.0020.0002] # TIBETAN DIGIT NINE -1049 ; [.1BC1.0020.0002] # MYANMAR DIGIT NINE -1099 ; [.1BC1.0020.0002] # MYANMAR SHAN DIGIT NINE -1371 ; [.1BC1.0020.0002] # ETHIOPIC DIGIT NINE -17E9 ; [.1BC1.0020.0002] # KHMER DIGIT NINE -17F9 ; [.1BC1.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BUON -1819 ; [.1BC1.0020.0002] # MONGOLIAN DIGIT NINE -194F ; [.1BC1.0020.0002] # LIMBU DIGIT NINE -19D9 ; [.1BC1.0020.0002] # NEW TAI LUE DIGIT NINE -1A89 ; [.1BC1.0020.0002] # TAI THAM HORA DIGIT NINE -1A99 ; [.1BC1.0020.0002] # TAI THAM THAM DIGIT NINE -1B59 ; [.1BC1.0020.0002] # BALINESE DIGIT NINE -1BB9 ; [.1BC1.0020.0002] # SUNDANESE DIGIT NINE -1C49 ; [.1BC1.0020.0002] # LEPCHA DIGIT NINE -1C59 ; [.1BC1.0020.0002] # OL CHIKI DIGIT NINE -3029 ; [.1BC1.0020.0002] # HANGZHOU NUMERAL NINE -A629 ; [.1BC1.0020.0002] # VAI DIGIT NINE -A8D9 ; [.1BC1.0020.0002] # SAURASHTRA DIGIT NINE -A909 ; [.1BC1.0020.0002] # KAYAH LI DIGIT NINE -A9D9 ; [.1BC1.0020.0002] # JAVANESE DIGIT NINE -A9F9 ; [.1BC1.0020.0002] # MYANMAR TAI LAING DIGIT NINE -AA59 ; [.1BC1.0020.0002] # CHAM DIGIT NINE -ABF9 ; [.1BC1.0020.0002] # MEETEI MAYEK DIGIT NINE -1010F ; [.1BC1.0020.0002] # AEGEAN NUMBER NINE -102E9 ; [.1BC1.0020.0002] # COPTIC EPACT DIGIT NINE -104A9 ; [.1BC1.0020.0002] # OSMANYA DIGIT NINE -109C8 ; [.1BC1.0020.0002] # MEROITIC CURSIVE NUMBER NINE -10E68 ; [.1BC1.0020.0002] # RUMI DIGIT NINE -1105A ; [.1BC1.0020.0002] # BRAHMI NUMBER NINE -1106F ; [.1BC1.0020.0002] # BRAHMI DIGIT NINE -110F9 ; [.1BC1.0020.0002] # SORA SOMPENG DIGIT NINE -1113F ; [.1BC1.0020.0002] # CHAKMA DIGIT NINE -111D9 ; [.1BC1.0020.0002] # SHARADA DIGIT NINE -111E9 ; [.1BC1.0020.0002] # SINHALA ARCHAIC DIGIT NINE -112F9 ; [.1BC1.0020.0002] # KHUDAWADI DIGIT NINE -114D9 ; [.1BC1.0020.0002] # TIRHUTA DIGIT NINE -11659 ; [.1BC1.0020.0002] # MODI DIGIT NINE -116C9 ; [.1BC1.0020.0002] # TAKRI DIGIT NINE -11739 ; [.1BC1.0020.0002] # AHOM DIGIT NINE -118E9 ; [.1BC1.0020.0002] # WARANG CITI DIGIT NINE -12407 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE ASH -1240E ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE DISH -12414 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U -1241D ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE GESH2 -1242B ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE SHAR2 -12446 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU -12447 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3 -12448 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4 -12449 ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A -1246E ; [.1BC1.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM -16A69 ; [.1BC1.0020.0002] # MRO DIGIT NINE -16B59 ; [.1BC1.0020.0002] # PAHAWH HMONG DIGIT NINE -1D368 ; [.1BC1.0020.0002] # COUNTING ROD UNIT DIGIT NINE -1E8CF ; [.1BC1.0020.0002] # MENDE KIKAKUI DIGIT NINE -FF19 ; [.1BC1.0020.0003] # FULLWIDTH DIGIT NINE -0F32 ; [.1BC1.0020.0004] # TIBETAN DIGIT HALF NINE -247C ; [*0310.0020.0004][.1BC1.0020.0004][*0311.0020.0004] # PARENTHESIZED DIGIT NINE -2490 ; [.1BC1.0020.0004][*0274.0020.0004] # DIGIT NINE FULL STOP -1F10A ; [.1BC1.0020.0004][*0221.0020.0004] # DIGIT NINE COMMA -1D7D7 ; [.1BC1.0020.0005] # MATHEMATICAL BOLD DIGIT NINE -1D7E1 ; [.1BC1.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE -1D7EB ; [.1BC1.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT NINE -1D7F5 ; [.1BC1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE -1D7FF ; [.1BC1.0020.0005] # MATHEMATICAL MONOSPACE DIGIT NINE -2468 ; [.1BC1.0020.0006] # CIRCLED DIGIT NINE -24FD ; [.1BC1.0020.0006] # DOUBLE CIRCLED DIGIT NINE -277E ; [.1BC1.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT NINE -2788 ; [.1BC1.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE -2792 ; [.1BC1.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE -2079 ; [.1BC1.0020.0014] # SUPERSCRIPT NINE -2089 ; [.1BC1.0020.0015] # SUBSCRIPT NINE -33E8 ; [.1BC1.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE -32C8 ; [.1BC1.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER -3361 ; [.1BC1.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE -0061 ; [.1BC2.0020.0002] # LATIN SMALL LETTER A -FF41 ; [.1BC2.0020.0003] # FULLWIDTH LATIN SMALL LETTER A -0363 ; [.1BC2.0020.0004] # COMBINING LATIN SMALL LETTER A -249C ; [*0310.0020.0004][.1BC2.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER A -1D41A ; [.1BC2.0020.0005] # MATHEMATICAL BOLD SMALL A -1D44E ; [.1BC2.0020.0005] # MATHEMATICAL ITALIC SMALL A -1D482 ; [.1BC2.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL A -1D4B6 ; [.1BC2.0020.0005] # MATHEMATICAL SCRIPT SMALL A -1D4EA ; [.1BC2.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL A -1D51E ; [.1BC2.0020.0005] # MATHEMATICAL FRAKTUR SMALL A -1D552 ; [.1BC2.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL A -1D586 ; [.1BC2.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL A -1D5BA ; [.1BC2.0020.0005] # MATHEMATICAL SANS-SERIF SMALL A -1D5EE ; [.1BC2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL A -1D622 ; [.1BC2.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL A -1D656 ; [.1BC2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A -1D68A ; [.1BC2.0020.0005] # MATHEMATICAL MONOSPACE SMALL A -24D0 ; [.1BC2.0020.0006] # CIRCLED LATIN SMALL LETTER A -0041 ; [.1BC2.0020.0008] # LATIN CAPITAL LETTER A -FF21 ; [.1BC2.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER A -1F110 ; [*0310.0020.0004][.1BC2.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER A -1D400 ; [.1BC2.0020.000B] # MATHEMATICAL BOLD CAPITAL A -1D434 ; [.1BC2.0020.000B] # MATHEMATICAL ITALIC CAPITAL A -1D468 ; [.1BC2.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL A -1D49C ; [.1BC2.0020.000B] # MATHEMATICAL SCRIPT CAPITAL A -1D4D0 ; [.1BC2.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL A -1D504 ; [.1BC2.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL A -1D538 ; [.1BC2.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A -1D56C ; [.1BC2.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL A -1D5A0 ; [.1BC2.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL A -1D5D4 ; [.1BC2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A -1D608 ; [.1BC2.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A -1D63C ; [.1BC2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A -1D670 ; [.1BC2.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL A -24B6 ; [.1BC2.0020.000C] # CIRCLED LATIN CAPITAL LETTER A -1F150 ; [.1BC2.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER A -00AA ; [.1BC2.0020.0014] # FEMININE ORDINAL INDICATOR -1D43 ; [.1BC2.0020.0014] # MODIFIER LETTER SMALL A -2090 ; [.1BC2.0020.0015] # LATIN SUBSCRIPT SMALL LETTER A -1D2C ; [.1BC2.0020.001D] # MODIFIER LETTER CAPITAL A -1F130 ; [.1BC2.0020.001D] # SQUARED LATIN CAPITAL LETTER A -1F170 ; [.1BC2.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER A -00E1 ; [.1BC2.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH ACUTE -00C1 ; [.1BC2.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH ACUTE -00E0 ; [.1BC2.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH GRAVE -00C0 ; [.1BC2.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH GRAVE -0103 ; [.1BC2.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE -0102 ; [.1BC2.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE -1EAF ; [.1BC2.0020.0002][.0000.0026.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH BREVE AND ACUTE -1EAE ; [.1BC2.0020.0008][.0000.0026.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE -1EB1 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH BREVE AND GRAVE -1EB0 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE -1EB5 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH BREVE AND TILDE -1EB4 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE -1EB3 ; [.1BC2.0020.0002][.0000.0026.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE -1EB2 ; [.1BC2.0020.0008][.0000.0026.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE -00E2 ; [.1BC2.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX -00C2 ; [.1BC2.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -1EA5 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA4 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA7 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE -1EA6 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE -1EAB ; [.1BC2.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE -1EAA ; [.1BC2.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE -1EA9 ; [.1BC2.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -1EA8 ; [.1BC2.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -01CE ; [.1BC2.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER A WITH CARON -01CD ; [.1BC2.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER A WITH CARON -00E5 ; [.1BC2.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER A WITH RING ABOVE -00C5 ; [.1BC2.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE -212B ; [.1BC2.0020.0008][.0000.0029.0002] # ANGSTROM SIGN -01FB ; [.1BC2.0020.0002][.0000.0029.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE -01FA ; [.1BC2.0020.0008][.0000.0029.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE -00E4 ; [.1BC2.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER A WITH DIAERESIS -1DF2 ; [.1BC2.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER A WITH DIAERESIS -A79B ; [.1BC2.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK AE -00C4 ; [.1BC2.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS -A79A ; [.1BC2.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK AE -01DF ; [.1BC2.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON -01DE ; [.1BC2.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON -00E3 ; [.1BC2.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH TILDE -00C3 ; [.1BC2.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH TILDE -0227 ; [.1BC2.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER A WITH DOT ABOVE -0226 ; [.1BC2.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE -01E1 ; [.1BC2.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON -01E0 ; [.1BC2.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON -0105 ; [.1BC2.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER A WITH OGONEK -0104 ; [.1BC2.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER A WITH OGONEK -0101 ; [.1BC2.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH MACRON -0100 ; [.1BC2.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH MACRON -1EA3 ; [.1BC2.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH HOOK ABOVE -1EA2 ; [.1BC2.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH HOOK ABOVE -0201 ; [.1BC2.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER A WITH DOUBLE GRAVE -0200 ; [.1BC2.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE -0203 ; [.1BC2.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER A WITH INVERTED BREVE -0202 ; [.1BC2.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER A WITH INVERTED BREVE -1EA1 ; [.1BC2.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER A WITH DOT BELOW -1EA0 ; [.1BC2.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER A WITH DOT BELOW -1EB7 ; [.1BC2.0020.0002][.0000.0042.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW -1EB6 ; [.1BC2.0020.0008][.0000.0042.0002][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW -1EAD ; [.1BC2.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1EAC ; [.1BC2.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1E01 ; [.1BC2.0020.0002][.0000.0044.0002] # LATIN SMALL LETTER A WITH RING BELOW -1E00 ; [.1BC2.0020.0008][.0000.0044.0002] # LATIN CAPITAL LETTER A WITH RING BELOW -1DD3 ; [.1BC2.0020.0004][.0000.010B.0004] # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE -A733 ; [.1BC2.0020.0004][.1BC2.0020.0004] # LATIN SMALL LETTER AA -A732 ; [.1BC2.0020.000A][.1BC2.0020.000A] # LATIN CAPITAL LETTER AA -1F18E ; [.1BC2.0020.001D][.1BDB.0020.001D] # NEGATIVE SQUARED AB -2100 ; [.1BC2.0020.0004][*038D.0020.0004][.1BF5.0020.0004] # ACCOUNT OF -00E6 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004] # LATIN SMALL LETTER AE -1DD4 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004] # COMBINING LATIN SMALL LETTER AE -00C6 ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A] # LATIN CAPITAL LETTER AE -1D2D ; [.1BC2.0020.0014][.0000.010B.0014][.1C25.0020.0014] # MODIFIER LETTER CAPITAL AE -01FD ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004][.0000.0024.0002] # LATIN SMALL LETTER AE WITH ACUTE -01FC ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A][.0000.0024.0002] # LATIN CAPITAL LETTER AE WITH ACUTE -01E3 ; [.1BC2.0020.0004][.0000.010B.0004][.1C25.0020.0004][.0000.0032.0002] # LATIN SMALL LETTER AE WITH MACRON -01E2 ; [.1BC2.0020.000A][.0000.010B.0004][.1C25.0020.000A][.0000.0032.0002] # LATIN CAPITAL LETTER AE WITH MACRON -33C2 ; [.1BC2.0020.001C][*0274.0020.001C][.1D25.0020.001C][*0274.0020.001C] # SQUARE AM -33DF ; [.1BC2.0020.001D][*0605.0020.001C][.1D25.0020.001C] # SQUARE A OVER M -1DD5 ; [.1BC2.0020.0004][.1D58.0020.0004] # COMBINING LATIN SMALL LETTER AO -A735 ; [.1BC2.0020.0004][.1D58.0020.0004] # LATIN SMALL LETTER AO -A734 ; [.1BC2.0020.000A][.1D58.0020.000A] # LATIN CAPITAL LETTER AO -2101 ; [.1BC2.0020.0004][*038D.0020.0004][.1DEC.0020.0004] # ADDRESSED TO THE SUBJECT -214D ; [.1BC2.0020.000A][*038D.0020.0004][.1DEC.0020.000A] # AKTIESELSKAB -A737 ; [.1BC2.0020.0004][.1E30.0020.0004] # LATIN SMALL LETTER AU -A736 ; [.1BC2.0020.000A][.1E30.0020.000A] # LATIN CAPITAL LETTER AU -3373 ; [.1BC2.0020.001D][.1E30.0020.001D] # SQUARE AU -1DD6 ; [.1BC2.0020.0004][.1E5E.0020.0004] # COMBINING LATIN SMALL LETTER AV -A739 ; [.1BC2.0020.0004][.1E5E.0020.0004] # LATIN SMALL LETTER AV -A738 ; [.1BC2.0020.000A][.1E5E.0020.000A] # LATIN CAPITAL LETTER AV -A73B ; [.1BC2.0020.0004][.0000.010B.0004][.1E5E.0020.0004] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR -A73A ; [.1BC2.0020.000A][.0000.010B.0004][.1E5E.0020.000A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR -A73D ; [.1BC2.0020.0004][.1E86.0020.0004] # LATIN SMALL LETTER AY -A73C ; [.1BC2.0020.000A][.1E86.0020.000A] # LATIN CAPITAL LETTER AY -1E9A ; [.1BC2.0020.0004][.1EFB.0020.0004] # LATIN SMALL LETTER A WITH RIGHT HALF RING -1D00 ; [.1BC6.0020.0002] # LATIN LETTER SMALL CAPITAL A -2C65 ; [.1BC7.0020.0002] # LATIN SMALL LETTER A WITH STROKE -023A ; [.1BC7.0020.0008] # LATIN CAPITAL LETTER A WITH STROKE -1D8F ; [.1BC8.0020.0002] # LATIN SMALL LETTER A WITH RETROFLEX HOOK -1D01 ; [.1BC9.0020.0002] # LATIN LETTER SMALL CAPITAL AE -1D02 ; [.1BCA.0020.0002] # LATIN SMALL LETTER TURNED AE -1D46 ; [.1BCA.0020.0014] # MODIFIER LETTER SMALL TURNED AE -AB31 ; [.1BCB.0020.0002] # LATIN SMALL LETTER A REVERSED-SCHWA -0250 ; [.1BCC.0020.0002] # LATIN SMALL LETTER TURNED A -2C6F ; [.1BCC.0020.0008] # LATIN CAPITAL LETTER TURNED A -1D44 ; [.1BCC.0020.0014] # MODIFIER LETTER SMALL TURNED A -0251 ; [.1BD0.0020.0002] # LATIN SMALL LETTER ALPHA -1DE7 ; [.1BD0.0020.0004] # COMBINING LATIN SMALL LETTER ALPHA -2C6D ; [.1BD0.0020.0008] # LATIN CAPITAL LETTER ALPHA -1D45 ; [.1BD0.0020.0014] # MODIFIER LETTER SMALL ALPHA -AB30 ; [.1BD4.0020.0002] # LATIN SMALL LETTER BARRED ALPHA -1D90 ; [.1BD5.0020.0002] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK -0252 ; [.1BD6.0020.0002] # LATIN SMALL LETTER TURNED ALPHA -2C70 ; [.1BD6.0020.0008] # LATIN CAPITAL LETTER TURNED ALPHA -1D9B ; [.1BD6.0020.0014] # MODIFIER LETTER SMALL TURNED ALPHA -AB64 ; [.1BDA.0020.0002] # LATIN SMALL LETTER INVERTED ALPHA -0062 ; [.1BDB.0020.0002] # LATIN SMALL LETTER B -FF42 ; [.1BDB.0020.0003] # FULLWIDTH LATIN SMALL LETTER B -1DE8 ; [.1BDB.0020.0004] # COMBINING LATIN SMALL LETTER B -249D ; [*0310.0020.0004][.1BDB.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER B -1D41B ; [.1BDB.0020.0005] # MATHEMATICAL BOLD SMALL B -1D44F ; [.1BDB.0020.0005] # MATHEMATICAL ITALIC SMALL B -1D483 ; [.1BDB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL B -1D4B7 ; [.1BDB.0020.0005] # MATHEMATICAL SCRIPT SMALL B -1D4EB ; [.1BDB.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL B -1D51F ; [.1BDB.0020.0005] # MATHEMATICAL FRAKTUR SMALL B -1D553 ; [.1BDB.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL B -1D587 ; [.1BDB.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL B -1D5BB ; [.1BDB.0020.0005] # MATHEMATICAL SANS-SERIF SMALL B -1D5EF ; [.1BDB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL B -1D623 ; [.1BDB.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL B -1D657 ; [.1BDB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B -1D68B ; [.1BDB.0020.0005] # MATHEMATICAL MONOSPACE SMALL B -24D1 ; [.1BDB.0020.0006] # CIRCLED LATIN SMALL LETTER B -0042 ; [.1BDB.0020.0008] # LATIN CAPITAL LETTER B -FF22 ; [.1BDB.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER B -1F111 ; [*0310.0020.0004][.1BDB.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER B -212C ; [.1BDB.0020.000B] # SCRIPT CAPITAL B -1D401 ; [.1BDB.0020.000B] # MATHEMATICAL BOLD CAPITAL B -1D435 ; [.1BDB.0020.000B] # MATHEMATICAL ITALIC CAPITAL B -1D469 ; [.1BDB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL B -1D4D1 ; [.1BDB.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL B -1D505 ; [.1BDB.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL B -1D539 ; [.1BDB.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D56D ; [.1BDB.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL B -1D5A1 ; [.1BDB.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL B -1D5D5 ; [.1BDB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B -1D609 ; [.1BDB.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B -1D63D ; [.1BDB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B -1D671 ; [.1BDB.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL B -24B7 ; [.1BDB.0020.000C] # CIRCLED LATIN CAPITAL LETTER B -1F151 ; [.1BDB.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER B -1D47 ; [.1BDB.0020.0014] # MODIFIER LETTER SMALL B -1D2E ; [.1BDB.0020.001D] # MODIFIER LETTER CAPITAL B -1F131 ; [.1BDB.0020.001D] # SQUARED LATIN CAPITAL LETTER B -1F171 ; [.1BDB.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER B -1E03 ; [.1BDB.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER B WITH DOT ABOVE -1E02 ; [.1BDB.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER B WITH DOT ABOVE -1E05 ; [.1BDB.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER B WITH DOT BELOW -1E04 ; [.1BDB.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER B WITH DOT BELOW -1E07 ; [.1BDB.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER B WITH LINE BELOW -1E06 ; [.1BDB.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER B WITH LINE BELOW -3374 ; [.1BDB.0020.001C][.1BC2.0020.001C][.1DAE.0020.001C] # SQUARE BAR -33C3 ; [.1BDB.0020.001D][.1D9C.0020.001C] # SQUARE BQ -0299 ; [.1BDF.0020.0002] # LATIN LETTER SMALL CAPITAL B -0180 ; [.1BE3.0020.0002] # LATIN SMALL LETTER B WITH STROKE -0243 ; [.1BE3.0020.0008] # LATIN CAPITAL LETTER B WITH STROKE -1D2F ; [.1BE7.0020.0002] # MODIFIER LETTER CAPITAL BARRED B -1D03 ; [.1BE8.0020.0002] # LATIN LETTER SMALL CAPITAL BARRED B -1D6C ; [.1BE9.0020.0002] # LATIN SMALL LETTER B WITH MIDDLE TILDE -A797 ; [.1BEA.0020.0002] # LATIN SMALL LETTER B WITH FLOURISH -A796 ; [.1BEA.0020.0008] # LATIN CAPITAL LETTER B WITH FLOURISH -1D80 ; [.1BEB.0020.0002] # LATIN SMALL LETTER B WITH PALATAL HOOK -0253 ; [.1BEC.0020.0002] # LATIN SMALL LETTER B WITH HOOK -0181 ; [.1BEC.0020.0008] # LATIN CAPITAL LETTER B WITH HOOK -0183 ; [.1BF0.0020.0002] # LATIN SMALL LETTER B WITH TOPBAR -0182 ; [.1BF0.0020.0008] # LATIN CAPITAL LETTER B WITH TOPBAR -A7B5 ; [.1BF4.0020.0002] # LATIN SMALL LETTER BETA -1DE9 ; [.1BF4.0020.0004] # COMBINING LATIN SMALL LETTER BETA -A7B4 ; [.1BF4.0020.0008] # LATIN CAPITAL LETTER BETA -0063 ; [.1BF5.0020.0002] # LATIN SMALL LETTER C -FF43 ; [.1BF5.0020.0003] # FULLWIDTH LATIN SMALL LETTER C -0368 ; [.1BF5.0020.0004] # COMBINING LATIN SMALL LETTER C -217D ; [.1BF5.0020.0004] # SMALL ROMAN NUMERAL ONE HUNDRED -249E ; [*0310.0020.0004][.1BF5.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER C -1D41C ; [.1BF5.0020.0005] # MATHEMATICAL BOLD SMALL C -1D450 ; [.1BF5.0020.0005] # MATHEMATICAL ITALIC SMALL C -1D484 ; [.1BF5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL C -1D4B8 ; [.1BF5.0020.0005] # MATHEMATICAL SCRIPT SMALL C -1D4EC ; [.1BF5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL C -1D520 ; [.1BF5.0020.0005] # MATHEMATICAL FRAKTUR SMALL C -1D554 ; [.1BF5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL C -1D588 ; [.1BF5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL C -1D5BC ; [.1BF5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL C -1D5F0 ; [.1BF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL C -1D624 ; [.1BF5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL C -1D658 ; [.1BF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C -1D68C ; [.1BF5.0020.0005] # MATHEMATICAL MONOSPACE SMALL C -24D2 ; [.1BF5.0020.0006] # CIRCLED LATIN SMALL LETTER C -0043 ; [.1BF5.0020.0008] # LATIN CAPITAL LETTER C -FF23 ; [.1BF5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER C -2103 ; [*04D7.0020.0004][.1BF5.0020.000A] # DEGREE CELSIUS -216D ; [.1BF5.0020.000A] # ROMAN NUMERAL ONE HUNDRED -1F112 ; [*0310.0020.0004][.1BF5.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER C -2102 ; [.1BF5.0020.000B] # DOUBLE-STRUCK CAPITAL C -212D ; [.1BF5.0020.000B] # BLACK-LETTER CAPITAL C -1D402 ; [.1BF5.0020.000B] # MATHEMATICAL BOLD CAPITAL C -1D436 ; [.1BF5.0020.000B] # MATHEMATICAL ITALIC CAPITAL C -1D46A ; [.1BF5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL C -1D49E ; [.1BF5.0020.000B] # MATHEMATICAL SCRIPT CAPITAL C -1D4D2 ; [.1BF5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL C -1D56E ; [.1BF5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL C -1D5A2 ; [.1BF5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL C -1D5D6 ; [.1BF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C -1D60A ; [.1BF5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C -1D63E ; [.1BF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C -1D672 ; [.1BF5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL C -24B8 ; [.1BF5.0020.000C] # CIRCLED LATIN CAPITAL LETTER C -1F12B ; [.1BF5.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER C -1F152 ; [.1BF5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER C -1D9C ; [.1BF5.0020.0014] # MODIFIER LETTER SMALL C -1F132 ; [.1BF5.0020.001D] # SQUARED LATIN CAPITAL LETTER C -1F172 ; [.1BF5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER C -0107 ; [.1BF5.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH ACUTE -0106 ; [.1BF5.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH ACUTE -0109 ; [.1BF5.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER C WITH CIRCUMFLEX -0108 ; [.1BF5.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX -010D ; [.1BF5.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER C WITH CARON -010C ; [.1BF5.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER C WITH CARON -010B ; [.1BF5.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER C WITH DOT ABOVE -010A ; [.1BF5.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER C WITH DOT ABOVE -00E7 ; [.1BF5.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER C WITH CEDILLA -1DD7 ; [.1BF5.0020.0004][.0000.0030.0004] # COMBINING LATIN SMALL LETTER C CEDILLA -00C7 ; [.1BF5.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER C WITH CEDILLA -1E09 ; [.1BF5.0020.0002][.0000.0030.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE -1E08 ; [.1BF5.0020.0008][.0000.0030.0002][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE -3388 ; [.1BF5.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] # SQUARE CAL -33C4 ; [.1BF5.0020.001C][.1BF5.0020.001C] # SQUARE CC -1F12D ; [.1BF5.0020.000C][.1C0A.0020.000C] # CIRCLED CD -33C5 ; [.1BF5.0020.001C][.1C0A.0020.001C] # SQUARE CD -33C6 ; [.1BF5.0020.001D][*0605.0020.001C][.1CE0.0020.001C][.1C6F.0020.001C] # SQUARE C OVER KG -1F191 ; [.1BF5.0020.001D][.1CF2.0020.001D] # SQUARED CL -339D ; [.1BF5.0020.001C][.1D25.0020.001C] # SQUARE CM -33A0 ; [.1BF5.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] # SQUARE CM SQUARED -33A4 ; [.1BF5.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] # SQUARE CM CUBED -2105 ; [.1BF5.0020.0004][*038D.0020.0004][.1D58.0020.0004] # CARE OF -33C7 ; [.1BF5.0020.001D][.1D58.0020.001C][*0274.0020.001C] # SQUARE CO -1F192 ; [.1BF5.0020.001D][.1D58.0020.001D][.1D58.0020.001D][.1CF2.0020.001D] # SQUARED COOL -2106 ; [.1BF5.0020.0004][*038D.0020.0004][.1E30.0020.0004] # CADA UNA -1D04 ; [.1BF9.0020.0002] # LATIN LETTER SMALL CAPITAL C -023C ; [.1BFA.0020.0002] # LATIN SMALL LETTER C WITH STROKE -023B ; [.1BFA.0020.0008] # LATIN CAPITAL LETTER C WITH STROKE -A793 ; [.1BFE.0020.0002] # LATIN SMALL LETTER C WITH BAR -A792 ; [.1BFE.0020.0008] # LATIN CAPITAL LETTER C WITH BAR -A794 ; [.1BFF.0020.0002] # LATIN SMALL LETTER C WITH PALATAL HOOK -0188 ; [.1C00.0020.0002] # LATIN SMALL LETTER C WITH HOOK -0187 ; [.1C00.0020.0008] # LATIN CAPITAL LETTER C WITH HOOK -0255 ; [.1C04.0020.0002] # LATIN SMALL LETTER C WITH CURL -1D9D ; [.1C04.0020.0014] # MODIFIER LETTER SMALL C WITH CURL -2184 ; [.1C08.0020.0002] # LATIN SMALL LETTER REVERSED C -2183 ; [.1C08.0020.0008] # ROMAN NUMERAL REVERSED ONE HUNDRED -A73F ; [.1C09.0020.0002] # LATIN SMALL LETTER REVERSED C WITH DOT -A73E ; [.1C09.0020.0008] # LATIN CAPITAL LETTER REVERSED C WITH DOT -0064 ; [.1C0A.0020.0002] # LATIN SMALL LETTER D -FF44 ; [.1C0A.0020.0003] # FULLWIDTH LATIN SMALL LETTER D -0369 ; [.1C0A.0020.0004] # COMBINING LATIN SMALL LETTER D -217E ; [.1C0A.0020.0004] # SMALL ROMAN NUMERAL FIVE HUNDRED -249F ; [*0310.0020.0004][.1C0A.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER D -2146 ; [.1C0A.0020.0005] # DOUBLE-STRUCK ITALIC SMALL D -1D41D ; [.1C0A.0020.0005] # MATHEMATICAL BOLD SMALL D -1D451 ; [.1C0A.0020.0005] # MATHEMATICAL ITALIC SMALL D -1D485 ; [.1C0A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL D -1D4B9 ; [.1C0A.0020.0005] # MATHEMATICAL SCRIPT SMALL D -1D4ED ; [.1C0A.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL D -1D521 ; [.1C0A.0020.0005] # MATHEMATICAL FRAKTUR SMALL D -1D555 ; [.1C0A.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL D -1D589 ; [.1C0A.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL D -1D5BD ; [.1C0A.0020.0005] # MATHEMATICAL SANS-SERIF SMALL D -1D5F1 ; [.1C0A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL D -1D625 ; [.1C0A.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL D -1D659 ; [.1C0A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D -1D68D ; [.1C0A.0020.0005] # MATHEMATICAL MONOSPACE SMALL D -24D3 ; [.1C0A.0020.0006] # CIRCLED LATIN SMALL LETTER D -0044 ; [.1C0A.0020.0008] # LATIN CAPITAL LETTER D -FF24 ; [.1C0A.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER D -216E ; [.1C0A.0020.000A] # ROMAN NUMERAL FIVE HUNDRED -1F113 ; [*0310.0020.0004][.1C0A.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER D -2145 ; [.1C0A.0020.000B] # DOUBLE-STRUCK ITALIC CAPITAL D -1D403 ; [.1C0A.0020.000B] # MATHEMATICAL BOLD CAPITAL D -1D437 ; [.1C0A.0020.000B] # MATHEMATICAL ITALIC CAPITAL D -1D46B ; [.1C0A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL D -1D49F ; [.1C0A.0020.000B] # MATHEMATICAL SCRIPT CAPITAL D -1D4D3 ; [.1C0A.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL D -1D507 ; [.1C0A.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL D -1D53B ; [.1C0A.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D -1D56F ; [.1C0A.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL D -1D5A3 ; [.1C0A.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL D -1D5D7 ; [.1C0A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D -1D60B ; [.1C0A.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D -1D63F ; [.1C0A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D -1D673 ; [.1C0A.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL D -24B9 ; [.1C0A.0020.000C] # CIRCLED LATIN CAPITAL LETTER D -1F153 ; [.1C0A.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER D -1D48 ; [.1C0A.0020.0014] # MODIFIER LETTER SMALL D -1D30 ; [.1C0A.0020.001D] # MODIFIER LETTER CAPITAL D -1F133 ; [.1C0A.0020.001D] # SQUARED LATIN CAPITAL LETTER D -1F173 ; [.1C0A.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER D -010F ; [.1C0A.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER D WITH CARON -010E ; [.1C0A.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER D WITH CARON -1E0B ; [.1C0A.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER D WITH DOT ABOVE -1E0A ; [.1C0A.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER D WITH DOT ABOVE -1E11 ; [.1C0A.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER D WITH CEDILLA -1E10 ; [.1C0A.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER D WITH CEDILLA -0111 ; [.1C0A.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER D WITH STROKE -0110 ; [.1C0A.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER D WITH STROKE -1E0D ; [.1C0A.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER D WITH DOT BELOW -1E0C ; [.1C0A.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER D WITH DOT BELOW -1E13 ; [.1C0A.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW -1E12 ; [.1C0A.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW -1E0F ; [.1C0A.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER D WITH LINE BELOW -1E0E ; [.1C0A.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER D WITH LINE BELOW -00F0 ; [.1C0A.0020.0004][.0000.010B.0004] # LATIN SMALL LETTER ETH -1DD9 ; [.1C0A.0020.0004][.0000.010B.0004] # COMBINING LATIN SMALL LETTER ETH -00D0 ; [.1C0A.0020.000A][.0000.010B.0004] # LATIN CAPITAL LETTER ETH -1D9E ; [.1C0A.0020.0014][.0000.010B.0014] # MODIFIER LETTER SMALL ETH -1DD8 ; [.1C0A.0020.0004][.0000.010C.0004] # COMBINING LATIN SMALL LETTER INSULAR D -A77A ; [.1C0A.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR D -A779 ; [.1C0A.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR D -3372 ; [.1C0A.0020.001C][.1BC2.0020.001C] # SQUARE DA -0238 ; [.1C0A.0020.0004][.1BDB.0020.0004] # LATIN SMALL LETTER DB DIGRAPH -33C8 ; [.1C0A.0020.001C][.1BDB.0020.001D] # SQUARE DB -1F190 ; [.1C0A.0020.001D][.1CC7.0020.001D] # SQUARE DJ -3397 ; [.1C0A.0020.001C][.1CF2.0020.001C] # SQUARE DL -3377 ; [.1C0A.0020.001C][.1D25.0020.001C] # SQUARE DM -3378 ; [.1C0A.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] # SQUARE DM SQUARED -3379 ; [.1C0A.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] # SQUARE DM CUBED -01F3 ; [.1C0A.0020.0004][.1E9C.0020.0004] # LATIN SMALL LETTER DZ -02A3 ; [.1C0A.0020.0004][.1E9C.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH -01F2 ; [.1C0A.0020.000A][.1E9C.0020.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z -01F1 ; [.1C0A.0020.000A][.1E9C.0020.000A] # LATIN CAPITAL LETTER DZ -01C6 ; [.1C0A.0020.0004][.1E9C.0020.0004][.0000.0028.0004] # LATIN SMALL LETTER DZ WITH CARON -01C5 ; [.1C0A.0020.000A][.1E9C.0020.0004][.0000.0028.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON -01C4 ; [.1C0A.0020.000A][.1E9C.0020.000A][.0000.0028.0004] # LATIN CAPITAL LETTER DZ WITH CARON -02A5 ; [.1C0A.0020.0004][.1EAF.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL -02A4 ; [.1C0A.0020.0004][.1EB9.0020.0004] # LATIN SMALL LETTER DEZH DIGRAPH -1D05 ; [.1C0E.0020.0002] # LATIN LETTER SMALL CAPITAL D -1D06 ; [.1C0F.0020.0002] # LATIN LETTER SMALL CAPITAL ETH -1D6D ; [.1C10.0020.0002] # LATIN SMALL LETTER D WITH MIDDLE TILDE -1D81 ; [.1C11.0020.0002] # LATIN SMALL LETTER D WITH PALATAL HOOK -0256 ; [.1C12.0020.0002] # LATIN SMALL LETTER D WITH TAIL -0189 ; [.1C12.0020.0008] # LATIN CAPITAL LETTER AFRICAN D -0257 ; [.1C16.0020.0002] # LATIN SMALL LETTER D WITH HOOK -018A ; [.1C16.0020.0008] # LATIN CAPITAL LETTER D WITH HOOK -1D91 ; [.1C1A.0020.0002] # LATIN SMALL LETTER D WITH HOOK AND TAIL -018C ; [.1C1B.0020.0002] # LATIN SMALL LETTER D WITH TOPBAR -018B ; [.1C1B.0020.0008] # LATIN CAPITAL LETTER D WITH TOPBAR -0221 ; [.1C1F.0020.0002] # LATIN SMALL LETTER D WITH CURL -A771 ; [.1C23.0020.0002] # LATIN SMALL LETTER DUM -1E9F ; [.1C24.0020.0002] # LATIN SMALL LETTER DELTA -0065 ; [.1C25.0020.0002] # LATIN SMALL LETTER E -FF45 ; [.1C25.0020.0003] # FULLWIDTH LATIN SMALL LETTER E -0364 ; [.1C25.0020.0004] # COMBINING LATIN SMALL LETTER E -24A0 ; [*0310.0020.0004][.1C25.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER E -212F ; [.1C25.0020.0005] # SCRIPT SMALL E -2147 ; [.1C25.0020.0005] # DOUBLE-STRUCK ITALIC SMALL E -1D41E ; [.1C25.0020.0005] # MATHEMATICAL BOLD SMALL E -1D452 ; [.1C25.0020.0005] # MATHEMATICAL ITALIC SMALL E -1D486 ; [.1C25.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL E -1D4EE ; [.1C25.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL E -1D522 ; [.1C25.0020.0005] # MATHEMATICAL FRAKTUR SMALL E -1D556 ; [.1C25.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL E -1D58A ; [.1C25.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL E -1D5BE ; [.1C25.0020.0005] # MATHEMATICAL SANS-SERIF SMALL E -1D5F2 ; [.1C25.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL E -1D626 ; [.1C25.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL E -1D65A ; [.1C25.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E -1D68E ; [.1C25.0020.0005] # MATHEMATICAL MONOSPACE SMALL E -24D4 ; [.1C25.0020.0006] # CIRCLED LATIN SMALL LETTER E -0045 ; [.1C25.0020.0008] # LATIN CAPITAL LETTER E -FF25 ; [.1C25.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER E -1F114 ; [*0310.0020.0004][.1C25.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER E -2130 ; [.1C25.0020.000B] # SCRIPT CAPITAL E -1D404 ; [.1C25.0020.000B] # MATHEMATICAL BOLD CAPITAL E -1D438 ; [.1C25.0020.000B] # MATHEMATICAL ITALIC CAPITAL E -1D46C ; [.1C25.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL E -1D4D4 ; [.1C25.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL E -1D508 ; [.1C25.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL E -1D53C ; [.1C25.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E -1D570 ; [.1C25.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL E -1D5A4 ; [.1C25.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL E -1D5D8 ; [.1C25.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E -1D60C ; [.1C25.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E -1D640 ; [.1C25.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E -1D674 ; [.1C25.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL E -24BA ; [.1C25.0020.000C] # CIRCLED LATIN CAPITAL LETTER E -1F154 ; [.1C25.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER E -1D49 ; [.1C25.0020.0014] # MODIFIER LETTER SMALL E -2091 ; [.1C25.0020.0015] # LATIN SUBSCRIPT SMALL LETTER E -1D31 ; [.1C25.0020.001D] # MODIFIER LETTER CAPITAL E -1F134 ; [.1C25.0020.001D] # SQUARED LATIN CAPITAL LETTER E -1F174 ; [.1C25.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER E -00E9 ; [.1C25.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH ACUTE -00C9 ; [.1C25.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH ACUTE -00E8 ; [.1C25.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH GRAVE -00C8 ; [.1C25.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH GRAVE -0115 ; [.1C25.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH BREVE -0114 ; [.1C25.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH BREVE -00EA ; [.1C25.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX -00CA ; [.1C25.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -1EBF ; [.1C25.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE -1EBE ; [.1C25.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE -1EC1 ; [.1C25.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC0 ; [.1C25.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC5 ; [.1C25.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE -1EC4 ; [.1C25.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE -1EC3 ; [.1C25.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -1EC2 ; [.1C25.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -011B ; [.1C25.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER E WITH CARON -011A ; [.1C25.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER E WITH CARON -00EB ; [.1C25.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER E WITH DIAERESIS -00CB ; [.1C25.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER E WITH DIAERESIS -1EBD ; [.1C25.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH TILDE -1EBC ; [.1C25.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH TILDE -0117 ; [.1C25.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER E WITH DOT ABOVE -0116 ; [.1C25.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER E WITH DOT ABOVE -0229 ; [.1C25.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER E WITH CEDILLA -0228 ; [.1C25.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER E WITH CEDILLA -1E1D ; [.1C25.0020.0002][.0000.0030.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE -1E1C ; [.1C25.0020.0008][.0000.0030.0002][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE -0119 ; [.1C25.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER E WITH OGONEK -0118 ; [.1C25.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER E WITH OGONEK -0113 ; [.1C25.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER E WITH MACRON -0112 ; [.1C25.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER E WITH MACRON -1E17 ; [.1C25.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH MACRON AND ACUTE -1E16 ; [.1C25.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE -1E15 ; [.1C25.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH MACRON AND GRAVE -1E14 ; [.1C25.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE -1EBB ; [.1C25.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH HOOK ABOVE -1EBA ; [.1C25.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH HOOK ABOVE -0205 ; [.1C25.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER E WITH DOUBLE GRAVE -0204 ; [.1C25.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE -0207 ; [.1C25.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER E WITH INVERTED BREVE -0206 ; [.1C25.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER E WITH INVERTED BREVE -1EB9 ; [.1C25.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER E WITH DOT BELOW -1EB8 ; [.1C25.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER E WITH DOT BELOW -1EC7 ; [.1C25.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1EC6 ; [.1C25.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1E19 ; [.1C25.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW -1E18 ; [.1C25.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW -1E1B ; [.1C25.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER E WITH TILDE BELOW -1E1A ; [.1C25.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER E WITH TILDE BELOW -32CD ; [.1C25.0020.001C][.1DAE.0020.001C][.1C6F.0020.001C] # SQUARE ERG -32CE ; [.1C25.0020.001C][.1E5E.0020.001D] # SQUARE EV -1D07 ; [.1C29.0020.0002] # LATIN LETTER SMALL CAPITAL E -AB32 ; [.1C2A.0020.0002] # LATIN SMALL LETTER BLACKLETTER E -AB33 ; [.1C2B.0020.0002] # LATIN SMALL LETTER BARRED E -0247 ; [.1C2C.0020.0002] # LATIN SMALL LETTER E WITH STROKE -0246 ; [.1C2C.0020.0008] # LATIN CAPITAL LETTER E WITH STROKE -1D92 ; [.1C30.0020.0002] # LATIN SMALL LETTER E WITH RETROFLEX HOOK -AB34 ; [.1C31.0020.0002] # LATIN SMALL LETTER E WITH FLOURISH -2C78 ; [.1C32.0020.0002] # LATIN SMALL LETTER E WITH NOTCH -01DD ; [.1C33.0020.0002] # LATIN SMALL LETTER TURNED E -018E ; [.1C33.0020.0008] # LATIN CAPITAL LETTER REVERSED E -1D32 ; [.1C33.0020.001D] # MODIFIER LETTER CAPITAL REVERSED E -2C7B ; [.1C37.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED E -0259 ; [.1C38.0020.0002] # LATIN SMALL LETTER SCHWA -1DEA ; [.1C38.0020.0004] # COMBINING LATIN SMALL LETTER SCHWA -018F ; [.1C38.0020.0008] # LATIN CAPITAL LETTER SCHWA -1D4A ; [.1C38.0020.0014] # MODIFIER LETTER SMALL SCHWA -2094 ; [.1C38.0020.0015] # LATIN SUBSCRIPT SMALL LETTER SCHWA -1D95 ; [.1C3C.0020.0002] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK -025B ; [.1C3D.0020.0002] # LATIN SMALL LETTER OPEN E -0190 ; [.1C3D.0020.0008] # LATIN CAPITAL LETTER OPEN E -2107 ; [.1C3D.0020.000A] # EULER CONSTANT -1D4B ; [.1C3D.0020.0014] # MODIFIER LETTER SMALL OPEN E -1D93 ; [.1C41.0020.0002] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK -0258 ; [.1C42.0020.0002] # LATIN SMALL LETTER REVERSED E -025A ; [.1C46.0020.0002] # LATIN SMALL LETTER SCHWA WITH HOOK -025C ; [.1C4A.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E -A7AB ; [.1C4A.0020.0008] # LATIN CAPITAL LETTER REVERSED OPEN E -1D9F ; [.1C4A.0020.0014] # MODIFIER LETTER SMALL REVERSED OPEN E -1D94 ; [.1C4E.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK -1D08 ; [.1C4F.0020.0002] # LATIN SMALL LETTER TURNED OPEN E -1D4C ; [.1C4F.0020.0014] # MODIFIER LETTER SMALL TURNED OPEN E -025D ; [.1C50.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK -025E ; [.1C54.0020.0002] # LATIN SMALL LETTER CLOSED REVERSED OPEN E -029A ; [.1C58.0020.0002] # LATIN SMALL LETTER CLOSED OPEN E -0264 ; [.1C5C.0020.0002] # LATIN SMALL LETTER RAMS HORN -0066 ; [.1C60.0020.0002] # LATIN SMALL LETTER F -FF46 ; [.1C60.0020.0003] # FULLWIDTH LATIN SMALL LETTER F -1DEB ; [.1C60.0020.0004] # COMBINING LATIN SMALL LETTER F -24A1 ; [*0310.0020.0004][.1C60.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER F -1D41F ; [.1C60.0020.0005] # MATHEMATICAL BOLD SMALL F -1D453 ; [.1C60.0020.0005] # MATHEMATICAL ITALIC SMALL F -1D487 ; [.1C60.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL F -1D4BB ; [.1C60.0020.0005] # MATHEMATICAL SCRIPT SMALL F -1D4EF ; [.1C60.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL F -1D523 ; [.1C60.0020.0005] # MATHEMATICAL FRAKTUR SMALL F -1D557 ; [.1C60.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL F -1D58B ; [.1C60.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL F -1D5BF ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF SMALL F -1D5F3 ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL F -1D627 ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL F -1D65B ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F -1D68F ; [.1C60.0020.0005] # MATHEMATICAL MONOSPACE SMALL F -24D5 ; [.1C60.0020.0006] # CIRCLED LATIN SMALL LETTER F -0046 ; [.1C60.0020.0008] # LATIN CAPITAL LETTER F -FF26 ; [.1C60.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER F -2109 ; [*04D7.0020.0004][.1C60.0020.000A] # DEGREE FAHRENHEIT -1F115 ; [*0310.0020.0004][.1C60.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER F -2131 ; [.1C60.0020.000B] # SCRIPT CAPITAL F -1D405 ; [.1C60.0020.000B] # MATHEMATICAL BOLD CAPITAL F -1D439 ; [.1C60.0020.000B] # MATHEMATICAL ITALIC CAPITAL F -1D46D ; [.1C60.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL F -1D4D5 ; [.1C60.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL F -1D509 ; [.1C60.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL F -1D53D ; [.1C60.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F -1D571 ; [.1C60.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL F -1D5A5 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL F -1D5D9 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F -1D60D ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F -1D641 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F -1D675 ; [.1C60.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL F -24BB ; [.1C60.0020.000C] # CIRCLED LATIN CAPITAL LETTER F -1F155 ; [.1C60.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER F -1DA0 ; [.1C60.0020.0014] # MODIFIER LETTER SMALL F -1F135 ; [.1C60.0020.001D] # SQUARED LATIN CAPITAL LETTER F -1F175 ; [.1C60.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER F -1E1F ; [.1C60.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER F WITH DOT ABOVE -1E1E ; [.1C60.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER F WITH DOT ABOVE -A77C ; [.1C60.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR F -A77B ; [.1C60.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR F -213B ; [.1C60.0020.000A][.1BC2.0020.000A][.1E7A.0020.000A] # FACSIMILE SIGN -FB00 ; [.1C60.0020.0004][.1C60.0020.0004] # LATIN SMALL LIGATURE FF -FB03 ; [.1C60.0020.0004][.1C60.0020.0004][.1CAD.0020.0004] # LATIN SMALL LIGATURE FFI -FB04 ; [.1C60.0020.0004][.1C60.0020.0004][.1CF2.0020.0004] # LATIN SMALL LIGATURE FFL -FB01 ; [.1C60.0020.0004][.1CAD.0020.0004] # LATIN SMALL LIGATURE FI -FB02 ; [.1C60.0020.0004][.1CF2.0020.0004] # LATIN SMALL LIGATURE FL -3399 ; [.1C60.0020.001C][.1D25.0020.001C] # SQUARE FM -02A9 ; [.1C60.0020.0004][.1D53.0020.0004] # LATIN SMALL LETTER FENG DIGRAPH -1F193 ; [.1C60.0020.001D][.1DAE.0020.001D][.1C25.0020.001D][.1C25.0020.001D] # SQUARED FREE -A730 ; [.1C64.0020.0002] # LATIN LETTER SMALL CAPITAL F -AB35 ; [.1C65.0020.0002] # LATIN SMALL LETTER LENIS F -A799 ; [.1C66.0020.0002] # LATIN SMALL LETTER F WITH STROKE -A798 ; [.1C66.0020.0008] # LATIN CAPITAL LETTER F WITH STROKE -1D6E ; [.1C67.0020.0002] # LATIN SMALL LETTER F WITH MIDDLE TILDE -1D82 ; [.1C68.0020.0002] # LATIN SMALL LETTER F WITH PALATAL HOOK -0192 ; [.1C69.0020.0002] # LATIN SMALL LETTER F WITH HOOK -0191 ; [.1C69.0020.0008] # LATIN CAPITAL LETTER F WITH HOOK -214E ; [.1C6D.0020.0002] # TURNED SMALL F -2132 ; [.1C6D.0020.0008] # TURNED CAPITAL F -A7FB ; [.1C6E.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED F -0067 ; [.1C6F.0020.0002] # LATIN SMALL LETTER G -FF47 ; [.1C6F.0020.0003] # FULLWIDTH LATIN SMALL LETTER G -1DDA ; [.1C6F.0020.0004] # COMBINING LATIN SMALL LETTER G -24A2 ; [*0310.0020.0004][.1C6F.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER G -210A ; [.1C6F.0020.0005] # SCRIPT SMALL G -1D420 ; [.1C6F.0020.0005] # MATHEMATICAL BOLD SMALL G -1D454 ; [.1C6F.0020.0005] # MATHEMATICAL ITALIC SMALL G -1D488 ; [.1C6F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL G -1D4F0 ; [.1C6F.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL G -1D524 ; [.1C6F.0020.0005] # MATHEMATICAL FRAKTUR SMALL G -1D558 ; [.1C6F.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL G -1D58C ; [.1C6F.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL G -1D5C0 ; [.1C6F.0020.0005] # MATHEMATICAL SANS-SERIF SMALL G -1D5F4 ; [.1C6F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL G -1D628 ; [.1C6F.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL G -1D65C ; [.1C6F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G -1D690 ; [.1C6F.0020.0005] # MATHEMATICAL MONOSPACE SMALL G -24D6 ; [.1C6F.0020.0006] # CIRCLED LATIN SMALL LETTER G -0047 ; [.1C6F.0020.0008] # LATIN CAPITAL LETTER G -FF27 ; [.1C6F.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER G -1F116 ; [*0310.0020.0004][.1C6F.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER G -1D406 ; [.1C6F.0020.000B] # MATHEMATICAL BOLD CAPITAL G -1D43A ; [.1C6F.0020.000B] # MATHEMATICAL ITALIC CAPITAL G -1D46E ; [.1C6F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL G -1D4A2 ; [.1C6F.0020.000B] # MATHEMATICAL SCRIPT CAPITAL G -1D4D6 ; [.1C6F.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL G -1D50A ; [.1C6F.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL G -1D53E ; [.1C6F.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D572 ; [.1C6F.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL G -1D5A6 ; [.1C6F.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL G -1D5DA ; [.1C6F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G -1D60E ; [.1C6F.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G -1D642 ; [.1C6F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G -1D676 ; [.1C6F.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL G -24BC ; [.1C6F.0020.000C] # CIRCLED LATIN CAPITAL LETTER G -1F156 ; [.1C6F.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER G -1D4D ; [.1C6F.0020.0014] # MODIFIER LETTER SMALL G -1D33 ; [.1C6F.0020.001D] # MODIFIER LETTER CAPITAL G -1F136 ; [.1C6F.0020.001D] # SQUARED LATIN CAPITAL LETTER G -1F176 ; [.1C6F.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER G -01F5 ; [.1C6F.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER G WITH ACUTE -01F4 ; [.1C6F.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER G WITH ACUTE -011F ; [.1C6F.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER G WITH BREVE -011E ; [.1C6F.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER G WITH BREVE -011D ; [.1C6F.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER G WITH CIRCUMFLEX -011C ; [.1C6F.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX -01E7 ; [.1C6F.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER G WITH CARON -01E6 ; [.1C6F.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER G WITH CARON -0121 ; [.1C6F.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER G WITH DOT ABOVE -0120 ; [.1C6F.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER G WITH DOT ABOVE -0123 ; [.1C6F.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER G WITH CEDILLA -0122 ; [.1C6F.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER G WITH CEDILLA -1E21 ; [.1C6F.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER G WITH MACRON -1E20 ; [.1C6F.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER G WITH MACRON -A7A1 ; [.1C6F.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER G WITH OBLIQUE STROKE -A7A0 ; [.1C6F.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE -1D79 ; [.1C6F.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR G -A77D ; [.1C6F.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR G -33FF ; [.1C6F.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] # SQUARE GAL -3387 ; [.1C6F.0020.001D][.1BDB.0020.001D] # SQUARE GB -3393 ; [.1C6F.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] # SQUARE GHZ -33AC ; [.1C6F.0020.001D][.1D87.0020.001D][.1BC2.0020.001C] # SQUARE GPA -33C9 ; [.1C6F.0020.001D][.1E86.0020.001C] # SQUARE GY -0261 ; [.1C73.0020.0002] # LATIN SMALL LETTER SCRIPT G -A7AC ; [.1C73.0020.0008] # LATIN CAPITAL LETTER SCRIPT G -1DA2 ; [.1C73.0020.0014] # MODIFIER LETTER SMALL SCRIPT G -AB36 ; [.1C77.0020.0002] # LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL -0262 ; [.1C78.0020.0002] # LATIN LETTER SMALL CAPITAL G -1DDB ; [.1C78.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL G -01E5 ; [.1C7C.0020.0002] # LATIN SMALL LETTER G WITH STROKE -01E4 ; [.1C7C.0020.0008] # LATIN CAPITAL LETTER G WITH STROKE -1D83 ; [.1C80.0020.0002] # LATIN SMALL LETTER G WITH PALATAL HOOK -0260 ; [.1C81.0020.0002] # LATIN SMALL LETTER G WITH HOOK -0193 ; [.1C81.0020.0008] # LATIN CAPITAL LETTER G WITH HOOK -029B ; [.1C85.0020.0002] # LATIN LETTER SMALL CAPITAL G WITH HOOK -1D77 ; [.1C89.0020.0002] # LATIN SMALL LETTER TURNED G -A77F ; [.1C8A.0020.0002] # LATIN SMALL LETTER TURNED INSULAR G -A77E ; [.1C8A.0020.0008] # LATIN CAPITAL LETTER TURNED INSULAR G -0263 ; [.1C8B.0020.0002] # LATIN SMALL LETTER GAMMA -0194 ; [.1C8B.0020.0008] # LATIN CAPITAL LETTER GAMMA -02E0 ; [.1C8B.0020.0014] # MODIFIER LETTER SMALL GAMMA -01A3 ; [.1C8F.0020.0002] # LATIN SMALL LETTER OI -01A2 ; [.1C8F.0020.0008] # LATIN CAPITAL LETTER OI -0068 ; [.1C93.0020.0002] # LATIN SMALL LETTER H -FF48 ; [.1C93.0020.0003] # FULLWIDTH LATIN SMALL LETTER H -036A ; [.1C93.0020.0004] # COMBINING LATIN SMALL LETTER H -24A3 ; [*0310.0020.0004][.1C93.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER H -210E ; [.1C93.0020.0005] # PLANCK CONSTANT -1D421 ; [.1C93.0020.0005] # MATHEMATICAL BOLD SMALL H -1D489 ; [.1C93.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL H -1D4BD ; [.1C93.0020.0005] # MATHEMATICAL SCRIPT SMALL H -1D4F1 ; [.1C93.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL H -1D525 ; [.1C93.0020.0005] # MATHEMATICAL FRAKTUR SMALL H -1D559 ; [.1C93.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL H -1D58D ; [.1C93.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL H -1D5C1 ; [.1C93.0020.0005] # MATHEMATICAL SANS-SERIF SMALL H -1D5F5 ; [.1C93.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL H -1D629 ; [.1C93.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL H -1D65D ; [.1C93.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H -1D691 ; [.1C93.0020.0005] # MATHEMATICAL MONOSPACE SMALL H -24D7 ; [.1C93.0020.0006] # CIRCLED LATIN SMALL LETTER H -0048 ; [.1C93.0020.0008] # LATIN CAPITAL LETTER H -FF28 ; [.1C93.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER H -1F117 ; [*0310.0020.0004][.1C93.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER H -210B ; [.1C93.0020.000B] # SCRIPT CAPITAL H -210C ; [.1C93.0020.000B] # BLACK-LETTER CAPITAL H -210D ; [.1C93.0020.000B] # DOUBLE-STRUCK CAPITAL H -1D407 ; [.1C93.0020.000B] # MATHEMATICAL BOLD CAPITAL H -1D43B ; [.1C93.0020.000B] # MATHEMATICAL ITALIC CAPITAL H -1D46F ; [.1C93.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL H -1D4D7 ; [.1C93.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL H -1D573 ; [.1C93.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL H -1D5A7 ; [.1C93.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL H -1D5DB ; [.1C93.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H -1D60F ; [.1C93.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H -1D643 ; [.1C93.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H -1D677 ; [.1C93.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL H -24BD ; [.1C93.0020.000C] # CIRCLED LATIN CAPITAL LETTER H -1F157 ; [.1C93.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H -02B0 ; [.1C93.0020.0014] # MODIFIER LETTER SMALL H -2095 ; [.1C93.0020.0015] # LATIN SUBSCRIPT SMALL LETTER H -1D34 ; [.1C93.0020.001D] # MODIFIER LETTER CAPITAL H -1F137 ; [.1C93.0020.001D] # SQUARED LATIN CAPITAL LETTER H -1F177 ; [.1C93.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER H -0125 ; [.1C93.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER H WITH CIRCUMFLEX -0124 ; [.1C93.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX -021F ; [.1C93.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER H WITH CARON -021E ; [.1C93.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER H WITH CARON -1E27 ; [.1C93.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER H WITH DIAERESIS -1E26 ; [.1C93.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER H WITH DIAERESIS -1E23 ; [.1C93.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER H WITH DOT ABOVE -1E22 ; [.1C93.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER H WITH DOT ABOVE -1E29 ; [.1C93.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER H WITH CEDILLA -1E28 ; [.1C93.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER H WITH CEDILLA -0127 ; [.1C93.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER H WITH STROKE -210F ; [.1C93.0020.0002][.0000.0039.0002] # PLANCK CONSTANT OVER TWO PI -0126 ; [.1C93.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER H WITH STROKE -A7F8 ; [.1C93.0020.0014][.0000.0039.0014] # MODIFIER LETTER CAPITAL H WITH STROKE -1E25 ; [.1C93.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER H WITH DOT BELOW -1E24 ; [.1C93.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER H WITH DOT BELOW -1E2B ; [.1C93.0020.0002][.0000.0047.0002] # LATIN SMALL LETTER H WITH BREVE BELOW -1E2A ; [.1C93.0020.0008][.0000.0047.0002] # LATIN CAPITAL LETTER H WITH BREVE BELOW -1E96 ; [.1C93.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER H WITH LINE BELOW -33CA ; [.1C93.0020.001C][.1BC2.0020.001C] # SQUARE HA -32CC ; [.1C93.0020.001D][.1C6F.0020.001C] # SQUARE HG -33CB ; [.1C93.0020.001D][.1D87.0020.001D] # SQUARE HP -3371 ; [.1C93.0020.001C][.1D87.0020.001D][.1BC2.0020.001C] # SQUARE HPA -1F14A ; [.1C93.0020.001D][.1E5E.0020.001D] # SQUARED HV -3390 ; [.1C93.0020.001D][.1E9C.0020.001C] # SQUARE HZ -029C ; [.1C97.0020.0002] # LATIN LETTER SMALL CAPITAL H -0195 ; [.1C9B.0020.0002] # LATIN SMALL LETTER HV -01F6 ; [.1C9B.0020.0008] # LATIN CAPITAL LETTER HWAIR -A795 ; [.1C9F.0020.0002] # LATIN SMALL LETTER H WITH PALATAL HOOK -0266 ; [.1CA0.0020.0002] # LATIN SMALL LETTER H WITH HOOK -A7AA ; [.1CA0.0020.0008] # LATIN CAPITAL LETTER H WITH HOOK -02B1 ; [.1CA0.0020.0014] # MODIFIER LETTER SMALL H WITH HOOK -2C68 ; [.1CA4.0020.0002] # LATIN SMALL LETTER H WITH DESCENDER -2C67 ; [.1CA4.0020.0008] # LATIN CAPITAL LETTER H WITH DESCENDER -2C76 ; [.1CA5.0020.0002] # LATIN SMALL LETTER HALF H -2C75 ; [.1CA5.0020.0008] # LATIN CAPITAL LETTER HALF H -A727 ; [.1CA6.0020.0002] # LATIN SMALL LETTER HENG -A726 ; [.1CA6.0020.0008] # LATIN CAPITAL LETTER HENG -AB5C ; [.1CA6.0020.0014] # MODIFIER LETTER SMALL HENG -0267 ; [.1CA7.0020.0002] # LATIN SMALL LETTER HENG WITH HOOK -02BB ; [.1CAB.0020.0002] # MODIFIER LETTER TURNED COMMA -02BD ; [.1CAC.0020.0002] # MODIFIER LETTER REVERSED COMMA -0069 ; [.1CAD.0020.0002] # LATIN SMALL LETTER I -FF49 ; [.1CAD.0020.0003] # FULLWIDTH LATIN SMALL LETTER I -0365 ; [.1CAD.0020.0004] # COMBINING LATIN SMALL LETTER I -2170 ; [.1CAD.0020.0004] # SMALL ROMAN NUMERAL ONE -24A4 ; [*0310.0020.0004][.1CAD.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER I -2139 ; [.1CAD.0020.0005] # INFORMATION SOURCE -2148 ; [.1CAD.0020.0005] # DOUBLE-STRUCK ITALIC SMALL I -1D422 ; [.1CAD.0020.0005] # MATHEMATICAL BOLD SMALL I -1D456 ; [.1CAD.0020.0005] # MATHEMATICAL ITALIC SMALL I -1D48A ; [.1CAD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL I -1D4BE ; [.1CAD.0020.0005] # MATHEMATICAL SCRIPT SMALL I -1D4F2 ; [.1CAD.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL I -1D526 ; [.1CAD.0020.0005] # MATHEMATICAL FRAKTUR SMALL I -1D55A ; [.1CAD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL I -1D58E ; [.1CAD.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL I -1D5C2 ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF SMALL I -1D5F6 ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL I -1D62A ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL I -1D65E ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I -1D692 ; [.1CAD.0020.0005] # MATHEMATICAL MONOSPACE SMALL I -24D8 ; [.1CAD.0020.0006] # CIRCLED LATIN SMALL LETTER I -0049 ; [.1CAD.0020.0008] # LATIN CAPITAL LETTER I -FF29 ; [.1CAD.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER I -2160 ; [.1CAD.0020.000A] # ROMAN NUMERAL ONE -1F118 ; [*0310.0020.0004][.1CAD.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER I -2110 ; [.1CAD.0020.000B] # SCRIPT CAPITAL I -2111 ; [.1CAD.0020.000B] # BLACK-LETTER CAPITAL I -1D408 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD CAPITAL I -1D43C ; [.1CAD.0020.000B] # MATHEMATICAL ITALIC CAPITAL I -1D470 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL I -1D4D8 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL I -1D540 ; [.1CAD.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I -1D574 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL I -1D5A8 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL I -1D5DC ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I -1D610 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I -1D644 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I -1D678 ; [.1CAD.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL I -24BE ; [.1CAD.0020.000C] # CIRCLED LATIN CAPITAL LETTER I -1F158 ; [.1CAD.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER I -2071 ; [.1CAD.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER I -1D62 ; [.1CAD.0020.0015] # LATIN SUBSCRIPT SMALL LETTER I -1D35 ; [.1CAD.0020.001D] # MODIFIER LETTER CAPITAL I -1F138 ; [.1CAD.0020.001D] # SQUARED LATIN CAPITAL LETTER I -1F178 ; [.1CAD.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER I -00ED ; [.1CAD.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH ACUTE -00CD ; [.1CAD.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH ACUTE -00EC ; [.1CAD.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER I WITH GRAVE -00CC ; [.1CAD.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER I WITH GRAVE -012D ; [.1CAD.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER I WITH BREVE -012C ; [.1CAD.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER I WITH BREVE -00EE ; [.1CAD.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER I WITH CIRCUMFLEX -00CE ; [.1CAD.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -01D0 ; [.1CAD.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER I WITH CARON -01CF ; [.1CAD.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER I WITH CARON -00EF ; [.1CAD.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER I WITH DIAERESIS -00CF ; [.1CAD.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS -1E2F ; [.1CAD.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE -1E2E ; [.1CAD.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE -0129 ; [.1CAD.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER I WITH TILDE -0128 ; [.1CAD.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER I WITH TILDE -0130 ; [.1CAD.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER I WITH DOT ABOVE -012F ; [.1CAD.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER I WITH OGONEK -012E ; [.1CAD.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER I WITH OGONEK -012B ; [.1CAD.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER I WITH MACRON -012A ; [.1CAD.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER I WITH MACRON -1EC9 ; [.1CAD.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER I WITH HOOK ABOVE -1EC8 ; [.1CAD.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER I WITH HOOK ABOVE -0209 ; [.1CAD.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER I WITH DOUBLE GRAVE -0208 ; [.1CAD.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE -020B ; [.1CAD.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER I WITH INVERTED BREVE -020A ; [.1CAD.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER I WITH INVERTED BREVE -1ECB ; [.1CAD.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER I WITH DOT BELOW -1ECA ; [.1CAD.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER I WITH DOT BELOW -1E2D ; [.1CAD.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER I WITH TILDE BELOW -1E2C ; [.1CAD.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER I WITH TILDE BELOW -1F18B ; [.1CAD.0020.001D][.1BF5.0020.001D] # NEGATIVE SQUARED IC -1F194 ; [.1CAD.0020.001D][.1C0A.0020.001D] # SQUARED ID -2171 ; [.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL TWO -2161 ; [.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL TWO -2172 ; [.1CAD.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL THREE -2162 ; [.1CAD.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL THREE -0133 ; [.1CAD.0020.0004][.1CC7.0020.0004] # LATIN SMALL LIGATURE IJ -0132 ; [.1CAD.0020.000A][.1CC7.0020.000A] # LATIN CAPITAL LIGATURE IJ -33CC ; [.1CAD.0020.001C][.1D34.0020.001C] # SQUARE IN -337A ; [.1CAD.0020.001D][.1E30.0020.001D] # SQUARE IU -2173 ; [.1CAD.0020.0004][.1E5E.0020.0004] # SMALL ROMAN NUMERAL FOUR -2163 ; [.1CAD.0020.000A][.1E5E.0020.000A] # ROMAN NUMERAL FOUR -2178 ; [.1CAD.0020.0004][.1E7A.0020.0004] # SMALL ROMAN NUMERAL NINE -2168 ; [.1CAD.0020.000A][.1E7A.0020.000A] # ROMAN NUMERAL NINE -0131 ; [.1CB1.0020.0002] # LATIN SMALL LETTER DOTLESS I -1D6A4 ; [.1CB1.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS I -026A ; [.1CB5.0020.0002] # LATIN LETTER SMALL CAPITAL I -1DA6 ; [.1CB5.0020.0014] # MODIFIER LETTER SMALL CAPITAL I -A7FE ; [.1CB9.0020.0002] # LATIN EPIGRAPHIC LETTER I LONGA -A7F7 ; [.1CBA.0020.0002] # LATIN EPIGRAPHIC LETTER SIDEWAYS I -1D09 ; [.1CBB.0020.0002] # LATIN SMALL LETTER TURNED I -1D4E ; [.1CBB.0020.0014] # MODIFIER LETTER SMALL TURNED I -0268 ; [.1CBC.0020.0002] # LATIN SMALL LETTER I WITH STROKE -0197 ; [.1CBC.0020.0008] # LATIN CAPITAL LETTER I WITH STROKE -1DA4 ; [.1CBC.0020.0014] # MODIFIER LETTER SMALL I WITH STROKE -1D7B ; [.1CC0.0020.0002] # LATIN SMALL CAPITAL LETTER I WITH STROKE -1DA7 ; [.1CC0.0020.0014] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE -1D96 ; [.1CC1.0020.0002] # LATIN SMALL LETTER I WITH RETROFLEX HOOK -0269 ; [.1CC2.0020.0002] # LATIN SMALL LETTER IOTA -0196 ; [.1CC2.0020.0008] # LATIN CAPITAL LETTER IOTA -1DA5 ; [.1CC2.0020.0014] # MODIFIER LETTER SMALL IOTA -1D7C ; [.1CC6.0020.0002] # LATIN SMALL LETTER IOTA WITH STROKE -006A ; [.1CC7.0020.0002] # LATIN SMALL LETTER J -FF4A ; [.1CC7.0020.0003] # FULLWIDTH LATIN SMALL LETTER J -24A5 ; [*0310.0020.0004][.1CC7.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER J -2149 ; [.1CC7.0020.0005] # DOUBLE-STRUCK ITALIC SMALL J -1D423 ; [.1CC7.0020.0005] # MATHEMATICAL BOLD SMALL J -1D457 ; [.1CC7.0020.0005] # MATHEMATICAL ITALIC SMALL J -1D48B ; [.1CC7.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL J -1D4BF ; [.1CC7.0020.0005] # MATHEMATICAL SCRIPT SMALL J -1D4F3 ; [.1CC7.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL J -1D527 ; [.1CC7.0020.0005] # MATHEMATICAL FRAKTUR SMALL J -1D55B ; [.1CC7.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL J -1D58F ; [.1CC7.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL J -1D5C3 ; [.1CC7.0020.0005] # MATHEMATICAL SANS-SERIF SMALL J -1D5F7 ; [.1CC7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL J -1D62B ; [.1CC7.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL J -1D65F ; [.1CC7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J -1D693 ; [.1CC7.0020.0005] # MATHEMATICAL MONOSPACE SMALL J -24D9 ; [.1CC7.0020.0006] # CIRCLED LATIN SMALL LETTER J -004A ; [.1CC7.0020.0008] # LATIN CAPITAL LETTER J -FF2A ; [.1CC7.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER J -1F119 ; [*0310.0020.0004][.1CC7.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER J -1D409 ; [.1CC7.0020.000B] # MATHEMATICAL BOLD CAPITAL J -1D43D ; [.1CC7.0020.000B] # MATHEMATICAL ITALIC CAPITAL J -1D471 ; [.1CC7.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL J -1D4A5 ; [.1CC7.0020.000B] # MATHEMATICAL SCRIPT CAPITAL J -1D4D9 ; [.1CC7.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL J -1D50D ; [.1CC7.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL J -1D541 ; [.1CC7.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J -1D575 ; [.1CC7.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL J -1D5A9 ; [.1CC7.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL J -1D5DD ; [.1CC7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J -1D611 ; [.1CC7.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J -1D645 ; [.1CC7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J -1D679 ; [.1CC7.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL J -24BF ; [.1CC7.0020.000C] # CIRCLED LATIN CAPITAL LETTER J -1F159 ; [.1CC7.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER J -02B2 ; [.1CC7.0020.0014] # MODIFIER LETTER SMALL J -2C7C ; [.1CC7.0020.0015] # LATIN SUBSCRIPT SMALL LETTER J -1D36 ; [.1CC7.0020.001D] # MODIFIER LETTER CAPITAL J -1F139 ; [.1CC7.0020.001D] # SQUARED LATIN CAPITAL LETTER J -1F179 ; [.1CC7.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER J -0135 ; [.1CC7.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER J WITH CIRCUMFLEX -0134 ; [.1CC7.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX -01F0 ; [.1CC7.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER J WITH CARON -0237 ; [.1CCB.0020.0002] # LATIN SMALL LETTER DOTLESS J -1D6A5 ; [.1CCB.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS J -1D0A ; [.1CCF.0020.0002] # LATIN LETTER SMALL CAPITAL J -0249 ; [.1CD0.0020.0002] # LATIN SMALL LETTER J WITH STROKE -0248 ; [.1CD0.0020.0008] # LATIN CAPITAL LETTER J WITH STROKE -029D ; [.1CD4.0020.0002] # LATIN SMALL LETTER J WITH CROSSED-TAIL -A7B2 ; [.1CD4.0020.0008] # LATIN CAPITAL LETTER J WITH CROSSED-TAIL -1DA8 ; [.1CD4.0020.0014] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL -025F ; [.1CD8.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE -1DA1 ; [.1CD8.0020.0014] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE -0284 ; [.1CDC.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK -006B ; [.1CE0.0020.0002] # LATIN SMALL LETTER K -FF4B ; [.1CE0.0020.0003] # FULLWIDTH LATIN SMALL LETTER K -1DDC ; [.1CE0.0020.0004] # COMBINING LATIN SMALL LETTER K -24A6 ; [*0310.0020.0004][.1CE0.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER K -1D424 ; [.1CE0.0020.0005] # MATHEMATICAL BOLD SMALL K -1D458 ; [.1CE0.0020.0005] # MATHEMATICAL ITALIC SMALL K -1D48C ; [.1CE0.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL K -1D4C0 ; [.1CE0.0020.0005] # MATHEMATICAL SCRIPT SMALL K -1D4F4 ; [.1CE0.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL K -1D528 ; [.1CE0.0020.0005] # MATHEMATICAL FRAKTUR SMALL K -1D55C ; [.1CE0.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL K -1D590 ; [.1CE0.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL K -1D5C4 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF SMALL K -1D5F8 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL K -1D62C ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL K -1D660 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K -1D694 ; [.1CE0.0020.0005] # MATHEMATICAL MONOSPACE SMALL K -24DA ; [.1CE0.0020.0006] # CIRCLED LATIN SMALL LETTER K -004B ; [.1CE0.0020.0008] # LATIN CAPITAL LETTER K -212A ; [.1CE0.0020.0008] # KELVIN SIGN -FF2B ; [.1CE0.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER K -1F11A ; [*0310.0020.0004][.1CE0.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER K -1D40A ; [.1CE0.0020.000B] # MATHEMATICAL BOLD CAPITAL K -1D43E ; [.1CE0.0020.000B] # MATHEMATICAL ITALIC CAPITAL K -1D472 ; [.1CE0.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL K -1D4A6 ; [.1CE0.0020.000B] # MATHEMATICAL SCRIPT CAPITAL K -1D4DA ; [.1CE0.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL K -1D50E ; [.1CE0.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL K -1D542 ; [.1CE0.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K -1D576 ; [.1CE0.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL K -1D5AA ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL K -1D5DE ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K -1D612 ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K -1D646 ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K -1D67A ; [.1CE0.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL K -24C0 ; [.1CE0.0020.000C] # CIRCLED LATIN CAPITAL LETTER K -1F15A ; [.1CE0.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER K -1D4F ; [.1CE0.0020.0014] # MODIFIER LETTER SMALL K -2096 ; [.1CE0.0020.0015] # LATIN SUBSCRIPT SMALL LETTER K -1D37 ; [.1CE0.0020.001D] # MODIFIER LETTER CAPITAL K -1F13A ; [.1CE0.0020.001D] # SQUARED LATIN CAPITAL LETTER K -1F17A ; [.1CE0.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER K -1E31 ; [.1CE0.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER K WITH ACUTE -1E30 ; [.1CE0.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER K WITH ACUTE -01E9 ; [.1CE0.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER K WITH CARON -01E8 ; [.1CE0.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER K WITH CARON -0137 ; [.1CE0.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER K WITH CEDILLA -0136 ; [.1CE0.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER K WITH CEDILLA -A7A3 ; [.1CE0.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER K WITH OBLIQUE STROKE -A7A2 ; [.1CE0.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE -1E33 ; [.1CE0.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER K WITH DOT BELOW -1E32 ; [.1CE0.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER K WITH DOT BELOW -1E35 ; [.1CE0.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER K WITH LINE BELOW -1E34 ; [.1CE0.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER K WITH LINE BELOW -3384 ; [.1CE0.0020.001C][.1BC2.0020.001D] # SQUARE KA -3385 ; [.1CE0.0020.001D][.1BDB.0020.001D] # SQUARE KB -3389 ; [.1CE0.0020.001C][.1BF5.0020.001C][.1BC2.0020.001C][.1CF2.0020.001C] # SQUARE KCAL -338F ; [.1CE0.0020.001C][.1C6F.0020.001C] # SQUARE KG -3391 ; [.1CE0.0020.001C][.1C93.0020.001D][.1E9C.0020.001C] # SQUARE KHZ -33CD ; [.1CE0.0020.001D][.1CE0.0020.001D] # SQUARE KK -3398 ; [.1CE0.0020.001C][.1CF2.0020.001C] # SQUARE KL -339E ; [.1CE0.0020.001C][.1D25.0020.001C] # SQUARE KM -33CE ; [.1CE0.0020.001D][.1D25.0020.001D] # SQUARE KM CAPITAL -33A2 ; [.1CE0.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] # SQUARE KM SQUARED -33A6 ; [.1CE0.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] # SQUARE KM CUBED -33AA ; [.1CE0.0020.001C][.1D87.0020.001D][.1BC2.0020.001C] # SQUARE KPA -33CF ; [.1CE0.0020.001C][.1E10.0020.001C] # SQUARE KT -33B8 ; [.1CE0.0020.001C][.1E5E.0020.001D] # SQUARE KV -33BE ; [.1CE0.0020.001C][.1E70.0020.001D] # SQUARE KW -33C0 ; [.1CE0.0020.001C][.1F5C.0020.001D] # SQUARE K OHM -1D0B ; [.1CE4.0020.0002] # LATIN LETTER SMALL CAPITAL K -1D84 ; [.1CE5.0020.0002] # LATIN SMALL LETTER K WITH PALATAL HOOK -0199 ; [.1CE6.0020.0002] # LATIN SMALL LETTER K WITH HOOK -0198 ; [.1CE6.0020.0008] # LATIN CAPITAL LETTER K WITH HOOK -2C6A ; [.1CEA.0020.0002] # LATIN SMALL LETTER K WITH DESCENDER -2C69 ; [.1CEA.0020.0008] # LATIN CAPITAL LETTER K WITH DESCENDER -A741 ; [.1CEB.0020.0002] # LATIN SMALL LETTER K WITH STROKE -A740 ; [.1CEB.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE -A743 ; [.1CEC.0020.0002] # LATIN SMALL LETTER K WITH DIAGONAL STROKE -A742 ; [.1CEC.0020.0008] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE -A745 ; [.1CED.0020.0002] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE -A744 ; [.1CED.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE -029E ; [.1CEE.0020.0002] # LATIN SMALL LETTER TURNED K -A7B0 ; [.1CEE.0020.0008] # LATIN CAPITAL LETTER TURNED K -006C ; [.1CF2.0020.0002] # LATIN SMALL LETTER L -FF4C ; [.1CF2.0020.0003] # FULLWIDTH LATIN SMALL LETTER L -1DDD ; [.1CF2.0020.0004] # COMBINING LATIN SMALL LETTER L -217C ; [.1CF2.0020.0004] # SMALL ROMAN NUMERAL FIFTY -24A7 ; [*0310.0020.0004][.1CF2.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER L -2113 ; [.1CF2.0020.0005] # SCRIPT SMALL L -1D425 ; [.1CF2.0020.0005] # MATHEMATICAL BOLD SMALL L -1D459 ; [.1CF2.0020.0005] # MATHEMATICAL ITALIC SMALL L -1D48D ; [.1CF2.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL L -1D4C1 ; [.1CF2.0020.0005] # MATHEMATICAL SCRIPT SMALL L -1D4F5 ; [.1CF2.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL L -1D529 ; [.1CF2.0020.0005] # MATHEMATICAL FRAKTUR SMALL L -1D55D ; [.1CF2.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL L -1D591 ; [.1CF2.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL L -1D5C5 ; [.1CF2.0020.0005] # MATHEMATICAL SANS-SERIF SMALL L -1D5F9 ; [.1CF2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL L -1D62D ; [.1CF2.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL L -1D661 ; [.1CF2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L -1D695 ; [.1CF2.0020.0005] # MATHEMATICAL MONOSPACE SMALL L -24DB ; [.1CF2.0020.0006] # CIRCLED LATIN SMALL LETTER L -004C ; [.1CF2.0020.0008] # LATIN CAPITAL LETTER L -FF2C ; [.1CF2.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER L -216C ; [.1CF2.0020.000A] # ROMAN NUMERAL FIFTY -1F11B ; [*0310.0020.0004][.1CF2.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER L -2112 ; [.1CF2.0020.000B] # SCRIPT CAPITAL L -1D40B ; [.1CF2.0020.000B] # MATHEMATICAL BOLD CAPITAL L -1D43F ; [.1CF2.0020.000B] # MATHEMATICAL ITALIC CAPITAL L -1D473 ; [.1CF2.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL L -1D4DB ; [.1CF2.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL L -1D50F ; [.1CF2.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL L -1D543 ; [.1CF2.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L -1D577 ; [.1CF2.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL L -1D5AB ; [.1CF2.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL L -1D5DF ; [.1CF2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L -1D613 ; [.1CF2.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L -1D647 ; [.1CF2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L -1D67B ; [.1CF2.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL L -24C1 ; [.1CF2.0020.000C] # CIRCLED LATIN CAPITAL LETTER L -1F15B ; [.1CF2.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER L -02E1 ; [.1CF2.0020.0014] # MODIFIER LETTER SMALL L -2097 ; [.1CF2.0020.0015] # LATIN SUBSCRIPT SMALL LETTER L -1D38 ; [.1CF2.0020.001D] # MODIFIER LETTER CAPITAL L -1F13B ; [.1CF2.0020.001D] # SQUARED LATIN CAPITAL LETTER L -1F17B ; [.1CF2.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER L -013A ; [.1CF2.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER L WITH ACUTE -0139 ; [.1CF2.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER L WITH ACUTE -013E ; [.1CF2.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER L WITH CARON -013D ; [.1CF2.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER L WITH CARON -013C ; [.1CF2.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER L WITH CEDILLA -013B ; [.1CF2.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER L WITH CEDILLA -0142 ; [.1CF2.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER L WITH STROKE -0141 ; [.1CF2.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER L WITH STROKE -1E37 ; [.1CF2.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER L WITH DOT BELOW -1E36 ; [.1CF2.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW -1E39 ; [.1CF2.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON -1E38 ; [.1CF2.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON -1E3D ; [.1CF2.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW -1E3C ; [.1CF2.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW -1E3B ; [.1CF2.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER L WITH LINE BELOW -1E3A ; [.1CF2.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER L WITH LINE BELOW -0140 ; [.1CF2.0020.0002][.0000.010B.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT -006C 00B7 ; [.1CF2.0020.0002][.0000.010B.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT -006C 0387 ; [.1CF2.0020.0002][.0000.010B.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT -013F ; [.1CF2.0020.0008][.0000.010B.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT -004C 00B7 ; [.1CF2.0020.0008][.0000.010B.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT -004C 0387 ; [.1CF2.0020.0008][.0000.010B.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT -01C9 ; [.1CF2.0020.0004][.1CC7.0020.0004] # LATIN SMALL LETTER LJ -01C8 ; [.1CF2.0020.000A][.1CC7.0020.0004] # LATIN CAPITAL LETTER L WITH SMALL LETTER J -01C7 ; [.1CF2.0020.000A][.1CC7.0020.000A] # LATIN CAPITAL LETTER LJ -1EFB ; [.1CF2.0020.0004][.1CF2.0020.0004] # LATIN SMALL LETTER MIDDLE-WELSH LL -1EFA ; [.1CF2.0020.000A][.1CF2.0020.000A] # LATIN CAPITAL LETTER MIDDLE-WELSH LL -33D0 ; [.1CF2.0020.001C][.1D25.0020.001C] # SQUARE LM -33D1 ; [.1CF2.0020.001C][.1D34.0020.001C] # SQUARE LN -33D2 ; [.1CF2.0020.001C][.1D58.0020.001C][.1C6F.0020.001C] # SQUARE LOG -02AA ; [.1CF2.0020.0004][.1DEC.0020.0004] # LATIN SMALL LETTER LS DIGRAPH -32CF ; [.1CF2.0020.001D][.1E10.0020.001D][.1C0A.0020.001D] # LIMITED LIABILITY SIGN -33D3 ; [.1CF2.0020.001C][.1E7A.0020.001C] # SQUARE LX -02AB ; [.1CF2.0020.0004][.1E9C.0020.0004] # LATIN SMALL LETTER LZ DIGRAPH -029F ; [.1CF6.0020.0002] # LATIN LETTER SMALL CAPITAL L -1DDE ; [.1CF6.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL L -1DAB ; [.1CF6.0020.0014] # MODIFIER LETTER SMALL CAPITAL L -A747 ; [.1CFA.0020.0002] # LATIN SMALL LETTER BROKEN L -A746 ; [.1CFA.0020.0008] # LATIN CAPITAL LETTER BROKEN L -1D0C ; [.1CFB.0020.0002] # LATIN LETTER SMALL CAPITAL L WITH STROKE -A749 ; [.1CFC.0020.0002] # LATIN SMALL LETTER L WITH HIGH STROKE -A748 ; [.1CFC.0020.0008] # LATIN CAPITAL LETTER L WITH HIGH STROKE -019A ; [.1CFD.0020.0002] # LATIN SMALL LETTER L WITH BAR -023D ; [.1CFD.0020.0008] # LATIN CAPITAL LETTER L WITH BAR -2C61 ; [.1D01.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE BAR -2C60 ; [.1D01.0020.0008] # LATIN CAPITAL LETTER L WITH DOUBLE BAR -026B ; [.1D02.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE TILDE -2C62 ; [.1D02.0020.0008] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE -AB5E ; [.1D02.0020.0014] # MODIFIER LETTER SMALL L WITH MIDDLE TILDE -AB38 ; [.1D06.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE -1DEC ; [.1D06.0020.0004] # COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE -AB39 ; [.1D07.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE RING -026C ; [.1D08.0020.0002] # LATIN SMALL LETTER L WITH BELT -A7AD ; [.1D08.0020.0008] # LATIN CAPITAL LETTER L WITH BELT -AB37 ; [.1D0C.0020.0002] # LATIN SMALL LETTER L WITH INVERTED LAZY S -AB5D ; [.1D0C.0020.0014] # MODIFIER LETTER SMALL L WITH INVERTED LAZY S -1D85 ; [.1D0D.0020.0002] # LATIN SMALL LETTER L WITH PALATAL HOOK -1DAA ; [.1D0D.0020.0014] # MODIFIER LETTER SMALL L WITH PALATAL HOOK -026D ; [.1D0E.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK -1DA9 ; [.1D0E.0020.0014] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK -A78E ; [.1D12.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT -0234 ; [.1D13.0020.0002] # LATIN SMALL LETTER L WITH CURL -A772 ; [.1D17.0020.0002] # LATIN SMALL LETTER LUM -026E ; [.1D18.0020.0002] # LATIN SMALL LETTER LEZH -A781 ; [.1D1C.0020.0002] # LATIN SMALL LETTER TURNED L -A780 ; [.1D1C.0020.0008] # LATIN CAPITAL LETTER TURNED L -019B ; [.1D1D.0020.0002] # LATIN SMALL LETTER LAMBDA WITH STROKE -028E ; [.1D21.0020.0002] # LATIN SMALL LETTER TURNED Y -006D ; [.1D25.0020.0002] # LATIN SMALL LETTER M -FF4D ; [.1D25.0020.0003] # FULLWIDTH LATIN SMALL LETTER M -036B ; [.1D25.0020.0004] # COMBINING LATIN SMALL LETTER M -217F ; [.1D25.0020.0004] # SMALL ROMAN NUMERAL ONE THOUSAND -24A8 ; [*0310.0020.0004][.1D25.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER M -1D426 ; [.1D25.0020.0005] # MATHEMATICAL BOLD SMALL M -1D45A ; [.1D25.0020.0005] # MATHEMATICAL ITALIC SMALL M -1D48E ; [.1D25.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL M -1D4C2 ; [.1D25.0020.0005] # MATHEMATICAL SCRIPT SMALL M -1D4F6 ; [.1D25.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL M -1D52A ; [.1D25.0020.0005] # MATHEMATICAL FRAKTUR SMALL M -1D55E ; [.1D25.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL M -1D592 ; [.1D25.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL M -1D5C6 ; [.1D25.0020.0005] # MATHEMATICAL SANS-SERIF SMALL M -1D5FA ; [.1D25.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL M -1D62E ; [.1D25.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL M -1D662 ; [.1D25.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M -1D696 ; [.1D25.0020.0005] # MATHEMATICAL MONOSPACE SMALL M -24DC ; [.1D25.0020.0006] # CIRCLED LATIN SMALL LETTER M -004D ; [.1D25.0020.0008] # LATIN CAPITAL LETTER M -FF2D ; [.1D25.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER M -216F ; [.1D25.0020.000A] # ROMAN NUMERAL ONE THOUSAND -1F11C ; [*0310.0020.0004][.1D25.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER M -2133 ; [.1D25.0020.000B] # SCRIPT CAPITAL M -1D40C ; [.1D25.0020.000B] # MATHEMATICAL BOLD CAPITAL M -1D440 ; [.1D25.0020.000B] # MATHEMATICAL ITALIC CAPITAL M -1D474 ; [.1D25.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL M -1D4DC ; [.1D25.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL M -1D510 ; [.1D25.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL M -1D544 ; [.1D25.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D578 ; [.1D25.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL M -1D5AC ; [.1D25.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL M -1D5E0 ; [.1D25.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M -1D614 ; [.1D25.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M -1D648 ; [.1D25.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M -1D67C ; [.1D25.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL M -24C2 ; [.1D25.0020.000C] # CIRCLED LATIN CAPITAL LETTER M -1F15C ; [.1D25.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER M -1D50 ; [.1D25.0020.0014] # MODIFIER LETTER SMALL M -2098 ; [.1D25.0020.0015] # LATIN SUBSCRIPT SMALL LETTER M -1D39 ; [.1D25.0020.001D] # MODIFIER LETTER CAPITAL M -1F13C ; [.1D25.0020.001D] # SQUARED LATIN CAPITAL LETTER M -1F17C ; [.1D25.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER M -1E3F ; [.1D25.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER M WITH ACUTE -1E3E ; [.1D25.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER M WITH ACUTE -1E41 ; [.1D25.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER M WITH DOT ABOVE -1E40 ; [.1D25.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER M WITH DOT ABOVE -1E43 ; [.1D25.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER M WITH DOT BELOW -1E42 ; [.1D25.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER M WITH DOT BELOW -33A1 ; [.1D25.0020.001C][.1BBA.0020.001C] # SQUARE M SQUARED -33A5 ; [.1D25.0020.001C][.1BBB.0020.001C] # SQUARE M CUBED -3383 ; [.1D25.0020.001C][.1BC2.0020.001D] # SQUARE MA -33D4 ; [.1D25.0020.001C][.1BDB.0020.001C] # SQUARE MB SMALL -3386 ; [.1D25.0020.001D][.1BDB.0020.001D] # SQUARE MB -1F16A ; [.1D25.0020.0014][.1BF5.0020.0014] # RAISED MC SIGN -1F16B ; [.1D25.0020.0014][.1C0A.0020.0014] # RAISED MD SIGN -338E ; [.1D25.0020.001C][.1C6F.0020.001C] # SQUARE MG -3392 ; [.1D25.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] # SQUARE MHZ -33D5 ; [.1D25.0020.001C][.1CAD.0020.001C][.1CF2.0020.001C] # SQUARE MIL -3396 ; [.1D25.0020.001C][.1CF2.0020.001C] # SQUARE ML -339C ; [.1D25.0020.001C][.1D25.0020.001C] # SQUARE MM -339F ; [.1D25.0020.001C][.1D25.0020.001C][.1BBA.0020.001C] # SQUARE MM SQUARED -33A3 ; [.1D25.0020.001C][.1D25.0020.001C][.1BBB.0020.001C] # SQUARE MM CUBED -33D6 ; [.1D25.0020.001C][.1D58.0020.001C][.1CF2.0020.001C] # SQUARE MOL -33AB ; [.1D25.0020.001D][.1D87.0020.001D][.1BC2.0020.001C] # SQUARE MPA -33A7 ; [.1D25.0020.001C][*0605.0020.001C][.1DEC.0020.001C] # SQUARE M OVER S -33B3 ; [.1D25.0020.001C][.1DEC.0020.001C] # SQUARE MS -33A8 ; [.1D25.0020.001C][*0605.0020.001C][.1DEC.0020.001C][.1BBA.0020.001C] # SQUARE M OVER S SQUARED -33B7 ; [.1D25.0020.001C][.1E5E.0020.001D] # SQUARE MV -33B9 ; [.1D25.0020.001D][.1E5E.0020.001D] # SQUARE MV MEGA -1F14B ; [.1D25.0020.001D][.1E5E.0020.001D] # SQUARED MV -33BD ; [.1D25.0020.001C][.1E70.0020.001D] # SQUARE MW -33BF ; [.1D25.0020.001D][.1E70.0020.001D] # SQUARE MW MEGA -33C1 ; [.1D25.0020.001D][.1F5C.0020.001D] # SQUARE M OHM -1D0D ; [.1D29.0020.0002] # LATIN LETTER SMALL CAPITAL M -1DDF ; [.1D29.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL M -1D6F ; [.1D2A.0020.0002] # LATIN SMALL LETTER M WITH MIDDLE TILDE -1D86 ; [.1D2B.0020.0002] # LATIN SMALL LETTER M WITH PALATAL HOOK -0271 ; [.1D2C.0020.0002] # LATIN SMALL LETTER M WITH HOOK -2C6E ; [.1D2C.0020.0008] # LATIN CAPITAL LETTER M WITH HOOK -1DAC ; [.1D2C.0020.0014] # MODIFIER LETTER SMALL M WITH HOOK -AB3A ; [.1D30.0020.0002] # LATIN SMALL LETTER M WITH CROSSED-TAIL -A7FD ; [.1D31.0020.0002] # LATIN EPIGRAPHIC LETTER INVERTED M -A7FF ; [.1D32.0020.0002] # LATIN EPIGRAPHIC LETTER ARCHAIC M -A773 ; [.1D33.0020.0002] # LATIN SMALL LETTER MUM -006E ; [.1D34.0020.0002] # LATIN SMALL LETTER N -FF4E ; [.1D34.0020.0003] # FULLWIDTH LATIN SMALL LETTER N -1DE0 ; [.1D34.0020.0004] # COMBINING LATIN SMALL LETTER N -24A9 ; [*0310.0020.0004][.1D34.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER N -1D427 ; [.1D34.0020.0005] # MATHEMATICAL BOLD SMALL N -1D45B ; [.1D34.0020.0005] # MATHEMATICAL ITALIC SMALL N -1D48F ; [.1D34.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL N -1D4C3 ; [.1D34.0020.0005] # MATHEMATICAL SCRIPT SMALL N -1D4F7 ; [.1D34.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL N -1D52B ; [.1D34.0020.0005] # MATHEMATICAL FRAKTUR SMALL N -1D55F ; [.1D34.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL N -1D593 ; [.1D34.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL N -1D5C7 ; [.1D34.0020.0005] # MATHEMATICAL SANS-SERIF SMALL N -1D5FB ; [.1D34.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL N -1D62F ; [.1D34.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL N -1D663 ; [.1D34.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N -1D697 ; [.1D34.0020.0005] # MATHEMATICAL MONOSPACE SMALL N -24DD ; [.1D34.0020.0006] # CIRCLED LATIN SMALL LETTER N -004E ; [.1D34.0020.0008] # LATIN CAPITAL LETTER N -FF2E ; [.1D34.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER N -1F11D ; [*0310.0020.0004][.1D34.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER N -2115 ; [.1D34.0020.000B] # DOUBLE-STRUCK CAPITAL N -1D40D ; [.1D34.0020.000B] # MATHEMATICAL BOLD CAPITAL N -1D441 ; [.1D34.0020.000B] # MATHEMATICAL ITALIC CAPITAL N -1D475 ; [.1D34.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL N -1D4A9 ; [.1D34.0020.000B] # MATHEMATICAL SCRIPT CAPITAL N -1D4DD ; [.1D34.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL N -1D511 ; [.1D34.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL N -1D579 ; [.1D34.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL N -1D5AD ; [.1D34.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL N -1D5E1 ; [.1D34.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N -1D615 ; [.1D34.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N -1D649 ; [.1D34.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N -1D67D ; [.1D34.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL N -24C3 ; [.1D34.0020.000C] # CIRCLED LATIN CAPITAL LETTER N -1F15D ; [.1D34.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER N -207F ; [.1D34.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER N -2099 ; [.1D34.0020.0015] # LATIN SUBSCRIPT SMALL LETTER N -1D3A ; [.1D34.0020.001D] # MODIFIER LETTER CAPITAL N -1F13D ; [.1D34.0020.001D] # SQUARED LATIN CAPITAL LETTER N -1F17D ; [.1D34.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER N -0144 ; [.1D34.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER N WITH ACUTE -0143 ; [.1D34.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER N WITH ACUTE -01F9 ; [.1D34.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER N WITH GRAVE -01F8 ; [.1D34.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER N WITH GRAVE -0148 ; [.1D34.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER N WITH CARON -0147 ; [.1D34.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER N WITH CARON -00F1 ; [.1D34.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER N WITH TILDE -00D1 ; [.1D34.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER N WITH TILDE -1E45 ; [.1D34.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER N WITH DOT ABOVE -1E44 ; [.1D34.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER N WITH DOT ABOVE -0146 ; [.1D34.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER N WITH CEDILLA -0145 ; [.1D34.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER N WITH CEDILLA -A7A5 ; [.1D34.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER N WITH OBLIQUE STROKE -A7A4 ; [.1D34.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE -1E47 ; [.1D34.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER N WITH DOT BELOW -1E46 ; [.1D34.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER N WITH DOT BELOW -1E4B ; [.1D34.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW -1E4A ; [.1D34.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW -1E49 ; [.1D34.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER N WITH LINE BELOW -1E48 ; [.1D34.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER N WITH LINE BELOW -3381 ; [.1D34.0020.001C][.1BC2.0020.001D] # SQUARE NA -1F195 ; [.1D34.0020.001D][.1C25.0020.001D][.1E70.0020.001D] # SQUARED NEW -338B ; [.1D34.0020.001C][.1C60.0020.001D] # SQUARE NF -1F196 ; [.1D34.0020.001D][.1C6F.0020.001D] # SQUARED NG -01CC ; [.1D34.0020.0004][.1CC7.0020.0004] # LATIN SMALL LETTER NJ -01CB ; [.1D34.0020.000A][.1CC7.0020.0004] # LATIN CAPITAL LETTER N WITH SMALL LETTER J -01CA ; [.1D34.0020.000A][.1CC7.0020.000A] # LATIN CAPITAL LETTER NJ -339A ; [.1D34.0020.001C][.1D25.0020.001C] # SQUARE NM -2116 ; [.1D34.0020.000A][.1D58.0020.0004] # NUMERO SIGN -33B1 ; [.1D34.0020.001C][.1DEC.0020.001C] # SQUARE NS -33B5 ; [.1D34.0020.001C][.1E5E.0020.001D] # SQUARE NV -33BB ; [.1D34.0020.001C][.1E70.0020.001D] # SQUARE NW -0274 ; [.1D38.0020.0002] # LATIN LETTER SMALL CAPITAL N -1DE1 ; [.1D38.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL N -1DB0 ; [.1D38.0020.0014] # MODIFIER LETTER SMALL CAPITAL N -1D3B ; [.1D3C.0020.0002] # MODIFIER LETTER CAPITAL REVERSED N -1D0E ; [.1D3D.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED N -1D70 ; [.1D3E.0020.0002] # LATIN SMALL LETTER N WITH MIDDLE TILDE -0272 ; [.1D3F.0020.0002] # LATIN SMALL LETTER N WITH LEFT HOOK -019D ; [.1D3F.0020.0008] # LATIN CAPITAL LETTER N WITH LEFT HOOK -1DAE ; [.1D3F.0020.0014] # MODIFIER LETTER SMALL N WITH LEFT HOOK -019E ; [.1D43.0020.0002] # LATIN SMALL LETTER N WITH LONG RIGHT LEG -0220 ; [.1D43.0020.0008] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG -A791 ; [.1D47.0020.0002] # LATIN SMALL LETTER N WITH DESCENDER -A790 ; [.1D47.0020.0008] # LATIN CAPITAL LETTER N WITH DESCENDER -1D87 ; [.1D48.0020.0002] # LATIN SMALL LETTER N WITH PALATAL HOOK -0273 ; [.1D49.0020.0002] # LATIN SMALL LETTER N WITH RETROFLEX HOOK -1DAF ; [.1D49.0020.0014] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK -0235 ; [.1D4D.0020.0002] # LATIN SMALL LETTER N WITH CURL -AB3B ; [.1D51.0020.0002] # LATIN SMALL LETTER N WITH CROSSED-TAIL -A774 ; [.1D52.0020.0002] # LATIN SMALL LETTER NUM -014B ; [.1D53.0020.0002] # LATIN SMALL LETTER ENG -014A ; [.1D53.0020.0008] # LATIN CAPITAL LETTER ENG -1D51 ; [.1D53.0020.0014] # MODIFIER LETTER SMALL ENG -AB3C ; [.1D57.0020.0002] # LATIN SMALL LETTER ENG WITH CROSSED-TAIL -006F ; [.1D58.0020.0002] # LATIN SMALL LETTER O -FF4F ; [.1D58.0020.0003] # FULLWIDTH LATIN SMALL LETTER O -0366 ; [.1D58.0020.0004] # COMBINING LATIN SMALL LETTER O -24AA ; [*0310.0020.0004][.1D58.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER O -2134 ; [.1D58.0020.0005] # SCRIPT SMALL O -1D428 ; [.1D58.0020.0005] # MATHEMATICAL BOLD SMALL O -1D45C ; [.1D58.0020.0005] # MATHEMATICAL ITALIC SMALL O -1D490 ; [.1D58.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL O -1D4F8 ; [.1D58.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL O -1D52C ; [.1D58.0020.0005] # MATHEMATICAL FRAKTUR SMALL O -1D560 ; [.1D58.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL O -1D594 ; [.1D58.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL O -1D5C8 ; [.1D58.0020.0005] # MATHEMATICAL SANS-SERIF SMALL O -1D5FC ; [.1D58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL O -1D630 ; [.1D58.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL O -1D664 ; [.1D58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O -1D698 ; [.1D58.0020.0005] # MATHEMATICAL MONOSPACE SMALL O -24DE ; [.1D58.0020.0006] # CIRCLED LATIN SMALL LETTER O -004F ; [.1D58.0020.0008] # LATIN CAPITAL LETTER O -FF2F ; [.1D58.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER O -1F11E ; [*0310.0020.0004][.1D58.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER O -1D40E ; [.1D58.0020.000B] # MATHEMATICAL BOLD CAPITAL O -1D442 ; [.1D58.0020.000B] # MATHEMATICAL ITALIC CAPITAL O -1D476 ; [.1D58.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL O -1D4AA ; [.1D58.0020.000B] # MATHEMATICAL SCRIPT CAPITAL O -1D4DE ; [.1D58.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL O -1D512 ; [.1D58.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL O -1D546 ; [.1D58.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D57A ; [.1D58.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL O -1D5AE ; [.1D58.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL O -1D5E2 ; [.1D58.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O -1D616 ; [.1D58.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O -1D64A ; [.1D58.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O -1D67E ; [.1D58.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL O -24C4 ; [.1D58.0020.000C] # CIRCLED LATIN CAPITAL LETTER O -1F15E ; [.1D58.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER O -00BA ; [.1D58.0020.0014] # MASCULINE ORDINAL INDICATOR -1D52 ; [.1D58.0020.0014] # MODIFIER LETTER SMALL O -2092 ; [.1D58.0020.0015] # LATIN SUBSCRIPT SMALL LETTER O -1D3C ; [.1D58.0020.001D] # MODIFIER LETTER CAPITAL O -1F13E ; [.1D58.0020.001D] # SQUARED LATIN CAPITAL LETTER O -1F17E ; [.1D58.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER O -00F3 ; [.1D58.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH ACUTE -00D3 ; [.1D58.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH ACUTE -00F2 ; [.1D58.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH GRAVE -00D2 ; [.1D58.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH GRAVE -014F ; [.1D58.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER O WITH BREVE -014E ; [.1D58.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER O WITH BREVE -00F4 ; [.1D58.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX -00D4 ; [.1D58.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -1ED1 ; [.1D58.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED0 ; [.1D58.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED3 ; [.1D58.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED2 ; [.1D58.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED7 ; [.1D58.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE -1ED6 ; [.1D58.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE -1ED5 ; [.1D58.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -1ED4 ; [.1D58.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -01D2 ; [.1D58.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER O WITH CARON -01D1 ; [.1D58.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER O WITH CARON -00F6 ; [.1D58.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH DIAERESIS -1DF3 ; [.1D58.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER O WITH DIAERESIS -A79D ; [.1D58.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK OE -00D6 ; [.1D58.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS -A79C ; [.1D58.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK OE -022B ; [.1D58.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON -022A ; [.1D58.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON -0151 ; [.1D58.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER O WITH DOUBLE ACUTE -0150 ; [.1D58.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -00F5 ; [.1D58.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH TILDE -00D5 ; [.1D58.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH TILDE -1E4D ; [.1D58.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH TILDE AND ACUTE -1E4C ; [.1D58.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE -1E4F ; [.1D58.0020.0002][.0000.002D.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS -1E4E ; [.1D58.0020.0008][.0000.002D.0002][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS -022D ; [.1D58.0020.0002][.0000.002D.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH TILDE AND MACRON -022C ; [.1D58.0020.0008][.0000.002D.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON -022F ; [.1D58.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER O WITH DOT ABOVE -022E ; [.1D58.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE -0231 ; [.1D58.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON -0230 ; [.1D58.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON -00F8 ; [.1D58.0020.0002][.0000.002F.0002] # LATIN SMALL LETTER O WITH STROKE -00D8 ; [.1D58.0020.0008][.0000.002F.0002] # LATIN CAPITAL LETTER O WITH STROKE -01FF ; [.1D58.0020.0002][.0000.002F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH STROKE AND ACUTE -01FE ; [.1D58.0020.0008][.0000.002F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE -01EB ; [.1D58.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER O WITH OGONEK -01EA ; [.1D58.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER O WITH OGONEK -01ED ; [.1D58.0020.0002][.0000.0031.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH OGONEK AND MACRON -01EC ; [.1D58.0020.0008][.0000.0031.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON -014D ; [.1D58.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH MACRON -014C ; [.1D58.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH MACRON -1E53 ; [.1D58.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH MACRON AND ACUTE -1E52 ; [.1D58.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE -1E51 ; [.1D58.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH MACRON AND GRAVE -1E50 ; [.1D58.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE -1DED ; [.1D58.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE -1ECF ; [.1D58.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HOOK ABOVE -1ECE ; [.1D58.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HOOK ABOVE -020D ; [.1D58.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER O WITH DOUBLE GRAVE -020C ; [.1D58.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE -020F ; [.1D58.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER O WITH INVERTED BREVE -020E ; [.1D58.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER O WITH INVERTED BREVE -01A1 ; [.1D58.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER O WITH HORN -01A0 ; [.1D58.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER O WITH HORN -1EDB ; [.1D58.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH HORN AND ACUTE -1EDA ; [.1D58.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE -1EDD ; [.1D58.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH HORN AND GRAVE -1EDC ; [.1D58.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE -1EE1 ; [.1D58.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH HORN AND TILDE -1EE0 ; [.1D58.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH HORN AND TILDE -1EDF ; [.1D58.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE -1EDE ; [.1D58.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE -1EE3 ; [.1D58.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW -1EE2 ; [.1D58.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW -1ECD ; [.1D58.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH DOT BELOW -1ECC ; [.1D58.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH DOT BELOW -1ED9 ; [.1D58.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW -1ED8 ; [.1D58.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW -0153 ; [.1D58.0020.0004][.0000.010B.0004][.1C25.0020.0004] # LATIN SMALL LIGATURE OE -0152 ; [.1D58.0020.000A][.0000.010B.0004][.1C25.0020.000A] # LATIN CAPITAL LIGATURE OE -A7F9 ; [.1D58.0020.0014][.0000.010B.0014][.1C25.0020.0014] # MODIFIER LETTER SMALL LIGATURE OE -1F197 ; [.1D58.0020.001D][.1CE0.0020.001D] # SQUARED OK -A74F ; [.1D58.0020.0004][.1D58.0020.0004] # LATIN SMALL LETTER OO -A74E ; [.1D58.0020.000A][.1D58.0020.000A] # LATIN CAPITAL LETTER OO -3375 ; [.1D58.0020.001C][.1E5E.0020.001D] # SQUARE OV -1D0F ; [.1D5C.0020.0002] # LATIN LETTER SMALL CAPITAL O -1D11 ; [.1D5D.0020.0002] # LATIN SMALL LETTER SIDEWAYS O -AB3D ; [.1D5E.0020.0002] # LATIN SMALL LETTER BLACKLETTER O -0276 ; [.1D5F.0020.0002] # LATIN LETTER SMALL CAPITAL OE -1D14 ; [.1D63.0020.0002] # LATIN SMALL LETTER TURNED OE -AB41 ; [.1D64.0020.0002] # LATIN SMALL LETTER TURNED OE WITH STROKE -AB42 ; [.1D65.0020.0002] # LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE -AB40 ; [.1D66.0020.0002] # LATIN SMALL LETTER INVERTED OE -AB43 ; [.1D67.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O -AB44 ; [.1D68.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE -1D13 ; [.1D69.0020.0002] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE -AB3E ; [.1D6A.0020.0002] # LATIN SMALL LETTER BLACKLETTER O WITH STROKE -0254 ; [.1D6B.0020.0002] # LATIN SMALL LETTER OPEN O -0186 ; [.1D6B.0020.0008] # LATIN CAPITAL LETTER OPEN O -1D53 ; [.1D6B.0020.0014] # MODIFIER LETTER SMALL OPEN O -1D10 ; [.1D6F.0020.0002] # LATIN LETTER SMALL CAPITAL OPEN O -1D12 ; [.1D70.0020.0002] # LATIN SMALL LETTER SIDEWAYS OPEN O -AB3F ; [.1D71.0020.0002] # LATIN SMALL LETTER OPEN O WITH STROKE -1D97 ; [.1D72.0020.0002] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK -AB62 ; [.1D73.0020.0002] # LATIN SMALL LETTER OPEN OE -A74D ; [.1D74.0020.0002] # LATIN SMALL LETTER O WITH LOOP -A74C ; [.1D74.0020.0008] # LATIN CAPITAL LETTER O WITH LOOP -1D16 ; [.1D75.0020.0002] # LATIN SMALL LETTER TOP HALF O -1D54 ; [.1D75.0020.0014] # MODIFIER LETTER SMALL TOP HALF O -1D17 ; [.1D76.0020.0002] # LATIN SMALL LETTER BOTTOM HALF O -1D55 ; [.1D76.0020.0014] # MODIFIER LETTER SMALL BOTTOM HALF O -2C7A ; [.1D77.0020.0002] # LATIN SMALL LETTER O WITH LOW RING INSIDE -0275 ; [.1D78.0020.0002] # LATIN SMALL LETTER BARRED O -019F ; [.1D78.0020.0008] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE -1DB1 ; [.1D78.0020.0014] # MODIFIER LETTER SMALL BARRED O -A74B ; [.1D7C.0020.0002] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY -A74A ; [.1D7C.0020.0008] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY -0277 ; [.1D7D.0020.0002] # LATIN SMALL LETTER CLOSED OMEGA -A7B7 ; [.1D81.0020.0002] # LATIN SMALL LETTER OMEGA -A7B6 ; [.1D81.0020.0008] # LATIN CAPITAL LETTER OMEGA -0223 ; [.1D82.0020.0002] # LATIN SMALL LETTER OU -0222 ; [.1D82.0020.0008] # LATIN CAPITAL LETTER OU -1D3D ; [.1D82.0020.001D] # MODIFIER LETTER CAPITAL OU -1D15 ; [.1D86.0020.0002] # LATIN LETTER SMALL CAPITAL OU -0070 ; [.1D87.0020.0002] # LATIN SMALL LETTER P -FF50 ; [.1D87.0020.0003] # FULLWIDTH LATIN SMALL LETTER P -1DEE ; [.1D87.0020.0004] # COMBINING LATIN SMALL LETTER P -24AB ; [*0310.0020.0004][.1D87.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER P -1D429 ; [.1D87.0020.0005] # MATHEMATICAL BOLD SMALL P -1D45D ; [.1D87.0020.0005] # MATHEMATICAL ITALIC SMALL P -1D491 ; [.1D87.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL P -1D4C5 ; [.1D87.0020.0005] # MATHEMATICAL SCRIPT SMALL P -1D4F9 ; [.1D87.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL P -1D52D ; [.1D87.0020.0005] # MATHEMATICAL FRAKTUR SMALL P -1D561 ; [.1D87.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL P -1D595 ; [.1D87.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL P -1D5C9 ; [.1D87.0020.0005] # MATHEMATICAL SANS-SERIF SMALL P -1D5FD ; [.1D87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL P -1D631 ; [.1D87.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL P -1D665 ; [.1D87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P -1D699 ; [.1D87.0020.0005] # MATHEMATICAL MONOSPACE SMALL P -24DF ; [.1D87.0020.0006] # CIRCLED LATIN SMALL LETTER P -0050 ; [.1D87.0020.0008] # LATIN CAPITAL LETTER P -FF30 ; [.1D87.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER P -1F11F ; [*0310.0020.0004][.1D87.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER P -2119 ; [.1D87.0020.000B] # DOUBLE-STRUCK CAPITAL P -1D40F ; [.1D87.0020.000B] # MATHEMATICAL BOLD CAPITAL P -1D443 ; [.1D87.0020.000B] # MATHEMATICAL ITALIC CAPITAL P -1D477 ; [.1D87.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL P -1D4AB ; [.1D87.0020.000B] # MATHEMATICAL SCRIPT CAPITAL P -1D4DF ; [.1D87.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL P -1D513 ; [.1D87.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL P -1D57B ; [.1D87.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P -1D5AF ; [.1D87.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL P -1D5E3 ; [.1D87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P -1D617 ; [.1D87.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P -1D64B ; [.1D87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P -1D67F ; [.1D87.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL P -24C5 ; [.1D87.0020.000C] # CIRCLED LATIN CAPITAL LETTER P -1F15F ; [.1D87.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P -1D56 ; [.1D87.0020.0014] # MODIFIER LETTER SMALL P -209A ; [.1D87.0020.0015] # LATIN SUBSCRIPT SMALL LETTER P -1D3E ; [.1D87.0020.001D] # MODIFIER LETTER CAPITAL P -1F13F ; [.1D87.0020.001D] # SQUARED LATIN CAPITAL LETTER P -1F17F ; [.1D87.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER P -1F18A ; [.1D87.0020.001D] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P -1E55 ; [.1D87.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER P WITH ACUTE -1E54 ; [.1D87.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER P WITH ACUTE -1E57 ; [.1D87.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER P WITH DOT ABOVE -1E56 ; [.1D87.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER P WITH DOT ABOVE -3380 ; [.1D87.0020.001C][.1BC2.0020.001D] # SQUARE PA AMPS -33A9 ; [.1D87.0020.001D][.1BC2.0020.001C] # SQUARE PA -1F18C ; [.1D87.0020.001D][.1BC2.0020.001D] # NEGATIVE SQUARED PA -3376 ; [.1D87.0020.001C][.1BF5.0020.001C] # SQUARE PC -338A ; [.1D87.0020.001C][.1C60.0020.001D] # SQUARE PF -33D7 ; [.1D87.0020.001D][.1C93.0020.001D] # SQUARE PH -33D8 ; [.1D87.0020.001C][*0274.0020.001C][.1D25.0020.001C][*0274.0020.001C] # SQUARE PM -33D9 ; [.1D87.0020.001D][.1D87.0020.001D][.1D25.0020.001D] # SQUARE PPM -1F14E ; [.1D87.0020.001D][.1D87.0020.001D][.1E5E.0020.001D] # SQUARED PPV -33DA ; [.1D87.0020.001D][.1DAE.0020.001D] # SQUARE PR -33B0 ; [.1D87.0020.001C][.1DEC.0020.001C] # SQUARE PS -3250 ; [.1D87.0020.001D][.1E10.0020.001D][.1C25.0020.001D] # PARTNERSHIP SIGN -33B4 ; [.1D87.0020.001C][.1E5E.0020.001D] # SQUARE PV -33BA ; [.1D87.0020.001C][.1E70.0020.001D] # SQUARE PW -1D18 ; [.1D8B.0020.0002] # LATIN LETTER SMALL CAPITAL P -1D7D ; [.1D8C.0020.0002] # LATIN SMALL LETTER P WITH STROKE -2C63 ; [.1D8C.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE -A751 ; [.1D8D.0020.0002] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER -A750 ; [.1D8D.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER -1D71 ; [.1D8E.0020.0002] # LATIN SMALL LETTER P WITH MIDDLE TILDE -1D88 ; [.1D8F.0020.0002] # LATIN SMALL LETTER P WITH PALATAL HOOK -01A5 ; [.1D90.0020.0002] # LATIN SMALL LETTER P WITH HOOK -01A4 ; [.1D90.0020.0008] # LATIN CAPITAL LETTER P WITH HOOK -A753 ; [.1D94.0020.0002] # LATIN SMALL LETTER P WITH FLOURISH -A752 ; [.1D94.0020.0008] # LATIN CAPITAL LETTER P WITH FLOURISH -A755 ; [.1D95.0020.0002] # LATIN SMALL LETTER P WITH SQUIRREL TAIL -A754 ; [.1D95.0020.0008] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL -A7FC ; [.1D96.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED P -0278 ; [.1D97.0020.0002] # LATIN SMALL LETTER PHI -1DB2 ; [.1D97.0020.0014] # MODIFIER LETTER SMALL PHI -2C77 ; [.1D9B.0020.0002] # LATIN SMALL LETTER TAILLESS PHI -0071 ; [.1D9C.0020.0002] # LATIN SMALL LETTER Q -FF51 ; [.1D9C.0020.0003] # FULLWIDTH LATIN SMALL LETTER Q -24AC ; [*0310.0020.0004][.1D9C.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Q -1D42A ; [.1D9C.0020.0005] # MATHEMATICAL BOLD SMALL Q -1D45E ; [.1D9C.0020.0005] # MATHEMATICAL ITALIC SMALL Q -1D492 ; [.1D9C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Q -1D4C6 ; [.1D9C.0020.0005] # MATHEMATICAL SCRIPT SMALL Q -1D4FA ; [.1D9C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Q -1D52E ; [.1D9C.0020.0005] # MATHEMATICAL FRAKTUR SMALL Q -1D562 ; [.1D9C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Q -1D596 ; [.1D9C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Q -1D5CA ; [.1D9C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Q -1D5FE ; [.1D9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Q -1D632 ; [.1D9C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q -1D666 ; [.1D9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q -1D69A ; [.1D9C.0020.0005] # MATHEMATICAL MONOSPACE SMALL Q -24E0 ; [.1D9C.0020.0006] # CIRCLED LATIN SMALL LETTER Q -0051 ; [.1D9C.0020.0008] # LATIN CAPITAL LETTER Q -FF31 ; [.1D9C.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Q -1F120 ; [*0310.0020.0004][.1D9C.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Q -211A ; [.1D9C.0020.000B] # DOUBLE-STRUCK CAPITAL Q -1D410 ; [.1D9C.0020.000B] # MATHEMATICAL BOLD CAPITAL Q -1D444 ; [.1D9C.0020.000B] # MATHEMATICAL ITALIC CAPITAL Q -1D478 ; [.1D9C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Q -1D4AC ; [.1D9C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Q -1D4E0 ; [.1D9C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Q -1D514 ; [.1D9C.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Q -1D57C ; [.1D9C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q -1D5B0 ; [.1D9C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Q -1D5E4 ; [.1D9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q -1D618 ; [.1D9C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q -1D64C ; [.1D9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q -1D680 ; [.1D9C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Q -24C6 ; [.1D9C.0020.000C] # CIRCLED LATIN CAPITAL LETTER Q -1F160 ; [.1D9C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Q -1F140 ; [.1D9C.0020.001D] # SQUARED LATIN CAPITAL LETTER Q -1F180 ; [.1D9C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Q -0239 ; [.1D9C.0020.0004][.1D87.0020.0004] # LATIN SMALL LETTER QP DIGRAPH -A757 ; [.1DA0.0020.0002] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER -A756 ; [.1DA0.0020.0008] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER -A759 ; [.1DA1.0020.0002] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE -A758 ; [.1DA1.0020.0008] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE -02A0 ; [.1DA2.0020.0002] # LATIN SMALL LETTER Q WITH HOOK -024B ; [.1DA6.0020.0002] # LATIN SMALL LETTER Q WITH HOOK TAIL -024A ; [.1DA6.0020.0008] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL -0138 ; [.1DAA.0020.0002] # LATIN SMALL LETTER KRA -0072 ; [.1DAE.0020.0002] # LATIN SMALL LETTER R -FF52 ; [.1DAE.0020.0003] # FULLWIDTH LATIN SMALL LETTER R -036C ; [.1DAE.0020.0004] # COMBINING LATIN SMALL LETTER R -1DCA ; [.1DAE.0020.0004] # COMBINING LATIN SMALL LETTER R BELOW -24AD ; [*0310.0020.0004][.1DAE.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER R -1D42B ; [.1DAE.0020.0005] # MATHEMATICAL BOLD SMALL R -1D45F ; [.1DAE.0020.0005] # MATHEMATICAL ITALIC SMALL R -1D493 ; [.1DAE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL R -1D4C7 ; [.1DAE.0020.0005] # MATHEMATICAL SCRIPT SMALL R -1D4FB ; [.1DAE.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL R -1D52F ; [.1DAE.0020.0005] # MATHEMATICAL FRAKTUR SMALL R -1D563 ; [.1DAE.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL R -1D597 ; [.1DAE.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL R -1D5CB ; [.1DAE.0020.0005] # MATHEMATICAL SANS-SERIF SMALL R -1D5FF ; [.1DAE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL R -1D633 ; [.1DAE.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL R -1D667 ; [.1DAE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R -1D69B ; [.1DAE.0020.0005] # MATHEMATICAL MONOSPACE SMALL R -24E1 ; [.1DAE.0020.0006] # CIRCLED LATIN SMALL LETTER R -0052 ; [.1DAE.0020.0008] # LATIN CAPITAL LETTER R -FF32 ; [.1DAE.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER R -1F121 ; [*0310.0020.0004][.1DAE.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER R -211B ; [.1DAE.0020.000B] # SCRIPT CAPITAL R -211C ; [.1DAE.0020.000B] # BLACK-LETTER CAPITAL R -211D ; [.1DAE.0020.000B] # DOUBLE-STRUCK CAPITAL R -1D411 ; [.1DAE.0020.000B] # MATHEMATICAL BOLD CAPITAL R -1D445 ; [.1DAE.0020.000B] # MATHEMATICAL ITALIC CAPITAL R -1D479 ; [.1DAE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL R -1D4E1 ; [.1DAE.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL R -1D57D ; [.1DAE.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL R -1D5B1 ; [.1DAE.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL R -1D5E5 ; [.1DAE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R -1D619 ; [.1DAE.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R -1D64D ; [.1DAE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R -1D681 ; [.1DAE.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL R -24C7 ; [.1DAE.0020.000C] # CIRCLED LATIN CAPITAL LETTER R -1F12C ; [.1DAE.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER R -1F161 ; [.1DAE.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER R -02B3 ; [.1DAE.0020.0014] # MODIFIER LETTER SMALL R -1D63 ; [.1DAE.0020.0015] # LATIN SUBSCRIPT SMALL LETTER R -1D3F ; [.1DAE.0020.001D] # MODIFIER LETTER CAPITAL R -1F141 ; [.1DAE.0020.001D] # SQUARED LATIN CAPITAL LETTER R -1F181 ; [.1DAE.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER R -0155 ; [.1DAE.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER R WITH ACUTE -0154 ; [.1DAE.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER R WITH ACUTE -0159 ; [.1DAE.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER R WITH CARON -0158 ; [.1DAE.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER R WITH CARON -1E59 ; [.1DAE.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER R WITH DOT ABOVE -1E58 ; [.1DAE.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER R WITH DOT ABOVE -0157 ; [.1DAE.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER R WITH CEDILLA -0156 ; [.1DAE.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER R WITH CEDILLA -A7A7 ; [.1DAE.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER R WITH OBLIQUE STROKE -A7A6 ; [.1DAE.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE -0211 ; [.1DAE.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER R WITH DOUBLE GRAVE -0210 ; [.1DAE.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE -0213 ; [.1DAE.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER R WITH INVERTED BREVE -0212 ; [.1DAE.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER R WITH INVERTED BREVE -1E5B ; [.1DAE.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER R WITH DOT BELOW -1E5A ; [.1DAE.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW -1E5D ; [.1DAE.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON -1E5C ; [.1DAE.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON -1E5F ; [.1DAE.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER R WITH LINE BELOW -1E5E ; [.1DAE.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER R WITH LINE BELOW -A783 ; [.1DAE.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR R -A782 ; [.1DAE.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR R -33AD ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C] # SQUARE RAD -33AE ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C][*0605.0020.001C][.1DEC.0020.001C] # SQUARE RAD OVER S -33AF ; [.1DAE.0020.001C][.1BC2.0020.001C][.1C0A.0020.001C][*0605.0020.001C][.1DEC.0020.001C][.1BBA.0020.001C] # SQUARE RAD OVER S SQUARED -20A8 ; [.1DAE.0020.000A][.1DEC.0020.0004] # RUPEE SIGN -AB45 ; [.1DB2.0020.0002] # LATIN SMALL LETTER STIRRUP R -0280 ; [.1DB3.0020.0002] # LATIN LETTER SMALL CAPITAL R -1DE2 ; [.1DB3.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL R -01A6 ; [.1DB3.0020.0008] # LATIN LETTER YR -AB46 ; [.1DB7.0020.0002] # LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG -A75B ; [.1DB8.0020.0002] # LATIN SMALL LETTER R ROTUNDA -1DE3 ; [.1DB8.0020.0004] # COMBINING LATIN SMALL LETTER R ROTUNDA -A75A ; [.1DB8.0020.0008] # LATIN CAPITAL LETTER R ROTUNDA -1D19 ; [.1DB9.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED R -024D ; [.1DBA.0020.0002] # LATIN SMALL LETTER R WITH STROKE -024C ; [.1DBA.0020.0008] # LATIN CAPITAL LETTER R WITH STROKE -1D72 ; [.1DBE.0020.0002] # LATIN SMALL LETTER R WITH MIDDLE TILDE -0279 ; [.1DBF.0020.0002] # LATIN SMALL LETTER TURNED R -02B4 ; [.1DBF.0020.0014] # MODIFIER LETTER SMALL TURNED R -1D1A ; [.1DC3.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED R -027A ; [.1DC4.0020.0002] # LATIN SMALL LETTER TURNED R WITH LONG LEG -1D89 ; [.1DC8.0020.0002] # LATIN SMALL LETTER R WITH PALATAL HOOK -027B ; [.1DC9.0020.0002] # LATIN SMALL LETTER TURNED R WITH HOOK -02B5 ; [.1DC9.0020.0014] # MODIFIER LETTER SMALL TURNED R WITH HOOK -2C79 ; [.1DCD.0020.0002] # LATIN SMALL LETTER TURNED R WITH TAIL -027C ; [.1DCE.0020.0002] # LATIN SMALL LETTER R WITH LONG LEG -027D ; [.1DD2.0020.0002] # LATIN SMALL LETTER R WITH TAIL -2C64 ; [.1DD2.0020.0008] # LATIN CAPITAL LETTER R WITH TAIL -AB49 ; [.1DD6.0020.0002] # LATIN SMALL LETTER R WITH CROSSED-TAIL -027E ; [.1DD7.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK -1D73 ; [.1DDB.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE -027F ; [.1DDC.0020.0002] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK -AB47 ; [.1DE0.0020.0002] # LATIN SMALL LETTER R WITHOUT HANDLE -AB48 ; [.1DE1.0020.0002] # LATIN SMALL LETTER DOUBLE R -AB4A ; [.1DE2.0020.0002] # LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL -AB4B ; [.1DE3.0020.0002] # LATIN SMALL LETTER SCRIPT R -AB4C ; [.1DE4.0020.0002] # LATIN SMALL LETTER SCRIPT R WITH RING -0281 ; [.1DE5.0020.0002] # LATIN LETTER SMALL CAPITAL INVERTED R -02B6 ; [.1DE5.0020.0014] # MODIFIER LETTER SMALL CAPITAL INVERTED R -A775 ; [.1DE9.0020.0002] # LATIN SMALL LETTER RUM -A776 ; [.1DEA.0020.0002] # LATIN LETTER SMALL CAPITAL RUM -A75D ; [.1DEB.0020.0002] # LATIN SMALL LETTER RUM ROTUNDA -A75C ; [.1DEB.0020.0008] # LATIN CAPITAL LETTER RUM ROTUNDA -0073 ; [.1DEC.0020.0002] # LATIN SMALL LETTER S -FF53 ; [.1DEC.0020.0003] # FULLWIDTH LATIN SMALL LETTER S -1DE4 ; [.1DEC.0020.0004] # COMBINING LATIN SMALL LETTER S -24AE ; [*0310.0020.0004][.1DEC.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER S -1D42C ; [.1DEC.0020.0005] # MATHEMATICAL BOLD SMALL S -1D460 ; [.1DEC.0020.0005] # MATHEMATICAL ITALIC SMALL S -1D494 ; [.1DEC.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL S -1D4C8 ; [.1DEC.0020.0005] # MATHEMATICAL SCRIPT SMALL S -1D4FC ; [.1DEC.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL S -1D530 ; [.1DEC.0020.0005] # MATHEMATICAL FRAKTUR SMALL S -1D564 ; [.1DEC.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL S -1D598 ; [.1DEC.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL S -1D5CC ; [.1DEC.0020.0005] # MATHEMATICAL SANS-SERIF SMALL S -1D600 ; [.1DEC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL S -1D634 ; [.1DEC.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL S -1D668 ; [.1DEC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S -1D69C ; [.1DEC.0020.0005] # MATHEMATICAL MONOSPACE SMALL S -24E2 ; [.1DEC.0020.0006] # CIRCLED LATIN SMALL LETTER S -0053 ; [.1DEC.0020.0008] # LATIN CAPITAL LETTER S -FF33 ; [.1DEC.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER S -1F122 ; [*0310.0020.0004][.1DEC.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER S -1F12A ; [*0372.0020.0004][.1DEC.0020.000A][*0373.0020.0004] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S -1D412 ; [.1DEC.0020.000B] # MATHEMATICAL BOLD CAPITAL S -1D446 ; [.1DEC.0020.000B] # MATHEMATICAL ITALIC CAPITAL S -1D47A ; [.1DEC.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL S -1D4AE ; [.1DEC.0020.000B] # MATHEMATICAL SCRIPT CAPITAL S -1D4E2 ; [.1DEC.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL S -1D516 ; [.1DEC.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL S -1D54A ; [.1DEC.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S -1D57E ; [.1DEC.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL S -1D5B2 ; [.1DEC.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL S -1D5E6 ; [.1DEC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S -1D61A ; [.1DEC.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S -1D64E ; [.1DEC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S -1D682 ; [.1DEC.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL S -24C8 ; [.1DEC.0020.000C] # CIRCLED LATIN CAPITAL LETTER S -1F162 ; [.1DEC.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER S -02E2 ; [.1DEC.0020.0014] # MODIFIER LETTER SMALL S -209B ; [.1DEC.0020.0015] # LATIN SUBSCRIPT SMALL LETTER S -1F142 ; [.1DEC.0020.001D] # SQUARED LATIN CAPITAL LETTER S -1F182 ; [.1DEC.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER S -015B ; [.1DEC.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER S WITH ACUTE -015A ; [.1DEC.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER S WITH ACUTE -1E65 ; [.1DEC.0020.0002][.0000.0024.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE -1E64 ; [.1DEC.0020.0008][.0000.0024.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE -015D ; [.1DEC.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER S WITH CIRCUMFLEX -015C ; [.1DEC.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX -0161 ; [.1DEC.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER S WITH CARON -0160 ; [.1DEC.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER S WITH CARON -1E67 ; [.1DEC.0020.0002][.0000.0028.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE -1E66 ; [.1DEC.0020.0008][.0000.0028.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE -1E61 ; [.1DEC.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT ABOVE -1E60 ; [.1DEC.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT ABOVE -015F ; [.1DEC.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER S WITH CEDILLA -015E ; [.1DEC.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER S WITH CEDILLA -A7A9 ; [.1DEC.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER S WITH OBLIQUE STROKE -A7A8 ; [.1DEC.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE -1E63 ; [.1DEC.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER S WITH DOT BELOW -1E62 ; [.1DEC.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW -1E69 ; [.1DEC.0020.0002][.0000.0042.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE -1E68 ; [.1DEC.0020.0008][.0000.0042.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE -0219 ; [.1DEC.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER S WITH COMMA BELOW -0218 ; [.1DEC.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER S WITH COMMA BELOW -017F ; [.1DEC.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER LONG S -1DE5 ; [.1DEC.0020.0004][.0000.010C.0004] # COMBINING LATIN SMALL LETTER LONG S -A785 ; [.1DEC.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR S -A784 ; [.1DEC.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR S -1E9B ; [.1DEC.0020.0004][.0000.010C.0004][.0000.002E.0002] # LATIN SMALL LETTER LONG S WITH DOT ABOVE -1F18D ; [.1DEC.0020.001D][.1BC2.0020.001D] # NEGATIVE SQUARED SA -1F14C ; [.1DEC.0020.001D][.1C0A.0020.001D] # SQUARED SD -2120 ; [.1DEC.0020.0014][.1D25.0020.0014] # SERVICE MARK -1F198 ; [.1DEC.0020.001D][.1D58.0020.001D][.1DEC.0020.001D] # SQUARED SOS -33DB ; [.1DEC.0020.001C][.1DAE.0020.001C] # SQUARE SR -1F14D ; [.1DEC.0020.001D][.1DEC.0020.001D] # SQUARED SS -00DF ; [.1DEC.0020.0004][.0000.010B.0004][.1DEC.0020.0004] # LATIN SMALL LETTER SHARP S -1E9E ; [.1DEC.0020.000A][.0000.010B.0004][.1DEC.0020.000A] # LATIN CAPITAL LETTER SHARP S -FB06 ; [.1DEC.0020.0004][.1E10.0020.0004] # LATIN SMALL LIGATURE ST -FB05 ; [.1DEC.0020.0004][.0000.010C.0004][.1E10.0020.0004] # LATIN SMALL LIGATURE LONG S T -33DC ; [.1DEC.0020.001D][.1E5E.0020.001C] # SQUARE SV -A731 ; [.1DF0.0020.0002] # LATIN LETTER SMALL CAPITAL S -1D74 ; [.1DF1.0020.0002] # LATIN SMALL LETTER S WITH MIDDLE TILDE -1D8A ; [.1DF2.0020.0002] # LATIN SMALL LETTER S WITH PALATAL HOOK -0282 ; [.1DF3.0020.0002] # LATIN SMALL LETTER S WITH HOOK -1DB3 ; [.1DF3.0020.0014] # MODIFIER LETTER SMALL S WITH HOOK -023F ; [.1DF7.0020.0002] # LATIN SMALL LETTER S WITH SWASH TAIL -2C7E ; [.1DF7.0020.0008] # LATIN CAPITAL LETTER S WITH SWASH TAIL -1E9C ; [.1DFB.0020.0002] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE -1E9D ; [.1DFC.0020.0002] # LATIN SMALL LETTER LONG S WITH HIGH STROKE -0283 ; [.1DFD.0020.0002] # LATIN SMALL LETTER ESH -1DEF ; [.1DFD.0020.0004] # COMBINING LATIN SMALL LETTER ESH -01A9 ; [.1DFD.0020.0008] # LATIN CAPITAL LETTER ESH -1DB4 ; [.1DFD.0020.0014] # MODIFIER LETTER SMALL ESH -AB4D ; [.1E01.0020.0002] # LATIN SMALL LETTER BASELINE ESH -1D8B ; [.1E02.0020.0002] # LATIN SMALL LETTER ESH WITH PALATAL HOOK -01AA ; [.1E03.0020.0002] # LATIN LETTER REVERSED ESH LOOP -0285 ; [.1E07.0020.0002] # LATIN SMALL LETTER SQUAT REVERSED ESH -1D98 ; [.1E0B.0020.0002] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK -0286 ; [.1E0C.0020.0002] # LATIN SMALL LETTER ESH WITH CURL -0074 ; [.1E10.0020.0002] # LATIN SMALL LETTER T -FF54 ; [.1E10.0020.0003] # FULLWIDTH LATIN SMALL LETTER T -036D ; [.1E10.0020.0004] # COMBINING LATIN SMALL LETTER T -24AF ; [*0310.0020.0004][.1E10.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER T -1D42D ; [.1E10.0020.0005] # MATHEMATICAL BOLD SMALL T -1D461 ; [.1E10.0020.0005] # MATHEMATICAL ITALIC SMALL T -1D495 ; [.1E10.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL T -1D4C9 ; [.1E10.0020.0005] # MATHEMATICAL SCRIPT SMALL T -1D4FD ; [.1E10.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL T -1D531 ; [.1E10.0020.0005] # MATHEMATICAL FRAKTUR SMALL T -1D565 ; [.1E10.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL T -1D599 ; [.1E10.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL T -1D5CD ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF SMALL T -1D601 ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL T -1D635 ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL T -1D669 ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T -1D69D ; [.1E10.0020.0005] # MATHEMATICAL MONOSPACE SMALL T -24E3 ; [.1E10.0020.0006] # CIRCLED LATIN SMALL LETTER T -0054 ; [.1E10.0020.0008] # LATIN CAPITAL LETTER T -FF34 ; [.1E10.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER T -1F123 ; [*0310.0020.0004][.1E10.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER T -1D413 ; [.1E10.0020.000B] # MATHEMATICAL BOLD CAPITAL T -1D447 ; [.1E10.0020.000B] # MATHEMATICAL ITALIC CAPITAL T -1D47B ; [.1E10.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL T -1D4AF ; [.1E10.0020.000B] # MATHEMATICAL SCRIPT CAPITAL T -1D4E3 ; [.1E10.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL T -1D517 ; [.1E10.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL T -1D54B ; [.1E10.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T -1D57F ; [.1E10.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL T -1D5B3 ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL T -1D5E7 ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T -1D61B ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T -1D64F ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T -1D683 ; [.1E10.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL T -24C9 ; [.1E10.0020.000C] # CIRCLED LATIN CAPITAL LETTER T -1F163 ; [.1E10.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER T -1D57 ; [.1E10.0020.0014] # MODIFIER LETTER SMALL T -209C ; [.1E10.0020.0015] # LATIN SUBSCRIPT SMALL LETTER T -1D40 ; [.1E10.0020.001D] # MODIFIER LETTER CAPITAL T -1F143 ; [.1E10.0020.001D] # SQUARED LATIN CAPITAL LETTER T -1F183 ; [.1E10.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER T -0165 ; [.1E10.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER T WITH CARON -0164 ; [.1E10.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER T WITH CARON -1E97 ; [.1E10.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER T WITH DIAERESIS -1E6B ; [.1E10.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER T WITH DOT ABOVE -1E6A ; [.1E10.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER T WITH DOT ABOVE -0163 ; [.1E10.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER T WITH CEDILLA -0162 ; [.1E10.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER T WITH CEDILLA -1E6D ; [.1E10.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER T WITH DOT BELOW -1E6C ; [.1E10.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER T WITH DOT BELOW -021B ; [.1E10.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER T WITH COMMA BELOW -021A ; [.1E10.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER T WITH COMMA BELOW -1E71 ; [.1E10.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW -1E70 ; [.1E10.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW -1E6F ; [.1E10.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER T WITH LINE BELOW -1E6E ; [.1E10.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER T WITH LINE BELOW -A787 ; [.1E10.0020.0004][.0000.010C.0004] # LATIN SMALL LETTER INSULAR T -A786 ; [.1E10.0020.000A][.0000.010C.0004] # LATIN CAPITAL LETTER INSULAR T -02A8 ; [.1E10.0020.0004][.1C04.0020.0004] # LATIN SMALL LETTER TC DIGRAPH WITH CURL -2121 ; [.1E10.0020.000A][.1C25.0020.000A][.1CF2.0020.000A] # TELEPHONE SIGN -1D7A ; [.1E10.0020.0004][.0000.010B.0004][.1C93.0020.0004] # LATIN SMALL LETTER TH WITH STRIKETHROUGH -3394 ; [.1E10.0020.001D][.1C93.0020.001D][.1E9C.0020.001C] # SQUARE THZ -2122 ; [.1E10.0020.0014][.1D25.0020.0014] # TRADE MARK SIGN -01BE ; [.1E10.0020.0004][.1DEC.0020.0004] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE -02A6 ; [.1E10.0020.0004][.1DEC.0020.0004] # LATIN SMALL LETTER TS DIGRAPH -02A7 ; [.1E10.0020.0004][.1DFD.0020.0004] # LATIN SMALL LETTER TESH DIGRAPH -A729 ; [.1E10.0020.0004][.1E9C.0020.0004] # LATIN SMALL LETTER TZ -A728 ; [.1E10.0020.000A][.1E9C.0020.0004] # LATIN CAPITAL LETTER TZ -1D1B ; [.1E14.0020.0002] # LATIN LETTER SMALL CAPITAL T -0167 ; [.1E15.0020.0002] # LATIN SMALL LETTER T WITH STROKE -0166 ; [.1E15.0020.0008] # LATIN CAPITAL LETTER T WITH STROKE -2C66 ; [.1E19.0020.0002] # LATIN SMALL LETTER T WITH DIAGONAL STROKE -023E ; [.1E19.0020.0008] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE -1D75 ; [.1E1A.0020.0002] # LATIN SMALL LETTER T WITH MIDDLE TILDE -01AB ; [.1E1B.0020.0002] # LATIN SMALL LETTER T WITH PALATAL HOOK -1DB5 ; [.1E1B.0020.0014] # MODIFIER LETTER SMALL T WITH PALATAL HOOK -01AD ; [.1E1F.0020.0002] # LATIN SMALL LETTER T WITH HOOK -01AC ; [.1E1F.0020.0008] # LATIN CAPITAL LETTER T WITH HOOK -0288 ; [.1E23.0020.0002] # LATIN SMALL LETTER T WITH RETROFLEX HOOK -01AE ; [.1E23.0020.0008] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK -0236 ; [.1E27.0020.0002] # LATIN SMALL LETTER T WITH CURL -A777 ; [.1E2B.0020.0002] # LATIN SMALL LETTER TUM -0287 ; [.1E2C.0020.0002] # LATIN SMALL LETTER TURNED T -A7B1 ; [.1E2C.0020.0008] # LATIN CAPITAL LETTER TURNED T -0075 ; [.1E30.0020.0002] # LATIN SMALL LETTER U -FF55 ; [.1E30.0020.0003] # FULLWIDTH LATIN SMALL LETTER U -0367 ; [.1E30.0020.0004] # COMBINING LATIN SMALL LETTER U -24B0 ; [*0310.0020.0004][.1E30.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER U -1D42E ; [.1E30.0020.0005] # MATHEMATICAL BOLD SMALL U -1D462 ; [.1E30.0020.0005] # MATHEMATICAL ITALIC SMALL U -1D496 ; [.1E30.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL U -1D4CA ; [.1E30.0020.0005] # MATHEMATICAL SCRIPT SMALL U -1D4FE ; [.1E30.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL U -1D532 ; [.1E30.0020.0005] # MATHEMATICAL FRAKTUR SMALL U -1D566 ; [.1E30.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL U -1D59A ; [.1E30.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL U -1D5CE ; [.1E30.0020.0005] # MATHEMATICAL SANS-SERIF SMALL U -1D602 ; [.1E30.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL U -1D636 ; [.1E30.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL U -1D66A ; [.1E30.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U -1D69E ; [.1E30.0020.0005] # MATHEMATICAL MONOSPACE SMALL U -24E4 ; [.1E30.0020.0006] # CIRCLED LATIN SMALL LETTER U -0055 ; [.1E30.0020.0008] # LATIN CAPITAL LETTER U -FF35 ; [.1E30.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER U -1F124 ; [*0310.0020.0004][.1E30.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER U -1D414 ; [.1E30.0020.000B] # MATHEMATICAL BOLD CAPITAL U -1D448 ; [.1E30.0020.000B] # MATHEMATICAL ITALIC CAPITAL U -1D47C ; [.1E30.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL U -1D4B0 ; [.1E30.0020.000B] # MATHEMATICAL SCRIPT CAPITAL U -1D4E4 ; [.1E30.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL U -1D518 ; [.1E30.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL U -1D54C ; [.1E30.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U -1D580 ; [.1E30.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL U -1D5B4 ; [.1E30.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL U -1D5E8 ; [.1E30.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U -1D61C ; [.1E30.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U -1D650 ; [.1E30.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U -1D684 ; [.1E30.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL U -24CA ; [.1E30.0020.000C] # CIRCLED LATIN CAPITAL LETTER U -1F164 ; [.1E30.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER U -1D58 ; [.1E30.0020.0014] # MODIFIER LETTER SMALL U -1D64 ; [.1E30.0020.0015] # LATIN SUBSCRIPT SMALL LETTER U -1D41 ; [.1E30.0020.001D] # MODIFIER LETTER CAPITAL U -1F144 ; [.1E30.0020.001D] # SQUARED LATIN CAPITAL LETTER U -1F184 ; [.1E30.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER U -00FA ; [.1E30.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH ACUTE -00DA ; [.1E30.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH ACUTE -00F9 ; [.1E30.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH GRAVE -00D9 ; [.1E30.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH GRAVE -016D ; [.1E30.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER U WITH BREVE -016C ; [.1E30.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER U WITH BREVE -00FB ; [.1E30.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX -00DB ; [.1E30.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -01D4 ; [.1E30.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH CARON -01D3 ; [.1E30.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH CARON -016F ; [.1E30.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER U WITH RING ABOVE -016E ; [.1E30.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER U WITH RING ABOVE -00FC ; [.1E30.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH DIAERESIS -1DF4 ; [.1E30.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER U WITH DIAERESIS -A79F ; [.1E30.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK UE -00DC ; [.1E30.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS -A79E ; [.1E30.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK UE -01D8 ; [.1E30.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE -01D7 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE -01DC ; [.1E30.0020.0002][.0000.002B.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE -01DB ; [.1E30.0020.0008][.0000.002B.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE -01DA ; [.1E30.0020.0002][.0000.002B.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON -01D9 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON -01D6 ; [.1E30.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON -01D5 ; [.1E30.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON -0171 ; [.1E30.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER U WITH DOUBLE ACUTE -0170 ; [.1E30.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0169 ; [.1E30.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH TILDE -0168 ; [.1E30.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH TILDE -1E79 ; [.1E30.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH TILDE AND ACUTE -1E78 ; [.1E30.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE -0173 ; [.1E30.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER U WITH OGONEK -0172 ; [.1E30.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER U WITH OGONEK -016B ; [.1E30.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH MACRON -016A ; [.1E30.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH MACRON -1E7B ; [.1E30.0020.0002][.0000.0032.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS -1E7A ; [.1E30.0020.0008][.0000.0032.0002][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS -1DF0 ; [.1E30.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE -1EE7 ; [.1E30.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HOOK ABOVE -1EE6 ; [.1E30.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HOOK ABOVE -0215 ; [.1E30.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER U WITH DOUBLE GRAVE -0214 ; [.1E30.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE -0217 ; [.1E30.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER U WITH INVERTED BREVE -0216 ; [.1E30.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER U WITH INVERTED BREVE -01B0 ; [.1E30.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER U WITH HORN -01AF ; [.1E30.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER U WITH HORN -1EE9 ; [.1E30.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH HORN AND ACUTE -1EE8 ; [.1E30.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE -1EEB ; [.1E30.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH HORN AND GRAVE -1EEA ; [.1E30.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE -1EEF ; [.1E30.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH HORN AND TILDE -1EEE ; [.1E30.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH HORN AND TILDE -1EED ; [.1E30.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE -1EEC ; [.1E30.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE -1EF1 ; [.1E30.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW -1EF0 ; [.1E30.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW -1EE5 ; [.1E30.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH DOT BELOW -1EE4 ; [.1E30.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH DOT BELOW -1E73 ; [.1E30.0020.0002][.0000.0043.0002] # LATIN SMALL LETTER U WITH DIAERESIS BELOW -1E72 ; [.1E30.0020.0008][.0000.0043.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW -1E77 ; [.1E30.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW -1E76 ; [.1E30.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW -1E75 ; [.1E30.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER U WITH TILDE BELOW -1E74 ; [.1E30.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER U WITH TILDE BELOW -1F199 ; [.1E30.0020.001D][.1D87.0020.001D][*025F.0020.001C] # SQUARED UP WITH EXCLAMATION MARK -1D1C ; [.1E34.0020.0002] # LATIN LETTER SMALL CAPITAL U -1DB8 ; [.1E34.0020.0014] # MODIFIER LETTER SMALL CAPITAL U -AB4E ; [.1E35.0020.0002] # LATIN SMALL LETTER U WITH SHORT RIGHT LEG -1D1D ; [.1E36.0020.0002] # LATIN SMALL LETTER SIDEWAYS U -1D59 ; [.1E36.0020.0014] # MODIFIER LETTER SMALL SIDEWAYS U -1D1E ; [.1E37.0020.0002] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U -1D6B ; [.1E38.0020.0002] # LATIN SMALL LETTER UE -AB50 ; [.1E39.0020.0002] # LATIN SMALL LETTER UI -AB51 ; [.1E3A.0020.0002] # LATIN SMALL LETTER TURNED UI -0289 ; [.1E3B.0020.0002] # LATIN SMALL LETTER U BAR -0244 ; [.1E3B.0020.0008] # LATIN CAPITAL LETTER U BAR -1DB6 ; [.1E3B.0020.0014] # MODIFIER LETTER SMALL U BAR -AB4F ; [.1E3F.0020.0002] # LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG -1D7E ; [.1E40.0020.0002] # LATIN SMALL CAPITAL LETTER U WITH STROKE -1D99 ; [.1E41.0020.0002] # LATIN SMALL LETTER U WITH RETROFLEX HOOK -AB52 ; [.1E42.0020.0002] # LATIN SMALL LETTER U WITH LEFT HOOK -AB5F ; [.1E42.0020.0014] # MODIFIER LETTER SMALL U WITH LEFT HOOK -0265 ; [.1E43.0020.0002] # LATIN SMALL LETTER TURNED H -A78D ; [.1E43.0020.0008] # LATIN CAPITAL LETTER TURNED H -1DA3 ; [.1E43.0020.0014] # MODIFIER LETTER SMALL TURNED H -02AE ; [.1E47.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK -02AF ; [.1E4B.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -026F ; [.1E4F.0020.0002] # LATIN SMALL LETTER TURNED M -019C ; [.1E4F.0020.0008] # LATIN CAPITAL LETTER TURNED M -1D5A ; [.1E4F.0020.0014] # MODIFIER LETTER SMALL TURNED M -A7FA ; [.1E53.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED M -1D1F ; [.1E54.0020.0002] # LATIN SMALL LETTER SIDEWAYS TURNED M -0270 ; [.1E55.0020.0002] # LATIN SMALL LETTER TURNED M WITH LONG LEG -1DAD ; [.1E55.0020.0014] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG -028A ; [.1E59.0020.0002] # LATIN SMALL LETTER UPSILON -01B1 ; [.1E59.0020.0008] # LATIN CAPITAL LETTER UPSILON -1DB7 ; [.1E59.0020.0014] # MODIFIER LETTER SMALL UPSILON -1D7F ; [.1E5D.0020.0002] # LATIN SMALL LETTER UPSILON WITH STROKE -0076 ; [.1E5E.0020.0002] # LATIN SMALL LETTER V -FF56 ; [.1E5E.0020.0003] # FULLWIDTH LATIN SMALL LETTER V -036E ; [.1E5E.0020.0004] # COMBINING LATIN SMALL LETTER V -2174 ; [.1E5E.0020.0004] # SMALL ROMAN NUMERAL FIVE -24B1 ; [*0310.0020.0004][.1E5E.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER V -1D42F ; [.1E5E.0020.0005] # MATHEMATICAL BOLD SMALL V -1D463 ; [.1E5E.0020.0005] # MATHEMATICAL ITALIC SMALL V -1D497 ; [.1E5E.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL V -1D4CB ; [.1E5E.0020.0005] # MATHEMATICAL SCRIPT SMALL V -1D4FF ; [.1E5E.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL V -1D533 ; [.1E5E.0020.0005] # MATHEMATICAL FRAKTUR SMALL V -1D567 ; [.1E5E.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL V -1D59B ; [.1E5E.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL V -1D5CF ; [.1E5E.0020.0005] # MATHEMATICAL SANS-SERIF SMALL V -1D603 ; [.1E5E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL V -1D637 ; [.1E5E.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL V -1D66B ; [.1E5E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V -1D69F ; [.1E5E.0020.0005] # MATHEMATICAL MONOSPACE SMALL V -24E5 ; [.1E5E.0020.0006] # CIRCLED LATIN SMALL LETTER V -0056 ; [.1E5E.0020.0008] # LATIN CAPITAL LETTER V -FF36 ; [.1E5E.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER V -2164 ; [.1E5E.0020.000A] # ROMAN NUMERAL FIVE -1F125 ; [*0310.0020.0004][.1E5E.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER V -1D415 ; [.1E5E.0020.000B] # MATHEMATICAL BOLD CAPITAL V -1D449 ; [.1E5E.0020.000B] # MATHEMATICAL ITALIC CAPITAL V -1D47D ; [.1E5E.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL V -1D4B1 ; [.1E5E.0020.000B] # MATHEMATICAL SCRIPT CAPITAL V -1D4E5 ; [.1E5E.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL V -1D519 ; [.1E5E.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL V -1D54D ; [.1E5E.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V -1D581 ; [.1E5E.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL V -1D5B5 ; [.1E5E.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL V -1D5E9 ; [.1E5E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V -1D61D ; [.1E5E.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V -1D651 ; [.1E5E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V -1D685 ; [.1E5E.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL V -24CB ; [.1E5E.0020.000C] # CIRCLED LATIN CAPITAL LETTER V -1F165 ; [.1E5E.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER V -1D5B ; [.1E5E.0020.0014] # MODIFIER LETTER SMALL V -1D65 ; [.1E5E.0020.0015] # LATIN SUBSCRIPT SMALL LETTER V -2C7D ; [.1E5E.0020.001D] # MODIFIER LETTER CAPITAL V -1F145 ; [.1E5E.0020.001D] # SQUARED LATIN CAPITAL LETTER V -1F185 ; [.1E5E.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER V -1E7D ; [.1E5E.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER V WITH TILDE -1E7C ; [.1E5E.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER V WITH TILDE -1E7F ; [.1E5E.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER V WITH DOT BELOW -1E7E ; [.1E5E.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER V WITH DOT BELOW -2175 ; [.1E5E.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL SIX -2165 ; [.1E5E.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL SIX -2176 ; [.1E5E.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL SEVEN -2166 ; [.1E5E.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL SEVEN -2177 ; [.1E5E.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL EIGHT -2167 ; [.1E5E.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL EIGHT -33DE ; [.1E5E.0020.001D][*0605.0020.001C][.1D25.0020.001C] # SQUARE V OVER M -1F19A ; [.1E5E.0020.001D][.1DEC.0020.001D] # SQUARED VS -A761 ; [.1E5E.0020.0004][.1E86.0020.0004] # LATIN SMALL LETTER VY -A760 ; [.1E5E.0020.000A][.1E86.0020.000A] # LATIN CAPITAL LETTER VY -1D20 ; [.1E62.0020.0002] # LATIN LETTER SMALL CAPITAL V -A75F ; [.1E63.0020.0002] # LATIN SMALL LETTER V WITH DIAGONAL STROKE -A75E ; [.1E63.0020.0008] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE -1D8C ; [.1E64.0020.0002] # LATIN SMALL LETTER V WITH PALATAL HOOK -028B ; [.1E65.0020.0002] # LATIN SMALL LETTER V WITH HOOK -01B2 ; [.1E65.0020.0008] # LATIN CAPITAL LETTER V WITH HOOK -1DB9 ; [.1E65.0020.0014] # MODIFIER LETTER SMALL V WITH HOOK -2C71 ; [.1E69.0020.0002] # LATIN SMALL LETTER V WITH RIGHT HOOK -2C74 ; [.1E6A.0020.0002] # LATIN SMALL LETTER V WITH CURL -1EFD ; [.1E6B.0020.0002] # LATIN SMALL LETTER MIDDLE-WELSH V -1EFC ; [.1E6B.0020.0008] # LATIN CAPITAL LETTER MIDDLE-WELSH V -028C ; [.1E6C.0020.0002] # LATIN SMALL LETTER TURNED V -0245 ; [.1E6C.0020.0008] # LATIN CAPITAL LETTER TURNED V -1DBA ; [.1E6C.0020.0014] # MODIFIER LETTER SMALL TURNED V -0077 ; [.1E70.0020.0002] # LATIN SMALL LETTER W -FF57 ; [.1E70.0020.0003] # FULLWIDTH LATIN SMALL LETTER W -1DF1 ; [.1E70.0020.0004] # COMBINING LATIN SMALL LETTER W -24B2 ; [*0310.0020.0004][.1E70.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER W -1D430 ; [.1E70.0020.0005] # MATHEMATICAL BOLD SMALL W -1D464 ; [.1E70.0020.0005] # MATHEMATICAL ITALIC SMALL W -1D498 ; [.1E70.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL W -1D4CC ; [.1E70.0020.0005] # MATHEMATICAL SCRIPT SMALL W -1D500 ; [.1E70.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL W -1D534 ; [.1E70.0020.0005] # MATHEMATICAL FRAKTUR SMALL W -1D568 ; [.1E70.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL W -1D59C ; [.1E70.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL W -1D5D0 ; [.1E70.0020.0005] # MATHEMATICAL SANS-SERIF SMALL W -1D604 ; [.1E70.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL W -1D638 ; [.1E70.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL W -1D66C ; [.1E70.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W -1D6A0 ; [.1E70.0020.0005] # MATHEMATICAL MONOSPACE SMALL W -24E6 ; [.1E70.0020.0006] # CIRCLED LATIN SMALL LETTER W -0057 ; [.1E70.0020.0008] # LATIN CAPITAL LETTER W -FF37 ; [.1E70.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER W -1F126 ; [*0310.0020.0004][.1E70.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER W -1D416 ; [.1E70.0020.000B] # MATHEMATICAL BOLD CAPITAL W -1D44A ; [.1E70.0020.000B] # MATHEMATICAL ITALIC CAPITAL W -1D47E ; [.1E70.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL W -1D4B2 ; [.1E70.0020.000B] # MATHEMATICAL SCRIPT CAPITAL W -1D4E6 ; [.1E70.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL W -1D51A ; [.1E70.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL W -1D54E ; [.1E70.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W -1D582 ; [.1E70.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL W -1D5B6 ; [.1E70.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL W -1D5EA ; [.1E70.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W -1D61E ; [.1E70.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W -1D652 ; [.1E70.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W -1D686 ; [.1E70.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL W -24CC ; [.1E70.0020.000C] # CIRCLED LATIN CAPITAL LETTER W -1F166 ; [.1E70.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER W -02B7 ; [.1E70.0020.0014] # MODIFIER LETTER SMALL W -1D42 ; [.1E70.0020.001D] # MODIFIER LETTER CAPITAL W -1F146 ; [.1E70.0020.001D] # SQUARED LATIN CAPITAL LETTER W -1F186 ; [.1E70.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER W -1E83 ; [.1E70.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER W WITH ACUTE -1E82 ; [.1E70.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER W WITH ACUTE -1E81 ; [.1E70.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER W WITH GRAVE -1E80 ; [.1E70.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER W WITH GRAVE -0175 ; [.1E70.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER W WITH CIRCUMFLEX -0174 ; [.1E70.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX -1E98 ; [.1E70.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER W WITH RING ABOVE -1E85 ; [.1E70.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER W WITH DIAERESIS -1E84 ; [.1E70.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER W WITH DIAERESIS -1E87 ; [.1E70.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER W WITH DOT ABOVE -1E86 ; [.1E70.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER W WITH DOT ABOVE -1E89 ; [.1E70.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER W WITH DOT BELOW -1E88 ; [.1E70.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER W WITH DOT BELOW -33DD ; [.1E70.0020.001D][.1BDB.0020.001C] # SQUARE WB -1F14F ; [.1E70.0020.001D][.1BF5.0020.001D] # SQUARED WC -1F18F ; [.1E70.0020.001D][.1BF5.0020.001D] # NEGATIVE SQUARED WC -1F12E ; [.1E70.0020.000C][.1E9C.0020.000C] # CIRCLED WZ -1D21 ; [.1E74.0020.0002] # LATIN LETTER SMALL CAPITAL W -2C73 ; [.1E75.0020.0002] # LATIN SMALL LETTER W WITH HOOK -2C72 ; [.1E75.0020.0008] # LATIN CAPITAL LETTER W WITH HOOK -028D ; [.1E76.0020.0002] # LATIN SMALL LETTER TURNED W -0078 ; [.1E7A.0020.0002] # LATIN SMALL LETTER X -FF58 ; [.1E7A.0020.0003] # FULLWIDTH LATIN SMALL LETTER X -036F ; [.1E7A.0020.0004] # COMBINING LATIN SMALL LETTER X -2179 ; [.1E7A.0020.0004] # SMALL ROMAN NUMERAL TEN -24B3 ; [*0310.0020.0004][.1E7A.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER X -1D431 ; [.1E7A.0020.0005] # MATHEMATICAL BOLD SMALL X -1D465 ; [.1E7A.0020.0005] # MATHEMATICAL ITALIC SMALL X -1D499 ; [.1E7A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL X -1D4CD ; [.1E7A.0020.0005] # MATHEMATICAL SCRIPT SMALL X -1D501 ; [.1E7A.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL X -1D535 ; [.1E7A.0020.0005] # MATHEMATICAL FRAKTUR SMALL X -1D569 ; [.1E7A.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL X -1D59D ; [.1E7A.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL X -1D5D1 ; [.1E7A.0020.0005] # MATHEMATICAL SANS-SERIF SMALL X -1D605 ; [.1E7A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL X -1D639 ; [.1E7A.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL X -1D66D ; [.1E7A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X -1D6A1 ; [.1E7A.0020.0005] # MATHEMATICAL MONOSPACE SMALL X -24E7 ; [.1E7A.0020.0006] # CIRCLED LATIN SMALL LETTER X -0058 ; [.1E7A.0020.0008] # LATIN CAPITAL LETTER X -FF38 ; [.1E7A.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER X -2169 ; [.1E7A.0020.000A] # ROMAN NUMERAL TEN -1F127 ; [*0310.0020.0004][.1E7A.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER X -1D417 ; [.1E7A.0020.000B] # MATHEMATICAL BOLD CAPITAL X -1D44B ; [.1E7A.0020.000B] # MATHEMATICAL ITALIC CAPITAL X -1D47F ; [.1E7A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL X -1D4B3 ; [.1E7A.0020.000B] # MATHEMATICAL SCRIPT CAPITAL X -1D4E7 ; [.1E7A.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL X -1D51B ; [.1E7A.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL X -1D54F ; [.1E7A.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X -1D583 ; [.1E7A.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL X -1D5B7 ; [.1E7A.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL X -1D5EB ; [.1E7A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X -1D61F ; [.1E7A.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X -1D653 ; [.1E7A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X -1D687 ; [.1E7A.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL X -24CD ; [.1E7A.0020.000C] # CIRCLED LATIN CAPITAL LETTER X -1F167 ; [.1E7A.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER X -02E3 ; [.1E7A.0020.0014] # MODIFIER LETTER SMALL X -2093 ; [.1E7A.0020.0015] # LATIN SUBSCRIPT SMALL LETTER X -1F147 ; [.1E7A.0020.001D] # SQUARED LATIN CAPITAL LETTER X -1F187 ; [.1E7A.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER X -1E8D ; [.1E7A.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER X WITH DIAERESIS -1E8C ; [.1E7A.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER X WITH DIAERESIS -1E8B ; [.1E7A.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER X WITH DOT ABOVE -1E8A ; [.1E7A.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER X WITH DOT ABOVE -217A ; [.1E7A.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL ELEVEN -216A ; [.1E7A.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL ELEVEN -217B ; [.1E7A.0020.0004][.1CAD.0020.0004][.1CAD.0020.0004] # SMALL ROMAN NUMERAL TWELVE -216B ; [.1E7A.0020.000A][.1CAD.0020.000A][.1CAD.0020.000A] # ROMAN NUMERAL TWELVE -1D8D ; [.1E7E.0020.0002] # LATIN SMALL LETTER X WITH PALATAL HOOK -AB56 ; [.1E7F.0020.0002] # LATIN SMALL LETTER X WITH LOW RIGHT RING -AB57 ; [.1E80.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG -AB58 ; [.1E81.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING -AB59 ; [.1E82.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF -AB53 ; [.1E83.0020.0002] # LATIN SMALL LETTER CHI -A7B3 ; [.1E83.0020.0008] # LATIN CAPITAL LETTER CHI -AB54 ; [.1E84.0020.0002] # LATIN SMALL LETTER CHI WITH LOW RIGHT RING -AB55 ; [.1E85.0020.0002] # LATIN SMALL LETTER CHI WITH LOW LEFT SERIF -0079 ; [.1E86.0020.0002] # LATIN SMALL LETTER Y -FF59 ; [.1E86.0020.0003] # FULLWIDTH LATIN SMALL LETTER Y -24B4 ; [*0310.0020.0004][.1E86.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Y -1D432 ; [.1E86.0020.0005] # MATHEMATICAL BOLD SMALL Y -1D466 ; [.1E86.0020.0005] # MATHEMATICAL ITALIC SMALL Y -1D49A ; [.1E86.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Y -1D4CE ; [.1E86.0020.0005] # MATHEMATICAL SCRIPT SMALL Y -1D502 ; [.1E86.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Y -1D536 ; [.1E86.0020.0005] # MATHEMATICAL FRAKTUR SMALL Y -1D56A ; [.1E86.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Y -1D59E ; [.1E86.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Y -1D5D2 ; [.1E86.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Y -1D606 ; [.1E86.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Y -1D63A ; [.1E86.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y -1D66E ; [.1E86.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y -1D6A2 ; [.1E86.0020.0005] # MATHEMATICAL MONOSPACE SMALL Y -24E8 ; [.1E86.0020.0006] # CIRCLED LATIN SMALL LETTER Y -0059 ; [.1E86.0020.0008] # LATIN CAPITAL LETTER Y -FF39 ; [.1E86.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Y -1F128 ; [*0310.0020.0004][.1E86.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Y -1D418 ; [.1E86.0020.000B] # MATHEMATICAL BOLD CAPITAL Y -1D44C ; [.1E86.0020.000B] # MATHEMATICAL ITALIC CAPITAL Y -1D480 ; [.1E86.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Y -1D4B4 ; [.1E86.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Y -1D4E8 ; [.1E86.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Y -1D51C ; [.1E86.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Y -1D550 ; [.1E86.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D584 ; [.1E86.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y -1D5B8 ; [.1E86.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Y -1D5EC ; [.1E86.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y -1D620 ; [.1E86.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y -1D654 ; [.1E86.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y -1D688 ; [.1E86.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Y -24CE ; [.1E86.0020.000C] # CIRCLED LATIN CAPITAL LETTER Y -1F168 ; [.1E86.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Y -02B8 ; [.1E86.0020.0014] # MODIFIER LETTER SMALL Y -1F148 ; [.1E86.0020.001D] # SQUARED LATIN CAPITAL LETTER Y -1F188 ; [.1E86.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Y -00FD ; [.1E86.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Y WITH ACUTE -00DD ; [.1E86.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Y WITH ACUTE -1EF3 ; [.1E86.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER Y WITH GRAVE -1EF2 ; [.1E86.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER Y WITH GRAVE -0177 ; [.1E86.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Y WITH CIRCUMFLEX -0176 ; [.1E86.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX -1E99 ; [.1E86.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER Y WITH RING ABOVE -00FF ; [.1E86.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER Y WITH DIAERESIS -0178 ; [.1E86.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER Y WITH DIAERESIS -1EF9 ; [.1E86.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER Y WITH TILDE -1EF8 ; [.1E86.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER Y WITH TILDE -1E8F ; [.1E86.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Y WITH DOT ABOVE -1E8E ; [.1E86.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Y WITH DOT ABOVE -0233 ; [.1E86.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER Y WITH MACRON -0232 ; [.1E86.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER Y WITH MACRON -1EF7 ; [.1E86.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER Y WITH HOOK ABOVE -1EF6 ; [.1E86.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE -1EF5 ; [.1E86.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Y WITH DOT BELOW -1EF4 ; [.1E86.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Y WITH DOT BELOW -028F ; [.1E8A.0020.0002] # LATIN LETTER SMALL CAPITAL Y -024F ; [.1E8E.0020.0002] # LATIN SMALL LETTER Y WITH STROKE -024E ; [.1E8E.0020.0008] # LATIN CAPITAL LETTER Y WITH STROKE -01B4 ; [.1E92.0020.0002] # LATIN SMALL LETTER Y WITH HOOK -01B3 ; [.1E92.0020.0008] # LATIN CAPITAL LETTER Y WITH HOOK -1EFF ; [.1E96.0020.0002] # LATIN SMALL LETTER Y WITH LOOP -1EFE ; [.1E96.0020.0008] # LATIN CAPITAL LETTER Y WITH LOOP -AB5A ; [.1E97.0020.0002] # LATIN SMALL LETTER Y WITH SHORT RIGHT LEG -021D ; [.1E98.0020.0002] # LATIN SMALL LETTER YOGH -021C ; [.1E98.0020.0008] # LATIN CAPITAL LETTER YOGH -007A ; [.1E9C.0020.0002] # LATIN SMALL LETTER Z -FF5A ; [.1E9C.0020.0003] # FULLWIDTH LATIN SMALL LETTER Z -1DE6 ; [.1E9C.0020.0004] # COMBINING LATIN SMALL LETTER Z -24B5 ; [*0310.0020.0004][.1E9C.0020.0004][*0311.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Z -1D433 ; [.1E9C.0020.0005] # MATHEMATICAL BOLD SMALL Z -1D467 ; [.1E9C.0020.0005] # MATHEMATICAL ITALIC SMALL Z -1D49B ; [.1E9C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Z -1D4CF ; [.1E9C.0020.0005] # MATHEMATICAL SCRIPT SMALL Z -1D503 ; [.1E9C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Z -1D537 ; [.1E9C.0020.0005] # MATHEMATICAL FRAKTUR SMALL Z -1D56B ; [.1E9C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Z -1D59F ; [.1E9C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Z -1D5D3 ; [.1E9C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Z -1D607 ; [.1E9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Z -1D63B ; [.1E9C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z -1D66F ; [.1E9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z -1D6A3 ; [.1E9C.0020.0005] # MATHEMATICAL MONOSPACE SMALL Z -24E9 ; [.1E9C.0020.0006] # CIRCLED LATIN SMALL LETTER Z -005A ; [.1E9C.0020.0008] # LATIN CAPITAL LETTER Z -FF3A ; [.1E9C.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Z -1F129 ; [*0310.0020.0004][.1E9C.0020.000A][*0311.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Z -2124 ; [.1E9C.0020.000B] # DOUBLE-STRUCK CAPITAL Z -2128 ; [.1E9C.0020.000B] # BLACK-LETTER CAPITAL Z -1D419 ; [.1E9C.0020.000B] # MATHEMATICAL BOLD CAPITAL Z -1D44D ; [.1E9C.0020.000B] # MATHEMATICAL ITALIC CAPITAL Z -1D481 ; [.1E9C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Z -1D4B5 ; [.1E9C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Z -1D4E9 ; [.1E9C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Z -1D585 ; [.1E9C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z -1D5B9 ; [.1E9C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Z -1D5ED ; [.1E9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z -1D621 ; [.1E9C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z -1D655 ; [.1E9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z -1D689 ; [.1E9C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Z -24CF ; [.1E9C.0020.000C] # CIRCLED LATIN CAPITAL LETTER Z -1F169 ; [.1E9C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Z -1DBB ; [.1E9C.0020.0014] # MODIFIER LETTER SMALL Z -1F149 ; [.1E9C.0020.001D] # SQUARED LATIN CAPITAL LETTER Z -1F189 ; [.1E9C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Z -017A ; [.1E9C.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Z WITH ACUTE -0179 ; [.1E9C.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Z WITH ACUTE -1E91 ; [.1E9C.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Z WITH CIRCUMFLEX -1E90 ; [.1E9C.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX -017E ; [.1E9C.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER Z WITH CARON -017D ; [.1E9C.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER Z WITH CARON -017C ; [.1E9C.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Z WITH DOT ABOVE -017B ; [.1E9C.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Z WITH DOT ABOVE -1E93 ; [.1E9C.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Z WITH DOT BELOW -1E92 ; [.1E9C.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Z WITH DOT BELOW -1E95 ; [.1E9C.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER Z WITH LINE BELOW -1E94 ; [.1E9C.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER Z WITH LINE BELOW -018D ; [.1E9C.0020.0004][.1E70.0020.0004] # LATIN SMALL LETTER TURNED DELTA -1D22 ; [.1EA0.0020.0002] # LATIN LETTER SMALL CAPITAL Z -01B6 ; [.1EA1.0020.0002] # LATIN SMALL LETTER Z WITH STROKE -01B5 ; [.1EA1.0020.0008] # LATIN CAPITAL LETTER Z WITH STROKE -1D76 ; [.1EA5.0020.0002] # LATIN SMALL LETTER Z WITH MIDDLE TILDE -1D8E ; [.1EA6.0020.0002] # LATIN SMALL LETTER Z WITH PALATAL HOOK -0225 ; [.1EA7.0020.0002] # LATIN SMALL LETTER Z WITH HOOK -0224 ; [.1EA7.0020.0008] # LATIN CAPITAL LETTER Z WITH HOOK -0290 ; [.1EAB.0020.0002] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK -1DBC ; [.1EAB.0020.0014] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK -0291 ; [.1EAF.0020.0002] # LATIN SMALL LETTER Z WITH CURL -1DBD ; [.1EAF.0020.0014] # MODIFIER LETTER SMALL Z WITH CURL -0240 ; [.1EB3.0020.0002] # LATIN SMALL LETTER Z WITH SWASH TAIL -2C7F ; [.1EB3.0020.0008] # LATIN CAPITAL LETTER Z WITH SWASH TAIL -2C6C ; [.1EB7.0020.0002] # LATIN SMALL LETTER Z WITH DESCENDER -2C6B ; [.1EB7.0020.0008] # LATIN CAPITAL LETTER Z WITH DESCENDER -A763 ; [.1EB8.0020.0002] # LATIN SMALL LETTER VISIGOTHIC Z -A762 ; [.1EB8.0020.0008] # LATIN CAPITAL LETTER VISIGOTHIC Z -0292 ; [.1EB9.0020.0002] # LATIN SMALL LETTER EZH -01B7 ; [.1EB9.0020.0008] # LATIN CAPITAL LETTER EZH -1DBE ; [.1EB9.0020.0014] # MODIFIER LETTER SMALL EZH -01EF ; [.1EB9.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER EZH WITH CARON -01EE ; [.1EB9.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER EZH WITH CARON -1D23 ; [.1EBD.0020.0002] # LATIN LETTER SMALL CAPITAL EZH -01B9 ; [.1EBE.0020.0002] # LATIN SMALL LETTER EZH REVERSED -01B8 ; [.1EBE.0020.0008] # LATIN CAPITAL LETTER EZH REVERSED -1D9A ; [.1EC2.0020.0002] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK -01BA ; [.1EC3.0020.0002] # LATIN SMALL LETTER EZH WITH TAIL -0293 ; [.1EC7.0020.0002] # LATIN SMALL LETTER EZH WITH CURL -00FE ; [.1ECB.0020.0002] # LATIN SMALL LETTER THORN -00DE ; [.1ECB.0020.0008] # LATIN CAPITAL LETTER THORN -A765 ; [.1ECF.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE -A764 ; [.1ECF.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE -A767 ; [.1ED0.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER -A766 ; [.1ED0.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER -01BF ; [.1ED1.0020.0002] # LATIN LETTER WYNN -01F7 ; [.1ED1.0020.0008] # LATIN CAPITAL LETTER WYNN -A769 ; [.1ED5.0020.0002] # LATIN SMALL LETTER VEND -A768 ; [.1ED5.0020.0008] # LATIN CAPITAL LETTER VEND -AB60 ; [.1ED6.0020.0002] # LATIN SMALL LETTER SAKHA YAT -AB61 ; [.1ED7.0020.0002] # LATIN SMALL LETTER IOTIFIED E -AB63 ; [.1ED8.0020.0002] # LATIN SMALL LETTER UO -A76B ; [.1ED9.0020.0002] # LATIN SMALL LETTER ET -A76A ; [.1ED9.0020.0008] # LATIN CAPITAL LETTER ET -A76D ; [.1EDA.0020.0002] # LATIN SMALL LETTER IS -A76C ; [.1EDA.0020.0008] # LATIN CAPITAL LETTER IS -A76F ; [.1EDB.0020.0002] # LATIN SMALL LETTER CON -1DD2 ; [.1EDB.0020.0004] # COMBINING US ABOVE -A76E ; [.1EDB.0020.0008] # LATIN CAPITAL LETTER CON -A770 ; [.1EDB.0020.0014] # MODIFIER LETTER US -A778 ; [.1EDC.0020.0002] # LATIN SMALL LETTER UM -01BB ; [.1EDD.0020.0002] # LATIN LETTER TWO WITH STROKE -A72B ; [.1EE1.0020.0002] # LATIN SMALL LETTER TRESILLO -A72A ; [.1EE1.0020.0008] # LATIN CAPITAL LETTER TRESILLO -A72D ; [.1EE2.0020.0002] # LATIN SMALL LETTER CUATRILLO -A72C ; [.1EE2.0020.0008] # LATIN CAPITAL LETTER CUATRILLO -A72F ; [.1EE3.0020.0002] # LATIN SMALL LETTER CUATRILLO WITH COMMA -A72E ; [.1EE3.0020.0008] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA -01A8 ; [.1EE4.0020.0002] # LATIN SMALL LETTER TONE TWO -01A7 ; [.1EE4.0020.0008] # LATIN CAPITAL LETTER TONE TWO -01BD ; [.1EE8.0020.0002] # LATIN SMALL LETTER TONE FIVE -01BC ; [.1EE8.0020.0008] # LATIN CAPITAL LETTER TONE FIVE -0185 ; [.1EEC.0020.0002] # LATIN SMALL LETTER TONE SIX -0184 ; [.1EEC.0020.0008] # LATIN CAPITAL LETTER TONE SIX -0294 ; [.1EF0.0020.0002] # LATIN LETTER GLOTTAL STOP -0242 ; [.1EF4.0020.0002] # LATIN SMALL LETTER GLOTTAL STOP -0241 ; [.1EF4.0020.0008] # LATIN CAPITAL LETTER GLOTTAL STOP -02C0 ; [.1EF8.0020.0002] # MODIFIER LETTER GLOTTAL STOP -02BC ; [.1EF9.0020.0002] # MODIFIER LETTER APOSTROPHE -0149 ; [.1EF9.0020.0004][.1D34.0020.0004] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -02EE ; [.1EFA.0020.0002] # MODIFIER LETTER DOUBLE APOSTROPHE -02BE ; [.1EFB.0020.0002] # MODIFIER LETTER RIGHT HALF RING -A723 ; [.1EFC.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF -A722 ; [.1EFC.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF -A78C ; [.1EFD.0020.0002] # LATIN SMALL LETTER SALTILLO -A78B ; [.1EFD.0020.0008] # LATIN CAPITAL LETTER SALTILLO -A78F ; [.1EFE.0020.0002] # LATIN LETTER SINOLOGICAL DOT -0295 ; [.1EFF.0020.0002] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE -02E4 ; [.1EFF.0020.0014] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02BF ; [.1F03.0020.0002] # MODIFIER LETTER LEFT HALF RING -02C1 ; [.1F04.0020.0002] # MODIFIER LETTER REVERSED GLOTTAL STOP -1D24 ; [.1F05.0020.0002] # LATIN LETTER VOICED LARYNGEAL SPIRANT -1D25 ; [.1F06.0020.0002] # LATIN LETTER AIN -1D5C ; [.1F06.0020.0014] # MODIFIER LETTER SMALL AIN -A725 ; [.1F07.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL AIN -A724 ; [.1F07.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN -02A1 ; [.1F08.0020.0002] # LATIN LETTER GLOTTAL STOP WITH STROKE -02A2 ; [.1F0C.0020.0002] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE -0296 ; [.1F10.0020.0002] # LATIN LETTER INVERTED GLOTTAL STOP -01C0 ; [.1F14.0020.0002] # LATIN LETTER DENTAL CLICK -01C1 ; [.1F18.0020.0002] # LATIN LETTER LATERAL CLICK -01C2 ; [.1F1C.0020.0002] # LATIN LETTER ALVEOLAR CLICK -01C3 ; [.1F20.0020.0002] # LATIN LETTER RETROFLEX CLICK -0297 ; [.1F24.0020.0002] # LATIN LETTER STRETCHED C -0298 ; [.1F28.0020.0002] # LATIN LETTER BILABIAL CLICK -02AC ; [.1F2C.0020.0002] # LATIN LETTER BILABIAL PERCUSSIVE -02AD ; [.1F30.0020.0002] # LATIN LETTER BIDENTAL PERCUSSIVE -03B1 ; [.1F34.0020.0002] # GREEK SMALL LETTER ALPHA -1D6C2 ; [.1F34.0020.0005] # MATHEMATICAL BOLD SMALL ALPHA -1D6FC ; [.1F34.0020.0005] # MATHEMATICAL ITALIC SMALL ALPHA -1D736 ; [.1F34.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ALPHA -1D770 ; [.1F34.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA -1D7AA ; [.1F34.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA -0391 ; [.1F34.0020.0008] # GREEK CAPITAL LETTER ALPHA -1D6A8 ; [.1F34.0020.000B] # MATHEMATICAL BOLD CAPITAL ALPHA -1D6E2 ; [.1F34.0020.000B] # MATHEMATICAL ITALIC CAPITAL ALPHA -1D71C ; [.1F34.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA -1D756 ; [.1F34.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA -1D790 ; [.1F34.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA -1F00 ; [.1F34.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ALPHA WITH PSILI -1F08 ; [.1F34.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI -1F04 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA -1F0C ; [.1F34.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA -1F84 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1F8C ; [.1F34.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1F02 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA -1F0A ; [.1F34.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA -1F82 ; [.1F34.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1F8A ; [.1F34.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1F06 ; [.1F34.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI -1F0E ; [.1F34.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI -1F86 ; [.1F34.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1F8E ; [.1F34.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1F80 ; [.1F34.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI -1F88 ; [.1F34.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI -1F01 ; [.1F34.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ALPHA WITH DASIA -1F09 ; [.1F34.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA -1F05 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA -1F0D ; [.1F34.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA -1F85 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1F8D ; [.1F34.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1F03 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA -1F0B ; [.1F34.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA -1F83 ; [.1F34.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1F8B ; [.1F34.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1F07 ; [.1F34.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F0F ; [.1F34.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F87 ; [.1F34.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1F8F ; [.1F34.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1F81 ; [.1F34.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI -1F89 ; [.1F34.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI -03AC ; [.1F34.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH TONOS -1F71 ; [.1F34.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH OXIA -0386 ; [.1F34.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH TONOS -1FBB ; [.1F34.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH OXIA -1FB4 ; [.1F34.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1F70 ; [.1F34.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH VARIA -1FBA ; [.1F34.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH VARIA -1FB2 ; [.1F34.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI -1FB0 ; [.1F34.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER ALPHA WITH VRACHY -1FB8 ; [.1F34.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER ALPHA WITH VRACHY -1FB6 ; [.1F34.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI -1FB7 ; [.1F34.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI -1FB1 ; [.1F34.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER ALPHA WITH MACRON -1FB9 ; [.1F34.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER ALPHA WITH MACRON -1FB3 ; [.1F34.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI -1FBC ; [.1F34.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -03B2 ; [.1F35.0020.0002] # GREEK SMALL LETTER BETA -03D0 ; [.1F35.0020.0004] # GREEK BETA SYMBOL -1D6C3 ; [.1F35.0020.0005] # MATHEMATICAL BOLD SMALL BETA -1D6FD ; [.1F35.0020.0005] # MATHEMATICAL ITALIC SMALL BETA -1D737 ; [.1F35.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL BETA -1D771 ; [.1F35.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA -1D7AB ; [.1F35.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA -0392 ; [.1F35.0020.0008] # GREEK CAPITAL LETTER BETA -1D6A9 ; [.1F35.0020.000B] # MATHEMATICAL BOLD CAPITAL BETA -1D6E3 ; [.1F35.0020.000B] # MATHEMATICAL ITALIC CAPITAL BETA -1D71D ; [.1F35.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL BETA -1D757 ; [.1F35.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA -1D791 ; [.1F35.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA -1D5D ; [.1F35.0020.0014] # MODIFIER LETTER SMALL BETA -1D66 ; [.1F35.0020.0015] # GREEK SUBSCRIPT SMALL LETTER BETA -03B3 ; [.1F36.0020.0002] # GREEK SMALL LETTER GAMMA -213D ; [.1F36.0020.0005] # DOUBLE-STRUCK SMALL GAMMA -1D6C4 ; [.1F36.0020.0005] # MATHEMATICAL BOLD SMALL GAMMA -1D6FE ; [.1F36.0020.0005] # MATHEMATICAL ITALIC SMALL GAMMA -1D738 ; [.1F36.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL GAMMA -1D772 ; [.1F36.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA -1D7AC ; [.1F36.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA -0393 ; [.1F36.0020.0008] # GREEK CAPITAL LETTER GAMMA -213E ; [.1F36.0020.000B] # DOUBLE-STRUCK CAPITAL GAMMA -1D6AA ; [.1F36.0020.000B] # MATHEMATICAL BOLD CAPITAL GAMMA -1D6E4 ; [.1F36.0020.000B] # MATHEMATICAL ITALIC CAPITAL GAMMA -1D71E ; [.1F36.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA -1D758 ; [.1F36.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA -1D792 ; [.1F36.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA -1D5E ; [.1F36.0020.0014] # MODIFIER LETTER SMALL GREEK GAMMA -1D67 ; [.1F36.0020.0015] # GREEK SUBSCRIPT SMALL LETTER GAMMA -1D26 ; [.1F37.0020.0002] # GREEK LETTER SMALL CAPITAL GAMMA -03B4 ; [.1F38.0020.0002] # GREEK SMALL LETTER DELTA -1D6C5 ; [.1F38.0020.0005] # MATHEMATICAL BOLD SMALL DELTA -1D6FF ; [.1F38.0020.0005] # MATHEMATICAL ITALIC SMALL DELTA -1D739 ; [.1F38.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL DELTA -1D773 ; [.1F38.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA -1D7AD ; [.1F38.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA -0394 ; [.1F38.0020.0008] # GREEK CAPITAL LETTER DELTA -1D6AB ; [.1F38.0020.000B] # MATHEMATICAL BOLD CAPITAL DELTA -1D6E5 ; [.1F38.0020.000B] # MATHEMATICAL ITALIC CAPITAL DELTA -1D71F ; [.1F38.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA -1D759 ; [.1F38.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA -1D793 ; [.1F38.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA -1D5F ; [.1F38.0020.0014] # MODIFIER LETTER SMALL DELTA -03B5 ; [.1F39.0020.0002] # GREEK SMALL LETTER EPSILON -03F5 ; [.1F39.0020.0004] # GREEK LUNATE EPSILON SYMBOL -1D6C6 ; [.1F39.0020.0005] # MATHEMATICAL BOLD SMALL EPSILON -1D6DC ; [.1F39.0020.0005] # MATHEMATICAL BOLD EPSILON SYMBOL -1D700 ; [.1F39.0020.0005] # MATHEMATICAL ITALIC SMALL EPSILON -1D716 ; [.1F39.0020.0005] # MATHEMATICAL ITALIC EPSILON SYMBOL -1D73A ; [.1F39.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL EPSILON -1D750 ; [.1F39.0020.0005] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL -1D774 ; [.1F39.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON -1D78A ; [.1F39.0020.0005] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL -1D7AE ; [.1F39.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON -1D7C4 ; [.1F39.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL -0395 ; [.1F39.0020.0008] # GREEK CAPITAL LETTER EPSILON -1D6AC ; [.1F39.0020.000B] # MATHEMATICAL BOLD CAPITAL EPSILON -1D6E6 ; [.1F39.0020.000B] # MATHEMATICAL ITALIC CAPITAL EPSILON -1D720 ; [.1F39.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON -1D75A ; [.1F39.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON -1D794 ; [.1F39.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON -1F10 ; [.1F39.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER EPSILON WITH PSILI -1F18 ; [.1F39.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI -1F14 ; [.1F39.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA -1F1C ; [.1F39.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA -1F12 ; [.1F39.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA -1F1A ; [.1F39.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA -1F11 ; [.1F39.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER EPSILON WITH DASIA -1F19 ; [.1F39.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA -1F15 ; [.1F39.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F1D ; [.1F39.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F13 ; [.1F39.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA -1F1B ; [.1F39.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA -03AD ; [.1F39.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH TONOS -1F73 ; [.1F39.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH OXIA -0388 ; [.1F39.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH TONOS -1FC9 ; [.1F39.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH OXIA -1F72 ; [.1F39.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH VARIA -1FC8 ; [.1F39.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH VARIA -03DD ; [.1F3A.0020.0002] # GREEK SMALL LETTER DIGAMMA -1D7CB ; [.1F3A.0020.0005] # MATHEMATICAL BOLD SMALL DIGAMMA -03DC ; [.1F3A.0020.0008] # GREEK LETTER DIGAMMA -1D7CA ; [.1F3A.0020.000B] # MATHEMATICAL BOLD CAPITAL DIGAMMA -0377 ; [.1F3B.0020.0002] # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA -0376 ; [.1F3B.0020.0008] # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA -03DB ; [.1F3C.0020.0002] # GREEK SMALL LETTER STIGMA -03DA ; [.1F3C.0020.0008] # GREEK LETTER STIGMA -03B6 ; [.1F3D.0020.0002] # GREEK SMALL LETTER ZETA -1D6C7 ; [.1F3D.0020.0005] # MATHEMATICAL BOLD SMALL ZETA -1D701 ; [.1F3D.0020.0005] # MATHEMATICAL ITALIC SMALL ZETA -1D73B ; [.1F3D.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ZETA -1D775 ; [.1F3D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA -1D7AF ; [.1F3D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA -0396 ; [.1F3D.0020.0008] # GREEK CAPITAL LETTER ZETA -1D6AD ; [.1F3D.0020.000B] # MATHEMATICAL BOLD CAPITAL ZETA -1D6E7 ; [.1F3D.0020.000B] # MATHEMATICAL ITALIC CAPITAL ZETA -1D721 ; [.1F3D.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA -1D75B ; [.1F3D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA -1D795 ; [.1F3D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA -0371 ; [.1F3E.0020.0002] # GREEK SMALL LETTER HETA -0370 ; [.1F3E.0020.0008] # GREEK CAPITAL LETTER HETA -03B7 ; [.1F3F.0020.0002] # GREEK SMALL LETTER ETA -1D6C8 ; [.1F3F.0020.0005] # MATHEMATICAL BOLD SMALL ETA -1D702 ; [.1F3F.0020.0005] # MATHEMATICAL ITALIC SMALL ETA -1D73C ; [.1F3F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ETA -1D776 ; [.1F3F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA -1D7B0 ; [.1F3F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA -0397 ; [.1F3F.0020.0008] # GREEK CAPITAL LETTER ETA -1D6AE ; [.1F3F.0020.000B] # MATHEMATICAL BOLD CAPITAL ETA -1D6E8 ; [.1F3F.0020.000B] # MATHEMATICAL ITALIC CAPITAL ETA -1D722 ; [.1F3F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ETA -1D75C ; [.1F3F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA -1D796 ; [.1F3F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA -1F20 ; [.1F3F.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ETA WITH PSILI -1F28 ; [.1F3F.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ETA WITH PSILI -1F24 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA -1F2C ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA -1F94 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1F9C ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1F22 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA -1F2A ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA -1F92 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1F9A ; [.1F3F.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1F26 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI -1F2E ; [.1F3F.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI -1F96 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1F9E ; [.1F3F.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1F90 ; [.1F3F.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI -1F98 ; [.1F3F.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI -1F21 ; [.1F3F.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ETA WITH DASIA -1F29 ; [.1F3F.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ETA WITH DASIA -1F25 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA -1F2D ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA -1F95 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1F9D ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1F23 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA -1F2B ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA -1F93 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1F9B ; [.1F3F.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1F27 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI -1F2F ; [.1F3F.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI -1F97 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1F9F ; [.1F3F.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1F91 ; [.1F3F.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI -1F99 ; [.1F3F.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI -03AE ; [.1F3F.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH TONOS -1F75 ; [.1F3F.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH OXIA -0389 ; [.1F3F.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH TONOS -1FCB ; [.1F3F.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH OXIA -1FC4 ; [.1F3F.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1F74 ; [.1F3F.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH VARIA -1FCA ; [.1F3F.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH VARIA -1FC2 ; [.1F3F.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI -1FC6 ; [.1F3F.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI -1FC7 ; [.1F3F.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI -1FC3 ; [.1F3F.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI -1FCC ; [.1F3F.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -03B8 ; [.1F40.0020.0002] # GREEK SMALL LETTER THETA -03D1 ; [.1F40.0020.0004] # GREEK THETA SYMBOL -1D6C9 ; [.1F40.0020.0005] # MATHEMATICAL BOLD SMALL THETA -1D6DD ; [.1F40.0020.0005] # MATHEMATICAL BOLD THETA SYMBOL -1D703 ; [.1F40.0020.0005] # MATHEMATICAL ITALIC SMALL THETA -1D717 ; [.1F40.0020.0005] # MATHEMATICAL ITALIC THETA SYMBOL -1D73D ; [.1F40.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL THETA -1D751 ; [.1F40.0020.0005] # MATHEMATICAL BOLD ITALIC THETA SYMBOL -1D777 ; [.1F40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA -1D78B ; [.1F40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL -1D7B1 ; [.1F40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA -1D7C5 ; [.1F40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL -0398 ; [.1F40.0020.0008] # GREEK CAPITAL LETTER THETA -03F4 ; [.1F40.0020.000A] # GREEK CAPITAL THETA SYMBOL -1D6AF ; [.1F40.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA -1D6B9 ; [.1F40.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL -1D6E9 ; [.1F40.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA -1D6F3 ; [.1F40.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL -1D723 ; [.1F40.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA -1D72D ; [.1F40.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL -1D75D ; [.1F40.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA -1D767 ; [.1F40.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL -1D797 ; [.1F40.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA -1D7A1 ; [.1F40.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL -1DBF ; [.1F40.0020.0014] # MODIFIER LETTER SMALL THETA -03B9 ; [.1F41.0020.0002] # GREEK SMALL LETTER IOTA -1FBE ; [.1F41.0020.0002] # GREEK PROSGEGRAMMENI -037A ; [.1F41.0020.0004] # GREEK YPOGEGRAMMENI -1D6CA ; [.1F41.0020.0005] # MATHEMATICAL BOLD SMALL IOTA -1D704 ; [.1F41.0020.0005] # MATHEMATICAL ITALIC SMALL IOTA -1D73E ; [.1F41.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL IOTA -1D778 ; [.1F41.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA -1D7B2 ; [.1F41.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA -0399 ; [.1F41.0020.0008] # GREEK CAPITAL LETTER IOTA -1D6B0 ; [.1F41.0020.000B] # MATHEMATICAL BOLD CAPITAL IOTA -1D6EA ; [.1F41.0020.000B] # MATHEMATICAL ITALIC CAPITAL IOTA -1D724 ; [.1F41.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA -1D75E ; [.1F41.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA -1D798 ; [.1F41.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA -1F30 ; [.1F41.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER IOTA WITH PSILI -1F38 ; [.1F41.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI -1F34 ; [.1F41.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA -1F3C ; [.1F41.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA -1F32 ; [.1F41.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA -1F3A ; [.1F41.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA -1F36 ; [.1F41.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI -1F3E ; [.1F41.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI -1F31 ; [.1F41.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER IOTA WITH DASIA -1F39 ; [.1F41.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA -1F35 ; [.1F41.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA -1F3D ; [.1F41.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA -1F33 ; [.1F41.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA -1F3B ; [.1F41.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA -1F37 ; [.1F41.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI -1F3F ; [.1F41.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI -03AF ; [.1F41.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH TONOS -1F77 ; [.1F41.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH OXIA -038A ; [.1F41.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH TONOS -1FDB ; [.1F41.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH OXIA -1F76 ; [.1F41.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH VARIA -1FDA ; [.1F41.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH VARIA -1FD0 ; [.1F41.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER IOTA WITH VRACHY -1FD8 ; [.1F41.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER IOTA WITH VRACHY -1FD6 ; [.1F41.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PERISPOMENI -03CA ; [.1F41.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA -03AA ; [.1F41.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA -0390 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -1FD3 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD2 ; [.1F41.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA -1FD7 ; [.1F41.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI -1FD1 ; [.1F41.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER IOTA WITH MACRON -1FD9 ; [.1F41.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER IOTA WITH MACRON -03F3 ; [.1F42.0020.0002] # GREEK LETTER YOT -037F ; [.1F42.0020.0008] # GREEK CAPITAL LETTER YOT -03BA ; [.1F43.0020.0002] # GREEK SMALL LETTER KAPPA -03F0 ; [.1F43.0020.0004] # GREEK KAPPA SYMBOL -1D6CB ; [.1F43.0020.0005] # MATHEMATICAL BOLD SMALL KAPPA -1D6DE ; [.1F43.0020.0005] # MATHEMATICAL BOLD KAPPA SYMBOL -1D705 ; [.1F43.0020.0005] # MATHEMATICAL ITALIC SMALL KAPPA -1D718 ; [.1F43.0020.0005] # MATHEMATICAL ITALIC KAPPA SYMBOL -1D73F ; [.1F43.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL KAPPA -1D752 ; [.1F43.0020.0005] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL -1D779 ; [.1F43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA -1D78C ; [.1F43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL -1D7B3 ; [.1F43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA -1D7C6 ; [.1F43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL -039A ; [.1F43.0020.0008] # GREEK CAPITAL LETTER KAPPA -1D6B1 ; [.1F43.0020.000B] # MATHEMATICAL BOLD CAPITAL KAPPA -1D6EB ; [.1F43.0020.000B] # MATHEMATICAL ITALIC CAPITAL KAPPA -1D725 ; [.1F43.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA -1D75F ; [.1F43.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA -1D799 ; [.1F43.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA -03D7 ; [.1F43.0020.0004][.1F34.0020.0004][.1F41.0020.0004] # GREEK KAI SYMBOL -03CF ; [.1F43.0020.000A][.1F34.0020.0004][.1F41.0020.0004] # GREEK CAPITAL KAI SYMBOL -03BB ; [.1F44.0020.0002] # GREEK SMALL LETTER LAMDA -1D6CC ; [.1F44.0020.0005] # MATHEMATICAL BOLD SMALL LAMDA -1D706 ; [.1F44.0020.0005] # MATHEMATICAL ITALIC SMALL LAMDA -1D740 ; [.1F44.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL LAMDA -1D77A ; [.1F44.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA -1D7B4 ; [.1F44.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA -039B ; [.1F44.0020.0008] # GREEK CAPITAL LETTER LAMDA -1D6B2 ; [.1F44.0020.000B] # MATHEMATICAL BOLD CAPITAL LAMDA -1D6EC ; [.1F44.0020.000B] # MATHEMATICAL ITALIC CAPITAL LAMDA -1D726 ; [.1F44.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA -1D760 ; [.1F44.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA -1D79A ; [.1F44.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA -1D27 ; [.1F45.0020.0002] # GREEK LETTER SMALL CAPITAL LAMDA -03BC ; [.1F46.0020.0002] # GREEK SMALL LETTER MU -00B5 ; [.1F46.0020.0004] # MICRO SIGN -1D6CD ; [.1F46.0020.0005] # MATHEMATICAL BOLD SMALL MU -1D707 ; [.1F46.0020.0005] # MATHEMATICAL ITALIC SMALL MU -1D741 ; [.1F46.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL MU -1D77B ; [.1F46.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL MU -1D7B5 ; [.1F46.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU -039C ; [.1F46.0020.0008] # GREEK CAPITAL LETTER MU -1D6B3 ; [.1F46.0020.000B] # MATHEMATICAL BOLD CAPITAL MU -1D6ED ; [.1F46.0020.000B] # MATHEMATICAL ITALIC CAPITAL MU -1D727 ; [.1F46.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL MU -1D761 ; [.1F46.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU -1D79B ; [.1F46.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU -3382 ; [.1F46.0020.001C][.1BC2.0020.001D] # SQUARE MU A -338C ; [.1F46.0020.001C][.1C60.0020.001D] # SQUARE MU F -338D ; [.1F46.0020.001C][.1C6F.0020.001C] # SQUARE MU G -3395 ; [.1F46.0020.001C][.1CF2.0020.001C] # SQUARE MU L -339B ; [.1F46.0020.001C][.1D25.0020.001C] # SQUARE MU M -33B2 ; [.1F46.0020.001C][.1DEC.0020.001C] # SQUARE MU S -33B6 ; [.1F46.0020.001C][.1E5E.0020.001D] # SQUARE MU V -33BC ; [.1F46.0020.001C][.1E70.0020.001D] # SQUARE MU W -03BD ; [.1F47.0020.0002] # GREEK SMALL LETTER NU -1D6CE ; [.1F47.0020.0005] # MATHEMATICAL BOLD SMALL NU -1D708 ; [.1F47.0020.0005] # MATHEMATICAL ITALIC SMALL NU -1D742 ; [.1F47.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL NU -1D77C ; [.1F47.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL NU -1D7B6 ; [.1F47.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU -039D ; [.1F47.0020.0008] # GREEK CAPITAL LETTER NU -1D6B4 ; [.1F47.0020.000B] # MATHEMATICAL BOLD CAPITAL NU -1D6EE ; [.1F47.0020.000B] # MATHEMATICAL ITALIC CAPITAL NU -1D728 ; [.1F47.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL NU -1D762 ; [.1F47.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU -1D79C ; [.1F47.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU -03BE ; [.1F48.0020.0002] # GREEK SMALL LETTER XI -1D6CF ; [.1F48.0020.0005] # MATHEMATICAL BOLD SMALL XI -1D709 ; [.1F48.0020.0005] # MATHEMATICAL ITALIC SMALL XI -1D743 ; [.1F48.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL XI -1D77D ; [.1F48.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL XI -1D7B7 ; [.1F48.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI -039E ; [.1F48.0020.0008] # GREEK CAPITAL LETTER XI -1D6B5 ; [.1F48.0020.000B] # MATHEMATICAL BOLD CAPITAL XI -1D6EF ; [.1F48.0020.000B] # MATHEMATICAL ITALIC CAPITAL XI -1D729 ; [.1F48.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL XI -1D763 ; [.1F48.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI -1D79D ; [.1F48.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI -03BF ; [.1F49.0020.0002] # GREEK SMALL LETTER OMICRON -1D6D0 ; [.1F49.0020.0005] # MATHEMATICAL BOLD SMALL OMICRON -1D70A ; [.1F49.0020.0005] # MATHEMATICAL ITALIC SMALL OMICRON -1D744 ; [.1F49.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMICRON -1D77E ; [.1F49.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON -1D7B8 ; [.1F49.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON -039F ; [.1F49.0020.0008] # GREEK CAPITAL LETTER OMICRON -1D6B6 ; [.1F49.0020.000B] # MATHEMATICAL BOLD CAPITAL OMICRON -1D6F0 ; [.1F49.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMICRON -1D72A ; [.1F49.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON -1D764 ; [.1F49.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON -1D79E ; [.1F49.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON -1F40 ; [.1F49.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMICRON WITH PSILI -1F48 ; [.1F49.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI -1F44 ; [.1F49.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA -1F4C ; [.1F49.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA -1F42 ; [.1F49.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA -1F4A ; [.1F49.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA -1F41 ; [.1F49.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMICRON WITH DASIA -1F49 ; [.1F49.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA -1F45 ; [.1F49.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F4D ; [.1F49.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F43 ; [.1F49.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA -1F4B ; [.1F49.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA -03CC ; [.1F49.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH TONOS -1F79 ; [.1F49.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH OXIA -038C ; [.1F49.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH TONOS -1FF9 ; [.1F49.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH OXIA -1F78 ; [.1F49.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH VARIA -1FF8 ; [.1F49.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH VARIA -03C0 ; [.1F4A.0020.0002] # GREEK SMALL LETTER PI -03D6 ; [.1F4A.0020.0004] # GREEK PI SYMBOL -213C ; [.1F4A.0020.0005] # DOUBLE-STRUCK SMALL PI -1D6D1 ; [.1F4A.0020.0005] # MATHEMATICAL BOLD SMALL PI -1D6E1 ; [.1F4A.0020.0005] # MATHEMATICAL BOLD PI SYMBOL -1D70B ; [.1F4A.0020.0005] # MATHEMATICAL ITALIC SMALL PI -1D71B ; [.1F4A.0020.0005] # MATHEMATICAL ITALIC PI SYMBOL -1D745 ; [.1F4A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PI -1D755 ; [.1F4A.0020.0005] # MATHEMATICAL BOLD ITALIC PI SYMBOL -1D77F ; [.1F4A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PI -1D78F ; [.1F4A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL -1D7B9 ; [.1F4A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI -1D7C9 ; [.1F4A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -03A0 ; [.1F4A.0020.0008] # GREEK CAPITAL LETTER PI -213F ; [.1F4A.0020.000B] # DOUBLE-STRUCK CAPITAL PI -1D6B7 ; [.1F4A.0020.000B] # MATHEMATICAL BOLD CAPITAL PI -1D6F1 ; [.1F4A.0020.000B] # MATHEMATICAL ITALIC CAPITAL PI -1D72B ; [.1F4A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PI -1D765 ; [.1F4A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI -1D79F ; [.1F4A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI -1D28 ; [.1F4B.0020.0002] # GREEK LETTER SMALL CAPITAL PI -03FB ; [.1F4C.0020.0002] # GREEK SMALL LETTER SAN -03FA ; [.1F4C.0020.0008] # GREEK CAPITAL LETTER SAN -03DF ; [.1F4D.0020.0002] # GREEK SMALL LETTER KOPPA -03DE ; [.1F4D.0020.0008] # GREEK LETTER KOPPA -03D9 ; [.1F4E.0020.0002] # GREEK SMALL LETTER ARCHAIC KOPPA -03D8 ; [.1F4E.0020.0008] # GREEK LETTER ARCHAIC KOPPA -03C1 ; [.1F4F.0020.0002] # GREEK SMALL LETTER RHO -03F1 ; [.1F4F.0020.0004] # GREEK RHO SYMBOL -1D6D2 ; [.1F4F.0020.0005] # MATHEMATICAL BOLD SMALL RHO -1D6E0 ; [.1F4F.0020.0005] # MATHEMATICAL BOLD RHO SYMBOL -1D70C ; [.1F4F.0020.0005] # MATHEMATICAL ITALIC SMALL RHO -1D71A ; [.1F4F.0020.0005] # MATHEMATICAL ITALIC RHO SYMBOL -1D746 ; [.1F4F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL RHO -1D754 ; [.1F4F.0020.0005] # MATHEMATICAL BOLD ITALIC RHO SYMBOL -1D780 ; [.1F4F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO -1D78E ; [.1F4F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL -1D7BA ; [.1F4F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO -1D7C8 ; [.1F4F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL -03A1 ; [.1F4F.0020.0008] # GREEK CAPITAL LETTER RHO -1D6B8 ; [.1F4F.0020.000B] # MATHEMATICAL BOLD CAPITAL RHO -1D6F2 ; [.1F4F.0020.000B] # MATHEMATICAL ITALIC CAPITAL RHO -1D72C ; [.1F4F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL RHO -1D766 ; [.1F4F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO -1D7A0 ; [.1F4F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO -1D68 ; [.1F4F.0020.0015] # GREEK SUBSCRIPT SMALL LETTER RHO -1FE4 ; [.1F4F.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER RHO WITH PSILI -1FE5 ; [.1F4F.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER RHO WITH DASIA -1FEC ; [.1F4F.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER RHO WITH DASIA -1D29 ; [.1F50.0020.0002] # GREEK LETTER SMALL CAPITAL RHO -03FC ; [.1F51.0020.0002] # GREEK RHO WITH STROKE SYMBOL -03C3 ; [.1F52.0020.0002] # GREEK SMALL LETTER SIGMA -03F2 ; [.1F52.0020.0004] # GREEK LUNATE SIGMA SYMBOL -1D6D3 ; [.1F52.0020.0005] # MATHEMATICAL BOLD SMALL FINAL SIGMA -1D6D4 ; [.1F52.0020.0005] # MATHEMATICAL BOLD SMALL SIGMA -1D70D ; [.1F52.0020.0005] # MATHEMATICAL ITALIC SMALL FINAL SIGMA -1D70E ; [.1F52.0020.0005] # MATHEMATICAL ITALIC SMALL SIGMA -1D747 ; [.1F52.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA -1D748 ; [.1F52.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL SIGMA -1D781 ; [.1F52.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA -1D782 ; [.1F52.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA -1D7BB ; [.1F52.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA -1D7BC ; [.1F52.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA -03A3 ; [.1F52.0020.0008] # GREEK CAPITAL LETTER SIGMA -03F9 ; [.1F52.0020.000A] # GREEK CAPITAL LUNATE SIGMA SYMBOL -1D6BA ; [.1F52.0020.000B] # MATHEMATICAL BOLD CAPITAL SIGMA -1D6F4 ; [.1F52.0020.000B] # MATHEMATICAL ITALIC CAPITAL SIGMA -1D72E ; [.1F52.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA -1D768 ; [.1F52.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA -1D7A2 ; [.1F52.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA -03C2 ; [.1F52.0020.0019] # GREEK SMALL LETTER FINAL SIGMA -037C ; [.1F53.0020.0002] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL -03FE ; [.1F53.0020.0008] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL -037B ; [.1F54.0020.0002] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL -03FD ; [.1F54.0020.0008] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL -037D ; [.1F55.0020.0002] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL -03FF ; [.1F55.0020.0008] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL -03C4 ; [.1F56.0020.0002] # GREEK SMALL LETTER TAU -1D6D5 ; [.1F56.0020.0005] # MATHEMATICAL BOLD SMALL TAU -1D70F ; [.1F56.0020.0005] # MATHEMATICAL ITALIC SMALL TAU -1D749 ; [.1F56.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL TAU -1D783 ; [.1F56.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU -1D7BD ; [.1F56.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU -03A4 ; [.1F56.0020.0008] # GREEK CAPITAL LETTER TAU -1D6BB ; [.1F56.0020.000B] # MATHEMATICAL BOLD CAPITAL TAU -1D6F5 ; [.1F56.0020.000B] # MATHEMATICAL ITALIC CAPITAL TAU -1D72F ; [.1F56.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL TAU -1D769 ; [.1F56.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU -1D7A3 ; [.1F56.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU -03C5 ; [.1F57.0020.0002] # GREEK SMALL LETTER UPSILON -1D6D6 ; [.1F57.0020.0005] # MATHEMATICAL BOLD SMALL UPSILON -1D710 ; [.1F57.0020.0005] # MATHEMATICAL ITALIC SMALL UPSILON -1D74A ; [.1F57.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL UPSILON -1D784 ; [.1F57.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON -1D7BE ; [.1F57.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON -03A5 ; [.1F57.0020.0008] # GREEK CAPITAL LETTER UPSILON -03D2 ; [.1F57.0020.000A] # GREEK UPSILON WITH HOOK SYMBOL -1D6BC ; [.1F57.0020.000B] # MATHEMATICAL BOLD CAPITAL UPSILON -1D6F6 ; [.1F57.0020.000B] # MATHEMATICAL ITALIC CAPITAL UPSILON -1D730 ; [.1F57.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON -1D76A ; [.1F57.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON -1D7A4 ; [.1F57.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON -1F50 ; [.1F57.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER UPSILON WITH PSILI -1F54 ; [.1F57.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA -1F52 ; [.1F57.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA -1F56 ; [.1F57.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI -1F51 ; [.1F57.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER UPSILON WITH DASIA -1F59 ; [.1F57.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA -1F55 ; [.1F57.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA -1F5D ; [.1F57.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F53 ; [.1F57.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA -1F5B ; [.1F57.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F57 ; [.1F57.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F5F ; [.1F57.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI -03CD ; [.1F57.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH TONOS -1F7B ; [.1F57.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH OXIA -038E ; [.1F57.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH TONOS -1FEB ; [.1F57.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH OXIA -03D3 ; [.1F57.0020.000A][.0000.0024.0002] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL -1F7A ; [.1F57.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH VARIA -1FEA ; [.1F57.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH VARIA -1FE0 ; [.1F57.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER UPSILON WITH VRACHY -1FE8 ; [.1F57.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER UPSILON WITH VRACHY -1FE6 ; [.1F57.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI -03CB ; [.1F57.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA -03AB ; [.1F57.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -03D4 ; [.1F57.0020.000A][.0000.002B.0002] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL -03B0 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS -1FE3 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA -1FE2 ; [.1F57.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA -1FE7 ; [.1F57.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI -1FE1 ; [.1F57.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER UPSILON WITH MACRON -1FE9 ; [.1F57.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER UPSILON WITH MACRON -03C6 ; [.1F58.0020.0002] # GREEK SMALL LETTER PHI -03D5 ; [.1F58.0020.0004] # GREEK PHI SYMBOL -1D6D7 ; [.1F58.0020.0005] # MATHEMATICAL BOLD SMALL PHI -1D6DF ; [.1F58.0020.0005] # MATHEMATICAL BOLD PHI SYMBOL -1D711 ; [.1F58.0020.0005] # MATHEMATICAL ITALIC SMALL PHI -1D719 ; [.1F58.0020.0005] # MATHEMATICAL ITALIC PHI SYMBOL -1D74B ; [.1F58.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PHI -1D753 ; [.1F58.0020.0005] # MATHEMATICAL BOLD ITALIC PHI SYMBOL -1D785 ; [.1F58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI -1D78D ; [.1F58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL -1D7BF ; [.1F58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI -1D7C7 ; [.1F58.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL -03A6 ; [.1F58.0020.0008] # GREEK CAPITAL LETTER PHI -1D6BD ; [.1F58.0020.000B] # MATHEMATICAL BOLD CAPITAL PHI -1D6F7 ; [.1F58.0020.000B] # MATHEMATICAL ITALIC CAPITAL PHI -1D731 ; [.1F58.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PHI -1D76B ; [.1F58.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI -1D7A5 ; [.1F58.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI -1D60 ; [.1F58.0020.0014] # MODIFIER LETTER SMALL GREEK PHI -1D69 ; [.1F58.0020.0015] # GREEK SUBSCRIPT SMALL LETTER PHI -03C7 ; [.1F59.0020.0002] # GREEK SMALL LETTER CHI -1D6D8 ; [.1F59.0020.0005] # MATHEMATICAL BOLD SMALL CHI -1D712 ; [.1F59.0020.0005] # MATHEMATICAL ITALIC SMALL CHI -1D74C ; [.1F59.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL CHI -1D786 ; [.1F59.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI -1D7C0 ; [.1F59.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI -03A7 ; [.1F59.0020.0008] # GREEK CAPITAL LETTER CHI -1D6BE ; [.1F59.0020.000B] # MATHEMATICAL BOLD CAPITAL CHI -1D6F8 ; [.1F59.0020.000B] # MATHEMATICAL ITALIC CAPITAL CHI -1D732 ; [.1F59.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL CHI -1D76C ; [.1F59.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI -1D7A6 ; [.1F59.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI -1D61 ; [.1F59.0020.0014] # MODIFIER LETTER SMALL CHI -1D6A ; [.1F59.0020.0015] # GREEK SUBSCRIPT SMALL LETTER CHI -03C8 ; [.1F5A.0020.0002] # GREEK SMALL LETTER PSI -1D6D9 ; [.1F5A.0020.0005] # MATHEMATICAL BOLD SMALL PSI -1D713 ; [.1F5A.0020.0005] # MATHEMATICAL ITALIC SMALL PSI -1D74D ; [.1F5A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PSI -1D787 ; [.1F5A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI -1D7C1 ; [.1F5A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI -03A8 ; [.1F5A.0020.0008] # GREEK CAPITAL LETTER PSI -1D6BF ; [.1F5A.0020.000B] # MATHEMATICAL BOLD CAPITAL PSI -1D6F9 ; [.1F5A.0020.000B] # MATHEMATICAL ITALIC CAPITAL PSI -1D733 ; [.1F5A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PSI -1D76D ; [.1F5A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI -1D7A7 ; [.1F5A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI -1D2A ; [.1F5B.0020.0002] # GREEK LETTER SMALL CAPITAL PSI -03C9 ; [.1F5C.0020.0002] # GREEK SMALL LETTER OMEGA -1D6DA ; [.1F5C.0020.0005] # MATHEMATICAL BOLD SMALL OMEGA -1D714 ; [.1F5C.0020.0005] # MATHEMATICAL ITALIC SMALL OMEGA -1D74E ; [.1F5C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D788 ; [.1F5C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D7C2 ; [.1F5C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -03A9 ; [.1F5C.0020.0008] # GREEK CAPITAL LETTER OMEGA -2126 ; [.1F5C.0020.0008] # OHM SIGN -1D6C0 ; [.1F5C.0020.000B] # MATHEMATICAL BOLD CAPITAL OMEGA -1D6FA ; [.1F5C.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMEGA -1D734 ; [.1F5C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D76E ; [.1F5C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D7A8 ; [.1F5C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1F60 ; [.1F5C.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMEGA WITH PSILI -1F68 ; [.1F5C.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI -1F64 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA -1F6C ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA -1FA4 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1FAC ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1F62 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA -1F6A ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA -1FA2 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1FAA ; [.1F5C.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1F66 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI -1F6E ; [.1F5C.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI -1FA6 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1FAE ; [.1F5C.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1FA0 ; [.1F5C.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI -1FA8 ; [.1F5C.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI -1F61 ; [.1F5C.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMEGA WITH DASIA -1F69 ; [.1F5C.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA -1F65 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA -1F6D ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA -1FA5 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1FAD ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1F63 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA -1F6B ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA -1FA3 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1FAB ; [.1F5C.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1F67 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI -1F6F ; [.1F5C.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI -1FA7 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1FAF ; [.1F5C.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1FA1 ; [.1F5C.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI -1FA9 ; [.1F5C.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI -03CE ; [.1F5C.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH TONOS -1F7D ; [.1F5C.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH OXIA -038F ; [.1F5C.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH TONOS -1FFB ; [.1F5C.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH OXIA -1FF4 ; [.1F5C.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1F7C ; [.1F5C.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH VARIA -1FFA ; [.1F5C.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH VARIA -1FF2 ; [.1F5C.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI -1FF6 ; [.1F5C.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI -1FF7 ; [.1F5C.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI -1FF3 ; [.1F5C.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI -1FFC ; [.1F5C.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -AB65 ; [.1F5D.0020.0002] # GREEK LETTER SMALL CAPITAL OMEGA -03E1 ; [.1F5E.0020.0002] # GREEK SMALL LETTER SAMPI -03E0 ; [.1F5E.0020.0008] # GREEK LETTER SAMPI -0373 ; [.1F5F.0020.0002] # GREEK SMALL LETTER ARCHAIC SAMPI -0372 ; [.1F5F.0020.0008] # GREEK CAPITAL LETTER ARCHAIC SAMPI -03F8 ; [.1F60.0020.0002] # GREEK SMALL LETTER SHO -03F7 ; [.1F60.0020.0008] # GREEK CAPITAL LETTER SHO -2C81 ; [.1F61.0020.0002] # COPTIC SMALL LETTER ALFA -2C80 ; [.1F61.0020.0008] # COPTIC CAPITAL LETTER ALFA -2C83 ; [.1F62.0020.0002] # COPTIC SMALL LETTER VIDA -2C82 ; [.1F62.0020.0008] # COPTIC CAPITAL LETTER VIDA -2C85 ; [.1F63.0020.0002] # COPTIC SMALL LETTER GAMMA -2C84 ; [.1F63.0020.0008] # COPTIC CAPITAL LETTER GAMMA -2C87 ; [.1F64.0020.0002] # COPTIC SMALL LETTER DALDA -2C86 ; [.1F64.0020.0008] # COPTIC CAPITAL LETTER DALDA -2C89 ; [.1F65.0020.0002] # COPTIC SMALL LETTER EIE -2C88 ; [.1F65.0020.0008] # COPTIC CAPITAL LETTER EIE -2CB7 ; [.1F66.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE -2CB6 ; [.1F66.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE -2C8B ; [.1F67.0020.0002] # COPTIC SMALL LETTER SOU -2C8A ; [.1F67.0020.0008] # COPTIC CAPITAL LETTER SOU -2C8D ; [.1F68.0020.0002] # COPTIC SMALL LETTER ZATA -2C8C ; [.1F68.0020.0008] # COPTIC CAPITAL LETTER ZATA -2C8F ; [.1F69.0020.0002] # COPTIC SMALL LETTER HATE -2C8E ; [.1F69.0020.0008] # COPTIC CAPITAL LETTER HATE -2C91 ; [.1F6A.0020.0002] # COPTIC SMALL LETTER THETHE -2C90 ; [.1F6A.0020.0008] # COPTIC CAPITAL LETTER THETHE -2C93 ; [.1F6B.0020.0002] # COPTIC SMALL LETTER IAUDA -2C92 ; [.1F6B.0020.0008] # COPTIC CAPITAL LETTER IAUDA -2C95 ; [.1F6C.0020.0002] # COPTIC SMALL LETTER KAPA -2C94 ; [.1F6C.0020.0008] # COPTIC CAPITAL LETTER KAPA -2CE4 ; [.1F6C.0020.0004][.1F61.0020.0004][.1F6B.0020.0004] # COPTIC SYMBOL KAI -2CB9 ; [.1F6D.0020.0002] # COPTIC SMALL LETTER DIALECT-P KAPA -2CB8 ; [.1F6D.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P KAPA -2C97 ; [.1F6E.0020.0002] # COPTIC SMALL LETTER LAULA -2C96 ; [.1F6E.0020.0008] # COPTIC CAPITAL LETTER LAULA -2C99 ; [.1F6F.0020.0002] # COPTIC SMALL LETTER MI -2C98 ; [.1F6F.0020.0008] # COPTIC CAPITAL LETTER MI -2C9B ; [.1F70.0020.0002] # COPTIC SMALL LETTER NI -2C9A ; [.1F70.0020.0008] # COPTIC CAPITAL LETTER NI -2CBB ; [.1F71.0020.0002] # COPTIC SMALL LETTER DIALECT-P NI -2CBA ; [.1F71.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P NI -2CBD ; [.1F72.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI -2CBC ; [.1F72.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI -2C9D ; [.1F73.0020.0002] # COPTIC SMALL LETTER KSI -2C9C ; [.1F73.0020.0008] # COPTIC CAPITAL LETTER KSI -2C9F ; [.1F74.0020.0002] # COPTIC SMALL LETTER O -2C9E ; [.1F74.0020.0008] # COPTIC CAPITAL LETTER O -2CA1 ; [.1F75.0020.0002] # COPTIC SMALL LETTER PI -2CA0 ; [.1F75.0020.0008] # COPTIC CAPITAL LETTER PI -2CA3 ; [.1F76.0020.0002] # COPTIC SMALL LETTER RO -2CA2 ; [.1F76.0020.0008] # COPTIC CAPITAL LETTER RO -2CA5 ; [.1F77.0020.0002] # COPTIC SMALL LETTER SIMA -2CA4 ; [.1F77.0020.0008] # COPTIC CAPITAL LETTER SIMA -2CA7 ; [.1F78.0020.0002] # COPTIC SMALL LETTER TAU -2CA6 ; [.1F78.0020.0008] # COPTIC CAPITAL LETTER TAU -2CA9 ; [.1F79.0020.0002] # COPTIC SMALL LETTER UA -2CA8 ; [.1F79.0020.0008] # COPTIC CAPITAL LETTER UA -2CAB ; [.1F7A.0020.0002] # COPTIC SMALL LETTER FI -2CAA ; [.1F7A.0020.0008] # COPTIC CAPITAL LETTER FI -2CAD ; [.1F7B.0020.0002] # COPTIC SMALL LETTER KHI -2CAC ; [.1F7B.0020.0008] # COPTIC CAPITAL LETTER KHI -2CAF ; [.1F7C.0020.0002] # COPTIC SMALL LETTER PSI -2CAE ; [.1F7C.0020.0008] # COPTIC CAPITAL LETTER PSI -2CB1 ; [.1F7D.0020.0002] # COPTIC SMALL LETTER OOU -2CB0 ; [.1F7D.0020.0008] # COPTIC CAPITAL LETTER OOU -2CBF ; [.1F7E.0020.0002] # COPTIC SMALL LETTER OLD COPTIC OOU -2CBE ; [.1F7E.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC OOU -2CC1 ; [.1F7F.0020.0002] # COPTIC SMALL LETTER SAMPI -2CC0 ; [.1F7F.0020.0008] # COPTIC CAPITAL LETTER SAMPI -03E3 ; [.1F80.0020.0002] # COPTIC SMALL LETTER SHEI -03E2 ; [.1F80.0020.0008] # COPTIC CAPITAL LETTER SHEI -2CEC ; [.1F81.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI -2CEB ; [.1F81.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI -2CC3 ; [.1F82.0020.0002] # COPTIC SMALL LETTER CROSSED SHEI -2CC2 ; [.1F82.0020.0008] # COPTIC CAPITAL LETTER CROSSED SHEI -2CC5 ; [.1F83.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHEI -2CC4 ; [.1F83.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHEI -2CC7 ; [.1F84.0020.0002] # COPTIC SMALL LETTER OLD COPTIC ESH -2CC6 ; [.1F84.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC ESH -03E5 ; [.1F85.0020.0002] # COPTIC SMALL LETTER FEI -03E4 ; [.1F85.0020.0008] # COPTIC CAPITAL LETTER FEI -03E7 ; [.1F86.0020.0002] # COPTIC SMALL LETTER KHEI -03E6 ; [.1F86.0020.0008] # COPTIC CAPITAL LETTER KHEI -2CF3 ; [.1F87.0020.0002] # COPTIC SMALL LETTER BOHAIRIC KHEI -2CF2 ; [.1F87.0020.0008] # COPTIC CAPITAL LETTER BOHAIRIC KHEI -2CC9 ; [.1F88.0020.0002] # COPTIC SMALL LETTER AKHMIMIC KHEI -2CC8 ; [.1F88.0020.0008] # COPTIC CAPITAL LETTER AKHMIMIC KHEI -03E9 ; [.1F89.0020.0002] # COPTIC SMALL LETTER HORI -03E8 ; [.1F89.0020.0008] # COPTIC CAPITAL LETTER HORI -2CCB ; [.1F8A.0020.0002] # COPTIC SMALL LETTER DIALECT-P HORI -2CCA ; [.1F8A.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P HORI -2CCD ; [.1F8B.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HORI -2CCC ; [.1F8B.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HORI -2CCF ; [.1F8C.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HA -2CCE ; [.1F8C.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HA -2CD1 ; [.1F8D.0020.0002] # COPTIC SMALL LETTER L-SHAPED HA -2CD0 ; [.1F8D.0020.0008] # COPTIC CAPITAL LETTER L-SHAPED HA -2CD3 ; [.1F8E.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HEI -2CD2 ; [.1F8E.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HEI -2CD5 ; [.1F8F.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HAT -2CD4 ; [.1F8F.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HAT -03EB ; [.1F90.0020.0002] # COPTIC SMALL LETTER GANGIA -03EA ; [.1F90.0020.0008] # COPTIC CAPITAL LETTER GANGIA -2CEE ; [.1F91.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA -2CED ; [.1F91.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA -2CD7 ; [.1F92.0020.0002] # COPTIC SMALL LETTER OLD COPTIC GANGIA -2CD6 ; [.1F92.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA -03ED ; [.1F93.0020.0002] # COPTIC SMALL LETTER SHIMA -03EC ; [.1F93.0020.0008] # COPTIC CAPITAL LETTER SHIMA -2CD9 ; [.1F94.0020.0002] # COPTIC SMALL LETTER OLD COPTIC DJA -2CD8 ; [.1F94.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC DJA -2CDB ; [.1F95.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHIMA -2CDA ; [.1F95.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA -2CDD ; [.1F96.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN SHIMA -2CDC ; [.1F96.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA -03EF ; [.1F97.0020.0002] # COPTIC SMALL LETTER DEI -03EE ; [.1F97.0020.0008] # COPTIC CAPITAL LETTER DEI -2CB3 ; [.1F98.0020.0002] # COPTIC SMALL LETTER DIALECT-P ALEF -2CB2 ; [.1F98.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P ALEF -2CB5 ; [.1F99.0020.0002] # COPTIC SMALL LETTER OLD COPTIC AIN -2CB4 ; [.1F99.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC AIN -2CDF ; [.1F9A.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NGI -2CDE ; [.1F9A.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NGI -2CE1 ; [.1F9B.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NYI -2CE0 ; [.1F9B.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NYI -2CE3 ; [.1F9C.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN WAU -2CE2 ; [.1F9C.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN WAU -0430 ; [.1F9D.0020.0002] # CYRILLIC SMALL LETTER A -2DF6 ; [.1F9D.0020.0004] # COMBINING CYRILLIC LETTER A -0410 ; [.1F9D.0020.0008] # CYRILLIC CAPITAL LETTER A -04D1 ; [.1F9D.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER A WITH BREVE -04D0 ; [.1F9D.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER A WITH BREVE -04D3 ; [.1F9D.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER A WITH DIAERESIS -04D2 ; [.1F9D.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS -04D9 ; [.1FA1.0020.0002] # CYRILLIC SMALL LETTER SCHWA -04D8 ; [.1FA1.0020.0008] # CYRILLIC CAPITAL LETTER SCHWA -04DB ; [.1FA1.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS -04DA ; [.1FA1.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS -04D5 ; [.1FA5.0020.0002] # CYRILLIC SMALL LIGATURE A IE -04D4 ; [.1FA5.0020.0008] # CYRILLIC CAPITAL LIGATURE A IE -0431 ; [.1FA9.0020.0002] # CYRILLIC SMALL LETTER BE -2DE0 ; [.1FA9.0020.0004] # COMBINING CYRILLIC LETTER BE -0411 ; [.1FA9.0020.0008] # CYRILLIC CAPITAL LETTER BE -0432 ; [.1FAD.0020.0002] # CYRILLIC SMALL LETTER VE -2DE1 ; [.1FAD.0020.0004] # COMBINING CYRILLIC LETTER VE -0412 ; [.1FAD.0020.0008] # CYRILLIC CAPITAL LETTER VE -0433 ; [.1FB1.0020.0002] # CYRILLIC SMALL LETTER GHE -2DE2 ; [.1FB1.0020.0004] # COMBINING CYRILLIC LETTER GHE -0413 ; [.1FB1.0020.0008] # CYRILLIC CAPITAL LETTER GHE -0453 ; [.1FB1.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER GJE -0403 ; [.1FB1.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER GJE -0491 ; [.1FB1.0020.0004][.0000.010C.0004] # CYRILLIC SMALL LETTER GHE WITH UPTURN -0490 ; [.1FB1.0020.000A][.0000.010C.0004] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN -0493 ; [.1FB5.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE -0492 ; [.1FB5.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE -04FB ; [.1FB9.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK -04FA ; [.1FB9.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK -0495 ; [.1FBD.0020.0002] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK -0494 ; [.1FBD.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK -04F7 ; [.1FC1.0020.0002] # CYRILLIC SMALL LETTER GHE WITH DESCENDER -04F6 ; [.1FC1.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER -0434 ; [.1FC5.0020.0002] # CYRILLIC SMALL LETTER DE -2DE3 ; [.1FC5.0020.0004] # COMBINING CYRILLIC LETTER DE -0414 ; [.1FC5.0020.0008] # CYRILLIC CAPITAL LETTER DE -0501 ; [.1FC9.0020.0002] # CYRILLIC SMALL LETTER KOMI DE -0500 ; [.1FC9.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DE -A681 ; [.1FCA.0020.0002] # CYRILLIC SMALL LETTER DWE -A680 ; [.1FCA.0020.0008] # CYRILLIC CAPITAL LETTER DWE -0452 ; [.1FCB.0020.0002] # CYRILLIC SMALL LETTER DJE -0402 ; [.1FCB.0020.0008] # CYRILLIC CAPITAL LETTER DJE -A663 ; [.1FCF.0020.0002] # CYRILLIC SMALL LETTER SOFT DE -A662 ; [.1FCF.0020.0008] # CYRILLIC CAPITAL LETTER SOFT DE -0503 ; [.1FD0.0020.0002] # CYRILLIC SMALL LETTER KOMI DJE -0502 ; [.1FD0.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DJE -0499 ; [.1FD1.0020.0002] # CYRILLIC SMALL LETTER ZE WITH DESCENDER -0498 ; [.1FD1.0020.0008] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER -0435 ; [.1FD5.0020.0002] # CYRILLIC SMALL LETTER IE -2DF7 ; [.1FD5.0020.0004] # COMBINING CYRILLIC LETTER IE -0415 ; [.1FD5.0020.0008] # CYRILLIC CAPITAL LETTER IE -0450 ; [.1FD5.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER IE WITH GRAVE -0400 ; [.1FD5.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER IE WITH GRAVE -04D7 ; [.1FD5.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER IE WITH BREVE -04D6 ; [.1FD5.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER IE WITH BREVE -0451 ; [.1FD5.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER IO -0401 ; [.1FD5.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER IO -0454 ; [.1FD9.0020.0002] # CYRILLIC SMALL LETTER UKRAINIAN IE -A674 ; [.1FD9.0020.0004] # COMBINING CYRILLIC LETTER UKRAINIAN IE -0404 ; [.1FD9.0020.0008] # CYRILLIC CAPITAL LETTER UKRAINIAN IE -0436 ; [.1FDD.0020.0002] # CYRILLIC SMALL LETTER ZHE -2DE4 ; [.1FDD.0020.0004] # COMBINING CYRILLIC LETTER ZHE -0416 ; [.1FDD.0020.0008] # CYRILLIC CAPITAL LETTER ZHE -04C2 ; [.1FDD.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER ZHE WITH BREVE -04C1 ; [.1FDD.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE -04DD ; [.1FDD.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS -04DC ; [.1FDD.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS -052B ; [.1FE1.0020.0002] # CYRILLIC SMALL LETTER DZZHE -052A ; [.1FE1.0020.0008] # CYRILLIC CAPITAL LETTER DZZHE -A685 ; [.1FE2.0020.0002] # CYRILLIC SMALL LETTER ZHWE -A684 ; [.1FE2.0020.0008] # CYRILLIC CAPITAL LETTER ZHWE -0497 ; [.1FE3.0020.0002] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER -0496 ; [.1FE3.0020.0008] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER -0437 ; [.1FE7.0020.0002] # CYRILLIC SMALL LETTER ZE -2DE5 ; [.1FE7.0020.0004] # COMBINING CYRILLIC LETTER ZE -0417 ; [.1FE7.0020.0008] # CYRILLIC CAPITAL LETTER ZE -04DF ; [.1FE7.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS -04DE ; [.1FE7.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS -A641 ; [.1FEB.0020.0002] # CYRILLIC SMALL LETTER ZEMLYA -A640 ; [.1FEB.0020.0008] # CYRILLIC CAPITAL LETTER ZEMLYA -0505 ; [.1FEC.0020.0002] # CYRILLIC SMALL LETTER KOMI ZJE -0504 ; [.1FEC.0020.0008] # CYRILLIC CAPITAL LETTER KOMI ZJE -0511 ; [.1FED.0020.0002] # CYRILLIC SMALL LETTER REVERSED ZE -0510 ; [.1FED.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED ZE -A643 ; [.1FEE.0020.0002] # CYRILLIC SMALL LETTER DZELO -A642 ; [.1FEE.0020.0008] # CYRILLIC CAPITAL LETTER DZELO -0455 ; [.1FEF.0020.0002] # CYRILLIC SMALL LETTER DZE -0405 ; [.1FEF.0020.0008] # CYRILLIC CAPITAL LETTER DZE -A645 ; [.1FF3.0020.0002] # CYRILLIC SMALL LETTER REVERSED DZE -A644 ; [.1FF3.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED DZE -04E1 ; [.1FF4.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN DZE -04E0 ; [.1FF4.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE -A689 ; [.1FF8.0020.0002] # CYRILLIC SMALL LETTER DZZE -A688 ; [.1FF8.0020.0008] # CYRILLIC CAPITAL LETTER DZZE -0507 ; [.1FF9.0020.0002] # CYRILLIC SMALL LETTER KOMI DZJE -0506 ; [.1FF9.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DZJE -A683 ; [.1FFA.0020.0002] # CYRILLIC SMALL LETTER DZWE -A682 ; [.1FFA.0020.0008] # CYRILLIC CAPITAL LETTER DZWE -0438 ; [.1FFB.0020.0002] # CYRILLIC SMALL LETTER I -A675 ; [.1FFB.0020.0004] # COMBINING CYRILLIC LETTER I -0418 ; [.1FFB.0020.0008] # CYRILLIC CAPITAL LETTER I -045D ; [.1FFB.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER I WITH GRAVE -040D ; [.1FFB.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER I WITH GRAVE -04E5 ; [.1FFB.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER I WITH DIAERESIS -04E4 ; [.1FFB.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS -04E3 ; [.1FFB.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER I WITH MACRON -04E2 ; [.1FFB.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER I WITH MACRON -048B ; [.1FFF.0020.0002] # CYRILLIC SMALL LETTER SHORT I WITH TAIL -048A ; [.1FFF.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL -0456 ; [.2003.0020.0002] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -0406 ; [.2003.0020.0008] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -0457 ; [.2003.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YI -A676 ; [.2003.0020.0004][.0000.002B.0004] # COMBINING CYRILLIC LETTER YI -0407 ; [.2003.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YI -A647 ; [.2007.0020.0002] # CYRILLIC SMALL LETTER IOTA -A646 ; [.2007.0020.0008] # CYRILLIC CAPITAL LETTER IOTA -0439 ; [.2008.0020.0002] # CYRILLIC SMALL LETTER SHORT I -0438 0306 ; [.2008.0020.0002] # CYRILLIC SMALL LETTER SHORT I -0419 ; [.2008.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I -0418 0306 ; [.2008.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I -0458 ; [.200C.0020.0002] # CYRILLIC SMALL LETTER JE -0408 ; [.200C.0020.0008] # CYRILLIC CAPITAL LETTER JE -A649 ; [.2010.0020.0002] # CYRILLIC SMALL LETTER DJERV -2DF8 ; [.2010.0020.0004] # COMBINING CYRILLIC LETTER DJERV -A648 ; [.2010.0020.0008] # CYRILLIC CAPITAL LETTER DJERV -043A ; [.2011.0020.0002] # CYRILLIC SMALL LETTER KA -2DE6 ; [.2011.0020.0004] # COMBINING CYRILLIC LETTER KA -041A ; [.2011.0020.0008] # CYRILLIC CAPITAL LETTER KA -045C ; [.2011.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER KJE -040C ; [.2011.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER KJE -049B ; [.2015.0020.0002] # CYRILLIC SMALL LETTER KA WITH DESCENDER -049A ; [.2015.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER -04C4 ; [.2019.0020.0002] # CYRILLIC SMALL LETTER KA WITH HOOK -04C3 ; [.2019.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH HOOK -04A1 ; [.201D.0020.0002] # CYRILLIC SMALL LETTER BASHKIR KA -04A0 ; [.201D.0020.0008] # CYRILLIC CAPITAL LETTER BASHKIR KA -049F ; [.2021.0020.0002] # CYRILLIC SMALL LETTER KA WITH STROKE -049E ; [.2021.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH STROKE -049D ; [.2025.0020.0002] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE -049C ; [.2025.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE -051F ; [.2029.0020.0002] # CYRILLIC SMALL LETTER ALEUT KA -051E ; [.2029.0020.0008] # CYRILLIC CAPITAL LETTER ALEUT KA -051B ; [.202A.0020.0002] # CYRILLIC SMALL LETTER QA -051A ; [.202A.0020.0008] # CYRILLIC CAPITAL LETTER QA -043B ; [.202B.0020.0002] # CYRILLIC SMALL LETTER EL -2DE7 ; [.202B.0020.0004] # COMBINING CYRILLIC LETTER EL -041B ; [.202B.0020.0008] # CYRILLIC CAPITAL LETTER EL -1D2B ; [.202F.0020.0002] # CYRILLIC LETTER SMALL CAPITAL EL -04C6 ; [.2030.0020.0002] # CYRILLIC SMALL LETTER EL WITH TAIL -04C5 ; [.2030.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH TAIL -052F ; [.2034.0020.0002] # CYRILLIC SMALL LETTER EL WITH DESCENDER -052E ; [.2034.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH DESCENDER -0513 ; [.2035.0020.0002] # CYRILLIC SMALL LETTER EL WITH HOOK -0512 ; [.2035.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH HOOK -0521 ; [.2036.0020.0002] # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK -0520 ; [.2036.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK -0459 ; [.2037.0020.0002] # CYRILLIC SMALL LETTER LJE -0409 ; [.2037.0020.0008] # CYRILLIC CAPITAL LETTER LJE -A665 ; [.203B.0020.0002] # CYRILLIC SMALL LETTER SOFT EL -A664 ; [.203B.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EL -0509 ; [.203C.0020.0002] # CYRILLIC SMALL LETTER KOMI LJE -0508 ; [.203C.0020.0008] # CYRILLIC CAPITAL LETTER KOMI LJE -0515 ; [.203D.0020.0002] # CYRILLIC SMALL LETTER LHA -0514 ; [.203D.0020.0008] # CYRILLIC CAPITAL LETTER LHA -043C ; [.203E.0020.0002] # CYRILLIC SMALL LETTER EM -2DE8 ; [.203E.0020.0004] # COMBINING CYRILLIC LETTER EM -041C ; [.203E.0020.0008] # CYRILLIC CAPITAL LETTER EM -04CE ; [.2042.0020.0002] # CYRILLIC SMALL LETTER EM WITH TAIL -04CD ; [.2042.0020.0008] # CYRILLIC CAPITAL LETTER EM WITH TAIL -A667 ; [.2046.0020.0002] # CYRILLIC SMALL LETTER SOFT EM -A666 ; [.2046.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EM -043D ; [.2047.0020.0002] # CYRILLIC SMALL LETTER EN -2DE9 ; [.2047.0020.0004] # COMBINING CYRILLIC LETTER EN -041D ; [.2047.0020.0008] # CYRILLIC CAPITAL LETTER EN -1D78 ; [.2047.0020.0014] # MODIFIER LETTER CYRILLIC EN -0529 ; [.204B.0020.0002] # CYRILLIC SMALL LETTER EN WITH LEFT HOOK -0528 ; [.204B.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK -04CA ; [.204C.0020.0002] # CYRILLIC SMALL LETTER EN WITH TAIL -04C9 ; [.204C.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH TAIL -04A3 ; [.2050.0020.0002] # CYRILLIC SMALL LETTER EN WITH DESCENDER -04A2 ; [.2050.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER -04C8 ; [.2054.0020.0002] # CYRILLIC SMALL LETTER EN WITH HOOK -04C7 ; [.2054.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH HOOK -0523 ; [.2058.0020.0002] # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK -0522 ; [.2058.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK -04A5 ; [.2059.0020.0002] # CYRILLIC SMALL LIGATURE EN GHE -04A4 ; [.2059.0020.0008] # CYRILLIC CAPITAL LIGATURE EN GHE -045A ; [.205D.0020.0002] # CYRILLIC SMALL LETTER NJE -040A ; [.205D.0020.0008] # CYRILLIC CAPITAL LETTER NJE -050B ; [.2061.0020.0002] # CYRILLIC SMALL LETTER KOMI NJE -050A ; [.2061.0020.0008] # CYRILLIC CAPITAL LETTER KOMI NJE -043E ; [.2062.0020.0002] # CYRILLIC SMALL LETTER O -2DEA ; [.2062.0020.0004] # COMBINING CYRILLIC LETTER O -A669 ; [.2062.0020.0004] # CYRILLIC SMALL LETTER MONOCULAR O -A66B ; [.2062.0020.0004] # CYRILLIC SMALL LETTER BINOCULAR O -A66D ; [.2062.0020.0004] # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O -A66E ; [.2062.0020.0004] # CYRILLIC LETTER MULTIOCULAR O -A699 ; [.2062.0020.0004] # CYRILLIC SMALL LETTER DOUBLE O -A69B ; [.2062.0020.0004] # CYRILLIC SMALL LETTER CROSSED O -041E ; [.2062.0020.0008] # CYRILLIC CAPITAL LETTER O -A668 ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER MONOCULAR O -A66A ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER BINOCULAR O -A66C ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O -A698 ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE O -A69A ; [.2062.0020.000A] # CYRILLIC CAPITAL LETTER CROSSED O -04E7 ; [.2062.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER O WITH DIAERESIS -04E6 ; [.2062.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS -04E9 ; [.2066.0020.0002] # CYRILLIC SMALL LETTER BARRED O -04E8 ; [.2066.0020.0008] # CYRILLIC CAPITAL LETTER BARRED O -04EB ; [.2066.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS -04EA ; [.2066.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS -043F ; [.206A.0020.0002] # CYRILLIC SMALL LETTER PE -2DEB ; [.206A.0020.0004] # COMBINING CYRILLIC LETTER PE -041F ; [.206A.0020.0008] # CYRILLIC CAPITAL LETTER PE -0525 ; [.206E.0020.0002] # CYRILLIC SMALL LETTER PE WITH DESCENDER -0524 ; [.206E.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH DESCENDER -04A7 ; [.206F.0020.0002] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK -04A6 ; [.206F.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK -0481 ; [.2073.0020.0002] # CYRILLIC SMALL LETTER KOPPA -0480 ; [.2073.0020.0008] # CYRILLIC CAPITAL LETTER KOPPA -0440 ; [.2077.0020.0002] # CYRILLIC SMALL LETTER ER -2DEC ; [.2077.0020.0004] # COMBINING CYRILLIC LETTER ER -0420 ; [.2077.0020.0008] # CYRILLIC CAPITAL LETTER ER -048F ; [.207B.0020.0002] # CYRILLIC SMALL LETTER ER WITH TICK -048E ; [.207B.0020.0008] # CYRILLIC CAPITAL LETTER ER WITH TICK -0517 ; [.207F.0020.0002] # CYRILLIC SMALL LETTER RHA -0516 ; [.207F.0020.0008] # CYRILLIC CAPITAL LETTER RHA -0441 ; [.2080.0020.0002] # CYRILLIC SMALL LETTER ES -2DED ; [.2080.0020.0004] # COMBINING CYRILLIC LETTER ES -0421 ; [.2080.0020.0008] # CYRILLIC CAPITAL LETTER ES -2DF5 ; [.2080.0020.0004][.2089.0020.0004] # COMBINING CYRILLIC LETTER ES-TE -050D ; [.2084.0020.0002] # CYRILLIC SMALL LETTER KOMI SJE -050C ; [.2084.0020.0008] # CYRILLIC CAPITAL LETTER KOMI SJE -04AB ; [.2085.0020.0002] # CYRILLIC SMALL LETTER ES WITH DESCENDER -04AA ; [.2085.0020.0008] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER -0442 ; [.2089.0020.0002] # CYRILLIC SMALL LETTER TE -2DEE ; [.2089.0020.0004] # COMBINING CYRILLIC LETTER TE -0422 ; [.2089.0020.0008] # CYRILLIC CAPITAL LETTER TE -A68D ; [.208D.0020.0002] # CYRILLIC SMALL LETTER TWE -A68C ; [.208D.0020.0008] # CYRILLIC CAPITAL LETTER TWE -050F ; [.208E.0020.0002] # CYRILLIC SMALL LETTER KOMI TJE -050E ; [.208E.0020.0008] # CYRILLIC CAPITAL LETTER KOMI TJE -04AD ; [.208F.0020.0002] # CYRILLIC SMALL LETTER TE WITH DESCENDER -04AC ; [.208F.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER -A68B ; [.2093.0020.0002] # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK -A68A ; [.2093.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK -045B ; [.2094.0020.0002] # CYRILLIC SMALL LETTER TSHE -040B ; [.2094.0020.0008] # CYRILLIC CAPITAL LETTER TSHE -0443 ; [.2098.0020.0002] # CYRILLIC SMALL LETTER U -A677 ; [.2098.0020.0004] # COMBINING CYRILLIC LETTER U -0423 ; [.2098.0020.0008] # CYRILLIC CAPITAL LETTER U -045E ; [.2098.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER SHORT U -040E ; [.2098.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER SHORT U -04F1 ; [.2098.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER U WITH DIAERESIS -04F0 ; [.2098.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS -04F3 ; [.2098.0020.0002][.0000.002C.0002] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE -04F2 ; [.2098.0020.0008][.0000.002C.0002] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE -04EF ; [.2098.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER U WITH MACRON -04EE ; [.2098.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER U WITH MACRON -04AF ; [.209C.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U -04AE ; [.209C.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U -04B1 ; [.20A0.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE -04B0 ; [.20A0.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE -A64B ; [.20A4.0020.0002] # CYRILLIC SMALL LETTER MONOGRAPH UK -2DF9 ; [.20A4.0020.0004] # COMBINING CYRILLIC LETTER MONOGRAPH UK -A64A ; [.20A4.0020.0008] # CYRILLIC CAPITAL LETTER MONOGRAPH UK -0479 ; [.20A5.0020.0002] # CYRILLIC SMALL LETTER UK -0478 ; [.20A5.0020.0008] # CYRILLIC CAPITAL LETTER UK -0444 ; [.20A9.0020.0002] # CYRILLIC SMALL LETTER EF -A69E ; [.20A9.0020.0004] # COMBINING CYRILLIC LETTER EF -0424 ; [.20A9.0020.0008] # CYRILLIC CAPITAL LETTER EF -0445 ; [.20AD.0020.0002] # CYRILLIC SMALL LETTER HA -2DEF ; [.20AD.0020.0004] # COMBINING CYRILLIC LETTER HA -0425 ; [.20AD.0020.0008] # CYRILLIC CAPITAL LETTER HA -04FD ; [.20B1.0020.0002] # CYRILLIC SMALL LETTER HA WITH HOOK -04FC ; [.20B1.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH HOOK -04FF ; [.20B5.0020.0002] # CYRILLIC SMALL LETTER HA WITH STROKE -04FE ; [.20B5.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH STROKE -04B3 ; [.20B9.0020.0002] # CYRILLIC SMALL LETTER HA WITH DESCENDER -04B2 ; [.20B9.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER -04BB ; [.20BD.0020.0002] # CYRILLIC SMALL LETTER SHHA -04BA ; [.20BD.0020.0008] # CYRILLIC CAPITAL LETTER SHHA -0527 ; [.20C1.0020.0002] # CYRILLIC SMALL LETTER SHHA WITH DESCENDER -0526 ; [.20C1.0020.0008] # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER -A695 ; [.20C2.0020.0002] # CYRILLIC SMALL LETTER HWE -A694 ; [.20C2.0020.0008] # CYRILLIC CAPITAL LETTER HWE -0461 ; [.20C3.0020.0002] # CYRILLIC SMALL LETTER OMEGA -A67B ; [.20C3.0020.0004] # COMBINING CYRILLIC LETTER OMEGA -0460 ; [.20C3.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA -047F ; [.20C7.0020.0002] # CYRILLIC SMALL LETTER OT -047E ; [.20C7.0020.0008] # CYRILLIC CAPITAL LETTER OT -A64D ; [.20CB.0020.0002] # CYRILLIC SMALL LETTER BROAD OMEGA -A64C ; [.20CB.0020.0008] # CYRILLIC CAPITAL LETTER BROAD OMEGA -047D ; [.20CC.0020.0002] # CYRILLIC SMALL LETTER OMEGA WITH TITLO -047C ; [.20CC.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO -047B ; [.20D0.0020.0002] # CYRILLIC SMALL LETTER ROUND OMEGA -047A ; [.20D0.0020.0008] # CYRILLIC CAPITAL LETTER ROUND OMEGA -0446 ; [.20D4.0020.0002] # CYRILLIC SMALL LETTER TSE -2DF0 ; [.20D4.0020.0004] # COMBINING CYRILLIC LETTER TSE -0426 ; [.20D4.0020.0008] # CYRILLIC CAPITAL LETTER TSE -A661 ; [.20D8.0020.0002] # CYRILLIC SMALL LETTER REVERSED TSE -A660 ; [.20D8.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED TSE -A68F ; [.20D9.0020.0002] # CYRILLIC SMALL LETTER TSWE -A68E ; [.20D9.0020.0008] # CYRILLIC CAPITAL LETTER TSWE -04B5 ; [.20DA.0020.0002] # CYRILLIC SMALL LIGATURE TE TSE -04B4 ; [.20DA.0020.0008] # CYRILLIC CAPITAL LIGATURE TE TSE -A691 ; [.20DE.0020.0002] # CYRILLIC SMALL LETTER TSSE -A690 ; [.20DE.0020.0008] # CYRILLIC CAPITAL LETTER TSSE -0447 ; [.20DF.0020.0002] # CYRILLIC SMALL LETTER CHE -2DF1 ; [.20DF.0020.0004] # COMBINING CYRILLIC LETTER CHE -0427 ; [.20DF.0020.0008] # CYRILLIC CAPITAL LETTER CHE -04F5 ; [.20DF.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F4 ; [.20DF.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS -052D ; [.20E3.0020.0002] # CYRILLIC SMALL LETTER DCHE -052C ; [.20E3.0020.0008] # CYRILLIC CAPITAL LETTER DCHE -A693 ; [.20E4.0020.0002] # CYRILLIC SMALL LETTER TCHE -A692 ; [.20E4.0020.0008] # CYRILLIC CAPITAL LETTER TCHE -04B7 ; [.20E5.0020.0002] # CYRILLIC SMALL LETTER CHE WITH DESCENDER -04B6 ; [.20E5.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER -04CC ; [.20E9.0020.0002] # CYRILLIC SMALL LETTER KHAKASSIAN CHE -04CB ; [.20E9.0020.0008] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE -04B9 ; [.20ED.0020.0002] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE -04B8 ; [.20ED.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE -A687 ; [.20F1.0020.0002] # CYRILLIC SMALL LETTER CCHE -A686 ; [.20F1.0020.0008] # CYRILLIC CAPITAL LETTER CCHE -04BD ; [.20F2.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE -04BC ; [.20F2.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE -04BF ; [.20F6.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER -04BE ; [.20F6.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER -045F ; [.20FA.0020.0002] # CYRILLIC SMALL LETTER DZHE -040F ; [.20FA.0020.0008] # CYRILLIC CAPITAL LETTER DZHE -0448 ; [.20FE.0020.0002] # CYRILLIC SMALL LETTER SHA -2DF2 ; [.20FE.0020.0004] # COMBINING CYRILLIC LETTER SHA -0428 ; [.20FE.0020.0008] # CYRILLIC CAPITAL LETTER SHA -A697 ; [.2102.0020.0002] # CYRILLIC SMALL LETTER SHWE -A696 ; [.2102.0020.0008] # CYRILLIC CAPITAL LETTER SHWE -0449 ; [.2103.0020.0002] # CYRILLIC SMALL LETTER SHCHA -2DF3 ; [.2103.0020.0004] # COMBINING CYRILLIC LETTER SHCHA -0429 ; [.2103.0020.0008] # CYRILLIC CAPITAL LETTER SHCHA -A64F ; [.2107.0020.0002] # CYRILLIC SMALL LETTER NEUTRAL YER -A64E ; [.2107.0020.0008] # CYRILLIC CAPITAL LETTER NEUTRAL YER -2E2F ; [.2108.0020.0002] # VERTICAL TILDE -A67F ; [.2109.0020.0002] # CYRILLIC PAYEROK -044A ; [.210A.0020.0002] # CYRILLIC SMALL LETTER HARD SIGN -A678 ; [.210A.0020.0004] # COMBINING CYRILLIC LETTER HARD SIGN -042A ; [.210A.0020.0008] # CYRILLIC CAPITAL LETTER HARD SIGN -A69C ; [.210A.0020.0014] # MODIFIER LETTER CYRILLIC HARD SIGN -A651 ; [.210E.0020.0002] # CYRILLIC SMALL LETTER YERU WITH BACK YER -A650 ; [.210E.0020.0008] # CYRILLIC CAPITAL LETTER YERU WITH BACK YER -044B ; [.210F.0020.0002] # CYRILLIC SMALL LETTER YERU -A679 ; [.210F.0020.0004] # COMBINING CYRILLIC LETTER YERU -042B ; [.210F.0020.0008] # CYRILLIC CAPITAL LETTER YERU -04F9 ; [.210F.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS -04F8 ; [.210F.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS -044C ; [.2113.0020.0002] # CYRILLIC SMALL LETTER SOFT SIGN -A67A ; [.2113.0020.0004] # COMBINING CYRILLIC LETTER SOFT SIGN -042C ; [.2113.0020.0008] # CYRILLIC CAPITAL LETTER SOFT SIGN -A69D ; [.2113.0020.0014] # MODIFIER LETTER CYRILLIC SOFT SIGN -048D ; [.2117.0020.0002] # CYRILLIC SMALL LETTER SEMISOFT SIGN -048C ; [.2117.0020.0008] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN -0463 ; [.211B.0020.0002] # CYRILLIC SMALL LETTER YAT -2DFA ; [.211B.0020.0004] # COMBINING CYRILLIC LETTER YAT -0462 ; [.211B.0020.0008] # CYRILLIC CAPITAL LETTER YAT -A653 ; [.211F.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED YAT -A652 ; [.211F.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED YAT -044D ; [.2120.0020.0002] # CYRILLIC SMALL LETTER E -042D ; [.2120.0020.0008] # CYRILLIC CAPITAL LETTER E -04ED ; [.2120.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER E WITH DIAERESIS -04EC ; [.2120.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS -044E ; [.2124.0020.0002] # CYRILLIC SMALL LETTER YU -2DFB ; [.2124.0020.0004] # COMBINING CYRILLIC LETTER YU -042E ; [.2124.0020.0008] # CYRILLIC CAPITAL LETTER YU -A655 ; [.2128.0020.0002] # CYRILLIC SMALL LETTER REVERSED YU -A654 ; [.2128.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED YU -A657 ; [.2129.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED A -2DFC ; [.2129.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED A -A656 ; [.2129.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED A -044F ; [.212A.0020.0002] # CYRILLIC SMALL LETTER YA -042F ; [.212A.0020.0008] # CYRILLIC CAPITAL LETTER YA -0519 ; [.212E.0020.0002] # CYRILLIC SMALL LETTER YAE -0518 ; [.212E.0020.0008] # CYRILLIC CAPITAL LETTER YAE -0465 ; [.212F.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED E -A69F ; [.212F.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED E -0464 ; [.212F.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED E -0467 ; [.2133.0020.0002] # CYRILLIC SMALL LETTER LITTLE YUS -2DFD ; [.2133.0020.0004] # COMBINING CYRILLIC LETTER LITTLE YUS -0466 ; [.2133.0020.0008] # CYRILLIC CAPITAL LETTER LITTLE YUS -A659 ; [.2137.0020.0002] # CYRILLIC SMALL LETTER CLOSED LITTLE YUS -A658 ; [.2137.0020.0008] # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS -046B ; [.2138.0020.0002] # CYRILLIC SMALL LETTER BIG YUS -2DFE ; [.2138.0020.0004] # COMBINING CYRILLIC LETTER BIG YUS -046A ; [.2138.0020.0008] # CYRILLIC CAPITAL LETTER BIG YUS -A65B ; [.213C.0020.0002] # CYRILLIC SMALL LETTER BLENDED YUS -A65A ; [.213C.0020.0008] # CYRILLIC CAPITAL LETTER BLENDED YUS -0469 ; [.213D.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS -0468 ; [.213D.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS -A65D ; [.2141.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS -A65C ; [.2141.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS -046D ; [.2142.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS -2DFF ; [.2142.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -046C ; [.2142.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS -046F ; [.2146.0020.0002] # CYRILLIC SMALL LETTER KSI -046E ; [.2146.0020.0008] # CYRILLIC CAPITAL LETTER KSI -0471 ; [.214A.0020.0002] # CYRILLIC SMALL LETTER PSI -0470 ; [.214A.0020.0008] # CYRILLIC CAPITAL LETTER PSI -0473 ; [.214E.0020.0002] # CYRILLIC SMALL LETTER FITA -2DF4 ; [.214E.0020.0004] # COMBINING CYRILLIC LETTER FITA -0472 ; [.214E.0020.0008] # CYRILLIC CAPITAL LETTER FITA -0475 ; [.2152.0020.0002] # CYRILLIC SMALL LETTER IZHITSA -0474 ; [.2152.0020.0008] # CYRILLIC CAPITAL LETTER IZHITSA -0477 ; [.2152.0020.0002][.0000.003C.0002] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -0476 ; [.2152.0020.0008][.0000.003C.0002] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -A65F ; [.2156.0020.0002] # CYRILLIC SMALL LETTER YN -A65E ; [.2156.0020.0008] # CYRILLIC CAPITAL LETTER YN -04A9 ; [.2157.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN HA -04A8 ; [.2157.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN HA -051D ; [.215B.0020.0002] # CYRILLIC SMALL LETTER WE -051C ; [.215B.0020.0008] # CYRILLIC CAPITAL LETTER WE -04CF ; [.215C.0020.0002] # CYRILLIC SMALL LETTER PALOCHKA -04C0 ; [.215C.0020.0008] # CYRILLIC LETTER PALOCHKA -2C30 ; [.2160.0020.0002] # GLAGOLITIC SMALL LETTER AZU -2C00 ; [.2160.0020.0008] # GLAGOLITIC CAPITAL LETTER AZU -2C31 ; [.2161.0020.0002] # GLAGOLITIC SMALL LETTER BUKY -2C01 ; [.2161.0020.0008] # GLAGOLITIC CAPITAL LETTER BUKY -2C32 ; [.2162.0020.0002] # GLAGOLITIC SMALL LETTER VEDE -2C02 ; [.2162.0020.0008] # GLAGOLITIC CAPITAL LETTER VEDE -2C33 ; [.2163.0020.0002] # GLAGOLITIC SMALL LETTER GLAGOLI -2C03 ; [.2163.0020.0008] # GLAGOLITIC CAPITAL LETTER GLAGOLI -2C34 ; [.2164.0020.0002] # GLAGOLITIC SMALL LETTER DOBRO -2C04 ; [.2164.0020.0008] # GLAGOLITIC CAPITAL LETTER DOBRO -2C35 ; [.2165.0020.0002] # GLAGOLITIC SMALL LETTER YESTU -2C05 ; [.2165.0020.0008] # GLAGOLITIC CAPITAL LETTER YESTU -2C36 ; [.2166.0020.0002] # GLAGOLITIC SMALL LETTER ZHIVETE -2C06 ; [.2166.0020.0008] # GLAGOLITIC CAPITAL LETTER ZHIVETE -2C37 ; [.2167.0020.0002] # GLAGOLITIC SMALL LETTER DZELO -2C07 ; [.2167.0020.0008] # GLAGOLITIC CAPITAL LETTER DZELO -2C38 ; [.2168.0020.0002] # GLAGOLITIC SMALL LETTER ZEMLJA -2C08 ; [.2168.0020.0008] # GLAGOLITIC CAPITAL LETTER ZEMLJA -2C39 ; [.2169.0020.0002] # GLAGOLITIC SMALL LETTER IZHE -2C09 ; [.2169.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHE -2C3A ; [.216A.0020.0002] # GLAGOLITIC SMALL LETTER INITIAL IZHE -2C0A ; [.216A.0020.0008] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE -2C3B ; [.216B.0020.0002] # GLAGOLITIC SMALL LETTER I -2C0B ; [.216B.0020.0008] # GLAGOLITIC CAPITAL LETTER I -2C3C ; [.216C.0020.0002] # GLAGOLITIC SMALL LETTER DJERVI -2C0C ; [.216C.0020.0008] # GLAGOLITIC CAPITAL LETTER DJERVI -2C3D ; [.216D.0020.0002] # GLAGOLITIC SMALL LETTER KAKO -2C0D ; [.216D.0020.0008] # GLAGOLITIC CAPITAL LETTER KAKO -2C3E ; [.216E.0020.0002] # GLAGOLITIC SMALL LETTER LJUDIJE -2C0E ; [.216E.0020.0008] # GLAGOLITIC CAPITAL LETTER LJUDIJE -2C3F ; [.216F.0020.0002] # GLAGOLITIC SMALL LETTER MYSLITE -2C0F ; [.216F.0020.0008] # GLAGOLITIC CAPITAL LETTER MYSLITE -2C40 ; [.2170.0020.0002] # GLAGOLITIC SMALL LETTER NASHI -2C10 ; [.2170.0020.0008] # GLAGOLITIC CAPITAL LETTER NASHI -2C41 ; [.2171.0020.0002] # GLAGOLITIC SMALL LETTER ONU -2C11 ; [.2171.0020.0008] # GLAGOLITIC CAPITAL LETTER ONU -2C42 ; [.2172.0020.0002] # GLAGOLITIC SMALL LETTER POKOJI -2C12 ; [.2172.0020.0008] # GLAGOLITIC CAPITAL LETTER POKOJI -2C43 ; [.2173.0020.0002] # GLAGOLITIC SMALL LETTER RITSI -2C13 ; [.2173.0020.0008] # GLAGOLITIC CAPITAL LETTER RITSI -2C44 ; [.2174.0020.0002] # GLAGOLITIC SMALL LETTER SLOVO -2C14 ; [.2174.0020.0008] # GLAGOLITIC CAPITAL LETTER SLOVO -2C45 ; [.2175.0020.0002] # GLAGOLITIC SMALL LETTER TVRIDO -2C15 ; [.2175.0020.0008] # GLAGOLITIC CAPITAL LETTER TVRIDO -2C46 ; [.2176.0020.0002] # GLAGOLITIC SMALL LETTER UKU -2C16 ; [.2176.0020.0008] # GLAGOLITIC CAPITAL LETTER UKU -2C47 ; [.2177.0020.0002] # GLAGOLITIC SMALL LETTER FRITU -2C17 ; [.2177.0020.0008] # GLAGOLITIC CAPITAL LETTER FRITU -2C48 ; [.2178.0020.0002] # GLAGOLITIC SMALL LETTER HERU -2C18 ; [.2178.0020.0008] # GLAGOLITIC CAPITAL LETTER HERU -2C49 ; [.2179.0020.0002] # GLAGOLITIC SMALL LETTER OTU -2C19 ; [.2179.0020.0008] # GLAGOLITIC CAPITAL LETTER OTU -2C4A ; [.217A.0020.0002] # GLAGOLITIC SMALL LETTER PE -2C1A ; [.217A.0020.0008] # GLAGOLITIC CAPITAL LETTER PE -2C4B ; [.217B.0020.0002] # GLAGOLITIC SMALL LETTER SHTA -2C1B ; [.217B.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTA -2C4C ; [.217C.0020.0002] # GLAGOLITIC SMALL LETTER TSI -2C1C ; [.217C.0020.0008] # GLAGOLITIC CAPITAL LETTER TSI -2C4D ; [.217D.0020.0002] # GLAGOLITIC SMALL LETTER CHRIVI -2C1D ; [.217D.0020.0008] # GLAGOLITIC CAPITAL LETTER CHRIVI -2C4E ; [.217E.0020.0002] # GLAGOLITIC SMALL LETTER SHA -2C1E ; [.217E.0020.0008] # GLAGOLITIC CAPITAL LETTER SHA -2C4F ; [.217F.0020.0002] # GLAGOLITIC SMALL LETTER YERU -2C1F ; [.217F.0020.0008] # GLAGOLITIC CAPITAL LETTER YERU -2C50 ; [.2180.0020.0002] # GLAGOLITIC SMALL LETTER YERI -2C20 ; [.2180.0020.0008] # GLAGOLITIC CAPITAL LETTER YERI -2C51 ; [.2181.0020.0002] # GLAGOLITIC SMALL LETTER YATI -2C21 ; [.2181.0020.0008] # GLAGOLITIC CAPITAL LETTER YATI -2C52 ; [.2182.0020.0002] # GLAGOLITIC SMALL LETTER SPIDERY HA -2C22 ; [.2182.0020.0008] # GLAGOLITIC CAPITAL LETTER SPIDERY HA -2C53 ; [.2183.0020.0002] # GLAGOLITIC SMALL LETTER YU -2C23 ; [.2183.0020.0008] # GLAGOLITIC CAPITAL LETTER YU -2C54 ; [.2184.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS -2C24 ; [.2184.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS -2C55 ; [.2185.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL -2C25 ; [.2185.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL -2C56 ; [.2186.0020.0002] # GLAGOLITIC SMALL LETTER YO -2C26 ; [.2186.0020.0008] # GLAGOLITIC CAPITAL LETTER YO -2C57 ; [.2187.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS -2C27 ; [.2187.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS -2C58 ; [.2188.0020.0002] # GLAGOLITIC SMALL LETTER BIG YUS -2C28 ; [.2188.0020.0008] # GLAGOLITIC CAPITAL LETTER BIG YUS -2C59 ; [.2189.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS -2C29 ; [.2189.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS -2C5A ; [.218A.0020.0002] # GLAGOLITIC SMALL LETTER FITA -2C2A ; [.218A.0020.0008] # GLAGOLITIC CAPITAL LETTER FITA -2C5B ; [.218B.0020.0002] # GLAGOLITIC SMALL LETTER IZHITSA -2C2B ; [.218B.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHITSA -2C5C ; [.218C.0020.0002] # GLAGOLITIC SMALL LETTER SHTAPIC -2C2C ; [.218C.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTAPIC -2C5D ; [.218D.0020.0002] # GLAGOLITIC SMALL LETTER TROKUTASTI A -2C2D ; [.218D.0020.0008] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A -2C5E ; [.218E.0020.0002] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE -2C2E ; [.218E.0020.0008] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE -10350 ; [.218F.0020.0002] # OLD PERMIC LETTER AN -10376 ; [.218F.0020.0004] # COMBINING OLD PERMIC LETTER AN -10351 ; [.2190.0020.0002] # OLD PERMIC LETTER BUR -10352 ; [.2191.0020.0002] # OLD PERMIC LETTER GAI -10353 ; [.2192.0020.0002] # OLD PERMIC LETTER DOI -10377 ; [.2192.0020.0004] # COMBINING OLD PERMIC LETTER DOI -10354 ; [.2193.0020.0002] # OLD PERMIC LETTER E -10355 ; [.2194.0020.0002] # OLD PERMIC LETTER ZHOI -10356 ; [.2195.0020.0002] # OLD PERMIC LETTER DZHOI -10357 ; [.2196.0020.0002] # OLD PERMIC LETTER ZATA -10378 ; [.2196.0020.0004] # COMBINING OLD PERMIC LETTER ZATA -10358 ; [.2197.0020.0002] # OLD PERMIC LETTER DZITA -10359 ; [.2198.0020.0002] # OLD PERMIC LETTER I -1035A ; [.2199.0020.0002] # OLD PERMIC LETTER KOKE -1035B ; [.219A.0020.0002] # OLD PERMIC LETTER LEI -1035C ; [.219B.0020.0002] # OLD PERMIC LETTER MENOE -1035D ; [.219C.0020.0002] # OLD PERMIC LETTER NENOE -10379 ; [.219C.0020.0004] # COMBINING OLD PERMIC LETTER NENOE -1035E ; [.219D.0020.0002] # OLD PERMIC LETTER VOOI -1035F ; [.219E.0020.0002] # OLD PERMIC LETTER PEEI -10360 ; [.219F.0020.0002] # OLD PERMIC LETTER REI -10361 ; [.21A0.0020.0002] # OLD PERMIC LETTER SII -1037A ; [.21A0.0020.0004] # COMBINING OLD PERMIC LETTER SII -10362 ; [.21A1.0020.0002] # OLD PERMIC LETTER TAI -10363 ; [.21A2.0020.0002] # OLD PERMIC LETTER U -10364 ; [.21A3.0020.0002] # OLD PERMIC LETTER CHERY -10365 ; [.21A4.0020.0002] # OLD PERMIC LETTER SHOOI -10366 ; [.21A5.0020.0002] # OLD PERMIC LETTER SHCHOOI -10367 ; [.21A6.0020.0002] # OLD PERMIC LETTER YRY -10368 ; [.21A7.0020.0002] # OLD PERMIC LETTER YERU -10369 ; [.21A8.0020.0002] # OLD PERMIC LETTER O -1036A ; [.21A9.0020.0002] # OLD PERMIC LETTER OO -1036B ; [.21AA.0020.0002] # OLD PERMIC LETTER EF -1036C ; [.21AB.0020.0002] # OLD PERMIC LETTER HA -1036D ; [.21AC.0020.0002] # OLD PERMIC LETTER TSIU -1036E ; [.21AD.0020.0002] # OLD PERMIC LETTER VER -1036F ; [.21AE.0020.0002] # OLD PERMIC LETTER YER -10370 ; [.21AF.0020.0002] # OLD PERMIC LETTER YERI -10371 ; [.21B0.0020.0002] # OLD PERMIC LETTER YAT -10372 ; [.21B1.0020.0002] # OLD PERMIC LETTER IE -10373 ; [.21B2.0020.0002] # OLD PERMIC LETTER YU -10374 ; [.21B3.0020.0002] # OLD PERMIC LETTER YA -10375 ; [.21B4.0020.0002] # OLD PERMIC LETTER IA -10D0 ; [.21B5.0020.0002] # GEORGIAN LETTER AN -2D00 ; [.21B6.0020.0002] # GEORGIAN SMALL LETTER AN -10A0 ; [.21B6.0020.0008] # GEORGIAN CAPITAL LETTER AN -10D1 ; [.21B7.0020.0002] # GEORGIAN LETTER BAN -2D01 ; [.21B8.0020.0002] # GEORGIAN SMALL LETTER BAN -10A1 ; [.21B8.0020.0008] # GEORGIAN CAPITAL LETTER BAN -10D2 ; [.21B9.0020.0002] # GEORGIAN LETTER GAN -2D02 ; [.21BA.0020.0002] # GEORGIAN SMALL LETTER GAN -10A2 ; [.21BA.0020.0008] # GEORGIAN CAPITAL LETTER GAN -10D3 ; [.21BB.0020.0002] # GEORGIAN LETTER DON -2D03 ; [.21BC.0020.0002] # GEORGIAN SMALL LETTER DON -10A3 ; [.21BC.0020.0008] # GEORGIAN CAPITAL LETTER DON -10D4 ; [.21BD.0020.0002] # GEORGIAN LETTER EN -2D04 ; [.21BE.0020.0002] # GEORGIAN SMALL LETTER EN -10A4 ; [.21BE.0020.0008] # GEORGIAN CAPITAL LETTER EN -10D5 ; [.21BF.0020.0002] # GEORGIAN LETTER VIN -2D05 ; [.21C0.0020.0002] # GEORGIAN SMALL LETTER VIN -10A5 ; [.21C0.0020.0008] # GEORGIAN CAPITAL LETTER VIN -10D6 ; [.21C1.0020.0002] # GEORGIAN LETTER ZEN -2D06 ; [.21C2.0020.0002] # GEORGIAN SMALL LETTER ZEN -10A6 ; [.21C2.0020.0008] # GEORGIAN CAPITAL LETTER ZEN -10F1 ; [.21C3.0020.0002] # GEORGIAN LETTER HE -2D21 ; [.21C4.0020.0002] # GEORGIAN SMALL LETTER HE -10C1 ; [.21C4.0020.0008] # GEORGIAN CAPITAL LETTER HE -10D7 ; [.21C5.0020.0002] # GEORGIAN LETTER TAN -2D07 ; [.21C6.0020.0002] # GEORGIAN SMALL LETTER TAN -10A7 ; [.21C6.0020.0008] # GEORGIAN CAPITAL LETTER TAN -10D8 ; [.21C7.0020.0002] # GEORGIAN LETTER IN -2D08 ; [.21C8.0020.0002] # GEORGIAN SMALL LETTER IN -10A8 ; [.21C8.0020.0008] # GEORGIAN CAPITAL LETTER IN -10D9 ; [.21C9.0020.0002] # GEORGIAN LETTER KAN -2D09 ; [.21CA.0020.0002] # GEORGIAN SMALL LETTER KAN -10A9 ; [.21CA.0020.0008] # GEORGIAN CAPITAL LETTER KAN -10DA ; [.21CB.0020.0002] # GEORGIAN LETTER LAS -2D0A ; [.21CC.0020.0002] # GEORGIAN SMALL LETTER LAS -10AA ; [.21CC.0020.0008] # GEORGIAN CAPITAL LETTER LAS -10DB ; [.21CD.0020.0002] # GEORGIAN LETTER MAN -2D0B ; [.21CE.0020.0002] # GEORGIAN SMALL LETTER MAN -10AB ; [.21CE.0020.0008] # GEORGIAN CAPITAL LETTER MAN -10DC ; [.21CF.0020.0002] # GEORGIAN LETTER NAR -10FC ; [.21CF.0020.0014] # MODIFIER LETTER GEORGIAN NAR -2D0C ; [.21D0.0020.0002] # GEORGIAN SMALL LETTER NAR -10AC ; [.21D0.0020.0008] # GEORGIAN CAPITAL LETTER NAR -10F2 ; [.21D1.0020.0002] # GEORGIAN LETTER HIE -2D22 ; [.21D2.0020.0002] # GEORGIAN SMALL LETTER HIE -10C2 ; [.21D2.0020.0008] # GEORGIAN CAPITAL LETTER HIE -10DD ; [.21D3.0020.0002] # GEORGIAN LETTER ON -2D0D ; [.21D4.0020.0002] # GEORGIAN SMALL LETTER ON -10AD ; [.21D4.0020.0008] # GEORGIAN CAPITAL LETTER ON -10DE ; [.21D5.0020.0002] # GEORGIAN LETTER PAR -2D0E ; [.21D6.0020.0002] # GEORGIAN SMALL LETTER PAR -10AE ; [.21D6.0020.0008] # GEORGIAN CAPITAL LETTER PAR -10DF ; [.21D7.0020.0002] # GEORGIAN LETTER ZHAR -2D0F ; [.21D8.0020.0002] # GEORGIAN SMALL LETTER ZHAR -10AF ; [.21D8.0020.0008] # GEORGIAN CAPITAL LETTER ZHAR -10E0 ; [.21D9.0020.0002] # GEORGIAN LETTER RAE -2D10 ; [.21DA.0020.0002] # GEORGIAN SMALL LETTER RAE -10B0 ; [.21DA.0020.0008] # GEORGIAN CAPITAL LETTER RAE -10E1 ; [.21DB.0020.0002] # GEORGIAN LETTER SAN -2D11 ; [.21DC.0020.0002] # GEORGIAN SMALL LETTER SAN -10B1 ; [.21DC.0020.0008] # GEORGIAN CAPITAL LETTER SAN -10E2 ; [.21DD.0020.0002] # GEORGIAN LETTER TAR -2D12 ; [.21DE.0020.0002] # GEORGIAN SMALL LETTER TAR -10B2 ; [.21DE.0020.0008] # GEORGIAN CAPITAL LETTER TAR -10F3 ; [.21DF.0020.0002] # GEORGIAN LETTER WE -2D23 ; [.21E0.0020.0002] # GEORGIAN SMALL LETTER WE -10C3 ; [.21E0.0020.0008] # GEORGIAN CAPITAL LETTER WE -10E3 ; [.21E1.0020.0002] # GEORGIAN LETTER UN -2D13 ; [.21E2.0020.0002] # GEORGIAN SMALL LETTER UN -10B3 ; [.21E2.0020.0008] # GEORGIAN CAPITAL LETTER UN -10E4 ; [.21E3.0020.0002] # GEORGIAN LETTER PHAR -2D14 ; [.21E4.0020.0002] # GEORGIAN SMALL LETTER PHAR -10B4 ; [.21E4.0020.0008] # GEORGIAN CAPITAL LETTER PHAR -10E5 ; [.21E5.0020.0002] # GEORGIAN LETTER KHAR -2D15 ; [.21E6.0020.0002] # GEORGIAN SMALL LETTER KHAR -10B5 ; [.21E6.0020.0008] # GEORGIAN CAPITAL LETTER KHAR -10E6 ; [.21E7.0020.0002] # GEORGIAN LETTER GHAN -2D16 ; [.21E8.0020.0002] # GEORGIAN SMALL LETTER GHAN -10B6 ; [.21E8.0020.0008] # GEORGIAN CAPITAL LETTER GHAN -10E7 ; [.21E9.0020.0002] # GEORGIAN LETTER QAR -2D17 ; [.21EA.0020.0002] # GEORGIAN SMALL LETTER QAR -10B7 ; [.21EA.0020.0008] # GEORGIAN CAPITAL LETTER QAR -10E8 ; [.21EB.0020.0002] # GEORGIAN LETTER SHIN -2D18 ; [.21EC.0020.0002] # GEORGIAN SMALL LETTER SHIN -10B8 ; [.21EC.0020.0008] # GEORGIAN CAPITAL LETTER SHIN -10E9 ; [.21ED.0020.0002] # GEORGIAN LETTER CHIN -2D19 ; [.21EE.0020.0002] # GEORGIAN SMALL LETTER CHIN -10B9 ; [.21EE.0020.0008] # GEORGIAN CAPITAL LETTER CHIN -10EA ; [.21EF.0020.0002] # GEORGIAN LETTER CAN -2D1A ; [.21F0.0020.0002] # GEORGIAN SMALL LETTER CAN -10BA ; [.21F0.0020.0008] # GEORGIAN CAPITAL LETTER CAN -10EB ; [.21F1.0020.0002] # GEORGIAN LETTER JIL -2D1B ; [.21F2.0020.0002] # GEORGIAN SMALL LETTER JIL -10BB ; [.21F2.0020.0008] # GEORGIAN CAPITAL LETTER JIL -10EC ; [.21F3.0020.0002] # GEORGIAN LETTER CIL -2D1C ; [.21F4.0020.0002] # GEORGIAN SMALL LETTER CIL -10BC ; [.21F4.0020.0008] # GEORGIAN CAPITAL LETTER CIL -10ED ; [.21F5.0020.0002] # GEORGIAN LETTER CHAR -2D1D ; [.21F6.0020.0002] # GEORGIAN SMALL LETTER CHAR -10BD ; [.21F6.0020.0008] # GEORGIAN CAPITAL LETTER CHAR -10EE ; [.21F7.0020.0002] # GEORGIAN LETTER XAN -2D1E ; [.21F8.0020.0002] # GEORGIAN SMALL LETTER XAN -10BE ; [.21F8.0020.0008] # GEORGIAN CAPITAL LETTER XAN -10F4 ; [.21F9.0020.0002] # GEORGIAN LETTER HAR -2D24 ; [.21FA.0020.0002] # GEORGIAN SMALL LETTER HAR -10C4 ; [.21FA.0020.0008] # GEORGIAN CAPITAL LETTER HAR -10EF ; [.21FB.0020.0002] # GEORGIAN LETTER JHAN -2D1F ; [.21FC.0020.0002] # GEORGIAN SMALL LETTER JHAN -10BF ; [.21FC.0020.0008] # GEORGIAN CAPITAL LETTER JHAN -10F0 ; [.21FD.0020.0002] # GEORGIAN LETTER HAE -2D20 ; [.21FE.0020.0002] # GEORGIAN SMALL LETTER HAE -10C0 ; [.21FE.0020.0008] # GEORGIAN CAPITAL LETTER HAE -10F5 ; [.21FF.0020.0002] # GEORGIAN LETTER HOE -2D25 ; [.2200.0020.0002] # GEORGIAN SMALL LETTER HOE -10C5 ; [.2200.0020.0008] # GEORGIAN CAPITAL LETTER HOE -10F6 ; [.2201.0020.0002] # GEORGIAN LETTER FI -10F7 ; [.2202.0020.0002] # GEORGIAN LETTER YN -2D27 ; [.2203.0020.0002] # GEORGIAN SMALL LETTER YN -10C7 ; [.2203.0020.0008] # GEORGIAN CAPITAL LETTER YN -10F8 ; [.2204.0020.0002] # GEORGIAN LETTER ELIFI -10F9 ; [.2205.0020.0002] # GEORGIAN LETTER TURNED GAN -10FA ; [.2206.0020.0002] # GEORGIAN LETTER AIN -10FD ; [.2207.0020.0002] # GEORGIAN LETTER AEN -2D2D ; [.2208.0020.0002] # GEORGIAN SMALL LETTER AEN -10CD ; [.2208.0020.0008] # GEORGIAN CAPITAL LETTER AEN -10FE ; [.2209.0020.0002] # GEORGIAN LETTER HARD SIGN -10FF ; [.220A.0020.0002] # GEORGIAN LETTER LABIAL SIGN -0561 ; [.220B.0020.0002] # ARMENIAN SMALL LETTER AYB -0531 ; [.220B.0020.0008] # ARMENIAN CAPITAL LETTER AYB -0562 ; [.220C.0020.0002] # ARMENIAN SMALL LETTER BEN -0532 ; [.220C.0020.0008] # ARMENIAN CAPITAL LETTER BEN -0563 ; [.220D.0020.0002] # ARMENIAN SMALL LETTER GIM -0533 ; [.220D.0020.0008] # ARMENIAN CAPITAL LETTER GIM -0564 ; [.220E.0020.0002] # ARMENIAN SMALL LETTER DA -0534 ; [.220E.0020.0008] # ARMENIAN CAPITAL LETTER DA -0565 ; [.220F.0020.0002] # ARMENIAN SMALL LETTER ECH -0535 ; [.220F.0020.0008] # ARMENIAN CAPITAL LETTER ECH -0587 ; [.220F.0020.0004][.222C.0020.0004] # ARMENIAN SMALL LIGATURE ECH YIWN -0566 ; [.2210.0020.0002] # ARMENIAN SMALL LETTER ZA -0536 ; [.2210.0020.0008] # ARMENIAN CAPITAL LETTER ZA -0567 ; [.2211.0020.0002] # ARMENIAN SMALL LETTER EH -0537 ; [.2211.0020.0008] # ARMENIAN CAPITAL LETTER EH -0568 ; [.2212.0020.0002] # ARMENIAN SMALL LETTER ET -0538 ; [.2212.0020.0008] # ARMENIAN CAPITAL LETTER ET -0569 ; [.2213.0020.0002] # ARMENIAN SMALL LETTER TO -0539 ; [.2213.0020.0008] # ARMENIAN CAPITAL LETTER TO -056A ; [.2214.0020.0002] # ARMENIAN SMALL LETTER ZHE -053A ; [.2214.0020.0008] # ARMENIAN CAPITAL LETTER ZHE -056B ; [.2215.0020.0002] # ARMENIAN SMALL LETTER INI -053B ; [.2215.0020.0008] # ARMENIAN CAPITAL LETTER INI -056C ; [.2216.0020.0002] # ARMENIAN SMALL LETTER LIWN -053C ; [.2216.0020.0008] # ARMENIAN CAPITAL LETTER LIWN -056D ; [.2217.0020.0002] # ARMENIAN SMALL LETTER XEH -053D ; [.2217.0020.0008] # ARMENIAN CAPITAL LETTER XEH -056E ; [.2218.0020.0002] # ARMENIAN SMALL LETTER CA -053E ; [.2218.0020.0008] # ARMENIAN CAPITAL LETTER CA -056F ; [.2219.0020.0002] # ARMENIAN SMALL LETTER KEN -053F ; [.2219.0020.0008] # ARMENIAN CAPITAL LETTER KEN -0570 ; [.221A.0020.0002] # ARMENIAN SMALL LETTER HO -0540 ; [.221A.0020.0008] # ARMENIAN CAPITAL LETTER HO -0571 ; [.221B.0020.0002] # ARMENIAN SMALL LETTER JA -0541 ; [.221B.0020.0008] # ARMENIAN CAPITAL LETTER JA -0572 ; [.221C.0020.0002] # ARMENIAN SMALL LETTER GHAD -0542 ; [.221C.0020.0008] # ARMENIAN CAPITAL LETTER GHAD -0573 ; [.221D.0020.0002] # ARMENIAN SMALL LETTER CHEH -0543 ; [.221D.0020.0008] # ARMENIAN CAPITAL LETTER CHEH -0574 ; [.221E.0020.0002] # ARMENIAN SMALL LETTER MEN -0544 ; [.221E.0020.0008] # ARMENIAN CAPITAL LETTER MEN -FB14 ; [.221E.0020.0004][.220F.0020.0004] # ARMENIAN SMALL LIGATURE MEN ECH -FB15 ; [.221E.0020.0004][.2215.0020.0004] # ARMENIAN SMALL LIGATURE MEN INI -FB17 ; [.221E.0020.0004][.2217.0020.0004] # ARMENIAN SMALL LIGATURE MEN XEH -FB13 ; [.221E.0020.0004][.2220.0020.0004] # ARMENIAN SMALL LIGATURE MEN NOW -0575 ; [.221F.0020.0002] # ARMENIAN SMALL LETTER YI -0545 ; [.221F.0020.0008] # ARMENIAN CAPITAL LETTER YI -0576 ; [.2220.0020.0002] # ARMENIAN SMALL LETTER NOW -0546 ; [.2220.0020.0008] # ARMENIAN CAPITAL LETTER NOW -0577 ; [.2221.0020.0002] # ARMENIAN SMALL LETTER SHA -0547 ; [.2221.0020.0008] # ARMENIAN CAPITAL LETTER SHA -0578 ; [.2222.0020.0002] # ARMENIAN SMALL LETTER VO -0548 ; [.2222.0020.0008] # ARMENIAN CAPITAL LETTER VO -0579 ; [.2223.0020.0002] # ARMENIAN SMALL LETTER CHA -0549 ; [.2223.0020.0008] # ARMENIAN CAPITAL LETTER CHA -057A ; [.2224.0020.0002] # ARMENIAN SMALL LETTER PEH -054A ; [.2224.0020.0008] # ARMENIAN CAPITAL LETTER PEH -057B ; [.2225.0020.0002] # ARMENIAN SMALL LETTER JHEH -054B ; [.2225.0020.0008] # ARMENIAN CAPITAL LETTER JHEH -057C ; [.2226.0020.0002] # ARMENIAN SMALL LETTER RA -054C ; [.2226.0020.0008] # ARMENIAN CAPITAL LETTER RA -057D ; [.2227.0020.0002] # ARMENIAN SMALL LETTER SEH -054D ; [.2227.0020.0008] # ARMENIAN CAPITAL LETTER SEH -057E ; [.2228.0020.0002] # ARMENIAN SMALL LETTER VEW -054E ; [.2228.0020.0008] # ARMENIAN CAPITAL LETTER VEW -FB16 ; [.2228.0020.0004][.2220.0020.0004] # ARMENIAN SMALL LIGATURE VEW NOW -057F ; [.2229.0020.0002] # ARMENIAN SMALL LETTER TIWN -054F ; [.2229.0020.0008] # ARMENIAN CAPITAL LETTER TIWN -0580 ; [.222A.0020.0002] # ARMENIAN SMALL LETTER REH -0550 ; [.222A.0020.0008] # ARMENIAN CAPITAL LETTER REH -0581 ; [.222B.0020.0002] # ARMENIAN SMALL LETTER CO -0551 ; [.222B.0020.0008] # ARMENIAN CAPITAL LETTER CO -0582 ; [.222C.0020.0002] # ARMENIAN SMALL LETTER YIWN -0552 ; [.222C.0020.0008] # ARMENIAN CAPITAL LETTER YIWN -0583 ; [.222D.0020.0002] # ARMENIAN SMALL LETTER PIWR -0553 ; [.222D.0020.0008] # ARMENIAN CAPITAL LETTER PIWR -0584 ; [.222E.0020.0002] # ARMENIAN SMALL LETTER KEH -0554 ; [.222E.0020.0008] # ARMENIAN CAPITAL LETTER KEH -0585 ; [.222F.0020.0002] # ARMENIAN SMALL LETTER OH -0555 ; [.222F.0020.0008] # ARMENIAN CAPITAL LETTER OH -0586 ; [.2230.0020.0002] # ARMENIAN SMALL LETTER FEH -0556 ; [.2230.0020.0008] # ARMENIAN CAPITAL LETTER FEH -0559 ; [.2231.0020.0002] # ARMENIAN MODIFIER LETTER LEFT HALF RING -05D0 ; [.2232.0020.0002] # HEBREW LETTER ALEF -2135 ; [.2232.0020.0004] # ALEF SYMBOL -FB21 ; [.2232.0020.0005] # HEBREW LETTER WIDE ALEF -FB2E ; [.2232.0020.0002][.0000.0059.0002] # HEBREW LETTER ALEF WITH PATAH -FB2F ; [.2232.0020.0002][.0000.005A.0002] # HEBREW LETTER ALEF WITH QAMATS -FB30 ; [.2232.0020.0002][.0000.005F.0002] # HEBREW LETTER ALEF WITH MAPIQ -FB4F ; [.2232.0020.0004][.223D.0020.0004] # HEBREW LIGATURE ALEF LAMED -05D1 ; [.2233.0020.0002] # HEBREW LETTER BET -2136 ; [.2233.0020.0004] # BET SYMBOL -FB31 ; [.2233.0020.0002][.0000.005F.0002] # HEBREW LETTER BET WITH DAGESH -FB4C ; [.2233.0020.0002][.0000.0060.0002] # HEBREW LETTER BET WITH RAFE -05D2 ; [.2234.0020.0002] # HEBREW LETTER GIMEL -2137 ; [.2234.0020.0004] # GIMEL SYMBOL -FB32 ; [.2234.0020.0002][.0000.005F.0002] # HEBREW LETTER GIMEL WITH DAGESH -05D3 ; [.2235.0020.0002] # HEBREW LETTER DALET -2138 ; [.2235.0020.0004] # DALET SYMBOL -FB22 ; [.2235.0020.0005] # HEBREW LETTER WIDE DALET -FB33 ; [.2235.0020.0002][.0000.005F.0002] # HEBREW LETTER DALET WITH DAGESH -05D4 ; [.2236.0020.0002] # HEBREW LETTER HE -FB23 ; [.2236.0020.0005] # HEBREW LETTER WIDE HE -FB34 ; [.2236.0020.0002][.0000.005F.0002] # HEBREW LETTER HE WITH MAPIQ -05D5 ; [.2237.0020.0002] # HEBREW LETTER VAV -FB4B ; [.2237.0020.0002][.0000.005B.0002] # HEBREW LETTER VAV WITH HOLAM -FB35 ; [.2237.0020.0002][.0000.005F.0002] # HEBREW LETTER VAV WITH DAGESH -05F0 ; [.2237.0020.0004][.2237.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE VAV -05F1 ; [.2237.0020.0004][.223B.0020.0004] # HEBREW LIGATURE YIDDISH VAV YOD -05D6 ; [.2238.0020.0002] # HEBREW LETTER ZAYIN -FB36 ; [.2238.0020.0002][.0000.005F.0002] # HEBREW LETTER ZAYIN WITH DAGESH -05D7 ; [.2239.0020.0002] # HEBREW LETTER HET -05D8 ; [.223A.0020.0002] # HEBREW LETTER TET -FB38 ; [.223A.0020.0002][.0000.005F.0002] # HEBREW LETTER TET WITH DAGESH -05D9 ; [.223B.0020.0002] # HEBREW LETTER YOD -FB1D ; [.223B.0020.0002][.0000.0056.0002] # HEBREW LETTER YOD WITH HIRIQ -FB39 ; [.223B.0020.0002][.0000.005F.0002] # HEBREW LETTER YOD WITH DAGESH -05F2 ; [.223B.0020.0004][.223B.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE YOD -FB1F ; [.223B.0020.0004][.223B.0020.0004][.0000.0059.0002] # HEBREW LIGATURE YIDDISH YOD YOD PATAH -05DB ; [.223C.0020.0002] # HEBREW LETTER KAF -FB24 ; [.223C.0020.0005] # HEBREW LETTER WIDE KAF -05DA ; [.223C.0020.0019] # HEBREW LETTER FINAL KAF -FB3B ; [.223C.0020.0002][.0000.005F.0002] # HEBREW LETTER KAF WITH DAGESH -FB3A ; [.223C.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL KAF WITH DAGESH -FB4D ; [.223C.0020.0002][.0000.0060.0002] # HEBREW LETTER KAF WITH RAFE -05DC ; [.223D.0020.0002] # HEBREW LETTER LAMED -FB25 ; [.223D.0020.0005] # HEBREW LETTER WIDE LAMED -FB3C ; [.223D.0020.0002][.0000.005F.0002] # HEBREW LETTER LAMED WITH DAGESH -05DE ; [.223E.0020.0002] # HEBREW LETTER MEM -FB26 ; [.223E.0020.0005] # HEBREW LETTER WIDE FINAL MEM -05DD ; [.223E.0020.0019] # HEBREW LETTER FINAL MEM -FB3E ; [.223E.0020.0002][.0000.005F.0002] # HEBREW LETTER MEM WITH DAGESH -05E0 ; [.223F.0020.0002] # HEBREW LETTER NUN -05DF ; [.223F.0020.0019] # HEBREW LETTER FINAL NUN -FB40 ; [.223F.0020.0002][.0000.005F.0002] # HEBREW LETTER NUN WITH DAGESH -05E1 ; [.2240.0020.0002] # HEBREW LETTER SAMEKH -FB41 ; [.2240.0020.0002][.0000.005F.0002] # HEBREW LETTER SAMEKH WITH DAGESH -05E2 ; [.2241.0020.0002] # HEBREW LETTER AYIN -FB20 ; [.2241.0020.0005] # HEBREW LETTER ALTERNATIVE AYIN -05E4 ; [.2242.0020.0002] # HEBREW LETTER PE -05E3 ; [.2242.0020.0019] # HEBREW LETTER FINAL PE -FB44 ; [.2242.0020.0002][.0000.005F.0002] # HEBREW LETTER PE WITH DAGESH -FB43 ; [.2242.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL PE WITH DAGESH -FB4E ; [.2242.0020.0002][.0000.0060.0002] # HEBREW LETTER PE WITH RAFE -05E6 ; [.2243.0020.0002] # HEBREW LETTER TSADI -05E5 ; [.2243.0020.0019] # HEBREW LETTER FINAL TSADI -FB46 ; [.2243.0020.0002][.0000.005F.0002] # HEBREW LETTER TSADI WITH DAGESH -05E7 ; [.2244.0020.0002] # HEBREW LETTER QOF -FB47 ; [.2244.0020.0002][.0000.005F.0002] # HEBREW LETTER QOF WITH DAGESH -05E8 ; [.2245.0020.0002] # HEBREW LETTER RESH -FB27 ; [.2245.0020.0005] # HEBREW LETTER WIDE RESH -FB48 ; [.2245.0020.0002][.0000.005F.0002] # HEBREW LETTER RESH WITH DAGESH -05E9 ; [.2246.0020.0002] # HEBREW LETTER SHIN -FB2B ; [.2246.0020.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH SIN DOT -FB2A ; [.2246.0020.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH SHIN DOT -FB49 ; [.2246.0020.0002][.0000.005F.0002] # HEBREW LETTER SHIN WITH DAGESH -FB2D ; [.2246.0020.0002][.0000.005F.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT -FB2C ; [.2246.0020.0002][.0000.005F.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT -05EA ; [.2247.0020.0002] # HEBREW LETTER TAV -FB28 ; [.2247.0020.0005] # HEBREW LETTER WIDE TAV -FB4A ; [.2247.0020.0002][.0000.005F.0002] # HEBREW LETTER TAV WITH DAGESH -10900 ; [.2248.0020.0002] # PHOENICIAN LETTER ALF -10901 ; [.2249.0020.0002] # PHOENICIAN LETTER BET -10902 ; [.224A.0020.0002] # PHOENICIAN LETTER GAML -10903 ; [.224B.0020.0002] # PHOENICIAN LETTER DELT -10904 ; [.224C.0020.0002] # PHOENICIAN LETTER HE -10905 ; [.224D.0020.0002] # PHOENICIAN LETTER WAU -10906 ; [.224E.0020.0002] # PHOENICIAN LETTER ZAI -10907 ; [.224F.0020.0002] # PHOENICIAN LETTER HET -10908 ; [.2250.0020.0002] # PHOENICIAN LETTER TET -10909 ; [.2251.0020.0002] # PHOENICIAN LETTER YOD -1090A ; [.2252.0020.0002] # PHOENICIAN LETTER KAF -1090B ; [.2253.0020.0002] # PHOENICIAN LETTER LAMD -1090C ; [.2254.0020.0002] # PHOENICIAN LETTER MEM -1090D ; [.2255.0020.0002] # PHOENICIAN LETTER NUN -1090E ; [.2256.0020.0002] # PHOENICIAN LETTER SEMK -1090F ; [.2257.0020.0002] # PHOENICIAN LETTER AIN -10910 ; [.2258.0020.0002] # PHOENICIAN LETTER PE -10911 ; [.2259.0020.0002] # PHOENICIAN LETTER SADE -10912 ; [.225A.0020.0002] # PHOENICIAN LETTER QOF -10913 ; [.225B.0020.0002] # PHOENICIAN LETTER ROSH -10914 ; [.225C.0020.0002] # PHOENICIAN LETTER SHIN -10915 ; [.225D.0020.0002] # PHOENICIAN LETTER TAU -0800 ; [.225E.0020.0002] # SAMARITAN LETTER ALAF -0801 ; [.225F.0020.0002] # SAMARITAN LETTER BIT -0802 ; [.2260.0020.0002] # SAMARITAN LETTER GAMAN -0803 ; [.2261.0020.0002] # SAMARITAN LETTER DALAT -0804 ; [.2262.0020.0002] # SAMARITAN LETTER IY -0805 ; [.2263.0020.0002] # SAMARITAN LETTER BAA -0806 ; [.2264.0020.0002] # SAMARITAN LETTER ZEN -0807 ; [.2265.0020.0002] # SAMARITAN LETTER IT -0808 ; [.2266.0020.0002] # SAMARITAN LETTER TIT -0809 ; [.2267.0020.0002] # SAMARITAN LETTER YUT -080A ; [.2268.0020.0002] # SAMARITAN LETTER KAAF -080B ; [.2269.0020.0002] # SAMARITAN LETTER LABAT -080C ; [.226A.0020.0002] # SAMARITAN LETTER MIM -080D ; [.226B.0020.0002] # SAMARITAN LETTER NUN -080E ; [.226C.0020.0002] # SAMARITAN LETTER SINGAAT -080F ; [.226D.0020.0002] # SAMARITAN LETTER IN -0810 ; [.226E.0020.0002] # SAMARITAN LETTER FI -0811 ; [.226F.0020.0002] # SAMARITAN LETTER TSAADIY -0812 ; [.2270.0020.0002] # SAMARITAN LETTER QUF -0813 ; [.2271.0020.0002] # SAMARITAN LETTER RISH -0814 ; [.2272.0020.0002] # SAMARITAN LETTER SHAN -0815 ; [.2273.0020.0002] # SAMARITAN LETTER TAAF -0816 ; [.2274.0020.0002] # SAMARITAN MARK IN -0817 ; [.2275.0020.0002] # SAMARITAN MARK IN-ALAF -081A ; [.2276.0020.0002] # SAMARITAN MODIFIER LETTER EPENTHETIC YUT -081B ; [.2277.0020.0002] # SAMARITAN MARK EPENTHETIC YUT -0621 ; [.2278.0020.0002] # ARABIC LETTER HAMZA -0674 ; [.2278.0020.0004] # ARABIC LETTER HIGH HAMZA -FE80 ; [.2278.0020.001A] # ARABIC LETTER HAMZA ISOLATED FORM -06FD ; [.2278.0020.0004][.0000.010C.0004] # ARABIC SIGN SINDHI AMPERSAND -0622 ; [.2279.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE -0627 0653 ; [.2279.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE -FE82 ; [.2279.0020.0019] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM -FE81 ; [.2279.0020.001A] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM -0623 ; [.227A.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE -0627 0654 ; [.227A.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE -FE84 ; [.227A.0020.0019] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM -FE83 ; [.227A.0020.001A] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM -0672 ; [.227B.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE -0671 ; [.227C.0020.0002] # ARABIC LETTER ALEF WASLA -FB51 ; [.227C.0020.0019] # ARABIC LETTER ALEF WASLA FINAL FORM -FB50 ; [.227C.0020.001A] # ARABIC LETTER ALEF WASLA ISOLATED FORM -0624 ; [.227D.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE -0648 0654 ; [.227D.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE -FE86 ; [.227D.0020.0019] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM -FE85 ; [.227D.0020.001A] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM -0625 ; [.227E.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW -0627 0655 ; [.227E.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW -FE88 ; [.227E.0020.0019] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM -FE87 ; [.227E.0020.001A] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM -0673 ; [.227F.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW -0773 ; [.2280.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -0774 ; [.2281.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -0626 ; [.2282.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE -064A 0654 ; [.2282.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE -FE8B ; [.2282.0020.0017] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM -FE8C ; [.2282.0020.0018] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM -FE8A ; [.2282.0020.0019] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM -FE89 ; [.2282.0020.001A] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM -FBEB ; [.2282.0020.0019][.2286.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM -FBEA ; [.2282.0020.001A][.2286.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM -FC97 ; [.2282.0020.0017][.229D.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM -FC00 ; [.2282.0020.001A][.229D.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM -FC98 ; [.2282.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM -FC01 ; [.2282.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM -FC99 ; [.2282.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM -FC64 ; [.2282.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM -FC65 ; [.2282.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM -FC9A ; [.2282.0020.0017][.2318.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM -FCDF ; [.2282.0020.0018][.2318.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM -FC66 ; [.2282.0020.0019][.2318.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM -FC02 ; [.2282.0020.001A][.2318.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM -FC67 ; [.2282.0020.0019][.231C.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM -FC9B ; [.2282.0020.0017][.2325.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM -FCE0 ; [.2282.0020.0018][.2325.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM -FBED ; [.2282.0020.0019][.232A.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM -FBEC ; [.2282.0020.001A][.232A.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM -FBEF ; [.2282.0020.0019][.232B.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM -FBEE ; [.2282.0020.001A][.232B.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM -FBF3 ; [.2282.0020.0019][.232E.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM -FBF2 ; [.2282.0020.001A][.232E.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM -FBF1 ; [.2282.0020.0019][.232F.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM -FBF0 ; [.2282.0020.001A][.232F.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM -FBF5 ; [.2282.0020.0019][.2330.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM -FBF4 ; [.2282.0020.001A][.2330.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM -FBFB ; [.2282.0020.0017][.2339.0020.0017] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM -FBFA ; [.2282.0020.0019][.2339.0020.0019] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM -FC68 ; [.2282.0020.0019][.2339.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM -FBF9 ; [.2282.0020.001A][.2339.0020.001A] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM -FC03 ; [.2282.0020.001A][.2339.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM -FC69 ; [.2282.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM -FC04 ; [.2282.0020.001A][.233A.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM -FBF8 ; [.2282.0020.0017][.233E.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM -FBF7 ; [.2282.0020.0019][.233E.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM -FBF6 ; [.2282.0020.001A][.233E.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM -08A8 ; [.2283.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE -08A9 ; [.2284.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE -08AC ; [.2285.0020.0002] # ARABIC LETTER ROHINGYA YEH -0627 ; [.2286.0020.0002] # ARABIC LETTER ALEF -08AD ; [.2286.0020.0004] # ARABIC LETTER LOW ALEF -1EE00 ; [.2286.0020.0005] # ARABIC MATHEMATICAL ALEF -1EE80 ; [.2286.0020.0005] # ARABIC MATHEMATICAL LOOPED ALEF -FE8E ; [.2286.0020.0019] # ARABIC LETTER ALEF FINAL FORM -FE8D ; [.2286.0020.001A] # ARABIC LETTER ALEF ISOLATED FORM -FD3C ; [.2286.0020.0019][.0000.006D.0019] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM -FD3D ; [.2286.0020.001A][.0000.006D.001A] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -0675 ; [.2286.0020.0004][.2278.0020.0004] # ARABIC LETTER HIGH HAMZA ALEF -FDF3 ; [.2286.0020.001A][.22FC.0020.001A][.2288.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE AKBAR ISOLATED FORM -FDF2 ; [.2286.0020.001A][.2311.0020.001A][.2311.0020.001A][.2325.0020.001A] # ARABIC LIGATURE ALLAH ISOLATED FORM -066E ; [.2287.0020.0002] # ARABIC LETTER DOTLESS BEH -1EE1C ; [.2287.0020.0005] # ARABIC MATHEMATICAL DOTLESS BEH -1EE7C ; [.2287.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS BEH -0628 ; [.2288.0020.0002] # ARABIC LETTER BEH -1EE01 ; [.2288.0020.0005] # ARABIC MATHEMATICAL BEH -1EE21 ; [.2288.0020.0005] # ARABIC MATHEMATICAL INITIAL BEH -1EE61 ; [.2288.0020.0005] # ARABIC MATHEMATICAL STRETCHED BEH -1EE81 ; [.2288.0020.0005] # ARABIC MATHEMATICAL LOOPED BEH -1EEA1 ; [.2288.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK BEH -FE91 ; [.2288.0020.0017] # ARABIC LETTER BEH INITIAL FORM -FE92 ; [.2288.0020.0018] # ARABIC LETTER BEH MEDIAL FORM -FE90 ; [.2288.0020.0019] # ARABIC LETTER BEH FINAL FORM -FE8F ; [.2288.0020.001A] # ARABIC LETTER BEH ISOLATED FORM -FC9C ; [.2288.0020.0017][.229D.0020.0017] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM -FC05 ; [.2288.0020.001A][.229D.0020.001A] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM -FC9D ; [.2288.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM -FC06 ; [.2288.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM -FDC2 ; [.2288.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM -FC9E ; [.2288.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM -FC07 ; [.2288.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM -FD9E ; [.2288.0020.0019][.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM -FC6A ; [.2288.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE BEH WITH REH FINAL FORM -FC6B ; [.2288.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM -FC9F ; [.2288.0020.0017][.2318.0020.0017] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM -FCE1 ; [.2288.0020.0018][.2318.0020.0018] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM -FC6C ; [.2288.0020.0019][.2318.0020.0019] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM -FC08 ; [.2288.0020.001A][.2318.0020.001A] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM -FC6D ; [.2288.0020.0019][.231C.0020.0019] # ARABIC LIGATURE BEH WITH NOON FINAL FORM -FCA0 ; [.2288.0020.0017][.2325.0020.0017] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM -FCE2 ; [.2288.0020.0018][.2325.0020.0018] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM -FC6E ; [.2288.0020.0019][.2339.0020.0019] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM -FC09 ; [.2288.0020.001A][.2339.0020.001A] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM -FC6F ; [.2288.0020.0019][.233A.0020.0019] # ARABIC LIGATURE BEH WITH YEH FINAL FORM -FC0A ; [.2288.0020.001A][.233A.0020.001A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM -067B ; [.2289.0020.0002] # ARABIC LETTER BEEH -FB54 ; [.2289.0020.0017] # ARABIC LETTER BEEH INITIAL FORM -FB55 ; [.2289.0020.0018] # ARABIC LETTER BEEH MEDIAL FORM -FB53 ; [.2289.0020.0019] # ARABIC LETTER BEEH FINAL FORM -FB52 ; [.2289.0020.001A] # ARABIC LETTER BEEH ISOLATED FORM -067E ; [.228A.0020.0002] # ARABIC LETTER PEH -FB58 ; [.228A.0020.0017] # ARABIC LETTER PEH INITIAL FORM -FB59 ; [.228A.0020.0018] # ARABIC LETTER PEH MEDIAL FORM -FB57 ; [.228A.0020.0019] # ARABIC LETTER PEH FINAL FORM -FB56 ; [.228A.0020.001A] # ARABIC LETTER PEH ISOLATED FORM -0680 ; [.228B.0020.0002] # ARABIC LETTER BEHEH -FB5C ; [.228B.0020.0017] # ARABIC LETTER BEHEH INITIAL FORM -FB5D ; [.228B.0020.0018] # ARABIC LETTER BEHEH MEDIAL FORM -FB5B ; [.228B.0020.0019] # ARABIC LETTER BEHEH FINAL FORM -FB5A ; [.228B.0020.001A] # ARABIC LETTER BEHEH ISOLATED FORM -0750 ; [.228C.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW -0751 ; [.228D.0020.0002] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE -0752 ; [.228E.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW -0753 ; [.228F.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE -0754 ; [.2290.0020.0002] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE -0755 ; [.2291.0020.0002] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW -08A0 ; [.2292.0020.0002] # ARABIC LETTER BEH WITH SMALL V BELOW -0756 ; [.2293.0020.0002] # ARABIC LETTER BEH WITH SMALL V -08A1 ; [.2294.0020.0002] # ARABIC LETTER BEH WITH HAMZA ABOVE -0629 ; [.2295.0020.0002] # ARABIC LETTER TEH MARBUTA -FE94 ; [.2295.0020.0019] # ARABIC LETTER TEH MARBUTA FINAL FORM -FE93 ; [.2295.0020.001A] # ARABIC LETTER TEH MARBUTA ISOLATED FORM -062A ; [.2296.0020.0002] # ARABIC LETTER TEH -1EE15 ; [.2296.0020.0005] # ARABIC MATHEMATICAL TEH -1EE35 ; [.2296.0020.0005] # ARABIC MATHEMATICAL INITIAL TEH -1EE75 ; [.2296.0020.0005] # ARABIC MATHEMATICAL STRETCHED TEH -1EE95 ; [.2296.0020.0005] # ARABIC MATHEMATICAL LOOPED TEH -1EEB5 ; [.2296.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TEH -FE97 ; [.2296.0020.0017] # ARABIC LETTER TEH INITIAL FORM -FE98 ; [.2296.0020.0018] # ARABIC LETTER TEH MEDIAL FORM -FE96 ; [.2296.0020.0019] # ARABIC LETTER TEH FINAL FORM -FE95 ; [.2296.0020.001A] # ARABIC LETTER TEH ISOLATED FORM -FCA1 ; [.2296.0020.0017][.229D.0020.0017] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM -FC0B ; [.2296.0020.001A][.229D.0020.001A] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM -FD50 ; [.2296.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM -FDA0 ; [.2296.0020.0019][.229D.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM -FD9F ; [.2296.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM -FCA2 ; [.2296.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM -FC0C ; [.2296.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM -FD52 ; [.2296.0020.0017][.22A4.0020.0017][.229D.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM -FD51 ; [.2296.0020.0019][.22A4.0020.0019][.229D.0020.0019] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM -FD53 ; [.2296.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM -FCA3 ; [.2296.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM -FC0D ; [.2296.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM -FD54 ; [.2296.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM -FDA2 ; [.2296.0020.0019][.22A5.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM -FDA1 ; [.2296.0020.0019][.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM -FC70 ; [.2296.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE TEH WITH REH FINAL FORM -FC71 ; [.2296.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM -FCA4 ; [.2296.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM -FCE3 ; [.2296.0020.0018][.2318.0020.0018] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM -FC72 ; [.2296.0020.0019][.2318.0020.0019] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM -FC0E ; [.2296.0020.001A][.2318.0020.001A] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM -FD55 ; [.2296.0020.0017][.2318.0020.0017][.229D.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM -FD56 ; [.2296.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM -FD57 ; [.2296.0020.0017][.2318.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM -FDA4 ; [.2296.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM -FDA3 ; [.2296.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM -FC73 ; [.2296.0020.0019][.231C.0020.0019] # ARABIC LIGATURE TEH WITH NOON FINAL FORM -FCA5 ; [.2296.0020.0017][.2325.0020.0017] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM -FCE4 ; [.2296.0020.0018][.2325.0020.0018] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM -FC74 ; [.2296.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM -FC0F ; [.2296.0020.001A][.2339.0020.001A] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM -FC75 ; [.2296.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TEH WITH YEH FINAL FORM -FC10 ; [.2296.0020.001A][.233A.0020.001A] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM -062B ; [.2297.0020.0002] # ARABIC LETTER THEH -1EE16 ; [.2297.0020.0005] # ARABIC MATHEMATICAL THEH -1EE36 ; [.2297.0020.0005] # ARABIC MATHEMATICAL INITIAL THEH -1EE76 ; [.2297.0020.0005] # ARABIC MATHEMATICAL STRETCHED THEH -1EE96 ; [.2297.0020.0005] # ARABIC MATHEMATICAL LOOPED THEH -1EEB6 ; [.2297.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THEH -FE9B ; [.2297.0020.0017] # ARABIC LETTER THEH INITIAL FORM -FE9C ; [.2297.0020.0018] # ARABIC LETTER THEH MEDIAL FORM -FE9A ; [.2297.0020.0019] # ARABIC LETTER THEH FINAL FORM -FE99 ; [.2297.0020.001A] # ARABIC LETTER THEH ISOLATED FORM -FC11 ; [.2297.0020.001A][.229D.0020.001A] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM -FC76 ; [.2297.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE THEH WITH REH FINAL FORM -FC77 ; [.2297.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM -FCA6 ; [.2297.0020.0017][.2318.0020.0017] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM -FCE5 ; [.2297.0020.0018][.2318.0020.0018] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM -FC78 ; [.2297.0020.0019][.2318.0020.0019] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM -FC12 ; [.2297.0020.001A][.2318.0020.001A] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM -FC79 ; [.2297.0020.0019][.231C.0020.0019] # ARABIC LIGATURE THEH WITH NOON FINAL FORM -FCE6 ; [.2297.0020.0018][.2325.0020.0018] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM -FC7A ; [.2297.0020.0019][.2339.0020.0019] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM -FC13 ; [.2297.0020.001A][.2339.0020.001A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM -FC7B ; [.2297.0020.0019][.233A.0020.0019] # ARABIC LIGATURE THEH WITH YEH FINAL FORM -FC14 ; [.2297.0020.001A][.233A.0020.001A] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM -0679 ; [.2298.0020.0002] # ARABIC LETTER TTEH -FB68 ; [.2298.0020.0017] # ARABIC LETTER TTEH INITIAL FORM -FB69 ; [.2298.0020.0018] # ARABIC LETTER TTEH MEDIAL FORM -FB67 ; [.2298.0020.0019] # ARABIC LETTER TTEH FINAL FORM -FB66 ; [.2298.0020.001A] # ARABIC LETTER TTEH ISOLATED FORM -067A ; [.2299.0020.0002] # ARABIC LETTER TTEHEH -FB60 ; [.2299.0020.0017] # ARABIC LETTER TTEHEH INITIAL FORM -FB61 ; [.2299.0020.0018] # ARABIC LETTER TTEHEH MEDIAL FORM -FB5F ; [.2299.0020.0019] # ARABIC LETTER TTEHEH FINAL FORM -FB5E ; [.2299.0020.001A] # ARABIC LETTER TTEHEH ISOLATED FORM -067C ; [.229A.0020.0002] # ARABIC LETTER TEH WITH RING -067D ; [.229B.0020.0002] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS -067F ; [.229C.0020.0002] # ARABIC LETTER TEHEH -FB64 ; [.229C.0020.0017] # ARABIC LETTER TEHEH INITIAL FORM -FB65 ; [.229C.0020.0018] # ARABIC LETTER TEHEH MEDIAL FORM -FB63 ; [.229C.0020.0019] # ARABIC LETTER TEHEH FINAL FORM -FB62 ; [.229C.0020.001A] # ARABIC LETTER TEHEH ISOLATED FORM -062C ; [.229D.0020.0002] # ARABIC LETTER JEEM -1EE02 ; [.229D.0020.0005] # ARABIC MATHEMATICAL JEEM -1EE22 ; [.229D.0020.0005] # ARABIC MATHEMATICAL INITIAL JEEM -1EE42 ; [.229D.0020.0005] # ARABIC MATHEMATICAL TAILED JEEM -1EE62 ; [.229D.0020.0005] # ARABIC MATHEMATICAL STRETCHED JEEM -1EE82 ; [.229D.0020.0005] # ARABIC MATHEMATICAL LOOPED JEEM -1EEA2 ; [.229D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM -FE9F ; [.229D.0020.0017] # ARABIC LETTER JEEM INITIAL FORM -FEA0 ; [.229D.0020.0018] # ARABIC LETTER JEEM MEDIAL FORM -FE9E ; [.229D.0020.0019] # ARABIC LETTER JEEM FINAL FORM -FE9D ; [.229D.0020.001A] # ARABIC LETTER JEEM ISOLATED FORM -FCA7 ; [.229D.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM -FC15 ; [.229D.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM -FDA6 ; [.229D.0020.0019][.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM -FDBE ; [.229D.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM -FDFB ; [.229D.0020.001A][.2311.0020.001A][*0209.0020.001A][.229D.0020.001A][.2311.0020.001A][.2286.0020.001A][.2311.0020.001A][.2325.0020.001A] # ARABIC LIGATURE JALLAJALALOUHOU -FCA8 ; [.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM -FC16 ; [.229D.0020.001A][.2318.0020.001A] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM -FD59 ; [.229D.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM -FD58 ; [.229D.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM -FDA7 ; [.229D.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM -FDA5 ; [.229D.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM -FD1D ; [.229D.0020.0019][.2339.0020.0019] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM -FD01 ; [.229D.0020.001A][.2339.0020.001A] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM -FD1E ; [.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM -FD02 ; [.229D.0020.001A][.233A.0020.001A] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM -0683 ; [.229E.0020.0002] # ARABIC LETTER NYEH -FB78 ; [.229E.0020.0017] # ARABIC LETTER NYEH INITIAL FORM -FB79 ; [.229E.0020.0018] # ARABIC LETTER NYEH MEDIAL FORM -FB77 ; [.229E.0020.0019] # ARABIC LETTER NYEH FINAL FORM -FB76 ; [.229E.0020.001A] # ARABIC LETTER NYEH ISOLATED FORM -0684 ; [.229F.0020.0002] # ARABIC LETTER DYEH -FB74 ; [.229F.0020.0017] # ARABIC LETTER DYEH INITIAL FORM -FB75 ; [.229F.0020.0018] # ARABIC LETTER DYEH MEDIAL FORM -FB73 ; [.229F.0020.0019] # ARABIC LETTER DYEH FINAL FORM -FB72 ; [.229F.0020.001A] # ARABIC LETTER DYEH ISOLATED FORM -0686 ; [.22A0.0020.0002] # ARABIC LETTER TCHEH -FB7C ; [.22A0.0020.0017] # ARABIC LETTER TCHEH INITIAL FORM -FB7D ; [.22A0.0020.0018] # ARABIC LETTER TCHEH MEDIAL FORM -FB7B ; [.22A0.0020.0019] # ARABIC LETTER TCHEH FINAL FORM -FB7A ; [.22A0.0020.001A] # ARABIC LETTER TCHEH ISOLATED FORM -06BF ; [.22A1.0020.0002] # ARABIC LETTER TCHEH WITH DOT ABOVE -0687 ; [.22A2.0020.0002] # ARABIC LETTER TCHEHEH -FB80 ; [.22A2.0020.0017] # ARABIC LETTER TCHEHEH INITIAL FORM -FB81 ; [.22A2.0020.0018] # ARABIC LETTER TCHEHEH MEDIAL FORM -FB7F ; [.22A2.0020.0019] # ARABIC LETTER TCHEHEH FINAL FORM -FB7E ; [.22A2.0020.001A] # ARABIC LETTER TCHEHEH ISOLATED FORM -08A2 ; [.22A3.0020.0002] # ARABIC LETTER JEEM WITH TWO DOTS ABOVE -062D ; [.22A4.0020.0002] # ARABIC LETTER HAH -1EE07 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL HAH -1EE27 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL INITIAL HAH -1EE47 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL TAILED HAH -1EE67 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL STRETCHED HAH -1EE87 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL LOOPED HAH -1EEA7 ; [.22A4.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK HAH -FEA3 ; [.22A4.0020.0017] # ARABIC LETTER HAH INITIAL FORM -FEA4 ; [.22A4.0020.0018] # ARABIC LETTER HAH MEDIAL FORM -FEA2 ; [.22A4.0020.0019] # ARABIC LETTER HAH FINAL FORM -FEA1 ; [.22A4.0020.001A] # ARABIC LETTER HAH ISOLATED FORM -FCA9 ; [.22A4.0020.0017][.229D.0020.0017] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM -FC17 ; [.22A4.0020.001A][.229D.0020.001A] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM -FDBF ; [.22A4.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM -FCAA ; [.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM -FC18 ; [.22A4.0020.001A][.2318.0020.001A] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM -FD5B ; [.22A4.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD5A ; [.22A4.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM -FD1B ; [.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM -FCFF ; [.22A4.0020.001A][.2339.0020.001A] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM -FD1C ; [.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE HAH WITH YEH FINAL FORM -FD00 ; [.22A4.0020.001A][.233A.0020.001A] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM -062E ; [.22A5.0020.0002] # ARABIC LETTER KHAH -1EE17 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL KHAH -1EE37 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL INITIAL KHAH -1EE57 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL TAILED KHAH -1EE77 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL STRETCHED KHAH -1EE97 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL LOOPED KHAH -1EEB7 ; [.22A5.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH -FEA7 ; [.22A5.0020.0017] # ARABIC LETTER KHAH INITIAL FORM -FEA8 ; [.22A5.0020.0018] # ARABIC LETTER KHAH MEDIAL FORM -FEA6 ; [.22A5.0020.0019] # ARABIC LETTER KHAH FINAL FORM -FEA5 ; [.22A5.0020.001A] # ARABIC LETTER KHAH ISOLATED FORM -FCAB ; [.22A5.0020.0017][.229D.0020.0017] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM -FC19 ; [.22A5.0020.001A][.229D.0020.001A] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM -FC1A ; [.22A5.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM -FCAC ; [.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM -FC1B ; [.22A5.0020.001A][.2318.0020.001A] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM -FD1F ; [.22A5.0020.0019][.2339.0020.0019] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM -FD03 ; [.22A5.0020.001A][.2339.0020.001A] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM -FD20 ; [.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM -FD04 ; [.22A5.0020.001A][.233A.0020.001A] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM -0681 ; [.22A6.0020.0002] # ARABIC LETTER HAH WITH HAMZA ABOVE -0682 ; [.22A7.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE -0685 ; [.22A8.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS ABOVE -0757 ; [.22A9.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS ABOVE -0758 ; [.22AA.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW -076E ; [.22AB.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW -076F ; [.22AC.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS -0772 ; [.22AD.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE -077C ; [.22AE.0020.0002] # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW -062F ; [.22AF.0020.0002] # ARABIC LETTER DAL -1EE03 ; [.22AF.0020.0005] # ARABIC MATHEMATICAL DAL -1EE83 ; [.22AF.0020.0005] # ARABIC MATHEMATICAL LOOPED DAL -1EEA3 ; [.22AF.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAL -FEAA ; [.22AF.0020.0019] # ARABIC LETTER DAL FINAL FORM -FEA9 ; [.22AF.0020.001A] # ARABIC LETTER DAL ISOLATED FORM -0630 ; [.22B0.0020.0002] # ARABIC LETTER THAL -1EE18 ; [.22B0.0020.0005] # ARABIC MATHEMATICAL THAL -1EE98 ; [.22B0.0020.0005] # ARABIC MATHEMATICAL LOOPED THAL -1EEB8 ; [.22B0.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THAL -FEAC ; [.22B0.0020.0019] # ARABIC LETTER THAL FINAL FORM -FEAB ; [.22B0.0020.001A] # ARABIC LETTER THAL ISOLATED FORM -FC5B ; [.22B0.0020.001A][.0000.0098.001A] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM -0688 ; [.22B1.0020.0002] # ARABIC LETTER DDAL -FB89 ; [.22B1.0020.0019] # ARABIC LETTER DDAL FINAL FORM -FB88 ; [.22B1.0020.001A] # ARABIC LETTER DDAL ISOLATED FORM -0689 ; [.22B2.0020.0002] # ARABIC LETTER DAL WITH RING -068A ; [.22B3.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW -068B ; [.22B4.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH -068C ; [.22B5.0020.0002] # ARABIC LETTER DAHAL -FB85 ; [.22B5.0020.0019] # ARABIC LETTER DAHAL FINAL FORM -FB84 ; [.22B5.0020.001A] # ARABIC LETTER DAHAL ISOLATED FORM -068D ; [.22B6.0020.0002] # ARABIC LETTER DDAHAL -FB83 ; [.22B6.0020.0019] # ARABIC LETTER DDAHAL FINAL FORM -FB82 ; [.22B6.0020.001A] # ARABIC LETTER DDAHAL ISOLATED FORM -08AE ; [.22B7.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS BELOW -068E ; [.22B8.0020.0002] # ARABIC LETTER DUL -FB87 ; [.22B8.0020.0019] # ARABIC LETTER DUL FINAL FORM -FB86 ; [.22B8.0020.001A] # ARABIC LETTER DUL ISOLATED FORM -068F ; [.22B9.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS -0690 ; [.22BA.0020.0002] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE -06EE ; [.22BB.0020.0002] # ARABIC LETTER DAL WITH INVERTED V -0759 ; [.22BC.0020.0002] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH -075A ; [.22BD.0020.0002] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW -0631 ; [.22BE.0020.0002] # ARABIC LETTER REH -1EE13 ; [.22BE.0020.0005] # ARABIC MATHEMATICAL REH -1EE93 ; [.22BE.0020.0005] # ARABIC MATHEMATICAL LOOPED REH -1EEB3 ; [.22BE.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK REH -FEAE ; [.22BE.0020.0019] # ARABIC LETTER REH FINAL FORM -FEAD ; [.22BE.0020.001A] # ARABIC LETTER REH ISOLATED FORM -FC5C ; [.22BE.0020.001A][.0000.0098.001A] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM -FDF6 ; [.22BE.0020.001A][.22D0.0020.001A][.232B.0020.001A][.2311.0020.001A] # ARABIC LIGATURE RASOUL ISOLATED FORM -FDFC ; [.22BE.0020.001A][.233B.0020.001A][.2286.0020.001A][.2311.0020.001A] # RIAL SIGN -0632 ; [.22BF.0020.0002] # ARABIC LETTER ZAIN -1EE06 ; [.22BF.0020.0005] # ARABIC MATHEMATICAL ZAIN -1EE86 ; [.22BF.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAIN -1EEA6 ; [.22BF.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN -FEB0 ; [.22BF.0020.0019] # ARABIC LETTER ZAIN FINAL FORM -FEAF ; [.22BF.0020.001A] # ARABIC LETTER ZAIN ISOLATED FORM -0691 ; [.22C0.0020.0002] # ARABIC LETTER RREH -FB8D ; [.22C0.0020.0019] # ARABIC LETTER RREH FINAL FORM -FB8C ; [.22C0.0020.001A] # ARABIC LETTER RREH ISOLATED FORM -0692 ; [.22C1.0020.0002] # ARABIC LETTER REH WITH SMALL V -0693 ; [.22C2.0020.0002] # ARABIC LETTER REH WITH RING -0694 ; [.22C3.0020.0002] # ARABIC LETTER REH WITH DOT BELOW -0695 ; [.22C4.0020.0002] # ARABIC LETTER REH WITH SMALL V BELOW -0696 ; [.22C5.0020.0002] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE -0697 ; [.22C6.0020.0002] # ARABIC LETTER REH WITH TWO DOTS ABOVE -0698 ; [.22C7.0020.0002] # ARABIC LETTER JEH -FB8B ; [.22C7.0020.0019] # ARABIC LETTER JEH FINAL FORM -FB8A ; [.22C7.0020.001A] # ARABIC LETTER JEH ISOLATED FORM -0699 ; [.22C8.0020.0002] # ARABIC LETTER REH WITH FOUR DOTS ABOVE -06EF ; [.22C9.0020.0002] # ARABIC LETTER REH WITH INVERTED V -075B ; [.22CA.0020.0002] # ARABIC LETTER REH WITH STROKE -076B ; [.22CB.0020.0002] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE -076C ; [.22CC.0020.0002] # ARABIC LETTER REH WITH HAMZA ABOVE -0771 ; [.22CD.0020.0002] # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS -08AA ; [.22CE.0020.0002] # ARABIC LETTER REH WITH LOOP -08B2 ; [.22CF.0020.0002] # ARABIC LETTER ZAIN WITH INVERTED V ABOVE -0633 ; [.22D0.0020.0002] # ARABIC LETTER SEEN -1EE0E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL SEEN -1EE2E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL INITIAL SEEN -1EE4E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL TAILED SEEN -1EE6E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL STRETCHED SEEN -1EE8E ; [.22D0.0020.0005] # ARABIC MATHEMATICAL LOOPED SEEN -1EEAE ; [.22D0.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN -FEB3 ; [.22D0.0020.0017] # ARABIC LETTER SEEN INITIAL FORM -FEB4 ; [.22D0.0020.0018] # ARABIC LETTER SEEN MEDIAL FORM -FEB2 ; [.22D0.0020.0019] # ARABIC LETTER SEEN FINAL FORM -FEB1 ; [.22D0.0020.001A] # ARABIC LETTER SEEN ISOLATED FORM -FCAD ; [.22D0.0020.0017][.229D.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM -FD34 ; [.22D0.0020.0018][.229D.0020.0018] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM -FC1C ; [.22D0.0020.001A][.229D.0020.001A] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM -FD5D ; [.22D0.0020.0017][.229D.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM -FD5E ; [.22D0.0020.0019][.229D.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM -FCAE ; [.22D0.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM -FD35 ; [.22D0.0020.0018][.22A4.0020.0018] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM -FC1D ; [.22D0.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM -FD5C ; [.22D0.0020.0017][.22A4.0020.0017][.229D.0020.0017] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM -FCAF ; [.22D0.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM -FD36 ; [.22D0.0020.0018][.22A5.0020.0018] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM -FC1E ; [.22D0.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM -FDA8 ; [.22D0.0020.0019][.22A5.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM -FDC6 ; [.22D0.0020.0019][.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM -FD2A ; [.22D0.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE SEEN WITH REH FINAL FORM -FD0E ; [.22D0.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM -FCB0 ; [.22D0.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM -FCE7 ; [.22D0.0020.0018][.2318.0020.0018] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM -FC1F ; [.22D0.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM -FD61 ; [.22D0.0020.0017][.2318.0020.0017][.229D.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM -FD60 ; [.22D0.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM -FD5F ; [.22D0.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM -FD63 ; [.22D0.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM -FD62 ; [.22D0.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM -FD31 ; [.22D0.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM -FCE8 ; [.22D0.0020.0018][.2325.0020.0018] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM -FD17 ; [.22D0.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM -FCFB ; [.22D0.0020.001A][.2339.0020.001A] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM -FD18 ; [.22D0.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM -FCFC ; [.22D0.0020.001A][.233A.0020.001A] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM -0634 ; [.22D1.0020.0002] # ARABIC LETTER SHEEN -1EE14 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL SHEEN -1EE34 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL INITIAL SHEEN -1EE54 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL TAILED SHEEN -1EE74 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL STRETCHED SHEEN -1EE94 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL LOOPED SHEEN -1EEB4 ; [.22D1.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN -FEB7 ; [.22D1.0020.0017] # ARABIC LETTER SHEEN INITIAL FORM -FEB8 ; [.22D1.0020.0018] # ARABIC LETTER SHEEN MEDIAL FORM -FEB6 ; [.22D1.0020.0019] # ARABIC LETTER SHEEN FINAL FORM -FEB5 ; [.22D1.0020.001A] # ARABIC LETTER SHEEN ISOLATED FORM -FD2D ; [.22D1.0020.0017][.229D.0020.0017] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM -FD37 ; [.22D1.0020.0018][.229D.0020.0018] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM -FD25 ; [.22D1.0020.0019][.229D.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM -FD09 ; [.22D1.0020.001A][.229D.0020.001A] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM -FD69 ; [.22D1.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM -FD2E ; [.22D1.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM -FD38 ; [.22D1.0020.0018][.22A4.0020.0018] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM -FD26 ; [.22D1.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM -FD0A ; [.22D1.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM -FD68 ; [.22D1.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM -FD67 ; [.22D1.0020.0019][.22A4.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM -FDAA ; [.22D1.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM -FD2F ; [.22D1.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM -FD39 ; [.22D1.0020.0018][.22A5.0020.0018] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM -FD27 ; [.22D1.0020.0019][.22A5.0020.0019] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM -FD0B ; [.22D1.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM -FD29 ; [.22D1.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM -FD0D ; [.22D1.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM -FD30 ; [.22D1.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM -FCE9 ; [.22D1.0020.0018][.2318.0020.0018] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM -FD28 ; [.22D1.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM -FD0C ; [.22D1.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM -FD6B ; [.22D1.0020.0017][.2318.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM -FD6A ; [.22D1.0020.0019][.2318.0020.0019][.22A5.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM -FD6D ; [.22D1.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM -FD6C ; [.22D1.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM -FD32 ; [.22D1.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM -FCEA ; [.22D1.0020.0018][.2325.0020.0018] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM -FD19 ; [.22D1.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM -FCFD ; [.22D1.0020.001A][.2339.0020.001A] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM -FD1A ; [.22D1.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM -FCFE ; [.22D1.0020.001A][.233A.0020.001A] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM -069A ; [.22D2.0020.0002] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE -069B ; [.22D3.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW -069C ; [.22D4.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE -06FA ; [.22D5.0020.0002] # ARABIC LETTER SHEEN WITH DOT BELOW -075C ; [.22D6.0020.0002] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE -076D ; [.22D7.0020.0002] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE -0770 ; [.22D8.0020.0002] # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS -077D ; [.22D9.0020.0002] # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE -077E ; [.22DA.0020.0002] # ARABIC LETTER SEEN WITH INVERTED V -0635 ; [.22DB.0020.0002] # ARABIC LETTER SAD -1EE11 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL SAD -1EE31 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL INITIAL SAD -1EE51 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL TAILED SAD -1EE71 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL STRETCHED SAD -1EE91 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL LOOPED SAD -1EEB1 ; [.22DB.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SAD -FEBB ; [.22DB.0020.0017] # ARABIC LETTER SAD INITIAL FORM -FEBC ; [.22DB.0020.0018] # ARABIC LETTER SAD MEDIAL FORM -FEBA ; [.22DB.0020.0019] # ARABIC LETTER SAD FINAL FORM -FEB9 ; [.22DB.0020.001A] # ARABIC LETTER SAD ISOLATED FORM -FCB1 ; [.22DB.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM -FC20 ; [.22DB.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM -FD65 ; [.22DB.0020.0017][.22A4.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM -FD64 ; [.22DB.0020.0019][.22A4.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM -FDA9 ; [.22DB.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM -FCB2 ; [.22DB.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM -FD2B ; [.22DB.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE SAD WITH REH FINAL FORM -FD0F ; [.22DB.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM -FDF5 ; [.22DB.0020.001A][.2311.0020.001A][.22E5.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SALAM ISOLATED FORM -FDF9 ; [.22DB.0020.001A][.2311.0020.001A][.2339.0020.001A] # ARABIC LIGATURE SALLA ISOLATED FORM -FDFA ; [.22DB.0020.001A][.2311.0020.001A][.2339.0020.001A][*0209.0020.001A][.2286.0020.001A][.2311.0020.001A][.2311.0020.001A][.2325.0020.001A][*0209.0020.001A][.22E5.0020.001A][.2311.0020.001A][.233A.0020.001A][.2325.0020.001A][*0209.0020.001A][.232B.0020.001A][.22D0.0020.001A][.2311.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM -FDF0 ; [.22DB.0020.001A][.2311.0020.001A][.2347.0020.001A] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM -FCB3 ; [.22DB.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM -FC21 ; [.22DB.0020.001A][.2318.0020.001A] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM -FDC5 ; [.22DB.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM -FD66 ; [.22DB.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM -FD21 ; [.22DB.0020.0019][.2339.0020.0019] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM -FD05 ; [.22DB.0020.001A][.2339.0020.001A] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM -FD22 ; [.22DB.0020.0019][.233A.0020.0019] # ARABIC LIGATURE SAD WITH YEH FINAL FORM -FD06 ; [.22DB.0020.001A][.233A.0020.001A] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM -0636 ; [.22DC.0020.0002] # ARABIC LETTER DAD -1EE19 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL DAD -1EE39 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL INITIAL DAD -1EE59 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL TAILED DAD -1EE79 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL STRETCHED DAD -1EE99 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL LOOPED DAD -1EEB9 ; [.22DC.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAD -FEBF ; [.22DC.0020.0017] # ARABIC LETTER DAD INITIAL FORM -FEC0 ; [.22DC.0020.0018] # ARABIC LETTER DAD MEDIAL FORM -FEBE ; [.22DC.0020.0019] # ARABIC LETTER DAD FINAL FORM -FEBD ; [.22DC.0020.001A] # ARABIC LETTER DAD ISOLATED FORM -FCB4 ; [.22DC.0020.0017][.229D.0020.0017] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM -FC22 ; [.22DC.0020.001A][.229D.0020.001A] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM -FCB5 ; [.22DC.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM -FC23 ; [.22DC.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM -FD6E ; [.22DC.0020.0019][.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM -FDAB ; [.22DC.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM -FCB6 ; [.22DC.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM -FC24 ; [.22DC.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM -FD70 ; [.22DC.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM -FD6F ; [.22DC.0020.0019][.22A5.0020.0019][.2318.0020.0019] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM -FD2C ; [.22DC.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE DAD WITH REH FINAL FORM -FD10 ; [.22DC.0020.001A][.22BE.0020.001A] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM -FCB7 ; [.22DC.0020.0017][.2318.0020.0017] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM -FC25 ; [.22DC.0020.001A][.2318.0020.001A] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM -FD23 ; [.22DC.0020.0019][.2339.0020.0019] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM -FD07 ; [.22DC.0020.001A][.2339.0020.001A] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM -FD24 ; [.22DC.0020.0019][.233A.0020.0019] # ARABIC LIGATURE DAD WITH YEH FINAL FORM -FD08 ; [.22DC.0020.001A][.233A.0020.001A] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM -069D ; [.22DD.0020.0002] # ARABIC LETTER SAD WITH TWO DOTS BELOW -08AF ; [.22DE.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS BELOW -069E ; [.22DF.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS ABOVE -06FB ; [.22E0.0020.0002] # ARABIC LETTER DAD WITH DOT BELOW -0637 ; [.22E1.0020.0002] # ARABIC LETTER TAH -1EE08 ; [.22E1.0020.0005] # ARABIC MATHEMATICAL TAH -1EE68 ; [.22E1.0020.0005] # ARABIC MATHEMATICAL STRETCHED TAH -1EE88 ; [.22E1.0020.0005] # ARABIC MATHEMATICAL LOOPED TAH -1EEA8 ; [.22E1.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TAH -FEC3 ; [.22E1.0020.0017] # ARABIC LETTER TAH INITIAL FORM -FEC4 ; [.22E1.0020.0018] # ARABIC LETTER TAH MEDIAL FORM -FEC2 ; [.22E1.0020.0019] # ARABIC LETTER TAH FINAL FORM -FEC1 ; [.22E1.0020.001A] # ARABIC LETTER TAH ISOLATED FORM -FCB8 ; [.22E1.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM -FC26 ; [.22E1.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM -FD33 ; [.22E1.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM -FD3A ; [.22E1.0020.0018][.2318.0020.0018] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM -FC27 ; [.22E1.0020.001A][.2318.0020.001A] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM -FD72 ; [.22E1.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM -FD71 ; [.22E1.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM -FD73 ; [.22E1.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM -FD74 ; [.22E1.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM -FD11 ; [.22E1.0020.0019][.2339.0020.0019] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM -FCF5 ; [.22E1.0020.001A][.2339.0020.001A] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM -FD12 ; [.22E1.0020.0019][.233A.0020.0019] # ARABIC LIGATURE TAH WITH YEH FINAL FORM -FCF6 ; [.22E1.0020.001A][.233A.0020.001A] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM -0638 ; [.22E2.0020.0002] # ARABIC LETTER ZAH -1EE1A ; [.22E2.0020.0005] # ARABIC MATHEMATICAL ZAH -1EE7A ; [.22E2.0020.0005] # ARABIC MATHEMATICAL STRETCHED ZAH -1EE9A ; [.22E2.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAH -1EEBA ; [.22E2.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH -FEC7 ; [.22E2.0020.0017] # ARABIC LETTER ZAH INITIAL FORM -FEC8 ; [.22E2.0020.0018] # ARABIC LETTER ZAH MEDIAL FORM -FEC6 ; [.22E2.0020.0019] # ARABIC LETTER ZAH FINAL FORM -FEC5 ; [.22E2.0020.001A] # ARABIC LETTER ZAH ISOLATED FORM -FCB9 ; [.22E2.0020.0017][.2318.0020.0017] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM -FD3B ; [.22E2.0020.0018][.2318.0020.0018] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM -FC28 ; [.22E2.0020.001A][.2318.0020.001A] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM -069F ; [.22E3.0020.0002] # ARABIC LETTER TAH WITH THREE DOTS ABOVE -08A3 ; [.22E4.0020.0002] # ARABIC LETTER TAH WITH TWO DOTS ABOVE -0639 ; [.22E5.0020.0002] # ARABIC LETTER AIN -1EE0F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL AIN -1EE2F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL INITIAL AIN -1EE4F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL TAILED AIN -1EE6F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL STRETCHED AIN -1EE8F ; [.22E5.0020.0005] # ARABIC MATHEMATICAL LOOPED AIN -1EEAF ; [.22E5.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK AIN -FECB ; [.22E5.0020.0017] # ARABIC LETTER AIN INITIAL FORM -FECC ; [.22E5.0020.0018] # ARABIC LETTER AIN MEDIAL FORM -FECA ; [.22E5.0020.0019] # ARABIC LETTER AIN FINAL FORM -FEC9 ; [.22E5.0020.001A] # ARABIC LETTER AIN ISOLATED FORM -FCBA ; [.22E5.0020.0017][.229D.0020.0017] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM -FC29 ; [.22E5.0020.001A][.229D.0020.001A] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM -FDC4 ; [.22E5.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM -FD75 ; [.22E5.0020.0019][.229D.0020.0019][.2318.0020.0019] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM -FDF7 ; [.22E5.0020.001A][.2311.0020.001A][.233A.0020.001A][.2325.0020.001A] # ARABIC LIGATURE ALAYHE ISOLATED FORM -FCBB ; [.22E5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM -FC2A ; [.22E5.0020.001A][.2318.0020.001A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM -FD77 ; [.22E5.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM -FD76 ; [.22E5.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM -FD78 ; [.22E5.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM -FDB6 ; [.22E5.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM -FD13 ; [.22E5.0020.0019][.2339.0020.0019] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM -FCF7 ; [.22E5.0020.001A][.2339.0020.001A] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM -FD14 ; [.22E5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE AIN WITH YEH FINAL FORM -FCF8 ; [.22E5.0020.001A][.233A.0020.001A] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM -063A ; [.22E6.0020.0002] # ARABIC LETTER GHAIN -1EE1B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL GHAIN -1EE3B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL INITIAL GHAIN -1EE5B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL TAILED GHAIN -1EE7B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL STRETCHED GHAIN -1EE9B ; [.22E6.0020.0005] # ARABIC MATHEMATICAL LOOPED GHAIN -1EEBB ; [.22E6.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN -FECF ; [.22E6.0020.0017] # ARABIC LETTER GHAIN INITIAL FORM -FED0 ; [.22E6.0020.0018] # ARABIC LETTER GHAIN MEDIAL FORM -FECE ; [.22E6.0020.0019] # ARABIC LETTER GHAIN FINAL FORM -FECD ; [.22E6.0020.001A] # ARABIC LETTER GHAIN ISOLATED FORM -FCBC ; [.22E6.0020.0017][.229D.0020.0017] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM -FC2B ; [.22E6.0020.001A][.229D.0020.001A] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM -FCBD ; [.22E6.0020.0017][.2318.0020.0017] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM -FC2C ; [.22E6.0020.001A][.2318.0020.001A] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM -FD79 ; [.22E6.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM -FD7B ; [.22E6.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD7A ; [.22E6.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM -FD15 ; [.22E6.0020.0019][.2339.0020.0019] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM -FCF9 ; [.22E6.0020.001A][.2339.0020.001A] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM -FD16 ; [.22E6.0020.0019][.233A.0020.0019] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM -FCFA ; [.22E6.0020.001A][.233A.0020.001A] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM -06A0 ; [.22E7.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS ABOVE -06FC ; [.22E8.0020.0002] # ARABIC LETTER GHAIN WITH DOT BELOW -075D ; [.22E9.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS ABOVE -075E ; [.22EA.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE -075F ; [.22EB.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE -08B3 ; [.22EC.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS BELOW -0641 ; [.22ED.0020.0002] # ARABIC LETTER FEH -1EE10 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL FEH -1EE30 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL INITIAL FEH -1EE70 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL STRETCHED FEH -1EE90 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL LOOPED FEH -1EEB0 ; [.22ED.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK FEH -FED3 ; [.22ED.0020.0017] # ARABIC LETTER FEH INITIAL FORM -FED4 ; [.22ED.0020.0018] # ARABIC LETTER FEH MEDIAL FORM -FED2 ; [.22ED.0020.0019] # ARABIC LETTER FEH FINAL FORM -FED1 ; [.22ED.0020.001A] # ARABIC LETTER FEH ISOLATED FORM -FCBE ; [.22ED.0020.0017][.229D.0020.0017] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM -FC2D ; [.22ED.0020.001A][.229D.0020.001A] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM -FCBF ; [.22ED.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM -FC2E ; [.22ED.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM -FCC0 ; [.22ED.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM -FC2F ; [.22ED.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM -FD7D ; [.22ED.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM -FD7C ; [.22ED.0020.0019][.22A5.0020.0019][.2318.0020.0019] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM -FCC1 ; [.22ED.0020.0017][.2318.0020.0017] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM -FC30 ; [.22ED.0020.001A][.2318.0020.001A] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM -FDC1 ; [.22ED.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM -FC7C ; [.22ED.0020.0019][.2339.0020.0019] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM -FC31 ; [.22ED.0020.001A][.2339.0020.001A] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM -FC7D ; [.22ED.0020.0019][.233A.0020.0019] # ARABIC LIGATURE FEH WITH YEH FINAL FORM -FC32 ; [.22ED.0020.001A][.233A.0020.001A] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM -06A1 ; [.22EE.0020.0002] # ARABIC LETTER DOTLESS FEH -1EE1E ; [.22EE.0020.0005] # ARABIC MATHEMATICAL DOTLESS FEH -1EE7E ; [.22EE.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS FEH -06A2 ; [.22EF.0020.0002] # ARABIC LETTER FEH WITH DOT MOVED BELOW -06A3 ; [.22F0.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW -06A4 ; [.22F1.0020.0002] # ARABIC LETTER VEH -FB6C ; [.22F1.0020.0017] # ARABIC LETTER VEH INITIAL FORM -FB6D ; [.22F1.0020.0018] # ARABIC LETTER VEH MEDIAL FORM -FB6B ; [.22F1.0020.0019] # ARABIC LETTER VEH FINAL FORM -FB6A ; [.22F1.0020.001A] # ARABIC LETTER VEH ISOLATED FORM -08A4 ; [.22F2.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE -06A5 ; [.22F3.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS BELOW -06A6 ; [.22F4.0020.0002] # ARABIC LETTER PEHEH -FB70 ; [.22F4.0020.0017] # ARABIC LETTER PEHEH INITIAL FORM -FB71 ; [.22F4.0020.0018] # ARABIC LETTER PEHEH MEDIAL FORM -FB6F ; [.22F4.0020.0019] # ARABIC LETTER PEHEH FINAL FORM -FB6E ; [.22F4.0020.001A] # ARABIC LETTER PEHEH ISOLATED FORM -0760 ; [.22F5.0020.0002] # ARABIC LETTER FEH WITH TWO DOTS BELOW -0761 ; [.22F6.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW -066F ; [.22F7.0020.0002] # ARABIC LETTER DOTLESS QAF -1EE1F ; [.22F7.0020.0005] # ARABIC MATHEMATICAL DOTLESS QAF -1EE5F ; [.22F7.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS QAF -0642 ; [.22F8.0020.0002] # ARABIC LETTER QAF -1EE12 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL QAF -1EE32 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL INITIAL QAF -1EE52 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL TAILED QAF -1EE72 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL STRETCHED QAF -1EE92 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL LOOPED QAF -1EEB2 ; [.22F8.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK QAF -FED7 ; [.22F8.0020.0017] # ARABIC LETTER QAF INITIAL FORM -FED8 ; [.22F8.0020.0018] # ARABIC LETTER QAF MEDIAL FORM -FED6 ; [.22F8.0020.0019] # ARABIC LETTER QAF FINAL FORM -FED5 ; [.22F8.0020.001A] # ARABIC LETTER QAF ISOLATED FORM -FCC2 ; [.22F8.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM -FC33 ; [.22F8.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM -FDF1 ; [.22F8.0020.001A][.2311.0020.001A][.2347.0020.001A] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM -FCC3 ; [.22F8.0020.0017][.2318.0020.0017] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM -FC34 ; [.22F8.0020.001A][.2318.0020.001A] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM -FDB4 ; [.22F8.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM -FD7E ; [.22F8.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM -FD7F ; [.22F8.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM -FDB2 ; [.22F8.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM -FC7E ; [.22F8.0020.0019][.2339.0020.0019] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM -FC35 ; [.22F8.0020.001A][.2339.0020.001A] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM -FC7F ; [.22F8.0020.0019][.233A.0020.0019] # ARABIC LIGATURE QAF WITH YEH FINAL FORM -FC36 ; [.22F8.0020.001A][.233A.0020.001A] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM -06A7 ; [.22F9.0020.0002] # ARABIC LETTER QAF WITH DOT ABOVE -06A8 ; [.22FA.0020.0002] # ARABIC LETTER QAF WITH THREE DOTS ABOVE -08A5 ; [.22FB.0020.0002] # ARABIC LETTER QAF WITH DOT BELOW -0643 ; [.22FC.0020.0002] # ARABIC LETTER KAF -1EE0A ; [.22FC.0020.0005] # ARABIC MATHEMATICAL KAF -1EE2A ; [.22FC.0020.0005] # ARABIC MATHEMATICAL INITIAL KAF -1EE6A ; [.22FC.0020.0005] # ARABIC MATHEMATICAL STRETCHED KAF -FEDB ; [.22FC.0020.0017] # ARABIC LETTER KAF INITIAL FORM -FEDC ; [.22FC.0020.0018] # ARABIC LETTER KAF MEDIAL FORM -FEDA ; [.22FC.0020.0019] # ARABIC LETTER KAF FINAL FORM -FED9 ; [.22FC.0020.001A] # ARABIC LETTER KAF ISOLATED FORM -FC80 ; [.22FC.0020.0019][.2286.0020.0019] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM -FC37 ; [.22FC.0020.001A][.2286.0020.001A] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM -FCC4 ; [.22FC.0020.0017][.229D.0020.0017] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM -FC38 ; [.22FC.0020.001A][.229D.0020.001A] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM -FCC5 ; [.22FC.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM -FC39 ; [.22FC.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM -FCC6 ; [.22FC.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM -FC3A ; [.22FC.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM -FCC7 ; [.22FC.0020.0017][.2311.0020.0017] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM -FCEB ; [.22FC.0020.0018][.2311.0020.0018] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM -FC81 ; [.22FC.0020.0019][.2311.0020.0019] # ARABIC LIGATURE KAF WITH LAM FINAL FORM -FC3B ; [.22FC.0020.001A][.2311.0020.001A] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM -FCC8 ; [.22FC.0020.0017][.2318.0020.0017] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM -FCEC ; [.22FC.0020.0018][.2318.0020.0018] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM -FC82 ; [.22FC.0020.0019][.2318.0020.0019] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM -FC3C ; [.22FC.0020.001A][.2318.0020.001A] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM -FDC3 ; [.22FC.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM -FDBB ; [.22FC.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM -FDB7 ; [.22FC.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM -FC83 ; [.22FC.0020.0019][.2339.0020.0019] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM -FC3D ; [.22FC.0020.001A][.2339.0020.001A] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM -FC84 ; [.22FC.0020.0019][.233A.0020.0019] # ARABIC LIGATURE KAF WITH YEH FINAL FORM -FC3E ; [.22FC.0020.001A][.233A.0020.001A] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM -06A9 ; [.22FD.0020.0002] # ARABIC LETTER KEHEH -FB90 ; [.22FD.0020.0017] # ARABIC LETTER KEHEH INITIAL FORM -FB91 ; [.22FD.0020.0018] # ARABIC LETTER KEHEH MEDIAL FORM -FB8F ; [.22FD.0020.0019] # ARABIC LETTER KEHEH FINAL FORM -FB8E ; [.22FD.0020.001A] # ARABIC LETTER KEHEH ISOLATED FORM -06AA ; [.22FE.0020.0002] # ARABIC LETTER SWASH KAF -06AB ; [.22FF.0020.0002] # ARABIC LETTER KAF WITH RING -06AC ; [.2300.0020.0002] # ARABIC LETTER KAF WITH DOT ABOVE -077F ; [.2301.0020.0002] # ARABIC LETTER KAF WITH TWO DOTS ABOVE -06AD ; [.2302.0020.0002] # ARABIC LETTER NG -FBD5 ; [.2302.0020.0017] # ARABIC LETTER NG INITIAL FORM -FBD6 ; [.2302.0020.0018] # ARABIC LETTER NG MEDIAL FORM -FBD4 ; [.2302.0020.0019] # ARABIC LETTER NG FINAL FORM -FBD3 ; [.2302.0020.001A] # ARABIC LETTER NG ISOLATED FORM -06AE ; [.2303.0020.0002] # ARABIC LETTER KAF WITH THREE DOTS BELOW -08B4 ; [.2304.0020.0002] # ARABIC LETTER KAF WITH DOT BELOW -06AF ; [.2305.0020.0002] # ARABIC LETTER GAF -FB94 ; [.2305.0020.0017] # ARABIC LETTER GAF INITIAL FORM -FB95 ; [.2305.0020.0018] # ARABIC LETTER GAF MEDIAL FORM -FB93 ; [.2305.0020.0019] # ARABIC LETTER GAF FINAL FORM -FB92 ; [.2305.0020.001A] # ARABIC LETTER GAF ISOLATED FORM -08B0 ; [.2306.0020.0002] # ARABIC LETTER GAF WITH INVERTED STROKE -06B0 ; [.2307.0020.0002] # ARABIC LETTER GAF WITH RING -06B1 ; [.2308.0020.0002] # ARABIC LETTER NGOEH -FB9C ; [.2308.0020.0017] # ARABIC LETTER NGOEH INITIAL FORM -FB9D ; [.2308.0020.0018] # ARABIC LETTER NGOEH MEDIAL FORM -FB9B ; [.2308.0020.0019] # ARABIC LETTER NGOEH FINAL FORM -FB9A ; [.2308.0020.001A] # ARABIC LETTER NGOEH ISOLATED FORM -06B2 ; [.2309.0020.0002] # ARABIC LETTER GAF WITH TWO DOTS BELOW -06B3 ; [.230A.0020.0002] # ARABIC LETTER GUEH -FB98 ; [.230A.0020.0017] # ARABIC LETTER GUEH INITIAL FORM -FB99 ; [.230A.0020.0018] # ARABIC LETTER GUEH MEDIAL FORM -FB97 ; [.230A.0020.0019] # ARABIC LETTER GUEH FINAL FORM -FB96 ; [.230A.0020.001A] # ARABIC LETTER GUEH ISOLATED FORM -06B4 ; [.230B.0020.0002] # ARABIC LETTER GAF WITH THREE DOTS ABOVE -0762 ; [.230C.0020.0002] # ARABIC LETTER KEHEH WITH DOT ABOVE -063B ; [.230D.0020.0002] # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE -063C ; [.230E.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS BELOW -0763 ; [.230F.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE -0764 ; [.2310.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW -0644 ; [.2311.0020.0002] # ARABIC LETTER LAM -1EE0B ; [.2311.0020.0005] # ARABIC MATHEMATICAL LAM -1EE2B ; [.2311.0020.0005] # ARABIC MATHEMATICAL INITIAL LAM -1EE4B ; [.2311.0020.0005] # ARABIC MATHEMATICAL TAILED LAM -1EE8B ; [.2311.0020.0005] # ARABIC MATHEMATICAL LOOPED LAM -1EEAB ; [.2311.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK LAM -FEDF ; [.2311.0020.0017] # ARABIC LETTER LAM INITIAL FORM -FEE0 ; [.2311.0020.0018] # ARABIC LETTER LAM MEDIAL FORM -FEDE ; [.2311.0020.0019] # ARABIC LETTER LAM FINAL FORM -FEDD ; [.2311.0020.001A] # ARABIC LETTER LAM ISOLATED FORM -FEF6 ; [.2311.0020.0019][.2279.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM -FEF5 ; [.2311.0020.001A][.2279.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM -FEF8 ; [.2311.0020.0019][.227A.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM -FEF7 ; [.2311.0020.001A][.227A.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM -FEFA ; [.2311.0020.0019][.227E.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM -FEF9 ; [.2311.0020.001A][.227E.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM -FEFC ; [.2311.0020.0019][.2286.0020.0019] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FEFB ; [.2311.0020.001A][.2286.0020.001A] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM -FCC9 ; [.2311.0020.0017][.229D.0020.0017] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM -FC3F ; [.2311.0020.001A][.229D.0020.001A] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM -FD83 ; [.2311.0020.0017][.229D.0020.0017][.229D.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM -FD84 ; [.2311.0020.0019][.229D.0020.0019][.229D.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM -FDBA ; [.2311.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM -FDBC ; [.2311.0020.0019][.229D.0020.0019][.2318.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM -FDAC ; [.2311.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM -FCCA ; [.2311.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM -FC40 ; [.2311.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM -FDB5 ; [.2311.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM -FD80 ; [.2311.0020.0019][.22A4.0020.0019][.2318.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM -FD82 ; [.2311.0020.0019][.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM -FD81 ; [.2311.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM -FCCB ; [.2311.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM -FC41 ; [.2311.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM -FD86 ; [.2311.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM -FD85 ; [.2311.0020.0019][.22A5.0020.0019][.2318.0020.0019] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM -FCCC ; [.2311.0020.0017][.2318.0020.0017] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM -FCED ; [.2311.0020.0018][.2318.0020.0018] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM -FC85 ; [.2311.0020.0019][.2318.0020.0019] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM -FC42 ; [.2311.0020.001A][.2318.0020.001A] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM -FD88 ; [.2311.0020.0017][.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM -FD87 ; [.2311.0020.0019][.2318.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM -FDAD ; [.2311.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM -FCCD ; [.2311.0020.0017][.2325.0020.0017] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM -FC86 ; [.2311.0020.0019][.2339.0020.0019] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM -FC43 ; [.2311.0020.001A][.2339.0020.001A] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM -FC87 ; [.2311.0020.0019][.233A.0020.0019] # ARABIC LIGATURE LAM WITH YEH FINAL FORM -FC44 ; [.2311.0020.001A][.233A.0020.001A] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM -06B5 ; [.2312.0020.0002] # ARABIC LETTER LAM WITH SMALL V -06B6 ; [.2313.0020.0002] # ARABIC LETTER LAM WITH DOT ABOVE -06B7 ; [.2314.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS ABOVE -06B8 ; [.2315.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS BELOW -076A ; [.2316.0020.0002] # ARABIC LETTER LAM WITH BAR -08A6 ; [.2317.0020.0002] # ARABIC LETTER LAM WITH DOUBLE BAR -0645 ; [.2318.0020.0002] # ARABIC LETTER MEEM -1EE0C ; [.2318.0020.0005] # ARABIC MATHEMATICAL MEEM -1EE2C ; [.2318.0020.0005] # ARABIC MATHEMATICAL INITIAL MEEM -1EE6C ; [.2318.0020.0005] # ARABIC MATHEMATICAL STRETCHED MEEM -1EE8C ; [.2318.0020.0005] # ARABIC MATHEMATICAL LOOPED MEEM -1EEAC ; [.2318.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM -FEE3 ; [.2318.0020.0017] # ARABIC LETTER MEEM INITIAL FORM -FEE4 ; [.2318.0020.0018] # ARABIC LETTER MEEM MEDIAL FORM -FEE2 ; [.2318.0020.0019] # ARABIC LETTER MEEM FINAL FORM -FEE1 ; [.2318.0020.001A] # ARABIC LETTER MEEM ISOLATED FORM -06FE ; [.2318.0020.0004][.0000.010C.0004] # ARABIC SIGN SINDHI POSTPOSITION MEN -FC88 ; [.2318.0020.0019][.2286.0020.0019] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM -FCCE ; [.2318.0020.0017][.229D.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM -FC45 ; [.2318.0020.001A][.229D.0020.001A] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM -FD8C ; [.2318.0020.0017][.229D.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM -FD92 ; [.2318.0020.0017][.229D.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM -FD8D ; [.2318.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM -FDC0 ; [.2318.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM -FCCF ; [.2318.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM -FC46 ; [.2318.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM -FD89 ; [.2318.0020.0017][.22A4.0020.0017][.229D.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM -FD8A ; [.2318.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM -FDF4 ; [.2318.0020.001A][.22A4.0020.001A][.2318.0020.001A][.22AF.0020.001A] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM -FD8B ; [.2318.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM -FCD0 ; [.2318.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM -FC47 ; [.2318.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM -FD8E ; [.2318.0020.0017][.22A5.0020.0017][.229D.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM -FD8F ; [.2318.0020.0017][.22A5.0020.0017][.2318.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FDB9 ; [.2318.0020.0019][.22A5.0020.0019][.233A.0020.0019] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM -FCD1 ; [.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM -FC89 ; [.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM -FC48 ; [.2318.0020.001A][.2318.0020.001A] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM -FDB1 ; [.2318.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM -FC49 ; [.2318.0020.001A][.2339.0020.001A] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM -FC4A ; [.2318.0020.001A][.233A.0020.001A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM -0765 ; [.2319.0020.0002] # ARABIC LETTER MEEM WITH DOT ABOVE -0766 ; [.231A.0020.0002] # ARABIC LETTER MEEM WITH DOT BELOW -08A7 ; [.231B.0020.0002] # ARABIC LETTER MEEM WITH THREE DOTS ABOVE -0646 ; [.231C.0020.0002] # ARABIC LETTER NOON -1EE0D ; [.231C.0020.0005] # ARABIC MATHEMATICAL NOON -1EE2D ; [.231C.0020.0005] # ARABIC MATHEMATICAL INITIAL NOON -1EE4D ; [.231C.0020.0005] # ARABIC MATHEMATICAL TAILED NOON -1EE6D ; [.231C.0020.0005] # ARABIC MATHEMATICAL STRETCHED NOON -1EE8D ; [.231C.0020.0005] # ARABIC MATHEMATICAL LOOPED NOON -1EEAD ; [.231C.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK NOON -FEE7 ; [.231C.0020.0017] # ARABIC LETTER NOON INITIAL FORM -FEE8 ; [.231C.0020.0018] # ARABIC LETTER NOON MEDIAL FORM -FEE6 ; [.231C.0020.0019] # ARABIC LETTER NOON FINAL FORM -FEE5 ; [.231C.0020.001A] # ARABIC LETTER NOON ISOLATED FORM -FCD2 ; [.231C.0020.0017][.229D.0020.0017] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM -FC4B ; [.231C.0020.001A][.229D.0020.001A] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM -FDB8 ; [.231C.0020.0017][.229D.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM -FDBD ; [.231C.0020.0019][.229D.0020.0019][.22A4.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM -FD98 ; [.231C.0020.0017][.229D.0020.0017][.2318.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM -FD97 ; [.231C.0020.0019][.229D.0020.0019][.2318.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM -FD99 ; [.231C.0020.0019][.229D.0020.0019][.2339.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM -FDC7 ; [.231C.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FCD3 ; [.231C.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM -FC4C ; [.231C.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM -FD95 ; [.231C.0020.0017][.22A4.0020.0017][.2318.0020.0017] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM -FD96 ; [.231C.0020.0019][.22A4.0020.0019][.2339.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM -FDB3 ; [.231C.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM -FCD4 ; [.231C.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM -FC4D ; [.231C.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM -FC8A ; [.231C.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE NOON WITH REH FINAL FORM -FC8B ; [.231C.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM -FCD5 ; [.231C.0020.0017][.2318.0020.0017] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM -FCEE ; [.231C.0020.0018][.2318.0020.0018] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM -FC8C ; [.231C.0020.0019][.2318.0020.0019] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM -FC4E ; [.231C.0020.001A][.2318.0020.001A] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM -FD9B ; [.231C.0020.0019][.2318.0020.0019][.2339.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD9A ; [.231C.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM -FC8D ; [.231C.0020.0019][.231C.0020.0019] # ARABIC LIGATURE NOON WITH NOON FINAL FORM -FCD6 ; [.231C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM -FCEF ; [.231C.0020.0018][.2325.0020.0018] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM -FC8E ; [.231C.0020.0019][.2339.0020.0019] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM -FC4F ; [.231C.0020.001A][.2339.0020.001A] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM -FC8F ; [.231C.0020.0019][.233A.0020.0019] # ARABIC LIGATURE NOON WITH YEH FINAL FORM -FC50 ; [.231C.0020.001A][.233A.0020.001A] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM -06BA ; [.231D.0020.0002] # ARABIC LETTER NOON GHUNNA -1EE1D ; [.231D.0020.0005] # ARABIC MATHEMATICAL DOTLESS NOON -1EE5D ; [.231D.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS NOON -FB9F ; [.231D.0020.0019] # ARABIC LETTER NOON GHUNNA FINAL FORM -FB9E ; [.231D.0020.001A] # ARABIC LETTER NOON GHUNNA ISOLATED FORM -06BB ; [.231E.0020.0002] # ARABIC LETTER RNOON -FBA2 ; [.231E.0020.0017] # ARABIC LETTER RNOON INITIAL FORM -FBA3 ; [.231E.0020.0018] # ARABIC LETTER RNOON MEDIAL FORM -FBA1 ; [.231E.0020.0019] # ARABIC LETTER RNOON FINAL FORM -FBA0 ; [.231E.0020.001A] # ARABIC LETTER RNOON ISOLATED FORM -06BC ; [.231F.0020.0002] # ARABIC LETTER NOON WITH RING -06BD ; [.2320.0020.0002] # ARABIC LETTER NOON WITH THREE DOTS ABOVE -06B9 ; [.2321.0020.0002] # ARABIC LETTER NOON WITH DOT BELOW -0767 ; [.2322.0020.0002] # ARABIC LETTER NOON WITH TWO DOTS BELOW -0768 ; [.2323.0020.0002] # ARABIC LETTER NOON WITH SMALL TAH -0769 ; [.2324.0020.0002] # ARABIC LETTER NOON WITH SMALL V -0647 ; [.2325.0020.0002] # ARABIC LETTER HEH -1EE24 ; [.2325.0020.0005] # ARABIC MATHEMATICAL INITIAL HEH -1EE64 ; [.2325.0020.0005] # ARABIC MATHEMATICAL STRETCHED HEH -1EE84 ; [.2325.0020.0005] # ARABIC MATHEMATICAL LOOPED HEH -FEEB ; [.2325.0020.0017] # ARABIC LETTER HEH INITIAL FORM -FEEC ; [.2325.0020.0018] # ARABIC LETTER HEH MEDIAL FORM -FEEA ; [.2325.0020.0019] # ARABIC LETTER HEH FINAL FORM -FEE9 ; [.2325.0020.001A] # ARABIC LETTER HEH ISOLATED FORM -FCD9 ; [.2325.0020.0017][.0000.0098.0017] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM -FCD7 ; [.2325.0020.0017][.229D.0020.0017] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM -FC51 ; [.2325.0020.001A][.229D.0020.001A] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM -FCD8 ; [.2325.0020.0017][.2318.0020.0017] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM -FC52 ; [.2325.0020.001A][.2318.0020.001A] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM -FD93 ; [.2325.0020.0017][.2318.0020.0017][.229D.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM -FD94 ; [.2325.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM -FC53 ; [.2325.0020.001A][.2339.0020.001A] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM -FC54 ; [.2325.0020.001A][.233A.0020.001A] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM -06BE ; [.2326.0020.0002] # ARABIC LETTER HEH DOACHASHMEE -FBAC ; [.2326.0020.0017] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM -FBAD ; [.2326.0020.0018] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM -FBAB ; [.2326.0020.0019] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM -FBAA ; [.2326.0020.001A] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM -06C1 ; [.2327.0020.0002] # ARABIC LETTER HEH GOAL -FBA8 ; [.2327.0020.0017] # ARABIC LETTER HEH GOAL INITIAL FORM -FBA9 ; [.2327.0020.0018] # ARABIC LETTER HEH GOAL MEDIAL FORM -FBA7 ; [.2327.0020.0019] # ARABIC LETTER HEH GOAL FINAL FORM -FBA6 ; [.2327.0020.001A] # ARABIC LETTER HEH GOAL ISOLATED FORM -06C2 ; [.2327.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE -06C3 ; [.2328.0020.0002] # ARABIC LETTER TEH MARBUTA GOAL -06FF ; [.2329.0020.0002] # ARABIC LETTER HEH WITH INVERTED V -06D5 ; [.232A.0020.0002] # ARABIC LETTER AE -06C0 ; [.232A.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH WITH YEH ABOVE -FBA5 ; [.232A.0020.0019][.0000.0083.0019] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM -FBA4 ; [.232A.0020.001A][.0000.0083.001A] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM -0648 ; [.232B.0020.0002] # ARABIC LETTER WAW -06E5 ; [.232B.0020.0004] # ARABIC SMALL WAW -1EE05 ; [.232B.0020.0005] # ARABIC MATHEMATICAL WAW -1EE85 ; [.232B.0020.0005] # ARABIC MATHEMATICAL LOOPED WAW -1EEA5 ; [.232B.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK WAW -FEEE ; [.232B.0020.0019] # ARABIC LETTER WAW FINAL FORM -FEED ; [.232B.0020.001A] # ARABIC LETTER WAW ISOLATED FORM -0676 ; [.232B.0020.0004][.2278.0020.0004] # ARABIC LETTER HIGH HAMZA WAW -FDF8 ; [.232B.0020.001A][.22D0.0020.001A][.2311.0020.001A][.2318.0020.001A] # ARABIC LIGATURE WASALLAM ISOLATED FORM -06C4 ; [.232C.0020.0002] # ARABIC LETTER WAW WITH RING -06C5 ; [.232D.0020.0002] # ARABIC LETTER KIRGHIZ OE -FBE1 ; [.232D.0020.0019] # ARABIC LETTER KIRGHIZ OE FINAL FORM -FBE0 ; [.232D.0020.001A] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM -06C6 ; [.232E.0020.0002] # ARABIC LETTER OE -FBDA ; [.232E.0020.0019] # ARABIC LETTER OE FINAL FORM -FBD9 ; [.232E.0020.001A] # ARABIC LETTER OE ISOLATED FORM -06C7 ; [.232F.0020.0002] # ARABIC LETTER U -FBD8 ; [.232F.0020.0019] # ARABIC LETTER U FINAL FORM -FBD7 ; [.232F.0020.001A] # ARABIC LETTER U ISOLATED FORM -0677 ; [.232F.0020.0004][.2278.0020.0004] # ARABIC LETTER U WITH HAMZA ABOVE -FBDD ; [.232F.0020.001A][.2278.0020.001A] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM -06C8 ; [.2330.0020.0002] # ARABIC LETTER YU -FBDC ; [.2330.0020.0019] # ARABIC LETTER YU FINAL FORM -FBDB ; [.2330.0020.001A] # ARABIC LETTER YU ISOLATED FORM -06C9 ; [.2331.0020.0002] # ARABIC LETTER KIRGHIZ YU -FBE3 ; [.2331.0020.0019] # ARABIC LETTER KIRGHIZ YU FINAL FORM -FBE2 ; [.2331.0020.001A] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM -06CA ; [.2332.0020.0002] # ARABIC LETTER WAW WITH TWO DOTS ABOVE -06CB ; [.2333.0020.0002] # ARABIC LETTER VE -FBDF ; [.2333.0020.0019] # ARABIC LETTER VE FINAL FORM -FBDE ; [.2333.0020.001A] # ARABIC LETTER VE ISOLATED FORM -08B1 ; [.2334.0020.0002] # ARABIC LETTER STRAIGHT WAW -06CF ; [.2335.0020.0002] # ARABIC LETTER WAW WITH DOT ABOVE -0778 ; [.2336.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -0779 ; [.2337.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -08AB ; [.2338.0020.0002] # ARABIC LETTER WAW WITH DOT WITHIN -0649 ; [.2339.0020.0002] # ARABIC LETTER ALEF MAKSURA -FBE8 ; [.2339.0020.0017] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM -FBE9 ; [.2339.0020.0018] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM -FEF0 ; [.2339.0020.0019] # ARABIC LETTER ALEF MAKSURA FINAL FORM -FEEF ; [.2339.0020.001A] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM -FC90 ; [.2339.0020.0019][.0000.0098.0019] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM -FC5D ; [.2339.0020.001A][.0000.0098.001A] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM -064A ; [.233A.0020.0002] # ARABIC LETTER YEH -06E6 ; [.233A.0020.0004] # ARABIC SMALL YEH -1EE09 ; [.233A.0020.0005] # ARABIC MATHEMATICAL YEH -1EE29 ; [.233A.0020.0005] # ARABIC MATHEMATICAL INITIAL YEH -1EE49 ; [.233A.0020.0005] # ARABIC MATHEMATICAL TAILED YEH -1EE69 ; [.233A.0020.0005] # ARABIC MATHEMATICAL STRETCHED YEH -1EE89 ; [.233A.0020.0005] # ARABIC MATHEMATICAL LOOPED YEH -1EEA9 ; [.233A.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK YEH -FEF3 ; [.233A.0020.0017] # ARABIC LETTER YEH INITIAL FORM -FEF4 ; [.233A.0020.0018] # ARABIC LETTER YEH MEDIAL FORM -FEF2 ; [.233A.0020.0019] # ARABIC LETTER YEH FINAL FORM -FEF1 ; [.233A.0020.001A] # ARABIC LETTER YEH ISOLATED FORM -0678 ; [.233A.0020.0004][.2278.0020.0004] # ARABIC LETTER HIGH HAMZA YEH -FCDA ; [.233A.0020.0017][.229D.0020.0017] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM -FC55 ; [.233A.0020.001A][.229D.0020.001A] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM -FDAF ; [.233A.0020.0019][.229D.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM -FCDB ; [.233A.0020.0017][.22A4.0020.0017] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM -FC56 ; [.233A.0020.001A][.22A4.0020.001A] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM -FDAE ; [.233A.0020.0019][.22A4.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM -FCDC ; [.233A.0020.0017][.22A5.0020.0017] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM -FC57 ; [.233A.0020.001A][.22A5.0020.001A] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM -FC91 ; [.233A.0020.0019][.22BE.0020.0019] # ARABIC LIGATURE YEH WITH REH FINAL FORM -FC92 ; [.233A.0020.0019][.22BF.0020.0019] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM -FCDD ; [.233A.0020.0017][.2318.0020.0017] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM -FCF0 ; [.233A.0020.0018][.2318.0020.0018] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM -FC93 ; [.233A.0020.0019][.2318.0020.0019] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM -FC58 ; [.233A.0020.001A][.2318.0020.001A] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM -FD9D ; [.233A.0020.0017][.2318.0020.0017][.2318.0020.0017] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM -FD9C ; [.233A.0020.0019][.2318.0020.0019][.2318.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM -FDB0 ; [.233A.0020.0019][.2318.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM -FC94 ; [.233A.0020.0019][.231C.0020.0019] # ARABIC LIGATURE YEH WITH NOON FINAL FORM -FCDE ; [.233A.0020.0017][.2325.0020.0017] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM -FCF1 ; [.233A.0020.0018][.2325.0020.0018] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM -FC95 ; [.233A.0020.0019][.2339.0020.0019] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM -FC59 ; [.233A.0020.001A][.2339.0020.001A] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM -FC96 ; [.233A.0020.0019][.233A.0020.0019] # ARABIC LIGATURE YEH WITH YEH FINAL FORM -FC5A ; [.233A.0020.001A][.233A.0020.001A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM -06CC ; [.233B.0020.0002] # ARABIC LETTER FARSI YEH -FBFE ; [.233B.0020.0017] # ARABIC LETTER FARSI YEH INITIAL FORM -FBFF ; [.233B.0020.0018] # ARABIC LETTER FARSI YEH MEDIAL FORM -FBFD ; [.233B.0020.0019] # ARABIC LETTER FARSI YEH FINAL FORM -FBFC ; [.233B.0020.001A] # ARABIC LETTER FARSI YEH ISOLATED FORM -06CD ; [.233C.0020.0002] # ARABIC LETTER YEH WITH TAIL -06CE ; [.233D.0020.0002] # ARABIC LETTER YEH WITH SMALL V -06D0 ; [.233E.0020.0002] # ARABIC LETTER E -FBE6 ; [.233E.0020.0017] # ARABIC LETTER E INITIAL FORM -FBE7 ; [.233E.0020.0018] # ARABIC LETTER E MEDIAL FORM -FBE5 ; [.233E.0020.0019] # ARABIC LETTER E FINAL FORM -FBE4 ; [.233E.0020.001A] # ARABIC LETTER E ISOLATED FORM -06D1 ; [.233F.0020.0002] # ARABIC LETTER YEH WITH THREE DOTS BELOW -063D ; [.2340.0020.0002] # ARABIC LETTER FARSI YEH WITH INVERTED V -063E ; [.2341.0020.0002] # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE -063F ; [.2342.0020.0002] # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -0620 ; [.2343.0020.0002] # ARABIC LETTER KASHMIRI YEH -0775 ; [.2344.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -0776 ; [.2345.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -0777 ; [.2346.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW -06D2 ; [.2347.0020.0002] # ARABIC LETTER YEH BARREE -FBAF ; [.2347.0020.0019] # ARABIC LETTER YEH BARREE FINAL FORM -FBAE ; [.2347.0020.001A] # ARABIC LETTER YEH BARREE ISOLATED FORM -06D3 ; [.2347.0020.0002][.0000.0083.0002] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -FBB1 ; [.2347.0020.0019][.0000.0083.0019] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBB0 ; [.2347.0020.001A][.0000.0083.001A] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM -077A ; [.2348.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -077B ; [.2349.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -0710 ; [.234A.0020.0002] # SYRIAC LETTER ALAPH -0712 ; [.234B.0020.0002] # SYRIAC LETTER BETH -072D ; [.234B.0020.0004][.0000.010D.0004] # SYRIAC LETTER PERSIAN BHETH -0713 ; [.234C.0020.0002] # SYRIAC LETTER GAMAL -0714 ; [.234C.0020.0004][.0000.010C.0004] # SYRIAC LETTER GAMAL GARSHUNI -072E ; [.234C.0020.0004][.0000.010D.0004] # SYRIAC LETTER PERSIAN GHAMAL -0716 ; [.234D.0020.0002] # SYRIAC LETTER DOTLESS DALATH RISH -0715 ; [.234E.0020.0002] # SYRIAC LETTER DALATH -072F ; [.234E.0020.0004][.0000.010D.0004] # SYRIAC LETTER PERSIAN DHALATH -0717 ; [.234F.0020.0002] # SYRIAC LETTER HE -0718 ; [.2350.0020.0002] # SYRIAC LETTER WAW -0719 ; [.2351.0020.0002] # SYRIAC LETTER ZAIN -074D ; [.2352.0020.0002] # SYRIAC LETTER SOGDIAN ZHAIN -071A ; [.2353.0020.0002] # SYRIAC LETTER HETH -071B ; [.2354.0020.0002] # SYRIAC LETTER TETH -071C ; [.2354.0020.0004][.0000.010C.0004] # SYRIAC LETTER TETH GARSHUNI -071D ; [.2355.0020.0002] # SYRIAC LETTER YUDH -071E ; [.2356.0020.0002] # SYRIAC LETTER YUDH HE -071F ; [.2357.0020.0002] # SYRIAC LETTER KAPH -074E ; [.2358.0020.0002] # SYRIAC LETTER SOGDIAN KHAPH -0720 ; [.2359.0020.0002] # SYRIAC LETTER LAMADH -0721 ; [.235A.0020.0002] # SYRIAC LETTER MIM -0722 ; [.235B.0020.0002] # SYRIAC LETTER NUN -0723 ; [.235C.0020.0002] # SYRIAC LETTER SEMKATH -0724 ; [.235C.0020.0019] # SYRIAC LETTER FINAL SEMKATH -0725 ; [.235D.0020.0002] # SYRIAC LETTER E -0726 ; [.235E.0020.0002] # SYRIAC LETTER PE -0727 ; [.235E.0020.0004][.0000.010C.0004] # SYRIAC LETTER REVERSED PE -074F ; [.235F.0020.0002] # SYRIAC LETTER SOGDIAN FE -0728 ; [.2360.0020.0002] # SYRIAC LETTER SADHE -0729 ; [.2361.0020.0002] # SYRIAC LETTER QAPH -072A ; [.2362.0020.0002] # SYRIAC LETTER RISH -072B ; [.2363.0020.0002] # SYRIAC LETTER SHIN -072C ; [.2364.0020.0002] # SYRIAC LETTER TAW -0840 ; [.2365.0020.0002] # MANDAIC LETTER HALQA -0841 ; [.2366.0020.0002] # MANDAIC LETTER AB -0842 ; [.2367.0020.0002] # MANDAIC LETTER AG -0843 ; [.2368.0020.0002] # MANDAIC LETTER AD -0844 ; [.2369.0020.0002] # MANDAIC LETTER AH -0845 ; [.236A.0020.0002] # MANDAIC LETTER USHENNA -0846 ; [.236B.0020.0002] # MANDAIC LETTER AZ -0847 ; [.236C.0020.0002] # MANDAIC LETTER IT -0848 ; [.236D.0020.0002] # MANDAIC LETTER ATT -0849 ; [.236E.0020.0002] # MANDAIC LETTER AKSA -084A ; [.236F.0020.0002] # MANDAIC LETTER AK -084B ; [.2370.0020.0002] # MANDAIC LETTER AL -084C ; [.2371.0020.0002] # MANDAIC LETTER AM -084D ; [.2372.0020.0002] # MANDAIC LETTER AN -084E ; [.2373.0020.0002] # MANDAIC LETTER AS -084F ; [.2374.0020.0002] # MANDAIC LETTER IN -0850 ; [.2375.0020.0002] # MANDAIC LETTER AP -0851 ; [.2376.0020.0002] # MANDAIC LETTER ASZ -0852 ; [.2377.0020.0002] # MANDAIC LETTER AQ -0853 ; [.2378.0020.0002] # MANDAIC LETTER AR -0854 ; [.2379.0020.0002] # MANDAIC LETTER ASH -0855 ; [.237A.0020.0002] # MANDAIC LETTER AT -0856 ; [.237B.0020.0002] # MANDAIC LETTER DUSHENNA -0857 ; [.237C.0020.0002] # MANDAIC LETTER KAD -0858 ; [.237D.0020.0002] # MANDAIC LETTER AIN -0780 ; [.237E.0020.0002] # THAANA LETTER HAA -0799 ; [.237F.0020.0002] # THAANA LETTER HHAA -079A ; [.2380.0020.0002] # THAANA LETTER KHAA -0781 ; [.2381.0020.0002] # THAANA LETTER SHAVIYANI -0782 ; [.2382.0020.0002] # THAANA LETTER NOONU -0783 ; [.2383.0020.0002] # THAANA LETTER RAA -079C ; [.2384.0020.0002] # THAANA LETTER ZAA -0784 ; [.2385.0020.0002] # THAANA LETTER BAA -0785 ; [.2386.0020.0002] # THAANA LETTER LHAVIYANI -0786 ; [.2387.0020.0002] # THAANA LETTER KAAFU -0787 ; [.2388.0020.0002] # THAANA LETTER ALIFU -07A2 ; [.2389.0020.0002] # THAANA LETTER AINU -07A3 ; [.238A.0020.0002] # THAANA LETTER GHAINU -0788 ; [.238B.0020.0002] # THAANA LETTER VAAVU -07A5 ; [.238C.0020.0002] # THAANA LETTER WAAVU -0789 ; [.238D.0020.0002] # THAANA LETTER MEEMU -078A ; [.238E.0020.0002] # THAANA LETTER FAAFU -078B ; [.238F.0020.0002] # THAANA LETTER DHAALU -079B ; [.2390.0020.0002] # THAANA LETTER THAALU -078C ; [.2391.0020.0002] # THAANA LETTER THAA -0798 ; [.2392.0020.0002] # THAANA LETTER TTAA -07A0 ; [.2393.0020.0002] # THAANA LETTER TO -07A1 ; [.2394.0020.0002] # THAANA LETTER ZO -078D ; [.2395.0020.0002] # THAANA LETTER LAAMU -078E ; [.2396.0020.0002] # THAANA LETTER GAAFU -07A4 ; [.2397.0020.0002] # THAANA LETTER QAAFU -078F ; [.2398.0020.0002] # THAANA LETTER GNAVIYANI -0790 ; [.2399.0020.0002] # THAANA LETTER SEENU -079D ; [.239A.0020.0002] # THAANA LETTER SHEENU -079E ; [.239B.0020.0002] # THAANA LETTER SAADHU -079F ; [.239C.0020.0002] # THAANA LETTER DAADHU -0791 ; [.239D.0020.0002] # THAANA LETTER DAVIYANI -0792 ; [.239E.0020.0002] # THAANA LETTER ZAVIYANI -0793 ; [.239F.0020.0002] # THAANA LETTER TAVIYANI -0794 ; [.23A0.0020.0002] # THAANA LETTER YAA -0795 ; [.23A1.0020.0002] # THAANA LETTER PAVIYANI -0796 ; [.23A2.0020.0002] # THAANA LETTER JAVIYANI -0797 ; [.23A3.0020.0002] # THAANA LETTER CHAVIYANI -07B1 ; [.23A4.0020.0002] # THAANA LETTER NAA -07A6 ; [.23A5.0020.0002] # THAANA ABAFILI -07A7 ; [.23A6.0020.0002] # THAANA AABAAFILI -07A8 ; [.23A7.0020.0002] # THAANA IBIFILI -07A9 ; [.23A8.0020.0002] # THAANA EEBEEFILI -07AA ; [.23A9.0020.0002] # THAANA UBUFILI -07AB ; [.23AA.0020.0002] # THAANA OOBOOFILI -07AC ; [.23AB.0020.0002] # THAANA EBEFILI -07AD ; [.23AC.0020.0002] # THAANA EYBEYFILI -07AE ; [.23AD.0020.0002] # THAANA OBOFILI -07AF ; [.23AE.0020.0002] # THAANA OABOAFILI -07B0 ; [.23AF.0020.0002] # THAANA SUKUN -07CA ; [.23B0.0020.0002] # NKO LETTER A -07CB ; [.23B1.0020.0002] # NKO LETTER EE -07CC ; [.23B2.0020.0002] # NKO LETTER I -07CD ; [.23B3.0020.0002] # NKO LETTER E -07CE ; [.23B4.0020.0002] # NKO LETTER U -07CF ; [.23B5.0020.0002] # NKO LETTER OO -07D0 ; [.23B6.0020.0002] # NKO LETTER O -07D1 ; [.23B7.0020.0002] # NKO LETTER DAGBASINNA -07D2 ; [.23B8.0020.0002] # NKO LETTER N -07D3 ; [.23B9.0020.0002] # NKO LETTER BA -07D4 ; [.23BA.0020.0002] # NKO LETTER PA -07D5 ; [.23BB.0020.0002] # NKO LETTER TA -07D6 ; [.23BC.0020.0002] # NKO LETTER JA -07E8 ; [.23BC.0020.0004][.0000.010B.0004] # NKO LETTER JONA JA -07D7 ; [.23BD.0020.0002] # NKO LETTER CHA -07E9 ; [.23BD.0020.0004][.0000.010B.0004] # NKO LETTER JONA CHA -07D8 ; [.23BE.0020.0002] # NKO LETTER DA -07D9 ; [.23BF.0020.0002] # NKO LETTER RA -07EA ; [.23BF.0020.0004][.0000.010B.0004] # NKO LETTER JONA RA -07DA ; [.23C0.0020.0002] # NKO LETTER RRA -07DB ; [.23C1.0020.0002] # NKO LETTER SA -07DC ; [.23C2.0020.0002] # NKO LETTER GBA -07DD ; [.23C3.0020.0002] # NKO LETTER FA -07DE ; [.23C4.0020.0002] # NKO LETTER KA -07DF ; [.23C5.0020.0002] # NKO LETTER LA -07E0 ; [.23C6.0020.0002] # NKO LETTER NA WOLOSO -07E1 ; [.23C7.0020.0002] # NKO LETTER MA -07E2 ; [.23C8.0020.0002] # NKO LETTER NYA -07E3 ; [.23C9.0020.0002] # NKO LETTER NA -07E4 ; [.23CA.0020.0002] # NKO LETTER HA -07E5 ; [.23CB.0020.0002] # NKO LETTER WA -07E6 ; [.23CC.0020.0002] # NKO LETTER YA -07E7 ; [.23CD.0020.0002] # NKO LETTER NYA WOLOSO -07F4 ; [.23CE.0020.0002] # NKO HIGH TONE APOSTROPHE -07F5 ; [.23CF.0020.0002] # NKO LOW TONE APOSTROPHE -2D30 ; [.23D0.0020.0002] # TIFINAGH LETTER YA -2D31 ; [.23D1.0020.0002] # TIFINAGH LETTER YAB -2D32 ; [.23D2.0020.0002] # TIFINAGH LETTER YABH -2D33 ; [.23D3.0020.0002] # TIFINAGH LETTER YAG -2D34 ; [.23D4.0020.0002] # TIFINAGH LETTER YAGHH -2D35 ; [.23D5.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAJ -2D36 ; [.23D6.0020.0002] # TIFINAGH LETTER YAJ -2D37 ; [.23D7.0020.0002] # TIFINAGH LETTER YAD -2D38 ; [.23D8.0020.0002] # TIFINAGH LETTER YADH -2D39 ; [.23D9.0020.0002] # TIFINAGH LETTER YADD -2D3A ; [.23DA.0020.0002] # TIFINAGH LETTER YADDH -2D3B ; [.23DB.0020.0002] # TIFINAGH LETTER YEY -2D66 ; [.23DC.0020.0002] # TIFINAGH LETTER YE -2D3C ; [.23DD.0020.0002] # TIFINAGH LETTER YAF -2D3D ; [.23DE.0020.0002] # TIFINAGH LETTER YAK -2D3E ; [.23DF.0020.0002] # TIFINAGH LETTER TUAREG YAK -2D3F ; [.23E0.0020.0002] # TIFINAGH LETTER YAKHH -2D40 ; [.23E1.0020.0002] # TIFINAGH LETTER YAH -2D41 ; [.23E2.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAH -2D42 ; [.23E3.0020.0002] # TIFINAGH LETTER TUAREG YAH -2D43 ; [.23E4.0020.0002] # TIFINAGH LETTER YAHH -2D44 ; [.23E5.0020.0002] # TIFINAGH LETTER YAA -2D45 ; [.23E6.0020.0002] # TIFINAGH LETTER YAKH -2D46 ; [.23E7.0020.0002] # TIFINAGH LETTER TUAREG YAKH -2D47 ; [.23E8.0020.0002] # TIFINAGH LETTER YAQ -2D48 ; [.23E9.0020.0002] # TIFINAGH LETTER TUAREG YAQ -2D49 ; [.23EA.0020.0002] # TIFINAGH LETTER YI -2D4A ; [.23EB.0020.0002] # TIFINAGH LETTER YAZH -2D4B ; [.23EC.0020.0002] # TIFINAGH LETTER AHAGGAR YAZH -2D4C ; [.23ED.0020.0002] # TIFINAGH LETTER TUAREG YAZH -2D4D ; [.23EE.0020.0002] # TIFINAGH LETTER YAL -2D4E ; [.23EF.0020.0002] # TIFINAGH LETTER YAM -2D4F ; [.23F0.0020.0002] # TIFINAGH LETTER YAN -2D50 ; [.23F1.0020.0002] # TIFINAGH LETTER TUAREG YAGN -2D51 ; [.23F2.0020.0002] # TIFINAGH LETTER TUAREG YANG -2D52 ; [.23F3.0020.0002] # TIFINAGH LETTER YAP -2D53 ; [.23F4.0020.0002] # TIFINAGH LETTER YU -2D67 ; [.23F5.0020.0002] # TIFINAGH LETTER YO -2D54 ; [.23F6.0020.0002] # TIFINAGH LETTER YAR -2D55 ; [.23F7.0020.0002] # TIFINAGH LETTER YARR -2D56 ; [.23F8.0020.0002] # TIFINAGH LETTER YAGH -2D57 ; [.23F9.0020.0002] # TIFINAGH LETTER TUAREG YAGH -2D58 ; [.23FA.0020.0002] # TIFINAGH LETTER AYER YAGH -2D59 ; [.23FB.0020.0002] # TIFINAGH LETTER YAS -2D5A ; [.23FC.0020.0002] # TIFINAGH LETTER YASS -2D5B ; [.23FD.0020.0002] # TIFINAGH LETTER YASH -2D5C ; [.23FE.0020.0002] # TIFINAGH LETTER YAT -2D5D ; [.23FF.0020.0002] # TIFINAGH LETTER YATH -2D5E ; [.2400.0020.0002] # TIFINAGH LETTER YACH -2D5F ; [.2401.0020.0002] # TIFINAGH LETTER YATT -2D60 ; [.2402.0020.0002] # TIFINAGH LETTER YAV -2D61 ; [.2403.0020.0002] # TIFINAGH LETTER YAW -2D62 ; [.2404.0020.0002] # TIFINAGH LETTER YAY -2D63 ; [.2405.0020.0002] # TIFINAGH LETTER YAZ -2D64 ; [.2406.0020.0002] # TIFINAGH LETTER TAWELLEMET YAZ -2D65 ; [.2407.0020.0002] # TIFINAGH LETTER YAZZ -2D6F ; [.2408.0020.0002] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK -1200 ; [.2409.0020.0002] # ETHIOPIC SYLLABLE HA -1201 ; [.240A.0020.0002] # ETHIOPIC SYLLABLE HU -1202 ; [.240B.0020.0002] # ETHIOPIC SYLLABLE HI -1203 ; [.240C.0020.0002] # ETHIOPIC SYLLABLE HAA -1204 ; [.240D.0020.0002] # ETHIOPIC SYLLABLE HEE -1205 ; [.240E.0020.0002] # ETHIOPIC SYLLABLE HE -1206 ; [.240F.0020.0002] # ETHIOPIC SYLLABLE HO -1207 ; [.2410.0020.0002] # ETHIOPIC SYLLABLE HOA -1208 ; [.2411.0020.0002] # ETHIOPIC SYLLABLE LA -1209 ; [.2412.0020.0002] # ETHIOPIC SYLLABLE LU -120A ; [.2413.0020.0002] # ETHIOPIC SYLLABLE LI -120B ; [.2414.0020.0002] # ETHIOPIC SYLLABLE LAA -120C ; [.2415.0020.0002] # ETHIOPIC SYLLABLE LEE -120D ; [.2416.0020.0002] # ETHIOPIC SYLLABLE LE -120E ; [.2417.0020.0002] # ETHIOPIC SYLLABLE LO -120F ; [.2418.0020.0002] # ETHIOPIC SYLLABLE LWA -2D80 ; [.2419.0020.0002] # ETHIOPIC SYLLABLE LOA -1210 ; [.241A.0020.0002] # ETHIOPIC SYLLABLE HHA -1211 ; [.241B.0020.0002] # ETHIOPIC SYLLABLE HHU -1212 ; [.241C.0020.0002] # ETHIOPIC SYLLABLE HHI -1213 ; [.241D.0020.0002] # ETHIOPIC SYLLABLE HHAA -1214 ; [.241E.0020.0002] # ETHIOPIC SYLLABLE HHEE -1215 ; [.241F.0020.0002] # ETHIOPIC SYLLABLE HHE -1216 ; [.2420.0020.0002] # ETHIOPIC SYLLABLE HHO -1217 ; [.2421.0020.0002] # ETHIOPIC SYLLABLE HHWA -1218 ; [.2422.0020.0002] # ETHIOPIC SYLLABLE MA -1219 ; [.2423.0020.0002] # ETHIOPIC SYLLABLE MU -121A ; [.2424.0020.0002] # ETHIOPIC SYLLABLE MI -121B ; [.2425.0020.0002] # ETHIOPIC SYLLABLE MAA -121C ; [.2426.0020.0002] # ETHIOPIC SYLLABLE MEE -121D ; [.2427.0020.0002] # ETHIOPIC SYLLABLE ME -121E ; [.2428.0020.0002] # ETHIOPIC SYLLABLE MO -121F ; [.2429.0020.0002] # ETHIOPIC SYLLABLE MWA -1380 ; [.242A.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT MWA -1381 ; [.242B.0020.0002] # ETHIOPIC SYLLABLE MWI -1382 ; [.242C.0020.0002] # ETHIOPIC SYLLABLE MWEE -1383 ; [.242D.0020.0002] # ETHIOPIC SYLLABLE MWE -2D81 ; [.242E.0020.0002] # ETHIOPIC SYLLABLE MOA -1220 ; [.242F.0020.0002] # ETHIOPIC SYLLABLE SZA -1221 ; [.2430.0020.0002] # ETHIOPIC SYLLABLE SZU -1222 ; [.2431.0020.0002] # ETHIOPIC SYLLABLE SZI -1223 ; [.2432.0020.0002] # ETHIOPIC SYLLABLE SZAA -1224 ; [.2433.0020.0002] # ETHIOPIC SYLLABLE SZEE -1225 ; [.2434.0020.0002] # ETHIOPIC SYLLABLE SZE -1226 ; [.2435.0020.0002] # ETHIOPIC SYLLABLE SZO -1227 ; [.2436.0020.0002] # ETHIOPIC SYLLABLE SZWA -1228 ; [.2437.0020.0002] # ETHIOPIC SYLLABLE RA -1229 ; [.2438.0020.0002] # ETHIOPIC SYLLABLE RU -122A ; [.2439.0020.0002] # ETHIOPIC SYLLABLE RI -122B ; [.243A.0020.0002] # ETHIOPIC SYLLABLE RAA -122C ; [.243B.0020.0002] # ETHIOPIC SYLLABLE REE -122D ; [.243C.0020.0002] # ETHIOPIC SYLLABLE RE -122E ; [.243D.0020.0002] # ETHIOPIC SYLLABLE RO -122F ; [.243E.0020.0002] # ETHIOPIC SYLLABLE RWA -2D82 ; [.243F.0020.0002] # ETHIOPIC SYLLABLE ROA -1230 ; [.2440.0020.0002] # ETHIOPIC SYLLABLE SA -1231 ; [.2441.0020.0002] # ETHIOPIC SYLLABLE SU -1232 ; [.2442.0020.0002] # ETHIOPIC SYLLABLE SI -1233 ; [.2443.0020.0002] # ETHIOPIC SYLLABLE SAA -1234 ; [.2444.0020.0002] # ETHIOPIC SYLLABLE SEE -1235 ; [.2445.0020.0002] # ETHIOPIC SYLLABLE SE -1236 ; [.2446.0020.0002] # ETHIOPIC SYLLABLE SO -1237 ; [.2447.0020.0002] # ETHIOPIC SYLLABLE SWA -2D83 ; [.2448.0020.0002] # ETHIOPIC SYLLABLE SOA -AB01 ; [.2449.0020.0002] # ETHIOPIC SYLLABLE TTHU -AB02 ; [.244A.0020.0002] # ETHIOPIC SYLLABLE TTHI -AB03 ; [.244B.0020.0002] # ETHIOPIC SYLLABLE TTHAA -AB04 ; [.244C.0020.0002] # ETHIOPIC SYLLABLE TTHEE -AB05 ; [.244D.0020.0002] # ETHIOPIC SYLLABLE TTHE -AB06 ; [.244E.0020.0002] # ETHIOPIC SYLLABLE TTHO -1238 ; [.244F.0020.0002] # ETHIOPIC SYLLABLE SHA -1239 ; [.2450.0020.0002] # ETHIOPIC SYLLABLE SHU -123A ; [.2451.0020.0002] # ETHIOPIC SYLLABLE SHI -123B ; [.2452.0020.0002] # ETHIOPIC SYLLABLE SHAA -123C ; [.2453.0020.0002] # ETHIOPIC SYLLABLE SHEE -123D ; [.2454.0020.0002] # ETHIOPIC SYLLABLE SHE -123E ; [.2455.0020.0002] # ETHIOPIC SYLLABLE SHO -123F ; [.2456.0020.0002] # ETHIOPIC SYLLABLE SHWA -2D84 ; [.2457.0020.0002] # ETHIOPIC SYLLABLE SHOA -1240 ; [.2458.0020.0002] # ETHIOPIC SYLLABLE QA -1241 ; [.2459.0020.0002] # ETHIOPIC SYLLABLE QU -1242 ; [.245A.0020.0002] # ETHIOPIC SYLLABLE QI -1243 ; [.245B.0020.0002] # ETHIOPIC SYLLABLE QAA -1244 ; [.245C.0020.0002] # ETHIOPIC SYLLABLE QEE -1245 ; [.245D.0020.0002] # ETHIOPIC SYLLABLE QE -1246 ; [.245E.0020.0002] # ETHIOPIC SYLLABLE QO -1247 ; [.245F.0020.0002] # ETHIOPIC SYLLABLE QOA -1248 ; [.2460.0020.0002] # ETHIOPIC SYLLABLE QWA -124A ; [.2461.0020.0002] # ETHIOPIC SYLLABLE QWI -124B ; [.2462.0020.0002] # ETHIOPIC SYLLABLE QWAA -124C ; [.2463.0020.0002] # ETHIOPIC SYLLABLE QWEE -124D ; [.2464.0020.0002] # ETHIOPIC SYLLABLE QWE -1250 ; [.2465.0020.0002] # ETHIOPIC SYLLABLE QHA -1251 ; [.2466.0020.0002] # ETHIOPIC SYLLABLE QHU -1252 ; [.2467.0020.0002] # ETHIOPIC SYLLABLE QHI -1253 ; [.2468.0020.0002] # ETHIOPIC SYLLABLE QHAA -1254 ; [.2469.0020.0002] # ETHIOPIC SYLLABLE QHEE -1255 ; [.246A.0020.0002] # ETHIOPIC SYLLABLE QHE -1256 ; [.246B.0020.0002] # ETHIOPIC SYLLABLE QHO -1258 ; [.246C.0020.0002] # ETHIOPIC SYLLABLE QHWA -125A ; [.246D.0020.0002] # ETHIOPIC SYLLABLE QHWI -125B ; [.246E.0020.0002] # ETHIOPIC SYLLABLE QHWAA -125C ; [.246F.0020.0002] # ETHIOPIC SYLLABLE QHWEE -125D ; [.2470.0020.0002] # ETHIOPIC SYLLABLE QHWE -1260 ; [.2471.0020.0002] # ETHIOPIC SYLLABLE BA -1261 ; [.2472.0020.0002] # ETHIOPIC SYLLABLE BU -1262 ; [.2473.0020.0002] # ETHIOPIC SYLLABLE BI -1263 ; [.2474.0020.0002] # ETHIOPIC SYLLABLE BAA -1264 ; [.2475.0020.0002] # ETHIOPIC SYLLABLE BEE -1265 ; [.2476.0020.0002] # ETHIOPIC SYLLABLE BE -1266 ; [.2477.0020.0002] # ETHIOPIC SYLLABLE BO -1267 ; [.2478.0020.0002] # ETHIOPIC SYLLABLE BWA -1384 ; [.2479.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT BWA -1385 ; [.247A.0020.0002] # ETHIOPIC SYLLABLE BWI -1386 ; [.247B.0020.0002] # ETHIOPIC SYLLABLE BWEE -1387 ; [.247C.0020.0002] # ETHIOPIC SYLLABLE BWE -2D85 ; [.247D.0020.0002] # ETHIOPIC SYLLABLE BOA -1268 ; [.247E.0020.0002] # ETHIOPIC SYLLABLE VA -1269 ; [.247F.0020.0002] # ETHIOPIC SYLLABLE VU -126A ; [.2480.0020.0002] # ETHIOPIC SYLLABLE VI -126B ; [.2481.0020.0002] # ETHIOPIC SYLLABLE VAA -126C ; [.2482.0020.0002] # ETHIOPIC SYLLABLE VEE -126D ; [.2483.0020.0002] # ETHIOPIC SYLLABLE VE -126E ; [.2484.0020.0002] # ETHIOPIC SYLLABLE VO -126F ; [.2485.0020.0002] # ETHIOPIC SYLLABLE VWA -1270 ; [.2486.0020.0002] # ETHIOPIC SYLLABLE TA -1271 ; [.2487.0020.0002] # ETHIOPIC SYLLABLE TU -1272 ; [.2488.0020.0002] # ETHIOPIC SYLLABLE TI -1273 ; [.2489.0020.0002] # ETHIOPIC SYLLABLE TAA -1274 ; [.248A.0020.0002] # ETHIOPIC SYLLABLE TEE -1275 ; [.248B.0020.0002] # ETHIOPIC SYLLABLE TE -1276 ; [.248C.0020.0002] # ETHIOPIC SYLLABLE TO -1277 ; [.248D.0020.0002] # ETHIOPIC SYLLABLE TWA -2D86 ; [.248E.0020.0002] # ETHIOPIC SYLLABLE TOA -1278 ; [.248F.0020.0002] # ETHIOPIC SYLLABLE CA -1279 ; [.2490.0020.0002] # ETHIOPIC SYLLABLE CU -127A ; [.2491.0020.0002] # ETHIOPIC SYLLABLE CI -127B ; [.2492.0020.0002] # ETHIOPIC SYLLABLE CAA -127C ; [.2493.0020.0002] # ETHIOPIC SYLLABLE CEE -127D ; [.2494.0020.0002] # ETHIOPIC SYLLABLE CE -127E ; [.2495.0020.0002] # ETHIOPIC SYLLABLE CO -127F ; [.2496.0020.0002] # ETHIOPIC SYLLABLE CWA -2D87 ; [.2497.0020.0002] # ETHIOPIC SYLLABLE COA -1280 ; [.2498.0020.0002] # ETHIOPIC SYLLABLE XA -1281 ; [.2499.0020.0002] # ETHIOPIC SYLLABLE XU -1282 ; [.249A.0020.0002] # ETHIOPIC SYLLABLE XI -1283 ; [.249B.0020.0002] # ETHIOPIC SYLLABLE XAA -1284 ; [.249C.0020.0002] # ETHIOPIC SYLLABLE XEE -1285 ; [.249D.0020.0002] # ETHIOPIC SYLLABLE XE -1286 ; [.249E.0020.0002] # ETHIOPIC SYLLABLE XO -1287 ; [.249F.0020.0002] # ETHIOPIC SYLLABLE XOA -1288 ; [.24A0.0020.0002] # ETHIOPIC SYLLABLE XWA -128A ; [.24A1.0020.0002] # ETHIOPIC SYLLABLE XWI -128B ; [.24A2.0020.0002] # ETHIOPIC SYLLABLE XWAA -128C ; [.24A3.0020.0002] # ETHIOPIC SYLLABLE XWEE -128D ; [.24A4.0020.0002] # ETHIOPIC SYLLABLE XWE -1290 ; [.24A5.0020.0002] # ETHIOPIC SYLLABLE NA -1291 ; [.24A6.0020.0002] # ETHIOPIC SYLLABLE NU -1292 ; [.24A7.0020.0002] # ETHIOPIC SYLLABLE NI -1293 ; [.24A8.0020.0002] # ETHIOPIC SYLLABLE NAA -1294 ; [.24A9.0020.0002] # ETHIOPIC SYLLABLE NEE -1295 ; [.24AA.0020.0002] # ETHIOPIC SYLLABLE NE -1296 ; [.24AB.0020.0002] # ETHIOPIC SYLLABLE NO -1297 ; [.24AC.0020.0002] # ETHIOPIC SYLLABLE NWA -2D88 ; [.24AD.0020.0002] # ETHIOPIC SYLLABLE NOA -1298 ; [.24AE.0020.0002] # ETHIOPIC SYLLABLE NYA -1299 ; [.24AF.0020.0002] # ETHIOPIC SYLLABLE NYU -129A ; [.24B0.0020.0002] # ETHIOPIC SYLLABLE NYI -129B ; [.24B1.0020.0002] # ETHIOPIC SYLLABLE NYAA -129C ; [.24B2.0020.0002] # ETHIOPIC SYLLABLE NYEE -129D ; [.24B3.0020.0002] # ETHIOPIC SYLLABLE NYE -129E ; [.24B4.0020.0002] # ETHIOPIC SYLLABLE NYO -129F ; [.24B5.0020.0002] # ETHIOPIC SYLLABLE NYWA -2D89 ; [.24B6.0020.0002] # ETHIOPIC SYLLABLE NYOA -12A0 ; [.24B7.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL A -12A1 ; [.24B8.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL U -12A2 ; [.24B9.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL I -12A3 ; [.24BA.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL AA -12A4 ; [.24BB.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL EE -12A5 ; [.24BC.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL E -12A6 ; [.24BD.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL O -12A7 ; [.24BE.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL WA -2D8A ; [.24BF.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL OA -12A8 ; [.24C0.0020.0002] # ETHIOPIC SYLLABLE KA -12A9 ; [.24C1.0020.0002] # ETHIOPIC SYLLABLE KU -12AA ; [.24C2.0020.0002] # ETHIOPIC SYLLABLE KI -12AB ; [.24C3.0020.0002] # ETHIOPIC SYLLABLE KAA -12AC ; [.24C4.0020.0002] # ETHIOPIC SYLLABLE KEE -12AD ; [.24C5.0020.0002] # ETHIOPIC SYLLABLE KE -12AE ; [.24C6.0020.0002] # ETHIOPIC SYLLABLE KO -12AF ; [.24C7.0020.0002] # ETHIOPIC SYLLABLE KOA -12B0 ; [.24C8.0020.0002] # ETHIOPIC SYLLABLE KWA -12B2 ; [.24C9.0020.0002] # ETHIOPIC SYLLABLE KWI -12B3 ; [.24CA.0020.0002] # ETHIOPIC SYLLABLE KWAA -12B4 ; [.24CB.0020.0002] # ETHIOPIC SYLLABLE KWEE -12B5 ; [.24CC.0020.0002] # ETHIOPIC SYLLABLE KWE -12B8 ; [.24CD.0020.0002] # ETHIOPIC SYLLABLE KXA -12B9 ; [.24CE.0020.0002] # ETHIOPIC SYLLABLE KXU -12BA ; [.24CF.0020.0002] # ETHIOPIC SYLLABLE KXI -12BB ; [.24D0.0020.0002] # ETHIOPIC SYLLABLE KXAA -12BC ; [.24D1.0020.0002] # ETHIOPIC SYLLABLE KXEE -12BD ; [.24D2.0020.0002] # ETHIOPIC SYLLABLE KXE -12BE ; [.24D3.0020.0002] # ETHIOPIC SYLLABLE KXO -12C0 ; [.24D4.0020.0002] # ETHIOPIC SYLLABLE KXWA -12C2 ; [.24D5.0020.0002] # ETHIOPIC SYLLABLE KXWI -12C3 ; [.24D6.0020.0002] # ETHIOPIC SYLLABLE KXWAA -12C4 ; [.24D7.0020.0002] # ETHIOPIC SYLLABLE KXWEE -12C5 ; [.24D8.0020.0002] # ETHIOPIC SYLLABLE KXWE -12C8 ; [.24D9.0020.0002] # ETHIOPIC SYLLABLE WA -12C9 ; [.24DA.0020.0002] # ETHIOPIC SYLLABLE WU -12CA ; [.24DB.0020.0002] # ETHIOPIC SYLLABLE WI -12CB ; [.24DC.0020.0002] # ETHIOPIC SYLLABLE WAA -12CC ; [.24DD.0020.0002] # ETHIOPIC SYLLABLE WEE -12CD ; [.24DE.0020.0002] # ETHIOPIC SYLLABLE WE -12CE ; [.24DF.0020.0002] # ETHIOPIC SYLLABLE WO -12CF ; [.24E0.0020.0002] # ETHIOPIC SYLLABLE WOA -12D0 ; [.24E1.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL A -12D1 ; [.24E2.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL U -12D2 ; [.24E3.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL I -12D3 ; [.24E4.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL AA -12D4 ; [.24E5.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL EE -12D5 ; [.24E6.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL E -12D6 ; [.24E7.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL O -12D8 ; [.24E8.0020.0002] # ETHIOPIC SYLLABLE ZA -12D9 ; [.24E9.0020.0002] # ETHIOPIC SYLLABLE ZU -12DA ; [.24EA.0020.0002] # ETHIOPIC SYLLABLE ZI -12DB ; [.24EB.0020.0002] # ETHIOPIC SYLLABLE ZAA -12DC ; [.24EC.0020.0002] # ETHIOPIC SYLLABLE ZEE -12DD ; [.24ED.0020.0002] # ETHIOPIC SYLLABLE ZE -12DE ; [.24EE.0020.0002] # ETHIOPIC SYLLABLE ZO -12DF ; [.24EF.0020.0002] # ETHIOPIC SYLLABLE ZWA -2D8B ; [.24F0.0020.0002] # ETHIOPIC SYLLABLE ZOA -AB11 ; [.24F1.0020.0002] # ETHIOPIC SYLLABLE DZU -AB12 ; [.24F2.0020.0002] # ETHIOPIC SYLLABLE DZI -AB13 ; [.24F3.0020.0002] # ETHIOPIC SYLLABLE DZAA -AB14 ; [.24F4.0020.0002] # ETHIOPIC SYLLABLE DZEE -AB15 ; [.24F5.0020.0002] # ETHIOPIC SYLLABLE DZE -AB16 ; [.24F6.0020.0002] # ETHIOPIC SYLLABLE DZO -12E0 ; [.24F7.0020.0002] # ETHIOPIC SYLLABLE ZHA -12E1 ; [.24F8.0020.0002] # ETHIOPIC SYLLABLE ZHU -12E2 ; [.24F9.0020.0002] # ETHIOPIC SYLLABLE ZHI -12E3 ; [.24FA.0020.0002] # ETHIOPIC SYLLABLE ZHAA -12E4 ; [.24FB.0020.0002] # ETHIOPIC SYLLABLE ZHEE -12E5 ; [.24FC.0020.0002] # ETHIOPIC SYLLABLE ZHE -12E6 ; [.24FD.0020.0002] # ETHIOPIC SYLLABLE ZHO -12E7 ; [.24FE.0020.0002] # ETHIOPIC SYLLABLE ZHWA -12E8 ; [.24FF.0020.0002] # ETHIOPIC SYLLABLE YA -12E9 ; [.2500.0020.0002] # ETHIOPIC SYLLABLE YU -12EA ; [.2501.0020.0002] # ETHIOPIC SYLLABLE YI -12EB ; [.2502.0020.0002] # ETHIOPIC SYLLABLE YAA -12EC ; [.2503.0020.0002] # ETHIOPIC SYLLABLE YEE -12ED ; [.2504.0020.0002] # ETHIOPIC SYLLABLE YE -12EE ; [.2505.0020.0002] # ETHIOPIC SYLLABLE YO -12EF ; [.2506.0020.0002] # ETHIOPIC SYLLABLE YOA -12F0 ; [.2507.0020.0002] # ETHIOPIC SYLLABLE DA -12F1 ; [.2508.0020.0002] # ETHIOPIC SYLLABLE DU -12F2 ; [.2509.0020.0002] # ETHIOPIC SYLLABLE DI -12F3 ; [.250A.0020.0002] # ETHIOPIC SYLLABLE DAA -12F4 ; [.250B.0020.0002] # ETHIOPIC SYLLABLE DEE -12F5 ; [.250C.0020.0002] # ETHIOPIC SYLLABLE DE -12F6 ; [.250D.0020.0002] # ETHIOPIC SYLLABLE DO -12F7 ; [.250E.0020.0002] # ETHIOPIC SYLLABLE DWA -2D8C ; [.250F.0020.0002] # ETHIOPIC SYLLABLE DOA -AB09 ; [.2510.0020.0002] # ETHIOPIC SYLLABLE DDHU -AB0A ; [.2511.0020.0002] # ETHIOPIC SYLLABLE DDHI -AB0B ; [.2512.0020.0002] # ETHIOPIC SYLLABLE DDHAA -AB0C ; [.2513.0020.0002] # ETHIOPIC SYLLABLE DDHEE -AB0D ; [.2514.0020.0002] # ETHIOPIC SYLLABLE DDHE -AB0E ; [.2515.0020.0002] # ETHIOPIC SYLLABLE DDHO -12F8 ; [.2516.0020.0002] # ETHIOPIC SYLLABLE DDA -12F9 ; [.2517.0020.0002] # ETHIOPIC SYLLABLE DDU -12FA ; [.2518.0020.0002] # ETHIOPIC SYLLABLE DDI -12FB ; [.2519.0020.0002] # ETHIOPIC SYLLABLE DDAA -12FC ; [.251A.0020.0002] # ETHIOPIC SYLLABLE DDEE -12FD ; [.251B.0020.0002] # ETHIOPIC SYLLABLE DDE -12FE ; [.251C.0020.0002] # ETHIOPIC SYLLABLE DDO -12FF ; [.251D.0020.0002] # ETHIOPIC SYLLABLE DDWA -2D8D ; [.251E.0020.0002] # ETHIOPIC SYLLABLE DDOA -1300 ; [.251F.0020.0002] # ETHIOPIC SYLLABLE JA -1301 ; [.2520.0020.0002] # ETHIOPIC SYLLABLE JU -1302 ; [.2521.0020.0002] # ETHIOPIC SYLLABLE JI -1303 ; [.2522.0020.0002] # ETHIOPIC SYLLABLE JAA -1304 ; [.2523.0020.0002] # ETHIOPIC SYLLABLE JEE -1305 ; [.2524.0020.0002] # ETHIOPIC SYLLABLE JE -1306 ; [.2525.0020.0002] # ETHIOPIC SYLLABLE JO -1307 ; [.2526.0020.0002] # ETHIOPIC SYLLABLE JWA -2D8E ; [.2527.0020.0002] # ETHIOPIC SYLLABLE JOA -1308 ; [.2528.0020.0002] # ETHIOPIC SYLLABLE GA -1309 ; [.2529.0020.0002] # ETHIOPIC SYLLABLE GU -130A ; [.252A.0020.0002] # ETHIOPIC SYLLABLE GI -130B ; [.252B.0020.0002] # ETHIOPIC SYLLABLE GAA -130C ; [.252C.0020.0002] # ETHIOPIC SYLLABLE GEE -130D ; [.252D.0020.0002] # ETHIOPIC SYLLABLE GE -130E ; [.252E.0020.0002] # ETHIOPIC SYLLABLE GO -130F ; [.252F.0020.0002] # ETHIOPIC SYLLABLE GOA -1310 ; [.2530.0020.0002] # ETHIOPIC SYLLABLE GWA -1312 ; [.2531.0020.0002] # ETHIOPIC SYLLABLE GWI -1313 ; [.2532.0020.0002] # ETHIOPIC SYLLABLE GWAA -1314 ; [.2533.0020.0002] # ETHIOPIC SYLLABLE GWEE -1315 ; [.2534.0020.0002] # ETHIOPIC SYLLABLE GWE -1318 ; [.2535.0020.0002] # ETHIOPIC SYLLABLE GGA -1319 ; [.2536.0020.0002] # ETHIOPIC SYLLABLE GGU -131A ; [.2537.0020.0002] # ETHIOPIC SYLLABLE GGI -131B ; [.2538.0020.0002] # ETHIOPIC SYLLABLE GGAA -131C ; [.2539.0020.0002] # ETHIOPIC SYLLABLE GGEE -131D ; [.253A.0020.0002] # ETHIOPIC SYLLABLE GGE -131E ; [.253B.0020.0002] # ETHIOPIC SYLLABLE GGO -131F ; [.253C.0020.0002] # ETHIOPIC SYLLABLE GGWAA -2D93 ; [.253D.0020.0002] # ETHIOPIC SYLLABLE GGWA -2D94 ; [.253E.0020.0002] # ETHIOPIC SYLLABLE GGWI -2D95 ; [.253F.0020.0002] # ETHIOPIC SYLLABLE GGWEE -2D96 ; [.2540.0020.0002] # ETHIOPIC SYLLABLE GGWE -1320 ; [.2541.0020.0002] # ETHIOPIC SYLLABLE THA -1321 ; [.2542.0020.0002] # ETHIOPIC SYLLABLE THU -1322 ; [.2543.0020.0002] # ETHIOPIC SYLLABLE THI -1323 ; [.2544.0020.0002] # ETHIOPIC SYLLABLE THAA -1324 ; [.2545.0020.0002] # ETHIOPIC SYLLABLE THEE -1325 ; [.2546.0020.0002] # ETHIOPIC SYLLABLE THE -1326 ; [.2547.0020.0002] # ETHIOPIC SYLLABLE THO -1327 ; [.2548.0020.0002] # ETHIOPIC SYLLABLE THWA -2D8F ; [.2549.0020.0002] # ETHIOPIC SYLLABLE THOA -1328 ; [.254A.0020.0002] # ETHIOPIC SYLLABLE CHA -1329 ; [.254B.0020.0002] # ETHIOPIC SYLLABLE CHU -132A ; [.254C.0020.0002] # ETHIOPIC SYLLABLE CHI -132B ; [.254D.0020.0002] # ETHIOPIC SYLLABLE CHAA -132C ; [.254E.0020.0002] # ETHIOPIC SYLLABLE CHEE -132D ; [.254F.0020.0002] # ETHIOPIC SYLLABLE CHE -132E ; [.2550.0020.0002] # ETHIOPIC SYLLABLE CHO -132F ; [.2551.0020.0002] # ETHIOPIC SYLLABLE CHWA -2D90 ; [.2552.0020.0002] # ETHIOPIC SYLLABLE CHOA -AB20 ; [.2553.0020.0002] # ETHIOPIC SYLLABLE CCHHA -AB21 ; [.2554.0020.0002] # ETHIOPIC SYLLABLE CCHHU -AB22 ; [.2555.0020.0002] # ETHIOPIC SYLLABLE CCHHI -AB23 ; [.2556.0020.0002] # ETHIOPIC SYLLABLE CCHHAA -AB24 ; [.2557.0020.0002] # ETHIOPIC SYLLABLE CCHHEE -AB25 ; [.2558.0020.0002] # ETHIOPIC SYLLABLE CCHHE -AB26 ; [.2559.0020.0002] # ETHIOPIC SYLLABLE CCHHO -1330 ; [.255A.0020.0002] # ETHIOPIC SYLLABLE PHA -1331 ; [.255B.0020.0002] # ETHIOPIC SYLLABLE PHU -1332 ; [.255C.0020.0002] # ETHIOPIC SYLLABLE PHI -1333 ; [.255D.0020.0002] # ETHIOPIC SYLLABLE PHAA -1334 ; [.255E.0020.0002] # ETHIOPIC SYLLABLE PHEE -1335 ; [.255F.0020.0002] # ETHIOPIC SYLLABLE PHE -1336 ; [.2560.0020.0002] # ETHIOPIC SYLLABLE PHO -1337 ; [.2561.0020.0002] # ETHIOPIC SYLLABLE PHWA -2D91 ; [.2562.0020.0002] # ETHIOPIC SYLLABLE PHOA -1338 ; [.2563.0020.0002] # ETHIOPIC SYLLABLE TSA -1339 ; [.2564.0020.0002] # ETHIOPIC SYLLABLE TSU -133A ; [.2565.0020.0002] # ETHIOPIC SYLLABLE TSI -133B ; [.2566.0020.0002] # ETHIOPIC SYLLABLE TSAA -133C ; [.2567.0020.0002] # ETHIOPIC SYLLABLE TSEE -133D ; [.2568.0020.0002] # ETHIOPIC SYLLABLE TSE -133E ; [.2569.0020.0002] # ETHIOPIC SYLLABLE TSO -133F ; [.256A.0020.0002] # ETHIOPIC SYLLABLE TSWA -AB28 ; [.256B.0020.0002] # ETHIOPIC SYLLABLE BBA -AB29 ; [.256C.0020.0002] # ETHIOPIC SYLLABLE BBU -AB2A ; [.256D.0020.0002] # ETHIOPIC SYLLABLE BBI -AB2B ; [.256E.0020.0002] # ETHIOPIC SYLLABLE BBAA -AB2C ; [.256F.0020.0002] # ETHIOPIC SYLLABLE BBEE -AB2D ; [.2570.0020.0002] # ETHIOPIC SYLLABLE BBE -AB2E ; [.2571.0020.0002] # ETHIOPIC SYLLABLE BBO -1340 ; [.2572.0020.0002] # ETHIOPIC SYLLABLE TZA -1341 ; [.2573.0020.0002] # ETHIOPIC SYLLABLE TZU -1342 ; [.2574.0020.0002] # ETHIOPIC SYLLABLE TZI -1343 ; [.2575.0020.0002] # ETHIOPIC SYLLABLE TZAA -1344 ; [.2576.0020.0002] # ETHIOPIC SYLLABLE TZEE -1345 ; [.2577.0020.0002] # ETHIOPIC SYLLABLE TZE -1346 ; [.2578.0020.0002] # ETHIOPIC SYLLABLE TZO -1347 ; [.2579.0020.0002] # ETHIOPIC SYLLABLE TZOA -1348 ; [.257A.0020.0002] # ETHIOPIC SYLLABLE FA -1349 ; [.257B.0020.0002] # ETHIOPIC SYLLABLE FU -134A ; [.257C.0020.0002] # ETHIOPIC SYLLABLE FI -134B ; [.257D.0020.0002] # ETHIOPIC SYLLABLE FAA -134C ; [.257E.0020.0002] # ETHIOPIC SYLLABLE FEE -134D ; [.257F.0020.0002] # ETHIOPIC SYLLABLE FE -134E ; [.2580.0020.0002] # ETHIOPIC SYLLABLE FO -134F ; [.2581.0020.0002] # ETHIOPIC SYLLABLE FWA -1388 ; [.2582.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT FWA -1389 ; [.2583.0020.0002] # ETHIOPIC SYLLABLE FWI -138A ; [.2584.0020.0002] # ETHIOPIC SYLLABLE FWEE -138B ; [.2585.0020.0002] # ETHIOPIC SYLLABLE FWE -1350 ; [.2586.0020.0002] # ETHIOPIC SYLLABLE PA -1351 ; [.2587.0020.0002] # ETHIOPIC SYLLABLE PU -1352 ; [.2588.0020.0002] # ETHIOPIC SYLLABLE PI -1353 ; [.2589.0020.0002] # ETHIOPIC SYLLABLE PAA -1354 ; [.258A.0020.0002] # ETHIOPIC SYLLABLE PEE -1355 ; [.258B.0020.0002] # ETHIOPIC SYLLABLE PE -1356 ; [.258C.0020.0002] # ETHIOPIC SYLLABLE PO -1357 ; [.258D.0020.0002] # ETHIOPIC SYLLABLE PWA -138C ; [.258E.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT PWA -138D ; [.258F.0020.0002] # ETHIOPIC SYLLABLE PWI -138E ; [.2590.0020.0002] # ETHIOPIC SYLLABLE PWEE -138F ; [.2591.0020.0002] # ETHIOPIC SYLLABLE PWE -2D92 ; [.2592.0020.0002] # ETHIOPIC SYLLABLE POA -1358 ; [.2593.0020.0002] # ETHIOPIC SYLLABLE RYA -1359 ; [.2594.0020.0002] # ETHIOPIC SYLLABLE MYA -135A ; [.2595.0020.0002] # ETHIOPIC SYLLABLE FYA -2DA0 ; [.2596.0020.0002] # ETHIOPIC SYLLABLE SSA -2DA1 ; [.2597.0020.0002] # ETHIOPIC SYLLABLE SSU -2DA2 ; [.2598.0020.0002] # ETHIOPIC SYLLABLE SSI -2DA3 ; [.2599.0020.0002] # ETHIOPIC SYLLABLE SSAA -2DA4 ; [.259A.0020.0002] # ETHIOPIC SYLLABLE SSEE -2DA5 ; [.259B.0020.0002] # ETHIOPIC SYLLABLE SSE -2DA6 ; [.259C.0020.0002] # ETHIOPIC SYLLABLE SSO -2DA8 ; [.259D.0020.0002] # ETHIOPIC SYLLABLE CCA -2DA9 ; [.259E.0020.0002] # ETHIOPIC SYLLABLE CCU -2DAA ; [.259F.0020.0002] # ETHIOPIC SYLLABLE CCI -2DAB ; [.25A0.0020.0002] # ETHIOPIC SYLLABLE CCAA -2DAC ; [.25A1.0020.0002] # ETHIOPIC SYLLABLE CCEE -2DAD ; [.25A2.0020.0002] # ETHIOPIC SYLLABLE CCE -2DAE ; [.25A3.0020.0002] # ETHIOPIC SYLLABLE CCO -2DB0 ; [.25A4.0020.0002] # ETHIOPIC SYLLABLE ZZA -2DB1 ; [.25A5.0020.0002] # ETHIOPIC SYLLABLE ZZU -2DB2 ; [.25A6.0020.0002] # ETHIOPIC SYLLABLE ZZI -2DB3 ; [.25A7.0020.0002] # ETHIOPIC SYLLABLE ZZAA -2DB4 ; [.25A8.0020.0002] # ETHIOPIC SYLLABLE ZZEE -2DB5 ; [.25A9.0020.0002] # ETHIOPIC SYLLABLE ZZE -2DB6 ; [.25AA.0020.0002] # ETHIOPIC SYLLABLE ZZO -2DB8 ; [.25AB.0020.0002] # ETHIOPIC SYLLABLE CCHA -2DB9 ; [.25AC.0020.0002] # ETHIOPIC SYLLABLE CCHU -2DBA ; [.25AD.0020.0002] # ETHIOPIC SYLLABLE CCHI -2DBB ; [.25AE.0020.0002] # ETHIOPIC SYLLABLE CCHAA -2DBC ; [.25AF.0020.0002] # ETHIOPIC SYLLABLE CCHEE -2DBD ; [.25B0.0020.0002] # ETHIOPIC SYLLABLE CCHE -2DBE ; [.25B1.0020.0002] # ETHIOPIC SYLLABLE CCHO -2DC0 ; [.25B2.0020.0002] # ETHIOPIC SYLLABLE QYA -2DC1 ; [.25B3.0020.0002] # ETHIOPIC SYLLABLE QYU -2DC2 ; [.25B4.0020.0002] # ETHIOPIC SYLLABLE QYI -2DC3 ; [.25B5.0020.0002] # ETHIOPIC SYLLABLE QYAA -2DC4 ; [.25B6.0020.0002] # ETHIOPIC SYLLABLE QYEE -2DC5 ; [.25B7.0020.0002] # ETHIOPIC SYLLABLE QYE -2DC6 ; [.25B8.0020.0002] # ETHIOPIC SYLLABLE QYO -2DC8 ; [.25B9.0020.0002] # ETHIOPIC SYLLABLE KYA -2DC9 ; [.25BA.0020.0002] # ETHIOPIC SYLLABLE KYU -2DCA ; [.25BB.0020.0002] # ETHIOPIC SYLLABLE KYI -2DCB ; [.25BC.0020.0002] # ETHIOPIC SYLLABLE KYAA -2DCC ; [.25BD.0020.0002] # ETHIOPIC SYLLABLE KYEE -2DCD ; [.25BE.0020.0002] # ETHIOPIC SYLLABLE KYE -2DCE ; [.25BF.0020.0002] # ETHIOPIC SYLLABLE KYO -2DD0 ; [.25C0.0020.0002] # ETHIOPIC SYLLABLE XYA -2DD1 ; [.25C1.0020.0002] # ETHIOPIC SYLLABLE XYU -2DD2 ; [.25C2.0020.0002] # ETHIOPIC SYLLABLE XYI -2DD3 ; [.25C3.0020.0002] # ETHIOPIC SYLLABLE XYAA -2DD4 ; [.25C4.0020.0002] # ETHIOPIC SYLLABLE XYEE -2DD5 ; [.25C5.0020.0002] # ETHIOPIC SYLLABLE XYE -2DD6 ; [.25C6.0020.0002] # ETHIOPIC SYLLABLE XYO -2DD8 ; [.25C7.0020.0002] # ETHIOPIC SYLLABLE GYA -2DD9 ; [.25C8.0020.0002] # ETHIOPIC SYLLABLE GYU -2DDA ; [.25C9.0020.0002] # ETHIOPIC SYLLABLE GYI -2DDB ; [.25CA.0020.0002] # ETHIOPIC SYLLABLE GYAA -2DDC ; [.25CB.0020.0002] # ETHIOPIC SYLLABLE GYEE -2DDD ; [.25CC.0020.0002] # ETHIOPIC SYLLABLE GYE -2DDE ; [.25CD.0020.0002] # ETHIOPIC SYLLABLE GYO -0950 ; [.25CE.0020.0002] # DEVANAGARI OM -A8FD ; [.25CF.0020.0002] # DEVANAGARI JAIN OM -0972 ; [.25D0.0020.0002] # DEVANAGARI LETTER CANDRA A -0904 ; [.25D1.0020.0002] # DEVANAGARI LETTER SHORT A -0905 ; [.25D2.0020.0002] # DEVANAGARI LETTER A -0906 ; [.25D3.0020.0002] # DEVANAGARI LETTER AA -0973 ; [.25D4.0020.0002] # DEVANAGARI LETTER OE -0974 ; [.25D5.0020.0002] # DEVANAGARI LETTER OOE -0975 ; [.25D6.0020.0002] # DEVANAGARI LETTER AW -0976 ; [.25D7.0020.0002] # DEVANAGARI LETTER UE -0977 ; [.25D8.0020.0002] # DEVANAGARI LETTER UUE -0907 ; [.25D9.0020.0002] # DEVANAGARI LETTER I -0908 ; [.25DA.0020.0002] # DEVANAGARI LETTER II -0909 ; [.25DB.0020.0002] # DEVANAGARI LETTER U -090A ; [.25DC.0020.0002] # DEVANAGARI LETTER UU -090B ; [.25DD.0020.0002] # DEVANAGARI LETTER VOCALIC R -0960 ; [.25DE.0020.0002] # DEVANAGARI LETTER VOCALIC RR -090C ; [.25DF.0020.0002] # DEVANAGARI LETTER VOCALIC L -0961 ; [.25E0.0020.0002] # DEVANAGARI LETTER VOCALIC LL -090D ; [.25E1.0020.0002] # DEVANAGARI LETTER CANDRA E -090E ; [.25E2.0020.0002] # DEVANAGARI LETTER SHORT E -090F ; [.25E3.0020.0002] # DEVANAGARI LETTER E -0910 ; [.25E4.0020.0002] # DEVANAGARI LETTER AI -0911 ; [.25E5.0020.0002] # DEVANAGARI LETTER CANDRA O -0912 ; [.25E6.0020.0002] # DEVANAGARI LETTER SHORT O -0913 ; [.25E7.0020.0002] # DEVANAGARI LETTER O -0914 ; [.25E8.0020.0002] # DEVANAGARI LETTER AU -0915 ; [.25E9.0020.0002] # DEVANAGARI LETTER KA -0958 ; [.25E9.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER QA -0916 ; [.25EA.0020.0002] # DEVANAGARI LETTER KHA -0959 ; [.25EA.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER KHHA -0917 ; [.25EB.0020.0002] # DEVANAGARI LETTER GA -095A ; [.25EB.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER GHHA -097B ; [.25EC.0020.0002] # DEVANAGARI LETTER GGA -0918 ; [.25ED.0020.0002] # DEVANAGARI LETTER GHA -0919 ; [.25EE.0020.0002] # DEVANAGARI LETTER NGA -091A ; [.25EF.0020.0002] # DEVANAGARI LETTER CA -091B ; [.25F0.0020.0002] # DEVANAGARI LETTER CHA -091C ; [.25F1.0020.0002] # DEVANAGARI LETTER JA -095B ; [.25F1.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER ZA -0979 ; [.25F2.0020.0002] # DEVANAGARI LETTER ZHA -097C ; [.25F3.0020.0002] # DEVANAGARI LETTER JJA -091D ; [.25F4.0020.0002] # DEVANAGARI LETTER JHA -091E ; [.25F5.0020.0002] # DEVANAGARI LETTER NYA -091F ; [.25F6.0020.0002] # DEVANAGARI LETTER TTA -0920 ; [.25F7.0020.0002] # DEVANAGARI LETTER TTHA -0978 ; [.25F8.0020.0002] # DEVANAGARI LETTER MARWARI DDA -0921 ; [.25F9.0020.0002] # DEVANAGARI LETTER DDA -095C ; [.25F9.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER DDDHA -097E ; [.25FA.0020.0002] # DEVANAGARI LETTER DDDA -0922 ; [.25FB.0020.0002] # DEVANAGARI LETTER DDHA -095D ; [.25FB.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER RHA -0923 ; [.25FC.0020.0002] # DEVANAGARI LETTER NNA -0924 ; [.25FD.0020.0002] # DEVANAGARI LETTER TA -0925 ; [.25FE.0020.0002] # DEVANAGARI LETTER THA -0926 ; [.25FF.0020.0002] # DEVANAGARI LETTER DA -0927 ; [.2600.0020.0002] # DEVANAGARI LETTER DHA -0928 ; [.2601.0020.0002] # DEVANAGARI LETTER NA -0929 ; [.2601.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER NNNA -092A ; [.2602.0020.0002] # DEVANAGARI LETTER PA -092B ; [.2603.0020.0002] # DEVANAGARI LETTER PHA -095E ; [.2603.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER FA -092C ; [.2604.0020.0002] # DEVANAGARI LETTER BA -097F ; [.2605.0020.0002] # DEVANAGARI LETTER BBA -092D ; [.2606.0020.0002] # DEVANAGARI LETTER BHA -092E ; [.2607.0020.0002] # DEVANAGARI LETTER MA -092F ; [.2608.0020.0002] # DEVANAGARI LETTER YA -095F ; [.2608.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER YYA -097A ; [.2609.0020.0002] # DEVANAGARI LETTER HEAVY YA -0930 ; [.260A.0020.0002] # DEVANAGARI LETTER RA -0931 ; [.260A.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER RRA -0932 ; [.260B.0020.0002] # DEVANAGARI LETTER LA -0933 ; [.260C.0020.0002] # DEVANAGARI LETTER LLA -0934 ; [.260C.0020.0002][.0000.00BD.0002] # DEVANAGARI LETTER LLLA -0935 ; [.260D.0020.0002] # DEVANAGARI LETTER VA -0936 ; [.260E.0020.0002] # DEVANAGARI LETTER SHA -0937 ; [.260F.0020.0002] # DEVANAGARI LETTER SSA -0938 ; [.2610.0020.0002] # DEVANAGARI LETTER SA -0939 ; [.2611.0020.0002] # DEVANAGARI LETTER HA -093D ; [.2612.0020.0002] # DEVANAGARI SIGN AVAGRAHA -097D ; [.2613.0020.0002] # DEVANAGARI LETTER GLOTTAL STOP -1CE9 ; [.2614.0020.0002] # VEDIC SIGN ANUSVARA ANTARGOMUKHA -1CEA ; [.2614.0020.0004] # VEDIC SIGN ANUSVARA BAHIRGOMUKHA -1CEB ; [.2614.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA -1CEC ; [.2614.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL -1CEE ; [.2614.0020.0004] # VEDIC SIGN HEXIFORM LONG ANUSVARA -1CEF ; [.2614.0020.0004] # VEDIC SIGN LONG ANUSVARA -1CF0 ; [.2614.0020.0004] # VEDIC SIGN RTHANG LONG ANUSVARA -1CF1 ; [.2614.0020.0004] # VEDIC SIGN ANUSVARA UBHAYATO MUKHA -1CF5 ; [.2615.0020.0002] # VEDIC SIGN JIHVAMULIYA -1CF6 ; [.2616.0020.0002] # VEDIC SIGN UPADHMANIYA -A8F2 ; [.2617.0020.0002] # DEVANAGARI SIGN SPACING CANDRABINDU -A8F3 ; [.2617.0020.0004] # DEVANAGARI SIGN CANDRABINDU VIRAMA -A8F4 ; [.2617.0020.0004] # DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA -A8F5 ; [.2617.0020.0004] # DEVANAGARI SIGN CANDRABINDU TWO -A8F6 ; [.2617.0020.0004] # DEVANAGARI SIGN CANDRABINDU THREE -A8F7 ; [.2617.0020.0004] # DEVANAGARI SIGN CANDRABINDU AVAGRAHA -A8FB ; [.2618.0020.0002] # DEVANAGARI HEADSTROKE -093E ; [.2619.0020.0002] # DEVANAGARI VOWEL SIGN AA -093A ; [.261A.0020.0002] # DEVANAGARI VOWEL SIGN OE -093B ; [.261B.0020.0002] # DEVANAGARI VOWEL SIGN OOE -094F ; [.261C.0020.0002] # DEVANAGARI VOWEL SIGN AW -0956 ; [.261D.0020.0002] # DEVANAGARI VOWEL SIGN UE -0957 ; [.261E.0020.0002] # DEVANAGARI VOWEL SIGN UUE -093F ; [.261F.0020.0002] # DEVANAGARI VOWEL SIGN I -0940 ; [.2620.0020.0002] # DEVANAGARI VOWEL SIGN II -0941 ; [.2621.0020.0002] # DEVANAGARI VOWEL SIGN U -0942 ; [.2622.0020.0002] # DEVANAGARI VOWEL SIGN UU -0943 ; [.2623.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC R -0944 ; [.2624.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC RR -0962 ; [.2625.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC L -0963 ; [.2626.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC LL -0945 ; [.2627.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA E -0955 ; [.2628.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA LONG E -0946 ; [.2629.0020.0002] # DEVANAGARI VOWEL SIGN SHORT E -0947 ; [.262A.0020.0002] # DEVANAGARI VOWEL SIGN E -094E ; [.262B.0020.0002] # DEVANAGARI VOWEL SIGN PRISHTHAMATRA E -0948 ; [.262C.0020.0002] # DEVANAGARI VOWEL SIGN AI -0949 ; [.262D.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA O -094A ; [.262E.0020.0002] # DEVANAGARI VOWEL SIGN SHORT O -094B ; [.262F.0020.0002] # DEVANAGARI VOWEL SIGN O -094C ; [.2630.0020.0002] # DEVANAGARI VOWEL SIGN AU -094D ; [.2631.0020.0002] # DEVANAGARI SIGN VIRAMA -0980 ; [.2632.0020.0002] # BENGALI ANJI -0985 ; [.2633.0020.0002] # BENGALI LETTER A -0986 ; [.2634.0020.0002] # BENGALI LETTER AA -0987 ; [.2635.0020.0002] # BENGALI LETTER I -0988 ; [.2636.0020.0002] # BENGALI LETTER II -0989 ; [.2637.0020.0002] # BENGALI LETTER U -098A ; [.2638.0020.0002] # BENGALI LETTER UU -098B ; [.2639.0020.0002] # BENGALI LETTER VOCALIC R -09E0 ; [.263A.0020.0002] # BENGALI LETTER VOCALIC RR -098C ; [.263B.0020.0002] # BENGALI LETTER VOCALIC L -09E1 ; [.263C.0020.0002] # BENGALI LETTER VOCALIC LL -098F ; [.263D.0020.0002] # BENGALI LETTER E -0990 ; [.263E.0020.0002] # BENGALI LETTER AI -0993 ; [.263F.0020.0002] # BENGALI LETTER O -0994 ; [.2640.0020.0002] # BENGALI LETTER AU -0995 ; [.2641.0020.0002] # BENGALI LETTER KA -0996 ; [.2642.0020.0002] # BENGALI LETTER KHA -0997 ; [.2643.0020.0002] # BENGALI LETTER GA -0998 ; [.2644.0020.0002] # BENGALI LETTER GHA -0999 ; [.2645.0020.0002] # BENGALI LETTER NGA -099A ; [.2646.0020.0002] # BENGALI LETTER CA -099B ; [.2647.0020.0002] # BENGALI LETTER CHA -099C ; [.2648.0020.0002] # BENGALI LETTER JA -099D ; [.2649.0020.0002] # BENGALI LETTER JHA -099E ; [.264A.0020.0002] # BENGALI LETTER NYA -099F ; [.264B.0020.0002] # BENGALI LETTER TTA -09A0 ; [.264C.0020.0002] # BENGALI LETTER TTHA -09A1 ; [.264D.0020.0002] # BENGALI LETTER DDA -09DC ; [.264D.0020.0002][.0000.00BD.0002] # BENGALI LETTER RRA -09A2 ; [.264E.0020.0002] # BENGALI LETTER DDHA -09DD ; [.264E.0020.0002][.0000.00BD.0002] # BENGALI LETTER RHA -09A3 ; [.264F.0020.0002] # BENGALI LETTER NNA -09A4 ; [.2650.0020.0002] # BENGALI LETTER TA -09CE ; [.2650.0020.0004][.2671.0020.0004] # BENGALI LETTER KHANDA TA -09A5 ; [.2651.0020.0002] # BENGALI LETTER THA -09A6 ; [.2652.0020.0002] # BENGALI LETTER DA -09A7 ; [.2653.0020.0002] # BENGALI LETTER DHA -09A8 ; [.2654.0020.0002] # BENGALI LETTER NA -09AA ; [.2655.0020.0002] # BENGALI LETTER PA -09AB ; [.2656.0020.0002] # BENGALI LETTER PHA -09AC ; [.2657.0020.0002] # BENGALI LETTER BA -09AD ; [.2658.0020.0002] # BENGALI LETTER BHA -09AE ; [.2659.0020.0002] # BENGALI LETTER MA -09AF ; [.265A.0020.0002] # BENGALI LETTER YA -09DF ; [.265A.0020.0002][.0000.00BD.0002] # BENGALI LETTER YYA -09B0 ; [.265B.0020.0002] # BENGALI LETTER RA -09F0 ; [.265C.0020.0002] # BENGALI LETTER RA WITH MIDDLE DIAGONAL -09B2 ; [.265D.0020.0002] # BENGALI LETTER LA -09F1 ; [.265E.0020.0002] # BENGALI LETTER RA WITH LOWER DIAGONAL -09B6 ; [.265F.0020.0002] # BENGALI LETTER SHA -09B7 ; [.2660.0020.0002] # BENGALI LETTER SSA -09B8 ; [.2661.0020.0002] # BENGALI LETTER SA -09B9 ; [.2662.0020.0002] # BENGALI LETTER HA -09BD ; [.2663.0020.0002] # BENGALI SIGN AVAGRAHA -09BE ; [.2664.0020.0002] # BENGALI VOWEL SIGN AA -09BF ; [.2665.0020.0002] # BENGALI VOWEL SIGN I -09C0 ; [.2666.0020.0002] # BENGALI VOWEL SIGN II -09C1 ; [.2667.0020.0002] # BENGALI VOWEL SIGN U -09C2 ; [.2668.0020.0002] # BENGALI VOWEL SIGN UU -09C3 ; [.2669.0020.0002] # BENGALI VOWEL SIGN VOCALIC R -09C4 ; [.266A.0020.0002] # BENGALI VOWEL SIGN VOCALIC RR -09E2 ; [.266B.0020.0002] # BENGALI VOWEL SIGN VOCALIC L -09E3 ; [.266C.0020.0002] # BENGALI VOWEL SIGN VOCALIC LL -09C7 ; [.266D.0020.0002] # BENGALI VOWEL SIGN E -09C8 ; [.266E.0020.0002] # BENGALI VOWEL SIGN AI -09CB ; [.266F.0020.0002] # BENGALI VOWEL SIGN O -09C7 09BE ; [.266F.0020.0002] # BENGALI VOWEL SIGN O -09CC ; [.2670.0020.0002] # BENGALI VOWEL SIGN AU -09C7 09D7 ; [.2670.0020.0002] # BENGALI VOWEL SIGN AU -09CD ; [.2671.0020.0002] # BENGALI SIGN VIRAMA -09D7 ; [.2672.0020.0002] # BENGALI AU LENGTH MARK -0A74 ; [.2673.0020.0002] # GURMUKHI EK ONKAR -0A73 ; [.2674.0020.0002] # GURMUKHI URA -0A09 ; [.2675.0020.0002] # GURMUKHI LETTER U -0A0A ; [.2676.0020.0002] # GURMUKHI LETTER UU -0A13 ; [.2677.0020.0002] # GURMUKHI LETTER OO -0A05 ; [.2678.0020.0002] # GURMUKHI LETTER A -0A06 ; [.2679.0020.0002] # GURMUKHI LETTER AA -0A10 ; [.267A.0020.0002] # GURMUKHI LETTER AI -0A14 ; [.267B.0020.0002] # GURMUKHI LETTER AU -0A72 ; [.267C.0020.0002] # GURMUKHI IRI -0A07 ; [.267D.0020.0002] # GURMUKHI LETTER I -0A08 ; [.267E.0020.0002] # GURMUKHI LETTER II -0A0F ; [.267F.0020.0002] # GURMUKHI LETTER EE -0A38 ; [.2680.0020.0002] # GURMUKHI LETTER SA -0A36 ; [.2680.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER SHA -0A39 ; [.2681.0020.0002] # GURMUKHI LETTER HA -0A51 ; [.2682.0020.0002] # GURMUKHI SIGN UDAAT -0A15 ; [.2683.0020.0002] # GURMUKHI LETTER KA -0A16 ; [.2684.0020.0002] # GURMUKHI LETTER KHA -0A59 ; [.2684.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER KHHA -0A17 ; [.2685.0020.0002] # GURMUKHI LETTER GA -0A5A ; [.2685.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER GHHA -0A18 ; [.2686.0020.0002] # GURMUKHI LETTER GHA -0A19 ; [.2687.0020.0002] # GURMUKHI LETTER NGA -0A1A ; [.2688.0020.0002] # GURMUKHI LETTER CA -0A1B ; [.2689.0020.0002] # GURMUKHI LETTER CHA -0A1C ; [.268A.0020.0002] # GURMUKHI LETTER JA -0A5B ; [.268A.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER ZA -0A1D ; [.268B.0020.0002] # GURMUKHI LETTER JHA -0A1E ; [.268C.0020.0002] # GURMUKHI LETTER NYA -0A1F ; [.268D.0020.0002] # GURMUKHI LETTER TTA -0A20 ; [.268E.0020.0002] # GURMUKHI LETTER TTHA -0A21 ; [.268F.0020.0002] # GURMUKHI LETTER DDA -0A22 ; [.2690.0020.0002] # GURMUKHI LETTER DDHA -0A23 ; [.2691.0020.0002] # GURMUKHI LETTER NNA -0A24 ; [.2692.0020.0002] # GURMUKHI LETTER TA -0A25 ; [.2693.0020.0002] # GURMUKHI LETTER THA -0A26 ; [.2694.0020.0002] # GURMUKHI LETTER DA -0A27 ; [.2695.0020.0002] # GURMUKHI LETTER DHA -0A28 ; [.2696.0020.0002] # GURMUKHI LETTER NA -0A2A ; [.2697.0020.0002] # GURMUKHI LETTER PA -0A2B ; [.2698.0020.0002] # GURMUKHI LETTER PHA -0A5E ; [.2698.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER FA -0A2C ; [.2699.0020.0002] # GURMUKHI LETTER BA -0A2D ; [.269A.0020.0002] # GURMUKHI LETTER BHA -0A2E ; [.269B.0020.0002] # GURMUKHI LETTER MA -0A2F ; [.269C.0020.0002] # GURMUKHI LETTER YA -0A75 ; [.269D.0020.0002] # GURMUKHI SIGN YAKASH -0A30 ; [.269E.0020.0002] # GURMUKHI LETTER RA -0A32 ; [.269F.0020.0002] # GURMUKHI LETTER LA -0A33 ; [.269F.0020.0002][.0000.00BD.0002] # GURMUKHI LETTER LLA -0A35 ; [.26A0.0020.0002] # GURMUKHI LETTER VA -0A5C ; [.26A1.0020.0002] # GURMUKHI LETTER RRA -0A3E ; [.26A2.0020.0002] # GURMUKHI VOWEL SIGN AA -0A3F ; [.26A3.0020.0002] # GURMUKHI VOWEL SIGN I -0A40 ; [.26A4.0020.0002] # GURMUKHI VOWEL SIGN II -0A41 ; [.26A5.0020.0002] # GURMUKHI VOWEL SIGN U -0A42 ; [.26A6.0020.0002] # GURMUKHI VOWEL SIGN UU -0A47 ; [.26A7.0020.0002] # GURMUKHI VOWEL SIGN EE -0A48 ; [.26A8.0020.0002] # GURMUKHI VOWEL SIGN AI -0A4B ; [.26A9.0020.0002] # GURMUKHI VOWEL SIGN OO -0A4C ; [.26AA.0020.0002] # GURMUKHI VOWEL SIGN AU -0A4D ; [.26AB.0020.0002] # GURMUKHI SIGN VIRAMA -0AD0 ; [.26AC.0020.0002] # GUJARATI OM -0A85 ; [.26AD.0020.0002] # GUJARATI LETTER A -0A86 ; [.26AE.0020.0002] # GUJARATI LETTER AA -0A87 ; [.26AF.0020.0002] # GUJARATI LETTER I -0A88 ; [.26B0.0020.0002] # GUJARATI LETTER II -0A89 ; [.26B1.0020.0002] # GUJARATI LETTER U -0A8A ; [.26B2.0020.0002] # GUJARATI LETTER UU -0A8B ; [.26B3.0020.0002] # GUJARATI LETTER VOCALIC R -0AE0 ; [.26B4.0020.0002] # GUJARATI LETTER VOCALIC RR -0A8C ; [.26B5.0020.0002] # GUJARATI LETTER VOCALIC L -0AE1 ; [.26B6.0020.0002] # GUJARATI LETTER VOCALIC LL -0A8D ; [.26B7.0020.0002] # GUJARATI VOWEL CANDRA E -0A8F ; [.26B8.0020.0002] # GUJARATI LETTER E -0A90 ; [.26B9.0020.0002] # GUJARATI LETTER AI -0A91 ; [.26BA.0020.0002] # GUJARATI VOWEL CANDRA O -0A93 ; [.26BB.0020.0002] # GUJARATI LETTER O -0A94 ; [.26BC.0020.0002] # GUJARATI LETTER AU -0A95 ; [.26BD.0020.0002] # GUJARATI LETTER KA -0A96 ; [.26BE.0020.0002] # GUJARATI LETTER KHA -0A97 ; [.26BF.0020.0002] # GUJARATI LETTER GA -0A98 ; [.26C0.0020.0002] # GUJARATI LETTER GHA -0A99 ; [.26C1.0020.0002] # GUJARATI LETTER NGA -0A9A ; [.26C2.0020.0002] # GUJARATI LETTER CA -0A9B ; [.26C3.0020.0002] # GUJARATI LETTER CHA -0A9C ; [.26C4.0020.0002] # GUJARATI LETTER JA -0AF9 ; [.26C5.0020.0002] # GUJARATI LETTER ZHA -0A9D ; [.26C6.0020.0002] # GUJARATI LETTER JHA -0A9E ; [.26C7.0020.0002] # GUJARATI LETTER NYA -0A9F ; [.26C8.0020.0002] # GUJARATI LETTER TTA -0AA0 ; [.26C9.0020.0002] # GUJARATI LETTER TTHA -0AA1 ; [.26CA.0020.0002] # GUJARATI LETTER DDA -0AA2 ; [.26CB.0020.0002] # GUJARATI LETTER DDHA -0AA3 ; [.26CC.0020.0002] # GUJARATI LETTER NNA -0AA4 ; [.26CD.0020.0002] # GUJARATI LETTER TA -0AA5 ; [.26CE.0020.0002] # GUJARATI LETTER THA -0AA6 ; [.26CF.0020.0002] # GUJARATI LETTER DA -0AA7 ; [.26D0.0020.0002] # GUJARATI LETTER DHA -0AA8 ; [.26D1.0020.0002] # GUJARATI LETTER NA -0AAA ; [.26D2.0020.0002] # GUJARATI LETTER PA -0AAB ; [.26D3.0020.0002] # GUJARATI LETTER PHA -0AAC ; [.26D4.0020.0002] # GUJARATI LETTER BA -0AAD ; [.26D5.0020.0002] # GUJARATI LETTER BHA -0AAE ; [.26D6.0020.0002] # GUJARATI LETTER MA -0AAF ; [.26D7.0020.0002] # GUJARATI LETTER YA -0AB0 ; [.26D8.0020.0002] # GUJARATI LETTER RA -0AB2 ; [.26D9.0020.0002] # GUJARATI LETTER LA -0AB5 ; [.26DA.0020.0002] # GUJARATI LETTER VA -0AB6 ; [.26DB.0020.0002] # GUJARATI LETTER SHA -0AB7 ; [.26DC.0020.0002] # GUJARATI LETTER SSA -0AB8 ; [.26DD.0020.0002] # GUJARATI LETTER SA -0AB9 ; [.26DE.0020.0002] # GUJARATI LETTER HA -0AB3 ; [.26DF.0020.0002] # GUJARATI LETTER LLA -0ABD ; [.26E0.0020.0002] # GUJARATI SIGN AVAGRAHA -0ABE ; [.26E1.0020.0002] # GUJARATI VOWEL SIGN AA -0ABF ; [.26E2.0020.0002] # GUJARATI VOWEL SIGN I -0AC0 ; [.26E3.0020.0002] # GUJARATI VOWEL SIGN II -0AC1 ; [.26E4.0020.0002] # GUJARATI VOWEL SIGN U -0AC2 ; [.26E5.0020.0002] # GUJARATI VOWEL SIGN UU -0AC3 ; [.26E6.0020.0002] # GUJARATI VOWEL SIGN VOCALIC R -0AC4 ; [.26E7.0020.0002] # GUJARATI VOWEL SIGN VOCALIC RR -0AE2 ; [.26E8.0020.0002] # GUJARATI VOWEL SIGN VOCALIC L -0AE3 ; [.26E9.0020.0002] # GUJARATI VOWEL SIGN VOCALIC LL -0AC5 ; [.26EA.0020.0002] # GUJARATI VOWEL SIGN CANDRA E -0AC7 ; [.26EB.0020.0002] # GUJARATI VOWEL SIGN E -0AC8 ; [.26EC.0020.0002] # GUJARATI VOWEL SIGN AI -0AC9 ; [.26ED.0020.0002] # GUJARATI VOWEL SIGN CANDRA O -0ACB ; [.26EE.0020.0002] # GUJARATI VOWEL SIGN O -0ACC ; [.26EF.0020.0002] # GUJARATI VOWEL SIGN AU -0ACD ; [.26F0.0020.0002] # GUJARATI SIGN VIRAMA -0B05 ; [.26F1.0020.0002] # ORIYA LETTER A -0B06 ; [.26F2.0020.0002] # ORIYA LETTER AA -0B07 ; [.26F3.0020.0002] # ORIYA LETTER I -0B08 ; [.26F4.0020.0002] # ORIYA LETTER II -0B09 ; [.26F5.0020.0002] # ORIYA LETTER U -0B0A ; [.26F6.0020.0002] # ORIYA LETTER UU -0B0B ; [.26F7.0020.0002] # ORIYA LETTER VOCALIC R -0B60 ; [.26F8.0020.0002] # ORIYA LETTER VOCALIC RR -0B0C ; [.26F9.0020.0002] # ORIYA LETTER VOCALIC L -0B61 ; [.26FA.0020.0002] # ORIYA LETTER VOCALIC LL -0B0F ; [.26FB.0020.0002] # ORIYA LETTER E -0B10 ; [.26FC.0020.0002] # ORIYA LETTER AI -0B13 ; [.26FD.0020.0002] # ORIYA LETTER O -0B14 ; [.26FE.0020.0002] # ORIYA LETTER AU -0B15 ; [.26FF.0020.0002] # ORIYA LETTER KA -0B16 ; [.2700.0020.0002] # ORIYA LETTER KHA -0B17 ; [.2701.0020.0002] # ORIYA LETTER GA -0B18 ; [.2702.0020.0002] # ORIYA LETTER GHA -0B19 ; [.2703.0020.0002] # ORIYA LETTER NGA -0B1A ; [.2704.0020.0002] # ORIYA LETTER CA -0B1B ; [.2705.0020.0002] # ORIYA LETTER CHA -0B1C ; [.2706.0020.0002] # ORIYA LETTER JA -0B1D ; [.2707.0020.0002] # ORIYA LETTER JHA -0B1E ; [.2708.0020.0002] # ORIYA LETTER NYA -0B1F ; [.2709.0020.0002] # ORIYA LETTER TTA -0B20 ; [.270A.0020.0002] # ORIYA LETTER TTHA -0B21 ; [.270B.0020.0002] # ORIYA LETTER DDA -0B5C ; [.270B.0020.0002][.0000.00BD.0002] # ORIYA LETTER RRA -0B22 ; [.270C.0020.0002] # ORIYA LETTER DDHA -0B5D ; [.270C.0020.0002][.0000.00BD.0002] # ORIYA LETTER RHA -0B23 ; [.270D.0020.0002] # ORIYA LETTER NNA -0B24 ; [.270E.0020.0002] # ORIYA LETTER TA -0B25 ; [.270F.0020.0002] # ORIYA LETTER THA -0B26 ; [.2710.0020.0002] # ORIYA LETTER DA -0B27 ; [.2711.0020.0002] # ORIYA LETTER DHA -0B28 ; [.2712.0020.0002] # ORIYA LETTER NA -0B2A ; [.2713.0020.0002] # ORIYA LETTER PA -0B2B ; [.2714.0020.0002] # ORIYA LETTER PHA -0B2C ; [.2715.0020.0002] # ORIYA LETTER BA -0B2D ; [.2716.0020.0002] # ORIYA LETTER BHA -0B2E ; [.2717.0020.0002] # ORIYA LETTER MA -0B2F ; [.2718.0020.0002] # ORIYA LETTER YA -0B5F ; [.2719.0020.0002] # ORIYA LETTER YYA -0B30 ; [.271A.0020.0002] # ORIYA LETTER RA -0B32 ; [.271B.0020.0002] # ORIYA LETTER LA -0B33 ; [.271C.0020.0002] # ORIYA LETTER LLA -0B35 ; [.271D.0020.0002] # ORIYA LETTER VA -0B71 ; [.271E.0020.0002] # ORIYA LETTER WA -0B36 ; [.271F.0020.0002] # ORIYA LETTER SHA -0B37 ; [.2720.0020.0002] # ORIYA LETTER SSA -0B38 ; [.2721.0020.0002] # ORIYA LETTER SA -0B39 ; [.2722.0020.0002] # ORIYA LETTER HA -0B3D ; [.2723.0020.0002] # ORIYA SIGN AVAGRAHA -0B3E ; [.2724.0020.0002] # ORIYA VOWEL SIGN AA -0B3F ; [.2725.0020.0002] # ORIYA VOWEL SIGN I -0B40 ; [.2726.0020.0002] # ORIYA VOWEL SIGN II -0B41 ; [.2727.0020.0002] # ORIYA VOWEL SIGN U -0B42 ; [.2728.0020.0002] # ORIYA VOWEL SIGN UU -0B43 ; [.2729.0020.0002] # ORIYA VOWEL SIGN VOCALIC R -0B44 ; [.272A.0020.0002] # ORIYA VOWEL SIGN VOCALIC RR -0B62 ; [.272B.0020.0002] # ORIYA VOWEL SIGN VOCALIC L -0B63 ; [.272C.0020.0002] # ORIYA VOWEL SIGN VOCALIC LL -0B47 ; [.272D.0020.0002] # ORIYA VOWEL SIGN E -0B48 ; [.272E.0020.0002] # ORIYA VOWEL SIGN AI -0B47 0B56 ; [.272E.0020.0002] # ORIYA VOWEL SIGN AI -0B4B ; [.272F.0020.0002] # ORIYA VOWEL SIGN O -0B47 0B3E ; [.272F.0020.0002] # ORIYA VOWEL SIGN O -0B4C ; [.2730.0020.0002] # ORIYA VOWEL SIGN AU -0B47 0B57 ; [.2730.0020.0002] # ORIYA VOWEL SIGN AU -0B4D ; [.2731.0020.0002] # ORIYA SIGN VIRAMA -0B56 ; [.2732.0020.0002] # ORIYA AI LENGTH MARK -0B57 ; [.2733.0020.0002] # ORIYA AU LENGTH MARK -0BD0 ; [.2734.0020.0002] # TAMIL OM -0B85 ; [.2735.0020.0002] # TAMIL LETTER A -0B86 ; [.2736.0020.0002] # TAMIL LETTER AA -0B87 ; [.2737.0020.0002] # TAMIL LETTER I -0B88 ; [.2738.0020.0002] # TAMIL LETTER II -0B89 ; [.2739.0020.0002] # TAMIL LETTER U -0B8A ; [.273A.0020.0002] # TAMIL LETTER UU -0B8E ; [.273B.0020.0002] # TAMIL LETTER E -0B8F ; [.273C.0020.0002] # TAMIL LETTER EE -0B90 ; [.273D.0020.0002] # TAMIL LETTER AI -0B92 ; [.273E.0020.0002] # TAMIL LETTER O -0B93 ; [.273F.0020.0002] # TAMIL LETTER OO -0B94 ; [.2740.0020.0002] # TAMIL LETTER AU -0B92 0BD7 ; [.2740.0020.0002] # TAMIL LETTER AU -0B83 ; [.2741.0020.0002] # TAMIL SIGN VISARGA -0B95 ; [.2742.0020.0002] # TAMIL LETTER KA -0B99 ; [.2743.0020.0002] # TAMIL LETTER NGA -0B9A ; [.2744.0020.0002] # TAMIL LETTER CA -0B9E ; [.2745.0020.0002] # TAMIL LETTER NYA -0B9F ; [.2746.0020.0002] # TAMIL LETTER TTA -0BA3 ; [.2747.0020.0002] # TAMIL LETTER NNA -0BA4 ; [.2748.0020.0002] # TAMIL LETTER TA -0BA8 ; [.2749.0020.0002] # TAMIL LETTER NA -0BAA ; [.274A.0020.0002] # TAMIL LETTER PA -0BAE ; [.274B.0020.0002] # TAMIL LETTER MA -0BAF ; [.274C.0020.0002] # TAMIL LETTER YA -0BB0 ; [.274D.0020.0002] # TAMIL LETTER RA -0BB2 ; [.274E.0020.0002] # TAMIL LETTER LA -0BB5 ; [.274F.0020.0002] # TAMIL LETTER VA -0BB4 ; [.2750.0020.0002] # TAMIL LETTER LLLA -0BB3 ; [.2751.0020.0002] # TAMIL LETTER LLA -0BB1 ; [.2752.0020.0002] # TAMIL LETTER RRA -0BA9 ; [.2753.0020.0002] # TAMIL LETTER NNNA -0B9C ; [.2754.0020.0002] # TAMIL LETTER JA -0BB6 ; [.2755.0020.0002] # TAMIL LETTER SHA -0BB7 ; [.2756.0020.0002] # TAMIL LETTER SSA -0BB8 ; [.2757.0020.0002] # TAMIL LETTER SA -0BB9 ; [.2758.0020.0002] # TAMIL LETTER HA -0BBE ; [.2759.0020.0002] # TAMIL VOWEL SIGN AA -0BBF ; [.275A.0020.0002] # TAMIL VOWEL SIGN I -0BC0 ; [.275B.0020.0002] # TAMIL VOWEL SIGN II -0BC1 ; [.275C.0020.0002] # TAMIL VOWEL SIGN U -0BC2 ; [.275D.0020.0002] # TAMIL VOWEL SIGN UU -0BC6 ; [.275E.0020.0002] # TAMIL VOWEL SIGN E -0BC7 ; [.275F.0020.0002] # TAMIL VOWEL SIGN EE -0BC8 ; [.2760.0020.0002] # TAMIL VOWEL SIGN AI -0BCA ; [.2761.0020.0002] # TAMIL VOWEL SIGN O -0BC6 0BBE ; [.2761.0020.0002] # TAMIL VOWEL SIGN O -0BCB ; [.2762.0020.0002] # TAMIL VOWEL SIGN OO -0BC7 0BBE ; [.2762.0020.0002] # TAMIL VOWEL SIGN OO -0BCC ; [.2763.0020.0002] # TAMIL VOWEL SIGN AU -0BC6 0BD7 ; [.2763.0020.0002] # TAMIL VOWEL SIGN AU -0BCD ; [.2764.0020.0002] # TAMIL SIGN VIRAMA -0BD7 ; [.2765.0020.0002] # TAMIL AU LENGTH MARK -0C05 ; [.2766.0020.0002] # TELUGU LETTER A -0C06 ; [.2767.0020.0002] # TELUGU LETTER AA -0C07 ; [.2768.0020.0002] # TELUGU LETTER I -0C08 ; [.2769.0020.0002] # TELUGU LETTER II -0C09 ; [.276A.0020.0002] # TELUGU LETTER U -0C0A ; [.276B.0020.0002] # TELUGU LETTER UU -0C0B ; [.276C.0020.0002] # TELUGU LETTER VOCALIC R -0C60 ; [.276D.0020.0002] # TELUGU LETTER VOCALIC RR -0C0C ; [.276E.0020.0002] # TELUGU LETTER VOCALIC L -0C61 ; [.276F.0020.0002] # TELUGU LETTER VOCALIC LL -0C0E ; [.2770.0020.0002] # TELUGU LETTER E -0C0F ; [.2771.0020.0002] # TELUGU LETTER EE -0C10 ; [.2772.0020.0002] # TELUGU LETTER AI -0C12 ; [.2773.0020.0002] # TELUGU LETTER O -0C13 ; [.2774.0020.0002] # TELUGU LETTER OO -0C14 ; [.2775.0020.0002] # TELUGU LETTER AU -0C15 ; [.2776.0020.0002] # TELUGU LETTER KA -0C16 ; [.2777.0020.0002] # TELUGU LETTER KHA -0C17 ; [.2778.0020.0002] # TELUGU LETTER GA -0C18 ; [.2779.0020.0002] # TELUGU LETTER GHA -0C19 ; [.277A.0020.0002] # TELUGU LETTER NGA -0C1A ; [.277B.0020.0002] # TELUGU LETTER CA -0C58 ; [.277C.0020.0002] # TELUGU LETTER TSA -0C1B ; [.277D.0020.0002] # TELUGU LETTER CHA -0C1C ; [.277E.0020.0002] # TELUGU LETTER JA -0C59 ; [.277F.0020.0002] # TELUGU LETTER DZA -0C1D ; [.2780.0020.0002] # TELUGU LETTER JHA -0C1E ; [.2781.0020.0002] # TELUGU LETTER NYA -0C1F ; [.2782.0020.0002] # TELUGU LETTER TTA -0C20 ; [.2783.0020.0002] # TELUGU LETTER TTHA -0C21 ; [.2784.0020.0002] # TELUGU LETTER DDA -0C22 ; [.2785.0020.0002] # TELUGU LETTER DDHA -0C23 ; [.2786.0020.0002] # TELUGU LETTER NNA -0C24 ; [.2787.0020.0002] # TELUGU LETTER TA -0C25 ; [.2788.0020.0002] # TELUGU LETTER THA -0C26 ; [.2789.0020.0002] # TELUGU LETTER DA -0C27 ; [.278A.0020.0002] # TELUGU LETTER DHA -0C28 ; [.278B.0020.0002] # TELUGU LETTER NA -0C2A ; [.278C.0020.0002] # TELUGU LETTER PA -0C2B ; [.278D.0020.0002] # TELUGU LETTER PHA -0C2C ; [.278E.0020.0002] # TELUGU LETTER BA -0C2D ; [.278F.0020.0002] # TELUGU LETTER BHA -0C2E ; [.2790.0020.0002] # TELUGU LETTER MA -0C2F ; [.2791.0020.0002] # TELUGU LETTER YA -0C30 ; [.2792.0020.0002] # TELUGU LETTER RA -0C31 ; [.2793.0020.0002] # TELUGU LETTER RRA -0C32 ; [.2794.0020.0002] # TELUGU LETTER LA -0C35 ; [.2795.0020.0002] # TELUGU LETTER VA -0C36 ; [.2796.0020.0002] # TELUGU LETTER SHA -0C37 ; [.2797.0020.0002] # TELUGU LETTER SSA -0C38 ; [.2798.0020.0002] # TELUGU LETTER SA -0C39 ; [.2799.0020.0002] # TELUGU LETTER HA -0C33 ; [.279A.0020.0002] # TELUGU LETTER LLA -0C34 ; [.279B.0020.0002] # TELUGU LETTER LLLA -0C5A ; [.279C.0020.0002] # TELUGU LETTER RRRA -0C3D ; [.279D.0020.0002] # TELUGU SIGN AVAGRAHA -0C3E ; [.279E.0020.0002] # TELUGU VOWEL SIGN AA -0C3F ; [.279F.0020.0002] # TELUGU VOWEL SIGN I -0C40 ; [.27A0.0020.0002] # TELUGU VOWEL SIGN II -0C41 ; [.27A1.0020.0002] # TELUGU VOWEL SIGN U -0C42 ; [.27A2.0020.0002] # TELUGU VOWEL SIGN UU -0C43 ; [.27A3.0020.0002] # TELUGU VOWEL SIGN VOCALIC R -0C44 ; [.27A4.0020.0002] # TELUGU VOWEL SIGN VOCALIC RR -0C62 ; [.27A5.0020.0002] # TELUGU VOWEL SIGN VOCALIC L -0C63 ; [.27A6.0020.0002] # TELUGU VOWEL SIGN VOCALIC LL -0C46 ; [.27A7.0020.0002] # TELUGU VOWEL SIGN E -0C47 ; [.27A8.0020.0002] # TELUGU VOWEL SIGN EE -0C48 ; [.27A9.0020.0002] # TELUGU VOWEL SIGN AI -0C46 0C56 ; [.27A9.0020.0002] # TELUGU VOWEL SIGN AI -0C4A ; [.27AA.0020.0002] # TELUGU VOWEL SIGN O -0C4B ; [.27AB.0020.0002] # TELUGU VOWEL SIGN OO -0C4C ; [.27AC.0020.0002] # TELUGU VOWEL SIGN AU -0C4D ; [.27AD.0020.0002] # TELUGU SIGN VIRAMA -0C55 ; [.27AE.0020.0002] # TELUGU LENGTH MARK -0C56 ; [.27AF.0020.0002] # TELUGU AI LENGTH MARK -0C85 ; [.27B0.0020.0002] # KANNADA LETTER A -0C86 ; [.27B1.0020.0002] # KANNADA LETTER AA -0C87 ; [.27B2.0020.0002] # KANNADA LETTER I -0C88 ; [.27B3.0020.0002] # KANNADA LETTER II -0C89 ; [.27B4.0020.0002] # KANNADA LETTER U -0C8A ; [.27B5.0020.0002] # KANNADA LETTER UU -0C8B ; [.27B6.0020.0002] # KANNADA LETTER VOCALIC R -0CE0 ; [.27B7.0020.0002] # KANNADA LETTER VOCALIC RR -0C8C ; [.27B8.0020.0002] # KANNADA LETTER VOCALIC L -0CE1 ; [.27B9.0020.0002] # KANNADA LETTER VOCALIC LL -0C8E ; [.27BA.0020.0002] # KANNADA LETTER E -0C8F ; [.27BB.0020.0002] # KANNADA LETTER EE -0C90 ; [.27BC.0020.0002] # KANNADA LETTER AI -0C92 ; [.27BD.0020.0002] # KANNADA LETTER O -0C93 ; [.27BE.0020.0002] # KANNADA LETTER OO -0C94 ; [.27BF.0020.0002] # KANNADA LETTER AU -0C95 ; [.27C0.0020.0002] # KANNADA LETTER KA -0C96 ; [.27C1.0020.0002] # KANNADA LETTER KHA -0C97 ; [.27C2.0020.0002] # KANNADA LETTER GA -0C98 ; [.27C3.0020.0002] # KANNADA LETTER GHA -0C99 ; [.27C4.0020.0002] # KANNADA LETTER NGA -0C9A ; [.27C5.0020.0002] # KANNADA LETTER CA -0C9B ; [.27C6.0020.0002] # KANNADA LETTER CHA -0C9C ; [.27C7.0020.0002] # KANNADA LETTER JA -0C9D ; [.27C8.0020.0002] # KANNADA LETTER JHA -0C9E ; [.27C9.0020.0002] # KANNADA LETTER NYA -0C9F ; [.27CA.0020.0002] # KANNADA LETTER TTA -0CA0 ; [.27CB.0020.0002] # KANNADA LETTER TTHA -0CA1 ; [.27CC.0020.0002] # KANNADA LETTER DDA -0CA2 ; [.27CD.0020.0002] # KANNADA LETTER DDHA -0CA3 ; [.27CE.0020.0002] # KANNADA LETTER NNA -0CA4 ; [.27CF.0020.0002] # KANNADA LETTER TA -0CA5 ; [.27D0.0020.0002] # KANNADA LETTER THA -0CA6 ; [.27D1.0020.0002] # KANNADA LETTER DA -0CA7 ; [.27D2.0020.0002] # KANNADA LETTER DHA -0CA8 ; [.27D3.0020.0002] # KANNADA LETTER NA -0CAA ; [.27D4.0020.0002] # KANNADA LETTER PA -0CAB ; [.27D5.0020.0002] # KANNADA LETTER PHA -0CAC ; [.27D6.0020.0002] # KANNADA LETTER BA -0CAD ; [.27D7.0020.0002] # KANNADA LETTER BHA -0CAE ; [.27D8.0020.0002] # KANNADA LETTER MA -0CAF ; [.27D9.0020.0002] # KANNADA LETTER YA -0CB0 ; [.27DA.0020.0002] # KANNADA LETTER RA -0CB1 ; [.27DB.0020.0002] # KANNADA LETTER RRA -0CB2 ; [.27DC.0020.0002] # KANNADA LETTER LA -0CB5 ; [.27DD.0020.0002] # KANNADA LETTER VA -0CB6 ; [.27DE.0020.0002] # KANNADA LETTER SHA -0CB7 ; [.27DF.0020.0002] # KANNADA LETTER SSA -0CB8 ; [.27E0.0020.0002] # KANNADA LETTER SA -0CB9 ; [.27E1.0020.0002] # KANNADA LETTER HA -0CB3 ; [.27E2.0020.0002] # KANNADA LETTER LLA -0CDE ; [.27E3.0020.0002] # KANNADA LETTER FA -0CBD ; [.27E4.0020.0002] # KANNADA SIGN AVAGRAHA -0CF1 ; [.27E5.0020.0002] # KANNADA SIGN JIHVAMULIYA -0CF2 ; [.27E6.0020.0002] # KANNADA SIGN UPADHMANIYA -0CBE ; [.27E7.0020.0002] # KANNADA VOWEL SIGN AA -0CBF ; [.27E8.0020.0002] # KANNADA VOWEL SIGN I -0CC0 ; [.27E9.0020.0002] # KANNADA VOWEL SIGN II -0CBF 0CD5 ; [.27E9.0020.0002] # KANNADA VOWEL SIGN II -0CC1 ; [.27EA.0020.0002] # KANNADA VOWEL SIGN U -0CC2 ; [.27EB.0020.0002] # KANNADA VOWEL SIGN UU -0CC3 ; [.27EC.0020.0002] # KANNADA VOWEL SIGN VOCALIC R -0CC4 ; [.27ED.0020.0002] # KANNADA VOWEL SIGN VOCALIC RR -0CE2 ; [.27EE.0020.0002] # KANNADA VOWEL SIGN VOCALIC L -0CE3 ; [.27EF.0020.0002] # KANNADA VOWEL SIGN VOCALIC LL -0CC6 ; [.27F0.0020.0002] # KANNADA VOWEL SIGN E -0CC7 ; [.27F1.0020.0002] # KANNADA VOWEL SIGN EE -0CC6 0CD5 ; [.27F1.0020.0002] # KANNADA VOWEL SIGN EE -0CC8 ; [.27F2.0020.0002] # KANNADA VOWEL SIGN AI -0CC6 0CD6 ; [.27F2.0020.0002] # KANNADA VOWEL SIGN AI -0CCA ; [.27F3.0020.0002] # KANNADA VOWEL SIGN O -0CC6 0CC2 ; [.27F3.0020.0002] # KANNADA VOWEL SIGN O -0CCB ; [.27F4.0020.0002] # KANNADA VOWEL SIGN OO -0CC6 0CC2 0CD5 ; [.27F4.0020.0002] # KANNADA VOWEL SIGN OO -0CCA 0CD5 ; [.27F4.0020.0002] # KANNADA VOWEL SIGN OO -0CCC ; [.27F5.0020.0002] # KANNADA VOWEL SIGN AU -0CCD ; [.27F6.0020.0002] # KANNADA SIGN VIRAMA -0CD5 ; [.27F7.0020.0002] # KANNADA LENGTH MARK -0CD6 ; [.27F8.0020.0002] # KANNADA AI LENGTH MARK -0D05 ; [.27F9.0020.0002] # MALAYALAM LETTER A -0D06 ; [.27FA.0020.0002] # MALAYALAM LETTER AA -0D07 ; [.27FB.0020.0002] # MALAYALAM LETTER I -0D08 ; [.27FC.0020.0002] # MALAYALAM LETTER II -0D5F ; [.27FD.0020.0002] # MALAYALAM LETTER ARCHAIC II -0D09 ; [.27FE.0020.0002] # MALAYALAM LETTER U -0D0A ; [.27FF.0020.0002] # MALAYALAM LETTER UU -0D0B ; [.2800.0020.0002] # MALAYALAM LETTER VOCALIC R -0D60 ; [.2801.0020.0002] # MALAYALAM LETTER VOCALIC RR -0D0C ; [.2802.0020.0002] # MALAYALAM LETTER VOCALIC L -0D61 ; [.2803.0020.0002] # MALAYALAM LETTER VOCALIC LL -0D0E ; [.2804.0020.0002] # MALAYALAM LETTER E -0D0F ; [.2805.0020.0002] # MALAYALAM LETTER EE -0D10 ; [.2806.0020.0002] # MALAYALAM LETTER AI -0D12 ; [.2807.0020.0002] # MALAYALAM LETTER O -0D13 ; [.2808.0020.0002] # MALAYALAM LETTER OO -0D14 ; [.2809.0020.0002] # MALAYALAM LETTER AU -0D15 ; [.280A.0020.0002] # MALAYALAM LETTER KA -0D7F ; [.280A.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU K -0D16 ; [.280B.0020.0002] # MALAYALAM LETTER KHA -0D17 ; [.280C.0020.0002] # MALAYALAM LETTER GA -0D18 ; [.280D.0020.0002] # MALAYALAM LETTER GHA -0D19 ; [.280E.0020.0002] # MALAYALAM LETTER NGA -0D1A ; [.280F.0020.0002] # MALAYALAM LETTER CA -0D1B ; [.2810.0020.0002] # MALAYALAM LETTER CHA -0D1C ; [.2811.0020.0002] # MALAYALAM LETTER JA -0D1D ; [.2812.0020.0002] # MALAYALAM LETTER JHA -0D1E ; [.2813.0020.0002] # MALAYALAM LETTER NYA -0D1F ; [.2814.0020.0002] # MALAYALAM LETTER TTA -0D20 ; [.2815.0020.0002] # MALAYALAM LETTER TTHA -0D21 ; [.2816.0020.0002] # MALAYALAM LETTER DDA -0D22 ; [.2817.0020.0002] # MALAYALAM LETTER DDHA -0D23 ; [.2818.0020.0002] # MALAYALAM LETTER NNA -0D7A ; [.2818.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU NN -0D24 ; [.2819.0020.0002] # MALAYALAM LETTER TA -0D25 ; [.281A.0020.0002] # MALAYALAM LETTER THA -0D26 ; [.281B.0020.0002] # MALAYALAM LETTER DA -0D27 ; [.281C.0020.0002] # MALAYALAM LETTER DHA -0D28 ; [.281D.0020.0002] # MALAYALAM LETTER NA -0D7B ; [.281D.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU N -0D29 ; [.281E.0020.0002] # MALAYALAM LETTER NNNA -0D2A ; [.281F.0020.0002] # MALAYALAM LETTER PA -0D2B ; [.2820.0020.0002] # MALAYALAM LETTER PHA -0D2C ; [.2821.0020.0002] # MALAYALAM LETTER BA -0D2D ; [.2822.0020.0002] # MALAYALAM LETTER BHA -0D2E ; [.2823.0020.0002] # MALAYALAM LETTER MA -0D2F ; [.2824.0020.0002] # MALAYALAM LETTER YA -0D30 ; [.2825.0020.0002] # MALAYALAM LETTER RA -0D4E ; [.2825.0020.0004][.2841.0020.0004] # MALAYALAM LETTER DOT REPH -0D7C ; [.2825.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU RR -0D32 ; [.2826.0020.0002] # MALAYALAM LETTER LA -0D7D ; [.2826.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU L -0D35 ; [.2827.0020.0002] # MALAYALAM LETTER VA -0D36 ; [.2828.0020.0002] # MALAYALAM LETTER SHA -0D37 ; [.2829.0020.0002] # MALAYALAM LETTER SSA -0D38 ; [.282A.0020.0002] # MALAYALAM LETTER SA -0D39 ; [.282B.0020.0002] # MALAYALAM LETTER HA -0D33 ; [.282C.0020.0002] # MALAYALAM LETTER LLA -0D7E ; [.282C.0020.0004][.2841.0020.0004] # MALAYALAM LETTER CHILLU LL -0D34 ; [.282D.0020.0002] # MALAYALAM LETTER LLLA -0D31 ; [.282E.0020.0002] # MALAYALAM LETTER RRA -0D3A ; [.282F.0020.0002] # MALAYALAM LETTER TTTA -0D3D ; [.2830.0020.0002] # MALAYALAM SIGN AVAGRAHA -0D3E ; [.2831.0020.0002] # MALAYALAM VOWEL SIGN AA -0D3F ; [.2832.0020.0002] # MALAYALAM VOWEL SIGN I -0D40 ; [.2833.0020.0002] # MALAYALAM VOWEL SIGN II -0D41 ; [.2834.0020.0002] # MALAYALAM VOWEL SIGN U -0D42 ; [.2835.0020.0002] # MALAYALAM VOWEL SIGN UU -0D43 ; [.2836.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC R -0D44 ; [.2837.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC RR -0D62 ; [.2838.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC L -0D63 ; [.2839.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC LL -0D46 ; [.283A.0020.0002] # MALAYALAM VOWEL SIGN E -0D47 ; [.283B.0020.0002] # MALAYALAM VOWEL SIGN EE -0D48 ; [.283C.0020.0002] # MALAYALAM VOWEL SIGN AI -0D4A ; [.283D.0020.0002] # MALAYALAM VOWEL SIGN O -0D46 0D3E ; [.283D.0020.0002] # MALAYALAM VOWEL SIGN O -0D4B ; [.283E.0020.0002] # MALAYALAM VOWEL SIGN OO -0D47 0D3E ; [.283E.0020.0002] # MALAYALAM VOWEL SIGN OO -0D4C ; [.283F.0020.0002] # MALAYALAM VOWEL SIGN AU -0D46 0D57 ; [.283F.0020.0002] # MALAYALAM VOWEL SIGN AU -0D57 ; [.2840.0020.0002] # MALAYALAM AU LENGTH MARK -0D4D ; [.2841.0020.0002] # MALAYALAM SIGN VIRAMA -0D85 ; [.2842.0020.0002] # SINHALA LETTER AYANNA -0D86 ; [.2843.0020.0002] # SINHALA LETTER AAYANNA -0D87 ; [.2844.0020.0002] # SINHALA LETTER AEYANNA -0D88 ; [.2845.0020.0002] # SINHALA LETTER AEEYANNA -0D89 ; [.2846.0020.0002] # SINHALA LETTER IYANNA -0D8A ; [.2847.0020.0002] # SINHALA LETTER IIYANNA -0D8B ; [.2848.0020.0002] # SINHALA LETTER UYANNA -0D8C ; [.2849.0020.0002] # SINHALA LETTER UUYANNA -0D8D ; [.284A.0020.0002] # SINHALA LETTER IRUYANNA -0D8E ; [.284B.0020.0002] # SINHALA LETTER IRUUYANNA -0D8F ; [.284C.0020.0002] # SINHALA LETTER ILUYANNA -0D90 ; [.284D.0020.0002] # SINHALA LETTER ILUUYANNA -0D91 ; [.284E.0020.0002] # SINHALA LETTER EYANNA -0D92 ; [.284F.0020.0002] # SINHALA LETTER EEYANNA -0D93 ; [.2850.0020.0002] # SINHALA LETTER AIYANNA -0D94 ; [.2851.0020.0002] # SINHALA LETTER OYANNA -0D95 ; [.2852.0020.0002] # SINHALA LETTER OOYANNA -0D96 ; [.2853.0020.0002] # SINHALA LETTER AUYANNA -0D9A ; [.2854.0020.0002] # SINHALA LETTER ALPAPRAANA KAYANNA -0D9B ; [.2855.0020.0002] # SINHALA LETTER MAHAAPRAANA KAYANNA -0D9C ; [.2856.0020.0002] # SINHALA LETTER ALPAPRAANA GAYANNA -0D9D ; [.2857.0020.0002] # SINHALA LETTER MAHAAPRAANA GAYANNA -0D9E ; [.2858.0020.0002] # SINHALA LETTER KANTAJA NAASIKYAYA -0D9F ; [.2859.0020.0002] # SINHALA LETTER SANYAKA GAYANNA -0DA0 ; [.285A.0020.0002] # SINHALA LETTER ALPAPRAANA CAYANNA -0DA1 ; [.285B.0020.0002] # SINHALA LETTER MAHAAPRAANA CAYANNA -0DA2 ; [.285C.0020.0002] # SINHALA LETTER ALPAPRAANA JAYANNA -0DA3 ; [.285D.0020.0002] # SINHALA LETTER MAHAAPRAANA JAYANNA -0DA4 ; [.285E.0020.0002] # SINHALA LETTER TAALUJA NAASIKYAYA -0DA5 ; [.285F.0020.0002] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA -0DA6 ; [.2860.0020.0002] # SINHALA LETTER SANYAKA JAYANNA -0DA7 ; [.2861.0020.0002] # SINHALA LETTER ALPAPRAANA TTAYANNA -0DA8 ; [.2862.0020.0002] # SINHALA LETTER MAHAAPRAANA TTAYANNA -0DA9 ; [.2863.0020.0002] # SINHALA LETTER ALPAPRAANA DDAYANNA -0DAA ; [.2864.0020.0002] # SINHALA LETTER MAHAAPRAANA DDAYANNA -0DAB ; [.2865.0020.0002] # SINHALA LETTER MUURDHAJA NAYANNA -0DAC ; [.2866.0020.0002] # SINHALA LETTER SANYAKA DDAYANNA -0DAD ; [.2867.0020.0002] # SINHALA LETTER ALPAPRAANA TAYANNA -0DAE ; [.2868.0020.0002] # SINHALA LETTER MAHAAPRAANA TAYANNA -0DAF ; [.2869.0020.0002] # SINHALA LETTER ALPAPRAANA DAYANNA -0DB0 ; [.286A.0020.0002] # SINHALA LETTER MAHAAPRAANA DAYANNA -0DB1 ; [.286B.0020.0002] # SINHALA LETTER DANTAJA NAYANNA -0DB3 ; [.286C.0020.0002] # SINHALA LETTER SANYAKA DAYANNA -0DB4 ; [.286D.0020.0002] # SINHALA LETTER ALPAPRAANA PAYANNA -0DB5 ; [.286E.0020.0002] # SINHALA LETTER MAHAAPRAANA PAYANNA -0DB6 ; [.286F.0020.0002] # SINHALA LETTER ALPAPRAANA BAYANNA -0DB7 ; [.2870.0020.0002] # SINHALA LETTER MAHAAPRAANA BAYANNA -0DB8 ; [.2871.0020.0002] # SINHALA LETTER MAYANNA -0DB9 ; [.2872.0020.0002] # SINHALA LETTER AMBA BAYANNA -0DBA ; [.2873.0020.0002] # SINHALA LETTER YAYANNA -0DBB ; [.2874.0020.0002] # SINHALA LETTER RAYANNA -0DBD ; [.2875.0020.0002] # SINHALA LETTER DANTAJA LAYANNA -0DC0 ; [.2876.0020.0002] # SINHALA LETTER VAYANNA -0DC1 ; [.2877.0020.0002] # SINHALA LETTER TAALUJA SAYANNA -0DC2 ; [.2878.0020.0002] # SINHALA LETTER MUURDHAJA SAYANNA -0DC3 ; [.2879.0020.0002] # SINHALA LETTER DANTAJA SAYANNA -0DC4 ; [.287A.0020.0002] # SINHALA LETTER HAYANNA -0DC5 ; [.287B.0020.0002] # SINHALA LETTER MUURDHAJA LAYANNA -0DC6 ; [.287C.0020.0002] # SINHALA LETTER FAYANNA -0DCF ; [.287D.0020.0002] # SINHALA VOWEL SIGN AELA-PILLA -0DD0 ; [.287E.0020.0002] # SINHALA VOWEL SIGN KETTI AEDA-PILLA -0DD1 ; [.287F.0020.0002] # SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2 ; [.2880.0020.0002] # SINHALA VOWEL SIGN KETTI IS-PILLA -0DD3 ; [.2881.0020.0002] # SINHALA VOWEL SIGN DIGA IS-PILLA -0DD4 ; [.2882.0020.0002] # SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; [.2883.0020.0002] # SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8 ; [.2884.0020.0002] # SINHALA VOWEL SIGN GAETTA-PILLA -0DF2 ; [.2885.0020.0002] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA -0DDF ; [.2886.0020.0002] # SINHALA VOWEL SIGN GAYANUKITTA -0DF3 ; [.2887.0020.0002] # SINHALA VOWEL SIGN DIGA GAYANUKITTA -0DD9 ; [.2888.0020.0002] # SINHALA VOWEL SIGN KOMBUVA -0DDA ; [.2889.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA -0DD9 0DCA ; [.2889.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA -0DDB ; [.288A.0020.0002] # SINHALA VOWEL SIGN KOMBU DEKA -0DDC ; [.288B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA -0DD9 0DCF ; [.288B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA -0DDD ; [.288C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA -0DD9 0DCF 0DCA ; [.288C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA -0DDC 0DCA ; [.288C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA -0DDE ; [.288D.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -0DD9 0DDF ; [.288D.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -0DCA ; [.288E.0020.0002] # SINHALA SIGN AL-LAKUNA -AAF2 ; [.288F.0020.0002] # MEETEI MAYEK ANJI -ABC0 ; [.2890.0020.0002] # MEETEI MAYEK LETTER KOK -ABC1 ; [.2891.0020.0002] # MEETEI MAYEK LETTER SAM -ABC2 ; [.2892.0020.0002] # MEETEI MAYEK LETTER LAI -ABC3 ; [.2893.0020.0002] # MEETEI MAYEK LETTER MIT -ABC4 ; [.2894.0020.0002] # MEETEI MAYEK LETTER PA -ABC5 ; [.2895.0020.0002] # MEETEI MAYEK LETTER NA -ABC6 ; [.2896.0020.0002] # MEETEI MAYEK LETTER CHIL -ABC7 ; [.2897.0020.0002] # MEETEI MAYEK LETTER TIL -ABC8 ; [.2898.0020.0002] # MEETEI MAYEK LETTER KHOU -ABC9 ; [.2899.0020.0002] # MEETEI MAYEK LETTER NGOU -ABCA ; [.289A.0020.0002] # MEETEI MAYEK LETTER THOU -ABCB ; [.289B.0020.0002] # MEETEI MAYEK LETTER WAI -ABCC ; [.289C.0020.0002] # MEETEI MAYEK LETTER YANG -ABCD ; [.289D.0020.0002] # MEETEI MAYEK LETTER HUK -ABCE ; [.289E.0020.0002] # MEETEI MAYEK LETTER UN -ABCF ; [.289F.0020.0002] # MEETEI MAYEK LETTER I -ABD0 ; [.28A0.0020.0002] # MEETEI MAYEK LETTER PHAM -ABD1 ; [.28A1.0020.0002] # MEETEI MAYEK LETTER ATIYA -ABD2 ; [.28A2.0020.0002] # MEETEI MAYEK LETTER GOK -ABD3 ; [.28A3.0020.0002] # MEETEI MAYEK LETTER JHAM -ABD4 ; [.28A4.0020.0002] # MEETEI MAYEK LETTER RAI -ABD5 ; [.28A5.0020.0002] # MEETEI MAYEK LETTER BA -ABD6 ; [.28A6.0020.0002] # MEETEI MAYEK LETTER JIL -ABD7 ; [.28A7.0020.0002] # MEETEI MAYEK LETTER DIL -ABD8 ; [.28A8.0020.0002] # MEETEI MAYEK LETTER GHOU -ABD9 ; [.28A9.0020.0002] # MEETEI MAYEK LETTER DHOU -ABDA ; [.28AA.0020.0002] # MEETEI MAYEK LETTER BHAM -AAE0 ; [.28AB.0020.0002] # MEETEI MAYEK LETTER E -AAE1 ; [.28AC.0020.0002] # MEETEI MAYEK LETTER O -AAE2 ; [.28AD.0020.0002] # MEETEI MAYEK LETTER CHA -AAE3 ; [.28AE.0020.0002] # MEETEI MAYEK LETTER NYA -AAE4 ; [.28AF.0020.0002] # MEETEI MAYEK LETTER TTA -AAE5 ; [.28B0.0020.0002] # MEETEI MAYEK LETTER TTHA -AAE6 ; [.28B1.0020.0002] # MEETEI MAYEK LETTER DDA -AAE7 ; [.28B2.0020.0002] # MEETEI MAYEK LETTER DDHA -AAE8 ; [.28B3.0020.0002] # MEETEI MAYEK LETTER NNA -AAE9 ; [.28B4.0020.0002] # MEETEI MAYEK LETTER SHA -AAEA ; [.28B5.0020.0002] # MEETEI MAYEK LETTER SSA -ABE3 ; [.28B6.0020.0002] # MEETEI MAYEK VOWEL SIGN ONAP -ABE4 ; [.28B7.0020.0002] # MEETEI MAYEK VOWEL SIGN INAP -ABE5 ; [.28B8.0020.0002] # MEETEI MAYEK VOWEL SIGN ANAP -ABE6 ; [.28B9.0020.0002] # MEETEI MAYEK VOWEL SIGN YENAP -ABE7 ; [.28BA.0020.0002] # MEETEI MAYEK VOWEL SIGN SOUNAP -ABE8 ; [.28BB.0020.0002] # MEETEI MAYEK VOWEL SIGN UNAP -ABE9 ; [.28BC.0020.0002] # MEETEI MAYEK VOWEL SIGN CHEINAP -ABEA ; [.28BD.0020.0002] # MEETEI MAYEK VOWEL SIGN NUNG -AAEB ; [.28BE.0020.0002] # MEETEI MAYEK VOWEL SIGN II -AAEC ; [.28BF.0020.0002] # MEETEI MAYEK VOWEL SIGN UU -AAED ; [.28C0.0020.0002] # MEETEI MAYEK VOWEL SIGN AAI -AAEE ; [.28C1.0020.0002] # MEETEI MAYEK VOWEL SIGN AU -AAEF ; [.28C2.0020.0002] # MEETEI MAYEK VOWEL SIGN AAU -AAF5 ; [.28C3.0020.0002] # MEETEI MAYEK VOWEL SIGN VISARGA -ABDB ; [.28C4.0020.0002] # MEETEI MAYEK LETTER KOK LONSUM -ABDC ; [.28C5.0020.0002] # MEETEI MAYEK LETTER LAI LONSUM -ABDD ; [.28C6.0020.0002] # MEETEI MAYEK LETTER MIT LONSUM -ABDE ; [.28C7.0020.0002] # MEETEI MAYEK LETTER PA LONSUM -ABDF ; [.28C8.0020.0002] # MEETEI MAYEK LETTER NA LONSUM -ABE0 ; [.28C9.0020.0002] # MEETEI MAYEK LETTER TIL LONSUM -ABE1 ; [.28CA.0020.0002] # MEETEI MAYEK LETTER NGOU LONSUM -ABE2 ; [.28CB.0020.0002] # MEETEI MAYEK LETTER I LONSUM -ABED ; [.28CC.0020.0002] # MEETEI MAYEK APUN IYEK -AAF6 ; [.28CD.0020.0002] # MEETEI MAYEK VIRAMA -A800 ; [.28CE.0020.0002] # SYLOTI NAGRI LETTER A -A801 ; [.28CF.0020.0002] # SYLOTI NAGRI LETTER I -A802 ; [.28D0.0020.0002] # SYLOTI NAGRI SIGN DVISVARA -A803 ; [.28D1.0020.0002] # SYLOTI NAGRI LETTER U -A804 ; [.28D2.0020.0002] # SYLOTI NAGRI LETTER E -A805 ; [.28D3.0020.0002] # SYLOTI NAGRI LETTER O -A806 ; [.28D4.0020.0002] # SYLOTI NAGRI SIGN HASANTA -A807 ; [.28D5.0020.0002] # SYLOTI NAGRI LETTER KO -A808 ; [.28D6.0020.0002] # SYLOTI NAGRI LETTER KHO -A809 ; [.28D7.0020.0002] # SYLOTI NAGRI LETTER GO -A80A ; [.28D8.0020.0002] # SYLOTI NAGRI LETTER GHO -A80C ; [.28D9.0020.0002] # SYLOTI NAGRI LETTER CO -A80D ; [.28DA.0020.0002] # SYLOTI NAGRI LETTER CHO -A80E ; [.28DB.0020.0002] # SYLOTI NAGRI LETTER JO -A80F ; [.28DC.0020.0002] # SYLOTI NAGRI LETTER JHO -A810 ; [.28DD.0020.0002] # SYLOTI NAGRI LETTER TTO -A811 ; [.28DE.0020.0002] # SYLOTI NAGRI LETTER TTHO -A812 ; [.28DF.0020.0002] # SYLOTI NAGRI LETTER DDO -A813 ; [.28E0.0020.0002] # SYLOTI NAGRI LETTER DDHO -A814 ; [.28E1.0020.0002] # SYLOTI NAGRI LETTER TO -A815 ; [.28E2.0020.0002] # SYLOTI NAGRI LETTER THO -A816 ; [.28E3.0020.0002] # SYLOTI NAGRI LETTER DO -A817 ; [.28E4.0020.0002] # SYLOTI NAGRI LETTER DHO -A818 ; [.28E5.0020.0002] # SYLOTI NAGRI LETTER NO -A819 ; [.28E6.0020.0002] # SYLOTI NAGRI LETTER PO -A81A ; [.28E7.0020.0002] # SYLOTI NAGRI LETTER PHO -A81B ; [.28E8.0020.0002] # SYLOTI NAGRI LETTER BO -A81C ; [.28E9.0020.0002] # SYLOTI NAGRI LETTER BHO -A81D ; [.28EA.0020.0002] # SYLOTI NAGRI LETTER MO -A81E ; [.28EB.0020.0002] # SYLOTI NAGRI LETTER RO -A81F ; [.28EC.0020.0002] # SYLOTI NAGRI LETTER LO -A820 ; [.28ED.0020.0002] # SYLOTI NAGRI LETTER RRO -A821 ; [.28EE.0020.0002] # SYLOTI NAGRI LETTER SO -A822 ; [.28EF.0020.0002] # SYLOTI NAGRI LETTER HO -A823 ; [.28F0.0020.0002] # SYLOTI NAGRI VOWEL SIGN A -A824 ; [.28F1.0020.0002] # SYLOTI NAGRI VOWEL SIGN I -A825 ; [.28F2.0020.0002] # SYLOTI NAGRI VOWEL SIGN U -A826 ; [.28F3.0020.0002] # SYLOTI NAGRI VOWEL SIGN E -A827 ; [.28F4.0020.0002] # SYLOTI NAGRI VOWEL SIGN OO -A882 ; [.28F5.0020.0002] # SAURASHTRA LETTER A -A883 ; [.28F6.0020.0002] # SAURASHTRA LETTER AA -A884 ; [.28F7.0020.0002] # SAURASHTRA LETTER I -A885 ; [.28F8.0020.0002] # SAURASHTRA LETTER II -A886 ; [.28F9.0020.0002] # SAURASHTRA LETTER U -A887 ; [.28FA.0020.0002] # SAURASHTRA LETTER UU -A888 ; [.28FB.0020.0002] # SAURASHTRA LETTER VOCALIC R -A889 ; [.28FC.0020.0002] # SAURASHTRA LETTER VOCALIC RR -A88A ; [.28FD.0020.0002] # SAURASHTRA LETTER VOCALIC L -A88B ; [.28FE.0020.0002] # SAURASHTRA LETTER VOCALIC LL -A88C ; [.28FF.0020.0002] # SAURASHTRA LETTER E -A88D ; [.2900.0020.0002] # SAURASHTRA LETTER EE -A88E ; [.2901.0020.0002] # SAURASHTRA LETTER AI -A88F ; [.2902.0020.0002] # SAURASHTRA LETTER O -A890 ; [.2903.0020.0002] # SAURASHTRA LETTER OO -A891 ; [.2904.0020.0002] # SAURASHTRA LETTER AU -A892 ; [.2905.0020.0002] # SAURASHTRA LETTER KA -A893 ; [.2906.0020.0002] # SAURASHTRA LETTER KHA -A894 ; [.2907.0020.0002] # SAURASHTRA LETTER GA -A895 ; [.2908.0020.0002] # SAURASHTRA LETTER GHA -A896 ; [.2909.0020.0002] # SAURASHTRA LETTER NGA -A897 ; [.290A.0020.0002] # SAURASHTRA LETTER CA -A898 ; [.290B.0020.0002] # SAURASHTRA LETTER CHA -A899 ; [.290C.0020.0002] # SAURASHTRA LETTER JA -A89A ; [.290D.0020.0002] # SAURASHTRA LETTER JHA -A89B ; [.290E.0020.0002] # SAURASHTRA LETTER NYA -A89C ; [.290F.0020.0002] # SAURASHTRA LETTER TTA -A89D ; [.2910.0020.0002] # SAURASHTRA LETTER TTHA -A89E ; [.2911.0020.0002] # SAURASHTRA LETTER DDA -A89F ; [.2912.0020.0002] # SAURASHTRA LETTER DDHA -A8A0 ; [.2913.0020.0002] # SAURASHTRA LETTER NNA -A8A1 ; [.2914.0020.0002] # SAURASHTRA LETTER TA -A8A2 ; [.2915.0020.0002] # SAURASHTRA LETTER THA -A8A3 ; [.2916.0020.0002] # SAURASHTRA LETTER DA -A8A4 ; [.2917.0020.0002] # SAURASHTRA LETTER DHA -A8A5 ; [.2918.0020.0002] # SAURASHTRA LETTER NA -A8A6 ; [.2919.0020.0002] # SAURASHTRA LETTER PA -A8A7 ; [.291A.0020.0002] # SAURASHTRA LETTER PHA -A8A8 ; [.291B.0020.0002] # SAURASHTRA LETTER BA -A8A9 ; [.291C.0020.0002] # SAURASHTRA LETTER BHA -A8AA ; [.291D.0020.0002] # SAURASHTRA LETTER MA -A8AB ; [.291E.0020.0002] # SAURASHTRA LETTER YA -A8AC ; [.291F.0020.0002] # SAURASHTRA LETTER RA -A8AD ; [.2920.0020.0002] # SAURASHTRA LETTER LA -A8AE ; [.2921.0020.0002] # SAURASHTRA LETTER VA -A8AF ; [.2922.0020.0002] # SAURASHTRA LETTER SHA -A8B0 ; [.2923.0020.0002] # SAURASHTRA LETTER SSA -A8B1 ; [.2924.0020.0002] # SAURASHTRA LETTER SA -A8B2 ; [.2925.0020.0002] # SAURASHTRA LETTER HA -A8B3 ; [.2926.0020.0002] # SAURASHTRA LETTER LLA -A8B4 ; [.2927.0020.0002] # SAURASHTRA CONSONANT SIGN HAARU -A8B5 ; [.2928.0020.0002] # SAURASHTRA VOWEL SIGN AA -A8B6 ; [.2929.0020.0002] # SAURASHTRA VOWEL SIGN I -A8B7 ; [.292A.0020.0002] # SAURASHTRA VOWEL SIGN II -A8B8 ; [.292B.0020.0002] # SAURASHTRA VOWEL SIGN U -A8B9 ; [.292C.0020.0002] # SAURASHTRA VOWEL SIGN UU -A8BA ; [.292D.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC R -A8BB ; [.292E.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC RR -A8BC ; [.292F.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC L -A8BD ; [.2930.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC LL -A8BE ; [.2931.0020.0002] # SAURASHTRA VOWEL SIGN E -A8BF ; [.2932.0020.0002] # SAURASHTRA VOWEL SIGN EE -A8C0 ; [.2933.0020.0002] # SAURASHTRA VOWEL SIGN AI -A8C1 ; [.2934.0020.0002] # SAURASHTRA VOWEL SIGN O -A8C2 ; [.2935.0020.0002] # SAURASHTRA VOWEL SIGN OO -A8C3 ; [.2936.0020.0002] # SAURASHTRA VOWEL SIGN AU -A8C4 ; [.2937.0020.0002] # SAURASHTRA SIGN VIRAMA -11083 ; [.2938.0020.0002] # KAITHI LETTER A -11084 ; [.2939.0020.0002] # KAITHI LETTER AA -11085 ; [.293A.0020.0002] # KAITHI LETTER I -11086 ; [.293B.0020.0002] # KAITHI LETTER II -11087 ; [.293C.0020.0002] # KAITHI LETTER U -11088 ; [.293D.0020.0002] # KAITHI LETTER UU -11089 ; [.293E.0020.0002] # KAITHI LETTER E -1108A ; [.293F.0020.0002] # KAITHI LETTER AI -1108B ; [.2940.0020.0002] # KAITHI LETTER O -1108C ; [.2941.0020.0002] # KAITHI LETTER AU -1108D ; [.2942.0020.0002] # KAITHI LETTER KA -1108E ; [.2943.0020.0002] # KAITHI LETTER KHA -1108F ; [.2944.0020.0002] # KAITHI LETTER GA -11090 ; [.2945.0020.0002] # KAITHI LETTER GHA -11091 ; [.2946.0020.0002] # KAITHI LETTER NGA -11092 ; [.2947.0020.0002] # KAITHI LETTER CA -11093 ; [.2948.0020.0002] # KAITHI LETTER CHA -11094 ; [.2949.0020.0002] # KAITHI LETTER JA -11095 ; [.294A.0020.0002] # KAITHI LETTER JHA -11096 ; [.294B.0020.0002] # KAITHI LETTER NYA -11097 ; [.294C.0020.0002] # KAITHI LETTER TTA -11098 ; [.294D.0020.0002] # KAITHI LETTER TTHA -11099 ; [.294E.0020.0002] # KAITHI LETTER DDA -1109A ; [.294E.0020.0002][.0000.00BD.0002] # KAITHI LETTER DDDHA -1109B ; [.294F.0020.0002] # KAITHI LETTER DDHA -1109C ; [.294F.0020.0002][.0000.00BD.0002] # KAITHI LETTER RHA -1109D ; [.2950.0020.0002] # KAITHI LETTER NNA -1109E ; [.2951.0020.0002] # KAITHI LETTER TA -1109F ; [.2952.0020.0002] # KAITHI LETTER THA -110A0 ; [.2953.0020.0002] # KAITHI LETTER DA -110A1 ; [.2954.0020.0002] # KAITHI LETTER DHA -110A2 ; [.2955.0020.0002] # KAITHI LETTER NA -110A3 ; [.2956.0020.0002] # KAITHI LETTER PA -110A4 ; [.2957.0020.0002] # KAITHI LETTER PHA -110A5 ; [.2958.0020.0002] # KAITHI LETTER BA -110AB ; [.2958.0020.0002][.0000.00BD.0002] # KAITHI LETTER VA -110A6 ; [.2959.0020.0002] # KAITHI LETTER BHA -110A7 ; [.295A.0020.0002] # KAITHI LETTER MA -110A8 ; [.295B.0020.0002] # KAITHI LETTER YA -110A9 ; [.295C.0020.0002] # KAITHI LETTER RA -110AA ; [.295D.0020.0002] # KAITHI LETTER LA -110AC ; [.295E.0020.0002] # KAITHI LETTER SHA -110AD ; [.295F.0020.0002] # KAITHI LETTER SSA -110AE ; [.2960.0020.0002] # KAITHI LETTER SA -110AF ; [.2961.0020.0002] # KAITHI LETTER HA -110B0 ; [.2962.0020.0002] # KAITHI VOWEL SIGN AA -110B1 ; [.2963.0020.0002] # KAITHI VOWEL SIGN I -110B2 ; [.2964.0020.0002] # KAITHI VOWEL SIGN II -110B3 ; [.2965.0020.0002] # KAITHI VOWEL SIGN U -110B4 ; [.2966.0020.0002] # KAITHI VOWEL SIGN UU -110B5 ; [.2967.0020.0002] # KAITHI VOWEL SIGN E -110B6 ; [.2968.0020.0002] # KAITHI VOWEL SIGN AI -110B7 ; [.2969.0020.0002] # KAITHI VOWEL SIGN O -110B8 ; [.296A.0020.0002] # KAITHI VOWEL SIGN AU -110B9 ; [.296B.0020.0002] # KAITHI SIGN VIRAMA -11150 ; [.296C.0020.0002] # MAHAJANI LETTER A -11151 ; [.296D.0020.0002] # MAHAJANI LETTER I -11152 ; [.296E.0020.0002] # MAHAJANI LETTER U -11153 ; [.296F.0020.0002] # MAHAJANI LETTER E -11154 ; [.2970.0020.0002] # MAHAJANI LETTER O -11155 ; [.2971.0020.0002] # MAHAJANI LETTER KA -11156 ; [.2972.0020.0002] # MAHAJANI LETTER KHA -11157 ; [.2973.0020.0002] # MAHAJANI LETTER GA -11158 ; [.2974.0020.0002] # MAHAJANI LETTER GHA -11159 ; [.2975.0020.0002] # MAHAJANI LETTER CA -1115A ; [.2976.0020.0002] # MAHAJANI LETTER CHA -1115B ; [.2977.0020.0002] # MAHAJANI LETTER JA -1115C ; [.2978.0020.0002] # MAHAJANI LETTER JHA -1115D ; [.2979.0020.0002] # MAHAJANI LETTER NYA -1115E ; [.297A.0020.0002] # MAHAJANI LETTER TTA -1115F ; [.297B.0020.0002] # MAHAJANI LETTER TTHA -11160 ; [.297C.0020.0002] # MAHAJANI LETTER DDA -11161 ; [.297D.0020.0002] # MAHAJANI LETTER DDHA -11162 ; [.297E.0020.0002] # MAHAJANI LETTER NNA -11163 ; [.297F.0020.0002] # MAHAJANI LETTER TA -11164 ; [.2980.0020.0002] # MAHAJANI LETTER THA -11165 ; [.2981.0020.0002] # MAHAJANI LETTER DA -11166 ; [.2982.0020.0002] # MAHAJANI LETTER DHA -11167 ; [.2983.0020.0002] # MAHAJANI LETTER NA -11168 ; [.2984.0020.0002] # MAHAJANI LETTER PA -11169 ; [.2985.0020.0002] # MAHAJANI LETTER PHA -1116A ; [.2986.0020.0002] # MAHAJANI LETTER BA -1116B ; [.2987.0020.0002] # MAHAJANI LETTER BHA -1116C ; [.2988.0020.0002] # MAHAJANI LETTER MA -1116D ; [.2989.0020.0002] # MAHAJANI LETTER RA -1116E ; [.298A.0020.0002] # MAHAJANI LETTER LA -1116F ; [.298B.0020.0002] # MAHAJANI LETTER VA -11176 ; [.298C.0020.0002] # MAHAJANI LIGATURE SHRI -11170 ; [.298D.0020.0002] # MAHAJANI LETTER SA -11171 ; [.298E.0020.0002] # MAHAJANI LETTER HA -11172 ; [.298F.0020.0002] # MAHAJANI LETTER RRA -111C4 ; [.2990.0020.0002] # SHARADA OM -111DA ; [.2991.0020.0002] # SHARADA EKAM -11183 ; [.2992.0020.0002] # SHARADA LETTER A -11184 ; [.2993.0020.0002] # SHARADA LETTER AA -11185 ; [.2994.0020.0002] # SHARADA LETTER I -11186 ; [.2995.0020.0002] # SHARADA LETTER II -11187 ; [.2996.0020.0002] # SHARADA LETTER U -11188 ; [.2997.0020.0002] # SHARADA LETTER UU -11189 ; [.2998.0020.0002] # SHARADA LETTER VOCALIC R -1118A ; [.2999.0020.0002] # SHARADA LETTER VOCALIC RR -1118B ; [.299A.0020.0002] # SHARADA LETTER VOCALIC L -1118C ; [.299B.0020.0002] # SHARADA LETTER VOCALIC LL -1118D ; [.299C.0020.0002] # SHARADA LETTER E -1118E ; [.299D.0020.0002] # SHARADA LETTER AI -1118F ; [.299E.0020.0002] # SHARADA LETTER O -11190 ; [.299F.0020.0002] # SHARADA LETTER AU -11191 ; [.29A0.0020.0002] # SHARADA LETTER KA -11192 ; [.29A1.0020.0002] # SHARADA LETTER KHA -11193 ; [.29A2.0020.0002] # SHARADA LETTER GA -11194 ; [.29A3.0020.0002] # SHARADA LETTER GHA -11195 ; [.29A4.0020.0002] # SHARADA LETTER NGA -11196 ; [.29A5.0020.0002] # SHARADA LETTER CA -11197 ; [.29A6.0020.0002] # SHARADA LETTER CHA -11198 ; [.29A7.0020.0002] # SHARADA LETTER JA -11199 ; [.29A8.0020.0002] # SHARADA LETTER JHA -1119A ; [.29A9.0020.0002] # SHARADA LETTER NYA -1119B ; [.29AA.0020.0002] # SHARADA LETTER TTA -1119C ; [.29AB.0020.0002] # SHARADA LETTER TTHA -1119D ; [.29AC.0020.0002] # SHARADA LETTER DDA -1119E ; [.29AD.0020.0002] # SHARADA LETTER DDHA -1119F ; [.29AE.0020.0002] # SHARADA LETTER NNA -111A0 ; [.29AF.0020.0002] # SHARADA LETTER TA -111A1 ; [.29B0.0020.0002] # SHARADA LETTER THA -111A2 ; [.29B1.0020.0002] # SHARADA LETTER DA -111A3 ; [.29B2.0020.0002] # SHARADA LETTER DHA -111A4 ; [.29B3.0020.0002] # SHARADA LETTER NA -111A5 ; [.29B4.0020.0002] # SHARADA LETTER PA -111A6 ; [.29B5.0020.0002] # SHARADA LETTER PHA -111A7 ; [.29B6.0020.0002] # SHARADA LETTER BA -111A8 ; [.29B7.0020.0002] # SHARADA LETTER BHA -111A9 ; [.29B8.0020.0002] # SHARADA LETTER MA -111AA ; [.29B9.0020.0002] # SHARADA LETTER YA -111AB ; [.29BA.0020.0002] # SHARADA LETTER RA -111AC ; [.29BB.0020.0002] # SHARADA LETTER LA -111AD ; [.29BC.0020.0002] # SHARADA LETTER LLA -111AE ; [.29BD.0020.0002] # SHARADA LETTER VA -111AF ; [.29BE.0020.0002] # SHARADA LETTER SHA -111B0 ; [.29BF.0020.0002] # SHARADA LETTER SSA -111B1 ; [.29C0.0020.0002] # SHARADA LETTER SA -111B2 ; [.29C1.0020.0002] # SHARADA LETTER HA -111C1 ; [.29C2.0020.0002] # SHARADA SIGN AVAGRAHA -111C2 ; [.29C3.0020.0002] # SHARADA SIGN JIHVAMULIYA -111C3 ; [.29C4.0020.0002] # SHARADA SIGN UPADHMANIYA -111DC ; [.29C5.0020.0002] # SHARADA HEADSTROKE -111B3 ; [.29C6.0020.0002] # SHARADA VOWEL SIGN AA -111B4 ; [.29C7.0020.0002] # SHARADA VOWEL SIGN I -111B5 ; [.29C8.0020.0002] # SHARADA VOWEL SIGN II -111B6 ; [.29C9.0020.0002] # SHARADA VOWEL SIGN U -111B7 ; [.29CA.0020.0002] # SHARADA VOWEL SIGN UU -111B8 ; [.29CB.0020.0002] # SHARADA VOWEL SIGN VOCALIC R -111B9 ; [.29CC.0020.0002] # SHARADA VOWEL SIGN VOCALIC RR -111BA ; [.29CD.0020.0002] # SHARADA VOWEL SIGN VOCALIC L -111BB ; [.29CE.0020.0002] # SHARADA VOWEL SIGN VOCALIC LL -111BC ; [.29CF.0020.0002] # SHARADA VOWEL SIGN E -111BD ; [.29D0.0020.0002] # SHARADA VOWEL SIGN AI -111BE ; [.29D1.0020.0002] # SHARADA VOWEL SIGN O -111BF ; [.29D2.0020.0002] # SHARADA VOWEL SIGN AU -111C0 ; [.29D3.0020.0002] # SHARADA SIGN VIRAMA -11200 ; [.29D4.0020.0002] # KHOJKI LETTER A -11201 ; [.29D5.0020.0002] # KHOJKI LETTER AA -11202 ; [.29D6.0020.0002] # KHOJKI LETTER I -11203 ; [.29D7.0020.0002] # KHOJKI LETTER U -11204 ; [.29D8.0020.0002] # KHOJKI LETTER E -11205 ; [.29D9.0020.0002] # KHOJKI LETTER AI -11206 ; [.29DA.0020.0002] # KHOJKI LETTER O -11207 ; [.29DB.0020.0002] # KHOJKI LETTER AU -11208 ; [.29DC.0020.0002] # KHOJKI LETTER KA -11209 ; [.29DD.0020.0002] # KHOJKI LETTER KHA -1120A ; [.29DE.0020.0002] # KHOJKI LETTER GA -1120B ; [.29DF.0020.0002] # KHOJKI LETTER GGA -1120C ; [.29E0.0020.0002] # KHOJKI LETTER GHA -1120D ; [.29E1.0020.0002] # KHOJKI LETTER NGA -1120E ; [.29E2.0020.0002] # KHOJKI LETTER CA -1120F ; [.29E3.0020.0002] # KHOJKI LETTER CHA -11210 ; [.29E4.0020.0002] # KHOJKI LETTER JA -11211 ; [.29E5.0020.0002] # KHOJKI LETTER JJA -11213 ; [.29E6.0020.0002] # KHOJKI LETTER NYA -11214 ; [.29E7.0020.0002] # KHOJKI LETTER TTA -11215 ; [.29E8.0020.0002] # KHOJKI LETTER TTHA -11216 ; [.29E9.0020.0002] # KHOJKI LETTER DDA -11217 ; [.29EA.0020.0002] # KHOJKI LETTER DDHA -11218 ; [.29EB.0020.0002] # KHOJKI LETTER NNA -11219 ; [.29EC.0020.0002] # KHOJKI LETTER TA -1121A ; [.29ED.0020.0002] # KHOJKI LETTER THA -1121B ; [.29EE.0020.0002] # KHOJKI LETTER DA -1121C ; [.29EF.0020.0002] # KHOJKI LETTER DDDA -1121D ; [.29F0.0020.0002] # KHOJKI LETTER DHA -1121E ; [.29F1.0020.0002] # KHOJKI LETTER NA -1121F ; [.29F2.0020.0002] # KHOJKI LETTER PA -11220 ; [.29F3.0020.0002] # KHOJKI LETTER PHA -11221 ; [.29F4.0020.0002] # KHOJKI LETTER BA -11222 ; [.29F5.0020.0002] # KHOJKI LETTER BBA -11223 ; [.29F6.0020.0002] # KHOJKI LETTER BHA -11224 ; [.29F7.0020.0002] # KHOJKI LETTER MA -11225 ; [.29F8.0020.0002] # KHOJKI LETTER YA -11226 ; [.29F9.0020.0002] # KHOJKI LETTER RA -11227 ; [.29FA.0020.0002] # KHOJKI LETTER LA -11228 ; [.29FB.0020.0002] # KHOJKI LETTER VA -11229 ; [.29FC.0020.0002] # KHOJKI LETTER SA -1122A ; [.29FD.0020.0002] # KHOJKI LETTER HA -1122B ; [.29FE.0020.0002] # KHOJKI LETTER LLA -1122C ; [.29FF.0020.0002] # KHOJKI VOWEL SIGN AA -1122D ; [.2A00.0020.0002] # KHOJKI VOWEL SIGN I -1122E ; [.2A01.0020.0002] # KHOJKI VOWEL SIGN II -1122F ; [.2A02.0020.0002] # KHOJKI VOWEL SIGN U -11230 ; [.2A03.0020.0002] # KHOJKI VOWEL SIGN E -11231 ; [.2A04.0020.0002] # KHOJKI VOWEL SIGN AI -11232 ; [.2A05.0020.0002] # KHOJKI VOWEL SIGN O -11233 ; [.2A06.0020.0002] # KHOJKI VOWEL SIGN AU -11235 ; [.2A07.0020.0002] # KHOJKI SIGN VIRAMA -112B0 ; [.2A08.0020.0002] # KHUDAWADI LETTER A -112B1 ; [.2A09.0020.0002] # KHUDAWADI LETTER AA -112B2 ; [.2A0A.0020.0002] # KHUDAWADI LETTER I -112B3 ; [.2A0B.0020.0002] # KHUDAWADI LETTER II -112B4 ; [.2A0C.0020.0002] # KHUDAWADI LETTER U -112B5 ; [.2A0D.0020.0002] # KHUDAWADI LETTER UU -112B6 ; [.2A0E.0020.0002] # KHUDAWADI LETTER E -112B7 ; [.2A0F.0020.0002] # KHUDAWADI LETTER AI -112B8 ; [.2A10.0020.0002] # KHUDAWADI LETTER O -112B9 ; [.2A11.0020.0002] # KHUDAWADI LETTER AU -112BA ; [.2A12.0020.0002] # KHUDAWADI LETTER KA -112BB ; [.2A13.0020.0002] # KHUDAWADI LETTER KHA -112BC ; [.2A14.0020.0002] # KHUDAWADI LETTER GA -112BD ; [.2A15.0020.0002] # KHUDAWADI LETTER GGA -112BE ; [.2A16.0020.0002] # KHUDAWADI LETTER GHA -112BF ; [.2A17.0020.0002] # KHUDAWADI LETTER NGA -112C0 ; [.2A18.0020.0002] # KHUDAWADI LETTER CA -112C1 ; [.2A19.0020.0002] # KHUDAWADI LETTER CHA -112C2 ; [.2A1A.0020.0002] # KHUDAWADI LETTER JA -112C3 ; [.2A1B.0020.0002] # KHUDAWADI LETTER JJA -112C4 ; [.2A1C.0020.0002] # KHUDAWADI LETTER JHA -112C5 ; [.2A1D.0020.0002] # KHUDAWADI LETTER NYA -112C6 ; [.2A1E.0020.0002] # KHUDAWADI LETTER TTA -112C7 ; [.2A1F.0020.0002] # KHUDAWADI LETTER TTHA -112C8 ; [.2A20.0020.0002] # KHUDAWADI LETTER DDA -112C9 ; [.2A21.0020.0002] # KHUDAWADI LETTER DDDA -112CA ; [.2A22.0020.0002] # KHUDAWADI LETTER RRA -112CB ; [.2A23.0020.0002] # KHUDAWADI LETTER DDHA -112CC ; [.2A24.0020.0002] # KHUDAWADI LETTER NNA -112CD ; [.2A25.0020.0002] # KHUDAWADI LETTER TA -112CE ; [.2A26.0020.0002] # KHUDAWADI LETTER THA -112CF ; [.2A27.0020.0002] # KHUDAWADI LETTER DA -112D0 ; [.2A28.0020.0002] # KHUDAWADI LETTER DHA -112D1 ; [.2A29.0020.0002] # KHUDAWADI LETTER NA -112D2 ; [.2A2A.0020.0002] # KHUDAWADI LETTER PA -112D3 ; [.2A2B.0020.0002] # KHUDAWADI LETTER PHA -112D4 ; [.2A2C.0020.0002] # KHUDAWADI LETTER BA -112D5 ; [.2A2D.0020.0002] # KHUDAWADI LETTER BBA -112D6 ; [.2A2E.0020.0002] # KHUDAWADI LETTER BHA -112D7 ; [.2A2F.0020.0002] # KHUDAWADI LETTER MA -112D8 ; [.2A30.0020.0002] # KHUDAWADI LETTER YA -112D9 ; [.2A31.0020.0002] # KHUDAWADI LETTER RA -112DA ; [.2A32.0020.0002] # KHUDAWADI LETTER LA -112DB ; [.2A33.0020.0002] # KHUDAWADI LETTER VA -112DC ; [.2A34.0020.0002] # KHUDAWADI LETTER SHA -112DD ; [.2A35.0020.0002] # KHUDAWADI LETTER SA -112DE ; [.2A36.0020.0002] # KHUDAWADI LETTER HA -112E0 ; [.2A37.0020.0002] # KHUDAWADI VOWEL SIGN AA -112E1 ; [.2A38.0020.0002] # KHUDAWADI VOWEL SIGN I -112E2 ; [.2A39.0020.0002] # KHUDAWADI VOWEL SIGN II -112E3 ; [.2A3A.0020.0002] # KHUDAWADI VOWEL SIGN U -112E4 ; [.2A3B.0020.0002] # KHUDAWADI VOWEL SIGN UU -112E5 ; [.2A3C.0020.0002] # KHUDAWADI VOWEL SIGN E -112E6 ; [.2A3D.0020.0002] # KHUDAWADI VOWEL SIGN AI -112E7 ; [.2A3E.0020.0002] # KHUDAWADI VOWEL SIGN O -112E8 ; [.2A3F.0020.0002] # KHUDAWADI VOWEL SIGN AU -112EA ; [.2A40.0020.0002] # KHUDAWADI SIGN VIRAMA -11280 ; [.2A41.0020.0002] # MULTANI LETTER A -11281 ; [.2A42.0020.0002] # MULTANI LETTER I -11282 ; [.2A43.0020.0002] # MULTANI LETTER U -11283 ; [.2A44.0020.0002] # MULTANI LETTER E -112A5 ; [.2A45.0020.0002] # MULTANI LETTER SA -112A6 ; [.2A46.0020.0002] # MULTANI LETTER HA -11284 ; [.2A47.0020.0002] # MULTANI LETTER KA -11285 ; [.2A48.0020.0002] # MULTANI LETTER KHA -11286 ; [.2A49.0020.0002] # MULTANI LETTER GA -11288 ; [.2A4A.0020.0002] # MULTANI LETTER GHA -1128A ; [.2A4B.0020.0002] # MULTANI LETTER CA -1128B ; [.2A4C.0020.0002] # MULTANI LETTER CHA -1128C ; [.2A4D.0020.0002] # MULTANI LETTER JA -1128D ; [.2A4E.0020.0002] # MULTANI LETTER JJA -1128F ; [.2A4F.0020.0002] # MULTANI LETTER NYA -11290 ; [.2A50.0020.0002] # MULTANI LETTER TTA -11291 ; [.2A51.0020.0002] # MULTANI LETTER TTHA -11292 ; [.2A52.0020.0002] # MULTANI LETTER DDA -11293 ; [.2A53.0020.0002] # MULTANI LETTER DDDA -11294 ; [.2A54.0020.0002] # MULTANI LETTER DDHA -11295 ; [.2A55.0020.0002] # MULTANI LETTER NNA -11296 ; [.2A56.0020.0002] # MULTANI LETTER TA -11297 ; [.2A57.0020.0002] # MULTANI LETTER THA -11298 ; [.2A58.0020.0002] # MULTANI LETTER DA -11299 ; [.2A59.0020.0002] # MULTANI LETTER DHA -1129A ; [.2A5A.0020.0002] # MULTANI LETTER NA -1129B ; [.2A5B.0020.0002] # MULTANI LETTER PA -1129C ; [.2A5C.0020.0002] # MULTANI LETTER PHA -1129D ; [.2A5D.0020.0002] # MULTANI LETTER BA -1129F ; [.2A5E.0020.0002] # MULTANI LETTER BHA -112A0 ; [.2A5F.0020.0002] # MULTANI LETTER MA -112A1 ; [.2A60.0020.0002] # MULTANI LETTER YA -112A2 ; [.2A61.0020.0002] # MULTANI LETTER RA -112A3 ; [.2A62.0020.0002] # MULTANI LETTER LA -112A4 ; [.2A63.0020.0002] # MULTANI LETTER VA -112A7 ; [.2A64.0020.0002] # MULTANI LETTER RRA -112A8 ; [.2A65.0020.0002] # MULTANI LETTER RHA -11350 ; [.2A66.0020.0002] # GRANTHA OM -11305 ; [.2A67.0020.0002] # GRANTHA LETTER A -11306 ; [.2A68.0020.0002] # GRANTHA LETTER AA -11307 ; [.2A69.0020.0002] # GRANTHA LETTER I -11308 ; [.2A6A.0020.0002] # GRANTHA LETTER II -11309 ; [.2A6B.0020.0002] # GRANTHA LETTER U -1130A ; [.2A6C.0020.0002] # GRANTHA LETTER UU -1130B ; [.2A6D.0020.0002] # GRANTHA LETTER VOCALIC R -11360 ; [.2A6E.0020.0002] # GRANTHA LETTER VOCALIC RR -1130C ; [.2A6F.0020.0002] # GRANTHA LETTER VOCALIC L -11361 ; [.2A70.0020.0002] # GRANTHA LETTER VOCALIC LL -1130F ; [.2A71.0020.0002] # GRANTHA LETTER EE -11310 ; [.2A72.0020.0002] # GRANTHA LETTER AI -11313 ; [.2A73.0020.0002] # GRANTHA LETTER OO -11314 ; [.2A74.0020.0002] # GRANTHA LETTER AU -11315 ; [.2A75.0020.0002] # GRANTHA LETTER KA -11316 ; [.2A76.0020.0002] # GRANTHA LETTER KHA -11317 ; [.2A77.0020.0002] # GRANTHA LETTER GA -11318 ; [.2A78.0020.0002] # GRANTHA LETTER GHA -11319 ; [.2A79.0020.0002] # GRANTHA LETTER NGA -1131A ; [.2A7A.0020.0002] # GRANTHA LETTER CA -1131B ; [.2A7B.0020.0002] # GRANTHA LETTER CHA -1131C ; [.2A7C.0020.0002] # GRANTHA LETTER JA -1131D ; [.2A7D.0020.0002] # GRANTHA LETTER JHA -1131E ; [.2A7E.0020.0002] # GRANTHA LETTER NYA -1131F ; [.2A7F.0020.0002] # GRANTHA LETTER TTA -11320 ; [.2A80.0020.0002] # GRANTHA LETTER TTHA -11321 ; [.2A81.0020.0002] # GRANTHA LETTER DDA -11322 ; [.2A82.0020.0002] # GRANTHA LETTER DDHA -11323 ; [.2A83.0020.0002] # GRANTHA LETTER NNA -11324 ; [.2A84.0020.0002] # GRANTHA LETTER TA -11325 ; [.2A85.0020.0002] # GRANTHA LETTER THA -11326 ; [.2A86.0020.0002] # GRANTHA LETTER DA -11327 ; [.2A87.0020.0002] # GRANTHA LETTER DHA -11328 ; [.2A88.0020.0002] # GRANTHA LETTER NA -1132A ; [.2A89.0020.0002] # GRANTHA LETTER PA -1132B ; [.2A8A.0020.0002] # GRANTHA LETTER PHA -1132C ; [.2A8B.0020.0002] # GRANTHA LETTER BA -1132D ; [.2A8C.0020.0002] # GRANTHA LETTER BHA -1132E ; [.2A8D.0020.0002] # GRANTHA LETTER MA -1132F ; [.2A8E.0020.0002] # GRANTHA LETTER YA -11330 ; [.2A8F.0020.0002] # GRANTHA LETTER RA -11332 ; [.2A90.0020.0002] # GRANTHA LETTER LA -11333 ; [.2A91.0020.0002] # GRANTHA LETTER LLA -11335 ; [.2A92.0020.0002] # GRANTHA LETTER VA -11336 ; [.2A93.0020.0002] # GRANTHA LETTER SHA -11337 ; [.2A94.0020.0002] # GRANTHA LETTER SSA -11338 ; [.2A95.0020.0002] # GRANTHA LETTER SA -11339 ; [.2A96.0020.0002] # GRANTHA LETTER HA -1133D ; [.2A97.0020.0002] # GRANTHA SIGN AVAGRAHA -1135E ; [.2A98.0020.0002] # GRANTHA LETTER VEDIC ANUSVARA -1135F ; [.2A99.0020.0002] # GRANTHA LETTER VEDIC DOUBLE ANUSVARA -1133E ; [.2A9A.0020.0002] # GRANTHA VOWEL SIGN AA -1133F ; [.2A9B.0020.0002] # GRANTHA VOWEL SIGN I -11340 ; [.2A9C.0020.0002] # GRANTHA VOWEL SIGN II -11341 ; [.2A9D.0020.0002] # GRANTHA VOWEL SIGN U -11342 ; [.2A9E.0020.0002] # GRANTHA VOWEL SIGN UU -11343 ; [.2A9F.0020.0002] # GRANTHA VOWEL SIGN VOCALIC R -11344 ; [.2AA0.0020.0002] # GRANTHA VOWEL SIGN VOCALIC RR -11362 ; [.2AA1.0020.0002] # GRANTHA VOWEL SIGN VOCALIC L -11363 ; [.2AA2.0020.0002] # GRANTHA VOWEL SIGN VOCALIC LL -11347 ; [.2AA3.0020.0002] # GRANTHA VOWEL SIGN EE -11348 ; [.2AA4.0020.0002] # GRANTHA VOWEL SIGN AI -1134B ; [.2AA5.0020.0002] # GRANTHA VOWEL SIGN OO -11347 1133E ; [.2AA5.0020.0002] # GRANTHA VOWEL SIGN OO -1134C ; [.2AA6.0020.0002] # GRANTHA VOWEL SIGN AU -11347 11357 ; [.2AA6.0020.0002] # GRANTHA VOWEL SIGN AU -1134D ; [.2AA7.0020.0002] # GRANTHA SIGN VIRAMA -11357 ; [.2AA8.0020.0002] # GRANTHA AU LENGTH MARK -1135D ; [.2AA9.0020.0002] # GRANTHA SIGN PLUTA -114C7 ; [.2AAA.0020.0002] # TIRHUTA OM -11480 ; [.2AAB.0020.0002] # TIRHUTA ANJI -11481 ; [.2AAC.0020.0002] # TIRHUTA LETTER A -11482 ; [.2AAD.0020.0002] # TIRHUTA LETTER AA -11483 ; [.2AAE.0020.0002] # TIRHUTA LETTER I -11484 ; [.2AAF.0020.0002] # TIRHUTA LETTER II -11485 ; [.2AB0.0020.0002] # TIRHUTA LETTER U -11486 ; [.2AB1.0020.0002] # TIRHUTA LETTER UU -11487 ; [.2AB2.0020.0002] # TIRHUTA LETTER VOCALIC R -11488 ; [.2AB3.0020.0002] # TIRHUTA LETTER VOCALIC RR -11489 ; [.2AB4.0020.0002] # TIRHUTA LETTER VOCALIC L -1148A ; [.2AB5.0020.0002] # TIRHUTA LETTER VOCALIC LL -1148B ; [.2AB6.0020.0002] # TIRHUTA LETTER E -1148C ; [.2AB7.0020.0002] # TIRHUTA LETTER AI -1148D ; [.2AB8.0020.0002] # TIRHUTA LETTER O -1148E ; [.2AB9.0020.0002] # TIRHUTA LETTER AU -1148F ; [.2ABA.0020.0002] # TIRHUTA LETTER KA -11490 ; [.2ABB.0020.0002] # TIRHUTA LETTER KHA -11491 ; [.2ABC.0020.0002] # TIRHUTA LETTER GA -11492 ; [.2ABD.0020.0002] # TIRHUTA LETTER GHA -11493 ; [.2ABE.0020.0002] # TIRHUTA LETTER NGA -11494 ; [.2ABF.0020.0002] # TIRHUTA LETTER CA -11495 ; [.2AC0.0020.0002] # TIRHUTA LETTER CHA -11496 ; [.2AC1.0020.0002] # TIRHUTA LETTER JA -11497 ; [.2AC2.0020.0002] # TIRHUTA LETTER JHA -11498 ; [.2AC3.0020.0002] # TIRHUTA LETTER NYA -11499 ; [.2AC4.0020.0002] # TIRHUTA LETTER TTA -1149A ; [.2AC5.0020.0002] # TIRHUTA LETTER TTHA -1149B ; [.2AC6.0020.0002] # TIRHUTA LETTER DDA -1149C ; [.2AC7.0020.0002] # TIRHUTA LETTER DDHA -1149D ; [.2AC8.0020.0002] # TIRHUTA LETTER NNA -1149E ; [.2AC9.0020.0002] # TIRHUTA LETTER TA -1149F ; [.2ACA.0020.0002] # TIRHUTA LETTER THA -114A0 ; [.2ACB.0020.0002] # TIRHUTA LETTER DA -114A1 ; [.2ACC.0020.0002] # TIRHUTA LETTER DHA -114A2 ; [.2ACD.0020.0002] # TIRHUTA LETTER NA -114A3 ; [.2ACE.0020.0002] # TIRHUTA LETTER PA -114A4 ; [.2ACF.0020.0002] # TIRHUTA LETTER PHA -114A5 ; [.2AD0.0020.0002] # TIRHUTA LETTER BA -114A6 ; [.2AD1.0020.0002] # TIRHUTA LETTER BHA -114A7 ; [.2AD2.0020.0002] # TIRHUTA LETTER MA -114A8 ; [.2AD3.0020.0002] # TIRHUTA LETTER YA -114A9 ; [.2AD4.0020.0002] # TIRHUTA LETTER RA -114AA ; [.2AD5.0020.0002] # TIRHUTA LETTER LA -114AB ; [.2AD6.0020.0002] # TIRHUTA LETTER VA -114AC ; [.2AD7.0020.0002] # TIRHUTA LETTER SHA -114AD ; [.2AD8.0020.0002] # TIRHUTA LETTER SSA -114AE ; [.2AD9.0020.0002] # TIRHUTA LETTER SA -114AF ; [.2ADA.0020.0002] # TIRHUTA LETTER HA -114C4 ; [.2ADB.0020.0002] # TIRHUTA SIGN AVAGRAHA -114C5 ; [.2ADC.0020.0002] # TIRHUTA GVANG -114B0 ; [.2ADD.0020.0002] # TIRHUTA VOWEL SIGN AA -114B1 ; [.2ADE.0020.0002] # TIRHUTA VOWEL SIGN I -114B2 ; [.2ADF.0020.0002] # TIRHUTA VOWEL SIGN II -114B3 ; [.2AE0.0020.0002] # TIRHUTA VOWEL SIGN U -114B4 ; [.2AE1.0020.0002] # TIRHUTA VOWEL SIGN UU -114B5 ; [.2AE2.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC R -114B6 ; [.2AE3.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC RR -114B7 ; [.2AE4.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC L -114B8 ; [.2AE5.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC LL -114B9 ; [.2AE6.0020.0002] # TIRHUTA VOWEL SIGN E -114BA ; [.2AE7.0020.0002] # TIRHUTA VOWEL SIGN SHORT E -114BB ; [.2AE8.0020.0002] # TIRHUTA VOWEL SIGN AI -114B9 114BA ; [.2AE8.0020.0002] # TIRHUTA VOWEL SIGN AI -114BC ; [.2AE9.0020.0002] # TIRHUTA VOWEL SIGN O -114B9 114B0 ; [.2AE9.0020.0002] # TIRHUTA VOWEL SIGN O -114BD ; [.2AEA.0020.0002] # TIRHUTA VOWEL SIGN SHORT O -114BE ; [.2AEB.0020.0002] # TIRHUTA VOWEL SIGN AU -114B9 114BD ; [.2AEB.0020.0002] # TIRHUTA VOWEL SIGN AU -114C2 ; [.2AEC.0020.0002] # TIRHUTA SIGN VIRAMA -11580 ; [.2AED.0020.0002] # SIDDHAM LETTER A -11581 ; [.2AEE.0020.0002] # SIDDHAM LETTER AA -11582 ; [.2AEF.0020.0002] # SIDDHAM LETTER I -115D8 ; [.2AEF.0020.0004][.0000.010B.0004] # SIDDHAM LETTER THREE-CIRCLE ALTERNATE I -115D9 ; [.2AEF.0020.0004][.0000.010C.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE I -11583 ; [.2AF0.0020.0002] # SIDDHAM LETTER II -115DA ; [.2AF0.0020.0004][.0000.010B.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE II -11584 ; [.2AF1.0020.0002] # SIDDHAM LETTER U -115DB ; [.2AF1.0020.0004][.0000.010B.0004] # SIDDHAM LETTER ALTERNATE U -11585 ; [.2AF2.0020.0002] # SIDDHAM LETTER UU -11586 ; [.2AF3.0020.0002] # SIDDHAM LETTER VOCALIC R -11587 ; [.2AF4.0020.0002] # SIDDHAM LETTER VOCALIC RR -11588 ; [.2AF5.0020.0002] # SIDDHAM LETTER VOCALIC L -11589 ; [.2AF6.0020.0002] # SIDDHAM LETTER VOCALIC LL -1158A ; [.2AF7.0020.0002] # SIDDHAM LETTER E -1158B ; [.2AF8.0020.0002] # SIDDHAM LETTER AI -1158C ; [.2AF9.0020.0002] # SIDDHAM LETTER O -1158D ; [.2AFA.0020.0002] # SIDDHAM LETTER AU -1158E ; [.2AFB.0020.0002] # SIDDHAM LETTER KA -1158F ; [.2AFC.0020.0002] # SIDDHAM LETTER KHA -11590 ; [.2AFD.0020.0002] # SIDDHAM LETTER GA -11591 ; [.2AFE.0020.0002] # SIDDHAM LETTER GHA -11592 ; [.2AFF.0020.0002] # SIDDHAM LETTER NGA -11593 ; [.2B00.0020.0002] # SIDDHAM LETTER CA -11594 ; [.2B01.0020.0002] # SIDDHAM LETTER CHA -11595 ; [.2B02.0020.0002] # SIDDHAM LETTER JA -11596 ; [.2B03.0020.0002] # SIDDHAM LETTER JHA -11597 ; [.2B04.0020.0002] # SIDDHAM LETTER NYA -11598 ; [.2B05.0020.0002] # SIDDHAM LETTER TTA -11599 ; [.2B06.0020.0002] # SIDDHAM LETTER TTHA -1159A ; [.2B07.0020.0002] # SIDDHAM LETTER DDA -1159B ; [.2B08.0020.0002] # SIDDHAM LETTER DDHA -1159C ; [.2B09.0020.0002] # SIDDHAM LETTER NNA -1159D ; [.2B0A.0020.0002] # SIDDHAM LETTER TA -1159E ; [.2B0B.0020.0002] # SIDDHAM LETTER THA -1159F ; [.2B0C.0020.0002] # SIDDHAM LETTER DA -115A0 ; [.2B0D.0020.0002] # SIDDHAM LETTER DHA -115A1 ; [.2B0E.0020.0002] # SIDDHAM LETTER NA -115A2 ; [.2B0F.0020.0002] # SIDDHAM LETTER PA -115A3 ; [.2B10.0020.0002] # SIDDHAM LETTER PHA -115A4 ; [.2B11.0020.0002] # SIDDHAM LETTER BA -115A5 ; [.2B12.0020.0002] # SIDDHAM LETTER BHA -115A6 ; [.2B13.0020.0002] # SIDDHAM LETTER MA -115A7 ; [.2B14.0020.0002] # SIDDHAM LETTER YA -115A8 ; [.2B15.0020.0002] # SIDDHAM LETTER RA -115A9 ; [.2B16.0020.0002] # SIDDHAM LETTER LA -115AA ; [.2B17.0020.0002] # SIDDHAM LETTER VA -115AB ; [.2B18.0020.0002] # SIDDHAM LETTER SHA -115AC ; [.2B19.0020.0002] # SIDDHAM LETTER SSA -115AD ; [.2B1A.0020.0002] # SIDDHAM LETTER SA -115AE ; [.2B1B.0020.0002] # SIDDHAM LETTER HA -115AF ; [.2B1C.0020.0002] # SIDDHAM VOWEL SIGN AA -115B0 ; [.2B1D.0020.0002] # SIDDHAM VOWEL SIGN I -115B1 ; [.2B1E.0020.0002] # SIDDHAM VOWEL SIGN II -115B2 ; [.2B1F.0020.0002] # SIDDHAM VOWEL SIGN U -115DC ; [.2B1F.0020.0004][.0000.010B.0004] # SIDDHAM VOWEL SIGN ALTERNATE U -115B3 ; [.2B20.0020.0002] # SIDDHAM VOWEL SIGN UU -115DD ; [.2B20.0020.0004][.0000.010B.0004] # SIDDHAM VOWEL SIGN ALTERNATE UU -115B4 ; [.2B21.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC R -115B5 ; [.2B22.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC RR -115B8 ; [.2B23.0020.0002] # SIDDHAM VOWEL SIGN E -115B9 ; [.2B24.0020.0002] # SIDDHAM VOWEL SIGN AI -115BA ; [.2B25.0020.0002] # SIDDHAM VOWEL SIGN O -115B8 115AF ; [.2B25.0020.0002] # SIDDHAM VOWEL SIGN O -115BB ; [.2B26.0020.0002] # SIDDHAM VOWEL SIGN AU -115B9 115AF ; [.2B26.0020.0002] # SIDDHAM VOWEL SIGN AU -115BF ; [.2B27.0020.0002] # SIDDHAM SIGN VIRAMA -11600 ; [.2B28.0020.0002] # MODI LETTER A -11601 ; [.2B29.0020.0002] # MODI LETTER AA -11602 ; [.2B2A.0020.0002] # MODI LETTER I -11603 ; [.2B2B.0020.0002] # MODI LETTER II -11604 ; [.2B2C.0020.0002] # MODI LETTER U -11605 ; [.2B2D.0020.0002] # MODI LETTER UU -11606 ; [.2B2E.0020.0002] # MODI LETTER VOCALIC R -11607 ; [.2B2F.0020.0002] # MODI LETTER VOCALIC RR -11608 ; [.2B30.0020.0002] # MODI LETTER VOCALIC L -11609 ; [.2B31.0020.0002] # MODI LETTER VOCALIC LL -1160A ; [.2B32.0020.0002] # MODI LETTER E -1160B ; [.2B33.0020.0002] # MODI LETTER AI -1160C ; [.2B34.0020.0002] # MODI LETTER O -1160D ; [.2B35.0020.0002] # MODI LETTER AU -1160E ; [.2B36.0020.0002] # MODI LETTER KA -1160F ; [.2B37.0020.0002] # MODI LETTER KHA -11610 ; [.2B38.0020.0002] # MODI LETTER GA -11611 ; [.2B39.0020.0002] # MODI LETTER GHA -11612 ; [.2B3A.0020.0002] # MODI LETTER NGA -11613 ; [.2B3B.0020.0002] # MODI LETTER CA -11614 ; [.2B3C.0020.0002] # MODI LETTER CHA -11615 ; [.2B3D.0020.0002] # MODI LETTER JA -11616 ; [.2B3E.0020.0002] # MODI LETTER JHA -11617 ; [.2B3F.0020.0002] # MODI LETTER NYA -11618 ; [.2B40.0020.0002] # MODI LETTER TTA -11619 ; [.2B41.0020.0002] # MODI LETTER TTHA -1161A ; [.2B42.0020.0002] # MODI LETTER DDA -1161B ; [.2B43.0020.0002] # MODI LETTER DDHA -1161C ; [.2B44.0020.0002] # MODI LETTER NNA -1161D ; [.2B45.0020.0002] # MODI LETTER TA -1161E ; [.2B46.0020.0002] # MODI LETTER THA -1161F ; [.2B47.0020.0002] # MODI LETTER DA -11620 ; [.2B48.0020.0002] # MODI LETTER DHA -11621 ; [.2B49.0020.0002] # MODI LETTER NA -11622 ; [.2B4A.0020.0002] # MODI LETTER PA -11623 ; [.2B4B.0020.0002] # MODI LETTER PHA -11624 ; [.2B4C.0020.0002] # MODI LETTER BA -11625 ; [.2B4D.0020.0002] # MODI LETTER BHA -11626 ; [.2B4E.0020.0002] # MODI LETTER MA -11627 ; [.2B4F.0020.0002] # MODI LETTER YA -11628 ; [.2B50.0020.0002] # MODI LETTER RA -11629 ; [.2B51.0020.0002] # MODI LETTER LA -1162A ; [.2B52.0020.0002] # MODI LETTER VA -1162B ; [.2B53.0020.0002] # MODI LETTER SHA -1162C ; [.2B54.0020.0002] # MODI LETTER SSA -1162D ; [.2B55.0020.0002] # MODI LETTER SA -1162E ; [.2B56.0020.0002] # MODI LETTER HA -1162F ; [.2B57.0020.0002] # MODI LETTER LLA -11630 ; [.2B58.0020.0002] # MODI VOWEL SIGN AA -11631 ; [.2B59.0020.0002] # MODI VOWEL SIGN I -11632 ; [.2B5A.0020.0002] # MODI VOWEL SIGN II -11633 ; [.2B5B.0020.0002] # MODI VOWEL SIGN U -11634 ; [.2B5C.0020.0002] # MODI VOWEL SIGN UU -11635 ; [.2B5D.0020.0002] # MODI VOWEL SIGN VOCALIC R -11636 ; [.2B5E.0020.0002] # MODI VOWEL SIGN VOCALIC RR -11637 ; [.2B5F.0020.0002] # MODI VOWEL SIGN VOCALIC L -11638 ; [.2B60.0020.0002] # MODI VOWEL SIGN VOCALIC LL -11639 ; [.2B61.0020.0002] # MODI VOWEL SIGN E -1163A ; [.2B62.0020.0002] # MODI VOWEL SIGN AI -1163B ; [.2B63.0020.0002] # MODI VOWEL SIGN O -1163C ; [.2B64.0020.0002] # MODI VOWEL SIGN AU -1163F ; [.2B65.0020.0002] # MODI SIGN VIRAMA -11644 ; [.2B66.0020.0002] # MODI SIGN HUVA -11680 ; [.2B67.0020.0002] # TAKRI LETTER A -11681 ; [.2B68.0020.0002] # TAKRI LETTER AA -11682 ; [.2B69.0020.0002] # TAKRI LETTER I -11683 ; [.2B6A.0020.0002] # TAKRI LETTER II -11684 ; [.2B6B.0020.0002] # TAKRI LETTER U -11685 ; [.2B6C.0020.0002] # TAKRI LETTER UU -11686 ; [.2B6D.0020.0002] # TAKRI LETTER E -11687 ; [.2B6E.0020.0002] # TAKRI LETTER AI -11688 ; [.2B6F.0020.0002] # TAKRI LETTER O -11689 ; [.2B70.0020.0002] # TAKRI LETTER AU -116A8 ; [.2B71.0020.0002] # TAKRI LETTER SA -116A7 ; [.2B72.0020.0002] # TAKRI LETTER SHA -116A9 ; [.2B73.0020.0002] # TAKRI LETTER HA -1168A ; [.2B74.0020.0002] # TAKRI LETTER KA -1168B ; [.2B75.0020.0002] # TAKRI LETTER KHA -1168C ; [.2B76.0020.0002] # TAKRI LETTER GA -1168D ; [.2B77.0020.0002] # TAKRI LETTER GHA -1168E ; [.2B78.0020.0002] # TAKRI LETTER NGA -1168F ; [.2B79.0020.0002] # TAKRI LETTER CA -11690 ; [.2B7A.0020.0002] # TAKRI LETTER CHA -11691 ; [.2B7B.0020.0002] # TAKRI LETTER JA -11692 ; [.2B7C.0020.0002] # TAKRI LETTER JHA -11693 ; [.2B7D.0020.0002] # TAKRI LETTER NYA -11694 ; [.2B7E.0020.0002] # TAKRI LETTER TTA -11695 ; [.2B7F.0020.0002] # TAKRI LETTER TTHA -11696 ; [.2B80.0020.0002] # TAKRI LETTER DDA -11697 ; [.2B81.0020.0002] # TAKRI LETTER DDHA -11698 ; [.2B82.0020.0002] # TAKRI LETTER NNA -11699 ; [.2B83.0020.0002] # TAKRI LETTER TA -1169A ; [.2B84.0020.0002] # TAKRI LETTER THA -1169B ; [.2B85.0020.0002] # TAKRI LETTER DA -1169C ; [.2B86.0020.0002] # TAKRI LETTER DHA -1169D ; [.2B87.0020.0002] # TAKRI LETTER NA -1169E ; [.2B88.0020.0002] # TAKRI LETTER PA -1169F ; [.2B89.0020.0002] # TAKRI LETTER PHA -116A0 ; [.2B8A.0020.0002] # TAKRI LETTER BA -116A1 ; [.2B8B.0020.0002] # TAKRI LETTER BHA -116A2 ; [.2B8C.0020.0002] # TAKRI LETTER MA -116A3 ; [.2B8D.0020.0002] # TAKRI LETTER YA -116A4 ; [.2B8E.0020.0002] # TAKRI LETTER RA -116A5 ; [.2B8F.0020.0002] # TAKRI LETTER LA -116A6 ; [.2B90.0020.0002] # TAKRI LETTER VA -116AA ; [.2B91.0020.0002] # TAKRI LETTER RRA -116AD ; [.2B92.0020.0002] # TAKRI VOWEL SIGN AA -116AE ; [.2B93.0020.0002] # TAKRI VOWEL SIGN I -116AF ; [.2B94.0020.0002] # TAKRI VOWEL SIGN II -116B0 ; [.2B95.0020.0002] # TAKRI VOWEL SIGN U -116B1 ; [.2B96.0020.0002] # TAKRI VOWEL SIGN UU -116B2 ; [.2B97.0020.0002] # TAKRI VOWEL SIGN E -116B3 ; [.2B98.0020.0002] # TAKRI VOWEL SIGN AI -116B4 ; [.2B99.0020.0002] # TAKRI VOWEL SIGN O -116B5 ; [.2B9A.0020.0002] # TAKRI VOWEL SIGN AU -116B6 ; [.2B9B.0020.0002] # TAKRI SIGN VIRAMA -11700 ; [.2B9C.0020.0002] # AHOM LETTER KA -11701 ; [.2B9D.0020.0002] # AHOM LETTER KHA -11702 ; [.2B9E.0020.0002] # AHOM LETTER NGA -11703 ; [.2B9F.0020.0002] # AHOM LETTER NA -11704 ; [.2BA0.0020.0002] # AHOM LETTER TA -11705 ; [.2BA0.0020.0004][.0000.010B.0004] # AHOM LETTER ALTERNATE TA -11706 ; [.2BA1.0020.0002] # AHOM LETTER PA -11707 ; [.2BA2.0020.0002] # AHOM LETTER PHA -11708 ; [.2BA3.0020.0002] # AHOM LETTER BA -11709 ; [.2BA4.0020.0002] # AHOM LETTER MA -1170A ; [.2BA5.0020.0002] # AHOM LETTER JA -1170B ; [.2BA6.0020.0002] # AHOM LETTER CHA -1170C ; [.2BA7.0020.0002] # AHOM LETTER THA -1170D ; [.2BA8.0020.0002] # AHOM LETTER RA -1170E ; [.2BA9.0020.0002] # AHOM LETTER LA -1170F ; [.2BAA.0020.0002] # AHOM LETTER SA -11710 ; [.2BAB.0020.0002] # AHOM LETTER NYA -11711 ; [.2BAC.0020.0002] # AHOM LETTER HA -11712 ; [.2BAD.0020.0002] # AHOM LETTER A -11713 ; [.2BAE.0020.0002] # AHOM LETTER DA -11714 ; [.2BAF.0020.0002] # AHOM LETTER DHA -11715 ; [.2BB0.0020.0002] # AHOM LETTER GA -11716 ; [.2BB0.0020.0004][.0000.010B.0004] # AHOM LETTER ALTERNATE GA -11717 ; [.2BB1.0020.0002] # AHOM LETTER GHA -11718 ; [.2BB2.0020.0002] # AHOM LETTER BHA -11719 ; [.2BB3.0020.0002] # AHOM LETTER JHA -11720 ; [.2BB4.0020.0002] # AHOM VOWEL SIGN A -11721 ; [.2BB5.0020.0002] # AHOM VOWEL SIGN AA -11722 ; [.2BB6.0020.0002] # AHOM VOWEL SIGN I -11723 ; [.2BB7.0020.0002] # AHOM VOWEL SIGN II -11724 ; [.2BB8.0020.0002] # AHOM VOWEL SIGN U -11725 ; [.2BB9.0020.0002] # AHOM VOWEL SIGN UU -11726 ; [.2BBA.0020.0002] # AHOM VOWEL SIGN E -11727 ; [.2BBB.0020.0002] # AHOM VOWEL SIGN AW -11728 ; [.2BBC.0020.0002] # AHOM VOWEL SIGN O -11729 ; [.2BBD.0020.0002] # AHOM VOWEL SIGN AI -1172A ; [.2BBE.0020.0002] # AHOM VOWEL SIGN AM -1172B ; [.2BBF.0020.0002] # AHOM SIGN KILLER -1171D ; [.2BC0.0020.0002] # AHOM CONSONANT SIGN MEDIAL LA -1171E ; [.2BC1.0020.0002] # AHOM CONSONANT SIGN MEDIAL RA -1171F ; [.2BC2.0020.0002] # AHOM CONSONANT SIGN MEDIAL LIGATING RA -1B83 ; [.2BC3.0020.0002] # SUNDANESE LETTER A -1BBA ; [.2BC3.0020.0004] # SUNDANESE AVAGRAHA -1B84 ; [.2BC4.0020.0002] # SUNDANESE LETTER I -1B85 ; [.2BC5.0020.0002] # SUNDANESE LETTER U -1B86 ; [.2BC6.0020.0002] # SUNDANESE LETTER AE -1B87 ; [.2BC7.0020.0002] # SUNDANESE LETTER O -1B88 ; [.2BC8.0020.0002] # SUNDANESE LETTER E -1B89 ; [.2BC9.0020.0002] # SUNDANESE LETTER EU -1B8A ; [.2BCA.0020.0002] # SUNDANESE LETTER KA -1BBE ; [.2BCA.0020.0019] # SUNDANESE LETTER FINAL K -1BAE ; [.2BCB.0020.0002] # SUNDANESE LETTER KHA -1B8B ; [.2BCC.0020.0002] # SUNDANESE LETTER QA -1B8C ; [.2BCD.0020.0002] # SUNDANESE LETTER GA -1B8D ; [.2BCE.0020.0002] # SUNDANESE LETTER NGA -1B8E ; [.2BCF.0020.0002] # SUNDANESE LETTER CA -1B8F ; [.2BD0.0020.0002] # SUNDANESE LETTER JA -1B90 ; [.2BD1.0020.0002] # SUNDANESE LETTER ZA -1B91 ; [.2BD2.0020.0002] # SUNDANESE LETTER NYA -1B92 ; [.2BD3.0020.0002] # SUNDANESE LETTER TA -1B93 ; [.2BD4.0020.0002] # SUNDANESE LETTER DA -1B94 ; [.2BD5.0020.0002] # SUNDANESE LETTER NA -1B95 ; [.2BD6.0020.0002] # SUNDANESE LETTER PA -1B96 ; [.2BD7.0020.0002] # SUNDANESE LETTER FA -1B97 ; [.2BD8.0020.0002] # SUNDANESE LETTER VA -1B98 ; [.2BD9.0020.0002] # SUNDANESE LETTER BA -1BBD ; [.2BDA.0020.0002] # SUNDANESE LETTER BHA -1B99 ; [.2BDB.0020.0002] # SUNDANESE LETTER MA -1BBF ; [.2BDB.0020.0019] # SUNDANESE LETTER FINAL M -1BAC ; [.2BDC.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN MA -1B9A ; [.2BDD.0020.0002] # SUNDANESE LETTER YA -1BA1 ; [.2BDE.0020.0002] # SUNDANESE CONSONANT SIGN PAMINGKAL -1B9B ; [.2BDF.0020.0002] # SUNDANESE LETTER RA -1BA2 ; [.2BE0.0020.0002] # SUNDANESE CONSONANT SIGN PANYAKRA -1BBB ; [.2BE1.0020.0002] # SUNDANESE LETTER REU -1B9C ; [.2BE2.0020.0002] # SUNDANESE LETTER LA -1BA3 ; [.2BE3.0020.0002] # SUNDANESE CONSONANT SIGN PANYIKU -1BBC ; [.2BE4.0020.0002] # SUNDANESE LETTER LEU -1B9D ; [.2BE5.0020.0002] # SUNDANESE LETTER WA -1BAD ; [.2BE6.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN WA -1B9E ; [.2BE7.0020.0002] # SUNDANESE LETTER SA -1B9F ; [.2BE8.0020.0002] # SUNDANESE LETTER XA -1BAF ; [.2BE9.0020.0002] # SUNDANESE LETTER SYA -1BA0 ; [.2BEA.0020.0002] # SUNDANESE LETTER HA -1BA4 ; [.2BEB.0020.0002] # SUNDANESE VOWEL SIGN PANGHULU -1BA5 ; [.2BEC.0020.0002] # SUNDANESE VOWEL SIGN PANYUKU -1BA6 ; [.2BED.0020.0002] # SUNDANESE VOWEL SIGN PANAELAENG -1BA7 ; [.2BEE.0020.0002] # SUNDANESE VOWEL SIGN PANOLONG -1BA8 ; [.2BEF.0020.0002] # SUNDANESE VOWEL SIGN PAMEPET -1BA9 ; [.2BF0.0020.0002] # SUNDANESE VOWEL SIGN PANEULEUNG -1BAA ; [.2BF1.0020.0002] # SUNDANESE SIGN PAMAAEH -1BAB ; [.2BF2.0020.0002] # SUNDANESE SIGN VIRAMA -11005 ; [.2BF3.0020.0002] # BRAHMI LETTER A -11006 ; [.2BF4.0020.0002] # BRAHMI LETTER AA -11007 ; [.2BF5.0020.0002] # BRAHMI LETTER I -11008 ; [.2BF6.0020.0002] # BRAHMI LETTER II -11009 ; [.2BF7.0020.0002] # BRAHMI LETTER U -1100A ; [.2BF8.0020.0002] # BRAHMI LETTER UU -1100B ; [.2BF9.0020.0002] # BRAHMI LETTER VOCALIC R -1100C ; [.2BFA.0020.0002] # BRAHMI LETTER VOCALIC RR -1100D ; [.2BFB.0020.0002] # BRAHMI LETTER VOCALIC L -1100E ; [.2BFC.0020.0002] # BRAHMI LETTER VOCALIC LL -1100F ; [.2BFD.0020.0002] # BRAHMI LETTER E -11010 ; [.2BFE.0020.0002] # BRAHMI LETTER AI -11011 ; [.2BFF.0020.0002] # BRAHMI LETTER O -11012 ; [.2C00.0020.0002] # BRAHMI LETTER AU -11013 ; [.2C01.0020.0002] # BRAHMI LETTER KA -11014 ; [.2C02.0020.0002] # BRAHMI LETTER KHA -11015 ; [.2C03.0020.0002] # BRAHMI LETTER GA -11016 ; [.2C04.0020.0002] # BRAHMI LETTER GHA -11017 ; [.2C05.0020.0002] # BRAHMI LETTER NGA -11018 ; [.2C06.0020.0002] # BRAHMI LETTER CA -11019 ; [.2C07.0020.0002] # BRAHMI LETTER CHA -1101A ; [.2C08.0020.0002] # BRAHMI LETTER JA -1101B ; [.2C09.0020.0002] # BRAHMI LETTER JHA -1101C ; [.2C0A.0020.0002] # BRAHMI LETTER NYA -1101D ; [.2C0B.0020.0002] # BRAHMI LETTER TTA -1101E ; [.2C0C.0020.0002] # BRAHMI LETTER TTHA -1101F ; [.2C0D.0020.0002] # BRAHMI LETTER DDA -11020 ; [.2C0E.0020.0002] # BRAHMI LETTER DDHA -11021 ; [.2C0F.0020.0002] # BRAHMI LETTER NNA -11022 ; [.2C10.0020.0002] # BRAHMI LETTER TA -11023 ; [.2C11.0020.0002] # BRAHMI LETTER THA -11024 ; [.2C12.0020.0002] # BRAHMI LETTER DA -11025 ; [.2C13.0020.0002] # BRAHMI LETTER DHA -11026 ; [.2C14.0020.0002] # BRAHMI LETTER NA -11027 ; [.2C15.0020.0002] # BRAHMI LETTER PA -11028 ; [.2C16.0020.0002] # BRAHMI LETTER PHA -11029 ; [.2C17.0020.0002] # BRAHMI LETTER BA -1102A ; [.2C18.0020.0002] # BRAHMI LETTER BHA -1102B ; [.2C19.0020.0002] # BRAHMI LETTER MA -1102C ; [.2C1A.0020.0002] # BRAHMI LETTER YA -1102D ; [.2C1B.0020.0002] # BRAHMI LETTER RA -1102E ; [.2C1C.0020.0002] # BRAHMI LETTER LA -1102F ; [.2C1D.0020.0002] # BRAHMI LETTER VA -11030 ; [.2C1E.0020.0002] # BRAHMI LETTER SHA -11031 ; [.2C1F.0020.0002] # BRAHMI LETTER SSA -11032 ; [.2C20.0020.0002] # BRAHMI LETTER SA -11033 ; [.2C21.0020.0002] # BRAHMI LETTER HA -11003 ; [.2C22.0020.0002] # BRAHMI SIGN JIHVAMULIYA -11004 ; [.2C23.0020.0002] # BRAHMI SIGN UPADHMANIYA -11034 ; [.2C24.0020.0002] # BRAHMI LETTER LLA -11035 ; [.2C25.0020.0002] # BRAHMI LETTER OLD TAMIL LLLA -11036 ; [.2C26.0020.0002] # BRAHMI LETTER OLD TAMIL RRA -11037 ; [.2C27.0020.0002] # BRAHMI LETTER OLD TAMIL NNNA -11038 ; [.2C28.0020.0002] # BRAHMI VOWEL SIGN AA -11039 ; [.2C29.0020.0002] # BRAHMI VOWEL SIGN BHATTIPROLU AA -1103A ; [.2C2A.0020.0002] # BRAHMI VOWEL SIGN I -1103B ; [.2C2B.0020.0002] # BRAHMI VOWEL SIGN II -1103C ; [.2C2C.0020.0002] # BRAHMI VOWEL SIGN U -1103D ; [.2C2D.0020.0002] # BRAHMI VOWEL SIGN UU -1103E ; [.2C2E.0020.0002] # BRAHMI VOWEL SIGN VOCALIC R -1103F ; [.2C2F.0020.0002] # BRAHMI VOWEL SIGN VOCALIC RR -11040 ; [.2C30.0020.0002] # BRAHMI VOWEL SIGN VOCALIC L -11041 ; [.2C31.0020.0002] # BRAHMI VOWEL SIGN VOCALIC LL -11042 ; [.2C32.0020.0002] # BRAHMI VOWEL SIGN E -11043 ; [.2C33.0020.0002] # BRAHMI VOWEL SIGN AI -11044 ; [.2C34.0020.0002] # BRAHMI VOWEL SIGN O -11045 ; [.2C35.0020.0002] # BRAHMI VOWEL SIGN AU -11046 ; [.2C36.0020.0002] # BRAHMI VIRAMA -1107F ; [.2C37.0020.0002] # BRAHMI NUMBER JOINER -10A00 ; [.2C38.0020.0002] # KHAROSHTHI LETTER A -10A01 ; [.2C39.0020.0002] # KHAROSHTHI VOWEL SIGN I -10A02 ; [.2C3A.0020.0002] # KHAROSHTHI VOWEL SIGN U -10A03 ; [.2C3B.0020.0002] # KHAROSHTHI VOWEL SIGN VOCALIC R -10A05 ; [.2C3C.0020.0002] # KHAROSHTHI VOWEL SIGN E -10A06 ; [.2C3D.0020.0002] # KHAROSHTHI VOWEL SIGN O -10A0C ; [.2C3E.0020.0002] # KHAROSHTHI VOWEL LENGTH MARK -10A10 ; [.2C3F.0020.0002] # KHAROSHTHI LETTER KA -10A11 ; [.2C40.0020.0002] # KHAROSHTHI LETTER KHA -10A12 ; [.2C41.0020.0002] # KHAROSHTHI LETTER GA -10A13 ; [.2C42.0020.0002] # KHAROSHTHI LETTER GHA -10A15 ; [.2C43.0020.0002] # KHAROSHTHI LETTER CA -10A16 ; [.2C44.0020.0002] # KHAROSHTHI LETTER CHA -10A17 ; [.2C45.0020.0002] # KHAROSHTHI LETTER JA -10A19 ; [.2C46.0020.0002] # KHAROSHTHI LETTER NYA -10A1A ; [.2C47.0020.0002] # KHAROSHTHI LETTER TTA -10A1B ; [.2C48.0020.0002] # KHAROSHTHI LETTER TTHA -10A1C ; [.2C49.0020.0002] # KHAROSHTHI LETTER DDA -10A1D ; [.2C4A.0020.0002] # KHAROSHTHI LETTER DDHA -10A1E ; [.2C4B.0020.0002] # KHAROSHTHI LETTER NNA -10A1F ; [.2C4C.0020.0002] # KHAROSHTHI LETTER TA -10A20 ; [.2C4D.0020.0002] # KHAROSHTHI LETTER THA -10A21 ; [.2C4E.0020.0002] # KHAROSHTHI LETTER DA -10A22 ; [.2C4F.0020.0002] # KHAROSHTHI LETTER DHA -10A23 ; [.2C50.0020.0002] # KHAROSHTHI LETTER NA -10A24 ; [.2C51.0020.0002] # KHAROSHTHI LETTER PA -10A25 ; [.2C52.0020.0002] # KHAROSHTHI LETTER PHA -10A26 ; [.2C53.0020.0002] # KHAROSHTHI LETTER BA -10A27 ; [.2C54.0020.0002] # KHAROSHTHI LETTER BHA -10A28 ; [.2C55.0020.0002] # KHAROSHTHI LETTER MA -10A29 ; [.2C56.0020.0002] # KHAROSHTHI LETTER YA -10A2A ; [.2C57.0020.0002] # KHAROSHTHI LETTER RA -10A2B ; [.2C58.0020.0002] # KHAROSHTHI LETTER LA -10A2C ; [.2C59.0020.0002] # KHAROSHTHI LETTER VA -10A2D ; [.2C5A.0020.0002] # KHAROSHTHI LETTER SHA -10A2E ; [.2C5B.0020.0002] # KHAROSHTHI LETTER SSA -10A2F ; [.2C5C.0020.0002] # KHAROSHTHI LETTER SA -10A30 ; [.2C5D.0020.0002] # KHAROSHTHI LETTER ZA -10A31 ; [.2C5E.0020.0002] # KHAROSHTHI LETTER HA -10A32 ; [.2C5F.0020.0002] # KHAROSHTHI LETTER KKA -10A33 ; [.2C60.0020.0002] # KHAROSHTHI LETTER TTTHA -10A3F ; [.2C61.0020.0002] # KHAROSHTHI VIRAMA -0E01 ; [.2C62.0020.0002] # THAI CHARACTER KO KAI -0E40 0E01 ; [.2C62.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI> -0E41 0E01 ; [.2C62.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI> -0E42 0E01 ; [.2C62.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI> -0E43 0E01 ; [.2C62.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI> -0E44 0E01 ; [.2C62.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI> -0E02 ; [.2C63.0020.0002] # THAI CHARACTER KHO KHAI -0E40 0E02 ; [.2C63.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI> -0E41 0E02 ; [.2C63.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI> -0E42 0E02 ; [.2C63.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI> -0E43 0E02 ; [.2C63.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI> -0E44 0E02 ; [.2C63.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI> -0E03 ; [.2C64.0020.0002] # THAI CHARACTER KHO KHUAT -0E40 0E03 ; [.2C64.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT> -0E41 0E03 ; [.2C64.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT> -0E42 0E03 ; [.2C64.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT> -0E43 0E03 ; [.2C64.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT> -0E44 0E03 ; [.2C64.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT> -0E04 ; [.2C65.0020.0002] # THAI CHARACTER KHO KHWAI -0E40 0E04 ; [.2C65.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI> -0E41 0E04 ; [.2C65.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI> -0E42 0E04 ; [.2C65.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI> -0E43 0E04 ; [.2C65.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI> -0E44 0E04 ; [.2C65.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI> -0E05 ; [.2C66.0020.0002] # THAI CHARACTER KHO KHON -0E40 0E05 ; [.2C66.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON> -0E41 0E05 ; [.2C66.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON> -0E42 0E05 ; [.2C66.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON> -0E43 0E05 ; [.2C66.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON> -0E44 0E05 ; [.2C66.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON> -0E06 ; [.2C67.0020.0002] # THAI CHARACTER KHO RAKHANG -0E40 0E06 ; [.2C67.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG> -0E41 0E06 ; [.2C67.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG> -0E42 0E06 ; [.2C67.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG> -0E43 0E06 ; [.2C67.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG> -0E44 0E06 ; [.2C67.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG> -0E07 ; [.2C68.0020.0002] # THAI CHARACTER NGO NGU -0E40 0E07 ; [.2C68.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU> -0E41 0E07 ; [.2C68.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU> -0E42 0E07 ; [.2C68.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU> -0E43 0E07 ; [.2C68.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU> -0E44 0E07 ; [.2C68.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU> -0E08 ; [.2C69.0020.0002] # THAI CHARACTER CHO CHAN -0E40 0E08 ; [.2C69.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN> -0E41 0E08 ; [.2C69.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN> -0E42 0E08 ; [.2C69.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN> -0E43 0E08 ; [.2C69.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN> -0E44 0E08 ; [.2C69.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN> -0E09 ; [.2C6A.0020.0002] # THAI CHARACTER CHO CHING -0E40 0E09 ; [.2C6A.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING> -0E41 0E09 ; [.2C6A.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING> -0E42 0E09 ; [.2C6A.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING> -0E43 0E09 ; [.2C6A.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING> -0E44 0E09 ; [.2C6A.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING> -0E0A ; [.2C6B.0020.0002] # THAI CHARACTER CHO CHANG -0E40 0E0A ; [.2C6B.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG> -0E41 0E0A ; [.2C6B.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG> -0E42 0E0A ; [.2C6B.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG> -0E43 0E0A ; [.2C6B.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG> -0E44 0E0A ; [.2C6B.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG> -0E0B ; [.2C6C.0020.0002] # THAI CHARACTER SO SO -0E40 0E0B ; [.2C6C.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO> -0E41 0E0B ; [.2C6C.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO> -0E42 0E0B ; [.2C6C.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO> -0E43 0E0B ; [.2C6C.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO> -0E44 0E0B ; [.2C6C.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO> -0E0C ; [.2C6D.0020.0002] # THAI CHARACTER CHO CHOE -0E40 0E0C ; [.2C6D.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE> -0E41 0E0C ; [.2C6D.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE> -0E42 0E0C ; [.2C6D.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE> -0E43 0E0C ; [.2C6D.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE> -0E44 0E0C ; [.2C6D.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE> -0E0D ; [.2C6E.0020.0002] # THAI CHARACTER YO YING -0E40 0E0D ; [.2C6E.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING> -0E41 0E0D ; [.2C6E.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING> -0E42 0E0D ; [.2C6E.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING> -0E43 0E0D ; [.2C6E.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING> -0E44 0E0D ; [.2C6E.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING> -0E0E ; [.2C6F.0020.0002] # THAI CHARACTER DO CHADA -0E40 0E0E ; [.2C6F.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA> -0E41 0E0E ; [.2C6F.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA> -0E42 0E0E ; [.2C6F.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA> -0E43 0E0E ; [.2C6F.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA> -0E44 0E0E ; [.2C6F.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA> -0E0F ; [.2C70.0020.0002] # THAI CHARACTER TO PATAK -0E40 0E0F ; [.2C70.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK> -0E41 0E0F ; [.2C70.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK> -0E42 0E0F ; [.2C70.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK> -0E43 0E0F ; [.2C70.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK> -0E44 0E0F ; [.2C70.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK> -0E10 ; [.2C71.0020.0002] # THAI CHARACTER THO THAN -0E40 0E10 ; [.2C71.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN> -0E41 0E10 ; [.2C71.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN> -0E42 0E10 ; [.2C71.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN> -0E43 0E10 ; [.2C71.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN> -0E44 0E10 ; [.2C71.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN> -0E11 ; [.2C72.0020.0002] # THAI CHARACTER THO NANGMONTHO -0E40 0E11 ; [.2C72.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO> -0E41 0E11 ; [.2C72.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO> -0E42 0E11 ; [.2C72.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO> -0E43 0E11 ; [.2C72.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO> -0E44 0E11 ; [.2C72.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO> -0E12 ; [.2C73.0020.0002] # THAI CHARACTER THO PHUTHAO -0E40 0E12 ; [.2C73.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO> -0E41 0E12 ; [.2C73.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO> -0E42 0E12 ; [.2C73.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO> -0E43 0E12 ; [.2C73.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO> -0E44 0E12 ; [.2C73.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO> -0E13 ; [.2C74.0020.0002] # THAI CHARACTER NO NEN -0E40 0E13 ; [.2C74.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN> -0E41 0E13 ; [.2C74.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN> -0E42 0E13 ; [.2C74.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN> -0E43 0E13 ; [.2C74.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN> -0E44 0E13 ; [.2C74.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN> -0E14 ; [.2C75.0020.0002] # THAI CHARACTER DO DEK -0E40 0E14 ; [.2C75.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK> -0E41 0E14 ; [.2C75.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK> -0E42 0E14 ; [.2C75.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK> -0E43 0E14 ; [.2C75.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK> -0E44 0E14 ; [.2C75.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK> -0E15 ; [.2C76.0020.0002] # THAI CHARACTER TO TAO -0E40 0E15 ; [.2C76.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO> -0E41 0E15 ; [.2C76.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO> -0E42 0E15 ; [.2C76.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO> -0E43 0E15 ; [.2C76.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO> -0E44 0E15 ; [.2C76.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO> -0E16 ; [.2C77.0020.0002] # THAI CHARACTER THO THUNG -0E40 0E16 ; [.2C77.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG> -0E41 0E16 ; [.2C77.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG> -0E42 0E16 ; [.2C77.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG> -0E43 0E16 ; [.2C77.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG> -0E44 0E16 ; [.2C77.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG> -0E17 ; [.2C78.0020.0002] # THAI CHARACTER THO THAHAN -0E40 0E17 ; [.2C78.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN> -0E41 0E17 ; [.2C78.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN> -0E42 0E17 ; [.2C78.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN> -0E43 0E17 ; [.2C78.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN> -0E44 0E17 ; [.2C78.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN> -0E18 ; [.2C79.0020.0002] # THAI CHARACTER THO THONG -0E40 0E18 ; [.2C79.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG> -0E41 0E18 ; [.2C79.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG> -0E42 0E18 ; [.2C79.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG> -0E43 0E18 ; [.2C79.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG> -0E44 0E18 ; [.2C79.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG> -0E19 ; [.2C7A.0020.0002] # THAI CHARACTER NO NU -0E40 0E19 ; [.2C7A.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU> -0E41 0E19 ; [.2C7A.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU> -0E42 0E19 ; [.2C7A.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU> -0E43 0E19 ; [.2C7A.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU> -0E44 0E19 ; [.2C7A.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU> -0E1A ; [.2C7B.0020.0002] # THAI CHARACTER BO BAIMAI -0E40 0E1A ; [.2C7B.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI> -0E41 0E1A ; [.2C7B.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI> -0E42 0E1A ; [.2C7B.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI> -0E43 0E1A ; [.2C7B.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI> -0E44 0E1A ; [.2C7B.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI> -0E1B ; [.2C7C.0020.0002] # THAI CHARACTER PO PLA -0E40 0E1B ; [.2C7C.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA> -0E41 0E1B ; [.2C7C.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA> -0E42 0E1B ; [.2C7C.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA> -0E43 0E1B ; [.2C7C.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA> -0E44 0E1B ; [.2C7C.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA> -0E1C ; [.2C7D.0020.0002] # THAI CHARACTER PHO PHUNG -0E40 0E1C ; [.2C7D.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG> -0E41 0E1C ; [.2C7D.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG> -0E42 0E1C ; [.2C7D.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG> -0E43 0E1C ; [.2C7D.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG> -0E44 0E1C ; [.2C7D.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG> -0E1D ; [.2C7E.0020.0002] # THAI CHARACTER FO FA -0E40 0E1D ; [.2C7E.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA> -0E41 0E1D ; [.2C7E.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA> -0E42 0E1D ; [.2C7E.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA> -0E43 0E1D ; [.2C7E.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA> -0E44 0E1D ; [.2C7E.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA> -0E1E ; [.2C7F.0020.0002] # THAI CHARACTER PHO PHAN -0E40 0E1E ; [.2C7F.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN> -0E41 0E1E ; [.2C7F.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN> -0E42 0E1E ; [.2C7F.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN> -0E43 0E1E ; [.2C7F.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN> -0E44 0E1E ; [.2C7F.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN> -0E1F ; [.2C80.0020.0002] # THAI CHARACTER FO FAN -0E40 0E1F ; [.2C80.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN> -0E41 0E1F ; [.2C80.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN> -0E42 0E1F ; [.2C80.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN> -0E43 0E1F ; [.2C80.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN> -0E44 0E1F ; [.2C80.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN> -0E20 ; [.2C81.0020.0002] # THAI CHARACTER PHO SAMPHAO -0E40 0E20 ; [.2C81.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO> -0E41 0E20 ; [.2C81.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO> -0E42 0E20 ; [.2C81.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO> -0E43 0E20 ; [.2C81.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO> -0E44 0E20 ; [.2C81.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO> -0E21 ; [.2C82.0020.0002] # THAI CHARACTER MO MA -0E40 0E21 ; [.2C82.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA> -0E41 0E21 ; [.2C82.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA> -0E42 0E21 ; [.2C82.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA> -0E43 0E21 ; [.2C82.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA> -0E44 0E21 ; [.2C82.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA> -0E22 ; [.2C83.0020.0002] # THAI CHARACTER YO YAK -0E40 0E22 ; [.2C83.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK> -0E41 0E22 ; [.2C83.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK> -0E42 0E22 ; [.2C83.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK> -0E43 0E22 ; [.2C83.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK> -0E44 0E22 ; [.2C83.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK> -0E23 ; [.2C84.0020.0002] # THAI CHARACTER RO RUA -0E40 0E23 ; [.2C84.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA> -0E41 0E23 ; [.2C84.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA> -0E42 0E23 ; [.2C84.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA> -0E43 0E23 ; [.2C84.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA> -0E44 0E23 ; [.2C84.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA> -0E24 ; [.2C85.0020.0002] # THAI CHARACTER RU -0E40 0E24 ; [.2C85.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RU> -0E41 0E24 ; [.2C85.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RU> -0E42 0E24 ; [.2C85.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RU> -0E43 0E24 ; [.2C85.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU> -0E44 0E24 ; [.2C85.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU> -0E25 ; [.2C86.0020.0002] # THAI CHARACTER LO LING -0E40 0E25 ; [.2C86.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING> -0E41 0E25 ; [.2C86.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING> -0E42 0E25 ; [.2C86.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING> -0E43 0E25 ; [.2C86.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING> -0E44 0E25 ; [.2C86.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING> -0E26 ; [.2C87.0020.0002] # THAI CHARACTER LU -0E40 0E26 ; [.2C87.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LU> -0E41 0E26 ; [.2C87.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LU> -0E42 0E26 ; [.2C87.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LU> -0E43 0E26 ; [.2C87.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU> -0E44 0E26 ; [.2C87.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU> -0E27 ; [.2C88.0020.0002] # THAI CHARACTER WO WAEN -0E40 0E27 ; [.2C88.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN> -0E41 0E27 ; [.2C88.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN> -0E42 0E27 ; [.2C88.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN> -0E43 0E27 ; [.2C88.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN> -0E44 0E27 ; [.2C88.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN> -0E28 ; [.2C89.0020.0002] # THAI CHARACTER SO SALA -0E40 0E28 ; [.2C89.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA> -0E41 0E28 ; [.2C89.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA> -0E42 0E28 ; [.2C89.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA> -0E43 0E28 ; [.2C89.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA> -0E44 0E28 ; [.2C89.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA> -0E29 ; [.2C8A.0020.0002] # THAI CHARACTER SO RUSI -0E40 0E29 ; [.2C8A.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI> -0E41 0E29 ; [.2C8A.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI> -0E42 0E29 ; [.2C8A.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI> -0E43 0E29 ; [.2C8A.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI> -0E44 0E29 ; [.2C8A.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI> -0E2A ; [.2C8B.0020.0002] # THAI CHARACTER SO SUA -0E40 0E2A ; [.2C8B.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA> -0E41 0E2A ; [.2C8B.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA> -0E42 0E2A ; [.2C8B.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA> -0E43 0E2A ; [.2C8B.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA> -0E44 0E2A ; [.2C8B.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA> -0E2B ; [.2C8C.0020.0002] # THAI CHARACTER HO HIP -0E40 0E2B ; [.2C8C.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP> -0E41 0E2B ; [.2C8C.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP> -0E42 0E2B ; [.2C8C.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP> -0E43 0E2B ; [.2C8C.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP> -0E44 0E2B ; [.2C8C.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP> -0E2C ; [.2C8D.0020.0002] # THAI CHARACTER LO CHULA -0E40 0E2C ; [.2C8D.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA> -0E41 0E2C ; [.2C8D.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA> -0E42 0E2C ; [.2C8D.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA> -0E43 0E2C ; [.2C8D.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA> -0E44 0E2C ; [.2C8D.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA> -0E2D ; [.2C8E.0020.0002] # THAI CHARACTER O ANG -0E40 0E2D ; [.2C8E.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG> -0E41 0E2D ; [.2C8E.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG> -0E42 0E2D ; [.2C8E.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG> -0E43 0E2D ; [.2C8E.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG> -0E44 0E2D ; [.2C8E.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG> -0E2E ; [.2C8F.0020.0002] # THAI CHARACTER HO NOKHUK -0E40 0E2E ; [.2C8F.0020.0002][.2C9C.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK> -0E41 0E2E ; [.2C8F.0020.0002][.2C9D.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK> -0E42 0E2E ; [.2C8F.0020.0002][.2C9E.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK> -0E43 0E2E ; [.2C8F.0020.0002][.2C9F.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK> -0E44 0E2E ; [.2C8F.0020.0002][.2CA0.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK> -0E2F ; [.2C90.0020.0002] # THAI CHARACTER PAIYANNOI -0E30 ; [.2C91.0020.0002] # THAI CHARACTER SARA A -0E31 ; [.2C92.0020.0002] # THAI CHARACTER MAI HAN-AKAT -0E32 ; [.2C93.0020.0002] # THAI CHARACTER SARA AA -0E33 ; [.2C94.0020.0002] # THAI CHARACTER SARA AM -0E4D 0E32 ; [.2C94.0020.0002] # THAI CHARACTER SARA AM -0E34 ; [.2C95.0020.0002] # THAI CHARACTER SARA I -0E35 ; [.2C96.0020.0002] # THAI CHARACTER SARA II -0E36 ; [.2C97.0020.0002] # THAI CHARACTER SARA UE -0E37 ; [.2C98.0020.0002] # THAI CHARACTER SARA UEE -0E38 ; [.2C99.0020.0002] # THAI CHARACTER SARA U -0E39 ; [.2C9A.0020.0002] # THAI CHARACTER SARA UU -0E3A ; [.2C9B.0020.0002] # THAI CHARACTER PHINTHU -0E40 ; [.2C9C.0020.0002] # THAI CHARACTER SARA E -0E41 ; [.2C9D.0020.0002] # THAI CHARACTER SARA AE -0E42 ; [.2C9E.0020.0002] # THAI CHARACTER SARA O -0E43 ; [.2C9F.0020.0002] # THAI CHARACTER SARA AI MAIMUAN -0E44 ; [.2CA0.0020.0002] # THAI CHARACTER SARA AI MAIMALAI -0E45 ; [.2CA1.0020.0002] # THAI CHARACTER LAKKHANGYAO -0EDE ; [.2CA2.0020.0002] # LAO LETTER KHMU GO -0EC0 0EDE ; [.2CA2.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU GO> -0EC1 0EDE ; [.2CA2.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU GO> -0EC2 0EDE ; [.2CA2.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU GO> -0EC3 0EDE ; [.2CA2.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU GO> -0EC4 0EDE ; [.2CA2.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU GO> -0E81 ; [.2CA3.0020.0002] # LAO LETTER KO -0EC0 0E81 ; [.2CA3.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KO> -0EC1 0E81 ; [.2CA3.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KO> -0EC2 0E81 ; [.2CA3.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KO> -0EC3 0E81 ; [.2CA3.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KO> -0EC4 0E81 ; [.2CA3.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KO> -0E82 ; [.2CA4.0020.0002] # LAO LETTER KHO SUNG -0EC0 0E82 ; [.2CA4.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG> -0EC1 0E82 ; [.2CA4.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG> -0EC2 0E82 ; [.2CA4.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG> -0EC3 0E82 ; [.2CA4.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG> -0EC4 0E82 ; [.2CA4.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG> -0E84 ; [.2CA5.0020.0002] # LAO LETTER KHO TAM -0EC0 0E84 ; [.2CA5.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM> -0EC1 0E84 ; [.2CA5.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM> -0EC2 0E84 ; [.2CA5.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM> -0EC3 0E84 ; [.2CA5.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM> -0EC4 0E84 ; [.2CA5.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM> -0E87 ; [.2CA6.0020.0002] # LAO LETTER NGO -0EC0 0E87 ; [.2CA6.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NGO> -0EC1 0E87 ; [.2CA6.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NGO> -0EC2 0E87 ; [.2CA6.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NGO> -0EC3 0E87 ; [.2CA6.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NGO> -0EC4 0E87 ; [.2CA6.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NGO> -0E88 ; [.2CA7.0020.0002] # LAO LETTER CO -0EC0 0E88 ; [.2CA7.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER CO> -0EC1 0E88 ; [.2CA7.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER CO> -0EC2 0E88 ; [.2CA7.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER CO> -0EC3 0E88 ; [.2CA7.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER CO> -0EC4 0E88 ; [.2CA7.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER CO> -0EAA ; [.2CA8.0020.0002] # LAO LETTER SO SUNG -0EC0 0EAA ; [.2CA8.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG> -0EC1 0EAA ; [.2CA8.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG> -0EC2 0EAA ; [.2CA8.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG> -0EC3 0EAA ; [.2CA8.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG> -0EC4 0EAA ; [.2CA8.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG> -0E8A ; [.2CA9.0020.0002] # LAO LETTER SO TAM -0EC0 0E8A ; [.2CA9.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO TAM> -0EC1 0E8A ; [.2CA9.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM> -0EC2 0E8A ; [.2CA9.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO TAM> -0EC3 0E8A ; [.2CA9.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM> -0EC4 0E8A ; [.2CA9.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM> -0EDF ; [.2CAA.0020.0002] # LAO LETTER KHMU NYO -0EC0 0EDF ; [.2CAA.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU NYO> -0EC1 0EDF ; [.2CAA.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU NYO> -0EC2 0EDF ; [.2CAA.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU NYO> -0EC3 0EDF ; [.2CAA.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU NYO> -0EC4 0EDF ; [.2CAA.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU NYO> -0E8D ; [.2CAB.0020.0002] # LAO LETTER NYO -0EC0 0E8D ; [.2CAB.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NYO> -0EC1 0E8D ; [.2CAB.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NYO> -0EC2 0E8D ; [.2CAB.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NYO> -0EC3 0E8D ; [.2CAB.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NYO> -0EC4 0E8D ; [.2CAB.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NYO> -0E94 ; [.2CAC.0020.0002] # LAO LETTER DO -0EC0 0E94 ; [.2CAC.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER DO> -0EC1 0E94 ; [.2CAC.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER DO> -0EC2 0E94 ; [.2CAC.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER DO> -0EC3 0E94 ; [.2CAC.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER DO> -0EC4 0E94 ; [.2CAC.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER DO> -0E95 ; [.2CAD.0020.0002] # LAO LETTER TO -0EC0 0E95 ; [.2CAD.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER TO> -0EC1 0E95 ; [.2CAD.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER TO> -0EC2 0E95 ; [.2CAD.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER TO> -0EC3 0E95 ; [.2CAD.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER TO> -0EC4 0E95 ; [.2CAD.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER TO> -0E96 ; [.2CAE.0020.0002] # LAO LETTER THO SUNG -0EC0 0E96 ; [.2CAE.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG> -0EC1 0E96 ; [.2CAE.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG> -0EC2 0E96 ; [.2CAE.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG> -0EC3 0E96 ; [.2CAE.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG> -0EC4 0E96 ; [.2CAE.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG> -0E97 ; [.2CAF.0020.0002] # LAO LETTER THO TAM -0EC0 0E97 ; [.2CAF.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO TAM> -0EC1 0E97 ; [.2CAF.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM> -0EC2 0E97 ; [.2CAF.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO TAM> -0EC3 0E97 ; [.2CAF.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM> -0EC4 0E97 ; [.2CAF.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM> -0E99 ; [.2CB0.0020.0002] # LAO LETTER NO -0EC0 0E99 ; [.2CB0.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NO> -0EC1 0E99 ; [.2CB0.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NO> -0EC2 0E99 ; [.2CB0.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NO> -0EC3 0E99 ; [.2CB0.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NO> -0EC4 0E99 ; [.2CB0.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NO> -0E9A ; [.2CB1.0020.0002] # LAO LETTER BO -0EC0 0E9A ; [.2CB1.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER BO> -0EC1 0E9A ; [.2CB1.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER BO> -0EC2 0E9A ; [.2CB1.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER BO> -0EC3 0E9A ; [.2CB1.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER BO> -0EC4 0E9A ; [.2CB1.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER BO> -0E9B ; [.2CB2.0020.0002] # LAO LETTER PO -0EC0 0E9B ; [.2CB2.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PO> -0EC1 0E9B ; [.2CB2.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PO> -0EC2 0E9B ; [.2CB2.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PO> -0EC3 0E9B ; [.2CB2.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PO> -0EC4 0E9B ; [.2CB2.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PO> -0E9C ; [.2CB3.0020.0002] # LAO LETTER PHO SUNG -0EC0 0E9C ; [.2CB3.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG> -0EC1 0E9C ; [.2CB3.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG> -0EC2 0E9C ; [.2CB3.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG> -0EC3 0E9C ; [.2CB3.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG> -0EC4 0E9C ; [.2CB3.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG> -0E9D ; [.2CB4.0020.0002] # LAO LETTER FO TAM -0EC0 0E9D ; [.2CB4.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO TAM> -0EC1 0E9D ; [.2CB4.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM> -0EC2 0E9D ; [.2CB4.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO TAM> -0EC3 0E9D ; [.2CB4.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM> -0EC4 0E9D ; [.2CB4.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM> -0E9E ; [.2CB5.0020.0002] # LAO LETTER PHO TAM -0EC0 0E9E ; [.2CB5.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM> -0EC1 0E9E ; [.2CB5.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM> -0EC2 0E9E ; [.2CB5.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM> -0EC3 0E9E ; [.2CB5.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM> -0EC4 0E9E ; [.2CB5.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM> -0E9F ; [.2CB6.0020.0002] # LAO LETTER FO SUNG -0EC0 0E9F ; [.2CB6.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG> -0EC1 0E9F ; [.2CB6.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG> -0EC2 0E9F ; [.2CB6.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG> -0EC3 0E9F ; [.2CB6.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG> -0EC4 0E9F ; [.2CB6.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG> -0EA1 ; [.2CB7.0020.0002] # LAO LETTER MO -0EC0 0EA1 ; [.2CB7.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER MO> -0EC1 0EA1 ; [.2CB7.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER MO> -0EC2 0EA1 ; [.2CB7.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER MO> -0EC3 0EA1 ; [.2CB7.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER MO> -0EC4 0EA1 ; [.2CB7.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER MO> -0EA2 ; [.2CB8.0020.0002] # LAO LETTER YO -0EC0 0EA2 ; [.2CB8.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER YO> -0EC1 0EA2 ; [.2CB8.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER YO> -0EC2 0EA2 ; [.2CB8.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER YO> -0EC3 0EA2 ; [.2CB8.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER YO> -0EC4 0EA2 ; [.2CB8.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER YO> -0EA3 ; [.2CB9.0020.0002] # LAO LETTER LO LING -0EC0 0EA3 ; [.2CB9.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LING> -0EC1 0EA3 ; [.2CB9.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LING> -0EC2 0EA3 ; [.2CB9.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LING> -0EC3 0EA3 ; [.2CB9.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LING> -0EC4 0EA3 ; [.2CB9.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LING> -0EA5 ; [.2CBA.0020.0002] # LAO LETTER LO LOOT -0EC0 0EA5 ; [.2CBA.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT> -0EC1 0EA5 ; [.2CBA.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT> -0EC2 0EA5 ; [.2CBA.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT> -0EC3 0EA5 ; [.2CBA.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT> -0EC4 0EA5 ; [.2CBA.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT> -0EA7 ; [.2CBB.0020.0002] # LAO LETTER WO -0EC0 0EA7 ; [.2CBB.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER WO> -0EC1 0EA7 ; [.2CBB.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER WO> -0EC2 0EA7 ; [.2CBB.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER WO> -0EC3 0EA7 ; [.2CBB.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER WO> -0EC4 0EA7 ; [.2CBB.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER WO> -0EAB ; [.2CBC.0020.0002] # LAO LETTER HO SUNG -0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004] # LAO HO NO -0EC0 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO HO NO> -0EC1 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO HO NO> -0EC2 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO HO NO> -0EC3 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO HO NO> -0EC4 0EDC ; [.2CBC.0020.0004][.2CB0.0020.0004][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO HO NO> -0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004] # LAO HO MO -0EC0 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO HO MO> -0EC1 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO HO MO> -0EC2 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO HO MO> -0EC3 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO HO MO> -0EC4 0EDD ; [.2CBC.0020.0004][.2CB7.0020.0004][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO HO MO> -0EC0 0EAB ; [.2CBC.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG> -0EC1 0EAB ; [.2CBC.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG> -0EC2 0EAB ; [.2CBC.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG> -0EC3 0EAB ; [.2CBC.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG> -0EC4 0EAB ; [.2CBC.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG> -0EAD ; [.2CBD.0020.0002] # LAO LETTER O -0EC0 0EAD ; [.2CBD.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER O> -0EC1 0EAD ; [.2CBD.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER O> -0EC2 0EAD ; [.2CBD.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER O> -0EC3 0EAD ; [.2CBD.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER O> -0EC4 0EAD ; [.2CBD.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER O> -0EAE ; [.2CBE.0020.0002] # LAO LETTER HO TAM -0EC0 0EAE ; [.2CBE.0020.0002][.2CCD.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO TAM> -0EC1 0EAE ; [.2CBE.0020.0002][.2CCE.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM> -0EC2 0EAE ; [.2CBE.0020.0002][.2CCF.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO TAM> -0EC3 0EAE ; [.2CBE.0020.0002][.2CD0.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM> -0EC4 0EAE ; [.2CBE.0020.0002][.2CD1.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM> -0EAF ; [.2CBF.0020.0002] # LAO ELLIPSIS -0EB0 ; [.2CC0.0020.0002] # LAO VOWEL SIGN A -0EB1 ; [.2CC1.0020.0002] # LAO VOWEL SIGN MAI KAN -0EB2 ; [.2CC2.0020.0002] # LAO VOWEL SIGN AA -0EB3 ; [.2CC3.0020.0002] # LAO VOWEL SIGN AM -0ECD 0EB2 ; [.2CC3.0020.0002] # LAO VOWEL SIGN AM -0EB4 ; [.2CC4.0020.0002] # LAO VOWEL SIGN I -0EB5 ; [.2CC5.0020.0002] # LAO VOWEL SIGN II -0EB6 ; [.2CC6.0020.0002] # LAO VOWEL SIGN Y -0EB7 ; [.2CC7.0020.0002] # LAO VOWEL SIGN YY -0EB8 ; [.2CC8.0020.0002] # LAO VOWEL SIGN U -0EB9 ; [.2CC9.0020.0002] # LAO VOWEL SIGN UU -0EBB ; [.2CCA.0020.0002] # LAO VOWEL SIGN MAI KON -0EBC ; [.2CCB.0020.0002] # LAO SEMIVOWEL SIGN LO -0EBD ; [.2CCC.0020.0002] # LAO SEMIVOWEL SIGN NYO -0EC0 ; [.2CCD.0020.0002] # LAO VOWEL SIGN E -0EC1 ; [.2CCE.0020.0002] # LAO VOWEL SIGN EI -0EC2 ; [.2CCF.0020.0002] # LAO VOWEL SIGN O -0EC3 ; [.2CD0.0020.0002] # LAO VOWEL SIGN AY -0EC4 ; [.2CD1.0020.0002] # LAO VOWEL SIGN AI -AA80 ; [.2CD2.0020.0002] # TAI VIET LETTER LOW KO -AAB5 AA80 ; [.2CD2.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KO> -AAB6 AA80 ; [.2CD2.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KO> -AAB9 AA80 ; [.2CD2.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KO> -AABB AA80 ; [.2CD2.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KO> -AABC AA80 ; [.2CD2.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KO> -AA81 ; [.2CD3.0020.0002] # TAI VIET LETTER HIGH KO -AAB5 AA81 ; [.2CD3.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KO> -AAB6 AA81 ; [.2CD3.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KO> -AAB9 AA81 ; [.2CD3.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KO> -AABB AA81 ; [.2CD3.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KO> -AABC AA81 ; [.2CD3.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KO> -AA82 ; [.2CD4.0020.0002] # TAI VIET LETTER LOW KHO -AAB5 AA82 ; [.2CD4.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHO> -AAB6 AA82 ; [.2CD4.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHO> -AAB9 AA82 ; [.2CD4.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHO> -AABB AA82 ; [.2CD4.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHO> -AABC AA82 ; [.2CD4.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHO> -AA83 ; [.2CD5.0020.0002] # TAI VIET LETTER HIGH KHO -AAB5 AA83 ; [.2CD5.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHO> -AAB6 AA83 ; [.2CD5.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHO> -AAB9 AA83 ; [.2CD5.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHO> -AABB AA83 ; [.2CD5.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHO> -AABC AA83 ; [.2CD5.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHO> -AA84 ; [.2CD6.0020.0002] # TAI VIET LETTER LOW KHHO -AAB5 AA84 ; [.2CD6.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHHO> -AAB6 AA84 ; [.2CD6.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHHO> -AAB9 AA84 ; [.2CD6.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHHO> -AABB AA84 ; [.2CD6.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHHO> -AABC AA84 ; [.2CD6.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHHO> -AA85 ; [.2CD7.0020.0002] # TAI VIET LETTER HIGH KHHO -AAB5 AA85 ; [.2CD7.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHHO> -AAB6 AA85 ; [.2CD7.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHHO> -AAB9 AA85 ; [.2CD7.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHHO> -AABB AA85 ; [.2CD7.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHHO> -AABC AA85 ; [.2CD7.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHHO> -AA86 ; [.2CD8.0020.0002] # TAI VIET LETTER LOW GO -AAB5 AA86 ; [.2CD8.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW GO> -AAB6 AA86 ; [.2CD8.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW GO> -AAB9 AA86 ; [.2CD8.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW GO> -AABB AA86 ; [.2CD8.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW GO> -AABC AA86 ; [.2CD8.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW GO> -AA87 ; [.2CD9.0020.0002] # TAI VIET LETTER HIGH GO -AAB5 AA87 ; [.2CD9.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH GO> -AAB6 AA87 ; [.2CD9.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH GO> -AAB9 AA87 ; [.2CD9.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH GO> -AABB AA87 ; [.2CD9.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH GO> -AABC AA87 ; [.2CD9.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH GO> -AA88 ; [.2CDA.0020.0002] # TAI VIET LETTER LOW NGO -AAB5 AA88 ; [.2CDA.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NGO> -AAB6 AA88 ; [.2CDA.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NGO> -AAB9 AA88 ; [.2CDA.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NGO> -AABB AA88 ; [.2CDA.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NGO> -AABC AA88 ; [.2CDA.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NGO> -AA89 ; [.2CDB.0020.0002] # TAI VIET LETTER HIGH NGO -AAB5 AA89 ; [.2CDB.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NGO> -AAB6 AA89 ; [.2CDB.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NGO> -AAB9 AA89 ; [.2CDB.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NGO> -AABB AA89 ; [.2CDB.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NGO> -AABC AA89 ; [.2CDB.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NGO> -AA8A ; [.2CDC.0020.0002] # TAI VIET LETTER LOW CO -AAB5 AA8A ; [.2CDC.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CO> -AAB6 AA8A ; [.2CDC.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CO> -AAB9 AA8A ; [.2CDC.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CO> -AABB AA8A ; [.2CDC.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CO> -AABC AA8A ; [.2CDC.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CO> -AA8B ; [.2CDD.0020.0002] # TAI VIET LETTER HIGH CO -AAB5 AA8B ; [.2CDD.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CO> -AAB6 AA8B ; [.2CDD.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CO> -AAB9 AA8B ; [.2CDD.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CO> -AABB AA8B ; [.2CDD.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CO> -AABC AA8B ; [.2CDD.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CO> -AA8C ; [.2CDE.0020.0002] # TAI VIET LETTER LOW CHO -AAB5 AA8C ; [.2CDE.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CHO> -AAB6 AA8C ; [.2CDE.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CHO> -AAB9 AA8C ; [.2CDE.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CHO> -AABB AA8C ; [.2CDE.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CHO> -AABC AA8C ; [.2CDE.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CHO> -AA8D ; [.2CDF.0020.0002] # TAI VIET LETTER HIGH CHO -AAB5 AA8D ; [.2CDF.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CHO> -AAB6 AA8D ; [.2CDF.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CHO> -AAB9 AA8D ; [.2CDF.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CHO> -AABB AA8D ; [.2CDF.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CHO> -AABC AA8D ; [.2CDF.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CHO> -AA8E ; [.2CE0.0020.0002] # TAI VIET LETTER LOW SO -AAB5 AA8E ; [.2CE0.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW SO> -AAB6 AA8E ; [.2CE0.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW SO> -AAB9 AA8E ; [.2CE0.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW SO> -AABB AA8E ; [.2CE0.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW SO> -AABC AA8E ; [.2CE0.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW SO> -AA8F ; [.2CE1.0020.0002] # TAI VIET LETTER HIGH SO -AAB5 AA8F ; [.2CE1.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH SO> -AAB6 AA8F ; [.2CE1.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH SO> -AAB9 AA8F ; [.2CE1.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH SO> -AABB AA8F ; [.2CE1.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH SO> -AABC AA8F ; [.2CE1.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH SO> -AA90 ; [.2CE2.0020.0002] # TAI VIET LETTER LOW NYO -AAB5 AA90 ; [.2CE2.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NYO> -AAB6 AA90 ; [.2CE2.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NYO> -AAB9 AA90 ; [.2CE2.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NYO> -AABB AA90 ; [.2CE2.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NYO> -AABC AA90 ; [.2CE2.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NYO> -AA91 ; [.2CE3.0020.0002] # TAI VIET LETTER HIGH NYO -AAB5 AA91 ; [.2CE3.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NYO> -AAB6 AA91 ; [.2CE3.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NYO> -AAB9 AA91 ; [.2CE3.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NYO> -AABB AA91 ; [.2CE3.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NYO> -AABC AA91 ; [.2CE3.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NYO> -AA92 ; [.2CE4.0020.0002] # TAI VIET LETTER LOW DO -AAB5 AA92 ; [.2CE4.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW DO> -AAB6 AA92 ; [.2CE4.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW DO> -AAB9 AA92 ; [.2CE4.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW DO> -AABB AA92 ; [.2CE4.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW DO> -AABC AA92 ; [.2CE4.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW DO> -AA93 ; [.2CE5.0020.0002] # TAI VIET LETTER HIGH DO -AAB5 AA93 ; [.2CE5.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH DO> -AAB6 AA93 ; [.2CE5.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH DO> -AAB9 AA93 ; [.2CE5.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH DO> -AABB AA93 ; [.2CE5.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH DO> -AABC AA93 ; [.2CE5.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH DO> -AA94 ; [.2CE6.0020.0002] # TAI VIET LETTER LOW TO -AAB5 AA94 ; [.2CE6.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW TO> -AAB6 AA94 ; [.2CE6.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW TO> -AAB9 AA94 ; [.2CE6.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW TO> -AABB AA94 ; [.2CE6.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW TO> -AABC AA94 ; [.2CE6.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW TO> -AA95 ; [.2CE7.0020.0002] # TAI VIET LETTER HIGH TO -AAB5 AA95 ; [.2CE7.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH TO> -AAB6 AA95 ; [.2CE7.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH TO> -AAB9 AA95 ; [.2CE7.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH TO> -AABB AA95 ; [.2CE7.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH TO> -AABC AA95 ; [.2CE7.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH TO> -AA96 ; [.2CE8.0020.0002] # TAI VIET LETTER LOW THO -AAB5 AA96 ; [.2CE8.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW THO> -AAB6 AA96 ; [.2CE8.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW THO> -AAB9 AA96 ; [.2CE8.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW THO> -AABB AA96 ; [.2CE8.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW THO> -AABC AA96 ; [.2CE8.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW THO> -AA97 ; [.2CE9.0020.0002] # TAI VIET LETTER HIGH THO -AAB5 AA97 ; [.2CE9.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH THO> -AAB6 AA97 ; [.2CE9.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH THO> -AAB9 AA97 ; [.2CE9.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH THO> -AABB AA97 ; [.2CE9.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH THO> -AABC AA97 ; [.2CE9.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH THO> -AA98 ; [.2CEA.0020.0002] # TAI VIET LETTER LOW NO -AAB5 AA98 ; [.2CEA.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NO> -AAB6 AA98 ; [.2CEA.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NO> -AAB9 AA98 ; [.2CEA.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NO> -AABB AA98 ; [.2CEA.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NO> -AABC AA98 ; [.2CEA.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NO> -AA99 ; [.2CEB.0020.0002] # TAI VIET LETTER HIGH NO -AAB5 AA99 ; [.2CEB.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NO> -AAB6 AA99 ; [.2CEB.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NO> -AAB9 AA99 ; [.2CEB.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NO> -AABB AA99 ; [.2CEB.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NO> -AABC AA99 ; [.2CEB.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NO> -AA9A ; [.2CEC.0020.0002] # TAI VIET LETTER LOW BO -AAB5 AA9A ; [.2CEC.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW BO> -AAB6 AA9A ; [.2CEC.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW BO> -AAB9 AA9A ; [.2CEC.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW BO> -AABB AA9A ; [.2CEC.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW BO> -AABC AA9A ; [.2CEC.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW BO> -AA9B ; [.2CED.0020.0002] # TAI VIET LETTER HIGH BO -AAB5 AA9B ; [.2CED.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH BO> -AAB6 AA9B ; [.2CED.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH BO> -AAB9 AA9B ; [.2CED.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH BO> -AABB AA9B ; [.2CED.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH BO> -AABC AA9B ; [.2CED.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH BO> -AA9C ; [.2CEE.0020.0002] # TAI VIET LETTER LOW PO -AAB5 AA9C ; [.2CEE.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PO> -AAB6 AA9C ; [.2CEE.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PO> -AAB9 AA9C ; [.2CEE.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PO> -AABB AA9C ; [.2CEE.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PO> -AABC AA9C ; [.2CEE.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PO> -AA9D ; [.2CEF.0020.0002] # TAI VIET LETTER HIGH PO -AAB5 AA9D ; [.2CEF.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PO> -AAB6 AA9D ; [.2CEF.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PO> -AAB9 AA9D ; [.2CEF.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PO> -AABB AA9D ; [.2CEF.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PO> -AABC AA9D ; [.2CEF.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PO> -AA9E ; [.2CF0.0020.0002] # TAI VIET LETTER LOW PHO -AAB5 AA9E ; [.2CF0.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PHO> -AAB6 AA9E ; [.2CF0.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PHO> -AAB9 AA9E ; [.2CF0.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PHO> -AABB AA9E ; [.2CF0.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PHO> -AABC AA9E ; [.2CF0.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PHO> -AA9F ; [.2CF1.0020.0002] # TAI VIET LETTER HIGH PHO -AAB5 AA9F ; [.2CF1.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PHO> -AAB6 AA9F ; [.2CF1.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PHO> -AAB9 AA9F ; [.2CF1.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PHO> -AABB AA9F ; [.2CF1.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PHO> -AABC AA9F ; [.2CF1.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PHO> -AAA0 ; [.2CF2.0020.0002] # TAI VIET LETTER LOW FO -AAB5 AAA0 ; [.2CF2.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW FO> -AAB6 AAA0 ; [.2CF2.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW FO> -AAB9 AAA0 ; [.2CF2.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW FO> -AABB AAA0 ; [.2CF2.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW FO> -AABC AAA0 ; [.2CF2.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW FO> -AAA1 ; [.2CF3.0020.0002] # TAI VIET LETTER HIGH FO -AAB5 AAA1 ; [.2CF3.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH FO> -AAB6 AAA1 ; [.2CF3.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH FO> -AAB9 AAA1 ; [.2CF3.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH FO> -AABB AAA1 ; [.2CF3.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH FO> -AABC AAA1 ; [.2CF3.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH FO> -AAA2 ; [.2CF4.0020.0002] # TAI VIET LETTER LOW MO -AAB5 AAA2 ; [.2CF4.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW MO> -AAB6 AAA2 ; [.2CF4.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW MO> -AAB9 AAA2 ; [.2CF4.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW MO> -AABB AAA2 ; [.2CF4.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW MO> -AABC AAA2 ; [.2CF4.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW MO> -AAA3 ; [.2CF5.0020.0002] # TAI VIET LETTER HIGH MO -AAB5 AAA3 ; [.2CF5.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH MO> -AAB6 AAA3 ; [.2CF5.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH MO> -AAB9 AAA3 ; [.2CF5.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH MO> -AABB AAA3 ; [.2CF5.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH MO> -AABC AAA3 ; [.2CF5.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH MO> -AAA4 ; [.2CF6.0020.0002] # TAI VIET LETTER LOW YO -AAB5 AAA4 ; [.2CF6.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW YO> -AAB6 AAA4 ; [.2CF6.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW YO> -AAB9 AAA4 ; [.2CF6.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW YO> -AABB AAA4 ; [.2CF6.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW YO> -AABC AAA4 ; [.2CF6.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW YO> -AAA5 ; [.2CF7.0020.0002] # TAI VIET LETTER HIGH YO -AAB5 AAA5 ; [.2CF7.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH YO> -AAB6 AAA5 ; [.2CF7.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH YO> -AAB9 AAA5 ; [.2CF7.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH YO> -AABB AAA5 ; [.2CF7.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH YO> -AABC AAA5 ; [.2CF7.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH YO> -AAA6 ; [.2CF8.0020.0002] # TAI VIET LETTER LOW RO -AAB5 AAA6 ; [.2CF8.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW RO> -AAB6 AAA6 ; [.2CF8.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW RO> -AAB9 AAA6 ; [.2CF8.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW RO> -AABB AAA6 ; [.2CF8.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW RO> -AABC AAA6 ; [.2CF8.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW RO> -AAA7 ; [.2CF9.0020.0002] # TAI VIET LETTER HIGH RO -AAB5 AAA7 ; [.2CF9.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH RO> -AAB6 AAA7 ; [.2CF9.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH RO> -AAB9 AAA7 ; [.2CF9.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH RO> -AABB AAA7 ; [.2CF9.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH RO> -AABC AAA7 ; [.2CF9.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH RO> -AAA8 ; [.2CFA.0020.0002] # TAI VIET LETTER LOW LO -AAB5 AAA8 ; [.2CFA.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW LO> -AAB6 AAA8 ; [.2CFA.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW LO> -AAB9 AAA8 ; [.2CFA.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW LO> -AABB AAA8 ; [.2CFA.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW LO> -AABC AAA8 ; [.2CFA.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW LO> -AAA9 ; [.2CFB.0020.0002] # TAI VIET LETTER HIGH LO -AAB5 AAA9 ; [.2CFB.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH LO> -AAB6 AAA9 ; [.2CFB.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH LO> -AAB9 AAA9 ; [.2CFB.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH LO> -AABB AAA9 ; [.2CFB.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH LO> -AABC AAA9 ; [.2CFB.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH LO> -AAAA ; [.2CFC.0020.0002] # TAI VIET LETTER LOW VO -AAB5 AAAA ; [.2CFC.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW VO> -AAB6 AAAA ; [.2CFC.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW VO> -AAB9 AAAA ; [.2CFC.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW VO> -AABB AAAA ; [.2CFC.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW VO> -AABC AAAA ; [.2CFC.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW VO> -AAAB ; [.2CFD.0020.0002] # TAI VIET LETTER HIGH VO -AAB5 AAAB ; [.2CFD.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH VO> -AAB6 AAAB ; [.2CFD.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH VO> -AAB9 AAAB ; [.2CFD.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH VO> -AABB AAAB ; [.2CFD.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH VO> -AABC AAAB ; [.2CFD.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH VO> -AAAC ; [.2CFE.0020.0002] # TAI VIET LETTER LOW HO -AAB5 AAAC ; [.2CFE.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW HO> -AAB6 AAAC ; [.2CFE.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW HO> -AAB9 AAAC ; [.2CFE.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW HO> -AABB AAAC ; [.2CFE.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW HO> -AABC AAAC ; [.2CFE.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW HO> -AAAD ; [.2CFF.0020.0002] # TAI VIET LETTER HIGH HO -AAB5 AAAD ; [.2CFF.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH HO> -AAB6 AAAD ; [.2CFF.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH HO> -AAB9 AAAD ; [.2CFF.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH HO> -AABB AAAD ; [.2CFF.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH HO> -AABC AAAD ; [.2CFF.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH HO> -AAAE ; [.2D00.0020.0002] # TAI VIET LETTER LOW O -AAB5 AAAE ; [.2D00.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW O> -AAB6 AAAE ; [.2D00.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW O> -AAB9 AAAE ; [.2D00.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW O> -AABB AAAE ; [.2D00.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW O> -AABC AAAE ; [.2D00.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW O> -AAAF ; [.2D01.0020.0002] # TAI VIET LETTER HIGH O -AAB5 AAAF ; [.2D01.0020.0002][.2D07.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH O> -AAB6 AAAF ; [.2D01.0020.0002][.2D08.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH O> -AAB9 AAAF ; [.2D01.0020.0002][.2D0B.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH O> -AABB AAAF ; [.2D01.0020.0002][.2D0D.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH O> -AABC AAAF ; [.2D01.0020.0002][.2D0E.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH O> -AAB0 ; [.2D02.0020.0002] # TAI VIET MAI KANG -AAB1 ; [.2D03.0020.0002] # TAI VIET VOWEL AA -AAB2 ; [.2D04.0020.0002] # TAI VIET VOWEL I -AAB3 ; [.2D05.0020.0002] # TAI VIET VOWEL UE -AAB4 ; [.2D06.0020.0002] # TAI VIET VOWEL U -AAB5 ; [.2D07.0020.0002] # TAI VIET VOWEL E -AAB6 ; [.2D08.0020.0002] # TAI VIET VOWEL O -AAB7 ; [.2D09.0020.0002] # TAI VIET MAI KHIT -AAB8 ; [.2D0A.0020.0002] # TAI VIET VOWEL IA -AAB9 ; [.2D0B.0020.0002] # TAI VIET VOWEL UEA -AABA ; [.2D0C.0020.0002] # TAI VIET VOWEL UA -AABB ; [.2D0D.0020.0002] # TAI VIET VOWEL AUE -AABC ; [.2D0E.0020.0002] # TAI VIET VOWEL AY -AABD ; [.2D0F.0020.0002] # TAI VIET VOWEL AN -AABE ; [.2D10.0020.0002] # TAI VIET VOWEL AM -AAC0 ; [.2D11.0020.0002] # TAI VIET TONE MAI NUENG -AAC2 ; [.2D12.0020.0002] # TAI VIET TONE MAI SONG -AADB ; [.2D13.0020.0002] # TAI VIET SYMBOL KON -AADC ; [.2D14.0020.0002] # TAI VIET SYMBOL NUENG -0F40 ; [.2D15.0020.0002] # TIBETAN LETTER KA -0F69 ; [.2D15.0020.0002][.2D56.0020.0002] # TIBETAN LETTER KSSA -0F90 ; [.2D16.0020.0002] # TIBETAN SUBJOINED LETTER KA -0FB9 ; [.2D16.0020.0002][.2D56.0020.0002] # TIBETAN SUBJOINED LETTER KSSA -0F6B ; [.2D17.0020.0002] # TIBETAN LETTER KKA -0F41 ; [.2D18.0020.0002] # TIBETAN LETTER KHA -0F91 ; [.2D19.0020.0002] # TIBETAN SUBJOINED LETTER KHA -0F42 ; [.2D1A.0020.0002] # TIBETAN LETTER GA -0F43 ; [.2D1A.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER GHA -0F92 ; [.2D1B.0020.0002] # TIBETAN SUBJOINED LETTER GA -0F93 ; [.2D1B.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER GHA -0F44 ; [.2D1C.0020.0002] # TIBETAN LETTER NGA -0F94 ; [.2D1D.0020.0002] # TIBETAN SUBJOINED LETTER NGA -0F45 ; [.2D1E.0020.0002] # TIBETAN LETTER CA -0F95 ; [.2D1F.0020.0002] # TIBETAN SUBJOINED LETTER CA -0F46 ; [.2D20.0020.0002] # TIBETAN LETTER CHA -0F96 ; [.2D21.0020.0002] # TIBETAN SUBJOINED LETTER CHA -0F47 ; [.2D22.0020.0002] # TIBETAN LETTER JA -0F97 ; [.2D23.0020.0002] # TIBETAN SUBJOINED LETTER JA -0F49 ; [.2D24.0020.0002] # TIBETAN LETTER NYA -0F99 ; [.2D25.0020.0002] # TIBETAN SUBJOINED LETTER NYA -0F4A ; [.2D26.0020.0002] # TIBETAN LETTER TTA -0F9A ; [.2D27.0020.0002] # TIBETAN SUBJOINED LETTER TTA -0F4B ; [.2D28.0020.0002] # TIBETAN LETTER TTHA -0F9B ; [.2D29.0020.0002] # TIBETAN SUBJOINED LETTER TTHA -0F4C ; [.2D2A.0020.0002] # TIBETAN LETTER DDA -0F4D ; [.2D2A.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER DDHA -0F9C ; [.2D2B.0020.0002] # TIBETAN SUBJOINED LETTER DDA -0F9D ; [.2D2B.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER DDHA -0F4E ; [.2D2C.0020.0002] # TIBETAN LETTER NNA -0F9E ; [.2D2D.0020.0002] # TIBETAN SUBJOINED LETTER NNA -0F4F ; [.2D2E.0020.0002] # TIBETAN LETTER TA -0F9F ; [.2D2F.0020.0002] # TIBETAN SUBJOINED LETTER TA -0F50 ; [.2D30.0020.0002] # TIBETAN LETTER THA -0FA0 ; [.2D31.0020.0002] # TIBETAN SUBJOINED LETTER THA -0F51 ; [.2D32.0020.0002] # TIBETAN LETTER DA -0F52 ; [.2D32.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER DHA -0FA1 ; [.2D33.0020.0002] # TIBETAN SUBJOINED LETTER DA -0FA2 ; [.2D33.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER DHA -0F53 ; [.2D34.0020.0002] # TIBETAN LETTER NA -0FA3 ; [.2D35.0020.0002] # TIBETAN SUBJOINED LETTER NA -0F54 ; [.2D36.0020.0002] # TIBETAN LETTER PA -0FA4 ; [.2D37.0020.0002] # TIBETAN SUBJOINED LETTER PA -0F55 ; [.2D38.0020.0002] # TIBETAN LETTER PHA -0FA5 ; [.2D39.0020.0002] # TIBETAN SUBJOINED LETTER PHA -0F56 ; [.2D3A.0020.0002] # TIBETAN LETTER BA -0F57 ; [.2D3A.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER BHA -0FA6 ; [.2D3B.0020.0002] # TIBETAN SUBJOINED LETTER BA -0FA7 ; [.2D3B.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER BHA -0F58 ; [.2D3C.0020.0002] # TIBETAN LETTER MA -0FA8 ; [.2D3D.0020.0002] # TIBETAN SUBJOINED LETTER MA -0F59 ; [.2D3E.0020.0002] # TIBETAN LETTER TSA -0FA9 ; [.2D3F.0020.0002] # TIBETAN SUBJOINED LETTER TSA -0F5A ; [.2D40.0020.0002] # TIBETAN LETTER TSHA -0FAA ; [.2D41.0020.0002] # TIBETAN SUBJOINED LETTER TSHA -0F5B ; [.2D42.0020.0002] # TIBETAN LETTER DZA -0F5C ; [.2D42.0020.0002][.2D5A.0020.0002] # TIBETAN LETTER DZHA -0FAB ; [.2D43.0020.0002] # TIBETAN SUBJOINED LETTER DZA -0FAC ; [.2D43.0020.0002][.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER DZHA -0F5D ; [.2D44.0020.0002] # TIBETAN LETTER WA -0FAD ; [.2D45.0020.0002] # TIBETAN SUBJOINED LETTER WA -0FBA ; [.2D45.0020.0004][.0000.010C.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM WA -0F5E ; [.2D46.0020.0002] # TIBETAN LETTER ZHA -0FAE ; [.2D47.0020.0002] # TIBETAN SUBJOINED LETTER ZHA -0F5F ; [.2D48.0020.0002] # TIBETAN LETTER ZA -0FAF ; [.2D49.0020.0002] # TIBETAN SUBJOINED LETTER ZA -0F60 ; [.2D4A.0020.0002] # TIBETAN LETTER -A -0FB0 ; [.2D4B.0020.0002] # TIBETAN SUBJOINED LETTER -A -0F61 ; [.2D4C.0020.0002] # TIBETAN LETTER YA -0FB1 ; [.2D4D.0020.0002] # TIBETAN SUBJOINED LETTER YA -0FBB ; [.2D4D.0020.0004][.0000.010C.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM YA -0F62 ; [.2D4E.0020.0002] # TIBETAN LETTER RA -0F6A ; [.2D4E.0020.0004][.0000.010C.0004] # TIBETAN LETTER FIXED-FORM RA -0FB2 ; [.2D4F.0020.0002] # TIBETAN SUBJOINED LETTER RA -0FBC ; [.2D4F.0020.0004][.0000.010C.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM RA -0F6C ; [.2D50.0020.0002] # TIBETAN LETTER RRA -0F63 ; [.2D51.0020.0002] # TIBETAN LETTER LA -0FB3 ; [.2D52.0020.0002] # TIBETAN SUBJOINED LETTER LA -0F64 ; [.2D53.0020.0002] # TIBETAN LETTER SHA -0FB4 ; [.2D54.0020.0002] # TIBETAN SUBJOINED LETTER SHA -0F65 ; [.2D55.0020.0002] # TIBETAN LETTER SSA -0FB5 ; [.2D56.0020.0002] # TIBETAN SUBJOINED LETTER SSA -0F66 ; [.2D57.0020.0002] # TIBETAN LETTER SA -0FB6 ; [.2D58.0020.0002] # TIBETAN SUBJOINED LETTER SA -0F67 ; [.2D59.0020.0002] # TIBETAN LETTER HA -0FB7 ; [.2D5A.0020.0002] # TIBETAN SUBJOINED LETTER HA -0F68 ; [.2D5B.0020.0002] # TIBETAN LETTER A -0F00 ; [.2D5B.0020.0004][.2D72.0020.0004][.0000.00BF.0004] # TIBETAN SYLLABLE OM -0FB8 ; [.2D5C.0020.0002] # TIBETAN SUBJOINED LETTER A -0F88 ; [.2D5D.0020.0002] # TIBETAN SIGN LCE TSA CAN -0F8D ; [.2D5E.0020.0002] # TIBETAN SUBJOINED SIGN LCE TSA CAN -0F89 ; [.2D5F.0020.0002] # TIBETAN SIGN MCHU CAN -0F8E ; [.2D60.0020.0002] # TIBETAN SUBJOINED SIGN MCHU CAN -0F8C ; [.2D61.0020.0002] # TIBETAN SIGN INVERTED MCHU CAN -0F8F ; [.2D62.0020.0002] # TIBETAN SUBJOINED SIGN INVERTED MCHU CAN -0F8A ; [.2D63.0020.0002] # TIBETAN SIGN GRU CAN RGYINGS -0F8B ; [.2D64.0020.0002] # TIBETAN SIGN GRU MED RGYINGS -0F71 ; [.2D65.0020.0002] # TIBETAN VOWEL SIGN AA -0F72 ; [.2D66.0020.0002] # TIBETAN VOWEL SIGN I -0F73 ; [.2D67.0020.0002] # TIBETAN VOWEL SIGN II -0F71 0F72 ; [.2D67.0020.0002] # TIBETAN VOWEL SIGN II -0F80 ; [.2D68.0020.0002] # TIBETAN VOWEL SIGN REVERSED I -0F81 ; [.2D69.0020.0002] # TIBETAN VOWEL SIGN REVERSED II -0F71 0F80 ; [.2D69.0020.0002] # TIBETAN VOWEL SIGN REVERSED II -0F74 ; [.2D6A.0020.0002] # TIBETAN VOWEL SIGN U -0F75 ; [.2D6B.0020.0002] # TIBETAN VOWEL SIGN UU -0F71 0F74 ; [.2D6B.0020.0002] # TIBETAN VOWEL SIGN UU -0F76 ; [.2D6C.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R -0FB2 0F80 ; [.2D6C.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R -0F77 ; [.2D6D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR -0FB2 0F71 0F80 ; [.2D6D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR -0FB2 0F81 ; [.2D6D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR -0F78 ; [.2D6E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L -0FB3 0F80 ; [.2D6E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L -0F79 ; [.2D6F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL -0FB3 0F71 0F80 ; [.2D6F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL -0FB3 0F81 ; [.2D6F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL -0F7A ; [.2D70.0020.0002] # TIBETAN VOWEL SIGN E -0F7B ; [.2D71.0020.0002] # TIBETAN VOWEL SIGN EE -0F7C ; [.2D72.0020.0002] # TIBETAN VOWEL SIGN O -0F7D ; [.2D73.0020.0002] # TIBETAN VOWEL SIGN OO -0F84 ; [.2D74.0020.0002] # TIBETAN MARK HALANTA -1C00 ; [.2D75.0020.0002] # LEPCHA LETTER KA -1C01 ; [.2D76.0020.0002] # LEPCHA LETTER KLA -1C02 ; [.2D77.0020.0002] # LEPCHA LETTER KHA -1C03 ; [.2D78.0020.0002] # LEPCHA LETTER GA -1C04 ; [.2D79.0020.0002] # LEPCHA LETTER GLA -1C05 ; [.2D7A.0020.0002] # LEPCHA LETTER NGA -1C06 ; [.2D7B.0020.0002] # LEPCHA LETTER CA -1C07 ; [.2D7C.0020.0002] # LEPCHA LETTER CHA -1C08 ; [.2D7D.0020.0002] # LEPCHA LETTER JA -1C09 ; [.2D7E.0020.0002] # LEPCHA LETTER NYA -1C4D ; [.2D7F.0020.0002] # LEPCHA LETTER TTA -1C4E ; [.2D80.0020.0002] # LEPCHA LETTER TTHA -1C4F ; [.2D81.0020.0002] # LEPCHA LETTER DDA -1C0A ; [.2D82.0020.0002] # LEPCHA LETTER TA -1C0B ; [.2D83.0020.0002] # LEPCHA LETTER THA -1C0C ; [.2D84.0020.0002] # LEPCHA LETTER DA -1C0D ; [.2D85.0020.0002] # LEPCHA LETTER NA -1C0E ; [.2D86.0020.0002] # LEPCHA LETTER PA -1C0F ; [.2D87.0020.0002] # LEPCHA LETTER PLA -1C10 ; [.2D88.0020.0002] # LEPCHA LETTER PHA -1C11 ; [.2D89.0020.0002] # LEPCHA LETTER FA -1C12 ; [.2D8A.0020.0002] # LEPCHA LETTER FLA -1C13 ; [.2D8B.0020.0002] # LEPCHA LETTER BA -1C14 ; [.2D8C.0020.0002] # LEPCHA LETTER BLA -1C15 ; [.2D8D.0020.0002] # LEPCHA LETTER MA -1C16 ; [.2D8E.0020.0002] # LEPCHA LETTER MLA -1C17 ; [.2D8F.0020.0002] # LEPCHA LETTER TSA -1C18 ; [.2D90.0020.0002] # LEPCHA LETTER TSHA -1C19 ; [.2D91.0020.0002] # LEPCHA LETTER DZA -1C1A ; [.2D92.0020.0002] # LEPCHA LETTER YA -1C24 ; [.2D93.0020.0002] # LEPCHA SUBJOINED LETTER YA -1C1B ; [.2D94.0020.0002] # LEPCHA LETTER RA -1C25 ; [.2D95.0020.0002] # LEPCHA SUBJOINED LETTER RA -1C1C ; [.2D96.0020.0002] # LEPCHA LETTER LA -1C1D ; [.2D97.0020.0002] # LEPCHA LETTER HA -1C1E ; [.2D98.0020.0002] # LEPCHA LETTER HLA -1C1F ; [.2D99.0020.0002] # LEPCHA LETTER VA -1C20 ; [.2D9A.0020.0002] # LEPCHA LETTER SA -1C21 ; [.2D9B.0020.0002] # LEPCHA LETTER SHA -1C22 ; [.2D9C.0020.0002] # LEPCHA LETTER WA -1C23 ; [.2D9D.0020.0002] # LEPCHA LETTER A -1C36 ; [.2D9E.0020.0002] # LEPCHA SIGN RAN -1C26 ; [.2D9F.0020.0002] # LEPCHA VOWEL SIGN AA -1C27 ; [.2DA0.0020.0002] # LEPCHA VOWEL SIGN I -1C28 ; [.2DA1.0020.0002] # LEPCHA VOWEL SIGN O -1C29 ; [.2DA2.0020.0002] # LEPCHA VOWEL SIGN OO -1C2A ; [.2DA3.0020.0002] # LEPCHA VOWEL SIGN U -1C2B ; [.2DA4.0020.0002] # LEPCHA VOWEL SIGN UU -1C2C ; [.2DA5.0020.0002] # LEPCHA VOWEL SIGN E -1C2D ; [.2DA6.0020.0002] # LEPCHA CONSONANT SIGN K -1C2E ; [.2DA7.0020.0002] # LEPCHA CONSONANT SIGN M -1C2F ; [.2DA8.0020.0002] # LEPCHA CONSONANT SIGN L -1C30 ; [.2DA9.0020.0002] # LEPCHA CONSONANT SIGN N -1C31 ; [.2DAA.0020.0002] # LEPCHA CONSONANT SIGN P -1C32 ; [.2DAB.0020.0002] # LEPCHA CONSONANT SIGN R -1C33 ; [.2DAC.0020.0002] # LEPCHA CONSONANT SIGN T -1C34 ; [.2DAD.0020.0002] # LEPCHA CONSONANT SIGN NYIN-DO -1C35 ; [.2DAE.0020.0002] # LEPCHA CONSONANT SIGN KANG -A840 ; [.2DAF.0020.0002] # PHAGS-PA LETTER KA -A841 ; [.2DB0.0020.0002] # PHAGS-PA LETTER KHA -A842 ; [.2DB1.0020.0002] # PHAGS-PA LETTER GA -A843 ; [.2DB2.0020.0002] # PHAGS-PA LETTER NGA -A844 ; [.2DB3.0020.0002] # PHAGS-PA LETTER CA -A845 ; [.2DB4.0020.0002] # PHAGS-PA LETTER CHA -A846 ; [.2DB5.0020.0002] # PHAGS-PA LETTER JA -A847 ; [.2DB6.0020.0002] # PHAGS-PA LETTER NYA -A869 ; [.2DB7.0020.0002] # PHAGS-PA LETTER TTA -A86A ; [.2DB8.0020.0002] # PHAGS-PA LETTER TTHA -A86B ; [.2DB9.0020.0002] # PHAGS-PA LETTER DDA -A86C ; [.2DBA.0020.0002] # PHAGS-PA LETTER NNA -A848 ; [.2DBB.0020.0002] # PHAGS-PA LETTER TA -A849 ; [.2DBC.0020.0002] # PHAGS-PA LETTER THA -A84A ; [.2DBD.0020.0002] # PHAGS-PA LETTER DA -A84B ; [.2DBE.0020.0002] # PHAGS-PA LETTER NA -A84C ; [.2DBF.0020.0002] # PHAGS-PA LETTER PA -A84D ; [.2DC0.0020.0002] # PHAGS-PA LETTER PHA -A84E ; [.2DC1.0020.0002] # PHAGS-PA LETTER BA -A84F ; [.2DC2.0020.0002] # PHAGS-PA LETTER MA -A850 ; [.2DC3.0020.0002] # PHAGS-PA LETTER TSA -A851 ; [.2DC4.0020.0002] # PHAGS-PA LETTER TSHA -A852 ; [.2DC5.0020.0002] # PHAGS-PA LETTER DZA -A853 ; [.2DC6.0020.0002] # PHAGS-PA LETTER WA -A867 ; [.2DC7.0020.0002] # PHAGS-PA SUBJOINED LETTER WA -A854 ; [.2DC8.0020.0002] # PHAGS-PA LETTER ZHA -A855 ; [.2DC9.0020.0002] # PHAGS-PA LETTER ZA -A856 ; [.2DCA.0020.0002] # PHAGS-PA LETTER SMALL A -A857 ; [.2DCB.0020.0002] # PHAGS-PA LETTER YA -A868 ; [.2DCC.0020.0002] # PHAGS-PA SUBJOINED LETTER YA -A86D ; [.2DCD.0020.0002] # PHAGS-PA LETTER ALTERNATE YA -A858 ; [.2DCE.0020.0002] # PHAGS-PA LETTER RA -A871 ; [.2DCF.0020.0002] # PHAGS-PA SUBJOINED LETTER RA -A872 ; [.2DD0.0020.0002] # PHAGS-PA SUPERFIXED LETTER RA -A859 ; [.2DD1.0020.0002] # PHAGS-PA LETTER LA -A85A ; [.2DD2.0020.0002] # PHAGS-PA LETTER SHA -A86E ; [.2DD3.0020.0002] # PHAGS-PA LETTER VOICELESS SHA -A85B ; [.2DD4.0020.0002] # PHAGS-PA LETTER SA -A85C ; [.2DD5.0020.0002] # PHAGS-PA LETTER HA -A86F ; [.2DD6.0020.0002] # PHAGS-PA LETTER VOICED HA -A870 ; [.2DD7.0020.0002] # PHAGS-PA LETTER ASPIRATED FA -A85D ; [.2DD8.0020.0002] # PHAGS-PA LETTER A -A862 ; [.2DD9.0020.0002] # PHAGS-PA LETTER QA -A863 ; [.2DDA.0020.0002] # PHAGS-PA LETTER XA -A864 ; [.2DDB.0020.0002] # PHAGS-PA LETTER FA -A865 ; [.2DDC.0020.0002] # PHAGS-PA LETTER GGA -A85E ; [.2DDD.0020.0002] # PHAGS-PA LETTER I -A85F ; [.2DDE.0020.0002] # PHAGS-PA LETTER U -A860 ; [.2DDF.0020.0002] # PHAGS-PA LETTER E -A861 ; [.2DE0.0020.0002] # PHAGS-PA LETTER O -A866 ; [.2DE1.0020.0002] # PHAGS-PA LETTER EE -A873 ; [.2DE2.0020.0002] # PHAGS-PA LETTER CANDRABINDU -1900 ; [.2DE3.0020.0002] # LIMBU VOWEL-CARRIER LETTER -1901 ; [.2DE4.0020.0002] # LIMBU LETTER KA -1902 ; [.2DE5.0020.0002] # LIMBU LETTER KHA -1903 ; [.2DE6.0020.0002] # LIMBU LETTER GA -1904 ; [.2DE7.0020.0002] # LIMBU LETTER GHA -1905 ; [.2DE8.0020.0002] # LIMBU LETTER NGA -1906 ; [.2DE9.0020.0002] # LIMBU LETTER CA -1907 ; [.2DEA.0020.0002] # LIMBU LETTER CHA -1908 ; [.2DEB.0020.0002] # LIMBU LETTER JA -191D ; [.2DEB.0020.0004][.2E09.0020.0004] # LIMBU LETTER GYAN -1909 ; [.2DEC.0020.0002] # LIMBU LETTER JHA -190A ; [.2DED.0020.0002] # LIMBU LETTER YAN -190B ; [.2DEE.0020.0002] # LIMBU LETTER TA -191E ; [.2DEE.0020.0004][.2E0A.0020.0004] # LIMBU LETTER TRA -190C ; [.2DEF.0020.0002] # LIMBU LETTER THA -190D ; [.2DF0.0020.0002] # LIMBU LETTER DA -190E ; [.2DF1.0020.0002] # LIMBU LETTER DHA -190F ; [.2DF2.0020.0002] # LIMBU LETTER NA -1910 ; [.2DF3.0020.0002] # LIMBU LETTER PA -1911 ; [.2DF4.0020.0002] # LIMBU LETTER PHA -1912 ; [.2DF5.0020.0002] # LIMBU LETTER BA -1913 ; [.2DF6.0020.0002] # LIMBU LETTER BHA -1914 ; [.2DF7.0020.0002] # LIMBU LETTER MA -1915 ; [.2DF8.0020.0002] # LIMBU LETTER YA -1916 ; [.2DF9.0020.0002] # LIMBU LETTER RA -1917 ; [.2DFA.0020.0002] # LIMBU LETTER LA -1918 ; [.2DFB.0020.0002] # LIMBU LETTER WA -1919 ; [.2DFC.0020.0002] # LIMBU LETTER SHA -191A ; [.2DFD.0020.0002] # LIMBU LETTER SSA -191B ; [.2DFE.0020.0002] # LIMBU LETTER SA -191C ; [.2DFF.0020.0002] # LIMBU LETTER HA -1920 ; [.2E00.0020.0002] # LIMBU VOWEL SIGN A -1921 ; [.2E01.0020.0002] # LIMBU VOWEL SIGN I -1922 ; [.2E02.0020.0002] # LIMBU VOWEL SIGN U -1923 ; [.2E03.0020.0002] # LIMBU VOWEL SIGN EE -1924 ; [.2E04.0020.0002] # LIMBU VOWEL SIGN AI -1925 ; [.2E05.0020.0002] # LIMBU VOWEL SIGN OO -1926 ; [.2E06.0020.0002] # LIMBU VOWEL SIGN AU -1927 ; [.2E07.0020.0002] # LIMBU VOWEL SIGN E -1928 ; [.2E08.0020.0002] # LIMBU VOWEL SIGN O -1929 ; [.2E09.0020.0002] # LIMBU SUBJOINED LETTER YA -192A ; [.2E0A.0020.0002] # LIMBU SUBJOINED LETTER RA -192B ; [.2E0B.0020.0002] # LIMBU SUBJOINED LETTER WA -1930 ; [.2E0C.0020.0002] # LIMBU SMALL LETTER KA -1931 ; [.2E0D.0020.0002] # LIMBU SMALL LETTER NGA -1932 ; [.2E0E.0020.0002] # LIMBU SMALL LETTER ANUSVARA -1933 ; [.2E0F.0020.0002] # LIMBU SMALL LETTER TA -1934 ; [.2E10.0020.0002] # LIMBU SMALL LETTER NA -1935 ; [.2E11.0020.0002] # LIMBU SMALL LETTER PA -1936 ; [.2E12.0020.0002] # LIMBU SMALL LETTER MA -1937 ; [.2E13.0020.0002] # LIMBU SMALL LETTER RA -1938 ; [.2E14.0020.0002] # LIMBU SMALL LETTER LA -1700 ; [.2E15.0020.0002] # TAGALOG LETTER A -1701 ; [.2E16.0020.0002] # TAGALOG LETTER I -1702 ; [.2E17.0020.0002] # TAGALOG LETTER U -1703 ; [.2E18.0020.0002] # TAGALOG LETTER KA -1704 ; [.2E19.0020.0002] # TAGALOG LETTER GA -1705 ; [.2E1A.0020.0002] # TAGALOG LETTER NGA -1706 ; [.2E1B.0020.0002] # TAGALOG LETTER TA -1707 ; [.2E1C.0020.0002] # TAGALOG LETTER DA -1708 ; [.2E1D.0020.0002] # TAGALOG LETTER NA -1709 ; [.2E1E.0020.0002] # TAGALOG LETTER PA -170A ; [.2E1F.0020.0002] # TAGALOG LETTER BA -170B ; [.2E20.0020.0002] # TAGALOG LETTER MA -170C ; [.2E21.0020.0002] # TAGALOG LETTER YA -170E ; [.2E22.0020.0002] # TAGALOG LETTER LA -170F ; [.2E23.0020.0002] # TAGALOG LETTER WA -1710 ; [.2E24.0020.0002] # TAGALOG LETTER SA -1711 ; [.2E25.0020.0002] # TAGALOG LETTER HA -1712 ; [.2E26.0020.0002] # TAGALOG VOWEL SIGN I -1713 ; [.2E27.0020.0002] # TAGALOG VOWEL SIGN U -1714 ; [.2E28.0020.0002] # TAGALOG SIGN VIRAMA -1720 ; [.2E29.0020.0002] # HANUNOO LETTER A -1721 ; [.2E2A.0020.0002] # HANUNOO LETTER I -1722 ; [.2E2B.0020.0002] # HANUNOO LETTER U -1723 ; [.2E2C.0020.0002] # HANUNOO LETTER KA -1724 ; [.2E2D.0020.0002] # HANUNOO LETTER GA -1725 ; [.2E2E.0020.0002] # HANUNOO LETTER NGA -1726 ; [.2E2F.0020.0002] # HANUNOO LETTER TA -1727 ; [.2E30.0020.0002] # HANUNOO LETTER DA -1728 ; [.2E31.0020.0002] # HANUNOO LETTER NA -1729 ; [.2E32.0020.0002] # HANUNOO LETTER PA -172A ; [.2E33.0020.0002] # HANUNOO LETTER BA -172B ; [.2E34.0020.0002] # HANUNOO LETTER MA -172C ; [.2E35.0020.0002] # HANUNOO LETTER YA -172D ; [.2E36.0020.0002] # HANUNOO LETTER RA -172E ; [.2E37.0020.0002] # HANUNOO LETTER LA -172F ; [.2E38.0020.0002] # HANUNOO LETTER WA -1730 ; [.2E39.0020.0002] # HANUNOO LETTER SA -1731 ; [.2E3A.0020.0002] # HANUNOO LETTER HA -1732 ; [.2E3B.0020.0002] # HANUNOO VOWEL SIGN I -1733 ; [.2E3C.0020.0002] # HANUNOO VOWEL SIGN U -1734 ; [.2E3D.0020.0002] # HANUNOO SIGN PAMUDPOD -1740 ; [.2E3E.0020.0002] # BUHID LETTER A -1741 ; [.2E3F.0020.0002] # BUHID LETTER I -1742 ; [.2E40.0020.0002] # BUHID LETTER U -1743 ; [.2E41.0020.0002] # BUHID LETTER KA -1744 ; [.2E42.0020.0002] # BUHID LETTER GA -1745 ; [.2E43.0020.0002] # BUHID LETTER NGA -1746 ; [.2E44.0020.0002] # BUHID LETTER TA -1747 ; [.2E45.0020.0002] # BUHID LETTER DA -1748 ; [.2E46.0020.0002] # BUHID LETTER NA -1749 ; [.2E47.0020.0002] # BUHID LETTER PA -174A ; [.2E48.0020.0002] # BUHID LETTER BA -174B ; [.2E49.0020.0002] # BUHID LETTER MA -174C ; [.2E4A.0020.0002] # BUHID LETTER YA -174D ; [.2E4B.0020.0002] # BUHID LETTER RA -174E ; [.2E4C.0020.0002] # BUHID LETTER LA -174F ; [.2E4D.0020.0002] # BUHID LETTER WA -1750 ; [.2E4E.0020.0002] # BUHID LETTER SA -1751 ; [.2E4F.0020.0002] # BUHID LETTER HA -1752 ; [.2E50.0020.0002] # BUHID VOWEL SIGN I -1753 ; [.2E51.0020.0002] # BUHID VOWEL SIGN U -1760 ; [.2E52.0020.0002] # TAGBANWA LETTER A -1761 ; [.2E53.0020.0002] # TAGBANWA LETTER I -1762 ; [.2E54.0020.0002] # TAGBANWA LETTER U -1763 ; [.2E55.0020.0002] # TAGBANWA LETTER KA -1764 ; [.2E56.0020.0002] # TAGBANWA LETTER GA -1765 ; [.2E57.0020.0002] # TAGBANWA LETTER NGA -1766 ; [.2E58.0020.0002] # TAGBANWA LETTER TA -1767 ; [.2E59.0020.0002] # TAGBANWA LETTER DA -1768 ; [.2E5A.0020.0002] # TAGBANWA LETTER NA -1769 ; [.2E5B.0020.0002] # TAGBANWA LETTER PA -176A ; [.2E5C.0020.0002] # TAGBANWA LETTER BA -176B ; [.2E5D.0020.0002] # TAGBANWA LETTER MA -176C ; [.2E5E.0020.0002] # TAGBANWA LETTER YA -176E ; [.2E5F.0020.0002] # TAGBANWA LETTER LA -176F ; [.2E60.0020.0002] # TAGBANWA LETTER WA -1770 ; [.2E61.0020.0002] # TAGBANWA LETTER SA -1772 ; [.2E62.0020.0002] # TAGBANWA VOWEL SIGN I -1773 ; [.2E63.0020.0002] # TAGBANWA VOWEL SIGN U -1A00 ; [.2E64.0020.0002] # BUGINESE LETTER KA -1A01 ; [.2E65.0020.0002] # BUGINESE LETTER GA -1A02 ; [.2E66.0020.0002] # BUGINESE LETTER NGA -1A03 ; [.2E67.0020.0002] # BUGINESE LETTER NGKA -1A04 ; [.2E68.0020.0002] # BUGINESE LETTER PA -1A05 ; [.2E69.0020.0002] # BUGINESE LETTER BA -1A06 ; [.2E6A.0020.0002] # BUGINESE LETTER MA -1A07 ; [.2E6B.0020.0002] # BUGINESE LETTER MPA -1A08 ; [.2E6C.0020.0002] # BUGINESE LETTER TA -1A09 ; [.2E6D.0020.0002] # BUGINESE LETTER DA -1A0A ; [.2E6E.0020.0002] # BUGINESE LETTER NA -1A0B ; [.2E6F.0020.0002] # BUGINESE LETTER NRA -1A0C ; [.2E70.0020.0002] # BUGINESE LETTER CA -1A0D ; [.2E71.0020.0002] # BUGINESE LETTER JA -1A0E ; [.2E72.0020.0002] # BUGINESE LETTER NYA -1A0F ; [.2E73.0020.0002] # BUGINESE LETTER NYCA -1A10 ; [.2E74.0020.0002] # BUGINESE LETTER YA -1A11 ; [.2E75.0020.0002] # BUGINESE LETTER RA -1A12 ; [.2E76.0020.0002] # BUGINESE LETTER LA -1A13 ; [.2E77.0020.0002] # BUGINESE LETTER VA -1A14 ; [.2E78.0020.0002] # BUGINESE LETTER SA -1A15 ; [.2E79.0020.0002] # BUGINESE LETTER A -1A16 ; [.2E7A.0020.0002] # BUGINESE LETTER HA -1A17 ; [.2E7B.0020.0002] # BUGINESE VOWEL SIGN I -1A18 ; [.2E7C.0020.0002] # BUGINESE VOWEL SIGN U -1A19 ; [.2E7D.0020.0002] # BUGINESE VOWEL SIGN E -1A1A ; [.2E7E.0020.0002] # BUGINESE VOWEL SIGN O -1A1B ; [.2E7F.0020.0002] # BUGINESE VOWEL SIGN AE -1BC0 ; [.2E80.0020.0002] # BATAK LETTER A -1BC1 ; [.2E80.0020.0004] # BATAK LETTER SIMALUNGUN A -1BC2 ; [.2E81.0020.0002] # BATAK LETTER HA -1BC3 ; [.2E81.0020.0004] # BATAK LETTER SIMALUNGUN HA -1BC4 ; [.2E81.0020.0004] # BATAK LETTER MANDAILING HA -1BC5 ; [.2E82.0020.0002] # BATAK LETTER BA -1BC6 ; [.2E82.0020.0004] # BATAK LETTER KARO BA -1BC7 ; [.2E83.0020.0002] # BATAK LETTER PA -1BC8 ; [.2E83.0020.0004] # BATAK LETTER SIMALUNGUN PA -1BC9 ; [.2E84.0020.0002] # BATAK LETTER NA -1BCA ; [.2E84.0020.0004] # BATAK LETTER MANDAILING NA -1BCB ; [.2E85.0020.0002] # BATAK LETTER WA -1BCC ; [.2E85.0020.0004] # BATAK LETTER SIMALUNGUN WA -1BCD ; [.2E85.0020.0004] # BATAK LETTER PAKPAK WA -1BCE ; [.2E86.0020.0002] # BATAK LETTER GA -1BCF ; [.2E86.0020.0004] # BATAK LETTER SIMALUNGUN GA -1BD0 ; [.2E87.0020.0002] # BATAK LETTER JA -1BD1 ; [.2E88.0020.0002] # BATAK LETTER DA -1BD2 ; [.2E89.0020.0002] # BATAK LETTER RA -1BD3 ; [.2E89.0020.0004] # BATAK LETTER SIMALUNGUN RA -1BD4 ; [.2E8A.0020.0002] # BATAK LETTER MA -1BD5 ; [.2E8A.0020.0004] # BATAK LETTER SIMALUNGUN MA -1BD6 ; [.2E8B.0020.0002] # BATAK LETTER SOUTHERN TA -1BD7 ; [.2E8B.0020.0004] # BATAK LETTER NORTHERN TA -1BD8 ; [.2E8C.0020.0002] # BATAK LETTER SA -1BD9 ; [.2E8C.0020.0004] # BATAK LETTER SIMALUNGUN SA -1BDA ; [.2E8C.0020.0004] # BATAK LETTER MANDAILING SA -1BDB ; [.2E8D.0020.0002] # BATAK LETTER YA -1BDC ; [.2E8D.0020.0004] # BATAK LETTER SIMALUNGUN YA -1BDD ; [.2E8E.0020.0002] # BATAK LETTER NGA -1BDE ; [.2E8F.0020.0002] # BATAK LETTER LA -1BDF ; [.2E8F.0020.0004] # BATAK LETTER SIMALUNGUN LA -1BE0 ; [.2E90.0020.0002] # BATAK LETTER NYA -1BE1 ; [.2E91.0020.0002] # BATAK LETTER CA -1BE2 ; [.2E92.0020.0002] # BATAK LETTER NDA -1BE3 ; [.2E93.0020.0002] # BATAK LETTER MBA -1BE4 ; [.2E94.0020.0002] # BATAK LETTER I -1BE5 ; [.2E95.0020.0002] # BATAK LETTER U -1BE7 ; [.2E96.0020.0002] # BATAK VOWEL SIGN E -1BE8 ; [.2E96.0020.0004] # BATAK VOWEL SIGN PAKPAK E -1BE9 ; [.2E97.0020.0002] # BATAK VOWEL SIGN EE -1BEA ; [.2E98.0020.0002] # BATAK VOWEL SIGN I -1BEB ; [.2E98.0020.0004] # BATAK VOWEL SIGN KARO I -1BEC ; [.2E99.0020.0002] # BATAK VOWEL SIGN O -1BED ; [.2E99.0020.0004] # BATAK VOWEL SIGN KARO O -1BEE ; [.2E9A.0020.0002] # BATAK VOWEL SIGN U -1BEF ; [.2E9A.0020.0004] # BATAK VOWEL SIGN U FOR SIMALUNGUN SA -1BF0 ; [.2E9B.0020.0002] # BATAK CONSONANT SIGN NG -1BF1 ; [.2E9C.0020.0002] # BATAK CONSONANT SIGN H -1BF2 ; [.2E9D.0020.0002] # BATAK PANGOLAT -1BF3 ; [.2E9E.0020.0002] # BATAK PANONGONAN -A930 ; [.2E9F.0020.0002] # REJANG LETTER KA -A931 ; [.2EA0.0020.0002] # REJANG LETTER GA -A932 ; [.2EA1.0020.0002] # REJANG LETTER NGA -A933 ; [.2EA2.0020.0002] # REJANG LETTER TA -A934 ; [.2EA3.0020.0002] # REJANG LETTER DA -A935 ; [.2EA4.0020.0002] # REJANG LETTER NA -A936 ; [.2EA5.0020.0002] # REJANG LETTER PA -A937 ; [.2EA6.0020.0002] # REJANG LETTER BA -A938 ; [.2EA7.0020.0002] # REJANG LETTER MA -A939 ; [.2EA8.0020.0002] # REJANG LETTER CA -A93A ; [.2EA9.0020.0002] # REJANG LETTER JA -A93B ; [.2EAA.0020.0002] # REJANG LETTER NYA -A93C ; [.2EAB.0020.0002] # REJANG LETTER SA -A93D ; [.2EAC.0020.0002] # REJANG LETTER RA -A93E ; [.2EAD.0020.0002] # REJANG LETTER LA -A93F ; [.2EAE.0020.0002] # REJANG LETTER YA -A940 ; [.2EAF.0020.0002] # REJANG LETTER WA -A941 ; [.2EB0.0020.0002] # REJANG LETTER HA -A942 ; [.2EB1.0020.0002] # REJANG LETTER MBA -A943 ; [.2EB2.0020.0002] # REJANG LETTER NGGA -A944 ; [.2EB3.0020.0002] # REJANG LETTER NDA -A945 ; [.2EB4.0020.0002] # REJANG LETTER NYJA -A946 ; [.2EB5.0020.0002] # REJANG LETTER A -A947 ; [.2EB6.0020.0002] # REJANG VOWEL SIGN I -A948 ; [.2EB7.0020.0002] # REJANG VOWEL SIGN U -A949 ; [.2EB8.0020.0002] # REJANG VOWEL SIGN E -A94A ; [.2EB9.0020.0002] # REJANG VOWEL SIGN AI -A94B ; [.2EBA.0020.0002] # REJANG VOWEL SIGN O -A94C ; [.2EBB.0020.0002] # REJANG VOWEL SIGN AU -A94D ; [.2EBC.0020.0002] # REJANG VOWEL SIGN EU -A94E ; [.2EBD.0020.0002] # REJANG VOWEL SIGN EA -A94F ; [.2EBE.0020.0002] # REJANG CONSONANT SIGN NG -A950 ; [.2EBF.0020.0002] # REJANG CONSONANT SIGN N -A951 ; [.2EC0.0020.0002] # REJANG CONSONANT SIGN R -A952 ; [.2EC1.0020.0002] # REJANG CONSONANT SIGN H -A953 ; [.2EC2.0020.0002] # REJANG VIRAMA -A90A ; [.2EC3.0020.0002] # KAYAH LI LETTER KA -A90B ; [.2EC4.0020.0002] # KAYAH LI LETTER KHA -A90C ; [.2EC5.0020.0002] # KAYAH LI LETTER GA -A90D ; [.2EC6.0020.0002] # KAYAH LI LETTER NGA -A90E ; [.2EC7.0020.0002] # KAYAH LI LETTER SA -A90F ; [.2EC8.0020.0002] # KAYAH LI LETTER SHA -A910 ; [.2EC9.0020.0002] # KAYAH LI LETTER ZA -A911 ; [.2ECA.0020.0002] # KAYAH LI LETTER NYA -A912 ; [.2ECB.0020.0002] # KAYAH LI LETTER TA -A913 ; [.2ECC.0020.0002] # KAYAH LI LETTER HTA -A914 ; [.2ECD.0020.0002] # KAYAH LI LETTER NA -A915 ; [.2ECE.0020.0002] # KAYAH LI LETTER PA -A916 ; [.2ECF.0020.0002] # KAYAH LI LETTER PHA -A917 ; [.2ED0.0020.0002] # KAYAH LI LETTER MA -A918 ; [.2ED1.0020.0002] # KAYAH LI LETTER DA -A919 ; [.2ED2.0020.0002] # KAYAH LI LETTER BA -A91A ; [.2ED3.0020.0002] # KAYAH LI LETTER RA -A91B ; [.2ED4.0020.0002] # KAYAH LI LETTER YA -A91C ; [.2ED5.0020.0002] # KAYAH LI LETTER LA -A91D ; [.2ED6.0020.0002] # KAYAH LI LETTER WA -A91E ; [.2ED7.0020.0002] # KAYAH LI LETTER THA -A91F ; [.2ED8.0020.0002] # KAYAH LI LETTER HA -A920 ; [.2ED9.0020.0002] # KAYAH LI LETTER VA -A921 ; [.2EDA.0020.0002] # KAYAH LI LETTER CA -A922 ; [.2EDB.0020.0002] # KAYAH LI LETTER A -A923 ; [.2EDC.0020.0002] # KAYAH LI LETTER OE -A924 ; [.2EDD.0020.0002] # KAYAH LI LETTER I -A925 ; [.2EDE.0020.0002] # KAYAH LI LETTER OO -A926 ; [.2EDF.0020.0002] # KAYAH LI VOWEL UE -A927 ; [.2EE0.0020.0002] # KAYAH LI VOWEL E -A928 ; [.2EE1.0020.0002] # KAYAH LI VOWEL U -A929 ; [.2EE2.0020.0002] # KAYAH LI VOWEL EE -A92A ; [.2EE3.0020.0002] # KAYAH LI VOWEL O -1000 ; [.2EE4.0020.0002] # MYANMAR LETTER KA -1075 ; [.2EE5.0020.0002] # MYANMAR LETTER SHAN KA -1001 ; [.2EE6.0020.0002] # MYANMAR LETTER KHA -1076 ; [.2EE7.0020.0002] # MYANMAR LETTER SHAN KHA -1002 ; [.2EE8.0020.0002] # MYANMAR LETTER GA -1077 ; [.2EE9.0020.0002] # MYANMAR LETTER SHAN GA -AA60 ; [.2EEA.0020.0002] # MYANMAR LETTER KHAMTI GA -A9E9 ; [.2EEB.0020.0002] # MYANMAR LETTER TAI LAING GA -1003 ; [.2EEC.0020.0002] # MYANMAR LETTER GHA -A9E0 ; [.2EED.0020.0002] # MYANMAR LETTER SHAN GHA -A9EA ; [.2EEE.0020.0002] # MYANMAR LETTER TAI LAING GHA -1004 ; [.2EEF.0020.0002] # MYANMAR LETTER NGA -105A ; [.2EF0.0020.0002] # MYANMAR LETTER MON NGA -1005 ; [.2EF1.0020.0002] # MYANMAR LETTER CA -1078 ; [.2EF2.0020.0002] # MYANMAR LETTER SHAN CA -AA61 ; [.2EF3.0020.0002] # MYANMAR LETTER KHAMTI CA -1006 ; [.2EF4.0020.0002] # MYANMAR LETTER CHA -A9E1 ; [.2EF5.0020.0002] # MYANMAR LETTER SHAN CHA -AA62 ; [.2EF6.0020.0002] # MYANMAR LETTER KHAMTI CHA -AA7E ; [.2EF7.0020.0002] # MYANMAR LETTER SHWE PALAUNG CHA -1007 ; [.2EF8.0020.0002] # MYANMAR LETTER JA -AA63 ; [.2EF9.0020.0002] # MYANMAR LETTER KHAMTI JA -A9EB ; [.2EFA.0020.0002] # MYANMAR LETTER TAI LAING JA -1079 ; [.2EFB.0020.0002] # MYANMAR LETTER SHAN ZA -AA72 ; [.2EFC.0020.0002] # MYANMAR LETTER KHAMTI ZA -1008 ; [.2EFD.0020.0002] # MYANMAR LETTER JHA -105B ; [.2EFE.0020.0002] # MYANMAR LETTER MON JHA -A9E2 ; [.2EFF.0020.0002] # MYANMAR LETTER SHAN JHA -AA64 ; [.2F00.0020.0002] # MYANMAR LETTER KHAMTI JHA -A9EC ; [.2F01.0020.0002] # MYANMAR LETTER TAI LAING JHA -1061 ; [.2F02.0020.0002] # MYANMAR LETTER SGAW KAREN SHA -AA7F ; [.2F03.0020.0002] # MYANMAR LETTER SHWE PALAUNG SHA -1009 ; [.2F04.0020.0002] # MYANMAR LETTER NYA -107A ; [.2F05.0020.0002] # MYANMAR LETTER SHAN NYA -AA65 ; [.2F06.0020.0002] # MYANMAR LETTER KHAMTI NYA -A9E7 ; [.2F07.0020.0002] # MYANMAR LETTER TAI LAING NYA -100A ; [.2F08.0020.0002] # MYANMAR LETTER NNYA -100B ; [.2F09.0020.0002] # MYANMAR LETTER TTA -AA66 ; [.2F0A.0020.0002] # MYANMAR LETTER KHAMTI TTA -100C ; [.2F0B.0020.0002] # MYANMAR LETTER TTHA -AA67 ; [.2F0C.0020.0002] # MYANMAR LETTER KHAMTI TTHA -100D ; [.2F0D.0020.0002] # MYANMAR LETTER DDA -AA68 ; [.2F0E.0020.0002] # MYANMAR LETTER KHAMTI DDA -A9ED ; [.2F0F.0020.0002] # MYANMAR LETTER TAI LAING DDA -100E ; [.2F10.0020.0002] # MYANMAR LETTER DDHA -AA69 ; [.2F11.0020.0002] # MYANMAR LETTER KHAMTI DDHA -A9EE ; [.2F12.0020.0002] # MYANMAR LETTER TAI LAING DDHA -100F ; [.2F13.0020.0002] # MYANMAR LETTER NNA -106E ; [.2F14.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN NNA -A9E3 ; [.2F15.0020.0002] # MYANMAR LETTER SHAN NNA -A9EF ; [.2F16.0020.0002] # MYANMAR LETTER TAI LAING NNA -1010 ; [.2F17.0020.0002] # MYANMAR LETTER TA -1011 ; [.2F18.0020.0002] # MYANMAR LETTER THA -1012 ; [.2F19.0020.0002] # MYANMAR LETTER DA -107B ; [.2F1A.0020.0002] # MYANMAR LETTER SHAN DA -A9FB ; [.2F1B.0020.0002] # MYANMAR LETTER TAI LAING DA -1013 ; [.2F1C.0020.0002] # MYANMAR LETTER DHA -AA6A ; [.2F1D.0020.0002] # MYANMAR LETTER KHAMTI DHA -A9FC ; [.2F1E.0020.0002] # MYANMAR LETTER TAI LAING DHA -1014 ; [.2F1F.0020.0002] # MYANMAR LETTER NA -107C ; [.2F20.0020.0002] # MYANMAR LETTER SHAN NA -AA6B ; [.2F21.0020.0002] # MYANMAR LETTER KHAMTI NA -105E ; [.2F22.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL NA -1015 ; [.2F23.0020.0002] # MYANMAR LETTER PA -1016 ; [.2F24.0020.0002] # MYANMAR LETTER PHA -107D ; [.2F25.0020.0002] # MYANMAR LETTER SHAN PHA -107E ; [.2F26.0020.0002] # MYANMAR LETTER SHAN FA -AA6F ; [.2F27.0020.0002] # MYANMAR LETTER KHAMTI FA -108E ; [.2F28.0020.0002] # MYANMAR LETTER RUMAI PALAUNG FA -A9E8 ; [.2F29.0020.0002] # MYANMAR LETTER TAI LAING FA -1017 ; [.2F2A.0020.0002] # MYANMAR LETTER BA -107F ; [.2F2B.0020.0002] # MYANMAR LETTER SHAN BA -A9FD ; [.2F2C.0020.0002] # MYANMAR LETTER TAI LAING BA -1018 ; [.2F2D.0020.0002] # MYANMAR LETTER BHA -A9E4 ; [.2F2E.0020.0002] # MYANMAR LETTER SHAN BHA -A9FE ; [.2F2F.0020.0002] # MYANMAR LETTER TAI LAING BHA -1019 ; [.2F30.0020.0002] # MYANMAR LETTER MA -105F ; [.2F31.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL MA -101A ; [.2F32.0020.0002] # MYANMAR LETTER YA -103B ; [.2F33.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL YA -101B ; [.2F34.0020.0002] # MYANMAR LETTER RA -AA73 ; [.2F35.0020.0002] # MYANMAR LETTER KHAMTI RA -AA7A ; [.2F36.0020.0002] # MYANMAR LETTER AITON RA -103C ; [.2F37.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL RA -101C ; [.2F38.0020.0002] # MYANMAR LETTER LA -1060 ; [.2F39.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL LA -101D ; [.2F3A.0020.0002] # MYANMAR LETTER WA -103D ; [.2F3B.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL WA -1082 ; [.2F3C.0020.0002] # MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1080 ; [.2F3D.0020.0002] # MYANMAR LETTER SHAN THA -1050 ; [.2F3E.0020.0002] # MYANMAR LETTER SHA -1051 ; [.2F3F.0020.0002] # MYANMAR LETTER SSA -1065 ; [.2F40.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN THA -101E ; [.2F41.0020.0002] # MYANMAR LETTER SA -103F ; [.2F41.0020.0004][.2F7A.0020.0004][.2F41.0020.0004] # MYANMAR LETTER GREAT SA -AA6C ; [.2F42.0020.0002] # MYANMAR LETTER KHAMTI SA -101F ; [.2F43.0020.0002] # MYANMAR LETTER HA -1081 ; [.2F44.0020.0002] # MYANMAR LETTER SHAN HA -AA6D ; [.2F45.0020.0002] # MYANMAR LETTER KHAMTI HA -103E ; [.2F46.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL HA -AA6E ; [.2F47.0020.0002] # MYANMAR LETTER KHAMTI HHA -AA71 ; [.2F48.0020.0002] # MYANMAR LETTER KHAMTI XA -1020 ; [.2F49.0020.0002] # MYANMAR LETTER LLA -A9FA ; [.2F4A.0020.0002] # MYANMAR LETTER TAI LAING LLA -105C ; [.2F4B.0020.0002] # MYANMAR LETTER MON BBA -105D ; [.2F4C.0020.0002] # MYANMAR LETTER MON BBE -106F ; [.2F4D.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN YWA -1070 ; [.2F4E.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN GHWA -1066 ; [.2F4F.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN PWA -1021 ; [.2F50.0020.0002] # MYANMAR LETTER A -1022 ; [.2F51.0020.0002] # MYANMAR LETTER SHAN A -1023 ; [.2F52.0020.0002] # MYANMAR LETTER I -1024 ; [.2F53.0020.0002] # MYANMAR LETTER II -1025 ; [.2F54.0020.0002] # MYANMAR LETTER U -1026 ; [.2F55.0020.0002] # MYANMAR LETTER UU -1025 102E ; [.2F55.0020.0002] # MYANMAR LETTER UU -1052 ; [.2F56.0020.0002] # MYANMAR LETTER VOCALIC R -1053 ; [.2F57.0020.0002] # MYANMAR LETTER VOCALIC RR -1054 ; [.2F58.0020.0002] # MYANMAR LETTER VOCALIC L -1055 ; [.2F59.0020.0002] # MYANMAR LETTER VOCALIC LL -1027 ; [.2F5A.0020.0002] # MYANMAR LETTER E -1028 ; [.2F5B.0020.0002] # MYANMAR LETTER MON E -1029 ; [.2F5C.0020.0002] # MYANMAR LETTER O -102A ; [.2F5D.0020.0002] # MYANMAR LETTER AU -102C ; [.2F5E.0020.0002] # MYANMAR VOWEL SIGN AA -102B ; [.2F5E.0020.0004] # MYANMAR VOWEL SIGN TALL AA -1083 ; [.2F5F.0020.0002] # MYANMAR VOWEL SIGN SHAN AA -1072 ; [.2F60.0020.0002] # MYANMAR VOWEL SIGN KAYAH OE -109C ; [.2F61.0020.0002] # MYANMAR VOWEL SIGN AITON A -102D ; [.2F62.0020.0002] # MYANMAR VOWEL SIGN I -1071 ; [.2F63.0020.0002] # MYANMAR VOWEL SIGN GEBA KAREN I -102E ; [.2F64.0020.0002] # MYANMAR VOWEL SIGN II -1033 ; [.2F65.0020.0002] # MYANMAR VOWEL SIGN MON II -102F ; [.2F66.0020.0002] # MYANMAR VOWEL SIGN U -1073 ; [.2F67.0020.0002] # MYANMAR VOWEL SIGN KAYAH U -1074 ; [.2F68.0020.0002] # MYANMAR VOWEL SIGN KAYAH EE -1030 ; [.2F69.0020.0002] # MYANMAR VOWEL SIGN UU -1056 ; [.2F6A.0020.0002] # MYANMAR VOWEL SIGN VOCALIC R -1057 ; [.2F6B.0020.0002] # MYANMAR VOWEL SIGN VOCALIC RR -1058 ; [.2F6C.0020.0002] # MYANMAR VOWEL SIGN VOCALIC L -1059 ; [.2F6D.0020.0002] # MYANMAR VOWEL SIGN VOCALIC LL -1031 ; [.2F6E.0020.0002] # MYANMAR VOWEL SIGN E -1084 ; [.2F6F.0020.0002] # MYANMAR VOWEL SIGN SHAN E -1035 ; [.2F70.0020.0002] # MYANMAR VOWEL SIGN E ABOVE -1085 ; [.2F71.0020.0002] # MYANMAR VOWEL SIGN SHAN E ABOVE -1032 ; [.2F72.0020.0002] # MYANMAR VOWEL SIGN AI -109D ; [.2F73.0020.0002] # MYANMAR VOWEL SIGN AITON AI -1034 ; [.2F74.0020.0002] # MYANMAR VOWEL SIGN MON O -1062 ; [.2F75.0020.0002] # MYANMAR VOWEL SIGN SGAW KAREN EU -1067 ; [.2F76.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU -1068 ; [.2F77.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE -A9E5 ; [.2F78.0020.0002] # MYANMAR SIGN SHAN SAW -1086 ; [.2F79.0020.0002] # MYANMAR VOWEL SIGN SHAN FINAL Y -1039 ; [.2F7A.0020.0002] # MYANMAR SIGN VIRAMA -103A ; [.2F7B.0020.0002] # MYANMAR SIGN ASAT -1063 ; [.2F7C.0020.0002] # MYANMAR TONE MARK SGAW KAREN HATHI -1064 ; [.2F7D.0020.0002] # MYANMAR TONE MARK SGAW KAREN KE PHO -1069 ; [.2F7E.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-1 -106A ; [.2F7F.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-2 -106B ; [.2F80.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-3 -106C ; [.2F81.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-4 -106D ; [.2F82.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-5 -1087 ; [.2F83.0020.0002] # MYANMAR SIGN SHAN TONE-2 -108B ; [.2F84.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-2 -1088 ; [.2F85.0020.0002] # MYANMAR SIGN SHAN TONE-3 -108C ; [.2F86.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-3 -108D ; [.2F87.0020.0002] # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -1089 ; [.2F88.0020.0002] # MYANMAR SIGN SHAN TONE-5 -108A ; [.2F89.0020.0002] # MYANMAR SIGN SHAN TONE-6 -108F ; [.2F8A.0020.0002] # MYANMAR SIGN RUMAI PALAUNG TONE-5 -109A ; [.2F8B.0020.0002] # MYANMAR SIGN KHAMTI TONE-1 -109B ; [.2F8C.0020.0002] # MYANMAR SIGN KHAMTI TONE-3 -AA7B ; [.2F8D.0020.0002] # MYANMAR SIGN PAO KAREN TONE -AA7C ; [.2F8E.0020.0002] # MYANMAR SIGN TAI LAING TONE-2 -AA7D ; [.2F8F.0020.0002] # MYANMAR SIGN TAI LAING TONE-5 -AA74 ; [.2F90.0020.0002] # MYANMAR LOGOGRAM KHAMTI OAY -AA75 ; [.2F91.0020.0002] # MYANMAR LOGOGRAM KHAMTI QN -AA76 ; [.2F92.0020.0002] # MYANMAR LOGOGRAM KHAMTI HM -11103 ; [.2F93.0020.0002] # CHAKMA LETTER AA -11104 ; [.2F94.0020.0002] # CHAKMA LETTER I -11105 ; [.2F95.0020.0002] # CHAKMA LETTER U -11106 ; [.2F96.0020.0002] # CHAKMA LETTER E -11107 ; [.2F97.0020.0002] # CHAKMA LETTER KAA -11108 ; [.2F98.0020.0002] # CHAKMA LETTER KHAA -11109 ; [.2F99.0020.0002] # CHAKMA LETTER GAA -1110A ; [.2F9A.0020.0002] # CHAKMA LETTER GHAA -1110B ; [.2F9B.0020.0002] # CHAKMA LETTER NGAA -1110C ; [.2F9C.0020.0002] # CHAKMA LETTER CAA -1110D ; [.2F9D.0020.0002] # CHAKMA LETTER CHAA -1110E ; [.2F9E.0020.0002] # CHAKMA LETTER JAA -1110F ; [.2F9F.0020.0002] # CHAKMA LETTER JHAA -11110 ; [.2FA0.0020.0002] # CHAKMA LETTER NYAA -11111 ; [.2FA1.0020.0002] # CHAKMA LETTER TTAA -11112 ; [.2FA2.0020.0002] # CHAKMA LETTER TTHAA -11113 ; [.2FA3.0020.0002] # CHAKMA LETTER DDAA -11114 ; [.2FA4.0020.0002] # CHAKMA LETTER DDHAA -11115 ; [.2FA5.0020.0002] # CHAKMA LETTER NNAA -11116 ; [.2FA6.0020.0002] # CHAKMA LETTER TAA -11117 ; [.2FA7.0020.0002] # CHAKMA LETTER THAA -11118 ; [.2FA8.0020.0002] # CHAKMA LETTER DAA -11119 ; [.2FA9.0020.0002] # CHAKMA LETTER DHAA -1111A ; [.2FAA.0020.0002] # CHAKMA LETTER NAA -1111B ; [.2FAB.0020.0002] # CHAKMA LETTER PAA -1111C ; [.2FAC.0020.0002] # CHAKMA LETTER PHAA -1111D ; [.2FAD.0020.0002] # CHAKMA LETTER BAA -1111E ; [.2FAE.0020.0002] # CHAKMA LETTER BHAA -1111F ; [.2FAF.0020.0002] # CHAKMA LETTER MAA -11120 ; [.2FB0.0020.0002] # CHAKMA LETTER YYAA -11121 ; [.2FB1.0020.0002] # CHAKMA LETTER YAA -11122 ; [.2FB2.0020.0002] # CHAKMA LETTER RAA -11123 ; [.2FB3.0020.0002] # CHAKMA LETTER LAA -11124 ; [.2FB4.0020.0002] # CHAKMA LETTER WAA -11125 ; [.2FB5.0020.0002] # CHAKMA LETTER SAA -11126 ; [.2FB6.0020.0002] # CHAKMA LETTER HAA -11127 ; [.2FB7.0020.0002] # CHAKMA VOWEL SIGN A -11128 ; [.2FB8.0020.0002] # CHAKMA VOWEL SIGN I -11129 ; [.2FB9.0020.0002] # CHAKMA VOWEL SIGN II -1112A ; [.2FBA.0020.0002] # CHAKMA VOWEL SIGN U -1112B ; [.2FBB.0020.0002] # CHAKMA VOWEL SIGN UU -1112C ; [.2FBC.0020.0002] # CHAKMA VOWEL SIGN E -1112D ; [.2FBD.0020.0002] # CHAKMA VOWEL SIGN AI -1112E ; [.2FBE.0020.0002] # CHAKMA VOWEL SIGN O -11131 11127 ; [.2FBE.0020.0002] # CHAKMA VOWEL SIGN O -1112F ; [.2FBF.0020.0002] # CHAKMA VOWEL SIGN AU -11132 11127 ; [.2FBF.0020.0002] # CHAKMA VOWEL SIGN AU -11130 ; [.2FC0.0020.0002] # CHAKMA VOWEL SIGN OI -11131 ; [.2FC1.0020.0002] # CHAKMA O MARK -11132 ; [.2FC2.0020.0002] # CHAKMA AU MARK -11133 ; [.2FC3.0020.0002] # CHAKMA VIRAMA -11134 ; [.2FC4.0020.0002] # CHAKMA MAAYYAA -1780 ; [.2FC5.0020.0002] # KHMER LETTER KA -1781 ; [.2FC6.0020.0002] # KHMER LETTER KHA -1782 ; [.2FC7.0020.0002] # KHMER LETTER KO -1783 ; [.2FC8.0020.0002] # KHMER LETTER KHO -1784 ; [.2FC9.0020.0002] # KHMER LETTER NGO -1785 ; [.2FCA.0020.0002] # KHMER LETTER CA -1786 ; [.2FCB.0020.0002] # KHMER LETTER CHA -1787 ; [.2FCC.0020.0002] # KHMER LETTER CO -1788 ; [.2FCD.0020.0002] # KHMER LETTER CHO -1789 ; [.2FCE.0020.0002] # KHMER LETTER NYO -178A ; [.2FCF.0020.0002] # KHMER LETTER DA -178B ; [.2FD0.0020.0002] # KHMER LETTER TTHA -178C ; [.2FD1.0020.0002] # KHMER LETTER DO -178D ; [.2FD2.0020.0002] # KHMER LETTER TTHO -178E ; [.2FD3.0020.0002] # KHMER LETTER NNO -178F ; [.2FD4.0020.0002] # KHMER LETTER TA -1790 ; [.2FD5.0020.0002] # KHMER LETTER THA -1791 ; [.2FD6.0020.0002] # KHMER LETTER TO -1792 ; [.2FD7.0020.0002] # KHMER LETTER THO -1793 ; [.2FD8.0020.0002] # KHMER LETTER NO -1794 ; [.2FD9.0020.0002] # KHMER LETTER BA -1795 ; [.2FDA.0020.0002] # KHMER LETTER PHA -1796 ; [.2FDB.0020.0002] # KHMER LETTER PO -1797 ; [.2FDC.0020.0002] # KHMER LETTER PHO -1798 ; [.2FDD.0020.0002] # KHMER LETTER MO -1799 ; [.2FDE.0020.0002] # KHMER LETTER YO -179A ; [.2FDF.0020.0002] # KHMER LETTER RO -179B ; [.2FE0.0020.0002] # KHMER LETTER LO -179C ; [.2FE1.0020.0002] # KHMER LETTER VO -179D ; [.2FE2.0020.0002] # KHMER LETTER SHA -179E ; [.2FE3.0020.0002] # KHMER LETTER SSO -179F ; [.2FE4.0020.0002] # KHMER LETTER SA -17A0 ; [.2FE5.0020.0002] # KHMER LETTER HA -17A1 ; [.2FE6.0020.0002] # KHMER LETTER LA -17A2 ; [.2FE7.0020.0002] # KHMER LETTER QA -17DC ; [.2FE8.0020.0002] # KHMER SIGN AVAKRAHASANYA -17A3 ; [.2FE9.0020.0002] # KHMER INDEPENDENT VOWEL QAQ -17A4 ; [.2FEA.0020.0002] # KHMER INDEPENDENT VOWEL QAA -17A5 ; [.2FEB.0020.0002] # KHMER INDEPENDENT VOWEL QI -17A6 ; [.2FEC.0020.0002] # KHMER INDEPENDENT VOWEL QII -17A7 ; [.2FED.0020.0002] # KHMER INDEPENDENT VOWEL QU -17A8 ; [.2FEE.0020.0002] # KHMER INDEPENDENT VOWEL QUK -17A9 ; [.2FEF.0020.0002] # KHMER INDEPENDENT VOWEL QUU -17AA ; [.2FF0.0020.0002] # KHMER INDEPENDENT VOWEL QUUV -17AB ; [.2FF1.0020.0002] # KHMER INDEPENDENT VOWEL RY -17AC ; [.2FF2.0020.0002] # KHMER INDEPENDENT VOWEL RYY -17AD ; [.2FF3.0020.0002] # KHMER INDEPENDENT VOWEL LY -17AE ; [.2FF4.0020.0002] # KHMER INDEPENDENT VOWEL LYY -17AF ; [.2FF5.0020.0002] # KHMER INDEPENDENT VOWEL QE -17B0 ; [.2FF6.0020.0002] # KHMER INDEPENDENT VOWEL QAI -17B1 ; [.2FF7.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE ONE -17B2 ; [.2FF8.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE TWO -17B3 ; [.2FF9.0020.0002] # KHMER INDEPENDENT VOWEL QAU -17B6 ; [.2FFA.0020.0002] # KHMER VOWEL SIGN AA -17B7 ; [.2FFB.0020.0002] # KHMER VOWEL SIGN I -17B8 ; [.2FFC.0020.0002] # KHMER VOWEL SIGN II -17B9 ; [.2FFD.0020.0002] # KHMER VOWEL SIGN Y -17BA ; [.2FFE.0020.0002] # KHMER VOWEL SIGN YY -17BB ; [.2FFF.0020.0002] # KHMER VOWEL SIGN U -17BC ; [.3000.0020.0002] # KHMER VOWEL SIGN UU -17BD ; [.3001.0020.0002] # KHMER VOWEL SIGN UA -17BE ; [.3002.0020.0002] # KHMER VOWEL SIGN OE -17BF ; [.3003.0020.0002] # KHMER VOWEL SIGN YA -17C0 ; [.3004.0020.0002] # KHMER VOWEL SIGN IE -17C1 ; [.3005.0020.0002] # KHMER VOWEL SIGN E -17C2 ; [.3006.0020.0002] # KHMER VOWEL SIGN AE -17C3 ; [.3007.0020.0002] # KHMER VOWEL SIGN AI -17C4 ; [.3008.0020.0002] # KHMER VOWEL SIGN OO -17C5 ; [.3009.0020.0002] # KHMER VOWEL SIGN AU -17D2 ; [.300A.0020.0002] # KHMER SIGN COENG -1950 ; [.300B.0020.0002] # TAI LE LETTER KA -1951 ; [.300C.0020.0002] # TAI LE LETTER XA -1952 ; [.300D.0020.0002] # TAI LE LETTER NGA -1953 ; [.300E.0020.0002] # TAI LE LETTER TSA -1954 ; [.300F.0020.0002] # TAI LE LETTER SA -1955 ; [.3010.0020.0002] # TAI LE LETTER YA -1956 ; [.3011.0020.0002] # TAI LE LETTER TA -1957 ; [.3012.0020.0002] # TAI LE LETTER THA -1958 ; [.3013.0020.0002] # TAI LE LETTER LA -1959 ; [.3014.0020.0002] # TAI LE LETTER PA -195A ; [.3015.0020.0002] # TAI LE LETTER PHA -195B ; [.3016.0020.0002] # TAI LE LETTER MA -195C ; [.3017.0020.0002] # TAI LE LETTER FA -195D ; [.3018.0020.0002] # TAI LE LETTER VA -195E ; [.3019.0020.0002] # TAI LE LETTER HA -195F ; [.301A.0020.0002] # TAI LE LETTER QA -1960 ; [.301B.0020.0002] # TAI LE LETTER KHA -1961 ; [.301C.0020.0002] # TAI LE LETTER TSHA -1962 ; [.301D.0020.0002] # TAI LE LETTER NA -1963 ; [.301E.0020.0002] # TAI LE LETTER A -1964 ; [.301F.0020.0002] # TAI LE LETTER I -1965 ; [.3020.0020.0002] # TAI LE LETTER EE -1966 ; [.3021.0020.0002] # TAI LE LETTER EH -1967 ; [.3022.0020.0002] # TAI LE LETTER U -1968 ; [.3023.0020.0002] # TAI LE LETTER OO -1969 ; [.3024.0020.0002] # TAI LE LETTER O -196A ; [.3025.0020.0002] # TAI LE LETTER UE -196B ; [.3026.0020.0002] # TAI LE LETTER E -196C ; [.3027.0020.0002] # TAI LE LETTER AUE -196D ; [.3028.0020.0002] # TAI LE LETTER AI -1970 ; [.3029.0020.0002] # TAI LE LETTER TONE-2 -1971 ; [.302A.0020.0002] # TAI LE LETTER TONE-3 -1972 ; [.302B.0020.0002] # TAI LE LETTER TONE-4 -1973 ; [.302C.0020.0002] # TAI LE LETTER TONE-5 -1974 ; [.302D.0020.0002] # TAI LE LETTER TONE-6 -1980 ; [.302E.0020.0002] # NEW TAI LUE LETTER HIGH QA -19B5 1980 ; [.302E.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH QA> -19B6 1980 ; [.302E.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH QA> -19B7 1980 ; [.302E.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH QA> -19BA 1980 ; [.302E.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH QA> -1981 ; [.302F.0020.0002] # NEW TAI LUE LETTER LOW QA -19B5 1981 ; [.302F.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW QA> -19B6 1981 ; [.302F.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW QA> -19B7 1981 ; [.302F.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW QA> -19BA 1981 ; [.302F.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW QA> -1982 ; [.3030.0020.0002] # NEW TAI LUE LETTER HIGH KA -19B5 1982 ; [.3030.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KA> -19B6 1982 ; [.3030.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KA> -19B7 1982 ; [.3030.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KA> -19BA 1982 ; [.3030.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KA> -1983 ; [.3031.0020.0002] # NEW TAI LUE LETTER HIGH XA -19B5 1983 ; [.3031.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XA> -19B6 1983 ; [.3031.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XA> -19B7 1983 ; [.3031.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XA> -19BA 1983 ; [.3031.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XA> -1984 ; [.3032.0020.0002] # NEW TAI LUE LETTER HIGH NGA -19B5 1984 ; [.3032.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NGA> -19B6 1984 ; [.3032.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NGA> -19B7 1984 ; [.3032.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NGA> -19BA 1984 ; [.3032.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NGA> -1985 ; [.3033.0020.0002] # NEW TAI LUE LETTER LOW KA -19B5 1985 ; [.3033.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KA> -19B6 1985 ; [.3033.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KA> -19B7 1985 ; [.3033.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KA> -19BA 1985 ; [.3033.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KA> -1986 ; [.3034.0020.0002] # NEW TAI LUE LETTER LOW XA -19B5 1986 ; [.3034.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XA> -19B6 1986 ; [.3034.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XA> -19B7 1986 ; [.3034.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XA> -19BA 1986 ; [.3034.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XA> -1987 ; [.3035.0020.0002] # NEW TAI LUE LETTER LOW NGA -19B5 1987 ; [.3035.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NGA> -19B6 1987 ; [.3035.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NGA> -19B7 1987 ; [.3035.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NGA> -19BA 1987 ; [.3035.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NGA> -1988 ; [.3036.0020.0002] # NEW TAI LUE LETTER HIGH TSA -19B5 1988 ; [.3036.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TSA> -19B6 1988 ; [.3036.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TSA> -19B7 1988 ; [.3036.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TSA> -19BA 1988 ; [.3036.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TSA> -1989 ; [.3037.0020.0002] # NEW TAI LUE LETTER HIGH SA -19B5 1989 ; [.3037.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SA> -19B6 1989 ; [.3037.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SA> -19B7 1989 ; [.3037.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SA> -19BA 1989 ; [.3037.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SA> -198A ; [.3038.0020.0002] # NEW TAI LUE LETTER HIGH YA -19B5 198A ; [.3038.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH YA> -19B6 198A ; [.3038.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH YA> -19B7 198A ; [.3038.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH YA> -19BA 198A ; [.3038.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH YA> -198B ; [.3039.0020.0002] # NEW TAI LUE LETTER LOW TSA -19B5 198B ; [.3039.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TSA> -19B6 198B ; [.3039.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TSA> -19B7 198B ; [.3039.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TSA> -19BA 198B ; [.3039.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TSA> -198C ; [.303A.0020.0002] # NEW TAI LUE LETTER LOW SA -19B5 198C ; [.303A.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SA> -19B6 198C ; [.303A.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SA> -19B7 198C ; [.303A.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SA> -19BA 198C ; [.303A.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SA> -198D ; [.303B.0020.0002] # NEW TAI LUE LETTER LOW YA -19B5 198D ; [.303B.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW YA> -19B6 198D ; [.303B.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW YA> -19B7 198D ; [.303B.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW YA> -19BA 198D ; [.303B.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW YA> -198E ; [.303C.0020.0002] # NEW TAI LUE LETTER HIGH TA -19B5 198E ; [.303C.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TA> -19B6 198E ; [.303C.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TA> -19B7 198E ; [.303C.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TA> -19BA 198E ; [.303C.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TA> -198F ; [.303D.0020.0002] # NEW TAI LUE LETTER HIGH THA -19B5 198F ; [.303D.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH THA> -19B6 198F ; [.303D.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH THA> -19B7 198F ; [.303D.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH THA> -19BA 198F ; [.303D.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH THA> -1990 ; [.303E.0020.0002] # NEW TAI LUE LETTER HIGH NA -19B5 1990 ; [.303E.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NA> -19B6 1990 ; [.303E.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NA> -19B7 1990 ; [.303E.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NA> -19BA 1990 ; [.303E.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NA> -1991 ; [.303F.0020.0002] # NEW TAI LUE LETTER LOW TA -19B5 1991 ; [.303F.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TA> -19B6 1991 ; [.303F.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TA> -19B7 1991 ; [.303F.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TA> -19BA 1991 ; [.303F.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TA> -1992 ; [.3040.0020.0002] # NEW TAI LUE LETTER LOW THA -19B5 1992 ; [.3040.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW THA> -19B6 1992 ; [.3040.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW THA> -19B7 1992 ; [.3040.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW THA> -19BA 1992 ; [.3040.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW THA> -1993 ; [.3041.0020.0002] # NEW TAI LUE LETTER LOW NA -19B5 1993 ; [.3041.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NA> -19B6 1993 ; [.3041.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NA> -19B7 1993 ; [.3041.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NA> -19BA 1993 ; [.3041.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NA> -1994 ; [.3042.0020.0002] # NEW TAI LUE LETTER HIGH PA -19B5 1994 ; [.3042.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PA> -19B6 1994 ; [.3042.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PA> -19B7 1994 ; [.3042.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PA> -19BA 1994 ; [.3042.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PA> -1995 ; [.3043.0020.0002] # NEW TAI LUE LETTER HIGH PHA -19B5 1995 ; [.3043.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PHA> -19B6 1995 ; [.3043.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PHA> -19B7 1995 ; [.3043.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PHA> -19BA 1995 ; [.3043.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PHA> -1996 ; [.3044.0020.0002] # NEW TAI LUE LETTER HIGH MA -19B5 1996 ; [.3044.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH MA> -19B6 1996 ; [.3044.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH MA> -19B7 1996 ; [.3044.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH MA> -19BA 1996 ; [.3044.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH MA> -1997 ; [.3045.0020.0002] # NEW TAI LUE LETTER LOW PA -19B5 1997 ; [.3045.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PA> -19B6 1997 ; [.3045.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PA> -19B7 1997 ; [.3045.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PA> -19BA 1997 ; [.3045.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PA> -1998 ; [.3046.0020.0002] # NEW TAI LUE LETTER LOW PHA -19B5 1998 ; [.3046.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PHA> -19B6 1998 ; [.3046.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PHA> -19B7 1998 ; [.3046.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PHA> -19BA 1998 ; [.3046.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PHA> -1999 ; [.3047.0020.0002] # NEW TAI LUE LETTER LOW MA -19B5 1999 ; [.3047.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW MA> -19B6 1999 ; [.3047.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW MA> -19B7 1999 ; [.3047.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW MA> -19BA 1999 ; [.3047.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW MA> -199A ; [.3048.0020.0002] # NEW TAI LUE LETTER HIGH FA -19B5 199A ; [.3048.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH FA> -19B6 199A ; [.3048.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH FA> -19B7 199A ; [.3048.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH FA> -19BA 199A ; [.3048.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH FA> -199B ; [.3049.0020.0002] # NEW TAI LUE LETTER HIGH VA -19B5 199B ; [.3049.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH VA> -19B6 199B ; [.3049.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH VA> -19B7 199B ; [.3049.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH VA> -19BA 199B ; [.3049.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH VA> -199C ; [.304A.0020.0002] # NEW TAI LUE LETTER HIGH LA -19B5 199C ; [.304A.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH LA> -19B6 199C ; [.304A.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH LA> -19DE ; [.304A.0020.0004][.3060.0020.0004] # NEW TAI LUE SIGN LAE -19DF ; [.304A.0020.0004][.3060.0020.0004][.306B.0020.0004] # NEW TAI LUE SIGN LAEV -19B7 199C ; [.304A.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH LA> -19BA 199C ; [.304A.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH LA> -199D ; [.304B.0020.0002] # NEW TAI LUE LETTER LOW FA -19B5 199D ; [.304B.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW FA> -19B6 199D ; [.304B.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW FA> -19B7 199D ; [.304B.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW FA> -19BA 199D ; [.304B.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW FA> -199E ; [.304C.0020.0002] # NEW TAI LUE LETTER LOW VA -19B5 199E ; [.304C.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW VA> -19B6 199E ; [.304C.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW VA> -19B7 199E ; [.304C.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW VA> -19BA 199E ; [.304C.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW VA> -199F ; [.304D.0020.0002] # NEW TAI LUE LETTER LOW LA -19B5 199F ; [.304D.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW LA> -19B6 199F ; [.304D.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW LA> -19B7 199F ; [.304D.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW LA> -19BA 199F ; [.304D.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW LA> -19A0 ; [.304E.0020.0002] # NEW TAI LUE LETTER HIGH HA -19B5 19A0 ; [.304E.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH HA> -19B6 19A0 ; [.304E.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH HA> -19B7 19A0 ; [.304E.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH HA> -19BA 19A0 ; [.304E.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH HA> -19A1 ; [.304F.0020.0002] # NEW TAI LUE LETTER HIGH DA -19B5 19A1 ; [.304F.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH DA> -19B6 19A1 ; [.304F.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH DA> -19B7 19A1 ; [.304F.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH DA> -19BA 19A1 ; [.304F.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH DA> -19A2 ; [.3050.0020.0002] # NEW TAI LUE LETTER HIGH BA -19B5 19A2 ; [.3050.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH BA> -19B6 19A2 ; [.3050.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH BA> -19B7 19A2 ; [.3050.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH BA> -19BA 19A2 ; [.3050.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH BA> -19A3 ; [.3051.0020.0002] # NEW TAI LUE LETTER LOW HA -19B5 19A3 ; [.3051.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW HA> -19B6 19A3 ; [.3051.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW HA> -19B7 19A3 ; [.3051.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW HA> -19BA 19A3 ; [.3051.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW HA> -19A4 ; [.3052.0020.0002] # NEW TAI LUE LETTER LOW DA -19B5 19A4 ; [.3052.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW DA> -19B6 19A4 ; [.3052.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW DA> -19B7 19A4 ; [.3052.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW DA> -19BA 19A4 ; [.3052.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW DA> -19A5 ; [.3053.0020.0002] # NEW TAI LUE LETTER LOW BA -19B5 19A5 ; [.3053.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW BA> -19B6 19A5 ; [.3053.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW BA> -19B7 19A5 ; [.3053.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW BA> -19BA 19A5 ; [.3053.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW BA> -19A6 ; [.3054.0020.0002] # NEW TAI LUE LETTER HIGH KVA -19B5 19A6 ; [.3054.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KVA> -19B6 19A6 ; [.3054.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KVA> -19B7 19A6 ; [.3054.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KVA> -19BA 19A6 ; [.3054.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KVA> -19A7 ; [.3055.0020.0002] # NEW TAI LUE LETTER HIGH XVA -19B5 19A7 ; [.3055.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XVA> -19B6 19A7 ; [.3055.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XVA> -19B7 19A7 ; [.3055.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XVA> -19BA 19A7 ; [.3055.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XVA> -19A8 ; [.3056.0020.0002] # NEW TAI LUE LETTER LOW KVA -19B5 19A8 ; [.3056.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KVA> -19B6 19A8 ; [.3056.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KVA> -19B7 19A8 ; [.3056.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KVA> -19BA 19A8 ; [.3056.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KVA> -19A9 ; [.3057.0020.0002] # NEW TAI LUE LETTER LOW XVA -19B5 19A9 ; [.3057.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XVA> -19B6 19A9 ; [.3057.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XVA> -19B7 19A9 ; [.3057.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XVA> -19BA 19A9 ; [.3057.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XVA> -19AA ; [.3058.0020.0002] # NEW TAI LUE LETTER HIGH SUA -19B5 19AA ; [.3058.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SUA> -19B6 19AA ; [.3058.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SUA> -19B7 19AA ; [.3058.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SUA> -19BA 19AA ; [.3058.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SUA> -19AB ; [.3059.0020.0002] # NEW TAI LUE LETTER LOW SUA -19B5 19AB ; [.3059.0020.0002][.305F.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SUA> -19B6 19AB ; [.3059.0020.0002][.3060.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SUA> -19B7 19AB ; [.3059.0020.0002][.3061.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SUA> -19BA 19AB ; [.3059.0020.0002][.3064.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SUA> -19B0 ; [.305A.0020.0002] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER -19B1 ; [.305B.0020.0002] # NEW TAI LUE VOWEL SIGN AA -19B2 ; [.305C.0020.0002] # NEW TAI LUE VOWEL SIGN II -19B3 ; [.305D.0020.0002] # NEW TAI LUE VOWEL SIGN U -19B4 ; [.305E.0020.0002] # NEW TAI LUE VOWEL SIGN UU -19B5 ; [.305F.0020.0002] # NEW TAI LUE VOWEL SIGN E -19B6 ; [.3060.0020.0002] # NEW TAI LUE VOWEL SIGN AE -19B7 ; [.3061.0020.0002] # NEW TAI LUE VOWEL SIGN O -19B8 ; [.3062.0020.0002] # NEW TAI LUE VOWEL SIGN OA -19B9 ; [.3063.0020.0002] # NEW TAI LUE VOWEL SIGN UE -19BA ; [.3064.0020.0002] # NEW TAI LUE VOWEL SIGN AY -19BB ; [.3065.0020.0002] # NEW TAI LUE VOWEL SIGN AAY -19BC ; [.3066.0020.0002] # NEW TAI LUE VOWEL SIGN UY -19BD ; [.3067.0020.0002] # NEW TAI LUE VOWEL SIGN OY -19BE ; [.3068.0020.0002] # NEW TAI LUE VOWEL SIGN OAY -19BF ; [.3069.0020.0002] # NEW TAI LUE VOWEL SIGN UEY -19C0 ; [.306A.0020.0002] # NEW TAI LUE VOWEL SIGN IY -19C1 ; [.306B.0020.0002] # NEW TAI LUE LETTER FINAL V -19C2 ; [.306C.0020.0002] # NEW TAI LUE LETTER FINAL NG -19C3 ; [.306D.0020.0002] # NEW TAI LUE LETTER FINAL N -19C4 ; [.306E.0020.0002] # NEW TAI LUE LETTER FINAL M -19C5 ; [.306F.0020.0002] # NEW TAI LUE LETTER FINAL K -19C6 ; [.3070.0020.0002] # NEW TAI LUE LETTER FINAL D -19C7 ; [.3071.0020.0002] # NEW TAI LUE LETTER FINAL B -19C8 ; [.3072.0020.0002] # NEW TAI LUE TONE MARK-1 -19C9 ; [.3073.0020.0002] # NEW TAI LUE TONE MARK-2 -1A20 ; [.3074.0020.0002] # TAI THAM LETTER HIGH KA -1A21 ; [.3075.0020.0002] # TAI THAM LETTER HIGH KHA -1A22 ; [.3076.0020.0002] # TAI THAM LETTER HIGH KXA -1A23 ; [.3077.0020.0002] # TAI THAM LETTER LOW KA -1A24 ; [.3078.0020.0002] # TAI THAM LETTER LOW KXA -1A25 ; [.3079.0020.0002] # TAI THAM LETTER LOW KHA -1A26 ; [.307A.0020.0002] # TAI THAM LETTER NGA -1A58 ; [.307A.0020.0004] # TAI THAM SIGN MAI KANG LAI -1A59 ; [.307A.0020.0004] # TAI THAM CONSONANT SIGN FINAL NGA -1A27 ; [.307B.0020.0002] # TAI THAM LETTER HIGH CA -1A28 ; [.307C.0020.0002] # TAI THAM LETTER HIGH CHA -1A29 ; [.307D.0020.0002] # TAI THAM LETTER LOW CA -1A2A ; [.307E.0020.0002] # TAI THAM LETTER LOW SA -1A2B ; [.307F.0020.0002] # TAI THAM LETTER LOW CHA -1A2C ; [.3080.0020.0002] # TAI THAM LETTER NYA -1A2D ; [.3081.0020.0002] # TAI THAM LETTER RATA -1A2E ; [.3082.0020.0002] # TAI THAM LETTER HIGH RATHA -1A2F ; [.3083.0020.0002] # TAI THAM LETTER DA -1A30 ; [.3084.0020.0002] # TAI THAM LETTER LOW RATHA -1A31 ; [.3085.0020.0002] # TAI THAM LETTER RANA -1A32 ; [.3086.0020.0002] # TAI THAM LETTER HIGH TA -1A33 ; [.3087.0020.0002] # TAI THAM LETTER HIGH THA -1A34 ; [.3088.0020.0002] # TAI THAM LETTER LOW TA -1A35 ; [.3089.0020.0002] # TAI THAM LETTER LOW THA -1A36 ; [.308A.0020.0002] # TAI THAM LETTER NA -1A37 ; [.308B.0020.0002] # TAI THAM LETTER BA -1A38 ; [.308C.0020.0002] # TAI THAM LETTER HIGH PA -1A39 ; [.308D.0020.0002] # TAI THAM LETTER HIGH PHA -1A3A ; [.308E.0020.0002] # TAI THAM LETTER HIGH FA -1A3B ; [.308F.0020.0002] # TAI THAM LETTER LOW PA -1A5A ; [.308F.0020.0004] # TAI THAM CONSONANT SIGN LOW PA -1A5B ; [.308F.0020.0004] # TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA -1A3C ; [.3090.0020.0002] # TAI THAM LETTER LOW FA -1A3D ; [.3091.0020.0002] # TAI THAM LETTER LOW PHA -1A3E ; [.3092.0020.0002] # TAI THAM LETTER MA -1A3F ; [.3093.0020.0002] # TAI THAM LETTER LOW YA -1A40 ; [.3094.0020.0002] # TAI THAM LETTER HIGH YA -1A41 ; [.3095.0020.0002] # TAI THAM LETTER RA -1A42 ; [.3096.0020.0002] # TAI THAM LETTER RUE -1A43 ; [.3097.0020.0002] # TAI THAM LETTER LA -1A44 ; [.3098.0020.0002] # TAI THAM LETTER LUE -1A45 ; [.3099.0020.0002] # TAI THAM LETTER WA -1A46 ; [.309A.0020.0002] # TAI THAM LETTER HIGH SHA -1A54 ; [.309A.0020.0004][.30C0.0020.0004][.309A.0020.0004] # TAI THAM LETTER GREAT SA -1A47 ; [.309B.0020.0002] # TAI THAM LETTER HIGH SSA -1A48 ; [.309C.0020.0002] # TAI THAM LETTER HIGH SA -1A49 ; [.309D.0020.0002] # TAI THAM LETTER HIGH HA -1A4A ; [.309E.0020.0002] # TAI THAM LETTER LLA -1A4B ; [.309F.0020.0002] # TAI THAM LETTER A -1A4C ; [.30A0.0020.0002] # TAI THAM LETTER LOW HA -1A53 ; [.30A1.0020.0002] # TAI THAM LETTER LAE -1A6B ; [.30A2.0020.0002] # TAI THAM VOWEL SIGN O -1A55 ; [.30A3.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL RA -1A56 ; [.30A4.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL LA -1A57 ; [.30A5.0020.0002] # TAI THAM CONSONANT SIGN LA TANG LAI -1A5C ; [.30A6.0020.0002] # TAI THAM CONSONANT SIGN MA -1A5D ; [.30A7.0020.0002] # TAI THAM CONSONANT SIGN BA -1A5E ; [.30A8.0020.0002] # TAI THAM CONSONANT SIGN SA -1A4D ; [.30A9.0020.0002] # TAI THAM LETTER I -1A4E ; [.30AA.0020.0002] # TAI THAM LETTER II -1A4F ; [.30AB.0020.0002] # TAI THAM LETTER U -1A50 ; [.30AC.0020.0002] # TAI THAM LETTER UU -1A51 ; [.30AD.0020.0002] # TAI THAM LETTER EE -1A52 ; [.30AE.0020.0002] # TAI THAM LETTER OO -1A61 ; [.30AF.0020.0002] # TAI THAM VOWEL SIGN A -1A6C ; [.30B0.0020.0002] # TAI THAM VOWEL SIGN OA BELOW -1A62 ; [.30B1.0020.0002] # TAI THAM VOWEL SIGN MAI SAT -1A63 ; [.30B2.0020.0002] # TAI THAM VOWEL SIGN AA -1A64 ; [.30B2.0020.0004] # TAI THAM VOWEL SIGN TALL AA -1A65 ; [.30B3.0020.0002] # TAI THAM VOWEL SIGN I -1A66 ; [.30B4.0020.0002] # TAI THAM VOWEL SIGN II -1A67 ; [.30B5.0020.0002] # TAI THAM VOWEL SIGN UE -1A68 ; [.30B6.0020.0002] # TAI THAM VOWEL SIGN UUE -1A69 ; [.30B7.0020.0002] # TAI THAM VOWEL SIGN U -1A6A ; [.30B8.0020.0002] # TAI THAM VOWEL SIGN UU -1A6E ; [.30B9.0020.0002] # TAI THAM VOWEL SIGN E -1A6F ; [.30BA.0020.0002] # TAI THAM VOWEL SIGN AE -1A73 ; [.30BB.0020.0002] # TAI THAM VOWEL SIGN OA ABOVE -1A70 ; [.30BC.0020.0002] # TAI THAM VOWEL SIGN OO -1A71 ; [.30BD.0020.0002] # TAI THAM VOWEL SIGN AI -1A72 ; [.30BE.0020.0002] # TAI THAM VOWEL SIGN THAM AI -1A6D ; [.30BF.0020.0002] # TAI THAM VOWEL SIGN OY -1A60 ; [.30C0.0020.0002] # TAI THAM SIGN SAKOT -AA00 ; [.30C1.0020.0002] # CHAM LETTER A -AA01 ; [.30C2.0020.0002] # CHAM LETTER I -AA02 ; [.30C3.0020.0002] # CHAM LETTER U -AA03 ; [.30C4.0020.0002] # CHAM LETTER E -AA04 ; [.30C5.0020.0002] # CHAM LETTER AI -AA05 ; [.30C6.0020.0002] # CHAM LETTER O -AA06 ; [.30C7.0020.0002] # CHAM LETTER KA -AA07 ; [.30C8.0020.0002] # CHAM LETTER KHA -AA08 ; [.30C9.0020.0002] # CHAM LETTER GA -AA09 ; [.30CA.0020.0002] # CHAM LETTER GHA -AA0A ; [.30CB.0020.0002] # CHAM LETTER NGUE -AA0B ; [.30CC.0020.0002] # CHAM LETTER NGA -AA0C ; [.30CD.0020.0002] # CHAM LETTER CHA -AA0D ; [.30CE.0020.0002] # CHAM LETTER CHHA -AA0E ; [.30CF.0020.0002] # CHAM LETTER JA -AA0F ; [.30D0.0020.0002] # CHAM LETTER JHA -AA10 ; [.30D1.0020.0002] # CHAM LETTER NHUE -AA11 ; [.30D2.0020.0002] # CHAM LETTER NHA -AA12 ; [.30D3.0020.0002] # CHAM LETTER NHJA -AA13 ; [.30D4.0020.0002] # CHAM LETTER TA -AA14 ; [.30D5.0020.0002] # CHAM LETTER THA -AA15 ; [.30D6.0020.0002] # CHAM LETTER DA -AA16 ; [.30D7.0020.0002] # CHAM LETTER DHA -AA17 ; [.30D8.0020.0002] # CHAM LETTER NUE -AA18 ; [.30D9.0020.0002] # CHAM LETTER NA -AA19 ; [.30DA.0020.0002] # CHAM LETTER DDA -AA1A ; [.30DB.0020.0002] # CHAM LETTER PA -AA1B ; [.30DC.0020.0002] # CHAM LETTER PPA -AA1C ; [.30DD.0020.0002] # CHAM LETTER PHA -AA1D ; [.30DE.0020.0002] # CHAM LETTER BA -AA1E ; [.30DF.0020.0002] # CHAM LETTER BHA -AA1F ; [.30E0.0020.0002] # CHAM LETTER MUE -AA20 ; [.30E1.0020.0002] # CHAM LETTER MA -AA21 ; [.30E2.0020.0002] # CHAM LETTER BBA -AA22 ; [.30E3.0020.0002] # CHAM LETTER YA -AA23 ; [.30E4.0020.0002] # CHAM LETTER RA -AA24 ; [.30E5.0020.0002] # CHAM LETTER LA -AA25 ; [.30E6.0020.0002] # CHAM LETTER VA -AA26 ; [.30E7.0020.0002] # CHAM LETTER SSA -AA27 ; [.30E8.0020.0002] # CHAM LETTER SA -AA28 ; [.30E9.0020.0002] # CHAM LETTER HA -AA33 ; [.30EA.0020.0002] # CHAM CONSONANT SIGN YA -AA34 ; [.30EB.0020.0002] # CHAM CONSONANT SIGN RA -AA35 ; [.30EC.0020.0002] # CHAM CONSONANT SIGN LA -AA36 ; [.30ED.0020.0002] # CHAM CONSONANT SIGN WA -AA29 ; [.30EE.0020.0002] # CHAM VOWEL SIGN AA -AA2A ; [.30EF.0020.0002] # CHAM VOWEL SIGN I -AA2B ; [.30F0.0020.0002] # CHAM VOWEL SIGN II -AA2C ; [.30F1.0020.0002] # CHAM VOWEL SIGN EI -AA2D ; [.30F2.0020.0002] # CHAM VOWEL SIGN U -AA2E ; [.30F3.0020.0002] # CHAM VOWEL SIGN OE -AA2F ; [.30F4.0020.0002] # CHAM VOWEL SIGN O -AA30 ; [.30F5.0020.0002] # CHAM VOWEL SIGN AI -AA31 ; [.30F6.0020.0002] # CHAM VOWEL SIGN AU -AA32 ; [.30F7.0020.0002] # CHAM VOWEL SIGN UE -AA40 ; [.30F8.0020.0002] # CHAM LETTER FINAL K -AA41 ; [.30F9.0020.0002] # CHAM LETTER FINAL G -AA42 ; [.30FA.0020.0002] # CHAM LETTER FINAL NG -AA43 ; [.30FB.0020.0002] # CHAM CONSONANT SIGN FINAL NG -AA44 ; [.30FC.0020.0002] # CHAM LETTER FINAL CH -AA45 ; [.30FD.0020.0002] # CHAM LETTER FINAL T -AA46 ; [.30FE.0020.0002] # CHAM LETTER FINAL N -AA47 ; [.30FF.0020.0002] # CHAM LETTER FINAL P -AA48 ; [.3100.0020.0002] # CHAM LETTER FINAL Y -AA49 ; [.3101.0020.0002] # CHAM LETTER FINAL R -AA4A ; [.3102.0020.0002] # CHAM LETTER FINAL L -AA4B ; [.3103.0020.0002] # CHAM LETTER FINAL SS -AA4C ; [.3104.0020.0002] # CHAM CONSONANT SIGN FINAL M -AA4D ; [.3105.0020.0002] # CHAM CONSONANT SIGN FINAL H -1B05 ; [.3106.0020.0002] # BALINESE LETTER AKARA -1B06 ; [.3107.0020.0002] # BALINESE LETTER AKARA TEDUNG -1B05 1B35 ; [.3107.0020.0002] # BALINESE LETTER AKARA TEDUNG -1B07 ; [.3108.0020.0002] # BALINESE LETTER IKARA -1B08 ; [.3109.0020.0002] # BALINESE LETTER IKARA TEDUNG -1B07 1B35 ; [.3109.0020.0002] # BALINESE LETTER IKARA TEDUNG -1B09 ; [.310A.0020.0002] # BALINESE LETTER UKARA -1B0A ; [.310B.0020.0002] # BALINESE LETTER UKARA TEDUNG -1B09 1B35 ; [.310B.0020.0002] # BALINESE LETTER UKARA TEDUNG -1B0B ; [.310C.0020.0002] # BALINESE LETTER RA REPA -1B0C ; [.310D.0020.0002] # BALINESE LETTER RA REPA TEDUNG -1B0B 1B35 ; [.310D.0020.0002] # BALINESE LETTER RA REPA TEDUNG -1B0D ; [.310E.0020.0002] # BALINESE LETTER LA LENGA -1B0E ; [.310F.0020.0002] # BALINESE LETTER LA LENGA TEDUNG -1B0D 1B35 ; [.310F.0020.0002] # BALINESE LETTER LA LENGA TEDUNG -1B0F ; [.3110.0020.0002] # BALINESE LETTER EKARA -1B10 ; [.3111.0020.0002] # BALINESE LETTER AIKARA -1B11 ; [.3112.0020.0002] # BALINESE LETTER OKARA -1B12 ; [.3113.0020.0002] # BALINESE LETTER OKARA TEDUNG -1B11 1B35 ; [.3113.0020.0002] # BALINESE LETTER OKARA TEDUNG -1B13 ; [.3114.0020.0002] # BALINESE LETTER KA -1B45 ; [.3115.0020.0002] # BALINESE LETTER KAF SASAK -1B46 ; [.3116.0020.0002] # BALINESE LETTER KHOT SASAK -1B14 ; [.3117.0020.0002] # BALINESE LETTER KA MAHAPRANA -1B15 ; [.3118.0020.0002] # BALINESE LETTER GA -1B16 ; [.3119.0020.0002] # BALINESE LETTER GA GORA -1B17 ; [.311A.0020.0002] # BALINESE LETTER NGA -1B18 ; [.311B.0020.0002] # BALINESE LETTER CA -1B19 ; [.311C.0020.0002] # BALINESE LETTER CA LACA -1B1A ; [.311D.0020.0002] # BALINESE LETTER JA -1B1B ; [.311E.0020.0002] # BALINESE LETTER JA JERA -1B1C ; [.311F.0020.0002] # BALINESE LETTER NYA -1B1D ; [.3120.0020.0002] # BALINESE LETTER TA LATIK -1B1E ; [.3121.0020.0002] # BALINESE LETTER TA MURDA MAHAPRANA -1B1F ; [.3122.0020.0002] # BALINESE LETTER DA MURDA ALPAPRANA -1B20 ; [.3123.0020.0002] # BALINESE LETTER DA MURDA MAHAPRANA -1B21 ; [.3124.0020.0002] # BALINESE LETTER NA RAMBAT -1B22 ; [.3125.0020.0002] # BALINESE LETTER TA -1B47 ; [.3126.0020.0002] # BALINESE LETTER TZIR SASAK -1B23 ; [.3127.0020.0002] # BALINESE LETTER TA TAWA -1B24 ; [.3128.0020.0002] # BALINESE LETTER DA -1B25 ; [.3129.0020.0002] # BALINESE LETTER DA MADU -1B26 ; [.312A.0020.0002] # BALINESE LETTER NA -1B27 ; [.312B.0020.0002] # BALINESE LETTER PA -1B48 ; [.312C.0020.0002] # BALINESE LETTER EF SASAK -1B28 ; [.312D.0020.0002] # BALINESE LETTER PA KAPAL -1B29 ; [.312E.0020.0002] # BALINESE LETTER BA -1B2A ; [.312F.0020.0002] # BALINESE LETTER BA KEMBANG -1B2B ; [.3130.0020.0002] # BALINESE LETTER MA -1B2C ; [.3131.0020.0002] # BALINESE LETTER YA -1B2D ; [.3132.0020.0002] # BALINESE LETTER RA -1B2E ; [.3133.0020.0002] # BALINESE LETTER LA -1B2F ; [.3134.0020.0002] # BALINESE LETTER WA -1B49 ; [.3135.0020.0002] # BALINESE LETTER VE SASAK -1B30 ; [.3136.0020.0002] # BALINESE LETTER SA SAGA -1B31 ; [.3137.0020.0002] # BALINESE LETTER SA SAPA -1B32 ; [.3138.0020.0002] # BALINESE LETTER SA -1B4A ; [.3139.0020.0002] # BALINESE LETTER ZAL SASAK -1B4B ; [.313A.0020.0002] # BALINESE LETTER ASYURA SASAK -1B33 ; [.313B.0020.0002] # BALINESE LETTER HA -1B35 ; [.313C.0020.0002] # BALINESE VOWEL SIGN TEDUNG -1B36 ; [.313D.0020.0002] # BALINESE VOWEL SIGN ULU -1B37 ; [.313E.0020.0002] # BALINESE VOWEL SIGN ULU SARI -1B38 ; [.313F.0020.0002] # BALINESE VOWEL SIGN SUKU -1B39 ; [.3140.0020.0002] # BALINESE VOWEL SIGN SUKU ILUT -1B3A ; [.3141.0020.0002] # BALINESE VOWEL SIGN RA REPA -1B3B ; [.3142.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG -1B3A 1B35 ; [.3142.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG -1B3C ; [.3143.0020.0002] # BALINESE VOWEL SIGN LA LENGA -1B3D ; [.3144.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG -1B3C 1B35 ; [.3144.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG -1B3E ; [.3145.0020.0002] # BALINESE VOWEL SIGN TALING -1B3F ; [.3146.0020.0002] # BALINESE VOWEL SIGN TALING REPA -1B40 ; [.3147.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG -1B3E 1B35 ; [.3147.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG -1B41 ; [.3148.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG -1B3F 1B35 ; [.3148.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG -1B42 ; [.3149.0020.0002] # BALINESE VOWEL SIGN PEPET -1B43 ; [.314A.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG -1B42 1B35 ; [.314A.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG -1B44 ; [.314B.0020.0002] # BALINESE ADEG ADEG -A984 ; [.314C.0020.0002] # JAVANESE LETTER A -A985 ; [.314D.0020.0002] # JAVANESE LETTER I KAWI -A986 ; [.314E.0020.0002] # JAVANESE LETTER I -A987 ; [.314F.0020.0002] # JAVANESE LETTER II -A988 ; [.3150.0020.0002] # JAVANESE LETTER U -A989 ; [.3151.0020.0002] # JAVANESE LETTER PA CEREK -A98A ; [.3152.0020.0002] # JAVANESE LETTER NGA LELET -A98B ; [.3153.0020.0002] # JAVANESE LETTER NGA LELET RASWADI -A98C ; [.3154.0020.0002] # JAVANESE LETTER E -A98D ; [.3155.0020.0002] # JAVANESE LETTER AI -A98E ; [.3156.0020.0002] # JAVANESE LETTER O -A98F ; [.3157.0020.0002] # JAVANESE LETTER KA -A990 ; [.3158.0020.0002] # JAVANESE LETTER KA SASAK -A991 ; [.3159.0020.0002] # JAVANESE LETTER KA MURDA -A992 ; [.315A.0020.0002] # JAVANESE LETTER GA -A993 ; [.315B.0020.0002] # JAVANESE LETTER GA MURDA -A994 ; [.315C.0020.0002] # JAVANESE LETTER NGA -A995 ; [.315D.0020.0002] # JAVANESE LETTER CA -A996 ; [.315E.0020.0002] # JAVANESE LETTER CA MURDA -A997 ; [.315F.0020.0002] # JAVANESE LETTER JA -A998 ; [.3160.0020.0002] # JAVANESE LETTER NYA MURDA -A999 ; [.3161.0020.0002] # JAVANESE LETTER JA MAHAPRANA -A99A ; [.3162.0020.0002] # JAVANESE LETTER NYA -A99B ; [.3163.0020.0002] # JAVANESE LETTER TTA -A99C ; [.3164.0020.0002] # JAVANESE LETTER TTA MAHAPRANA -A99D ; [.3165.0020.0002] # JAVANESE LETTER DDA -A99E ; [.3166.0020.0002] # JAVANESE LETTER DDA MAHAPRANA -A99F ; [.3167.0020.0002] # JAVANESE LETTER NA MURDA -A9A0 ; [.3168.0020.0002] # JAVANESE LETTER TA -A9A1 ; [.3169.0020.0002] # JAVANESE LETTER TA MURDA -A9A2 ; [.316A.0020.0002] # JAVANESE LETTER DA -A9A3 ; [.316B.0020.0002] # JAVANESE LETTER DA MAHAPRANA -A9A4 ; [.316C.0020.0002] # JAVANESE LETTER NA -A9A5 ; [.316D.0020.0002] # JAVANESE LETTER PA -A9A6 ; [.316E.0020.0002] # JAVANESE LETTER PA MURDA -A9A7 ; [.316F.0020.0002] # JAVANESE LETTER BA -A9A8 ; [.3170.0020.0002] # JAVANESE LETTER BA MURDA -A9A9 ; [.3171.0020.0002] # JAVANESE LETTER MA -A9AA ; [.3172.0020.0002] # JAVANESE LETTER YA -A9BE ; [.3173.0020.0002] # JAVANESE CONSONANT SIGN PENGKAL -A9AB ; [.3174.0020.0002] # JAVANESE LETTER RA -A9AC ; [.3174.0020.0004] # JAVANESE LETTER RA AGUNG -A9BF ; [.3175.0020.0002] # JAVANESE CONSONANT SIGN CAKRA -A9AD ; [.3176.0020.0002] # JAVANESE LETTER LA -A9AE ; [.3177.0020.0002] # JAVANESE LETTER WA -A9AF ; [.3178.0020.0002] # JAVANESE LETTER SA MURDA -A9B0 ; [.3179.0020.0002] # JAVANESE LETTER SA MAHAPRANA -A9B1 ; [.317A.0020.0002] # JAVANESE LETTER SA -A9B2 ; [.317B.0020.0002] # JAVANESE LETTER HA -A9B4 ; [.317C.0020.0002] # JAVANESE VOWEL SIGN TARUNG -A9BC ; [.317D.0020.0002] # JAVANESE VOWEL SIGN PEPET -A9B6 ; [.317E.0020.0002] # JAVANESE VOWEL SIGN WULU -A9B7 ; [.317F.0020.0002] # JAVANESE VOWEL SIGN WULU MELIK -A9B8 ; [.3180.0020.0002] # JAVANESE VOWEL SIGN SUKU -A9B9 ; [.3181.0020.0002] # JAVANESE VOWEL SIGN SUKU MENDUT -A9BD ; [.3182.0020.0002] # JAVANESE CONSONANT SIGN KERET -A9BA ; [.3183.0020.0002] # JAVANESE VOWEL SIGN TALING -A9BB ; [.3184.0020.0002] # JAVANESE VOWEL SIGN DIRGA MURE -A9B5 ; [.3185.0020.0002] # JAVANESE VOWEL SIGN TOLONG -A9C0 ; [.3186.0020.0002] # JAVANESE PANGKON -1880 ; [.3187.0020.0002] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE -1881 ; [.3188.0020.0002] # MONGOLIAN LETTER ALI GALI VISARGA ONE -1882 ; [.3189.0020.0002] # MONGOLIAN LETTER ALI GALI DAMARU -1883 ; [.318A.0020.0002] # MONGOLIAN LETTER ALI GALI UBADAMA -1884 ; [.318B.0020.0002] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA -1885 ; [.318C.0020.0002] # MONGOLIAN LETTER ALI GALI BALUDA -1886 ; [.318D.0020.0002] # MONGOLIAN LETTER ALI GALI THREE BALUDA -1843 ; [.318E.0020.0002] # MONGOLIAN LETTER TODO LONG VOWEL SIGN -1820 ; [.318F.0020.0002] # MONGOLIAN LETTER A -1887 ; [.3190.0020.0002] # MONGOLIAN LETTER ALI GALI A -1821 ; [.3191.0020.0002] # MONGOLIAN LETTER E -1844 ; [.3192.0020.0002] # MONGOLIAN LETTER TODO E -185D ; [.3193.0020.0002] # MONGOLIAN LETTER SIBE E -1822 ; [.3194.0020.0002] # MONGOLIAN LETTER I -1845 ; [.3195.0020.0002] # MONGOLIAN LETTER TODO I -185E ; [.3196.0020.0002] # MONGOLIAN LETTER SIBE I -1873 ; [.3197.0020.0002] # MONGOLIAN LETTER MANCHU I -1888 ; [.3198.0020.0002] # MONGOLIAN LETTER ALI GALI I -185F ; [.3199.0020.0002] # MONGOLIAN LETTER SIBE IY -1823 ; [.319A.0020.0002] # MONGOLIAN LETTER O -1846 ; [.319B.0020.0002] # MONGOLIAN LETTER TODO O -1824 ; [.319C.0020.0002] # MONGOLIAN LETTER U -1847 ; [.319D.0020.0002] # MONGOLIAN LETTER TODO U -1861 ; [.319E.0020.0002] # MONGOLIAN LETTER SIBE U -1825 ; [.319F.0020.0002] # MONGOLIAN LETTER OE -1848 ; [.31A0.0020.0002] # MONGOLIAN LETTER TODO OE -1826 ; [.31A1.0020.0002] # MONGOLIAN LETTER UE -1849 ; [.31A2.0020.0002] # MONGOLIAN LETTER TODO UE -1860 ; [.31A3.0020.0002] # MONGOLIAN LETTER SIBE UE -1827 ; [.31A4.0020.0002] # MONGOLIAN LETTER EE -1828 ; [.31A5.0020.0002] # MONGOLIAN LETTER NA -1829 ; [.31A6.0020.0002] # MONGOLIAN LETTER ANG -184A ; [.31A7.0020.0002] # MONGOLIAN LETTER TODO ANG -1862 ; [.31A8.0020.0002] # MONGOLIAN LETTER SIBE ANG -188A ; [.31A9.0020.0002] # MONGOLIAN LETTER ALI GALI NGA -189B ; [.31AA.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI NGA -182A ; [.31AB.0020.0002] # MONGOLIAN LETTER BA -184B ; [.31AC.0020.0002] # MONGOLIAN LETTER TODO BA -182B ; [.31AD.0020.0002] # MONGOLIAN LETTER PA -184C ; [.31AE.0020.0002] # MONGOLIAN LETTER TODO PA -1866 ; [.31AF.0020.0002] # MONGOLIAN LETTER SIBE PA -182C ; [.31B0.0020.0002] # MONGOLIAN LETTER QA -184D ; [.31B1.0020.0002] # MONGOLIAN LETTER TODO QA -182D ; [.31B2.0020.0002] # MONGOLIAN LETTER GA -184E ; [.31B3.0020.0002] # MONGOLIAN LETTER TODO GA -1864 ; [.31B4.0020.0002] # MONGOLIAN LETTER SIBE GA -189A ; [.31B5.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI GHA -1865 ; [.31B6.0020.0002] # MONGOLIAN LETTER SIBE HA -182E ; [.31B7.0020.0002] # MONGOLIAN LETTER MA -184F ; [.31B8.0020.0002] # MONGOLIAN LETTER TODO MA -182F ; [.31B9.0020.0002] # MONGOLIAN LETTER LA -1830 ; [.31BA.0020.0002] # MONGOLIAN LETTER SA -1831 ; [.31BB.0020.0002] # MONGOLIAN LETTER SHA -1867 ; [.31BC.0020.0002] # MONGOLIAN LETTER SIBE SHA -189C ; [.31BD.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CA -189D ; [.31BE.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI JHA -18A2 ; [.31BF.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI SSA -18A4 ; [.31C0.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZHA -18A5 ; [.31C1.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZA -1832 ; [.31C2.0020.0002] # MONGOLIAN LETTER TA -1850 ; [.31C3.0020.0002] # MONGOLIAN LETTER TODO TA -1868 ; [.31C4.0020.0002] # MONGOLIAN LETTER SIBE TA -1833 ; [.31C5.0020.0002] # MONGOLIAN LETTER DA -1851 ; [.31C6.0020.0002] # MONGOLIAN LETTER TODO DA -1869 ; [.31C7.0020.0002] # MONGOLIAN LETTER SIBE DA -1834 ; [.31C8.0020.0002] # MONGOLIAN LETTER CHA -1852 ; [.31C9.0020.0002] # MONGOLIAN LETTER TODO CHA -1871 ; [.31CA.0020.0002] # MONGOLIAN LETTER SIBE CHA -185C ; [.31CB.0020.0002] # MONGOLIAN LETTER TODO DZA -188B ; [.31CC.0020.0002] # MONGOLIAN LETTER ALI GALI CA -1835 ; [.31CD.0020.0002] # MONGOLIAN LETTER JA -1853 ; [.31CE.0020.0002] # MONGOLIAN LETTER TODO JA -186A ; [.31CF.0020.0002] # MONGOLIAN LETTER SIBE JA -1877 ; [.31D0.0020.0002] # MONGOLIAN LETTER MANCHU ZHA -1836 ; [.31D1.0020.0002] # MONGOLIAN LETTER YA -1855 ; [.31D2.0020.0002] # MONGOLIAN LETTER TODO YA -1872 ; [.31D3.0020.0002] # MONGOLIAN LETTER SIBE ZHA -1837 ; [.31D4.0020.0002] # MONGOLIAN LETTER RA -1875 ; [.31D5.0020.0002] # MONGOLIAN LETTER MANCHU RA -1838 ; [.31D6.0020.0002] # MONGOLIAN LETTER WA -1856 ; [.31D7.0020.0002] # MONGOLIAN LETTER TODO WA -1839 ; [.31D8.0020.0002] # MONGOLIAN LETTER FA -186B ; [.31D9.0020.0002] # MONGOLIAN LETTER SIBE FA -1876 ; [.31DA.0020.0002] # MONGOLIAN LETTER MANCHU FA -183A ; [.31DB.0020.0002] # MONGOLIAN LETTER KA -1857 ; [.31DC.0020.0002] # MONGOLIAN LETTER TODO KA -1863 ; [.31DD.0020.0002] # MONGOLIAN LETTER SIBE KA -1874 ; [.31DE.0020.0002] # MONGOLIAN LETTER MANCHU KA -1889 ; [.31DF.0020.0002] # MONGOLIAN LETTER ALI GALI KA -183B ; [.31E0.0020.0002] # MONGOLIAN LETTER KHA -183C ; [.31E1.0020.0002] # MONGOLIAN LETTER TSA -1854 ; [.31E2.0020.0002] # MONGOLIAN LETTER TODO TSA -186E ; [.31E3.0020.0002] # MONGOLIAN LETTER SIBE TSA -183D ; [.31E4.0020.0002] # MONGOLIAN LETTER ZA -186F ; [.31E5.0020.0002] # MONGOLIAN LETTER SIBE ZA -1858 ; [.31E6.0020.0002] # MONGOLIAN LETTER TODO GAA -186C ; [.31E7.0020.0002] # MONGOLIAN LETTER SIBE GAA -183E ; [.31E8.0020.0002] # MONGOLIAN LETTER HAA -1859 ; [.31E9.0020.0002] # MONGOLIAN LETTER TODO HAA -186D ; [.31EA.0020.0002] # MONGOLIAN LETTER SIBE HAA -183F ; [.31EB.0020.0002] # MONGOLIAN LETTER ZRA -1840 ; [.31EC.0020.0002] # MONGOLIAN LETTER LHA -1841 ; [.31ED.0020.0002] # MONGOLIAN LETTER ZHI -1842 ; [.31EE.0020.0002] # MONGOLIAN LETTER CHI -185A ; [.31EF.0020.0002] # MONGOLIAN LETTER TODO JIA -185B ; [.31F0.0020.0002] # MONGOLIAN LETTER TODO NIA -1870 ; [.31F1.0020.0002] # MONGOLIAN LETTER SIBE RAA -188C ; [.31F2.0020.0002] # MONGOLIAN LETTER ALI GALI TTA -189E ; [.31F3.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TTA -188D ; [.31F4.0020.0002] # MONGOLIAN LETTER ALI GALI TTHA -188E ; [.31F5.0020.0002] # MONGOLIAN LETTER ALI GALI DDA -189F ; [.31F6.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DDHA -188F ; [.31F7.0020.0002] # MONGOLIAN LETTER ALI GALI NNA -1890 ; [.31F8.0020.0002] # MONGOLIAN LETTER ALI GALI TA -1898 ; [.31F9.0020.0002] # MONGOLIAN LETTER TODO ALI GALI TA -18A0 ; [.31FA.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TA -1891 ; [.31FB.0020.0002] # MONGOLIAN LETTER ALI GALI DA -18A1 ; [.31FC.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DHA -1892 ; [.31FD.0020.0002] # MONGOLIAN LETTER ALI GALI PA -1893 ; [.31FE.0020.0002] # MONGOLIAN LETTER ALI GALI PHA -18A8 ; [.31FF.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI BHA -1894 ; [.3200.0020.0002] # MONGOLIAN LETTER ALI GALI SSA -18A3 ; [.3201.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CYA -1895 ; [.3202.0020.0002] # MONGOLIAN LETTER ALI GALI ZHA -1899 ; [.3203.0020.0002] # MONGOLIAN LETTER TODO ALI GALI ZHA -1896 ; [.3204.0020.0002] # MONGOLIAN LETTER ALI GALI ZA -1897 ; [.3205.0020.0002] # MONGOLIAN LETTER ALI GALI AH -18A6 ; [.3206.0020.0002] # MONGOLIAN LETTER ALI GALI HALF U -18A7 ; [.3207.0020.0002] # MONGOLIAN LETTER ALI GALI HALF YA -18AA ; [.3208.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI LHA -18A9 ; [.3209.0020.0002] # MONGOLIAN LETTER ALI GALI DAGALGA -1C5A ; [.320A.0020.0002] # OL CHIKI LETTER LA -1C5B ; [.320B.0020.0002] # OL CHIKI LETTER AT -1C5C ; [.320C.0020.0002] # OL CHIKI LETTER AG -1C5D ; [.320D.0020.0002] # OL CHIKI LETTER ANG -1C5E ; [.320E.0020.0002] # OL CHIKI LETTER AL -1C5F ; [.320F.0020.0002] # OL CHIKI LETTER LAA -1C60 ; [.3210.0020.0002] # OL CHIKI LETTER AAK -1C61 ; [.3211.0020.0002] # OL CHIKI LETTER AAJ -1C62 ; [.3212.0020.0002] # OL CHIKI LETTER AAM -1C63 ; [.3213.0020.0002] # OL CHIKI LETTER AAW -1C64 ; [.3214.0020.0002] # OL CHIKI LETTER LI -1C65 ; [.3215.0020.0002] # OL CHIKI LETTER IS -1C66 ; [.3216.0020.0002] # OL CHIKI LETTER IH -1C67 ; [.3217.0020.0002] # OL CHIKI LETTER INY -1C68 ; [.3218.0020.0002] # OL CHIKI LETTER IR -1C69 ; [.3219.0020.0002] # OL CHIKI LETTER LU -1C6A ; [.321A.0020.0002] # OL CHIKI LETTER UC -1C6B ; [.321B.0020.0002] # OL CHIKI LETTER UD -1C6C ; [.321C.0020.0002] # OL CHIKI LETTER UNN -1C6D ; [.321D.0020.0002] # OL CHIKI LETTER UY -1C6E ; [.321E.0020.0002] # OL CHIKI LETTER LE -1C6F ; [.321F.0020.0002] # OL CHIKI LETTER EP -1C70 ; [.3220.0020.0002] # OL CHIKI LETTER EDD -1C71 ; [.3221.0020.0002] # OL CHIKI LETTER EN -1C72 ; [.3222.0020.0002] # OL CHIKI LETTER ERR -1C73 ; [.3223.0020.0002] # OL CHIKI LETTER LO -1C74 ; [.3224.0020.0002] # OL CHIKI LETTER OTT -1C75 ; [.3225.0020.0002] # OL CHIKI LETTER OB -1C76 ; [.3226.0020.0002] # OL CHIKI LETTER OV -1C77 ; [.3227.0020.0002] # OL CHIKI LETTER OH -1C78 ; [.3228.0020.0002] # OL CHIKI MU TTUDDAG -1C79 ; [.3229.0020.0002] # OL CHIKI GAAHLAA TTUDDAAG -1C7A ; [.322A.0020.0002] # OL CHIKI MU-GAAHLAA TTUDDAAG -1C7B ; [.322B.0020.0002] # OL CHIKI RELAA -1C7C ; [.322C.0020.0002] # OL CHIKI PHAARKAA -1C7D ; [.322D.0020.0002] # OL CHIKI AHAD -AB70 ; [.322E.0020.0002] # CHEROKEE SMALL LETTER A -13A0 ; [.322E.0020.0008] # CHEROKEE LETTER A -AB71 ; [.322F.0020.0002] # CHEROKEE SMALL LETTER E -13A1 ; [.322F.0020.0008] # CHEROKEE LETTER E -AB72 ; [.3230.0020.0002] # CHEROKEE SMALL LETTER I -13A2 ; [.3230.0020.0008] # CHEROKEE LETTER I -AB73 ; [.3231.0020.0002] # CHEROKEE SMALL LETTER O -13A3 ; [.3231.0020.0008] # CHEROKEE LETTER O -AB74 ; [.3232.0020.0002] # CHEROKEE SMALL LETTER U -13A4 ; [.3232.0020.0008] # CHEROKEE LETTER U -AB75 ; [.3233.0020.0002] # CHEROKEE SMALL LETTER V -13A5 ; [.3233.0020.0008] # CHEROKEE LETTER V -AB76 ; [.3234.0020.0002] # CHEROKEE SMALL LETTER GA -13A6 ; [.3234.0020.0008] # CHEROKEE LETTER GA -AB77 ; [.3235.0020.0002] # CHEROKEE SMALL LETTER KA -13A7 ; [.3235.0020.0008] # CHEROKEE LETTER KA -AB78 ; [.3236.0020.0002] # CHEROKEE SMALL LETTER GE -13A8 ; [.3236.0020.0008] # CHEROKEE LETTER GE -AB79 ; [.3237.0020.0002] # CHEROKEE SMALL LETTER GI -13A9 ; [.3237.0020.0008] # CHEROKEE LETTER GI -AB7A ; [.3238.0020.0002] # CHEROKEE SMALL LETTER GO -13AA ; [.3238.0020.0008] # CHEROKEE LETTER GO -AB7B ; [.3239.0020.0002] # CHEROKEE SMALL LETTER GU -13AB ; [.3239.0020.0008] # CHEROKEE LETTER GU -AB7C ; [.323A.0020.0002] # CHEROKEE SMALL LETTER GV -13AC ; [.323A.0020.0008] # CHEROKEE LETTER GV -AB7D ; [.323B.0020.0002] # CHEROKEE SMALL LETTER HA -13AD ; [.323B.0020.0008] # CHEROKEE LETTER HA -AB7E ; [.323C.0020.0002] # CHEROKEE SMALL LETTER HE -13AE ; [.323C.0020.0008] # CHEROKEE LETTER HE -AB7F ; [.323D.0020.0002] # CHEROKEE SMALL LETTER HI -13AF ; [.323D.0020.0008] # CHEROKEE LETTER HI -AB80 ; [.323E.0020.0002] # CHEROKEE SMALL LETTER HO -13B0 ; [.323E.0020.0008] # CHEROKEE LETTER HO -AB81 ; [.323F.0020.0002] # CHEROKEE SMALL LETTER HU -13B1 ; [.323F.0020.0008] # CHEROKEE LETTER HU -AB82 ; [.3240.0020.0002] # CHEROKEE SMALL LETTER HV -13B2 ; [.3240.0020.0008] # CHEROKEE LETTER HV -AB83 ; [.3241.0020.0002] # CHEROKEE SMALL LETTER LA -13B3 ; [.3241.0020.0008] # CHEROKEE LETTER LA -AB84 ; [.3242.0020.0002] # CHEROKEE SMALL LETTER LE -13B4 ; [.3242.0020.0008] # CHEROKEE LETTER LE -AB85 ; [.3243.0020.0002] # CHEROKEE SMALL LETTER LI -13B5 ; [.3243.0020.0008] # CHEROKEE LETTER LI -AB86 ; [.3244.0020.0002] # CHEROKEE SMALL LETTER LO -13B6 ; [.3244.0020.0008] # CHEROKEE LETTER LO -AB87 ; [.3245.0020.0002] # CHEROKEE SMALL LETTER LU -13B7 ; [.3245.0020.0008] # CHEROKEE LETTER LU -AB88 ; [.3246.0020.0002] # CHEROKEE SMALL LETTER LV -13B8 ; [.3246.0020.0008] # CHEROKEE LETTER LV -AB89 ; [.3247.0020.0002] # CHEROKEE SMALL LETTER MA -13B9 ; [.3247.0020.0008] # CHEROKEE LETTER MA -AB8A ; [.3248.0020.0002] # CHEROKEE SMALL LETTER ME -13BA ; [.3248.0020.0008] # CHEROKEE LETTER ME -AB8B ; [.3249.0020.0002] # CHEROKEE SMALL LETTER MI -13BB ; [.3249.0020.0008] # CHEROKEE LETTER MI -AB8C ; [.324A.0020.0002] # CHEROKEE SMALL LETTER MO -13BC ; [.324A.0020.0008] # CHEROKEE LETTER MO -AB8D ; [.324B.0020.0002] # CHEROKEE SMALL LETTER MU -13BD ; [.324B.0020.0008] # CHEROKEE LETTER MU -AB8E ; [.324C.0020.0002] # CHEROKEE SMALL LETTER NA -13BE ; [.324C.0020.0008] # CHEROKEE LETTER NA -AB8F ; [.324D.0020.0002] # CHEROKEE SMALL LETTER HNA -13BF ; [.324D.0020.0008] # CHEROKEE LETTER HNA -AB90 ; [.324E.0020.0002] # CHEROKEE SMALL LETTER NAH -13C0 ; [.324E.0020.0008] # CHEROKEE LETTER NAH -AB91 ; [.324F.0020.0002] # CHEROKEE SMALL LETTER NE -13C1 ; [.324F.0020.0008] # CHEROKEE LETTER NE -AB92 ; [.3250.0020.0002] # CHEROKEE SMALL LETTER NI -13C2 ; [.3250.0020.0008] # CHEROKEE LETTER NI -AB93 ; [.3251.0020.0002] # CHEROKEE SMALL LETTER NO -13C3 ; [.3251.0020.0008] # CHEROKEE LETTER NO -AB94 ; [.3252.0020.0002] # CHEROKEE SMALL LETTER NU -13C4 ; [.3252.0020.0008] # CHEROKEE LETTER NU -AB95 ; [.3253.0020.0002] # CHEROKEE SMALL LETTER NV -13C5 ; [.3253.0020.0008] # CHEROKEE LETTER NV -AB96 ; [.3254.0020.0002] # CHEROKEE SMALL LETTER QUA -13C6 ; [.3254.0020.0008] # CHEROKEE LETTER QUA -AB97 ; [.3255.0020.0002] # CHEROKEE SMALL LETTER QUE -13C7 ; [.3255.0020.0008] # CHEROKEE LETTER QUE -AB98 ; [.3256.0020.0002] # CHEROKEE SMALL LETTER QUI -13C8 ; [.3256.0020.0008] # CHEROKEE LETTER QUI -AB99 ; [.3257.0020.0002] # CHEROKEE SMALL LETTER QUO -13C9 ; [.3257.0020.0008] # CHEROKEE LETTER QUO -AB9A ; [.3258.0020.0002] # CHEROKEE SMALL LETTER QUU -13CA ; [.3258.0020.0008] # CHEROKEE LETTER QUU -AB9B ; [.3259.0020.0002] # CHEROKEE SMALL LETTER QUV -13CB ; [.3259.0020.0008] # CHEROKEE LETTER QUV -AB9C ; [.325A.0020.0002] # CHEROKEE SMALL LETTER SA -13CC ; [.325A.0020.0008] # CHEROKEE LETTER SA -AB9D ; [.325B.0020.0002] # CHEROKEE SMALL LETTER S -13CD ; [.325B.0020.0008] # CHEROKEE LETTER S -AB9E ; [.325C.0020.0002] # CHEROKEE SMALL LETTER SE -13CE ; [.325C.0020.0008] # CHEROKEE LETTER SE -AB9F ; [.325D.0020.0002] # CHEROKEE SMALL LETTER SI -13CF ; [.325D.0020.0008] # CHEROKEE LETTER SI -ABA0 ; [.325E.0020.0002] # CHEROKEE SMALL LETTER SO -13D0 ; [.325E.0020.0008] # CHEROKEE LETTER SO -ABA1 ; [.325F.0020.0002] # CHEROKEE SMALL LETTER SU -13D1 ; [.325F.0020.0008] # CHEROKEE LETTER SU -ABA2 ; [.3260.0020.0002] # CHEROKEE SMALL LETTER SV -13D2 ; [.3260.0020.0008] # CHEROKEE LETTER SV -ABA3 ; [.3261.0020.0002] # CHEROKEE SMALL LETTER DA -13D3 ; [.3261.0020.0008] # CHEROKEE LETTER DA -ABA4 ; [.3262.0020.0002] # CHEROKEE SMALL LETTER TA -13D4 ; [.3262.0020.0008] # CHEROKEE LETTER TA -ABA5 ; [.3263.0020.0002] # CHEROKEE SMALL LETTER DE -13D5 ; [.3263.0020.0008] # CHEROKEE LETTER DE -ABA6 ; [.3264.0020.0002] # CHEROKEE SMALL LETTER TE -13D6 ; [.3264.0020.0008] # CHEROKEE LETTER TE -ABA7 ; [.3265.0020.0002] # CHEROKEE SMALL LETTER DI -13D7 ; [.3265.0020.0008] # CHEROKEE LETTER DI -ABA8 ; [.3266.0020.0002] # CHEROKEE SMALL LETTER TI -13D8 ; [.3266.0020.0008] # CHEROKEE LETTER TI -ABA9 ; [.3267.0020.0002] # CHEROKEE SMALL LETTER DO -13D9 ; [.3267.0020.0008] # CHEROKEE LETTER DO -ABAA ; [.3268.0020.0002] # CHEROKEE SMALL LETTER DU -13DA ; [.3268.0020.0008] # CHEROKEE LETTER DU -ABAB ; [.3269.0020.0002] # CHEROKEE SMALL LETTER DV -13DB ; [.3269.0020.0008] # CHEROKEE LETTER DV -ABAC ; [.326A.0020.0002] # CHEROKEE SMALL LETTER DLA -13DC ; [.326A.0020.0008] # CHEROKEE LETTER DLA -ABAD ; [.326B.0020.0002] # CHEROKEE SMALL LETTER TLA -13DD ; [.326B.0020.0008] # CHEROKEE LETTER TLA -ABAE ; [.326C.0020.0002] # CHEROKEE SMALL LETTER TLE -13DE ; [.326C.0020.0008] # CHEROKEE LETTER TLE -ABAF ; [.326D.0020.0002] # CHEROKEE SMALL LETTER TLI -13DF ; [.326D.0020.0008] # CHEROKEE LETTER TLI -ABB0 ; [.326E.0020.0002] # CHEROKEE SMALL LETTER TLO -13E0 ; [.326E.0020.0008] # CHEROKEE LETTER TLO -ABB1 ; [.326F.0020.0002] # CHEROKEE SMALL LETTER TLU -13E1 ; [.326F.0020.0008] # CHEROKEE LETTER TLU -ABB2 ; [.3270.0020.0002] # CHEROKEE SMALL LETTER TLV -13E2 ; [.3270.0020.0008] # CHEROKEE LETTER TLV -ABB3 ; [.3271.0020.0002] # CHEROKEE SMALL LETTER TSA -13E3 ; [.3271.0020.0008] # CHEROKEE LETTER TSA -ABB4 ; [.3272.0020.0002] # CHEROKEE SMALL LETTER TSE -13E4 ; [.3272.0020.0008] # CHEROKEE LETTER TSE -ABB5 ; [.3273.0020.0002] # CHEROKEE SMALL LETTER TSI -13E5 ; [.3273.0020.0008] # CHEROKEE LETTER TSI -ABB6 ; [.3274.0020.0002] # CHEROKEE SMALL LETTER TSO -13E6 ; [.3274.0020.0008] # CHEROKEE LETTER TSO -ABB7 ; [.3275.0020.0002] # CHEROKEE SMALL LETTER TSU -13E7 ; [.3275.0020.0008] # CHEROKEE LETTER TSU -ABB8 ; [.3276.0020.0002] # CHEROKEE SMALL LETTER TSV -13E8 ; [.3276.0020.0008] # CHEROKEE LETTER TSV -ABB9 ; [.3277.0020.0002] # CHEROKEE SMALL LETTER WA -13E9 ; [.3277.0020.0008] # CHEROKEE LETTER WA -ABBA ; [.3278.0020.0002] # CHEROKEE SMALL LETTER WE -13EA ; [.3278.0020.0008] # CHEROKEE LETTER WE -ABBB ; [.3279.0020.0002] # CHEROKEE SMALL LETTER WI -13EB ; [.3279.0020.0008] # CHEROKEE LETTER WI -ABBC ; [.327A.0020.0002] # CHEROKEE SMALL LETTER WO -13EC ; [.327A.0020.0008] # CHEROKEE LETTER WO -ABBD ; [.327B.0020.0002] # CHEROKEE SMALL LETTER WU -13ED ; [.327B.0020.0008] # CHEROKEE LETTER WU -ABBE ; [.327C.0020.0002] # CHEROKEE SMALL LETTER WV -13EE ; [.327C.0020.0008] # CHEROKEE LETTER WV -ABBF ; [.327D.0020.0002] # CHEROKEE SMALL LETTER YA -13EF ; [.327D.0020.0008] # CHEROKEE LETTER YA -13F8 ; [.327E.0020.0002] # CHEROKEE SMALL LETTER YE -13F0 ; [.327E.0020.0008] # CHEROKEE LETTER YE -13F9 ; [.327F.0020.0002] # CHEROKEE SMALL LETTER YI -13F1 ; [.327F.0020.0008] # CHEROKEE LETTER YI -13FA ; [.3280.0020.0002] # CHEROKEE SMALL LETTER YO -13F2 ; [.3280.0020.0008] # CHEROKEE LETTER YO -13FB ; [.3281.0020.0002] # CHEROKEE SMALL LETTER YU -13F3 ; [.3281.0020.0008] # CHEROKEE LETTER YU -13FC ; [.3282.0020.0002] # CHEROKEE SMALL LETTER YV -13F4 ; [.3282.0020.0008] # CHEROKEE LETTER YV -13FD ; [.3283.0020.0002] # CHEROKEE SMALL LETTER MV -13F5 ; [.3283.0020.0008] # CHEROKEE LETTER MV -1401 ; [.3284.0020.0002] # CANADIAN SYLLABICS E -1402 ; [.3285.0020.0002] # CANADIAN SYLLABICS AAI -1403 ; [.3286.0020.0002] # CANADIAN SYLLABICS I -1404 ; [.3287.0020.0002] # CANADIAN SYLLABICS II -1405 ; [.3288.0020.0002] # CANADIAN SYLLABICS O -1406 ; [.3289.0020.0002] # CANADIAN SYLLABICS OO -1407 ; [.328A.0020.0002] # CANADIAN SYLLABICS Y-CREE OO -1408 ; [.328B.0020.0002] # CANADIAN SYLLABICS CARRIER EE -1409 ; [.328C.0020.0002] # CANADIAN SYLLABICS CARRIER I -140A ; [.328D.0020.0002] # CANADIAN SYLLABICS A -140B ; [.328E.0020.0002] # CANADIAN SYLLABICS AA -140C ; [.328F.0020.0002] # CANADIAN SYLLABICS WE -140D ; [.3290.0020.0002] # CANADIAN SYLLABICS WEST-CREE WE -140E ; [.3291.0020.0002] # CANADIAN SYLLABICS WI -140F ; [.3292.0020.0002] # CANADIAN SYLLABICS WEST-CREE WI -1410 ; [.3293.0020.0002] # CANADIAN SYLLABICS WII -1411 ; [.3294.0020.0002] # CANADIAN SYLLABICS WEST-CREE WII -1412 ; [.3295.0020.0002] # CANADIAN SYLLABICS WO -1413 ; [.3296.0020.0002] # CANADIAN SYLLABICS WEST-CREE WO -1414 ; [.3297.0020.0002] # CANADIAN SYLLABICS WOO -1415 ; [.3298.0020.0002] # CANADIAN SYLLABICS WEST-CREE WOO -1416 ; [.3299.0020.0002] # CANADIAN SYLLABICS NASKAPI WOO -1417 ; [.329A.0020.0002] # CANADIAN SYLLABICS WA -1418 ; [.329B.0020.0002] # CANADIAN SYLLABICS WEST-CREE WA -1419 ; [.329C.0020.0002] # CANADIAN SYLLABICS WAA -141A ; [.329D.0020.0002] # CANADIAN SYLLABICS WEST-CREE WAA -141B ; [.329E.0020.0002] # CANADIAN SYLLABICS NASKAPI WAA -141C ; [.329F.0020.0002] # CANADIAN SYLLABICS AI -141D ; [.32A0.0020.0002] # CANADIAN SYLLABICS Y-CREE W -141E ; [.32A1.0020.0002] # CANADIAN SYLLABICS GLOTTAL STOP -141F ; [.32A2.0020.0002] # CANADIAN SYLLABICS FINAL ACUTE -1420 ; [.32A3.0020.0002] # CANADIAN SYLLABICS FINAL GRAVE -1421 ; [.32A4.0020.0002] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING -1422 ; [.32A5.0020.0002] # CANADIAN SYLLABICS FINAL TOP HALF RING -1423 ; [.32A6.0020.0002] # CANADIAN SYLLABICS FINAL RIGHT HALF RING -1424 ; [.32A7.0020.0002] # CANADIAN SYLLABICS FINAL RING -1425 ; [.32A8.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE -1426 ; [.32A9.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES -1427 ; [.32AA.0020.0002] # CANADIAN SYLLABICS FINAL MIDDLE DOT -1428 ; [.32AB.0020.0002] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE -1429 ; [.32AC.0020.0002] # CANADIAN SYLLABICS FINAL PLUS -142A ; [.32AD.0020.0002] # CANADIAN SYLLABICS FINAL DOWN TACK -142B ; [.32AE.0020.0002] # CANADIAN SYLLABICS EN -142C ; [.32AF.0020.0002] # CANADIAN SYLLABICS IN -142D ; [.32B0.0020.0002] # CANADIAN SYLLABICS ON -142E ; [.32B1.0020.0002] # CANADIAN SYLLABICS AN -142F ; [.32B2.0020.0002] # CANADIAN SYLLABICS PE -1430 ; [.32B3.0020.0002] # CANADIAN SYLLABICS PAAI -1431 ; [.32B4.0020.0002] # CANADIAN SYLLABICS PI -1432 ; [.32B5.0020.0002] # CANADIAN SYLLABICS PII -1433 ; [.32B6.0020.0002] # CANADIAN SYLLABICS PO -1434 ; [.32B7.0020.0002] # CANADIAN SYLLABICS POO -1435 ; [.32B8.0020.0002] # CANADIAN SYLLABICS Y-CREE POO -1436 ; [.32B9.0020.0002] # CANADIAN SYLLABICS CARRIER HEE -1437 ; [.32BA.0020.0002] # CANADIAN SYLLABICS CARRIER HI -1438 ; [.32BB.0020.0002] # CANADIAN SYLLABICS PA -1439 ; [.32BC.0020.0002] # CANADIAN SYLLABICS PAA -143A ; [.32BD.0020.0002] # CANADIAN SYLLABICS PWE -143B ; [.32BE.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWE -143C ; [.32BF.0020.0002] # CANADIAN SYLLABICS PWI -143D ; [.32C0.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWI -143E ; [.32C1.0020.0002] # CANADIAN SYLLABICS PWII -143F ; [.32C2.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWII -1440 ; [.32C3.0020.0002] # CANADIAN SYLLABICS PWO -1441 ; [.32C4.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWO -1442 ; [.32C5.0020.0002] # CANADIAN SYLLABICS PWOO -1443 ; [.32C6.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWOO -1444 ; [.32C7.0020.0002] # CANADIAN SYLLABICS PWA -1445 ; [.32C8.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWA -1446 ; [.32C9.0020.0002] # CANADIAN SYLLABICS PWAA -1447 ; [.32CA.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWAA -1448 ; [.32CB.0020.0002] # CANADIAN SYLLABICS Y-CREE PWAA -1449 ; [.32CC.0020.0002] # CANADIAN SYLLABICS P -144A ; [.32CD.0020.0002] # CANADIAN SYLLABICS WEST-CREE P -144B ; [.32CE.0020.0002] # CANADIAN SYLLABICS CARRIER H -144C ; [.32CF.0020.0002] # CANADIAN SYLLABICS TE -144D ; [.32D0.0020.0002] # CANADIAN SYLLABICS TAAI -144E ; [.32D1.0020.0002] # CANADIAN SYLLABICS TI -144F ; [.32D2.0020.0002] # CANADIAN SYLLABICS TII -1450 ; [.32D3.0020.0002] # CANADIAN SYLLABICS TO -1451 ; [.32D4.0020.0002] # CANADIAN SYLLABICS TOO -1452 ; [.32D5.0020.0002] # CANADIAN SYLLABICS Y-CREE TOO -1453 ; [.32D6.0020.0002] # CANADIAN SYLLABICS CARRIER DEE -1454 ; [.32D7.0020.0002] # CANADIAN SYLLABICS CARRIER DI -1455 ; [.32D8.0020.0002] # CANADIAN SYLLABICS TA -1456 ; [.32D9.0020.0002] # CANADIAN SYLLABICS TAA -1457 ; [.32DA.0020.0002] # CANADIAN SYLLABICS TWE -1458 ; [.32DB.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWE -1459 ; [.32DC.0020.0002] # CANADIAN SYLLABICS TWI -145A ; [.32DD.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWI -145B ; [.32DE.0020.0002] # CANADIAN SYLLABICS TWII -145C ; [.32DF.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWII -145D ; [.32E0.0020.0002] # CANADIAN SYLLABICS TWO -145E ; [.32E1.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWO -145F ; [.32E2.0020.0002] # CANADIAN SYLLABICS TWOO -1460 ; [.32E3.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWOO -1461 ; [.32E4.0020.0002] # CANADIAN SYLLABICS TWA -1462 ; [.32E5.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWA -1463 ; [.32E6.0020.0002] # CANADIAN SYLLABICS TWAA -1464 ; [.32E7.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWAA -1465 ; [.32E8.0020.0002] # CANADIAN SYLLABICS NASKAPI TWAA -1466 ; [.32E9.0020.0002] # CANADIAN SYLLABICS T -1467 ; [.32EA.0020.0002] # CANADIAN SYLLABICS TTE -1468 ; [.32EB.0020.0002] # CANADIAN SYLLABICS TTI -1469 ; [.32EC.0020.0002] # CANADIAN SYLLABICS TTO -146A ; [.32ED.0020.0002] # CANADIAN SYLLABICS TTA -146B ; [.32EE.0020.0002] # CANADIAN SYLLABICS KE -146C ; [.32EF.0020.0002] # CANADIAN SYLLABICS KAAI -146D ; [.32F0.0020.0002] # CANADIAN SYLLABICS KI -146E ; [.32F1.0020.0002] # CANADIAN SYLLABICS KII -146F ; [.32F2.0020.0002] # CANADIAN SYLLABICS KO -1470 ; [.32F3.0020.0002] # CANADIAN SYLLABICS KOO -1471 ; [.32F4.0020.0002] # CANADIAN SYLLABICS Y-CREE KOO -1472 ; [.32F5.0020.0002] # CANADIAN SYLLABICS KA -1473 ; [.32F6.0020.0002] # CANADIAN SYLLABICS KAA -1474 ; [.32F7.0020.0002] # CANADIAN SYLLABICS KWE -1475 ; [.32F8.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWE -1476 ; [.32F9.0020.0002] # CANADIAN SYLLABICS KWI -1477 ; [.32FA.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWI -1478 ; [.32FB.0020.0002] # CANADIAN SYLLABICS KWII -1479 ; [.32FC.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWII -147A ; [.32FD.0020.0002] # CANADIAN SYLLABICS KWO -147B ; [.32FE.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWO -147C ; [.32FF.0020.0002] # CANADIAN SYLLABICS KWOO -147D ; [.3300.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWOO -147E ; [.3301.0020.0002] # CANADIAN SYLLABICS KWA -147F ; [.3302.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWA -1480 ; [.3303.0020.0002] # CANADIAN SYLLABICS KWAA -1481 ; [.3304.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWAA -1482 ; [.3305.0020.0002] # CANADIAN SYLLABICS NASKAPI KWAA -1483 ; [.3306.0020.0002] # CANADIAN SYLLABICS K -1484 ; [.3307.0020.0002] # CANADIAN SYLLABICS KW -1485 ; [.3308.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH -1486 ; [.3309.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH -1487 ; [.330A.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH -1488 ; [.330B.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH -1489 ; [.330C.0020.0002] # CANADIAN SYLLABICS CE -148A ; [.330D.0020.0002] # CANADIAN SYLLABICS CAAI -148B ; [.330E.0020.0002] # CANADIAN SYLLABICS CI -148C ; [.330F.0020.0002] # CANADIAN SYLLABICS CII -148D ; [.3310.0020.0002] # CANADIAN SYLLABICS CO -148E ; [.3311.0020.0002] # CANADIAN SYLLABICS COO -148F ; [.3312.0020.0002] # CANADIAN SYLLABICS Y-CREE COO -1490 ; [.3313.0020.0002] # CANADIAN SYLLABICS CA -1491 ; [.3314.0020.0002] # CANADIAN SYLLABICS CAA -1492 ; [.3315.0020.0002] # CANADIAN SYLLABICS CWE -1493 ; [.3316.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWE -1494 ; [.3317.0020.0002] # CANADIAN SYLLABICS CWI -1495 ; [.3318.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWI -1496 ; [.3319.0020.0002] # CANADIAN SYLLABICS CWII -1497 ; [.331A.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWII -1498 ; [.331B.0020.0002] # CANADIAN SYLLABICS CWO -1499 ; [.331C.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWO -149A ; [.331D.0020.0002] # CANADIAN SYLLABICS CWOO -149B ; [.331E.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWOO -149C ; [.331F.0020.0002] # CANADIAN SYLLABICS CWA -149D ; [.3320.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWA -149E ; [.3321.0020.0002] # CANADIAN SYLLABICS CWAA -149F ; [.3322.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWAA -14A0 ; [.3323.0020.0002] # CANADIAN SYLLABICS NASKAPI CWAA -14A1 ; [.3324.0020.0002] # CANADIAN SYLLABICS C -14A2 ; [.3325.0020.0002] # CANADIAN SYLLABICS SAYISI TH -14A3 ; [.3326.0020.0002] # CANADIAN SYLLABICS ME -14A4 ; [.3327.0020.0002] # CANADIAN SYLLABICS MAAI -14A5 ; [.3328.0020.0002] # CANADIAN SYLLABICS MI -14A6 ; [.3329.0020.0002] # CANADIAN SYLLABICS MII -14A7 ; [.332A.0020.0002] # CANADIAN SYLLABICS MO -14A8 ; [.332B.0020.0002] # CANADIAN SYLLABICS MOO -14A9 ; [.332C.0020.0002] # CANADIAN SYLLABICS Y-CREE MOO -14AA ; [.332D.0020.0002] # CANADIAN SYLLABICS MA -14AB ; [.332E.0020.0002] # CANADIAN SYLLABICS MAA -14AC ; [.332F.0020.0002] # CANADIAN SYLLABICS MWE -14AD ; [.3330.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWE -14AE ; [.3331.0020.0002] # CANADIAN SYLLABICS MWI -14AF ; [.3332.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWI -14B0 ; [.3333.0020.0002] # CANADIAN SYLLABICS MWII -14B1 ; [.3334.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWII -14B2 ; [.3335.0020.0002] # CANADIAN SYLLABICS MWO -14B3 ; [.3336.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWO -14B4 ; [.3337.0020.0002] # CANADIAN SYLLABICS MWOO -14B5 ; [.3338.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWOO -14B6 ; [.3339.0020.0002] # CANADIAN SYLLABICS MWA -14B7 ; [.333A.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWA -14B8 ; [.333B.0020.0002] # CANADIAN SYLLABICS MWAA -14B9 ; [.333C.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWAA -14BA ; [.333D.0020.0002] # CANADIAN SYLLABICS NASKAPI MWAA -14BB ; [.333E.0020.0002] # CANADIAN SYLLABICS M -14BC ; [.333F.0020.0002] # CANADIAN SYLLABICS WEST-CREE M -14BD ; [.3340.0020.0002] # CANADIAN SYLLABICS MH -14BE ; [.3341.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN M -14BF ; [.3342.0020.0002] # CANADIAN SYLLABICS SAYISI M -14C0 ; [.3343.0020.0002] # CANADIAN SYLLABICS NE -14C1 ; [.3344.0020.0002] # CANADIAN SYLLABICS NAAI -14C2 ; [.3345.0020.0002] # CANADIAN SYLLABICS NI -14C3 ; [.3346.0020.0002] # CANADIAN SYLLABICS NII -14C4 ; [.3347.0020.0002] # CANADIAN SYLLABICS NO -14C5 ; [.3348.0020.0002] # CANADIAN SYLLABICS NOO -14C6 ; [.3349.0020.0002] # CANADIAN SYLLABICS Y-CREE NOO -14C7 ; [.334A.0020.0002] # CANADIAN SYLLABICS NA -14C8 ; [.334B.0020.0002] # CANADIAN SYLLABICS NAA -14C9 ; [.334C.0020.0002] # CANADIAN SYLLABICS NWE -14CA ; [.334D.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWE -14CB ; [.334E.0020.0002] # CANADIAN SYLLABICS NWA -14CC ; [.334F.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWA -14CD ; [.3350.0020.0002] # CANADIAN SYLLABICS NWAA -14CE ; [.3351.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWAA -14CF ; [.3352.0020.0002] # CANADIAN SYLLABICS NASKAPI NWAA -14D0 ; [.3353.0020.0002] # CANADIAN SYLLABICS N -14D1 ; [.3354.0020.0002] # CANADIAN SYLLABICS CARRIER NG -14D2 ; [.3355.0020.0002] # CANADIAN SYLLABICS NH -14D3 ; [.3356.0020.0002] # CANADIAN SYLLABICS LE -14D4 ; [.3357.0020.0002] # CANADIAN SYLLABICS LAAI -14D5 ; [.3358.0020.0002] # CANADIAN SYLLABICS LI -14D6 ; [.3359.0020.0002] # CANADIAN SYLLABICS LII -14D7 ; [.335A.0020.0002] # CANADIAN SYLLABICS LO -14D8 ; [.335B.0020.0002] # CANADIAN SYLLABICS LOO -14D9 ; [.335C.0020.0002] # CANADIAN SYLLABICS Y-CREE LOO -14DA ; [.335D.0020.0002] # CANADIAN SYLLABICS LA -14DB ; [.335E.0020.0002] # CANADIAN SYLLABICS LAA -14DC ; [.335F.0020.0002] # CANADIAN SYLLABICS LWE -14DD ; [.3360.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWE -14DE ; [.3361.0020.0002] # CANADIAN SYLLABICS LWI -14DF ; [.3362.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWI -14E0 ; [.3363.0020.0002] # CANADIAN SYLLABICS LWII -14E1 ; [.3364.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWII -14E2 ; [.3365.0020.0002] # CANADIAN SYLLABICS LWO -14E3 ; [.3366.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWO -14E4 ; [.3367.0020.0002] # CANADIAN SYLLABICS LWOO -14E5 ; [.3368.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWOO -14E6 ; [.3369.0020.0002] # CANADIAN SYLLABICS LWA -14E7 ; [.336A.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWA -14E8 ; [.336B.0020.0002] # CANADIAN SYLLABICS LWAA -14E9 ; [.336C.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWAA -14EA ; [.336D.0020.0002] # CANADIAN SYLLABICS L -14EB ; [.336E.0020.0002] # CANADIAN SYLLABICS WEST-CREE L -14EC ; [.336F.0020.0002] # CANADIAN SYLLABICS MEDIAL L -14ED ; [.3370.0020.0002] # CANADIAN SYLLABICS SE -14EE ; [.3371.0020.0002] # CANADIAN SYLLABICS SAAI -14EF ; [.3372.0020.0002] # CANADIAN SYLLABICS SI -14F0 ; [.3373.0020.0002] # CANADIAN SYLLABICS SII -14F1 ; [.3374.0020.0002] # CANADIAN SYLLABICS SO -14F2 ; [.3375.0020.0002] # CANADIAN SYLLABICS SOO -14F3 ; [.3376.0020.0002] # CANADIAN SYLLABICS Y-CREE SOO -14F4 ; [.3377.0020.0002] # CANADIAN SYLLABICS SA -14F5 ; [.3378.0020.0002] # CANADIAN SYLLABICS SAA -14F6 ; [.3379.0020.0002] # CANADIAN SYLLABICS SWE -14F7 ; [.337A.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWE -14F8 ; [.337B.0020.0002] # CANADIAN SYLLABICS SWI -14F9 ; [.337C.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWI -14FA ; [.337D.0020.0002] # CANADIAN SYLLABICS SWII -14FB ; [.337E.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWII -14FC ; [.337F.0020.0002] # CANADIAN SYLLABICS SWO -14FD ; [.3380.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWO -14FE ; [.3381.0020.0002] # CANADIAN SYLLABICS SWOO -14FF ; [.3382.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWOO -1500 ; [.3383.0020.0002] # CANADIAN SYLLABICS SWA -1501 ; [.3384.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWA -1502 ; [.3385.0020.0002] # CANADIAN SYLLABICS SWAA -1503 ; [.3386.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWAA -1504 ; [.3387.0020.0002] # CANADIAN SYLLABICS NASKAPI SWAA -1505 ; [.3388.0020.0002] # CANADIAN SYLLABICS S -1506 ; [.3389.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN S -1507 ; [.338A.0020.0002] # CANADIAN SYLLABICS SW -1508 ; [.338B.0020.0002] # CANADIAN SYLLABICS BLACKFOOT S -1509 ; [.338C.0020.0002] # CANADIAN SYLLABICS MOOSE-CREE SK -150A ; [.338D.0020.0002] # CANADIAN SYLLABICS NASKAPI SKW -150B ; [.338E.0020.0002] # CANADIAN SYLLABICS NASKAPI S-W -150C ; [.338F.0020.0002] # CANADIAN SYLLABICS NASKAPI SPWA -150D ; [.3390.0020.0002] # CANADIAN SYLLABICS NASKAPI STWA -150E ; [.3391.0020.0002] # CANADIAN SYLLABICS NASKAPI SKWA -150F ; [.3392.0020.0002] # CANADIAN SYLLABICS NASKAPI SCWA -1510 ; [.3393.0020.0002] # CANADIAN SYLLABICS SHE -1511 ; [.3394.0020.0002] # CANADIAN SYLLABICS SHI -1512 ; [.3395.0020.0002] # CANADIAN SYLLABICS SHII -1513 ; [.3396.0020.0002] # CANADIAN SYLLABICS SHO -1514 ; [.3397.0020.0002] # CANADIAN SYLLABICS SHOO -1515 ; [.3398.0020.0002] # CANADIAN SYLLABICS SHA -1516 ; [.3399.0020.0002] # CANADIAN SYLLABICS SHAA -1517 ; [.339A.0020.0002] # CANADIAN SYLLABICS SHWE -1518 ; [.339B.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWE -1519 ; [.339C.0020.0002] # CANADIAN SYLLABICS SHWI -151A ; [.339D.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWI -151B ; [.339E.0020.0002] # CANADIAN SYLLABICS SHWII -151C ; [.339F.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWII -151D ; [.33A0.0020.0002] # CANADIAN SYLLABICS SHWO -151E ; [.33A1.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWO -151F ; [.33A2.0020.0002] # CANADIAN SYLLABICS SHWOO -1520 ; [.33A3.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWOO -1521 ; [.33A4.0020.0002] # CANADIAN SYLLABICS SHWA -1522 ; [.33A5.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWA -1523 ; [.33A6.0020.0002] # CANADIAN SYLLABICS SHWAA -1524 ; [.33A7.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWAA -1525 ; [.33A8.0020.0002] # CANADIAN SYLLABICS SH -1526 ; [.33A9.0020.0002] # CANADIAN SYLLABICS YE -1527 ; [.33AA.0020.0002] # CANADIAN SYLLABICS YAAI -1528 ; [.33AB.0020.0002] # CANADIAN SYLLABICS YI -1529 ; [.33AC.0020.0002] # CANADIAN SYLLABICS YII -152A ; [.33AD.0020.0002] # CANADIAN SYLLABICS YO -152B ; [.33AE.0020.0002] # CANADIAN SYLLABICS YOO -152C ; [.33AF.0020.0002] # CANADIAN SYLLABICS Y-CREE YOO -152D ; [.33B0.0020.0002] # CANADIAN SYLLABICS YA -152E ; [.33B1.0020.0002] # CANADIAN SYLLABICS YAA -152F ; [.33B2.0020.0002] # CANADIAN SYLLABICS YWE -1530 ; [.33B3.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWE -1531 ; [.33B4.0020.0002] # CANADIAN SYLLABICS YWI -1532 ; [.33B5.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWI -1533 ; [.33B6.0020.0002] # CANADIAN SYLLABICS YWII -1534 ; [.33B7.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWII -1535 ; [.33B8.0020.0002] # CANADIAN SYLLABICS YWO -1536 ; [.33B9.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWO -1537 ; [.33BA.0020.0002] # CANADIAN SYLLABICS YWOO -1538 ; [.33BB.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWOO -1539 ; [.33BC.0020.0002] # CANADIAN SYLLABICS YWA -153A ; [.33BD.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWA -153B ; [.33BE.0020.0002] # CANADIAN SYLLABICS YWAA -153C ; [.33BF.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWAA -153D ; [.33C0.0020.0002] # CANADIAN SYLLABICS NASKAPI YWAA -153E ; [.33C1.0020.0002] # CANADIAN SYLLABICS Y -153F ; [.33C2.0020.0002] # CANADIAN SYLLABICS BIBLE-CREE Y -1540 ; [.33C3.0020.0002] # CANADIAN SYLLABICS WEST-CREE Y -1541 ; [.33C4.0020.0002] # CANADIAN SYLLABICS SAYISI YI -1542 ; [.33C5.0020.0002] # CANADIAN SYLLABICS RE -1543 ; [.33C6.0020.0002] # CANADIAN SYLLABICS R-CREE RE -1544 ; [.33C7.0020.0002] # CANADIAN SYLLABICS WEST-CREE LE -1545 ; [.33C8.0020.0002] # CANADIAN SYLLABICS RAAI -1546 ; [.33C9.0020.0002] # CANADIAN SYLLABICS RI -1547 ; [.33CA.0020.0002] # CANADIAN SYLLABICS RII -1548 ; [.33CB.0020.0002] # CANADIAN SYLLABICS RO -1549 ; [.33CC.0020.0002] # CANADIAN SYLLABICS ROO -154A ; [.33CD.0020.0002] # CANADIAN SYLLABICS WEST-CREE LO -154B ; [.33CE.0020.0002] # CANADIAN SYLLABICS RA -154C ; [.33CF.0020.0002] # CANADIAN SYLLABICS RAA -154D ; [.33D0.0020.0002] # CANADIAN SYLLABICS WEST-CREE LA -154E ; [.33D1.0020.0002] # CANADIAN SYLLABICS RWAA -154F ; [.33D2.0020.0002] # CANADIAN SYLLABICS WEST-CREE RWAA -1550 ; [.33D3.0020.0002] # CANADIAN SYLLABICS R -1551 ; [.33D4.0020.0002] # CANADIAN SYLLABICS WEST-CREE R -1552 ; [.33D5.0020.0002] # CANADIAN SYLLABICS MEDIAL R -1553 ; [.33D6.0020.0002] # CANADIAN SYLLABICS FE -1554 ; [.33D7.0020.0002] # CANADIAN SYLLABICS FAAI -1555 ; [.33D8.0020.0002] # CANADIAN SYLLABICS FI -1556 ; [.33D9.0020.0002] # CANADIAN SYLLABICS FII -1557 ; [.33DA.0020.0002] # CANADIAN SYLLABICS FO -1558 ; [.33DB.0020.0002] # CANADIAN SYLLABICS FOO -1559 ; [.33DC.0020.0002] # CANADIAN SYLLABICS FA -155A ; [.33DD.0020.0002] # CANADIAN SYLLABICS FAA -155B ; [.33DE.0020.0002] # CANADIAN SYLLABICS FWAA -155C ; [.33DF.0020.0002] # CANADIAN SYLLABICS WEST-CREE FWAA -155D ; [.33E0.0020.0002] # CANADIAN SYLLABICS F -155E ; [.33E1.0020.0002] # CANADIAN SYLLABICS THE -155F ; [.33E2.0020.0002] # CANADIAN SYLLABICS N-CREE THE -1560 ; [.33E3.0020.0002] # CANADIAN SYLLABICS THI -1561 ; [.33E4.0020.0002] # CANADIAN SYLLABICS N-CREE THI -1562 ; [.33E5.0020.0002] # CANADIAN SYLLABICS THII -1563 ; [.33E6.0020.0002] # CANADIAN SYLLABICS N-CREE THII -1564 ; [.33E7.0020.0002] # CANADIAN SYLLABICS THO -1565 ; [.33E8.0020.0002] # CANADIAN SYLLABICS THOO -1566 ; [.33E9.0020.0002] # CANADIAN SYLLABICS THA -1567 ; [.33EA.0020.0002] # CANADIAN SYLLABICS THAA -1568 ; [.33EB.0020.0002] # CANADIAN SYLLABICS THWAA -1569 ; [.33EC.0020.0002] # CANADIAN SYLLABICS WEST-CREE THWAA -156A ; [.33ED.0020.0002] # CANADIAN SYLLABICS TH -156B ; [.33EE.0020.0002] # CANADIAN SYLLABICS TTHE -156C ; [.33EF.0020.0002] # CANADIAN SYLLABICS TTHI -156D ; [.33F0.0020.0002] # CANADIAN SYLLABICS TTHO -156E ; [.33F1.0020.0002] # CANADIAN SYLLABICS TTHA -156F ; [.33F2.0020.0002] # CANADIAN SYLLABICS TTH -1570 ; [.33F3.0020.0002] # CANADIAN SYLLABICS TYE -1571 ; [.33F4.0020.0002] # CANADIAN SYLLABICS TYI -1572 ; [.33F5.0020.0002] # CANADIAN SYLLABICS TYO -1573 ; [.33F6.0020.0002] # CANADIAN SYLLABICS TYA -1574 ; [.33F7.0020.0002] # CANADIAN SYLLABICS NUNAVIK HE -1575 ; [.33F8.0020.0002] # CANADIAN SYLLABICS NUNAVIK HI -1576 ; [.33F9.0020.0002] # CANADIAN SYLLABICS NUNAVIK HII -1577 ; [.33FA.0020.0002] # CANADIAN SYLLABICS NUNAVIK HO -1578 ; [.33FB.0020.0002] # CANADIAN SYLLABICS NUNAVIK HOO -1579 ; [.33FC.0020.0002] # CANADIAN SYLLABICS NUNAVIK HA -157A ; [.33FD.0020.0002] # CANADIAN SYLLABICS NUNAVIK HAA -157B ; [.33FE.0020.0002] # CANADIAN SYLLABICS NUNAVIK H -157D ; [.33FF.0020.0002] # CANADIAN SYLLABICS HK -166F ; [.3400.0020.0002] # CANADIAN SYLLABICS QAI -157E ; [.3401.0020.0002] # CANADIAN SYLLABICS QAAI -157F ; [.3402.0020.0002] # CANADIAN SYLLABICS QI -1580 ; [.3403.0020.0002] # CANADIAN SYLLABICS QII -1581 ; [.3404.0020.0002] # CANADIAN SYLLABICS QO -1582 ; [.3405.0020.0002] # CANADIAN SYLLABICS QOO -1583 ; [.3406.0020.0002] # CANADIAN SYLLABICS QA -1584 ; [.3407.0020.0002] # CANADIAN SYLLABICS QAA -1585 ; [.3408.0020.0002] # CANADIAN SYLLABICS Q -1586 ; [.3409.0020.0002] # CANADIAN SYLLABICS TLHE -1587 ; [.340A.0020.0002] # CANADIAN SYLLABICS TLHI -1588 ; [.340B.0020.0002] # CANADIAN SYLLABICS TLHO -1589 ; [.340C.0020.0002] # CANADIAN SYLLABICS TLHA -158A ; [.340D.0020.0002] # CANADIAN SYLLABICS WEST-CREE RE -158B ; [.340E.0020.0002] # CANADIAN SYLLABICS WEST-CREE RI -158C ; [.340F.0020.0002] # CANADIAN SYLLABICS WEST-CREE RO -158D ; [.3410.0020.0002] # CANADIAN SYLLABICS WEST-CREE RA -1670 ; [.3411.0020.0002] # CANADIAN SYLLABICS NGAI -158E ; [.3412.0020.0002] # CANADIAN SYLLABICS NGAAI -158F ; [.3413.0020.0002] # CANADIAN SYLLABICS NGI -1590 ; [.3414.0020.0002] # CANADIAN SYLLABICS NGII -1591 ; [.3415.0020.0002] # CANADIAN SYLLABICS NGO -1592 ; [.3416.0020.0002] # CANADIAN SYLLABICS NGOO -1593 ; [.3417.0020.0002] # CANADIAN SYLLABICS NGA -1594 ; [.3418.0020.0002] # CANADIAN SYLLABICS NGAA -1595 ; [.3419.0020.0002] # CANADIAN SYLLABICS NG -1671 ; [.341A.0020.0002] # CANADIAN SYLLABICS NNGI -1672 ; [.341B.0020.0002] # CANADIAN SYLLABICS NNGII -1673 ; [.341C.0020.0002] # CANADIAN SYLLABICS NNGO -1674 ; [.341D.0020.0002] # CANADIAN SYLLABICS NNGOO -1675 ; [.341E.0020.0002] # CANADIAN SYLLABICS NNGA -1676 ; [.341F.0020.0002] # CANADIAN SYLLABICS NNGAA -1596 ; [.3420.0020.0002] # CANADIAN SYLLABICS NNG -1597 ; [.3421.0020.0002] # CANADIAN SYLLABICS SAYISI SHE -1598 ; [.3422.0020.0002] # CANADIAN SYLLABICS SAYISI SHI -1599 ; [.3423.0020.0002] # CANADIAN SYLLABICS SAYISI SHO -159A ; [.3424.0020.0002] # CANADIAN SYLLABICS SAYISI SHA -159B ; [.3425.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THE -159C ; [.3426.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THI -159D ; [.3427.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THO -159E ; [.3428.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THA -159F ; [.3429.0020.0002] # CANADIAN SYLLABICS WOODS-CREE TH -15A0 ; [.342A.0020.0002] # CANADIAN SYLLABICS LHI -15A1 ; [.342B.0020.0002] # CANADIAN SYLLABICS LHII -15A2 ; [.342C.0020.0002] # CANADIAN SYLLABICS LHO -15A3 ; [.342D.0020.0002] # CANADIAN SYLLABICS LHOO -15A4 ; [.342E.0020.0002] # CANADIAN SYLLABICS LHA -15A5 ; [.342F.0020.0002] # CANADIAN SYLLABICS LHAA -15A6 ; [.3430.0020.0002] # CANADIAN SYLLABICS LH -157C ; [.3431.0020.0002] # CANADIAN SYLLABICS NUNAVUT H -15A7 ; [.3432.0020.0002] # CANADIAN SYLLABICS TH-CREE THE -15A8 ; [.3433.0020.0002] # CANADIAN SYLLABICS TH-CREE THI -15A9 ; [.3434.0020.0002] # CANADIAN SYLLABICS TH-CREE THII -15AA ; [.3435.0020.0002] # CANADIAN SYLLABICS TH-CREE THO -15AB ; [.3436.0020.0002] # CANADIAN SYLLABICS TH-CREE THOO -15AC ; [.3437.0020.0002] # CANADIAN SYLLABICS TH-CREE THA -15AD ; [.3438.0020.0002] # CANADIAN SYLLABICS TH-CREE THAA -15AE ; [.3439.0020.0002] # CANADIAN SYLLABICS TH-CREE TH -15AF ; [.343A.0020.0002] # CANADIAN SYLLABICS AIVILIK B -15B0 ; [.343B.0020.0002] # CANADIAN SYLLABICS BLACKFOOT E -15B1 ; [.343C.0020.0002] # CANADIAN SYLLABICS BLACKFOOT I -15B2 ; [.343D.0020.0002] # CANADIAN SYLLABICS BLACKFOOT O -15B3 ; [.343E.0020.0002] # CANADIAN SYLLABICS BLACKFOOT A -15B4 ; [.343F.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WE -15B5 ; [.3440.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WI -15B6 ; [.3441.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WO -15B7 ; [.3442.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WA -15B8 ; [.3443.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NE -15B9 ; [.3444.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NI -15BA ; [.3445.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NO -15BB ; [.3446.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NA -15BC ; [.3447.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KE -15BD ; [.3448.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KI -15BE ; [.3449.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KO -15BF ; [.344A.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KA -15C0 ; [.344B.0020.0002] # CANADIAN SYLLABICS SAYISI HE -15C1 ; [.344C.0020.0002] # CANADIAN SYLLABICS SAYISI HI -15C2 ; [.344D.0020.0002] # CANADIAN SYLLABICS SAYISI HO -15C3 ; [.344E.0020.0002] # CANADIAN SYLLABICS SAYISI HA -15C4 ; [.344F.0020.0002] # CANADIAN SYLLABICS CARRIER GHU -15C5 ; [.3450.0020.0002] # CANADIAN SYLLABICS CARRIER GHO -15C6 ; [.3451.0020.0002] # CANADIAN SYLLABICS CARRIER GHE -15C7 ; [.3452.0020.0002] # CANADIAN SYLLABICS CARRIER GHEE -15C8 ; [.3453.0020.0002] # CANADIAN SYLLABICS CARRIER GHI -15C9 ; [.3454.0020.0002] # CANADIAN SYLLABICS CARRIER GHA -15CA ; [.3455.0020.0002] # CANADIAN SYLLABICS CARRIER RU -15CB ; [.3456.0020.0002] # CANADIAN SYLLABICS CARRIER RO -15CC ; [.3457.0020.0002] # CANADIAN SYLLABICS CARRIER RE -15CD ; [.3458.0020.0002] # CANADIAN SYLLABICS CARRIER REE -15CE ; [.3459.0020.0002] # CANADIAN SYLLABICS CARRIER RI -15CF ; [.345A.0020.0002] # CANADIAN SYLLABICS CARRIER RA -15D0 ; [.345B.0020.0002] # CANADIAN SYLLABICS CARRIER WU -15D1 ; [.345C.0020.0002] # CANADIAN SYLLABICS CARRIER WO -15D2 ; [.345D.0020.0002] # CANADIAN SYLLABICS CARRIER WE -15D3 ; [.345E.0020.0002] # CANADIAN SYLLABICS CARRIER WEE -15D4 ; [.345F.0020.0002] # CANADIAN SYLLABICS CARRIER WI -15D5 ; [.3460.0020.0002] # CANADIAN SYLLABICS CARRIER WA -15D6 ; [.3461.0020.0002] # CANADIAN SYLLABICS CARRIER HWU -15D7 ; [.3462.0020.0002] # CANADIAN SYLLABICS CARRIER HWO -15D8 ; [.3463.0020.0002] # CANADIAN SYLLABICS CARRIER HWE -15D9 ; [.3464.0020.0002] # CANADIAN SYLLABICS CARRIER HWEE -15DA ; [.3465.0020.0002] # CANADIAN SYLLABICS CARRIER HWI -15DB ; [.3466.0020.0002] # CANADIAN SYLLABICS CARRIER HWA -15DC ; [.3467.0020.0002] # CANADIAN SYLLABICS CARRIER THU -15DD ; [.3468.0020.0002] # CANADIAN SYLLABICS CARRIER THO -15DE ; [.3469.0020.0002] # CANADIAN SYLLABICS CARRIER THE -15DF ; [.346A.0020.0002] # CANADIAN SYLLABICS CARRIER THEE -15E0 ; [.346B.0020.0002] # CANADIAN SYLLABICS CARRIER THI -15E1 ; [.346C.0020.0002] # CANADIAN SYLLABICS CARRIER THA -15E2 ; [.346D.0020.0002] # CANADIAN SYLLABICS CARRIER TTU -15E3 ; [.346E.0020.0002] # CANADIAN SYLLABICS CARRIER TTO -15E4 ; [.346F.0020.0002] # CANADIAN SYLLABICS CARRIER TTE -15E5 ; [.3470.0020.0002] # CANADIAN SYLLABICS CARRIER TTEE -15E6 ; [.3471.0020.0002] # CANADIAN SYLLABICS CARRIER TTI -15E7 ; [.3472.0020.0002] # CANADIAN SYLLABICS CARRIER TTA -15E8 ; [.3473.0020.0002] # CANADIAN SYLLABICS CARRIER PU -15E9 ; [.3474.0020.0002] # CANADIAN SYLLABICS CARRIER PO -15EA ; [.3475.0020.0002] # CANADIAN SYLLABICS CARRIER PE -15EB ; [.3476.0020.0002] # CANADIAN SYLLABICS CARRIER PEE -15EC ; [.3477.0020.0002] # CANADIAN SYLLABICS CARRIER PI -15ED ; [.3478.0020.0002] # CANADIAN SYLLABICS CARRIER PA -15EE ; [.3479.0020.0002] # CANADIAN SYLLABICS CARRIER P -15EF ; [.347A.0020.0002] # CANADIAN SYLLABICS CARRIER GU -15F0 ; [.347B.0020.0002] # CANADIAN SYLLABICS CARRIER GO -15F1 ; [.347C.0020.0002] # CANADIAN SYLLABICS CARRIER GE -15F2 ; [.347D.0020.0002] # CANADIAN SYLLABICS CARRIER GEE -15F3 ; [.347E.0020.0002] # CANADIAN SYLLABICS CARRIER GI -15F4 ; [.347F.0020.0002] # CANADIAN SYLLABICS CARRIER GA -15F5 ; [.3480.0020.0002] # CANADIAN SYLLABICS CARRIER KHU -15F6 ; [.3481.0020.0002] # CANADIAN SYLLABICS CARRIER KHO -15F7 ; [.3482.0020.0002] # CANADIAN SYLLABICS CARRIER KHE -15F8 ; [.3483.0020.0002] # CANADIAN SYLLABICS CARRIER KHEE -15F9 ; [.3484.0020.0002] # CANADIAN SYLLABICS CARRIER KHI -15FA ; [.3485.0020.0002] # CANADIAN SYLLABICS CARRIER KHA -15FB ; [.3486.0020.0002] # CANADIAN SYLLABICS CARRIER KKU -15FC ; [.3487.0020.0002] # CANADIAN SYLLABICS CARRIER KKO -15FD ; [.3488.0020.0002] # CANADIAN SYLLABICS CARRIER KKE -15FE ; [.3489.0020.0002] # CANADIAN SYLLABICS CARRIER KKEE -15FF ; [.348A.0020.0002] # CANADIAN SYLLABICS CARRIER KKI -1600 ; [.348B.0020.0002] # CANADIAN SYLLABICS CARRIER KKA -1601 ; [.348C.0020.0002] # CANADIAN SYLLABICS CARRIER KK -1602 ; [.348D.0020.0002] # CANADIAN SYLLABICS CARRIER NU -1603 ; [.348E.0020.0002] # CANADIAN SYLLABICS CARRIER NO -1604 ; [.348F.0020.0002] # CANADIAN SYLLABICS CARRIER NE -1605 ; [.3490.0020.0002] # CANADIAN SYLLABICS CARRIER NEE -1606 ; [.3491.0020.0002] # CANADIAN SYLLABICS CARRIER NI -1607 ; [.3492.0020.0002] # CANADIAN SYLLABICS CARRIER NA -1608 ; [.3493.0020.0002] # CANADIAN SYLLABICS CARRIER MU -1609 ; [.3494.0020.0002] # CANADIAN SYLLABICS CARRIER MO -160A ; [.3495.0020.0002] # CANADIAN SYLLABICS CARRIER ME -160B ; [.3496.0020.0002] # CANADIAN SYLLABICS CARRIER MEE -160C ; [.3497.0020.0002] # CANADIAN SYLLABICS CARRIER MI -160D ; [.3498.0020.0002] # CANADIAN SYLLABICS CARRIER MA -160E ; [.3499.0020.0002] # CANADIAN SYLLABICS CARRIER YU -160F ; [.349A.0020.0002] # CANADIAN SYLLABICS CARRIER YO -1610 ; [.349B.0020.0002] # CANADIAN SYLLABICS CARRIER YE -1611 ; [.349C.0020.0002] # CANADIAN SYLLABICS CARRIER YEE -1612 ; [.349D.0020.0002] # CANADIAN SYLLABICS CARRIER YI -1613 ; [.349E.0020.0002] # CANADIAN SYLLABICS CARRIER YA -1614 ; [.349F.0020.0002] # CANADIAN SYLLABICS CARRIER JU -1615 ; [.34A0.0020.0002] # CANADIAN SYLLABICS SAYISI JU -1616 ; [.34A1.0020.0002] # CANADIAN SYLLABICS CARRIER JO -1617 ; [.34A2.0020.0002] # CANADIAN SYLLABICS CARRIER JE -1618 ; [.34A3.0020.0002] # CANADIAN SYLLABICS CARRIER JEE -1619 ; [.34A4.0020.0002] # CANADIAN SYLLABICS CARRIER JI -161A ; [.34A5.0020.0002] # CANADIAN SYLLABICS SAYISI JI -161B ; [.34A6.0020.0002] # CANADIAN SYLLABICS CARRIER JA -161C ; [.34A7.0020.0002] # CANADIAN SYLLABICS CARRIER JJU -161D ; [.34A8.0020.0002] # CANADIAN SYLLABICS CARRIER JJO -161E ; [.34A9.0020.0002] # CANADIAN SYLLABICS CARRIER JJE -161F ; [.34AA.0020.0002] # CANADIAN SYLLABICS CARRIER JJEE -1620 ; [.34AB.0020.0002] # CANADIAN SYLLABICS CARRIER JJI -1621 ; [.34AC.0020.0002] # CANADIAN SYLLABICS CARRIER JJA -1622 ; [.34AD.0020.0002] # CANADIAN SYLLABICS CARRIER LU -1623 ; [.34AE.0020.0002] # CANADIAN SYLLABICS CARRIER LO -1624 ; [.34AF.0020.0002] # CANADIAN SYLLABICS CARRIER LE -1625 ; [.34B0.0020.0002] # CANADIAN SYLLABICS CARRIER LEE -1626 ; [.34B1.0020.0002] # CANADIAN SYLLABICS CARRIER LI -1627 ; [.34B2.0020.0002] # CANADIAN SYLLABICS CARRIER LA -1628 ; [.34B3.0020.0002] # CANADIAN SYLLABICS CARRIER DLU -1629 ; [.34B4.0020.0002] # CANADIAN SYLLABICS CARRIER DLO -162A ; [.34B5.0020.0002] # CANADIAN SYLLABICS CARRIER DLE -162B ; [.34B6.0020.0002] # CANADIAN SYLLABICS CARRIER DLEE -162C ; [.34B7.0020.0002] # CANADIAN SYLLABICS CARRIER DLI -162D ; [.34B8.0020.0002] # CANADIAN SYLLABICS CARRIER DLA -162E ; [.34B9.0020.0002] # CANADIAN SYLLABICS CARRIER LHU -162F ; [.34BA.0020.0002] # CANADIAN SYLLABICS CARRIER LHO -1630 ; [.34BB.0020.0002] # CANADIAN SYLLABICS CARRIER LHE -1631 ; [.34BC.0020.0002] # CANADIAN SYLLABICS CARRIER LHEE -1632 ; [.34BD.0020.0002] # CANADIAN SYLLABICS CARRIER LHI -1633 ; [.34BE.0020.0002] # CANADIAN SYLLABICS CARRIER LHA -1634 ; [.34BF.0020.0002] # CANADIAN SYLLABICS CARRIER TLHU -1635 ; [.34C0.0020.0002] # CANADIAN SYLLABICS CARRIER TLHO -1636 ; [.34C1.0020.0002] # CANADIAN SYLLABICS CARRIER TLHE -1637 ; [.34C2.0020.0002] # CANADIAN SYLLABICS CARRIER TLHEE -1638 ; [.34C3.0020.0002] # CANADIAN SYLLABICS CARRIER TLHI -1639 ; [.34C4.0020.0002] # CANADIAN SYLLABICS CARRIER TLHA -163A ; [.34C5.0020.0002] # CANADIAN SYLLABICS CARRIER TLU -163B ; [.34C6.0020.0002] # CANADIAN SYLLABICS CARRIER TLO -163C ; [.34C7.0020.0002] # CANADIAN SYLLABICS CARRIER TLE -163D ; [.34C8.0020.0002] # CANADIAN SYLLABICS CARRIER TLEE -163E ; [.34C9.0020.0002] # CANADIAN SYLLABICS CARRIER TLI -163F ; [.34CA.0020.0002] # CANADIAN SYLLABICS CARRIER TLA -1640 ; [.34CB.0020.0002] # CANADIAN SYLLABICS CARRIER ZU -1641 ; [.34CC.0020.0002] # CANADIAN SYLLABICS CARRIER ZO -1642 ; [.34CD.0020.0002] # CANADIAN SYLLABICS CARRIER ZE -1643 ; [.34CE.0020.0002] # CANADIAN SYLLABICS CARRIER ZEE -1644 ; [.34CF.0020.0002] # CANADIAN SYLLABICS CARRIER ZI -1645 ; [.34D0.0020.0002] # CANADIAN SYLLABICS CARRIER ZA -1646 ; [.34D1.0020.0002] # CANADIAN SYLLABICS CARRIER Z -1647 ; [.34D2.0020.0002] # CANADIAN SYLLABICS CARRIER INITIAL Z -1648 ; [.34D3.0020.0002] # CANADIAN SYLLABICS CARRIER DZU -1649 ; [.34D4.0020.0002] # CANADIAN SYLLABICS CARRIER DZO -164A ; [.34D5.0020.0002] # CANADIAN SYLLABICS CARRIER DZE -164B ; [.34D6.0020.0002] # CANADIAN SYLLABICS CARRIER DZEE -164C ; [.34D7.0020.0002] # CANADIAN SYLLABICS CARRIER DZI -164D ; [.34D8.0020.0002] # CANADIAN SYLLABICS CARRIER DZA -164E ; [.34D9.0020.0002] # CANADIAN SYLLABICS CARRIER SU -164F ; [.34DA.0020.0002] # CANADIAN SYLLABICS CARRIER SO -1650 ; [.34DB.0020.0002] # CANADIAN SYLLABICS CARRIER SE -1651 ; [.34DC.0020.0002] # CANADIAN SYLLABICS CARRIER SEE -1652 ; [.34DD.0020.0002] # CANADIAN SYLLABICS CARRIER SI -1653 ; [.34DE.0020.0002] # CANADIAN SYLLABICS CARRIER SA -1654 ; [.34DF.0020.0002] # CANADIAN SYLLABICS CARRIER SHU -1655 ; [.34E0.0020.0002] # CANADIAN SYLLABICS CARRIER SHO -1656 ; [.34E1.0020.0002] # CANADIAN SYLLABICS CARRIER SHE -1657 ; [.34E2.0020.0002] # CANADIAN SYLLABICS CARRIER SHEE -1658 ; [.34E3.0020.0002] # CANADIAN SYLLABICS CARRIER SHI -1659 ; [.34E4.0020.0002] # CANADIAN SYLLABICS CARRIER SHA -165A ; [.34E5.0020.0002] # CANADIAN SYLLABICS CARRIER SH -165B ; [.34E6.0020.0002] # CANADIAN SYLLABICS CARRIER TSU -165C ; [.34E7.0020.0002] # CANADIAN SYLLABICS CARRIER TSO -165D ; [.34E8.0020.0002] # CANADIAN SYLLABICS CARRIER TSE -165E ; [.34E9.0020.0002] # CANADIAN SYLLABICS CARRIER TSEE -165F ; [.34EA.0020.0002] # CANADIAN SYLLABICS CARRIER TSI -1660 ; [.34EB.0020.0002] # CANADIAN SYLLABICS CARRIER TSA -1661 ; [.34EC.0020.0002] # CANADIAN SYLLABICS CARRIER CHU -1662 ; [.34ED.0020.0002] # CANADIAN SYLLABICS CARRIER CHO -1663 ; [.34EE.0020.0002] # CANADIAN SYLLABICS CARRIER CHE -1664 ; [.34EF.0020.0002] # CANADIAN SYLLABICS CARRIER CHEE -1665 ; [.34F0.0020.0002] # CANADIAN SYLLABICS CARRIER CHI -1666 ; [.34F1.0020.0002] # CANADIAN SYLLABICS CARRIER CHA -1667 ; [.34F2.0020.0002] # CANADIAN SYLLABICS CARRIER TTSU -1668 ; [.34F3.0020.0002] # CANADIAN SYLLABICS CARRIER TTSO -1669 ; [.34F4.0020.0002] # CANADIAN SYLLABICS CARRIER TTSE -166A ; [.34F5.0020.0002] # CANADIAN SYLLABICS CARRIER TTSEE -166B ; [.34F6.0020.0002] # CANADIAN SYLLABICS CARRIER TTSI -166C ; [.34F7.0020.0002] # CANADIAN SYLLABICS CARRIER TTSA -1677 ; [.34F8.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWEE -1678 ; [.34F9.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWI -1679 ; [.34FA.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWII -167A ; [.34FB.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWO -167B ; [.34FC.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWOO -167C ; [.34FD.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWA -167D ; [.34FE.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWAA -167E ; [.34FF.0020.0002] # CANADIAN SYLLABICS WOODS-CREE FINAL TH -167F ; [.3500.0020.0002] # CANADIAN SYLLABICS BLACKFOOT W -18B0 ; [.3501.0020.0002] # CANADIAN SYLLABICS OY -18B1 ; [.3502.0020.0002] # CANADIAN SYLLABICS AY -18B2 ; [.3503.0020.0002] # CANADIAN SYLLABICS AAY -18B3 ; [.3504.0020.0002] # CANADIAN SYLLABICS WAY -18B4 ; [.3505.0020.0002] # CANADIAN SYLLABICS POY -18B5 ; [.3506.0020.0002] # CANADIAN SYLLABICS PAY -18B6 ; [.3507.0020.0002] # CANADIAN SYLLABICS PWOY -18B7 ; [.3508.0020.0002] # CANADIAN SYLLABICS TAY -18B8 ; [.3509.0020.0002] # CANADIAN SYLLABICS KAY -18B9 ; [.350A.0020.0002] # CANADIAN SYLLABICS KWAY -18BA ; [.350B.0020.0002] # CANADIAN SYLLABICS MAY -18BB ; [.350C.0020.0002] # CANADIAN SYLLABICS NOY -18BC ; [.350D.0020.0002] # CANADIAN SYLLABICS NAY -18BD ; [.350E.0020.0002] # CANADIAN SYLLABICS LAY -18BE ; [.350F.0020.0002] # CANADIAN SYLLABICS SOY -18BF ; [.3510.0020.0002] # CANADIAN SYLLABICS SAY -18C0 ; [.3511.0020.0002] # CANADIAN SYLLABICS SHOY -18C1 ; [.3512.0020.0002] # CANADIAN SYLLABICS SHAY -18C2 ; [.3513.0020.0002] # CANADIAN SYLLABICS SHWOY -18C3 ; [.3514.0020.0002] # CANADIAN SYLLABICS YOY -18C4 ; [.3515.0020.0002] # CANADIAN SYLLABICS YAY -18C5 ; [.3516.0020.0002] # CANADIAN SYLLABICS RAY -18C6 ; [.3517.0020.0002] # CANADIAN SYLLABICS NWI -18C7 ; [.3518.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWI -18C8 ; [.3519.0020.0002] # CANADIAN SYLLABICS NWII -18C9 ; [.351A.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWII -18CA ; [.351B.0020.0002] # CANADIAN SYLLABICS NWO -18CB ; [.351C.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWO -18CC ; [.351D.0020.0002] # CANADIAN SYLLABICS NWOO -18CD ; [.351E.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWOO -18CE ; [.351F.0020.0002] # CANADIAN SYLLABICS RWEE -18CF ; [.3520.0020.0002] # CANADIAN SYLLABICS RWI -18D0 ; [.3521.0020.0002] # CANADIAN SYLLABICS RWII -18D1 ; [.3522.0020.0002] # CANADIAN SYLLABICS RWO -18D2 ; [.3523.0020.0002] # CANADIAN SYLLABICS RWOO -18D3 ; [.3524.0020.0002] # CANADIAN SYLLABICS RWA -18D4 ; [.3525.0020.0002] # CANADIAN SYLLABICS OJIBWAY P -18D5 ; [.3526.0020.0002] # CANADIAN SYLLABICS OJIBWAY T -18D6 ; [.3527.0020.0002] # CANADIAN SYLLABICS OJIBWAY K -18D7 ; [.3528.0020.0002] # CANADIAN SYLLABICS OJIBWAY C -18D8 ; [.3529.0020.0002] # CANADIAN SYLLABICS OJIBWAY M -18D9 ; [.352A.0020.0002] # CANADIAN SYLLABICS OJIBWAY N -18DA ; [.352B.0020.0002] # CANADIAN SYLLABICS OJIBWAY S -18DB ; [.352C.0020.0002] # CANADIAN SYLLABICS OJIBWAY SH -18DC ; [.352D.0020.0002] # CANADIAN SYLLABICS EASTERN W -18DD ; [.352E.0020.0002] # CANADIAN SYLLABICS WESTERN W -18DE ; [.352F.0020.0002] # CANADIAN SYLLABICS FINAL SMALL RING -18DF ; [.3530.0020.0002] # CANADIAN SYLLABICS FINAL RAISED DOT -18E0 ; [.3531.0020.0002] # CANADIAN SYLLABICS R-CREE RWE -18E1 ; [.3532.0020.0002] # CANADIAN SYLLABICS WEST-CREE LOO -18E2 ; [.3533.0020.0002] # CANADIAN SYLLABICS WEST-CREE LAA -18E3 ; [.3534.0020.0002] # CANADIAN SYLLABICS THWE -18E4 ; [.3535.0020.0002] # CANADIAN SYLLABICS THWA -18E5 ; [.3536.0020.0002] # CANADIAN SYLLABICS TTHWE -18E6 ; [.3537.0020.0002] # CANADIAN SYLLABICS TTHOO -18E7 ; [.3538.0020.0002] # CANADIAN SYLLABICS TTHAA -18E8 ; [.3539.0020.0002] # CANADIAN SYLLABICS TLHWE -18E9 ; [.353A.0020.0002] # CANADIAN SYLLABICS TLHOO -18EA ; [.353B.0020.0002] # CANADIAN SYLLABICS SAYISI SHWE -18EB ; [.353C.0020.0002] # CANADIAN SYLLABICS SAYISI SHOO -18EC ; [.353D.0020.0002] # CANADIAN SYLLABICS SAYISI HOO -18ED ; [.353E.0020.0002] # CANADIAN SYLLABICS CARRIER GWU -18EE ; [.353F.0020.0002] # CANADIAN SYLLABICS CARRIER DENE GEE -18EF ; [.3540.0020.0002] # CANADIAN SYLLABICS CARRIER GAA -18F0 ; [.3541.0020.0002] # CANADIAN SYLLABICS CARRIER GWA -18F1 ; [.3542.0020.0002] # CANADIAN SYLLABICS SAYISI JUU -18F2 ; [.3543.0020.0002] # CANADIAN SYLLABICS CARRIER JWA -18F3 ; [.3544.0020.0002] # CANADIAN SYLLABICS BEAVER DENE L -18F4 ; [.3545.0020.0002] # CANADIAN SYLLABICS BEAVER DENE R -18F5 ; [.3546.0020.0002] # CANADIAN SYLLABICS CARRIER DENTAL S -1681 ; [.3547.0020.0002] # OGHAM LETTER BEITH -1682 ; [.3548.0020.0002] # OGHAM LETTER LUIS -1683 ; [.3549.0020.0002] # OGHAM LETTER FEARN -1684 ; [.354A.0020.0002] # OGHAM LETTER SAIL -1685 ; [.354B.0020.0002] # OGHAM LETTER NION -1686 ; [.354C.0020.0002] # OGHAM LETTER UATH -1687 ; [.354D.0020.0002] # OGHAM LETTER DAIR -1688 ; [.354E.0020.0002] # OGHAM LETTER TINNE -1689 ; [.354F.0020.0002] # OGHAM LETTER COLL -168A ; [.3550.0020.0002] # OGHAM LETTER CEIRT -168B ; [.3551.0020.0002] # OGHAM LETTER MUIN -168C ; [.3552.0020.0002] # OGHAM LETTER GORT -168D ; [.3553.0020.0002] # OGHAM LETTER NGEADAL -168E ; [.3554.0020.0002] # OGHAM LETTER STRAIF -168F ; [.3555.0020.0002] # OGHAM LETTER RUIS -1690 ; [.3556.0020.0002] # OGHAM LETTER AILM -1691 ; [.3557.0020.0002] # OGHAM LETTER ONN -1692 ; [.3558.0020.0002] # OGHAM LETTER UR -1693 ; [.3559.0020.0002] # OGHAM LETTER EADHADH -1694 ; [.355A.0020.0002] # OGHAM LETTER IODHADH -1695 ; [.355B.0020.0002] # OGHAM LETTER EABHADH -1696 ; [.355C.0020.0002] # OGHAM LETTER OR -1697 ; [.355D.0020.0002] # OGHAM LETTER UILLEANN -1698 ; [.355E.0020.0002] # OGHAM LETTER IFIN -1699 ; [.355F.0020.0002] # OGHAM LETTER EAMHANCHOLL -169A ; [.3560.0020.0002] # OGHAM LETTER PEITH -16A0 ; [.3561.0020.0002] # RUNIC LETTER FEHU FEOH FE F -16A1 ; [.3561.0020.0004][.0000.010B.0004] # RUNIC LETTER V -16A2 ; [.3562.0020.0002] # RUNIC LETTER URUZ UR U -16A4 ; [.3562.0020.0004][.0000.010B.0004] # RUNIC LETTER Y -16A5 ; [.3562.0020.0004][.0000.010C.0004] # RUNIC LETTER W -16A6 ; [.3563.0020.0002] # RUNIC LETTER THURISAZ THURS THORN -16A7 ; [.3563.0020.0004][.0000.010B.0004] # RUNIC LETTER ETH -16F0 ; [.3563.0020.0004][.3563.0020.0004] # RUNIC BELGTHOR SYMBOL -16A8 ; [.3564.0020.0002] # RUNIC LETTER ANSUZ A -16A9 ; [.3564.0020.0004][.0000.010B.0004] # RUNIC LETTER OS O -16AC ; [.3564.0020.0004][.0000.010C.0004] # RUNIC LETTER LONG-BRANCH-OSS O -16AD ; [.3564.0020.0004][.0000.010D.0004] # RUNIC LETTER SHORT-TWIG-OSS O -16AE ; [.3564.0020.0004][.0000.010E.0004] # RUNIC LETTER O -16F4 ; [.3565.0020.0002] # RUNIC LETTER FRANKS CASKET OS -16AF ; [.3566.0020.0002] # RUNIC LETTER OE -16B0 ; [.3567.0020.0002] # RUNIC LETTER ON -16B1 ; [.3568.0020.0002] # RUNIC LETTER RAIDO RAD REID R -16B2 ; [.3569.0020.0002] # RUNIC LETTER KAUNA -16B3 ; [.3569.0020.0004][.0000.010B.0004] # RUNIC LETTER CEN -16B4 ; [.3569.0020.0004][.0000.010C.0004] # RUNIC LETTER KAUN K -16B5 ; [.3569.0020.0004][.0000.010D.0004] # RUNIC LETTER G -16B6 ; [.3569.0020.0004][.0000.010E.0004] # RUNIC LETTER ENG -16F1 ; [.356A.0020.0002] # RUNIC LETTER K -16B7 ; [.356B.0020.0002] # RUNIC LETTER GEBO GYFU G -16B9 ; [.356C.0020.0002] # RUNIC LETTER WUNJO WYNN W -16E9 ; [.356C.0020.0004][.0000.010B.0004] # RUNIC LETTER Q -16BA ; [.356D.0020.0002] # RUNIC LETTER HAGLAZ H -16BB ; [.356D.0020.0004][.0000.010B.0004] # RUNIC LETTER HAEGL H -16BC ; [.356D.0020.0004][.0000.010C.0004] # RUNIC LETTER LONG-BRANCH-HAGALL H -16BD ; [.356D.0020.0004][.0000.010D.0004] # RUNIC LETTER SHORT-TWIG-HAGALL H -16BE ; [.356E.0020.0002] # RUNIC LETTER NAUDIZ NYD NAUD N -16BF ; [.356E.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-NAUD N -16C0 ; [.356E.0020.0004][.0000.010C.0004] # RUNIC LETTER DOTTED-N -16C1 ; [.356F.0020.0002] # RUNIC LETTER ISAZ IS ISS I -16C2 ; [.356F.0020.0004][.0000.010B.0004] # RUNIC LETTER E -16F5 ; [.3570.0020.0002] # RUNIC LETTER FRANKS CASKET IS -16C3 ; [.3571.0020.0002] # RUNIC LETTER JERAN J -16C4 ; [.3571.0020.0004][.0000.010B.0004] # RUNIC LETTER GER -16C5 ; [.3572.0020.0002] # RUNIC LETTER LONG-BRANCH-AR AE -16C6 ; [.3572.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-AR A -16EE ; [.3572.0020.0004][.357D.0020.0004] # RUNIC ARLAUG SYMBOL -16C7 ; [.3573.0020.0002] # RUNIC LETTER IWAZ EOH -16C8 ; [.3574.0020.0002] # RUNIC LETTER PERTHO PEORTH P -16D5 ; [.3574.0020.0004][.0000.010B.0004] # RUNIC LETTER OPEN-P -16C9 ; [.3575.0020.0002] # RUNIC LETTER ALGIZ EOLHX -16CA ; [.3576.0020.0002] # RUNIC LETTER SOWILO S -16CB ; [.3576.0020.0004][.0000.010B.0004] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S -16EA ; [.3576.0020.0004][.0000.010C.0004] # RUNIC LETTER X -16CC ; [.3576.0020.0004][.0000.010D.0004] # RUNIC LETTER SHORT-TWIG-SOL S -16CD ; [.3576.0020.0004][.0000.010E.0004] # RUNIC LETTER C -16CE ; [.3576.0020.0004][.0000.010F.0004] # RUNIC LETTER Z -16F2 ; [.3577.0020.0002] # RUNIC LETTER SH -16CF ; [.3578.0020.0002] # RUNIC LETTER TIWAZ TIR TYR T -16D0 ; [.3578.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-TYR T -16D1 ; [.3578.0020.0004][.0000.010C.0004] # RUNIC LETTER D -16D2 ; [.3579.0020.0002] # RUNIC LETTER BERKANAN BEORC BJARKAN B -16D3 ; [.3579.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-BJARKAN B -16D4 ; [.3579.0020.0004][.0000.010C.0004] # RUNIC LETTER DOTTED-P -16D6 ; [.357A.0020.0002] # RUNIC LETTER EHWAZ EH E -16F6 ; [.357B.0020.0002] # RUNIC LETTER FRANKS CASKET EH -16D7 ; [.357C.0020.0002] # RUNIC LETTER MANNAZ MAN M -16D8 ; [.357C.0020.0004][.0000.010B.0004] # RUNIC LETTER LONG-BRANCH-MADR M -16D9 ; [.357C.0020.0004][.0000.010C.0004] # RUNIC LETTER SHORT-TWIG-MADR M -16EF ; [.357C.0020.0004][.0000.010B.0004][.357C.0020.0004][.0000.010B.0004] # RUNIC TVIMADUR SYMBOL -16DA ; [.357D.0020.0002] # RUNIC LETTER LAUKAZ LAGU LOGR L -16DB ; [.357D.0020.0004][.0000.010B.0004] # RUNIC LETTER DOTTED-L -16DC ; [.357E.0020.0002] # RUNIC LETTER INGWAZ -16DD ; [.357E.0020.0004][.0000.010B.0004] # RUNIC LETTER ING -16DE ; [.357F.0020.0002] # RUNIC LETTER DAGAZ DAEG D -16DF ; [.3580.0020.0002] # RUNIC LETTER OTHALAN ETHEL O -16F3 ; [.3581.0020.0002] # RUNIC LETTER OO -16AA ; [.3582.0020.0002] # RUNIC LETTER AC A -16F7 ; [.3583.0020.0002] # RUNIC LETTER FRANKS CASKET AC -16AB ; [.3584.0020.0002] # RUNIC LETTER AESC -16F8 ; [.3585.0020.0002] # RUNIC LETTER FRANKS CASKET AESC -16A3 ; [.3586.0020.0002] # RUNIC LETTER YR -16E0 ; [.3587.0020.0002] # RUNIC LETTER EAR -16E3 ; [.3588.0020.0002] # RUNIC LETTER CALC -16B8 ; [.3589.0020.0002] # RUNIC LETTER GAR -16E4 ; [.358A.0020.0002] # RUNIC LETTER CEALC -16E1 ; [.358B.0020.0002] # RUNIC LETTER IOR -16E2 ; [.358C.0020.0002] # RUNIC LETTER CWEORTH -16E5 ; [.358D.0020.0002] # RUNIC LETTER STAN -16E6 ; [.358E.0020.0002] # RUNIC LETTER LONG-BRANCH-YR -16E7 ; [.358E.0020.0004][.0000.010B.0004] # RUNIC LETTER SHORT-TWIG-YR -16E8 ; [.358E.0020.0004][.0000.010C.0004] # RUNIC LETTER ICELANDIC-YR -10CC0 ; [.358F.0020.0002] # OLD HUNGARIAN SMALL LETTER A -10C80 ; [.358F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER A -10CC1 ; [.358F.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER AA -10C81 ; [.358F.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER AA -10CC2 ; [.3590.0020.0002] # OLD HUNGARIAN SMALL LETTER EB -10C82 ; [.3590.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EB -10CC3 ; [.3591.0020.0002] # OLD HUNGARIAN SMALL LETTER AMB -10C83 ; [.3591.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AMB -10CC4 ; [.3592.0020.0002] # OLD HUNGARIAN SMALL LETTER EC -10C84 ; [.3592.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EC -10CC5 ; [.3593.0020.0002] # OLD HUNGARIAN SMALL LETTER ENC -10C85 ; [.3593.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENC -10CC6 ; [.3594.0020.0002] # OLD HUNGARIAN SMALL LETTER ECS -10C86 ; [.3594.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECS -10CC7 ; [.3595.0020.0002] # OLD HUNGARIAN SMALL LETTER ED -10C87 ; [.3595.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ED -10CC8 ; [.3596.0020.0002] # OLD HUNGARIAN SMALL LETTER AND -10C88 ; [.3596.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AND -10CC9 ; [.3597.0020.0002] # OLD HUNGARIAN SMALL LETTER E -10C89 ; [.3597.0020.0008] # OLD HUNGARIAN CAPITAL LETTER E -10CCA ; [.3597.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER CLOSE E -10C8A ; [.3597.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER CLOSE E -10CCB ; [.3597.0020.0004][.0000.010C.0004] # OLD HUNGARIAN SMALL LETTER EE -10C8B ; [.3597.0020.000A][.0000.010C.0004] # OLD HUNGARIAN CAPITAL LETTER EE -10CCC ; [.3598.0020.0002] # OLD HUNGARIAN SMALL LETTER EF -10C8C ; [.3598.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EF -10CCD ; [.3599.0020.0002] # OLD HUNGARIAN SMALL LETTER EG -10C8D ; [.3599.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EG -10CCE ; [.359A.0020.0002] # OLD HUNGARIAN SMALL LETTER EGY -10C8E ; [.359A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EGY -10CCF ; [.359B.0020.0002] # OLD HUNGARIAN SMALL LETTER EH -10C8F ; [.359B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EH -10CD0 ; [.359C.0020.0002] # OLD HUNGARIAN SMALL LETTER I -10C90 ; [.359C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER I -10CD1 ; [.359C.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER II -10C91 ; [.359C.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER II -10CD2 ; [.359D.0020.0002] # OLD HUNGARIAN SMALL LETTER EJ -10C92 ; [.359D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EJ -10CD3 ; [.359E.0020.0002] # OLD HUNGARIAN SMALL LETTER EK -10C93 ; [.359E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EK -10CD4 ; [.359F.0020.0002] # OLD HUNGARIAN SMALL LETTER AK -10C94 ; [.359F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AK -10CD5 ; [.35A0.0020.0002] # OLD HUNGARIAN SMALL LETTER UNK -10C95 ; [.35A0.0020.0008] # OLD HUNGARIAN CAPITAL LETTER UNK -10CD6 ; [.35A1.0020.0002] # OLD HUNGARIAN SMALL LETTER EL -10C96 ; [.35A1.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EL -10CD7 ; [.35A2.0020.0002] # OLD HUNGARIAN SMALL LETTER ELY -10C97 ; [.35A2.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ELY -10CD8 ; [.35A3.0020.0002] # OLD HUNGARIAN SMALL LETTER EM -10C98 ; [.35A3.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EM -10CD9 ; [.35A4.0020.0002] # OLD HUNGARIAN SMALL LETTER EN -10C99 ; [.35A4.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EN -10CDA ; [.35A5.0020.0002] # OLD HUNGARIAN SMALL LETTER ENY -10C9A ; [.35A5.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENY -10CDB ; [.35A6.0020.0002] # OLD HUNGARIAN SMALL LETTER O -10C9B ; [.35A6.0020.0008] # OLD HUNGARIAN CAPITAL LETTER O -10CDC ; [.35A6.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER OO -10C9C ; [.35A6.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER OO -10CDD ; [.35A7.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE -10C9D ; [.35A7.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE -10CDE ; [.35A7.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA OE -10C9E ; [.35A7.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE -10CDF ; [.35A7.0020.0004][.0000.010C.0004] # OLD HUNGARIAN SMALL LETTER OEE -10C9F ; [.35A7.0020.000A][.0000.010C.0004] # OLD HUNGARIAN CAPITAL LETTER OEE -10CE0 ; [.35A8.0020.0002] # OLD HUNGARIAN SMALL LETTER EP -10CA0 ; [.35A8.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EP -10CE1 ; [.35A9.0020.0002] # OLD HUNGARIAN SMALL LETTER EMP -10CA1 ; [.35A9.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EMP -10CE2 ; [.35AA.0020.0002] # OLD HUNGARIAN SMALL LETTER ER -10CA2 ; [.35AA.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ER -10CE3 ; [.35AA.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER SHORT ER -10CA3 ; [.35AA.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER SHORT ER -10CE4 ; [.35AB.0020.0002] # OLD HUNGARIAN SMALL LETTER ES -10CA4 ; [.35AB.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ES -10CE5 ; [.35AC.0020.0002] # OLD HUNGARIAN SMALL LETTER ESZ -10CA5 ; [.35AC.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ESZ -10CE6 ; [.35AD.0020.0002] # OLD HUNGARIAN SMALL LETTER ET -10CA6 ; [.35AD.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ET -10CE7 ; [.35AE.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT -10CA7 ; [.35AE.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT -10CE8 ; [.35AF.0020.0002] # OLD HUNGARIAN SMALL LETTER ETY -10CA8 ; [.35AF.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ETY -10CE9 ; [.35B0.0020.0002] # OLD HUNGARIAN SMALL LETTER ECH -10CA9 ; [.35B0.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECH -10CEA ; [.35B1.0020.0002] # OLD HUNGARIAN SMALL LETTER U -10CAA ; [.35B1.0020.0008] # OLD HUNGARIAN CAPITAL LETTER U -10CEB ; [.35B1.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER UU -10CAB ; [.35B1.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER UU -10CEC ; [.35B2.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE -10CAC ; [.35B2.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE -10CED ; [.35B2.0020.0004][.0000.010B.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA UE -10CAD ; [.35B2.0020.000A][.0000.010B.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE -10CEE ; [.35B3.0020.0002] # OLD HUNGARIAN SMALL LETTER EV -10CAE ; [.35B3.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EV -10CEF ; [.35B4.0020.0002] # OLD HUNGARIAN SMALL LETTER EZ -10CAF ; [.35B4.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZ -10CF0 ; [.35B5.0020.0002] # OLD HUNGARIAN SMALL LETTER EZS -10CB0 ; [.35B5.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZS -10CF1 ; [.35B6.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN -10CB1 ; [.35B6.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN -10CF2 ; [.35B7.0020.0002] # OLD HUNGARIAN SMALL LETTER US -10CB2 ; [.35B7.0020.0008] # OLD HUNGARIAN CAPITAL LETTER US -10C00 ; [.35B8.0020.0002] # OLD TURKIC LETTER ORKHON A -10C01 ; [.35B8.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI A -10C02 ; [.35B9.0020.0002] # OLD TURKIC LETTER YENISEI AE -10C03 ; [.35BA.0020.0002] # OLD TURKIC LETTER ORKHON I -10C04 ; [.35BA.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI I -10C05 ; [.35BB.0020.0002] # OLD TURKIC LETTER YENISEI E -10C06 ; [.35BC.0020.0002] # OLD TURKIC LETTER ORKHON O -10C07 ; [.35BD.0020.0002] # OLD TURKIC LETTER ORKHON OE -10C08 ; [.35BD.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI OE -10C09 ; [.35BE.0020.0002] # OLD TURKIC LETTER ORKHON AB -10C0A ; [.35BE.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AB -10C0B ; [.35BF.0020.0002] # OLD TURKIC LETTER ORKHON AEB -10C0C ; [.35BF.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEB -10C0D ; [.35C0.0020.0002] # OLD TURKIC LETTER ORKHON AG -10C0E ; [.35C0.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AG -10C0F ; [.35C1.0020.0002] # OLD TURKIC LETTER ORKHON AEG -10C10 ; [.35C1.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEG -10C11 ; [.35C2.0020.0002] # OLD TURKIC LETTER ORKHON AD -10C12 ; [.35C2.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AD -10C13 ; [.35C3.0020.0002] # OLD TURKIC LETTER ORKHON AED -10C14 ; [.35C4.0020.0002] # OLD TURKIC LETTER ORKHON EZ -10C15 ; [.35C4.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI EZ -10C16 ; [.35C5.0020.0002] # OLD TURKIC LETTER ORKHON AY -10C17 ; [.35C5.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AY -10C18 ; [.35C6.0020.0002] # OLD TURKIC LETTER ORKHON AEY -10C19 ; [.35C6.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEY -10C1A ; [.35C7.0020.0002] # OLD TURKIC LETTER ORKHON AEK -10C1B ; [.35C7.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEK -10C1C ; [.35C8.0020.0002] # OLD TURKIC LETTER ORKHON OEK -10C1D ; [.35C8.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI OEK -10C1E ; [.35C9.0020.0002] # OLD TURKIC LETTER ORKHON AL -10C1F ; [.35C9.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AL -10C20 ; [.35CA.0020.0002] # OLD TURKIC LETTER ORKHON AEL -10C21 ; [.35CB.0020.0002] # OLD TURKIC LETTER ORKHON ELT -10C22 ; [.35CC.0020.0002] # OLD TURKIC LETTER ORKHON EM -10C23 ; [.35CD.0020.0002] # OLD TURKIC LETTER ORKHON AN -10C24 ; [.35CE.0020.0002] # OLD TURKIC LETTER ORKHON AEN -10C25 ; [.35CE.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AEN -10C26 ; [.35CF.0020.0002] # OLD TURKIC LETTER ORKHON ENT -10C27 ; [.35CF.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ENT -10C28 ; [.35D0.0020.0002] # OLD TURKIC LETTER ORKHON ENC -10C29 ; [.35D0.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ENC -10C2A ; [.35D1.0020.0002] # OLD TURKIC LETTER ORKHON ENY -10C2B ; [.35D1.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ENY -10C2C ; [.35D2.0020.0002] # OLD TURKIC LETTER YENISEI ANG -10C2D ; [.35D3.0020.0002] # OLD TURKIC LETTER ORKHON ENG -10C2E ; [.35D3.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AENG -10C2F ; [.35D4.0020.0002] # OLD TURKIC LETTER ORKHON EP -10C30 ; [.35D5.0020.0002] # OLD TURKIC LETTER ORKHON OP -10C31 ; [.35D6.0020.0002] # OLD TURKIC LETTER ORKHON IC -10C32 ; [.35D7.0020.0002] # OLD TURKIC LETTER ORKHON EC -10C33 ; [.35D7.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI EC -10C34 ; [.35D8.0020.0002] # OLD TURKIC LETTER ORKHON AQ -10C35 ; [.35D8.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AQ -10C36 ; [.35D9.0020.0002] # OLD TURKIC LETTER ORKHON IQ -10C37 ; [.35D9.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI IQ -10C38 ; [.35DA.0020.0002] # OLD TURKIC LETTER ORKHON OQ -10C39 ; [.35DA.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI OQ -10C3A ; [.35DB.0020.0002] # OLD TURKIC LETTER ORKHON AR -10C3B ; [.35DB.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AR -10C3C ; [.35DC.0020.0002] # OLD TURKIC LETTER ORKHON AER -10C3D ; [.35DD.0020.0002] # OLD TURKIC LETTER ORKHON AS -10C3E ; [.35DE.0020.0002] # OLD TURKIC LETTER ORKHON AES -10C3F ; [.35DF.0020.0002] # OLD TURKIC LETTER ORKHON ASH -10C40 ; [.35DF.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ASH -10C41 ; [.35E0.0020.0002] # OLD TURKIC LETTER ORKHON ESH -10C42 ; [.35E0.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI ESH -10C43 ; [.35E1.0020.0002] # OLD TURKIC LETTER ORKHON AT -10C44 ; [.35E1.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AT -10C45 ; [.35E2.0020.0002] # OLD TURKIC LETTER ORKHON AET -10C46 ; [.35E2.0020.0004][.0000.010B.0004] # OLD TURKIC LETTER YENISEI AET -10C47 ; [.35E3.0020.0002] # OLD TURKIC LETTER ORKHON OT -10C48 ; [.35E4.0020.0002] # OLD TURKIC LETTER ORKHON BASH -A500 ; [.35E5.0020.0002] # VAI SYLLABLE EE -A501 ; [.35E6.0020.0002] # VAI SYLLABLE EEN -A502 ; [.35E7.0020.0002] # VAI SYLLABLE HEE -A503 ; [.35E8.0020.0002] # VAI SYLLABLE WEE -A504 ; [.35E9.0020.0002] # VAI SYLLABLE WEEN -A505 ; [.35EA.0020.0002] # VAI SYLLABLE PEE -A506 ; [.35EB.0020.0002] # VAI SYLLABLE BHEE -A507 ; [.35EC.0020.0002] # VAI SYLLABLE BEE -A508 ; [.35ED.0020.0002] # VAI SYLLABLE MBEE -A509 ; [.35EE.0020.0002] # VAI SYLLABLE KPEE -A50A ; [.35EF.0020.0002] # VAI SYLLABLE MGBEE -A50B ; [.35F0.0020.0002] # VAI SYLLABLE GBEE -A50C ; [.35F1.0020.0002] # VAI SYLLABLE FEE -A613 ; [.35F1.0020.0004][.36F0.0020.0004] # VAI SYMBOL FEENG -A50D ; [.35F2.0020.0002] # VAI SYLLABLE VEE -A50E ; [.35F3.0020.0002] # VAI SYLLABLE TEE -A50F ; [.35F4.0020.0002] # VAI SYLLABLE THEE -A510 ; [.35F5.0020.0002] # VAI SYLLABLE DHEE -A511 ; [.35F6.0020.0002] # VAI SYLLABLE DHHEE -A512 ; [.35F7.0020.0002] # VAI SYLLABLE LEE -A513 ; [.35F8.0020.0002] # VAI SYLLABLE REE -A514 ; [.35F9.0020.0002] # VAI SYLLABLE DEE -A515 ; [.35FA.0020.0002] # VAI SYLLABLE NDEE -A516 ; [.35FB.0020.0002] # VAI SYLLABLE SEE -A517 ; [.35FC.0020.0002] # VAI SYLLABLE SHEE -A518 ; [.35FD.0020.0002] # VAI SYLLABLE ZEE -A519 ; [.35FE.0020.0002] # VAI SYLLABLE ZHEE -A51A ; [.35FF.0020.0002] # VAI SYLLABLE CEE -A51B ; [.3600.0020.0002] # VAI SYLLABLE JEE -A51C ; [.3601.0020.0002] # VAI SYLLABLE NJEE -A51D ; [.3602.0020.0002] # VAI SYLLABLE YEE -A51E ; [.3603.0020.0002] # VAI SYLLABLE KEE -A614 ; [.3603.0020.0004][.36F0.0020.0004] # VAI SYMBOL KEENG -A51F ; [.3604.0020.0002] # VAI SYLLABLE NGGEE -A520 ; [.3605.0020.0002] # VAI SYLLABLE GEE -A521 ; [.3606.0020.0002] # VAI SYLLABLE MEE -A522 ; [.3607.0020.0002] # VAI SYLLABLE NEE -A523 ; [.3608.0020.0002] # VAI SYLLABLE NYEE -A524 ; [.3609.0020.0002] # VAI SYLLABLE I -A525 ; [.360A.0020.0002] # VAI SYLLABLE IN -A526 ; [.360B.0020.0002] # VAI SYLLABLE HI -A527 ; [.360C.0020.0002] # VAI SYLLABLE HIN -A528 ; [.360D.0020.0002] # VAI SYLLABLE WI -A529 ; [.360E.0020.0002] # VAI SYLLABLE WIN -A52A ; [.360F.0020.0002] # VAI SYLLABLE PI -A52B ; [.3610.0020.0002] # VAI SYLLABLE BHI -A52C ; [.3611.0020.0002] # VAI SYLLABLE BI -A52D ; [.3612.0020.0002] # VAI SYLLABLE MBI -A52E ; [.3613.0020.0002] # VAI SYLLABLE KPI -A52F ; [.3614.0020.0002] # VAI SYLLABLE MGBI -A530 ; [.3615.0020.0002] # VAI SYLLABLE GBI -A531 ; [.3616.0020.0002] # VAI SYLLABLE FI -A532 ; [.3617.0020.0002] # VAI SYLLABLE VI -A533 ; [.3618.0020.0002] # VAI SYLLABLE TI -A615 ; [.3618.0020.0004][.36F0.0020.0004] # VAI SYMBOL TING -A534 ; [.3619.0020.0002] # VAI SYLLABLE THI -A535 ; [.361A.0020.0002] # VAI SYLLABLE DHI -A536 ; [.361B.0020.0002] # VAI SYLLABLE DHHI -A537 ; [.361C.0020.0002] # VAI SYLLABLE LI -A538 ; [.361D.0020.0002] # VAI SYLLABLE RI -A539 ; [.361E.0020.0002] # VAI SYLLABLE DI -A53A ; [.361F.0020.0002] # VAI SYLLABLE NDI -A53B ; [.3620.0020.0002] # VAI SYLLABLE SI -A53C ; [.3621.0020.0002] # VAI SYLLABLE SHI -A53D ; [.3622.0020.0002] # VAI SYLLABLE ZI -A53E ; [.3623.0020.0002] # VAI SYLLABLE ZHI -A53F ; [.3624.0020.0002] # VAI SYLLABLE CI -A540 ; [.3625.0020.0002] # VAI SYLLABLE JI -A541 ; [.3626.0020.0002] # VAI SYLLABLE NJI -A542 ; [.3627.0020.0002] # VAI SYLLABLE YI -A543 ; [.3628.0020.0002] # VAI SYLLABLE KI -A544 ; [.3629.0020.0002] # VAI SYLLABLE NGGI -A545 ; [.362A.0020.0002] # VAI SYLLABLE GI -A546 ; [.362B.0020.0002] # VAI SYLLABLE MI -A547 ; [.362C.0020.0002] # VAI SYLLABLE NI -A616 ; [.362C.0020.0004][.36F1.0020.0004] # VAI SYMBOL NII -A548 ; [.362D.0020.0002] # VAI SYLLABLE NYI -A549 ; [.362E.0020.0002] # VAI SYLLABLE A -A54A ; [.362F.0020.0002] # VAI SYLLABLE AN -A54B ; [.3630.0020.0002] # VAI SYLLABLE NGAN -A54C ; [.3631.0020.0002] # VAI SYLLABLE HA -A54D ; [.3632.0020.0002] # VAI SYLLABLE HAN -A54E ; [.3633.0020.0002] # VAI SYLLABLE WA -A54F ; [.3634.0020.0002] # VAI SYLLABLE WAN -A550 ; [.3635.0020.0002] # VAI SYLLABLE PA -A551 ; [.3636.0020.0002] # VAI SYLLABLE BHA -A552 ; [.3637.0020.0002] # VAI SYLLABLE BA -A617 ; [.3637.0020.0004][.36F0.0020.0004] # VAI SYMBOL BANG -A553 ; [.3638.0020.0002] # VAI SYLLABLE MBA -A554 ; [.3639.0020.0002] # VAI SYLLABLE KPA -A555 ; [.363A.0020.0002] # VAI SYLLABLE KPAN -A556 ; [.363B.0020.0002] # VAI SYLLABLE MGBA -A557 ; [.363C.0020.0002] # VAI SYLLABLE GBA -A558 ; [.363D.0020.0002] # VAI SYLLABLE FA -A610 ; [.363D.0020.0004] # VAI SYLLABLE NDOLE FA -A618 ; [.363D.0020.0004][.36F1.0020.0004] # VAI SYMBOL FAA -A559 ; [.363E.0020.0002] # VAI SYLLABLE VA -A55A ; [.363F.0020.0002] # VAI SYLLABLE TA -A619 ; [.363F.0020.0004][.36F1.0020.0004] # VAI SYMBOL TAA -A55B ; [.3640.0020.0002] # VAI SYLLABLE THA -A55C ; [.3641.0020.0002] # VAI SYLLABLE DHA -A55D ; [.3642.0020.0002] # VAI SYLLABLE DHHA -A55E ; [.3643.0020.0002] # VAI SYLLABLE LA -A55F ; [.3644.0020.0002] # VAI SYLLABLE RA -A560 ; [.3645.0020.0002] # VAI SYLLABLE DA -A61A ; [.3645.0020.0004][.36F0.0020.0004] # VAI SYMBOL DANG -A561 ; [.3646.0020.0002] # VAI SYLLABLE NDA -A562 ; [.3647.0020.0002] # VAI SYLLABLE SA -A563 ; [.3648.0020.0002] # VAI SYLLABLE SHA -A564 ; [.3649.0020.0002] # VAI SYLLABLE ZA -A565 ; [.364A.0020.0002] # VAI SYLLABLE ZHA -A566 ; [.364B.0020.0002] # VAI SYLLABLE CA -A567 ; [.364C.0020.0002] # VAI SYLLABLE JA -A568 ; [.364D.0020.0002] # VAI SYLLABLE NJA -A569 ; [.364E.0020.0002] # VAI SYLLABLE YA -A56A ; [.364F.0020.0002] # VAI SYLLABLE KA -A611 ; [.364F.0020.0004] # VAI SYLLABLE NDOLE KA -A56B ; [.3650.0020.0002] # VAI SYLLABLE KAN -A56C ; [.3651.0020.0002] # VAI SYLLABLE NGGA -A56D ; [.3652.0020.0002] # VAI SYLLABLE GA -A56E ; [.3653.0020.0002] # VAI SYLLABLE MA -A62A ; [.3653.0020.0004] # VAI SYLLABLE NDOLE MA -A56F ; [.3654.0020.0002] # VAI SYLLABLE NA -A570 ; [.3655.0020.0002] # VAI SYLLABLE NYA -A571 ; [.3656.0020.0002] # VAI SYLLABLE OO -A572 ; [.3657.0020.0002] # VAI SYLLABLE OON -A573 ; [.3658.0020.0002] # VAI SYLLABLE HOO -A574 ; [.3659.0020.0002] # VAI SYLLABLE WOO -A575 ; [.365A.0020.0002] # VAI SYLLABLE WOON -A576 ; [.365B.0020.0002] # VAI SYLLABLE POO -A577 ; [.365C.0020.0002] # VAI SYLLABLE BHOO -A578 ; [.365D.0020.0002] # VAI SYLLABLE BOO -A579 ; [.365E.0020.0002] # VAI SYLLABLE MBOO -A57A ; [.365F.0020.0002] # VAI SYLLABLE KPOO -A57B ; [.3660.0020.0002] # VAI SYLLABLE MGBOO -A57C ; [.3661.0020.0002] # VAI SYLLABLE GBOO -A57D ; [.3662.0020.0002] # VAI SYLLABLE FOO -A57E ; [.3663.0020.0002] # VAI SYLLABLE VOO -A57F ; [.3664.0020.0002] # VAI SYLLABLE TOO -A580 ; [.3665.0020.0002] # VAI SYLLABLE THOO -A581 ; [.3666.0020.0002] # VAI SYLLABLE DHOO -A582 ; [.3667.0020.0002] # VAI SYLLABLE DHHOO -A583 ; [.3668.0020.0002] # VAI SYLLABLE LOO -A584 ; [.3669.0020.0002] # VAI SYLLABLE ROO -A585 ; [.366A.0020.0002] # VAI SYLLABLE DOO -A61B ; [.366A.0020.0004][.36F0.0020.0004] # VAI SYMBOL DOONG -A586 ; [.366B.0020.0002] # VAI SYLLABLE NDOO -A587 ; [.366C.0020.0002] # VAI SYLLABLE SOO -A612 ; [.366C.0020.0004] # VAI SYLLABLE NDOLE SOO -A588 ; [.366D.0020.0002] # VAI SYLLABLE SHOO -A589 ; [.366E.0020.0002] # VAI SYLLABLE ZOO -A58A ; [.366F.0020.0002] # VAI SYLLABLE ZHOO -A58B ; [.3670.0020.0002] # VAI SYLLABLE COO -A58C ; [.3671.0020.0002] # VAI SYLLABLE JOO -A58D ; [.3672.0020.0002] # VAI SYLLABLE NJOO -A58E ; [.3673.0020.0002] # VAI SYLLABLE YOO -A58F ; [.3674.0020.0002] # VAI SYLLABLE KOO -A590 ; [.3675.0020.0002] # VAI SYLLABLE NGGOO -A591 ; [.3676.0020.0002] # VAI SYLLABLE GOO -A592 ; [.3677.0020.0002] # VAI SYLLABLE MOO -A593 ; [.3678.0020.0002] # VAI SYLLABLE NOO -A594 ; [.3679.0020.0002] # VAI SYLLABLE NYOO -A595 ; [.367A.0020.0002] # VAI SYLLABLE U -A596 ; [.367B.0020.0002] # VAI SYLLABLE UN -A597 ; [.367C.0020.0002] # VAI SYLLABLE HU -A598 ; [.367D.0020.0002] # VAI SYLLABLE HUN -A599 ; [.367E.0020.0002] # VAI SYLLABLE WU -A59A ; [.367F.0020.0002] # VAI SYLLABLE WUN -A59B ; [.3680.0020.0002] # VAI SYLLABLE PU -A59C ; [.3681.0020.0002] # VAI SYLLABLE BHU -A59D ; [.3682.0020.0002] # VAI SYLLABLE BU -A59E ; [.3683.0020.0002] # VAI SYLLABLE MBU -A59F ; [.3684.0020.0002] # VAI SYLLABLE KPU -A5A0 ; [.3685.0020.0002] # VAI SYLLABLE MGBU -A5A1 ; [.3686.0020.0002] # VAI SYLLABLE GBU -A5A2 ; [.3687.0020.0002] # VAI SYLLABLE FU -A5A3 ; [.3688.0020.0002] # VAI SYLLABLE VU -A5A4 ; [.3689.0020.0002] # VAI SYLLABLE TU -A5A5 ; [.368A.0020.0002] # VAI SYLLABLE THU -A5A6 ; [.368B.0020.0002] # VAI SYLLABLE DHU -A5A7 ; [.368C.0020.0002] # VAI SYLLABLE DHHU -A5A8 ; [.368D.0020.0002] # VAI SYLLABLE LU -A5A9 ; [.368E.0020.0002] # VAI SYLLABLE RU -A5AA ; [.368F.0020.0002] # VAI SYLLABLE DU -A5AB ; [.3690.0020.0002] # VAI SYLLABLE NDU -A5AC ; [.3691.0020.0002] # VAI SYLLABLE SU -A5AD ; [.3692.0020.0002] # VAI SYLLABLE SHU -A5AE ; [.3693.0020.0002] # VAI SYLLABLE ZU -A5AF ; [.3694.0020.0002] # VAI SYLLABLE ZHU -A5B0 ; [.3695.0020.0002] # VAI SYLLABLE CU -A5B1 ; [.3696.0020.0002] # VAI SYLLABLE JU -A5B2 ; [.3697.0020.0002] # VAI SYLLABLE NJU -A5B3 ; [.3698.0020.0002] # VAI SYLLABLE YU -A5B4 ; [.3699.0020.0002] # VAI SYLLABLE KU -A61C ; [.3699.0020.0004][.36F0.0020.0004] # VAI SYMBOL KUNG -A5B5 ; [.369A.0020.0002] # VAI SYLLABLE NGGU -A5B6 ; [.369B.0020.0002] # VAI SYLLABLE GU -A5B7 ; [.369C.0020.0002] # VAI SYLLABLE MU -A5B8 ; [.369D.0020.0002] # VAI SYLLABLE NU -A5B9 ; [.369E.0020.0002] # VAI SYLLABLE NYU -A5BA ; [.369F.0020.0002] # VAI SYLLABLE O -A5BB ; [.36A0.0020.0002] # VAI SYLLABLE ON -A5BC ; [.36A1.0020.0002] # VAI SYLLABLE NGON -A5BD ; [.36A2.0020.0002] # VAI SYLLABLE HO -A5BE ; [.36A3.0020.0002] # VAI SYLLABLE HON -A5BF ; [.36A4.0020.0002] # VAI SYLLABLE WO -A5C0 ; [.36A5.0020.0002] # VAI SYLLABLE WON -A5C1 ; [.36A6.0020.0002] # VAI SYLLABLE PO -A5C2 ; [.36A7.0020.0002] # VAI SYLLABLE BHO -A5C3 ; [.36A8.0020.0002] # VAI SYLLABLE BO -A5C4 ; [.36A9.0020.0002] # VAI SYLLABLE MBO -A5C5 ; [.36AA.0020.0002] # VAI SYLLABLE KPO -A5C6 ; [.36AB.0020.0002] # VAI SYLLABLE MGBO -A5C7 ; [.36AC.0020.0002] # VAI SYLLABLE GBO -A5C8 ; [.36AD.0020.0002] # VAI SYLLABLE GBON -A5C9 ; [.36AE.0020.0002] # VAI SYLLABLE FO -A5CA ; [.36AF.0020.0002] # VAI SYLLABLE VO -A5CB ; [.36B0.0020.0002] # VAI SYLLABLE TO -A61D ; [.36B0.0020.0004][.36F0.0020.0004] # VAI SYMBOL TONG -A5CC ; [.36B1.0020.0002] # VAI SYLLABLE THO -A5CD ; [.36B2.0020.0002] # VAI SYLLABLE DHO -A5CE ; [.36B3.0020.0002] # VAI SYLLABLE DHHO -A5CF ; [.36B4.0020.0002] # VAI SYLLABLE LO -A5D0 ; [.36B5.0020.0002] # VAI SYLLABLE RO -A5D1 ; [.36B6.0020.0002] # VAI SYLLABLE DO -A62B ; [.36B6.0020.0004] # VAI SYLLABLE NDOLE DO -A61E ; [.36B6.0020.0004][.36F1.0020.0004] # VAI SYMBOL DO-O -A5D2 ; [.36B7.0020.0002] # VAI SYLLABLE NDO -A5D3 ; [.36B8.0020.0002] # VAI SYLLABLE SO -A5D4 ; [.36B9.0020.0002] # VAI SYLLABLE SHO -A5D5 ; [.36BA.0020.0002] # VAI SYLLABLE ZO -A5D6 ; [.36BB.0020.0002] # VAI SYLLABLE ZHO -A5D7 ; [.36BC.0020.0002] # VAI SYLLABLE CO -A5D8 ; [.36BD.0020.0002] # VAI SYLLABLE JO -A61F ; [.36BD.0020.0004][.36F0.0020.0004] # VAI SYMBOL JONG -A5D9 ; [.36BE.0020.0002] # VAI SYLLABLE NJO -A5DA ; [.36BF.0020.0002] # VAI SYLLABLE YO -A5DB ; [.36C0.0020.0002] # VAI SYLLABLE KO -A5DC ; [.36C1.0020.0002] # VAI SYLLABLE NGGO -A5DD ; [.36C2.0020.0002] # VAI SYLLABLE GO -A5DE ; [.36C3.0020.0002] # VAI SYLLABLE MO -A5DF ; [.36C4.0020.0002] # VAI SYLLABLE NO -A5E0 ; [.36C5.0020.0002] # VAI SYLLABLE NYO -A5E1 ; [.36C6.0020.0002] # VAI SYLLABLE E -A5E2 ; [.36C7.0020.0002] # VAI SYLLABLE EN -A5E3 ; [.36C8.0020.0002] # VAI SYLLABLE NGEN -A5E4 ; [.36C9.0020.0002] # VAI SYLLABLE HE -A5E5 ; [.36CA.0020.0002] # VAI SYLLABLE HEN -A5E6 ; [.36CB.0020.0002] # VAI SYLLABLE WE -A5E7 ; [.36CC.0020.0002] # VAI SYLLABLE WEN -A5E8 ; [.36CD.0020.0002] # VAI SYLLABLE PE -A5E9 ; [.36CE.0020.0002] # VAI SYLLABLE BHE -A5EA ; [.36CF.0020.0002] # VAI SYLLABLE BE -A5EB ; [.36D0.0020.0002] # VAI SYLLABLE MBE -A5EC ; [.36D1.0020.0002] # VAI SYLLABLE KPE -A5ED ; [.36D2.0020.0002] # VAI SYLLABLE KPEN -A5EE ; [.36D3.0020.0002] # VAI SYLLABLE MGBE -A5EF ; [.36D4.0020.0002] # VAI SYLLABLE GBE -A5F0 ; [.36D5.0020.0002] # VAI SYLLABLE GBEN -A5F1 ; [.36D6.0020.0002] # VAI SYLLABLE FE -A5F2 ; [.36D7.0020.0002] # VAI SYLLABLE VE -A5F3 ; [.36D8.0020.0002] # VAI SYLLABLE TE -A5F4 ; [.36D9.0020.0002] # VAI SYLLABLE THE -A5F5 ; [.36DA.0020.0002] # VAI SYLLABLE DHE -A5F6 ; [.36DB.0020.0002] # VAI SYLLABLE DHHE -A5F7 ; [.36DC.0020.0002] # VAI SYLLABLE LE -A5F8 ; [.36DD.0020.0002] # VAI SYLLABLE RE -A5F9 ; [.36DE.0020.0002] # VAI SYLLABLE DE -A5FA ; [.36DF.0020.0002] # VAI SYLLABLE NDE -A5FB ; [.36E0.0020.0002] # VAI SYLLABLE SE -A5FC ; [.36E1.0020.0002] # VAI SYLLABLE SHE -A5FD ; [.36E2.0020.0002] # VAI SYLLABLE ZE -A5FE ; [.36E3.0020.0002] # VAI SYLLABLE ZHE -A5FF ; [.36E4.0020.0002] # VAI SYLLABLE CE -A600 ; [.36E5.0020.0002] # VAI SYLLABLE JE -A601 ; [.36E6.0020.0002] # VAI SYLLABLE NJE -A602 ; [.36E7.0020.0002] # VAI SYLLABLE YE -A603 ; [.36E8.0020.0002] # VAI SYLLABLE KE -A604 ; [.36E9.0020.0002] # VAI SYLLABLE NGGE -A605 ; [.36EA.0020.0002] # VAI SYLLABLE NGGEN -A606 ; [.36EB.0020.0002] # VAI SYLLABLE GE -A607 ; [.36EC.0020.0002] # VAI SYLLABLE GEN -A608 ; [.36ED.0020.0002] # VAI SYLLABLE ME -A609 ; [.36EE.0020.0002] # VAI SYLLABLE NE -A60A ; [.36EF.0020.0002] # VAI SYLLABLE NYE -A60B ; [.36F0.0020.0002] # VAI SYLLABLE NG -A60C ; [.36F1.0020.0002] # VAI SYLLABLE LENGTHENER -A6A0 ; [.36F2.0020.0002] # BAMUM LETTER A -A6A1 ; [.36F3.0020.0002] # BAMUM LETTER KA -A6A2 ; [.36F4.0020.0002] # BAMUM LETTER U -A6A3 ; [.36F5.0020.0002] # BAMUM LETTER KU -A6A4 ; [.36F6.0020.0002] # BAMUM LETTER EE -A6A5 ; [.36F7.0020.0002] # BAMUM LETTER REE -A6A6 ; [.36F8.0020.0002] # BAMUM LETTER TAE -A6A7 ; [.36F9.0020.0002] # BAMUM LETTER O -A6A8 ; [.36FA.0020.0002] # BAMUM LETTER NYI -A6A9 ; [.36FB.0020.0002] # BAMUM LETTER I -A6AA ; [.36FC.0020.0002] # BAMUM LETTER LA -A6AB ; [.36FD.0020.0002] # BAMUM LETTER PA -A6AC ; [.36FE.0020.0002] # BAMUM LETTER RII -A6AD ; [.36FF.0020.0002] # BAMUM LETTER RIEE -A6AE ; [.3700.0020.0002] # BAMUM LETTER LEEEE -A6AF ; [.3701.0020.0002] # BAMUM LETTER MEEEE -A6B0 ; [.3702.0020.0002] # BAMUM LETTER TAA -A6B1 ; [.3703.0020.0002] # BAMUM LETTER NDAA -A6B2 ; [.3704.0020.0002] # BAMUM LETTER NJAEM -A6B3 ; [.3705.0020.0002] # BAMUM LETTER M -A6B4 ; [.3706.0020.0002] # BAMUM LETTER SUU -A6B5 ; [.3707.0020.0002] # BAMUM LETTER MU -A6B6 ; [.3708.0020.0002] # BAMUM LETTER SHII -A6B7 ; [.3709.0020.0002] # BAMUM LETTER SI -A6B8 ; [.370A.0020.0002] # BAMUM LETTER SHEUX -A6B9 ; [.370B.0020.0002] # BAMUM LETTER SEUX -A6BA ; [.370C.0020.0002] # BAMUM LETTER KYEE -A6BB ; [.370D.0020.0002] # BAMUM LETTER KET -A6BC ; [.370E.0020.0002] # BAMUM LETTER NUAE -A6BD ; [.370F.0020.0002] # BAMUM LETTER NU -A6BE ; [.3710.0020.0002] # BAMUM LETTER NJUAE -A6BF ; [.3711.0020.0002] # BAMUM LETTER YOQ -A6C0 ; [.3712.0020.0002] # BAMUM LETTER SHU -A6C1 ; [.3713.0020.0002] # BAMUM LETTER YUQ -A6C2 ; [.3714.0020.0002] # BAMUM LETTER YA -A6C3 ; [.3715.0020.0002] # BAMUM LETTER NSHA -A6C4 ; [.3716.0020.0002] # BAMUM LETTER KEUX -A6C5 ; [.3717.0020.0002] # BAMUM LETTER PEUX -A6C6 ; [.3718.0020.0002] # BAMUM LETTER NJEE -A6C7 ; [.3719.0020.0002] # BAMUM LETTER NTEE -A6C8 ; [.371A.0020.0002] # BAMUM LETTER PUE -A6C9 ; [.371B.0020.0002] # BAMUM LETTER WUE -A6CA ; [.371C.0020.0002] # BAMUM LETTER PEE -A6CB ; [.371D.0020.0002] # BAMUM LETTER FEE -A6CC ; [.371E.0020.0002] # BAMUM LETTER RU -A6CD ; [.371F.0020.0002] # BAMUM LETTER LU -A6CE ; [.3720.0020.0002] # BAMUM LETTER MI -A6CF ; [.3721.0020.0002] # BAMUM LETTER NI -A6D0 ; [.3722.0020.0002] # BAMUM LETTER REUX -A6D1 ; [.3723.0020.0002] # BAMUM LETTER RAE -A6D2 ; [.3724.0020.0002] # BAMUM LETTER KEN -A6D3 ; [.3725.0020.0002] # BAMUM LETTER NGKWAEN -A6D4 ; [.3726.0020.0002] # BAMUM LETTER NGGA -A6D5 ; [.3727.0020.0002] # BAMUM LETTER NGA -A6D6 ; [.3728.0020.0002] # BAMUM LETTER SHO -A6D7 ; [.3729.0020.0002] # BAMUM LETTER PUAE -A6D8 ; [.372A.0020.0002] # BAMUM LETTER FU -A6D9 ; [.372B.0020.0002] # BAMUM LETTER FOM -A6DA ; [.372C.0020.0002] # BAMUM LETTER WA -A6DB ; [.372D.0020.0002] # BAMUM LETTER NA -A6DC ; [.372E.0020.0002] # BAMUM LETTER LI -A6DD ; [.372F.0020.0002] # BAMUM LETTER PI -A6DE ; [.3730.0020.0002] # BAMUM LETTER LOQ -A6DF ; [.3731.0020.0002] # BAMUM LETTER KO -A6E0 ; [.3732.0020.0002] # BAMUM LETTER MBEN -A6E1 ; [.3733.0020.0002] # BAMUM LETTER REN -A6E2 ; [.3734.0020.0002] # BAMUM LETTER MEN -A6E3 ; [.3735.0020.0002] # BAMUM LETTER MA -A6E4 ; [.3736.0020.0002] # BAMUM LETTER TI -A6E5 ; [.3737.0020.0002] # BAMUM LETTER KI -A6E6 ; [.3738.0020.0002] # BAMUM LETTER MO -A6E7 ; [.3739.0020.0002] # BAMUM LETTER MBAA -A6E8 ; [.373A.0020.0002] # BAMUM LETTER TET -A6E9 ; [.373B.0020.0002] # BAMUM LETTER KPA -A6EA ; [.373C.0020.0002] # BAMUM LETTER TEN -A6EB ; [.373D.0020.0002] # BAMUM LETTER NTUU -A6EC ; [.373E.0020.0002] # BAMUM LETTER SAMBA -A6ED ; [.373F.0020.0002] # BAMUM LETTER FAAMAE -A6EE ; [.3740.0020.0002] # BAMUM LETTER KOVUU -A6EF ; [.3741.0020.0002] # BAMUM LETTER KOGHOM -16800 ; [.3742.0020.0002] # BAMUM LETTER PHASE-A NGKUE MFON -16801 ; [.3743.0020.0002] # BAMUM LETTER PHASE-A GBIEE FON -16802 ; [.3744.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE -16803 ; [.3745.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMBA -16804 ; [.3746.0020.0002] # BAMUM LETTER PHASE-A NAA MFON -16805 ; [.3747.0020.0002] # BAMUM LETTER PHASE-A SHUENSHUET -16806 ; [.3748.0020.0002] # BAMUM LETTER PHASE-A TITA MFON -16807 ; [.3749.0020.0002] # BAMUM LETTER PHASE-A NZA MFON -16808 ; [.374A.0020.0002] # BAMUM LETTER PHASE-A SHINDA PA NJI -16809 ; [.374B.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE -1680A ; [.374C.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA -1680B ; [.374D.0020.0002] # BAMUM LETTER PHASE-A MAEMBGBIEE -1680C ; [.374E.0020.0002] # BAMUM LETTER PHASE-A TU MAEMBA -1680D ; [.374F.0020.0002] # BAMUM LETTER PHASE-A NGANGU -1680E ; [.3750.0020.0002] # BAMUM LETTER PHASE-A MAEMVEUX -1680F ; [.3751.0020.0002] # BAMUM LETTER PHASE-A MANSUAE -16810 ; [.3752.0020.0002] # BAMUM LETTER PHASE-A MVEUAENGAM -16811 ; [.3753.0020.0002] # BAMUM LETTER PHASE-A SEUNYAM -16812 ; [.3754.0020.0002] # BAMUM LETTER PHASE-A NTOQPEN -16813 ; [.3755.0020.0002] # BAMUM LETTER PHASE-A KEUKEUTNDA -16814 ; [.3756.0020.0002] # BAMUM LETTER PHASE-A NKINDI -16815 ; [.3757.0020.0002] # BAMUM LETTER PHASE-A SUU -16816 ; [.3758.0020.0002] # BAMUM LETTER PHASE-A NGKUENZEUM -16817 ; [.3759.0020.0002] # BAMUM LETTER PHASE-A LAPAQ -16818 ; [.375A.0020.0002] # BAMUM LETTER PHASE-A LET KUT -16819 ; [.375B.0020.0002] # BAMUM LETTER PHASE-A NTAP MFAA -1681A ; [.375C.0020.0002] # BAMUM LETTER PHASE-A MAEKEUP -1681B ; [.375D.0020.0002] # BAMUM LETTER PHASE-A PASHAE -1681C ; [.375E.0020.0002] # BAMUM LETTER PHASE-A GHEUAERAE -1681D ; [.375F.0020.0002] # BAMUM LETTER PHASE-A PAMSHAE -1681E ; [.3760.0020.0002] # BAMUM LETTER PHASE-A MON NGGEUAET -1681F ; [.3761.0020.0002] # BAMUM LETTER PHASE-A NZUN MEUT -16820 ; [.3762.0020.0002] # BAMUM LETTER PHASE-A U YUQ NAE -16821 ; [.3763.0020.0002] # BAMUM LETTER PHASE-A GHEUAEGHEUAE -16822 ; [.3764.0020.0002] # BAMUM LETTER PHASE-A NTAP NTAA -16823 ; [.3765.0020.0002] # BAMUM LETTER PHASE-A SISA -16824 ; [.3766.0020.0002] # BAMUM LETTER PHASE-A MGBASA -16825 ; [.3767.0020.0002] # BAMUM LETTER PHASE-A MEUNJOMNDEUQ -16826 ; [.3768.0020.0002] # BAMUM LETTER PHASE-A MOOMPUQ -16827 ; [.3769.0020.0002] # BAMUM LETTER PHASE-A KAFA -16828 ; [.376A.0020.0002] # BAMUM LETTER PHASE-A PA LEERAEWA -16829 ; [.376B.0020.0002] # BAMUM LETTER PHASE-A NDA LEERAEWA -1682A ; [.376C.0020.0002] # BAMUM LETTER PHASE-A PET -1682B ; [.376D.0020.0002] # BAMUM LETTER PHASE-A MAEMKPEN -1682C ; [.376E.0020.0002] # BAMUM LETTER PHASE-A NIKA -1682D ; [.376F.0020.0002] # BAMUM LETTER PHASE-A PUP -1682E ; [.3770.0020.0002] # BAMUM LETTER PHASE-A TUAEP -1682F ; [.3771.0020.0002] # BAMUM LETTER PHASE-A LUAEP -16830 ; [.3772.0020.0002] # BAMUM LETTER PHASE-A SONJAM -16831 ; [.3773.0020.0002] # BAMUM LETTER PHASE-A TEUTEUWEN -16832 ; [.3774.0020.0002] # BAMUM LETTER PHASE-A MAENYI -16833 ; [.3775.0020.0002] # BAMUM LETTER PHASE-A KET -16834 ; [.3776.0020.0002] # BAMUM LETTER PHASE-A NDAANGGEUAET -16835 ; [.3777.0020.0002] # BAMUM LETTER PHASE-A KUOQ -16836 ; [.3778.0020.0002] # BAMUM LETTER PHASE-A MOOMEUT -16837 ; [.3779.0020.0002] # BAMUM LETTER PHASE-A SHUM -16838 ; [.377A.0020.0002] # BAMUM LETTER PHASE-A LOMMAE -16839 ; [.377B.0020.0002] # BAMUM LETTER PHASE-A FIRI -1683A ; [.377C.0020.0002] # BAMUM LETTER PHASE-A ROM -1683B ; [.377D.0020.0002] # BAMUM LETTER PHASE-A KPOQ -1683C ; [.377E.0020.0002] # BAMUM LETTER PHASE-A SOQ -1683D ; [.377F.0020.0002] # BAMUM LETTER PHASE-A MAP PIEET -1683E ; [.3780.0020.0002] # BAMUM LETTER PHASE-A SHIRAE -1683F ; [.3781.0020.0002] # BAMUM LETTER PHASE-A NTAP -16840 ; [.3782.0020.0002] # BAMUM LETTER PHASE-A SHOQ NSHUT YUM -16841 ; [.3783.0020.0002] # BAMUM LETTER PHASE-A NYIT MONGKEUAEQ -16842 ; [.3784.0020.0002] # BAMUM LETTER PHASE-A PAARAE -16843 ; [.3785.0020.0002] # BAMUM LETTER PHASE-A NKAARAE -16844 ; [.3786.0020.0002] # BAMUM LETTER PHASE-A UNKNOWN -16845 ; [.3787.0020.0002] # BAMUM LETTER PHASE-A NGGEN -16846 ; [.3788.0020.0002] # BAMUM LETTER PHASE-A MAESI -16847 ; [.3789.0020.0002] # BAMUM LETTER PHASE-A NJAM -16848 ; [.378A.0020.0002] # BAMUM LETTER PHASE-A MBANYI -16849 ; [.378B.0020.0002] # BAMUM LETTER PHASE-A NYET -1684A ; [.378C.0020.0002] # BAMUM LETTER PHASE-A TEUAEN -1684B ; [.378D.0020.0002] # BAMUM LETTER PHASE-A SOT -1684C ; [.378E.0020.0002] # BAMUM LETTER PHASE-A PAAM -1684D ; [.378F.0020.0002] # BAMUM LETTER PHASE-A NSHIEE -1684E ; [.3790.0020.0002] # BAMUM LETTER PHASE-A MAEM -1684F ; [.3791.0020.0002] # BAMUM LETTER PHASE-A NYI -16850 ; [.3792.0020.0002] # BAMUM LETTER PHASE-A KAQ -16851 ; [.3793.0020.0002] # BAMUM LETTER PHASE-A NSHA -16852 ; [.3794.0020.0002] # BAMUM LETTER PHASE-A VEE -16853 ; [.3795.0020.0002] # BAMUM LETTER PHASE-A LU -16854 ; [.3796.0020.0002] # BAMUM LETTER PHASE-A NEN -16855 ; [.3797.0020.0002] # BAMUM LETTER PHASE-A NAQ -16856 ; [.3798.0020.0002] # BAMUM LETTER PHASE-A MBAQ -16857 ; [.3799.0020.0002] # BAMUM LETTER PHASE-B NSHUET -16858 ; [.379A.0020.0002] # BAMUM LETTER PHASE-B TU MAEMGBIEE -16859 ; [.379B.0020.0002] # BAMUM LETTER PHASE-B SIEE -1685A ; [.379C.0020.0002] # BAMUM LETTER PHASE-B SET TU -1685B ; [.379D.0020.0002] # BAMUM LETTER PHASE-B LOM NTEUM -1685C ; [.379E.0020.0002] # BAMUM LETTER PHASE-B MBA MAELEE -1685D ; [.379F.0020.0002] # BAMUM LETTER PHASE-B KIEEM -1685E ; [.37A0.0020.0002] # BAMUM LETTER PHASE-B YEURAE -1685F ; [.37A1.0020.0002] # BAMUM LETTER PHASE-B MBAARAE -16860 ; [.37A2.0020.0002] # BAMUM LETTER PHASE-B KAM -16861 ; [.37A3.0020.0002] # BAMUM LETTER PHASE-B PEESHI -16862 ; [.37A4.0020.0002] # BAMUM LETTER PHASE-B YAFU LEERAEWA -16863 ; [.37A5.0020.0002] # BAMUM LETTER PHASE-B LAM NSHUT NYAM -16864 ; [.37A6.0020.0002] # BAMUM LETTER PHASE-B NTIEE SHEUOQ -16865 ; [.37A7.0020.0002] # BAMUM LETTER PHASE-B NDU NJAA -16866 ; [.37A8.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEUAEM -16867 ; [.37A9.0020.0002] # BAMUM LETTER PHASE-B PIT -16868 ; [.37AA.0020.0002] # BAMUM LETTER PHASE-B TU NSIEE -16869 ; [.37AB.0020.0002] # BAMUM LETTER PHASE-B SHET NJAQ -1686A ; [.37AC.0020.0002] # BAMUM LETTER PHASE-B SHEUAEQTU -1686B ; [.37AD.0020.0002] # BAMUM LETTER PHASE-B MFON TEUAEQ -1686C ; [.37AE.0020.0002] # BAMUM LETTER PHASE-B MBIT MBAAKET -1686D ; [.37AF.0020.0002] # BAMUM LETTER PHASE-B NYI NTEUM -1686E ; [.37B0.0020.0002] # BAMUM LETTER PHASE-B KEUPUQ -1686F ; [.37B1.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEN -16870 ; [.37B2.0020.0002] # BAMUM LETTER PHASE-B KEUYEUX -16871 ; [.37B3.0020.0002] # BAMUM LETTER PHASE-B LAANAE -16872 ; [.37B4.0020.0002] # BAMUM LETTER PHASE-B PARUM -16873 ; [.37B5.0020.0002] # BAMUM LETTER PHASE-B VEUM -16874 ; [.37B6.0020.0002] # BAMUM LETTER PHASE-B NGKINDI MVOP -16875 ; [.37B7.0020.0002] # BAMUM LETTER PHASE-B NGGEU MBU -16876 ; [.37B8.0020.0002] # BAMUM LETTER PHASE-B WUAET -16877 ; [.37B9.0020.0002] # BAMUM LETTER PHASE-B SAKEUAE -16878 ; [.37BA.0020.0002] # BAMUM LETTER PHASE-B TAAM -16879 ; [.37BB.0020.0002] # BAMUM LETTER PHASE-B MEUQ -1687A ; [.37BC.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ -1687B ; [.37BD.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ LARGE -1687C ; [.37BE.0020.0002] # BAMUM LETTER PHASE-B MFIYAQ -1687D ; [.37BF.0020.0002] # BAMUM LETTER PHASE-B SUE -1687E ; [.37C0.0020.0002] # BAMUM LETTER PHASE-B MBEURI -1687F ; [.37C1.0020.0002] # BAMUM LETTER PHASE-B MONTIEEN -16880 ; [.37C2.0020.0002] # BAMUM LETTER PHASE-B NYAEMAE -16881 ; [.37C3.0020.0002] # BAMUM LETTER PHASE-B PUNGAAM -16882 ; [.37C4.0020.0002] # BAMUM LETTER PHASE-B MEUT NGGEET -16883 ; [.37C5.0020.0002] # BAMUM LETTER PHASE-B FEUX -16884 ; [.37C6.0020.0002] # BAMUM LETTER PHASE-B MBUOQ -16885 ; [.37C7.0020.0002] # BAMUM LETTER PHASE-B FEE -16886 ; [.37C8.0020.0002] # BAMUM LETTER PHASE-B KEUAEM -16887 ; [.37C9.0020.0002] # BAMUM LETTER PHASE-B MA NJEUAENA -16888 ; [.37CA.0020.0002] # BAMUM LETTER PHASE-B MA NJUQA -16889 ; [.37CB.0020.0002] # BAMUM LETTER PHASE-B LET -1688A ; [.37CC.0020.0002] # BAMUM LETTER PHASE-B NGGAAM -1688B ; [.37CD.0020.0002] # BAMUM LETTER PHASE-B NSEN -1688C ; [.37CE.0020.0002] # BAMUM LETTER PHASE-B MA -1688D ; [.37CF.0020.0002] # BAMUM LETTER PHASE-B KIQ -1688E ; [.37D0.0020.0002] # BAMUM LETTER PHASE-B NGOM -1688F ; [.37D1.0020.0002] # BAMUM LETTER PHASE-C NGKUE MAEMBA -16890 ; [.37D2.0020.0002] # BAMUM LETTER PHASE-C NZA -16891 ; [.37D3.0020.0002] # BAMUM LETTER PHASE-C YUM -16892 ; [.37D4.0020.0002] # BAMUM LETTER PHASE-C WANGKUOQ -16893 ; [.37D5.0020.0002] # BAMUM LETTER PHASE-C NGGEN -16894 ; [.37D6.0020.0002] # BAMUM LETTER PHASE-C NDEUAEREE -16895 ; [.37D7.0020.0002] # BAMUM LETTER PHASE-C NGKAQ -16896 ; [.37D8.0020.0002] # BAMUM LETTER PHASE-C GHARAE -16897 ; [.37D9.0020.0002] # BAMUM LETTER PHASE-C MBEEKEET -16898 ; [.37DA.0020.0002] # BAMUM LETTER PHASE-C GBAYI -16899 ; [.37DB.0020.0002] # BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN -1689A ; [.37DC.0020.0002] # BAMUM LETTER PHASE-C NTU MBIT -1689B ; [.37DD.0020.0002] # BAMUM LETTER PHASE-C MBEUM -1689C ; [.37DE.0020.0002] # BAMUM LETTER PHASE-C PIRIEEN -1689D ; [.37DF.0020.0002] # BAMUM LETTER PHASE-C NDOMBU -1689E ; [.37E0.0020.0002] # BAMUM LETTER PHASE-C MBAA CABBAGE-TREE -1689F ; [.37E1.0020.0002] # BAMUM LETTER PHASE-C KEUSHEUAEP -168A0 ; [.37E2.0020.0002] # BAMUM LETTER PHASE-C GHAP -168A1 ; [.37E3.0020.0002] # BAMUM LETTER PHASE-C KEUKAQ -168A2 ; [.37E4.0020.0002] # BAMUM LETTER PHASE-C YU MUOMAE -168A3 ; [.37E5.0020.0002] # BAMUM LETTER PHASE-C NZEUM -168A4 ; [.37E6.0020.0002] # BAMUM LETTER PHASE-C MBUE -168A5 ; [.37E7.0020.0002] # BAMUM LETTER PHASE-C NSEUAEN -168A6 ; [.37E8.0020.0002] # BAMUM LETTER PHASE-C MBIT -168A7 ; [.37E9.0020.0002] # BAMUM LETTER PHASE-C YEUQ -168A8 ; [.37EA.0020.0002] # BAMUM LETTER PHASE-C KPARAQ -168A9 ; [.37EB.0020.0002] # BAMUM LETTER PHASE-C KAA -168AA ; [.37EC.0020.0002] # BAMUM LETTER PHASE-C SEUX -168AB ; [.37ED.0020.0002] # BAMUM LETTER PHASE-C NDIDA -168AC ; [.37EE.0020.0002] # BAMUM LETTER PHASE-C TAASHAE -168AD ; [.37EF.0020.0002] # BAMUM LETTER PHASE-C NJUEQ -168AE ; [.37F0.0020.0002] # BAMUM LETTER PHASE-C TITA YUE -168AF ; [.37F1.0020.0002] # BAMUM LETTER PHASE-C SUAET -168B0 ; [.37F2.0020.0002] # BAMUM LETTER PHASE-C NGGUAEN NYAM -168B1 ; [.37F3.0020.0002] # BAMUM LETTER PHASE-C VEUX -168B2 ; [.37F4.0020.0002] # BAMUM LETTER PHASE-C NANSANAQ -168B3 ; [.37F5.0020.0002] # BAMUM LETTER PHASE-C MA KEUAERI -168B4 ; [.37F6.0020.0002] # BAMUM LETTER PHASE-C NTAA -168B5 ; [.37F7.0020.0002] # BAMUM LETTER PHASE-C NGGUON -168B6 ; [.37F8.0020.0002] # BAMUM LETTER PHASE-C LAP -168B7 ; [.37F9.0020.0002] # BAMUM LETTER PHASE-C MBIRIEEN -168B8 ; [.37FA.0020.0002] # BAMUM LETTER PHASE-C MGBASAQ -168B9 ; [.37FB.0020.0002] # BAMUM LETTER PHASE-C NTEUNGBA -168BA ; [.37FC.0020.0002] # BAMUM LETTER PHASE-C TEUTEUX -168BB ; [.37FD.0020.0002] # BAMUM LETTER PHASE-C NGGUM -168BC ; [.37FE.0020.0002] # BAMUM LETTER PHASE-C FUE -168BD ; [.37FF.0020.0002] # BAMUM LETTER PHASE-C NDEUT -168BE ; [.3800.0020.0002] # BAMUM LETTER PHASE-C NSA -168BF ; [.3801.0020.0002] # BAMUM LETTER PHASE-C NSHAQ -168C0 ; [.3802.0020.0002] # BAMUM LETTER PHASE-C BUNG -168C1 ; [.3803.0020.0002] # BAMUM LETTER PHASE-C VEUAEPEN -168C2 ; [.3804.0020.0002] # BAMUM LETTER PHASE-C MBERAE -168C3 ; [.3805.0020.0002] # BAMUM LETTER PHASE-C RU -168C4 ; [.3806.0020.0002] # BAMUM LETTER PHASE-C NJAEM -168C5 ; [.3807.0020.0002] # BAMUM LETTER PHASE-C LAM -168C6 ; [.3808.0020.0002] # BAMUM LETTER PHASE-C TITUAEP -168C7 ; [.3809.0020.0002] # BAMUM LETTER PHASE-C NSUOT NGOM -168C8 ; [.380A.0020.0002] # BAMUM LETTER PHASE-C NJEEEE -168C9 ; [.380B.0020.0002] # BAMUM LETTER PHASE-C KET -168CA ; [.380C.0020.0002] # BAMUM LETTER PHASE-C NGGU -168CB ; [.380D.0020.0002] # BAMUM LETTER PHASE-C MAESI -168CC ; [.380E.0020.0002] # BAMUM LETTER PHASE-C MBUAEM -168CD ; [.380F.0020.0002] # BAMUM LETTER PHASE-C LU -168CE ; [.3810.0020.0002] # BAMUM LETTER PHASE-C KUT -168CF ; [.3811.0020.0002] # BAMUM LETTER PHASE-C NJAM -168D0 ; [.3812.0020.0002] # BAMUM LETTER PHASE-C NGOM -168D1 ; [.3813.0020.0002] # BAMUM LETTER PHASE-C WUP -168D2 ; [.3814.0020.0002] # BAMUM LETTER PHASE-C NGGUEET -168D3 ; [.3815.0020.0002] # BAMUM LETTER PHASE-C NSOM -168D4 ; [.3816.0020.0002] # BAMUM LETTER PHASE-C NTEN -168D5 ; [.3817.0020.0002] # BAMUM LETTER PHASE-C KUOP NKAARAE -168D6 ; [.3818.0020.0002] # BAMUM LETTER PHASE-C NSUN -168D7 ; [.3819.0020.0002] # BAMUM LETTER PHASE-C NDAM -168D8 ; [.381A.0020.0002] # BAMUM LETTER PHASE-C MA NSIEE -168D9 ; [.381B.0020.0002] # BAMUM LETTER PHASE-C YAA -168DA ; [.381C.0020.0002] # BAMUM LETTER PHASE-C NDAP -168DB ; [.381D.0020.0002] # BAMUM LETTER PHASE-C SHUEQ -168DC ; [.381E.0020.0002] # BAMUM LETTER PHASE-C SETFON -168DD ; [.381F.0020.0002] # BAMUM LETTER PHASE-C MBI -168DE ; [.3820.0020.0002] # BAMUM LETTER PHASE-C MAEMBA -168DF ; [.3821.0020.0002] # BAMUM LETTER PHASE-C MBANYI -168E0 ; [.3822.0020.0002] # BAMUM LETTER PHASE-C KEUSEUX -168E1 ; [.3823.0020.0002] # BAMUM LETTER PHASE-C MBEUX -168E2 ; [.3824.0020.0002] # BAMUM LETTER PHASE-C KEUM -168E3 ; [.3825.0020.0002] # BAMUM LETTER PHASE-C MBAA PICKET -168E4 ; [.3826.0020.0002] # BAMUM LETTER PHASE-C YUWOQ -168E5 ; [.3827.0020.0002] # BAMUM LETTER PHASE-C NJEUX -168E6 ; [.3828.0020.0002] # BAMUM LETTER PHASE-C MIEE -168E7 ; [.3829.0020.0002] # BAMUM LETTER PHASE-C MUAE -168E8 ; [.382A.0020.0002] # BAMUM LETTER PHASE-C SHIQ -168E9 ; [.382B.0020.0002] # BAMUM LETTER PHASE-C KEN LAW -168EA ; [.382C.0020.0002] # BAMUM LETTER PHASE-C KEN FATIGUE -168EB ; [.382D.0020.0002] # BAMUM LETTER PHASE-C NGAQ -168EC ; [.382E.0020.0002] # BAMUM LETTER PHASE-C NAQ -168ED ; [.382F.0020.0002] # BAMUM LETTER PHASE-C LIQ -168EE ; [.3830.0020.0002] # BAMUM LETTER PHASE-C PIN -168EF ; [.3831.0020.0002] # BAMUM LETTER PHASE-C PEN -168F0 ; [.3832.0020.0002] # BAMUM LETTER PHASE-C TET -168F1 ; [.3833.0020.0002] # BAMUM LETTER PHASE-D MBUO -168F2 ; [.3834.0020.0002] # BAMUM LETTER PHASE-D WAP -168F3 ; [.3835.0020.0002] # BAMUM LETTER PHASE-D NJI -168F4 ; [.3836.0020.0002] # BAMUM LETTER PHASE-D MFON -168F5 ; [.3837.0020.0002] # BAMUM LETTER PHASE-D NJIEE -168F6 ; [.3838.0020.0002] # BAMUM LETTER PHASE-D LIEE -168F7 ; [.3839.0020.0002] # BAMUM LETTER PHASE-D NJEUT -168F8 ; [.383A.0020.0002] # BAMUM LETTER PHASE-D NSHEE -168F9 ; [.383B.0020.0002] # BAMUM LETTER PHASE-D NGGAAMAE -168FA ; [.383C.0020.0002] # BAMUM LETTER PHASE-D NYAM -168FB ; [.383D.0020.0002] # BAMUM LETTER PHASE-D WUAEN -168FC ; [.383E.0020.0002] # BAMUM LETTER PHASE-D NGKUN -168FD ; [.383F.0020.0002] # BAMUM LETTER PHASE-D SHEE -168FE ; [.3840.0020.0002] # BAMUM LETTER PHASE-D NGKAP -168FF ; [.3841.0020.0002] # BAMUM LETTER PHASE-D KEUAETMEUN -16900 ; [.3842.0020.0002] # BAMUM LETTER PHASE-D TEUT -16901 ; [.3843.0020.0002] # BAMUM LETTER PHASE-D SHEUAE -16902 ; [.3844.0020.0002] # BAMUM LETTER PHASE-D NJAP -16903 ; [.3845.0020.0002] # BAMUM LETTER PHASE-D SUE -16904 ; [.3846.0020.0002] # BAMUM LETTER PHASE-D KET -16905 ; [.3847.0020.0002] # BAMUM LETTER PHASE-D YAEMMAE -16906 ; [.3848.0020.0002] # BAMUM LETTER PHASE-D KUOM -16907 ; [.3849.0020.0002] # BAMUM LETTER PHASE-D SAP -16908 ; [.384A.0020.0002] # BAMUM LETTER PHASE-D MFEUT -16909 ; [.384B.0020.0002] # BAMUM LETTER PHASE-D NDEUX -1690A ; [.384C.0020.0002] # BAMUM LETTER PHASE-D MALEERI -1690B ; [.384D.0020.0002] # BAMUM LETTER PHASE-D MEUT -1690C ; [.384E.0020.0002] # BAMUM LETTER PHASE-D SEUAEQ -1690D ; [.384F.0020.0002] # BAMUM LETTER PHASE-D YEN -1690E ; [.3850.0020.0002] # BAMUM LETTER PHASE-D NJEUAEM -1690F ; [.3851.0020.0002] # BAMUM LETTER PHASE-D KEUOT MBUAE -16910 ; [.3852.0020.0002] # BAMUM LETTER PHASE-D NGKEURI -16911 ; [.3853.0020.0002] # BAMUM LETTER PHASE-D TU -16912 ; [.3854.0020.0002] # BAMUM LETTER PHASE-D GHAA -16913 ; [.3855.0020.0002] # BAMUM LETTER PHASE-D NGKYEE -16914 ; [.3856.0020.0002] # BAMUM LETTER PHASE-D FEUFEUAET -16915 ; [.3857.0020.0002] # BAMUM LETTER PHASE-D NDEE -16916 ; [.3858.0020.0002] # BAMUM LETTER PHASE-D MGBOFUM -16917 ; [.3859.0020.0002] # BAMUM LETTER PHASE-D LEUAEP -16918 ; [.385A.0020.0002] # BAMUM LETTER PHASE-D NDON -16919 ; [.385B.0020.0002] # BAMUM LETTER PHASE-D MONI -1691A ; [.385C.0020.0002] # BAMUM LETTER PHASE-D MGBEUN -1691B ; [.385D.0020.0002] # BAMUM LETTER PHASE-D PUUT -1691C ; [.385E.0020.0002] # BAMUM LETTER PHASE-D MGBIEE -1691D ; [.385F.0020.0002] # BAMUM LETTER PHASE-D MFO -1691E ; [.3860.0020.0002] # BAMUM LETTER PHASE-D LUM -1691F ; [.3861.0020.0002] # BAMUM LETTER PHASE-D NSIEEP -16920 ; [.3862.0020.0002] # BAMUM LETTER PHASE-D MBAA -16921 ; [.3863.0020.0002] # BAMUM LETTER PHASE-D KWAET -16922 ; [.3864.0020.0002] # BAMUM LETTER PHASE-D NYET -16923 ; [.3865.0020.0002] # BAMUM LETTER PHASE-D TEUAEN -16924 ; [.3866.0020.0002] # BAMUM LETTER PHASE-D SOT -16925 ; [.3867.0020.0002] # BAMUM LETTER PHASE-D YUWOQ -16926 ; [.3868.0020.0002] # BAMUM LETTER PHASE-D KEUM -16927 ; [.3869.0020.0002] # BAMUM LETTER PHASE-D RAEM -16928 ; [.386A.0020.0002] # BAMUM LETTER PHASE-D TEEEE -16929 ; [.386B.0020.0002] # BAMUM LETTER PHASE-D NGKEUAEQ -1692A ; [.386C.0020.0002] # BAMUM LETTER PHASE-D MFEUAE -1692B ; [.386D.0020.0002] # BAMUM LETTER PHASE-D NSIEET -1692C ; [.386E.0020.0002] # BAMUM LETTER PHASE-D KEUP -1692D ; [.386F.0020.0002] # BAMUM LETTER PHASE-D PIP -1692E ; [.3870.0020.0002] # BAMUM LETTER PHASE-D PEUTAE -1692F ; [.3871.0020.0002] # BAMUM LETTER PHASE-D NYUE -16930 ; [.3872.0020.0002] # BAMUM LETTER PHASE-D LET -16931 ; [.3873.0020.0002] # BAMUM LETTER PHASE-D NGGAAM -16932 ; [.3874.0020.0002] # BAMUM LETTER PHASE-D MFIEE -16933 ; [.3875.0020.0002] # BAMUM LETTER PHASE-D NGGWAEN -16934 ; [.3876.0020.0002] # BAMUM LETTER PHASE-D YUOM -16935 ; [.3877.0020.0002] # BAMUM LETTER PHASE-D PAP -16936 ; [.3878.0020.0002] # BAMUM LETTER PHASE-D YUOP -16937 ; [.3879.0020.0002] # BAMUM LETTER PHASE-D NDAM -16938 ; [.387A.0020.0002] # BAMUM LETTER PHASE-D NTEUM -16939 ; [.387B.0020.0002] # BAMUM LETTER PHASE-D SUAE -1693A ; [.387C.0020.0002] # BAMUM LETTER PHASE-D KUN -1693B ; [.387D.0020.0002] # BAMUM LETTER PHASE-D NGGEUX -1693C ; [.387E.0020.0002] # BAMUM LETTER PHASE-D NGKIEE -1693D ; [.387F.0020.0002] # BAMUM LETTER PHASE-D TUOT -1693E ; [.3880.0020.0002] # BAMUM LETTER PHASE-D MEUN -1693F ; [.3881.0020.0002] # BAMUM LETTER PHASE-D KUQ -16940 ; [.3882.0020.0002] # BAMUM LETTER PHASE-D NSUM -16941 ; [.3883.0020.0002] # BAMUM LETTER PHASE-D TEUN -16942 ; [.3884.0020.0002] # BAMUM LETTER PHASE-D MAENJET -16943 ; [.3885.0020.0002] # BAMUM LETTER PHASE-D NGGAP -16944 ; [.3886.0020.0002] # BAMUM LETTER PHASE-D LEUM -16945 ; [.3887.0020.0002] # BAMUM LETTER PHASE-D NGGUOM -16946 ; [.3888.0020.0002] # BAMUM LETTER PHASE-D NSHUT -16947 ; [.3889.0020.0002] # BAMUM LETTER PHASE-D NJUEQ -16948 ; [.388A.0020.0002] # BAMUM LETTER PHASE-D GHEUAE -16949 ; [.388B.0020.0002] # BAMUM LETTER PHASE-D KU -1694A ; [.388C.0020.0002] # BAMUM LETTER PHASE-D REN OLD -1694B ; [.388D.0020.0002] # BAMUM LETTER PHASE-D TAE -1694C ; [.388E.0020.0002] # BAMUM LETTER PHASE-D TOQ -1694D ; [.388F.0020.0002] # BAMUM LETTER PHASE-D NYI -1694E ; [.3890.0020.0002] # BAMUM LETTER PHASE-D RII -1694F ; [.3891.0020.0002] # BAMUM LETTER PHASE-D LEEEE -16950 ; [.3892.0020.0002] # BAMUM LETTER PHASE-D MEEEE -16951 ; [.3893.0020.0002] # BAMUM LETTER PHASE-D M -16952 ; [.3894.0020.0002] # BAMUM LETTER PHASE-D SUU -16953 ; [.3895.0020.0002] # BAMUM LETTER PHASE-D MU -16954 ; [.3896.0020.0002] # BAMUM LETTER PHASE-D SHII -16955 ; [.3897.0020.0002] # BAMUM LETTER PHASE-D SHEUX -16956 ; [.3898.0020.0002] # BAMUM LETTER PHASE-D KYEE -16957 ; [.3899.0020.0002] # BAMUM LETTER PHASE-D NU -16958 ; [.389A.0020.0002] # BAMUM LETTER PHASE-D SHU -16959 ; [.389B.0020.0002] # BAMUM LETTER PHASE-D NTEE -1695A ; [.389C.0020.0002] # BAMUM LETTER PHASE-D PEE -1695B ; [.389D.0020.0002] # BAMUM LETTER PHASE-D NI -1695C ; [.389E.0020.0002] # BAMUM LETTER PHASE-D SHOQ -1695D ; [.389F.0020.0002] # BAMUM LETTER PHASE-D PUQ -1695E ; [.38A0.0020.0002] # BAMUM LETTER PHASE-D MVOP -1695F ; [.38A1.0020.0002] # BAMUM LETTER PHASE-D LOQ -16960 ; [.38A2.0020.0002] # BAMUM LETTER PHASE-D REN MUCH -16961 ; [.38A3.0020.0002] # BAMUM LETTER PHASE-D TI -16962 ; [.38A4.0020.0002] # BAMUM LETTER PHASE-D NTUU -16963 ; [.38A5.0020.0002] # BAMUM LETTER PHASE-D MBAA SEVEN -16964 ; [.38A6.0020.0002] # BAMUM LETTER PHASE-D SAQ -16965 ; [.38A7.0020.0002] # BAMUM LETTER PHASE-D FAA -16966 ; [.38A8.0020.0002] # BAMUM LETTER PHASE-E NDAP -16967 ; [.38A9.0020.0002] # BAMUM LETTER PHASE-E TOON -16968 ; [.38AA.0020.0002] # BAMUM LETTER PHASE-E MBEUM -16969 ; [.38AB.0020.0002] # BAMUM LETTER PHASE-E LAP -1696A ; [.38AC.0020.0002] # BAMUM LETTER PHASE-E VOM -1696B ; [.38AD.0020.0002] # BAMUM LETTER PHASE-E LOON -1696C ; [.38AE.0020.0002] # BAMUM LETTER PHASE-E PAA -1696D ; [.38AF.0020.0002] # BAMUM LETTER PHASE-E SOM -1696E ; [.38B0.0020.0002] # BAMUM LETTER PHASE-E RAQ -1696F ; [.38B1.0020.0002] # BAMUM LETTER PHASE-E NSHUOP -16970 ; [.38B2.0020.0002] # BAMUM LETTER PHASE-E NDUN -16971 ; [.38B3.0020.0002] # BAMUM LETTER PHASE-E PUAE -16972 ; [.38B4.0020.0002] # BAMUM LETTER PHASE-E TAM -16973 ; [.38B5.0020.0002] # BAMUM LETTER PHASE-E NGKA -16974 ; [.38B6.0020.0002] # BAMUM LETTER PHASE-E KPEUX -16975 ; [.38B7.0020.0002] # BAMUM LETTER PHASE-E WUO -16976 ; [.38B8.0020.0002] # BAMUM LETTER PHASE-E SEE -16977 ; [.38B9.0020.0002] # BAMUM LETTER PHASE-E NGGEUAET -16978 ; [.38BA.0020.0002] # BAMUM LETTER PHASE-E PAAM -16979 ; [.38BB.0020.0002] # BAMUM LETTER PHASE-E TOO -1697A ; [.38BC.0020.0002] # BAMUM LETTER PHASE-E KUOP -1697B ; [.38BD.0020.0002] # BAMUM LETTER PHASE-E LOM -1697C ; [.38BE.0020.0002] # BAMUM LETTER PHASE-E NSHIEE -1697D ; [.38BF.0020.0002] # BAMUM LETTER PHASE-E NGOP -1697E ; [.38C0.0020.0002] # BAMUM LETTER PHASE-E MAEM -1697F ; [.38C1.0020.0002] # BAMUM LETTER PHASE-E NGKEUX -16980 ; [.38C2.0020.0002] # BAMUM LETTER PHASE-E NGOQ -16981 ; [.38C3.0020.0002] # BAMUM LETTER PHASE-E NSHUE -16982 ; [.38C4.0020.0002] # BAMUM LETTER PHASE-E RIMGBA -16983 ; [.38C5.0020.0002] # BAMUM LETTER PHASE-E NJEUX -16984 ; [.38C6.0020.0002] # BAMUM LETTER PHASE-E PEEM -16985 ; [.38C7.0020.0002] # BAMUM LETTER PHASE-E SAA -16986 ; [.38C8.0020.0002] # BAMUM LETTER PHASE-E NGGURAE -16987 ; [.38C9.0020.0002] # BAMUM LETTER PHASE-E MGBA -16988 ; [.38CA.0020.0002] # BAMUM LETTER PHASE-E GHEUX -16989 ; [.38CB.0020.0002] # BAMUM LETTER PHASE-E NGKEUAEM -1698A ; [.38CC.0020.0002] # BAMUM LETTER PHASE-E NJAEMLI -1698B ; [.38CD.0020.0002] # BAMUM LETTER PHASE-E MAP -1698C ; [.38CE.0020.0002] # BAMUM LETTER PHASE-E LOOT -1698D ; [.38CF.0020.0002] # BAMUM LETTER PHASE-E NGGEEEE -1698E ; [.38D0.0020.0002] # BAMUM LETTER PHASE-E NDIQ -1698F ; [.38D1.0020.0002] # BAMUM LETTER PHASE-E TAEN NTEUM -16990 ; [.38D2.0020.0002] # BAMUM LETTER PHASE-E SET -16991 ; [.38D3.0020.0002] # BAMUM LETTER PHASE-E PUM -16992 ; [.38D4.0020.0002] # BAMUM LETTER PHASE-E NDAA SOFTNESS -16993 ; [.38D5.0020.0002] # BAMUM LETTER PHASE-E NGGUAESHAE NYAM -16994 ; [.38D6.0020.0002] # BAMUM LETTER PHASE-E YIEE -16995 ; [.38D7.0020.0002] # BAMUM LETTER PHASE-E GHEUN -16996 ; [.38D8.0020.0002] # BAMUM LETTER PHASE-E TUAE -16997 ; [.38D9.0020.0002] # BAMUM LETTER PHASE-E YEUAE -16998 ; [.38DA.0020.0002] # BAMUM LETTER PHASE-E PO -16999 ; [.38DB.0020.0002] # BAMUM LETTER PHASE-E TUMAE -1699A ; [.38DC.0020.0002] # BAMUM LETTER PHASE-E KEUAE -1699B ; [.38DD.0020.0002] # BAMUM LETTER PHASE-E SUAEN -1699C ; [.38DE.0020.0002] # BAMUM LETTER PHASE-E TEUAEQ -1699D ; [.38DF.0020.0002] # BAMUM LETTER PHASE-E VEUAE -1699E ; [.38E0.0020.0002] # BAMUM LETTER PHASE-E WEUX -1699F ; [.38E1.0020.0002] # BAMUM LETTER PHASE-E LAAM -169A0 ; [.38E2.0020.0002] # BAMUM LETTER PHASE-E PU -169A1 ; [.38E3.0020.0002] # BAMUM LETTER PHASE-E TAAQ -169A2 ; [.38E4.0020.0002] # BAMUM LETTER PHASE-E GHAAMAE -169A3 ; [.38E5.0020.0002] # BAMUM LETTER PHASE-E NGEUREUT -169A4 ; [.38E6.0020.0002] # BAMUM LETTER PHASE-E SHEUAEQ -169A5 ; [.38E7.0020.0002] # BAMUM LETTER PHASE-E MGBEN -169A6 ; [.38E8.0020.0002] # BAMUM LETTER PHASE-E MBEE -169A7 ; [.38E9.0020.0002] # BAMUM LETTER PHASE-E NZAQ -169A8 ; [.38EA.0020.0002] # BAMUM LETTER PHASE-E NKOM -169A9 ; [.38EB.0020.0002] # BAMUM LETTER PHASE-E GBET -169AA ; [.38EC.0020.0002] # BAMUM LETTER PHASE-E TUM -169AB ; [.38ED.0020.0002] # BAMUM LETTER PHASE-E KUET -169AC ; [.38EE.0020.0002] # BAMUM LETTER PHASE-E YAP -169AD ; [.38EF.0020.0002] # BAMUM LETTER PHASE-E NYI CLEAVER -169AE ; [.38F0.0020.0002] # BAMUM LETTER PHASE-E YIT -169AF ; [.38F1.0020.0002] # BAMUM LETTER PHASE-E MFEUQ -169B0 ; [.38F2.0020.0002] # BAMUM LETTER PHASE-E NDIAQ -169B1 ; [.38F3.0020.0002] # BAMUM LETTER PHASE-E PIEEQ -169B2 ; [.38F4.0020.0002] # BAMUM LETTER PHASE-E YUEQ -169B3 ; [.38F5.0020.0002] # BAMUM LETTER PHASE-E LEUAEM -169B4 ; [.38F6.0020.0002] # BAMUM LETTER PHASE-E FUE -169B5 ; [.38F7.0020.0002] # BAMUM LETTER PHASE-E GBEUX -169B6 ; [.38F8.0020.0002] # BAMUM LETTER PHASE-E NGKUP -169B7 ; [.38F9.0020.0002] # BAMUM LETTER PHASE-E KET -169B8 ; [.38FA.0020.0002] # BAMUM LETTER PHASE-E MAE -169B9 ; [.38FB.0020.0002] # BAMUM LETTER PHASE-E NGKAAMI -169BA ; [.38FC.0020.0002] # BAMUM LETTER PHASE-E GHET -169BB ; [.38FD.0020.0002] # BAMUM LETTER PHASE-E FA -169BC ; [.38FE.0020.0002] # BAMUM LETTER PHASE-E NTUM -169BD ; [.38FF.0020.0002] # BAMUM LETTER PHASE-E PEUT -169BE ; [.3900.0020.0002] # BAMUM LETTER PHASE-E YEUM -169BF ; [.3901.0020.0002] # BAMUM LETTER PHASE-E NGGEUAE -169C0 ; [.3902.0020.0002] # BAMUM LETTER PHASE-E NYI BETWEEN -169C1 ; [.3903.0020.0002] # BAMUM LETTER PHASE-E NZUQ -169C2 ; [.3904.0020.0002] # BAMUM LETTER PHASE-E POON -169C3 ; [.3905.0020.0002] # BAMUM LETTER PHASE-E MIEE -169C4 ; [.3906.0020.0002] # BAMUM LETTER PHASE-E FUET -169C5 ; [.3907.0020.0002] # BAMUM LETTER PHASE-E NAE -169C6 ; [.3908.0020.0002] # BAMUM LETTER PHASE-E MUAE -169C7 ; [.3909.0020.0002] # BAMUM LETTER PHASE-E GHEUAE -169C8 ; [.390A.0020.0002] # BAMUM LETTER PHASE-E FU I -169C9 ; [.390B.0020.0002] # BAMUM LETTER PHASE-E MVI -169CA ; [.390C.0020.0002] # BAMUM LETTER PHASE-E PUAQ -169CB ; [.390D.0020.0002] # BAMUM LETTER PHASE-E NGKUM -169CC ; [.390E.0020.0002] # BAMUM LETTER PHASE-E KUT -169CD ; [.390F.0020.0002] # BAMUM LETTER PHASE-E PIET -169CE ; [.3910.0020.0002] # BAMUM LETTER PHASE-E NTAP -169CF ; [.3911.0020.0002] # BAMUM LETTER PHASE-E YEUAET -169D0 ; [.3912.0020.0002] # BAMUM LETTER PHASE-E NGGUP -169D1 ; [.3913.0020.0002] # BAMUM LETTER PHASE-E PA PEOPLE -169D2 ; [.3914.0020.0002] # BAMUM LETTER PHASE-E FU CALL -169D3 ; [.3915.0020.0002] # BAMUM LETTER PHASE-E FOM -169D4 ; [.3916.0020.0002] # BAMUM LETTER PHASE-E NJEE -169D5 ; [.3917.0020.0002] # BAMUM LETTER PHASE-E A -169D6 ; [.3918.0020.0002] # BAMUM LETTER PHASE-E TOQ -169D7 ; [.3919.0020.0002] # BAMUM LETTER PHASE-E O -169D8 ; [.391A.0020.0002] # BAMUM LETTER PHASE-E I -169D9 ; [.391B.0020.0002] # BAMUM LETTER PHASE-E LAQ -169DA ; [.391C.0020.0002] # BAMUM LETTER PHASE-E PA PLURAL -169DB ; [.391D.0020.0002] # BAMUM LETTER PHASE-E TAA -169DC ; [.391E.0020.0002] # BAMUM LETTER PHASE-E TAQ -169DD ; [.391F.0020.0002] # BAMUM LETTER PHASE-E NDAA MY HOUSE -169DE ; [.3920.0020.0002] # BAMUM LETTER PHASE-E SHIQ -169DF ; [.3921.0020.0002] # BAMUM LETTER PHASE-E YEUX -169E0 ; [.3922.0020.0002] # BAMUM LETTER PHASE-E NGUAE -169E1 ; [.3923.0020.0002] # BAMUM LETTER PHASE-E YUAEN -169E2 ; [.3924.0020.0002] # BAMUM LETTER PHASE-E YOQ SWIMMING -169E3 ; [.3925.0020.0002] # BAMUM LETTER PHASE-E YOQ COVER -169E4 ; [.3926.0020.0002] # BAMUM LETTER PHASE-E YUQ -169E5 ; [.3927.0020.0002] # BAMUM LETTER PHASE-E YUN -169E6 ; [.3928.0020.0002] # BAMUM LETTER PHASE-E KEUX -169E7 ; [.3929.0020.0002] # BAMUM LETTER PHASE-E PEUX -169E8 ; [.392A.0020.0002] # BAMUM LETTER PHASE-E NJEE EPOCH -169E9 ; [.392B.0020.0002] # BAMUM LETTER PHASE-E PUE -169EA ; [.392C.0020.0002] # BAMUM LETTER PHASE-E WUE -169EB ; [.392D.0020.0002] # BAMUM LETTER PHASE-E FEE -169EC ; [.392E.0020.0002] # BAMUM LETTER PHASE-E VEE -169ED ; [.392F.0020.0002] # BAMUM LETTER PHASE-E LU -169EE ; [.3930.0020.0002] # BAMUM LETTER PHASE-E MI -169EF ; [.3931.0020.0002] # BAMUM LETTER PHASE-E REUX -169F0 ; [.3932.0020.0002] # BAMUM LETTER PHASE-E RAE -169F1 ; [.3933.0020.0002] # BAMUM LETTER PHASE-E NGUAET -169F2 ; [.3934.0020.0002] # BAMUM LETTER PHASE-E NGA -169F3 ; [.3935.0020.0002] # BAMUM LETTER PHASE-E SHO -169F4 ; [.3936.0020.0002] # BAMUM LETTER PHASE-E SHOQ -169F5 ; [.3937.0020.0002] # BAMUM LETTER PHASE-E FU REMEDY -169F6 ; [.3938.0020.0002] # BAMUM LETTER PHASE-E NA -169F7 ; [.3939.0020.0002] # BAMUM LETTER PHASE-E PI -169F8 ; [.393A.0020.0002] # BAMUM LETTER PHASE-E LOQ -169F9 ; [.393B.0020.0002] # BAMUM LETTER PHASE-E KO -169FA ; [.393C.0020.0002] # BAMUM LETTER PHASE-E MEN -169FB ; [.393D.0020.0002] # BAMUM LETTER PHASE-E MA -169FC ; [.393E.0020.0002] # BAMUM LETTER PHASE-E MAQ -169FD ; [.393F.0020.0002] # BAMUM LETTER PHASE-E TEU -169FE ; [.3940.0020.0002] # BAMUM LETTER PHASE-E KI -169FF ; [.3941.0020.0002] # BAMUM LETTER PHASE-E MON -16A00 ; [.3942.0020.0002] # BAMUM LETTER PHASE-E TEN -16A01 ; [.3943.0020.0002] # BAMUM LETTER PHASE-E FAQ -16A02 ; [.3944.0020.0002] # BAMUM LETTER PHASE-E GHOM -16A03 ; [.3945.0020.0002] # BAMUM LETTER PHASE-F KA -16A04 ; [.3946.0020.0002] # BAMUM LETTER PHASE-F U -16A05 ; [.3947.0020.0002] # BAMUM LETTER PHASE-F KU -16A06 ; [.3948.0020.0002] # BAMUM LETTER PHASE-F EE -16A07 ; [.3949.0020.0002] # BAMUM LETTER PHASE-F REE -16A08 ; [.394A.0020.0002] # BAMUM LETTER PHASE-F TAE -16A09 ; [.394B.0020.0002] # BAMUM LETTER PHASE-F NYI -16A0A ; [.394C.0020.0002] # BAMUM LETTER PHASE-F LA -16A0B ; [.394D.0020.0002] # BAMUM LETTER PHASE-F RII -16A0C ; [.394E.0020.0002] # BAMUM LETTER PHASE-F RIEE -16A0D ; [.394F.0020.0002] # BAMUM LETTER PHASE-F MEEEE -16A0E ; [.3950.0020.0002] # BAMUM LETTER PHASE-F TAA -16A0F ; [.3951.0020.0002] # BAMUM LETTER PHASE-F NDAA -16A10 ; [.3952.0020.0002] # BAMUM LETTER PHASE-F NJAEM -16A11 ; [.3953.0020.0002] # BAMUM LETTER PHASE-F M -16A12 ; [.3954.0020.0002] # BAMUM LETTER PHASE-F SUU -16A13 ; [.3955.0020.0002] # BAMUM LETTER PHASE-F SHII -16A14 ; [.3956.0020.0002] # BAMUM LETTER PHASE-F SI -16A15 ; [.3957.0020.0002] # BAMUM LETTER PHASE-F SEUX -16A16 ; [.3958.0020.0002] # BAMUM LETTER PHASE-F KYEE -16A17 ; [.3959.0020.0002] # BAMUM LETTER PHASE-F KET -16A18 ; [.395A.0020.0002] # BAMUM LETTER PHASE-F NUAE -16A19 ; [.395B.0020.0002] # BAMUM LETTER PHASE-F NU -16A1A ; [.395C.0020.0002] # BAMUM LETTER PHASE-F NJUAE -16A1B ; [.395D.0020.0002] # BAMUM LETTER PHASE-F YOQ -16A1C ; [.395E.0020.0002] # BAMUM LETTER PHASE-F SHU -16A1D ; [.395F.0020.0002] # BAMUM LETTER PHASE-F YA -16A1E ; [.3960.0020.0002] # BAMUM LETTER PHASE-F NSHA -16A1F ; [.3961.0020.0002] # BAMUM LETTER PHASE-F PEUX -16A20 ; [.3962.0020.0002] # BAMUM LETTER PHASE-F NTEE -16A21 ; [.3963.0020.0002] # BAMUM LETTER PHASE-F WUE -16A22 ; [.3964.0020.0002] # BAMUM LETTER PHASE-F PEE -16A23 ; [.3965.0020.0002] # BAMUM LETTER PHASE-F RU -16A24 ; [.3966.0020.0002] # BAMUM LETTER PHASE-F NI -16A25 ; [.3967.0020.0002] # BAMUM LETTER PHASE-F REUX -16A26 ; [.3968.0020.0002] # BAMUM LETTER PHASE-F KEN -16A27 ; [.3969.0020.0002] # BAMUM LETTER PHASE-F NGKWAEN -16A28 ; [.396A.0020.0002] # BAMUM LETTER PHASE-F NGGA -16A29 ; [.396B.0020.0002] # BAMUM LETTER PHASE-F SHO -16A2A ; [.396C.0020.0002] # BAMUM LETTER PHASE-F PUAE -16A2B ; [.396D.0020.0002] # BAMUM LETTER PHASE-F FOM -16A2C ; [.396E.0020.0002] # BAMUM LETTER PHASE-F WA -16A2D ; [.396F.0020.0002] # BAMUM LETTER PHASE-F LI -16A2E ; [.3970.0020.0002] # BAMUM LETTER PHASE-F LOQ -16A2F ; [.3971.0020.0002] # BAMUM LETTER PHASE-F KO -16A30 ; [.3972.0020.0002] # BAMUM LETTER PHASE-F MBEN -16A31 ; [.3973.0020.0002] # BAMUM LETTER PHASE-F REN -16A32 ; [.3974.0020.0002] # BAMUM LETTER PHASE-F MA -16A33 ; [.3975.0020.0002] # BAMUM LETTER PHASE-F MO -16A34 ; [.3976.0020.0002] # BAMUM LETTER PHASE-F MBAA -16A35 ; [.3977.0020.0002] # BAMUM LETTER PHASE-F TET -16A36 ; [.3978.0020.0002] # BAMUM LETTER PHASE-F KPA -16A37 ; [.3979.0020.0002] # BAMUM LETTER PHASE-F SAMBA -16A38 ; [.397A.0020.0002] # BAMUM LETTER PHASE-F VUEQ -16AD0 ; [.397B.0020.0002] # BASSA VAH LETTER ENNI -16AD1 ; [.397C.0020.0002] # BASSA VAH LETTER KA -16AD2 ; [.397D.0020.0002] # BASSA VAH LETTER SE -16AD3 ; [.397E.0020.0002] # BASSA VAH LETTER FA -16AD4 ; [.397F.0020.0002] # BASSA VAH LETTER MBE -16AD5 ; [.3980.0020.0002] # BASSA VAH LETTER YIE -16AD6 ; [.3981.0020.0002] # BASSA VAH LETTER GAH -16AD7 ; [.3982.0020.0002] # BASSA VAH LETTER DHII -16AD8 ; [.3983.0020.0002] # BASSA VAH LETTER KPAH -16AD9 ; [.3984.0020.0002] # BASSA VAH LETTER JO -16ADA ; [.3985.0020.0002] # BASSA VAH LETTER HWAH -16ADB ; [.3986.0020.0002] # BASSA VAH LETTER WA -16ADC ; [.3987.0020.0002] # BASSA VAH LETTER ZO -16ADD ; [.3988.0020.0002] # BASSA VAH LETTER GBU -16ADE ; [.3989.0020.0002] # BASSA VAH LETTER DO -16ADF ; [.398A.0020.0002] # BASSA VAH LETTER CE -16AE0 ; [.398B.0020.0002] # BASSA VAH LETTER UWU -16AE1 ; [.398C.0020.0002] # BASSA VAH LETTER TO -16AE2 ; [.398D.0020.0002] # BASSA VAH LETTER BA -16AE3 ; [.398E.0020.0002] # BASSA VAH LETTER VU -16AE4 ; [.398F.0020.0002] # BASSA VAH LETTER YEIN -16AE5 ; [.3990.0020.0002] # BASSA VAH LETTER PA -16AE6 ; [.3991.0020.0002] # BASSA VAH LETTER WADDA -16AE7 ; [.3992.0020.0002] # BASSA VAH LETTER A -16AE8 ; [.3993.0020.0002] # BASSA VAH LETTER O -16AE9 ; [.3994.0020.0002] # BASSA VAH LETTER OO -16AEA ; [.3995.0020.0002] # BASSA VAH LETTER U -16AEB ; [.3996.0020.0002] # BASSA VAH LETTER EE -16AEC ; [.3997.0020.0002] # BASSA VAH LETTER E -16AED ; [.3998.0020.0002] # BASSA VAH LETTER I -1E800 ; [.3999.0020.0002] # MENDE KIKAKUI SYLLABLE M001 KI -1E801 ; [.399A.0020.0002] # MENDE KIKAKUI SYLLABLE M002 KA -1E802 ; [.399B.0020.0002] # MENDE KIKAKUI SYLLABLE M003 KU -1E803 ; [.399C.0020.0002] # MENDE KIKAKUI SYLLABLE M065 KEE -1E804 ; [.399D.0020.0002] # MENDE KIKAKUI SYLLABLE M095 KE -1E805 ; [.399E.0020.0002] # MENDE KIKAKUI SYLLABLE M076 KOO -1E806 ; [.399F.0020.0002] # MENDE KIKAKUI SYLLABLE M048 KO -1E807 ; [.39A0.0020.0002] # MENDE KIKAKUI SYLLABLE M179 KUA -1E808 ; [.39A1.0020.0002] # MENDE KIKAKUI SYLLABLE M004 WI -1E809 ; [.39A2.0020.0002] # MENDE KIKAKUI SYLLABLE M005 WA -1E80A ; [.39A3.0020.0002] # MENDE KIKAKUI SYLLABLE M006 WU -1E80B ; [.39A4.0020.0002] # MENDE KIKAKUI SYLLABLE M126 WEE -1E80C ; [.39A5.0020.0002] # MENDE KIKAKUI SYLLABLE M118 WE -1E80D ; [.39A6.0020.0002] # MENDE KIKAKUI SYLLABLE M114 WOO -1E80E ; [.39A7.0020.0002] # MENDE KIKAKUI SYLLABLE M045 WO -1E80F ; [.39A8.0020.0002] # MENDE KIKAKUI SYLLABLE M194 WUI -1E810 ; [.39A9.0020.0002] # MENDE KIKAKUI SYLLABLE M143 WEI -1E811 ; [.39AA.0020.0002] # MENDE KIKAKUI SYLLABLE M061 WVI -1E812 ; [.39AB.0020.0002] # MENDE KIKAKUI SYLLABLE M049 WVA -1E813 ; [.39AC.0020.0002] # MENDE KIKAKUI SYLLABLE M139 WVE -1E814 ; [.39AD.0020.0002] # MENDE KIKAKUI SYLLABLE M007 MIN -1E815 ; [.39AE.0020.0002] # MENDE KIKAKUI SYLLABLE M008 MAN -1E816 ; [.39AF.0020.0002] # MENDE KIKAKUI SYLLABLE M009 MUN -1E817 ; [.39B0.0020.0002] # MENDE KIKAKUI SYLLABLE M059 MEN -1E818 ; [.39B1.0020.0002] # MENDE KIKAKUI SYLLABLE M094 MON -1E819 ; [.39B2.0020.0002] # MENDE KIKAKUI SYLLABLE M154 MUAN -1E81A ; [.39B3.0020.0002] # MENDE KIKAKUI SYLLABLE M189 MUEN -1E81B ; [.39B4.0020.0002] # MENDE KIKAKUI SYLLABLE M010 BI -1E81C ; [.39B5.0020.0002] # MENDE KIKAKUI SYLLABLE M011 BA -1E81D ; [.39B6.0020.0002] # MENDE KIKAKUI SYLLABLE M012 BU -1E81E ; [.39B7.0020.0002] # MENDE KIKAKUI SYLLABLE M150 BEE -1E81F ; [.39B8.0020.0002] # MENDE KIKAKUI SYLLABLE M097 BE -1E820 ; [.39B9.0020.0002] # MENDE KIKAKUI SYLLABLE M103 BOO -1E821 ; [.39BA.0020.0002] # MENDE KIKAKUI SYLLABLE M138 BO -1E822 ; [.39BB.0020.0002] # MENDE KIKAKUI SYLLABLE M013 I -1E823 ; [.39BC.0020.0002] # MENDE KIKAKUI SYLLABLE M014 A -1E824 ; [.39BD.0020.0002] # MENDE KIKAKUI SYLLABLE M015 U -1E825 ; [.39BE.0020.0002] # MENDE KIKAKUI SYLLABLE M163 EE -1E826 ; [.39BF.0020.0002] # MENDE KIKAKUI SYLLABLE M100 E -1E827 ; [.39C0.0020.0002] # MENDE KIKAKUI SYLLABLE M165 OO -1E828 ; [.39C1.0020.0002] # MENDE KIKAKUI SYLLABLE M147 O -1E829 ; [.39C2.0020.0002] # MENDE KIKAKUI SYLLABLE M137 EI -1E82A ; [.39C3.0020.0002] # MENDE KIKAKUI SYLLABLE M131 IN -1E82B ; [.39C4.0020.0002] # MENDE KIKAKUI SYLLABLE M135 IN -1E82C ; [.39C5.0020.0002] # MENDE KIKAKUI SYLLABLE M195 AN -1E82D ; [.39C6.0020.0002] # MENDE KIKAKUI SYLLABLE M178 EN -1E82E ; [.39C7.0020.0002] # MENDE KIKAKUI SYLLABLE M019 SI -1E82F ; [.39C8.0020.0002] # MENDE KIKAKUI SYLLABLE M020 SA -1E830 ; [.39C9.0020.0002] # MENDE KIKAKUI SYLLABLE M021 SU -1E831 ; [.39CA.0020.0002] # MENDE KIKAKUI SYLLABLE M162 SEE -1E832 ; [.39CB.0020.0002] # MENDE KIKAKUI SYLLABLE M116 SE -1E833 ; [.39CC.0020.0002] # MENDE KIKAKUI SYLLABLE M136 SOO -1E834 ; [.39CD.0020.0002] # MENDE KIKAKUI SYLLABLE M079 SO -1E835 ; [.39CE.0020.0002] # MENDE KIKAKUI SYLLABLE M196 SIA -1E836 ; [.39CF.0020.0002] # MENDE KIKAKUI SYLLABLE M025 LI -1E837 ; [.39D0.0020.0002] # MENDE KIKAKUI SYLLABLE M026 LA -1E838 ; [.39D1.0020.0002] # MENDE KIKAKUI SYLLABLE M027 LU -1E839 ; [.39D2.0020.0002] # MENDE KIKAKUI SYLLABLE M084 LEE -1E83A ; [.39D3.0020.0002] # MENDE KIKAKUI SYLLABLE M073 LE -1E83B ; [.39D4.0020.0002] # MENDE KIKAKUI SYLLABLE M054 LOO -1E83C ; [.39D5.0020.0002] # MENDE KIKAKUI SYLLABLE M153 LO -1E83D ; [.39D6.0020.0002] # MENDE KIKAKUI SYLLABLE M110 LONG LE -1E83E ; [.39D7.0020.0002] # MENDE KIKAKUI SYLLABLE M016 DI -1E83F ; [.39D8.0020.0002] # MENDE KIKAKUI SYLLABLE M017 DA -1E840 ; [.39D9.0020.0002] # MENDE KIKAKUI SYLLABLE M018 DU -1E841 ; [.39DA.0020.0002] # MENDE KIKAKUI SYLLABLE M089 DEE -1E842 ; [.39DB.0020.0002] # MENDE KIKAKUI SYLLABLE M180 DOO -1E843 ; [.39DC.0020.0002] # MENDE KIKAKUI SYLLABLE M181 DO -1E844 ; [.39DD.0020.0002] # MENDE KIKAKUI SYLLABLE M022 TI -1E845 ; [.39DE.0020.0002] # MENDE KIKAKUI SYLLABLE M023 TA -1E846 ; [.39DF.0020.0002] # MENDE KIKAKUI SYLLABLE M024 TU -1E847 ; [.39E0.0020.0002] # MENDE KIKAKUI SYLLABLE M091 TEE -1E848 ; [.39E1.0020.0002] # MENDE KIKAKUI SYLLABLE M055 TE -1E849 ; [.39E2.0020.0002] # MENDE KIKAKUI SYLLABLE M104 TOO -1E84A ; [.39E3.0020.0002] # MENDE KIKAKUI SYLLABLE M069 TO -1E84B ; [.39E4.0020.0002] # MENDE KIKAKUI SYLLABLE M028 JI -1E84C ; [.39E5.0020.0002] # MENDE KIKAKUI SYLLABLE M029 JA -1E84D ; [.39E6.0020.0002] # MENDE KIKAKUI SYLLABLE M030 JU -1E84E ; [.39E7.0020.0002] # MENDE KIKAKUI SYLLABLE M157 JEE -1E84F ; [.39E8.0020.0002] # MENDE KIKAKUI SYLLABLE M113 JE -1E850 ; [.39E9.0020.0002] # MENDE KIKAKUI SYLLABLE M160 JOO -1E851 ; [.39EA.0020.0002] # MENDE KIKAKUI SYLLABLE M063 JO -1E852 ; [.39EB.0020.0002] # MENDE KIKAKUI SYLLABLE M175 LONG JO -1E853 ; [.39EC.0020.0002] # MENDE KIKAKUI SYLLABLE M031 YI -1E854 ; [.39ED.0020.0002] # MENDE KIKAKUI SYLLABLE M032 YA -1E855 ; [.39EE.0020.0002] # MENDE KIKAKUI SYLLABLE M033 YU -1E856 ; [.39EF.0020.0002] # MENDE KIKAKUI SYLLABLE M109 YEE -1E857 ; [.39F0.0020.0002] # MENDE KIKAKUI SYLLABLE M080 YE -1E858 ; [.39F1.0020.0002] # MENDE KIKAKUI SYLLABLE M141 YOO -1E859 ; [.39F2.0020.0002] # MENDE KIKAKUI SYLLABLE M121 YO -1E85A ; [.39F3.0020.0002] # MENDE KIKAKUI SYLLABLE M034 FI -1E85B ; [.39F4.0020.0002] # MENDE KIKAKUI SYLLABLE M035 FA -1E85C ; [.39F5.0020.0002] # MENDE KIKAKUI SYLLABLE M036 FU -1E85D ; [.39F6.0020.0002] # MENDE KIKAKUI SYLLABLE M078 FEE -1E85E ; [.39F7.0020.0002] # MENDE KIKAKUI SYLLABLE M075 FE -1E85F ; [.39F8.0020.0002] # MENDE KIKAKUI SYLLABLE M133 FOO -1E860 ; [.39F9.0020.0002] # MENDE KIKAKUI SYLLABLE M088 FO -1E861 ; [.39FA.0020.0002] # MENDE KIKAKUI SYLLABLE M197 FUA -1E862 ; [.39FB.0020.0002] # MENDE KIKAKUI SYLLABLE M101 FAN -1E863 ; [.39FC.0020.0002] # MENDE KIKAKUI SYLLABLE M037 NIN -1E864 ; [.39FD.0020.0002] # MENDE KIKAKUI SYLLABLE M038 NAN -1E865 ; [.39FE.0020.0002] # MENDE KIKAKUI SYLLABLE M039 NUN -1E866 ; [.39FF.0020.0002] # MENDE KIKAKUI SYLLABLE M117 NEN -1E867 ; [.3A00.0020.0002] # MENDE KIKAKUI SYLLABLE M169 NON -1E868 ; [.3A01.0020.0002] # MENDE KIKAKUI SYLLABLE M176 HI -1E869 ; [.3A02.0020.0002] # MENDE KIKAKUI SYLLABLE M041 HA -1E86A ; [.3A03.0020.0002] # MENDE KIKAKUI SYLLABLE M186 HU -1E86B ; [.3A04.0020.0002] # MENDE KIKAKUI SYLLABLE M040 HEE -1E86C ; [.3A05.0020.0002] # MENDE KIKAKUI SYLLABLE M096 HE -1E86D ; [.3A06.0020.0002] # MENDE KIKAKUI SYLLABLE M042 HOO -1E86E ; [.3A07.0020.0002] # MENDE KIKAKUI SYLLABLE M140 HO -1E86F ; [.3A08.0020.0002] # MENDE KIKAKUI SYLLABLE M083 HEEI -1E870 ; [.3A09.0020.0002] # MENDE KIKAKUI SYLLABLE M128 HOOU -1E871 ; [.3A0A.0020.0002] # MENDE KIKAKUI SYLLABLE M053 HIN -1E872 ; [.3A0B.0020.0002] # MENDE KIKAKUI SYLLABLE M130 HAN -1E873 ; [.3A0C.0020.0002] # MENDE KIKAKUI SYLLABLE M087 HUN -1E874 ; [.3A0D.0020.0002] # MENDE KIKAKUI SYLLABLE M052 HEN -1E875 ; [.3A0E.0020.0002] # MENDE KIKAKUI SYLLABLE M193 HON -1E876 ; [.3A0F.0020.0002] # MENDE KIKAKUI SYLLABLE M046 HUAN -1E877 ; [.3A10.0020.0002] # MENDE KIKAKUI SYLLABLE M090 NGGI -1E878 ; [.3A11.0020.0002] # MENDE KIKAKUI SYLLABLE M043 NGGA -1E879 ; [.3A12.0020.0002] # MENDE KIKAKUI SYLLABLE M082 NGGU -1E87A ; [.3A13.0020.0002] # MENDE KIKAKUI SYLLABLE M115 NGGEE -1E87B ; [.3A14.0020.0002] # MENDE KIKAKUI SYLLABLE M146 NGGE -1E87C ; [.3A15.0020.0002] # MENDE KIKAKUI SYLLABLE M156 NGGOO -1E87D ; [.3A16.0020.0002] # MENDE KIKAKUI SYLLABLE M120 NGGO -1E87E ; [.3A17.0020.0002] # MENDE KIKAKUI SYLLABLE M159 NGGAA -1E87F ; [.3A18.0020.0002] # MENDE KIKAKUI SYLLABLE M127 NGGUA -1E880 ; [.3A19.0020.0002] # MENDE KIKAKUI SYLLABLE M086 LONG NGGE -1E881 ; [.3A1A.0020.0002] # MENDE KIKAKUI SYLLABLE M106 LONG NGGOO -1E882 ; [.3A1B.0020.0002] # MENDE KIKAKUI SYLLABLE M183 LONG NGGO -1E883 ; [.3A1C.0020.0002] # MENDE KIKAKUI SYLLABLE M155 GI -1E884 ; [.3A1D.0020.0002] # MENDE KIKAKUI SYLLABLE M111 GA -1E885 ; [.3A1E.0020.0002] # MENDE KIKAKUI SYLLABLE M168 GU -1E886 ; [.3A1F.0020.0002] # MENDE KIKAKUI SYLLABLE M190 GEE -1E887 ; [.3A20.0020.0002] # MENDE KIKAKUI SYLLABLE M166 GUEI -1E888 ; [.3A21.0020.0002] # MENDE KIKAKUI SYLLABLE M167 GUAN -1E889 ; [.3A22.0020.0002] # MENDE KIKAKUI SYLLABLE M184 NGEN -1E88A ; [.3A23.0020.0002] # MENDE KIKAKUI SYLLABLE M057 NGON -1E88B ; [.3A24.0020.0002] # MENDE KIKAKUI SYLLABLE M177 NGUAN -1E88C ; [.3A25.0020.0002] # MENDE KIKAKUI SYLLABLE M068 PI -1E88D ; [.3A26.0020.0002] # MENDE KIKAKUI SYLLABLE M099 PA -1E88E ; [.3A27.0020.0002] # MENDE KIKAKUI SYLLABLE M050 PU -1E88F ; [.3A28.0020.0002] # MENDE KIKAKUI SYLLABLE M081 PEE -1E890 ; [.3A29.0020.0002] # MENDE KIKAKUI SYLLABLE M051 PE -1E891 ; [.3A2A.0020.0002] # MENDE KIKAKUI SYLLABLE M102 POO -1E892 ; [.3A2B.0020.0002] # MENDE KIKAKUI SYLLABLE M066 PO -1E893 ; [.3A2C.0020.0002] # MENDE KIKAKUI SYLLABLE M145 MBI -1E894 ; [.3A2D.0020.0002] # MENDE KIKAKUI SYLLABLE M062 MBA -1E895 ; [.3A2E.0020.0002] # MENDE KIKAKUI SYLLABLE M122 MBU -1E896 ; [.3A2F.0020.0002] # MENDE KIKAKUI SYLLABLE M047 MBEE -1E897 ; [.3A30.0020.0002] # MENDE KIKAKUI SYLLABLE M188 MBEE -1E898 ; [.3A31.0020.0002] # MENDE KIKAKUI SYLLABLE M072 MBE -1E899 ; [.3A32.0020.0002] # MENDE KIKAKUI SYLLABLE M172 MBOO -1E89A ; [.3A33.0020.0002] # MENDE KIKAKUI SYLLABLE M174 MBO -1E89B ; [.3A34.0020.0002] # MENDE KIKAKUI SYLLABLE M187 MBUU -1E89C ; [.3A35.0020.0002] # MENDE KIKAKUI SYLLABLE M161 LONG MBE -1E89D ; [.3A36.0020.0002] # MENDE KIKAKUI SYLLABLE M105 LONG MBOO -1E89E ; [.3A37.0020.0002] # MENDE KIKAKUI SYLLABLE M142 LONG MBO -1E89F ; [.3A38.0020.0002] # MENDE KIKAKUI SYLLABLE M132 KPI -1E8A0 ; [.3A39.0020.0002] # MENDE KIKAKUI SYLLABLE M092 KPA -1E8A1 ; [.3A3A.0020.0002] # MENDE KIKAKUI SYLLABLE M074 KPU -1E8A2 ; [.3A3B.0020.0002] # MENDE KIKAKUI SYLLABLE M044 KPEE -1E8A3 ; [.3A3C.0020.0002] # MENDE KIKAKUI SYLLABLE M108 KPE -1E8A4 ; [.3A3D.0020.0002] # MENDE KIKAKUI SYLLABLE M112 KPOO -1E8A5 ; [.3A3E.0020.0002] # MENDE KIKAKUI SYLLABLE M158 KPO -1E8A6 ; [.3A3F.0020.0002] # MENDE KIKAKUI SYLLABLE M124 GBI -1E8A7 ; [.3A40.0020.0002] # MENDE KIKAKUI SYLLABLE M056 GBA -1E8A8 ; [.3A41.0020.0002] # MENDE KIKAKUI SYLLABLE M148 GBU -1E8A9 ; [.3A42.0020.0002] # MENDE KIKAKUI SYLLABLE M093 GBEE -1E8AA ; [.3A43.0020.0002] # MENDE KIKAKUI SYLLABLE M107 GBE -1E8AB ; [.3A44.0020.0002] # MENDE KIKAKUI SYLLABLE M071 GBOO -1E8AC ; [.3A45.0020.0002] # MENDE KIKAKUI SYLLABLE M070 GBO -1E8AD ; [.3A46.0020.0002] # MENDE KIKAKUI SYLLABLE M171 RA -1E8AE ; [.3A47.0020.0002] # MENDE KIKAKUI SYLLABLE M123 NDI -1E8AF ; [.3A48.0020.0002] # MENDE KIKAKUI SYLLABLE M129 NDA -1E8B0 ; [.3A49.0020.0002] # MENDE KIKAKUI SYLLABLE M125 NDU -1E8B1 ; [.3A4A.0020.0002] # MENDE KIKAKUI SYLLABLE M191 NDEE -1E8B2 ; [.3A4B.0020.0002] # MENDE KIKAKUI SYLLABLE M119 NDE -1E8B3 ; [.3A4C.0020.0002] # MENDE KIKAKUI SYLLABLE M067 NDOO -1E8B4 ; [.3A4D.0020.0002] # MENDE KIKAKUI SYLLABLE M064 NDO -1E8B5 ; [.3A4E.0020.0002] # MENDE KIKAKUI SYLLABLE M152 NJA -1E8B6 ; [.3A4F.0020.0002] # MENDE KIKAKUI SYLLABLE M192 NJU -1E8B7 ; [.3A50.0020.0002] # MENDE KIKAKUI SYLLABLE M149 NJEE -1E8B8 ; [.3A51.0020.0002] # MENDE KIKAKUI SYLLABLE M134 NJOO -1E8B9 ; [.3A52.0020.0002] # MENDE KIKAKUI SYLLABLE M182 VI -1E8BA ; [.3A53.0020.0002] # MENDE KIKAKUI SYLLABLE M185 VA -1E8BB ; [.3A54.0020.0002] # MENDE KIKAKUI SYLLABLE M151 VU -1E8BC ; [.3A55.0020.0002] # MENDE KIKAKUI SYLLABLE M173 VEE -1E8BD ; [.3A56.0020.0002] # MENDE KIKAKUI SYLLABLE M085 VE -1E8BE ; [.3A57.0020.0002] # MENDE KIKAKUI SYLLABLE M144 VOO -1E8BF ; [.3A58.0020.0002] # MENDE KIKAKUI SYLLABLE M077 VO -1E8C0 ; [.3A59.0020.0002] # MENDE KIKAKUI SYLLABLE M164 NYIN -1E8C1 ; [.3A5A.0020.0002] # MENDE KIKAKUI SYLLABLE M058 NYAN -1E8C2 ; [.3A5B.0020.0002] # MENDE KIKAKUI SYLLABLE M170 NYUN -1E8C3 ; [.3A5C.0020.0002] # MENDE KIKAKUI SYLLABLE M098 NYEN -1E8C4 ; [.3A5D.0020.0002] # MENDE KIKAKUI SYLLABLE M060 NYON -1100 ; [.3A5E.0020.0002] # HANGUL CHOSEONG KIYEOK -3131 ; [.3A5E.0020.0004] # HANGUL LETTER KIYEOK -3200 ; [*0310.0020.0004][.3A5E.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL KIYEOK -3260 ; [.3A5E.0020.0006] # CIRCLED HANGUL KIYEOK -FFA1 ; [.3A5E.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK -320E ; [*0310.0020.0004][.3A5E.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL KIYEOK A -326E ; [.3A5E.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL KIYEOK A -1101 ; [.3A5F.0020.0002] # HANGUL CHOSEONG SSANGKIYEOK -3132 ; [.3A5F.0020.0004] # HANGUL LETTER SSANGKIYEOK -FFA2 ; [.3A5F.0020.0012] # HALFWIDTH HANGUL LETTER SSANGKIYEOK -1102 ; [.3A60.0020.0002] # HANGUL CHOSEONG NIEUN -3134 ; [.3A60.0020.0004] # HANGUL LETTER NIEUN -3201 ; [*0310.0020.0004][.3A60.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL NIEUN -3261 ; [.3A60.0020.0006] # CIRCLED HANGUL NIEUN -FFA4 ; [.3A60.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN -320F ; [*0310.0020.0004][.3A60.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL NIEUN A -326F ; [.3A60.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL NIEUN A -1103 ; [.3A61.0020.0002] # HANGUL CHOSEONG TIKEUT -3137 ; [.3A61.0020.0004] # HANGUL LETTER TIKEUT -3202 ; [*0310.0020.0004][.3A61.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL TIKEUT -3262 ; [.3A61.0020.0006] # CIRCLED HANGUL TIKEUT -FFA7 ; [.3A61.0020.0012] # HALFWIDTH HANGUL LETTER TIKEUT -3210 ; [*0310.0020.0004][.3A61.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL TIKEUT A -3270 ; [.3A61.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL TIKEUT A -1104 ; [.3A62.0020.0002] # HANGUL CHOSEONG SSANGTIKEUT -3138 ; [.3A62.0020.0004] # HANGUL LETTER SSANGTIKEUT -FFA8 ; [.3A62.0020.0012] # HALFWIDTH HANGUL LETTER SSANGTIKEUT -1105 ; [.3A63.0020.0002] # HANGUL CHOSEONG RIEUL -3139 ; [.3A63.0020.0004] # HANGUL LETTER RIEUL -3203 ; [*0310.0020.0004][.3A63.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL RIEUL -3263 ; [.3A63.0020.0006] # CIRCLED HANGUL RIEUL -FFA9 ; [.3A63.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL -3211 ; [*0310.0020.0004][.3A63.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL RIEUL A -3271 ; [.3A63.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL RIEUL A -1106 ; [.3A64.0020.0002] # HANGUL CHOSEONG MIEUM -3141 ; [.3A64.0020.0004] # HANGUL LETTER MIEUM -3204 ; [*0310.0020.0004][.3A64.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL MIEUM -3264 ; [.3A64.0020.0006] # CIRCLED HANGUL MIEUM -FFB1 ; [.3A64.0020.0012] # HALFWIDTH HANGUL LETTER MIEUM -3212 ; [*0310.0020.0004][.3A64.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL MIEUM A -3272 ; [.3A64.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL MIEUM A -1107 ; [.3A65.0020.0002] # HANGUL CHOSEONG PIEUP -3142 ; [.3A65.0020.0004] # HANGUL LETTER PIEUP -3205 ; [*0310.0020.0004][.3A65.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL PIEUP -3265 ; [.3A65.0020.0006] # CIRCLED HANGUL PIEUP -FFB2 ; [.3A65.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP -3213 ; [*0310.0020.0004][.3A65.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL PIEUP A -3273 ; [.3A65.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL PIEUP A -1108 ; [.3A66.0020.0002] # HANGUL CHOSEONG SSANGPIEUP -3143 ; [.3A66.0020.0004] # HANGUL LETTER SSANGPIEUP -FFB3 ; [.3A66.0020.0012] # HALFWIDTH HANGUL LETTER SSANGPIEUP -1109 ; [.3A67.0020.0002] # HANGUL CHOSEONG SIOS -3145 ; [.3A67.0020.0004] # HANGUL LETTER SIOS -3206 ; [*0310.0020.0004][.3A67.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL SIOS -3266 ; [.3A67.0020.0006] # CIRCLED HANGUL SIOS -FFB5 ; [.3A67.0020.0012] # HALFWIDTH HANGUL LETTER SIOS -3214 ; [*0310.0020.0004][.3A67.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL SIOS A -3274 ; [.3A67.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL SIOS A -110A ; [.3A68.0020.0002] # HANGUL CHOSEONG SSANGSIOS -3146 ; [.3A68.0020.0004] # HANGUL LETTER SSANGSIOS -FFB6 ; [.3A68.0020.0012] # HALFWIDTH HANGUL LETTER SSANGSIOS -110B ; [.3A69.0020.0002] # HANGUL CHOSEONG IEUNG -3147 ; [.3A69.0020.0004] # HANGUL LETTER IEUNG -3207 ; [*0310.0020.0004][.3A69.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL IEUNG -3267 ; [.3A69.0020.0006] # CIRCLED HANGUL IEUNG -FFB7 ; [.3A69.0020.0012] # HALFWIDTH HANGUL LETTER IEUNG -3215 ; [*0310.0020.0004][.3A69.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL IEUNG A -3275 ; [.3A69.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL IEUNG A -321D ; [*0310.0020.0004][.3A69.0020.0004][.3AE4.0020.0004][.3A6A.0020.0004][.3AE0.0020.0004][.3B3D.0020.0004][*0311.0020.0004] # PARENTHESIZED KOREAN CHARACTER OJEON -321E ; [*0310.0020.0004][.3A69.0020.0004][.3AE4.0020.0004][.3A70.0020.0004][.3AE9.0020.0004][*0311.0020.0004] # PARENTHESIZED KOREAN CHARACTER O HU -327E ; [.3A69.0020.0006][.3AE9.0020.0006] # CIRCLED HANGUL IEUNG U -110C ; [.3A6A.0020.0002] # HANGUL CHOSEONG CIEUC -3148 ; [.3A6A.0020.0004] # HANGUL LETTER CIEUC -3208 ; [*0310.0020.0004][.3A6A.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CIEUC -3268 ; [.3A6A.0020.0006] # CIRCLED HANGUL CIEUC -FFB8 ; [.3A6A.0020.0012] # HALFWIDTH HANGUL LETTER CIEUC -3216 ; [*0310.0020.0004][.3A6A.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CIEUC A -3276 ; [.3A6A.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL CIEUC A -321C ; [*0310.0020.0004][.3A6A.0020.0004][.3AE9.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CIEUC U -327D ; [.3A6A.0020.0006][.3AE9.0020.0006][.3A69.0020.0006][.3AEF.0020.0006] # CIRCLED KOREAN CHARACTER JUEUI -110D ; [.3A6B.0020.0002] # HANGUL CHOSEONG SSANGCIEUC -3149 ; [.3A6B.0020.0004] # HANGUL LETTER SSANGCIEUC -FFB9 ; [.3A6B.0020.0012] # HALFWIDTH HANGUL LETTER SSANGCIEUC -110E ; [.3A6C.0020.0002] # HANGUL CHOSEONG CHIEUCH -314A ; [.3A6C.0020.0004] # HANGUL LETTER CHIEUCH -3209 ; [*0310.0020.0004][.3A6C.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CHIEUCH -3269 ; [.3A6C.0020.0006] # CIRCLED HANGUL CHIEUCH -FFBA ; [.3A6C.0020.0012] # HALFWIDTH HANGUL LETTER CHIEUCH -3217 ; [*0310.0020.0004][.3A6C.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL CHIEUCH A -3277 ; [.3A6C.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL CHIEUCH A -327C ; [.3A6C.0020.0006][.3ADC.0020.0006][.3B49.0020.0006][.3A5E.0020.0006][.3AE4.0020.0006] # CIRCLED KOREAN CHARACTER CHAMKO -110F ; [.3A6D.0020.0002] # HANGUL CHOSEONG KHIEUKH -314B ; [.3A6D.0020.0004] # HANGUL LETTER KHIEUKH -320A ; [*0310.0020.0004][.3A6D.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL KHIEUKH -326A ; [.3A6D.0020.0006] # CIRCLED HANGUL KHIEUKH -FFBB ; [.3A6D.0020.0012] # HALFWIDTH HANGUL LETTER KHIEUKH -3218 ; [*0310.0020.0004][.3A6D.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL KHIEUKH A -3278 ; [.3A6D.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL KHIEUKH A -1110 ; [.3A6E.0020.0002] # HANGUL CHOSEONG THIEUTH -314C ; [.3A6E.0020.0004] # HANGUL LETTER THIEUTH -320B ; [*0310.0020.0004][.3A6E.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL THIEUTH -326B ; [.3A6E.0020.0006] # CIRCLED HANGUL THIEUTH -FFBC ; [.3A6E.0020.0012] # HALFWIDTH HANGUL LETTER THIEUTH -3219 ; [*0310.0020.0004][.3A6E.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL THIEUTH A -3279 ; [.3A6E.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL THIEUTH A -1111 ; [.3A6F.0020.0002] # HANGUL CHOSEONG PHIEUPH -314D ; [.3A6F.0020.0004] # HANGUL LETTER PHIEUPH -320C ; [*0310.0020.0004][.3A6F.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL PHIEUPH -326C ; [.3A6F.0020.0006] # CIRCLED HANGUL PHIEUPH -FFBD ; [.3A6F.0020.0012] # HALFWIDTH HANGUL LETTER PHIEUPH -321A ; [*0310.0020.0004][.3A6F.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL PHIEUPH A -327A ; [.3A6F.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL PHIEUPH A -1112 ; [.3A70.0020.0002] # HANGUL CHOSEONG HIEUH -314E ; [.3A70.0020.0004] # HANGUL LETTER HIEUH -320D ; [*0310.0020.0004][.3A70.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL HIEUH -326D ; [.3A70.0020.0006] # CIRCLED HANGUL HIEUH -FFBE ; [.3A70.0020.0012] # HALFWIDTH HANGUL LETTER HIEUH -321B ; [*0310.0020.0004][.3A70.0020.0004][.3ADC.0020.0004][*0311.0020.0004] # PARENTHESIZED HANGUL HIEUH A -327B ; [.3A70.0020.0006][.3ADC.0020.0006] # CIRCLED HANGUL HIEUH A -1113 ; [.3A71.0020.0002] # HANGUL CHOSEONG NIEUN-KIYEOK -1114 ; [.3A72.0020.0002] # HANGUL CHOSEONG SSANGNIEUN -3165 ; [.3A72.0020.0004] # HANGUL LETTER SSANGNIEUN -1115 ; [.3A73.0020.0002] # HANGUL CHOSEONG NIEUN-TIKEUT -3166 ; [.3A73.0020.0004] # HANGUL LETTER NIEUN-TIKEUT -1116 ; [.3A74.0020.0002] # HANGUL CHOSEONG NIEUN-PIEUP -1117 ; [.3A75.0020.0002] # HANGUL CHOSEONG TIKEUT-KIYEOK -1118 ; [.3A76.0020.0002] # HANGUL CHOSEONG RIEUL-NIEUN -1119 ; [.3A77.0020.0002] # HANGUL CHOSEONG SSANGRIEUL -111A ; [.3A78.0020.0002] # HANGUL CHOSEONG RIEUL-HIEUH -3140 ; [.3A78.0020.0004] # HANGUL LETTER RIEUL-HIEUH -FFB0 ; [.3A78.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH -111B ; [.3A79.0020.0002] # HANGUL CHOSEONG KAPYEOUNRIEUL -111C ; [.3A7A.0020.0002] # HANGUL CHOSEONG MIEUM-PIEUP -316E ; [.3A7A.0020.0004] # HANGUL LETTER MIEUM-PIEUP -111D ; [.3A7B.0020.0002] # HANGUL CHOSEONG KAPYEOUNMIEUM -3171 ; [.3A7B.0020.0004] # HANGUL LETTER KAPYEOUNMIEUM -111E ; [.3A7C.0020.0002] # HANGUL CHOSEONG PIEUP-KIYEOK -3172 ; [.3A7C.0020.0004] # HANGUL LETTER PIEUP-KIYEOK -111F ; [.3A7D.0020.0002] # HANGUL CHOSEONG PIEUP-NIEUN -1120 ; [.3A7E.0020.0002] # HANGUL CHOSEONG PIEUP-TIKEUT -3173 ; [.3A7E.0020.0004] # HANGUL LETTER PIEUP-TIKEUT -1121 ; [.3A7F.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS -3144 ; [.3A7F.0020.0004] # HANGUL LETTER PIEUP-SIOS -FFB4 ; [.3A7F.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP-SIOS -1122 ; [.3A80.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK -3174 ; [.3A80.0020.0004] # HANGUL LETTER PIEUP-SIOS-KIYEOK -1123 ; [.3A81.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT -3175 ; [.3A81.0020.0004] # HANGUL LETTER PIEUP-SIOS-TIKEUT -1124 ; [.3A82.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP -1125 ; [.3A83.0020.0002] # HANGUL CHOSEONG PIEUP-SSANGSIOS -1126 ; [.3A84.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC -1127 ; [.3A85.0020.0002] # HANGUL CHOSEONG PIEUP-CIEUC -3176 ; [.3A85.0020.0004] # HANGUL LETTER PIEUP-CIEUC -1128 ; [.3A86.0020.0002] # HANGUL CHOSEONG PIEUP-CHIEUCH -1129 ; [.3A87.0020.0002] # HANGUL CHOSEONG PIEUP-THIEUTH -3177 ; [.3A87.0020.0004] # HANGUL LETTER PIEUP-THIEUTH -112A ; [.3A88.0020.0002] # HANGUL CHOSEONG PIEUP-PHIEUPH -112B ; [.3A89.0020.0002] # HANGUL CHOSEONG KAPYEOUNPIEUP -3178 ; [.3A89.0020.0004] # HANGUL LETTER KAPYEOUNPIEUP -112C ; [.3A8A.0020.0002] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP -3179 ; [.3A8A.0020.0004] # HANGUL LETTER KAPYEOUNSSANGPIEUP -112D ; [.3A8B.0020.0002] # HANGUL CHOSEONG SIOS-KIYEOK -317A ; [.3A8B.0020.0004] # HANGUL LETTER SIOS-KIYEOK -112E ; [.3A8C.0020.0002] # HANGUL CHOSEONG SIOS-NIEUN -317B ; [.3A8C.0020.0004] # HANGUL LETTER SIOS-NIEUN -112F ; [.3A8D.0020.0002] # HANGUL CHOSEONG SIOS-TIKEUT -317C ; [.3A8D.0020.0004] # HANGUL LETTER SIOS-TIKEUT -1130 ; [.3A8E.0020.0002] # HANGUL CHOSEONG SIOS-RIEUL -1131 ; [.3A8F.0020.0002] # HANGUL CHOSEONG SIOS-MIEUM -1132 ; [.3A90.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP -317D ; [.3A90.0020.0004] # HANGUL LETTER SIOS-PIEUP -1133 ; [.3A91.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK -1134 ; [.3A92.0020.0002] # HANGUL CHOSEONG SIOS-SSANGSIOS -1135 ; [.3A93.0020.0002] # HANGUL CHOSEONG SIOS-IEUNG -1136 ; [.3A94.0020.0002] # HANGUL CHOSEONG SIOS-CIEUC -317E ; [.3A94.0020.0004] # HANGUL LETTER SIOS-CIEUC -1137 ; [.3A95.0020.0002] # HANGUL CHOSEONG SIOS-CHIEUCH -1138 ; [.3A96.0020.0002] # HANGUL CHOSEONG SIOS-KHIEUKH -1139 ; [.3A97.0020.0002] # HANGUL CHOSEONG SIOS-THIEUTH -113A ; [.3A98.0020.0002] # HANGUL CHOSEONG SIOS-PHIEUPH -113B ; [.3A99.0020.0002] # HANGUL CHOSEONG SIOS-HIEUH -113C ; [.3A9A.0020.0002] # HANGUL CHOSEONG CHITUEUMSIOS -113D ; [.3A9B.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGSIOS -113E ; [.3A9C.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSIOS -113F ; [.3A9D.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS -1140 ; [.3A9E.0020.0002] # HANGUL CHOSEONG PANSIOS -317F ; [.3A9E.0020.0004] # HANGUL LETTER PANSIOS -1141 ; [.3A9F.0020.0002] # HANGUL CHOSEONG IEUNG-KIYEOK -1142 ; [.3AA0.0020.0002] # HANGUL CHOSEONG IEUNG-TIKEUT -1143 ; [.3AA1.0020.0002] # HANGUL CHOSEONG IEUNG-MIEUM -1144 ; [.3AA2.0020.0002] # HANGUL CHOSEONG IEUNG-PIEUP -1145 ; [.3AA3.0020.0002] # HANGUL CHOSEONG IEUNG-SIOS -1146 ; [.3AA4.0020.0002] # HANGUL CHOSEONG IEUNG-PANSIOS -1147 ; [.3AA5.0020.0002] # HANGUL CHOSEONG SSANGIEUNG -3180 ; [.3AA5.0020.0004] # HANGUL LETTER SSANGIEUNG -1148 ; [.3AA6.0020.0002] # HANGUL CHOSEONG IEUNG-CIEUC -1149 ; [.3AA7.0020.0002] # HANGUL CHOSEONG IEUNG-CHIEUCH -114A ; [.3AA8.0020.0002] # HANGUL CHOSEONG IEUNG-THIEUTH -114B ; [.3AA9.0020.0002] # HANGUL CHOSEONG IEUNG-PHIEUPH -114C ; [.3AAA.0020.0002] # HANGUL CHOSEONG YESIEUNG -3181 ; [.3AAA.0020.0004] # HANGUL LETTER YESIEUNG -114D ; [.3AAB.0020.0002] # HANGUL CHOSEONG CIEUC-IEUNG -114E ; [.3AAC.0020.0002] # HANGUL CHOSEONG CHITUEUMCIEUC -114F ; [.3AAD.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC -1150 ; [.3AAE.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCIEUC -1151 ; [.3AAF.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC -1152 ; [.3AB0.0020.0002] # HANGUL CHOSEONG CHIEUCH-KHIEUKH -1153 ; [.3AB1.0020.0002] # HANGUL CHOSEONG CHIEUCH-HIEUH -1154 ; [.3AB2.0020.0002] # HANGUL CHOSEONG CHITUEUMCHIEUCH -1155 ; [.3AB3.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH -1156 ; [.3AB4.0020.0002] # HANGUL CHOSEONG PHIEUPH-PIEUP -1157 ; [.3AB5.0020.0002] # HANGUL CHOSEONG KAPYEOUNPHIEUPH -3184 ; [.3AB5.0020.0004] # HANGUL LETTER KAPYEOUNPHIEUPH -1158 ; [.3AB6.0020.0002] # HANGUL CHOSEONG SSANGHIEUH -3185 ; [.3AB6.0020.0004] # HANGUL LETTER SSANGHIEUH -1159 ; [.3AB7.0020.0002] # HANGUL CHOSEONG YEORINHIEUH -3186 ; [.3AB7.0020.0004] # HANGUL LETTER YEORINHIEUH -115A ; [.3AB8.0020.0002] # HANGUL CHOSEONG KIYEOK-TIKEUT -115B ; [.3AB9.0020.0002] # HANGUL CHOSEONG NIEUN-SIOS -115C ; [.3ABA.0020.0002] # HANGUL CHOSEONG NIEUN-CIEUC -115D ; [.3ABB.0020.0002] # HANGUL CHOSEONG NIEUN-HIEUH -115E ; [.3ABC.0020.0002] # HANGUL CHOSEONG TIKEUT-RIEUL -A960 ; [.3ABD.0020.0002] # HANGUL CHOSEONG TIKEUT-MIEUM -A961 ; [.3ABE.0020.0002] # HANGUL CHOSEONG TIKEUT-PIEUP -A962 ; [.3ABF.0020.0002] # HANGUL CHOSEONG TIKEUT-SIOS -A963 ; [.3AC0.0020.0002] # HANGUL CHOSEONG TIKEUT-CIEUC -A964 ; [.3AC1.0020.0002] # HANGUL CHOSEONG RIEUL-KIYEOK -A965 ; [.3AC2.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGKIYEOK -A966 ; [.3AC3.0020.0002] # HANGUL CHOSEONG RIEUL-TIKEUT -A967 ; [.3AC4.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGTIKEUT -A968 ; [.3AC5.0020.0002] # HANGUL CHOSEONG RIEUL-MIEUM -A969 ; [.3AC6.0020.0002] # HANGUL CHOSEONG RIEUL-PIEUP -A96A ; [.3AC7.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGPIEUP -A96B ; [.3AC8.0020.0002] # HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP -A96C ; [.3AC9.0020.0002] # HANGUL CHOSEONG RIEUL-SIOS -A96D ; [.3ACA.0020.0002] # HANGUL CHOSEONG RIEUL-CIEUC -A96E ; [.3ACB.0020.0002] # HANGUL CHOSEONG RIEUL-KHIEUKH -A96F ; [.3ACC.0020.0002] # HANGUL CHOSEONG MIEUM-KIYEOK -A970 ; [.3ACD.0020.0002] # HANGUL CHOSEONG MIEUM-TIKEUT -A971 ; [.3ACE.0020.0002] # HANGUL CHOSEONG MIEUM-SIOS -A972 ; [.3ACF.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-THIEUTH -A973 ; [.3AD0.0020.0002] # HANGUL CHOSEONG PIEUP-KHIEUKH -A974 ; [.3AD1.0020.0002] # HANGUL CHOSEONG PIEUP-HIEUH -A975 ; [.3AD2.0020.0002] # HANGUL CHOSEONG SSANGSIOS-PIEUP -A976 ; [.3AD3.0020.0002] # HANGUL CHOSEONG IEUNG-RIEUL -A977 ; [.3AD4.0020.0002] # HANGUL CHOSEONG IEUNG-HIEUH -A978 ; [.3AD5.0020.0002] # HANGUL CHOSEONG SSANGCIEUC-HIEUH -A979 ; [.3AD6.0020.0002] # HANGUL CHOSEONG SSANGTHIEUTH -A97A ; [.3AD7.0020.0002] # HANGUL CHOSEONG PHIEUPH-HIEUH -A97B ; [.3AD8.0020.0002] # HANGUL CHOSEONG HIEUH-SIOS -A97C ; [.3AD9.0020.0002] # HANGUL CHOSEONG SSANGYEORINHIEUH -115F ; [.3ADA.0020.0002] # HANGUL CHOSEONG FILLER -1160 ; [.3ADB.0020.0002] # HANGUL JUNGSEONG FILLER -3164 ; [.3ADB.0020.0004] # HANGUL FILLER -FFA0 ; [.3ADB.0020.0012] # HALFWIDTH HANGUL FILLER -1161 ; [.3ADC.0020.0002] # HANGUL JUNGSEONG A -314F ; [.3ADC.0020.0004] # HANGUL LETTER A -FFC2 ; [.3ADC.0020.0012] # HALFWIDTH HANGUL LETTER A -1162 ; [.3ADD.0020.0002] # HANGUL JUNGSEONG AE -3150 ; [.3ADD.0020.0004] # HANGUL LETTER AE -FFC3 ; [.3ADD.0020.0012] # HALFWIDTH HANGUL LETTER AE -1163 ; [.3ADE.0020.0002] # HANGUL JUNGSEONG YA -3151 ; [.3ADE.0020.0004] # HANGUL LETTER YA -FFC4 ; [.3ADE.0020.0012] # HALFWIDTH HANGUL LETTER YA -1164 ; [.3ADF.0020.0002] # HANGUL JUNGSEONG YAE -3152 ; [.3ADF.0020.0004] # HANGUL LETTER YAE -FFC5 ; [.3ADF.0020.0012] # HALFWIDTH HANGUL LETTER YAE -1165 ; [.3AE0.0020.0002] # HANGUL JUNGSEONG EO -3153 ; [.3AE0.0020.0004] # HANGUL LETTER EO -FFC6 ; [.3AE0.0020.0012] # HALFWIDTH HANGUL LETTER EO -1166 ; [.3AE1.0020.0002] # HANGUL JUNGSEONG E -3154 ; [.3AE1.0020.0004] # HANGUL LETTER E -FFC7 ; [.3AE1.0020.0012] # HALFWIDTH HANGUL LETTER E -1167 ; [.3AE2.0020.0002] # HANGUL JUNGSEONG YEO -3155 ; [.3AE2.0020.0004] # HANGUL LETTER YEO -FFCA ; [.3AE2.0020.0012] # HALFWIDTH HANGUL LETTER YEO -1168 ; [.3AE3.0020.0002] # HANGUL JUNGSEONG YE -3156 ; [.3AE3.0020.0004] # HANGUL LETTER YE -FFCB ; [.3AE3.0020.0012] # HALFWIDTH HANGUL LETTER YE -1169 ; [.3AE4.0020.0002] # HANGUL JUNGSEONG O -3157 ; [.3AE4.0020.0004] # HANGUL LETTER O -FFCC ; [.3AE4.0020.0012] # HALFWIDTH HANGUL LETTER O -116A ; [.3AE5.0020.0002] # HANGUL JUNGSEONG WA -3158 ; [.3AE5.0020.0004] # HANGUL LETTER WA -FFCD ; [.3AE5.0020.0012] # HALFWIDTH HANGUL LETTER WA -116B ; [.3AE6.0020.0002] # HANGUL JUNGSEONG WAE -3159 ; [.3AE6.0020.0004] # HANGUL LETTER WAE -FFCE ; [.3AE6.0020.0012] # HALFWIDTH HANGUL LETTER WAE -116C ; [.3AE7.0020.0002] # HANGUL JUNGSEONG OE -315A ; [.3AE7.0020.0004] # HANGUL LETTER OE -FFCF ; [.3AE7.0020.0012] # HALFWIDTH HANGUL LETTER OE -116D ; [.3AE8.0020.0002] # HANGUL JUNGSEONG YO -315B ; [.3AE8.0020.0004] # HANGUL LETTER YO -FFD2 ; [.3AE8.0020.0012] # HALFWIDTH HANGUL LETTER YO -116E ; [.3AE9.0020.0002] # HANGUL JUNGSEONG U -315C ; [.3AE9.0020.0004] # HANGUL LETTER U -FFD3 ; [.3AE9.0020.0012] # HALFWIDTH HANGUL LETTER U -116F ; [.3AEA.0020.0002] # HANGUL JUNGSEONG WEO -315D ; [.3AEA.0020.0004] # HANGUL LETTER WEO -FFD4 ; [.3AEA.0020.0012] # HALFWIDTH HANGUL LETTER WEO -1170 ; [.3AEB.0020.0002] # HANGUL JUNGSEONG WE -315E ; [.3AEB.0020.0004] # HANGUL LETTER WE -FFD5 ; [.3AEB.0020.0012] # HALFWIDTH HANGUL LETTER WE -1171 ; [.3AEC.0020.0002] # HANGUL JUNGSEONG WI -315F ; [.3AEC.0020.0004] # HANGUL LETTER WI -FFD6 ; [.3AEC.0020.0012] # HALFWIDTH HANGUL LETTER WI -1172 ; [.3AED.0020.0002] # HANGUL JUNGSEONG YU -3160 ; [.3AED.0020.0004] # HANGUL LETTER YU -FFD7 ; [.3AED.0020.0012] # HALFWIDTH HANGUL LETTER YU -1173 ; [.3AEE.0020.0002] # HANGUL JUNGSEONG EU -3161 ; [.3AEE.0020.0004] # HANGUL LETTER EU -FFDA ; [.3AEE.0020.0012] # HALFWIDTH HANGUL LETTER EU -1174 ; [.3AEF.0020.0002] # HANGUL JUNGSEONG YI -3162 ; [.3AEF.0020.0004] # HANGUL LETTER YI -FFDB ; [.3AEF.0020.0012] # HALFWIDTH HANGUL LETTER YI -1175 ; [.3AF0.0020.0002] # HANGUL JUNGSEONG I -3163 ; [.3AF0.0020.0004] # HANGUL LETTER I -FFDC ; [.3AF0.0020.0012] # HALFWIDTH HANGUL LETTER I -1176 ; [.3AF1.0020.0002] # HANGUL JUNGSEONG A-O -1177 ; [.3AF2.0020.0002] # HANGUL JUNGSEONG A-U -1178 ; [.3AF3.0020.0002] # HANGUL JUNGSEONG YA-O -1179 ; [.3AF4.0020.0002] # HANGUL JUNGSEONG YA-YO -117A ; [.3AF5.0020.0002] # HANGUL JUNGSEONG EO-O -117B ; [.3AF6.0020.0002] # HANGUL JUNGSEONG EO-U -117C ; [.3AF7.0020.0002] # HANGUL JUNGSEONG EO-EU -117D ; [.3AF8.0020.0002] # HANGUL JUNGSEONG YEO-O -117E ; [.3AF9.0020.0002] # HANGUL JUNGSEONG YEO-U -117F ; [.3AFA.0020.0002] # HANGUL JUNGSEONG O-EO -1180 ; [.3AFB.0020.0002] # HANGUL JUNGSEONG O-E -1181 ; [.3AFC.0020.0002] # HANGUL JUNGSEONG O-YE -1182 ; [.3AFD.0020.0002] # HANGUL JUNGSEONG O-O -1183 ; [.3AFE.0020.0002] # HANGUL JUNGSEONG O-U -1184 ; [.3AFF.0020.0002] # HANGUL JUNGSEONG YO-YA -3187 ; [.3AFF.0020.0004] # HANGUL LETTER YO-YA -1185 ; [.3B00.0020.0002] # HANGUL JUNGSEONG YO-YAE -3188 ; [.3B00.0020.0004] # HANGUL LETTER YO-YAE -1186 ; [.3B01.0020.0002] # HANGUL JUNGSEONG YO-YEO -1187 ; [.3B02.0020.0002] # HANGUL JUNGSEONG YO-O -1188 ; [.3B03.0020.0002] # HANGUL JUNGSEONG YO-I -3189 ; [.3B03.0020.0004] # HANGUL LETTER YO-I -1189 ; [.3B04.0020.0002] # HANGUL JUNGSEONG U-A -118A ; [.3B05.0020.0002] # HANGUL JUNGSEONG U-AE -118B ; [.3B06.0020.0002] # HANGUL JUNGSEONG U-EO-EU -118C ; [.3B07.0020.0002] # HANGUL JUNGSEONG U-YE -118D ; [.3B08.0020.0002] # HANGUL JUNGSEONG U-U -118E ; [.3B09.0020.0002] # HANGUL JUNGSEONG YU-A -118F ; [.3B0A.0020.0002] # HANGUL JUNGSEONG YU-EO -1190 ; [.3B0B.0020.0002] # HANGUL JUNGSEONG YU-E -1191 ; [.3B0C.0020.0002] # HANGUL JUNGSEONG YU-YEO -318A ; [.3B0C.0020.0004] # HANGUL LETTER YU-YEO -1192 ; [.3B0D.0020.0002] # HANGUL JUNGSEONG YU-YE -318B ; [.3B0D.0020.0004] # HANGUL LETTER YU-YE -1193 ; [.3B0E.0020.0002] # HANGUL JUNGSEONG YU-U -1194 ; [.3B0F.0020.0002] # HANGUL JUNGSEONG YU-I -318C ; [.3B0F.0020.0004] # HANGUL LETTER YU-I -1195 ; [.3B10.0020.0002] # HANGUL JUNGSEONG EU-U -1196 ; [.3B11.0020.0002] # HANGUL JUNGSEONG EU-EU -1197 ; [.3B12.0020.0002] # HANGUL JUNGSEONG YI-U -1198 ; [.3B13.0020.0002] # HANGUL JUNGSEONG I-A -1199 ; [.3B14.0020.0002] # HANGUL JUNGSEONG I-YA -119A ; [.3B15.0020.0002] # HANGUL JUNGSEONG I-O -119B ; [.3B16.0020.0002] # HANGUL JUNGSEONG I-U -119C ; [.3B17.0020.0002] # HANGUL JUNGSEONG I-EU -119D ; [.3B18.0020.0002] # HANGUL JUNGSEONG I-ARAEA -119E ; [.3B19.0020.0002] # HANGUL JUNGSEONG ARAEA -318D ; [.3B19.0020.0004] # HANGUL LETTER ARAEA -119F ; [.3B1A.0020.0002] # HANGUL JUNGSEONG ARAEA-EO -11A0 ; [.3B1B.0020.0002] # HANGUL JUNGSEONG ARAEA-U -11A1 ; [.3B1C.0020.0002] # HANGUL JUNGSEONG ARAEA-I -318E ; [.3B1C.0020.0004] # HANGUL LETTER ARAEAE -11A2 ; [.3B1D.0020.0002] # HANGUL JUNGSEONG SSANGARAEA -11A3 ; [.3B1E.0020.0002] # HANGUL JUNGSEONG A-EU -11A4 ; [.3B1F.0020.0002] # HANGUL JUNGSEONG YA-U -11A5 ; [.3B20.0020.0002] # HANGUL JUNGSEONG YEO-YA -11A6 ; [.3B21.0020.0002] # HANGUL JUNGSEONG O-YA -11A7 ; [.3B22.0020.0002] # HANGUL JUNGSEONG O-YAE -D7B0 ; [.3B23.0020.0002] # HANGUL JUNGSEONG O-YEO -D7B1 ; [.3B24.0020.0002] # HANGUL JUNGSEONG O-O-I -D7B2 ; [.3B25.0020.0002] # HANGUL JUNGSEONG YO-A -D7B3 ; [.3B26.0020.0002] # HANGUL JUNGSEONG YO-AE -D7B4 ; [.3B27.0020.0002] # HANGUL JUNGSEONG YO-EO -D7B5 ; [.3B28.0020.0002] # HANGUL JUNGSEONG U-YEO -D7B6 ; [.3B29.0020.0002] # HANGUL JUNGSEONG U-I-I -D7B7 ; [.3B2A.0020.0002] # HANGUL JUNGSEONG YU-AE -D7B8 ; [.3B2B.0020.0002] # HANGUL JUNGSEONG YU-O -D7B9 ; [.3B2C.0020.0002] # HANGUL JUNGSEONG EU-A -D7BA ; [.3B2D.0020.0002] # HANGUL JUNGSEONG EU-EO -D7BB ; [.3B2E.0020.0002] # HANGUL JUNGSEONG EU-E -D7BC ; [.3B2F.0020.0002] # HANGUL JUNGSEONG EU-O -D7BD ; [.3B30.0020.0002] # HANGUL JUNGSEONG I-YA-O -D7BE ; [.3B31.0020.0002] # HANGUL JUNGSEONG I-YAE -D7BF ; [.3B32.0020.0002] # HANGUL JUNGSEONG I-YEO -D7C0 ; [.3B33.0020.0002] # HANGUL JUNGSEONG I-YE -D7C1 ; [.3B34.0020.0002] # HANGUL JUNGSEONG I-O-I -D7C2 ; [.3B35.0020.0002] # HANGUL JUNGSEONG I-YO -D7C3 ; [.3B36.0020.0002] # HANGUL JUNGSEONG I-YU -D7C4 ; [.3B37.0020.0002] # HANGUL JUNGSEONG I-I -D7C5 ; [.3B38.0020.0002] # HANGUL JUNGSEONG ARAEA-A -D7C6 ; [.3B39.0020.0002] # HANGUL JUNGSEONG ARAEA-E -11A8 ; [.3B3A.0020.0002] # HANGUL JONGSEONG KIYEOK -11A9 ; [.3B3B.0020.0002] # HANGUL JONGSEONG SSANGKIYEOK -11AA ; [.3B3C.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS -3133 ; [.3B3C.0020.0004] # HANGUL LETTER KIYEOK-SIOS -FFA3 ; [.3B3C.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS -11AB ; [.3B3D.0020.0002] # HANGUL JONGSEONG NIEUN -11AC ; [.3B3E.0020.0002] # HANGUL JONGSEONG NIEUN-CIEUC -3135 ; [.3B3E.0020.0004] # HANGUL LETTER NIEUN-CIEUC -FFA5 ; [.3B3E.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC -11AD ; [.3B3F.0020.0002] # HANGUL JONGSEONG NIEUN-HIEUH -3136 ; [.3B3F.0020.0004] # HANGUL LETTER NIEUN-HIEUH -FFA6 ; [.3B3F.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH -11AE ; [.3B40.0020.0002] # HANGUL JONGSEONG TIKEUT -11AF ; [.3B41.0020.0002] # HANGUL JONGSEONG RIEUL -11B0 ; [.3B42.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK -313A ; [.3B42.0020.0004] # HANGUL LETTER RIEUL-KIYEOK -FFAA ; [.3B42.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK -11B1 ; [.3B43.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM -313B ; [.3B43.0020.0004] # HANGUL LETTER RIEUL-MIEUM -FFAB ; [.3B43.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM -11B2 ; [.3B44.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP -313C ; [.3B44.0020.0004] # HANGUL LETTER RIEUL-PIEUP -FFAC ; [.3B44.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP -11B3 ; [.3B45.0020.0002] # HANGUL JONGSEONG RIEUL-SIOS -313D ; [.3B45.0020.0004] # HANGUL LETTER RIEUL-SIOS -FFAD ; [.3B45.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-SIOS -11B4 ; [.3B46.0020.0002] # HANGUL JONGSEONG RIEUL-THIEUTH -313E ; [.3B46.0020.0004] # HANGUL LETTER RIEUL-THIEUTH -FFAE ; [.3B46.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH -11B5 ; [.3B47.0020.0002] # HANGUL JONGSEONG RIEUL-PHIEUPH -313F ; [.3B47.0020.0004] # HANGUL LETTER RIEUL-PHIEUPH -FFAF ; [.3B47.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH -11B6 ; [.3B48.0020.0002] # HANGUL JONGSEONG RIEUL-HIEUH -11B7 ; [.3B49.0020.0002] # HANGUL JONGSEONG MIEUM -11B8 ; [.3B4A.0020.0002] # HANGUL JONGSEONG PIEUP -11B9 ; [.3B4B.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS -11BA ; [.3B4C.0020.0002] # HANGUL JONGSEONG SIOS -11BB ; [.3B4D.0020.0002] # HANGUL JONGSEONG SSANGSIOS -11BC ; [.3B4E.0020.0002] # HANGUL JONGSEONG IEUNG -11BD ; [.3B4F.0020.0002] # HANGUL JONGSEONG CIEUC -11BE ; [.3B50.0020.0002] # HANGUL JONGSEONG CHIEUCH -11BF ; [.3B51.0020.0002] # HANGUL JONGSEONG KHIEUKH -11C0 ; [.3B52.0020.0002] # HANGUL JONGSEONG THIEUTH -11C1 ; [.3B53.0020.0002] # HANGUL JONGSEONG PHIEUPH -11C2 ; [.3B54.0020.0002] # HANGUL JONGSEONG HIEUH -11C3 ; [.3B55.0020.0002] # HANGUL JONGSEONG KIYEOK-RIEUL -11C4 ; [.3B56.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK -11C5 ; [.3B57.0020.0002] # HANGUL JONGSEONG NIEUN-KIYEOK -11C6 ; [.3B58.0020.0002] # HANGUL JONGSEONG NIEUN-TIKEUT -11C7 ; [.3B59.0020.0002] # HANGUL JONGSEONG NIEUN-SIOS -3167 ; [.3B59.0020.0004] # HANGUL LETTER NIEUN-SIOS -11C8 ; [.3B5A.0020.0002] # HANGUL JONGSEONG NIEUN-PANSIOS -3168 ; [.3B5A.0020.0004] # HANGUL LETTER NIEUN-PANSIOS -11C9 ; [.3B5B.0020.0002] # HANGUL JONGSEONG NIEUN-THIEUTH -11CA ; [.3B5C.0020.0002] # HANGUL JONGSEONG TIKEUT-KIYEOK -11CB ; [.3B5D.0020.0002] # HANGUL JONGSEONG TIKEUT-RIEUL -11CC ; [.3B5E.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS -3169 ; [.3B5E.0020.0004] # HANGUL LETTER RIEUL-KIYEOK-SIOS -11CD ; [.3B5F.0020.0002] # HANGUL JONGSEONG RIEUL-NIEUN -11CE ; [.3B60.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT -316A ; [.3B60.0020.0004] # HANGUL LETTER RIEUL-TIKEUT -11CF ; [.3B61.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH -11D0 ; [.3B62.0020.0002] # HANGUL JONGSEONG SSANGRIEUL -11D1 ; [.3B63.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK -11D2 ; [.3B64.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS -11D3 ; [.3B65.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS -316B ; [.3B65.0020.0004] # HANGUL LETTER RIEUL-PIEUP-SIOS -11D4 ; [.3B66.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH -11D5 ; [.3B67.0020.0002] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP -11D6 ; [.3B68.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGSIOS -11D7 ; [.3B69.0020.0002] # HANGUL JONGSEONG RIEUL-PANSIOS -316C ; [.3B69.0020.0004] # HANGUL LETTER RIEUL-PANSIOS -11D8 ; [.3B6A.0020.0002] # HANGUL JONGSEONG RIEUL-KHIEUKH -11D9 ; [.3B6B.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH -316D ; [.3B6B.0020.0004] # HANGUL LETTER RIEUL-YEORINHIEUH -11DA ; [.3B6C.0020.0002] # HANGUL JONGSEONG MIEUM-KIYEOK -11DB ; [.3B6D.0020.0002] # HANGUL JONGSEONG MIEUM-RIEUL -11DC ; [.3B6E.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP -11DD ; [.3B6F.0020.0002] # HANGUL JONGSEONG MIEUM-SIOS -316F ; [.3B6F.0020.0004] # HANGUL LETTER MIEUM-SIOS -11DE ; [.3B70.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGSIOS -11DF ; [.3B71.0020.0002] # HANGUL JONGSEONG MIEUM-PANSIOS -3170 ; [.3B71.0020.0004] # HANGUL LETTER MIEUM-PANSIOS -11E0 ; [.3B72.0020.0002] # HANGUL JONGSEONG MIEUM-CHIEUCH -11E1 ; [.3B73.0020.0002] # HANGUL JONGSEONG MIEUM-HIEUH -11E2 ; [.3B74.0020.0002] # HANGUL JONGSEONG KAPYEOUNMIEUM -11E3 ; [.3B75.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL -11E4 ; [.3B76.0020.0002] # HANGUL JONGSEONG PIEUP-PHIEUPH -11E5 ; [.3B77.0020.0002] # HANGUL JONGSEONG PIEUP-HIEUH -11E6 ; [.3B78.0020.0002] # HANGUL JONGSEONG KAPYEOUNPIEUP -11E7 ; [.3B79.0020.0002] # HANGUL JONGSEONG SIOS-KIYEOK -11E8 ; [.3B7A.0020.0002] # HANGUL JONGSEONG SIOS-TIKEUT -11E9 ; [.3B7B.0020.0002] # HANGUL JONGSEONG SIOS-RIEUL -11EA ; [.3B7C.0020.0002] # HANGUL JONGSEONG SIOS-PIEUP -11EB ; [.3B7D.0020.0002] # HANGUL JONGSEONG PANSIOS -11EC ; [.3B7E.0020.0002] # HANGUL JONGSEONG IEUNG-KIYEOK -11ED ; [.3B7F.0020.0002] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK -11EE ; [.3B80.0020.0002] # HANGUL JONGSEONG SSANGIEUNG -11EF ; [.3B81.0020.0002] # HANGUL JONGSEONG IEUNG-KHIEUKH -11F0 ; [.3B82.0020.0002] # HANGUL JONGSEONG YESIEUNG -11F1 ; [.3B83.0020.0002] # HANGUL JONGSEONG YESIEUNG-SIOS -3182 ; [.3B83.0020.0004] # HANGUL LETTER YESIEUNG-SIOS -11F2 ; [.3B84.0020.0002] # HANGUL JONGSEONG YESIEUNG-PANSIOS -3183 ; [.3B84.0020.0004] # HANGUL LETTER YESIEUNG-PANSIOS -11F3 ; [.3B85.0020.0002] # HANGUL JONGSEONG PHIEUPH-PIEUP -11F4 ; [.3B86.0020.0002] # HANGUL JONGSEONG KAPYEOUNPHIEUPH -11F5 ; [.3B87.0020.0002] # HANGUL JONGSEONG HIEUH-NIEUN -11F6 ; [.3B88.0020.0002] # HANGUL JONGSEONG HIEUH-RIEUL -11F7 ; [.3B89.0020.0002] # HANGUL JONGSEONG HIEUH-MIEUM -11F8 ; [.3B8A.0020.0002] # HANGUL JONGSEONG HIEUH-PIEUP -11F9 ; [.3B8B.0020.0002] # HANGUL JONGSEONG YEORINHIEUH -11FA ; [.3B8C.0020.0002] # HANGUL JONGSEONG KIYEOK-NIEUN -11FB ; [.3B8D.0020.0002] # HANGUL JONGSEONG KIYEOK-PIEUP -11FC ; [.3B8E.0020.0002] # HANGUL JONGSEONG KIYEOK-CHIEUCH -11FD ; [.3B8F.0020.0002] # HANGUL JONGSEONG KIYEOK-KHIEUKH -11FE ; [.3B90.0020.0002] # HANGUL JONGSEONG KIYEOK-HIEUH -11FF ; [.3B91.0020.0002] # HANGUL JONGSEONG SSANGNIEUN -D7CB ; [.3B92.0020.0002] # HANGUL JONGSEONG NIEUN-RIEUL -D7CC ; [.3B93.0020.0002] # HANGUL JONGSEONG NIEUN-CHIEUCH -D7CD ; [.3B94.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT -D7CE ; [.3B95.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT-PIEUP -D7CF ; [.3B96.0020.0002] # HANGUL JONGSEONG TIKEUT-PIEUP -D7D0 ; [.3B97.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS -D7D1 ; [.3B98.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK -D7D2 ; [.3B99.0020.0002] # HANGUL JONGSEONG TIKEUT-CIEUC -D7D3 ; [.3B9A.0020.0002] # HANGUL JONGSEONG TIKEUT-CHIEUCH -D7D4 ; [.3B9B.0020.0002] # HANGUL JONGSEONG TIKEUT-THIEUTH -D7D5 ; [.3B9C.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGKIYEOK -D7D6 ; [.3B9D.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH -D7D7 ; [.3B9E.0020.0002] # HANGUL JONGSEONG SSANGRIEUL-KHIEUKH -D7D8 ; [.3B9F.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-HIEUH -D7D9 ; [.3BA0.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT -D7DA ; [.3BA1.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH -D7DB ; [.3BA2.0020.0002] # HANGUL JONGSEONG RIEUL-YESIEUNG -D7DC ; [.3BA3.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH -D7DD ; [.3BA4.0020.0002] # HANGUL JONGSEONG KAPYEOUNRIEUL -D7DE ; [.3BA5.0020.0002] # HANGUL JONGSEONG MIEUM-NIEUN -D7DF ; [.3BA6.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGNIEUN -D7E0 ; [.3BA7.0020.0002] # HANGUL JONGSEONG SSANGMIEUM -D7E1 ; [.3BA8.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP-SIOS -D7E2 ; [.3BA9.0020.0002] # HANGUL JONGSEONG MIEUM-CIEUC -D7E3 ; [.3BAA.0020.0002] # HANGUL JONGSEONG PIEUP-TIKEUT -D7E4 ; [.3BAB.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH -D7E5 ; [.3BAC.0020.0002] # HANGUL JONGSEONG PIEUP-MIEUM -D7E6 ; [.3BAD.0020.0002] # HANGUL JONGSEONG SSANGPIEUP -D7E7 ; [.3BAE.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS-TIKEUT -D7E8 ; [.3BAF.0020.0002] # HANGUL JONGSEONG PIEUP-CIEUC -D7E9 ; [.3BB0.0020.0002] # HANGUL JONGSEONG PIEUP-CHIEUCH -D7EA ; [.3BB1.0020.0002] # HANGUL JONGSEONG SIOS-MIEUM -D7EB ; [.3BB2.0020.0002] # HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP -D7EC ; [.3BB3.0020.0002] # HANGUL JONGSEONG SSANGSIOS-KIYEOK -D7ED ; [.3BB4.0020.0002] # HANGUL JONGSEONG SSANGSIOS-TIKEUT -D7EE ; [.3BB5.0020.0002] # HANGUL JONGSEONG SIOS-PANSIOS -D7EF ; [.3BB6.0020.0002] # HANGUL JONGSEONG SIOS-CIEUC -D7F0 ; [.3BB7.0020.0002] # HANGUL JONGSEONG SIOS-CHIEUCH -D7F1 ; [.3BB8.0020.0002] # HANGUL JONGSEONG SIOS-THIEUTH -D7F2 ; [.3BB9.0020.0002] # HANGUL JONGSEONG SIOS-HIEUH -D7F3 ; [.3BBA.0020.0002] # HANGUL JONGSEONG PANSIOS-PIEUP -D7F4 ; [.3BBB.0020.0002] # HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP -D7F5 ; [.3BBC.0020.0002] # HANGUL JONGSEONG YESIEUNG-MIEUM -D7F6 ; [.3BBD.0020.0002] # HANGUL JONGSEONG YESIEUNG-HIEUH -D7F7 ; [.3BBE.0020.0002] # HANGUL JONGSEONG CIEUC-PIEUP -D7F8 ; [.3BBF.0020.0002] # HANGUL JONGSEONG CIEUC-SSANGPIEUP -D7F9 ; [.3BC0.0020.0002] # HANGUL JONGSEONG SSANGCIEUC -D7FA ; [.3BC1.0020.0002] # HANGUL JONGSEONG PHIEUPH-SIOS -D7FB ; [.3BC2.0020.0002] # HANGUL JONGSEONG PHIEUPH-THIEUTH -3041 ; [.3BC3.0020.000D] # HIRAGANA LETTER SMALL A -3042 ; [.3BC3.0020.000E] # HIRAGANA LETTER A -30A1 ; [.3BC3.0020.000F] # KATAKANA LETTER SMALL A -FF67 ; [.3BC3.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL A -30A2 ; [.3BC3.0020.0011] # KATAKANA LETTER A -FF71 ; [.3BC3.0020.0012] # HALFWIDTH KATAKANA LETTER A -32D0 ; [.3BC3.0020.0013] # CIRCLED KATAKANA A -3303 ; [.3BC3.0020.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE AARU -3300 ; [.3BC3.0020.001C][.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD7.0020.001C] # SQUARE APAATO -3301 ; [.3BC3.0020.001C][.3BED.0020.001C][.3BDF.0020.001C][.3BC3.0020.001C] # SQUARE ARUHUA -3302 ; [.3BC3.0020.001C][.3BF4.0020.001C][.3BE0.0020.001C][.0000.0038.001C][.3BC3.0020.001C] # SQUARE ANPEA -3043 ; [.3BC4.0020.000D] # HIRAGANA LETTER SMALL I -3044 ; [.3BC4.0020.000E] # HIRAGANA LETTER I -30A3 ; [.3BC4.0020.000F] # KATAKANA LETTER SMALL I -FF68 ; [.3BC4.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL I -30A4 ; [.3BC4.0020.0011] # KATAKANA LETTER I -FF72 ; [.3BC4.0020.0012] # HALFWIDTH KATAKANA LETTER I -32D1 ; [.3BC4.0020.0013] # CIRCLED KATAKANA I -3304 ; [.3BC4.0020.001C][.3BD9.0020.001C][.3BF4.0020.001C][.3BCB.0020.001C][.0000.0037.001C] # SQUARE ININGU -3305 ; [.3BC4.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C] # SQUARE INTI -3045 ; [.3BC5.0020.000D] # HIRAGANA LETTER SMALL U -3046 ; [.3BC5.0020.000E] # HIRAGANA LETTER U -30A5 ; [.3BC5.0020.000F] # KATAKANA LETTER SMALL U -FF69 ; [.3BC5.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL U -30A6 ; [.3BC5.0020.0011] # KATAKANA LETTER U -FF73 ; [.3BC5.0020.0012] # HALFWIDTH KATAKANA LETTER U -32D2 ; [.3BC5.0020.0013] # CIRCLED KATAKANA U -3094 ; [.3BC5.0020.000E][.0000.0037.0002] # HIRAGANA LETTER VU -30F4 ; [.3BC5.0020.0011][.0000.0037.0002] # KATAKANA LETTER VU -3306 ; [.3BC5.0020.001C][.3BC8.0020.001C][.3BF4.0020.001C] # SQUARE UON -1B000 ; [.3BC6.0020.0011] # KATAKANA LETTER ARCHAIC E -3047 ; [.3BC7.0020.000D] # HIRAGANA LETTER SMALL E -3048 ; [.3BC7.0020.000E] # HIRAGANA LETTER E -30A7 ; [.3BC7.0020.000F] # KATAKANA LETTER SMALL E -FF6A ; [.3BC7.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL E -30A8 ; [.3BC7.0020.0011] # KATAKANA LETTER E -FF74 ; [.3BC7.0020.0012] # HALFWIDTH KATAKANA LETTER E -32D3 ; [.3BC7.0020.0013] # CIRCLED KATAKANA E -3308 ; [.3BC7.0020.001C][.1B89.0020.001C][.3BC9.0020.001C][.1B89.0020.001C] # SQUARE EEKAA -3307 ; [.3BC7.0020.001C][.3BD0.0020.001C][.3BCB.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.0000.0037.001C] # SQUARE ESUKUUDO -3049 ; [.3BC8.0020.000D] # HIRAGANA LETTER SMALL O -304A ; [.3BC8.0020.000E] # HIRAGANA LETTER O -30A9 ; [.3BC8.0020.000F] # KATAKANA LETTER SMALL O -FF6B ; [.3BC8.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL O -30AA ; [.3BC8.0020.0011] # KATAKANA LETTER O -FF75 ; [.3BC8.0020.0012] # HALFWIDTH KATAKANA LETTER O -32D4 ; [.3BC8.0020.0013] # CIRCLED KATAKANA O -330A ; [.3BC8.0020.001C][.1B89.0020.001C][.3BE4.0020.001C] # SQUARE OOMU -3309 ; [.3BC8.0020.001C][.3BF4.0020.001C][.3BD0.0020.001C] # SQUARE ONSU -3095 ; [.3BC9.0020.000D] # HIRAGANA LETTER SMALL KA -304B ; [.3BC9.0020.000E] # HIRAGANA LETTER KA -30F5 ; [.3BC9.0020.000F] # KATAKANA LETTER SMALL KA -30AB ; [.3BC9.0020.0011] # KATAKANA LETTER KA -FF76 ; [.3BC9.0020.0012] # HALFWIDTH KATAKANA LETTER KA -32D5 ; [.3BC9.0020.0013] # CIRCLED KATAKANA KA -304C ; [.3BC9.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GA -30AC ; [.3BC9.0020.0011][.0000.0037.0002] # KATAKANA LETTER GA -330B ; [.3BC9.0020.001C][.3BC4.0020.001C][.3BEC.0020.001C] # SQUARE KAIRI -330C ; [.3BC9.0020.001C][.3BEB.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] # SQUARE KARATTO -330D ; [.3BC9.0020.001C][.3BEF.0020.001C][.3BEC.0020.001C][.1B89.0020.001C] # SQUARE KARORII -330E ; [.3BC9.0020.001C][.0000.0037.001C][.3BEF.0020.001C][.3BF4.0020.001C] # SQUARE GARON -330F ; [.3BC9.0020.001C][.0000.0037.001C][.3BF4.0020.001C][.3BE2.0020.001C] # SQUARE GANMA -304D ; [.3BCA.0020.000E] # HIRAGANA LETTER KI -30AD ; [.3BCA.0020.0011] # KATAKANA LETTER KI -FF77 ; [.3BCA.0020.0012] # HALFWIDTH KATAKANA LETTER KI -32D6 ; [.3BCA.0020.0013] # CIRCLED KATAKANA KI -304E ; [.3BCA.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GI -30AE ; [.3BCA.0020.0011][.0000.0037.0002] # KATAKANA LETTER GI -3310 ; [.3BCA.0020.001C][.0000.0037.001C][.3BC9.0020.001C][.0000.0037.001C] # SQUARE GIGA -3311 ; [.3BCA.0020.001C][.0000.0037.001C][.3BD9.0020.001C][.1B89.0020.001C] # SQUARE GINII -3312 ; [.3BCA.0020.001C][.3BE8.0020.001C][.3BEC.0020.001C][.1B89.0020.001C] # SQUARE KYURII -3313 ; [.3BCA.0020.001C][.0000.0037.001C][.3BED.0020.001C][.3BD3.0020.001C][.0000.0037.001C][.1B89.0020.001C] # SQUARE GIRUDAA -3314 ; [.3BCA.0020.001C][.3BEF.0020.001C] # SQUARE KIRO -3315 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C] # SQUARE KIROGURAMU -3316 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BE5.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] # SQUARE KIROMEETORU -3317 ; [.3BCA.0020.001C][.3BEF.0020.001C][.3BF0.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] # SQUARE KIROWATTO -304F ; [.3BCB.0020.000E] # HIRAGANA LETTER KU -31F0 ; [.3BCB.0020.000F] # KATAKANA LETTER SMALL KU -30AF ; [.3BCB.0020.0011] # KATAKANA LETTER KU -FF78 ; [.3BCB.0020.0012] # HALFWIDTH KATAKANA LETTER KU -32D7 ; [.3BCB.0020.0013] # CIRCLED KATAKANA KU -3050 ; [.3BCB.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GU -30B0 ; [.3BCB.0020.0011][.0000.0037.0002] # KATAKANA LETTER GU -3318 ; [.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C] # SQUARE GURAMU -3319 ; [.3BCB.0020.001C][.0000.0037.001C][.3BEB.0020.001C][.3BE4.0020.001C][.3BD7.0020.001C][.3BF4.0020.001C] # SQUARE GURAMUTON -331A ; [.3BCB.0020.001C][.3BED.0020.001C][.3BD1.0020.001C][.0000.0037.001C][.3BC4.0020.001C][.3BEF.0020.001C] # SQUARE KURUZEIRO -331B ; [.3BCB.0020.001C][.3BEF.0020.001C][.1B89.0020.001C][.3BDB.0020.001C] # SQUARE KUROONE -3096 ; [.3BCC.0020.000D] # HIRAGANA LETTER SMALL KE -3051 ; [.3BCC.0020.000E] # HIRAGANA LETTER KE -30F6 ; [.3BCC.0020.000F] # KATAKANA LETTER SMALL KE -30B1 ; [.3BCC.0020.0011] # KATAKANA LETTER KE -FF79 ; [.3BCC.0020.0012] # HALFWIDTH KATAKANA LETTER KE -32D8 ; [.3BCC.0020.0013] # CIRCLED KATAKANA KE -3052 ; [.3BCC.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GE -30B2 ; [.3BCC.0020.0011][.0000.0037.0002] # KATAKANA LETTER GE -331C ; [.3BCC.0020.001C][.1B89.0020.001C][.3BD0.0020.001C] # SQUARE KEESU -3053 ; [.3BCD.0020.000E] # HIRAGANA LETTER KO -30B3 ; [.3BCD.0020.0011] # KATAKANA LETTER KO -FF7A ; [.3BCD.0020.0012] # HALFWIDTH KATAKANA LETTER KO -32D9 ; [.3BCD.0020.0013] # CIRCLED KATAKANA KO -3054 ; [.3BCD.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GO -30B4 ; [.3BCD.0020.0011][.0000.0037.0002] # KATAKANA LETTER GO -331E ; [.3BCD.0020.001C][.1B89.0020.001C][.3BE1.0020.001C][.0000.0038.001C] # SQUARE KOOPO -1F201 ; [.3BCD.0020.001C][.3BCD.0020.001C] # SQUARED KATAKANA KOKO -30FF ; [.3BCD.0020.0016][.3BD7.0020.0016] # KATAKANA DIGRAPH KOTO -331D ; [.3BCD.0020.001C][.3BED.0020.001C][.3BD8.0020.001C] # SQUARE KORUNA -3055 ; [.3BCE.0020.000E] # HIRAGANA LETTER SA -30B5 ; [.3BCE.0020.0011] # KATAKANA LETTER SA -FF7B ; [.3BCE.0020.0012] # HALFWIDTH KATAKANA LETTER SA -32DA ; [.3BCE.0020.0013] # CIRCLED KATAKANA SA -1F202 ; [.3BCE.0020.001C] # SQUARED KATAKANA SA -3056 ; [.3BCE.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZA -30B6 ; [.3BCE.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZA -331F ; [.3BCE.0020.001C][.3BC4.0020.001C][.3BCB.0020.001C][.3BED.0020.001C] # SQUARE SAIKURU -3320 ; [.3BCE.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C][.1B89.0020.001C][.3BE4.0020.001C] # SQUARE SANTIIMU -3057 ; [.3BCF.0020.000E] # HIRAGANA LETTER SI -31F1 ; [.3BCF.0020.000F] # KATAKANA LETTER SMALL SI -30B7 ; [.3BCF.0020.0011] # KATAKANA LETTER SI -FF7C ; [.3BCF.0020.0012] # HALFWIDTH KATAKANA LETTER SI -32DB ; [.3BCF.0020.0013] # CIRCLED KATAKANA SI -3058 ; [.3BCF.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZI -30B8 ; [.3BCF.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZI -3006 ; [.3BCF.0020.0004][.3BE5.0020.0004] # IDEOGRAPHIC CLOSING MARK -3321 ; [.3BCF.0020.001C][.3BEC.0020.001C][.3BF4.0020.001C][.3BCB.0020.001C][.0000.0037.001C] # SQUARE SIRINGU -3059 ; [.3BD0.0020.000E] # HIRAGANA LETTER SU -31F2 ; [.3BD0.0020.000F] # KATAKANA LETTER SMALL SU -30B9 ; [.3BD0.0020.0011] # KATAKANA LETTER SU -FF7D ; [.3BD0.0020.0012] # HALFWIDTH KATAKANA LETTER SU -32DC ; [.3BD0.0020.0013] # CIRCLED KATAKANA SU -305A ; [.3BD0.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZU -30BA ; [.3BD0.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZU -305B ; [.3BD1.0020.000E] # HIRAGANA LETTER SE -30BB ; [.3BD1.0020.0011] # KATAKANA LETTER SE -FF7E ; [.3BD1.0020.0012] # HALFWIDTH KATAKANA LETTER SE -32DD ; [.3BD1.0020.0013] # CIRCLED KATAKANA SE -305C ; [.3BD1.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZE -30BC ; [.3BD1.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZE -3322 ; [.3BD1.0020.001C][.3BF4.0020.001C][.3BD4.0020.001C] # SQUARE SENTI -3323 ; [.3BD1.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] # SQUARE SENTO -305D ; [.3BD2.0020.000E] # HIRAGANA LETTER SO -30BD ; [.3BD2.0020.0011] # KATAKANA LETTER SO -FF7F ; [.3BD2.0020.0012] # HALFWIDTH KATAKANA LETTER SO -32DE ; [.3BD2.0020.0013] # CIRCLED KATAKANA SO -305E ; [.3BD2.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZO -30BE ; [.3BD2.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZO -305F ; [.3BD3.0020.000E] # HIRAGANA LETTER TA -30BF ; [.3BD3.0020.0011] # KATAKANA LETTER TA -FF80 ; [.3BD3.0020.0012] # HALFWIDTH KATAKANA LETTER TA -32DF ; [.3BD3.0020.0013] # CIRCLED KATAKANA TA -3060 ; [.3BD3.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DA -30C0 ; [.3BD3.0020.0011][.0000.0037.0002] # KATAKANA LETTER DA -3324 ; [.3BD3.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BD0.0020.001C] # SQUARE DAASU -3061 ; [.3BD4.0020.000E] # HIRAGANA LETTER TI -30C1 ; [.3BD4.0020.0011] # KATAKANA LETTER TI -FF81 ; [.3BD4.0020.0012] # HALFWIDTH KATAKANA LETTER TI -32E0 ; [.3BD4.0020.0013] # CIRCLED KATAKANA TI -3062 ; [.3BD4.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DI -30C2 ; [.3BD4.0020.0011][.0000.0037.0002] # KATAKANA LETTER DI -3063 ; [.3BD5.0020.000D] # HIRAGANA LETTER SMALL TU -3064 ; [.3BD5.0020.000E] # HIRAGANA LETTER TU -30C3 ; [.3BD5.0020.000F] # KATAKANA LETTER SMALL TU -FF6F ; [.3BD5.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL TU -30C4 ; [.3BD5.0020.0011] # KATAKANA LETTER TU -FF82 ; [.3BD5.0020.0012] # HALFWIDTH KATAKANA LETTER TU -32E1 ; [.3BD5.0020.0013] # CIRCLED KATAKANA TU -3065 ; [.3BD5.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DU -30C5 ; [.3BD5.0020.0011][.0000.0037.0002] # KATAKANA LETTER DU -3066 ; [.3BD6.0020.000E] # HIRAGANA LETTER TE -30C6 ; [.3BD6.0020.0011] # KATAKANA LETTER TE -FF83 ; [.3BD6.0020.0012] # HALFWIDTH KATAKANA LETTER TE -32E2 ; [.3BD6.0020.0013] # CIRCLED KATAKANA TE -3067 ; [.3BD6.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DE -30C7 ; [.3BD6.0020.0011][.0000.0037.0002] # KATAKANA LETTER DE -1F213 ; [.3BD6.0020.001C][.0000.0037.001C] # SQUARED KATAKANA DE -3325 ; [.3BD6.0020.001C][.0000.0037.001C][.3BCF.0020.001C] # SQUARE DESI -3068 ; [.3BD7.0020.000E] # HIRAGANA LETTER TO -31F3 ; [.3BD7.0020.000F] # KATAKANA LETTER SMALL TO -30C8 ; [.3BD7.0020.0011] # KATAKANA LETTER TO -FF84 ; [.3BD7.0020.0012] # HALFWIDTH KATAKANA LETTER TO -32E3 ; [.3BD7.0020.0013] # CIRCLED KATAKANA TO -3069 ; [.3BD7.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DO -30C9 ; [.3BD7.0020.0011][.0000.0037.0002] # KATAKANA LETTER DO -3326 ; [.3BD7.0020.001C][.0000.0037.001C][.3BED.0020.001C] # SQUARE DORU -3327 ; [.3BD7.0020.001C][.3BF4.0020.001C] # SQUARE TON -306A ; [.3BD8.0020.000E] # HIRAGANA LETTER NA -30CA ; [.3BD8.0020.0011] # KATAKANA LETTER NA -FF85 ; [.3BD8.0020.0012] # HALFWIDTH KATAKANA LETTER NA -32E4 ; [.3BD8.0020.0013] # CIRCLED KATAKANA NA -3328 ; [.3BD8.0020.001C][.3BDC.0020.001C] # SQUARE NANO -306B ; [.3BD9.0020.000E] # HIRAGANA LETTER NI -30CB ; [.3BD9.0020.0011] # KATAKANA LETTER NI -FF86 ; [.3BD9.0020.0012] # HALFWIDTH KATAKANA LETTER NI -32E5 ; [.3BD9.0020.0013] # CIRCLED KATAKANA NI -306C ; [.3BDA.0020.000E] # HIRAGANA LETTER NU -31F4 ; [.3BDA.0020.000F] # KATAKANA LETTER SMALL NU -30CC ; [.3BDA.0020.0011] # KATAKANA LETTER NU -FF87 ; [.3BDA.0020.0012] # HALFWIDTH KATAKANA LETTER NU -32E6 ; [.3BDA.0020.0013] # CIRCLED KATAKANA NU -306D ; [.3BDB.0020.000E] # HIRAGANA LETTER NE -30CD ; [.3BDB.0020.0011] # KATAKANA LETTER NE -FF88 ; [.3BDB.0020.0012] # HALFWIDTH KATAKANA LETTER NE -32E7 ; [.3BDB.0020.0013] # CIRCLED KATAKANA NE -306E ; [.3BDC.0020.000E] # HIRAGANA LETTER NO -30CE ; [.3BDC.0020.0011] # KATAKANA LETTER NO -FF89 ; [.3BDC.0020.0012] # HALFWIDTH KATAKANA LETTER NO -32E8 ; [.3BDC.0020.0013] # CIRCLED KATAKANA NO -3329 ; [.3BDC.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] # SQUARE NOTTO -306F ; [.3BDD.0020.000E] # HIRAGANA LETTER HA -31F5 ; [.3BDD.0020.000F] # KATAKANA LETTER SMALL HA -30CF ; [.3BDD.0020.0011] # KATAKANA LETTER HA -FF8A ; [.3BDD.0020.0012] # HALFWIDTH KATAKANA LETTER HA -32E9 ; [.3BDD.0020.0013] # CIRCLED KATAKANA HA -3070 ; [.3BDD.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BA -30D0 ; [.3BDD.0020.0011][.0000.0037.0002] # KATAKANA LETTER BA -3071 ; [.3BDD.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PA -30D1 ; [.3BDD.0020.0011][.0000.0038.0002] # KATAKANA LETTER PA -332B ; [.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD1.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] # SQUARE PAASENTO -332C ; [.3BDD.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BD5.0020.001C] # SQUARE PAATU -332D ; [.3BDD.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BEE.0020.001C][.3BED.0020.001C] # SQUARE BAARERU -332A ; [.3BDD.0020.001C][.3BC4.0020.001C][.3BD5.0020.001C] # SQUARE HAITU -3072 ; [.3BDE.0020.000E] # HIRAGANA LETTER HI -31F6 ; [.3BDE.0020.000F] # KATAKANA LETTER SMALL HI -30D2 ; [.3BDE.0020.0011] # KATAKANA LETTER HI -FF8B ; [.3BDE.0020.0012] # HALFWIDTH KATAKANA LETTER HI -32EA ; [.3BDE.0020.0013] # CIRCLED KATAKANA HI -3073 ; [.3BDE.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BI -30D3 ; [.3BDE.0020.0011][.0000.0037.0002] # KATAKANA LETTER BI -3074 ; [.3BDE.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PI -30D4 ; [.3BDE.0020.0011][.0000.0038.0002] # KATAKANA LETTER PI -332E ; [.3BDE.0020.001C][.0000.0038.001C][.3BC3.0020.001C][.3BD0.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] # SQUARE PIASUTORU -332F ; [.3BDE.0020.001C][.0000.0038.001C][.3BCB.0020.001C][.3BED.0020.001C] # SQUARE PIKURU -3330 ; [.3BDE.0020.001C][.0000.0038.001C][.3BCD.0020.001C] # SQUARE PIKO -3331 ; [.3BDE.0020.001C][.0000.0037.001C][.3BED.0020.001C] # SQUARE BIRU -3075 ; [.3BDF.0020.000E] # HIRAGANA LETTER HU -31F7 ; [.3BDF.0020.000F] # KATAKANA LETTER SMALL HU -30D5 ; [.3BDF.0020.0011] # KATAKANA LETTER HU -FF8C ; [.3BDF.0020.0012] # HALFWIDTH KATAKANA LETTER HU -32EB ; [.3BDF.0020.0013] # CIRCLED KATAKANA HU -3076 ; [.3BDF.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BU -30D6 ; [.3BDF.0020.0011][.0000.0037.0002] # KATAKANA LETTER BU -3077 ; [.3BDF.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PU -30D7 ; [.3BDF.0020.0011][.0000.0038.0002] # KATAKANA LETTER PU -3332 ; [.3BDF.0020.001C][.3BC3.0020.001C][.3BEB.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C][.0000.0037.001C] # SQUARE HUARADDO -3333 ; [.3BDF.0020.001C][.3BC4.0020.001C][.1B89.0020.001C][.3BD7.0020.001C] # SQUARE HUIITO -3334 ; [.3BDF.0020.001C][.0000.0037.001C][.3BD5.0020.001C][.3BCF.0020.001C][.3BC7.0020.001C][.3BED.0020.001C] # SQUARE BUSSYERU -3335 ; [.3BDF.0020.001C][.3BEB.0020.001C][.3BF4.0020.001C] # SQUARE HURAN -3078 ; [.3BE0.0020.000E] # HIRAGANA LETTER HE -31F8 ; [.3BE0.0020.000F] # KATAKANA LETTER SMALL HE -30D8 ; [.3BE0.0020.0011] # KATAKANA LETTER HE -FF8D ; [.3BE0.0020.0012] # HALFWIDTH KATAKANA LETTER HE -32EC ; [.3BE0.0020.0013] # CIRCLED KATAKANA HE -3079 ; [.3BE0.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BE -30D9 ; [.3BE0.0020.0011][.0000.0037.0002] # KATAKANA LETTER BE -307A ; [.3BE0.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PE -30DA ; [.3BE0.0020.0011][.0000.0038.0002] # KATAKANA LETTER PE -333B ; [.3BE0.0020.001C][.0000.0038.001C][.1B89.0020.001C][.3BCF.0020.001C][.0000.0037.001C] # SQUARE PEEZI -333C ; [.3BE0.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BD3.0020.001C] # SQUARE BEETA -3336 ; [.3BE0.0020.001C][.3BCB.0020.001C][.3BD3.0020.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE HEKUTAARU -3337 ; [.3BE0.0020.001C][.0000.0038.001C][.3BD2.0020.001C] # SQUARE PESO -3338 ; [.3BE0.0020.001C][.0000.0038.001C][.3BD9.0020.001C][.3BDE.0020.001C] # SQUARE PENIHI -3339 ; [.3BE0.0020.001C][.3BED.0020.001C][.3BD5.0020.001C] # SQUARE HERUTU -333A ; [.3BE0.0020.001C][.0000.0038.001C][.3BF4.0020.001C][.3BD0.0020.001C] # SQUARE PENSU -307B ; [.3BE1.0020.000E] # HIRAGANA LETTER HO -31F9 ; [.3BE1.0020.000F] # KATAKANA LETTER SMALL HO -30DB ; [.3BE1.0020.0011] # KATAKANA LETTER HO -FF8E ; [.3BE1.0020.0012] # HALFWIDTH KATAKANA LETTER HO -32ED ; [.3BE1.0020.0013] # CIRCLED KATAKANA HO -307C ; [.3BE1.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BO -30DC ; [.3BE1.0020.0011][.0000.0037.0002] # KATAKANA LETTER BO -307D ; [.3BE1.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PO -30DD ; [.3BE1.0020.0011][.0000.0038.0002] # KATAKANA LETTER PO -3341 ; [.3BE1.0020.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE HOORU -3342 ; [.3BE1.0020.001C][.1B89.0020.001C][.3BF4.0020.001C] # SQUARE HOON -333D ; [.3BE1.0020.001C][.0000.0038.001C][.3BC4.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C] # SQUARE POINTO -1F200 ; [.3BE1.0020.001C][.3BC9.0020.001C] # SQUARE HIRAGANA HOKA -333E ; [.3BE1.0020.001C][.0000.0037.001C][.3BED.0020.001C][.3BD7.0020.001C] # SQUARE BORUTO -333F ; [.3BE1.0020.001C][.3BF4.0020.001C] # SQUARE HON -3340 ; [.3BE1.0020.001C][.0000.0038.001C][.3BF4.0020.001C][.3BD7.0020.001C][.0000.0037.001C] # SQUARE PONDO -307E ; [.3BE2.0020.000E] # HIRAGANA LETTER MA -30DE ; [.3BE2.0020.0011] # KATAKANA LETTER MA -FF8F ; [.3BE2.0020.0012] # HALFWIDTH KATAKANA LETTER MA -32EE ; [.3BE2.0020.0013] # CIRCLED KATAKANA MA -3343 ; [.3BE2.0020.001C][.3BC4.0020.001C][.3BCB.0020.001C][.3BEF.0020.001C] # SQUARE MAIKURO -3344 ; [.3BE2.0020.001C][.3BC4.0020.001C][.3BED.0020.001C] # SQUARE MAIRU -303C ; [.3BE2.0020.0004][.3BD0.0020.0004] # MASU MARK -3345 ; [.3BE2.0020.001C][.3BD5.0020.001C][.3BDD.0020.001C] # SQUARE MAHHA -3346 ; [.3BE2.0020.001C][.3BED.0020.001C][.3BCB.0020.001C] # SQUARE MARUKU -3347 ; [.3BE2.0020.001C][.3BF4.0020.001C][.3BCF.0020.001C][.3BEA.0020.001C][.3BF4.0020.001C] # SQUARE MANSYON -307F ; [.3BE3.0020.000E] # HIRAGANA LETTER MI -30DF ; [.3BE3.0020.0011] # KATAKANA LETTER MI -FF90 ; [.3BE3.0020.0012] # HALFWIDTH KATAKANA LETTER MI -32EF ; [.3BE3.0020.0013] # CIRCLED KATAKANA MI -3348 ; [.3BE3.0020.001C][.3BCB.0020.001C][.3BEF.0020.001C][.3BF4.0020.001C] # SQUARE MIKURON -3349 ; [.3BE3.0020.001C][.3BEC.0020.001C] # SQUARE MIRI -334A ; [.3BE3.0020.001C][.3BEC.0020.001C][.3BDD.0020.001C][.0000.0037.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE MIRIBAARU -3080 ; [.3BE4.0020.000E] # HIRAGANA LETTER MU -31FA ; [.3BE4.0020.000F] # KATAKANA LETTER SMALL MU -30E0 ; [.3BE4.0020.0011] # KATAKANA LETTER MU -FF91 ; [.3BE4.0020.0012] # HALFWIDTH KATAKANA LETTER MU -32F0 ; [.3BE4.0020.0013] # CIRCLED KATAKANA MU -3081 ; [.3BE5.0020.000E] # HIRAGANA LETTER ME -30E1 ; [.3BE5.0020.0011] # KATAKANA LETTER ME -FF92 ; [.3BE5.0020.0012] # HALFWIDTH KATAKANA LETTER ME -32F1 ; [.3BE5.0020.0013] # CIRCLED KATAKANA ME -334D ; [.3BE5.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] # SQUARE MEETORU -334B ; [.3BE5.0020.001C][.3BC9.0020.001C][.0000.0037.001C] # SQUARE MEGA -334C ; [.3BE5.0020.001C][.3BC9.0020.001C][.0000.0037.001C][.3BD7.0020.001C][.3BF4.0020.001C] # SQUARE MEGATON -3082 ; [.3BE6.0020.000E] # HIRAGANA LETTER MO -30E2 ; [.3BE6.0020.0011] # KATAKANA LETTER MO -FF93 ; [.3BE6.0020.0012] # HALFWIDTH KATAKANA LETTER MO -32F2 ; [.3BE6.0020.0013] # CIRCLED KATAKANA MO -3083 ; [.3BE7.0020.000D] # HIRAGANA LETTER SMALL YA -3084 ; [.3BE7.0020.000E] # HIRAGANA LETTER YA -30E3 ; [.3BE7.0020.000F] # KATAKANA LETTER SMALL YA -FF6C ; [.3BE7.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YA -30E4 ; [.3BE7.0020.0011] # KATAKANA LETTER YA -FF94 ; [.3BE7.0020.0012] # HALFWIDTH KATAKANA LETTER YA -32F3 ; [.3BE7.0020.0013] # CIRCLED KATAKANA YA -334E ; [.3BE7.0020.001C][.1B89.0020.001C][.3BD7.0020.001C][.0000.0037.001C] # SQUARE YAADO -334F ; [.3BE7.0020.001C][.1B89.0020.001C][.3BED.0020.001C] # SQUARE YAARU -3085 ; [.3BE8.0020.000D] # HIRAGANA LETTER SMALL YU -3086 ; [.3BE8.0020.000E] # HIRAGANA LETTER YU -30E5 ; [.3BE8.0020.000F] # KATAKANA LETTER SMALL YU -FF6D ; [.3BE8.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YU -30E6 ; [.3BE8.0020.0011] # KATAKANA LETTER YU -FF95 ; [.3BE8.0020.0012] # HALFWIDTH KATAKANA LETTER YU -32F4 ; [.3BE8.0020.0013] # CIRCLED KATAKANA YU -3350 ; [.3BE8.0020.001C][.3BC3.0020.001C][.3BF4.0020.001C] # SQUARE YUAN -1B001 ; [.3BE9.0020.000E] # HIRAGANA LETTER ARCHAIC YE -3087 ; [.3BEA.0020.000D] # HIRAGANA LETTER SMALL YO -3088 ; [.3BEA.0020.000E] # HIRAGANA LETTER YO -30E7 ; [.3BEA.0020.000F] # KATAKANA LETTER SMALL YO -FF6E ; [.3BEA.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YO -30E8 ; [.3BEA.0020.0011] # KATAKANA LETTER YO -FF96 ; [.3BEA.0020.0012] # HALFWIDTH KATAKANA LETTER YO -32F5 ; [.3BEA.0020.0013] # CIRCLED KATAKANA YO -309F ; [.3BEA.0020.0016][.3BEC.0020.0016] # HIRAGANA DIGRAPH YORI -3089 ; [.3BEB.0020.000E] # HIRAGANA LETTER RA -31FB ; [.3BEB.0020.000F] # KATAKANA LETTER SMALL RA -30E9 ; [.3BEB.0020.0011] # KATAKANA LETTER RA -FF97 ; [.3BEB.0020.0012] # HALFWIDTH KATAKANA LETTER RA -32F6 ; [.3BEB.0020.0013] # CIRCLED KATAKANA RA -308A ; [.3BEC.0020.000E] # HIRAGANA LETTER RI -31FC ; [.3BEC.0020.000F] # KATAKANA LETTER SMALL RI -30EA ; [.3BEC.0020.0011] # KATAKANA LETTER RI -FF98 ; [.3BEC.0020.0012] # HALFWIDTH KATAKANA LETTER RI -32F7 ; [.3BEC.0020.0013] # CIRCLED KATAKANA RI -3351 ; [.3BEC.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C][.3BED.0020.001C] # SQUARE RITTORU -3352 ; [.3BEC.0020.001C][.3BEB.0020.001C] # SQUARE RIRA -308B ; [.3BED.0020.000E] # HIRAGANA LETTER RU -31FD ; [.3BED.0020.000F] # KATAKANA LETTER SMALL RU -30EB ; [.3BED.0020.0011] # KATAKANA LETTER RU -FF99 ; [.3BED.0020.0012] # HALFWIDTH KATAKANA LETTER RU -32F8 ; [.3BED.0020.0013] # CIRCLED KATAKANA RU -3354 ; [.3BED.0020.001C][.1B89.0020.001C][.3BDF.0020.001C][.0000.0037.001C][.3BED.0020.001C] # SQUARE RUUBURU -3353 ; [.3BED.0020.001C][.3BDE.0020.001C][.0000.0038.001C][.1B89.0020.001C] # SQUARE RUPII -308C ; [.3BEE.0020.000E] # HIRAGANA LETTER RE -31FE ; [.3BEE.0020.000F] # KATAKANA LETTER SMALL RE -30EC ; [.3BEE.0020.0011] # KATAKANA LETTER RE -FF9A ; [.3BEE.0020.0012] # HALFWIDTH KATAKANA LETTER RE -32F9 ; [.3BEE.0020.0013] # CIRCLED KATAKANA RE -3355 ; [.3BEE.0020.001C][.3BE4.0020.001C] # SQUARE REMU -3356 ; [.3BEE.0020.001C][.3BF4.0020.001C][.3BD7.0020.001C][.3BCC.0020.001C][.0000.0037.001C][.3BF4.0020.001C] # SQUARE RENTOGEN -308D ; [.3BEF.0020.000E] # HIRAGANA LETTER RO -31FF ; [.3BEF.0020.000F] # KATAKANA LETTER SMALL RO -30ED ; [.3BEF.0020.0011] # KATAKANA LETTER RO -FF9B ; [.3BEF.0020.0012] # HALFWIDTH KATAKANA LETTER RO -32FA ; [.3BEF.0020.0013] # CIRCLED KATAKANA RO -308E ; [.3BF0.0020.000D] # HIRAGANA LETTER SMALL WA -308F ; [.3BF0.0020.000E] # HIRAGANA LETTER WA -30EE ; [.3BF0.0020.000F] # KATAKANA LETTER SMALL WA -30EF ; [.3BF0.0020.0011] # KATAKANA LETTER WA -FF9C ; [.3BF0.0020.0012] # HALFWIDTH KATAKANA LETTER WA -32FB ; [.3BF0.0020.0013] # CIRCLED KATAKANA WA -30F7 ; [.3BF0.0020.0011][.0000.0037.0002] # KATAKANA LETTER VA -3357 ; [.3BF0.0020.001C][.3BD5.0020.001C][.3BD7.0020.001C] # SQUARE WATTO -3090 ; [.3BF1.0020.000E] # HIRAGANA LETTER WI -30F0 ; [.3BF1.0020.0011] # KATAKANA LETTER WI -32FC ; [.3BF1.0020.0013] # CIRCLED KATAKANA WI -30F8 ; [.3BF1.0020.0011][.0000.0037.0002] # KATAKANA LETTER VI -3091 ; [.3BF2.0020.000E] # HIRAGANA LETTER WE -30F1 ; [.3BF2.0020.0011] # KATAKANA LETTER WE -32FD ; [.3BF2.0020.0013] # CIRCLED KATAKANA WE -30F9 ; [.3BF2.0020.0011][.0000.0037.0002] # KATAKANA LETTER VE -3092 ; [.3BF3.0020.000E] # HIRAGANA LETTER WO -30F2 ; [.3BF3.0020.0011] # KATAKANA LETTER WO -FF66 ; [.3BF3.0020.0012] # HALFWIDTH KATAKANA LETTER WO -32FE ; [.3BF3.0020.0013] # CIRCLED KATAKANA WO -30FA ; [.3BF3.0020.0011][.0000.0037.0002] # KATAKANA LETTER VO -3093 ; [.3BF4.0020.000E] # HIRAGANA LETTER N -30F3 ; [.3BF4.0020.0011] # KATAKANA LETTER N -FF9D ; [.3BF4.0020.0012] # HALFWIDTH KATAKANA LETTER N -3105 ; [.3BF5.0020.0002] # BOPOMOFO LETTER B -31A0 ; [.3BF5.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER BU -3106 ; [.3BF6.0020.0002] # BOPOMOFO LETTER P -31B4 ; [.3BF6.0020.0019] # BOPOMOFO FINAL LETTER P -3107 ; [.3BF7.0020.0002] # BOPOMOFO LETTER M -3108 ; [.3BF8.0020.0002] # BOPOMOFO LETTER F -312A ; [.3BF9.0020.0002] # BOPOMOFO LETTER V -3109 ; [.3BFA.0020.0002] # BOPOMOFO LETTER D -310A ; [.3BFB.0020.0002] # BOPOMOFO LETTER T -31B5 ; [.3BFB.0020.0019] # BOPOMOFO FINAL LETTER T -310B ; [.3BFC.0020.0002] # BOPOMOFO LETTER N -310C ; [.3BFD.0020.0002] # BOPOMOFO LETTER L -310D ; [.3BFE.0020.0002] # BOPOMOFO LETTER G -31A3 ; [.3BFE.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER GU -310E ; [.3BFF.0020.0002] # BOPOMOFO LETTER K -31B6 ; [.3BFF.0020.0019] # BOPOMOFO FINAL LETTER K -312B ; [.3C00.0020.0002] # BOPOMOFO LETTER NG -31AD ; [.3C01.0020.0002] # BOPOMOFO LETTER NGG -310F ; [.3C02.0020.0002] # BOPOMOFO LETTER H -31B7 ; [.3C02.0020.0019] # BOPOMOFO FINAL LETTER H -3110 ; [.3C03.0020.0002] # BOPOMOFO LETTER J -31A2 ; [.3C03.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER JI -3111 ; [.3C04.0020.0002] # BOPOMOFO LETTER Q -3112 ; [.3C05.0020.0002] # BOPOMOFO LETTER X -312C ; [.3C06.0020.0002] # BOPOMOFO LETTER GN -3113 ; [.3C07.0020.0002] # BOPOMOFO LETTER ZH -3114 ; [.3C08.0020.0002] # BOPOMOFO LETTER CH -3115 ; [.3C09.0020.0002] # BOPOMOFO LETTER SH -3116 ; [.3C0A.0020.0002] # BOPOMOFO LETTER R -3117 ; [.3C0B.0020.0002] # BOPOMOFO LETTER Z -31A1 ; [.3C0B.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER ZI -3118 ; [.3C0C.0020.0002] # BOPOMOFO LETTER C -3119 ; [.3C0D.0020.0002] # BOPOMOFO LETTER S -31B8 ; [.3C0E.0020.0002] # BOPOMOFO LETTER GH -31B9 ; [.3C0F.0020.0002] # BOPOMOFO LETTER LH -31BA ; [.3C10.0020.0002] # BOPOMOFO LETTER ZY -311A ; [.3C11.0020.0002] # BOPOMOFO LETTER A -31A9 ; [.3C11.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER ANN -311B ; [.3C12.0020.0002] # BOPOMOFO LETTER O -31A7 ; [.3C12.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER ONN -31A6 ; [.3C13.0020.0002] # BOPOMOFO LETTER OO -311C ; [.3C14.0020.0002] # BOPOMOFO LETTER E -311D ; [.3C15.0020.0002] # BOPOMOFO LETTER EH -31A4 ; [.3C16.0020.0002] # BOPOMOFO LETTER EE -31A5 ; [.3C16.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER ENN -311E ; [.3C17.0020.0002] # BOPOMOFO LETTER AI -31AE ; [.3C17.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER AINN -311F ; [.3C18.0020.0002] # BOPOMOFO LETTER EI -3120 ; [.3C19.0020.0002] # BOPOMOFO LETTER AU -31AF ; [.3C19.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER AUNN -3121 ; [.3C1A.0020.0002] # BOPOMOFO LETTER OU -3122 ; [.3C1B.0020.0002] # BOPOMOFO LETTER AN -3123 ; [.3C1C.0020.0002] # BOPOMOFO LETTER EN -3124 ; [.3C1D.0020.0002] # BOPOMOFO LETTER ANG -31B2 ; [.3C1E.0020.0002] # BOPOMOFO LETTER ONG -3125 ; [.3C1F.0020.0002] # BOPOMOFO LETTER ENG -31B0 ; [.3C20.0020.0002] # BOPOMOFO LETTER AM -31B1 ; [.3C21.0020.0002] # BOPOMOFO LETTER OM -31AC ; [.3C22.0020.0002] # BOPOMOFO LETTER IM -3126 ; [.3C23.0020.0002] # BOPOMOFO LETTER ER -3127 ; [.3C24.0020.0002] # BOPOMOFO LETTER I -31AA ; [.3C24.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER INN -31B3 ; [.3C24.0020.0016][.0000.010C.0016] # BOPOMOFO LETTER INNN -3128 ; [.3C25.0020.0002] # BOPOMOFO LETTER U -31AB ; [.3C25.0020.0004][.0000.010C.0004] # BOPOMOFO LETTER UNN -31A8 ; [.3C25.0020.0004][.0000.010D.0004] # BOPOMOFO LETTER IR -3129 ; [.3C26.0020.0002] # BOPOMOFO LETTER IU -312D ; [.3C27.0020.0002] # BOPOMOFO LETTER IH -A000 ; [.3C28.0020.0002] # YI SYLLABLE IT -A001 ; [.3C29.0020.0002] # YI SYLLABLE IX -A002 ; [.3C2A.0020.0002] # YI SYLLABLE I -A003 ; [.3C2B.0020.0002] # YI SYLLABLE IP -A004 ; [.3C2C.0020.0002] # YI SYLLABLE IET -A005 ; [.3C2D.0020.0002] # YI SYLLABLE IEX -A006 ; [.3C2E.0020.0002] # YI SYLLABLE IE -A007 ; [.3C2F.0020.0002] # YI SYLLABLE IEP -A008 ; [.3C30.0020.0002] # YI SYLLABLE AT -A009 ; [.3C31.0020.0002] # YI SYLLABLE AX -A00A ; [.3C32.0020.0002] # YI SYLLABLE A -A00B ; [.3C33.0020.0002] # YI SYLLABLE AP -A00C ; [.3C34.0020.0002] # YI SYLLABLE UOX -A00D ; [.3C35.0020.0002] # YI SYLLABLE UO -A00E ; [.3C36.0020.0002] # YI SYLLABLE UOP -A00F ; [.3C37.0020.0002] # YI SYLLABLE OT -A010 ; [.3C38.0020.0002] # YI SYLLABLE OX -A011 ; [.3C39.0020.0002] # YI SYLLABLE O -A012 ; [.3C3A.0020.0002] # YI SYLLABLE OP -A013 ; [.3C3B.0020.0002] # YI SYLLABLE EX -A014 ; [.3C3C.0020.0002] # YI SYLLABLE E -A015 ; [.3C3D.0020.0002] # YI SYLLABLE WU -A016 ; [.3C3E.0020.0002] # YI SYLLABLE BIT -A017 ; [.3C3F.0020.0002] # YI SYLLABLE BIX -A018 ; [.3C40.0020.0002] # YI SYLLABLE BI -A019 ; [.3C41.0020.0002] # YI SYLLABLE BIP -A01A ; [.3C42.0020.0002] # YI SYLLABLE BIET -A01B ; [.3C43.0020.0002] # YI SYLLABLE BIEX -A01C ; [.3C44.0020.0002] # YI SYLLABLE BIE -A01D ; [.3C45.0020.0002] # YI SYLLABLE BIEP -A01E ; [.3C46.0020.0002] # YI SYLLABLE BAT -A01F ; [.3C47.0020.0002] # YI SYLLABLE BAX -A020 ; [.3C48.0020.0002] # YI SYLLABLE BA -A021 ; [.3C49.0020.0002] # YI SYLLABLE BAP -A022 ; [.3C4A.0020.0002] # YI SYLLABLE BUOX -A023 ; [.3C4B.0020.0002] # YI SYLLABLE BUO -A024 ; [.3C4C.0020.0002] # YI SYLLABLE BUOP -A025 ; [.3C4D.0020.0002] # YI SYLLABLE BOT -A026 ; [.3C4E.0020.0002] # YI SYLLABLE BOX -A027 ; [.3C4F.0020.0002] # YI SYLLABLE BO -A028 ; [.3C50.0020.0002] # YI SYLLABLE BOP -A029 ; [.3C51.0020.0002] # YI SYLLABLE BEX -A02A ; [.3C52.0020.0002] # YI SYLLABLE BE -A02B ; [.3C53.0020.0002] # YI SYLLABLE BEP -A02C ; [.3C54.0020.0002] # YI SYLLABLE BUT -A02D ; [.3C55.0020.0002] # YI SYLLABLE BUX -A02E ; [.3C56.0020.0002] # YI SYLLABLE BU -A02F ; [.3C57.0020.0002] # YI SYLLABLE BUP -A030 ; [.3C58.0020.0002] # YI SYLLABLE BURX -A031 ; [.3C59.0020.0002] # YI SYLLABLE BUR -A032 ; [.3C5A.0020.0002] # YI SYLLABLE BYT -A033 ; [.3C5B.0020.0002] # YI SYLLABLE BYX -A034 ; [.3C5C.0020.0002] # YI SYLLABLE BY -A035 ; [.3C5D.0020.0002] # YI SYLLABLE BYP -A036 ; [.3C5E.0020.0002] # YI SYLLABLE BYRX -A037 ; [.3C5F.0020.0002] # YI SYLLABLE BYR -A038 ; [.3C60.0020.0002] # YI SYLLABLE PIT -A039 ; [.3C61.0020.0002] # YI SYLLABLE PIX -A03A ; [.3C62.0020.0002] # YI SYLLABLE PI -A03B ; [.3C63.0020.0002] # YI SYLLABLE PIP -A03C ; [.3C64.0020.0002] # YI SYLLABLE PIEX -A03D ; [.3C65.0020.0002] # YI SYLLABLE PIE -A03E ; [.3C66.0020.0002] # YI SYLLABLE PIEP -A03F ; [.3C67.0020.0002] # YI SYLLABLE PAT -A040 ; [.3C68.0020.0002] # YI SYLLABLE PAX -A041 ; [.3C69.0020.0002] # YI SYLLABLE PA -A042 ; [.3C6A.0020.0002] # YI SYLLABLE PAP -A043 ; [.3C6B.0020.0002] # YI SYLLABLE PUOX -A044 ; [.3C6C.0020.0002] # YI SYLLABLE PUO -A045 ; [.3C6D.0020.0002] # YI SYLLABLE PUOP -A046 ; [.3C6E.0020.0002] # YI SYLLABLE POT -A047 ; [.3C6F.0020.0002] # YI SYLLABLE POX -A048 ; [.3C70.0020.0002] # YI SYLLABLE PO -A049 ; [.3C71.0020.0002] # YI SYLLABLE POP -A04A ; [.3C72.0020.0002] # YI SYLLABLE PUT -A04B ; [.3C73.0020.0002] # YI SYLLABLE PUX -A04C ; [.3C74.0020.0002] # YI SYLLABLE PU -A04D ; [.3C75.0020.0002] # YI SYLLABLE PUP -A04E ; [.3C76.0020.0002] # YI SYLLABLE PURX -A04F ; [.3C77.0020.0002] # YI SYLLABLE PUR -A050 ; [.3C78.0020.0002] # YI SYLLABLE PYT -A051 ; [.3C79.0020.0002] # YI SYLLABLE PYX -A052 ; [.3C7A.0020.0002] # YI SYLLABLE PY -A053 ; [.3C7B.0020.0002] # YI SYLLABLE PYP -A054 ; [.3C7C.0020.0002] # YI SYLLABLE PYRX -A055 ; [.3C7D.0020.0002] # YI SYLLABLE PYR -A056 ; [.3C7E.0020.0002] # YI SYLLABLE BBIT -A057 ; [.3C7F.0020.0002] # YI SYLLABLE BBIX -A058 ; [.3C80.0020.0002] # YI SYLLABLE BBI -A059 ; [.3C81.0020.0002] # YI SYLLABLE BBIP -A05A ; [.3C82.0020.0002] # YI SYLLABLE BBIET -A05B ; [.3C83.0020.0002] # YI SYLLABLE BBIEX -A05C ; [.3C84.0020.0002] # YI SYLLABLE BBIE -A05D ; [.3C85.0020.0002] # YI SYLLABLE BBIEP -A05E ; [.3C86.0020.0002] # YI SYLLABLE BBAT -A05F ; [.3C87.0020.0002] # YI SYLLABLE BBAX -A060 ; [.3C88.0020.0002] # YI SYLLABLE BBA -A061 ; [.3C89.0020.0002] # YI SYLLABLE BBAP -A062 ; [.3C8A.0020.0002] # YI SYLLABLE BBUOX -A063 ; [.3C8B.0020.0002] # YI SYLLABLE BBUO -A064 ; [.3C8C.0020.0002] # YI SYLLABLE BBUOP -A065 ; [.3C8D.0020.0002] # YI SYLLABLE BBOT -A066 ; [.3C8E.0020.0002] # YI SYLLABLE BBOX -A067 ; [.3C8F.0020.0002] # YI SYLLABLE BBO -A068 ; [.3C90.0020.0002] # YI SYLLABLE BBOP -A069 ; [.3C91.0020.0002] # YI SYLLABLE BBEX -A06A ; [.3C92.0020.0002] # YI SYLLABLE BBE -A06B ; [.3C93.0020.0002] # YI SYLLABLE BBEP -A06C ; [.3C94.0020.0002] # YI SYLLABLE BBUT -A06D ; [.3C95.0020.0002] # YI SYLLABLE BBUX -A06E ; [.3C96.0020.0002] # YI SYLLABLE BBU -A06F ; [.3C97.0020.0002] # YI SYLLABLE BBUP -A070 ; [.3C98.0020.0002] # YI SYLLABLE BBURX -A071 ; [.3C99.0020.0002] # YI SYLLABLE BBUR -A072 ; [.3C9A.0020.0002] # YI SYLLABLE BBYT -A073 ; [.3C9B.0020.0002] # YI SYLLABLE BBYX -A074 ; [.3C9C.0020.0002] # YI SYLLABLE BBY -A075 ; [.3C9D.0020.0002] # YI SYLLABLE BBYP -A076 ; [.3C9E.0020.0002] # YI SYLLABLE NBIT -A077 ; [.3C9F.0020.0002] # YI SYLLABLE NBIX -A078 ; [.3CA0.0020.0002] # YI SYLLABLE NBI -A079 ; [.3CA1.0020.0002] # YI SYLLABLE NBIP -A07A ; [.3CA2.0020.0002] # YI SYLLABLE NBIEX -A07B ; [.3CA3.0020.0002] # YI SYLLABLE NBIE -A07C ; [.3CA4.0020.0002] # YI SYLLABLE NBIEP -A07D ; [.3CA5.0020.0002] # YI SYLLABLE NBAT -A07E ; [.3CA6.0020.0002] # YI SYLLABLE NBAX -A07F ; [.3CA7.0020.0002] # YI SYLLABLE NBA -A080 ; [.3CA8.0020.0002] # YI SYLLABLE NBAP -A081 ; [.3CA9.0020.0002] # YI SYLLABLE NBOT -A082 ; [.3CAA.0020.0002] # YI SYLLABLE NBOX -A083 ; [.3CAB.0020.0002] # YI SYLLABLE NBO -A084 ; [.3CAC.0020.0002] # YI SYLLABLE NBOP -A085 ; [.3CAD.0020.0002] # YI SYLLABLE NBUT -A086 ; [.3CAE.0020.0002] # YI SYLLABLE NBUX -A087 ; [.3CAF.0020.0002] # YI SYLLABLE NBU -A088 ; [.3CB0.0020.0002] # YI SYLLABLE NBUP -A089 ; [.3CB1.0020.0002] # YI SYLLABLE NBURX -A08A ; [.3CB2.0020.0002] # YI SYLLABLE NBUR -A08B ; [.3CB3.0020.0002] # YI SYLLABLE NBYT -A08C ; [.3CB4.0020.0002] # YI SYLLABLE NBYX -A08D ; [.3CB5.0020.0002] # YI SYLLABLE NBY -A08E ; [.3CB6.0020.0002] # YI SYLLABLE NBYP -A08F ; [.3CB7.0020.0002] # YI SYLLABLE NBYRX -A090 ; [.3CB8.0020.0002] # YI SYLLABLE NBYR -A091 ; [.3CB9.0020.0002] # YI SYLLABLE HMIT -A092 ; [.3CBA.0020.0002] # YI SYLLABLE HMIX -A093 ; [.3CBB.0020.0002] # YI SYLLABLE HMI -A094 ; [.3CBC.0020.0002] # YI SYLLABLE HMIP -A095 ; [.3CBD.0020.0002] # YI SYLLABLE HMIEX -A096 ; [.3CBE.0020.0002] # YI SYLLABLE HMIE -A097 ; [.3CBF.0020.0002] # YI SYLLABLE HMIEP -A098 ; [.3CC0.0020.0002] # YI SYLLABLE HMAT -A099 ; [.3CC1.0020.0002] # YI SYLLABLE HMAX -A09A ; [.3CC2.0020.0002] # YI SYLLABLE HMA -A09B ; [.3CC3.0020.0002] # YI SYLLABLE HMAP -A09C ; [.3CC4.0020.0002] # YI SYLLABLE HMUOX -A09D ; [.3CC5.0020.0002] # YI SYLLABLE HMUO -A09E ; [.3CC6.0020.0002] # YI SYLLABLE HMUOP -A09F ; [.3CC7.0020.0002] # YI SYLLABLE HMOT -A0A0 ; [.3CC8.0020.0002] # YI SYLLABLE HMOX -A0A1 ; [.3CC9.0020.0002] # YI SYLLABLE HMO -A0A2 ; [.3CCA.0020.0002] # YI SYLLABLE HMOP -A0A3 ; [.3CCB.0020.0002] # YI SYLLABLE HMUT -A0A4 ; [.3CCC.0020.0002] # YI SYLLABLE HMUX -A0A5 ; [.3CCD.0020.0002] # YI SYLLABLE HMU -A0A6 ; [.3CCE.0020.0002] # YI SYLLABLE HMUP -A0A7 ; [.3CCF.0020.0002] # YI SYLLABLE HMURX -A0A8 ; [.3CD0.0020.0002] # YI SYLLABLE HMUR -A0A9 ; [.3CD1.0020.0002] # YI SYLLABLE HMYX -A0AA ; [.3CD2.0020.0002] # YI SYLLABLE HMY -A0AB ; [.3CD3.0020.0002] # YI SYLLABLE HMYP -A0AC ; [.3CD4.0020.0002] # YI SYLLABLE HMYRX -A0AD ; [.3CD5.0020.0002] # YI SYLLABLE HMYR -A0AE ; [.3CD6.0020.0002] # YI SYLLABLE MIT -A0AF ; [.3CD7.0020.0002] # YI SYLLABLE MIX -A0B0 ; [.3CD8.0020.0002] # YI SYLLABLE MI -A0B1 ; [.3CD9.0020.0002] # YI SYLLABLE MIP -A0B2 ; [.3CDA.0020.0002] # YI SYLLABLE MIEX -A0B3 ; [.3CDB.0020.0002] # YI SYLLABLE MIE -A0B4 ; [.3CDC.0020.0002] # YI SYLLABLE MIEP -A0B5 ; [.3CDD.0020.0002] # YI SYLLABLE MAT -A0B6 ; [.3CDE.0020.0002] # YI SYLLABLE MAX -A0B7 ; [.3CDF.0020.0002] # YI SYLLABLE MA -A0B8 ; [.3CE0.0020.0002] # YI SYLLABLE MAP -A0B9 ; [.3CE1.0020.0002] # YI SYLLABLE MUOT -A0BA ; [.3CE2.0020.0002] # YI SYLLABLE MUOX -A0BB ; [.3CE3.0020.0002] # YI SYLLABLE MUO -A0BC ; [.3CE4.0020.0002] # YI SYLLABLE MUOP -A0BD ; [.3CE5.0020.0002] # YI SYLLABLE MOT -A0BE ; [.3CE6.0020.0002] # YI SYLLABLE MOX -A0BF ; [.3CE7.0020.0002] # YI SYLLABLE MO -A0C0 ; [.3CE8.0020.0002] # YI SYLLABLE MOP -A0C1 ; [.3CE9.0020.0002] # YI SYLLABLE MEX -A0C2 ; [.3CEA.0020.0002] # YI SYLLABLE ME -A0C3 ; [.3CEB.0020.0002] # YI SYLLABLE MUT -A0C4 ; [.3CEC.0020.0002] # YI SYLLABLE MUX -A0C5 ; [.3CED.0020.0002] # YI SYLLABLE MU -A0C6 ; [.3CEE.0020.0002] # YI SYLLABLE MUP -A0C7 ; [.3CEF.0020.0002] # YI SYLLABLE MURX -A0C8 ; [.3CF0.0020.0002] # YI SYLLABLE MUR -A0C9 ; [.3CF1.0020.0002] # YI SYLLABLE MYT -A0CA ; [.3CF2.0020.0002] # YI SYLLABLE MYX -A0CB ; [.3CF3.0020.0002] # YI SYLLABLE MY -A0CC ; [.3CF4.0020.0002] # YI SYLLABLE MYP -A0CD ; [.3CF5.0020.0002] # YI SYLLABLE FIT -A0CE ; [.3CF6.0020.0002] # YI SYLLABLE FIX -A0CF ; [.3CF7.0020.0002] # YI SYLLABLE FI -A0D0 ; [.3CF8.0020.0002] # YI SYLLABLE FIP -A0D1 ; [.3CF9.0020.0002] # YI SYLLABLE FAT -A0D2 ; [.3CFA.0020.0002] # YI SYLLABLE FAX -A0D3 ; [.3CFB.0020.0002] # YI SYLLABLE FA -A0D4 ; [.3CFC.0020.0002] # YI SYLLABLE FAP -A0D5 ; [.3CFD.0020.0002] # YI SYLLABLE FOX -A0D6 ; [.3CFE.0020.0002] # YI SYLLABLE FO -A0D7 ; [.3CFF.0020.0002] # YI SYLLABLE FOP -A0D8 ; [.3D00.0020.0002] # YI SYLLABLE FUT -A0D9 ; [.3D01.0020.0002] # YI SYLLABLE FUX -A0DA ; [.3D02.0020.0002] # YI SYLLABLE FU -A0DB ; [.3D03.0020.0002] # YI SYLLABLE FUP -A0DC ; [.3D04.0020.0002] # YI SYLLABLE FURX -A0DD ; [.3D05.0020.0002] # YI SYLLABLE FUR -A0DE ; [.3D06.0020.0002] # YI SYLLABLE FYT -A0DF ; [.3D07.0020.0002] # YI SYLLABLE FYX -A0E0 ; [.3D08.0020.0002] # YI SYLLABLE FY -A0E1 ; [.3D09.0020.0002] # YI SYLLABLE FYP -A0E2 ; [.3D0A.0020.0002] # YI SYLLABLE VIT -A0E3 ; [.3D0B.0020.0002] # YI SYLLABLE VIX -A0E4 ; [.3D0C.0020.0002] # YI SYLLABLE VI -A0E5 ; [.3D0D.0020.0002] # YI SYLLABLE VIP -A0E6 ; [.3D0E.0020.0002] # YI SYLLABLE VIET -A0E7 ; [.3D0F.0020.0002] # YI SYLLABLE VIEX -A0E8 ; [.3D10.0020.0002] # YI SYLLABLE VIE -A0E9 ; [.3D11.0020.0002] # YI SYLLABLE VIEP -A0EA ; [.3D12.0020.0002] # YI SYLLABLE VAT -A0EB ; [.3D13.0020.0002] # YI SYLLABLE VAX -A0EC ; [.3D14.0020.0002] # YI SYLLABLE VA -A0ED ; [.3D15.0020.0002] # YI SYLLABLE VAP -A0EE ; [.3D16.0020.0002] # YI SYLLABLE VOT -A0EF ; [.3D17.0020.0002] # YI SYLLABLE VOX -A0F0 ; [.3D18.0020.0002] # YI SYLLABLE VO -A0F1 ; [.3D19.0020.0002] # YI SYLLABLE VOP -A0F2 ; [.3D1A.0020.0002] # YI SYLLABLE VEX -A0F3 ; [.3D1B.0020.0002] # YI SYLLABLE VEP -A0F4 ; [.3D1C.0020.0002] # YI SYLLABLE VUT -A0F5 ; [.3D1D.0020.0002] # YI SYLLABLE VUX -A0F6 ; [.3D1E.0020.0002] # YI SYLLABLE VU -A0F7 ; [.3D1F.0020.0002] # YI SYLLABLE VUP -A0F8 ; [.3D20.0020.0002] # YI SYLLABLE VURX -A0F9 ; [.3D21.0020.0002] # YI SYLLABLE VUR -A0FA ; [.3D22.0020.0002] # YI SYLLABLE VYT -A0FB ; [.3D23.0020.0002] # YI SYLLABLE VYX -A0FC ; [.3D24.0020.0002] # YI SYLLABLE VY -A0FD ; [.3D25.0020.0002] # YI SYLLABLE VYP -A0FE ; [.3D26.0020.0002] # YI SYLLABLE VYRX -A0FF ; [.3D27.0020.0002] # YI SYLLABLE VYR -A100 ; [.3D28.0020.0002] # YI SYLLABLE DIT -A101 ; [.3D29.0020.0002] # YI SYLLABLE DIX -A102 ; [.3D2A.0020.0002] # YI SYLLABLE DI -A103 ; [.3D2B.0020.0002] # YI SYLLABLE DIP -A104 ; [.3D2C.0020.0002] # YI SYLLABLE DIEX -A105 ; [.3D2D.0020.0002] # YI SYLLABLE DIE -A106 ; [.3D2E.0020.0002] # YI SYLLABLE DIEP -A107 ; [.3D2F.0020.0002] # YI SYLLABLE DAT -A108 ; [.3D30.0020.0002] # YI SYLLABLE DAX -A109 ; [.3D31.0020.0002] # YI SYLLABLE DA -A10A ; [.3D32.0020.0002] # YI SYLLABLE DAP -A10B ; [.3D33.0020.0002] # YI SYLLABLE DUOX -A10C ; [.3D34.0020.0002] # YI SYLLABLE DUO -A10D ; [.3D35.0020.0002] # YI SYLLABLE DOT -A10E ; [.3D36.0020.0002] # YI SYLLABLE DOX -A10F ; [.3D37.0020.0002] # YI SYLLABLE DO -A110 ; [.3D38.0020.0002] # YI SYLLABLE DOP -A111 ; [.3D39.0020.0002] # YI SYLLABLE DEX -A112 ; [.3D3A.0020.0002] # YI SYLLABLE DE -A113 ; [.3D3B.0020.0002] # YI SYLLABLE DEP -A114 ; [.3D3C.0020.0002] # YI SYLLABLE DUT -A115 ; [.3D3D.0020.0002] # YI SYLLABLE DUX -A116 ; [.3D3E.0020.0002] # YI SYLLABLE DU -A117 ; [.3D3F.0020.0002] # YI SYLLABLE DUP -A118 ; [.3D40.0020.0002] # YI SYLLABLE DURX -A119 ; [.3D41.0020.0002] # YI SYLLABLE DUR -A11A ; [.3D42.0020.0002] # YI SYLLABLE TIT -A11B ; [.3D43.0020.0002] # YI SYLLABLE TIX -A11C ; [.3D44.0020.0002] # YI SYLLABLE TI -A11D ; [.3D45.0020.0002] # YI SYLLABLE TIP -A11E ; [.3D46.0020.0002] # YI SYLLABLE TIEX -A11F ; [.3D47.0020.0002] # YI SYLLABLE TIE -A120 ; [.3D48.0020.0002] # YI SYLLABLE TIEP -A121 ; [.3D49.0020.0002] # YI SYLLABLE TAT -A122 ; [.3D4A.0020.0002] # YI SYLLABLE TAX -A123 ; [.3D4B.0020.0002] # YI SYLLABLE TA -A124 ; [.3D4C.0020.0002] # YI SYLLABLE TAP -A125 ; [.3D4D.0020.0002] # YI SYLLABLE TUOT -A126 ; [.3D4E.0020.0002] # YI SYLLABLE TUOX -A127 ; [.3D4F.0020.0002] # YI SYLLABLE TUO -A128 ; [.3D50.0020.0002] # YI SYLLABLE TUOP -A129 ; [.3D51.0020.0002] # YI SYLLABLE TOT -A12A ; [.3D52.0020.0002] # YI SYLLABLE TOX -A12B ; [.3D53.0020.0002] # YI SYLLABLE TO -A12C ; [.3D54.0020.0002] # YI SYLLABLE TOP -A12D ; [.3D55.0020.0002] # YI SYLLABLE TEX -A12E ; [.3D56.0020.0002] # YI SYLLABLE TE -A12F ; [.3D57.0020.0002] # YI SYLLABLE TEP -A130 ; [.3D58.0020.0002] # YI SYLLABLE TUT -A131 ; [.3D59.0020.0002] # YI SYLLABLE TUX -A132 ; [.3D5A.0020.0002] # YI SYLLABLE TU -A133 ; [.3D5B.0020.0002] # YI SYLLABLE TUP -A134 ; [.3D5C.0020.0002] # YI SYLLABLE TURX -A135 ; [.3D5D.0020.0002] # YI SYLLABLE TUR -A136 ; [.3D5E.0020.0002] # YI SYLLABLE DDIT -A137 ; [.3D5F.0020.0002] # YI SYLLABLE DDIX -A138 ; [.3D60.0020.0002] # YI SYLLABLE DDI -A139 ; [.3D61.0020.0002] # YI SYLLABLE DDIP -A13A ; [.3D62.0020.0002] # YI SYLLABLE DDIEX -A13B ; [.3D63.0020.0002] # YI SYLLABLE DDIE -A13C ; [.3D64.0020.0002] # YI SYLLABLE DDIEP -A13D ; [.3D65.0020.0002] # YI SYLLABLE DDAT -A13E ; [.3D66.0020.0002] # YI SYLLABLE DDAX -A13F ; [.3D67.0020.0002] # YI SYLLABLE DDA -A140 ; [.3D68.0020.0002] # YI SYLLABLE DDAP -A141 ; [.3D69.0020.0002] # YI SYLLABLE DDUOX -A142 ; [.3D6A.0020.0002] # YI SYLLABLE DDUO -A143 ; [.3D6B.0020.0002] # YI SYLLABLE DDUOP -A144 ; [.3D6C.0020.0002] # YI SYLLABLE DDOT -A145 ; [.3D6D.0020.0002] # YI SYLLABLE DDOX -A146 ; [.3D6E.0020.0002] # YI SYLLABLE DDO -A147 ; [.3D6F.0020.0002] # YI SYLLABLE DDOP -A148 ; [.3D70.0020.0002] # YI SYLLABLE DDEX -A149 ; [.3D71.0020.0002] # YI SYLLABLE DDE -A14A ; [.3D72.0020.0002] # YI SYLLABLE DDEP -A14B ; [.3D73.0020.0002] # YI SYLLABLE DDUT -A14C ; [.3D74.0020.0002] # YI SYLLABLE DDUX -A14D ; [.3D75.0020.0002] # YI SYLLABLE DDU -A14E ; [.3D76.0020.0002] # YI SYLLABLE DDUP -A14F ; [.3D77.0020.0002] # YI SYLLABLE DDURX -A150 ; [.3D78.0020.0002] # YI SYLLABLE DDUR -A151 ; [.3D79.0020.0002] # YI SYLLABLE NDIT -A152 ; [.3D7A.0020.0002] # YI SYLLABLE NDIX -A153 ; [.3D7B.0020.0002] # YI SYLLABLE NDI -A154 ; [.3D7C.0020.0002] # YI SYLLABLE NDIP -A155 ; [.3D7D.0020.0002] # YI SYLLABLE NDIEX -A156 ; [.3D7E.0020.0002] # YI SYLLABLE NDIE -A157 ; [.3D7F.0020.0002] # YI SYLLABLE NDAT -A158 ; [.3D80.0020.0002] # YI SYLLABLE NDAX -A159 ; [.3D81.0020.0002] # YI SYLLABLE NDA -A15A ; [.3D82.0020.0002] # YI SYLLABLE NDAP -A15B ; [.3D83.0020.0002] # YI SYLLABLE NDOT -A15C ; [.3D84.0020.0002] # YI SYLLABLE NDOX -A15D ; [.3D85.0020.0002] # YI SYLLABLE NDO -A15E ; [.3D86.0020.0002] # YI SYLLABLE NDOP -A15F ; [.3D87.0020.0002] # YI SYLLABLE NDEX -A160 ; [.3D88.0020.0002] # YI SYLLABLE NDE -A161 ; [.3D89.0020.0002] # YI SYLLABLE NDEP -A162 ; [.3D8A.0020.0002] # YI SYLLABLE NDUT -A163 ; [.3D8B.0020.0002] # YI SYLLABLE NDUX -A164 ; [.3D8C.0020.0002] # YI SYLLABLE NDU -A165 ; [.3D8D.0020.0002] # YI SYLLABLE NDUP -A166 ; [.3D8E.0020.0002] # YI SYLLABLE NDURX -A167 ; [.3D8F.0020.0002] # YI SYLLABLE NDUR -A168 ; [.3D90.0020.0002] # YI SYLLABLE HNIT -A169 ; [.3D91.0020.0002] # YI SYLLABLE HNIX -A16A ; [.3D92.0020.0002] # YI SYLLABLE HNI -A16B ; [.3D93.0020.0002] # YI SYLLABLE HNIP -A16C ; [.3D94.0020.0002] # YI SYLLABLE HNIET -A16D ; [.3D95.0020.0002] # YI SYLLABLE HNIEX -A16E ; [.3D96.0020.0002] # YI SYLLABLE HNIE -A16F ; [.3D97.0020.0002] # YI SYLLABLE HNIEP -A170 ; [.3D98.0020.0002] # YI SYLLABLE HNAT -A171 ; [.3D99.0020.0002] # YI SYLLABLE HNAX -A172 ; [.3D9A.0020.0002] # YI SYLLABLE HNA -A173 ; [.3D9B.0020.0002] # YI SYLLABLE HNAP -A174 ; [.3D9C.0020.0002] # YI SYLLABLE HNUOX -A175 ; [.3D9D.0020.0002] # YI SYLLABLE HNUO -A176 ; [.3D9E.0020.0002] # YI SYLLABLE HNOT -A177 ; [.3D9F.0020.0002] # YI SYLLABLE HNOX -A178 ; [.3DA0.0020.0002] # YI SYLLABLE HNOP -A179 ; [.3DA1.0020.0002] # YI SYLLABLE HNEX -A17A ; [.3DA2.0020.0002] # YI SYLLABLE HNE -A17B ; [.3DA3.0020.0002] # YI SYLLABLE HNEP -A17C ; [.3DA4.0020.0002] # YI SYLLABLE HNUT -A17D ; [.3DA5.0020.0002] # YI SYLLABLE NIT -A17E ; [.3DA6.0020.0002] # YI SYLLABLE NIX -A17F ; [.3DA7.0020.0002] # YI SYLLABLE NI -A180 ; [.3DA8.0020.0002] # YI SYLLABLE NIP -A181 ; [.3DA9.0020.0002] # YI SYLLABLE NIEX -A182 ; [.3DAA.0020.0002] # YI SYLLABLE NIE -A183 ; [.3DAB.0020.0002] # YI SYLLABLE NIEP -A184 ; [.3DAC.0020.0002] # YI SYLLABLE NAX -A185 ; [.3DAD.0020.0002] # YI SYLLABLE NA -A186 ; [.3DAE.0020.0002] # YI SYLLABLE NAP -A187 ; [.3DAF.0020.0002] # YI SYLLABLE NUOX -A188 ; [.3DB0.0020.0002] # YI SYLLABLE NUO -A189 ; [.3DB1.0020.0002] # YI SYLLABLE NUOP -A18A ; [.3DB2.0020.0002] # YI SYLLABLE NOT -A18B ; [.3DB3.0020.0002] # YI SYLLABLE NOX -A18C ; [.3DB4.0020.0002] # YI SYLLABLE NO -A18D ; [.3DB5.0020.0002] # YI SYLLABLE NOP -A18E ; [.3DB6.0020.0002] # YI SYLLABLE NEX -A18F ; [.3DB7.0020.0002] # YI SYLLABLE NE -A190 ; [.3DB8.0020.0002] # YI SYLLABLE NEP -A191 ; [.3DB9.0020.0002] # YI SYLLABLE NUT -A192 ; [.3DBA.0020.0002] # YI SYLLABLE NUX -A193 ; [.3DBB.0020.0002] # YI SYLLABLE NU -A194 ; [.3DBC.0020.0002] # YI SYLLABLE NUP -A195 ; [.3DBD.0020.0002] # YI SYLLABLE NURX -A196 ; [.3DBE.0020.0002] # YI SYLLABLE NUR -A197 ; [.3DBF.0020.0002] # YI SYLLABLE HLIT -A198 ; [.3DC0.0020.0002] # YI SYLLABLE HLIX -A199 ; [.3DC1.0020.0002] # YI SYLLABLE HLI -A19A ; [.3DC2.0020.0002] # YI SYLLABLE HLIP -A19B ; [.3DC3.0020.0002] # YI SYLLABLE HLIEX -A19C ; [.3DC4.0020.0002] # YI SYLLABLE HLIE -A19D ; [.3DC5.0020.0002] # YI SYLLABLE HLIEP -A19E ; [.3DC6.0020.0002] # YI SYLLABLE HLAT -A19F ; [.3DC7.0020.0002] # YI SYLLABLE HLAX -A1A0 ; [.3DC8.0020.0002] # YI SYLLABLE HLA -A1A1 ; [.3DC9.0020.0002] # YI SYLLABLE HLAP -A1A2 ; [.3DCA.0020.0002] # YI SYLLABLE HLUOX -A1A3 ; [.3DCB.0020.0002] # YI SYLLABLE HLUO -A1A4 ; [.3DCC.0020.0002] # YI SYLLABLE HLUOP -A1A5 ; [.3DCD.0020.0002] # YI SYLLABLE HLOX -A1A6 ; [.3DCE.0020.0002] # YI SYLLABLE HLO -A1A7 ; [.3DCF.0020.0002] # YI SYLLABLE HLOP -A1A8 ; [.3DD0.0020.0002] # YI SYLLABLE HLEX -A1A9 ; [.3DD1.0020.0002] # YI SYLLABLE HLE -A1AA ; [.3DD2.0020.0002] # YI SYLLABLE HLEP -A1AB ; [.3DD3.0020.0002] # YI SYLLABLE HLUT -A1AC ; [.3DD4.0020.0002] # YI SYLLABLE HLUX -A1AD ; [.3DD5.0020.0002] # YI SYLLABLE HLU -A1AE ; [.3DD6.0020.0002] # YI SYLLABLE HLUP -A1AF ; [.3DD7.0020.0002] # YI SYLLABLE HLURX -A1B0 ; [.3DD8.0020.0002] # YI SYLLABLE HLUR -A1B1 ; [.3DD9.0020.0002] # YI SYLLABLE HLYT -A1B2 ; [.3DDA.0020.0002] # YI SYLLABLE HLYX -A1B3 ; [.3DDB.0020.0002] # YI SYLLABLE HLY -A1B4 ; [.3DDC.0020.0002] # YI SYLLABLE HLYP -A1B5 ; [.3DDD.0020.0002] # YI SYLLABLE HLYRX -A1B6 ; [.3DDE.0020.0002] # YI SYLLABLE HLYR -A1B7 ; [.3DDF.0020.0002] # YI SYLLABLE LIT -A1B8 ; [.3DE0.0020.0002] # YI SYLLABLE LIX -A1B9 ; [.3DE1.0020.0002] # YI SYLLABLE LI -A1BA ; [.3DE2.0020.0002] # YI SYLLABLE LIP -A1BB ; [.3DE3.0020.0002] # YI SYLLABLE LIET -A1BC ; [.3DE4.0020.0002] # YI SYLLABLE LIEX -A1BD ; [.3DE5.0020.0002] # YI SYLLABLE LIE -A1BE ; [.3DE6.0020.0002] # YI SYLLABLE LIEP -A1BF ; [.3DE7.0020.0002] # YI SYLLABLE LAT -A1C0 ; [.3DE8.0020.0002] # YI SYLLABLE LAX -A1C1 ; [.3DE9.0020.0002] # YI SYLLABLE LA -A1C2 ; [.3DEA.0020.0002] # YI SYLLABLE LAP -A1C3 ; [.3DEB.0020.0002] # YI SYLLABLE LUOT -A1C4 ; [.3DEC.0020.0002] # YI SYLLABLE LUOX -A1C5 ; [.3DED.0020.0002] # YI SYLLABLE LUO -A1C6 ; [.3DEE.0020.0002] # YI SYLLABLE LUOP -A1C7 ; [.3DEF.0020.0002] # YI SYLLABLE LOT -A1C8 ; [.3DF0.0020.0002] # YI SYLLABLE LOX -A1C9 ; [.3DF1.0020.0002] # YI SYLLABLE LO -A1CA ; [.3DF2.0020.0002] # YI SYLLABLE LOP -A1CB ; [.3DF3.0020.0002] # YI SYLLABLE LEX -A1CC ; [.3DF4.0020.0002] # YI SYLLABLE LE -A1CD ; [.3DF5.0020.0002] # YI SYLLABLE LEP -A1CE ; [.3DF6.0020.0002] # YI SYLLABLE LUT -A1CF ; [.3DF7.0020.0002] # YI SYLLABLE LUX -A1D0 ; [.3DF8.0020.0002] # YI SYLLABLE LU -A1D1 ; [.3DF9.0020.0002] # YI SYLLABLE LUP -A1D2 ; [.3DFA.0020.0002] # YI SYLLABLE LURX -A1D3 ; [.3DFB.0020.0002] # YI SYLLABLE LUR -A1D4 ; [.3DFC.0020.0002] # YI SYLLABLE LYT -A1D5 ; [.3DFD.0020.0002] # YI SYLLABLE LYX -A1D6 ; [.3DFE.0020.0002] # YI SYLLABLE LY -A1D7 ; [.3DFF.0020.0002] # YI SYLLABLE LYP -A1D8 ; [.3E00.0020.0002] # YI SYLLABLE LYRX -A1D9 ; [.3E01.0020.0002] # YI SYLLABLE LYR -A1DA ; [.3E02.0020.0002] # YI SYLLABLE GIT -A1DB ; [.3E03.0020.0002] # YI SYLLABLE GIX -A1DC ; [.3E04.0020.0002] # YI SYLLABLE GI -A1DD ; [.3E05.0020.0002] # YI SYLLABLE GIP -A1DE ; [.3E06.0020.0002] # YI SYLLABLE GIET -A1DF ; [.3E07.0020.0002] # YI SYLLABLE GIEX -A1E0 ; [.3E08.0020.0002] # YI SYLLABLE GIE -A1E1 ; [.3E09.0020.0002] # YI SYLLABLE GIEP -A1E2 ; [.3E0A.0020.0002] # YI SYLLABLE GAT -A1E3 ; [.3E0B.0020.0002] # YI SYLLABLE GAX -A1E4 ; [.3E0C.0020.0002] # YI SYLLABLE GA -A1E5 ; [.3E0D.0020.0002] # YI SYLLABLE GAP -A1E6 ; [.3E0E.0020.0002] # YI SYLLABLE GUOT -A1E7 ; [.3E0F.0020.0002] # YI SYLLABLE GUOX -A1E8 ; [.3E10.0020.0002] # YI SYLLABLE GUO -A1E9 ; [.3E11.0020.0002] # YI SYLLABLE GUOP -A1EA ; [.3E12.0020.0002] # YI SYLLABLE GOT -A1EB ; [.3E13.0020.0002] # YI SYLLABLE GOX -A1EC ; [.3E14.0020.0002] # YI SYLLABLE GO -A1ED ; [.3E15.0020.0002] # YI SYLLABLE GOP -A1EE ; [.3E16.0020.0002] # YI SYLLABLE GET -A1EF ; [.3E17.0020.0002] # YI SYLLABLE GEX -A1F0 ; [.3E18.0020.0002] # YI SYLLABLE GE -A1F1 ; [.3E19.0020.0002] # YI SYLLABLE GEP -A1F2 ; [.3E1A.0020.0002] # YI SYLLABLE GUT -A1F3 ; [.3E1B.0020.0002] # YI SYLLABLE GUX -A1F4 ; [.3E1C.0020.0002] # YI SYLLABLE GU -A1F5 ; [.3E1D.0020.0002] # YI SYLLABLE GUP -A1F6 ; [.3E1E.0020.0002] # YI SYLLABLE GURX -A1F7 ; [.3E1F.0020.0002] # YI SYLLABLE GUR -A1F8 ; [.3E20.0020.0002] # YI SYLLABLE KIT -A1F9 ; [.3E21.0020.0002] # YI SYLLABLE KIX -A1FA ; [.3E22.0020.0002] # YI SYLLABLE KI -A1FB ; [.3E23.0020.0002] # YI SYLLABLE KIP -A1FC ; [.3E24.0020.0002] # YI SYLLABLE KIEX -A1FD ; [.3E25.0020.0002] # YI SYLLABLE KIE -A1FE ; [.3E26.0020.0002] # YI SYLLABLE KIEP -A1FF ; [.3E27.0020.0002] # YI SYLLABLE KAT -A200 ; [.3E28.0020.0002] # YI SYLLABLE KAX -A201 ; [.3E29.0020.0002] # YI SYLLABLE KA -A202 ; [.3E2A.0020.0002] # YI SYLLABLE KAP -A203 ; [.3E2B.0020.0002] # YI SYLLABLE KUOX -A204 ; [.3E2C.0020.0002] # YI SYLLABLE KUO -A205 ; [.3E2D.0020.0002] # YI SYLLABLE KUOP -A206 ; [.3E2E.0020.0002] # YI SYLLABLE KOT -A207 ; [.3E2F.0020.0002] # YI SYLLABLE KOX -A208 ; [.3E30.0020.0002] # YI SYLLABLE KO -A209 ; [.3E31.0020.0002] # YI SYLLABLE KOP -A20A ; [.3E32.0020.0002] # YI SYLLABLE KET -A20B ; [.3E33.0020.0002] # YI SYLLABLE KEX -A20C ; [.3E34.0020.0002] # YI SYLLABLE KE -A20D ; [.3E35.0020.0002] # YI SYLLABLE KEP -A20E ; [.3E36.0020.0002] # YI SYLLABLE KUT -A20F ; [.3E37.0020.0002] # YI SYLLABLE KUX -A210 ; [.3E38.0020.0002] # YI SYLLABLE KU -A211 ; [.3E39.0020.0002] # YI SYLLABLE KUP -A212 ; [.3E3A.0020.0002] # YI SYLLABLE KURX -A213 ; [.3E3B.0020.0002] # YI SYLLABLE KUR -A214 ; [.3E3C.0020.0002] # YI SYLLABLE GGIT -A215 ; [.3E3D.0020.0002] # YI SYLLABLE GGIX -A216 ; [.3E3E.0020.0002] # YI SYLLABLE GGI -A217 ; [.3E3F.0020.0002] # YI SYLLABLE GGIEX -A218 ; [.3E40.0020.0002] # YI SYLLABLE GGIE -A219 ; [.3E41.0020.0002] # YI SYLLABLE GGIEP -A21A ; [.3E42.0020.0002] # YI SYLLABLE GGAT -A21B ; [.3E43.0020.0002] # YI SYLLABLE GGAX -A21C ; [.3E44.0020.0002] # YI SYLLABLE GGA -A21D ; [.3E45.0020.0002] # YI SYLLABLE GGAP -A21E ; [.3E46.0020.0002] # YI SYLLABLE GGUOT -A21F ; [.3E47.0020.0002] # YI SYLLABLE GGUOX -A220 ; [.3E48.0020.0002] # YI SYLLABLE GGUO -A221 ; [.3E49.0020.0002] # YI SYLLABLE GGUOP -A222 ; [.3E4A.0020.0002] # YI SYLLABLE GGOT -A223 ; [.3E4B.0020.0002] # YI SYLLABLE GGOX -A224 ; [.3E4C.0020.0002] # YI SYLLABLE GGO -A225 ; [.3E4D.0020.0002] # YI SYLLABLE GGOP -A226 ; [.3E4E.0020.0002] # YI SYLLABLE GGET -A227 ; [.3E4F.0020.0002] # YI SYLLABLE GGEX -A228 ; [.3E50.0020.0002] # YI SYLLABLE GGE -A229 ; [.3E51.0020.0002] # YI SYLLABLE GGEP -A22A ; [.3E52.0020.0002] # YI SYLLABLE GGUT -A22B ; [.3E53.0020.0002] # YI SYLLABLE GGUX -A22C ; [.3E54.0020.0002] # YI SYLLABLE GGU -A22D ; [.3E55.0020.0002] # YI SYLLABLE GGUP -A22E ; [.3E56.0020.0002] # YI SYLLABLE GGURX -A22F ; [.3E57.0020.0002] # YI SYLLABLE GGUR -A230 ; [.3E58.0020.0002] # YI SYLLABLE MGIEX -A231 ; [.3E59.0020.0002] # YI SYLLABLE MGIE -A232 ; [.3E5A.0020.0002] # YI SYLLABLE MGAT -A233 ; [.3E5B.0020.0002] # YI SYLLABLE MGAX -A234 ; [.3E5C.0020.0002] # YI SYLLABLE MGA -A235 ; [.3E5D.0020.0002] # YI SYLLABLE MGAP -A236 ; [.3E5E.0020.0002] # YI SYLLABLE MGUOX -A237 ; [.3E5F.0020.0002] # YI SYLLABLE MGUO -A238 ; [.3E60.0020.0002] # YI SYLLABLE MGUOP -A239 ; [.3E61.0020.0002] # YI SYLLABLE MGOT -A23A ; [.3E62.0020.0002] # YI SYLLABLE MGOX -A23B ; [.3E63.0020.0002] # YI SYLLABLE MGO -A23C ; [.3E64.0020.0002] # YI SYLLABLE MGOP -A23D ; [.3E65.0020.0002] # YI SYLLABLE MGEX -A23E ; [.3E66.0020.0002] # YI SYLLABLE MGE -A23F ; [.3E67.0020.0002] # YI SYLLABLE MGEP -A240 ; [.3E68.0020.0002] # YI SYLLABLE MGUT -A241 ; [.3E69.0020.0002] # YI SYLLABLE MGUX -A242 ; [.3E6A.0020.0002] # YI SYLLABLE MGU -A243 ; [.3E6B.0020.0002] # YI SYLLABLE MGUP -A244 ; [.3E6C.0020.0002] # YI SYLLABLE MGURX -A245 ; [.3E6D.0020.0002] # YI SYLLABLE MGUR -A246 ; [.3E6E.0020.0002] # YI SYLLABLE HXIT -A247 ; [.3E6F.0020.0002] # YI SYLLABLE HXIX -A248 ; [.3E70.0020.0002] # YI SYLLABLE HXI -A249 ; [.3E71.0020.0002] # YI SYLLABLE HXIP -A24A ; [.3E72.0020.0002] # YI SYLLABLE HXIET -A24B ; [.3E73.0020.0002] # YI SYLLABLE HXIEX -A24C ; [.3E74.0020.0002] # YI SYLLABLE HXIE -A24D ; [.3E75.0020.0002] # YI SYLLABLE HXIEP -A24E ; [.3E76.0020.0002] # YI SYLLABLE HXAT -A24F ; [.3E77.0020.0002] # YI SYLLABLE HXAX -A250 ; [.3E78.0020.0002] # YI SYLLABLE HXA -A251 ; [.3E79.0020.0002] # YI SYLLABLE HXAP -A252 ; [.3E7A.0020.0002] # YI SYLLABLE HXUOT -A253 ; [.3E7B.0020.0002] # YI SYLLABLE HXUOX -A254 ; [.3E7C.0020.0002] # YI SYLLABLE HXUO -A255 ; [.3E7D.0020.0002] # YI SYLLABLE HXUOP -A256 ; [.3E7E.0020.0002] # YI SYLLABLE HXOT -A257 ; [.3E7F.0020.0002] # YI SYLLABLE HXOX -A258 ; [.3E80.0020.0002] # YI SYLLABLE HXO -A259 ; [.3E81.0020.0002] # YI SYLLABLE HXOP -A25A ; [.3E82.0020.0002] # YI SYLLABLE HXEX -A25B ; [.3E83.0020.0002] # YI SYLLABLE HXE -A25C ; [.3E84.0020.0002] # YI SYLLABLE HXEP -A25D ; [.3E85.0020.0002] # YI SYLLABLE NGIEX -A25E ; [.3E86.0020.0002] # YI SYLLABLE NGIE -A25F ; [.3E87.0020.0002] # YI SYLLABLE NGIEP -A260 ; [.3E88.0020.0002] # YI SYLLABLE NGAT -A261 ; [.3E89.0020.0002] # YI SYLLABLE NGAX -A262 ; [.3E8A.0020.0002] # YI SYLLABLE NGA -A263 ; [.3E8B.0020.0002] # YI SYLLABLE NGAP -A264 ; [.3E8C.0020.0002] # YI SYLLABLE NGUOT -A265 ; [.3E8D.0020.0002] # YI SYLLABLE NGUOX -A266 ; [.3E8E.0020.0002] # YI SYLLABLE NGUO -A267 ; [.3E8F.0020.0002] # YI SYLLABLE NGOT -A268 ; [.3E90.0020.0002] # YI SYLLABLE NGOX -A269 ; [.3E91.0020.0002] # YI SYLLABLE NGO -A26A ; [.3E92.0020.0002] # YI SYLLABLE NGOP -A26B ; [.3E93.0020.0002] # YI SYLLABLE NGEX -A26C ; [.3E94.0020.0002] # YI SYLLABLE NGE -A26D ; [.3E95.0020.0002] # YI SYLLABLE NGEP -A26E ; [.3E96.0020.0002] # YI SYLLABLE HIT -A26F ; [.3E97.0020.0002] # YI SYLLABLE HIEX -A270 ; [.3E98.0020.0002] # YI SYLLABLE HIE -A271 ; [.3E99.0020.0002] # YI SYLLABLE HAT -A272 ; [.3E9A.0020.0002] # YI SYLLABLE HAX -A273 ; [.3E9B.0020.0002] # YI SYLLABLE HA -A274 ; [.3E9C.0020.0002] # YI SYLLABLE HAP -A275 ; [.3E9D.0020.0002] # YI SYLLABLE HUOT -A276 ; [.3E9E.0020.0002] # YI SYLLABLE HUOX -A277 ; [.3E9F.0020.0002] # YI SYLLABLE HUO -A278 ; [.3EA0.0020.0002] # YI SYLLABLE HUOP -A279 ; [.3EA1.0020.0002] # YI SYLLABLE HOT -A27A ; [.3EA2.0020.0002] # YI SYLLABLE HOX -A27B ; [.3EA3.0020.0002] # YI SYLLABLE HO -A27C ; [.3EA4.0020.0002] # YI SYLLABLE HOP -A27D ; [.3EA5.0020.0002] # YI SYLLABLE HEX -A27E ; [.3EA6.0020.0002] # YI SYLLABLE HE -A27F ; [.3EA7.0020.0002] # YI SYLLABLE HEP -A280 ; [.3EA8.0020.0002] # YI SYLLABLE WAT -A281 ; [.3EA9.0020.0002] # YI SYLLABLE WAX -A282 ; [.3EAA.0020.0002] # YI SYLLABLE WA -A283 ; [.3EAB.0020.0002] # YI SYLLABLE WAP -A284 ; [.3EAC.0020.0002] # YI SYLLABLE WUOX -A285 ; [.3EAD.0020.0002] # YI SYLLABLE WUO -A286 ; [.3EAE.0020.0002] # YI SYLLABLE WUOP -A287 ; [.3EAF.0020.0002] # YI SYLLABLE WOX -A288 ; [.3EB0.0020.0002] # YI SYLLABLE WO -A289 ; [.3EB1.0020.0002] # YI SYLLABLE WOP -A28A ; [.3EB2.0020.0002] # YI SYLLABLE WEX -A28B ; [.3EB3.0020.0002] # YI SYLLABLE WE -A28C ; [.3EB4.0020.0002] # YI SYLLABLE WEP -A28D ; [.3EB5.0020.0002] # YI SYLLABLE ZIT -A28E ; [.3EB6.0020.0002] # YI SYLLABLE ZIX -A28F ; [.3EB7.0020.0002] # YI SYLLABLE ZI -A290 ; [.3EB8.0020.0002] # YI SYLLABLE ZIP -A291 ; [.3EB9.0020.0002] # YI SYLLABLE ZIEX -A292 ; [.3EBA.0020.0002] # YI SYLLABLE ZIE -A293 ; [.3EBB.0020.0002] # YI SYLLABLE ZIEP -A294 ; [.3EBC.0020.0002] # YI SYLLABLE ZAT -A295 ; [.3EBD.0020.0002] # YI SYLLABLE ZAX -A296 ; [.3EBE.0020.0002] # YI SYLLABLE ZA -A297 ; [.3EBF.0020.0002] # YI SYLLABLE ZAP -A298 ; [.3EC0.0020.0002] # YI SYLLABLE ZUOX -A299 ; [.3EC1.0020.0002] # YI SYLLABLE ZUO -A29A ; [.3EC2.0020.0002] # YI SYLLABLE ZUOP -A29B ; [.3EC3.0020.0002] # YI SYLLABLE ZOT -A29C ; [.3EC4.0020.0002] # YI SYLLABLE ZOX -A29D ; [.3EC5.0020.0002] # YI SYLLABLE ZO -A29E ; [.3EC6.0020.0002] # YI SYLLABLE ZOP -A29F ; [.3EC7.0020.0002] # YI SYLLABLE ZEX -A2A0 ; [.3EC8.0020.0002] # YI SYLLABLE ZE -A2A1 ; [.3EC9.0020.0002] # YI SYLLABLE ZEP -A2A2 ; [.3ECA.0020.0002] # YI SYLLABLE ZUT -A2A3 ; [.3ECB.0020.0002] # YI SYLLABLE ZUX -A2A4 ; [.3ECC.0020.0002] # YI SYLLABLE ZU -A2A5 ; [.3ECD.0020.0002] # YI SYLLABLE ZUP -A2A6 ; [.3ECE.0020.0002] # YI SYLLABLE ZURX -A2A7 ; [.3ECF.0020.0002] # YI SYLLABLE ZUR -A2A8 ; [.3ED0.0020.0002] # YI SYLLABLE ZYT -A2A9 ; [.3ED1.0020.0002] # YI SYLLABLE ZYX -A2AA ; [.3ED2.0020.0002] # YI SYLLABLE ZY -A2AB ; [.3ED3.0020.0002] # YI SYLLABLE ZYP -A2AC ; [.3ED4.0020.0002] # YI SYLLABLE ZYRX -A2AD ; [.3ED5.0020.0002] # YI SYLLABLE ZYR -A2AE ; [.3ED6.0020.0002] # YI SYLLABLE CIT -A2AF ; [.3ED7.0020.0002] # YI SYLLABLE CIX -A2B0 ; [.3ED8.0020.0002] # YI SYLLABLE CI -A2B1 ; [.3ED9.0020.0002] # YI SYLLABLE CIP -A2B2 ; [.3EDA.0020.0002] # YI SYLLABLE CIET -A2B3 ; [.3EDB.0020.0002] # YI SYLLABLE CIEX -A2B4 ; [.3EDC.0020.0002] # YI SYLLABLE CIE -A2B5 ; [.3EDD.0020.0002] # YI SYLLABLE CIEP -A2B6 ; [.3EDE.0020.0002] # YI SYLLABLE CAT -A2B7 ; [.3EDF.0020.0002] # YI SYLLABLE CAX -A2B8 ; [.3EE0.0020.0002] # YI SYLLABLE CA -A2B9 ; [.3EE1.0020.0002] # YI SYLLABLE CAP -A2BA ; [.3EE2.0020.0002] # YI SYLLABLE CUOX -A2BB ; [.3EE3.0020.0002] # YI SYLLABLE CUO -A2BC ; [.3EE4.0020.0002] # YI SYLLABLE CUOP -A2BD ; [.3EE5.0020.0002] # YI SYLLABLE COT -A2BE ; [.3EE6.0020.0002] # YI SYLLABLE COX -A2BF ; [.3EE7.0020.0002] # YI SYLLABLE CO -A2C0 ; [.3EE8.0020.0002] # YI SYLLABLE COP -A2C1 ; [.3EE9.0020.0002] # YI SYLLABLE CEX -A2C2 ; [.3EEA.0020.0002] # YI SYLLABLE CE -A2C3 ; [.3EEB.0020.0002] # YI SYLLABLE CEP -A2C4 ; [.3EEC.0020.0002] # YI SYLLABLE CUT -A2C5 ; [.3EED.0020.0002] # YI SYLLABLE CUX -A2C6 ; [.3EEE.0020.0002] # YI SYLLABLE CU -A2C7 ; [.3EEF.0020.0002] # YI SYLLABLE CUP -A2C8 ; [.3EF0.0020.0002] # YI SYLLABLE CURX -A2C9 ; [.3EF1.0020.0002] # YI SYLLABLE CUR -A2CA ; [.3EF2.0020.0002] # YI SYLLABLE CYT -A2CB ; [.3EF3.0020.0002] # YI SYLLABLE CYX -A2CC ; [.3EF4.0020.0002] # YI SYLLABLE CY -A2CD ; [.3EF5.0020.0002] # YI SYLLABLE CYP -A2CE ; [.3EF6.0020.0002] # YI SYLLABLE CYRX -A2CF ; [.3EF7.0020.0002] # YI SYLLABLE CYR -A2D0 ; [.3EF8.0020.0002] # YI SYLLABLE ZZIT -A2D1 ; [.3EF9.0020.0002] # YI SYLLABLE ZZIX -A2D2 ; [.3EFA.0020.0002] # YI SYLLABLE ZZI -A2D3 ; [.3EFB.0020.0002] # YI SYLLABLE ZZIP -A2D4 ; [.3EFC.0020.0002] # YI SYLLABLE ZZIET -A2D5 ; [.3EFD.0020.0002] # YI SYLLABLE ZZIEX -A2D6 ; [.3EFE.0020.0002] # YI SYLLABLE ZZIE -A2D7 ; [.3EFF.0020.0002] # YI SYLLABLE ZZIEP -A2D8 ; [.3F00.0020.0002] # YI SYLLABLE ZZAT -A2D9 ; [.3F01.0020.0002] # YI SYLLABLE ZZAX -A2DA ; [.3F02.0020.0002] # YI SYLLABLE ZZA -A2DB ; [.3F03.0020.0002] # YI SYLLABLE ZZAP -A2DC ; [.3F04.0020.0002] # YI SYLLABLE ZZOX -A2DD ; [.3F05.0020.0002] # YI SYLLABLE ZZO -A2DE ; [.3F06.0020.0002] # YI SYLLABLE ZZOP -A2DF ; [.3F07.0020.0002] # YI SYLLABLE ZZEX -A2E0 ; [.3F08.0020.0002] # YI SYLLABLE ZZE -A2E1 ; [.3F09.0020.0002] # YI SYLLABLE ZZEP -A2E2 ; [.3F0A.0020.0002] # YI SYLLABLE ZZUX -A2E3 ; [.3F0B.0020.0002] # YI SYLLABLE ZZU -A2E4 ; [.3F0C.0020.0002] # YI SYLLABLE ZZUP -A2E5 ; [.3F0D.0020.0002] # YI SYLLABLE ZZURX -A2E6 ; [.3F0E.0020.0002] # YI SYLLABLE ZZUR -A2E7 ; [.3F0F.0020.0002] # YI SYLLABLE ZZYT -A2E8 ; [.3F10.0020.0002] # YI SYLLABLE ZZYX -A2E9 ; [.3F11.0020.0002] # YI SYLLABLE ZZY -A2EA ; [.3F12.0020.0002] # YI SYLLABLE ZZYP -A2EB ; [.3F13.0020.0002] # YI SYLLABLE ZZYRX -A2EC ; [.3F14.0020.0002] # YI SYLLABLE ZZYR -A2ED ; [.3F15.0020.0002] # YI SYLLABLE NZIT -A2EE ; [.3F16.0020.0002] # YI SYLLABLE NZIX -A2EF ; [.3F17.0020.0002] # YI SYLLABLE NZI -A2F0 ; [.3F18.0020.0002] # YI SYLLABLE NZIP -A2F1 ; [.3F19.0020.0002] # YI SYLLABLE NZIEX -A2F2 ; [.3F1A.0020.0002] # YI SYLLABLE NZIE -A2F3 ; [.3F1B.0020.0002] # YI SYLLABLE NZIEP -A2F4 ; [.3F1C.0020.0002] # YI SYLLABLE NZAT -A2F5 ; [.3F1D.0020.0002] # YI SYLLABLE NZAX -A2F6 ; [.3F1E.0020.0002] # YI SYLLABLE NZA -A2F7 ; [.3F1F.0020.0002] # YI SYLLABLE NZAP -A2F8 ; [.3F20.0020.0002] # YI SYLLABLE NZUOX -A2F9 ; [.3F21.0020.0002] # YI SYLLABLE NZUO -A2FA ; [.3F22.0020.0002] # YI SYLLABLE NZOX -A2FB ; [.3F23.0020.0002] # YI SYLLABLE NZOP -A2FC ; [.3F24.0020.0002] # YI SYLLABLE NZEX -A2FD ; [.3F25.0020.0002] # YI SYLLABLE NZE -A2FE ; [.3F26.0020.0002] # YI SYLLABLE NZUX -A2FF ; [.3F27.0020.0002] # YI SYLLABLE NZU -A300 ; [.3F28.0020.0002] # YI SYLLABLE NZUP -A301 ; [.3F29.0020.0002] # YI SYLLABLE NZURX -A302 ; [.3F2A.0020.0002] # YI SYLLABLE NZUR -A303 ; [.3F2B.0020.0002] # YI SYLLABLE NZYT -A304 ; [.3F2C.0020.0002] # YI SYLLABLE NZYX -A305 ; [.3F2D.0020.0002] # YI SYLLABLE NZY -A306 ; [.3F2E.0020.0002] # YI SYLLABLE NZYP -A307 ; [.3F2F.0020.0002] # YI SYLLABLE NZYRX -A308 ; [.3F30.0020.0002] # YI SYLLABLE NZYR -A309 ; [.3F31.0020.0002] # YI SYLLABLE SIT -A30A ; [.3F32.0020.0002] # YI SYLLABLE SIX -A30B ; [.3F33.0020.0002] # YI SYLLABLE SI -A30C ; [.3F34.0020.0002] # YI SYLLABLE SIP -A30D ; [.3F35.0020.0002] # YI SYLLABLE SIEX -A30E ; [.3F36.0020.0002] # YI SYLLABLE SIE -A30F ; [.3F37.0020.0002] # YI SYLLABLE SIEP -A310 ; [.3F38.0020.0002] # YI SYLLABLE SAT -A311 ; [.3F39.0020.0002] # YI SYLLABLE SAX -A312 ; [.3F3A.0020.0002] # YI SYLLABLE SA -A313 ; [.3F3B.0020.0002] # YI SYLLABLE SAP -A314 ; [.3F3C.0020.0002] # YI SYLLABLE SUOX -A315 ; [.3F3D.0020.0002] # YI SYLLABLE SUO -A316 ; [.3F3E.0020.0002] # YI SYLLABLE SUOP -A317 ; [.3F3F.0020.0002] # YI SYLLABLE SOT -A318 ; [.3F40.0020.0002] # YI SYLLABLE SOX -A319 ; [.3F41.0020.0002] # YI SYLLABLE SO -A31A ; [.3F42.0020.0002] # YI SYLLABLE SOP -A31B ; [.3F43.0020.0002] # YI SYLLABLE SEX -A31C ; [.3F44.0020.0002] # YI SYLLABLE SE -A31D ; [.3F45.0020.0002] # YI SYLLABLE SEP -A31E ; [.3F46.0020.0002] # YI SYLLABLE SUT -A31F ; [.3F47.0020.0002] # YI SYLLABLE SUX -A320 ; [.3F48.0020.0002] # YI SYLLABLE SU -A321 ; [.3F49.0020.0002] # YI SYLLABLE SUP -A322 ; [.3F4A.0020.0002] # YI SYLLABLE SURX -A323 ; [.3F4B.0020.0002] # YI SYLLABLE SUR -A324 ; [.3F4C.0020.0002] # YI SYLLABLE SYT -A325 ; [.3F4D.0020.0002] # YI SYLLABLE SYX -A326 ; [.3F4E.0020.0002] # YI SYLLABLE SY -A327 ; [.3F4F.0020.0002] # YI SYLLABLE SYP -A328 ; [.3F50.0020.0002] # YI SYLLABLE SYRX -A329 ; [.3F51.0020.0002] # YI SYLLABLE SYR -A32A ; [.3F52.0020.0002] # YI SYLLABLE SSIT -A32B ; [.3F53.0020.0002] # YI SYLLABLE SSIX -A32C ; [.3F54.0020.0002] # YI SYLLABLE SSI -A32D ; [.3F55.0020.0002] # YI SYLLABLE SSIP -A32E ; [.3F56.0020.0002] # YI SYLLABLE SSIEX -A32F ; [.3F57.0020.0002] # YI SYLLABLE SSIE -A330 ; [.3F58.0020.0002] # YI SYLLABLE SSIEP -A331 ; [.3F59.0020.0002] # YI SYLLABLE SSAT -A332 ; [.3F5A.0020.0002] # YI SYLLABLE SSAX -A333 ; [.3F5B.0020.0002] # YI SYLLABLE SSA -A334 ; [.3F5C.0020.0002] # YI SYLLABLE SSAP -A335 ; [.3F5D.0020.0002] # YI SYLLABLE SSOT -A336 ; [.3F5E.0020.0002] # YI SYLLABLE SSOX -A337 ; [.3F5F.0020.0002] # YI SYLLABLE SSO -A338 ; [.3F60.0020.0002] # YI SYLLABLE SSOP -A339 ; [.3F61.0020.0002] # YI SYLLABLE SSEX -A33A ; [.3F62.0020.0002] # YI SYLLABLE SSE -A33B ; [.3F63.0020.0002] # YI SYLLABLE SSEP -A33C ; [.3F64.0020.0002] # YI SYLLABLE SSUT -A33D ; [.3F65.0020.0002] # YI SYLLABLE SSUX -A33E ; [.3F66.0020.0002] # YI SYLLABLE SSU -A33F ; [.3F67.0020.0002] # YI SYLLABLE SSUP -A340 ; [.3F68.0020.0002] # YI SYLLABLE SSYT -A341 ; [.3F69.0020.0002] # YI SYLLABLE SSYX -A342 ; [.3F6A.0020.0002] # YI SYLLABLE SSY -A343 ; [.3F6B.0020.0002] # YI SYLLABLE SSYP -A344 ; [.3F6C.0020.0002] # YI SYLLABLE SSYRX -A345 ; [.3F6D.0020.0002] # YI SYLLABLE SSYR -A346 ; [.3F6E.0020.0002] # YI SYLLABLE ZHAT -A347 ; [.3F6F.0020.0002] # YI SYLLABLE ZHAX -A348 ; [.3F70.0020.0002] # YI SYLLABLE ZHA -A349 ; [.3F71.0020.0002] # YI SYLLABLE ZHAP -A34A ; [.3F72.0020.0002] # YI SYLLABLE ZHUOX -A34B ; [.3F73.0020.0002] # YI SYLLABLE ZHUO -A34C ; [.3F74.0020.0002] # YI SYLLABLE ZHUOP -A34D ; [.3F75.0020.0002] # YI SYLLABLE ZHOT -A34E ; [.3F76.0020.0002] # YI SYLLABLE ZHOX -A34F ; [.3F77.0020.0002] # YI SYLLABLE ZHO -A350 ; [.3F78.0020.0002] # YI SYLLABLE ZHOP -A351 ; [.3F79.0020.0002] # YI SYLLABLE ZHET -A352 ; [.3F7A.0020.0002] # YI SYLLABLE ZHEX -A353 ; [.3F7B.0020.0002] # YI SYLLABLE ZHE -A354 ; [.3F7C.0020.0002] # YI SYLLABLE ZHEP -A355 ; [.3F7D.0020.0002] # YI SYLLABLE ZHUT -A356 ; [.3F7E.0020.0002] # YI SYLLABLE ZHUX -A357 ; [.3F7F.0020.0002] # YI SYLLABLE ZHU -A358 ; [.3F80.0020.0002] # YI SYLLABLE ZHUP -A359 ; [.3F81.0020.0002] # YI SYLLABLE ZHURX -A35A ; [.3F82.0020.0002] # YI SYLLABLE ZHUR -A35B ; [.3F83.0020.0002] # YI SYLLABLE ZHYT -A35C ; [.3F84.0020.0002] # YI SYLLABLE ZHYX -A35D ; [.3F85.0020.0002] # YI SYLLABLE ZHY -A35E ; [.3F86.0020.0002] # YI SYLLABLE ZHYP -A35F ; [.3F87.0020.0002] # YI SYLLABLE ZHYRX -A360 ; [.3F88.0020.0002] # YI SYLLABLE ZHYR -A361 ; [.3F89.0020.0002] # YI SYLLABLE CHAT -A362 ; [.3F8A.0020.0002] # YI SYLLABLE CHAX -A363 ; [.3F8B.0020.0002] # YI SYLLABLE CHA -A364 ; [.3F8C.0020.0002] # YI SYLLABLE CHAP -A365 ; [.3F8D.0020.0002] # YI SYLLABLE CHUOT -A366 ; [.3F8E.0020.0002] # YI SYLLABLE CHUOX -A367 ; [.3F8F.0020.0002] # YI SYLLABLE CHUO -A368 ; [.3F90.0020.0002] # YI SYLLABLE CHUOP -A369 ; [.3F91.0020.0002] # YI SYLLABLE CHOT -A36A ; [.3F92.0020.0002] # YI SYLLABLE CHOX -A36B ; [.3F93.0020.0002] # YI SYLLABLE CHO -A36C ; [.3F94.0020.0002] # YI SYLLABLE CHOP -A36D ; [.3F95.0020.0002] # YI SYLLABLE CHET -A36E ; [.3F96.0020.0002] # YI SYLLABLE CHEX -A36F ; [.3F97.0020.0002] # YI SYLLABLE CHE -A370 ; [.3F98.0020.0002] # YI SYLLABLE CHEP -A371 ; [.3F99.0020.0002] # YI SYLLABLE CHUX -A372 ; [.3F9A.0020.0002] # YI SYLLABLE CHU -A373 ; [.3F9B.0020.0002] # YI SYLLABLE CHUP -A374 ; [.3F9C.0020.0002] # YI SYLLABLE CHURX -A375 ; [.3F9D.0020.0002] # YI SYLLABLE CHUR -A376 ; [.3F9E.0020.0002] # YI SYLLABLE CHYT -A377 ; [.3F9F.0020.0002] # YI SYLLABLE CHYX -A378 ; [.3FA0.0020.0002] # YI SYLLABLE CHY -A379 ; [.3FA1.0020.0002] # YI SYLLABLE CHYP -A37A ; [.3FA2.0020.0002] # YI SYLLABLE CHYRX -A37B ; [.3FA3.0020.0002] # YI SYLLABLE CHYR -A37C ; [.3FA4.0020.0002] # YI SYLLABLE RRAX -A37D ; [.3FA5.0020.0002] # YI SYLLABLE RRA -A37E ; [.3FA6.0020.0002] # YI SYLLABLE RRUOX -A37F ; [.3FA7.0020.0002] # YI SYLLABLE RRUO -A380 ; [.3FA8.0020.0002] # YI SYLLABLE RROT -A381 ; [.3FA9.0020.0002] # YI SYLLABLE RROX -A382 ; [.3FAA.0020.0002] # YI SYLLABLE RRO -A383 ; [.3FAB.0020.0002] # YI SYLLABLE RROP -A384 ; [.3FAC.0020.0002] # YI SYLLABLE RRET -A385 ; [.3FAD.0020.0002] # YI SYLLABLE RREX -A386 ; [.3FAE.0020.0002] # YI SYLLABLE RRE -A387 ; [.3FAF.0020.0002] # YI SYLLABLE RREP -A388 ; [.3FB0.0020.0002] # YI SYLLABLE RRUT -A389 ; [.3FB1.0020.0002] # YI SYLLABLE RRUX -A38A ; [.3FB2.0020.0002] # YI SYLLABLE RRU -A38B ; [.3FB3.0020.0002] # YI SYLLABLE RRUP -A38C ; [.3FB4.0020.0002] # YI SYLLABLE RRURX -A38D ; [.3FB5.0020.0002] # YI SYLLABLE RRUR -A38E ; [.3FB6.0020.0002] # YI SYLLABLE RRYT -A38F ; [.3FB7.0020.0002] # YI SYLLABLE RRYX -A390 ; [.3FB8.0020.0002] # YI SYLLABLE RRY -A391 ; [.3FB9.0020.0002] # YI SYLLABLE RRYP -A392 ; [.3FBA.0020.0002] # YI SYLLABLE RRYRX -A393 ; [.3FBB.0020.0002] # YI SYLLABLE RRYR -A394 ; [.3FBC.0020.0002] # YI SYLLABLE NRAT -A395 ; [.3FBD.0020.0002] # YI SYLLABLE NRAX -A396 ; [.3FBE.0020.0002] # YI SYLLABLE NRA -A397 ; [.3FBF.0020.0002] # YI SYLLABLE NRAP -A398 ; [.3FC0.0020.0002] # YI SYLLABLE NROX -A399 ; [.3FC1.0020.0002] # YI SYLLABLE NRO -A39A ; [.3FC2.0020.0002] # YI SYLLABLE NROP -A39B ; [.3FC3.0020.0002] # YI SYLLABLE NRET -A39C ; [.3FC4.0020.0002] # YI SYLLABLE NREX -A39D ; [.3FC5.0020.0002] # YI SYLLABLE NRE -A39E ; [.3FC6.0020.0002] # YI SYLLABLE NREP -A39F ; [.3FC7.0020.0002] # YI SYLLABLE NRUT -A3A0 ; [.3FC8.0020.0002] # YI SYLLABLE NRUX -A3A1 ; [.3FC9.0020.0002] # YI SYLLABLE NRU -A3A2 ; [.3FCA.0020.0002] # YI SYLLABLE NRUP -A3A3 ; [.3FCB.0020.0002] # YI SYLLABLE NRURX -A3A4 ; [.3FCC.0020.0002] # YI SYLLABLE NRUR -A3A5 ; [.3FCD.0020.0002] # YI SYLLABLE NRYT -A3A6 ; [.3FCE.0020.0002] # YI SYLLABLE NRYX -A3A7 ; [.3FCF.0020.0002] # YI SYLLABLE NRY -A3A8 ; [.3FD0.0020.0002] # YI SYLLABLE NRYP -A3A9 ; [.3FD1.0020.0002] # YI SYLLABLE NRYRX -A3AA ; [.3FD2.0020.0002] # YI SYLLABLE NRYR -A3AB ; [.3FD3.0020.0002] # YI SYLLABLE SHAT -A3AC ; [.3FD4.0020.0002] # YI SYLLABLE SHAX -A3AD ; [.3FD5.0020.0002] # YI SYLLABLE SHA -A3AE ; [.3FD6.0020.0002] # YI SYLLABLE SHAP -A3AF ; [.3FD7.0020.0002] # YI SYLLABLE SHUOX -A3B0 ; [.3FD8.0020.0002] # YI SYLLABLE SHUO -A3B1 ; [.3FD9.0020.0002] # YI SYLLABLE SHUOP -A3B2 ; [.3FDA.0020.0002] # YI SYLLABLE SHOT -A3B3 ; [.3FDB.0020.0002] # YI SYLLABLE SHOX -A3B4 ; [.3FDC.0020.0002] # YI SYLLABLE SHO -A3B5 ; [.3FDD.0020.0002] # YI SYLLABLE SHOP -A3B6 ; [.3FDE.0020.0002] # YI SYLLABLE SHET -A3B7 ; [.3FDF.0020.0002] # YI SYLLABLE SHEX -A3B8 ; [.3FE0.0020.0002] # YI SYLLABLE SHE -A3B9 ; [.3FE1.0020.0002] # YI SYLLABLE SHEP -A3BA ; [.3FE2.0020.0002] # YI SYLLABLE SHUT -A3BB ; [.3FE3.0020.0002] # YI SYLLABLE SHUX -A3BC ; [.3FE4.0020.0002] # YI SYLLABLE SHU -A3BD ; [.3FE5.0020.0002] # YI SYLLABLE SHUP -A3BE ; [.3FE6.0020.0002] # YI SYLLABLE SHURX -A3BF ; [.3FE7.0020.0002] # YI SYLLABLE SHUR -A3C0 ; [.3FE8.0020.0002] # YI SYLLABLE SHYT -A3C1 ; [.3FE9.0020.0002] # YI SYLLABLE SHYX -A3C2 ; [.3FEA.0020.0002] # YI SYLLABLE SHY -A3C3 ; [.3FEB.0020.0002] # YI SYLLABLE SHYP -A3C4 ; [.3FEC.0020.0002] # YI SYLLABLE SHYRX -A3C5 ; [.3FED.0020.0002] # YI SYLLABLE SHYR -A3C6 ; [.3FEE.0020.0002] # YI SYLLABLE RAT -A3C7 ; [.3FEF.0020.0002] # YI SYLLABLE RAX -A3C8 ; [.3FF0.0020.0002] # YI SYLLABLE RA -A3C9 ; [.3FF1.0020.0002] # YI SYLLABLE RAP -A3CA ; [.3FF2.0020.0002] # YI SYLLABLE RUOX -A3CB ; [.3FF3.0020.0002] # YI SYLLABLE RUO -A3CC ; [.3FF4.0020.0002] # YI SYLLABLE RUOP -A3CD ; [.3FF5.0020.0002] # YI SYLLABLE ROT -A3CE ; [.3FF6.0020.0002] # YI SYLLABLE ROX -A3CF ; [.3FF7.0020.0002] # YI SYLLABLE RO -A3D0 ; [.3FF8.0020.0002] # YI SYLLABLE ROP -A3D1 ; [.3FF9.0020.0002] # YI SYLLABLE REX -A3D2 ; [.3FFA.0020.0002] # YI SYLLABLE RE -A3D3 ; [.3FFB.0020.0002] # YI SYLLABLE REP -A3D4 ; [.3FFC.0020.0002] # YI SYLLABLE RUT -A3D5 ; [.3FFD.0020.0002] # YI SYLLABLE RUX -A3D6 ; [.3FFE.0020.0002] # YI SYLLABLE RU -A3D7 ; [.3FFF.0020.0002] # YI SYLLABLE RUP -A3D8 ; [.4000.0020.0002] # YI SYLLABLE RURX -A3D9 ; [.4001.0020.0002] # YI SYLLABLE RUR -A3DA ; [.4002.0020.0002] # YI SYLLABLE RYT -A3DB ; [.4003.0020.0002] # YI SYLLABLE RYX -A3DC ; [.4004.0020.0002] # YI SYLLABLE RY -A3DD ; [.4005.0020.0002] # YI SYLLABLE RYP -A3DE ; [.4006.0020.0002] # YI SYLLABLE RYRX -A3DF ; [.4007.0020.0002] # YI SYLLABLE RYR -A3E0 ; [.4008.0020.0002] # YI SYLLABLE JIT -A3E1 ; [.4009.0020.0002] # YI SYLLABLE JIX -A3E2 ; [.400A.0020.0002] # YI SYLLABLE JI -A3E3 ; [.400B.0020.0002] # YI SYLLABLE JIP -A3E4 ; [.400C.0020.0002] # YI SYLLABLE JIET -A3E5 ; [.400D.0020.0002] # YI SYLLABLE JIEX -A3E6 ; [.400E.0020.0002] # YI SYLLABLE JIE -A3E7 ; [.400F.0020.0002] # YI SYLLABLE JIEP -A3E8 ; [.4010.0020.0002] # YI SYLLABLE JUOT -A3E9 ; [.4011.0020.0002] # YI SYLLABLE JUOX -A3EA ; [.4012.0020.0002] # YI SYLLABLE JUO -A3EB ; [.4013.0020.0002] # YI SYLLABLE JUOP -A3EC ; [.4014.0020.0002] # YI SYLLABLE JOT -A3ED ; [.4015.0020.0002] # YI SYLLABLE JOX -A3EE ; [.4016.0020.0002] # YI SYLLABLE JO -A3EF ; [.4017.0020.0002] # YI SYLLABLE JOP -A3F0 ; [.4018.0020.0002] # YI SYLLABLE JUT -A3F1 ; [.4019.0020.0002] # YI SYLLABLE JUX -A3F2 ; [.401A.0020.0002] # YI SYLLABLE JU -A3F3 ; [.401B.0020.0002] # YI SYLLABLE JUP -A3F4 ; [.401C.0020.0002] # YI SYLLABLE JURX -A3F5 ; [.401D.0020.0002] # YI SYLLABLE JUR -A3F6 ; [.401E.0020.0002] # YI SYLLABLE JYT -A3F7 ; [.401F.0020.0002] # YI SYLLABLE JYX -A3F8 ; [.4020.0020.0002] # YI SYLLABLE JY -A3F9 ; [.4021.0020.0002] # YI SYLLABLE JYP -A3FA ; [.4022.0020.0002] # YI SYLLABLE JYRX -A3FB ; [.4023.0020.0002] # YI SYLLABLE JYR -A3FC ; [.4024.0020.0002] # YI SYLLABLE QIT -A3FD ; [.4025.0020.0002] # YI SYLLABLE QIX -A3FE ; [.4026.0020.0002] # YI SYLLABLE QI -A3FF ; [.4027.0020.0002] # YI SYLLABLE QIP -A400 ; [.4028.0020.0002] # YI SYLLABLE QIET -A401 ; [.4029.0020.0002] # YI SYLLABLE QIEX -A402 ; [.402A.0020.0002] # YI SYLLABLE QIE -A403 ; [.402B.0020.0002] # YI SYLLABLE QIEP -A404 ; [.402C.0020.0002] # YI SYLLABLE QUOT -A405 ; [.402D.0020.0002] # YI SYLLABLE QUOX -A406 ; [.402E.0020.0002] # YI SYLLABLE QUO -A407 ; [.402F.0020.0002] # YI SYLLABLE QUOP -A408 ; [.4030.0020.0002] # YI SYLLABLE QOT -A409 ; [.4031.0020.0002] # YI SYLLABLE QOX -A40A ; [.4032.0020.0002] # YI SYLLABLE QO -A40B ; [.4033.0020.0002] # YI SYLLABLE QOP -A40C ; [.4034.0020.0002] # YI SYLLABLE QUT -A40D ; [.4035.0020.0002] # YI SYLLABLE QUX -A40E ; [.4036.0020.0002] # YI SYLLABLE QU -A40F ; [.4037.0020.0002] # YI SYLLABLE QUP -A410 ; [.4038.0020.0002] # YI SYLLABLE QURX -A411 ; [.4039.0020.0002] # YI SYLLABLE QUR -A412 ; [.403A.0020.0002] # YI SYLLABLE QYT -A413 ; [.403B.0020.0002] # YI SYLLABLE QYX -A414 ; [.403C.0020.0002] # YI SYLLABLE QY -A415 ; [.403D.0020.0002] # YI SYLLABLE QYP -A416 ; [.403E.0020.0002] # YI SYLLABLE QYRX -A417 ; [.403F.0020.0002] # YI SYLLABLE QYR -A418 ; [.4040.0020.0002] # YI SYLLABLE JJIT -A419 ; [.4041.0020.0002] # YI SYLLABLE JJIX -A41A ; [.4042.0020.0002] # YI SYLLABLE JJI -A41B ; [.4043.0020.0002] # YI SYLLABLE JJIP -A41C ; [.4044.0020.0002] # YI SYLLABLE JJIET -A41D ; [.4045.0020.0002] # YI SYLLABLE JJIEX -A41E ; [.4046.0020.0002] # YI SYLLABLE JJIE -A41F ; [.4047.0020.0002] # YI SYLLABLE JJIEP -A420 ; [.4048.0020.0002] # YI SYLLABLE JJUOX -A421 ; [.4049.0020.0002] # YI SYLLABLE JJUO -A422 ; [.404A.0020.0002] # YI SYLLABLE JJUOP -A423 ; [.404B.0020.0002] # YI SYLLABLE JJOT -A424 ; [.404C.0020.0002] # YI SYLLABLE JJOX -A425 ; [.404D.0020.0002] # YI SYLLABLE JJO -A426 ; [.404E.0020.0002] # YI SYLLABLE JJOP -A427 ; [.404F.0020.0002] # YI SYLLABLE JJUT -A428 ; [.4050.0020.0002] # YI SYLLABLE JJUX -A429 ; [.4051.0020.0002] # YI SYLLABLE JJU -A42A ; [.4052.0020.0002] # YI SYLLABLE JJUP -A42B ; [.4053.0020.0002] # YI SYLLABLE JJURX -A42C ; [.4054.0020.0002] # YI SYLLABLE JJUR -A42D ; [.4055.0020.0002] # YI SYLLABLE JJYT -A42E ; [.4056.0020.0002] # YI SYLLABLE JJYX -A42F ; [.4057.0020.0002] # YI SYLLABLE JJY -A430 ; [.4058.0020.0002] # YI SYLLABLE JJYP -A431 ; [.4059.0020.0002] # YI SYLLABLE NJIT -A432 ; [.405A.0020.0002] # YI SYLLABLE NJIX -A433 ; [.405B.0020.0002] # YI SYLLABLE NJI -A434 ; [.405C.0020.0002] # YI SYLLABLE NJIP -A435 ; [.405D.0020.0002] # YI SYLLABLE NJIET -A436 ; [.405E.0020.0002] # YI SYLLABLE NJIEX -A437 ; [.405F.0020.0002] # YI SYLLABLE NJIE -A438 ; [.4060.0020.0002] # YI SYLLABLE NJIEP -A439 ; [.4061.0020.0002] # YI SYLLABLE NJUOX -A43A ; [.4062.0020.0002] # YI SYLLABLE NJUO -A43B ; [.4063.0020.0002] # YI SYLLABLE NJOT -A43C ; [.4064.0020.0002] # YI SYLLABLE NJOX -A43D ; [.4065.0020.0002] # YI SYLLABLE NJO -A43E ; [.4066.0020.0002] # YI SYLLABLE NJOP -A43F ; [.4067.0020.0002] # YI SYLLABLE NJUX -A440 ; [.4068.0020.0002] # YI SYLLABLE NJU -A441 ; [.4069.0020.0002] # YI SYLLABLE NJUP -A442 ; [.406A.0020.0002] # YI SYLLABLE NJURX -A443 ; [.406B.0020.0002] # YI SYLLABLE NJUR -A444 ; [.406C.0020.0002] # YI SYLLABLE NJYT -A445 ; [.406D.0020.0002] # YI SYLLABLE NJYX -A446 ; [.406E.0020.0002] # YI SYLLABLE NJY -A447 ; [.406F.0020.0002] # YI SYLLABLE NJYP -A448 ; [.4070.0020.0002] # YI SYLLABLE NJYRX -A449 ; [.4071.0020.0002] # YI SYLLABLE NJYR -A44A ; [.4072.0020.0002] # YI SYLLABLE NYIT -A44B ; [.4073.0020.0002] # YI SYLLABLE NYIX -A44C ; [.4074.0020.0002] # YI SYLLABLE NYI -A44D ; [.4075.0020.0002] # YI SYLLABLE NYIP -A44E ; [.4076.0020.0002] # YI SYLLABLE NYIET -A44F ; [.4077.0020.0002] # YI SYLLABLE NYIEX -A450 ; [.4078.0020.0002] # YI SYLLABLE NYIE -A451 ; [.4079.0020.0002] # YI SYLLABLE NYIEP -A452 ; [.407A.0020.0002] # YI SYLLABLE NYUOX -A453 ; [.407B.0020.0002] # YI SYLLABLE NYUO -A454 ; [.407C.0020.0002] # YI SYLLABLE NYUOP -A455 ; [.407D.0020.0002] # YI SYLLABLE NYOT -A456 ; [.407E.0020.0002] # YI SYLLABLE NYOX -A457 ; [.407F.0020.0002] # YI SYLLABLE NYO -A458 ; [.4080.0020.0002] # YI SYLLABLE NYOP -A459 ; [.4081.0020.0002] # YI SYLLABLE NYUT -A45A ; [.4082.0020.0002] # YI SYLLABLE NYUX -A45B ; [.4083.0020.0002] # YI SYLLABLE NYU -A45C ; [.4084.0020.0002] # YI SYLLABLE NYUP -A45D ; [.4085.0020.0002] # YI SYLLABLE XIT -A45E ; [.4086.0020.0002] # YI SYLLABLE XIX -A45F ; [.4087.0020.0002] # YI SYLLABLE XI -A460 ; [.4088.0020.0002] # YI SYLLABLE XIP -A461 ; [.4089.0020.0002] # YI SYLLABLE XIET -A462 ; [.408A.0020.0002] # YI SYLLABLE XIEX -A463 ; [.408B.0020.0002] # YI SYLLABLE XIE -A464 ; [.408C.0020.0002] # YI SYLLABLE XIEP -A465 ; [.408D.0020.0002] # YI SYLLABLE XUOX -A466 ; [.408E.0020.0002] # YI SYLLABLE XUO -A467 ; [.408F.0020.0002] # YI SYLLABLE XOT -A468 ; [.4090.0020.0002] # YI SYLLABLE XOX -A469 ; [.4091.0020.0002] # YI SYLLABLE XO -A46A ; [.4092.0020.0002] # YI SYLLABLE XOP -A46B ; [.4093.0020.0002] # YI SYLLABLE XYT -A46C ; [.4094.0020.0002] # YI SYLLABLE XYX -A46D ; [.4095.0020.0002] # YI SYLLABLE XY -A46E ; [.4096.0020.0002] # YI SYLLABLE XYP -A46F ; [.4097.0020.0002] # YI SYLLABLE XYRX -A470 ; [.4098.0020.0002] # YI SYLLABLE XYR -A471 ; [.4099.0020.0002] # YI SYLLABLE YIT -A472 ; [.409A.0020.0002] # YI SYLLABLE YIX -A473 ; [.409B.0020.0002] # YI SYLLABLE YI -A474 ; [.409C.0020.0002] # YI SYLLABLE YIP -A475 ; [.409D.0020.0002] # YI SYLLABLE YIET -A476 ; [.409E.0020.0002] # YI SYLLABLE YIEX -A477 ; [.409F.0020.0002] # YI SYLLABLE YIE -A478 ; [.40A0.0020.0002] # YI SYLLABLE YIEP -A479 ; [.40A1.0020.0002] # YI SYLLABLE YUOT -A47A ; [.40A2.0020.0002] # YI SYLLABLE YUOX -A47B ; [.40A3.0020.0002] # YI SYLLABLE YUO -A47C ; [.40A4.0020.0002] # YI SYLLABLE YUOP -A47D ; [.40A5.0020.0002] # YI SYLLABLE YOT -A47E ; [.40A6.0020.0002] # YI SYLLABLE YOX -A47F ; [.40A7.0020.0002] # YI SYLLABLE YO -A480 ; [.40A8.0020.0002] # YI SYLLABLE YOP -A481 ; [.40A9.0020.0002] # YI SYLLABLE YUT -A482 ; [.40AA.0020.0002] # YI SYLLABLE YUX -A483 ; [.40AB.0020.0002] # YI SYLLABLE YU -A484 ; [.40AC.0020.0002] # YI SYLLABLE YUP -A485 ; [.40AD.0020.0002] # YI SYLLABLE YURX -A486 ; [.40AE.0020.0002] # YI SYLLABLE YUR -A487 ; [.40AF.0020.0002] # YI SYLLABLE YYT -A488 ; [.40B0.0020.0002] # YI SYLLABLE YYX -A489 ; [.40B1.0020.0002] # YI SYLLABLE YY -A48A ; [.40B2.0020.0002] # YI SYLLABLE YYP -A48B ; [.40B3.0020.0002] # YI SYLLABLE YYRX -A48C ; [.40B4.0020.0002] # YI SYLLABLE YYR -A4F8 ; [.40B5.0020.0002] # LISU LETTER TONE MYA TI -A4F9 ; [.40B6.0020.0002] # LISU LETTER TONE NA PO -A4FA ; [.40B7.0020.0002] # LISU LETTER TONE MYA CYA -A4FB ; [.40B8.0020.0002] # LISU LETTER TONE MYA BO -A4FD ; [.40B9.0020.0002] # LISU LETTER TONE MYA JEU -A4FC ; [.40BA.0020.0002] # LISU LETTER TONE MYA NA -A4D0 ; [.40BB.0020.0002] # LISU LETTER BA -A4D1 ; [.40BC.0020.0002] # LISU LETTER PA -A4D2 ; [.40BD.0020.0002] # LISU LETTER PHA -A4D3 ; [.40BE.0020.0002] # LISU LETTER DA -A4D4 ; [.40BF.0020.0002] # LISU LETTER TA -A4D5 ; [.40C0.0020.0002] # LISU LETTER THA -A4D6 ; [.40C1.0020.0002] # LISU LETTER GA -A4D7 ; [.40C2.0020.0002] # LISU LETTER KA -A4D8 ; [.40C3.0020.0002] # LISU LETTER KHA -A4D9 ; [.40C4.0020.0002] # LISU LETTER JA -A4DA ; [.40C5.0020.0002] # LISU LETTER CA -A4DB ; [.40C6.0020.0002] # LISU LETTER CHA -A4DC ; [.40C7.0020.0002] # LISU LETTER DZA -A4DD ; [.40C8.0020.0002] # LISU LETTER TSA -A4DE ; [.40C9.0020.0002] # LISU LETTER TSHA -A4DF ; [.40CA.0020.0002] # LISU LETTER MA -A4E0 ; [.40CB.0020.0002] # LISU LETTER NA -A4E1 ; [.40CC.0020.0002] # LISU LETTER LA -A4E2 ; [.40CD.0020.0002] # LISU LETTER SA -A4E3 ; [.40CE.0020.0002] # LISU LETTER ZHA -A4E4 ; [.40CF.0020.0002] # LISU LETTER ZA -A4E5 ; [.40D0.0020.0002] # LISU LETTER NGA -A4E6 ; [.40D1.0020.0002] # LISU LETTER HA -A4E7 ; [.40D2.0020.0002] # LISU LETTER XA -A4E8 ; [.40D3.0020.0002] # LISU LETTER HHA -A4E9 ; [.40D4.0020.0002] # LISU LETTER FA -A4EB ; [.40D5.0020.0002] # LISU LETTER SHA -A4ED ; [.40D6.0020.0002] # LISU LETTER GHA -A4EA ; [.40D7.0020.0002] # LISU LETTER WA -A4EC ; [.40D8.0020.0002] # LISU LETTER YA -A4EE ; [.40D9.0020.0002] # LISU LETTER A -A4EF ; [.40DA.0020.0002] # LISU LETTER AE -A4F0 ; [.40DB.0020.0002] # LISU LETTER E -A4F1 ; [.40DC.0020.0002] # LISU LETTER EU -A4F2 ; [.40DD.0020.0002] # LISU LETTER I -A4F3 ; [.40DE.0020.0002] # LISU LETTER O -A4F4 ; [.40DF.0020.0002] # LISU LETTER U -A4F5 ; [.40E0.0020.0002] # LISU LETTER UE -A4F6 ; [.40E1.0020.0002] # LISU LETTER UH -A4F7 ; [.40E2.0020.0002] # LISU LETTER OE -16F00 ; [.40E3.0020.0002] # MIAO LETTER PA -16F01 ; [.40E4.0020.0002] # MIAO LETTER BA -16F02 ; [.40E5.0020.0002] # MIAO LETTER YI PA -16F03 ; [.40E6.0020.0002] # MIAO LETTER PLA -16F04 ; [.40E7.0020.0002] # MIAO LETTER MA -16F06 ; [.40E7.0020.0004] # MIAO LETTER ARCHAIC MA -16F05 ; [.40E8.0020.0002] # MIAO LETTER MHA -16F07 ; [.40E9.0020.0002] # MIAO LETTER FA -16F08 ; [.40EA.0020.0002] # MIAO LETTER VA -16F09 ; [.40EB.0020.0002] # MIAO LETTER VFA -16F0A ; [.40EC.0020.0002] # MIAO LETTER TA -16F0B ; [.40ED.0020.0002] # MIAO LETTER DA -16F0C ; [.40EE.0020.0002] # MIAO LETTER YI TTA -16F0D ; [.40EF.0020.0002] # MIAO LETTER YI TA -16F0E ; [.40F0.0020.0002] # MIAO LETTER TTA -16F0F ; [.40F1.0020.0002] # MIAO LETTER DDA -16F10 ; [.40F2.0020.0002] # MIAO LETTER NA -16F13 ; [.40F2.0020.0004] # MIAO LETTER ARCHAIC NA -16F11 ; [.40F3.0020.0002] # MIAO LETTER NHA -16F12 ; [.40F4.0020.0002] # MIAO LETTER YI NNA -16F14 ; [.40F5.0020.0002] # MIAO LETTER NNA -16F15 ; [.40F6.0020.0002] # MIAO LETTER NNHA -16F16 ; [.40F7.0020.0002] # MIAO LETTER LA -16F17 ; [.40F8.0020.0002] # MIAO LETTER LYA -16F18 ; [.40F9.0020.0002] # MIAO LETTER LHA -16F19 ; [.40FA.0020.0002] # MIAO LETTER LHYA -16F1A ; [.40FB.0020.0002] # MIAO LETTER TLHA -16F1B ; [.40FC.0020.0002] # MIAO LETTER DLHA -16F1C ; [.40FD.0020.0002] # MIAO LETTER TLHYA -16F1D ; [.40FE.0020.0002] # MIAO LETTER DLHYA -16F1E ; [.40FF.0020.0002] # MIAO LETTER KA -16F1F ; [.4100.0020.0002] # MIAO LETTER GA -16F20 ; [.4101.0020.0002] # MIAO LETTER YI KA -16F21 ; [.4102.0020.0002] # MIAO LETTER QA -16F22 ; [.4103.0020.0002] # MIAO LETTER QGA -16F23 ; [.4104.0020.0002] # MIAO LETTER NGA -16F25 ; [.4104.0020.0004] # MIAO LETTER ARCHAIC NGA -16F24 ; [.4105.0020.0002] # MIAO LETTER NGHA -16F26 ; [.4106.0020.0002] # MIAO LETTER HA -16F27 ; [.4107.0020.0002] # MIAO LETTER XA -16F28 ; [.4108.0020.0002] # MIAO LETTER GHA -16F29 ; [.4109.0020.0002] # MIAO LETTER GHHA -16F2A ; [.410A.0020.0002] # MIAO LETTER TSSA -16F2B ; [.410B.0020.0002] # MIAO LETTER DZZA -16F2C ; [.410C.0020.0002] # MIAO LETTER NYA -16F2D ; [.410D.0020.0002] # MIAO LETTER NYHA -16F2E ; [.410E.0020.0002] # MIAO LETTER TSHA -16F2F ; [.410F.0020.0002] # MIAO LETTER DZHA -16F30 ; [.4110.0020.0002] # MIAO LETTER YI TSHA -16F31 ; [.4111.0020.0002] # MIAO LETTER YI DZHA -16F32 ; [.4112.0020.0002] # MIAO LETTER REFORMED TSHA -16F33 ; [.4113.0020.0002] # MIAO LETTER SHA -16F34 ; [.4114.0020.0002] # MIAO LETTER SSA -16F35 ; [.4115.0020.0002] # MIAO LETTER ZHA -16F36 ; [.4116.0020.0002] # MIAO LETTER ZSHA -16F37 ; [.4117.0020.0002] # MIAO LETTER TSA -16F38 ; [.4118.0020.0002] # MIAO LETTER DZA -16F39 ; [.4119.0020.0002] # MIAO LETTER YI TSA -16F3A ; [.411A.0020.0002] # MIAO LETTER SA -16F3B ; [.411B.0020.0002] # MIAO LETTER ZA -16F3C ; [.411C.0020.0002] # MIAO LETTER ZSA -16F3D ; [.411D.0020.0002] # MIAO LETTER ZZA -16F3F ; [.411D.0020.0004] # MIAO LETTER ARCHAIC ZZA -16F3E ; [.411E.0020.0002] # MIAO LETTER ZZSA -16F40 ; [.411F.0020.0002] # MIAO LETTER ZZYA -16F41 ; [.4120.0020.0002] # MIAO LETTER ZZSYA -16F42 ; [.4121.0020.0002] # MIAO LETTER WA -16F43 ; [.4122.0020.0002] # MIAO LETTER AH -16F44 ; [.4123.0020.0002] # MIAO LETTER HHA -16F50 ; [.4124.0020.0002] # MIAO LETTER NASALIZATION -16F51 ; [.4125.0020.0002] # MIAO SIGN ASPIRATION -16F52 ; [.4126.0020.0002] # MIAO SIGN REFORMED VOICING -16F53 ; [.4127.0020.0002] # MIAO SIGN REFORMED ASPIRATION -16F54 ; [.4128.0020.0002] # MIAO VOWEL SIGN A -16F55 ; [.4129.0020.0002] # MIAO VOWEL SIGN AA -16F56 ; [.412A.0020.0002] # MIAO VOWEL SIGN AHH -16F57 ; [.412B.0020.0002] # MIAO VOWEL SIGN AN -16F58 ; [.412C.0020.0002] # MIAO VOWEL SIGN ANG -16F59 ; [.412D.0020.0002] # MIAO VOWEL SIGN O -16F5A ; [.412E.0020.0002] # MIAO VOWEL SIGN OO -16F5B ; [.412F.0020.0002] # MIAO VOWEL SIGN WO -16F5C ; [.4130.0020.0002] # MIAO VOWEL SIGN W -16F5D ; [.4131.0020.0002] # MIAO VOWEL SIGN E -16F5E ; [.4132.0020.0002] # MIAO VOWEL SIGN EN -16F5F ; [.4133.0020.0002] # MIAO VOWEL SIGN ENG -16F60 ; [.4134.0020.0002] # MIAO VOWEL SIGN OEY -16F61 ; [.4135.0020.0002] # MIAO VOWEL SIGN I -16F62 ; [.4136.0020.0002] # MIAO VOWEL SIGN IA -16F63 ; [.4137.0020.0002] # MIAO VOWEL SIGN IAN -16F64 ; [.4138.0020.0002] # MIAO VOWEL SIGN IANG -16F65 ; [.4139.0020.0002] # MIAO VOWEL SIGN IO -16F66 ; [.413A.0020.0002] # MIAO VOWEL SIGN IE -16F67 ; [.413B.0020.0002] # MIAO VOWEL SIGN II -16F68 ; [.413C.0020.0002] # MIAO VOWEL SIGN IU -16F69 ; [.413D.0020.0002] # MIAO VOWEL SIGN ING -16F6A ; [.413E.0020.0002] # MIAO VOWEL SIGN U -16F6B ; [.413F.0020.0002] # MIAO VOWEL SIGN UA -16F6C ; [.4140.0020.0002] # MIAO VOWEL SIGN UAN -16F6D ; [.4141.0020.0002] # MIAO VOWEL SIGN UANG -16F6E ; [.4142.0020.0002] # MIAO VOWEL SIGN UU -16F6F ; [.4143.0020.0002] # MIAO VOWEL SIGN UEI -16F70 ; [.4144.0020.0002] # MIAO VOWEL SIGN UNG -16F71 ; [.4145.0020.0002] # MIAO VOWEL SIGN Y -16F72 ; [.4146.0020.0002] # MIAO VOWEL SIGN YI -16F73 ; [.4147.0020.0002] # MIAO VOWEL SIGN AE -16F74 ; [.4148.0020.0002] # MIAO VOWEL SIGN AEE -16F75 ; [.4149.0020.0002] # MIAO VOWEL SIGN ERR -16F76 ; [.414A.0020.0002] # MIAO VOWEL SIGN ROUNDED ERR -16F77 ; [.414B.0020.0002] # MIAO VOWEL SIGN ER -16F78 ; [.414C.0020.0002] # MIAO VOWEL SIGN ROUNDED ER -16F79 ; [.414D.0020.0002] # MIAO VOWEL SIGN AI -16F7A ; [.414E.0020.0002] # MIAO VOWEL SIGN EI -16F7B ; [.414F.0020.0002] # MIAO VOWEL SIGN AU -16F7C ; [.4150.0020.0002] # MIAO VOWEL SIGN OU -16F7D ; [.4151.0020.0002] # MIAO VOWEL SIGN N -16F7E ; [.4152.0020.0002] # MIAO VOWEL SIGN NG -16F8F ; [.4153.0020.0002] # MIAO TONE RIGHT -16F90 ; [.4154.0020.0002] # MIAO TONE TOP RIGHT -16F91 ; [.4155.0020.0002] # MIAO TONE ABOVE -16F92 ; [.4156.0020.0002] # MIAO TONE BELOW -16F93 ; [.4157.0020.0002] # MIAO LETTER TONE-2 -16F94 ; [.4158.0020.0002] # MIAO LETTER TONE-3 -16F95 ; [.4159.0020.0002] # MIAO LETTER TONE-4 -16F96 ; [.415A.0020.0002] # MIAO LETTER TONE-5 -16F97 ; [.415B.0020.0002] # MIAO LETTER TONE-6 -16F98 ; [.415C.0020.0002] # MIAO LETTER TONE-7 -16F99 ; [.415D.0020.0002] # MIAO LETTER TONE-8 -16F9A ; [.415E.0020.0002] # MIAO LETTER REFORMED TONE-1 -16F9B ; [.415F.0020.0002] # MIAO LETTER REFORMED TONE-2 -16F9C ; [.4160.0020.0002] # MIAO LETTER REFORMED TONE-4 -16F9D ; [.4161.0020.0002] # MIAO LETTER REFORMED TONE-5 -16F9E ; [.4162.0020.0002] # MIAO LETTER REFORMED TONE-6 -16F9F ; [.4163.0020.0002] # MIAO LETTER REFORMED TONE-8 -118FF ; [.4164.0020.0002] # WARANG CITI OM -118C0 ; [.4165.0020.0002] # WARANG CITI SMALL LETTER NGAA -118A0 ; [.4165.0020.0008] # WARANG CITI CAPITAL LETTER NGAA -118C1 ; [.4166.0020.0002] # WARANG CITI SMALL LETTER A -118A1 ; [.4166.0020.0008] # WARANG CITI CAPITAL LETTER A -118C2 ; [.4167.0020.0002] # WARANG CITI SMALL LETTER WI -118A2 ; [.4167.0020.0008] # WARANG CITI CAPITAL LETTER WI -118C3 ; [.4168.0020.0002] # WARANG CITI SMALL LETTER YU -118A3 ; [.4168.0020.0008] # WARANG CITI CAPITAL LETTER YU -118C4 ; [.4169.0020.0002] # WARANG CITI SMALL LETTER YA -118A4 ; [.4169.0020.0008] # WARANG CITI CAPITAL LETTER YA -118C5 ; [.416A.0020.0002] # WARANG CITI SMALL LETTER YO -118A5 ; [.416A.0020.0008] # WARANG CITI CAPITAL LETTER YO -118C6 ; [.416B.0020.0002] # WARANG CITI SMALL LETTER II -118A6 ; [.416B.0020.0008] # WARANG CITI CAPITAL LETTER II -118C7 ; [.416C.0020.0002] # WARANG CITI SMALL LETTER UU -118A7 ; [.416C.0020.0008] # WARANG CITI CAPITAL LETTER UU -118C8 ; [.416D.0020.0002] # WARANG CITI SMALL LETTER E -118A8 ; [.416D.0020.0008] # WARANG CITI CAPITAL LETTER E -118C9 ; [.416E.0020.0002] # WARANG CITI SMALL LETTER O -118A9 ; [.416E.0020.0008] # WARANG CITI CAPITAL LETTER O -118CA ; [.416F.0020.0002] # WARANG CITI SMALL LETTER ANG -118AA ; [.416F.0020.0008] # WARANG CITI CAPITAL LETTER ANG -118CB ; [.4170.0020.0002] # WARANG CITI SMALL LETTER GA -118AB ; [.4170.0020.0008] # WARANG CITI CAPITAL LETTER GA -118CC ; [.4171.0020.0002] # WARANG CITI SMALL LETTER KO -118AC ; [.4171.0020.0008] # WARANG CITI CAPITAL LETTER KO -118CD ; [.4172.0020.0002] # WARANG CITI SMALL LETTER ENY -118AD ; [.4172.0020.0008] # WARANG CITI CAPITAL LETTER ENY -118CE ; [.4173.0020.0002] # WARANG CITI SMALL LETTER YUJ -118AE ; [.4173.0020.0008] # WARANG CITI CAPITAL LETTER YUJ -118CF ; [.4174.0020.0002] # WARANG CITI SMALL LETTER UC -118AF ; [.4174.0020.0008] # WARANG CITI CAPITAL LETTER UC -118D0 ; [.4175.0020.0002] # WARANG CITI SMALL LETTER ENN -118B0 ; [.4175.0020.0008] # WARANG CITI CAPITAL LETTER ENN -118D1 ; [.4176.0020.0002] # WARANG CITI SMALL LETTER ODD -118B1 ; [.4176.0020.0008] # WARANG CITI CAPITAL LETTER ODD -118D2 ; [.4177.0020.0002] # WARANG CITI SMALL LETTER TTE -118B2 ; [.4177.0020.0008] # WARANG CITI CAPITAL LETTER TTE -118D3 ; [.4178.0020.0002] # WARANG CITI SMALL LETTER NUNG -118B3 ; [.4178.0020.0008] # WARANG CITI CAPITAL LETTER NUNG -118D4 ; [.4179.0020.0002] # WARANG CITI SMALL LETTER DA -118B4 ; [.4179.0020.0008] # WARANG CITI CAPITAL LETTER DA -118D5 ; [.417A.0020.0002] # WARANG CITI SMALL LETTER AT -118B5 ; [.417A.0020.0008] # WARANG CITI CAPITAL LETTER AT -118D6 ; [.417B.0020.0002] # WARANG CITI SMALL LETTER AM -118B6 ; [.417B.0020.0008] # WARANG CITI CAPITAL LETTER AM -118D7 ; [.417C.0020.0002] # WARANG CITI SMALL LETTER BU -118B7 ; [.417C.0020.0008] # WARANG CITI CAPITAL LETTER BU -118D8 ; [.417D.0020.0002] # WARANG CITI SMALL LETTER PU -118B8 ; [.417D.0020.0008] # WARANG CITI CAPITAL LETTER PU -118D9 ; [.417E.0020.0002] # WARANG CITI SMALL LETTER HIYO -118B9 ; [.417E.0020.0008] # WARANG CITI CAPITAL LETTER HIYO -118DA ; [.417F.0020.0002] # WARANG CITI SMALL LETTER HOLO -118BA ; [.417F.0020.0008] # WARANG CITI CAPITAL LETTER HOLO -118DB ; [.4180.0020.0002] # WARANG CITI SMALL LETTER HORR -118BB ; [.4180.0020.0008] # WARANG CITI CAPITAL LETTER HORR -118DC ; [.4181.0020.0002] # WARANG CITI SMALL LETTER HAR -118BC ; [.4181.0020.0008] # WARANG CITI CAPITAL LETTER HAR -118DD ; [.4182.0020.0002] # WARANG CITI SMALL LETTER SSUU -118BD ; [.4182.0020.0008] # WARANG CITI CAPITAL LETTER SSUU -118DE ; [.4183.0020.0002] # WARANG CITI SMALL LETTER SII -118BE ; [.4183.0020.0008] # WARANG CITI CAPITAL LETTER SII -118DF ; [.4184.0020.0002] # WARANG CITI SMALL LETTER VIYO -118BF ; [.4184.0020.0008] # WARANG CITI CAPITAL LETTER VIYO -11AD5 ; [.4185.0020.0002] # PAU CIN HAU LETTER A -11AD6 ; [.4186.0020.0002] # PAU CIN HAU LETTER E -11AD7 ; [.4187.0020.0002] # PAU CIN HAU LETTER I -11AD8 ; [.4188.0020.0002] # PAU CIN HAU LETTER O -11AD9 ; [.4189.0020.0002] # PAU CIN HAU LETTER U -11ADA ; [.418A.0020.0002] # PAU CIN HAU LETTER UA -11ADB ; [.418B.0020.0002] # PAU CIN HAU LETTER IA -11AC0 ; [.418C.0020.0002] # PAU CIN HAU LETTER PA -11AC1 ; [.418D.0020.0002] # PAU CIN HAU LETTER KA -11AC2 ; [.418E.0020.0002] # PAU CIN HAU LETTER LA -11AC3 ; [.418F.0020.0002] # PAU CIN HAU LETTER MA -11AC4 ; [.4190.0020.0002] # PAU CIN HAU LETTER DA -11AC5 ; [.4191.0020.0002] # PAU CIN HAU LETTER ZA -11AC6 ; [.4192.0020.0002] # PAU CIN HAU LETTER VA -11AC7 ; [.4193.0020.0002] # PAU CIN HAU LETTER NGA -11AC8 ; [.4194.0020.0002] # PAU CIN HAU LETTER HA -11AC9 ; [.4195.0020.0002] # PAU CIN HAU LETTER GA -11ACA ; [.4196.0020.0002] # PAU CIN HAU LETTER KHA -11ACB ; [.4197.0020.0002] # PAU CIN HAU LETTER SA -11ACC ; [.4198.0020.0002] # PAU CIN HAU LETTER BA -11ACD ; [.4199.0020.0002] # PAU CIN HAU LETTER CA -11ACE ; [.419A.0020.0002] # PAU CIN HAU LETTER TA -11ACF ; [.419B.0020.0002] # PAU CIN HAU LETTER THA -11AD0 ; [.419C.0020.0002] # PAU CIN HAU LETTER NA -11AD1 ; [.419D.0020.0002] # PAU CIN HAU LETTER PHA -11AD2 ; [.419E.0020.0002] # PAU CIN HAU LETTER RA -11AD3 ; [.419F.0020.0002] # PAU CIN HAU LETTER FA -11AD4 ; [.41A0.0020.0002] # PAU CIN HAU LETTER CHA -11ADC ; [.41A1.0020.0002] # PAU CIN HAU LETTER FINAL P -11ADD ; [.41A2.0020.0002] # PAU CIN HAU LETTER FINAL K -11ADF ; [.41A3.0020.0002] # PAU CIN HAU LETTER FINAL M -11AE0 ; [.41A4.0020.0002] # PAU CIN HAU LETTER FINAL N -11AE1 ; [.41A5.0020.0002] # PAU CIN HAU LETTER FINAL L -11AE2 ; [.41A6.0020.0002] # PAU CIN HAU LETTER FINAL W -11AE3 ; [.41A7.0020.0002] # PAU CIN HAU LETTER FINAL NG -11ADE ; [.41A8.0020.0002] # PAU CIN HAU LETTER FINAL T -11AE4 ; [.41A9.0020.0002] # PAU CIN HAU LETTER FINAL Y -11AEF ; [.41AA.0020.0002] # PAU CIN HAU MID-LEVEL TONE -11AF2 ; [.41AB.0020.0002] # PAU CIN HAU MID-LEVEL TONE FINAL -11AF1 ; [.41AC.0020.0002] # PAU CIN HAU MID-LEVEL TONE LONG FINAL -11AE6 ; [.41AD.0020.0002] # PAU CIN HAU RISING TONE -11AE9 ; [.41AE.0020.0002] # PAU CIN HAU RISING TONE FINAL -11AE5 ; [.41AF.0020.0002] # PAU CIN HAU RISING TONE LONG -11AE8 ; [.41B0.0020.0002] # PAU CIN HAU RISING TONE LONG FINAL -11AF4 ; [.41B1.0020.0002] # PAU CIN HAU LOW-FALLING TONE -11AF7 ; [.41B2.0020.0002] # PAU CIN HAU LOW-FALLING TONE FINAL -11AF3 ; [.41B3.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG -11AF6 ; [.41B4.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG FINAL -11AEC ; [.41B5.0020.0002] # PAU CIN HAU SANDHI TONE -11AEE ; [.41B6.0020.0002] # PAU CIN HAU SANDHI TONE FINAL -11AEB ; [.41B7.0020.0002] # PAU CIN HAU SANDHI TONE LONG -11AED ; [.41B8.0020.0002] # PAU CIN HAU SANDHI TONE LONG FINAL -11AF5 ; [.41B9.0020.0002] # PAU CIN HAU GLOTTAL STOP -11AF8 ; [.41BA.0020.0002] # PAU CIN HAU GLOTTAL STOP FINAL -11AE7 ; [.41BB.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP -11AEA ; [.41BC.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP FINAL -11AF0 ; [.41BD.0020.0002] # PAU CIN HAU GLOTTAL STOP VARIANT -16B00 ; [.41BE.0020.0002] # PAHAWH HMONG VOWEL KEEB -16B01 ; [.41BF.0020.0002] # PAHAWH HMONG VOWEL KEEV -16B02 ; [.41C0.0020.0002] # PAHAWH HMONG VOWEL KIB -16B03 ; [.41C1.0020.0002] # PAHAWH HMONG VOWEL KIV -16B04 ; [.41C2.0020.0002] # PAHAWH HMONG VOWEL KAUB -16B05 ; [.41C3.0020.0002] # PAHAWH HMONG VOWEL KAUV -16B06 ; [.41C4.0020.0002] # PAHAWH HMONG VOWEL KUB -16B07 ; [.41C5.0020.0002] # PAHAWH HMONG VOWEL KUV -16B08 ; [.41C6.0020.0002] # PAHAWH HMONG VOWEL KEB -16B09 ; [.41C7.0020.0002] # PAHAWH HMONG VOWEL KEV -16B0A ; [.41C8.0020.0002] # PAHAWH HMONG VOWEL KAIB -16B0B ; [.41C9.0020.0002] # PAHAWH HMONG VOWEL KAIV -16B0C ; [.41CA.0020.0002] # PAHAWH HMONG VOWEL KOOB -16B0D ; [.41CB.0020.0002] # PAHAWH HMONG VOWEL KOOV -16B0E ; [.41CC.0020.0002] # PAHAWH HMONG VOWEL KAWB -16B0F ; [.41CD.0020.0002] # PAHAWH HMONG VOWEL KAWV -16B10 ; [.41CE.0020.0002] # PAHAWH HMONG VOWEL KUAB -16B11 ; [.41CF.0020.0002] # PAHAWH HMONG VOWEL KUAV -16B12 ; [.41D0.0020.0002] # PAHAWH HMONG VOWEL KOB -16B13 ; [.41D1.0020.0002] # PAHAWH HMONG VOWEL KOV -16B14 ; [.41D2.0020.0002] # PAHAWH HMONG VOWEL KIAB -16B15 ; [.41D3.0020.0002] # PAHAWH HMONG VOWEL KIAV -16B16 ; [.41D4.0020.0002] # PAHAWH HMONG VOWEL KAB -16B17 ; [.41D5.0020.0002] # PAHAWH HMONG VOWEL KAV -16B18 ; [.41D6.0020.0002] # PAHAWH HMONG VOWEL KWB -16B19 ; [.41D7.0020.0002] # PAHAWH HMONG VOWEL KWV -16B1A ; [.41D8.0020.0002] # PAHAWH HMONG VOWEL KAAB -16B1B ; [.41D9.0020.0002] # PAHAWH HMONG VOWEL KAAV -16B1C ; [.41DA.0020.0002] # PAHAWH HMONG CONSONANT VAU -16B1D ; [.41DB.0020.0002] # PAHAWH HMONG CONSONANT NTSAU -16B1E ; [.41DC.0020.0002] # PAHAWH HMONG CONSONANT LAU -16B1F ; [.41DD.0020.0002] # PAHAWH HMONG CONSONANT HAU -16B20 ; [.41DE.0020.0002] # PAHAWH HMONG CONSONANT NLAU -16B21 ; [.41DF.0020.0002] # PAHAWH HMONG CONSONANT RAU -16B22 ; [.41E0.0020.0002] # PAHAWH HMONG CONSONANT NKAU -16B23 ; [.41E1.0020.0002] # PAHAWH HMONG CONSONANT QHAU -16B24 ; [.41E2.0020.0002] # PAHAWH HMONG CONSONANT YAU -16B25 ; [.41E3.0020.0002] # PAHAWH HMONG CONSONANT HLAU -16B26 ; [.41E4.0020.0002] # PAHAWH HMONG CONSONANT MAU -16B27 ; [.41E5.0020.0002] # PAHAWH HMONG CONSONANT CHAU -16B28 ; [.41E6.0020.0002] # PAHAWH HMONG CONSONANT NCHAU -16B29 ; [.41E7.0020.0002] # PAHAWH HMONG CONSONANT HNAU -16B2A ; [.41E8.0020.0002] # PAHAWH HMONG CONSONANT PLHAU -16B2B ; [.41E9.0020.0002] # PAHAWH HMONG CONSONANT NTHAU -16B2C ; [.41EA.0020.0002] # PAHAWH HMONG CONSONANT NAU -16B2D ; [.41EB.0020.0002] # PAHAWH HMONG CONSONANT AU -16B2E ; [.41EC.0020.0002] # PAHAWH HMONG CONSONANT XAU -16B2F ; [.41ED.0020.0002] # PAHAWH HMONG CONSONANT CAU -16B40 ; [.41EE.0020.0002] # PAHAWH HMONG SIGN VOS SEEV -16B41 ; [.41EF.0020.0002] # PAHAWH HMONG SIGN MEEJ SUAB -16B63 ; [.41F0.0020.0002] # PAHAWH HMONG SIGN VOS LUB -16B64 ; [.41F1.0020.0002] # PAHAWH HMONG SIGN XYOO -16B65 ; [.41F2.0020.0002] # PAHAWH HMONG SIGN HLI -16B66 ; [.41F3.0020.0002] # PAHAWH HMONG SIGN THIRD-STAGE HLI -16B67 ; [.41F4.0020.0002] # PAHAWH HMONG SIGN ZWJ THAJ -16B68 ; [.41F5.0020.0002] # PAHAWH HMONG SIGN HNUB -16B69 ; [.41F6.0020.0002] # PAHAWH HMONG SIGN NQIG -16B6A ; [.41F7.0020.0002] # PAHAWH HMONG SIGN XIAB -16B6B ; [.41F8.0020.0002] # PAHAWH HMONG SIGN NTUJ -16B6C ; [.41F9.0020.0002] # PAHAWH HMONG SIGN AV -16B6D ; [.41FA.0020.0002] # PAHAWH HMONG SIGN TXHEEJ CEEV -16B6E ; [.41FB.0020.0002] # PAHAWH HMONG SIGN MEEJ TSEEB -16B6F ; [.41FC.0020.0002] # PAHAWH HMONG SIGN TAU -16B70 ; [.41FD.0020.0002] # PAHAWH HMONG SIGN LOS -16B71 ; [.41FE.0020.0002] # PAHAWH HMONG SIGN MUS -16B72 ; [.41FF.0020.0002] # PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG -16B73 ; [.4200.0020.0002] # PAHAWH HMONG SIGN CIM CUAM TSHOOJ -16B74 ; [.4201.0020.0002] # PAHAWH HMONG SIGN CIM TXWV -16B75 ; [.4202.0020.0002] # PAHAWH HMONG SIGN CIM TXWV CHWV -16B76 ; [.4203.0020.0002] # PAHAWH HMONG SIGN CIM PUB DAWB -16B77 ; [.4204.0020.0002] # PAHAWH HMONG SIGN CIM NRES TOS -16B7D ; [.4205.0020.0002] # PAHAWH HMONG CLAN SIGN TSHEEJ -16B7E ; [.4206.0020.0002] # PAHAWH HMONG CLAN SIGN YEEG -16B7F ; [.4207.0020.0002] # PAHAWH HMONG CLAN SIGN LIS -16B80 ; [.4208.0020.0002] # PAHAWH HMONG CLAN SIGN LAUJ -16B81 ; [.4209.0020.0002] # PAHAWH HMONG CLAN SIGN XYOOJ -16B82 ; [.420A.0020.0002] # PAHAWH HMONG CLAN SIGN KOO -16B83 ; [.420B.0020.0002] # PAHAWH HMONG CLAN SIGN HAWJ -16B84 ; [.420C.0020.0002] # PAHAWH HMONG CLAN SIGN MUAS -16B85 ; [.420D.0020.0002] # PAHAWH HMONG CLAN SIGN THOJ -16B86 ; [.420E.0020.0002] # PAHAWH HMONG CLAN SIGN TSAB -16B87 ; [.420F.0020.0002] # PAHAWH HMONG CLAN SIGN PHAB -16B88 ; [.4210.0020.0002] # PAHAWH HMONG CLAN SIGN KHAB -16B89 ; [.4211.0020.0002] # PAHAWH HMONG CLAN SIGN HAM -16B8A ; [.4212.0020.0002] # PAHAWH HMONG CLAN SIGN VAJ -16B8B ; [.4213.0020.0002] # PAHAWH HMONG CLAN SIGN FAJ -16B8C ; [.4214.0020.0002] # PAHAWH HMONG CLAN SIGN YAJ -16B8D ; [.4215.0020.0002] # PAHAWH HMONG CLAN SIGN TSWB -16B8E ; [.4216.0020.0002] # PAHAWH HMONG CLAN SIGN KWM -16B8F ; [.4217.0020.0002] # PAHAWH HMONG CLAN SIGN VWJ -10280 ; [.4218.0020.0002] # LYCIAN LETTER A -10281 ; [.4219.0020.0002] # LYCIAN LETTER E -10282 ; [.421A.0020.0002] # LYCIAN LETTER B -10283 ; [.421B.0020.0002] # LYCIAN LETTER BH -10284 ; [.421C.0020.0002] # LYCIAN LETTER G -10285 ; [.421D.0020.0002] # LYCIAN LETTER D -10286 ; [.421E.0020.0002] # LYCIAN LETTER I -10287 ; [.421F.0020.0002] # LYCIAN LETTER W -10288 ; [.4220.0020.0002] # LYCIAN LETTER Z -10289 ; [.4221.0020.0002] # LYCIAN LETTER TH -1028A ; [.4222.0020.0002] # LYCIAN LETTER J -1028B ; [.4223.0020.0002] # LYCIAN LETTER K -1028C ; [.4224.0020.0002] # LYCIAN LETTER Q -1028D ; [.4225.0020.0002] # LYCIAN LETTER L -1028E ; [.4226.0020.0002] # LYCIAN LETTER M -1028F ; [.4227.0020.0002] # LYCIAN LETTER N -10290 ; [.4228.0020.0002] # LYCIAN LETTER MM -10291 ; [.4229.0020.0002] # LYCIAN LETTER NN -10292 ; [.422A.0020.0002] # LYCIAN LETTER U -10293 ; [.422B.0020.0002] # LYCIAN LETTER P -10294 ; [.422C.0020.0002] # LYCIAN LETTER KK -10295 ; [.422D.0020.0002] # LYCIAN LETTER R -10296 ; [.422E.0020.0002] # LYCIAN LETTER S -10297 ; [.422F.0020.0002] # LYCIAN LETTER T -10298 ; [.4230.0020.0002] # LYCIAN LETTER TT -10299 ; [.4231.0020.0002] # LYCIAN LETTER AN -1029A ; [.4232.0020.0002] # LYCIAN LETTER EN -1029B ; [.4233.0020.0002] # LYCIAN LETTER H -1029C ; [.4234.0020.0002] # LYCIAN LETTER X -102A0 ; [.4235.0020.0002] # CARIAN LETTER A -102A1 ; [.4236.0020.0002] # CARIAN LETTER P2 -102A2 ; [.4237.0020.0002] # CARIAN LETTER D -102A3 ; [.4238.0020.0002] # CARIAN LETTER L -102A4 ; [.4239.0020.0002] # CARIAN LETTER UUU -102A5 ; [.423A.0020.0002] # CARIAN LETTER R -102A6 ; [.423B.0020.0002] # CARIAN LETTER LD -102A7 ; [.423C.0020.0002] # CARIAN LETTER A2 -102A8 ; [.423D.0020.0002] # CARIAN LETTER Q -102A9 ; [.423E.0020.0002] # CARIAN LETTER B -102AA ; [.423F.0020.0002] # CARIAN LETTER M -102AB ; [.4240.0020.0002] # CARIAN LETTER O -102AC ; [.4241.0020.0002] # CARIAN LETTER D2 -102AD ; [.4242.0020.0002] # CARIAN LETTER T -102AE ; [.4243.0020.0002] # CARIAN LETTER SH -102AF ; [.4244.0020.0002] # CARIAN LETTER SH2 -102B0 ; [.4245.0020.0002] # CARIAN LETTER S -102B1 ; [.4246.0020.0002] # CARIAN LETTER C-18 -102B2 ; [.4247.0020.0002] # CARIAN LETTER U -102B3 ; [.4248.0020.0002] # CARIAN LETTER NN -102B4 ; [.4249.0020.0002] # CARIAN LETTER X -102B5 ; [.424A.0020.0002] # CARIAN LETTER N -102B6 ; [.424B.0020.0002] # CARIAN LETTER TT2 -102B7 ; [.424C.0020.0002] # CARIAN LETTER P -102B8 ; [.424D.0020.0002] # CARIAN LETTER SS -102B9 ; [.424E.0020.0002] # CARIAN LETTER I -102BA ; [.424F.0020.0002] # CARIAN LETTER E -102BB ; [.4250.0020.0002] # CARIAN LETTER UUUU -102BC ; [.4251.0020.0002] # CARIAN LETTER K -102BD ; [.4252.0020.0002] # CARIAN LETTER K2 -102BE ; [.4253.0020.0002] # CARIAN LETTER ND -102BF ; [.4254.0020.0002] # CARIAN LETTER UU -102C0 ; [.4255.0020.0002] # CARIAN LETTER G -102C1 ; [.4256.0020.0002] # CARIAN LETTER G2 -102C2 ; [.4257.0020.0002] # CARIAN LETTER ST -102C3 ; [.4258.0020.0002] # CARIAN LETTER ST2 -102C4 ; [.4259.0020.0002] # CARIAN LETTER NG -102C5 ; [.425A.0020.0002] # CARIAN LETTER II -102C6 ; [.425B.0020.0002] # CARIAN LETTER C-39 -102C7 ; [.425C.0020.0002] # CARIAN LETTER TT -102C8 ; [.425D.0020.0002] # CARIAN LETTER UUU2 -102C9 ; [.425E.0020.0002] # CARIAN LETTER RR -102CA ; [.425F.0020.0002] # CARIAN LETTER MB -102CB ; [.4260.0020.0002] # CARIAN LETTER MB2 -102CC ; [.4261.0020.0002] # CARIAN LETTER MB3 -102CD ; [.4262.0020.0002] # CARIAN LETTER MB4 -102CE ; [.4263.0020.0002] # CARIAN LETTER LD2 -102CF ; [.4264.0020.0002] # CARIAN LETTER E2 -102D0 ; [.4265.0020.0002] # CARIAN LETTER UUU3 -10920 ; [.4266.0020.0002] # LYDIAN LETTER A -10921 ; [.4267.0020.0002] # LYDIAN LETTER B -10922 ; [.4268.0020.0002] # LYDIAN LETTER G -10923 ; [.4269.0020.0002] # LYDIAN LETTER D -10924 ; [.426A.0020.0002] # LYDIAN LETTER E -10925 ; [.426B.0020.0002] # LYDIAN LETTER V -10926 ; [.426C.0020.0002] # LYDIAN LETTER I -10927 ; [.426D.0020.0002] # LYDIAN LETTER Y -10928 ; [.426E.0020.0002] # LYDIAN LETTER K -10929 ; [.426F.0020.0002] # LYDIAN LETTER L -1092A ; [.4270.0020.0002] # LYDIAN LETTER M -1092B ; [.4271.0020.0002] # LYDIAN LETTER N -1092C ; [.4272.0020.0002] # LYDIAN LETTER O -1092D ; [.4273.0020.0002] # LYDIAN LETTER R -1092E ; [.4274.0020.0002] # LYDIAN LETTER SS -1092F ; [.4275.0020.0002] # LYDIAN LETTER T -10930 ; [.4276.0020.0002] # LYDIAN LETTER U -10931 ; [.4277.0020.0002] # LYDIAN LETTER F -10932 ; [.4278.0020.0002] # LYDIAN LETTER Q -10933 ; [.4279.0020.0002] # LYDIAN LETTER S -10934 ; [.427A.0020.0002] # LYDIAN LETTER TT -10935 ; [.427B.0020.0002] # LYDIAN LETTER AN -10936 ; [.427C.0020.0002] # LYDIAN LETTER EN -10937 ; [.427D.0020.0002] # LYDIAN LETTER LY -10938 ; [.427E.0020.0002] # LYDIAN LETTER NN -10939 ; [.427F.0020.0002] # LYDIAN LETTER C -10300 ; [.4280.0020.0002] # OLD ITALIC LETTER A -10301 ; [.4281.0020.0002] # OLD ITALIC LETTER BE -10302 ; [.4282.0020.0002] # OLD ITALIC LETTER KE -10303 ; [.4283.0020.0002] # OLD ITALIC LETTER DE -10304 ; [.4284.0020.0002] # OLD ITALIC LETTER E -10305 ; [.4285.0020.0002] # OLD ITALIC LETTER VE -10306 ; [.4286.0020.0002] # OLD ITALIC LETTER ZE -10307 ; [.4287.0020.0002] # OLD ITALIC LETTER HE -10308 ; [.4288.0020.0002] # OLD ITALIC LETTER THE -10309 ; [.4289.0020.0002] # OLD ITALIC LETTER I -1030A ; [.428A.0020.0002] # OLD ITALIC LETTER KA -1030B ; [.428B.0020.0002] # OLD ITALIC LETTER EL -1030C ; [.428C.0020.0002] # OLD ITALIC LETTER EM -1030D ; [.428D.0020.0002] # OLD ITALIC LETTER EN -1030E ; [.428E.0020.0002] # OLD ITALIC LETTER ESH -1031F ; [.428F.0020.0002] # OLD ITALIC LETTER ESS -1030F ; [.4290.0020.0002] # OLD ITALIC LETTER O -10310 ; [.4291.0020.0002] # OLD ITALIC LETTER PE -10311 ; [.4292.0020.0002] # OLD ITALIC LETTER SHE -10312 ; [.4293.0020.0002] # OLD ITALIC LETTER KU -10313 ; [.4294.0020.0002] # OLD ITALIC LETTER ER -10314 ; [.4295.0020.0002] # OLD ITALIC LETTER ES -10315 ; [.4296.0020.0002] # OLD ITALIC LETTER TE -10316 ; [.4297.0020.0002] # OLD ITALIC LETTER U -10317 ; [.4298.0020.0002] # OLD ITALIC LETTER EKS -10318 ; [.4299.0020.0002] # OLD ITALIC LETTER PHE -10319 ; [.429A.0020.0002] # OLD ITALIC LETTER KHE -1031A ; [.429B.0020.0002] # OLD ITALIC LETTER EF -1031B ; [.429C.0020.0002] # OLD ITALIC LETTER ERS -1031C ; [.429D.0020.0002] # OLD ITALIC LETTER CHE -1031D ; [.429E.0020.0002] # OLD ITALIC LETTER II -1031E ; [.429F.0020.0002] # OLD ITALIC LETTER UU -10330 ; [.42A0.0020.0002] # GOTHIC LETTER AHSA -10331 ; [.42A1.0020.0002] # GOTHIC LETTER BAIRKAN -10332 ; [.42A2.0020.0002] # GOTHIC LETTER GIBA -10333 ; [.42A3.0020.0002] # GOTHIC LETTER DAGS -10334 ; [.42A4.0020.0002] # GOTHIC LETTER AIHVUS -10335 ; [.42A5.0020.0002] # GOTHIC LETTER QAIRTHRA -10336 ; [.42A6.0020.0002] # GOTHIC LETTER IUJA -10337 ; [.42A7.0020.0002] # GOTHIC LETTER HAGL -10338 ; [.42A8.0020.0002] # GOTHIC LETTER THIUTH -10339 ; [.42A9.0020.0002] # GOTHIC LETTER EIS -1033A ; [.42AA.0020.0002] # GOTHIC LETTER KUSMA -1033B ; [.42AB.0020.0002] # GOTHIC LETTER LAGUS -1033C ; [.42AC.0020.0002] # GOTHIC LETTER MANNA -1033D ; [.42AD.0020.0002] # GOTHIC LETTER NAUTHS -1033E ; [.42AE.0020.0002] # GOTHIC LETTER JER -1033F ; [.42AF.0020.0002] # GOTHIC LETTER URUS -10340 ; [.42B0.0020.0002] # GOTHIC LETTER PAIRTHRA -10341 ; [.42B1.0020.0002] # GOTHIC LETTER NINETY -10342 ; [.42B2.0020.0002] # GOTHIC LETTER RAIDA -10343 ; [.42B3.0020.0002] # GOTHIC LETTER SAUIL -10344 ; [.42B4.0020.0002] # GOTHIC LETTER TEIWS -10345 ; [.42B5.0020.0002] # GOTHIC LETTER WINJA -10346 ; [.42B6.0020.0002] # GOTHIC LETTER FAIHU -10347 ; [.42B7.0020.0002] # GOTHIC LETTER IGGWS -10348 ; [.42B8.0020.0002] # GOTHIC LETTER HWAIR -10349 ; [.42B9.0020.0002] # GOTHIC LETTER OTHAL -1034A ; [.42BA.0020.0002] # GOTHIC LETTER NINE HUNDRED -10428 ; [.42BB.0020.0002] # DESERET SMALL LETTER LONG I -10400 ; [.42BB.0020.0008] # DESERET CAPITAL LETTER LONG I -10429 ; [.42BC.0020.0002] # DESERET SMALL LETTER LONG E -10401 ; [.42BC.0020.0008] # DESERET CAPITAL LETTER LONG E -1042A ; [.42BD.0020.0002] # DESERET SMALL LETTER LONG A -10402 ; [.42BD.0020.0008] # DESERET CAPITAL LETTER LONG A -1042B ; [.42BE.0020.0002] # DESERET SMALL LETTER LONG AH -10403 ; [.42BE.0020.0008] # DESERET CAPITAL LETTER LONG AH -1042C ; [.42BF.0020.0002] # DESERET SMALL LETTER LONG O -10404 ; [.42BF.0020.0008] # DESERET CAPITAL LETTER LONG O -1042D ; [.42C0.0020.0002] # DESERET SMALL LETTER LONG OO -10405 ; [.42C0.0020.0008] # DESERET CAPITAL LETTER LONG OO -1042E ; [.42C1.0020.0002] # DESERET SMALL LETTER SHORT I -10406 ; [.42C1.0020.0008] # DESERET CAPITAL LETTER SHORT I -1042F ; [.42C2.0020.0002] # DESERET SMALL LETTER SHORT E -10407 ; [.42C2.0020.0008] # DESERET CAPITAL LETTER SHORT E -10430 ; [.42C3.0020.0002] # DESERET SMALL LETTER SHORT A -10408 ; [.42C3.0020.0008] # DESERET CAPITAL LETTER SHORT A -10431 ; [.42C4.0020.0002] # DESERET SMALL LETTER SHORT AH -10409 ; [.42C4.0020.0008] # DESERET CAPITAL LETTER SHORT AH -10432 ; [.42C5.0020.0002] # DESERET SMALL LETTER SHORT O -1040A ; [.42C5.0020.0008] # DESERET CAPITAL LETTER SHORT O -10433 ; [.42C6.0020.0002] # DESERET SMALL LETTER SHORT OO -1040B ; [.42C6.0020.0008] # DESERET CAPITAL LETTER SHORT OO -10434 ; [.42C7.0020.0002] # DESERET SMALL LETTER AY -1040C ; [.42C7.0020.0008] # DESERET CAPITAL LETTER AY -10435 ; [.42C8.0020.0002] # DESERET SMALL LETTER OW -1040D ; [.42C8.0020.0008] # DESERET CAPITAL LETTER OW -10436 ; [.42C9.0020.0002] # DESERET SMALL LETTER WU -1040E ; [.42C9.0020.0008] # DESERET CAPITAL LETTER WU -10437 ; [.42CA.0020.0002] # DESERET SMALL LETTER YEE -1040F ; [.42CA.0020.0008] # DESERET CAPITAL LETTER YEE -10438 ; [.42CB.0020.0002] # DESERET SMALL LETTER H -10410 ; [.42CB.0020.0008] # DESERET CAPITAL LETTER H -10439 ; [.42CC.0020.0002] # DESERET SMALL LETTER PEE -10411 ; [.42CC.0020.0008] # DESERET CAPITAL LETTER PEE -1043A ; [.42CD.0020.0002] # DESERET SMALL LETTER BEE -10412 ; [.42CD.0020.0008] # DESERET CAPITAL LETTER BEE -1043B ; [.42CE.0020.0002] # DESERET SMALL LETTER TEE -10413 ; [.42CE.0020.0008] # DESERET CAPITAL LETTER TEE -1043C ; [.42CF.0020.0002] # DESERET SMALL LETTER DEE -10414 ; [.42CF.0020.0008] # DESERET CAPITAL LETTER DEE -1043D ; [.42D0.0020.0002] # DESERET SMALL LETTER CHEE -10415 ; [.42D0.0020.0008] # DESERET CAPITAL LETTER CHEE -1043E ; [.42D1.0020.0002] # DESERET SMALL LETTER JEE -10416 ; [.42D1.0020.0008] # DESERET CAPITAL LETTER JEE -1043F ; [.42D2.0020.0002] # DESERET SMALL LETTER KAY -10417 ; [.42D2.0020.0008] # DESERET CAPITAL LETTER KAY -10440 ; [.42D3.0020.0002] # DESERET SMALL LETTER GAY -10418 ; [.42D3.0020.0008] # DESERET CAPITAL LETTER GAY -10441 ; [.42D4.0020.0002] # DESERET SMALL LETTER EF -10419 ; [.42D4.0020.0008] # DESERET CAPITAL LETTER EF -10442 ; [.42D5.0020.0002] # DESERET SMALL LETTER VEE -1041A ; [.42D5.0020.0008] # DESERET CAPITAL LETTER VEE -10443 ; [.42D6.0020.0002] # DESERET SMALL LETTER ETH -1041B ; [.42D6.0020.0008] # DESERET CAPITAL LETTER ETH -10444 ; [.42D7.0020.0002] # DESERET SMALL LETTER THEE -1041C ; [.42D7.0020.0008] # DESERET CAPITAL LETTER THEE -10445 ; [.42D8.0020.0002] # DESERET SMALL LETTER ES -1041D ; [.42D8.0020.0008] # DESERET CAPITAL LETTER ES -10446 ; [.42D9.0020.0002] # DESERET SMALL LETTER ZEE -1041E ; [.42D9.0020.0008] # DESERET CAPITAL LETTER ZEE -10447 ; [.42DA.0020.0002] # DESERET SMALL LETTER ESH -1041F ; [.42DA.0020.0008] # DESERET CAPITAL LETTER ESH -10448 ; [.42DB.0020.0002] # DESERET SMALL LETTER ZHEE -10420 ; [.42DB.0020.0008] # DESERET CAPITAL LETTER ZHEE -10449 ; [.42DC.0020.0002] # DESERET SMALL LETTER ER -10421 ; [.42DC.0020.0008] # DESERET CAPITAL LETTER ER -1044A ; [.42DD.0020.0002] # DESERET SMALL LETTER EL -10422 ; [.42DD.0020.0008] # DESERET CAPITAL LETTER EL -1044B ; [.42DE.0020.0002] # DESERET SMALL LETTER EM -10423 ; [.42DE.0020.0008] # DESERET CAPITAL LETTER EM -1044C ; [.42DF.0020.0002] # DESERET SMALL LETTER EN -10424 ; [.42DF.0020.0008] # DESERET CAPITAL LETTER EN -1044D ; [.42E0.0020.0002] # DESERET SMALL LETTER ENG -10425 ; [.42E0.0020.0008] # DESERET CAPITAL LETTER ENG -1044E ; [.42E1.0020.0002] # DESERET SMALL LETTER OI -10426 ; [.42E1.0020.0008] # DESERET CAPITAL LETTER OI -1044F ; [.42E2.0020.0002] # DESERET SMALL LETTER EW -10427 ; [.42E2.0020.0008] # DESERET CAPITAL LETTER EW -10450 ; [.42E3.0020.0002] # SHAVIAN LETTER PEEP -10451 ; [.42E4.0020.0002] # SHAVIAN LETTER TOT -10452 ; [.42E5.0020.0002] # SHAVIAN LETTER KICK -10453 ; [.42E6.0020.0002] # SHAVIAN LETTER FEE -10454 ; [.42E7.0020.0002] # SHAVIAN LETTER THIGH -10455 ; [.42E8.0020.0002] # SHAVIAN LETTER SO -10456 ; [.42E9.0020.0002] # SHAVIAN LETTER SURE -10457 ; [.42EA.0020.0002] # SHAVIAN LETTER CHURCH -10458 ; [.42EB.0020.0002] # SHAVIAN LETTER YEA -10459 ; [.42EC.0020.0002] # SHAVIAN LETTER HUNG -1045A ; [.42ED.0020.0002] # SHAVIAN LETTER BIB -1045B ; [.42EE.0020.0002] # SHAVIAN LETTER DEAD -1045C ; [.42EF.0020.0002] # SHAVIAN LETTER GAG -1045D ; [.42F0.0020.0002] # SHAVIAN LETTER VOW -1045E ; [.42F1.0020.0002] # SHAVIAN LETTER THEY -1045F ; [.42F2.0020.0002] # SHAVIAN LETTER ZOO -10460 ; [.42F3.0020.0002] # SHAVIAN LETTER MEASURE -10461 ; [.42F4.0020.0002] # SHAVIAN LETTER JUDGE -10462 ; [.42F5.0020.0002] # SHAVIAN LETTER WOE -10463 ; [.42F6.0020.0002] # SHAVIAN LETTER HA-HA -10464 ; [.42F7.0020.0002] # SHAVIAN LETTER LOLL -10465 ; [.42F8.0020.0002] # SHAVIAN LETTER MIME -10466 ; [.42F9.0020.0002] # SHAVIAN LETTER IF -10467 ; [.42FA.0020.0002] # SHAVIAN LETTER EGG -10468 ; [.42FB.0020.0002] # SHAVIAN LETTER ASH -10469 ; [.42FC.0020.0002] # SHAVIAN LETTER ADO -1046A ; [.42FD.0020.0002] # SHAVIAN LETTER ON -1046B ; [.42FE.0020.0002] # SHAVIAN LETTER WOOL -1046C ; [.42FF.0020.0002] # SHAVIAN LETTER OUT -1046D ; [.4300.0020.0002] # SHAVIAN LETTER AH -1046E ; [.4301.0020.0002] # SHAVIAN LETTER ROAR -1046F ; [.4302.0020.0002] # SHAVIAN LETTER NUN -10470 ; [.4303.0020.0002] # SHAVIAN LETTER EAT -10471 ; [.4304.0020.0002] # SHAVIAN LETTER AGE -10472 ; [.4305.0020.0002] # SHAVIAN LETTER ICE -10473 ; [.4306.0020.0002] # SHAVIAN LETTER UP -10474 ; [.4307.0020.0002] # SHAVIAN LETTER OAK -10475 ; [.4308.0020.0002] # SHAVIAN LETTER OOZE -10476 ; [.4309.0020.0002] # SHAVIAN LETTER OIL -10477 ; [.430A.0020.0002] # SHAVIAN LETTER AWE -10478 ; [.430B.0020.0002] # SHAVIAN LETTER ARE -10479 ; [.430C.0020.0002] # SHAVIAN LETTER OR -1047A ; [.430D.0020.0002] # SHAVIAN LETTER AIR -1047B ; [.430E.0020.0002] # SHAVIAN LETTER ERR -1047C ; [.430F.0020.0002] # SHAVIAN LETTER ARRAY -1047D ; [.4310.0020.0002] # SHAVIAN LETTER EAR -1047E ; [.4311.0020.0002] # SHAVIAN LETTER IAN -1047F ; [.4312.0020.0002] # SHAVIAN LETTER YEW -1BC00 ; [.4313.0020.0002] # DUPLOYAN LETTER H -1BC01 ; [.4314.0020.0002] # DUPLOYAN LETTER X -1BC02 ; [.4315.0020.0002] # DUPLOYAN LETTER P -1BC03 ; [.4316.0020.0002] # DUPLOYAN LETTER T -1BC04 ; [.4317.0020.0002] # DUPLOYAN LETTER F -1BC05 ; [.4318.0020.0002] # DUPLOYAN LETTER K -1BC06 ; [.4319.0020.0002] # DUPLOYAN LETTER L -1BC07 ; [.431A.0020.0002] # DUPLOYAN LETTER B -1BC08 ; [.431B.0020.0002] # DUPLOYAN LETTER D -1BC09 ; [.431C.0020.0002] # DUPLOYAN LETTER V -1BC0A ; [.431D.0020.0002] # DUPLOYAN LETTER G -1BC0B ; [.431E.0020.0002] # DUPLOYAN LETTER R -1BC0C ; [.431F.0020.0002] # DUPLOYAN LETTER P N -1BC0D ; [.4320.0020.0002] # DUPLOYAN LETTER D S -1BC0E ; [.4321.0020.0002] # DUPLOYAN LETTER F N -1BC0F ; [.4322.0020.0002] # DUPLOYAN LETTER K M -1BC10 ; [.4323.0020.0002] # DUPLOYAN LETTER R S -1BC11 ; [.4324.0020.0002] # DUPLOYAN LETTER TH -1BC12 ; [.4325.0020.0002] # DUPLOYAN LETTER SLOAN DH -1BC13 ; [.4326.0020.0002] # DUPLOYAN LETTER DH -1BC14 ; [.4327.0020.0002] # DUPLOYAN LETTER KK -1BC15 ; [.4328.0020.0002] # DUPLOYAN LETTER SLOAN J -1BC16 ; [.4329.0020.0002] # DUPLOYAN LETTER HL -1BC17 ; [.432A.0020.0002] # DUPLOYAN LETTER LH -1BC18 ; [.432B.0020.0002] # DUPLOYAN LETTER RH -1BC19 ; [.432C.0020.0002] # DUPLOYAN LETTER M -1BC1A ; [.432D.0020.0002] # DUPLOYAN LETTER N -1BC1B ; [.432E.0020.0002] # DUPLOYAN LETTER J -1BC1C ; [.432F.0020.0002] # DUPLOYAN LETTER S -1BC1D ; [.4330.0020.0002] # DUPLOYAN LETTER M N -1BC1E ; [.4331.0020.0002] # DUPLOYAN LETTER N M -1BC1F ; [.4332.0020.0002] # DUPLOYAN LETTER J M -1BC20 ; [.4333.0020.0002] # DUPLOYAN LETTER S J -1BC21 ; [.4334.0020.0002] # DUPLOYAN LETTER M WITH DOT -1BC22 ; [.4335.0020.0002] # DUPLOYAN LETTER N WITH DOT -1BC23 ; [.4336.0020.0002] # DUPLOYAN LETTER J WITH DOT -1BC24 ; [.4337.0020.0002] # DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE -1BC25 ; [.4338.0020.0002] # DUPLOYAN LETTER S WITH DOT -1BC26 ; [.4339.0020.0002] # DUPLOYAN LETTER S WITH DOT BELOW -1BC27 ; [.433A.0020.0002] # DUPLOYAN LETTER M S -1BC28 ; [.433B.0020.0002] # DUPLOYAN LETTER N S -1BC29 ; [.433C.0020.0002] # DUPLOYAN LETTER J S -1BC2A ; [.433D.0020.0002] # DUPLOYAN LETTER S S -1BC2B ; [.433E.0020.0002] # DUPLOYAN LETTER M N S -1BC2C ; [.433F.0020.0002] # DUPLOYAN LETTER N M S -1BC2D ; [.4340.0020.0002] # DUPLOYAN LETTER J M S -1BC2E ; [.4341.0020.0002] # DUPLOYAN LETTER S J S -1BC2F ; [.4342.0020.0002] # DUPLOYAN LETTER J S WITH DOT -1BC30 ; [.4343.0020.0002] # DUPLOYAN LETTER J N -1BC31 ; [.4344.0020.0002] # DUPLOYAN LETTER J N S -1BC32 ; [.4345.0020.0002] # DUPLOYAN LETTER S T -1BC33 ; [.4346.0020.0002] # DUPLOYAN LETTER S T R -1BC34 ; [.4347.0020.0002] # DUPLOYAN LETTER S P -1BC35 ; [.4348.0020.0002] # DUPLOYAN LETTER S P R -1BC36 ; [.4349.0020.0002] # DUPLOYAN LETTER T S -1BC37 ; [.434A.0020.0002] # DUPLOYAN LETTER T R S -1BC38 ; [.434B.0020.0002] # DUPLOYAN LETTER W -1BC39 ; [.434C.0020.0002] # DUPLOYAN LETTER WH -1BC3A ; [.434D.0020.0002] # DUPLOYAN LETTER W R -1BC3B ; [.434E.0020.0002] # DUPLOYAN LETTER S N -1BC3C ; [.434F.0020.0002] # DUPLOYAN LETTER S M -1BC3D ; [.4350.0020.0002] # DUPLOYAN LETTER K R S -1BC3E ; [.4351.0020.0002] # DUPLOYAN LETTER G R S -1BC3F ; [.4352.0020.0002] # DUPLOYAN LETTER S K -1BC40 ; [.4353.0020.0002] # DUPLOYAN LETTER S K R -1BC41 ; [.4354.0020.0002] # DUPLOYAN LETTER A -1BC42 ; [.4355.0020.0002] # DUPLOYAN LETTER SLOAN OW -1BC43 ; [.4356.0020.0002] # DUPLOYAN LETTER OA -1BC44 ; [.4357.0020.0002] # DUPLOYAN LETTER O -1BC45 ; [.4358.0020.0002] # DUPLOYAN LETTER AOU -1BC46 ; [.4359.0020.0002] # DUPLOYAN LETTER I -1BC47 ; [.435A.0020.0002] # DUPLOYAN LETTER E -1BC48 ; [.435B.0020.0002] # DUPLOYAN LETTER IE -1BC49 ; [.435C.0020.0002] # DUPLOYAN LETTER SHORT I -1BC4A ; [.435D.0020.0002] # DUPLOYAN LETTER UI -1BC4B ; [.435E.0020.0002] # DUPLOYAN LETTER EE -1BC4C ; [.435F.0020.0002] # DUPLOYAN LETTER SLOAN EH -1BC4D ; [.4360.0020.0002] # DUPLOYAN LETTER ROMANIAN I -1BC4E ; [.4361.0020.0002] # DUPLOYAN LETTER SLOAN EE -1BC4F ; [.4362.0020.0002] # DUPLOYAN LETTER LONG I -1BC50 ; [.4363.0020.0002] # DUPLOYAN LETTER YE -1BC51 ; [.4364.0020.0002] # DUPLOYAN LETTER U -1BC52 ; [.4365.0020.0002] # DUPLOYAN LETTER EU -1BC53 ; [.4366.0020.0002] # DUPLOYAN LETTER XW -1BC54 ; [.4367.0020.0002] # DUPLOYAN LETTER U N -1BC55 ; [.4368.0020.0002] # DUPLOYAN LETTER LONG U -1BC56 ; [.4369.0020.0002] # DUPLOYAN LETTER ROMANIAN U -1BC57 ; [.436A.0020.0002] # DUPLOYAN LETTER UH -1BC58 ; [.436B.0020.0002] # DUPLOYAN LETTER SLOAN U -1BC59 ; [.436C.0020.0002] # DUPLOYAN LETTER OOH -1BC5A ; [.436D.0020.0002] # DUPLOYAN LETTER OW -1BC5B ; [.436E.0020.0002] # DUPLOYAN LETTER OU -1BC5C ; [.436F.0020.0002] # DUPLOYAN LETTER WA -1BC5D ; [.4370.0020.0002] # DUPLOYAN LETTER WO -1BC5E ; [.4371.0020.0002] # DUPLOYAN LETTER WI -1BC5F ; [.4372.0020.0002] # DUPLOYAN LETTER WEI -1BC60 ; [.4373.0020.0002] # DUPLOYAN LETTER WOW -1BC61 ; [.4374.0020.0002] # DUPLOYAN LETTER NASAL U -1BC62 ; [.4375.0020.0002] # DUPLOYAN LETTER NASAL O -1BC63 ; [.4376.0020.0002] # DUPLOYAN LETTER NASAL I -1BC64 ; [.4377.0020.0002] # DUPLOYAN LETTER NASAL A -1BC65 ; [.4378.0020.0002] # DUPLOYAN LETTER PERNIN AN -1BC66 ; [.4379.0020.0002] # DUPLOYAN LETTER PERNIN AM -1BC67 ; [.437A.0020.0002] # DUPLOYAN LETTER SLOAN EN -1BC68 ; [.437B.0020.0002] # DUPLOYAN LETTER SLOAN AN -1BC69 ; [.437C.0020.0002] # DUPLOYAN LETTER SLOAN ON -1BC6A ; [.437D.0020.0002] # DUPLOYAN LETTER VOCALIC M -1BC70 ; [.437E.0020.0002] # DUPLOYAN AFFIX LEFT HORIZONTAL SECANT -1BC71 ; [.437F.0020.0002] # DUPLOYAN AFFIX MID HORIZONTAL SECANT -1BC72 ; [.4380.0020.0002] # DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT -1BC73 ; [.4381.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL SECANT -1BC74 ; [.4382.0020.0002] # DUPLOYAN AFFIX MID VERTICAL SECANT -1BC75 ; [.4383.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL SECANT -1BC76 ; [.4384.0020.0002] # DUPLOYAN AFFIX ATTACHED SECANT -1BC77 ; [.4385.0020.0002] # DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT -1BC78 ; [.4386.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT -1BC79 ; [.4387.0020.0002] # DUPLOYAN AFFIX ATTACHED TAIL -1BC7A ; [.4388.0020.0002] # DUPLOYAN AFFIX ATTACHED E HOOK -1BC7B ; [.4389.0020.0002] # DUPLOYAN AFFIX ATTACHED I HOOK -1BC7C ; [.438A.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT HOOK -1BC80 ; [.438B.0020.0002] # DUPLOYAN AFFIX HIGH ACUTE -1BC81 ; [.438C.0020.0002] # DUPLOYAN AFFIX HIGH TIGHT ACUTE -1BC82 ; [.438D.0020.0002] # DUPLOYAN AFFIX HIGH GRAVE -1BC83 ; [.438E.0020.0002] # DUPLOYAN AFFIX HIGH LONG GRAVE -1BC84 ; [.438F.0020.0002] # DUPLOYAN AFFIX HIGH DOT -1BC85 ; [.4390.0020.0002] # DUPLOYAN AFFIX HIGH CIRCLE -1BC86 ; [.4391.0020.0002] # DUPLOYAN AFFIX HIGH LINE -1BC87 ; [.4392.0020.0002] # DUPLOYAN AFFIX HIGH WAVE -1BC88 ; [.4393.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL -1BC90 ; [.4394.0020.0002] # DUPLOYAN AFFIX LOW ACUTE -1BC91 ; [.4395.0020.0002] # DUPLOYAN AFFIX LOW TIGHT ACUTE -1BC92 ; [.4396.0020.0002] # DUPLOYAN AFFIX LOW GRAVE -1BC93 ; [.4397.0020.0002] # DUPLOYAN AFFIX LOW LONG GRAVE -1BC94 ; [.4398.0020.0002] # DUPLOYAN AFFIX LOW DOT -1BC95 ; [.4399.0020.0002] # DUPLOYAN AFFIX LOW CIRCLE -1BC96 ; [.439A.0020.0002] # DUPLOYAN AFFIX LOW LINE -1BC97 ; [.439B.0020.0002] # DUPLOYAN AFFIX LOW WAVE -1BC98 ; [.439C.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL -1BC99 ; [.439D.0020.0002] # DUPLOYAN AFFIX LOW ARROW -10480 ; [.439E.0020.0002] # OSMANYA LETTER ALEF -10481 ; [.439F.0020.0002] # OSMANYA LETTER BA -10482 ; [.43A0.0020.0002] # OSMANYA LETTER TA -10483 ; [.43A1.0020.0002] # OSMANYA LETTER JA -10484 ; [.43A2.0020.0002] # OSMANYA LETTER XA -10485 ; [.43A3.0020.0002] # OSMANYA LETTER KHA -10486 ; [.43A4.0020.0002] # OSMANYA LETTER DEEL -10487 ; [.43A5.0020.0002] # OSMANYA LETTER RA -10488 ; [.43A6.0020.0002] # OSMANYA LETTER SA -10489 ; [.43A7.0020.0002] # OSMANYA LETTER SHIIN -1048A ; [.43A8.0020.0002] # OSMANYA LETTER DHA -1048B ; [.43A9.0020.0002] # OSMANYA LETTER CAYN -1048C ; [.43AA.0020.0002] # OSMANYA LETTER GA -1048D ; [.43AB.0020.0002] # OSMANYA LETTER FA -1048E ; [.43AC.0020.0002] # OSMANYA LETTER QAAF -1048F ; [.43AD.0020.0002] # OSMANYA LETTER KAAF -10490 ; [.43AE.0020.0002] # OSMANYA LETTER LAAN -10491 ; [.43AF.0020.0002] # OSMANYA LETTER MIIN -10492 ; [.43B0.0020.0002] # OSMANYA LETTER NUUN -10493 ; [.43B1.0020.0002] # OSMANYA LETTER WAW -10494 ; [.43B2.0020.0002] # OSMANYA LETTER HA -10495 ; [.43B3.0020.0002] # OSMANYA LETTER YA -10496 ; [.43B4.0020.0002] # OSMANYA LETTER A -10497 ; [.43B5.0020.0002] # OSMANYA LETTER E -10498 ; [.43B6.0020.0002] # OSMANYA LETTER I -10499 ; [.43B7.0020.0002] # OSMANYA LETTER O -1049A ; [.43B8.0020.0002] # OSMANYA LETTER U -1049B ; [.43B9.0020.0002] # OSMANYA LETTER AA -1049C ; [.43BA.0020.0002] # OSMANYA LETTER EE -1049D ; [.43BB.0020.0002] # OSMANYA LETTER OO -10500 ; [.43BC.0020.0002] # ELBASAN LETTER A -10501 ; [.43BD.0020.0002] # ELBASAN LETTER BE -10502 ; [.43BE.0020.0002] # ELBASAN LETTER CE -10503 ; [.43BF.0020.0002] # ELBASAN LETTER CHE -10504 ; [.43C0.0020.0002] # ELBASAN LETTER DE -10505 ; [.43C1.0020.0002] # ELBASAN LETTER NDE -10506 ; [.43C2.0020.0002] # ELBASAN LETTER DHE -10507 ; [.43C3.0020.0002] # ELBASAN LETTER EI -10508 ; [.43C4.0020.0002] # ELBASAN LETTER E -10509 ; [.43C5.0020.0002] # ELBASAN LETTER FE -1050A ; [.43C6.0020.0002] # ELBASAN LETTER GE -1050B ; [.43C7.0020.0002] # ELBASAN LETTER GJE -1050C ; [.43C8.0020.0002] # ELBASAN LETTER HE -1050D ; [.43C9.0020.0002] # ELBASAN LETTER I -1050E ; [.43CA.0020.0002] # ELBASAN LETTER JE -1050F ; [.43CB.0020.0002] # ELBASAN LETTER KE -10510 ; [.43CC.0020.0002] # ELBASAN LETTER LE -10511 ; [.43CD.0020.0002] # ELBASAN LETTER LLE -10512 ; [.43CE.0020.0002] # ELBASAN LETTER ME -10513 ; [.43CF.0020.0002] # ELBASAN LETTER NE -10514 ; [.43D0.0020.0002] # ELBASAN LETTER NA -10515 ; [.43D1.0020.0002] # ELBASAN LETTER NJE -10516 ; [.43D2.0020.0002] # ELBASAN LETTER O -10517 ; [.43D3.0020.0002] # ELBASAN LETTER PE -10518 ; [.43D4.0020.0002] # ELBASAN LETTER QE -10519 ; [.43D5.0020.0002] # ELBASAN LETTER RE -1051A ; [.43D6.0020.0002] # ELBASAN LETTER RRE -1051B ; [.43D7.0020.0002] # ELBASAN LETTER SE -1051C ; [.43D8.0020.0002] # ELBASAN LETTER SHE -1051D ; [.43D9.0020.0002] # ELBASAN LETTER TE -1051E ; [.43DA.0020.0002] # ELBASAN LETTER THE -1051F ; [.43DB.0020.0002] # ELBASAN LETTER U -10520 ; [.43DC.0020.0002] # ELBASAN LETTER VE -10521 ; [.43DD.0020.0002] # ELBASAN LETTER XE -10522 ; [.43DE.0020.0002] # ELBASAN LETTER Y -10523 ; [.43DF.0020.0002] # ELBASAN LETTER ZE -10524 ; [.43E0.0020.0002] # ELBASAN LETTER ZHE -10525 ; [.43E1.0020.0002] # ELBASAN LETTER GHE -10526 ; [.43E2.0020.0002] # ELBASAN LETTER GHAMMA -10527 ; [.43E3.0020.0002] # ELBASAN LETTER KHE -10530 ; [.43E4.0020.0002] # CAUCASIAN ALBANIAN LETTER ALT -10531 ; [.43E5.0020.0002] # CAUCASIAN ALBANIAN LETTER BET -10532 ; [.43E6.0020.0002] # CAUCASIAN ALBANIAN LETTER GIM -10533 ; [.43E7.0020.0002] # CAUCASIAN ALBANIAN LETTER DAT -10534 ; [.43E8.0020.0002] # CAUCASIAN ALBANIAN LETTER EB -10535 ; [.43E9.0020.0002] # CAUCASIAN ALBANIAN LETTER ZARL -10536 ; [.43EA.0020.0002] # CAUCASIAN ALBANIAN LETTER EYN -10537 ; [.43EB.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHIL -10538 ; [.43EC.0020.0002] # CAUCASIAN ALBANIAN LETTER TAS -10539 ; [.43ED.0020.0002] # CAUCASIAN ALBANIAN LETTER CHA -1053A ; [.43EE.0020.0002] # CAUCASIAN ALBANIAN LETTER YOWD -1053B ; [.43EF.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHA -1053C ; [.43F0.0020.0002] # CAUCASIAN ALBANIAN LETTER IRB -1053D ; [.43F1.0020.0002] # CAUCASIAN ALBANIAN LETTER SHA -1053E ; [.43F2.0020.0002] # CAUCASIAN ALBANIAN LETTER LAN -1053F ; [.43F3.0020.0002] # CAUCASIAN ALBANIAN LETTER INYA -10540 ; [.43F4.0020.0002] # CAUCASIAN ALBANIAN LETTER XEYN -10541 ; [.43F5.0020.0002] # CAUCASIAN ALBANIAN LETTER DYAN -10542 ; [.43F6.0020.0002] # CAUCASIAN ALBANIAN LETTER CAR -10543 ; [.43F7.0020.0002] # CAUCASIAN ALBANIAN LETTER JHOX -10544 ; [.43F8.0020.0002] # CAUCASIAN ALBANIAN LETTER KAR -10545 ; [.43F9.0020.0002] # CAUCASIAN ALBANIAN LETTER LYIT -10546 ; [.43FA.0020.0002] # CAUCASIAN ALBANIAN LETTER HEYT -10547 ; [.43FB.0020.0002] # CAUCASIAN ALBANIAN LETTER QAY -10548 ; [.43FC.0020.0002] # CAUCASIAN ALBANIAN LETTER AOR -10549 ; [.43FD.0020.0002] # CAUCASIAN ALBANIAN LETTER CHOY -1054A ; [.43FE.0020.0002] # CAUCASIAN ALBANIAN LETTER CHI -1054B ; [.43FF.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAY -1054C ; [.4400.0020.0002] # CAUCASIAN ALBANIAN LETTER MAQ -1054D ; [.4401.0020.0002] # CAUCASIAN ALBANIAN LETTER QAR -1054E ; [.4402.0020.0002] # CAUCASIAN ALBANIAN LETTER NOWC -1054F ; [.4403.0020.0002] # CAUCASIAN ALBANIAN LETTER DZYAY -10550 ; [.4404.0020.0002] # CAUCASIAN ALBANIAN LETTER SHAK -10551 ; [.4405.0020.0002] # CAUCASIAN ALBANIAN LETTER JAYN -10552 ; [.4406.0020.0002] # CAUCASIAN ALBANIAN LETTER ON -10553 ; [.4407.0020.0002] # CAUCASIAN ALBANIAN LETTER TYAY -10554 ; [.4408.0020.0002] # CAUCASIAN ALBANIAN LETTER FAM -10555 ; [.4409.0020.0002] # CAUCASIAN ALBANIAN LETTER DZAY -10556 ; [.440A.0020.0002] # CAUCASIAN ALBANIAN LETTER CHAT -10557 ; [.440B.0020.0002] # CAUCASIAN ALBANIAN LETTER PEN -10558 ; [.440C.0020.0002] # CAUCASIAN ALBANIAN LETTER GHEYS -10559 ; [.440D.0020.0002] # CAUCASIAN ALBANIAN LETTER RAT -1055A ; [.440E.0020.0002] # CAUCASIAN ALBANIAN LETTER SEYK -1055B ; [.440F.0020.0002] # CAUCASIAN ALBANIAN LETTER VEYZ -1055C ; [.4410.0020.0002] # CAUCASIAN ALBANIAN LETTER TIWR -1055D ; [.4411.0020.0002] # CAUCASIAN ALBANIAN LETTER SHOY -1055E ; [.4412.0020.0002] # CAUCASIAN ALBANIAN LETTER IWN -1055F ; [.4413.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAW -10560 ; [.4414.0020.0002] # CAUCASIAN ALBANIAN LETTER CAYN -10561 ; [.4415.0020.0002] # CAUCASIAN ALBANIAN LETTER YAYD -10562 ; [.4416.0020.0002] # CAUCASIAN ALBANIAN LETTER PIWR -10563 ; [.4417.0020.0002] # CAUCASIAN ALBANIAN LETTER KIW -110D0 ; [.4418.0020.0002] # SORA SOMPENG LETTER SAH -110D1 ; [.4419.0020.0002] # SORA SOMPENG LETTER TAH -110D2 ; [.441A.0020.0002] # SORA SOMPENG LETTER BAH -110D3 ; [.441B.0020.0002] # SORA SOMPENG LETTER CAH -110D4 ; [.441C.0020.0002] # SORA SOMPENG LETTER DAH -110D5 ; [.441D.0020.0002] # SORA SOMPENG LETTER GAH -110D6 ; [.441E.0020.0002] # SORA SOMPENG LETTER MAH -110D7 ; [.441F.0020.0002] # SORA SOMPENG LETTER NGAH -110D8 ; [.4420.0020.0002] # SORA SOMPENG LETTER LAH -110D9 ; [.4421.0020.0002] # SORA SOMPENG LETTER NAH -110DA ; [.4422.0020.0002] # SORA SOMPENG LETTER VAH -110DB ; [.4423.0020.0002] # SORA SOMPENG LETTER PAH -110DC ; [.4424.0020.0002] # SORA SOMPENG LETTER YAH -110DD ; [.4425.0020.0002] # SORA SOMPENG LETTER RAH -110DE ; [.4426.0020.0002] # SORA SOMPENG LETTER HAH -110DF ; [.4427.0020.0002] # SORA SOMPENG LETTER KAH -110E0 ; [.4428.0020.0002] # SORA SOMPENG LETTER JAH -110E1 ; [.4429.0020.0002] # SORA SOMPENG LETTER NYAH -110E2 ; [.442A.0020.0002] # SORA SOMPENG LETTER AH -110E3 ; [.442B.0020.0002] # SORA SOMPENG LETTER EEH -110E4 ; [.442C.0020.0002] # SORA SOMPENG LETTER IH -110E5 ; [.442D.0020.0002] # SORA SOMPENG LETTER UH -110E6 ; [.442E.0020.0002] # SORA SOMPENG LETTER OH -110E7 ; [.442F.0020.0002] # SORA SOMPENG LETTER EH -110E8 ; [.4430.0020.0002] # SORA SOMPENG LETTER MAE -16A40 ; [.4431.0020.0002] # MRO LETTER TA -16A41 ; [.4432.0020.0002] # MRO LETTER NGI -16A42 ; [.4433.0020.0002] # MRO LETTER YO -16A43 ; [.4434.0020.0002] # MRO LETTER MIM -16A44 ; [.4435.0020.0002] # MRO LETTER BA -16A45 ; [.4436.0020.0002] # MRO LETTER DA -16A46 ; [.4437.0020.0002] # MRO LETTER A -16A47 ; [.4438.0020.0002] # MRO LETTER PHI -16A48 ; [.4439.0020.0002] # MRO LETTER KHAI -16A49 ; [.443A.0020.0002] # MRO LETTER HAO -16A4A ; [.443B.0020.0002] # MRO LETTER DAI -16A4B ; [.443C.0020.0002] # MRO LETTER CHU -16A4C ; [.443D.0020.0002] # MRO LETTER KEAAE -16A4D ; [.443E.0020.0002] # MRO LETTER OL -16A4E ; [.443F.0020.0002] # MRO LETTER MAEM -16A4F ; [.4440.0020.0002] # MRO LETTER NIN -16A50 ; [.4441.0020.0002] # MRO LETTER PA -16A51 ; [.4442.0020.0002] # MRO LETTER OO -16A52 ; [.4443.0020.0002] # MRO LETTER O -16A53 ; [.4444.0020.0002] # MRO LETTER RO -16A54 ; [.4445.0020.0002] # MRO LETTER SHI -16A55 ; [.4446.0020.0002] # MRO LETTER THEA -16A56 ; [.4447.0020.0002] # MRO LETTER EA -16A57 ; [.4448.0020.0002] # MRO LETTER WA -16A58 ; [.4449.0020.0002] # MRO LETTER E -16A59 ; [.444A.0020.0002] # MRO LETTER KO -16A5A ; [.444B.0020.0002] # MRO LETTER LAN -16A5B ; [.444C.0020.0002] # MRO LETTER LA -16A5C ; [.444D.0020.0002] # MRO LETTER HAI -16A5D ; [.444E.0020.0002] # MRO LETTER RI -16A5E ; [.444F.0020.0002] # MRO LETTER TEK -10000 ; [.4450.0020.0002] # LINEAR B SYLLABLE B008 A -10001 ; [.4451.0020.0002] # LINEAR B SYLLABLE B038 E -10002 ; [.4452.0020.0002] # LINEAR B SYLLABLE B028 I -10003 ; [.4453.0020.0002] # LINEAR B SYLLABLE B061 O -10004 ; [.4454.0020.0002] # LINEAR B SYLLABLE B010 U -10005 ; [.4455.0020.0002] # LINEAR B SYLLABLE B001 DA -10006 ; [.4456.0020.0002] # LINEAR B SYLLABLE B045 DE -10007 ; [.4457.0020.0002] # LINEAR B SYLLABLE B007 DI -10008 ; [.4458.0020.0002] # LINEAR B SYLLABLE B014 DO -10009 ; [.4459.0020.0002] # LINEAR B SYLLABLE B051 DU -1000A ; [.445A.0020.0002] # LINEAR B SYLLABLE B057 JA -1000B ; [.445B.0020.0002] # LINEAR B SYLLABLE B046 JE -1000D ; [.445C.0020.0002] # LINEAR B SYLLABLE B036 JO -1000E ; [.445D.0020.0002] # LINEAR B SYLLABLE B065 JU -1000F ; [.445E.0020.0002] # LINEAR B SYLLABLE B077 KA -10010 ; [.445F.0020.0002] # LINEAR B SYLLABLE B044 KE -10011 ; [.4460.0020.0002] # LINEAR B SYLLABLE B067 KI -10012 ; [.4461.0020.0002] # LINEAR B SYLLABLE B070 KO -10013 ; [.4462.0020.0002] # LINEAR B SYLLABLE B081 KU -10014 ; [.4463.0020.0002] # LINEAR B SYLLABLE B080 MA -10015 ; [.4464.0020.0002] # LINEAR B SYLLABLE B013 ME -10016 ; [.4465.0020.0002] # LINEAR B SYLLABLE B073 MI -10017 ; [.4466.0020.0002] # LINEAR B SYLLABLE B015 MO -10018 ; [.4467.0020.0002] # LINEAR B SYLLABLE B023 MU -10019 ; [.4468.0020.0002] # LINEAR B SYLLABLE B006 NA -1001A ; [.4469.0020.0002] # LINEAR B SYLLABLE B024 NE -1001B ; [.446A.0020.0002] # LINEAR B SYLLABLE B030 NI -1001C ; [.446B.0020.0002] # LINEAR B SYLLABLE B052 NO -1001D ; [.446C.0020.0002] # LINEAR B SYLLABLE B055 NU -1001E ; [.446D.0020.0002] # LINEAR B SYLLABLE B003 PA -1001F ; [.446E.0020.0002] # LINEAR B SYLLABLE B072 PE -10020 ; [.446F.0020.0002] # LINEAR B SYLLABLE B039 PI -10021 ; [.4470.0020.0002] # LINEAR B SYLLABLE B011 PO -10022 ; [.4471.0020.0002] # LINEAR B SYLLABLE B050 PU -10023 ; [.4472.0020.0002] # LINEAR B SYLLABLE B016 QA -10024 ; [.4473.0020.0002] # LINEAR B SYLLABLE B078 QE -10025 ; [.4474.0020.0002] # LINEAR B SYLLABLE B021 QI -10026 ; [.4475.0020.0002] # LINEAR B SYLLABLE B032 QO -10028 ; [.4476.0020.0002] # LINEAR B SYLLABLE B060 RA -10029 ; [.4477.0020.0002] # LINEAR B SYLLABLE B027 RE -1002A ; [.4478.0020.0002] # LINEAR B SYLLABLE B053 RI -1002B ; [.4479.0020.0002] # LINEAR B SYLLABLE B002 RO -1002C ; [.447A.0020.0002] # LINEAR B SYLLABLE B026 RU -1002D ; [.447B.0020.0002] # LINEAR B SYLLABLE B031 SA -1002E ; [.447C.0020.0002] # LINEAR B SYLLABLE B009 SE -1002F ; [.447D.0020.0002] # LINEAR B SYLLABLE B041 SI -10030 ; [.447E.0020.0002] # LINEAR B SYLLABLE B012 SO -10031 ; [.447F.0020.0002] # LINEAR B SYLLABLE B058 SU -10032 ; [.4480.0020.0002] # LINEAR B SYLLABLE B059 TA -10033 ; [.4481.0020.0002] # LINEAR B SYLLABLE B004 TE -10034 ; [.4482.0020.0002] # LINEAR B SYLLABLE B037 TI -10035 ; [.4483.0020.0002] # LINEAR B SYLLABLE B005 TO -10036 ; [.4484.0020.0002] # LINEAR B SYLLABLE B069 TU -10037 ; [.4485.0020.0002] # LINEAR B SYLLABLE B054 WA -10038 ; [.4486.0020.0002] # LINEAR B SYLLABLE B075 WE -10039 ; [.4487.0020.0002] # LINEAR B SYLLABLE B040 WI -1003A ; [.4488.0020.0002] # LINEAR B SYLLABLE B042 WO -1003C ; [.4489.0020.0002] # LINEAR B SYLLABLE B017 ZA -1003D ; [.448A.0020.0002] # LINEAR B SYLLABLE B074 ZE -1003F ; [.448B.0020.0002] # LINEAR B SYLLABLE B020 ZO -10040 ; [.448C.0020.0002] # LINEAR B SYLLABLE B025 A2 -10041 ; [.448D.0020.0002] # LINEAR B SYLLABLE B043 A3 -10042 ; [.448E.0020.0002] # LINEAR B SYLLABLE B085 AU -10043 ; [.448F.0020.0002] # LINEAR B SYLLABLE B071 DWE -10044 ; [.4490.0020.0002] # LINEAR B SYLLABLE B090 DWO -10045 ; [.4491.0020.0002] # LINEAR B SYLLABLE B048 NWA -10046 ; [.4492.0020.0002] # LINEAR B SYLLABLE B029 PU2 -10047 ; [.4493.0020.0002] # LINEAR B SYLLABLE B062 PTE -10048 ; [.4494.0020.0002] # LINEAR B SYLLABLE B076 RA2 -10049 ; [.4495.0020.0002] # LINEAR B SYLLABLE B033 RA3 -1004A ; [.4496.0020.0002] # LINEAR B SYLLABLE B068 RO2 -1004B ; [.4497.0020.0002] # LINEAR B SYLLABLE B066 TA2 -1004C ; [.4498.0020.0002] # LINEAR B SYLLABLE B087 TWE -1004D ; [.4499.0020.0002] # LINEAR B SYLLABLE B091 TWO -10050 ; [.449A.0020.0002] # LINEAR B SYMBOL B018 -10051 ; [.449B.0020.0002] # LINEAR B SYMBOL B019 -10052 ; [.449C.0020.0002] # LINEAR B SYMBOL B022 -10053 ; [.449D.0020.0002] # LINEAR B SYMBOL B034 -10054 ; [.449E.0020.0002] # LINEAR B SYMBOL B047 -10055 ; [.449F.0020.0002] # LINEAR B SYMBOL B049 -10056 ; [.44A0.0020.0002] # LINEAR B SYMBOL B056 -10057 ; [.44A1.0020.0002] # LINEAR B SYMBOL B063 -10058 ; [.44A2.0020.0002] # LINEAR B SYMBOL B064 -10059 ; [.44A3.0020.0002] # LINEAR B SYMBOL B079 -1005A ; [.44A4.0020.0002] # LINEAR B SYMBOL B082 -1005B ; [.44A5.0020.0002] # LINEAR B SYMBOL B083 -1005C ; [.44A6.0020.0002] # LINEAR B SYMBOL B086 -1005D ; [.44A7.0020.0002] # LINEAR B SYMBOL B089 -10080 ; [.44A8.0020.0002] # LINEAR B IDEOGRAM B100 MAN -10081 ; [.44A9.0020.0002] # LINEAR B IDEOGRAM B102 WOMAN -10082 ; [.44AA.0020.0002] # LINEAR B IDEOGRAM B104 DEER -10083 ; [.44AB.0020.0002] # LINEAR B IDEOGRAM B105 EQUID -10084 ; [.44AC.0020.0002] # LINEAR B IDEOGRAM B105F MARE -10085 ; [.44AD.0020.0002] # LINEAR B IDEOGRAM B105M STALLION -10086 ; [.44AE.0020.0002] # LINEAR B IDEOGRAM B106F EWE -10087 ; [.44AF.0020.0002] # LINEAR B IDEOGRAM B106M RAM -10088 ; [.44B0.0020.0002] # LINEAR B IDEOGRAM B107F SHE-GOAT -10089 ; [.44B1.0020.0002] # LINEAR B IDEOGRAM B107M HE-GOAT -1008A ; [.44B2.0020.0002] # LINEAR B IDEOGRAM B108F SOW -1008B ; [.44B3.0020.0002] # LINEAR B IDEOGRAM B108M BOAR -1008C ; [.44B4.0020.0002] # LINEAR B IDEOGRAM B109F COW -1008D ; [.44B5.0020.0002] # LINEAR B IDEOGRAM B109M BULL -1008E ; [.44B6.0020.0002] # LINEAR B IDEOGRAM B120 WHEAT -1008F ; [.44B7.0020.0002] # LINEAR B IDEOGRAM B121 BARLEY -10090 ; [.44B8.0020.0002] # LINEAR B IDEOGRAM B122 OLIVE -10091 ; [.44B9.0020.0002] # LINEAR B IDEOGRAM B123 SPICE -10092 ; [.44BA.0020.0002] # LINEAR B IDEOGRAM B125 CYPERUS -10093 ; [.44BB.0020.0002] # LINEAR B MONOGRAM B127 KAPO -10094 ; [.44BC.0020.0002] # LINEAR B MONOGRAM B128 KANAKO -10095 ; [.44BD.0020.0002] # LINEAR B IDEOGRAM B130 OIL -10096 ; [.44BE.0020.0002] # LINEAR B IDEOGRAM B131 WINE -10097 ; [.44BF.0020.0002] # LINEAR B IDEOGRAM B132 -10098 ; [.44C0.0020.0002] # LINEAR B MONOGRAM B133 AREPA -10099 ; [.44C1.0020.0002] # LINEAR B MONOGRAM B135 MERI -1009A ; [.44C2.0020.0002] # LINEAR B IDEOGRAM B140 BRONZE -1009B ; [.44C3.0020.0002] # LINEAR B IDEOGRAM B141 GOLD -1009C ; [.44C4.0020.0002] # LINEAR B IDEOGRAM B142 -1009D ; [.44C5.0020.0002] # LINEAR B IDEOGRAM B145 WOOL -1009E ; [.44C6.0020.0002] # LINEAR B IDEOGRAM B146 -1009F ; [.44C7.0020.0002] # LINEAR B IDEOGRAM B150 -100A0 ; [.44C8.0020.0002] # LINEAR B IDEOGRAM B151 HORN -100A1 ; [.44C9.0020.0002] # LINEAR B IDEOGRAM B152 -100A2 ; [.44CA.0020.0002] # LINEAR B IDEOGRAM B153 -100A3 ; [.44CB.0020.0002] # LINEAR B IDEOGRAM B154 -100A4 ; [.44CC.0020.0002] # LINEAR B MONOGRAM B156 TURO2 -100A5 ; [.44CD.0020.0002] # LINEAR B IDEOGRAM B157 -100A6 ; [.44CE.0020.0002] # LINEAR B IDEOGRAM B158 -100A7 ; [.44CF.0020.0002] # LINEAR B IDEOGRAM B159 CLOTH -100A8 ; [.44D0.0020.0002] # LINEAR B IDEOGRAM B160 -100A9 ; [.44D1.0020.0002] # LINEAR B IDEOGRAM B161 -100AA ; [.44D2.0020.0002] # LINEAR B IDEOGRAM B162 GARMENT -100AB ; [.44D3.0020.0002] # LINEAR B IDEOGRAM B163 ARMOUR -100AC ; [.44D4.0020.0002] # LINEAR B IDEOGRAM B164 -100AD ; [.44D5.0020.0002] # LINEAR B IDEOGRAM B165 -100AE ; [.44D6.0020.0002] # LINEAR B IDEOGRAM B166 -100AF ; [.44D7.0020.0002] # LINEAR B IDEOGRAM B167 -100B0 ; [.44D8.0020.0002] # LINEAR B IDEOGRAM B168 -100B1 ; [.44D9.0020.0002] # LINEAR B IDEOGRAM B169 -100B2 ; [.44DA.0020.0002] # LINEAR B IDEOGRAM B170 -100B3 ; [.44DB.0020.0002] # LINEAR B IDEOGRAM B171 -100B4 ; [.44DC.0020.0002] # LINEAR B IDEOGRAM B172 -100B5 ; [.44DD.0020.0002] # LINEAR B IDEOGRAM B173 MONTH -100B6 ; [.44DE.0020.0002] # LINEAR B IDEOGRAM B174 -100B7 ; [.44DF.0020.0002] # LINEAR B IDEOGRAM B176 TREE -100B8 ; [.44E0.0020.0002] # LINEAR B IDEOGRAM B177 -100B9 ; [.44E1.0020.0002] # LINEAR B IDEOGRAM B178 -100BA ; [.44E2.0020.0002] # LINEAR B IDEOGRAM B179 -100BB ; [.44E3.0020.0002] # LINEAR B IDEOGRAM B180 -100BC ; [.44E4.0020.0002] # LINEAR B IDEOGRAM B181 -100BD ; [.44E5.0020.0002] # LINEAR B IDEOGRAM B182 -100BE ; [.44E6.0020.0002] # LINEAR B IDEOGRAM B183 -100BF ; [.44E7.0020.0002] # LINEAR B IDEOGRAM B184 -100C0 ; [.44E8.0020.0002] # LINEAR B IDEOGRAM B185 -100C1 ; [.44E9.0020.0002] # LINEAR B IDEOGRAM B189 -100C2 ; [.44EA.0020.0002] # LINEAR B IDEOGRAM B190 -100C3 ; [.44EB.0020.0002] # LINEAR B IDEOGRAM B191 HELMET -100C4 ; [.44EC.0020.0002] # LINEAR B IDEOGRAM B220 FOOTSTOOL -100C5 ; [.44ED.0020.0002] # LINEAR B IDEOGRAM B225 BATHTUB -100C6 ; [.44EE.0020.0002] # LINEAR B IDEOGRAM B230 SPEAR -100C7 ; [.44EF.0020.0002] # LINEAR B IDEOGRAM B231 ARROW -100C8 ; [.44F0.0020.0002] # LINEAR B IDEOGRAM B232 -100C9 ; [.44F1.0020.0002] # LINEAR B IDEOGRAM B233 SWORD -100CA ; [.44F2.0020.0002] # LINEAR B IDEOGRAM B234 -100CB ; [.44F3.0020.0002] # LINEAR B IDEOGRAM B236 -100CC ; [.44F4.0020.0002] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT -100CD ; [.44F5.0020.0002] # LINEAR B IDEOGRAM B241 CHARIOT -100CE ; [.44F6.0020.0002] # LINEAR B IDEOGRAM B242 CHARIOT FRAME -100CF ; [.44F7.0020.0002] # LINEAR B IDEOGRAM B243 WHEEL -100D0 ; [.44F8.0020.0002] # LINEAR B IDEOGRAM B245 -100D1 ; [.44F9.0020.0002] # LINEAR B IDEOGRAM B246 -100D2 ; [.44FA.0020.0002] # LINEAR B MONOGRAM B247 DIPTE -100D3 ; [.44FB.0020.0002] # LINEAR B IDEOGRAM B248 -100D4 ; [.44FC.0020.0002] # LINEAR B IDEOGRAM B249 -100D5 ; [.44FD.0020.0002] # LINEAR B IDEOGRAM B251 -100D6 ; [.44FE.0020.0002] # LINEAR B IDEOGRAM B252 -100D7 ; [.44FF.0020.0002] # LINEAR B IDEOGRAM B253 -100D8 ; [.4500.0020.0002] # LINEAR B IDEOGRAM B254 DART -100D9 ; [.4501.0020.0002] # LINEAR B IDEOGRAM B255 -100DA ; [.4502.0020.0002] # LINEAR B IDEOGRAM B256 -100DB ; [.4503.0020.0002] # LINEAR B IDEOGRAM B257 -100DC ; [.4504.0020.0002] # LINEAR B IDEOGRAM B258 -100DD ; [.4505.0020.0002] # LINEAR B IDEOGRAM B259 -100DE ; [.4506.0020.0002] # LINEAR B IDEOGRAM VESSEL B155 -100DF ; [.4507.0020.0002] # LINEAR B IDEOGRAM VESSEL B200 -100E0 ; [.4508.0020.0002] # LINEAR B IDEOGRAM VESSEL B201 -100E1 ; [.4509.0020.0002] # LINEAR B IDEOGRAM VESSEL B202 -100E2 ; [.450A.0020.0002] # LINEAR B IDEOGRAM VESSEL B203 -100E3 ; [.450B.0020.0002] # LINEAR B IDEOGRAM VESSEL B204 -100E4 ; [.450C.0020.0002] # LINEAR B IDEOGRAM VESSEL B205 -100E5 ; [.450D.0020.0002] # LINEAR B IDEOGRAM VESSEL B206 -100E6 ; [.450E.0020.0002] # LINEAR B IDEOGRAM VESSEL B207 -100E7 ; [.450F.0020.0002] # LINEAR B IDEOGRAM VESSEL B208 -100E8 ; [.4510.0020.0002] # LINEAR B IDEOGRAM VESSEL B209 -100E9 ; [.4511.0020.0002] # LINEAR B IDEOGRAM VESSEL B210 -100EA ; [.4512.0020.0002] # LINEAR B IDEOGRAM VESSEL B211 -100EB ; [.4513.0020.0002] # LINEAR B IDEOGRAM VESSEL B212 -100EC ; [.4514.0020.0002] # LINEAR B IDEOGRAM VESSEL B213 -100ED ; [.4515.0020.0002] # LINEAR B IDEOGRAM VESSEL B214 -100EE ; [.4516.0020.0002] # LINEAR B IDEOGRAM VESSEL B215 -100EF ; [.4517.0020.0002] # LINEAR B IDEOGRAM VESSEL B216 -100F0 ; [.4518.0020.0002] # LINEAR B IDEOGRAM VESSEL B217 -100F1 ; [.4519.0020.0002] # LINEAR B IDEOGRAM VESSEL B218 -100F2 ; [.451A.0020.0002] # LINEAR B IDEOGRAM VESSEL B219 -100F3 ; [.451B.0020.0002] # LINEAR B IDEOGRAM VESSEL B221 -100F4 ; [.451C.0020.0002] # LINEAR B IDEOGRAM VESSEL B222 -100F5 ; [.451D.0020.0002] # LINEAR B IDEOGRAM VESSEL B226 -100F6 ; [.451E.0020.0002] # LINEAR B IDEOGRAM VESSEL B227 -100F7 ; [.451F.0020.0002] # LINEAR B IDEOGRAM VESSEL B228 -100F8 ; [.4520.0020.0002] # LINEAR B IDEOGRAM VESSEL B229 -100F9 ; [.4521.0020.0002] # LINEAR B IDEOGRAM VESSEL B250 -100FA ; [.4522.0020.0002] # LINEAR B IDEOGRAM VESSEL B305 -10600 ; [.4523.0020.0002] # LINEAR A SIGN AB001 -10601 ; [.4524.0020.0002] # LINEAR A SIGN AB002 -10602 ; [.4525.0020.0002] # LINEAR A SIGN AB003 -10603 ; [.4526.0020.0002] # LINEAR A SIGN AB004 -10604 ; [.4527.0020.0002] # LINEAR A SIGN AB005 -10605 ; [.4528.0020.0002] # LINEAR A SIGN AB006 -10606 ; [.4529.0020.0002] # LINEAR A SIGN AB007 -10607 ; [.452A.0020.0002] # LINEAR A SIGN AB008 -10608 ; [.452B.0020.0002] # LINEAR A SIGN AB009 -10609 ; [.452C.0020.0002] # LINEAR A SIGN AB010 -1060A ; [.452D.0020.0002] # LINEAR A SIGN AB011 -1060B ; [.452E.0020.0002] # LINEAR A SIGN AB013 -1060C ; [.452F.0020.0002] # LINEAR A SIGN AB016 -1060D ; [.4530.0020.0002] # LINEAR A SIGN AB017 -1060E ; [.4531.0020.0002] # LINEAR A SIGN AB020 -1060F ; [.4532.0020.0002] # LINEAR A SIGN AB021 -10610 ; [.4533.0020.0002] # LINEAR A SIGN AB021F -10611 ; [.4534.0020.0002] # LINEAR A SIGN AB021M -10612 ; [.4535.0020.0002] # LINEAR A SIGN AB022 -10613 ; [.4536.0020.0002] # LINEAR A SIGN AB022F -10614 ; [.4537.0020.0002] # LINEAR A SIGN AB022M -10615 ; [.4538.0020.0002] # LINEAR A SIGN AB023 -10616 ; [.4539.0020.0002] # LINEAR A SIGN AB023M -10617 ; [.453A.0020.0002] # LINEAR A SIGN AB024 -10618 ; [.453B.0020.0002] # LINEAR A SIGN AB026 -10619 ; [.453C.0020.0002] # LINEAR A SIGN AB027 -1061A ; [.453D.0020.0002] # LINEAR A SIGN AB028 -1061B ; [.453E.0020.0002] # LINEAR A SIGN A028B -1061C ; [.453F.0020.0002] # LINEAR A SIGN AB029 -1061D ; [.4540.0020.0002] # LINEAR A SIGN AB030 -1061E ; [.4541.0020.0002] # LINEAR A SIGN AB031 -1061F ; [.4542.0020.0002] # LINEAR A SIGN AB034 -10620 ; [.4543.0020.0002] # LINEAR A SIGN AB037 -10621 ; [.4544.0020.0002] # LINEAR A SIGN AB038 -10622 ; [.4545.0020.0002] # LINEAR A SIGN AB039 -10623 ; [.4546.0020.0002] # LINEAR A SIGN AB040 -10624 ; [.4547.0020.0002] # LINEAR A SIGN AB041 -10625 ; [.4548.0020.0002] # LINEAR A SIGN AB044 -10626 ; [.4549.0020.0002] # LINEAR A SIGN AB045 -10627 ; [.454A.0020.0002] # LINEAR A SIGN AB046 -10628 ; [.454B.0020.0002] # LINEAR A SIGN AB047 -10629 ; [.454C.0020.0002] # LINEAR A SIGN AB048 -1062A ; [.454D.0020.0002] # LINEAR A SIGN AB049 -1062B ; [.454E.0020.0002] # LINEAR A SIGN AB050 -1062C ; [.454F.0020.0002] # LINEAR A SIGN AB051 -1062D ; [.4550.0020.0002] # LINEAR A SIGN AB053 -1062E ; [.4551.0020.0002] # LINEAR A SIGN AB054 -1062F ; [.4552.0020.0002] # LINEAR A SIGN AB055 -10630 ; [.4553.0020.0002] # LINEAR A SIGN AB056 -10631 ; [.4554.0020.0002] # LINEAR A SIGN AB057 -10632 ; [.4555.0020.0002] # LINEAR A SIGN AB058 -10633 ; [.4556.0020.0002] # LINEAR A SIGN AB059 -10634 ; [.4557.0020.0002] # LINEAR A SIGN AB060 -10635 ; [.4558.0020.0002] # LINEAR A SIGN AB061 -10636 ; [.4559.0020.0002] # LINEAR A SIGN AB065 -10637 ; [.455A.0020.0002] # LINEAR A SIGN AB066 -10638 ; [.455B.0020.0002] # LINEAR A SIGN AB067 -10639 ; [.455C.0020.0002] # LINEAR A SIGN AB069 -1063A ; [.455D.0020.0002] # LINEAR A SIGN AB070 -1063B ; [.455E.0020.0002] # LINEAR A SIGN AB073 -1063C ; [.455F.0020.0002] # LINEAR A SIGN AB074 -1063D ; [.4560.0020.0002] # LINEAR A SIGN AB076 -1063E ; [.4561.0020.0002] # LINEAR A SIGN AB077 -1063F ; [.4562.0020.0002] # LINEAR A SIGN AB078 -10640 ; [.4563.0020.0002] # LINEAR A SIGN AB079 -10641 ; [.4564.0020.0002] # LINEAR A SIGN AB080 -10642 ; [.4565.0020.0002] # LINEAR A SIGN AB081 -10643 ; [.4566.0020.0002] # LINEAR A SIGN AB082 -10644 ; [.4567.0020.0002] # LINEAR A SIGN AB085 -10645 ; [.4568.0020.0002] # LINEAR A SIGN AB086 -10646 ; [.4569.0020.0002] # LINEAR A SIGN AB087 -10647 ; [.456A.0020.0002] # LINEAR A SIGN A100-102 -10648 ; [.456B.0020.0002] # LINEAR A SIGN AB118 -10649 ; [.456C.0020.0002] # LINEAR A SIGN AB120 -1064A ; [.456D.0020.0002] # LINEAR A SIGN A120B -1064B ; [.456E.0020.0002] # LINEAR A SIGN AB122 -1064C ; [.456F.0020.0002] # LINEAR A SIGN AB123 -1064D ; [.4570.0020.0002] # LINEAR A SIGN AB131A -1064E ; [.4571.0020.0002] # LINEAR A SIGN AB131B -1064F ; [.4572.0020.0002] # LINEAR A SIGN A131C -10650 ; [.4573.0020.0002] # LINEAR A SIGN AB164 -10651 ; [.4574.0020.0002] # LINEAR A SIGN AB171 -10652 ; [.4575.0020.0002] # LINEAR A SIGN AB180 -10653 ; [.4576.0020.0002] # LINEAR A SIGN AB188 -10654 ; [.4577.0020.0002] # LINEAR A SIGN AB191 -10655 ; [.4578.0020.0002] # LINEAR A SIGN A301 -10656 ; [.4579.0020.0002] # LINEAR A SIGN A302 -10657 ; [.457A.0020.0002] # LINEAR A SIGN A303 -10658 ; [.457B.0020.0002] # LINEAR A SIGN A304 -10659 ; [.457C.0020.0002] # LINEAR A SIGN A305 -1065A ; [.457D.0020.0002] # LINEAR A SIGN A306 -1065B ; [.457E.0020.0002] # LINEAR A SIGN A307 -1065C ; [.457F.0020.0002] # LINEAR A SIGN A308 -1065D ; [.4580.0020.0002] # LINEAR A SIGN A309A -1065E ; [.4581.0020.0002] # LINEAR A SIGN A309B -1065F ; [.4582.0020.0002] # LINEAR A SIGN A309C -10660 ; [.4583.0020.0002] # LINEAR A SIGN A310 -10661 ; [.4584.0020.0002] # LINEAR A SIGN A311 -10662 ; [.4585.0020.0002] # LINEAR A SIGN A312 -10663 ; [.4586.0020.0002] # LINEAR A SIGN A313A -10664 ; [.4587.0020.0002] # LINEAR A SIGN A313B -10665 ; [.4588.0020.0002] # LINEAR A SIGN A313C -10666 ; [.4589.0020.0002] # LINEAR A SIGN A314 -10667 ; [.458A.0020.0002] # LINEAR A SIGN A315 -10668 ; [.458B.0020.0002] # LINEAR A SIGN A316 -10669 ; [.458C.0020.0002] # LINEAR A SIGN A317 -1066A ; [.458D.0020.0002] # LINEAR A SIGN A318 -1066B ; [.458E.0020.0002] # LINEAR A SIGN A319 -1066C ; [.458F.0020.0002] # LINEAR A SIGN A320 -1066D ; [.4590.0020.0002] # LINEAR A SIGN A321 -1066E ; [.4591.0020.0002] # LINEAR A SIGN A322 -1066F ; [.4592.0020.0002] # LINEAR A SIGN A323 -10670 ; [.4593.0020.0002] # LINEAR A SIGN A324 -10671 ; [.4594.0020.0002] # LINEAR A SIGN A325 -10672 ; [.4595.0020.0002] # LINEAR A SIGN A326 -10673 ; [.4596.0020.0002] # LINEAR A SIGN A327 -10674 ; [.4597.0020.0002] # LINEAR A SIGN A328 -10675 ; [.4598.0020.0002] # LINEAR A SIGN A329 -10676 ; [.4599.0020.0002] # LINEAR A SIGN A330 -10677 ; [.459A.0020.0002] # LINEAR A SIGN A331 -10678 ; [.459B.0020.0002] # LINEAR A SIGN A332 -10679 ; [.459C.0020.0002] # LINEAR A SIGN A333 -1067A ; [.459D.0020.0002] # LINEAR A SIGN A334 -1067B ; [.459E.0020.0002] # LINEAR A SIGN A335 -1067C ; [.459F.0020.0002] # LINEAR A SIGN A336 -1067D ; [.45A0.0020.0002] # LINEAR A SIGN A337 -1067E ; [.45A1.0020.0002] # LINEAR A SIGN A338 -1067F ; [.45A2.0020.0002] # LINEAR A SIGN A339 -10680 ; [.45A3.0020.0002] # LINEAR A SIGN A340 -10681 ; [.45A4.0020.0002] # LINEAR A SIGN A341 -10682 ; [.45A5.0020.0002] # LINEAR A SIGN A342 -10683 ; [.45A6.0020.0002] # LINEAR A SIGN A343 -10684 ; [.45A7.0020.0002] # LINEAR A SIGN A344 -10685 ; [.45A8.0020.0002] # LINEAR A SIGN A345 -10686 ; [.45A9.0020.0002] # LINEAR A SIGN A346 -10687 ; [.45AA.0020.0002] # LINEAR A SIGN A347 -10688 ; [.45AB.0020.0002] # LINEAR A SIGN A348 -10689 ; [.45AC.0020.0002] # LINEAR A SIGN A349 -1068A ; [.45AD.0020.0002] # LINEAR A SIGN A350 -1068B ; [.45AE.0020.0002] # LINEAR A SIGN A351 -1068C ; [.45AF.0020.0002] # LINEAR A SIGN A352 -1068D ; [.45B0.0020.0002] # LINEAR A SIGN A353 -1068E ; [.45B1.0020.0002] # LINEAR A SIGN A354 -1068F ; [.45B2.0020.0002] # LINEAR A SIGN A355 -10690 ; [.45B3.0020.0002] # LINEAR A SIGN A356 -10691 ; [.45B4.0020.0002] # LINEAR A SIGN A357 -10692 ; [.45B5.0020.0002] # LINEAR A SIGN A358 -10693 ; [.45B6.0020.0002] # LINEAR A SIGN A359 -10694 ; [.45B7.0020.0002] # LINEAR A SIGN A360 -10695 ; [.45B8.0020.0002] # LINEAR A SIGN A361 -10696 ; [.45B9.0020.0002] # LINEAR A SIGN A362 -10697 ; [.45BA.0020.0002] # LINEAR A SIGN A363 -10698 ; [.45BB.0020.0002] # LINEAR A SIGN A364 -10699 ; [.45BC.0020.0002] # LINEAR A SIGN A365 -1069A ; [.45BD.0020.0002] # LINEAR A SIGN A366 -1069B ; [.45BE.0020.0002] # LINEAR A SIGN A367 -1069C ; [.45BF.0020.0002] # LINEAR A SIGN A368 -1069D ; [.45C0.0020.0002] # LINEAR A SIGN A369 -1069E ; [.45C1.0020.0002] # LINEAR A SIGN A370 -1069F ; [.45C2.0020.0002] # LINEAR A SIGN A371 -106A0 ; [.45C3.0020.0002] # LINEAR A SIGN A400-VAS -106A1 ; [.45C4.0020.0002] # LINEAR A SIGN A401-VAS -106A2 ; [.45C5.0020.0002] # LINEAR A SIGN A402-VAS -106A3 ; [.45C6.0020.0002] # LINEAR A SIGN A403-VAS -106A4 ; [.45C7.0020.0002] # LINEAR A SIGN A404-VAS -106A5 ; [.45C8.0020.0002] # LINEAR A SIGN A405-VAS -106A6 ; [.45C9.0020.0002] # LINEAR A SIGN A406-VAS -106A7 ; [.45CA.0020.0002] # LINEAR A SIGN A407-VAS -106A8 ; [.45CB.0020.0002] # LINEAR A SIGN A408-VAS -106A9 ; [.45CC.0020.0002] # LINEAR A SIGN A409-VAS -106AA ; [.45CD.0020.0002] # LINEAR A SIGN A410-VAS -106AB ; [.45CE.0020.0002] # LINEAR A SIGN A411-VAS -106AC ; [.45CF.0020.0002] # LINEAR A SIGN A412-VAS -106AD ; [.45D0.0020.0002] # LINEAR A SIGN A413-VAS -106AE ; [.45D1.0020.0002] # LINEAR A SIGN A414-VAS -106AF ; [.45D2.0020.0002] # LINEAR A SIGN A415-VAS -106B0 ; [.45D3.0020.0002] # LINEAR A SIGN A416-VAS -106B1 ; [.45D4.0020.0002] # LINEAR A SIGN A417-VAS -106B2 ; [.45D5.0020.0002] # LINEAR A SIGN A418-VAS -106B3 ; [.45D6.0020.0002] # LINEAR A SIGN A501 -106B4 ; [.45D7.0020.0002] # LINEAR A SIGN A502 -106B5 ; [.45D8.0020.0002] # LINEAR A SIGN A503 -106B6 ; [.45D9.0020.0002] # LINEAR A SIGN A504 -106B7 ; [.45DA.0020.0002] # LINEAR A SIGN A505 -106B8 ; [.45DB.0020.0002] # LINEAR A SIGN A506 -106B9 ; [.45DC.0020.0002] # LINEAR A SIGN A508 -106BA ; [.45DD.0020.0002] # LINEAR A SIGN A509 -106BB ; [.45DE.0020.0002] # LINEAR A SIGN A510 -106BC ; [.45DF.0020.0002] # LINEAR A SIGN A511 -106BD ; [.45E0.0020.0002] # LINEAR A SIGN A512 -106BE ; [.45E1.0020.0002] # LINEAR A SIGN A513 -106BF ; [.45E2.0020.0002] # LINEAR A SIGN A515 -106C0 ; [.45E3.0020.0002] # LINEAR A SIGN A516 -106C1 ; [.45E4.0020.0002] # LINEAR A SIGN A520 -106C2 ; [.45E5.0020.0002] # LINEAR A SIGN A521 -106C3 ; [.45E6.0020.0002] # LINEAR A SIGN A523 -106C4 ; [.45E7.0020.0002] # LINEAR A SIGN A524 -106C5 ; [.45E8.0020.0002] # LINEAR A SIGN A525 -106C6 ; [.45E9.0020.0002] # LINEAR A SIGN A526 -106C7 ; [.45EA.0020.0002] # LINEAR A SIGN A527 -106C8 ; [.45EB.0020.0002] # LINEAR A SIGN A528 -106C9 ; [.45EC.0020.0002] # LINEAR A SIGN A529 -106CA ; [.45ED.0020.0002] # LINEAR A SIGN A530 -106CB ; [.45EE.0020.0002] # LINEAR A SIGN A531 -106CC ; [.45EF.0020.0002] # LINEAR A SIGN A532 -106CD ; [.45F0.0020.0002] # LINEAR A SIGN A534 -106CE ; [.45F1.0020.0002] # LINEAR A SIGN A535 -106CF ; [.45F2.0020.0002] # LINEAR A SIGN A536 -106D0 ; [.45F3.0020.0002] # LINEAR A SIGN A537 -106D1 ; [.45F4.0020.0002] # LINEAR A SIGN A538 -106D2 ; [.45F5.0020.0002] # LINEAR A SIGN A539 -106D3 ; [.45F6.0020.0002] # LINEAR A SIGN A540 -106D4 ; [.45F7.0020.0002] # LINEAR A SIGN A541 -106D5 ; [.45F8.0020.0002] # LINEAR A SIGN A542 -106D6 ; [.45F9.0020.0002] # LINEAR A SIGN A545 -106D7 ; [.45FA.0020.0002] # LINEAR A SIGN A547 -106D8 ; [.45FB.0020.0002] # LINEAR A SIGN A548 -106D9 ; [.45FC.0020.0002] # LINEAR A SIGN A549 -106DA ; [.45FD.0020.0002] # LINEAR A SIGN A550 -106DB ; [.45FE.0020.0002] # LINEAR A SIGN A551 -106DC ; [.45FF.0020.0002] # LINEAR A SIGN A552 -106DD ; [.4600.0020.0002] # LINEAR A SIGN A553 -106DE ; [.4601.0020.0002] # LINEAR A SIGN A554 -106DF ; [.4602.0020.0002] # LINEAR A SIGN A555 -106E0 ; [.4603.0020.0002] # LINEAR A SIGN A556 -106E1 ; [.4604.0020.0002] # LINEAR A SIGN A557 -106E2 ; [.4605.0020.0002] # LINEAR A SIGN A559 -106E3 ; [.4606.0020.0002] # LINEAR A SIGN A563 -106E4 ; [.4607.0020.0002] # LINEAR A SIGN A564 -106E5 ; [.4608.0020.0002] # LINEAR A SIGN A565 -106E6 ; [.4609.0020.0002] # LINEAR A SIGN A566 -106E7 ; [.460A.0020.0002] # LINEAR A SIGN A568 -106E8 ; [.460B.0020.0002] # LINEAR A SIGN A569 -106E9 ; [.460C.0020.0002] # LINEAR A SIGN A570 -106EA ; [.460D.0020.0002] # LINEAR A SIGN A571 -106EB ; [.460E.0020.0002] # LINEAR A SIGN A572 -106EC ; [.460F.0020.0002] # LINEAR A SIGN A573 -106ED ; [.4610.0020.0002] # LINEAR A SIGN A574 -106EE ; [.4611.0020.0002] # LINEAR A SIGN A575 -106EF ; [.4612.0020.0002] # LINEAR A SIGN A576 -106F0 ; [.4613.0020.0002] # LINEAR A SIGN A577 -106F1 ; [.4614.0020.0002] # LINEAR A SIGN A578 -106F2 ; [.4615.0020.0002] # LINEAR A SIGN A579 -106F3 ; [.4616.0020.0002] # LINEAR A SIGN A580 -106F4 ; [.4617.0020.0002] # LINEAR A SIGN A581 -106F5 ; [.4618.0020.0002] # LINEAR A SIGN A582 -106F6 ; [.4619.0020.0002] # LINEAR A SIGN A583 -106F7 ; [.461A.0020.0002] # LINEAR A SIGN A584 -106F8 ; [.461B.0020.0002] # LINEAR A SIGN A585 -106F9 ; [.461C.0020.0002] # LINEAR A SIGN A586 -106FA ; [.461D.0020.0002] # LINEAR A SIGN A587 -106FB ; [.461E.0020.0002] # LINEAR A SIGN A588 -106FC ; [.461F.0020.0002] # LINEAR A SIGN A589 -106FD ; [.4620.0020.0002] # LINEAR A SIGN A591 -106FE ; [.4621.0020.0002] # LINEAR A SIGN A592 -106FF ; [.4622.0020.0002] # LINEAR A SIGN A594 -10700 ; [.4623.0020.0002] # LINEAR A SIGN A595 -10701 ; [.4624.0020.0002] # LINEAR A SIGN A596 -10702 ; [.4625.0020.0002] # LINEAR A SIGN A598 -10703 ; [.4626.0020.0002] # LINEAR A SIGN A600 -10704 ; [.4627.0020.0002] # LINEAR A SIGN A601 -10705 ; [.4628.0020.0002] # LINEAR A SIGN A602 -10706 ; [.4629.0020.0002] # LINEAR A SIGN A603 -10707 ; [.462A.0020.0002] # LINEAR A SIGN A604 -10708 ; [.462B.0020.0002] # LINEAR A SIGN A606 -10709 ; [.462C.0020.0002] # LINEAR A SIGN A608 -1070A ; [.462D.0020.0002] # LINEAR A SIGN A609 -1070B ; [.462E.0020.0002] # LINEAR A SIGN A610 -1070C ; [.462F.0020.0002] # LINEAR A SIGN A611 -1070D ; [.4630.0020.0002] # LINEAR A SIGN A612 -1070E ; [.4631.0020.0002] # LINEAR A SIGN A613 -1070F ; [.4632.0020.0002] # LINEAR A SIGN A614 -10710 ; [.4633.0020.0002] # LINEAR A SIGN A615 -10711 ; [.4634.0020.0002] # LINEAR A SIGN A616 -10712 ; [.4635.0020.0002] # LINEAR A SIGN A617 -10713 ; [.4636.0020.0002] # LINEAR A SIGN A618 -10714 ; [.4637.0020.0002] # LINEAR A SIGN A619 -10715 ; [.4638.0020.0002] # LINEAR A SIGN A620 -10716 ; [.4639.0020.0002] # LINEAR A SIGN A621 -10717 ; [.463A.0020.0002] # LINEAR A SIGN A622 -10718 ; [.463B.0020.0002] # LINEAR A SIGN A623 -10719 ; [.463C.0020.0002] # LINEAR A SIGN A624 -1071A ; [.463D.0020.0002] # LINEAR A SIGN A626 -1071B ; [.463E.0020.0002] # LINEAR A SIGN A627 -1071C ; [.463F.0020.0002] # LINEAR A SIGN A628 -1071D ; [.4640.0020.0002] # LINEAR A SIGN A629 -1071E ; [.4641.0020.0002] # LINEAR A SIGN A634 -1071F ; [.4642.0020.0002] # LINEAR A SIGN A637 -10720 ; [.4643.0020.0002] # LINEAR A SIGN A638 -10721 ; [.4644.0020.0002] # LINEAR A SIGN A640 -10722 ; [.4645.0020.0002] # LINEAR A SIGN A642 -10723 ; [.4646.0020.0002] # LINEAR A SIGN A643 -10724 ; [.4647.0020.0002] # LINEAR A SIGN A644 -10725 ; [.4648.0020.0002] # LINEAR A SIGN A645 -10726 ; [.4649.0020.0002] # LINEAR A SIGN A646 -10727 ; [.464A.0020.0002] # LINEAR A SIGN A648 -10728 ; [.464B.0020.0002] # LINEAR A SIGN A649 -10729 ; [.464C.0020.0002] # LINEAR A SIGN A651 -1072A ; [.464D.0020.0002] # LINEAR A SIGN A652 -1072B ; [.464E.0020.0002] # LINEAR A SIGN A653 -1072C ; [.464F.0020.0002] # LINEAR A SIGN A654 -1072D ; [.4650.0020.0002] # LINEAR A SIGN A655 -1072E ; [.4651.0020.0002] # LINEAR A SIGN A656 -1072F ; [.4652.0020.0002] # LINEAR A SIGN A657 -10730 ; [.4653.0020.0002] # LINEAR A SIGN A658 -10731 ; [.4654.0020.0002] # LINEAR A SIGN A659 -10732 ; [.4655.0020.0002] # LINEAR A SIGN A660 -10733 ; [.4656.0020.0002] # LINEAR A SIGN A661 -10734 ; [.4657.0020.0002] # LINEAR A SIGN A662 -10735 ; [.4658.0020.0002] # LINEAR A SIGN A663 -10736 ; [.4659.0020.0002] # LINEAR A SIGN A664 -10740 ; [.465A.0020.0002] # LINEAR A SIGN A701 A -10741 ; [.465B.0020.0002] # LINEAR A SIGN A702 B -10742 ; [.465C.0020.0002] # LINEAR A SIGN A703 D -10743 ; [.465D.0020.0002] # LINEAR A SIGN A704 E -10744 ; [.465E.0020.0002] # LINEAR A SIGN A705 F -10745 ; [.465F.0020.0002] # LINEAR A SIGN A706 H -10746 ; [.4660.0020.0002] # LINEAR A SIGN A707 J -10747 ; [.4661.0020.0002] # LINEAR A SIGN A708 K -10748 ; [.4662.0020.0002] # LINEAR A SIGN A709 L -10749 ; [.4663.0020.0002] # LINEAR A SIGN A709-2 L2 -1074A ; [.4664.0020.0002] # LINEAR A SIGN A709-3 L3 -1074B ; [.4665.0020.0002] # LINEAR A SIGN A709-4 L4 -1074C ; [.4666.0020.0002] # LINEAR A SIGN A709-6 L6 -1074D ; [.4667.0020.0002] # LINEAR A SIGN A710 W -1074E ; [.4668.0020.0002] # LINEAR A SIGN A711 X -1074F ; [.4669.0020.0002] # LINEAR A SIGN A712 Y -10750 ; [.466A.0020.0002] # LINEAR A SIGN A713 OMEGA -10751 ; [.466B.0020.0002] # LINEAR A SIGN A714 ABB -10752 ; [.466C.0020.0002] # LINEAR A SIGN A715 BB -10753 ; [.466D.0020.0002] # LINEAR A SIGN A717 DD -10754 ; [.466E.0020.0002] # LINEAR A SIGN A726 EYYY -10755 ; [.466F.0020.0002] # LINEAR A SIGN A732 JE -10760 ; [.4670.0020.0002] # LINEAR A SIGN A800 -10761 ; [.4671.0020.0002] # LINEAR A SIGN A801 -10762 ; [.4672.0020.0002] # LINEAR A SIGN A802 -10763 ; [.4673.0020.0002] # LINEAR A SIGN A803 -10764 ; [.4674.0020.0002] # LINEAR A SIGN A804 -10765 ; [.4675.0020.0002] # LINEAR A SIGN A805 -10766 ; [.4676.0020.0002] # LINEAR A SIGN A806 -10767 ; [.4677.0020.0002] # LINEAR A SIGN A807 -10800 ; [.4678.0020.0002] # CYPRIOT SYLLABLE A -10801 ; [.4679.0020.0002] # CYPRIOT SYLLABLE E -10802 ; [.467A.0020.0002] # CYPRIOT SYLLABLE I -10803 ; [.467B.0020.0002] # CYPRIOT SYLLABLE O -10804 ; [.467C.0020.0002] # CYPRIOT SYLLABLE U -10805 ; [.467D.0020.0002] # CYPRIOT SYLLABLE JA -10808 ; [.467E.0020.0002] # CYPRIOT SYLLABLE JO -1080A ; [.467F.0020.0002] # CYPRIOT SYLLABLE KA -1080B ; [.4680.0020.0002] # CYPRIOT SYLLABLE KE -1080C ; [.4681.0020.0002] # CYPRIOT SYLLABLE KI -1080D ; [.4682.0020.0002] # CYPRIOT SYLLABLE KO -1080E ; [.4683.0020.0002] # CYPRIOT SYLLABLE KU -1080F ; [.4684.0020.0002] # CYPRIOT SYLLABLE LA -10810 ; [.4685.0020.0002] # CYPRIOT SYLLABLE LE -10811 ; [.4686.0020.0002] # CYPRIOT SYLLABLE LI -10812 ; [.4687.0020.0002] # CYPRIOT SYLLABLE LO -10813 ; [.4688.0020.0002] # CYPRIOT SYLLABLE LU -10814 ; [.4689.0020.0002] # CYPRIOT SYLLABLE MA -10815 ; [.468A.0020.0002] # CYPRIOT SYLLABLE ME -10816 ; [.468B.0020.0002] # CYPRIOT SYLLABLE MI -10817 ; [.468C.0020.0002] # CYPRIOT SYLLABLE MO -10818 ; [.468D.0020.0002] # CYPRIOT SYLLABLE MU -10819 ; [.468E.0020.0002] # CYPRIOT SYLLABLE NA -1081A ; [.468F.0020.0002] # CYPRIOT SYLLABLE NE -1081B ; [.4690.0020.0002] # CYPRIOT SYLLABLE NI -1081C ; [.4691.0020.0002] # CYPRIOT SYLLABLE NO -1081D ; [.4692.0020.0002] # CYPRIOT SYLLABLE NU -1081E ; [.4693.0020.0002] # CYPRIOT SYLLABLE PA -1081F ; [.4694.0020.0002] # CYPRIOT SYLLABLE PE -10820 ; [.4695.0020.0002] # CYPRIOT SYLLABLE PI -10821 ; [.4696.0020.0002] # CYPRIOT SYLLABLE PO -10822 ; [.4697.0020.0002] # CYPRIOT SYLLABLE PU -10823 ; [.4698.0020.0002] # CYPRIOT SYLLABLE RA -10824 ; [.4699.0020.0002] # CYPRIOT SYLLABLE RE -10825 ; [.469A.0020.0002] # CYPRIOT SYLLABLE RI -10826 ; [.469B.0020.0002] # CYPRIOT SYLLABLE RO -10827 ; [.469C.0020.0002] # CYPRIOT SYLLABLE RU -10828 ; [.469D.0020.0002] # CYPRIOT SYLLABLE SA -10829 ; [.469E.0020.0002] # CYPRIOT SYLLABLE SE -1082A ; [.469F.0020.0002] # CYPRIOT SYLLABLE SI -1082B ; [.46A0.0020.0002] # CYPRIOT SYLLABLE SO -1082C ; [.46A1.0020.0002] # CYPRIOT SYLLABLE SU -1082D ; [.46A2.0020.0002] # CYPRIOT SYLLABLE TA -1082E ; [.46A3.0020.0002] # CYPRIOT SYLLABLE TE -1082F ; [.46A4.0020.0002] # CYPRIOT SYLLABLE TI -10830 ; [.46A5.0020.0002] # CYPRIOT SYLLABLE TO -10831 ; [.46A6.0020.0002] # CYPRIOT SYLLABLE TU -10832 ; [.46A7.0020.0002] # CYPRIOT SYLLABLE WA -10833 ; [.46A8.0020.0002] # CYPRIOT SYLLABLE WE -10834 ; [.46A9.0020.0002] # CYPRIOT SYLLABLE WI -10835 ; [.46AA.0020.0002] # CYPRIOT SYLLABLE WO -10837 ; [.46AB.0020.0002] # CYPRIOT SYLLABLE XA -10838 ; [.46AC.0020.0002] # CYPRIOT SYLLABLE XE -1083C ; [.46AD.0020.0002] # CYPRIOT SYLLABLE ZA -1083F ; [.46AE.0020.0002] # CYPRIOT SYLLABLE ZO -10A60 ; [.46AF.0020.0002] # OLD SOUTH ARABIAN LETTER HE -10A61 ; [.46B0.0020.0002] # OLD SOUTH ARABIAN LETTER LAMEDH -10A62 ; [.46B1.0020.0002] # OLD SOUTH ARABIAN LETTER HETH -10A63 ; [.46B2.0020.0002] # OLD SOUTH ARABIAN LETTER MEM -10A64 ; [.46B3.0020.0002] # OLD SOUTH ARABIAN LETTER QOPH -10A65 ; [.46B4.0020.0002] # OLD SOUTH ARABIAN LETTER WAW -10A66 ; [.46B5.0020.0002] # OLD SOUTH ARABIAN LETTER SHIN -10A67 ; [.46B6.0020.0002] # OLD SOUTH ARABIAN LETTER RESH -10A68 ; [.46B7.0020.0002] # OLD SOUTH ARABIAN LETTER BETH -10A69 ; [.46B8.0020.0002] # OLD SOUTH ARABIAN LETTER TAW -10A6A ; [.46B9.0020.0002] # OLD SOUTH ARABIAN LETTER SAT -10A6B ; [.46BA.0020.0002] # OLD SOUTH ARABIAN LETTER KAPH -10A6C ; [.46BB.0020.0002] # OLD SOUTH ARABIAN LETTER NUN -10A6D ; [.46BC.0020.0002] # OLD SOUTH ARABIAN LETTER KHETH -10A6E ; [.46BD.0020.0002] # OLD SOUTH ARABIAN LETTER SADHE -10A6F ; [.46BE.0020.0002] # OLD SOUTH ARABIAN LETTER SAMEKH -10A70 ; [.46BF.0020.0002] # OLD SOUTH ARABIAN LETTER FE -10A71 ; [.46C0.0020.0002] # OLD SOUTH ARABIAN LETTER ALEF -10A72 ; [.46C1.0020.0002] # OLD SOUTH ARABIAN LETTER AYN -10A73 ; [.46C2.0020.0002] # OLD SOUTH ARABIAN LETTER DHADHE -10A74 ; [.46C3.0020.0002] # OLD SOUTH ARABIAN LETTER GIMEL -10A75 ; [.46C4.0020.0002] # OLD SOUTH ARABIAN LETTER DALETH -10A76 ; [.46C5.0020.0002] # OLD SOUTH ARABIAN LETTER GHAYN -10A77 ; [.46C6.0020.0002] # OLD SOUTH ARABIAN LETTER TETH -10A78 ; [.46C7.0020.0002] # OLD SOUTH ARABIAN LETTER ZAYN -10A79 ; [.46C8.0020.0002] # OLD SOUTH ARABIAN LETTER DHALETH -10A7A ; [.46C9.0020.0002] # OLD SOUTH ARABIAN LETTER YODH -10A7B ; [.46CA.0020.0002] # OLD SOUTH ARABIAN LETTER THAW -10A7C ; [.46CB.0020.0002] # OLD SOUTH ARABIAN LETTER THETH -10A80 ; [.46CC.0020.0002] # OLD NORTH ARABIAN LETTER HEH -10A81 ; [.46CD.0020.0002] # OLD NORTH ARABIAN LETTER LAM -10A82 ; [.46CE.0020.0002] # OLD NORTH ARABIAN LETTER HAH -10A83 ; [.46CF.0020.0002] # OLD NORTH ARABIAN LETTER MEEM -10A84 ; [.46D0.0020.0002] # OLD NORTH ARABIAN LETTER QAF -10A85 ; [.46D1.0020.0002] # OLD NORTH ARABIAN LETTER WAW -10A86 ; [.46D2.0020.0002] # OLD NORTH ARABIAN LETTER ES-2 -10A87 ; [.46D3.0020.0002] # OLD NORTH ARABIAN LETTER REH -10A88 ; [.46D4.0020.0002] # OLD NORTH ARABIAN LETTER BEH -10A89 ; [.46D5.0020.0002] # OLD NORTH ARABIAN LETTER TEH -10A8A ; [.46D6.0020.0002] # OLD NORTH ARABIAN LETTER ES-1 -10A8B ; [.46D7.0020.0002] # OLD NORTH ARABIAN LETTER KAF -10A8C ; [.46D8.0020.0002] # OLD NORTH ARABIAN LETTER NOON -10A8D ; [.46D9.0020.0002] # OLD NORTH ARABIAN LETTER KHAH -10A8E ; [.46DA.0020.0002] # OLD NORTH ARABIAN LETTER SAD -10A8F ; [.46DB.0020.0002] # OLD NORTH ARABIAN LETTER ES-3 -10A90 ; [.46DC.0020.0002] # OLD NORTH ARABIAN LETTER FEH -10A91 ; [.46DD.0020.0002] # OLD NORTH ARABIAN LETTER ALEF -10A92 ; [.46DE.0020.0002] # OLD NORTH ARABIAN LETTER AIN -10A93 ; [.46DF.0020.0002] # OLD NORTH ARABIAN LETTER DAD -10A94 ; [.46E0.0020.0002] # OLD NORTH ARABIAN LETTER GEEM -10A95 ; [.46E1.0020.0002] # OLD NORTH ARABIAN LETTER DAL -10A96 ; [.46E2.0020.0002] # OLD NORTH ARABIAN LETTER GHAIN -10A97 ; [.46E3.0020.0002] # OLD NORTH ARABIAN LETTER TAH -10A98 ; [.46E4.0020.0002] # OLD NORTH ARABIAN LETTER ZAIN -10A99 ; [.46E5.0020.0002] # OLD NORTH ARABIAN LETTER THAL -10A9A ; [.46E6.0020.0002] # OLD NORTH ARABIAN LETTER YEH -10A9B ; [.46E7.0020.0002] # OLD NORTH ARABIAN LETTER THEH -10A9C ; [.46E8.0020.0002] # OLD NORTH ARABIAN LETTER ZAH -10B00 ; [.46E9.0020.0002] # AVESTAN LETTER A -10B01 ; [.46EA.0020.0002] # AVESTAN LETTER AA -10B02 ; [.46EB.0020.0002] # AVESTAN LETTER AO -10B03 ; [.46EC.0020.0002] # AVESTAN LETTER AAO -10B04 ; [.46ED.0020.0002] # AVESTAN LETTER AN -10B05 ; [.46EE.0020.0002] # AVESTAN LETTER AAN -10B06 ; [.46EF.0020.0002] # AVESTAN LETTER AE -10B07 ; [.46F0.0020.0002] # AVESTAN LETTER AEE -10B08 ; [.46F1.0020.0002] # AVESTAN LETTER E -10B09 ; [.46F2.0020.0002] # AVESTAN LETTER EE -10B0A ; [.46F3.0020.0002] # AVESTAN LETTER O -10B0B ; [.46F4.0020.0002] # AVESTAN LETTER OO -10B0C ; [.46F5.0020.0002] # AVESTAN LETTER I -10B0D ; [.46F6.0020.0002] # AVESTAN LETTER II -10B0E ; [.46F7.0020.0002] # AVESTAN LETTER U -10B0F ; [.46F8.0020.0002] # AVESTAN LETTER UU -10B10 ; [.46F9.0020.0002] # AVESTAN LETTER KE -10B11 ; [.46FA.0020.0002] # AVESTAN LETTER XE -10B12 ; [.46FB.0020.0002] # AVESTAN LETTER XYE -10B13 ; [.46FC.0020.0002] # AVESTAN LETTER XVE -10B14 ; [.46FD.0020.0002] # AVESTAN LETTER GE -10B15 ; [.46FE.0020.0002] # AVESTAN LETTER GGE -10B16 ; [.46FF.0020.0002] # AVESTAN LETTER GHE -10B17 ; [.4700.0020.0002] # AVESTAN LETTER CE -10B18 ; [.4701.0020.0002] # AVESTAN LETTER JE -10B19 ; [.4702.0020.0002] # AVESTAN LETTER TE -10B1A ; [.4703.0020.0002] # AVESTAN LETTER THE -10B1B ; [.4704.0020.0002] # AVESTAN LETTER DE -10B1C ; [.4705.0020.0002] # AVESTAN LETTER DHE -10B1D ; [.4706.0020.0002] # AVESTAN LETTER TTE -10B1E ; [.4707.0020.0002] # AVESTAN LETTER PE -10B1F ; [.4708.0020.0002] # AVESTAN LETTER FE -10B20 ; [.4709.0020.0002] # AVESTAN LETTER BE -10B21 ; [.470A.0020.0002] # AVESTAN LETTER BHE -10B22 ; [.470B.0020.0002] # AVESTAN LETTER NGE -10B23 ; [.470C.0020.0002] # AVESTAN LETTER NGYE -10B24 ; [.470D.0020.0002] # AVESTAN LETTER NGVE -10B25 ; [.470E.0020.0002] # AVESTAN LETTER NE -10B26 ; [.470F.0020.0002] # AVESTAN LETTER NYE -10B27 ; [.4710.0020.0002] # AVESTAN LETTER NNE -10B28 ; [.4711.0020.0002] # AVESTAN LETTER ME -10B29 ; [.4712.0020.0002] # AVESTAN LETTER HME -10B2A ; [.4713.0020.0002] # AVESTAN LETTER YYE -10B2B ; [.4714.0020.0002] # AVESTAN LETTER YE -10B2C ; [.4715.0020.0002] # AVESTAN LETTER VE -10B2D ; [.4716.0020.0002] # AVESTAN LETTER RE -10B2E ; [.4716.0020.0004][.0000.010B.0004] # AVESTAN LETTER LE -10B2F ; [.4717.0020.0002] # AVESTAN LETTER SE -10B30 ; [.4718.0020.0002] # AVESTAN LETTER ZE -10B31 ; [.4719.0020.0002] # AVESTAN LETTER SHE -10B32 ; [.471A.0020.0002] # AVESTAN LETTER ZHE -10B33 ; [.471B.0020.0002] # AVESTAN LETTER SHYE -10B34 ; [.471C.0020.0002] # AVESTAN LETTER SSHE -10B35 ; [.471D.0020.0002] # AVESTAN LETTER HE -10860 ; [.471E.0020.0002] # PALMYRENE LETTER ALEPH -10861 ; [.471F.0020.0002] # PALMYRENE LETTER BETH -10862 ; [.4720.0020.0002] # PALMYRENE LETTER GIMEL -10863 ; [.4721.0020.0002] # PALMYRENE LETTER DALETH -10864 ; [.4722.0020.0002] # PALMYRENE LETTER HE -10865 ; [.4723.0020.0002] # PALMYRENE LETTER WAW -10866 ; [.4724.0020.0002] # PALMYRENE LETTER ZAYIN -10867 ; [.4725.0020.0002] # PALMYRENE LETTER HETH -10868 ; [.4726.0020.0002] # PALMYRENE LETTER TETH -10869 ; [.4727.0020.0002] # PALMYRENE LETTER YODH -1086A ; [.4728.0020.0002] # PALMYRENE LETTER KAPH -1086B ; [.4729.0020.0002] # PALMYRENE LETTER LAMEDH -1086C ; [.472A.0020.0002] # PALMYRENE LETTER MEM -1086E ; [.472B.0020.0002] # PALMYRENE LETTER NUN -1086D ; [.472B.0020.0019] # PALMYRENE LETTER FINAL NUN -1086F ; [.472C.0020.0002] # PALMYRENE LETTER SAMEKH -10870 ; [.472D.0020.0002] # PALMYRENE LETTER AYIN -10871 ; [.472E.0020.0002] # PALMYRENE LETTER PE -10872 ; [.472F.0020.0002] # PALMYRENE LETTER SADHE -10873 ; [.4730.0020.0002] # PALMYRENE LETTER QOPH -10874 ; [.4731.0020.0002] # PALMYRENE LETTER RESH -10875 ; [.4732.0020.0002] # PALMYRENE LETTER SHIN -10876 ; [.4733.0020.0002] # PALMYRENE LETTER TAW -10881 ; [.4734.0020.0002] # NABATAEAN LETTER ALEPH -10880 ; [.4734.0020.0019] # NABATAEAN LETTER FINAL ALEPH -10883 ; [.4735.0020.0002] # NABATAEAN LETTER BETH -10882 ; [.4735.0020.0019] # NABATAEAN LETTER FINAL BETH -10884 ; [.4736.0020.0002] # NABATAEAN LETTER GIMEL -10885 ; [.4737.0020.0002] # NABATAEAN LETTER DALETH -10887 ; [.4738.0020.0002] # NABATAEAN LETTER HE -10886 ; [.4738.0020.0019] # NABATAEAN LETTER FINAL HE -10888 ; [.4739.0020.0002] # NABATAEAN LETTER WAW -10889 ; [.473A.0020.0002] # NABATAEAN LETTER ZAYIN -1088A ; [.473B.0020.0002] # NABATAEAN LETTER HETH -1088B ; [.473C.0020.0002] # NABATAEAN LETTER TETH -1088D ; [.473D.0020.0002] # NABATAEAN LETTER YODH -1088C ; [.473D.0020.0019] # NABATAEAN LETTER FINAL YODH -1088F ; [.473E.0020.0002] # NABATAEAN LETTER KAPH -1088E ; [.473E.0020.0019] # NABATAEAN LETTER FINAL KAPH -10891 ; [.473F.0020.0002] # NABATAEAN LETTER LAMEDH -10890 ; [.473F.0020.0019] # NABATAEAN LETTER FINAL LAMEDH -10893 ; [.4740.0020.0002] # NABATAEAN LETTER MEM -10892 ; [.4740.0020.0019] # NABATAEAN LETTER FINAL MEM -10895 ; [.4741.0020.0002] # NABATAEAN LETTER NUN -10894 ; [.4741.0020.0019] # NABATAEAN LETTER FINAL NUN -10896 ; [.4742.0020.0002] # NABATAEAN LETTER SAMEKH -10897 ; [.4743.0020.0002] # NABATAEAN LETTER AYIN -10898 ; [.4744.0020.0002] # NABATAEAN LETTER PE -10899 ; [.4745.0020.0002] # NABATAEAN LETTER SADHE -1089A ; [.4746.0020.0002] # NABATAEAN LETTER QOPH -1089B ; [.4747.0020.0002] # NABATAEAN LETTER RESH -1089D ; [.4748.0020.0002] # NABATAEAN LETTER SHIN -1089C ; [.4748.0020.0019] # NABATAEAN LETTER FINAL SHIN -1089E ; [.4749.0020.0002] # NABATAEAN LETTER TAW -108E0 ; [.474A.0020.0002] # HATRAN LETTER ALEPH -108E1 ; [.474B.0020.0002] # HATRAN LETTER BETH -108E2 ; [.474C.0020.0002] # HATRAN LETTER GIMEL -108E3 ; [.474D.0020.0002] # HATRAN LETTER DALETH-RESH -108E4 ; [.474E.0020.0002] # HATRAN LETTER HE -108E5 ; [.474F.0020.0002] # HATRAN LETTER WAW -108E6 ; [.4750.0020.0002] # HATRAN LETTER ZAYN -108E7 ; [.4751.0020.0002] # HATRAN LETTER HETH -108E8 ; [.4752.0020.0002] # HATRAN LETTER TETH -108E9 ; [.4753.0020.0002] # HATRAN LETTER YODH -108EA ; [.4754.0020.0002] # HATRAN LETTER KAPH -108EB ; [.4755.0020.0002] # HATRAN LETTER LAMEDH -108EC ; [.4756.0020.0002] # HATRAN LETTER MEM -108ED ; [.4757.0020.0002] # HATRAN LETTER NUN -108EE ; [.4758.0020.0002] # HATRAN LETTER SAMEKH -108EF ; [.4759.0020.0002] # HATRAN LETTER AYN -108F0 ; [.475A.0020.0002] # HATRAN LETTER PE -108F1 ; [.475B.0020.0002] # HATRAN LETTER SADHE -108F2 ; [.475C.0020.0002] # HATRAN LETTER QOPH -108F4 ; [.475D.0020.0002] # HATRAN LETTER SHIN -108F5 ; [.475E.0020.0002] # HATRAN LETTER TAW -10840 ; [.475F.0020.0002] # IMPERIAL ARAMAIC LETTER ALEPH -10841 ; [.4760.0020.0002] # IMPERIAL ARAMAIC LETTER BETH -10842 ; [.4761.0020.0002] # IMPERIAL ARAMAIC LETTER GIMEL -10843 ; [.4762.0020.0002] # IMPERIAL ARAMAIC LETTER DALETH -10844 ; [.4763.0020.0002] # IMPERIAL ARAMAIC LETTER HE -10845 ; [.4764.0020.0002] # IMPERIAL ARAMAIC LETTER WAW -10846 ; [.4765.0020.0002] # IMPERIAL ARAMAIC LETTER ZAYIN -10847 ; [.4766.0020.0002] # IMPERIAL ARAMAIC LETTER HETH -10848 ; [.4767.0020.0002] # IMPERIAL ARAMAIC LETTER TETH -10849 ; [.4768.0020.0002] # IMPERIAL ARAMAIC LETTER YODH -1084A ; [.4769.0020.0002] # IMPERIAL ARAMAIC LETTER KAPH -1084B ; [.476A.0020.0002] # IMPERIAL ARAMAIC LETTER LAMEDH -1084C ; [.476B.0020.0002] # IMPERIAL ARAMAIC LETTER MEM -1084D ; [.476C.0020.0002] # IMPERIAL ARAMAIC LETTER NUN -1084E ; [.476D.0020.0002] # IMPERIAL ARAMAIC LETTER SAMEKH -1084F ; [.476E.0020.0002] # IMPERIAL ARAMAIC LETTER AYIN -10850 ; [.476F.0020.0002] # IMPERIAL ARAMAIC LETTER PE -10851 ; [.4770.0020.0002] # IMPERIAL ARAMAIC LETTER SADHE -10852 ; [.4771.0020.0002] # IMPERIAL ARAMAIC LETTER QOPH -10853 ; [.4772.0020.0002] # IMPERIAL ARAMAIC LETTER RESH -10854 ; [.4773.0020.0002] # IMPERIAL ARAMAIC LETTER SHIN -10855 ; [.4774.0020.0002] # IMPERIAL ARAMAIC LETTER TAW -10B40 ; [.4775.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ALEPH -10B41 ; [.4776.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER BETH -10B42 ; [.4777.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER GIMEL -10B43 ; [.4778.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER DALETH -10B44 ; [.4779.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HE -10B45 ; [.477A.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER WAW -10B46 ; [.477B.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ZAYIN -10B47 ; [.477C.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HETH -10B48 ; [.477D.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TETH -10B49 ; [.477E.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER YODH -10B4A ; [.477F.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER KAPH -10B4B ; [.4780.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER LAMEDH -10B4C ; [.4781.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER MEM -10B4D ; [.4782.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER NUN -10B4E ; [.4783.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SAMEKH -10B4F ; [.4784.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER AYIN -10B50 ; [.4785.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER PE -10B51 ; [.4786.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SADHE -10B52 ; [.4787.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER QOPH -10B53 ; [.4788.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER RESH -10B54 ; [.4789.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SHIN -10B55 ; [.478A.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TAW -10B60 ; [.478B.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ALEPH -10B61 ; [.478C.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER BETH -10B62 ; [.478D.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER GIMEL -10B63 ; [.478E.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER DALETH -10B64 ; [.478F.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HE -10B65 ; [.4790.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH -10B66 ; [.4791.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ZAYIN -10B67 ; [.4792.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HETH -10B68 ; [.4793.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TETH -10B69 ; [.4794.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER YODH -10B6A ; [.4795.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER KAPH -10B6B ; [.4796.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER LAMEDH -10B6C ; [.4797.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH -10B6D ; [.4798.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER NUN -10B6E ; [.4799.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SAMEKH -10B6F ; [.479A.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER PE -10B70 ; [.479B.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SADHE -10B71 ; [.479C.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SHIN -10B72 ; [.479D.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TAW -10B80 ; [.479E.0020.0002] # PSALTER PAHLAVI LETTER ALEPH -10B81 ; [.479F.0020.0002] # PSALTER PAHLAVI LETTER BETH -10B82 ; [.47A0.0020.0002] # PSALTER PAHLAVI LETTER GIMEL -10B83 ; [.47A1.0020.0002] # PSALTER PAHLAVI LETTER DALETH -10B84 ; [.47A2.0020.0002] # PSALTER PAHLAVI LETTER HE -10B85 ; [.47A3.0020.0002] # PSALTER PAHLAVI LETTER WAW-AYIN-RESH -10B86 ; [.47A4.0020.0002] # PSALTER PAHLAVI LETTER ZAYIN -10B87 ; [.47A5.0020.0002] # PSALTER PAHLAVI LETTER HETH -10B88 ; [.47A6.0020.0002] # PSALTER PAHLAVI LETTER YODH -10B89 ; [.47A7.0020.0002] # PSALTER PAHLAVI LETTER KAPH -10B8A ; [.47A8.0020.0002] # PSALTER PAHLAVI LETTER LAMEDH -10B8B ; [.47A9.0020.0002] # PSALTER PAHLAVI LETTER MEM-QOPH -10B8C ; [.47AA.0020.0002] # PSALTER PAHLAVI LETTER NUN -10B8D ; [.47AB.0020.0002] # PSALTER PAHLAVI LETTER SAMEKH -10B8E ; [.47AC.0020.0002] # PSALTER PAHLAVI LETTER PE -10B8F ; [.47AD.0020.0002] # PSALTER PAHLAVI LETTER SADHE -10B90 ; [.47AE.0020.0002] # PSALTER PAHLAVI LETTER SHIN -10B91 ; [.47AF.0020.0002] # PSALTER PAHLAVI LETTER TAW -10AC0 ; [.47B0.0020.0002] # MANICHAEAN LETTER ALEPH -10AC1 ; [.47B1.0020.0002] # MANICHAEAN LETTER BETH -10AC2 ; [.47B2.0020.0002] # MANICHAEAN LETTER BHETH -10AC3 ; [.47B3.0020.0002] # MANICHAEAN LETTER GIMEL -10AC4 ; [.47B4.0020.0002] # MANICHAEAN LETTER GHIMEL -10AC5 ; [.47B5.0020.0002] # MANICHAEAN LETTER DALETH -10AC6 ; [.47B6.0020.0002] # MANICHAEAN LETTER HE -10AC7 ; [.47B7.0020.0002] # MANICHAEAN LETTER WAW -10AC8 ; [.47B7.0020.0004][.0000.010C.0004] # MANICHAEAN SIGN UD -10AC9 ; [.47B8.0020.0002] # MANICHAEAN LETTER ZAYIN -10ACA ; [.47B9.0020.0002] # MANICHAEAN LETTER ZHAYIN -10ACB ; [.47BA.0020.0002] # MANICHAEAN LETTER JAYIN -10ACC ; [.47BB.0020.0002] # MANICHAEAN LETTER JHAYIN -10ACD ; [.47BC.0020.0002] # MANICHAEAN LETTER HETH -10ACE ; [.47BD.0020.0002] # MANICHAEAN LETTER TETH -10ACF ; [.47BE.0020.0002] # MANICHAEAN LETTER YODH -10AD0 ; [.47BF.0020.0002] # MANICHAEAN LETTER KAPH -10AD1 ; [.47C0.0020.0002] # MANICHAEAN LETTER XAPH -10AD2 ; [.47C1.0020.0002] # MANICHAEAN LETTER KHAPH -10AD3 ; [.47C2.0020.0002] # MANICHAEAN LETTER LAMEDH -10AD4 ; [.47C3.0020.0002] # MANICHAEAN LETTER DHAMEDH -10AD5 ; [.47C4.0020.0002] # MANICHAEAN LETTER THAMEDH -10AD6 ; [.47C5.0020.0002] # MANICHAEAN LETTER MEM -10AD7 ; [.47C6.0020.0002] # MANICHAEAN LETTER NUN -10AD8 ; [.47C7.0020.0002] # MANICHAEAN LETTER SAMEKH -10AD9 ; [.47C8.0020.0002] # MANICHAEAN LETTER AYIN -10ADA ; [.47C9.0020.0002] # MANICHAEAN LETTER AAYIN -10ADB ; [.47CA.0020.0002] # MANICHAEAN LETTER PE -10ADC ; [.47CB.0020.0002] # MANICHAEAN LETTER FE -10ADD ; [.47CC.0020.0002] # MANICHAEAN LETTER SADHE -10ADE ; [.47CD.0020.0002] # MANICHAEAN LETTER QOPH -10ADF ; [.47CE.0020.0002] # MANICHAEAN LETTER XOPH -10AE0 ; [.47CF.0020.0002] # MANICHAEAN LETTER QHOPH -10AE1 ; [.47D0.0020.0002] # MANICHAEAN LETTER RESH -10AE2 ; [.47D1.0020.0002] # MANICHAEAN LETTER SHIN -10AE3 ; [.47D2.0020.0002] # MANICHAEAN LETTER SSHIN -10AE4 ; [.47D3.0020.0002] # MANICHAEAN LETTER TAW -10380 ; [.47D4.0020.0002] # UGARITIC LETTER ALPA -10381 ; [.47D5.0020.0002] # UGARITIC LETTER BETA -10382 ; [.47D6.0020.0002] # UGARITIC LETTER GAMLA -10383 ; [.47D7.0020.0002] # UGARITIC LETTER KHA -10384 ; [.47D8.0020.0002] # UGARITIC LETTER DELTA -10385 ; [.47D9.0020.0002] # UGARITIC LETTER HO -10386 ; [.47DA.0020.0002] # UGARITIC LETTER WO -10387 ; [.47DB.0020.0002] # UGARITIC LETTER ZETA -10388 ; [.47DC.0020.0002] # UGARITIC LETTER HOTA -10389 ; [.47DD.0020.0002] # UGARITIC LETTER TET -1038A ; [.47DE.0020.0002] # UGARITIC LETTER YOD -1038B ; [.47DF.0020.0002] # UGARITIC LETTER KAF -1038C ; [.47E0.0020.0002] # UGARITIC LETTER SHIN -1038D ; [.47E1.0020.0002] # UGARITIC LETTER LAMDA -1038E ; [.47E2.0020.0002] # UGARITIC LETTER MEM -1038F ; [.47E3.0020.0002] # UGARITIC LETTER DHAL -10390 ; [.47E4.0020.0002] # UGARITIC LETTER NUN -10391 ; [.47E5.0020.0002] # UGARITIC LETTER ZU -10392 ; [.47E6.0020.0002] # UGARITIC LETTER SAMKA -10393 ; [.47E7.0020.0002] # UGARITIC LETTER AIN -10394 ; [.47E8.0020.0002] # UGARITIC LETTER PU -10395 ; [.47E9.0020.0002] # UGARITIC LETTER SADE -10396 ; [.47EA.0020.0002] # UGARITIC LETTER QOPA -10397 ; [.47EB.0020.0002] # UGARITIC LETTER RASHA -10398 ; [.47EC.0020.0002] # UGARITIC LETTER THANNA -10399 ; [.47ED.0020.0002] # UGARITIC LETTER GHAIN -1039A ; [.47EE.0020.0002] # UGARITIC LETTER TO -1039B ; [.47EF.0020.0002] # UGARITIC LETTER I -1039C ; [.47F0.0020.0002] # UGARITIC LETTER U -1039D ; [.47F1.0020.0002] # UGARITIC LETTER SSU -103A0 ; [.47F2.0020.0002] # OLD PERSIAN SIGN A -103A1 ; [.47F3.0020.0002] # OLD PERSIAN SIGN I -103A2 ; [.47F4.0020.0002] # OLD PERSIAN SIGN U -103A3 ; [.47F5.0020.0002] # OLD PERSIAN SIGN KA -103A4 ; [.47F6.0020.0002] # OLD PERSIAN SIGN KU -103A5 ; [.47F7.0020.0002] # OLD PERSIAN SIGN GA -103A6 ; [.47F8.0020.0002] # OLD PERSIAN SIGN GU -103A7 ; [.47F9.0020.0002] # OLD PERSIAN SIGN XA -103A8 ; [.47FA.0020.0002] # OLD PERSIAN SIGN CA -103A9 ; [.47FB.0020.0002] # OLD PERSIAN SIGN JA -103AA ; [.47FC.0020.0002] # OLD PERSIAN SIGN JI -103AB ; [.47FD.0020.0002] # OLD PERSIAN SIGN TA -103AC ; [.47FE.0020.0002] # OLD PERSIAN SIGN TU -103AD ; [.47FF.0020.0002] # OLD PERSIAN SIGN DA -103AE ; [.4800.0020.0002] # OLD PERSIAN SIGN DI -103AF ; [.4801.0020.0002] # OLD PERSIAN SIGN DU -103B0 ; [.4802.0020.0002] # OLD PERSIAN SIGN THA -103B1 ; [.4803.0020.0002] # OLD PERSIAN SIGN PA -103B2 ; [.4804.0020.0002] # OLD PERSIAN SIGN BA -103B3 ; [.4805.0020.0002] # OLD PERSIAN SIGN FA -103B4 ; [.4806.0020.0002] # OLD PERSIAN SIGN NA -103B5 ; [.4807.0020.0002] # OLD PERSIAN SIGN NU -103B6 ; [.4808.0020.0002] # OLD PERSIAN SIGN MA -103B7 ; [.4809.0020.0002] # OLD PERSIAN SIGN MI -103B8 ; [.480A.0020.0002] # OLD PERSIAN SIGN MU -103B9 ; [.480B.0020.0002] # OLD PERSIAN SIGN YA -103BA ; [.480C.0020.0002] # OLD PERSIAN SIGN VA -103BB ; [.480D.0020.0002] # OLD PERSIAN SIGN VI -103BC ; [.480E.0020.0002] # OLD PERSIAN SIGN RA -103BD ; [.480F.0020.0002] # OLD PERSIAN SIGN RU -103BE ; [.4810.0020.0002] # OLD PERSIAN SIGN LA -103BF ; [.4811.0020.0002] # OLD PERSIAN SIGN SA -103C0 ; [.4812.0020.0002] # OLD PERSIAN SIGN ZA -103C1 ; [.4813.0020.0002] # OLD PERSIAN SIGN SHA -103C2 ; [.4814.0020.0002] # OLD PERSIAN SIGN SSA -103C3 ; [.4815.0020.0002] # OLD PERSIAN SIGN HA -103C8 ; [.4816.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA -103C9 ; [.4817.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA-2 -103CA ; [.4818.0020.0002] # OLD PERSIAN SIGN AURAMAZDAAHA -103CB ; [.4819.0020.0002] # OLD PERSIAN SIGN XSHAAYATHIYA -103CC ; [.481A.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH -103CD ; [.481B.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH-2 -103CE ; [.481C.0020.0002] # OLD PERSIAN SIGN BAGA -103CF ; [.481D.0020.0002] # OLD PERSIAN SIGN BUUMISH -12000 ; [.481E.0020.0002] # CUNEIFORM SIGN A -12001 ; [.481F.0020.0002] # CUNEIFORM SIGN A TIMES A -12002 ; [.4820.0020.0002] # CUNEIFORM SIGN A TIMES BAD -12003 ; [.4821.0020.0002] # CUNEIFORM SIGN A TIMES GAN2 TENU -12004 ; [.4822.0020.0002] # CUNEIFORM SIGN A TIMES HA -12005 ; [.4823.0020.0002] # CUNEIFORM SIGN A TIMES IGI -12006 ; [.4824.0020.0002] # CUNEIFORM SIGN A TIMES LAGAR GUNU -12007 ; [.4825.0020.0002] # CUNEIFORM SIGN A TIMES MUSH -12008 ; [.4826.0020.0002] # CUNEIFORM SIGN A TIMES SAG -12009 ; [.4827.0020.0002] # CUNEIFORM SIGN A2 -1200A ; [.4828.0020.0002] # CUNEIFORM SIGN AB -1200B ; [.4829.0020.0002] # CUNEIFORM SIGN AB TIMES ASH2 -1200C ; [.482A.0020.0002] # CUNEIFORM SIGN AB TIMES DUN3 GUNU -1200D ; [.482B.0020.0002] # CUNEIFORM SIGN AB TIMES GAL -1200E ; [.482C.0020.0002] # CUNEIFORM SIGN AB TIMES GAN2 TENU -1200F ; [.482D.0020.0002] # CUNEIFORM SIGN AB TIMES HA -12010 ; [.482E.0020.0002] # CUNEIFORM SIGN AB TIMES IGI GUNU -12011 ; [.482F.0020.0002] # CUNEIFORM SIGN AB TIMES IMIN -12012 ; [.4830.0020.0002] # CUNEIFORM SIGN AB TIMES LAGAB -12013 ; [.4831.0020.0002] # CUNEIFORM SIGN AB TIMES SHESH -12014 ; [.4832.0020.0002] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U -12015 ; [.4833.0020.0002] # CUNEIFORM SIGN AB GUNU -12016 ; [.4834.0020.0002] # CUNEIFORM SIGN AB2 -12017 ; [.4835.0020.0002] # CUNEIFORM SIGN AB2 TIMES BALAG -12018 ; [.4836.0020.0002] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU -12019 ; [.4837.0020.0002] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN -1201A ; [.4838.0020.0002] # CUNEIFORM SIGN AB2 TIMES SHA3 -1201B ; [.4839.0020.0002] # CUNEIFORM SIGN AB2 TIMES TAK4 -1201C ; [.483A.0020.0002] # CUNEIFORM SIGN AD -1201D ; [.483B.0020.0002] # CUNEIFORM SIGN AK -1201E ; [.483C.0020.0002] # CUNEIFORM SIGN AK TIMES ERIN2 -1201F ; [.483D.0020.0002] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH -12020 ; [.483E.0020.0002] # CUNEIFORM SIGN AL -12021 ; [.483F.0020.0002] # CUNEIFORM SIGN AL TIMES AL -12022 ; [.4840.0020.0002] # CUNEIFORM SIGN AL TIMES DIM2 -12023 ; [.4841.0020.0002] # CUNEIFORM SIGN AL TIMES GISH -12024 ; [.4842.0020.0002] # CUNEIFORM SIGN AL TIMES HA -12025 ; [.4843.0020.0002] # CUNEIFORM SIGN AL TIMES KAD3 -12026 ; [.4844.0020.0002] # CUNEIFORM SIGN AL TIMES KI -12027 ; [.4845.0020.0002] # CUNEIFORM SIGN AL TIMES SHE -12028 ; [.4846.0020.0002] # CUNEIFORM SIGN AL TIMES USH -12029 ; [.4847.0020.0002] # CUNEIFORM SIGN ALAN -1202A ; [.4848.0020.0002] # CUNEIFORM SIGN ALEPH -1202B ; [.4849.0020.0002] # CUNEIFORM SIGN AMAR -1202C ; [.484A.0020.0002] # CUNEIFORM SIGN AMAR TIMES SHE -1202D ; [.484B.0020.0002] # CUNEIFORM SIGN AN -1202E ; [.484C.0020.0002] # CUNEIFORM SIGN AN OVER AN -1202F ; [.484D.0020.0002] # CUNEIFORM SIGN AN THREE TIMES -12030 ; [.484E.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA -12031 ; [.484F.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA SQUARED -12032 ; [.4850.0020.0002] # CUNEIFORM SIGN ANSHE -12033 ; [.4851.0020.0002] # CUNEIFORM SIGN APIN -12034 ; [.4852.0020.0002] # CUNEIFORM SIGN ARAD -12035 ; [.4853.0020.0002] # CUNEIFORM SIGN ARAD TIMES KUR -12036 ; [.4854.0020.0002] # CUNEIFORM SIGN ARKAB -12037 ; [.4855.0020.0002] # CUNEIFORM SIGN ASAL2 -12038 ; [.4856.0020.0002] # CUNEIFORM SIGN ASH -12039 ; [.4857.0020.0002] # CUNEIFORM SIGN ASH ZIDA TENU -1203A ; [.4858.0020.0002] # CUNEIFORM SIGN ASH KABA TENU -1203B ; [.4859.0020.0002] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP -1203C ; [.485A.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH -1203D ; [.485B.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH -1203E ; [.485C.0020.0002] # CUNEIFORM SIGN ASH2 -1203F ; [.485D.0020.0002] # CUNEIFORM SIGN ASHGAB -12040 ; [.485E.0020.0002] # CUNEIFORM SIGN BA -12041 ; [.485F.0020.0002] # CUNEIFORM SIGN BAD -12042 ; [.4860.0020.0002] # CUNEIFORM SIGN BAG3 -12043 ; [.4861.0020.0002] # CUNEIFORM SIGN BAHAR2 -12044 ; [.4862.0020.0002] # CUNEIFORM SIGN BAL -12045 ; [.4863.0020.0002] # CUNEIFORM SIGN BAL OVER BAL -12046 ; [.4864.0020.0002] # CUNEIFORM SIGN BALAG -12047 ; [.4865.0020.0002] # CUNEIFORM SIGN BAR -12048 ; [.4866.0020.0002] # CUNEIFORM SIGN BARA2 -12049 ; [.4867.0020.0002] # CUNEIFORM SIGN BI -1204A ; [.4868.0020.0002] # CUNEIFORM SIGN BI TIMES A -1204B ; [.4869.0020.0002] # CUNEIFORM SIGN BI TIMES GAR -1204C ; [.486A.0020.0002] # CUNEIFORM SIGN BI TIMES IGI GUNU -1204D ; [.486B.0020.0002] # CUNEIFORM SIGN BU -1204E ; [.486C.0020.0002] # CUNEIFORM SIGN BU OVER BU AB -1204F ; [.486D.0020.0002] # CUNEIFORM SIGN BU OVER BU UN -12050 ; [.486E.0020.0002] # CUNEIFORM SIGN BU CROSSING BU -12051 ; [.486F.0020.0002] # CUNEIFORM SIGN BULUG -12052 ; [.4870.0020.0002] # CUNEIFORM SIGN BULUG OVER BULUG -12053 ; [.4871.0020.0002] # CUNEIFORM SIGN BUR -12054 ; [.4872.0020.0002] # CUNEIFORM SIGN BUR2 -12055 ; [.4873.0020.0002] # CUNEIFORM SIGN DA -12056 ; [.4874.0020.0002] # CUNEIFORM SIGN DAG -12057 ; [.4875.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH -12058 ; [.4876.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR -12059 ; [.4877.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG -1205A ; [.4878.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BI -1205B ; [.4879.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA -1205C ; [.487A.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH -1205D ; [.487B.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GI -1205E ; [.487C.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2 -1205F ; [.487D.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD -12060 ; [.487E.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES HA -12061 ; [.487F.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR -12062 ; [.4880.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU -12063 ; [.4881.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK -12064 ; [.4882.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LA -12065 ; [.4883.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU -12066 ; [.4884.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2 -12067 ; [.4885.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM -12068 ; [.4886.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES NE -12069 ; [.4887.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP -1206A ; [.4888.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES SI -1206B ; [.4889.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4 -1206C ; [.488A.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2 -1206D ; [.488B.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES USH -1206E ; [.488C.0020.0002] # CUNEIFORM SIGN DAM -1206F ; [.488D.0020.0002] # CUNEIFORM SIGN DAR -12070 ; [.488E.0020.0002] # CUNEIFORM SIGN DARA3 -12071 ; [.488F.0020.0002] # CUNEIFORM SIGN DARA4 -12072 ; [.4890.0020.0002] # CUNEIFORM SIGN DI -12073 ; [.4891.0020.0002] # CUNEIFORM SIGN DIB -12074 ; [.4892.0020.0002] # CUNEIFORM SIGN DIM -12075 ; [.4893.0020.0002] # CUNEIFORM SIGN DIM TIMES SHE -12076 ; [.4894.0020.0002] # CUNEIFORM SIGN DIM2 -12077 ; [.4895.0020.0002] # CUNEIFORM SIGN DIN -12078 ; [.4896.0020.0002] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH -12079 ; [.4897.0020.0002] # CUNEIFORM SIGN DISH -1207A ; [.4898.0020.0002] # CUNEIFORM SIGN DU -1207B ; [.4899.0020.0002] # CUNEIFORM SIGN DU OVER DU -1207C ; [.489A.0020.0002] # CUNEIFORM SIGN DU GUNU -1207D ; [.489B.0020.0002] # CUNEIFORM SIGN DU SHESHIG -1207E ; [.489C.0020.0002] # CUNEIFORM SIGN DUB -1207F ; [.489D.0020.0002] # CUNEIFORM SIGN DUB TIMES ESH2 -12080 ; [.489E.0020.0002] # CUNEIFORM SIGN DUB2 -12081 ; [.489F.0020.0002] # CUNEIFORM SIGN DUG -12082 ; [.48A0.0020.0002] # CUNEIFORM SIGN DUGUD -12083 ; [.48A1.0020.0002] # CUNEIFORM SIGN DUH -12084 ; [.48A2.0020.0002] # CUNEIFORM SIGN DUN -12085 ; [.48A3.0020.0002] # CUNEIFORM SIGN DUN3 -12086 ; [.48A4.0020.0002] # CUNEIFORM SIGN DUN3 GUNU -12087 ; [.48A5.0020.0002] # CUNEIFORM SIGN DUN3 GUNU GUNU -12088 ; [.48A6.0020.0002] # CUNEIFORM SIGN DUN4 -12089 ; [.48A7.0020.0002] # CUNEIFORM SIGN DUR2 -1208A ; [.48A8.0020.0002] # CUNEIFORM SIGN E -1208B ; [.48A9.0020.0002] # CUNEIFORM SIGN E TIMES PAP -1208C ; [.48AA.0020.0002] # CUNEIFORM SIGN E OVER E NUN OVER NUN -1208D ; [.48AB.0020.0002] # CUNEIFORM SIGN E2 -1208E ; [.48AC.0020.0002] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA -1208F ; [.48AD.0020.0002] # CUNEIFORM SIGN E2 TIMES GAR -12090 ; [.48AE.0020.0002] # CUNEIFORM SIGN E2 TIMES MI -12091 ; [.48AF.0020.0002] # CUNEIFORM SIGN E2 TIMES SAL -12092 ; [.48B0.0020.0002] # CUNEIFORM SIGN E2 TIMES SHE -12093 ; [.48B1.0020.0002] # CUNEIFORM SIGN E2 TIMES U -12094 ; [.48B2.0020.0002] # CUNEIFORM SIGN EDIN -12095 ; [.48B3.0020.0002] # CUNEIFORM SIGN EGIR -12096 ; [.48B4.0020.0002] # CUNEIFORM SIGN EL -12097 ; [.48B5.0020.0002] # CUNEIFORM SIGN EN -12098 ; [.48B6.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 -12099 ; [.48B7.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 TENU -1209A ; [.48B8.0020.0002] # CUNEIFORM SIGN EN TIMES ME -1209B ; [.48B9.0020.0002] # CUNEIFORM SIGN EN CROSSING EN -1209C ; [.48BA.0020.0002] # CUNEIFORM SIGN EN OPPOSING EN -1209D ; [.48BB.0020.0002] # CUNEIFORM SIGN EN SQUARED -1209E ; [.48BC.0020.0002] # CUNEIFORM SIGN EREN -1209F ; [.48BD.0020.0002] # CUNEIFORM SIGN ERIN2 -120A0 ; [.48BE.0020.0002] # CUNEIFORM SIGN ESH2 -120A1 ; [.48BF.0020.0002] # CUNEIFORM SIGN EZEN -120A2 ; [.48C0.0020.0002] # CUNEIFORM SIGN EZEN TIMES A -120A3 ; [.48C1.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL -120A4 ; [.48C2.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL -120A5 ; [.48C3.0020.0002] # CUNEIFORM SIGN EZEN TIMES AN -120A6 ; [.48C4.0020.0002] # CUNEIFORM SIGN EZEN TIMES BAD -120A7 ; [.48C5.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU -120A8 ; [.48C6.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU -120A9 ; [.48C7.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA -120AA ; [.48C8.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA GUNU -120AB ; [.48C9.0020.0002] # CUNEIFORM SIGN EZEN TIMES IGI GUNU -120AC ; [.48CA.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL -120AD ; [.48CB.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED -120AE ; [.48CC.0020.0002] # CUNEIFORM SIGN EZEN TIMES KU3 -120AF ; [.48CD.0020.0002] # CUNEIFORM SIGN EZEN TIMES LA -120B0 ; [.48CE.0020.0002] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL -120B1 ; [.48CF.0020.0002] # CUNEIFORM SIGN EZEN TIMES LI -120B2 ; [.48D0.0020.0002] # CUNEIFORM SIGN EZEN TIMES LU -120B3 ; [.48D1.0020.0002] # CUNEIFORM SIGN EZEN TIMES U2 -120B4 ; [.48D2.0020.0002] # CUNEIFORM SIGN EZEN TIMES UD -120B5 ; [.48D3.0020.0002] # CUNEIFORM SIGN GA -120B6 ; [.48D4.0020.0002] # CUNEIFORM SIGN GA GUNU -120B7 ; [.48D5.0020.0002] # CUNEIFORM SIGN GA2 -120B8 ; [.48D6.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA -120B9 ; [.48D7.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS HA -120BA ; [.48D8.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI -120BB ; [.48D9.0020.0002] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB -120BC ; [.48DA.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN -120BD ; [.48DB.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH -120BE ; [.48DC.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL -120BF ; [.48DD.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAD -120C0 ; [.48DE.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA -120C1 ; [.48DF.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR -120C2 ; [.48E0.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA -120C3 ; [.48E1.0020.0002] # CUNEIFORM SIGN GA2 TIMES DA -120C4 ; [.48E2.0020.0002] # CUNEIFORM SIGN GA2 TIMES DI -120C5 ; [.48E3.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE -120C6 ; [.48E4.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUB -120C7 ; [.48E5.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL -120C8 ; [.48E6.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA -120C9 ; [.48E7.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN -120CA ; [.48E8.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU -120CB ; [.48E9.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU -120CC ; [.48EA.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR -120CD ; [.48EB.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI -120CE ; [.48EC.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 -120CF ; [.48ED.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A -120D0 ; [.48EE.0020.0002] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU -120D1 ; [.48EF.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2 -120D2 ; [.48F0.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL -120D3 ; [.48F1.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA -120D4 ; [.48F2.0020.0002] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI -120D5 ; [.48F3.0020.0002] # CUNEIFORM SIGN GA2 TIMES HUB2 -120D6 ; [.48F4.0020.0002] # CUNEIFORM SIGN GA2 TIMES IGI GUNU -120D7 ; [.48F5.0020.0002] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH -120D8 ; [.48F6.0020.0002] # CUNEIFORM SIGN GA2 TIMES KAK -120D9 ; [.48F7.0020.0002] # CUNEIFORM SIGN GA2 TIMES KASKAL -120DA ; [.48F8.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID -120DB ; [.48F9.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL -120DC ; [.48FA.0020.0002] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN -120DD ; [.48FB.0020.0002] # CUNEIFORM SIGN GA2 TIMES LA -120DE ; [.48FC.0020.0002] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN -120DF ; [.48FD.0020.0002] # CUNEIFORM SIGN GA2 TIMES MI -120E0 ; [.48FE.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN -120E1 ; [.48FF.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN -120E2 ; [.4900.0020.0002] # CUNEIFORM SIGN GA2 TIMES PA -120E3 ; [.4901.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAL -120E4 ; [.4902.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAR -120E5 ; [.4903.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE -120E6 ; [.4904.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR -120E7 ; [.4905.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHID -120E8 ; [.4906.0020.0002] # CUNEIFORM SIGN GA2 TIMES SUM -120E9 ; [.4907.0020.0002] # CUNEIFORM SIGN GA2 TIMES TAK4 -120EA ; [.4908.0020.0002] # CUNEIFORM SIGN GA2 TIMES U -120EB ; [.4909.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD -120EC ; [.490A.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU -120ED ; [.490B.0020.0002] # CUNEIFORM SIGN GA2 OVER GA2 -120EE ; [.490C.0020.0002] # CUNEIFORM SIGN GABA -120EF ; [.490D.0020.0002] # CUNEIFORM SIGN GABA CROSSING GABA -120F0 ; [.490E.0020.0002] # CUNEIFORM SIGN GAD -120F1 ; [.490F.0020.0002] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR -120F2 ; [.4910.0020.0002] # CUNEIFORM SIGN GAL -120F3 ; [.4911.0020.0002] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR -120F4 ; [.4912.0020.0002] # CUNEIFORM SIGN GALAM -120F5 ; [.4913.0020.0002] # CUNEIFORM SIGN GAM -120F6 ; [.4914.0020.0002] # CUNEIFORM SIGN GAN -120F7 ; [.4915.0020.0002] # CUNEIFORM SIGN GAN2 -120F8 ; [.4916.0020.0002] # CUNEIFORM SIGN GAN2 TENU -120F9 ; [.4917.0020.0002] # CUNEIFORM SIGN GAN2 OVER GAN2 -120FA ; [.4918.0020.0002] # CUNEIFORM SIGN GAN2 CROSSING GAN2 -120FB ; [.4919.0020.0002] # CUNEIFORM SIGN GAR -120FC ; [.491A.0020.0002] # CUNEIFORM SIGN GAR3 -120FD ; [.491B.0020.0002] # CUNEIFORM SIGN GASHAN -120FE ; [.491C.0020.0002] # CUNEIFORM SIGN GESHTIN -120FF ; [.491D.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES KUR -12100 ; [.491E.0020.0002] # CUNEIFORM SIGN GI -12101 ; [.491F.0020.0002] # CUNEIFORM SIGN GI TIMES E -12102 ; [.4920.0020.0002] # CUNEIFORM SIGN GI TIMES U -12103 ; [.4921.0020.0002] # CUNEIFORM SIGN GI CROSSING GI -12104 ; [.4922.0020.0002] # CUNEIFORM SIGN GI4 -12105 ; [.4923.0020.0002] # CUNEIFORM SIGN GI4 OVER GI4 -12106 ; [.4924.0020.0002] # CUNEIFORM SIGN GI4 CROSSING GI4 -12107 ; [.4925.0020.0002] # CUNEIFORM SIGN GIDIM -12108 ; [.4926.0020.0002] # CUNEIFORM SIGN GIR2 -12109 ; [.4927.0020.0002] # CUNEIFORM SIGN GIR2 GUNU -1210A ; [.4928.0020.0002] # CUNEIFORM SIGN GIR3 -1210B ; [.4929.0020.0002] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI -1210C ; [.492A.0020.0002] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU -1210D ; [.492B.0020.0002] # CUNEIFORM SIGN GIR3 TIMES IGI -1210E ; [.492C.0020.0002] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI -1210F ; [.492D.0020.0002] # CUNEIFORM SIGN GIR3 TIMES PA -12110 ; [.492E.0020.0002] # CUNEIFORM SIGN GISAL -12111 ; [.492F.0020.0002] # CUNEIFORM SIGN GISH -12112 ; [.4930.0020.0002] # CUNEIFORM SIGN GISH CROSSING GISH -12113 ; [.4931.0020.0002] # CUNEIFORM SIGN GISH TIMES BAD -12114 ; [.4932.0020.0002] # CUNEIFORM SIGN GISH TIMES TAK4 -12115 ; [.4933.0020.0002] # CUNEIFORM SIGN GISH TENU -12116 ; [.4934.0020.0002] # CUNEIFORM SIGN GU -12117 ; [.4935.0020.0002] # CUNEIFORM SIGN GU CROSSING GU -12118 ; [.4936.0020.0002] # CUNEIFORM SIGN GU2 -12119 ; [.4937.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK -1211A ; [.4938.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU -1211B ; [.4939.0020.0002] # CUNEIFORM SIGN GU2 TIMES NUN -1211C ; [.493A.0020.0002] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2 -1211D ; [.493B.0020.0002] # CUNEIFORM SIGN GU2 GUNU -1211E ; [.493C.0020.0002] # CUNEIFORM SIGN GUD -1211F ; [.493D.0020.0002] # CUNEIFORM SIGN GUD TIMES A PLUS KUR -12120 ; [.493E.0020.0002] # CUNEIFORM SIGN GUD TIMES KUR -12121 ; [.493F.0020.0002] # CUNEIFORM SIGN GUD OVER GUD LUGAL -12122 ; [.4940.0020.0002] # CUNEIFORM SIGN GUL -12123 ; [.4941.0020.0002] # CUNEIFORM SIGN GUM -12124 ; [.4942.0020.0002] # CUNEIFORM SIGN GUM TIMES SHE -12125 ; [.4943.0020.0002] # CUNEIFORM SIGN GUR -12126 ; [.4944.0020.0002] # CUNEIFORM SIGN GUR7 -12127 ; [.4945.0020.0002] # CUNEIFORM SIGN GURUN -12128 ; [.4946.0020.0002] # CUNEIFORM SIGN GURUSH -12129 ; [.4947.0020.0002] # CUNEIFORM SIGN HA -1212A ; [.4948.0020.0002] # CUNEIFORM SIGN HA TENU -1212B ; [.4949.0020.0002] # CUNEIFORM SIGN HA GUNU -1212C ; [.494A.0020.0002] # CUNEIFORM SIGN HAL -1212D ; [.494B.0020.0002] # CUNEIFORM SIGN HI -1212E ; [.494C.0020.0002] # CUNEIFORM SIGN HI TIMES ASH -1212F ; [.494D.0020.0002] # CUNEIFORM SIGN HI TIMES ASH2 -12130 ; [.494E.0020.0002] # CUNEIFORM SIGN HI TIMES BAD -12131 ; [.494F.0020.0002] # CUNEIFORM SIGN HI TIMES DISH -12132 ; [.4950.0020.0002] # CUNEIFORM SIGN HI TIMES GAD -12133 ; [.4951.0020.0002] # CUNEIFORM SIGN HI TIMES KIN -12134 ; [.4952.0020.0002] # CUNEIFORM SIGN HI TIMES NUN -12135 ; [.4953.0020.0002] # CUNEIFORM SIGN HI TIMES SHE -12136 ; [.4954.0020.0002] # CUNEIFORM SIGN HI TIMES U -12137 ; [.4955.0020.0002] # CUNEIFORM SIGN HU -12138 ; [.4956.0020.0002] # CUNEIFORM SIGN HUB2 -12139 ; [.4957.0020.0002] # CUNEIFORM SIGN HUB2 TIMES AN -1213A ; [.4958.0020.0002] # CUNEIFORM SIGN HUB2 TIMES HAL -1213B ; [.4959.0020.0002] # CUNEIFORM SIGN HUB2 TIMES KASKAL -1213C ; [.495A.0020.0002] # CUNEIFORM SIGN HUB2 TIMES LISH -1213D ; [.495B.0020.0002] # CUNEIFORM SIGN HUB2 TIMES UD -1213E ; [.495C.0020.0002] # CUNEIFORM SIGN HUL2 -1213F ; [.495D.0020.0002] # CUNEIFORM SIGN I -12140 ; [.495E.0020.0002] # CUNEIFORM SIGN I A -12141 ; [.495F.0020.0002] # CUNEIFORM SIGN IB -12142 ; [.4960.0020.0002] # CUNEIFORM SIGN IDIM -12143 ; [.4961.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM BUR -12144 ; [.4962.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED -12145 ; [.4963.0020.0002] # CUNEIFORM SIGN IG -12146 ; [.4964.0020.0002] # CUNEIFORM SIGN IGI -12147 ; [.4965.0020.0002] # CUNEIFORM SIGN IGI DIB -12148 ; [.4966.0020.0002] # CUNEIFORM SIGN IGI RI -12149 ; [.4967.0020.0002] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD -1214A ; [.4968.0020.0002] # CUNEIFORM SIGN IGI GUNU -1214B ; [.4969.0020.0002] # CUNEIFORM SIGN IL -1214C ; [.496A.0020.0002] # CUNEIFORM SIGN IL TIMES GAN2 TENU -1214D ; [.496B.0020.0002] # CUNEIFORM SIGN IL2 -1214E ; [.496C.0020.0002] # CUNEIFORM SIGN IM -1214F ; [.496D.0020.0002] # CUNEIFORM SIGN IM TIMES TAK4 -12150 ; [.496E.0020.0002] # CUNEIFORM SIGN IM CROSSING IM -12151 ; [.496F.0020.0002] # CUNEIFORM SIGN IM OPPOSING IM -12152 ; [.4970.0020.0002] # CUNEIFORM SIGN IM SQUARED -12153 ; [.4971.0020.0002] # CUNEIFORM SIGN IMIN -12154 ; [.4972.0020.0002] # CUNEIFORM SIGN IN -12155 ; [.4973.0020.0002] # CUNEIFORM SIGN IR -12156 ; [.4974.0020.0002] # CUNEIFORM SIGN ISH -12157 ; [.4975.0020.0002] # CUNEIFORM SIGN KA -12158 ; [.4976.0020.0002] # CUNEIFORM SIGN KA TIMES A -12159 ; [.4977.0020.0002] # CUNEIFORM SIGN KA TIMES AD -1215A ; [.4978.0020.0002] # CUNEIFORM SIGN KA TIMES AD PLUS KU3 -1215B ; [.4979.0020.0002] # CUNEIFORM SIGN KA TIMES ASH2 -1215C ; [.497A.0020.0002] # CUNEIFORM SIGN KA TIMES BAD -1215D ; [.497B.0020.0002] # CUNEIFORM SIGN KA TIMES BALAG -1215E ; [.497C.0020.0002] # CUNEIFORM SIGN KA TIMES BAR -1215F ; [.497D.0020.0002] # CUNEIFORM SIGN KA TIMES BI -12160 ; [.497E.0020.0002] # CUNEIFORM SIGN KA TIMES ERIN2 -12161 ; [.497F.0020.0002] # CUNEIFORM SIGN KA TIMES ESH2 -12162 ; [.4980.0020.0002] # CUNEIFORM SIGN KA TIMES GA -12163 ; [.4981.0020.0002] # CUNEIFORM SIGN KA TIMES GAL -12164 ; [.4982.0020.0002] # CUNEIFORM SIGN KA TIMES GAN2 TENU -12165 ; [.4983.0020.0002] # CUNEIFORM SIGN KA TIMES GAR -12166 ; [.4984.0020.0002] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A -12167 ; [.4985.0020.0002] # CUNEIFORM SIGN KA TIMES GI -12168 ; [.4986.0020.0002] # CUNEIFORM SIGN KA TIMES GIR2 -12169 ; [.4987.0020.0002] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR -1216A ; [.4988.0020.0002] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH -1216B ; [.4989.0020.0002] # CUNEIFORM SIGN KA TIMES GU -1216C ; [.498A.0020.0002] # CUNEIFORM SIGN KA TIMES GUR7 -1216D ; [.498B.0020.0002] # CUNEIFORM SIGN KA TIMES IGI -1216E ; [.498C.0020.0002] # CUNEIFORM SIGN KA TIMES IM -1216F ; [.498D.0020.0002] # CUNEIFORM SIGN KA TIMES KAK -12170 ; [.498E.0020.0002] # CUNEIFORM SIGN KA TIMES KI -12171 ; [.498F.0020.0002] # CUNEIFORM SIGN KA TIMES KID -12172 ; [.4990.0020.0002] # CUNEIFORM SIGN KA TIMES LI -12173 ; [.4991.0020.0002] # CUNEIFORM SIGN KA TIMES LU -12174 ; [.4992.0020.0002] # CUNEIFORM SIGN KA TIMES ME -12175 ; [.4993.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS DU -12176 ; [.4994.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS GI -12177 ; [.4995.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS TE -12178 ; [.4996.0020.0002] # CUNEIFORM SIGN KA TIMES MI -12179 ; [.4997.0020.0002] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ -1217A ; [.4998.0020.0002] # CUNEIFORM SIGN KA TIMES NE -1217B ; [.4999.0020.0002] # CUNEIFORM SIGN KA TIMES NUN -1217C ; [.499A.0020.0002] # CUNEIFORM SIGN KA TIMES PI -1217D ; [.499B.0020.0002] # CUNEIFORM SIGN KA TIMES RU -1217E ; [.499C.0020.0002] # CUNEIFORM SIGN KA TIMES SA -1217F ; [.499D.0020.0002] # CUNEIFORM SIGN KA TIMES SAR -12180 ; [.499E.0020.0002] # CUNEIFORM SIGN KA TIMES SHA -12181 ; [.499F.0020.0002] # CUNEIFORM SIGN KA TIMES SHE -12182 ; [.49A0.0020.0002] # CUNEIFORM SIGN KA TIMES SHID -12183 ; [.49A1.0020.0002] # CUNEIFORM SIGN KA TIMES SHU -12184 ; [.49A2.0020.0002] # CUNEIFORM SIGN KA TIMES SIG -12185 ; [.49A3.0020.0002] # CUNEIFORM SIGN KA TIMES SUHUR -12186 ; [.49A4.0020.0002] # CUNEIFORM SIGN KA TIMES TAR -12187 ; [.49A5.0020.0002] # CUNEIFORM SIGN KA TIMES U -12188 ; [.49A6.0020.0002] # CUNEIFORM SIGN KA TIMES U2 -12189 ; [.49A7.0020.0002] # CUNEIFORM SIGN KA TIMES UD -1218A ; [.49A8.0020.0002] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA -1218B ; [.49A9.0020.0002] # CUNEIFORM SIGN KA TIMES USH -1218C ; [.49AA.0020.0002] # CUNEIFORM SIGN KA TIMES ZI -1218D ; [.49AB.0020.0002] # CUNEIFORM SIGN KA2 -1218E ; [.49AC.0020.0002] # CUNEIFORM SIGN KA2 CROSSING KA2 -1218F ; [.49AD.0020.0002] # CUNEIFORM SIGN KAB -12190 ; [.49AE.0020.0002] # CUNEIFORM SIGN KAD2 -12191 ; [.49AF.0020.0002] # CUNEIFORM SIGN KAD3 -12192 ; [.49B0.0020.0002] # CUNEIFORM SIGN KAD4 -12193 ; [.49B1.0020.0002] # CUNEIFORM SIGN KAD5 -12194 ; [.49B2.0020.0002] # CUNEIFORM SIGN KAD5 OVER KAD5 -12195 ; [.49B3.0020.0002] # CUNEIFORM SIGN KAK -12196 ; [.49B4.0020.0002] # CUNEIFORM SIGN KAK TIMES IGI GUNU -12197 ; [.49B5.0020.0002] # CUNEIFORM SIGN KAL -12198 ; [.49B6.0020.0002] # CUNEIFORM SIGN KAL TIMES BAD -12199 ; [.49B7.0020.0002] # CUNEIFORM SIGN KAL CROSSING KAL -1219A ; [.49B8.0020.0002] # CUNEIFORM SIGN KAM2 -1219B ; [.49B9.0020.0002] # CUNEIFORM SIGN KAM4 -1219C ; [.49BA.0020.0002] # CUNEIFORM SIGN KASKAL -1219D ; [.49BB.0020.0002] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U -1219E ; [.49BC.0020.0002] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U -1219F ; [.49BD.0020.0002] # CUNEIFORM SIGN KESH2 -121A0 ; [.49BE.0020.0002] # CUNEIFORM SIGN KI -121A1 ; [.49BF.0020.0002] # CUNEIFORM SIGN KI TIMES BAD -121A2 ; [.49C0.0020.0002] # CUNEIFORM SIGN KI TIMES U -121A3 ; [.49C1.0020.0002] # CUNEIFORM SIGN KI TIMES UD -121A4 ; [.49C2.0020.0002] # CUNEIFORM SIGN KID -121A5 ; [.49C3.0020.0002] # CUNEIFORM SIGN KIN -121A6 ; [.49C4.0020.0002] # CUNEIFORM SIGN KISAL -121A7 ; [.49C5.0020.0002] # CUNEIFORM SIGN KISH -121A8 ; [.49C6.0020.0002] # CUNEIFORM SIGN KISIM5 -121A9 ; [.49C7.0020.0002] # CUNEIFORM SIGN KISIM5 OVER KISIM5 -121AA ; [.49C8.0020.0002] # CUNEIFORM SIGN KU -121AB ; [.49C9.0020.0002] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2 -121AC ; [.49CA.0020.0002] # CUNEIFORM SIGN KU3 -121AD ; [.49CB.0020.0002] # CUNEIFORM SIGN KU4 -121AE ; [.49CC.0020.0002] # CUNEIFORM SIGN KU4 VARIANT FORM -121AF ; [.49CD.0020.0002] # CUNEIFORM SIGN KU7 -121B0 ; [.49CE.0020.0002] # CUNEIFORM SIGN KUL -121B1 ; [.49CF.0020.0002] # CUNEIFORM SIGN KUL GUNU -121B2 ; [.49D0.0020.0002] # CUNEIFORM SIGN KUN -121B3 ; [.49D1.0020.0002] # CUNEIFORM SIGN KUR -121B4 ; [.49D2.0020.0002] # CUNEIFORM SIGN KUR OPPOSING KUR -121B5 ; [.49D3.0020.0002] # CUNEIFORM SIGN KUSHU2 -121B6 ; [.49D4.0020.0002] # CUNEIFORM SIGN KWU318 -121B7 ; [.49D5.0020.0002] # CUNEIFORM SIGN LA -121B8 ; [.49D6.0020.0002] # CUNEIFORM SIGN LAGAB -121B9 ; [.49D7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A -121BA ; [.49D8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA -121BB ; [.49D9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR -121BC ; [.49DA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL -121BD ; [.49DB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AL -121BE ; [.49DC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AN -121BF ; [.49DD.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU -121C0 ; [.49DE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BAD -121C1 ; [.49DF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BI -121C2 ; [.49E0.0020.0002] # CUNEIFORM SIGN LAGAB TIMES DAR -121C3 ; [.49E1.0020.0002] # CUNEIFORM SIGN LAGAB TIMES EN -121C4 ; [.49E2.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GA -121C5 ; [.49E3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GAR -121C6 ; [.49E4.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD -121C7 ; [.49E5.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD -121C8 ; [.49E6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HA -121C9 ; [.49E7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HAL -121CA ; [.49E8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN -121CB ; [.49E9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU -121CC ; [.49EA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM -121CD ; [.49EB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA -121CE ; [.49EC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU -121CF ; [.49ED.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KI -121D0 ; [.49EE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KIN -121D1 ; [.49EF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KU3 -121D2 ; [.49F0.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL -121D3 ; [.49F1.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A -121D4 ; [.49F2.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LAGAB -121D5 ; [.49F3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LISH -121D6 ; [.49F4.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LU -121D7 ; [.49F5.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LUL -121D8 ; [.49F6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME -121D9 ; [.49F7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN -121DA ; [.49F8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES MUSH -121DB ; [.49F9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES NE -121DC ; [.49FA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM -121DD ; [.49FB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2 -121DE ; [.49FC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU -121DF ; [.49FD.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 -121E0 ; [.49FE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2 -121E1 ; [.49FF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SUM -121E2 ; [.4A00.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAG -121E3 ; [.4A01.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAK4 -121E4 ; [.4A02.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA -121E5 ; [.4A03.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U -121E6 ; [.4A04.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS A -121E7 ; [.4A05.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U -121E8 ; [.4A06.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH -121E9 ; [.4A07.0020.0002] # CUNEIFORM SIGN LAGAB TIMES UD -121EA ; [.4A08.0020.0002] # CUNEIFORM SIGN LAGAB TIMES USH -121EB ; [.4A09.0020.0002] # CUNEIFORM SIGN LAGAB SQUARED -121EC ; [.4A0A.0020.0002] # CUNEIFORM SIGN LAGAR -121ED ; [.4A0B.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE -121EE ; [.4A0C.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM -121EF ; [.4A0D.0020.0002] # CUNEIFORM SIGN LAGAR GUNU -121F0 ; [.4A0E.0020.0002] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE -121F1 ; [.4A0F.0020.0002] # CUNEIFORM SIGN LAHSHU -121F2 ; [.4A10.0020.0002] # CUNEIFORM SIGN LAL -121F3 ; [.4A11.0020.0002] # CUNEIFORM SIGN LAL TIMES LAL -121F4 ; [.4A12.0020.0002] # CUNEIFORM SIGN LAM -121F5 ; [.4A13.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR -121F6 ; [.4A14.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU -121F7 ; [.4A15.0020.0002] # CUNEIFORM SIGN LI -121F8 ; [.4A16.0020.0002] # CUNEIFORM SIGN LIL -121F9 ; [.4A17.0020.0002] # CUNEIFORM SIGN LIMMU2 -121FA ; [.4A18.0020.0002] # CUNEIFORM SIGN LISH -121FB ; [.4A19.0020.0002] # CUNEIFORM SIGN LU -121FC ; [.4A1A.0020.0002] # CUNEIFORM SIGN LU TIMES BAD -121FD ; [.4A1B.0020.0002] # CUNEIFORM SIGN LU2 -121FE ; [.4A1C.0020.0002] # CUNEIFORM SIGN LU2 TIMES AL -121FF ; [.4A1D.0020.0002] # CUNEIFORM SIGN LU2 TIMES BAD -12200 ; [.4A1E.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 -12201 ; [.4A1F.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU -12202 ; [.4A20.0020.0002] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU -12203 ; [.4A21.0020.0002] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD -12204 ; [.4A22.0020.0002] # CUNEIFORM SIGN LU2 TIMES IM -12205 ; [.4A23.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD2 -12206 ; [.4A24.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 -12207 ; [.4A25.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH -12208 ; [.4A26.0020.0002] # CUNEIFORM SIGN LU2 TIMES KI -12209 ; [.4A27.0020.0002] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH -1220A ; [.4A28.0020.0002] # CUNEIFORM SIGN LU2 TIMES LAGAB -1220B ; [.4A29.0020.0002] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN -1220C ; [.4A2A.0020.0002] # CUNEIFORM SIGN LU2 TIMES NE -1220D ; [.4A2B.0020.0002] # CUNEIFORM SIGN LU2 TIMES NU -1220E ; [.4A2C.0020.0002] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH -1220F ; [.4A2D.0020.0002] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU -12210 ; [.4A2E.0020.0002] # CUNEIFORM SIGN LU2 TIMES TUG2 -12211 ; [.4A2F.0020.0002] # CUNEIFORM SIGN LU2 TENU -12212 ; [.4A30.0020.0002] # CUNEIFORM SIGN LU2 CROSSING LU2 -12213 ; [.4A31.0020.0002] # CUNEIFORM SIGN LU2 OPPOSING LU2 -12214 ; [.4A32.0020.0002] # CUNEIFORM SIGN LU2 SQUARED -12215 ; [.4A33.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG -12216 ; [.4A34.0020.0002] # CUNEIFORM SIGN LU3 -12217 ; [.4A35.0020.0002] # CUNEIFORM SIGN LUGAL -12218 ; [.4A36.0020.0002] # CUNEIFORM SIGN LUGAL OVER LUGAL -12219 ; [.4A37.0020.0002] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL -1221A ; [.4A38.0020.0002] # CUNEIFORM SIGN LUGAL SHESHIG -1221B ; [.4A39.0020.0002] # CUNEIFORM SIGN LUH -1221C ; [.4A3A.0020.0002] # CUNEIFORM SIGN LUL -1221D ; [.4A3B.0020.0002] # CUNEIFORM SIGN LUM -1221E ; [.4A3C.0020.0002] # CUNEIFORM SIGN LUM OVER LUM -1221F ; [.4A3D.0020.0002] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR -12220 ; [.4A3E.0020.0002] # CUNEIFORM SIGN MA -12221 ; [.4A3F.0020.0002] # CUNEIFORM SIGN MA TIMES TAK4 -12222 ; [.4A40.0020.0002] # CUNEIFORM SIGN MA GUNU -12223 ; [.4A41.0020.0002] # CUNEIFORM SIGN MA2 -12224 ; [.4A42.0020.0002] # CUNEIFORM SIGN MAH -12225 ; [.4A43.0020.0002] # CUNEIFORM SIGN MAR -12226 ; [.4A44.0020.0002] # CUNEIFORM SIGN MASH -12227 ; [.4A45.0020.0002] # CUNEIFORM SIGN MASH2 -12228 ; [.4A46.0020.0002] # CUNEIFORM SIGN ME -12229 ; [.4A47.0020.0002] # CUNEIFORM SIGN MES -1222A ; [.4A48.0020.0002] # CUNEIFORM SIGN MI -1222B ; [.4A49.0020.0002] # CUNEIFORM SIGN MIN -1222C ; [.4A4A.0020.0002] # CUNEIFORM SIGN MU -1222D ; [.4A4B.0020.0002] # CUNEIFORM SIGN MU OVER MU -1222E ; [.4A4C.0020.0002] # CUNEIFORM SIGN MUG -1222F ; [.4A4D.0020.0002] # CUNEIFORM SIGN MUG GUNU -12230 ; [.4A4E.0020.0002] # CUNEIFORM SIGN MUNSUB -12231 ; [.4A4F.0020.0002] # CUNEIFORM SIGN MURGU2 -12232 ; [.4A50.0020.0002] # CUNEIFORM SIGN MUSH -12233 ; [.4A51.0020.0002] # CUNEIFORM SIGN MUSH TIMES A -12234 ; [.4A52.0020.0002] # CUNEIFORM SIGN MUSH TIMES KUR -12235 ; [.4A53.0020.0002] # CUNEIFORM SIGN MUSH TIMES ZA -12236 ; [.4A54.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH -12237 ; [.4A55.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA -12238 ; [.4A56.0020.0002] # CUNEIFORM SIGN MUSH CROSSING MUSH -12239 ; [.4A57.0020.0002] # CUNEIFORM SIGN MUSH3 -1223A ; [.4A58.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A -1223B ; [.4A59.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI -1223C ; [.4A5A.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES DI -1223D ; [.4A5B.0020.0002] # CUNEIFORM SIGN MUSH3 GUNU -1223E ; [.4A5C.0020.0002] # CUNEIFORM SIGN NA -1223F ; [.4A5D.0020.0002] # CUNEIFORM SIGN NA2 -12240 ; [.4A5E.0020.0002] # CUNEIFORM SIGN NAGA -12241 ; [.4A5F.0020.0002] # CUNEIFORM SIGN NAGA INVERTED -12242 ; [.4A60.0020.0002] # CUNEIFORM SIGN NAGA TIMES SHU TENU -12243 ; [.4A61.0020.0002] # CUNEIFORM SIGN NAGA OPPOSING NAGA -12244 ; [.4A62.0020.0002] # CUNEIFORM SIGN NAGAR -12245 ; [.4A63.0020.0002] # CUNEIFORM SIGN NAM NUTILLU -12246 ; [.4A64.0020.0002] # CUNEIFORM SIGN NAM -12247 ; [.4A65.0020.0002] # CUNEIFORM SIGN NAM2 -12248 ; [.4A66.0020.0002] # CUNEIFORM SIGN NE -12249 ; [.4A67.0020.0002] # CUNEIFORM SIGN NE TIMES A -1224A ; [.4A68.0020.0002] # CUNEIFORM SIGN NE TIMES UD -1224B ; [.4A69.0020.0002] # CUNEIFORM SIGN NE SHESHIG -1224C ; [.4A6A.0020.0002] # CUNEIFORM SIGN NI -1224D ; [.4A6B.0020.0002] # CUNEIFORM SIGN NI TIMES E -1224E ; [.4A6C.0020.0002] # CUNEIFORM SIGN NI2 -1224F ; [.4A6D.0020.0002] # CUNEIFORM SIGN NIM -12250 ; [.4A6E.0020.0002] # CUNEIFORM SIGN NIM TIMES GAN2 TENU -12251 ; [.4A6F.0020.0002] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU -12252 ; [.4A70.0020.0002] # CUNEIFORM SIGN NINDA2 -12253 ; [.4A71.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES AN -12254 ; [.4A72.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH -12255 ; [.4A73.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH -12256 ; [.4A74.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUD -12257 ; [.4A75.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU -12258 ; [.4A76.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NE -12259 ; [.4A77.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NUN -1225A ; [.4A78.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE -1225B ; [.4A79.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN -1225C ; [.4A7A.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH -1225D ; [.4A7B.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH -1225E ; [.4A7C.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH -1225F ; [.4A7D.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES USH -12260 ; [.4A7E.0020.0002] # CUNEIFORM SIGN NISAG -12261 ; [.4A7F.0020.0002] # CUNEIFORM SIGN NU -12262 ; [.4A80.0020.0002] # CUNEIFORM SIGN NU11 -122D4 ; [.4A81.0020.0002] # CUNEIFORM SIGN SHIR TENU -122D5 ; [.4A82.0020.0002] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR -12263 ; [.4A83.0020.0002] # CUNEIFORM SIGN NUN -12264 ; [.4A84.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES GAR -12265 ; [.4A85.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES MASH -12266 ; [.4A86.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL -12267 ; [.4A87.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL -12268 ; [.4A88.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES USH -12269 ; [.4A89.0020.0002] # CUNEIFORM SIGN NUN TENU -1226A ; [.4A8A.0020.0002] # CUNEIFORM SIGN NUN OVER NUN -1226B ; [.4A8B.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN -1226C ; [.4A8C.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR -1226D ; [.4A8D.0020.0002] # CUNEIFORM SIGN NUNUZ -1226E ; [.4A8E.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB -1226F ; [.4A8F.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI -12270 ; [.4A90.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG -12271 ; [.4A91.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD -12272 ; [.4A92.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU -12273 ; [.4A93.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3 -12274 ; [.4A94.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA -12275 ; [.4A95.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE -12276 ; [.4A96.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3 -12277 ; [.4A97.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2 -12278 ; [.4A98.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI -12279 ; [.4A99.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U -1227A ; [.4A9A.0020.0002] # CUNEIFORM SIGN PA -1227B ; [.4A9B.0020.0002] # CUNEIFORM SIGN PAD -1227C ; [.4A9C.0020.0002] # CUNEIFORM SIGN PAN -1227D ; [.4A9D.0020.0002] # CUNEIFORM SIGN PAP -1227E ; [.4A9E.0020.0002] # CUNEIFORM SIGN PESH2 -1227F ; [.4A9F.0020.0002] # CUNEIFORM SIGN PI -12280 ; [.4AA0.0020.0002] # CUNEIFORM SIGN PI TIMES A -12281 ; [.4AA1.0020.0002] # CUNEIFORM SIGN PI TIMES AB -12282 ; [.4AA2.0020.0002] # CUNEIFORM SIGN PI TIMES BI -12283 ; [.4AA3.0020.0002] # CUNEIFORM SIGN PI TIMES BU -12284 ; [.4AA4.0020.0002] # CUNEIFORM SIGN PI TIMES E -12285 ; [.4AA5.0020.0002] # CUNEIFORM SIGN PI TIMES I -12286 ; [.4AA6.0020.0002] # CUNEIFORM SIGN PI TIMES IB -12287 ; [.4AA7.0020.0002] # CUNEIFORM SIGN PI TIMES U -12288 ; [.4AA8.0020.0002] # CUNEIFORM SIGN PI TIMES U2 -12289 ; [.4AA9.0020.0002] # CUNEIFORM SIGN PI CROSSING PI -1228A ; [.4AAA.0020.0002] # CUNEIFORM SIGN PIRIG -1228B ; [.4AAB.0020.0002] # CUNEIFORM SIGN PIRIG TIMES KAL -1228C ; [.4AAC.0020.0002] # CUNEIFORM SIGN PIRIG TIMES UD -1228D ; [.4AAD.0020.0002] # CUNEIFORM SIGN PIRIG TIMES ZA -1228E ; [.4AAE.0020.0002] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG -1228F ; [.4AAF.0020.0002] # CUNEIFORM SIGN RA -12290 ; [.4AB0.0020.0002] # CUNEIFORM SIGN RAB -12291 ; [.4AB1.0020.0002] # CUNEIFORM SIGN RI -12292 ; [.4AB2.0020.0002] # CUNEIFORM SIGN RU -12293 ; [.4AB3.0020.0002] # CUNEIFORM SIGN SA -12294 ; [.4AB4.0020.0002] # CUNEIFORM SIGN SAG NUTILLU -12295 ; [.4AB5.0020.0002] # CUNEIFORM SIGN SAG -12296 ; [.4AB6.0020.0002] # CUNEIFORM SIGN SAG TIMES A -12297 ; [.4AB7.0020.0002] # CUNEIFORM SIGN SAG TIMES DU -12298 ; [.4AB8.0020.0002] # CUNEIFORM SIGN SAG TIMES DUB -12299 ; [.4AB9.0020.0002] # CUNEIFORM SIGN SAG TIMES HA -1229A ; [.4ABA.0020.0002] # CUNEIFORM SIGN SAG TIMES KAK -1229B ; [.4ABB.0020.0002] # CUNEIFORM SIGN SAG TIMES KUR -1229C ; [.4ABC.0020.0002] # CUNEIFORM SIGN SAG TIMES LUM -1229D ; [.4ABD.0020.0002] # CUNEIFORM SIGN SAG TIMES MI -1229E ; [.4ABE.0020.0002] # CUNEIFORM SIGN SAG TIMES NUN -1229F ; [.4ABF.0020.0002] # CUNEIFORM SIGN SAG TIMES SAL -122A0 ; [.4AC0.0020.0002] # CUNEIFORM SIGN SAG TIMES SHID -122A1 ; [.4AC1.0020.0002] # CUNEIFORM SIGN SAG TIMES TAB -122A2 ; [.4AC2.0020.0002] # CUNEIFORM SIGN SAG TIMES U2 -122A3 ; [.4AC3.0020.0002] # CUNEIFORM SIGN SAG TIMES UB -122A4 ; [.4AC4.0020.0002] # CUNEIFORM SIGN SAG TIMES UM -122A5 ; [.4AC5.0020.0002] # CUNEIFORM SIGN SAG TIMES UR -122A6 ; [.4AC6.0020.0002] # CUNEIFORM SIGN SAG TIMES USH -122A7 ; [.4AC7.0020.0002] # CUNEIFORM SIGN SAG OVER SAG -122A8 ; [.4AC8.0020.0002] # CUNEIFORM SIGN SAG GUNU -122A9 ; [.4AC9.0020.0002] # CUNEIFORM SIGN SAL -122AA ; [.4ACA.0020.0002] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2 -122AB ; [.4ACB.0020.0002] # CUNEIFORM SIGN SANGA2 -122AC ; [.4ACC.0020.0002] # CUNEIFORM SIGN SAR -122AD ; [.4ACD.0020.0002] # CUNEIFORM SIGN SHA -122AE ; [.4ACE.0020.0002] # CUNEIFORM SIGN SHA3 -122AF ; [.4ACF.0020.0002] # CUNEIFORM SIGN SHA3 TIMES A -122B0 ; [.4AD0.0020.0002] # CUNEIFORM SIGN SHA3 TIMES BAD -122B1 ; [.4AD1.0020.0002] # CUNEIFORM SIGN SHA3 TIMES GISH -122B2 ; [.4AD2.0020.0002] # CUNEIFORM SIGN SHA3 TIMES NE -122B3 ; [.4AD3.0020.0002] # CUNEIFORM SIGN SHA3 TIMES SHU2 -122B4 ; [.4AD4.0020.0002] # CUNEIFORM SIGN SHA3 TIMES TUR -122B5 ; [.4AD5.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U -122B6 ; [.4AD6.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U PLUS A -122B7 ; [.4AD7.0020.0002] # CUNEIFORM SIGN SHA6 -122B8 ; [.4AD8.0020.0002] # CUNEIFORM SIGN SHAB6 -122B9 ; [.4AD9.0020.0002] # CUNEIFORM SIGN SHAR2 -122BA ; [.4ADA.0020.0002] # CUNEIFORM SIGN SHE -122BB ; [.4ADB.0020.0002] # CUNEIFORM SIGN SHE HU -122BC ; [.4ADC.0020.0002] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR -122BD ; [.4ADD.0020.0002] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR -122BE ; [.4ADE.0020.0002] # CUNEIFORM SIGN SHEG9 -122BF ; [.4ADF.0020.0002] # CUNEIFORM SIGN SHEN -122C0 ; [.4AE0.0020.0002] # CUNEIFORM SIGN SHESH -122C1 ; [.4AE1.0020.0002] # CUNEIFORM SIGN SHESH2 -122C2 ; [.4AE2.0020.0002] # CUNEIFORM SIGN SHESHLAM -122C3 ; [.4AE3.0020.0002] # CUNEIFORM SIGN SHID -122C4 ; [.4AE4.0020.0002] # CUNEIFORM SIGN SHID TIMES A -122C5 ; [.4AE5.0020.0002] # CUNEIFORM SIGN SHID TIMES IM -122C6 ; [.4AE6.0020.0002] # CUNEIFORM SIGN SHIM -122C7 ; [.4AE7.0020.0002] # CUNEIFORM SIGN SHIM TIMES A -122C8 ; [.4AE8.0020.0002] # CUNEIFORM SIGN SHIM TIMES BAL -122C9 ; [.4AE9.0020.0002] # CUNEIFORM SIGN SHIM TIMES BULUG -122CA ; [.4AEA.0020.0002] # CUNEIFORM SIGN SHIM TIMES DIN -122CB ; [.4AEB.0020.0002] # CUNEIFORM SIGN SHIM TIMES GAR -122CC ; [.4AEC.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI -122CD ; [.4AED.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI GUNU -122CE ; [.4AEE.0020.0002] # CUNEIFORM SIGN SHIM TIMES KUSHU2 -122CF ; [.4AEF.0020.0002] # CUNEIFORM SIGN SHIM TIMES LUL -122D0 ; [.4AF0.0020.0002] # CUNEIFORM SIGN SHIM TIMES MUG -122D1 ; [.4AF1.0020.0002] # CUNEIFORM SIGN SHIM TIMES SAL -122D2 ; [.4AF2.0020.0002] # CUNEIFORM SIGN SHINIG -122D3 ; [.4AF3.0020.0002] # CUNEIFORM SIGN SHIR -122D6 ; [.4AF4.0020.0002] # CUNEIFORM SIGN SHITA -122D7 ; [.4AF5.0020.0002] # CUNEIFORM SIGN SHU -122D8 ; [.4AF6.0020.0002] # CUNEIFORM SIGN SHU OVER INVERTED SHU -122D9 ; [.4AF7.0020.0002] # CUNEIFORM SIGN SHU2 -122DA ; [.4AF8.0020.0002] # CUNEIFORM SIGN SHUBUR -122DB ; [.4AF9.0020.0002] # CUNEIFORM SIGN SI -122DC ; [.4AFA.0020.0002] # CUNEIFORM SIGN SI GUNU -122DD ; [.4AFB.0020.0002] # CUNEIFORM SIGN SIG -122DE ; [.4AFC.0020.0002] # CUNEIFORM SIGN SIG4 -122DF ; [.4AFD.0020.0002] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2 -122E0 ; [.4AFE.0020.0002] # CUNEIFORM SIGN SIK2 -122E1 ; [.4AFF.0020.0002] # CUNEIFORM SIGN SILA3 -122E2 ; [.4B00.0020.0002] # CUNEIFORM SIGN SU -122E3 ; [.4B01.0020.0002] # CUNEIFORM SIGN SU OVER SU -122E4 ; [.4B02.0020.0002] # CUNEIFORM SIGN SUD -122E5 ; [.4B03.0020.0002] # CUNEIFORM SIGN SUD2 -122E6 ; [.4B04.0020.0002] # CUNEIFORM SIGN SUHUR -122E7 ; [.4B05.0020.0002] # CUNEIFORM SIGN SUM -122E8 ; [.4B06.0020.0002] # CUNEIFORM SIGN SUMASH -122E9 ; [.4B07.0020.0002] # CUNEIFORM SIGN SUR -122EA ; [.4B08.0020.0002] # CUNEIFORM SIGN SUR9 -122EB ; [.4B09.0020.0002] # CUNEIFORM SIGN TA -122EC ; [.4B0A.0020.0002] # CUNEIFORM SIGN TA ASTERISK -122ED ; [.4B0B.0020.0002] # CUNEIFORM SIGN TA TIMES HI -122EE ; [.4B0C.0020.0002] # CUNEIFORM SIGN TA TIMES MI -122EF ; [.4B0D.0020.0002] # CUNEIFORM SIGN TA GUNU -122F0 ; [.4B0E.0020.0002] # CUNEIFORM SIGN TAB -122F1 ; [.4B0F.0020.0002] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH -122F2 ; [.4B10.0020.0002] # CUNEIFORM SIGN TAB SQUARED -122F3 ; [.4B11.0020.0002] # CUNEIFORM SIGN TAG -122F4 ; [.4B12.0020.0002] # CUNEIFORM SIGN TAG TIMES BI -122F5 ; [.4B13.0020.0002] # CUNEIFORM SIGN TAG TIMES GUD -122F6 ; [.4B14.0020.0002] # CUNEIFORM SIGN TAG TIMES SHE -122F7 ; [.4B15.0020.0002] # CUNEIFORM SIGN TAG TIMES SHU -122F8 ; [.4B16.0020.0002] # CUNEIFORM SIGN TAG TIMES TUG2 -122F9 ; [.4B17.0020.0002] # CUNEIFORM SIGN TAG TIMES UD -122FA ; [.4B18.0020.0002] # CUNEIFORM SIGN TAK4 -122FB ; [.4B19.0020.0002] # CUNEIFORM SIGN TAR -122FC ; [.4B1A.0020.0002] # CUNEIFORM SIGN TE -122FD ; [.4B1B.0020.0002] # CUNEIFORM SIGN TE GUNU -122FE ; [.4B1C.0020.0002] # CUNEIFORM SIGN TI -122FF ; [.4B1D.0020.0002] # CUNEIFORM SIGN TI TENU -12300 ; [.4B1E.0020.0002] # CUNEIFORM SIGN TIL -12301 ; [.4B1F.0020.0002] # CUNEIFORM SIGN TIR -12302 ; [.4B20.0020.0002] # CUNEIFORM SIGN TIR TIMES TAK4 -12303 ; [.4B21.0020.0002] # CUNEIFORM SIGN TIR OVER TIR -12304 ; [.4B22.0020.0002] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR -12305 ; [.4B23.0020.0002] # CUNEIFORM SIGN TU -12306 ; [.4B24.0020.0002] # CUNEIFORM SIGN TUG2 -12307 ; [.4B25.0020.0002] # CUNEIFORM SIGN TUK -12308 ; [.4B26.0020.0002] # CUNEIFORM SIGN TUM -12309 ; [.4B27.0020.0002] # CUNEIFORM SIGN TUR -1230A ; [.4B28.0020.0002] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA -1230B ; [.4B29.0020.0002] # CUNEIFORM SIGN U -1230C ; [.4B2A.0020.0002] # CUNEIFORM SIGN U GUD -1230D ; [.4B2B.0020.0002] # CUNEIFORM SIGN U U U -1230E ; [.4B2C.0020.0002] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR -1230F ; [.4B2D.0020.0002] # CUNEIFORM SIGN U OVER U SUR OVER SUR -12310 ; [.4B2E.0020.0002] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED -12311 ; [.4B2F.0020.0002] # CUNEIFORM SIGN U2 -12312 ; [.4B30.0020.0002] # CUNEIFORM SIGN UB -12313 ; [.4B31.0020.0002] # CUNEIFORM SIGN UD -12314 ; [.4B32.0020.0002] # CUNEIFORM SIGN UD KUSHU2 -12315 ; [.4B33.0020.0002] # CUNEIFORM SIGN UD TIMES BAD -12316 ; [.4B34.0020.0002] # CUNEIFORM SIGN UD TIMES MI -12317 ; [.4B35.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U -12318 ; [.4B36.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU -12319 ; [.4B37.0020.0002] # CUNEIFORM SIGN UD GUNU -1231A ; [.4B38.0020.0002] # CUNEIFORM SIGN UD SHESHIG -1231B ; [.4B39.0020.0002] # CUNEIFORM SIGN UD SHESHIG TIMES BAD -1231C ; [.4B3A.0020.0002] # CUNEIFORM SIGN UDUG -1231D ; [.4B3B.0020.0002] # CUNEIFORM SIGN UM -1231E ; [.4B3C.0020.0002] # CUNEIFORM SIGN UM TIMES LAGAB -1231F ; [.4B3D.0020.0002] # CUNEIFORM SIGN UM TIMES ME PLUS DA -12320 ; [.4B3E.0020.0002] # CUNEIFORM SIGN UM TIMES SHA3 -12321 ; [.4B3F.0020.0002] # CUNEIFORM SIGN UM TIMES U -12322 ; [.4B40.0020.0002] # CUNEIFORM SIGN UMBIN -12323 ; [.4B41.0020.0002] # CUNEIFORM SIGN UMUM -12324 ; [.4B42.0020.0002] # CUNEIFORM SIGN UMUM TIMES KASKAL -12325 ; [.4B43.0020.0002] # CUNEIFORM SIGN UMUM TIMES PA -12326 ; [.4B44.0020.0002] # CUNEIFORM SIGN UN -12327 ; [.4B45.0020.0002] # CUNEIFORM SIGN UN GUNU -12328 ; [.4B46.0020.0002] # CUNEIFORM SIGN UR -12329 ; [.4B47.0020.0002] # CUNEIFORM SIGN UR CROSSING UR -1232A ; [.4B48.0020.0002] # CUNEIFORM SIGN UR SHESHIG -1232B ; [.4B49.0020.0002] # CUNEIFORM SIGN UR2 -1232C ; [.4B4A.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS HA -1232D ; [.4B4B.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS NA -1232E ; [.4B4C.0020.0002] # CUNEIFORM SIGN UR2 TIMES AL -1232F ; [.4B4D.0020.0002] # CUNEIFORM SIGN UR2 TIMES HA -12330 ; [.4B4E.0020.0002] # CUNEIFORM SIGN UR2 TIMES NUN -12331 ; [.4B4F.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 -12332 ; [.4B50.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH -12333 ; [.4B51.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI -12334 ; [.4B52.0020.0002] # CUNEIFORM SIGN UR4 -12335 ; [.4B53.0020.0002] # CUNEIFORM SIGN URI -12336 ; [.4B54.0020.0002] # CUNEIFORM SIGN URI3 -12337 ; [.4B55.0020.0002] # CUNEIFORM SIGN URU -12338 ; [.4B56.0020.0002] # CUNEIFORM SIGN URU TIMES A -12339 ; [.4B57.0020.0002] # CUNEIFORM SIGN URU TIMES ASHGAB -1233A ; [.4B58.0020.0002] # CUNEIFORM SIGN URU TIMES BAR -1233B ; [.4B59.0020.0002] # CUNEIFORM SIGN URU TIMES DUN -1233C ; [.4B5A.0020.0002] # CUNEIFORM SIGN URU TIMES GA -1233D ; [.4B5B.0020.0002] # CUNEIFORM SIGN URU TIMES GAL -1233E ; [.4B5C.0020.0002] # CUNEIFORM SIGN URU TIMES GAN2 TENU -1233F ; [.4B5D.0020.0002] # CUNEIFORM SIGN URU TIMES GAR -12340 ; [.4B5E.0020.0002] # CUNEIFORM SIGN URU TIMES GU -12341 ; [.4B5F.0020.0002] # CUNEIFORM SIGN URU TIMES HA -12342 ; [.4B60.0020.0002] # CUNEIFORM SIGN URU TIMES IGI -12343 ; [.4B61.0020.0002] # CUNEIFORM SIGN URU TIMES IM -12344 ; [.4B62.0020.0002] # CUNEIFORM SIGN URU TIMES ISH -12345 ; [.4B63.0020.0002] # CUNEIFORM SIGN URU TIMES KI -12346 ; [.4B64.0020.0002] # CUNEIFORM SIGN URU TIMES LUM -12347 ; [.4B65.0020.0002] # CUNEIFORM SIGN URU TIMES MIN -12348 ; [.4B66.0020.0002] # CUNEIFORM SIGN URU TIMES PA -12349 ; [.4B67.0020.0002] # CUNEIFORM SIGN URU TIMES SHE -1234A ; [.4B68.0020.0002] # CUNEIFORM SIGN URU TIMES SIG4 -1234B ; [.4B69.0020.0002] # CUNEIFORM SIGN URU TIMES TU -1234C ; [.4B6A.0020.0002] # CUNEIFORM SIGN URU TIMES U PLUS GUD -1234D ; [.4B6B.0020.0002] # CUNEIFORM SIGN URU TIMES UD -1234E ; [.4B6C.0020.0002] # CUNEIFORM SIGN URU TIMES URUDA -1234F ; [.4B6D.0020.0002] # CUNEIFORM SIGN URUDA -12350 ; [.4B6E.0020.0002] # CUNEIFORM SIGN URUDA TIMES U -12351 ; [.4B6F.0020.0002] # CUNEIFORM SIGN USH -12352 ; [.4B70.0020.0002] # CUNEIFORM SIGN USH TIMES A -12353 ; [.4B71.0020.0002] # CUNEIFORM SIGN USH TIMES KU -12354 ; [.4B72.0020.0002] # CUNEIFORM SIGN USH TIMES KUR -12355 ; [.4B73.0020.0002] # CUNEIFORM SIGN USH TIMES TAK4 -12356 ; [.4B74.0020.0002] # CUNEIFORM SIGN USHX -12357 ; [.4B75.0020.0002] # CUNEIFORM SIGN USH2 -12358 ; [.4B76.0020.0002] # CUNEIFORM SIGN USHUMX -12359 ; [.4B77.0020.0002] # CUNEIFORM SIGN UTUKI -1235A ; [.4B78.0020.0002] # CUNEIFORM SIGN UZ3 -1235B ; [.4B79.0020.0002] # CUNEIFORM SIGN UZ3 TIMES KASKAL -1235C ; [.4B7A.0020.0002] # CUNEIFORM SIGN UZU -1235D ; [.4B7B.0020.0002] # CUNEIFORM SIGN ZA -1235E ; [.4B7C.0020.0002] # CUNEIFORM SIGN ZA TENU -1235F ; [.4B7D.0020.0002] # CUNEIFORM SIGN ZA SQUARED TIMES KUR -12360 ; [.4B7E.0020.0002] # CUNEIFORM SIGN ZAG -12361 ; [.4B7F.0020.0002] # CUNEIFORM SIGN ZAMX -12362 ; [.4B80.0020.0002] # CUNEIFORM SIGN ZE2 -12363 ; [.4B81.0020.0002] # CUNEIFORM SIGN ZI -12364 ; [.4B82.0020.0002] # CUNEIFORM SIGN ZI OVER ZI -12365 ; [.4B83.0020.0002] # CUNEIFORM SIGN ZI3 -12366 ; [.4B84.0020.0002] # CUNEIFORM SIGN ZIB -12367 ; [.4B85.0020.0002] # CUNEIFORM SIGN ZIB KABA TENU -12368 ; [.4B86.0020.0002] # CUNEIFORM SIGN ZIG -12369 ; [.4B87.0020.0002] # CUNEIFORM SIGN ZIZ2 -1236A ; [.4B88.0020.0002] # CUNEIFORM SIGN ZU -1236B ; [.4B89.0020.0002] # CUNEIFORM SIGN ZU5 -1236C ; [.4B8A.0020.0002] # CUNEIFORM SIGN ZU5 TIMES A -1236D ; [.4B8B.0020.0002] # CUNEIFORM SIGN ZUBUR -1236E ; [.4B8C.0020.0002] # CUNEIFORM SIGN ZUM -1236F ; [.4B8D.0020.0002] # CUNEIFORM SIGN KAP ELAMITE -12370 ; [.4B8E.0020.0002] # CUNEIFORM SIGN AB TIMES NUN -12371 ; [.4B8F.0020.0002] # CUNEIFORM SIGN AB2 TIMES A -12372 ; [.4B90.0020.0002] # CUNEIFORM SIGN AMAR TIMES KUG -12373 ; [.4B91.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH -12374 ; [.4B92.0020.0002] # CUNEIFORM SIGN DAG3 -12375 ; [.4B93.0020.0002] # CUNEIFORM SIGN DISH PLUS SHU -12376 ; [.4B94.0020.0002] # CUNEIFORM SIGN DUB TIMES SHE -12377 ; [.4B95.0020.0002] # CUNEIFORM SIGN EZEN TIMES GUD -12378 ; [.4B96.0020.0002] # CUNEIFORM SIGN EZEN TIMES SHE -12379 ; [.4B97.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A -1237A ; [.4B98.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 -1237B ; [.4B99.0020.0002] # CUNEIFORM SIGN GE22 -1237C ; [.4B9A.0020.0002] # CUNEIFORM SIGN GIG -1237D ; [.4B9B.0020.0002] # CUNEIFORM SIGN HUSH -1237E ; [.4B9C.0020.0002] # CUNEIFORM SIGN KA TIMES ANSHE -1237F ; [.4B9D.0020.0002] # CUNEIFORM SIGN KA TIMES ASH3 -12380 ; [.4B9E.0020.0002] # CUNEIFORM SIGN KA TIMES GISH -12381 ; [.4B9F.0020.0002] # CUNEIFORM SIGN KA TIMES GUD -12382 ; [.4BA0.0020.0002] # CUNEIFORM SIGN KA TIMES HI TIMES ASH2 -12383 ; [.4BA1.0020.0002] # CUNEIFORM SIGN KA TIMES LUM -12384 ; [.4BA2.0020.0002] # CUNEIFORM SIGN KA TIMES PA -12385 ; [.4BA3.0020.0002] # CUNEIFORM SIGN KA TIMES SHUL -12386 ; [.4BA4.0020.0002] # CUNEIFORM SIGN KA TIMES TU -12387 ; [.4BA5.0020.0002] # CUNEIFORM SIGN KA TIMES UR2 -12388 ; [.4BA6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GI -12389 ; [.4BA7.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG TIMES BAD -1238A ; [.4BA8.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL -1238B ; [.4BA9.0020.0002] # CUNEIFORM SIGN LU2 TIMES SHU -1238C ; [.4BAA.0020.0002] # CUNEIFORM SIGN MESH -1238D ; [.4BAB.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES ZA -1238E ; [.4BAC.0020.0002] # CUNEIFORM SIGN NA4 -1238F ; [.4BAD.0020.0002] # CUNEIFORM SIGN NIN -12390 ; [.4BAE.0020.0002] # CUNEIFORM SIGN NIN9 -12391 ; [.4BAF.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES BAL -12392 ; [.4BB0.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GI -12393 ; [.4BB1.0020.0002] # CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES -12394 ; [.4BB2.0020.0002] # CUNEIFORM SIGN PESH2 ASTERISK -12395 ; [.4BB3.0020.0002] # CUNEIFORM SIGN PIR2 -12396 ; [.4BB4.0020.0002] # CUNEIFORM SIGN SAG TIMES IGI GUNU -12397 ; [.4BB5.0020.0002] # CUNEIFORM SIGN TI2 -12398 ; [.4BB6.0020.0002] # CUNEIFORM SIGN UM TIMES ME -12399 ; [.4BB7.0020.0002] # CUNEIFORM SIGN U U -12480 ; [.4BB8.0020.0002] # CUNEIFORM SIGN AB TIMES NUN TENU -12481 ; [.4BB9.0020.0002] # CUNEIFORM SIGN AB TIMES SHU2 -12482 ; [.4BBA.0020.0002] # CUNEIFORM SIGN AD TIMES ESH2 -12483 ; [.4BBB.0020.0002] # CUNEIFORM SIGN BAD TIMES DISH TENU -12484 ; [.4BBC.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES AB2 -12485 ; [.4BBD.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES NI -12486 ; [.4BBE.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES ZA -12487 ; [.4BBF.0020.0002] # CUNEIFORM SIGN BU OVER BU TIMES NA2 -12488 ; [.4BC0.0020.0002] # CUNEIFORM SIGN DA TIMES TAK4 -12489 ; [.4BC1.0020.0002] # CUNEIFORM SIGN DAG TIMES KUR -1248A ; [.4BC2.0020.0002] # CUNEIFORM SIGN DIM TIMES IGI -1248B ; [.4BC3.0020.0002] # CUNEIFORM SIGN DIM TIMES U U U -1248C ; [.4BC4.0020.0002] # CUNEIFORM SIGN DIM2 TIMES UD -1248D ; [.4BC5.0020.0002] # CUNEIFORM SIGN DUG TIMES ANSHE -1248E ; [.4BC6.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH -1248F ; [.4BC7.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH AT LEFT -12490 ; [.4BC8.0020.0002] # CUNEIFORM SIGN DUG TIMES DIN -12491 ; [.4BC9.0020.0002] # CUNEIFORM SIGN DUG TIMES DUN -12492 ; [.4BCA.0020.0002] # CUNEIFORM SIGN DUG TIMES ERIN2 -12493 ; [.4BCB.0020.0002] # CUNEIFORM SIGN DUG TIMES GA -12494 ; [.4BCC.0020.0002] # CUNEIFORM SIGN DUG TIMES GI -12495 ; [.4BCD.0020.0002] # CUNEIFORM SIGN DUG TIMES GIR2 GUNU -12496 ; [.4BCE.0020.0002] # CUNEIFORM SIGN DUG TIMES GISH -12497 ; [.4BCF.0020.0002] # CUNEIFORM SIGN DUG TIMES HA -12498 ; [.4BD0.0020.0002] # CUNEIFORM SIGN DUG TIMES HI -12499 ; [.4BD1.0020.0002] # CUNEIFORM SIGN DUG TIMES IGI GUNU -1249A ; [.4BD2.0020.0002] # CUNEIFORM SIGN DUG TIMES KASKAL -1249B ; [.4BD3.0020.0002] # CUNEIFORM SIGN DUG TIMES KUR -1249C ; [.4BD4.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 -1249D ; [.4BD5.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL -1249E ; [.4BD6.0020.0002] # CUNEIFORM SIGN DUG TIMES LAK-020 -1249F ; [.4BD7.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM -124A0 ; [.4BD8.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM TIMES KUR -124A1 ; [.4BD9.0020.0002] # CUNEIFORM SIGN DUG TIMES LUH PLUS GISH -124A2 ; [.4BDA.0020.0002] # CUNEIFORM SIGN DUG TIMES MASH -124A3 ; [.4BDB.0020.0002] # CUNEIFORM SIGN DUG TIMES MES -124A4 ; [.4BDC.0020.0002] # CUNEIFORM SIGN DUG TIMES MI -124A5 ; [.4BDD.0020.0002] # CUNEIFORM SIGN DUG TIMES NI -124A6 ; [.4BDE.0020.0002] # CUNEIFORM SIGN DUG TIMES PI -124A7 ; [.4BDF.0020.0002] # CUNEIFORM SIGN DUG TIMES SHE -124A8 ; [.4BE0.0020.0002] # CUNEIFORM SIGN DUG TIMES SI GUNU -124A9 ; [.4BE1.0020.0002] # CUNEIFORM SIGN E2 TIMES KUR -124AA ; [.4BE2.0020.0002] # CUNEIFORM SIGN E2 TIMES PAP -124AB ; [.4BE3.0020.0002] # CUNEIFORM SIGN ERIN2 X -124AC ; [.4BE4.0020.0002] # CUNEIFORM SIGN ESH2 CROSSING ESH2 -124AD ; [.4BE5.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ASH -124AE ; [.4BE6.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES HI -124AF ; [.4BE7.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU -124B0 ; [.4BE8.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LA -124B1 ; [.4BE9.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LAL -124B2 ; [.4BEA.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ME -124B3 ; [.4BEB.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES MES -124B4 ; [.4BEC.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES SU -124B5 ; [.4BED.0020.0002] # CUNEIFORM SIGN EZEN TIMES SU -124B6 ; [.4BEE.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAHAR2 -124B7 ; [.4BEF.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM GUNU -124B8 ; [.4BF0.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU -124B9 ; [.4BF1.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL -124BA ; [.4BF2.0020.0002] # CUNEIFORM SIGN GA2 TIMES EREN -124BB ; [.4BF3.0020.0002] # CUNEIFORM SIGN GA2 TIMES GA -124BC ; [.4BF4.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS DI -124BD ; [.4BF5.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS NE -124BE ; [.4BF6.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS A -124BF ; [.4BF7.0020.0002] # CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL -124C0 ; [.4BF8.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM -124C1 ; [.4BF9.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR -124C2 ; [.4BFA.0020.0002] # CUNEIFORM SIGN GA2 TIMES LUH -124C3 ; [.4BFB.0020.0002] # CUNEIFORM SIGN GA2 TIMES MUSH -124C4 ; [.4BFC.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE -124C5 ; [.4BFD.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS E2 -124C6 ; [.4BFE.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS GI -124C7 ; [.4BFF.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHIM -124C8 ; [.4C00.0020.0002] # CUNEIFORM SIGN GA2 TIMES ZIZ2 -124C9 ; [.4C01.0020.0002] # CUNEIFORM SIGN GABA ROTATED NINETY DEGREES -124CA ; [.4C02.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES U -124CB ; [.4C03.0020.0002] # CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH -124CC ; [.4C04.0020.0002] # CUNEIFORM SIGN GU2 TIMES IGI GUNU -124CD ; [.4C05.0020.0002] # CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4 -124CE ; [.4C06.0020.0002] # CUNEIFORM SIGN HA TENU GUNU -124CF ; [.4C07.0020.0002] # CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH -124D0 ; [.4C08.0020.0002] # CUNEIFORM SIGN KA TIMES BU -124D1 ; [.4C09.0020.0002] # CUNEIFORM SIGN KA TIMES KA -124D2 ; [.4C0A.0020.0002] # CUNEIFORM SIGN KA TIMES U U U -124D3 ; [.4C0B.0020.0002] # CUNEIFORM SIGN KA TIMES UR -124D4 ; [.4C0C.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU -124D5 ; [.4C0D.0020.0002] # CUNEIFORM SIGN LAK-003 -124D6 ; [.4C0E.0020.0002] # CUNEIFORM SIGN LAK-021 -124D7 ; [.4C0F.0020.0002] # CUNEIFORM SIGN LAK-025 -124D8 ; [.4C10.0020.0002] # CUNEIFORM SIGN LAK-030 -124D9 ; [.4C11.0020.0002] # CUNEIFORM SIGN LAK-050 -124DA ; [.4C12.0020.0002] # CUNEIFORM SIGN LAK-051 -124DB ; [.4C13.0020.0002] # CUNEIFORM SIGN LAK-062 -124DC ; [.4C14.0020.0002] # CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU -124DD ; [.4C15.0020.0002] # CUNEIFORM SIGN LAK-080 -124DE ; [.4C16.0020.0002] # CUNEIFORM SIGN LAK-081 OVER LAK-081 -124DF ; [.4C17.0020.0002] # CUNEIFORM SIGN LAK-092 -124E0 ; [.4C18.0020.0002] # CUNEIFORM SIGN LAK-130 -124E1 ; [.4C19.0020.0002] # CUNEIFORM SIGN LAK-142 -124E2 ; [.4C1A.0020.0002] # CUNEIFORM SIGN LAK-210 -124E3 ; [.4C1B.0020.0002] # CUNEIFORM SIGN LAK-219 -124E4 ; [.4C1C.0020.0002] # CUNEIFORM SIGN LAK-220 -124E5 ; [.4C1D.0020.0002] # CUNEIFORM SIGN LAK-225 -124E6 ; [.4C1E.0020.0002] # CUNEIFORM SIGN LAK-228 -124E7 ; [.4C1F.0020.0002] # CUNEIFORM SIGN LAK-238 -124E8 ; [.4C20.0020.0002] # CUNEIFORM SIGN LAK-265 -124E9 ; [.4C21.0020.0002] # CUNEIFORM SIGN LAK-266 -124EA ; [.4C22.0020.0002] # CUNEIFORM SIGN LAK-343 -124EB ; [.4C23.0020.0002] # CUNEIFORM SIGN LAK-347 -124EC ; [.4C24.0020.0002] # CUNEIFORM SIGN LAK-348 -124ED ; [.4C25.0020.0002] # CUNEIFORM SIGN LAK-383 -124EE ; [.4C26.0020.0002] # CUNEIFORM SIGN LAK-384 -124EF ; [.4C27.0020.0002] # CUNEIFORM SIGN LAK-390 -124F0 ; [.4C28.0020.0002] # CUNEIFORM SIGN LAK-441 -124F1 ; [.4C29.0020.0002] # CUNEIFORM SIGN LAK-449 -124F2 ; [.4C2A.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES GU -124F3 ; [.4C2B.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES IGI -124F4 ; [.4C2C.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3 -124F5 ; [.4C2D.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3 -124F6 ; [.4C2E.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA -124F7 ; [.4C2F.0020.0002] # CUNEIFORM SIGN LAK-450 -124F8 ; [.4C30.0020.0002] # CUNEIFORM SIGN LAK-457 -124F9 ; [.4C31.0020.0002] # CUNEIFORM SIGN LAK-470 -124FA ; [.4C32.0020.0002] # CUNEIFORM SIGN LAK-483 -124FB ; [.4C33.0020.0002] # CUNEIFORM SIGN LAK-490 -124FC ; [.4C34.0020.0002] # CUNEIFORM SIGN LAK-492 -124FD ; [.4C35.0020.0002] # CUNEIFORM SIGN LAK-493 -124FE ; [.4C36.0020.0002] # CUNEIFORM SIGN LAK-495 -124FF ; [.4C37.0020.0002] # CUNEIFORM SIGN LAK-550 -12500 ; [.4C38.0020.0002] # CUNEIFORM SIGN LAK-608 -12501 ; [.4C39.0020.0002] # CUNEIFORM SIGN LAK-617 -12502 ; [.4C3A.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES ASH -12503 ; [.4C3B.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES BAD -12504 ; [.4C3C.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU -12505 ; [.4C3D.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES KU3 -12506 ; [.4C3E.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES LA -12507 ; [.4C3F.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TAR -12508 ; [.4C40.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TE -12509 ; [.4C41.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES U2 -1250A ; [.4C42.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES UD -1250B ; [.4C43.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES URUDA -1250C ; [.4C44.0020.0002] # CUNEIFORM SIGN LAK-636 -1250D ; [.4C45.0020.0002] # CUNEIFORM SIGN LAK-648 -1250E ; [.4C46.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES DUB -1250F ; [.4C47.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES GA -12510 ; [.4C48.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI -12511 ; [.4C49.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI GUNU -12512 ; [.4C4A.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES NI -12513 ; [.4C4B.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3 -12514 ; [.4C4C.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI -12515 ; [.4C4D.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES UD -12516 ; [.4C4E.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES URUDA -12517 ; [.4C4F.0020.0002] # CUNEIFORM SIGN LAK-724 -12518 ; [.4C50.0020.0002] # CUNEIFORM SIGN LAK-749 -12519 ; [.4C51.0020.0002] # CUNEIFORM SIGN LU2 GUNU TIMES ASH -1251A ; [.4C52.0020.0002] # CUNEIFORM SIGN LU2 TIMES DISH -1251B ; [.4C53.0020.0002] # CUNEIFORM SIGN LU2 TIMES HAL -1251C ; [.4C54.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP -1251D ; [.4C55.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3 -1251E ; [.4C56.0020.0002] # CUNEIFORM SIGN LU2 TIMES TAK4 -1251F ; [.4C57.0020.0002] # CUNEIFORM SIGN MI PLUS ZA7 -12520 ; [.4C58.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES GA -12521 ; [.4C59.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK -12522 ; [.4C5A.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES DIM GUNU -12523 ; [.4C5B.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GISH -12524 ; [.4C5C.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUL -12525 ; [.4C5D.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES HI -12526 ; [.4C5E.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES KESH2 -12527 ; [.4C5F.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES LAK-050 -12528 ; [.4C60.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES MASH -12529 ; [.4C61.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP -1252A ; [.4C62.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U -1252B ; [.4C63.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U PLUS U -1252C ; [.4C64.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES URUDA -1252D ; [.4C65.0020.0002] # CUNEIFORM SIGN SAG GUNU TIMES HA -1252E ; [.4C66.0020.0002] # CUNEIFORM SIGN SAG TIMES EN -1252F ; [.4C67.0020.0002] # CUNEIFORM SIGN SAG TIMES SHE AT LEFT -12530 ; [.4C68.0020.0002] # CUNEIFORM SIGN SAG TIMES TAK4 -12531 ; [.4C69.0020.0002] # CUNEIFORM SIGN SHA6 TENU -12532 ; [.4C6A.0020.0002] # CUNEIFORM SIGN SHE OVER SHE -12533 ; [.4C6B.0020.0002] # CUNEIFORM SIGN SHE PLUS HUB2 -12534 ; [.4C6C.0020.0002] # CUNEIFORM SIGN SHE PLUS NAM2 -12535 ; [.4C6D.0020.0002] # CUNEIFORM SIGN SHE PLUS SAR -12536 ; [.4C6E.0020.0002] # CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI -12537 ; [.4C6F.0020.0002] # CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN -12538 ; [.4C70.0020.0002] # CUNEIFORM SIGN SI TIMES TAK4 -12539 ; [.4C71.0020.0002] # CUNEIFORM SIGN TAK4 PLUS SAG -1253A ; [.4C72.0020.0002] # CUNEIFORM SIGN TUM TIMES GAN2 TENU -1253B ; [.4C73.0020.0002] # CUNEIFORM SIGN TUM TIMES THREE DISH -1253C ; [.4C74.0020.0002] # CUNEIFORM SIGN UR2 INVERTED -1253D ; [.4C75.0020.0002] # CUNEIFORM SIGN UR2 TIMES UD -1253E ; [.4C76.0020.0002] # CUNEIFORM SIGN URU TIMES DARA3 -1253F ; [.4C77.0020.0002] # CUNEIFORM SIGN URU TIMES LAK-668 -12540 ; [.4C78.0020.0002] # CUNEIFORM SIGN URU TIMES LU3 -12541 ; [.4C79.0020.0002] # CUNEIFORM SIGN ZA7 -12542 ; [.4C7A.0020.0002] # CUNEIFORM SIGN ZU OVER ZU PLUS SAR -12543 ; [.4C7B.0020.0002] # CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU -13000 ; [.4C7C.0020.0002] # EGYPTIAN HIEROGLYPH A001 -13001 ; [.4C7D.0020.0002] # EGYPTIAN HIEROGLYPH A002 -13002 ; [.4C7E.0020.0002] # EGYPTIAN HIEROGLYPH A003 -13003 ; [.4C7F.0020.0002] # EGYPTIAN HIEROGLYPH A004 -13004 ; [.4C80.0020.0002] # EGYPTIAN HIEROGLYPH A005 -13005 ; [.4C81.0020.0002] # EGYPTIAN HIEROGLYPH A005A -13006 ; [.4C82.0020.0002] # EGYPTIAN HIEROGLYPH A006 -13007 ; [.4C83.0020.0002] # EGYPTIAN HIEROGLYPH A006A -13008 ; [.4C84.0020.0002] # EGYPTIAN HIEROGLYPH A006B -13009 ; [.4C85.0020.0002] # EGYPTIAN HIEROGLYPH A007 -1300A ; [.4C86.0020.0002] # EGYPTIAN HIEROGLYPH A008 -1300B ; [.4C87.0020.0002] # EGYPTIAN HIEROGLYPH A009 -1300C ; [.4C88.0020.0002] # EGYPTIAN HIEROGLYPH A010 -1300D ; [.4C89.0020.0002] # EGYPTIAN HIEROGLYPH A011 -1300E ; [.4C8A.0020.0002] # EGYPTIAN HIEROGLYPH A012 -1300F ; [.4C8B.0020.0002] # EGYPTIAN HIEROGLYPH A013 -13010 ; [.4C8C.0020.0002] # EGYPTIAN HIEROGLYPH A014 -13011 ; [.4C8D.0020.0002] # EGYPTIAN HIEROGLYPH A014A -13012 ; [.4C8E.0020.0002] # EGYPTIAN HIEROGLYPH A015 -13013 ; [.4C8F.0020.0002] # EGYPTIAN HIEROGLYPH A016 -13014 ; [.4C90.0020.0002] # EGYPTIAN HIEROGLYPH A017 -13015 ; [.4C91.0020.0002] # EGYPTIAN HIEROGLYPH A017A -13016 ; [.4C92.0020.0002] # EGYPTIAN HIEROGLYPH A018 -13017 ; [.4C93.0020.0002] # EGYPTIAN HIEROGLYPH A019 -13018 ; [.4C94.0020.0002] # EGYPTIAN HIEROGLYPH A020 -13019 ; [.4C95.0020.0002] # EGYPTIAN HIEROGLYPH A021 -1301A ; [.4C96.0020.0002] # EGYPTIAN HIEROGLYPH A022 -1301B ; [.4C97.0020.0002] # EGYPTIAN HIEROGLYPH A023 -1301C ; [.4C98.0020.0002] # EGYPTIAN HIEROGLYPH A024 -1301D ; [.4C99.0020.0002] # EGYPTIAN HIEROGLYPH A025 -1301E ; [.4C9A.0020.0002] # EGYPTIAN HIEROGLYPH A026 -1301F ; [.4C9B.0020.0002] # EGYPTIAN HIEROGLYPH A027 -13020 ; [.4C9C.0020.0002] # EGYPTIAN HIEROGLYPH A028 -13021 ; [.4C9D.0020.0002] # EGYPTIAN HIEROGLYPH A029 -13022 ; [.4C9E.0020.0002] # EGYPTIAN HIEROGLYPH A030 -13023 ; [.4C9F.0020.0002] # EGYPTIAN HIEROGLYPH A031 -13024 ; [.4CA0.0020.0002] # EGYPTIAN HIEROGLYPH A032 -13025 ; [.4CA1.0020.0002] # EGYPTIAN HIEROGLYPH A032A -13026 ; [.4CA2.0020.0002] # EGYPTIAN HIEROGLYPH A033 -13027 ; [.4CA3.0020.0002] # EGYPTIAN HIEROGLYPH A034 -13028 ; [.4CA4.0020.0002] # EGYPTIAN HIEROGLYPH A035 -13029 ; [.4CA5.0020.0002] # EGYPTIAN HIEROGLYPH A036 -1302A ; [.4CA6.0020.0002] # EGYPTIAN HIEROGLYPH A037 -1302B ; [.4CA7.0020.0002] # EGYPTIAN HIEROGLYPH A038 -1302C ; [.4CA8.0020.0002] # EGYPTIAN HIEROGLYPH A039 -1302D ; [.4CA9.0020.0002] # EGYPTIAN HIEROGLYPH A040 -1302E ; [.4CAA.0020.0002] # EGYPTIAN HIEROGLYPH A040A -1302F ; [.4CAB.0020.0002] # EGYPTIAN HIEROGLYPH A041 -13030 ; [.4CAC.0020.0002] # EGYPTIAN HIEROGLYPH A042 -13031 ; [.4CAD.0020.0002] # EGYPTIAN HIEROGLYPH A042A -13032 ; [.4CAE.0020.0002] # EGYPTIAN HIEROGLYPH A043 -13033 ; [.4CAF.0020.0002] # EGYPTIAN HIEROGLYPH A043A -13034 ; [.4CB0.0020.0002] # EGYPTIAN HIEROGLYPH A044 -13035 ; [.4CB1.0020.0002] # EGYPTIAN HIEROGLYPH A045 -13036 ; [.4CB2.0020.0002] # EGYPTIAN HIEROGLYPH A045A -13037 ; [.4CB3.0020.0002] # EGYPTIAN HIEROGLYPH A046 -13038 ; [.4CB4.0020.0002] # EGYPTIAN HIEROGLYPH A047 -13039 ; [.4CB5.0020.0002] # EGYPTIAN HIEROGLYPH A048 -1303A ; [.4CB6.0020.0002] # EGYPTIAN HIEROGLYPH A049 -1303B ; [.4CB7.0020.0002] # EGYPTIAN HIEROGLYPH A050 -1303C ; [.4CB8.0020.0002] # EGYPTIAN HIEROGLYPH A051 -1303D ; [.4CB9.0020.0002] # EGYPTIAN HIEROGLYPH A052 -1303E ; [.4CBA.0020.0002] # EGYPTIAN HIEROGLYPH A053 -1303F ; [.4CBB.0020.0002] # EGYPTIAN HIEROGLYPH A054 -13040 ; [.4CBC.0020.0002] # EGYPTIAN HIEROGLYPH A055 -13041 ; [.4CBD.0020.0002] # EGYPTIAN HIEROGLYPH A056 -13042 ; [.4CBE.0020.0002] # EGYPTIAN HIEROGLYPH A057 -13043 ; [.4CBF.0020.0002] # EGYPTIAN HIEROGLYPH A058 -13044 ; [.4CC0.0020.0002] # EGYPTIAN HIEROGLYPH A059 -13045 ; [.4CC1.0020.0002] # EGYPTIAN HIEROGLYPH A060 -13046 ; [.4CC2.0020.0002] # EGYPTIAN HIEROGLYPH A061 -13047 ; [.4CC3.0020.0002] # EGYPTIAN HIEROGLYPH A062 -13048 ; [.4CC4.0020.0002] # EGYPTIAN HIEROGLYPH A063 -13049 ; [.4CC5.0020.0002] # EGYPTIAN HIEROGLYPH A064 -1304A ; [.4CC6.0020.0002] # EGYPTIAN HIEROGLYPH A065 -1304B ; [.4CC7.0020.0002] # EGYPTIAN HIEROGLYPH A066 -1304C ; [.4CC8.0020.0002] # EGYPTIAN HIEROGLYPH A067 -1304D ; [.4CC9.0020.0002] # EGYPTIAN HIEROGLYPH A068 -1304E ; [.4CCA.0020.0002] # EGYPTIAN HIEROGLYPH A069 -1304F ; [.4CCB.0020.0002] # EGYPTIAN HIEROGLYPH A070 -13050 ; [.4CCC.0020.0002] # EGYPTIAN HIEROGLYPH B001 -13051 ; [.4CCD.0020.0002] # EGYPTIAN HIEROGLYPH B002 -13052 ; [.4CCE.0020.0002] # EGYPTIAN HIEROGLYPH B003 -13053 ; [.4CCF.0020.0002] # EGYPTIAN HIEROGLYPH B004 -13054 ; [.4CD0.0020.0002] # EGYPTIAN HIEROGLYPH B005 -13055 ; [.4CD1.0020.0002] # EGYPTIAN HIEROGLYPH B005A -13056 ; [.4CD2.0020.0002] # EGYPTIAN HIEROGLYPH B006 -13057 ; [.4CD3.0020.0002] # EGYPTIAN HIEROGLYPH B007 -13058 ; [.4CD4.0020.0002] # EGYPTIAN HIEROGLYPH B008 -13059 ; [.4CD5.0020.0002] # EGYPTIAN HIEROGLYPH B009 -1305A ; [.4CD6.0020.0002] # EGYPTIAN HIEROGLYPH C001 -1305B ; [.4CD7.0020.0002] # EGYPTIAN HIEROGLYPH C002 -1305C ; [.4CD8.0020.0002] # EGYPTIAN HIEROGLYPH C002A -1305D ; [.4CD9.0020.0002] # EGYPTIAN HIEROGLYPH C002B -1305E ; [.4CDA.0020.0002] # EGYPTIAN HIEROGLYPH C002C -1305F ; [.4CDB.0020.0002] # EGYPTIAN HIEROGLYPH C003 -13060 ; [.4CDC.0020.0002] # EGYPTIAN HIEROGLYPH C004 -13061 ; [.4CDD.0020.0002] # EGYPTIAN HIEROGLYPH C005 -13062 ; [.4CDE.0020.0002] # EGYPTIAN HIEROGLYPH C006 -13063 ; [.4CDF.0020.0002] # EGYPTIAN HIEROGLYPH C007 -13064 ; [.4CE0.0020.0002] # EGYPTIAN HIEROGLYPH C008 -13065 ; [.4CE1.0020.0002] # EGYPTIAN HIEROGLYPH C009 -13066 ; [.4CE2.0020.0002] # EGYPTIAN HIEROGLYPH C010 -13067 ; [.4CE3.0020.0002] # EGYPTIAN HIEROGLYPH C010A -13068 ; [.4CE4.0020.0002] # EGYPTIAN HIEROGLYPH C011 -13069 ; [.4CE5.0020.0002] # EGYPTIAN HIEROGLYPH C012 -1306A ; [.4CE6.0020.0002] # EGYPTIAN HIEROGLYPH C013 -1306B ; [.4CE7.0020.0002] # EGYPTIAN HIEROGLYPH C014 -1306C ; [.4CE8.0020.0002] # EGYPTIAN HIEROGLYPH C015 -1306D ; [.4CE9.0020.0002] # EGYPTIAN HIEROGLYPH C016 -1306E ; [.4CEA.0020.0002] # EGYPTIAN HIEROGLYPH C017 -1306F ; [.4CEB.0020.0002] # EGYPTIAN HIEROGLYPH C018 -13070 ; [.4CEC.0020.0002] # EGYPTIAN HIEROGLYPH C019 -13071 ; [.4CED.0020.0002] # EGYPTIAN HIEROGLYPH C020 -13072 ; [.4CEE.0020.0002] # EGYPTIAN HIEROGLYPH C021 -13073 ; [.4CEF.0020.0002] # EGYPTIAN HIEROGLYPH C022 -13074 ; [.4CF0.0020.0002] # EGYPTIAN HIEROGLYPH C023 -13075 ; [.4CF1.0020.0002] # EGYPTIAN HIEROGLYPH C024 -13076 ; [.4CF2.0020.0002] # EGYPTIAN HIEROGLYPH D001 -13077 ; [.4CF3.0020.0002] # EGYPTIAN HIEROGLYPH D002 -13078 ; [.4CF4.0020.0002] # EGYPTIAN HIEROGLYPH D003 -13079 ; [.4CF5.0020.0002] # EGYPTIAN HIEROGLYPH D004 -1307A ; [.4CF6.0020.0002] # EGYPTIAN HIEROGLYPH D005 -1307B ; [.4CF7.0020.0002] # EGYPTIAN HIEROGLYPH D006 -1307C ; [.4CF8.0020.0002] # EGYPTIAN HIEROGLYPH D007 -1307D ; [.4CF9.0020.0002] # EGYPTIAN HIEROGLYPH D008 -1307E ; [.4CFA.0020.0002] # EGYPTIAN HIEROGLYPH D008A -1307F ; [.4CFB.0020.0002] # EGYPTIAN HIEROGLYPH D009 -13080 ; [.4CFC.0020.0002] # EGYPTIAN HIEROGLYPH D010 -13081 ; [.4CFD.0020.0002] # EGYPTIAN HIEROGLYPH D011 -13082 ; [.4CFE.0020.0002] # EGYPTIAN HIEROGLYPH D012 -13083 ; [.4CFF.0020.0002] # EGYPTIAN HIEROGLYPH D013 -13084 ; [.4D00.0020.0002] # EGYPTIAN HIEROGLYPH D014 -13085 ; [.4D01.0020.0002] # EGYPTIAN HIEROGLYPH D015 -13086 ; [.4D02.0020.0002] # EGYPTIAN HIEROGLYPH D016 -13087 ; [.4D03.0020.0002] # EGYPTIAN HIEROGLYPH D017 -13088 ; [.4D04.0020.0002] # EGYPTIAN HIEROGLYPH D018 -13089 ; [.4D05.0020.0002] # EGYPTIAN HIEROGLYPH D019 -1308A ; [.4D06.0020.0002] # EGYPTIAN HIEROGLYPH D020 -1308B ; [.4D07.0020.0002] # EGYPTIAN HIEROGLYPH D021 -1308C ; [.4D08.0020.0002] # EGYPTIAN HIEROGLYPH D022 -1308D ; [.4D09.0020.0002] # EGYPTIAN HIEROGLYPH D023 -1308E ; [.4D0A.0020.0002] # EGYPTIAN HIEROGLYPH D024 -1308F ; [.4D0B.0020.0002] # EGYPTIAN HIEROGLYPH D025 -13090 ; [.4D0C.0020.0002] # EGYPTIAN HIEROGLYPH D026 -13091 ; [.4D0D.0020.0002] # EGYPTIAN HIEROGLYPH D027 -13092 ; [.4D0E.0020.0002] # EGYPTIAN HIEROGLYPH D027A -13093 ; [.4D0F.0020.0002] # EGYPTIAN HIEROGLYPH D028 -13094 ; [.4D10.0020.0002] # EGYPTIAN HIEROGLYPH D029 -13095 ; [.4D11.0020.0002] # EGYPTIAN HIEROGLYPH D030 -13096 ; [.4D12.0020.0002] # EGYPTIAN HIEROGLYPH D031 -13097 ; [.4D13.0020.0002] # EGYPTIAN HIEROGLYPH D031A -13098 ; [.4D14.0020.0002] # EGYPTIAN HIEROGLYPH D032 -13099 ; [.4D15.0020.0002] # EGYPTIAN HIEROGLYPH D033 -1309A ; [.4D16.0020.0002] # EGYPTIAN HIEROGLYPH D034 -1309B ; [.4D17.0020.0002] # EGYPTIAN HIEROGLYPH D034A -1309C ; [.4D18.0020.0002] # EGYPTIAN HIEROGLYPH D035 -1309D ; [.4D19.0020.0002] # EGYPTIAN HIEROGLYPH D036 -1309E ; [.4D1A.0020.0002] # EGYPTIAN HIEROGLYPH D037 -1309F ; [.4D1B.0020.0002] # EGYPTIAN HIEROGLYPH D038 -130A0 ; [.4D1C.0020.0002] # EGYPTIAN HIEROGLYPH D039 -130A1 ; [.4D1D.0020.0002] # EGYPTIAN HIEROGLYPH D040 -130A2 ; [.4D1E.0020.0002] # EGYPTIAN HIEROGLYPH D041 -130A3 ; [.4D1F.0020.0002] # EGYPTIAN HIEROGLYPH D042 -130A4 ; [.4D20.0020.0002] # EGYPTIAN HIEROGLYPH D043 -130A5 ; [.4D21.0020.0002] # EGYPTIAN HIEROGLYPH D044 -130A6 ; [.4D22.0020.0002] # EGYPTIAN HIEROGLYPH D045 -130A7 ; [.4D23.0020.0002] # EGYPTIAN HIEROGLYPH D046 -130A8 ; [.4D24.0020.0002] # EGYPTIAN HIEROGLYPH D046A -130A9 ; [.4D25.0020.0002] # EGYPTIAN HIEROGLYPH D047 -130AA ; [.4D26.0020.0002] # EGYPTIAN HIEROGLYPH D048 -130AB ; [.4D27.0020.0002] # EGYPTIAN HIEROGLYPH D048A -130AC ; [.4D28.0020.0002] # EGYPTIAN HIEROGLYPH D049 -130AD ; [.4D29.0020.0002] # EGYPTIAN HIEROGLYPH D050 -130AE ; [.4D2A.0020.0002] # EGYPTIAN HIEROGLYPH D050A -130AF ; [.4D2B.0020.0002] # EGYPTIAN HIEROGLYPH D050B -130B0 ; [.4D2C.0020.0002] # EGYPTIAN HIEROGLYPH D050C -130B1 ; [.4D2D.0020.0002] # EGYPTIAN HIEROGLYPH D050D -130B2 ; [.4D2E.0020.0002] # EGYPTIAN HIEROGLYPH D050E -130B3 ; [.4D2F.0020.0002] # EGYPTIAN HIEROGLYPH D050F -130B4 ; [.4D30.0020.0002] # EGYPTIAN HIEROGLYPH D050G -130B5 ; [.4D31.0020.0002] # EGYPTIAN HIEROGLYPH D050H -130B6 ; [.4D32.0020.0002] # EGYPTIAN HIEROGLYPH D050I -130B7 ; [.4D33.0020.0002] # EGYPTIAN HIEROGLYPH D051 -130B8 ; [.4D34.0020.0002] # EGYPTIAN HIEROGLYPH D052 -130B9 ; [.4D35.0020.0002] # EGYPTIAN HIEROGLYPH D052A -130BA ; [.4D36.0020.0002] # EGYPTIAN HIEROGLYPH D053 -130BB ; [.4D37.0020.0002] # EGYPTIAN HIEROGLYPH D054 -130BC ; [.4D38.0020.0002] # EGYPTIAN HIEROGLYPH D054A -130BD ; [.4D39.0020.0002] # EGYPTIAN HIEROGLYPH D055 -130BE ; [.4D3A.0020.0002] # EGYPTIAN HIEROGLYPH D056 -130BF ; [.4D3B.0020.0002] # EGYPTIAN HIEROGLYPH D057 -130C0 ; [.4D3C.0020.0002] # EGYPTIAN HIEROGLYPH D058 -130C1 ; [.4D3D.0020.0002] # EGYPTIAN HIEROGLYPH D059 -130C2 ; [.4D3E.0020.0002] # EGYPTIAN HIEROGLYPH D060 -130C3 ; [.4D3F.0020.0002] # EGYPTIAN HIEROGLYPH D061 -130C4 ; [.4D40.0020.0002] # EGYPTIAN HIEROGLYPH D062 -130C5 ; [.4D41.0020.0002] # EGYPTIAN HIEROGLYPH D063 -130C6 ; [.4D42.0020.0002] # EGYPTIAN HIEROGLYPH D064 -130C7 ; [.4D43.0020.0002] # EGYPTIAN HIEROGLYPH D065 -130C8 ; [.4D44.0020.0002] # EGYPTIAN HIEROGLYPH D066 -130C9 ; [.4D45.0020.0002] # EGYPTIAN HIEROGLYPH D067 -130CA ; [.4D46.0020.0002] # EGYPTIAN HIEROGLYPH D067A -130CB ; [.4D47.0020.0002] # EGYPTIAN HIEROGLYPH D067B -130CC ; [.4D48.0020.0002] # EGYPTIAN HIEROGLYPH D067C -130CD ; [.4D49.0020.0002] # EGYPTIAN HIEROGLYPH D067D -130CE ; [.4D4A.0020.0002] # EGYPTIAN HIEROGLYPH D067E -130CF ; [.4D4B.0020.0002] # EGYPTIAN HIEROGLYPH D067F -130D0 ; [.4D4C.0020.0002] # EGYPTIAN HIEROGLYPH D067G -130D1 ; [.4D4D.0020.0002] # EGYPTIAN HIEROGLYPH D067H -130D2 ; [.4D4E.0020.0002] # EGYPTIAN HIEROGLYPH E001 -130D3 ; [.4D4F.0020.0002] # EGYPTIAN HIEROGLYPH E002 -130D4 ; [.4D50.0020.0002] # EGYPTIAN HIEROGLYPH E003 -130D5 ; [.4D51.0020.0002] # EGYPTIAN HIEROGLYPH E004 -130D6 ; [.4D52.0020.0002] # EGYPTIAN HIEROGLYPH E005 -130D7 ; [.4D53.0020.0002] # EGYPTIAN HIEROGLYPH E006 -130D8 ; [.4D54.0020.0002] # EGYPTIAN HIEROGLYPH E007 -130D9 ; [.4D55.0020.0002] # EGYPTIAN HIEROGLYPH E008 -130DA ; [.4D56.0020.0002] # EGYPTIAN HIEROGLYPH E008A -130DB ; [.4D57.0020.0002] # EGYPTIAN HIEROGLYPH E009 -130DC ; [.4D58.0020.0002] # EGYPTIAN HIEROGLYPH E009A -130DD ; [.4D59.0020.0002] # EGYPTIAN HIEROGLYPH E010 -130DE ; [.4D5A.0020.0002] # EGYPTIAN HIEROGLYPH E011 -130DF ; [.4D5B.0020.0002] # EGYPTIAN HIEROGLYPH E012 -130E0 ; [.4D5C.0020.0002] # EGYPTIAN HIEROGLYPH E013 -130E1 ; [.4D5D.0020.0002] # EGYPTIAN HIEROGLYPH E014 -130E2 ; [.4D5E.0020.0002] # EGYPTIAN HIEROGLYPH E015 -130E3 ; [.4D5F.0020.0002] # EGYPTIAN HIEROGLYPH E016 -130E4 ; [.4D60.0020.0002] # EGYPTIAN HIEROGLYPH E016A -130E5 ; [.4D61.0020.0002] # EGYPTIAN HIEROGLYPH E017 -130E6 ; [.4D62.0020.0002] # EGYPTIAN HIEROGLYPH E017A -130E7 ; [.4D63.0020.0002] # EGYPTIAN HIEROGLYPH E018 -130E8 ; [.4D64.0020.0002] # EGYPTIAN HIEROGLYPH E019 -130E9 ; [.4D65.0020.0002] # EGYPTIAN HIEROGLYPH E020 -130EA ; [.4D66.0020.0002] # EGYPTIAN HIEROGLYPH E020A -130EB ; [.4D67.0020.0002] # EGYPTIAN HIEROGLYPH E021 -130EC ; [.4D68.0020.0002] # EGYPTIAN HIEROGLYPH E022 -130ED ; [.4D69.0020.0002] # EGYPTIAN HIEROGLYPH E023 -130EE ; [.4D6A.0020.0002] # EGYPTIAN HIEROGLYPH E024 -130EF ; [.4D6B.0020.0002] # EGYPTIAN HIEROGLYPH E025 -130F0 ; [.4D6C.0020.0002] # EGYPTIAN HIEROGLYPH E026 -130F1 ; [.4D6D.0020.0002] # EGYPTIAN HIEROGLYPH E027 -130F2 ; [.4D6E.0020.0002] # EGYPTIAN HIEROGLYPH E028 -130F3 ; [.4D6F.0020.0002] # EGYPTIAN HIEROGLYPH E028A -130F4 ; [.4D70.0020.0002] # EGYPTIAN HIEROGLYPH E029 -130F5 ; [.4D71.0020.0002] # EGYPTIAN HIEROGLYPH E030 -130F6 ; [.4D72.0020.0002] # EGYPTIAN HIEROGLYPH E031 -130F7 ; [.4D73.0020.0002] # EGYPTIAN HIEROGLYPH E032 -130F8 ; [.4D74.0020.0002] # EGYPTIAN HIEROGLYPH E033 -130F9 ; [.4D75.0020.0002] # EGYPTIAN HIEROGLYPH E034 -130FA ; [.4D76.0020.0002] # EGYPTIAN HIEROGLYPH E034A -130FB ; [.4D77.0020.0002] # EGYPTIAN HIEROGLYPH E036 -130FC ; [.4D78.0020.0002] # EGYPTIAN HIEROGLYPH E037 -130FD ; [.4D79.0020.0002] # EGYPTIAN HIEROGLYPH E038 -130FE ; [.4D7A.0020.0002] # EGYPTIAN HIEROGLYPH F001 -130FF ; [.4D7B.0020.0002] # EGYPTIAN HIEROGLYPH F001A -13100 ; [.4D7C.0020.0002] # EGYPTIAN HIEROGLYPH F002 -13101 ; [.4D7D.0020.0002] # EGYPTIAN HIEROGLYPH F003 -13102 ; [.4D7E.0020.0002] # EGYPTIAN HIEROGLYPH F004 -13103 ; [.4D7F.0020.0002] # EGYPTIAN HIEROGLYPH F005 -13104 ; [.4D80.0020.0002] # EGYPTIAN HIEROGLYPH F006 -13105 ; [.4D81.0020.0002] # EGYPTIAN HIEROGLYPH F007 -13106 ; [.4D82.0020.0002] # EGYPTIAN HIEROGLYPH F008 -13107 ; [.4D83.0020.0002] # EGYPTIAN HIEROGLYPH F009 -13108 ; [.4D84.0020.0002] # EGYPTIAN HIEROGLYPH F010 -13109 ; [.4D85.0020.0002] # EGYPTIAN HIEROGLYPH F011 -1310A ; [.4D86.0020.0002] # EGYPTIAN HIEROGLYPH F012 -1310B ; [.4D87.0020.0002] # EGYPTIAN HIEROGLYPH F013 -1310C ; [.4D88.0020.0002] # EGYPTIAN HIEROGLYPH F013A -1310D ; [.4D89.0020.0002] # EGYPTIAN HIEROGLYPH F014 -1310E ; [.4D8A.0020.0002] # EGYPTIAN HIEROGLYPH F015 -1310F ; [.4D8B.0020.0002] # EGYPTIAN HIEROGLYPH F016 -13110 ; [.4D8C.0020.0002] # EGYPTIAN HIEROGLYPH F017 -13111 ; [.4D8D.0020.0002] # EGYPTIAN HIEROGLYPH F018 -13112 ; [.4D8E.0020.0002] # EGYPTIAN HIEROGLYPH F019 -13113 ; [.4D8F.0020.0002] # EGYPTIAN HIEROGLYPH F020 -13114 ; [.4D90.0020.0002] # EGYPTIAN HIEROGLYPH F021 -13115 ; [.4D91.0020.0002] # EGYPTIAN HIEROGLYPH F021A -13116 ; [.4D92.0020.0002] # EGYPTIAN HIEROGLYPH F022 -13117 ; [.4D93.0020.0002] # EGYPTIAN HIEROGLYPH F023 -13118 ; [.4D94.0020.0002] # EGYPTIAN HIEROGLYPH F024 -13119 ; [.4D95.0020.0002] # EGYPTIAN HIEROGLYPH F025 -1311A ; [.4D96.0020.0002] # EGYPTIAN HIEROGLYPH F026 -1311B ; [.4D97.0020.0002] # EGYPTIAN HIEROGLYPH F027 -1311C ; [.4D98.0020.0002] # EGYPTIAN HIEROGLYPH F028 -1311D ; [.4D99.0020.0002] # EGYPTIAN HIEROGLYPH F029 -1311E ; [.4D9A.0020.0002] # EGYPTIAN HIEROGLYPH F030 -1311F ; [.4D9B.0020.0002] # EGYPTIAN HIEROGLYPH F031 -13120 ; [.4D9C.0020.0002] # EGYPTIAN HIEROGLYPH F031A -13121 ; [.4D9D.0020.0002] # EGYPTIAN HIEROGLYPH F032 -13122 ; [.4D9E.0020.0002] # EGYPTIAN HIEROGLYPH F033 -13123 ; [.4D9F.0020.0002] # EGYPTIAN HIEROGLYPH F034 -13124 ; [.4DA0.0020.0002] # EGYPTIAN HIEROGLYPH F035 -13125 ; [.4DA1.0020.0002] # EGYPTIAN HIEROGLYPH F036 -13126 ; [.4DA2.0020.0002] # EGYPTIAN HIEROGLYPH F037 -13127 ; [.4DA3.0020.0002] # EGYPTIAN HIEROGLYPH F037A -13128 ; [.4DA4.0020.0002] # EGYPTIAN HIEROGLYPH F038 -13129 ; [.4DA5.0020.0002] # EGYPTIAN HIEROGLYPH F038A -1312A ; [.4DA6.0020.0002] # EGYPTIAN HIEROGLYPH F039 -1312B ; [.4DA7.0020.0002] # EGYPTIAN HIEROGLYPH F040 -1312C ; [.4DA8.0020.0002] # EGYPTIAN HIEROGLYPH F041 -1312D ; [.4DA9.0020.0002] # EGYPTIAN HIEROGLYPH F042 -1312E ; [.4DAA.0020.0002] # EGYPTIAN HIEROGLYPH F043 -1312F ; [.4DAB.0020.0002] # EGYPTIAN HIEROGLYPH F044 -13130 ; [.4DAC.0020.0002] # EGYPTIAN HIEROGLYPH F045 -13131 ; [.4DAD.0020.0002] # EGYPTIAN HIEROGLYPH F045A -13132 ; [.4DAE.0020.0002] # EGYPTIAN HIEROGLYPH F046 -13133 ; [.4DAF.0020.0002] # EGYPTIAN HIEROGLYPH F046A -13134 ; [.4DB0.0020.0002] # EGYPTIAN HIEROGLYPH F047 -13135 ; [.4DB1.0020.0002] # EGYPTIAN HIEROGLYPH F047A -13136 ; [.4DB2.0020.0002] # EGYPTIAN HIEROGLYPH F048 -13137 ; [.4DB3.0020.0002] # EGYPTIAN HIEROGLYPH F049 -13138 ; [.4DB4.0020.0002] # EGYPTIAN HIEROGLYPH F050 -13139 ; [.4DB5.0020.0002] # EGYPTIAN HIEROGLYPH F051 -1313A ; [.4DB6.0020.0002] # EGYPTIAN HIEROGLYPH F051A -1313B ; [.4DB7.0020.0002] # EGYPTIAN HIEROGLYPH F051B -1313C ; [.4DB8.0020.0002] # EGYPTIAN HIEROGLYPH F051C -1313D ; [.4DB9.0020.0002] # EGYPTIAN HIEROGLYPH F052 -1313E ; [.4DBA.0020.0002] # EGYPTIAN HIEROGLYPH F053 -1313F ; [.4DBB.0020.0002] # EGYPTIAN HIEROGLYPH G001 -13140 ; [.4DBC.0020.0002] # EGYPTIAN HIEROGLYPH G002 -13141 ; [.4DBD.0020.0002] # EGYPTIAN HIEROGLYPH G003 -13142 ; [.4DBE.0020.0002] # EGYPTIAN HIEROGLYPH G004 -13143 ; [.4DBF.0020.0002] # EGYPTIAN HIEROGLYPH G005 -13144 ; [.4DC0.0020.0002] # EGYPTIAN HIEROGLYPH G006 -13145 ; [.4DC1.0020.0002] # EGYPTIAN HIEROGLYPH G006A -13146 ; [.4DC2.0020.0002] # EGYPTIAN HIEROGLYPH G007 -13147 ; [.4DC3.0020.0002] # EGYPTIAN HIEROGLYPH G007A -13148 ; [.4DC4.0020.0002] # EGYPTIAN HIEROGLYPH G007B -13149 ; [.4DC5.0020.0002] # EGYPTIAN HIEROGLYPH G008 -1314A ; [.4DC6.0020.0002] # EGYPTIAN HIEROGLYPH G009 -1314B ; [.4DC7.0020.0002] # EGYPTIAN HIEROGLYPH G010 -1314C ; [.4DC8.0020.0002] # EGYPTIAN HIEROGLYPH G011 -1314D ; [.4DC9.0020.0002] # EGYPTIAN HIEROGLYPH G011A -1314E ; [.4DCA.0020.0002] # EGYPTIAN HIEROGLYPH G012 -1314F ; [.4DCB.0020.0002] # EGYPTIAN HIEROGLYPH G013 -13150 ; [.4DCC.0020.0002] # EGYPTIAN HIEROGLYPH G014 -13151 ; [.4DCD.0020.0002] # EGYPTIAN HIEROGLYPH G015 -13152 ; [.4DCE.0020.0002] # EGYPTIAN HIEROGLYPH G016 -13153 ; [.4DCF.0020.0002] # EGYPTIAN HIEROGLYPH G017 -13154 ; [.4DD0.0020.0002] # EGYPTIAN HIEROGLYPH G018 -13155 ; [.4DD1.0020.0002] # EGYPTIAN HIEROGLYPH G019 -13156 ; [.4DD2.0020.0002] # EGYPTIAN HIEROGLYPH G020 -13157 ; [.4DD3.0020.0002] # EGYPTIAN HIEROGLYPH G020A -13158 ; [.4DD4.0020.0002] # EGYPTIAN HIEROGLYPH G021 -13159 ; [.4DD5.0020.0002] # EGYPTIAN HIEROGLYPH G022 -1315A ; [.4DD6.0020.0002] # EGYPTIAN HIEROGLYPH G023 -1315B ; [.4DD7.0020.0002] # EGYPTIAN HIEROGLYPH G024 -1315C ; [.4DD8.0020.0002] # EGYPTIAN HIEROGLYPH G025 -1315D ; [.4DD9.0020.0002] # EGYPTIAN HIEROGLYPH G026 -1315E ; [.4DDA.0020.0002] # EGYPTIAN HIEROGLYPH G026A -1315F ; [.4DDB.0020.0002] # EGYPTIAN HIEROGLYPH G027 -13160 ; [.4DDC.0020.0002] # EGYPTIAN HIEROGLYPH G028 -13161 ; [.4DDD.0020.0002] # EGYPTIAN HIEROGLYPH G029 -13162 ; [.4DDE.0020.0002] # EGYPTIAN HIEROGLYPH G030 -13163 ; [.4DDF.0020.0002] # EGYPTIAN HIEROGLYPH G031 -13164 ; [.4DE0.0020.0002] # EGYPTIAN HIEROGLYPH G032 -13165 ; [.4DE1.0020.0002] # EGYPTIAN HIEROGLYPH G033 -13166 ; [.4DE2.0020.0002] # EGYPTIAN HIEROGLYPH G034 -13167 ; [.4DE3.0020.0002] # EGYPTIAN HIEROGLYPH G035 -13168 ; [.4DE4.0020.0002] # EGYPTIAN HIEROGLYPH G036 -13169 ; [.4DE5.0020.0002] # EGYPTIAN HIEROGLYPH G036A -1316A ; [.4DE6.0020.0002] # EGYPTIAN HIEROGLYPH G037 -1316B ; [.4DE7.0020.0002] # EGYPTIAN HIEROGLYPH G037A -1316C ; [.4DE8.0020.0002] # EGYPTIAN HIEROGLYPH G038 -1316D ; [.4DE9.0020.0002] # EGYPTIAN HIEROGLYPH G039 -1316E ; [.4DEA.0020.0002] # EGYPTIAN HIEROGLYPH G040 -1316F ; [.4DEB.0020.0002] # EGYPTIAN HIEROGLYPH G041 -13170 ; [.4DEC.0020.0002] # EGYPTIAN HIEROGLYPH G042 -13171 ; [.4DED.0020.0002] # EGYPTIAN HIEROGLYPH G043 -13172 ; [.4DEE.0020.0002] # EGYPTIAN HIEROGLYPH G043A -13173 ; [.4DEF.0020.0002] # EGYPTIAN HIEROGLYPH G044 -13174 ; [.4DF0.0020.0002] # EGYPTIAN HIEROGLYPH G045 -13175 ; [.4DF1.0020.0002] # EGYPTIAN HIEROGLYPH G045A -13176 ; [.4DF2.0020.0002] # EGYPTIAN HIEROGLYPH G046 -13177 ; [.4DF3.0020.0002] # EGYPTIAN HIEROGLYPH G047 -13178 ; [.4DF4.0020.0002] # EGYPTIAN HIEROGLYPH G048 -13179 ; [.4DF5.0020.0002] # EGYPTIAN HIEROGLYPH G049 -1317A ; [.4DF6.0020.0002] # EGYPTIAN HIEROGLYPH G050 -1317B ; [.4DF7.0020.0002] # EGYPTIAN HIEROGLYPH G051 -1317C ; [.4DF8.0020.0002] # EGYPTIAN HIEROGLYPH G052 -1317D ; [.4DF9.0020.0002] # EGYPTIAN HIEROGLYPH G053 -1317E ; [.4DFA.0020.0002] # EGYPTIAN HIEROGLYPH G054 -1317F ; [.4DFB.0020.0002] # EGYPTIAN HIEROGLYPH H001 -13180 ; [.4DFC.0020.0002] # EGYPTIAN HIEROGLYPH H002 -13181 ; [.4DFD.0020.0002] # EGYPTIAN HIEROGLYPH H003 -13182 ; [.4DFE.0020.0002] # EGYPTIAN HIEROGLYPH H004 -13183 ; [.4DFF.0020.0002] # EGYPTIAN HIEROGLYPH H005 -13184 ; [.4E00.0020.0002] # EGYPTIAN HIEROGLYPH H006 -13185 ; [.4E01.0020.0002] # EGYPTIAN HIEROGLYPH H006A -13186 ; [.4E02.0020.0002] # EGYPTIAN HIEROGLYPH H007 -13187 ; [.4E03.0020.0002] # EGYPTIAN HIEROGLYPH H008 -13188 ; [.4E04.0020.0002] # EGYPTIAN HIEROGLYPH I001 -13189 ; [.4E05.0020.0002] # EGYPTIAN HIEROGLYPH I002 -1318A ; [.4E06.0020.0002] # EGYPTIAN HIEROGLYPH I003 -1318B ; [.4E07.0020.0002] # EGYPTIAN HIEROGLYPH I004 -1318C ; [.4E08.0020.0002] # EGYPTIAN HIEROGLYPH I005 -1318D ; [.4E09.0020.0002] # EGYPTIAN HIEROGLYPH I005A -1318E ; [.4E0A.0020.0002] # EGYPTIAN HIEROGLYPH I006 -1318F ; [.4E0B.0020.0002] # EGYPTIAN HIEROGLYPH I007 -13190 ; [.4E0C.0020.0002] # EGYPTIAN HIEROGLYPH I008 -13191 ; [.4E0D.0020.0002] # EGYPTIAN HIEROGLYPH I009 -13192 ; [.4E0E.0020.0002] # EGYPTIAN HIEROGLYPH I009A -13193 ; [.4E0F.0020.0002] # EGYPTIAN HIEROGLYPH I010 -13194 ; [.4E10.0020.0002] # EGYPTIAN HIEROGLYPH I010A -13195 ; [.4E11.0020.0002] # EGYPTIAN HIEROGLYPH I011 -13196 ; [.4E12.0020.0002] # EGYPTIAN HIEROGLYPH I011A -13197 ; [.4E13.0020.0002] # EGYPTIAN HIEROGLYPH I012 -13198 ; [.4E14.0020.0002] # EGYPTIAN HIEROGLYPH I013 -13199 ; [.4E15.0020.0002] # EGYPTIAN HIEROGLYPH I014 -1319A ; [.4E16.0020.0002] # EGYPTIAN HIEROGLYPH I015 -1319B ; [.4E17.0020.0002] # EGYPTIAN HIEROGLYPH K001 -1319C ; [.4E18.0020.0002] # EGYPTIAN HIEROGLYPH K002 -1319D ; [.4E19.0020.0002] # EGYPTIAN HIEROGLYPH K003 -1319E ; [.4E1A.0020.0002] # EGYPTIAN HIEROGLYPH K004 -1319F ; [.4E1B.0020.0002] # EGYPTIAN HIEROGLYPH K005 -131A0 ; [.4E1C.0020.0002] # EGYPTIAN HIEROGLYPH K006 -131A1 ; [.4E1D.0020.0002] # EGYPTIAN HIEROGLYPH K007 -131A2 ; [.4E1E.0020.0002] # EGYPTIAN HIEROGLYPH K008 -131A3 ; [.4E1F.0020.0002] # EGYPTIAN HIEROGLYPH L001 -131A4 ; [.4E20.0020.0002] # EGYPTIAN HIEROGLYPH L002 -131A5 ; [.4E21.0020.0002] # EGYPTIAN HIEROGLYPH L002A -131A6 ; [.4E22.0020.0002] # EGYPTIAN HIEROGLYPH L003 -131A7 ; [.4E23.0020.0002] # EGYPTIAN HIEROGLYPH L004 -131A8 ; [.4E24.0020.0002] # EGYPTIAN HIEROGLYPH L005 -131A9 ; [.4E25.0020.0002] # EGYPTIAN HIEROGLYPH L006 -131AA ; [.4E26.0020.0002] # EGYPTIAN HIEROGLYPH L006A -131AB ; [.4E27.0020.0002] # EGYPTIAN HIEROGLYPH L007 -131AC ; [.4E28.0020.0002] # EGYPTIAN HIEROGLYPH L008 -131AD ; [.4E29.0020.0002] # EGYPTIAN HIEROGLYPH M001 -131AE ; [.4E2A.0020.0002] # EGYPTIAN HIEROGLYPH M001A -131AF ; [.4E2B.0020.0002] # EGYPTIAN HIEROGLYPH M001B -131B0 ; [.4E2C.0020.0002] # EGYPTIAN HIEROGLYPH M002 -131B1 ; [.4E2D.0020.0002] # EGYPTIAN HIEROGLYPH M003 -131B2 ; [.4E2E.0020.0002] # EGYPTIAN HIEROGLYPH M003A -131B3 ; [.4E2F.0020.0002] # EGYPTIAN HIEROGLYPH M004 -131B4 ; [.4E30.0020.0002] # EGYPTIAN HIEROGLYPH M005 -131B5 ; [.4E31.0020.0002] # EGYPTIAN HIEROGLYPH M006 -131B6 ; [.4E32.0020.0002] # EGYPTIAN HIEROGLYPH M007 -131B7 ; [.4E33.0020.0002] # EGYPTIAN HIEROGLYPH M008 -131B8 ; [.4E34.0020.0002] # EGYPTIAN HIEROGLYPH M009 -131B9 ; [.4E35.0020.0002] # EGYPTIAN HIEROGLYPH M010 -131BA ; [.4E36.0020.0002] # EGYPTIAN HIEROGLYPH M010A -131BB ; [.4E37.0020.0002] # EGYPTIAN HIEROGLYPH M011 -131BC ; [.4E38.0020.0002] # EGYPTIAN HIEROGLYPH M012 -131BD ; [.4E39.0020.0002] # EGYPTIAN HIEROGLYPH M012A -131BE ; [.4E3A.0020.0002] # EGYPTIAN HIEROGLYPH M012B -131BF ; [.4E3B.0020.0002] # EGYPTIAN HIEROGLYPH M012C -131C0 ; [.4E3C.0020.0002] # EGYPTIAN HIEROGLYPH M012D -131C1 ; [.4E3D.0020.0002] # EGYPTIAN HIEROGLYPH M012E -131C2 ; [.4E3E.0020.0002] # EGYPTIAN HIEROGLYPH M012F -131C3 ; [.4E3F.0020.0002] # EGYPTIAN HIEROGLYPH M012G -131C4 ; [.4E40.0020.0002] # EGYPTIAN HIEROGLYPH M012H -131C5 ; [.4E41.0020.0002] # EGYPTIAN HIEROGLYPH M013 -131C6 ; [.4E42.0020.0002] # EGYPTIAN HIEROGLYPH M014 -131C7 ; [.4E43.0020.0002] # EGYPTIAN HIEROGLYPH M015 -131C8 ; [.4E44.0020.0002] # EGYPTIAN HIEROGLYPH M015A -131C9 ; [.4E45.0020.0002] # EGYPTIAN HIEROGLYPH M016 -131CA ; [.4E46.0020.0002] # EGYPTIAN HIEROGLYPH M016A -131CB ; [.4E47.0020.0002] # EGYPTIAN HIEROGLYPH M017 -131CC ; [.4E48.0020.0002] # EGYPTIAN HIEROGLYPH M017A -131CD ; [.4E49.0020.0002] # EGYPTIAN HIEROGLYPH M018 -131CE ; [.4E4A.0020.0002] # EGYPTIAN HIEROGLYPH M019 -131CF ; [.4E4B.0020.0002] # EGYPTIAN HIEROGLYPH M020 -131D0 ; [.4E4C.0020.0002] # EGYPTIAN HIEROGLYPH M021 -131D1 ; [.4E4D.0020.0002] # EGYPTIAN HIEROGLYPH M022 -131D2 ; [.4E4E.0020.0002] # EGYPTIAN HIEROGLYPH M022A -131D3 ; [.4E4F.0020.0002] # EGYPTIAN HIEROGLYPH M023 -131D4 ; [.4E50.0020.0002] # EGYPTIAN HIEROGLYPH M024 -131D5 ; [.4E51.0020.0002] # EGYPTIAN HIEROGLYPH M024A -131D6 ; [.4E52.0020.0002] # EGYPTIAN HIEROGLYPH M025 -131D7 ; [.4E53.0020.0002] # EGYPTIAN HIEROGLYPH M026 -131D8 ; [.4E54.0020.0002] # EGYPTIAN HIEROGLYPH M027 -131D9 ; [.4E55.0020.0002] # EGYPTIAN HIEROGLYPH M028 -131DA ; [.4E56.0020.0002] # EGYPTIAN HIEROGLYPH M028A -131DB ; [.4E57.0020.0002] # EGYPTIAN HIEROGLYPH M029 -131DC ; [.4E58.0020.0002] # EGYPTIAN HIEROGLYPH M030 -131DD ; [.4E59.0020.0002] # EGYPTIAN HIEROGLYPH M031 -131DE ; [.4E5A.0020.0002] # EGYPTIAN HIEROGLYPH M031A -131DF ; [.4E5B.0020.0002] # EGYPTIAN HIEROGLYPH M032 -131E0 ; [.4E5C.0020.0002] # EGYPTIAN HIEROGLYPH M033 -131E1 ; [.4E5D.0020.0002] # EGYPTIAN HIEROGLYPH M033A -131E2 ; [.4E5E.0020.0002] # EGYPTIAN HIEROGLYPH M033B -131E3 ; [.4E5F.0020.0002] # EGYPTIAN HIEROGLYPH M034 -131E4 ; [.4E60.0020.0002] # EGYPTIAN HIEROGLYPH M035 -131E5 ; [.4E61.0020.0002] # EGYPTIAN HIEROGLYPH M036 -131E6 ; [.4E62.0020.0002] # EGYPTIAN HIEROGLYPH M037 -131E7 ; [.4E63.0020.0002] # EGYPTIAN HIEROGLYPH M038 -131E8 ; [.4E64.0020.0002] # EGYPTIAN HIEROGLYPH M039 -131E9 ; [.4E65.0020.0002] # EGYPTIAN HIEROGLYPH M040 -131EA ; [.4E66.0020.0002] # EGYPTIAN HIEROGLYPH M040A -131EB ; [.4E67.0020.0002] # EGYPTIAN HIEROGLYPH M041 -131EC ; [.4E68.0020.0002] # EGYPTIAN HIEROGLYPH M042 -131ED ; [.4E69.0020.0002] # EGYPTIAN HIEROGLYPH M043 -131EE ; [.4E6A.0020.0002] # EGYPTIAN HIEROGLYPH M044 -131EF ; [.4E6B.0020.0002] # EGYPTIAN HIEROGLYPH N001 -131F0 ; [.4E6C.0020.0002] # EGYPTIAN HIEROGLYPH N002 -131F1 ; [.4E6D.0020.0002] # EGYPTIAN HIEROGLYPH N003 -131F2 ; [.4E6E.0020.0002] # EGYPTIAN HIEROGLYPH N004 -131F3 ; [.4E6F.0020.0002] # EGYPTIAN HIEROGLYPH N005 -131F4 ; [.4E70.0020.0002] # EGYPTIAN HIEROGLYPH N006 -131F5 ; [.4E71.0020.0002] # EGYPTIAN HIEROGLYPH N007 -131F6 ; [.4E72.0020.0002] # EGYPTIAN HIEROGLYPH N008 -131F7 ; [.4E73.0020.0002] # EGYPTIAN HIEROGLYPH N009 -131F8 ; [.4E74.0020.0002] # EGYPTIAN HIEROGLYPH N010 -131F9 ; [.4E75.0020.0002] # EGYPTIAN HIEROGLYPH N011 -131FA ; [.4E76.0020.0002] # EGYPTIAN HIEROGLYPH N012 -131FB ; [.4E77.0020.0002] # EGYPTIAN HIEROGLYPH N013 -131FC ; [.4E78.0020.0002] # EGYPTIAN HIEROGLYPH N014 -131FD ; [.4E79.0020.0002] # EGYPTIAN HIEROGLYPH N015 -131FE ; [.4E7A.0020.0002] # EGYPTIAN HIEROGLYPH N016 -131FF ; [.4E7B.0020.0002] # EGYPTIAN HIEROGLYPH N017 -13200 ; [.4E7C.0020.0002] # EGYPTIAN HIEROGLYPH N018 -13201 ; [.4E7D.0020.0002] # EGYPTIAN HIEROGLYPH N018A -13202 ; [.4E7E.0020.0002] # EGYPTIAN HIEROGLYPH N018B -13203 ; [.4E7F.0020.0002] # EGYPTIAN HIEROGLYPH N019 -13204 ; [.4E80.0020.0002] # EGYPTIAN HIEROGLYPH N020 -13205 ; [.4E81.0020.0002] # EGYPTIAN HIEROGLYPH N021 -13206 ; [.4E82.0020.0002] # EGYPTIAN HIEROGLYPH N022 -13207 ; [.4E83.0020.0002] # EGYPTIAN HIEROGLYPH N023 -13208 ; [.4E84.0020.0002] # EGYPTIAN HIEROGLYPH N024 -13209 ; [.4E85.0020.0002] # EGYPTIAN HIEROGLYPH N025 -1320A ; [.4E86.0020.0002] # EGYPTIAN HIEROGLYPH N025A -1320B ; [.4E87.0020.0002] # EGYPTIAN HIEROGLYPH N026 -1320C ; [.4E88.0020.0002] # EGYPTIAN HIEROGLYPH N027 -1320D ; [.4E89.0020.0002] # EGYPTIAN HIEROGLYPH N028 -1320E ; [.4E8A.0020.0002] # EGYPTIAN HIEROGLYPH N029 -1320F ; [.4E8B.0020.0002] # EGYPTIAN HIEROGLYPH N030 -13210 ; [.4E8C.0020.0002] # EGYPTIAN HIEROGLYPH N031 -13211 ; [.4E8D.0020.0002] # EGYPTIAN HIEROGLYPH N032 -13212 ; [.4E8E.0020.0002] # EGYPTIAN HIEROGLYPH N033 -13213 ; [.4E8F.0020.0002] # EGYPTIAN HIEROGLYPH N033A -13214 ; [.4E90.0020.0002] # EGYPTIAN HIEROGLYPH N034 -13215 ; [.4E91.0020.0002] # EGYPTIAN HIEROGLYPH N034A -13216 ; [.4E92.0020.0002] # EGYPTIAN HIEROGLYPH N035 -13217 ; [.4E93.0020.0002] # EGYPTIAN HIEROGLYPH N035A -13218 ; [.4E94.0020.0002] # EGYPTIAN HIEROGLYPH N036 -13219 ; [.4E95.0020.0002] # EGYPTIAN HIEROGLYPH N037 -1321A ; [.4E96.0020.0002] # EGYPTIAN HIEROGLYPH N037A -1321B ; [.4E97.0020.0002] # EGYPTIAN HIEROGLYPH N038 -1321C ; [.4E98.0020.0002] # EGYPTIAN HIEROGLYPH N039 -1321D ; [.4E99.0020.0002] # EGYPTIAN HIEROGLYPH N040 -1321E ; [.4E9A.0020.0002] # EGYPTIAN HIEROGLYPH N041 -1321F ; [.4E9B.0020.0002] # EGYPTIAN HIEROGLYPH N042 -13220 ; [.4E9C.0020.0002] # EGYPTIAN HIEROGLYPH NL001 -13221 ; [.4E9D.0020.0002] # EGYPTIAN HIEROGLYPH NL002 -13222 ; [.4E9E.0020.0002] # EGYPTIAN HIEROGLYPH NL003 -13223 ; [.4E9F.0020.0002] # EGYPTIAN HIEROGLYPH NL004 -13224 ; [.4EA0.0020.0002] # EGYPTIAN HIEROGLYPH NL005 -13225 ; [.4EA1.0020.0002] # EGYPTIAN HIEROGLYPH NL005A -13226 ; [.4EA2.0020.0002] # EGYPTIAN HIEROGLYPH NL006 -13227 ; [.4EA3.0020.0002] # EGYPTIAN HIEROGLYPH NL007 -13228 ; [.4EA4.0020.0002] # EGYPTIAN HIEROGLYPH NL008 -13229 ; [.4EA5.0020.0002] # EGYPTIAN HIEROGLYPH NL009 -1322A ; [.4EA6.0020.0002] # EGYPTIAN HIEROGLYPH NL010 -1322B ; [.4EA7.0020.0002] # EGYPTIAN HIEROGLYPH NL011 -1322C ; [.4EA8.0020.0002] # EGYPTIAN HIEROGLYPH NL012 -1322D ; [.4EA9.0020.0002] # EGYPTIAN HIEROGLYPH NL013 -1322E ; [.4EAA.0020.0002] # EGYPTIAN HIEROGLYPH NL014 -1322F ; [.4EAB.0020.0002] # EGYPTIAN HIEROGLYPH NL015 -13230 ; [.4EAC.0020.0002] # EGYPTIAN HIEROGLYPH NL016 -13231 ; [.4EAD.0020.0002] # EGYPTIAN HIEROGLYPH NL017 -13232 ; [.4EAE.0020.0002] # EGYPTIAN HIEROGLYPH NL017A -13233 ; [.4EAF.0020.0002] # EGYPTIAN HIEROGLYPH NL018 -13234 ; [.4EB0.0020.0002] # EGYPTIAN HIEROGLYPH NL019 -13235 ; [.4EB1.0020.0002] # EGYPTIAN HIEROGLYPH NL020 -13236 ; [.4EB2.0020.0002] # EGYPTIAN HIEROGLYPH NU001 -13237 ; [.4EB3.0020.0002] # EGYPTIAN HIEROGLYPH NU002 -13238 ; [.4EB4.0020.0002] # EGYPTIAN HIEROGLYPH NU003 -13239 ; [.4EB5.0020.0002] # EGYPTIAN HIEROGLYPH NU004 -1323A ; [.4EB6.0020.0002] # EGYPTIAN HIEROGLYPH NU005 -1323B ; [.4EB7.0020.0002] # EGYPTIAN HIEROGLYPH NU006 -1323C ; [.4EB8.0020.0002] # EGYPTIAN HIEROGLYPH NU007 -1323D ; [.4EB9.0020.0002] # EGYPTIAN HIEROGLYPH NU008 -1323E ; [.4EBA.0020.0002] # EGYPTIAN HIEROGLYPH NU009 -1323F ; [.4EBB.0020.0002] # EGYPTIAN HIEROGLYPH NU010 -13240 ; [.4EBC.0020.0002] # EGYPTIAN HIEROGLYPH NU010A -13241 ; [.4EBD.0020.0002] # EGYPTIAN HIEROGLYPH NU011 -13242 ; [.4EBE.0020.0002] # EGYPTIAN HIEROGLYPH NU011A -13243 ; [.4EBF.0020.0002] # EGYPTIAN HIEROGLYPH NU012 -13244 ; [.4EC0.0020.0002] # EGYPTIAN HIEROGLYPH NU013 -13245 ; [.4EC1.0020.0002] # EGYPTIAN HIEROGLYPH NU014 -13246 ; [.4EC2.0020.0002] # EGYPTIAN HIEROGLYPH NU015 -13247 ; [.4EC3.0020.0002] # EGYPTIAN HIEROGLYPH NU016 -13248 ; [.4EC4.0020.0002] # EGYPTIAN HIEROGLYPH NU017 -13249 ; [.4EC5.0020.0002] # EGYPTIAN HIEROGLYPH NU018 -1324A ; [.4EC6.0020.0002] # EGYPTIAN HIEROGLYPH NU018A -1324B ; [.4EC7.0020.0002] # EGYPTIAN HIEROGLYPH NU019 -1324C ; [.4EC8.0020.0002] # EGYPTIAN HIEROGLYPH NU020 -1324D ; [.4EC9.0020.0002] # EGYPTIAN HIEROGLYPH NU021 -1324E ; [.4ECA.0020.0002] # EGYPTIAN HIEROGLYPH NU022 -1324F ; [.4ECB.0020.0002] # EGYPTIAN HIEROGLYPH NU022A -13250 ; [.4ECC.0020.0002] # EGYPTIAN HIEROGLYPH O001 -13251 ; [.4ECD.0020.0002] # EGYPTIAN HIEROGLYPH O001A -13252 ; [.4ECE.0020.0002] # EGYPTIAN HIEROGLYPH O002 -13253 ; [.4ECF.0020.0002] # EGYPTIAN HIEROGLYPH O003 -13254 ; [.4ED0.0020.0002] # EGYPTIAN HIEROGLYPH O004 -13255 ; [.4ED1.0020.0002] # EGYPTIAN HIEROGLYPH O005 -13256 ; [.4ED2.0020.0002] # EGYPTIAN HIEROGLYPH O005A -13257 ; [.4ED3.0020.0002] # EGYPTIAN HIEROGLYPH O006 -13258 ; [.4ED4.0020.0002] # EGYPTIAN HIEROGLYPH O006A -13259 ; [.4ED5.0020.0002] # EGYPTIAN HIEROGLYPH O006B -1325A ; [.4ED6.0020.0002] # EGYPTIAN HIEROGLYPH O006C -1325B ; [.4ED7.0020.0002] # EGYPTIAN HIEROGLYPH O006D -1325C ; [.4ED8.0020.0002] # EGYPTIAN HIEROGLYPH O006E -1325D ; [.4ED9.0020.0002] # EGYPTIAN HIEROGLYPH O006F -1325E ; [.4EDA.0020.0002] # EGYPTIAN HIEROGLYPH O007 -1325F ; [.4EDB.0020.0002] # EGYPTIAN HIEROGLYPH O008 -13260 ; [.4EDC.0020.0002] # EGYPTIAN HIEROGLYPH O009 -13261 ; [.4EDD.0020.0002] # EGYPTIAN HIEROGLYPH O010 -13262 ; [.4EDE.0020.0002] # EGYPTIAN HIEROGLYPH O010A -13263 ; [.4EDF.0020.0002] # EGYPTIAN HIEROGLYPH O010B -13264 ; [.4EE0.0020.0002] # EGYPTIAN HIEROGLYPH O010C -13265 ; [.4EE1.0020.0002] # EGYPTIAN HIEROGLYPH O011 -13266 ; [.4EE2.0020.0002] # EGYPTIAN HIEROGLYPH O012 -13267 ; [.4EE3.0020.0002] # EGYPTIAN HIEROGLYPH O013 -13268 ; [.4EE4.0020.0002] # EGYPTIAN HIEROGLYPH O014 -13269 ; [.4EE5.0020.0002] # EGYPTIAN HIEROGLYPH O015 -1326A ; [.4EE6.0020.0002] # EGYPTIAN HIEROGLYPH O016 -1326B ; [.4EE7.0020.0002] # EGYPTIAN HIEROGLYPH O017 -1326C ; [.4EE8.0020.0002] # EGYPTIAN HIEROGLYPH O018 -1326D ; [.4EE9.0020.0002] # EGYPTIAN HIEROGLYPH O019 -1326E ; [.4EEA.0020.0002] # EGYPTIAN HIEROGLYPH O019A -1326F ; [.4EEB.0020.0002] # EGYPTIAN HIEROGLYPH O020 -13270 ; [.4EEC.0020.0002] # EGYPTIAN HIEROGLYPH O020A -13271 ; [.4EED.0020.0002] # EGYPTIAN HIEROGLYPH O021 -13272 ; [.4EEE.0020.0002] # EGYPTIAN HIEROGLYPH O022 -13273 ; [.4EEF.0020.0002] # EGYPTIAN HIEROGLYPH O023 -13274 ; [.4EF0.0020.0002] # EGYPTIAN HIEROGLYPH O024 -13275 ; [.4EF1.0020.0002] # EGYPTIAN HIEROGLYPH O024A -13276 ; [.4EF2.0020.0002] # EGYPTIAN HIEROGLYPH O025 -13277 ; [.4EF3.0020.0002] # EGYPTIAN HIEROGLYPH O025A -13278 ; [.4EF4.0020.0002] # EGYPTIAN HIEROGLYPH O026 -13279 ; [.4EF5.0020.0002] # EGYPTIAN HIEROGLYPH O027 -1327A ; [.4EF6.0020.0002] # EGYPTIAN HIEROGLYPH O028 -1327B ; [.4EF7.0020.0002] # EGYPTIAN HIEROGLYPH O029 -1327C ; [.4EF8.0020.0002] # EGYPTIAN HIEROGLYPH O029A -1327D ; [.4EF9.0020.0002] # EGYPTIAN HIEROGLYPH O030 -1327E ; [.4EFA.0020.0002] # EGYPTIAN HIEROGLYPH O030A -1327F ; [.4EFB.0020.0002] # EGYPTIAN HIEROGLYPH O031 -13280 ; [.4EFC.0020.0002] # EGYPTIAN HIEROGLYPH O032 -13281 ; [.4EFD.0020.0002] # EGYPTIAN HIEROGLYPH O033 -13282 ; [.4EFE.0020.0002] # EGYPTIAN HIEROGLYPH O033A -13283 ; [.4EFF.0020.0002] # EGYPTIAN HIEROGLYPH O034 -13284 ; [.4F00.0020.0002] # EGYPTIAN HIEROGLYPH O035 -13285 ; [.4F01.0020.0002] # EGYPTIAN HIEROGLYPH O036 -13286 ; [.4F02.0020.0002] # EGYPTIAN HIEROGLYPH O036A -13287 ; [.4F03.0020.0002] # EGYPTIAN HIEROGLYPH O036B -13288 ; [.4F04.0020.0002] # EGYPTIAN HIEROGLYPH O036C -13289 ; [.4F05.0020.0002] # EGYPTIAN HIEROGLYPH O036D -1328A ; [.4F06.0020.0002] # EGYPTIAN HIEROGLYPH O037 -1328B ; [.4F07.0020.0002] # EGYPTIAN HIEROGLYPH O038 -1328C ; [.4F08.0020.0002] # EGYPTIAN HIEROGLYPH O039 -1328D ; [.4F09.0020.0002] # EGYPTIAN HIEROGLYPH O040 -1328E ; [.4F0A.0020.0002] # EGYPTIAN HIEROGLYPH O041 -1328F ; [.4F0B.0020.0002] # EGYPTIAN HIEROGLYPH O042 -13290 ; [.4F0C.0020.0002] # EGYPTIAN HIEROGLYPH O043 -13291 ; [.4F0D.0020.0002] # EGYPTIAN HIEROGLYPH O044 -13292 ; [.4F0E.0020.0002] # EGYPTIAN HIEROGLYPH O045 -13293 ; [.4F0F.0020.0002] # EGYPTIAN HIEROGLYPH O046 -13294 ; [.4F10.0020.0002] # EGYPTIAN HIEROGLYPH O047 -13295 ; [.4F11.0020.0002] # EGYPTIAN HIEROGLYPH O048 -13296 ; [.4F12.0020.0002] # EGYPTIAN HIEROGLYPH O049 -13297 ; [.4F13.0020.0002] # EGYPTIAN HIEROGLYPH O050 -13298 ; [.4F14.0020.0002] # EGYPTIAN HIEROGLYPH O050A -13299 ; [.4F15.0020.0002] # EGYPTIAN HIEROGLYPH O050B -1329A ; [.4F16.0020.0002] # EGYPTIAN HIEROGLYPH O051 -1329B ; [.4F17.0020.0002] # EGYPTIAN HIEROGLYPH P001 -1329C ; [.4F18.0020.0002] # EGYPTIAN HIEROGLYPH P001A -1329D ; [.4F19.0020.0002] # EGYPTIAN HIEROGLYPH P002 -1329E ; [.4F1A.0020.0002] # EGYPTIAN HIEROGLYPH P003 -1329F ; [.4F1B.0020.0002] # EGYPTIAN HIEROGLYPH P003A -132A0 ; [.4F1C.0020.0002] # EGYPTIAN HIEROGLYPH P004 -132A1 ; [.4F1D.0020.0002] # EGYPTIAN HIEROGLYPH P005 -132A2 ; [.4F1E.0020.0002] # EGYPTIAN HIEROGLYPH P006 -132A3 ; [.4F1F.0020.0002] # EGYPTIAN HIEROGLYPH P007 -132A4 ; [.4F20.0020.0002] # EGYPTIAN HIEROGLYPH P008 -132A5 ; [.4F21.0020.0002] # EGYPTIAN HIEROGLYPH P009 -132A6 ; [.4F22.0020.0002] # EGYPTIAN HIEROGLYPH P010 -132A7 ; [.4F23.0020.0002] # EGYPTIAN HIEROGLYPH P011 -132A8 ; [.4F24.0020.0002] # EGYPTIAN HIEROGLYPH Q001 -132A9 ; [.4F25.0020.0002] # EGYPTIAN HIEROGLYPH Q002 -132AA ; [.4F26.0020.0002] # EGYPTIAN HIEROGLYPH Q003 -132AB ; [.4F27.0020.0002] # EGYPTIAN HIEROGLYPH Q004 -132AC ; [.4F28.0020.0002] # EGYPTIAN HIEROGLYPH Q005 -132AD ; [.4F29.0020.0002] # EGYPTIAN HIEROGLYPH Q006 -132AE ; [.4F2A.0020.0002] # EGYPTIAN HIEROGLYPH Q007 -132AF ; [.4F2B.0020.0002] # EGYPTIAN HIEROGLYPH R001 -132B0 ; [.4F2C.0020.0002] # EGYPTIAN HIEROGLYPH R002 -132B1 ; [.4F2D.0020.0002] # EGYPTIAN HIEROGLYPH R002A -132B2 ; [.4F2E.0020.0002] # EGYPTIAN HIEROGLYPH R003 -132B3 ; [.4F2F.0020.0002] # EGYPTIAN HIEROGLYPH R003A -132B4 ; [.4F30.0020.0002] # EGYPTIAN HIEROGLYPH R003B -132B5 ; [.4F31.0020.0002] # EGYPTIAN HIEROGLYPH R004 -132B6 ; [.4F32.0020.0002] # EGYPTIAN HIEROGLYPH R005 -132B7 ; [.4F33.0020.0002] # EGYPTIAN HIEROGLYPH R006 -132B8 ; [.4F34.0020.0002] # EGYPTIAN HIEROGLYPH R007 -132B9 ; [.4F35.0020.0002] # EGYPTIAN HIEROGLYPH R008 -132BA ; [.4F36.0020.0002] # EGYPTIAN HIEROGLYPH R009 -132BB ; [.4F37.0020.0002] # EGYPTIAN HIEROGLYPH R010 -132BC ; [.4F38.0020.0002] # EGYPTIAN HIEROGLYPH R010A -132BD ; [.4F39.0020.0002] # EGYPTIAN HIEROGLYPH R011 -132BE ; [.4F3A.0020.0002] # EGYPTIAN HIEROGLYPH R012 -132BF ; [.4F3B.0020.0002] # EGYPTIAN HIEROGLYPH R013 -132C0 ; [.4F3C.0020.0002] # EGYPTIAN HIEROGLYPH R014 -132C1 ; [.4F3D.0020.0002] # EGYPTIAN HIEROGLYPH R015 -132C2 ; [.4F3E.0020.0002] # EGYPTIAN HIEROGLYPH R016 -132C3 ; [.4F3F.0020.0002] # EGYPTIAN HIEROGLYPH R016A -132C4 ; [.4F40.0020.0002] # EGYPTIAN HIEROGLYPH R017 -132C5 ; [.4F41.0020.0002] # EGYPTIAN HIEROGLYPH R018 -132C6 ; [.4F42.0020.0002] # EGYPTIAN HIEROGLYPH R019 -132C7 ; [.4F43.0020.0002] # EGYPTIAN HIEROGLYPH R020 -132C8 ; [.4F44.0020.0002] # EGYPTIAN HIEROGLYPH R021 -132C9 ; [.4F45.0020.0002] # EGYPTIAN HIEROGLYPH R022 -132CA ; [.4F46.0020.0002] # EGYPTIAN HIEROGLYPH R023 -132CB ; [.4F47.0020.0002] # EGYPTIAN HIEROGLYPH R024 -132CC ; [.4F48.0020.0002] # EGYPTIAN HIEROGLYPH R025 -132CD ; [.4F49.0020.0002] # EGYPTIAN HIEROGLYPH R026 -132CE ; [.4F4A.0020.0002] # EGYPTIAN HIEROGLYPH R027 -132CF ; [.4F4B.0020.0002] # EGYPTIAN HIEROGLYPH R028 -132D0 ; [.4F4C.0020.0002] # EGYPTIAN HIEROGLYPH R029 -132D1 ; [.4F4D.0020.0002] # EGYPTIAN HIEROGLYPH S001 -132D2 ; [.4F4E.0020.0002] # EGYPTIAN HIEROGLYPH S002 -132D3 ; [.4F4F.0020.0002] # EGYPTIAN HIEROGLYPH S002A -132D4 ; [.4F50.0020.0002] # EGYPTIAN HIEROGLYPH S003 -132D5 ; [.4F51.0020.0002] # EGYPTIAN HIEROGLYPH S004 -132D6 ; [.4F52.0020.0002] # EGYPTIAN HIEROGLYPH S005 -132D7 ; [.4F53.0020.0002] # EGYPTIAN HIEROGLYPH S006 -132D8 ; [.4F54.0020.0002] # EGYPTIAN HIEROGLYPH S006A -132D9 ; [.4F55.0020.0002] # EGYPTIAN HIEROGLYPH S007 -132DA ; [.4F56.0020.0002] # EGYPTIAN HIEROGLYPH S008 -132DB ; [.4F57.0020.0002] # EGYPTIAN HIEROGLYPH S009 -132DC ; [.4F58.0020.0002] # EGYPTIAN HIEROGLYPH S010 -132DD ; [.4F59.0020.0002] # EGYPTIAN HIEROGLYPH S011 -132DE ; [.4F5A.0020.0002] # EGYPTIAN HIEROGLYPH S012 -132DF ; [.4F5B.0020.0002] # EGYPTIAN HIEROGLYPH S013 -132E0 ; [.4F5C.0020.0002] # EGYPTIAN HIEROGLYPH S014 -132E1 ; [.4F5D.0020.0002] # EGYPTIAN HIEROGLYPH S014A -132E2 ; [.4F5E.0020.0002] # EGYPTIAN HIEROGLYPH S014B -132E3 ; [.4F5F.0020.0002] # EGYPTIAN HIEROGLYPH S015 -132E4 ; [.4F60.0020.0002] # EGYPTIAN HIEROGLYPH S016 -132E5 ; [.4F61.0020.0002] # EGYPTIAN HIEROGLYPH S017 -132E6 ; [.4F62.0020.0002] # EGYPTIAN HIEROGLYPH S017A -132E7 ; [.4F63.0020.0002] # EGYPTIAN HIEROGLYPH S018 -132E8 ; [.4F64.0020.0002] # EGYPTIAN HIEROGLYPH S019 -132E9 ; [.4F65.0020.0002] # EGYPTIAN HIEROGLYPH S020 -132EA ; [.4F66.0020.0002] # EGYPTIAN HIEROGLYPH S021 -132EB ; [.4F67.0020.0002] # EGYPTIAN HIEROGLYPH S022 -132EC ; [.4F68.0020.0002] # EGYPTIAN HIEROGLYPH S023 -132ED ; [.4F69.0020.0002] # EGYPTIAN HIEROGLYPH S024 -132EE ; [.4F6A.0020.0002] # EGYPTIAN HIEROGLYPH S025 -132EF ; [.4F6B.0020.0002] # EGYPTIAN HIEROGLYPH S026 -132F0 ; [.4F6C.0020.0002] # EGYPTIAN HIEROGLYPH S026A -132F1 ; [.4F6D.0020.0002] # EGYPTIAN HIEROGLYPH S026B -132F2 ; [.4F6E.0020.0002] # EGYPTIAN HIEROGLYPH S027 -132F3 ; [.4F6F.0020.0002] # EGYPTIAN HIEROGLYPH S028 -132F4 ; [.4F70.0020.0002] # EGYPTIAN HIEROGLYPH S029 -132F5 ; [.4F71.0020.0002] # EGYPTIAN HIEROGLYPH S030 -132F6 ; [.4F72.0020.0002] # EGYPTIAN HIEROGLYPH S031 -132F7 ; [.4F73.0020.0002] # EGYPTIAN HIEROGLYPH S032 -132F8 ; [.4F74.0020.0002] # EGYPTIAN HIEROGLYPH S033 -132F9 ; [.4F75.0020.0002] # EGYPTIAN HIEROGLYPH S034 -132FA ; [.4F76.0020.0002] # EGYPTIAN HIEROGLYPH S035 -132FB ; [.4F77.0020.0002] # EGYPTIAN HIEROGLYPH S035A -132FC ; [.4F78.0020.0002] # EGYPTIAN HIEROGLYPH S036 -132FD ; [.4F79.0020.0002] # EGYPTIAN HIEROGLYPH S037 -132FE ; [.4F7A.0020.0002] # EGYPTIAN HIEROGLYPH S038 -132FF ; [.4F7B.0020.0002] # EGYPTIAN HIEROGLYPH S039 -13300 ; [.4F7C.0020.0002] # EGYPTIAN HIEROGLYPH S040 -13301 ; [.4F7D.0020.0002] # EGYPTIAN HIEROGLYPH S041 -13302 ; [.4F7E.0020.0002] # EGYPTIAN HIEROGLYPH S042 -13303 ; [.4F7F.0020.0002] # EGYPTIAN HIEROGLYPH S043 -13304 ; [.4F80.0020.0002] # EGYPTIAN HIEROGLYPH S044 -13305 ; [.4F81.0020.0002] # EGYPTIAN HIEROGLYPH S045 -13306 ; [.4F82.0020.0002] # EGYPTIAN HIEROGLYPH S046 -13307 ; [.4F83.0020.0002] # EGYPTIAN HIEROGLYPH T001 -13308 ; [.4F84.0020.0002] # EGYPTIAN HIEROGLYPH T002 -13309 ; [.4F85.0020.0002] # EGYPTIAN HIEROGLYPH T003 -1330A ; [.4F86.0020.0002] # EGYPTIAN HIEROGLYPH T003A -1330B ; [.4F87.0020.0002] # EGYPTIAN HIEROGLYPH T004 -1330C ; [.4F88.0020.0002] # EGYPTIAN HIEROGLYPH T005 -1330D ; [.4F89.0020.0002] # EGYPTIAN HIEROGLYPH T006 -1330E ; [.4F8A.0020.0002] # EGYPTIAN HIEROGLYPH T007 -1330F ; [.4F8B.0020.0002] # EGYPTIAN HIEROGLYPH T007A -13310 ; [.4F8C.0020.0002] # EGYPTIAN HIEROGLYPH T008 -13311 ; [.4F8D.0020.0002] # EGYPTIAN HIEROGLYPH T008A -13312 ; [.4F8E.0020.0002] # EGYPTIAN HIEROGLYPH T009 -13313 ; [.4F8F.0020.0002] # EGYPTIAN HIEROGLYPH T009A -13314 ; [.4F90.0020.0002] # EGYPTIAN HIEROGLYPH T010 -13315 ; [.4F91.0020.0002] # EGYPTIAN HIEROGLYPH T011 -13316 ; [.4F92.0020.0002] # EGYPTIAN HIEROGLYPH T011A -13317 ; [.4F93.0020.0002] # EGYPTIAN HIEROGLYPH T012 -13318 ; [.4F94.0020.0002] # EGYPTIAN HIEROGLYPH T013 -13319 ; [.4F95.0020.0002] # EGYPTIAN HIEROGLYPH T014 -1331A ; [.4F96.0020.0002] # EGYPTIAN HIEROGLYPH T015 -1331B ; [.4F97.0020.0002] # EGYPTIAN HIEROGLYPH T016 -1331C ; [.4F98.0020.0002] # EGYPTIAN HIEROGLYPH T016A -1331D ; [.4F99.0020.0002] # EGYPTIAN HIEROGLYPH T017 -1331E ; [.4F9A.0020.0002] # EGYPTIAN HIEROGLYPH T018 -1331F ; [.4F9B.0020.0002] # EGYPTIAN HIEROGLYPH T019 -13320 ; [.4F9C.0020.0002] # EGYPTIAN HIEROGLYPH T020 -13321 ; [.4F9D.0020.0002] # EGYPTIAN HIEROGLYPH T021 -13322 ; [.4F9E.0020.0002] # EGYPTIAN HIEROGLYPH T022 -13323 ; [.4F9F.0020.0002] # EGYPTIAN HIEROGLYPH T023 -13324 ; [.4FA0.0020.0002] # EGYPTIAN HIEROGLYPH T024 -13325 ; [.4FA1.0020.0002] # EGYPTIAN HIEROGLYPH T025 -13326 ; [.4FA2.0020.0002] # EGYPTIAN HIEROGLYPH T026 -13327 ; [.4FA3.0020.0002] # EGYPTIAN HIEROGLYPH T027 -13328 ; [.4FA4.0020.0002] # EGYPTIAN HIEROGLYPH T028 -13329 ; [.4FA5.0020.0002] # EGYPTIAN HIEROGLYPH T029 -1332A ; [.4FA6.0020.0002] # EGYPTIAN HIEROGLYPH T030 -1332B ; [.4FA7.0020.0002] # EGYPTIAN HIEROGLYPH T031 -1332C ; [.4FA8.0020.0002] # EGYPTIAN HIEROGLYPH T032 -1332D ; [.4FA9.0020.0002] # EGYPTIAN HIEROGLYPH T032A -1332E ; [.4FAA.0020.0002] # EGYPTIAN HIEROGLYPH T033 -1332F ; [.4FAB.0020.0002] # EGYPTIAN HIEROGLYPH T033A -13330 ; [.4FAC.0020.0002] # EGYPTIAN HIEROGLYPH T034 -13331 ; [.4FAD.0020.0002] # EGYPTIAN HIEROGLYPH T035 -13332 ; [.4FAE.0020.0002] # EGYPTIAN HIEROGLYPH T036 -13333 ; [.4FAF.0020.0002] # EGYPTIAN HIEROGLYPH U001 -13334 ; [.4FB0.0020.0002] # EGYPTIAN HIEROGLYPH U002 -13335 ; [.4FB1.0020.0002] # EGYPTIAN HIEROGLYPH U003 -13336 ; [.4FB2.0020.0002] # EGYPTIAN HIEROGLYPH U004 -13337 ; [.4FB3.0020.0002] # EGYPTIAN HIEROGLYPH U005 -13338 ; [.4FB4.0020.0002] # EGYPTIAN HIEROGLYPH U006 -13339 ; [.4FB5.0020.0002] # EGYPTIAN HIEROGLYPH U006A -1333A ; [.4FB6.0020.0002] # EGYPTIAN HIEROGLYPH U006B -1333B ; [.4FB7.0020.0002] # EGYPTIAN HIEROGLYPH U007 -1333C ; [.4FB8.0020.0002] # EGYPTIAN HIEROGLYPH U008 -1333D ; [.4FB9.0020.0002] # EGYPTIAN HIEROGLYPH U009 -1333E ; [.4FBA.0020.0002] # EGYPTIAN HIEROGLYPH U010 -1333F ; [.4FBB.0020.0002] # EGYPTIAN HIEROGLYPH U011 -13340 ; [.4FBC.0020.0002] # EGYPTIAN HIEROGLYPH U012 -13341 ; [.4FBD.0020.0002] # EGYPTIAN HIEROGLYPH U013 -13342 ; [.4FBE.0020.0002] # EGYPTIAN HIEROGLYPH U014 -13343 ; [.4FBF.0020.0002] # EGYPTIAN HIEROGLYPH U015 -13344 ; [.4FC0.0020.0002] # EGYPTIAN HIEROGLYPH U016 -13345 ; [.4FC1.0020.0002] # EGYPTIAN HIEROGLYPH U017 -13346 ; [.4FC2.0020.0002] # EGYPTIAN HIEROGLYPH U018 -13347 ; [.4FC3.0020.0002] # EGYPTIAN HIEROGLYPH U019 -13348 ; [.4FC4.0020.0002] # EGYPTIAN HIEROGLYPH U020 -13349 ; [.4FC5.0020.0002] # EGYPTIAN HIEROGLYPH U021 -1334A ; [.4FC6.0020.0002] # EGYPTIAN HIEROGLYPH U022 -1334B ; [.4FC7.0020.0002] # EGYPTIAN HIEROGLYPH U023 -1334C ; [.4FC8.0020.0002] # EGYPTIAN HIEROGLYPH U023A -1334D ; [.4FC9.0020.0002] # EGYPTIAN HIEROGLYPH U024 -1334E ; [.4FCA.0020.0002] # EGYPTIAN HIEROGLYPH U025 -1334F ; [.4FCB.0020.0002] # EGYPTIAN HIEROGLYPH U026 -13350 ; [.4FCC.0020.0002] # EGYPTIAN HIEROGLYPH U027 -13351 ; [.4FCD.0020.0002] # EGYPTIAN HIEROGLYPH U028 -13352 ; [.4FCE.0020.0002] # EGYPTIAN HIEROGLYPH U029 -13353 ; [.4FCF.0020.0002] # EGYPTIAN HIEROGLYPH U029A -13354 ; [.4FD0.0020.0002] # EGYPTIAN HIEROGLYPH U030 -13355 ; [.4FD1.0020.0002] # EGYPTIAN HIEROGLYPH U031 -13356 ; [.4FD2.0020.0002] # EGYPTIAN HIEROGLYPH U032 -13357 ; [.4FD3.0020.0002] # EGYPTIAN HIEROGLYPH U032A -13358 ; [.4FD4.0020.0002] # EGYPTIAN HIEROGLYPH U033 -13359 ; [.4FD5.0020.0002] # EGYPTIAN HIEROGLYPH U034 -1335A ; [.4FD6.0020.0002] # EGYPTIAN HIEROGLYPH U035 -1335B ; [.4FD7.0020.0002] # EGYPTIAN HIEROGLYPH U036 -1335C ; [.4FD8.0020.0002] # EGYPTIAN HIEROGLYPH U037 -1335D ; [.4FD9.0020.0002] # EGYPTIAN HIEROGLYPH U038 -1335E ; [.4FDA.0020.0002] # EGYPTIAN HIEROGLYPH U039 -1335F ; [.4FDB.0020.0002] # EGYPTIAN HIEROGLYPH U040 -13360 ; [.4FDC.0020.0002] # EGYPTIAN HIEROGLYPH U041 -13361 ; [.4FDD.0020.0002] # EGYPTIAN HIEROGLYPH U042 -13362 ; [.4FDE.0020.0002] # EGYPTIAN HIEROGLYPH V001 -13363 ; [.4FDF.0020.0002] # EGYPTIAN HIEROGLYPH V001A -13364 ; [.4FE0.0020.0002] # EGYPTIAN HIEROGLYPH V001B -13365 ; [.4FE1.0020.0002] # EGYPTIAN HIEROGLYPH V001C -13366 ; [.4FE2.0020.0002] # EGYPTIAN HIEROGLYPH V001D -13367 ; [.4FE3.0020.0002] # EGYPTIAN HIEROGLYPH V001E -13368 ; [.4FE4.0020.0002] # EGYPTIAN HIEROGLYPH V001F -13369 ; [.4FE5.0020.0002] # EGYPTIAN HIEROGLYPH V001G -1336A ; [.4FE6.0020.0002] # EGYPTIAN HIEROGLYPH V001H -1336B ; [.4FE7.0020.0002] # EGYPTIAN HIEROGLYPH V001I -1336C ; [.4FE8.0020.0002] # EGYPTIAN HIEROGLYPH V002 -1336D ; [.4FE9.0020.0002] # EGYPTIAN HIEROGLYPH V002A -1336E ; [.4FEA.0020.0002] # EGYPTIAN HIEROGLYPH V003 -1336F ; [.4FEB.0020.0002] # EGYPTIAN HIEROGLYPH V004 -13370 ; [.4FEC.0020.0002] # EGYPTIAN HIEROGLYPH V005 -13371 ; [.4FED.0020.0002] # EGYPTIAN HIEROGLYPH V006 -13372 ; [.4FEE.0020.0002] # EGYPTIAN HIEROGLYPH V007 -13373 ; [.4FEF.0020.0002] # EGYPTIAN HIEROGLYPH V007A -13374 ; [.4FF0.0020.0002] # EGYPTIAN HIEROGLYPH V007B -13375 ; [.4FF1.0020.0002] # EGYPTIAN HIEROGLYPH V008 -13376 ; [.4FF2.0020.0002] # EGYPTIAN HIEROGLYPH V009 -13377 ; [.4FF3.0020.0002] # EGYPTIAN HIEROGLYPH V010 -13378 ; [.4FF4.0020.0002] # EGYPTIAN HIEROGLYPH V011 -13379 ; [.4FF5.0020.0002] # EGYPTIAN HIEROGLYPH V011A -1337A ; [.4FF6.0020.0002] # EGYPTIAN HIEROGLYPH V011B -1337B ; [.4FF7.0020.0002] # EGYPTIAN HIEROGLYPH V011C -1337C ; [.4FF8.0020.0002] # EGYPTIAN HIEROGLYPH V012 -1337D ; [.4FF9.0020.0002] # EGYPTIAN HIEROGLYPH V012A -1337E ; [.4FFA.0020.0002] # EGYPTIAN HIEROGLYPH V012B -1337F ; [.4FFB.0020.0002] # EGYPTIAN HIEROGLYPH V013 -13380 ; [.4FFC.0020.0002] # EGYPTIAN HIEROGLYPH V014 -13381 ; [.4FFD.0020.0002] # EGYPTIAN HIEROGLYPH V015 -13382 ; [.4FFE.0020.0002] # EGYPTIAN HIEROGLYPH V016 -13383 ; [.4FFF.0020.0002] # EGYPTIAN HIEROGLYPH V017 -13384 ; [.5000.0020.0002] # EGYPTIAN HIEROGLYPH V018 -13385 ; [.5001.0020.0002] # EGYPTIAN HIEROGLYPH V019 -13386 ; [.5002.0020.0002] # EGYPTIAN HIEROGLYPH V020 -13387 ; [.5003.0020.0002] # EGYPTIAN HIEROGLYPH V020A -13388 ; [.5004.0020.0002] # EGYPTIAN HIEROGLYPH V020B -13389 ; [.5005.0020.0002] # EGYPTIAN HIEROGLYPH V020C -1338A ; [.5006.0020.0002] # EGYPTIAN HIEROGLYPH V020D -1338B ; [.5007.0020.0002] # EGYPTIAN HIEROGLYPH V020E -1338C ; [.5008.0020.0002] # EGYPTIAN HIEROGLYPH V020F -1338D ; [.5009.0020.0002] # EGYPTIAN HIEROGLYPH V020G -1338E ; [.500A.0020.0002] # EGYPTIAN HIEROGLYPH V020H -1338F ; [.500B.0020.0002] # EGYPTIAN HIEROGLYPH V020I -13390 ; [.500C.0020.0002] # EGYPTIAN HIEROGLYPH V020J -13391 ; [.500D.0020.0002] # EGYPTIAN HIEROGLYPH V020K -13392 ; [.500E.0020.0002] # EGYPTIAN HIEROGLYPH V020L -13393 ; [.500F.0020.0002] # EGYPTIAN HIEROGLYPH V021 -13394 ; [.5010.0020.0002] # EGYPTIAN HIEROGLYPH V022 -13395 ; [.5011.0020.0002] # EGYPTIAN HIEROGLYPH V023 -13396 ; [.5012.0020.0002] # EGYPTIAN HIEROGLYPH V023A -13397 ; [.5013.0020.0002] # EGYPTIAN HIEROGLYPH V024 -13398 ; [.5014.0020.0002] # EGYPTIAN HIEROGLYPH V025 -13399 ; [.5015.0020.0002] # EGYPTIAN HIEROGLYPH V026 -1339A ; [.5016.0020.0002] # EGYPTIAN HIEROGLYPH V027 -1339B ; [.5017.0020.0002] # EGYPTIAN HIEROGLYPH V028 -1339C ; [.5018.0020.0002] # EGYPTIAN HIEROGLYPH V028A -1339D ; [.5019.0020.0002] # EGYPTIAN HIEROGLYPH V029 -1339E ; [.501A.0020.0002] # EGYPTIAN HIEROGLYPH V029A -1339F ; [.501B.0020.0002] # EGYPTIAN HIEROGLYPH V030 -133A0 ; [.501C.0020.0002] # EGYPTIAN HIEROGLYPH V030A -133A1 ; [.501D.0020.0002] # EGYPTIAN HIEROGLYPH V031 -133A2 ; [.501E.0020.0002] # EGYPTIAN HIEROGLYPH V031A -133A3 ; [.501F.0020.0002] # EGYPTIAN HIEROGLYPH V032 -133A4 ; [.5020.0020.0002] # EGYPTIAN HIEROGLYPH V033 -133A5 ; [.5021.0020.0002] # EGYPTIAN HIEROGLYPH V033A -133A6 ; [.5022.0020.0002] # EGYPTIAN HIEROGLYPH V034 -133A7 ; [.5023.0020.0002] # EGYPTIAN HIEROGLYPH V035 -133A8 ; [.5024.0020.0002] # EGYPTIAN HIEROGLYPH V036 -133A9 ; [.5025.0020.0002] # EGYPTIAN HIEROGLYPH V037 -133AA ; [.5026.0020.0002] # EGYPTIAN HIEROGLYPH V037A -133AB ; [.5027.0020.0002] # EGYPTIAN HIEROGLYPH V038 -133AC ; [.5028.0020.0002] # EGYPTIAN HIEROGLYPH V039 -133AD ; [.5029.0020.0002] # EGYPTIAN HIEROGLYPH V040 -133AE ; [.502A.0020.0002] # EGYPTIAN HIEROGLYPH V040A -133AF ; [.502B.0020.0002] # EGYPTIAN HIEROGLYPH W001 -133B0 ; [.502C.0020.0002] # EGYPTIAN HIEROGLYPH W002 -133B1 ; [.502D.0020.0002] # EGYPTIAN HIEROGLYPH W003 -133B2 ; [.502E.0020.0002] # EGYPTIAN HIEROGLYPH W003A -133B3 ; [.502F.0020.0002] # EGYPTIAN HIEROGLYPH W004 -133B4 ; [.5030.0020.0002] # EGYPTIAN HIEROGLYPH W005 -133B5 ; [.5031.0020.0002] # EGYPTIAN HIEROGLYPH W006 -133B6 ; [.5032.0020.0002] # EGYPTIAN HIEROGLYPH W007 -133B7 ; [.5033.0020.0002] # EGYPTIAN HIEROGLYPH W008 -133B8 ; [.5034.0020.0002] # EGYPTIAN HIEROGLYPH W009 -133B9 ; [.5035.0020.0002] # EGYPTIAN HIEROGLYPH W009A -133BA ; [.5036.0020.0002] # EGYPTIAN HIEROGLYPH W010 -133BB ; [.5037.0020.0002] # EGYPTIAN HIEROGLYPH W010A -133BC ; [.5038.0020.0002] # EGYPTIAN HIEROGLYPH W011 -133BD ; [.5039.0020.0002] # EGYPTIAN HIEROGLYPH W012 -133BE ; [.503A.0020.0002] # EGYPTIAN HIEROGLYPH W013 -133BF ; [.503B.0020.0002] # EGYPTIAN HIEROGLYPH W014 -133C0 ; [.503C.0020.0002] # EGYPTIAN HIEROGLYPH W014A -133C1 ; [.503D.0020.0002] # EGYPTIAN HIEROGLYPH W015 -133C2 ; [.503E.0020.0002] # EGYPTIAN HIEROGLYPH W016 -133C3 ; [.503F.0020.0002] # EGYPTIAN HIEROGLYPH W017 -133C4 ; [.5040.0020.0002] # EGYPTIAN HIEROGLYPH W017A -133C5 ; [.5041.0020.0002] # EGYPTIAN HIEROGLYPH W018 -133C6 ; [.5042.0020.0002] # EGYPTIAN HIEROGLYPH W018A -133C7 ; [.5043.0020.0002] # EGYPTIAN HIEROGLYPH W019 -133C8 ; [.5044.0020.0002] # EGYPTIAN HIEROGLYPH W020 -133C9 ; [.5045.0020.0002] # EGYPTIAN HIEROGLYPH W021 -133CA ; [.5046.0020.0002] # EGYPTIAN HIEROGLYPH W022 -133CB ; [.5047.0020.0002] # EGYPTIAN HIEROGLYPH W023 -133CC ; [.5048.0020.0002] # EGYPTIAN HIEROGLYPH W024 -133CD ; [.5049.0020.0002] # EGYPTIAN HIEROGLYPH W024A -133CE ; [.504A.0020.0002] # EGYPTIAN HIEROGLYPH W025 -133CF ; [.504B.0020.0002] # EGYPTIAN HIEROGLYPH X001 -133D0 ; [.504C.0020.0002] # EGYPTIAN HIEROGLYPH X002 -133D1 ; [.504D.0020.0002] # EGYPTIAN HIEROGLYPH X003 -133D2 ; [.504E.0020.0002] # EGYPTIAN HIEROGLYPH X004 -133D3 ; [.504F.0020.0002] # EGYPTIAN HIEROGLYPH X004A -133D4 ; [.5050.0020.0002] # EGYPTIAN HIEROGLYPH X004B -133D5 ; [.5051.0020.0002] # EGYPTIAN HIEROGLYPH X005 -133D6 ; [.5052.0020.0002] # EGYPTIAN HIEROGLYPH X006 -133D7 ; [.5053.0020.0002] # EGYPTIAN HIEROGLYPH X006A -133D8 ; [.5054.0020.0002] # EGYPTIAN HIEROGLYPH X007 -133D9 ; [.5055.0020.0002] # EGYPTIAN HIEROGLYPH X008 -133DA ; [.5056.0020.0002] # EGYPTIAN HIEROGLYPH X008A -133DB ; [.5057.0020.0002] # EGYPTIAN HIEROGLYPH Y001 -133DC ; [.5058.0020.0002] # EGYPTIAN HIEROGLYPH Y001A -133DD ; [.5059.0020.0002] # EGYPTIAN HIEROGLYPH Y002 -133DE ; [.505A.0020.0002] # EGYPTIAN HIEROGLYPH Y003 -133DF ; [.505B.0020.0002] # EGYPTIAN HIEROGLYPH Y004 -133E0 ; [.505C.0020.0002] # EGYPTIAN HIEROGLYPH Y005 -133E1 ; [.505D.0020.0002] # EGYPTIAN HIEROGLYPH Y006 -133E2 ; [.505E.0020.0002] # EGYPTIAN HIEROGLYPH Y007 -133E3 ; [.505F.0020.0002] # EGYPTIAN HIEROGLYPH Y008 -133E4 ; [.5060.0020.0002] # EGYPTIAN HIEROGLYPH Z001 -133E5 ; [.5061.0020.0002] # EGYPTIAN HIEROGLYPH Z002 -133E6 ; [.5062.0020.0002] # EGYPTIAN HIEROGLYPH Z002A -133E7 ; [.5063.0020.0002] # EGYPTIAN HIEROGLYPH Z002B -133E8 ; [.5064.0020.0002] # EGYPTIAN HIEROGLYPH Z002C -133E9 ; [.5065.0020.0002] # EGYPTIAN HIEROGLYPH Z002D -133EA ; [.5066.0020.0002] # EGYPTIAN HIEROGLYPH Z003 -133EB ; [.5067.0020.0002] # EGYPTIAN HIEROGLYPH Z003A -133EC ; [.5068.0020.0002] # EGYPTIAN HIEROGLYPH Z003B -133ED ; [.5069.0020.0002] # EGYPTIAN HIEROGLYPH Z004 -133EE ; [.506A.0020.0002] # EGYPTIAN HIEROGLYPH Z004A -133EF ; [.506B.0020.0002] # EGYPTIAN HIEROGLYPH Z005 -133F0 ; [.506C.0020.0002] # EGYPTIAN HIEROGLYPH Z005A -133F1 ; [.506D.0020.0002] # EGYPTIAN HIEROGLYPH Z006 -133F2 ; [.506E.0020.0002] # EGYPTIAN HIEROGLYPH Z007 -133F3 ; [.506F.0020.0002] # EGYPTIAN HIEROGLYPH Z008 -133F4 ; [.5070.0020.0002] # EGYPTIAN HIEROGLYPH Z009 -133F5 ; [.5071.0020.0002] # EGYPTIAN HIEROGLYPH Z010 -133F6 ; [.5072.0020.0002] # EGYPTIAN HIEROGLYPH Z011 -133F7 ; [.5073.0020.0002] # EGYPTIAN HIEROGLYPH Z012 -133F8 ; [.5074.0020.0002] # EGYPTIAN HIEROGLYPH Z013 -133F9 ; [.5075.0020.0002] # EGYPTIAN HIEROGLYPH Z014 -133FA ; [.5076.0020.0002] # EGYPTIAN HIEROGLYPH Z015 -133FB ; [.5077.0020.0002] # EGYPTIAN HIEROGLYPH Z015A -133FC ; [.5078.0020.0002] # EGYPTIAN HIEROGLYPH Z015B -133FD ; [.5079.0020.0002] # EGYPTIAN HIEROGLYPH Z015C -133FE ; [.507A.0020.0002] # EGYPTIAN HIEROGLYPH Z015D -133FF ; [.507B.0020.0002] # EGYPTIAN HIEROGLYPH Z015E -13400 ; [.507C.0020.0002] # EGYPTIAN HIEROGLYPH Z015F -13401 ; [.507D.0020.0002] # EGYPTIAN HIEROGLYPH Z015G -13402 ; [.507E.0020.0002] # EGYPTIAN HIEROGLYPH Z015H -13403 ; [.507F.0020.0002] # EGYPTIAN HIEROGLYPH Z015I -13404 ; [.5080.0020.0002] # EGYPTIAN HIEROGLYPH Z016 -13405 ; [.5081.0020.0002] # EGYPTIAN HIEROGLYPH Z016A -13406 ; [.5082.0020.0002] # EGYPTIAN HIEROGLYPH Z016B -13407 ; [.5083.0020.0002] # EGYPTIAN HIEROGLYPH Z016C -13408 ; [.5084.0020.0002] # EGYPTIAN HIEROGLYPH Z016D -13409 ; [.5085.0020.0002] # EGYPTIAN HIEROGLYPH Z016E -1340A ; [.5086.0020.0002] # EGYPTIAN HIEROGLYPH Z016F -1340B ; [.5087.0020.0002] # EGYPTIAN HIEROGLYPH Z016G -1340C ; [.5088.0020.0002] # EGYPTIAN HIEROGLYPH Z016H -1340D ; [.5089.0020.0002] # EGYPTIAN HIEROGLYPH AA001 -1340E ; [.508A.0020.0002] # EGYPTIAN HIEROGLYPH AA002 -1340F ; [.508B.0020.0002] # EGYPTIAN HIEROGLYPH AA003 -13410 ; [.508C.0020.0002] # EGYPTIAN HIEROGLYPH AA004 -13411 ; [.508D.0020.0002] # EGYPTIAN HIEROGLYPH AA005 -13412 ; [.508E.0020.0002] # EGYPTIAN HIEROGLYPH AA006 -13413 ; [.508F.0020.0002] # EGYPTIAN HIEROGLYPH AA007 -13414 ; [.5090.0020.0002] # EGYPTIAN HIEROGLYPH AA007A -13415 ; [.5091.0020.0002] # EGYPTIAN HIEROGLYPH AA007B -13416 ; [.5092.0020.0002] # EGYPTIAN HIEROGLYPH AA008 -13417 ; [.5093.0020.0002] # EGYPTIAN HIEROGLYPH AA009 -13418 ; [.5094.0020.0002] # EGYPTIAN HIEROGLYPH AA010 -13419 ; [.5095.0020.0002] # EGYPTIAN HIEROGLYPH AA011 -1341A ; [.5096.0020.0002] # EGYPTIAN HIEROGLYPH AA012 -1341B ; [.5097.0020.0002] # EGYPTIAN HIEROGLYPH AA013 -1341C ; [.5098.0020.0002] # EGYPTIAN HIEROGLYPH AA014 -1341D ; [.5099.0020.0002] # EGYPTIAN HIEROGLYPH AA015 -1341E ; [.509A.0020.0002] # EGYPTIAN HIEROGLYPH AA016 -1341F ; [.509B.0020.0002] # EGYPTIAN HIEROGLYPH AA017 -13420 ; [.509C.0020.0002] # EGYPTIAN HIEROGLYPH AA018 -13421 ; [.509D.0020.0002] # EGYPTIAN HIEROGLYPH AA019 -13422 ; [.509E.0020.0002] # EGYPTIAN HIEROGLYPH AA020 -13423 ; [.509F.0020.0002] # EGYPTIAN HIEROGLYPH AA021 -13424 ; [.50A0.0020.0002] # EGYPTIAN HIEROGLYPH AA022 -13425 ; [.50A1.0020.0002] # EGYPTIAN HIEROGLYPH AA023 -13426 ; [.50A2.0020.0002] # EGYPTIAN HIEROGLYPH AA024 -13427 ; [.50A3.0020.0002] # EGYPTIAN HIEROGLYPH AA025 -13428 ; [.50A4.0020.0002] # EGYPTIAN HIEROGLYPH AA026 -13429 ; [.50A5.0020.0002] # EGYPTIAN HIEROGLYPH AA027 -1342A ; [.50A6.0020.0002] # EGYPTIAN HIEROGLYPH AA028 -1342B ; [.50A7.0020.0002] # EGYPTIAN HIEROGLYPH AA029 -1342C ; [.50A8.0020.0002] # EGYPTIAN HIEROGLYPH AA030 -1342D ; [.50A9.0020.0002] # EGYPTIAN HIEROGLYPH AA031 -1342E ; [.50AA.0020.0002] # EGYPTIAN HIEROGLYPH AA032 -109A0 ; [.50AB.0020.0002] # MEROITIC CURSIVE LETTER A -10980 ; [.50AB.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER A -109A1 ; [.50AC.0020.0002] # MEROITIC CURSIVE LETTER E -10981 ; [.50AC.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER E -109A2 ; [.50AD.0020.0002] # MEROITIC CURSIVE LETTER I -10982 ; [.50AD.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER I -109A3 ; [.50AE.0020.0002] # MEROITIC CURSIVE LETTER O -10983 ; [.50AE.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER O -109A4 ; [.50AF.0020.0002] # MEROITIC CURSIVE LETTER YA -10984 ; [.50AF.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER YA -109A5 ; [.50B0.0020.0002] # MEROITIC CURSIVE LETTER WA -10985 ; [.50B0.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER WA -109A6 ; [.50B1.0020.0002] # MEROITIC CURSIVE LETTER BA -10986 ; [.50B1.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER BA -10987 ; [.50B1.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER BA-2 -109A7 ; [.50B2.0020.0002] # MEROITIC CURSIVE LETTER PA -10988 ; [.50B2.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER PA -109A8 ; [.50B3.0020.0002] # MEROITIC CURSIVE LETTER MA -10989 ; [.50B3.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER MA -109A9 ; [.50B4.0020.0002] # MEROITIC CURSIVE LETTER NA -1098A ; [.50B4.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER NA -1098B ; [.50B4.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER NA-2 -109AA ; [.50B5.0020.0002] # MEROITIC CURSIVE LETTER NE -1098C ; [.50B5.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER NE -1098D ; [.50B5.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER NE-2 -109AB ; [.50B6.0020.0002] # MEROITIC CURSIVE LETTER RA -1098E ; [.50B6.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER RA -1098F ; [.50B6.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER RA-2 -109AC ; [.50B7.0020.0002] # MEROITIC CURSIVE LETTER LA -10990 ; [.50B7.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER LA -109AD ; [.50B8.0020.0002] # MEROITIC CURSIVE LETTER KHA -10991 ; [.50B8.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER KHA -109AE ; [.50B9.0020.0002] # MEROITIC CURSIVE LETTER HHA -10992 ; [.50B9.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER HHA -109AF ; [.50BA.0020.0002] # MEROITIC CURSIVE LETTER SA -109B0 ; [.50BA.0020.0004][.0000.010B.0004] # MEROITIC CURSIVE LETTER ARCHAIC SA -10993 ; [.50BA.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER SA -10994 ; [.50BA.0020.0004][.0000.010D.0004] # MEROITIC HIEROGLYPHIC LETTER SA-2 -109B1 ; [.50BB.0020.0002] # MEROITIC CURSIVE LETTER SE -10995 ; [.50BB.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER SE -109B2 ; [.50BC.0020.0002] # MEROITIC CURSIVE LETTER KA -10996 ; [.50BC.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER KA -109B3 ; [.50BD.0020.0002] # MEROITIC CURSIVE LETTER QA -10997 ; [.50BD.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER QA -109B4 ; [.50BE.0020.0002] # MEROITIC CURSIVE LETTER TA -10998 ; [.50BE.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER TA -10999 ; [.50BE.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER TA-2 -109B5 ; [.50BF.0020.0002] # MEROITIC CURSIVE LETTER TE -1099A ; [.50BF.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER TE -1099B ; [.50BF.0020.0004][.0000.010C.0004] # MEROITIC HIEROGLYPHIC LETTER TE-2 -109B6 ; [.50C0.0020.0002] # MEROITIC CURSIVE LETTER TO -1099C ; [.50C0.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER TO -109B7 ; [.50C1.0020.0002] # MEROITIC CURSIVE LETTER DA -1099D ; [.50C1.0020.0004][.0000.010B.0004] # MEROITIC HIEROGLYPHIC LETTER DA -109BE ; [.50C2.0020.0002] # MEROITIC CURSIVE LOGOGRAM RMT -109BF ; [.50C3.0020.0002] # MEROITIC CURSIVE LOGOGRAM IMN -1099E ; [.50C4.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ -1099F ; [.50C5.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 -14400 ; [.50C6.0020.0002] # ANATOLIAN HIEROGLYPH A001 -14401 ; [.50C7.0020.0002] # ANATOLIAN HIEROGLYPH A002 -14402 ; [.50C8.0020.0002] # ANATOLIAN HIEROGLYPH A003 -14403 ; [.50C9.0020.0002] # ANATOLIAN HIEROGLYPH A004 -14404 ; [.50CA.0020.0002] # ANATOLIAN HIEROGLYPH A005 -14405 ; [.50CB.0020.0002] # ANATOLIAN HIEROGLYPH A006 -14406 ; [.50CC.0020.0002] # ANATOLIAN HIEROGLYPH A007 -14407 ; [.50CD.0020.0002] # ANATOLIAN HIEROGLYPH A008 -14408 ; [.50CE.0020.0002] # ANATOLIAN HIEROGLYPH A009 -14409 ; [.50CF.0020.0002] # ANATOLIAN HIEROGLYPH A010 -1440A ; [.50D0.0020.0002] # ANATOLIAN HIEROGLYPH A010A -1440B ; [.50D1.0020.0002] # ANATOLIAN HIEROGLYPH A011 -1440C ; [.50D2.0020.0002] # ANATOLIAN HIEROGLYPH A012 -1440D ; [.50D3.0020.0002] # ANATOLIAN HIEROGLYPH A013 -1440E ; [.50D4.0020.0002] # ANATOLIAN HIEROGLYPH A014 -1440F ; [.50D5.0020.0002] # ANATOLIAN HIEROGLYPH A015 -14410 ; [.50D6.0020.0002] # ANATOLIAN HIEROGLYPH A016 -14411 ; [.50D7.0020.0002] # ANATOLIAN HIEROGLYPH A017 -14412 ; [.50D8.0020.0002] # ANATOLIAN HIEROGLYPH A018 -14413 ; [.50D9.0020.0002] # ANATOLIAN HIEROGLYPH A019 -14414 ; [.50DA.0020.0002] # ANATOLIAN HIEROGLYPH A020 -14415 ; [.50DB.0020.0002] # ANATOLIAN HIEROGLYPH A021 -14416 ; [.50DC.0020.0002] # ANATOLIAN HIEROGLYPH A022 -14417 ; [.50DD.0020.0002] # ANATOLIAN HIEROGLYPH A023 -14418 ; [.50DE.0020.0002] # ANATOLIAN HIEROGLYPH A024 -14419 ; [.50DF.0020.0002] # ANATOLIAN HIEROGLYPH A025 -1441A ; [.50E0.0020.0002] # ANATOLIAN HIEROGLYPH A026 -1441B ; [.50E1.0020.0002] # ANATOLIAN HIEROGLYPH A026A -1441C ; [.50E2.0020.0002] # ANATOLIAN HIEROGLYPH A027 -1441D ; [.50E3.0020.0002] # ANATOLIAN HIEROGLYPH A028 -1441E ; [.50E4.0020.0002] # ANATOLIAN HIEROGLYPH A029 -1441F ; [.50E5.0020.0002] # ANATOLIAN HIEROGLYPH A030 -14420 ; [.50E6.0020.0002] # ANATOLIAN HIEROGLYPH A031 -14421 ; [.50E7.0020.0002] # ANATOLIAN HIEROGLYPH A032 -14422 ; [.50E8.0020.0002] # ANATOLIAN HIEROGLYPH A033 -14423 ; [.50E9.0020.0002] # ANATOLIAN HIEROGLYPH A034 -14424 ; [.50EA.0020.0002] # ANATOLIAN HIEROGLYPH A035 -14425 ; [.50EB.0020.0002] # ANATOLIAN HIEROGLYPH A036 -14426 ; [.50EC.0020.0002] # ANATOLIAN HIEROGLYPH A037 -14427 ; [.50ED.0020.0002] # ANATOLIAN HIEROGLYPH A038 -14428 ; [.50EE.0020.0002] # ANATOLIAN HIEROGLYPH A039 -14429 ; [.50EF.0020.0002] # ANATOLIAN HIEROGLYPH A039A -1442A ; [.50F0.0020.0002] # ANATOLIAN HIEROGLYPH A040 -1442B ; [.50F1.0020.0002] # ANATOLIAN HIEROGLYPH A041 -1442C ; [.50F2.0020.0002] # ANATOLIAN HIEROGLYPH A041A -1442D ; [.50F3.0020.0002] # ANATOLIAN HIEROGLYPH A042 -1442E ; [.50F4.0020.0002] # ANATOLIAN HIEROGLYPH A043 -1442F ; [.50F5.0020.0002] # ANATOLIAN HIEROGLYPH A044 -14430 ; [.50F6.0020.0002] # ANATOLIAN HIEROGLYPH A045 -14431 ; [.50F7.0020.0002] # ANATOLIAN HIEROGLYPH A045A -14432 ; [.50F8.0020.0002] # ANATOLIAN HIEROGLYPH A046 -14433 ; [.50F9.0020.0002] # ANATOLIAN HIEROGLYPH A046A -14434 ; [.50FA.0020.0002] # ANATOLIAN HIEROGLYPH A046B -14435 ; [.50FB.0020.0002] # ANATOLIAN HIEROGLYPH A047 -14436 ; [.50FC.0020.0002] # ANATOLIAN HIEROGLYPH A048 -14437 ; [.50FD.0020.0002] # ANATOLIAN HIEROGLYPH A049 -14438 ; [.50FE.0020.0002] # ANATOLIAN HIEROGLYPH A050 -14439 ; [.50FF.0020.0002] # ANATOLIAN HIEROGLYPH A051 -1443A ; [.5100.0020.0002] # ANATOLIAN HIEROGLYPH A052 -1443B ; [.5101.0020.0002] # ANATOLIAN HIEROGLYPH A053 -1443C ; [.5102.0020.0002] # ANATOLIAN HIEROGLYPH A054 -1443D ; [.5103.0020.0002] # ANATOLIAN HIEROGLYPH A055 -1443E ; [.5104.0020.0002] # ANATOLIAN HIEROGLYPH A056 -1443F ; [.5105.0020.0002] # ANATOLIAN HIEROGLYPH A057 -14440 ; [.5106.0020.0002] # ANATOLIAN HIEROGLYPH A058 -14441 ; [.5107.0020.0002] # ANATOLIAN HIEROGLYPH A059 -14442 ; [.5108.0020.0002] # ANATOLIAN HIEROGLYPH A060 -14443 ; [.5109.0020.0002] # ANATOLIAN HIEROGLYPH A061 -14444 ; [.510A.0020.0002] # ANATOLIAN HIEROGLYPH A062 -14445 ; [.510B.0020.0002] # ANATOLIAN HIEROGLYPH A063 -14446 ; [.510C.0020.0002] # ANATOLIAN HIEROGLYPH A064 -14447 ; [.510D.0020.0002] # ANATOLIAN HIEROGLYPH A065 -14448 ; [.510E.0020.0002] # ANATOLIAN HIEROGLYPH A066 -14449 ; [.510F.0020.0002] # ANATOLIAN HIEROGLYPH A066A -1444A ; [.5110.0020.0002] # ANATOLIAN HIEROGLYPH A066B -1444B ; [.5111.0020.0002] # ANATOLIAN HIEROGLYPH A066C -1444C ; [.5112.0020.0002] # ANATOLIAN HIEROGLYPH A067 -1444D ; [.5113.0020.0002] # ANATOLIAN HIEROGLYPH A068 -1444E ; [.5114.0020.0002] # ANATOLIAN HIEROGLYPH A069 -1444F ; [.5115.0020.0002] # ANATOLIAN HIEROGLYPH A070 -14450 ; [.5116.0020.0002] # ANATOLIAN HIEROGLYPH A071 -14451 ; [.5117.0020.0002] # ANATOLIAN HIEROGLYPH A072 -14452 ; [.5118.0020.0002] # ANATOLIAN HIEROGLYPH A073 -14453 ; [.5119.0020.0002] # ANATOLIAN HIEROGLYPH A074 -14454 ; [.511A.0020.0002] # ANATOLIAN HIEROGLYPH A075 -14455 ; [.511B.0020.0002] # ANATOLIAN HIEROGLYPH A076 -14456 ; [.511C.0020.0002] # ANATOLIAN HIEROGLYPH A077 -14457 ; [.511D.0020.0002] # ANATOLIAN HIEROGLYPH A078 -14458 ; [.511E.0020.0002] # ANATOLIAN HIEROGLYPH A079 -14459 ; [.511F.0020.0002] # ANATOLIAN HIEROGLYPH A080 -1445A ; [.5120.0020.0002] # ANATOLIAN HIEROGLYPH A081 -1445B ; [.5121.0020.0002] # ANATOLIAN HIEROGLYPH A082 -1445C ; [.5122.0020.0002] # ANATOLIAN HIEROGLYPH A083 -1445D ; [.5123.0020.0002] # ANATOLIAN HIEROGLYPH A084 -1445E ; [.5124.0020.0002] # ANATOLIAN HIEROGLYPH A085 -1445F ; [.5125.0020.0002] # ANATOLIAN HIEROGLYPH A086 -14460 ; [.5126.0020.0002] # ANATOLIAN HIEROGLYPH A087 -14461 ; [.5127.0020.0002] # ANATOLIAN HIEROGLYPH A088 -14462 ; [.5128.0020.0002] # ANATOLIAN HIEROGLYPH A089 -14463 ; [.5129.0020.0002] # ANATOLIAN HIEROGLYPH A090 -14464 ; [.512A.0020.0002] # ANATOLIAN HIEROGLYPH A091 -14465 ; [.512B.0020.0002] # ANATOLIAN HIEROGLYPH A092 -14466 ; [.512C.0020.0002] # ANATOLIAN HIEROGLYPH A093 -14467 ; [.512D.0020.0002] # ANATOLIAN HIEROGLYPH A094 -14468 ; [.512E.0020.0002] # ANATOLIAN HIEROGLYPH A095 -14469 ; [.512F.0020.0002] # ANATOLIAN HIEROGLYPH A096 -1446A ; [.5130.0020.0002] # ANATOLIAN HIEROGLYPH A097 -1446B ; [.5131.0020.0002] # ANATOLIAN HIEROGLYPH A097A -1446C ; [.5132.0020.0002] # ANATOLIAN HIEROGLYPH A098 -1446D ; [.5133.0020.0002] # ANATOLIAN HIEROGLYPH A098A -1446E ; [.5134.0020.0002] # ANATOLIAN HIEROGLYPH A099 -1446F ; [.5135.0020.0002] # ANATOLIAN HIEROGLYPH A100 -14470 ; [.5136.0020.0002] # ANATOLIAN HIEROGLYPH A100A -14471 ; [.5137.0020.0002] # ANATOLIAN HIEROGLYPH A101 -14472 ; [.5138.0020.0002] # ANATOLIAN HIEROGLYPH A101A -14473 ; [.5139.0020.0002] # ANATOLIAN HIEROGLYPH A102 -14474 ; [.513A.0020.0002] # ANATOLIAN HIEROGLYPH A102A -14475 ; [.513B.0020.0002] # ANATOLIAN HIEROGLYPH A103 -14476 ; [.513C.0020.0002] # ANATOLIAN HIEROGLYPH A104 -14477 ; [.513D.0020.0002] # ANATOLIAN HIEROGLYPH A104A -14478 ; [.513E.0020.0002] # ANATOLIAN HIEROGLYPH A104B -14479 ; [.513F.0020.0002] # ANATOLIAN HIEROGLYPH A104C -1447A ; [.5140.0020.0002] # ANATOLIAN HIEROGLYPH A105 -1447B ; [.5141.0020.0002] # ANATOLIAN HIEROGLYPH A105A -1447C ; [.5142.0020.0002] # ANATOLIAN HIEROGLYPH A105B -1447D ; [.5143.0020.0002] # ANATOLIAN HIEROGLYPH A106 -1447E ; [.5144.0020.0002] # ANATOLIAN HIEROGLYPH A107 -1447F ; [.5145.0020.0002] # ANATOLIAN HIEROGLYPH A107A -14480 ; [.5146.0020.0002] # ANATOLIAN HIEROGLYPH A107B -14481 ; [.5147.0020.0002] # ANATOLIAN HIEROGLYPH A107C -14482 ; [.5148.0020.0002] # ANATOLIAN HIEROGLYPH A108 -14483 ; [.5149.0020.0002] # ANATOLIAN HIEROGLYPH A109 -14484 ; [.514A.0020.0002] # ANATOLIAN HIEROGLYPH A110 -14485 ; [.514B.0020.0002] # ANATOLIAN HIEROGLYPH A110A -14486 ; [.514C.0020.0002] # ANATOLIAN HIEROGLYPH A110B -14487 ; [.514D.0020.0002] # ANATOLIAN HIEROGLYPH A111 -14488 ; [.514E.0020.0002] # ANATOLIAN HIEROGLYPH A112 -14489 ; [.514F.0020.0002] # ANATOLIAN HIEROGLYPH A113 -1448A ; [.5150.0020.0002] # ANATOLIAN HIEROGLYPH A114 -1448B ; [.5151.0020.0002] # ANATOLIAN HIEROGLYPH A115 -1448C ; [.5152.0020.0002] # ANATOLIAN HIEROGLYPH A115A -1448D ; [.5153.0020.0002] # ANATOLIAN HIEROGLYPH A116 -1448E ; [.5154.0020.0002] # ANATOLIAN HIEROGLYPH A117 -1448F ; [.5155.0020.0002] # ANATOLIAN HIEROGLYPH A118 -14490 ; [.5156.0020.0002] # ANATOLIAN HIEROGLYPH A119 -14491 ; [.5157.0020.0002] # ANATOLIAN HIEROGLYPH A120 -14492 ; [.5158.0020.0002] # ANATOLIAN HIEROGLYPH A121 -14493 ; [.5159.0020.0002] # ANATOLIAN HIEROGLYPH A122 -14494 ; [.515A.0020.0002] # ANATOLIAN HIEROGLYPH A123 -14495 ; [.515B.0020.0002] # ANATOLIAN HIEROGLYPH A124 -14496 ; [.515C.0020.0002] # ANATOLIAN HIEROGLYPH A125 -14497 ; [.515D.0020.0002] # ANATOLIAN HIEROGLYPH A125A -14498 ; [.515E.0020.0002] # ANATOLIAN HIEROGLYPH A126 -14499 ; [.515F.0020.0002] # ANATOLIAN HIEROGLYPH A127 -1449A ; [.5160.0020.0002] # ANATOLIAN HIEROGLYPH A128 -1449B ; [.5161.0020.0002] # ANATOLIAN HIEROGLYPH A129 -1449C ; [.5162.0020.0002] # ANATOLIAN HIEROGLYPH A130 -1449D ; [.5163.0020.0002] # ANATOLIAN HIEROGLYPH A131 -1449E ; [.5164.0020.0002] # ANATOLIAN HIEROGLYPH A132 -1449F ; [.5165.0020.0002] # ANATOLIAN HIEROGLYPH A133 -144A0 ; [.5166.0020.0002] # ANATOLIAN HIEROGLYPH A134 -144A1 ; [.5167.0020.0002] # ANATOLIAN HIEROGLYPH A135 -144A2 ; [.5168.0020.0002] # ANATOLIAN HIEROGLYPH A135A -144A3 ; [.5169.0020.0002] # ANATOLIAN HIEROGLYPH A136 -144A4 ; [.516A.0020.0002] # ANATOLIAN HIEROGLYPH A137 -144A5 ; [.516B.0020.0002] # ANATOLIAN HIEROGLYPH A138 -144A6 ; [.516C.0020.0002] # ANATOLIAN HIEROGLYPH A139 -144A7 ; [.516D.0020.0002] # ANATOLIAN HIEROGLYPH A140 -144A8 ; [.516E.0020.0002] # ANATOLIAN HIEROGLYPH A141 -144A9 ; [.516F.0020.0002] # ANATOLIAN HIEROGLYPH A142 -144AA ; [.5170.0020.0002] # ANATOLIAN HIEROGLYPH A143 -144AB ; [.5171.0020.0002] # ANATOLIAN HIEROGLYPH A144 -144AC ; [.5172.0020.0002] # ANATOLIAN HIEROGLYPH A145 -144AD ; [.5173.0020.0002] # ANATOLIAN HIEROGLYPH A146 -144AE ; [.5174.0020.0002] # ANATOLIAN HIEROGLYPH A147 -144AF ; [.5175.0020.0002] # ANATOLIAN HIEROGLYPH A148 -144B0 ; [.5176.0020.0002] # ANATOLIAN HIEROGLYPH A149 -144B1 ; [.5177.0020.0002] # ANATOLIAN HIEROGLYPH A150 -144B2 ; [.5178.0020.0002] # ANATOLIAN HIEROGLYPH A151 -144B3 ; [.5179.0020.0002] # ANATOLIAN HIEROGLYPH A152 -144B4 ; [.517A.0020.0002] # ANATOLIAN HIEROGLYPH A153 -144B5 ; [.517B.0020.0002] # ANATOLIAN HIEROGLYPH A154 -144B6 ; [.517C.0020.0002] # ANATOLIAN HIEROGLYPH A155 -144B7 ; [.517D.0020.0002] # ANATOLIAN HIEROGLYPH A156 -144B8 ; [.517E.0020.0002] # ANATOLIAN HIEROGLYPH A157 -144B9 ; [.517F.0020.0002] # ANATOLIAN HIEROGLYPH A158 -144BA ; [.5180.0020.0002] # ANATOLIAN HIEROGLYPH A159 -144BB ; [.5181.0020.0002] # ANATOLIAN HIEROGLYPH A160 -144BC ; [.5182.0020.0002] # ANATOLIAN HIEROGLYPH A161 -144BD ; [.5183.0020.0002] # ANATOLIAN HIEROGLYPH A162 -144BE ; [.5184.0020.0002] # ANATOLIAN HIEROGLYPH A163 -144BF ; [.5185.0020.0002] # ANATOLIAN HIEROGLYPH A164 -144C0 ; [.5186.0020.0002] # ANATOLIAN HIEROGLYPH A165 -144C1 ; [.5187.0020.0002] # ANATOLIAN HIEROGLYPH A166 -144C2 ; [.5188.0020.0002] # ANATOLIAN HIEROGLYPH A167 -144C3 ; [.5189.0020.0002] # ANATOLIAN HIEROGLYPH A168 -144C4 ; [.518A.0020.0002] # ANATOLIAN HIEROGLYPH A169 -144C5 ; [.518B.0020.0002] # ANATOLIAN HIEROGLYPH A170 -144C6 ; [.518C.0020.0002] # ANATOLIAN HIEROGLYPH A171 -144C7 ; [.518D.0020.0002] # ANATOLIAN HIEROGLYPH A172 -144C8 ; [.518E.0020.0002] # ANATOLIAN HIEROGLYPH A173 -144C9 ; [.518F.0020.0002] # ANATOLIAN HIEROGLYPH A174 -144CA ; [.5190.0020.0002] # ANATOLIAN HIEROGLYPH A175 -144CB ; [.5191.0020.0002] # ANATOLIAN HIEROGLYPH A176 -144CC ; [.5192.0020.0002] # ANATOLIAN HIEROGLYPH A177 -144CD ; [.5193.0020.0002] # ANATOLIAN HIEROGLYPH A178 -144CE ; [.5194.0020.0002] # ANATOLIAN HIEROGLYPH A179 -144CF ; [.5195.0020.0002] # ANATOLIAN HIEROGLYPH A180 -144D0 ; [.5196.0020.0002] # ANATOLIAN HIEROGLYPH A181 -144D1 ; [.5197.0020.0002] # ANATOLIAN HIEROGLYPH A182 -144D2 ; [.5198.0020.0002] # ANATOLIAN HIEROGLYPH A183 -144D3 ; [.5199.0020.0002] # ANATOLIAN HIEROGLYPH A184 -144D4 ; [.519A.0020.0002] # ANATOLIAN HIEROGLYPH A185 -144D5 ; [.519B.0020.0002] # ANATOLIAN HIEROGLYPH A186 -144D6 ; [.519C.0020.0002] # ANATOLIAN HIEROGLYPH A187 -144D7 ; [.519D.0020.0002] # ANATOLIAN HIEROGLYPH A188 -144D8 ; [.519E.0020.0002] # ANATOLIAN HIEROGLYPH A189 -144D9 ; [.519F.0020.0002] # ANATOLIAN HIEROGLYPH A190 -144DA ; [.51A0.0020.0002] # ANATOLIAN HIEROGLYPH A191 -144DB ; [.51A1.0020.0002] # ANATOLIAN HIEROGLYPH A192 -144DC ; [.51A2.0020.0002] # ANATOLIAN HIEROGLYPH A193 -144DD ; [.51A3.0020.0002] # ANATOLIAN HIEROGLYPH A194 -144DE ; [.51A4.0020.0002] # ANATOLIAN HIEROGLYPH A195 -144DF ; [.51A5.0020.0002] # ANATOLIAN HIEROGLYPH A196 -144E0 ; [.51A6.0020.0002] # ANATOLIAN HIEROGLYPH A197 -144E1 ; [.51A7.0020.0002] # ANATOLIAN HIEROGLYPH A198 -144E2 ; [.51A8.0020.0002] # ANATOLIAN HIEROGLYPH A199 -144E3 ; [.51A9.0020.0002] # ANATOLIAN HIEROGLYPH A200 -144E4 ; [.51AA.0020.0002] # ANATOLIAN HIEROGLYPH A201 -144E5 ; [.51AB.0020.0002] # ANATOLIAN HIEROGLYPH A202 -144E6 ; [.51AC.0020.0002] # ANATOLIAN HIEROGLYPH A202A -144E7 ; [.51AD.0020.0002] # ANATOLIAN HIEROGLYPH A202B -144E8 ; [.51AE.0020.0002] # ANATOLIAN HIEROGLYPH A203 -144E9 ; [.51AF.0020.0002] # ANATOLIAN HIEROGLYPH A204 -144EA ; [.51B0.0020.0002] # ANATOLIAN HIEROGLYPH A205 -144EB ; [.51B1.0020.0002] # ANATOLIAN HIEROGLYPH A206 -144EC ; [.51B2.0020.0002] # ANATOLIAN HIEROGLYPH A207 -144ED ; [.51B3.0020.0002] # ANATOLIAN HIEROGLYPH A207A -144EE ; [.51B4.0020.0002] # ANATOLIAN HIEROGLYPH A208 -144EF ; [.51B5.0020.0002] # ANATOLIAN HIEROGLYPH A209 -144F0 ; [.51B6.0020.0002] # ANATOLIAN HIEROGLYPH A209A -144F1 ; [.51B7.0020.0002] # ANATOLIAN HIEROGLYPH A210 -144F2 ; [.51B8.0020.0002] # ANATOLIAN HIEROGLYPH A211 -144F3 ; [.51B9.0020.0002] # ANATOLIAN HIEROGLYPH A212 -144F4 ; [.51BA.0020.0002] # ANATOLIAN HIEROGLYPH A213 -144F5 ; [.51BB.0020.0002] # ANATOLIAN HIEROGLYPH A214 -144F6 ; [.51BC.0020.0002] # ANATOLIAN HIEROGLYPH A215 -144F7 ; [.51BD.0020.0002] # ANATOLIAN HIEROGLYPH A215A -144F8 ; [.51BE.0020.0002] # ANATOLIAN HIEROGLYPH A216 -144F9 ; [.51BF.0020.0002] # ANATOLIAN HIEROGLYPH A216A -144FA ; [.51C0.0020.0002] # ANATOLIAN HIEROGLYPH A217 -144FB ; [.51C1.0020.0002] # ANATOLIAN HIEROGLYPH A218 -144FC ; [.51C2.0020.0002] # ANATOLIAN HIEROGLYPH A219 -144FD ; [.51C3.0020.0002] # ANATOLIAN HIEROGLYPH A220 -144FE ; [.51C4.0020.0002] # ANATOLIAN HIEROGLYPH A221 -144FF ; [.51C5.0020.0002] # ANATOLIAN HIEROGLYPH A222 -14500 ; [.51C6.0020.0002] # ANATOLIAN HIEROGLYPH A223 -14501 ; [.51C7.0020.0002] # ANATOLIAN HIEROGLYPH A224 -14502 ; [.51C8.0020.0002] # ANATOLIAN HIEROGLYPH A225 -14503 ; [.51C9.0020.0002] # ANATOLIAN HIEROGLYPH A226 -14504 ; [.51CA.0020.0002] # ANATOLIAN HIEROGLYPH A227 -14505 ; [.51CB.0020.0002] # ANATOLIAN HIEROGLYPH A227A -14506 ; [.51CC.0020.0002] # ANATOLIAN HIEROGLYPH A228 -14507 ; [.51CD.0020.0002] # ANATOLIAN HIEROGLYPH A229 -14508 ; [.51CE.0020.0002] # ANATOLIAN HIEROGLYPH A230 -14509 ; [.51CF.0020.0002] # ANATOLIAN HIEROGLYPH A231 -1450A ; [.51D0.0020.0002] # ANATOLIAN HIEROGLYPH A232 -1450B ; [.51D1.0020.0002] # ANATOLIAN HIEROGLYPH A233 -1450C ; [.51D2.0020.0002] # ANATOLIAN HIEROGLYPH A234 -1450D ; [.51D3.0020.0002] # ANATOLIAN HIEROGLYPH A235 -1450E ; [.51D4.0020.0002] # ANATOLIAN HIEROGLYPH A236 -1450F ; [.51D5.0020.0002] # ANATOLIAN HIEROGLYPH A237 -14510 ; [.51D6.0020.0002] # ANATOLIAN HIEROGLYPH A238 -14511 ; [.51D7.0020.0002] # ANATOLIAN HIEROGLYPH A239 -14512 ; [.51D8.0020.0002] # ANATOLIAN HIEROGLYPH A240 -14513 ; [.51D9.0020.0002] # ANATOLIAN HIEROGLYPH A241 -14514 ; [.51DA.0020.0002] # ANATOLIAN HIEROGLYPH A242 -14515 ; [.51DB.0020.0002] # ANATOLIAN HIEROGLYPH A243 -14516 ; [.51DC.0020.0002] # ANATOLIAN HIEROGLYPH A244 -14517 ; [.51DD.0020.0002] # ANATOLIAN HIEROGLYPH A245 -14518 ; [.51DE.0020.0002] # ANATOLIAN HIEROGLYPH A246 -14519 ; [.51DF.0020.0002] # ANATOLIAN HIEROGLYPH A247 -1451A ; [.51E0.0020.0002] # ANATOLIAN HIEROGLYPH A248 -1451B ; [.51E1.0020.0002] # ANATOLIAN HIEROGLYPH A249 -1451C ; [.51E2.0020.0002] # ANATOLIAN HIEROGLYPH A250 -1451D ; [.51E3.0020.0002] # ANATOLIAN HIEROGLYPH A251 -1451E ; [.51E4.0020.0002] # ANATOLIAN HIEROGLYPH A252 -1451F ; [.51E5.0020.0002] # ANATOLIAN HIEROGLYPH A253 -14520 ; [.51E6.0020.0002] # ANATOLIAN HIEROGLYPH A254 -14521 ; [.51E7.0020.0002] # ANATOLIAN HIEROGLYPH A255 -14522 ; [.51E8.0020.0002] # ANATOLIAN HIEROGLYPH A256 -14523 ; [.51E9.0020.0002] # ANATOLIAN HIEROGLYPH A257 -14524 ; [.51EA.0020.0002] # ANATOLIAN HIEROGLYPH A258 -14525 ; [.51EB.0020.0002] # ANATOLIAN HIEROGLYPH A259 -14526 ; [.51EC.0020.0002] # ANATOLIAN HIEROGLYPH A260 -14527 ; [.51ED.0020.0002] # ANATOLIAN HIEROGLYPH A261 -14528 ; [.51EE.0020.0002] # ANATOLIAN HIEROGLYPH A262 -14529 ; [.51EF.0020.0002] # ANATOLIAN HIEROGLYPH A263 -1452A ; [.51F0.0020.0002] # ANATOLIAN HIEROGLYPH A264 -1452B ; [.51F1.0020.0002] # ANATOLIAN HIEROGLYPH A265 -1452C ; [.51F2.0020.0002] # ANATOLIAN HIEROGLYPH A266 -1452D ; [.51F3.0020.0002] # ANATOLIAN HIEROGLYPH A267 -1452E ; [.51F4.0020.0002] # ANATOLIAN HIEROGLYPH A267A -1452F ; [.51F5.0020.0002] # ANATOLIAN HIEROGLYPH A268 -14530 ; [.51F6.0020.0002] # ANATOLIAN HIEROGLYPH A269 -14531 ; [.51F7.0020.0002] # ANATOLIAN HIEROGLYPH A270 -14532 ; [.51F8.0020.0002] # ANATOLIAN HIEROGLYPH A271 -14533 ; [.51F9.0020.0002] # ANATOLIAN HIEROGLYPH A272 -14534 ; [.51FA.0020.0002] # ANATOLIAN HIEROGLYPH A273 -14535 ; [.51FB.0020.0002] # ANATOLIAN HIEROGLYPH A274 -14536 ; [.51FC.0020.0002] # ANATOLIAN HIEROGLYPH A275 -14537 ; [.51FD.0020.0002] # ANATOLIAN HIEROGLYPH A276 -14538 ; [.51FE.0020.0002] # ANATOLIAN HIEROGLYPH A277 -14539 ; [.51FF.0020.0002] # ANATOLIAN HIEROGLYPH A278 -1453A ; [.5200.0020.0002] # ANATOLIAN HIEROGLYPH A279 -1453B ; [.5201.0020.0002] # ANATOLIAN HIEROGLYPH A280 -1453C ; [.5202.0020.0002] # ANATOLIAN HIEROGLYPH A281 -1453D ; [.5203.0020.0002] # ANATOLIAN HIEROGLYPH A282 -1453E ; [.5204.0020.0002] # ANATOLIAN HIEROGLYPH A283 -1453F ; [.5205.0020.0002] # ANATOLIAN HIEROGLYPH A284 -14540 ; [.5206.0020.0002] # ANATOLIAN HIEROGLYPH A285 -14541 ; [.5207.0020.0002] # ANATOLIAN HIEROGLYPH A286 -14542 ; [.5208.0020.0002] # ANATOLIAN HIEROGLYPH A287 -14543 ; [.5209.0020.0002] # ANATOLIAN HIEROGLYPH A288 -14544 ; [.520A.0020.0002] # ANATOLIAN HIEROGLYPH A289 -14545 ; [.520B.0020.0002] # ANATOLIAN HIEROGLYPH A289A -14546 ; [.520C.0020.0002] # ANATOLIAN HIEROGLYPH A290 -14547 ; [.520D.0020.0002] # ANATOLIAN HIEROGLYPH A291 -14548 ; [.520E.0020.0002] # ANATOLIAN HIEROGLYPH A292 -14549 ; [.520F.0020.0002] # ANATOLIAN HIEROGLYPH A293 -1454A ; [.5210.0020.0002] # ANATOLIAN HIEROGLYPH A294 -1454B ; [.5211.0020.0002] # ANATOLIAN HIEROGLYPH A294A -1454C ; [.5212.0020.0002] # ANATOLIAN HIEROGLYPH A295 -1454D ; [.5213.0020.0002] # ANATOLIAN HIEROGLYPH A296 -1454E ; [.5214.0020.0002] # ANATOLIAN HIEROGLYPH A297 -1454F ; [.5215.0020.0002] # ANATOLIAN HIEROGLYPH A298 -14550 ; [.5216.0020.0002] # ANATOLIAN HIEROGLYPH A299 -14551 ; [.5217.0020.0002] # ANATOLIAN HIEROGLYPH A299A -14552 ; [.5218.0020.0002] # ANATOLIAN HIEROGLYPH A300 -14553 ; [.5219.0020.0002] # ANATOLIAN HIEROGLYPH A301 -14554 ; [.521A.0020.0002] # ANATOLIAN HIEROGLYPH A302 -14555 ; [.521B.0020.0002] # ANATOLIAN HIEROGLYPH A303 -14556 ; [.521C.0020.0002] # ANATOLIAN HIEROGLYPH A304 -14557 ; [.521D.0020.0002] # ANATOLIAN HIEROGLYPH A305 -14558 ; [.521E.0020.0002] # ANATOLIAN HIEROGLYPH A306 -14559 ; [.521F.0020.0002] # ANATOLIAN HIEROGLYPH A307 -1455A ; [.5220.0020.0002] # ANATOLIAN HIEROGLYPH A308 -1455B ; [.5221.0020.0002] # ANATOLIAN HIEROGLYPH A309 -1455C ; [.5222.0020.0002] # ANATOLIAN HIEROGLYPH A309A -1455D ; [.5223.0020.0002] # ANATOLIAN HIEROGLYPH A310 -1455E ; [.5224.0020.0002] # ANATOLIAN HIEROGLYPH A311 -1455F ; [.5225.0020.0002] # ANATOLIAN HIEROGLYPH A312 -14560 ; [.5226.0020.0002] # ANATOLIAN HIEROGLYPH A313 -14561 ; [.5227.0020.0002] # ANATOLIAN HIEROGLYPH A314 -14562 ; [.5228.0020.0002] # ANATOLIAN HIEROGLYPH A315 -14563 ; [.5229.0020.0002] # ANATOLIAN HIEROGLYPH A316 -14564 ; [.522A.0020.0002] # ANATOLIAN HIEROGLYPH A317 -14565 ; [.522B.0020.0002] # ANATOLIAN HIEROGLYPH A318 -14566 ; [.522C.0020.0002] # ANATOLIAN HIEROGLYPH A319 -14567 ; [.522D.0020.0002] # ANATOLIAN HIEROGLYPH A320 -14568 ; [.522E.0020.0002] # ANATOLIAN HIEROGLYPH A321 -14569 ; [.522F.0020.0002] # ANATOLIAN HIEROGLYPH A322 -1456A ; [.5230.0020.0002] # ANATOLIAN HIEROGLYPH A323 -1456B ; [.5231.0020.0002] # ANATOLIAN HIEROGLYPH A324 -1456C ; [.5232.0020.0002] # ANATOLIAN HIEROGLYPH A325 -1456D ; [.5233.0020.0002] # ANATOLIAN HIEROGLYPH A326 -1456E ; [.5234.0020.0002] # ANATOLIAN HIEROGLYPH A327 -1456F ; [.5235.0020.0002] # ANATOLIAN HIEROGLYPH A328 -14570 ; [.5236.0020.0002] # ANATOLIAN HIEROGLYPH A329 -14571 ; [.5237.0020.0002] # ANATOLIAN HIEROGLYPH A329A -14572 ; [.5238.0020.0002] # ANATOLIAN HIEROGLYPH A330 -14573 ; [.5239.0020.0002] # ANATOLIAN HIEROGLYPH A331 -14574 ; [.523A.0020.0002] # ANATOLIAN HIEROGLYPH A332A -14575 ; [.523B.0020.0002] # ANATOLIAN HIEROGLYPH A332B -14576 ; [.523C.0020.0002] # ANATOLIAN HIEROGLYPH A332C -14577 ; [.523D.0020.0002] # ANATOLIAN HIEROGLYPH A333 -14578 ; [.523E.0020.0002] # ANATOLIAN HIEROGLYPH A334 -14579 ; [.523F.0020.0002] # ANATOLIAN HIEROGLYPH A335 -1457A ; [.5240.0020.0002] # ANATOLIAN HIEROGLYPH A336 -1457B ; [.5241.0020.0002] # ANATOLIAN HIEROGLYPH A336A -1457C ; [.5242.0020.0002] # ANATOLIAN HIEROGLYPH A336B -1457D ; [.5243.0020.0002] # ANATOLIAN HIEROGLYPH A336C -1457E ; [.5244.0020.0002] # ANATOLIAN HIEROGLYPH A337 -1457F ; [.5245.0020.0002] # ANATOLIAN HIEROGLYPH A338 -14580 ; [.5246.0020.0002] # ANATOLIAN HIEROGLYPH A339 -14581 ; [.5247.0020.0002] # ANATOLIAN HIEROGLYPH A340 -14582 ; [.5248.0020.0002] # ANATOLIAN HIEROGLYPH A341 -14583 ; [.5249.0020.0002] # ANATOLIAN HIEROGLYPH A342 -14584 ; [.524A.0020.0002] # ANATOLIAN HIEROGLYPH A343 -14585 ; [.524B.0020.0002] # ANATOLIAN HIEROGLYPH A344 -14586 ; [.524C.0020.0002] # ANATOLIAN HIEROGLYPH A345 -14587 ; [.524D.0020.0002] # ANATOLIAN HIEROGLYPH A346 -14588 ; [.524E.0020.0002] # ANATOLIAN HIEROGLYPH A347 -14589 ; [.524F.0020.0002] # ANATOLIAN HIEROGLYPH A348 -1458A ; [.5250.0020.0002] # ANATOLIAN HIEROGLYPH A349 -1458B ; [.5251.0020.0002] # ANATOLIAN HIEROGLYPH A350 -1458C ; [.5252.0020.0002] # ANATOLIAN HIEROGLYPH A351 -1458D ; [.5253.0020.0002] # ANATOLIAN HIEROGLYPH A352 -1458E ; [.5254.0020.0002] # ANATOLIAN HIEROGLYPH A353 -1458F ; [.5255.0020.0002] # ANATOLIAN HIEROGLYPH A354 -14590 ; [.5256.0020.0002] # ANATOLIAN HIEROGLYPH A355 -14591 ; [.5257.0020.0002] # ANATOLIAN HIEROGLYPH A356 -14592 ; [.5258.0020.0002] # ANATOLIAN HIEROGLYPH A357 -14593 ; [.5259.0020.0002] # ANATOLIAN HIEROGLYPH A358 -14594 ; [.525A.0020.0002] # ANATOLIAN HIEROGLYPH A359 -14595 ; [.525B.0020.0002] # ANATOLIAN HIEROGLYPH A359A -14596 ; [.525C.0020.0002] # ANATOLIAN HIEROGLYPH A360 -14597 ; [.525D.0020.0002] # ANATOLIAN HIEROGLYPH A361 -14598 ; [.525E.0020.0002] # ANATOLIAN HIEROGLYPH A362 -14599 ; [.525F.0020.0002] # ANATOLIAN HIEROGLYPH A363 -1459A ; [.5260.0020.0002] # ANATOLIAN HIEROGLYPH A364 -1459B ; [.5261.0020.0002] # ANATOLIAN HIEROGLYPH A364A -1459C ; [.5262.0020.0002] # ANATOLIAN HIEROGLYPH A365 -1459D ; [.5263.0020.0002] # ANATOLIAN HIEROGLYPH A366 -1459E ; [.5264.0020.0002] # ANATOLIAN HIEROGLYPH A367 -1459F ; [.5265.0020.0002] # ANATOLIAN HIEROGLYPH A368 -145A0 ; [.5266.0020.0002] # ANATOLIAN HIEROGLYPH A368A -145A1 ; [.5267.0020.0002] # ANATOLIAN HIEROGLYPH A369 -145A2 ; [.5268.0020.0002] # ANATOLIAN HIEROGLYPH A370 -145A3 ; [.5269.0020.0002] # ANATOLIAN HIEROGLYPH A371 -145A4 ; [.526A.0020.0002] # ANATOLIAN HIEROGLYPH A371A -145A5 ; [.526B.0020.0002] # ANATOLIAN HIEROGLYPH A372 -145A6 ; [.526C.0020.0002] # ANATOLIAN HIEROGLYPH A373 -145A7 ; [.526D.0020.0002] # ANATOLIAN HIEROGLYPH A374 -145A8 ; [.526E.0020.0002] # ANATOLIAN HIEROGLYPH A375 -145A9 ; [.526F.0020.0002] # ANATOLIAN HIEROGLYPH A376 -145AA ; [.5270.0020.0002] # ANATOLIAN HIEROGLYPH A377 -145AB ; [.5271.0020.0002] # ANATOLIAN HIEROGLYPH A378 -145AC ; [.5272.0020.0002] # ANATOLIAN HIEROGLYPH A379 -145AD ; [.5273.0020.0002] # ANATOLIAN HIEROGLYPH A380 -145AE ; [.5274.0020.0002] # ANATOLIAN HIEROGLYPH A381 -145AF ; [.5275.0020.0002] # ANATOLIAN HIEROGLYPH A381A -145B0 ; [.5276.0020.0002] # ANATOLIAN HIEROGLYPH A382 -145B1 ; [.5277.0020.0002] # ANATOLIAN HIEROGLYPH A383 RA OR RI -145B2 ; [.5278.0020.0002] # ANATOLIAN HIEROGLYPH A383A -145B3 ; [.5279.0020.0002] # ANATOLIAN HIEROGLYPH A384 -145B4 ; [.527A.0020.0002] # ANATOLIAN HIEROGLYPH A385 -145B5 ; [.527B.0020.0002] # ANATOLIAN HIEROGLYPH A386 -145B6 ; [.527C.0020.0002] # ANATOLIAN HIEROGLYPH A386A -145B7 ; [.527D.0020.0002] # ANATOLIAN HIEROGLYPH A387 -145B8 ; [.527E.0020.0002] # ANATOLIAN HIEROGLYPH A388 -145B9 ; [.527F.0020.0002] # ANATOLIAN HIEROGLYPH A389 -145BA ; [.5280.0020.0002] # ANATOLIAN HIEROGLYPH A390 -145BB ; [.5281.0020.0002] # ANATOLIAN HIEROGLYPH A391 -145BC ; [.5282.0020.0002] # ANATOLIAN HIEROGLYPH A392 -145BD ; [.5283.0020.0002] # ANATOLIAN HIEROGLYPH A393 EIGHT -145BE ; [.5284.0020.0002] # ANATOLIAN HIEROGLYPH A394 -145BF ; [.5285.0020.0002] # ANATOLIAN HIEROGLYPH A395 -145C0 ; [.5286.0020.0002] # ANATOLIAN HIEROGLYPH A396 -145C1 ; [.5287.0020.0002] # ANATOLIAN HIEROGLYPH A397 -145C2 ; [.5288.0020.0002] # ANATOLIAN HIEROGLYPH A398 -145C3 ; [.5289.0020.0002] # ANATOLIAN HIEROGLYPH A399 -145C4 ; [.528A.0020.0002] # ANATOLIAN HIEROGLYPH A400 -145C5 ; [.528B.0020.0002] # ANATOLIAN HIEROGLYPH A401 -145C6 ; [.528C.0020.0002] # ANATOLIAN HIEROGLYPH A402 -145C7 ; [.528D.0020.0002] # ANATOLIAN HIEROGLYPH A403 -145C8 ; [.528E.0020.0002] # ANATOLIAN HIEROGLYPH A404 -145C9 ; [.528F.0020.0002] # ANATOLIAN HIEROGLYPH A405 -145CA ; [.5290.0020.0002] # ANATOLIAN HIEROGLYPH A406 -145CB ; [.5291.0020.0002] # ANATOLIAN HIEROGLYPH A407 -145CC ; [.5292.0020.0002] # ANATOLIAN HIEROGLYPH A408 -145CD ; [.5293.0020.0002] # ANATOLIAN HIEROGLYPH A409 -145CE ; [.5294.0020.0002] # ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK -145CF ; [.5295.0020.0002] # ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK -145D0 ; [.5296.0020.0002] # ANATOLIAN HIEROGLYPH A411 -145D1 ; [.5297.0020.0002] # ANATOLIAN HIEROGLYPH A412 -145D2 ; [.5298.0020.0002] # ANATOLIAN HIEROGLYPH A413 -145D3 ; [.5299.0020.0002] # ANATOLIAN HIEROGLYPH A414 -145D4 ; [.529A.0020.0002] # ANATOLIAN HIEROGLYPH A415 -145D5 ; [.529B.0020.0002] # ANATOLIAN HIEROGLYPH A416 -145D6 ; [.529C.0020.0002] # ANATOLIAN HIEROGLYPH A417 -145D7 ; [.529D.0020.0002] # ANATOLIAN HIEROGLYPH A418 -145D8 ; [.529E.0020.0002] # ANATOLIAN HIEROGLYPH A419 -145D9 ; [.529F.0020.0002] # ANATOLIAN HIEROGLYPH A420 -145DA ; [.52A0.0020.0002] # ANATOLIAN HIEROGLYPH A421 -145DB ; [.52A1.0020.0002] # ANATOLIAN HIEROGLYPH A422 -145DC ; [.52A2.0020.0002] # ANATOLIAN HIEROGLYPH A423 -145DD ; [.52A3.0020.0002] # ANATOLIAN HIEROGLYPH A424 -145DE ; [.52A4.0020.0002] # ANATOLIAN HIEROGLYPH A425 -145DF ; [.52A5.0020.0002] # ANATOLIAN HIEROGLYPH A426 -145E0 ; [.52A6.0020.0002] # ANATOLIAN HIEROGLYPH A427 -145E1 ; [.52A7.0020.0002] # ANATOLIAN HIEROGLYPH A428 -145E2 ; [.52A8.0020.0002] # ANATOLIAN HIEROGLYPH A429 -145E3 ; [.52A9.0020.0002] # ANATOLIAN HIEROGLYPH A430 -145E4 ; [.52AA.0020.0002] # ANATOLIAN HIEROGLYPH A431 -145E5 ; [.52AB.0020.0002] # ANATOLIAN HIEROGLYPH A432 -145E6 ; [.52AC.0020.0002] # ANATOLIAN HIEROGLYPH A433 -145E7 ; [.52AD.0020.0002] # ANATOLIAN HIEROGLYPH A434 -145E8 ; [.52AE.0020.0002] # ANATOLIAN HIEROGLYPH A435 -145E9 ; [.52AF.0020.0002] # ANATOLIAN HIEROGLYPH A436 -145EA ; [.52B0.0020.0002] # ANATOLIAN HIEROGLYPH A437 -145EB ; [.52B1.0020.0002] # ANATOLIAN HIEROGLYPH A438 -145EC ; [.52B2.0020.0002] # ANATOLIAN HIEROGLYPH A439 -145ED ; [.52B3.0020.0002] # ANATOLIAN HIEROGLYPH A440 -145EE ; [.52B4.0020.0002] # ANATOLIAN HIEROGLYPH A441 -145EF ; [.52B5.0020.0002] # ANATOLIAN HIEROGLYPH A442 -145F0 ; [.52B6.0020.0002] # ANATOLIAN HIEROGLYPH A443 -145F1 ; [.52B7.0020.0002] # ANATOLIAN HIEROGLYPH A444 -145F2 ; [.52B8.0020.0002] # ANATOLIAN HIEROGLYPH A445 -145F3 ; [.52B9.0020.0002] # ANATOLIAN HIEROGLYPH A446 -145F4 ; [.52BA.0020.0002] # ANATOLIAN HIEROGLYPH A447 -145F5 ; [.52BB.0020.0002] # ANATOLIAN HIEROGLYPH A448 -145F6 ; [.52BC.0020.0002] # ANATOLIAN HIEROGLYPH A449 -145F7 ; [.52BD.0020.0002] # ANATOLIAN HIEROGLYPH A450 -145F8 ; [.52BE.0020.0002] # ANATOLIAN HIEROGLYPH A450A -145F9 ; [.52BF.0020.0002] # ANATOLIAN HIEROGLYPH A451 -145FA ; [.52C0.0020.0002] # ANATOLIAN HIEROGLYPH A452 -145FB ; [.52C1.0020.0002] # ANATOLIAN HIEROGLYPH A453 -145FC ; [.52C2.0020.0002] # ANATOLIAN HIEROGLYPH A454 -145FD ; [.52C3.0020.0002] # ANATOLIAN HIEROGLYPH A455 -145FE ; [.52C4.0020.0002] # ANATOLIAN HIEROGLYPH A456 -145FF ; [.52C5.0020.0002] # ANATOLIAN HIEROGLYPH A457 -14600 ; [.52C6.0020.0002] # ANATOLIAN HIEROGLYPH A457A -14601 ; [.52C7.0020.0002] # ANATOLIAN HIEROGLYPH A458 -14602 ; [.52C8.0020.0002] # ANATOLIAN HIEROGLYPH A459 -14603 ; [.52C9.0020.0002] # ANATOLIAN HIEROGLYPH A460 -14604 ; [.52CA.0020.0002] # ANATOLIAN HIEROGLYPH A461 -14605 ; [.52CB.0020.0002] # ANATOLIAN HIEROGLYPH A462 -14606 ; [.52CC.0020.0002] # ANATOLIAN HIEROGLYPH A463 -14607 ; [.52CD.0020.0002] # ANATOLIAN HIEROGLYPH A464 -14608 ; [.52CE.0020.0002] # ANATOLIAN HIEROGLYPH A465 -14609 ; [.52CF.0020.0002] # ANATOLIAN HIEROGLYPH A466 -1460A ; [.52D0.0020.0002] # ANATOLIAN HIEROGLYPH A467 -1460B ; [.52D1.0020.0002] # ANATOLIAN HIEROGLYPH A468 -1460C ; [.52D2.0020.0002] # ANATOLIAN HIEROGLYPH A469 -1460D ; [.52D3.0020.0002] # ANATOLIAN HIEROGLYPH A470 -1460E ; [.52D4.0020.0002] # ANATOLIAN HIEROGLYPH A471 -1460F ; [.52D5.0020.0002] # ANATOLIAN HIEROGLYPH A472 -14610 ; [.52D6.0020.0002] # ANATOLIAN HIEROGLYPH A473 -14611 ; [.52D7.0020.0002] # ANATOLIAN HIEROGLYPH A474 -14612 ; [.52D8.0020.0002] # ANATOLIAN HIEROGLYPH A475 -14613 ; [.52D9.0020.0002] # ANATOLIAN HIEROGLYPH A476 -14614 ; [.52DA.0020.0002] # ANATOLIAN HIEROGLYPH A477 -14615 ; [.52DB.0020.0002] # ANATOLIAN HIEROGLYPH A478 -14616 ; [.52DC.0020.0002] # ANATOLIAN HIEROGLYPH A479 -14617 ; [.52DD.0020.0002] # ANATOLIAN HIEROGLYPH A480 -14618 ; [.52DE.0020.0002] # ANATOLIAN HIEROGLYPH A481 -14619 ; [.52DF.0020.0002] # ANATOLIAN HIEROGLYPH A482 -1461A ; [.52E0.0020.0002] # ANATOLIAN HIEROGLYPH A483 -1461B ; [.52E1.0020.0002] # ANATOLIAN HIEROGLYPH A484 -1461C ; [.52E2.0020.0002] # ANATOLIAN HIEROGLYPH A485 -1461D ; [.52E3.0020.0002] # ANATOLIAN HIEROGLYPH A486 -1461E ; [.52E4.0020.0002] # ANATOLIAN HIEROGLYPH A487 -1461F ; [.52E5.0020.0002] # ANATOLIAN HIEROGLYPH A488 -14620 ; [.52E6.0020.0002] # ANATOLIAN HIEROGLYPH A489 -14621 ; [.52E7.0020.0002] # ANATOLIAN HIEROGLYPH A490 -14622 ; [.52E8.0020.0002] # ANATOLIAN HIEROGLYPH A491 -14623 ; [.52E9.0020.0002] # ANATOLIAN HIEROGLYPH A492 -14624 ; [.52EA.0020.0002] # ANATOLIAN HIEROGLYPH A493 -14625 ; [.52EB.0020.0002] # ANATOLIAN HIEROGLYPH A494 -14626 ; [.52EC.0020.0002] # ANATOLIAN HIEROGLYPH A495 -14627 ; [.52ED.0020.0002] # ANATOLIAN HIEROGLYPH A496 -14628 ; [.52EE.0020.0002] # ANATOLIAN HIEROGLYPH A497 -14629 ; [.52EF.0020.0002] # ANATOLIAN HIEROGLYPH A501 -1462A ; [.52F0.0020.0002] # ANATOLIAN HIEROGLYPH A502 -1462B ; [.52F1.0020.0002] # ANATOLIAN HIEROGLYPH A503 -1462C ; [.52F2.0020.0002] # ANATOLIAN HIEROGLYPH A504 -1462D ; [.52F3.0020.0002] # ANATOLIAN HIEROGLYPH A505 -1462E ; [.52F4.0020.0002] # ANATOLIAN HIEROGLYPH A506 -1462F ; [.52F5.0020.0002] # ANATOLIAN HIEROGLYPH A507 -14630 ; [.52F6.0020.0002] # ANATOLIAN HIEROGLYPH A508 -14631 ; [.52F7.0020.0002] # ANATOLIAN HIEROGLYPH A509 -14632 ; [.52F8.0020.0002] # ANATOLIAN HIEROGLYPH A510 -14633 ; [.52F9.0020.0002] # ANATOLIAN HIEROGLYPH A511 -14634 ; [.52FA.0020.0002] # ANATOLIAN HIEROGLYPH A512 -14635 ; [.52FB.0020.0002] # ANATOLIAN HIEROGLYPH A513 -14636 ; [.52FC.0020.0002] # ANATOLIAN HIEROGLYPH A514 -14637 ; [.52FD.0020.0002] # ANATOLIAN HIEROGLYPH A515 -14638 ; [.52FE.0020.0002] # ANATOLIAN HIEROGLYPH A516 -14639 ; [.52FF.0020.0002] # ANATOLIAN HIEROGLYPH A517 -1463A ; [.5300.0020.0002] # ANATOLIAN HIEROGLYPH A518 -1463B ; [.5301.0020.0002] # ANATOLIAN HIEROGLYPH A519 -1463C ; [.5302.0020.0002] # ANATOLIAN HIEROGLYPH A520 -1463D ; [.5303.0020.0002] # ANATOLIAN HIEROGLYPH A521 -1463E ; [.5304.0020.0002] # ANATOLIAN HIEROGLYPH A522 -1463F ; [.5305.0020.0002] # ANATOLIAN HIEROGLYPH A523 -14640 ; [.5306.0020.0002] # ANATOLIAN HIEROGLYPH A524 -14641 ; [.5307.0020.0002] # ANATOLIAN HIEROGLYPH A525 -14642 ; [.5308.0020.0002] # ANATOLIAN HIEROGLYPH A526 -14643 ; [.5309.0020.0002] # ANATOLIAN HIEROGLYPH A527 -14644 ; [.530A.0020.0002] # ANATOLIAN HIEROGLYPH A528 -14645 ; [.530B.0020.0002] # ANATOLIAN HIEROGLYPH A529 -14646 ; [.530C.0020.0002] # ANATOLIAN HIEROGLYPH A530 +1E944 ; [.0000.00BD.0002] # ADLAM ALIF LENGTHENER +1E945 ; [.0000.00BD.0002] # ADLAM VOWEL LENGTHENER +1E946 ; [.0000.00BD.0002] # ADLAM GEMINATION MARK +1E94A ; [.0000.00BE.0002] # ADLAM NUKTA +1E947 ; [.0000.00BF.0002] # ADLAM HAMZA +1E948 ; [.0000.00C0.0002] # ADLAM CONSONANT MODIFIER +1E949 ; [.0000.00C1.0002] # ADLAM GEMINATE CONSONANT MODIFIER +093C ; [.0000.00C2.0002] # DEVANAGARI SIGN NUKTA +09BC ; [.0000.00C2.0002] # BENGALI SIGN NUKTA +0A3C ; [.0000.00C2.0002] # GURMUKHI SIGN NUKTA +0ABC ; [.0000.00C2.0002] # GUJARATI SIGN NUKTA +0B3C ; [.0000.00C2.0002] # ORIYA SIGN NUKTA +0CBC ; [.0000.00C2.0002] # KANNADA SIGN NUKTA +1B34 ; [.0000.00C2.0002] # BALINESE SIGN REREKAN +1BE6 ; [.0000.00C2.0002] # BATAK SIGN TOMPI +1C37 ; [.0000.00C2.0002] # LEPCHA SIGN NUKTA +A9B3 ; [.0000.00C2.0002] # JAVANESE SIGN CECAK TELU +110BA ; [.0000.00C2.0002] # KAITHI SIGN NUKTA +11173 ; [.0000.00C2.0002] # MAHAJANI SIGN NUKTA +111CA ; [.0000.00C2.0002] # SHARADA SIGN NUKTA +11236 ; [.0000.00C2.0002] # KHOJKI SIGN NUKTA +112E9 ; [.0000.00C2.0002] # KHUDAWADI SIGN NUKTA +1133C ; [.0000.00C2.0002] # GRANTHA SIGN NUKTA +11446 ; [.0000.00C2.0002] # NEWA SIGN NUKTA +114C3 ; [.0000.00C2.0002] # TIRHUTA SIGN NUKTA +115C0 ; [.0000.00C2.0002] # SIDDHAM SIGN NUKTA +116B7 ; [.0000.00C2.0002] # TAKRI SIGN NUKTA +0900 ; [.0000.00C3.0002] # DEVANAGARI SIGN INVERTED CANDRABINDU +0901 ; [.0000.00C3.0002] # DEVANAGARI SIGN CANDRABINDU +0981 ; [.0000.00C3.0002] # BENGALI SIGN CANDRABINDU +0A01 ; [.0000.00C3.0002] # GURMUKHI SIGN ADAK BINDI +0A81 ; [.0000.00C3.0002] # GUJARATI SIGN CANDRABINDU +0B01 ; [.0000.00C3.0002] # ORIYA SIGN CANDRABINDU +0C00 ; [.0000.00C3.0002] # TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01 ; [.0000.00C3.0002] # TELUGU SIGN CANDRABINDU +0C81 ; [.0000.00C3.0002] # KANNADA SIGN CANDRABINDU +0D01 ; [.0000.00C3.0002] # MALAYALAM SIGN CANDRABINDU +1B00 ; [.0000.00C3.0002] # BALINESE SIGN ULU RICEM +1B01 ; [.0000.00C3.0002] # BALINESE SIGN ULU CANDRA +A8C5 ; [.0000.00C3.0002] # SAURASHTRA SIGN CANDRABINDU +A980 ; [.0000.00C3.0002] # JAVANESE SIGN PANYANGGA +11000 ; [.0000.00C3.0002] # BRAHMI SIGN CANDRABINDU +11080 ; [.0000.00C3.0002] # KAITHI SIGN CANDRABINDU +11100 ; [.0000.00C3.0002] # CHAKMA SIGN CANDRABINDU +11180 ; [.0000.00C3.0002] # SHARADA SIGN CANDRABINDU +11301 ; [.0000.00C3.0002] # GRANTHA SIGN CANDRABINDU +11443 ; [.0000.00C3.0002] # NEWA SIGN CANDRABINDU +114BF ; [.0000.00C3.0002] # TIRHUTA SIGN CANDRABINDU +115BC ; [.0000.00C3.0002] # SIDDHAM SIGN CANDRABINDU +11640 ; [.0000.00C3.0002] # MODI SIGN ARDHACANDRA +11C3C ; [.0000.00C3.0002] # BHAIKSUKI SIGN CANDRABINDU +11CB6 ; [.0000.00C3.0002] # MARCHEN SIGN CANDRABINDU +0902 ; [.0000.00C4.0002] # DEVANAGARI SIGN ANUSVARA +0982 ; [.0000.00C4.0002] # BENGALI SIGN ANUSVARA +0A02 ; [.0000.00C4.0002] # GURMUKHI SIGN BINDI +0A82 ; [.0000.00C4.0002] # GUJARATI SIGN ANUSVARA +0B02 ; [.0000.00C4.0002] # ORIYA SIGN ANUSVARA +0B82 ; [.0000.00C4.0002] # TAMIL SIGN ANUSVARA +0C02 ; [.0000.00C4.0002] # TELUGU SIGN ANUSVARA +0C82 ; [.0000.00C4.0002] # KANNADA SIGN ANUSVARA +0D02 ; [.0000.00C4.0002] # MALAYALAM SIGN ANUSVARA +0D82 ; [.0000.00C4.0002] # SINHALA SIGN ANUSVARAYA +0F7E ; [.0000.00C4.0002] # TIBETAN SIGN RJES SU NGA RO +1036 ; [.0000.00C4.0002] # MYANMAR SIGN ANUSVARA +17C6 ; [.0000.00C4.0002] # KHMER SIGN NIKAHIT +1A74 ; [.0000.00C4.0002] # TAI THAM SIGN MAI KANG +1B02 ; [.0000.00C4.0002] # BALINESE SIGN CECEK +1B80 ; [.0000.00C4.0002] # SUNDANESE SIGN PANYECEK +1CED ; [.0000.00C4.0002] # VEDIC SIGN TIRYAK +A80B ; [.0000.00C4.0002] # SYLOTI NAGRI SIGN ANUSVARA +A880 ; [.0000.00C4.0002] # SAURASHTRA SIGN ANUSVARA +A981 ; [.0000.00C4.0002] # JAVANESE SIGN CECAK +10A0E ; [.0000.00C4.0002] # KHAROSHTHI SIGN ANUSVARA +11001 ; [.0000.00C4.0002] # BRAHMI SIGN ANUSVARA +11081 ; [.0000.00C4.0002] # KAITHI SIGN ANUSVARA +11101 ; [.0000.00C4.0002] # CHAKMA SIGN ANUSVARA +11181 ; [.0000.00C4.0002] # SHARADA SIGN ANUSVARA +11234 ; [.0000.00C4.0002] # KHOJKI SIGN ANUSVARA +112DF ; [.0000.00C4.0002] # KHUDAWADI SIGN ANUSVARA +11300 ; [.0000.00C4.0002] # GRANTHA SIGN COMBINING ANUSVARA ABOVE +11302 ; [.0000.00C4.0002] # GRANTHA SIGN ANUSVARA +11444 ; [.0000.00C4.0002] # NEWA SIGN ANUSVARA +114C0 ; [.0000.00C4.0002] # TIRHUTA SIGN ANUSVARA +115BD ; [.0000.00C4.0002] # SIDDHAM SIGN ANUSVARA +1163D ; [.0000.00C4.0002] # MODI SIGN ANUSVARA +116AB ; [.0000.00C4.0002] # TAKRI SIGN ANUSVARA +11C3D ; [.0000.00C4.0002] # BHAIKSUKI SIGN ANUSVARA +11CB5 ; [.0000.00C4.0002] # MARCHEN SIGN ANUSVARA +0903 ; [.0000.00C5.0002] # DEVANAGARI SIGN VISARGA +0983 ; [.0000.00C5.0002] # BENGALI SIGN VISARGA +0A03 ; [.0000.00C5.0002] # GURMUKHI SIGN VISARGA +0A83 ; [.0000.00C5.0002] # GUJARATI SIGN VISARGA +0B03 ; [.0000.00C5.0002] # ORIYA SIGN VISARGA +0C03 ; [.0000.00C5.0002] # TELUGU SIGN VISARGA +0C83 ; [.0000.00C5.0002] # KANNADA SIGN VISARGA +0D03 ; [.0000.00C5.0002] # MALAYALAM SIGN VISARGA +0D83 ; [.0000.00C5.0002] # SINHALA SIGN VISARGAYA +0F7F ; [.0000.00C5.0002] # TIBETAN SIGN RNAM BCAD +1038 ; [.0000.00C5.0002] # MYANMAR SIGN VISARGA +17C7 ; [.0000.00C5.0002] # KHMER SIGN REAHMUK +1B04 ; [.0000.00C5.0002] # BALINESE SIGN BISAH +1B82 ; [.0000.00C5.0002] # SUNDANESE SIGN PANGWISAD +1CF2 ; [.0000.00C5.0002] # VEDIC SIGN ARDHAVISARGA +1CF3 ; [.0000.00C5.0002] # VEDIC SIGN ROTATED ARDHAVISARGA +A881 ; [.0000.00C5.0002] # SAURASHTRA SIGN VISARGA +A983 ; [.0000.00C5.0002] # JAVANESE SIGN WIGNYAN +10A0F ; [.0000.00C5.0002] # KHAROSHTHI SIGN VISARGA +11002 ; [.0000.00C5.0002] # BRAHMI SIGN VISARGA +11082 ; [.0000.00C5.0002] # KAITHI SIGN VISARGA +11102 ; [.0000.00C5.0002] # CHAKMA SIGN VISARGA +11182 ; [.0000.00C5.0002] # SHARADA SIGN VISARGA +11303 ; [.0000.00C5.0002] # GRANTHA SIGN VISARGA +11445 ; [.0000.00C5.0002] # NEWA SIGN VISARGA +114C1 ; [.0000.00C5.0002] # TIRHUTA SIGN VISARGA +115BE ; [.0000.00C5.0002] # SIDDHAM SIGN VISARGA +1163E ; [.0000.00C5.0002] # MODI SIGN VISARGA +116AC ; [.0000.00C5.0002] # TAKRI SIGN VISARGA +11C3E ; [.0000.00C5.0002] # BHAIKSUKI SIGN VISARGA +0A70 ; [.0000.00C6.0002] # GURMUKHI TIPPI +0A71 ; [.0000.00C7.0002] # GURMUKHI ADDAK +1B03 ; [.0000.00C8.0002] # BALINESE SIGN SURANG +A982 ; [.0000.00C9.0002] # JAVANESE SIGN LAYAR +1B81 ; [.0000.00CA.0002] # SUNDANESE SIGN PANGLAYAR +ABEC ; [.0000.00CB.0002] # MEETEI MAYEK LUM IYEK +10A38 ; [.0000.00CC.0002] # KHAROSHTHI SIGN BAR ABOVE +10A39 ; [.0000.00CD.0002] # KHAROSHTHI SIGN CAUDA +10A3A ; [.0000.00CE.0002] # KHAROSHTHI SIGN DOT BELOW +111CB ; [.0000.00CF.0002] # SHARADA VOWEL MODIFIER MARK +111CC ; [.0000.00D0.0002] # SHARADA EXTRA SHORT VOWEL MARK +0E4E ; [.0000.00D1.0002] # THAI CHARACTER YAMAKKAN +0E47 ; [.0000.00D2.0002] # THAI CHARACTER MAITAIKHU +0E48 ; [.0000.00D3.0002] # THAI CHARACTER MAI EK +0E49 ; [.0000.00D4.0002] # THAI CHARACTER MAI THO +0E4A ; [.0000.00D5.0002] # THAI CHARACTER MAI TRI +0E4B ; [.0000.00D6.0002] # THAI CHARACTER MAI CHATTAWA +0E4C ; [.0000.00D7.0002] # THAI CHARACTER THANTHAKHAT +0E4D ; [.0000.00D8.0002] # THAI CHARACTER NIKHAHIT +0EC8 ; [.0000.00D9.0002] # LAO TONE MAI EK +0EC9 ; [.0000.00DA.0002] # LAO TONE MAI THO +0ECA ; [.0000.00DB.0002] # LAO TONE MAI TI +0ECB ; [.0000.00DC.0002] # LAO TONE MAI CATAWA +0ECC ; [.0000.00DD.0002] # LAO CANCELLATION MARK +0ECD ; [.0000.00DE.0002] # LAO NIGGAHITA +AABF ; [.0000.00DF.0002] # TAI VIET TONE MAI EK +AAC1 ; [.0000.00E0.0002] # TAI VIET TONE MAI THO +0F39 ; [.0000.00E1.0002] # TIBETAN MARK TSA -PHRU +A92B ; [.0000.00E2.0002] # KAYAH LI TONE PLOPHU +A92C ; [.0000.00E3.0002] # KAYAH LI TONE CALYA +A92D ; [.0000.00E4.0002] # KAYAH LI TONE CALYA PLOPHU +1037 ; [.0000.00E5.0002] # MYANMAR SIGN DOT BELOW +17C8 ; [.0000.00E6.0002] # KHMER SIGN YUUKALEAPINTU +17C9 ; [.0000.00E7.0002] # KHMER SIGN MUUSIKATOAN +17CA ; [.0000.00E8.0002] # KHMER SIGN TRIISAP +1A75 ; [.0000.00E9.0002] # TAI THAM SIGN TONE-1 +1A76 ; [.0000.00EA.0002] # TAI THAM SIGN TONE-2 +1A77 ; [.0000.00EB.0002] # TAI THAM SIGN KHUEN TONE-3 +1A78 ; [.0000.00EC.0002] # TAI THAM SIGN KHUEN TONE-4 +1A79 ; [.0000.00ED.0002] # TAI THAM SIGN KHUEN TONE-5 +1A7A ; [.0000.00EE.0002] # TAI THAM SIGN RA HAAM +1A7B ; [.0000.00EF.0002] # TAI THAM SIGN MAI SAM +1A7C ; [.0000.00F0.0002] # TAI THAM SIGN KHUEN-LUE KARAN +1939 ; [.0000.00F1.0002] # LIMBU SIGN MUKPHRENG +193A ; [.0000.00F2.0002] # LIMBU SIGN KEMPHRENG +193B ; [.0000.00F3.0002] # LIMBU SIGN SA-I +16B30 ; [.0000.00F4.0002] # PAHAWH HMONG MARK CIM TUB +16B31 ; [.0000.00F5.0002] # PAHAWH HMONG MARK CIM SO +16B32 ; [.0000.00F6.0002] # PAHAWH HMONG MARK CIM KES +16B33 ; [.0000.00F7.0002] # PAHAWH HMONG MARK CIM KHAV +16B34 ; [.0000.00F8.0002] # PAHAWH HMONG MARK CIM SUAM +16B35 ; [.0000.00F9.0002] # PAHAWH HMONG MARK CIM HOM +16B36 ; [.0000.00FA.0002] # PAHAWH HMONG MARK CIM TAUM +302A ; [.0000.00FB.0002] # IDEOGRAPHIC LEVEL TONE MARK +302B ; [.0000.00FC.0002] # IDEOGRAPHIC RISING TONE MARK +302C ; [.0000.00FD.0002] # IDEOGRAPHIC DEPARTING TONE MARK +302D ; [.0000.00FE.0002] # IDEOGRAPHIC ENTERING TONE MARK +302E ; [.0000.00FF.0002] # HANGUL SINGLE DOT TONE MARK +302F ; [.0000.0100.0002] # HANGUL DOUBLE DOT TONE MARK +20D0 ; [.0000.0101.0002] # COMBINING LEFT HARPOON ABOVE +20D1 ; [.0000.0102.0002] # COMBINING RIGHT HARPOON ABOVE +20D2 ; [.0000.0103.0002] # COMBINING LONG VERTICAL LINE OVERLAY +20D3 ; [.0000.0103.0002] # COMBINING SHORT VERTICAL LINE OVERLAY +20D4 ; [.0000.0104.0002] # COMBINING ANTICLOCKWISE ARROW ABOVE +20D5 ; [.0000.0105.0002] # COMBINING CLOCKWISE ARROW ABOVE +20D6 ; [.0000.0106.0002] # COMBINING LEFT ARROW ABOVE +20D7 ; [.0000.0107.0002] # COMBINING RIGHT ARROW ABOVE +20DB ; [.0000.0108.0002] # COMBINING THREE DOTS ABOVE +20DC ; [.0000.0109.0002] # COMBINING FOUR DOTS ABOVE +20E1 ; [.0000.010A.0002] # COMBINING LEFT RIGHT ARROW ABOVE +20E6 ; [.0000.010B.0002] # COMBINING DOUBLE VERTICAL STROKE OVERLAY +20E7 ; [.0000.010C.0002] # COMBINING ANNUITY SYMBOL +20E8 ; [.0000.010D.0002] # COMBINING TRIPLE UNDERDOT +20E9 ; [.0000.010E.0002] # COMBINING WIDE BRIDGE ABOVE +101FD ; [.0000.010F.0002] # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +02D0 ; [.1BF8.0020.0002] # MODIFIER LETTER TRIANGULAR COLON +02D1 ; [.1BF9.0020.0002] # MODIFIER LETTER HALF TRIANGULAR COLON +0971 ; [.1BFA.0020.0002] # DEVANAGARI SIGN HIGH SPACING DOT +0E46 ; [.1BFB.0020.0002] # THAI CHARACTER MAIYAMOK +0EC6 ; [.1BFC.0020.0002] # LAO KO LA +17D7 ; [.1BFD.0020.0002] # KHMER SIGN LEK TOO +1AA7 ; [.1BFE.0020.0002] # TAI THAM SIGN MAI YAMOK +A9CF ; [.1BFF.0020.0002] # JAVANESE PANGRANGKEP +A9E6 ; [.1C00.0020.0002] # MYANMAR MODIFIER LETTER SHAN REDUPLICATION +AA70 ; [.1C01.0020.0002] # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AADD ; [.1C02.0020.0002] # TAI VIET SYMBOL SAM +AAF3 ; [.1C03.0020.0002] # MEETEI MAYEK SYLLABLE REPETITION MARK +AAF4 ; [.1C04.0020.0002] # MEETEI MAYEK WORD REPETITION MARK +16B42 ; [.1C05.0020.0002] # PAHAWH HMONG SIGN VOS NRUA +16B43 ; [.1C06.0020.0002] # PAHAWH HMONG SIGN IB YAM +3005 ; [.1C07.0020.0002] # IDEOGRAPHIC ITERATION MARK +303B ; [.1C08.0020.0002] # VERTICAL IDEOGRAPHIC ITERATION MARK +16FE0 ; [.1C09.0020.0002] # TANGUT ITERATION MARK +3031 ; [.1C0A.0020.0002] # VERTICAL KANA REPEAT MARK +3032 ; [.1C0A.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK +3033 ; [.1C0B.0020.0002] # VERTICAL KANA REPEAT MARK UPPER HALF +3034 ; [.1C0B.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +3035 ; [.1C0C.0020.0002] # VERTICAL KANA REPEAT MARK LOWER HALF +309D ; [.1C0D.0020.0002] # HIRAGANA ITERATION MARK +309E ; [.1C0D.0020.0002][.0000.0037.0002] # HIRAGANA VOICED ITERATION MARK +30FC ; [.1C0E.0020.0002] # KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF70 ; [.1C0E.0020.0012] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +30FD ; [.1C0F.0020.0002] # KATAKANA ITERATION MARK +30FE ; [.1C0F.0020.0002][.0000.0037.0002] # KATAKANA VOICED ITERATION MARK +00A4 ; [.1C10.0020.0002] # CURRENCY SIGN +00A2 ; [.1C11.0020.0002] # CENT SIGN +FFE0 ; [.1C11.0020.0003] # FULLWIDTH CENT SIGN +0024 ; [.1C12.0020.0002] # DOLLAR SIGN +FF04 ; [.1C12.0020.0003] # FULLWIDTH DOLLAR SIGN +FE69 ; [.1C12.0020.000F] # SMALL DOLLAR SIGN +00A3 ; [.1C13.0020.0002] # POUND SIGN +FFE1 ; [.1C13.0020.0003] # FULLWIDTH POUND SIGN +00A5 ; [.1C14.0020.0002] # YEN SIGN +FFE5 ; [.1C14.0020.0003] # FULLWIDTH YEN SIGN +058F ; [.1C15.0020.0002] # ARMENIAN DRAM SIGN +060B ; [.1C16.0020.0002] # AFGHANI SIGN +09F2 ; [.1C17.0020.0002] # BENGALI RUPEE MARK +09F3 ; [.1C18.0020.0002] # BENGALI RUPEE SIGN +09FB ; [.1C19.0020.0002] # BENGALI GANDA MARK +0AF1 ; [.1C1A.0020.0002] # GUJARATI RUPEE SIGN +A838 ; [.1C1B.0020.0002] # NORTH INDIC RUPEE MARK +0BF9 ; [.1C1C.0020.0002] # TAMIL RUPEE SIGN +0E3F ; [.1C1D.0020.0002] # THAI CURRENCY SYMBOL BAHT +17DB ; [.1C1E.0020.0002] # KHMER CURRENCY SYMBOL RIEL +20A0 ; [.1C1F.0020.0002] # EURO-CURRENCY SIGN +20A1 ; [.1C20.0020.0002] # COLON SIGN +20A2 ; [.1C21.0020.0002] # CRUZEIRO SIGN +20A3 ; [.1C22.0020.0002] # FRENCH FRANC SIGN +20A4 ; [.1C23.0020.0002] # LIRA SIGN +20A5 ; [.1C24.0020.0002] # MILL SIGN +20A6 ; [.1C25.0020.0002] # NAIRA SIGN +20A7 ; [.1C26.0020.0002] # PESETA SIGN +20A9 ; [.1C27.0020.0002] # WON SIGN +FFE6 ; [.1C27.0020.0003] # FULLWIDTH WON SIGN +20AA ; [.1C28.0020.0002] # NEW SHEQEL SIGN +20AB ; [.1C29.0020.0002] # DONG SIGN +20AC ; [.1C2A.0020.0002] # EURO SIGN +20AD ; [.1C2B.0020.0002] # KIP SIGN +20AE ; [.1C2C.0020.0002] # TUGRIK SIGN +20AF ; [.1C2D.0020.0002] # DRACHMA SIGN +20B0 ; [.1C2E.0020.0002] # GERMAN PENNY SIGN +20B1 ; [.1C2F.0020.0002] # PESO SIGN +20B2 ; [.1C30.0020.0002] # GUARANI SIGN +20B3 ; [.1C31.0020.0002] # AUSTRAL SIGN +20B4 ; [.1C32.0020.0002] # HRYVNIA SIGN +20B5 ; [.1C33.0020.0002] # CEDI SIGN +20B6 ; [.1C34.0020.0002] # LIVRE TOURNOIS SIGN +20B7 ; [.1C35.0020.0002] # SPESMILO SIGN +20B8 ; [.1C36.0020.0002] # TENGE SIGN +20B9 ; [.1C37.0020.0002] # INDIAN RUPEE SIGN +20BA ; [.1C38.0020.0002] # TURKISH LIRA SIGN +20BB ; [.1C39.0020.0002] # NORDIC MARK SIGN +20BC ; [.1C3A.0020.0002] # MANAT SIGN +20BD ; [.1C3B.0020.0002] # RUBLE SIGN +20BE ; [.1C3C.0020.0002] # LARI SIGN +0030 ; [.1C3D.0020.0002] # DIGIT ZERO +0660 ; [.1C3D.0020.0002] # ARABIC-INDIC DIGIT ZERO +06F0 ; [.1C3D.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ZERO +07C0 ; [.1C3D.0020.0002] # NKO DIGIT ZERO +0966 ; [.1C3D.0020.0002] # DEVANAGARI DIGIT ZERO +09E6 ; [.1C3D.0020.0002] # BENGALI DIGIT ZERO +0A66 ; [.1C3D.0020.0002] # GURMUKHI DIGIT ZERO +0AE6 ; [.1C3D.0020.0002] # GUJARATI DIGIT ZERO +0B66 ; [.1C3D.0020.0002] # ORIYA DIGIT ZERO +0BE6 ; [.1C3D.0020.0002] # TAMIL DIGIT ZERO +0C66 ; [.1C3D.0020.0002] # TELUGU DIGIT ZERO +0C78 ; [.1C3D.0020.0002] # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR +0CE6 ; [.1C3D.0020.0002] # KANNADA DIGIT ZERO +0D66 ; [.1C3D.0020.0002] # MALAYALAM DIGIT ZERO +0DE6 ; [.1C3D.0020.0002] # SINHALA LITH DIGIT ZERO +0E50 ; [.1C3D.0020.0002] # THAI DIGIT ZERO +0ED0 ; [.1C3D.0020.0002] # LAO DIGIT ZERO +0F20 ; [.1C3D.0020.0002] # TIBETAN DIGIT ZERO +1040 ; [.1C3D.0020.0002] # MYANMAR DIGIT ZERO +1090 ; [.1C3D.0020.0002] # MYANMAR SHAN DIGIT ZERO +17E0 ; [.1C3D.0020.0002] # KHMER DIGIT ZERO +17F0 ; [.1C3D.0020.0002] # KHMER SYMBOL LEK ATTAK SON +1810 ; [.1C3D.0020.0002] # MONGOLIAN DIGIT ZERO +1946 ; [.1C3D.0020.0002] # LIMBU DIGIT ZERO +19D0 ; [.1C3D.0020.0002] # NEW TAI LUE DIGIT ZERO +1A80 ; [.1C3D.0020.0002] # TAI THAM HORA DIGIT ZERO +1A90 ; [.1C3D.0020.0002] # TAI THAM THAM DIGIT ZERO +1B50 ; [.1C3D.0020.0002] # BALINESE DIGIT ZERO +1BB0 ; [.1C3D.0020.0002] # SUNDANESE DIGIT ZERO +1C40 ; [.1C3D.0020.0002] # LEPCHA DIGIT ZERO +1C50 ; [.1C3D.0020.0002] # OL CHIKI DIGIT ZERO +3007 ; [.1C3D.0020.0002] # IDEOGRAPHIC NUMBER ZERO +A620 ; [.1C3D.0020.0002] # VAI DIGIT ZERO +A8D0 ; [.1C3D.0020.0002] # SAURASHTRA DIGIT ZERO +A900 ; [.1C3D.0020.0002] # KAYAH LI DIGIT ZERO +A9D0 ; [.1C3D.0020.0002] # JAVANESE DIGIT ZERO +A9F0 ; [.1C3D.0020.0002] # MYANMAR TAI LAING DIGIT ZERO +AA50 ; [.1C3D.0020.0002] # CHAM DIGIT ZERO +ABF0 ; [.1C3D.0020.0002] # MEETEI MAYEK DIGIT ZERO +1018A ; [.1C3D.0020.0002] # GREEK ZERO SIGN +104A0 ; [.1C3D.0020.0002] # OSMANYA DIGIT ZERO +11066 ; [.1C3D.0020.0002] # BRAHMI DIGIT ZERO +110F0 ; [.1C3D.0020.0002] # SORA SOMPENG DIGIT ZERO +11136 ; [.1C3D.0020.0002] # CHAKMA DIGIT ZERO +111D0 ; [.1C3D.0020.0002] # SHARADA DIGIT ZERO +112F0 ; [.1C3D.0020.0002] # KHUDAWADI DIGIT ZERO +11450 ; [.1C3D.0020.0002] # NEWA DIGIT ZERO +114D0 ; [.1C3D.0020.0002] # TIRHUTA DIGIT ZERO +11650 ; [.1C3D.0020.0002] # MODI DIGIT ZERO +116C0 ; [.1C3D.0020.0002] # TAKRI DIGIT ZERO +11730 ; [.1C3D.0020.0002] # AHOM DIGIT ZERO +118E0 ; [.1C3D.0020.0002] # WARANG CITI DIGIT ZERO +11C50 ; [.1C3D.0020.0002] # BHAIKSUKI DIGIT ZERO +16A60 ; [.1C3D.0020.0002] # MRO DIGIT ZERO +16B50 ; [.1C3D.0020.0002] # PAHAWH HMONG DIGIT ZERO +1E950 ; [.1C3D.0020.0002] # ADLAM DIGIT ZERO +FF10 ; [.1C3D.0020.0003] # FULLWIDTH DIGIT ZERO +0F33 ; [.1C3D.0020.0004] # TIBETAN DIGIT HALF ZERO +1F100 ; [.1C3D.0020.0004][*0277.0020.0004] # DIGIT ZERO FULL STOP +1F101 ; [.1C3D.0020.0004][*0222.0020.0004] # DIGIT ZERO COMMA +1D7CE ; [.1C3D.0020.0005] # MATHEMATICAL BOLD DIGIT ZERO +1D7D8 ; [.1C3D.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7E2 ; [.1C3D.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7EC ; [.1C3D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7F6 ; [.1C3D.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ZERO +24EA ; [.1C3D.0020.0006] # CIRCLED DIGIT ZERO +24FF ; [.1C3D.0020.0006] # NEGATIVE CIRCLED DIGIT ZERO +1F10B ; [.1C3D.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ZERO +1F10C ; [.1C3D.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +2070 ; [.1C3D.0020.0014] # SUPERSCRIPT ZERO +2080 ; [.1C3D.0020.0015] # SUBSCRIPT ZERO +2189 ; [.1C3D.0020.001E][*0626.0020.001E][.1C40.0020.001E] # VULGAR FRACTION ZERO THIRDS +3358 ; [.1C3D.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +0031 ; [.1C3E.0020.0002] # DIGIT ONE +0661 ; [.1C3E.0020.0002] # ARABIC-INDIC DIGIT ONE +06F1 ; [.1C3E.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ONE +07C1 ; [.1C3E.0020.0002] # NKO DIGIT ONE +0967 ; [.1C3E.0020.0002] # DEVANAGARI DIGIT ONE +09E7 ; [.1C3E.0020.0002] # BENGALI DIGIT ONE +0A67 ; [.1C3E.0020.0002] # GURMUKHI DIGIT ONE +0AE7 ; [.1C3E.0020.0002] # GUJARATI DIGIT ONE +0B67 ; [.1C3E.0020.0002] # ORIYA DIGIT ONE +0BE7 ; [.1C3E.0020.0002] # TAMIL DIGIT ONE +0C67 ; [.1C3E.0020.0002] # TELUGU DIGIT ONE +0C79 ; [.1C3E.0020.0002] # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR +0C7C ; [.1C3E.0020.0002] # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR +0CE7 ; [.1C3E.0020.0002] # KANNADA DIGIT ONE +0D67 ; [.1C3E.0020.0002] # MALAYALAM DIGIT ONE +0DE7 ; [.1C3E.0020.0002] # SINHALA LITH DIGIT ONE +0E51 ; [.1C3E.0020.0002] # THAI DIGIT ONE +0ED1 ; [.1C3E.0020.0002] # LAO DIGIT ONE +0F21 ; [.1C3E.0020.0002] # TIBETAN DIGIT ONE +1041 ; [.1C3E.0020.0002] # MYANMAR DIGIT ONE +1091 ; [.1C3E.0020.0002] # MYANMAR SHAN DIGIT ONE +1369 ; [.1C3E.0020.0002] # ETHIOPIC DIGIT ONE +17E1 ; [.1C3E.0020.0002] # KHMER DIGIT ONE +17F1 ; [.1C3E.0020.0002] # KHMER SYMBOL LEK ATTAK MUOY +1811 ; [.1C3E.0020.0002] # MONGOLIAN DIGIT ONE +1947 ; [.1C3E.0020.0002] # LIMBU DIGIT ONE +19D1 ; [.1C3E.0020.0002] # NEW TAI LUE DIGIT ONE +19DA ; [.1C3E.0020.0002] # NEW TAI LUE THAM DIGIT ONE +1A81 ; [.1C3E.0020.0002] # TAI THAM HORA DIGIT ONE +1A91 ; [.1C3E.0020.0002] # TAI THAM THAM DIGIT ONE +1B51 ; [.1C3E.0020.0002] # BALINESE DIGIT ONE +1BB1 ; [.1C3E.0020.0002] # SUNDANESE DIGIT ONE +1C41 ; [.1C3E.0020.0002] # LEPCHA DIGIT ONE +1C51 ; [.1C3E.0020.0002] # OL CHIKI DIGIT ONE +3021 ; [.1C3E.0020.0002] # HANGZHOU NUMERAL ONE +A621 ; [.1C3E.0020.0002] # VAI DIGIT ONE +A8D1 ; [.1C3E.0020.0002] # SAURASHTRA DIGIT ONE +A901 ; [.1C3E.0020.0002] # KAYAH LI DIGIT ONE +A9D1 ; [.1C3E.0020.0002] # JAVANESE DIGIT ONE +A9F1 ; [.1C3E.0020.0002] # MYANMAR TAI LAING DIGIT ONE +AA51 ; [.1C3E.0020.0002] # CHAM DIGIT ONE +ABF1 ; [.1C3E.0020.0002] # MEETEI MAYEK DIGIT ONE +10107 ; [.1C3E.0020.0002] # AEGEAN NUMBER ONE +10142 ; [.1C3E.0020.0002] # GREEK ACROPHONIC ATTIC ONE DRACHMA +10158 ; [.1C3E.0020.0002] # GREEK ACROPHONIC HERAEUM ONE PLETHRON +10159 ; [.1C3E.0020.0002] # GREEK ACROPHONIC THESPIAN ONE +1015A ; [.1C3E.0020.0002] # GREEK ACROPHONIC HERMIONIAN ONE +102E1 ; [.1C3E.0020.0002] # COPTIC EPACT DIGIT ONE +10320 ; [.1C3E.0020.0002] # OLD ITALIC NUMERAL ONE +103D1 ; [.1C3E.0020.0002] # OLD PERSIAN NUMBER ONE +104A1 ; [.1C3E.0020.0002] # OSMANYA DIGIT ONE +10858 ; [.1C3E.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE +10879 ; [.1C3E.0020.0002] # PALMYRENE NUMBER ONE +108A7 ; [.1C3E.0020.0002] # NABATAEAN NUMBER ONE +108FB ; [.1C3E.0020.0002] # HATRAN NUMBER ONE +10916 ; [.1C3E.0020.0002] # PHOENICIAN NUMBER ONE +109C0 ; [.1C3E.0020.0002] # MEROITIC CURSIVE NUMBER ONE +10A40 ; [.1C3E.0020.0002] # KHAROSHTHI DIGIT ONE +10A7D ; [.1C3E.0020.0002] # OLD SOUTH ARABIAN NUMBER ONE +10A9D ; [.1C3E.0020.0002] # OLD NORTH ARABIAN NUMBER ONE +10AEB ; [.1C3E.0020.0002] # MANICHAEAN NUMBER ONE +10B58 ; [.1C3E.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE +10B78 ; [.1C3E.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE +10BA9 ; [.1C3E.0020.0002] # PSALTER PAHLAVI NUMBER ONE +10CFA ; [.1C3E.0020.0002] # OLD HUNGARIAN NUMBER ONE +10E60 ; [.1C3E.0020.0002] # RUMI DIGIT ONE +11052 ; [.1C3E.0020.0002] # BRAHMI NUMBER ONE +11067 ; [.1C3E.0020.0002] # BRAHMI DIGIT ONE +110F1 ; [.1C3E.0020.0002] # SORA SOMPENG DIGIT ONE +11137 ; [.1C3E.0020.0002] # CHAKMA DIGIT ONE +111D1 ; [.1C3E.0020.0002] # SHARADA DIGIT ONE +111E1 ; [.1C3E.0020.0002] # SINHALA ARCHAIC DIGIT ONE +112F1 ; [.1C3E.0020.0002] # KHUDAWADI DIGIT ONE +11451 ; [.1C3E.0020.0002] # NEWA DIGIT ONE +114D1 ; [.1C3E.0020.0002] # TIRHUTA DIGIT ONE +11651 ; [.1C3E.0020.0002] # MODI DIGIT ONE +116C1 ; [.1C3E.0020.0002] # TAKRI DIGIT ONE +11731 ; [.1C3E.0020.0002] # AHOM DIGIT ONE +118E1 ; [.1C3E.0020.0002] # WARANG CITI DIGIT ONE +11C51 ; [.1C3E.0020.0002] # BHAIKSUKI DIGIT ONE +11C5A ; [.1C3E.0020.0002] # BHAIKSUKI NUMBER ONE +12415 ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESH2 +1241E ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESHU +1242C ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE SHARU +12434 ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BURU +1244F ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BAN2 +12458 ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE ESHE3 +16A61 ; [.1C3E.0020.0002] # MRO DIGIT ONE +16B51 ; [.1C3E.0020.0002] # PAHAWH HMONG DIGIT ONE +1D360 ; [.1C3E.0020.0002] # COUNTING ROD UNIT DIGIT ONE +1E8C7 ; [.1C3E.0020.0002] # MENDE KIKAKUI DIGIT ONE +1E951 ; [.1C3E.0020.0002] # ADLAM DIGIT ONE +FF11 ; [.1C3E.0020.0003] # FULLWIDTH DIGIT ONE +0F2A ; [.1C3E.0020.0004] # TIBETAN DIGIT HALF ONE +2474 ; [*0317.0020.0004][.1C3E.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT ONE +2488 ; [.1C3E.0020.0004][*0277.0020.0004] # DIGIT ONE FULL STOP +1F102 ; [.1C3E.0020.0004][*0222.0020.0004] # DIGIT ONE COMMA +1D7CF ; [.1C3E.0020.0005] # MATHEMATICAL BOLD DIGIT ONE +1D7D9 ; [.1C3E.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7E3 ; [.1C3E.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ONE +1D7ED ; [.1C3E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7F7 ; [.1C3E.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ONE +2460 ; [.1C3E.0020.0006] # CIRCLED DIGIT ONE +24F5 ; [.1C3E.0020.0006] # DOUBLE CIRCLED DIGIT ONE +2776 ; [.1C3E.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT ONE +2780 ; [.1C3E.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE +278A ; [.1C3E.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +00B9 ; [.1C3E.0020.0014] # SUPERSCRIPT ONE +2081 ; [.1C3E.0020.0015] # SUBSCRIPT ONE +215F ; [.1C3E.0020.001E][*0626.0020.001E] # FRACTION NUMERATOR ONE +247D ; [*0317.0020.0004][.1C3E.0020.0004][.1C3D.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER TEN +2491 ; [.1C3E.0020.0004][.1C3D.0020.0004][*0277.0020.0004] # NUMBER TEN FULL STOP +2469 ; [.1C3E.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER TEN +24FE ; [.1C3E.0020.0006][.1C3D.0020.0006] # DOUBLE CIRCLED NUMBER TEN +277F ; [.1C3E.0020.0006][.1C3D.0020.0006] # DINGBAT NEGATIVE CIRCLED NUMBER TEN +2789 ; [.1C3E.0020.0006][.1C3D.0020.0006] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN +2793 ; [.1C3E.0020.0006][.1C3D.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +3248 ; [.1C3E.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER TEN ON BLACK SQUARE +33E9 ; [.1C3E.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +32C9 ; [.1C3E.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +3362 ; [.1C3E.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +247E ; [*0317.0020.0004][.1C3E.0020.0004][.1C3E.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER ELEVEN +2492 ; [.1C3E.0020.0004][.1C3E.0020.0004][*0277.0020.0004] # NUMBER ELEVEN FULL STOP +246A ; [.1C3E.0020.0006][.1C3E.0020.0006] # CIRCLED NUMBER ELEVEN +24EB ; [.1C3E.0020.0006][.1C3E.0020.0006] # NEGATIVE CIRCLED NUMBER ELEVEN +2152 ; [.1C3E.0020.001E][*0626.0020.001E][.1C3E.0020.001E][.1C3D.0020.001E] # VULGAR FRACTION ONE TENTH +33EA ; [.1C3E.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +32CA ; [.1C3E.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +3363 ; [.1C3E.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +247F ; [*0317.0020.0004][.1C3E.0020.0004][.1C3F.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER TWELVE +2493 ; [.1C3E.0020.0004][.1C3F.0020.0004][*0277.0020.0004] # NUMBER TWELVE FULL STOP +246B ; [.1C3E.0020.0006][.1C3F.0020.0006] # CIRCLED NUMBER TWELVE +24EC ; [.1C3E.0020.0006][.1C3F.0020.0006] # NEGATIVE CIRCLED NUMBER TWELVE +00BD ; [.1C3E.0020.001E][*0626.0020.001E][.1C3F.0020.001E] # VULGAR FRACTION ONE HALF +1F1A4 ; [.1C3E.0020.001C][.1C3F.0020.001C][.1C3D.0020.001C][.1E0C.0020.001D] # SQUARED ONE HUNDRED TWENTY P +33EB ; [.1C3E.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +32CB ; [.1C3E.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +3364 ; [.1C3E.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +2480 ; [*0317.0020.0004][.1C3E.0020.0004][.1C40.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER THIRTEEN +2494 ; [.1C3E.0020.0004][.1C40.0020.0004][*0277.0020.0004] # NUMBER THIRTEEN FULL STOP +246C ; [.1C3E.0020.0006][.1C40.0020.0006] # CIRCLED NUMBER THIRTEEN +24ED ; [.1C3E.0020.0006][.1C40.0020.0006] # NEGATIVE CIRCLED NUMBER THIRTEEN +2153 ; [.1C3E.0020.001E][*0626.0020.001E][.1C40.0020.001E] # VULGAR FRACTION ONE THIRD +33EC ; [.1C3E.0020.0004][.1C40.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +3365 ; [.1C3E.0020.0004][.1C40.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +2481 ; [*0317.0020.0004][.1C3E.0020.0004][.1C41.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER FOURTEEN +2495 ; [.1C3E.0020.0004][.1C41.0020.0004][*0277.0020.0004] # NUMBER FOURTEEN FULL STOP +246D ; [.1C3E.0020.0006][.1C41.0020.0006] # CIRCLED NUMBER FOURTEEN +24EE ; [.1C3E.0020.0006][.1C41.0020.0006] # NEGATIVE CIRCLED NUMBER FOURTEEN +00BC ; [.1C3E.0020.001E][*0626.0020.001E][.1C41.0020.001E] # VULGAR FRACTION ONE QUARTER +33ED ; [.1C3E.0020.0004][.1C41.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +3366 ; [.1C3E.0020.0004][.1C41.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +2482 ; [*0317.0020.0004][.1C3E.0020.0004][.1C42.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER FIFTEEN +2496 ; [.1C3E.0020.0004][.1C42.0020.0004][*0277.0020.0004] # NUMBER FIFTEEN FULL STOP +246E ; [.1C3E.0020.0006][.1C42.0020.0006] # CIRCLED NUMBER FIFTEEN +24EF ; [.1C3E.0020.0006][.1C42.0020.0006] # NEGATIVE CIRCLED NUMBER FIFTEEN +2155 ; [.1C3E.0020.001E][*0626.0020.001E][.1C42.0020.001E] # VULGAR FRACTION ONE FIFTH +33EE ; [.1C3E.0020.0004][.1C42.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +3367 ; [.1C3E.0020.0004][.1C42.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +2483 ; [*0317.0020.0004][.1C3E.0020.0004][.1C43.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER SIXTEEN +2497 ; [.1C3E.0020.0004][.1C43.0020.0004][*0277.0020.0004] # NUMBER SIXTEEN FULL STOP +246F ; [.1C3E.0020.0006][.1C43.0020.0006] # CIRCLED NUMBER SIXTEEN +24F0 ; [.1C3E.0020.0006][.1C43.0020.0006] # NEGATIVE CIRCLED NUMBER SIXTEEN +2159 ; [.1C3E.0020.001E][*0626.0020.001E][.1C43.0020.001E] # VULGAR FRACTION ONE SIXTH +33EF ; [.1C3E.0020.0004][.1C43.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +3368 ; [.1C3E.0020.0004][.1C43.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +2484 ; [*0317.0020.0004][.1C3E.0020.0004][.1C44.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER SEVENTEEN +2498 ; [.1C3E.0020.0004][.1C44.0020.0004][*0277.0020.0004] # NUMBER SEVENTEEN FULL STOP +2470 ; [.1C3E.0020.0006][.1C44.0020.0006] # CIRCLED NUMBER SEVENTEEN +24F1 ; [.1C3E.0020.0006][.1C44.0020.0006] # NEGATIVE CIRCLED NUMBER SEVENTEEN +2150 ; [.1C3E.0020.001E][*0626.0020.001E][.1C44.0020.001E] # VULGAR FRACTION ONE SEVENTH +33F0 ; [.1C3E.0020.0004][.1C44.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +3369 ; [.1C3E.0020.0004][.1C44.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +2485 ; [*0317.0020.0004][.1C3E.0020.0004][.1C45.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER EIGHTEEN +2499 ; [.1C3E.0020.0004][.1C45.0020.0004][*0277.0020.0004] # NUMBER EIGHTEEN FULL STOP +2471 ; [.1C3E.0020.0006][.1C45.0020.0006] # CIRCLED NUMBER EIGHTEEN +24F2 ; [.1C3E.0020.0006][.1C45.0020.0006] # NEGATIVE CIRCLED NUMBER EIGHTEEN +215B ; [.1C3E.0020.001E][*0626.0020.001E][.1C45.0020.001E] # VULGAR FRACTION ONE EIGHTH +33F1 ; [.1C3E.0020.0004][.1C45.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +336A ; [.1C3E.0020.0004][.1C45.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +2486 ; [*0317.0020.0004][.1C3E.0020.0004][.1C46.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER NINETEEN +249A ; [.1C3E.0020.0004][.1C46.0020.0004][*0277.0020.0004] # NUMBER NINETEEN FULL STOP +2472 ; [.1C3E.0020.0006][.1C46.0020.0006] # CIRCLED NUMBER NINETEEN +24F3 ; [.1C3E.0020.0006][.1C46.0020.0006] # NEGATIVE CIRCLED NUMBER NINETEEN +2151 ; [.1C3E.0020.001E][*0626.0020.001E][.1C46.0020.001E] # VULGAR FRACTION ONE NINTH +33F2 ; [.1C3E.0020.0004][.1C46.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +336B ; [.1C3E.0020.0004][.1C46.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +33E0 ; [.1C3E.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +32C0 ; [.1C3E.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +3359 ; [.1C3E.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +0032 ; [.1C3F.0020.0002] # DIGIT TWO +0662 ; [.1C3F.0020.0002] # ARABIC-INDIC DIGIT TWO +06F2 ; [.1C3F.0020.0002] # EXTENDED ARABIC-INDIC DIGIT TWO +07C2 ; [.1C3F.0020.0002] # NKO DIGIT TWO +0968 ; [.1C3F.0020.0002] # DEVANAGARI DIGIT TWO +09E8 ; [.1C3F.0020.0002] # BENGALI DIGIT TWO +0A68 ; [.1C3F.0020.0002] # GURMUKHI DIGIT TWO +0AE8 ; [.1C3F.0020.0002] # GUJARATI DIGIT TWO +0B68 ; [.1C3F.0020.0002] # ORIYA DIGIT TWO +0BE8 ; [.1C3F.0020.0002] # TAMIL DIGIT TWO +0C68 ; [.1C3F.0020.0002] # TELUGU DIGIT TWO +0C7A ; [.1C3F.0020.0002] # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR +0C7D ; [.1C3F.0020.0002] # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR +0CE8 ; [.1C3F.0020.0002] # KANNADA DIGIT TWO +0D68 ; [.1C3F.0020.0002] # MALAYALAM DIGIT TWO +0DE8 ; [.1C3F.0020.0002] # SINHALA LITH DIGIT TWO +0E52 ; [.1C3F.0020.0002] # THAI DIGIT TWO +0ED2 ; [.1C3F.0020.0002] # LAO DIGIT TWO +0F22 ; [.1C3F.0020.0002] # TIBETAN DIGIT TWO +1042 ; [.1C3F.0020.0002] # MYANMAR DIGIT TWO +1092 ; [.1C3F.0020.0002] # MYANMAR SHAN DIGIT TWO +136A ; [.1C3F.0020.0002] # ETHIOPIC DIGIT TWO +17E2 ; [.1C3F.0020.0002] # KHMER DIGIT TWO +17F2 ; [.1C3F.0020.0002] # KHMER SYMBOL LEK ATTAK PII +1812 ; [.1C3F.0020.0002] # MONGOLIAN DIGIT TWO +1948 ; [.1C3F.0020.0002] # LIMBU DIGIT TWO +19D2 ; [.1C3F.0020.0002] # NEW TAI LUE DIGIT TWO +1A82 ; [.1C3F.0020.0002] # TAI THAM HORA DIGIT TWO +1A92 ; [.1C3F.0020.0002] # TAI THAM THAM DIGIT TWO +1B52 ; [.1C3F.0020.0002] # BALINESE DIGIT TWO +1BB2 ; [.1C3F.0020.0002] # SUNDANESE DIGIT TWO +1C42 ; [.1C3F.0020.0002] # LEPCHA DIGIT TWO +1C52 ; [.1C3F.0020.0002] # OL CHIKI DIGIT TWO +3022 ; [.1C3F.0020.0002] # HANGZHOU NUMERAL TWO +A622 ; [.1C3F.0020.0002] # VAI DIGIT TWO +A8D2 ; [.1C3F.0020.0002] # SAURASHTRA DIGIT TWO +A902 ; [.1C3F.0020.0002] # KAYAH LI DIGIT TWO +A9D2 ; [.1C3F.0020.0002] # JAVANESE DIGIT TWO +A9F2 ; [.1C3F.0020.0002] # MYANMAR TAI LAING DIGIT TWO +AA52 ; [.1C3F.0020.0002] # CHAM DIGIT TWO +ABF2 ; [.1C3F.0020.0002] # MEETEI MAYEK DIGIT TWO +10108 ; [.1C3F.0020.0002] # AEGEAN NUMBER TWO +1015B ; [.1C3F.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO +1015C ; [.1C3F.0020.0002] # GREEK ACROPHONIC THESPIAN TWO +1015D ; [.1C3F.0020.0002] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS +1015E ; [.1C3F.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS +102E2 ; [.1C3F.0020.0002] # COPTIC EPACT DIGIT TWO +103D2 ; [.1C3F.0020.0002] # OLD PERSIAN NUMBER TWO +104A2 ; [.1C3F.0020.0002] # OSMANYA DIGIT TWO +10859 ; [.1C3F.0020.0002] # IMPERIAL ARAMAIC NUMBER TWO +1087A ; [.1C3F.0020.0002] # PALMYRENE NUMBER TWO +108A8 ; [.1C3F.0020.0002] # NABATAEAN NUMBER TWO +1091A ; [.1C3F.0020.0002] # PHOENICIAN NUMBER TWO +109C1 ; [.1C3F.0020.0002] # MEROITIC CURSIVE NUMBER TWO +10A41 ; [.1C3F.0020.0002] # KHAROSHTHI DIGIT TWO +10B59 ; [.1C3F.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWO +10B79 ; [.1C3F.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWO +10BAA ; [.1C3F.0020.0002] # PSALTER PAHLAVI NUMBER TWO +10E61 ; [.1C3F.0020.0002] # RUMI DIGIT TWO +11053 ; [.1C3F.0020.0002] # BRAHMI NUMBER TWO +11068 ; [.1C3F.0020.0002] # BRAHMI DIGIT TWO +110F2 ; [.1C3F.0020.0002] # SORA SOMPENG DIGIT TWO +11138 ; [.1C3F.0020.0002] # CHAKMA DIGIT TWO +111D2 ; [.1C3F.0020.0002] # SHARADA DIGIT TWO +111E2 ; [.1C3F.0020.0002] # SINHALA ARCHAIC DIGIT TWO +112F2 ; [.1C3F.0020.0002] # KHUDAWADI DIGIT TWO +11452 ; [.1C3F.0020.0002] # NEWA DIGIT TWO +114D2 ; [.1C3F.0020.0002] # TIRHUTA DIGIT TWO +11652 ; [.1C3F.0020.0002] # MODI DIGIT TWO +116C2 ; [.1C3F.0020.0002] # TAKRI DIGIT TWO +11732 ; [.1C3F.0020.0002] # AHOM DIGIT TWO +118E2 ; [.1C3F.0020.0002] # WARANG CITI DIGIT TWO +11C52 ; [.1C3F.0020.0002] # BHAIKSUKI DIGIT TWO +11C5B ; [.1C3F.0020.0002] # BHAIKSUKI NUMBER TWO +12400 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH +12416 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESH2 +1241F ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESHU +12423 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHAR2 +1242D ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHARU +12435 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BURU +1244A ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH TENU +12450 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BAN2 +12456 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAMIN +12459 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ESHE3 +16A62 ; [.1C3F.0020.0002] # MRO DIGIT TWO +16B52 ; [.1C3F.0020.0002] # PAHAWH HMONG DIGIT TWO +1D361 ; [.1C3F.0020.0002] # COUNTING ROD UNIT DIGIT TWO +1E8C8 ; [.1C3F.0020.0002] # MENDE KIKAKUI DIGIT TWO +1E952 ; [.1C3F.0020.0002] # ADLAM DIGIT TWO +FF12 ; [.1C3F.0020.0003] # FULLWIDTH DIGIT TWO +0F2B ; [.1C3F.0020.0004] # TIBETAN DIGIT HALF TWO +2475 ; [*0317.0020.0004][.1C3F.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT TWO +2489 ; [.1C3F.0020.0004][*0277.0020.0004] # DIGIT TWO FULL STOP +1F103 ; [.1C3F.0020.0004][*0222.0020.0004] # DIGIT TWO COMMA +1D7D0 ; [.1C3F.0020.0005] # MATHEMATICAL BOLD DIGIT TWO +1D7DA ; [.1C3F.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7E4 ; [.1C3F.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT TWO +1D7EE ; [.1C3F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7F8 ; [.1C3F.0020.0005] # MATHEMATICAL MONOSPACE DIGIT TWO +2461 ; [.1C3F.0020.0006] # CIRCLED DIGIT TWO +24F6 ; [.1C3F.0020.0006] # DOUBLE CIRCLED DIGIT TWO +2777 ; [.1C3F.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT TWO +2781 ; [.1C3F.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO +278B ; [.1C3F.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +00B2 ; [.1C3F.0020.0014] # SUPERSCRIPT TWO +2082 ; [.1C3F.0020.0015] # SUBSCRIPT TWO +2487 ; [*0317.0020.0004][.1C3F.0020.0004][.1C3D.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER TWENTY +249B ; [.1C3F.0020.0004][.1C3D.0020.0004][*0277.0020.0004] # NUMBER TWENTY FULL STOP +2473 ; [.1C3F.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER TWENTY +24F4 ; [.1C3F.0020.0006][.1C3D.0020.0006] # NEGATIVE CIRCLED NUMBER TWENTY +3249 ; [.1C3F.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER TWENTY ON BLACK SQUARE +33F3 ; [.1C3F.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +336C ; [.1C3F.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +3251 ; [.1C3F.0020.0006][.1C3E.0020.0006] # CIRCLED NUMBER TWENTY ONE +33F4 ; [.1C3F.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +336D ; [.1C3F.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +3252 ; [.1C3F.0020.0006][.1C3F.0020.0006] # CIRCLED NUMBER TWENTY TWO +1F1A2 ; [.1C3F.0020.001C][.1C3F.0020.001C][*0277.0020.001C][.1C3F.0020.001C] # SQUARED TWENTY-TWO POINT TWO +33F5 ; [.1C3F.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +336E ; [.1C3F.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +3253 ; [.1C3F.0020.0006][.1C40.0020.0006] # CIRCLED NUMBER TWENTY THREE +2154 ; [.1C3F.0020.001E][*0626.0020.001E][.1C40.0020.001E] # VULGAR FRACTION TWO THIRDS +33F6 ; [.1C3F.0020.0004][.1C40.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +336F ; [.1C3F.0020.0004][.1C40.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3254 ; [.1C3F.0020.0006][.1C41.0020.0006] # CIRCLED NUMBER TWENTY FOUR +33F7 ; [.1C3F.0020.0004][.1C41.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +3370 ; [.1C3F.0020.0004][.1C41.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3255 ; [.1C3F.0020.0006][.1C42.0020.0006] # CIRCLED NUMBER TWENTY FIVE +2156 ; [.1C3F.0020.001E][*0626.0020.001E][.1C42.0020.001E] # VULGAR FRACTION TWO FIFTHS +33F8 ; [.1C3F.0020.0004][.1C42.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +3256 ; [.1C3F.0020.0006][.1C43.0020.0006] # CIRCLED NUMBER TWENTY SIX +33F9 ; [.1C3F.0020.0004][.1C43.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +3257 ; [.1C3F.0020.0006][.1C44.0020.0006] # CIRCLED NUMBER TWENTY SEVEN +33FA ; [.1C3F.0020.0004][.1C44.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +3258 ; [.1C3F.0020.0006][.1C45.0020.0006] # CIRCLED NUMBER TWENTY EIGHT +33FB ; [.1C3F.0020.0004][.1C45.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +3259 ; [.1C3F.0020.0006][.1C46.0020.0006] # CIRCLED NUMBER TWENTY NINE +33FC ; [.1C3F.0020.0004][.1C46.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +1F19D ; [.1C3F.0020.001C][.1D65.0020.001D] # SQUARED TWO K +1F19C ; [.1C3F.0020.001C][.1DB9.0020.001C][.1C8F.0020.001C][*0209.0020.001C][.1E71.0020.001D][.1C7A.0020.001C][.1E33.0020.001C] # SQUARED SECOND SCREEN +33E1 ; [.1C3F.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +32C1 ; [.1C3F.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +335A ; [.1C3F.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +0033 ; [.1C40.0020.0002] # DIGIT THREE +0663 ; [.1C40.0020.0002] # ARABIC-INDIC DIGIT THREE +06F3 ; [.1C40.0020.0002] # EXTENDED ARABIC-INDIC DIGIT THREE +07C3 ; [.1C40.0020.0002] # NKO DIGIT THREE +0969 ; [.1C40.0020.0002] # DEVANAGARI DIGIT THREE +09E9 ; [.1C40.0020.0002] # BENGALI DIGIT THREE +0A69 ; [.1C40.0020.0002] # GURMUKHI DIGIT THREE +0AE9 ; [.1C40.0020.0002] # GUJARATI DIGIT THREE +0B69 ; [.1C40.0020.0002] # ORIYA DIGIT THREE +0BE9 ; [.1C40.0020.0002] # TAMIL DIGIT THREE +0C69 ; [.1C40.0020.0002] # TELUGU DIGIT THREE +0C7B ; [.1C40.0020.0002] # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR +0C7E ; [.1C40.0020.0002] # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0CE9 ; [.1C40.0020.0002] # KANNADA DIGIT THREE +0D69 ; [.1C40.0020.0002] # MALAYALAM DIGIT THREE +0DE9 ; [.1C40.0020.0002] # SINHALA LITH DIGIT THREE +0E53 ; [.1C40.0020.0002] # THAI DIGIT THREE +0ED3 ; [.1C40.0020.0002] # LAO DIGIT THREE +0F23 ; [.1C40.0020.0002] # TIBETAN DIGIT THREE +1043 ; [.1C40.0020.0002] # MYANMAR DIGIT THREE +1093 ; [.1C40.0020.0002] # MYANMAR SHAN DIGIT THREE +136B ; [.1C40.0020.0002] # ETHIOPIC DIGIT THREE +17E3 ; [.1C40.0020.0002] # KHMER DIGIT THREE +17F3 ; [.1C40.0020.0002] # KHMER SYMBOL LEK ATTAK BEI +1813 ; [.1C40.0020.0002] # MONGOLIAN DIGIT THREE +1949 ; [.1C40.0020.0002] # LIMBU DIGIT THREE +19D3 ; [.1C40.0020.0002] # NEW TAI LUE DIGIT THREE +1A83 ; [.1C40.0020.0002] # TAI THAM HORA DIGIT THREE +1A93 ; [.1C40.0020.0002] # TAI THAM THAM DIGIT THREE +1B53 ; [.1C40.0020.0002] # BALINESE DIGIT THREE +1BB3 ; [.1C40.0020.0002] # SUNDANESE DIGIT THREE +1C43 ; [.1C40.0020.0002] # LEPCHA DIGIT THREE +1C53 ; [.1C40.0020.0002] # OL CHIKI DIGIT THREE +3023 ; [.1C40.0020.0002] # HANGZHOU NUMERAL THREE +A623 ; [.1C40.0020.0002] # VAI DIGIT THREE +A8D3 ; [.1C40.0020.0002] # SAURASHTRA DIGIT THREE +A903 ; [.1C40.0020.0002] # KAYAH LI DIGIT THREE +A9D3 ; [.1C40.0020.0002] # JAVANESE DIGIT THREE +A9F3 ; [.1C40.0020.0002] # MYANMAR TAI LAING DIGIT THREE +AA53 ; [.1C40.0020.0002] # CHAM DIGIT THREE +ABF3 ; [.1C40.0020.0002] # MEETEI MAYEK DIGIT THREE +10109 ; [.1C40.0020.0002] # AEGEAN NUMBER THREE +102E3 ; [.1C40.0020.0002] # COPTIC EPACT DIGIT THREE +104A3 ; [.1C40.0020.0002] # OSMANYA DIGIT THREE +1085A ; [.1C40.0020.0002] # IMPERIAL ARAMAIC NUMBER THREE +1087B ; [.1C40.0020.0002] # PALMYRENE NUMBER THREE +108A9 ; [.1C40.0020.0002] # NABATAEAN NUMBER THREE +1091B ; [.1C40.0020.0002] # PHOENICIAN NUMBER THREE +109C2 ; [.1C40.0020.0002] # MEROITIC CURSIVE NUMBER THREE +10A42 ; [.1C40.0020.0002] # KHAROSHTHI DIGIT THREE +10B5A ; [.1C40.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER THREE +10B7A ; [.1C40.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER THREE +10BAB ; [.1C40.0020.0002] # PSALTER PAHLAVI NUMBER THREE +10E62 ; [.1C40.0020.0002] # RUMI DIGIT THREE +11054 ; [.1C40.0020.0002] # BRAHMI NUMBER THREE +11069 ; [.1C40.0020.0002] # BRAHMI DIGIT THREE +110F3 ; [.1C40.0020.0002] # SORA SOMPENG DIGIT THREE +11139 ; [.1C40.0020.0002] # CHAKMA DIGIT THREE +111D3 ; [.1C40.0020.0002] # SHARADA DIGIT THREE +111E3 ; [.1C40.0020.0002] # SINHALA ARCHAIC DIGIT THREE +112F3 ; [.1C40.0020.0002] # KHUDAWADI DIGIT THREE +11453 ; [.1C40.0020.0002] # NEWA DIGIT THREE +114D3 ; [.1C40.0020.0002] # TIRHUTA DIGIT THREE +11653 ; [.1C40.0020.0002] # MODI DIGIT THREE +116C3 ; [.1C40.0020.0002] # TAKRI DIGIT THREE +11733 ; [.1C40.0020.0002] # AHOM DIGIT THREE +118E3 ; [.1C40.0020.0002] # WARANG CITI DIGIT THREE +11C53 ; [.1C40.0020.0002] # BHAIKSUKI DIGIT THREE +11C5C ; [.1C40.0020.0002] # BHAIKSUKI NUMBER THREE +12401 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH +12408 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE DISH +12417 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESH2 +12420 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESHU +12424 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 +12425 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM +1242E ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU +1242F ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM +12436 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU +12437 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM +1243A ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16 +1243B ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21 +1244B ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH TENU +12451 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BAN2 +12457 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAESH +16A63 ; [.1C40.0020.0002] # MRO DIGIT THREE +16B53 ; [.1C40.0020.0002] # PAHAWH HMONG DIGIT THREE +1D362 ; [.1C40.0020.0002] # COUNTING ROD UNIT DIGIT THREE +1E8C9 ; [.1C40.0020.0002] # MENDE KIKAKUI DIGIT THREE +1E953 ; [.1C40.0020.0002] # ADLAM DIGIT THREE +FF13 ; [.1C40.0020.0003] # FULLWIDTH DIGIT THREE +0F2C ; [.1C40.0020.0004] # TIBETAN DIGIT HALF THREE +2476 ; [*0317.0020.0004][.1C40.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT THREE +248A ; [.1C40.0020.0004][*0277.0020.0004] # DIGIT THREE FULL STOP +1F104 ; [.1C40.0020.0004][*0222.0020.0004] # DIGIT THREE COMMA +1D7D1 ; [.1C40.0020.0005] # MATHEMATICAL BOLD DIGIT THREE +1D7DB ; [.1C40.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7E5 ; [.1C40.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT THREE +1D7EF ; [.1C40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F9 ; [.1C40.0020.0005] # MATHEMATICAL MONOSPACE DIGIT THREE +2462 ; [.1C40.0020.0006] # CIRCLED DIGIT THREE +24F7 ; [.1C40.0020.0006] # DOUBLE CIRCLED DIGIT THREE +2778 ; [.1C40.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT THREE +2782 ; [.1C40.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE +278C ; [.1C40.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +00B3 ; [.1C40.0020.0014] # SUPERSCRIPT THREE +2083 ; [.1C40.0020.0015] # SUBSCRIPT THREE +324A ; [.1C40.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER THIRTY ON BLACK SQUARE +325A ; [.1C40.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER THIRTY +33FD ; [.1C40.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +325B ; [.1C40.0020.0006][.1C3E.0020.0006] # CIRCLED NUMBER THIRTY ONE +33FE ; [.1C40.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +325C ; [.1C40.0020.0006][.1C3F.0020.0006] # CIRCLED NUMBER THIRTY TWO +325D ; [.1C40.0020.0006][.1C40.0020.0006] # CIRCLED NUMBER THIRTY THREE +325E ; [.1C40.0020.0006][.1C41.0020.0006] # CIRCLED NUMBER THIRTY FOUR +00BE ; [.1C40.0020.001E][*0626.0020.001E][.1C41.0020.001E] # VULGAR FRACTION THREE QUARTERS +325F ; [.1C40.0020.0006][.1C42.0020.0006] # CIRCLED NUMBER THIRTY FIVE +2157 ; [.1C40.0020.001E][*0626.0020.001E][.1C42.0020.001E] # VULGAR FRACTION THREE FIFTHS +32B1 ; [.1C40.0020.0006][.1C43.0020.0006] # CIRCLED NUMBER THIRTY SIX +32B2 ; [.1C40.0020.0006][.1C44.0020.0006] # CIRCLED NUMBER THIRTY SEVEN +32B3 ; [.1C40.0020.0006][.1C45.0020.0006] # CIRCLED NUMBER THIRTY EIGHT +215C ; [.1C40.0020.001E][*0626.0020.001E][.1C45.0020.001E] # VULGAR FRACTION THREE EIGHTHS +32B4 ; [.1C40.0020.0006][.1C46.0020.0006] # CIRCLED NUMBER THIRTY NINE +1F19B ; [.1C40.0020.001C][.1C8F.0020.001D] # SQUARED THREE D +33E2 ; [.1C40.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +32C2 ; [.1C40.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +335B ; [.1C40.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +0034 ; [.1C41.0020.0002] # DIGIT FOUR +0664 ; [.1C41.0020.0002] # ARABIC-INDIC DIGIT FOUR +06F4 ; [.1C41.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FOUR +07C4 ; [.1C41.0020.0002] # NKO DIGIT FOUR +096A ; [.1C41.0020.0002] # DEVANAGARI DIGIT FOUR +09EA ; [.1C41.0020.0002] # BENGALI DIGIT FOUR +0A6A ; [.1C41.0020.0002] # GURMUKHI DIGIT FOUR +0AEA ; [.1C41.0020.0002] # GUJARATI DIGIT FOUR +0B6A ; [.1C41.0020.0002] # ORIYA DIGIT FOUR +0BEA ; [.1C41.0020.0002] # TAMIL DIGIT FOUR +0C6A ; [.1C41.0020.0002] # TELUGU DIGIT FOUR +0CEA ; [.1C41.0020.0002] # KANNADA DIGIT FOUR +0D6A ; [.1C41.0020.0002] # MALAYALAM DIGIT FOUR +0DEA ; [.1C41.0020.0002] # SINHALA LITH DIGIT FOUR +0E54 ; [.1C41.0020.0002] # THAI DIGIT FOUR +0ED4 ; [.1C41.0020.0002] # LAO DIGIT FOUR +0F24 ; [.1C41.0020.0002] # TIBETAN DIGIT FOUR +1044 ; [.1C41.0020.0002] # MYANMAR DIGIT FOUR +1094 ; [.1C41.0020.0002] # MYANMAR SHAN DIGIT FOUR +136C ; [.1C41.0020.0002] # ETHIOPIC DIGIT FOUR +17E4 ; [.1C41.0020.0002] # KHMER DIGIT FOUR +17F4 ; [.1C41.0020.0002] # KHMER SYMBOL LEK ATTAK BUON +1814 ; [.1C41.0020.0002] # MONGOLIAN DIGIT FOUR +194A ; [.1C41.0020.0002] # LIMBU DIGIT FOUR +19D4 ; [.1C41.0020.0002] # NEW TAI LUE DIGIT FOUR +1A84 ; [.1C41.0020.0002] # TAI THAM HORA DIGIT FOUR +1A94 ; [.1C41.0020.0002] # TAI THAM THAM DIGIT FOUR +1B54 ; [.1C41.0020.0002] # BALINESE DIGIT FOUR +1BB4 ; [.1C41.0020.0002] # SUNDANESE DIGIT FOUR +1C44 ; [.1C41.0020.0002] # LEPCHA DIGIT FOUR +1C54 ; [.1C41.0020.0002] # OL CHIKI DIGIT FOUR +3024 ; [.1C41.0020.0002] # HANGZHOU NUMERAL FOUR +A624 ; [.1C41.0020.0002] # VAI DIGIT FOUR +A8D4 ; [.1C41.0020.0002] # SAURASHTRA DIGIT FOUR +A904 ; [.1C41.0020.0002] # KAYAH LI DIGIT FOUR +A9D4 ; [.1C41.0020.0002] # JAVANESE DIGIT FOUR +A9F4 ; [.1C41.0020.0002] # MYANMAR TAI LAING DIGIT FOUR +AA54 ; [.1C41.0020.0002] # CHAM DIGIT FOUR +ABF4 ; [.1C41.0020.0002] # MEETEI MAYEK DIGIT FOUR +1010A ; [.1C41.0020.0002] # AEGEAN NUMBER FOUR +102E4 ; [.1C41.0020.0002] # COPTIC EPACT DIGIT FOUR +104A4 ; [.1C41.0020.0002] # OSMANYA DIGIT FOUR +1087C ; [.1C41.0020.0002] # PALMYRENE NUMBER FOUR +108AA ; [.1C41.0020.0002] # NABATAEAN NUMBER FOUR +108AB ; [.1C41.0020.0002] # NABATAEAN CRUCIFORM NUMBER FOUR +109C3 ; [.1C41.0020.0002] # MEROITIC CURSIVE NUMBER FOUR +10A43 ; [.1C41.0020.0002] # KHAROSHTHI DIGIT FOUR +10B5B ; [.1C41.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER FOUR +10B7B ; [.1C41.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER FOUR +10BAC ; [.1C41.0020.0002] # PSALTER PAHLAVI NUMBER FOUR +10E63 ; [.1C41.0020.0002] # RUMI DIGIT FOUR +11055 ; [.1C41.0020.0002] # BRAHMI NUMBER FOUR +1106A ; [.1C41.0020.0002] # BRAHMI DIGIT FOUR +110F4 ; [.1C41.0020.0002] # SORA SOMPENG DIGIT FOUR +1113A ; [.1C41.0020.0002] # CHAKMA DIGIT FOUR +111D4 ; [.1C41.0020.0002] # SHARADA DIGIT FOUR +111E4 ; [.1C41.0020.0002] # SINHALA ARCHAIC DIGIT FOUR +112F4 ; [.1C41.0020.0002] # KHUDAWADI DIGIT FOUR +11454 ; [.1C41.0020.0002] # NEWA DIGIT FOUR +114D4 ; [.1C41.0020.0002] # TIRHUTA DIGIT FOUR +11654 ; [.1C41.0020.0002] # MODI DIGIT FOUR +116C4 ; [.1C41.0020.0002] # TAKRI DIGIT FOUR +11734 ; [.1C41.0020.0002] # AHOM DIGIT FOUR +118E4 ; [.1C41.0020.0002] # WARANG CITI DIGIT FOUR +11C54 ; [.1C41.0020.0002] # BHAIKSUKI DIGIT FOUR +11C5D ; [.1C41.0020.0002] # BHAIKSUKI NUMBER FOUR +12402 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH +12409 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR DISH +1240F ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U +12418 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESH2 +12421 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESHU +12426 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHAR2 +12430 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHARU +12438 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BURU +1243C ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU +1243D ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4 +1243E ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A +1243F ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B +1244C ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU +12452 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 +12453 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM +12469 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM +16A64 ; [.1C41.0020.0002] # MRO DIGIT FOUR +16B54 ; [.1C41.0020.0002] # PAHAWH HMONG DIGIT FOUR +1D363 ; [.1C41.0020.0002] # COUNTING ROD UNIT DIGIT FOUR +1E8CA ; [.1C41.0020.0002] # MENDE KIKAKUI DIGIT FOUR +1E954 ; [.1C41.0020.0002] # ADLAM DIGIT FOUR +FF14 ; [.1C41.0020.0003] # FULLWIDTH DIGIT FOUR +0F2D ; [.1C41.0020.0004] # TIBETAN DIGIT HALF FOUR +2477 ; [*0317.0020.0004][.1C41.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT FOUR +248B ; [.1C41.0020.0004][*0277.0020.0004] # DIGIT FOUR FULL STOP +1F105 ; [.1C41.0020.0004][*0222.0020.0004] # DIGIT FOUR COMMA +1D7D2 ; [.1C41.0020.0005] # MATHEMATICAL BOLD DIGIT FOUR +1D7DC ; [.1C41.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7E6 ; [.1C41.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7F0 ; [.1C41.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7FA ; [.1C41.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FOUR +2463 ; [.1C41.0020.0006] # CIRCLED DIGIT FOUR +24F8 ; [.1C41.0020.0006] # DOUBLE CIRCLED DIGIT FOUR +2779 ; [.1C41.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR +2783 ; [.1C41.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +278D ; [.1C41.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +2074 ; [.1C41.0020.0014] # SUPERSCRIPT FOUR +2084 ; [.1C41.0020.0015] # SUBSCRIPT FOUR +324B ; [.1C41.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER FORTY ON BLACK SQUARE +32B5 ; [.1C41.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER FORTY +32B6 ; [.1C41.0020.0006][.1C3E.0020.0006] # CIRCLED NUMBER FORTY ONE +32B7 ; [.1C41.0020.0006][.1C3F.0020.0006] # CIRCLED NUMBER FORTY TWO +32B8 ; [.1C41.0020.0006][.1C40.0020.0006] # CIRCLED NUMBER FORTY THREE +32B9 ; [.1C41.0020.0006][.1C41.0020.0006] # CIRCLED NUMBER FORTY FOUR +32BA ; [.1C41.0020.0006][.1C42.0020.0006] # CIRCLED NUMBER FORTY FIVE +2158 ; [.1C41.0020.001E][*0626.0020.001E][.1C42.0020.001E] # VULGAR FRACTION FOUR FIFTHS +32BB ; [.1C41.0020.0006][.1C43.0020.0006] # CIRCLED NUMBER FORTY SIX +32BC ; [.1C41.0020.0006][.1C44.0020.0006] # CIRCLED NUMBER FORTY SEVEN +32BD ; [.1C41.0020.0006][.1C45.0020.0006] # CIRCLED NUMBER FORTY EIGHT +32BE ; [.1C41.0020.0006][.1C46.0020.0006] # CIRCLED NUMBER FORTY NINE +1F19E ; [.1C41.0020.001C][.1D65.0020.001D] # SQUARED FOUR K +33E3 ; [.1C41.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +32C3 ; [.1C41.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +335C ; [.1C41.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +0035 ; [.1C42.0020.0002] # DIGIT FIVE +0665 ; [.1C42.0020.0002] # ARABIC-INDIC DIGIT FIVE +06F5 ; [.1C42.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FIVE +07C5 ; [.1C42.0020.0002] # NKO DIGIT FIVE +096B ; [.1C42.0020.0002] # DEVANAGARI DIGIT FIVE +09EB ; [.1C42.0020.0002] # BENGALI DIGIT FIVE +0A6B ; [.1C42.0020.0002] # GURMUKHI DIGIT FIVE +0AEB ; [.1C42.0020.0002] # GUJARATI DIGIT FIVE +0B6B ; [.1C42.0020.0002] # ORIYA DIGIT FIVE +0BEB ; [.1C42.0020.0002] # TAMIL DIGIT FIVE +0C6B ; [.1C42.0020.0002] # TELUGU DIGIT FIVE +0CEB ; [.1C42.0020.0002] # KANNADA DIGIT FIVE +0D6B ; [.1C42.0020.0002] # MALAYALAM DIGIT FIVE +0DEB ; [.1C42.0020.0002] # SINHALA LITH DIGIT FIVE +0E55 ; [.1C42.0020.0002] # THAI DIGIT FIVE +0ED5 ; [.1C42.0020.0002] # LAO DIGIT FIVE +0F25 ; [.1C42.0020.0002] # TIBETAN DIGIT FIVE +1045 ; [.1C42.0020.0002] # MYANMAR DIGIT FIVE +1095 ; [.1C42.0020.0002] # MYANMAR SHAN DIGIT FIVE +136D ; [.1C42.0020.0002] # ETHIOPIC DIGIT FIVE +17E5 ; [.1C42.0020.0002] # KHMER DIGIT FIVE +17F5 ; [.1C42.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM +1815 ; [.1C42.0020.0002] # MONGOLIAN DIGIT FIVE +194B ; [.1C42.0020.0002] # LIMBU DIGIT FIVE +19D5 ; [.1C42.0020.0002] # NEW TAI LUE DIGIT FIVE +1A85 ; [.1C42.0020.0002] # TAI THAM HORA DIGIT FIVE +1A95 ; [.1C42.0020.0002] # TAI THAM THAM DIGIT FIVE +1B55 ; [.1C42.0020.0002] # BALINESE DIGIT FIVE +1BB5 ; [.1C42.0020.0002] # SUNDANESE DIGIT FIVE +1C45 ; [.1C42.0020.0002] # LEPCHA DIGIT FIVE +1C55 ; [.1C42.0020.0002] # OL CHIKI DIGIT FIVE +3025 ; [.1C42.0020.0002] # HANGZHOU NUMERAL FIVE +A625 ; [.1C42.0020.0002] # VAI DIGIT FIVE +A8D5 ; [.1C42.0020.0002] # SAURASHTRA DIGIT FIVE +A905 ; [.1C42.0020.0002] # KAYAH LI DIGIT FIVE +A9D5 ; [.1C42.0020.0002] # JAVANESE DIGIT FIVE +A9F5 ; [.1C42.0020.0002] # MYANMAR TAI LAING DIGIT FIVE +AA55 ; [.1C42.0020.0002] # CHAM DIGIT FIVE +ABF5 ; [.1C42.0020.0002] # MEETEI MAYEK DIGIT FIVE +1010B ; [.1C42.0020.0002] # AEGEAN NUMBER FIVE +10143 ; [.1C42.0020.0002] # GREEK ACROPHONIC ATTIC FIVE +10148 ; [.1C42.0020.0002] # GREEK ACROPHONIC ATTIC FIVE TALENTS +1014F ; [.1C42.0020.0002] # GREEK ACROPHONIC ATTIC FIVE STATERS +1015F ; [.1C42.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE +10173 ; [.1C42.0020.0002] # GREEK ACROPHONIC DELPHIC FIVE MNAS +102E5 ; [.1C42.0020.0002] # COPTIC EPACT DIGIT FIVE +10321 ; [.1C42.0020.0002] # OLD ITALIC NUMERAL FIVE +104A5 ; [.1C42.0020.0002] # OSMANYA DIGIT FIVE +1087D ; [.1C42.0020.0002] # PALMYRENE NUMBER FIVE +108AC ; [.1C42.0020.0002] # NABATAEAN NUMBER FIVE +108FC ; [.1C42.0020.0002] # HATRAN NUMBER FIVE +109C4 ; [.1C42.0020.0002] # MEROITIC CURSIVE NUMBER FIVE +10AEC ; [.1C42.0020.0002] # MANICHAEAN NUMBER FIVE +10CFB ; [.1C42.0020.0002] # OLD HUNGARIAN NUMBER FIVE +10E64 ; [.1C42.0020.0002] # RUMI DIGIT FIVE +11056 ; [.1C42.0020.0002] # BRAHMI NUMBER FIVE +1106B ; [.1C42.0020.0002] # BRAHMI DIGIT FIVE +110F5 ; [.1C42.0020.0002] # SORA SOMPENG DIGIT FIVE +1113B ; [.1C42.0020.0002] # CHAKMA DIGIT FIVE +111D5 ; [.1C42.0020.0002] # SHARADA DIGIT FIVE +111E5 ; [.1C42.0020.0002] # SINHALA ARCHAIC DIGIT FIVE +112F5 ; [.1C42.0020.0002] # KHUDAWADI DIGIT FIVE +11455 ; [.1C42.0020.0002] # NEWA DIGIT FIVE +114D5 ; [.1C42.0020.0002] # TIRHUTA DIGIT FIVE +11655 ; [.1C42.0020.0002] # MODI DIGIT FIVE +116C5 ; [.1C42.0020.0002] # TAKRI DIGIT FIVE +11735 ; [.1C42.0020.0002] # AHOM DIGIT FIVE +118E5 ; [.1C42.0020.0002] # WARANG CITI DIGIT FIVE +11C55 ; [.1C42.0020.0002] # BHAIKSUKI DIGIT FIVE +11C5E ; [.1C42.0020.0002] # BHAIKSUKI NUMBER FIVE +12403 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH +1240A ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE DISH +12410 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U +12419 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESH2 +12422 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESHU +12427 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHAR2 +12431 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHARU +12439 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BURU +1244D ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU +12454 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 +12455 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM +1246A ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM +16A65 ; [.1C42.0020.0002] # MRO DIGIT FIVE +16B55 ; [.1C42.0020.0002] # PAHAWH HMONG DIGIT FIVE +1D364 ; [.1C42.0020.0002] # COUNTING ROD UNIT DIGIT FIVE +1E8CB ; [.1C42.0020.0002] # MENDE KIKAKUI DIGIT FIVE +1E955 ; [.1C42.0020.0002] # ADLAM DIGIT FIVE +FF15 ; [.1C42.0020.0003] # FULLWIDTH DIGIT FIVE +0F2E ; [.1C42.0020.0004] # TIBETAN DIGIT HALF FIVE +2478 ; [*0317.0020.0004][.1C42.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT FIVE +248C ; [.1C42.0020.0004][*0277.0020.0004] # DIGIT FIVE FULL STOP +1F106 ; [.1C42.0020.0004][*0222.0020.0004] # DIGIT FIVE COMMA +1D7D3 ; [.1C42.0020.0005] # MATHEMATICAL BOLD DIGIT FIVE +1D7DD ; [.1C42.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7E7 ; [.1C42.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7F1 ; [.1C42.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7FB ; [.1C42.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FIVE +2464 ; [.1C42.0020.0006] # CIRCLED DIGIT FIVE +24F9 ; [.1C42.0020.0006] # DOUBLE CIRCLED DIGIT FIVE +277A ; [.1C42.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE +2784 ; [.1C42.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +278E ; [.1C42.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +2075 ; [.1C42.0020.0014] # SUPERSCRIPT FIVE +2085 ; [.1C42.0020.0015] # SUBSCRIPT FIVE +324C ; [.1C42.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER FIFTY ON BLACK SQUARE +32BF ; [.1C42.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER FIFTY +1F1A0 ; [.1C42.0020.001C][*0277.0020.001C][.1C3E.0020.001C] # SQUARED FIVE POINT ONE +215A ; [.1C42.0020.001E][*0626.0020.001E][.1C43.0020.001E] # VULGAR FRACTION FIVE SIXTHS +215D ; [.1C42.0020.001E][*0626.0020.001E][.1C45.0020.001E] # VULGAR FRACTION FIVE EIGHTHS +33E4 ; [.1C42.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +32C4 ; [.1C42.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +335D ; [.1C42.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +0036 ; [.1C43.0020.0002] # DIGIT SIX +0666 ; [.1C43.0020.0002] # ARABIC-INDIC DIGIT SIX +06F6 ; [.1C43.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SIX +07C6 ; [.1C43.0020.0002] # NKO DIGIT SIX +096C ; [.1C43.0020.0002] # DEVANAGARI DIGIT SIX +09EC ; [.1C43.0020.0002] # BENGALI DIGIT SIX +0A6C ; [.1C43.0020.0002] # GURMUKHI DIGIT SIX +0AEC ; [.1C43.0020.0002] # GUJARATI DIGIT SIX +0B6C ; [.1C43.0020.0002] # ORIYA DIGIT SIX +0BEC ; [.1C43.0020.0002] # TAMIL DIGIT SIX +0C6C ; [.1C43.0020.0002] # TELUGU DIGIT SIX +0CEC ; [.1C43.0020.0002] # KANNADA DIGIT SIX +0D6C ; [.1C43.0020.0002] # MALAYALAM DIGIT SIX +0DEC ; [.1C43.0020.0002] # SINHALA LITH DIGIT SIX +0E56 ; [.1C43.0020.0002] # THAI DIGIT SIX +0ED6 ; [.1C43.0020.0002] # LAO DIGIT SIX +0F26 ; [.1C43.0020.0002] # TIBETAN DIGIT SIX +1046 ; [.1C43.0020.0002] # MYANMAR DIGIT SIX +1096 ; [.1C43.0020.0002] # MYANMAR SHAN DIGIT SIX +136E ; [.1C43.0020.0002] # ETHIOPIC DIGIT SIX +17E6 ; [.1C43.0020.0002] # KHMER DIGIT SIX +17F6 ; [.1C43.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-MUOY +1816 ; [.1C43.0020.0002] # MONGOLIAN DIGIT SIX +194C ; [.1C43.0020.0002] # LIMBU DIGIT SIX +19D6 ; [.1C43.0020.0002] # NEW TAI LUE DIGIT SIX +1A86 ; [.1C43.0020.0002] # TAI THAM HORA DIGIT SIX +1A96 ; [.1C43.0020.0002] # TAI THAM THAM DIGIT SIX +1B56 ; [.1C43.0020.0002] # BALINESE DIGIT SIX +1BB6 ; [.1C43.0020.0002] # SUNDANESE DIGIT SIX +1C46 ; [.1C43.0020.0002] # LEPCHA DIGIT SIX +1C56 ; [.1C43.0020.0002] # OL CHIKI DIGIT SIX +2185 ; [.1C43.0020.0002] # ROMAN NUMERAL SIX LATE FORM +3026 ; [.1C43.0020.0002] # HANGZHOU NUMERAL SIX +A626 ; [.1C43.0020.0002] # VAI DIGIT SIX +A8D6 ; [.1C43.0020.0002] # SAURASHTRA DIGIT SIX +A906 ; [.1C43.0020.0002] # KAYAH LI DIGIT SIX +A9D6 ; [.1C43.0020.0002] # JAVANESE DIGIT SIX +A9F6 ; [.1C43.0020.0002] # MYANMAR TAI LAING DIGIT SIX +AA56 ; [.1C43.0020.0002] # CHAM DIGIT SIX +ABF6 ; [.1C43.0020.0002] # MEETEI MAYEK DIGIT SIX +1010C ; [.1C43.0020.0002] # AEGEAN NUMBER SIX +102E6 ; [.1C43.0020.0002] # COPTIC EPACT DIGIT SIX +104A6 ; [.1C43.0020.0002] # OSMANYA DIGIT SIX +109C5 ; [.1C43.0020.0002] # MEROITIC CURSIVE NUMBER SIX +10E65 ; [.1C43.0020.0002] # RUMI DIGIT SIX +11057 ; [.1C43.0020.0002] # BRAHMI NUMBER SIX +1106C ; [.1C43.0020.0002] # BRAHMI DIGIT SIX +110F6 ; [.1C43.0020.0002] # SORA SOMPENG DIGIT SIX +1113C ; [.1C43.0020.0002] # CHAKMA DIGIT SIX +111D6 ; [.1C43.0020.0002] # SHARADA DIGIT SIX +111E6 ; [.1C43.0020.0002] # SINHALA ARCHAIC DIGIT SIX +112F6 ; [.1C43.0020.0002] # KHUDAWADI DIGIT SIX +11456 ; [.1C43.0020.0002] # NEWA DIGIT SIX +114D6 ; [.1C43.0020.0002] # TIRHUTA DIGIT SIX +11656 ; [.1C43.0020.0002] # MODI DIGIT SIX +116C6 ; [.1C43.0020.0002] # TAKRI DIGIT SIX +11736 ; [.1C43.0020.0002] # AHOM DIGIT SIX +118E6 ; [.1C43.0020.0002] # WARANG CITI DIGIT SIX +11C56 ; [.1C43.0020.0002] # BHAIKSUKI DIGIT SIX +11C5F ; [.1C43.0020.0002] # BHAIKSUKI NUMBER SIX +12404 ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH +1240B ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX DISH +12411 ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U +1241A ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX GESH2 +12428 ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX SHAR2 +12440 ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9 +1244E ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH TENU +1246B ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM +16A66 ; [.1C43.0020.0002] # MRO DIGIT SIX +16B56 ; [.1C43.0020.0002] # PAHAWH HMONG DIGIT SIX +1D365 ; [.1C43.0020.0002] # COUNTING ROD UNIT DIGIT SIX +1E8CC ; [.1C43.0020.0002] # MENDE KIKAKUI DIGIT SIX +1E956 ; [.1C43.0020.0002] # ADLAM DIGIT SIX +FF16 ; [.1C43.0020.0003] # FULLWIDTH DIGIT SIX +0F2F ; [.1C43.0020.0004] # TIBETAN DIGIT HALF SIX +2479 ; [*0317.0020.0004][.1C43.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT SIX +248D ; [.1C43.0020.0004][*0277.0020.0004] # DIGIT SIX FULL STOP +1F107 ; [.1C43.0020.0004][*0222.0020.0004] # DIGIT SIX COMMA +1D7D4 ; [.1C43.0020.0005] # MATHEMATICAL BOLD DIGIT SIX +1D7DE ; [.1C43.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7E8 ; [.1C43.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SIX +1D7F2 ; [.1C43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7FC ; [.1C43.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SIX +2465 ; [.1C43.0020.0006] # CIRCLED DIGIT SIX +24FA ; [.1C43.0020.0006] # DOUBLE CIRCLED DIGIT SIX +277B ; [.1C43.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SIX +2785 ; [.1C43.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX +278F ; [.1C43.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +2076 ; [.1C43.0020.0014] # SUPERSCRIPT SIX +2086 ; [.1C43.0020.0015] # SUBSCRIPT SIX +324D ; [.1C43.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER SIXTY ON BLACK SQUARE +1F1A3 ; [.1C43.0020.001C][.1C3D.0020.001C][.1E0C.0020.001D] # SQUARED SIXTY P +33E5 ; [.1C43.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +32C5 ; [.1C43.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +335E ; [.1C43.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +0037 ; [.1C44.0020.0002] # DIGIT SEVEN +0667 ; [.1C44.0020.0002] # ARABIC-INDIC DIGIT SEVEN +06F7 ; [.1C44.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SEVEN +07C7 ; [.1C44.0020.0002] # NKO DIGIT SEVEN +096D ; [.1C44.0020.0002] # DEVANAGARI DIGIT SEVEN +09ED ; [.1C44.0020.0002] # BENGALI DIGIT SEVEN +0A6D ; [.1C44.0020.0002] # GURMUKHI DIGIT SEVEN +0AED ; [.1C44.0020.0002] # GUJARATI DIGIT SEVEN +0B6D ; [.1C44.0020.0002] # ORIYA DIGIT SEVEN +0BED ; [.1C44.0020.0002] # TAMIL DIGIT SEVEN +0C6D ; [.1C44.0020.0002] # TELUGU DIGIT SEVEN +0CED ; [.1C44.0020.0002] # KANNADA DIGIT SEVEN +0D6D ; [.1C44.0020.0002] # MALAYALAM DIGIT SEVEN +0DED ; [.1C44.0020.0002] # SINHALA LITH DIGIT SEVEN +0E57 ; [.1C44.0020.0002] # THAI DIGIT SEVEN +0ED7 ; [.1C44.0020.0002] # LAO DIGIT SEVEN +0F27 ; [.1C44.0020.0002] # TIBETAN DIGIT SEVEN +1047 ; [.1C44.0020.0002] # MYANMAR DIGIT SEVEN +1097 ; [.1C44.0020.0002] # MYANMAR SHAN DIGIT SEVEN +136F ; [.1C44.0020.0002] # ETHIOPIC DIGIT SEVEN +17E7 ; [.1C44.0020.0002] # KHMER DIGIT SEVEN +17F7 ; [.1C44.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-PII +1817 ; [.1C44.0020.0002] # MONGOLIAN DIGIT SEVEN +194D ; [.1C44.0020.0002] # LIMBU DIGIT SEVEN +19D7 ; [.1C44.0020.0002] # NEW TAI LUE DIGIT SEVEN +1A87 ; [.1C44.0020.0002] # TAI THAM HORA DIGIT SEVEN +1A97 ; [.1C44.0020.0002] # TAI THAM THAM DIGIT SEVEN +1B57 ; [.1C44.0020.0002] # BALINESE DIGIT SEVEN +1BB7 ; [.1C44.0020.0002] # SUNDANESE DIGIT SEVEN +1C47 ; [.1C44.0020.0002] # LEPCHA DIGIT SEVEN +1C57 ; [.1C44.0020.0002] # OL CHIKI DIGIT SEVEN +3027 ; [.1C44.0020.0002] # HANGZHOU NUMERAL SEVEN +A627 ; [.1C44.0020.0002] # VAI DIGIT SEVEN +A8D7 ; [.1C44.0020.0002] # SAURASHTRA DIGIT SEVEN +A907 ; [.1C44.0020.0002] # KAYAH LI DIGIT SEVEN +A9D7 ; [.1C44.0020.0002] # JAVANESE DIGIT SEVEN +A9F7 ; [.1C44.0020.0002] # MYANMAR TAI LAING DIGIT SEVEN +AA57 ; [.1C44.0020.0002] # CHAM DIGIT SEVEN +ABF7 ; [.1C44.0020.0002] # MEETEI MAYEK DIGIT SEVEN +1010D ; [.1C44.0020.0002] # AEGEAN NUMBER SEVEN +102E7 ; [.1C44.0020.0002] # COPTIC EPACT DIGIT SEVEN +104A7 ; [.1C44.0020.0002] # OSMANYA DIGIT SEVEN +109C6 ; [.1C44.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN +10E66 ; [.1C44.0020.0002] # RUMI DIGIT SEVEN +11058 ; [.1C44.0020.0002] # BRAHMI NUMBER SEVEN +1106D ; [.1C44.0020.0002] # BRAHMI DIGIT SEVEN +110F7 ; [.1C44.0020.0002] # SORA SOMPENG DIGIT SEVEN +1113D ; [.1C44.0020.0002] # CHAKMA DIGIT SEVEN +111D7 ; [.1C44.0020.0002] # SHARADA DIGIT SEVEN +111E7 ; [.1C44.0020.0002] # SINHALA ARCHAIC DIGIT SEVEN +112F7 ; [.1C44.0020.0002] # KHUDAWADI DIGIT SEVEN +11457 ; [.1C44.0020.0002] # NEWA DIGIT SEVEN +114D7 ; [.1C44.0020.0002] # TIRHUTA DIGIT SEVEN +11657 ; [.1C44.0020.0002] # MODI DIGIT SEVEN +116C7 ; [.1C44.0020.0002] # TAKRI DIGIT SEVEN +11737 ; [.1C44.0020.0002] # AHOM DIGIT SEVEN +118E7 ; [.1C44.0020.0002] # WARANG CITI DIGIT SEVEN +11C57 ; [.1C44.0020.0002] # BHAIKSUKI DIGIT SEVEN +11C60 ; [.1C44.0020.0002] # BHAIKSUKI NUMBER SEVEN +12405 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN ASH +1240C ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN DISH +12412 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U +1241B ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN GESH2 +12429 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2 +12441 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3 +12442 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A +12443 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B +1246C ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM +16A67 ; [.1C44.0020.0002] # MRO DIGIT SEVEN +16B57 ; [.1C44.0020.0002] # PAHAWH HMONG DIGIT SEVEN +1D366 ; [.1C44.0020.0002] # COUNTING ROD UNIT DIGIT SEVEN +1E8CD ; [.1C44.0020.0002] # MENDE KIKAKUI DIGIT SEVEN +1E957 ; [.1C44.0020.0002] # ADLAM DIGIT SEVEN +FF17 ; [.1C44.0020.0003] # FULLWIDTH DIGIT SEVEN +0F30 ; [.1C44.0020.0004] # TIBETAN DIGIT HALF SEVEN +247A ; [*0317.0020.0004][.1C44.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT SEVEN +248E ; [.1C44.0020.0004][*0277.0020.0004] # DIGIT SEVEN FULL STOP +1F108 ; [.1C44.0020.0004][*0222.0020.0004] # DIGIT SEVEN COMMA +1D7D5 ; [.1C44.0020.0005] # MATHEMATICAL BOLD DIGIT SEVEN +1D7DF ; [.1C44.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E9 ; [.1C44.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7F3 ; [.1C44.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7FD ; [.1C44.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SEVEN +2466 ; [.1C44.0020.0006] # CIRCLED DIGIT SEVEN +24FB ; [.1C44.0020.0006] # DOUBLE CIRCLED DIGIT SEVEN +277C ; [.1C44.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +2786 ; [.1C44.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2790 ; [.1C44.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +2077 ; [.1C44.0020.0014] # SUPERSCRIPT SEVEN +2087 ; [.1C44.0020.0015] # SUBSCRIPT SEVEN +324E ; [.1C44.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER SEVENTY ON BLACK SQUARE +1F1A1 ; [.1C44.0020.001C][*0277.0020.001C][.1C3E.0020.001C] # SQUARED SEVEN POINT ONE +215E ; [.1C44.0020.001E][*0626.0020.001E][.1C45.0020.001E] # VULGAR FRACTION SEVEN EIGHTHS +33E6 ; [.1C44.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +32C6 ; [.1C44.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +335F ; [.1C44.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +0038 ; [.1C45.0020.0002] # DIGIT EIGHT +0668 ; [.1C45.0020.0002] # ARABIC-INDIC DIGIT EIGHT +06F8 ; [.1C45.0020.0002] # EXTENDED ARABIC-INDIC DIGIT EIGHT +07C8 ; [.1C45.0020.0002] # NKO DIGIT EIGHT +096E ; [.1C45.0020.0002] # DEVANAGARI DIGIT EIGHT +09EE ; [.1C45.0020.0002] # BENGALI DIGIT EIGHT +0A6E ; [.1C45.0020.0002] # GURMUKHI DIGIT EIGHT +0AEE ; [.1C45.0020.0002] # GUJARATI DIGIT EIGHT +0B6E ; [.1C45.0020.0002] # ORIYA DIGIT EIGHT +0BEE ; [.1C45.0020.0002] # TAMIL DIGIT EIGHT +0C6E ; [.1C45.0020.0002] # TELUGU DIGIT EIGHT +0CEE ; [.1C45.0020.0002] # KANNADA DIGIT EIGHT +0D6E ; [.1C45.0020.0002] # MALAYALAM DIGIT EIGHT +0DEE ; [.1C45.0020.0002] # SINHALA LITH DIGIT EIGHT +0E58 ; [.1C45.0020.0002] # THAI DIGIT EIGHT +0ED8 ; [.1C45.0020.0002] # LAO DIGIT EIGHT +0F28 ; [.1C45.0020.0002] # TIBETAN DIGIT EIGHT +1048 ; [.1C45.0020.0002] # MYANMAR DIGIT EIGHT +1098 ; [.1C45.0020.0002] # MYANMAR SHAN DIGIT EIGHT +1370 ; [.1C45.0020.0002] # ETHIOPIC DIGIT EIGHT +17E8 ; [.1C45.0020.0002] # KHMER DIGIT EIGHT +17F8 ; [.1C45.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BEI +1818 ; [.1C45.0020.0002] # MONGOLIAN DIGIT EIGHT +194E ; [.1C45.0020.0002] # LIMBU DIGIT EIGHT +19D8 ; [.1C45.0020.0002] # NEW TAI LUE DIGIT EIGHT +1A88 ; [.1C45.0020.0002] # TAI THAM HORA DIGIT EIGHT +1A98 ; [.1C45.0020.0002] # TAI THAM THAM DIGIT EIGHT +1B58 ; [.1C45.0020.0002] # BALINESE DIGIT EIGHT +1BB8 ; [.1C45.0020.0002] # SUNDANESE DIGIT EIGHT +1C48 ; [.1C45.0020.0002] # LEPCHA DIGIT EIGHT +1C58 ; [.1C45.0020.0002] # OL CHIKI DIGIT EIGHT +3028 ; [.1C45.0020.0002] # HANGZHOU NUMERAL EIGHT +A628 ; [.1C45.0020.0002] # VAI DIGIT EIGHT +A8D8 ; [.1C45.0020.0002] # SAURASHTRA DIGIT EIGHT +A908 ; [.1C45.0020.0002] # KAYAH LI DIGIT EIGHT +A9D8 ; [.1C45.0020.0002] # JAVANESE DIGIT EIGHT +A9F8 ; [.1C45.0020.0002] # MYANMAR TAI LAING DIGIT EIGHT +AA58 ; [.1C45.0020.0002] # CHAM DIGIT EIGHT +ABF8 ; [.1C45.0020.0002] # MEETEI MAYEK DIGIT EIGHT +1010E ; [.1C45.0020.0002] # AEGEAN NUMBER EIGHT +102E8 ; [.1C45.0020.0002] # COPTIC EPACT DIGIT EIGHT +104A8 ; [.1C45.0020.0002] # OSMANYA DIGIT EIGHT +109C7 ; [.1C45.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT +10E67 ; [.1C45.0020.0002] # RUMI DIGIT EIGHT +11059 ; [.1C45.0020.0002] # BRAHMI NUMBER EIGHT +1106E ; [.1C45.0020.0002] # BRAHMI DIGIT EIGHT +110F8 ; [.1C45.0020.0002] # SORA SOMPENG DIGIT EIGHT +1113E ; [.1C45.0020.0002] # CHAKMA DIGIT EIGHT +111D8 ; [.1C45.0020.0002] # SHARADA DIGIT EIGHT +111E8 ; [.1C45.0020.0002] # SINHALA ARCHAIC DIGIT EIGHT +112F8 ; [.1C45.0020.0002] # KHUDAWADI DIGIT EIGHT +11458 ; [.1C45.0020.0002] # NEWA DIGIT EIGHT +114D8 ; [.1C45.0020.0002] # TIRHUTA DIGIT EIGHT +11658 ; [.1C45.0020.0002] # MODI DIGIT EIGHT +116C8 ; [.1C45.0020.0002] # TAKRI DIGIT EIGHT +11738 ; [.1C45.0020.0002] # AHOM DIGIT EIGHT +118E8 ; [.1C45.0020.0002] # WARANG CITI DIGIT EIGHT +11C58 ; [.1C45.0020.0002] # BHAIKSUKI DIGIT EIGHT +11C61 ; [.1C45.0020.0002] # BHAIKSUKI NUMBER EIGHT +12406 ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT ASH +1240D ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT DISH +12413 ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U +1241C ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT GESH2 +1242A ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2 +12444 ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU +12445 ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3 +1246D ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM +16A68 ; [.1C45.0020.0002] # MRO DIGIT EIGHT +16B58 ; [.1C45.0020.0002] # PAHAWH HMONG DIGIT EIGHT +1D367 ; [.1C45.0020.0002] # COUNTING ROD UNIT DIGIT EIGHT +1E8CE ; [.1C45.0020.0002] # MENDE KIKAKUI DIGIT EIGHT +1E958 ; [.1C45.0020.0002] # ADLAM DIGIT EIGHT +FF18 ; [.1C45.0020.0003] # FULLWIDTH DIGIT EIGHT +0F31 ; [.1C45.0020.0004] # TIBETAN DIGIT HALF EIGHT +247B ; [*0317.0020.0004][.1C45.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT EIGHT +248F ; [.1C45.0020.0004][*0277.0020.0004] # DIGIT EIGHT FULL STOP +1F109 ; [.1C45.0020.0004][*0222.0020.0004] # DIGIT EIGHT COMMA +1D7D6 ; [.1C45.0020.0005] # MATHEMATICAL BOLD DIGIT EIGHT +1D7E0 ; [.1C45.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7EA ; [.1C45.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7F4 ; [.1C45.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7FE ; [.1C45.0020.0005] # MATHEMATICAL MONOSPACE DIGIT EIGHT +2467 ; [.1C45.0020.0006] # CIRCLED DIGIT EIGHT +24FC ; [.1C45.0020.0006] # DOUBLE CIRCLED DIGIT EIGHT +277D ; [.1C45.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +2787 ; [.1C45.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2791 ; [.1C45.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +2078 ; [.1C45.0020.0014] # SUPERSCRIPT EIGHT +2088 ; [.1C45.0020.0015] # SUBSCRIPT EIGHT +324F ; [.1C45.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER EIGHTY ON BLACK SQUARE +1F19F ; [.1C45.0020.001C][.1D65.0020.001D] # SQUARED EIGHT K +33E7 ; [.1C45.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +32C7 ; [.1C45.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +3360 ; [.1C45.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +0039 ; [.1C46.0020.0002] # DIGIT NINE +0669 ; [.1C46.0020.0002] # ARABIC-INDIC DIGIT NINE +06F9 ; [.1C46.0020.0002] # EXTENDED ARABIC-INDIC DIGIT NINE +07C9 ; [.1C46.0020.0002] # NKO DIGIT NINE +096F ; [.1C46.0020.0002] # DEVANAGARI DIGIT NINE +09EF ; [.1C46.0020.0002] # BENGALI DIGIT NINE +0A6F ; [.1C46.0020.0002] # GURMUKHI DIGIT NINE +0AEF ; [.1C46.0020.0002] # GUJARATI DIGIT NINE +0B6F ; [.1C46.0020.0002] # ORIYA DIGIT NINE +0BEF ; [.1C46.0020.0002] # TAMIL DIGIT NINE +0C6F ; [.1C46.0020.0002] # TELUGU DIGIT NINE +0CEF ; [.1C46.0020.0002] # KANNADA DIGIT NINE +0D6F ; [.1C46.0020.0002] # MALAYALAM DIGIT NINE +0DEF ; [.1C46.0020.0002] # SINHALA LITH DIGIT NINE +0E59 ; [.1C46.0020.0002] # THAI DIGIT NINE +0ED9 ; [.1C46.0020.0002] # LAO DIGIT NINE +0F29 ; [.1C46.0020.0002] # TIBETAN DIGIT NINE +1049 ; [.1C46.0020.0002] # MYANMAR DIGIT NINE +1099 ; [.1C46.0020.0002] # MYANMAR SHAN DIGIT NINE +1371 ; [.1C46.0020.0002] # ETHIOPIC DIGIT NINE +17E9 ; [.1C46.0020.0002] # KHMER DIGIT NINE +17F9 ; [.1C46.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BUON +1819 ; [.1C46.0020.0002] # MONGOLIAN DIGIT NINE +194F ; [.1C46.0020.0002] # LIMBU DIGIT NINE +19D9 ; [.1C46.0020.0002] # NEW TAI LUE DIGIT NINE +1A89 ; [.1C46.0020.0002] # TAI THAM HORA DIGIT NINE +1A99 ; [.1C46.0020.0002] # TAI THAM THAM DIGIT NINE +1B59 ; [.1C46.0020.0002] # BALINESE DIGIT NINE +1BB9 ; [.1C46.0020.0002] # SUNDANESE DIGIT NINE +1C49 ; [.1C46.0020.0002] # LEPCHA DIGIT NINE +1C59 ; [.1C46.0020.0002] # OL CHIKI DIGIT NINE +3029 ; [.1C46.0020.0002] # HANGZHOU NUMERAL NINE +A629 ; [.1C46.0020.0002] # VAI DIGIT NINE +A8D9 ; [.1C46.0020.0002] # SAURASHTRA DIGIT NINE +A909 ; [.1C46.0020.0002] # KAYAH LI DIGIT NINE +A9D9 ; [.1C46.0020.0002] # JAVANESE DIGIT NINE +A9F9 ; [.1C46.0020.0002] # MYANMAR TAI LAING DIGIT NINE +AA59 ; [.1C46.0020.0002] # CHAM DIGIT NINE +ABF9 ; [.1C46.0020.0002] # MEETEI MAYEK DIGIT NINE +1010F ; [.1C46.0020.0002] # AEGEAN NUMBER NINE +102E9 ; [.1C46.0020.0002] # COPTIC EPACT DIGIT NINE +104A9 ; [.1C46.0020.0002] # OSMANYA DIGIT NINE +109C8 ; [.1C46.0020.0002] # MEROITIC CURSIVE NUMBER NINE +10E68 ; [.1C46.0020.0002] # RUMI DIGIT NINE +1105A ; [.1C46.0020.0002] # BRAHMI NUMBER NINE +1106F ; [.1C46.0020.0002] # BRAHMI DIGIT NINE +110F9 ; [.1C46.0020.0002] # SORA SOMPENG DIGIT NINE +1113F ; [.1C46.0020.0002] # CHAKMA DIGIT NINE +111D9 ; [.1C46.0020.0002] # SHARADA DIGIT NINE +111E9 ; [.1C46.0020.0002] # SINHALA ARCHAIC DIGIT NINE +112F9 ; [.1C46.0020.0002] # KHUDAWADI DIGIT NINE +11459 ; [.1C46.0020.0002] # NEWA DIGIT NINE +114D9 ; [.1C46.0020.0002] # TIRHUTA DIGIT NINE +11659 ; [.1C46.0020.0002] # MODI DIGIT NINE +116C9 ; [.1C46.0020.0002] # TAKRI DIGIT NINE +11739 ; [.1C46.0020.0002] # AHOM DIGIT NINE +118E9 ; [.1C46.0020.0002] # WARANG CITI DIGIT NINE +11C59 ; [.1C46.0020.0002] # BHAIKSUKI DIGIT NINE +11C62 ; [.1C46.0020.0002] # BHAIKSUKI NUMBER NINE +12407 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE ASH +1240E ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE DISH +12414 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U +1241D ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE GESH2 +1242B ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE SHAR2 +12446 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU +12447 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3 +12448 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4 +12449 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A +1246E ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +16A69 ; [.1C46.0020.0002] # MRO DIGIT NINE +16B59 ; [.1C46.0020.0002] # PAHAWH HMONG DIGIT NINE +1D368 ; [.1C46.0020.0002] # COUNTING ROD UNIT DIGIT NINE +1E8CF ; [.1C46.0020.0002] # MENDE KIKAKUI DIGIT NINE +1E959 ; [.1C46.0020.0002] # ADLAM DIGIT NINE +FF19 ; [.1C46.0020.0003] # FULLWIDTH DIGIT NINE +0F32 ; [.1C46.0020.0004] # TIBETAN DIGIT HALF NINE +247C ; [*0317.0020.0004][.1C46.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT NINE +2490 ; [.1C46.0020.0004][*0277.0020.0004] # DIGIT NINE FULL STOP +1F10A ; [.1C46.0020.0004][*0222.0020.0004] # DIGIT NINE COMMA +1D7D7 ; [.1C46.0020.0005] # MATHEMATICAL BOLD DIGIT NINE +1D7E1 ; [.1C46.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7EB ; [.1C46.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT NINE +1D7F5 ; [.1C46.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7FF ; [.1C46.0020.0005] # MATHEMATICAL MONOSPACE DIGIT NINE +2468 ; [.1C46.0020.0006] # CIRCLED DIGIT NINE +24FD ; [.1C46.0020.0006] # DOUBLE CIRCLED DIGIT NINE +277E ; [.1C46.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT NINE +2788 ; [.1C46.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2792 ; [.1C46.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +2079 ; [.1C46.0020.0014] # SUPERSCRIPT NINE +2089 ; [.1C46.0020.0015] # SUBSCRIPT NINE +33E8 ; [.1C46.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +32C8 ; [.1C46.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +3361 ; [.1C46.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +0061 ; [.1C47.0020.0002] # LATIN SMALL LETTER A +FF41 ; [.1C47.0020.0003] # FULLWIDTH LATIN SMALL LETTER A +0363 ; [.1C47.0020.0004] # COMBINING LATIN SMALL LETTER A +249C ; [*0317.0020.0004][.1C47.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER A +1D41A ; [.1C47.0020.0005] # MATHEMATICAL BOLD SMALL A +1D44E ; [.1C47.0020.0005] # MATHEMATICAL ITALIC SMALL A +1D482 ; [.1C47.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL A +1D4B6 ; [.1C47.0020.0005] # MATHEMATICAL SCRIPT SMALL A +1D4EA ; [.1C47.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL A +1D51E ; [.1C47.0020.0005] # MATHEMATICAL FRAKTUR SMALL A +1D552 ; [.1C47.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL A +1D586 ; [.1C47.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL A +1D5BA ; [.1C47.0020.0005] # MATHEMATICAL SANS-SERIF SMALL A +1D5EE ; [.1C47.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL A +1D622 ; [.1C47.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D656 ; [.1C47.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D68A ; [.1C47.0020.0005] # MATHEMATICAL MONOSPACE SMALL A +24D0 ; [.1C47.0020.0006] # CIRCLED LATIN SMALL LETTER A +0041 ; [.1C47.0020.0008] # LATIN CAPITAL LETTER A +FF21 ; [.1C47.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER A +1F110 ; [*0317.0020.0004][.1C47.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER A +1D400 ; [.1C47.0020.000B] # MATHEMATICAL BOLD CAPITAL A +1D434 ; [.1C47.0020.000B] # MATHEMATICAL ITALIC CAPITAL A +1D468 ; [.1C47.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL A +1D49C ; [.1C47.0020.000B] # MATHEMATICAL SCRIPT CAPITAL A +1D4D0 ; [.1C47.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL A +1D504 ; [.1C47.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL A +1D538 ; [.1C47.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D56C ; [.1C47.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D5A0 ; [.1C47.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL A +1D5D4 ; [.1C47.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D608 ; [.1C47.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D63C ; [.1C47.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D670 ; [.1C47.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL A +24B6 ; [.1C47.0020.000C] # CIRCLED LATIN CAPITAL LETTER A +1F150 ; [.1C47.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER A +00AA ; [.1C47.0020.0014] # FEMININE ORDINAL INDICATOR +1D43 ; [.1C47.0020.0014] # MODIFIER LETTER SMALL A +2090 ; [.1C47.0020.0015] # LATIN SUBSCRIPT SMALL LETTER A +1D2C ; [.1C47.0020.001D] # MODIFIER LETTER CAPITAL A +1F130 ; [.1C47.0020.001D] # SQUARED LATIN CAPITAL LETTER A +1F170 ; [.1C47.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER A +00E1 ; [.1C47.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH ACUTE +00C1 ; [.1C47.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH ACUTE +00E0 ; [.1C47.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH GRAVE +00C0 ; [.1C47.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH GRAVE +0103 ; [.1C47.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE +0102 ; [.1C47.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE +1EAF ; [.1C47.0020.0002][.0000.0026.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EAE ; [.1C47.0020.0008][.0000.0026.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB1 ; [.1C47.0020.0002][.0000.0026.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB0 ; [.1C47.0020.0008][.0000.0026.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB5 ; [.1C47.0020.0002][.0000.0026.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB4 ; [.1C47.0020.0008][.0000.0026.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB3 ; [.1C47.0020.0002][.0000.0026.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB2 ; [.1C47.0020.0008][.0000.0026.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +00E2 ; [.1C47.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX +00C2 ; [.1C47.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +1EA5 ; [.1C47.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA4 ; [.1C47.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA7 ; [.1C47.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA6 ; [.1C47.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EAB ; [.1C47.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAA ; [.1C47.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EA9 ; [.1C47.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA8 ; [.1C47.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +01CE ; [.1C47.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER A WITH CARON +01CD ; [.1C47.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER A WITH CARON +00E5 ; [.1C47.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER A WITH RING ABOVE +00C5 ; [.1C47.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE +212B ; [.1C47.0020.0008][.0000.0029.0002] # ANGSTROM SIGN +01FB ; [.1C47.0020.0002][.0000.0029.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FA ; [.1C47.0020.0008][.0000.0029.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +00E4 ; [.1C47.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER A WITH DIAERESIS +1DF2 ; [.1C47.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER A WITH DIAERESIS +A79B ; [.1C47.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK AE +00C4 ; [.1C47.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS +A79A ; [.1C47.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK AE +01DF ; [.1C47.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01DE ; [.1C47.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +00E3 ; [.1C47.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH TILDE +00C3 ; [.1C47.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH TILDE +0227 ; [.1C47.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER A WITH DOT ABOVE +0226 ; [.1C47.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE +01E1 ; [.1C47.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E0 ; [.1C47.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +0105 ; [.1C47.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER A WITH OGONEK +0104 ; [.1C47.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER A WITH OGONEK +0101 ; [.1C47.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH MACRON +0100 ; [.1C47.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH MACRON +1EA3 ; [.1C47.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH HOOK ABOVE +1EA2 ; [.1C47.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH HOOK ABOVE +0201 ; [.1C47.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER A WITH DOUBLE GRAVE +0200 ; [.1C47.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0203 ; [.1C47.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER A WITH INVERTED BREVE +0202 ; [.1C47.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER A WITH INVERTED BREVE +1EA1 ; [.1C47.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER A WITH DOT BELOW +1EA0 ; [.1C47.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER A WITH DOT BELOW +1EB7 ; [.1C47.0020.0002][.0000.0042.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB6 ; [.1C47.0020.0008][.0000.0042.0002][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EAD ; [.1C47.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAC ; [.1C47.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1E01 ; [.1C47.0020.0002][.0000.0044.0002] # LATIN SMALL LETTER A WITH RING BELOW +1E00 ; [.1C47.0020.0008][.0000.0044.0002] # LATIN CAPITAL LETTER A WITH RING BELOW +1DD3 ; [.1C47.0020.0004][.0000.0110.0004] # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE +A733 ; [.1C47.0020.0004][.1C47.0020.0004] # LATIN SMALL LETTER AA +A732 ; [.1C47.0020.000A][.1C47.0020.000A] # LATIN CAPITAL LETTER AA +1F18E ; [.1C47.0020.001D][.1C60.0020.001D] # NEGATIVE SQUARED AB +2100 ; [.1C47.0020.0004][*0394.0020.0004][.1C7A.0020.0004] # ACCOUNT OF +00E6 ; [.1C47.0020.0004][.0000.0110.0004][.1CAA.0020.0004] # LATIN SMALL LETTER AE +1DD4 ; [.1C47.0020.0004][.0000.0110.0004][.1CAA.0020.0004] # COMBINING LATIN SMALL LETTER AE +00C6 ; [.1C47.0020.000A][.0000.0110.0004][.1CAA.0020.000A] # LATIN CAPITAL LETTER AE +1D2D ; [.1C47.0020.0014][.0000.0110.0014][.1CAA.0020.0014] # MODIFIER LETTER CAPITAL AE +01FD ; [.1C47.0020.0004][.0000.0110.0004][.1CAA.0020.0004][.0000.0024.0002] # LATIN SMALL LETTER AE WITH ACUTE +01FC ; [.1C47.0020.000A][.0000.0110.0004][.1CAA.0020.000A][.0000.0024.0002] # LATIN CAPITAL LETTER AE WITH ACUTE +01E3 ; [.1C47.0020.0004][.0000.0110.0004][.1CAA.0020.0004][.0000.0032.0002] # LATIN SMALL LETTER AE WITH MACRON +01E2 ; [.1C47.0020.000A][.0000.0110.0004][.1CAA.0020.000A][.0000.0032.0002] # LATIN CAPITAL LETTER AE WITH MACRON +33C2 ; [.1C47.0020.001C][*0277.0020.001C][.1DAA.0020.001C][*0277.0020.001C] # SQUARE AM +33DF ; [.1C47.0020.001D][*0625.0020.001C][.1DAA.0020.001C] # SQUARE A OVER M +1DD5 ; [.1C47.0020.0004][.1DDD.0020.0004] # COMBINING LATIN SMALL LETTER AO +A735 ; [.1C47.0020.0004][.1DDD.0020.0004] # LATIN SMALL LETTER AO +A734 ; [.1C47.0020.000A][.1DDD.0020.000A] # LATIN CAPITAL LETTER AO +2101 ; [.1C47.0020.0004][*0394.0020.0004][.1E71.0020.0004] # ADDRESSED TO THE SUBJECT +214D ; [.1C47.0020.000A][*0394.0020.0004][.1E71.0020.000A] # AKTIESELSKAB +A737 ; [.1C47.0020.0004][.1EB5.0020.0004] # LATIN SMALL LETTER AU +A736 ; [.1C47.0020.000A][.1EB5.0020.000A] # LATIN CAPITAL LETTER AU +3373 ; [.1C47.0020.001D][.1EB5.0020.001D] # SQUARE AU +1DD6 ; [.1C47.0020.0004][.1EE3.0020.0004] # COMBINING LATIN SMALL LETTER AV +A739 ; [.1C47.0020.0004][.1EE3.0020.0004] # LATIN SMALL LETTER AV +A738 ; [.1C47.0020.000A][.1EE3.0020.000A] # LATIN CAPITAL LETTER AV +A73B ; [.1C47.0020.0004][.0000.0110.0004][.1EE3.0020.0004] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR +A73A ; [.1C47.0020.000A][.0000.0110.0004][.1EE3.0020.000A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73D ; [.1C47.0020.0004][.1F0B.0020.0004] # LATIN SMALL LETTER AY +A73C ; [.1C47.0020.000A][.1F0B.0020.000A] # LATIN CAPITAL LETTER AY +1E9A ; [.1C47.0020.0004][.1F80.0020.0004] # LATIN SMALL LETTER A WITH RIGHT HALF RING +1D00 ; [.1C4B.0020.0002] # LATIN LETTER SMALL CAPITAL A +2C65 ; [.1C4C.0020.0002] # LATIN SMALL LETTER A WITH STROKE +023A ; [.1C4C.0020.0008] # LATIN CAPITAL LETTER A WITH STROKE +1D8F ; [.1C4D.0020.0002] # LATIN SMALL LETTER A WITH RETROFLEX HOOK +1D01 ; [.1C4E.0020.0002] # LATIN LETTER SMALL CAPITAL AE +1D02 ; [.1C4F.0020.0002] # LATIN SMALL LETTER TURNED AE +1D46 ; [.1C4F.0020.0014] # MODIFIER LETTER SMALL TURNED AE +AB31 ; [.1C50.0020.0002] # LATIN SMALL LETTER A REVERSED-SCHWA +0250 ; [.1C51.0020.0002] # LATIN SMALL LETTER TURNED A +2C6F ; [.1C51.0020.0008] # LATIN CAPITAL LETTER TURNED A +1D44 ; [.1C51.0020.0014] # MODIFIER LETTER SMALL TURNED A +0251 ; [.1C55.0020.0002] # LATIN SMALL LETTER ALPHA +1DE7 ; [.1C55.0020.0004] # COMBINING LATIN SMALL LETTER ALPHA +2C6D ; [.1C55.0020.0008] # LATIN CAPITAL LETTER ALPHA +1D45 ; [.1C55.0020.0014] # MODIFIER LETTER SMALL ALPHA +AB30 ; [.1C59.0020.0002] # LATIN SMALL LETTER BARRED ALPHA +1D90 ; [.1C5A.0020.0002] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK +0252 ; [.1C5B.0020.0002] # LATIN SMALL LETTER TURNED ALPHA +2C70 ; [.1C5B.0020.0008] # LATIN CAPITAL LETTER TURNED ALPHA +1D9B ; [.1C5B.0020.0014] # MODIFIER LETTER SMALL TURNED ALPHA +AB64 ; [.1C5F.0020.0002] # LATIN SMALL LETTER INVERTED ALPHA +0062 ; [.1C60.0020.0002] # LATIN SMALL LETTER B +FF42 ; [.1C60.0020.0003] # FULLWIDTH LATIN SMALL LETTER B +1DE8 ; [.1C60.0020.0004] # COMBINING LATIN SMALL LETTER B +249D ; [*0317.0020.0004][.1C60.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER B +1D41B ; [.1C60.0020.0005] # MATHEMATICAL BOLD SMALL B +1D44F ; [.1C60.0020.0005] # MATHEMATICAL ITALIC SMALL B +1D483 ; [.1C60.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL B +1D4B7 ; [.1C60.0020.0005] # MATHEMATICAL SCRIPT SMALL B +1D4EB ; [.1C60.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL B +1D51F ; [.1C60.0020.0005] # MATHEMATICAL FRAKTUR SMALL B +1D553 ; [.1C60.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL B +1D587 ; [.1C60.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL B +1D5BB ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF SMALL B +1D5EF ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL B +1D623 ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D657 ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D68B ; [.1C60.0020.0005] # MATHEMATICAL MONOSPACE SMALL B +24D1 ; [.1C60.0020.0006] # CIRCLED LATIN SMALL LETTER B +0042 ; [.1C60.0020.0008] # LATIN CAPITAL LETTER B +FF22 ; [.1C60.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER B +1F111 ; [*0317.0020.0004][.1C60.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER B +212C ; [.1C60.0020.000B] # SCRIPT CAPITAL B +1D401 ; [.1C60.0020.000B] # MATHEMATICAL BOLD CAPITAL B +1D435 ; [.1C60.0020.000B] # MATHEMATICAL ITALIC CAPITAL B +1D469 ; [.1C60.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL B +1D4D1 ; [.1C60.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL B +1D505 ; [.1C60.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL B +1D539 ; [.1C60.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D56D ; [.1C60.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D5A1 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL B +1D5D5 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D609 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D63D ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D671 ; [.1C60.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL B +24B7 ; [.1C60.0020.000C] # CIRCLED LATIN CAPITAL LETTER B +1F151 ; [.1C60.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER B +1D47 ; [.1C60.0020.0014] # MODIFIER LETTER SMALL B +1D2E ; [.1C60.0020.001D] # MODIFIER LETTER CAPITAL B +1F131 ; [.1C60.0020.001D] # SQUARED LATIN CAPITAL LETTER B +1F171 ; [.1C60.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER B +1E03 ; [.1C60.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER B WITH DOT ABOVE +1E02 ; [.1C60.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E05 ; [.1C60.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER B WITH DOT BELOW +1E04 ; [.1C60.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER B WITH DOT BELOW +1E07 ; [.1C60.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER B WITH LINE BELOW +1E06 ; [.1C60.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER B WITH LINE BELOW +3374 ; [.1C60.0020.001C][.1C47.0020.001C][.1E33.0020.001C] # SQUARE BAR +33C3 ; [.1C60.0020.001D][.1E21.0020.001C] # SQUARE BQ +0299 ; [.1C64.0020.0002] # LATIN LETTER SMALL CAPITAL B +0180 ; [.1C68.0020.0002] # LATIN SMALL LETTER B WITH STROKE +0243 ; [.1C68.0020.0008] # LATIN CAPITAL LETTER B WITH STROKE +1D2F ; [.1C6C.0020.0002] # MODIFIER LETTER CAPITAL BARRED B +1D03 ; [.1C6D.0020.0002] # LATIN LETTER SMALL CAPITAL BARRED B +1D6C ; [.1C6E.0020.0002] # LATIN SMALL LETTER B WITH MIDDLE TILDE +A797 ; [.1C6F.0020.0002] # LATIN SMALL LETTER B WITH FLOURISH +A796 ; [.1C6F.0020.0008] # LATIN CAPITAL LETTER B WITH FLOURISH +1D80 ; [.1C70.0020.0002] # LATIN SMALL LETTER B WITH PALATAL HOOK +0253 ; [.1C71.0020.0002] # LATIN SMALL LETTER B WITH HOOK +0181 ; [.1C71.0020.0008] # LATIN CAPITAL LETTER B WITH HOOK +0183 ; [.1C75.0020.0002] # LATIN SMALL LETTER B WITH TOPBAR +0182 ; [.1C75.0020.0008] # LATIN CAPITAL LETTER B WITH TOPBAR +A7B5 ; [.1C79.0020.0002] # LATIN SMALL LETTER BETA +1DE9 ; [.1C79.0020.0004] # COMBINING LATIN SMALL LETTER BETA +A7B4 ; [.1C79.0020.0008] # LATIN CAPITAL LETTER BETA +0063 ; [.1C7A.0020.0002] # LATIN SMALL LETTER C +FF43 ; [.1C7A.0020.0003] # FULLWIDTH LATIN SMALL LETTER C +0368 ; [.1C7A.0020.0004] # COMBINING LATIN SMALL LETTER C +217D ; [.1C7A.0020.0004] # SMALL ROMAN NUMERAL ONE HUNDRED +249E ; [*0317.0020.0004][.1C7A.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER C +1D41C ; [.1C7A.0020.0005] # MATHEMATICAL BOLD SMALL C +1D450 ; [.1C7A.0020.0005] # MATHEMATICAL ITALIC SMALL C +1D484 ; [.1C7A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL C +1D4B8 ; [.1C7A.0020.0005] # MATHEMATICAL SCRIPT SMALL C +1D4EC ; [.1C7A.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL C +1D520 ; [.1C7A.0020.0005] # MATHEMATICAL FRAKTUR SMALL C +1D554 ; [.1C7A.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL C +1D588 ; [.1C7A.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL C +1D5BC ; [.1C7A.0020.0005] # MATHEMATICAL SANS-SERIF SMALL C +1D5F0 ; [.1C7A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL C +1D624 ; [.1C7A.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D658 ; [.1C7A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D68C ; [.1C7A.0020.0005] # MATHEMATICAL MONOSPACE SMALL C +24D2 ; [.1C7A.0020.0006] # CIRCLED LATIN SMALL LETTER C +0043 ; [.1C7A.0020.0008] # LATIN CAPITAL LETTER C +FF23 ; [.1C7A.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER C +2103 ; [*04F6.0020.0004][.1C7A.0020.000A] # DEGREE CELSIUS +216D ; [.1C7A.0020.000A] # ROMAN NUMERAL ONE HUNDRED +1F112 ; [*0317.0020.0004][.1C7A.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER C +2102 ; [.1C7A.0020.000B] # DOUBLE-STRUCK CAPITAL C +212D ; [.1C7A.0020.000B] # BLACK-LETTER CAPITAL C +1D402 ; [.1C7A.0020.000B] # MATHEMATICAL BOLD CAPITAL C +1D436 ; [.1C7A.0020.000B] # MATHEMATICAL ITALIC CAPITAL C +1D46A ; [.1C7A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL C +1D49E ; [.1C7A.0020.000B] # MATHEMATICAL SCRIPT CAPITAL C +1D4D2 ; [.1C7A.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL C +1D56E ; [.1C7A.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D5A2 ; [.1C7A.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL C +1D5D6 ; [.1C7A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D60A ; [.1C7A.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D63E ; [.1C7A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D672 ; [.1C7A.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL C +24B8 ; [.1C7A.0020.000C] # CIRCLED LATIN CAPITAL LETTER C +1F12B ; [.1C7A.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER C +1F152 ; [.1C7A.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER C +1D9C ; [.1C7A.0020.0014] # MODIFIER LETTER SMALL C +1F132 ; [.1C7A.0020.001D] # SQUARED LATIN CAPITAL LETTER C +1F172 ; [.1C7A.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER C +0107 ; [.1C7A.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH ACUTE +0106 ; [.1C7A.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH ACUTE +0109 ; [.1C7A.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER C WITH CIRCUMFLEX +0108 ; [.1C7A.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010D ; [.1C7A.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER C WITH CARON +010C ; [.1C7A.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER C WITH CARON +010B ; [.1C7A.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER C WITH DOT ABOVE +010A ; [.1C7A.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER C WITH DOT ABOVE +00E7 ; [.1C7A.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER C WITH CEDILLA +1DD7 ; [.1C7A.0020.0004][.0000.0030.0004] # COMBINING LATIN SMALL LETTER C CEDILLA +00C7 ; [.1C7A.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER C WITH CEDILLA +1E09 ; [.1C7A.0020.0002][.0000.0030.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E08 ; [.1C7A.0020.0008][.0000.0030.0002][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +3388 ; [.1C7A.0020.001C][.1C47.0020.001C][.1D77.0020.001C] # SQUARE CAL +33C4 ; [.1C7A.0020.001C][.1C7A.0020.001C] # SQUARE CC +1F12D ; [.1C7A.0020.000C][.1C8F.0020.000C] # CIRCLED CD +33C5 ; [.1C7A.0020.001C][.1C8F.0020.001C] # SQUARE CD +33C6 ; [.1C7A.0020.001D][*0625.0020.001C][.1D65.0020.001C][.1CF4.0020.001C] # SQUARE C OVER KG +1F191 ; [.1C7A.0020.001D][.1D77.0020.001D] # SQUARED CL +339D ; [.1C7A.0020.001C][.1DAA.0020.001C] # SQUARE CM +33A0 ; [.1C7A.0020.001C][.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE CM SQUARED +33A4 ; [.1C7A.0020.001C][.1DAA.0020.001C][.1C40.0020.001C] # SQUARE CM CUBED +2105 ; [.1C7A.0020.0004][*0394.0020.0004][.1DDD.0020.0004] # CARE OF +33C7 ; [.1C7A.0020.001D][.1DDD.0020.001C][*0277.0020.001C] # SQUARE CO +1F192 ; [.1C7A.0020.001D][.1DDD.0020.001D][.1DDD.0020.001D][.1D77.0020.001D] # SQUARED COOL +2106 ; [.1C7A.0020.0004][*0394.0020.0004][.1EB5.0020.0004] # CADA UNA +1D04 ; [.1C7E.0020.0002] # LATIN LETTER SMALL CAPITAL C +023C ; [.1C7F.0020.0002] # LATIN SMALL LETTER C WITH STROKE +023B ; [.1C7F.0020.0008] # LATIN CAPITAL LETTER C WITH STROKE +A793 ; [.1C83.0020.0002] # LATIN SMALL LETTER C WITH BAR +A792 ; [.1C83.0020.0008] # LATIN CAPITAL LETTER C WITH BAR +A794 ; [.1C84.0020.0002] # LATIN SMALL LETTER C WITH PALATAL HOOK +0188 ; [.1C85.0020.0002] # LATIN SMALL LETTER C WITH HOOK +0187 ; [.1C85.0020.0008] # LATIN CAPITAL LETTER C WITH HOOK +0255 ; [.1C89.0020.0002] # LATIN SMALL LETTER C WITH CURL +1D9D ; [.1C89.0020.0014] # MODIFIER LETTER SMALL C WITH CURL +2184 ; [.1C8D.0020.0002] # LATIN SMALL LETTER REVERSED C +2183 ; [.1C8D.0020.0008] # ROMAN NUMERAL REVERSED ONE HUNDRED +A73F ; [.1C8E.0020.0002] # LATIN SMALL LETTER REVERSED C WITH DOT +A73E ; [.1C8E.0020.0008] # LATIN CAPITAL LETTER REVERSED C WITH DOT +0064 ; [.1C8F.0020.0002] # LATIN SMALL LETTER D +FF44 ; [.1C8F.0020.0003] # FULLWIDTH LATIN SMALL LETTER D +0369 ; [.1C8F.0020.0004] # COMBINING LATIN SMALL LETTER D +217E ; [.1C8F.0020.0004] # SMALL ROMAN NUMERAL FIVE HUNDRED +249F ; [*0317.0020.0004][.1C8F.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER D +2146 ; [.1C8F.0020.0005] # DOUBLE-STRUCK ITALIC SMALL D +1D41D ; [.1C8F.0020.0005] # MATHEMATICAL BOLD SMALL D +1D451 ; [.1C8F.0020.0005] # MATHEMATICAL ITALIC SMALL D +1D485 ; [.1C8F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL D +1D4B9 ; [.1C8F.0020.0005] # MATHEMATICAL SCRIPT SMALL D +1D4ED ; [.1C8F.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL D +1D521 ; [.1C8F.0020.0005] # MATHEMATICAL FRAKTUR SMALL D +1D555 ; [.1C8F.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL D +1D589 ; [.1C8F.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL D +1D5BD ; [.1C8F.0020.0005] # MATHEMATICAL SANS-SERIF SMALL D +1D5F1 ; [.1C8F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL D +1D625 ; [.1C8F.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D659 ; [.1C8F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D68D ; [.1C8F.0020.0005] # MATHEMATICAL MONOSPACE SMALL D +24D3 ; [.1C8F.0020.0006] # CIRCLED LATIN SMALL LETTER D +0044 ; [.1C8F.0020.0008] # LATIN CAPITAL LETTER D +FF24 ; [.1C8F.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER D +216E ; [.1C8F.0020.000A] # ROMAN NUMERAL FIVE HUNDRED +1F113 ; [*0317.0020.0004][.1C8F.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER D +2145 ; [.1C8F.0020.000B] # DOUBLE-STRUCK ITALIC CAPITAL D +1D403 ; [.1C8F.0020.000B] # MATHEMATICAL BOLD CAPITAL D +1D437 ; [.1C8F.0020.000B] # MATHEMATICAL ITALIC CAPITAL D +1D46B ; [.1C8F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL D +1D49F ; [.1C8F.0020.000B] # MATHEMATICAL SCRIPT CAPITAL D +1D4D3 ; [.1C8F.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL D +1D507 ; [.1C8F.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL D +1D53B ; [.1C8F.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D56F ; [.1C8F.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D5A3 ; [.1C8F.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL D +1D5D7 ; [.1C8F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D60B ; [.1C8F.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D63F ; [.1C8F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D673 ; [.1C8F.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL D +24B9 ; [.1C8F.0020.000C] # CIRCLED LATIN CAPITAL LETTER D +1F153 ; [.1C8F.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER D +1D48 ; [.1C8F.0020.0014] # MODIFIER LETTER SMALL D +1F1A5 ; [.1C8F.0020.001C] # SQUARED LATIN SMALL LETTER D +1D30 ; [.1C8F.0020.001D] # MODIFIER LETTER CAPITAL D +1F133 ; [.1C8F.0020.001D] # SQUARED LATIN CAPITAL LETTER D +1F173 ; [.1C8F.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER D +010F ; [.1C8F.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER D WITH CARON +010E ; [.1C8F.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER D WITH CARON +1E0B ; [.1C8F.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER D WITH DOT ABOVE +1E0A ; [.1C8F.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E11 ; [.1C8F.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER D WITH CEDILLA +1E10 ; [.1C8F.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER D WITH CEDILLA +0111 ; [.1C8F.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER D WITH STROKE +0110 ; [.1C8F.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER D WITH STROKE +1E0D ; [.1C8F.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER D WITH DOT BELOW +1E0C ; [.1C8F.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER D WITH DOT BELOW +1E13 ; [.1C8F.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E12 ; [.1C8F.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E0F ; [.1C8F.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER D WITH LINE BELOW +1E0E ; [.1C8F.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER D WITH LINE BELOW +00F0 ; [.1C8F.0020.0004][.0000.0110.0004] # LATIN SMALL LETTER ETH +1DD9 ; [.1C8F.0020.0004][.0000.0110.0004] # COMBINING LATIN SMALL LETTER ETH +00D0 ; [.1C8F.0020.000A][.0000.0110.0004] # LATIN CAPITAL LETTER ETH +1D9E ; [.1C8F.0020.0014][.0000.0110.0014] # MODIFIER LETTER SMALL ETH +1DD8 ; [.1C8F.0020.0004][.0000.0111.0004] # COMBINING LATIN SMALL LETTER INSULAR D +A77A ; [.1C8F.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR D +A779 ; [.1C8F.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR D +3372 ; [.1C8F.0020.001C][.1C47.0020.001C] # SQUARE DA +0238 ; [.1C8F.0020.0004][.1C60.0020.0004] # LATIN SMALL LETTER DB DIGRAPH +33C8 ; [.1C8F.0020.001C][.1C60.0020.001D] # SQUARE DB +1F190 ; [.1C8F.0020.001D][.1D4C.0020.001D] # SQUARE DJ +3397 ; [.1C8F.0020.001C][.1D77.0020.001C] # SQUARE DL +3377 ; [.1C8F.0020.001C][.1DAA.0020.001C] # SQUARE DM +3378 ; [.1C8F.0020.001C][.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE DM SQUARED +3379 ; [.1C8F.0020.001C][.1DAA.0020.001C][.1C40.0020.001C] # SQUARE DM CUBED +01F3 ; [.1C8F.0020.0004][.1F21.0020.0004] # LATIN SMALL LETTER DZ +02A3 ; [.1C8F.0020.0004][.1F21.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH +01F2 ; [.1C8F.0020.000A][.1F21.0020.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F1 ; [.1C8F.0020.000A][.1F21.0020.000A] # LATIN CAPITAL LETTER DZ +01C6 ; [.1C8F.0020.0004][.1F21.0020.0004][.0000.0028.0004] # LATIN SMALL LETTER DZ WITH CARON +01C5 ; [.1C8F.0020.000A][.1F21.0020.0004][.0000.0028.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C4 ; [.1C8F.0020.000A][.1F21.0020.000A][.0000.0028.0004] # LATIN CAPITAL LETTER DZ WITH CARON +02A5 ; [.1C8F.0020.0004][.1F34.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL +02A4 ; [.1C8F.0020.0004][.1F3E.0020.0004] # LATIN SMALL LETTER DEZH DIGRAPH +1D05 ; [.1C93.0020.0002] # LATIN LETTER SMALL CAPITAL D +1D06 ; [.1C94.0020.0002] # LATIN LETTER SMALL CAPITAL ETH +1D6D ; [.1C95.0020.0002] # LATIN SMALL LETTER D WITH MIDDLE TILDE +1D81 ; [.1C96.0020.0002] # LATIN SMALL LETTER D WITH PALATAL HOOK +0256 ; [.1C97.0020.0002] # LATIN SMALL LETTER D WITH TAIL +0189 ; [.1C97.0020.0008] # LATIN CAPITAL LETTER AFRICAN D +0257 ; [.1C9B.0020.0002] # LATIN SMALL LETTER D WITH HOOK +018A ; [.1C9B.0020.0008] # LATIN CAPITAL LETTER D WITH HOOK +1D91 ; [.1C9F.0020.0002] # LATIN SMALL LETTER D WITH HOOK AND TAIL +018C ; [.1CA0.0020.0002] # LATIN SMALL LETTER D WITH TOPBAR +018B ; [.1CA0.0020.0008] # LATIN CAPITAL LETTER D WITH TOPBAR +0221 ; [.1CA4.0020.0002] # LATIN SMALL LETTER D WITH CURL +A771 ; [.1CA8.0020.0002] # LATIN SMALL LETTER DUM +1E9F ; [.1CA9.0020.0002] # LATIN SMALL LETTER DELTA +0065 ; [.1CAA.0020.0002] # LATIN SMALL LETTER E +FF45 ; [.1CAA.0020.0003] # FULLWIDTH LATIN SMALL LETTER E +0364 ; [.1CAA.0020.0004] # COMBINING LATIN SMALL LETTER E +24A0 ; [*0317.0020.0004][.1CAA.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER E +212F ; [.1CAA.0020.0005] # SCRIPT SMALL E +2147 ; [.1CAA.0020.0005] # DOUBLE-STRUCK ITALIC SMALL E +1D41E ; [.1CAA.0020.0005] # MATHEMATICAL BOLD SMALL E +1D452 ; [.1CAA.0020.0005] # MATHEMATICAL ITALIC SMALL E +1D486 ; [.1CAA.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL E +1D4EE ; [.1CAA.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL E +1D522 ; [.1CAA.0020.0005] # MATHEMATICAL FRAKTUR SMALL E +1D556 ; [.1CAA.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL E +1D58A ; [.1CAA.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL E +1D5BE ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF SMALL E +1D5F2 ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL E +1D626 ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D65A ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D68E ; [.1CAA.0020.0005] # MATHEMATICAL MONOSPACE SMALL E +24D4 ; [.1CAA.0020.0006] # CIRCLED LATIN SMALL LETTER E +0045 ; [.1CAA.0020.0008] # LATIN CAPITAL LETTER E +FF25 ; [.1CAA.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER E +1F114 ; [*0317.0020.0004][.1CAA.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER E +2130 ; [.1CAA.0020.000B] # SCRIPT CAPITAL E +1D404 ; [.1CAA.0020.000B] # MATHEMATICAL BOLD CAPITAL E +1D438 ; [.1CAA.0020.000B] # MATHEMATICAL ITALIC CAPITAL E +1D46C ; [.1CAA.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL E +1D4D4 ; [.1CAA.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL E +1D508 ; [.1CAA.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL E +1D53C ; [.1CAA.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D570 ; [.1CAA.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D5A4 ; [.1CAA.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL E +1D5D8 ; [.1CAA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D60C ; [.1CAA.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D640 ; [.1CAA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D674 ; [.1CAA.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL E +24BA ; [.1CAA.0020.000C] # CIRCLED LATIN CAPITAL LETTER E +1F154 ; [.1CAA.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER E +1D49 ; [.1CAA.0020.0014] # MODIFIER LETTER SMALL E +2091 ; [.1CAA.0020.0015] # LATIN SUBSCRIPT SMALL LETTER E +1D31 ; [.1CAA.0020.001D] # MODIFIER LETTER CAPITAL E +1F134 ; [.1CAA.0020.001D] # SQUARED LATIN CAPITAL LETTER E +1F174 ; [.1CAA.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER E +00E9 ; [.1CAA.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH ACUTE +00C9 ; [.1CAA.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH ACUTE +00E8 ; [.1CAA.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH GRAVE +00C8 ; [.1CAA.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH GRAVE +0115 ; [.1CAA.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH BREVE +0114 ; [.1CAA.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH BREVE +00EA ; [.1CAA.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX +00CA ; [.1CAA.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +1EBF ; [.1CAA.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBE ; [.1CAA.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC1 ; [.1CAA.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC0 ; [.1CAA.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC5 ; [.1CAA.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC4 ; [.1CAA.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC3 ; [.1CAA.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC2 ; [.1CAA.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +011B ; [.1CAA.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER E WITH CARON +011A ; [.1CAA.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER E WITH CARON +00EB ; [.1CAA.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER E WITH DIAERESIS +00CB ; [.1CAA.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER E WITH DIAERESIS +1EBD ; [.1CAA.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH TILDE +1EBC ; [.1CAA.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH TILDE +0117 ; [.1CAA.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER E WITH DOT ABOVE +0116 ; [.1CAA.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER E WITH DOT ABOVE +0229 ; [.1CAA.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER E WITH CEDILLA +0228 ; [.1CAA.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER E WITH CEDILLA +1E1D ; [.1CAA.0020.0002][.0000.0030.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1C ; [.1CAA.0020.0008][.0000.0030.0002][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +0119 ; [.1CAA.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER E WITH OGONEK +0118 ; [.1CAA.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER E WITH OGONEK +0113 ; [.1CAA.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER E WITH MACRON +0112 ; [.1CAA.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER E WITH MACRON +1E17 ; [.1CAA.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E16 ; [.1CAA.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E15 ; [.1CAA.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E14 ; [.1CAA.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1EBB ; [.1CAA.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH HOOK ABOVE +1EBA ; [.1CAA.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH HOOK ABOVE +0205 ; [.1CAA.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER E WITH DOUBLE GRAVE +0204 ; [.1CAA.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0207 ; [.1CAA.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER E WITH INVERTED BREVE +0206 ; [.1CAA.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER E WITH INVERTED BREVE +1EB9 ; [.1CAA.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER E WITH DOT BELOW +1EB8 ; [.1CAA.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER E WITH DOT BELOW +1EC7 ; [.1CAA.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC6 ; [.1CAA.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1E19 ; [.1CAA.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E18 ; [.1CAA.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1B ; [.1CAA.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER E WITH TILDE BELOW +1E1A ; [.1CAA.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER E WITH TILDE BELOW +32CD ; [.1CAA.0020.001C][.1E33.0020.001C][.1CF4.0020.001C] # SQUARE ERG +32CE ; [.1CAA.0020.001C][.1EE3.0020.001D] # SQUARE EV +1D07 ; [.1CAE.0020.0002] # LATIN LETTER SMALL CAPITAL E +AB32 ; [.1CAF.0020.0002] # LATIN SMALL LETTER BLACKLETTER E +AB33 ; [.1CB0.0020.0002] # LATIN SMALL LETTER BARRED E +0247 ; [.1CB1.0020.0002] # LATIN SMALL LETTER E WITH STROKE +0246 ; [.1CB1.0020.0008] # LATIN CAPITAL LETTER E WITH STROKE +1D92 ; [.1CB5.0020.0002] # LATIN SMALL LETTER E WITH RETROFLEX HOOK +AB34 ; [.1CB6.0020.0002] # LATIN SMALL LETTER E WITH FLOURISH +2C78 ; [.1CB7.0020.0002] # LATIN SMALL LETTER E WITH NOTCH +01DD ; [.1CB8.0020.0002] # LATIN SMALL LETTER TURNED E +018E ; [.1CB8.0020.0008] # LATIN CAPITAL LETTER REVERSED E +1D32 ; [.1CB8.0020.001D] # MODIFIER LETTER CAPITAL REVERSED E +2C7B ; [.1CBC.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED E +0259 ; [.1CBD.0020.0002] # LATIN SMALL LETTER SCHWA +1DEA ; [.1CBD.0020.0004] # COMBINING LATIN SMALL LETTER SCHWA +018F ; [.1CBD.0020.0008] # LATIN CAPITAL LETTER SCHWA +1D4A ; [.1CBD.0020.0014] # MODIFIER LETTER SMALL SCHWA +2094 ; [.1CBD.0020.0015] # LATIN SUBSCRIPT SMALL LETTER SCHWA +1D95 ; [.1CC1.0020.0002] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK +025B ; [.1CC2.0020.0002] # LATIN SMALL LETTER OPEN E +0190 ; [.1CC2.0020.0008] # LATIN CAPITAL LETTER OPEN E +2107 ; [.1CC2.0020.000A] # EULER CONSTANT +1D4B ; [.1CC2.0020.0014] # MODIFIER LETTER SMALL OPEN E +1D93 ; [.1CC6.0020.0002] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK +0258 ; [.1CC7.0020.0002] # LATIN SMALL LETTER REVERSED E +025A ; [.1CCB.0020.0002] # LATIN SMALL LETTER SCHWA WITH HOOK +025C ; [.1CCF.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E +A7AB ; [.1CCF.0020.0008] # LATIN CAPITAL LETTER REVERSED OPEN E +1D9F ; [.1CCF.0020.0014] # MODIFIER LETTER SMALL REVERSED OPEN E +1D94 ; [.1CD3.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK +1D08 ; [.1CD4.0020.0002] # LATIN SMALL LETTER TURNED OPEN E +1D4C ; [.1CD4.0020.0014] # MODIFIER LETTER SMALL TURNED OPEN E +025D ; [.1CD5.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK +025E ; [.1CD9.0020.0002] # LATIN SMALL LETTER CLOSED REVERSED OPEN E +029A ; [.1CDD.0020.0002] # LATIN SMALL LETTER CLOSED OPEN E +0264 ; [.1CE1.0020.0002] # LATIN SMALL LETTER RAMS HORN +0066 ; [.1CE5.0020.0002] # LATIN SMALL LETTER F +FF46 ; [.1CE5.0020.0003] # FULLWIDTH LATIN SMALL LETTER F +1DEB ; [.1CE5.0020.0004] # COMBINING LATIN SMALL LETTER F +24A1 ; [*0317.0020.0004][.1CE5.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER F +1D41F ; [.1CE5.0020.0005] # MATHEMATICAL BOLD SMALL F +1D453 ; [.1CE5.0020.0005] # MATHEMATICAL ITALIC SMALL F +1D487 ; [.1CE5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL F +1D4BB ; [.1CE5.0020.0005] # MATHEMATICAL SCRIPT SMALL F +1D4EF ; [.1CE5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL F +1D523 ; [.1CE5.0020.0005] # MATHEMATICAL FRAKTUR SMALL F +1D557 ; [.1CE5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL F +1D58B ; [.1CE5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL F +1D5BF ; [.1CE5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL F +1D5F3 ; [.1CE5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL F +1D627 ; [.1CE5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D65B ; [.1CE5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D68F ; [.1CE5.0020.0005] # MATHEMATICAL MONOSPACE SMALL F +24D5 ; [.1CE5.0020.0006] # CIRCLED LATIN SMALL LETTER F +0046 ; [.1CE5.0020.0008] # LATIN CAPITAL LETTER F +FF26 ; [.1CE5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER F +2109 ; [*04F6.0020.0004][.1CE5.0020.000A] # DEGREE FAHRENHEIT +1F115 ; [*0317.0020.0004][.1CE5.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER F +2131 ; [.1CE5.0020.000B] # SCRIPT CAPITAL F +1D405 ; [.1CE5.0020.000B] # MATHEMATICAL BOLD CAPITAL F +1D439 ; [.1CE5.0020.000B] # MATHEMATICAL ITALIC CAPITAL F +1D46D ; [.1CE5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL F +1D4D5 ; [.1CE5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL F +1D509 ; [.1CE5.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL F +1D53D ; [.1CE5.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D571 ; [.1CE5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D5A5 ; [.1CE5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL F +1D5D9 ; [.1CE5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D60D ; [.1CE5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D641 ; [.1CE5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D675 ; [.1CE5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL F +24BB ; [.1CE5.0020.000C] # CIRCLED LATIN CAPITAL LETTER F +1F155 ; [.1CE5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER F +1DA0 ; [.1CE5.0020.0014] # MODIFIER LETTER SMALL F +1F135 ; [.1CE5.0020.001D] # SQUARED LATIN CAPITAL LETTER F +1F175 ; [.1CE5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER F +1E1F ; [.1CE5.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER F WITH DOT ABOVE +1E1E ; [.1CE5.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER F WITH DOT ABOVE +A77C ; [.1CE5.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR F +A77B ; [.1CE5.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR F +213B ; [.1CE5.0020.000A][.1C47.0020.000A][.1EFF.0020.000A] # FACSIMILE SIGN +FB00 ; [.1CE5.0020.0004][.1CE5.0020.0004] # LATIN SMALL LIGATURE FF +FB03 ; [.1CE5.0020.0004][.1CE5.0020.0004][.1D32.0020.0004] # LATIN SMALL LIGATURE FFI +FB04 ; [.1CE5.0020.0004][.1CE5.0020.0004][.1D77.0020.0004] # LATIN SMALL LIGATURE FFL +FB01 ; [.1CE5.0020.0004][.1D32.0020.0004] # LATIN SMALL LIGATURE FI +FB02 ; [.1CE5.0020.0004][.1D77.0020.0004] # LATIN SMALL LIGATURE FL +3399 ; [.1CE5.0020.001C][.1DAA.0020.001C] # SQUARE FM +02A9 ; [.1CE5.0020.0004][.1DD8.0020.0004] # LATIN SMALL LETTER FENG DIGRAPH +1F193 ; [.1CE5.0020.001D][.1E33.0020.001D][.1CAA.0020.001D][.1CAA.0020.001D] # SQUARED FREE +A730 ; [.1CE9.0020.0002] # LATIN LETTER SMALL CAPITAL F +AB35 ; [.1CEA.0020.0002] # LATIN SMALL LETTER LENIS F +A799 ; [.1CEB.0020.0002] # LATIN SMALL LETTER F WITH STROKE +A798 ; [.1CEB.0020.0008] # LATIN CAPITAL LETTER F WITH STROKE +1D6E ; [.1CEC.0020.0002] # LATIN SMALL LETTER F WITH MIDDLE TILDE +1D82 ; [.1CED.0020.0002] # LATIN SMALL LETTER F WITH PALATAL HOOK +0192 ; [.1CEE.0020.0002] # LATIN SMALL LETTER F WITH HOOK +0191 ; [.1CEE.0020.0008] # LATIN CAPITAL LETTER F WITH HOOK +214E ; [.1CF2.0020.0002] # TURNED SMALL F +2132 ; [.1CF2.0020.0008] # TURNED CAPITAL F +A7FB ; [.1CF3.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED F +0067 ; [.1CF4.0020.0002] # LATIN SMALL LETTER G +FF47 ; [.1CF4.0020.0003] # FULLWIDTH LATIN SMALL LETTER G +1DDA ; [.1CF4.0020.0004] # COMBINING LATIN SMALL LETTER G +24A2 ; [*0317.0020.0004][.1CF4.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER G +210A ; [.1CF4.0020.0005] # SCRIPT SMALL G +1D420 ; [.1CF4.0020.0005] # MATHEMATICAL BOLD SMALL G +1D454 ; [.1CF4.0020.0005] # MATHEMATICAL ITALIC SMALL G +1D488 ; [.1CF4.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL G +1D4F0 ; [.1CF4.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL G +1D524 ; [.1CF4.0020.0005] # MATHEMATICAL FRAKTUR SMALL G +1D558 ; [.1CF4.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL G +1D58C ; [.1CF4.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL G +1D5C0 ; [.1CF4.0020.0005] # MATHEMATICAL SANS-SERIF SMALL G +1D5F4 ; [.1CF4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL G +1D628 ; [.1CF4.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D65C ; [.1CF4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D690 ; [.1CF4.0020.0005] # MATHEMATICAL MONOSPACE SMALL G +24D6 ; [.1CF4.0020.0006] # CIRCLED LATIN SMALL LETTER G +0047 ; [.1CF4.0020.0008] # LATIN CAPITAL LETTER G +FF27 ; [.1CF4.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER G +1F116 ; [*0317.0020.0004][.1CF4.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER G +1D406 ; [.1CF4.0020.000B] # MATHEMATICAL BOLD CAPITAL G +1D43A ; [.1CF4.0020.000B] # MATHEMATICAL ITALIC CAPITAL G +1D46E ; [.1CF4.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL G +1D4A2 ; [.1CF4.0020.000B] # MATHEMATICAL SCRIPT CAPITAL G +1D4D6 ; [.1CF4.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL G +1D50A ; [.1CF4.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL G +1D53E ; [.1CF4.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D572 ; [.1CF4.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D5A6 ; [.1CF4.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL G +1D5DA ; [.1CF4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D60E ; [.1CF4.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D642 ; [.1CF4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D676 ; [.1CF4.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL G +24BC ; [.1CF4.0020.000C] # CIRCLED LATIN CAPITAL LETTER G +1F156 ; [.1CF4.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER G +1D4D ; [.1CF4.0020.0014] # MODIFIER LETTER SMALL G +1D33 ; [.1CF4.0020.001D] # MODIFIER LETTER CAPITAL G +1F136 ; [.1CF4.0020.001D] # SQUARED LATIN CAPITAL LETTER G +1F176 ; [.1CF4.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER G +01F5 ; [.1CF4.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER G WITH ACUTE +01F4 ; [.1CF4.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER G WITH ACUTE +011F ; [.1CF4.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER G WITH BREVE +011E ; [.1CF4.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER G WITH BREVE +011D ; [.1CF4.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER G WITH CIRCUMFLEX +011C ; [.1CF4.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +01E7 ; [.1CF4.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER G WITH CARON +01E6 ; [.1CF4.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER G WITH CARON +0121 ; [.1CF4.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER G WITH DOT ABOVE +0120 ; [.1CF4.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER G WITH DOT ABOVE +0123 ; [.1CF4.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER G WITH CEDILLA +0122 ; [.1CF4.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER G WITH CEDILLA +1E21 ; [.1CF4.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER G WITH MACRON +1E20 ; [.1CF4.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER G WITH MACRON +A7A1 ; [.1CF4.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER G WITH OBLIQUE STROKE +A7A0 ; [.1CF4.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +1D79 ; [.1CF4.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR G +A77D ; [.1CF4.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR G +33FF ; [.1CF4.0020.001C][.1C47.0020.001C][.1D77.0020.001C] # SQUARE GAL +3387 ; [.1CF4.0020.001D][.1C60.0020.001D] # SQUARE GB +3393 ; [.1CF4.0020.001D][.1D18.0020.001D][.1F21.0020.001C] # SQUARE GHZ +33AC ; [.1CF4.0020.001D][.1E0C.0020.001D][.1C47.0020.001C] # SQUARE GPA +33C9 ; [.1CF4.0020.001D][.1F0B.0020.001C] # SQUARE GY +0261 ; [.1CF8.0020.0002] # LATIN SMALL LETTER SCRIPT G +A7AC ; [.1CF8.0020.0008] # LATIN CAPITAL LETTER SCRIPT G +1DA2 ; [.1CF8.0020.0014] # MODIFIER LETTER SMALL SCRIPT G +AB36 ; [.1CFC.0020.0002] # LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL +0262 ; [.1CFD.0020.0002] # LATIN LETTER SMALL CAPITAL G +1DDB ; [.1CFD.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL G +01E5 ; [.1D01.0020.0002] # LATIN SMALL LETTER G WITH STROKE +01E4 ; [.1D01.0020.0008] # LATIN CAPITAL LETTER G WITH STROKE +1D83 ; [.1D05.0020.0002] # LATIN SMALL LETTER G WITH PALATAL HOOK +0260 ; [.1D06.0020.0002] # LATIN SMALL LETTER G WITH HOOK +0193 ; [.1D06.0020.0008] # LATIN CAPITAL LETTER G WITH HOOK +029B ; [.1D0A.0020.0002] # LATIN LETTER SMALL CAPITAL G WITH HOOK +1D77 ; [.1D0E.0020.0002] # LATIN SMALL LETTER TURNED G +A77F ; [.1D0F.0020.0002] # LATIN SMALL LETTER TURNED INSULAR G +A77E ; [.1D0F.0020.0008] # LATIN CAPITAL LETTER TURNED INSULAR G +0263 ; [.1D10.0020.0002] # LATIN SMALL LETTER GAMMA +0194 ; [.1D10.0020.0008] # LATIN CAPITAL LETTER GAMMA +02E0 ; [.1D10.0020.0014] # MODIFIER LETTER SMALL GAMMA +01A3 ; [.1D14.0020.0002] # LATIN SMALL LETTER OI +01A2 ; [.1D14.0020.0008] # LATIN CAPITAL LETTER OI +0068 ; [.1D18.0020.0002] # LATIN SMALL LETTER H +FF48 ; [.1D18.0020.0003] # FULLWIDTH LATIN SMALL LETTER H +036A ; [.1D18.0020.0004] # COMBINING LATIN SMALL LETTER H +24A3 ; [*0317.0020.0004][.1D18.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER H +210E ; [.1D18.0020.0005] # PLANCK CONSTANT +1D421 ; [.1D18.0020.0005] # MATHEMATICAL BOLD SMALL H +1D489 ; [.1D18.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL H +1D4BD ; [.1D18.0020.0005] # MATHEMATICAL SCRIPT SMALL H +1D4F1 ; [.1D18.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL H +1D525 ; [.1D18.0020.0005] # MATHEMATICAL FRAKTUR SMALL H +1D559 ; [.1D18.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL H +1D58D ; [.1D18.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL H +1D5C1 ; [.1D18.0020.0005] # MATHEMATICAL SANS-SERIF SMALL H +1D5F5 ; [.1D18.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL H +1D629 ; [.1D18.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D65D ; [.1D18.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D691 ; [.1D18.0020.0005] # MATHEMATICAL MONOSPACE SMALL H +24D7 ; [.1D18.0020.0006] # CIRCLED LATIN SMALL LETTER H +0048 ; [.1D18.0020.0008] # LATIN CAPITAL LETTER H +FF28 ; [.1D18.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER H +1F117 ; [*0317.0020.0004][.1D18.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER H +210B ; [.1D18.0020.000B] # SCRIPT CAPITAL H +210C ; [.1D18.0020.000B] # BLACK-LETTER CAPITAL H +210D ; [.1D18.0020.000B] # DOUBLE-STRUCK CAPITAL H +1D407 ; [.1D18.0020.000B] # MATHEMATICAL BOLD CAPITAL H +1D43B ; [.1D18.0020.000B] # MATHEMATICAL ITALIC CAPITAL H +1D46F ; [.1D18.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL H +1D4D7 ; [.1D18.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL H +1D573 ; [.1D18.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D5A7 ; [.1D18.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL H +1D5DB ; [.1D18.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D60F ; [.1D18.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D643 ; [.1D18.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D677 ; [.1D18.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL H +24BD ; [.1D18.0020.000C] # CIRCLED LATIN CAPITAL LETTER H +1F157 ; [.1D18.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H +02B0 ; [.1D18.0020.0014] # MODIFIER LETTER SMALL H +2095 ; [.1D18.0020.0015] # LATIN SUBSCRIPT SMALL LETTER H +1D34 ; [.1D18.0020.001D] # MODIFIER LETTER CAPITAL H +1F137 ; [.1D18.0020.001D] # SQUARED LATIN CAPITAL LETTER H +1F177 ; [.1D18.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER H +0125 ; [.1D18.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER H WITH CIRCUMFLEX +0124 ; [.1D18.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +021F ; [.1D18.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER H WITH CARON +021E ; [.1D18.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER H WITH CARON +1E27 ; [.1D18.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER H WITH DIAERESIS +1E26 ; [.1D18.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER H WITH DIAERESIS +1E23 ; [.1D18.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER H WITH DOT ABOVE +1E22 ; [.1D18.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E29 ; [.1D18.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER H WITH CEDILLA +1E28 ; [.1D18.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER H WITH CEDILLA +0127 ; [.1D18.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER H WITH STROKE +210F ; [.1D18.0020.0002][.0000.0039.0002] # PLANCK CONSTANT OVER TWO PI +0126 ; [.1D18.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER H WITH STROKE +A7F8 ; [.1D18.0020.0014][.0000.0039.0014] # MODIFIER LETTER CAPITAL H WITH STROKE +1E25 ; [.1D18.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER H WITH DOT BELOW +1E24 ; [.1D18.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER H WITH DOT BELOW +1E2B ; [.1D18.0020.0002][.0000.0047.0002] # LATIN SMALL LETTER H WITH BREVE BELOW +1E2A ; [.1D18.0020.0008][.0000.0047.0002] # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E96 ; [.1D18.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER H WITH LINE BELOW +33CA ; [.1D18.0020.001C][.1C47.0020.001C] # SQUARE HA +1F1A6 ; [.1D18.0020.001D][.1C7A.0020.001C] # SQUARED HC +1F1A7 ; [.1D18.0020.001D][.1C8F.0020.001C][.1E33.0020.001D] # SQUARED HDR +32CC ; [.1D18.0020.001D][.1CF4.0020.001C] # SQUARE HG +1F1A8 ; [.1D18.0020.001D][.1D32.0020.001C][*0209.0020.001C][.1E33.0020.001D][.1CAA.0020.001C][.1E71.0020.001C] # SQUARED HI-RES +33CB ; [.1D18.0020.001D][.1E0C.0020.001D] # SQUARE HP +3371 ; [.1D18.0020.001C][.1E0C.0020.001D][.1C47.0020.001C] # SQUARE HPA +1F14A ; [.1D18.0020.001D][.1EE3.0020.001D] # SQUARED HV +3390 ; [.1D18.0020.001D][.1F21.0020.001C] # SQUARE HZ +029C ; [.1D1C.0020.0002] # LATIN LETTER SMALL CAPITAL H +0195 ; [.1D20.0020.0002] # LATIN SMALL LETTER HV +01F6 ; [.1D20.0020.0008] # LATIN CAPITAL LETTER HWAIR +A795 ; [.1D24.0020.0002] # LATIN SMALL LETTER H WITH PALATAL HOOK +0266 ; [.1D25.0020.0002] # LATIN SMALL LETTER H WITH HOOK +A7AA ; [.1D25.0020.0008] # LATIN CAPITAL LETTER H WITH HOOK +02B1 ; [.1D25.0020.0014] # MODIFIER LETTER SMALL H WITH HOOK +2C68 ; [.1D29.0020.0002] # LATIN SMALL LETTER H WITH DESCENDER +2C67 ; [.1D29.0020.0008] # LATIN CAPITAL LETTER H WITH DESCENDER +2C76 ; [.1D2A.0020.0002] # LATIN SMALL LETTER HALF H +2C75 ; [.1D2A.0020.0008] # LATIN CAPITAL LETTER HALF H +A727 ; [.1D2B.0020.0002] # LATIN SMALL LETTER HENG +A726 ; [.1D2B.0020.0008] # LATIN CAPITAL LETTER HENG +AB5C ; [.1D2B.0020.0014] # MODIFIER LETTER SMALL HENG +0267 ; [.1D2C.0020.0002] # LATIN SMALL LETTER HENG WITH HOOK +02BB ; [.1D30.0020.0002] # MODIFIER LETTER TURNED COMMA +02BD ; [.1D31.0020.0002] # MODIFIER LETTER REVERSED COMMA +0069 ; [.1D32.0020.0002] # LATIN SMALL LETTER I +FF49 ; [.1D32.0020.0003] # FULLWIDTH LATIN SMALL LETTER I +0365 ; [.1D32.0020.0004] # COMBINING LATIN SMALL LETTER I +2170 ; [.1D32.0020.0004] # SMALL ROMAN NUMERAL ONE +24A4 ; [*0317.0020.0004][.1D32.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER I +2139 ; [.1D32.0020.0005] # INFORMATION SOURCE +2148 ; [.1D32.0020.0005] # DOUBLE-STRUCK ITALIC SMALL I +1D422 ; [.1D32.0020.0005] # MATHEMATICAL BOLD SMALL I +1D456 ; [.1D32.0020.0005] # MATHEMATICAL ITALIC SMALL I +1D48A ; [.1D32.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL I +1D4BE ; [.1D32.0020.0005] # MATHEMATICAL SCRIPT SMALL I +1D4F2 ; [.1D32.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL I +1D526 ; [.1D32.0020.0005] # MATHEMATICAL FRAKTUR SMALL I +1D55A ; [.1D32.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL I +1D58E ; [.1D32.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL I +1D5C2 ; [.1D32.0020.0005] # MATHEMATICAL SANS-SERIF SMALL I +1D5F6 ; [.1D32.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL I +1D62A ; [.1D32.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D65E ; [.1D32.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D692 ; [.1D32.0020.0005] # MATHEMATICAL MONOSPACE SMALL I +24D8 ; [.1D32.0020.0006] # CIRCLED LATIN SMALL LETTER I +0049 ; [.1D32.0020.0008] # LATIN CAPITAL LETTER I +FF29 ; [.1D32.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER I +2160 ; [.1D32.0020.000A] # ROMAN NUMERAL ONE +1F118 ; [*0317.0020.0004][.1D32.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER I +2110 ; [.1D32.0020.000B] # SCRIPT CAPITAL I +2111 ; [.1D32.0020.000B] # BLACK-LETTER CAPITAL I +1D408 ; [.1D32.0020.000B] # MATHEMATICAL BOLD CAPITAL I +1D43C ; [.1D32.0020.000B] # MATHEMATICAL ITALIC CAPITAL I +1D470 ; [.1D32.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL I +1D4D8 ; [.1D32.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL I +1D540 ; [.1D32.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D574 ; [.1D32.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D5A8 ; [.1D32.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL I +1D5DC ; [.1D32.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D610 ; [.1D32.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D644 ; [.1D32.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D678 ; [.1D32.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL I +24BE ; [.1D32.0020.000C] # CIRCLED LATIN CAPITAL LETTER I +1F158 ; [.1D32.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER I +2071 ; [.1D32.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER I +1D62 ; [.1D32.0020.0015] # LATIN SUBSCRIPT SMALL LETTER I +1D35 ; [.1D32.0020.001D] # MODIFIER LETTER CAPITAL I +1F138 ; [.1D32.0020.001D] # SQUARED LATIN CAPITAL LETTER I +1F178 ; [.1D32.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER I +00ED ; [.1D32.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH ACUTE +00CD ; [.1D32.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH ACUTE +00EC ; [.1D32.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER I WITH GRAVE +00CC ; [.1D32.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER I WITH GRAVE +012D ; [.1D32.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER I WITH BREVE +012C ; [.1D32.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER I WITH BREVE +00EE ; [.1D32.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER I WITH CIRCUMFLEX +00CE ; [.1D32.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +01D0 ; [.1D32.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER I WITH CARON +01CF ; [.1D32.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER I WITH CARON +00EF ; [.1D32.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER I WITH DIAERESIS +00CF ; [.1D32.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS +1E2F ; [.1D32.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E2E ; [.1D32.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +0129 ; [.1D32.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER I WITH TILDE +0128 ; [.1D32.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER I WITH TILDE +0130 ; [.1D32.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER I WITH DOT ABOVE +012F ; [.1D32.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER I WITH OGONEK +012E ; [.1D32.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER I WITH OGONEK +012B ; [.1D32.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER I WITH MACRON +012A ; [.1D32.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER I WITH MACRON +1EC9 ; [.1D32.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER I WITH HOOK ABOVE +1EC8 ; [.1D32.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER I WITH HOOK ABOVE +0209 ; [.1D32.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER I WITH DOUBLE GRAVE +0208 ; [.1D32.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020B ; [.1D32.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER I WITH INVERTED BREVE +020A ; [.1D32.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER I WITH INVERTED BREVE +1ECB ; [.1D32.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER I WITH DOT BELOW +1ECA ; [.1D32.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER I WITH DOT BELOW +1E2D ; [.1D32.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER I WITH TILDE BELOW +1E2C ; [.1D32.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER I WITH TILDE BELOW +1F18B ; [.1D32.0020.001D][.1C7A.0020.001D] # NEGATIVE SQUARED IC +1F194 ; [.1D32.0020.001D][.1C8F.0020.001D] # SQUARED ID +2171 ; [.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL TWO +2161 ; [.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL TWO +2172 ; [.1D32.0020.0004][.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL THREE +2162 ; [.1D32.0020.000A][.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL THREE +0133 ; [.1D32.0020.0004][.1D4C.0020.0004] # LATIN SMALL LIGATURE IJ +0132 ; [.1D32.0020.000A][.1D4C.0020.000A] # LATIN CAPITAL LIGATURE IJ +33CC ; [.1D32.0020.001C][.1DB9.0020.001C] # SQUARE IN +337A ; [.1D32.0020.001D][.1EB5.0020.001D] # SQUARE IU +2173 ; [.1D32.0020.0004][.1EE3.0020.0004] # SMALL ROMAN NUMERAL FOUR +2163 ; [.1D32.0020.000A][.1EE3.0020.000A] # ROMAN NUMERAL FOUR +2178 ; [.1D32.0020.0004][.1EFF.0020.0004] # SMALL ROMAN NUMERAL NINE +2168 ; [.1D32.0020.000A][.1EFF.0020.000A] # ROMAN NUMERAL NINE +0131 ; [.1D36.0020.0002] # LATIN SMALL LETTER DOTLESS I +1D6A4 ; [.1D36.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS I +026A ; [.1D3A.0020.0002] # LATIN LETTER SMALL CAPITAL I +A7AE ; [.1D3A.0020.0008] # LATIN CAPITAL LETTER SMALL CAPITAL I +1DA6 ; [.1D3A.0020.0014] # MODIFIER LETTER SMALL CAPITAL I +A7FE ; [.1D3E.0020.0002] # LATIN EPIGRAPHIC LETTER I LONGA +A7F7 ; [.1D3F.0020.0002] # LATIN EPIGRAPHIC LETTER SIDEWAYS I +1D09 ; [.1D40.0020.0002] # LATIN SMALL LETTER TURNED I +1D4E ; [.1D40.0020.0014] # MODIFIER LETTER SMALL TURNED I +0268 ; [.1D41.0020.0002] # LATIN SMALL LETTER I WITH STROKE +0197 ; [.1D41.0020.0008] # LATIN CAPITAL LETTER I WITH STROKE +1DA4 ; [.1D41.0020.0014] # MODIFIER LETTER SMALL I WITH STROKE +1D7B ; [.1D45.0020.0002] # LATIN SMALL CAPITAL LETTER I WITH STROKE +1DA7 ; [.1D45.0020.0014] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE +1D96 ; [.1D46.0020.0002] # LATIN SMALL LETTER I WITH RETROFLEX HOOK +0269 ; [.1D47.0020.0002] # LATIN SMALL LETTER IOTA +0196 ; [.1D47.0020.0008] # LATIN CAPITAL LETTER IOTA +1DA5 ; [.1D47.0020.0014] # MODIFIER LETTER SMALL IOTA +1D7C ; [.1D4B.0020.0002] # LATIN SMALL LETTER IOTA WITH STROKE +006A ; [.1D4C.0020.0002] # LATIN SMALL LETTER J +FF4A ; [.1D4C.0020.0003] # FULLWIDTH LATIN SMALL LETTER J +24A5 ; [*0317.0020.0004][.1D4C.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER J +2149 ; [.1D4C.0020.0005] # DOUBLE-STRUCK ITALIC SMALL J +1D423 ; [.1D4C.0020.0005] # MATHEMATICAL BOLD SMALL J +1D457 ; [.1D4C.0020.0005] # MATHEMATICAL ITALIC SMALL J +1D48B ; [.1D4C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL J +1D4BF ; [.1D4C.0020.0005] # MATHEMATICAL SCRIPT SMALL J +1D4F3 ; [.1D4C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL J +1D527 ; [.1D4C.0020.0005] # MATHEMATICAL FRAKTUR SMALL J +1D55B ; [.1D4C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL J +1D58F ; [.1D4C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL J +1D5C3 ; [.1D4C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL J +1D5F7 ; [.1D4C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL J +1D62B ; [.1D4C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D65F ; [.1D4C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D693 ; [.1D4C.0020.0005] # MATHEMATICAL MONOSPACE SMALL J +24D9 ; [.1D4C.0020.0006] # CIRCLED LATIN SMALL LETTER J +004A ; [.1D4C.0020.0008] # LATIN CAPITAL LETTER J +FF2A ; [.1D4C.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER J +1F119 ; [*0317.0020.0004][.1D4C.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER J +1D409 ; [.1D4C.0020.000B] # MATHEMATICAL BOLD CAPITAL J +1D43D ; [.1D4C.0020.000B] # MATHEMATICAL ITALIC CAPITAL J +1D471 ; [.1D4C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL J +1D4A5 ; [.1D4C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL J +1D4D9 ; [.1D4C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL J +1D50D ; [.1D4C.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL J +1D541 ; [.1D4C.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D575 ; [.1D4C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D5A9 ; [.1D4C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL J +1D5DD ; [.1D4C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D611 ; [.1D4C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D645 ; [.1D4C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D679 ; [.1D4C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL J +24BF ; [.1D4C.0020.000C] # CIRCLED LATIN CAPITAL LETTER J +1F159 ; [.1D4C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER J +02B2 ; [.1D4C.0020.0014] # MODIFIER LETTER SMALL J +2C7C ; [.1D4C.0020.0015] # LATIN SUBSCRIPT SMALL LETTER J +1D36 ; [.1D4C.0020.001D] # MODIFIER LETTER CAPITAL J +1F139 ; [.1D4C.0020.001D] # SQUARED LATIN CAPITAL LETTER J +1F179 ; [.1D4C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER J +0135 ; [.1D4C.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER J WITH CIRCUMFLEX +0134 ; [.1D4C.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +01F0 ; [.1D4C.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER J WITH CARON +0237 ; [.1D50.0020.0002] # LATIN SMALL LETTER DOTLESS J +1D6A5 ; [.1D50.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS J +1D0A ; [.1D54.0020.0002] # LATIN LETTER SMALL CAPITAL J +0249 ; [.1D55.0020.0002] # LATIN SMALL LETTER J WITH STROKE +0248 ; [.1D55.0020.0008] # LATIN CAPITAL LETTER J WITH STROKE +029D ; [.1D59.0020.0002] # LATIN SMALL LETTER J WITH CROSSED-TAIL +A7B2 ; [.1D59.0020.0008] # LATIN CAPITAL LETTER J WITH CROSSED-TAIL +1DA8 ; [.1D59.0020.0014] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL +025F ; [.1D5D.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE +1DA1 ; [.1D5D.0020.0014] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE +0284 ; [.1D61.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK +006B ; [.1D65.0020.0002] # LATIN SMALL LETTER K +FF4B ; [.1D65.0020.0003] # FULLWIDTH LATIN SMALL LETTER K +1DDC ; [.1D65.0020.0004] # COMBINING LATIN SMALL LETTER K +24A6 ; [*0317.0020.0004][.1D65.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER K +1D424 ; [.1D65.0020.0005] # MATHEMATICAL BOLD SMALL K +1D458 ; [.1D65.0020.0005] # MATHEMATICAL ITALIC SMALL K +1D48C ; [.1D65.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL K +1D4C0 ; [.1D65.0020.0005] # MATHEMATICAL SCRIPT SMALL K +1D4F4 ; [.1D65.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL K +1D528 ; [.1D65.0020.0005] # MATHEMATICAL FRAKTUR SMALL K +1D55C ; [.1D65.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL K +1D590 ; [.1D65.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL K +1D5C4 ; [.1D65.0020.0005] # MATHEMATICAL SANS-SERIF SMALL K +1D5F8 ; [.1D65.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL K +1D62C ; [.1D65.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D660 ; [.1D65.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D694 ; [.1D65.0020.0005] # MATHEMATICAL MONOSPACE SMALL K +24DA ; [.1D65.0020.0006] # CIRCLED LATIN SMALL LETTER K +004B ; [.1D65.0020.0008] # LATIN CAPITAL LETTER K +212A ; [.1D65.0020.0008] # KELVIN SIGN +FF2B ; [.1D65.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER K +1F11A ; [*0317.0020.0004][.1D65.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER K +1D40A ; [.1D65.0020.000B] # MATHEMATICAL BOLD CAPITAL K +1D43E ; [.1D65.0020.000B] # MATHEMATICAL ITALIC CAPITAL K +1D472 ; [.1D65.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL K +1D4A6 ; [.1D65.0020.000B] # MATHEMATICAL SCRIPT CAPITAL K +1D4DA ; [.1D65.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL K +1D50E ; [.1D65.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL K +1D542 ; [.1D65.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D576 ; [.1D65.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D5AA ; [.1D65.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL K +1D5DE ; [.1D65.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D612 ; [.1D65.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D646 ; [.1D65.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D67A ; [.1D65.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL K +24C0 ; [.1D65.0020.000C] # CIRCLED LATIN CAPITAL LETTER K +1F15A ; [.1D65.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER K +1D4F ; [.1D65.0020.0014] # MODIFIER LETTER SMALL K +2096 ; [.1D65.0020.0015] # LATIN SUBSCRIPT SMALL LETTER K +1D37 ; [.1D65.0020.001D] # MODIFIER LETTER CAPITAL K +1F13A ; [.1D65.0020.001D] # SQUARED LATIN CAPITAL LETTER K +1F17A ; [.1D65.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER K +1E31 ; [.1D65.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER K WITH ACUTE +1E30 ; [.1D65.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER K WITH ACUTE +01E9 ; [.1D65.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER K WITH CARON +01E8 ; [.1D65.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER K WITH CARON +0137 ; [.1D65.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER K WITH CEDILLA +0136 ; [.1D65.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER K WITH CEDILLA +A7A3 ; [.1D65.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER K WITH OBLIQUE STROKE +A7A2 ; [.1D65.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +1E33 ; [.1D65.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER K WITH DOT BELOW +1E32 ; [.1D65.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER K WITH DOT BELOW +1E35 ; [.1D65.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER K WITH LINE BELOW +1E34 ; [.1D65.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER K WITH LINE BELOW +3384 ; [.1D65.0020.001C][.1C47.0020.001D] # SQUARE KA +3385 ; [.1D65.0020.001D][.1C60.0020.001D] # SQUARE KB +3389 ; [.1D65.0020.001C][.1C7A.0020.001C][.1C47.0020.001C][.1D77.0020.001C] # SQUARE KCAL +338F ; [.1D65.0020.001C][.1CF4.0020.001C] # SQUARE KG +3391 ; [.1D65.0020.001C][.1D18.0020.001D][.1F21.0020.001C] # SQUARE KHZ +33CD ; [.1D65.0020.001D][.1D65.0020.001D] # SQUARE KK +3398 ; [.1D65.0020.001C][.1D77.0020.001C] # SQUARE KL +339E ; [.1D65.0020.001C][.1DAA.0020.001C] # SQUARE KM +33CE ; [.1D65.0020.001D][.1DAA.0020.001D] # SQUARE KM CAPITAL +33A2 ; [.1D65.0020.001C][.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE KM SQUARED +33A6 ; [.1D65.0020.001C][.1DAA.0020.001C][.1C40.0020.001C] # SQUARE KM CUBED +33AA ; [.1D65.0020.001C][.1E0C.0020.001D][.1C47.0020.001C] # SQUARE KPA +33CF ; [.1D65.0020.001C][.1E95.0020.001C] # SQUARE KT +33B8 ; [.1D65.0020.001C][.1EE3.0020.001D] # SQUARE KV +33BE ; [.1D65.0020.001C][.1EF5.0020.001D] # SQUARE KW +33C0 ; [.1D65.0020.001C][.1FE1.0020.001D] # SQUARE K OHM +1D0B ; [.1D69.0020.0002] # LATIN LETTER SMALL CAPITAL K +1D84 ; [.1D6A.0020.0002] # LATIN SMALL LETTER K WITH PALATAL HOOK +0199 ; [.1D6B.0020.0002] # LATIN SMALL LETTER K WITH HOOK +0198 ; [.1D6B.0020.0008] # LATIN CAPITAL LETTER K WITH HOOK +2C6A ; [.1D6F.0020.0002] # LATIN SMALL LETTER K WITH DESCENDER +2C69 ; [.1D6F.0020.0008] # LATIN CAPITAL LETTER K WITH DESCENDER +A741 ; [.1D70.0020.0002] # LATIN SMALL LETTER K WITH STROKE +A740 ; [.1D70.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE +A743 ; [.1D71.0020.0002] # LATIN SMALL LETTER K WITH DIAGONAL STROKE +A742 ; [.1D71.0020.0008] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A745 ; [.1D72.0020.0002] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +A744 ; [.1D72.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +029E ; [.1D73.0020.0002] # LATIN SMALL LETTER TURNED K +A7B0 ; [.1D73.0020.0008] # LATIN CAPITAL LETTER TURNED K +006C ; [.1D77.0020.0002] # LATIN SMALL LETTER L +FF4C ; [.1D77.0020.0003] # FULLWIDTH LATIN SMALL LETTER L +1DDD ; [.1D77.0020.0004] # COMBINING LATIN SMALL LETTER L +217C ; [.1D77.0020.0004] # SMALL ROMAN NUMERAL FIFTY +24A7 ; [*0317.0020.0004][.1D77.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER L +2113 ; [.1D77.0020.0005] # SCRIPT SMALL L +1D425 ; [.1D77.0020.0005] # MATHEMATICAL BOLD SMALL L +1D459 ; [.1D77.0020.0005] # MATHEMATICAL ITALIC SMALL L +1D48D ; [.1D77.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL L +1D4C1 ; [.1D77.0020.0005] # MATHEMATICAL SCRIPT SMALL L +1D4F5 ; [.1D77.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL L +1D529 ; [.1D77.0020.0005] # MATHEMATICAL FRAKTUR SMALL L +1D55D ; [.1D77.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL L +1D591 ; [.1D77.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL L +1D5C5 ; [.1D77.0020.0005] # MATHEMATICAL SANS-SERIF SMALL L +1D5F9 ; [.1D77.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL L +1D62D ; [.1D77.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D661 ; [.1D77.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D695 ; [.1D77.0020.0005] # MATHEMATICAL MONOSPACE SMALL L +24DB ; [.1D77.0020.0006] # CIRCLED LATIN SMALL LETTER L +004C ; [.1D77.0020.0008] # LATIN CAPITAL LETTER L +FF2C ; [.1D77.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER L +216C ; [.1D77.0020.000A] # ROMAN NUMERAL FIFTY +1F11B ; [*0317.0020.0004][.1D77.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER L +2112 ; [.1D77.0020.000B] # SCRIPT CAPITAL L +1D40B ; [.1D77.0020.000B] # MATHEMATICAL BOLD CAPITAL L +1D43F ; [.1D77.0020.000B] # MATHEMATICAL ITALIC CAPITAL L +1D473 ; [.1D77.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL L +1D4DB ; [.1D77.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL L +1D50F ; [.1D77.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL L +1D543 ; [.1D77.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D577 ; [.1D77.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D5AB ; [.1D77.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL L +1D5DF ; [.1D77.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D613 ; [.1D77.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D647 ; [.1D77.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D67B ; [.1D77.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL L +24C1 ; [.1D77.0020.000C] # CIRCLED LATIN CAPITAL LETTER L +1F15B ; [.1D77.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER L +02E1 ; [.1D77.0020.0014] # MODIFIER LETTER SMALL L +2097 ; [.1D77.0020.0015] # LATIN SUBSCRIPT SMALL LETTER L +1D38 ; [.1D77.0020.001D] # MODIFIER LETTER CAPITAL L +1F13B ; [.1D77.0020.001D] # SQUARED LATIN CAPITAL LETTER L +1F17B ; [.1D77.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER L +013A ; [.1D77.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER L WITH ACUTE +0139 ; [.1D77.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER L WITH ACUTE +013E ; [.1D77.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER L WITH CARON +013D ; [.1D77.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER L WITH CARON +013C ; [.1D77.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER L WITH CEDILLA +013B ; [.1D77.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER L WITH CEDILLA +0142 ; [.1D77.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER L WITH STROKE +0141 ; [.1D77.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER L WITH STROKE +1E37 ; [.1D77.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER L WITH DOT BELOW +1E36 ; [.1D77.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW +1E39 ; [.1D77.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E38 ; [.1D77.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3D ; [.1D77.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3C ; [.1D77.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3B ; [.1D77.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER L WITH LINE BELOW +1E3A ; [.1D77.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER L WITH LINE BELOW +0140 ; [.1D77.0020.0002][.0000.0110.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +006C 00B7 ; [.1D77.0020.0002][.0000.0110.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +006C 0387 ; [.1D77.0020.0002][.0000.0110.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +013F ; [.1D77.0020.0008][.0000.0110.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +004C 00B7 ; [.1D77.0020.0008][.0000.0110.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +004C 0387 ; [.1D77.0020.0008][.0000.0110.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +01C9 ; [.1D77.0020.0004][.1D4C.0020.0004] # LATIN SMALL LETTER LJ +01C8 ; [.1D77.0020.000A][.1D4C.0020.0004] # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01C7 ; [.1D77.0020.000A][.1D4C.0020.000A] # LATIN CAPITAL LETTER LJ +1EFB ; [.1D77.0020.0004][.1D77.0020.0004] # LATIN SMALL LETTER MIDDLE-WELSH LL +1EFA ; [.1D77.0020.000A][.1D77.0020.000A] # LATIN CAPITAL LETTER MIDDLE-WELSH LL +33D0 ; [.1D77.0020.001C][.1DAA.0020.001C] # SQUARE LM +33D1 ; [.1D77.0020.001C][.1DB9.0020.001C] # SQUARE LN +33D2 ; [.1D77.0020.001C][.1DDD.0020.001C][.1CF4.0020.001C] # SQUARE LOG +1F1A9 ; [.1D77.0020.001D][.1DDD.0020.001C][.1E71.0020.001C][.1E71.0020.001C][.1D77.0020.001C][.1CAA.0020.001C][.1E71.0020.001C][.1E71.0020.001C] # SQUARED LOSSLESS +02AA ; [.1D77.0020.0004][.1E71.0020.0004] # LATIN SMALL LETTER LS DIGRAPH +32CF ; [.1D77.0020.001D][.1E95.0020.001D][.1C8F.0020.001D] # LIMITED LIABILITY SIGN +33D3 ; [.1D77.0020.001C][.1EFF.0020.001C] # SQUARE LX +02AB ; [.1D77.0020.0004][.1F21.0020.0004] # LATIN SMALL LETTER LZ DIGRAPH +029F ; [.1D7B.0020.0002] # LATIN LETTER SMALL CAPITAL L +1DDE ; [.1D7B.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL L +1DAB ; [.1D7B.0020.0014] # MODIFIER LETTER SMALL CAPITAL L +A747 ; [.1D7F.0020.0002] # LATIN SMALL LETTER BROKEN L +A746 ; [.1D7F.0020.0008] # LATIN CAPITAL LETTER BROKEN L +1D0C ; [.1D80.0020.0002] # LATIN LETTER SMALL CAPITAL L WITH STROKE +A749 ; [.1D81.0020.0002] # LATIN SMALL LETTER L WITH HIGH STROKE +A748 ; [.1D81.0020.0008] # LATIN CAPITAL LETTER L WITH HIGH STROKE +019A ; [.1D82.0020.0002] # LATIN SMALL LETTER L WITH BAR +023D ; [.1D82.0020.0008] # LATIN CAPITAL LETTER L WITH BAR +2C61 ; [.1D86.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE BAR +2C60 ; [.1D86.0020.0008] # LATIN CAPITAL LETTER L WITH DOUBLE BAR +026B ; [.1D87.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE TILDE +2C62 ; [.1D87.0020.0008] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE +AB5E ; [.1D87.0020.0014] # MODIFIER LETTER SMALL L WITH MIDDLE TILDE +AB38 ; [.1D8B.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE +1DEC ; [.1D8B.0020.0004] # COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE +AB39 ; [.1D8C.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE RING +026C ; [.1D8D.0020.0002] # LATIN SMALL LETTER L WITH BELT +A7AD ; [.1D8D.0020.0008] # LATIN CAPITAL LETTER L WITH BELT +AB37 ; [.1D91.0020.0002] # LATIN SMALL LETTER L WITH INVERTED LAZY S +AB5D ; [.1D91.0020.0014] # MODIFIER LETTER SMALL L WITH INVERTED LAZY S +1D85 ; [.1D92.0020.0002] # LATIN SMALL LETTER L WITH PALATAL HOOK +1DAA ; [.1D92.0020.0014] # MODIFIER LETTER SMALL L WITH PALATAL HOOK +026D ; [.1D93.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK +1DA9 ; [.1D93.0020.0014] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +A78E ; [.1D97.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +0234 ; [.1D98.0020.0002] # LATIN SMALL LETTER L WITH CURL +A772 ; [.1D9C.0020.0002] # LATIN SMALL LETTER LUM +026E ; [.1D9D.0020.0002] # LATIN SMALL LETTER LEZH +A781 ; [.1DA1.0020.0002] # LATIN SMALL LETTER TURNED L +A780 ; [.1DA1.0020.0008] # LATIN CAPITAL LETTER TURNED L +019B ; [.1DA2.0020.0002] # LATIN SMALL LETTER LAMBDA WITH STROKE +028E ; [.1DA6.0020.0002] # LATIN SMALL LETTER TURNED Y +006D ; [.1DAA.0020.0002] # LATIN SMALL LETTER M +FF4D ; [.1DAA.0020.0003] # FULLWIDTH LATIN SMALL LETTER M +036B ; [.1DAA.0020.0004] # COMBINING LATIN SMALL LETTER M +217F ; [.1DAA.0020.0004] # SMALL ROMAN NUMERAL ONE THOUSAND +24A8 ; [*0317.0020.0004][.1DAA.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER M +1D426 ; [.1DAA.0020.0005] # MATHEMATICAL BOLD SMALL M +1D45A ; [.1DAA.0020.0005] # MATHEMATICAL ITALIC SMALL M +1D48E ; [.1DAA.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL M +1D4C2 ; [.1DAA.0020.0005] # MATHEMATICAL SCRIPT SMALL M +1D4F6 ; [.1DAA.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL M +1D52A ; [.1DAA.0020.0005] # MATHEMATICAL FRAKTUR SMALL M +1D55E ; [.1DAA.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL M +1D592 ; [.1DAA.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL M +1D5C6 ; [.1DAA.0020.0005] # MATHEMATICAL SANS-SERIF SMALL M +1D5FA ; [.1DAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL M +1D62E ; [.1DAA.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D662 ; [.1DAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D696 ; [.1DAA.0020.0005] # MATHEMATICAL MONOSPACE SMALL M +24DC ; [.1DAA.0020.0006] # CIRCLED LATIN SMALL LETTER M +004D ; [.1DAA.0020.0008] # LATIN CAPITAL LETTER M +FF2D ; [.1DAA.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER M +216F ; [.1DAA.0020.000A] # ROMAN NUMERAL ONE THOUSAND +1F11C ; [*0317.0020.0004][.1DAA.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER M +2133 ; [.1DAA.0020.000B] # SCRIPT CAPITAL M +1D40C ; [.1DAA.0020.000B] # MATHEMATICAL BOLD CAPITAL M +1D440 ; [.1DAA.0020.000B] # MATHEMATICAL ITALIC CAPITAL M +1D474 ; [.1DAA.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL M +1D4DC ; [.1DAA.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL M +1D510 ; [.1DAA.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL M +1D544 ; [.1DAA.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D578 ; [.1DAA.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D5AC ; [.1DAA.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL M +1D5E0 ; [.1DAA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D614 ; [.1DAA.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D648 ; [.1DAA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D67C ; [.1DAA.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL M +24C2 ; [.1DAA.0020.000C] # CIRCLED LATIN CAPITAL LETTER M +1F15C ; [.1DAA.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER M +1D50 ; [.1DAA.0020.0014] # MODIFIER LETTER SMALL M +2098 ; [.1DAA.0020.0015] # LATIN SUBSCRIPT SMALL LETTER M +1D39 ; [.1DAA.0020.001D] # MODIFIER LETTER CAPITAL M +1F13C ; [.1DAA.0020.001D] # SQUARED LATIN CAPITAL LETTER M +1F17C ; [.1DAA.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER M +1E3F ; [.1DAA.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER M WITH ACUTE +1E3E ; [.1DAA.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER M WITH ACUTE +1E41 ; [.1DAA.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER M WITH DOT ABOVE +1E40 ; [.1DAA.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E43 ; [.1DAA.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER M WITH DOT BELOW +1E42 ; [.1DAA.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER M WITH DOT BELOW +33A1 ; [.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE M SQUARED +33A5 ; [.1DAA.0020.001C][.1C40.0020.001C] # SQUARE M CUBED +3383 ; [.1DAA.0020.001C][.1C47.0020.001D] # SQUARE MA +33D4 ; [.1DAA.0020.001C][.1C60.0020.001C] # SQUARE MB SMALL +3386 ; [.1DAA.0020.001D][.1C60.0020.001D] # SQUARE MB +1F16A ; [.1DAA.0020.0014][.1C7A.0020.0014] # RAISED MC SIGN +1F16B ; [.1DAA.0020.0014][.1C8F.0020.0014] # RAISED MD SIGN +338E ; [.1DAA.0020.001C][.1CF4.0020.001C] # SQUARE MG +3392 ; [.1DAA.0020.001D][.1D18.0020.001D][.1F21.0020.001C] # SQUARE MHZ +33D5 ; [.1DAA.0020.001C][.1D32.0020.001C][.1D77.0020.001C] # SQUARE MIL +3396 ; [.1DAA.0020.001C][.1D77.0020.001C] # SQUARE ML +339C ; [.1DAA.0020.001C][.1DAA.0020.001C] # SQUARE MM +339F ; [.1DAA.0020.001C][.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE MM SQUARED +33A3 ; [.1DAA.0020.001C][.1DAA.0020.001C][.1C40.0020.001C] # SQUARE MM CUBED +33D6 ; [.1DAA.0020.001C][.1DDD.0020.001C][.1D77.0020.001C] # SQUARE MOL +33AB ; [.1DAA.0020.001D][.1E0C.0020.001D][.1C47.0020.001C] # SQUARE MPA +33A7 ; [.1DAA.0020.001C][*0625.0020.001C][.1E71.0020.001C] # SQUARE M OVER S +33B3 ; [.1DAA.0020.001C][.1E71.0020.001C] # SQUARE MS +33A8 ; [.1DAA.0020.001C][*0625.0020.001C][.1E71.0020.001C][.1C3F.0020.001C] # SQUARE M OVER S SQUARED +33B7 ; [.1DAA.0020.001C][.1EE3.0020.001D] # SQUARE MV +33B9 ; [.1DAA.0020.001D][.1EE3.0020.001D] # SQUARE MV MEGA +1F14B ; [.1DAA.0020.001D][.1EE3.0020.001D] # SQUARED MV +33BD ; [.1DAA.0020.001C][.1EF5.0020.001D] # SQUARE MW +33BF ; [.1DAA.0020.001D][.1EF5.0020.001D] # SQUARE MW MEGA +33C1 ; [.1DAA.0020.001D][.1FE1.0020.001D] # SQUARE M OHM +1D0D ; [.1DAE.0020.0002] # LATIN LETTER SMALL CAPITAL M +1DDF ; [.1DAE.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL M +1D6F ; [.1DAF.0020.0002] # LATIN SMALL LETTER M WITH MIDDLE TILDE +1D86 ; [.1DB0.0020.0002] # LATIN SMALL LETTER M WITH PALATAL HOOK +0271 ; [.1DB1.0020.0002] # LATIN SMALL LETTER M WITH HOOK +2C6E ; [.1DB1.0020.0008] # LATIN CAPITAL LETTER M WITH HOOK +1DAC ; [.1DB1.0020.0014] # MODIFIER LETTER SMALL M WITH HOOK +AB3A ; [.1DB5.0020.0002] # LATIN SMALL LETTER M WITH CROSSED-TAIL +A7FD ; [.1DB6.0020.0002] # LATIN EPIGRAPHIC LETTER INVERTED M +A7FF ; [.1DB7.0020.0002] # LATIN EPIGRAPHIC LETTER ARCHAIC M +A773 ; [.1DB8.0020.0002] # LATIN SMALL LETTER MUM +006E ; [.1DB9.0020.0002] # LATIN SMALL LETTER N +FF4E ; [.1DB9.0020.0003] # FULLWIDTH LATIN SMALL LETTER N +1DE0 ; [.1DB9.0020.0004] # COMBINING LATIN SMALL LETTER N +24A9 ; [*0317.0020.0004][.1DB9.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER N +1D427 ; [.1DB9.0020.0005] # MATHEMATICAL BOLD SMALL N +1D45B ; [.1DB9.0020.0005] # MATHEMATICAL ITALIC SMALL N +1D48F ; [.1DB9.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL N +1D4C3 ; [.1DB9.0020.0005] # MATHEMATICAL SCRIPT SMALL N +1D4F7 ; [.1DB9.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL N +1D52B ; [.1DB9.0020.0005] # MATHEMATICAL FRAKTUR SMALL N +1D55F ; [.1DB9.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL N +1D593 ; [.1DB9.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL N +1D5C7 ; [.1DB9.0020.0005] # MATHEMATICAL SANS-SERIF SMALL N +1D5FB ; [.1DB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL N +1D62F ; [.1DB9.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D663 ; [.1DB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D697 ; [.1DB9.0020.0005] # MATHEMATICAL MONOSPACE SMALL N +24DD ; [.1DB9.0020.0006] # CIRCLED LATIN SMALL LETTER N +004E ; [.1DB9.0020.0008] # LATIN CAPITAL LETTER N +FF2E ; [.1DB9.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER N +1F11D ; [*0317.0020.0004][.1DB9.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER N +2115 ; [.1DB9.0020.000B] # DOUBLE-STRUCK CAPITAL N +1D40D ; [.1DB9.0020.000B] # MATHEMATICAL BOLD CAPITAL N +1D441 ; [.1DB9.0020.000B] # MATHEMATICAL ITALIC CAPITAL N +1D475 ; [.1DB9.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL N +1D4A9 ; [.1DB9.0020.000B] # MATHEMATICAL SCRIPT CAPITAL N +1D4DD ; [.1DB9.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL N +1D511 ; [.1DB9.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL N +1D579 ; [.1DB9.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D5AD ; [.1DB9.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL N +1D5E1 ; [.1DB9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D615 ; [.1DB9.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D649 ; [.1DB9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D67D ; [.1DB9.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL N +24C3 ; [.1DB9.0020.000C] # CIRCLED LATIN CAPITAL LETTER N +1F15D ; [.1DB9.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER N +207F ; [.1DB9.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER N +2099 ; [.1DB9.0020.0015] # LATIN SUBSCRIPT SMALL LETTER N +1D3A ; [.1DB9.0020.001D] # MODIFIER LETTER CAPITAL N +1F13D ; [.1DB9.0020.001D] # SQUARED LATIN CAPITAL LETTER N +1F17D ; [.1DB9.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER N +0144 ; [.1DB9.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER N WITH ACUTE +0143 ; [.1DB9.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER N WITH ACUTE +01F9 ; [.1DB9.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER N WITH GRAVE +01F8 ; [.1DB9.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER N WITH GRAVE +0148 ; [.1DB9.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER N WITH CARON +0147 ; [.1DB9.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER N WITH CARON +00F1 ; [.1DB9.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER N WITH TILDE +00D1 ; [.1DB9.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER N WITH TILDE +1E45 ; [.1DB9.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER N WITH DOT ABOVE +1E44 ; [.1DB9.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER N WITH DOT ABOVE +0146 ; [.1DB9.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER N WITH CEDILLA +0145 ; [.1DB9.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER N WITH CEDILLA +A7A5 ; [.1DB9.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER N WITH OBLIQUE STROKE +A7A4 ; [.1DB9.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +1E47 ; [.1DB9.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER N WITH DOT BELOW +1E46 ; [.1DB9.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER N WITH DOT BELOW +1E4B ; [.1DB9.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4A ; [.1DB9.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E49 ; [.1DB9.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER N WITH LINE BELOW +1E48 ; [.1DB9.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER N WITH LINE BELOW +3381 ; [.1DB9.0020.001C][.1C47.0020.001D] # SQUARE NA +1F195 ; [.1DB9.0020.001D][.1CAA.0020.001D][.1EF5.0020.001D] # SQUARED NEW +338B ; [.1DB9.0020.001C][.1CE5.0020.001D] # SQUARE NF +1F196 ; [.1DB9.0020.001D][.1CF4.0020.001D] # SQUARED NG +01CC ; [.1DB9.0020.0004][.1D4C.0020.0004] # LATIN SMALL LETTER NJ +01CB ; [.1DB9.0020.000A][.1D4C.0020.0004] # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CA ; [.1DB9.0020.000A][.1D4C.0020.000A] # LATIN CAPITAL LETTER NJ +339A ; [.1DB9.0020.001C][.1DAA.0020.001C] # SQUARE NM +2116 ; [.1DB9.0020.000A][.1DDD.0020.0004] # NUMERO SIGN +33B1 ; [.1DB9.0020.001C][.1E71.0020.001C] # SQUARE NS +33B5 ; [.1DB9.0020.001C][.1EE3.0020.001D] # SQUARE NV +33BB ; [.1DB9.0020.001C][.1EF5.0020.001D] # SQUARE NW +0274 ; [.1DBD.0020.0002] # LATIN LETTER SMALL CAPITAL N +1DE1 ; [.1DBD.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL N +1DB0 ; [.1DBD.0020.0014] # MODIFIER LETTER SMALL CAPITAL N +1D3B ; [.1DC1.0020.0002] # MODIFIER LETTER CAPITAL REVERSED N +1D0E ; [.1DC2.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED N +1D70 ; [.1DC3.0020.0002] # LATIN SMALL LETTER N WITH MIDDLE TILDE +0272 ; [.1DC4.0020.0002] # LATIN SMALL LETTER N WITH LEFT HOOK +019D ; [.1DC4.0020.0008] # LATIN CAPITAL LETTER N WITH LEFT HOOK +1DAE ; [.1DC4.0020.0014] # MODIFIER LETTER SMALL N WITH LEFT HOOK +019E ; [.1DC8.0020.0002] # LATIN SMALL LETTER N WITH LONG RIGHT LEG +0220 ; [.1DC8.0020.0008] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +A791 ; [.1DCC.0020.0002] # LATIN SMALL LETTER N WITH DESCENDER +A790 ; [.1DCC.0020.0008] # LATIN CAPITAL LETTER N WITH DESCENDER +1D87 ; [.1DCD.0020.0002] # LATIN SMALL LETTER N WITH PALATAL HOOK +0273 ; [.1DCE.0020.0002] # LATIN SMALL LETTER N WITH RETROFLEX HOOK +1DAF ; [.1DCE.0020.0014] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +0235 ; [.1DD2.0020.0002] # LATIN SMALL LETTER N WITH CURL +AB3B ; [.1DD6.0020.0002] # LATIN SMALL LETTER N WITH CROSSED-TAIL +A774 ; [.1DD7.0020.0002] # LATIN SMALL LETTER NUM +014B ; [.1DD8.0020.0002] # LATIN SMALL LETTER ENG +014A ; [.1DD8.0020.0008] # LATIN CAPITAL LETTER ENG +1D51 ; [.1DD8.0020.0014] # MODIFIER LETTER SMALL ENG +AB3C ; [.1DDC.0020.0002] # LATIN SMALL LETTER ENG WITH CROSSED-TAIL +006F ; [.1DDD.0020.0002] # LATIN SMALL LETTER O +FF4F ; [.1DDD.0020.0003] # FULLWIDTH LATIN SMALL LETTER O +0366 ; [.1DDD.0020.0004] # COMBINING LATIN SMALL LETTER O +24AA ; [*0317.0020.0004][.1DDD.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER O +2134 ; [.1DDD.0020.0005] # SCRIPT SMALL O +1D428 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD SMALL O +1D45C ; [.1DDD.0020.0005] # MATHEMATICAL ITALIC SMALL O +1D490 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL O +1D4F8 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL O +1D52C ; [.1DDD.0020.0005] # MATHEMATICAL FRAKTUR SMALL O +1D560 ; [.1DDD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL O +1D594 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL O +1D5C8 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF SMALL O +1D5FC ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL O +1D630 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D664 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D698 ; [.1DDD.0020.0005] # MATHEMATICAL MONOSPACE SMALL O +24DE ; [.1DDD.0020.0006] # CIRCLED LATIN SMALL LETTER O +004F ; [.1DDD.0020.0008] # LATIN CAPITAL LETTER O +FF2F ; [.1DDD.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER O +1F11E ; [*0317.0020.0004][.1DDD.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER O +1D40E ; [.1DDD.0020.000B] # MATHEMATICAL BOLD CAPITAL O +1D442 ; [.1DDD.0020.000B] # MATHEMATICAL ITALIC CAPITAL O +1D476 ; [.1DDD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL O +1D4AA ; [.1DDD.0020.000B] # MATHEMATICAL SCRIPT CAPITAL O +1D4DE ; [.1DDD.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL O +1D512 ; [.1DDD.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL O +1D546 ; [.1DDD.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D57A ; [.1DDD.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D5AE ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL O +1D5E2 ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D616 ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D64A ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D67E ; [.1DDD.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL O +24C4 ; [.1DDD.0020.000C] # CIRCLED LATIN CAPITAL LETTER O +1F15E ; [.1DDD.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER O +00BA ; [.1DDD.0020.0014] # MASCULINE ORDINAL INDICATOR +1D52 ; [.1DDD.0020.0014] # MODIFIER LETTER SMALL O +2092 ; [.1DDD.0020.0015] # LATIN SUBSCRIPT SMALL LETTER O +1D3C ; [.1DDD.0020.001D] # MODIFIER LETTER CAPITAL O +1F13E ; [.1DDD.0020.001D] # SQUARED LATIN CAPITAL LETTER O +1F17E ; [.1DDD.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER O +00F3 ; [.1DDD.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH ACUTE +00D3 ; [.1DDD.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH ACUTE +00F2 ; [.1DDD.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH GRAVE +00D2 ; [.1DDD.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH GRAVE +014F ; [.1DDD.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER O WITH BREVE +014E ; [.1DDD.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER O WITH BREVE +00F4 ; [.1DDD.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX +00D4 ; [.1DDD.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +1ED1 ; [.1DDD.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED0 ; [.1DDD.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED3 ; [.1DDD.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED2 ; [.1DDD.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED7 ; [.1DDD.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED6 ; [.1DDD.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED5 ; [.1DDD.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED4 ; [.1DDD.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +01D2 ; [.1DDD.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER O WITH CARON +01D1 ; [.1DDD.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER O WITH CARON +00F6 ; [.1DDD.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH DIAERESIS +1DF3 ; [.1DDD.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER O WITH DIAERESIS +A79D ; [.1DDD.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK OE +00D6 ; [.1DDD.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS +A79C ; [.1DDD.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK OE +022B ; [.1DDD.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022A ; [.1DDD.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +0151 ; [.1DDD.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0150 ; [.1DDD.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +00F5 ; [.1DDD.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH TILDE +00D5 ; [.1DDD.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH TILDE +1E4D ; [.1DDD.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4C ; [.1DDD.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4F ; [.1DDD.0020.0002][.0000.002D.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E4E ; [.1DDD.0020.0008][.0000.002D.0002][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +022D ; [.1DDD.0020.0002][.0000.002D.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH TILDE AND MACRON +022C ; [.1DDD.0020.0008][.0000.002D.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022F ; [.1DDD.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER O WITH DOT ABOVE +022E ; [.1DDD.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE +0231 ; [.1DDD.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0230 ; [.1DDD.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +00F8 ; [.1DDD.0020.0002][.0000.002F.0002] # LATIN SMALL LETTER O WITH STROKE +00D8 ; [.1DDD.0020.0008][.0000.002F.0002] # LATIN CAPITAL LETTER O WITH STROKE +01FF ; [.1DDD.0020.0002][.0000.002F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH STROKE AND ACUTE +01FE ; [.1DDD.0020.0008][.0000.002F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01EB ; [.1DDD.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER O WITH OGONEK +01EA ; [.1DDD.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER O WITH OGONEK +01ED ; [.1DDD.0020.0002][.0000.0031.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EC ; [.1DDD.0020.0008][.0000.0031.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +014D ; [.1DDD.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH MACRON +014C ; [.1DDD.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH MACRON +1E53 ; [.1DDD.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E52 ; [.1DDD.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E51 ; [.1DDD.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E50 ; [.1DDD.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1DED ; [.1DDD.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE +1ECF ; [.1DDD.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HOOK ABOVE +1ECE ; [.1DDD.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HOOK ABOVE +020D ; [.1DDD.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER O WITH DOUBLE GRAVE +020C ; [.1DDD.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020F ; [.1DDD.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER O WITH INVERTED BREVE +020E ; [.1DDD.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER O WITH INVERTED BREVE +01A1 ; [.1DDD.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER O WITH HORN +01A0 ; [.1DDD.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER O WITH HORN +1EDB ; [.1DDD.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDA ; [.1DDD.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDD ; [.1DDD.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDC ; [.1DDD.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EE1 ; [.1DDD.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH HORN AND TILDE +1EE0 ; [.1DDD.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EDF ; [.1DDD.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EDE ; [.1DDD.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE3 ; [.1DDD.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE2 ; [.1DDD.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1ECD ; [.1DDD.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH DOT BELOW +1ECC ; [.1DDD.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH DOT BELOW +1ED9 ; [.1DDD.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED8 ; [.1DDD.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +0153 ; [.1DDD.0020.0004][.0000.0110.0004][.1CAA.0020.0004] # LATIN SMALL LIGATURE OE +0152 ; [.1DDD.0020.000A][.0000.0110.0004][.1CAA.0020.000A] # LATIN CAPITAL LIGATURE OE +A7F9 ; [.1DDD.0020.0014][.0000.0110.0014][.1CAA.0020.0014] # MODIFIER LETTER SMALL LIGATURE OE +1F197 ; [.1DDD.0020.001D][.1D65.0020.001D] # SQUARED OK +A74F ; [.1DDD.0020.0004][.1DDD.0020.0004] # LATIN SMALL LETTER OO +A74E ; [.1DDD.0020.000A][.1DDD.0020.000A] # LATIN CAPITAL LETTER OO +3375 ; [.1DDD.0020.001C][.1EE3.0020.001D] # SQUARE OV +1D0F ; [.1DE1.0020.0002] # LATIN LETTER SMALL CAPITAL O +1D11 ; [.1DE2.0020.0002] # LATIN SMALL LETTER SIDEWAYS O +AB3D ; [.1DE3.0020.0002] # LATIN SMALL LETTER BLACKLETTER O +0276 ; [.1DE4.0020.0002] # LATIN LETTER SMALL CAPITAL OE +1D14 ; [.1DE8.0020.0002] # LATIN SMALL LETTER TURNED OE +AB41 ; [.1DE9.0020.0002] # LATIN SMALL LETTER TURNED OE WITH STROKE +AB42 ; [.1DEA.0020.0002] # LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE +AB40 ; [.1DEB.0020.0002] # LATIN SMALL LETTER INVERTED OE +AB43 ; [.1DEC.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O +AB44 ; [.1DED.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE +1D13 ; [.1DEE.0020.0002] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE +AB3E ; [.1DEF.0020.0002] # LATIN SMALL LETTER BLACKLETTER O WITH STROKE +0254 ; [.1DF0.0020.0002] # LATIN SMALL LETTER OPEN O +0186 ; [.1DF0.0020.0008] # LATIN CAPITAL LETTER OPEN O +1D53 ; [.1DF0.0020.0014] # MODIFIER LETTER SMALL OPEN O +1D10 ; [.1DF4.0020.0002] # LATIN LETTER SMALL CAPITAL OPEN O +1D12 ; [.1DF5.0020.0002] # LATIN SMALL LETTER SIDEWAYS OPEN O +AB3F ; [.1DF6.0020.0002] # LATIN SMALL LETTER OPEN O WITH STROKE +1D97 ; [.1DF7.0020.0002] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK +AB62 ; [.1DF8.0020.0002] # LATIN SMALL LETTER OPEN OE +A74D ; [.1DF9.0020.0002] # LATIN SMALL LETTER O WITH LOOP +A74C ; [.1DF9.0020.0008] # LATIN CAPITAL LETTER O WITH LOOP +1D16 ; [.1DFA.0020.0002] # LATIN SMALL LETTER TOP HALF O +1D54 ; [.1DFA.0020.0014] # MODIFIER LETTER SMALL TOP HALF O +1D17 ; [.1DFB.0020.0002] # LATIN SMALL LETTER BOTTOM HALF O +1D55 ; [.1DFB.0020.0014] # MODIFIER LETTER SMALL BOTTOM HALF O +2C7A ; [.1DFC.0020.0002] # LATIN SMALL LETTER O WITH LOW RING INSIDE +0275 ; [.1DFD.0020.0002] # LATIN SMALL LETTER BARRED O +019F ; [.1DFD.0020.0008] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +1DB1 ; [.1DFD.0020.0014] # MODIFIER LETTER SMALL BARRED O +A74B ; [.1E01.0020.0002] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +A74A ; [.1E01.0020.0008] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +0277 ; [.1E02.0020.0002] # LATIN SMALL LETTER CLOSED OMEGA +A7B7 ; [.1E06.0020.0002] # LATIN SMALL LETTER OMEGA +A7B6 ; [.1E06.0020.0008] # LATIN CAPITAL LETTER OMEGA +0223 ; [.1E07.0020.0002] # LATIN SMALL LETTER OU +0222 ; [.1E07.0020.0008] # LATIN CAPITAL LETTER OU +1D3D ; [.1E07.0020.001D] # MODIFIER LETTER CAPITAL OU +1D15 ; [.1E0B.0020.0002] # LATIN LETTER SMALL CAPITAL OU +0070 ; [.1E0C.0020.0002] # LATIN SMALL LETTER P +FF50 ; [.1E0C.0020.0003] # FULLWIDTH LATIN SMALL LETTER P +1DEE ; [.1E0C.0020.0004] # COMBINING LATIN SMALL LETTER P +24AB ; [*0317.0020.0004][.1E0C.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER P +1D429 ; [.1E0C.0020.0005] # MATHEMATICAL BOLD SMALL P +1D45D ; [.1E0C.0020.0005] # MATHEMATICAL ITALIC SMALL P +1D491 ; [.1E0C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL P +1D4C5 ; [.1E0C.0020.0005] # MATHEMATICAL SCRIPT SMALL P +1D4F9 ; [.1E0C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL P +1D52D ; [.1E0C.0020.0005] # MATHEMATICAL FRAKTUR SMALL P +1D561 ; [.1E0C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL P +1D595 ; [.1E0C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL P +1D5C9 ; [.1E0C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL P +1D5FD ; [.1E0C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL P +1D631 ; [.1E0C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D665 ; [.1E0C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D699 ; [.1E0C.0020.0005] # MATHEMATICAL MONOSPACE SMALL P +24DF ; [.1E0C.0020.0006] # CIRCLED LATIN SMALL LETTER P +0050 ; [.1E0C.0020.0008] # LATIN CAPITAL LETTER P +FF30 ; [.1E0C.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER P +1F11F ; [*0317.0020.0004][.1E0C.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER P +2119 ; [.1E0C.0020.000B] # DOUBLE-STRUCK CAPITAL P +1D40F ; [.1E0C.0020.000B] # MATHEMATICAL BOLD CAPITAL P +1D443 ; [.1E0C.0020.000B] # MATHEMATICAL ITALIC CAPITAL P +1D477 ; [.1E0C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL P +1D4AB ; [.1E0C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL P +1D4DF ; [.1E0C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL P +1D513 ; [.1E0C.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL P +1D57B ; [.1E0C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D5AF ; [.1E0C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL P +1D5E3 ; [.1E0C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D617 ; [.1E0C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D64B ; [.1E0C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D67F ; [.1E0C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL P +24C5 ; [.1E0C.0020.000C] # CIRCLED LATIN CAPITAL LETTER P +1F15F ; [.1E0C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P +1D56 ; [.1E0C.0020.0014] # MODIFIER LETTER SMALL P +209A ; [.1E0C.0020.0015] # LATIN SUBSCRIPT SMALL LETTER P +1D3E ; [.1E0C.0020.001D] # MODIFIER LETTER CAPITAL P +1F13F ; [.1E0C.0020.001D] # SQUARED LATIN CAPITAL LETTER P +1F17F ; [.1E0C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER P +1F18A ; [.1E0C.0020.001D] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P +1E55 ; [.1E0C.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER P WITH ACUTE +1E54 ; [.1E0C.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER P WITH ACUTE +1E57 ; [.1E0C.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER P WITH DOT ABOVE +1E56 ; [.1E0C.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER P WITH DOT ABOVE +3380 ; [.1E0C.0020.001C][.1C47.0020.001D] # SQUARE PA AMPS +33A9 ; [.1E0C.0020.001D][.1C47.0020.001C] # SQUARE PA +1F18C ; [.1E0C.0020.001D][.1C47.0020.001D] # NEGATIVE SQUARED PA +3376 ; [.1E0C.0020.001C][.1C7A.0020.001C] # SQUARE PC +338A ; [.1E0C.0020.001C][.1CE5.0020.001D] # SQUARE PF +33D7 ; [.1E0C.0020.001D][.1D18.0020.001D] # SQUARE PH +33D8 ; [.1E0C.0020.001C][*0277.0020.001C][.1DAA.0020.001C][*0277.0020.001C] # SQUARE PM +33D9 ; [.1E0C.0020.001D][.1E0C.0020.001D][.1DAA.0020.001D] # SQUARE PPM +1F14E ; [.1E0C.0020.001D][.1E0C.0020.001D][.1EE3.0020.001D] # SQUARED PPV +33DA ; [.1E0C.0020.001D][.1E33.0020.001D] # SQUARE PR +33B0 ; [.1E0C.0020.001C][.1E71.0020.001C] # SQUARE PS +3250 ; [.1E0C.0020.001D][.1E95.0020.001D][.1CAA.0020.001D] # PARTNERSHIP SIGN +33B4 ; [.1E0C.0020.001C][.1EE3.0020.001D] # SQUARE PV +33BA ; [.1E0C.0020.001C][.1EF5.0020.001D] # SQUARE PW +1D18 ; [.1E10.0020.0002] # LATIN LETTER SMALL CAPITAL P +1D7D ; [.1E11.0020.0002] # LATIN SMALL LETTER P WITH STROKE +2C63 ; [.1E11.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE +A751 ; [.1E12.0020.0002] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +A750 ; [.1E12.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +1D71 ; [.1E13.0020.0002] # LATIN SMALL LETTER P WITH MIDDLE TILDE +1D88 ; [.1E14.0020.0002] # LATIN SMALL LETTER P WITH PALATAL HOOK +01A5 ; [.1E15.0020.0002] # LATIN SMALL LETTER P WITH HOOK +01A4 ; [.1E15.0020.0008] # LATIN CAPITAL LETTER P WITH HOOK +A753 ; [.1E19.0020.0002] # LATIN SMALL LETTER P WITH FLOURISH +A752 ; [.1E19.0020.0008] # LATIN CAPITAL LETTER P WITH FLOURISH +A755 ; [.1E1A.0020.0002] # LATIN SMALL LETTER P WITH SQUIRREL TAIL +A754 ; [.1E1A.0020.0008] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A7FC ; [.1E1B.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED P +0278 ; [.1E1C.0020.0002] # LATIN SMALL LETTER PHI +1DB2 ; [.1E1C.0020.0014] # MODIFIER LETTER SMALL PHI +2C77 ; [.1E20.0020.0002] # LATIN SMALL LETTER TAILLESS PHI +0071 ; [.1E21.0020.0002] # LATIN SMALL LETTER Q +FF51 ; [.1E21.0020.0003] # FULLWIDTH LATIN SMALL LETTER Q +24AC ; [*0317.0020.0004][.1E21.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Q +1D42A ; [.1E21.0020.0005] # MATHEMATICAL BOLD SMALL Q +1D45E ; [.1E21.0020.0005] # MATHEMATICAL ITALIC SMALL Q +1D492 ; [.1E21.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Q +1D4C6 ; [.1E21.0020.0005] # MATHEMATICAL SCRIPT SMALL Q +1D4FA ; [.1E21.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Q +1D52E ; [.1E21.0020.0005] # MATHEMATICAL FRAKTUR SMALL Q +1D562 ; [.1E21.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D596 ; [.1E21.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Q +1D5CA ; [.1E21.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Q +1D5FE ; [.1E21.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D632 ; [.1E21.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D666 ; [.1E21.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D69A ; [.1E21.0020.0005] # MATHEMATICAL MONOSPACE SMALL Q +24E0 ; [.1E21.0020.0006] # CIRCLED LATIN SMALL LETTER Q +0051 ; [.1E21.0020.0008] # LATIN CAPITAL LETTER Q +FF31 ; [.1E21.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Q +1F120 ; [*0317.0020.0004][.1E21.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Q +211A ; [.1E21.0020.000B] # DOUBLE-STRUCK CAPITAL Q +1D410 ; [.1E21.0020.000B] # MATHEMATICAL BOLD CAPITAL Q +1D444 ; [.1E21.0020.000B] # MATHEMATICAL ITALIC CAPITAL Q +1D478 ; [.1E21.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Q +1D4AC ; [.1E21.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Q +1D4E0 ; [.1E21.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D514 ; [.1E21.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Q +1D57C ; [.1E21.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D5B0 ; [.1E21.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Q +1D5E4 ; [.1E21.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D618 ; [.1E21.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D64C ; [.1E21.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D680 ; [.1E21.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Q +24C6 ; [.1E21.0020.000C] # CIRCLED LATIN CAPITAL LETTER Q +1F160 ; [.1E21.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Q +1F140 ; [.1E21.0020.001D] # SQUARED LATIN CAPITAL LETTER Q +1F180 ; [.1E21.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Q +0239 ; [.1E21.0020.0004][.1E0C.0020.0004] # LATIN SMALL LETTER QP DIGRAPH +A757 ; [.1E25.0020.0002] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +A756 ; [.1E25.0020.0008] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A759 ; [.1E26.0020.0002] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE +A758 ; [.1E26.0020.0008] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +02A0 ; [.1E27.0020.0002] # LATIN SMALL LETTER Q WITH HOOK +024B ; [.1E2B.0020.0002] # LATIN SMALL LETTER Q WITH HOOK TAIL +024A ; [.1E2B.0020.0008] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +0138 ; [.1E2F.0020.0002] # LATIN SMALL LETTER KRA +0072 ; [.1E33.0020.0002] # LATIN SMALL LETTER R +FF52 ; [.1E33.0020.0003] # FULLWIDTH LATIN SMALL LETTER R +036C ; [.1E33.0020.0004] # COMBINING LATIN SMALL LETTER R +1DCA ; [.1E33.0020.0004] # COMBINING LATIN SMALL LETTER R BELOW +24AD ; [*0317.0020.0004][.1E33.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER R +1D42B ; [.1E33.0020.0005] # MATHEMATICAL BOLD SMALL R +1D45F ; [.1E33.0020.0005] # MATHEMATICAL ITALIC SMALL R +1D493 ; [.1E33.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL R +1D4C7 ; [.1E33.0020.0005] # MATHEMATICAL SCRIPT SMALL R +1D4FB ; [.1E33.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL R +1D52F ; [.1E33.0020.0005] # MATHEMATICAL FRAKTUR SMALL R +1D563 ; [.1E33.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL R +1D597 ; [.1E33.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL R +1D5CB ; [.1E33.0020.0005] # MATHEMATICAL SANS-SERIF SMALL R +1D5FF ; [.1E33.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL R +1D633 ; [.1E33.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D667 ; [.1E33.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D69B ; [.1E33.0020.0005] # MATHEMATICAL MONOSPACE SMALL R +24E1 ; [.1E33.0020.0006] # CIRCLED LATIN SMALL LETTER R +0052 ; [.1E33.0020.0008] # LATIN CAPITAL LETTER R +FF32 ; [.1E33.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER R +1F121 ; [*0317.0020.0004][.1E33.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER R +211B ; [.1E33.0020.000B] # SCRIPT CAPITAL R +211C ; [.1E33.0020.000B] # BLACK-LETTER CAPITAL R +211D ; [.1E33.0020.000B] # DOUBLE-STRUCK CAPITAL R +1D411 ; [.1E33.0020.000B] # MATHEMATICAL BOLD CAPITAL R +1D445 ; [.1E33.0020.000B] # MATHEMATICAL ITALIC CAPITAL R +1D479 ; [.1E33.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL R +1D4E1 ; [.1E33.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL R +1D57D ; [.1E33.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D5B1 ; [.1E33.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL R +1D5E5 ; [.1E33.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D619 ; [.1E33.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D64D ; [.1E33.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D681 ; [.1E33.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL R +24C7 ; [.1E33.0020.000C] # CIRCLED LATIN CAPITAL LETTER R +1F12C ; [.1E33.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER R +1F161 ; [.1E33.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER R +02B3 ; [.1E33.0020.0014] # MODIFIER LETTER SMALL R +1D63 ; [.1E33.0020.0015] # LATIN SUBSCRIPT SMALL LETTER R +1D3F ; [.1E33.0020.001D] # MODIFIER LETTER CAPITAL R +1F141 ; [.1E33.0020.001D] # SQUARED LATIN CAPITAL LETTER R +1F181 ; [.1E33.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER R +0155 ; [.1E33.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER R WITH ACUTE +0154 ; [.1E33.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER R WITH ACUTE +0159 ; [.1E33.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER R WITH CARON +0158 ; [.1E33.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER R WITH CARON +1E59 ; [.1E33.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER R WITH DOT ABOVE +1E58 ; [.1E33.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER R WITH DOT ABOVE +0157 ; [.1E33.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER R WITH CEDILLA +0156 ; [.1E33.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER R WITH CEDILLA +A7A7 ; [.1E33.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER R WITH OBLIQUE STROKE +A7A6 ; [.1E33.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +0211 ; [.1E33.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER R WITH DOUBLE GRAVE +0210 ; [.1E33.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0213 ; [.1E33.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER R WITH INVERTED BREVE +0212 ; [.1E33.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER R WITH INVERTED BREVE +1E5B ; [.1E33.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER R WITH DOT BELOW +1E5A ; [.1E33.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5D ; [.1E33.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5C ; [.1E33.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5F ; [.1E33.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER R WITH LINE BELOW +1E5E ; [.1E33.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER R WITH LINE BELOW +A783 ; [.1E33.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR R +A782 ; [.1E33.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR R +33AD ; [.1E33.0020.001C][.1C47.0020.001C][.1C8F.0020.001C] # SQUARE RAD +33AE ; [.1E33.0020.001C][.1C47.0020.001C][.1C8F.0020.001C][*0625.0020.001C][.1E71.0020.001C] # SQUARE RAD OVER S +33AF ; [.1E33.0020.001C][.1C47.0020.001C][.1C8F.0020.001C][*0625.0020.001C][.1E71.0020.001C][.1C3F.0020.001C] # SQUARE RAD OVER S SQUARED +20A8 ; [.1E33.0020.000A][.1E71.0020.0004] # RUPEE SIGN +AB45 ; [.1E37.0020.0002] # LATIN SMALL LETTER STIRRUP R +0280 ; [.1E38.0020.0002] # LATIN LETTER SMALL CAPITAL R +1DE2 ; [.1E38.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL R +01A6 ; [.1E38.0020.0008] # LATIN LETTER YR +AB46 ; [.1E3C.0020.0002] # LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG +A75B ; [.1E3D.0020.0002] # LATIN SMALL LETTER R ROTUNDA +1DE3 ; [.1E3D.0020.0004] # COMBINING LATIN SMALL LETTER R ROTUNDA +A75A ; [.1E3D.0020.0008] # LATIN CAPITAL LETTER R ROTUNDA +1D19 ; [.1E3E.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED R +024D ; [.1E3F.0020.0002] # LATIN SMALL LETTER R WITH STROKE +024C ; [.1E3F.0020.0008] # LATIN CAPITAL LETTER R WITH STROKE +1D72 ; [.1E43.0020.0002] # LATIN SMALL LETTER R WITH MIDDLE TILDE +0279 ; [.1E44.0020.0002] # LATIN SMALL LETTER TURNED R +02B4 ; [.1E44.0020.0014] # MODIFIER LETTER SMALL TURNED R +1D1A ; [.1E48.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED R +027A ; [.1E49.0020.0002] # LATIN SMALL LETTER TURNED R WITH LONG LEG +1D89 ; [.1E4D.0020.0002] # LATIN SMALL LETTER R WITH PALATAL HOOK +027B ; [.1E4E.0020.0002] # LATIN SMALL LETTER TURNED R WITH HOOK +02B5 ; [.1E4E.0020.0014] # MODIFIER LETTER SMALL TURNED R WITH HOOK +2C79 ; [.1E52.0020.0002] # LATIN SMALL LETTER TURNED R WITH TAIL +027C ; [.1E53.0020.0002] # LATIN SMALL LETTER R WITH LONG LEG +027D ; [.1E57.0020.0002] # LATIN SMALL LETTER R WITH TAIL +2C64 ; [.1E57.0020.0008] # LATIN CAPITAL LETTER R WITH TAIL +AB49 ; [.1E5B.0020.0002] # LATIN SMALL LETTER R WITH CROSSED-TAIL +027E ; [.1E5C.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK +1D73 ; [.1E60.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE +027F ; [.1E61.0020.0002] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK +AB47 ; [.1E65.0020.0002] # LATIN SMALL LETTER R WITHOUT HANDLE +AB48 ; [.1E66.0020.0002] # LATIN SMALL LETTER DOUBLE R +AB4A ; [.1E67.0020.0002] # LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL +AB4B ; [.1E68.0020.0002] # LATIN SMALL LETTER SCRIPT R +AB4C ; [.1E69.0020.0002] # LATIN SMALL LETTER SCRIPT R WITH RING +0281 ; [.1E6A.0020.0002] # LATIN LETTER SMALL CAPITAL INVERTED R +02B6 ; [.1E6A.0020.0014] # MODIFIER LETTER SMALL CAPITAL INVERTED R +A775 ; [.1E6E.0020.0002] # LATIN SMALL LETTER RUM +A776 ; [.1E6F.0020.0002] # LATIN LETTER SMALL CAPITAL RUM +A75D ; [.1E70.0020.0002] # LATIN SMALL LETTER RUM ROTUNDA +A75C ; [.1E70.0020.0008] # LATIN CAPITAL LETTER RUM ROTUNDA +0073 ; [.1E71.0020.0002] # LATIN SMALL LETTER S +FF53 ; [.1E71.0020.0003] # FULLWIDTH LATIN SMALL LETTER S +1DE4 ; [.1E71.0020.0004] # COMBINING LATIN SMALL LETTER S +24AE ; [*0317.0020.0004][.1E71.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER S +1D42C ; [.1E71.0020.0005] # MATHEMATICAL BOLD SMALL S +1D460 ; [.1E71.0020.0005] # MATHEMATICAL ITALIC SMALL S +1D494 ; [.1E71.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL S +1D4C8 ; [.1E71.0020.0005] # MATHEMATICAL SCRIPT SMALL S +1D4FC ; [.1E71.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL S +1D530 ; [.1E71.0020.0005] # MATHEMATICAL FRAKTUR SMALL S +1D564 ; [.1E71.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL S +1D598 ; [.1E71.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL S +1D5CC ; [.1E71.0020.0005] # MATHEMATICAL SANS-SERIF SMALL S +1D600 ; [.1E71.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL S +1D634 ; [.1E71.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D668 ; [.1E71.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D69C ; [.1E71.0020.0005] # MATHEMATICAL MONOSPACE SMALL S +24E2 ; [.1E71.0020.0006] # CIRCLED LATIN SMALL LETTER S +0053 ; [.1E71.0020.0008] # LATIN CAPITAL LETTER S +FF33 ; [.1E71.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER S +1F122 ; [*0317.0020.0004][.1E71.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER S +1F12A ; [*0379.0020.0004][.1E71.0020.000A][*037A.0020.0004] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S +1D412 ; [.1E71.0020.000B] # MATHEMATICAL BOLD CAPITAL S +1D446 ; [.1E71.0020.000B] # MATHEMATICAL ITALIC CAPITAL S +1D47A ; [.1E71.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL S +1D4AE ; [.1E71.0020.000B] # MATHEMATICAL SCRIPT CAPITAL S +1D4E2 ; [.1E71.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL S +1D516 ; [.1E71.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL S +1D54A ; [.1E71.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D57E ; [.1E71.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D5B2 ; [.1E71.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL S +1D5E6 ; [.1E71.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D61A ; [.1E71.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D64E ; [.1E71.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D682 ; [.1E71.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL S +24C8 ; [.1E71.0020.000C] # CIRCLED LATIN CAPITAL LETTER S +1F162 ; [.1E71.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER S +02E2 ; [.1E71.0020.0014] # MODIFIER LETTER SMALL S +209B ; [.1E71.0020.0015] # LATIN SUBSCRIPT SMALL LETTER S +1F142 ; [.1E71.0020.001D] # SQUARED LATIN CAPITAL LETTER S +1F182 ; [.1E71.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER S +015B ; [.1E71.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER S WITH ACUTE +015A ; [.1E71.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER S WITH ACUTE +1E65 ; [.1E71.0020.0002][.0000.0024.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E64 ; [.1E71.0020.0008][.0000.0024.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +015D ; [.1E71.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER S WITH CIRCUMFLEX +015C ; [.1E71.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0161 ; [.1E71.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER S WITH CARON +0160 ; [.1E71.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER S WITH CARON +1E67 ; [.1E71.0020.0002][.0000.0028.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E66 ; [.1E71.0020.0008][.0000.0028.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E61 ; [.1E71.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT ABOVE +1E60 ; [.1E71.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT ABOVE +015F ; [.1E71.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER S WITH CEDILLA +015E ; [.1E71.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER S WITH CEDILLA +A7A9 ; [.1E71.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER S WITH OBLIQUE STROKE +A7A8 ; [.1E71.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +1E63 ; [.1E71.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER S WITH DOT BELOW +1E62 ; [.1E71.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW +1E69 ; [.1E71.0020.0002][.0000.0042.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E68 ; [.1E71.0020.0008][.0000.0042.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +0219 ; [.1E71.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER S WITH COMMA BELOW +0218 ; [.1E71.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER S WITH COMMA BELOW +017F ; [.1E71.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER LONG S +1DE5 ; [.1E71.0020.0004][.0000.0111.0004] # COMBINING LATIN SMALL LETTER LONG S +A785 ; [.1E71.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR S +A784 ; [.1E71.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR S +1E9B ; [.1E71.0020.0004][.0000.0111.0004][.0000.002E.0002] # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1F18D ; [.1E71.0020.001D][.1C47.0020.001D] # NEGATIVE SQUARED SA +1F14C ; [.1E71.0020.001D][.1C8F.0020.001D] # SQUARED SD +1F1AA ; [.1E71.0020.001D][.1D18.0020.001D][.1EE3.0020.001D] # SQUARED SHV +2120 ; [.1E71.0020.0014][.1DAA.0020.0014] # SERVICE MARK +1F198 ; [.1E71.0020.001D][.1DDD.0020.001D][.1E71.0020.001D] # SQUARED SOS +33DB ; [.1E71.0020.001C][.1E33.0020.001C] # SQUARE SR +1F14D ; [.1E71.0020.001D][.1E71.0020.001D] # SQUARED SS +00DF ; [.1E71.0020.0004][.0000.0110.0004][.1E71.0020.0004] # LATIN SMALL LETTER SHARP S +1E9E ; [.1E71.0020.000A][.0000.0110.0004][.1E71.0020.000A] # LATIN CAPITAL LETTER SHARP S +FB06 ; [.1E71.0020.0004][.1E95.0020.0004] # LATIN SMALL LIGATURE ST +FB05 ; [.1E71.0020.0004][.0000.0111.0004][.1E95.0020.0004] # LATIN SMALL LIGATURE LONG S T +33DC ; [.1E71.0020.001D][.1EE3.0020.001C] # SQUARE SV +A731 ; [.1E75.0020.0002] # LATIN LETTER SMALL CAPITAL S +1D74 ; [.1E76.0020.0002] # LATIN SMALL LETTER S WITH MIDDLE TILDE +1D8A ; [.1E77.0020.0002] # LATIN SMALL LETTER S WITH PALATAL HOOK +0282 ; [.1E78.0020.0002] # LATIN SMALL LETTER S WITH HOOK +1DB3 ; [.1E78.0020.0014] # MODIFIER LETTER SMALL S WITH HOOK +023F ; [.1E7C.0020.0002] # LATIN SMALL LETTER S WITH SWASH TAIL +2C7E ; [.1E7C.0020.0008] # LATIN CAPITAL LETTER S WITH SWASH TAIL +1E9C ; [.1E80.0020.0002] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE +1E9D ; [.1E81.0020.0002] # LATIN SMALL LETTER LONG S WITH HIGH STROKE +0283 ; [.1E82.0020.0002] # LATIN SMALL LETTER ESH +1DEF ; [.1E82.0020.0004] # COMBINING LATIN SMALL LETTER ESH +01A9 ; [.1E82.0020.0008] # LATIN CAPITAL LETTER ESH +1DB4 ; [.1E82.0020.0014] # MODIFIER LETTER SMALL ESH +AB4D ; [.1E86.0020.0002] # LATIN SMALL LETTER BASELINE ESH +1D8B ; [.1E87.0020.0002] # LATIN SMALL LETTER ESH WITH PALATAL HOOK +01AA ; [.1E88.0020.0002] # LATIN LETTER REVERSED ESH LOOP +0285 ; [.1E8C.0020.0002] # LATIN SMALL LETTER SQUAT REVERSED ESH +1D98 ; [.1E90.0020.0002] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK +0286 ; [.1E91.0020.0002] # LATIN SMALL LETTER ESH WITH CURL +0074 ; [.1E95.0020.0002] # LATIN SMALL LETTER T +FF54 ; [.1E95.0020.0003] # FULLWIDTH LATIN SMALL LETTER T +036D ; [.1E95.0020.0004] # COMBINING LATIN SMALL LETTER T +24AF ; [*0317.0020.0004][.1E95.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER T +1D42D ; [.1E95.0020.0005] # MATHEMATICAL BOLD SMALL T +1D461 ; [.1E95.0020.0005] # MATHEMATICAL ITALIC SMALL T +1D495 ; [.1E95.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL T +1D4C9 ; [.1E95.0020.0005] # MATHEMATICAL SCRIPT SMALL T +1D4FD ; [.1E95.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL T +1D531 ; [.1E95.0020.0005] # MATHEMATICAL FRAKTUR SMALL T +1D565 ; [.1E95.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL T +1D599 ; [.1E95.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL T +1D5CD ; [.1E95.0020.0005] # MATHEMATICAL SANS-SERIF SMALL T +1D601 ; [.1E95.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL T +1D635 ; [.1E95.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D669 ; [.1E95.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D69D ; [.1E95.0020.0005] # MATHEMATICAL MONOSPACE SMALL T +24E3 ; [.1E95.0020.0006] # CIRCLED LATIN SMALL LETTER T +0054 ; [.1E95.0020.0008] # LATIN CAPITAL LETTER T +FF34 ; [.1E95.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER T +1F123 ; [*0317.0020.0004][.1E95.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER T +1D413 ; [.1E95.0020.000B] # MATHEMATICAL BOLD CAPITAL T +1D447 ; [.1E95.0020.000B] # MATHEMATICAL ITALIC CAPITAL T +1D47B ; [.1E95.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL T +1D4AF ; [.1E95.0020.000B] # MATHEMATICAL SCRIPT CAPITAL T +1D4E3 ; [.1E95.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL T +1D517 ; [.1E95.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL T +1D54B ; [.1E95.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D57F ; [.1E95.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D5B3 ; [.1E95.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL T +1D5E7 ; [.1E95.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D61B ; [.1E95.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D64F ; [.1E95.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D683 ; [.1E95.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL T +24C9 ; [.1E95.0020.000C] # CIRCLED LATIN CAPITAL LETTER T +1F163 ; [.1E95.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER T +1D57 ; [.1E95.0020.0014] # MODIFIER LETTER SMALL T +209C ; [.1E95.0020.0015] # LATIN SUBSCRIPT SMALL LETTER T +1D40 ; [.1E95.0020.001D] # MODIFIER LETTER CAPITAL T +1F143 ; [.1E95.0020.001D] # SQUARED LATIN CAPITAL LETTER T +1F183 ; [.1E95.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER T +0165 ; [.1E95.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER T WITH CARON +0164 ; [.1E95.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER T WITH CARON +1E97 ; [.1E95.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER T WITH DIAERESIS +1E6B ; [.1E95.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER T WITH DOT ABOVE +1E6A ; [.1E95.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER T WITH DOT ABOVE +0163 ; [.1E95.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER T WITH CEDILLA +0162 ; [.1E95.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER T WITH CEDILLA +1E6D ; [.1E95.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER T WITH DOT BELOW +1E6C ; [.1E95.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER T WITH DOT BELOW +021B ; [.1E95.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER T WITH COMMA BELOW +021A ; [.1E95.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER T WITH COMMA BELOW +1E71 ; [.1E95.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E70 ; [.1E95.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E6F ; [.1E95.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER T WITH LINE BELOW +1E6E ; [.1E95.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER T WITH LINE BELOW +A787 ; [.1E95.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR T +A786 ; [.1E95.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR T +02A8 ; [.1E95.0020.0004][.1C89.0020.0004] # LATIN SMALL LETTER TC DIGRAPH WITH CURL +2121 ; [.1E95.0020.000A][.1CAA.0020.000A][.1D77.0020.000A] # TELEPHONE SIGN +1D7A ; [.1E95.0020.0004][.0000.0110.0004][.1D18.0020.0004] # LATIN SMALL LETTER TH WITH STRIKETHROUGH +3394 ; [.1E95.0020.001D][.1D18.0020.001D][.1F21.0020.001C] # SQUARE THZ +2122 ; [.1E95.0020.0014][.1DAA.0020.0014] # TRADE MARK SIGN +01BE ; [.1E95.0020.0004][.1E71.0020.0004] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE +02A6 ; [.1E95.0020.0004][.1E71.0020.0004] # LATIN SMALL LETTER TS DIGRAPH +02A7 ; [.1E95.0020.0004][.1E82.0020.0004] # LATIN SMALL LETTER TESH DIGRAPH +A729 ; [.1E95.0020.0004][.1F21.0020.0004] # LATIN SMALL LETTER TZ +A728 ; [.1E95.0020.000A][.1F21.0020.0004] # LATIN CAPITAL LETTER TZ +1D1B ; [.1E99.0020.0002] # LATIN LETTER SMALL CAPITAL T +0167 ; [.1E9A.0020.0002] # LATIN SMALL LETTER T WITH STROKE +0166 ; [.1E9A.0020.0008] # LATIN CAPITAL LETTER T WITH STROKE +2C66 ; [.1E9E.0020.0002] # LATIN SMALL LETTER T WITH DIAGONAL STROKE +023E ; [.1E9E.0020.0008] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +1D75 ; [.1E9F.0020.0002] # LATIN SMALL LETTER T WITH MIDDLE TILDE +01AB ; [.1EA0.0020.0002] # LATIN SMALL LETTER T WITH PALATAL HOOK +1DB5 ; [.1EA0.0020.0014] # MODIFIER LETTER SMALL T WITH PALATAL HOOK +01AD ; [.1EA4.0020.0002] # LATIN SMALL LETTER T WITH HOOK +01AC ; [.1EA4.0020.0008] # LATIN CAPITAL LETTER T WITH HOOK +0288 ; [.1EA8.0020.0002] # LATIN SMALL LETTER T WITH RETROFLEX HOOK +01AE ; [.1EA8.0020.0008] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +0236 ; [.1EAC.0020.0002] # LATIN SMALL LETTER T WITH CURL +A777 ; [.1EB0.0020.0002] # LATIN SMALL LETTER TUM +0287 ; [.1EB1.0020.0002] # LATIN SMALL LETTER TURNED T +A7B1 ; [.1EB1.0020.0008] # LATIN CAPITAL LETTER TURNED T +0075 ; [.1EB5.0020.0002] # LATIN SMALL LETTER U +FF55 ; [.1EB5.0020.0003] # FULLWIDTH LATIN SMALL LETTER U +0367 ; [.1EB5.0020.0004] # COMBINING LATIN SMALL LETTER U +24B0 ; [*0317.0020.0004][.1EB5.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER U +1D42E ; [.1EB5.0020.0005] # MATHEMATICAL BOLD SMALL U +1D462 ; [.1EB5.0020.0005] # MATHEMATICAL ITALIC SMALL U +1D496 ; [.1EB5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL U +1D4CA ; [.1EB5.0020.0005] # MATHEMATICAL SCRIPT SMALL U +1D4FE ; [.1EB5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL U +1D532 ; [.1EB5.0020.0005] # MATHEMATICAL FRAKTUR SMALL U +1D566 ; [.1EB5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL U +1D59A ; [.1EB5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL U +1D5CE ; [.1EB5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL U +1D602 ; [.1EB5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL U +1D636 ; [.1EB5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D66A ; [.1EB5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D69E ; [.1EB5.0020.0005] # MATHEMATICAL MONOSPACE SMALL U +24E4 ; [.1EB5.0020.0006] # CIRCLED LATIN SMALL LETTER U +0055 ; [.1EB5.0020.0008] # LATIN CAPITAL LETTER U +FF35 ; [.1EB5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER U +1F124 ; [*0317.0020.0004][.1EB5.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER U +1D414 ; [.1EB5.0020.000B] # MATHEMATICAL BOLD CAPITAL U +1D448 ; [.1EB5.0020.000B] # MATHEMATICAL ITALIC CAPITAL U +1D47C ; [.1EB5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL U +1D4B0 ; [.1EB5.0020.000B] # MATHEMATICAL SCRIPT CAPITAL U +1D4E4 ; [.1EB5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL U +1D518 ; [.1EB5.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL U +1D54C ; [.1EB5.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D580 ; [.1EB5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D5B4 ; [.1EB5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL U +1D5E8 ; [.1EB5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D61C ; [.1EB5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D650 ; [.1EB5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D684 ; [.1EB5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL U +24CA ; [.1EB5.0020.000C] # CIRCLED LATIN CAPITAL LETTER U +1F164 ; [.1EB5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER U +1D58 ; [.1EB5.0020.0014] # MODIFIER LETTER SMALL U +1D64 ; [.1EB5.0020.0015] # LATIN SUBSCRIPT SMALL LETTER U +1D41 ; [.1EB5.0020.001D] # MODIFIER LETTER CAPITAL U +1F144 ; [.1EB5.0020.001D] # SQUARED LATIN CAPITAL LETTER U +1F184 ; [.1EB5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER U +00FA ; [.1EB5.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH ACUTE +00DA ; [.1EB5.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH ACUTE +00F9 ; [.1EB5.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH GRAVE +00D9 ; [.1EB5.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH GRAVE +016D ; [.1EB5.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER U WITH BREVE +016C ; [.1EB5.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER U WITH BREVE +00FB ; [.1EB5.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX +00DB ; [.1EB5.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +01D4 ; [.1EB5.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH CARON +01D3 ; [.1EB5.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH CARON +016F ; [.1EB5.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER U WITH RING ABOVE +016E ; [.1EB5.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER U WITH RING ABOVE +00FC ; [.1EB5.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH DIAERESIS +1DF4 ; [.1EB5.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER U WITH DIAERESIS +A79F ; [.1EB5.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK UE +00DC ; [.1EB5.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS +A79E ; [.1EB5.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK UE +01D8 ; [.1EB5.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D7 ; [.1EB5.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01DC ; [.1EB5.0020.0002][.0000.002B.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DB ; [.1EB5.0020.0008][.0000.002B.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DA ; [.1EB5.0020.0002][.0000.002B.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01D9 ; [.1EB5.0020.0008][.0000.002B.0002][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01D6 ; [.1EB5.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D5 ; [.1EB5.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +0171 ; [.1EB5.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0170 ; [.1EB5.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0169 ; [.1EB5.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH TILDE +0168 ; [.1EB5.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH TILDE +1E79 ; [.1EB5.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E78 ; [.1EB5.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +0173 ; [.1EB5.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER U WITH OGONEK +0172 ; [.1EB5.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER U WITH OGONEK +016B ; [.1EB5.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH MACRON +016A ; [.1EB5.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH MACRON +1E7B ; [.1EB5.0020.0002][.0000.0032.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7A ; [.1EB5.0020.0008][.0000.0032.0002][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1DF0 ; [.1EB5.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE +1EE7 ; [.1EB5.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HOOK ABOVE +1EE6 ; [.1EB5.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HOOK ABOVE +0215 ; [.1EB5.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER U WITH DOUBLE GRAVE +0214 ; [.1EB5.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0217 ; [.1EB5.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER U WITH INVERTED BREVE +0216 ; [.1EB5.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER U WITH INVERTED BREVE +01B0 ; [.1EB5.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER U WITH HORN +01AF ; [.1EB5.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER U WITH HORN +1EE9 ; [.1EB5.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH HORN AND ACUTE +1EE8 ; [.1EB5.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEB ; [.1EB5.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEA ; [.1EB5.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEF ; [.1EB5.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH HORN AND TILDE +1EEE ; [.1EB5.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EED ; [.1EB5.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEC ; [.1EB5.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EF1 ; [.1EB5.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF0 ; [.1EB5.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EE5 ; [.1EB5.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH DOT BELOW +1EE4 ; [.1EB5.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH DOT BELOW +1E73 ; [.1EB5.0020.0002][.0000.0043.0002] # LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E72 ; [.1EB5.0020.0008][.0000.0043.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E77 ; [.1EB5.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E76 ; [.1EB5.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E75 ; [.1EB5.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER U WITH TILDE BELOW +1E74 ; [.1EB5.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER U WITH TILDE BELOW +1F1AB ; [.1EB5.0020.001D][.1D18.0020.001D][.1C8F.0020.001D] # SQUARED UHD +1F199 ; [.1EB5.0020.001D][.1E0C.0020.001D][*0260.0020.001C] # SQUARED UP WITH EXCLAMATION MARK +1D1C ; [.1EB9.0020.0002] # LATIN LETTER SMALL CAPITAL U +1DB8 ; [.1EB9.0020.0014] # MODIFIER LETTER SMALL CAPITAL U +AB4E ; [.1EBA.0020.0002] # LATIN SMALL LETTER U WITH SHORT RIGHT LEG +1D1D ; [.1EBB.0020.0002] # LATIN SMALL LETTER SIDEWAYS U +1D59 ; [.1EBB.0020.0014] # MODIFIER LETTER SMALL SIDEWAYS U +1D1E ; [.1EBC.0020.0002] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U +1D6B ; [.1EBD.0020.0002] # LATIN SMALL LETTER UE +AB50 ; [.1EBE.0020.0002] # LATIN SMALL LETTER UI +AB51 ; [.1EBF.0020.0002] # LATIN SMALL LETTER TURNED UI +0289 ; [.1EC0.0020.0002] # LATIN SMALL LETTER U BAR +0244 ; [.1EC0.0020.0008] # LATIN CAPITAL LETTER U BAR +1DB6 ; [.1EC0.0020.0014] # MODIFIER LETTER SMALL U BAR +AB4F ; [.1EC4.0020.0002] # LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG +1D7E ; [.1EC5.0020.0002] # LATIN SMALL CAPITAL LETTER U WITH STROKE +1D99 ; [.1EC6.0020.0002] # LATIN SMALL LETTER U WITH RETROFLEX HOOK +AB52 ; [.1EC7.0020.0002] # LATIN SMALL LETTER U WITH LEFT HOOK +AB5F ; [.1EC7.0020.0014] # MODIFIER LETTER SMALL U WITH LEFT HOOK +0265 ; [.1EC8.0020.0002] # LATIN SMALL LETTER TURNED H +A78D ; [.1EC8.0020.0008] # LATIN CAPITAL LETTER TURNED H +1DA3 ; [.1EC8.0020.0014] # MODIFIER LETTER SMALL TURNED H +02AE ; [.1ECC.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK +02AF ; [.1ED0.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +026F ; [.1ED4.0020.0002] # LATIN SMALL LETTER TURNED M +019C ; [.1ED4.0020.0008] # LATIN CAPITAL LETTER TURNED M +1D5A ; [.1ED4.0020.0014] # MODIFIER LETTER SMALL TURNED M +A7FA ; [.1ED8.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED M +1D1F ; [.1ED9.0020.0002] # LATIN SMALL LETTER SIDEWAYS TURNED M +0270 ; [.1EDA.0020.0002] # LATIN SMALL LETTER TURNED M WITH LONG LEG +1DAD ; [.1EDA.0020.0014] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG +028A ; [.1EDE.0020.0002] # LATIN SMALL LETTER UPSILON +01B1 ; [.1EDE.0020.0008] # LATIN CAPITAL LETTER UPSILON +1DB7 ; [.1EDE.0020.0014] # MODIFIER LETTER SMALL UPSILON +1D7F ; [.1EE2.0020.0002] # LATIN SMALL LETTER UPSILON WITH STROKE +0076 ; [.1EE3.0020.0002] # LATIN SMALL LETTER V +FF56 ; [.1EE3.0020.0003] # FULLWIDTH LATIN SMALL LETTER V +036E ; [.1EE3.0020.0004] # COMBINING LATIN SMALL LETTER V +2174 ; [.1EE3.0020.0004] # SMALL ROMAN NUMERAL FIVE +24B1 ; [*0317.0020.0004][.1EE3.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER V +1D42F ; [.1EE3.0020.0005] # MATHEMATICAL BOLD SMALL V +1D463 ; [.1EE3.0020.0005] # MATHEMATICAL ITALIC SMALL V +1D497 ; [.1EE3.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL V +1D4CB ; [.1EE3.0020.0005] # MATHEMATICAL SCRIPT SMALL V +1D4FF ; [.1EE3.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL V +1D533 ; [.1EE3.0020.0005] # MATHEMATICAL FRAKTUR SMALL V +1D567 ; [.1EE3.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL V +1D59B ; [.1EE3.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL V +1D5CF ; [.1EE3.0020.0005] # MATHEMATICAL SANS-SERIF SMALL V +1D603 ; [.1EE3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL V +1D637 ; [.1EE3.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D66B ; [.1EE3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D69F ; [.1EE3.0020.0005] # MATHEMATICAL MONOSPACE SMALL V +24E5 ; [.1EE3.0020.0006] # CIRCLED LATIN SMALL LETTER V +0056 ; [.1EE3.0020.0008] # LATIN CAPITAL LETTER V +FF36 ; [.1EE3.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER V +2164 ; [.1EE3.0020.000A] # ROMAN NUMERAL FIVE +1F125 ; [*0317.0020.0004][.1EE3.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER V +1D415 ; [.1EE3.0020.000B] # MATHEMATICAL BOLD CAPITAL V +1D449 ; [.1EE3.0020.000B] # MATHEMATICAL ITALIC CAPITAL V +1D47D ; [.1EE3.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL V +1D4B1 ; [.1EE3.0020.000B] # MATHEMATICAL SCRIPT CAPITAL V +1D4E5 ; [.1EE3.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL V +1D519 ; [.1EE3.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL V +1D54D ; [.1EE3.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D581 ; [.1EE3.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D5B5 ; [.1EE3.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL V +1D5E9 ; [.1EE3.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D61D ; [.1EE3.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D651 ; [.1EE3.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D685 ; [.1EE3.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL V +24CB ; [.1EE3.0020.000C] # CIRCLED LATIN CAPITAL LETTER V +1F165 ; [.1EE3.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER V +1D5B ; [.1EE3.0020.0014] # MODIFIER LETTER SMALL V +1D65 ; [.1EE3.0020.0015] # LATIN SUBSCRIPT SMALL LETTER V +2C7D ; [.1EE3.0020.001D] # MODIFIER LETTER CAPITAL V +1F145 ; [.1EE3.0020.001D] # SQUARED LATIN CAPITAL LETTER V +1F185 ; [.1EE3.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER V +1E7D ; [.1EE3.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER V WITH TILDE +1E7C ; [.1EE3.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER V WITH TILDE +1E7F ; [.1EE3.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER V WITH DOT BELOW +1E7E ; [.1EE3.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER V WITH DOT BELOW +2175 ; [.1EE3.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL SIX +2165 ; [.1EE3.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL SIX +2176 ; [.1EE3.0020.0004][.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL SEVEN +2166 ; [.1EE3.0020.000A][.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL SEVEN +2177 ; [.1EE3.0020.0004][.1D32.0020.0004][.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL EIGHT +2167 ; [.1EE3.0020.000A][.1D32.0020.000A][.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL EIGHT +33DE ; [.1EE3.0020.001D][*0625.0020.001C][.1DAA.0020.001C] # SQUARE V OVER M +1F1AC ; [.1EE3.0020.001D][.1DDD.0020.001D][.1C8F.0020.001D] # SQUARED VOD +1F19A ; [.1EE3.0020.001D][.1E71.0020.001D] # SQUARED VS +A761 ; [.1EE3.0020.0004][.1F0B.0020.0004] # LATIN SMALL LETTER VY +A760 ; [.1EE3.0020.000A][.1F0B.0020.000A] # LATIN CAPITAL LETTER VY +1D20 ; [.1EE7.0020.0002] # LATIN LETTER SMALL CAPITAL V +A75F ; [.1EE8.0020.0002] # LATIN SMALL LETTER V WITH DIAGONAL STROKE +A75E ; [.1EE8.0020.0008] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +1D8C ; [.1EE9.0020.0002] # LATIN SMALL LETTER V WITH PALATAL HOOK +028B ; [.1EEA.0020.0002] # LATIN SMALL LETTER V WITH HOOK +01B2 ; [.1EEA.0020.0008] # LATIN CAPITAL LETTER V WITH HOOK +1DB9 ; [.1EEA.0020.0014] # MODIFIER LETTER SMALL V WITH HOOK +2C71 ; [.1EEE.0020.0002] # LATIN SMALL LETTER V WITH RIGHT HOOK +2C74 ; [.1EEF.0020.0002] # LATIN SMALL LETTER V WITH CURL +1EFD ; [.1EF0.0020.0002] # LATIN SMALL LETTER MIDDLE-WELSH V +1EFC ; [.1EF0.0020.0008] # LATIN CAPITAL LETTER MIDDLE-WELSH V +028C ; [.1EF1.0020.0002] # LATIN SMALL LETTER TURNED V +0245 ; [.1EF1.0020.0008] # LATIN CAPITAL LETTER TURNED V +1DBA ; [.1EF1.0020.0014] # MODIFIER LETTER SMALL TURNED V +0077 ; [.1EF5.0020.0002] # LATIN SMALL LETTER W +FF57 ; [.1EF5.0020.0003] # FULLWIDTH LATIN SMALL LETTER W +1DF1 ; [.1EF5.0020.0004] # COMBINING LATIN SMALL LETTER W +24B2 ; [*0317.0020.0004][.1EF5.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER W +1D430 ; [.1EF5.0020.0005] # MATHEMATICAL BOLD SMALL W +1D464 ; [.1EF5.0020.0005] # MATHEMATICAL ITALIC SMALL W +1D498 ; [.1EF5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL W +1D4CC ; [.1EF5.0020.0005] # MATHEMATICAL SCRIPT SMALL W +1D500 ; [.1EF5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL W +1D534 ; [.1EF5.0020.0005] # MATHEMATICAL FRAKTUR SMALL W +1D568 ; [.1EF5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL W +1D59C ; [.1EF5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL W +1D5D0 ; [.1EF5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL W +1D604 ; [.1EF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL W +1D638 ; [.1EF5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D66C ; [.1EF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D6A0 ; [.1EF5.0020.0005] # MATHEMATICAL MONOSPACE SMALL W +24E6 ; [.1EF5.0020.0006] # CIRCLED LATIN SMALL LETTER W +0057 ; [.1EF5.0020.0008] # LATIN CAPITAL LETTER W +FF37 ; [.1EF5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER W +1F126 ; [*0317.0020.0004][.1EF5.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER W +1D416 ; [.1EF5.0020.000B] # MATHEMATICAL BOLD CAPITAL W +1D44A ; [.1EF5.0020.000B] # MATHEMATICAL ITALIC CAPITAL W +1D47E ; [.1EF5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL W +1D4B2 ; [.1EF5.0020.000B] # MATHEMATICAL SCRIPT CAPITAL W +1D4E6 ; [.1EF5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL W +1D51A ; [.1EF5.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL W +1D54E ; [.1EF5.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D582 ; [.1EF5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D5B6 ; [.1EF5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL W +1D5EA ; [.1EF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D61E ; [.1EF5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D652 ; [.1EF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D686 ; [.1EF5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL W +24CC ; [.1EF5.0020.000C] # CIRCLED LATIN CAPITAL LETTER W +1F166 ; [.1EF5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER W +02B7 ; [.1EF5.0020.0014] # MODIFIER LETTER SMALL W +1D42 ; [.1EF5.0020.001D] # MODIFIER LETTER CAPITAL W +1F146 ; [.1EF5.0020.001D] # SQUARED LATIN CAPITAL LETTER W +1F186 ; [.1EF5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER W +1E83 ; [.1EF5.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER W WITH ACUTE +1E82 ; [.1EF5.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER W WITH ACUTE +1E81 ; [.1EF5.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER W WITH GRAVE +1E80 ; [.1EF5.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER W WITH GRAVE +0175 ; [.1EF5.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER W WITH CIRCUMFLEX +0174 ; [.1EF5.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +1E98 ; [.1EF5.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER W WITH RING ABOVE +1E85 ; [.1EF5.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER W WITH DIAERESIS +1E84 ; [.1EF5.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER W WITH DIAERESIS +1E87 ; [.1EF5.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER W WITH DOT ABOVE +1E86 ; [.1EF5.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E89 ; [.1EF5.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER W WITH DOT BELOW +1E88 ; [.1EF5.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER W WITH DOT BELOW +33DD ; [.1EF5.0020.001D][.1C60.0020.001C] # SQUARE WB +1F14F ; [.1EF5.0020.001D][.1C7A.0020.001D] # SQUARED WC +1F18F ; [.1EF5.0020.001D][.1C7A.0020.001D] # NEGATIVE SQUARED WC +1F12E ; [.1EF5.0020.000C][.1F21.0020.000C] # CIRCLED WZ +1D21 ; [.1EF9.0020.0002] # LATIN LETTER SMALL CAPITAL W +2C73 ; [.1EFA.0020.0002] # LATIN SMALL LETTER W WITH HOOK +2C72 ; [.1EFA.0020.0008] # LATIN CAPITAL LETTER W WITH HOOK +028D ; [.1EFB.0020.0002] # LATIN SMALL LETTER TURNED W +0078 ; [.1EFF.0020.0002] # LATIN SMALL LETTER X +FF58 ; [.1EFF.0020.0003] # FULLWIDTH LATIN SMALL LETTER X +036F ; [.1EFF.0020.0004] # COMBINING LATIN SMALL LETTER X +2179 ; [.1EFF.0020.0004] # SMALL ROMAN NUMERAL TEN +24B3 ; [*0317.0020.0004][.1EFF.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER X +1D431 ; [.1EFF.0020.0005] # MATHEMATICAL BOLD SMALL X +1D465 ; [.1EFF.0020.0005] # MATHEMATICAL ITALIC SMALL X +1D499 ; [.1EFF.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL X +1D4CD ; [.1EFF.0020.0005] # MATHEMATICAL SCRIPT SMALL X +1D501 ; [.1EFF.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL X +1D535 ; [.1EFF.0020.0005] # MATHEMATICAL FRAKTUR SMALL X +1D569 ; [.1EFF.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL X +1D59D ; [.1EFF.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL X +1D5D1 ; [.1EFF.0020.0005] # MATHEMATICAL SANS-SERIF SMALL X +1D605 ; [.1EFF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL X +1D639 ; [.1EFF.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D66D ; [.1EFF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D6A1 ; [.1EFF.0020.0005] # MATHEMATICAL MONOSPACE SMALL X +24E7 ; [.1EFF.0020.0006] # CIRCLED LATIN SMALL LETTER X +0058 ; [.1EFF.0020.0008] # LATIN CAPITAL LETTER X +FF38 ; [.1EFF.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER X +2169 ; [.1EFF.0020.000A] # ROMAN NUMERAL TEN +1F127 ; [*0317.0020.0004][.1EFF.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER X +1D417 ; [.1EFF.0020.000B] # MATHEMATICAL BOLD CAPITAL X +1D44B ; [.1EFF.0020.000B] # MATHEMATICAL ITALIC CAPITAL X +1D47F ; [.1EFF.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL X +1D4B3 ; [.1EFF.0020.000B] # MATHEMATICAL SCRIPT CAPITAL X +1D4E7 ; [.1EFF.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL X +1D51B ; [.1EFF.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL X +1D54F ; [.1EFF.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D583 ; [.1EFF.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D5B7 ; [.1EFF.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL X +1D5EB ; [.1EFF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D61F ; [.1EFF.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D653 ; [.1EFF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D687 ; [.1EFF.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL X +24CD ; [.1EFF.0020.000C] # CIRCLED LATIN CAPITAL LETTER X +1F167 ; [.1EFF.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER X +02E3 ; [.1EFF.0020.0014] # MODIFIER LETTER SMALL X +2093 ; [.1EFF.0020.0015] # LATIN SUBSCRIPT SMALL LETTER X +1F147 ; [.1EFF.0020.001D] # SQUARED LATIN CAPITAL LETTER X +1F187 ; [.1EFF.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER X +1E8D ; [.1EFF.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER X WITH DIAERESIS +1E8C ; [.1EFF.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8B ; [.1EFF.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER X WITH DOT ABOVE +1E8A ; [.1EFF.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER X WITH DOT ABOVE +217A ; [.1EFF.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL ELEVEN +216A ; [.1EFF.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL ELEVEN +217B ; [.1EFF.0020.0004][.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL TWELVE +216B ; [.1EFF.0020.000A][.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL TWELVE +1D8D ; [.1F03.0020.0002] # LATIN SMALL LETTER X WITH PALATAL HOOK +AB56 ; [.1F04.0020.0002] # LATIN SMALL LETTER X WITH LOW RIGHT RING +AB57 ; [.1F05.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG +AB58 ; [.1F06.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING +AB59 ; [.1F07.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF +AB53 ; [.1F08.0020.0002] # LATIN SMALL LETTER CHI +A7B3 ; [.1F08.0020.0008] # LATIN CAPITAL LETTER CHI +AB54 ; [.1F09.0020.0002] # LATIN SMALL LETTER CHI WITH LOW RIGHT RING +AB55 ; [.1F0A.0020.0002] # LATIN SMALL LETTER CHI WITH LOW LEFT SERIF +0079 ; [.1F0B.0020.0002] # LATIN SMALL LETTER Y +FF59 ; [.1F0B.0020.0003] # FULLWIDTH LATIN SMALL LETTER Y +24B4 ; [*0317.0020.0004][.1F0B.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Y +1D432 ; [.1F0B.0020.0005] # MATHEMATICAL BOLD SMALL Y +1D466 ; [.1F0B.0020.0005] # MATHEMATICAL ITALIC SMALL Y +1D49A ; [.1F0B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Y +1D4CE ; [.1F0B.0020.0005] # MATHEMATICAL SCRIPT SMALL Y +1D502 ; [.1F0B.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Y +1D536 ; [.1F0B.0020.0005] # MATHEMATICAL FRAKTUR SMALL Y +1D56A ; [.1F0B.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D59E ; [.1F0B.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Y +1D5D2 ; [.1F0B.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Y +1D606 ; [.1F0B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D63A ; [.1F0B.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D66E ; [.1F0B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D6A2 ; [.1F0B.0020.0005] # MATHEMATICAL MONOSPACE SMALL Y +24E8 ; [.1F0B.0020.0006] # CIRCLED LATIN SMALL LETTER Y +0059 ; [.1F0B.0020.0008] # LATIN CAPITAL LETTER Y +FF39 ; [.1F0B.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Y +1F128 ; [*0317.0020.0004][.1F0B.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Y +1D418 ; [.1F0B.0020.000B] # MATHEMATICAL BOLD CAPITAL Y +1D44C ; [.1F0B.0020.000B] # MATHEMATICAL ITALIC CAPITAL Y +1D480 ; [.1F0B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Y +1D4B4 ; [.1F0B.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Y +1D4E8 ; [.1F0B.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D51C ; [.1F0B.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Y +1D550 ; [.1F0B.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D584 ; [.1F0B.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D5B8 ; [.1F0B.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Y +1D5EC ; [.1F0B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D620 ; [.1F0B.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D654 ; [.1F0B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D688 ; [.1F0B.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Y +24CE ; [.1F0B.0020.000C] # CIRCLED LATIN CAPITAL LETTER Y +1F168 ; [.1F0B.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Y +02B8 ; [.1F0B.0020.0014] # MODIFIER LETTER SMALL Y +1F148 ; [.1F0B.0020.001D] # SQUARED LATIN CAPITAL LETTER Y +1F188 ; [.1F0B.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Y +00FD ; [.1F0B.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Y WITH ACUTE +00DD ; [.1F0B.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Y WITH ACUTE +1EF3 ; [.1F0B.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER Y WITH GRAVE +1EF2 ; [.1F0B.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER Y WITH GRAVE +0177 ; [.1F0B.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0176 ; [.1F0B.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +1E99 ; [.1F0B.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER Y WITH RING ABOVE +00FF ; [.1F0B.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER Y WITH DIAERESIS +0178 ; [.1F0B.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER Y WITH DIAERESIS +1EF9 ; [.1F0B.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER Y WITH TILDE +1EF8 ; [.1F0B.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER Y WITH TILDE +1E8F ; [.1F0B.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Y WITH DOT ABOVE +1E8E ; [.1F0B.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Y WITH DOT ABOVE +0233 ; [.1F0B.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER Y WITH MACRON +0232 ; [.1F0B.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER Y WITH MACRON +1EF7 ; [.1F0B.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF6 ; [.1F0B.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF5 ; [.1F0B.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Y WITH DOT BELOW +1EF4 ; [.1F0B.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Y WITH DOT BELOW +028F ; [.1F0F.0020.0002] # LATIN LETTER SMALL CAPITAL Y +024F ; [.1F13.0020.0002] # LATIN SMALL LETTER Y WITH STROKE +024E ; [.1F13.0020.0008] # LATIN CAPITAL LETTER Y WITH STROKE +01B4 ; [.1F17.0020.0002] # LATIN SMALL LETTER Y WITH HOOK +01B3 ; [.1F17.0020.0008] # LATIN CAPITAL LETTER Y WITH HOOK +1EFF ; [.1F1B.0020.0002] # LATIN SMALL LETTER Y WITH LOOP +1EFE ; [.1F1B.0020.0008] # LATIN CAPITAL LETTER Y WITH LOOP +AB5A ; [.1F1C.0020.0002] # LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +021D ; [.1F1D.0020.0002] # LATIN SMALL LETTER YOGH +021C ; [.1F1D.0020.0008] # LATIN CAPITAL LETTER YOGH +007A ; [.1F21.0020.0002] # LATIN SMALL LETTER Z +FF5A ; [.1F21.0020.0003] # FULLWIDTH LATIN SMALL LETTER Z +1DE6 ; [.1F21.0020.0004] # COMBINING LATIN SMALL LETTER Z +24B5 ; [*0317.0020.0004][.1F21.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Z +1D433 ; [.1F21.0020.0005] # MATHEMATICAL BOLD SMALL Z +1D467 ; [.1F21.0020.0005] # MATHEMATICAL ITALIC SMALL Z +1D49B ; [.1F21.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Z +1D4CF ; [.1F21.0020.0005] # MATHEMATICAL SCRIPT SMALL Z +1D503 ; [.1F21.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Z +1D537 ; [.1F21.0020.0005] # MATHEMATICAL FRAKTUR SMALL Z +1D56B ; [.1F21.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D59F ; [.1F21.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5D3 ; [.1F21.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Z +1D607 ; [.1F21.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D63B ; [.1F21.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D66F ; [.1F21.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D6A3 ; [.1F21.0020.0005] # MATHEMATICAL MONOSPACE SMALL Z +24E9 ; [.1F21.0020.0006] # CIRCLED LATIN SMALL LETTER Z +005A ; [.1F21.0020.0008] # LATIN CAPITAL LETTER Z +FF3A ; [.1F21.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Z +1F129 ; [*0317.0020.0004][.1F21.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Z +2124 ; [.1F21.0020.000B] # DOUBLE-STRUCK CAPITAL Z +2128 ; [.1F21.0020.000B] # BLACK-LETTER CAPITAL Z +1D419 ; [.1F21.0020.000B] # MATHEMATICAL BOLD CAPITAL Z +1D44D ; [.1F21.0020.000B] # MATHEMATICAL ITALIC CAPITAL Z +1D481 ; [.1F21.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Z +1D4B5 ; [.1F21.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Z +1D4E9 ; [.1F21.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D585 ; [.1F21.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D5B9 ; [.1F21.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Z +1D5ED ; [.1F21.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D621 ; [.1F21.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D655 ; [.1F21.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D689 ; [.1F21.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Z +24CF ; [.1F21.0020.000C] # CIRCLED LATIN CAPITAL LETTER Z +1F169 ; [.1F21.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1DBB ; [.1F21.0020.0014] # MODIFIER LETTER SMALL Z +1F149 ; [.1F21.0020.001D] # SQUARED LATIN CAPITAL LETTER Z +1F189 ; [.1F21.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Z +017A ; [.1F21.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Z WITH ACUTE +0179 ; [.1F21.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Z WITH ACUTE +1E91 ; [.1F21.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E90 ; [.1F21.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +017E ; [.1F21.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER Z WITH CARON +017D ; [.1F21.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER Z WITH CARON +017C ; [.1F21.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Z WITH DOT ABOVE +017B ; [.1F21.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Z WITH DOT ABOVE +1E93 ; [.1F21.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Z WITH DOT BELOW +1E92 ; [.1F21.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E95 ; [.1F21.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER Z WITH LINE BELOW +1E94 ; [.1F21.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER Z WITH LINE BELOW +018D ; [.1F21.0020.0004][.1EF5.0020.0004] # LATIN SMALL LETTER TURNED DELTA +1D22 ; [.1F25.0020.0002] # LATIN LETTER SMALL CAPITAL Z +01B6 ; [.1F26.0020.0002] # LATIN SMALL LETTER Z WITH STROKE +01B5 ; [.1F26.0020.0008] # LATIN CAPITAL LETTER Z WITH STROKE +1D76 ; [.1F2A.0020.0002] # LATIN SMALL LETTER Z WITH MIDDLE TILDE +1D8E ; [.1F2B.0020.0002] # LATIN SMALL LETTER Z WITH PALATAL HOOK +0225 ; [.1F2C.0020.0002] # LATIN SMALL LETTER Z WITH HOOK +0224 ; [.1F2C.0020.0008] # LATIN CAPITAL LETTER Z WITH HOOK +0290 ; [.1F30.0020.0002] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK +1DBC ; [.1F30.0020.0014] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +0291 ; [.1F34.0020.0002] # LATIN SMALL LETTER Z WITH CURL +1DBD ; [.1F34.0020.0014] # MODIFIER LETTER SMALL Z WITH CURL +0240 ; [.1F38.0020.0002] # LATIN SMALL LETTER Z WITH SWASH TAIL +2C7F ; [.1F38.0020.0008] # LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C6C ; [.1F3C.0020.0002] # LATIN SMALL LETTER Z WITH DESCENDER +2C6B ; [.1F3C.0020.0008] # LATIN CAPITAL LETTER Z WITH DESCENDER +A763 ; [.1F3D.0020.0002] # LATIN SMALL LETTER VISIGOTHIC Z +A762 ; [.1F3D.0020.0008] # LATIN CAPITAL LETTER VISIGOTHIC Z +0292 ; [.1F3E.0020.0002] # LATIN SMALL LETTER EZH +01B7 ; [.1F3E.0020.0008] # LATIN CAPITAL LETTER EZH +1DBE ; [.1F3E.0020.0014] # MODIFIER LETTER SMALL EZH +01EF ; [.1F3E.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER EZH WITH CARON +01EE ; [.1F3E.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER EZH WITH CARON +1D23 ; [.1F42.0020.0002] # LATIN LETTER SMALL CAPITAL EZH +01B9 ; [.1F43.0020.0002] # LATIN SMALL LETTER EZH REVERSED +01B8 ; [.1F43.0020.0008] # LATIN CAPITAL LETTER EZH REVERSED +1D9A ; [.1F47.0020.0002] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +01BA ; [.1F48.0020.0002] # LATIN SMALL LETTER EZH WITH TAIL +0293 ; [.1F4C.0020.0002] # LATIN SMALL LETTER EZH WITH CURL +00FE ; [.1F50.0020.0002] # LATIN SMALL LETTER THORN +00DE ; [.1F50.0020.0008] # LATIN CAPITAL LETTER THORN +A765 ; [.1F54.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE +A764 ; [.1F54.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE +A767 ; [.1F55.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +A766 ; [.1F55.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +01BF ; [.1F56.0020.0002] # LATIN LETTER WYNN +01F7 ; [.1F56.0020.0008] # LATIN CAPITAL LETTER WYNN +A769 ; [.1F5A.0020.0002] # LATIN SMALL LETTER VEND +A768 ; [.1F5A.0020.0008] # LATIN CAPITAL LETTER VEND +AB60 ; [.1F5B.0020.0002] # LATIN SMALL LETTER SAKHA YAT +AB61 ; [.1F5C.0020.0002] # LATIN SMALL LETTER IOTIFIED E +AB63 ; [.1F5D.0020.0002] # LATIN SMALL LETTER UO +A76B ; [.1F5E.0020.0002] # LATIN SMALL LETTER ET +A76A ; [.1F5E.0020.0008] # LATIN CAPITAL LETTER ET +A76D ; [.1F5F.0020.0002] # LATIN SMALL LETTER IS +A76C ; [.1F5F.0020.0008] # LATIN CAPITAL LETTER IS +A76F ; [.1F60.0020.0002] # LATIN SMALL LETTER CON +1DD2 ; [.1F60.0020.0004] # COMBINING US ABOVE +A76E ; [.1F60.0020.0008] # LATIN CAPITAL LETTER CON +A770 ; [.1F60.0020.0014] # MODIFIER LETTER US +A778 ; [.1F61.0020.0002] # LATIN SMALL LETTER UM +01BB ; [.1F62.0020.0002] # LATIN LETTER TWO WITH STROKE +A72B ; [.1F66.0020.0002] # LATIN SMALL LETTER TRESILLO +A72A ; [.1F66.0020.0008] # LATIN CAPITAL LETTER TRESILLO +A72D ; [.1F67.0020.0002] # LATIN SMALL LETTER CUATRILLO +A72C ; [.1F67.0020.0008] # LATIN CAPITAL LETTER CUATRILLO +A72F ; [.1F68.0020.0002] # LATIN SMALL LETTER CUATRILLO WITH COMMA +A72E ; [.1F68.0020.0008] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +01A8 ; [.1F69.0020.0002] # LATIN SMALL LETTER TONE TWO +01A7 ; [.1F69.0020.0008] # LATIN CAPITAL LETTER TONE TWO +01BD ; [.1F6D.0020.0002] # LATIN SMALL LETTER TONE FIVE +01BC ; [.1F6D.0020.0008] # LATIN CAPITAL LETTER TONE FIVE +0185 ; [.1F71.0020.0002] # LATIN SMALL LETTER TONE SIX +0184 ; [.1F71.0020.0008] # LATIN CAPITAL LETTER TONE SIX +0294 ; [.1F75.0020.0002] # LATIN LETTER GLOTTAL STOP +0242 ; [.1F79.0020.0002] # LATIN SMALL LETTER GLOTTAL STOP +0241 ; [.1F79.0020.0008] # LATIN CAPITAL LETTER GLOTTAL STOP +02C0 ; [.1F7D.0020.0002] # MODIFIER LETTER GLOTTAL STOP +02BC ; [.1F7E.0020.0002] # MODIFIER LETTER APOSTROPHE +0149 ; [.1F7E.0020.0004][.1DB9.0020.0004] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +02EE ; [.1F7F.0020.0002] # MODIFIER LETTER DOUBLE APOSTROPHE +02BE ; [.1F80.0020.0002] # MODIFIER LETTER RIGHT HALF RING +A723 ; [.1F81.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF +A722 ; [.1F81.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A78C ; [.1F82.0020.0002] # LATIN SMALL LETTER SALTILLO +A78B ; [.1F82.0020.0008] # LATIN CAPITAL LETTER SALTILLO +A78F ; [.1F83.0020.0002] # LATIN LETTER SINOLOGICAL DOT +0295 ; [.1F84.0020.0002] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE +02E4 ; [.1F84.0020.0014] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02BF ; [.1F88.0020.0002] # MODIFIER LETTER LEFT HALF RING +02C1 ; [.1F89.0020.0002] # MODIFIER LETTER REVERSED GLOTTAL STOP +1D24 ; [.1F8A.0020.0002] # LATIN LETTER VOICED LARYNGEAL SPIRANT +1D25 ; [.1F8B.0020.0002] # LATIN LETTER AIN +1D5C ; [.1F8B.0020.0014] # MODIFIER LETTER SMALL AIN +A725 ; [.1F8C.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL AIN +A724 ; [.1F8C.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +02A1 ; [.1F8D.0020.0002] # LATIN LETTER GLOTTAL STOP WITH STROKE +02A2 ; [.1F91.0020.0002] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE +0296 ; [.1F95.0020.0002] # LATIN LETTER INVERTED GLOTTAL STOP +01C0 ; [.1F99.0020.0002] # LATIN LETTER DENTAL CLICK +01C1 ; [.1F9D.0020.0002] # LATIN LETTER LATERAL CLICK +01C2 ; [.1FA1.0020.0002] # LATIN LETTER ALVEOLAR CLICK +01C3 ; [.1FA5.0020.0002] # LATIN LETTER RETROFLEX CLICK +0297 ; [.1FA9.0020.0002] # LATIN LETTER STRETCHED C +0298 ; [.1FAD.0020.0002] # LATIN LETTER BILABIAL CLICK +02AC ; [.1FB1.0020.0002] # LATIN LETTER BILABIAL PERCUSSIVE +02AD ; [.1FB5.0020.0002] # LATIN LETTER BIDENTAL PERCUSSIVE +03B1 ; [.1FB9.0020.0002] # GREEK SMALL LETTER ALPHA +1D6C2 ; [.1FB9.0020.0005] # MATHEMATICAL BOLD SMALL ALPHA +1D6FC ; [.1FB9.0020.0005] # MATHEMATICAL ITALIC SMALL ALPHA +1D736 ; [.1FB9.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D770 ; [.1FB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D7AA ; [.1FB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +0391 ; [.1FB9.0020.0008] # GREEK CAPITAL LETTER ALPHA +1D6A8 ; [.1FB9.0020.000B] # MATHEMATICAL BOLD CAPITAL ALPHA +1D6E2 ; [.1FB9.0020.000B] # MATHEMATICAL ITALIC CAPITAL ALPHA +1D71C ; [.1FB9.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D756 ; [.1FB9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D790 ; [.1FB9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1F00 ; [.1FB9.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ALPHA WITH PSILI +1F08 ; [.1FB9.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F04 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +1F0C ; [.1FB9.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F84 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F8C ; [.1FB9.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F02 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +1F0A ; [.1FB9.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F82 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F8A ; [.1FB9.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F06 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0E ; [.1FB9.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F86 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F8E ; [.1FB9.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F80 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F88 ; [.1FB9.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F01 ; [.1FB9.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ALPHA WITH DASIA +1F09 ; [.1FB9.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F05 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +1F0D ; [.1FB9.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F85 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F8D ; [.1FB9.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F03 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +1F0B ; [.1FB9.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F83 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F8B ; [.1FB9.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F07 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F0F ; [.1FB9.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F87 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F8F ; [.1FB9.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F81 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F89 ; [.1FB9.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +03AC ; [.1FB9.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH TONOS +1F71 ; [.1FB9.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH OXIA +0386 ; [.1FB9.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH TONOS +1FBB ; [.1FB9.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FB4 ; [.1FB9.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1F70 ; [.1FB9.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH VARIA +1FBA ; [.1FB9.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FB2 ; [.1FB9.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB0 ; [.1FB9.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER ALPHA WITH VRACHY +1FB8 ; [.1FB9.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB6 ; [.1FB9.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7 ; [.1FB9.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB1 ; [.1FB9.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER ALPHA WITH MACRON +1FB9 ; [.1FB9.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FB3 ; [.1FB9.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FBC ; [.1FB9.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +03B2 ; [.1FBA.0020.0002] # GREEK SMALL LETTER BETA +03D0 ; [.1FBA.0020.0004] # GREEK BETA SYMBOL +1D6C3 ; [.1FBA.0020.0005] # MATHEMATICAL BOLD SMALL BETA +1D6FD ; [.1FBA.0020.0005] # MATHEMATICAL ITALIC SMALL BETA +1D737 ; [.1FBA.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL BETA +1D771 ; [.1FBA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D7AB ; [.1FBA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +0392 ; [.1FBA.0020.0008] # GREEK CAPITAL LETTER BETA +1D6A9 ; [.1FBA.0020.000B] # MATHEMATICAL BOLD CAPITAL BETA +1D6E3 ; [.1FBA.0020.000B] # MATHEMATICAL ITALIC CAPITAL BETA +1D71D ; [.1FBA.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D757 ; [.1FBA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D791 ; [.1FBA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D5D ; [.1FBA.0020.0014] # MODIFIER LETTER SMALL BETA +1D66 ; [.1FBA.0020.0015] # GREEK SUBSCRIPT SMALL LETTER BETA +03B3 ; [.1FBB.0020.0002] # GREEK SMALL LETTER GAMMA +213D ; [.1FBB.0020.0005] # DOUBLE-STRUCK SMALL GAMMA +1D6C4 ; [.1FBB.0020.0005] # MATHEMATICAL BOLD SMALL GAMMA +1D6FE ; [.1FBB.0020.0005] # MATHEMATICAL ITALIC SMALL GAMMA +1D738 ; [.1FBB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D772 ; [.1FBB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D7AC ; [.1FBB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +0393 ; [.1FBB.0020.0008] # GREEK CAPITAL LETTER GAMMA +213E ; [.1FBB.0020.000B] # DOUBLE-STRUCK CAPITAL GAMMA +1D6AA ; [.1FBB.0020.000B] # MATHEMATICAL BOLD CAPITAL GAMMA +1D6E4 ; [.1FBB.0020.000B] # MATHEMATICAL ITALIC CAPITAL GAMMA +1D71E ; [.1FBB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D758 ; [.1FBB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D792 ; [.1FBB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D5E ; [.1FBB.0020.0014] # MODIFIER LETTER SMALL GREEK GAMMA +1D67 ; [.1FBB.0020.0015] # GREEK SUBSCRIPT SMALL LETTER GAMMA +1D26 ; [.1FBC.0020.0002] # GREEK LETTER SMALL CAPITAL GAMMA +03B4 ; [.1FBD.0020.0002] # GREEK SMALL LETTER DELTA +1D6C5 ; [.1FBD.0020.0005] # MATHEMATICAL BOLD SMALL DELTA +1D6FF ; [.1FBD.0020.0005] # MATHEMATICAL ITALIC SMALL DELTA +1D739 ; [.1FBD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL DELTA +1D773 ; [.1FBD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D7AD ; [.1FBD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +0394 ; [.1FBD.0020.0008] # GREEK CAPITAL LETTER DELTA +1D6AB ; [.1FBD.0020.000B] # MATHEMATICAL BOLD CAPITAL DELTA +1D6E5 ; [.1FBD.0020.000B] # MATHEMATICAL ITALIC CAPITAL DELTA +1D71F ; [.1FBD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D759 ; [.1FBD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D793 ; [.1FBD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D5F ; [.1FBD.0020.0014] # MODIFIER LETTER SMALL DELTA +03B5 ; [.1FBE.0020.0002] # GREEK SMALL LETTER EPSILON +03F5 ; [.1FBE.0020.0004] # GREEK LUNATE EPSILON SYMBOL +1D6C6 ; [.1FBE.0020.0005] # MATHEMATICAL BOLD SMALL EPSILON +1D6DC ; [.1FBE.0020.0005] # MATHEMATICAL BOLD EPSILON SYMBOL +1D700 ; [.1FBE.0020.0005] # MATHEMATICAL ITALIC SMALL EPSILON +1D716 ; [.1FBE.0020.0005] # MATHEMATICAL ITALIC EPSILON SYMBOL +1D73A ; [.1FBE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D750 ; [.1FBE.0020.0005] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D774 ; [.1FBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D78A ; [.1FBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D7AE ; [.1FBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7C4 ; [.1FBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +0395 ; [.1FBE.0020.0008] # GREEK CAPITAL LETTER EPSILON +1D6AC ; [.1FBE.0020.000B] # MATHEMATICAL BOLD CAPITAL EPSILON +1D6E6 ; [.1FBE.0020.000B] # MATHEMATICAL ITALIC CAPITAL EPSILON +1D720 ; [.1FBE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D75A ; [.1FBE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D794 ; [.1FBE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1F10 ; [.1FBE.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER EPSILON WITH PSILI +1F18 ; [.1FBE.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F14 ; [.1FBE.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +1F1C ; [.1FBE.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F12 ; [.1FBE.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +1F1A ; [.1FBE.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F11 ; [.1FBE.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER EPSILON WITH DASIA +1F19 ; [.1FBE.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F15 ; [.1FBE.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F1D ; [.1FBE.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F13 ; [.1FBE.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +1F1B ; [.1FBE.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +03AD ; [.1FBE.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH TONOS +1F73 ; [.1FBE.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH OXIA +0388 ; [.1FBE.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH TONOS +1FC9 ; [.1FBE.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH OXIA +1F72 ; [.1FBE.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH VARIA +1FC8 ; [.1FBE.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH VARIA +03DD ; [.1FBF.0020.0002] # GREEK SMALL LETTER DIGAMMA +1D7CB ; [.1FBF.0020.0005] # MATHEMATICAL BOLD SMALL DIGAMMA +03DC ; [.1FBF.0020.0008] # GREEK LETTER DIGAMMA +1D7CA ; [.1FBF.0020.000B] # MATHEMATICAL BOLD CAPITAL DIGAMMA +0377 ; [.1FC0.0020.0002] # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +0376 ; [.1FC0.0020.0008] # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +03DB ; [.1FC1.0020.0002] # GREEK SMALL LETTER STIGMA +03DA ; [.1FC1.0020.0008] # GREEK LETTER STIGMA +03B6 ; [.1FC2.0020.0002] # GREEK SMALL LETTER ZETA +1D6C7 ; [.1FC2.0020.0005] # MATHEMATICAL BOLD SMALL ZETA +1D701 ; [.1FC2.0020.0005] # MATHEMATICAL ITALIC SMALL ZETA +1D73B ; [.1FC2.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ZETA +1D775 ; [.1FC2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D7AF ; [.1FC2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +0396 ; [.1FC2.0020.0008] # GREEK CAPITAL LETTER ZETA +1D6AD ; [.1FC2.0020.000B] # MATHEMATICAL BOLD CAPITAL ZETA +1D6E7 ; [.1FC2.0020.000B] # MATHEMATICAL ITALIC CAPITAL ZETA +1D721 ; [.1FC2.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D75B ; [.1FC2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D795 ; [.1FC2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +0371 ; [.1FC3.0020.0002] # GREEK SMALL LETTER HETA +0370 ; [.1FC3.0020.0008] # GREEK CAPITAL LETTER HETA +03B7 ; [.1FC4.0020.0002] # GREEK SMALL LETTER ETA +1D6C8 ; [.1FC4.0020.0005] # MATHEMATICAL BOLD SMALL ETA +1D702 ; [.1FC4.0020.0005] # MATHEMATICAL ITALIC SMALL ETA +1D73C ; [.1FC4.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ETA +1D776 ; [.1FC4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D7B0 ; [.1FC4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +0397 ; [.1FC4.0020.0008] # GREEK CAPITAL LETTER ETA +1D6AE ; [.1FC4.0020.000B] # MATHEMATICAL BOLD CAPITAL ETA +1D6E8 ; [.1FC4.0020.000B] # MATHEMATICAL ITALIC CAPITAL ETA +1D722 ; [.1FC4.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D75C ; [.1FC4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D796 ; [.1FC4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1F20 ; [.1FC4.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ETA WITH PSILI +1F28 ; [.1FC4.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ETA WITH PSILI +1F24 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA +1F2C ; [.1FC4.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F94 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F9C ; [.1FC4.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F22 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA +1F2A ; [.1FC4.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F92 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F9A ; [.1FC4.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F26 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +1F2E ; [.1FC4.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F96 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F9E ; [.1FC4.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F90 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F98 ; [.1FC4.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F21 ; [.1FC4.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ETA WITH DASIA +1F29 ; [.1FC4.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ETA WITH DASIA +1F25 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA +1F2D ; [.1FC4.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F95 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F9D ; [.1FC4.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F23 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA +1F2B ; [.1FC4.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F93 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F9B ; [.1FC4.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F27 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F2F ; [.1FC4.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F97 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F9F ; [.1FC4.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F91 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F99 ; [.1FC4.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +03AE ; [.1FC4.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH TONOS +1F75 ; [.1FC4.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH OXIA +0389 ; [.1FC4.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH TONOS +1FCB ; [.1FC4.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH OXIA +1FC4 ; [.1FC4.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1F74 ; [.1FC4.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH VARIA +1FCA ; [.1FC4.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH VARIA +1FC2 ; [.1FC4.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC6 ; [.1FC4.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7 ; [.1FC4.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC3 ; [.1FC4.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FCC ; [.1FC4.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +03B8 ; [.1FC5.0020.0002] # GREEK SMALL LETTER THETA +03D1 ; [.1FC5.0020.0004] # GREEK THETA SYMBOL +1D6C9 ; [.1FC5.0020.0005] # MATHEMATICAL BOLD SMALL THETA +1D6DD ; [.1FC5.0020.0005] # MATHEMATICAL BOLD THETA SYMBOL +1D703 ; [.1FC5.0020.0005] # MATHEMATICAL ITALIC SMALL THETA +1D717 ; [.1FC5.0020.0005] # MATHEMATICAL ITALIC THETA SYMBOL +1D73D ; [.1FC5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL THETA +1D751 ; [.1FC5.0020.0005] # MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D777 ; [.1FC5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D78B ; [.1FC5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D7B1 ; [.1FC5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7C5 ; [.1FC5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +0398 ; [.1FC5.0020.0008] # GREEK CAPITAL LETTER THETA +03F4 ; [.1FC5.0020.000A] # GREEK CAPITAL THETA SYMBOL +1D6AF ; [.1FC5.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA +1D6B9 ; [.1FC5.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6E9 ; [.1FC5.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA +1D6F3 ; [.1FC5.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D723 ; [.1FC5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D72D ; [.1FC5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D75D ; [.1FC5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D767 ; [.1FC5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D797 ; [.1FC5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D7A1 ; [.1FC5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1DBF ; [.1FC5.0020.0014] # MODIFIER LETTER SMALL THETA +03B9 ; [.1FC6.0020.0002] # GREEK SMALL LETTER IOTA +1FBE ; [.1FC6.0020.0002] # GREEK PROSGEGRAMMENI +037A ; [.1FC6.0020.0004] # GREEK YPOGEGRAMMENI +1D6CA ; [.1FC6.0020.0005] # MATHEMATICAL BOLD SMALL IOTA +1D704 ; [.1FC6.0020.0005] # MATHEMATICAL ITALIC SMALL IOTA +1D73E ; [.1FC6.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL IOTA +1D778 ; [.1FC6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D7B2 ; [.1FC6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +0399 ; [.1FC6.0020.0008] # GREEK CAPITAL LETTER IOTA +1D6B0 ; [.1FC6.0020.000B] # MATHEMATICAL BOLD CAPITAL IOTA +1D6EA ; [.1FC6.0020.000B] # MATHEMATICAL ITALIC CAPITAL IOTA +1D724 ; [.1FC6.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D75E ; [.1FC6.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D798 ; [.1FC6.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1F30 ; [.1FC6.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER IOTA WITH PSILI +1F38 ; [.1FC6.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI +1F34 ; [.1FC6.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +1F3C ; [.1FC6.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F32 ; [.1FC6.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +1F3A ; [.1FC6.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F36 ; [.1FC6.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3E ; [.1FC6.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F31 ; [.1FC6.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER IOTA WITH DASIA +1F39 ; [.1FC6.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA +1F35 ; [.1FC6.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +1F3D ; [.1FC6.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F33 ; [.1FC6.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +1F3B ; [.1FC6.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F37 ; [.1FC6.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F3F ; [.1FC6.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +03AF ; [.1FC6.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH TONOS +1F77 ; [.1FC6.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH OXIA +038A ; [.1FC6.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH TONOS +1FDB ; [.1FC6.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH OXIA +1F76 ; [.1FC6.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH VARIA +1FDA ; [.1FC6.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH VARIA +1FD0 ; [.1FC6.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER IOTA WITH VRACHY +1FD8 ; [.1FC6.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD6 ; [.1FC6.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PERISPOMENI +03CA ; [.1FC6.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA +03AA ; [.1FC6.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0390 ; [.1FC6.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +1FD3 ; [.1FC6.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD2 ; [.1FC6.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD7 ; [.1FC6.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD1 ; [.1FC6.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER IOTA WITH MACRON +1FD9 ; [.1FC6.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER IOTA WITH MACRON +03F3 ; [.1FC7.0020.0002] # GREEK LETTER YOT +037F ; [.1FC7.0020.0008] # GREEK CAPITAL LETTER YOT +03BA ; [.1FC8.0020.0002] # GREEK SMALL LETTER KAPPA +03F0 ; [.1FC8.0020.0004] # GREEK KAPPA SYMBOL +1D6CB ; [.1FC8.0020.0005] # MATHEMATICAL BOLD SMALL KAPPA +1D6DE ; [.1FC8.0020.0005] # MATHEMATICAL BOLD KAPPA SYMBOL +1D705 ; [.1FC8.0020.0005] # MATHEMATICAL ITALIC SMALL KAPPA +1D718 ; [.1FC8.0020.0005] # MATHEMATICAL ITALIC KAPPA SYMBOL +1D73F ; [.1FC8.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D752 ; [.1FC8.0020.0005] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D779 ; [.1FC8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D78C ; [.1FC8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D7B3 ; [.1FC8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7C6 ; [.1FC8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +039A ; [.1FC8.0020.0008] # GREEK CAPITAL LETTER KAPPA +1D6B1 ; [.1FC8.0020.000B] # MATHEMATICAL BOLD CAPITAL KAPPA +1D6EB ; [.1FC8.0020.000B] # MATHEMATICAL ITALIC CAPITAL KAPPA +1D725 ; [.1FC8.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D75F ; [.1FC8.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D799 ; [.1FC8.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +03D7 ; [.1FC8.0020.0004][.1FB9.0020.0004][.1FC6.0020.0004] # GREEK KAI SYMBOL +03CF ; [.1FC8.0020.000A][.1FB9.0020.0004][.1FC6.0020.0004] # GREEK CAPITAL KAI SYMBOL +03BB ; [.1FC9.0020.0002] # GREEK SMALL LETTER LAMDA +1D6CC ; [.1FC9.0020.0005] # MATHEMATICAL BOLD SMALL LAMDA +1D706 ; [.1FC9.0020.0005] # MATHEMATICAL ITALIC SMALL LAMDA +1D740 ; [.1FC9.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D77A ; [.1FC9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D7B4 ; [.1FC9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +039B ; [.1FC9.0020.0008] # GREEK CAPITAL LETTER LAMDA +1D6B2 ; [.1FC9.0020.000B] # MATHEMATICAL BOLD CAPITAL LAMDA +1D6EC ; [.1FC9.0020.000B] # MATHEMATICAL ITALIC CAPITAL LAMDA +1D726 ; [.1FC9.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D760 ; [.1FC9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D79A ; [.1FC9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D27 ; [.1FCA.0020.0002] # GREEK LETTER SMALL CAPITAL LAMDA +03BC ; [.1FCB.0020.0002] # GREEK SMALL LETTER MU +00B5 ; [.1FCB.0020.0004] # MICRO SIGN +1D6CD ; [.1FCB.0020.0005] # MATHEMATICAL BOLD SMALL MU +1D707 ; [.1FCB.0020.0005] # MATHEMATICAL ITALIC SMALL MU +1D741 ; [.1FCB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL MU +1D77B ; [.1FCB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D7B5 ; [.1FCB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +039C ; [.1FCB.0020.0008] # GREEK CAPITAL LETTER MU +1D6B3 ; [.1FCB.0020.000B] # MATHEMATICAL BOLD CAPITAL MU +1D6ED ; [.1FCB.0020.000B] # MATHEMATICAL ITALIC CAPITAL MU +1D727 ; [.1FCB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL MU +1D761 ; [.1FCB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D79B ; [.1FCB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +3382 ; [.1FCB.0020.001C][.1C47.0020.001D] # SQUARE MU A +338C ; [.1FCB.0020.001C][.1CE5.0020.001D] # SQUARE MU F +338D ; [.1FCB.0020.001C][.1CF4.0020.001C] # SQUARE MU G +3395 ; [.1FCB.0020.001C][.1D77.0020.001C] # SQUARE MU L +339B ; [.1FCB.0020.001C][.1DAA.0020.001C] # SQUARE MU M +33B2 ; [.1FCB.0020.001C][.1E71.0020.001C] # SQUARE MU S +33B6 ; [.1FCB.0020.001C][.1EE3.0020.001D] # SQUARE MU V +33BC ; [.1FCB.0020.001C][.1EF5.0020.001D] # SQUARE MU W +03BD ; [.1FCC.0020.0002] # GREEK SMALL LETTER NU +1D6CE ; [.1FCC.0020.0005] # MATHEMATICAL BOLD SMALL NU +1D708 ; [.1FCC.0020.0005] # MATHEMATICAL ITALIC SMALL NU +1D742 ; [.1FCC.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL NU +1D77C ; [.1FCC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D7B6 ; [.1FCC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +039D ; [.1FCC.0020.0008] # GREEK CAPITAL LETTER NU +1D6B4 ; [.1FCC.0020.000B] # MATHEMATICAL BOLD CAPITAL NU +1D6EE ; [.1FCC.0020.000B] # MATHEMATICAL ITALIC CAPITAL NU +1D728 ; [.1FCC.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL NU +1D762 ; [.1FCC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D79C ; [.1FCC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +03BE ; [.1FCD.0020.0002] # GREEK SMALL LETTER XI +1D6CF ; [.1FCD.0020.0005] # MATHEMATICAL BOLD SMALL XI +1D709 ; [.1FCD.0020.0005] # MATHEMATICAL ITALIC SMALL XI +1D743 ; [.1FCD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL XI +1D77D ; [.1FCD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D7B7 ; [.1FCD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +039E ; [.1FCD.0020.0008] # GREEK CAPITAL LETTER XI +1D6B5 ; [.1FCD.0020.000B] # MATHEMATICAL BOLD CAPITAL XI +1D6EF ; [.1FCD.0020.000B] # MATHEMATICAL ITALIC CAPITAL XI +1D729 ; [.1FCD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL XI +1D763 ; [.1FCD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D79D ; [.1FCD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +03BF ; [.1FCE.0020.0002] # GREEK SMALL LETTER OMICRON +1D6D0 ; [.1FCE.0020.0005] # MATHEMATICAL BOLD SMALL OMICRON +1D70A ; [.1FCE.0020.0005] # MATHEMATICAL ITALIC SMALL OMICRON +1D744 ; [.1FCE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D77E ; [.1FCE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D7B8 ; [.1FCE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +039F ; [.1FCE.0020.0008] # GREEK CAPITAL LETTER OMICRON +1D6B6 ; [.1FCE.0020.000B] # MATHEMATICAL BOLD CAPITAL OMICRON +1D6F0 ; [.1FCE.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMICRON +1D72A ; [.1FCE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D764 ; [.1FCE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D79E ; [.1FCE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1F40 ; [.1FCE.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMICRON WITH PSILI +1F48 ; [.1FCE.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F44 ; [.1FCE.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +1F4C ; [.1FCE.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F42 ; [.1FCE.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +1F4A ; [.1FCE.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F41 ; [.1FCE.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMICRON WITH DASIA +1F49 ; [.1FCE.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F45 ; [.1FCE.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F4D ; [.1FCE.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F43 ; [.1FCE.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +1F4B ; [.1FCE.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +03CC ; [.1FCE.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH TONOS +1F79 ; [.1FCE.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH OXIA +038C ; [.1FCE.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH TONOS +1FF9 ; [.1FCE.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH OXIA +1F78 ; [.1FCE.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH VARIA +1FF8 ; [.1FCE.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH VARIA +03C0 ; [.1FCF.0020.0002] # GREEK SMALL LETTER PI +03D6 ; [.1FCF.0020.0004] # GREEK PI SYMBOL +213C ; [.1FCF.0020.0005] # DOUBLE-STRUCK SMALL PI +1D6D1 ; [.1FCF.0020.0005] # MATHEMATICAL BOLD SMALL PI +1D6E1 ; [.1FCF.0020.0005] # MATHEMATICAL BOLD PI SYMBOL +1D70B ; [.1FCF.0020.0005] # MATHEMATICAL ITALIC SMALL PI +1D71B ; [.1FCF.0020.0005] # MATHEMATICAL ITALIC PI SYMBOL +1D745 ; [.1FCF.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PI +1D755 ; [.1FCF.0020.0005] # MATHEMATICAL BOLD ITALIC PI SYMBOL +1D77F ; [.1FCF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D78F ; [.1FCF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D7B9 ; [.1FCF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7C9 ; [.1FCF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +03A0 ; [.1FCF.0020.0008] # GREEK CAPITAL LETTER PI +213F ; [.1FCF.0020.000B] # DOUBLE-STRUCK CAPITAL PI +1D6B7 ; [.1FCF.0020.000B] # MATHEMATICAL BOLD CAPITAL PI +1D6F1 ; [.1FCF.0020.000B] # MATHEMATICAL ITALIC CAPITAL PI +1D72B ; [.1FCF.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PI +1D765 ; [.1FCF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D79F ; [.1FCF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D28 ; [.1FD0.0020.0002] # GREEK LETTER SMALL CAPITAL PI +03FB ; [.1FD1.0020.0002] # GREEK SMALL LETTER SAN +03FA ; [.1FD1.0020.0008] # GREEK CAPITAL LETTER SAN +03DF ; [.1FD2.0020.0002] # GREEK SMALL LETTER KOPPA +03DE ; [.1FD2.0020.0008] # GREEK LETTER KOPPA +03D9 ; [.1FD3.0020.0002] # GREEK SMALL LETTER ARCHAIC KOPPA +03D8 ; [.1FD3.0020.0008] # GREEK LETTER ARCHAIC KOPPA +03C1 ; [.1FD4.0020.0002] # GREEK SMALL LETTER RHO +03F1 ; [.1FD4.0020.0004] # GREEK RHO SYMBOL +1D6D2 ; [.1FD4.0020.0005] # MATHEMATICAL BOLD SMALL RHO +1D6E0 ; [.1FD4.0020.0005] # MATHEMATICAL BOLD RHO SYMBOL +1D70C ; [.1FD4.0020.0005] # MATHEMATICAL ITALIC SMALL RHO +1D71A ; [.1FD4.0020.0005] # MATHEMATICAL ITALIC RHO SYMBOL +1D746 ; [.1FD4.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL RHO +1D754 ; [.1FD4.0020.0005] # MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D780 ; [.1FD4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D78E ; [.1FD4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D7BA ; [.1FD4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7C8 ; [.1FD4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +03A1 ; [.1FD4.0020.0008] # GREEK CAPITAL LETTER RHO +1D6B8 ; [.1FD4.0020.000B] # MATHEMATICAL BOLD CAPITAL RHO +1D6F2 ; [.1FD4.0020.000B] # MATHEMATICAL ITALIC CAPITAL RHO +1D72C ; [.1FD4.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D766 ; [.1FD4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D7A0 ; [.1FD4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D68 ; [.1FD4.0020.0015] # GREEK SUBSCRIPT SMALL LETTER RHO +1FE4 ; [.1FD4.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER RHO WITH PSILI +1FE5 ; [.1FD4.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER RHO WITH DASIA +1FEC ; [.1FD4.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER RHO WITH DASIA +1D29 ; [.1FD5.0020.0002] # GREEK LETTER SMALL CAPITAL RHO +03FC ; [.1FD6.0020.0002] # GREEK RHO WITH STROKE SYMBOL +03C3 ; [.1FD7.0020.0002] # GREEK SMALL LETTER SIGMA +03F2 ; [.1FD7.0020.0004] # GREEK LUNATE SIGMA SYMBOL +1D6D3 ; [.1FD7.0020.0005] # MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4 ; [.1FD7.0020.0005] # MATHEMATICAL BOLD SMALL SIGMA +1D70D ; [.1FD7.0020.0005] # MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E ; [.1FD7.0020.0005] # MATHEMATICAL ITALIC SMALL SIGMA +1D747 ; [.1FD7.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748 ; [.1FD7.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D781 ; [.1FD7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782 ; [.1FD7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D7BB ; [.1FD7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC ; [.1FD7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +03A3 ; [.1FD7.0020.0008] # GREEK CAPITAL LETTER SIGMA +03F9 ; [.1FD7.0020.000A] # GREEK CAPITAL LUNATE SIGMA SYMBOL +1D6BA ; [.1FD7.0020.000B] # MATHEMATICAL BOLD CAPITAL SIGMA +1D6F4 ; [.1FD7.0020.000B] # MATHEMATICAL ITALIC CAPITAL SIGMA +1D72E ; [.1FD7.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D768 ; [.1FD7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D7A2 ; [.1FD7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +03C2 ; [.1FD7.0020.0019] # GREEK SMALL LETTER FINAL SIGMA +037C ; [.1FD8.0020.0002] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL +03FE ; [.1FD8.0020.0008] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +037B ; [.1FD9.0020.0002] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL +03FD ; [.1FD9.0020.0008] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +037D ; [.1FDA.0020.0002] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +03FF ; [.1FDA.0020.0008] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +03C4 ; [.1FDB.0020.0002] # GREEK SMALL LETTER TAU +1D6D5 ; [.1FDB.0020.0005] # MATHEMATICAL BOLD SMALL TAU +1D70F ; [.1FDB.0020.0005] # MATHEMATICAL ITALIC SMALL TAU +1D749 ; [.1FDB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL TAU +1D783 ; [.1FDB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D7BD ; [.1FDB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +03A4 ; [.1FDB.0020.0008] # GREEK CAPITAL LETTER TAU +1D6BB ; [.1FDB.0020.000B] # MATHEMATICAL BOLD CAPITAL TAU +1D6F5 ; [.1FDB.0020.000B] # MATHEMATICAL ITALIC CAPITAL TAU +1D72F ; [.1FDB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D769 ; [.1FDB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D7A3 ; [.1FDB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +03C5 ; [.1FDC.0020.0002] # GREEK SMALL LETTER UPSILON +1D6D6 ; [.1FDC.0020.0005] # MATHEMATICAL BOLD SMALL UPSILON +1D710 ; [.1FDC.0020.0005] # MATHEMATICAL ITALIC SMALL UPSILON +1D74A ; [.1FDC.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D784 ; [.1FDC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D7BE ; [.1FDC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +03A5 ; [.1FDC.0020.0008] # GREEK CAPITAL LETTER UPSILON +03D2 ; [.1FDC.0020.000A] # GREEK UPSILON WITH HOOK SYMBOL +1D6BC ; [.1FDC.0020.000B] # MATHEMATICAL BOLD CAPITAL UPSILON +1D6F6 ; [.1FDC.0020.000B] # MATHEMATICAL ITALIC CAPITAL UPSILON +1D730 ; [.1FDC.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D76A ; [.1FDC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D7A4 ; [.1FDC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1F50 ; [.1FDC.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER UPSILON WITH PSILI +1F54 ; [.1FDC.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F52 ; [.1FDC.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F56 ; [.1FDC.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F51 ; [.1FDC.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER UPSILON WITH DASIA +1F59 ; [.1FDC.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F55 ; [.1FDC.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +1F5D ; [.1FDC.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F53 ; [.1FDC.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +1F5B ; [.1FDC.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F57 ; [.1FDC.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F5F ; [.1FDC.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +03CD ; [.1FDC.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH TONOS +1F7B ; [.1FDC.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH OXIA +038E ; [.1FDC.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH TONOS +1FEB ; [.1FDC.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH OXIA +03D3 ; [.1FDC.0020.000A][.0000.0024.0002] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +1F7A ; [.1FDC.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH VARIA +1FEA ; [.1FDC.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FE0 ; [.1FDC.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER UPSILON WITH VRACHY +1FE8 ; [.1FDC.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE6 ; [.1FDC.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +03CB ; [.1FDC.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03AB ; [.1FDC.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03D4 ; [.1FDC.0020.000A][.0000.002B.0002] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03B0 ; [.1FDC.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +1FE3 ; [.1FDC.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE2 ; [.1FDC.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE7 ; [.1FDC.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE1 ; [.1FDC.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER UPSILON WITH MACRON +1FE9 ; [.1FDC.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER UPSILON WITH MACRON +03C6 ; [.1FDD.0020.0002] # GREEK SMALL LETTER PHI +03D5 ; [.1FDD.0020.0004] # GREEK PHI SYMBOL +1D6D7 ; [.1FDD.0020.0005] # MATHEMATICAL BOLD SMALL PHI +1D6DF ; [.1FDD.0020.0005] # MATHEMATICAL BOLD PHI SYMBOL +1D711 ; [.1FDD.0020.0005] # MATHEMATICAL ITALIC SMALL PHI +1D719 ; [.1FDD.0020.0005] # MATHEMATICAL ITALIC PHI SYMBOL +1D74B ; [.1FDD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PHI +1D753 ; [.1FDD.0020.0005] # MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D785 ; [.1FDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D78D ; [.1FDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D7BF ; [.1FDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C7 ; [.1FDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +03A6 ; [.1FDD.0020.0008] # GREEK CAPITAL LETTER PHI +1D6BD ; [.1FDD.0020.000B] # MATHEMATICAL BOLD CAPITAL PHI +1D6F7 ; [.1FDD.0020.000B] # MATHEMATICAL ITALIC CAPITAL PHI +1D731 ; [.1FDD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D76B ; [.1FDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D7A5 ; [.1FDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D60 ; [.1FDD.0020.0014] # MODIFIER LETTER SMALL GREEK PHI +1D69 ; [.1FDD.0020.0015] # GREEK SUBSCRIPT SMALL LETTER PHI +03C7 ; [.1FDE.0020.0002] # GREEK SMALL LETTER CHI +1D6D8 ; [.1FDE.0020.0005] # MATHEMATICAL BOLD SMALL CHI +1D712 ; [.1FDE.0020.0005] # MATHEMATICAL ITALIC SMALL CHI +1D74C ; [.1FDE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL CHI +1D786 ; [.1FDE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D7C0 ; [.1FDE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +03A7 ; [.1FDE.0020.0008] # GREEK CAPITAL LETTER CHI +1D6BE ; [.1FDE.0020.000B] # MATHEMATICAL BOLD CAPITAL CHI +1D6F8 ; [.1FDE.0020.000B] # MATHEMATICAL ITALIC CAPITAL CHI +1D732 ; [.1FDE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D76C ; [.1FDE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D7A6 ; [.1FDE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D61 ; [.1FDE.0020.0014] # MODIFIER LETTER SMALL CHI +1D6A ; [.1FDE.0020.0015] # GREEK SUBSCRIPT SMALL LETTER CHI +03C8 ; [.1FDF.0020.0002] # GREEK SMALL LETTER PSI +1D6D9 ; [.1FDF.0020.0005] # MATHEMATICAL BOLD SMALL PSI +1D713 ; [.1FDF.0020.0005] # MATHEMATICAL ITALIC SMALL PSI +1D74D ; [.1FDF.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PSI +1D787 ; [.1FDF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D7C1 ; [.1FDF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +03A8 ; [.1FDF.0020.0008] # GREEK CAPITAL LETTER PSI +1D6BF ; [.1FDF.0020.000B] # MATHEMATICAL BOLD CAPITAL PSI +1D6F9 ; [.1FDF.0020.000B] # MATHEMATICAL ITALIC CAPITAL PSI +1D733 ; [.1FDF.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D76D ; [.1FDF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D7A7 ; [.1FDF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D2A ; [.1FE0.0020.0002] # GREEK LETTER SMALL CAPITAL PSI +03C9 ; [.1FE1.0020.0002] # GREEK SMALL LETTER OMEGA +1D6DA ; [.1FE1.0020.0005] # MATHEMATICAL BOLD SMALL OMEGA +1D714 ; [.1FE1.0020.0005] # MATHEMATICAL ITALIC SMALL OMEGA +1D74E ; [.1FE1.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D788 ; [.1FE1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D7C2 ; [.1FE1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +03A9 ; [.1FE1.0020.0008] # GREEK CAPITAL LETTER OMEGA +2126 ; [.1FE1.0020.0008] # OHM SIGN +1D6C0 ; [.1FE1.0020.000B] # MATHEMATICAL BOLD CAPITAL OMEGA +1D6FA ; [.1FE1.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMEGA +1D734 ; [.1FE1.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D76E ; [.1FE1.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D7A8 ; [.1FE1.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1F60 ; [.1FE1.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMEGA WITH PSILI +1F68 ; [.1FE1.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F64 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +1F6C ; [.1FE1.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1FA4 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FAC ; [.1FE1.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F62 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +1F6A ; [.1FE1.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1FA2 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FAA ; [.1FE1.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F66 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6E ; [.1FE1.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1FA6 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FAE ; [.1FE1.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FA0 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA8 ; [.1FE1.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1F61 ; [.1FE1.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMEGA WITH DASIA +1F69 ; [.1FE1.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F65 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +1F6D ; [.1FE1.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1FA5 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FAD ; [.1FE1.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F63 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +1F6B ; [.1FE1.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1FA3 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FAB ; [.1FE1.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F67 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F6F ; [.1FE1.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1FA7 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FAF ; [.1FE1.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA1 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA9 ; [.1FE1.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +03CE ; [.1FE1.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH TONOS +1F7D ; [.1FE1.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH OXIA +038F ; [.1FE1.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH TONOS +1FFB ; [.1FE1.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FF4 ; [.1FE1.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1F7C ; [.1FE1.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH VARIA +1FFA ; [.1FE1.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FF2 ; [.1FE1.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF6 ; [.1FE1.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7 ; [.1FE1.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF3 ; [.1FE1.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FFC ; [.1FE1.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +AB65 ; [.1FE2.0020.0002] # GREEK LETTER SMALL CAPITAL OMEGA +03E1 ; [.1FE3.0020.0002] # GREEK SMALL LETTER SAMPI +03E0 ; [.1FE3.0020.0008] # GREEK LETTER SAMPI +0373 ; [.1FE4.0020.0002] # GREEK SMALL LETTER ARCHAIC SAMPI +0372 ; [.1FE4.0020.0008] # GREEK CAPITAL LETTER ARCHAIC SAMPI +03F8 ; [.1FE5.0020.0002] # GREEK SMALL LETTER SHO +03F7 ; [.1FE5.0020.0008] # GREEK CAPITAL LETTER SHO +2C81 ; [.1FE6.0020.0002] # COPTIC SMALL LETTER ALFA +2C80 ; [.1FE6.0020.0008] # COPTIC CAPITAL LETTER ALFA +2C83 ; [.1FE7.0020.0002] # COPTIC SMALL LETTER VIDA +2C82 ; [.1FE7.0020.0008] # COPTIC CAPITAL LETTER VIDA +2C85 ; [.1FE8.0020.0002] # COPTIC SMALL LETTER GAMMA +2C84 ; [.1FE8.0020.0008] # COPTIC CAPITAL LETTER GAMMA +2C87 ; [.1FE9.0020.0002] # COPTIC SMALL LETTER DALDA +2C86 ; [.1FE9.0020.0008] # COPTIC CAPITAL LETTER DALDA +2C89 ; [.1FEA.0020.0002] # COPTIC SMALL LETTER EIE +2C88 ; [.1FEA.0020.0008] # COPTIC CAPITAL LETTER EIE +2CB7 ; [.1FEB.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB6 ; [.1FEB.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2C8B ; [.1FEC.0020.0002] # COPTIC SMALL LETTER SOU +2C8A ; [.1FEC.0020.0008] # COPTIC CAPITAL LETTER SOU +2C8D ; [.1FED.0020.0002] # COPTIC SMALL LETTER ZATA +2C8C ; [.1FED.0020.0008] # COPTIC CAPITAL LETTER ZATA +2C8F ; [.1FEE.0020.0002] # COPTIC SMALL LETTER HATE +2C8E ; [.1FEE.0020.0008] # COPTIC CAPITAL LETTER HATE +2C91 ; [.1FEF.0020.0002] # COPTIC SMALL LETTER THETHE +2C90 ; [.1FEF.0020.0008] # COPTIC CAPITAL LETTER THETHE +2C93 ; [.1FF0.0020.0002] # COPTIC SMALL LETTER IAUDA +2C92 ; [.1FF0.0020.0008] # COPTIC CAPITAL LETTER IAUDA +2C95 ; [.1FF1.0020.0002] # COPTIC SMALL LETTER KAPA +2C94 ; [.1FF1.0020.0008] # COPTIC CAPITAL LETTER KAPA +2CE4 ; [.1FF1.0020.0004][.1FE6.0020.0004][.1FF0.0020.0004] # COPTIC SYMBOL KAI +2CB9 ; [.1FF2.0020.0002] # COPTIC SMALL LETTER DIALECT-P KAPA +2CB8 ; [.1FF2.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P KAPA +2C97 ; [.1FF3.0020.0002] # COPTIC SMALL LETTER LAULA +2C96 ; [.1FF3.0020.0008] # COPTIC CAPITAL LETTER LAULA +2C99 ; [.1FF4.0020.0002] # COPTIC SMALL LETTER MI +2C98 ; [.1FF4.0020.0008] # COPTIC CAPITAL LETTER MI +2C9B ; [.1FF5.0020.0002] # COPTIC SMALL LETTER NI +2C9A ; [.1FF5.0020.0008] # COPTIC CAPITAL LETTER NI +2CBB ; [.1FF6.0020.0002] # COPTIC SMALL LETTER DIALECT-P NI +2CBA ; [.1FF6.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P NI +2CBD ; [.1FF7.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBC ; [.1FF7.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2C9D ; [.1FF8.0020.0002] # COPTIC SMALL LETTER KSI +2C9C ; [.1FF8.0020.0008] # COPTIC CAPITAL LETTER KSI +2C9F ; [.1FF9.0020.0002] # COPTIC SMALL LETTER O +2C9E ; [.1FF9.0020.0008] # COPTIC CAPITAL LETTER O +2CA1 ; [.1FFA.0020.0002] # COPTIC SMALL LETTER PI +2CA0 ; [.1FFA.0020.0008] # COPTIC CAPITAL LETTER PI +2CA3 ; [.1FFB.0020.0002] # COPTIC SMALL LETTER RO +2CA2 ; [.1FFB.0020.0008] # COPTIC CAPITAL LETTER RO +2CA5 ; [.1FFC.0020.0002] # COPTIC SMALL LETTER SIMA +2CA4 ; [.1FFC.0020.0008] # COPTIC CAPITAL LETTER SIMA +2CA7 ; [.1FFD.0020.0002] # COPTIC SMALL LETTER TAU +2CA6 ; [.1FFD.0020.0008] # COPTIC CAPITAL LETTER TAU +2CA9 ; [.1FFE.0020.0002] # COPTIC SMALL LETTER UA +2CA8 ; [.1FFE.0020.0008] # COPTIC CAPITAL LETTER UA +2CAB ; [.1FFF.0020.0002] # COPTIC SMALL LETTER FI +2CAA ; [.1FFF.0020.0008] # COPTIC CAPITAL LETTER FI +2CAD ; [.2000.0020.0002] # COPTIC SMALL LETTER KHI +2CAC ; [.2000.0020.0008] # COPTIC CAPITAL LETTER KHI +2CAF ; [.2001.0020.0002] # COPTIC SMALL LETTER PSI +2CAE ; [.2001.0020.0008] # COPTIC CAPITAL LETTER PSI +2CB1 ; [.2002.0020.0002] # COPTIC SMALL LETTER OOU +2CB0 ; [.2002.0020.0008] # COPTIC CAPITAL LETTER OOU +2CBF ; [.2003.0020.0002] # COPTIC SMALL LETTER OLD COPTIC OOU +2CBE ; [.2003.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC1 ; [.2004.0020.0002] # COPTIC SMALL LETTER SAMPI +2CC0 ; [.2004.0020.0008] # COPTIC CAPITAL LETTER SAMPI +03E3 ; [.2005.0020.0002] # COPTIC SMALL LETTER SHEI +03E2 ; [.2005.0020.0008] # COPTIC CAPITAL LETTER SHEI +2CEC ; [.2006.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +2CEB ; [.2006.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CC3 ; [.2007.0020.0002] # COPTIC SMALL LETTER CROSSED SHEI +2CC2 ; [.2007.0020.0008] # COPTIC CAPITAL LETTER CROSSED SHEI +2CC5 ; [.2008.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHEI +2CC4 ; [.2008.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC7 ; [.2009.0020.0002] # COPTIC SMALL LETTER OLD COPTIC ESH +2CC6 ; [.2009.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC ESH +03E5 ; [.200A.0020.0002] # COPTIC SMALL LETTER FEI +03E4 ; [.200A.0020.0008] # COPTIC CAPITAL LETTER FEI +03E7 ; [.200B.0020.0002] # COPTIC SMALL LETTER KHEI +03E6 ; [.200B.0020.0008] # COPTIC CAPITAL LETTER KHEI +2CF3 ; [.200C.0020.0002] # COPTIC SMALL LETTER BOHAIRIC KHEI +2CF2 ; [.200C.0020.0008] # COPTIC CAPITAL LETTER BOHAIRIC KHEI +2CC9 ; [.200D.0020.0002] # COPTIC SMALL LETTER AKHMIMIC KHEI +2CC8 ; [.200D.0020.0008] # COPTIC CAPITAL LETTER AKHMIMIC KHEI +03E9 ; [.200E.0020.0002] # COPTIC SMALL LETTER HORI +03E8 ; [.200E.0020.0008] # COPTIC CAPITAL LETTER HORI +2CCB ; [.200F.0020.0002] # COPTIC SMALL LETTER DIALECT-P HORI +2CCA ; [.200F.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCD ; [.2010.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HORI +2CCC ; [.2010.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCF ; [.2011.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HA +2CCE ; [.2011.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HA +2CD1 ; [.2012.0020.0002] # COPTIC SMALL LETTER L-SHAPED HA +2CD0 ; [.2012.0020.0008] # COPTIC CAPITAL LETTER L-SHAPED HA +2CD3 ; [.2013.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HEI +2CD2 ; [.2013.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD5 ; [.2014.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HAT +2CD4 ; [.2014.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HAT +03EB ; [.2015.0020.0002] # COPTIC SMALL LETTER GANGIA +03EA ; [.2015.0020.0008] # COPTIC CAPITAL LETTER GANGIA +2CEE ; [.2016.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CED ; [.2016.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CD7 ; [.2017.0020.0002] # COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD6 ; [.2017.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +03ED ; [.2018.0020.0002] # COPTIC SMALL LETTER SHIMA +03EC ; [.2018.0020.0008] # COPTIC CAPITAL LETTER SHIMA +2CD9 ; [.2019.0020.0002] # COPTIC SMALL LETTER OLD COPTIC DJA +2CD8 ; [.2019.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDB ; [.201A.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDA ; [.201A.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDD ; [.201B.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDC ; [.201B.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +03EF ; [.201C.0020.0002] # COPTIC SMALL LETTER DEI +03EE ; [.201C.0020.0008] # COPTIC CAPITAL LETTER DEI +2CB3 ; [.201D.0020.0002] # COPTIC SMALL LETTER DIALECT-P ALEF +2CB2 ; [.201D.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB5 ; [.201E.0020.0002] # COPTIC SMALL LETTER OLD COPTIC AIN +2CB4 ; [.201E.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CDF ; [.201F.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NGI +2CDE ; [.201F.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE1 ; [.2020.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NYI +2CE0 ; [.2020.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE3 ; [.2021.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN WAU +2CE2 ; [.2021.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN WAU +0430 ; [.2022.0020.0002] # CYRILLIC SMALL LETTER A +2DF6 ; [.2022.0020.0004] # COMBINING CYRILLIC LETTER A +0410 ; [.2022.0020.0008] # CYRILLIC CAPITAL LETTER A +04D1 ; [.2022.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER A WITH BREVE +04D0 ; [.2022.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER A WITH BREVE +04D3 ; [.2022.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER A WITH DIAERESIS +04D2 ; [.2022.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D9 ; [.2026.0020.0002] # CYRILLIC SMALL LETTER SCHWA +04D8 ; [.2026.0020.0008] # CYRILLIC CAPITAL LETTER SCHWA +04DB ; [.2026.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DA ; [.2026.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04D5 ; [.202A.0020.0002] # CYRILLIC SMALL LIGATURE A IE +04D4 ; [.202A.0020.0008] # CYRILLIC CAPITAL LIGATURE A IE +0431 ; [.202E.0020.0002] # CYRILLIC SMALL LETTER BE +2DE0 ; [.202E.0020.0004] # COMBINING CYRILLIC LETTER BE +0411 ; [.202E.0020.0008] # CYRILLIC CAPITAL LETTER BE +0432 ; [.2032.0020.0002] # CYRILLIC SMALL LETTER VE +1C80 ; [.2032.0020.0004] # CYRILLIC SMALL LETTER ROUNDED VE +2DE1 ; [.2032.0020.0004] # COMBINING CYRILLIC LETTER VE +0412 ; [.2032.0020.0008] # CYRILLIC CAPITAL LETTER VE +0433 ; [.2036.0020.0002] # CYRILLIC SMALL LETTER GHE +2DE2 ; [.2036.0020.0004] # COMBINING CYRILLIC LETTER GHE +0413 ; [.2036.0020.0008] # CYRILLIC CAPITAL LETTER GHE +0453 ; [.2036.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER GJE +0403 ; [.2036.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER GJE +0491 ; [.2036.0020.0004][.0000.0111.0004] # CYRILLIC SMALL LETTER GHE WITH UPTURN +0490 ; [.2036.0020.000A][.0000.0111.0004] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0493 ; [.203A.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE +0492 ; [.203A.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE +04FB ; [.203E.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +04FA ; [.203E.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +0495 ; [.2042.0020.0002] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0494 ; [.2042.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +04F7 ; [.2046.0020.0002] # CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F6 ; [.2046.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +0434 ; [.204A.0020.0002] # CYRILLIC SMALL LETTER DE +1C81 ; [.204A.0020.0004] # CYRILLIC SMALL LETTER LONG-LEGGED DE +2DE3 ; [.204A.0020.0004] # COMBINING CYRILLIC LETTER DE +0414 ; [.204A.0020.0008] # CYRILLIC CAPITAL LETTER DE +0501 ; [.204E.0020.0002] # CYRILLIC SMALL LETTER KOMI DE +0500 ; [.204E.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DE +A681 ; [.204F.0020.0002] # CYRILLIC SMALL LETTER DWE +A680 ; [.204F.0020.0008] # CYRILLIC CAPITAL LETTER DWE +0452 ; [.2050.0020.0002] # CYRILLIC SMALL LETTER DJE +0402 ; [.2050.0020.0008] # CYRILLIC CAPITAL LETTER DJE +A663 ; [.2054.0020.0002] # CYRILLIC SMALL LETTER SOFT DE +A662 ; [.2054.0020.0008] # CYRILLIC CAPITAL LETTER SOFT DE +0503 ; [.2055.0020.0002] # CYRILLIC SMALL LETTER KOMI DJE +0502 ; [.2055.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DJE +0499 ; [.2056.0020.0002] # CYRILLIC SMALL LETTER ZE WITH DESCENDER +0498 ; [.2056.0020.0008] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0435 ; [.205A.0020.0002] # CYRILLIC SMALL LETTER IE +2DF7 ; [.205A.0020.0004] # COMBINING CYRILLIC LETTER IE +0415 ; [.205A.0020.0008] # CYRILLIC CAPITAL LETTER IE +0450 ; [.205A.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER IE WITH GRAVE +0400 ; [.205A.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER IE WITH GRAVE +04D7 ; [.205A.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER IE WITH BREVE +04D6 ; [.205A.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER IE WITH BREVE +0451 ; [.205A.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER IO +0401 ; [.205A.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER IO +0454 ; [.205E.0020.0002] # CYRILLIC SMALL LETTER UKRAINIAN IE +A674 ; [.205E.0020.0004] # COMBINING CYRILLIC LETTER UKRAINIAN IE +0404 ; [.205E.0020.0008] # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0436 ; [.2062.0020.0002] # CYRILLIC SMALL LETTER ZHE +2DE4 ; [.2062.0020.0004] # COMBINING CYRILLIC LETTER ZHE +0416 ; [.2062.0020.0008] # CYRILLIC CAPITAL LETTER ZHE +04C2 ; [.2062.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER ZHE WITH BREVE +04C1 ; [.2062.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04DD ; [.2062.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DC ; [.2062.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +052B ; [.2066.0020.0002] # CYRILLIC SMALL LETTER DZZHE +052A ; [.2066.0020.0008] # CYRILLIC CAPITAL LETTER DZZHE +A685 ; [.2067.0020.0002] # CYRILLIC SMALL LETTER ZHWE +A684 ; [.2067.0020.0008] # CYRILLIC CAPITAL LETTER ZHWE +0497 ; [.2068.0020.0002] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0496 ; [.2068.0020.0008] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0437 ; [.206C.0020.0002] # CYRILLIC SMALL LETTER ZE +2DE5 ; [.206C.0020.0004] # COMBINING CYRILLIC LETTER ZE +0417 ; [.206C.0020.0008] # CYRILLIC CAPITAL LETTER ZE +04DF ; [.206C.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04DE ; [.206C.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +A641 ; [.2070.0020.0002] # CYRILLIC SMALL LETTER ZEMLYA +A640 ; [.2070.0020.0008] # CYRILLIC CAPITAL LETTER ZEMLYA +0505 ; [.2071.0020.0002] # CYRILLIC SMALL LETTER KOMI ZJE +0504 ; [.2071.0020.0008] # CYRILLIC CAPITAL LETTER KOMI ZJE +0511 ; [.2072.0020.0002] # CYRILLIC SMALL LETTER REVERSED ZE +0510 ; [.2072.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED ZE +A643 ; [.2073.0020.0002] # CYRILLIC SMALL LETTER DZELO +A642 ; [.2073.0020.0008] # CYRILLIC CAPITAL LETTER DZELO +0455 ; [.2074.0020.0002] # CYRILLIC SMALL LETTER DZE +0405 ; [.2074.0020.0008] # CYRILLIC CAPITAL LETTER DZE +A645 ; [.2078.0020.0002] # CYRILLIC SMALL LETTER REVERSED DZE +A644 ; [.2078.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED DZE +04E1 ; [.2079.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN DZE +04E0 ; [.2079.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +A689 ; [.207D.0020.0002] # CYRILLIC SMALL LETTER DZZE +A688 ; [.207D.0020.0008] # CYRILLIC CAPITAL LETTER DZZE +0507 ; [.207E.0020.0002] # CYRILLIC SMALL LETTER KOMI DZJE +0506 ; [.207E.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DZJE +A683 ; [.207F.0020.0002] # CYRILLIC SMALL LETTER DZWE +A682 ; [.207F.0020.0008] # CYRILLIC CAPITAL LETTER DZWE +0438 ; [.2080.0020.0002] # CYRILLIC SMALL LETTER I +A675 ; [.2080.0020.0004] # COMBINING CYRILLIC LETTER I +0418 ; [.2080.0020.0008] # CYRILLIC CAPITAL LETTER I +045D ; [.2080.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER I WITH GRAVE +040D ; [.2080.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER I WITH GRAVE +04E5 ; [.2080.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER I WITH DIAERESIS +04E4 ; [.2080.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E3 ; [.2080.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER I WITH MACRON +04E2 ; [.2080.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER I WITH MACRON +048B ; [.2084.0020.0002] # CYRILLIC SMALL LETTER SHORT I WITH TAIL +048A ; [.2084.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +0456 ; [.2088.0020.0002] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0406 ; [.2088.0020.0008] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0457 ; [.2088.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YI +A676 ; [.2088.0020.0004][.0000.002B.0004] # COMBINING CYRILLIC LETTER YI +0407 ; [.2088.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YI +A647 ; [.208C.0020.0002] # CYRILLIC SMALL LETTER IOTA +A646 ; [.208C.0020.0008] # CYRILLIC CAPITAL LETTER IOTA +0439 ; [.208D.0020.0002] # CYRILLIC SMALL LETTER SHORT I +0438 0306 ; [.208D.0020.0002] # CYRILLIC SMALL LETTER SHORT I +0419 ; [.208D.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I +0418 0306 ; [.208D.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I +0458 ; [.2091.0020.0002] # CYRILLIC SMALL LETTER JE +0408 ; [.2091.0020.0008] # CYRILLIC CAPITAL LETTER JE +A649 ; [.2095.0020.0002] # CYRILLIC SMALL LETTER DJERV +2DF8 ; [.2095.0020.0004] # COMBINING CYRILLIC LETTER DJERV +A648 ; [.2095.0020.0008] # CYRILLIC CAPITAL LETTER DJERV +043A ; [.2096.0020.0002] # CYRILLIC SMALL LETTER KA +2DE6 ; [.2096.0020.0004] # COMBINING CYRILLIC LETTER KA +041A ; [.2096.0020.0008] # CYRILLIC CAPITAL LETTER KA +045C ; [.2096.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER KJE +040C ; [.2096.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER KJE +049B ; [.209A.0020.0002] # CYRILLIC SMALL LETTER KA WITH DESCENDER +049A ; [.209A.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +04C4 ; [.209E.0020.0002] # CYRILLIC SMALL LETTER KA WITH HOOK +04C3 ; [.209E.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH HOOK +04A1 ; [.20A2.0020.0002] # CYRILLIC SMALL LETTER BASHKIR KA +04A0 ; [.20A2.0020.0008] # CYRILLIC CAPITAL LETTER BASHKIR KA +049F ; [.20A6.0020.0002] # CYRILLIC SMALL LETTER KA WITH STROKE +049E ; [.20A6.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH STROKE +049D ; [.20AA.0020.0002] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049C ; [.20AA.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +051F ; [.20AE.0020.0002] # CYRILLIC SMALL LETTER ALEUT KA +051E ; [.20AE.0020.0008] # CYRILLIC CAPITAL LETTER ALEUT KA +051B ; [.20AF.0020.0002] # CYRILLIC SMALL LETTER QA +051A ; [.20AF.0020.0008] # CYRILLIC CAPITAL LETTER QA +043B ; [.20B0.0020.0002] # CYRILLIC SMALL LETTER EL +2DE7 ; [.20B0.0020.0004] # COMBINING CYRILLIC LETTER EL +041B ; [.20B0.0020.0008] # CYRILLIC CAPITAL LETTER EL +1D2B ; [.20B4.0020.0002] # CYRILLIC LETTER SMALL CAPITAL EL +04C6 ; [.20B5.0020.0002] # CYRILLIC SMALL LETTER EL WITH TAIL +04C5 ; [.20B5.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH TAIL +052F ; [.20B9.0020.0002] # CYRILLIC SMALL LETTER EL WITH DESCENDER +052E ; [.20B9.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0513 ; [.20BA.0020.0002] # CYRILLIC SMALL LETTER EL WITH HOOK +0512 ; [.20BA.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH HOOK +0521 ; [.20BB.0020.0002] # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +0520 ; [.20BB.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0459 ; [.20BC.0020.0002] # CYRILLIC SMALL LETTER LJE +0409 ; [.20BC.0020.0008] # CYRILLIC CAPITAL LETTER LJE +A665 ; [.20C0.0020.0002] # CYRILLIC SMALL LETTER SOFT EL +A664 ; [.20C0.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EL +0509 ; [.20C1.0020.0002] # CYRILLIC SMALL LETTER KOMI LJE +0508 ; [.20C1.0020.0008] # CYRILLIC CAPITAL LETTER KOMI LJE +0515 ; [.20C2.0020.0002] # CYRILLIC SMALL LETTER LHA +0514 ; [.20C2.0020.0008] # CYRILLIC CAPITAL LETTER LHA +043C ; [.20C3.0020.0002] # CYRILLIC SMALL LETTER EM +2DE8 ; [.20C3.0020.0004] # COMBINING CYRILLIC LETTER EM +041C ; [.20C3.0020.0008] # CYRILLIC CAPITAL LETTER EM +04CE ; [.20C7.0020.0002] # CYRILLIC SMALL LETTER EM WITH TAIL +04CD ; [.20C7.0020.0008] # CYRILLIC CAPITAL LETTER EM WITH TAIL +A667 ; [.20CB.0020.0002] # CYRILLIC SMALL LETTER SOFT EM +A666 ; [.20CB.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EM +043D ; [.20CC.0020.0002] # CYRILLIC SMALL LETTER EN +2DE9 ; [.20CC.0020.0004] # COMBINING CYRILLIC LETTER EN +041D ; [.20CC.0020.0008] # CYRILLIC CAPITAL LETTER EN +1D78 ; [.20CC.0020.0014] # MODIFIER LETTER CYRILLIC EN +0529 ; [.20D0.0020.0002] # CYRILLIC SMALL LETTER EN WITH LEFT HOOK +0528 ; [.20D0.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +04CA ; [.20D1.0020.0002] # CYRILLIC SMALL LETTER EN WITH TAIL +04C9 ; [.20D1.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH TAIL +04A3 ; [.20D5.0020.0002] # CYRILLIC SMALL LETTER EN WITH DESCENDER +04A2 ; [.20D5.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04C8 ; [.20D9.0020.0002] # CYRILLIC SMALL LETTER EN WITH HOOK +04C7 ; [.20D9.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH HOOK +0523 ; [.20DD.0020.0002] # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +0522 ; [.20DD.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +04A5 ; [.20DE.0020.0002] # CYRILLIC SMALL LIGATURE EN GHE +04A4 ; [.20DE.0020.0008] # CYRILLIC CAPITAL LIGATURE EN GHE +045A ; [.20E2.0020.0002] # CYRILLIC SMALL LETTER NJE +040A ; [.20E2.0020.0008] # CYRILLIC CAPITAL LETTER NJE +050B ; [.20E6.0020.0002] # CYRILLIC SMALL LETTER KOMI NJE +050A ; [.20E6.0020.0008] # CYRILLIC CAPITAL LETTER KOMI NJE +043E ; [.20E7.0020.0002] # CYRILLIC SMALL LETTER O +1C82 ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER NARROW O +2DEA ; [.20E7.0020.0004] # COMBINING CYRILLIC LETTER O +A669 ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER MONOCULAR O +A66B ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER BINOCULAR O +A66D ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; [.20E7.0020.0004] # CYRILLIC LETTER MULTIOCULAR O +A699 ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER DOUBLE O +A69B ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER CROSSED O +041E ; [.20E7.0020.0008] # CYRILLIC CAPITAL LETTER O +A668 ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER MONOCULAR O +A66A ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER BINOCULAR O +A66C ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A698 ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE O +A69A ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER CROSSED O +04E7 ; [.20E7.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER O WITH DIAERESIS +04E6 ; [.20E7.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E9 ; [.20EB.0020.0002] # CYRILLIC SMALL LETTER BARRED O +04E8 ; [.20EB.0020.0008] # CYRILLIC CAPITAL LETTER BARRED O +04EB ; [.20EB.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EA ; [.20EB.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +043F ; [.20EF.0020.0002] # CYRILLIC SMALL LETTER PE +2DEB ; [.20EF.0020.0004] # COMBINING CYRILLIC LETTER PE +041F ; [.20EF.0020.0008] # CYRILLIC CAPITAL LETTER PE +0525 ; [.20F3.0020.0002] # CYRILLIC SMALL LETTER PE WITH DESCENDER +0524 ; [.20F3.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +04A7 ; [.20F4.0020.0002] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A6 ; [.20F4.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +0481 ; [.20F8.0020.0002] # CYRILLIC SMALL LETTER KOPPA +0480 ; [.20F8.0020.0008] # CYRILLIC CAPITAL LETTER KOPPA +0440 ; [.20FC.0020.0002] # CYRILLIC SMALL LETTER ER +2DEC ; [.20FC.0020.0004] # COMBINING CYRILLIC LETTER ER +0420 ; [.20FC.0020.0008] # CYRILLIC CAPITAL LETTER ER +048F ; [.2100.0020.0002] # CYRILLIC SMALL LETTER ER WITH TICK +048E ; [.2100.0020.0008] # CYRILLIC CAPITAL LETTER ER WITH TICK +0517 ; [.2104.0020.0002] # CYRILLIC SMALL LETTER RHA +0516 ; [.2104.0020.0008] # CYRILLIC CAPITAL LETTER RHA +0441 ; [.2105.0020.0002] # CYRILLIC SMALL LETTER ES +1C83 ; [.2105.0020.0004] # CYRILLIC SMALL LETTER WIDE ES +2DED ; [.2105.0020.0004] # COMBINING CYRILLIC LETTER ES +0421 ; [.2105.0020.0008] # CYRILLIC CAPITAL LETTER ES +2DF5 ; [.2105.0020.0004][.210E.0020.0004] # COMBINING CYRILLIC LETTER ES-TE +050D ; [.2109.0020.0002] # CYRILLIC SMALL LETTER KOMI SJE +050C ; [.2109.0020.0008] # CYRILLIC CAPITAL LETTER KOMI SJE +04AB ; [.210A.0020.0002] # CYRILLIC SMALL LETTER ES WITH DESCENDER +04AA ; [.210A.0020.0008] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +0442 ; [.210E.0020.0002] # CYRILLIC SMALL LETTER TE +1C84 ; [.210E.0020.0004] # CYRILLIC SMALL LETTER TALL TE +1C85 ; [.210E.0020.0004] # CYRILLIC SMALL LETTER THREE-LEGGED TE +2DEE ; [.210E.0020.0004] # COMBINING CYRILLIC LETTER TE +0422 ; [.210E.0020.0008] # CYRILLIC CAPITAL LETTER TE +A68D ; [.2112.0020.0002] # CYRILLIC SMALL LETTER TWE +A68C ; [.2112.0020.0008] # CYRILLIC CAPITAL LETTER TWE +050F ; [.2113.0020.0002] # CYRILLIC SMALL LETTER KOMI TJE +050E ; [.2113.0020.0008] # CYRILLIC CAPITAL LETTER KOMI TJE +04AD ; [.2114.0020.0002] # CYRILLIC SMALL LETTER TE WITH DESCENDER +04AC ; [.2114.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +A68B ; [.2118.0020.0002] # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +A68A ; [.2118.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +045B ; [.2119.0020.0002] # CYRILLIC SMALL LETTER TSHE +040B ; [.2119.0020.0008] # CYRILLIC CAPITAL LETTER TSHE +0443 ; [.211D.0020.0002] # CYRILLIC SMALL LETTER U +A677 ; [.211D.0020.0004] # COMBINING CYRILLIC LETTER U +0423 ; [.211D.0020.0008] # CYRILLIC CAPITAL LETTER U +045E ; [.211D.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER SHORT U +040E ; [.211D.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER SHORT U +04F1 ; [.211D.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER U WITH DIAERESIS +04F0 ; [.211D.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F3 ; [.211D.0020.0002][.0000.002C.0002] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F2 ; [.211D.0020.0008][.0000.002C.0002] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04EF ; [.211D.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER U WITH MACRON +04EE ; [.211D.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER U WITH MACRON +04AF ; [.2121.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U +04AE ; [.2121.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U +04B1 ; [.2125.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B0 ; [.2125.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +A64B ; [.2129.0020.0002] # CYRILLIC SMALL LETTER MONOGRAPH UK +1C88 ; [.2129.0020.0004] # CYRILLIC SMALL LETTER UNBLENDED UK +2DF9 ; [.2129.0020.0004] # COMBINING CYRILLIC LETTER MONOGRAPH UK +A64A ; [.2129.0020.0008] # CYRILLIC CAPITAL LETTER MONOGRAPH UK +0479 ; [.212A.0020.0002] # CYRILLIC SMALL LETTER UK +0478 ; [.212A.0020.0008] # CYRILLIC CAPITAL LETTER UK +0444 ; [.212E.0020.0002] # CYRILLIC SMALL LETTER EF +A69E ; [.212E.0020.0004] # COMBINING CYRILLIC LETTER EF +0424 ; [.212E.0020.0008] # CYRILLIC CAPITAL LETTER EF +0445 ; [.2132.0020.0002] # CYRILLIC SMALL LETTER HA +2DEF ; [.2132.0020.0004] # COMBINING CYRILLIC LETTER HA +0425 ; [.2132.0020.0008] # CYRILLIC CAPITAL LETTER HA +04FD ; [.2136.0020.0002] # CYRILLIC SMALL LETTER HA WITH HOOK +04FC ; [.2136.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH HOOK +04FF ; [.213A.0020.0002] # CYRILLIC SMALL LETTER HA WITH STROKE +04FE ; [.213A.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH STROKE +04B3 ; [.213E.0020.0002] # CYRILLIC SMALL LETTER HA WITH DESCENDER +04B2 ; [.213E.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04BB ; [.2142.0020.0002] # CYRILLIC SMALL LETTER SHHA +04BA ; [.2142.0020.0008] # CYRILLIC CAPITAL LETTER SHHA +0527 ; [.2146.0020.0002] # CYRILLIC SMALL LETTER SHHA WITH DESCENDER +0526 ; [.2146.0020.0008] # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +A695 ; [.2147.0020.0002] # CYRILLIC SMALL LETTER HWE +A694 ; [.2147.0020.0008] # CYRILLIC CAPITAL LETTER HWE +0461 ; [.2148.0020.0002] # CYRILLIC SMALL LETTER OMEGA +A67B ; [.2148.0020.0004] # COMBINING CYRILLIC LETTER OMEGA +0460 ; [.2148.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA +047F ; [.214C.0020.0002] # CYRILLIC SMALL LETTER OT +047E ; [.214C.0020.0008] # CYRILLIC CAPITAL LETTER OT +A64D ; [.2150.0020.0002] # CYRILLIC SMALL LETTER BROAD OMEGA +A64C ; [.2150.0020.0008] # CYRILLIC CAPITAL LETTER BROAD OMEGA +047D ; [.2151.0020.0002] # CYRILLIC SMALL LETTER OMEGA WITH TITLO +047C ; [.2151.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047B ; [.2155.0020.0002] # CYRILLIC SMALL LETTER ROUND OMEGA +047A ; [.2155.0020.0008] # CYRILLIC CAPITAL LETTER ROUND OMEGA +0446 ; [.2159.0020.0002] # CYRILLIC SMALL LETTER TSE +2DF0 ; [.2159.0020.0004] # COMBINING CYRILLIC LETTER TSE +0426 ; [.2159.0020.0008] # CYRILLIC CAPITAL LETTER TSE +A661 ; [.215D.0020.0002] # CYRILLIC SMALL LETTER REVERSED TSE +A660 ; [.215D.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED TSE +A68F ; [.215E.0020.0002] # CYRILLIC SMALL LETTER TSWE +A68E ; [.215E.0020.0008] # CYRILLIC CAPITAL LETTER TSWE +04B5 ; [.215F.0020.0002] # CYRILLIC SMALL LIGATURE TE TSE +04B4 ; [.215F.0020.0008] # CYRILLIC CAPITAL LIGATURE TE TSE +A691 ; [.2163.0020.0002] # CYRILLIC SMALL LETTER TSSE +A690 ; [.2163.0020.0008] # CYRILLIC CAPITAL LETTER TSSE +0447 ; [.2164.0020.0002] # CYRILLIC SMALL LETTER CHE +2DF1 ; [.2164.0020.0004] # COMBINING CYRILLIC LETTER CHE +0427 ; [.2164.0020.0008] # CYRILLIC CAPITAL LETTER CHE +04F5 ; [.2164.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F4 ; [.2164.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +052D ; [.2168.0020.0002] # CYRILLIC SMALL LETTER DCHE +052C ; [.2168.0020.0008] # CYRILLIC CAPITAL LETTER DCHE +A693 ; [.2169.0020.0002] # CYRILLIC SMALL LETTER TCHE +A692 ; [.2169.0020.0008] # CYRILLIC CAPITAL LETTER TCHE +04B7 ; [.216A.0020.0002] # CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B6 ; [.216A.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04CC ; [.216E.0020.0002] # CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CB ; [.216E.0020.0008] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04B9 ; [.2172.0020.0002] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04B8 ; [.2172.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +A687 ; [.2176.0020.0002] # CYRILLIC SMALL LETTER CCHE +A686 ; [.2176.0020.0008] # CYRILLIC CAPITAL LETTER CCHE +04BD ; [.2177.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE +04BC ; [.2177.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BF ; [.217B.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04BE ; [.217B.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +045F ; [.217F.0020.0002] # CYRILLIC SMALL LETTER DZHE +040F ; [.217F.0020.0008] # CYRILLIC CAPITAL LETTER DZHE +0448 ; [.2183.0020.0002] # CYRILLIC SMALL LETTER SHA +2DF2 ; [.2183.0020.0004] # COMBINING CYRILLIC LETTER SHA +0428 ; [.2183.0020.0008] # CYRILLIC CAPITAL LETTER SHA +A697 ; [.2187.0020.0002] # CYRILLIC SMALL LETTER SHWE +A696 ; [.2187.0020.0008] # CYRILLIC CAPITAL LETTER SHWE +0449 ; [.2188.0020.0002] # CYRILLIC SMALL LETTER SHCHA +2DF3 ; [.2188.0020.0004] # COMBINING CYRILLIC LETTER SHCHA +0429 ; [.2188.0020.0008] # CYRILLIC CAPITAL LETTER SHCHA +A64F ; [.218C.0020.0002] # CYRILLIC SMALL LETTER NEUTRAL YER +A64E ; [.218C.0020.0008] # CYRILLIC CAPITAL LETTER NEUTRAL YER +2E2F ; [.218D.0020.0002] # VERTICAL TILDE +A67F ; [.218E.0020.0002] # CYRILLIC PAYEROK +044A ; [.218F.0020.0002] # CYRILLIC SMALL LETTER HARD SIGN +1C86 ; [.218F.0020.0004] # CYRILLIC SMALL LETTER TALL HARD SIGN +A678 ; [.218F.0020.0004] # COMBINING CYRILLIC LETTER HARD SIGN +042A ; [.218F.0020.0008] # CYRILLIC CAPITAL LETTER HARD SIGN +A69C ; [.218F.0020.0014] # MODIFIER LETTER CYRILLIC HARD SIGN +A651 ; [.2193.0020.0002] # CYRILLIC SMALL LETTER YERU WITH BACK YER +A650 ; [.2193.0020.0008] # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +044B ; [.2194.0020.0002] # CYRILLIC SMALL LETTER YERU +A679 ; [.2194.0020.0004] # COMBINING CYRILLIC LETTER YERU +042B ; [.2194.0020.0008] # CYRILLIC CAPITAL LETTER YERU +04F9 ; [.2194.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS +04F8 ; [.2194.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +044C ; [.2198.0020.0002] # CYRILLIC SMALL LETTER SOFT SIGN +A67A ; [.2198.0020.0004] # COMBINING CYRILLIC LETTER SOFT SIGN +042C ; [.2198.0020.0008] # CYRILLIC CAPITAL LETTER SOFT SIGN +A69D ; [.2198.0020.0014] # MODIFIER LETTER CYRILLIC SOFT SIGN +048D ; [.219C.0020.0002] # CYRILLIC SMALL LETTER SEMISOFT SIGN +048C ; [.219C.0020.0008] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +0463 ; [.21A0.0020.0002] # CYRILLIC SMALL LETTER YAT +1C87 ; [.21A0.0020.0004] # CYRILLIC SMALL LETTER TALL YAT +2DFA ; [.21A0.0020.0004] # COMBINING CYRILLIC LETTER YAT +0462 ; [.21A0.0020.0008] # CYRILLIC CAPITAL LETTER YAT +A653 ; [.21A4.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED YAT +A652 ; [.21A4.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED YAT +044D ; [.21A5.0020.0002] # CYRILLIC SMALL LETTER E +042D ; [.21A5.0020.0008] # CYRILLIC CAPITAL LETTER E +04ED ; [.21A5.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER E WITH DIAERESIS +04EC ; [.21A5.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +044E ; [.21A9.0020.0002] # CYRILLIC SMALL LETTER YU +2DFB ; [.21A9.0020.0004] # COMBINING CYRILLIC LETTER YU +042E ; [.21A9.0020.0008] # CYRILLIC CAPITAL LETTER YU +A655 ; [.21AD.0020.0002] # CYRILLIC SMALL LETTER REVERSED YU +A654 ; [.21AD.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED YU +A657 ; [.21AE.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED A +2DFC ; [.21AE.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED A +A656 ; [.21AE.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED A +044F ; [.21AF.0020.0002] # CYRILLIC SMALL LETTER YA +042F ; [.21AF.0020.0008] # CYRILLIC CAPITAL LETTER YA +0519 ; [.21B3.0020.0002] # CYRILLIC SMALL LETTER YAE +0518 ; [.21B3.0020.0008] # CYRILLIC CAPITAL LETTER YAE +0465 ; [.21B4.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED E +A69F ; [.21B4.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED E +0464 ; [.21B4.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED E +0467 ; [.21B8.0020.0002] # CYRILLIC SMALL LETTER LITTLE YUS +2DFD ; [.21B8.0020.0004] # COMBINING CYRILLIC LETTER LITTLE YUS +0466 ; [.21B8.0020.0008] # CYRILLIC CAPITAL LETTER LITTLE YUS +A659 ; [.21BC.0020.0002] # CYRILLIC SMALL LETTER CLOSED LITTLE YUS +A658 ; [.21BC.0020.0008] # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +046B ; [.21BD.0020.0002] # CYRILLIC SMALL LETTER BIG YUS +2DFE ; [.21BD.0020.0004] # COMBINING CYRILLIC LETTER BIG YUS +046A ; [.21BD.0020.0008] # CYRILLIC CAPITAL LETTER BIG YUS +A65B ; [.21C1.0020.0002] # CYRILLIC SMALL LETTER BLENDED YUS +A65A ; [.21C1.0020.0008] # CYRILLIC CAPITAL LETTER BLENDED YUS +0469 ; [.21C2.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +0468 ; [.21C2.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +A65D ; [.21C6.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +A65C ; [.21C6.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +046D ; [.21C7.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS +2DFF ; [.21C7.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +046C ; [.21C7.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046F ; [.21CB.0020.0002] # CYRILLIC SMALL LETTER KSI +046E ; [.21CB.0020.0008] # CYRILLIC CAPITAL LETTER KSI +0471 ; [.21CF.0020.0002] # CYRILLIC SMALL LETTER PSI +0470 ; [.21CF.0020.0008] # CYRILLIC CAPITAL LETTER PSI +0473 ; [.21D3.0020.0002] # CYRILLIC SMALL LETTER FITA +2DF4 ; [.21D3.0020.0004] # COMBINING CYRILLIC LETTER FITA +0472 ; [.21D3.0020.0008] # CYRILLIC CAPITAL LETTER FITA +0475 ; [.21D7.0020.0002] # CYRILLIC SMALL LETTER IZHITSA +0474 ; [.21D7.0020.0008] # CYRILLIC CAPITAL LETTER IZHITSA +0477 ; [.21D7.0020.0002][.0000.003C.0002] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0476 ; [.21D7.0020.0008][.0000.003C.0002] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +A65F ; [.21DB.0020.0002] # CYRILLIC SMALL LETTER YN +A65E ; [.21DB.0020.0008] # CYRILLIC CAPITAL LETTER YN +04A9 ; [.21DC.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN HA +04A8 ; [.21DC.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN HA +051D ; [.21E0.0020.0002] # CYRILLIC SMALL LETTER WE +051C ; [.21E0.0020.0008] # CYRILLIC CAPITAL LETTER WE +04CF ; [.21E1.0020.0002] # CYRILLIC SMALL LETTER PALOCHKA +04C0 ; [.21E1.0020.0008] # CYRILLIC LETTER PALOCHKA +2C30 ; [.21E5.0020.0002] # GLAGOLITIC SMALL LETTER AZU +1E000 ; [.21E5.0020.0004] # COMBINING GLAGOLITIC LETTER AZU +2C00 ; [.21E5.0020.0008] # GLAGOLITIC CAPITAL LETTER AZU +2C31 ; [.21E6.0020.0002] # GLAGOLITIC SMALL LETTER BUKY +1E001 ; [.21E6.0020.0004] # COMBINING GLAGOLITIC LETTER BUKY +2C01 ; [.21E6.0020.0008] # GLAGOLITIC CAPITAL LETTER BUKY +2C32 ; [.21E7.0020.0002] # GLAGOLITIC SMALL LETTER VEDE +1E002 ; [.21E7.0020.0004] # COMBINING GLAGOLITIC LETTER VEDE +2C02 ; [.21E7.0020.0008] # GLAGOLITIC CAPITAL LETTER VEDE +2C33 ; [.21E8.0020.0002] # GLAGOLITIC SMALL LETTER GLAGOLI +1E003 ; [.21E8.0020.0004] # COMBINING GLAGOLITIC LETTER GLAGOLI +2C03 ; [.21E8.0020.0008] # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C34 ; [.21E9.0020.0002] # GLAGOLITIC SMALL LETTER DOBRO +1E004 ; [.21E9.0020.0004] # COMBINING GLAGOLITIC LETTER DOBRO +2C04 ; [.21E9.0020.0008] # GLAGOLITIC CAPITAL LETTER DOBRO +2C35 ; [.21EA.0020.0002] # GLAGOLITIC SMALL LETTER YESTU +1E005 ; [.21EA.0020.0004] # COMBINING GLAGOLITIC LETTER YESTU +2C05 ; [.21EA.0020.0008] # GLAGOLITIC CAPITAL LETTER YESTU +2C36 ; [.21EB.0020.0002] # GLAGOLITIC SMALL LETTER ZHIVETE +1E006 ; [.21EB.0020.0004] # COMBINING GLAGOLITIC LETTER ZHIVETE +2C06 ; [.21EB.0020.0008] # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C37 ; [.21EC.0020.0002] # GLAGOLITIC SMALL LETTER DZELO +2C07 ; [.21EC.0020.0008] # GLAGOLITIC CAPITAL LETTER DZELO +2C38 ; [.21ED.0020.0002] # GLAGOLITIC SMALL LETTER ZEMLJA +1E008 ; [.21ED.0020.0004] # COMBINING GLAGOLITIC LETTER ZEMLJA +2C08 ; [.21ED.0020.0008] # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C39 ; [.21EE.0020.0002] # GLAGOLITIC SMALL LETTER IZHE +1E009 ; [.21EE.0020.0004] # COMBINING GLAGOLITIC LETTER IZHE +2C09 ; [.21EE.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHE +2C3A ; [.21EF.0020.0002] # GLAGOLITIC SMALL LETTER INITIAL IZHE +1E00A ; [.21EF.0020.0004] # COMBINING GLAGOLITIC LETTER INITIAL IZHE +2C0A ; [.21EF.0020.0008] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C3B ; [.21F0.0020.0002] # GLAGOLITIC SMALL LETTER I +1E00B ; [.21F0.0020.0004] # COMBINING GLAGOLITIC LETTER I +2C0B ; [.21F0.0020.0008] # GLAGOLITIC CAPITAL LETTER I +2C3C ; [.21F1.0020.0002] # GLAGOLITIC SMALL LETTER DJERVI +1E00C ; [.21F1.0020.0004] # COMBINING GLAGOLITIC LETTER DJERVI +2C0C ; [.21F1.0020.0008] # GLAGOLITIC CAPITAL LETTER DJERVI +2C3D ; [.21F2.0020.0002] # GLAGOLITIC SMALL LETTER KAKO +1E00D ; [.21F2.0020.0004] # COMBINING GLAGOLITIC LETTER KAKO +2C0D ; [.21F2.0020.0008] # GLAGOLITIC CAPITAL LETTER KAKO +2C3E ; [.21F3.0020.0002] # GLAGOLITIC SMALL LETTER LJUDIJE +1E00E ; [.21F3.0020.0004] # COMBINING GLAGOLITIC LETTER LJUDIJE +2C0E ; [.21F3.0020.0008] # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C3F ; [.21F4.0020.0002] # GLAGOLITIC SMALL LETTER MYSLITE +1E00F ; [.21F4.0020.0004] # COMBINING GLAGOLITIC LETTER MYSLITE +2C0F ; [.21F4.0020.0008] # GLAGOLITIC CAPITAL LETTER MYSLITE +2C40 ; [.21F5.0020.0002] # GLAGOLITIC SMALL LETTER NASHI +1E010 ; [.21F5.0020.0004] # COMBINING GLAGOLITIC LETTER NASHI +2C10 ; [.21F5.0020.0008] # GLAGOLITIC CAPITAL LETTER NASHI +2C41 ; [.21F6.0020.0002] # GLAGOLITIC SMALL LETTER ONU +1E011 ; [.21F6.0020.0004] # COMBINING GLAGOLITIC LETTER ONU +2C11 ; [.21F6.0020.0008] # GLAGOLITIC CAPITAL LETTER ONU +2C42 ; [.21F7.0020.0002] # GLAGOLITIC SMALL LETTER POKOJI +1E012 ; [.21F7.0020.0004] # COMBINING GLAGOLITIC LETTER POKOJI +2C12 ; [.21F7.0020.0008] # GLAGOLITIC CAPITAL LETTER POKOJI +2C43 ; [.21F8.0020.0002] # GLAGOLITIC SMALL LETTER RITSI +1E013 ; [.21F8.0020.0004] # COMBINING GLAGOLITIC LETTER RITSI +2C13 ; [.21F8.0020.0008] # GLAGOLITIC CAPITAL LETTER RITSI +2C44 ; [.21F9.0020.0002] # GLAGOLITIC SMALL LETTER SLOVO +1E014 ; [.21F9.0020.0004] # COMBINING GLAGOLITIC LETTER SLOVO +2C14 ; [.21F9.0020.0008] # GLAGOLITIC CAPITAL LETTER SLOVO +2C45 ; [.21FA.0020.0002] # GLAGOLITIC SMALL LETTER TVRIDO +1E015 ; [.21FA.0020.0004] # COMBINING GLAGOLITIC LETTER TVRIDO +2C15 ; [.21FA.0020.0008] # GLAGOLITIC CAPITAL LETTER TVRIDO +2C46 ; [.21FB.0020.0002] # GLAGOLITIC SMALL LETTER UKU +1E016 ; [.21FB.0020.0004] # COMBINING GLAGOLITIC LETTER UKU +2C16 ; [.21FB.0020.0008] # GLAGOLITIC CAPITAL LETTER UKU +2C47 ; [.21FC.0020.0002] # GLAGOLITIC SMALL LETTER FRITU +1E017 ; [.21FC.0020.0004] # COMBINING GLAGOLITIC LETTER FRITU +2C17 ; [.21FC.0020.0008] # GLAGOLITIC CAPITAL LETTER FRITU +2C48 ; [.21FD.0020.0002] # GLAGOLITIC SMALL LETTER HERU +1E018 ; [.21FD.0020.0004] # COMBINING GLAGOLITIC LETTER HERU +2C18 ; [.21FD.0020.0008] # GLAGOLITIC CAPITAL LETTER HERU +2C49 ; [.21FE.0020.0002] # GLAGOLITIC SMALL LETTER OTU +2C19 ; [.21FE.0020.0008] # GLAGOLITIC CAPITAL LETTER OTU +2C4A ; [.21FF.0020.0002] # GLAGOLITIC SMALL LETTER PE +2C1A ; [.21FF.0020.0008] # GLAGOLITIC CAPITAL LETTER PE +2C4B ; [.2200.0020.0002] # GLAGOLITIC SMALL LETTER SHTA +1E01B ; [.2200.0020.0004] # COMBINING GLAGOLITIC LETTER SHTA +2C1B ; [.2200.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTA +2C4C ; [.2201.0020.0002] # GLAGOLITIC SMALL LETTER TSI +1E01C ; [.2201.0020.0004] # COMBINING GLAGOLITIC LETTER TSI +2C1C ; [.2201.0020.0008] # GLAGOLITIC CAPITAL LETTER TSI +2C4D ; [.2202.0020.0002] # GLAGOLITIC SMALL LETTER CHRIVI +1E01D ; [.2202.0020.0004] # COMBINING GLAGOLITIC LETTER CHRIVI +2C1D ; [.2202.0020.0008] # GLAGOLITIC CAPITAL LETTER CHRIVI +2C4E ; [.2203.0020.0002] # GLAGOLITIC SMALL LETTER SHA +1E01E ; [.2203.0020.0004] # COMBINING GLAGOLITIC LETTER SHA +2C1E ; [.2203.0020.0008] # GLAGOLITIC CAPITAL LETTER SHA +2C4F ; [.2204.0020.0002] # GLAGOLITIC SMALL LETTER YERU +1E01F ; [.2204.0020.0004] # COMBINING GLAGOLITIC LETTER YERU +2C1F ; [.2204.0020.0008] # GLAGOLITIC CAPITAL LETTER YERU +2C50 ; [.2205.0020.0002] # GLAGOLITIC SMALL LETTER YERI +1E020 ; [.2205.0020.0004] # COMBINING GLAGOLITIC LETTER YERI +2C20 ; [.2205.0020.0008] # GLAGOLITIC CAPITAL LETTER YERI +2C51 ; [.2206.0020.0002] # GLAGOLITIC SMALL LETTER YATI +1E021 ; [.2206.0020.0004] # COMBINING GLAGOLITIC LETTER YATI +2C21 ; [.2206.0020.0008] # GLAGOLITIC CAPITAL LETTER YATI +2C52 ; [.2207.0020.0002] # GLAGOLITIC SMALL LETTER SPIDERY HA +2C22 ; [.2207.0020.0008] # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C53 ; [.2208.0020.0002] # GLAGOLITIC SMALL LETTER YU +1E023 ; [.2208.0020.0004] # COMBINING GLAGOLITIC LETTER YU +2C23 ; [.2208.0020.0008] # GLAGOLITIC CAPITAL LETTER YU +2C54 ; [.2209.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS +1E024 ; [.2209.0020.0004] # COMBINING GLAGOLITIC LETTER SMALL YUS +2C24 ; [.2209.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C55 ; [.220A.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +2C25 ; [.220A.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C56 ; [.220B.0020.0002] # GLAGOLITIC SMALL LETTER YO +1E026 ; [.220B.0020.0004] # COMBINING GLAGOLITIC LETTER YO +2C26 ; [.220B.0020.0008] # GLAGOLITIC CAPITAL LETTER YO +2C57 ; [.220C.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +1E027 ; [.220C.0020.0004] # COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS +2C27 ; [.220C.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C58 ; [.220D.0020.0002] # GLAGOLITIC SMALL LETTER BIG YUS +1E028 ; [.220D.0020.0004] # COMBINING GLAGOLITIC LETTER BIG YUS +2C28 ; [.220D.0020.0008] # GLAGOLITIC CAPITAL LETTER BIG YUS +2C59 ; [.220E.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS +1E029 ; [.220E.0020.0004] # COMBINING GLAGOLITIC LETTER IOTATED BIG YUS +2C29 ; [.220E.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C5A ; [.220F.0020.0002] # GLAGOLITIC SMALL LETTER FITA +1E02A ; [.220F.0020.0004] # COMBINING GLAGOLITIC LETTER FITA +2C2A ; [.220F.0020.0008] # GLAGOLITIC CAPITAL LETTER FITA +2C5B ; [.2210.0020.0002] # GLAGOLITIC SMALL LETTER IZHITSA +2C2B ; [.2210.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHITSA +2C5C ; [.2211.0020.0002] # GLAGOLITIC SMALL LETTER SHTAPIC +2C2C ; [.2211.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C5D ; [.2212.0020.0002] # GLAGOLITIC SMALL LETTER TROKUTASTI A +2C2D ; [.2212.0020.0008] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C5E ; [.2213.0020.0002] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C2E ; [.2213.0020.0008] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +10350 ; [.2214.0020.0002] # OLD PERMIC LETTER AN +10376 ; [.2214.0020.0004] # COMBINING OLD PERMIC LETTER AN +10351 ; [.2215.0020.0002] # OLD PERMIC LETTER BUR +10352 ; [.2216.0020.0002] # OLD PERMIC LETTER GAI +10353 ; [.2217.0020.0002] # OLD PERMIC LETTER DOI +10377 ; [.2217.0020.0004] # COMBINING OLD PERMIC LETTER DOI +10354 ; [.2218.0020.0002] # OLD PERMIC LETTER E +10355 ; [.2219.0020.0002] # OLD PERMIC LETTER ZHOI +10356 ; [.221A.0020.0002] # OLD PERMIC LETTER DZHOI +10357 ; [.221B.0020.0002] # OLD PERMIC LETTER ZATA +10378 ; [.221B.0020.0004] # COMBINING OLD PERMIC LETTER ZATA +10358 ; [.221C.0020.0002] # OLD PERMIC LETTER DZITA +10359 ; [.221D.0020.0002] # OLD PERMIC LETTER I +1035A ; [.221E.0020.0002] # OLD PERMIC LETTER KOKE +1035B ; [.221F.0020.0002] # OLD PERMIC LETTER LEI +1035C ; [.2220.0020.0002] # OLD PERMIC LETTER MENOE +1035D ; [.2221.0020.0002] # OLD PERMIC LETTER NENOE +10379 ; [.2221.0020.0004] # COMBINING OLD PERMIC LETTER NENOE +1035E ; [.2222.0020.0002] # OLD PERMIC LETTER VOOI +1035F ; [.2223.0020.0002] # OLD PERMIC LETTER PEEI +10360 ; [.2224.0020.0002] # OLD PERMIC LETTER REI +10361 ; [.2225.0020.0002] # OLD PERMIC LETTER SII +1037A ; [.2225.0020.0004] # COMBINING OLD PERMIC LETTER SII +10362 ; [.2226.0020.0002] # OLD PERMIC LETTER TAI +10363 ; [.2227.0020.0002] # OLD PERMIC LETTER U +10364 ; [.2228.0020.0002] # OLD PERMIC LETTER CHERY +10365 ; [.2229.0020.0002] # OLD PERMIC LETTER SHOOI +10366 ; [.222A.0020.0002] # OLD PERMIC LETTER SHCHOOI +10367 ; [.222B.0020.0002] # OLD PERMIC LETTER YRY +10368 ; [.222C.0020.0002] # OLD PERMIC LETTER YERU +10369 ; [.222D.0020.0002] # OLD PERMIC LETTER O +1036A ; [.222E.0020.0002] # OLD PERMIC LETTER OO +1036B ; [.222F.0020.0002] # OLD PERMIC LETTER EF +1036C ; [.2230.0020.0002] # OLD PERMIC LETTER HA +1036D ; [.2231.0020.0002] # OLD PERMIC LETTER TSIU +1036E ; [.2232.0020.0002] # OLD PERMIC LETTER VER +1036F ; [.2233.0020.0002] # OLD PERMIC LETTER YER +10370 ; [.2234.0020.0002] # OLD PERMIC LETTER YERI +10371 ; [.2235.0020.0002] # OLD PERMIC LETTER YAT +10372 ; [.2236.0020.0002] # OLD PERMIC LETTER IE +10373 ; [.2237.0020.0002] # OLD PERMIC LETTER YU +10374 ; [.2238.0020.0002] # OLD PERMIC LETTER YA +10375 ; [.2239.0020.0002] # OLD PERMIC LETTER IA +10D0 ; [.223A.0020.0002] # GEORGIAN LETTER AN +2D00 ; [.223B.0020.0002] # GEORGIAN SMALL LETTER AN +10A0 ; [.223B.0020.0008] # GEORGIAN CAPITAL LETTER AN +10D1 ; [.223C.0020.0002] # GEORGIAN LETTER BAN +2D01 ; [.223D.0020.0002] # GEORGIAN SMALL LETTER BAN +10A1 ; [.223D.0020.0008] # GEORGIAN CAPITAL LETTER BAN +10D2 ; [.223E.0020.0002] # GEORGIAN LETTER GAN +2D02 ; [.223F.0020.0002] # GEORGIAN SMALL LETTER GAN +10A2 ; [.223F.0020.0008] # GEORGIAN CAPITAL LETTER GAN +10D3 ; [.2240.0020.0002] # GEORGIAN LETTER DON +2D03 ; [.2241.0020.0002] # GEORGIAN SMALL LETTER DON +10A3 ; [.2241.0020.0008] # GEORGIAN CAPITAL LETTER DON +10D4 ; [.2242.0020.0002] # GEORGIAN LETTER EN +2D04 ; [.2243.0020.0002] # GEORGIAN SMALL LETTER EN +10A4 ; [.2243.0020.0008] # GEORGIAN CAPITAL LETTER EN +10D5 ; [.2244.0020.0002] # GEORGIAN LETTER VIN +2D05 ; [.2245.0020.0002] # GEORGIAN SMALL LETTER VIN +10A5 ; [.2245.0020.0008] # GEORGIAN CAPITAL LETTER VIN +10D6 ; [.2246.0020.0002] # GEORGIAN LETTER ZEN +2D06 ; [.2247.0020.0002] # GEORGIAN SMALL LETTER ZEN +10A6 ; [.2247.0020.0008] # GEORGIAN CAPITAL LETTER ZEN +10F1 ; [.2248.0020.0002] # GEORGIAN LETTER HE +2D21 ; [.2249.0020.0002] # GEORGIAN SMALL LETTER HE +10C1 ; [.2249.0020.0008] # GEORGIAN CAPITAL LETTER HE +10D7 ; [.224A.0020.0002] # GEORGIAN LETTER TAN +2D07 ; [.224B.0020.0002] # GEORGIAN SMALL LETTER TAN +10A7 ; [.224B.0020.0008] # GEORGIAN CAPITAL LETTER TAN +10D8 ; [.224C.0020.0002] # GEORGIAN LETTER IN +2D08 ; [.224D.0020.0002] # GEORGIAN SMALL LETTER IN +10A8 ; [.224D.0020.0008] # GEORGIAN CAPITAL LETTER IN +10D9 ; [.224E.0020.0002] # GEORGIAN LETTER KAN +2D09 ; [.224F.0020.0002] # GEORGIAN SMALL LETTER KAN +10A9 ; [.224F.0020.0008] # GEORGIAN CAPITAL LETTER KAN +10DA ; [.2250.0020.0002] # GEORGIAN LETTER LAS +2D0A ; [.2251.0020.0002] # GEORGIAN SMALL LETTER LAS +10AA ; [.2251.0020.0008] # GEORGIAN CAPITAL LETTER LAS +10DB ; [.2252.0020.0002] # GEORGIAN LETTER MAN +2D0B ; [.2253.0020.0002] # GEORGIAN SMALL LETTER MAN +10AB ; [.2253.0020.0008] # GEORGIAN CAPITAL LETTER MAN +10DC ; [.2254.0020.0002] # GEORGIAN LETTER NAR +10FC ; [.2254.0020.0014] # MODIFIER LETTER GEORGIAN NAR +2D0C ; [.2255.0020.0002] # GEORGIAN SMALL LETTER NAR +10AC ; [.2255.0020.0008] # GEORGIAN CAPITAL LETTER NAR +10F2 ; [.2256.0020.0002] # GEORGIAN LETTER HIE +2D22 ; [.2257.0020.0002] # GEORGIAN SMALL LETTER HIE +10C2 ; [.2257.0020.0008] # GEORGIAN CAPITAL LETTER HIE +10DD ; [.2258.0020.0002] # GEORGIAN LETTER ON +2D0D ; [.2259.0020.0002] # GEORGIAN SMALL LETTER ON +10AD ; [.2259.0020.0008] # GEORGIAN CAPITAL LETTER ON +10DE ; [.225A.0020.0002] # GEORGIAN LETTER PAR +2D0E ; [.225B.0020.0002] # GEORGIAN SMALL LETTER PAR +10AE ; [.225B.0020.0008] # GEORGIAN CAPITAL LETTER PAR +10DF ; [.225C.0020.0002] # GEORGIAN LETTER ZHAR +2D0F ; [.225D.0020.0002] # GEORGIAN SMALL LETTER ZHAR +10AF ; [.225D.0020.0008] # GEORGIAN CAPITAL LETTER ZHAR +10E0 ; [.225E.0020.0002] # GEORGIAN LETTER RAE +2D10 ; [.225F.0020.0002] # GEORGIAN SMALL LETTER RAE +10B0 ; [.225F.0020.0008] # GEORGIAN CAPITAL LETTER RAE +10E1 ; [.2260.0020.0002] # GEORGIAN LETTER SAN +2D11 ; [.2261.0020.0002] # GEORGIAN SMALL LETTER SAN +10B1 ; [.2261.0020.0008] # GEORGIAN CAPITAL LETTER SAN +10E2 ; [.2262.0020.0002] # GEORGIAN LETTER TAR +2D12 ; [.2263.0020.0002] # GEORGIAN SMALL LETTER TAR +10B2 ; [.2263.0020.0008] # GEORGIAN CAPITAL LETTER TAR +10F3 ; [.2264.0020.0002] # GEORGIAN LETTER WE +2D23 ; [.2265.0020.0002] # GEORGIAN SMALL LETTER WE +10C3 ; [.2265.0020.0008] # GEORGIAN CAPITAL LETTER WE +10E3 ; [.2266.0020.0002] # GEORGIAN LETTER UN +2D13 ; [.2267.0020.0002] # GEORGIAN SMALL LETTER UN +10B3 ; [.2267.0020.0008] # GEORGIAN CAPITAL LETTER UN +10E4 ; [.2268.0020.0002] # GEORGIAN LETTER PHAR +2D14 ; [.2269.0020.0002] # GEORGIAN SMALL LETTER PHAR +10B4 ; [.2269.0020.0008] # GEORGIAN CAPITAL LETTER PHAR +10E5 ; [.226A.0020.0002] # GEORGIAN LETTER KHAR +2D15 ; [.226B.0020.0002] # GEORGIAN SMALL LETTER KHAR +10B5 ; [.226B.0020.0008] # GEORGIAN CAPITAL LETTER KHAR +10E6 ; [.226C.0020.0002] # GEORGIAN LETTER GHAN +2D16 ; [.226D.0020.0002] # GEORGIAN SMALL LETTER GHAN +10B6 ; [.226D.0020.0008] # GEORGIAN CAPITAL LETTER GHAN +10E7 ; [.226E.0020.0002] # GEORGIAN LETTER QAR +2D17 ; [.226F.0020.0002] # GEORGIAN SMALL LETTER QAR +10B7 ; [.226F.0020.0008] # GEORGIAN CAPITAL LETTER QAR +10E8 ; [.2270.0020.0002] # GEORGIAN LETTER SHIN +2D18 ; [.2271.0020.0002] # GEORGIAN SMALL LETTER SHIN +10B8 ; [.2271.0020.0008] # GEORGIAN CAPITAL LETTER SHIN +10E9 ; [.2272.0020.0002] # GEORGIAN LETTER CHIN +2D19 ; [.2273.0020.0002] # GEORGIAN SMALL LETTER CHIN +10B9 ; [.2273.0020.0008] # GEORGIAN CAPITAL LETTER CHIN +10EA ; [.2274.0020.0002] # GEORGIAN LETTER CAN +2D1A ; [.2275.0020.0002] # GEORGIAN SMALL LETTER CAN +10BA ; [.2275.0020.0008] # GEORGIAN CAPITAL LETTER CAN +10EB ; [.2276.0020.0002] # GEORGIAN LETTER JIL +2D1B ; [.2277.0020.0002] # GEORGIAN SMALL LETTER JIL +10BB ; [.2277.0020.0008] # GEORGIAN CAPITAL LETTER JIL +10EC ; [.2278.0020.0002] # GEORGIAN LETTER CIL +2D1C ; [.2279.0020.0002] # GEORGIAN SMALL LETTER CIL +10BC ; [.2279.0020.0008] # GEORGIAN CAPITAL LETTER CIL +10ED ; [.227A.0020.0002] # GEORGIAN LETTER CHAR +2D1D ; [.227B.0020.0002] # GEORGIAN SMALL LETTER CHAR +10BD ; [.227B.0020.0008] # GEORGIAN CAPITAL LETTER CHAR +10EE ; [.227C.0020.0002] # GEORGIAN LETTER XAN +2D1E ; [.227D.0020.0002] # GEORGIAN SMALL LETTER XAN +10BE ; [.227D.0020.0008] # GEORGIAN CAPITAL LETTER XAN +10F4 ; [.227E.0020.0002] # GEORGIAN LETTER HAR +2D24 ; [.227F.0020.0002] # GEORGIAN SMALL LETTER HAR +10C4 ; [.227F.0020.0008] # GEORGIAN CAPITAL LETTER HAR +10EF ; [.2280.0020.0002] # GEORGIAN LETTER JHAN +2D1F ; [.2281.0020.0002] # GEORGIAN SMALL LETTER JHAN +10BF ; [.2281.0020.0008] # GEORGIAN CAPITAL LETTER JHAN +10F0 ; [.2282.0020.0002] # GEORGIAN LETTER HAE +2D20 ; [.2283.0020.0002] # GEORGIAN SMALL LETTER HAE +10C0 ; [.2283.0020.0008] # GEORGIAN CAPITAL LETTER HAE +10F5 ; [.2284.0020.0002] # GEORGIAN LETTER HOE +2D25 ; [.2285.0020.0002] # GEORGIAN SMALL LETTER HOE +10C5 ; [.2285.0020.0008] # GEORGIAN CAPITAL LETTER HOE +10F6 ; [.2286.0020.0002] # GEORGIAN LETTER FI +10F7 ; [.2287.0020.0002] # GEORGIAN LETTER YN +2D27 ; [.2288.0020.0002] # GEORGIAN SMALL LETTER YN +10C7 ; [.2288.0020.0008] # GEORGIAN CAPITAL LETTER YN +10F8 ; [.2289.0020.0002] # GEORGIAN LETTER ELIFI +10F9 ; [.228A.0020.0002] # GEORGIAN LETTER TURNED GAN +10FA ; [.228B.0020.0002] # GEORGIAN LETTER AIN +10FD ; [.228C.0020.0002] # GEORGIAN LETTER AEN +2D2D ; [.228D.0020.0002] # GEORGIAN SMALL LETTER AEN +10CD ; [.228D.0020.0008] # GEORGIAN CAPITAL LETTER AEN +10FE ; [.228E.0020.0002] # GEORGIAN LETTER HARD SIGN +10FF ; [.228F.0020.0002] # GEORGIAN LETTER LABIAL SIGN +0561 ; [.2290.0020.0002] # ARMENIAN SMALL LETTER AYB +0531 ; [.2290.0020.0008] # ARMENIAN CAPITAL LETTER AYB +0562 ; [.2291.0020.0002] # ARMENIAN SMALL LETTER BEN +0532 ; [.2291.0020.0008] # ARMENIAN CAPITAL LETTER BEN +0563 ; [.2292.0020.0002] # ARMENIAN SMALL LETTER GIM +0533 ; [.2292.0020.0008] # ARMENIAN CAPITAL LETTER GIM +0564 ; [.2293.0020.0002] # ARMENIAN SMALL LETTER DA +0534 ; [.2293.0020.0008] # ARMENIAN CAPITAL LETTER DA +0565 ; [.2294.0020.0002] # ARMENIAN SMALL LETTER ECH +0535 ; [.2294.0020.0008] # ARMENIAN CAPITAL LETTER ECH +0587 ; [.2294.0020.0004][.22B1.0020.0004] # ARMENIAN SMALL LIGATURE ECH YIWN +0566 ; [.2295.0020.0002] # ARMENIAN SMALL LETTER ZA +0536 ; [.2295.0020.0008] # ARMENIAN CAPITAL LETTER ZA +0567 ; [.2296.0020.0002] # ARMENIAN SMALL LETTER EH +0537 ; [.2296.0020.0008] # ARMENIAN CAPITAL LETTER EH +0568 ; [.2297.0020.0002] # ARMENIAN SMALL LETTER ET +0538 ; [.2297.0020.0008] # ARMENIAN CAPITAL LETTER ET +0569 ; [.2298.0020.0002] # ARMENIAN SMALL LETTER TO +0539 ; [.2298.0020.0008] # ARMENIAN CAPITAL LETTER TO +056A ; [.2299.0020.0002] # ARMENIAN SMALL LETTER ZHE +053A ; [.2299.0020.0008] # ARMENIAN CAPITAL LETTER ZHE +056B ; [.229A.0020.0002] # ARMENIAN SMALL LETTER INI +053B ; [.229A.0020.0008] # ARMENIAN CAPITAL LETTER INI +056C ; [.229B.0020.0002] # ARMENIAN SMALL LETTER LIWN +053C ; [.229B.0020.0008] # ARMENIAN CAPITAL LETTER LIWN +056D ; [.229C.0020.0002] # ARMENIAN SMALL LETTER XEH +053D ; [.229C.0020.0008] # ARMENIAN CAPITAL LETTER XEH +056E ; [.229D.0020.0002] # ARMENIAN SMALL LETTER CA +053E ; [.229D.0020.0008] # ARMENIAN CAPITAL LETTER CA +056F ; [.229E.0020.0002] # ARMENIAN SMALL LETTER KEN +053F ; [.229E.0020.0008] # ARMENIAN CAPITAL LETTER KEN +0570 ; [.229F.0020.0002] # ARMENIAN SMALL LETTER HO +0540 ; [.229F.0020.0008] # ARMENIAN CAPITAL LETTER HO +0571 ; [.22A0.0020.0002] # ARMENIAN SMALL LETTER JA +0541 ; [.22A0.0020.0008] # ARMENIAN CAPITAL LETTER JA +0572 ; [.22A1.0020.0002] # ARMENIAN SMALL LETTER GHAD +0542 ; [.22A1.0020.0008] # ARMENIAN CAPITAL LETTER GHAD +0573 ; [.22A2.0020.0002] # ARMENIAN SMALL LETTER CHEH +0543 ; [.22A2.0020.0008] # ARMENIAN CAPITAL LETTER CHEH +0574 ; [.22A3.0020.0002] # ARMENIAN SMALL LETTER MEN +0544 ; [.22A3.0020.0008] # ARMENIAN CAPITAL LETTER MEN +FB14 ; [.22A3.0020.0004][.2294.0020.0004] # ARMENIAN SMALL LIGATURE MEN ECH +FB15 ; [.22A3.0020.0004][.229A.0020.0004] # ARMENIAN SMALL LIGATURE MEN INI +FB17 ; [.22A3.0020.0004][.229C.0020.0004] # ARMENIAN SMALL LIGATURE MEN XEH +FB13 ; [.22A3.0020.0004][.22A5.0020.0004] # ARMENIAN SMALL LIGATURE MEN NOW +0575 ; [.22A4.0020.0002] # ARMENIAN SMALL LETTER YI +0545 ; [.22A4.0020.0008] # ARMENIAN CAPITAL LETTER YI +0576 ; [.22A5.0020.0002] # ARMENIAN SMALL LETTER NOW +0546 ; [.22A5.0020.0008] # ARMENIAN CAPITAL LETTER NOW +0577 ; [.22A6.0020.0002] # ARMENIAN SMALL LETTER SHA +0547 ; [.22A6.0020.0008] # ARMENIAN CAPITAL LETTER SHA +0578 ; [.22A7.0020.0002] # ARMENIAN SMALL LETTER VO +0548 ; [.22A7.0020.0008] # ARMENIAN CAPITAL LETTER VO +0579 ; [.22A8.0020.0002] # ARMENIAN SMALL LETTER CHA +0549 ; [.22A8.0020.0008] # ARMENIAN CAPITAL LETTER CHA +057A ; [.22A9.0020.0002] # ARMENIAN SMALL LETTER PEH +054A ; [.22A9.0020.0008] # ARMENIAN CAPITAL LETTER PEH +057B ; [.22AA.0020.0002] # ARMENIAN SMALL LETTER JHEH +054B ; [.22AA.0020.0008] # ARMENIAN CAPITAL LETTER JHEH +057C ; [.22AB.0020.0002] # ARMENIAN SMALL LETTER RA +054C ; [.22AB.0020.0008] # ARMENIAN CAPITAL LETTER RA +057D ; [.22AC.0020.0002] # ARMENIAN SMALL LETTER SEH +054D ; [.22AC.0020.0008] # ARMENIAN CAPITAL LETTER SEH +057E ; [.22AD.0020.0002] # ARMENIAN SMALL LETTER VEW +054E ; [.22AD.0020.0008] # ARMENIAN CAPITAL LETTER VEW +FB16 ; [.22AD.0020.0004][.22A5.0020.0004] # ARMENIAN SMALL LIGATURE VEW NOW +057F ; [.22AE.0020.0002] # ARMENIAN SMALL LETTER TIWN +054F ; [.22AE.0020.0008] # ARMENIAN CAPITAL LETTER TIWN +0580 ; [.22AF.0020.0002] # ARMENIAN SMALL LETTER REH +0550 ; [.22AF.0020.0008] # ARMENIAN CAPITAL LETTER REH +0581 ; [.22B0.0020.0002] # ARMENIAN SMALL LETTER CO +0551 ; [.22B0.0020.0008] # ARMENIAN CAPITAL LETTER CO +0582 ; [.22B1.0020.0002] # ARMENIAN SMALL LETTER YIWN +0552 ; [.22B1.0020.0008] # ARMENIAN CAPITAL LETTER YIWN +0583 ; [.22B2.0020.0002] # ARMENIAN SMALL LETTER PIWR +0553 ; [.22B2.0020.0008] # ARMENIAN CAPITAL LETTER PIWR +0584 ; [.22B3.0020.0002] # ARMENIAN SMALL LETTER KEH +0554 ; [.22B3.0020.0008] # ARMENIAN CAPITAL LETTER KEH +0585 ; [.22B4.0020.0002] # ARMENIAN SMALL LETTER OH +0555 ; [.22B4.0020.0008] # ARMENIAN CAPITAL LETTER OH +0586 ; [.22B5.0020.0002] # ARMENIAN SMALL LETTER FEH +0556 ; [.22B5.0020.0008] # ARMENIAN CAPITAL LETTER FEH +0559 ; [.22B6.0020.0002] # ARMENIAN MODIFIER LETTER LEFT HALF RING +05D0 ; [.22B7.0020.0002] # HEBREW LETTER ALEF +2135 ; [.22B7.0020.0004] # ALEF SYMBOL +FB21 ; [.22B7.0020.0005] # HEBREW LETTER WIDE ALEF +FB2E ; [.22B7.0020.0002][.0000.0059.0002] # HEBREW LETTER ALEF WITH PATAH +FB2F ; [.22B7.0020.0002][.0000.005A.0002] # HEBREW LETTER ALEF WITH QAMATS +FB30 ; [.22B7.0020.0002][.0000.005F.0002] # HEBREW LETTER ALEF WITH MAPIQ +FB4F ; [.22B7.0020.0004][.22C2.0020.0004] # HEBREW LIGATURE ALEF LAMED +05D1 ; [.22B8.0020.0002] # HEBREW LETTER BET +2136 ; [.22B8.0020.0004] # BET SYMBOL +FB31 ; [.22B8.0020.0002][.0000.005F.0002] # HEBREW LETTER BET WITH DAGESH +FB4C ; [.22B8.0020.0002][.0000.0060.0002] # HEBREW LETTER BET WITH RAFE +05D2 ; [.22B9.0020.0002] # HEBREW LETTER GIMEL +2137 ; [.22B9.0020.0004] # GIMEL SYMBOL +FB32 ; [.22B9.0020.0002][.0000.005F.0002] # HEBREW LETTER GIMEL WITH DAGESH +05D3 ; [.22BA.0020.0002] # HEBREW LETTER DALET +2138 ; [.22BA.0020.0004] # DALET SYMBOL +FB22 ; [.22BA.0020.0005] # HEBREW LETTER WIDE DALET +FB33 ; [.22BA.0020.0002][.0000.005F.0002] # HEBREW LETTER DALET WITH DAGESH +05D4 ; [.22BB.0020.0002] # HEBREW LETTER HE +FB23 ; [.22BB.0020.0005] # HEBREW LETTER WIDE HE +FB34 ; [.22BB.0020.0002][.0000.005F.0002] # HEBREW LETTER HE WITH MAPIQ +05D5 ; [.22BC.0020.0002] # HEBREW LETTER VAV +FB4B ; [.22BC.0020.0002][.0000.005B.0002] # HEBREW LETTER VAV WITH HOLAM +FB35 ; [.22BC.0020.0002][.0000.005F.0002] # HEBREW LETTER VAV WITH DAGESH +05F0 ; [.22BC.0020.0004][.22BC.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE VAV +05F1 ; [.22BC.0020.0004][.22C0.0020.0004] # HEBREW LIGATURE YIDDISH VAV YOD +05D6 ; [.22BD.0020.0002] # HEBREW LETTER ZAYIN +FB36 ; [.22BD.0020.0002][.0000.005F.0002] # HEBREW LETTER ZAYIN WITH DAGESH +05D7 ; [.22BE.0020.0002] # HEBREW LETTER HET +05D8 ; [.22BF.0020.0002] # HEBREW LETTER TET +FB38 ; [.22BF.0020.0002][.0000.005F.0002] # HEBREW LETTER TET WITH DAGESH +05D9 ; [.22C0.0020.0002] # HEBREW LETTER YOD +FB1D ; [.22C0.0020.0002][.0000.0056.0002] # HEBREW LETTER YOD WITH HIRIQ +FB39 ; [.22C0.0020.0002][.0000.005F.0002] # HEBREW LETTER YOD WITH DAGESH +05F2 ; [.22C0.0020.0004][.22C0.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE YOD +FB1F ; [.22C0.0020.0004][.22C0.0020.0004][.0000.0059.0002] # HEBREW LIGATURE YIDDISH YOD YOD PATAH +05DB ; [.22C1.0020.0002] # HEBREW LETTER KAF +FB24 ; [.22C1.0020.0005] # HEBREW LETTER WIDE KAF +05DA ; [.22C1.0020.0019] # HEBREW LETTER FINAL KAF +FB3B ; [.22C1.0020.0002][.0000.005F.0002] # HEBREW LETTER KAF WITH DAGESH +FB3A ; [.22C1.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL KAF WITH DAGESH +FB4D ; [.22C1.0020.0002][.0000.0060.0002] # HEBREW LETTER KAF WITH RAFE +05DC ; [.22C2.0020.0002] # HEBREW LETTER LAMED +FB25 ; [.22C2.0020.0005] # HEBREW LETTER WIDE LAMED +FB3C ; [.22C2.0020.0002][.0000.005F.0002] # HEBREW LETTER LAMED WITH DAGESH +05DE ; [.22C3.0020.0002] # HEBREW LETTER MEM +FB26 ; [.22C3.0020.0005] # HEBREW LETTER WIDE FINAL MEM +05DD ; [.22C3.0020.0019] # HEBREW LETTER FINAL MEM +FB3E ; [.22C3.0020.0002][.0000.005F.0002] # HEBREW LETTER MEM WITH DAGESH +05E0 ; [.22C4.0020.0002] # HEBREW LETTER NUN +05DF ; [.22C4.0020.0019] # HEBREW LETTER FINAL NUN +FB40 ; [.22C4.0020.0002][.0000.005F.0002] # HEBREW LETTER NUN WITH DAGESH +05E1 ; [.22C5.0020.0002] # HEBREW LETTER SAMEKH +FB41 ; [.22C5.0020.0002][.0000.005F.0002] # HEBREW LETTER SAMEKH WITH DAGESH +05E2 ; [.22C6.0020.0002] # HEBREW LETTER AYIN +FB20 ; [.22C6.0020.0005] # HEBREW LETTER ALTERNATIVE AYIN +05E4 ; [.22C7.0020.0002] # HEBREW LETTER PE +05E3 ; [.22C7.0020.0019] # HEBREW LETTER FINAL PE +FB44 ; [.22C7.0020.0002][.0000.005F.0002] # HEBREW LETTER PE WITH DAGESH +FB43 ; [.22C7.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL PE WITH DAGESH +FB4E ; [.22C7.0020.0002][.0000.0060.0002] # HEBREW LETTER PE WITH RAFE +05E6 ; [.22C8.0020.0002] # HEBREW LETTER TSADI +05E5 ; [.22C8.0020.0019] # HEBREW LETTER FINAL TSADI +FB46 ; [.22C8.0020.0002][.0000.005F.0002] # HEBREW LETTER TSADI WITH DAGESH +05E7 ; [.22C9.0020.0002] # HEBREW LETTER QOF +FB47 ; [.22C9.0020.0002][.0000.005F.0002] # HEBREW LETTER QOF WITH DAGESH +05E8 ; [.22CA.0020.0002] # HEBREW LETTER RESH +FB27 ; [.22CA.0020.0005] # HEBREW LETTER WIDE RESH +FB48 ; [.22CA.0020.0002][.0000.005F.0002] # HEBREW LETTER RESH WITH DAGESH +05E9 ; [.22CB.0020.0002] # HEBREW LETTER SHIN +FB2B ; [.22CB.0020.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH SIN DOT +FB2A ; [.22CB.0020.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH SHIN DOT +FB49 ; [.22CB.0020.0002][.0000.005F.0002] # HEBREW LETTER SHIN WITH DAGESH +FB2D ; [.22CB.0020.0002][.0000.005F.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2C ; [.22CB.0020.0002][.0000.005F.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +05EA ; [.22CC.0020.0002] # HEBREW LETTER TAV +FB28 ; [.22CC.0020.0005] # HEBREW LETTER WIDE TAV +FB4A ; [.22CC.0020.0002][.0000.005F.0002] # HEBREW LETTER TAV WITH DAGESH +10900 ; [.22CD.0020.0002] # PHOENICIAN LETTER ALF +10901 ; [.22CE.0020.0002] # PHOENICIAN LETTER BET +10902 ; [.22CF.0020.0002] # PHOENICIAN LETTER GAML +10903 ; [.22D0.0020.0002] # PHOENICIAN LETTER DELT +10904 ; [.22D1.0020.0002] # PHOENICIAN LETTER HE +10905 ; [.22D2.0020.0002] # PHOENICIAN LETTER WAU +10906 ; [.22D3.0020.0002] # PHOENICIAN LETTER ZAI +10907 ; [.22D4.0020.0002] # PHOENICIAN LETTER HET +10908 ; [.22D5.0020.0002] # PHOENICIAN LETTER TET +10909 ; [.22D6.0020.0002] # PHOENICIAN LETTER YOD +1090A ; [.22D7.0020.0002] # PHOENICIAN LETTER KAF +1090B ; [.22D8.0020.0002] # PHOENICIAN LETTER LAMD +1090C ; [.22D9.0020.0002] # PHOENICIAN LETTER MEM +1090D ; [.22DA.0020.0002] # PHOENICIAN LETTER NUN +1090E ; [.22DB.0020.0002] # PHOENICIAN LETTER SEMK +1090F ; [.22DC.0020.0002] # PHOENICIAN LETTER AIN +10910 ; [.22DD.0020.0002] # PHOENICIAN LETTER PE +10911 ; [.22DE.0020.0002] # PHOENICIAN LETTER SADE +10912 ; [.22DF.0020.0002] # PHOENICIAN LETTER QOF +10913 ; [.22E0.0020.0002] # PHOENICIAN LETTER ROSH +10914 ; [.22E1.0020.0002] # PHOENICIAN LETTER SHIN +10915 ; [.22E2.0020.0002] # PHOENICIAN LETTER TAU +0800 ; [.22E3.0020.0002] # SAMARITAN LETTER ALAF +0801 ; [.22E4.0020.0002] # SAMARITAN LETTER BIT +0802 ; [.22E5.0020.0002] # SAMARITAN LETTER GAMAN +0803 ; [.22E6.0020.0002] # SAMARITAN LETTER DALAT +0804 ; [.22E7.0020.0002] # SAMARITAN LETTER IY +0805 ; [.22E8.0020.0002] # SAMARITAN LETTER BAA +0806 ; [.22E9.0020.0002] # SAMARITAN LETTER ZEN +0807 ; [.22EA.0020.0002] # SAMARITAN LETTER IT +0808 ; [.22EB.0020.0002] # SAMARITAN LETTER TIT +0809 ; [.22EC.0020.0002] # SAMARITAN LETTER YUT +080A ; [.22ED.0020.0002] # SAMARITAN LETTER KAAF +080B ; [.22EE.0020.0002] # SAMARITAN LETTER LABAT +080C ; [.22EF.0020.0002] # SAMARITAN LETTER MIM +080D ; [.22F0.0020.0002] # SAMARITAN LETTER NUN +080E ; [.22F1.0020.0002] # SAMARITAN LETTER SINGAAT +080F ; [.22F2.0020.0002] # SAMARITAN LETTER IN +0810 ; [.22F3.0020.0002] # SAMARITAN LETTER FI +0811 ; [.22F4.0020.0002] # SAMARITAN LETTER TSAADIY +0812 ; [.22F5.0020.0002] # SAMARITAN LETTER QUF +0813 ; [.22F6.0020.0002] # SAMARITAN LETTER RISH +0814 ; [.22F7.0020.0002] # SAMARITAN LETTER SHAN +0815 ; [.22F8.0020.0002] # SAMARITAN LETTER TAAF +0816 ; [.22F9.0020.0002] # SAMARITAN MARK IN +0817 ; [.22FA.0020.0002] # SAMARITAN MARK IN-ALAF +081A ; [.22FB.0020.0002] # SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B ; [.22FC.0020.0002] # SAMARITAN MARK EPENTHETIC YUT +0621 ; [.22FD.0020.0002] # ARABIC LETTER HAMZA +0674 ; [.22FD.0020.0004] # ARABIC LETTER HIGH HAMZA +FE80 ; [.22FD.0020.001A] # ARABIC LETTER HAMZA ISOLATED FORM +06FD ; [.22FD.0020.0004][.0000.0111.0004] # ARABIC SIGN SINDHI AMPERSAND +0622 ; [.22FE.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE +0627 0653 ; [.22FE.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE +FE82 ; [.22FE.0020.0019] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE81 ; [.22FE.0020.001A] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +0623 ; [.22FF.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE +0627 0654 ; [.22FF.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE +FE84 ; [.22FF.0020.0019] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE83 ; [.22FF.0020.001A] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +0672 ; [.2300.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE +0671 ; [.2301.0020.0002] # ARABIC LETTER ALEF WASLA +FB51 ; [.2301.0020.0019] # ARABIC LETTER ALEF WASLA FINAL FORM +FB50 ; [.2301.0020.001A] # ARABIC LETTER ALEF WASLA ISOLATED FORM +0624 ; [.2302.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE +0648 0654 ; [.2302.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE +FE86 ; [.2302.0020.0019] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE85 ; [.2302.0020.001A] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +0625 ; [.2303.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW +0627 0655 ; [.2303.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW +FE88 ; [.2303.0020.0019] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE87 ; [.2303.0020.001A] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +0673 ; [.2304.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0773 ; [.2305.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0774 ; [.2306.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0626 ; [.2307.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE +064A 0654 ; [.2307.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE +FE8B ; [.2307.0020.0017] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE8C ; [.2307.0020.0018] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8A ; [.2307.0020.0019] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE89 ; [.2307.0020.001A] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FBEB ; [.2307.0020.0019][.230B.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEA ; [.2307.0020.001A][.230B.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FC97 ; [.2307.0020.0017][.2325.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC00 ; [.2307.0020.001A][.2325.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC98 ; [.2307.0020.0017][.232C.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC01 ; [.2307.0020.001A][.232C.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC99 ; [.2307.0020.0017][.232D.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC64 ; [.2307.0020.0019][.2346.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65 ; [.2307.0020.0019][.2347.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC9A ; [.2307.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FCDF ; [.2307.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FC66 ; [.2307.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC02 ; [.2307.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC67 ; [.2307.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC9B ; [.2307.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FCE0 ; [.2307.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FBED ; [.2307.0020.0019][.23B6.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEC ; [.2307.0020.001A][.23B6.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBEF ; [.2307.0020.0019][.23B7.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBEE ; [.2307.0020.001A][.23B7.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBF3 ; [.2307.0020.0019][.23BA.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF2 ; [.2307.0020.001A][.23BA.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF1 ; [.2307.0020.0019][.23BB.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF0 ; [.2307.0020.001A][.23BB.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF5 ; [.2307.0020.0019][.23BC.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF4 ; [.2307.0020.001A][.23BC.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBFB ; [.2307.0020.0017][.23C5.0020.0017] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFA ; [.2307.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC68 ; [.2307.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBF9 ; [.2307.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC03 ; [.2307.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC69 ; [.2307.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC04 ; [.2307.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FBF8 ; [.2307.0020.0017][.23CA.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF7 ; [.2307.0020.0019][.23CA.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBF6 ; [.2307.0020.001A][.23CA.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +08A8 ; [.2308.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE +08A9 ; [.2309.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE +08AC ; [.230A.0020.0002] # ARABIC LETTER ROHINGYA YEH +0627 ; [.230B.0020.0002] # ARABIC LETTER ALEF +08AD ; [.230B.0020.0004] # ARABIC LETTER LOW ALEF +1EE00 ; [.230B.0020.0005] # ARABIC MATHEMATICAL ALEF +1EE80 ; [.230B.0020.0005] # ARABIC MATHEMATICAL LOOPED ALEF +FE8E ; [.230B.0020.0019] # ARABIC LETTER ALEF FINAL FORM +FE8D ; [.230B.0020.001A] # ARABIC LETTER ALEF ISOLATED FORM +FD3C ; [.230B.0020.0019][.0000.006D.0019] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD3D ; [.230B.0020.001A][.0000.006D.001A] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +0675 ; [.230B.0020.0004][.22FD.0020.0004] # ARABIC LETTER HIGH HAMZA ALEF +FDF3 ; [.230B.0020.001A][.2387.0020.001A][.230D.0020.001A][.2346.0020.001A] # ARABIC LIGATURE AKBAR ISOLATED FORM +FDF2 ; [.230B.0020.001A][.239C.0020.001A][.239C.0020.001A][.23B1.0020.001A] # ARABIC LIGATURE ALLAH ISOLATED FORM +066E ; [.230C.0020.0002] # ARABIC LETTER DOTLESS BEH +1EE1C ; [.230C.0020.0005] # ARABIC MATHEMATICAL DOTLESS BEH +1EE7C ; [.230C.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +0628 ; [.230D.0020.0002] # ARABIC LETTER BEH +1EE01 ; [.230D.0020.0005] # ARABIC MATHEMATICAL BEH +1EE21 ; [.230D.0020.0005] # ARABIC MATHEMATICAL INITIAL BEH +1EE61 ; [.230D.0020.0005] # ARABIC MATHEMATICAL STRETCHED BEH +1EE81 ; [.230D.0020.0005] # ARABIC MATHEMATICAL LOOPED BEH +1EEA1 ; [.230D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK BEH +FE91 ; [.230D.0020.0017] # ARABIC LETTER BEH INITIAL FORM +FE92 ; [.230D.0020.0018] # ARABIC LETTER BEH MEDIAL FORM +FE90 ; [.230D.0020.0019] # ARABIC LETTER BEH FINAL FORM +FE8F ; [.230D.0020.001A] # ARABIC LETTER BEH ISOLATED FORM +FC9C ; [.230D.0020.0017][.2325.0020.0017] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC05 ; [.230D.0020.001A][.2325.0020.001A] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC9D ; [.230D.0020.0017][.232C.0020.0017] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC06 ; [.230D.0020.001A][.232C.0020.001A] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FDC2 ; [.230D.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FC9E ; [.230D.0020.0017][.232D.0020.0017] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC07 ; [.230D.0020.001A][.232D.0020.001A] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FD9E ; [.230D.0020.0019][.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FC6A ; [.230D.0020.0019][.2346.0020.0019] # ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B ; [.230D.0020.0019][.2347.0020.0019] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC9F ; [.230D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCE1 ; [.230D.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FC6C ; [.230D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC08 ; [.230D.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC6D ; [.230D.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE BEH WITH NOON FINAL FORM +FCA0 ; [.230D.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCE2 ; [.230D.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FC6E ; [.230D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC09 ; [.230D.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC6F ; [.230D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC0A ; [.230D.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +067B ; [.230E.0020.0002] # ARABIC LETTER BEEH +FB54 ; [.230E.0020.0017] # ARABIC LETTER BEEH INITIAL FORM +FB55 ; [.230E.0020.0018] # ARABIC LETTER BEEH MEDIAL FORM +FB53 ; [.230E.0020.0019] # ARABIC LETTER BEEH FINAL FORM +FB52 ; [.230E.0020.001A] # ARABIC LETTER BEEH ISOLATED FORM +067E ; [.230F.0020.0002] # ARABIC LETTER PEH +FB58 ; [.230F.0020.0017] # ARABIC LETTER PEH INITIAL FORM +FB59 ; [.230F.0020.0018] # ARABIC LETTER PEH MEDIAL FORM +FB57 ; [.230F.0020.0019] # ARABIC LETTER PEH FINAL FORM +FB56 ; [.230F.0020.001A] # ARABIC LETTER PEH ISOLATED FORM +0680 ; [.2310.0020.0002] # ARABIC LETTER BEHEH +FB5C ; [.2310.0020.0017] # ARABIC LETTER BEHEH INITIAL FORM +FB5D ; [.2310.0020.0018] # ARABIC LETTER BEHEH MEDIAL FORM +FB5B ; [.2310.0020.0019] # ARABIC LETTER BEHEH FINAL FORM +FB5A ; [.2310.0020.001A] # ARABIC LETTER BEHEH ISOLATED FORM +0750 ; [.2311.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW +0751 ; [.2312.0020.0002] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE +0752 ; [.2313.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW +0753 ; [.2314.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE +0754 ; [.2315.0020.0002] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE +0755 ; [.2316.0020.0002] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW +08A0 ; [.2317.0020.0002] # ARABIC LETTER BEH WITH SMALL V BELOW +0756 ; [.2318.0020.0002] # ARABIC LETTER BEH WITH SMALL V +08A1 ; [.2319.0020.0002] # ARABIC LETTER BEH WITH HAMZA ABOVE +08B6 ; [.231A.0020.0002] # ARABIC LETTER BEH WITH SMALL MEEM ABOVE +08B7 ; [.231B.0020.0002] # ARABIC LETTER PEH WITH SMALL MEEM ABOVE +0629 ; [.231C.0020.0002] # ARABIC LETTER TEH MARBUTA +FE94 ; [.231C.0020.0019] # ARABIC LETTER TEH MARBUTA FINAL FORM +FE93 ; [.231C.0020.001A] # ARABIC LETTER TEH MARBUTA ISOLATED FORM +062A ; [.231D.0020.0002] # ARABIC LETTER TEH +1EE15 ; [.231D.0020.0005] # ARABIC MATHEMATICAL TEH +1EE35 ; [.231D.0020.0005] # ARABIC MATHEMATICAL INITIAL TEH +1EE75 ; [.231D.0020.0005] # ARABIC MATHEMATICAL STRETCHED TEH +1EE95 ; [.231D.0020.0005] # ARABIC MATHEMATICAL LOOPED TEH +1EEB5 ; [.231D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TEH +FE97 ; [.231D.0020.0017] # ARABIC LETTER TEH INITIAL FORM +FE98 ; [.231D.0020.0018] # ARABIC LETTER TEH MEDIAL FORM +FE96 ; [.231D.0020.0019] # ARABIC LETTER TEH FINAL FORM +FE95 ; [.231D.0020.001A] # ARABIC LETTER TEH ISOLATED FORM +FCA1 ; [.231D.0020.0017][.2325.0020.0017] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FC0B ; [.231D.0020.001A][.2325.0020.001A] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FD50 ; [.231D.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FDA0 ; [.231D.0020.0019][.2325.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9F ; [.231D.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FCA2 ; [.231D.0020.0017][.232C.0020.0017] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FC0C ; [.231D.0020.001A][.232C.0020.001A] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FD52 ; [.231D.0020.0017][.232C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD51 ; [.231D.0020.0019][.232C.0020.0019][.2325.0020.0019] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD53 ; [.231D.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FCA3 ; [.231D.0020.0017][.232D.0020.0017] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FC0D ; [.231D.0020.001A][.232D.0020.001A] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FD54 ; [.231D.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FDA2 ; [.231D.0020.0019][.232D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA1 ; [.231D.0020.0019][.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FC70 ; [.231D.0020.0019][.2346.0020.0019] # ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71 ; [.231D.0020.0019][.2347.0020.0019] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FCA4 ; [.231D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCE3 ; [.231D.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FC72 ; [.231D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC0E ; [.231D.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FD55 ; [.231D.0020.0017][.23A3.0020.0017][.2325.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56 ; [.231D.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57 ; [.231D.0020.0017][.23A3.0020.0017][.232D.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FDA4 ; [.231D.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA3 ; [.231D.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FC73 ; [.231D.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE TEH WITH NOON FINAL FORM +FCA5 ; [.231D.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCE4 ; [.231D.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FC74 ; [.231D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC0F ; [.231D.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC75 ; [.231D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC10 ; [.231D.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +062B ; [.231E.0020.0002] # ARABIC LETTER THEH +1EE16 ; [.231E.0020.0005] # ARABIC MATHEMATICAL THEH +1EE36 ; [.231E.0020.0005] # ARABIC MATHEMATICAL INITIAL THEH +1EE76 ; [.231E.0020.0005] # ARABIC MATHEMATICAL STRETCHED THEH +1EE96 ; [.231E.0020.0005] # ARABIC MATHEMATICAL LOOPED THEH +1EEB6 ; [.231E.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THEH +FE9B ; [.231E.0020.0017] # ARABIC LETTER THEH INITIAL FORM +FE9C ; [.231E.0020.0018] # ARABIC LETTER THEH MEDIAL FORM +FE9A ; [.231E.0020.0019] # ARABIC LETTER THEH FINAL FORM +FE99 ; [.231E.0020.001A] # ARABIC LETTER THEH ISOLATED FORM +FC11 ; [.231E.0020.001A][.2325.0020.001A] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC76 ; [.231E.0020.0019][.2346.0020.0019] # ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77 ; [.231E.0020.0019][.2347.0020.0019] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FCA6 ; [.231E.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCE5 ; [.231E.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FC78 ; [.231E.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC12 ; [.231E.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC79 ; [.231E.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE THEH WITH NOON FINAL FORM +FCE6 ; [.231E.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FC7A ; [.231E.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC13 ; [.231E.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC7B ; [.231E.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC14 ; [.231E.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +0679 ; [.231F.0020.0002] # ARABIC LETTER TTEH +FB68 ; [.231F.0020.0017] # ARABIC LETTER TTEH INITIAL FORM +FB69 ; [.231F.0020.0018] # ARABIC LETTER TTEH MEDIAL FORM +FB67 ; [.231F.0020.0019] # ARABIC LETTER TTEH FINAL FORM +FB66 ; [.231F.0020.001A] # ARABIC LETTER TTEH ISOLATED FORM +067A ; [.2320.0020.0002] # ARABIC LETTER TTEHEH +FB60 ; [.2320.0020.0017] # ARABIC LETTER TTEHEH INITIAL FORM +FB61 ; [.2320.0020.0018] # ARABIC LETTER TTEHEH MEDIAL FORM +FB5F ; [.2320.0020.0019] # ARABIC LETTER TTEHEH FINAL FORM +FB5E ; [.2320.0020.001A] # ARABIC LETTER TTEHEH ISOLATED FORM +067C ; [.2321.0020.0002] # ARABIC LETTER TEH WITH RING +067D ; [.2322.0020.0002] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS +067F ; [.2323.0020.0002] # ARABIC LETTER TEHEH +FB64 ; [.2323.0020.0017] # ARABIC LETTER TEHEH INITIAL FORM +FB65 ; [.2323.0020.0018] # ARABIC LETTER TEHEH MEDIAL FORM +FB63 ; [.2323.0020.0019] # ARABIC LETTER TEHEH FINAL FORM +FB62 ; [.2323.0020.001A] # ARABIC LETTER TEHEH ISOLATED FORM +08B8 ; [.2324.0020.0002] # ARABIC LETTER TEH WITH SMALL TEH ABOVE +062C ; [.2325.0020.0002] # ARABIC LETTER JEEM +1EE02 ; [.2325.0020.0005] # ARABIC MATHEMATICAL JEEM +1EE22 ; [.2325.0020.0005] # ARABIC MATHEMATICAL INITIAL JEEM +1EE42 ; [.2325.0020.0005] # ARABIC MATHEMATICAL TAILED JEEM +1EE62 ; [.2325.0020.0005] # ARABIC MATHEMATICAL STRETCHED JEEM +1EE82 ; [.2325.0020.0005] # ARABIC MATHEMATICAL LOOPED JEEM +1EEA2 ; [.2325.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM +FE9F ; [.2325.0020.0017] # ARABIC LETTER JEEM INITIAL FORM +FEA0 ; [.2325.0020.0018] # ARABIC LETTER JEEM MEDIAL FORM +FE9E ; [.2325.0020.0019] # ARABIC LETTER JEEM FINAL FORM +FE9D ; [.2325.0020.001A] # ARABIC LETTER JEEM ISOLATED FORM +FCA7 ; [.2325.0020.0017][.232C.0020.0017] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FC15 ; [.2325.0020.001A][.232C.0020.001A] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FDA6 ; [.2325.0020.0019][.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDBE ; [.2325.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDFB ; [.2325.0020.001A][.239C.0020.001A][*0209.0020.001A][.2325.0020.001A][.239C.0020.001A][.230B.0020.001A][.239C.0020.001A][.23B1.0020.001A] # ARABIC LIGATURE JALLAJALALOUHOU +FCA8 ; [.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FC16 ; [.2325.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FD59 ; [.2325.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD58 ; [.2325.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FDA7 ; [.2325.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5 ; [.2325.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FD1D ; [.2325.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD01 ; [.2325.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD1E ; [.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD02 ; [.2325.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +0683 ; [.2326.0020.0002] # ARABIC LETTER NYEH +FB78 ; [.2326.0020.0017] # ARABIC LETTER NYEH INITIAL FORM +FB79 ; [.2326.0020.0018] # ARABIC LETTER NYEH MEDIAL FORM +FB77 ; [.2326.0020.0019] # ARABIC LETTER NYEH FINAL FORM +FB76 ; [.2326.0020.001A] # ARABIC LETTER NYEH ISOLATED FORM +0684 ; [.2327.0020.0002] # ARABIC LETTER DYEH +FB74 ; [.2327.0020.0017] # ARABIC LETTER DYEH INITIAL FORM +FB75 ; [.2327.0020.0018] # ARABIC LETTER DYEH MEDIAL FORM +FB73 ; [.2327.0020.0019] # ARABIC LETTER DYEH FINAL FORM +FB72 ; [.2327.0020.001A] # ARABIC LETTER DYEH ISOLATED FORM +0686 ; [.2328.0020.0002] # ARABIC LETTER TCHEH +FB7C ; [.2328.0020.0017] # ARABIC LETTER TCHEH INITIAL FORM +FB7D ; [.2328.0020.0018] # ARABIC LETTER TCHEH MEDIAL FORM +FB7B ; [.2328.0020.0019] # ARABIC LETTER TCHEH FINAL FORM +FB7A ; [.2328.0020.001A] # ARABIC LETTER TCHEH ISOLATED FORM +06BF ; [.2329.0020.0002] # ARABIC LETTER TCHEH WITH DOT ABOVE +0687 ; [.232A.0020.0002] # ARABIC LETTER TCHEHEH +FB80 ; [.232A.0020.0017] # ARABIC LETTER TCHEHEH INITIAL FORM +FB81 ; [.232A.0020.0018] # ARABIC LETTER TCHEHEH MEDIAL FORM +FB7F ; [.232A.0020.0019] # ARABIC LETTER TCHEHEH FINAL FORM +FB7E ; [.232A.0020.001A] # ARABIC LETTER TCHEHEH ISOLATED FORM +08A2 ; [.232B.0020.0002] # ARABIC LETTER JEEM WITH TWO DOTS ABOVE +062D ; [.232C.0020.0002] # ARABIC LETTER HAH +1EE07 ; [.232C.0020.0005] # ARABIC MATHEMATICAL HAH +1EE27 ; [.232C.0020.0005] # ARABIC MATHEMATICAL INITIAL HAH +1EE47 ; [.232C.0020.0005] # ARABIC MATHEMATICAL TAILED HAH +1EE67 ; [.232C.0020.0005] # ARABIC MATHEMATICAL STRETCHED HAH +1EE87 ; [.232C.0020.0005] # ARABIC MATHEMATICAL LOOPED HAH +1EEA7 ; [.232C.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK HAH +FEA3 ; [.232C.0020.0017] # ARABIC LETTER HAH INITIAL FORM +FEA4 ; [.232C.0020.0018] # ARABIC LETTER HAH MEDIAL FORM +FEA2 ; [.232C.0020.0019] # ARABIC LETTER HAH FINAL FORM +FEA1 ; [.232C.0020.001A] # ARABIC LETTER HAH ISOLATED FORM +FCA9 ; [.232C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FC17 ; [.232C.0020.001A][.2325.0020.001A] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FDBF ; [.232C.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FCAA ; [.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FC18 ; [.232C.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FD5B ; [.232C.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5A ; [.232C.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD1B ; [.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FCFF ; [.232C.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD1C ; [.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD00 ; [.232C.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +062E ; [.232D.0020.0002] # ARABIC LETTER KHAH +1EE17 ; [.232D.0020.0005] # ARABIC MATHEMATICAL KHAH +1EE37 ; [.232D.0020.0005] # ARABIC MATHEMATICAL INITIAL KHAH +1EE57 ; [.232D.0020.0005] # ARABIC MATHEMATICAL TAILED KHAH +1EE77 ; [.232D.0020.0005] # ARABIC MATHEMATICAL STRETCHED KHAH +1EE97 ; [.232D.0020.0005] # ARABIC MATHEMATICAL LOOPED KHAH +1EEB7 ; [.232D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH +FEA7 ; [.232D.0020.0017] # ARABIC LETTER KHAH INITIAL FORM +FEA8 ; [.232D.0020.0018] # ARABIC LETTER KHAH MEDIAL FORM +FEA6 ; [.232D.0020.0019] # ARABIC LETTER KHAH FINAL FORM +FEA5 ; [.232D.0020.001A] # ARABIC LETTER KHAH ISOLATED FORM +FCAB ; [.232D.0020.0017][.2325.0020.0017] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FC19 ; [.232D.0020.001A][.2325.0020.001A] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A ; [.232D.0020.001A][.232C.0020.001A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FCAC ; [.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FC1B ; [.232D.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FD1F ; [.232D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD03 ; [.232D.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD20 ; [.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD04 ; [.232D.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +0681 ; [.232E.0020.0002] # ARABIC LETTER HAH WITH HAMZA ABOVE +0682 ; [.232F.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE +0685 ; [.2330.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS ABOVE +0757 ; [.2331.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS ABOVE +0758 ; [.2332.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW +076E ; [.2333.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW +076F ; [.2334.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS +0772 ; [.2335.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE +077C ; [.2336.0020.0002] # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW +062F ; [.2337.0020.0002] # ARABIC LETTER DAL +1EE03 ; [.2337.0020.0005] # ARABIC MATHEMATICAL DAL +1EE83 ; [.2337.0020.0005] # ARABIC MATHEMATICAL LOOPED DAL +1EEA3 ; [.2337.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +FEAA ; [.2337.0020.0019] # ARABIC LETTER DAL FINAL FORM +FEA9 ; [.2337.0020.001A] # ARABIC LETTER DAL ISOLATED FORM +0630 ; [.2338.0020.0002] # ARABIC LETTER THAL +1EE18 ; [.2338.0020.0005] # ARABIC MATHEMATICAL THAL +1EE98 ; [.2338.0020.0005] # ARABIC MATHEMATICAL LOOPED THAL +1EEB8 ; [.2338.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THAL +FEAC ; [.2338.0020.0019] # ARABIC LETTER THAL FINAL FORM +FEAB ; [.2338.0020.001A] # ARABIC LETTER THAL ISOLATED FORM +FC5B ; [.2338.0020.001A][.0000.0098.001A] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +0688 ; [.2339.0020.0002] # ARABIC LETTER DDAL +FB89 ; [.2339.0020.0019] # ARABIC LETTER DDAL FINAL FORM +FB88 ; [.2339.0020.001A] # ARABIC LETTER DDAL ISOLATED FORM +0689 ; [.233A.0020.0002] # ARABIC LETTER DAL WITH RING +068A ; [.233B.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW +068B ; [.233C.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH +068C ; [.233D.0020.0002] # ARABIC LETTER DAHAL +FB85 ; [.233D.0020.0019] # ARABIC LETTER DAHAL FINAL FORM +FB84 ; [.233D.0020.001A] # ARABIC LETTER DAHAL ISOLATED FORM +068D ; [.233E.0020.0002] # ARABIC LETTER DDAHAL +FB83 ; [.233E.0020.0019] # ARABIC LETTER DDAHAL FINAL FORM +FB82 ; [.233E.0020.001A] # ARABIC LETTER DDAHAL ISOLATED FORM +08AE ; [.233F.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS BELOW +068E ; [.2340.0020.0002] # ARABIC LETTER DUL +FB87 ; [.2340.0020.0019] # ARABIC LETTER DUL FINAL FORM +FB86 ; [.2340.0020.001A] # ARABIC LETTER DUL ISOLATED FORM +068F ; [.2341.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS +0690 ; [.2342.0020.0002] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE +06EE ; [.2343.0020.0002] # ARABIC LETTER DAL WITH INVERTED V +0759 ; [.2344.0020.0002] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH +075A ; [.2345.0020.0002] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW +0631 ; [.2346.0020.0002] # ARABIC LETTER REH +1EE13 ; [.2346.0020.0005] # ARABIC MATHEMATICAL REH +1EE93 ; [.2346.0020.0005] # ARABIC MATHEMATICAL LOOPED REH +1EEB3 ; [.2346.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK REH +FEAE ; [.2346.0020.0019] # ARABIC LETTER REH FINAL FORM +FEAD ; [.2346.0020.001A] # ARABIC LETTER REH ISOLATED FORM +FC5C ; [.2346.0020.001A][.0000.0098.001A] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FDF6 ; [.2346.0020.001A][.2359.0020.001A][.23B7.0020.001A][.239C.0020.001A] # ARABIC LIGATURE RASOUL ISOLATED FORM +FDFC ; [.2346.0020.001A][.23C7.0020.001A][.230B.0020.001A][.239C.0020.001A] # RIAL SIGN +0632 ; [.2347.0020.0002] # ARABIC LETTER ZAIN +1EE06 ; [.2347.0020.0005] # ARABIC MATHEMATICAL ZAIN +1EE86 ; [.2347.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAIN +1EEA6 ; [.2347.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN +FEB0 ; [.2347.0020.0019] # ARABIC LETTER ZAIN FINAL FORM +FEAF ; [.2347.0020.001A] # ARABIC LETTER ZAIN ISOLATED FORM +0691 ; [.2348.0020.0002] # ARABIC LETTER RREH +FB8D ; [.2348.0020.0019] # ARABIC LETTER RREH FINAL FORM +FB8C ; [.2348.0020.001A] # ARABIC LETTER RREH ISOLATED FORM +0692 ; [.2349.0020.0002] # ARABIC LETTER REH WITH SMALL V +0693 ; [.234A.0020.0002] # ARABIC LETTER REH WITH RING +0694 ; [.234B.0020.0002] # ARABIC LETTER REH WITH DOT BELOW +0695 ; [.234C.0020.0002] # ARABIC LETTER REH WITH SMALL V BELOW +0696 ; [.234D.0020.0002] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE +0697 ; [.234E.0020.0002] # ARABIC LETTER REH WITH TWO DOTS ABOVE +0698 ; [.234F.0020.0002] # ARABIC LETTER JEH +FB8B ; [.234F.0020.0019] # ARABIC LETTER JEH FINAL FORM +FB8A ; [.234F.0020.001A] # ARABIC LETTER JEH ISOLATED FORM +0699 ; [.2350.0020.0002] # ARABIC LETTER REH WITH FOUR DOTS ABOVE +06EF ; [.2351.0020.0002] # ARABIC LETTER REH WITH INVERTED V +075B ; [.2352.0020.0002] # ARABIC LETTER REH WITH STROKE +076B ; [.2353.0020.0002] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE +076C ; [.2354.0020.0002] # ARABIC LETTER REH WITH HAMZA ABOVE +0771 ; [.2355.0020.0002] # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS +08AA ; [.2356.0020.0002] # ARABIC LETTER REH WITH LOOP +08B2 ; [.2357.0020.0002] # ARABIC LETTER ZAIN WITH INVERTED V ABOVE +08B9 ; [.2358.0020.0002] # ARABIC LETTER REH WITH SMALL NOON ABOVE +0633 ; [.2359.0020.0002] # ARABIC LETTER SEEN +1EE0E ; [.2359.0020.0005] # ARABIC MATHEMATICAL SEEN +1EE2E ; [.2359.0020.0005] # ARABIC MATHEMATICAL INITIAL SEEN +1EE4E ; [.2359.0020.0005] # ARABIC MATHEMATICAL TAILED SEEN +1EE6E ; [.2359.0020.0005] # ARABIC MATHEMATICAL STRETCHED SEEN +1EE8E ; [.2359.0020.0005] # ARABIC MATHEMATICAL LOOPED SEEN +1EEAE ; [.2359.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN +FEB3 ; [.2359.0020.0017] # ARABIC LETTER SEEN INITIAL FORM +FEB4 ; [.2359.0020.0018] # ARABIC LETTER SEEN MEDIAL FORM +FEB2 ; [.2359.0020.0019] # ARABIC LETTER SEEN FINAL FORM +FEB1 ; [.2359.0020.001A] # ARABIC LETTER SEEN ISOLATED FORM +FCAD ; [.2359.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FD34 ; [.2359.0020.0018][.2325.0020.0018] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FC1C ; [.2359.0020.001A][.2325.0020.001A] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FD5D ; [.2359.0020.0017][.2325.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E ; [.2359.0020.0019][.2325.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FCAE ; [.2359.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FD35 ; [.2359.0020.0018][.232C.0020.0018] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FC1D ; [.2359.0020.001A][.232C.0020.001A] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FD5C ; [.2359.0020.0017][.232C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FCAF ; [.2359.0020.0017][.232D.0020.0017] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FD36 ; [.2359.0020.0018][.232D.0020.0018] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FC1E ; [.2359.0020.001A][.232D.0020.001A] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FDA8 ; [.2359.0020.0019][.232D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDC6 ; [.2359.0020.0019][.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FD2A ; [.2359.0020.0019][.2346.0020.0019] # ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD0E ; [.2359.0020.001A][.2346.0020.001A] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FCB0 ; [.2359.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCE7 ; [.2359.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FC1F ; [.2359.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FD61 ; [.2359.0020.0017][.23A3.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD60 ; [.2359.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD5F ; [.2359.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD63 ; [.2359.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD62 ; [.2359.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD31 ; [.2359.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FCE8 ; [.2359.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FD17 ; [.2359.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FCFB ; [.2359.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FD18 ; [.2359.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FCFC ; [.2359.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +0634 ; [.235A.0020.0002] # ARABIC LETTER SHEEN +1EE14 ; [.235A.0020.0005] # ARABIC MATHEMATICAL SHEEN +1EE34 ; [.235A.0020.0005] # ARABIC MATHEMATICAL INITIAL SHEEN +1EE54 ; [.235A.0020.0005] # ARABIC MATHEMATICAL TAILED SHEEN +1EE74 ; [.235A.0020.0005] # ARABIC MATHEMATICAL STRETCHED SHEEN +1EE94 ; [.235A.0020.0005] # ARABIC MATHEMATICAL LOOPED SHEEN +1EEB4 ; [.235A.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN +FEB7 ; [.235A.0020.0017] # ARABIC LETTER SHEEN INITIAL FORM +FEB8 ; [.235A.0020.0018] # ARABIC LETTER SHEEN MEDIAL FORM +FEB6 ; [.235A.0020.0019] # ARABIC LETTER SHEEN FINAL FORM +FEB5 ; [.235A.0020.001A] # ARABIC LETTER SHEEN ISOLATED FORM +FD2D ; [.235A.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD37 ; [.235A.0020.0018][.2325.0020.0018] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD25 ; [.235A.0020.0019][.2325.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD09 ; [.235A.0020.001A][.2325.0020.001A] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD69 ; [.235A.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD2E ; [.235A.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD38 ; [.235A.0020.0018][.232C.0020.0018] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD26 ; [.235A.0020.0019][.232C.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD0A ; [.235A.0020.001A][.232C.0020.001A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD68 ; [.235A.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD67 ; [.235A.0020.0019][.232C.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FDAA ; [.235A.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FD2F ; [.235A.0020.0017][.232D.0020.0017] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD39 ; [.235A.0020.0018][.232D.0020.0018] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD27 ; [.235A.0020.0019][.232D.0020.0019] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD0B ; [.235A.0020.001A][.232D.0020.001A] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD29 ; [.235A.0020.0019][.2346.0020.0019] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD0D ; [.235A.0020.001A][.2346.0020.001A] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD30 ; [.235A.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FCE9 ; [.235A.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FD28 ; [.235A.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD0C ; [.235A.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD6B ; [.235A.0020.0017][.23A3.0020.0017][.232D.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6A ; [.235A.0020.0019][.23A3.0020.0019][.232D.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6D ; [.235A.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6C ; [.235A.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD32 ; [.235A.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FCEA ; [.235A.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FD19 ; [.235A.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FCFD ; [.235A.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FD1A ; [.235A.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FCFE ; [.235A.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +069A ; [.235B.0020.0002] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE +069B ; [.235C.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW +069C ; [.235D.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE +06FA ; [.235E.0020.0002] # ARABIC LETTER SHEEN WITH DOT BELOW +075C ; [.235F.0020.0002] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE +076D ; [.2360.0020.0002] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +0770 ; [.2361.0020.0002] # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS +077D ; [.2362.0020.0002] # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE +077E ; [.2363.0020.0002] # ARABIC LETTER SEEN WITH INVERTED V +0635 ; [.2364.0020.0002] # ARABIC LETTER SAD +1EE11 ; [.2364.0020.0005] # ARABIC MATHEMATICAL SAD +1EE31 ; [.2364.0020.0005] # ARABIC MATHEMATICAL INITIAL SAD +1EE51 ; [.2364.0020.0005] # ARABIC MATHEMATICAL TAILED SAD +1EE71 ; [.2364.0020.0005] # ARABIC MATHEMATICAL STRETCHED SAD +1EE91 ; [.2364.0020.0005] # ARABIC MATHEMATICAL LOOPED SAD +1EEB1 ; [.2364.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SAD +FEBB ; [.2364.0020.0017] # ARABIC LETTER SAD INITIAL FORM +FEBC ; [.2364.0020.0018] # ARABIC LETTER SAD MEDIAL FORM +FEBA ; [.2364.0020.0019] # ARABIC LETTER SAD FINAL FORM +FEB9 ; [.2364.0020.001A] # ARABIC LETTER SAD ISOLATED FORM +FCB1 ; [.2364.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FC20 ; [.2364.0020.001A][.232C.0020.001A] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FD65 ; [.2364.0020.0017][.232C.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD64 ; [.2364.0020.0019][.232C.0020.0019][.232C.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FDA9 ; [.2364.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FCB2 ; [.2364.0020.0017][.232D.0020.0017] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FD2B ; [.2364.0020.0019][.2346.0020.0019] # ARABIC LIGATURE SAD WITH REH FINAL FORM +FD0F ; [.2364.0020.001A][.2346.0020.001A] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FDF5 ; [.2364.0020.001A][.239C.0020.001A][.236E.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SALAM ISOLATED FORM +FDF9 ; [.2364.0020.001A][.239C.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE SALLA ISOLATED FORM +FDFA ; [.2364.0020.001A][.239C.0020.001A][.23C5.0020.001A][*0209.0020.001A][.230B.0020.001A][.239C.0020.001A][.239C.0020.001A][.23B1.0020.001A][*0209.0020.001A][.236E.0020.001A][.239C.0020.001A][.23C6.0020.001A][.23B1.0020.001A][*0209.0020.001A][.23B7.0020.001A][.2359.0020.001A][.239C.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDF0 ; [.2364.0020.001A][.239C.0020.001A][.23D4.0020.001A] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FCB3 ; [.2364.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FC21 ; [.2364.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FDC5 ; [.2364.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FD66 ; [.2364.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD21 ; [.2364.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD05 ; [.2364.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD22 ; [.2364.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD06 ; [.2364.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +0636 ; [.2365.0020.0002] # ARABIC LETTER DAD +1EE19 ; [.2365.0020.0005] # ARABIC MATHEMATICAL DAD +1EE39 ; [.2365.0020.0005] # ARABIC MATHEMATICAL INITIAL DAD +1EE59 ; [.2365.0020.0005] # ARABIC MATHEMATICAL TAILED DAD +1EE79 ; [.2365.0020.0005] # ARABIC MATHEMATICAL STRETCHED DAD +1EE99 ; [.2365.0020.0005] # ARABIC MATHEMATICAL LOOPED DAD +1EEB9 ; [.2365.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAD +FEBF ; [.2365.0020.0017] # ARABIC LETTER DAD INITIAL FORM +FEC0 ; [.2365.0020.0018] # ARABIC LETTER DAD MEDIAL FORM +FEBE ; [.2365.0020.0019] # ARABIC LETTER DAD FINAL FORM +FEBD ; [.2365.0020.001A] # ARABIC LETTER DAD ISOLATED FORM +FCB4 ; [.2365.0020.0017][.2325.0020.0017] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FC22 ; [.2365.0020.001A][.2325.0020.001A] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FCB5 ; [.2365.0020.0017][.232C.0020.0017] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FC23 ; [.2365.0020.001A][.232C.0020.001A] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FD6E ; [.2365.0020.0019][.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FDAB ; [.2365.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FCB6 ; [.2365.0020.0017][.232D.0020.0017] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FC24 ; [.2365.0020.001A][.232D.0020.001A] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FD70 ; [.2365.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD6F ; [.2365.0020.0019][.232D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD2C ; [.2365.0020.0019][.2346.0020.0019] # ARABIC LIGATURE DAD WITH REH FINAL FORM +FD10 ; [.2365.0020.001A][.2346.0020.001A] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FCB7 ; [.2365.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FC25 ; [.2365.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FD23 ; [.2365.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD07 ; [.2365.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD24 ; [.2365.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD08 ; [.2365.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +069D ; [.2366.0020.0002] # ARABIC LETTER SAD WITH TWO DOTS BELOW +08AF ; [.2367.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS BELOW +069E ; [.2368.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS ABOVE +06FB ; [.2369.0020.0002] # ARABIC LETTER DAD WITH DOT BELOW +0637 ; [.236A.0020.0002] # ARABIC LETTER TAH +1EE08 ; [.236A.0020.0005] # ARABIC MATHEMATICAL TAH +1EE68 ; [.236A.0020.0005] # ARABIC MATHEMATICAL STRETCHED TAH +1EE88 ; [.236A.0020.0005] # ARABIC MATHEMATICAL LOOPED TAH +1EEA8 ; [.236A.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TAH +FEC3 ; [.236A.0020.0017] # ARABIC LETTER TAH INITIAL FORM +FEC4 ; [.236A.0020.0018] # ARABIC LETTER TAH MEDIAL FORM +FEC2 ; [.236A.0020.0019] # ARABIC LETTER TAH FINAL FORM +FEC1 ; [.236A.0020.001A] # ARABIC LETTER TAH ISOLATED FORM +FCB8 ; [.236A.0020.0017][.232C.0020.0017] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FC26 ; [.236A.0020.001A][.232C.0020.001A] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FD33 ; [.236A.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD3A ; [.236A.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FC27 ; [.236A.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FD72 ; [.236A.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD71 ; [.236A.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD73 ; [.236A.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74 ; [.236A.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD11 ; [.236A.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FCF5 ; [.236A.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FD12 ; [.236A.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TAH WITH YEH FINAL FORM +FCF6 ; [.236A.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +0638 ; [.236B.0020.0002] # ARABIC LETTER ZAH +1EE1A ; [.236B.0020.0005] # ARABIC MATHEMATICAL ZAH +1EE7A ; [.236B.0020.0005] # ARABIC MATHEMATICAL STRETCHED ZAH +1EE9A ; [.236B.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAH +1EEBA ; [.236B.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH +FEC7 ; [.236B.0020.0017] # ARABIC LETTER ZAH INITIAL FORM +FEC8 ; [.236B.0020.0018] # ARABIC LETTER ZAH MEDIAL FORM +FEC6 ; [.236B.0020.0019] # ARABIC LETTER ZAH FINAL FORM +FEC5 ; [.236B.0020.001A] # ARABIC LETTER ZAH ISOLATED FORM +FCB9 ; [.236B.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FD3B ; [.236B.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FC28 ; [.236B.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +069F ; [.236C.0020.0002] # ARABIC LETTER TAH WITH THREE DOTS ABOVE +08A3 ; [.236D.0020.0002] # ARABIC LETTER TAH WITH TWO DOTS ABOVE +0639 ; [.236E.0020.0002] # ARABIC LETTER AIN +1EE0F ; [.236E.0020.0005] # ARABIC MATHEMATICAL AIN +1EE2F ; [.236E.0020.0005] # ARABIC MATHEMATICAL INITIAL AIN +1EE4F ; [.236E.0020.0005] # ARABIC MATHEMATICAL TAILED AIN +1EE6F ; [.236E.0020.0005] # ARABIC MATHEMATICAL STRETCHED AIN +1EE8F ; [.236E.0020.0005] # ARABIC MATHEMATICAL LOOPED AIN +1EEAF ; [.236E.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK AIN +FECB ; [.236E.0020.0017] # ARABIC LETTER AIN INITIAL FORM +FECC ; [.236E.0020.0018] # ARABIC LETTER AIN MEDIAL FORM +FECA ; [.236E.0020.0019] # ARABIC LETTER AIN FINAL FORM +FEC9 ; [.236E.0020.001A] # ARABIC LETTER AIN ISOLATED FORM +FCBA ; [.236E.0020.0017][.2325.0020.0017] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FC29 ; [.236E.0020.001A][.2325.0020.001A] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FDC4 ; [.236E.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FD75 ; [.236E.0020.0019][.2325.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FDF7 ; [.236E.0020.001A][.239C.0020.001A][.23C6.0020.001A][.23B1.0020.001A] # ARABIC LIGATURE ALAYHE ISOLATED FORM +FCBB ; [.236E.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FC2A ; [.236E.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FD77 ; [.236E.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD76 ; [.236E.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD78 ; [.236E.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDB6 ; [.236E.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FD13 ; [.236E.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FCF7 ; [.236E.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FD14 ; [.236E.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE AIN WITH YEH FINAL FORM +FCF8 ; [.236E.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +063A ; [.236F.0020.0002] # ARABIC LETTER GHAIN +1EE1B ; [.236F.0020.0005] # ARABIC MATHEMATICAL GHAIN +1EE3B ; [.236F.0020.0005] # ARABIC MATHEMATICAL INITIAL GHAIN +1EE5B ; [.236F.0020.0005] # ARABIC MATHEMATICAL TAILED GHAIN +1EE7B ; [.236F.0020.0005] # ARABIC MATHEMATICAL STRETCHED GHAIN +1EE9B ; [.236F.0020.0005] # ARABIC MATHEMATICAL LOOPED GHAIN +1EEBB ; [.236F.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +FECF ; [.236F.0020.0017] # ARABIC LETTER GHAIN INITIAL FORM +FED0 ; [.236F.0020.0018] # ARABIC LETTER GHAIN MEDIAL FORM +FECE ; [.236F.0020.0019] # ARABIC LETTER GHAIN FINAL FORM +FECD ; [.236F.0020.001A] # ARABIC LETTER GHAIN ISOLATED FORM +FCBC ; [.236F.0020.0017][.2325.0020.0017] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FC2B ; [.236F.0020.001A][.2325.0020.001A] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FCBD ; [.236F.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FC2C ; [.236F.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FD79 ; [.236F.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7B ; [.236F.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7A ; [.236F.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD15 ; [.236F.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FCF9 ; [.236F.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FD16 ; [.236F.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FCFA ; [.236F.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +06A0 ; [.2370.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS ABOVE +06FC ; [.2371.0020.0002] # ARABIC LETTER GHAIN WITH DOT BELOW +075D ; [.2372.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS ABOVE +075E ; [.2373.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE +075F ; [.2374.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE +08B3 ; [.2375.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS BELOW +0641 ; [.2376.0020.0002] # ARABIC LETTER FEH +1EE10 ; [.2376.0020.0005] # ARABIC MATHEMATICAL FEH +1EE30 ; [.2376.0020.0005] # ARABIC MATHEMATICAL INITIAL FEH +1EE70 ; [.2376.0020.0005] # ARABIC MATHEMATICAL STRETCHED FEH +1EE90 ; [.2376.0020.0005] # ARABIC MATHEMATICAL LOOPED FEH +1EEB0 ; [.2376.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK FEH +FED3 ; [.2376.0020.0017] # ARABIC LETTER FEH INITIAL FORM +FED4 ; [.2376.0020.0018] # ARABIC LETTER FEH MEDIAL FORM +FED2 ; [.2376.0020.0019] # ARABIC LETTER FEH FINAL FORM +FED1 ; [.2376.0020.001A] # ARABIC LETTER FEH ISOLATED FORM +FCBE ; [.2376.0020.0017][.2325.0020.0017] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FC2D ; [.2376.0020.001A][.2325.0020.001A] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FCBF ; [.2376.0020.0017][.232C.0020.0017] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FC2E ; [.2376.0020.001A][.232C.0020.001A] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FCC0 ; [.2376.0020.0017][.232D.0020.0017] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FC2F ; [.2376.0020.001A][.232D.0020.001A] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FD7D ; [.2376.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7C ; [.2376.0020.0019][.232D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FCC1 ; [.2376.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FC30 ; [.2376.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FDC1 ; [.2376.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FC7C ; [.2376.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC31 ; [.2376.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC7D ; [.2376.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC32 ; [.2376.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +06A1 ; [.2377.0020.0002] # ARABIC LETTER DOTLESS FEH +1EE1E ; [.2377.0020.0005] # ARABIC MATHEMATICAL DOTLESS FEH +1EE7E ; [.2377.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +06A2 ; [.2378.0020.0002] # ARABIC LETTER FEH WITH DOT MOVED BELOW +08BB ; [.2379.0020.0002] # ARABIC LETTER AFRICAN FEH +06A3 ; [.237A.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW +06A4 ; [.237B.0020.0002] # ARABIC LETTER VEH +FB6C ; [.237B.0020.0017] # ARABIC LETTER VEH INITIAL FORM +FB6D ; [.237B.0020.0018] # ARABIC LETTER VEH MEDIAL FORM +FB6B ; [.237B.0020.0019] # ARABIC LETTER VEH FINAL FORM +FB6A ; [.237B.0020.001A] # ARABIC LETTER VEH ISOLATED FORM +08A4 ; [.237C.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE +06A5 ; [.237D.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS BELOW +06A6 ; [.237E.0020.0002] # ARABIC LETTER PEHEH +FB70 ; [.237E.0020.0017] # ARABIC LETTER PEHEH INITIAL FORM +FB71 ; [.237E.0020.0018] # ARABIC LETTER PEHEH MEDIAL FORM +FB6F ; [.237E.0020.0019] # ARABIC LETTER PEHEH FINAL FORM +FB6E ; [.237E.0020.001A] # ARABIC LETTER PEHEH ISOLATED FORM +0760 ; [.237F.0020.0002] # ARABIC LETTER FEH WITH TWO DOTS BELOW +0761 ; [.2380.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW +066F ; [.2381.0020.0002] # ARABIC LETTER DOTLESS QAF +1EE1F ; [.2381.0020.0005] # ARABIC MATHEMATICAL DOTLESS QAF +1EE5F ; [.2381.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS QAF +0642 ; [.2382.0020.0002] # ARABIC LETTER QAF +1EE12 ; [.2382.0020.0005] # ARABIC MATHEMATICAL QAF +1EE32 ; [.2382.0020.0005] # ARABIC MATHEMATICAL INITIAL QAF +1EE52 ; [.2382.0020.0005] # ARABIC MATHEMATICAL TAILED QAF +1EE72 ; [.2382.0020.0005] # ARABIC MATHEMATICAL STRETCHED QAF +1EE92 ; [.2382.0020.0005] # ARABIC MATHEMATICAL LOOPED QAF +1EEB2 ; [.2382.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK QAF +FED7 ; [.2382.0020.0017] # ARABIC LETTER QAF INITIAL FORM +FED8 ; [.2382.0020.0018] # ARABIC LETTER QAF MEDIAL FORM +FED6 ; [.2382.0020.0019] # ARABIC LETTER QAF FINAL FORM +FED5 ; [.2382.0020.001A] # ARABIC LETTER QAF ISOLATED FORM +FCC2 ; [.2382.0020.0017][.232C.0020.0017] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FC33 ; [.2382.0020.001A][.232C.0020.001A] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FDF1 ; [.2382.0020.001A][.239C.0020.001A][.23D4.0020.001A] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FCC3 ; [.2382.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FC34 ; [.2382.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FDB4 ; [.2382.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FD7E ; [.2382.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F ; [.2382.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FDB2 ; [.2382.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FC7E ; [.2382.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC35 ; [.2382.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC7F ; [.2382.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC36 ; [.2382.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +06A7 ; [.2383.0020.0002] # ARABIC LETTER QAF WITH DOT ABOVE +08BC ; [.2384.0020.0002] # ARABIC LETTER AFRICAN QAF +06A8 ; [.2385.0020.0002] # ARABIC LETTER QAF WITH THREE DOTS ABOVE +08A5 ; [.2386.0020.0002] # ARABIC LETTER QAF WITH DOT BELOW +0643 ; [.2387.0020.0002] # ARABIC LETTER KAF +1EE0A ; [.2387.0020.0005] # ARABIC MATHEMATICAL KAF +1EE2A ; [.2387.0020.0005] # ARABIC MATHEMATICAL INITIAL KAF +1EE6A ; [.2387.0020.0005] # ARABIC MATHEMATICAL STRETCHED KAF +FEDB ; [.2387.0020.0017] # ARABIC LETTER KAF INITIAL FORM +FEDC ; [.2387.0020.0018] # ARABIC LETTER KAF MEDIAL FORM +FEDA ; [.2387.0020.0019] # ARABIC LETTER KAF FINAL FORM +FED9 ; [.2387.0020.001A] # ARABIC LETTER KAF ISOLATED FORM +FC80 ; [.2387.0020.0019][.230B.0020.0019] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC37 ; [.2387.0020.001A][.230B.0020.001A] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FCC4 ; [.2387.0020.0017][.2325.0020.0017] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FC38 ; [.2387.0020.001A][.2325.0020.001A] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FCC5 ; [.2387.0020.0017][.232C.0020.0017] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FC39 ; [.2387.0020.001A][.232C.0020.001A] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FCC6 ; [.2387.0020.0017][.232D.0020.0017] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FC3A ; [.2387.0020.001A][.232D.0020.001A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FCC7 ; [.2387.0020.0017][.239C.0020.0017] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCEB ; [.2387.0020.0018][.239C.0020.0018] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FC81 ; [.2387.0020.0019][.239C.0020.0019] # ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC3B ; [.2387.0020.001A][.239C.0020.001A] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FCC8 ; [.2387.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCEC ; [.2387.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FC82 ; [.2387.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC3C ; [.2387.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FDC3 ; [.2387.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDBB ; [.2387.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDB7 ; [.2387.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FC83 ; [.2387.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC3D ; [.2387.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC84 ; [.2387.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC3E ; [.2387.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +06A9 ; [.2388.0020.0002] # ARABIC LETTER KEHEH +FB90 ; [.2388.0020.0017] # ARABIC LETTER KEHEH INITIAL FORM +FB91 ; [.2388.0020.0018] # ARABIC LETTER KEHEH MEDIAL FORM +FB8F ; [.2388.0020.0019] # ARABIC LETTER KEHEH FINAL FORM +FB8E ; [.2388.0020.001A] # ARABIC LETTER KEHEH ISOLATED FORM +06AA ; [.2389.0020.0002] # ARABIC LETTER SWASH KAF +06AB ; [.238A.0020.0002] # ARABIC LETTER KAF WITH RING +06AC ; [.238B.0020.0002] # ARABIC LETTER KAF WITH DOT ABOVE +077F ; [.238C.0020.0002] # ARABIC LETTER KAF WITH TWO DOTS ABOVE +06AD ; [.238D.0020.0002] # ARABIC LETTER NG +FBD5 ; [.238D.0020.0017] # ARABIC LETTER NG INITIAL FORM +FBD6 ; [.238D.0020.0018] # ARABIC LETTER NG MEDIAL FORM +FBD4 ; [.238D.0020.0019] # ARABIC LETTER NG FINAL FORM +FBD3 ; [.238D.0020.001A] # ARABIC LETTER NG ISOLATED FORM +06AE ; [.238E.0020.0002] # ARABIC LETTER KAF WITH THREE DOTS BELOW +08B4 ; [.238F.0020.0002] # ARABIC LETTER KAF WITH DOT BELOW +06AF ; [.2390.0020.0002] # ARABIC LETTER GAF +FB94 ; [.2390.0020.0017] # ARABIC LETTER GAF INITIAL FORM +FB95 ; [.2390.0020.0018] # ARABIC LETTER GAF MEDIAL FORM +FB93 ; [.2390.0020.0019] # ARABIC LETTER GAF FINAL FORM +FB92 ; [.2390.0020.001A] # ARABIC LETTER GAF ISOLATED FORM +08B0 ; [.2391.0020.0002] # ARABIC LETTER GAF WITH INVERTED STROKE +06B0 ; [.2392.0020.0002] # ARABIC LETTER GAF WITH RING +06B1 ; [.2393.0020.0002] # ARABIC LETTER NGOEH +FB9C ; [.2393.0020.0017] # ARABIC LETTER NGOEH INITIAL FORM +FB9D ; [.2393.0020.0018] # ARABIC LETTER NGOEH MEDIAL FORM +FB9B ; [.2393.0020.0019] # ARABIC LETTER NGOEH FINAL FORM +FB9A ; [.2393.0020.001A] # ARABIC LETTER NGOEH ISOLATED FORM +06B2 ; [.2394.0020.0002] # ARABIC LETTER GAF WITH TWO DOTS BELOW +06B3 ; [.2395.0020.0002] # ARABIC LETTER GUEH +FB98 ; [.2395.0020.0017] # ARABIC LETTER GUEH INITIAL FORM +FB99 ; [.2395.0020.0018] # ARABIC LETTER GUEH MEDIAL FORM +FB97 ; [.2395.0020.0019] # ARABIC LETTER GUEH FINAL FORM +FB96 ; [.2395.0020.001A] # ARABIC LETTER GUEH ISOLATED FORM +06B4 ; [.2396.0020.0002] # ARABIC LETTER GAF WITH THREE DOTS ABOVE +0762 ; [.2397.0020.0002] # ARABIC LETTER KEHEH WITH DOT ABOVE +063B ; [.2398.0020.0002] # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE +063C ; [.2399.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS BELOW +0763 ; [.239A.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE +0764 ; [.239B.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW +0644 ; [.239C.0020.0002] # ARABIC LETTER LAM +1EE0B ; [.239C.0020.0005] # ARABIC MATHEMATICAL LAM +1EE2B ; [.239C.0020.0005] # ARABIC MATHEMATICAL INITIAL LAM +1EE4B ; [.239C.0020.0005] # ARABIC MATHEMATICAL TAILED LAM +1EE8B ; [.239C.0020.0005] # ARABIC MATHEMATICAL LOOPED LAM +1EEAB ; [.239C.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK LAM +FEDF ; [.239C.0020.0017] # ARABIC LETTER LAM INITIAL FORM +FEE0 ; [.239C.0020.0018] # ARABIC LETTER LAM MEDIAL FORM +FEDE ; [.239C.0020.0019] # ARABIC LETTER LAM FINAL FORM +FEDD ; [.239C.0020.001A] # ARABIC LETTER LAM ISOLATED FORM +FEF6 ; [.239C.0020.0019][.22FE.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF5 ; [.239C.0020.001A][.22FE.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF8 ; [.239C.0020.0019][.22FF.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF7 ; [.239C.0020.001A][.22FF.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEFA ; [.239C.0020.0019][.2303.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEF9 ; [.239C.0020.001A][.2303.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFC ; [.239C.0020.0019][.230B.0020.0019] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFB ; [.239C.0020.001A][.230B.0020.001A] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +FCC9 ; [.239C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FC3F ; [.239C.0020.001A][.2325.0020.001A] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FD83 ; [.239C.0020.0017][.2325.0020.0017][.2325.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD84 ; [.239C.0020.0019][.2325.0020.0019][.2325.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FDBA ; [.239C.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBC ; [.239C.0020.0019][.2325.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDAC ; [.239C.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FCCA ; [.239C.0020.0017][.232C.0020.0017] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FC40 ; [.239C.0020.001A][.232C.0020.001A] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FDB5 ; [.239C.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FD80 ; [.239C.0020.0019][.232C.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD82 ; [.239C.0020.0019][.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD81 ; [.239C.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FCCB ; [.239C.0020.0017][.232D.0020.0017] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FC41 ; [.239C.0020.001A][.232D.0020.001A] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FD86 ; [.239C.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD85 ; [.239C.0020.0019][.232D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FCCC ; [.239C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCED ; [.239C.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FC85 ; [.239C.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC42 ; [.239C.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FD88 ; [.239C.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD87 ; [.239C.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FDAD ; [.239C.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FCCD ; [.239C.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FC86 ; [.239C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC43 ; [.239C.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC87 ; [.239C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC44 ; [.239C.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +06B5 ; [.239D.0020.0002] # ARABIC LETTER LAM WITH SMALL V +06B6 ; [.239E.0020.0002] # ARABIC LETTER LAM WITH DOT ABOVE +06B7 ; [.239F.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS ABOVE +06B8 ; [.23A0.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS BELOW +076A ; [.23A1.0020.0002] # ARABIC LETTER LAM WITH BAR +08A6 ; [.23A2.0020.0002] # ARABIC LETTER LAM WITH DOUBLE BAR +0645 ; [.23A3.0020.0002] # ARABIC LETTER MEEM +1EE0C ; [.23A3.0020.0005] # ARABIC MATHEMATICAL MEEM +1EE2C ; [.23A3.0020.0005] # ARABIC MATHEMATICAL INITIAL MEEM +1EE6C ; [.23A3.0020.0005] # ARABIC MATHEMATICAL STRETCHED MEEM +1EE8C ; [.23A3.0020.0005] # ARABIC MATHEMATICAL LOOPED MEEM +1EEAC ; [.23A3.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM +FEE3 ; [.23A3.0020.0017] # ARABIC LETTER MEEM INITIAL FORM +FEE4 ; [.23A3.0020.0018] # ARABIC LETTER MEEM MEDIAL FORM +FEE2 ; [.23A3.0020.0019] # ARABIC LETTER MEEM FINAL FORM +FEE1 ; [.23A3.0020.001A] # ARABIC LETTER MEEM ISOLATED FORM +06FE ; [.23A3.0020.0004][.0000.0111.0004] # ARABIC SIGN SINDHI POSTPOSITION MEN +FC88 ; [.23A3.0020.0019][.230B.0020.0019] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FCCE ; [.23A3.0020.0017][.2325.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FC45 ; [.23A3.0020.001A][.2325.0020.001A] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FD8C ; [.23A3.0020.0017][.2325.0020.0017][.232C.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD92 ; [.23A3.0020.0017][.2325.0020.0017][.232D.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD8D ; [.23A3.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FDC0 ; [.23A3.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FCCF ; [.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FC46 ; [.23A3.0020.001A][.232C.0020.001A] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FD89 ; [.23A3.0020.0017][.232C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A ; [.23A3.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FDF4 ; [.23A3.0020.001A][.232C.0020.001A][.23A3.0020.001A][.2337.0020.001A] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FD8B ; [.23A3.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FCD0 ; [.23A3.0020.0017][.232D.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FC47 ; [.23A3.0020.001A][.232D.0020.001A] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FD8E ; [.23A3.0020.0017][.232D.0020.0017][.2325.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F ; [.23A3.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FDB9 ; [.23A3.0020.0019][.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FCD1 ; [.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FC89 ; [.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC48 ; [.23A3.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FDB1 ; [.23A3.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FC49 ; [.23A3.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A ; [.23A3.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +0765 ; [.23A4.0020.0002] # ARABIC LETTER MEEM WITH DOT ABOVE +0766 ; [.23A5.0020.0002] # ARABIC LETTER MEEM WITH DOT BELOW +08A7 ; [.23A6.0020.0002] # ARABIC LETTER MEEM WITH THREE DOTS ABOVE +0646 ; [.23A7.0020.0002] # ARABIC LETTER NOON +1EE0D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL NOON +1EE2D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL INITIAL NOON +1EE4D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL TAILED NOON +1EE6D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL STRETCHED NOON +1EE8D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL LOOPED NOON +1EEAD ; [.23A7.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK NOON +FEE7 ; [.23A7.0020.0017] # ARABIC LETTER NOON INITIAL FORM +FEE8 ; [.23A7.0020.0018] # ARABIC LETTER NOON MEDIAL FORM +FEE6 ; [.23A7.0020.0019] # ARABIC LETTER NOON FINAL FORM +FEE5 ; [.23A7.0020.001A] # ARABIC LETTER NOON ISOLATED FORM +FCD2 ; [.23A7.0020.0017][.2325.0020.0017] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FC4B ; [.23A7.0020.001A][.2325.0020.001A] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FDB8 ; [.23A7.0020.0017][.2325.0020.0017][.232C.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDBD ; [.23A7.0020.0019][.2325.0020.0019][.232C.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FD98 ; [.23A7.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD97 ; [.23A7.0020.0019][.2325.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD99 ; [.23A7.0020.0019][.2325.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDC7 ; [.23A7.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FCD3 ; [.23A7.0020.0017][.232C.0020.0017] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FC4C ; [.23A7.0020.001A][.232C.0020.001A] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FD95 ; [.23A7.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96 ; [.23A7.0020.0019][.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FDB3 ; [.23A7.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FCD4 ; [.23A7.0020.0017][.232D.0020.0017] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FC4D ; [.23A7.0020.001A][.232D.0020.001A] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC8A ; [.23A7.0020.0019][.2346.0020.0019] # ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B ; [.23A7.0020.0019][.2347.0020.0019] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FCD5 ; [.23A7.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCEE ; [.23A7.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FC8C ; [.23A7.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC4E ; [.23A7.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FD9B ; [.23A7.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9A ; [.23A7.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FC8D ; [.23A7.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE NOON WITH NOON FINAL FORM +FCD6 ; [.23A7.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCEF ; [.23A7.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FC8E ; [.23A7.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC4F ; [.23A7.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC8F ; [.23A7.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC50 ; [.23A7.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +06BA ; [.23A8.0020.0002] # ARABIC LETTER NOON GHUNNA +1EE1D ; [.23A8.0020.0005] # ARABIC MATHEMATICAL DOTLESS NOON +1EE5D ; [.23A8.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS NOON +FB9F ; [.23A8.0020.0019] # ARABIC LETTER NOON GHUNNA FINAL FORM +FB9E ; [.23A8.0020.001A] # ARABIC LETTER NOON GHUNNA ISOLATED FORM +08BD ; [.23A9.0020.0002] # ARABIC LETTER AFRICAN NOON +06BB ; [.23AA.0020.0002] # ARABIC LETTER RNOON +FBA2 ; [.23AA.0020.0017] # ARABIC LETTER RNOON INITIAL FORM +FBA3 ; [.23AA.0020.0018] # ARABIC LETTER RNOON MEDIAL FORM +FBA1 ; [.23AA.0020.0019] # ARABIC LETTER RNOON FINAL FORM +FBA0 ; [.23AA.0020.001A] # ARABIC LETTER RNOON ISOLATED FORM +06BC ; [.23AB.0020.0002] # ARABIC LETTER NOON WITH RING +06BD ; [.23AC.0020.0002] # ARABIC LETTER NOON WITH THREE DOTS ABOVE +06B9 ; [.23AD.0020.0002] # ARABIC LETTER NOON WITH DOT BELOW +0767 ; [.23AE.0020.0002] # ARABIC LETTER NOON WITH TWO DOTS BELOW +0768 ; [.23AF.0020.0002] # ARABIC LETTER NOON WITH SMALL TAH +0769 ; [.23B0.0020.0002] # ARABIC LETTER NOON WITH SMALL V +0647 ; [.23B1.0020.0002] # ARABIC LETTER HEH +1EE24 ; [.23B1.0020.0005] # ARABIC MATHEMATICAL INITIAL HEH +1EE64 ; [.23B1.0020.0005] # ARABIC MATHEMATICAL STRETCHED HEH +1EE84 ; [.23B1.0020.0005] # ARABIC MATHEMATICAL LOOPED HEH +FEEB ; [.23B1.0020.0017] # ARABIC LETTER HEH INITIAL FORM +FEEC ; [.23B1.0020.0018] # ARABIC LETTER HEH MEDIAL FORM +FEEA ; [.23B1.0020.0019] # ARABIC LETTER HEH FINAL FORM +FEE9 ; [.23B1.0020.001A] # ARABIC LETTER HEH ISOLATED FORM +FCD9 ; [.23B1.0020.0017][.0000.0098.0017] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCD7 ; [.23B1.0020.0017][.2325.0020.0017] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FC51 ; [.23B1.0020.001A][.2325.0020.001A] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FCD8 ; [.23B1.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FC52 ; [.23B1.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FD93 ; [.23B1.0020.0017][.23A3.0020.0017][.2325.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94 ; [.23B1.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FC53 ; [.23B1.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54 ; [.23B1.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +06BE ; [.23B2.0020.0002] # ARABIC LETTER HEH DOACHASHMEE +FBAC ; [.23B2.0020.0017] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBAD ; [.23B2.0020.0018] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAB ; [.23B2.0020.0019] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAA ; [.23B2.0020.001A] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +06C1 ; [.23B3.0020.0002] # ARABIC LETTER HEH GOAL +FBA8 ; [.23B3.0020.0017] # ARABIC LETTER HEH GOAL INITIAL FORM +FBA9 ; [.23B3.0020.0018] # ARABIC LETTER HEH GOAL MEDIAL FORM +FBA7 ; [.23B3.0020.0019] # ARABIC LETTER HEH GOAL FINAL FORM +FBA6 ; [.23B3.0020.001A] # ARABIC LETTER HEH GOAL ISOLATED FORM +06C2 ; [.23B3.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06C3 ; [.23B4.0020.0002] # ARABIC LETTER TEH MARBUTA GOAL +06FF ; [.23B5.0020.0002] # ARABIC LETTER HEH WITH INVERTED V +06D5 ; [.23B6.0020.0002] # ARABIC LETTER AE +06C0 ; [.23B6.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH WITH YEH ABOVE +FBA5 ; [.23B6.0020.0019][.0000.0083.0019] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA4 ; [.23B6.0020.001A][.0000.0083.001A] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +0648 ; [.23B7.0020.0002] # ARABIC LETTER WAW +06E5 ; [.23B7.0020.0004] # ARABIC SMALL WAW +1EE05 ; [.23B7.0020.0005] # ARABIC MATHEMATICAL WAW +1EE85 ; [.23B7.0020.0005] # ARABIC MATHEMATICAL LOOPED WAW +1EEA5 ; [.23B7.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK WAW +FEEE ; [.23B7.0020.0019] # ARABIC LETTER WAW FINAL FORM +FEED ; [.23B7.0020.001A] # ARABIC LETTER WAW ISOLATED FORM +0676 ; [.23B7.0020.0004][.22FD.0020.0004] # ARABIC LETTER HIGH HAMZA WAW +FDF8 ; [.23B7.0020.001A][.2359.0020.001A][.239C.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE WASALLAM ISOLATED FORM +06C4 ; [.23B8.0020.0002] # ARABIC LETTER WAW WITH RING +06C5 ; [.23B9.0020.0002] # ARABIC LETTER KIRGHIZ OE +FBE1 ; [.23B9.0020.0019] # ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE0 ; [.23B9.0020.001A] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM +06C6 ; [.23BA.0020.0002] # ARABIC LETTER OE +FBDA ; [.23BA.0020.0019] # ARABIC LETTER OE FINAL FORM +FBD9 ; [.23BA.0020.001A] # ARABIC LETTER OE ISOLATED FORM +06C7 ; [.23BB.0020.0002] # ARABIC LETTER U +FBD8 ; [.23BB.0020.0019] # ARABIC LETTER U FINAL FORM +FBD7 ; [.23BB.0020.001A] # ARABIC LETTER U ISOLATED FORM +0677 ; [.23BB.0020.0004][.22FD.0020.0004] # ARABIC LETTER U WITH HAMZA ABOVE +FBDD ; [.23BB.0020.001A][.22FD.0020.001A] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +06C8 ; [.23BC.0020.0002] # ARABIC LETTER YU +FBDC ; [.23BC.0020.0019] # ARABIC LETTER YU FINAL FORM +FBDB ; [.23BC.0020.001A] # ARABIC LETTER YU ISOLATED FORM +06C9 ; [.23BD.0020.0002] # ARABIC LETTER KIRGHIZ YU +FBE3 ; [.23BD.0020.0019] # ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE2 ; [.23BD.0020.001A] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM +06CA ; [.23BE.0020.0002] # ARABIC LETTER WAW WITH TWO DOTS ABOVE +06CB ; [.23BF.0020.0002] # ARABIC LETTER VE +FBDF ; [.23BF.0020.0019] # ARABIC LETTER VE FINAL FORM +FBDE ; [.23BF.0020.001A] # ARABIC LETTER VE ISOLATED FORM +08B1 ; [.23C0.0020.0002] # ARABIC LETTER STRAIGHT WAW +06CF ; [.23C1.0020.0002] # ARABIC LETTER WAW WITH DOT ABOVE +0778 ; [.23C2.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0779 ; [.23C3.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +08AB ; [.23C4.0020.0002] # ARABIC LETTER WAW WITH DOT WITHIN +0649 ; [.23C5.0020.0002] # ARABIC LETTER ALEF MAKSURA +FBE8 ; [.23C5.0020.0017] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBE9 ; [.23C5.0020.0018] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FEF0 ; [.23C5.0020.0019] # ARABIC LETTER ALEF MAKSURA FINAL FORM +FEEF ; [.23C5.0020.001A] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FC90 ; [.23C5.0020.0019][.0000.0098.0019] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC5D ; [.23C5.0020.001A][.0000.0098.001A] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +064A ; [.23C6.0020.0002] # ARABIC LETTER YEH +06E6 ; [.23C6.0020.0004] # ARABIC SMALL YEH +1EE09 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL YEH +1EE29 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL INITIAL YEH +1EE49 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL TAILED YEH +1EE69 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL STRETCHED YEH +1EE89 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL LOOPED YEH +1EEA9 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +FEF3 ; [.23C6.0020.0017] # ARABIC LETTER YEH INITIAL FORM +FEF4 ; [.23C6.0020.0018] # ARABIC LETTER YEH MEDIAL FORM +FEF2 ; [.23C6.0020.0019] # ARABIC LETTER YEH FINAL FORM +FEF1 ; [.23C6.0020.001A] # ARABIC LETTER YEH ISOLATED FORM +0678 ; [.23C6.0020.0004][.22FD.0020.0004] # ARABIC LETTER HIGH HAMZA YEH +FCDA ; [.23C6.0020.0017][.2325.0020.0017] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FC55 ; [.23C6.0020.001A][.2325.0020.001A] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FDAF ; [.23C6.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FCDB ; [.23C6.0020.0017][.232C.0020.0017] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FC56 ; [.23C6.0020.001A][.232C.0020.001A] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FDAE ; [.23C6.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FCDC ; [.23C6.0020.0017][.232D.0020.0017] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FC57 ; [.23C6.0020.001A][.232D.0020.001A] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC91 ; [.23C6.0020.0019][.2346.0020.0019] # ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92 ; [.23C6.0020.0019][.2347.0020.0019] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FCDD ; [.23C6.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCF0 ; [.23C6.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FC93 ; [.23C6.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC58 ; [.23C6.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FD9D ; [.23C6.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9C ; [.23C6.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FDB0 ; [.23C6.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FC94 ; [.23C6.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE YEH WITH NOON FINAL FORM +FCDE ; [.23C6.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCF1 ; [.23C6.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FC95 ; [.23C6.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC59 ; [.23C6.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC96 ; [.23C6.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC5A ; [.23C6.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +06CC ; [.23C7.0020.0002] # ARABIC LETTER FARSI YEH +FBFE ; [.23C7.0020.0017] # ARABIC LETTER FARSI YEH INITIAL FORM +FBFF ; [.23C7.0020.0018] # ARABIC LETTER FARSI YEH MEDIAL FORM +FBFD ; [.23C7.0020.0019] # ARABIC LETTER FARSI YEH FINAL FORM +FBFC ; [.23C7.0020.001A] # ARABIC LETTER FARSI YEH ISOLATED FORM +06CD ; [.23C8.0020.0002] # ARABIC LETTER YEH WITH TAIL +06CE ; [.23C9.0020.0002] # ARABIC LETTER YEH WITH SMALL V +06D0 ; [.23CA.0020.0002] # ARABIC LETTER E +FBE6 ; [.23CA.0020.0017] # ARABIC LETTER E INITIAL FORM +FBE7 ; [.23CA.0020.0018] # ARABIC LETTER E MEDIAL FORM +FBE5 ; [.23CA.0020.0019] # ARABIC LETTER E FINAL FORM +FBE4 ; [.23CA.0020.001A] # ARABIC LETTER E ISOLATED FORM +06D1 ; [.23CB.0020.0002] # ARABIC LETTER YEH WITH THREE DOTS BELOW +063D ; [.23CC.0020.0002] # ARABIC LETTER FARSI YEH WITH INVERTED V +063E ; [.23CD.0020.0002] # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE +063F ; [.23CE.0020.0002] # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0620 ; [.23CF.0020.0002] # ARABIC LETTER KASHMIRI YEH +0775 ; [.23D0.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0776 ; [.23D1.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0777 ; [.23D2.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW +08BA ; [.23D3.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE +06D2 ; [.23D4.0020.0002] # ARABIC LETTER YEH BARREE +FBAF ; [.23D4.0020.0019] # ARABIC LETTER YEH BARREE FINAL FORM +FBAE ; [.23D4.0020.001A] # ARABIC LETTER YEH BARREE ISOLATED FORM +06D3 ; [.23D4.0020.0002][.0000.0083.0002] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +FBB1 ; [.23D4.0020.0019][.0000.0083.0019] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB0 ; [.23D4.0020.001A][.0000.0083.001A] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +077A ; [.23D5.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +077B ; [.23D6.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0710 ; [.23D7.0020.0002] # SYRIAC LETTER ALAPH +0712 ; [.23D8.0020.0002] # SYRIAC LETTER BETH +072D ; [.23D8.0020.0004][.0000.0112.0004] # SYRIAC LETTER PERSIAN BHETH +0713 ; [.23D9.0020.0002] # SYRIAC LETTER GAMAL +0714 ; [.23D9.0020.0004][.0000.0111.0004] # SYRIAC LETTER GAMAL GARSHUNI +072E ; [.23D9.0020.0004][.0000.0112.0004] # SYRIAC LETTER PERSIAN GHAMAL +0716 ; [.23DA.0020.0002] # SYRIAC LETTER DOTLESS DALATH RISH +0715 ; [.23DB.0020.0002] # SYRIAC LETTER DALATH +072F ; [.23DB.0020.0004][.0000.0112.0004] # SYRIAC LETTER PERSIAN DHALATH +0717 ; [.23DC.0020.0002] # SYRIAC LETTER HE +0718 ; [.23DD.0020.0002] # SYRIAC LETTER WAW +0719 ; [.23DE.0020.0002] # SYRIAC LETTER ZAIN +074D ; [.23DF.0020.0002] # SYRIAC LETTER SOGDIAN ZHAIN +071A ; [.23E0.0020.0002] # SYRIAC LETTER HETH +071B ; [.23E1.0020.0002] # SYRIAC LETTER TETH +071C ; [.23E1.0020.0004][.0000.0111.0004] # SYRIAC LETTER TETH GARSHUNI +071D ; [.23E2.0020.0002] # SYRIAC LETTER YUDH +071E ; [.23E3.0020.0002] # SYRIAC LETTER YUDH HE +071F ; [.23E4.0020.0002] # SYRIAC LETTER KAPH +074E ; [.23E5.0020.0002] # SYRIAC LETTER SOGDIAN KHAPH +0720 ; [.23E6.0020.0002] # SYRIAC LETTER LAMADH +0721 ; [.23E7.0020.0002] # SYRIAC LETTER MIM +0722 ; [.23E8.0020.0002] # SYRIAC LETTER NUN +0723 ; [.23E9.0020.0002] # SYRIAC LETTER SEMKATH +0724 ; [.23E9.0020.0019] # SYRIAC LETTER FINAL SEMKATH +0725 ; [.23EA.0020.0002] # SYRIAC LETTER E +0726 ; [.23EB.0020.0002] # SYRIAC LETTER PE +0727 ; [.23EB.0020.0004][.0000.0111.0004] # SYRIAC LETTER REVERSED PE +074F ; [.23EC.0020.0002] # SYRIAC LETTER SOGDIAN FE +0728 ; [.23ED.0020.0002] # SYRIAC LETTER SADHE +0729 ; [.23EE.0020.0002] # SYRIAC LETTER QAPH +072A ; [.23EF.0020.0002] # SYRIAC LETTER RISH +072B ; [.23F0.0020.0002] # SYRIAC LETTER SHIN +072C ; [.23F1.0020.0002] # SYRIAC LETTER TAW +0840 ; [.23F2.0020.0002] # MANDAIC LETTER HALQA +0841 ; [.23F3.0020.0002] # MANDAIC LETTER AB +0842 ; [.23F4.0020.0002] # MANDAIC LETTER AG +0843 ; [.23F5.0020.0002] # MANDAIC LETTER AD +0844 ; [.23F6.0020.0002] # MANDAIC LETTER AH +0845 ; [.23F7.0020.0002] # MANDAIC LETTER USHENNA +0846 ; [.23F8.0020.0002] # MANDAIC LETTER AZ +0847 ; [.23F9.0020.0002] # MANDAIC LETTER IT +0848 ; [.23FA.0020.0002] # MANDAIC LETTER ATT +0849 ; [.23FB.0020.0002] # MANDAIC LETTER AKSA +084A ; [.23FC.0020.0002] # MANDAIC LETTER AK +084B ; [.23FD.0020.0002] # MANDAIC LETTER AL +084C ; [.23FE.0020.0002] # MANDAIC LETTER AM +084D ; [.23FF.0020.0002] # MANDAIC LETTER AN +084E ; [.2400.0020.0002] # MANDAIC LETTER AS +084F ; [.2401.0020.0002] # MANDAIC LETTER IN +0850 ; [.2402.0020.0002] # MANDAIC LETTER AP +0851 ; [.2403.0020.0002] # MANDAIC LETTER ASZ +0852 ; [.2404.0020.0002] # MANDAIC LETTER AQ +0853 ; [.2405.0020.0002] # MANDAIC LETTER AR +0854 ; [.2406.0020.0002] # MANDAIC LETTER ASH +0855 ; [.2407.0020.0002] # MANDAIC LETTER AT +0856 ; [.2408.0020.0002] # MANDAIC LETTER DUSHENNA +0857 ; [.2409.0020.0002] # MANDAIC LETTER KAD +0858 ; [.240A.0020.0002] # MANDAIC LETTER AIN +0780 ; [.240B.0020.0002] # THAANA LETTER HAA +0799 ; [.240C.0020.0002] # THAANA LETTER HHAA +079A ; [.240D.0020.0002] # THAANA LETTER KHAA +0781 ; [.240E.0020.0002] # THAANA LETTER SHAVIYANI +0782 ; [.240F.0020.0002] # THAANA LETTER NOONU +0783 ; [.2410.0020.0002] # THAANA LETTER RAA +079C ; [.2411.0020.0002] # THAANA LETTER ZAA +0784 ; [.2412.0020.0002] # THAANA LETTER BAA +0785 ; [.2413.0020.0002] # THAANA LETTER LHAVIYANI +0786 ; [.2414.0020.0002] # THAANA LETTER KAAFU +0787 ; [.2415.0020.0002] # THAANA LETTER ALIFU +07A2 ; [.2416.0020.0002] # THAANA LETTER AINU +07A3 ; [.2417.0020.0002] # THAANA LETTER GHAINU +0788 ; [.2418.0020.0002] # THAANA LETTER VAAVU +07A5 ; [.2419.0020.0002] # THAANA LETTER WAAVU +0789 ; [.241A.0020.0002] # THAANA LETTER MEEMU +078A ; [.241B.0020.0002] # THAANA LETTER FAAFU +078B ; [.241C.0020.0002] # THAANA LETTER DHAALU +079B ; [.241D.0020.0002] # THAANA LETTER THAALU +078C ; [.241E.0020.0002] # THAANA LETTER THAA +0798 ; [.241F.0020.0002] # THAANA LETTER TTAA +07A0 ; [.2420.0020.0002] # THAANA LETTER TO +07A1 ; [.2421.0020.0002] # THAANA LETTER ZO +078D ; [.2422.0020.0002] # THAANA LETTER LAAMU +078E ; [.2423.0020.0002] # THAANA LETTER GAAFU +07A4 ; [.2424.0020.0002] # THAANA LETTER QAAFU +078F ; [.2425.0020.0002] # THAANA LETTER GNAVIYANI +0790 ; [.2426.0020.0002] # THAANA LETTER SEENU +079D ; [.2427.0020.0002] # THAANA LETTER SHEENU +079E ; [.2428.0020.0002] # THAANA LETTER SAADHU +079F ; [.2429.0020.0002] # THAANA LETTER DAADHU +0791 ; [.242A.0020.0002] # THAANA LETTER DAVIYANI +0792 ; [.242B.0020.0002] # THAANA LETTER ZAVIYANI +0793 ; [.242C.0020.0002] # THAANA LETTER TAVIYANI +0794 ; [.242D.0020.0002] # THAANA LETTER YAA +0795 ; [.242E.0020.0002] # THAANA LETTER PAVIYANI +0796 ; [.242F.0020.0002] # THAANA LETTER JAVIYANI +0797 ; [.2430.0020.0002] # THAANA LETTER CHAVIYANI +07B1 ; [.2431.0020.0002] # THAANA LETTER NAA +07A6 ; [.2432.0020.0002] # THAANA ABAFILI +07A7 ; [.2433.0020.0002] # THAANA AABAAFILI +07A8 ; [.2434.0020.0002] # THAANA IBIFILI +07A9 ; [.2435.0020.0002] # THAANA EEBEEFILI +07AA ; [.2436.0020.0002] # THAANA UBUFILI +07AB ; [.2437.0020.0002] # THAANA OOBOOFILI +07AC ; [.2438.0020.0002] # THAANA EBEFILI +07AD ; [.2439.0020.0002] # THAANA EYBEYFILI +07AE ; [.243A.0020.0002] # THAANA OBOFILI +07AF ; [.243B.0020.0002] # THAANA OABOAFILI +07B0 ; [.243C.0020.0002] # THAANA SUKUN +07CA ; [.243D.0020.0002] # NKO LETTER A +07CB ; [.243E.0020.0002] # NKO LETTER EE +07CC ; [.243F.0020.0002] # NKO LETTER I +07CD ; [.2440.0020.0002] # NKO LETTER E +07CE ; [.2441.0020.0002] # NKO LETTER U +07CF ; [.2442.0020.0002] # NKO LETTER OO +07D0 ; [.2443.0020.0002] # NKO LETTER O +07D1 ; [.2444.0020.0002] # NKO LETTER DAGBASINNA +07D2 ; [.2445.0020.0002] # NKO LETTER N +07D3 ; [.2446.0020.0002] # NKO LETTER BA +07D4 ; [.2447.0020.0002] # NKO LETTER PA +07D5 ; [.2448.0020.0002] # NKO LETTER TA +07D6 ; [.2449.0020.0002] # NKO LETTER JA +07E8 ; [.2449.0020.0004][.0000.0110.0004] # NKO LETTER JONA JA +07D7 ; [.244A.0020.0002] # NKO LETTER CHA +07E9 ; [.244A.0020.0004][.0000.0110.0004] # NKO LETTER JONA CHA +07D8 ; [.244B.0020.0002] # NKO LETTER DA +07D9 ; [.244C.0020.0002] # NKO LETTER RA +07EA ; [.244C.0020.0004][.0000.0110.0004] # NKO LETTER JONA RA +07DA ; [.244D.0020.0002] # NKO LETTER RRA +07DB ; [.244E.0020.0002] # NKO LETTER SA +07DC ; [.244F.0020.0002] # NKO LETTER GBA +07DD ; [.2450.0020.0002] # NKO LETTER FA +07DE ; [.2451.0020.0002] # NKO LETTER KA +07DF ; [.2452.0020.0002] # NKO LETTER LA +07E0 ; [.2453.0020.0002] # NKO LETTER NA WOLOSO +07E1 ; [.2454.0020.0002] # NKO LETTER MA +07E2 ; [.2455.0020.0002] # NKO LETTER NYA +07E3 ; [.2456.0020.0002] # NKO LETTER NA +07E4 ; [.2457.0020.0002] # NKO LETTER HA +07E5 ; [.2458.0020.0002] # NKO LETTER WA +07E6 ; [.2459.0020.0002] # NKO LETTER YA +07E7 ; [.245A.0020.0002] # NKO LETTER NYA WOLOSO +07F4 ; [.245B.0020.0002] # NKO HIGH TONE APOSTROPHE +07F5 ; [.245C.0020.0002] # NKO LOW TONE APOSTROPHE +2D30 ; [.245D.0020.0002] # TIFINAGH LETTER YA +2D31 ; [.245E.0020.0002] # TIFINAGH LETTER YAB +2D32 ; [.245F.0020.0002] # TIFINAGH LETTER YABH +2D33 ; [.2460.0020.0002] # TIFINAGH LETTER YAG +2D34 ; [.2461.0020.0002] # TIFINAGH LETTER YAGHH +2D35 ; [.2462.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAJ +2D36 ; [.2463.0020.0002] # TIFINAGH LETTER YAJ +2D37 ; [.2464.0020.0002] # TIFINAGH LETTER YAD +2D38 ; [.2465.0020.0002] # TIFINAGH LETTER YADH +2D39 ; [.2466.0020.0002] # TIFINAGH LETTER YADD +2D3A ; [.2467.0020.0002] # TIFINAGH LETTER YADDH +2D3B ; [.2468.0020.0002] # TIFINAGH LETTER YEY +2D66 ; [.2469.0020.0002] # TIFINAGH LETTER YE +2D3C ; [.246A.0020.0002] # TIFINAGH LETTER YAF +2D3D ; [.246B.0020.0002] # TIFINAGH LETTER YAK +2D3E ; [.246C.0020.0002] # TIFINAGH LETTER TUAREG YAK +2D3F ; [.246D.0020.0002] # TIFINAGH LETTER YAKHH +2D40 ; [.246E.0020.0002] # TIFINAGH LETTER YAH +2D41 ; [.246F.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAH +2D42 ; [.2470.0020.0002] # TIFINAGH LETTER TUAREG YAH +2D43 ; [.2471.0020.0002] # TIFINAGH LETTER YAHH +2D44 ; [.2472.0020.0002] # TIFINAGH LETTER YAA +2D45 ; [.2473.0020.0002] # TIFINAGH LETTER YAKH +2D46 ; [.2474.0020.0002] # TIFINAGH LETTER TUAREG YAKH +2D47 ; [.2475.0020.0002] # TIFINAGH LETTER YAQ +2D48 ; [.2476.0020.0002] # TIFINAGH LETTER TUAREG YAQ +2D49 ; [.2477.0020.0002] # TIFINAGH LETTER YI +2D4A ; [.2478.0020.0002] # TIFINAGH LETTER YAZH +2D4B ; [.2479.0020.0002] # TIFINAGH LETTER AHAGGAR YAZH +2D4C ; [.247A.0020.0002] # TIFINAGH LETTER TUAREG YAZH +2D4D ; [.247B.0020.0002] # TIFINAGH LETTER YAL +2D4E ; [.247C.0020.0002] # TIFINAGH LETTER YAM +2D4F ; [.247D.0020.0002] # TIFINAGH LETTER YAN +2D50 ; [.247E.0020.0002] # TIFINAGH LETTER TUAREG YAGN +2D51 ; [.247F.0020.0002] # TIFINAGH LETTER TUAREG YANG +2D52 ; [.2480.0020.0002] # TIFINAGH LETTER YAP +2D53 ; [.2481.0020.0002] # TIFINAGH LETTER YU +2D67 ; [.2482.0020.0002] # TIFINAGH LETTER YO +2D54 ; [.2483.0020.0002] # TIFINAGH LETTER YAR +2D55 ; [.2484.0020.0002] # TIFINAGH LETTER YARR +2D56 ; [.2485.0020.0002] # TIFINAGH LETTER YAGH +2D57 ; [.2486.0020.0002] # TIFINAGH LETTER TUAREG YAGH +2D58 ; [.2487.0020.0002] # TIFINAGH LETTER AYER YAGH +2D59 ; [.2488.0020.0002] # TIFINAGH LETTER YAS +2D5A ; [.2489.0020.0002] # TIFINAGH LETTER YASS +2D5B ; [.248A.0020.0002] # TIFINAGH LETTER YASH +2D5C ; [.248B.0020.0002] # TIFINAGH LETTER YAT +2D5D ; [.248C.0020.0002] # TIFINAGH LETTER YATH +2D5E ; [.248D.0020.0002] # TIFINAGH LETTER YACH +2D5F ; [.248E.0020.0002] # TIFINAGH LETTER YATT +2D60 ; [.248F.0020.0002] # TIFINAGH LETTER YAV +2D61 ; [.2490.0020.0002] # TIFINAGH LETTER YAW +2D62 ; [.2491.0020.0002] # TIFINAGH LETTER YAY +2D63 ; [.2492.0020.0002] # TIFINAGH LETTER YAZ +2D64 ; [.2493.0020.0002] # TIFINAGH LETTER TAWELLEMET YAZ +2D65 ; [.2494.0020.0002] # TIFINAGH LETTER YAZZ +2D6F ; [.2495.0020.0002] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK +1200 ; [.2496.0020.0002] # ETHIOPIC SYLLABLE HA +1201 ; [.2497.0020.0002] # ETHIOPIC SYLLABLE HU +1202 ; [.2498.0020.0002] # ETHIOPIC SYLLABLE HI +1203 ; [.2499.0020.0002] # ETHIOPIC SYLLABLE HAA +1204 ; [.249A.0020.0002] # ETHIOPIC SYLLABLE HEE +1205 ; [.249B.0020.0002] # ETHIOPIC SYLLABLE HE +1206 ; [.249C.0020.0002] # ETHIOPIC SYLLABLE HO +1207 ; [.249D.0020.0002] # ETHIOPIC SYLLABLE HOA +1208 ; [.249E.0020.0002] # ETHIOPIC SYLLABLE LA +1209 ; [.249F.0020.0002] # ETHIOPIC SYLLABLE LU +120A ; [.24A0.0020.0002] # ETHIOPIC SYLLABLE LI +120B ; [.24A1.0020.0002] # ETHIOPIC SYLLABLE LAA +120C ; [.24A2.0020.0002] # ETHIOPIC SYLLABLE LEE +120D ; [.24A3.0020.0002] # ETHIOPIC SYLLABLE LE +120E ; [.24A4.0020.0002] # ETHIOPIC SYLLABLE LO +120F ; [.24A5.0020.0002] # ETHIOPIC SYLLABLE LWA +2D80 ; [.24A6.0020.0002] # ETHIOPIC SYLLABLE LOA +1210 ; [.24A7.0020.0002] # ETHIOPIC SYLLABLE HHA +1211 ; [.24A8.0020.0002] # ETHIOPIC SYLLABLE HHU +1212 ; [.24A9.0020.0002] # ETHIOPIC SYLLABLE HHI +1213 ; [.24AA.0020.0002] # ETHIOPIC SYLLABLE HHAA +1214 ; [.24AB.0020.0002] # ETHIOPIC SYLLABLE HHEE +1215 ; [.24AC.0020.0002] # ETHIOPIC SYLLABLE HHE +1216 ; [.24AD.0020.0002] # ETHIOPIC SYLLABLE HHO +1217 ; [.24AE.0020.0002] # ETHIOPIC SYLLABLE HHWA +1218 ; [.24AF.0020.0002] # ETHIOPIC SYLLABLE MA +1219 ; [.24B0.0020.0002] # ETHIOPIC SYLLABLE MU +121A ; [.24B1.0020.0002] # ETHIOPIC SYLLABLE MI +121B ; [.24B2.0020.0002] # ETHIOPIC SYLLABLE MAA +121C ; [.24B3.0020.0002] # ETHIOPIC SYLLABLE MEE +121D ; [.24B4.0020.0002] # ETHIOPIC SYLLABLE ME +121E ; [.24B5.0020.0002] # ETHIOPIC SYLLABLE MO +121F ; [.24B6.0020.0002] # ETHIOPIC SYLLABLE MWA +1380 ; [.24B7.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT MWA +1381 ; [.24B8.0020.0002] # ETHIOPIC SYLLABLE MWI +1382 ; [.24B9.0020.0002] # ETHIOPIC SYLLABLE MWEE +1383 ; [.24BA.0020.0002] # ETHIOPIC SYLLABLE MWE +2D81 ; [.24BB.0020.0002] # ETHIOPIC SYLLABLE MOA +1220 ; [.24BC.0020.0002] # ETHIOPIC SYLLABLE SZA +1221 ; [.24BD.0020.0002] # ETHIOPIC SYLLABLE SZU +1222 ; [.24BE.0020.0002] # ETHIOPIC SYLLABLE SZI +1223 ; [.24BF.0020.0002] # ETHIOPIC SYLLABLE SZAA +1224 ; [.24C0.0020.0002] # ETHIOPIC SYLLABLE SZEE +1225 ; [.24C1.0020.0002] # ETHIOPIC SYLLABLE SZE +1226 ; [.24C2.0020.0002] # ETHIOPIC SYLLABLE SZO +1227 ; [.24C3.0020.0002] # ETHIOPIC SYLLABLE SZWA +1228 ; [.24C4.0020.0002] # ETHIOPIC SYLLABLE RA +1229 ; [.24C5.0020.0002] # ETHIOPIC SYLLABLE RU +122A ; [.24C6.0020.0002] # ETHIOPIC SYLLABLE RI +122B ; [.24C7.0020.0002] # ETHIOPIC SYLLABLE RAA +122C ; [.24C8.0020.0002] # ETHIOPIC SYLLABLE REE +122D ; [.24C9.0020.0002] # ETHIOPIC SYLLABLE RE +122E ; [.24CA.0020.0002] # ETHIOPIC SYLLABLE RO +122F ; [.24CB.0020.0002] # ETHIOPIC SYLLABLE RWA +2D82 ; [.24CC.0020.0002] # ETHIOPIC SYLLABLE ROA +1230 ; [.24CD.0020.0002] # ETHIOPIC SYLLABLE SA +1231 ; [.24CE.0020.0002] # ETHIOPIC SYLLABLE SU +1232 ; [.24CF.0020.0002] # ETHIOPIC SYLLABLE SI +1233 ; [.24D0.0020.0002] # ETHIOPIC SYLLABLE SAA +1234 ; [.24D1.0020.0002] # ETHIOPIC SYLLABLE SEE +1235 ; [.24D2.0020.0002] # ETHIOPIC SYLLABLE SE +1236 ; [.24D3.0020.0002] # ETHIOPIC SYLLABLE SO +1237 ; [.24D4.0020.0002] # ETHIOPIC SYLLABLE SWA +2D83 ; [.24D5.0020.0002] # ETHIOPIC SYLLABLE SOA +AB01 ; [.24D6.0020.0002] # ETHIOPIC SYLLABLE TTHU +AB02 ; [.24D7.0020.0002] # ETHIOPIC SYLLABLE TTHI +AB03 ; [.24D8.0020.0002] # ETHIOPIC SYLLABLE TTHAA +AB04 ; [.24D9.0020.0002] # ETHIOPIC SYLLABLE TTHEE +AB05 ; [.24DA.0020.0002] # ETHIOPIC SYLLABLE TTHE +AB06 ; [.24DB.0020.0002] # ETHIOPIC SYLLABLE TTHO +1238 ; [.24DC.0020.0002] # ETHIOPIC SYLLABLE SHA +1239 ; [.24DD.0020.0002] # ETHIOPIC SYLLABLE SHU +123A ; [.24DE.0020.0002] # ETHIOPIC SYLLABLE SHI +123B ; [.24DF.0020.0002] # ETHIOPIC SYLLABLE SHAA +123C ; [.24E0.0020.0002] # ETHIOPIC SYLLABLE SHEE +123D ; [.24E1.0020.0002] # ETHIOPIC SYLLABLE SHE +123E ; [.24E2.0020.0002] # ETHIOPIC SYLLABLE SHO +123F ; [.24E3.0020.0002] # ETHIOPIC SYLLABLE SHWA +2D84 ; [.24E4.0020.0002] # ETHIOPIC SYLLABLE SHOA +1240 ; [.24E5.0020.0002] # ETHIOPIC SYLLABLE QA +1241 ; [.24E6.0020.0002] # ETHIOPIC SYLLABLE QU +1242 ; [.24E7.0020.0002] # ETHIOPIC SYLLABLE QI +1243 ; [.24E8.0020.0002] # ETHIOPIC SYLLABLE QAA +1244 ; [.24E9.0020.0002] # ETHIOPIC SYLLABLE QEE +1245 ; [.24EA.0020.0002] # ETHIOPIC SYLLABLE QE +1246 ; [.24EB.0020.0002] # ETHIOPIC SYLLABLE QO +1247 ; [.24EC.0020.0002] # ETHIOPIC SYLLABLE QOA +1248 ; [.24ED.0020.0002] # ETHIOPIC SYLLABLE QWA +124A ; [.24EE.0020.0002] # ETHIOPIC SYLLABLE QWI +124B ; [.24EF.0020.0002] # ETHIOPIC SYLLABLE QWAA +124C ; [.24F0.0020.0002] # ETHIOPIC SYLLABLE QWEE +124D ; [.24F1.0020.0002] # ETHIOPIC SYLLABLE QWE +1250 ; [.24F2.0020.0002] # ETHIOPIC SYLLABLE QHA +1251 ; [.24F3.0020.0002] # ETHIOPIC SYLLABLE QHU +1252 ; [.24F4.0020.0002] # ETHIOPIC SYLLABLE QHI +1253 ; [.24F5.0020.0002] # ETHIOPIC SYLLABLE QHAA +1254 ; [.24F6.0020.0002] # ETHIOPIC SYLLABLE QHEE +1255 ; [.24F7.0020.0002] # ETHIOPIC SYLLABLE QHE +1256 ; [.24F8.0020.0002] # ETHIOPIC SYLLABLE QHO +1258 ; [.24F9.0020.0002] # ETHIOPIC SYLLABLE QHWA +125A ; [.24FA.0020.0002] # ETHIOPIC SYLLABLE QHWI +125B ; [.24FB.0020.0002] # ETHIOPIC SYLLABLE QHWAA +125C ; [.24FC.0020.0002] # ETHIOPIC SYLLABLE QHWEE +125D ; [.24FD.0020.0002] # ETHIOPIC SYLLABLE QHWE +1260 ; [.24FE.0020.0002] # ETHIOPIC SYLLABLE BA +1261 ; [.24FF.0020.0002] # ETHIOPIC SYLLABLE BU +1262 ; [.2500.0020.0002] # ETHIOPIC SYLLABLE BI +1263 ; [.2501.0020.0002] # ETHIOPIC SYLLABLE BAA +1264 ; [.2502.0020.0002] # ETHIOPIC SYLLABLE BEE +1265 ; [.2503.0020.0002] # ETHIOPIC SYLLABLE BE +1266 ; [.2504.0020.0002] # ETHIOPIC SYLLABLE BO +1267 ; [.2505.0020.0002] # ETHIOPIC SYLLABLE BWA +1384 ; [.2506.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT BWA +1385 ; [.2507.0020.0002] # ETHIOPIC SYLLABLE BWI +1386 ; [.2508.0020.0002] # ETHIOPIC SYLLABLE BWEE +1387 ; [.2509.0020.0002] # ETHIOPIC SYLLABLE BWE +2D85 ; [.250A.0020.0002] # ETHIOPIC SYLLABLE BOA +1268 ; [.250B.0020.0002] # ETHIOPIC SYLLABLE VA +1269 ; [.250C.0020.0002] # ETHIOPIC SYLLABLE VU +126A ; [.250D.0020.0002] # ETHIOPIC SYLLABLE VI +126B ; [.250E.0020.0002] # ETHIOPIC SYLLABLE VAA +126C ; [.250F.0020.0002] # ETHIOPIC SYLLABLE VEE +126D ; [.2510.0020.0002] # ETHIOPIC SYLLABLE VE +126E ; [.2511.0020.0002] # ETHIOPIC SYLLABLE VO +126F ; [.2512.0020.0002] # ETHIOPIC SYLLABLE VWA +1270 ; [.2513.0020.0002] # ETHIOPIC SYLLABLE TA +1271 ; [.2514.0020.0002] # ETHIOPIC SYLLABLE TU +1272 ; [.2515.0020.0002] # ETHIOPIC SYLLABLE TI +1273 ; [.2516.0020.0002] # ETHIOPIC SYLLABLE TAA +1274 ; [.2517.0020.0002] # ETHIOPIC SYLLABLE TEE +1275 ; [.2518.0020.0002] # ETHIOPIC SYLLABLE TE +1276 ; [.2519.0020.0002] # ETHIOPIC SYLLABLE TO +1277 ; [.251A.0020.0002] # ETHIOPIC SYLLABLE TWA +2D86 ; [.251B.0020.0002] # ETHIOPIC SYLLABLE TOA +1278 ; [.251C.0020.0002] # ETHIOPIC SYLLABLE CA +1279 ; [.251D.0020.0002] # ETHIOPIC SYLLABLE CU +127A ; [.251E.0020.0002] # ETHIOPIC SYLLABLE CI +127B ; [.251F.0020.0002] # ETHIOPIC SYLLABLE CAA +127C ; [.2520.0020.0002] # ETHIOPIC SYLLABLE CEE +127D ; [.2521.0020.0002] # ETHIOPIC SYLLABLE CE +127E ; [.2522.0020.0002] # ETHIOPIC SYLLABLE CO +127F ; [.2523.0020.0002] # ETHIOPIC SYLLABLE CWA +2D87 ; [.2524.0020.0002] # ETHIOPIC SYLLABLE COA +1280 ; [.2525.0020.0002] # ETHIOPIC SYLLABLE XA +1281 ; [.2526.0020.0002] # ETHIOPIC SYLLABLE XU +1282 ; [.2527.0020.0002] # ETHIOPIC SYLLABLE XI +1283 ; [.2528.0020.0002] # ETHIOPIC SYLLABLE XAA +1284 ; [.2529.0020.0002] # ETHIOPIC SYLLABLE XEE +1285 ; [.252A.0020.0002] # ETHIOPIC SYLLABLE XE +1286 ; [.252B.0020.0002] # ETHIOPIC SYLLABLE XO +1287 ; [.252C.0020.0002] # ETHIOPIC SYLLABLE XOA +1288 ; [.252D.0020.0002] # ETHIOPIC SYLLABLE XWA +128A ; [.252E.0020.0002] # ETHIOPIC SYLLABLE XWI +128B ; [.252F.0020.0002] # ETHIOPIC SYLLABLE XWAA +128C ; [.2530.0020.0002] # ETHIOPIC SYLLABLE XWEE +128D ; [.2531.0020.0002] # ETHIOPIC SYLLABLE XWE +1290 ; [.2532.0020.0002] # ETHIOPIC SYLLABLE NA +1291 ; [.2533.0020.0002] # ETHIOPIC SYLLABLE NU +1292 ; [.2534.0020.0002] # ETHIOPIC SYLLABLE NI +1293 ; [.2535.0020.0002] # ETHIOPIC SYLLABLE NAA +1294 ; [.2536.0020.0002] # ETHIOPIC SYLLABLE NEE +1295 ; [.2537.0020.0002] # ETHIOPIC SYLLABLE NE +1296 ; [.2538.0020.0002] # ETHIOPIC SYLLABLE NO +1297 ; [.2539.0020.0002] # ETHIOPIC SYLLABLE NWA +2D88 ; [.253A.0020.0002] # ETHIOPIC SYLLABLE NOA +1298 ; [.253B.0020.0002] # ETHIOPIC SYLLABLE NYA +1299 ; [.253C.0020.0002] # ETHIOPIC SYLLABLE NYU +129A ; [.253D.0020.0002] # ETHIOPIC SYLLABLE NYI +129B ; [.253E.0020.0002] # ETHIOPIC SYLLABLE NYAA +129C ; [.253F.0020.0002] # ETHIOPIC SYLLABLE NYEE +129D ; [.2540.0020.0002] # ETHIOPIC SYLLABLE NYE +129E ; [.2541.0020.0002] # ETHIOPIC SYLLABLE NYO +129F ; [.2542.0020.0002] # ETHIOPIC SYLLABLE NYWA +2D89 ; [.2543.0020.0002] # ETHIOPIC SYLLABLE NYOA +12A0 ; [.2544.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL A +12A1 ; [.2545.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL U +12A2 ; [.2546.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL I +12A3 ; [.2547.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL AA +12A4 ; [.2548.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL EE +12A5 ; [.2549.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL E +12A6 ; [.254A.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL O +12A7 ; [.254B.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL WA +2D8A ; [.254C.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL OA +12A8 ; [.254D.0020.0002] # ETHIOPIC SYLLABLE KA +12A9 ; [.254E.0020.0002] # ETHIOPIC SYLLABLE KU +12AA ; [.254F.0020.0002] # ETHIOPIC SYLLABLE KI +12AB ; [.2550.0020.0002] # ETHIOPIC SYLLABLE KAA +12AC ; [.2551.0020.0002] # ETHIOPIC SYLLABLE KEE +12AD ; [.2552.0020.0002] # ETHIOPIC SYLLABLE KE +12AE ; [.2553.0020.0002] # ETHIOPIC SYLLABLE KO +12AF ; [.2554.0020.0002] # ETHIOPIC SYLLABLE KOA +12B0 ; [.2555.0020.0002] # ETHIOPIC SYLLABLE KWA +12B2 ; [.2556.0020.0002] # ETHIOPIC SYLLABLE KWI +12B3 ; [.2557.0020.0002] # ETHIOPIC SYLLABLE KWAA +12B4 ; [.2558.0020.0002] # ETHIOPIC SYLLABLE KWEE +12B5 ; [.2559.0020.0002] # ETHIOPIC SYLLABLE KWE +12B8 ; [.255A.0020.0002] # ETHIOPIC SYLLABLE KXA +12B9 ; [.255B.0020.0002] # ETHIOPIC SYLLABLE KXU +12BA ; [.255C.0020.0002] # ETHIOPIC SYLLABLE KXI +12BB ; [.255D.0020.0002] # ETHIOPIC SYLLABLE KXAA +12BC ; [.255E.0020.0002] # ETHIOPIC SYLLABLE KXEE +12BD ; [.255F.0020.0002] # ETHIOPIC SYLLABLE KXE +12BE ; [.2560.0020.0002] # ETHIOPIC SYLLABLE KXO +12C0 ; [.2561.0020.0002] # ETHIOPIC SYLLABLE KXWA +12C2 ; [.2562.0020.0002] # ETHIOPIC SYLLABLE KXWI +12C3 ; [.2563.0020.0002] # ETHIOPIC SYLLABLE KXWAA +12C4 ; [.2564.0020.0002] # ETHIOPIC SYLLABLE KXWEE +12C5 ; [.2565.0020.0002] # ETHIOPIC SYLLABLE KXWE +12C8 ; [.2566.0020.0002] # ETHIOPIC SYLLABLE WA +12C9 ; [.2567.0020.0002] # ETHIOPIC SYLLABLE WU +12CA ; [.2568.0020.0002] # ETHIOPIC SYLLABLE WI +12CB ; [.2569.0020.0002] # ETHIOPIC SYLLABLE WAA +12CC ; [.256A.0020.0002] # ETHIOPIC SYLLABLE WEE +12CD ; [.256B.0020.0002] # ETHIOPIC SYLLABLE WE +12CE ; [.256C.0020.0002] # ETHIOPIC SYLLABLE WO +12CF ; [.256D.0020.0002] # ETHIOPIC SYLLABLE WOA +12D0 ; [.256E.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL A +12D1 ; [.256F.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL U +12D2 ; [.2570.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL I +12D3 ; [.2571.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL AA +12D4 ; [.2572.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL EE +12D5 ; [.2573.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL E +12D6 ; [.2574.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL O +12D8 ; [.2575.0020.0002] # ETHIOPIC SYLLABLE ZA +12D9 ; [.2576.0020.0002] # ETHIOPIC SYLLABLE ZU +12DA ; [.2577.0020.0002] # ETHIOPIC SYLLABLE ZI +12DB ; [.2578.0020.0002] # ETHIOPIC SYLLABLE ZAA +12DC ; [.2579.0020.0002] # ETHIOPIC SYLLABLE ZEE +12DD ; [.257A.0020.0002] # ETHIOPIC SYLLABLE ZE +12DE ; [.257B.0020.0002] # ETHIOPIC SYLLABLE ZO +12DF ; [.257C.0020.0002] # ETHIOPIC SYLLABLE ZWA +2D8B ; [.257D.0020.0002] # ETHIOPIC SYLLABLE ZOA +AB11 ; [.257E.0020.0002] # ETHIOPIC SYLLABLE DZU +AB12 ; [.257F.0020.0002] # ETHIOPIC SYLLABLE DZI +AB13 ; [.2580.0020.0002] # ETHIOPIC SYLLABLE DZAA +AB14 ; [.2581.0020.0002] # ETHIOPIC SYLLABLE DZEE +AB15 ; [.2582.0020.0002] # ETHIOPIC SYLLABLE DZE +AB16 ; [.2583.0020.0002] # ETHIOPIC SYLLABLE DZO +12E0 ; [.2584.0020.0002] # ETHIOPIC SYLLABLE ZHA +12E1 ; [.2585.0020.0002] # ETHIOPIC SYLLABLE ZHU +12E2 ; [.2586.0020.0002] # ETHIOPIC SYLLABLE ZHI +12E3 ; [.2587.0020.0002] # ETHIOPIC SYLLABLE ZHAA +12E4 ; [.2588.0020.0002] # ETHIOPIC SYLLABLE ZHEE +12E5 ; [.2589.0020.0002] # ETHIOPIC SYLLABLE ZHE +12E6 ; [.258A.0020.0002] # ETHIOPIC SYLLABLE ZHO +12E7 ; [.258B.0020.0002] # ETHIOPIC SYLLABLE ZHWA +12E8 ; [.258C.0020.0002] # ETHIOPIC SYLLABLE YA +12E9 ; [.258D.0020.0002] # ETHIOPIC SYLLABLE YU +12EA ; [.258E.0020.0002] # ETHIOPIC SYLLABLE YI +12EB ; [.258F.0020.0002] # ETHIOPIC SYLLABLE YAA +12EC ; [.2590.0020.0002] # ETHIOPIC SYLLABLE YEE +12ED ; [.2591.0020.0002] # ETHIOPIC SYLLABLE YE +12EE ; [.2592.0020.0002] # ETHIOPIC SYLLABLE YO +12EF ; [.2593.0020.0002] # ETHIOPIC SYLLABLE YOA +12F0 ; [.2594.0020.0002] # ETHIOPIC SYLLABLE DA +12F1 ; [.2595.0020.0002] # ETHIOPIC SYLLABLE DU +12F2 ; [.2596.0020.0002] # ETHIOPIC SYLLABLE DI +12F3 ; [.2597.0020.0002] # ETHIOPIC SYLLABLE DAA +12F4 ; [.2598.0020.0002] # ETHIOPIC SYLLABLE DEE +12F5 ; [.2599.0020.0002] # ETHIOPIC SYLLABLE DE +12F6 ; [.259A.0020.0002] # ETHIOPIC SYLLABLE DO +12F7 ; [.259B.0020.0002] # ETHIOPIC SYLLABLE DWA +2D8C ; [.259C.0020.0002] # ETHIOPIC SYLLABLE DOA +AB09 ; [.259D.0020.0002] # ETHIOPIC SYLLABLE DDHU +AB0A ; [.259E.0020.0002] # ETHIOPIC SYLLABLE DDHI +AB0B ; [.259F.0020.0002] # ETHIOPIC SYLLABLE DDHAA +AB0C ; [.25A0.0020.0002] # ETHIOPIC SYLLABLE DDHEE +AB0D ; [.25A1.0020.0002] # ETHIOPIC SYLLABLE DDHE +AB0E ; [.25A2.0020.0002] # ETHIOPIC SYLLABLE DDHO +12F8 ; [.25A3.0020.0002] # ETHIOPIC SYLLABLE DDA +12F9 ; [.25A4.0020.0002] # ETHIOPIC SYLLABLE DDU +12FA ; [.25A5.0020.0002] # ETHIOPIC SYLLABLE DDI +12FB ; [.25A6.0020.0002] # ETHIOPIC SYLLABLE DDAA +12FC ; [.25A7.0020.0002] # ETHIOPIC SYLLABLE DDEE +12FD ; [.25A8.0020.0002] # ETHIOPIC SYLLABLE DDE +12FE ; [.25A9.0020.0002] # ETHIOPIC SYLLABLE DDO +12FF ; [.25AA.0020.0002] # ETHIOPIC SYLLABLE DDWA +2D8D ; [.25AB.0020.0002] # ETHIOPIC SYLLABLE DDOA +1300 ; [.25AC.0020.0002] # ETHIOPIC SYLLABLE JA +1301 ; [.25AD.0020.0002] # ETHIOPIC SYLLABLE JU +1302 ; [.25AE.0020.0002] # ETHIOPIC SYLLABLE JI +1303 ; [.25AF.0020.0002] # ETHIOPIC SYLLABLE JAA +1304 ; [.25B0.0020.0002] # ETHIOPIC SYLLABLE JEE +1305 ; [.25B1.0020.0002] # ETHIOPIC SYLLABLE JE +1306 ; [.25B2.0020.0002] # ETHIOPIC SYLLABLE JO +1307 ; [.25B3.0020.0002] # ETHIOPIC SYLLABLE JWA +2D8E ; [.25B4.0020.0002] # ETHIOPIC SYLLABLE JOA +1308 ; [.25B5.0020.0002] # ETHIOPIC SYLLABLE GA +1309 ; [.25B6.0020.0002] # ETHIOPIC SYLLABLE GU +130A ; [.25B7.0020.0002] # ETHIOPIC SYLLABLE GI +130B ; [.25B8.0020.0002] # ETHIOPIC SYLLABLE GAA +130C ; [.25B9.0020.0002] # ETHIOPIC SYLLABLE GEE +130D ; [.25BA.0020.0002] # ETHIOPIC SYLLABLE GE +130E ; [.25BB.0020.0002] # ETHIOPIC SYLLABLE GO +130F ; [.25BC.0020.0002] # ETHIOPIC SYLLABLE GOA +1310 ; [.25BD.0020.0002] # ETHIOPIC SYLLABLE GWA +1312 ; [.25BE.0020.0002] # ETHIOPIC SYLLABLE GWI +1313 ; [.25BF.0020.0002] # ETHIOPIC SYLLABLE GWAA +1314 ; [.25C0.0020.0002] # ETHIOPIC SYLLABLE GWEE +1315 ; [.25C1.0020.0002] # ETHIOPIC SYLLABLE GWE +1318 ; [.25C2.0020.0002] # ETHIOPIC SYLLABLE GGA +1319 ; [.25C3.0020.0002] # ETHIOPIC SYLLABLE GGU +131A ; [.25C4.0020.0002] # ETHIOPIC SYLLABLE GGI +131B ; [.25C5.0020.0002] # ETHIOPIC SYLLABLE GGAA +131C ; [.25C6.0020.0002] # ETHIOPIC SYLLABLE GGEE +131D ; [.25C7.0020.0002] # ETHIOPIC SYLLABLE GGE +131E ; [.25C8.0020.0002] # ETHIOPIC SYLLABLE GGO +131F ; [.25C9.0020.0002] # ETHIOPIC SYLLABLE GGWAA +2D93 ; [.25CA.0020.0002] # ETHIOPIC SYLLABLE GGWA +2D94 ; [.25CB.0020.0002] # ETHIOPIC SYLLABLE GGWI +2D95 ; [.25CC.0020.0002] # ETHIOPIC SYLLABLE GGWEE +2D96 ; [.25CD.0020.0002] # ETHIOPIC SYLLABLE GGWE +1320 ; [.25CE.0020.0002] # ETHIOPIC SYLLABLE THA +1321 ; [.25CF.0020.0002] # ETHIOPIC SYLLABLE THU +1322 ; [.25D0.0020.0002] # ETHIOPIC SYLLABLE THI +1323 ; [.25D1.0020.0002] # ETHIOPIC SYLLABLE THAA +1324 ; [.25D2.0020.0002] # ETHIOPIC SYLLABLE THEE +1325 ; [.25D3.0020.0002] # ETHIOPIC SYLLABLE THE +1326 ; [.25D4.0020.0002] # ETHIOPIC SYLLABLE THO +1327 ; [.25D5.0020.0002] # ETHIOPIC SYLLABLE THWA +2D8F ; [.25D6.0020.0002] # ETHIOPIC SYLLABLE THOA +1328 ; [.25D7.0020.0002] # ETHIOPIC SYLLABLE CHA +1329 ; [.25D8.0020.0002] # ETHIOPIC SYLLABLE CHU +132A ; [.25D9.0020.0002] # ETHIOPIC SYLLABLE CHI +132B ; [.25DA.0020.0002] # ETHIOPIC SYLLABLE CHAA +132C ; [.25DB.0020.0002] # ETHIOPIC SYLLABLE CHEE +132D ; [.25DC.0020.0002] # ETHIOPIC SYLLABLE CHE +132E ; [.25DD.0020.0002] # ETHIOPIC SYLLABLE CHO +132F ; [.25DE.0020.0002] # ETHIOPIC SYLLABLE CHWA +2D90 ; [.25DF.0020.0002] # ETHIOPIC SYLLABLE CHOA +AB20 ; [.25E0.0020.0002] # ETHIOPIC SYLLABLE CCHHA +AB21 ; [.25E1.0020.0002] # ETHIOPIC SYLLABLE CCHHU +AB22 ; [.25E2.0020.0002] # ETHIOPIC SYLLABLE CCHHI +AB23 ; [.25E3.0020.0002] # ETHIOPIC SYLLABLE CCHHAA +AB24 ; [.25E4.0020.0002] # ETHIOPIC SYLLABLE CCHHEE +AB25 ; [.25E5.0020.0002] # ETHIOPIC SYLLABLE CCHHE +AB26 ; [.25E6.0020.0002] # ETHIOPIC SYLLABLE CCHHO +1330 ; [.25E7.0020.0002] # ETHIOPIC SYLLABLE PHA +1331 ; [.25E8.0020.0002] # ETHIOPIC SYLLABLE PHU +1332 ; [.25E9.0020.0002] # ETHIOPIC SYLLABLE PHI +1333 ; [.25EA.0020.0002] # ETHIOPIC SYLLABLE PHAA +1334 ; [.25EB.0020.0002] # ETHIOPIC SYLLABLE PHEE +1335 ; [.25EC.0020.0002] # ETHIOPIC SYLLABLE PHE +1336 ; [.25ED.0020.0002] # ETHIOPIC SYLLABLE PHO +1337 ; [.25EE.0020.0002] # ETHIOPIC SYLLABLE PHWA +2D91 ; [.25EF.0020.0002] # ETHIOPIC SYLLABLE PHOA +1338 ; [.25F0.0020.0002] # ETHIOPIC SYLLABLE TSA +1339 ; [.25F1.0020.0002] # ETHIOPIC SYLLABLE TSU +133A ; [.25F2.0020.0002] # ETHIOPIC SYLLABLE TSI +133B ; [.25F3.0020.0002] # ETHIOPIC SYLLABLE TSAA +133C ; [.25F4.0020.0002] # ETHIOPIC SYLLABLE TSEE +133D ; [.25F5.0020.0002] # ETHIOPIC SYLLABLE TSE +133E ; [.25F6.0020.0002] # ETHIOPIC SYLLABLE TSO +133F ; [.25F7.0020.0002] # ETHIOPIC SYLLABLE TSWA +AB28 ; [.25F8.0020.0002] # ETHIOPIC SYLLABLE BBA +AB29 ; [.25F9.0020.0002] # ETHIOPIC SYLLABLE BBU +AB2A ; [.25FA.0020.0002] # ETHIOPIC SYLLABLE BBI +AB2B ; [.25FB.0020.0002] # ETHIOPIC SYLLABLE BBAA +AB2C ; [.25FC.0020.0002] # ETHIOPIC SYLLABLE BBEE +AB2D ; [.25FD.0020.0002] # ETHIOPIC SYLLABLE BBE +AB2E ; [.25FE.0020.0002] # ETHIOPIC SYLLABLE BBO +1340 ; [.25FF.0020.0002] # ETHIOPIC SYLLABLE TZA +1341 ; [.2600.0020.0002] # ETHIOPIC SYLLABLE TZU +1342 ; [.2601.0020.0002] # ETHIOPIC SYLLABLE TZI +1343 ; [.2602.0020.0002] # ETHIOPIC SYLLABLE TZAA +1344 ; [.2603.0020.0002] # ETHIOPIC SYLLABLE TZEE +1345 ; [.2604.0020.0002] # ETHIOPIC SYLLABLE TZE +1346 ; [.2605.0020.0002] # ETHIOPIC SYLLABLE TZO +1347 ; [.2606.0020.0002] # ETHIOPIC SYLLABLE TZOA +1348 ; [.2607.0020.0002] # ETHIOPIC SYLLABLE FA +1349 ; [.2608.0020.0002] # ETHIOPIC SYLLABLE FU +134A ; [.2609.0020.0002] # ETHIOPIC SYLLABLE FI +134B ; [.260A.0020.0002] # ETHIOPIC SYLLABLE FAA +134C ; [.260B.0020.0002] # ETHIOPIC SYLLABLE FEE +134D ; [.260C.0020.0002] # ETHIOPIC SYLLABLE FE +134E ; [.260D.0020.0002] # ETHIOPIC SYLLABLE FO +134F ; [.260E.0020.0002] # ETHIOPIC SYLLABLE FWA +1388 ; [.260F.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT FWA +1389 ; [.2610.0020.0002] # ETHIOPIC SYLLABLE FWI +138A ; [.2611.0020.0002] # ETHIOPIC SYLLABLE FWEE +138B ; [.2612.0020.0002] # ETHIOPIC SYLLABLE FWE +1350 ; [.2613.0020.0002] # ETHIOPIC SYLLABLE PA +1351 ; [.2614.0020.0002] # ETHIOPIC SYLLABLE PU +1352 ; [.2615.0020.0002] # ETHIOPIC SYLLABLE PI +1353 ; [.2616.0020.0002] # ETHIOPIC SYLLABLE PAA +1354 ; [.2617.0020.0002] # ETHIOPIC SYLLABLE PEE +1355 ; [.2618.0020.0002] # ETHIOPIC SYLLABLE PE +1356 ; [.2619.0020.0002] # ETHIOPIC SYLLABLE PO +1357 ; [.261A.0020.0002] # ETHIOPIC SYLLABLE PWA +138C ; [.261B.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT PWA +138D ; [.261C.0020.0002] # ETHIOPIC SYLLABLE PWI +138E ; [.261D.0020.0002] # ETHIOPIC SYLLABLE PWEE +138F ; [.261E.0020.0002] # ETHIOPIC SYLLABLE PWE +2D92 ; [.261F.0020.0002] # ETHIOPIC SYLLABLE POA +1358 ; [.2620.0020.0002] # ETHIOPIC SYLLABLE RYA +1359 ; [.2621.0020.0002] # ETHIOPIC SYLLABLE MYA +135A ; [.2622.0020.0002] # ETHIOPIC SYLLABLE FYA +2DA0 ; [.2623.0020.0002] # ETHIOPIC SYLLABLE SSA +2DA1 ; [.2624.0020.0002] # ETHIOPIC SYLLABLE SSU +2DA2 ; [.2625.0020.0002] # ETHIOPIC SYLLABLE SSI +2DA3 ; [.2626.0020.0002] # ETHIOPIC SYLLABLE SSAA +2DA4 ; [.2627.0020.0002] # ETHIOPIC SYLLABLE SSEE +2DA5 ; [.2628.0020.0002] # ETHIOPIC SYLLABLE SSE +2DA6 ; [.2629.0020.0002] # ETHIOPIC SYLLABLE SSO +2DA8 ; [.262A.0020.0002] # ETHIOPIC SYLLABLE CCA +2DA9 ; [.262B.0020.0002] # ETHIOPIC SYLLABLE CCU +2DAA ; [.262C.0020.0002] # ETHIOPIC SYLLABLE CCI +2DAB ; [.262D.0020.0002] # ETHIOPIC SYLLABLE CCAA +2DAC ; [.262E.0020.0002] # ETHIOPIC SYLLABLE CCEE +2DAD ; [.262F.0020.0002] # ETHIOPIC SYLLABLE CCE +2DAE ; [.2630.0020.0002] # ETHIOPIC SYLLABLE CCO +2DB0 ; [.2631.0020.0002] # ETHIOPIC SYLLABLE ZZA +2DB1 ; [.2632.0020.0002] # ETHIOPIC SYLLABLE ZZU +2DB2 ; [.2633.0020.0002] # ETHIOPIC SYLLABLE ZZI +2DB3 ; [.2634.0020.0002] # ETHIOPIC SYLLABLE ZZAA +2DB4 ; [.2635.0020.0002] # ETHIOPIC SYLLABLE ZZEE +2DB5 ; [.2636.0020.0002] # ETHIOPIC SYLLABLE ZZE +2DB6 ; [.2637.0020.0002] # ETHIOPIC SYLLABLE ZZO +2DB8 ; [.2638.0020.0002] # ETHIOPIC SYLLABLE CCHA +2DB9 ; [.2639.0020.0002] # ETHIOPIC SYLLABLE CCHU +2DBA ; [.263A.0020.0002] # ETHIOPIC SYLLABLE CCHI +2DBB ; [.263B.0020.0002] # ETHIOPIC SYLLABLE CCHAA +2DBC ; [.263C.0020.0002] # ETHIOPIC SYLLABLE CCHEE +2DBD ; [.263D.0020.0002] # ETHIOPIC SYLLABLE CCHE +2DBE ; [.263E.0020.0002] # ETHIOPIC SYLLABLE CCHO +2DC0 ; [.263F.0020.0002] # ETHIOPIC SYLLABLE QYA +2DC1 ; [.2640.0020.0002] # ETHIOPIC SYLLABLE QYU +2DC2 ; [.2641.0020.0002] # ETHIOPIC SYLLABLE QYI +2DC3 ; [.2642.0020.0002] # ETHIOPIC SYLLABLE QYAA +2DC4 ; [.2643.0020.0002] # ETHIOPIC SYLLABLE QYEE +2DC5 ; [.2644.0020.0002] # ETHIOPIC SYLLABLE QYE +2DC6 ; [.2645.0020.0002] # ETHIOPIC SYLLABLE QYO +2DC8 ; [.2646.0020.0002] # ETHIOPIC SYLLABLE KYA +2DC9 ; [.2647.0020.0002] # ETHIOPIC SYLLABLE KYU +2DCA ; [.2648.0020.0002] # ETHIOPIC SYLLABLE KYI +2DCB ; [.2649.0020.0002] # ETHIOPIC SYLLABLE KYAA +2DCC ; [.264A.0020.0002] # ETHIOPIC SYLLABLE KYEE +2DCD ; [.264B.0020.0002] # ETHIOPIC SYLLABLE KYE +2DCE ; [.264C.0020.0002] # ETHIOPIC SYLLABLE KYO +2DD0 ; [.264D.0020.0002] # ETHIOPIC SYLLABLE XYA +2DD1 ; [.264E.0020.0002] # ETHIOPIC SYLLABLE XYU +2DD2 ; [.264F.0020.0002] # ETHIOPIC SYLLABLE XYI +2DD3 ; [.2650.0020.0002] # ETHIOPIC SYLLABLE XYAA +2DD4 ; [.2651.0020.0002] # ETHIOPIC SYLLABLE XYEE +2DD5 ; [.2652.0020.0002] # ETHIOPIC SYLLABLE XYE +2DD6 ; [.2653.0020.0002] # ETHIOPIC SYLLABLE XYO +2DD8 ; [.2654.0020.0002] # ETHIOPIC SYLLABLE GYA +2DD9 ; [.2655.0020.0002] # ETHIOPIC SYLLABLE GYU +2DDA ; [.2656.0020.0002] # ETHIOPIC SYLLABLE GYI +2DDB ; [.2657.0020.0002] # ETHIOPIC SYLLABLE GYAA +2DDC ; [.2658.0020.0002] # ETHIOPIC SYLLABLE GYEE +2DDD ; [.2659.0020.0002] # ETHIOPIC SYLLABLE GYE +2DDE ; [.265A.0020.0002] # ETHIOPIC SYLLABLE GYO +0950 ; [.265B.0020.0002] # DEVANAGARI OM +A8FD ; [.265C.0020.0002] # DEVANAGARI JAIN OM +0972 ; [.265D.0020.0002] # DEVANAGARI LETTER CANDRA A +0904 ; [.265E.0020.0002] # DEVANAGARI LETTER SHORT A +0905 ; [.265F.0020.0002] # DEVANAGARI LETTER A +0906 ; [.2660.0020.0002] # DEVANAGARI LETTER AA +0973 ; [.2661.0020.0002] # DEVANAGARI LETTER OE +0974 ; [.2662.0020.0002] # DEVANAGARI LETTER OOE +0975 ; [.2663.0020.0002] # DEVANAGARI LETTER AW +0976 ; [.2664.0020.0002] # DEVANAGARI LETTER UE +0977 ; [.2665.0020.0002] # DEVANAGARI LETTER UUE +0907 ; [.2666.0020.0002] # DEVANAGARI LETTER I +0908 ; [.2667.0020.0002] # DEVANAGARI LETTER II +0909 ; [.2668.0020.0002] # DEVANAGARI LETTER U +090A ; [.2669.0020.0002] # DEVANAGARI LETTER UU +090B ; [.266A.0020.0002] # DEVANAGARI LETTER VOCALIC R +0960 ; [.266B.0020.0002] # DEVANAGARI LETTER VOCALIC RR +090C ; [.266C.0020.0002] # DEVANAGARI LETTER VOCALIC L +0961 ; [.266D.0020.0002] # DEVANAGARI LETTER VOCALIC LL +090D ; [.266E.0020.0002] # DEVANAGARI LETTER CANDRA E +090E ; [.266F.0020.0002] # DEVANAGARI LETTER SHORT E +090F ; [.2670.0020.0002] # DEVANAGARI LETTER E +0910 ; [.2671.0020.0002] # DEVANAGARI LETTER AI +0911 ; [.2672.0020.0002] # DEVANAGARI LETTER CANDRA O +0912 ; [.2673.0020.0002] # DEVANAGARI LETTER SHORT O +0913 ; [.2674.0020.0002] # DEVANAGARI LETTER O +0914 ; [.2675.0020.0002] # DEVANAGARI LETTER AU +0915 ; [.2676.0020.0002] # DEVANAGARI LETTER KA +0958 ; [.2676.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER QA +0916 ; [.2677.0020.0002] # DEVANAGARI LETTER KHA +0959 ; [.2677.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER KHHA +0917 ; [.2678.0020.0002] # DEVANAGARI LETTER GA +095A ; [.2678.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER GHHA +097B ; [.2679.0020.0002] # DEVANAGARI LETTER GGA +0918 ; [.267A.0020.0002] # DEVANAGARI LETTER GHA +0919 ; [.267B.0020.0002] # DEVANAGARI LETTER NGA +091A ; [.267C.0020.0002] # DEVANAGARI LETTER CA +091B ; [.267D.0020.0002] # DEVANAGARI LETTER CHA +091C ; [.267E.0020.0002] # DEVANAGARI LETTER JA +095B ; [.267E.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER ZA +0979 ; [.267F.0020.0002] # DEVANAGARI LETTER ZHA +097C ; [.2680.0020.0002] # DEVANAGARI LETTER JJA +091D ; [.2681.0020.0002] # DEVANAGARI LETTER JHA +091E ; [.2682.0020.0002] # DEVANAGARI LETTER NYA +091F ; [.2683.0020.0002] # DEVANAGARI LETTER TTA +0920 ; [.2684.0020.0002] # DEVANAGARI LETTER TTHA +0978 ; [.2685.0020.0002] # DEVANAGARI LETTER MARWARI DDA +0921 ; [.2686.0020.0002] # DEVANAGARI LETTER DDA +095C ; [.2686.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER DDDHA +097E ; [.2687.0020.0002] # DEVANAGARI LETTER DDDA +0922 ; [.2688.0020.0002] # DEVANAGARI LETTER DDHA +095D ; [.2688.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER RHA +0923 ; [.2689.0020.0002] # DEVANAGARI LETTER NNA +0924 ; [.268A.0020.0002] # DEVANAGARI LETTER TA +0925 ; [.268B.0020.0002] # DEVANAGARI LETTER THA +0926 ; [.268C.0020.0002] # DEVANAGARI LETTER DA +0927 ; [.268D.0020.0002] # DEVANAGARI LETTER DHA +0928 ; [.268E.0020.0002] # DEVANAGARI LETTER NA +0929 ; [.268E.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER NNNA +092A ; [.268F.0020.0002] # DEVANAGARI LETTER PA +092B ; [.2690.0020.0002] # DEVANAGARI LETTER PHA +095E ; [.2690.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER FA +092C ; [.2691.0020.0002] # DEVANAGARI LETTER BA +097F ; [.2692.0020.0002] # DEVANAGARI LETTER BBA +092D ; [.2693.0020.0002] # DEVANAGARI LETTER BHA +092E ; [.2694.0020.0002] # DEVANAGARI LETTER MA +092F ; [.2695.0020.0002] # DEVANAGARI LETTER YA +095F ; [.2695.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER YYA +097A ; [.2696.0020.0002] # DEVANAGARI LETTER HEAVY YA +0930 ; [.2697.0020.0002] # DEVANAGARI LETTER RA +0931 ; [.2697.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER RRA +0932 ; [.2698.0020.0002] # DEVANAGARI LETTER LA +0933 ; [.2699.0020.0002] # DEVANAGARI LETTER LLA +0934 ; [.2699.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER LLLA +0935 ; [.269A.0020.0002] # DEVANAGARI LETTER VA +0936 ; [.269B.0020.0002] # DEVANAGARI LETTER SHA +0937 ; [.269C.0020.0002] # DEVANAGARI LETTER SSA +0938 ; [.269D.0020.0002] # DEVANAGARI LETTER SA +0939 ; [.269E.0020.0002] # DEVANAGARI LETTER HA +093D ; [.269F.0020.0002] # DEVANAGARI SIGN AVAGRAHA +097D ; [.26A0.0020.0002] # DEVANAGARI LETTER GLOTTAL STOP +1CE9 ; [.26A1.0020.0002] # VEDIC SIGN ANUSVARA ANTARGOMUKHA +1CEA ; [.26A1.0020.0004] # VEDIC SIGN ANUSVARA BAHIRGOMUKHA +1CEB ; [.26A1.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA +1CEC ; [.26A1.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE ; [.26A1.0020.0004] # VEDIC SIGN HEXIFORM LONG ANUSVARA +1CEF ; [.26A1.0020.0004] # VEDIC SIGN LONG ANUSVARA +1CF0 ; [.26A1.0020.0004] # VEDIC SIGN RTHANG LONG ANUSVARA +1CF1 ; [.26A1.0020.0004] # VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF5 ; [.26A2.0020.0002] # VEDIC SIGN JIHVAMULIYA +1CF6 ; [.26A3.0020.0002] # VEDIC SIGN UPADHMANIYA +A8F2 ; [.26A4.0020.0002] # DEVANAGARI SIGN SPACING CANDRABINDU +A8F3 ; [.26A4.0020.0004] # DEVANAGARI SIGN CANDRABINDU VIRAMA +A8F4 ; [.26A4.0020.0004] # DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA +A8F5 ; [.26A4.0020.0004] # DEVANAGARI SIGN CANDRABINDU TWO +A8F6 ; [.26A4.0020.0004] # DEVANAGARI SIGN CANDRABINDU THREE +A8F7 ; [.26A4.0020.0004] # DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8FB ; [.26A5.0020.0002] # DEVANAGARI HEADSTROKE +093E ; [.26A6.0020.0002] # DEVANAGARI VOWEL SIGN AA +093A ; [.26A7.0020.0002] # DEVANAGARI VOWEL SIGN OE +093B ; [.26A8.0020.0002] # DEVANAGARI VOWEL SIGN OOE +094F ; [.26A9.0020.0002] # DEVANAGARI VOWEL SIGN AW +0956 ; [.26AA.0020.0002] # DEVANAGARI VOWEL SIGN UE +0957 ; [.26AB.0020.0002] # DEVANAGARI VOWEL SIGN UUE +093F ; [.26AC.0020.0002] # DEVANAGARI VOWEL SIGN I +0940 ; [.26AD.0020.0002] # DEVANAGARI VOWEL SIGN II +0941 ; [.26AE.0020.0002] # DEVANAGARI VOWEL SIGN U +0942 ; [.26AF.0020.0002] # DEVANAGARI VOWEL SIGN UU +0943 ; [.26B0.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC R +0944 ; [.26B1.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC RR +0962 ; [.26B2.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC L +0963 ; [.26B3.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC LL +0945 ; [.26B4.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA E +0955 ; [.26B5.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA LONG E +0946 ; [.26B6.0020.0002] # DEVANAGARI VOWEL SIGN SHORT E +0947 ; [.26B7.0020.0002] # DEVANAGARI VOWEL SIGN E +094E ; [.26B8.0020.0002] # DEVANAGARI VOWEL SIGN PRISHTHAMATRA E +0948 ; [.26B9.0020.0002] # DEVANAGARI VOWEL SIGN AI +0949 ; [.26BA.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA O +094A ; [.26BB.0020.0002] # DEVANAGARI VOWEL SIGN SHORT O +094B ; [.26BC.0020.0002] # DEVANAGARI VOWEL SIGN O +094C ; [.26BD.0020.0002] # DEVANAGARI VOWEL SIGN AU +094D ; [.26BE.0020.0002] # DEVANAGARI SIGN VIRAMA +0980 ; [.26BF.0020.0002] # BENGALI ANJI +0985 ; [.26C0.0020.0002] # BENGALI LETTER A +0986 ; [.26C1.0020.0002] # BENGALI LETTER AA +0987 ; [.26C2.0020.0002] # BENGALI LETTER I +0988 ; [.26C3.0020.0002] # BENGALI LETTER II +0989 ; [.26C4.0020.0002] # BENGALI LETTER U +098A ; [.26C5.0020.0002] # BENGALI LETTER UU +098B ; [.26C6.0020.0002] # BENGALI LETTER VOCALIC R +09E0 ; [.26C7.0020.0002] # BENGALI LETTER VOCALIC RR +098C ; [.26C8.0020.0002] # BENGALI LETTER VOCALIC L +09E1 ; [.26C9.0020.0002] # BENGALI LETTER VOCALIC LL +098F ; [.26CA.0020.0002] # BENGALI LETTER E +0990 ; [.26CB.0020.0002] # BENGALI LETTER AI +0993 ; [.26CC.0020.0002] # BENGALI LETTER O +0994 ; [.26CD.0020.0002] # BENGALI LETTER AU +0995 ; [.26CE.0020.0002] # BENGALI LETTER KA +0996 ; [.26CF.0020.0002] # BENGALI LETTER KHA +0997 ; [.26D0.0020.0002] # BENGALI LETTER GA +0998 ; [.26D1.0020.0002] # BENGALI LETTER GHA +0999 ; [.26D2.0020.0002] # BENGALI LETTER NGA +099A ; [.26D3.0020.0002] # BENGALI LETTER CA +099B ; [.26D4.0020.0002] # BENGALI LETTER CHA +099C ; [.26D5.0020.0002] # BENGALI LETTER JA +099D ; [.26D6.0020.0002] # BENGALI LETTER JHA +099E ; [.26D7.0020.0002] # BENGALI LETTER NYA +099F ; [.26D8.0020.0002] # BENGALI LETTER TTA +09A0 ; [.26D9.0020.0002] # BENGALI LETTER TTHA +09A1 ; [.26DA.0020.0002] # BENGALI LETTER DDA +09DC ; [.26DA.0020.0002][.0000.00C2.0002] # BENGALI LETTER RRA +09A2 ; [.26DB.0020.0002] # BENGALI LETTER DDHA +09DD ; [.26DB.0020.0002][.0000.00C2.0002] # BENGALI LETTER RHA +09A3 ; [.26DC.0020.0002] # BENGALI LETTER NNA +09A4 ; [.26DD.0020.0002] # BENGALI LETTER TA +09CE ; [.26DD.0020.0004][.26FE.0020.0004] # BENGALI LETTER KHANDA TA +09A5 ; [.26DE.0020.0002] # BENGALI LETTER THA +09A6 ; [.26DF.0020.0002] # BENGALI LETTER DA +09A7 ; [.26E0.0020.0002] # BENGALI LETTER DHA +09A8 ; [.26E1.0020.0002] # BENGALI LETTER NA +09AA ; [.26E2.0020.0002] # BENGALI LETTER PA +09AB ; [.26E3.0020.0002] # BENGALI LETTER PHA +09AC ; [.26E4.0020.0002] # BENGALI LETTER BA +09AD ; [.26E5.0020.0002] # BENGALI LETTER BHA +09AE ; [.26E6.0020.0002] # BENGALI LETTER MA +09AF ; [.26E7.0020.0002] # BENGALI LETTER YA +09DF ; [.26E7.0020.0002][.0000.00C2.0002] # BENGALI LETTER YYA +09B0 ; [.26E8.0020.0002] # BENGALI LETTER RA +09F0 ; [.26E9.0020.0002] # BENGALI LETTER RA WITH MIDDLE DIAGONAL +09B2 ; [.26EA.0020.0002] # BENGALI LETTER LA +09F1 ; [.26EB.0020.0002] # BENGALI LETTER RA WITH LOWER DIAGONAL +09B6 ; [.26EC.0020.0002] # BENGALI LETTER SHA +09B7 ; [.26ED.0020.0002] # BENGALI LETTER SSA +09B8 ; [.26EE.0020.0002] # BENGALI LETTER SA +09B9 ; [.26EF.0020.0002] # BENGALI LETTER HA +09BD ; [.26F0.0020.0002] # BENGALI SIGN AVAGRAHA +09BE ; [.26F1.0020.0002] # BENGALI VOWEL SIGN AA +09BF ; [.26F2.0020.0002] # BENGALI VOWEL SIGN I +09C0 ; [.26F3.0020.0002] # BENGALI VOWEL SIGN II +09C1 ; [.26F4.0020.0002] # BENGALI VOWEL SIGN U +09C2 ; [.26F5.0020.0002] # BENGALI VOWEL SIGN UU +09C3 ; [.26F6.0020.0002] # BENGALI VOWEL SIGN VOCALIC R +09C4 ; [.26F7.0020.0002] # BENGALI VOWEL SIGN VOCALIC RR +09E2 ; [.26F8.0020.0002] # BENGALI VOWEL SIGN VOCALIC L +09E3 ; [.26F9.0020.0002] # BENGALI VOWEL SIGN VOCALIC LL +09C7 ; [.26FA.0020.0002] # BENGALI VOWEL SIGN E +09C8 ; [.26FB.0020.0002] # BENGALI VOWEL SIGN AI +09CB ; [.26FC.0020.0002] # BENGALI VOWEL SIGN O +09C7 09BE ; [.26FC.0020.0002] # BENGALI VOWEL SIGN O +09CC ; [.26FD.0020.0002] # BENGALI VOWEL SIGN AU +09C7 09D7 ; [.26FD.0020.0002] # BENGALI VOWEL SIGN AU +09CD ; [.26FE.0020.0002] # BENGALI SIGN VIRAMA +09D7 ; [.26FF.0020.0002] # BENGALI AU LENGTH MARK +0A74 ; [.2700.0020.0002] # GURMUKHI EK ONKAR +0A73 ; [.2701.0020.0002] # GURMUKHI URA +0A09 ; [.2702.0020.0002] # GURMUKHI LETTER U +0A0A ; [.2703.0020.0002] # GURMUKHI LETTER UU +0A13 ; [.2704.0020.0002] # GURMUKHI LETTER OO +0A05 ; [.2705.0020.0002] # GURMUKHI LETTER A +0A06 ; [.2706.0020.0002] # GURMUKHI LETTER AA +0A10 ; [.2707.0020.0002] # GURMUKHI LETTER AI +0A14 ; [.2708.0020.0002] # GURMUKHI LETTER AU +0A72 ; [.2709.0020.0002] # GURMUKHI IRI +0A07 ; [.270A.0020.0002] # GURMUKHI LETTER I +0A08 ; [.270B.0020.0002] # GURMUKHI LETTER II +0A0F ; [.270C.0020.0002] # GURMUKHI LETTER EE +0A38 ; [.270D.0020.0002] # GURMUKHI LETTER SA +0A36 ; [.270D.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER SHA +0A39 ; [.270E.0020.0002] # GURMUKHI LETTER HA +0A51 ; [.270F.0020.0002] # GURMUKHI SIGN UDAAT +0A15 ; [.2710.0020.0002] # GURMUKHI LETTER KA +0A16 ; [.2711.0020.0002] # GURMUKHI LETTER KHA +0A59 ; [.2711.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER KHHA +0A17 ; [.2712.0020.0002] # GURMUKHI LETTER GA +0A5A ; [.2712.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER GHHA +0A18 ; [.2713.0020.0002] # GURMUKHI LETTER GHA +0A19 ; [.2714.0020.0002] # GURMUKHI LETTER NGA +0A1A ; [.2715.0020.0002] # GURMUKHI LETTER CA +0A1B ; [.2716.0020.0002] # GURMUKHI LETTER CHA +0A1C ; [.2717.0020.0002] # GURMUKHI LETTER JA +0A5B ; [.2717.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER ZA +0A1D ; [.2718.0020.0002] # GURMUKHI LETTER JHA +0A1E ; [.2719.0020.0002] # GURMUKHI LETTER NYA +0A1F ; [.271A.0020.0002] # GURMUKHI LETTER TTA +0A20 ; [.271B.0020.0002] # GURMUKHI LETTER TTHA +0A21 ; [.271C.0020.0002] # GURMUKHI LETTER DDA +0A22 ; [.271D.0020.0002] # GURMUKHI LETTER DDHA +0A23 ; [.271E.0020.0002] # GURMUKHI LETTER NNA +0A24 ; [.271F.0020.0002] # GURMUKHI LETTER TA +0A25 ; [.2720.0020.0002] # GURMUKHI LETTER THA +0A26 ; [.2721.0020.0002] # GURMUKHI LETTER DA +0A27 ; [.2722.0020.0002] # GURMUKHI LETTER DHA +0A28 ; [.2723.0020.0002] # GURMUKHI LETTER NA +0A2A ; [.2724.0020.0002] # GURMUKHI LETTER PA +0A2B ; [.2725.0020.0002] # GURMUKHI LETTER PHA +0A5E ; [.2725.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER FA +0A2C ; [.2726.0020.0002] # GURMUKHI LETTER BA +0A2D ; [.2727.0020.0002] # GURMUKHI LETTER BHA +0A2E ; [.2728.0020.0002] # GURMUKHI LETTER MA +0A2F ; [.2729.0020.0002] # GURMUKHI LETTER YA +0A75 ; [.272A.0020.0002] # GURMUKHI SIGN YAKASH +0A30 ; [.272B.0020.0002] # GURMUKHI LETTER RA +0A32 ; [.272C.0020.0002] # GURMUKHI LETTER LA +0A33 ; [.272C.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER LLA +0A35 ; [.272D.0020.0002] # GURMUKHI LETTER VA +0A5C ; [.272E.0020.0002] # GURMUKHI LETTER RRA +0A3E ; [.272F.0020.0002] # GURMUKHI VOWEL SIGN AA +0A3F ; [.2730.0020.0002] # GURMUKHI VOWEL SIGN I +0A40 ; [.2731.0020.0002] # GURMUKHI VOWEL SIGN II +0A41 ; [.2732.0020.0002] # GURMUKHI VOWEL SIGN U +0A42 ; [.2733.0020.0002] # GURMUKHI VOWEL SIGN UU +0A47 ; [.2734.0020.0002] # GURMUKHI VOWEL SIGN EE +0A48 ; [.2735.0020.0002] # GURMUKHI VOWEL SIGN AI +0A4B ; [.2736.0020.0002] # GURMUKHI VOWEL SIGN OO +0A4C ; [.2737.0020.0002] # GURMUKHI VOWEL SIGN AU +0A4D ; [.2738.0020.0002] # GURMUKHI SIGN VIRAMA +0AD0 ; [.2739.0020.0002] # GUJARATI OM +0A85 ; [.273A.0020.0002] # GUJARATI LETTER A +0A86 ; [.273B.0020.0002] # GUJARATI LETTER AA +0A87 ; [.273C.0020.0002] # GUJARATI LETTER I +0A88 ; [.273D.0020.0002] # GUJARATI LETTER II +0A89 ; [.273E.0020.0002] # GUJARATI LETTER U +0A8A ; [.273F.0020.0002] # GUJARATI LETTER UU +0A8B ; [.2740.0020.0002] # GUJARATI LETTER VOCALIC R +0AE0 ; [.2741.0020.0002] # GUJARATI LETTER VOCALIC RR +0A8C ; [.2742.0020.0002] # GUJARATI LETTER VOCALIC L +0AE1 ; [.2743.0020.0002] # GUJARATI LETTER VOCALIC LL +0A8D ; [.2744.0020.0002] # GUJARATI VOWEL CANDRA E +0A8F ; [.2745.0020.0002] # GUJARATI LETTER E +0A90 ; [.2746.0020.0002] # GUJARATI LETTER AI +0A91 ; [.2747.0020.0002] # GUJARATI VOWEL CANDRA O +0A93 ; [.2748.0020.0002] # GUJARATI LETTER O +0A94 ; [.2749.0020.0002] # GUJARATI LETTER AU +0A95 ; [.274A.0020.0002] # GUJARATI LETTER KA +0A96 ; [.274B.0020.0002] # GUJARATI LETTER KHA +0A97 ; [.274C.0020.0002] # GUJARATI LETTER GA +0A98 ; [.274D.0020.0002] # GUJARATI LETTER GHA +0A99 ; [.274E.0020.0002] # GUJARATI LETTER NGA +0A9A ; [.274F.0020.0002] # GUJARATI LETTER CA +0A9B ; [.2750.0020.0002] # GUJARATI LETTER CHA +0A9C ; [.2751.0020.0002] # GUJARATI LETTER JA +0AF9 ; [.2752.0020.0002] # GUJARATI LETTER ZHA +0A9D ; [.2753.0020.0002] # GUJARATI LETTER JHA +0A9E ; [.2754.0020.0002] # GUJARATI LETTER NYA +0A9F ; [.2755.0020.0002] # GUJARATI LETTER TTA +0AA0 ; [.2756.0020.0002] # GUJARATI LETTER TTHA +0AA1 ; [.2757.0020.0002] # GUJARATI LETTER DDA +0AA2 ; [.2758.0020.0002] # GUJARATI LETTER DDHA +0AA3 ; [.2759.0020.0002] # GUJARATI LETTER NNA +0AA4 ; [.275A.0020.0002] # GUJARATI LETTER TA +0AA5 ; [.275B.0020.0002] # GUJARATI LETTER THA +0AA6 ; [.275C.0020.0002] # GUJARATI LETTER DA +0AA7 ; [.275D.0020.0002] # GUJARATI LETTER DHA +0AA8 ; [.275E.0020.0002] # GUJARATI LETTER NA +0AAA ; [.275F.0020.0002] # GUJARATI LETTER PA +0AAB ; [.2760.0020.0002] # GUJARATI LETTER PHA +0AAC ; [.2761.0020.0002] # GUJARATI LETTER BA +0AAD ; [.2762.0020.0002] # GUJARATI LETTER BHA +0AAE ; [.2763.0020.0002] # GUJARATI LETTER MA +0AAF ; [.2764.0020.0002] # GUJARATI LETTER YA +0AB0 ; [.2765.0020.0002] # GUJARATI LETTER RA +0AB2 ; [.2766.0020.0002] # GUJARATI LETTER LA +0AB5 ; [.2767.0020.0002] # GUJARATI LETTER VA +0AB6 ; [.2768.0020.0002] # GUJARATI LETTER SHA +0AB7 ; [.2769.0020.0002] # GUJARATI LETTER SSA +0AB8 ; [.276A.0020.0002] # GUJARATI LETTER SA +0AB9 ; [.276B.0020.0002] # GUJARATI LETTER HA +0AB3 ; [.276C.0020.0002] # GUJARATI LETTER LLA +0ABD ; [.276D.0020.0002] # GUJARATI SIGN AVAGRAHA +0ABE ; [.276E.0020.0002] # GUJARATI VOWEL SIGN AA +0ABF ; [.276F.0020.0002] # GUJARATI VOWEL SIGN I +0AC0 ; [.2770.0020.0002] # GUJARATI VOWEL SIGN II +0AC1 ; [.2771.0020.0002] # GUJARATI VOWEL SIGN U +0AC2 ; [.2772.0020.0002] # GUJARATI VOWEL SIGN UU +0AC3 ; [.2773.0020.0002] # GUJARATI VOWEL SIGN VOCALIC R +0AC4 ; [.2774.0020.0002] # GUJARATI VOWEL SIGN VOCALIC RR +0AE2 ; [.2775.0020.0002] # GUJARATI VOWEL SIGN VOCALIC L +0AE3 ; [.2776.0020.0002] # GUJARATI VOWEL SIGN VOCALIC LL +0AC5 ; [.2777.0020.0002] # GUJARATI VOWEL SIGN CANDRA E +0AC7 ; [.2778.0020.0002] # GUJARATI VOWEL SIGN E +0AC8 ; [.2779.0020.0002] # GUJARATI VOWEL SIGN AI +0AC9 ; [.277A.0020.0002] # GUJARATI VOWEL SIGN CANDRA O +0ACB ; [.277B.0020.0002] # GUJARATI VOWEL SIGN O +0ACC ; [.277C.0020.0002] # GUJARATI VOWEL SIGN AU +0ACD ; [.277D.0020.0002] # GUJARATI SIGN VIRAMA +0B05 ; [.277E.0020.0002] # ORIYA LETTER A +0B06 ; [.277F.0020.0002] # ORIYA LETTER AA +0B07 ; [.2780.0020.0002] # ORIYA LETTER I +0B08 ; [.2781.0020.0002] # ORIYA LETTER II +0B09 ; [.2782.0020.0002] # ORIYA LETTER U +0B0A ; [.2783.0020.0002] # ORIYA LETTER UU +0B0B ; [.2784.0020.0002] # ORIYA LETTER VOCALIC R +0B60 ; [.2785.0020.0002] # ORIYA LETTER VOCALIC RR +0B0C ; [.2786.0020.0002] # ORIYA LETTER VOCALIC L +0B61 ; [.2787.0020.0002] # ORIYA LETTER VOCALIC LL +0B0F ; [.2788.0020.0002] # ORIYA LETTER E +0B10 ; [.2789.0020.0002] # ORIYA LETTER AI +0B13 ; [.278A.0020.0002] # ORIYA LETTER O +0B14 ; [.278B.0020.0002] # ORIYA LETTER AU +0B15 ; [.278C.0020.0002] # ORIYA LETTER KA +0B16 ; [.278D.0020.0002] # ORIYA LETTER KHA +0B17 ; [.278E.0020.0002] # ORIYA LETTER GA +0B18 ; [.278F.0020.0002] # ORIYA LETTER GHA +0B19 ; [.2790.0020.0002] # ORIYA LETTER NGA +0B1A ; [.2791.0020.0002] # ORIYA LETTER CA +0B1B ; [.2792.0020.0002] # ORIYA LETTER CHA +0B1C ; [.2793.0020.0002] # ORIYA LETTER JA +0B1D ; [.2794.0020.0002] # ORIYA LETTER JHA +0B1E ; [.2795.0020.0002] # ORIYA LETTER NYA +0B1F ; [.2796.0020.0002] # ORIYA LETTER TTA +0B20 ; [.2797.0020.0002] # ORIYA LETTER TTHA +0B21 ; [.2798.0020.0002] # ORIYA LETTER DDA +0B5C ; [.2798.0020.0002][.0000.00C2.0002] # ORIYA LETTER RRA +0B22 ; [.2799.0020.0002] # ORIYA LETTER DDHA +0B5D ; [.2799.0020.0002][.0000.00C2.0002] # ORIYA LETTER RHA +0B23 ; [.279A.0020.0002] # ORIYA LETTER NNA +0B24 ; [.279B.0020.0002] # ORIYA LETTER TA +0B25 ; [.279C.0020.0002] # ORIYA LETTER THA +0B26 ; [.279D.0020.0002] # ORIYA LETTER DA +0B27 ; [.279E.0020.0002] # ORIYA LETTER DHA +0B28 ; [.279F.0020.0002] # ORIYA LETTER NA +0B2A ; [.27A0.0020.0002] # ORIYA LETTER PA +0B2B ; [.27A1.0020.0002] # ORIYA LETTER PHA +0B2C ; [.27A2.0020.0002] # ORIYA LETTER BA +0B2D ; [.27A3.0020.0002] # ORIYA LETTER BHA +0B2E ; [.27A4.0020.0002] # ORIYA LETTER MA +0B2F ; [.27A5.0020.0002] # ORIYA LETTER YA +0B5F ; [.27A6.0020.0002] # ORIYA LETTER YYA +0B30 ; [.27A7.0020.0002] # ORIYA LETTER RA +0B32 ; [.27A8.0020.0002] # ORIYA LETTER LA +0B33 ; [.27A9.0020.0002] # ORIYA LETTER LLA +0B35 ; [.27AA.0020.0002] # ORIYA LETTER VA +0B71 ; [.27AB.0020.0002] # ORIYA LETTER WA +0B36 ; [.27AC.0020.0002] # ORIYA LETTER SHA +0B37 ; [.27AD.0020.0002] # ORIYA LETTER SSA +0B38 ; [.27AE.0020.0002] # ORIYA LETTER SA +0B39 ; [.27AF.0020.0002] # ORIYA LETTER HA +0B3D ; [.27B0.0020.0002] # ORIYA SIGN AVAGRAHA +0B3E ; [.27B1.0020.0002] # ORIYA VOWEL SIGN AA +0B3F ; [.27B2.0020.0002] # ORIYA VOWEL SIGN I +0B40 ; [.27B3.0020.0002] # ORIYA VOWEL SIGN II +0B41 ; [.27B4.0020.0002] # ORIYA VOWEL SIGN U +0B42 ; [.27B5.0020.0002] # ORIYA VOWEL SIGN UU +0B43 ; [.27B6.0020.0002] # ORIYA VOWEL SIGN VOCALIC R +0B44 ; [.27B7.0020.0002] # ORIYA VOWEL SIGN VOCALIC RR +0B62 ; [.27B8.0020.0002] # ORIYA VOWEL SIGN VOCALIC L +0B63 ; [.27B9.0020.0002] # ORIYA VOWEL SIGN VOCALIC LL +0B47 ; [.27BA.0020.0002] # ORIYA VOWEL SIGN E +0B48 ; [.27BB.0020.0002] # ORIYA VOWEL SIGN AI +0B47 0B56 ; [.27BB.0020.0002] # ORIYA VOWEL SIGN AI +0B4B ; [.27BC.0020.0002] # ORIYA VOWEL SIGN O +0B47 0B3E ; [.27BC.0020.0002] # ORIYA VOWEL SIGN O +0B4C ; [.27BD.0020.0002] # ORIYA VOWEL SIGN AU +0B47 0B57 ; [.27BD.0020.0002] # ORIYA VOWEL SIGN AU +0B4D ; [.27BE.0020.0002] # ORIYA SIGN VIRAMA +0B56 ; [.27BF.0020.0002] # ORIYA AI LENGTH MARK +0B57 ; [.27C0.0020.0002] # ORIYA AU LENGTH MARK +0BD0 ; [.27C1.0020.0002] # TAMIL OM +0B85 ; [.27C2.0020.0002] # TAMIL LETTER A +0B86 ; [.27C3.0020.0002] # TAMIL LETTER AA +0B87 ; [.27C4.0020.0002] # TAMIL LETTER I +0B88 ; [.27C5.0020.0002] # TAMIL LETTER II +0B89 ; [.27C6.0020.0002] # TAMIL LETTER U +0B8A ; [.27C7.0020.0002] # TAMIL LETTER UU +0B8E ; [.27C8.0020.0002] # TAMIL LETTER E +0B8F ; [.27C9.0020.0002] # TAMIL LETTER EE +0B90 ; [.27CA.0020.0002] # TAMIL LETTER AI +0B92 ; [.27CB.0020.0002] # TAMIL LETTER O +0B93 ; [.27CC.0020.0002] # TAMIL LETTER OO +0B94 ; [.27CD.0020.0002] # TAMIL LETTER AU +0B92 0BD7 ; [.27CD.0020.0002] # TAMIL LETTER AU +0B83 ; [.27CE.0020.0002] # TAMIL SIGN VISARGA +0B95 ; [.27CF.0020.0002] # TAMIL LETTER KA +0B99 ; [.27D0.0020.0002] # TAMIL LETTER NGA +0B9A ; [.27D1.0020.0002] # TAMIL LETTER CA +0B9E ; [.27D2.0020.0002] # TAMIL LETTER NYA +0B9F ; [.27D3.0020.0002] # TAMIL LETTER TTA +0BA3 ; [.27D4.0020.0002] # TAMIL LETTER NNA +0BA4 ; [.27D5.0020.0002] # TAMIL LETTER TA +0BA8 ; [.27D6.0020.0002] # TAMIL LETTER NA +0BAA ; [.27D7.0020.0002] # TAMIL LETTER PA +0BAE ; [.27D8.0020.0002] # TAMIL LETTER MA +0BAF ; [.27D9.0020.0002] # TAMIL LETTER YA +0BB0 ; [.27DA.0020.0002] # TAMIL LETTER RA +0BB2 ; [.27DB.0020.0002] # TAMIL LETTER LA +0BB5 ; [.27DC.0020.0002] # TAMIL LETTER VA +0BB4 ; [.27DD.0020.0002] # TAMIL LETTER LLLA +0BB3 ; [.27DE.0020.0002] # TAMIL LETTER LLA +0BB1 ; [.27DF.0020.0002] # TAMIL LETTER RRA +0BA9 ; [.27E0.0020.0002] # TAMIL LETTER NNNA +0B9C ; [.27E1.0020.0002] # TAMIL LETTER JA +0BB6 ; [.27E2.0020.0002] # TAMIL LETTER SHA +0BB7 ; [.27E3.0020.0002] # TAMIL LETTER SSA +0BB8 ; [.27E4.0020.0002] # TAMIL LETTER SA +0BB9 ; [.27E5.0020.0002] # TAMIL LETTER HA +0BBE ; [.27E6.0020.0002] # TAMIL VOWEL SIGN AA +0BBF ; [.27E7.0020.0002] # TAMIL VOWEL SIGN I +0BC0 ; [.27E8.0020.0002] # TAMIL VOWEL SIGN II +0BC1 ; [.27E9.0020.0002] # TAMIL VOWEL SIGN U +0BC2 ; [.27EA.0020.0002] # TAMIL VOWEL SIGN UU +0BC6 ; [.27EB.0020.0002] # TAMIL VOWEL SIGN E +0BC7 ; [.27EC.0020.0002] # TAMIL VOWEL SIGN EE +0BC8 ; [.27ED.0020.0002] # TAMIL VOWEL SIGN AI +0BCA ; [.27EE.0020.0002] # TAMIL VOWEL SIGN O +0BC6 0BBE ; [.27EE.0020.0002] # TAMIL VOWEL SIGN O +0BCB ; [.27EF.0020.0002] # TAMIL VOWEL SIGN OO +0BC7 0BBE ; [.27EF.0020.0002] # TAMIL VOWEL SIGN OO +0BCC ; [.27F0.0020.0002] # TAMIL VOWEL SIGN AU +0BC6 0BD7 ; [.27F0.0020.0002] # TAMIL VOWEL SIGN AU +0BCD ; [.27F1.0020.0002] # TAMIL SIGN VIRAMA +0BD7 ; [.27F2.0020.0002] # TAMIL AU LENGTH MARK +0C05 ; [.27F3.0020.0002] # TELUGU LETTER A +0C06 ; [.27F4.0020.0002] # TELUGU LETTER AA +0C07 ; [.27F5.0020.0002] # TELUGU LETTER I +0C08 ; [.27F6.0020.0002] # TELUGU LETTER II +0C09 ; [.27F7.0020.0002] # TELUGU LETTER U +0C0A ; [.27F8.0020.0002] # TELUGU LETTER UU +0C0B ; [.27F9.0020.0002] # TELUGU LETTER VOCALIC R +0C60 ; [.27FA.0020.0002] # TELUGU LETTER VOCALIC RR +0C0C ; [.27FB.0020.0002] # TELUGU LETTER VOCALIC L +0C61 ; [.27FC.0020.0002] # TELUGU LETTER VOCALIC LL +0C0E ; [.27FD.0020.0002] # TELUGU LETTER E +0C0F ; [.27FE.0020.0002] # TELUGU LETTER EE +0C10 ; [.27FF.0020.0002] # TELUGU LETTER AI +0C12 ; [.2800.0020.0002] # TELUGU LETTER O +0C13 ; [.2801.0020.0002] # TELUGU LETTER OO +0C14 ; [.2802.0020.0002] # TELUGU LETTER AU +0C15 ; [.2803.0020.0002] # TELUGU LETTER KA +0C16 ; [.2804.0020.0002] # TELUGU LETTER KHA +0C17 ; [.2805.0020.0002] # TELUGU LETTER GA +0C18 ; [.2806.0020.0002] # TELUGU LETTER GHA +0C19 ; [.2807.0020.0002] # TELUGU LETTER NGA +0C1A ; [.2808.0020.0002] # TELUGU LETTER CA +0C58 ; [.2809.0020.0002] # TELUGU LETTER TSA +0C1B ; [.280A.0020.0002] # TELUGU LETTER CHA +0C1C ; [.280B.0020.0002] # TELUGU LETTER JA +0C59 ; [.280C.0020.0002] # TELUGU LETTER DZA +0C1D ; [.280D.0020.0002] # TELUGU LETTER JHA +0C1E ; [.280E.0020.0002] # TELUGU LETTER NYA +0C1F ; [.280F.0020.0002] # TELUGU LETTER TTA +0C20 ; [.2810.0020.0002] # TELUGU LETTER TTHA +0C21 ; [.2811.0020.0002] # TELUGU LETTER DDA +0C22 ; [.2812.0020.0002] # TELUGU LETTER DDHA +0C23 ; [.2813.0020.0002] # TELUGU LETTER NNA +0C24 ; [.2814.0020.0002] # TELUGU LETTER TA +0C25 ; [.2815.0020.0002] # TELUGU LETTER THA +0C26 ; [.2816.0020.0002] # TELUGU LETTER DA +0C27 ; [.2817.0020.0002] # TELUGU LETTER DHA +0C28 ; [.2818.0020.0002] # TELUGU LETTER NA +0C2A ; [.2819.0020.0002] # TELUGU LETTER PA +0C2B ; [.281A.0020.0002] # TELUGU LETTER PHA +0C2C ; [.281B.0020.0002] # TELUGU LETTER BA +0C2D ; [.281C.0020.0002] # TELUGU LETTER BHA +0C2E ; [.281D.0020.0002] # TELUGU LETTER MA +0C2F ; [.281E.0020.0002] # TELUGU LETTER YA +0C30 ; [.281F.0020.0002] # TELUGU LETTER RA +0C31 ; [.2820.0020.0002] # TELUGU LETTER RRA +0C32 ; [.2821.0020.0002] # TELUGU LETTER LA +0C35 ; [.2822.0020.0002] # TELUGU LETTER VA +0C36 ; [.2823.0020.0002] # TELUGU LETTER SHA +0C37 ; [.2824.0020.0002] # TELUGU LETTER SSA +0C38 ; [.2825.0020.0002] # TELUGU LETTER SA +0C39 ; [.2826.0020.0002] # TELUGU LETTER HA +0C33 ; [.2827.0020.0002] # TELUGU LETTER LLA +0C34 ; [.2828.0020.0002] # TELUGU LETTER LLLA +0C5A ; [.2829.0020.0002] # TELUGU LETTER RRRA +0C3D ; [.282A.0020.0002] # TELUGU SIGN AVAGRAHA +0C3E ; [.282B.0020.0002] # TELUGU VOWEL SIGN AA +0C3F ; [.282C.0020.0002] # TELUGU VOWEL SIGN I +0C40 ; [.282D.0020.0002] # TELUGU VOWEL SIGN II +0C41 ; [.282E.0020.0002] # TELUGU VOWEL SIGN U +0C42 ; [.282F.0020.0002] # TELUGU VOWEL SIGN UU +0C43 ; [.2830.0020.0002] # TELUGU VOWEL SIGN VOCALIC R +0C44 ; [.2831.0020.0002] # TELUGU VOWEL SIGN VOCALIC RR +0C62 ; [.2832.0020.0002] # TELUGU VOWEL SIGN VOCALIC L +0C63 ; [.2833.0020.0002] # TELUGU VOWEL SIGN VOCALIC LL +0C46 ; [.2834.0020.0002] # TELUGU VOWEL SIGN E +0C47 ; [.2835.0020.0002] # TELUGU VOWEL SIGN EE +0C48 ; [.2836.0020.0002] # TELUGU VOWEL SIGN AI +0C46 0C56 ; [.2836.0020.0002] # TELUGU VOWEL SIGN AI +0C4A ; [.2837.0020.0002] # TELUGU VOWEL SIGN O +0C4B ; [.2838.0020.0002] # TELUGU VOWEL SIGN OO +0C4C ; [.2839.0020.0002] # TELUGU VOWEL SIGN AU +0C4D ; [.283A.0020.0002] # TELUGU SIGN VIRAMA +0C55 ; [.283B.0020.0002] # TELUGU LENGTH MARK +0C56 ; [.283C.0020.0002] # TELUGU AI LENGTH MARK +0C85 ; [.283D.0020.0002] # KANNADA LETTER A +0C86 ; [.283E.0020.0002] # KANNADA LETTER AA +0C87 ; [.283F.0020.0002] # KANNADA LETTER I +0C88 ; [.2840.0020.0002] # KANNADA LETTER II +0C89 ; [.2841.0020.0002] # KANNADA LETTER U +0C8A ; [.2842.0020.0002] # KANNADA LETTER UU +0C8B ; [.2843.0020.0002] # KANNADA LETTER VOCALIC R +0CE0 ; [.2844.0020.0002] # KANNADA LETTER VOCALIC RR +0C8C ; [.2845.0020.0002] # KANNADA LETTER VOCALIC L +0CE1 ; [.2846.0020.0002] # KANNADA LETTER VOCALIC LL +0C8E ; [.2847.0020.0002] # KANNADA LETTER E +0C8F ; [.2848.0020.0002] # KANNADA LETTER EE +0C90 ; [.2849.0020.0002] # KANNADA LETTER AI +0C92 ; [.284A.0020.0002] # KANNADA LETTER O +0C93 ; [.284B.0020.0002] # KANNADA LETTER OO +0C94 ; [.284C.0020.0002] # KANNADA LETTER AU +0C95 ; [.284D.0020.0002] # KANNADA LETTER KA +0C96 ; [.284E.0020.0002] # KANNADA LETTER KHA +0C97 ; [.284F.0020.0002] # KANNADA LETTER GA +0C98 ; [.2850.0020.0002] # KANNADA LETTER GHA +0C99 ; [.2851.0020.0002] # KANNADA LETTER NGA +0C9A ; [.2852.0020.0002] # KANNADA LETTER CA +0C9B ; [.2853.0020.0002] # KANNADA LETTER CHA +0C9C ; [.2854.0020.0002] # KANNADA LETTER JA +0C9D ; [.2855.0020.0002] # KANNADA LETTER JHA +0C9E ; [.2856.0020.0002] # KANNADA LETTER NYA +0C9F ; [.2857.0020.0002] # KANNADA LETTER TTA +0CA0 ; [.2858.0020.0002] # KANNADA LETTER TTHA +0CA1 ; [.2859.0020.0002] # KANNADA LETTER DDA +0CA2 ; [.285A.0020.0002] # KANNADA LETTER DDHA +0CA3 ; [.285B.0020.0002] # KANNADA LETTER NNA +0CA4 ; [.285C.0020.0002] # KANNADA LETTER TA +0CA5 ; [.285D.0020.0002] # KANNADA LETTER THA +0CA6 ; [.285E.0020.0002] # KANNADA LETTER DA +0CA7 ; [.285F.0020.0002] # KANNADA LETTER DHA +0CA8 ; [.2860.0020.0002] # KANNADA LETTER NA +0CAA ; [.2861.0020.0002] # KANNADA LETTER PA +0CAB ; [.2862.0020.0002] # KANNADA LETTER PHA +0CAC ; [.2863.0020.0002] # KANNADA LETTER BA +0CAD ; [.2864.0020.0002] # KANNADA LETTER BHA +0CAE ; [.2865.0020.0002] # KANNADA LETTER MA +0CAF ; [.2866.0020.0002] # KANNADA LETTER YA +0CB0 ; [.2867.0020.0002] # KANNADA LETTER RA +0CB1 ; [.2868.0020.0002] # KANNADA LETTER RRA +0CB2 ; [.2869.0020.0002] # KANNADA LETTER LA +0CB5 ; [.286A.0020.0002] # KANNADA LETTER VA +0CB6 ; [.286B.0020.0002] # KANNADA LETTER SHA +0CB7 ; [.286C.0020.0002] # KANNADA LETTER SSA +0CB8 ; [.286D.0020.0002] # KANNADA LETTER SA +0CB9 ; [.286E.0020.0002] # KANNADA LETTER HA +0CB3 ; [.286F.0020.0002] # KANNADA LETTER LLA +0CDE ; [.2870.0020.0002] # KANNADA LETTER FA +0CBD ; [.2871.0020.0002] # KANNADA SIGN AVAGRAHA +0CF1 ; [.2872.0020.0002] # KANNADA SIGN JIHVAMULIYA +0CF2 ; [.2873.0020.0002] # KANNADA SIGN UPADHMANIYA +0C80 ; [.2874.0020.0002] # KANNADA SIGN SPACING CANDRABINDU +0CBE ; [.2875.0020.0002] # KANNADA VOWEL SIGN AA +0CBF ; [.2876.0020.0002] # KANNADA VOWEL SIGN I +0CC0 ; [.2877.0020.0002] # KANNADA VOWEL SIGN II +0CBF 0CD5 ; [.2877.0020.0002] # KANNADA VOWEL SIGN II +0CC1 ; [.2878.0020.0002] # KANNADA VOWEL SIGN U +0CC2 ; [.2879.0020.0002] # KANNADA VOWEL SIGN UU +0CC3 ; [.287A.0020.0002] # KANNADA VOWEL SIGN VOCALIC R +0CC4 ; [.287B.0020.0002] # KANNADA VOWEL SIGN VOCALIC RR +0CE2 ; [.287C.0020.0002] # KANNADA VOWEL SIGN VOCALIC L +0CE3 ; [.287D.0020.0002] # KANNADA VOWEL SIGN VOCALIC LL +0CC6 ; [.287E.0020.0002] # KANNADA VOWEL SIGN E +0CC7 ; [.287F.0020.0002] # KANNADA VOWEL SIGN EE +0CC6 0CD5 ; [.287F.0020.0002] # KANNADA VOWEL SIGN EE +0CC8 ; [.2880.0020.0002] # KANNADA VOWEL SIGN AI +0CC6 0CD6 ; [.2880.0020.0002] # KANNADA VOWEL SIGN AI +0CCA ; [.2881.0020.0002] # KANNADA VOWEL SIGN O +0CC6 0CC2 ; [.2881.0020.0002] # KANNADA VOWEL SIGN O +0CCB ; [.2882.0020.0002] # KANNADA VOWEL SIGN OO +0CC6 0CC2 0CD5 ; [.2882.0020.0002] # KANNADA VOWEL SIGN OO +0CCA 0CD5 ; [.2882.0020.0002] # KANNADA VOWEL SIGN OO +0CCC ; [.2883.0020.0002] # KANNADA VOWEL SIGN AU +0CCD ; [.2884.0020.0002] # KANNADA SIGN VIRAMA +0CD5 ; [.2885.0020.0002] # KANNADA LENGTH MARK +0CD6 ; [.2886.0020.0002] # KANNADA AI LENGTH MARK +0D05 ; [.2887.0020.0002] # MALAYALAM LETTER A +0D06 ; [.2888.0020.0002] # MALAYALAM LETTER AA +0D07 ; [.2889.0020.0002] # MALAYALAM LETTER I +0D08 ; [.288A.0020.0002] # MALAYALAM LETTER II +0D5F ; [.288B.0020.0002] # MALAYALAM LETTER ARCHAIC II +0D09 ; [.288C.0020.0002] # MALAYALAM LETTER U +0D0A ; [.288D.0020.0002] # MALAYALAM LETTER UU +0D0B ; [.288E.0020.0002] # MALAYALAM LETTER VOCALIC R +0D60 ; [.288F.0020.0002] # MALAYALAM LETTER VOCALIC RR +0D0C ; [.2890.0020.0002] # MALAYALAM LETTER VOCALIC L +0D61 ; [.2891.0020.0002] # MALAYALAM LETTER VOCALIC LL +0D0E ; [.2892.0020.0002] # MALAYALAM LETTER E +0D0F ; [.2893.0020.0002] # MALAYALAM LETTER EE +0D10 ; [.2894.0020.0002] # MALAYALAM LETTER AI +0D12 ; [.2895.0020.0002] # MALAYALAM LETTER O +0D13 ; [.2896.0020.0002] # MALAYALAM LETTER OO +0D14 ; [.2897.0020.0002] # MALAYALAM LETTER AU +0D15 ; [.2898.0020.0002] # MALAYALAM LETTER KA +0D7F ; [.2898.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU K +0D16 ; [.2899.0020.0002] # MALAYALAM LETTER KHA +0D17 ; [.289A.0020.0002] # MALAYALAM LETTER GA +0D18 ; [.289B.0020.0002] # MALAYALAM LETTER GHA +0D19 ; [.289C.0020.0002] # MALAYALAM LETTER NGA +0D1A ; [.289D.0020.0002] # MALAYALAM LETTER CA +0D1B ; [.289E.0020.0002] # MALAYALAM LETTER CHA +0D1C ; [.289F.0020.0002] # MALAYALAM LETTER JA +0D1D ; [.28A0.0020.0002] # MALAYALAM LETTER JHA +0D1E ; [.28A1.0020.0002] # MALAYALAM LETTER NYA +0D1F ; [.28A2.0020.0002] # MALAYALAM LETTER TTA +0D20 ; [.28A3.0020.0002] # MALAYALAM LETTER TTHA +0D21 ; [.28A4.0020.0002] # MALAYALAM LETTER DDA +0D22 ; [.28A5.0020.0002] # MALAYALAM LETTER DDHA +0D23 ; [.28A6.0020.0002] # MALAYALAM LETTER NNA +0D7A ; [.28A6.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU NN +0D24 ; [.28A7.0020.0002] # MALAYALAM LETTER TA +0D25 ; [.28A8.0020.0002] # MALAYALAM LETTER THA +0D26 ; [.28A9.0020.0002] # MALAYALAM LETTER DA +0D27 ; [.28AA.0020.0002] # MALAYALAM LETTER DHA +0D28 ; [.28AB.0020.0002] # MALAYALAM LETTER NA +0D7B ; [.28AB.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU N +0D29 ; [.28AC.0020.0002] # MALAYALAM LETTER NNNA +0D2A ; [.28AD.0020.0002] # MALAYALAM LETTER PA +0D2B ; [.28AE.0020.0002] # MALAYALAM LETTER PHA +0D2C ; [.28AF.0020.0002] # MALAYALAM LETTER BA +0D2D ; [.28B0.0020.0002] # MALAYALAM LETTER BHA +0D2E ; [.28B1.0020.0002] # MALAYALAM LETTER MA +0D54 ; [.28B1.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU M +0D2F ; [.28B2.0020.0002] # MALAYALAM LETTER YA +0D55 ; [.28B2.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU Y +0D30 ; [.28B3.0020.0002] # MALAYALAM LETTER RA +0D4E ; [.28B3.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER DOT REPH +0D7C ; [.28B3.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU RR +0D32 ; [.28B4.0020.0002] # MALAYALAM LETTER LA +0D7D ; [.28B4.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU L +0D35 ; [.28B5.0020.0002] # MALAYALAM LETTER VA +0D36 ; [.28B6.0020.0002] # MALAYALAM LETTER SHA +0D37 ; [.28B7.0020.0002] # MALAYALAM LETTER SSA +0D38 ; [.28B8.0020.0002] # MALAYALAM LETTER SA +0D39 ; [.28B9.0020.0002] # MALAYALAM LETTER HA +0D33 ; [.28BA.0020.0002] # MALAYALAM LETTER LLA +0D7E ; [.28BA.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU LL +0D34 ; [.28BB.0020.0002] # MALAYALAM LETTER LLLA +0D56 ; [.28BB.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU LLL +0D31 ; [.28BC.0020.0002] # MALAYALAM LETTER RRA +0D3A ; [.28BD.0020.0002] # MALAYALAM LETTER TTTA +0D3D ; [.28BE.0020.0002] # MALAYALAM SIGN AVAGRAHA +0D3E ; [.28BF.0020.0002] # MALAYALAM VOWEL SIGN AA +0D3F ; [.28C0.0020.0002] # MALAYALAM VOWEL SIGN I +0D40 ; [.28C1.0020.0002] # MALAYALAM VOWEL SIGN II +0D41 ; [.28C2.0020.0002] # MALAYALAM VOWEL SIGN U +0D42 ; [.28C3.0020.0002] # MALAYALAM VOWEL SIGN UU +0D43 ; [.28C4.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC R +0D44 ; [.28C5.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC RR +0D62 ; [.28C6.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC L +0D63 ; [.28C7.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC LL +0D46 ; [.28C8.0020.0002] # MALAYALAM VOWEL SIGN E +0D47 ; [.28C9.0020.0002] # MALAYALAM VOWEL SIGN EE +0D48 ; [.28CA.0020.0002] # MALAYALAM VOWEL SIGN AI +0D4A ; [.28CB.0020.0002] # MALAYALAM VOWEL SIGN O +0D46 0D3E ; [.28CB.0020.0002] # MALAYALAM VOWEL SIGN O +0D4B ; [.28CC.0020.0002] # MALAYALAM VOWEL SIGN OO +0D47 0D3E ; [.28CC.0020.0002] # MALAYALAM VOWEL SIGN OO +0D4C ; [.28CD.0020.0002] # MALAYALAM VOWEL SIGN AU +0D46 0D57 ; [.28CD.0020.0002] # MALAYALAM VOWEL SIGN AU +0D57 ; [.28CE.0020.0002] # MALAYALAM AU LENGTH MARK +0D4D ; [.28CF.0020.0002] # MALAYALAM SIGN VIRAMA +0D85 ; [.28D0.0020.0002] # SINHALA LETTER AYANNA +0D86 ; [.28D1.0020.0002] # SINHALA LETTER AAYANNA +0D87 ; [.28D2.0020.0002] # SINHALA LETTER AEYANNA +0D88 ; [.28D3.0020.0002] # SINHALA LETTER AEEYANNA +0D89 ; [.28D4.0020.0002] # SINHALA LETTER IYANNA +0D8A ; [.28D5.0020.0002] # SINHALA LETTER IIYANNA +0D8B ; [.28D6.0020.0002] # SINHALA LETTER UYANNA +0D8C ; [.28D7.0020.0002] # SINHALA LETTER UUYANNA +0D8D ; [.28D8.0020.0002] # SINHALA LETTER IRUYANNA +0D8E ; [.28D9.0020.0002] # SINHALA LETTER IRUUYANNA +0D8F ; [.28DA.0020.0002] # SINHALA LETTER ILUYANNA +0D90 ; [.28DB.0020.0002] # SINHALA LETTER ILUUYANNA +0D91 ; [.28DC.0020.0002] # SINHALA LETTER EYANNA +0D92 ; [.28DD.0020.0002] # SINHALA LETTER EEYANNA +0D93 ; [.28DE.0020.0002] # SINHALA LETTER AIYANNA +0D94 ; [.28DF.0020.0002] # SINHALA LETTER OYANNA +0D95 ; [.28E0.0020.0002] # SINHALA LETTER OOYANNA +0D96 ; [.28E1.0020.0002] # SINHALA LETTER AUYANNA +0D9A ; [.28E2.0020.0002] # SINHALA LETTER ALPAPRAANA KAYANNA +0D9B ; [.28E3.0020.0002] # SINHALA LETTER MAHAAPRAANA KAYANNA +0D9C ; [.28E4.0020.0002] # SINHALA LETTER ALPAPRAANA GAYANNA +0D9D ; [.28E5.0020.0002] # SINHALA LETTER MAHAAPRAANA GAYANNA +0D9E ; [.28E6.0020.0002] # SINHALA LETTER KANTAJA NAASIKYAYA +0D9F ; [.28E7.0020.0002] # SINHALA LETTER SANYAKA GAYANNA +0DA0 ; [.28E8.0020.0002] # SINHALA LETTER ALPAPRAANA CAYANNA +0DA1 ; [.28E9.0020.0002] # SINHALA LETTER MAHAAPRAANA CAYANNA +0DA2 ; [.28EA.0020.0002] # SINHALA LETTER ALPAPRAANA JAYANNA +0DA3 ; [.28EB.0020.0002] # SINHALA LETTER MAHAAPRAANA JAYANNA +0DA4 ; [.28EC.0020.0002] # SINHALA LETTER TAALUJA NAASIKYAYA +0DA5 ; [.28ED.0020.0002] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA +0DA6 ; [.28EE.0020.0002] # SINHALA LETTER SANYAKA JAYANNA +0DA7 ; [.28EF.0020.0002] # SINHALA LETTER ALPAPRAANA TTAYANNA +0DA8 ; [.28F0.0020.0002] # SINHALA LETTER MAHAAPRAANA TTAYANNA +0DA9 ; [.28F1.0020.0002] # SINHALA LETTER ALPAPRAANA DDAYANNA +0DAA ; [.28F2.0020.0002] # SINHALA LETTER MAHAAPRAANA DDAYANNA +0DAB ; [.28F3.0020.0002] # SINHALA LETTER MUURDHAJA NAYANNA +0DAC ; [.28F4.0020.0002] # SINHALA LETTER SANYAKA DDAYANNA +0DAD ; [.28F5.0020.0002] # SINHALA LETTER ALPAPRAANA TAYANNA +0DAE ; [.28F6.0020.0002] # SINHALA LETTER MAHAAPRAANA TAYANNA +0DAF ; [.28F7.0020.0002] # SINHALA LETTER ALPAPRAANA DAYANNA +0DB0 ; [.28F8.0020.0002] # SINHALA LETTER MAHAAPRAANA DAYANNA +0DB1 ; [.28F9.0020.0002] # SINHALA LETTER DANTAJA NAYANNA +0DB3 ; [.28FA.0020.0002] # SINHALA LETTER SANYAKA DAYANNA +0DB4 ; [.28FB.0020.0002] # SINHALA LETTER ALPAPRAANA PAYANNA +0DB5 ; [.28FC.0020.0002] # SINHALA LETTER MAHAAPRAANA PAYANNA +0DB6 ; [.28FD.0020.0002] # SINHALA LETTER ALPAPRAANA BAYANNA +0DB7 ; [.28FE.0020.0002] # SINHALA LETTER MAHAAPRAANA BAYANNA +0DB8 ; [.28FF.0020.0002] # SINHALA LETTER MAYANNA +0DB9 ; [.2900.0020.0002] # SINHALA LETTER AMBA BAYANNA +0DBA ; [.2901.0020.0002] # SINHALA LETTER YAYANNA +0DBB ; [.2902.0020.0002] # SINHALA LETTER RAYANNA +0DBD ; [.2903.0020.0002] # SINHALA LETTER DANTAJA LAYANNA +0DC0 ; [.2904.0020.0002] # SINHALA LETTER VAYANNA +0DC1 ; [.2905.0020.0002] # SINHALA LETTER TAALUJA SAYANNA +0DC2 ; [.2906.0020.0002] # SINHALA LETTER MUURDHAJA SAYANNA +0DC3 ; [.2907.0020.0002] # SINHALA LETTER DANTAJA SAYANNA +0DC4 ; [.2908.0020.0002] # SINHALA LETTER HAYANNA +0DC5 ; [.2909.0020.0002] # SINHALA LETTER MUURDHAJA LAYANNA +0DC6 ; [.290A.0020.0002] # SINHALA LETTER FAYANNA +0DCF ; [.290B.0020.0002] # SINHALA VOWEL SIGN AELA-PILLA +0DD0 ; [.290C.0020.0002] # SINHALA VOWEL SIGN KETTI AEDA-PILLA +0DD1 ; [.290D.0020.0002] # SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2 ; [.290E.0020.0002] # SINHALA VOWEL SIGN KETTI IS-PILLA +0DD3 ; [.290F.0020.0002] # SINHALA VOWEL SIGN DIGA IS-PILLA +0DD4 ; [.2910.0020.0002] # SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; [.2911.0020.0002] # SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8 ; [.2912.0020.0002] # SINHALA VOWEL SIGN GAETTA-PILLA +0DF2 ; [.2913.0020.0002] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA +0DDF ; [.2914.0020.0002] # SINHALA VOWEL SIGN GAYANUKITTA +0DF3 ; [.2915.0020.0002] # SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DD9 ; [.2916.0020.0002] # SINHALA VOWEL SIGN KOMBUVA +0DDA ; [.2917.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA +0DD9 0DCA ; [.2917.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA +0DDB ; [.2918.0020.0002] # SINHALA VOWEL SIGN KOMBU DEKA +0DDC ; [.2919.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DD9 0DCF ; [.2919.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DDD ; [.291A.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DD9 0DCF 0DCA ; [.291A.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDC 0DCA ; [.291A.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDE ; [.291B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DD9 0DDF ; [.291B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DCA ; [.291C.0020.0002] # SINHALA SIGN AL-LAKUNA +AAF2 ; [.291D.0020.0002] # MEETEI MAYEK ANJI +ABC0 ; [.291E.0020.0002] # MEETEI MAYEK LETTER KOK +ABC1 ; [.291F.0020.0002] # MEETEI MAYEK LETTER SAM +ABC2 ; [.2920.0020.0002] # MEETEI MAYEK LETTER LAI +ABC3 ; [.2921.0020.0002] # MEETEI MAYEK LETTER MIT +ABC4 ; [.2922.0020.0002] # MEETEI MAYEK LETTER PA +ABC5 ; [.2923.0020.0002] # MEETEI MAYEK LETTER NA +ABC6 ; [.2924.0020.0002] # MEETEI MAYEK LETTER CHIL +ABC7 ; [.2925.0020.0002] # MEETEI MAYEK LETTER TIL +ABC8 ; [.2926.0020.0002] # MEETEI MAYEK LETTER KHOU +ABC9 ; [.2927.0020.0002] # MEETEI MAYEK LETTER NGOU +ABCA ; [.2928.0020.0002] # MEETEI MAYEK LETTER THOU +ABCB ; [.2929.0020.0002] # MEETEI MAYEK LETTER WAI +ABCC ; [.292A.0020.0002] # MEETEI MAYEK LETTER YANG +ABCD ; [.292B.0020.0002] # MEETEI MAYEK LETTER HUK +ABCE ; [.292C.0020.0002] # MEETEI MAYEK LETTER UN +ABCF ; [.292D.0020.0002] # MEETEI MAYEK LETTER I +ABD0 ; [.292E.0020.0002] # MEETEI MAYEK LETTER PHAM +ABD1 ; [.292F.0020.0002] # MEETEI MAYEK LETTER ATIYA +ABD2 ; [.2930.0020.0002] # MEETEI MAYEK LETTER GOK +ABD3 ; [.2931.0020.0002] # MEETEI MAYEK LETTER JHAM +ABD4 ; [.2932.0020.0002] # MEETEI MAYEK LETTER RAI +ABD5 ; [.2933.0020.0002] # MEETEI MAYEK LETTER BA +ABD6 ; [.2934.0020.0002] # MEETEI MAYEK LETTER JIL +ABD7 ; [.2935.0020.0002] # MEETEI MAYEK LETTER DIL +ABD8 ; [.2936.0020.0002] # MEETEI MAYEK LETTER GHOU +ABD9 ; [.2937.0020.0002] # MEETEI MAYEK LETTER DHOU +ABDA ; [.2938.0020.0002] # MEETEI MAYEK LETTER BHAM +AAE0 ; [.2939.0020.0002] # MEETEI MAYEK LETTER E +AAE1 ; [.293A.0020.0002] # MEETEI MAYEK LETTER O +AAE2 ; [.293B.0020.0002] # MEETEI MAYEK LETTER CHA +AAE3 ; [.293C.0020.0002] # MEETEI MAYEK LETTER NYA +AAE4 ; [.293D.0020.0002] # MEETEI MAYEK LETTER TTA +AAE5 ; [.293E.0020.0002] # MEETEI MAYEK LETTER TTHA +AAE6 ; [.293F.0020.0002] # MEETEI MAYEK LETTER DDA +AAE7 ; [.2940.0020.0002] # MEETEI MAYEK LETTER DDHA +AAE8 ; [.2941.0020.0002] # MEETEI MAYEK LETTER NNA +AAE9 ; [.2942.0020.0002] # MEETEI MAYEK LETTER SHA +AAEA ; [.2943.0020.0002] # MEETEI MAYEK LETTER SSA +ABE3 ; [.2944.0020.0002] # MEETEI MAYEK VOWEL SIGN ONAP +ABE4 ; [.2945.0020.0002] # MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; [.2946.0020.0002] # MEETEI MAYEK VOWEL SIGN ANAP +ABE6 ; [.2947.0020.0002] # MEETEI MAYEK VOWEL SIGN YENAP +ABE7 ; [.2948.0020.0002] # MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; [.2949.0020.0002] # MEETEI MAYEK VOWEL SIGN UNAP +ABE9 ; [.294A.0020.0002] # MEETEI MAYEK VOWEL SIGN CHEINAP +ABEA ; [.294B.0020.0002] # MEETEI MAYEK VOWEL SIGN NUNG +AAEB ; [.294C.0020.0002] # MEETEI MAYEK VOWEL SIGN II +AAEC ; [.294D.0020.0002] # MEETEI MAYEK VOWEL SIGN UU +AAED ; [.294E.0020.0002] # MEETEI MAYEK VOWEL SIGN AAI +AAEE ; [.294F.0020.0002] # MEETEI MAYEK VOWEL SIGN AU +AAEF ; [.2950.0020.0002] # MEETEI MAYEK VOWEL SIGN AAU +AAF5 ; [.2951.0020.0002] # MEETEI MAYEK VOWEL SIGN VISARGA +ABDB ; [.2952.0020.0002] # MEETEI MAYEK LETTER KOK LONSUM +ABDC ; [.2953.0020.0002] # MEETEI MAYEK LETTER LAI LONSUM +ABDD ; [.2954.0020.0002] # MEETEI MAYEK LETTER MIT LONSUM +ABDE ; [.2955.0020.0002] # MEETEI MAYEK LETTER PA LONSUM +ABDF ; [.2956.0020.0002] # MEETEI MAYEK LETTER NA LONSUM +ABE0 ; [.2957.0020.0002] # MEETEI MAYEK LETTER TIL LONSUM +ABE1 ; [.2958.0020.0002] # MEETEI MAYEK LETTER NGOU LONSUM +ABE2 ; [.2959.0020.0002] # MEETEI MAYEK LETTER I LONSUM +ABED ; [.295A.0020.0002] # MEETEI MAYEK APUN IYEK +AAF6 ; [.295B.0020.0002] # MEETEI MAYEK VIRAMA +A800 ; [.295C.0020.0002] # SYLOTI NAGRI LETTER A +A801 ; [.295D.0020.0002] # SYLOTI NAGRI LETTER I +A802 ; [.295E.0020.0002] # SYLOTI NAGRI SIGN DVISVARA +A803 ; [.295F.0020.0002] # SYLOTI NAGRI LETTER U +A804 ; [.2960.0020.0002] # SYLOTI NAGRI LETTER E +A805 ; [.2961.0020.0002] # SYLOTI NAGRI LETTER O +A806 ; [.2962.0020.0002] # SYLOTI NAGRI SIGN HASANTA +A807 ; [.2963.0020.0002] # SYLOTI NAGRI LETTER KO +A808 ; [.2964.0020.0002] # SYLOTI NAGRI LETTER KHO +A809 ; [.2965.0020.0002] # SYLOTI NAGRI LETTER GO +A80A ; [.2966.0020.0002] # SYLOTI NAGRI LETTER GHO +A80C ; [.2967.0020.0002] # SYLOTI NAGRI LETTER CO +A80D ; [.2968.0020.0002] # SYLOTI NAGRI LETTER CHO +A80E ; [.2969.0020.0002] # SYLOTI NAGRI LETTER JO +A80F ; [.296A.0020.0002] # SYLOTI NAGRI LETTER JHO +A810 ; [.296B.0020.0002] # SYLOTI NAGRI LETTER TTO +A811 ; [.296C.0020.0002] # SYLOTI NAGRI LETTER TTHO +A812 ; [.296D.0020.0002] # SYLOTI NAGRI LETTER DDO +A813 ; [.296E.0020.0002] # SYLOTI NAGRI LETTER DDHO +A814 ; [.296F.0020.0002] # SYLOTI NAGRI LETTER TO +A815 ; [.2970.0020.0002] # SYLOTI NAGRI LETTER THO +A816 ; [.2971.0020.0002] # SYLOTI NAGRI LETTER DO +A817 ; [.2972.0020.0002] # SYLOTI NAGRI LETTER DHO +A818 ; [.2973.0020.0002] # SYLOTI NAGRI LETTER NO +A819 ; [.2974.0020.0002] # SYLOTI NAGRI LETTER PO +A81A ; [.2975.0020.0002] # SYLOTI NAGRI LETTER PHO +A81B ; [.2976.0020.0002] # SYLOTI NAGRI LETTER BO +A81C ; [.2977.0020.0002] # SYLOTI NAGRI LETTER BHO +A81D ; [.2978.0020.0002] # SYLOTI NAGRI LETTER MO +A81E ; [.2979.0020.0002] # SYLOTI NAGRI LETTER RO +A81F ; [.297A.0020.0002] # SYLOTI NAGRI LETTER LO +A820 ; [.297B.0020.0002] # SYLOTI NAGRI LETTER RRO +A821 ; [.297C.0020.0002] # SYLOTI NAGRI LETTER SO +A822 ; [.297D.0020.0002] # SYLOTI NAGRI LETTER HO +A823 ; [.297E.0020.0002] # SYLOTI NAGRI VOWEL SIGN A +A824 ; [.297F.0020.0002] # SYLOTI NAGRI VOWEL SIGN I +A825 ; [.2980.0020.0002] # SYLOTI NAGRI VOWEL SIGN U +A826 ; [.2981.0020.0002] # SYLOTI NAGRI VOWEL SIGN E +A827 ; [.2982.0020.0002] # SYLOTI NAGRI VOWEL SIGN OO +A882 ; [.2983.0020.0002] # SAURASHTRA LETTER A +A883 ; [.2984.0020.0002] # SAURASHTRA LETTER AA +A884 ; [.2985.0020.0002] # SAURASHTRA LETTER I +A885 ; [.2986.0020.0002] # SAURASHTRA LETTER II +A886 ; [.2987.0020.0002] # SAURASHTRA LETTER U +A887 ; [.2988.0020.0002] # SAURASHTRA LETTER UU +A888 ; [.2989.0020.0002] # SAURASHTRA LETTER VOCALIC R +A889 ; [.298A.0020.0002] # SAURASHTRA LETTER VOCALIC RR +A88A ; [.298B.0020.0002] # SAURASHTRA LETTER VOCALIC L +A88B ; [.298C.0020.0002] # SAURASHTRA LETTER VOCALIC LL +A88C ; [.298D.0020.0002] # SAURASHTRA LETTER E +A88D ; [.298E.0020.0002] # SAURASHTRA LETTER EE +A88E ; [.298F.0020.0002] # SAURASHTRA LETTER AI +A88F ; [.2990.0020.0002] # SAURASHTRA LETTER O +A890 ; [.2991.0020.0002] # SAURASHTRA LETTER OO +A891 ; [.2992.0020.0002] # SAURASHTRA LETTER AU +A892 ; [.2993.0020.0002] # SAURASHTRA LETTER KA +A893 ; [.2994.0020.0002] # SAURASHTRA LETTER KHA +A894 ; [.2995.0020.0002] # SAURASHTRA LETTER GA +A895 ; [.2996.0020.0002] # SAURASHTRA LETTER GHA +A896 ; [.2997.0020.0002] # SAURASHTRA LETTER NGA +A897 ; [.2998.0020.0002] # SAURASHTRA LETTER CA +A898 ; [.2999.0020.0002] # SAURASHTRA LETTER CHA +A899 ; [.299A.0020.0002] # SAURASHTRA LETTER JA +A89A ; [.299B.0020.0002] # SAURASHTRA LETTER JHA +A89B ; [.299C.0020.0002] # SAURASHTRA LETTER NYA +A89C ; [.299D.0020.0002] # SAURASHTRA LETTER TTA +A89D ; [.299E.0020.0002] # SAURASHTRA LETTER TTHA +A89E ; [.299F.0020.0002] # SAURASHTRA LETTER DDA +A89F ; [.29A0.0020.0002] # SAURASHTRA LETTER DDHA +A8A0 ; [.29A1.0020.0002] # SAURASHTRA LETTER NNA +A8A1 ; [.29A2.0020.0002] # SAURASHTRA LETTER TA +A8A2 ; [.29A3.0020.0002] # SAURASHTRA LETTER THA +A8A3 ; [.29A4.0020.0002] # SAURASHTRA LETTER DA +A8A4 ; [.29A5.0020.0002] # SAURASHTRA LETTER DHA +A8A5 ; [.29A6.0020.0002] # SAURASHTRA LETTER NA +A8A6 ; [.29A7.0020.0002] # SAURASHTRA LETTER PA +A8A7 ; [.29A8.0020.0002] # SAURASHTRA LETTER PHA +A8A8 ; [.29A9.0020.0002] # SAURASHTRA LETTER BA +A8A9 ; [.29AA.0020.0002] # SAURASHTRA LETTER BHA +A8AA ; [.29AB.0020.0002] # SAURASHTRA LETTER MA +A8AB ; [.29AC.0020.0002] # SAURASHTRA LETTER YA +A8AC ; [.29AD.0020.0002] # SAURASHTRA LETTER RA +A8AD ; [.29AE.0020.0002] # SAURASHTRA LETTER LA +A8AE ; [.29AF.0020.0002] # SAURASHTRA LETTER VA +A8AF ; [.29B0.0020.0002] # SAURASHTRA LETTER SHA +A8B0 ; [.29B1.0020.0002] # SAURASHTRA LETTER SSA +A8B1 ; [.29B2.0020.0002] # SAURASHTRA LETTER SA +A8B2 ; [.29B3.0020.0002] # SAURASHTRA LETTER HA +A8B3 ; [.29B4.0020.0002] # SAURASHTRA LETTER LLA +A8B4 ; [.29B5.0020.0002] # SAURASHTRA CONSONANT SIGN HAARU +A8B5 ; [.29B6.0020.0002] # SAURASHTRA VOWEL SIGN AA +A8B6 ; [.29B7.0020.0002] # SAURASHTRA VOWEL SIGN I +A8B7 ; [.29B8.0020.0002] # SAURASHTRA VOWEL SIGN II +A8B8 ; [.29B9.0020.0002] # SAURASHTRA VOWEL SIGN U +A8B9 ; [.29BA.0020.0002] # SAURASHTRA VOWEL SIGN UU +A8BA ; [.29BB.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC R +A8BB ; [.29BC.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC RR +A8BC ; [.29BD.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC L +A8BD ; [.29BE.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC LL +A8BE ; [.29BF.0020.0002] # SAURASHTRA VOWEL SIGN E +A8BF ; [.29C0.0020.0002] # SAURASHTRA VOWEL SIGN EE +A8C0 ; [.29C1.0020.0002] # SAURASHTRA VOWEL SIGN AI +A8C1 ; [.29C2.0020.0002] # SAURASHTRA VOWEL SIGN O +A8C2 ; [.29C3.0020.0002] # SAURASHTRA VOWEL SIGN OO +A8C3 ; [.29C4.0020.0002] # SAURASHTRA VOWEL SIGN AU +A8C4 ; [.29C5.0020.0002] # SAURASHTRA SIGN VIRAMA +11083 ; [.29C6.0020.0002] # KAITHI LETTER A +11084 ; [.29C7.0020.0002] # KAITHI LETTER AA +11085 ; [.29C8.0020.0002] # KAITHI LETTER I +11086 ; [.29C9.0020.0002] # KAITHI LETTER II +11087 ; [.29CA.0020.0002] # KAITHI LETTER U +11088 ; [.29CB.0020.0002] # KAITHI LETTER UU +11089 ; [.29CC.0020.0002] # KAITHI LETTER E +1108A ; [.29CD.0020.0002] # KAITHI LETTER AI +1108B ; [.29CE.0020.0002] # KAITHI LETTER O +1108C ; [.29CF.0020.0002] # KAITHI LETTER AU +1108D ; [.29D0.0020.0002] # KAITHI LETTER KA +1108E ; [.29D1.0020.0002] # KAITHI LETTER KHA +1108F ; [.29D2.0020.0002] # KAITHI LETTER GA +11090 ; [.29D3.0020.0002] # KAITHI LETTER GHA +11091 ; [.29D4.0020.0002] # KAITHI LETTER NGA +11092 ; [.29D5.0020.0002] # KAITHI LETTER CA +11093 ; [.29D6.0020.0002] # KAITHI LETTER CHA +11094 ; [.29D7.0020.0002] # KAITHI LETTER JA +11095 ; [.29D8.0020.0002] # KAITHI LETTER JHA +11096 ; [.29D9.0020.0002] # KAITHI LETTER NYA +11097 ; [.29DA.0020.0002] # KAITHI LETTER TTA +11098 ; [.29DB.0020.0002] # KAITHI LETTER TTHA +11099 ; [.29DC.0020.0002] # KAITHI LETTER DDA +1109A ; [.29DC.0020.0002][.0000.00C2.0002] # KAITHI LETTER DDDHA +1109B ; [.29DD.0020.0002] # KAITHI LETTER DDHA +1109C ; [.29DD.0020.0002][.0000.00C2.0002] # KAITHI LETTER RHA +1109D ; [.29DE.0020.0002] # KAITHI LETTER NNA +1109E ; [.29DF.0020.0002] # KAITHI LETTER TA +1109F ; [.29E0.0020.0002] # KAITHI LETTER THA +110A0 ; [.29E1.0020.0002] # KAITHI LETTER DA +110A1 ; [.29E2.0020.0002] # KAITHI LETTER DHA +110A2 ; [.29E3.0020.0002] # KAITHI LETTER NA +110A3 ; [.29E4.0020.0002] # KAITHI LETTER PA +110A4 ; [.29E5.0020.0002] # KAITHI LETTER PHA +110A5 ; [.29E6.0020.0002] # KAITHI LETTER BA +110AB ; [.29E6.0020.0002][.0000.00C2.0002] # KAITHI LETTER VA +110A6 ; [.29E7.0020.0002] # KAITHI LETTER BHA +110A7 ; [.29E8.0020.0002] # KAITHI LETTER MA +110A8 ; [.29E9.0020.0002] # KAITHI LETTER YA +110A9 ; [.29EA.0020.0002] # KAITHI LETTER RA +110AA ; [.29EB.0020.0002] # KAITHI LETTER LA +110AC ; [.29EC.0020.0002] # KAITHI LETTER SHA +110AD ; [.29ED.0020.0002] # KAITHI LETTER SSA +110AE ; [.29EE.0020.0002] # KAITHI LETTER SA +110AF ; [.29EF.0020.0002] # KAITHI LETTER HA +110B0 ; [.29F0.0020.0002] # KAITHI VOWEL SIGN AA +110B1 ; [.29F1.0020.0002] # KAITHI VOWEL SIGN I +110B2 ; [.29F2.0020.0002] # KAITHI VOWEL SIGN II +110B3 ; [.29F3.0020.0002] # KAITHI VOWEL SIGN U +110B4 ; [.29F4.0020.0002] # KAITHI VOWEL SIGN UU +110B5 ; [.29F5.0020.0002] # KAITHI VOWEL SIGN E +110B6 ; [.29F6.0020.0002] # KAITHI VOWEL SIGN AI +110B7 ; [.29F7.0020.0002] # KAITHI VOWEL SIGN O +110B8 ; [.29F8.0020.0002] # KAITHI VOWEL SIGN AU +110B9 ; [.29F9.0020.0002] # KAITHI SIGN VIRAMA +11150 ; [.29FA.0020.0002] # MAHAJANI LETTER A +11151 ; [.29FB.0020.0002] # MAHAJANI LETTER I +11152 ; [.29FC.0020.0002] # MAHAJANI LETTER U +11153 ; [.29FD.0020.0002] # MAHAJANI LETTER E +11154 ; [.29FE.0020.0002] # MAHAJANI LETTER O +11155 ; [.29FF.0020.0002] # MAHAJANI LETTER KA +11156 ; [.2A00.0020.0002] # MAHAJANI LETTER KHA +11157 ; [.2A01.0020.0002] # MAHAJANI LETTER GA +11158 ; [.2A02.0020.0002] # MAHAJANI LETTER GHA +11159 ; [.2A03.0020.0002] # MAHAJANI LETTER CA +1115A ; [.2A04.0020.0002] # MAHAJANI LETTER CHA +1115B ; [.2A05.0020.0002] # MAHAJANI LETTER JA +1115C ; [.2A06.0020.0002] # MAHAJANI LETTER JHA +1115D ; [.2A07.0020.0002] # MAHAJANI LETTER NYA +1115E ; [.2A08.0020.0002] # MAHAJANI LETTER TTA +1115F ; [.2A09.0020.0002] # MAHAJANI LETTER TTHA +11160 ; [.2A0A.0020.0002] # MAHAJANI LETTER DDA +11161 ; [.2A0B.0020.0002] # MAHAJANI LETTER DDHA +11162 ; [.2A0C.0020.0002] # MAHAJANI LETTER NNA +11163 ; [.2A0D.0020.0002] # MAHAJANI LETTER TA +11164 ; [.2A0E.0020.0002] # MAHAJANI LETTER THA +11165 ; [.2A0F.0020.0002] # MAHAJANI LETTER DA +11166 ; [.2A10.0020.0002] # MAHAJANI LETTER DHA +11167 ; [.2A11.0020.0002] # MAHAJANI LETTER NA +11168 ; [.2A12.0020.0002] # MAHAJANI LETTER PA +11169 ; [.2A13.0020.0002] # MAHAJANI LETTER PHA +1116A ; [.2A14.0020.0002] # MAHAJANI LETTER BA +1116B ; [.2A15.0020.0002] # MAHAJANI LETTER BHA +1116C ; [.2A16.0020.0002] # MAHAJANI LETTER MA +1116D ; [.2A17.0020.0002] # MAHAJANI LETTER RA +1116E ; [.2A18.0020.0002] # MAHAJANI LETTER LA +1116F ; [.2A19.0020.0002] # MAHAJANI LETTER VA +11176 ; [.2A1A.0020.0002] # MAHAJANI LIGATURE SHRI +11170 ; [.2A1B.0020.0002] # MAHAJANI LETTER SA +11171 ; [.2A1C.0020.0002] # MAHAJANI LETTER HA +11172 ; [.2A1D.0020.0002] # MAHAJANI LETTER RRA +111C4 ; [.2A1E.0020.0002] # SHARADA OM +111DA ; [.2A1F.0020.0002] # SHARADA EKAM +11183 ; [.2A20.0020.0002] # SHARADA LETTER A +11184 ; [.2A21.0020.0002] # SHARADA LETTER AA +11185 ; [.2A22.0020.0002] # SHARADA LETTER I +11186 ; [.2A23.0020.0002] # SHARADA LETTER II +11187 ; [.2A24.0020.0002] # SHARADA LETTER U +11188 ; [.2A25.0020.0002] # SHARADA LETTER UU +11189 ; [.2A26.0020.0002] # SHARADA LETTER VOCALIC R +1118A ; [.2A27.0020.0002] # SHARADA LETTER VOCALIC RR +1118B ; [.2A28.0020.0002] # SHARADA LETTER VOCALIC L +1118C ; [.2A29.0020.0002] # SHARADA LETTER VOCALIC LL +1118D ; [.2A2A.0020.0002] # SHARADA LETTER E +1118E ; [.2A2B.0020.0002] # SHARADA LETTER AI +1118F ; [.2A2C.0020.0002] # SHARADA LETTER O +11190 ; [.2A2D.0020.0002] # SHARADA LETTER AU +11191 ; [.2A2E.0020.0002] # SHARADA LETTER KA +11192 ; [.2A2F.0020.0002] # SHARADA LETTER KHA +11193 ; [.2A30.0020.0002] # SHARADA LETTER GA +11194 ; [.2A31.0020.0002] # SHARADA LETTER GHA +11195 ; [.2A32.0020.0002] # SHARADA LETTER NGA +11196 ; [.2A33.0020.0002] # SHARADA LETTER CA +11197 ; [.2A34.0020.0002] # SHARADA LETTER CHA +11198 ; [.2A35.0020.0002] # SHARADA LETTER JA +11199 ; [.2A36.0020.0002] # SHARADA LETTER JHA +1119A ; [.2A37.0020.0002] # SHARADA LETTER NYA +1119B ; [.2A38.0020.0002] # SHARADA LETTER TTA +1119C ; [.2A39.0020.0002] # SHARADA LETTER TTHA +1119D ; [.2A3A.0020.0002] # SHARADA LETTER DDA +1119E ; [.2A3B.0020.0002] # SHARADA LETTER DDHA +1119F ; [.2A3C.0020.0002] # SHARADA LETTER NNA +111A0 ; [.2A3D.0020.0002] # SHARADA LETTER TA +111A1 ; [.2A3E.0020.0002] # SHARADA LETTER THA +111A2 ; [.2A3F.0020.0002] # SHARADA LETTER DA +111A3 ; [.2A40.0020.0002] # SHARADA LETTER DHA +111A4 ; [.2A41.0020.0002] # SHARADA LETTER NA +111A5 ; [.2A42.0020.0002] # SHARADA LETTER PA +111A6 ; [.2A43.0020.0002] # SHARADA LETTER PHA +111A7 ; [.2A44.0020.0002] # SHARADA LETTER BA +111A8 ; [.2A45.0020.0002] # SHARADA LETTER BHA +111A9 ; [.2A46.0020.0002] # SHARADA LETTER MA +111AA ; [.2A47.0020.0002] # SHARADA LETTER YA +111AB ; [.2A48.0020.0002] # SHARADA LETTER RA +111AC ; [.2A49.0020.0002] # SHARADA LETTER LA +111AD ; [.2A4A.0020.0002] # SHARADA LETTER LLA +111AE ; [.2A4B.0020.0002] # SHARADA LETTER VA +111AF ; [.2A4C.0020.0002] # SHARADA LETTER SHA +111B0 ; [.2A4D.0020.0002] # SHARADA LETTER SSA +111B1 ; [.2A4E.0020.0002] # SHARADA LETTER SA +111B2 ; [.2A4F.0020.0002] # SHARADA LETTER HA +111C1 ; [.2A50.0020.0002] # SHARADA SIGN AVAGRAHA +111C2 ; [.2A51.0020.0002] # SHARADA SIGN JIHVAMULIYA +111C3 ; [.2A52.0020.0002] # SHARADA SIGN UPADHMANIYA +111DC ; [.2A53.0020.0002] # SHARADA HEADSTROKE +111B3 ; [.2A54.0020.0002] # SHARADA VOWEL SIGN AA +111B4 ; [.2A55.0020.0002] # SHARADA VOWEL SIGN I +111B5 ; [.2A56.0020.0002] # SHARADA VOWEL SIGN II +111B6 ; [.2A57.0020.0002] # SHARADA VOWEL SIGN U +111B7 ; [.2A58.0020.0002] # SHARADA VOWEL SIGN UU +111B8 ; [.2A59.0020.0002] # SHARADA VOWEL SIGN VOCALIC R +111B9 ; [.2A5A.0020.0002] # SHARADA VOWEL SIGN VOCALIC RR +111BA ; [.2A5B.0020.0002] # SHARADA VOWEL SIGN VOCALIC L +111BB ; [.2A5C.0020.0002] # SHARADA VOWEL SIGN VOCALIC LL +111BC ; [.2A5D.0020.0002] # SHARADA VOWEL SIGN E +111BD ; [.2A5E.0020.0002] # SHARADA VOWEL SIGN AI +111BE ; [.2A5F.0020.0002] # SHARADA VOWEL SIGN O +111BF ; [.2A60.0020.0002] # SHARADA VOWEL SIGN AU +111C0 ; [.2A61.0020.0002] # SHARADA SIGN VIRAMA +11200 ; [.2A62.0020.0002] # KHOJKI LETTER A +11201 ; [.2A63.0020.0002] # KHOJKI LETTER AA +11202 ; [.2A64.0020.0002] # KHOJKI LETTER I +11203 ; [.2A65.0020.0002] # KHOJKI LETTER U +11204 ; [.2A66.0020.0002] # KHOJKI LETTER E +11205 ; [.2A67.0020.0002] # KHOJKI LETTER AI +11206 ; [.2A68.0020.0002] # KHOJKI LETTER O +11207 ; [.2A69.0020.0002] # KHOJKI LETTER AU +11208 ; [.2A6A.0020.0002] # KHOJKI LETTER KA +11209 ; [.2A6B.0020.0002] # KHOJKI LETTER KHA +1120A ; [.2A6C.0020.0002] # KHOJKI LETTER GA +1120B ; [.2A6D.0020.0002] # KHOJKI LETTER GGA +1120C ; [.2A6E.0020.0002] # KHOJKI LETTER GHA +1120D ; [.2A6F.0020.0002] # KHOJKI LETTER NGA +1120E ; [.2A70.0020.0002] # KHOJKI LETTER CA +1120F ; [.2A71.0020.0002] # KHOJKI LETTER CHA +11210 ; [.2A72.0020.0002] # KHOJKI LETTER JA +11211 ; [.2A73.0020.0002] # KHOJKI LETTER JJA +11213 ; [.2A74.0020.0002] # KHOJKI LETTER NYA +11214 ; [.2A75.0020.0002] # KHOJKI LETTER TTA +11215 ; [.2A76.0020.0002] # KHOJKI LETTER TTHA +11216 ; [.2A77.0020.0002] # KHOJKI LETTER DDA +11217 ; [.2A78.0020.0002] # KHOJKI LETTER DDHA +11218 ; [.2A79.0020.0002] # KHOJKI LETTER NNA +11219 ; [.2A7A.0020.0002] # KHOJKI LETTER TA +1121A ; [.2A7B.0020.0002] # KHOJKI LETTER THA +1121B ; [.2A7C.0020.0002] # KHOJKI LETTER DA +1121C ; [.2A7D.0020.0002] # KHOJKI LETTER DDDA +1121D ; [.2A7E.0020.0002] # KHOJKI LETTER DHA +1121E ; [.2A7F.0020.0002] # KHOJKI LETTER NA +1121F ; [.2A80.0020.0002] # KHOJKI LETTER PA +11220 ; [.2A81.0020.0002] # KHOJKI LETTER PHA +11221 ; [.2A82.0020.0002] # KHOJKI LETTER BA +11222 ; [.2A83.0020.0002] # KHOJKI LETTER BBA +11223 ; [.2A84.0020.0002] # KHOJKI LETTER BHA +11224 ; [.2A85.0020.0002] # KHOJKI LETTER MA +11225 ; [.2A86.0020.0002] # KHOJKI LETTER YA +11226 ; [.2A87.0020.0002] # KHOJKI LETTER RA +11227 ; [.2A88.0020.0002] # KHOJKI LETTER LA +11228 ; [.2A89.0020.0002] # KHOJKI LETTER VA +11229 ; [.2A8A.0020.0002] # KHOJKI LETTER SA +1122A ; [.2A8B.0020.0002] # KHOJKI LETTER HA +1122B ; [.2A8C.0020.0002] # KHOJKI LETTER LLA +1122C ; [.2A8D.0020.0002] # KHOJKI VOWEL SIGN AA +1122D ; [.2A8E.0020.0002] # KHOJKI VOWEL SIGN I +1122E ; [.2A8F.0020.0002] # KHOJKI VOWEL SIGN II +1122F ; [.2A90.0020.0002] # KHOJKI VOWEL SIGN U +11230 ; [.2A91.0020.0002] # KHOJKI VOWEL SIGN E +11231 ; [.2A92.0020.0002] # KHOJKI VOWEL SIGN AI +11232 ; [.2A93.0020.0002] # KHOJKI VOWEL SIGN O +11233 ; [.2A94.0020.0002] # KHOJKI VOWEL SIGN AU +11235 ; [.2A95.0020.0002] # KHOJKI SIGN VIRAMA +112B0 ; [.2A96.0020.0002] # KHUDAWADI LETTER A +112B1 ; [.2A97.0020.0002] # KHUDAWADI LETTER AA +112B2 ; [.2A98.0020.0002] # KHUDAWADI LETTER I +112B3 ; [.2A99.0020.0002] # KHUDAWADI LETTER II +112B4 ; [.2A9A.0020.0002] # KHUDAWADI LETTER U +112B5 ; [.2A9B.0020.0002] # KHUDAWADI LETTER UU +112B6 ; [.2A9C.0020.0002] # KHUDAWADI LETTER E +112B7 ; [.2A9D.0020.0002] # KHUDAWADI LETTER AI +112B8 ; [.2A9E.0020.0002] # KHUDAWADI LETTER O +112B9 ; [.2A9F.0020.0002] # KHUDAWADI LETTER AU +112BA ; [.2AA0.0020.0002] # KHUDAWADI LETTER KA +112BB ; [.2AA1.0020.0002] # KHUDAWADI LETTER KHA +112BC ; [.2AA2.0020.0002] # KHUDAWADI LETTER GA +112BD ; [.2AA3.0020.0002] # KHUDAWADI LETTER GGA +112BE ; [.2AA4.0020.0002] # KHUDAWADI LETTER GHA +112BF ; [.2AA5.0020.0002] # KHUDAWADI LETTER NGA +112C0 ; [.2AA6.0020.0002] # KHUDAWADI LETTER CA +112C1 ; [.2AA7.0020.0002] # KHUDAWADI LETTER CHA +112C2 ; [.2AA8.0020.0002] # KHUDAWADI LETTER JA +112C3 ; [.2AA9.0020.0002] # KHUDAWADI LETTER JJA +112C4 ; [.2AAA.0020.0002] # KHUDAWADI LETTER JHA +112C5 ; [.2AAB.0020.0002] # KHUDAWADI LETTER NYA +112C6 ; [.2AAC.0020.0002] # KHUDAWADI LETTER TTA +112C7 ; [.2AAD.0020.0002] # KHUDAWADI LETTER TTHA +112C8 ; [.2AAE.0020.0002] # KHUDAWADI LETTER DDA +112C9 ; [.2AAF.0020.0002] # KHUDAWADI LETTER DDDA +112CA ; [.2AB0.0020.0002] # KHUDAWADI LETTER RRA +112CB ; [.2AB1.0020.0002] # KHUDAWADI LETTER DDHA +112CC ; [.2AB2.0020.0002] # KHUDAWADI LETTER NNA +112CD ; [.2AB3.0020.0002] # KHUDAWADI LETTER TA +112CE ; [.2AB4.0020.0002] # KHUDAWADI LETTER THA +112CF ; [.2AB5.0020.0002] # KHUDAWADI LETTER DA +112D0 ; [.2AB6.0020.0002] # KHUDAWADI LETTER DHA +112D1 ; [.2AB7.0020.0002] # KHUDAWADI LETTER NA +112D2 ; [.2AB8.0020.0002] # KHUDAWADI LETTER PA +112D3 ; [.2AB9.0020.0002] # KHUDAWADI LETTER PHA +112D4 ; [.2ABA.0020.0002] # KHUDAWADI LETTER BA +112D5 ; [.2ABB.0020.0002] # KHUDAWADI LETTER BBA +112D6 ; [.2ABC.0020.0002] # KHUDAWADI LETTER BHA +112D7 ; [.2ABD.0020.0002] # KHUDAWADI LETTER MA +112D8 ; [.2ABE.0020.0002] # KHUDAWADI LETTER YA +112D9 ; [.2ABF.0020.0002] # KHUDAWADI LETTER RA +112DA ; [.2AC0.0020.0002] # KHUDAWADI LETTER LA +112DB ; [.2AC1.0020.0002] # KHUDAWADI LETTER VA +112DC ; [.2AC2.0020.0002] # KHUDAWADI LETTER SHA +112DD ; [.2AC3.0020.0002] # KHUDAWADI LETTER SA +112DE ; [.2AC4.0020.0002] # KHUDAWADI LETTER HA +112E0 ; [.2AC5.0020.0002] # KHUDAWADI VOWEL SIGN AA +112E1 ; [.2AC6.0020.0002] # KHUDAWADI VOWEL SIGN I +112E2 ; [.2AC7.0020.0002] # KHUDAWADI VOWEL SIGN II +112E3 ; [.2AC8.0020.0002] # KHUDAWADI VOWEL SIGN U +112E4 ; [.2AC9.0020.0002] # KHUDAWADI VOWEL SIGN UU +112E5 ; [.2ACA.0020.0002] # KHUDAWADI VOWEL SIGN E +112E6 ; [.2ACB.0020.0002] # KHUDAWADI VOWEL SIGN AI +112E7 ; [.2ACC.0020.0002] # KHUDAWADI VOWEL SIGN O +112E8 ; [.2ACD.0020.0002] # KHUDAWADI VOWEL SIGN AU +112EA ; [.2ACE.0020.0002] # KHUDAWADI SIGN VIRAMA +11280 ; [.2ACF.0020.0002] # MULTANI LETTER A +11281 ; [.2AD0.0020.0002] # MULTANI LETTER I +11282 ; [.2AD1.0020.0002] # MULTANI LETTER U +11283 ; [.2AD2.0020.0002] # MULTANI LETTER E +112A5 ; [.2AD3.0020.0002] # MULTANI LETTER SA +112A6 ; [.2AD4.0020.0002] # MULTANI LETTER HA +11284 ; [.2AD5.0020.0002] # MULTANI LETTER KA +11285 ; [.2AD6.0020.0002] # MULTANI LETTER KHA +11286 ; [.2AD7.0020.0002] # MULTANI LETTER GA +11288 ; [.2AD8.0020.0002] # MULTANI LETTER GHA +1128A ; [.2AD9.0020.0002] # MULTANI LETTER CA +1128B ; [.2ADA.0020.0002] # MULTANI LETTER CHA +1128C ; [.2ADB.0020.0002] # MULTANI LETTER JA +1128D ; [.2ADC.0020.0002] # MULTANI LETTER JJA +1128F ; [.2ADD.0020.0002] # MULTANI LETTER NYA +11290 ; [.2ADE.0020.0002] # MULTANI LETTER TTA +11291 ; [.2ADF.0020.0002] # MULTANI LETTER TTHA +11292 ; [.2AE0.0020.0002] # MULTANI LETTER DDA +11293 ; [.2AE1.0020.0002] # MULTANI LETTER DDDA +11294 ; [.2AE2.0020.0002] # MULTANI LETTER DDHA +11295 ; [.2AE3.0020.0002] # MULTANI LETTER NNA +11296 ; [.2AE4.0020.0002] # MULTANI LETTER TA +11297 ; [.2AE5.0020.0002] # MULTANI LETTER THA +11298 ; [.2AE6.0020.0002] # MULTANI LETTER DA +11299 ; [.2AE7.0020.0002] # MULTANI LETTER DHA +1129A ; [.2AE8.0020.0002] # MULTANI LETTER NA +1129B ; [.2AE9.0020.0002] # MULTANI LETTER PA +1129C ; [.2AEA.0020.0002] # MULTANI LETTER PHA +1129D ; [.2AEB.0020.0002] # MULTANI LETTER BA +1129F ; [.2AEC.0020.0002] # MULTANI LETTER BHA +112A0 ; [.2AED.0020.0002] # MULTANI LETTER MA +112A1 ; [.2AEE.0020.0002] # MULTANI LETTER YA +112A2 ; [.2AEF.0020.0002] # MULTANI LETTER RA +112A3 ; [.2AF0.0020.0002] # MULTANI LETTER LA +112A4 ; [.2AF1.0020.0002] # MULTANI LETTER VA +112A7 ; [.2AF2.0020.0002] # MULTANI LETTER RRA +112A8 ; [.2AF3.0020.0002] # MULTANI LETTER RHA +11350 ; [.2AF4.0020.0002] # GRANTHA OM +11305 ; [.2AF5.0020.0002] # GRANTHA LETTER A +11306 ; [.2AF6.0020.0002] # GRANTHA LETTER AA +11307 ; [.2AF7.0020.0002] # GRANTHA LETTER I +11308 ; [.2AF8.0020.0002] # GRANTHA LETTER II +11309 ; [.2AF9.0020.0002] # GRANTHA LETTER U +1130A ; [.2AFA.0020.0002] # GRANTHA LETTER UU +1130B ; [.2AFB.0020.0002] # GRANTHA LETTER VOCALIC R +11360 ; [.2AFC.0020.0002] # GRANTHA LETTER VOCALIC RR +1130C ; [.2AFD.0020.0002] # GRANTHA LETTER VOCALIC L +11361 ; [.2AFE.0020.0002] # GRANTHA LETTER VOCALIC LL +1130F ; [.2AFF.0020.0002] # GRANTHA LETTER EE +11310 ; [.2B00.0020.0002] # GRANTHA LETTER AI +11313 ; [.2B01.0020.0002] # GRANTHA LETTER OO +11314 ; [.2B02.0020.0002] # GRANTHA LETTER AU +11315 ; [.2B03.0020.0002] # GRANTHA LETTER KA +11316 ; [.2B04.0020.0002] # GRANTHA LETTER KHA +11317 ; [.2B05.0020.0002] # GRANTHA LETTER GA +11318 ; [.2B06.0020.0002] # GRANTHA LETTER GHA +11319 ; [.2B07.0020.0002] # GRANTHA LETTER NGA +1131A ; [.2B08.0020.0002] # GRANTHA LETTER CA +1131B ; [.2B09.0020.0002] # GRANTHA LETTER CHA +1131C ; [.2B0A.0020.0002] # GRANTHA LETTER JA +1131D ; [.2B0B.0020.0002] # GRANTHA LETTER JHA +1131E ; [.2B0C.0020.0002] # GRANTHA LETTER NYA +1131F ; [.2B0D.0020.0002] # GRANTHA LETTER TTA +11320 ; [.2B0E.0020.0002] # GRANTHA LETTER TTHA +11321 ; [.2B0F.0020.0002] # GRANTHA LETTER DDA +11322 ; [.2B10.0020.0002] # GRANTHA LETTER DDHA +11323 ; [.2B11.0020.0002] # GRANTHA LETTER NNA +11324 ; [.2B12.0020.0002] # GRANTHA LETTER TA +11325 ; [.2B13.0020.0002] # GRANTHA LETTER THA +11326 ; [.2B14.0020.0002] # GRANTHA LETTER DA +11327 ; [.2B15.0020.0002] # GRANTHA LETTER DHA +11328 ; [.2B16.0020.0002] # GRANTHA LETTER NA +1132A ; [.2B17.0020.0002] # GRANTHA LETTER PA +1132B ; [.2B18.0020.0002] # GRANTHA LETTER PHA +1132C ; [.2B19.0020.0002] # GRANTHA LETTER BA +1132D ; [.2B1A.0020.0002] # GRANTHA LETTER BHA +1132E ; [.2B1B.0020.0002] # GRANTHA LETTER MA +1132F ; [.2B1C.0020.0002] # GRANTHA LETTER YA +11330 ; [.2B1D.0020.0002] # GRANTHA LETTER RA +11332 ; [.2B1E.0020.0002] # GRANTHA LETTER LA +11333 ; [.2B1F.0020.0002] # GRANTHA LETTER LLA +11335 ; [.2B20.0020.0002] # GRANTHA LETTER VA +11336 ; [.2B21.0020.0002] # GRANTHA LETTER SHA +11337 ; [.2B22.0020.0002] # GRANTHA LETTER SSA +11338 ; [.2B23.0020.0002] # GRANTHA LETTER SA +11339 ; [.2B24.0020.0002] # GRANTHA LETTER HA +1133D ; [.2B25.0020.0002] # GRANTHA SIGN AVAGRAHA +1135E ; [.2B26.0020.0002] # GRANTHA LETTER VEDIC ANUSVARA +1135F ; [.2B27.0020.0002] # GRANTHA LETTER VEDIC DOUBLE ANUSVARA +1133E ; [.2B28.0020.0002] # GRANTHA VOWEL SIGN AA +1133F ; [.2B29.0020.0002] # GRANTHA VOWEL SIGN I +11340 ; [.2B2A.0020.0002] # GRANTHA VOWEL SIGN II +11341 ; [.2B2B.0020.0002] # GRANTHA VOWEL SIGN U +11342 ; [.2B2C.0020.0002] # GRANTHA VOWEL SIGN UU +11343 ; [.2B2D.0020.0002] # GRANTHA VOWEL SIGN VOCALIC R +11344 ; [.2B2E.0020.0002] # GRANTHA VOWEL SIGN VOCALIC RR +11362 ; [.2B2F.0020.0002] # GRANTHA VOWEL SIGN VOCALIC L +11363 ; [.2B30.0020.0002] # GRANTHA VOWEL SIGN VOCALIC LL +11347 ; [.2B31.0020.0002] # GRANTHA VOWEL SIGN EE +11348 ; [.2B32.0020.0002] # GRANTHA VOWEL SIGN AI +1134B ; [.2B33.0020.0002] # GRANTHA VOWEL SIGN OO +11347 1133E ; [.2B33.0020.0002] # GRANTHA VOWEL SIGN OO +1134C ; [.2B34.0020.0002] # GRANTHA VOWEL SIGN AU +11347 11357 ; [.2B34.0020.0002] # GRANTHA VOWEL SIGN AU +1134D ; [.2B35.0020.0002] # GRANTHA SIGN VIRAMA +11357 ; [.2B36.0020.0002] # GRANTHA AU LENGTH MARK +1135D ; [.2B37.0020.0002] # GRANTHA SIGN PLUTA +11449 ; [.2B38.0020.0002] # NEWA OM +1144A ; [.2B39.0020.0002] # NEWA SIDDHI +11400 ; [.2B3A.0020.0002] # NEWA LETTER A +11401 ; [.2B3B.0020.0002] # NEWA LETTER AA +11402 ; [.2B3C.0020.0002] # NEWA LETTER I +11403 ; [.2B3D.0020.0002] # NEWA LETTER II +11404 ; [.2B3E.0020.0002] # NEWA LETTER U +11405 ; [.2B3F.0020.0002] # NEWA LETTER UU +11406 ; [.2B40.0020.0002] # NEWA LETTER VOCALIC R +11407 ; [.2B41.0020.0002] # NEWA LETTER VOCALIC RR +11408 ; [.2B42.0020.0002] # NEWA LETTER VOCALIC L +11409 ; [.2B43.0020.0002] # NEWA LETTER VOCALIC LL +1140A ; [.2B44.0020.0002] # NEWA LETTER E +1140B ; [.2B45.0020.0002] # NEWA LETTER AI +1140C ; [.2B46.0020.0002] # NEWA LETTER O +1140D ; [.2B47.0020.0002] # NEWA LETTER AU +1140E ; [.2B48.0020.0002] # NEWA LETTER KA +1140F ; [.2B49.0020.0002] # NEWA LETTER KHA +11410 ; [.2B4A.0020.0002] # NEWA LETTER GA +11411 ; [.2B4B.0020.0002] # NEWA LETTER GHA +11412 ; [.2B4C.0020.0002] # NEWA LETTER NGA +11413 ; [.2B4D.0020.0002] # NEWA LETTER NGHA +11414 ; [.2B4E.0020.0002] # NEWA LETTER CA +11415 ; [.2B4F.0020.0002] # NEWA LETTER CHA +11416 ; [.2B50.0020.0002] # NEWA LETTER JA +11417 ; [.2B51.0020.0002] # NEWA LETTER JHA +11418 ; [.2B52.0020.0002] # NEWA LETTER NYA +11419 ; [.2B53.0020.0002] # NEWA LETTER NYHA +1141A ; [.2B54.0020.0002] # NEWA LETTER TTA +1141B ; [.2B55.0020.0002] # NEWA LETTER TTHA +1141C ; [.2B56.0020.0002] # NEWA LETTER DDA +1141D ; [.2B57.0020.0002] # NEWA LETTER DDHA +1141E ; [.2B58.0020.0002] # NEWA LETTER NNA +1141F ; [.2B59.0020.0002] # NEWA LETTER TA +11420 ; [.2B5A.0020.0002] # NEWA LETTER THA +11421 ; [.2B5B.0020.0002] # NEWA LETTER DA +11422 ; [.2B5C.0020.0002] # NEWA LETTER DHA +11423 ; [.2B5D.0020.0002] # NEWA LETTER NA +11424 ; [.2B5E.0020.0002] # NEWA LETTER NHA +11425 ; [.2B5F.0020.0002] # NEWA LETTER PA +11426 ; [.2B60.0020.0002] # NEWA LETTER PHA +11427 ; [.2B61.0020.0002] # NEWA LETTER BA +11428 ; [.2B62.0020.0002] # NEWA LETTER BHA +11429 ; [.2B63.0020.0002] # NEWA LETTER MA +1142A ; [.2B64.0020.0002] # NEWA LETTER MHA +1142B ; [.2B65.0020.0002] # NEWA LETTER YA +1142C ; [.2B66.0020.0002] # NEWA LETTER RA +1142D ; [.2B67.0020.0002] # NEWA LETTER RHA +1142E ; [.2B68.0020.0002] # NEWA LETTER LA +1142F ; [.2B69.0020.0002] # NEWA LETTER LHA +11430 ; [.2B6A.0020.0002] # NEWA LETTER WA +11431 ; [.2B6B.0020.0002] # NEWA LETTER SHA +11432 ; [.2B6C.0020.0002] # NEWA LETTER SSA +11433 ; [.2B6D.0020.0002] # NEWA LETTER SA +11434 ; [.2B6E.0020.0002] # NEWA LETTER HA +11447 ; [.2B6F.0020.0002] # NEWA SIGN AVAGRAHA +11448 ; [.2B70.0020.0002] # NEWA SIGN FINAL ANUSVARA +11435 ; [.2B71.0020.0002] # NEWA VOWEL SIGN AA +11436 ; [.2B72.0020.0002] # NEWA VOWEL SIGN I +11437 ; [.2B73.0020.0002] # NEWA VOWEL SIGN II +11438 ; [.2B74.0020.0002] # NEWA VOWEL SIGN U +11439 ; [.2B75.0020.0002] # NEWA VOWEL SIGN UU +1143A ; [.2B76.0020.0002] # NEWA VOWEL SIGN VOCALIC R +1143B ; [.2B77.0020.0002] # NEWA VOWEL SIGN VOCALIC RR +1143C ; [.2B78.0020.0002] # NEWA VOWEL SIGN VOCALIC L +1143D ; [.2B79.0020.0002] # NEWA VOWEL SIGN VOCALIC LL +1143E ; [.2B7A.0020.0002] # NEWA VOWEL SIGN E +1143F ; [.2B7B.0020.0002] # NEWA VOWEL SIGN AI +11440 ; [.2B7C.0020.0002] # NEWA VOWEL SIGN O +11441 ; [.2B7D.0020.0002] # NEWA VOWEL SIGN AU +11442 ; [.2B7E.0020.0002] # NEWA SIGN VIRAMA +114C7 ; [.2B7F.0020.0002] # TIRHUTA OM +11480 ; [.2B80.0020.0002] # TIRHUTA ANJI +11481 ; [.2B81.0020.0002] # TIRHUTA LETTER A +11482 ; [.2B82.0020.0002] # TIRHUTA LETTER AA +11483 ; [.2B83.0020.0002] # TIRHUTA LETTER I +11484 ; [.2B84.0020.0002] # TIRHUTA LETTER II +11485 ; [.2B85.0020.0002] # TIRHUTA LETTER U +11486 ; [.2B86.0020.0002] # TIRHUTA LETTER UU +11487 ; [.2B87.0020.0002] # TIRHUTA LETTER VOCALIC R +11488 ; [.2B88.0020.0002] # TIRHUTA LETTER VOCALIC RR +11489 ; [.2B89.0020.0002] # TIRHUTA LETTER VOCALIC L +1148A ; [.2B8A.0020.0002] # TIRHUTA LETTER VOCALIC LL +1148B ; [.2B8B.0020.0002] # TIRHUTA LETTER E +1148C ; [.2B8C.0020.0002] # TIRHUTA LETTER AI +1148D ; [.2B8D.0020.0002] # TIRHUTA LETTER O +1148E ; [.2B8E.0020.0002] # TIRHUTA LETTER AU +1148F ; [.2B8F.0020.0002] # TIRHUTA LETTER KA +11490 ; [.2B90.0020.0002] # TIRHUTA LETTER KHA +11491 ; [.2B91.0020.0002] # TIRHUTA LETTER GA +11492 ; [.2B92.0020.0002] # TIRHUTA LETTER GHA +11493 ; [.2B93.0020.0002] # TIRHUTA LETTER NGA +11494 ; [.2B94.0020.0002] # TIRHUTA LETTER CA +11495 ; [.2B95.0020.0002] # TIRHUTA LETTER CHA +11496 ; [.2B96.0020.0002] # TIRHUTA LETTER JA +11497 ; [.2B97.0020.0002] # TIRHUTA LETTER JHA +11498 ; [.2B98.0020.0002] # TIRHUTA LETTER NYA +11499 ; [.2B99.0020.0002] # TIRHUTA LETTER TTA +1149A ; [.2B9A.0020.0002] # TIRHUTA LETTER TTHA +1149B ; [.2B9B.0020.0002] # TIRHUTA LETTER DDA +1149C ; [.2B9C.0020.0002] # TIRHUTA LETTER DDHA +1149D ; [.2B9D.0020.0002] # TIRHUTA LETTER NNA +1149E ; [.2B9E.0020.0002] # TIRHUTA LETTER TA +1149F ; [.2B9F.0020.0002] # TIRHUTA LETTER THA +114A0 ; [.2BA0.0020.0002] # TIRHUTA LETTER DA +114A1 ; [.2BA1.0020.0002] # TIRHUTA LETTER DHA +114A2 ; [.2BA2.0020.0002] # TIRHUTA LETTER NA +114A3 ; [.2BA3.0020.0002] # TIRHUTA LETTER PA +114A4 ; [.2BA4.0020.0002] # TIRHUTA LETTER PHA +114A5 ; [.2BA5.0020.0002] # TIRHUTA LETTER BA +114A6 ; [.2BA6.0020.0002] # TIRHUTA LETTER BHA +114A7 ; [.2BA7.0020.0002] # TIRHUTA LETTER MA +114A8 ; [.2BA8.0020.0002] # TIRHUTA LETTER YA +114A9 ; [.2BA9.0020.0002] # TIRHUTA LETTER RA +114AA ; [.2BAA.0020.0002] # TIRHUTA LETTER LA +114AB ; [.2BAB.0020.0002] # TIRHUTA LETTER VA +114AC ; [.2BAC.0020.0002] # TIRHUTA LETTER SHA +114AD ; [.2BAD.0020.0002] # TIRHUTA LETTER SSA +114AE ; [.2BAE.0020.0002] # TIRHUTA LETTER SA +114AF ; [.2BAF.0020.0002] # TIRHUTA LETTER HA +114C4 ; [.2BB0.0020.0002] # TIRHUTA SIGN AVAGRAHA +114C5 ; [.2BB1.0020.0002] # TIRHUTA GVANG +114B0 ; [.2BB2.0020.0002] # TIRHUTA VOWEL SIGN AA +114B1 ; [.2BB3.0020.0002] # TIRHUTA VOWEL SIGN I +114B2 ; [.2BB4.0020.0002] # TIRHUTA VOWEL SIGN II +114B3 ; [.2BB5.0020.0002] # TIRHUTA VOWEL SIGN U +114B4 ; [.2BB6.0020.0002] # TIRHUTA VOWEL SIGN UU +114B5 ; [.2BB7.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC R +114B6 ; [.2BB8.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC RR +114B7 ; [.2BB9.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC L +114B8 ; [.2BBA.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; [.2BBB.0020.0002] # TIRHUTA VOWEL SIGN E +114BA ; [.2BBC.0020.0002] # TIRHUTA VOWEL SIGN SHORT E +114BB ; [.2BBD.0020.0002] # TIRHUTA VOWEL SIGN AI +114B9 114BA ; [.2BBD.0020.0002] # TIRHUTA VOWEL SIGN AI +114BC ; [.2BBE.0020.0002] # TIRHUTA VOWEL SIGN O +114B9 114B0 ; [.2BBE.0020.0002] # TIRHUTA VOWEL SIGN O +114BD ; [.2BBF.0020.0002] # TIRHUTA VOWEL SIGN SHORT O +114BE ; [.2BC0.0020.0002] # TIRHUTA VOWEL SIGN AU +114B9 114BD ; [.2BC0.0020.0002] # TIRHUTA VOWEL SIGN AU +114C2 ; [.2BC1.0020.0002] # TIRHUTA SIGN VIRAMA +11580 ; [.2BC2.0020.0002] # SIDDHAM LETTER A +11581 ; [.2BC3.0020.0002] # SIDDHAM LETTER AA +11582 ; [.2BC4.0020.0002] # SIDDHAM LETTER I +115D8 ; [.2BC4.0020.0004][.0000.0110.0004] # SIDDHAM LETTER THREE-CIRCLE ALTERNATE I +115D9 ; [.2BC4.0020.0004][.0000.0111.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE I +11583 ; [.2BC5.0020.0002] # SIDDHAM LETTER II +115DA ; [.2BC5.0020.0004][.0000.0110.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE II +11584 ; [.2BC6.0020.0002] # SIDDHAM LETTER U +115DB ; [.2BC6.0020.0004][.0000.0110.0004] # SIDDHAM LETTER ALTERNATE U +11585 ; [.2BC7.0020.0002] # SIDDHAM LETTER UU +11586 ; [.2BC8.0020.0002] # SIDDHAM LETTER VOCALIC R +11587 ; [.2BC9.0020.0002] # SIDDHAM LETTER VOCALIC RR +11588 ; [.2BCA.0020.0002] # SIDDHAM LETTER VOCALIC L +11589 ; [.2BCB.0020.0002] # SIDDHAM LETTER VOCALIC LL +1158A ; [.2BCC.0020.0002] # SIDDHAM LETTER E +1158B ; [.2BCD.0020.0002] # SIDDHAM LETTER AI +1158C ; [.2BCE.0020.0002] # SIDDHAM LETTER O +1158D ; [.2BCF.0020.0002] # SIDDHAM LETTER AU +1158E ; [.2BD0.0020.0002] # SIDDHAM LETTER KA +1158F ; [.2BD1.0020.0002] # SIDDHAM LETTER KHA +11590 ; [.2BD2.0020.0002] # SIDDHAM LETTER GA +11591 ; [.2BD3.0020.0002] # SIDDHAM LETTER GHA +11592 ; [.2BD4.0020.0002] # SIDDHAM LETTER NGA +11593 ; [.2BD5.0020.0002] # SIDDHAM LETTER CA +11594 ; [.2BD6.0020.0002] # SIDDHAM LETTER CHA +11595 ; [.2BD7.0020.0002] # SIDDHAM LETTER JA +11596 ; [.2BD8.0020.0002] # SIDDHAM LETTER JHA +11597 ; [.2BD9.0020.0002] # SIDDHAM LETTER NYA +11598 ; [.2BDA.0020.0002] # SIDDHAM LETTER TTA +11599 ; [.2BDB.0020.0002] # SIDDHAM LETTER TTHA +1159A ; [.2BDC.0020.0002] # SIDDHAM LETTER DDA +1159B ; [.2BDD.0020.0002] # SIDDHAM LETTER DDHA +1159C ; [.2BDE.0020.0002] # SIDDHAM LETTER NNA +1159D ; [.2BDF.0020.0002] # SIDDHAM LETTER TA +1159E ; [.2BE0.0020.0002] # SIDDHAM LETTER THA +1159F ; [.2BE1.0020.0002] # SIDDHAM LETTER DA +115A0 ; [.2BE2.0020.0002] # SIDDHAM LETTER DHA +115A1 ; [.2BE3.0020.0002] # SIDDHAM LETTER NA +115A2 ; [.2BE4.0020.0002] # SIDDHAM LETTER PA +115A3 ; [.2BE5.0020.0002] # SIDDHAM LETTER PHA +115A4 ; [.2BE6.0020.0002] # SIDDHAM LETTER BA +115A5 ; [.2BE7.0020.0002] # SIDDHAM LETTER BHA +115A6 ; [.2BE8.0020.0002] # SIDDHAM LETTER MA +115A7 ; [.2BE9.0020.0002] # SIDDHAM LETTER YA +115A8 ; [.2BEA.0020.0002] # SIDDHAM LETTER RA +115A9 ; [.2BEB.0020.0002] # SIDDHAM LETTER LA +115AA ; [.2BEC.0020.0002] # SIDDHAM LETTER VA +115AB ; [.2BED.0020.0002] # SIDDHAM LETTER SHA +115AC ; [.2BEE.0020.0002] # SIDDHAM LETTER SSA +115AD ; [.2BEF.0020.0002] # SIDDHAM LETTER SA +115AE ; [.2BF0.0020.0002] # SIDDHAM LETTER HA +115AF ; [.2BF1.0020.0002] # SIDDHAM VOWEL SIGN AA +115B0 ; [.2BF2.0020.0002] # SIDDHAM VOWEL SIGN I +115B1 ; [.2BF3.0020.0002] # SIDDHAM VOWEL SIGN II +115B2 ; [.2BF4.0020.0002] # SIDDHAM VOWEL SIGN U +115DC ; [.2BF4.0020.0004][.0000.0110.0004] # SIDDHAM VOWEL SIGN ALTERNATE U +115B3 ; [.2BF5.0020.0002] # SIDDHAM VOWEL SIGN UU +115DD ; [.2BF5.0020.0004][.0000.0110.0004] # SIDDHAM VOWEL SIGN ALTERNATE UU +115B4 ; [.2BF6.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC R +115B5 ; [.2BF7.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC RR +115B8 ; [.2BF8.0020.0002] # SIDDHAM VOWEL SIGN E +115B9 ; [.2BF9.0020.0002] # SIDDHAM VOWEL SIGN AI +115BA ; [.2BFA.0020.0002] # SIDDHAM VOWEL SIGN O +115B8 115AF ; [.2BFA.0020.0002] # SIDDHAM VOWEL SIGN O +115BB ; [.2BFB.0020.0002] # SIDDHAM VOWEL SIGN AU +115B9 115AF ; [.2BFB.0020.0002] # SIDDHAM VOWEL SIGN AU +115BF ; [.2BFC.0020.0002] # SIDDHAM SIGN VIRAMA +11600 ; [.2BFD.0020.0002] # MODI LETTER A +11601 ; [.2BFE.0020.0002] # MODI LETTER AA +11602 ; [.2BFF.0020.0002] # MODI LETTER I +11603 ; [.2C00.0020.0002] # MODI LETTER II +11604 ; [.2C01.0020.0002] # MODI LETTER U +11605 ; [.2C02.0020.0002] # MODI LETTER UU +11606 ; [.2C03.0020.0002] # MODI LETTER VOCALIC R +11607 ; [.2C04.0020.0002] # MODI LETTER VOCALIC RR +11608 ; [.2C05.0020.0002] # MODI LETTER VOCALIC L +11609 ; [.2C06.0020.0002] # MODI LETTER VOCALIC LL +1160A ; [.2C07.0020.0002] # MODI LETTER E +1160B ; [.2C08.0020.0002] # MODI LETTER AI +1160C ; [.2C09.0020.0002] # MODI LETTER O +1160D ; [.2C0A.0020.0002] # MODI LETTER AU +1160E ; [.2C0B.0020.0002] # MODI LETTER KA +1160F ; [.2C0C.0020.0002] # MODI LETTER KHA +11610 ; [.2C0D.0020.0002] # MODI LETTER GA +11611 ; [.2C0E.0020.0002] # MODI LETTER GHA +11612 ; [.2C0F.0020.0002] # MODI LETTER NGA +11613 ; [.2C10.0020.0002] # MODI LETTER CA +11614 ; [.2C11.0020.0002] # MODI LETTER CHA +11615 ; [.2C12.0020.0002] # MODI LETTER JA +11616 ; [.2C13.0020.0002] # MODI LETTER JHA +11617 ; [.2C14.0020.0002] # MODI LETTER NYA +11618 ; [.2C15.0020.0002] # MODI LETTER TTA +11619 ; [.2C16.0020.0002] # MODI LETTER TTHA +1161A ; [.2C17.0020.0002] # MODI LETTER DDA +1161B ; [.2C18.0020.0002] # MODI LETTER DDHA +1161C ; [.2C19.0020.0002] # MODI LETTER NNA +1161D ; [.2C1A.0020.0002] # MODI LETTER TA +1161E ; [.2C1B.0020.0002] # MODI LETTER THA +1161F ; [.2C1C.0020.0002] # MODI LETTER DA +11620 ; [.2C1D.0020.0002] # MODI LETTER DHA +11621 ; [.2C1E.0020.0002] # MODI LETTER NA +11622 ; [.2C1F.0020.0002] # MODI LETTER PA +11623 ; [.2C20.0020.0002] # MODI LETTER PHA +11624 ; [.2C21.0020.0002] # MODI LETTER BA +11625 ; [.2C22.0020.0002] # MODI LETTER BHA +11626 ; [.2C23.0020.0002] # MODI LETTER MA +11627 ; [.2C24.0020.0002] # MODI LETTER YA +11628 ; [.2C25.0020.0002] # MODI LETTER RA +11629 ; [.2C26.0020.0002] # MODI LETTER LA +1162A ; [.2C27.0020.0002] # MODI LETTER VA +1162B ; [.2C28.0020.0002] # MODI LETTER SHA +1162C ; [.2C29.0020.0002] # MODI LETTER SSA +1162D ; [.2C2A.0020.0002] # MODI LETTER SA +1162E ; [.2C2B.0020.0002] # MODI LETTER HA +1162F ; [.2C2C.0020.0002] # MODI LETTER LLA +11630 ; [.2C2D.0020.0002] # MODI VOWEL SIGN AA +11631 ; [.2C2E.0020.0002] # MODI VOWEL SIGN I +11632 ; [.2C2F.0020.0002] # MODI VOWEL SIGN II +11633 ; [.2C30.0020.0002] # MODI VOWEL SIGN U +11634 ; [.2C31.0020.0002] # MODI VOWEL SIGN UU +11635 ; [.2C32.0020.0002] # MODI VOWEL SIGN VOCALIC R +11636 ; [.2C33.0020.0002] # MODI VOWEL SIGN VOCALIC RR +11637 ; [.2C34.0020.0002] # MODI VOWEL SIGN VOCALIC L +11638 ; [.2C35.0020.0002] # MODI VOWEL SIGN VOCALIC LL +11639 ; [.2C36.0020.0002] # MODI VOWEL SIGN E +1163A ; [.2C37.0020.0002] # MODI VOWEL SIGN AI +1163B ; [.2C38.0020.0002] # MODI VOWEL SIGN O +1163C ; [.2C39.0020.0002] # MODI VOWEL SIGN AU +1163F ; [.2C3A.0020.0002] # MODI SIGN VIRAMA +11644 ; [.2C3B.0020.0002] # MODI SIGN HUVA +11680 ; [.2C3C.0020.0002] # TAKRI LETTER A +11681 ; [.2C3D.0020.0002] # TAKRI LETTER AA +11682 ; [.2C3E.0020.0002] # TAKRI LETTER I +11683 ; [.2C3F.0020.0002] # TAKRI LETTER II +11684 ; [.2C40.0020.0002] # TAKRI LETTER U +11685 ; [.2C41.0020.0002] # TAKRI LETTER UU +11686 ; [.2C42.0020.0002] # TAKRI LETTER E +11687 ; [.2C43.0020.0002] # TAKRI LETTER AI +11688 ; [.2C44.0020.0002] # TAKRI LETTER O +11689 ; [.2C45.0020.0002] # TAKRI LETTER AU +116A8 ; [.2C46.0020.0002] # TAKRI LETTER SA +116A7 ; [.2C47.0020.0002] # TAKRI LETTER SHA +116A9 ; [.2C48.0020.0002] # TAKRI LETTER HA +1168A ; [.2C49.0020.0002] # TAKRI LETTER KA +1168B ; [.2C4A.0020.0002] # TAKRI LETTER KHA +1168C ; [.2C4B.0020.0002] # TAKRI LETTER GA +1168D ; [.2C4C.0020.0002] # TAKRI LETTER GHA +1168E ; [.2C4D.0020.0002] # TAKRI LETTER NGA +1168F ; [.2C4E.0020.0002] # TAKRI LETTER CA +11690 ; [.2C4F.0020.0002] # TAKRI LETTER CHA +11691 ; [.2C50.0020.0002] # TAKRI LETTER JA +11692 ; [.2C51.0020.0002] # TAKRI LETTER JHA +11693 ; [.2C52.0020.0002] # TAKRI LETTER NYA +11694 ; [.2C53.0020.0002] # TAKRI LETTER TTA +11695 ; [.2C54.0020.0002] # TAKRI LETTER TTHA +11696 ; [.2C55.0020.0002] # TAKRI LETTER DDA +11697 ; [.2C56.0020.0002] # TAKRI LETTER DDHA +11698 ; [.2C57.0020.0002] # TAKRI LETTER NNA +11699 ; [.2C58.0020.0002] # TAKRI LETTER TA +1169A ; [.2C59.0020.0002] # TAKRI LETTER THA +1169B ; [.2C5A.0020.0002] # TAKRI LETTER DA +1169C ; [.2C5B.0020.0002] # TAKRI LETTER DHA +1169D ; [.2C5C.0020.0002] # TAKRI LETTER NA +1169E ; [.2C5D.0020.0002] # TAKRI LETTER PA +1169F ; [.2C5E.0020.0002] # TAKRI LETTER PHA +116A0 ; [.2C5F.0020.0002] # TAKRI LETTER BA +116A1 ; [.2C60.0020.0002] # TAKRI LETTER BHA +116A2 ; [.2C61.0020.0002] # TAKRI LETTER MA +116A3 ; [.2C62.0020.0002] # TAKRI LETTER YA +116A4 ; [.2C63.0020.0002] # TAKRI LETTER RA +116A5 ; [.2C64.0020.0002] # TAKRI LETTER LA +116A6 ; [.2C65.0020.0002] # TAKRI LETTER VA +116AA ; [.2C66.0020.0002] # TAKRI LETTER RRA +116AD ; [.2C67.0020.0002] # TAKRI VOWEL SIGN AA +116AE ; [.2C68.0020.0002] # TAKRI VOWEL SIGN I +116AF ; [.2C69.0020.0002] # TAKRI VOWEL SIGN II +116B0 ; [.2C6A.0020.0002] # TAKRI VOWEL SIGN U +116B1 ; [.2C6B.0020.0002] # TAKRI VOWEL SIGN UU +116B2 ; [.2C6C.0020.0002] # TAKRI VOWEL SIGN E +116B3 ; [.2C6D.0020.0002] # TAKRI VOWEL SIGN AI +116B4 ; [.2C6E.0020.0002] # TAKRI VOWEL SIGN O +116B5 ; [.2C6F.0020.0002] # TAKRI VOWEL SIGN AU +116B6 ; [.2C70.0020.0002] # TAKRI SIGN VIRAMA +11700 ; [.2C71.0020.0002] # AHOM LETTER KA +11701 ; [.2C72.0020.0002] # AHOM LETTER KHA +11702 ; [.2C73.0020.0002] # AHOM LETTER NGA +11703 ; [.2C74.0020.0002] # AHOM LETTER NA +11704 ; [.2C75.0020.0002] # AHOM LETTER TA +11705 ; [.2C75.0020.0004][.0000.0110.0004] # AHOM LETTER ALTERNATE TA +11706 ; [.2C76.0020.0002] # AHOM LETTER PA +11707 ; [.2C77.0020.0002] # AHOM LETTER PHA +11708 ; [.2C78.0020.0002] # AHOM LETTER BA +11709 ; [.2C79.0020.0002] # AHOM LETTER MA +1170A ; [.2C7A.0020.0002] # AHOM LETTER JA +1170B ; [.2C7B.0020.0002] # AHOM LETTER CHA +1170C ; [.2C7C.0020.0002] # AHOM LETTER THA +1170D ; [.2C7D.0020.0002] # AHOM LETTER RA +1170E ; [.2C7E.0020.0002] # AHOM LETTER LA +1170F ; [.2C7F.0020.0002] # AHOM LETTER SA +11710 ; [.2C80.0020.0002] # AHOM LETTER NYA +11711 ; [.2C81.0020.0002] # AHOM LETTER HA +11712 ; [.2C82.0020.0002] # AHOM LETTER A +11713 ; [.2C83.0020.0002] # AHOM LETTER DA +11714 ; [.2C84.0020.0002] # AHOM LETTER DHA +11715 ; [.2C85.0020.0002] # AHOM LETTER GA +11716 ; [.2C85.0020.0004][.0000.0110.0004] # AHOM LETTER ALTERNATE GA +11717 ; [.2C86.0020.0002] # AHOM LETTER GHA +11718 ; [.2C87.0020.0002] # AHOM LETTER BHA +11719 ; [.2C88.0020.0002] # AHOM LETTER JHA +11720 ; [.2C89.0020.0002] # AHOM VOWEL SIGN A +11721 ; [.2C8A.0020.0002] # AHOM VOWEL SIGN AA +11722 ; [.2C8B.0020.0002] # AHOM VOWEL SIGN I +11723 ; [.2C8C.0020.0002] # AHOM VOWEL SIGN II +11724 ; [.2C8D.0020.0002] # AHOM VOWEL SIGN U +11725 ; [.2C8E.0020.0002] # AHOM VOWEL SIGN UU +11726 ; [.2C8F.0020.0002] # AHOM VOWEL SIGN E +11727 ; [.2C90.0020.0002] # AHOM VOWEL SIGN AW +11728 ; [.2C91.0020.0002] # AHOM VOWEL SIGN O +11729 ; [.2C92.0020.0002] # AHOM VOWEL SIGN AI +1172A ; [.2C93.0020.0002] # AHOM VOWEL SIGN AM +1172B ; [.2C94.0020.0002] # AHOM SIGN KILLER +1171D ; [.2C95.0020.0002] # AHOM CONSONANT SIGN MEDIAL LA +1171E ; [.2C96.0020.0002] # AHOM CONSONANT SIGN MEDIAL RA +1171F ; [.2C97.0020.0002] # AHOM CONSONANT SIGN MEDIAL LIGATING RA +1B83 ; [.2C98.0020.0002] # SUNDANESE LETTER A +1BBA ; [.2C98.0020.0004] # SUNDANESE AVAGRAHA +1B84 ; [.2C99.0020.0002] # SUNDANESE LETTER I +1B85 ; [.2C9A.0020.0002] # SUNDANESE LETTER U +1B86 ; [.2C9B.0020.0002] # SUNDANESE LETTER AE +1B87 ; [.2C9C.0020.0002] # SUNDANESE LETTER O +1B88 ; [.2C9D.0020.0002] # SUNDANESE LETTER E +1B89 ; [.2C9E.0020.0002] # SUNDANESE LETTER EU +1B8A ; [.2C9F.0020.0002] # SUNDANESE LETTER KA +1BBE ; [.2C9F.0020.0019] # SUNDANESE LETTER FINAL K +1BAE ; [.2CA0.0020.0002] # SUNDANESE LETTER KHA +1B8B ; [.2CA1.0020.0002] # SUNDANESE LETTER QA +1B8C ; [.2CA2.0020.0002] # SUNDANESE LETTER GA +1B8D ; [.2CA3.0020.0002] # SUNDANESE LETTER NGA +1B8E ; [.2CA4.0020.0002] # SUNDANESE LETTER CA +1B8F ; [.2CA5.0020.0002] # SUNDANESE LETTER JA +1B90 ; [.2CA6.0020.0002] # SUNDANESE LETTER ZA +1B91 ; [.2CA7.0020.0002] # SUNDANESE LETTER NYA +1B92 ; [.2CA8.0020.0002] # SUNDANESE LETTER TA +1B93 ; [.2CA9.0020.0002] # SUNDANESE LETTER DA +1B94 ; [.2CAA.0020.0002] # SUNDANESE LETTER NA +1B95 ; [.2CAB.0020.0002] # SUNDANESE LETTER PA +1B96 ; [.2CAC.0020.0002] # SUNDANESE LETTER FA +1B97 ; [.2CAD.0020.0002] # SUNDANESE LETTER VA +1B98 ; [.2CAE.0020.0002] # SUNDANESE LETTER BA +1BBD ; [.2CAF.0020.0002] # SUNDANESE LETTER BHA +1B99 ; [.2CB0.0020.0002] # SUNDANESE LETTER MA +1BBF ; [.2CB0.0020.0019] # SUNDANESE LETTER FINAL M +1BAC ; [.2CB1.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN MA +1B9A ; [.2CB2.0020.0002] # SUNDANESE LETTER YA +1BA1 ; [.2CB3.0020.0002] # SUNDANESE CONSONANT SIGN PAMINGKAL +1B9B ; [.2CB4.0020.0002] # SUNDANESE LETTER RA +1BA2 ; [.2CB5.0020.0002] # SUNDANESE CONSONANT SIGN PANYAKRA +1BBB ; [.2CB6.0020.0002] # SUNDANESE LETTER REU +1B9C ; [.2CB7.0020.0002] # SUNDANESE LETTER LA +1BA3 ; [.2CB8.0020.0002] # SUNDANESE CONSONANT SIGN PANYIKU +1BBC ; [.2CB9.0020.0002] # SUNDANESE LETTER LEU +1B9D ; [.2CBA.0020.0002] # SUNDANESE LETTER WA +1BAD ; [.2CBB.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN WA +1B9E ; [.2CBC.0020.0002] # SUNDANESE LETTER SA +1B9F ; [.2CBD.0020.0002] # SUNDANESE LETTER XA +1BAF ; [.2CBE.0020.0002] # SUNDANESE LETTER SYA +1BA0 ; [.2CBF.0020.0002] # SUNDANESE LETTER HA +1BA4 ; [.2CC0.0020.0002] # SUNDANESE VOWEL SIGN PANGHULU +1BA5 ; [.2CC1.0020.0002] # SUNDANESE VOWEL SIGN PANYUKU +1BA6 ; [.2CC2.0020.0002] # SUNDANESE VOWEL SIGN PANAELAENG +1BA7 ; [.2CC3.0020.0002] # SUNDANESE VOWEL SIGN PANOLONG +1BA8 ; [.2CC4.0020.0002] # SUNDANESE VOWEL SIGN PAMEPET +1BA9 ; [.2CC5.0020.0002] # SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; [.2CC6.0020.0002] # SUNDANESE SIGN PAMAAEH +1BAB ; [.2CC7.0020.0002] # SUNDANESE SIGN VIRAMA +11005 ; [.2CC8.0020.0002] # BRAHMI LETTER A +11006 ; [.2CC9.0020.0002] # BRAHMI LETTER AA +11007 ; [.2CCA.0020.0002] # BRAHMI LETTER I +11008 ; [.2CCB.0020.0002] # BRAHMI LETTER II +11009 ; [.2CCC.0020.0002] # BRAHMI LETTER U +1100A ; [.2CCD.0020.0002] # BRAHMI LETTER UU +1100B ; [.2CCE.0020.0002] # BRAHMI LETTER VOCALIC R +1100C ; [.2CCF.0020.0002] # BRAHMI LETTER VOCALIC RR +1100D ; [.2CD0.0020.0002] # BRAHMI LETTER VOCALIC L +1100E ; [.2CD1.0020.0002] # BRAHMI LETTER VOCALIC LL +1100F ; [.2CD2.0020.0002] # BRAHMI LETTER E +11010 ; [.2CD3.0020.0002] # BRAHMI LETTER AI +11011 ; [.2CD4.0020.0002] # BRAHMI LETTER O +11012 ; [.2CD5.0020.0002] # BRAHMI LETTER AU +11013 ; [.2CD6.0020.0002] # BRAHMI LETTER KA +11014 ; [.2CD7.0020.0002] # BRAHMI LETTER KHA +11015 ; [.2CD8.0020.0002] # BRAHMI LETTER GA +11016 ; [.2CD9.0020.0002] # BRAHMI LETTER GHA +11017 ; [.2CDA.0020.0002] # BRAHMI LETTER NGA +11018 ; [.2CDB.0020.0002] # BRAHMI LETTER CA +11019 ; [.2CDC.0020.0002] # BRAHMI LETTER CHA +1101A ; [.2CDD.0020.0002] # BRAHMI LETTER JA +1101B ; [.2CDE.0020.0002] # BRAHMI LETTER JHA +1101C ; [.2CDF.0020.0002] # BRAHMI LETTER NYA +1101D ; [.2CE0.0020.0002] # BRAHMI LETTER TTA +1101E ; [.2CE1.0020.0002] # BRAHMI LETTER TTHA +1101F ; [.2CE2.0020.0002] # BRAHMI LETTER DDA +11020 ; [.2CE3.0020.0002] # BRAHMI LETTER DDHA +11021 ; [.2CE4.0020.0002] # BRAHMI LETTER NNA +11022 ; [.2CE5.0020.0002] # BRAHMI LETTER TA +11023 ; [.2CE6.0020.0002] # BRAHMI LETTER THA +11024 ; [.2CE7.0020.0002] # BRAHMI LETTER DA +11025 ; [.2CE8.0020.0002] # BRAHMI LETTER DHA +11026 ; [.2CE9.0020.0002] # BRAHMI LETTER NA +11027 ; [.2CEA.0020.0002] # BRAHMI LETTER PA +11028 ; [.2CEB.0020.0002] # BRAHMI LETTER PHA +11029 ; [.2CEC.0020.0002] # BRAHMI LETTER BA +1102A ; [.2CED.0020.0002] # BRAHMI LETTER BHA +1102B ; [.2CEE.0020.0002] # BRAHMI LETTER MA +1102C ; [.2CEF.0020.0002] # BRAHMI LETTER YA +1102D ; [.2CF0.0020.0002] # BRAHMI LETTER RA +1102E ; [.2CF1.0020.0002] # BRAHMI LETTER LA +1102F ; [.2CF2.0020.0002] # BRAHMI LETTER VA +11030 ; [.2CF3.0020.0002] # BRAHMI LETTER SHA +11031 ; [.2CF4.0020.0002] # BRAHMI LETTER SSA +11032 ; [.2CF5.0020.0002] # BRAHMI LETTER SA +11033 ; [.2CF6.0020.0002] # BRAHMI LETTER HA +11003 ; [.2CF7.0020.0002] # BRAHMI SIGN JIHVAMULIYA +11004 ; [.2CF8.0020.0002] # BRAHMI SIGN UPADHMANIYA +11034 ; [.2CF9.0020.0002] # BRAHMI LETTER LLA +11035 ; [.2CFA.0020.0002] # BRAHMI LETTER OLD TAMIL LLLA +11036 ; [.2CFB.0020.0002] # BRAHMI LETTER OLD TAMIL RRA +11037 ; [.2CFC.0020.0002] # BRAHMI LETTER OLD TAMIL NNNA +11038 ; [.2CFD.0020.0002] # BRAHMI VOWEL SIGN AA +11039 ; [.2CFE.0020.0002] # BRAHMI VOWEL SIGN BHATTIPROLU AA +1103A ; [.2CFF.0020.0002] # BRAHMI VOWEL SIGN I +1103B ; [.2D00.0020.0002] # BRAHMI VOWEL SIGN II +1103C ; [.2D01.0020.0002] # BRAHMI VOWEL SIGN U +1103D ; [.2D02.0020.0002] # BRAHMI VOWEL SIGN UU +1103E ; [.2D03.0020.0002] # BRAHMI VOWEL SIGN VOCALIC R +1103F ; [.2D04.0020.0002] # BRAHMI VOWEL SIGN VOCALIC RR +11040 ; [.2D05.0020.0002] # BRAHMI VOWEL SIGN VOCALIC L +11041 ; [.2D06.0020.0002] # BRAHMI VOWEL SIGN VOCALIC LL +11042 ; [.2D07.0020.0002] # BRAHMI VOWEL SIGN E +11043 ; [.2D08.0020.0002] # BRAHMI VOWEL SIGN AI +11044 ; [.2D09.0020.0002] # BRAHMI VOWEL SIGN O +11045 ; [.2D0A.0020.0002] # BRAHMI VOWEL SIGN AU +11046 ; [.2D0B.0020.0002] # BRAHMI VIRAMA +1107F ; [.2D0C.0020.0002] # BRAHMI NUMBER JOINER +10A00 ; [.2D0D.0020.0002] # KHAROSHTHI LETTER A +10A01 ; [.2D0E.0020.0002] # KHAROSHTHI VOWEL SIGN I +10A02 ; [.2D0F.0020.0002] # KHAROSHTHI VOWEL SIGN U +10A03 ; [.2D10.0020.0002] # KHAROSHTHI VOWEL SIGN VOCALIC R +10A05 ; [.2D11.0020.0002] # KHAROSHTHI VOWEL SIGN E +10A06 ; [.2D12.0020.0002] # KHAROSHTHI VOWEL SIGN O +10A0C ; [.2D13.0020.0002] # KHAROSHTHI VOWEL LENGTH MARK +10A10 ; [.2D14.0020.0002] # KHAROSHTHI LETTER KA +10A11 ; [.2D15.0020.0002] # KHAROSHTHI LETTER KHA +10A12 ; [.2D16.0020.0002] # KHAROSHTHI LETTER GA +10A13 ; [.2D17.0020.0002] # KHAROSHTHI LETTER GHA +10A15 ; [.2D18.0020.0002] # KHAROSHTHI LETTER CA +10A16 ; [.2D19.0020.0002] # KHAROSHTHI LETTER CHA +10A17 ; [.2D1A.0020.0002] # KHAROSHTHI LETTER JA +10A19 ; [.2D1B.0020.0002] # KHAROSHTHI LETTER NYA +10A1A ; [.2D1C.0020.0002] # KHAROSHTHI LETTER TTA +10A1B ; [.2D1D.0020.0002] # KHAROSHTHI LETTER TTHA +10A1C ; [.2D1E.0020.0002] # KHAROSHTHI LETTER DDA +10A1D ; [.2D1F.0020.0002] # KHAROSHTHI LETTER DDHA +10A1E ; [.2D20.0020.0002] # KHAROSHTHI LETTER NNA +10A1F ; [.2D21.0020.0002] # KHAROSHTHI LETTER TA +10A20 ; [.2D22.0020.0002] # KHAROSHTHI LETTER THA +10A21 ; [.2D23.0020.0002] # KHAROSHTHI LETTER DA +10A22 ; [.2D24.0020.0002] # KHAROSHTHI LETTER DHA +10A23 ; [.2D25.0020.0002] # KHAROSHTHI LETTER NA +10A24 ; [.2D26.0020.0002] # KHAROSHTHI LETTER PA +10A25 ; [.2D27.0020.0002] # KHAROSHTHI LETTER PHA +10A26 ; [.2D28.0020.0002] # KHAROSHTHI LETTER BA +10A27 ; [.2D29.0020.0002] # KHAROSHTHI LETTER BHA +10A28 ; [.2D2A.0020.0002] # KHAROSHTHI LETTER MA +10A29 ; [.2D2B.0020.0002] # KHAROSHTHI LETTER YA +10A2A ; [.2D2C.0020.0002] # KHAROSHTHI LETTER RA +10A2B ; [.2D2D.0020.0002] # KHAROSHTHI LETTER LA +10A2C ; [.2D2E.0020.0002] # KHAROSHTHI LETTER VA +10A2D ; [.2D2F.0020.0002] # KHAROSHTHI LETTER SHA +10A2E ; [.2D30.0020.0002] # KHAROSHTHI LETTER SSA +10A2F ; [.2D31.0020.0002] # KHAROSHTHI LETTER SA +10A30 ; [.2D32.0020.0002] # KHAROSHTHI LETTER ZA +10A31 ; [.2D33.0020.0002] # KHAROSHTHI LETTER HA +10A32 ; [.2D34.0020.0002] # KHAROSHTHI LETTER KKA +10A33 ; [.2D35.0020.0002] # KHAROSHTHI LETTER TTTHA +10A3F ; [.2D36.0020.0002] # KHAROSHTHI VIRAMA +11C00 ; [.2D37.0020.0002] # BHAIKSUKI LETTER A +11C01 ; [.2D38.0020.0002] # BHAIKSUKI LETTER AA +11C02 ; [.2D39.0020.0002] # BHAIKSUKI LETTER I +11C03 ; [.2D3A.0020.0002] # BHAIKSUKI LETTER II +11C04 ; [.2D3B.0020.0002] # BHAIKSUKI LETTER U +11C05 ; [.2D3C.0020.0002] # BHAIKSUKI LETTER UU +11C06 ; [.2D3D.0020.0002] # BHAIKSUKI LETTER VOCALIC R +11C07 ; [.2D3E.0020.0002] # BHAIKSUKI LETTER VOCALIC RR +11C08 ; [.2D3F.0020.0002] # BHAIKSUKI LETTER VOCALIC L +11C0A ; [.2D40.0020.0002] # BHAIKSUKI LETTER E +11C0B ; [.2D41.0020.0002] # BHAIKSUKI LETTER AI +11C0C ; [.2D42.0020.0002] # BHAIKSUKI LETTER O +11C0D ; [.2D43.0020.0002] # BHAIKSUKI LETTER AU +11C0E ; [.2D44.0020.0002] # BHAIKSUKI LETTER KA +11C0F ; [.2D45.0020.0002] # BHAIKSUKI LETTER KHA +11C10 ; [.2D46.0020.0002] # BHAIKSUKI LETTER GA +11C11 ; [.2D47.0020.0002] # BHAIKSUKI LETTER GHA +11C12 ; [.2D48.0020.0002] # BHAIKSUKI LETTER NGA +11C13 ; [.2D49.0020.0002] # BHAIKSUKI LETTER CA +11C14 ; [.2D4A.0020.0002] # BHAIKSUKI LETTER CHA +11C15 ; [.2D4B.0020.0002] # BHAIKSUKI LETTER JA +11C16 ; [.2D4C.0020.0002] # BHAIKSUKI LETTER JHA +11C17 ; [.2D4D.0020.0002] # BHAIKSUKI LETTER NYA +11C18 ; [.2D4E.0020.0002] # BHAIKSUKI LETTER TTA +11C19 ; [.2D4F.0020.0002] # BHAIKSUKI LETTER TTHA +11C1A ; [.2D50.0020.0002] # BHAIKSUKI LETTER DDA +11C1B ; [.2D51.0020.0002] # BHAIKSUKI LETTER DDHA +11C1C ; [.2D52.0020.0002] # BHAIKSUKI LETTER NNA +11C1D ; [.2D53.0020.0002] # BHAIKSUKI LETTER TA +11C1E ; [.2D54.0020.0002] # BHAIKSUKI LETTER THA +11C1F ; [.2D55.0020.0002] # BHAIKSUKI LETTER DA +11C20 ; [.2D56.0020.0002] # BHAIKSUKI LETTER DHA +11C21 ; [.2D57.0020.0002] # BHAIKSUKI LETTER NA +11C22 ; [.2D58.0020.0002] # BHAIKSUKI LETTER PA +11C23 ; [.2D59.0020.0002] # BHAIKSUKI LETTER PHA +11C24 ; [.2D5A.0020.0002] # BHAIKSUKI LETTER BA +11C25 ; [.2D5B.0020.0002] # BHAIKSUKI LETTER BHA +11C26 ; [.2D5C.0020.0002] # BHAIKSUKI LETTER MA +11C27 ; [.2D5D.0020.0002] # BHAIKSUKI LETTER YA +11C28 ; [.2D5E.0020.0002] # BHAIKSUKI LETTER RA +11C29 ; [.2D5F.0020.0002] # BHAIKSUKI LETTER LA +11C2A ; [.2D60.0020.0002] # BHAIKSUKI LETTER VA +11C2B ; [.2D61.0020.0002] # BHAIKSUKI LETTER SHA +11C2C ; [.2D62.0020.0002] # BHAIKSUKI LETTER SSA +11C2D ; [.2D63.0020.0002] # BHAIKSUKI LETTER SA +11C2E ; [.2D64.0020.0002] # BHAIKSUKI LETTER HA +11C40 ; [.2D65.0020.0002] # BHAIKSUKI SIGN AVAGRAHA +11C2F ; [.2D66.0020.0002] # BHAIKSUKI VOWEL SIGN AA +11C30 ; [.2D67.0020.0002] # BHAIKSUKI VOWEL SIGN I +11C31 ; [.2D68.0020.0002] # BHAIKSUKI VOWEL SIGN II +11C32 ; [.2D69.0020.0002] # BHAIKSUKI VOWEL SIGN U +11C33 ; [.2D6A.0020.0002] # BHAIKSUKI VOWEL SIGN UU +11C34 ; [.2D6B.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC R +11C35 ; [.2D6C.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC RR +11C36 ; [.2D6D.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC L +11C38 ; [.2D6E.0020.0002] # BHAIKSUKI VOWEL SIGN E +11C39 ; [.2D6F.0020.0002] # BHAIKSUKI VOWEL SIGN AI +11C3A ; [.2D70.0020.0002] # BHAIKSUKI VOWEL SIGN O +11C3B ; [.2D71.0020.0002] # BHAIKSUKI VOWEL SIGN AU +11C3F ; [.2D72.0020.0002] # BHAIKSUKI SIGN VIRAMA +0E01 ; [.2D73.0020.0002] # THAI CHARACTER KO KAI +0E40 0E01 ; [.2D73.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI> +0E41 0E01 ; [.2D73.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI> +0E42 0E01 ; [.2D73.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI> +0E43 0E01 ; [.2D73.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI> +0E44 0E01 ; [.2D73.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI> +0E02 ; [.2D74.0020.0002] # THAI CHARACTER KHO KHAI +0E40 0E02 ; [.2D74.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI> +0E41 0E02 ; [.2D74.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI> +0E42 0E02 ; [.2D74.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI> +0E43 0E02 ; [.2D74.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI> +0E44 0E02 ; [.2D74.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI> +0E03 ; [.2D75.0020.0002] # THAI CHARACTER KHO KHUAT +0E40 0E03 ; [.2D75.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT> +0E41 0E03 ; [.2D75.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT> +0E42 0E03 ; [.2D75.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT> +0E43 0E03 ; [.2D75.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT> +0E44 0E03 ; [.2D75.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT> +0E04 ; [.2D76.0020.0002] # THAI CHARACTER KHO KHWAI +0E40 0E04 ; [.2D76.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI> +0E41 0E04 ; [.2D76.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI> +0E42 0E04 ; [.2D76.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI> +0E43 0E04 ; [.2D76.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI> +0E44 0E04 ; [.2D76.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI> +0E05 ; [.2D77.0020.0002] # THAI CHARACTER KHO KHON +0E40 0E05 ; [.2D77.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON> +0E41 0E05 ; [.2D77.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON> +0E42 0E05 ; [.2D77.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON> +0E43 0E05 ; [.2D77.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON> +0E44 0E05 ; [.2D77.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON> +0E06 ; [.2D78.0020.0002] # THAI CHARACTER KHO RAKHANG +0E40 0E06 ; [.2D78.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG> +0E41 0E06 ; [.2D78.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG> +0E42 0E06 ; [.2D78.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG> +0E43 0E06 ; [.2D78.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG> +0E44 0E06 ; [.2D78.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG> +0E07 ; [.2D79.0020.0002] # THAI CHARACTER NGO NGU +0E40 0E07 ; [.2D79.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU> +0E41 0E07 ; [.2D79.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU> +0E42 0E07 ; [.2D79.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU> +0E43 0E07 ; [.2D79.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU> +0E44 0E07 ; [.2D79.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU> +0E08 ; [.2D7A.0020.0002] # THAI CHARACTER CHO CHAN +0E40 0E08 ; [.2D7A.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN> +0E41 0E08 ; [.2D7A.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN> +0E42 0E08 ; [.2D7A.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN> +0E43 0E08 ; [.2D7A.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN> +0E44 0E08 ; [.2D7A.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN> +0E09 ; [.2D7B.0020.0002] # THAI CHARACTER CHO CHING +0E40 0E09 ; [.2D7B.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING> +0E41 0E09 ; [.2D7B.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING> +0E42 0E09 ; [.2D7B.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING> +0E43 0E09 ; [.2D7B.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING> +0E44 0E09 ; [.2D7B.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING> +0E0A ; [.2D7C.0020.0002] # THAI CHARACTER CHO CHANG +0E40 0E0A ; [.2D7C.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG> +0E41 0E0A ; [.2D7C.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG> +0E42 0E0A ; [.2D7C.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG> +0E43 0E0A ; [.2D7C.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG> +0E44 0E0A ; [.2D7C.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG> +0E0B ; [.2D7D.0020.0002] # THAI CHARACTER SO SO +0E40 0E0B ; [.2D7D.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO> +0E41 0E0B ; [.2D7D.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO> +0E42 0E0B ; [.2D7D.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO> +0E43 0E0B ; [.2D7D.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO> +0E44 0E0B ; [.2D7D.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO> +0E0C ; [.2D7E.0020.0002] # THAI CHARACTER CHO CHOE +0E40 0E0C ; [.2D7E.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE> +0E41 0E0C ; [.2D7E.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE> +0E42 0E0C ; [.2D7E.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE> +0E43 0E0C ; [.2D7E.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE> +0E44 0E0C ; [.2D7E.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE> +0E0D ; [.2D7F.0020.0002] # THAI CHARACTER YO YING +0E40 0E0D ; [.2D7F.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING> +0E41 0E0D ; [.2D7F.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING> +0E42 0E0D ; [.2D7F.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING> +0E43 0E0D ; [.2D7F.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING> +0E44 0E0D ; [.2D7F.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING> +0E0E ; [.2D80.0020.0002] # THAI CHARACTER DO CHADA +0E40 0E0E ; [.2D80.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA> +0E41 0E0E ; [.2D80.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA> +0E42 0E0E ; [.2D80.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA> +0E43 0E0E ; [.2D80.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA> +0E44 0E0E ; [.2D80.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA> +0E0F ; [.2D81.0020.0002] # THAI CHARACTER TO PATAK +0E40 0E0F ; [.2D81.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK> +0E41 0E0F ; [.2D81.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK> +0E42 0E0F ; [.2D81.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK> +0E43 0E0F ; [.2D81.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK> +0E44 0E0F ; [.2D81.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK> +0E10 ; [.2D82.0020.0002] # THAI CHARACTER THO THAN +0E40 0E10 ; [.2D82.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN> +0E41 0E10 ; [.2D82.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN> +0E42 0E10 ; [.2D82.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN> +0E43 0E10 ; [.2D82.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN> +0E44 0E10 ; [.2D82.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN> +0E11 ; [.2D83.0020.0002] # THAI CHARACTER THO NANGMONTHO +0E40 0E11 ; [.2D83.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO> +0E41 0E11 ; [.2D83.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO> +0E42 0E11 ; [.2D83.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO> +0E43 0E11 ; [.2D83.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO> +0E44 0E11 ; [.2D83.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO> +0E12 ; [.2D84.0020.0002] # THAI CHARACTER THO PHUTHAO +0E40 0E12 ; [.2D84.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO> +0E41 0E12 ; [.2D84.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO> +0E42 0E12 ; [.2D84.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO> +0E43 0E12 ; [.2D84.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO> +0E44 0E12 ; [.2D84.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO> +0E13 ; [.2D85.0020.0002] # THAI CHARACTER NO NEN +0E40 0E13 ; [.2D85.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN> +0E41 0E13 ; [.2D85.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN> +0E42 0E13 ; [.2D85.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN> +0E43 0E13 ; [.2D85.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN> +0E44 0E13 ; [.2D85.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN> +0E14 ; [.2D86.0020.0002] # THAI CHARACTER DO DEK +0E40 0E14 ; [.2D86.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK> +0E41 0E14 ; [.2D86.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK> +0E42 0E14 ; [.2D86.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK> +0E43 0E14 ; [.2D86.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK> +0E44 0E14 ; [.2D86.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK> +0E15 ; [.2D87.0020.0002] # THAI CHARACTER TO TAO +0E40 0E15 ; [.2D87.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO> +0E41 0E15 ; [.2D87.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO> +0E42 0E15 ; [.2D87.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO> +0E43 0E15 ; [.2D87.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO> +0E44 0E15 ; [.2D87.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO> +0E16 ; [.2D88.0020.0002] # THAI CHARACTER THO THUNG +0E40 0E16 ; [.2D88.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG> +0E41 0E16 ; [.2D88.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG> +0E42 0E16 ; [.2D88.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG> +0E43 0E16 ; [.2D88.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG> +0E44 0E16 ; [.2D88.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG> +0E17 ; [.2D89.0020.0002] # THAI CHARACTER THO THAHAN +0E40 0E17 ; [.2D89.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN> +0E41 0E17 ; [.2D89.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN> +0E42 0E17 ; [.2D89.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN> +0E43 0E17 ; [.2D89.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN> +0E44 0E17 ; [.2D89.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN> +0E18 ; [.2D8A.0020.0002] # THAI CHARACTER THO THONG +0E40 0E18 ; [.2D8A.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG> +0E41 0E18 ; [.2D8A.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG> +0E42 0E18 ; [.2D8A.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG> +0E43 0E18 ; [.2D8A.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG> +0E44 0E18 ; [.2D8A.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG> +0E19 ; [.2D8B.0020.0002] # THAI CHARACTER NO NU +0E40 0E19 ; [.2D8B.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU> +0E41 0E19 ; [.2D8B.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU> +0E42 0E19 ; [.2D8B.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU> +0E43 0E19 ; [.2D8B.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU> +0E44 0E19 ; [.2D8B.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU> +0E1A ; [.2D8C.0020.0002] # THAI CHARACTER BO BAIMAI +0E40 0E1A ; [.2D8C.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI> +0E41 0E1A ; [.2D8C.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI> +0E42 0E1A ; [.2D8C.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI> +0E43 0E1A ; [.2D8C.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI> +0E44 0E1A ; [.2D8C.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI> +0E1B ; [.2D8D.0020.0002] # THAI CHARACTER PO PLA +0E40 0E1B ; [.2D8D.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA> +0E41 0E1B ; [.2D8D.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA> +0E42 0E1B ; [.2D8D.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA> +0E43 0E1B ; [.2D8D.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA> +0E44 0E1B ; [.2D8D.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA> +0E1C ; [.2D8E.0020.0002] # THAI CHARACTER PHO PHUNG +0E40 0E1C ; [.2D8E.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG> +0E41 0E1C ; [.2D8E.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG> +0E42 0E1C ; [.2D8E.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG> +0E43 0E1C ; [.2D8E.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG> +0E44 0E1C ; [.2D8E.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG> +0E1D ; [.2D8F.0020.0002] # THAI CHARACTER FO FA +0E40 0E1D ; [.2D8F.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA> +0E41 0E1D ; [.2D8F.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA> +0E42 0E1D ; [.2D8F.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA> +0E43 0E1D ; [.2D8F.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA> +0E44 0E1D ; [.2D8F.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA> +0E1E ; [.2D90.0020.0002] # THAI CHARACTER PHO PHAN +0E40 0E1E ; [.2D90.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN> +0E41 0E1E ; [.2D90.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN> +0E42 0E1E ; [.2D90.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN> +0E43 0E1E ; [.2D90.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN> +0E44 0E1E ; [.2D90.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN> +0E1F ; [.2D91.0020.0002] # THAI CHARACTER FO FAN +0E40 0E1F ; [.2D91.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN> +0E41 0E1F ; [.2D91.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN> +0E42 0E1F ; [.2D91.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN> +0E43 0E1F ; [.2D91.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN> +0E44 0E1F ; [.2D91.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN> +0E20 ; [.2D92.0020.0002] # THAI CHARACTER PHO SAMPHAO +0E40 0E20 ; [.2D92.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO> +0E41 0E20 ; [.2D92.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO> +0E42 0E20 ; [.2D92.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO> +0E43 0E20 ; [.2D92.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO> +0E44 0E20 ; [.2D92.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO> +0E21 ; [.2D93.0020.0002] # THAI CHARACTER MO MA +0E40 0E21 ; [.2D93.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA> +0E41 0E21 ; [.2D93.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA> +0E42 0E21 ; [.2D93.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA> +0E43 0E21 ; [.2D93.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA> +0E44 0E21 ; [.2D93.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA> +0E22 ; [.2D94.0020.0002] # THAI CHARACTER YO YAK +0E40 0E22 ; [.2D94.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK> +0E41 0E22 ; [.2D94.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK> +0E42 0E22 ; [.2D94.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK> +0E43 0E22 ; [.2D94.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK> +0E44 0E22 ; [.2D94.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK> +0E23 ; [.2D95.0020.0002] # THAI CHARACTER RO RUA +0E40 0E23 ; [.2D95.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA> +0E41 0E23 ; [.2D95.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA> +0E42 0E23 ; [.2D95.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA> +0E43 0E23 ; [.2D95.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA> +0E44 0E23 ; [.2D95.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA> +0E24 ; [.2D96.0020.0002] # THAI CHARACTER RU +0E40 0E24 ; [.2D96.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RU> +0E41 0E24 ; [.2D96.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RU> +0E42 0E24 ; [.2D96.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RU> +0E43 0E24 ; [.2D96.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU> +0E44 0E24 ; [.2D96.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU> +0E25 ; [.2D97.0020.0002] # THAI CHARACTER LO LING +0E40 0E25 ; [.2D97.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING> +0E41 0E25 ; [.2D97.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING> +0E42 0E25 ; [.2D97.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING> +0E43 0E25 ; [.2D97.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING> +0E44 0E25 ; [.2D97.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING> +0E26 ; [.2D98.0020.0002] # THAI CHARACTER LU +0E40 0E26 ; [.2D98.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LU> +0E41 0E26 ; [.2D98.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LU> +0E42 0E26 ; [.2D98.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LU> +0E43 0E26 ; [.2D98.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU> +0E44 0E26 ; [.2D98.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU> +0E27 ; [.2D99.0020.0002] # THAI CHARACTER WO WAEN +0E40 0E27 ; [.2D99.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN> +0E41 0E27 ; [.2D99.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN> +0E42 0E27 ; [.2D99.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN> +0E43 0E27 ; [.2D99.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN> +0E44 0E27 ; [.2D99.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN> +0E28 ; [.2D9A.0020.0002] # THAI CHARACTER SO SALA +0E40 0E28 ; [.2D9A.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA> +0E41 0E28 ; [.2D9A.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA> +0E42 0E28 ; [.2D9A.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA> +0E43 0E28 ; [.2D9A.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA> +0E44 0E28 ; [.2D9A.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA> +0E29 ; [.2D9B.0020.0002] # THAI CHARACTER SO RUSI +0E40 0E29 ; [.2D9B.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI> +0E41 0E29 ; [.2D9B.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI> +0E42 0E29 ; [.2D9B.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI> +0E43 0E29 ; [.2D9B.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI> +0E44 0E29 ; [.2D9B.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI> +0E2A ; [.2D9C.0020.0002] # THAI CHARACTER SO SUA +0E40 0E2A ; [.2D9C.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA> +0E41 0E2A ; [.2D9C.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA> +0E42 0E2A ; [.2D9C.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA> +0E43 0E2A ; [.2D9C.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA> +0E44 0E2A ; [.2D9C.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA> +0E2B ; [.2D9D.0020.0002] # THAI CHARACTER HO HIP +0E40 0E2B ; [.2D9D.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP> +0E41 0E2B ; [.2D9D.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP> +0E42 0E2B ; [.2D9D.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP> +0E43 0E2B ; [.2D9D.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP> +0E44 0E2B ; [.2D9D.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP> +0E2C ; [.2D9E.0020.0002] # THAI CHARACTER LO CHULA +0E40 0E2C ; [.2D9E.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA> +0E41 0E2C ; [.2D9E.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA> +0E42 0E2C ; [.2D9E.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA> +0E43 0E2C ; [.2D9E.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA> +0E44 0E2C ; [.2D9E.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA> +0E2D ; [.2D9F.0020.0002] # THAI CHARACTER O ANG +0E40 0E2D ; [.2D9F.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG> +0E41 0E2D ; [.2D9F.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG> +0E42 0E2D ; [.2D9F.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG> +0E43 0E2D ; [.2D9F.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG> +0E44 0E2D ; [.2D9F.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG> +0E2E ; [.2DA0.0020.0002] # THAI CHARACTER HO NOKHUK +0E40 0E2E ; [.2DA0.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK> +0E41 0E2E ; [.2DA0.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK> +0E42 0E2E ; [.2DA0.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK> +0E43 0E2E ; [.2DA0.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK> +0E44 0E2E ; [.2DA0.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK> +0E2F ; [.2DA1.0020.0002] # THAI CHARACTER PAIYANNOI +0E30 ; [.2DA2.0020.0002] # THAI CHARACTER SARA A +0E31 ; [.2DA3.0020.0002] # THAI CHARACTER MAI HAN-AKAT +0E32 ; [.2DA4.0020.0002] # THAI CHARACTER SARA AA +0E33 ; [.2DA5.0020.0002] # THAI CHARACTER SARA AM +0E4D 0E32 ; [.2DA5.0020.0002] # THAI CHARACTER SARA AM +0E34 ; [.2DA6.0020.0002] # THAI CHARACTER SARA I +0E35 ; [.2DA7.0020.0002] # THAI CHARACTER SARA II +0E36 ; [.2DA8.0020.0002] # THAI CHARACTER SARA UE +0E37 ; [.2DA9.0020.0002] # THAI CHARACTER SARA UEE +0E38 ; [.2DAA.0020.0002] # THAI CHARACTER SARA U +0E39 ; [.2DAB.0020.0002] # THAI CHARACTER SARA UU +0E3A ; [.2DAC.0020.0002] # THAI CHARACTER PHINTHU +0E40 ; [.2DAD.0020.0002] # THAI CHARACTER SARA E +0E41 ; [.2DAE.0020.0002] # THAI CHARACTER SARA AE +0E42 ; [.2DAF.0020.0002] # THAI CHARACTER SARA O +0E43 ; [.2DB0.0020.0002] # THAI CHARACTER SARA AI MAIMUAN +0E44 ; [.2DB1.0020.0002] # THAI CHARACTER SARA AI MAIMALAI +0E45 ; [.2DB2.0020.0002] # THAI CHARACTER LAKKHANGYAO +0EDE ; [.2DB3.0020.0002] # LAO LETTER KHMU GO +0EC0 0EDE ; [.2DB3.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU GO> +0EC1 0EDE ; [.2DB3.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU GO> +0EC2 0EDE ; [.2DB3.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU GO> +0EC3 0EDE ; [.2DB3.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU GO> +0EC4 0EDE ; [.2DB3.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU GO> +0E81 ; [.2DB4.0020.0002] # LAO LETTER KO +0EC0 0E81 ; [.2DB4.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KO> +0EC1 0E81 ; [.2DB4.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KO> +0EC2 0E81 ; [.2DB4.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KO> +0EC3 0E81 ; [.2DB4.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KO> +0EC4 0E81 ; [.2DB4.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KO> +0E82 ; [.2DB5.0020.0002] # LAO LETTER KHO SUNG +0EC0 0E82 ; [.2DB5.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG> +0EC1 0E82 ; [.2DB5.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG> +0EC2 0E82 ; [.2DB5.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG> +0EC3 0E82 ; [.2DB5.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG> +0EC4 0E82 ; [.2DB5.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG> +0E84 ; [.2DB6.0020.0002] # LAO LETTER KHO TAM +0EC0 0E84 ; [.2DB6.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM> +0EC1 0E84 ; [.2DB6.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM> +0EC2 0E84 ; [.2DB6.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM> +0EC3 0E84 ; [.2DB6.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM> +0EC4 0E84 ; [.2DB6.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM> +0E87 ; [.2DB7.0020.0002] # LAO LETTER NGO +0EC0 0E87 ; [.2DB7.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NGO> +0EC1 0E87 ; [.2DB7.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NGO> +0EC2 0E87 ; [.2DB7.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NGO> +0EC3 0E87 ; [.2DB7.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NGO> +0EC4 0E87 ; [.2DB7.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NGO> +0E88 ; [.2DB8.0020.0002] # LAO LETTER CO +0EC0 0E88 ; [.2DB8.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER CO> +0EC1 0E88 ; [.2DB8.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER CO> +0EC2 0E88 ; [.2DB8.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER CO> +0EC3 0E88 ; [.2DB8.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER CO> +0EC4 0E88 ; [.2DB8.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER CO> +0EAA ; [.2DB9.0020.0002] # LAO LETTER SO SUNG +0EC0 0EAA ; [.2DB9.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG> +0EC1 0EAA ; [.2DB9.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG> +0EC2 0EAA ; [.2DB9.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG> +0EC3 0EAA ; [.2DB9.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG> +0EC4 0EAA ; [.2DB9.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG> +0E8A ; [.2DBA.0020.0002] # LAO LETTER SO TAM +0EC0 0E8A ; [.2DBA.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO TAM> +0EC1 0E8A ; [.2DBA.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM> +0EC2 0E8A ; [.2DBA.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO TAM> +0EC3 0E8A ; [.2DBA.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM> +0EC4 0E8A ; [.2DBA.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM> +0EDF ; [.2DBB.0020.0002] # LAO LETTER KHMU NYO +0EC0 0EDF ; [.2DBB.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU NYO> +0EC1 0EDF ; [.2DBB.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU NYO> +0EC2 0EDF ; [.2DBB.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU NYO> +0EC3 0EDF ; [.2DBB.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU NYO> +0EC4 0EDF ; [.2DBB.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU NYO> +0E8D ; [.2DBC.0020.0002] # LAO LETTER NYO +0EC0 0E8D ; [.2DBC.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NYO> +0EC1 0E8D ; [.2DBC.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NYO> +0EC2 0E8D ; [.2DBC.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NYO> +0EC3 0E8D ; [.2DBC.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NYO> +0EC4 0E8D ; [.2DBC.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NYO> +0E94 ; [.2DBD.0020.0002] # LAO LETTER DO +0EC0 0E94 ; [.2DBD.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER DO> +0EC1 0E94 ; [.2DBD.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER DO> +0EC2 0E94 ; [.2DBD.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER DO> +0EC3 0E94 ; [.2DBD.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER DO> +0EC4 0E94 ; [.2DBD.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER DO> +0E95 ; [.2DBE.0020.0002] # LAO LETTER TO +0EC0 0E95 ; [.2DBE.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER TO> +0EC1 0E95 ; [.2DBE.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER TO> +0EC2 0E95 ; [.2DBE.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER TO> +0EC3 0E95 ; [.2DBE.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER TO> +0EC4 0E95 ; [.2DBE.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER TO> +0E96 ; [.2DBF.0020.0002] # LAO LETTER THO SUNG +0EC0 0E96 ; [.2DBF.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG> +0EC1 0E96 ; [.2DBF.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG> +0EC2 0E96 ; [.2DBF.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG> +0EC3 0E96 ; [.2DBF.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG> +0EC4 0E96 ; [.2DBF.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG> +0E97 ; [.2DC0.0020.0002] # LAO LETTER THO TAM +0EC0 0E97 ; [.2DC0.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO TAM> +0EC1 0E97 ; [.2DC0.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM> +0EC2 0E97 ; [.2DC0.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO TAM> +0EC3 0E97 ; [.2DC0.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM> +0EC4 0E97 ; [.2DC0.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM> +0E99 ; [.2DC1.0020.0002] # LAO LETTER NO +0EC0 0E99 ; [.2DC1.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NO> +0EC1 0E99 ; [.2DC1.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NO> +0EC2 0E99 ; [.2DC1.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NO> +0EC3 0E99 ; [.2DC1.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NO> +0EC4 0E99 ; [.2DC1.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NO> +0E9A ; [.2DC2.0020.0002] # LAO LETTER BO +0EC0 0E9A ; [.2DC2.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER BO> +0EC1 0E9A ; [.2DC2.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER BO> +0EC2 0E9A ; [.2DC2.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER BO> +0EC3 0E9A ; [.2DC2.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER BO> +0EC4 0E9A ; [.2DC2.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER BO> +0E9B ; [.2DC3.0020.0002] # LAO LETTER PO +0EC0 0E9B ; [.2DC3.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PO> +0EC1 0E9B ; [.2DC3.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PO> +0EC2 0E9B ; [.2DC3.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PO> +0EC3 0E9B ; [.2DC3.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PO> +0EC4 0E9B ; [.2DC3.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PO> +0E9C ; [.2DC4.0020.0002] # LAO LETTER PHO SUNG +0EC0 0E9C ; [.2DC4.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG> +0EC1 0E9C ; [.2DC4.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG> +0EC2 0E9C ; [.2DC4.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG> +0EC3 0E9C ; [.2DC4.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG> +0EC4 0E9C ; [.2DC4.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG> +0E9D ; [.2DC5.0020.0002] # LAO LETTER FO TAM +0EC0 0E9D ; [.2DC5.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO TAM> +0EC1 0E9D ; [.2DC5.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM> +0EC2 0E9D ; [.2DC5.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO TAM> +0EC3 0E9D ; [.2DC5.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM> +0EC4 0E9D ; [.2DC5.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM> +0E9E ; [.2DC6.0020.0002] # LAO LETTER PHO TAM +0EC0 0E9E ; [.2DC6.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM> +0EC1 0E9E ; [.2DC6.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM> +0EC2 0E9E ; [.2DC6.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM> +0EC3 0E9E ; [.2DC6.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM> +0EC4 0E9E ; [.2DC6.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM> +0E9F ; [.2DC7.0020.0002] # LAO LETTER FO SUNG +0EC0 0E9F ; [.2DC7.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG> +0EC1 0E9F ; [.2DC7.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG> +0EC2 0E9F ; [.2DC7.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG> +0EC3 0E9F ; [.2DC7.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG> +0EC4 0E9F ; [.2DC7.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG> +0EA1 ; [.2DC8.0020.0002] # LAO LETTER MO +0EC0 0EA1 ; [.2DC8.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER MO> +0EC1 0EA1 ; [.2DC8.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER MO> +0EC2 0EA1 ; [.2DC8.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER MO> +0EC3 0EA1 ; [.2DC8.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER MO> +0EC4 0EA1 ; [.2DC8.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER MO> +0EA2 ; [.2DC9.0020.0002] # LAO LETTER YO +0EC0 0EA2 ; [.2DC9.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER YO> +0EC1 0EA2 ; [.2DC9.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER YO> +0EC2 0EA2 ; [.2DC9.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER YO> +0EC3 0EA2 ; [.2DC9.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER YO> +0EC4 0EA2 ; [.2DC9.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER YO> +0EA3 ; [.2DCA.0020.0002] # LAO LETTER LO LING +0EC0 0EA3 ; [.2DCA.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LING> +0EC1 0EA3 ; [.2DCA.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LING> +0EC2 0EA3 ; [.2DCA.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LING> +0EC3 0EA3 ; [.2DCA.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LING> +0EC4 0EA3 ; [.2DCA.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LING> +0EA5 ; [.2DCB.0020.0002] # LAO LETTER LO LOOT +0EC0 0EA5 ; [.2DCB.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT> +0EC1 0EA5 ; [.2DCB.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT> +0EC2 0EA5 ; [.2DCB.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT> +0EC3 0EA5 ; [.2DCB.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT> +0EC4 0EA5 ; [.2DCB.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT> +0EA7 ; [.2DCC.0020.0002] # LAO LETTER WO +0EC0 0EA7 ; [.2DCC.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER WO> +0EC1 0EA7 ; [.2DCC.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER WO> +0EC2 0EA7 ; [.2DCC.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER WO> +0EC3 0EA7 ; [.2DCC.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER WO> +0EC4 0EA7 ; [.2DCC.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER WO> +0EAB ; [.2DCD.0020.0002] # LAO LETTER HO SUNG +0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004] # LAO HO NO +0EC0 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO HO NO> +0EC1 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO HO NO> +0EC2 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO HO NO> +0EC3 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO HO NO> +0EC4 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO HO NO> +0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004] # LAO HO MO +0EC0 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO HO MO> +0EC1 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO HO MO> +0EC2 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO HO MO> +0EC3 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO HO MO> +0EC4 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO HO MO> +0EC0 0EAB ; [.2DCD.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG> +0EC1 0EAB ; [.2DCD.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG> +0EC2 0EAB ; [.2DCD.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG> +0EC3 0EAB ; [.2DCD.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG> +0EC4 0EAB ; [.2DCD.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG> +0EAD ; [.2DCE.0020.0002] # LAO LETTER O +0EC0 0EAD ; [.2DCE.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER O> +0EC1 0EAD ; [.2DCE.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER O> +0EC2 0EAD ; [.2DCE.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER O> +0EC3 0EAD ; [.2DCE.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER O> +0EC4 0EAD ; [.2DCE.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER O> +0EAE ; [.2DCF.0020.0002] # LAO LETTER HO TAM +0EC0 0EAE ; [.2DCF.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO TAM> +0EC1 0EAE ; [.2DCF.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM> +0EC2 0EAE ; [.2DCF.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO TAM> +0EC3 0EAE ; [.2DCF.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM> +0EC4 0EAE ; [.2DCF.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM> +0EAF ; [.2DD0.0020.0002] # LAO ELLIPSIS +0EB0 ; [.2DD1.0020.0002] # LAO VOWEL SIGN A +0EB1 ; [.2DD2.0020.0002] # LAO VOWEL SIGN MAI KAN +0EB2 ; [.2DD3.0020.0002] # LAO VOWEL SIGN AA +0EB3 ; [.2DD4.0020.0002] # LAO VOWEL SIGN AM +0ECD 0EB2 ; [.2DD4.0020.0002] # LAO VOWEL SIGN AM +0EB4 ; [.2DD5.0020.0002] # LAO VOWEL SIGN I +0EB5 ; [.2DD6.0020.0002] # LAO VOWEL SIGN II +0EB6 ; [.2DD7.0020.0002] # LAO VOWEL SIGN Y +0EB7 ; [.2DD8.0020.0002] # LAO VOWEL SIGN YY +0EB8 ; [.2DD9.0020.0002] # LAO VOWEL SIGN U +0EB9 ; [.2DDA.0020.0002] # LAO VOWEL SIGN UU +0EBB ; [.2DDB.0020.0002] # LAO VOWEL SIGN MAI KON +0EBC ; [.2DDC.0020.0002] # LAO SEMIVOWEL SIGN LO +0EBD ; [.2DDD.0020.0002] # LAO SEMIVOWEL SIGN NYO +0EC0 ; [.2DDE.0020.0002] # LAO VOWEL SIGN E +0EC1 ; [.2DDF.0020.0002] # LAO VOWEL SIGN EI +0EC2 ; [.2DE0.0020.0002] # LAO VOWEL SIGN O +0EC3 ; [.2DE1.0020.0002] # LAO VOWEL SIGN AY +0EC4 ; [.2DE2.0020.0002] # LAO VOWEL SIGN AI +AA80 ; [.2DE3.0020.0002] # TAI VIET LETTER LOW KO +AAB5 AA80 ; [.2DE3.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KO> +AAB6 AA80 ; [.2DE3.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KO> +AAB9 AA80 ; [.2DE3.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KO> +AABB AA80 ; [.2DE3.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KO> +AABC AA80 ; [.2DE3.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KO> +AA81 ; [.2DE4.0020.0002] # TAI VIET LETTER HIGH KO +AAB5 AA81 ; [.2DE4.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KO> +AAB6 AA81 ; [.2DE4.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KO> +AAB9 AA81 ; [.2DE4.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KO> +AABB AA81 ; [.2DE4.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KO> +AABC AA81 ; [.2DE4.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KO> +AA82 ; [.2DE5.0020.0002] # TAI VIET LETTER LOW KHO +AAB5 AA82 ; [.2DE5.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHO> +AAB6 AA82 ; [.2DE5.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHO> +AAB9 AA82 ; [.2DE5.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHO> +AABB AA82 ; [.2DE5.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHO> +AABC AA82 ; [.2DE5.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHO> +AA83 ; [.2DE6.0020.0002] # TAI VIET LETTER HIGH KHO +AAB5 AA83 ; [.2DE6.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHO> +AAB6 AA83 ; [.2DE6.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHO> +AAB9 AA83 ; [.2DE6.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHO> +AABB AA83 ; [.2DE6.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHO> +AABC AA83 ; [.2DE6.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHO> +AA84 ; [.2DE7.0020.0002] # TAI VIET LETTER LOW KHHO +AAB5 AA84 ; [.2DE7.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHHO> +AAB6 AA84 ; [.2DE7.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHHO> +AAB9 AA84 ; [.2DE7.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHHO> +AABB AA84 ; [.2DE7.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHHO> +AABC AA84 ; [.2DE7.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHHO> +AA85 ; [.2DE8.0020.0002] # TAI VIET LETTER HIGH KHHO +AAB5 AA85 ; [.2DE8.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHHO> +AAB6 AA85 ; [.2DE8.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHHO> +AAB9 AA85 ; [.2DE8.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHHO> +AABB AA85 ; [.2DE8.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHHO> +AABC AA85 ; [.2DE8.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHHO> +AA86 ; [.2DE9.0020.0002] # TAI VIET LETTER LOW GO +AAB5 AA86 ; [.2DE9.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW GO> +AAB6 AA86 ; [.2DE9.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW GO> +AAB9 AA86 ; [.2DE9.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW GO> +AABB AA86 ; [.2DE9.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW GO> +AABC AA86 ; [.2DE9.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW GO> +AA87 ; [.2DEA.0020.0002] # TAI VIET LETTER HIGH GO +AAB5 AA87 ; [.2DEA.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH GO> +AAB6 AA87 ; [.2DEA.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH GO> +AAB9 AA87 ; [.2DEA.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH GO> +AABB AA87 ; [.2DEA.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH GO> +AABC AA87 ; [.2DEA.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH GO> +AA88 ; [.2DEB.0020.0002] # TAI VIET LETTER LOW NGO +AAB5 AA88 ; [.2DEB.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NGO> +AAB6 AA88 ; [.2DEB.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NGO> +AAB9 AA88 ; [.2DEB.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NGO> +AABB AA88 ; [.2DEB.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NGO> +AABC AA88 ; [.2DEB.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NGO> +AA89 ; [.2DEC.0020.0002] # TAI VIET LETTER HIGH NGO +AAB5 AA89 ; [.2DEC.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NGO> +AAB6 AA89 ; [.2DEC.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NGO> +AAB9 AA89 ; [.2DEC.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NGO> +AABB AA89 ; [.2DEC.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NGO> +AABC AA89 ; [.2DEC.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NGO> +AA8A ; [.2DED.0020.0002] # TAI VIET LETTER LOW CO +AAB5 AA8A ; [.2DED.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CO> +AAB6 AA8A ; [.2DED.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CO> +AAB9 AA8A ; [.2DED.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CO> +AABB AA8A ; [.2DED.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CO> +AABC AA8A ; [.2DED.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CO> +AA8B ; [.2DEE.0020.0002] # TAI VIET LETTER HIGH CO +AAB5 AA8B ; [.2DEE.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CO> +AAB6 AA8B ; [.2DEE.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CO> +AAB9 AA8B ; [.2DEE.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CO> +AABB AA8B ; [.2DEE.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CO> +AABC AA8B ; [.2DEE.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CO> +AA8C ; [.2DEF.0020.0002] # TAI VIET LETTER LOW CHO +AAB5 AA8C ; [.2DEF.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CHO> +AAB6 AA8C ; [.2DEF.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CHO> +AAB9 AA8C ; [.2DEF.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CHO> +AABB AA8C ; [.2DEF.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CHO> +AABC AA8C ; [.2DEF.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CHO> +AA8D ; [.2DF0.0020.0002] # TAI VIET LETTER HIGH CHO +AAB5 AA8D ; [.2DF0.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CHO> +AAB6 AA8D ; [.2DF0.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CHO> +AAB9 AA8D ; [.2DF0.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CHO> +AABB AA8D ; [.2DF0.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CHO> +AABC AA8D ; [.2DF0.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CHO> +AA8E ; [.2DF1.0020.0002] # TAI VIET LETTER LOW SO +AAB5 AA8E ; [.2DF1.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW SO> +AAB6 AA8E ; [.2DF1.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW SO> +AAB9 AA8E ; [.2DF1.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW SO> +AABB AA8E ; [.2DF1.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW SO> +AABC AA8E ; [.2DF1.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW SO> +AA8F ; [.2DF2.0020.0002] # TAI VIET LETTER HIGH SO +AAB5 AA8F ; [.2DF2.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH SO> +AAB6 AA8F ; [.2DF2.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH SO> +AAB9 AA8F ; [.2DF2.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH SO> +AABB AA8F ; [.2DF2.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH SO> +AABC AA8F ; [.2DF2.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH SO> +AA90 ; [.2DF3.0020.0002] # TAI VIET LETTER LOW NYO +AAB5 AA90 ; [.2DF3.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NYO> +AAB6 AA90 ; [.2DF3.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NYO> +AAB9 AA90 ; [.2DF3.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NYO> +AABB AA90 ; [.2DF3.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NYO> +AABC AA90 ; [.2DF3.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NYO> +AA91 ; [.2DF4.0020.0002] # TAI VIET LETTER HIGH NYO +AAB5 AA91 ; [.2DF4.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NYO> +AAB6 AA91 ; [.2DF4.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NYO> +AAB9 AA91 ; [.2DF4.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NYO> +AABB AA91 ; [.2DF4.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NYO> +AABC AA91 ; [.2DF4.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NYO> +AA92 ; [.2DF5.0020.0002] # TAI VIET LETTER LOW DO +AAB5 AA92 ; [.2DF5.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW DO> +AAB6 AA92 ; [.2DF5.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW DO> +AAB9 AA92 ; [.2DF5.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW DO> +AABB AA92 ; [.2DF5.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW DO> +AABC AA92 ; [.2DF5.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW DO> +AA93 ; [.2DF6.0020.0002] # TAI VIET LETTER HIGH DO +AAB5 AA93 ; [.2DF6.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH DO> +AAB6 AA93 ; [.2DF6.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH DO> +AAB9 AA93 ; [.2DF6.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH DO> +AABB AA93 ; [.2DF6.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH DO> +AABC AA93 ; [.2DF6.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH DO> +AA94 ; [.2DF7.0020.0002] # TAI VIET LETTER LOW TO +AAB5 AA94 ; [.2DF7.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW TO> +AAB6 AA94 ; [.2DF7.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW TO> +AAB9 AA94 ; [.2DF7.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW TO> +AABB AA94 ; [.2DF7.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW TO> +AABC AA94 ; [.2DF7.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW TO> +AA95 ; [.2DF8.0020.0002] # TAI VIET LETTER HIGH TO +AAB5 AA95 ; [.2DF8.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH TO> +AAB6 AA95 ; [.2DF8.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH TO> +AAB9 AA95 ; [.2DF8.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH TO> +AABB AA95 ; [.2DF8.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH TO> +AABC AA95 ; [.2DF8.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH TO> +AA96 ; [.2DF9.0020.0002] # TAI VIET LETTER LOW THO +AAB5 AA96 ; [.2DF9.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW THO> +AAB6 AA96 ; [.2DF9.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW THO> +AAB9 AA96 ; [.2DF9.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW THO> +AABB AA96 ; [.2DF9.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW THO> +AABC AA96 ; [.2DF9.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW THO> +AA97 ; [.2DFA.0020.0002] # TAI VIET LETTER HIGH THO +AAB5 AA97 ; [.2DFA.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH THO> +AAB6 AA97 ; [.2DFA.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH THO> +AAB9 AA97 ; [.2DFA.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH THO> +AABB AA97 ; [.2DFA.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH THO> +AABC AA97 ; [.2DFA.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH THO> +AA98 ; [.2DFB.0020.0002] # TAI VIET LETTER LOW NO +AAB5 AA98 ; [.2DFB.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NO> +AAB6 AA98 ; [.2DFB.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NO> +AAB9 AA98 ; [.2DFB.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NO> +AABB AA98 ; [.2DFB.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NO> +AABC AA98 ; [.2DFB.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NO> +AA99 ; [.2DFC.0020.0002] # TAI VIET LETTER HIGH NO +AAB5 AA99 ; [.2DFC.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NO> +AAB6 AA99 ; [.2DFC.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NO> +AAB9 AA99 ; [.2DFC.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NO> +AABB AA99 ; [.2DFC.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NO> +AABC AA99 ; [.2DFC.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NO> +AA9A ; [.2DFD.0020.0002] # TAI VIET LETTER LOW BO +AAB5 AA9A ; [.2DFD.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW BO> +AAB6 AA9A ; [.2DFD.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW BO> +AAB9 AA9A ; [.2DFD.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW BO> +AABB AA9A ; [.2DFD.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW BO> +AABC AA9A ; [.2DFD.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW BO> +AA9B ; [.2DFE.0020.0002] # TAI VIET LETTER HIGH BO +AAB5 AA9B ; [.2DFE.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH BO> +AAB6 AA9B ; [.2DFE.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH BO> +AAB9 AA9B ; [.2DFE.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH BO> +AABB AA9B ; [.2DFE.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH BO> +AABC AA9B ; [.2DFE.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH BO> +AA9C ; [.2DFF.0020.0002] # TAI VIET LETTER LOW PO +AAB5 AA9C ; [.2DFF.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PO> +AAB6 AA9C ; [.2DFF.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PO> +AAB9 AA9C ; [.2DFF.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PO> +AABB AA9C ; [.2DFF.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PO> +AABC AA9C ; [.2DFF.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PO> +AA9D ; [.2E00.0020.0002] # TAI VIET LETTER HIGH PO +AAB5 AA9D ; [.2E00.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PO> +AAB6 AA9D ; [.2E00.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PO> +AAB9 AA9D ; [.2E00.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PO> +AABB AA9D ; [.2E00.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PO> +AABC AA9D ; [.2E00.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PO> +AA9E ; [.2E01.0020.0002] # TAI VIET LETTER LOW PHO +AAB5 AA9E ; [.2E01.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PHO> +AAB6 AA9E ; [.2E01.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PHO> +AAB9 AA9E ; [.2E01.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PHO> +AABB AA9E ; [.2E01.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PHO> +AABC AA9E ; [.2E01.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PHO> +AA9F ; [.2E02.0020.0002] # TAI VIET LETTER HIGH PHO +AAB5 AA9F ; [.2E02.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PHO> +AAB6 AA9F ; [.2E02.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PHO> +AAB9 AA9F ; [.2E02.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PHO> +AABB AA9F ; [.2E02.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PHO> +AABC AA9F ; [.2E02.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PHO> +AAA0 ; [.2E03.0020.0002] # TAI VIET LETTER LOW FO +AAB5 AAA0 ; [.2E03.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW FO> +AAB6 AAA0 ; [.2E03.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW FO> +AAB9 AAA0 ; [.2E03.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW FO> +AABB AAA0 ; [.2E03.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW FO> +AABC AAA0 ; [.2E03.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW FO> +AAA1 ; [.2E04.0020.0002] # TAI VIET LETTER HIGH FO +AAB5 AAA1 ; [.2E04.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH FO> +AAB6 AAA1 ; [.2E04.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH FO> +AAB9 AAA1 ; [.2E04.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH FO> +AABB AAA1 ; [.2E04.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH FO> +AABC AAA1 ; [.2E04.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH FO> +AAA2 ; [.2E05.0020.0002] # TAI VIET LETTER LOW MO +AAB5 AAA2 ; [.2E05.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW MO> +AAB6 AAA2 ; [.2E05.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW MO> +AAB9 AAA2 ; [.2E05.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW MO> +AABB AAA2 ; [.2E05.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW MO> +AABC AAA2 ; [.2E05.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW MO> +AAA3 ; [.2E06.0020.0002] # TAI VIET LETTER HIGH MO +AAB5 AAA3 ; [.2E06.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH MO> +AAB6 AAA3 ; [.2E06.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH MO> +AAB9 AAA3 ; [.2E06.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH MO> +AABB AAA3 ; [.2E06.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH MO> +AABC AAA3 ; [.2E06.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH MO> +AAA4 ; [.2E07.0020.0002] # TAI VIET LETTER LOW YO +AAB5 AAA4 ; [.2E07.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW YO> +AAB6 AAA4 ; [.2E07.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW YO> +AAB9 AAA4 ; [.2E07.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW YO> +AABB AAA4 ; [.2E07.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW YO> +AABC AAA4 ; [.2E07.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW YO> +AAA5 ; [.2E08.0020.0002] # TAI VIET LETTER HIGH YO +AAB5 AAA5 ; [.2E08.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH YO> +AAB6 AAA5 ; [.2E08.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH YO> +AAB9 AAA5 ; [.2E08.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH YO> +AABB AAA5 ; [.2E08.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH YO> +AABC AAA5 ; [.2E08.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH YO> +AAA6 ; [.2E09.0020.0002] # TAI VIET LETTER LOW RO +AAB5 AAA6 ; [.2E09.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW RO> +AAB6 AAA6 ; [.2E09.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW RO> +AAB9 AAA6 ; [.2E09.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW RO> +AABB AAA6 ; [.2E09.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW RO> +AABC AAA6 ; [.2E09.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW RO> +AAA7 ; [.2E0A.0020.0002] # TAI VIET LETTER HIGH RO +AAB5 AAA7 ; [.2E0A.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH RO> +AAB6 AAA7 ; [.2E0A.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH RO> +AAB9 AAA7 ; [.2E0A.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH RO> +AABB AAA7 ; [.2E0A.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH RO> +AABC AAA7 ; [.2E0A.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH RO> +AAA8 ; [.2E0B.0020.0002] # TAI VIET LETTER LOW LO +AAB5 AAA8 ; [.2E0B.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW LO> +AAB6 AAA8 ; [.2E0B.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW LO> +AAB9 AAA8 ; [.2E0B.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW LO> +AABB AAA8 ; [.2E0B.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW LO> +AABC AAA8 ; [.2E0B.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW LO> +AAA9 ; [.2E0C.0020.0002] # TAI VIET LETTER HIGH LO +AAB5 AAA9 ; [.2E0C.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH LO> +AAB6 AAA9 ; [.2E0C.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH LO> +AAB9 AAA9 ; [.2E0C.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH LO> +AABB AAA9 ; [.2E0C.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH LO> +AABC AAA9 ; [.2E0C.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH LO> +AAAA ; [.2E0D.0020.0002] # TAI VIET LETTER LOW VO +AAB5 AAAA ; [.2E0D.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW VO> +AAB6 AAAA ; [.2E0D.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW VO> +AAB9 AAAA ; [.2E0D.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW VO> +AABB AAAA ; [.2E0D.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW VO> +AABC AAAA ; [.2E0D.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW VO> +AAAB ; [.2E0E.0020.0002] # TAI VIET LETTER HIGH VO +AAB5 AAAB ; [.2E0E.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH VO> +AAB6 AAAB ; [.2E0E.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH VO> +AAB9 AAAB ; [.2E0E.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH VO> +AABB AAAB ; [.2E0E.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH VO> +AABC AAAB ; [.2E0E.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH VO> +AAAC ; [.2E0F.0020.0002] # TAI VIET LETTER LOW HO +AAB5 AAAC ; [.2E0F.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW HO> +AAB6 AAAC ; [.2E0F.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW HO> +AAB9 AAAC ; [.2E0F.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW HO> +AABB AAAC ; [.2E0F.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW HO> +AABC AAAC ; [.2E0F.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW HO> +AAAD ; [.2E10.0020.0002] # TAI VIET LETTER HIGH HO +AAB5 AAAD ; [.2E10.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH HO> +AAB6 AAAD ; [.2E10.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH HO> +AAB9 AAAD ; [.2E10.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH HO> +AABB AAAD ; [.2E10.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH HO> +AABC AAAD ; [.2E10.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH HO> +AAAE ; [.2E11.0020.0002] # TAI VIET LETTER LOW O +AAB5 AAAE ; [.2E11.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW O> +AAB6 AAAE ; [.2E11.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW O> +AAB9 AAAE ; [.2E11.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW O> +AABB AAAE ; [.2E11.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW O> +AABC AAAE ; [.2E11.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW O> +AAAF ; [.2E12.0020.0002] # TAI VIET LETTER HIGH O +AAB5 AAAF ; [.2E12.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH O> +AAB6 AAAF ; [.2E12.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH O> +AAB9 AAAF ; [.2E12.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH O> +AABB AAAF ; [.2E12.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH O> +AABC AAAF ; [.2E12.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH O> +AAB0 ; [.2E13.0020.0002] # TAI VIET MAI KANG +AAB1 ; [.2E14.0020.0002] # TAI VIET VOWEL AA +AAB2 ; [.2E15.0020.0002] # TAI VIET VOWEL I +AAB3 ; [.2E16.0020.0002] # TAI VIET VOWEL UE +AAB4 ; [.2E17.0020.0002] # TAI VIET VOWEL U +AAB5 ; [.2E18.0020.0002] # TAI VIET VOWEL E +AAB6 ; [.2E19.0020.0002] # TAI VIET VOWEL O +AAB7 ; [.2E1A.0020.0002] # TAI VIET MAI KHIT +AAB8 ; [.2E1B.0020.0002] # TAI VIET VOWEL IA +AAB9 ; [.2E1C.0020.0002] # TAI VIET VOWEL UEA +AABA ; [.2E1D.0020.0002] # TAI VIET VOWEL UA +AABB ; [.2E1E.0020.0002] # TAI VIET VOWEL AUE +AABC ; [.2E1F.0020.0002] # TAI VIET VOWEL AY +AABD ; [.2E20.0020.0002] # TAI VIET VOWEL AN +AABE ; [.2E21.0020.0002] # TAI VIET VOWEL AM +AAC0 ; [.2E22.0020.0002] # TAI VIET TONE MAI NUENG +AAC2 ; [.2E23.0020.0002] # TAI VIET TONE MAI SONG +AADB ; [.2E24.0020.0002] # TAI VIET SYMBOL KON +AADC ; [.2E25.0020.0002] # TAI VIET SYMBOL NUENG +0F40 ; [.2E26.0020.0002] # TIBETAN LETTER KA +0F69 ; [.2E26.0020.0002][.2E67.0020.0002] # TIBETAN LETTER KSSA +0F90 ; [.2E27.0020.0002] # TIBETAN SUBJOINED LETTER KA +0FB9 ; [.2E27.0020.0002][.2E67.0020.0002] # TIBETAN SUBJOINED LETTER KSSA +0F6B ; [.2E28.0020.0002] # TIBETAN LETTER KKA +0F41 ; [.2E29.0020.0002] # TIBETAN LETTER KHA +0F91 ; [.2E2A.0020.0002] # TIBETAN SUBJOINED LETTER KHA +0F42 ; [.2E2B.0020.0002] # TIBETAN LETTER GA +0F43 ; [.2E2B.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER GHA +0F92 ; [.2E2C.0020.0002] # TIBETAN SUBJOINED LETTER GA +0F93 ; [.2E2C.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER GHA +0F44 ; [.2E2D.0020.0002] # TIBETAN LETTER NGA +0F94 ; [.2E2E.0020.0002] # TIBETAN SUBJOINED LETTER NGA +0F45 ; [.2E2F.0020.0002] # TIBETAN LETTER CA +0F95 ; [.2E30.0020.0002] # TIBETAN SUBJOINED LETTER CA +0F46 ; [.2E31.0020.0002] # TIBETAN LETTER CHA +0F96 ; [.2E32.0020.0002] # TIBETAN SUBJOINED LETTER CHA +0F47 ; [.2E33.0020.0002] # TIBETAN LETTER JA +0F97 ; [.2E34.0020.0002] # TIBETAN SUBJOINED LETTER JA +0F49 ; [.2E35.0020.0002] # TIBETAN LETTER NYA +0F99 ; [.2E36.0020.0002] # TIBETAN SUBJOINED LETTER NYA +0F4A ; [.2E37.0020.0002] # TIBETAN LETTER TTA +0F9A ; [.2E38.0020.0002] # TIBETAN SUBJOINED LETTER TTA +0F4B ; [.2E39.0020.0002] # TIBETAN LETTER TTHA +0F9B ; [.2E3A.0020.0002] # TIBETAN SUBJOINED LETTER TTHA +0F4C ; [.2E3B.0020.0002] # TIBETAN LETTER DDA +0F4D ; [.2E3B.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER DDHA +0F9C ; [.2E3C.0020.0002] # TIBETAN SUBJOINED LETTER DDA +0F9D ; [.2E3C.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER DDHA +0F4E ; [.2E3D.0020.0002] # TIBETAN LETTER NNA +0F9E ; [.2E3E.0020.0002] # TIBETAN SUBJOINED LETTER NNA +0F4F ; [.2E3F.0020.0002] # TIBETAN LETTER TA +0F9F ; [.2E40.0020.0002] # TIBETAN SUBJOINED LETTER TA +0F50 ; [.2E41.0020.0002] # TIBETAN LETTER THA +0FA0 ; [.2E42.0020.0002] # TIBETAN SUBJOINED LETTER THA +0F51 ; [.2E43.0020.0002] # TIBETAN LETTER DA +0F52 ; [.2E43.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER DHA +0FA1 ; [.2E44.0020.0002] # TIBETAN SUBJOINED LETTER DA +0FA2 ; [.2E44.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER DHA +0F53 ; [.2E45.0020.0002] # TIBETAN LETTER NA +0FA3 ; [.2E46.0020.0002] # TIBETAN SUBJOINED LETTER NA +0F54 ; [.2E47.0020.0002] # TIBETAN LETTER PA +0FA4 ; [.2E48.0020.0002] # TIBETAN SUBJOINED LETTER PA +0F55 ; [.2E49.0020.0002] # TIBETAN LETTER PHA +0FA5 ; [.2E4A.0020.0002] # TIBETAN SUBJOINED LETTER PHA +0F56 ; [.2E4B.0020.0002] # TIBETAN LETTER BA +0F57 ; [.2E4B.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER BHA +0FA6 ; [.2E4C.0020.0002] # TIBETAN SUBJOINED LETTER BA +0FA7 ; [.2E4C.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER BHA +0F58 ; [.2E4D.0020.0002] # TIBETAN LETTER MA +0FA8 ; [.2E4E.0020.0002] # TIBETAN SUBJOINED LETTER MA +0F59 ; [.2E4F.0020.0002] # TIBETAN LETTER TSA +0FA9 ; [.2E50.0020.0002] # TIBETAN SUBJOINED LETTER TSA +0F5A ; [.2E51.0020.0002] # TIBETAN LETTER TSHA +0FAA ; [.2E52.0020.0002] # TIBETAN SUBJOINED LETTER TSHA +0F5B ; [.2E53.0020.0002] # TIBETAN LETTER DZA +0F5C ; [.2E53.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER DZHA +0FAB ; [.2E54.0020.0002] # TIBETAN SUBJOINED LETTER DZA +0FAC ; [.2E54.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER DZHA +0F5D ; [.2E55.0020.0002] # TIBETAN LETTER WA +0FAD ; [.2E56.0020.0002] # TIBETAN SUBJOINED LETTER WA +0FBA ; [.2E56.0020.0004][.0000.0111.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM WA +0F5E ; [.2E57.0020.0002] # TIBETAN LETTER ZHA +0FAE ; [.2E58.0020.0002] # TIBETAN SUBJOINED LETTER ZHA +0F5F ; [.2E59.0020.0002] # TIBETAN LETTER ZA +0FAF ; [.2E5A.0020.0002] # TIBETAN SUBJOINED LETTER ZA +0F60 ; [.2E5B.0020.0002] # TIBETAN LETTER -A +0FB0 ; [.2E5C.0020.0002] # TIBETAN SUBJOINED LETTER -A +0F61 ; [.2E5D.0020.0002] # TIBETAN LETTER YA +0FB1 ; [.2E5E.0020.0002] # TIBETAN SUBJOINED LETTER YA +0FBB ; [.2E5E.0020.0004][.0000.0111.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM YA +0F62 ; [.2E5F.0020.0002] # TIBETAN LETTER RA +0F6A ; [.2E5F.0020.0004][.0000.0111.0004] # TIBETAN LETTER FIXED-FORM RA +0FB2 ; [.2E60.0020.0002] # TIBETAN SUBJOINED LETTER RA +0FBC ; [.2E60.0020.0004][.0000.0111.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM RA +0F6C ; [.2E61.0020.0002] # TIBETAN LETTER RRA +0F63 ; [.2E62.0020.0002] # TIBETAN LETTER LA +0FB3 ; [.2E63.0020.0002] # TIBETAN SUBJOINED LETTER LA +0F64 ; [.2E64.0020.0002] # TIBETAN LETTER SHA +0FB4 ; [.2E65.0020.0002] # TIBETAN SUBJOINED LETTER SHA +0F65 ; [.2E66.0020.0002] # TIBETAN LETTER SSA +0FB5 ; [.2E67.0020.0002] # TIBETAN SUBJOINED LETTER SSA +0F66 ; [.2E68.0020.0002] # TIBETAN LETTER SA +0FB6 ; [.2E69.0020.0002] # TIBETAN SUBJOINED LETTER SA +0F67 ; [.2E6A.0020.0002] # TIBETAN LETTER HA +0FB7 ; [.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER HA +0F68 ; [.2E6C.0020.0002] # TIBETAN LETTER A +0F00 ; [.2E6C.0020.0004][.2E83.0020.0004][.0000.00C4.0004] # TIBETAN SYLLABLE OM +0FB8 ; [.2E6D.0020.0002] # TIBETAN SUBJOINED LETTER A +0F88 ; [.2E6E.0020.0002] # TIBETAN SIGN LCE TSA CAN +0F8D ; [.2E6F.0020.0002] # TIBETAN SUBJOINED SIGN LCE TSA CAN +0F89 ; [.2E70.0020.0002] # TIBETAN SIGN MCHU CAN +0F8E ; [.2E71.0020.0002] # TIBETAN SUBJOINED SIGN MCHU CAN +0F8C ; [.2E72.0020.0002] # TIBETAN SIGN INVERTED MCHU CAN +0F8F ; [.2E73.0020.0002] # TIBETAN SUBJOINED SIGN INVERTED MCHU CAN +0F8A ; [.2E74.0020.0002] # TIBETAN SIGN GRU CAN RGYINGS +0F8B ; [.2E75.0020.0002] # TIBETAN SIGN GRU MED RGYINGS +0F71 ; [.2E76.0020.0002] # TIBETAN VOWEL SIGN AA +0F72 ; [.2E77.0020.0002] # TIBETAN VOWEL SIGN I +0F73 ; [.2E78.0020.0002] # TIBETAN VOWEL SIGN II +0F71 0F72 ; [.2E78.0020.0002] # TIBETAN VOWEL SIGN II +0F80 ; [.2E79.0020.0002] # TIBETAN VOWEL SIGN REVERSED I +0F81 ; [.2E7A.0020.0002] # TIBETAN VOWEL SIGN REVERSED II +0F71 0F80 ; [.2E7A.0020.0002] # TIBETAN VOWEL SIGN REVERSED II +0F74 ; [.2E7B.0020.0002] # TIBETAN VOWEL SIGN U +0F75 ; [.2E7C.0020.0002] # TIBETAN VOWEL SIGN UU +0F71 0F74 ; [.2E7C.0020.0002] # TIBETAN VOWEL SIGN UU +0F76 ; [.2E7D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R +0FB2 0F80 ; [.2E7D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R +0F77 ; [.2E7E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0FB2 0F71 0F80 ; [.2E7E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0FB2 0F81 ; [.2E7E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0F78 ; [.2E7F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L +0FB3 0F80 ; [.2E7F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L +0F79 ; [.2E80.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0FB3 0F71 0F80 ; [.2E80.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0FB3 0F81 ; [.2E80.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0F7A ; [.2E81.0020.0002] # TIBETAN VOWEL SIGN E +0F7B ; [.2E82.0020.0002] # TIBETAN VOWEL SIGN EE +0F7C ; [.2E83.0020.0002] # TIBETAN VOWEL SIGN O +0F7D ; [.2E84.0020.0002] # TIBETAN VOWEL SIGN OO +0F84 ; [.2E85.0020.0002] # TIBETAN MARK HALANTA +11C72 ; [.2E86.0020.0002] # MARCHEN LETTER KA +11C92 ; [.2E87.0020.0002] # MARCHEN SUBJOINED LETTER KA +11C73 ; [.2E88.0020.0002] # MARCHEN LETTER KHA +11C93 ; [.2E89.0020.0002] # MARCHEN SUBJOINED LETTER KHA +11C74 ; [.2E8A.0020.0002] # MARCHEN LETTER GA +11C94 ; [.2E8B.0020.0002] # MARCHEN SUBJOINED LETTER GA +11C75 ; [.2E8C.0020.0002] # MARCHEN LETTER NGA +11C95 ; [.2E8D.0020.0002] # MARCHEN SUBJOINED LETTER NGA +11C76 ; [.2E8E.0020.0002] # MARCHEN LETTER CA +11C96 ; [.2E8F.0020.0002] # MARCHEN SUBJOINED LETTER CA +11C77 ; [.2E90.0020.0002] # MARCHEN LETTER CHA +11C97 ; [.2E91.0020.0002] # MARCHEN SUBJOINED LETTER CHA +11C78 ; [.2E92.0020.0002] # MARCHEN LETTER JA +11C98 ; [.2E93.0020.0002] # MARCHEN SUBJOINED LETTER JA +11C79 ; [.2E94.0020.0002] # MARCHEN LETTER NYA +11C99 ; [.2E95.0020.0002] # MARCHEN SUBJOINED LETTER NYA +11C7A ; [.2E96.0020.0002] # MARCHEN LETTER TA +11C9A ; [.2E97.0020.0002] # MARCHEN SUBJOINED LETTER TA +11C7B ; [.2E98.0020.0002] # MARCHEN LETTER THA +11C9B ; [.2E99.0020.0002] # MARCHEN SUBJOINED LETTER THA +11C7C ; [.2E9A.0020.0002] # MARCHEN LETTER DA +11C9C ; [.2E9B.0020.0002] # MARCHEN SUBJOINED LETTER DA +11C7D ; [.2E9C.0020.0002] # MARCHEN LETTER NA +11C9D ; [.2E9D.0020.0002] # MARCHEN SUBJOINED LETTER NA +11C7E ; [.2E9E.0020.0002] # MARCHEN LETTER PA +11C9E ; [.2E9F.0020.0002] # MARCHEN SUBJOINED LETTER PA +11C7F ; [.2EA0.0020.0002] # MARCHEN LETTER PHA +11C9F ; [.2EA1.0020.0002] # MARCHEN SUBJOINED LETTER PHA +11C80 ; [.2EA2.0020.0002] # MARCHEN LETTER BA +11CA0 ; [.2EA3.0020.0002] # MARCHEN SUBJOINED LETTER BA +11C81 ; [.2EA4.0020.0002] # MARCHEN LETTER MA +11CA1 ; [.2EA5.0020.0002] # MARCHEN SUBJOINED LETTER MA +11C82 ; [.2EA6.0020.0002] # MARCHEN LETTER TSA +11CA2 ; [.2EA7.0020.0002] # MARCHEN SUBJOINED LETTER TSA +11C83 ; [.2EA8.0020.0002] # MARCHEN LETTER TSHA +11CA3 ; [.2EA9.0020.0002] # MARCHEN SUBJOINED LETTER TSHA +11C84 ; [.2EAA.0020.0002] # MARCHEN LETTER DZA +11CA4 ; [.2EAB.0020.0002] # MARCHEN SUBJOINED LETTER DZA +11C85 ; [.2EAC.0020.0002] # MARCHEN LETTER WA +11CA5 ; [.2EAD.0020.0002] # MARCHEN SUBJOINED LETTER WA +11C86 ; [.2EAE.0020.0002] # MARCHEN LETTER ZHA +11CA6 ; [.2EAF.0020.0002] # MARCHEN SUBJOINED LETTER ZHA +11C87 ; [.2EB0.0020.0002] # MARCHEN LETTER ZA +11CA7 ; [.2EB1.0020.0002] # MARCHEN SUBJOINED LETTER ZA +11C88 ; [.2EB2.0020.0002] # MARCHEN LETTER -A +11C89 ; [.2EB3.0020.0002] # MARCHEN LETTER YA +11CA9 ; [.2EB4.0020.0002] # MARCHEN SUBJOINED LETTER YA +11C8A ; [.2EB5.0020.0002] # MARCHEN LETTER RA +11CAA ; [.2EB6.0020.0002] # MARCHEN SUBJOINED LETTER RA +11C8B ; [.2EB7.0020.0002] # MARCHEN LETTER LA +11CAB ; [.2EB8.0020.0002] # MARCHEN SUBJOINED LETTER LA +11C8C ; [.2EB9.0020.0002] # MARCHEN LETTER SHA +11CAC ; [.2EBA.0020.0002] # MARCHEN SUBJOINED LETTER SHA +11C8D ; [.2EBB.0020.0002] # MARCHEN LETTER SA +11CAD ; [.2EBC.0020.0002] # MARCHEN SUBJOINED LETTER SA +11C8E ; [.2EBD.0020.0002] # MARCHEN LETTER HA +11CAE ; [.2EBE.0020.0002] # MARCHEN SUBJOINED LETTER HA +11C8F ; [.2EBF.0020.0002] # MARCHEN LETTER A +11CAF ; [.2EC0.0020.0002] # MARCHEN SUBJOINED LETTER A +11CB0 ; [.2EC1.0020.0002] # MARCHEN VOWEL SIGN AA +11CB1 ; [.2EC2.0020.0002] # MARCHEN VOWEL SIGN I +11CB2 ; [.2EC3.0020.0002] # MARCHEN VOWEL SIGN U +11CB3 ; [.2EC4.0020.0002] # MARCHEN VOWEL SIGN E +11CB4 ; [.2EC5.0020.0002] # MARCHEN VOWEL SIGN O +1C00 ; [.2EC6.0020.0002] # LEPCHA LETTER KA +1C01 ; [.2EC7.0020.0002] # LEPCHA LETTER KLA +1C02 ; [.2EC8.0020.0002] # LEPCHA LETTER KHA +1C03 ; [.2EC9.0020.0002] # LEPCHA LETTER GA +1C04 ; [.2ECA.0020.0002] # LEPCHA LETTER GLA +1C05 ; [.2ECB.0020.0002] # LEPCHA LETTER NGA +1C06 ; [.2ECC.0020.0002] # LEPCHA LETTER CA +1C07 ; [.2ECD.0020.0002] # LEPCHA LETTER CHA +1C08 ; [.2ECE.0020.0002] # LEPCHA LETTER JA +1C09 ; [.2ECF.0020.0002] # LEPCHA LETTER NYA +1C4D ; [.2ED0.0020.0002] # LEPCHA LETTER TTA +1C4E ; [.2ED1.0020.0002] # LEPCHA LETTER TTHA +1C4F ; [.2ED2.0020.0002] # LEPCHA LETTER DDA +1C0A ; [.2ED3.0020.0002] # LEPCHA LETTER TA +1C0B ; [.2ED4.0020.0002] # LEPCHA LETTER THA +1C0C ; [.2ED5.0020.0002] # LEPCHA LETTER DA +1C0D ; [.2ED6.0020.0002] # LEPCHA LETTER NA +1C0E ; [.2ED7.0020.0002] # LEPCHA LETTER PA +1C0F ; [.2ED8.0020.0002] # LEPCHA LETTER PLA +1C10 ; [.2ED9.0020.0002] # LEPCHA LETTER PHA +1C11 ; [.2EDA.0020.0002] # LEPCHA LETTER FA +1C12 ; [.2EDB.0020.0002] # LEPCHA LETTER FLA +1C13 ; [.2EDC.0020.0002] # LEPCHA LETTER BA +1C14 ; [.2EDD.0020.0002] # LEPCHA LETTER BLA +1C15 ; [.2EDE.0020.0002] # LEPCHA LETTER MA +1C16 ; [.2EDF.0020.0002] # LEPCHA LETTER MLA +1C17 ; [.2EE0.0020.0002] # LEPCHA LETTER TSA +1C18 ; [.2EE1.0020.0002] # LEPCHA LETTER TSHA +1C19 ; [.2EE2.0020.0002] # LEPCHA LETTER DZA +1C1A ; [.2EE3.0020.0002] # LEPCHA LETTER YA +1C24 ; [.2EE4.0020.0002] # LEPCHA SUBJOINED LETTER YA +1C1B ; [.2EE5.0020.0002] # LEPCHA LETTER RA +1C25 ; [.2EE6.0020.0002] # LEPCHA SUBJOINED LETTER RA +1C1C ; [.2EE7.0020.0002] # LEPCHA LETTER LA +1C1D ; [.2EE8.0020.0002] # LEPCHA LETTER HA +1C1E ; [.2EE9.0020.0002] # LEPCHA LETTER HLA +1C1F ; [.2EEA.0020.0002] # LEPCHA LETTER VA +1C20 ; [.2EEB.0020.0002] # LEPCHA LETTER SA +1C21 ; [.2EEC.0020.0002] # LEPCHA LETTER SHA +1C22 ; [.2EED.0020.0002] # LEPCHA LETTER WA +1C23 ; [.2EEE.0020.0002] # LEPCHA LETTER A +1C36 ; [.2EEF.0020.0002] # LEPCHA SIGN RAN +1C26 ; [.2EF0.0020.0002] # LEPCHA VOWEL SIGN AA +1C27 ; [.2EF1.0020.0002] # LEPCHA VOWEL SIGN I +1C28 ; [.2EF2.0020.0002] # LEPCHA VOWEL SIGN O +1C29 ; [.2EF3.0020.0002] # LEPCHA VOWEL SIGN OO +1C2A ; [.2EF4.0020.0002] # LEPCHA VOWEL SIGN U +1C2B ; [.2EF5.0020.0002] # LEPCHA VOWEL SIGN UU +1C2C ; [.2EF6.0020.0002] # LEPCHA VOWEL SIGN E +1C2D ; [.2EF7.0020.0002] # LEPCHA CONSONANT SIGN K +1C2E ; [.2EF8.0020.0002] # LEPCHA CONSONANT SIGN M +1C2F ; [.2EF9.0020.0002] # LEPCHA CONSONANT SIGN L +1C30 ; [.2EFA.0020.0002] # LEPCHA CONSONANT SIGN N +1C31 ; [.2EFB.0020.0002] # LEPCHA CONSONANT SIGN P +1C32 ; [.2EFC.0020.0002] # LEPCHA CONSONANT SIGN R +1C33 ; [.2EFD.0020.0002] # LEPCHA CONSONANT SIGN T +1C34 ; [.2EFE.0020.0002] # LEPCHA CONSONANT SIGN NYIN-DO +1C35 ; [.2EFF.0020.0002] # LEPCHA CONSONANT SIGN KANG +A840 ; [.2F00.0020.0002] # PHAGS-PA LETTER KA +A841 ; [.2F01.0020.0002] # PHAGS-PA LETTER KHA +A842 ; [.2F02.0020.0002] # PHAGS-PA LETTER GA +A843 ; [.2F03.0020.0002] # PHAGS-PA LETTER NGA +A844 ; [.2F04.0020.0002] # PHAGS-PA LETTER CA +A845 ; [.2F05.0020.0002] # PHAGS-PA LETTER CHA +A846 ; [.2F06.0020.0002] # PHAGS-PA LETTER JA +A847 ; [.2F07.0020.0002] # PHAGS-PA LETTER NYA +A869 ; [.2F08.0020.0002] # PHAGS-PA LETTER TTA +A86A ; [.2F09.0020.0002] # PHAGS-PA LETTER TTHA +A86B ; [.2F0A.0020.0002] # PHAGS-PA LETTER DDA +A86C ; [.2F0B.0020.0002] # PHAGS-PA LETTER NNA +A848 ; [.2F0C.0020.0002] # PHAGS-PA LETTER TA +A849 ; [.2F0D.0020.0002] # PHAGS-PA LETTER THA +A84A ; [.2F0E.0020.0002] # PHAGS-PA LETTER DA +A84B ; [.2F0F.0020.0002] # PHAGS-PA LETTER NA +A84C ; [.2F10.0020.0002] # PHAGS-PA LETTER PA +A84D ; [.2F11.0020.0002] # PHAGS-PA LETTER PHA +A84E ; [.2F12.0020.0002] # PHAGS-PA LETTER BA +A84F ; [.2F13.0020.0002] # PHAGS-PA LETTER MA +A850 ; [.2F14.0020.0002] # PHAGS-PA LETTER TSA +A851 ; [.2F15.0020.0002] # PHAGS-PA LETTER TSHA +A852 ; [.2F16.0020.0002] # PHAGS-PA LETTER DZA +A853 ; [.2F17.0020.0002] # PHAGS-PA LETTER WA +A867 ; [.2F18.0020.0002] # PHAGS-PA SUBJOINED LETTER WA +A854 ; [.2F19.0020.0002] # PHAGS-PA LETTER ZHA +A855 ; [.2F1A.0020.0002] # PHAGS-PA LETTER ZA +A856 ; [.2F1B.0020.0002] # PHAGS-PA LETTER SMALL A +A857 ; [.2F1C.0020.0002] # PHAGS-PA LETTER YA +A868 ; [.2F1D.0020.0002] # PHAGS-PA SUBJOINED LETTER YA +A86D ; [.2F1E.0020.0002] # PHAGS-PA LETTER ALTERNATE YA +A858 ; [.2F1F.0020.0002] # PHAGS-PA LETTER RA +A871 ; [.2F20.0020.0002] # PHAGS-PA SUBJOINED LETTER RA +A872 ; [.2F21.0020.0002] # PHAGS-PA SUPERFIXED LETTER RA +A859 ; [.2F22.0020.0002] # PHAGS-PA LETTER LA +A85A ; [.2F23.0020.0002] # PHAGS-PA LETTER SHA +A86E ; [.2F24.0020.0002] # PHAGS-PA LETTER VOICELESS SHA +A85B ; [.2F25.0020.0002] # PHAGS-PA LETTER SA +A85C ; [.2F26.0020.0002] # PHAGS-PA LETTER HA +A86F ; [.2F27.0020.0002] # PHAGS-PA LETTER VOICED HA +A870 ; [.2F28.0020.0002] # PHAGS-PA LETTER ASPIRATED FA +A85D ; [.2F29.0020.0002] # PHAGS-PA LETTER A +A862 ; [.2F2A.0020.0002] # PHAGS-PA LETTER QA +A863 ; [.2F2B.0020.0002] # PHAGS-PA LETTER XA +A864 ; [.2F2C.0020.0002] # PHAGS-PA LETTER FA +A865 ; [.2F2D.0020.0002] # PHAGS-PA LETTER GGA +A85E ; [.2F2E.0020.0002] # PHAGS-PA LETTER I +A85F ; [.2F2F.0020.0002] # PHAGS-PA LETTER U +A860 ; [.2F30.0020.0002] # PHAGS-PA LETTER E +A861 ; [.2F31.0020.0002] # PHAGS-PA LETTER O +A866 ; [.2F32.0020.0002] # PHAGS-PA LETTER EE +A873 ; [.2F33.0020.0002] # PHAGS-PA LETTER CANDRABINDU +1900 ; [.2F34.0020.0002] # LIMBU VOWEL-CARRIER LETTER +1901 ; [.2F35.0020.0002] # LIMBU LETTER KA +1902 ; [.2F36.0020.0002] # LIMBU LETTER KHA +1903 ; [.2F37.0020.0002] # LIMBU LETTER GA +1904 ; [.2F38.0020.0002] # LIMBU LETTER GHA +1905 ; [.2F39.0020.0002] # LIMBU LETTER NGA +1906 ; [.2F3A.0020.0002] # LIMBU LETTER CA +1907 ; [.2F3B.0020.0002] # LIMBU LETTER CHA +1908 ; [.2F3C.0020.0002] # LIMBU LETTER JA +191D ; [.2F3C.0020.0004][.2F5A.0020.0004] # LIMBU LETTER GYAN +1909 ; [.2F3D.0020.0002] # LIMBU LETTER JHA +190A ; [.2F3E.0020.0002] # LIMBU LETTER YAN +190B ; [.2F3F.0020.0002] # LIMBU LETTER TA +191E ; [.2F3F.0020.0004][.2F5B.0020.0004] # LIMBU LETTER TRA +190C ; [.2F40.0020.0002] # LIMBU LETTER THA +190D ; [.2F41.0020.0002] # LIMBU LETTER DA +190E ; [.2F42.0020.0002] # LIMBU LETTER DHA +190F ; [.2F43.0020.0002] # LIMBU LETTER NA +1910 ; [.2F44.0020.0002] # LIMBU LETTER PA +1911 ; [.2F45.0020.0002] # LIMBU LETTER PHA +1912 ; [.2F46.0020.0002] # LIMBU LETTER BA +1913 ; [.2F47.0020.0002] # LIMBU LETTER BHA +1914 ; [.2F48.0020.0002] # LIMBU LETTER MA +1915 ; [.2F49.0020.0002] # LIMBU LETTER YA +1916 ; [.2F4A.0020.0002] # LIMBU LETTER RA +1917 ; [.2F4B.0020.0002] # LIMBU LETTER LA +1918 ; [.2F4C.0020.0002] # LIMBU LETTER WA +1919 ; [.2F4D.0020.0002] # LIMBU LETTER SHA +191A ; [.2F4E.0020.0002] # LIMBU LETTER SSA +191B ; [.2F4F.0020.0002] # LIMBU LETTER SA +191C ; [.2F50.0020.0002] # LIMBU LETTER HA +1920 ; [.2F51.0020.0002] # LIMBU VOWEL SIGN A +1921 ; [.2F52.0020.0002] # LIMBU VOWEL SIGN I +1922 ; [.2F53.0020.0002] # LIMBU VOWEL SIGN U +1923 ; [.2F54.0020.0002] # LIMBU VOWEL SIGN EE +1924 ; [.2F55.0020.0002] # LIMBU VOWEL SIGN AI +1925 ; [.2F56.0020.0002] # LIMBU VOWEL SIGN OO +1926 ; [.2F57.0020.0002] # LIMBU VOWEL SIGN AU +1927 ; [.2F58.0020.0002] # LIMBU VOWEL SIGN E +1928 ; [.2F59.0020.0002] # LIMBU VOWEL SIGN O +1929 ; [.2F5A.0020.0002] # LIMBU SUBJOINED LETTER YA +192A ; [.2F5B.0020.0002] # LIMBU SUBJOINED LETTER RA +192B ; [.2F5C.0020.0002] # LIMBU SUBJOINED LETTER WA +1930 ; [.2F5D.0020.0002] # LIMBU SMALL LETTER KA +1931 ; [.2F5E.0020.0002] # LIMBU SMALL LETTER NGA +1932 ; [.2F5F.0020.0002] # LIMBU SMALL LETTER ANUSVARA +1933 ; [.2F60.0020.0002] # LIMBU SMALL LETTER TA +1934 ; [.2F61.0020.0002] # LIMBU SMALL LETTER NA +1935 ; [.2F62.0020.0002] # LIMBU SMALL LETTER PA +1936 ; [.2F63.0020.0002] # LIMBU SMALL LETTER MA +1937 ; [.2F64.0020.0002] # LIMBU SMALL LETTER RA +1938 ; [.2F65.0020.0002] # LIMBU SMALL LETTER LA +1700 ; [.2F66.0020.0002] # TAGALOG LETTER A +1701 ; [.2F67.0020.0002] # TAGALOG LETTER I +1702 ; [.2F68.0020.0002] # TAGALOG LETTER U +1703 ; [.2F69.0020.0002] # TAGALOG LETTER KA +1704 ; [.2F6A.0020.0002] # TAGALOG LETTER GA +1705 ; [.2F6B.0020.0002] # TAGALOG LETTER NGA +1706 ; [.2F6C.0020.0002] # TAGALOG LETTER TA +1707 ; [.2F6D.0020.0002] # TAGALOG LETTER DA +1708 ; [.2F6E.0020.0002] # TAGALOG LETTER NA +1709 ; [.2F6F.0020.0002] # TAGALOG LETTER PA +170A ; [.2F70.0020.0002] # TAGALOG LETTER BA +170B ; [.2F71.0020.0002] # TAGALOG LETTER MA +170C ; [.2F72.0020.0002] # TAGALOG LETTER YA +170E ; [.2F73.0020.0002] # TAGALOG LETTER LA +170F ; [.2F74.0020.0002] # TAGALOG LETTER WA +1710 ; [.2F75.0020.0002] # TAGALOG LETTER SA +1711 ; [.2F76.0020.0002] # TAGALOG LETTER HA +1712 ; [.2F77.0020.0002] # TAGALOG VOWEL SIGN I +1713 ; [.2F78.0020.0002] # TAGALOG VOWEL SIGN U +1714 ; [.2F79.0020.0002] # TAGALOG SIGN VIRAMA +1720 ; [.2F7A.0020.0002] # HANUNOO LETTER A +1721 ; [.2F7B.0020.0002] # HANUNOO LETTER I +1722 ; [.2F7C.0020.0002] # HANUNOO LETTER U +1723 ; [.2F7D.0020.0002] # HANUNOO LETTER KA +1724 ; [.2F7E.0020.0002] # HANUNOO LETTER GA +1725 ; [.2F7F.0020.0002] # HANUNOO LETTER NGA +1726 ; [.2F80.0020.0002] # HANUNOO LETTER TA +1727 ; [.2F81.0020.0002] # HANUNOO LETTER DA +1728 ; [.2F82.0020.0002] # HANUNOO LETTER NA +1729 ; [.2F83.0020.0002] # HANUNOO LETTER PA +172A ; [.2F84.0020.0002] # HANUNOO LETTER BA +172B ; [.2F85.0020.0002] # HANUNOO LETTER MA +172C ; [.2F86.0020.0002] # HANUNOO LETTER YA +172D ; [.2F87.0020.0002] # HANUNOO LETTER RA +172E ; [.2F88.0020.0002] # HANUNOO LETTER LA +172F ; [.2F89.0020.0002] # HANUNOO LETTER WA +1730 ; [.2F8A.0020.0002] # HANUNOO LETTER SA +1731 ; [.2F8B.0020.0002] # HANUNOO LETTER HA +1732 ; [.2F8C.0020.0002] # HANUNOO VOWEL SIGN I +1733 ; [.2F8D.0020.0002] # HANUNOO VOWEL SIGN U +1734 ; [.2F8E.0020.0002] # HANUNOO SIGN PAMUDPOD +1740 ; [.2F8F.0020.0002] # BUHID LETTER A +1741 ; [.2F90.0020.0002] # BUHID LETTER I +1742 ; [.2F91.0020.0002] # BUHID LETTER U +1743 ; [.2F92.0020.0002] # BUHID LETTER KA +1744 ; [.2F93.0020.0002] # BUHID LETTER GA +1745 ; [.2F94.0020.0002] # BUHID LETTER NGA +1746 ; [.2F95.0020.0002] # BUHID LETTER TA +1747 ; [.2F96.0020.0002] # BUHID LETTER DA +1748 ; [.2F97.0020.0002] # BUHID LETTER NA +1749 ; [.2F98.0020.0002] # BUHID LETTER PA +174A ; [.2F99.0020.0002] # BUHID LETTER BA +174B ; [.2F9A.0020.0002] # BUHID LETTER MA +174C ; [.2F9B.0020.0002] # BUHID LETTER YA +174D ; [.2F9C.0020.0002] # BUHID LETTER RA +174E ; [.2F9D.0020.0002] # BUHID LETTER LA +174F ; [.2F9E.0020.0002] # BUHID LETTER WA +1750 ; [.2F9F.0020.0002] # BUHID LETTER SA +1751 ; [.2FA0.0020.0002] # BUHID LETTER HA +1752 ; [.2FA1.0020.0002] # BUHID VOWEL SIGN I +1753 ; [.2FA2.0020.0002] # BUHID VOWEL SIGN U +1760 ; [.2FA3.0020.0002] # TAGBANWA LETTER A +1761 ; [.2FA4.0020.0002] # TAGBANWA LETTER I +1762 ; [.2FA5.0020.0002] # TAGBANWA LETTER U +1763 ; [.2FA6.0020.0002] # TAGBANWA LETTER KA +1764 ; [.2FA7.0020.0002] # TAGBANWA LETTER GA +1765 ; [.2FA8.0020.0002] # TAGBANWA LETTER NGA +1766 ; [.2FA9.0020.0002] # TAGBANWA LETTER TA +1767 ; [.2FAA.0020.0002] # TAGBANWA LETTER DA +1768 ; [.2FAB.0020.0002] # TAGBANWA LETTER NA +1769 ; [.2FAC.0020.0002] # TAGBANWA LETTER PA +176A ; [.2FAD.0020.0002] # TAGBANWA LETTER BA +176B ; [.2FAE.0020.0002] # TAGBANWA LETTER MA +176C ; [.2FAF.0020.0002] # TAGBANWA LETTER YA +176E ; [.2FB0.0020.0002] # TAGBANWA LETTER LA +176F ; [.2FB1.0020.0002] # TAGBANWA LETTER WA +1770 ; [.2FB2.0020.0002] # TAGBANWA LETTER SA +1772 ; [.2FB3.0020.0002] # TAGBANWA VOWEL SIGN I +1773 ; [.2FB4.0020.0002] # TAGBANWA VOWEL SIGN U +1A00 ; [.2FB5.0020.0002] # BUGINESE LETTER KA +1A01 ; [.2FB6.0020.0002] # BUGINESE LETTER GA +1A02 ; [.2FB7.0020.0002] # BUGINESE LETTER NGA +1A03 ; [.2FB8.0020.0002] # BUGINESE LETTER NGKA +1A04 ; [.2FB9.0020.0002] # BUGINESE LETTER PA +1A05 ; [.2FBA.0020.0002] # BUGINESE LETTER BA +1A06 ; [.2FBB.0020.0002] # BUGINESE LETTER MA +1A07 ; [.2FBC.0020.0002] # BUGINESE LETTER MPA +1A08 ; [.2FBD.0020.0002] # BUGINESE LETTER TA +1A09 ; [.2FBE.0020.0002] # BUGINESE LETTER DA +1A0A ; [.2FBF.0020.0002] # BUGINESE LETTER NA +1A0B ; [.2FC0.0020.0002] # BUGINESE LETTER NRA +1A0C ; [.2FC1.0020.0002] # BUGINESE LETTER CA +1A0D ; [.2FC2.0020.0002] # BUGINESE LETTER JA +1A0E ; [.2FC3.0020.0002] # BUGINESE LETTER NYA +1A0F ; [.2FC4.0020.0002] # BUGINESE LETTER NYCA +1A10 ; [.2FC5.0020.0002] # BUGINESE LETTER YA +1A11 ; [.2FC6.0020.0002] # BUGINESE LETTER RA +1A12 ; [.2FC7.0020.0002] # BUGINESE LETTER LA +1A13 ; [.2FC8.0020.0002] # BUGINESE LETTER VA +1A14 ; [.2FC9.0020.0002] # BUGINESE LETTER SA +1A15 ; [.2FCA.0020.0002] # BUGINESE LETTER A +1A16 ; [.2FCB.0020.0002] # BUGINESE LETTER HA +1A17 ; [.2FCC.0020.0002] # BUGINESE VOWEL SIGN I +1A18 ; [.2FCD.0020.0002] # BUGINESE VOWEL SIGN U +1A19 ; [.2FCE.0020.0002] # BUGINESE VOWEL SIGN E +1A1A ; [.2FCF.0020.0002] # BUGINESE VOWEL SIGN O +1A1B ; [.2FD0.0020.0002] # BUGINESE VOWEL SIGN AE +1BC0 ; [.2FD1.0020.0002] # BATAK LETTER A +1BC1 ; [.2FD1.0020.0004] # BATAK LETTER SIMALUNGUN A +1BC2 ; [.2FD2.0020.0002] # BATAK LETTER HA +1BC3 ; [.2FD2.0020.0004] # BATAK LETTER SIMALUNGUN HA +1BC4 ; [.2FD2.0020.0004] # BATAK LETTER MANDAILING HA +1BC5 ; [.2FD3.0020.0002] # BATAK LETTER BA +1BC6 ; [.2FD3.0020.0004] # BATAK LETTER KARO BA +1BC7 ; [.2FD4.0020.0002] # BATAK LETTER PA +1BC8 ; [.2FD4.0020.0004] # BATAK LETTER SIMALUNGUN PA +1BC9 ; [.2FD5.0020.0002] # BATAK LETTER NA +1BCA ; [.2FD5.0020.0004] # BATAK LETTER MANDAILING NA +1BCB ; [.2FD6.0020.0002] # BATAK LETTER WA +1BCC ; [.2FD6.0020.0004] # BATAK LETTER SIMALUNGUN WA +1BCD ; [.2FD6.0020.0004] # BATAK LETTER PAKPAK WA +1BCE ; [.2FD7.0020.0002] # BATAK LETTER GA +1BCF ; [.2FD7.0020.0004] # BATAK LETTER SIMALUNGUN GA +1BD0 ; [.2FD8.0020.0002] # BATAK LETTER JA +1BD1 ; [.2FD9.0020.0002] # BATAK LETTER DA +1BD2 ; [.2FDA.0020.0002] # BATAK LETTER RA +1BD3 ; [.2FDA.0020.0004] # BATAK LETTER SIMALUNGUN RA +1BD4 ; [.2FDB.0020.0002] # BATAK LETTER MA +1BD5 ; [.2FDB.0020.0004] # BATAK LETTER SIMALUNGUN MA +1BD6 ; [.2FDC.0020.0002] # BATAK LETTER SOUTHERN TA +1BD7 ; [.2FDC.0020.0004] # BATAK LETTER NORTHERN TA +1BD8 ; [.2FDD.0020.0002] # BATAK LETTER SA +1BD9 ; [.2FDD.0020.0004] # BATAK LETTER SIMALUNGUN SA +1BDA ; [.2FDD.0020.0004] # BATAK LETTER MANDAILING SA +1BDB ; [.2FDE.0020.0002] # BATAK LETTER YA +1BDC ; [.2FDE.0020.0004] # BATAK LETTER SIMALUNGUN YA +1BDD ; [.2FDF.0020.0002] # BATAK LETTER NGA +1BDE ; [.2FE0.0020.0002] # BATAK LETTER LA +1BDF ; [.2FE0.0020.0004] # BATAK LETTER SIMALUNGUN LA +1BE0 ; [.2FE1.0020.0002] # BATAK LETTER NYA +1BE1 ; [.2FE2.0020.0002] # BATAK LETTER CA +1BE2 ; [.2FE3.0020.0002] # BATAK LETTER NDA +1BE3 ; [.2FE4.0020.0002] # BATAK LETTER MBA +1BE4 ; [.2FE5.0020.0002] # BATAK LETTER I +1BE5 ; [.2FE6.0020.0002] # BATAK LETTER U +1BE7 ; [.2FE7.0020.0002] # BATAK VOWEL SIGN E +1BE8 ; [.2FE7.0020.0004] # BATAK VOWEL SIGN PAKPAK E +1BE9 ; [.2FE8.0020.0002] # BATAK VOWEL SIGN EE +1BEA ; [.2FE9.0020.0002] # BATAK VOWEL SIGN I +1BEB ; [.2FE9.0020.0004] # BATAK VOWEL SIGN KARO I +1BEC ; [.2FEA.0020.0002] # BATAK VOWEL SIGN O +1BED ; [.2FEA.0020.0004] # BATAK VOWEL SIGN KARO O +1BEE ; [.2FEB.0020.0002] # BATAK VOWEL SIGN U +1BEF ; [.2FEB.0020.0004] # BATAK VOWEL SIGN U FOR SIMALUNGUN SA +1BF0 ; [.2FEC.0020.0002] # BATAK CONSONANT SIGN NG +1BF1 ; [.2FED.0020.0002] # BATAK CONSONANT SIGN H +1BF2 ; [.2FEE.0020.0002] # BATAK PANGOLAT +1BF3 ; [.2FEF.0020.0002] # BATAK PANONGONAN +A930 ; [.2FF0.0020.0002] # REJANG LETTER KA +A931 ; [.2FF1.0020.0002] # REJANG LETTER GA +A932 ; [.2FF2.0020.0002] # REJANG LETTER NGA +A933 ; [.2FF3.0020.0002] # REJANG LETTER TA +A934 ; [.2FF4.0020.0002] # REJANG LETTER DA +A935 ; [.2FF5.0020.0002] # REJANG LETTER NA +A936 ; [.2FF6.0020.0002] # REJANG LETTER PA +A937 ; [.2FF7.0020.0002] # REJANG LETTER BA +A938 ; [.2FF8.0020.0002] # REJANG LETTER MA +A939 ; [.2FF9.0020.0002] # REJANG LETTER CA +A93A ; [.2FFA.0020.0002] # REJANG LETTER JA +A93B ; [.2FFB.0020.0002] # REJANG LETTER NYA +A93C ; [.2FFC.0020.0002] # REJANG LETTER SA +A93D ; [.2FFD.0020.0002] # REJANG LETTER RA +A93E ; [.2FFE.0020.0002] # REJANG LETTER LA +A93F ; [.2FFF.0020.0002] # REJANG LETTER YA +A940 ; [.3000.0020.0002] # REJANG LETTER WA +A941 ; [.3001.0020.0002] # REJANG LETTER HA +A942 ; [.3002.0020.0002] # REJANG LETTER MBA +A943 ; [.3003.0020.0002] # REJANG LETTER NGGA +A944 ; [.3004.0020.0002] # REJANG LETTER NDA +A945 ; [.3005.0020.0002] # REJANG LETTER NYJA +A946 ; [.3006.0020.0002] # REJANG LETTER A +A947 ; [.3007.0020.0002] # REJANG VOWEL SIGN I +A948 ; [.3008.0020.0002] # REJANG VOWEL SIGN U +A949 ; [.3009.0020.0002] # REJANG VOWEL SIGN E +A94A ; [.300A.0020.0002] # REJANG VOWEL SIGN AI +A94B ; [.300B.0020.0002] # REJANG VOWEL SIGN O +A94C ; [.300C.0020.0002] # REJANG VOWEL SIGN AU +A94D ; [.300D.0020.0002] # REJANG VOWEL SIGN EU +A94E ; [.300E.0020.0002] # REJANG VOWEL SIGN EA +A94F ; [.300F.0020.0002] # REJANG CONSONANT SIGN NG +A950 ; [.3010.0020.0002] # REJANG CONSONANT SIGN N +A951 ; [.3011.0020.0002] # REJANG CONSONANT SIGN R +A952 ; [.3012.0020.0002] # REJANG CONSONANT SIGN H +A953 ; [.3013.0020.0002] # REJANG VIRAMA +A90A ; [.3014.0020.0002] # KAYAH LI LETTER KA +A90B ; [.3015.0020.0002] # KAYAH LI LETTER KHA +A90C ; [.3016.0020.0002] # KAYAH LI LETTER GA +A90D ; [.3017.0020.0002] # KAYAH LI LETTER NGA +A90E ; [.3018.0020.0002] # KAYAH LI LETTER SA +A90F ; [.3019.0020.0002] # KAYAH LI LETTER SHA +A910 ; [.301A.0020.0002] # KAYAH LI LETTER ZA +A911 ; [.301B.0020.0002] # KAYAH LI LETTER NYA +A912 ; [.301C.0020.0002] # KAYAH LI LETTER TA +A913 ; [.301D.0020.0002] # KAYAH LI LETTER HTA +A914 ; [.301E.0020.0002] # KAYAH LI LETTER NA +A915 ; [.301F.0020.0002] # KAYAH LI LETTER PA +A916 ; [.3020.0020.0002] # KAYAH LI LETTER PHA +A917 ; [.3021.0020.0002] # KAYAH LI LETTER MA +A918 ; [.3022.0020.0002] # KAYAH LI LETTER DA +A919 ; [.3023.0020.0002] # KAYAH LI LETTER BA +A91A ; [.3024.0020.0002] # KAYAH LI LETTER RA +A91B ; [.3025.0020.0002] # KAYAH LI LETTER YA +A91C ; [.3026.0020.0002] # KAYAH LI LETTER LA +A91D ; [.3027.0020.0002] # KAYAH LI LETTER WA +A91E ; [.3028.0020.0002] # KAYAH LI LETTER THA +A91F ; [.3029.0020.0002] # KAYAH LI LETTER HA +A920 ; [.302A.0020.0002] # KAYAH LI LETTER VA +A921 ; [.302B.0020.0002] # KAYAH LI LETTER CA +A922 ; [.302C.0020.0002] # KAYAH LI LETTER A +A923 ; [.302D.0020.0002] # KAYAH LI LETTER OE +A924 ; [.302E.0020.0002] # KAYAH LI LETTER I +A925 ; [.302F.0020.0002] # KAYAH LI LETTER OO +A926 ; [.3030.0020.0002] # KAYAH LI VOWEL UE +A927 ; [.3031.0020.0002] # KAYAH LI VOWEL E +A928 ; [.3032.0020.0002] # KAYAH LI VOWEL U +A929 ; [.3033.0020.0002] # KAYAH LI VOWEL EE +A92A ; [.3034.0020.0002] # KAYAH LI VOWEL O +1000 ; [.3035.0020.0002] # MYANMAR LETTER KA +1075 ; [.3036.0020.0002] # MYANMAR LETTER SHAN KA +1001 ; [.3037.0020.0002] # MYANMAR LETTER KHA +1076 ; [.3038.0020.0002] # MYANMAR LETTER SHAN KHA +1002 ; [.3039.0020.0002] # MYANMAR LETTER GA +1077 ; [.303A.0020.0002] # MYANMAR LETTER SHAN GA +AA60 ; [.303B.0020.0002] # MYANMAR LETTER KHAMTI GA +A9E9 ; [.303C.0020.0002] # MYANMAR LETTER TAI LAING GA +1003 ; [.303D.0020.0002] # MYANMAR LETTER GHA +A9E0 ; [.303E.0020.0002] # MYANMAR LETTER SHAN GHA +A9EA ; [.303F.0020.0002] # MYANMAR LETTER TAI LAING GHA +1004 ; [.3040.0020.0002] # MYANMAR LETTER NGA +105A ; [.3041.0020.0002] # MYANMAR LETTER MON NGA +1005 ; [.3042.0020.0002] # MYANMAR LETTER CA +1078 ; [.3043.0020.0002] # MYANMAR LETTER SHAN CA +AA61 ; [.3044.0020.0002] # MYANMAR LETTER KHAMTI CA +1006 ; [.3045.0020.0002] # MYANMAR LETTER CHA +A9E1 ; [.3046.0020.0002] # MYANMAR LETTER SHAN CHA +AA62 ; [.3047.0020.0002] # MYANMAR LETTER KHAMTI CHA +AA7E ; [.3048.0020.0002] # MYANMAR LETTER SHWE PALAUNG CHA +1007 ; [.3049.0020.0002] # MYANMAR LETTER JA +AA63 ; [.304A.0020.0002] # MYANMAR LETTER KHAMTI JA +A9EB ; [.304B.0020.0002] # MYANMAR LETTER TAI LAING JA +1079 ; [.304C.0020.0002] # MYANMAR LETTER SHAN ZA +AA72 ; [.304D.0020.0002] # MYANMAR LETTER KHAMTI ZA +1008 ; [.304E.0020.0002] # MYANMAR LETTER JHA +105B ; [.304F.0020.0002] # MYANMAR LETTER MON JHA +A9E2 ; [.3050.0020.0002] # MYANMAR LETTER SHAN JHA +AA64 ; [.3051.0020.0002] # MYANMAR LETTER KHAMTI JHA +A9EC ; [.3052.0020.0002] # MYANMAR LETTER TAI LAING JHA +1061 ; [.3053.0020.0002] # MYANMAR LETTER SGAW KAREN SHA +AA7F ; [.3054.0020.0002] # MYANMAR LETTER SHWE PALAUNG SHA +1009 ; [.3055.0020.0002] # MYANMAR LETTER NYA +107A ; [.3056.0020.0002] # MYANMAR LETTER SHAN NYA +AA65 ; [.3057.0020.0002] # MYANMAR LETTER KHAMTI NYA +A9E7 ; [.3058.0020.0002] # MYANMAR LETTER TAI LAING NYA +100A ; [.3059.0020.0002] # MYANMAR LETTER NNYA +100B ; [.305A.0020.0002] # MYANMAR LETTER TTA +AA66 ; [.305B.0020.0002] # MYANMAR LETTER KHAMTI TTA +100C ; [.305C.0020.0002] # MYANMAR LETTER TTHA +AA67 ; [.305D.0020.0002] # MYANMAR LETTER KHAMTI TTHA +100D ; [.305E.0020.0002] # MYANMAR LETTER DDA +AA68 ; [.305F.0020.0002] # MYANMAR LETTER KHAMTI DDA +A9ED ; [.3060.0020.0002] # MYANMAR LETTER TAI LAING DDA +100E ; [.3061.0020.0002] # MYANMAR LETTER DDHA +AA69 ; [.3062.0020.0002] # MYANMAR LETTER KHAMTI DDHA +A9EE ; [.3063.0020.0002] # MYANMAR LETTER TAI LAING DDHA +100F ; [.3064.0020.0002] # MYANMAR LETTER NNA +106E ; [.3065.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN NNA +A9E3 ; [.3066.0020.0002] # MYANMAR LETTER SHAN NNA +A9EF ; [.3067.0020.0002] # MYANMAR LETTER TAI LAING NNA +1010 ; [.3068.0020.0002] # MYANMAR LETTER TA +1011 ; [.3069.0020.0002] # MYANMAR LETTER THA +1012 ; [.306A.0020.0002] # MYANMAR LETTER DA +107B ; [.306B.0020.0002] # MYANMAR LETTER SHAN DA +A9FB ; [.306C.0020.0002] # MYANMAR LETTER TAI LAING DA +1013 ; [.306D.0020.0002] # MYANMAR LETTER DHA +AA6A ; [.306E.0020.0002] # MYANMAR LETTER KHAMTI DHA +A9FC ; [.306F.0020.0002] # MYANMAR LETTER TAI LAING DHA +1014 ; [.3070.0020.0002] # MYANMAR LETTER NA +107C ; [.3071.0020.0002] # MYANMAR LETTER SHAN NA +AA6B ; [.3072.0020.0002] # MYANMAR LETTER KHAMTI NA +105E ; [.3073.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL NA +1015 ; [.3074.0020.0002] # MYANMAR LETTER PA +1016 ; [.3075.0020.0002] # MYANMAR LETTER PHA +107D ; [.3076.0020.0002] # MYANMAR LETTER SHAN PHA +107E ; [.3077.0020.0002] # MYANMAR LETTER SHAN FA +AA6F ; [.3078.0020.0002] # MYANMAR LETTER KHAMTI FA +108E ; [.3079.0020.0002] # MYANMAR LETTER RUMAI PALAUNG FA +A9E8 ; [.307A.0020.0002] # MYANMAR LETTER TAI LAING FA +1017 ; [.307B.0020.0002] # MYANMAR LETTER BA +107F ; [.307C.0020.0002] # MYANMAR LETTER SHAN BA +A9FD ; [.307D.0020.0002] # MYANMAR LETTER TAI LAING BA +1018 ; [.307E.0020.0002] # MYANMAR LETTER BHA +A9E4 ; [.307F.0020.0002] # MYANMAR LETTER SHAN BHA +A9FE ; [.3080.0020.0002] # MYANMAR LETTER TAI LAING BHA +1019 ; [.3081.0020.0002] # MYANMAR LETTER MA +105F ; [.3082.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL MA +101A ; [.3083.0020.0002] # MYANMAR LETTER YA +103B ; [.3084.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL YA +101B ; [.3085.0020.0002] # MYANMAR LETTER RA +AA73 ; [.3086.0020.0002] # MYANMAR LETTER KHAMTI RA +AA7A ; [.3087.0020.0002] # MYANMAR LETTER AITON RA +103C ; [.3088.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL RA +101C ; [.3089.0020.0002] # MYANMAR LETTER LA +1060 ; [.308A.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL LA +101D ; [.308B.0020.0002] # MYANMAR LETTER WA +103D ; [.308C.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL WA +1082 ; [.308D.0020.0002] # MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1080 ; [.308E.0020.0002] # MYANMAR LETTER SHAN THA +1050 ; [.308F.0020.0002] # MYANMAR LETTER SHA +1051 ; [.3090.0020.0002] # MYANMAR LETTER SSA +1065 ; [.3091.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN THA +101E ; [.3092.0020.0002] # MYANMAR LETTER SA +103F ; [.3092.0020.0004][.30CB.0020.0004][.3092.0020.0004] # MYANMAR LETTER GREAT SA +AA6C ; [.3093.0020.0002] # MYANMAR LETTER KHAMTI SA +101F ; [.3094.0020.0002] # MYANMAR LETTER HA +1081 ; [.3095.0020.0002] # MYANMAR LETTER SHAN HA +AA6D ; [.3096.0020.0002] # MYANMAR LETTER KHAMTI HA +103E ; [.3097.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL HA +AA6E ; [.3098.0020.0002] # MYANMAR LETTER KHAMTI HHA +AA71 ; [.3099.0020.0002] # MYANMAR LETTER KHAMTI XA +1020 ; [.309A.0020.0002] # MYANMAR LETTER LLA +A9FA ; [.309B.0020.0002] # MYANMAR LETTER TAI LAING LLA +105C ; [.309C.0020.0002] # MYANMAR LETTER MON BBA +105D ; [.309D.0020.0002] # MYANMAR LETTER MON BBE +106F ; [.309E.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN YWA +1070 ; [.309F.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN GHWA +1066 ; [.30A0.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN PWA +1021 ; [.30A1.0020.0002] # MYANMAR LETTER A +1022 ; [.30A2.0020.0002] # MYANMAR LETTER SHAN A +1023 ; [.30A3.0020.0002] # MYANMAR LETTER I +1024 ; [.30A4.0020.0002] # MYANMAR LETTER II +1025 ; [.30A5.0020.0002] # MYANMAR LETTER U +1026 ; [.30A6.0020.0002] # MYANMAR LETTER UU +1025 102E ; [.30A6.0020.0002] # MYANMAR LETTER UU +1052 ; [.30A7.0020.0002] # MYANMAR LETTER VOCALIC R +1053 ; [.30A8.0020.0002] # MYANMAR LETTER VOCALIC RR +1054 ; [.30A9.0020.0002] # MYANMAR LETTER VOCALIC L +1055 ; [.30AA.0020.0002] # MYANMAR LETTER VOCALIC LL +1027 ; [.30AB.0020.0002] # MYANMAR LETTER E +1028 ; [.30AC.0020.0002] # MYANMAR LETTER MON E +1029 ; [.30AD.0020.0002] # MYANMAR LETTER O +102A ; [.30AE.0020.0002] # MYANMAR LETTER AU +102C ; [.30AF.0020.0002] # MYANMAR VOWEL SIGN AA +102B ; [.30AF.0020.0004] # MYANMAR VOWEL SIGN TALL AA +1083 ; [.30B0.0020.0002] # MYANMAR VOWEL SIGN SHAN AA +1072 ; [.30B1.0020.0002] # MYANMAR VOWEL SIGN KAYAH OE +109C ; [.30B2.0020.0002] # MYANMAR VOWEL SIGN AITON A +102D ; [.30B3.0020.0002] # MYANMAR VOWEL SIGN I +1071 ; [.30B4.0020.0002] # MYANMAR VOWEL SIGN GEBA KAREN I +102E ; [.30B5.0020.0002] # MYANMAR VOWEL SIGN II +1033 ; [.30B6.0020.0002] # MYANMAR VOWEL SIGN MON II +102F ; [.30B7.0020.0002] # MYANMAR VOWEL SIGN U +1073 ; [.30B8.0020.0002] # MYANMAR VOWEL SIGN KAYAH U +1074 ; [.30B9.0020.0002] # MYANMAR VOWEL SIGN KAYAH EE +1030 ; [.30BA.0020.0002] # MYANMAR VOWEL SIGN UU +1056 ; [.30BB.0020.0002] # MYANMAR VOWEL SIGN VOCALIC R +1057 ; [.30BC.0020.0002] # MYANMAR VOWEL SIGN VOCALIC RR +1058 ; [.30BD.0020.0002] # MYANMAR VOWEL SIGN VOCALIC L +1059 ; [.30BE.0020.0002] # MYANMAR VOWEL SIGN VOCALIC LL +1031 ; [.30BF.0020.0002] # MYANMAR VOWEL SIGN E +1084 ; [.30C0.0020.0002] # MYANMAR VOWEL SIGN SHAN E +1035 ; [.30C1.0020.0002] # MYANMAR VOWEL SIGN E ABOVE +1085 ; [.30C2.0020.0002] # MYANMAR VOWEL SIGN SHAN E ABOVE +1032 ; [.30C3.0020.0002] # MYANMAR VOWEL SIGN AI +109D ; [.30C4.0020.0002] # MYANMAR VOWEL SIGN AITON AI +1034 ; [.30C5.0020.0002] # MYANMAR VOWEL SIGN MON O +1062 ; [.30C6.0020.0002] # MYANMAR VOWEL SIGN SGAW KAREN EU +1067 ; [.30C7.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU +1068 ; [.30C8.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE +A9E5 ; [.30C9.0020.0002] # MYANMAR SIGN SHAN SAW +1086 ; [.30CA.0020.0002] # MYANMAR VOWEL SIGN SHAN FINAL Y +1039 ; [.30CB.0020.0002] # MYANMAR SIGN VIRAMA +103A ; [.30CC.0020.0002] # MYANMAR SIGN ASAT +1063 ; [.30CD.0020.0002] # MYANMAR TONE MARK SGAW KAREN HATHI +1064 ; [.30CE.0020.0002] # MYANMAR TONE MARK SGAW KAREN KE PHO +1069 ; [.30CF.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-1 +106A ; [.30D0.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-2 +106B ; [.30D1.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-3 +106C ; [.30D2.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-4 +106D ; [.30D3.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-5 +1087 ; [.30D4.0020.0002] # MYANMAR SIGN SHAN TONE-2 +108B ; [.30D5.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-2 +1088 ; [.30D6.0020.0002] # MYANMAR SIGN SHAN TONE-3 +108C ; [.30D7.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; [.30D8.0020.0002] # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +1089 ; [.30D9.0020.0002] # MYANMAR SIGN SHAN TONE-5 +108A ; [.30DA.0020.0002] # MYANMAR SIGN SHAN TONE-6 +108F ; [.30DB.0020.0002] # MYANMAR SIGN RUMAI PALAUNG TONE-5 +109A ; [.30DC.0020.0002] # MYANMAR SIGN KHAMTI TONE-1 +109B ; [.30DD.0020.0002] # MYANMAR SIGN KHAMTI TONE-3 +AA7B ; [.30DE.0020.0002] # MYANMAR SIGN PAO KAREN TONE +AA7C ; [.30DF.0020.0002] # MYANMAR SIGN TAI LAING TONE-2 +AA7D ; [.30E0.0020.0002] # MYANMAR SIGN TAI LAING TONE-5 +AA74 ; [.30E1.0020.0002] # MYANMAR LOGOGRAM KHAMTI OAY +AA75 ; [.30E2.0020.0002] # MYANMAR LOGOGRAM KHAMTI QN +AA76 ; [.30E3.0020.0002] # MYANMAR LOGOGRAM KHAMTI HM +11103 ; [.30E4.0020.0002] # CHAKMA LETTER AA +11104 ; [.30E5.0020.0002] # CHAKMA LETTER I +11105 ; [.30E6.0020.0002] # CHAKMA LETTER U +11106 ; [.30E7.0020.0002] # CHAKMA LETTER E +11107 ; [.30E8.0020.0002] # CHAKMA LETTER KAA +11108 ; [.30E9.0020.0002] # CHAKMA LETTER KHAA +11109 ; [.30EA.0020.0002] # CHAKMA LETTER GAA +1110A ; [.30EB.0020.0002] # CHAKMA LETTER GHAA +1110B ; [.30EC.0020.0002] # CHAKMA LETTER NGAA +1110C ; [.30ED.0020.0002] # CHAKMA LETTER CAA +1110D ; [.30EE.0020.0002] # CHAKMA LETTER CHAA +1110E ; [.30EF.0020.0002] # CHAKMA LETTER JAA +1110F ; [.30F0.0020.0002] # CHAKMA LETTER JHAA +11110 ; [.30F1.0020.0002] # CHAKMA LETTER NYAA +11111 ; [.30F2.0020.0002] # CHAKMA LETTER TTAA +11112 ; [.30F3.0020.0002] # CHAKMA LETTER TTHAA +11113 ; [.30F4.0020.0002] # CHAKMA LETTER DDAA +11114 ; [.30F5.0020.0002] # CHAKMA LETTER DDHAA +11115 ; [.30F6.0020.0002] # CHAKMA LETTER NNAA +11116 ; [.30F7.0020.0002] # CHAKMA LETTER TAA +11117 ; [.30F8.0020.0002] # CHAKMA LETTER THAA +11118 ; [.30F9.0020.0002] # CHAKMA LETTER DAA +11119 ; [.30FA.0020.0002] # CHAKMA LETTER DHAA +1111A ; [.30FB.0020.0002] # CHAKMA LETTER NAA +1111B ; [.30FC.0020.0002] # CHAKMA LETTER PAA +1111C ; [.30FD.0020.0002] # CHAKMA LETTER PHAA +1111D ; [.30FE.0020.0002] # CHAKMA LETTER BAA +1111E ; [.30FF.0020.0002] # CHAKMA LETTER BHAA +1111F ; [.3100.0020.0002] # CHAKMA LETTER MAA +11120 ; [.3101.0020.0002] # CHAKMA LETTER YYAA +11121 ; [.3102.0020.0002] # CHAKMA LETTER YAA +11122 ; [.3103.0020.0002] # CHAKMA LETTER RAA +11123 ; [.3104.0020.0002] # CHAKMA LETTER LAA +11124 ; [.3105.0020.0002] # CHAKMA LETTER WAA +11125 ; [.3106.0020.0002] # CHAKMA LETTER SAA +11126 ; [.3107.0020.0002] # CHAKMA LETTER HAA +11127 ; [.3108.0020.0002] # CHAKMA VOWEL SIGN A +11128 ; [.3109.0020.0002] # CHAKMA VOWEL SIGN I +11129 ; [.310A.0020.0002] # CHAKMA VOWEL SIGN II +1112A ; [.310B.0020.0002] # CHAKMA VOWEL SIGN U +1112B ; [.310C.0020.0002] # CHAKMA VOWEL SIGN UU +1112C ; [.310D.0020.0002] # CHAKMA VOWEL SIGN E +1112D ; [.310E.0020.0002] # CHAKMA VOWEL SIGN AI +1112E ; [.310F.0020.0002] # CHAKMA VOWEL SIGN O +11131 11127 ; [.310F.0020.0002] # CHAKMA VOWEL SIGN O +1112F ; [.3110.0020.0002] # CHAKMA VOWEL SIGN AU +11132 11127 ; [.3110.0020.0002] # CHAKMA VOWEL SIGN AU +11130 ; [.3111.0020.0002] # CHAKMA VOWEL SIGN OI +11131 ; [.3112.0020.0002] # CHAKMA O MARK +11132 ; [.3113.0020.0002] # CHAKMA AU MARK +11133 ; [.3114.0020.0002] # CHAKMA VIRAMA +11134 ; [.3115.0020.0002] # CHAKMA MAAYYAA +1780 ; [.3116.0020.0002] # KHMER LETTER KA +1781 ; [.3117.0020.0002] # KHMER LETTER KHA +1782 ; [.3118.0020.0002] # KHMER LETTER KO +1783 ; [.3119.0020.0002] # KHMER LETTER KHO +1784 ; [.311A.0020.0002] # KHMER LETTER NGO +1785 ; [.311B.0020.0002] # KHMER LETTER CA +1786 ; [.311C.0020.0002] # KHMER LETTER CHA +1787 ; [.311D.0020.0002] # KHMER LETTER CO +1788 ; [.311E.0020.0002] # KHMER LETTER CHO +1789 ; [.311F.0020.0002] # KHMER LETTER NYO +178A ; [.3120.0020.0002] # KHMER LETTER DA +178B ; [.3121.0020.0002] # KHMER LETTER TTHA +178C ; [.3122.0020.0002] # KHMER LETTER DO +178D ; [.3123.0020.0002] # KHMER LETTER TTHO +178E ; [.3124.0020.0002] # KHMER LETTER NNO +178F ; [.3125.0020.0002] # KHMER LETTER TA +1790 ; [.3126.0020.0002] # KHMER LETTER THA +1791 ; [.3127.0020.0002] # KHMER LETTER TO +1792 ; [.3128.0020.0002] # KHMER LETTER THO +1793 ; [.3129.0020.0002] # KHMER LETTER NO +1794 ; [.312A.0020.0002] # KHMER LETTER BA +1795 ; [.312B.0020.0002] # KHMER LETTER PHA +1796 ; [.312C.0020.0002] # KHMER LETTER PO +1797 ; [.312D.0020.0002] # KHMER LETTER PHO +1798 ; [.312E.0020.0002] # KHMER LETTER MO +1799 ; [.312F.0020.0002] # KHMER LETTER YO +179A ; [.3130.0020.0002] # KHMER LETTER RO +179B ; [.3131.0020.0002] # KHMER LETTER LO +179C ; [.3132.0020.0002] # KHMER LETTER VO +179D ; [.3133.0020.0002] # KHMER LETTER SHA +179E ; [.3134.0020.0002] # KHMER LETTER SSO +179F ; [.3135.0020.0002] # KHMER LETTER SA +17A0 ; [.3136.0020.0002] # KHMER LETTER HA +17A1 ; [.3137.0020.0002] # KHMER LETTER LA +17A2 ; [.3138.0020.0002] # KHMER LETTER QA +17DC ; [.3139.0020.0002] # KHMER SIGN AVAKRAHASANYA +17A3 ; [.313A.0020.0002] # KHMER INDEPENDENT VOWEL QAQ +17A4 ; [.313B.0020.0002] # KHMER INDEPENDENT VOWEL QAA +17A5 ; [.313C.0020.0002] # KHMER INDEPENDENT VOWEL QI +17A6 ; [.313D.0020.0002] # KHMER INDEPENDENT VOWEL QII +17A7 ; [.313E.0020.0002] # KHMER INDEPENDENT VOWEL QU +17A8 ; [.313F.0020.0002] # KHMER INDEPENDENT VOWEL QUK +17A9 ; [.3140.0020.0002] # KHMER INDEPENDENT VOWEL QUU +17AA ; [.3141.0020.0002] # KHMER INDEPENDENT VOWEL QUUV +17AB ; [.3142.0020.0002] # KHMER INDEPENDENT VOWEL RY +17AC ; [.3143.0020.0002] # KHMER INDEPENDENT VOWEL RYY +17AD ; [.3144.0020.0002] # KHMER INDEPENDENT VOWEL LY +17AE ; [.3145.0020.0002] # KHMER INDEPENDENT VOWEL LYY +17AF ; [.3146.0020.0002] # KHMER INDEPENDENT VOWEL QE +17B0 ; [.3147.0020.0002] # KHMER INDEPENDENT VOWEL QAI +17B1 ; [.3148.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE ONE +17B2 ; [.3149.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE TWO +17B3 ; [.314A.0020.0002] # KHMER INDEPENDENT VOWEL QAU +17B6 ; [.314B.0020.0002] # KHMER VOWEL SIGN AA +17B7 ; [.314C.0020.0002] # KHMER VOWEL SIGN I +17B8 ; [.314D.0020.0002] # KHMER VOWEL SIGN II +17B9 ; [.314E.0020.0002] # KHMER VOWEL SIGN Y +17BA ; [.314F.0020.0002] # KHMER VOWEL SIGN YY +17BB ; [.3150.0020.0002] # KHMER VOWEL SIGN U +17BC ; [.3151.0020.0002] # KHMER VOWEL SIGN UU +17BD ; [.3152.0020.0002] # KHMER VOWEL SIGN UA +17BE ; [.3153.0020.0002] # KHMER VOWEL SIGN OE +17BF ; [.3154.0020.0002] # KHMER VOWEL SIGN YA +17C0 ; [.3155.0020.0002] # KHMER VOWEL SIGN IE +17C1 ; [.3156.0020.0002] # KHMER VOWEL SIGN E +17C2 ; [.3157.0020.0002] # KHMER VOWEL SIGN AE +17C3 ; [.3158.0020.0002] # KHMER VOWEL SIGN AI +17C4 ; [.3159.0020.0002] # KHMER VOWEL SIGN OO +17C5 ; [.315A.0020.0002] # KHMER VOWEL SIGN AU +17D2 ; [.315B.0020.0002] # KHMER SIGN COENG +1950 ; [.315C.0020.0002] # TAI LE LETTER KA +1951 ; [.315D.0020.0002] # TAI LE LETTER XA +1952 ; [.315E.0020.0002] # TAI LE LETTER NGA +1953 ; [.315F.0020.0002] # TAI LE LETTER TSA +1954 ; [.3160.0020.0002] # TAI LE LETTER SA +1955 ; [.3161.0020.0002] # TAI LE LETTER YA +1956 ; [.3162.0020.0002] # TAI LE LETTER TA +1957 ; [.3163.0020.0002] # TAI LE LETTER THA +1958 ; [.3164.0020.0002] # TAI LE LETTER LA +1959 ; [.3165.0020.0002] # TAI LE LETTER PA +195A ; [.3166.0020.0002] # TAI LE LETTER PHA +195B ; [.3167.0020.0002] # TAI LE LETTER MA +195C ; [.3168.0020.0002] # TAI LE LETTER FA +195D ; [.3169.0020.0002] # TAI LE LETTER VA +195E ; [.316A.0020.0002] # TAI LE LETTER HA +195F ; [.316B.0020.0002] # TAI LE LETTER QA +1960 ; [.316C.0020.0002] # TAI LE LETTER KHA +1961 ; [.316D.0020.0002] # TAI LE LETTER TSHA +1962 ; [.316E.0020.0002] # TAI LE LETTER NA +1963 ; [.316F.0020.0002] # TAI LE LETTER A +1964 ; [.3170.0020.0002] # TAI LE LETTER I +1965 ; [.3171.0020.0002] # TAI LE LETTER EE +1966 ; [.3172.0020.0002] # TAI LE LETTER EH +1967 ; [.3173.0020.0002] # TAI LE LETTER U +1968 ; [.3174.0020.0002] # TAI LE LETTER OO +1969 ; [.3175.0020.0002] # TAI LE LETTER O +196A ; [.3176.0020.0002] # TAI LE LETTER UE +196B ; [.3177.0020.0002] # TAI LE LETTER E +196C ; [.3178.0020.0002] # TAI LE LETTER AUE +196D ; [.3179.0020.0002] # TAI LE LETTER AI +1970 ; [.317A.0020.0002] # TAI LE LETTER TONE-2 +1971 ; [.317B.0020.0002] # TAI LE LETTER TONE-3 +1972 ; [.317C.0020.0002] # TAI LE LETTER TONE-4 +1973 ; [.317D.0020.0002] # TAI LE LETTER TONE-5 +1974 ; [.317E.0020.0002] # TAI LE LETTER TONE-6 +1980 ; [.317F.0020.0002] # NEW TAI LUE LETTER HIGH QA +19B5 1980 ; [.317F.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH QA> +19B6 1980 ; [.317F.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH QA> +19B7 1980 ; [.317F.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH QA> +19BA 1980 ; [.317F.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH QA> +1981 ; [.3180.0020.0002] # NEW TAI LUE LETTER LOW QA +19B5 1981 ; [.3180.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW QA> +19B6 1981 ; [.3180.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW QA> +19B7 1981 ; [.3180.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW QA> +19BA 1981 ; [.3180.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW QA> +1982 ; [.3181.0020.0002] # NEW TAI LUE LETTER HIGH KA +19B5 1982 ; [.3181.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KA> +19B6 1982 ; [.3181.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KA> +19B7 1982 ; [.3181.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KA> +19BA 1982 ; [.3181.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KA> +1983 ; [.3182.0020.0002] # NEW TAI LUE LETTER HIGH XA +19B5 1983 ; [.3182.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XA> +19B6 1983 ; [.3182.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XA> +19B7 1983 ; [.3182.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XA> +19BA 1983 ; [.3182.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XA> +1984 ; [.3183.0020.0002] # NEW TAI LUE LETTER HIGH NGA +19B5 1984 ; [.3183.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NGA> +19B6 1984 ; [.3183.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NGA> +19B7 1984 ; [.3183.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NGA> +19BA 1984 ; [.3183.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NGA> +1985 ; [.3184.0020.0002] # NEW TAI LUE LETTER LOW KA +19B5 1985 ; [.3184.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KA> +19B6 1985 ; [.3184.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KA> +19B7 1985 ; [.3184.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KA> +19BA 1985 ; [.3184.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KA> +1986 ; [.3185.0020.0002] # NEW TAI LUE LETTER LOW XA +19B5 1986 ; [.3185.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XA> +19B6 1986 ; [.3185.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XA> +19B7 1986 ; [.3185.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XA> +19BA 1986 ; [.3185.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XA> +1987 ; [.3186.0020.0002] # NEW TAI LUE LETTER LOW NGA +19B5 1987 ; [.3186.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NGA> +19B6 1987 ; [.3186.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NGA> +19B7 1987 ; [.3186.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NGA> +19BA 1987 ; [.3186.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NGA> +1988 ; [.3187.0020.0002] # NEW TAI LUE LETTER HIGH TSA +19B5 1988 ; [.3187.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TSA> +19B6 1988 ; [.3187.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TSA> +19B7 1988 ; [.3187.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TSA> +19BA 1988 ; [.3187.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TSA> +1989 ; [.3188.0020.0002] # NEW TAI LUE LETTER HIGH SA +19B5 1989 ; [.3188.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SA> +19B6 1989 ; [.3188.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SA> +19B7 1989 ; [.3188.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SA> +19BA 1989 ; [.3188.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SA> +198A ; [.3189.0020.0002] # NEW TAI LUE LETTER HIGH YA +19B5 198A ; [.3189.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH YA> +19B6 198A ; [.3189.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH YA> +19B7 198A ; [.3189.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH YA> +19BA 198A ; [.3189.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH YA> +198B ; [.318A.0020.0002] # NEW TAI LUE LETTER LOW TSA +19B5 198B ; [.318A.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TSA> +19B6 198B ; [.318A.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TSA> +19B7 198B ; [.318A.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TSA> +19BA 198B ; [.318A.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TSA> +198C ; [.318B.0020.0002] # NEW TAI LUE LETTER LOW SA +19B5 198C ; [.318B.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SA> +19B6 198C ; [.318B.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SA> +19B7 198C ; [.318B.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SA> +19BA 198C ; [.318B.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SA> +198D ; [.318C.0020.0002] # NEW TAI LUE LETTER LOW YA +19B5 198D ; [.318C.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW YA> +19B6 198D ; [.318C.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW YA> +19B7 198D ; [.318C.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW YA> +19BA 198D ; [.318C.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW YA> +198E ; [.318D.0020.0002] # NEW TAI LUE LETTER HIGH TA +19B5 198E ; [.318D.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TA> +19B6 198E ; [.318D.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TA> +19B7 198E ; [.318D.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TA> +19BA 198E ; [.318D.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TA> +198F ; [.318E.0020.0002] # NEW TAI LUE LETTER HIGH THA +19B5 198F ; [.318E.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH THA> +19B6 198F ; [.318E.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH THA> +19B7 198F ; [.318E.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH THA> +19BA 198F ; [.318E.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH THA> +1990 ; [.318F.0020.0002] # NEW TAI LUE LETTER HIGH NA +19B5 1990 ; [.318F.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NA> +19B6 1990 ; [.318F.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NA> +19B7 1990 ; [.318F.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NA> +19BA 1990 ; [.318F.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NA> +1991 ; [.3190.0020.0002] # NEW TAI LUE LETTER LOW TA +19B5 1991 ; [.3190.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TA> +19B6 1991 ; [.3190.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TA> +19B7 1991 ; [.3190.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TA> +19BA 1991 ; [.3190.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TA> +1992 ; [.3191.0020.0002] # NEW TAI LUE LETTER LOW THA +19B5 1992 ; [.3191.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW THA> +19B6 1992 ; [.3191.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW THA> +19B7 1992 ; [.3191.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW THA> +19BA 1992 ; [.3191.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW THA> +1993 ; [.3192.0020.0002] # NEW TAI LUE LETTER LOW NA +19B5 1993 ; [.3192.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NA> +19B6 1993 ; [.3192.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NA> +19B7 1993 ; [.3192.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NA> +19BA 1993 ; [.3192.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NA> +1994 ; [.3193.0020.0002] # NEW TAI LUE LETTER HIGH PA +19B5 1994 ; [.3193.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PA> +19B6 1994 ; [.3193.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PA> +19B7 1994 ; [.3193.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PA> +19BA 1994 ; [.3193.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PA> +1995 ; [.3194.0020.0002] # NEW TAI LUE LETTER HIGH PHA +19B5 1995 ; [.3194.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PHA> +19B6 1995 ; [.3194.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PHA> +19B7 1995 ; [.3194.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PHA> +19BA 1995 ; [.3194.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PHA> +1996 ; [.3195.0020.0002] # NEW TAI LUE LETTER HIGH MA +19B5 1996 ; [.3195.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH MA> +19B6 1996 ; [.3195.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH MA> +19B7 1996 ; [.3195.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH MA> +19BA 1996 ; [.3195.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH MA> +1997 ; [.3196.0020.0002] # NEW TAI LUE LETTER LOW PA +19B5 1997 ; [.3196.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PA> +19B6 1997 ; [.3196.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PA> +19B7 1997 ; [.3196.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PA> +19BA 1997 ; [.3196.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PA> +1998 ; [.3197.0020.0002] # NEW TAI LUE LETTER LOW PHA +19B5 1998 ; [.3197.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PHA> +19B6 1998 ; [.3197.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PHA> +19B7 1998 ; [.3197.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PHA> +19BA 1998 ; [.3197.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PHA> +1999 ; [.3198.0020.0002] # NEW TAI LUE LETTER LOW MA +19B5 1999 ; [.3198.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW MA> +19B6 1999 ; [.3198.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW MA> +19B7 1999 ; [.3198.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW MA> +19BA 1999 ; [.3198.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW MA> +199A ; [.3199.0020.0002] # NEW TAI LUE LETTER HIGH FA +19B5 199A ; [.3199.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH FA> +19B6 199A ; [.3199.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH FA> +19B7 199A ; [.3199.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH FA> +19BA 199A ; [.3199.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH FA> +199B ; [.319A.0020.0002] # NEW TAI LUE LETTER HIGH VA +19B5 199B ; [.319A.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH VA> +19B6 199B ; [.319A.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH VA> +19B7 199B ; [.319A.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH VA> +19BA 199B ; [.319A.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH VA> +199C ; [.319B.0020.0002] # NEW TAI LUE LETTER HIGH LA +19B5 199C ; [.319B.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH LA> +19B6 199C ; [.319B.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH LA> +19DE ; [.319B.0020.0004][.31B1.0020.0004] # NEW TAI LUE SIGN LAE +19DF ; [.319B.0020.0004][.31B1.0020.0004][.31BC.0020.0004] # NEW TAI LUE SIGN LAEV +19B7 199C ; [.319B.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH LA> +19BA 199C ; [.319B.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH LA> +199D ; [.319C.0020.0002] # NEW TAI LUE LETTER LOW FA +19B5 199D ; [.319C.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW FA> +19B6 199D ; [.319C.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW FA> +19B7 199D ; [.319C.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW FA> +19BA 199D ; [.319C.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW FA> +199E ; [.319D.0020.0002] # NEW TAI LUE LETTER LOW VA +19B5 199E ; [.319D.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW VA> +19B6 199E ; [.319D.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW VA> +19B7 199E ; [.319D.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW VA> +19BA 199E ; [.319D.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW VA> +199F ; [.319E.0020.0002] # NEW TAI LUE LETTER LOW LA +19B5 199F ; [.319E.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW LA> +19B6 199F ; [.319E.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW LA> +19B7 199F ; [.319E.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW LA> +19BA 199F ; [.319E.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW LA> +19A0 ; [.319F.0020.0002] # NEW TAI LUE LETTER HIGH HA +19B5 19A0 ; [.319F.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH HA> +19B6 19A0 ; [.319F.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH HA> +19B7 19A0 ; [.319F.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH HA> +19BA 19A0 ; [.319F.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH HA> +19A1 ; [.31A0.0020.0002] # NEW TAI LUE LETTER HIGH DA +19B5 19A1 ; [.31A0.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH DA> +19B6 19A1 ; [.31A0.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH DA> +19B7 19A1 ; [.31A0.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH DA> +19BA 19A1 ; [.31A0.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH DA> +19A2 ; [.31A1.0020.0002] # NEW TAI LUE LETTER HIGH BA +19B5 19A2 ; [.31A1.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH BA> +19B6 19A2 ; [.31A1.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH BA> +19B7 19A2 ; [.31A1.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH BA> +19BA 19A2 ; [.31A1.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH BA> +19A3 ; [.31A2.0020.0002] # NEW TAI LUE LETTER LOW HA +19B5 19A3 ; [.31A2.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW HA> +19B6 19A3 ; [.31A2.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW HA> +19B7 19A3 ; [.31A2.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW HA> +19BA 19A3 ; [.31A2.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW HA> +19A4 ; [.31A3.0020.0002] # NEW TAI LUE LETTER LOW DA +19B5 19A4 ; [.31A3.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW DA> +19B6 19A4 ; [.31A3.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW DA> +19B7 19A4 ; [.31A3.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW DA> +19BA 19A4 ; [.31A3.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW DA> +19A5 ; [.31A4.0020.0002] # NEW TAI LUE LETTER LOW BA +19B5 19A5 ; [.31A4.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW BA> +19B6 19A5 ; [.31A4.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW BA> +19B7 19A5 ; [.31A4.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW BA> +19BA 19A5 ; [.31A4.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW BA> +19A6 ; [.31A5.0020.0002] # NEW TAI LUE LETTER HIGH KVA +19B5 19A6 ; [.31A5.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KVA> +19B6 19A6 ; [.31A5.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KVA> +19B7 19A6 ; [.31A5.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KVA> +19BA 19A6 ; [.31A5.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KVA> +19A7 ; [.31A6.0020.0002] # NEW TAI LUE LETTER HIGH XVA +19B5 19A7 ; [.31A6.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XVA> +19B6 19A7 ; [.31A6.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XVA> +19B7 19A7 ; [.31A6.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XVA> +19BA 19A7 ; [.31A6.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XVA> +19A8 ; [.31A7.0020.0002] # NEW TAI LUE LETTER LOW KVA +19B5 19A8 ; [.31A7.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KVA> +19B6 19A8 ; [.31A7.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KVA> +19B7 19A8 ; [.31A7.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KVA> +19BA 19A8 ; [.31A7.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KVA> +19A9 ; [.31A8.0020.0002] # NEW TAI LUE LETTER LOW XVA +19B5 19A9 ; [.31A8.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XVA> +19B6 19A9 ; [.31A8.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XVA> +19B7 19A9 ; [.31A8.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XVA> +19BA 19A9 ; [.31A8.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XVA> +19AA ; [.31A9.0020.0002] # NEW TAI LUE LETTER HIGH SUA +19B5 19AA ; [.31A9.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SUA> +19B6 19AA ; [.31A9.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SUA> +19B7 19AA ; [.31A9.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SUA> +19BA 19AA ; [.31A9.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SUA> +19AB ; [.31AA.0020.0002] # NEW TAI LUE LETTER LOW SUA +19B5 19AB ; [.31AA.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SUA> +19B6 19AB ; [.31AA.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SUA> +19B7 19AB ; [.31AA.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SUA> +19BA 19AB ; [.31AA.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SUA> +19B0 ; [.31AB.0020.0002] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER +19B1 ; [.31AC.0020.0002] # NEW TAI LUE VOWEL SIGN AA +19B2 ; [.31AD.0020.0002] # NEW TAI LUE VOWEL SIGN II +19B3 ; [.31AE.0020.0002] # NEW TAI LUE VOWEL SIGN U +19B4 ; [.31AF.0020.0002] # NEW TAI LUE VOWEL SIGN UU +19B5 ; [.31B0.0020.0002] # NEW TAI LUE VOWEL SIGN E +19B6 ; [.31B1.0020.0002] # NEW TAI LUE VOWEL SIGN AE +19B7 ; [.31B2.0020.0002] # NEW TAI LUE VOWEL SIGN O +19B8 ; [.31B3.0020.0002] # NEW TAI LUE VOWEL SIGN OA +19B9 ; [.31B4.0020.0002] # NEW TAI LUE VOWEL SIGN UE +19BA ; [.31B5.0020.0002] # NEW TAI LUE VOWEL SIGN AY +19BB ; [.31B6.0020.0002] # NEW TAI LUE VOWEL SIGN AAY +19BC ; [.31B7.0020.0002] # NEW TAI LUE VOWEL SIGN UY +19BD ; [.31B8.0020.0002] # NEW TAI LUE VOWEL SIGN OY +19BE ; [.31B9.0020.0002] # NEW TAI LUE VOWEL SIGN OAY +19BF ; [.31BA.0020.0002] # NEW TAI LUE VOWEL SIGN UEY +19C0 ; [.31BB.0020.0002] # NEW TAI LUE VOWEL SIGN IY +19C1 ; [.31BC.0020.0002] # NEW TAI LUE LETTER FINAL V +19C2 ; [.31BD.0020.0002] # NEW TAI LUE LETTER FINAL NG +19C3 ; [.31BE.0020.0002] # NEW TAI LUE LETTER FINAL N +19C4 ; [.31BF.0020.0002] # NEW TAI LUE LETTER FINAL M +19C5 ; [.31C0.0020.0002] # NEW TAI LUE LETTER FINAL K +19C6 ; [.31C1.0020.0002] # NEW TAI LUE LETTER FINAL D +19C7 ; [.31C2.0020.0002] # NEW TAI LUE LETTER FINAL B +19C8 ; [.31C3.0020.0002] # NEW TAI LUE TONE MARK-1 +19C9 ; [.31C4.0020.0002] # NEW TAI LUE TONE MARK-2 +1A20 ; [.31C5.0020.0002] # TAI THAM LETTER HIGH KA +1A21 ; [.31C6.0020.0002] # TAI THAM LETTER HIGH KHA +1A22 ; [.31C7.0020.0002] # TAI THAM LETTER HIGH KXA +1A23 ; [.31C8.0020.0002] # TAI THAM LETTER LOW KA +1A24 ; [.31C9.0020.0002] # TAI THAM LETTER LOW KXA +1A25 ; [.31CA.0020.0002] # TAI THAM LETTER LOW KHA +1A26 ; [.31CB.0020.0002] # TAI THAM LETTER NGA +1A58 ; [.31CB.0020.0004] # TAI THAM SIGN MAI KANG LAI +1A59 ; [.31CB.0020.0004] # TAI THAM CONSONANT SIGN FINAL NGA +1A27 ; [.31CC.0020.0002] # TAI THAM LETTER HIGH CA +1A28 ; [.31CD.0020.0002] # TAI THAM LETTER HIGH CHA +1A29 ; [.31CE.0020.0002] # TAI THAM LETTER LOW CA +1A2A ; [.31CF.0020.0002] # TAI THAM LETTER LOW SA +1A2B ; [.31D0.0020.0002] # TAI THAM LETTER LOW CHA +1A2C ; [.31D1.0020.0002] # TAI THAM LETTER NYA +1A2D ; [.31D2.0020.0002] # TAI THAM LETTER RATA +1A2E ; [.31D3.0020.0002] # TAI THAM LETTER HIGH RATHA +1A2F ; [.31D4.0020.0002] # TAI THAM LETTER DA +1A30 ; [.31D5.0020.0002] # TAI THAM LETTER LOW RATHA +1A31 ; [.31D6.0020.0002] # TAI THAM LETTER RANA +1A32 ; [.31D7.0020.0002] # TAI THAM LETTER HIGH TA +1A33 ; [.31D8.0020.0002] # TAI THAM LETTER HIGH THA +1A34 ; [.31D9.0020.0002] # TAI THAM LETTER LOW TA +1A35 ; [.31DA.0020.0002] # TAI THAM LETTER LOW THA +1A36 ; [.31DB.0020.0002] # TAI THAM LETTER NA +1A37 ; [.31DC.0020.0002] # TAI THAM LETTER BA +1A38 ; [.31DD.0020.0002] # TAI THAM LETTER HIGH PA +1A39 ; [.31DE.0020.0002] # TAI THAM LETTER HIGH PHA +1A3A ; [.31DF.0020.0002] # TAI THAM LETTER HIGH FA +1A3B ; [.31E0.0020.0002] # TAI THAM LETTER LOW PA +1A5A ; [.31E0.0020.0004] # TAI THAM CONSONANT SIGN LOW PA +1A5B ; [.31E0.0020.0004] # TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA +1A3C ; [.31E1.0020.0002] # TAI THAM LETTER LOW FA +1A3D ; [.31E2.0020.0002] # TAI THAM LETTER LOW PHA +1A3E ; [.31E3.0020.0002] # TAI THAM LETTER MA +1A3F ; [.31E4.0020.0002] # TAI THAM LETTER LOW YA +1A40 ; [.31E5.0020.0002] # TAI THAM LETTER HIGH YA +1A41 ; [.31E6.0020.0002] # TAI THAM LETTER RA +1A42 ; [.31E7.0020.0002] # TAI THAM LETTER RUE +1A43 ; [.31E8.0020.0002] # TAI THAM LETTER LA +1A44 ; [.31E9.0020.0002] # TAI THAM LETTER LUE +1A45 ; [.31EA.0020.0002] # TAI THAM LETTER WA +1A46 ; [.31EB.0020.0002] # TAI THAM LETTER HIGH SHA +1A54 ; [.31EB.0020.0004][.3211.0020.0004][.31EB.0020.0004] # TAI THAM LETTER GREAT SA +1A47 ; [.31EC.0020.0002] # TAI THAM LETTER HIGH SSA +1A48 ; [.31ED.0020.0002] # TAI THAM LETTER HIGH SA +1A49 ; [.31EE.0020.0002] # TAI THAM LETTER HIGH HA +1A4A ; [.31EF.0020.0002] # TAI THAM LETTER LLA +1A4B ; [.31F0.0020.0002] # TAI THAM LETTER A +1A4C ; [.31F1.0020.0002] # TAI THAM LETTER LOW HA +1A53 ; [.31F2.0020.0002] # TAI THAM LETTER LAE +1A6B ; [.31F3.0020.0002] # TAI THAM VOWEL SIGN O +1A55 ; [.31F4.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; [.31F5.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; [.31F6.0020.0002] # TAI THAM CONSONANT SIGN LA TANG LAI +1A5C ; [.31F7.0020.0002] # TAI THAM CONSONANT SIGN MA +1A5D ; [.31F8.0020.0002] # TAI THAM CONSONANT SIGN BA +1A5E ; [.31F9.0020.0002] # TAI THAM CONSONANT SIGN SA +1A4D ; [.31FA.0020.0002] # TAI THAM LETTER I +1A4E ; [.31FB.0020.0002] # TAI THAM LETTER II +1A4F ; [.31FC.0020.0002] # TAI THAM LETTER U +1A50 ; [.31FD.0020.0002] # TAI THAM LETTER UU +1A51 ; [.31FE.0020.0002] # TAI THAM LETTER EE +1A52 ; [.31FF.0020.0002] # TAI THAM LETTER OO +1A61 ; [.3200.0020.0002] # TAI THAM VOWEL SIGN A +1A6C ; [.3201.0020.0002] # TAI THAM VOWEL SIGN OA BELOW +1A62 ; [.3202.0020.0002] # TAI THAM VOWEL SIGN MAI SAT +1A63 ; [.3203.0020.0002] # TAI THAM VOWEL SIGN AA +1A64 ; [.3203.0020.0004] # TAI THAM VOWEL SIGN TALL AA +1A65 ; [.3204.0020.0002] # TAI THAM VOWEL SIGN I +1A66 ; [.3205.0020.0002] # TAI THAM VOWEL SIGN II +1A67 ; [.3206.0020.0002] # TAI THAM VOWEL SIGN UE +1A68 ; [.3207.0020.0002] # TAI THAM VOWEL SIGN UUE +1A69 ; [.3208.0020.0002] # TAI THAM VOWEL SIGN U +1A6A ; [.3209.0020.0002] # TAI THAM VOWEL SIGN UU +1A6E ; [.320A.0020.0002] # TAI THAM VOWEL SIGN E +1A6F ; [.320B.0020.0002] # TAI THAM VOWEL SIGN AE +1A73 ; [.320C.0020.0002] # TAI THAM VOWEL SIGN OA ABOVE +1A70 ; [.320D.0020.0002] # TAI THAM VOWEL SIGN OO +1A71 ; [.320E.0020.0002] # TAI THAM VOWEL SIGN AI +1A72 ; [.320F.0020.0002] # TAI THAM VOWEL SIGN THAM AI +1A6D ; [.3210.0020.0002] # TAI THAM VOWEL SIGN OY +1A60 ; [.3211.0020.0002] # TAI THAM SIGN SAKOT +AA00 ; [.3212.0020.0002] # CHAM LETTER A +AA01 ; [.3213.0020.0002] # CHAM LETTER I +AA02 ; [.3214.0020.0002] # CHAM LETTER U +AA03 ; [.3215.0020.0002] # CHAM LETTER E +AA04 ; [.3216.0020.0002] # CHAM LETTER AI +AA05 ; [.3217.0020.0002] # CHAM LETTER O +AA06 ; [.3218.0020.0002] # CHAM LETTER KA +AA07 ; [.3219.0020.0002] # CHAM LETTER KHA +AA08 ; [.321A.0020.0002] # CHAM LETTER GA +AA09 ; [.321B.0020.0002] # CHAM LETTER GHA +AA0A ; [.321C.0020.0002] # CHAM LETTER NGUE +AA0B ; [.321D.0020.0002] # CHAM LETTER NGA +AA0C ; [.321E.0020.0002] # CHAM LETTER CHA +AA0D ; [.321F.0020.0002] # CHAM LETTER CHHA +AA0E ; [.3220.0020.0002] # CHAM LETTER JA +AA0F ; [.3221.0020.0002] # CHAM LETTER JHA +AA10 ; [.3222.0020.0002] # CHAM LETTER NHUE +AA11 ; [.3223.0020.0002] # CHAM LETTER NHA +AA12 ; [.3224.0020.0002] # CHAM LETTER NHJA +AA13 ; [.3225.0020.0002] # CHAM LETTER TA +AA14 ; [.3226.0020.0002] # CHAM LETTER THA +AA15 ; [.3227.0020.0002] # CHAM LETTER DA +AA16 ; [.3228.0020.0002] # CHAM LETTER DHA +AA17 ; [.3229.0020.0002] # CHAM LETTER NUE +AA18 ; [.322A.0020.0002] # CHAM LETTER NA +AA19 ; [.322B.0020.0002] # CHAM LETTER DDA +AA1A ; [.322C.0020.0002] # CHAM LETTER PA +AA1B ; [.322D.0020.0002] # CHAM LETTER PPA +AA1C ; [.322E.0020.0002] # CHAM LETTER PHA +AA1D ; [.322F.0020.0002] # CHAM LETTER BA +AA1E ; [.3230.0020.0002] # CHAM LETTER BHA +AA1F ; [.3231.0020.0002] # CHAM LETTER MUE +AA20 ; [.3232.0020.0002] # CHAM LETTER MA +AA21 ; [.3233.0020.0002] # CHAM LETTER BBA +AA22 ; [.3234.0020.0002] # CHAM LETTER YA +AA23 ; [.3235.0020.0002] # CHAM LETTER RA +AA24 ; [.3236.0020.0002] # CHAM LETTER LA +AA25 ; [.3237.0020.0002] # CHAM LETTER VA +AA26 ; [.3238.0020.0002] # CHAM LETTER SSA +AA27 ; [.3239.0020.0002] # CHAM LETTER SA +AA28 ; [.323A.0020.0002] # CHAM LETTER HA +AA33 ; [.323B.0020.0002] # CHAM CONSONANT SIGN YA +AA34 ; [.323C.0020.0002] # CHAM CONSONANT SIGN RA +AA35 ; [.323D.0020.0002] # CHAM CONSONANT SIGN LA +AA36 ; [.323E.0020.0002] # CHAM CONSONANT SIGN WA +AA29 ; [.323F.0020.0002] # CHAM VOWEL SIGN AA +AA2A ; [.3240.0020.0002] # CHAM VOWEL SIGN I +AA2B ; [.3241.0020.0002] # CHAM VOWEL SIGN II +AA2C ; [.3242.0020.0002] # CHAM VOWEL SIGN EI +AA2D ; [.3243.0020.0002] # CHAM VOWEL SIGN U +AA2E ; [.3244.0020.0002] # CHAM VOWEL SIGN OE +AA2F ; [.3245.0020.0002] # CHAM VOWEL SIGN O +AA30 ; [.3246.0020.0002] # CHAM VOWEL SIGN AI +AA31 ; [.3247.0020.0002] # CHAM VOWEL SIGN AU +AA32 ; [.3248.0020.0002] # CHAM VOWEL SIGN UE +AA40 ; [.3249.0020.0002] # CHAM LETTER FINAL K +AA41 ; [.324A.0020.0002] # CHAM LETTER FINAL G +AA42 ; [.324B.0020.0002] # CHAM LETTER FINAL NG +AA43 ; [.324C.0020.0002] # CHAM CONSONANT SIGN FINAL NG +AA44 ; [.324D.0020.0002] # CHAM LETTER FINAL CH +AA45 ; [.324E.0020.0002] # CHAM LETTER FINAL T +AA46 ; [.324F.0020.0002] # CHAM LETTER FINAL N +AA47 ; [.3250.0020.0002] # CHAM LETTER FINAL P +AA48 ; [.3251.0020.0002] # CHAM LETTER FINAL Y +AA49 ; [.3252.0020.0002] # CHAM LETTER FINAL R +AA4A ; [.3253.0020.0002] # CHAM LETTER FINAL L +AA4B ; [.3254.0020.0002] # CHAM LETTER FINAL SS +AA4C ; [.3255.0020.0002] # CHAM CONSONANT SIGN FINAL M +AA4D ; [.3256.0020.0002] # CHAM CONSONANT SIGN FINAL H +1B05 ; [.3257.0020.0002] # BALINESE LETTER AKARA +1B06 ; [.3258.0020.0002] # BALINESE LETTER AKARA TEDUNG +1B05 1B35 ; [.3258.0020.0002] # BALINESE LETTER AKARA TEDUNG +1B07 ; [.3259.0020.0002] # BALINESE LETTER IKARA +1B08 ; [.325A.0020.0002] # BALINESE LETTER IKARA TEDUNG +1B07 1B35 ; [.325A.0020.0002] # BALINESE LETTER IKARA TEDUNG +1B09 ; [.325B.0020.0002] # BALINESE LETTER UKARA +1B0A ; [.325C.0020.0002] # BALINESE LETTER UKARA TEDUNG +1B09 1B35 ; [.325C.0020.0002] # BALINESE LETTER UKARA TEDUNG +1B0B ; [.325D.0020.0002] # BALINESE LETTER RA REPA +1B0C ; [.325E.0020.0002] # BALINESE LETTER RA REPA TEDUNG +1B0B 1B35 ; [.325E.0020.0002] # BALINESE LETTER RA REPA TEDUNG +1B0D ; [.325F.0020.0002] # BALINESE LETTER LA LENGA +1B0E ; [.3260.0020.0002] # BALINESE LETTER LA LENGA TEDUNG +1B0D 1B35 ; [.3260.0020.0002] # BALINESE LETTER LA LENGA TEDUNG +1B0F ; [.3261.0020.0002] # BALINESE LETTER EKARA +1B10 ; [.3262.0020.0002] # BALINESE LETTER AIKARA +1B11 ; [.3263.0020.0002] # BALINESE LETTER OKARA +1B12 ; [.3264.0020.0002] # BALINESE LETTER OKARA TEDUNG +1B11 1B35 ; [.3264.0020.0002] # BALINESE LETTER OKARA TEDUNG +1B13 ; [.3265.0020.0002] # BALINESE LETTER KA +1B45 ; [.3266.0020.0002] # BALINESE LETTER KAF SASAK +1B46 ; [.3267.0020.0002] # BALINESE LETTER KHOT SASAK +1B14 ; [.3268.0020.0002] # BALINESE LETTER KA MAHAPRANA +1B15 ; [.3269.0020.0002] # BALINESE LETTER GA +1B16 ; [.326A.0020.0002] # BALINESE LETTER GA GORA +1B17 ; [.326B.0020.0002] # BALINESE LETTER NGA +1B18 ; [.326C.0020.0002] # BALINESE LETTER CA +1B19 ; [.326D.0020.0002] # BALINESE LETTER CA LACA +1B1A ; [.326E.0020.0002] # BALINESE LETTER JA +1B1B ; [.326F.0020.0002] # BALINESE LETTER JA JERA +1B1C ; [.3270.0020.0002] # BALINESE LETTER NYA +1B1D ; [.3271.0020.0002] # BALINESE LETTER TA LATIK +1B1E ; [.3272.0020.0002] # BALINESE LETTER TA MURDA MAHAPRANA +1B1F ; [.3273.0020.0002] # BALINESE LETTER DA MURDA ALPAPRANA +1B20 ; [.3274.0020.0002] # BALINESE LETTER DA MURDA MAHAPRANA +1B21 ; [.3275.0020.0002] # BALINESE LETTER NA RAMBAT +1B22 ; [.3276.0020.0002] # BALINESE LETTER TA +1B47 ; [.3277.0020.0002] # BALINESE LETTER TZIR SASAK +1B23 ; [.3278.0020.0002] # BALINESE LETTER TA TAWA +1B24 ; [.3279.0020.0002] # BALINESE LETTER DA +1B25 ; [.327A.0020.0002] # BALINESE LETTER DA MADU +1B26 ; [.327B.0020.0002] # BALINESE LETTER NA +1B27 ; [.327C.0020.0002] # BALINESE LETTER PA +1B48 ; [.327D.0020.0002] # BALINESE LETTER EF SASAK +1B28 ; [.327E.0020.0002] # BALINESE LETTER PA KAPAL +1B29 ; [.327F.0020.0002] # BALINESE LETTER BA +1B2A ; [.3280.0020.0002] # BALINESE LETTER BA KEMBANG +1B2B ; [.3281.0020.0002] # BALINESE LETTER MA +1B2C ; [.3282.0020.0002] # BALINESE LETTER YA +1B2D ; [.3283.0020.0002] # BALINESE LETTER RA +1B2E ; [.3284.0020.0002] # BALINESE LETTER LA +1B2F ; [.3285.0020.0002] # BALINESE LETTER WA +1B49 ; [.3286.0020.0002] # BALINESE LETTER VE SASAK +1B30 ; [.3287.0020.0002] # BALINESE LETTER SA SAGA +1B31 ; [.3288.0020.0002] # BALINESE LETTER SA SAPA +1B32 ; [.3289.0020.0002] # BALINESE LETTER SA +1B4A ; [.328A.0020.0002] # BALINESE LETTER ZAL SASAK +1B4B ; [.328B.0020.0002] # BALINESE LETTER ASYURA SASAK +1B33 ; [.328C.0020.0002] # BALINESE LETTER HA +1B35 ; [.328D.0020.0002] # BALINESE VOWEL SIGN TEDUNG +1B36 ; [.328E.0020.0002] # BALINESE VOWEL SIGN ULU +1B37 ; [.328F.0020.0002] # BALINESE VOWEL SIGN ULU SARI +1B38 ; [.3290.0020.0002] # BALINESE VOWEL SIGN SUKU +1B39 ; [.3291.0020.0002] # BALINESE VOWEL SIGN SUKU ILUT +1B3A ; [.3292.0020.0002] # BALINESE VOWEL SIGN RA REPA +1B3B ; [.3293.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG +1B3A 1B35 ; [.3293.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; [.3294.0020.0002] # BALINESE VOWEL SIGN LA LENGA +1B3D ; [.3295.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG +1B3C 1B35 ; [.3295.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG +1B3E ; [.3296.0020.0002] # BALINESE VOWEL SIGN TALING +1B3F ; [.3297.0020.0002] # BALINESE VOWEL SIGN TALING REPA +1B40 ; [.3298.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG +1B3E 1B35 ; [.3298.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG +1B41 ; [.3299.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG +1B3F 1B35 ; [.3299.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; [.329A.0020.0002] # BALINESE VOWEL SIGN PEPET +1B43 ; [.329B.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG +1B42 1B35 ; [.329B.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG +1B44 ; [.329C.0020.0002] # BALINESE ADEG ADEG +A984 ; [.329D.0020.0002] # JAVANESE LETTER A +A985 ; [.329E.0020.0002] # JAVANESE LETTER I KAWI +A986 ; [.329F.0020.0002] # JAVANESE LETTER I +A987 ; [.32A0.0020.0002] # JAVANESE LETTER II +A988 ; [.32A1.0020.0002] # JAVANESE LETTER U +A989 ; [.32A2.0020.0002] # JAVANESE LETTER PA CEREK +A98A ; [.32A3.0020.0002] # JAVANESE LETTER NGA LELET +A98B ; [.32A4.0020.0002] # JAVANESE LETTER NGA LELET RASWADI +A98C ; [.32A5.0020.0002] # JAVANESE LETTER E +A98D ; [.32A6.0020.0002] # JAVANESE LETTER AI +A98E ; [.32A7.0020.0002] # JAVANESE LETTER O +A98F ; [.32A8.0020.0002] # JAVANESE LETTER KA +A990 ; [.32A9.0020.0002] # JAVANESE LETTER KA SASAK +A991 ; [.32AA.0020.0002] # JAVANESE LETTER KA MURDA +A992 ; [.32AB.0020.0002] # JAVANESE LETTER GA +A993 ; [.32AC.0020.0002] # JAVANESE LETTER GA MURDA +A994 ; [.32AD.0020.0002] # JAVANESE LETTER NGA +A995 ; [.32AE.0020.0002] # JAVANESE LETTER CA +A996 ; [.32AF.0020.0002] # JAVANESE LETTER CA MURDA +A997 ; [.32B0.0020.0002] # JAVANESE LETTER JA +A998 ; [.32B1.0020.0002] # JAVANESE LETTER NYA MURDA +A999 ; [.32B2.0020.0002] # JAVANESE LETTER JA MAHAPRANA +A99A ; [.32B3.0020.0002] # JAVANESE LETTER NYA +A99B ; [.32B4.0020.0002] # JAVANESE LETTER TTA +A99C ; [.32B5.0020.0002] # JAVANESE LETTER TTA MAHAPRANA +A99D ; [.32B6.0020.0002] # JAVANESE LETTER DDA +A99E ; [.32B7.0020.0002] # JAVANESE LETTER DDA MAHAPRANA +A99F ; [.32B8.0020.0002] # JAVANESE LETTER NA MURDA +A9A0 ; [.32B9.0020.0002] # JAVANESE LETTER TA +A9A1 ; [.32BA.0020.0002] # JAVANESE LETTER TA MURDA +A9A2 ; [.32BB.0020.0002] # JAVANESE LETTER DA +A9A3 ; [.32BC.0020.0002] # JAVANESE LETTER DA MAHAPRANA +A9A4 ; [.32BD.0020.0002] # JAVANESE LETTER NA +A9A5 ; [.32BE.0020.0002] # JAVANESE LETTER PA +A9A6 ; [.32BF.0020.0002] # JAVANESE LETTER PA MURDA +A9A7 ; [.32C0.0020.0002] # JAVANESE LETTER BA +A9A8 ; [.32C1.0020.0002] # JAVANESE LETTER BA MURDA +A9A9 ; [.32C2.0020.0002] # JAVANESE LETTER MA +A9AA ; [.32C3.0020.0002] # JAVANESE LETTER YA +A9BE ; [.32C4.0020.0002] # JAVANESE CONSONANT SIGN PENGKAL +A9AB ; [.32C5.0020.0002] # JAVANESE LETTER RA +A9AC ; [.32C5.0020.0004] # JAVANESE LETTER RA AGUNG +A9BF ; [.32C6.0020.0002] # JAVANESE CONSONANT SIGN CAKRA +A9AD ; [.32C7.0020.0002] # JAVANESE LETTER LA +A9AE ; [.32C8.0020.0002] # JAVANESE LETTER WA +A9AF ; [.32C9.0020.0002] # JAVANESE LETTER SA MURDA +A9B0 ; [.32CA.0020.0002] # JAVANESE LETTER SA MAHAPRANA +A9B1 ; [.32CB.0020.0002] # JAVANESE LETTER SA +A9B2 ; [.32CC.0020.0002] # JAVANESE LETTER HA +A9B4 ; [.32CD.0020.0002] # JAVANESE VOWEL SIGN TARUNG +A9BC ; [.32CE.0020.0002] # JAVANESE VOWEL SIGN PEPET +A9B6 ; [.32CF.0020.0002] # JAVANESE VOWEL SIGN WULU +A9B7 ; [.32D0.0020.0002] # JAVANESE VOWEL SIGN WULU MELIK +A9B8 ; [.32D1.0020.0002] # JAVANESE VOWEL SIGN SUKU +A9B9 ; [.32D2.0020.0002] # JAVANESE VOWEL SIGN SUKU MENDUT +A9BD ; [.32D3.0020.0002] # JAVANESE CONSONANT SIGN KERET +A9BA ; [.32D4.0020.0002] # JAVANESE VOWEL SIGN TALING +A9BB ; [.32D5.0020.0002] # JAVANESE VOWEL SIGN DIRGA MURE +A9B5 ; [.32D6.0020.0002] # JAVANESE VOWEL SIGN TOLONG +A9C0 ; [.32D7.0020.0002] # JAVANESE PANGKON +1880 ; [.32D8.0020.0002] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE +1881 ; [.32D9.0020.0002] # MONGOLIAN LETTER ALI GALI VISARGA ONE +1882 ; [.32DA.0020.0002] # MONGOLIAN LETTER ALI GALI DAMARU +1883 ; [.32DB.0020.0002] # MONGOLIAN LETTER ALI GALI UBADAMA +1884 ; [.32DC.0020.0002] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885 ; [.32DD.0020.0002] # MONGOLIAN LETTER ALI GALI BALUDA +1886 ; [.32DE.0020.0002] # MONGOLIAN LETTER ALI GALI THREE BALUDA +1843 ; [.32DF.0020.0002] # MONGOLIAN LETTER TODO LONG VOWEL SIGN +1820 ; [.32E0.0020.0002] # MONGOLIAN LETTER A +1887 ; [.32E1.0020.0002] # MONGOLIAN LETTER ALI GALI A +1821 ; [.32E2.0020.0002] # MONGOLIAN LETTER E +1844 ; [.32E3.0020.0002] # MONGOLIAN LETTER TODO E +185D ; [.32E4.0020.0002] # MONGOLIAN LETTER SIBE E +1822 ; [.32E5.0020.0002] # MONGOLIAN LETTER I +1845 ; [.32E6.0020.0002] # MONGOLIAN LETTER TODO I +185E ; [.32E7.0020.0002] # MONGOLIAN LETTER SIBE I +1873 ; [.32E8.0020.0002] # MONGOLIAN LETTER MANCHU I +1888 ; [.32E9.0020.0002] # MONGOLIAN LETTER ALI GALI I +185F ; [.32EA.0020.0002] # MONGOLIAN LETTER SIBE IY +1823 ; [.32EB.0020.0002] # MONGOLIAN LETTER O +1846 ; [.32EC.0020.0002] # MONGOLIAN LETTER TODO O +1824 ; [.32ED.0020.0002] # MONGOLIAN LETTER U +1847 ; [.32EE.0020.0002] # MONGOLIAN LETTER TODO U +1861 ; [.32EF.0020.0002] # MONGOLIAN LETTER SIBE U +1825 ; [.32F0.0020.0002] # MONGOLIAN LETTER OE +1848 ; [.32F1.0020.0002] # MONGOLIAN LETTER TODO OE +1826 ; [.32F2.0020.0002] # MONGOLIAN LETTER UE +1849 ; [.32F3.0020.0002] # MONGOLIAN LETTER TODO UE +1860 ; [.32F4.0020.0002] # MONGOLIAN LETTER SIBE UE +1827 ; [.32F5.0020.0002] # MONGOLIAN LETTER EE +1828 ; [.32F6.0020.0002] # MONGOLIAN LETTER NA +1829 ; [.32F7.0020.0002] # MONGOLIAN LETTER ANG +184A ; [.32F8.0020.0002] # MONGOLIAN LETTER TODO ANG +1862 ; [.32F9.0020.0002] # MONGOLIAN LETTER SIBE ANG +188A ; [.32FA.0020.0002] # MONGOLIAN LETTER ALI GALI NGA +189B ; [.32FB.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI NGA +182A ; [.32FC.0020.0002] # MONGOLIAN LETTER BA +184B ; [.32FD.0020.0002] # MONGOLIAN LETTER TODO BA +182B ; [.32FE.0020.0002] # MONGOLIAN LETTER PA +184C ; [.32FF.0020.0002] # MONGOLIAN LETTER TODO PA +1866 ; [.3300.0020.0002] # MONGOLIAN LETTER SIBE PA +182C ; [.3301.0020.0002] # MONGOLIAN LETTER QA +184D ; [.3302.0020.0002] # MONGOLIAN LETTER TODO QA +182D ; [.3303.0020.0002] # MONGOLIAN LETTER GA +184E ; [.3304.0020.0002] # MONGOLIAN LETTER TODO GA +1864 ; [.3305.0020.0002] # MONGOLIAN LETTER SIBE GA +189A ; [.3306.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI GHA +1865 ; [.3307.0020.0002] # MONGOLIAN LETTER SIBE HA +182E ; [.3308.0020.0002] # MONGOLIAN LETTER MA +184F ; [.3309.0020.0002] # MONGOLIAN LETTER TODO MA +182F ; [.330A.0020.0002] # MONGOLIAN LETTER LA +1830 ; [.330B.0020.0002] # MONGOLIAN LETTER SA +1831 ; [.330C.0020.0002] # MONGOLIAN LETTER SHA +1867 ; [.330D.0020.0002] # MONGOLIAN LETTER SIBE SHA +189C ; [.330E.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CA +189D ; [.330F.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI JHA +18A2 ; [.3310.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI SSA +18A4 ; [.3311.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZHA +18A5 ; [.3312.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZA +1832 ; [.3313.0020.0002] # MONGOLIAN LETTER TA +1850 ; [.3314.0020.0002] # MONGOLIAN LETTER TODO TA +1868 ; [.3315.0020.0002] # MONGOLIAN LETTER SIBE TA +1833 ; [.3316.0020.0002] # MONGOLIAN LETTER DA +1851 ; [.3317.0020.0002] # MONGOLIAN LETTER TODO DA +1869 ; [.3318.0020.0002] # MONGOLIAN LETTER SIBE DA +1834 ; [.3319.0020.0002] # MONGOLIAN LETTER CHA +1852 ; [.331A.0020.0002] # MONGOLIAN LETTER TODO CHA +1871 ; [.331B.0020.0002] # MONGOLIAN LETTER SIBE CHA +185C ; [.331C.0020.0002] # MONGOLIAN LETTER TODO DZA +188B ; [.331D.0020.0002] # MONGOLIAN LETTER ALI GALI CA +1835 ; [.331E.0020.0002] # MONGOLIAN LETTER JA +1853 ; [.331F.0020.0002] # MONGOLIAN LETTER TODO JA +186A ; [.3320.0020.0002] # MONGOLIAN LETTER SIBE JA +1877 ; [.3321.0020.0002] # MONGOLIAN LETTER MANCHU ZHA +1836 ; [.3322.0020.0002] # MONGOLIAN LETTER YA +1855 ; [.3323.0020.0002] # MONGOLIAN LETTER TODO YA +1872 ; [.3324.0020.0002] # MONGOLIAN LETTER SIBE ZHA +1837 ; [.3325.0020.0002] # MONGOLIAN LETTER RA +1875 ; [.3326.0020.0002] # MONGOLIAN LETTER MANCHU RA +1838 ; [.3327.0020.0002] # MONGOLIAN LETTER WA +1856 ; [.3328.0020.0002] # MONGOLIAN LETTER TODO WA +1839 ; [.3329.0020.0002] # MONGOLIAN LETTER FA +186B ; [.332A.0020.0002] # MONGOLIAN LETTER SIBE FA +1876 ; [.332B.0020.0002] # MONGOLIAN LETTER MANCHU FA +183A ; [.332C.0020.0002] # MONGOLIAN LETTER KA +1857 ; [.332D.0020.0002] # MONGOLIAN LETTER TODO KA +1863 ; [.332E.0020.0002] # MONGOLIAN LETTER SIBE KA +1874 ; [.332F.0020.0002] # MONGOLIAN LETTER MANCHU KA +1889 ; [.3330.0020.0002] # MONGOLIAN LETTER ALI GALI KA +183B ; [.3331.0020.0002] # MONGOLIAN LETTER KHA +183C ; [.3332.0020.0002] # MONGOLIAN LETTER TSA +1854 ; [.3333.0020.0002] # MONGOLIAN LETTER TODO TSA +186E ; [.3334.0020.0002] # MONGOLIAN LETTER SIBE TSA +183D ; [.3335.0020.0002] # MONGOLIAN LETTER ZA +186F ; [.3336.0020.0002] # MONGOLIAN LETTER SIBE ZA +1858 ; [.3337.0020.0002] # MONGOLIAN LETTER TODO GAA +186C ; [.3338.0020.0002] # MONGOLIAN LETTER SIBE GAA +183E ; [.3339.0020.0002] # MONGOLIAN LETTER HAA +1859 ; [.333A.0020.0002] # MONGOLIAN LETTER TODO HAA +186D ; [.333B.0020.0002] # MONGOLIAN LETTER SIBE HAA +183F ; [.333C.0020.0002] # MONGOLIAN LETTER ZRA +1840 ; [.333D.0020.0002] # MONGOLIAN LETTER LHA +1841 ; [.333E.0020.0002] # MONGOLIAN LETTER ZHI +1842 ; [.333F.0020.0002] # MONGOLIAN LETTER CHI +185A ; [.3340.0020.0002] # MONGOLIAN LETTER TODO JIA +185B ; [.3341.0020.0002] # MONGOLIAN LETTER TODO NIA +1870 ; [.3342.0020.0002] # MONGOLIAN LETTER SIBE RAA +188C ; [.3343.0020.0002] # MONGOLIAN LETTER ALI GALI TTA +189E ; [.3344.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TTA +188D ; [.3345.0020.0002] # MONGOLIAN LETTER ALI GALI TTHA +188E ; [.3346.0020.0002] # MONGOLIAN LETTER ALI GALI DDA +189F ; [.3347.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DDHA +188F ; [.3348.0020.0002] # MONGOLIAN LETTER ALI GALI NNA +1890 ; [.3349.0020.0002] # MONGOLIAN LETTER ALI GALI TA +1898 ; [.334A.0020.0002] # MONGOLIAN LETTER TODO ALI GALI TA +18A0 ; [.334B.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TA +1891 ; [.334C.0020.0002] # MONGOLIAN LETTER ALI GALI DA +18A1 ; [.334D.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DHA +1892 ; [.334E.0020.0002] # MONGOLIAN LETTER ALI GALI PA +1893 ; [.334F.0020.0002] # MONGOLIAN LETTER ALI GALI PHA +18A8 ; [.3350.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI BHA +1894 ; [.3351.0020.0002] # MONGOLIAN LETTER ALI GALI SSA +18A3 ; [.3352.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CYA +1895 ; [.3353.0020.0002] # MONGOLIAN LETTER ALI GALI ZHA +1899 ; [.3354.0020.0002] # MONGOLIAN LETTER TODO ALI GALI ZHA +1896 ; [.3355.0020.0002] # MONGOLIAN LETTER ALI GALI ZA +1897 ; [.3356.0020.0002] # MONGOLIAN LETTER ALI GALI AH +18A6 ; [.3357.0020.0002] # MONGOLIAN LETTER ALI GALI HALF U +18A7 ; [.3358.0020.0002] # MONGOLIAN LETTER ALI GALI HALF YA +18AA ; [.3359.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI LHA +18A9 ; [.335A.0020.0002] # MONGOLIAN LETTER ALI GALI DAGALGA +1C5A ; [.335B.0020.0002] # OL CHIKI LETTER LA +1C5B ; [.335C.0020.0002] # OL CHIKI LETTER AT +1C5C ; [.335D.0020.0002] # OL CHIKI LETTER AG +1C5D ; [.335E.0020.0002] # OL CHIKI LETTER ANG +1C5E ; [.335F.0020.0002] # OL CHIKI LETTER AL +1C5F ; [.3360.0020.0002] # OL CHIKI LETTER LAA +1C60 ; [.3361.0020.0002] # OL CHIKI LETTER AAK +1C61 ; [.3362.0020.0002] # OL CHIKI LETTER AAJ +1C62 ; [.3363.0020.0002] # OL CHIKI LETTER AAM +1C63 ; [.3364.0020.0002] # OL CHIKI LETTER AAW +1C64 ; [.3365.0020.0002] # OL CHIKI LETTER LI +1C65 ; [.3366.0020.0002] # OL CHIKI LETTER IS +1C66 ; [.3367.0020.0002] # OL CHIKI LETTER IH +1C67 ; [.3368.0020.0002] # OL CHIKI LETTER INY +1C68 ; [.3369.0020.0002] # OL CHIKI LETTER IR +1C69 ; [.336A.0020.0002] # OL CHIKI LETTER LU +1C6A ; [.336B.0020.0002] # OL CHIKI LETTER UC +1C6B ; [.336C.0020.0002] # OL CHIKI LETTER UD +1C6C ; [.336D.0020.0002] # OL CHIKI LETTER UNN +1C6D ; [.336E.0020.0002] # OL CHIKI LETTER UY +1C6E ; [.336F.0020.0002] # OL CHIKI LETTER LE +1C6F ; [.3370.0020.0002] # OL CHIKI LETTER EP +1C70 ; [.3371.0020.0002] # OL CHIKI LETTER EDD +1C71 ; [.3372.0020.0002] # OL CHIKI LETTER EN +1C72 ; [.3373.0020.0002] # OL CHIKI LETTER ERR +1C73 ; [.3374.0020.0002] # OL CHIKI LETTER LO +1C74 ; [.3375.0020.0002] # OL CHIKI LETTER OTT +1C75 ; [.3376.0020.0002] # OL CHIKI LETTER OB +1C76 ; [.3377.0020.0002] # OL CHIKI LETTER OV +1C77 ; [.3378.0020.0002] # OL CHIKI LETTER OH +1C78 ; [.3379.0020.0002] # OL CHIKI MU TTUDDAG +1C79 ; [.337A.0020.0002] # OL CHIKI GAAHLAA TTUDDAAG +1C7A ; [.337B.0020.0002] # OL CHIKI MU-GAAHLAA TTUDDAAG +1C7B ; [.337C.0020.0002] # OL CHIKI RELAA +1C7C ; [.337D.0020.0002] # OL CHIKI PHAARKAA +1C7D ; [.337E.0020.0002] # OL CHIKI AHAD +AB70 ; [.337F.0020.0002] # CHEROKEE SMALL LETTER A +13A0 ; [.337F.0020.0008] # CHEROKEE LETTER A +AB71 ; [.3380.0020.0002] # CHEROKEE SMALL LETTER E +13A1 ; [.3380.0020.0008] # CHEROKEE LETTER E +AB72 ; [.3381.0020.0002] # CHEROKEE SMALL LETTER I +13A2 ; [.3381.0020.0008] # CHEROKEE LETTER I +AB73 ; [.3382.0020.0002] # CHEROKEE SMALL LETTER O +13A3 ; [.3382.0020.0008] # CHEROKEE LETTER O +AB74 ; [.3383.0020.0002] # CHEROKEE SMALL LETTER U +13A4 ; [.3383.0020.0008] # CHEROKEE LETTER U +AB75 ; [.3384.0020.0002] # CHEROKEE SMALL LETTER V +13A5 ; [.3384.0020.0008] # CHEROKEE LETTER V +AB76 ; [.3385.0020.0002] # CHEROKEE SMALL LETTER GA +13A6 ; [.3385.0020.0008] # CHEROKEE LETTER GA +AB77 ; [.3386.0020.0002] # CHEROKEE SMALL LETTER KA +13A7 ; [.3386.0020.0008] # CHEROKEE LETTER KA +AB78 ; [.3387.0020.0002] # CHEROKEE SMALL LETTER GE +13A8 ; [.3387.0020.0008] # CHEROKEE LETTER GE +AB79 ; [.3388.0020.0002] # CHEROKEE SMALL LETTER GI +13A9 ; [.3388.0020.0008] # CHEROKEE LETTER GI +AB7A ; [.3389.0020.0002] # CHEROKEE SMALL LETTER GO +13AA ; [.3389.0020.0008] # CHEROKEE LETTER GO +AB7B ; [.338A.0020.0002] # CHEROKEE SMALL LETTER GU +13AB ; [.338A.0020.0008] # CHEROKEE LETTER GU +AB7C ; [.338B.0020.0002] # CHEROKEE SMALL LETTER GV +13AC ; [.338B.0020.0008] # CHEROKEE LETTER GV +AB7D ; [.338C.0020.0002] # CHEROKEE SMALL LETTER HA +13AD ; [.338C.0020.0008] # CHEROKEE LETTER HA +AB7E ; [.338D.0020.0002] # CHEROKEE SMALL LETTER HE +13AE ; [.338D.0020.0008] # CHEROKEE LETTER HE +AB7F ; [.338E.0020.0002] # CHEROKEE SMALL LETTER HI +13AF ; [.338E.0020.0008] # CHEROKEE LETTER HI +AB80 ; [.338F.0020.0002] # CHEROKEE SMALL LETTER HO +13B0 ; [.338F.0020.0008] # CHEROKEE LETTER HO +AB81 ; [.3390.0020.0002] # CHEROKEE SMALL LETTER HU +13B1 ; [.3390.0020.0008] # CHEROKEE LETTER HU +AB82 ; [.3391.0020.0002] # CHEROKEE SMALL LETTER HV +13B2 ; [.3391.0020.0008] # CHEROKEE LETTER HV +AB83 ; [.3392.0020.0002] # CHEROKEE SMALL LETTER LA +13B3 ; [.3392.0020.0008] # CHEROKEE LETTER LA +AB84 ; [.3393.0020.0002] # CHEROKEE SMALL LETTER LE +13B4 ; [.3393.0020.0008] # CHEROKEE LETTER LE +AB85 ; [.3394.0020.0002] # CHEROKEE SMALL LETTER LI +13B5 ; [.3394.0020.0008] # CHEROKEE LETTER LI +AB86 ; [.3395.0020.0002] # CHEROKEE SMALL LETTER LO +13B6 ; [.3395.0020.0008] # CHEROKEE LETTER LO +AB87 ; [.3396.0020.0002] # CHEROKEE SMALL LETTER LU +13B7 ; [.3396.0020.0008] # CHEROKEE LETTER LU +AB88 ; [.3397.0020.0002] # CHEROKEE SMALL LETTER LV +13B8 ; [.3397.0020.0008] # CHEROKEE LETTER LV +AB89 ; [.3398.0020.0002] # CHEROKEE SMALL LETTER MA +13B9 ; [.3398.0020.0008] # CHEROKEE LETTER MA +AB8A ; [.3399.0020.0002] # CHEROKEE SMALL LETTER ME +13BA ; [.3399.0020.0008] # CHEROKEE LETTER ME +AB8B ; [.339A.0020.0002] # CHEROKEE SMALL LETTER MI +13BB ; [.339A.0020.0008] # CHEROKEE LETTER MI +AB8C ; [.339B.0020.0002] # CHEROKEE SMALL LETTER MO +13BC ; [.339B.0020.0008] # CHEROKEE LETTER MO +AB8D ; [.339C.0020.0002] # CHEROKEE SMALL LETTER MU +13BD ; [.339C.0020.0008] # CHEROKEE LETTER MU +AB8E ; [.339D.0020.0002] # CHEROKEE SMALL LETTER NA +13BE ; [.339D.0020.0008] # CHEROKEE LETTER NA +AB8F ; [.339E.0020.0002] # CHEROKEE SMALL LETTER HNA +13BF ; [.339E.0020.0008] # CHEROKEE LETTER HNA +AB90 ; [.339F.0020.0002] # CHEROKEE SMALL LETTER NAH +13C0 ; [.339F.0020.0008] # CHEROKEE LETTER NAH +AB91 ; [.33A0.0020.0002] # CHEROKEE SMALL LETTER NE +13C1 ; [.33A0.0020.0008] # CHEROKEE LETTER NE +AB92 ; [.33A1.0020.0002] # CHEROKEE SMALL LETTER NI +13C2 ; [.33A1.0020.0008] # CHEROKEE LETTER NI +AB93 ; [.33A2.0020.0002] # CHEROKEE SMALL LETTER NO +13C3 ; [.33A2.0020.0008] # CHEROKEE LETTER NO +AB94 ; [.33A3.0020.0002] # CHEROKEE SMALL LETTER NU +13C4 ; [.33A3.0020.0008] # CHEROKEE LETTER NU +AB95 ; [.33A4.0020.0002] # CHEROKEE SMALL LETTER NV +13C5 ; [.33A4.0020.0008] # CHEROKEE LETTER NV +AB96 ; [.33A5.0020.0002] # CHEROKEE SMALL LETTER QUA +13C6 ; [.33A5.0020.0008] # CHEROKEE LETTER QUA +AB97 ; [.33A6.0020.0002] # CHEROKEE SMALL LETTER QUE +13C7 ; [.33A6.0020.0008] # CHEROKEE LETTER QUE +AB98 ; [.33A7.0020.0002] # CHEROKEE SMALL LETTER QUI +13C8 ; [.33A7.0020.0008] # CHEROKEE LETTER QUI +AB99 ; [.33A8.0020.0002] # CHEROKEE SMALL LETTER QUO +13C9 ; [.33A8.0020.0008] # CHEROKEE LETTER QUO +AB9A ; [.33A9.0020.0002] # CHEROKEE SMALL LETTER QUU +13CA ; [.33A9.0020.0008] # CHEROKEE LETTER QUU +AB9B ; [.33AA.0020.0002] # CHEROKEE SMALL LETTER QUV +13CB ; [.33AA.0020.0008] # CHEROKEE LETTER QUV +AB9C ; [.33AB.0020.0002] # CHEROKEE SMALL LETTER SA +13CC ; [.33AB.0020.0008] # CHEROKEE LETTER SA +AB9D ; [.33AC.0020.0002] # CHEROKEE SMALL LETTER S +13CD ; [.33AC.0020.0008] # CHEROKEE LETTER S +AB9E ; [.33AD.0020.0002] # CHEROKEE SMALL LETTER SE +13CE ; [.33AD.0020.0008] # CHEROKEE LETTER SE +AB9F ; [.33AE.0020.0002] # CHEROKEE SMALL LETTER SI +13CF ; [.33AE.0020.0008] # CHEROKEE LETTER SI +ABA0 ; [.33AF.0020.0002] # CHEROKEE SMALL LETTER SO +13D0 ; [.33AF.0020.0008] # CHEROKEE LETTER SO +ABA1 ; [.33B0.0020.0002] # CHEROKEE SMALL LETTER SU +13D1 ; [.33B0.0020.0008] # CHEROKEE LETTER SU +ABA2 ; [.33B1.0020.0002] # CHEROKEE SMALL LETTER SV +13D2 ; [.33B1.0020.0008] # CHEROKEE LETTER SV +ABA3 ; [.33B2.0020.0002] # CHEROKEE SMALL LETTER DA +13D3 ; [.33B2.0020.0008] # CHEROKEE LETTER DA +ABA4 ; [.33B3.0020.0002] # CHEROKEE SMALL LETTER TA +13D4 ; [.33B3.0020.0008] # CHEROKEE LETTER TA +ABA5 ; [.33B4.0020.0002] # CHEROKEE SMALL LETTER DE +13D5 ; [.33B4.0020.0008] # CHEROKEE LETTER DE +ABA6 ; [.33B5.0020.0002] # CHEROKEE SMALL LETTER TE +13D6 ; [.33B5.0020.0008] # CHEROKEE LETTER TE +ABA7 ; [.33B6.0020.0002] # CHEROKEE SMALL LETTER DI +13D7 ; [.33B6.0020.0008] # CHEROKEE LETTER DI +ABA8 ; [.33B7.0020.0002] # CHEROKEE SMALL LETTER TI +13D8 ; [.33B7.0020.0008] # CHEROKEE LETTER TI +ABA9 ; [.33B8.0020.0002] # CHEROKEE SMALL LETTER DO +13D9 ; [.33B8.0020.0008] # CHEROKEE LETTER DO +ABAA ; [.33B9.0020.0002] # CHEROKEE SMALL LETTER DU +13DA ; [.33B9.0020.0008] # CHEROKEE LETTER DU +ABAB ; [.33BA.0020.0002] # CHEROKEE SMALL LETTER DV +13DB ; [.33BA.0020.0008] # CHEROKEE LETTER DV +ABAC ; [.33BB.0020.0002] # CHEROKEE SMALL LETTER DLA +13DC ; [.33BB.0020.0008] # CHEROKEE LETTER DLA +ABAD ; [.33BC.0020.0002] # CHEROKEE SMALL LETTER TLA +13DD ; [.33BC.0020.0008] # CHEROKEE LETTER TLA +ABAE ; [.33BD.0020.0002] # CHEROKEE SMALL LETTER TLE +13DE ; [.33BD.0020.0008] # CHEROKEE LETTER TLE +ABAF ; [.33BE.0020.0002] # CHEROKEE SMALL LETTER TLI +13DF ; [.33BE.0020.0008] # CHEROKEE LETTER TLI +ABB0 ; [.33BF.0020.0002] # CHEROKEE SMALL LETTER TLO +13E0 ; [.33BF.0020.0008] # CHEROKEE LETTER TLO +ABB1 ; [.33C0.0020.0002] # CHEROKEE SMALL LETTER TLU +13E1 ; [.33C0.0020.0008] # CHEROKEE LETTER TLU +ABB2 ; [.33C1.0020.0002] # CHEROKEE SMALL LETTER TLV +13E2 ; [.33C1.0020.0008] # CHEROKEE LETTER TLV +ABB3 ; [.33C2.0020.0002] # CHEROKEE SMALL LETTER TSA +13E3 ; [.33C2.0020.0008] # CHEROKEE LETTER TSA +ABB4 ; [.33C3.0020.0002] # CHEROKEE SMALL LETTER TSE +13E4 ; [.33C3.0020.0008] # CHEROKEE LETTER TSE +ABB5 ; [.33C4.0020.0002] # CHEROKEE SMALL LETTER TSI +13E5 ; [.33C4.0020.0008] # CHEROKEE LETTER TSI +ABB6 ; [.33C5.0020.0002] # CHEROKEE SMALL LETTER TSO +13E6 ; [.33C5.0020.0008] # CHEROKEE LETTER TSO +ABB7 ; [.33C6.0020.0002] # CHEROKEE SMALL LETTER TSU +13E7 ; [.33C6.0020.0008] # CHEROKEE LETTER TSU +ABB8 ; [.33C7.0020.0002] # CHEROKEE SMALL LETTER TSV +13E8 ; [.33C7.0020.0008] # CHEROKEE LETTER TSV +ABB9 ; [.33C8.0020.0002] # CHEROKEE SMALL LETTER WA +13E9 ; [.33C8.0020.0008] # CHEROKEE LETTER WA +ABBA ; [.33C9.0020.0002] # CHEROKEE SMALL LETTER WE +13EA ; [.33C9.0020.0008] # CHEROKEE LETTER WE +ABBB ; [.33CA.0020.0002] # CHEROKEE SMALL LETTER WI +13EB ; [.33CA.0020.0008] # CHEROKEE LETTER WI +ABBC ; [.33CB.0020.0002] # CHEROKEE SMALL LETTER WO +13EC ; [.33CB.0020.0008] # CHEROKEE LETTER WO +ABBD ; [.33CC.0020.0002] # CHEROKEE SMALL LETTER WU +13ED ; [.33CC.0020.0008] # CHEROKEE LETTER WU +ABBE ; [.33CD.0020.0002] # CHEROKEE SMALL LETTER WV +13EE ; [.33CD.0020.0008] # CHEROKEE LETTER WV +ABBF ; [.33CE.0020.0002] # CHEROKEE SMALL LETTER YA +13EF ; [.33CE.0020.0008] # CHEROKEE LETTER YA +13F8 ; [.33CF.0020.0002] # CHEROKEE SMALL LETTER YE +13F0 ; [.33CF.0020.0008] # CHEROKEE LETTER YE +13F9 ; [.33D0.0020.0002] # CHEROKEE SMALL LETTER YI +13F1 ; [.33D0.0020.0008] # CHEROKEE LETTER YI +13FA ; [.33D1.0020.0002] # CHEROKEE SMALL LETTER YO +13F2 ; [.33D1.0020.0008] # CHEROKEE LETTER YO +13FB ; [.33D2.0020.0002] # CHEROKEE SMALL LETTER YU +13F3 ; [.33D2.0020.0008] # CHEROKEE LETTER YU +13FC ; [.33D3.0020.0002] # CHEROKEE SMALL LETTER YV +13F4 ; [.33D3.0020.0008] # CHEROKEE LETTER YV +13FD ; [.33D4.0020.0002] # CHEROKEE SMALL LETTER MV +13F5 ; [.33D4.0020.0008] # CHEROKEE LETTER MV +104D8 ; [.33D5.0020.0002] # OSAGE SMALL LETTER A +104B0 ; [.33D5.0020.0008] # OSAGE CAPITAL LETTER A +104D9 ; [.33D6.0020.0002] # OSAGE SMALL LETTER AI +104B1 ; [.33D6.0020.0008] # OSAGE CAPITAL LETTER AI +104DA ; [.33D7.0020.0002] # OSAGE SMALL LETTER AIN +104B2 ; [.33D7.0020.0008] # OSAGE CAPITAL LETTER AIN +104DB ; [.33D8.0020.0002] # OSAGE SMALL LETTER AH +104B3 ; [.33D8.0020.0008] # OSAGE CAPITAL LETTER AH +104DC ; [.33D9.0020.0002] # OSAGE SMALL LETTER BRA +104B4 ; [.33D9.0020.0008] # OSAGE CAPITAL LETTER BRA +104DD ; [.33DA.0020.0002] # OSAGE SMALL LETTER CHA +104B5 ; [.33DA.0020.0008] # OSAGE CAPITAL LETTER CHA +104DE ; [.33DB.0020.0002] # OSAGE SMALL LETTER EHCHA +104B6 ; [.33DB.0020.0008] # OSAGE CAPITAL LETTER EHCHA +104DF ; [.33DC.0020.0002] # OSAGE SMALL LETTER E +104B7 ; [.33DC.0020.0008] # OSAGE CAPITAL LETTER E +104E0 ; [.33DD.0020.0002] # OSAGE SMALL LETTER EIN +104B8 ; [.33DD.0020.0008] # OSAGE CAPITAL LETTER EIN +104E1 ; [.33DE.0020.0002] # OSAGE SMALL LETTER HA +104B9 ; [.33DE.0020.0008] # OSAGE CAPITAL LETTER HA +104E2 ; [.33DF.0020.0002] # OSAGE SMALL LETTER HYA +104BA ; [.33DF.0020.0008] # OSAGE CAPITAL LETTER HYA +104E3 ; [.33E0.0020.0002] # OSAGE SMALL LETTER I +104BB ; [.33E0.0020.0008] # OSAGE CAPITAL LETTER I +104E4 ; [.33E1.0020.0002] # OSAGE SMALL LETTER KA +104BC ; [.33E1.0020.0008] # OSAGE CAPITAL LETTER KA +104E5 ; [.33E2.0020.0002] # OSAGE SMALL LETTER EHKA +104BD ; [.33E2.0020.0008] # OSAGE CAPITAL LETTER EHKA +104E6 ; [.33E3.0020.0002] # OSAGE SMALL LETTER KYA +104BE ; [.33E3.0020.0008] # OSAGE CAPITAL LETTER KYA +104E7 ; [.33E4.0020.0002] # OSAGE SMALL LETTER LA +104BF ; [.33E4.0020.0008] # OSAGE CAPITAL LETTER LA +104E8 ; [.33E5.0020.0002] # OSAGE SMALL LETTER MA +104C0 ; [.33E5.0020.0008] # OSAGE CAPITAL LETTER MA +104E9 ; [.33E6.0020.0002] # OSAGE SMALL LETTER NA +104C1 ; [.33E6.0020.0008] # OSAGE CAPITAL LETTER NA +104EA ; [.33E7.0020.0002] # OSAGE SMALL LETTER O +104C2 ; [.33E7.0020.0008] # OSAGE CAPITAL LETTER O +104EB ; [.33E8.0020.0002] # OSAGE SMALL LETTER OIN +104C3 ; [.33E8.0020.0008] # OSAGE CAPITAL LETTER OIN +104EC ; [.33E9.0020.0002] # OSAGE SMALL LETTER PA +104C4 ; [.33E9.0020.0008] # OSAGE CAPITAL LETTER PA +104ED ; [.33EA.0020.0002] # OSAGE SMALL LETTER EHPA +104C5 ; [.33EA.0020.0008] # OSAGE CAPITAL LETTER EHPA +104EE ; [.33EB.0020.0002] # OSAGE SMALL LETTER SA +104C6 ; [.33EB.0020.0008] # OSAGE CAPITAL LETTER SA +104EF ; [.33EC.0020.0002] # OSAGE SMALL LETTER SHA +104C7 ; [.33EC.0020.0008] # OSAGE CAPITAL LETTER SHA +104F0 ; [.33ED.0020.0002] # OSAGE SMALL LETTER TA +104C8 ; [.33ED.0020.0008] # OSAGE CAPITAL LETTER TA +104F1 ; [.33EE.0020.0002] # OSAGE SMALL LETTER EHTA +104C9 ; [.33EE.0020.0008] # OSAGE CAPITAL LETTER EHTA +104F2 ; [.33EF.0020.0002] # OSAGE SMALL LETTER TSA +104CA ; [.33EF.0020.0008] # OSAGE CAPITAL LETTER TSA +104F3 ; [.33F0.0020.0002] # OSAGE SMALL LETTER EHTSA +104CB ; [.33F0.0020.0008] # OSAGE CAPITAL LETTER EHTSA +104F4 ; [.33F1.0020.0002] # OSAGE SMALL LETTER TSHA +104CC ; [.33F1.0020.0008] # OSAGE CAPITAL LETTER TSHA +104F5 ; [.33F2.0020.0002] # OSAGE SMALL LETTER DHA +104CD ; [.33F2.0020.0008] # OSAGE CAPITAL LETTER DHA +104F6 ; [.33F3.0020.0002] # OSAGE SMALL LETTER U +104CE ; [.33F3.0020.0008] # OSAGE CAPITAL LETTER U +104F7 ; [.33F4.0020.0002] # OSAGE SMALL LETTER WA +104CF ; [.33F4.0020.0008] # OSAGE CAPITAL LETTER WA +104F8 ; [.33F5.0020.0002] # OSAGE SMALL LETTER KHA +104D0 ; [.33F5.0020.0008] # OSAGE CAPITAL LETTER KHA +104F9 ; [.33F6.0020.0002] # OSAGE SMALL LETTER GHA +104D1 ; [.33F6.0020.0008] # OSAGE CAPITAL LETTER GHA +104FA ; [.33F7.0020.0002] # OSAGE SMALL LETTER ZA +104D2 ; [.33F7.0020.0008] # OSAGE CAPITAL LETTER ZA +104FB ; [.33F8.0020.0002] # OSAGE SMALL LETTER ZHA +104D3 ; [.33F8.0020.0008] # OSAGE CAPITAL LETTER ZHA +1401 ; [.33F9.0020.0002] # CANADIAN SYLLABICS E +1402 ; [.33FA.0020.0002] # CANADIAN SYLLABICS AAI +1403 ; [.33FB.0020.0002] # CANADIAN SYLLABICS I +1404 ; [.33FC.0020.0002] # CANADIAN SYLLABICS II +1405 ; [.33FD.0020.0002] # CANADIAN SYLLABICS O +1406 ; [.33FE.0020.0002] # CANADIAN SYLLABICS OO +1407 ; [.33FF.0020.0002] # CANADIAN SYLLABICS Y-CREE OO +1408 ; [.3400.0020.0002] # CANADIAN SYLLABICS CARRIER EE +1409 ; [.3401.0020.0002] # CANADIAN SYLLABICS CARRIER I +140A ; [.3402.0020.0002] # CANADIAN SYLLABICS A +140B ; [.3403.0020.0002] # CANADIAN SYLLABICS AA +140C ; [.3404.0020.0002] # CANADIAN SYLLABICS WE +140D ; [.3405.0020.0002] # CANADIAN SYLLABICS WEST-CREE WE +140E ; [.3406.0020.0002] # CANADIAN SYLLABICS WI +140F ; [.3407.0020.0002] # CANADIAN SYLLABICS WEST-CREE WI +1410 ; [.3408.0020.0002] # CANADIAN SYLLABICS WII +1411 ; [.3409.0020.0002] # CANADIAN SYLLABICS WEST-CREE WII +1412 ; [.340A.0020.0002] # CANADIAN SYLLABICS WO +1413 ; [.340B.0020.0002] # CANADIAN SYLLABICS WEST-CREE WO +1414 ; [.340C.0020.0002] # CANADIAN SYLLABICS WOO +1415 ; [.340D.0020.0002] # CANADIAN SYLLABICS WEST-CREE WOO +1416 ; [.340E.0020.0002] # CANADIAN SYLLABICS NASKAPI WOO +1417 ; [.340F.0020.0002] # CANADIAN SYLLABICS WA +1418 ; [.3410.0020.0002] # CANADIAN SYLLABICS WEST-CREE WA +1419 ; [.3411.0020.0002] # CANADIAN SYLLABICS WAA +141A ; [.3412.0020.0002] # CANADIAN SYLLABICS WEST-CREE WAA +141B ; [.3413.0020.0002] # CANADIAN SYLLABICS NASKAPI WAA +141C ; [.3414.0020.0002] # CANADIAN SYLLABICS AI +141D ; [.3415.0020.0002] # CANADIAN SYLLABICS Y-CREE W +141E ; [.3416.0020.0002] # CANADIAN SYLLABICS GLOTTAL STOP +141F ; [.3417.0020.0002] # CANADIAN SYLLABICS FINAL ACUTE +1420 ; [.3418.0020.0002] # CANADIAN SYLLABICS FINAL GRAVE +1421 ; [.3419.0020.0002] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING +1422 ; [.341A.0020.0002] # CANADIAN SYLLABICS FINAL TOP HALF RING +1423 ; [.341B.0020.0002] # CANADIAN SYLLABICS FINAL RIGHT HALF RING +1424 ; [.341C.0020.0002] # CANADIAN SYLLABICS FINAL RING +1425 ; [.341D.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE +1426 ; [.341E.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES +1427 ; [.341F.0020.0002] # CANADIAN SYLLABICS FINAL MIDDLE DOT +1428 ; [.3420.0020.0002] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE +1429 ; [.3421.0020.0002] # CANADIAN SYLLABICS FINAL PLUS +142A ; [.3422.0020.0002] # CANADIAN SYLLABICS FINAL DOWN TACK +142B ; [.3423.0020.0002] # CANADIAN SYLLABICS EN +142C ; [.3424.0020.0002] # CANADIAN SYLLABICS IN +142D ; [.3425.0020.0002] # CANADIAN SYLLABICS ON +142E ; [.3426.0020.0002] # CANADIAN SYLLABICS AN +142F ; [.3427.0020.0002] # CANADIAN SYLLABICS PE +1430 ; [.3428.0020.0002] # CANADIAN SYLLABICS PAAI +1431 ; [.3429.0020.0002] # CANADIAN SYLLABICS PI +1432 ; [.342A.0020.0002] # CANADIAN SYLLABICS PII +1433 ; [.342B.0020.0002] # CANADIAN SYLLABICS PO +1434 ; [.342C.0020.0002] # CANADIAN SYLLABICS POO +1435 ; [.342D.0020.0002] # CANADIAN SYLLABICS Y-CREE POO +1436 ; [.342E.0020.0002] # CANADIAN SYLLABICS CARRIER HEE +1437 ; [.342F.0020.0002] # CANADIAN SYLLABICS CARRIER HI +1438 ; [.3430.0020.0002] # CANADIAN SYLLABICS PA +1439 ; [.3431.0020.0002] # CANADIAN SYLLABICS PAA +143A ; [.3432.0020.0002] # CANADIAN SYLLABICS PWE +143B ; [.3433.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWE +143C ; [.3434.0020.0002] # CANADIAN SYLLABICS PWI +143D ; [.3435.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWI +143E ; [.3436.0020.0002] # CANADIAN SYLLABICS PWII +143F ; [.3437.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWII +1440 ; [.3438.0020.0002] # CANADIAN SYLLABICS PWO +1441 ; [.3439.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWO +1442 ; [.343A.0020.0002] # CANADIAN SYLLABICS PWOO +1443 ; [.343B.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWOO +1444 ; [.343C.0020.0002] # CANADIAN SYLLABICS PWA +1445 ; [.343D.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWA +1446 ; [.343E.0020.0002] # CANADIAN SYLLABICS PWAA +1447 ; [.343F.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWAA +1448 ; [.3440.0020.0002] # CANADIAN SYLLABICS Y-CREE PWAA +1449 ; [.3441.0020.0002] # CANADIAN SYLLABICS P +144A ; [.3442.0020.0002] # CANADIAN SYLLABICS WEST-CREE P +144B ; [.3443.0020.0002] # CANADIAN SYLLABICS CARRIER H +144C ; [.3444.0020.0002] # CANADIAN SYLLABICS TE +144D ; [.3445.0020.0002] # CANADIAN SYLLABICS TAAI +144E ; [.3446.0020.0002] # CANADIAN SYLLABICS TI +144F ; [.3447.0020.0002] # CANADIAN SYLLABICS TII +1450 ; [.3448.0020.0002] # CANADIAN SYLLABICS TO +1451 ; [.3449.0020.0002] # CANADIAN SYLLABICS TOO +1452 ; [.344A.0020.0002] # CANADIAN SYLLABICS Y-CREE TOO +1453 ; [.344B.0020.0002] # CANADIAN SYLLABICS CARRIER DEE +1454 ; [.344C.0020.0002] # CANADIAN SYLLABICS CARRIER DI +1455 ; [.344D.0020.0002] # CANADIAN SYLLABICS TA +1456 ; [.344E.0020.0002] # CANADIAN SYLLABICS TAA +1457 ; [.344F.0020.0002] # CANADIAN SYLLABICS TWE +1458 ; [.3450.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWE +1459 ; [.3451.0020.0002] # CANADIAN SYLLABICS TWI +145A ; [.3452.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWI +145B ; [.3453.0020.0002] # CANADIAN SYLLABICS TWII +145C ; [.3454.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWII +145D ; [.3455.0020.0002] # CANADIAN SYLLABICS TWO +145E ; [.3456.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWO +145F ; [.3457.0020.0002] # CANADIAN SYLLABICS TWOO +1460 ; [.3458.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWOO +1461 ; [.3459.0020.0002] # CANADIAN SYLLABICS TWA +1462 ; [.345A.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWA +1463 ; [.345B.0020.0002] # CANADIAN SYLLABICS TWAA +1464 ; [.345C.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWAA +1465 ; [.345D.0020.0002] # CANADIAN SYLLABICS NASKAPI TWAA +1466 ; [.345E.0020.0002] # CANADIAN SYLLABICS T +1467 ; [.345F.0020.0002] # CANADIAN SYLLABICS TTE +1468 ; [.3460.0020.0002] # CANADIAN SYLLABICS TTI +1469 ; [.3461.0020.0002] # CANADIAN SYLLABICS TTO +146A ; [.3462.0020.0002] # CANADIAN SYLLABICS TTA +146B ; [.3463.0020.0002] # CANADIAN SYLLABICS KE +146C ; [.3464.0020.0002] # CANADIAN SYLLABICS KAAI +146D ; [.3465.0020.0002] # CANADIAN SYLLABICS KI +146E ; [.3466.0020.0002] # CANADIAN SYLLABICS KII +146F ; [.3467.0020.0002] # CANADIAN SYLLABICS KO +1470 ; [.3468.0020.0002] # CANADIAN SYLLABICS KOO +1471 ; [.3469.0020.0002] # CANADIAN SYLLABICS Y-CREE KOO +1472 ; [.346A.0020.0002] # CANADIAN SYLLABICS KA +1473 ; [.346B.0020.0002] # CANADIAN SYLLABICS KAA +1474 ; [.346C.0020.0002] # CANADIAN SYLLABICS KWE +1475 ; [.346D.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWE +1476 ; [.346E.0020.0002] # CANADIAN SYLLABICS KWI +1477 ; [.346F.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWI +1478 ; [.3470.0020.0002] # CANADIAN SYLLABICS KWII +1479 ; [.3471.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWII +147A ; [.3472.0020.0002] # CANADIAN SYLLABICS KWO +147B ; [.3473.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWO +147C ; [.3474.0020.0002] # CANADIAN SYLLABICS KWOO +147D ; [.3475.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWOO +147E ; [.3476.0020.0002] # CANADIAN SYLLABICS KWA +147F ; [.3477.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWA +1480 ; [.3478.0020.0002] # CANADIAN SYLLABICS KWAA +1481 ; [.3479.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWAA +1482 ; [.347A.0020.0002] # CANADIAN SYLLABICS NASKAPI KWAA +1483 ; [.347B.0020.0002] # CANADIAN SYLLABICS K +1484 ; [.347C.0020.0002] # CANADIAN SYLLABICS KW +1485 ; [.347D.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH +1486 ; [.347E.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH +1487 ; [.347F.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH +1488 ; [.3480.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH +1489 ; [.3481.0020.0002] # CANADIAN SYLLABICS CE +148A ; [.3482.0020.0002] # CANADIAN SYLLABICS CAAI +148B ; [.3483.0020.0002] # CANADIAN SYLLABICS CI +148C ; [.3484.0020.0002] # CANADIAN SYLLABICS CII +148D ; [.3485.0020.0002] # CANADIAN SYLLABICS CO +148E ; [.3486.0020.0002] # CANADIAN SYLLABICS COO +148F ; [.3487.0020.0002] # CANADIAN SYLLABICS Y-CREE COO +1490 ; [.3488.0020.0002] # CANADIAN SYLLABICS CA +1491 ; [.3489.0020.0002] # CANADIAN SYLLABICS CAA +1492 ; [.348A.0020.0002] # CANADIAN SYLLABICS CWE +1493 ; [.348B.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWE +1494 ; [.348C.0020.0002] # CANADIAN SYLLABICS CWI +1495 ; [.348D.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWI +1496 ; [.348E.0020.0002] # CANADIAN SYLLABICS CWII +1497 ; [.348F.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWII +1498 ; [.3490.0020.0002] # CANADIAN SYLLABICS CWO +1499 ; [.3491.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWO +149A ; [.3492.0020.0002] # CANADIAN SYLLABICS CWOO +149B ; [.3493.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWOO +149C ; [.3494.0020.0002] # CANADIAN SYLLABICS CWA +149D ; [.3495.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWA +149E ; [.3496.0020.0002] # CANADIAN SYLLABICS CWAA +149F ; [.3497.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWAA +14A0 ; [.3498.0020.0002] # CANADIAN SYLLABICS NASKAPI CWAA +14A1 ; [.3499.0020.0002] # CANADIAN SYLLABICS C +14A2 ; [.349A.0020.0002] # CANADIAN SYLLABICS SAYISI TH +14A3 ; [.349B.0020.0002] # CANADIAN SYLLABICS ME +14A4 ; [.349C.0020.0002] # CANADIAN SYLLABICS MAAI +14A5 ; [.349D.0020.0002] # CANADIAN SYLLABICS MI +14A6 ; [.349E.0020.0002] # CANADIAN SYLLABICS MII +14A7 ; [.349F.0020.0002] # CANADIAN SYLLABICS MO +14A8 ; [.34A0.0020.0002] # CANADIAN SYLLABICS MOO +14A9 ; [.34A1.0020.0002] # CANADIAN SYLLABICS Y-CREE MOO +14AA ; [.34A2.0020.0002] # CANADIAN SYLLABICS MA +14AB ; [.34A3.0020.0002] # CANADIAN SYLLABICS MAA +14AC ; [.34A4.0020.0002] # CANADIAN SYLLABICS MWE +14AD ; [.34A5.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWE +14AE ; [.34A6.0020.0002] # CANADIAN SYLLABICS MWI +14AF ; [.34A7.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWI +14B0 ; [.34A8.0020.0002] # CANADIAN SYLLABICS MWII +14B1 ; [.34A9.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWII +14B2 ; [.34AA.0020.0002] # CANADIAN SYLLABICS MWO +14B3 ; [.34AB.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWO +14B4 ; [.34AC.0020.0002] # CANADIAN SYLLABICS MWOO +14B5 ; [.34AD.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWOO +14B6 ; [.34AE.0020.0002] # CANADIAN SYLLABICS MWA +14B7 ; [.34AF.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWA +14B8 ; [.34B0.0020.0002] # CANADIAN SYLLABICS MWAA +14B9 ; [.34B1.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWAA +14BA ; [.34B2.0020.0002] # CANADIAN SYLLABICS NASKAPI MWAA +14BB ; [.34B3.0020.0002] # CANADIAN SYLLABICS M +14BC ; [.34B4.0020.0002] # CANADIAN SYLLABICS WEST-CREE M +14BD ; [.34B5.0020.0002] # CANADIAN SYLLABICS MH +14BE ; [.34B6.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN M +14BF ; [.34B7.0020.0002] # CANADIAN SYLLABICS SAYISI M +14C0 ; [.34B8.0020.0002] # CANADIAN SYLLABICS NE +14C1 ; [.34B9.0020.0002] # CANADIAN SYLLABICS NAAI +14C2 ; [.34BA.0020.0002] # CANADIAN SYLLABICS NI +14C3 ; [.34BB.0020.0002] # CANADIAN SYLLABICS NII +14C4 ; [.34BC.0020.0002] # CANADIAN SYLLABICS NO +14C5 ; [.34BD.0020.0002] # CANADIAN SYLLABICS NOO +14C6 ; [.34BE.0020.0002] # CANADIAN SYLLABICS Y-CREE NOO +14C7 ; [.34BF.0020.0002] # CANADIAN SYLLABICS NA +14C8 ; [.34C0.0020.0002] # CANADIAN SYLLABICS NAA +14C9 ; [.34C1.0020.0002] # CANADIAN SYLLABICS NWE +14CA ; [.34C2.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWE +14CB ; [.34C3.0020.0002] # CANADIAN SYLLABICS NWA +14CC ; [.34C4.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWA +14CD ; [.34C5.0020.0002] # CANADIAN SYLLABICS NWAA +14CE ; [.34C6.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWAA +14CF ; [.34C7.0020.0002] # CANADIAN SYLLABICS NASKAPI NWAA +14D0 ; [.34C8.0020.0002] # CANADIAN SYLLABICS N +14D1 ; [.34C9.0020.0002] # CANADIAN SYLLABICS CARRIER NG +14D2 ; [.34CA.0020.0002] # CANADIAN SYLLABICS NH +14D3 ; [.34CB.0020.0002] # CANADIAN SYLLABICS LE +14D4 ; [.34CC.0020.0002] # CANADIAN SYLLABICS LAAI +14D5 ; [.34CD.0020.0002] # CANADIAN SYLLABICS LI +14D6 ; [.34CE.0020.0002] # CANADIAN SYLLABICS LII +14D7 ; [.34CF.0020.0002] # CANADIAN SYLLABICS LO +14D8 ; [.34D0.0020.0002] # CANADIAN SYLLABICS LOO +14D9 ; [.34D1.0020.0002] # CANADIAN SYLLABICS Y-CREE LOO +14DA ; [.34D2.0020.0002] # CANADIAN SYLLABICS LA +14DB ; [.34D3.0020.0002] # CANADIAN SYLLABICS LAA +14DC ; [.34D4.0020.0002] # CANADIAN SYLLABICS LWE +14DD ; [.34D5.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWE +14DE ; [.34D6.0020.0002] # CANADIAN SYLLABICS LWI +14DF ; [.34D7.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWI +14E0 ; [.34D8.0020.0002] # CANADIAN SYLLABICS LWII +14E1 ; [.34D9.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWII +14E2 ; [.34DA.0020.0002] # CANADIAN SYLLABICS LWO +14E3 ; [.34DB.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWO +14E4 ; [.34DC.0020.0002] # CANADIAN SYLLABICS LWOO +14E5 ; [.34DD.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWOO +14E6 ; [.34DE.0020.0002] # CANADIAN SYLLABICS LWA +14E7 ; [.34DF.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWA +14E8 ; [.34E0.0020.0002] # CANADIAN SYLLABICS LWAA +14E9 ; [.34E1.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWAA +14EA ; [.34E2.0020.0002] # CANADIAN SYLLABICS L +14EB ; [.34E3.0020.0002] # CANADIAN SYLLABICS WEST-CREE L +14EC ; [.34E4.0020.0002] # CANADIAN SYLLABICS MEDIAL L +14ED ; [.34E5.0020.0002] # CANADIAN SYLLABICS SE +14EE ; [.34E6.0020.0002] # CANADIAN SYLLABICS SAAI +14EF ; [.34E7.0020.0002] # CANADIAN SYLLABICS SI +14F0 ; [.34E8.0020.0002] # CANADIAN SYLLABICS SII +14F1 ; [.34E9.0020.0002] # CANADIAN SYLLABICS SO +14F2 ; [.34EA.0020.0002] # CANADIAN SYLLABICS SOO +14F3 ; [.34EB.0020.0002] # CANADIAN SYLLABICS Y-CREE SOO +14F4 ; [.34EC.0020.0002] # CANADIAN SYLLABICS SA +14F5 ; [.34ED.0020.0002] # CANADIAN SYLLABICS SAA +14F6 ; [.34EE.0020.0002] # CANADIAN SYLLABICS SWE +14F7 ; [.34EF.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWE +14F8 ; [.34F0.0020.0002] # CANADIAN SYLLABICS SWI +14F9 ; [.34F1.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWI +14FA ; [.34F2.0020.0002] # CANADIAN SYLLABICS SWII +14FB ; [.34F3.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWII +14FC ; [.34F4.0020.0002] # CANADIAN SYLLABICS SWO +14FD ; [.34F5.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWO +14FE ; [.34F6.0020.0002] # CANADIAN SYLLABICS SWOO +14FF ; [.34F7.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWOO +1500 ; [.34F8.0020.0002] # CANADIAN SYLLABICS SWA +1501 ; [.34F9.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWA +1502 ; [.34FA.0020.0002] # CANADIAN SYLLABICS SWAA +1503 ; [.34FB.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWAA +1504 ; [.34FC.0020.0002] # CANADIAN SYLLABICS NASKAPI SWAA +1505 ; [.34FD.0020.0002] # CANADIAN SYLLABICS S +1506 ; [.34FE.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN S +1507 ; [.34FF.0020.0002] # CANADIAN SYLLABICS SW +1508 ; [.3500.0020.0002] # CANADIAN SYLLABICS BLACKFOOT S +1509 ; [.3501.0020.0002] # CANADIAN SYLLABICS MOOSE-CREE SK +150A ; [.3502.0020.0002] # CANADIAN SYLLABICS NASKAPI SKW +150B ; [.3503.0020.0002] # CANADIAN SYLLABICS NASKAPI S-W +150C ; [.3504.0020.0002] # CANADIAN SYLLABICS NASKAPI SPWA +150D ; [.3505.0020.0002] # CANADIAN SYLLABICS NASKAPI STWA +150E ; [.3506.0020.0002] # CANADIAN SYLLABICS NASKAPI SKWA +150F ; [.3507.0020.0002] # CANADIAN SYLLABICS NASKAPI SCWA +1510 ; [.3508.0020.0002] # CANADIAN SYLLABICS SHE +1511 ; [.3509.0020.0002] # CANADIAN SYLLABICS SHI +1512 ; [.350A.0020.0002] # CANADIAN SYLLABICS SHII +1513 ; [.350B.0020.0002] # CANADIAN SYLLABICS SHO +1514 ; [.350C.0020.0002] # CANADIAN SYLLABICS SHOO +1515 ; [.350D.0020.0002] # CANADIAN SYLLABICS SHA +1516 ; [.350E.0020.0002] # CANADIAN SYLLABICS SHAA +1517 ; [.350F.0020.0002] # CANADIAN SYLLABICS SHWE +1518 ; [.3510.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWE +1519 ; [.3511.0020.0002] # CANADIAN SYLLABICS SHWI +151A ; [.3512.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWI +151B ; [.3513.0020.0002] # CANADIAN SYLLABICS SHWII +151C ; [.3514.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWII +151D ; [.3515.0020.0002] # CANADIAN SYLLABICS SHWO +151E ; [.3516.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWO +151F ; [.3517.0020.0002] # CANADIAN SYLLABICS SHWOO +1520 ; [.3518.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWOO +1521 ; [.3519.0020.0002] # CANADIAN SYLLABICS SHWA +1522 ; [.351A.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWA +1523 ; [.351B.0020.0002] # CANADIAN SYLLABICS SHWAA +1524 ; [.351C.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWAA +1525 ; [.351D.0020.0002] # CANADIAN SYLLABICS SH +1526 ; [.351E.0020.0002] # CANADIAN SYLLABICS YE +1527 ; [.351F.0020.0002] # CANADIAN SYLLABICS YAAI +1528 ; [.3520.0020.0002] # CANADIAN SYLLABICS YI +1529 ; [.3521.0020.0002] # CANADIAN SYLLABICS YII +152A ; [.3522.0020.0002] # CANADIAN SYLLABICS YO +152B ; [.3523.0020.0002] # CANADIAN SYLLABICS YOO +152C ; [.3524.0020.0002] # CANADIAN SYLLABICS Y-CREE YOO +152D ; [.3525.0020.0002] # CANADIAN SYLLABICS YA +152E ; [.3526.0020.0002] # CANADIAN SYLLABICS YAA +152F ; [.3527.0020.0002] # CANADIAN SYLLABICS YWE +1530 ; [.3528.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWE +1531 ; [.3529.0020.0002] # CANADIAN SYLLABICS YWI +1532 ; [.352A.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWI +1533 ; [.352B.0020.0002] # CANADIAN SYLLABICS YWII +1534 ; [.352C.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWII +1535 ; [.352D.0020.0002] # CANADIAN SYLLABICS YWO +1536 ; [.352E.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWO +1537 ; [.352F.0020.0002] # CANADIAN SYLLABICS YWOO +1538 ; [.3530.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWOO +1539 ; [.3531.0020.0002] # CANADIAN SYLLABICS YWA +153A ; [.3532.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWA +153B ; [.3533.0020.0002] # CANADIAN SYLLABICS YWAA +153C ; [.3534.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWAA +153D ; [.3535.0020.0002] # CANADIAN SYLLABICS NASKAPI YWAA +153E ; [.3536.0020.0002] # CANADIAN SYLLABICS Y +153F ; [.3537.0020.0002] # CANADIAN SYLLABICS BIBLE-CREE Y +1540 ; [.3538.0020.0002] # CANADIAN SYLLABICS WEST-CREE Y +1541 ; [.3539.0020.0002] # CANADIAN SYLLABICS SAYISI YI +1542 ; [.353A.0020.0002] # CANADIAN SYLLABICS RE +1543 ; [.353B.0020.0002] # CANADIAN SYLLABICS R-CREE RE +1544 ; [.353C.0020.0002] # CANADIAN SYLLABICS WEST-CREE LE +1545 ; [.353D.0020.0002] # CANADIAN SYLLABICS RAAI +1546 ; [.353E.0020.0002] # CANADIAN SYLLABICS RI +1547 ; [.353F.0020.0002] # CANADIAN SYLLABICS RII +1548 ; [.3540.0020.0002] # CANADIAN SYLLABICS RO +1549 ; [.3541.0020.0002] # CANADIAN SYLLABICS ROO +154A ; [.3542.0020.0002] # CANADIAN SYLLABICS WEST-CREE LO +154B ; [.3543.0020.0002] # CANADIAN SYLLABICS RA +154C ; [.3544.0020.0002] # CANADIAN SYLLABICS RAA +154D ; [.3545.0020.0002] # CANADIAN SYLLABICS WEST-CREE LA +154E ; [.3546.0020.0002] # CANADIAN SYLLABICS RWAA +154F ; [.3547.0020.0002] # CANADIAN SYLLABICS WEST-CREE RWAA +1550 ; [.3548.0020.0002] # CANADIAN SYLLABICS R +1551 ; [.3549.0020.0002] # CANADIAN SYLLABICS WEST-CREE R +1552 ; [.354A.0020.0002] # CANADIAN SYLLABICS MEDIAL R +1553 ; [.354B.0020.0002] # CANADIAN SYLLABICS FE +1554 ; [.354C.0020.0002] # CANADIAN SYLLABICS FAAI +1555 ; [.354D.0020.0002] # CANADIAN SYLLABICS FI +1556 ; [.354E.0020.0002] # CANADIAN SYLLABICS FII +1557 ; [.354F.0020.0002] # CANADIAN SYLLABICS FO +1558 ; [.3550.0020.0002] # CANADIAN SYLLABICS FOO +1559 ; [.3551.0020.0002] # CANADIAN SYLLABICS FA +155A ; [.3552.0020.0002] # CANADIAN SYLLABICS FAA +155B ; [.3553.0020.0002] # CANADIAN SYLLABICS FWAA +155C ; [.3554.0020.0002] # CANADIAN SYLLABICS WEST-CREE FWAA +155D ; [.3555.0020.0002] # CANADIAN SYLLABICS F +155E ; [.3556.0020.0002] # CANADIAN SYLLABICS THE +155F ; [.3557.0020.0002] # CANADIAN SYLLABICS N-CREE THE +1560 ; [.3558.0020.0002] # CANADIAN SYLLABICS THI +1561 ; [.3559.0020.0002] # CANADIAN SYLLABICS N-CREE THI +1562 ; [.355A.0020.0002] # CANADIAN SYLLABICS THII +1563 ; [.355B.0020.0002] # CANADIAN SYLLABICS N-CREE THII +1564 ; [.355C.0020.0002] # CANADIAN SYLLABICS THO +1565 ; [.355D.0020.0002] # CANADIAN SYLLABICS THOO +1566 ; [.355E.0020.0002] # CANADIAN SYLLABICS THA +1567 ; [.355F.0020.0002] # CANADIAN SYLLABICS THAA +1568 ; [.3560.0020.0002] # CANADIAN SYLLABICS THWAA +1569 ; [.3561.0020.0002] # CANADIAN SYLLABICS WEST-CREE THWAA +156A ; [.3562.0020.0002] # CANADIAN SYLLABICS TH +156B ; [.3563.0020.0002] # CANADIAN SYLLABICS TTHE +156C ; [.3564.0020.0002] # CANADIAN SYLLABICS TTHI +156D ; [.3565.0020.0002] # CANADIAN SYLLABICS TTHO +156E ; [.3566.0020.0002] # CANADIAN SYLLABICS TTHA +156F ; [.3567.0020.0002] # CANADIAN SYLLABICS TTH +1570 ; [.3568.0020.0002] # CANADIAN SYLLABICS TYE +1571 ; [.3569.0020.0002] # CANADIAN SYLLABICS TYI +1572 ; [.356A.0020.0002] # CANADIAN SYLLABICS TYO +1573 ; [.356B.0020.0002] # CANADIAN SYLLABICS TYA +1574 ; [.356C.0020.0002] # CANADIAN SYLLABICS NUNAVIK HE +1575 ; [.356D.0020.0002] # CANADIAN SYLLABICS NUNAVIK HI +1576 ; [.356E.0020.0002] # CANADIAN SYLLABICS NUNAVIK HII +1577 ; [.356F.0020.0002] # CANADIAN SYLLABICS NUNAVIK HO +1578 ; [.3570.0020.0002] # CANADIAN SYLLABICS NUNAVIK HOO +1579 ; [.3571.0020.0002] # CANADIAN SYLLABICS NUNAVIK HA +157A ; [.3572.0020.0002] # CANADIAN SYLLABICS NUNAVIK HAA +157B ; [.3573.0020.0002] # CANADIAN SYLLABICS NUNAVIK H +157D ; [.3574.0020.0002] # CANADIAN SYLLABICS HK +166F ; [.3575.0020.0002] # CANADIAN SYLLABICS QAI +157E ; [.3576.0020.0002] # CANADIAN SYLLABICS QAAI +157F ; [.3577.0020.0002] # CANADIAN SYLLABICS QI +1580 ; [.3578.0020.0002] # CANADIAN SYLLABICS QII +1581 ; [.3579.0020.0002] # CANADIAN SYLLABICS QO +1582 ; [.357A.0020.0002] # CANADIAN SYLLABICS QOO +1583 ; [.357B.0020.0002] # CANADIAN SYLLABICS QA +1584 ; [.357C.0020.0002] # CANADIAN SYLLABICS QAA +1585 ; [.357D.0020.0002] # CANADIAN SYLLABICS Q +1586 ; [.357E.0020.0002] # CANADIAN SYLLABICS TLHE +1587 ; [.357F.0020.0002] # CANADIAN SYLLABICS TLHI +1588 ; [.3580.0020.0002] # CANADIAN SYLLABICS TLHO +1589 ; [.3581.0020.0002] # CANADIAN SYLLABICS TLHA +158A ; [.3582.0020.0002] # CANADIAN SYLLABICS WEST-CREE RE +158B ; [.3583.0020.0002] # CANADIAN SYLLABICS WEST-CREE RI +158C ; [.3584.0020.0002] # CANADIAN SYLLABICS WEST-CREE RO +158D ; [.3585.0020.0002] # CANADIAN SYLLABICS WEST-CREE RA +1670 ; [.3586.0020.0002] # CANADIAN SYLLABICS NGAI +158E ; [.3587.0020.0002] # CANADIAN SYLLABICS NGAAI +158F ; [.3588.0020.0002] # CANADIAN SYLLABICS NGI +1590 ; [.3589.0020.0002] # CANADIAN SYLLABICS NGII +1591 ; [.358A.0020.0002] # CANADIAN SYLLABICS NGO +1592 ; [.358B.0020.0002] # CANADIAN SYLLABICS NGOO +1593 ; [.358C.0020.0002] # CANADIAN SYLLABICS NGA +1594 ; [.358D.0020.0002] # CANADIAN SYLLABICS NGAA +1595 ; [.358E.0020.0002] # CANADIAN SYLLABICS NG +1671 ; [.358F.0020.0002] # CANADIAN SYLLABICS NNGI +1672 ; [.3590.0020.0002] # CANADIAN SYLLABICS NNGII +1673 ; [.3591.0020.0002] # CANADIAN SYLLABICS NNGO +1674 ; [.3592.0020.0002] # CANADIAN SYLLABICS NNGOO +1675 ; [.3593.0020.0002] # CANADIAN SYLLABICS NNGA +1676 ; [.3594.0020.0002] # CANADIAN SYLLABICS NNGAA +1596 ; [.3595.0020.0002] # CANADIAN SYLLABICS NNG +1597 ; [.3596.0020.0002] # CANADIAN SYLLABICS SAYISI SHE +1598 ; [.3597.0020.0002] # CANADIAN SYLLABICS SAYISI SHI +1599 ; [.3598.0020.0002] # CANADIAN SYLLABICS SAYISI SHO +159A ; [.3599.0020.0002] # CANADIAN SYLLABICS SAYISI SHA +159B ; [.359A.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THE +159C ; [.359B.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THI +159D ; [.359C.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THO +159E ; [.359D.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THA +159F ; [.359E.0020.0002] # CANADIAN SYLLABICS WOODS-CREE TH +15A0 ; [.359F.0020.0002] # CANADIAN SYLLABICS LHI +15A1 ; [.35A0.0020.0002] # CANADIAN SYLLABICS LHII +15A2 ; [.35A1.0020.0002] # CANADIAN SYLLABICS LHO +15A3 ; [.35A2.0020.0002] # CANADIAN SYLLABICS LHOO +15A4 ; [.35A3.0020.0002] # CANADIAN SYLLABICS LHA +15A5 ; [.35A4.0020.0002] # CANADIAN SYLLABICS LHAA +15A6 ; [.35A5.0020.0002] # CANADIAN SYLLABICS LH +157C ; [.35A6.0020.0002] # CANADIAN SYLLABICS NUNAVUT H +15A7 ; [.35A7.0020.0002] # CANADIAN SYLLABICS TH-CREE THE +15A8 ; [.35A8.0020.0002] # CANADIAN SYLLABICS TH-CREE THI +15A9 ; [.35A9.0020.0002] # CANADIAN SYLLABICS TH-CREE THII +15AA ; [.35AA.0020.0002] # CANADIAN SYLLABICS TH-CREE THO +15AB ; [.35AB.0020.0002] # CANADIAN SYLLABICS TH-CREE THOO +15AC ; [.35AC.0020.0002] # CANADIAN SYLLABICS TH-CREE THA +15AD ; [.35AD.0020.0002] # CANADIAN SYLLABICS TH-CREE THAA +15AE ; [.35AE.0020.0002] # CANADIAN SYLLABICS TH-CREE TH +15AF ; [.35AF.0020.0002] # CANADIAN SYLLABICS AIVILIK B +15B0 ; [.35B0.0020.0002] # CANADIAN SYLLABICS BLACKFOOT E +15B1 ; [.35B1.0020.0002] # CANADIAN SYLLABICS BLACKFOOT I +15B2 ; [.35B2.0020.0002] # CANADIAN SYLLABICS BLACKFOOT O +15B3 ; [.35B3.0020.0002] # CANADIAN SYLLABICS BLACKFOOT A +15B4 ; [.35B4.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WE +15B5 ; [.35B5.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WI +15B6 ; [.35B6.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WO +15B7 ; [.35B7.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WA +15B8 ; [.35B8.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NE +15B9 ; [.35B9.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NI +15BA ; [.35BA.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NO +15BB ; [.35BB.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NA +15BC ; [.35BC.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KE +15BD ; [.35BD.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KI +15BE ; [.35BE.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KO +15BF ; [.35BF.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KA +15C0 ; [.35C0.0020.0002] # CANADIAN SYLLABICS SAYISI HE +15C1 ; [.35C1.0020.0002] # CANADIAN SYLLABICS SAYISI HI +15C2 ; [.35C2.0020.0002] # CANADIAN SYLLABICS SAYISI HO +15C3 ; [.35C3.0020.0002] # CANADIAN SYLLABICS SAYISI HA +15C4 ; [.35C4.0020.0002] # CANADIAN SYLLABICS CARRIER GHU +15C5 ; [.35C5.0020.0002] # CANADIAN SYLLABICS CARRIER GHO +15C6 ; [.35C6.0020.0002] # CANADIAN SYLLABICS CARRIER GHE +15C7 ; [.35C7.0020.0002] # CANADIAN SYLLABICS CARRIER GHEE +15C8 ; [.35C8.0020.0002] # CANADIAN SYLLABICS CARRIER GHI +15C9 ; [.35C9.0020.0002] # CANADIAN SYLLABICS CARRIER GHA +15CA ; [.35CA.0020.0002] # CANADIAN SYLLABICS CARRIER RU +15CB ; [.35CB.0020.0002] # CANADIAN SYLLABICS CARRIER RO +15CC ; [.35CC.0020.0002] # CANADIAN SYLLABICS CARRIER RE +15CD ; [.35CD.0020.0002] # CANADIAN SYLLABICS CARRIER REE +15CE ; [.35CE.0020.0002] # CANADIAN SYLLABICS CARRIER RI +15CF ; [.35CF.0020.0002] # CANADIAN SYLLABICS CARRIER RA +15D0 ; [.35D0.0020.0002] # CANADIAN SYLLABICS CARRIER WU +15D1 ; [.35D1.0020.0002] # CANADIAN SYLLABICS CARRIER WO +15D2 ; [.35D2.0020.0002] # CANADIAN SYLLABICS CARRIER WE +15D3 ; [.35D3.0020.0002] # CANADIAN SYLLABICS CARRIER WEE +15D4 ; [.35D4.0020.0002] # CANADIAN SYLLABICS CARRIER WI +15D5 ; [.35D5.0020.0002] # CANADIAN SYLLABICS CARRIER WA +15D6 ; [.35D6.0020.0002] # CANADIAN SYLLABICS CARRIER HWU +15D7 ; [.35D7.0020.0002] # CANADIAN SYLLABICS CARRIER HWO +15D8 ; [.35D8.0020.0002] # CANADIAN SYLLABICS CARRIER HWE +15D9 ; [.35D9.0020.0002] # CANADIAN SYLLABICS CARRIER HWEE +15DA ; [.35DA.0020.0002] # CANADIAN SYLLABICS CARRIER HWI +15DB ; [.35DB.0020.0002] # CANADIAN SYLLABICS CARRIER HWA +15DC ; [.35DC.0020.0002] # CANADIAN SYLLABICS CARRIER THU +15DD ; [.35DD.0020.0002] # CANADIAN SYLLABICS CARRIER THO +15DE ; [.35DE.0020.0002] # CANADIAN SYLLABICS CARRIER THE +15DF ; [.35DF.0020.0002] # CANADIAN SYLLABICS CARRIER THEE +15E0 ; [.35E0.0020.0002] # CANADIAN SYLLABICS CARRIER THI +15E1 ; [.35E1.0020.0002] # CANADIAN SYLLABICS CARRIER THA +15E2 ; [.35E2.0020.0002] # CANADIAN SYLLABICS CARRIER TTU +15E3 ; [.35E3.0020.0002] # CANADIAN SYLLABICS CARRIER TTO +15E4 ; [.35E4.0020.0002] # CANADIAN SYLLABICS CARRIER TTE +15E5 ; [.35E5.0020.0002] # CANADIAN SYLLABICS CARRIER TTEE +15E6 ; [.35E6.0020.0002] # CANADIAN SYLLABICS CARRIER TTI +15E7 ; [.35E7.0020.0002] # CANADIAN SYLLABICS CARRIER TTA +15E8 ; [.35E8.0020.0002] # CANADIAN SYLLABICS CARRIER PU +15E9 ; [.35E9.0020.0002] # CANADIAN SYLLABICS CARRIER PO +15EA ; [.35EA.0020.0002] # CANADIAN SYLLABICS CARRIER PE +15EB ; [.35EB.0020.0002] # CANADIAN SYLLABICS CARRIER PEE +15EC ; [.35EC.0020.0002] # CANADIAN SYLLABICS CARRIER PI +15ED ; [.35ED.0020.0002] # CANADIAN SYLLABICS CARRIER PA +15EE ; [.35EE.0020.0002] # CANADIAN SYLLABICS CARRIER P +15EF ; [.35EF.0020.0002] # CANADIAN SYLLABICS CARRIER GU +15F0 ; [.35F0.0020.0002] # CANADIAN SYLLABICS CARRIER GO +15F1 ; [.35F1.0020.0002] # CANADIAN SYLLABICS CARRIER GE +15F2 ; [.35F2.0020.0002] # CANADIAN SYLLABICS CARRIER GEE +15F3 ; [.35F3.0020.0002] # CANADIAN SYLLABICS CARRIER GI +15F4 ; [.35F4.0020.0002] # CANADIAN SYLLABICS CARRIER GA +15F5 ; [.35F5.0020.0002] # CANADIAN SYLLABICS CARRIER KHU +15F6 ; [.35F6.0020.0002] # CANADIAN SYLLABICS CARRIER KHO +15F7 ; [.35F7.0020.0002] # CANADIAN SYLLABICS CARRIER KHE +15F8 ; [.35F8.0020.0002] # CANADIAN SYLLABICS CARRIER KHEE +15F9 ; [.35F9.0020.0002] # CANADIAN SYLLABICS CARRIER KHI +15FA ; [.35FA.0020.0002] # CANADIAN SYLLABICS CARRIER KHA +15FB ; [.35FB.0020.0002] # CANADIAN SYLLABICS CARRIER KKU +15FC ; [.35FC.0020.0002] # CANADIAN SYLLABICS CARRIER KKO +15FD ; [.35FD.0020.0002] # CANADIAN SYLLABICS CARRIER KKE +15FE ; [.35FE.0020.0002] # CANADIAN SYLLABICS CARRIER KKEE +15FF ; [.35FF.0020.0002] # CANADIAN SYLLABICS CARRIER KKI +1600 ; [.3600.0020.0002] # CANADIAN SYLLABICS CARRIER KKA +1601 ; [.3601.0020.0002] # CANADIAN SYLLABICS CARRIER KK +1602 ; [.3602.0020.0002] # CANADIAN SYLLABICS CARRIER NU +1603 ; [.3603.0020.0002] # CANADIAN SYLLABICS CARRIER NO +1604 ; [.3604.0020.0002] # CANADIAN SYLLABICS CARRIER NE +1605 ; [.3605.0020.0002] # CANADIAN SYLLABICS CARRIER NEE +1606 ; [.3606.0020.0002] # CANADIAN SYLLABICS CARRIER NI +1607 ; [.3607.0020.0002] # CANADIAN SYLLABICS CARRIER NA +1608 ; [.3608.0020.0002] # CANADIAN SYLLABICS CARRIER MU +1609 ; [.3609.0020.0002] # CANADIAN SYLLABICS CARRIER MO +160A ; [.360A.0020.0002] # CANADIAN SYLLABICS CARRIER ME +160B ; [.360B.0020.0002] # CANADIAN SYLLABICS CARRIER MEE +160C ; [.360C.0020.0002] # CANADIAN SYLLABICS CARRIER MI +160D ; [.360D.0020.0002] # CANADIAN SYLLABICS CARRIER MA +160E ; [.360E.0020.0002] # CANADIAN SYLLABICS CARRIER YU +160F ; [.360F.0020.0002] # CANADIAN SYLLABICS CARRIER YO +1610 ; [.3610.0020.0002] # CANADIAN SYLLABICS CARRIER YE +1611 ; [.3611.0020.0002] # CANADIAN SYLLABICS CARRIER YEE +1612 ; [.3612.0020.0002] # CANADIAN SYLLABICS CARRIER YI +1613 ; [.3613.0020.0002] # CANADIAN SYLLABICS CARRIER YA +1614 ; [.3614.0020.0002] # CANADIAN SYLLABICS CARRIER JU +1615 ; [.3615.0020.0002] # CANADIAN SYLLABICS SAYISI JU +1616 ; [.3616.0020.0002] # CANADIAN SYLLABICS CARRIER JO +1617 ; [.3617.0020.0002] # CANADIAN SYLLABICS CARRIER JE +1618 ; [.3618.0020.0002] # CANADIAN SYLLABICS CARRIER JEE +1619 ; [.3619.0020.0002] # CANADIAN SYLLABICS CARRIER JI +161A ; [.361A.0020.0002] # CANADIAN SYLLABICS SAYISI JI +161B ; [.361B.0020.0002] # CANADIAN SYLLABICS CARRIER JA +161C ; [.361C.0020.0002] # CANADIAN SYLLABICS CARRIER JJU +161D ; [.361D.0020.0002] # CANADIAN SYLLABICS CARRIER JJO +161E ; [.361E.0020.0002] # CANADIAN SYLLABICS CARRIER JJE +161F ; [.361F.0020.0002] # CANADIAN SYLLABICS CARRIER JJEE +1620 ; [.3620.0020.0002] # CANADIAN SYLLABICS CARRIER JJI +1621 ; [.3621.0020.0002] # CANADIAN SYLLABICS CARRIER JJA +1622 ; [.3622.0020.0002] # CANADIAN SYLLABICS CARRIER LU +1623 ; [.3623.0020.0002] # CANADIAN SYLLABICS CARRIER LO +1624 ; [.3624.0020.0002] # CANADIAN SYLLABICS CARRIER LE +1625 ; [.3625.0020.0002] # CANADIAN SYLLABICS CARRIER LEE +1626 ; [.3626.0020.0002] # CANADIAN SYLLABICS CARRIER LI +1627 ; [.3627.0020.0002] # CANADIAN SYLLABICS CARRIER LA +1628 ; [.3628.0020.0002] # CANADIAN SYLLABICS CARRIER DLU +1629 ; [.3629.0020.0002] # CANADIAN SYLLABICS CARRIER DLO +162A ; [.362A.0020.0002] # CANADIAN SYLLABICS CARRIER DLE +162B ; [.362B.0020.0002] # CANADIAN SYLLABICS CARRIER DLEE +162C ; [.362C.0020.0002] # CANADIAN SYLLABICS CARRIER DLI +162D ; [.362D.0020.0002] # CANADIAN SYLLABICS CARRIER DLA +162E ; [.362E.0020.0002] # CANADIAN SYLLABICS CARRIER LHU +162F ; [.362F.0020.0002] # CANADIAN SYLLABICS CARRIER LHO +1630 ; [.3630.0020.0002] # CANADIAN SYLLABICS CARRIER LHE +1631 ; [.3631.0020.0002] # CANADIAN SYLLABICS CARRIER LHEE +1632 ; [.3632.0020.0002] # CANADIAN SYLLABICS CARRIER LHI +1633 ; [.3633.0020.0002] # CANADIAN SYLLABICS CARRIER LHA +1634 ; [.3634.0020.0002] # CANADIAN SYLLABICS CARRIER TLHU +1635 ; [.3635.0020.0002] # CANADIAN SYLLABICS CARRIER TLHO +1636 ; [.3636.0020.0002] # CANADIAN SYLLABICS CARRIER TLHE +1637 ; [.3637.0020.0002] # CANADIAN SYLLABICS CARRIER TLHEE +1638 ; [.3638.0020.0002] # CANADIAN SYLLABICS CARRIER TLHI +1639 ; [.3639.0020.0002] # CANADIAN SYLLABICS CARRIER TLHA +163A ; [.363A.0020.0002] # CANADIAN SYLLABICS CARRIER TLU +163B ; [.363B.0020.0002] # CANADIAN SYLLABICS CARRIER TLO +163C ; [.363C.0020.0002] # CANADIAN SYLLABICS CARRIER TLE +163D ; [.363D.0020.0002] # CANADIAN SYLLABICS CARRIER TLEE +163E ; [.363E.0020.0002] # CANADIAN SYLLABICS CARRIER TLI +163F ; [.363F.0020.0002] # CANADIAN SYLLABICS CARRIER TLA +1640 ; [.3640.0020.0002] # CANADIAN SYLLABICS CARRIER ZU +1641 ; [.3641.0020.0002] # CANADIAN SYLLABICS CARRIER ZO +1642 ; [.3642.0020.0002] # CANADIAN SYLLABICS CARRIER ZE +1643 ; [.3643.0020.0002] # CANADIAN SYLLABICS CARRIER ZEE +1644 ; [.3644.0020.0002] # CANADIAN SYLLABICS CARRIER ZI +1645 ; [.3645.0020.0002] # CANADIAN SYLLABICS CARRIER ZA +1646 ; [.3646.0020.0002] # CANADIAN SYLLABICS CARRIER Z +1647 ; [.3647.0020.0002] # CANADIAN SYLLABICS CARRIER INITIAL Z +1648 ; [.3648.0020.0002] # CANADIAN SYLLABICS CARRIER DZU +1649 ; [.3649.0020.0002] # CANADIAN SYLLABICS CARRIER DZO +164A ; [.364A.0020.0002] # CANADIAN SYLLABICS CARRIER DZE +164B ; [.364B.0020.0002] # CANADIAN SYLLABICS CARRIER DZEE +164C ; [.364C.0020.0002] # CANADIAN SYLLABICS CARRIER DZI +164D ; [.364D.0020.0002] # CANADIAN SYLLABICS CARRIER DZA +164E ; [.364E.0020.0002] # CANADIAN SYLLABICS CARRIER SU +164F ; [.364F.0020.0002] # CANADIAN SYLLABICS CARRIER SO +1650 ; [.3650.0020.0002] # CANADIAN SYLLABICS CARRIER SE +1651 ; [.3651.0020.0002] # CANADIAN SYLLABICS CARRIER SEE +1652 ; [.3652.0020.0002] # CANADIAN SYLLABICS CARRIER SI +1653 ; [.3653.0020.0002] # CANADIAN SYLLABICS CARRIER SA +1654 ; [.3654.0020.0002] # CANADIAN SYLLABICS CARRIER SHU +1655 ; [.3655.0020.0002] # CANADIAN SYLLABICS CARRIER SHO +1656 ; [.3656.0020.0002] # CANADIAN SYLLABICS CARRIER SHE +1657 ; [.3657.0020.0002] # CANADIAN SYLLABICS CARRIER SHEE +1658 ; [.3658.0020.0002] # CANADIAN SYLLABICS CARRIER SHI +1659 ; [.3659.0020.0002] # CANADIAN SYLLABICS CARRIER SHA +165A ; [.365A.0020.0002] # CANADIAN SYLLABICS CARRIER SH +165B ; [.365B.0020.0002] # CANADIAN SYLLABICS CARRIER TSU +165C ; [.365C.0020.0002] # CANADIAN SYLLABICS CARRIER TSO +165D ; [.365D.0020.0002] # CANADIAN SYLLABICS CARRIER TSE +165E ; [.365E.0020.0002] # CANADIAN SYLLABICS CARRIER TSEE +165F ; [.365F.0020.0002] # CANADIAN SYLLABICS CARRIER TSI +1660 ; [.3660.0020.0002] # CANADIAN SYLLABICS CARRIER TSA +1661 ; [.3661.0020.0002] # CANADIAN SYLLABICS CARRIER CHU +1662 ; [.3662.0020.0002] # CANADIAN SYLLABICS CARRIER CHO +1663 ; [.3663.0020.0002] # CANADIAN SYLLABICS CARRIER CHE +1664 ; [.3664.0020.0002] # CANADIAN SYLLABICS CARRIER CHEE +1665 ; [.3665.0020.0002] # CANADIAN SYLLABICS CARRIER CHI +1666 ; [.3666.0020.0002] # CANADIAN SYLLABICS CARRIER CHA +1667 ; [.3667.0020.0002] # CANADIAN SYLLABICS CARRIER TTSU +1668 ; [.3668.0020.0002] # CANADIAN SYLLABICS CARRIER TTSO +1669 ; [.3669.0020.0002] # CANADIAN SYLLABICS CARRIER TTSE +166A ; [.366A.0020.0002] # CANADIAN SYLLABICS CARRIER TTSEE +166B ; [.366B.0020.0002] # CANADIAN SYLLABICS CARRIER TTSI +166C ; [.366C.0020.0002] # CANADIAN SYLLABICS CARRIER TTSA +1677 ; [.366D.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWEE +1678 ; [.366E.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWI +1679 ; [.366F.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWII +167A ; [.3670.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWO +167B ; [.3671.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWOO +167C ; [.3672.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWA +167D ; [.3673.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWAA +167E ; [.3674.0020.0002] # CANADIAN SYLLABICS WOODS-CREE FINAL TH +167F ; [.3675.0020.0002] # CANADIAN SYLLABICS BLACKFOOT W +18B0 ; [.3676.0020.0002] # CANADIAN SYLLABICS OY +18B1 ; [.3677.0020.0002] # CANADIAN SYLLABICS AY +18B2 ; [.3678.0020.0002] # CANADIAN SYLLABICS AAY +18B3 ; [.3679.0020.0002] # CANADIAN SYLLABICS WAY +18B4 ; [.367A.0020.0002] # CANADIAN SYLLABICS POY +18B5 ; [.367B.0020.0002] # CANADIAN SYLLABICS PAY +18B6 ; [.367C.0020.0002] # CANADIAN SYLLABICS PWOY +18B7 ; [.367D.0020.0002] # CANADIAN SYLLABICS TAY +18B8 ; [.367E.0020.0002] # CANADIAN SYLLABICS KAY +18B9 ; [.367F.0020.0002] # CANADIAN SYLLABICS KWAY +18BA ; [.3680.0020.0002] # CANADIAN SYLLABICS MAY +18BB ; [.3681.0020.0002] # CANADIAN SYLLABICS NOY +18BC ; [.3682.0020.0002] # CANADIAN SYLLABICS NAY +18BD ; [.3683.0020.0002] # CANADIAN SYLLABICS LAY +18BE ; [.3684.0020.0002] # CANADIAN SYLLABICS SOY +18BF ; [.3685.0020.0002] # CANADIAN SYLLABICS SAY +18C0 ; [.3686.0020.0002] # CANADIAN SYLLABICS SHOY +18C1 ; [.3687.0020.0002] # CANADIAN SYLLABICS SHAY +18C2 ; [.3688.0020.0002] # CANADIAN SYLLABICS SHWOY +18C3 ; [.3689.0020.0002] # CANADIAN SYLLABICS YOY +18C4 ; [.368A.0020.0002] # CANADIAN SYLLABICS YAY +18C5 ; [.368B.0020.0002] # CANADIAN SYLLABICS RAY +18C6 ; [.368C.0020.0002] # CANADIAN SYLLABICS NWI +18C7 ; [.368D.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWI +18C8 ; [.368E.0020.0002] # CANADIAN SYLLABICS NWII +18C9 ; [.368F.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWII +18CA ; [.3690.0020.0002] # CANADIAN SYLLABICS NWO +18CB ; [.3691.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWO +18CC ; [.3692.0020.0002] # CANADIAN SYLLABICS NWOO +18CD ; [.3693.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWOO +18CE ; [.3694.0020.0002] # CANADIAN SYLLABICS RWEE +18CF ; [.3695.0020.0002] # CANADIAN SYLLABICS RWI +18D0 ; [.3696.0020.0002] # CANADIAN SYLLABICS RWII +18D1 ; [.3697.0020.0002] # CANADIAN SYLLABICS RWO +18D2 ; [.3698.0020.0002] # CANADIAN SYLLABICS RWOO +18D3 ; [.3699.0020.0002] # CANADIAN SYLLABICS RWA +18D4 ; [.369A.0020.0002] # CANADIAN SYLLABICS OJIBWAY P +18D5 ; [.369B.0020.0002] # CANADIAN SYLLABICS OJIBWAY T +18D6 ; [.369C.0020.0002] # CANADIAN SYLLABICS OJIBWAY K +18D7 ; [.369D.0020.0002] # CANADIAN SYLLABICS OJIBWAY C +18D8 ; [.369E.0020.0002] # CANADIAN SYLLABICS OJIBWAY M +18D9 ; [.369F.0020.0002] # CANADIAN SYLLABICS OJIBWAY N +18DA ; [.36A0.0020.0002] # CANADIAN SYLLABICS OJIBWAY S +18DB ; [.36A1.0020.0002] # CANADIAN SYLLABICS OJIBWAY SH +18DC ; [.36A2.0020.0002] # CANADIAN SYLLABICS EASTERN W +18DD ; [.36A3.0020.0002] # CANADIAN SYLLABICS WESTERN W +18DE ; [.36A4.0020.0002] # CANADIAN SYLLABICS FINAL SMALL RING +18DF ; [.36A5.0020.0002] # CANADIAN SYLLABICS FINAL RAISED DOT +18E0 ; [.36A6.0020.0002] # CANADIAN SYLLABICS R-CREE RWE +18E1 ; [.36A7.0020.0002] # CANADIAN SYLLABICS WEST-CREE LOO +18E2 ; [.36A8.0020.0002] # CANADIAN SYLLABICS WEST-CREE LAA +18E3 ; [.36A9.0020.0002] # CANADIAN SYLLABICS THWE +18E4 ; [.36AA.0020.0002] # CANADIAN SYLLABICS THWA +18E5 ; [.36AB.0020.0002] # CANADIAN SYLLABICS TTHWE +18E6 ; [.36AC.0020.0002] # CANADIAN SYLLABICS TTHOO +18E7 ; [.36AD.0020.0002] # CANADIAN SYLLABICS TTHAA +18E8 ; [.36AE.0020.0002] # CANADIAN SYLLABICS TLHWE +18E9 ; [.36AF.0020.0002] # CANADIAN SYLLABICS TLHOO +18EA ; [.36B0.0020.0002] # CANADIAN SYLLABICS SAYISI SHWE +18EB ; [.36B1.0020.0002] # CANADIAN SYLLABICS SAYISI SHOO +18EC ; [.36B2.0020.0002] # CANADIAN SYLLABICS SAYISI HOO +18ED ; [.36B3.0020.0002] # CANADIAN SYLLABICS CARRIER GWU +18EE ; [.36B4.0020.0002] # CANADIAN SYLLABICS CARRIER DENE GEE +18EF ; [.36B5.0020.0002] # CANADIAN SYLLABICS CARRIER GAA +18F0 ; [.36B6.0020.0002] # CANADIAN SYLLABICS CARRIER GWA +18F1 ; [.36B7.0020.0002] # CANADIAN SYLLABICS SAYISI JUU +18F2 ; [.36B8.0020.0002] # CANADIAN SYLLABICS CARRIER JWA +18F3 ; [.36B9.0020.0002] # CANADIAN SYLLABICS BEAVER DENE L +18F4 ; [.36BA.0020.0002] # CANADIAN SYLLABICS BEAVER DENE R +18F5 ; [.36BB.0020.0002] # CANADIAN SYLLABICS CARRIER DENTAL S +1681 ; [.36BC.0020.0002] # OGHAM LETTER BEITH +1682 ; [.36BD.0020.0002] # OGHAM LETTER LUIS +1683 ; [.36BE.0020.0002] # OGHAM LETTER FEARN +1684 ; [.36BF.0020.0002] # OGHAM LETTER SAIL +1685 ; [.36C0.0020.0002] # OGHAM LETTER NION +1686 ; [.36C1.0020.0002] # OGHAM LETTER UATH +1687 ; [.36C2.0020.0002] # OGHAM LETTER DAIR +1688 ; [.36C3.0020.0002] # OGHAM LETTER TINNE +1689 ; [.36C4.0020.0002] # OGHAM LETTER COLL +168A ; [.36C5.0020.0002] # OGHAM LETTER CEIRT +168B ; [.36C6.0020.0002] # OGHAM LETTER MUIN +168C ; [.36C7.0020.0002] # OGHAM LETTER GORT +168D ; [.36C8.0020.0002] # OGHAM LETTER NGEADAL +168E ; [.36C9.0020.0002] # OGHAM LETTER STRAIF +168F ; [.36CA.0020.0002] # OGHAM LETTER RUIS +1690 ; [.36CB.0020.0002] # OGHAM LETTER AILM +1691 ; [.36CC.0020.0002] # OGHAM LETTER ONN +1692 ; [.36CD.0020.0002] # OGHAM LETTER UR +1693 ; [.36CE.0020.0002] # OGHAM LETTER EADHADH +1694 ; [.36CF.0020.0002] # OGHAM LETTER IODHADH +1695 ; [.36D0.0020.0002] # OGHAM LETTER EABHADH +1696 ; [.36D1.0020.0002] # OGHAM LETTER OR +1697 ; [.36D2.0020.0002] # OGHAM LETTER UILLEANN +1698 ; [.36D3.0020.0002] # OGHAM LETTER IFIN +1699 ; [.36D4.0020.0002] # OGHAM LETTER EAMHANCHOLL +169A ; [.36D5.0020.0002] # OGHAM LETTER PEITH +16A0 ; [.36D6.0020.0002] # RUNIC LETTER FEHU FEOH FE F +16A1 ; [.36D6.0020.0004][.0000.0110.0004] # RUNIC LETTER V +16A2 ; [.36D7.0020.0002] # RUNIC LETTER URUZ UR U +16A4 ; [.36D7.0020.0004][.0000.0110.0004] # RUNIC LETTER Y +16A5 ; [.36D7.0020.0004][.0000.0111.0004] # RUNIC LETTER W +16A6 ; [.36D8.0020.0002] # RUNIC LETTER THURISAZ THURS THORN +16A7 ; [.36D8.0020.0004][.0000.0110.0004] # RUNIC LETTER ETH +16F0 ; [.36D8.0020.0004][.36D8.0020.0004] # RUNIC BELGTHOR SYMBOL +16A8 ; [.36D9.0020.0002] # RUNIC LETTER ANSUZ A +16A9 ; [.36D9.0020.0004][.0000.0110.0004] # RUNIC LETTER OS O +16AC ; [.36D9.0020.0004][.0000.0111.0004] # RUNIC LETTER LONG-BRANCH-OSS O +16AD ; [.36D9.0020.0004][.0000.0112.0004] # RUNIC LETTER SHORT-TWIG-OSS O +16AE ; [.36D9.0020.0004][.0000.0113.0004] # RUNIC LETTER O +16F4 ; [.36DA.0020.0002] # RUNIC LETTER FRANKS CASKET OS +16AF ; [.36DB.0020.0002] # RUNIC LETTER OE +16B0 ; [.36DC.0020.0002] # RUNIC LETTER ON +16B1 ; [.36DD.0020.0002] # RUNIC LETTER RAIDO RAD REID R +16B2 ; [.36DE.0020.0002] # RUNIC LETTER KAUNA +16B3 ; [.36DE.0020.0004][.0000.0110.0004] # RUNIC LETTER CEN +16B4 ; [.36DE.0020.0004][.0000.0111.0004] # RUNIC LETTER KAUN K +16B5 ; [.36DE.0020.0004][.0000.0112.0004] # RUNIC LETTER G +16B6 ; [.36DE.0020.0004][.0000.0113.0004] # RUNIC LETTER ENG +16F1 ; [.36DF.0020.0002] # RUNIC LETTER K +16B7 ; [.36E0.0020.0002] # RUNIC LETTER GEBO GYFU G +16B9 ; [.36E1.0020.0002] # RUNIC LETTER WUNJO WYNN W +16E9 ; [.36E1.0020.0004][.0000.0110.0004] # RUNIC LETTER Q +16BA ; [.36E2.0020.0002] # RUNIC LETTER HAGLAZ H +16BB ; [.36E2.0020.0004][.0000.0110.0004] # RUNIC LETTER HAEGL H +16BC ; [.36E2.0020.0004][.0000.0111.0004] # RUNIC LETTER LONG-BRANCH-HAGALL H +16BD ; [.36E2.0020.0004][.0000.0112.0004] # RUNIC LETTER SHORT-TWIG-HAGALL H +16BE ; [.36E3.0020.0002] # RUNIC LETTER NAUDIZ NYD NAUD N +16BF ; [.36E3.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-NAUD N +16C0 ; [.36E3.0020.0004][.0000.0111.0004] # RUNIC LETTER DOTTED-N +16C1 ; [.36E4.0020.0002] # RUNIC LETTER ISAZ IS ISS I +16C2 ; [.36E4.0020.0004][.0000.0110.0004] # RUNIC LETTER E +16F5 ; [.36E5.0020.0002] # RUNIC LETTER FRANKS CASKET IS +16C3 ; [.36E6.0020.0002] # RUNIC LETTER JERAN J +16C4 ; [.36E6.0020.0004][.0000.0110.0004] # RUNIC LETTER GER +16C5 ; [.36E7.0020.0002] # RUNIC LETTER LONG-BRANCH-AR AE +16C6 ; [.36E7.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-AR A +16EE ; [.36E7.0020.0004][.36F2.0020.0004] # RUNIC ARLAUG SYMBOL +16C7 ; [.36E8.0020.0002] # RUNIC LETTER IWAZ EOH +16C8 ; [.36E9.0020.0002] # RUNIC LETTER PERTHO PEORTH P +16D5 ; [.36E9.0020.0004][.0000.0110.0004] # RUNIC LETTER OPEN-P +16C9 ; [.36EA.0020.0002] # RUNIC LETTER ALGIZ EOLHX +16CA ; [.36EB.0020.0002] # RUNIC LETTER SOWILO S +16CB ; [.36EB.0020.0004][.0000.0110.0004] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S +16EA ; [.36EB.0020.0004][.0000.0111.0004] # RUNIC LETTER X +16CC ; [.36EB.0020.0004][.0000.0112.0004] # RUNIC LETTER SHORT-TWIG-SOL S +16CD ; [.36EB.0020.0004][.0000.0113.0004] # RUNIC LETTER C +16CE ; [.36EB.0020.0004][.0000.0114.0004] # RUNIC LETTER Z +16F2 ; [.36EC.0020.0002] # RUNIC LETTER SH +16CF ; [.36ED.0020.0002] # RUNIC LETTER TIWAZ TIR TYR T +16D0 ; [.36ED.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-TYR T +16D1 ; [.36ED.0020.0004][.0000.0111.0004] # RUNIC LETTER D +16D2 ; [.36EE.0020.0002] # RUNIC LETTER BERKANAN BEORC BJARKAN B +16D3 ; [.36EE.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-BJARKAN B +16D4 ; [.36EE.0020.0004][.0000.0111.0004] # RUNIC LETTER DOTTED-P +16D6 ; [.36EF.0020.0002] # RUNIC LETTER EHWAZ EH E +16F6 ; [.36F0.0020.0002] # RUNIC LETTER FRANKS CASKET EH +16D7 ; [.36F1.0020.0002] # RUNIC LETTER MANNAZ MAN M +16D8 ; [.36F1.0020.0004][.0000.0110.0004] # RUNIC LETTER LONG-BRANCH-MADR M +16D9 ; [.36F1.0020.0004][.0000.0111.0004] # RUNIC LETTER SHORT-TWIG-MADR M +16EF ; [.36F1.0020.0004][.0000.0110.0004][.36F1.0020.0004][.0000.0110.0004] # RUNIC TVIMADUR SYMBOL +16DA ; [.36F2.0020.0002] # RUNIC LETTER LAUKAZ LAGU LOGR L +16DB ; [.36F2.0020.0004][.0000.0110.0004] # RUNIC LETTER DOTTED-L +16DC ; [.36F3.0020.0002] # RUNIC LETTER INGWAZ +16DD ; [.36F3.0020.0004][.0000.0110.0004] # RUNIC LETTER ING +16DE ; [.36F4.0020.0002] # RUNIC LETTER DAGAZ DAEG D +16DF ; [.36F5.0020.0002] # RUNIC LETTER OTHALAN ETHEL O +16F3 ; [.36F6.0020.0002] # RUNIC LETTER OO +16AA ; [.36F7.0020.0002] # RUNIC LETTER AC A +16F7 ; [.36F8.0020.0002] # RUNIC LETTER FRANKS CASKET AC +16AB ; [.36F9.0020.0002] # RUNIC LETTER AESC +16F8 ; [.36FA.0020.0002] # RUNIC LETTER FRANKS CASKET AESC +16A3 ; [.36FB.0020.0002] # RUNIC LETTER YR +16E0 ; [.36FC.0020.0002] # RUNIC LETTER EAR +16E3 ; [.36FD.0020.0002] # RUNIC LETTER CALC +16B8 ; [.36FE.0020.0002] # RUNIC LETTER GAR +16E4 ; [.36FF.0020.0002] # RUNIC LETTER CEALC +16E1 ; [.3700.0020.0002] # RUNIC LETTER IOR +16E2 ; [.3701.0020.0002] # RUNIC LETTER CWEORTH +16E5 ; [.3702.0020.0002] # RUNIC LETTER STAN +16E6 ; [.3703.0020.0002] # RUNIC LETTER LONG-BRANCH-YR +16E7 ; [.3703.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-YR +16E8 ; [.3703.0020.0004][.0000.0111.0004] # RUNIC LETTER ICELANDIC-YR +10CC0 ; [.3704.0020.0002] # OLD HUNGARIAN SMALL LETTER A +10C80 ; [.3704.0020.0008] # OLD HUNGARIAN CAPITAL LETTER A +10CC1 ; [.3704.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER AA +10C81 ; [.3704.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER AA +10CC2 ; [.3705.0020.0002] # OLD HUNGARIAN SMALL LETTER EB +10C82 ; [.3705.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EB +10CC3 ; [.3706.0020.0002] # OLD HUNGARIAN SMALL LETTER AMB +10C83 ; [.3706.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AMB +10CC4 ; [.3707.0020.0002] # OLD HUNGARIAN SMALL LETTER EC +10C84 ; [.3707.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EC +10CC5 ; [.3708.0020.0002] # OLD HUNGARIAN SMALL LETTER ENC +10C85 ; [.3708.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENC +10CC6 ; [.3709.0020.0002] # OLD HUNGARIAN SMALL LETTER ECS +10C86 ; [.3709.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECS +10CC7 ; [.370A.0020.0002] # OLD HUNGARIAN SMALL LETTER ED +10C87 ; [.370A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ED +10CC8 ; [.370B.0020.0002] # OLD HUNGARIAN SMALL LETTER AND +10C88 ; [.370B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AND +10CC9 ; [.370C.0020.0002] # OLD HUNGARIAN SMALL LETTER E +10C89 ; [.370C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER E +10CCA ; [.370C.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER CLOSE E +10C8A ; [.370C.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER CLOSE E +10CCB ; [.370C.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER EE +10C8B ; [.370C.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER EE +10CCC ; [.370D.0020.0002] # OLD HUNGARIAN SMALL LETTER EF +10C8C ; [.370D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EF +10CCD ; [.370E.0020.0002] # OLD HUNGARIAN SMALL LETTER EG +10C8D ; [.370E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EG +10CCE ; [.370F.0020.0002] # OLD HUNGARIAN SMALL LETTER EGY +10C8E ; [.370F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EGY +10CCF ; [.3710.0020.0002] # OLD HUNGARIAN SMALL LETTER EH +10C8F ; [.3710.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EH +10CD0 ; [.3711.0020.0002] # OLD HUNGARIAN SMALL LETTER I +10C90 ; [.3711.0020.0008] # OLD HUNGARIAN CAPITAL LETTER I +10CD1 ; [.3711.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER II +10C91 ; [.3711.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER II +10CD2 ; [.3712.0020.0002] # OLD HUNGARIAN SMALL LETTER EJ +10C92 ; [.3712.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EJ +10CD3 ; [.3713.0020.0002] # OLD HUNGARIAN SMALL LETTER EK +10C93 ; [.3713.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EK +10CD4 ; [.3714.0020.0002] # OLD HUNGARIAN SMALL LETTER AK +10C94 ; [.3714.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AK +10CD5 ; [.3715.0020.0002] # OLD HUNGARIAN SMALL LETTER UNK +10C95 ; [.3715.0020.0008] # OLD HUNGARIAN CAPITAL LETTER UNK +10CD6 ; [.3716.0020.0002] # OLD HUNGARIAN SMALL LETTER EL +10C96 ; [.3716.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EL +10CD7 ; [.3717.0020.0002] # OLD HUNGARIAN SMALL LETTER ELY +10C97 ; [.3717.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ELY +10CD8 ; [.3718.0020.0002] # OLD HUNGARIAN SMALL LETTER EM +10C98 ; [.3718.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EM +10CD9 ; [.3719.0020.0002] # OLD HUNGARIAN SMALL LETTER EN +10C99 ; [.3719.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EN +10CDA ; [.371A.0020.0002] # OLD HUNGARIAN SMALL LETTER ENY +10C9A ; [.371A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENY +10CDB ; [.371B.0020.0002] # OLD HUNGARIAN SMALL LETTER O +10C9B ; [.371B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER O +10CDC ; [.371B.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER OO +10C9C ; [.371B.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER OO +10CDD ; [.371C.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE +10C9D ; [.371C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +10CDE ; [.371C.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA OE +10C9E ; [.371C.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +10CDF ; [.371C.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER OEE +10C9F ; [.371C.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER OEE +10CE0 ; [.371D.0020.0002] # OLD HUNGARIAN SMALL LETTER EP +10CA0 ; [.371D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EP +10CE1 ; [.371E.0020.0002] # OLD HUNGARIAN SMALL LETTER EMP +10CA1 ; [.371E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EMP +10CE2 ; [.371F.0020.0002] # OLD HUNGARIAN SMALL LETTER ER +10CA2 ; [.371F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ER +10CE3 ; [.371F.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER SHORT ER +10CA3 ; [.371F.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER SHORT ER +10CE4 ; [.3720.0020.0002] # OLD HUNGARIAN SMALL LETTER ES +10CA4 ; [.3720.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ES +10CE5 ; [.3721.0020.0002] # OLD HUNGARIAN SMALL LETTER ESZ +10CA5 ; [.3721.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ESZ +10CE6 ; [.3722.0020.0002] # OLD HUNGARIAN SMALL LETTER ET +10CA6 ; [.3722.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ET +10CE7 ; [.3723.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT +10CA7 ; [.3723.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT +10CE8 ; [.3724.0020.0002] # OLD HUNGARIAN SMALL LETTER ETY +10CA8 ; [.3724.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ETY +10CE9 ; [.3725.0020.0002] # OLD HUNGARIAN SMALL LETTER ECH +10CA9 ; [.3725.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECH +10CEA ; [.3726.0020.0002] # OLD HUNGARIAN SMALL LETTER U +10CAA ; [.3726.0020.0008] # OLD HUNGARIAN CAPITAL LETTER U +10CEB ; [.3726.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER UU +10CAB ; [.3726.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER UU +10CEC ; [.3727.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE +10CAC ; [.3727.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +10CED ; [.3727.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA UE +10CAD ; [.3727.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +10CEE ; [.3728.0020.0002] # OLD HUNGARIAN SMALL LETTER EV +10CAE ; [.3728.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EV +10CEF ; [.3729.0020.0002] # OLD HUNGARIAN SMALL LETTER EZ +10CAF ; [.3729.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZ +10CF0 ; [.372A.0020.0002] # OLD HUNGARIAN SMALL LETTER EZS +10CB0 ; [.372A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZS +10CF1 ; [.372B.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN +10CB1 ; [.372B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +10CF2 ; [.372C.0020.0002] # OLD HUNGARIAN SMALL LETTER US +10CB2 ; [.372C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER US +10C00 ; [.372D.0020.0002] # OLD TURKIC LETTER ORKHON A +10C01 ; [.372D.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI A +10C02 ; [.372E.0020.0002] # OLD TURKIC LETTER YENISEI AE +10C03 ; [.372F.0020.0002] # OLD TURKIC LETTER ORKHON I +10C04 ; [.372F.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI I +10C05 ; [.3730.0020.0002] # OLD TURKIC LETTER YENISEI E +10C06 ; [.3731.0020.0002] # OLD TURKIC LETTER ORKHON O +10C07 ; [.3732.0020.0002] # OLD TURKIC LETTER ORKHON OE +10C08 ; [.3732.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI OE +10C09 ; [.3733.0020.0002] # OLD TURKIC LETTER ORKHON AB +10C0A ; [.3733.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AB +10C0B ; [.3734.0020.0002] # OLD TURKIC LETTER ORKHON AEB +10C0C ; [.3734.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEB +10C0D ; [.3735.0020.0002] # OLD TURKIC LETTER ORKHON AG +10C0E ; [.3735.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AG +10C0F ; [.3736.0020.0002] # OLD TURKIC LETTER ORKHON AEG +10C10 ; [.3736.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEG +10C11 ; [.3737.0020.0002] # OLD TURKIC LETTER ORKHON AD +10C12 ; [.3737.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AD +10C13 ; [.3738.0020.0002] # OLD TURKIC LETTER ORKHON AED +10C14 ; [.3739.0020.0002] # OLD TURKIC LETTER ORKHON EZ +10C15 ; [.3739.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI EZ +10C16 ; [.373A.0020.0002] # OLD TURKIC LETTER ORKHON AY +10C17 ; [.373A.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AY +10C18 ; [.373B.0020.0002] # OLD TURKIC LETTER ORKHON AEY +10C19 ; [.373B.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEY +10C1A ; [.373C.0020.0002] # OLD TURKIC LETTER ORKHON AEK +10C1B ; [.373C.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEK +10C1C ; [.373D.0020.0002] # OLD TURKIC LETTER ORKHON OEK +10C1D ; [.373D.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI OEK +10C1E ; [.373E.0020.0002] # OLD TURKIC LETTER ORKHON AL +10C1F ; [.373E.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AL +10C20 ; [.373F.0020.0002] # OLD TURKIC LETTER ORKHON AEL +10C21 ; [.3740.0020.0002] # OLD TURKIC LETTER ORKHON ELT +10C22 ; [.3741.0020.0002] # OLD TURKIC LETTER ORKHON EM +10C23 ; [.3742.0020.0002] # OLD TURKIC LETTER ORKHON AN +10C24 ; [.3743.0020.0002] # OLD TURKIC LETTER ORKHON AEN +10C25 ; [.3743.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEN +10C26 ; [.3744.0020.0002] # OLD TURKIC LETTER ORKHON ENT +10C27 ; [.3744.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ENT +10C28 ; [.3745.0020.0002] # OLD TURKIC LETTER ORKHON ENC +10C29 ; [.3745.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ENC +10C2A ; [.3746.0020.0002] # OLD TURKIC LETTER ORKHON ENY +10C2B ; [.3746.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ENY +10C2C ; [.3747.0020.0002] # OLD TURKIC LETTER YENISEI ANG +10C2D ; [.3748.0020.0002] # OLD TURKIC LETTER ORKHON ENG +10C2E ; [.3748.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AENG +10C2F ; [.3749.0020.0002] # OLD TURKIC LETTER ORKHON EP +10C30 ; [.374A.0020.0002] # OLD TURKIC LETTER ORKHON OP +10C31 ; [.374B.0020.0002] # OLD TURKIC LETTER ORKHON IC +10C32 ; [.374C.0020.0002] # OLD TURKIC LETTER ORKHON EC +10C33 ; [.374C.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI EC +10C34 ; [.374D.0020.0002] # OLD TURKIC LETTER ORKHON AQ +10C35 ; [.374D.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AQ +10C36 ; [.374E.0020.0002] # OLD TURKIC LETTER ORKHON IQ +10C37 ; [.374E.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI IQ +10C38 ; [.374F.0020.0002] # OLD TURKIC LETTER ORKHON OQ +10C39 ; [.374F.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI OQ +10C3A ; [.3750.0020.0002] # OLD TURKIC LETTER ORKHON AR +10C3B ; [.3750.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AR +10C3C ; [.3751.0020.0002] # OLD TURKIC LETTER ORKHON AER +10C3D ; [.3752.0020.0002] # OLD TURKIC LETTER ORKHON AS +10C3E ; [.3753.0020.0002] # OLD TURKIC LETTER ORKHON AES +10C3F ; [.3754.0020.0002] # OLD TURKIC LETTER ORKHON ASH +10C40 ; [.3754.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ASH +10C41 ; [.3755.0020.0002] # OLD TURKIC LETTER ORKHON ESH +10C42 ; [.3755.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ESH +10C43 ; [.3756.0020.0002] # OLD TURKIC LETTER ORKHON AT +10C44 ; [.3756.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AT +10C45 ; [.3757.0020.0002] # OLD TURKIC LETTER ORKHON AET +10C46 ; [.3757.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AET +10C47 ; [.3758.0020.0002] # OLD TURKIC LETTER ORKHON OT +10C48 ; [.3759.0020.0002] # OLD TURKIC LETTER ORKHON BASH +A500 ; [.375A.0020.0002] # VAI SYLLABLE EE +A501 ; [.375B.0020.0002] # VAI SYLLABLE EEN +A502 ; [.375C.0020.0002] # VAI SYLLABLE HEE +A503 ; [.375D.0020.0002] # VAI SYLLABLE WEE +A504 ; [.375E.0020.0002] # VAI SYLLABLE WEEN +A505 ; [.375F.0020.0002] # VAI SYLLABLE PEE +A506 ; [.3760.0020.0002] # VAI SYLLABLE BHEE +A507 ; [.3761.0020.0002] # VAI SYLLABLE BEE +A508 ; [.3762.0020.0002] # VAI SYLLABLE MBEE +A509 ; [.3763.0020.0002] # VAI SYLLABLE KPEE +A50A ; [.3764.0020.0002] # VAI SYLLABLE MGBEE +A50B ; [.3765.0020.0002] # VAI SYLLABLE GBEE +A50C ; [.3766.0020.0002] # VAI SYLLABLE FEE +A613 ; [.3766.0020.0004][.3865.0020.0004] # VAI SYMBOL FEENG +A50D ; [.3767.0020.0002] # VAI SYLLABLE VEE +A50E ; [.3768.0020.0002] # VAI SYLLABLE TEE +A50F ; [.3769.0020.0002] # VAI SYLLABLE THEE +A510 ; [.376A.0020.0002] # VAI SYLLABLE DHEE +A511 ; [.376B.0020.0002] # VAI SYLLABLE DHHEE +A512 ; [.376C.0020.0002] # VAI SYLLABLE LEE +A513 ; [.376D.0020.0002] # VAI SYLLABLE REE +A514 ; [.376E.0020.0002] # VAI SYLLABLE DEE +A515 ; [.376F.0020.0002] # VAI SYLLABLE NDEE +A516 ; [.3770.0020.0002] # VAI SYLLABLE SEE +A517 ; [.3771.0020.0002] # VAI SYLLABLE SHEE +A518 ; [.3772.0020.0002] # VAI SYLLABLE ZEE +A519 ; [.3773.0020.0002] # VAI SYLLABLE ZHEE +A51A ; [.3774.0020.0002] # VAI SYLLABLE CEE +A51B ; [.3775.0020.0002] # VAI SYLLABLE JEE +A51C ; [.3776.0020.0002] # VAI SYLLABLE NJEE +A51D ; [.3777.0020.0002] # VAI SYLLABLE YEE +A51E ; [.3778.0020.0002] # VAI SYLLABLE KEE +A614 ; [.3778.0020.0004][.3865.0020.0004] # VAI SYMBOL KEENG +A51F ; [.3779.0020.0002] # VAI SYLLABLE NGGEE +A520 ; [.377A.0020.0002] # VAI SYLLABLE GEE +A521 ; [.377B.0020.0002] # VAI SYLLABLE MEE +A522 ; [.377C.0020.0002] # VAI SYLLABLE NEE +A523 ; [.377D.0020.0002] # VAI SYLLABLE NYEE +A524 ; [.377E.0020.0002] # VAI SYLLABLE I +A525 ; [.377F.0020.0002] # VAI SYLLABLE IN +A526 ; [.3780.0020.0002] # VAI SYLLABLE HI +A527 ; [.3781.0020.0002] # VAI SYLLABLE HIN +A528 ; [.3782.0020.0002] # VAI SYLLABLE WI +A529 ; [.3783.0020.0002] # VAI SYLLABLE WIN +A52A ; [.3784.0020.0002] # VAI SYLLABLE PI +A52B ; [.3785.0020.0002] # VAI SYLLABLE BHI +A52C ; [.3786.0020.0002] # VAI SYLLABLE BI +A52D ; [.3787.0020.0002] # VAI SYLLABLE MBI +A52E ; [.3788.0020.0002] # VAI SYLLABLE KPI +A52F ; [.3789.0020.0002] # VAI SYLLABLE MGBI +A530 ; [.378A.0020.0002] # VAI SYLLABLE GBI +A531 ; [.378B.0020.0002] # VAI SYLLABLE FI +A532 ; [.378C.0020.0002] # VAI SYLLABLE VI +A533 ; [.378D.0020.0002] # VAI SYLLABLE TI +A615 ; [.378D.0020.0004][.3865.0020.0004] # VAI SYMBOL TING +A534 ; [.378E.0020.0002] # VAI SYLLABLE THI +A535 ; [.378F.0020.0002] # VAI SYLLABLE DHI +A536 ; [.3790.0020.0002] # VAI SYLLABLE DHHI +A537 ; [.3791.0020.0002] # VAI SYLLABLE LI +A538 ; [.3792.0020.0002] # VAI SYLLABLE RI +A539 ; [.3793.0020.0002] # VAI SYLLABLE DI +A53A ; [.3794.0020.0002] # VAI SYLLABLE NDI +A53B ; [.3795.0020.0002] # VAI SYLLABLE SI +A53C ; [.3796.0020.0002] # VAI SYLLABLE SHI +A53D ; [.3797.0020.0002] # VAI SYLLABLE ZI +A53E ; [.3798.0020.0002] # VAI SYLLABLE ZHI +A53F ; [.3799.0020.0002] # VAI SYLLABLE CI +A540 ; [.379A.0020.0002] # VAI SYLLABLE JI +A541 ; [.379B.0020.0002] # VAI SYLLABLE NJI +A542 ; [.379C.0020.0002] # VAI SYLLABLE YI +A543 ; [.379D.0020.0002] # VAI SYLLABLE KI +A544 ; [.379E.0020.0002] # VAI SYLLABLE NGGI +A545 ; [.379F.0020.0002] # VAI SYLLABLE GI +A546 ; [.37A0.0020.0002] # VAI SYLLABLE MI +A547 ; [.37A1.0020.0002] # VAI SYLLABLE NI +A616 ; [.37A1.0020.0004][.3866.0020.0004] # VAI SYMBOL NII +A548 ; [.37A2.0020.0002] # VAI SYLLABLE NYI +A549 ; [.37A3.0020.0002] # VAI SYLLABLE A +A54A ; [.37A4.0020.0002] # VAI SYLLABLE AN +A54B ; [.37A5.0020.0002] # VAI SYLLABLE NGAN +A54C ; [.37A6.0020.0002] # VAI SYLLABLE HA +A54D ; [.37A7.0020.0002] # VAI SYLLABLE HAN +A54E ; [.37A8.0020.0002] # VAI SYLLABLE WA +A54F ; [.37A9.0020.0002] # VAI SYLLABLE WAN +A550 ; [.37AA.0020.0002] # VAI SYLLABLE PA +A551 ; [.37AB.0020.0002] # VAI SYLLABLE BHA +A552 ; [.37AC.0020.0002] # VAI SYLLABLE BA +A617 ; [.37AC.0020.0004][.3865.0020.0004] # VAI SYMBOL BANG +A553 ; [.37AD.0020.0002] # VAI SYLLABLE MBA +A554 ; [.37AE.0020.0002] # VAI SYLLABLE KPA +A555 ; [.37AF.0020.0002] # VAI SYLLABLE KPAN +A556 ; [.37B0.0020.0002] # VAI SYLLABLE MGBA +A557 ; [.37B1.0020.0002] # VAI SYLLABLE GBA +A558 ; [.37B2.0020.0002] # VAI SYLLABLE FA +A610 ; [.37B2.0020.0004] # VAI SYLLABLE NDOLE FA +A618 ; [.37B2.0020.0004][.3866.0020.0004] # VAI SYMBOL FAA +A559 ; [.37B3.0020.0002] # VAI SYLLABLE VA +A55A ; [.37B4.0020.0002] # VAI SYLLABLE TA +A619 ; [.37B4.0020.0004][.3866.0020.0004] # VAI SYMBOL TAA +A55B ; [.37B5.0020.0002] # VAI SYLLABLE THA +A55C ; [.37B6.0020.0002] # VAI SYLLABLE DHA +A55D ; [.37B7.0020.0002] # VAI SYLLABLE DHHA +A55E ; [.37B8.0020.0002] # VAI SYLLABLE LA +A55F ; [.37B9.0020.0002] # VAI SYLLABLE RA +A560 ; [.37BA.0020.0002] # VAI SYLLABLE DA +A61A ; [.37BA.0020.0004][.3865.0020.0004] # VAI SYMBOL DANG +A561 ; [.37BB.0020.0002] # VAI SYLLABLE NDA +A562 ; [.37BC.0020.0002] # VAI SYLLABLE SA +A563 ; [.37BD.0020.0002] # VAI SYLLABLE SHA +A564 ; [.37BE.0020.0002] # VAI SYLLABLE ZA +A565 ; [.37BF.0020.0002] # VAI SYLLABLE ZHA +A566 ; [.37C0.0020.0002] # VAI SYLLABLE CA +A567 ; [.37C1.0020.0002] # VAI SYLLABLE JA +A568 ; [.37C2.0020.0002] # VAI SYLLABLE NJA +A569 ; [.37C3.0020.0002] # VAI SYLLABLE YA +A56A ; [.37C4.0020.0002] # VAI SYLLABLE KA +A611 ; [.37C4.0020.0004] # VAI SYLLABLE NDOLE KA +A56B ; [.37C5.0020.0002] # VAI SYLLABLE KAN +A56C ; [.37C6.0020.0002] # VAI SYLLABLE NGGA +A56D ; [.37C7.0020.0002] # VAI SYLLABLE GA +A56E ; [.37C8.0020.0002] # VAI SYLLABLE MA +A62A ; [.37C8.0020.0004] # VAI SYLLABLE NDOLE MA +A56F ; [.37C9.0020.0002] # VAI SYLLABLE NA +A570 ; [.37CA.0020.0002] # VAI SYLLABLE NYA +A571 ; [.37CB.0020.0002] # VAI SYLLABLE OO +A572 ; [.37CC.0020.0002] # VAI SYLLABLE OON +A573 ; [.37CD.0020.0002] # VAI SYLLABLE HOO +A574 ; [.37CE.0020.0002] # VAI SYLLABLE WOO +A575 ; [.37CF.0020.0002] # VAI SYLLABLE WOON +A576 ; [.37D0.0020.0002] # VAI SYLLABLE POO +A577 ; [.37D1.0020.0002] # VAI SYLLABLE BHOO +A578 ; [.37D2.0020.0002] # VAI SYLLABLE BOO +A579 ; [.37D3.0020.0002] # VAI SYLLABLE MBOO +A57A ; [.37D4.0020.0002] # VAI SYLLABLE KPOO +A57B ; [.37D5.0020.0002] # VAI SYLLABLE MGBOO +A57C ; [.37D6.0020.0002] # VAI SYLLABLE GBOO +A57D ; [.37D7.0020.0002] # VAI SYLLABLE FOO +A57E ; [.37D8.0020.0002] # VAI SYLLABLE VOO +A57F ; [.37D9.0020.0002] # VAI SYLLABLE TOO +A580 ; [.37DA.0020.0002] # VAI SYLLABLE THOO +A581 ; [.37DB.0020.0002] # VAI SYLLABLE DHOO +A582 ; [.37DC.0020.0002] # VAI SYLLABLE DHHOO +A583 ; [.37DD.0020.0002] # VAI SYLLABLE LOO +A584 ; [.37DE.0020.0002] # VAI SYLLABLE ROO +A585 ; [.37DF.0020.0002] # VAI SYLLABLE DOO +A61B ; [.37DF.0020.0004][.3865.0020.0004] # VAI SYMBOL DOONG +A586 ; [.37E0.0020.0002] # VAI SYLLABLE NDOO +A587 ; [.37E1.0020.0002] # VAI SYLLABLE SOO +A612 ; [.37E1.0020.0004] # VAI SYLLABLE NDOLE SOO +A588 ; [.37E2.0020.0002] # VAI SYLLABLE SHOO +A589 ; [.37E3.0020.0002] # VAI SYLLABLE ZOO +A58A ; [.37E4.0020.0002] # VAI SYLLABLE ZHOO +A58B ; [.37E5.0020.0002] # VAI SYLLABLE COO +A58C ; [.37E6.0020.0002] # VAI SYLLABLE JOO +A58D ; [.37E7.0020.0002] # VAI SYLLABLE NJOO +A58E ; [.37E8.0020.0002] # VAI SYLLABLE YOO +A58F ; [.37E9.0020.0002] # VAI SYLLABLE KOO +A590 ; [.37EA.0020.0002] # VAI SYLLABLE NGGOO +A591 ; [.37EB.0020.0002] # VAI SYLLABLE GOO +A592 ; [.37EC.0020.0002] # VAI SYLLABLE MOO +A593 ; [.37ED.0020.0002] # VAI SYLLABLE NOO +A594 ; [.37EE.0020.0002] # VAI SYLLABLE NYOO +A595 ; [.37EF.0020.0002] # VAI SYLLABLE U +A596 ; [.37F0.0020.0002] # VAI SYLLABLE UN +A597 ; [.37F1.0020.0002] # VAI SYLLABLE HU +A598 ; [.37F2.0020.0002] # VAI SYLLABLE HUN +A599 ; [.37F3.0020.0002] # VAI SYLLABLE WU +A59A ; [.37F4.0020.0002] # VAI SYLLABLE WUN +A59B ; [.37F5.0020.0002] # VAI SYLLABLE PU +A59C ; [.37F6.0020.0002] # VAI SYLLABLE BHU +A59D ; [.37F7.0020.0002] # VAI SYLLABLE BU +A59E ; [.37F8.0020.0002] # VAI SYLLABLE MBU +A59F ; [.37F9.0020.0002] # VAI SYLLABLE KPU +A5A0 ; [.37FA.0020.0002] # VAI SYLLABLE MGBU +A5A1 ; [.37FB.0020.0002] # VAI SYLLABLE GBU +A5A2 ; [.37FC.0020.0002] # VAI SYLLABLE FU +A5A3 ; [.37FD.0020.0002] # VAI SYLLABLE VU +A5A4 ; [.37FE.0020.0002] # VAI SYLLABLE TU +A5A5 ; [.37FF.0020.0002] # VAI SYLLABLE THU +A5A6 ; [.3800.0020.0002] # VAI SYLLABLE DHU +A5A7 ; [.3801.0020.0002] # VAI SYLLABLE DHHU +A5A8 ; [.3802.0020.0002] # VAI SYLLABLE LU +A5A9 ; [.3803.0020.0002] # VAI SYLLABLE RU +A5AA ; [.3804.0020.0002] # VAI SYLLABLE DU +A5AB ; [.3805.0020.0002] # VAI SYLLABLE NDU +A5AC ; [.3806.0020.0002] # VAI SYLLABLE SU +A5AD ; [.3807.0020.0002] # VAI SYLLABLE SHU +A5AE ; [.3808.0020.0002] # VAI SYLLABLE ZU +A5AF ; [.3809.0020.0002] # VAI SYLLABLE ZHU +A5B0 ; [.380A.0020.0002] # VAI SYLLABLE CU +A5B1 ; [.380B.0020.0002] # VAI SYLLABLE JU +A5B2 ; [.380C.0020.0002] # VAI SYLLABLE NJU +A5B3 ; [.380D.0020.0002] # VAI SYLLABLE YU +A5B4 ; [.380E.0020.0002] # VAI SYLLABLE KU +A61C ; [.380E.0020.0004][.3865.0020.0004] # VAI SYMBOL KUNG +A5B5 ; [.380F.0020.0002] # VAI SYLLABLE NGGU +A5B6 ; [.3810.0020.0002] # VAI SYLLABLE GU +A5B7 ; [.3811.0020.0002] # VAI SYLLABLE MU +A5B8 ; [.3812.0020.0002] # VAI SYLLABLE NU +A5B9 ; [.3813.0020.0002] # VAI SYLLABLE NYU +A5BA ; [.3814.0020.0002] # VAI SYLLABLE O +A5BB ; [.3815.0020.0002] # VAI SYLLABLE ON +A5BC ; [.3816.0020.0002] # VAI SYLLABLE NGON +A5BD ; [.3817.0020.0002] # VAI SYLLABLE HO +A5BE ; [.3818.0020.0002] # VAI SYLLABLE HON +A5BF ; [.3819.0020.0002] # VAI SYLLABLE WO +A5C0 ; [.381A.0020.0002] # VAI SYLLABLE WON +A5C1 ; [.381B.0020.0002] # VAI SYLLABLE PO +A5C2 ; [.381C.0020.0002] # VAI SYLLABLE BHO +A5C3 ; [.381D.0020.0002] # VAI SYLLABLE BO +A5C4 ; [.381E.0020.0002] # VAI SYLLABLE MBO +A5C5 ; [.381F.0020.0002] # VAI SYLLABLE KPO +A5C6 ; [.3820.0020.0002] # VAI SYLLABLE MGBO +A5C7 ; [.3821.0020.0002] # VAI SYLLABLE GBO +A5C8 ; [.3822.0020.0002] # VAI SYLLABLE GBON +A5C9 ; [.3823.0020.0002] # VAI SYLLABLE FO +A5CA ; [.3824.0020.0002] # VAI SYLLABLE VO +A5CB ; [.3825.0020.0002] # VAI SYLLABLE TO +A61D ; [.3825.0020.0004][.3865.0020.0004] # VAI SYMBOL TONG +A5CC ; [.3826.0020.0002] # VAI SYLLABLE THO +A5CD ; [.3827.0020.0002] # VAI SYLLABLE DHO +A5CE ; [.3828.0020.0002] # VAI SYLLABLE DHHO +A5CF ; [.3829.0020.0002] # VAI SYLLABLE LO +A5D0 ; [.382A.0020.0002] # VAI SYLLABLE RO +A5D1 ; [.382B.0020.0002] # VAI SYLLABLE DO +A62B ; [.382B.0020.0004] # VAI SYLLABLE NDOLE DO +A61E ; [.382B.0020.0004][.3866.0020.0004] # VAI SYMBOL DO-O +A5D2 ; [.382C.0020.0002] # VAI SYLLABLE NDO +A5D3 ; [.382D.0020.0002] # VAI SYLLABLE SO +A5D4 ; [.382E.0020.0002] # VAI SYLLABLE SHO +A5D5 ; [.382F.0020.0002] # VAI SYLLABLE ZO +A5D6 ; [.3830.0020.0002] # VAI SYLLABLE ZHO +A5D7 ; [.3831.0020.0002] # VAI SYLLABLE CO +A5D8 ; [.3832.0020.0002] # VAI SYLLABLE JO +A61F ; [.3832.0020.0004][.3865.0020.0004] # VAI SYMBOL JONG +A5D9 ; [.3833.0020.0002] # VAI SYLLABLE NJO +A5DA ; [.3834.0020.0002] # VAI SYLLABLE YO +A5DB ; [.3835.0020.0002] # VAI SYLLABLE KO +A5DC ; [.3836.0020.0002] # VAI SYLLABLE NGGO +A5DD ; [.3837.0020.0002] # VAI SYLLABLE GO +A5DE ; [.3838.0020.0002] # VAI SYLLABLE MO +A5DF ; [.3839.0020.0002] # VAI SYLLABLE NO +A5E0 ; [.383A.0020.0002] # VAI SYLLABLE NYO +A5E1 ; [.383B.0020.0002] # VAI SYLLABLE E +A5E2 ; [.383C.0020.0002] # VAI SYLLABLE EN +A5E3 ; [.383D.0020.0002] # VAI SYLLABLE NGEN +A5E4 ; [.383E.0020.0002] # VAI SYLLABLE HE +A5E5 ; [.383F.0020.0002] # VAI SYLLABLE HEN +A5E6 ; [.3840.0020.0002] # VAI SYLLABLE WE +A5E7 ; [.3841.0020.0002] # VAI SYLLABLE WEN +A5E8 ; [.3842.0020.0002] # VAI SYLLABLE PE +A5E9 ; [.3843.0020.0002] # VAI SYLLABLE BHE +A5EA ; [.3844.0020.0002] # VAI SYLLABLE BE +A5EB ; [.3845.0020.0002] # VAI SYLLABLE MBE +A5EC ; [.3846.0020.0002] # VAI SYLLABLE KPE +A5ED ; [.3847.0020.0002] # VAI SYLLABLE KPEN +A5EE ; [.3848.0020.0002] # VAI SYLLABLE MGBE +A5EF ; [.3849.0020.0002] # VAI SYLLABLE GBE +A5F0 ; [.384A.0020.0002] # VAI SYLLABLE GBEN +A5F1 ; [.384B.0020.0002] # VAI SYLLABLE FE +A5F2 ; [.384C.0020.0002] # VAI SYLLABLE VE +A5F3 ; [.384D.0020.0002] # VAI SYLLABLE TE +A5F4 ; [.384E.0020.0002] # VAI SYLLABLE THE +A5F5 ; [.384F.0020.0002] # VAI SYLLABLE DHE +A5F6 ; [.3850.0020.0002] # VAI SYLLABLE DHHE +A5F7 ; [.3851.0020.0002] # VAI SYLLABLE LE +A5F8 ; [.3852.0020.0002] # VAI SYLLABLE RE +A5F9 ; [.3853.0020.0002] # VAI SYLLABLE DE +A5FA ; [.3854.0020.0002] # VAI SYLLABLE NDE +A5FB ; [.3855.0020.0002] # VAI SYLLABLE SE +A5FC ; [.3856.0020.0002] # VAI SYLLABLE SHE +A5FD ; [.3857.0020.0002] # VAI SYLLABLE ZE +A5FE ; [.3858.0020.0002] # VAI SYLLABLE ZHE +A5FF ; [.3859.0020.0002] # VAI SYLLABLE CE +A600 ; [.385A.0020.0002] # VAI SYLLABLE JE +A601 ; [.385B.0020.0002] # VAI SYLLABLE NJE +A602 ; [.385C.0020.0002] # VAI SYLLABLE YE +A603 ; [.385D.0020.0002] # VAI SYLLABLE KE +A604 ; [.385E.0020.0002] # VAI SYLLABLE NGGE +A605 ; [.385F.0020.0002] # VAI SYLLABLE NGGEN +A606 ; [.3860.0020.0002] # VAI SYLLABLE GE +A607 ; [.3861.0020.0002] # VAI SYLLABLE GEN +A608 ; [.3862.0020.0002] # VAI SYLLABLE ME +A609 ; [.3863.0020.0002] # VAI SYLLABLE NE +A60A ; [.3864.0020.0002] # VAI SYLLABLE NYE +A60B ; [.3865.0020.0002] # VAI SYLLABLE NG +A60C ; [.3866.0020.0002] # VAI SYLLABLE LENGTHENER +A6A0 ; [.3867.0020.0002] # BAMUM LETTER A +A6A1 ; [.3868.0020.0002] # BAMUM LETTER KA +A6A2 ; [.3869.0020.0002] # BAMUM LETTER U +A6A3 ; [.386A.0020.0002] # BAMUM LETTER KU +A6A4 ; [.386B.0020.0002] # BAMUM LETTER EE +A6A5 ; [.386C.0020.0002] # BAMUM LETTER REE +A6A6 ; [.386D.0020.0002] # BAMUM LETTER TAE +A6A7 ; [.386E.0020.0002] # BAMUM LETTER O +A6A8 ; [.386F.0020.0002] # BAMUM LETTER NYI +A6A9 ; [.3870.0020.0002] # BAMUM LETTER I +A6AA ; [.3871.0020.0002] # BAMUM LETTER LA +A6AB ; [.3872.0020.0002] # BAMUM LETTER PA +A6AC ; [.3873.0020.0002] # BAMUM LETTER RII +A6AD ; [.3874.0020.0002] # BAMUM LETTER RIEE +A6AE ; [.3875.0020.0002] # BAMUM LETTER LEEEE +A6AF ; [.3876.0020.0002] # BAMUM LETTER MEEEE +A6B0 ; [.3877.0020.0002] # BAMUM LETTER TAA +A6B1 ; [.3878.0020.0002] # BAMUM LETTER NDAA +A6B2 ; [.3879.0020.0002] # BAMUM LETTER NJAEM +A6B3 ; [.387A.0020.0002] # BAMUM LETTER M +A6B4 ; [.387B.0020.0002] # BAMUM LETTER SUU +A6B5 ; [.387C.0020.0002] # BAMUM LETTER MU +A6B6 ; [.387D.0020.0002] # BAMUM LETTER SHII +A6B7 ; [.387E.0020.0002] # BAMUM LETTER SI +A6B8 ; [.387F.0020.0002] # BAMUM LETTER SHEUX +A6B9 ; [.3880.0020.0002] # BAMUM LETTER SEUX +A6BA ; [.3881.0020.0002] # BAMUM LETTER KYEE +A6BB ; [.3882.0020.0002] # BAMUM LETTER KET +A6BC ; [.3883.0020.0002] # BAMUM LETTER NUAE +A6BD ; [.3884.0020.0002] # BAMUM LETTER NU +A6BE ; [.3885.0020.0002] # BAMUM LETTER NJUAE +A6BF ; [.3886.0020.0002] # BAMUM LETTER YOQ +A6C0 ; [.3887.0020.0002] # BAMUM LETTER SHU +A6C1 ; [.3888.0020.0002] # BAMUM LETTER YUQ +A6C2 ; [.3889.0020.0002] # BAMUM LETTER YA +A6C3 ; [.388A.0020.0002] # BAMUM LETTER NSHA +A6C4 ; [.388B.0020.0002] # BAMUM LETTER KEUX +A6C5 ; [.388C.0020.0002] # BAMUM LETTER PEUX +A6C6 ; [.388D.0020.0002] # BAMUM LETTER NJEE +A6C7 ; [.388E.0020.0002] # BAMUM LETTER NTEE +A6C8 ; [.388F.0020.0002] # BAMUM LETTER PUE +A6C9 ; [.3890.0020.0002] # BAMUM LETTER WUE +A6CA ; [.3891.0020.0002] # BAMUM LETTER PEE +A6CB ; [.3892.0020.0002] # BAMUM LETTER FEE +A6CC ; [.3893.0020.0002] # BAMUM LETTER RU +A6CD ; [.3894.0020.0002] # BAMUM LETTER LU +A6CE ; [.3895.0020.0002] # BAMUM LETTER MI +A6CF ; [.3896.0020.0002] # BAMUM LETTER NI +A6D0 ; [.3897.0020.0002] # BAMUM LETTER REUX +A6D1 ; [.3898.0020.0002] # BAMUM LETTER RAE +A6D2 ; [.3899.0020.0002] # BAMUM LETTER KEN +A6D3 ; [.389A.0020.0002] # BAMUM LETTER NGKWAEN +A6D4 ; [.389B.0020.0002] # BAMUM LETTER NGGA +A6D5 ; [.389C.0020.0002] # BAMUM LETTER NGA +A6D6 ; [.389D.0020.0002] # BAMUM LETTER SHO +A6D7 ; [.389E.0020.0002] # BAMUM LETTER PUAE +A6D8 ; [.389F.0020.0002] # BAMUM LETTER FU +A6D9 ; [.38A0.0020.0002] # BAMUM LETTER FOM +A6DA ; [.38A1.0020.0002] # BAMUM LETTER WA +A6DB ; [.38A2.0020.0002] # BAMUM LETTER NA +A6DC ; [.38A3.0020.0002] # BAMUM LETTER LI +A6DD ; [.38A4.0020.0002] # BAMUM LETTER PI +A6DE ; [.38A5.0020.0002] # BAMUM LETTER LOQ +A6DF ; [.38A6.0020.0002] # BAMUM LETTER KO +A6E0 ; [.38A7.0020.0002] # BAMUM LETTER MBEN +A6E1 ; [.38A8.0020.0002] # BAMUM LETTER REN +A6E2 ; [.38A9.0020.0002] # BAMUM LETTER MEN +A6E3 ; [.38AA.0020.0002] # BAMUM LETTER MA +A6E4 ; [.38AB.0020.0002] # BAMUM LETTER TI +A6E5 ; [.38AC.0020.0002] # BAMUM LETTER KI +A6E6 ; [.38AD.0020.0002] # BAMUM LETTER MO +A6E7 ; [.38AE.0020.0002] # BAMUM LETTER MBAA +A6E8 ; [.38AF.0020.0002] # BAMUM LETTER TET +A6E9 ; [.38B0.0020.0002] # BAMUM LETTER KPA +A6EA ; [.38B1.0020.0002] # BAMUM LETTER TEN +A6EB ; [.38B2.0020.0002] # BAMUM LETTER NTUU +A6EC ; [.38B3.0020.0002] # BAMUM LETTER SAMBA +A6ED ; [.38B4.0020.0002] # BAMUM LETTER FAAMAE +A6EE ; [.38B5.0020.0002] # BAMUM LETTER KOVUU +A6EF ; [.38B6.0020.0002] # BAMUM LETTER KOGHOM +16800 ; [.38B7.0020.0002] # BAMUM LETTER PHASE-A NGKUE MFON +16801 ; [.38B8.0020.0002] # BAMUM LETTER PHASE-A GBIEE FON +16802 ; [.38B9.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE +16803 ; [.38BA.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMBA +16804 ; [.38BB.0020.0002] # BAMUM LETTER PHASE-A NAA MFON +16805 ; [.38BC.0020.0002] # BAMUM LETTER PHASE-A SHUENSHUET +16806 ; [.38BD.0020.0002] # BAMUM LETTER PHASE-A TITA MFON +16807 ; [.38BE.0020.0002] # BAMUM LETTER PHASE-A NZA MFON +16808 ; [.38BF.0020.0002] # BAMUM LETTER PHASE-A SHINDA PA NJI +16809 ; [.38C0.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE +1680A ; [.38C1.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA +1680B ; [.38C2.0020.0002] # BAMUM LETTER PHASE-A MAEMBGBIEE +1680C ; [.38C3.0020.0002] # BAMUM LETTER PHASE-A TU MAEMBA +1680D ; [.38C4.0020.0002] # BAMUM LETTER PHASE-A NGANGU +1680E ; [.38C5.0020.0002] # BAMUM LETTER PHASE-A MAEMVEUX +1680F ; [.38C6.0020.0002] # BAMUM LETTER PHASE-A MANSUAE +16810 ; [.38C7.0020.0002] # BAMUM LETTER PHASE-A MVEUAENGAM +16811 ; [.38C8.0020.0002] # BAMUM LETTER PHASE-A SEUNYAM +16812 ; [.38C9.0020.0002] # BAMUM LETTER PHASE-A NTOQPEN +16813 ; [.38CA.0020.0002] # BAMUM LETTER PHASE-A KEUKEUTNDA +16814 ; [.38CB.0020.0002] # BAMUM LETTER PHASE-A NKINDI +16815 ; [.38CC.0020.0002] # BAMUM LETTER PHASE-A SUU +16816 ; [.38CD.0020.0002] # BAMUM LETTER PHASE-A NGKUENZEUM +16817 ; [.38CE.0020.0002] # BAMUM LETTER PHASE-A LAPAQ +16818 ; [.38CF.0020.0002] # BAMUM LETTER PHASE-A LET KUT +16819 ; [.38D0.0020.0002] # BAMUM LETTER PHASE-A NTAP MFAA +1681A ; [.38D1.0020.0002] # BAMUM LETTER PHASE-A MAEKEUP +1681B ; [.38D2.0020.0002] # BAMUM LETTER PHASE-A PASHAE +1681C ; [.38D3.0020.0002] # BAMUM LETTER PHASE-A GHEUAERAE +1681D ; [.38D4.0020.0002] # BAMUM LETTER PHASE-A PAMSHAE +1681E ; [.38D5.0020.0002] # BAMUM LETTER PHASE-A MON NGGEUAET +1681F ; [.38D6.0020.0002] # BAMUM LETTER PHASE-A NZUN MEUT +16820 ; [.38D7.0020.0002] # BAMUM LETTER PHASE-A U YUQ NAE +16821 ; [.38D8.0020.0002] # BAMUM LETTER PHASE-A GHEUAEGHEUAE +16822 ; [.38D9.0020.0002] # BAMUM LETTER PHASE-A NTAP NTAA +16823 ; [.38DA.0020.0002] # BAMUM LETTER PHASE-A SISA +16824 ; [.38DB.0020.0002] # BAMUM LETTER PHASE-A MGBASA +16825 ; [.38DC.0020.0002] # BAMUM LETTER PHASE-A MEUNJOMNDEUQ +16826 ; [.38DD.0020.0002] # BAMUM LETTER PHASE-A MOOMPUQ +16827 ; [.38DE.0020.0002] # BAMUM LETTER PHASE-A KAFA +16828 ; [.38DF.0020.0002] # BAMUM LETTER PHASE-A PA LEERAEWA +16829 ; [.38E0.0020.0002] # BAMUM LETTER PHASE-A NDA LEERAEWA +1682A ; [.38E1.0020.0002] # BAMUM LETTER PHASE-A PET +1682B ; [.38E2.0020.0002] # BAMUM LETTER PHASE-A MAEMKPEN +1682C ; [.38E3.0020.0002] # BAMUM LETTER PHASE-A NIKA +1682D ; [.38E4.0020.0002] # BAMUM LETTER PHASE-A PUP +1682E ; [.38E5.0020.0002] # BAMUM LETTER PHASE-A TUAEP +1682F ; [.38E6.0020.0002] # BAMUM LETTER PHASE-A LUAEP +16830 ; [.38E7.0020.0002] # BAMUM LETTER PHASE-A SONJAM +16831 ; [.38E8.0020.0002] # BAMUM LETTER PHASE-A TEUTEUWEN +16832 ; [.38E9.0020.0002] # BAMUM LETTER PHASE-A MAENYI +16833 ; [.38EA.0020.0002] # BAMUM LETTER PHASE-A KET +16834 ; [.38EB.0020.0002] # BAMUM LETTER PHASE-A NDAANGGEUAET +16835 ; [.38EC.0020.0002] # BAMUM LETTER PHASE-A KUOQ +16836 ; [.38ED.0020.0002] # BAMUM LETTER PHASE-A MOOMEUT +16837 ; [.38EE.0020.0002] # BAMUM LETTER PHASE-A SHUM +16838 ; [.38EF.0020.0002] # BAMUM LETTER PHASE-A LOMMAE +16839 ; [.38F0.0020.0002] # BAMUM LETTER PHASE-A FIRI +1683A ; [.38F1.0020.0002] # BAMUM LETTER PHASE-A ROM +1683B ; [.38F2.0020.0002] # BAMUM LETTER PHASE-A KPOQ +1683C ; [.38F3.0020.0002] # BAMUM LETTER PHASE-A SOQ +1683D ; [.38F4.0020.0002] # BAMUM LETTER PHASE-A MAP PIEET +1683E ; [.38F5.0020.0002] # BAMUM LETTER PHASE-A SHIRAE +1683F ; [.38F6.0020.0002] # BAMUM LETTER PHASE-A NTAP +16840 ; [.38F7.0020.0002] # BAMUM LETTER PHASE-A SHOQ NSHUT YUM +16841 ; [.38F8.0020.0002] # BAMUM LETTER PHASE-A NYIT MONGKEUAEQ +16842 ; [.38F9.0020.0002] # BAMUM LETTER PHASE-A PAARAE +16843 ; [.38FA.0020.0002] # BAMUM LETTER PHASE-A NKAARAE +16844 ; [.38FB.0020.0002] # BAMUM LETTER PHASE-A UNKNOWN +16845 ; [.38FC.0020.0002] # BAMUM LETTER PHASE-A NGGEN +16846 ; [.38FD.0020.0002] # BAMUM LETTER PHASE-A MAESI +16847 ; [.38FE.0020.0002] # BAMUM LETTER PHASE-A NJAM +16848 ; [.38FF.0020.0002] # BAMUM LETTER PHASE-A MBANYI +16849 ; [.3900.0020.0002] # BAMUM LETTER PHASE-A NYET +1684A ; [.3901.0020.0002] # BAMUM LETTER PHASE-A TEUAEN +1684B ; [.3902.0020.0002] # BAMUM LETTER PHASE-A SOT +1684C ; [.3903.0020.0002] # BAMUM LETTER PHASE-A PAAM +1684D ; [.3904.0020.0002] # BAMUM LETTER PHASE-A NSHIEE +1684E ; [.3905.0020.0002] # BAMUM LETTER PHASE-A MAEM +1684F ; [.3906.0020.0002] # BAMUM LETTER PHASE-A NYI +16850 ; [.3907.0020.0002] # BAMUM LETTER PHASE-A KAQ +16851 ; [.3908.0020.0002] # BAMUM LETTER PHASE-A NSHA +16852 ; [.3909.0020.0002] # BAMUM LETTER PHASE-A VEE +16853 ; [.390A.0020.0002] # BAMUM LETTER PHASE-A LU +16854 ; [.390B.0020.0002] # BAMUM LETTER PHASE-A NEN +16855 ; [.390C.0020.0002] # BAMUM LETTER PHASE-A NAQ +16856 ; [.390D.0020.0002] # BAMUM LETTER PHASE-A MBAQ +16857 ; [.390E.0020.0002] # BAMUM LETTER PHASE-B NSHUET +16858 ; [.390F.0020.0002] # BAMUM LETTER PHASE-B TU MAEMGBIEE +16859 ; [.3910.0020.0002] # BAMUM LETTER PHASE-B SIEE +1685A ; [.3911.0020.0002] # BAMUM LETTER PHASE-B SET TU +1685B ; [.3912.0020.0002] # BAMUM LETTER PHASE-B LOM NTEUM +1685C ; [.3913.0020.0002] # BAMUM LETTER PHASE-B MBA MAELEE +1685D ; [.3914.0020.0002] # BAMUM LETTER PHASE-B KIEEM +1685E ; [.3915.0020.0002] # BAMUM LETTER PHASE-B YEURAE +1685F ; [.3916.0020.0002] # BAMUM LETTER PHASE-B MBAARAE +16860 ; [.3917.0020.0002] # BAMUM LETTER PHASE-B KAM +16861 ; [.3918.0020.0002] # BAMUM LETTER PHASE-B PEESHI +16862 ; [.3919.0020.0002] # BAMUM LETTER PHASE-B YAFU LEERAEWA +16863 ; [.391A.0020.0002] # BAMUM LETTER PHASE-B LAM NSHUT NYAM +16864 ; [.391B.0020.0002] # BAMUM LETTER PHASE-B NTIEE SHEUOQ +16865 ; [.391C.0020.0002] # BAMUM LETTER PHASE-B NDU NJAA +16866 ; [.391D.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEUAEM +16867 ; [.391E.0020.0002] # BAMUM LETTER PHASE-B PIT +16868 ; [.391F.0020.0002] # BAMUM LETTER PHASE-B TU NSIEE +16869 ; [.3920.0020.0002] # BAMUM LETTER PHASE-B SHET NJAQ +1686A ; [.3921.0020.0002] # BAMUM LETTER PHASE-B SHEUAEQTU +1686B ; [.3922.0020.0002] # BAMUM LETTER PHASE-B MFON TEUAEQ +1686C ; [.3923.0020.0002] # BAMUM LETTER PHASE-B MBIT MBAAKET +1686D ; [.3924.0020.0002] # BAMUM LETTER PHASE-B NYI NTEUM +1686E ; [.3925.0020.0002] # BAMUM LETTER PHASE-B KEUPUQ +1686F ; [.3926.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEN +16870 ; [.3927.0020.0002] # BAMUM LETTER PHASE-B KEUYEUX +16871 ; [.3928.0020.0002] # BAMUM LETTER PHASE-B LAANAE +16872 ; [.3929.0020.0002] # BAMUM LETTER PHASE-B PARUM +16873 ; [.392A.0020.0002] # BAMUM LETTER PHASE-B VEUM +16874 ; [.392B.0020.0002] # BAMUM LETTER PHASE-B NGKINDI MVOP +16875 ; [.392C.0020.0002] # BAMUM LETTER PHASE-B NGGEU MBU +16876 ; [.392D.0020.0002] # BAMUM LETTER PHASE-B WUAET +16877 ; [.392E.0020.0002] # BAMUM LETTER PHASE-B SAKEUAE +16878 ; [.392F.0020.0002] # BAMUM LETTER PHASE-B TAAM +16879 ; [.3930.0020.0002] # BAMUM LETTER PHASE-B MEUQ +1687A ; [.3931.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ +1687B ; [.3932.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ LARGE +1687C ; [.3933.0020.0002] # BAMUM LETTER PHASE-B MFIYAQ +1687D ; [.3934.0020.0002] # BAMUM LETTER PHASE-B SUE +1687E ; [.3935.0020.0002] # BAMUM LETTER PHASE-B MBEURI +1687F ; [.3936.0020.0002] # BAMUM LETTER PHASE-B MONTIEEN +16880 ; [.3937.0020.0002] # BAMUM LETTER PHASE-B NYAEMAE +16881 ; [.3938.0020.0002] # BAMUM LETTER PHASE-B PUNGAAM +16882 ; [.3939.0020.0002] # BAMUM LETTER PHASE-B MEUT NGGEET +16883 ; [.393A.0020.0002] # BAMUM LETTER PHASE-B FEUX +16884 ; [.393B.0020.0002] # BAMUM LETTER PHASE-B MBUOQ +16885 ; [.393C.0020.0002] # BAMUM LETTER PHASE-B FEE +16886 ; [.393D.0020.0002] # BAMUM LETTER PHASE-B KEUAEM +16887 ; [.393E.0020.0002] # BAMUM LETTER PHASE-B MA NJEUAENA +16888 ; [.393F.0020.0002] # BAMUM LETTER PHASE-B MA NJUQA +16889 ; [.3940.0020.0002] # BAMUM LETTER PHASE-B LET +1688A ; [.3941.0020.0002] # BAMUM LETTER PHASE-B NGGAAM +1688B ; [.3942.0020.0002] # BAMUM LETTER PHASE-B NSEN +1688C ; [.3943.0020.0002] # BAMUM LETTER PHASE-B MA +1688D ; [.3944.0020.0002] # BAMUM LETTER PHASE-B KIQ +1688E ; [.3945.0020.0002] # BAMUM LETTER PHASE-B NGOM +1688F ; [.3946.0020.0002] # BAMUM LETTER PHASE-C NGKUE MAEMBA +16890 ; [.3947.0020.0002] # BAMUM LETTER PHASE-C NZA +16891 ; [.3948.0020.0002] # BAMUM LETTER PHASE-C YUM +16892 ; [.3949.0020.0002] # BAMUM LETTER PHASE-C WANGKUOQ +16893 ; [.394A.0020.0002] # BAMUM LETTER PHASE-C NGGEN +16894 ; [.394B.0020.0002] # BAMUM LETTER PHASE-C NDEUAEREE +16895 ; [.394C.0020.0002] # BAMUM LETTER PHASE-C NGKAQ +16896 ; [.394D.0020.0002] # BAMUM LETTER PHASE-C GHARAE +16897 ; [.394E.0020.0002] # BAMUM LETTER PHASE-C MBEEKEET +16898 ; [.394F.0020.0002] # BAMUM LETTER PHASE-C GBAYI +16899 ; [.3950.0020.0002] # BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN +1689A ; [.3951.0020.0002] # BAMUM LETTER PHASE-C NTU MBIT +1689B ; [.3952.0020.0002] # BAMUM LETTER PHASE-C MBEUM +1689C ; [.3953.0020.0002] # BAMUM LETTER PHASE-C PIRIEEN +1689D ; [.3954.0020.0002] # BAMUM LETTER PHASE-C NDOMBU +1689E ; [.3955.0020.0002] # BAMUM LETTER PHASE-C MBAA CABBAGE-TREE +1689F ; [.3956.0020.0002] # BAMUM LETTER PHASE-C KEUSHEUAEP +168A0 ; [.3957.0020.0002] # BAMUM LETTER PHASE-C GHAP +168A1 ; [.3958.0020.0002] # BAMUM LETTER PHASE-C KEUKAQ +168A2 ; [.3959.0020.0002] # BAMUM LETTER PHASE-C YU MUOMAE +168A3 ; [.395A.0020.0002] # BAMUM LETTER PHASE-C NZEUM +168A4 ; [.395B.0020.0002] # BAMUM LETTER PHASE-C MBUE +168A5 ; [.395C.0020.0002] # BAMUM LETTER PHASE-C NSEUAEN +168A6 ; [.395D.0020.0002] # BAMUM LETTER PHASE-C MBIT +168A7 ; [.395E.0020.0002] # BAMUM LETTER PHASE-C YEUQ +168A8 ; [.395F.0020.0002] # BAMUM LETTER PHASE-C KPARAQ +168A9 ; [.3960.0020.0002] # BAMUM LETTER PHASE-C KAA +168AA ; [.3961.0020.0002] # BAMUM LETTER PHASE-C SEUX +168AB ; [.3962.0020.0002] # BAMUM LETTER PHASE-C NDIDA +168AC ; [.3963.0020.0002] # BAMUM LETTER PHASE-C TAASHAE +168AD ; [.3964.0020.0002] # BAMUM LETTER PHASE-C NJUEQ +168AE ; [.3965.0020.0002] # BAMUM LETTER PHASE-C TITA YUE +168AF ; [.3966.0020.0002] # BAMUM LETTER PHASE-C SUAET +168B0 ; [.3967.0020.0002] # BAMUM LETTER PHASE-C NGGUAEN NYAM +168B1 ; [.3968.0020.0002] # BAMUM LETTER PHASE-C VEUX +168B2 ; [.3969.0020.0002] # BAMUM LETTER PHASE-C NANSANAQ +168B3 ; [.396A.0020.0002] # BAMUM LETTER PHASE-C MA KEUAERI +168B4 ; [.396B.0020.0002] # BAMUM LETTER PHASE-C NTAA +168B5 ; [.396C.0020.0002] # BAMUM LETTER PHASE-C NGGUON +168B6 ; [.396D.0020.0002] # BAMUM LETTER PHASE-C LAP +168B7 ; [.396E.0020.0002] # BAMUM LETTER PHASE-C MBIRIEEN +168B8 ; [.396F.0020.0002] # BAMUM LETTER PHASE-C MGBASAQ +168B9 ; [.3970.0020.0002] # BAMUM LETTER PHASE-C NTEUNGBA +168BA ; [.3971.0020.0002] # BAMUM LETTER PHASE-C TEUTEUX +168BB ; [.3972.0020.0002] # BAMUM LETTER PHASE-C NGGUM +168BC ; [.3973.0020.0002] # BAMUM LETTER PHASE-C FUE +168BD ; [.3974.0020.0002] # BAMUM LETTER PHASE-C NDEUT +168BE ; [.3975.0020.0002] # BAMUM LETTER PHASE-C NSA +168BF ; [.3976.0020.0002] # BAMUM LETTER PHASE-C NSHAQ +168C0 ; [.3977.0020.0002] # BAMUM LETTER PHASE-C BUNG +168C1 ; [.3978.0020.0002] # BAMUM LETTER PHASE-C VEUAEPEN +168C2 ; [.3979.0020.0002] # BAMUM LETTER PHASE-C MBERAE +168C3 ; [.397A.0020.0002] # BAMUM LETTER PHASE-C RU +168C4 ; [.397B.0020.0002] # BAMUM LETTER PHASE-C NJAEM +168C5 ; [.397C.0020.0002] # BAMUM LETTER PHASE-C LAM +168C6 ; [.397D.0020.0002] # BAMUM LETTER PHASE-C TITUAEP +168C7 ; [.397E.0020.0002] # BAMUM LETTER PHASE-C NSUOT NGOM +168C8 ; [.397F.0020.0002] # BAMUM LETTER PHASE-C NJEEEE +168C9 ; [.3980.0020.0002] # BAMUM LETTER PHASE-C KET +168CA ; [.3981.0020.0002] # BAMUM LETTER PHASE-C NGGU +168CB ; [.3982.0020.0002] # BAMUM LETTER PHASE-C MAESI +168CC ; [.3983.0020.0002] # BAMUM LETTER PHASE-C MBUAEM +168CD ; [.3984.0020.0002] # BAMUM LETTER PHASE-C LU +168CE ; [.3985.0020.0002] # BAMUM LETTER PHASE-C KUT +168CF ; [.3986.0020.0002] # BAMUM LETTER PHASE-C NJAM +168D0 ; [.3987.0020.0002] # BAMUM LETTER PHASE-C NGOM +168D1 ; [.3988.0020.0002] # BAMUM LETTER PHASE-C WUP +168D2 ; [.3989.0020.0002] # BAMUM LETTER PHASE-C NGGUEET +168D3 ; [.398A.0020.0002] # BAMUM LETTER PHASE-C NSOM +168D4 ; [.398B.0020.0002] # BAMUM LETTER PHASE-C NTEN +168D5 ; [.398C.0020.0002] # BAMUM LETTER PHASE-C KUOP NKAARAE +168D6 ; [.398D.0020.0002] # BAMUM LETTER PHASE-C NSUN +168D7 ; [.398E.0020.0002] # BAMUM LETTER PHASE-C NDAM +168D8 ; [.398F.0020.0002] # BAMUM LETTER PHASE-C MA NSIEE +168D9 ; [.3990.0020.0002] # BAMUM LETTER PHASE-C YAA +168DA ; [.3991.0020.0002] # BAMUM LETTER PHASE-C NDAP +168DB ; [.3992.0020.0002] # BAMUM LETTER PHASE-C SHUEQ +168DC ; [.3993.0020.0002] # BAMUM LETTER PHASE-C SETFON +168DD ; [.3994.0020.0002] # BAMUM LETTER PHASE-C MBI +168DE ; [.3995.0020.0002] # BAMUM LETTER PHASE-C MAEMBA +168DF ; [.3996.0020.0002] # BAMUM LETTER PHASE-C MBANYI +168E0 ; [.3997.0020.0002] # BAMUM LETTER PHASE-C KEUSEUX +168E1 ; [.3998.0020.0002] # BAMUM LETTER PHASE-C MBEUX +168E2 ; [.3999.0020.0002] # BAMUM LETTER PHASE-C KEUM +168E3 ; [.399A.0020.0002] # BAMUM LETTER PHASE-C MBAA PICKET +168E4 ; [.399B.0020.0002] # BAMUM LETTER PHASE-C YUWOQ +168E5 ; [.399C.0020.0002] # BAMUM LETTER PHASE-C NJEUX +168E6 ; [.399D.0020.0002] # BAMUM LETTER PHASE-C MIEE +168E7 ; [.399E.0020.0002] # BAMUM LETTER PHASE-C MUAE +168E8 ; [.399F.0020.0002] # BAMUM LETTER PHASE-C SHIQ +168E9 ; [.39A0.0020.0002] # BAMUM LETTER PHASE-C KEN LAW +168EA ; [.39A1.0020.0002] # BAMUM LETTER PHASE-C KEN FATIGUE +168EB ; [.39A2.0020.0002] # BAMUM LETTER PHASE-C NGAQ +168EC ; [.39A3.0020.0002] # BAMUM LETTER PHASE-C NAQ +168ED ; [.39A4.0020.0002] # BAMUM LETTER PHASE-C LIQ +168EE ; [.39A5.0020.0002] # BAMUM LETTER PHASE-C PIN +168EF ; [.39A6.0020.0002] # BAMUM LETTER PHASE-C PEN +168F0 ; [.39A7.0020.0002] # BAMUM LETTER PHASE-C TET +168F1 ; [.39A8.0020.0002] # BAMUM LETTER PHASE-D MBUO +168F2 ; [.39A9.0020.0002] # BAMUM LETTER PHASE-D WAP +168F3 ; [.39AA.0020.0002] # BAMUM LETTER PHASE-D NJI +168F4 ; [.39AB.0020.0002] # BAMUM LETTER PHASE-D MFON +168F5 ; [.39AC.0020.0002] # BAMUM LETTER PHASE-D NJIEE +168F6 ; [.39AD.0020.0002] # BAMUM LETTER PHASE-D LIEE +168F7 ; [.39AE.0020.0002] # BAMUM LETTER PHASE-D NJEUT +168F8 ; [.39AF.0020.0002] # BAMUM LETTER PHASE-D NSHEE +168F9 ; [.39B0.0020.0002] # BAMUM LETTER PHASE-D NGGAAMAE +168FA ; [.39B1.0020.0002] # BAMUM LETTER PHASE-D NYAM +168FB ; [.39B2.0020.0002] # BAMUM LETTER PHASE-D WUAEN +168FC ; [.39B3.0020.0002] # BAMUM LETTER PHASE-D NGKUN +168FD ; [.39B4.0020.0002] # BAMUM LETTER PHASE-D SHEE +168FE ; [.39B5.0020.0002] # BAMUM LETTER PHASE-D NGKAP +168FF ; [.39B6.0020.0002] # BAMUM LETTER PHASE-D KEUAETMEUN +16900 ; [.39B7.0020.0002] # BAMUM LETTER PHASE-D TEUT +16901 ; [.39B8.0020.0002] # BAMUM LETTER PHASE-D SHEUAE +16902 ; [.39B9.0020.0002] # BAMUM LETTER PHASE-D NJAP +16903 ; [.39BA.0020.0002] # BAMUM LETTER PHASE-D SUE +16904 ; [.39BB.0020.0002] # BAMUM LETTER PHASE-D KET +16905 ; [.39BC.0020.0002] # BAMUM LETTER PHASE-D YAEMMAE +16906 ; [.39BD.0020.0002] # BAMUM LETTER PHASE-D KUOM +16907 ; [.39BE.0020.0002] # BAMUM LETTER PHASE-D SAP +16908 ; [.39BF.0020.0002] # BAMUM LETTER PHASE-D MFEUT +16909 ; [.39C0.0020.0002] # BAMUM LETTER PHASE-D NDEUX +1690A ; [.39C1.0020.0002] # BAMUM LETTER PHASE-D MALEERI +1690B ; [.39C2.0020.0002] # BAMUM LETTER PHASE-D MEUT +1690C ; [.39C3.0020.0002] # BAMUM LETTER PHASE-D SEUAEQ +1690D ; [.39C4.0020.0002] # BAMUM LETTER PHASE-D YEN +1690E ; [.39C5.0020.0002] # BAMUM LETTER PHASE-D NJEUAEM +1690F ; [.39C6.0020.0002] # BAMUM LETTER PHASE-D KEUOT MBUAE +16910 ; [.39C7.0020.0002] # BAMUM LETTER PHASE-D NGKEURI +16911 ; [.39C8.0020.0002] # BAMUM LETTER PHASE-D TU +16912 ; [.39C9.0020.0002] # BAMUM LETTER PHASE-D GHAA +16913 ; [.39CA.0020.0002] # BAMUM LETTER PHASE-D NGKYEE +16914 ; [.39CB.0020.0002] # BAMUM LETTER PHASE-D FEUFEUAET +16915 ; [.39CC.0020.0002] # BAMUM LETTER PHASE-D NDEE +16916 ; [.39CD.0020.0002] # BAMUM LETTER PHASE-D MGBOFUM +16917 ; [.39CE.0020.0002] # BAMUM LETTER PHASE-D LEUAEP +16918 ; [.39CF.0020.0002] # BAMUM LETTER PHASE-D NDON +16919 ; [.39D0.0020.0002] # BAMUM LETTER PHASE-D MONI +1691A ; [.39D1.0020.0002] # BAMUM LETTER PHASE-D MGBEUN +1691B ; [.39D2.0020.0002] # BAMUM LETTER PHASE-D PUUT +1691C ; [.39D3.0020.0002] # BAMUM LETTER PHASE-D MGBIEE +1691D ; [.39D4.0020.0002] # BAMUM LETTER PHASE-D MFO +1691E ; [.39D5.0020.0002] # BAMUM LETTER PHASE-D LUM +1691F ; [.39D6.0020.0002] # BAMUM LETTER PHASE-D NSIEEP +16920 ; [.39D7.0020.0002] # BAMUM LETTER PHASE-D MBAA +16921 ; [.39D8.0020.0002] # BAMUM LETTER PHASE-D KWAET +16922 ; [.39D9.0020.0002] # BAMUM LETTER PHASE-D NYET +16923 ; [.39DA.0020.0002] # BAMUM LETTER PHASE-D TEUAEN +16924 ; [.39DB.0020.0002] # BAMUM LETTER PHASE-D SOT +16925 ; [.39DC.0020.0002] # BAMUM LETTER PHASE-D YUWOQ +16926 ; [.39DD.0020.0002] # BAMUM LETTER PHASE-D KEUM +16927 ; [.39DE.0020.0002] # BAMUM LETTER PHASE-D RAEM +16928 ; [.39DF.0020.0002] # BAMUM LETTER PHASE-D TEEEE +16929 ; [.39E0.0020.0002] # BAMUM LETTER PHASE-D NGKEUAEQ +1692A ; [.39E1.0020.0002] # BAMUM LETTER PHASE-D MFEUAE +1692B ; [.39E2.0020.0002] # BAMUM LETTER PHASE-D NSIEET +1692C ; [.39E3.0020.0002] # BAMUM LETTER PHASE-D KEUP +1692D ; [.39E4.0020.0002] # BAMUM LETTER PHASE-D PIP +1692E ; [.39E5.0020.0002] # BAMUM LETTER PHASE-D PEUTAE +1692F ; [.39E6.0020.0002] # BAMUM LETTER PHASE-D NYUE +16930 ; [.39E7.0020.0002] # BAMUM LETTER PHASE-D LET +16931 ; [.39E8.0020.0002] # BAMUM LETTER PHASE-D NGGAAM +16932 ; [.39E9.0020.0002] # BAMUM LETTER PHASE-D MFIEE +16933 ; [.39EA.0020.0002] # BAMUM LETTER PHASE-D NGGWAEN +16934 ; [.39EB.0020.0002] # BAMUM LETTER PHASE-D YUOM +16935 ; [.39EC.0020.0002] # BAMUM LETTER PHASE-D PAP +16936 ; [.39ED.0020.0002] # BAMUM LETTER PHASE-D YUOP +16937 ; [.39EE.0020.0002] # BAMUM LETTER PHASE-D NDAM +16938 ; [.39EF.0020.0002] # BAMUM LETTER PHASE-D NTEUM +16939 ; [.39F0.0020.0002] # BAMUM LETTER PHASE-D SUAE +1693A ; [.39F1.0020.0002] # BAMUM LETTER PHASE-D KUN +1693B ; [.39F2.0020.0002] # BAMUM LETTER PHASE-D NGGEUX +1693C ; [.39F3.0020.0002] # BAMUM LETTER PHASE-D NGKIEE +1693D ; [.39F4.0020.0002] # BAMUM LETTER PHASE-D TUOT +1693E ; [.39F5.0020.0002] # BAMUM LETTER PHASE-D MEUN +1693F ; [.39F6.0020.0002] # BAMUM LETTER PHASE-D KUQ +16940 ; [.39F7.0020.0002] # BAMUM LETTER PHASE-D NSUM +16941 ; [.39F8.0020.0002] # BAMUM LETTER PHASE-D TEUN +16942 ; [.39F9.0020.0002] # BAMUM LETTER PHASE-D MAENJET +16943 ; [.39FA.0020.0002] # BAMUM LETTER PHASE-D NGGAP +16944 ; [.39FB.0020.0002] # BAMUM LETTER PHASE-D LEUM +16945 ; [.39FC.0020.0002] # BAMUM LETTER PHASE-D NGGUOM +16946 ; [.39FD.0020.0002] # BAMUM LETTER PHASE-D NSHUT +16947 ; [.39FE.0020.0002] # BAMUM LETTER PHASE-D NJUEQ +16948 ; [.39FF.0020.0002] # BAMUM LETTER PHASE-D GHEUAE +16949 ; [.3A00.0020.0002] # BAMUM LETTER PHASE-D KU +1694A ; [.3A01.0020.0002] # BAMUM LETTER PHASE-D REN OLD +1694B ; [.3A02.0020.0002] # BAMUM LETTER PHASE-D TAE +1694C ; [.3A03.0020.0002] # BAMUM LETTER PHASE-D TOQ +1694D ; [.3A04.0020.0002] # BAMUM LETTER PHASE-D NYI +1694E ; [.3A05.0020.0002] # BAMUM LETTER PHASE-D RII +1694F ; [.3A06.0020.0002] # BAMUM LETTER PHASE-D LEEEE +16950 ; [.3A07.0020.0002] # BAMUM LETTER PHASE-D MEEEE +16951 ; [.3A08.0020.0002] # BAMUM LETTER PHASE-D M +16952 ; [.3A09.0020.0002] # BAMUM LETTER PHASE-D SUU +16953 ; [.3A0A.0020.0002] # BAMUM LETTER PHASE-D MU +16954 ; [.3A0B.0020.0002] # BAMUM LETTER PHASE-D SHII +16955 ; [.3A0C.0020.0002] # BAMUM LETTER PHASE-D SHEUX +16956 ; [.3A0D.0020.0002] # BAMUM LETTER PHASE-D KYEE +16957 ; [.3A0E.0020.0002] # BAMUM LETTER PHASE-D NU +16958 ; [.3A0F.0020.0002] # BAMUM LETTER PHASE-D SHU +16959 ; [.3A10.0020.0002] # BAMUM LETTER PHASE-D NTEE +1695A ; [.3A11.0020.0002] # BAMUM LETTER PHASE-D PEE +1695B ; [.3A12.0020.0002] # BAMUM LETTER PHASE-D NI +1695C ; [.3A13.0020.0002] # BAMUM LETTER PHASE-D SHOQ +1695D ; [.3A14.0020.0002] # BAMUM LETTER PHASE-D PUQ +1695E ; [.3A15.0020.0002] # BAMUM LETTER PHASE-D MVOP +1695F ; [.3A16.0020.0002] # BAMUM LETTER PHASE-D LOQ +16960 ; [.3A17.0020.0002] # BAMUM LETTER PHASE-D REN MUCH +16961 ; [.3A18.0020.0002] # BAMUM LETTER PHASE-D TI +16962 ; [.3A19.0020.0002] # BAMUM LETTER PHASE-D NTUU +16963 ; [.3A1A.0020.0002] # BAMUM LETTER PHASE-D MBAA SEVEN +16964 ; [.3A1B.0020.0002] # BAMUM LETTER PHASE-D SAQ +16965 ; [.3A1C.0020.0002] # BAMUM LETTER PHASE-D FAA +16966 ; [.3A1D.0020.0002] # BAMUM LETTER PHASE-E NDAP +16967 ; [.3A1E.0020.0002] # BAMUM LETTER PHASE-E TOON +16968 ; [.3A1F.0020.0002] # BAMUM LETTER PHASE-E MBEUM +16969 ; [.3A20.0020.0002] # BAMUM LETTER PHASE-E LAP +1696A ; [.3A21.0020.0002] # BAMUM LETTER PHASE-E VOM +1696B ; [.3A22.0020.0002] # BAMUM LETTER PHASE-E LOON +1696C ; [.3A23.0020.0002] # BAMUM LETTER PHASE-E PAA +1696D ; [.3A24.0020.0002] # BAMUM LETTER PHASE-E SOM +1696E ; [.3A25.0020.0002] # BAMUM LETTER PHASE-E RAQ +1696F ; [.3A26.0020.0002] # BAMUM LETTER PHASE-E NSHUOP +16970 ; [.3A27.0020.0002] # BAMUM LETTER PHASE-E NDUN +16971 ; [.3A28.0020.0002] # BAMUM LETTER PHASE-E PUAE +16972 ; [.3A29.0020.0002] # BAMUM LETTER PHASE-E TAM +16973 ; [.3A2A.0020.0002] # BAMUM LETTER PHASE-E NGKA +16974 ; [.3A2B.0020.0002] # BAMUM LETTER PHASE-E KPEUX +16975 ; [.3A2C.0020.0002] # BAMUM LETTER PHASE-E WUO +16976 ; [.3A2D.0020.0002] # BAMUM LETTER PHASE-E SEE +16977 ; [.3A2E.0020.0002] # BAMUM LETTER PHASE-E NGGEUAET +16978 ; [.3A2F.0020.0002] # BAMUM LETTER PHASE-E PAAM +16979 ; [.3A30.0020.0002] # BAMUM LETTER PHASE-E TOO +1697A ; [.3A31.0020.0002] # BAMUM LETTER PHASE-E KUOP +1697B ; [.3A32.0020.0002] # BAMUM LETTER PHASE-E LOM +1697C ; [.3A33.0020.0002] # BAMUM LETTER PHASE-E NSHIEE +1697D ; [.3A34.0020.0002] # BAMUM LETTER PHASE-E NGOP +1697E ; [.3A35.0020.0002] # BAMUM LETTER PHASE-E MAEM +1697F ; [.3A36.0020.0002] # BAMUM LETTER PHASE-E NGKEUX +16980 ; [.3A37.0020.0002] # BAMUM LETTER PHASE-E NGOQ +16981 ; [.3A38.0020.0002] # BAMUM LETTER PHASE-E NSHUE +16982 ; [.3A39.0020.0002] # BAMUM LETTER PHASE-E RIMGBA +16983 ; [.3A3A.0020.0002] # BAMUM LETTER PHASE-E NJEUX +16984 ; [.3A3B.0020.0002] # BAMUM LETTER PHASE-E PEEM +16985 ; [.3A3C.0020.0002] # BAMUM LETTER PHASE-E SAA +16986 ; [.3A3D.0020.0002] # BAMUM LETTER PHASE-E NGGURAE +16987 ; [.3A3E.0020.0002] # BAMUM LETTER PHASE-E MGBA +16988 ; [.3A3F.0020.0002] # BAMUM LETTER PHASE-E GHEUX +16989 ; [.3A40.0020.0002] # BAMUM LETTER PHASE-E NGKEUAEM +1698A ; [.3A41.0020.0002] # BAMUM LETTER PHASE-E NJAEMLI +1698B ; [.3A42.0020.0002] # BAMUM LETTER PHASE-E MAP +1698C ; [.3A43.0020.0002] # BAMUM LETTER PHASE-E LOOT +1698D ; [.3A44.0020.0002] # BAMUM LETTER PHASE-E NGGEEEE +1698E ; [.3A45.0020.0002] # BAMUM LETTER PHASE-E NDIQ +1698F ; [.3A46.0020.0002] # BAMUM LETTER PHASE-E TAEN NTEUM +16990 ; [.3A47.0020.0002] # BAMUM LETTER PHASE-E SET +16991 ; [.3A48.0020.0002] # BAMUM LETTER PHASE-E PUM +16992 ; [.3A49.0020.0002] # BAMUM LETTER PHASE-E NDAA SOFTNESS +16993 ; [.3A4A.0020.0002] # BAMUM LETTER PHASE-E NGGUAESHAE NYAM +16994 ; [.3A4B.0020.0002] # BAMUM LETTER PHASE-E YIEE +16995 ; [.3A4C.0020.0002] # BAMUM LETTER PHASE-E GHEUN +16996 ; [.3A4D.0020.0002] # BAMUM LETTER PHASE-E TUAE +16997 ; [.3A4E.0020.0002] # BAMUM LETTER PHASE-E YEUAE +16998 ; [.3A4F.0020.0002] # BAMUM LETTER PHASE-E PO +16999 ; [.3A50.0020.0002] # BAMUM LETTER PHASE-E TUMAE +1699A ; [.3A51.0020.0002] # BAMUM LETTER PHASE-E KEUAE +1699B ; [.3A52.0020.0002] # BAMUM LETTER PHASE-E SUAEN +1699C ; [.3A53.0020.0002] # BAMUM LETTER PHASE-E TEUAEQ +1699D ; [.3A54.0020.0002] # BAMUM LETTER PHASE-E VEUAE +1699E ; [.3A55.0020.0002] # BAMUM LETTER PHASE-E WEUX +1699F ; [.3A56.0020.0002] # BAMUM LETTER PHASE-E LAAM +169A0 ; [.3A57.0020.0002] # BAMUM LETTER PHASE-E PU +169A1 ; [.3A58.0020.0002] # BAMUM LETTER PHASE-E TAAQ +169A2 ; [.3A59.0020.0002] # BAMUM LETTER PHASE-E GHAAMAE +169A3 ; [.3A5A.0020.0002] # BAMUM LETTER PHASE-E NGEUREUT +169A4 ; [.3A5B.0020.0002] # BAMUM LETTER PHASE-E SHEUAEQ +169A5 ; [.3A5C.0020.0002] # BAMUM LETTER PHASE-E MGBEN +169A6 ; [.3A5D.0020.0002] # BAMUM LETTER PHASE-E MBEE +169A7 ; [.3A5E.0020.0002] # BAMUM LETTER PHASE-E NZAQ +169A8 ; [.3A5F.0020.0002] # BAMUM LETTER PHASE-E NKOM +169A9 ; [.3A60.0020.0002] # BAMUM LETTER PHASE-E GBET +169AA ; [.3A61.0020.0002] # BAMUM LETTER PHASE-E TUM +169AB ; [.3A62.0020.0002] # BAMUM LETTER PHASE-E KUET +169AC ; [.3A63.0020.0002] # BAMUM LETTER PHASE-E YAP +169AD ; [.3A64.0020.0002] # BAMUM LETTER PHASE-E NYI CLEAVER +169AE ; [.3A65.0020.0002] # BAMUM LETTER PHASE-E YIT +169AF ; [.3A66.0020.0002] # BAMUM LETTER PHASE-E MFEUQ +169B0 ; [.3A67.0020.0002] # BAMUM LETTER PHASE-E NDIAQ +169B1 ; [.3A68.0020.0002] # BAMUM LETTER PHASE-E PIEEQ +169B2 ; [.3A69.0020.0002] # BAMUM LETTER PHASE-E YUEQ +169B3 ; [.3A6A.0020.0002] # BAMUM LETTER PHASE-E LEUAEM +169B4 ; [.3A6B.0020.0002] # BAMUM LETTER PHASE-E FUE +169B5 ; [.3A6C.0020.0002] # BAMUM LETTER PHASE-E GBEUX +169B6 ; [.3A6D.0020.0002] # BAMUM LETTER PHASE-E NGKUP +169B7 ; [.3A6E.0020.0002] # BAMUM LETTER PHASE-E KET +169B8 ; [.3A6F.0020.0002] # BAMUM LETTER PHASE-E MAE +169B9 ; [.3A70.0020.0002] # BAMUM LETTER PHASE-E NGKAAMI +169BA ; [.3A71.0020.0002] # BAMUM LETTER PHASE-E GHET +169BB ; [.3A72.0020.0002] # BAMUM LETTER PHASE-E FA +169BC ; [.3A73.0020.0002] # BAMUM LETTER PHASE-E NTUM +169BD ; [.3A74.0020.0002] # BAMUM LETTER PHASE-E PEUT +169BE ; [.3A75.0020.0002] # BAMUM LETTER PHASE-E YEUM +169BF ; [.3A76.0020.0002] # BAMUM LETTER PHASE-E NGGEUAE +169C0 ; [.3A77.0020.0002] # BAMUM LETTER PHASE-E NYI BETWEEN +169C1 ; [.3A78.0020.0002] # BAMUM LETTER PHASE-E NZUQ +169C2 ; [.3A79.0020.0002] # BAMUM LETTER PHASE-E POON +169C3 ; [.3A7A.0020.0002] # BAMUM LETTER PHASE-E MIEE +169C4 ; [.3A7B.0020.0002] # BAMUM LETTER PHASE-E FUET +169C5 ; [.3A7C.0020.0002] # BAMUM LETTER PHASE-E NAE +169C6 ; [.3A7D.0020.0002] # BAMUM LETTER PHASE-E MUAE +169C7 ; [.3A7E.0020.0002] # BAMUM LETTER PHASE-E GHEUAE +169C8 ; [.3A7F.0020.0002] # BAMUM LETTER PHASE-E FU I +169C9 ; [.3A80.0020.0002] # BAMUM LETTER PHASE-E MVI +169CA ; [.3A81.0020.0002] # BAMUM LETTER PHASE-E PUAQ +169CB ; [.3A82.0020.0002] # BAMUM LETTER PHASE-E NGKUM +169CC ; [.3A83.0020.0002] # BAMUM LETTER PHASE-E KUT +169CD ; [.3A84.0020.0002] # BAMUM LETTER PHASE-E PIET +169CE ; [.3A85.0020.0002] # BAMUM LETTER PHASE-E NTAP +169CF ; [.3A86.0020.0002] # BAMUM LETTER PHASE-E YEUAET +169D0 ; [.3A87.0020.0002] # BAMUM LETTER PHASE-E NGGUP +169D1 ; [.3A88.0020.0002] # BAMUM LETTER PHASE-E PA PEOPLE +169D2 ; [.3A89.0020.0002] # BAMUM LETTER PHASE-E FU CALL +169D3 ; [.3A8A.0020.0002] # BAMUM LETTER PHASE-E FOM +169D4 ; [.3A8B.0020.0002] # BAMUM LETTER PHASE-E NJEE +169D5 ; [.3A8C.0020.0002] # BAMUM LETTER PHASE-E A +169D6 ; [.3A8D.0020.0002] # BAMUM LETTER PHASE-E TOQ +169D7 ; [.3A8E.0020.0002] # BAMUM LETTER PHASE-E O +169D8 ; [.3A8F.0020.0002] # BAMUM LETTER PHASE-E I +169D9 ; [.3A90.0020.0002] # BAMUM LETTER PHASE-E LAQ +169DA ; [.3A91.0020.0002] # BAMUM LETTER PHASE-E PA PLURAL +169DB ; [.3A92.0020.0002] # BAMUM LETTER PHASE-E TAA +169DC ; [.3A93.0020.0002] # BAMUM LETTER PHASE-E TAQ +169DD ; [.3A94.0020.0002] # BAMUM LETTER PHASE-E NDAA MY HOUSE +169DE ; [.3A95.0020.0002] # BAMUM LETTER PHASE-E SHIQ +169DF ; [.3A96.0020.0002] # BAMUM LETTER PHASE-E YEUX +169E0 ; [.3A97.0020.0002] # BAMUM LETTER PHASE-E NGUAE +169E1 ; [.3A98.0020.0002] # BAMUM LETTER PHASE-E YUAEN +169E2 ; [.3A99.0020.0002] # BAMUM LETTER PHASE-E YOQ SWIMMING +169E3 ; [.3A9A.0020.0002] # BAMUM LETTER PHASE-E YOQ COVER +169E4 ; [.3A9B.0020.0002] # BAMUM LETTER PHASE-E YUQ +169E5 ; [.3A9C.0020.0002] # BAMUM LETTER PHASE-E YUN +169E6 ; [.3A9D.0020.0002] # BAMUM LETTER PHASE-E KEUX +169E7 ; [.3A9E.0020.0002] # BAMUM LETTER PHASE-E PEUX +169E8 ; [.3A9F.0020.0002] # BAMUM LETTER PHASE-E NJEE EPOCH +169E9 ; [.3AA0.0020.0002] # BAMUM LETTER PHASE-E PUE +169EA ; [.3AA1.0020.0002] # BAMUM LETTER PHASE-E WUE +169EB ; [.3AA2.0020.0002] # BAMUM LETTER PHASE-E FEE +169EC ; [.3AA3.0020.0002] # BAMUM LETTER PHASE-E VEE +169ED ; [.3AA4.0020.0002] # BAMUM LETTER PHASE-E LU +169EE ; [.3AA5.0020.0002] # BAMUM LETTER PHASE-E MI +169EF ; [.3AA6.0020.0002] # BAMUM LETTER PHASE-E REUX +169F0 ; [.3AA7.0020.0002] # BAMUM LETTER PHASE-E RAE +169F1 ; [.3AA8.0020.0002] # BAMUM LETTER PHASE-E NGUAET +169F2 ; [.3AA9.0020.0002] # BAMUM LETTER PHASE-E NGA +169F3 ; [.3AAA.0020.0002] # BAMUM LETTER PHASE-E SHO +169F4 ; [.3AAB.0020.0002] # BAMUM LETTER PHASE-E SHOQ +169F5 ; [.3AAC.0020.0002] # BAMUM LETTER PHASE-E FU REMEDY +169F6 ; [.3AAD.0020.0002] # BAMUM LETTER PHASE-E NA +169F7 ; [.3AAE.0020.0002] # BAMUM LETTER PHASE-E PI +169F8 ; [.3AAF.0020.0002] # BAMUM LETTER PHASE-E LOQ +169F9 ; [.3AB0.0020.0002] # BAMUM LETTER PHASE-E KO +169FA ; [.3AB1.0020.0002] # BAMUM LETTER PHASE-E MEN +169FB ; [.3AB2.0020.0002] # BAMUM LETTER PHASE-E MA +169FC ; [.3AB3.0020.0002] # BAMUM LETTER PHASE-E MAQ +169FD ; [.3AB4.0020.0002] # BAMUM LETTER PHASE-E TEU +169FE ; [.3AB5.0020.0002] # BAMUM LETTER PHASE-E KI +169FF ; [.3AB6.0020.0002] # BAMUM LETTER PHASE-E MON +16A00 ; [.3AB7.0020.0002] # BAMUM LETTER PHASE-E TEN +16A01 ; [.3AB8.0020.0002] # BAMUM LETTER PHASE-E FAQ +16A02 ; [.3AB9.0020.0002] # BAMUM LETTER PHASE-E GHOM +16A03 ; [.3ABA.0020.0002] # BAMUM LETTER PHASE-F KA +16A04 ; [.3ABB.0020.0002] # BAMUM LETTER PHASE-F U +16A05 ; [.3ABC.0020.0002] # BAMUM LETTER PHASE-F KU +16A06 ; [.3ABD.0020.0002] # BAMUM LETTER PHASE-F EE +16A07 ; [.3ABE.0020.0002] # BAMUM LETTER PHASE-F REE +16A08 ; [.3ABF.0020.0002] # BAMUM LETTER PHASE-F TAE +16A09 ; [.3AC0.0020.0002] # BAMUM LETTER PHASE-F NYI +16A0A ; [.3AC1.0020.0002] # BAMUM LETTER PHASE-F LA +16A0B ; [.3AC2.0020.0002] # BAMUM LETTER PHASE-F RII +16A0C ; [.3AC3.0020.0002] # BAMUM LETTER PHASE-F RIEE +16A0D ; [.3AC4.0020.0002] # BAMUM LETTER PHASE-F MEEEE +16A0E ; [.3AC5.0020.0002] # BAMUM LETTER PHASE-F TAA +16A0F ; [.3AC6.0020.0002] # BAMUM LETTER PHASE-F NDAA +16A10 ; [.3AC7.0020.0002] # BAMUM LETTER PHASE-F NJAEM +16A11 ; [.3AC8.0020.0002] # BAMUM LETTER PHASE-F M +16A12 ; [.3AC9.0020.0002] # BAMUM LETTER PHASE-F SUU +16A13 ; [.3ACA.0020.0002] # BAMUM LETTER PHASE-F SHII +16A14 ; [.3ACB.0020.0002] # BAMUM LETTER PHASE-F SI +16A15 ; [.3ACC.0020.0002] # BAMUM LETTER PHASE-F SEUX +16A16 ; [.3ACD.0020.0002] # BAMUM LETTER PHASE-F KYEE +16A17 ; [.3ACE.0020.0002] # BAMUM LETTER PHASE-F KET +16A18 ; [.3ACF.0020.0002] # BAMUM LETTER PHASE-F NUAE +16A19 ; [.3AD0.0020.0002] # BAMUM LETTER PHASE-F NU +16A1A ; [.3AD1.0020.0002] # BAMUM LETTER PHASE-F NJUAE +16A1B ; [.3AD2.0020.0002] # BAMUM LETTER PHASE-F YOQ +16A1C ; [.3AD3.0020.0002] # BAMUM LETTER PHASE-F SHU +16A1D ; [.3AD4.0020.0002] # BAMUM LETTER PHASE-F YA +16A1E ; [.3AD5.0020.0002] # BAMUM LETTER PHASE-F NSHA +16A1F ; [.3AD6.0020.0002] # BAMUM LETTER PHASE-F PEUX +16A20 ; [.3AD7.0020.0002] # BAMUM LETTER PHASE-F NTEE +16A21 ; [.3AD8.0020.0002] # BAMUM LETTER PHASE-F WUE +16A22 ; [.3AD9.0020.0002] # BAMUM LETTER PHASE-F PEE +16A23 ; [.3ADA.0020.0002] # BAMUM LETTER PHASE-F RU +16A24 ; [.3ADB.0020.0002] # BAMUM LETTER PHASE-F NI +16A25 ; [.3ADC.0020.0002] # BAMUM LETTER PHASE-F REUX +16A26 ; [.3ADD.0020.0002] # BAMUM LETTER PHASE-F KEN +16A27 ; [.3ADE.0020.0002] # BAMUM LETTER PHASE-F NGKWAEN +16A28 ; [.3ADF.0020.0002] # BAMUM LETTER PHASE-F NGGA +16A29 ; [.3AE0.0020.0002] # BAMUM LETTER PHASE-F SHO +16A2A ; [.3AE1.0020.0002] # BAMUM LETTER PHASE-F PUAE +16A2B ; [.3AE2.0020.0002] # BAMUM LETTER PHASE-F FOM +16A2C ; [.3AE3.0020.0002] # BAMUM LETTER PHASE-F WA +16A2D ; [.3AE4.0020.0002] # BAMUM LETTER PHASE-F LI +16A2E ; [.3AE5.0020.0002] # BAMUM LETTER PHASE-F LOQ +16A2F ; [.3AE6.0020.0002] # BAMUM LETTER PHASE-F KO +16A30 ; [.3AE7.0020.0002] # BAMUM LETTER PHASE-F MBEN +16A31 ; [.3AE8.0020.0002] # BAMUM LETTER PHASE-F REN +16A32 ; [.3AE9.0020.0002] # BAMUM LETTER PHASE-F MA +16A33 ; [.3AEA.0020.0002] # BAMUM LETTER PHASE-F MO +16A34 ; [.3AEB.0020.0002] # BAMUM LETTER PHASE-F MBAA +16A35 ; [.3AEC.0020.0002] # BAMUM LETTER PHASE-F TET +16A36 ; [.3AED.0020.0002] # BAMUM LETTER PHASE-F KPA +16A37 ; [.3AEE.0020.0002] # BAMUM LETTER PHASE-F SAMBA +16A38 ; [.3AEF.0020.0002] # BAMUM LETTER PHASE-F VUEQ +16AD0 ; [.3AF0.0020.0002] # BASSA VAH LETTER ENNI +16AD1 ; [.3AF1.0020.0002] # BASSA VAH LETTER KA +16AD2 ; [.3AF2.0020.0002] # BASSA VAH LETTER SE +16AD3 ; [.3AF3.0020.0002] # BASSA VAH LETTER FA +16AD4 ; [.3AF4.0020.0002] # BASSA VAH LETTER MBE +16AD5 ; [.3AF5.0020.0002] # BASSA VAH LETTER YIE +16AD6 ; [.3AF6.0020.0002] # BASSA VAH LETTER GAH +16AD7 ; [.3AF7.0020.0002] # BASSA VAH LETTER DHII +16AD8 ; [.3AF8.0020.0002] # BASSA VAH LETTER KPAH +16AD9 ; [.3AF9.0020.0002] # BASSA VAH LETTER JO +16ADA ; [.3AFA.0020.0002] # BASSA VAH LETTER HWAH +16ADB ; [.3AFB.0020.0002] # BASSA VAH LETTER WA +16ADC ; [.3AFC.0020.0002] # BASSA VAH LETTER ZO +16ADD ; [.3AFD.0020.0002] # BASSA VAH LETTER GBU +16ADE ; [.3AFE.0020.0002] # BASSA VAH LETTER DO +16ADF ; [.3AFF.0020.0002] # BASSA VAH LETTER CE +16AE0 ; [.3B00.0020.0002] # BASSA VAH LETTER UWU +16AE1 ; [.3B01.0020.0002] # BASSA VAH LETTER TO +16AE2 ; [.3B02.0020.0002] # BASSA VAH LETTER BA +16AE3 ; [.3B03.0020.0002] # BASSA VAH LETTER VU +16AE4 ; [.3B04.0020.0002] # BASSA VAH LETTER YEIN +16AE5 ; [.3B05.0020.0002] # BASSA VAH LETTER PA +16AE6 ; [.3B06.0020.0002] # BASSA VAH LETTER WADDA +16AE7 ; [.3B07.0020.0002] # BASSA VAH LETTER A +16AE8 ; [.3B08.0020.0002] # BASSA VAH LETTER O +16AE9 ; [.3B09.0020.0002] # BASSA VAH LETTER OO +16AEA ; [.3B0A.0020.0002] # BASSA VAH LETTER U +16AEB ; [.3B0B.0020.0002] # BASSA VAH LETTER EE +16AEC ; [.3B0C.0020.0002] # BASSA VAH LETTER E +16AED ; [.3B0D.0020.0002] # BASSA VAH LETTER I +1E800 ; [.3B0E.0020.0002] # MENDE KIKAKUI SYLLABLE M001 KI +1E801 ; [.3B0F.0020.0002] # MENDE KIKAKUI SYLLABLE M002 KA +1E802 ; [.3B10.0020.0002] # MENDE KIKAKUI SYLLABLE M003 KU +1E803 ; [.3B11.0020.0002] # MENDE KIKAKUI SYLLABLE M065 KEE +1E804 ; [.3B12.0020.0002] # MENDE KIKAKUI SYLLABLE M095 KE +1E805 ; [.3B13.0020.0002] # MENDE KIKAKUI SYLLABLE M076 KOO +1E806 ; [.3B14.0020.0002] # MENDE KIKAKUI SYLLABLE M048 KO +1E807 ; [.3B15.0020.0002] # MENDE KIKAKUI SYLLABLE M179 KUA +1E808 ; [.3B16.0020.0002] # MENDE KIKAKUI SYLLABLE M004 WI +1E809 ; [.3B17.0020.0002] # MENDE KIKAKUI SYLLABLE M005 WA +1E80A ; [.3B18.0020.0002] # MENDE KIKAKUI SYLLABLE M006 WU +1E80B ; [.3B19.0020.0002] # MENDE KIKAKUI SYLLABLE M126 WEE +1E80C ; [.3B1A.0020.0002] # MENDE KIKAKUI SYLLABLE M118 WE +1E80D ; [.3B1B.0020.0002] # MENDE KIKAKUI SYLLABLE M114 WOO +1E80E ; [.3B1C.0020.0002] # MENDE KIKAKUI SYLLABLE M045 WO +1E80F ; [.3B1D.0020.0002] # MENDE KIKAKUI SYLLABLE M194 WUI +1E810 ; [.3B1E.0020.0002] # MENDE KIKAKUI SYLLABLE M143 WEI +1E811 ; [.3B1F.0020.0002] # MENDE KIKAKUI SYLLABLE M061 WVI +1E812 ; [.3B20.0020.0002] # MENDE KIKAKUI SYLLABLE M049 WVA +1E813 ; [.3B21.0020.0002] # MENDE KIKAKUI SYLLABLE M139 WVE +1E814 ; [.3B22.0020.0002] # MENDE KIKAKUI SYLLABLE M007 MIN +1E815 ; [.3B23.0020.0002] # MENDE KIKAKUI SYLLABLE M008 MAN +1E816 ; [.3B24.0020.0002] # MENDE KIKAKUI SYLLABLE M009 MUN +1E817 ; [.3B25.0020.0002] # MENDE KIKAKUI SYLLABLE M059 MEN +1E818 ; [.3B26.0020.0002] # MENDE KIKAKUI SYLLABLE M094 MON +1E819 ; [.3B27.0020.0002] # MENDE KIKAKUI SYLLABLE M154 MUAN +1E81A ; [.3B28.0020.0002] # MENDE KIKAKUI SYLLABLE M189 MUEN +1E81B ; [.3B29.0020.0002] # MENDE KIKAKUI SYLLABLE M010 BI +1E81C ; [.3B2A.0020.0002] # MENDE KIKAKUI SYLLABLE M011 BA +1E81D ; [.3B2B.0020.0002] # MENDE KIKAKUI SYLLABLE M012 BU +1E81E ; [.3B2C.0020.0002] # MENDE KIKAKUI SYLLABLE M150 BEE +1E81F ; [.3B2D.0020.0002] # MENDE KIKAKUI SYLLABLE M097 BE +1E820 ; [.3B2E.0020.0002] # MENDE KIKAKUI SYLLABLE M103 BOO +1E821 ; [.3B2F.0020.0002] # MENDE KIKAKUI SYLLABLE M138 BO +1E822 ; [.3B30.0020.0002] # MENDE KIKAKUI SYLLABLE M013 I +1E823 ; [.3B31.0020.0002] # MENDE KIKAKUI SYLLABLE M014 A +1E824 ; [.3B32.0020.0002] # MENDE KIKAKUI SYLLABLE M015 U +1E825 ; [.3B33.0020.0002] # MENDE KIKAKUI SYLLABLE M163 EE +1E826 ; [.3B34.0020.0002] # MENDE KIKAKUI SYLLABLE M100 E +1E827 ; [.3B35.0020.0002] # MENDE KIKAKUI SYLLABLE M165 OO +1E828 ; [.3B36.0020.0002] # MENDE KIKAKUI SYLLABLE M147 O +1E829 ; [.3B37.0020.0002] # MENDE KIKAKUI SYLLABLE M137 EI +1E82A ; [.3B38.0020.0002] # MENDE KIKAKUI SYLLABLE M131 IN +1E82B ; [.3B39.0020.0002] # MENDE KIKAKUI SYLLABLE M135 IN +1E82C ; [.3B3A.0020.0002] # MENDE KIKAKUI SYLLABLE M195 AN +1E82D ; [.3B3B.0020.0002] # MENDE KIKAKUI SYLLABLE M178 EN +1E82E ; [.3B3C.0020.0002] # MENDE KIKAKUI SYLLABLE M019 SI +1E82F ; [.3B3D.0020.0002] # MENDE KIKAKUI SYLLABLE M020 SA +1E830 ; [.3B3E.0020.0002] # MENDE KIKAKUI SYLLABLE M021 SU +1E831 ; [.3B3F.0020.0002] # MENDE KIKAKUI SYLLABLE M162 SEE +1E832 ; [.3B40.0020.0002] # MENDE KIKAKUI SYLLABLE M116 SE +1E833 ; [.3B41.0020.0002] # MENDE KIKAKUI SYLLABLE M136 SOO +1E834 ; [.3B42.0020.0002] # MENDE KIKAKUI SYLLABLE M079 SO +1E835 ; [.3B43.0020.0002] # MENDE KIKAKUI SYLLABLE M196 SIA +1E836 ; [.3B44.0020.0002] # MENDE KIKAKUI SYLLABLE M025 LI +1E837 ; [.3B45.0020.0002] # MENDE KIKAKUI SYLLABLE M026 LA +1E838 ; [.3B46.0020.0002] # MENDE KIKAKUI SYLLABLE M027 LU +1E839 ; [.3B47.0020.0002] # MENDE KIKAKUI SYLLABLE M084 LEE +1E83A ; [.3B48.0020.0002] # MENDE KIKAKUI SYLLABLE M073 LE +1E83B ; [.3B49.0020.0002] # MENDE KIKAKUI SYLLABLE M054 LOO +1E83C ; [.3B4A.0020.0002] # MENDE KIKAKUI SYLLABLE M153 LO +1E83D ; [.3B4B.0020.0002] # MENDE KIKAKUI SYLLABLE M110 LONG LE +1E83E ; [.3B4C.0020.0002] # MENDE KIKAKUI SYLLABLE M016 DI +1E83F ; [.3B4D.0020.0002] # MENDE KIKAKUI SYLLABLE M017 DA +1E840 ; [.3B4E.0020.0002] # MENDE KIKAKUI SYLLABLE M018 DU +1E841 ; [.3B4F.0020.0002] # MENDE KIKAKUI SYLLABLE M089 DEE +1E842 ; [.3B50.0020.0002] # MENDE KIKAKUI SYLLABLE M180 DOO +1E843 ; [.3B51.0020.0002] # MENDE KIKAKUI SYLLABLE M181 DO +1E844 ; [.3B52.0020.0002] # MENDE KIKAKUI SYLLABLE M022 TI +1E845 ; [.3B53.0020.0002] # MENDE KIKAKUI SYLLABLE M023 TA +1E846 ; [.3B54.0020.0002] # MENDE KIKAKUI SYLLABLE M024 TU +1E847 ; [.3B55.0020.0002] # MENDE KIKAKUI SYLLABLE M091 TEE +1E848 ; [.3B56.0020.0002] # MENDE KIKAKUI SYLLABLE M055 TE +1E849 ; [.3B57.0020.0002] # MENDE KIKAKUI SYLLABLE M104 TOO +1E84A ; [.3B58.0020.0002] # MENDE KIKAKUI SYLLABLE M069 TO +1E84B ; [.3B59.0020.0002] # MENDE KIKAKUI SYLLABLE M028 JI +1E84C ; [.3B5A.0020.0002] # MENDE KIKAKUI SYLLABLE M029 JA +1E84D ; [.3B5B.0020.0002] # MENDE KIKAKUI SYLLABLE M030 JU +1E84E ; [.3B5C.0020.0002] # MENDE KIKAKUI SYLLABLE M157 JEE +1E84F ; [.3B5D.0020.0002] # MENDE KIKAKUI SYLLABLE M113 JE +1E850 ; [.3B5E.0020.0002] # MENDE KIKAKUI SYLLABLE M160 JOO +1E851 ; [.3B5F.0020.0002] # MENDE KIKAKUI SYLLABLE M063 JO +1E852 ; [.3B60.0020.0002] # MENDE KIKAKUI SYLLABLE M175 LONG JO +1E853 ; [.3B61.0020.0002] # MENDE KIKAKUI SYLLABLE M031 YI +1E854 ; [.3B62.0020.0002] # MENDE KIKAKUI SYLLABLE M032 YA +1E855 ; [.3B63.0020.0002] # MENDE KIKAKUI SYLLABLE M033 YU +1E856 ; [.3B64.0020.0002] # MENDE KIKAKUI SYLLABLE M109 YEE +1E857 ; [.3B65.0020.0002] # MENDE KIKAKUI SYLLABLE M080 YE +1E858 ; [.3B66.0020.0002] # MENDE KIKAKUI SYLLABLE M141 YOO +1E859 ; [.3B67.0020.0002] # MENDE KIKAKUI SYLLABLE M121 YO +1E85A ; [.3B68.0020.0002] # MENDE KIKAKUI SYLLABLE M034 FI +1E85B ; [.3B69.0020.0002] # MENDE KIKAKUI SYLLABLE M035 FA +1E85C ; [.3B6A.0020.0002] # MENDE KIKAKUI SYLLABLE M036 FU +1E85D ; [.3B6B.0020.0002] # MENDE KIKAKUI SYLLABLE M078 FEE +1E85E ; [.3B6C.0020.0002] # MENDE KIKAKUI SYLLABLE M075 FE +1E85F ; [.3B6D.0020.0002] # MENDE KIKAKUI SYLLABLE M133 FOO +1E860 ; [.3B6E.0020.0002] # MENDE KIKAKUI SYLLABLE M088 FO +1E861 ; [.3B6F.0020.0002] # MENDE KIKAKUI SYLLABLE M197 FUA +1E862 ; [.3B70.0020.0002] # MENDE KIKAKUI SYLLABLE M101 FAN +1E863 ; [.3B71.0020.0002] # MENDE KIKAKUI SYLLABLE M037 NIN +1E864 ; [.3B72.0020.0002] # MENDE KIKAKUI SYLLABLE M038 NAN +1E865 ; [.3B73.0020.0002] # MENDE KIKAKUI SYLLABLE M039 NUN +1E866 ; [.3B74.0020.0002] # MENDE KIKAKUI SYLLABLE M117 NEN +1E867 ; [.3B75.0020.0002] # MENDE KIKAKUI SYLLABLE M169 NON +1E868 ; [.3B76.0020.0002] # MENDE KIKAKUI SYLLABLE M176 HI +1E869 ; [.3B77.0020.0002] # MENDE KIKAKUI SYLLABLE M041 HA +1E86A ; [.3B78.0020.0002] # MENDE KIKAKUI SYLLABLE M186 HU +1E86B ; [.3B79.0020.0002] # MENDE KIKAKUI SYLLABLE M040 HEE +1E86C ; [.3B7A.0020.0002] # MENDE KIKAKUI SYLLABLE M096 HE +1E86D ; [.3B7B.0020.0002] # MENDE KIKAKUI SYLLABLE M042 HOO +1E86E ; [.3B7C.0020.0002] # MENDE KIKAKUI SYLLABLE M140 HO +1E86F ; [.3B7D.0020.0002] # MENDE KIKAKUI SYLLABLE M083 HEEI +1E870 ; [.3B7E.0020.0002] # MENDE KIKAKUI SYLLABLE M128 HOOU +1E871 ; [.3B7F.0020.0002] # MENDE KIKAKUI SYLLABLE M053 HIN +1E872 ; [.3B80.0020.0002] # MENDE KIKAKUI SYLLABLE M130 HAN +1E873 ; [.3B81.0020.0002] # MENDE KIKAKUI SYLLABLE M087 HUN +1E874 ; [.3B82.0020.0002] # MENDE KIKAKUI SYLLABLE M052 HEN +1E875 ; [.3B83.0020.0002] # MENDE KIKAKUI SYLLABLE M193 HON +1E876 ; [.3B84.0020.0002] # MENDE KIKAKUI SYLLABLE M046 HUAN +1E877 ; [.3B85.0020.0002] # MENDE KIKAKUI SYLLABLE M090 NGGI +1E878 ; [.3B86.0020.0002] # MENDE KIKAKUI SYLLABLE M043 NGGA +1E879 ; [.3B87.0020.0002] # MENDE KIKAKUI SYLLABLE M082 NGGU +1E87A ; [.3B88.0020.0002] # MENDE KIKAKUI SYLLABLE M115 NGGEE +1E87B ; [.3B89.0020.0002] # MENDE KIKAKUI SYLLABLE M146 NGGE +1E87C ; [.3B8A.0020.0002] # MENDE KIKAKUI SYLLABLE M156 NGGOO +1E87D ; [.3B8B.0020.0002] # MENDE KIKAKUI SYLLABLE M120 NGGO +1E87E ; [.3B8C.0020.0002] # MENDE KIKAKUI SYLLABLE M159 NGGAA +1E87F ; [.3B8D.0020.0002] # MENDE KIKAKUI SYLLABLE M127 NGGUA +1E880 ; [.3B8E.0020.0002] # MENDE KIKAKUI SYLLABLE M086 LONG NGGE +1E881 ; [.3B8F.0020.0002] # MENDE KIKAKUI SYLLABLE M106 LONG NGGOO +1E882 ; [.3B90.0020.0002] # MENDE KIKAKUI SYLLABLE M183 LONG NGGO +1E883 ; [.3B91.0020.0002] # MENDE KIKAKUI SYLLABLE M155 GI +1E884 ; [.3B92.0020.0002] # MENDE KIKAKUI SYLLABLE M111 GA +1E885 ; [.3B93.0020.0002] # MENDE KIKAKUI SYLLABLE M168 GU +1E886 ; [.3B94.0020.0002] # MENDE KIKAKUI SYLLABLE M190 GEE +1E887 ; [.3B95.0020.0002] # MENDE KIKAKUI SYLLABLE M166 GUEI +1E888 ; [.3B96.0020.0002] # MENDE KIKAKUI SYLLABLE M167 GUAN +1E889 ; [.3B97.0020.0002] # MENDE KIKAKUI SYLLABLE M184 NGEN +1E88A ; [.3B98.0020.0002] # MENDE KIKAKUI SYLLABLE M057 NGON +1E88B ; [.3B99.0020.0002] # MENDE KIKAKUI SYLLABLE M177 NGUAN +1E88C ; [.3B9A.0020.0002] # MENDE KIKAKUI SYLLABLE M068 PI +1E88D ; [.3B9B.0020.0002] # MENDE KIKAKUI SYLLABLE M099 PA +1E88E ; [.3B9C.0020.0002] # MENDE KIKAKUI SYLLABLE M050 PU +1E88F ; [.3B9D.0020.0002] # MENDE KIKAKUI SYLLABLE M081 PEE +1E890 ; [.3B9E.0020.0002] # MENDE KIKAKUI SYLLABLE M051 PE +1E891 ; [.3B9F.0020.0002] # MENDE KIKAKUI SYLLABLE M102 POO +1E892 ; [.3BA0.0020.0002] # MENDE KIKAKUI SYLLABLE M066 PO +1E893 ; [.3BA1.0020.0002] # MENDE KIKAKUI SYLLABLE M145 MBI +1E894 ; [.3BA2.0020.0002] # MENDE KIKAKUI SYLLABLE M062 MBA +1E895 ; [.3BA3.0020.0002] # MENDE KIKAKUI SYLLABLE M122 MBU +1E896 ; [.3BA4.0020.0002] # MENDE KIKAKUI SYLLABLE M047 MBEE +1E897 ; [.3BA5.0020.0002] # MENDE KIKAKUI SYLLABLE M188 MBEE +1E898 ; [.3BA6.0020.0002] # MENDE KIKAKUI SYLLABLE M072 MBE +1E899 ; [.3BA7.0020.0002] # MENDE KIKAKUI SYLLABLE M172 MBOO +1E89A ; [.3BA8.0020.0002] # MENDE KIKAKUI SYLLABLE M174 MBO +1E89B ; [.3BA9.0020.0002] # MENDE KIKAKUI SYLLABLE M187 MBUU +1E89C ; [.3BAA.0020.0002] # MENDE KIKAKUI SYLLABLE M161 LONG MBE +1E89D ; [.3BAB.0020.0002] # MENDE KIKAKUI SYLLABLE M105 LONG MBOO +1E89E ; [.3BAC.0020.0002] # MENDE KIKAKUI SYLLABLE M142 LONG MBO +1E89F ; [.3BAD.0020.0002] # MENDE KIKAKUI SYLLABLE M132 KPI +1E8A0 ; [.3BAE.0020.0002] # MENDE KIKAKUI SYLLABLE M092 KPA +1E8A1 ; [.3BAF.0020.0002] # MENDE KIKAKUI SYLLABLE M074 KPU +1E8A2 ; [.3BB0.0020.0002] # MENDE KIKAKUI SYLLABLE M044 KPEE +1E8A3 ; [.3BB1.0020.0002] # MENDE KIKAKUI SYLLABLE M108 KPE +1E8A4 ; [.3BB2.0020.0002] # MENDE KIKAKUI SYLLABLE M112 KPOO +1E8A5 ; [.3BB3.0020.0002] # MENDE KIKAKUI SYLLABLE M158 KPO +1E8A6 ; [.3BB4.0020.0002] # MENDE KIKAKUI SYLLABLE M124 GBI +1E8A7 ; [.3BB5.0020.0002] # MENDE KIKAKUI SYLLABLE M056 GBA +1E8A8 ; [.3BB6.0020.0002] # MENDE KIKAKUI SYLLABLE M148 GBU +1E8A9 ; [.3BB7.0020.0002] # MENDE KIKAKUI SYLLABLE M093 GBEE +1E8AA ; [.3BB8.0020.0002] # MENDE KIKAKUI SYLLABLE M107 GBE +1E8AB ; [.3BB9.0020.0002] # MENDE KIKAKUI SYLLABLE M071 GBOO +1E8AC ; [.3BBA.0020.0002] # MENDE KIKAKUI SYLLABLE M070 GBO +1E8AD ; [.3BBB.0020.0002] # MENDE KIKAKUI SYLLABLE M171 RA +1E8AE ; [.3BBC.0020.0002] # MENDE KIKAKUI SYLLABLE M123 NDI +1E8AF ; [.3BBD.0020.0002] # MENDE KIKAKUI SYLLABLE M129 NDA +1E8B0 ; [.3BBE.0020.0002] # MENDE KIKAKUI SYLLABLE M125 NDU +1E8B1 ; [.3BBF.0020.0002] # MENDE KIKAKUI SYLLABLE M191 NDEE +1E8B2 ; [.3BC0.0020.0002] # MENDE KIKAKUI SYLLABLE M119 NDE +1E8B3 ; [.3BC1.0020.0002] # MENDE KIKAKUI SYLLABLE M067 NDOO +1E8B4 ; [.3BC2.0020.0002] # MENDE KIKAKUI SYLLABLE M064 NDO +1E8B5 ; [.3BC3.0020.0002] # MENDE KIKAKUI SYLLABLE M152 NJA +1E8B6 ; [.3BC4.0020.0002] # MENDE KIKAKUI SYLLABLE M192 NJU +1E8B7 ; [.3BC5.0020.0002] # MENDE KIKAKUI SYLLABLE M149 NJEE +1E8B8 ; [.3BC6.0020.0002] # MENDE KIKAKUI SYLLABLE M134 NJOO +1E8B9 ; [.3BC7.0020.0002] # MENDE KIKAKUI SYLLABLE M182 VI +1E8BA ; [.3BC8.0020.0002] # MENDE KIKAKUI SYLLABLE M185 VA +1E8BB ; [.3BC9.0020.0002] # MENDE KIKAKUI SYLLABLE M151 VU +1E8BC ; [.3BCA.0020.0002] # MENDE KIKAKUI SYLLABLE M173 VEE +1E8BD ; [.3BCB.0020.0002] # MENDE KIKAKUI SYLLABLE M085 VE +1E8BE ; [.3BCC.0020.0002] # MENDE KIKAKUI SYLLABLE M144 VOO +1E8BF ; [.3BCD.0020.0002] # MENDE KIKAKUI SYLLABLE M077 VO +1E8C0 ; [.3BCE.0020.0002] # MENDE KIKAKUI SYLLABLE M164 NYIN +1E8C1 ; [.3BCF.0020.0002] # MENDE KIKAKUI SYLLABLE M058 NYAN +1E8C2 ; [.3BD0.0020.0002] # MENDE KIKAKUI SYLLABLE M170 NYUN +1E8C3 ; [.3BD1.0020.0002] # MENDE KIKAKUI SYLLABLE M098 NYEN +1E8C4 ; [.3BD2.0020.0002] # MENDE KIKAKUI SYLLABLE M060 NYON +1E922 ; [.3BD3.0020.0002] # ADLAM SMALL LETTER ALIF +1E900 ; [.3BD3.0020.0008] # ADLAM CAPITAL LETTER ALIF +1E923 ; [.3BD4.0020.0002] # ADLAM SMALL LETTER DAALI +1E901 ; [.3BD4.0020.0008] # ADLAM CAPITAL LETTER DAALI +1E924 ; [.3BD5.0020.0002] # ADLAM SMALL LETTER LAAM +1E902 ; [.3BD5.0020.0008] # ADLAM CAPITAL LETTER LAAM +1E925 ; [.3BD6.0020.0002] # ADLAM SMALL LETTER MIIM +1E903 ; [.3BD6.0020.0008] # ADLAM CAPITAL LETTER MIIM +1E926 ; [.3BD7.0020.0002] # ADLAM SMALL LETTER BA +1E904 ; [.3BD7.0020.0008] # ADLAM CAPITAL LETTER BA +1E927 ; [.3BD8.0020.0002] # ADLAM SMALL LETTER SINNYIIYHE +1E905 ; [.3BD8.0020.0008] # ADLAM CAPITAL LETTER SINNYIIYHE +1E928 ; [.3BD9.0020.0002] # ADLAM SMALL LETTER PE +1E906 ; [.3BD9.0020.0008] # ADLAM CAPITAL LETTER PE +1E929 ; [.3BDA.0020.0002] # ADLAM SMALL LETTER BHE +1E907 ; [.3BDA.0020.0008] # ADLAM CAPITAL LETTER BHE +1E92A ; [.3BDB.0020.0002] # ADLAM SMALL LETTER RA +1E908 ; [.3BDB.0020.0008] # ADLAM CAPITAL LETTER RA +1E92B ; [.3BDC.0020.0002] # ADLAM SMALL LETTER E +1E909 ; [.3BDC.0020.0008] # ADLAM CAPITAL LETTER E +1E92C ; [.3BDD.0020.0002] # ADLAM SMALL LETTER FA +1E90A ; [.3BDD.0020.0008] # ADLAM CAPITAL LETTER FA +1E92D ; [.3BDE.0020.0002] # ADLAM SMALL LETTER I +1E90B ; [.3BDE.0020.0008] # ADLAM CAPITAL LETTER I +1E92E ; [.3BDF.0020.0002] # ADLAM SMALL LETTER O +1E90C ; [.3BDF.0020.0008] # ADLAM CAPITAL LETTER O +1E92F ; [.3BE0.0020.0002] # ADLAM SMALL LETTER DHA +1E90D ; [.3BE0.0020.0008] # ADLAM CAPITAL LETTER DHA +1E930 ; [.3BE1.0020.0002] # ADLAM SMALL LETTER YHE +1E90E ; [.3BE1.0020.0008] # ADLAM CAPITAL LETTER YHE +1E931 ; [.3BE2.0020.0002] # ADLAM SMALL LETTER WAW +1E90F ; [.3BE2.0020.0008] # ADLAM CAPITAL LETTER WAW +1E932 ; [.3BE3.0020.0002] # ADLAM SMALL LETTER NUN +1E910 ; [.3BE3.0020.0008] # ADLAM CAPITAL LETTER NUN +1E933 ; [.3BE4.0020.0002] # ADLAM SMALL LETTER KAF +1E911 ; [.3BE4.0020.0008] # ADLAM CAPITAL LETTER KAF +1E934 ; [.3BE5.0020.0002] # ADLAM SMALL LETTER YA +1E912 ; [.3BE5.0020.0008] # ADLAM CAPITAL LETTER YA +1E935 ; [.3BE6.0020.0002] # ADLAM SMALL LETTER U +1E913 ; [.3BE6.0020.0008] # ADLAM CAPITAL LETTER U +1E936 ; [.3BE7.0020.0002] # ADLAM SMALL LETTER JIIM +1E914 ; [.3BE7.0020.0008] # ADLAM CAPITAL LETTER JIIM +1E937 ; [.3BE8.0020.0002] # ADLAM SMALL LETTER CHI +1E915 ; [.3BE8.0020.0008] # ADLAM CAPITAL LETTER CHI +1E938 ; [.3BE9.0020.0002] # ADLAM SMALL LETTER HA +1E916 ; [.3BE9.0020.0008] # ADLAM CAPITAL LETTER HA +1E939 ; [.3BEA.0020.0002] # ADLAM SMALL LETTER QAAF +1E917 ; [.3BEA.0020.0008] # ADLAM CAPITAL LETTER QAAF +1E93A ; [.3BEB.0020.0002] # ADLAM SMALL LETTER GA +1E918 ; [.3BEB.0020.0008] # ADLAM CAPITAL LETTER GA +1E93B ; [.3BEC.0020.0002] # ADLAM SMALL LETTER NYA +1E919 ; [.3BEC.0020.0008] # ADLAM CAPITAL LETTER NYA +1E93C ; [.3BED.0020.0002] # ADLAM SMALL LETTER TU +1E91A ; [.3BED.0020.0008] # ADLAM CAPITAL LETTER TU +1E93D ; [.3BEE.0020.0002] # ADLAM SMALL LETTER NHA +1E91B ; [.3BEE.0020.0008] # ADLAM CAPITAL LETTER NHA +1E93E ; [.3BEF.0020.0002] # ADLAM SMALL LETTER VA +1E91C ; [.3BEF.0020.0008] # ADLAM CAPITAL LETTER VA +1E93F ; [.3BF0.0020.0002] # ADLAM SMALL LETTER KHA +1E91D ; [.3BF0.0020.0008] # ADLAM CAPITAL LETTER KHA +1E940 ; [.3BF1.0020.0002] # ADLAM SMALL LETTER GBE +1E91E ; [.3BF1.0020.0008] # ADLAM CAPITAL LETTER GBE +1E941 ; [.3BF2.0020.0002] # ADLAM SMALL LETTER ZAL +1E91F ; [.3BF2.0020.0008] # ADLAM CAPITAL LETTER ZAL +1E942 ; [.3BF3.0020.0002] # ADLAM SMALL LETTER KPO +1E920 ; [.3BF3.0020.0008] # ADLAM CAPITAL LETTER KPO +1E943 ; [.3BF4.0020.0002] # ADLAM SMALL LETTER SHA +1E921 ; [.3BF4.0020.0008] # ADLAM CAPITAL LETTER SHA +1100 ; [.3BF5.0020.0002] # HANGUL CHOSEONG KIYEOK +3131 ; [.3BF5.0020.0004] # HANGUL LETTER KIYEOK +3200 ; [*0317.0020.0004][.3BF5.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL KIYEOK +3260 ; [.3BF5.0020.0006] # CIRCLED HANGUL KIYEOK +FFA1 ; [.3BF5.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK +320E ; [*0317.0020.0004][.3BF5.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL KIYEOK A +326E ; [.3BF5.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL KIYEOK A +1101 ; [.3BF6.0020.0002] # HANGUL CHOSEONG SSANGKIYEOK +3132 ; [.3BF6.0020.0004] # HANGUL LETTER SSANGKIYEOK +FFA2 ; [.3BF6.0020.0012] # HALFWIDTH HANGUL LETTER SSANGKIYEOK +1102 ; [.3BF7.0020.0002] # HANGUL CHOSEONG NIEUN +3134 ; [.3BF7.0020.0004] # HANGUL LETTER NIEUN +3201 ; [*0317.0020.0004][.3BF7.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL NIEUN +3261 ; [.3BF7.0020.0006] # CIRCLED HANGUL NIEUN +FFA4 ; [.3BF7.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN +320F ; [*0317.0020.0004][.3BF7.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL NIEUN A +326F ; [.3BF7.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL NIEUN A +1103 ; [.3BF8.0020.0002] # HANGUL CHOSEONG TIKEUT +3137 ; [.3BF8.0020.0004] # HANGUL LETTER TIKEUT +3202 ; [*0317.0020.0004][.3BF8.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL TIKEUT +3262 ; [.3BF8.0020.0006] # CIRCLED HANGUL TIKEUT +FFA7 ; [.3BF8.0020.0012] # HALFWIDTH HANGUL LETTER TIKEUT +3210 ; [*0317.0020.0004][.3BF8.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL TIKEUT A +3270 ; [.3BF8.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL TIKEUT A +1104 ; [.3BF9.0020.0002] # HANGUL CHOSEONG SSANGTIKEUT +3138 ; [.3BF9.0020.0004] # HANGUL LETTER SSANGTIKEUT +FFA8 ; [.3BF9.0020.0012] # HALFWIDTH HANGUL LETTER SSANGTIKEUT +1105 ; [.3BFA.0020.0002] # HANGUL CHOSEONG RIEUL +3139 ; [.3BFA.0020.0004] # HANGUL LETTER RIEUL +3203 ; [*0317.0020.0004][.3BFA.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL RIEUL +3263 ; [.3BFA.0020.0006] # CIRCLED HANGUL RIEUL +FFA9 ; [.3BFA.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL +3211 ; [*0317.0020.0004][.3BFA.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL RIEUL A +3271 ; [.3BFA.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL RIEUL A +1106 ; [.3BFB.0020.0002] # HANGUL CHOSEONG MIEUM +3141 ; [.3BFB.0020.0004] # HANGUL LETTER MIEUM +3204 ; [*0317.0020.0004][.3BFB.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL MIEUM +3264 ; [.3BFB.0020.0006] # CIRCLED HANGUL MIEUM +FFB1 ; [.3BFB.0020.0012] # HALFWIDTH HANGUL LETTER MIEUM +3212 ; [*0317.0020.0004][.3BFB.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL MIEUM A +3272 ; [.3BFB.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL MIEUM A +1107 ; [.3BFC.0020.0002] # HANGUL CHOSEONG PIEUP +3142 ; [.3BFC.0020.0004] # HANGUL LETTER PIEUP +3205 ; [*0317.0020.0004][.3BFC.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL PIEUP +3265 ; [.3BFC.0020.0006] # CIRCLED HANGUL PIEUP +FFB2 ; [.3BFC.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP +3213 ; [*0317.0020.0004][.3BFC.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL PIEUP A +3273 ; [.3BFC.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL PIEUP A +1108 ; [.3BFD.0020.0002] # HANGUL CHOSEONG SSANGPIEUP +3143 ; [.3BFD.0020.0004] # HANGUL LETTER SSANGPIEUP +FFB3 ; [.3BFD.0020.0012] # HALFWIDTH HANGUL LETTER SSANGPIEUP +1109 ; [.3BFE.0020.0002] # HANGUL CHOSEONG SIOS +3145 ; [.3BFE.0020.0004] # HANGUL LETTER SIOS +3206 ; [*0317.0020.0004][.3BFE.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL SIOS +3266 ; [.3BFE.0020.0006] # CIRCLED HANGUL SIOS +FFB5 ; [.3BFE.0020.0012] # HALFWIDTH HANGUL LETTER SIOS +3214 ; [*0317.0020.0004][.3BFE.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL SIOS A +3274 ; [.3BFE.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL SIOS A +110A ; [.3BFF.0020.0002] # HANGUL CHOSEONG SSANGSIOS +3146 ; [.3BFF.0020.0004] # HANGUL LETTER SSANGSIOS +FFB6 ; [.3BFF.0020.0012] # HALFWIDTH HANGUL LETTER SSANGSIOS +110B ; [.3C00.0020.0002] # HANGUL CHOSEONG IEUNG +3147 ; [.3C00.0020.0004] # HANGUL LETTER IEUNG +3207 ; [*0317.0020.0004][.3C00.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL IEUNG +3267 ; [.3C00.0020.0006] # CIRCLED HANGUL IEUNG +FFB7 ; [.3C00.0020.0012] # HALFWIDTH HANGUL LETTER IEUNG +3215 ; [*0317.0020.0004][.3C00.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL IEUNG A +3275 ; [.3C00.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL IEUNG A +321D ; [*0317.0020.0004][.3C00.0020.0004][.3C7B.0020.0004][.3C01.0020.0004][.3C77.0020.0004][.3CD4.0020.0004][*0318.0020.0004] # PARENTHESIZED KOREAN CHARACTER OJEON +321E ; [*0317.0020.0004][.3C00.0020.0004][.3C7B.0020.0004][.3C07.0020.0004][.3C80.0020.0004][*0318.0020.0004] # PARENTHESIZED KOREAN CHARACTER O HU +327E ; [.3C00.0020.0006][.3C80.0020.0006] # CIRCLED HANGUL IEUNG U +110C ; [.3C01.0020.0002] # HANGUL CHOSEONG CIEUC +3148 ; [.3C01.0020.0004] # HANGUL LETTER CIEUC +3208 ; [*0317.0020.0004][.3C01.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CIEUC +3268 ; [.3C01.0020.0006] # CIRCLED HANGUL CIEUC +FFB8 ; [.3C01.0020.0012] # HALFWIDTH HANGUL LETTER CIEUC +3216 ; [*0317.0020.0004][.3C01.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CIEUC A +3276 ; [.3C01.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL CIEUC A +321C ; [*0317.0020.0004][.3C01.0020.0004][.3C80.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CIEUC U +327D ; [.3C01.0020.0006][.3C80.0020.0006][.3C00.0020.0006][.3C86.0020.0006] # CIRCLED KOREAN CHARACTER JUEUI +110D ; [.3C02.0020.0002] # HANGUL CHOSEONG SSANGCIEUC +3149 ; [.3C02.0020.0004] # HANGUL LETTER SSANGCIEUC +FFB9 ; [.3C02.0020.0012] # HALFWIDTH HANGUL LETTER SSANGCIEUC +110E ; [.3C03.0020.0002] # HANGUL CHOSEONG CHIEUCH +314A ; [.3C03.0020.0004] # HANGUL LETTER CHIEUCH +3209 ; [*0317.0020.0004][.3C03.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CHIEUCH +3269 ; [.3C03.0020.0006] # CIRCLED HANGUL CHIEUCH +FFBA ; [.3C03.0020.0012] # HALFWIDTH HANGUL LETTER CHIEUCH +3217 ; [*0317.0020.0004][.3C03.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CHIEUCH A +3277 ; [.3C03.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL CHIEUCH A +327C ; [.3C03.0020.0006][.3C73.0020.0006][.3CE0.0020.0006][.3BF5.0020.0006][.3C7B.0020.0006] # CIRCLED KOREAN CHARACTER CHAMKO +110F ; [.3C04.0020.0002] # HANGUL CHOSEONG KHIEUKH +314B ; [.3C04.0020.0004] # HANGUL LETTER KHIEUKH +320A ; [*0317.0020.0004][.3C04.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL KHIEUKH +326A ; [.3C04.0020.0006] # CIRCLED HANGUL KHIEUKH +FFBB ; [.3C04.0020.0012] # HALFWIDTH HANGUL LETTER KHIEUKH +3218 ; [*0317.0020.0004][.3C04.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL KHIEUKH A +3278 ; [.3C04.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL KHIEUKH A +1110 ; [.3C05.0020.0002] # HANGUL CHOSEONG THIEUTH +314C ; [.3C05.0020.0004] # HANGUL LETTER THIEUTH +320B ; [*0317.0020.0004][.3C05.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL THIEUTH +326B ; [.3C05.0020.0006] # CIRCLED HANGUL THIEUTH +FFBC ; [.3C05.0020.0012] # HALFWIDTH HANGUL LETTER THIEUTH +3219 ; [*0317.0020.0004][.3C05.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL THIEUTH A +3279 ; [.3C05.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL THIEUTH A +1111 ; [.3C06.0020.0002] # HANGUL CHOSEONG PHIEUPH +314D ; [.3C06.0020.0004] # HANGUL LETTER PHIEUPH +320C ; [*0317.0020.0004][.3C06.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL PHIEUPH +326C ; [.3C06.0020.0006] # CIRCLED HANGUL PHIEUPH +FFBD ; [.3C06.0020.0012] # HALFWIDTH HANGUL LETTER PHIEUPH +321A ; [*0317.0020.0004][.3C06.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL PHIEUPH A +327A ; [.3C06.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL PHIEUPH A +1112 ; [.3C07.0020.0002] # HANGUL CHOSEONG HIEUH +314E ; [.3C07.0020.0004] # HANGUL LETTER HIEUH +320D ; [*0317.0020.0004][.3C07.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL HIEUH +326D ; [.3C07.0020.0006] # CIRCLED HANGUL HIEUH +FFBE ; [.3C07.0020.0012] # HALFWIDTH HANGUL LETTER HIEUH +321B ; [*0317.0020.0004][.3C07.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL HIEUH A +327B ; [.3C07.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL HIEUH A +1113 ; [.3C08.0020.0002] # HANGUL CHOSEONG NIEUN-KIYEOK +1114 ; [.3C09.0020.0002] # HANGUL CHOSEONG SSANGNIEUN +3165 ; [.3C09.0020.0004] # HANGUL LETTER SSANGNIEUN +1115 ; [.3C0A.0020.0002] # HANGUL CHOSEONG NIEUN-TIKEUT +3166 ; [.3C0A.0020.0004] # HANGUL LETTER NIEUN-TIKEUT +1116 ; [.3C0B.0020.0002] # HANGUL CHOSEONG NIEUN-PIEUP +1117 ; [.3C0C.0020.0002] # HANGUL CHOSEONG TIKEUT-KIYEOK +1118 ; [.3C0D.0020.0002] # HANGUL CHOSEONG RIEUL-NIEUN +1119 ; [.3C0E.0020.0002] # HANGUL CHOSEONG SSANGRIEUL +111A ; [.3C0F.0020.0002] # HANGUL CHOSEONG RIEUL-HIEUH +3140 ; [.3C0F.0020.0004] # HANGUL LETTER RIEUL-HIEUH +FFB0 ; [.3C0F.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH +111B ; [.3C10.0020.0002] # HANGUL CHOSEONG KAPYEOUNRIEUL +111C ; [.3C11.0020.0002] # HANGUL CHOSEONG MIEUM-PIEUP +316E ; [.3C11.0020.0004] # HANGUL LETTER MIEUM-PIEUP +111D ; [.3C12.0020.0002] # HANGUL CHOSEONG KAPYEOUNMIEUM +3171 ; [.3C12.0020.0004] # HANGUL LETTER KAPYEOUNMIEUM +111E ; [.3C13.0020.0002] # HANGUL CHOSEONG PIEUP-KIYEOK +3172 ; [.3C13.0020.0004] # HANGUL LETTER PIEUP-KIYEOK +111F ; [.3C14.0020.0002] # HANGUL CHOSEONG PIEUP-NIEUN +1120 ; [.3C15.0020.0002] # HANGUL CHOSEONG PIEUP-TIKEUT +3173 ; [.3C15.0020.0004] # HANGUL LETTER PIEUP-TIKEUT +1121 ; [.3C16.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS +3144 ; [.3C16.0020.0004] # HANGUL LETTER PIEUP-SIOS +FFB4 ; [.3C16.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP-SIOS +1122 ; [.3C17.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +3174 ; [.3C17.0020.0004] # HANGUL LETTER PIEUP-SIOS-KIYEOK +1123 ; [.3C18.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +3175 ; [.3C18.0020.0004] # HANGUL LETTER PIEUP-SIOS-TIKEUT +1124 ; [.3C19.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP +1125 ; [.3C1A.0020.0002] # HANGUL CHOSEONG PIEUP-SSANGSIOS +1126 ; [.3C1B.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC +1127 ; [.3C1C.0020.0002] # HANGUL CHOSEONG PIEUP-CIEUC +3176 ; [.3C1C.0020.0004] # HANGUL LETTER PIEUP-CIEUC +1128 ; [.3C1D.0020.0002] # HANGUL CHOSEONG PIEUP-CHIEUCH +1129 ; [.3C1E.0020.0002] # HANGUL CHOSEONG PIEUP-THIEUTH +3177 ; [.3C1E.0020.0004] # HANGUL LETTER PIEUP-THIEUTH +112A ; [.3C1F.0020.0002] # HANGUL CHOSEONG PIEUP-PHIEUPH +112B ; [.3C20.0020.0002] # HANGUL CHOSEONG KAPYEOUNPIEUP +3178 ; [.3C20.0020.0004] # HANGUL LETTER KAPYEOUNPIEUP +112C ; [.3C21.0020.0002] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +3179 ; [.3C21.0020.0004] # HANGUL LETTER KAPYEOUNSSANGPIEUP +112D ; [.3C22.0020.0002] # HANGUL CHOSEONG SIOS-KIYEOK +317A ; [.3C22.0020.0004] # HANGUL LETTER SIOS-KIYEOK +112E ; [.3C23.0020.0002] # HANGUL CHOSEONG SIOS-NIEUN +317B ; [.3C23.0020.0004] # HANGUL LETTER SIOS-NIEUN +112F ; [.3C24.0020.0002] # HANGUL CHOSEONG SIOS-TIKEUT +317C ; [.3C24.0020.0004] # HANGUL LETTER SIOS-TIKEUT +1130 ; [.3C25.0020.0002] # HANGUL CHOSEONG SIOS-RIEUL +1131 ; [.3C26.0020.0002] # HANGUL CHOSEONG SIOS-MIEUM +1132 ; [.3C27.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP +317D ; [.3C27.0020.0004] # HANGUL LETTER SIOS-PIEUP +1133 ; [.3C28.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +1134 ; [.3C29.0020.0002] # HANGUL CHOSEONG SIOS-SSANGSIOS +1135 ; [.3C2A.0020.0002] # HANGUL CHOSEONG SIOS-IEUNG +1136 ; [.3C2B.0020.0002] # HANGUL CHOSEONG SIOS-CIEUC +317E ; [.3C2B.0020.0004] # HANGUL LETTER SIOS-CIEUC +1137 ; [.3C2C.0020.0002] # HANGUL CHOSEONG SIOS-CHIEUCH +1138 ; [.3C2D.0020.0002] # HANGUL CHOSEONG SIOS-KHIEUKH +1139 ; [.3C2E.0020.0002] # HANGUL CHOSEONG SIOS-THIEUTH +113A ; [.3C2F.0020.0002] # HANGUL CHOSEONG SIOS-PHIEUPH +113B ; [.3C30.0020.0002] # HANGUL CHOSEONG SIOS-HIEUH +113C ; [.3C31.0020.0002] # HANGUL CHOSEONG CHITUEUMSIOS +113D ; [.3C32.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGSIOS +113E ; [.3C33.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSIOS +113F ; [.3C34.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +1140 ; [.3C35.0020.0002] # HANGUL CHOSEONG PANSIOS +317F ; [.3C35.0020.0004] # HANGUL LETTER PANSIOS +1141 ; [.3C36.0020.0002] # HANGUL CHOSEONG IEUNG-KIYEOK +1142 ; [.3C37.0020.0002] # HANGUL CHOSEONG IEUNG-TIKEUT +1143 ; [.3C38.0020.0002] # HANGUL CHOSEONG IEUNG-MIEUM +1144 ; [.3C39.0020.0002] # HANGUL CHOSEONG IEUNG-PIEUP +1145 ; [.3C3A.0020.0002] # HANGUL CHOSEONG IEUNG-SIOS +1146 ; [.3C3B.0020.0002] # HANGUL CHOSEONG IEUNG-PANSIOS +1147 ; [.3C3C.0020.0002] # HANGUL CHOSEONG SSANGIEUNG +3180 ; [.3C3C.0020.0004] # HANGUL LETTER SSANGIEUNG +1148 ; [.3C3D.0020.0002] # HANGUL CHOSEONG IEUNG-CIEUC +1149 ; [.3C3E.0020.0002] # HANGUL CHOSEONG IEUNG-CHIEUCH +114A ; [.3C3F.0020.0002] # HANGUL CHOSEONG IEUNG-THIEUTH +114B ; [.3C40.0020.0002] # HANGUL CHOSEONG IEUNG-PHIEUPH +114C ; [.3C41.0020.0002] # HANGUL CHOSEONG YESIEUNG +3181 ; [.3C41.0020.0004] # HANGUL LETTER YESIEUNG +114D ; [.3C42.0020.0002] # HANGUL CHOSEONG CIEUC-IEUNG +114E ; [.3C43.0020.0002] # HANGUL CHOSEONG CHITUEUMCIEUC +114F ; [.3C44.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC +1150 ; [.3C45.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCIEUC +1151 ; [.3C46.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +1152 ; [.3C47.0020.0002] # HANGUL CHOSEONG CHIEUCH-KHIEUKH +1153 ; [.3C48.0020.0002] # HANGUL CHOSEONG CHIEUCH-HIEUH +1154 ; [.3C49.0020.0002] # HANGUL CHOSEONG CHITUEUMCHIEUCH +1155 ; [.3C4A.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +1156 ; [.3C4B.0020.0002] # HANGUL CHOSEONG PHIEUPH-PIEUP +1157 ; [.3C4C.0020.0002] # HANGUL CHOSEONG KAPYEOUNPHIEUPH +3184 ; [.3C4C.0020.0004] # HANGUL LETTER KAPYEOUNPHIEUPH +1158 ; [.3C4D.0020.0002] # HANGUL CHOSEONG SSANGHIEUH +3185 ; [.3C4D.0020.0004] # HANGUL LETTER SSANGHIEUH +1159 ; [.3C4E.0020.0002] # HANGUL CHOSEONG YEORINHIEUH +3186 ; [.3C4E.0020.0004] # HANGUL LETTER YEORINHIEUH +115A ; [.3C4F.0020.0002] # HANGUL CHOSEONG KIYEOK-TIKEUT +115B ; [.3C50.0020.0002] # HANGUL CHOSEONG NIEUN-SIOS +115C ; [.3C51.0020.0002] # HANGUL CHOSEONG NIEUN-CIEUC +115D ; [.3C52.0020.0002] # HANGUL CHOSEONG NIEUN-HIEUH +115E ; [.3C53.0020.0002] # HANGUL CHOSEONG TIKEUT-RIEUL +A960 ; [.3C54.0020.0002] # HANGUL CHOSEONG TIKEUT-MIEUM +A961 ; [.3C55.0020.0002] # HANGUL CHOSEONG TIKEUT-PIEUP +A962 ; [.3C56.0020.0002] # HANGUL CHOSEONG TIKEUT-SIOS +A963 ; [.3C57.0020.0002] # HANGUL CHOSEONG TIKEUT-CIEUC +A964 ; [.3C58.0020.0002] # HANGUL CHOSEONG RIEUL-KIYEOK +A965 ; [.3C59.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGKIYEOK +A966 ; [.3C5A.0020.0002] # HANGUL CHOSEONG RIEUL-TIKEUT +A967 ; [.3C5B.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGTIKEUT +A968 ; [.3C5C.0020.0002] # HANGUL CHOSEONG RIEUL-MIEUM +A969 ; [.3C5D.0020.0002] # HANGUL CHOSEONG RIEUL-PIEUP +A96A ; [.3C5E.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGPIEUP +A96B ; [.3C5F.0020.0002] # HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP +A96C ; [.3C60.0020.0002] # HANGUL CHOSEONG RIEUL-SIOS +A96D ; [.3C61.0020.0002] # HANGUL CHOSEONG RIEUL-CIEUC +A96E ; [.3C62.0020.0002] # HANGUL CHOSEONG RIEUL-KHIEUKH +A96F ; [.3C63.0020.0002] # HANGUL CHOSEONG MIEUM-KIYEOK +A970 ; [.3C64.0020.0002] # HANGUL CHOSEONG MIEUM-TIKEUT +A971 ; [.3C65.0020.0002] # HANGUL CHOSEONG MIEUM-SIOS +A972 ; [.3C66.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-THIEUTH +A973 ; [.3C67.0020.0002] # HANGUL CHOSEONG PIEUP-KHIEUKH +A974 ; [.3C68.0020.0002] # HANGUL CHOSEONG PIEUP-HIEUH +A975 ; [.3C69.0020.0002] # HANGUL CHOSEONG SSANGSIOS-PIEUP +A976 ; [.3C6A.0020.0002] # HANGUL CHOSEONG IEUNG-RIEUL +A977 ; [.3C6B.0020.0002] # HANGUL CHOSEONG IEUNG-HIEUH +A978 ; [.3C6C.0020.0002] # HANGUL CHOSEONG SSANGCIEUC-HIEUH +A979 ; [.3C6D.0020.0002] # HANGUL CHOSEONG SSANGTHIEUTH +A97A ; [.3C6E.0020.0002] # HANGUL CHOSEONG PHIEUPH-HIEUH +A97B ; [.3C6F.0020.0002] # HANGUL CHOSEONG HIEUH-SIOS +A97C ; [.3C70.0020.0002] # HANGUL CHOSEONG SSANGYEORINHIEUH +115F ; [.3C71.0020.0002] # HANGUL CHOSEONG FILLER +1160 ; [.3C72.0020.0002] # HANGUL JUNGSEONG FILLER +3164 ; [.3C72.0020.0004] # HANGUL FILLER +FFA0 ; [.3C72.0020.0012] # HALFWIDTH HANGUL FILLER +1161 ; [.3C73.0020.0002] # HANGUL JUNGSEONG A +314F ; [.3C73.0020.0004] # HANGUL LETTER A +FFC2 ; [.3C73.0020.0012] # HALFWIDTH HANGUL LETTER A +1162 ; [.3C74.0020.0002] # HANGUL JUNGSEONG AE +3150 ; [.3C74.0020.0004] # HANGUL LETTER AE +FFC3 ; [.3C74.0020.0012] # HALFWIDTH HANGUL LETTER AE +1163 ; [.3C75.0020.0002] # HANGUL JUNGSEONG YA +3151 ; [.3C75.0020.0004] # HANGUL LETTER YA +FFC4 ; [.3C75.0020.0012] # HALFWIDTH HANGUL LETTER YA +1164 ; [.3C76.0020.0002] # HANGUL JUNGSEONG YAE +3152 ; [.3C76.0020.0004] # HANGUL LETTER YAE +FFC5 ; [.3C76.0020.0012] # HALFWIDTH HANGUL LETTER YAE +1165 ; [.3C77.0020.0002] # HANGUL JUNGSEONG EO +3153 ; [.3C77.0020.0004] # HANGUL LETTER EO +FFC6 ; [.3C77.0020.0012] # HALFWIDTH HANGUL LETTER EO +1166 ; [.3C78.0020.0002] # HANGUL JUNGSEONG E +3154 ; [.3C78.0020.0004] # HANGUL LETTER E +FFC7 ; [.3C78.0020.0012] # HALFWIDTH HANGUL LETTER E +1167 ; [.3C79.0020.0002] # HANGUL JUNGSEONG YEO +3155 ; [.3C79.0020.0004] # HANGUL LETTER YEO +FFCA ; [.3C79.0020.0012] # HALFWIDTH HANGUL LETTER YEO +1168 ; [.3C7A.0020.0002] # HANGUL JUNGSEONG YE +3156 ; [.3C7A.0020.0004] # HANGUL LETTER YE +FFCB ; [.3C7A.0020.0012] # HALFWIDTH HANGUL LETTER YE +1169 ; [.3C7B.0020.0002] # HANGUL JUNGSEONG O +3157 ; [.3C7B.0020.0004] # HANGUL LETTER O +FFCC ; [.3C7B.0020.0012] # HALFWIDTH HANGUL LETTER O +116A ; [.3C7C.0020.0002] # HANGUL JUNGSEONG WA +3158 ; [.3C7C.0020.0004] # HANGUL LETTER WA +FFCD ; [.3C7C.0020.0012] # HALFWIDTH HANGUL LETTER WA +116B ; [.3C7D.0020.0002] # HANGUL JUNGSEONG WAE +3159 ; [.3C7D.0020.0004] # HANGUL LETTER WAE +FFCE ; [.3C7D.0020.0012] # HALFWIDTH HANGUL LETTER WAE +116C ; [.3C7E.0020.0002] # HANGUL JUNGSEONG OE +315A ; [.3C7E.0020.0004] # HANGUL LETTER OE +FFCF ; [.3C7E.0020.0012] # HALFWIDTH HANGUL LETTER OE +116D ; [.3C7F.0020.0002] # HANGUL JUNGSEONG YO +315B ; [.3C7F.0020.0004] # HANGUL LETTER YO +FFD2 ; [.3C7F.0020.0012] # HALFWIDTH HANGUL LETTER YO +116E ; [.3C80.0020.0002] # HANGUL JUNGSEONG U +315C ; [.3C80.0020.0004] # HANGUL LETTER U +FFD3 ; [.3C80.0020.0012] # HALFWIDTH HANGUL LETTER U +116F ; [.3C81.0020.0002] # HANGUL JUNGSEONG WEO +315D ; [.3C81.0020.0004] # HANGUL LETTER WEO +FFD4 ; [.3C81.0020.0012] # HALFWIDTH HANGUL LETTER WEO +1170 ; [.3C82.0020.0002] # HANGUL JUNGSEONG WE +315E ; [.3C82.0020.0004] # HANGUL LETTER WE +FFD5 ; [.3C82.0020.0012] # HALFWIDTH HANGUL LETTER WE +1171 ; [.3C83.0020.0002] # HANGUL JUNGSEONG WI +315F ; [.3C83.0020.0004] # HANGUL LETTER WI +FFD6 ; [.3C83.0020.0012] # HALFWIDTH HANGUL LETTER WI +1172 ; [.3C84.0020.0002] # HANGUL JUNGSEONG YU +3160 ; [.3C84.0020.0004] # HANGUL LETTER YU +FFD7 ; [.3C84.0020.0012] # HALFWIDTH HANGUL LETTER YU +1173 ; [.3C85.0020.0002] # HANGUL JUNGSEONG EU +3161 ; [.3C85.0020.0004] # HANGUL LETTER EU +FFDA ; [.3C85.0020.0012] # HALFWIDTH HANGUL LETTER EU +1174 ; [.3C86.0020.0002] # HANGUL JUNGSEONG YI +3162 ; [.3C86.0020.0004] # HANGUL LETTER YI +FFDB ; [.3C86.0020.0012] # HALFWIDTH HANGUL LETTER YI +1175 ; [.3C87.0020.0002] # HANGUL JUNGSEONG I +3163 ; [.3C87.0020.0004] # HANGUL LETTER I +FFDC ; [.3C87.0020.0012] # HALFWIDTH HANGUL LETTER I +1176 ; [.3C88.0020.0002] # HANGUL JUNGSEONG A-O +1177 ; [.3C89.0020.0002] # HANGUL JUNGSEONG A-U +1178 ; [.3C8A.0020.0002] # HANGUL JUNGSEONG YA-O +1179 ; [.3C8B.0020.0002] # HANGUL JUNGSEONG YA-YO +117A ; [.3C8C.0020.0002] # HANGUL JUNGSEONG EO-O +117B ; [.3C8D.0020.0002] # HANGUL JUNGSEONG EO-U +117C ; [.3C8E.0020.0002] # HANGUL JUNGSEONG EO-EU +117D ; [.3C8F.0020.0002] # HANGUL JUNGSEONG YEO-O +117E ; [.3C90.0020.0002] # HANGUL JUNGSEONG YEO-U +117F ; [.3C91.0020.0002] # HANGUL JUNGSEONG O-EO +1180 ; [.3C92.0020.0002] # HANGUL JUNGSEONG O-E +1181 ; [.3C93.0020.0002] # HANGUL JUNGSEONG O-YE +1182 ; [.3C94.0020.0002] # HANGUL JUNGSEONG O-O +1183 ; [.3C95.0020.0002] # HANGUL JUNGSEONG O-U +1184 ; [.3C96.0020.0002] # HANGUL JUNGSEONG YO-YA +3187 ; [.3C96.0020.0004] # HANGUL LETTER YO-YA +1185 ; [.3C97.0020.0002] # HANGUL JUNGSEONG YO-YAE +3188 ; [.3C97.0020.0004] # HANGUL LETTER YO-YAE +1186 ; [.3C98.0020.0002] # HANGUL JUNGSEONG YO-YEO +1187 ; [.3C99.0020.0002] # HANGUL JUNGSEONG YO-O +1188 ; [.3C9A.0020.0002] # HANGUL JUNGSEONG YO-I +3189 ; [.3C9A.0020.0004] # HANGUL LETTER YO-I +1189 ; [.3C9B.0020.0002] # HANGUL JUNGSEONG U-A +118A ; [.3C9C.0020.0002] # HANGUL JUNGSEONG U-AE +118B ; [.3C9D.0020.0002] # HANGUL JUNGSEONG U-EO-EU +118C ; [.3C9E.0020.0002] # HANGUL JUNGSEONG U-YE +118D ; [.3C9F.0020.0002] # HANGUL JUNGSEONG U-U +118E ; [.3CA0.0020.0002] # HANGUL JUNGSEONG YU-A +118F ; [.3CA1.0020.0002] # HANGUL JUNGSEONG YU-EO +1190 ; [.3CA2.0020.0002] # HANGUL JUNGSEONG YU-E +1191 ; [.3CA3.0020.0002] # HANGUL JUNGSEONG YU-YEO +318A ; [.3CA3.0020.0004] # HANGUL LETTER YU-YEO +1192 ; [.3CA4.0020.0002] # HANGUL JUNGSEONG YU-YE +318B ; [.3CA4.0020.0004] # HANGUL LETTER YU-YE +1193 ; [.3CA5.0020.0002] # HANGUL JUNGSEONG YU-U +1194 ; [.3CA6.0020.0002] # HANGUL JUNGSEONG YU-I +318C ; [.3CA6.0020.0004] # HANGUL LETTER YU-I +1195 ; [.3CA7.0020.0002] # HANGUL JUNGSEONG EU-U +1196 ; [.3CA8.0020.0002] # HANGUL JUNGSEONG EU-EU +1197 ; [.3CA9.0020.0002] # HANGUL JUNGSEONG YI-U +1198 ; [.3CAA.0020.0002] # HANGUL JUNGSEONG I-A +1199 ; [.3CAB.0020.0002] # HANGUL JUNGSEONG I-YA +119A ; [.3CAC.0020.0002] # HANGUL JUNGSEONG I-O +119B ; [.3CAD.0020.0002] # HANGUL JUNGSEONG I-U +119C ; [.3CAE.0020.0002] # HANGUL JUNGSEONG I-EU +119D ; [.3CAF.0020.0002] # HANGUL JUNGSEONG I-ARAEA +119E ; [.3CB0.0020.0002] # HANGUL JUNGSEONG ARAEA +318D ; [.3CB0.0020.0004] # HANGUL LETTER ARAEA +119F ; [.3CB1.0020.0002] # HANGUL JUNGSEONG ARAEA-EO +11A0 ; [.3CB2.0020.0002] # HANGUL JUNGSEONG ARAEA-U +11A1 ; [.3CB3.0020.0002] # HANGUL JUNGSEONG ARAEA-I +318E ; [.3CB3.0020.0004] # HANGUL LETTER ARAEAE +11A2 ; [.3CB4.0020.0002] # HANGUL JUNGSEONG SSANGARAEA +11A3 ; [.3CB5.0020.0002] # HANGUL JUNGSEONG A-EU +11A4 ; [.3CB6.0020.0002] # HANGUL JUNGSEONG YA-U +11A5 ; [.3CB7.0020.0002] # HANGUL JUNGSEONG YEO-YA +11A6 ; [.3CB8.0020.0002] # HANGUL JUNGSEONG O-YA +11A7 ; [.3CB9.0020.0002] # HANGUL JUNGSEONG O-YAE +D7B0 ; [.3CBA.0020.0002] # HANGUL JUNGSEONG O-YEO +D7B1 ; [.3CBB.0020.0002] # HANGUL JUNGSEONG O-O-I +D7B2 ; [.3CBC.0020.0002] # HANGUL JUNGSEONG YO-A +D7B3 ; [.3CBD.0020.0002] # HANGUL JUNGSEONG YO-AE +D7B4 ; [.3CBE.0020.0002] # HANGUL JUNGSEONG YO-EO +D7B5 ; [.3CBF.0020.0002] # HANGUL JUNGSEONG U-YEO +D7B6 ; [.3CC0.0020.0002] # HANGUL JUNGSEONG U-I-I +D7B7 ; [.3CC1.0020.0002] # HANGUL JUNGSEONG YU-AE +D7B8 ; [.3CC2.0020.0002] # HANGUL JUNGSEONG YU-O +D7B9 ; [.3CC3.0020.0002] # HANGUL JUNGSEONG EU-A +D7BA ; [.3CC4.0020.0002] # HANGUL JUNGSEONG EU-EO +D7BB ; [.3CC5.0020.0002] # HANGUL JUNGSEONG EU-E +D7BC ; [.3CC6.0020.0002] # HANGUL JUNGSEONG EU-O +D7BD ; [.3CC7.0020.0002] # HANGUL JUNGSEONG I-YA-O +D7BE ; [.3CC8.0020.0002] # HANGUL JUNGSEONG I-YAE +D7BF ; [.3CC9.0020.0002] # HANGUL JUNGSEONG I-YEO +D7C0 ; [.3CCA.0020.0002] # HANGUL JUNGSEONG I-YE +D7C1 ; [.3CCB.0020.0002] # HANGUL JUNGSEONG I-O-I +D7C2 ; [.3CCC.0020.0002] # HANGUL JUNGSEONG I-YO +D7C3 ; [.3CCD.0020.0002] # HANGUL JUNGSEONG I-YU +D7C4 ; [.3CCE.0020.0002] # HANGUL JUNGSEONG I-I +D7C5 ; [.3CCF.0020.0002] # HANGUL JUNGSEONG ARAEA-A +D7C6 ; [.3CD0.0020.0002] # HANGUL JUNGSEONG ARAEA-E +11A8 ; [.3CD1.0020.0002] # HANGUL JONGSEONG KIYEOK +11A9 ; [.3CD2.0020.0002] # HANGUL JONGSEONG SSANGKIYEOK +11AA ; [.3CD3.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS +3133 ; [.3CD3.0020.0004] # HANGUL LETTER KIYEOK-SIOS +FFA3 ; [.3CD3.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS +11AB ; [.3CD4.0020.0002] # HANGUL JONGSEONG NIEUN +11AC ; [.3CD5.0020.0002] # HANGUL JONGSEONG NIEUN-CIEUC +3135 ; [.3CD5.0020.0004] # HANGUL LETTER NIEUN-CIEUC +FFA5 ; [.3CD5.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC +11AD ; [.3CD6.0020.0002] # HANGUL JONGSEONG NIEUN-HIEUH +3136 ; [.3CD6.0020.0004] # HANGUL LETTER NIEUN-HIEUH +FFA6 ; [.3CD6.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH +11AE ; [.3CD7.0020.0002] # HANGUL JONGSEONG TIKEUT +11AF ; [.3CD8.0020.0002] # HANGUL JONGSEONG RIEUL +11B0 ; [.3CD9.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK +313A ; [.3CD9.0020.0004] # HANGUL LETTER RIEUL-KIYEOK +FFAA ; [.3CD9.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +11B1 ; [.3CDA.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM +313B ; [.3CDA.0020.0004] # HANGUL LETTER RIEUL-MIEUM +FFAB ; [.3CDA.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM +11B2 ; [.3CDB.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP +313C ; [.3CDB.0020.0004] # HANGUL LETTER RIEUL-PIEUP +FFAC ; [.3CDB.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP +11B3 ; [.3CDC.0020.0002] # HANGUL JONGSEONG RIEUL-SIOS +313D ; [.3CDC.0020.0004] # HANGUL LETTER RIEUL-SIOS +FFAD ; [.3CDC.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-SIOS +11B4 ; [.3CDD.0020.0002] # HANGUL JONGSEONG RIEUL-THIEUTH +313E ; [.3CDD.0020.0004] # HANGUL LETTER RIEUL-THIEUTH +FFAE ; [.3CDD.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +11B5 ; [.3CDE.0020.0002] # HANGUL JONGSEONG RIEUL-PHIEUPH +313F ; [.3CDE.0020.0004] # HANGUL LETTER RIEUL-PHIEUPH +FFAF ; [.3CDE.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +11B6 ; [.3CDF.0020.0002] # HANGUL JONGSEONG RIEUL-HIEUH +11B7 ; [.3CE0.0020.0002] # HANGUL JONGSEONG MIEUM +11B8 ; [.3CE1.0020.0002] # HANGUL JONGSEONG PIEUP +11B9 ; [.3CE2.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS +11BA ; [.3CE3.0020.0002] # HANGUL JONGSEONG SIOS +11BB ; [.3CE4.0020.0002] # HANGUL JONGSEONG SSANGSIOS +11BC ; [.3CE5.0020.0002] # HANGUL JONGSEONG IEUNG +11BD ; [.3CE6.0020.0002] # HANGUL JONGSEONG CIEUC +11BE ; [.3CE7.0020.0002] # HANGUL JONGSEONG CHIEUCH +11BF ; [.3CE8.0020.0002] # HANGUL JONGSEONG KHIEUKH +11C0 ; [.3CE9.0020.0002] # HANGUL JONGSEONG THIEUTH +11C1 ; [.3CEA.0020.0002] # HANGUL JONGSEONG PHIEUPH +11C2 ; [.3CEB.0020.0002] # HANGUL JONGSEONG HIEUH +11C3 ; [.3CEC.0020.0002] # HANGUL JONGSEONG KIYEOK-RIEUL +11C4 ; [.3CED.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +11C5 ; [.3CEE.0020.0002] # HANGUL JONGSEONG NIEUN-KIYEOK +11C6 ; [.3CEF.0020.0002] # HANGUL JONGSEONG NIEUN-TIKEUT +11C7 ; [.3CF0.0020.0002] # HANGUL JONGSEONG NIEUN-SIOS +3167 ; [.3CF0.0020.0004] # HANGUL LETTER NIEUN-SIOS +11C8 ; [.3CF1.0020.0002] # HANGUL JONGSEONG NIEUN-PANSIOS +3168 ; [.3CF1.0020.0004] # HANGUL LETTER NIEUN-PANSIOS +11C9 ; [.3CF2.0020.0002] # HANGUL JONGSEONG NIEUN-THIEUTH +11CA ; [.3CF3.0020.0002] # HANGUL JONGSEONG TIKEUT-KIYEOK +11CB ; [.3CF4.0020.0002] # HANGUL JONGSEONG TIKEUT-RIEUL +11CC ; [.3CF5.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +3169 ; [.3CF5.0020.0004] # HANGUL LETTER RIEUL-KIYEOK-SIOS +11CD ; [.3CF6.0020.0002] # HANGUL JONGSEONG RIEUL-NIEUN +11CE ; [.3CF7.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT +316A ; [.3CF7.0020.0004] # HANGUL LETTER RIEUL-TIKEUT +11CF ; [.3CF8.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +11D0 ; [.3CF9.0020.0002] # HANGUL JONGSEONG SSANGRIEUL +11D1 ; [.3CFA.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +11D2 ; [.3CFB.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS +11D3 ; [.3CFC.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS +316B ; [.3CFC.0020.0004] # HANGUL LETTER RIEUL-PIEUP-SIOS +11D4 ; [.3CFD.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +11D5 ; [.3CFE.0020.0002] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +11D6 ; [.3CFF.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGSIOS +11D7 ; [.3D00.0020.0002] # HANGUL JONGSEONG RIEUL-PANSIOS +316C ; [.3D00.0020.0004] # HANGUL LETTER RIEUL-PANSIOS +11D8 ; [.3D01.0020.0002] # HANGUL JONGSEONG RIEUL-KHIEUKH +11D9 ; [.3D02.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH +316D ; [.3D02.0020.0004] # HANGUL LETTER RIEUL-YEORINHIEUH +11DA ; [.3D03.0020.0002] # HANGUL JONGSEONG MIEUM-KIYEOK +11DB ; [.3D04.0020.0002] # HANGUL JONGSEONG MIEUM-RIEUL +11DC ; [.3D05.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP +11DD ; [.3D06.0020.0002] # HANGUL JONGSEONG MIEUM-SIOS +316F ; [.3D06.0020.0004] # HANGUL LETTER MIEUM-SIOS +11DE ; [.3D07.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGSIOS +11DF ; [.3D08.0020.0002] # HANGUL JONGSEONG MIEUM-PANSIOS +3170 ; [.3D08.0020.0004] # HANGUL LETTER MIEUM-PANSIOS +11E0 ; [.3D09.0020.0002] # HANGUL JONGSEONG MIEUM-CHIEUCH +11E1 ; [.3D0A.0020.0002] # HANGUL JONGSEONG MIEUM-HIEUH +11E2 ; [.3D0B.0020.0002] # HANGUL JONGSEONG KAPYEOUNMIEUM +11E3 ; [.3D0C.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL +11E4 ; [.3D0D.0020.0002] # HANGUL JONGSEONG PIEUP-PHIEUPH +11E5 ; [.3D0E.0020.0002] # HANGUL JONGSEONG PIEUP-HIEUH +11E6 ; [.3D0F.0020.0002] # HANGUL JONGSEONG KAPYEOUNPIEUP +11E7 ; [.3D10.0020.0002] # HANGUL JONGSEONG SIOS-KIYEOK +11E8 ; [.3D11.0020.0002] # HANGUL JONGSEONG SIOS-TIKEUT +11E9 ; [.3D12.0020.0002] # HANGUL JONGSEONG SIOS-RIEUL +11EA ; [.3D13.0020.0002] # HANGUL JONGSEONG SIOS-PIEUP +11EB ; [.3D14.0020.0002] # HANGUL JONGSEONG PANSIOS +11EC ; [.3D15.0020.0002] # HANGUL JONGSEONG IEUNG-KIYEOK +11ED ; [.3D16.0020.0002] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK +11EE ; [.3D17.0020.0002] # HANGUL JONGSEONG SSANGIEUNG +11EF ; [.3D18.0020.0002] # HANGUL JONGSEONG IEUNG-KHIEUKH +11F0 ; [.3D19.0020.0002] # HANGUL JONGSEONG YESIEUNG +11F1 ; [.3D1A.0020.0002] # HANGUL JONGSEONG YESIEUNG-SIOS +3182 ; [.3D1A.0020.0004] # HANGUL LETTER YESIEUNG-SIOS +11F2 ; [.3D1B.0020.0002] # HANGUL JONGSEONG YESIEUNG-PANSIOS +3183 ; [.3D1B.0020.0004] # HANGUL LETTER YESIEUNG-PANSIOS +11F3 ; [.3D1C.0020.0002] # HANGUL JONGSEONG PHIEUPH-PIEUP +11F4 ; [.3D1D.0020.0002] # HANGUL JONGSEONG KAPYEOUNPHIEUPH +11F5 ; [.3D1E.0020.0002] # HANGUL JONGSEONG HIEUH-NIEUN +11F6 ; [.3D1F.0020.0002] # HANGUL JONGSEONG HIEUH-RIEUL +11F7 ; [.3D20.0020.0002] # HANGUL JONGSEONG HIEUH-MIEUM +11F8 ; [.3D21.0020.0002] # HANGUL JONGSEONG HIEUH-PIEUP +11F9 ; [.3D22.0020.0002] # HANGUL JONGSEONG YEORINHIEUH +11FA ; [.3D23.0020.0002] # HANGUL JONGSEONG KIYEOK-NIEUN +11FB ; [.3D24.0020.0002] # HANGUL JONGSEONG KIYEOK-PIEUP +11FC ; [.3D25.0020.0002] # HANGUL JONGSEONG KIYEOK-CHIEUCH +11FD ; [.3D26.0020.0002] # HANGUL JONGSEONG KIYEOK-KHIEUKH +11FE ; [.3D27.0020.0002] # HANGUL JONGSEONG KIYEOK-HIEUH +11FF ; [.3D28.0020.0002] # HANGUL JONGSEONG SSANGNIEUN +D7CB ; [.3D29.0020.0002] # HANGUL JONGSEONG NIEUN-RIEUL +D7CC ; [.3D2A.0020.0002] # HANGUL JONGSEONG NIEUN-CHIEUCH +D7CD ; [.3D2B.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT +D7CE ; [.3D2C.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT-PIEUP +D7CF ; [.3D2D.0020.0002] # HANGUL JONGSEONG TIKEUT-PIEUP +D7D0 ; [.3D2E.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS +D7D1 ; [.3D2F.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK +D7D2 ; [.3D30.0020.0002] # HANGUL JONGSEONG TIKEUT-CIEUC +D7D3 ; [.3D31.0020.0002] # HANGUL JONGSEONG TIKEUT-CHIEUCH +D7D4 ; [.3D32.0020.0002] # HANGUL JONGSEONG TIKEUT-THIEUTH +D7D5 ; [.3D33.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGKIYEOK +D7D6 ; [.3D34.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH +D7D7 ; [.3D35.0020.0002] # HANGUL JONGSEONG SSANGRIEUL-KHIEUKH +D7D8 ; [.3D36.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-HIEUH +D7D9 ; [.3D37.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT +D7DA ; [.3D38.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH +D7DB ; [.3D39.0020.0002] # HANGUL JONGSEONG RIEUL-YESIEUNG +D7DC ; [.3D3A.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH +D7DD ; [.3D3B.0020.0002] # HANGUL JONGSEONG KAPYEOUNRIEUL +D7DE ; [.3D3C.0020.0002] # HANGUL JONGSEONG MIEUM-NIEUN +D7DF ; [.3D3D.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGNIEUN +D7E0 ; [.3D3E.0020.0002] # HANGUL JONGSEONG SSANGMIEUM +D7E1 ; [.3D3F.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP-SIOS +D7E2 ; [.3D40.0020.0002] # HANGUL JONGSEONG MIEUM-CIEUC +D7E3 ; [.3D41.0020.0002] # HANGUL JONGSEONG PIEUP-TIKEUT +D7E4 ; [.3D42.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH +D7E5 ; [.3D43.0020.0002] # HANGUL JONGSEONG PIEUP-MIEUM +D7E6 ; [.3D44.0020.0002] # HANGUL JONGSEONG SSANGPIEUP +D7E7 ; [.3D45.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS-TIKEUT +D7E8 ; [.3D46.0020.0002] # HANGUL JONGSEONG PIEUP-CIEUC +D7E9 ; [.3D47.0020.0002] # HANGUL JONGSEONG PIEUP-CHIEUCH +D7EA ; [.3D48.0020.0002] # HANGUL JONGSEONG SIOS-MIEUM +D7EB ; [.3D49.0020.0002] # HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP +D7EC ; [.3D4A.0020.0002] # HANGUL JONGSEONG SSANGSIOS-KIYEOK +D7ED ; [.3D4B.0020.0002] # HANGUL JONGSEONG SSANGSIOS-TIKEUT +D7EE ; [.3D4C.0020.0002] # HANGUL JONGSEONG SIOS-PANSIOS +D7EF ; [.3D4D.0020.0002] # HANGUL JONGSEONG SIOS-CIEUC +D7F0 ; [.3D4E.0020.0002] # HANGUL JONGSEONG SIOS-CHIEUCH +D7F1 ; [.3D4F.0020.0002] # HANGUL JONGSEONG SIOS-THIEUTH +D7F2 ; [.3D50.0020.0002] # HANGUL JONGSEONG SIOS-HIEUH +D7F3 ; [.3D51.0020.0002] # HANGUL JONGSEONG PANSIOS-PIEUP +D7F4 ; [.3D52.0020.0002] # HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP +D7F5 ; [.3D53.0020.0002] # HANGUL JONGSEONG YESIEUNG-MIEUM +D7F6 ; [.3D54.0020.0002] # HANGUL JONGSEONG YESIEUNG-HIEUH +D7F7 ; [.3D55.0020.0002] # HANGUL JONGSEONG CIEUC-PIEUP +D7F8 ; [.3D56.0020.0002] # HANGUL JONGSEONG CIEUC-SSANGPIEUP +D7F9 ; [.3D57.0020.0002] # HANGUL JONGSEONG SSANGCIEUC +D7FA ; [.3D58.0020.0002] # HANGUL JONGSEONG PHIEUPH-SIOS +D7FB ; [.3D59.0020.0002] # HANGUL JONGSEONG PHIEUPH-THIEUTH +3041 ; [.3D5A.0020.000D] # HIRAGANA LETTER SMALL A +3042 ; [.3D5A.0020.000E] # HIRAGANA LETTER A +30A1 ; [.3D5A.0020.000F] # KATAKANA LETTER SMALL A +FF67 ; [.3D5A.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL A +30A2 ; [.3D5A.0020.0011] # KATAKANA LETTER A +FF71 ; [.3D5A.0020.0012] # HALFWIDTH KATAKANA LETTER A +32D0 ; [.3D5A.0020.0013] # CIRCLED KATAKANA A +3303 ; [.3D5A.0020.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE AARU +3300 ; [.3D5A.0020.001C][.3D74.0020.001C][.0000.0038.001C][.1C0E.0020.001C][.3D6E.0020.001C] # SQUARE APAATO +3301 ; [.3D5A.0020.001C][.3D84.0020.001C][.3D76.0020.001C][.3D5A.0020.001C] # SQUARE ARUHUA +3302 ; [.3D5A.0020.001C][.3D8B.0020.001C][.3D77.0020.001C][.0000.0038.001C][.3D5A.0020.001C] # SQUARE ANPEA +3043 ; [.3D5B.0020.000D] # HIRAGANA LETTER SMALL I +3044 ; [.3D5B.0020.000E] # HIRAGANA LETTER I +30A3 ; [.3D5B.0020.000F] # KATAKANA LETTER SMALL I +FF68 ; [.3D5B.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL I +30A4 ; [.3D5B.0020.0011] # KATAKANA LETTER I +FF72 ; [.3D5B.0020.0012] # HALFWIDTH KATAKANA LETTER I +32D1 ; [.3D5B.0020.0013] # CIRCLED KATAKANA I +3304 ; [.3D5B.0020.001C][.3D70.0020.001C][.3D8B.0020.001C][.3D62.0020.001C][.0000.0037.001C] # SQUARE ININGU +3305 ; [.3D5B.0020.001C][.3D8B.0020.001C][.3D6B.0020.001C] # SQUARE INTI +3045 ; [.3D5C.0020.000D] # HIRAGANA LETTER SMALL U +3046 ; [.3D5C.0020.000E] # HIRAGANA LETTER U +30A5 ; [.3D5C.0020.000F] # KATAKANA LETTER SMALL U +FF69 ; [.3D5C.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL U +30A6 ; [.3D5C.0020.0011] # KATAKANA LETTER U +FF73 ; [.3D5C.0020.0012] # HALFWIDTH KATAKANA LETTER U +32D2 ; [.3D5C.0020.0013] # CIRCLED KATAKANA U +3094 ; [.3D5C.0020.000E][.0000.0037.0002] # HIRAGANA LETTER VU +30F4 ; [.3D5C.0020.0011][.0000.0037.0002] # KATAKANA LETTER VU +3306 ; [.3D5C.0020.001C][.3D5F.0020.001C][.3D8B.0020.001C] # SQUARE UON +1B000 ; [.3D5D.0020.0011] # KATAKANA LETTER ARCHAIC E +3047 ; [.3D5E.0020.000D] # HIRAGANA LETTER SMALL E +3048 ; [.3D5E.0020.000E] # HIRAGANA LETTER E +30A7 ; [.3D5E.0020.000F] # KATAKANA LETTER SMALL E +FF6A ; [.3D5E.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL E +30A8 ; [.3D5E.0020.0011] # KATAKANA LETTER E +FF74 ; [.3D5E.0020.0012] # HALFWIDTH KATAKANA LETTER E +32D3 ; [.3D5E.0020.0013] # CIRCLED KATAKANA E +3308 ; [.3D5E.0020.001C][.1C0E.0020.001C][.3D60.0020.001C][.1C0E.0020.001C] # SQUARE EEKAA +3307 ; [.3D5E.0020.001C][.3D67.0020.001C][.3D62.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C][.0000.0037.001C] # SQUARE ESUKUUDO +3049 ; [.3D5F.0020.000D] # HIRAGANA LETTER SMALL O +304A ; [.3D5F.0020.000E] # HIRAGANA LETTER O +30A9 ; [.3D5F.0020.000F] # KATAKANA LETTER SMALL O +FF6B ; [.3D5F.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL O +30AA ; [.3D5F.0020.0011] # KATAKANA LETTER O +FF75 ; [.3D5F.0020.0012] # HALFWIDTH KATAKANA LETTER O +32D4 ; [.3D5F.0020.0013] # CIRCLED KATAKANA O +330A ; [.3D5F.0020.001C][.1C0E.0020.001C][.3D7B.0020.001C] # SQUARE OOMU +3309 ; [.3D5F.0020.001C][.3D8B.0020.001C][.3D67.0020.001C] # SQUARE ONSU +3095 ; [.3D60.0020.000D] # HIRAGANA LETTER SMALL KA +304B ; [.3D60.0020.000E] # HIRAGANA LETTER KA +30F5 ; [.3D60.0020.000F] # KATAKANA LETTER SMALL KA +30AB ; [.3D60.0020.0011] # KATAKANA LETTER KA +FF76 ; [.3D60.0020.0012] # HALFWIDTH KATAKANA LETTER KA +32D5 ; [.3D60.0020.0013] # CIRCLED KATAKANA KA +304C ; [.3D60.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GA +30AC ; [.3D60.0020.0011][.0000.0037.0002] # KATAKANA LETTER GA +330B ; [.3D60.0020.001C][.3D5B.0020.001C][.3D83.0020.001C] # SQUARE KAIRI +330C ; [.3D60.0020.001C][.3D82.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C] # SQUARE KARATTO +330D ; [.3D60.0020.001C][.3D86.0020.001C][.3D83.0020.001C][.1C0E.0020.001C] # SQUARE KARORII +330E ; [.3D60.0020.001C][.0000.0037.001C][.3D86.0020.001C][.3D8B.0020.001C] # SQUARE GARON +330F ; [.3D60.0020.001C][.0000.0037.001C][.3D8B.0020.001C][.3D79.0020.001C] # SQUARE GANMA +304D ; [.3D61.0020.000E] # HIRAGANA LETTER KI +30AD ; [.3D61.0020.0011] # KATAKANA LETTER KI +FF77 ; [.3D61.0020.0012] # HALFWIDTH KATAKANA LETTER KI +32D6 ; [.3D61.0020.0013] # CIRCLED KATAKANA KI +304E ; [.3D61.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GI +30AE ; [.3D61.0020.0011][.0000.0037.0002] # KATAKANA LETTER GI +3310 ; [.3D61.0020.001C][.0000.0037.001C][.3D60.0020.001C][.0000.0037.001C] # SQUARE GIGA +3311 ; [.3D61.0020.001C][.0000.0037.001C][.3D70.0020.001C][.1C0E.0020.001C] # SQUARE GINII +3312 ; [.3D61.0020.001C][.3D7F.0020.001C][.3D83.0020.001C][.1C0E.0020.001C] # SQUARE KYURII +3313 ; [.3D61.0020.001C][.0000.0037.001C][.3D84.0020.001C][.3D6A.0020.001C][.0000.0037.001C][.1C0E.0020.001C] # SQUARE GIRUDAA +3314 ; [.3D61.0020.001C][.3D86.0020.001C] # SQUARE KIRO +3315 ; [.3D61.0020.001C][.3D86.0020.001C][.3D62.0020.001C][.0000.0037.001C][.3D82.0020.001C][.3D7B.0020.001C] # SQUARE KIROGURAMU +3316 ; [.3D61.0020.001C][.3D86.0020.001C][.3D7C.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C][.3D84.0020.001C] # SQUARE KIROMEETORU +3317 ; [.3D61.0020.001C][.3D86.0020.001C][.3D87.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C] # SQUARE KIROWATTO +304F ; [.3D62.0020.000E] # HIRAGANA LETTER KU +31F0 ; [.3D62.0020.000F] # KATAKANA LETTER SMALL KU +30AF ; [.3D62.0020.0011] # KATAKANA LETTER KU +FF78 ; [.3D62.0020.0012] # HALFWIDTH KATAKANA LETTER KU +32D7 ; [.3D62.0020.0013] # CIRCLED KATAKANA KU +3050 ; [.3D62.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GU +30B0 ; [.3D62.0020.0011][.0000.0037.0002] # KATAKANA LETTER GU +3318 ; [.3D62.0020.001C][.0000.0037.001C][.3D82.0020.001C][.3D7B.0020.001C] # SQUARE GURAMU +3319 ; [.3D62.0020.001C][.0000.0037.001C][.3D82.0020.001C][.3D7B.0020.001C][.3D6E.0020.001C][.3D8B.0020.001C] # SQUARE GURAMUTON +331A ; [.3D62.0020.001C][.3D84.0020.001C][.3D68.0020.001C][.0000.0037.001C][.3D5B.0020.001C][.3D86.0020.001C] # SQUARE KURUZEIRO +331B ; [.3D62.0020.001C][.3D86.0020.001C][.1C0E.0020.001C][.3D72.0020.001C] # SQUARE KUROONE +3096 ; [.3D63.0020.000D] # HIRAGANA LETTER SMALL KE +3051 ; [.3D63.0020.000E] # HIRAGANA LETTER KE +30F6 ; [.3D63.0020.000F] # KATAKANA LETTER SMALL KE +30B1 ; [.3D63.0020.0011] # KATAKANA LETTER KE +FF79 ; [.3D63.0020.0012] # HALFWIDTH KATAKANA LETTER KE +32D8 ; [.3D63.0020.0013] # CIRCLED KATAKANA KE +3052 ; [.3D63.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GE +30B2 ; [.3D63.0020.0011][.0000.0037.0002] # KATAKANA LETTER GE +331C ; [.3D63.0020.001C][.1C0E.0020.001C][.3D67.0020.001C] # SQUARE KEESU +3053 ; [.3D64.0020.000E] # HIRAGANA LETTER KO +30B3 ; [.3D64.0020.0011] # KATAKANA LETTER KO +FF7A ; [.3D64.0020.0012] # HALFWIDTH KATAKANA LETTER KO +32D9 ; [.3D64.0020.0013] # CIRCLED KATAKANA KO +3054 ; [.3D64.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GO +30B4 ; [.3D64.0020.0011][.0000.0037.0002] # KATAKANA LETTER GO +331E ; [.3D64.0020.001C][.1C0E.0020.001C][.3D78.0020.001C][.0000.0038.001C] # SQUARE KOOPO +1F201 ; [.3D64.0020.001C][.3D64.0020.001C] # SQUARED KATAKANA KOKO +30FF ; [.3D64.0020.0016][.3D6E.0020.0016] # KATAKANA DIGRAPH KOTO +331D ; [.3D64.0020.001C][.3D84.0020.001C][.3D6F.0020.001C] # SQUARE KORUNA +3055 ; [.3D65.0020.000E] # HIRAGANA LETTER SA +30B5 ; [.3D65.0020.0011] # KATAKANA LETTER SA +FF7B ; [.3D65.0020.0012] # HALFWIDTH KATAKANA LETTER SA +32DA ; [.3D65.0020.0013] # CIRCLED KATAKANA SA +1F202 ; [.3D65.0020.001C] # SQUARED KATAKANA SA +3056 ; [.3D65.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZA +30B6 ; [.3D65.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZA +331F ; [.3D65.0020.001C][.3D5B.0020.001C][.3D62.0020.001C][.3D84.0020.001C] # SQUARE SAIKURU +3320 ; [.3D65.0020.001C][.3D8B.0020.001C][.3D6B.0020.001C][.1C0E.0020.001C][.3D7B.0020.001C] # SQUARE SANTIIMU +3057 ; [.3D66.0020.000E] # HIRAGANA LETTER SI +31F1 ; [.3D66.0020.000F] # KATAKANA LETTER SMALL SI +30B7 ; [.3D66.0020.0011] # KATAKANA LETTER SI +FF7C ; [.3D66.0020.0012] # HALFWIDTH KATAKANA LETTER SI +32DB ; [.3D66.0020.0013] # CIRCLED KATAKANA SI +3058 ; [.3D66.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZI +30B8 ; [.3D66.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZI +3006 ; [.3D66.0020.0004][.3D7C.0020.0004] # IDEOGRAPHIC CLOSING MARK +3321 ; [.3D66.0020.001C][.3D83.0020.001C][.3D8B.0020.001C][.3D62.0020.001C][.0000.0037.001C] # SQUARE SIRINGU +3059 ; [.3D67.0020.000E] # HIRAGANA LETTER SU +31F2 ; [.3D67.0020.000F] # KATAKANA LETTER SMALL SU +30B9 ; [.3D67.0020.0011] # KATAKANA LETTER SU +FF7D ; [.3D67.0020.0012] # HALFWIDTH KATAKANA LETTER SU +32DC ; [.3D67.0020.0013] # CIRCLED KATAKANA SU +305A ; [.3D67.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZU +30BA ; [.3D67.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZU +305B ; [.3D68.0020.000E] # HIRAGANA LETTER SE +30BB ; [.3D68.0020.0011] # KATAKANA LETTER SE +FF7E ; [.3D68.0020.0012] # HALFWIDTH KATAKANA LETTER SE +32DD ; [.3D68.0020.0013] # CIRCLED KATAKANA SE +305C ; [.3D68.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZE +30BC ; [.3D68.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZE +3322 ; [.3D68.0020.001C][.3D8B.0020.001C][.3D6B.0020.001C] # SQUARE SENTI +3323 ; [.3D68.0020.001C][.3D8B.0020.001C][.3D6E.0020.001C] # SQUARE SENTO +305D ; [.3D69.0020.000E] # HIRAGANA LETTER SO +30BD ; [.3D69.0020.0011] # KATAKANA LETTER SO +FF7F ; [.3D69.0020.0012] # HALFWIDTH KATAKANA LETTER SO +32DE ; [.3D69.0020.0013] # CIRCLED KATAKANA SO +305E ; [.3D69.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZO +30BE ; [.3D69.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZO +305F ; [.3D6A.0020.000E] # HIRAGANA LETTER TA +30BF ; [.3D6A.0020.0011] # KATAKANA LETTER TA +FF80 ; [.3D6A.0020.0012] # HALFWIDTH KATAKANA LETTER TA +32DF ; [.3D6A.0020.0013] # CIRCLED KATAKANA TA +3060 ; [.3D6A.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DA +30C0 ; [.3D6A.0020.0011][.0000.0037.0002] # KATAKANA LETTER DA +3324 ; [.3D6A.0020.001C][.0000.0037.001C][.1C0E.0020.001C][.3D67.0020.001C] # SQUARE DAASU +3061 ; [.3D6B.0020.000E] # HIRAGANA LETTER TI +30C1 ; [.3D6B.0020.0011] # KATAKANA LETTER TI +FF81 ; [.3D6B.0020.0012] # HALFWIDTH KATAKANA LETTER TI +32E0 ; [.3D6B.0020.0013] # CIRCLED KATAKANA TI +3062 ; [.3D6B.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DI +30C2 ; [.3D6B.0020.0011][.0000.0037.0002] # KATAKANA LETTER DI +3063 ; [.3D6C.0020.000D] # HIRAGANA LETTER SMALL TU +3064 ; [.3D6C.0020.000E] # HIRAGANA LETTER TU +30C3 ; [.3D6C.0020.000F] # KATAKANA LETTER SMALL TU +FF6F ; [.3D6C.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL TU +30C4 ; [.3D6C.0020.0011] # KATAKANA LETTER TU +FF82 ; [.3D6C.0020.0012] # HALFWIDTH KATAKANA LETTER TU +32E1 ; [.3D6C.0020.0013] # CIRCLED KATAKANA TU +3065 ; [.3D6C.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DU +30C5 ; [.3D6C.0020.0011][.0000.0037.0002] # KATAKANA LETTER DU +3066 ; [.3D6D.0020.000E] # HIRAGANA LETTER TE +30C6 ; [.3D6D.0020.0011] # KATAKANA LETTER TE +FF83 ; [.3D6D.0020.0012] # HALFWIDTH KATAKANA LETTER TE +32E2 ; [.3D6D.0020.0013] # CIRCLED KATAKANA TE +3067 ; [.3D6D.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DE +30C7 ; [.3D6D.0020.0011][.0000.0037.0002] # KATAKANA LETTER DE +1F213 ; [.3D6D.0020.001C][.0000.0037.001C] # SQUARED KATAKANA DE +3325 ; [.3D6D.0020.001C][.0000.0037.001C][.3D66.0020.001C] # SQUARE DESI +3068 ; [.3D6E.0020.000E] # HIRAGANA LETTER TO +31F3 ; [.3D6E.0020.000F] # KATAKANA LETTER SMALL TO +30C8 ; [.3D6E.0020.0011] # KATAKANA LETTER TO +FF84 ; [.3D6E.0020.0012] # HALFWIDTH KATAKANA LETTER TO +32E3 ; [.3D6E.0020.0013] # CIRCLED KATAKANA TO +3069 ; [.3D6E.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DO +30C9 ; [.3D6E.0020.0011][.0000.0037.0002] # KATAKANA LETTER DO +3326 ; [.3D6E.0020.001C][.0000.0037.001C][.3D84.0020.001C] # SQUARE DORU +3327 ; [.3D6E.0020.001C][.3D8B.0020.001C] # SQUARE TON +306A ; [.3D6F.0020.000E] # HIRAGANA LETTER NA +30CA ; [.3D6F.0020.0011] # KATAKANA LETTER NA +FF85 ; [.3D6F.0020.0012] # HALFWIDTH KATAKANA LETTER NA +32E4 ; [.3D6F.0020.0013] # CIRCLED KATAKANA NA +3328 ; [.3D6F.0020.001C][.3D73.0020.001C] # SQUARE NANO +306B ; [.3D70.0020.000E] # HIRAGANA LETTER NI +30CB ; [.3D70.0020.0011] # KATAKANA LETTER NI +FF86 ; [.3D70.0020.0012] # HALFWIDTH KATAKANA LETTER NI +32E5 ; [.3D70.0020.0013] # CIRCLED KATAKANA NI +306C ; [.3D71.0020.000E] # HIRAGANA LETTER NU +31F4 ; [.3D71.0020.000F] # KATAKANA LETTER SMALL NU +30CC ; [.3D71.0020.0011] # KATAKANA LETTER NU +FF87 ; [.3D71.0020.0012] # HALFWIDTH KATAKANA LETTER NU +32E6 ; [.3D71.0020.0013] # CIRCLED KATAKANA NU +306D ; [.3D72.0020.000E] # HIRAGANA LETTER NE +30CD ; [.3D72.0020.0011] # KATAKANA LETTER NE +FF88 ; [.3D72.0020.0012] # HALFWIDTH KATAKANA LETTER NE +32E7 ; [.3D72.0020.0013] # CIRCLED KATAKANA NE +306E ; [.3D73.0020.000E] # HIRAGANA LETTER NO +30CE ; [.3D73.0020.0011] # KATAKANA LETTER NO +FF89 ; [.3D73.0020.0012] # HALFWIDTH KATAKANA LETTER NO +32E8 ; [.3D73.0020.0013] # CIRCLED KATAKANA NO +3329 ; [.3D73.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C] # SQUARE NOTTO +306F ; [.3D74.0020.000E] # HIRAGANA LETTER HA +31F5 ; [.3D74.0020.000F] # KATAKANA LETTER SMALL HA +30CF ; [.3D74.0020.0011] # KATAKANA LETTER HA +FF8A ; [.3D74.0020.0012] # HALFWIDTH KATAKANA LETTER HA +32E9 ; [.3D74.0020.0013] # CIRCLED KATAKANA HA +3070 ; [.3D74.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BA +30D0 ; [.3D74.0020.0011][.0000.0037.0002] # KATAKANA LETTER BA +3071 ; [.3D74.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PA +30D1 ; [.3D74.0020.0011][.0000.0038.0002] # KATAKANA LETTER PA +332B ; [.3D74.0020.001C][.0000.0038.001C][.1C0E.0020.001C][.3D68.0020.001C][.3D8B.0020.001C][.3D6E.0020.001C] # SQUARE PAASENTO +332C ; [.3D74.0020.001C][.0000.0038.001C][.1C0E.0020.001C][.3D6C.0020.001C] # SQUARE PAATU +332D ; [.3D74.0020.001C][.0000.0037.001C][.1C0E.0020.001C][.3D85.0020.001C][.3D84.0020.001C] # SQUARE BAARERU +332A ; [.3D74.0020.001C][.3D5B.0020.001C][.3D6C.0020.001C] # SQUARE HAITU +3072 ; [.3D75.0020.000E] # HIRAGANA LETTER HI +31F6 ; [.3D75.0020.000F] # KATAKANA LETTER SMALL HI +30D2 ; [.3D75.0020.0011] # KATAKANA LETTER HI +FF8B ; [.3D75.0020.0012] # HALFWIDTH KATAKANA LETTER HI +32EA ; [.3D75.0020.0013] # CIRCLED KATAKANA HI +3073 ; [.3D75.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BI +30D3 ; [.3D75.0020.0011][.0000.0037.0002] # KATAKANA LETTER BI +3074 ; [.3D75.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PI +30D4 ; [.3D75.0020.0011][.0000.0038.0002] # KATAKANA LETTER PI +332E ; [.3D75.0020.001C][.0000.0038.001C][.3D5A.0020.001C][.3D67.0020.001C][.3D6E.0020.001C][.3D84.0020.001C] # SQUARE PIASUTORU +332F ; [.3D75.0020.001C][.0000.0038.001C][.3D62.0020.001C][.3D84.0020.001C] # SQUARE PIKURU +3330 ; [.3D75.0020.001C][.0000.0038.001C][.3D64.0020.001C] # SQUARE PIKO +3331 ; [.3D75.0020.001C][.0000.0037.001C][.3D84.0020.001C] # SQUARE BIRU +3075 ; [.3D76.0020.000E] # HIRAGANA LETTER HU +31F7 ; [.3D76.0020.000F] # KATAKANA LETTER SMALL HU +30D5 ; [.3D76.0020.0011] # KATAKANA LETTER HU +FF8C ; [.3D76.0020.0012] # HALFWIDTH KATAKANA LETTER HU +32EB ; [.3D76.0020.0013] # CIRCLED KATAKANA HU +3076 ; [.3D76.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BU +30D6 ; [.3D76.0020.0011][.0000.0037.0002] # KATAKANA LETTER BU +3077 ; [.3D76.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PU +30D7 ; [.3D76.0020.0011][.0000.0038.0002] # KATAKANA LETTER PU +3332 ; [.3D76.0020.001C][.3D5A.0020.001C][.3D82.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C][.0000.0037.001C] # SQUARE HUARADDO +3333 ; [.3D76.0020.001C][.3D5B.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C] # SQUARE HUIITO +3334 ; [.3D76.0020.001C][.0000.0037.001C][.3D6C.0020.001C][.3D66.0020.001C][.3D5E.0020.001C][.3D84.0020.001C] # SQUARE BUSSYERU +3335 ; [.3D76.0020.001C][.3D82.0020.001C][.3D8B.0020.001C] # SQUARE HURAN +3078 ; [.3D77.0020.000E] # HIRAGANA LETTER HE +31F8 ; [.3D77.0020.000F] # KATAKANA LETTER SMALL HE +30D8 ; [.3D77.0020.0011] # KATAKANA LETTER HE +FF8D ; [.3D77.0020.0012] # HALFWIDTH KATAKANA LETTER HE +32EC ; [.3D77.0020.0013] # CIRCLED KATAKANA HE +3079 ; [.3D77.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BE +30D9 ; [.3D77.0020.0011][.0000.0037.0002] # KATAKANA LETTER BE +307A ; [.3D77.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PE +30DA ; [.3D77.0020.0011][.0000.0038.0002] # KATAKANA LETTER PE +333B ; [.3D77.0020.001C][.0000.0038.001C][.1C0E.0020.001C][.3D66.0020.001C][.0000.0037.001C] # SQUARE PEEZI +333C ; [.3D77.0020.001C][.0000.0037.001C][.1C0E.0020.001C][.3D6A.0020.001C] # SQUARE BEETA +3336 ; [.3D77.0020.001C][.3D62.0020.001C][.3D6A.0020.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE HEKUTAARU +3337 ; [.3D77.0020.001C][.0000.0038.001C][.3D69.0020.001C] # SQUARE PESO +3338 ; [.3D77.0020.001C][.0000.0038.001C][.3D70.0020.001C][.3D75.0020.001C] # SQUARE PENIHI +3339 ; [.3D77.0020.001C][.3D84.0020.001C][.3D6C.0020.001C] # SQUARE HERUTU +333A ; [.3D77.0020.001C][.0000.0038.001C][.3D8B.0020.001C][.3D67.0020.001C] # SQUARE PENSU +307B ; [.3D78.0020.000E] # HIRAGANA LETTER HO +31F9 ; [.3D78.0020.000F] # KATAKANA LETTER SMALL HO +30DB ; [.3D78.0020.0011] # KATAKANA LETTER HO +FF8E ; [.3D78.0020.0012] # HALFWIDTH KATAKANA LETTER HO +32ED ; [.3D78.0020.0013] # CIRCLED KATAKANA HO +307C ; [.3D78.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BO +30DC ; [.3D78.0020.0011][.0000.0037.0002] # KATAKANA LETTER BO +307D ; [.3D78.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PO +30DD ; [.3D78.0020.0011][.0000.0038.0002] # KATAKANA LETTER PO +3341 ; [.3D78.0020.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE HOORU +3342 ; [.3D78.0020.001C][.1C0E.0020.001C][.3D8B.0020.001C] # SQUARE HOON +333D ; [.3D78.0020.001C][.0000.0038.001C][.3D5B.0020.001C][.3D8B.0020.001C][.3D6E.0020.001C] # SQUARE POINTO +1F200 ; [.3D78.0020.001C][.3D60.0020.001C] # SQUARE HIRAGANA HOKA +333E ; [.3D78.0020.001C][.0000.0037.001C][.3D84.0020.001C][.3D6E.0020.001C] # SQUARE BORUTO +333F ; [.3D78.0020.001C][.3D8B.0020.001C] # SQUARE HON +3340 ; [.3D78.0020.001C][.0000.0038.001C][.3D8B.0020.001C][.3D6E.0020.001C][.0000.0037.001C] # SQUARE PONDO +307E ; [.3D79.0020.000E] # HIRAGANA LETTER MA +30DE ; [.3D79.0020.0011] # KATAKANA LETTER MA +FF8F ; [.3D79.0020.0012] # HALFWIDTH KATAKANA LETTER MA +32EE ; [.3D79.0020.0013] # CIRCLED KATAKANA MA +3343 ; [.3D79.0020.001C][.3D5B.0020.001C][.3D62.0020.001C][.3D86.0020.001C] # SQUARE MAIKURO +3344 ; [.3D79.0020.001C][.3D5B.0020.001C][.3D84.0020.001C] # SQUARE MAIRU +303C ; [.3D79.0020.0004][.3D67.0020.0004] # MASU MARK +3345 ; [.3D79.0020.001C][.3D6C.0020.001C][.3D74.0020.001C] # SQUARE MAHHA +3346 ; [.3D79.0020.001C][.3D84.0020.001C][.3D62.0020.001C] # SQUARE MARUKU +3347 ; [.3D79.0020.001C][.3D8B.0020.001C][.3D66.0020.001C][.3D81.0020.001C][.3D8B.0020.001C] # SQUARE MANSYON +307F ; [.3D7A.0020.000E] # HIRAGANA LETTER MI +30DF ; [.3D7A.0020.0011] # KATAKANA LETTER MI +FF90 ; [.3D7A.0020.0012] # HALFWIDTH KATAKANA LETTER MI +32EF ; [.3D7A.0020.0013] # CIRCLED KATAKANA MI +3348 ; [.3D7A.0020.001C][.3D62.0020.001C][.3D86.0020.001C][.3D8B.0020.001C] # SQUARE MIKURON +3349 ; [.3D7A.0020.001C][.3D83.0020.001C] # SQUARE MIRI +334A ; [.3D7A.0020.001C][.3D83.0020.001C][.3D74.0020.001C][.0000.0037.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE MIRIBAARU +3080 ; [.3D7B.0020.000E] # HIRAGANA LETTER MU +31FA ; [.3D7B.0020.000F] # KATAKANA LETTER SMALL MU +30E0 ; [.3D7B.0020.0011] # KATAKANA LETTER MU +FF91 ; [.3D7B.0020.0012] # HALFWIDTH KATAKANA LETTER MU +32F0 ; [.3D7B.0020.0013] # CIRCLED KATAKANA MU +3081 ; [.3D7C.0020.000E] # HIRAGANA LETTER ME +30E1 ; [.3D7C.0020.0011] # KATAKANA LETTER ME +FF92 ; [.3D7C.0020.0012] # HALFWIDTH KATAKANA LETTER ME +32F1 ; [.3D7C.0020.0013] # CIRCLED KATAKANA ME +334D ; [.3D7C.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C][.3D84.0020.001C] # SQUARE MEETORU +334B ; [.3D7C.0020.001C][.3D60.0020.001C][.0000.0037.001C] # SQUARE MEGA +334C ; [.3D7C.0020.001C][.3D60.0020.001C][.0000.0037.001C][.3D6E.0020.001C][.3D8B.0020.001C] # SQUARE MEGATON +3082 ; [.3D7D.0020.000E] # HIRAGANA LETTER MO +30E2 ; [.3D7D.0020.0011] # KATAKANA LETTER MO +FF93 ; [.3D7D.0020.0012] # HALFWIDTH KATAKANA LETTER MO +32F2 ; [.3D7D.0020.0013] # CIRCLED KATAKANA MO +3083 ; [.3D7E.0020.000D] # HIRAGANA LETTER SMALL YA +3084 ; [.3D7E.0020.000E] # HIRAGANA LETTER YA +30E3 ; [.3D7E.0020.000F] # KATAKANA LETTER SMALL YA +FF6C ; [.3D7E.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YA +30E4 ; [.3D7E.0020.0011] # KATAKANA LETTER YA +FF94 ; [.3D7E.0020.0012] # HALFWIDTH KATAKANA LETTER YA +32F3 ; [.3D7E.0020.0013] # CIRCLED KATAKANA YA +334E ; [.3D7E.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C][.0000.0037.001C] # SQUARE YAADO +334F ; [.3D7E.0020.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE YAARU +3085 ; [.3D7F.0020.000D] # HIRAGANA LETTER SMALL YU +3086 ; [.3D7F.0020.000E] # HIRAGANA LETTER YU +30E5 ; [.3D7F.0020.000F] # KATAKANA LETTER SMALL YU +FF6D ; [.3D7F.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YU +30E6 ; [.3D7F.0020.0011] # KATAKANA LETTER YU +FF95 ; [.3D7F.0020.0012] # HALFWIDTH KATAKANA LETTER YU +32F4 ; [.3D7F.0020.0013] # CIRCLED KATAKANA YU +3350 ; [.3D7F.0020.001C][.3D5A.0020.001C][.3D8B.0020.001C] # SQUARE YUAN +1B001 ; [.3D80.0020.000E] # HIRAGANA LETTER ARCHAIC YE +3087 ; [.3D81.0020.000D] # HIRAGANA LETTER SMALL YO +3088 ; [.3D81.0020.000E] # HIRAGANA LETTER YO +30E7 ; [.3D81.0020.000F] # KATAKANA LETTER SMALL YO +FF6E ; [.3D81.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YO +30E8 ; [.3D81.0020.0011] # KATAKANA LETTER YO +FF96 ; [.3D81.0020.0012] # HALFWIDTH KATAKANA LETTER YO +32F5 ; [.3D81.0020.0013] # CIRCLED KATAKANA YO +309F ; [.3D81.0020.0016][.3D83.0020.0016] # HIRAGANA DIGRAPH YORI +3089 ; [.3D82.0020.000E] # HIRAGANA LETTER RA +31FB ; [.3D82.0020.000F] # KATAKANA LETTER SMALL RA +30E9 ; [.3D82.0020.0011] # KATAKANA LETTER RA +FF97 ; [.3D82.0020.0012] # HALFWIDTH KATAKANA LETTER RA +32F6 ; [.3D82.0020.0013] # CIRCLED KATAKANA RA +308A ; [.3D83.0020.000E] # HIRAGANA LETTER RI +31FC ; [.3D83.0020.000F] # KATAKANA LETTER SMALL RI +30EA ; [.3D83.0020.0011] # KATAKANA LETTER RI +FF98 ; [.3D83.0020.0012] # HALFWIDTH KATAKANA LETTER RI +32F7 ; [.3D83.0020.0013] # CIRCLED KATAKANA RI +3351 ; [.3D83.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C][.3D84.0020.001C] # SQUARE RITTORU +3352 ; [.3D83.0020.001C][.3D82.0020.001C] # SQUARE RIRA +308B ; [.3D84.0020.000E] # HIRAGANA LETTER RU +31FD ; [.3D84.0020.000F] # KATAKANA LETTER SMALL RU +30EB ; [.3D84.0020.0011] # KATAKANA LETTER RU +FF99 ; [.3D84.0020.0012] # HALFWIDTH KATAKANA LETTER RU +32F8 ; [.3D84.0020.0013] # CIRCLED KATAKANA RU +3354 ; [.3D84.0020.001C][.1C0E.0020.001C][.3D76.0020.001C][.0000.0037.001C][.3D84.0020.001C] # SQUARE RUUBURU +3353 ; [.3D84.0020.001C][.3D75.0020.001C][.0000.0038.001C][.1C0E.0020.001C] # SQUARE RUPII +308C ; [.3D85.0020.000E] # HIRAGANA LETTER RE +31FE ; [.3D85.0020.000F] # KATAKANA LETTER SMALL RE +30EC ; [.3D85.0020.0011] # KATAKANA LETTER RE +FF9A ; [.3D85.0020.0012] # HALFWIDTH KATAKANA LETTER RE +32F9 ; [.3D85.0020.0013] # CIRCLED KATAKANA RE +3355 ; [.3D85.0020.001C][.3D7B.0020.001C] # SQUARE REMU +3356 ; [.3D85.0020.001C][.3D8B.0020.001C][.3D6E.0020.001C][.3D63.0020.001C][.0000.0037.001C][.3D8B.0020.001C] # SQUARE RENTOGEN +308D ; [.3D86.0020.000E] # HIRAGANA LETTER RO +31FF ; [.3D86.0020.000F] # KATAKANA LETTER SMALL RO +30ED ; [.3D86.0020.0011] # KATAKANA LETTER RO +FF9B ; [.3D86.0020.0012] # HALFWIDTH KATAKANA LETTER RO +32FA ; [.3D86.0020.0013] # CIRCLED KATAKANA RO +308E ; [.3D87.0020.000D] # HIRAGANA LETTER SMALL WA +308F ; [.3D87.0020.000E] # HIRAGANA LETTER WA +30EE ; [.3D87.0020.000F] # KATAKANA LETTER SMALL WA +30EF ; [.3D87.0020.0011] # KATAKANA LETTER WA +FF9C ; [.3D87.0020.0012] # HALFWIDTH KATAKANA LETTER WA +32FB ; [.3D87.0020.0013] # CIRCLED KATAKANA WA +30F7 ; [.3D87.0020.0011][.0000.0037.0002] # KATAKANA LETTER VA +3357 ; [.3D87.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C] # SQUARE WATTO +3090 ; [.3D88.0020.000E] # HIRAGANA LETTER WI +30F0 ; [.3D88.0020.0011] # KATAKANA LETTER WI +32FC ; [.3D88.0020.0013] # CIRCLED KATAKANA WI +30F8 ; [.3D88.0020.0011][.0000.0037.0002] # KATAKANA LETTER VI +3091 ; [.3D89.0020.000E] # HIRAGANA LETTER WE +30F1 ; [.3D89.0020.0011] # KATAKANA LETTER WE +32FD ; [.3D89.0020.0013] # CIRCLED KATAKANA WE +30F9 ; [.3D89.0020.0011][.0000.0037.0002] # KATAKANA LETTER VE +3092 ; [.3D8A.0020.000E] # HIRAGANA LETTER WO +30F2 ; [.3D8A.0020.0011] # KATAKANA LETTER WO +FF66 ; [.3D8A.0020.0012] # HALFWIDTH KATAKANA LETTER WO +32FE ; [.3D8A.0020.0013] # CIRCLED KATAKANA WO +30FA ; [.3D8A.0020.0011][.0000.0037.0002] # KATAKANA LETTER VO +3093 ; [.3D8B.0020.000E] # HIRAGANA LETTER N +30F3 ; [.3D8B.0020.0011] # KATAKANA LETTER N +FF9D ; [.3D8B.0020.0012] # HALFWIDTH KATAKANA LETTER N +3105 ; [.3D8C.0020.0002] # BOPOMOFO LETTER B +31A0 ; [.3D8C.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER BU +3106 ; [.3D8D.0020.0002] # BOPOMOFO LETTER P +31B4 ; [.3D8D.0020.0019] # BOPOMOFO FINAL LETTER P +3107 ; [.3D8E.0020.0002] # BOPOMOFO LETTER M +3108 ; [.3D8F.0020.0002] # BOPOMOFO LETTER F +312A ; [.3D90.0020.0002] # BOPOMOFO LETTER V +3109 ; [.3D91.0020.0002] # BOPOMOFO LETTER D +310A ; [.3D92.0020.0002] # BOPOMOFO LETTER T +31B5 ; [.3D92.0020.0019] # BOPOMOFO FINAL LETTER T +310B ; [.3D93.0020.0002] # BOPOMOFO LETTER N +310C ; [.3D94.0020.0002] # BOPOMOFO LETTER L +310D ; [.3D95.0020.0002] # BOPOMOFO LETTER G +31A3 ; [.3D95.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER GU +310E ; [.3D96.0020.0002] # BOPOMOFO LETTER K +31B6 ; [.3D96.0020.0019] # BOPOMOFO FINAL LETTER K +312B ; [.3D97.0020.0002] # BOPOMOFO LETTER NG +31AD ; [.3D98.0020.0002] # BOPOMOFO LETTER NGG +310F ; [.3D99.0020.0002] # BOPOMOFO LETTER H +31B7 ; [.3D99.0020.0019] # BOPOMOFO FINAL LETTER H +3110 ; [.3D9A.0020.0002] # BOPOMOFO LETTER J +31A2 ; [.3D9A.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER JI +3111 ; [.3D9B.0020.0002] # BOPOMOFO LETTER Q +3112 ; [.3D9C.0020.0002] # BOPOMOFO LETTER X +312C ; [.3D9D.0020.0002] # BOPOMOFO LETTER GN +3113 ; [.3D9E.0020.0002] # BOPOMOFO LETTER ZH +3114 ; [.3D9F.0020.0002] # BOPOMOFO LETTER CH +3115 ; [.3DA0.0020.0002] # BOPOMOFO LETTER SH +3116 ; [.3DA1.0020.0002] # BOPOMOFO LETTER R +3117 ; [.3DA2.0020.0002] # BOPOMOFO LETTER Z +31A1 ; [.3DA2.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER ZI +3118 ; [.3DA3.0020.0002] # BOPOMOFO LETTER C +3119 ; [.3DA4.0020.0002] # BOPOMOFO LETTER S +31B8 ; [.3DA5.0020.0002] # BOPOMOFO LETTER GH +31B9 ; [.3DA6.0020.0002] # BOPOMOFO LETTER LH +31BA ; [.3DA7.0020.0002] # BOPOMOFO LETTER ZY +311A ; [.3DA8.0020.0002] # BOPOMOFO LETTER A +31A9 ; [.3DA8.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER ANN +311B ; [.3DA9.0020.0002] # BOPOMOFO LETTER O +31A7 ; [.3DA9.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER ONN +31A6 ; [.3DAA.0020.0002] # BOPOMOFO LETTER OO +311C ; [.3DAB.0020.0002] # BOPOMOFO LETTER E +311D ; [.3DAC.0020.0002] # BOPOMOFO LETTER EH +31A4 ; [.3DAD.0020.0002] # BOPOMOFO LETTER EE +31A5 ; [.3DAD.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER ENN +311E ; [.3DAE.0020.0002] # BOPOMOFO LETTER AI +31AE ; [.3DAE.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER AINN +311F ; [.3DAF.0020.0002] # BOPOMOFO LETTER EI +3120 ; [.3DB0.0020.0002] # BOPOMOFO LETTER AU +31AF ; [.3DB0.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER AUNN +3121 ; [.3DB1.0020.0002] # BOPOMOFO LETTER OU +3122 ; [.3DB2.0020.0002] # BOPOMOFO LETTER AN +3123 ; [.3DB3.0020.0002] # BOPOMOFO LETTER EN +3124 ; [.3DB4.0020.0002] # BOPOMOFO LETTER ANG +31B2 ; [.3DB5.0020.0002] # BOPOMOFO LETTER ONG +3125 ; [.3DB6.0020.0002] # BOPOMOFO LETTER ENG +31B0 ; [.3DB7.0020.0002] # BOPOMOFO LETTER AM +31B1 ; [.3DB8.0020.0002] # BOPOMOFO LETTER OM +31AC ; [.3DB9.0020.0002] # BOPOMOFO LETTER IM +3126 ; [.3DBA.0020.0002] # BOPOMOFO LETTER ER +3127 ; [.3DBB.0020.0002] # BOPOMOFO LETTER I +31AA ; [.3DBB.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER INN +31B3 ; [.3DBB.0020.0016][.0000.0111.0016] # BOPOMOFO LETTER INNN +3128 ; [.3DBC.0020.0002] # BOPOMOFO LETTER U +31AB ; [.3DBC.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER UNN +31A8 ; [.3DBC.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER IR +3129 ; [.3DBD.0020.0002] # BOPOMOFO LETTER IU +312D ; [.3DBE.0020.0002] # BOPOMOFO LETTER IH +A000 ; [.3DBF.0020.0002] # YI SYLLABLE IT +A001 ; [.3DC0.0020.0002] # YI SYLLABLE IX +A002 ; [.3DC1.0020.0002] # YI SYLLABLE I +A003 ; [.3DC2.0020.0002] # YI SYLLABLE IP +A004 ; [.3DC3.0020.0002] # YI SYLLABLE IET +A005 ; [.3DC4.0020.0002] # YI SYLLABLE IEX +A006 ; [.3DC5.0020.0002] # YI SYLLABLE IE +A007 ; [.3DC6.0020.0002] # YI SYLLABLE IEP +A008 ; [.3DC7.0020.0002] # YI SYLLABLE AT +A009 ; [.3DC8.0020.0002] # YI SYLLABLE AX +A00A ; [.3DC9.0020.0002] # YI SYLLABLE A +A00B ; [.3DCA.0020.0002] # YI SYLLABLE AP +A00C ; [.3DCB.0020.0002] # YI SYLLABLE UOX +A00D ; [.3DCC.0020.0002] # YI SYLLABLE UO +A00E ; [.3DCD.0020.0002] # YI SYLLABLE UOP +A00F ; [.3DCE.0020.0002] # YI SYLLABLE OT +A010 ; [.3DCF.0020.0002] # YI SYLLABLE OX +A011 ; [.3DD0.0020.0002] # YI SYLLABLE O +A012 ; [.3DD1.0020.0002] # YI SYLLABLE OP +A013 ; [.3DD2.0020.0002] # YI SYLLABLE EX +A014 ; [.3DD3.0020.0002] # YI SYLLABLE E +A015 ; [.3DD4.0020.0002] # YI SYLLABLE WU +A016 ; [.3DD5.0020.0002] # YI SYLLABLE BIT +A017 ; [.3DD6.0020.0002] # YI SYLLABLE BIX +A018 ; [.3DD7.0020.0002] # YI SYLLABLE BI +A019 ; [.3DD8.0020.0002] # YI SYLLABLE BIP +A01A ; [.3DD9.0020.0002] # YI SYLLABLE BIET +A01B ; [.3DDA.0020.0002] # YI SYLLABLE BIEX +A01C ; [.3DDB.0020.0002] # YI SYLLABLE BIE +A01D ; [.3DDC.0020.0002] # YI SYLLABLE BIEP +A01E ; [.3DDD.0020.0002] # YI SYLLABLE BAT +A01F ; [.3DDE.0020.0002] # YI SYLLABLE BAX +A020 ; [.3DDF.0020.0002] # YI SYLLABLE BA +A021 ; [.3DE0.0020.0002] # YI SYLLABLE BAP +A022 ; [.3DE1.0020.0002] # YI SYLLABLE BUOX +A023 ; [.3DE2.0020.0002] # YI SYLLABLE BUO +A024 ; [.3DE3.0020.0002] # YI SYLLABLE BUOP +A025 ; [.3DE4.0020.0002] # YI SYLLABLE BOT +A026 ; [.3DE5.0020.0002] # YI SYLLABLE BOX +A027 ; [.3DE6.0020.0002] # YI SYLLABLE BO +A028 ; [.3DE7.0020.0002] # YI SYLLABLE BOP +A029 ; [.3DE8.0020.0002] # YI SYLLABLE BEX +A02A ; [.3DE9.0020.0002] # YI SYLLABLE BE +A02B ; [.3DEA.0020.0002] # YI SYLLABLE BEP +A02C ; [.3DEB.0020.0002] # YI SYLLABLE BUT +A02D ; [.3DEC.0020.0002] # YI SYLLABLE BUX +A02E ; [.3DED.0020.0002] # YI SYLLABLE BU +A02F ; [.3DEE.0020.0002] # YI SYLLABLE BUP +A030 ; [.3DEF.0020.0002] # YI SYLLABLE BURX +A031 ; [.3DF0.0020.0002] # YI SYLLABLE BUR +A032 ; [.3DF1.0020.0002] # YI SYLLABLE BYT +A033 ; [.3DF2.0020.0002] # YI SYLLABLE BYX +A034 ; [.3DF3.0020.0002] # YI SYLLABLE BY +A035 ; [.3DF4.0020.0002] # YI SYLLABLE BYP +A036 ; [.3DF5.0020.0002] # YI SYLLABLE BYRX +A037 ; [.3DF6.0020.0002] # YI SYLLABLE BYR +A038 ; [.3DF7.0020.0002] # YI SYLLABLE PIT +A039 ; [.3DF8.0020.0002] # YI SYLLABLE PIX +A03A ; [.3DF9.0020.0002] # YI SYLLABLE PI +A03B ; [.3DFA.0020.0002] # YI SYLLABLE PIP +A03C ; [.3DFB.0020.0002] # YI SYLLABLE PIEX +A03D ; [.3DFC.0020.0002] # YI SYLLABLE PIE +A03E ; [.3DFD.0020.0002] # YI SYLLABLE PIEP +A03F ; [.3DFE.0020.0002] # YI SYLLABLE PAT +A040 ; [.3DFF.0020.0002] # YI SYLLABLE PAX +A041 ; [.3E00.0020.0002] # YI SYLLABLE PA +A042 ; [.3E01.0020.0002] # YI SYLLABLE PAP +A043 ; [.3E02.0020.0002] # YI SYLLABLE PUOX +A044 ; [.3E03.0020.0002] # YI SYLLABLE PUO +A045 ; [.3E04.0020.0002] # YI SYLLABLE PUOP +A046 ; [.3E05.0020.0002] # YI SYLLABLE POT +A047 ; [.3E06.0020.0002] # YI SYLLABLE POX +A048 ; [.3E07.0020.0002] # YI SYLLABLE PO +A049 ; [.3E08.0020.0002] # YI SYLLABLE POP +A04A ; [.3E09.0020.0002] # YI SYLLABLE PUT +A04B ; [.3E0A.0020.0002] # YI SYLLABLE PUX +A04C ; [.3E0B.0020.0002] # YI SYLLABLE PU +A04D ; [.3E0C.0020.0002] # YI SYLLABLE PUP +A04E ; [.3E0D.0020.0002] # YI SYLLABLE PURX +A04F ; [.3E0E.0020.0002] # YI SYLLABLE PUR +A050 ; [.3E0F.0020.0002] # YI SYLLABLE PYT +A051 ; [.3E10.0020.0002] # YI SYLLABLE PYX +A052 ; [.3E11.0020.0002] # YI SYLLABLE PY +A053 ; [.3E12.0020.0002] # YI SYLLABLE PYP +A054 ; [.3E13.0020.0002] # YI SYLLABLE PYRX +A055 ; [.3E14.0020.0002] # YI SYLLABLE PYR +A056 ; [.3E15.0020.0002] # YI SYLLABLE BBIT +A057 ; [.3E16.0020.0002] # YI SYLLABLE BBIX +A058 ; [.3E17.0020.0002] # YI SYLLABLE BBI +A059 ; [.3E18.0020.0002] # YI SYLLABLE BBIP +A05A ; [.3E19.0020.0002] # YI SYLLABLE BBIET +A05B ; [.3E1A.0020.0002] # YI SYLLABLE BBIEX +A05C ; [.3E1B.0020.0002] # YI SYLLABLE BBIE +A05D ; [.3E1C.0020.0002] # YI SYLLABLE BBIEP +A05E ; [.3E1D.0020.0002] # YI SYLLABLE BBAT +A05F ; [.3E1E.0020.0002] # YI SYLLABLE BBAX +A060 ; [.3E1F.0020.0002] # YI SYLLABLE BBA +A061 ; [.3E20.0020.0002] # YI SYLLABLE BBAP +A062 ; [.3E21.0020.0002] # YI SYLLABLE BBUOX +A063 ; [.3E22.0020.0002] # YI SYLLABLE BBUO +A064 ; [.3E23.0020.0002] # YI SYLLABLE BBUOP +A065 ; [.3E24.0020.0002] # YI SYLLABLE BBOT +A066 ; [.3E25.0020.0002] # YI SYLLABLE BBOX +A067 ; [.3E26.0020.0002] # YI SYLLABLE BBO +A068 ; [.3E27.0020.0002] # YI SYLLABLE BBOP +A069 ; [.3E28.0020.0002] # YI SYLLABLE BBEX +A06A ; [.3E29.0020.0002] # YI SYLLABLE BBE +A06B ; [.3E2A.0020.0002] # YI SYLLABLE BBEP +A06C ; [.3E2B.0020.0002] # YI SYLLABLE BBUT +A06D ; [.3E2C.0020.0002] # YI SYLLABLE BBUX +A06E ; [.3E2D.0020.0002] # YI SYLLABLE BBU +A06F ; [.3E2E.0020.0002] # YI SYLLABLE BBUP +A070 ; [.3E2F.0020.0002] # YI SYLLABLE BBURX +A071 ; [.3E30.0020.0002] # YI SYLLABLE BBUR +A072 ; [.3E31.0020.0002] # YI SYLLABLE BBYT +A073 ; [.3E32.0020.0002] # YI SYLLABLE BBYX +A074 ; [.3E33.0020.0002] # YI SYLLABLE BBY +A075 ; [.3E34.0020.0002] # YI SYLLABLE BBYP +A076 ; [.3E35.0020.0002] # YI SYLLABLE NBIT +A077 ; [.3E36.0020.0002] # YI SYLLABLE NBIX +A078 ; [.3E37.0020.0002] # YI SYLLABLE NBI +A079 ; [.3E38.0020.0002] # YI SYLLABLE NBIP +A07A ; [.3E39.0020.0002] # YI SYLLABLE NBIEX +A07B ; [.3E3A.0020.0002] # YI SYLLABLE NBIE +A07C ; [.3E3B.0020.0002] # YI SYLLABLE NBIEP +A07D ; [.3E3C.0020.0002] # YI SYLLABLE NBAT +A07E ; [.3E3D.0020.0002] # YI SYLLABLE NBAX +A07F ; [.3E3E.0020.0002] # YI SYLLABLE NBA +A080 ; [.3E3F.0020.0002] # YI SYLLABLE NBAP +A081 ; [.3E40.0020.0002] # YI SYLLABLE NBOT +A082 ; [.3E41.0020.0002] # YI SYLLABLE NBOX +A083 ; [.3E42.0020.0002] # YI SYLLABLE NBO +A084 ; [.3E43.0020.0002] # YI SYLLABLE NBOP +A085 ; [.3E44.0020.0002] # YI SYLLABLE NBUT +A086 ; [.3E45.0020.0002] # YI SYLLABLE NBUX +A087 ; [.3E46.0020.0002] # YI SYLLABLE NBU +A088 ; [.3E47.0020.0002] # YI SYLLABLE NBUP +A089 ; [.3E48.0020.0002] # YI SYLLABLE NBURX +A08A ; [.3E49.0020.0002] # YI SYLLABLE NBUR +A08B ; [.3E4A.0020.0002] # YI SYLLABLE NBYT +A08C ; [.3E4B.0020.0002] # YI SYLLABLE NBYX +A08D ; [.3E4C.0020.0002] # YI SYLLABLE NBY +A08E ; [.3E4D.0020.0002] # YI SYLLABLE NBYP +A08F ; [.3E4E.0020.0002] # YI SYLLABLE NBYRX +A090 ; [.3E4F.0020.0002] # YI SYLLABLE NBYR +A091 ; [.3E50.0020.0002] # YI SYLLABLE HMIT +A092 ; [.3E51.0020.0002] # YI SYLLABLE HMIX +A093 ; [.3E52.0020.0002] # YI SYLLABLE HMI +A094 ; [.3E53.0020.0002] # YI SYLLABLE HMIP +A095 ; [.3E54.0020.0002] # YI SYLLABLE HMIEX +A096 ; [.3E55.0020.0002] # YI SYLLABLE HMIE +A097 ; [.3E56.0020.0002] # YI SYLLABLE HMIEP +A098 ; [.3E57.0020.0002] # YI SYLLABLE HMAT +A099 ; [.3E58.0020.0002] # YI SYLLABLE HMAX +A09A ; [.3E59.0020.0002] # YI SYLLABLE HMA +A09B ; [.3E5A.0020.0002] # YI SYLLABLE HMAP +A09C ; [.3E5B.0020.0002] # YI SYLLABLE HMUOX +A09D ; [.3E5C.0020.0002] # YI SYLLABLE HMUO +A09E ; [.3E5D.0020.0002] # YI SYLLABLE HMUOP +A09F ; [.3E5E.0020.0002] # YI SYLLABLE HMOT +A0A0 ; [.3E5F.0020.0002] # YI SYLLABLE HMOX +A0A1 ; [.3E60.0020.0002] # YI SYLLABLE HMO +A0A2 ; [.3E61.0020.0002] # YI SYLLABLE HMOP +A0A3 ; [.3E62.0020.0002] # YI SYLLABLE HMUT +A0A4 ; [.3E63.0020.0002] # YI SYLLABLE HMUX +A0A5 ; [.3E64.0020.0002] # YI SYLLABLE HMU +A0A6 ; [.3E65.0020.0002] # YI SYLLABLE HMUP +A0A7 ; [.3E66.0020.0002] # YI SYLLABLE HMURX +A0A8 ; [.3E67.0020.0002] # YI SYLLABLE HMUR +A0A9 ; [.3E68.0020.0002] # YI SYLLABLE HMYX +A0AA ; [.3E69.0020.0002] # YI SYLLABLE HMY +A0AB ; [.3E6A.0020.0002] # YI SYLLABLE HMYP +A0AC ; [.3E6B.0020.0002] # YI SYLLABLE HMYRX +A0AD ; [.3E6C.0020.0002] # YI SYLLABLE HMYR +A0AE ; [.3E6D.0020.0002] # YI SYLLABLE MIT +A0AF ; [.3E6E.0020.0002] # YI SYLLABLE MIX +A0B0 ; [.3E6F.0020.0002] # YI SYLLABLE MI +A0B1 ; [.3E70.0020.0002] # YI SYLLABLE MIP +A0B2 ; [.3E71.0020.0002] # YI SYLLABLE MIEX +A0B3 ; [.3E72.0020.0002] # YI SYLLABLE MIE +A0B4 ; [.3E73.0020.0002] # YI SYLLABLE MIEP +A0B5 ; [.3E74.0020.0002] # YI SYLLABLE MAT +A0B6 ; [.3E75.0020.0002] # YI SYLLABLE MAX +A0B7 ; [.3E76.0020.0002] # YI SYLLABLE MA +A0B8 ; [.3E77.0020.0002] # YI SYLLABLE MAP +A0B9 ; [.3E78.0020.0002] # YI SYLLABLE MUOT +A0BA ; [.3E79.0020.0002] # YI SYLLABLE MUOX +A0BB ; [.3E7A.0020.0002] # YI SYLLABLE MUO +A0BC ; [.3E7B.0020.0002] # YI SYLLABLE MUOP +A0BD ; [.3E7C.0020.0002] # YI SYLLABLE MOT +A0BE ; [.3E7D.0020.0002] # YI SYLLABLE MOX +A0BF ; [.3E7E.0020.0002] # YI SYLLABLE MO +A0C0 ; [.3E7F.0020.0002] # YI SYLLABLE MOP +A0C1 ; [.3E80.0020.0002] # YI SYLLABLE MEX +A0C2 ; [.3E81.0020.0002] # YI SYLLABLE ME +A0C3 ; [.3E82.0020.0002] # YI SYLLABLE MUT +A0C4 ; [.3E83.0020.0002] # YI SYLLABLE MUX +A0C5 ; [.3E84.0020.0002] # YI SYLLABLE MU +A0C6 ; [.3E85.0020.0002] # YI SYLLABLE MUP +A0C7 ; [.3E86.0020.0002] # YI SYLLABLE MURX +A0C8 ; [.3E87.0020.0002] # YI SYLLABLE MUR +A0C9 ; [.3E88.0020.0002] # YI SYLLABLE MYT +A0CA ; [.3E89.0020.0002] # YI SYLLABLE MYX +A0CB ; [.3E8A.0020.0002] # YI SYLLABLE MY +A0CC ; [.3E8B.0020.0002] # YI SYLLABLE MYP +A0CD ; [.3E8C.0020.0002] # YI SYLLABLE FIT +A0CE ; [.3E8D.0020.0002] # YI SYLLABLE FIX +A0CF ; [.3E8E.0020.0002] # YI SYLLABLE FI +A0D0 ; [.3E8F.0020.0002] # YI SYLLABLE FIP +A0D1 ; [.3E90.0020.0002] # YI SYLLABLE FAT +A0D2 ; [.3E91.0020.0002] # YI SYLLABLE FAX +A0D3 ; [.3E92.0020.0002] # YI SYLLABLE FA +A0D4 ; [.3E93.0020.0002] # YI SYLLABLE FAP +A0D5 ; [.3E94.0020.0002] # YI SYLLABLE FOX +A0D6 ; [.3E95.0020.0002] # YI SYLLABLE FO +A0D7 ; [.3E96.0020.0002] # YI SYLLABLE FOP +A0D8 ; [.3E97.0020.0002] # YI SYLLABLE FUT +A0D9 ; [.3E98.0020.0002] # YI SYLLABLE FUX +A0DA ; [.3E99.0020.0002] # YI SYLLABLE FU +A0DB ; [.3E9A.0020.0002] # YI SYLLABLE FUP +A0DC ; [.3E9B.0020.0002] # YI SYLLABLE FURX +A0DD ; [.3E9C.0020.0002] # YI SYLLABLE FUR +A0DE ; [.3E9D.0020.0002] # YI SYLLABLE FYT +A0DF ; [.3E9E.0020.0002] # YI SYLLABLE FYX +A0E0 ; [.3E9F.0020.0002] # YI SYLLABLE FY +A0E1 ; [.3EA0.0020.0002] # YI SYLLABLE FYP +A0E2 ; [.3EA1.0020.0002] # YI SYLLABLE VIT +A0E3 ; [.3EA2.0020.0002] # YI SYLLABLE VIX +A0E4 ; [.3EA3.0020.0002] # YI SYLLABLE VI +A0E5 ; [.3EA4.0020.0002] # YI SYLLABLE VIP +A0E6 ; [.3EA5.0020.0002] # YI SYLLABLE VIET +A0E7 ; [.3EA6.0020.0002] # YI SYLLABLE VIEX +A0E8 ; [.3EA7.0020.0002] # YI SYLLABLE VIE +A0E9 ; [.3EA8.0020.0002] # YI SYLLABLE VIEP +A0EA ; [.3EA9.0020.0002] # YI SYLLABLE VAT +A0EB ; [.3EAA.0020.0002] # YI SYLLABLE VAX +A0EC ; [.3EAB.0020.0002] # YI SYLLABLE VA +A0ED ; [.3EAC.0020.0002] # YI SYLLABLE VAP +A0EE ; [.3EAD.0020.0002] # YI SYLLABLE VOT +A0EF ; [.3EAE.0020.0002] # YI SYLLABLE VOX +A0F0 ; [.3EAF.0020.0002] # YI SYLLABLE VO +A0F1 ; [.3EB0.0020.0002] # YI SYLLABLE VOP +A0F2 ; [.3EB1.0020.0002] # YI SYLLABLE VEX +A0F3 ; [.3EB2.0020.0002] # YI SYLLABLE VEP +A0F4 ; [.3EB3.0020.0002] # YI SYLLABLE VUT +A0F5 ; [.3EB4.0020.0002] # YI SYLLABLE VUX +A0F6 ; [.3EB5.0020.0002] # YI SYLLABLE VU +A0F7 ; [.3EB6.0020.0002] # YI SYLLABLE VUP +A0F8 ; [.3EB7.0020.0002] # YI SYLLABLE VURX +A0F9 ; [.3EB8.0020.0002] # YI SYLLABLE VUR +A0FA ; [.3EB9.0020.0002] # YI SYLLABLE VYT +A0FB ; [.3EBA.0020.0002] # YI SYLLABLE VYX +A0FC ; [.3EBB.0020.0002] # YI SYLLABLE VY +A0FD ; [.3EBC.0020.0002] # YI SYLLABLE VYP +A0FE ; [.3EBD.0020.0002] # YI SYLLABLE VYRX +A0FF ; [.3EBE.0020.0002] # YI SYLLABLE VYR +A100 ; [.3EBF.0020.0002] # YI SYLLABLE DIT +A101 ; [.3EC0.0020.0002] # YI SYLLABLE DIX +A102 ; [.3EC1.0020.0002] # YI SYLLABLE DI +A103 ; [.3EC2.0020.0002] # YI SYLLABLE DIP +A104 ; [.3EC3.0020.0002] # YI SYLLABLE DIEX +A105 ; [.3EC4.0020.0002] # YI SYLLABLE DIE +A106 ; [.3EC5.0020.0002] # YI SYLLABLE DIEP +A107 ; [.3EC6.0020.0002] # YI SYLLABLE DAT +A108 ; [.3EC7.0020.0002] # YI SYLLABLE DAX +A109 ; [.3EC8.0020.0002] # YI SYLLABLE DA +A10A ; [.3EC9.0020.0002] # YI SYLLABLE DAP +A10B ; [.3ECA.0020.0002] # YI SYLLABLE DUOX +A10C ; [.3ECB.0020.0002] # YI SYLLABLE DUO +A10D ; [.3ECC.0020.0002] # YI SYLLABLE DOT +A10E ; [.3ECD.0020.0002] # YI SYLLABLE DOX +A10F ; [.3ECE.0020.0002] # YI SYLLABLE DO +A110 ; [.3ECF.0020.0002] # YI SYLLABLE DOP +A111 ; [.3ED0.0020.0002] # YI SYLLABLE DEX +A112 ; [.3ED1.0020.0002] # YI SYLLABLE DE +A113 ; [.3ED2.0020.0002] # YI SYLLABLE DEP +A114 ; [.3ED3.0020.0002] # YI SYLLABLE DUT +A115 ; [.3ED4.0020.0002] # YI SYLLABLE DUX +A116 ; [.3ED5.0020.0002] # YI SYLLABLE DU +A117 ; [.3ED6.0020.0002] # YI SYLLABLE DUP +A118 ; [.3ED7.0020.0002] # YI SYLLABLE DURX +A119 ; [.3ED8.0020.0002] # YI SYLLABLE DUR +A11A ; [.3ED9.0020.0002] # YI SYLLABLE TIT +A11B ; [.3EDA.0020.0002] # YI SYLLABLE TIX +A11C ; [.3EDB.0020.0002] # YI SYLLABLE TI +A11D ; [.3EDC.0020.0002] # YI SYLLABLE TIP +A11E ; [.3EDD.0020.0002] # YI SYLLABLE TIEX +A11F ; [.3EDE.0020.0002] # YI SYLLABLE TIE +A120 ; [.3EDF.0020.0002] # YI SYLLABLE TIEP +A121 ; [.3EE0.0020.0002] # YI SYLLABLE TAT +A122 ; [.3EE1.0020.0002] # YI SYLLABLE TAX +A123 ; [.3EE2.0020.0002] # YI SYLLABLE TA +A124 ; [.3EE3.0020.0002] # YI SYLLABLE TAP +A125 ; [.3EE4.0020.0002] # YI SYLLABLE TUOT +A126 ; [.3EE5.0020.0002] # YI SYLLABLE TUOX +A127 ; [.3EE6.0020.0002] # YI SYLLABLE TUO +A128 ; [.3EE7.0020.0002] # YI SYLLABLE TUOP +A129 ; [.3EE8.0020.0002] # YI SYLLABLE TOT +A12A ; [.3EE9.0020.0002] # YI SYLLABLE TOX +A12B ; [.3EEA.0020.0002] # YI SYLLABLE TO +A12C ; [.3EEB.0020.0002] # YI SYLLABLE TOP +A12D ; [.3EEC.0020.0002] # YI SYLLABLE TEX +A12E ; [.3EED.0020.0002] # YI SYLLABLE TE +A12F ; [.3EEE.0020.0002] # YI SYLLABLE TEP +A130 ; [.3EEF.0020.0002] # YI SYLLABLE TUT +A131 ; [.3EF0.0020.0002] # YI SYLLABLE TUX +A132 ; [.3EF1.0020.0002] # YI SYLLABLE TU +A133 ; [.3EF2.0020.0002] # YI SYLLABLE TUP +A134 ; [.3EF3.0020.0002] # YI SYLLABLE TURX +A135 ; [.3EF4.0020.0002] # YI SYLLABLE TUR +A136 ; [.3EF5.0020.0002] # YI SYLLABLE DDIT +A137 ; [.3EF6.0020.0002] # YI SYLLABLE DDIX +A138 ; [.3EF7.0020.0002] # YI SYLLABLE DDI +A139 ; [.3EF8.0020.0002] # YI SYLLABLE DDIP +A13A ; [.3EF9.0020.0002] # YI SYLLABLE DDIEX +A13B ; [.3EFA.0020.0002] # YI SYLLABLE DDIE +A13C ; [.3EFB.0020.0002] # YI SYLLABLE DDIEP +A13D ; [.3EFC.0020.0002] # YI SYLLABLE DDAT +A13E ; [.3EFD.0020.0002] # YI SYLLABLE DDAX +A13F ; [.3EFE.0020.0002] # YI SYLLABLE DDA +A140 ; [.3EFF.0020.0002] # YI SYLLABLE DDAP +A141 ; [.3F00.0020.0002] # YI SYLLABLE DDUOX +A142 ; [.3F01.0020.0002] # YI SYLLABLE DDUO +A143 ; [.3F02.0020.0002] # YI SYLLABLE DDUOP +A144 ; [.3F03.0020.0002] # YI SYLLABLE DDOT +A145 ; [.3F04.0020.0002] # YI SYLLABLE DDOX +A146 ; [.3F05.0020.0002] # YI SYLLABLE DDO +A147 ; [.3F06.0020.0002] # YI SYLLABLE DDOP +A148 ; [.3F07.0020.0002] # YI SYLLABLE DDEX +A149 ; [.3F08.0020.0002] # YI SYLLABLE DDE +A14A ; [.3F09.0020.0002] # YI SYLLABLE DDEP +A14B ; [.3F0A.0020.0002] # YI SYLLABLE DDUT +A14C ; [.3F0B.0020.0002] # YI SYLLABLE DDUX +A14D ; [.3F0C.0020.0002] # YI SYLLABLE DDU +A14E ; [.3F0D.0020.0002] # YI SYLLABLE DDUP +A14F ; [.3F0E.0020.0002] # YI SYLLABLE DDURX +A150 ; [.3F0F.0020.0002] # YI SYLLABLE DDUR +A151 ; [.3F10.0020.0002] # YI SYLLABLE NDIT +A152 ; [.3F11.0020.0002] # YI SYLLABLE NDIX +A153 ; [.3F12.0020.0002] # YI SYLLABLE NDI +A154 ; [.3F13.0020.0002] # YI SYLLABLE NDIP +A155 ; [.3F14.0020.0002] # YI SYLLABLE NDIEX +A156 ; [.3F15.0020.0002] # YI SYLLABLE NDIE +A157 ; [.3F16.0020.0002] # YI SYLLABLE NDAT +A158 ; [.3F17.0020.0002] # YI SYLLABLE NDAX +A159 ; [.3F18.0020.0002] # YI SYLLABLE NDA +A15A ; [.3F19.0020.0002] # YI SYLLABLE NDAP +A15B ; [.3F1A.0020.0002] # YI SYLLABLE NDOT +A15C ; [.3F1B.0020.0002] # YI SYLLABLE NDOX +A15D ; [.3F1C.0020.0002] # YI SYLLABLE NDO +A15E ; [.3F1D.0020.0002] # YI SYLLABLE NDOP +A15F ; [.3F1E.0020.0002] # YI SYLLABLE NDEX +A160 ; [.3F1F.0020.0002] # YI SYLLABLE NDE +A161 ; [.3F20.0020.0002] # YI SYLLABLE NDEP +A162 ; [.3F21.0020.0002] # YI SYLLABLE NDUT +A163 ; [.3F22.0020.0002] # YI SYLLABLE NDUX +A164 ; [.3F23.0020.0002] # YI SYLLABLE NDU +A165 ; [.3F24.0020.0002] # YI SYLLABLE NDUP +A166 ; [.3F25.0020.0002] # YI SYLLABLE NDURX +A167 ; [.3F26.0020.0002] # YI SYLLABLE NDUR +A168 ; [.3F27.0020.0002] # YI SYLLABLE HNIT +A169 ; [.3F28.0020.0002] # YI SYLLABLE HNIX +A16A ; [.3F29.0020.0002] # YI SYLLABLE HNI +A16B ; [.3F2A.0020.0002] # YI SYLLABLE HNIP +A16C ; [.3F2B.0020.0002] # YI SYLLABLE HNIET +A16D ; [.3F2C.0020.0002] # YI SYLLABLE HNIEX +A16E ; [.3F2D.0020.0002] # YI SYLLABLE HNIE +A16F ; [.3F2E.0020.0002] # YI SYLLABLE HNIEP +A170 ; [.3F2F.0020.0002] # YI SYLLABLE HNAT +A171 ; [.3F30.0020.0002] # YI SYLLABLE HNAX +A172 ; [.3F31.0020.0002] # YI SYLLABLE HNA +A173 ; [.3F32.0020.0002] # YI SYLLABLE HNAP +A174 ; [.3F33.0020.0002] # YI SYLLABLE HNUOX +A175 ; [.3F34.0020.0002] # YI SYLLABLE HNUO +A176 ; [.3F35.0020.0002] # YI SYLLABLE HNOT +A177 ; [.3F36.0020.0002] # YI SYLLABLE HNOX +A178 ; [.3F37.0020.0002] # YI SYLLABLE HNOP +A179 ; [.3F38.0020.0002] # YI SYLLABLE HNEX +A17A ; [.3F39.0020.0002] # YI SYLLABLE HNE +A17B ; [.3F3A.0020.0002] # YI SYLLABLE HNEP +A17C ; [.3F3B.0020.0002] # YI SYLLABLE HNUT +A17D ; [.3F3C.0020.0002] # YI SYLLABLE NIT +A17E ; [.3F3D.0020.0002] # YI SYLLABLE NIX +A17F ; [.3F3E.0020.0002] # YI SYLLABLE NI +A180 ; [.3F3F.0020.0002] # YI SYLLABLE NIP +A181 ; [.3F40.0020.0002] # YI SYLLABLE NIEX +A182 ; [.3F41.0020.0002] # YI SYLLABLE NIE +A183 ; [.3F42.0020.0002] # YI SYLLABLE NIEP +A184 ; [.3F43.0020.0002] # YI SYLLABLE NAX +A185 ; [.3F44.0020.0002] # YI SYLLABLE NA +A186 ; [.3F45.0020.0002] # YI SYLLABLE NAP +A187 ; [.3F46.0020.0002] # YI SYLLABLE NUOX +A188 ; [.3F47.0020.0002] # YI SYLLABLE NUO +A189 ; [.3F48.0020.0002] # YI SYLLABLE NUOP +A18A ; [.3F49.0020.0002] # YI SYLLABLE NOT +A18B ; [.3F4A.0020.0002] # YI SYLLABLE NOX +A18C ; [.3F4B.0020.0002] # YI SYLLABLE NO +A18D ; [.3F4C.0020.0002] # YI SYLLABLE NOP +A18E ; [.3F4D.0020.0002] # YI SYLLABLE NEX +A18F ; [.3F4E.0020.0002] # YI SYLLABLE NE +A190 ; [.3F4F.0020.0002] # YI SYLLABLE NEP +A191 ; [.3F50.0020.0002] # YI SYLLABLE NUT +A192 ; [.3F51.0020.0002] # YI SYLLABLE NUX +A193 ; [.3F52.0020.0002] # YI SYLLABLE NU +A194 ; [.3F53.0020.0002] # YI SYLLABLE NUP +A195 ; [.3F54.0020.0002] # YI SYLLABLE NURX +A196 ; [.3F55.0020.0002] # YI SYLLABLE NUR +A197 ; [.3F56.0020.0002] # YI SYLLABLE HLIT +A198 ; [.3F57.0020.0002] # YI SYLLABLE HLIX +A199 ; [.3F58.0020.0002] # YI SYLLABLE HLI +A19A ; [.3F59.0020.0002] # YI SYLLABLE HLIP +A19B ; [.3F5A.0020.0002] # YI SYLLABLE HLIEX +A19C ; [.3F5B.0020.0002] # YI SYLLABLE HLIE +A19D ; [.3F5C.0020.0002] # YI SYLLABLE HLIEP +A19E ; [.3F5D.0020.0002] # YI SYLLABLE HLAT +A19F ; [.3F5E.0020.0002] # YI SYLLABLE HLAX +A1A0 ; [.3F5F.0020.0002] # YI SYLLABLE HLA +A1A1 ; [.3F60.0020.0002] # YI SYLLABLE HLAP +A1A2 ; [.3F61.0020.0002] # YI SYLLABLE HLUOX +A1A3 ; [.3F62.0020.0002] # YI SYLLABLE HLUO +A1A4 ; [.3F63.0020.0002] # YI SYLLABLE HLUOP +A1A5 ; [.3F64.0020.0002] # YI SYLLABLE HLOX +A1A6 ; [.3F65.0020.0002] # YI SYLLABLE HLO +A1A7 ; [.3F66.0020.0002] # YI SYLLABLE HLOP +A1A8 ; [.3F67.0020.0002] # YI SYLLABLE HLEX +A1A9 ; [.3F68.0020.0002] # YI SYLLABLE HLE +A1AA ; [.3F69.0020.0002] # YI SYLLABLE HLEP +A1AB ; [.3F6A.0020.0002] # YI SYLLABLE HLUT +A1AC ; [.3F6B.0020.0002] # YI SYLLABLE HLUX +A1AD ; [.3F6C.0020.0002] # YI SYLLABLE HLU +A1AE ; [.3F6D.0020.0002] # YI SYLLABLE HLUP +A1AF ; [.3F6E.0020.0002] # YI SYLLABLE HLURX +A1B0 ; [.3F6F.0020.0002] # YI SYLLABLE HLUR +A1B1 ; [.3F70.0020.0002] # YI SYLLABLE HLYT +A1B2 ; [.3F71.0020.0002] # YI SYLLABLE HLYX +A1B3 ; [.3F72.0020.0002] # YI SYLLABLE HLY +A1B4 ; [.3F73.0020.0002] # YI SYLLABLE HLYP +A1B5 ; [.3F74.0020.0002] # YI SYLLABLE HLYRX +A1B6 ; [.3F75.0020.0002] # YI SYLLABLE HLYR +A1B7 ; [.3F76.0020.0002] # YI SYLLABLE LIT +A1B8 ; [.3F77.0020.0002] # YI SYLLABLE LIX +A1B9 ; [.3F78.0020.0002] # YI SYLLABLE LI +A1BA ; [.3F79.0020.0002] # YI SYLLABLE LIP +A1BB ; [.3F7A.0020.0002] # YI SYLLABLE LIET +A1BC ; [.3F7B.0020.0002] # YI SYLLABLE LIEX +A1BD ; [.3F7C.0020.0002] # YI SYLLABLE LIE +A1BE ; [.3F7D.0020.0002] # YI SYLLABLE LIEP +A1BF ; [.3F7E.0020.0002] # YI SYLLABLE LAT +A1C0 ; [.3F7F.0020.0002] # YI SYLLABLE LAX +A1C1 ; [.3F80.0020.0002] # YI SYLLABLE LA +A1C2 ; [.3F81.0020.0002] # YI SYLLABLE LAP +A1C3 ; [.3F82.0020.0002] # YI SYLLABLE LUOT +A1C4 ; [.3F83.0020.0002] # YI SYLLABLE LUOX +A1C5 ; [.3F84.0020.0002] # YI SYLLABLE LUO +A1C6 ; [.3F85.0020.0002] # YI SYLLABLE LUOP +A1C7 ; [.3F86.0020.0002] # YI SYLLABLE LOT +A1C8 ; [.3F87.0020.0002] # YI SYLLABLE LOX +A1C9 ; [.3F88.0020.0002] # YI SYLLABLE LO +A1CA ; [.3F89.0020.0002] # YI SYLLABLE LOP +A1CB ; [.3F8A.0020.0002] # YI SYLLABLE LEX +A1CC ; [.3F8B.0020.0002] # YI SYLLABLE LE +A1CD ; [.3F8C.0020.0002] # YI SYLLABLE LEP +A1CE ; [.3F8D.0020.0002] # YI SYLLABLE LUT +A1CF ; [.3F8E.0020.0002] # YI SYLLABLE LUX +A1D0 ; [.3F8F.0020.0002] # YI SYLLABLE LU +A1D1 ; [.3F90.0020.0002] # YI SYLLABLE LUP +A1D2 ; [.3F91.0020.0002] # YI SYLLABLE LURX +A1D3 ; [.3F92.0020.0002] # YI SYLLABLE LUR +A1D4 ; [.3F93.0020.0002] # YI SYLLABLE LYT +A1D5 ; [.3F94.0020.0002] # YI SYLLABLE LYX +A1D6 ; [.3F95.0020.0002] # YI SYLLABLE LY +A1D7 ; [.3F96.0020.0002] # YI SYLLABLE LYP +A1D8 ; [.3F97.0020.0002] # YI SYLLABLE LYRX +A1D9 ; [.3F98.0020.0002] # YI SYLLABLE LYR +A1DA ; [.3F99.0020.0002] # YI SYLLABLE GIT +A1DB ; [.3F9A.0020.0002] # YI SYLLABLE GIX +A1DC ; [.3F9B.0020.0002] # YI SYLLABLE GI +A1DD ; [.3F9C.0020.0002] # YI SYLLABLE GIP +A1DE ; [.3F9D.0020.0002] # YI SYLLABLE GIET +A1DF ; [.3F9E.0020.0002] # YI SYLLABLE GIEX +A1E0 ; [.3F9F.0020.0002] # YI SYLLABLE GIE +A1E1 ; [.3FA0.0020.0002] # YI SYLLABLE GIEP +A1E2 ; [.3FA1.0020.0002] # YI SYLLABLE GAT +A1E3 ; [.3FA2.0020.0002] # YI SYLLABLE GAX +A1E4 ; [.3FA3.0020.0002] # YI SYLLABLE GA +A1E5 ; [.3FA4.0020.0002] # YI SYLLABLE GAP +A1E6 ; [.3FA5.0020.0002] # YI SYLLABLE GUOT +A1E7 ; [.3FA6.0020.0002] # YI SYLLABLE GUOX +A1E8 ; [.3FA7.0020.0002] # YI SYLLABLE GUO +A1E9 ; [.3FA8.0020.0002] # YI SYLLABLE GUOP +A1EA ; [.3FA9.0020.0002] # YI SYLLABLE GOT +A1EB ; [.3FAA.0020.0002] # YI SYLLABLE GOX +A1EC ; [.3FAB.0020.0002] # YI SYLLABLE GO +A1ED ; [.3FAC.0020.0002] # YI SYLLABLE GOP +A1EE ; [.3FAD.0020.0002] # YI SYLLABLE GET +A1EF ; [.3FAE.0020.0002] # YI SYLLABLE GEX +A1F0 ; [.3FAF.0020.0002] # YI SYLLABLE GE +A1F1 ; [.3FB0.0020.0002] # YI SYLLABLE GEP +A1F2 ; [.3FB1.0020.0002] # YI SYLLABLE GUT +A1F3 ; [.3FB2.0020.0002] # YI SYLLABLE GUX +A1F4 ; [.3FB3.0020.0002] # YI SYLLABLE GU +A1F5 ; [.3FB4.0020.0002] # YI SYLLABLE GUP +A1F6 ; [.3FB5.0020.0002] # YI SYLLABLE GURX +A1F7 ; [.3FB6.0020.0002] # YI SYLLABLE GUR +A1F8 ; [.3FB7.0020.0002] # YI SYLLABLE KIT +A1F9 ; [.3FB8.0020.0002] # YI SYLLABLE KIX +A1FA ; [.3FB9.0020.0002] # YI SYLLABLE KI +A1FB ; [.3FBA.0020.0002] # YI SYLLABLE KIP +A1FC ; [.3FBB.0020.0002] # YI SYLLABLE KIEX +A1FD ; [.3FBC.0020.0002] # YI SYLLABLE KIE +A1FE ; [.3FBD.0020.0002] # YI SYLLABLE KIEP +A1FF ; [.3FBE.0020.0002] # YI SYLLABLE KAT +A200 ; [.3FBF.0020.0002] # YI SYLLABLE KAX +A201 ; [.3FC0.0020.0002] # YI SYLLABLE KA +A202 ; [.3FC1.0020.0002] # YI SYLLABLE KAP +A203 ; [.3FC2.0020.0002] # YI SYLLABLE KUOX +A204 ; [.3FC3.0020.0002] # YI SYLLABLE KUO +A205 ; [.3FC4.0020.0002] # YI SYLLABLE KUOP +A206 ; [.3FC5.0020.0002] # YI SYLLABLE KOT +A207 ; [.3FC6.0020.0002] # YI SYLLABLE KOX +A208 ; [.3FC7.0020.0002] # YI SYLLABLE KO +A209 ; [.3FC8.0020.0002] # YI SYLLABLE KOP +A20A ; [.3FC9.0020.0002] # YI SYLLABLE KET +A20B ; [.3FCA.0020.0002] # YI SYLLABLE KEX +A20C ; [.3FCB.0020.0002] # YI SYLLABLE KE +A20D ; [.3FCC.0020.0002] # YI SYLLABLE KEP +A20E ; [.3FCD.0020.0002] # YI SYLLABLE KUT +A20F ; [.3FCE.0020.0002] # YI SYLLABLE KUX +A210 ; [.3FCF.0020.0002] # YI SYLLABLE KU +A211 ; [.3FD0.0020.0002] # YI SYLLABLE KUP +A212 ; [.3FD1.0020.0002] # YI SYLLABLE KURX +A213 ; [.3FD2.0020.0002] # YI SYLLABLE KUR +A214 ; [.3FD3.0020.0002] # YI SYLLABLE GGIT +A215 ; [.3FD4.0020.0002] # YI SYLLABLE GGIX +A216 ; [.3FD5.0020.0002] # YI SYLLABLE GGI +A217 ; [.3FD6.0020.0002] # YI SYLLABLE GGIEX +A218 ; [.3FD7.0020.0002] # YI SYLLABLE GGIE +A219 ; [.3FD8.0020.0002] # YI SYLLABLE GGIEP +A21A ; [.3FD9.0020.0002] # YI SYLLABLE GGAT +A21B ; [.3FDA.0020.0002] # YI SYLLABLE GGAX +A21C ; [.3FDB.0020.0002] # YI SYLLABLE GGA +A21D ; [.3FDC.0020.0002] # YI SYLLABLE GGAP +A21E ; [.3FDD.0020.0002] # YI SYLLABLE GGUOT +A21F ; [.3FDE.0020.0002] # YI SYLLABLE GGUOX +A220 ; [.3FDF.0020.0002] # YI SYLLABLE GGUO +A221 ; [.3FE0.0020.0002] # YI SYLLABLE GGUOP +A222 ; [.3FE1.0020.0002] # YI SYLLABLE GGOT +A223 ; [.3FE2.0020.0002] # YI SYLLABLE GGOX +A224 ; [.3FE3.0020.0002] # YI SYLLABLE GGO +A225 ; [.3FE4.0020.0002] # YI SYLLABLE GGOP +A226 ; [.3FE5.0020.0002] # YI SYLLABLE GGET +A227 ; [.3FE6.0020.0002] # YI SYLLABLE GGEX +A228 ; [.3FE7.0020.0002] # YI SYLLABLE GGE +A229 ; [.3FE8.0020.0002] # YI SYLLABLE GGEP +A22A ; [.3FE9.0020.0002] # YI SYLLABLE GGUT +A22B ; [.3FEA.0020.0002] # YI SYLLABLE GGUX +A22C ; [.3FEB.0020.0002] # YI SYLLABLE GGU +A22D ; [.3FEC.0020.0002] # YI SYLLABLE GGUP +A22E ; [.3FED.0020.0002] # YI SYLLABLE GGURX +A22F ; [.3FEE.0020.0002] # YI SYLLABLE GGUR +A230 ; [.3FEF.0020.0002] # YI SYLLABLE MGIEX +A231 ; [.3FF0.0020.0002] # YI SYLLABLE MGIE +A232 ; [.3FF1.0020.0002] # YI SYLLABLE MGAT +A233 ; [.3FF2.0020.0002] # YI SYLLABLE MGAX +A234 ; [.3FF3.0020.0002] # YI SYLLABLE MGA +A235 ; [.3FF4.0020.0002] # YI SYLLABLE MGAP +A236 ; [.3FF5.0020.0002] # YI SYLLABLE MGUOX +A237 ; [.3FF6.0020.0002] # YI SYLLABLE MGUO +A238 ; [.3FF7.0020.0002] # YI SYLLABLE MGUOP +A239 ; [.3FF8.0020.0002] # YI SYLLABLE MGOT +A23A ; [.3FF9.0020.0002] # YI SYLLABLE MGOX +A23B ; [.3FFA.0020.0002] # YI SYLLABLE MGO +A23C ; [.3FFB.0020.0002] # YI SYLLABLE MGOP +A23D ; [.3FFC.0020.0002] # YI SYLLABLE MGEX +A23E ; [.3FFD.0020.0002] # YI SYLLABLE MGE +A23F ; [.3FFE.0020.0002] # YI SYLLABLE MGEP +A240 ; [.3FFF.0020.0002] # YI SYLLABLE MGUT +A241 ; [.4000.0020.0002] # YI SYLLABLE MGUX +A242 ; [.4001.0020.0002] # YI SYLLABLE MGU +A243 ; [.4002.0020.0002] # YI SYLLABLE MGUP +A244 ; [.4003.0020.0002] # YI SYLLABLE MGURX +A245 ; [.4004.0020.0002] # YI SYLLABLE MGUR +A246 ; [.4005.0020.0002] # YI SYLLABLE HXIT +A247 ; [.4006.0020.0002] # YI SYLLABLE HXIX +A248 ; [.4007.0020.0002] # YI SYLLABLE HXI +A249 ; [.4008.0020.0002] # YI SYLLABLE HXIP +A24A ; [.4009.0020.0002] # YI SYLLABLE HXIET +A24B ; [.400A.0020.0002] # YI SYLLABLE HXIEX +A24C ; [.400B.0020.0002] # YI SYLLABLE HXIE +A24D ; [.400C.0020.0002] # YI SYLLABLE HXIEP +A24E ; [.400D.0020.0002] # YI SYLLABLE HXAT +A24F ; [.400E.0020.0002] # YI SYLLABLE HXAX +A250 ; [.400F.0020.0002] # YI SYLLABLE HXA +A251 ; [.4010.0020.0002] # YI SYLLABLE HXAP +A252 ; [.4011.0020.0002] # YI SYLLABLE HXUOT +A253 ; [.4012.0020.0002] # YI SYLLABLE HXUOX +A254 ; [.4013.0020.0002] # YI SYLLABLE HXUO +A255 ; [.4014.0020.0002] # YI SYLLABLE HXUOP +A256 ; [.4015.0020.0002] # YI SYLLABLE HXOT +A257 ; [.4016.0020.0002] # YI SYLLABLE HXOX +A258 ; [.4017.0020.0002] # YI SYLLABLE HXO +A259 ; [.4018.0020.0002] # YI SYLLABLE HXOP +A25A ; [.4019.0020.0002] # YI SYLLABLE HXEX +A25B ; [.401A.0020.0002] # YI SYLLABLE HXE +A25C ; [.401B.0020.0002] # YI SYLLABLE HXEP +A25D ; [.401C.0020.0002] # YI SYLLABLE NGIEX +A25E ; [.401D.0020.0002] # YI SYLLABLE NGIE +A25F ; [.401E.0020.0002] # YI SYLLABLE NGIEP +A260 ; [.401F.0020.0002] # YI SYLLABLE NGAT +A261 ; [.4020.0020.0002] # YI SYLLABLE NGAX +A262 ; [.4021.0020.0002] # YI SYLLABLE NGA +A263 ; [.4022.0020.0002] # YI SYLLABLE NGAP +A264 ; [.4023.0020.0002] # YI SYLLABLE NGUOT +A265 ; [.4024.0020.0002] # YI SYLLABLE NGUOX +A266 ; [.4025.0020.0002] # YI SYLLABLE NGUO +A267 ; [.4026.0020.0002] # YI SYLLABLE NGOT +A268 ; [.4027.0020.0002] # YI SYLLABLE NGOX +A269 ; [.4028.0020.0002] # YI SYLLABLE NGO +A26A ; [.4029.0020.0002] # YI SYLLABLE NGOP +A26B ; [.402A.0020.0002] # YI SYLLABLE NGEX +A26C ; [.402B.0020.0002] # YI SYLLABLE NGE +A26D ; [.402C.0020.0002] # YI SYLLABLE NGEP +A26E ; [.402D.0020.0002] # YI SYLLABLE HIT +A26F ; [.402E.0020.0002] # YI SYLLABLE HIEX +A270 ; [.402F.0020.0002] # YI SYLLABLE HIE +A271 ; [.4030.0020.0002] # YI SYLLABLE HAT +A272 ; [.4031.0020.0002] # YI SYLLABLE HAX +A273 ; [.4032.0020.0002] # YI SYLLABLE HA +A274 ; [.4033.0020.0002] # YI SYLLABLE HAP +A275 ; [.4034.0020.0002] # YI SYLLABLE HUOT +A276 ; [.4035.0020.0002] # YI SYLLABLE HUOX +A277 ; [.4036.0020.0002] # YI SYLLABLE HUO +A278 ; [.4037.0020.0002] # YI SYLLABLE HUOP +A279 ; [.4038.0020.0002] # YI SYLLABLE HOT +A27A ; [.4039.0020.0002] # YI SYLLABLE HOX +A27B ; [.403A.0020.0002] # YI SYLLABLE HO +A27C ; [.403B.0020.0002] # YI SYLLABLE HOP +A27D ; [.403C.0020.0002] # YI SYLLABLE HEX +A27E ; [.403D.0020.0002] # YI SYLLABLE HE +A27F ; [.403E.0020.0002] # YI SYLLABLE HEP +A280 ; [.403F.0020.0002] # YI SYLLABLE WAT +A281 ; [.4040.0020.0002] # YI SYLLABLE WAX +A282 ; [.4041.0020.0002] # YI SYLLABLE WA +A283 ; [.4042.0020.0002] # YI SYLLABLE WAP +A284 ; [.4043.0020.0002] # YI SYLLABLE WUOX +A285 ; [.4044.0020.0002] # YI SYLLABLE WUO +A286 ; [.4045.0020.0002] # YI SYLLABLE WUOP +A287 ; [.4046.0020.0002] # YI SYLLABLE WOX +A288 ; [.4047.0020.0002] # YI SYLLABLE WO +A289 ; [.4048.0020.0002] # YI SYLLABLE WOP +A28A ; [.4049.0020.0002] # YI SYLLABLE WEX +A28B ; [.404A.0020.0002] # YI SYLLABLE WE +A28C ; [.404B.0020.0002] # YI SYLLABLE WEP +A28D ; [.404C.0020.0002] # YI SYLLABLE ZIT +A28E ; [.404D.0020.0002] # YI SYLLABLE ZIX +A28F ; [.404E.0020.0002] # YI SYLLABLE ZI +A290 ; [.404F.0020.0002] # YI SYLLABLE ZIP +A291 ; [.4050.0020.0002] # YI SYLLABLE ZIEX +A292 ; [.4051.0020.0002] # YI SYLLABLE ZIE +A293 ; [.4052.0020.0002] # YI SYLLABLE ZIEP +A294 ; [.4053.0020.0002] # YI SYLLABLE ZAT +A295 ; [.4054.0020.0002] # YI SYLLABLE ZAX +A296 ; [.4055.0020.0002] # YI SYLLABLE ZA +A297 ; [.4056.0020.0002] # YI SYLLABLE ZAP +A298 ; [.4057.0020.0002] # YI SYLLABLE ZUOX +A299 ; [.4058.0020.0002] # YI SYLLABLE ZUO +A29A ; [.4059.0020.0002] # YI SYLLABLE ZUOP +A29B ; [.405A.0020.0002] # YI SYLLABLE ZOT +A29C ; [.405B.0020.0002] # YI SYLLABLE ZOX +A29D ; [.405C.0020.0002] # YI SYLLABLE ZO +A29E ; [.405D.0020.0002] # YI SYLLABLE ZOP +A29F ; [.405E.0020.0002] # YI SYLLABLE ZEX +A2A0 ; [.405F.0020.0002] # YI SYLLABLE ZE +A2A1 ; [.4060.0020.0002] # YI SYLLABLE ZEP +A2A2 ; [.4061.0020.0002] # YI SYLLABLE ZUT +A2A3 ; [.4062.0020.0002] # YI SYLLABLE ZUX +A2A4 ; [.4063.0020.0002] # YI SYLLABLE ZU +A2A5 ; [.4064.0020.0002] # YI SYLLABLE ZUP +A2A6 ; [.4065.0020.0002] # YI SYLLABLE ZURX +A2A7 ; [.4066.0020.0002] # YI SYLLABLE ZUR +A2A8 ; [.4067.0020.0002] # YI SYLLABLE ZYT +A2A9 ; [.4068.0020.0002] # YI SYLLABLE ZYX +A2AA ; [.4069.0020.0002] # YI SYLLABLE ZY +A2AB ; [.406A.0020.0002] # YI SYLLABLE ZYP +A2AC ; [.406B.0020.0002] # YI SYLLABLE ZYRX +A2AD ; [.406C.0020.0002] # YI SYLLABLE ZYR +A2AE ; [.406D.0020.0002] # YI SYLLABLE CIT +A2AF ; [.406E.0020.0002] # YI SYLLABLE CIX +A2B0 ; [.406F.0020.0002] # YI SYLLABLE CI +A2B1 ; [.4070.0020.0002] # YI SYLLABLE CIP +A2B2 ; [.4071.0020.0002] # YI SYLLABLE CIET +A2B3 ; [.4072.0020.0002] # YI SYLLABLE CIEX +A2B4 ; [.4073.0020.0002] # YI SYLLABLE CIE +A2B5 ; [.4074.0020.0002] # YI SYLLABLE CIEP +A2B6 ; [.4075.0020.0002] # YI SYLLABLE CAT +A2B7 ; [.4076.0020.0002] # YI SYLLABLE CAX +A2B8 ; [.4077.0020.0002] # YI SYLLABLE CA +A2B9 ; [.4078.0020.0002] # YI SYLLABLE CAP +A2BA ; [.4079.0020.0002] # YI SYLLABLE CUOX +A2BB ; [.407A.0020.0002] # YI SYLLABLE CUO +A2BC ; [.407B.0020.0002] # YI SYLLABLE CUOP +A2BD ; [.407C.0020.0002] # YI SYLLABLE COT +A2BE ; [.407D.0020.0002] # YI SYLLABLE COX +A2BF ; [.407E.0020.0002] # YI SYLLABLE CO +A2C0 ; [.407F.0020.0002] # YI SYLLABLE COP +A2C1 ; [.4080.0020.0002] # YI SYLLABLE CEX +A2C2 ; [.4081.0020.0002] # YI SYLLABLE CE +A2C3 ; [.4082.0020.0002] # YI SYLLABLE CEP +A2C4 ; [.4083.0020.0002] # YI SYLLABLE CUT +A2C5 ; [.4084.0020.0002] # YI SYLLABLE CUX +A2C6 ; [.4085.0020.0002] # YI SYLLABLE CU +A2C7 ; [.4086.0020.0002] # YI SYLLABLE CUP +A2C8 ; [.4087.0020.0002] # YI SYLLABLE CURX +A2C9 ; [.4088.0020.0002] # YI SYLLABLE CUR +A2CA ; [.4089.0020.0002] # YI SYLLABLE CYT +A2CB ; [.408A.0020.0002] # YI SYLLABLE CYX +A2CC ; [.408B.0020.0002] # YI SYLLABLE CY +A2CD ; [.408C.0020.0002] # YI SYLLABLE CYP +A2CE ; [.408D.0020.0002] # YI SYLLABLE CYRX +A2CF ; [.408E.0020.0002] # YI SYLLABLE CYR +A2D0 ; [.408F.0020.0002] # YI SYLLABLE ZZIT +A2D1 ; [.4090.0020.0002] # YI SYLLABLE ZZIX +A2D2 ; [.4091.0020.0002] # YI SYLLABLE ZZI +A2D3 ; [.4092.0020.0002] # YI SYLLABLE ZZIP +A2D4 ; [.4093.0020.0002] # YI SYLLABLE ZZIET +A2D5 ; [.4094.0020.0002] # YI SYLLABLE ZZIEX +A2D6 ; [.4095.0020.0002] # YI SYLLABLE ZZIE +A2D7 ; [.4096.0020.0002] # YI SYLLABLE ZZIEP +A2D8 ; [.4097.0020.0002] # YI SYLLABLE ZZAT +A2D9 ; [.4098.0020.0002] # YI SYLLABLE ZZAX +A2DA ; [.4099.0020.0002] # YI SYLLABLE ZZA +A2DB ; [.409A.0020.0002] # YI SYLLABLE ZZAP +A2DC ; [.409B.0020.0002] # YI SYLLABLE ZZOX +A2DD ; [.409C.0020.0002] # YI SYLLABLE ZZO +A2DE ; [.409D.0020.0002] # YI SYLLABLE ZZOP +A2DF ; [.409E.0020.0002] # YI SYLLABLE ZZEX +A2E0 ; [.409F.0020.0002] # YI SYLLABLE ZZE +A2E1 ; [.40A0.0020.0002] # YI SYLLABLE ZZEP +A2E2 ; [.40A1.0020.0002] # YI SYLLABLE ZZUX +A2E3 ; [.40A2.0020.0002] # YI SYLLABLE ZZU +A2E4 ; [.40A3.0020.0002] # YI SYLLABLE ZZUP +A2E5 ; [.40A4.0020.0002] # YI SYLLABLE ZZURX +A2E6 ; [.40A5.0020.0002] # YI SYLLABLE ZZUR +A2E7 ; [.40A6.0020.0002] # YI SYLLABLE ZZYT +A2E8 ; [.40A7.0020.0002] # YI SYLLABLE ZZYX +A2E9 ; [.40A8.0020.0002] # YI SYLLABLE ZZY +A2EA ; [.40A9.0020.0002] # YI SYLLABLE ZZYP +A2EB ; [.40AA.0020.0002] # YI SYLLABLE ZZYRX +A2EC ; [.40AB.0020.0002] # YI SYLLABLE ZZYR +A2ED ; [.40AC.0020.0002] # YI SYLLABLE NZIT +A2EE ; [.40AD.0020.0002] # YI SYLLABLE NZIX +A2EF ; [.40AE.0020.0002] # YI SYLLABLE NZI +A2F0 ; [.40AF.0020.0002] # YI SYLLABLE NZIP +A2F1 ; [.40B0.0020.0002] # YI SYLLABLE NZIEX +A2F2 ; [.40B1.0020.0002] # YI SYLLABLE NZIE +A2F3 ; [.40B2.0020.0002] # YI SYLLABLE NZIEP +A2F4 ; [.40B3.0020.0002] # YI SYLLABLE NZAT +A2F5 ; [.40B4.0020.0002] # YI SYLLABLE NZAX +A2F6 ; [.40B5.0020.0002] # YI SYLLABLE NZA +A2F7 ; [.40B6.0020.0002] # YI SYLLABLE NZAP +A2F8 ; [.40B7.0020.0002] # YI SYLLABLE NZUOX +A2F9 ; [.40B8.0020.0002] # YI SYLLABLE NZUO +A2FA ; [.40B9.0020.0002] # YI SYLLABLE NZOX +A2FB ; [.40BA.0020.0002] # YI SYLLABLE NZOP +A2FC ; [.40BB.0020.0002] # YI SYLLABLE NZEX +A2FD ; [.40BC.0020.0002] # YI SYLLABLE NZE +A2FE ; [.40BD.0020.0002] # YI SYLLABLE NZUX +A2FF ; [.40BE.0020.0002] # YI SYLLABLE NZU +A300 ; [.40BF.0020.0002] # YI SYLLABLE NZUP +A301 ; [.40C0.0020.0002] # YI SYLLABLE NZURX +A302 ; [.40C1.0020.0002] # YI SYLLABLE NZUR +A303 ; [.40C2.0020.0002] # YI SYLLABLE NZYT +A304 ; [.40C3.0020.0002] # YI SYLLABLE NZYX +A305 ; [.40C4.0020.0002] # YI SYLLABLE NZY +A306 ; [.40C5.0020.0002] # YI SYLLABLE NZYP +A307 ; [.40C6.0020.0002] # YI SYLLABLE NZYRX +A308 ; [.40C7.0020.0002] # YI SYLLABLE NZYR +A309 ; [.40C8.0020.0002] # YI SYLLABLE SIT +A30A ; [.40C9.0020.0002] # YI SYLLABLE SIX +A30B ; [.40CA.0020.0002] # YI SYLLABLE SI +A30C ; [.40CB.0020.0002] # YI SYLLABLE SIP +A30D ; [.40CC.0020.0002] # YI SYLLABLE SIEX +A30E ; [.40CD.0020.0002] # YI SYLLABLE SIE +A30F ; [.40CE.0020.0002] # YI SYLLABLE SIEP +A310 ; [.40CF.0020.0002] # YI SYLLABLE SAT +A311 ; [.40D0.0020.0002] # YI SYLLABLE SAX +A312 ; [.40D1.0020.0002] # YI SYLLABLE SA +A313 ; [.40D2.0020.0002] # YI SYLLABLE SAP +A314 ; [.40D3.0020.0002] # YI SYLLABLE SUOX +A315 ; [.40D4.0020.0002] # YI SYLLABLE SUO +A316 ; [.40D5.0020.0002] # YI SYLLABLE SUOP +A317 ; [.40D6.0020.0002] # YI SYLLABLE SOT +A318 ; [.40D7.0020.0002] # YI SYLLABLE SOX +A319 ; [.40D8.0020.0002] # YI SYLLABLE SO +A31A ; [.40D9.0020.0002] # YI SYLLABLE SOP +A31B ; [.40DA.0020.0002] # YI SYLLABLE SEX +A31C ; [.40DB.0020.0002] # YI SYLLABLE SE +A31D ; [.40DC.0020.0002] # YI SYLLABLE SEP +A31E ; [.40DD.0020.0002] # YI SYLLABLE SUT +A31F ; [.40DE.0020.0002] # YI SYLLABLE SUX +A320 ; [.40DF.0020.0002] # YI SYLLABLE SU +A321 ; [.40E0.0020.0002] # YI SYLLABLE SUP +A322 ; [.40E1.0020.0002] # YI SYLLABLE SURX +A323 ; [.40E2.0020.0002] # YI SYLLABLE SUR +A324 ; [.40E3.0020.0002] # YI SYLLABLE SYT +A325 ; [.40E4.0020.0002] # YI SYLLABLE SYX +A326 ; [.40E5.0020.0002] # YI SYLLABLE SY +A327 ; [.40E6.0020.0002] # YI SYLLABLE SYP +A328 ; [.40E7.0020.0002] # YI SYLLABLE SYRX +A329 ; [.40E8.0020.0002] # YI SYLLABLE SYR +A32A ; [.40E9.0020.0002] # YI SYLLABLE SSIT +A32B ; [.40EA.0020.0002] # YI SYLLABLE SSIX +A32C ; [.40EB.0020.0002] # YI SYLLABLE SSI +A32D ; [.40EC.0020.0002] # YI SYLLABLE SSIP +A32E ; [.40ED.0020.0002] # YI SYLLABLE SSIEX +A32F ; [.40EE.0020.0002] # YI SYLLABLE SSIE +A330 ; [.40EF.0020.0002] # YI SYLLABLE SSIEP +A331 ; [.40F0.0020.0002] # YI SYLLABLE SSAT +A332 ; [.40F1.0020.0002] # YI SYLLABLE SSAX +A333 ; [.40F2.0020.0002] # YI SYLLABLE SSA +A334 ; [.40F3.0020.0002] # YI SYLLABLE SSAP +A335 ; [.40F4.0020.0002] # YI SYLLABLE SSOT +A336 ; [.40F5.0020.0002] # YI SYLLABLE SSOX +A337 ; [.40F6.0020.0002] # YI SYLLABLE SSO +A338 ; [.40F7.0020.0002] # YI SYLLABLE SSOP +A339 ; [.40F8.0020.0002] # YI SYLLABLE SSEX +A33A ; [.40F9.0020.0002] # YI SYLLABLE SSE +A33B ; [.40FA.0020.0002] # YI SYLLABLE SSEP +A33C ; [.40FB.0020.0002] # YI SYLLABLE SSUT +A33D ; [.40FC.0020.0002] # YI SYLLABLE SSUX +A33E ; [.40FD.0020.0002] # YI SYLLABLE SSU +A33F ; [.40FE.0020.0002] # YI SYLLABLE SSUP +A340 ; [.40FF.0020.0002] # YI SYLLABLE SSYT +A341 ; [.4100.0020.0002] # YI SYLLABLE SSYX +A342 ; [.4101.0020.0002] # YI SYLLABLE SSY +A343 ; [.4102.0020.0002] # YI SYLLABLE SSYP +A344 ; [.4103.0020.0002] # YI SYLLABLE SSYRX +A345 ; [.4104.0020.0002] # YI SYLLABLE SSYR +A346 ; [.4105.0020.0002] # YI SYLLABLE ZHAT +A347 ; [.4106.0020.0002] # YI SYLLABLE ZHAX +A348 ; [.4107.0020.0002] # YI SYLLABLE ZHA +A349 ; [.4108.0020.0002] # YI SYLLABLE ZHAP +A34A ; [.4109.0020.0002] # YI SYLLABLE ZHUOX +A34B ; [.410A.0020.0002] # YI SYLLABLE ZHUO +A34C ; [.410B.0020.0002] # YI SYLLABLE ZHUOP +A34D ; [.410C.0020.0002] # YI SYLLABLE ZHOT +A34E ; [.410D.0020.0002] # YI SYLLABLE ZHOX +A34F ; [.410E.0020.0002] # YI SYLLABLE ZHO +A350 ; [.410F.0020.0002] # YI SYLLABLE ZHOP +A351 ; [.4110.0020.0002] # YI SYLLABLE ZHET +A352 ; [.4111.0020.0002] # YI SYLLABLE ZHEX +A353 ; [.4112.0020.0002] # YI SYLLABLE ZHE +A354 ; [.4113.0020.0002] # YI SYLLABLE ZHEP +A355 ; [.4114.0020.0002] # YI SYLLABLE ZHUT +A356 ; [.4115.0020.0002] # YI SYLLABLE ZHUX +A357 ; [.4116.0020.0002] # YI SYLLABLE ZHU +A358 ; [.4117.0020.0002] # YI SYLLABLE ZHUP +A359 ; [.4118.0020.0002] # YI SYLLABLE ZHURX +A35A ; [.4119.0020.0002] # YI SYLLABLE ZHUR +A35B ; [.411A.0020.0002] # YI SYLLABLE ZHYT +A35C ; [.411B.0020.0002] # YI SYLLABLE ZHYX +A35D ; [.411C.0020.0002] # YI SYLLABLE ZHY +A35E ; [.411D.0020.0002] # YI SYLLABLE ZHYP +A35F ; [.411E.0020.0002] # YI SYLLABLE ZHYRX +A360 ; [.411F.0020.0002] # YI SYLLABLE ZHYR +A361 ; [.4120.0020.0002] # YI SYLLABLE CHAT +A362 ; [.4121.0020.0002] # YI SYLLABLE CHAX +A363 ; [.4122.0020.0002] # YI SYLLABLE CHA +A364 ; [.4123.0020.0002] # YI SYLLABLE CHAP +A365 ; [.4124.0020.0002] # YI SYLLABLE CHUOT +A366 ; [.4125.0020.0002] # YI SYLLABLE CHUOX +A367 ; [.4126.0020.0002] # YI SYLLABLE CHUO +A368 ; [.4127.0020.0002] # YI SYLLABLE CHUOP +A369 ; [.4128.0020.0002] # YI SYLLABLE CHOT +A36A ; [.4129.0020.0002] # YI SYLLABLE CHOX +A36B ; [.412A.0020.0002] # YI SYLLABLE CHO +A36C ; [.412B.0020.0002] # YI SYLLABLE CHOP +A36D ; [.412C.0020.0002] # YI SYLLABLE CHET +A36E ; [.412D.0020.0002] # YI SYLLABLE CHEX +A36F ; [.412E.0020.0002] # YI SYLLABLE CHE +A370 ; [.412F.0020.0002] # YI SYLLABLE CHEP +A371 ; [.4130.0020.0002] # YI SYLLABLE CHUX +A372 ; [.4131.0020.0002] # YI SYLLABLE CHU +A373 ; [.4132.0020.0002] # YI SYLLABLE CHUP +A374 ; [.4133.0020.0002] # YI SYLLABLE CHURX +A375 ; [.4134.0020.0002] # YI SYLLABLE CHUR +A376 ; [.4135.0020.0002] # YI SYLLABLE CHYT +A377 ; [.4136.0020.0002] # YI SYLLABLE CHYX +A378 ; [.4137.0020.0002] # YI SYLLABLE CHY +A379 ; [.4138.0020.0002] # YI SYLLABLE CHYP +A37A ; [.4139.0020.0002] # YI SYLLABLE CHYRX +A37B ; [.413A.0020.0002] # YI SYLLABLE CHYR +A37C ; [.413B.0020.0002] # YI SYLLABLE RRAX +A37D ; [.413C.0020.0002] # YI SYLLABLE RRA +A37E ; [.413D.0020.0002] # YI SYLLABLE RRUOX +A37F ; [.413E.0020.0002] # YI SYLLABLE RRUO +A380 ; [.413F.0020.0002] # YI SYLLABLE RROT +A381 ; [.4140.0020.0002] # YI SYLLABLE RROX +A382 ; [.4141.0020.0002] # YI SYLLABLE RRO +A383 ; [.4142.0020.0002] # YI SYLLABLE RROP +A384 ; [.4143.0020.0002] # YI SYLLABLE RRET +A385 ; [.4144.0020.0002] # YI SYLLABLE RREX +A386 ; [.4145.0020.0002] # YI SYLLABLE RRE +A387 ; [.4146.0020.0002] # YI SYLLABLE RREP +A388 ; [.4147.0020.0002] # YI SYLLABLE RRUT +A389 ; [.4148.0020.0002] # YI SYLLABLE RRUX +A38A ; [.4149.0020.0002] # YI SYLLABLE RRU +A38B ; [.414A.0020.0002] # YI SYLLABLE RRUP +A38C ; [.414B.0020.0002] # YI SYLLABLE RRURX +A38D ; [.414C.0020.0002] # YI SYLLABLE RRUR +A38E ; [.414D.0020.0002] # YI SYLLABLE RRYT +A38F ; [.414E.0020.0002] # YI SYLLABLE RRYX +A390 ; [.414F.0020.0002] # YI SYLLABLE RRY +A391 ; [.4150.0020.0002] # YI SYLLABLE RRYP +A392 ; [.4151.0020.0002] # YI SYLLABLE RRYRX +A393 ; [.4152.0020.0002] # YI SYLLABLE RRYR +A394 ; [.4153.0020.0002] # YI SYLLABLE NRAT +A395 ; [.4154.0020.0002] # YI SYLLABLE NRAX +A396 ; [.4155.0020.0002] # YI SYLLABLE NRA +A397 ; [.4156.0020.0002] # YI SYLLABLE NRAP +A398 ; [.4157.0020.0002] # YI SYLLABLE NROX +A399 ; [.4158.0020.0002] # YI SYLLABLE NRO +A39A ; [.4159.0020.0002] # YI SYLLABLE NROP +A39B ; [.415A.0020.0002] # YI SYLLABLE NRET +A39C ; [.415B.0020.0002] # YI SYLLABLE NREX +A39D ; [.415C.0020.0002] # YI SYLLABLE NRE +A39E ; [.415D.0020.0002] # YI SYLLABLE NREP +A39F ; [.415E.0020.0002] # YI SYLLABLE NRUT +A3A0 ; [.415F.0020.0002] # YI SYLLABLE NRUX +A3A1 ; [.4160.0020.0002] # YI SYLLABLE NRU +A3A2 ; [.4161.0020.0002] # YI SYLLABLE NRUP +A3A3 ; [.4162.0020.0002] # YI SYLLABLE NRURX +A3A4 ; [.4163.0020.0002] # YI SYLLABLE NRUR +A3A5 ; [.4164.0020.0002] # YI SYLLABLE NRYT +A3A6 ; [.4165.0020.0002] # YI SYLLABLE NRYX +A3A7 ; [.4166.0020.0002] # YI SYLLABLE NRY +A3A8 ; [.4167.0020.0002] # YI SYLLABLE NRYP +A3A9 ; [.4168.0020.0002] # YI SYLLABLE NRYRX +A3AA ; [.4169.0020.0002] # YI SYLLABLE NRYR +A3AB ; [.416A.0020.0002] # YI SYLLABLE SHAT +A3AC ; [.416B.0020.0002] # YI SYLLABLE SHAX +A3AD ; [.416C.0020.0002] # YI SYLLABLE SHA +A3AE ; [.416D.0020.0002] # YI SYLLABLE SHAP +A3AF ; [.416E.0020.0002] # YI SYLLABLE SHUOX +A3B0 ; [.416F.0020.0002] # YI SYLLABLE SHUO +A3B1 ; [.4170.0020.0002] # YI SYLLABLE SHUOP +A3B2 ; [.4171.0020.0002] # YI SYLLABLE SHOT +A3B3 ; [.4172.0020.0002] # YI SYLLABLE SHOX +A3B4 ; [.4173.0020.0002] # YI SYLLABLE SHO +A3B5 ; [.4174.0020.0002] # YI SYLLABLE SHOP +A3B6 ; [.4175.0020.0002] # YI SYLLABLE SHET +A3B7 ; [.4176.0020.0002] # YI SYLLABLE SHEX +A3B8 ; [.4177.0020.0002] # YI SYLLABLE SHE +A3B9 ; [.4178.0020.0002] # YI SYLLABLE SHEP +A3BA ; [.4179.0020.0002] # YI SYLLABLE SHUT +A3BB ; [.417A.0020.0002] # YI SYLLABLE SHUX +A3BC ; [.417B.0020.0002] # YI SYLLABLE SHU +A3BD ; [.417C.0020.0002] # YI SYLLABLE SHUP +A3BE ; [.417D.0020.0002] # YI SYLLABLE SHURX +A3BF ; [.417E.0020.0002] # YI SYLLABLE SHUR +A3C0 ; [.417F.0020.0002] # YI SYLLABLE SHYT +A3C1 ; [.4180.0020.0002] # YI SYLLABLE SHYX +A3C2 ; [.4181.0020.0002] # YI SYLLABLE SHY +A3C3 ; [.4182.0020.0002] # YI SYLLABLE SHYP +A3C4 ; [.4183.0020.0002] # YI SYLLABLE SHYRX +A3C5 ; [.4184.0020.0002] # YI SYLLABLE SHYR +A3C6 ; [.4185.0020.0002] # YI SYLLABLE RAT +A3C7 ; [.4186.0020.0002] # YI SYLLABLE RAX +A3C8 ; [.4187.0020.0002] # YI SYLLABLE RA +A3C9 ; [.4188.0020.0002] # YI SYLLABLE RAP +A3CA ; [.4189.0020.0002] # YI SYLLABLE RUOX +A3CB ; [.418A.0020.0002] # YI SYLLABLE RUO +A3CC ; [.418B.0020.0002] # YI SYLLABLE RUOP +A3CD ; [.418C.0020.0002] # YI SYLLABLE ROT +A3CE ; [.418D.0020.0002] # YI SYLLABLE ROX +A3CF ; [.418E.0020.0002] # YI SYLLABLE RO +A3D0 ; [.418F.0020.0002] # YI SYLLABLE ROP +A3D1 ; [.4190.0020.0002] # YI SYLLABLE REX +A3D2 ; [.4191.0020.0002] # YI SYLLABLE RE +A3D3 ; [.4192.0020.0002] # YI SYLLABLE REP +A3D4 ; [.4193.0020.0002] # YI SYLLABLE RUT +A3D5 ; [.4194.0020.0002] # YI SYLLABLE RUX +A3D6 ; [.4195.0020.0002] # YI SYLLABLE RU +A3D7 ; [.4196.0020.0002] # YI SYLLABLE RUP +A3D8 ; [.4197.0020.0002] # YI SYLLABLE RURX +A3D9 ; [.4198.0020.0002] # YI SYLLABLE RUR +A3DA ; [.4199.0020.0002] # YI SYLLABLE RYT +A3DB ; [.419A.0020.0002] # YI SYLLABLE RYX +A3DC ; [.419B.0020.0002] # YI SYLLABLE RY +A3DD ; [.419C.0020.0002] # YI SYLLABLE RYP +A3DE ; [.419D.0020.0002] # YI SYLLABLE RYRX +A3DF ; [.419E.0020.0002] # YI SYLLABLE RYR +A3E0 ; [.419F.0020.0002] # YI SYLLABLE JIT +A3E1 ; [.41A0.0020.0002] # YI SYLLABLE JIX +A3E2 ; [.41A1.0020.0002] # YI SYLLABLE JI +A3E3 ; [.41A2.0020.0002] # YI SYLLABLE JIP +A3E4 ; [.41A3.0020.0002] # YI SYLLABLE JIET +A3E5 ; [.41A4.0020.0002] # YI SYLLABLE JIEX +A3E6 ; [.41A5.0020.0002] # YI SYLLABLE JIE +A3E7 ; [.41A6.0020.0002] # YI SYLLABLE JIEP +A3E8 ; [.41A7.0020.0002] # YI SYLLABLE JUOT +A3E9 ; [.41A8.0020.0002] # YI SYLLABLE JUOX +A3EA ; [.41A9.0020.0002] # YI SYLLABLE JUO +A3EB ; [.41AA.0020.0002] # YI SYLLABLE JUOP +A3EC ; [.41AB.0020.0002] # YI SYLLABLE JOT +A3ED ; [.41AC.0020.0002] # YI SYLLABLE JOX +A3EE ; [.41AD.0020.0002] # YI SYLLABLE JO +A3EF ; [.41AE.0020.0002] # YI SYLLABLE JOP +A3F0 ; [.41AF.0020.0002] # YI SYLLABLE JUT +A3F1 ; [.41B0.0020.0002] # YI SYLLABLE JUX +A3F2 ; [.41B1.0020.0002] # YI SYLLABLE JU +A3F3 ; [.41B2.0020.0002] # YI SYLLABLE JUP +A3F4 ; [.41B3.0020.0002] # YI SYLLABLE JURX +A3F5 ; [.41B4.0020.0002] # YI SYLLABLE JUR +A3F6 ; [.41B5.0020.0002] # YI SYLLABLE JYT +A3F7 ; [.41B6.0020.0002] # YI SYLLABLE JYX +A3F8 ; [.41B7.0020.0002] # YI SYLLABLE JY +A3F9 ; [.41B8.0020.0002] # YI SYLLABLE JYP +A3FA ; [.41B9.0020.0002] # YI SYLLABLE JYRX +A3FB ; [.41BA.0020.0002] # YI SYLLABLE JYR +A3FC ; [.41BB.0020.0002] # YI SYLLABLE QIT +A3FD ; [.41BC.0020.0002] # YI SYLLABLE QIX +A3FE ; [.41BD.0020.0002] # YI SYLLABLE QI +A3FF ; [.41BE.0020.0002] # YI SYLLABLE QIP +A400 ; [.41BF.0020.0002] # YI SYLLABLE QIET +A401 ; [.41C0.0020.0002] # YI SYLLABLE QIEX +A402 ; [.41C1.0020.0002] # YI SYLLABLE QIE +A403 ; [.41C2.0020.0002] # YI SYLLABLE QIEP +A404 ; [.41C3.0020.0002] # YI SYLLABLE QUOT +A405 ; [.41C4.0020.0002] # YI SYLLABLE QUOX +A406 ; [.41C5.0020.0002] # YI SYLLABLE QUO +A407 ; [.41C6.0020.0002] # YI SYLLABLE QUOP +A408 ; [.41C7.0020.0002] # YI SYLLABLE QOT +A409 ; [.41C8.0020.0002] # YI SYLLABLE QOX +A40A ; [.41C9.0020.0002] # YI SYLLABLE QO +A40B ; [.41CA.0020.0002] # YI SYLLABLE QOP +A40C ; [.41CB.0020.0002] # YI SYLLABLE QUT +A40D ; [.41CC.0020.0002] # YI SYLLABLE QUX +A40E ; [.41CD.0020.0002] # YI SYLLABLE QU +A40F ; [.41CE.0020.0002] # YI SYLLABLE QUP +A410 ; [.41CF.0020.0002] # YI SYLLABLE QURX +A411 ; [.41D0.0020.0002] # YI SYLLABLE QUR +A412 ; [.41D1.0020.0002] # YI SYLLABLE QYT +A413 ; [.41D2.0020.0002] # YI SYLLABLE QYX +A414 ; [.41D3.0020.0002] # YI SYLLABLE QY +A415 ; [.41D4.0020.0002] # YI SYLLABLE QYP +A416 ; [.41D5.0020.0002] # YI SYLLABLE QYRX +A417 ; [.41D6.0020.0002] # YI SYLLABLE QYR +A418 ; [.41D7.0020.0002] # YI SYLLABLE JJIT +A419 ; [.41D8.0020.0002] # YI SYLLABLE JJIX +A41A ; [.41D9.0020.0002] # YI SYLLABLE JJI +A41B ; [.41DA.0020.0002] # YI SYLLABLE JJIP +A41C ; [.41DB.0020.0002] # YI SYLLABLE JJIET +A41D ; [.41DC.0020.0002] # YI SYLLABLE JJIEX +A41E ; [.41DD.0020.0002] # YI SYLLABLE JJIE +A41F ; [.41DE.0020.0002] # YI SYLLABLE JJIEP +A420 ; [.41DF.0020.0002] # YI SYLLABLE JJUOX +A421 ; [.41E0.0020.0002] # YI SYLLABLE JJUO +A422 ; [.41E1.0020.0002] # YI SYLLABLE JJUOP +A423 ; [.41E2.0020.0002] # YI SYLLABLE JJOT +A424 ; [.41E3.0020.0002] # YI SYLLABLE JJOX +A425 ; [.41E4.0020.0002] # YI SYLLABLE JJO +A426 ; [.41E5.0020.0002] # YI SYLLABLE JJOP +A427 ; [.41E6.0020.0002] # YI SYLLABLE JJUT +A428 ; [.41E7.0020.0002] # YI SYLLABLE JJUX +A429 ; [.41E8.0020.0002] # YI SYLLABLE JJU +A42A ; [.41E9.0020.0002] # YI SYLLABLE JJUP +A42B ; [.41EA.0020.0002] # YI SYLLABLE JJURX +A42C ; [.41EB.0020.0002] # YI SYLLABLE JJUR +A42D ; [.41EC.0020.0002] # YI SYLLABLE JJYT +A42E ; [.41ED.0020.0002] # YI SYLLABLE JJYX +A42F ; [.41EE.0020.0002] # YI SYLLABLE JJY +A430 ; [.41EF.0020.0002] # YI SYLLABLE JJYP +A431 ; [.41F0.0020.0002] # YI SYLLABLE NJIT +A432 ; [.41F1.0020.0002] # YI SYLLABLE NJIX +A433 ; [.41F2.0020.0002] # YI SYLLABLE NJI +A434 ; [.41F3.0020.0002] # YI SYLLABLE NJIP +A435 ; [.41F4.0020.0002] # YI SYLLABLE NJIET +A436 ; [.41F5.0020.0002] # YI SYLLABLE NJIEX +A437 ; [.41F6.0020.0002] # YI SYLLABLE NJIE +A438 ; [.41F7.0020.0002] # YI SYLLABLE NJIEP +A439 ; [.41F8.0020.0002] # YI SYLLABLE NJUOX +A43A ; [.41F9.0020.0002] # YI SYLLABLE NJUO +A43B ; [.41FA.0020.0002] # YI SYLLABLE NJOT +A43C ; [.41FB.0020.0002] # YI SYLLABLE NJOX +A43D ; [.41FC.0020.0002] # YI SYLLABLE NJO +A43E ; [.41FD.0020.0002] # YI SYLLABLE NJOP +A43F ; [.41FE.0020.0002] # YI SYLLABLE NJUX +A440 ; [.41FF.0020.0002] # YI SYLLABLE NJU +A441 ; [.4200.0020.0002] # YI SYLLABLE NJUP +A442 ; [.4201.0020.0002] # YI SYLLABLE NJURX +A443 ; [.4202.0020.0002] # YI SYLLABLE NJUR +A444 ; [.4203.0020.0002] # YI SYLLABLE NJYT +A445 ; [.4204.0020.0002] # YI SYLLABLE NJYX +A446 ; [.4205.0020.0002] # YI SYLLABLE NJY +A447 ; [.4206.0020.0002] # YI SYLLABLE NJYP +A448 ; [.4207.0020.0002] # YI SYLLABLE NJYRX +A449 ; [.4208.0020.0002] # YI SYLLABLE NJYR +A44A ; [.4209.0020.0002] # YI SYLLABLE NYIT +A44B ; [.420A.0020.0002] # YI SYLLABLE NYIX +A44C ; [.420B.0020.0002] # YI SYLLABLE NYI +A44D ; [.420C.0020.0002] # YI SYLLABLE NYIP +A44E ; [.420D.0020.0002] # YI SYLLABLE NYIET +A44F ; [.420E.0020.0002] # YI SYLLABLE NYIEX +A450 ; [.420F.0020.0002] # YI SYLLABLE NYIE +A451 ; [.4210.0020.0002] # YI SYLLABLE NYIEP +A452 ; [.4211.0020.0002] # YI SYLLABLE NYUOX +A453 ; [.4212.0020.0002] # YI SYLLABLE NYUO +A454 ; [.4213.0020.0002] # YI SYLLABLE NYUOP +A455 ; [.4214.0020.0002] # YI SYLLABLE NYOT +A456 ; [.4215.0020.0002] # YI SYLLABLE NYOX +A457 ; [.4216.0020.0002] # YI SYLLABLE NYO +A458 ; [.4217.0020.0002] # YI SYLLABLE NYOP +A459 ; [.4218.0020.0002] # YI SYLLABLE NYUT +A45A ; [.4219.0020.0002] # YI SYLLABLE NYUX +A45B ; [.421A.0020.0002] # YI SYLLABLE NYU +A45C ; [.421B.0020.0002] # YI SYLLABLE NYUP +A45D ; [.421C.0020.0002] # YI SYLLABLE XIT +A45E ; [.421D.0020.0002] # YI SYLLABLE XIX +A45F ; [.421E.0020.0002] # YI SYLLABLE XI +A460 ; [.421F.0020.0002] # YI SYLLABLE XIP +A461 ; [.4220.0020.0002] # YI SYLLABLE XIET +A462 ; [.4221.0020.0002] # YI SYLLABLE XIEX +A463 ; [.4222.0020.0002] # YI SYLLABLE XIE +A464 ; [.4223.0020.0002] # YI SYLLABLE XIEP +A465 ; [.4224.0020.0002] # YI SYLLABLE XUOX +A466 ; [.4225.0020.0002] # YI SYLLABLE XUO +A467 ; [.4226.0020.0002] # YI SYLLABLE XOT +A468 ; [.4227.0020.0002] # YI SYLLABLE XOX +A469 ; [.4228.0020.0002] # YI SYLLABLE XO +A46A ; [.4229.0020.0002] # YI SYLLABLE XOP +A46B ; [.422A.0020.0002] # YI SYLLABLE XYT +A46C ; [.422B.0020.0002] # YI SYLLABLE XYX +A46D ; [.422C.0020.0002] # YI SYLLABLE XY +A46E ; [.422D.0020.0002] # YI SYLLABLE XYP +A46F ; [.422E.0020.0002] # YI SYLLABLE XYRX +A470 ; [.422F.0020.0002] # YI SYLLABLE XYR +A471 ; [.4230.0020.0002] # YI SYLLABLE YIT +A472 ; [.4231.0020.0002] # YI SYLLABLE YIX +A473 ; [.4232.0020.0002] # YI SYLLABLE YI +A474 ; [.4233.0020.0002] # YI SYLLABLE YIP +A475 ; [.4234.0020.0002] # YI SYLLABLE YIET +A476 ; [.4235.0020.0002] # YI SYLLABLE YIEX +A477 ; [.4236.0020.0002] # YI SYLLABLE YIE +A478 ; [.4237.0020.0002] # YI SYLLABLE YIEP +A479 ; [.4238.0020.0002] # YI SYLLABLE YUOT +A47A ; [.4239.0020.0002] # YI SYLLABLE YUOX +A47B ; [.423A.0020.0002] # YI SYLLABLE YUO +A47C ; [.423B.0020.0002] # YI SYLLABLE YUOP +A47D ; [.423C.0020.0002] # YI SYLLABLE YOT +A47E ; [.423D.0020.0002] # YI SYLLABLE YOX +A47F ; [.423E.0020.0002] # YI SYLLABLE YO +A480 ; [.423F.0020.0002] # YI SYLLABLE YOP +A481 ; [.4240.0020.0002] # YI SYLLABLE YUT +A482 ; [.4241.0020.0002] # YI SYLLABLE YUX +A483 ; [.4242.0020.0002] # YI SYLLABLE YU +A484 ; [.4243.0020.0002] # YI SYLLABLE YUP +A485 ; [.4244.0020.0002] # YI SYLLABLE YURX +A486 ; [.4245.0020.0002] # YI SYLLABLE YUR +A487 ; [.4246.0020.0002] # YI SYLLABLE YYT +A488 ; [.4247.0020.0002] # YI SYLLABLE YYX +A489 ; [.4248.0020.0002] # YI SYLLABLE YY +A48A ; [.4249.0020.0002] # YI SYLLABLE YYP +A48B ; [.424A.0020.0002] # YI SYLLABLE YYRX +A48C ; [.424B.0020.0002] # YI SYLLABLE YYR +A4F8 ; [.424C.0020.0002] # LISU LETTER TONE MYA TI +A4F9 ; [.424D.0020.0002] # LISU LETTER TONE NA PO +A4FA ; [.424E.0020.0002] # LISU LETTER TONE MYA CYA +A4FB ; [.424F.0020.0002] # LISU LETTER TONE MYA BO +A4FD ; [.4250.0020.0002] # LISU LETTER TONE MYA JEU +A4FC ; [.4251.0020.0002] # LISU LETTER TONE MYA NA +A4D0 ; [.4252.0020.0002] # LISU LETTER BA +A4D1 ; [.4253.0020.0002] # LISU LETTER PA +A4D2 ; [.4254.0020.0002] # LISU LETTER PHA +A4D3 ; [.4255.0020.0002] # LISU LETTER DA +A4D4 ; [.4256.0020.0002] # LISU LETTER TA +A4D5 ; [.4257.0020.0002] # LISU LETTER THA +A4D6 ; [.4258.0020.0002] # LISU LETTER GA +A4D7 ; [.4259.0020.0002] # LISU LETTER KA +A4D8 ; [.425A.0020.0002] # LISU LETTER KHA +A4D9 ; [.425B.0020.0002] # LISU LETTER JA +A4DA ; [.425C.0020.0002] # LISU LETTER CA +A4DB ; [.425D.0020.0002] # LISU LETTER CHA +A4DC ; [.425E.0020.0002] # LISU LETTER DZA +A4DD ; [.425F.0020.0002] # LISU LETTER TSA +A4DE ; [.4260.0020.0002] # LISU LETTER TSHA +A4DF ; [.4261.0020.0002] # LISU LETTER MA +A4E0 ; [.4262.0020.0002] # LISU LETTER NA +A4E1 ; [.4263.0020.0002] # LISU LETTER LA +A4E2 ; [.4264.0020.0002] # LISU LETTER SA +A4E3 ; [.4265.0020.0002] # LISU LETTER ZHA +A4E4 ; [.4266.0020.0002] # LISU LETTER ZA +A4E5 ; [.4267.0020.0002] # LISU LETTER NGA +A4E6 ; [.4268.0020.0002] # LISU LETTER HA +A4E7 ; [.4269.0020.0002] # LISU LETTER XA +A4E8 ; [.426A.0020.0002] # LISU LETTER HHA +A4E9 ; [.426B.0020.0002] # LISU LETTER FA +A4EB ; [.426C.0020.0002] # LISU LETTER SHA +A4ED ; [.426D.0020.0002] # LISU LETTER GHA +A4EA ; [.426E.0020.0002] # LISU LETTER WA +A4EC ; [.426F.0020.0002] # LISU LETTER YA +A4EE ; [.4270.0020.0002] # LISU LETTER A +A4EF ; [.4271.0020.0002] # LISU LETTER AE +A4F0 ; [.4272.0020.0002] # LISU LETTER E +A4F1 ; [.4273.0020.0002] # LISU LETTER EU +A4F2 ; [.4274.0020.0002] # LISU LETTER I +A4F3 ; [.4275.0020.0002] # LISU LETTER O +A4F4 ; [.4276.0020.0002] # LISU LETTER U +A4F5 ; [.4277.0020.0002] # LISU LETTER UE +A4F6 ; [.4278.0020.0002] # LISU LETTER UH +A4F7 ; [.4279.0020.0002] # LISU LETTER OE +16F00 ; [.427A.0020.0002] # MIAO LETTER PA +16F01 ; [.427B.0020.0002] # MIAO LETTER BA +16F02 ; [.427C.0020.0002] # MIAO LETTER YI PA +16F03 ; [.427D.0020.0002] # MIAO LETTER PLA +16F04 ; [.427E.0020.0002] # MIAO LETTER MA +16F06 ; [.427E.0020.0004] # MIAO LETTER ARCHAIC MA +16F05 ; [.427F.0020.0002] # MIAO LETTER MHA +16F07 ; [.4280.0020.0002] # MIAO LETTER FA +16F08 ; [.4281.0020.0002] # MIAO LETTER VA +16F09 ; [.4282.0020.0002] # MIAO LETTER VFA +16F0A ; [.4283.0020.0002] # MIAO LETTER TA +16F0B ; [.4284.0020.0002] # MIAO LETTER DA +16F0C ; [.4285.0020.0002] # MIAO LETTER YI TTA +16F0D ; [.4286.0020.0002] # MIAO LETTER YI TA +16F0E ; [.4287.0020.0002] # MIAO LETTER TTA +16F0F ; [.4288.0020.0002] # MIAO LETTER DDA +16F10 ; [.4289.0020.0002] # MIAO LETTER NA +16F13 ; [.4289.0020.0004] # MIAO LETTER ARCHAIC NA +16F11 ; [.428A.0020.0002] # MIAO LETTER NHA +16F12 ; [.428B.0020.0002] # MIAO LETTER YI NNA +16F14 ; [.428C.0020.0002] # MIAO LETTER NNA +16F15 ; [.428D.0020.0002] # MIAO LETTER NNHA +16F16 ; [.428E.0020.0002] # MIAO LETTER LA +16F17 ; [.428F.0020.0002] # MIAO LETTER LYA +16F18 ; [.4290.0020.0002] # MIAO LETTER LHA +16F19 ; [.4291.0020.0002] # MIAO LETTER LHYA +16F1A ; [.4292.0020.0002] # MIAO LETTER TLHA +16F1B ; [.4293.0020.0002] # MIAO LETTER DLHA +16F1C ; [.4294.0020.0002] # MIAO LETTER TLHYA +16F1D ; [.4295.0020.0002] # MIAO LETTER DLHYA +16F1E ; [.4296.0020.0002] # MIAO LETTER KA +16F1F ; [.4297.0020.0002] # MIAO LETTER GA +16F20 ; [.4298.0020.0002] # MIAO LETTER YI KA +16F21 ; [.4299.0020.0002] # MIAO LETTER QA +16F22 ; [.429A.0020.0002] # MIAO LETTER QGA +16F23 ; [.429B.0020.0002] # MIAO LETTER NGA +16F25 ; [.429B.0020.0004] # MIAO LETTER ARCHAIC NGA +16F24 ; [.429C.0020.0002] # MIAO LETTER NGHA +16F26 ; [.429D.0020.0002] # MIAO LETTER HA +16F27 ; [.429E.0020.0002] # MIAO LETTER XA +16F28 ; [.429F.0020.0002] # MIAO LETTER GHA +16F29 ; [.42A0.0020.0002] # MIAO LETTER GHHA +16F2A ; [.42A1.0020.0002] # MIAO LETTER TSSA +16F2B ; [.42A2.0020.0002] # MIAO LETTER DZZA +16F2C ; [.42A3.0020.0002] # MIAO LETTER NYA +16F2D ; [.42A4.0020.0002] # MIAO LETTER NYHA +16F2E ; [.42A5.0020.0002] # MIAO LETTER TSHA +16F2F ; [.42A6.0020.0002] # MIAO LETTER DZHA +16F30 ; [.42A7.0020.0002] # MIAO LETTER YI TSHA +16F31 ; [.42A8.0020.0002] # MIAO LETTER YI DZHA +16F32 ; [.42A9.0020.0002] # MIAO LETTER REFORMED TSHA +16F33 ; [.42AA.0020.0002] # MIAO LETTER SHA +16F34 ; [.42AB.0020.0002] # MIAO LETTER SSA +16F35 ; [.42AC.0020.0002] # MIAO LETTER ZHA +16F36 ; [.42AD.0020.0002] # MIAO LETTER ZSHA +16F37 ; [.42AE.0020.0002] # MIAO LETTER TSA +16F38 ; [.42AF.0020.0002] # MIAO LETTER DZA +16F39 ; [.42B0.0020.0002] # MIAO LETTER YI TSA +16F3A ; [.42B1.0020.0002] # MIAO LETTER SA +16F3B ; [.42B2.0020.0002] # MIAO LETTER ZA +16F3C ; [.42B3.0020.0002] # MIAO LETTER ZSA +16F3D ; [.42B4.0020.0002] # MIAO LETTER ZZA +16F3F ; [.42B4.0020.0004] # MIAO LETTER ARCHAIC ZZA +16F3E ; [.42B5.0020.0002] # MIAO LETTER ZZSA +16F40 ; [.42B6.0020.0002] # MIAO LETTER ZZYA +16F41 ; [.42B7.0020.0002] # MIAO LETTER ZZSYA +16F42 ; [.42B8.0020.0002] # MIAO LETTER WA +16F43 ; [.42B9.0020.0002] # MIAO LETTER AH +16F44 ; [.42BA.0020.0002] # MIAO LETTER HHA +16F50 ; [.42BB.0020.0002] # MIAO LETTER NASALIZATION +16F51 ; [.42BC.0020.0002] # MIAO SIGN ASPIRATION +16F52 ; [.42BD.0020.0002] # MIAO SIGN REFORMED VOICING +16F53 ; [.42BE.0020.0002] # MIAO SIGN REFORMED ASPIRATION +16F54 ; [.42BF.0020.0002] # MIAO VOWEL SIGN A +16F55 ; [.42C0.0020.0002] # MIAO VOWEL SIGN AA +16F56 ; [.42C1.0020.0002] # MIAO VOWEL SIGN AHH +16F57 ; [.42C2.0020.0002] # MIAO VOWEL SIGN AN +16F58 ; [.42C3.0020.0002] # MIAO VOWEL SIGN ANG +16F59 ; [.42C4.0020.0002] # MIAO VOWEL SIGN O +16F5A ; [.42C5.0020.0002] # MIAO VOWEL SIGN OO +16F5B ; [.42C6.0020.0002] # MIAO VOWEL SIGN WO +16F5C ; [.42C7.0020.0002] # MIAO VOWEL SIGN W +16F5D ; [.42C8.0020.0002] # MIAO VOWEL SIGN E +16F5E ; [.42C9.0020.0002] # MIAO VOWEL SIGN EN +16F5F ; [.42CA.0020.0002] # MIAO VOWEL SIGN ENG +16F60 ; [.42CB.0020.0002] # MIAO VOWEL SIGN OEY +16F61 ; [.42CC.0020.0002] # MIAO VOWEL SIGN I +16F62 ; [.42CD.0020.0002] # MIAO VOWEL SIGN IA +16F63 ; [.42CE.0020.0002] # MIAO VOWEL SIGN IAN +16F64 ; [.42CF.0020.0002] # MIAO VOWEL SIGN IANG +16F65 ; [.42D0.0020.0002] # MIAO VOWEL SIGN IO +16F66 ; [.42D1.0020.0002] # MIAO VOWEL SIGN IE +16F67 ; [.42D2.0020.0002] # MIAO VOWEL SIGN II +16F68 ; [.42D3.0020.0002] # MIAO VOWEL SIGN IU +16F69 ; [.42D4.0020.0002] # MIAO VOWEL SIGN ING +16F6A ; [.42D5.0020.0002] # MIAO VOWEL SIGN U +16F6B ; [.42D6.0020.0002] # MIAO VOWEL SIGN UA +16F6C ; [.42D7.0020.0002] # MIAO VOWEL SIGN UAN +16F6D ; [.42D8.0020.0002] # MIAO VOWEL SIGN UANG +16F6E ; [.42D9.0020.0002] # MIAO VOWEL SIGN UU +16F6F ; [.42DA.0020.0002] # MIAO VOWEL SIGN UEI +16F70 ; [.42DB.0020.0002] # MIAO VOWEL SIGN UNG +16F71 ; [.42DC.0020.0002] # MIAO VOWEL SIGN Y +16F72 ; [.42DD.0020.0002] # MIAO VOWEL SIGN YI +16F73 ; [.42DE.0020.0002] # MIAO VOWEL SIGN AE +16F74 ; [.42DF.0020.0002] # MIAO VOWEL SIGN AEE +16F75 ; [.42E0.0020.0002] # MIAO VOWEL SIGN ERR +16F76 ; [.42E1.0020.0002] # MIAO VOWEL SIGN ROUNDED ERR +16F77 ; [.42E2.0020.0002] # MIAO VOWEL SIGN ER +16F78 ; [.42E3.0020.0002] # MIAO VOWEL SIGN ROUNDED ER +16F79 ; [.42E4.0020.0002] # MIAO VOWEL SIGN AI +16F7A ; [.42E5.0020.0002] # MIAO VOWEL SIGN EI +16F7B ; [.42E6.0020.0002] # MIAO VOWEL SIGN AU +16F7C ; [.42E7.0020.0002] # MIAO VOWEL SIGN OU +16F7D ; [.42E8.0020.0002] # MIAO VOWEL SIGN N +16F7E ; [.42E9.0020.0002] # MIAO VOWEL SIGN NG +16F8F ; [.42EA.0020.0002] # MIAO TONE RIGHT +16F90 ; [.42EB.0020.0002] # MIAO TONE TOP RIGHT +16F91 ; [.42EC.0020.0002] # MIAO TONE ABOVE +16F92 ; [.42ED.0020.0002] # MIAO TONE BELOW +16F93 ; [.42EE.0020.0002] # MIAO LETTER TONE-2 +16F94 ; [.42EF.0020.0002] # MIAO LETTER TONE-3 +16F95 ; [.42F0.0020.0002] # MIAO LETTER TONE-4 +16F96 ; [.42F1.0020.0002] # MIAO LETTER TONE-5 +16F97 ; [.42F2.0020.0002] # MIAO LETTER TONE-6 +16F98 ; [.42F3.0020.0002] # MIAO LETTER TONE-7 +16F99 ; [.42F4.0020.0002] # MIAO LETTER TONE-8 +16F9A ; [.42F5.0020.0002] # MIAO LETTER REFORMED TONE-1 +16F9B ; [.42F6.0020.0002] # MIAO LETTER REFORMED TONE-2 +16F9C ; [.42F7.0020.0002] # MIAO LETTER REFORMED TONE-4 +16F9D ; [.42F8.0020.0002] # MIAO LETTER REFORMED TONE-5 +16F9E ; [.42F9.0020.0002] # MIAO LETTER REFORMED TONE-6 +16F9F ; [.42FA.0020.0002] # MIAO LETTER REFORMED TONE-8 +118FF ; [.42FB.0020.0002] # WARANG CITI OM +118C0 ; [.42FC.0020.0002] # WARANG CITI SMALL LETTER NGAA +118A0 ; [.42FC.0020.0008] # WARANG CITI CAPITAL LETTER NGAA +118C1 ; [.42FD.0020.0002] # WARANG CITI SMALL LETTER A +118A1 ; [.42FD.0020.0008] # WARANG CITI CAPITAL LETTER A +118C2 ; [.42FE.0020.0002] # WARANG CITI SMALL LETTER WI +118A2 ; [.42FE.0020.0008] # WARANG CITI CAPITAL LETTER WI +118C3 ; [.42FF.0020.0002] # WARANG CITI SMALL LETTER YU +118A3 ; [.42FF.0020.0008] # WARANG CITI CAPITAL LETTER YU +118C4 ; [.4300.0020.0002] # WARANG CITI SMALL LETTER YA +118A4 ; [.4300.0020.0008] # WARANG CITI CAPITAL LETTER YA +118C5 ; [.4301.0020.0002] # WARANG CITI SMALL LETTER YO +118A5 ; [.4301.0020.0008] # WARANG CITI CAPITAL LETTER YO +118C6 ; [.4302.0020.0002] # WARANG CITI SMALL LETTER II +118A6 ; [.4302.0020.0008] # WARANG CITI CAPITAL LETTER II +118C7 ; [.4303.0020.0002] # WARANG CITI SMALL LETTER UU +118A7 ; [.4303.0020.0008] # WARANG CITI CAPITAL LETTER UU +118C8 ; [.4304.0020.0002] # WARANG CITI SMALL LETTER E +118A8 ; [.4304.0020.0008] # WARANG CITI CAPITAL LETTER E +118C9 ; [.4305.0020.0002] # WARANG CITI SMALL LETTER O +118A9 ; [.4305.0020.0008] # WARANG CITI CAPITAL LETTER O +118CA ; [.4306.0020.0002] # WARANG CITI SMALL LETTER ANG +118AA ; [.4306.0020.0008] # WARANG CITI CAPITAL LETTER ANG +118CB ; [.4307.0020.0002] # WARANG CITI SMALL LETTER GA +118AB ; [.4307.0020.0008] # WARANG CITI CAPITAL LETTER GA +118CC ; [.4308.0020.0002] # WARANG CITI SMALL LETTER KO +118AC ; [.4308.0020.0008] # WARANG CITI CAPITAL LETTER KO +118CD ; [.4309.0020.0002] # WARANG CITI SMALL LETTER ENY +118AD ; [.4309.0020.0008] # WARANG CITI CAPITAL LETTER ENY +118CE ; [.430A.0020.0002] # WARANG CITI SMALL LETTER YUJ +118AE ; [.430A.0020.0008] # WARANG CITI CAPITAL LETTER YUJ +118CF ; [.430B.0020.0002] # WARANG CITI SMALL LETTER UC +118AF ; [.430B.0020.0008] # WARANG CITI CAPITAL LETTER UC +118D0 ; [.430C.0020.0002] # WARANG CITI SMALL LETTER ENN +118B0 ; [.430C.0020.0008] # WARANG CITI CAPITAL LETTER ENN +118D1 ; [.430D.0020.0002] # WARANG CITI SMALL LETTER ODD +118B1 ; [.430D.0020.0008] # WARANG CITI CAPITAL LETTER ODD +118D2 ; [.430E.0020.0002] # WARANG CITI SMALL LETTER TTE +118B2 ; [.430E.0020.0008] # WARANG CITI CAPITAL LETTER TTE +118D3 ; [.430F.0020.0002] # WARANG CITI SMALL LETTER NUNG +118B3 ; [.430F.0020.0008] # WARANG CITI CAPITAL LETTER NUNG +118D4 ; [.4310.0020.0002] # WARANG CITI SMALL LETTER DA +118B4 ; [.4310.0020.0008] # WARANG CITI CAPITAL LETTER DA +118D5 ; [.4311.0020.0002] # WARANG CITI SMALL LETTER AT +118B5 ; [.4311.0020.0008] # WARANG CITI CAPITAL LETTER AT +118D6 ; [.4312.0020.0002] # WARANG CITI SMALL LETTER AM +118B6 ; [.4312.0020.0008] # WARANG CITI CAPITAL LETTER AM +118D7 ; [.4313.0020.0002] # WARANG CITI SMALL LETTER BU +118B7 ; [.4313.0020.0008] # WARANG CITI CAPITAL LETTER BU +118D8 ; [.4314.0020.0002] # WARANG CITI SMALL LETTER PU +118B8 ; [.4314.0020.0008] # WARANG CITI CAPITAL LETTER PU +118D9 ; [.4315.0020.0002] # WARANG CITI SMALL LETTER HIYO +118B9 ; [.4315.0020.0008] # WARANG CITI CAPITAL LETTER HIYO +118DA ; [.4316.0020.0002] # WARANG CITI SMALL LETTER HOLO +118BA ; [.4316.0020.0008] # WARANG CITI CAPITAL LETTER HOLO +118DB ; [.4317.0020.0002] # WARANG CITI SMALL LETTER HORR +118BB ; [.4317.0020.0008] # WARANG CITI CAPITAL LETTER HORR +118DC ; [.4318.0020.0002] # WARANG CITI SMALL LETTER HAR +118BC ; [.4318.0020.0008] # WARANG CITI CAPITAL LETTER HAR +118DD ; [.4319.0020.0002] # WARANG CITI SMALL LETTER SSUU +118BD ; [.4319.0020.0008] # WARANG CITI CAPITAL LETTER SSUU +118DE ; [.431A.0020.0002] # WARANG CITI SMALL LETTER SII +118BE ; [.431A.0020.0008] # WARANG CITI CAPITAL LETTER SII +118DF ; [.431B.0020.0002] # WARANG CITI SMALL LETTER VIYO +118BF ; [.431B.0020.0008] # WARANG CITI CAPITAL LETTER VIYO +11AD5 ; [.431C.0020.0002] # PAU CIN HAU LETTER A +11AD6 ; [.431D.0020.0002] # PAU CIN HAU LETTER E +11AD7 ; [.431E.0020.0002] # PAU CIN HAU LETTER I +11AD8 ; [.431F.0020.0002] # PAU CIN HAU LETTER O +11AD9 ; [.4320.0020.0002] # PAU CIN HAU LETTER U +11ADA ; [.4321.0020.0002] # PAU CIN HAU LETTER UA +11ADB ; [.4322.0020.0002] # PAU CIN HAU LETTER IA +11AC0 ; [.4323.0020.0002] # PAU CIN HAU LETTER PA +11AC1 ; [.4324.0020.0002] # PAU CIN HAU LETTER KA +11AC2 ; [.4325.0020.0002] # PAU CIN HAU LETTER LA +11AC3 ; [.4326.0020.0002] # PAU CIN HAU LETTER MA +11AC4 ; [.4327.0020.0002] # PAU CIN HAU LETTER DA +11AC5 ; [.4328.0020.0002] # PAU CIN HAU LETTER ZA +11AC6 ; [.4329.0020.0002] # PAU CIN HAU LETTER VA +11AC7 ; [.432A.0020.0002] # PAU CIN HAU LETTER NGA +11AC8 ; [.432B.0020.0002] # PAU CIN HAU LETTER HA +11AC9 ; [.432C.0020.0002] # PAU CIN HAU LETTER GA +11ACA ; [.432D.0020.0002] # PAU CIN HAU LETTER KHA +11ACB ; [.432E.0020.0002] # PAU CIN HAU LETTER SA +11ACC ; [.432F.0020.0002] # PAU CIN HAU LETTER BA +11ACD ; [.4330.0020.0002] # PAU CIN HAU LETTER CA +11ACE ; [.4331.0020.0002] # PAU CIN HAU LETTER TA +11ACF ; [.4332.0020.0002] # PAU CIN HAU LETTER THA +11AD0 ; [.4333.0020.0002] # PAU CIN HAU LETTER NA +11AD1 ; [.4334.0020.0002] # PAU CIN HAU LETTER PHA +11AD2 ; [.4335.0020.0002] # PAU CIN HAU LETTER RA +11AD3 ; [.4336.0020.0002] # PAU CIN HAU LETTER FA +11AD4 ; [.4337.0020.0002] # PAU CIN HAU LETTER CHA +11ADC ; [.4338.0020.0002] # PAU CIN HAU LETTER FINAL P +11ADD ; [.4339.0020.0002] # PAU CIN HAU LETTER FINAL K +11ADF ; [.433A.0020.0002] # PAU CIN HAU LETTER FINAL M +11AE0 ; [.433B.0020.0002] # PAU CIN HAU LETTER FINAL N +11AE1 ; [.433C.0020.0002] # PAU CIN HAU LETTER FINAL L +11AE2 ; [.433D.0020.0002] # PAU CIN HAU LETTER FINAL W +11AE3 ; [.433E.0020.0002] # PAU CIN HAU LETTER FINAL NG +11ADE ; [.433F.0020.0002] # PAU CIN HAU LETTER FINAL T +11AE4 ; [.4340.0020.0002] # PAU CIN HAU LETTER FINAL Y +11AEF ; [.4341.0020.0002] # PAU CIN HAU MID-LEVEL TONE +11AF2 ; [.4342.0020.0002] # PAU CIN HAU MID-LEVEL TONE FINAL +11AF1 ; [.4343.0020.0002] # PAU CIN HAU MID-LEVEL TONE LONG FINAL +11AE6 ; [.4344.0020.0002] # PAU CIN HAU RISING TONE +11AE9 ; [.4345.0020.0002] # PAU CIN HAU RISING TONE FINAL +11AE5 ; [.4346.0020.0002] # PAU CIN HAU RISING TONE LONG +11AE8 ; [.4347.0020.0002] # PAU CIN HAU RISING TONE LONG FINAL +11AF4 ; [.4348.0020.0002] # PAU CIN HAU LOW-FALLING TONE +11AF7 ; [.4349.0020.0002] # PAU CIN HAU LOW-FALLING TONE FINAL +11AF3 ; [.434A.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG +11AF6 ; [.434B.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG FINAL +11AEC ; [.434C.0020.0002] # PAU CIN HAU SANDHI TONE +11AEE ; [.434D.0020.0002] # PAU CIN HAU SANDHI TONE FINAL +11AEB ; [.434E.0020.0002] # PAU CIN HAU SANDHI TONE LONG +11AED ; [.434F.0020.0002] # PAU CIN HAU SANDHI TONE LONG FINAL +11AF5 ; [.4350.0020.0002] # PAU CIN HAU GLOTTAL STOP +11AF8 ; [.4351.0020.0002] # PAU CIN HAU GLOTTAL STOP FINAL +11AE7 ; [.4352.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP +11AEA ; [.4353.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP FINAL +11AF0 ; [.4354.0020.0002] # PAU CIN HAU GLOTTAL STOP VARIANT +16B00 ; [.4355.0020.0002] # PAHAWH HMONG VOWEL KEEB +16B01 ; [.4356.0020.0002] # PAHAWH HMONG VOWEL KEEV +16B02 ; [.4357.0020.0002] # PAHAWH HMONG VOWEL KIB +16B03 ; [.4358.0020.0002] # PAHAWH HMONG VOWEL KIV +16B04 ; [.4359.0020.0002] # PAHAWH HMONG VOWEL KAUB +16B05 ; [.435A.0020.0002] # PAHAWH HMONG VOWEL KAUV +16B06 ; [.435B.0020.0002] # PAHAWH HMONG VOWEL KUB +16B07 ; [.435C.0020.0002] # PAHAWH HMONG VOWEL KUV +16B08 ; [.435D.0020.0002] # PAHAWH HMONG VOWEL KEB +16B09 ; [.435E.0020.0002] # PAHAWH HMONG VOWEL KEV +16B0A ; [.435F.0020.0002] # PAHAWH HMONG VOWEL KAIB +16B0B ; [.4360.0020.0002] # PAHAWH HMONG VOWEL KAIV +16B0C ; [.4361.0020.0002] # PAHAWH HMONG VOWEL KOOB +16B0D ; [.4362.0020.0002] # PAHAWH HMONG VOWEL KOOV +16B0E ; [.4363.0020.0002] # PAHAWH HMONG VOWEL KAWB +16B0F ; [.4364.0020.0002] # PAHAWH HMONG VOWEL KAWV +16B10 ; [.4365.0020.0002] # PAHAWH HMONG VOWEL KUAB +16B11 ; [.4366.0020.0002] # PAHAWH HMONG VOWEL KUAV +16B12 ; [.4367.0020.0002] # PAHAWH HMONG VOWEL KOB +16B13 ; [.4368.0020.0002] # PAHAWH HMONG VOWEL KOV +16B14 ; [.4369.0020.0002] # PAHAWH HMONG VOWEL KIAB +16B15 ; [.436A.0020.0002] # PAHAWH HMONG VOWEL KIAV +16B16 ; [.436B.0020.0002] # PAHAWH HMONG VOWEL KAB +16B17 ; [.436C.0020.0002] # PAHAWH HMONG VOWEL KAV +16B18 ; [.436D.0020.0002] # PAHAWH HMONG VOWEL KWB +16B19 ; [.436E.0020.0002] # PAHAWH HMONG VOWEL KWV +16B1A ; [.436F.0020.0002] # PAHAWH HMONG VOWEL KAAB +16B1B ; [.4370.0020.0002] # PAHAWH HMONG VOWEL KAAV +16B1C ; [.4371.0020.0002] # PAHAWH HMONG CONSONANT VAU +16B1D ; [.4372.0020.0002] # PAHAWH HMONG CONSONANT NTSAU +16B1E ; [.4373.0020.0002] # PAHAWH HMONG CONSONANT LAU +16B1F ; [.4374.0020.0002] # PAHAWH HMONG CONSONANT HAU +16B20 ; [.4375.0020.0002] # PAHAWH HMONG CONSONANT NLAU +16B21 ; [.4376.0020.0002] # PAHAWH HMONG CONSONANT RAU +16B22 ; [.4377.0020.0002] # PAHAWH HMONG CONSONANT NKAU +16B23 ; [.4378.0020.0002] # PAHAWH HMONG CONSONANT QHAU +16B24 ; [.4379.0020.0002] # PAHAWH HMONG CONSONANT YAU +16B25 ; [.437A.0020.0002] # PAHAWH HMONG CONSONANT HLAU +16B26 ; [.437B.0020.0002] # PAHAWH HMONG CONSONANT MAU +16B27 ; [.437C.0020.0002] # PAHAWH HMONG CONSONANT CHAU +16B28 ; [.437D.0020.0002] # PAHAWH HMONG CONSONANT NCHAU +16B29 ; [.437E.0020.0002] # PAHAWH HMONG CONSONANT HNAU +16B2A ; [.437F.0020.0002] # PAHAWH HMONG CONSONANT PLHAU +16B2B ; [.4380.0020.0002] # PAHAWH HMONG CONSONANT NTHAU +16B2C ; [.4381.0020.0002] # PAHAWH HMONG CONSONANT NAU +16B2D ; [.4382.0020.0002] # PAHAWH HMONG CONSONANT AU +16B2E ; [.4383.0020.0002] # PAHAWH HMONG CONSONANT XAU +16B2F ; [.4384.0020.0002] # PAHAWH HMONG CONSONANT CAU +16B40 ; [.4385.0020.0002] # PAHAWH HMONG SIGN VOS SEEV +16B41 ; [.4386.0020.0002] # PAHAWH HMONG SIGN MEEJ SUAB +16B63 ; [.4387.0020.0002] # PAHAWH HMONG SIGN VOS LUB +16B64 ; [.4388.0020.0002] # PAHAWH HMONG SIGN XYOO +16B65 ; [.4389.0020.0002] # PAHAWH HMONG SIGN HLI +16B66 ; [.438A.0020.0002] # PAHAWH HMONG SIGN THIRD-STAGE HLI +16B67 ; [.438B.0020.0002] # PAHAWH HMONG SIGN ZWJ THAJ +16B68 ; [.438C.0020.0002] # PAHAWH HMONG SIGN HNUB +16B69 ; [.438D.0020.0002] # PAHAWH HMONG SIGN NQIG +16B6A ; [.438E.0020.0002] # PAHAWH HMONG SIGN XIAB +16B6B ; [.438F.0020.0002] # PAHAWH HMONG SIGN NTUJ +16B6C ; [.4390.0020.0002] # PAHAWH HMONG SIGN AV +16B6D ; [.4391.0020.0002] # PAHAWH HMONG SIGN TXHEEJ CEEV +16B6E ; [.4392.0020.0002] # PAHAWH HMONG SIGN MEEJ TSEEB +16B6F ; [.4393.0020.0002] # PAHAWH HMONG SIGN TAU +16B70 ; [.4394.0020.0002] # PAHAWH HMONG SIGN LOS +16B71 ; [.4395.0020.0002] # PAHAWH HMONG SIGN MUS +16B72 ; [.4396.0020.0002] # PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG +16B73 ; [.4397.0020.0002] # PAHAWH HMONG SIGN CIM CUAM TSHOOJ +16B74 ; [.4398.0020.0002] # PAHAWH HMONG SIGN CIM TXWV +16B75 ; [.4399.0020.0002] # PAHAWH HMONG SIGN CIM TXWV CHWV +16B76 ; [.439A.0020.0002] # PAHAWH HMONG SIGN CIM PUB DAWB +16B77 ; [.439B.0020.0002] # PAHAWH HMONG SIGN CIM NRES TOS +16B7D ; [.439C.0020.0002] # PAHAWH HMONG CLAN SIGN TSHEEJ +16B7E ; [.439D.0020.0002] # PAHAWH HMONG CLAN SIGN YEEG +16B7F ; [.439E.0020.0002] # PAHAWH HMONG CLAN SIGN LIS +16B80 ; [.439F.0020.0002] # PAHAWH HMONG CLAN SIGN LAUJ +16B81 ; [.43A0.0020.0002] # PAHAWH HMONG CLAN SIGN XYOOJ +16B82 ; [.43A1.0020.0002] # PAHAWH HMONG CLAN SIGN KOO +16B83 ; [.43A2.0020.0002] # PAHAWH HMONG CLAN SIGN HAWJ +16B84 ; [.43A3.0020.0002] # PAHAWH HMONG CLAN SIGN MUAS +16B85 ; [.43A4.0020.0002] # PAHAWH HMONG CLAN SIGN THOJ +16B86 ; [.43A5.0020.0002] # PAHAWH HMONG CLAN SIGN TSAB +16B87 ; [.43A6.0020.0002] # PAHAWH HMONG CLAN SIGN PHAB +16B88 ; [.43A7.0020.0002] # PAHAWH HMONG CLAN SIGN KHAB +16B89 ; [.43A8.0020.0002] # PAHAWH HMONG CLAN SIGN HAM +16B8A ; [.43A9.0020.0002] # PAHAWH HMONG CLAN SIGN VAJ +16B8B ; [.43AA.0020.0002] # PAHAWH HMONG CLAN SIGN FAJ +16B8C ; [.43AB.0020.0002] # PAHAWH HMONG CLAN SIGN YAJ +16B8D ; [.43AC.0020.0002] # PAHAWH HMONG CLAN SIGN TSWB +16B8E ; [.43AD.0020.0002] # PAHAWH HMONG CLAN SIGN KWM +16B8F ; [.43AE.0020.0002] # PAHAWH HMONG CLAN SIGN VWJ +10280 ; [.43AF.0020.0002] # LYCIAN LETTER A +10281 ; [.43B0.0020.0002] # LYCIAN LETTER E +10282 ; [.43B1.0020.0002] # LYCIAN LETTER B +10283 ; [.43B2.0020.0002] # LYCIAN LETTER BH +10284 ; [.43B3.0020.0002] # LYCIAN LETTER G +10285 ; [.43B4.0020.0002] # LYCIAN LETTER D +10286 ; [.43B5.0020.0002] # LYCIAN LETTER I +10287 ; [.43B6.0020.0002] # LYCIAN LETTER W +10288 ; [.43B7.0020.0002] # LYCIAN LETTER Z +10289 ; [.43B8.0020.0002] # LYCIAN LETTER TH +1028A ; [.43B9.0020.0002] # LYCIAN LETTER J +1028B ; [.43BA.0020.0002] # LYCIAN LETTER K +1028C ; [.43BB.0020.0002] # LYCIAN LETTER Q +1028D ; [.43BC.0020.0002] # LYCIAN LETTER L +1028E ; [.43BD.0020.0002] # LYCIAN LETTER M +1028F ; [.43BE.0020.0002] # LYCIAN LETTER N +10290 ; [.43BF.0020.0002] # LYCIAN LETTER MM +10291 ; [.43C0.0020.0002] # LYCIAN LETTER NN +10292 ; [.43C1.0020.0002] # LYCIAN LETTER U +10293 ; [.43C2.0020.0002] # LYCIAN LETTER P +10294 ; [.43C3.0020.0002] # LYCIAN LETTER KK +10295 ; [.43C4.0020.0002] # LYCIAN LETTER R +10296 ; [.43C5.0020.0002] # LYCIAN LETTER S +10297 ; [.43C6.0020.0002] # LYCIAN LETTER T +10298 ; [.43C7.0020.0002] # LYCIAN LETTER TT +10299 ; [.43C8.0020.0002] # LYCIAN LETTER AN +1029A ; [.43C9.0020.0002] # LYCIAN LETTER EN +1029B ; [.43CA.0020.0002] # LYCIAN LETTER H +1029C ; [.43CB.0020.0002] # LYCIAN LETTER X +102A0 ; [.43CC.0020.0002] # CARIAN LETTER A +102A1 ; [.43CD.0020.0002] # CARIAN LETTER P2 +102A2 ; [.43CE.0020.0002] # CARIAN LETTER D +102A3 ; [.43CF.0020.0002] # CARIAN LETTER L +102A4 ; [.43D0.0020.0002] # CARIAN LETTER UUU +102A5 ; [.43D1.0020.0002] # CARIAN LETTER R +102A6 ; [.43D2.0020.0002] # CARIAN LETTER LD +102A7 ; [.43D3.0020.0002] # CARIAN LETTER A2 +102A8 ; [.43D4.0020.0002] # CARIAN LETTER Q +102A9 ; [.43D5.0020.0002] # CARIAN LETTER B +102AA ; [.43D6.0020.0002] # CARIAN LETTER M +102AB ; [.43D7.0020.0002] # CARIAN LETTER O +102AC ; [.43D8.0020.0002] # CARIAN LETTER D2 +102AD ; [.43D9.0020.0002] # CARIAN LETTER T +102AE ; [.43DA.0020.0002] # CARIAN LETTER SH +102AF ; [.43DB.0020.0002] # CARIAN LETTER SH2 +102B0 ; [.43DC.0020.0002] # CARIAN LETTER S +102B1 ; [.43DD.0020.0002] # CARIAN LETTER C-18 +102B2 ; [.43DE.0020.0002] # CARIAN LETTER U +102B3 ; [.43DF.0020.0002] # CARIAN LETTER NN +102B4 ; [.43E0.0020.0002] # CARIAN LETTER X +102B5 ; [.43E1.0020.0002] # CARIAN LETTER N +102B6 ; [.43E2.0020.0002] # CARIAN LETTER TT2 +102B7 ; [.43E3.0020.0002] # CARIAN LETTER P +102B8 ; [.43E4.0020.0002] # CARIAN LETTER SS +102B9 ; [.43E5.0020.0002] # CARIAN LETTER I +102BA ; [.43E6.0020.0002] # CARIAN LETTER E +102BB ; [.43E7.0020.0002] # CARIAN LETTER UUUU +102BC ; [.43E8.0020.0002] # CARIAN LETTER K +102BD ; [.43E9.0020.0002] # CARIAN LETTER K2 +102BE ; [.43EA.0020.0002] # CARIAN LETTER ND +102BF ; [.43EB.0020.0002] # CARIAN LETTER UU +102C0 ; [.43EC.0020.0002] # CARIAN LETTER G +102C1 ; [.43ED.0020.0002] # CARIAN LETTER G2 +102C2 ; [.43EE.0020.0002] # CARIAN LETTER ST +102C3 ; [.43EF.0020.0002] # CARIAN LETTER ST2 +102C4 ; [.43F0.0020.0002] # CARIAN LETTER NG +102C5 ; [.43F1.0020.0002] # CARIAN LETTER II +102C6 ; [.43F2.0020.0002] # CARIAN LETTER C-39 +102C7 ; [.43F3.0020.0002] # CARIAN LETTER TT +102C8 ; [.43F4.0020.0002] # CARIAN LETTER UUU2 +102C9 ; [.43F5.0020.0002] # CARIAN LETTER RR +102CA ; [.43F6.0020.0002] # CARIAN LETTER MB +102CB ; [.43F7.0020.0002] # CARIAN LETTER MB2 +102CC ; [.43F8.0020.0002] # CARIAN LETTER MB3 +102CD ; [.43F9.0020.0002] # CARIAN LETTER MB4 +102CE ; [.43FA.0020.0002] # CARIAN LETTER LD2 +102CF ; [.43FB.0020.0002] # CARIAN LETTER E2 +102D0 ; [.43FC.0020.0002] # CARIAN LETTER UUU3 +10920 ; [.43FD.0020.0002] # LYDIAN LETTER A +10921 ; [.43FE.0020.0002] # LYDIAN LETTER B +10922 ; [.43FF.0020.0002] # LYDIAN LETTER G +10923 ; [.4400.0020.0002] # LYDIAN LETTER D +10924 ; [.4401.0020.0002] # LYDIAN LETTER E +10925 ; [.4402.0020.0002] # LYDIAN LETTER V +10926 ; [.4403.0020.0002] # LYDIAN LETTER I +10927 ; [.4404.0020.0002] # LYDIAN LETTER Y +10928 ; [.4405.0020.0002] # LYDIAN LETTER K +10929 ; [.4406.0020.0002] # LYDIAN LETTER L +1092A ; [.4407.0020.0002] # LYDIAN LETTER M +1092B ; [.4408.0020.0002] # LYDIAN LETTER N +1092C ; [.4409.0020.0002] # LYDIAN LETTER O +1092D ; [.440A.0020.0002] # LYDIAN LETTER R +1092E ; [.440B.0020.0002] # LYDIAN LETTER SS +1092F ; [.440C.0020.0002] # LYDIAN LETTER T +10930 ; [.440D.0020.0002] # LYDIAN LETTER U +10931 ; [.440E.0020.0002] # LYDIAN LETTER F +10932 ; [.440F.0020.0002] # LYDIAN LETTER Q +10933 ; [.4410.0020.0002] # LYDIAN LETTER S +10934 ; [.4411.0020.0002] # LYDIAN LETTER TT +10935 ; [.4412.0020.0002] # LYDIAN LETTER AN +10936 ; [.4413.0020.0002] # LYDIAN LETTER EN +10937 ; [.4414.0020.0002] # LYDIAN LETTER LY +10938 ; [.4415.0020.0002] # LYDIAN LETTER NN +10939 ; [.4416.0020.0002] # LYDIAN LETTER C +10300 ; [.4417.0020.0002] # OLD ITALIC LETTER A +10301 ; [.4418.0020.0002] # OLD ITALIC LETTER BE +10302 ; [.4419.0020.0002] # OLD ITALIC LETTER KE +10303 ; [.441A.0020.0002] # OLD ITALIC LETTER DE +10304 ; [.441B.0020.0002] # OLD ITALIC LETTER E +10305 ; [.441C.0020.0002] # OLD ITALIC LETTER VE +10306 ; [.441D.0020.0002] # OLD ITALIC LETTER ZE +10307 ; [.441E.0020.0002] # OLD ITALIC LETTER HE +10308 ; [.441F.0020.0002] # OLD ITALIC LETTER THE +10309 ; [.4420.0020.0002] # OLD ITALIC LETTER I +1030A ; [.4421.0020.0002] # OLD ITALIC LETTER KA +1030B ; [.4422.0020.0002] # OLD ITALIC LETTER EL +1030C ; [.4423.0020.0002] # OLD ITALIC LETTER EM +1030D ; [.4424.0020.0002] # OLD ITALIC LETTER EN +1030E ; [.4425.0020.0002] # OLD ITALIC LETTER ESH +1031F ; [.4426.0020.0002] # OLD ITALIC LETTER ESS +1030F ; [.4427.0020.0002] # OLD ITALIC LETTER O +10310 ; [.4428.0020.0002] # OLD ITALIC LETTER PE +10311 ; [.4429.0020.0002] # OLD ITALIC LETTER SHE +10312 ; [.442A.0020.0002] # OLD ITALIC LETTER KU +10313 ; [.442B.0020.0002] # OLD ITALIC LETTER ER +10314 ; [.442C.0020.0002] # OLD ITALIC LETTER ES +10315 ; [.442D.0020.0002] # OLD ITALIC LETTER TE +10316 ; [.442E.0020.0002] # OLD ITALIC LETTER U +10317 ; [.442F.0020.0002] # OLD ITALIC LETTER EKS +10318 ; [.4430.0020.0002] # OLD ITALIC LETTER PHE +10319 ; [.4431.0020.0002] # OLD ITALIC LETTER KHE +1031A ; [.4432.0020.0002] # OLD ITALIC LETTER EF +1031B ; [.4433.0020.0002] # OLD ITALIC LETTER ERS +1031C ; [.4434.0020.0002] # OLD ITALIC LETTER CHE +1031D ; [.4435.0020.0002] # OLD ITALIC LETTER II +1031E ; [.4436.0020.0002] # OLD ITALIC LETTER UU +10330 ; [.4437.0020.0002] # GOTHIC LETTER AHSA +10331 ; [.4438.0020.0002] # GOTHIC LETTER BAIRKAN +10332 ; [.4439.0020.0002] # GOTHIC LETTER GIBA +10333 ; [.443A.0020.0002] # GOTHIC LETTER DAGS +10334 ; [.443B.0020.0002] # GOTHIC LETTER AIHVUS +10335 ; [.443C.0020.0002] # GOTHIC LETTER QAIRTHRA +10336 ; [.443D.0020.0002] # GOTHIC LETTER IUJA +10337 ; [.443E.0020.0002] # GOTHIC LETTER HAGL +10338 ; [.443F.0020.0002] # GOTHIC LETTER THIUTH +10339 ; [.4440.0020.0002] # GOTHIC LETTER EIS +1033A ; [.4441.0020.0002] # GOTHIC LETTER KUSMA +1033B ; [.4442.0020.0002] # GOTHIC LETTER LAGUS +1033C ; [.4443.0020.0002] # GOTHIC LETTER MANNA +1033D ; [.4444.0020.0002] # GOTHIC LETTER NAUTHS +1033E ; [.4445.0020.0002] # GOTHIC LETTER JER +1033F ; [.4446.0020.0002] # GOTHIC LETTER URUS +10340 ; [.4447.0020.0002] # GOTHIC LETTER PAIRTHRA +10341 ; [.4448.0020.0002] # GOTHIC LETTER NINETY +10342 ; [.4449.0020.0002] # GOTHIC LETTER RAIDA +10343 ; [.444A.0020.0002] # GOTHIC LETTER SAUIL +10344 ; [.444B.0020.0002] # GOTHIC LETTER TEIWS +10345 ; [.444C.0020.0002] # GOTHIC LETTER WINJA +10346 ; [.444D.0020.0002] # GOTHIC LETTER FAIHU +10347 ; [.444E.0020.0002] # GOTHIC LETTER IGGWS +10348 ; [.444F.0020.0002] # GOTHIC LETTER HWAIR +10349 ; [.4450.0020.0002] # GOTHIC LETTER OTHAL +1034A ; [.4451.0020.0002] # GOTHIC LETTER NINE HUNDRED +10428 ; [.4452.0020.0002] # DESERET SMALL LETTER LONG I +10400 ; [.4452.0020.0008] # DESERET CAPITAL LETTER LONG I +10429 ; [.4453.0020.0002] # DESERET SMALL LETTER LONG E +10401 ; [.4453.0020.0008] # DESERET CAPITAL LETTER LONG E +1042A ; [.4454.0020.0002] # DESERET SMALL LETTER LONG A +10402 ; [.4454.0020.0008] # DESERET CAPITAL LETTER LONG A +1042B ; [.4455.0020.0002] # DESERET SMALL LETTER LONG AH +10403 ; [.4455.0020.0008] # DESERET CAPITAL LETTER LONG AH +1042C ; [.4456.0020.0002] # DESERET SMALL LETTER LONG O +10404 ; [.4456.0020.0008] # DESERET CAPITAL LETTER LONG O +1042D ; [.4457.0020.0002] # DESERET SMALL LETTER LONG OO +10405 ; [.4457.0020.0008] # DESERET CAPITAL LETTER LONG OO +1042E ; [.4458.0020.0002] # DESERET SMALL LETTER SHORT I +10406 ; [.4458.0020.0008] # DESERET CAPITAL LETTER SHORT I +1042F ; [.4459.0020.0002] # DESERET SMALL LETTER SHORT E +10407 ; [.4459.0020.0008] # DESERET CAPITAL LETTER SHORT E +10430 ; [.445A.0020.0002] # DESERET SMALL LETTER SHORT A +10408 ; [.445A.0020.0008] # DESERET CAPITAL LETTER SHORT A +10431 ; [.445B.0020.0002] # DESERET SMALL LETTER SHORT AH +10409 ; [.445B.0020.0008] # DESERET CAPITAL LETTER SHORT AH +10432 ; [.445C.0020.0002] # DESERET SMALL LETTER SHORT O +1040A ; [.445C.0020.0008] # DESERET CAPITAL LETTER SHORT O +10433 ; [.445D.0020.0002] # DESERET SMALL LETTER SHORT OO +1040B ; [.445D.0020.0008] # DESERET CAPITAL LETTER SHORT OO +10434 ; [.445E.0020.0002] # DESERET SMALL LETTER AY +1040C ; [.445E.0020.0008] # DESERET CAPITAL LETTER AY +10435 ; [.445F.0020.0002] # DESERET SMALL LETTER OW +1040D ; [.445F.0020.0008] # DESERET CAPITAL LETTER OW +10436 ; [.4460.0020.0002] # DESERET SMALL LETTER WU +1040E ; [.4460.0020.0008] # DESERET CAPITAL LETTER WU +10437 ; [.4461.0020.0002] # DESERET SMALL LETTER YEE +1040F ; [.4461.0020.0008] # DESERET CAPITAL LETTER YEE +10438 ; [.4462.0020.0002] # DESERET SMALL LETTER H +10410 ; [.4462.0020.0008] # DESERET CAPITAL LETTER H +10439 ; [.4463.0020.0002] # DESERET SMALL LETTER PEE +10411 ; [.4463.0020.0008] # DESERET CAPITAL LETTER PEE +1043A ; [.4464.0020.0002] # DESERET SMALL LETTER BEE +10412 ; [.4464.0020.0008] # DESERET CAPITAL LETTER BEE +1043B ; [.4465.0020.0002] # DESERET SMALL LETTER TEE +10413 ; [.4465.0020.0008] # DESERET CAPITAL LETTER TEE +1043C ; [.4466.0020.0002] # DESERET SMALL LETTER DEE +10414 ; [.4466.0020.0008] # DESERET CAPITAL LETTER DEE +1043D ; [.4467.0020.0002] # DESERET SMALL LETTER CHEE +10415 ; [.4467.0020.0008] # DESERET CAPITAL LETTER CHEE +1043E ; [.4468.0020.0002] # DESERET SMALL LETTER JEE +10416 ; [.4468.0020.0008] # DESERET CAPITAL LETTER JEE +1043F ; [.4469.0020.0002] # DESERET SMALL LETTER KAY +10417 ; [.4469.0020.0008] # DESERET CAPITAL LETTER KAY +10440 ; [.446A.0020.0002] # DESERET SMALL LETTER GAY +10418 ; [.446A.0020.0008] # DESERET CAPITAL LETTER GAY +10441 ; [.446B.0020.0002] # DESERET SMALL LETTER EF +10419 ; [.446B.0020.0008] # DESERET CAPITAL LETTER EF +10442 ; [.446C.0020.0002] # DESERET SMALL LETTER VEE +1041A ; [.446C.0020.0008] # DESERET CAPITAL LETTER VEE +10443 ; [.446D.0020.0002] # DESERET SMALL LETTER ETH +1041B ; [.446D.0020.0008] # DESERET CAPITAL LETTER ETH +10444 ; [.446E.0020.0002] # DESERET SMALL LETTER THEE +1041C ; [.446E.0020.0008] # DESERET CAPITAL LETTER THEE +10445 ; [.446F.0020.0002] # DESERET SMALL LETTER ES +1041D ; [.446F.0020.0008] # DESERET CAPITAL LETTER ES +10446 ; [.4470.0020.0002] # DESERET SMALL LETTER ZEE +1041E ; [.4470.0020.0008] # DESERET CAPITAL LETTER ZEE +10447 ; [.4471.0020.0002] # DESERET SMALL LETTER ESH +1041F ; [.4471.0020.0008] # DESERET CAPITAL LETTER ESH +10448 ; [.4472.0020.0002] # DESERET SMALL LETTER ZHEE +10420 ; [.4472.0020.0008] # DESERET CAPITAL LETTER ZHEE +10449 ; [.4473.0020.0002] # DESERET SMALL LETTER ER +10421 ; [.4473.0020.0008] # DESERET CAPITAL LETTER ER +1044A ; [.4474.0020.0002] # DESERET SMALL LETTER EL +10422 ; [.4474.0020.0008] # DESERET CAPITAL LETTER EL +1044B ; [.4475.0020.0002] # DESERET SMALL LETTER EM +10423 ; [.4475.0020.0008] # DESERET CAPITAL LETTER EM +1044C ; [.4476.0020.0002] # DESERET SMALL LETTER EN +10424 ; [.4476.0020.0008] # DESERET CAPITAL LETTER EN +1044D ; [.4477.0020.0002] # DESERET SMALL LETTER ENG +10425 ; [.4477.0020.0008] # DESERET CAPITAL LETTER ENG +1044E ; [.4478.0020.0002] # DESERET SMALL LETTER OI +10426 ; [.4478.0020.0008] # DESERET CAPITAL LETTER OI +1044F ; [.4479.0020.0002] # DESERET SMALL LETTER EW +10427 ; [.4479.0020.0008] # DESERET CAPITAL LETTER EW +10450 ; [.447A.0020.0002] # SHAVIAN LETTER PEEP +10451 ; [.447B.0020.0002] # SHAVIAN LETTER TOT +10452 ; [.447C.0020.0002] # SHAVIAN LETTER KICK +10453 ; [.447D.0020.0002] # SHAVIAN LETTER FEE +10454 ; [.447E.0020.0002] # SHAVIAN LETTER THIGH +10455 ; [.447F.0020.0002] # SHAVIAN LETTER SO +10456 ; [.4480.0020.0002] # SHAVIAN LETTER SURE +10457 ; [.4481.0020.0002] # SHAVIAN LETTER CHURCH +10458 ; [.4482.0020.0002] # SHAVIAN LETTER YEA +10459 ; [.4483.0020.0002] # SHAVIAN LETTER HUNG +1045A ; [.4484.0020.0002] # SHAVIAN LETTER BIB +1045B ; [.4485.0020.0002] # SHAVIAN LETTER DEAD +1045C ; [.4486.0020.0002] # SHAVIAN LETTER GAG +1045D ; [.4487.0020.0002] # SHAVIAN LETTER VOW +1045E ; [.4488.0020.0002] # SHAVIAN LETTER THEY +1045F ; [.4489.0020.0002] # SHAVIAN LETTER ZOO +10460 ; [.448A.0020.0002] # SHAVIAN LETTER MEASURE +10461 ; [.448B.0020.0002] # SHAVIAN LETTER JUDGE +10462 ; [.448C.0020.0002] # SHAVIAN LETTER WOE +10463 ; [.448D.0020.0002] # SHAVIAN LETTER HA-HA +10464 ; [.448E.0020.0002] # SHAVIAN LETTER LOLL +10465 ; [.448F.0020.0002] # SHAVIAN LETTER MIME +10466 ; [.4490.0020.0002] # SHAVIAN LETTER IF +10467 ; [.4491.0020.0002] # SHAVIAN LETTER EGG +10468 ; [.4492.0020.0002] # SHAVIAN LETTER ASH +10469 ; [.4493.0020.0002] # SHAVIAN LETTER ADO +1046A ; [.4494.0020.0002] # SHAVIAN LETTER ON +1046B ; [.4495.0020.0002] # SHAVIAN LETTER WOOL +1046C ; [.4496.0020.0002] # SHAVIAN LETTER OUT +1046D ; [.4497.0020.0002] # SHAVIAN LETTER AH +1046E ; [.4498.0020.0002] # SHAVIAN LETTER ROAR +1046F ; [.4499.0020.0002] # SHAVIAN LETTER NUN +10470 ; [.449A.0020.0002] # SHAVIAN LETTER EAT +10471 ; [.449B.0020.0002] # SHAVIAN LETTER AGE +10472 ; [.449C.0020.0002] # SHAVIAN LETTER ICE +10473 ; [.449D.0020.0002] # SHAVIAN LETTER UP +10474 ; [.449E.0020.0002] # SHAVIAN LETTER OAK +10475 ; [.449F.0020.0002] # SHAVIAN LETTER OOZE +10476 ; [.44A0.0020.0002] # SHAVIAN LETTER OIL +10477 ; [.44A1.0020.0002] # SHAVIAN LETTER AWE +10478 ; [.44A2.0020.0002] # SHAVIAN LETTER ARE +10479 ; [.44A3.0020.0002] # SHAVIAN LETTER OR +1047A ; [.44A4.0020.0002] # SHAVIAN LETTER AIR +1047B ; [.44A5.0020.0002] # SHAVIAN LETTER ERR +1047C ; [.44A6.0020.0002] # SHAVIAN LETTER ARRAY +1047D ; [.44A7.0020.0002] # SHAVIAN LETTER EAR +1047E ; [.44A8.0020.0002] # SHAVIAN LETTER IAN +1047F ; [.44A9.0020.0002] # SHAVIAN LETTER YEW +1BC00 ; [.44AA.0020.0002] # DUPLOYAN LETTER H +1BC01 ; [.44AB.0020.0002] # DUPLOYAN LETTER X +1BC02 ; [.44AC.0020.0002] # DUPLOYAN LETTER P +1BC03 ; [.44AD.0020.0002] # DUPLOYAN LETTER T +1BC04 ; [.44AE.0020.0002] # DUPLOYAN LETTER F +1BC05 ; [.44AF.0020.0002] # DUPLOYAN LETTER K +1BC06 ; [.44B0.0020.0002] # DUPLOYAN LETTER L +1BC07 ; [.44B1.0020.0002] # DUPLOYAN LETTER B +1BC08 ; [.44B2.0020.0002] # DUPLOYAN LETTER D +1BC09 ; [.44B3.0020.0002] # DUPLOYAN LETTER V +1BC0A ; [.44B4.0020.0002] # DUPLOYAN LETTER G +1BC0B ; [.44B5.0020.0002] # DUPLOYAN LETTER R +1BC0C ; [.44B6.0020.0002] # DUPLOYAN LETTER P N +1BC0D ; [.44B7.0020.0002] # DUPLOYAN LETTER D S +1BC0E ; [.44B8.0020.0002] # DUPLOYAN LETTER F N +1BC0F ; [.44B9.0020.0002] # DUPLOYAN LETTER K M +1BC10 ; [.44BA.0020.0002] # DUPLOYAN LETTER R S +1BC11 ; [.44BB.0020.0002] # DUPLOYAN LETTER TH +1BC12 ; [.44BC.0020.0002] # DUPLOYAN LETTER SLOAN DH +1BC13 ; [.44BD.0020.0002] # DUPLOYAN LETTER DH +1BC14 ; [.44BE.0020.0002] # DUPLOYAN LETTER KK +1BC15 ; [.44BF.0020.0002] # DUPLOYAN LETTER SLOAN J +1BC16 ; [.44C0.0020.0002] # DUPLOYAN LETTER HL +1BC17 ; [.44C1.0020.0002] # DUPLOYAN LETTER LH +1BC18 ; [.44C2.0020.0002] # DUPLOYAN LETTER RH +1BC19 ; [.44C3.0020.0002] # DUPLOYAN LETTER M +1BC1A ; [.44C4.0020.0002] # DUPLOYAN LETTER N +1BC1B ; [.44C5.0020.0002] # DUPLOYAN LETTER J +1BC1C ; [.44C6.0020.0002] # DUPLOYAN LETTER S +1BC1D ; [.44C7.0020.0002] # DUPLOYAN LETTER M N +1BC1E ; [.44C8.0020.0002] # DUPLOYAN LETTER N M +1BC1F ; [.44C9.0020.0002] # DUPLOYAN LETTER J M +1BC20 ; [.44CA.0020.0002] # DUPLOYAN LETTER S J +1BC21 ; [.44CB.0020.0002] # DUPLOYAN LETTER M WITH DOT +1BC22 ; [.44CC.0020.0002] # DUPLOYAN LETTER N WITH DOT +1BC23 ; [.44CD.0020.0002] # DUPLOYAN LETTER J WITH DOT +1BC24 ; [.44CE.0020.0002] # DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE +1BC25 ; [.44CF.0020.0002] # DUPLOYAN LETTER S WITH DOT +1BC26 ; [.44D0.0020.0002] # DUPLOYAN LETTER S WITH DOT BELOW +1BC27 ; [.44D1.0020.0002] # DUPLOYAN LETTER M S +1BC28 ; [.44D2.0020.0002] # DUPLOYAN LETTER N S +1BC29 ; [.44D3.0020.0002] # DUPLOYAN LETTER J S +1BC2A ; [.44D4.0020.0002] # DUPLOYAN LETTER S S +1BC2B ; [.44D5.0020.0002] # DUPLOYAN LETTER M N S +1BC2C ; [.44D6.0020.0002] # DUPLOYAN LETTER N M S +1BC2D ; [.44D7.0020.0002] # DUPLOYAN LETTER J M S +1BC2E ; [.44D8.0020.0002] # DUPLOYAN LETTER S J S +1BC2F ; [.44D9.0020.0002] # DUPLOYAN LETTER J S WITH DOT +1BC30 ; [.44DA.0020.0002] # DUPLOYAN LETTER J N +1BC31 ; [.44DB.0020.0002] # DUPLOYAN LETTER J N S +1BC32 ; [.44DC.0020.0002] # DUPLOYAN LETTER S T +1BC33 ; [.44DD.0020.0002] # DUPLOYAN LETTER S T R +1BC34 ; [.44DE.0020.0002] # DUPLOYAN LETTER S P +1BC35 ; [.44DF.0020.0002] # DUPLOYAN LETTER S P R +1BC36 ; [.44E0.0020.0002] # DUPLOYAN LETTER T S +1BC37 ; [.44E1.0020.0002] # DUPLOYAN LETTER T R S +1BC38 ; [.44E2.0020.0002] # DUPLOYAN LETTER W +1BC39 ; [.44E3.0020.0002] # DUPLOYAN LETTER WH +1BC3A ; [.44E4.0020.0002] # DUPLOYAN LETTER W R +1BC3B ; [.44E5.0020.0002] # DUPLOYAN LETTER S N +1BC3C ; [.44E6.0020.0002] # DUPLOYAN LETTER S M +1BC3D ; [.44E7.0020.0002] # DUPLOYAN LETTER K R S +1BC3E ; [.44E8.0020.0002] # DUPLOYAN LETTER G R S +1BC3F ; [.44E9.0020.0002] # DUPLOYAN LETTER S K +1BC40 ; [.44EA.0020.0002] # DUPLOYAN LETTER S K R +1BC41 ; [.44EB.0020.0002] # DUPLOYAN LETTER A +1BC42 ; [.44EC.0020.0002] # DUPLOYAN LETTER SLOAN OW +1BC43 ; [.44ED.0020.0002] # DUPLOYAN LETTER OA +1BC44 ; [.44EE.0020.0002] # DUPLOYAN LETTER O +1BC45 ; [.44EF.0020.0002] # DUPLOYAN LETTER AOU +1BC46 ; [.44F0.0020.0002] # DUPLOYAN LETTER I +1BC47 ; [.44F1.0020.0002] # DUPLOYAN LETTER E +1BC48 ; [.44F2.0020.0002] # DUPLOYAN LETTER IE +1BC49 ; [.44F3.0020.0002] # DUPLOYAN LETTER SHORT I +1BC4A ; [.44F4.0020.0002] # DUPLOYAN LETTER UI +1BC4B ; [.44F5.0020.0002] # DUPLOYAN LETTER EE +1BC4C ; [.44F6.0020.0002] # DUPLOYAN LETTER SLOAN EH +1BC4D ; [.44F7.0020.0002] # DUPLOYAN LETTER ROMANIAN I +1BC4E ; [.44F8.0020.0002] # DUPLOYAN LETTER SLOAN EE +1BC4F ; [.44F9.0020.0002] # DUPLOYAN LETTER LONG I +1BC50 ; [.44FA.0020.0002] # DUPLOYAN LETTER YE +1BC51 ; [.44FB.0020.0002] # DUPLOYAN LETTER U +1BC52 ; [.44FC.0020.0002] # DUPLOYAN LETTER EU +1BC53 ; [.44FD.0020.0002] # DUPLOYAN LETTER XW +1BC54 ; [.44FE.0020.0002] # DUPLOYAN LETTER U N +1BC55 ; [.44FF.0020.0002] # DUPLOYAN LETTER LONG U +1BC56 ; [.4500.0020.0002] # DUPLOYAN LETTER ROMANIAN U +1BC57 ; [.4501.0020.0002] # DUPLOYAN LETTER UH +1BC58 ; [.4502.0020.0002] # DUPLOYAN LETTER SLOAN U +1BC59 ; [.4503.0020.0002] # DUPLOYAN LETTER OOH +1BC5A ; [.4504.0020.0002] # DUPLOYAN LETTER OW +1BC5B ; [.4505.0020.0002] # DUPLOYAN LETTER OU +1BC5C ; [.4506.0020.0002] # DUPLOYAN LETTER WA +1BC5D ; [.4507.0020.0002] # DUPLOYAN LETTER WO +1BC5E ; [.4508.0020.0002] # DUPLOYAN LETTER WI +1BC5F ; [.4509.0020.0002] # DUPLOYAN LETTER WEI +1BC60 ; [.450A.0020.0002] # DUPLOYAN LETTER WOW +1BC61 ; [.450B.0020.0002] # DUPLOYAN LETTER NASAL U +1BC62 ; [.450C.0020.0002] # DUPLOYAN LETTER NASAL O +1BC63 ; [.450D.0020.0002] # DUPLOYAN LETTER NASAL I +1BC64 ; [.450E.0020.0002] # DUPLOYAN LETTER NASAL A +1BC65 ; [.450F.0020.0002] # DUPLOYAN LETTER PERNIN AN +1BC66 ; [.4510.0020.0002] # DUPLOYAN LETTER PERNIN AM +1BC67 ; [.4511.0020.0002] # DUPLOYAN LETTER SLOAN EN +1BC68 ; [.4512.0020.0002] # DUPLOYAN LETTER SLOAN AN +1BC69 ; [.4513.0020.0002] # DUPLOYAN LETTER SLOAN ON +1BC6A ; [.4514.0020.0002] # DUPLOYAN LETTER VOCALIC M +1BC70 ; [.4515.0020.0002] # DUPLOYAN AFFIX LEFT HORIZONTAL SECANT +1BC71 ; [.4516.0020.0002] # DUPLOYAN AFFIX MID HORIZONTAL SECANT +1BC72 ; [.4517.0020.0002] # DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT +1BC73 ; [.4518.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL SECANT +1BC74 ; [.4519.0020.0002] # DUPLOYAN AFFIX MID VERTICAL SECANT +1BC75 ; [.451A.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL SECANT +1BC76 ; [.451B.0020.0002] # DUPLOYAN AFFIX ATTACHED SECANT +1BC77 ; [.451C.0020.0002] # DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT +1BC78 ; [.451D.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT +1BC79 ; [.451E.0020.0002] # DUPLOYAN AFFIX ATTACHED TAIL +1BC7A ; [.451F.0020.0002] # DUPLOYAN AFFIX ATTACHED E HOOK +1BC7B ; [.4520.0020.0002] # DUPLOYAN AFFIX ATTACHED I HOOK +1BC7C ; [.4521.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80 ; [.4522.0020.0002] # DUPLOYAN AFFIX HIGH ACUTE +1BC81 ; [.4523.0020.0002] # DUPLOYAN AFFIX HIGH TIGHT ACUTE +1BC82 ; [.4524.0020.0002] # DUPLOYAN AFFIX HIGH GRAVE +1BC83 ; [.4525.0020.0002] # DUPLOYAN AFFIX HIGH LONG GRAVE +1BC84 ; [.4526.0020.0002] # DUPLOYAN AFFIX HIGH DOT +1BC85 ; [.4527.0020.0002] # DUPLOYAN AFFIX HIGH CIRCLE +1BC86 ; [.4528.0020.0002] # DUPLOYAN AFFIX HIGH LINE +1BC87 ; [.4529.0020.0002] # DUPLOYAN AFFIX HIGH WAVE +1BC88 ; [.452A.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL +1BC90 ; [.452B.0020.0002] # DUPLOYAN AFFIX LOW ACUTE +1BC91 ; [.452C.0020.0002] # DUPLOYAN AFFIX LOW TIGHT ACUTE +1BC92 ; [.452D.0020.0002] # DUPLOYAN AFFIX LOW GRAVE +1BC93 ; [.452E.0020.0002] # DUPLOYAN AFFIX LOW LONG GRAVE +1BC94 ; [.452F.0020.0002] # DUPLOYAN AFFIX LOW DOT +1BC95 ; [.4530.0020.0002] # DUPLOYAN AFFIX LOW CIRCLE +1BC96 ; [.4531.0020.0002] # DUPLOYAN AFFIX LOW LINE +1BC97 ; [.4532.0020.0002] # DUPLOYAN AFFIX LOW WAVE +1BC98 ; [.4533.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL +1BC99 ; [.4534.0020.0002] # DUPLOYAN AFFIX LOW ARROW +10480 ; [.4535.0020.0002] # OSMANYA LETTER ALEF +10481 ; [.4536.0020.0002] # OSMANYA LETTER BA +10482 ; [.4537.0020.0002] # OSMANYA LETTER TA +10483 ; [.4538.0020.0002] # OSMANYA LETTER JA +10484 ; [.4539.0020.0002] # OSMANYA LETTER XA +10485 ; [.453A.0020.0002] # OSMANYA LETTER KHA +10486 ; [.453B.0020.0002] # OSMANYA LETTER DEEL +10487 ; [.453C.0020.0002] # OSMANYA LETTER RA +10488 ; [.453D.0020.0002] # OSMANYA LETTER SA +10489 ; [.453E.0020.0002] # OSMANYA LETTER SHIIN +1048A ; [.453F.0020.0002] # OSMANYA LETTER DHA +1048B ; [.4540.0020.0002] # OSMANYA LETTER CAYN +1048C ; [.4541.0020.0002] # OSMANYA LETTER GA +1048D ; [.4542.0020.0002] # OSMANYA LETTER FA +1048E ; [.4543.0020.0002] # OSMANYA LETTER QAAF +1048F ; [.4544.0020.0002] # OSMANYA LETTER KAAF +10490 ; [.4545.0020.0002] # OSMANYA LETTER LAAN +10491 ; [.4546.0020.0002] # OSMANYA LETTER MIIN +10492 ; [.4547.0020.0002] # OSMANYA LETTER NUUN +10493 ; [.4548.0020.0002] # OSMANYA LETTER WAW +10494 ; [.4549.0020.0002] # OSMANYA LETTER HA +10495 ; [.454A.0020.0002] # OSMANYA LETTER YA +10496 ; [.454B.0020.0002] # OSMANYA LETTER A +10497 ; [.454C.0020.0002] # OSMANYA LETTER E +10498 ; [.454D.0020.0002] # OSMANYA LETTER I +10499 ; [.454E.0020.0002] # OSMANYA LETTER O +1049A ; [.454F.0020.0002] # OSMANYA LETTER U +1049B ; [.4550.0020.0002] # OSMANYA LETTER AA +1049C ; [.4551.0020.0002] # OSMANYA LETTER EE +1049D ; [.4552.0020.0002] # OSMANYA LETTER OO +10500 ; [.4553.0020.0002] # ELBASAN LETTER A +10501 ; [.4554.0020.0002] # ELBASAN LETTER BE +10502 ; [.4555.0020.0002] # ELBASAN LETTER CE +10503 ; [.4556.0020.0002] # ELBASAN LETTER CHE +10504 ; [.4557.0020.0002] # ELBASAN LETTER DE +10505 ; [.4558.0020.0002] # ELBASAN LETTER NDE +10506 ; [.4559.0020.0002] # ELBASAN LETTER DHE +10507 ; [.455A.0020.0002] # ELBASAN LETTER EI +10508 ; [.455B.0020.0002] # ELBASAN LETTER E +10509 ; [.455C.0020.0002] # ELBASAN LETTER FE +1050A ; [.455D.0020.0002] # ELBASAN LETTER GE +1050B ; [.455E.0020.0002] # ELBASAN LETTER GJE +1050C ; [.455F.0020.0002] # ELBASAN LETTER HE +1050D ; [.4560.0020.0002] # ELBASAN LETTER I +1050E ; [.4561.0020.0002] # ELBASAN LETTER JE +1050F ; [.4562.0020.0002] # ELBASAN LETTER KE +10510 ; [.4563.0020.0002] # ELBASAN LETTER LE +10511 ; [.4564.0020.0002] # ELBASAN LETTER LLE +10512 ; [.4565.0020.0002] # ELBASAN LETTER ME +10513 ; [.4566.0020.0002] # ELBASAN LETTER NE +10514 ; [.4567.0020.0002] # ELBASAN LETTER NA +10515 ; [.4568.0020.0002] # ELBASAN LETTER NJE +10516 ; [.4569.0020.0002] # ELBASAN LETTER O +10517 ; [.456A.0020.0002] # ELBASAN LETTER PE +10518 ; [.456B.0020.0002] # ELBASAN LETTER QE +10519 ; [.456C.0020.0002] # ELBASAN LETTER RE +1051A ; [.456D.0020.0002] # ELBASAN LETTER RRE +1051B ; [.456E.0020.0002] # ELBASAN LETTER SE +1051C ; [.456F.0020.0002] # ELBASAN LETTER SHE +1051D ; [.4570.0020.0002] # ELBASAN LETTER TE +1051E ; [.4571.0020.0002] # ELBASAN LETTER THE +1051F ; [.4572.0020.0002] # ELBASAN LETTER U +10520 ; [.4573.0020.0002] # ELBASAN LETTER VE +10521 ; [.4574.0020.0002] # ELBASAN LETTER XE +10522 ; [.4575.0020.0002] # ELBASAN LETTER Y +10523 ; [.4576.0020.0002] # ELBASAN LETTER ZE +10524 ; [.4577.0020.0002] # ELBASAN LETTER ZHE +10525 ; [.4578.0020.0002] # ELBASAN LETTER GHE +10526 ; [.4579.0020.0002] # ELBASAN LETTER GHAMMA +10527 ; [.457A.0020.0002] # ELBASAN LETTER KHE +10530 ; [.457B.0020.0002] # CAUCASIAN ALBANIAN LETTER ALT +10531 ; [.457C.0020.0002] # CAUCASIAN ALBANIAN LETTER BET +10532 ; [.457D.0020.0002] # CAUCASIAN ALBANIAN LETTER GIM +10533 ; [.457E.0020.0002] # CAUCASIAN ALBANIAN LETTER DAT +10534 ; [.457F.0020.0002] # CAUCASIAN ALBANIAN LETTER EB +10535 ; [.4580.0020.0002] # CAUCASIAN ALBANIAN LETTER ZARL +10536 ; [.4581.0020.0002] # CAUCASIAN ALBANIAN LETTER EYN +10537 ; [.4582.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHIL +10538 ; [.4583.0020.0002] # CAUCASIAN ALBANIAN LETTER TAS +10539 ; [.4584.0020.0002] # CAUCASIAN ALBANIAN LETTER CHA +1053A ; [.4585.0020.0002] # CAUCASIAN ALBANIAN LETTER YOWD +1053B ; [.4586.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHA +1053C ; [.4587.0020.0002] # CAUCASIAN ALBANIAN LETTER IRB +1053D ; [.4588.0020.0002] # CAUCASIAN ALBANIAN LETTER SHA +1053E ; [.4589.0020.0002] # CAUCASIAN ALBANIAN LETTER LAN +1053F ; [.458A.0020.0002] # CAUCASIAN ALBANIAN LETTER INYA +10540 ; [.458B.0020.0002] # CAUCASIAN ALBANIAN LETTER XEYN +10541 ; [.458C.0020.0002] # CAUCASIAN ALBANIAN LETTER DYAN +10542 ; [.458D.0020.0002] # CAUCASIAN ALBANIAN LETTER CAR +10543 ; [.458E.0020.0002] # CAUCASIAN ALBANIAN LETTER JHOX +10544 ; [.458F.0020.0002] # CAUCASIAN ALBANIAN LETTER KAR +10545 ; [.4590.0020.0002] # CAUCASIAN ALBANIAN LETTER LYIT +10546 ; [.4591.0020.0002] # CAUCASIAN ALBANIAN LETTER HEYT +10547 ; [.4592.0020.0002] # CAUCASIAN ALBANIAN LETTER QAY +10548 ; [.4593.0020.0002] # CAUCASIAN ALBANIAN LETTER AOR +10549 ; [.4594.0020.0002] # CAUCASIAN ALBANIAN LETTER CHOY +1054A ; [.4595.0020.0002] # CAUCASIAN ALBANIAN LETTER CHI +1054B ; [.4596.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAY +1054C ; [.4597.0020.0002] # CAUCASIAN ALBANIAN LETTER MAQ +1054D ; [.4598.0020.0002] # CAUCASIAN ALBANIAN LETTER QAR +1054E ; [.4599.0020.0002] # CAUCASIAN ALBANIAN LETTER NOWC +1054F ; [.459A.0020.0002] # CAUCASIAN ALBANIAN LETTER DZYAY +10550 ; [.459B.0020.0002] # CAUCASIAN ALBANIAN LETTER SHAK +10551 ; [.459C.0020.0002] # CAUCASIAN ALBANIAN LETTER JAYN +10552 ; [.459D.0020.0002] # CAUCASIAN ALBANIAN LETTER ON +10553 ; [.459E.0020.0002] # CAUCASIAN ALBANIAN LETTER TYAY +10554 ; [.459F.0020.0002] # CAUCASIAN ALBANIAN LETTER FAM +10555 ; [.45A0.0020.0002] # CAUCASIAN ALBANIAN LETTER DZAY +10556 ; [.45A1.0020.0002] # CAUCASIAN ALBANIAN LETTER CHAT +10557 ; [.45A2.0020.0002] # CAUCASIAN ALBANIAN LETTER PEN +10558 ; [.45A3.0020.0002] # CAUCASIAN ALBANIAN LETTER GHEYS +10559 ; [.45A4.0020.0002] # CAUCASIAN ALBANIAN LETTER RAT +1055A ; [.45A5.0020.0002] # CAUCASIAN ALBANIAN LETTER SEYK +1055B ; [.45A6.0020.0002] # CAUCASIAN ALBANIAN LETTER VEYZ +1055C ; [.45A7.0020.0002] # CAUCASIAN ALBANIAN LETTER TIWR +1055D ; [.45A8.0020.0002] # CAUCASIAN ALBANIAN LETTER SHOY +1055E ; [.45A9.0020.0002] # CAUCASIAN ALBANIAN LETTER IWN +1055F ; [.45AA.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAW +10560 ; [.45AB.0020.0002] # CAUCASIAN ALBANIAN LETTER CAYN +10561 ; [.45AC.0020.0002] # CAUCASIAN ALBANIAN LETTER YAYD +10562 ; [.45AD.0020.0002] # CAUCASIAN ALBANIAN LETTER PIWR +10563 ; [.45AE.0020.0002] # CAUCASIAN ALBANIAN LETTER KIW +110D0 ; [.45AF.0020.0002] # SORA SOMPENG LETTER SAH +110D1 ; [.45B0.0020.0002] # SORA SOMPENG LETTER TAH +110D2 ; [.45B1.0020.0002] # SORA SOMPENG LETTER BAH +110D3 ; [.45B2.0020.0002] # SORA SOMPENG LETTER CAH +110D4 ; [.45B3.0020.0002] # SORA SOMPENG LETTER DAH +110D5 ; [.45B4.0020.0002] # SORA SOMPENG LETTER GAH +110D6 ; [.45B5.0020.0002] # SORA SOMPENG LETTER MAH +110D7 ; [.45B6.0020.0002] # SORA SOMPENG LETTER NGAH +110D8 ; [.45B7.0020.0002] # SORA SOMPENG LETTER LAH +110D9 ; [.45B8.0020.0002] # SORA SOMPENG LETTER NAH +110DA ; [.45B9.0020.0002] # SORA SOMPENG LETTER VAH +110DB ; [.45BA.0020.0002] # SORA SOMPENG LETTER PAH +110DC ; [.45BB.0020.0002] # SORA SOMPENG LETTER YAH +110DD ; [.45BC.0020.0002] # SORA SOMPENG LETTER RAH +110DE ; [.45BD.0020.0002] # SORA SOMPENG LETTER HAH +110DF ; [.45BE.0020.0002] # SORA SOMPENG LETTER KAH +110E0 ; [.45BF.0020.0002] # SORA SOMPENG LETTER JAH +110E1 ; [.45C0.0020.0002] # SORA SOMPENG LETTER NYAH +110E2 ; [.45C1.0020.0002] # SORA SOMPENG LETTER AH +110E3 ; [.45C2.0020.0002] # SORA SOMPENG LETTER EEH +110E4 ; [.45C3.0020.0002] # SORA SOMPENG LETTER IH +110E5 ; [.45C4.0020.0002] # SORA SOMPENG LETTER UH +110E6 ; [.45C5.0020.0002] # SORA SOMPENG LETTER OH +110E7 ; [.45C6.0020.0002] # SORA SOMPENG LETTER EH +110E8 ; [.45C7.0020.0002] # SORA SOMPENG LETTER MAE +16A40 ; [.45C8.0020.0002] # MRO LETTER TA +16A41 ; [.45C9.0020.0002] # MRO LETTER NGI +16A42 ; [.45CA.0020.0002] # MRO LETTER YO +16A43 ; [.45CB.0020.0002] # MRO LETTER MIM +16A44 ; [.45CC.0020.0002] # MRO LETTER BA +16A45 ; [.45CD.0020.0002] # MRO LETTER DA +16A46 ; [.45CE.0020.0002] # MRO LETTER A +16A47 ; [.45CF.0020.0002] # MRO LETTER PHI +16A48 ; [.45D0.0020.0002] # MRO LETTER KHAI +16A49 ; [.45D1.0020.0002] # MRO LETTER HAO +16A4A ; [.45D2.0020.0002] # MRO LETTER DAI +16A4B ; [.45D3.0020.0002] # MRO LETTER CHU +16A4C ; [.45D4.0020.0002] # MRO LETTER KEAAE +16A4D ; [.45D5.0020.0002] # MRO LETTER OL +16A4E ; [.45D6.0020.0002] # MRO LETTER MAEM +16A4F ; [.45D7.0020.0002] # MRO LETTER NIN +16A50 ; [.45D8.0020.0002] # MRO LETTER PA +16A51 ; [.45D9.0020.0002] # MRO LETTER OO +16A52 ; [.45DA.0020.0002] # MRO LETTER O +16A53 ; [.45DB.0020.0002] # MRO LETTER RO +16A54 ; [.45DC.0020.0002] # MRO LETTER SHI +16A55 ; [.45DD.0020.0002] # MRO LETTER THEA +16A56 ; [.45DE.0020.0002] # MRO LETTER EA +16A57 ; [.45DF.0020.0002] # MRO LETTER WA +16A58 ; [.45E0.0020.0002] # MRO LETTER E +16A59 ; [.45E1.0020.0002] # MRO LETTER KO +16A5A ; [.45E2.0020.0002] # MRO LETTER LAN +16A5B ; [.45E3.0020.0002] # MRO LETTER LA +16A5C ; [.45E4.0020.0002] # MRO LETTER HAI +16A5D ; [.45E5.0020.0002] # MRO LETTER RI +16A5E ; [.45E6.0020.0002] # MRO LETTER TEK +10000 ; [.45E7.0020.0002] # LINEAR B SYLLABLE B008 A +10001 ; [.45E8.0020.0002] # LINEAR B SYLLABLE B038 E +10002 ; [.45E9.0020.0002] # LINEAR B SYLLABLE B028 I +10003 ; [.45EA.0020.0002] # LINEAR B SYLLABLE B061 O +10004 ; [.45EB.0020.0002] # LINEAR B SYLLABLE B010 U +10005 ; [.45EC.0020.0002] # LINEAR B SYLLABLE B001 DA +10006 ; [.45ED.0020.0002] # LINEAR B SYLLABLE B045 DE +10007 ; [.45EE.0020.0002] # LINEAR B SYLLABLE B007 DI +10008 ; [.45EF.0020.0002] # LINEAR B SYLLABLE B014 DO +10009 ; [.45F0.0020.0002] # LINEAR B SYLLABLE B051 DU +1000A ; [.45F1.0020.0002] # LINEAR B SYLLABLE B057 JA +1000B ; [.45F2.0020.0002] # LINEAR B SYLLABLE B046 JE +1000D ; [.45F3.0020.0002] # LINEAR B SYLLABLE B036 JO +1000E ; [.45F4.0020.0002] # LINEAR B SYLLABLE B065 JU +1000F ; [.45F5.0020.0002] # LINEAR B SYLLABLE B077 KA +10010 ; [.45F6.0020.0002] # LINEAR B SYLLABLE B044 KE +10011 ; [.45F7.0020.0002] # LINEAR B SYLLABLE B067 KI +10012 ; [.45F8.0020.0002] # LINEAR B SYLLABLE B070 KO +10013 ; [.45F9.0020.0002] # LINEAR B SYLLABLE B081 KU +10014 ; [.45FA.0020.0002] # LINEAR B SYLLABLE B080 MA +10015 ; [.45FB.0020.0002] # LINEAR B SYLLABLE B013 ME +10016 ; [.45FC.0020.0002] # LINEAR B SYLLABLE B073 MI +10017 ; [.45FD.0020.0002] # LINEAR B SYLLABLE B015 MO +10018 ; [.45FE.0020.0002] # LINEAR B SYLLABLE B023 MU +10019 ; [.45FF.0020.0002] # LINEAR B SYLLABLE B006 NA +1001A ; [.4600.0020.0002] # LINEAR B SYLLABLE B024 NE +1001B ; [.4601.0020.0002] # LINEAR B SYLLABLE B030 NI +1001C ; [.4602.0020.0002] # LINEAR B SYLLABLE B052 NO +1001D ; [.4603.0020.0002] # LINEAR B SYLLABLE B055 NU +1001E ; [.4604.0020.0002] # LINEAR B SYLLABLE B003 PA +1001F ; [.4605.0020.0002] # LINEAR B SYLLABLE B072 PE +10020 ; [.4606.0020.0002] # LINEAR B SYLLABLE B039 PI +10021 ; [.4607.0020.0002] # LINEAR B SYLLABLE B011 PO +10022 ; [.4608.0020.0002] # LINEAR B SYLLABLE B050 PU +10023 ; [.4609.0020.0002] # LINEAR B SYLLABLE B016 QA +10024 ; [.460A.0020.0002] # LINEAR B SYLLABLE B078 QE +10025 ; [.460B.0020.0002] # LINEAR B SYLLABLE B021 QI +10026 ; [.460C.0020.0002] # LINEAR B SYLLABLE B032 QO +10028 ; [.460D.0020.0002] # LINEAR B SYLLABLE B060 RA +10029 ; [.460E.0020.0002] # LINEAR B SYLLABLE B027 RE +1002A ; [.460F.0020.0002] # LINEAR B SYLLABLE B053 RI +1002B ; [.4610.0020.0002] # LINEAR B SYLLABLE B002 RO +1002C ; [.4611.0020.0002] # LINEAR B SYLLABLE B026 RU +1002D ; [.4612.0020.0002] # LINEAR B SYLLABLE B031 SA +1002E ; [.4613.0020.0002] # LINEAR B SYLLABLE B009 SE +1002F ; [.4614.0020.0002] # LINEAR B SYLLABLE B041 SI +10030 ; [.4615.0020.0002] # LINEAR B SYLLABLE B012 SO +10031 ; [.4616.0020.0002] # LINEAR B SYLLABLE B058 SU +10032 ; [.4617.0020.0002] # LINEAR B SYLLABLE B059 TA +10033 ; [.4618.0020.0002] # LINEAR B SYLLABLE B004 TE +10034 ; [.4619.0020.0002] # LINEAR B SYLLABLE B037 TI +10035 ; [.461A.0020.0002] # LINEAR B SYLLABLE B005 TO +10036 ; [.461B.0020.0002] # LINEAR B SYLLABLE B069 TU +10037 ; [.461C.0020.0002] # LINEAR B SYLLABLE B054 WA +10038 ; [.461D.0020.0002] # LINEAR B SYLLABLE B075 WE +10039 ; [.461E.0020.0002] # LINEAR B SYLLABLE B040 WI +1003A ; [.461F.0020.0002] # LINEAR B SYLLABLE B042 WO +1003C ; [.4620.0020.0002] # LINEAR B SYLLABLE B017 ZA +1003D ; [.4621.0020.0002] # LINEAR B SYLLABLE B074 ZE +1003F ; [.4622.0020.0002] # LINEAR B SYLLABLE B020 ZO +10040 ; [.4623.0020.0002] # LINEAR B SYLLABLE B025 A2 +10041 ; [.4624.0020.0002] # LINEAR B SYLLABLE B043 A3 +10042 ; [.4625.0020.0002] # LINEAR B SYLLABLE B085 AU +10043 ; [.4626.0020.0002] # LINEAR B SYLLABLE B071 DWE +10044 ; [.4627.0020.0002] # LINEAR B SYLLABLE B090 DWO +10045 ; [.4628.0020.0002] # LINEAR B SYLLABLE B048 NWA +10046 ; [.4629.0020.0002] # LINEAR B SYLLABLE B029 PU2 +10047 ; [.462A.0020.0002] # LINEAR B SYLLABLE B062 PTE +10048 ; [.462B.0020.0002] # LINEAR B SYLLABLE B076 RA2 +10049 ; [.462C.0020.0002] # LINEAR B SYLLABLE B033 RA3 +1004A ; [.462D.0020.0002] # LINEAR B SYLLABLE B068 RO2 +1004B ; [.462E.0020.0002] # LINEAR B SYLLABLE B066 TA2 +1004C ; [.462F.0020.0002] # LINEAR B SYLLABLE B087 TWE +1004D ; [.4630.0020.0002] # LINEAR B SYLLABLE B091 TWO +10050 ; [.4631.0020.0002] # LINEAR B SYMBOL B018 +10051 ; [.4632.0020.0002] # LINEAR B SYMBOL B019 +10052 ; [.4633.0020.0002] # LINEAR B SYMBOL B022 +10053 ; [.4634.0020.0002] # LINEAR B SYMBOL B034 +10054 ; [.4635.0020.0002] # LINEAR B SYMBOL B047 +10055 ; [.4636.0020.0002] # LINEAR B SYMBOL B049 +10056 ; [.4637.0020.0002] # LINEAR B SYMBOL B056 +10057 ; [.4638.0020.0002] # LINEAR B SYMBOL B063 +10058 ; [.4639.0020.0002] # LINEAR B SYMBOL B064 +10059 ; [.463A.0020.0002] # LINEAR B SYMBOL B079 +1005A ; [.463B.0020.0002] # LINEAR B SYMBOL B082 +1005B ; [.463C.0020.0002] # LINEAR B SYMBOL B083 +1005C ; [.463D.0020.0002] # LINEAR B SYMBOL B086 +1005D ; [.463E.0020.0002] # LINEAR B SYMBOL B089 +10080 ; [.463F.0020.0002] # LINEAR B IDEOGRAM B100 MAN +10081 ; [.4640.0020.0002] # LINEAR B IDEOGRAM B102 WOMAN +10082 ; [.4641.0020.0002] # LINEAR B IDEOGRAM B104 DEER +10083 ; [.4642.0020.0002] # LINEAR B IDEOGRAM B105 EQUID +10084 ; [.4643.0020.0002] # LINEAR B IDEOGRAM B105F MARE +10085 ; [.4644.0020.0002] # LINEAR B IDEOGRAM B105M STALLION +10086 ; [.4645.0020.0002] # LINEAR B IDEOGRAM B106F EWE +10087 ; [.4646.0020.0002] # LINEAR B IDEOGRAM B106M RAM +10088 ; [.4647.0020.0002] # LINEAR B IDEOGRAM B107F SHE-GOAT +10089 ; [.4648.0020.0002] # LINEAR B IDEOGRAM B107M HE-GOAT +1008A ; [.4649.0020.0002] # LINEAR B IDEOGRAM B108F SOW +1008B ; [.464A.0020.0002] # LINEAR B IDEOGRAM B108M BOAR +1008C ; [.464B.0020.0002] # LINEAR B IDEOGRAM B109F COW +1008D ; [.464C.0020.0002] # LINEAR B IDEOGRAM B109M BULL +1008E ; [.464D.0020.0002] # LINEAR B IDEOGRAM B120 WHEAT +1008F ; [.464E.0020.0002] # LINEAR B IDEOGRAM B121 BARLEY +10090 ; [.464F.0020.0002] # LINEAR B IDEOGRAM B122 OLIVE +10091 ; [.4650.0020.0002] # LINEAR B IDEOGRAM B123 SPICE +10092 ; [.4651.0020.0002] # LINEAR B IDEOGRAM B125 CYPERUS +10093 ; [.4652.0020.0002] # LINEAR B MONOGRAM B127 KAPO +10094 ; [.4653.0020.0002] # LINEAR B MONOGRAM B128 KANAKO +10095 ; [.4654.0020.0002] # LINEAR B IDEOGRAM B130 OIL +10096 ; [.4655.0020.0002] # LINEAR B IDEOGRAM B131 WINE +10097 ; [.4656.0020.0002] # LINEAR B IDEOGRAM B132 +10098 ; [.4657.0020.0002] # LINEAR B MONOGRAM B133 AREPA +10099 ; [.4658.0020.0002] # LINEAR B MONOGRAM B135 MERI +1009A ; [.4659.0020.0002] # LINEAR B IDEOGRAM B140 BRONZE +1009B ; [.465A.0020.0002] # LINEAR B IDEOGRAM B141 GOLD +1009C ; [.465B.0020.0002] # LINEAR B IDEOGRAM B142 +1009D ; [.465C.0020.0002] # LINEAR B IDEOGRAM B145 WOOL +1009E ; [.465D.0020.0002] # LINEAR B IDEOGRAM B146 +1009F ; [.465E.0020.0002] # LINEAR B IDEOGRAM B150 +100A0 ; [.465F.0020.0002] # LINEAR B IDEOGRAM B151 HORN +100A1 ; [.4660.0020.0002] # LINEAR B IDEOGRAM B152 +100A2 ; [.4661.0020.0002] # LINEAR B IDEOGRAM B153 +100A3 ; [.4662.0020.0002] # LINEAR B IDEOGRAM B154 +100A4 ; [.4663.0020.0002] # LINEAR B MONOGRAM B156 TURO2 +100A5 ; [.4664.0020.0002] # LINEAR B IDEOGRAM B157 +100A6 ; [.4665.0020.0002] # LINEAR B IDEOGRAM B158 +100A7 ; [.4666.0020.0002] # LINEAR B IDEOGRAM B159 CLOTH +100A8 ; [.4667.0020.0002] # LINEAR B IDEOGRAM B160 +100A9 ; [.4668.0020.0002] # LINEAR B IDEOGRAM B161 +100AA ; [.4669.0020.0002] # LINEAR B IDEOGRAM B162 GARMENT +100AB ; [.466A.0020.0002] # LINEAR B IDEOGRAM B163 ARMOUR +100AC ; [.466B.0020.0002] # LINEAR B IDEOGRAM B164 +100AD ; [.466C.0020.0002] # LINEAR B IDEOGRAM B165 +100AE ; [.466D.0020.0002] # LINEAR B IDEOGRAM B166 +100AF ; [.466E.0020.0002] # LINEAR B IDEOGRAM B167 +100B0 ; [.466F.0020.0002] # LINEAR B IDEOGRAM B168 +100B1 ; [.4670.0020.0002] # LINEAR B IDEOGRAM B169 +100B2 ; [.4671.0020.0002] # LINEAR B IDEOGRAM B170 +100B3 ; [.4672.0020.0002] # LINEAR B IDEOGRAM B171 +100B4 ; [.4673.0020.0002] # LINEAR B IDEOGRAM B172 +100B5 ; [.4674.0020.0002] # LINEAR B IDEOGRAM B173 MONTH +100B6 ; [.4675.0020.0002] # LINEAR B IDEOGRAM B174 +100B7 ; [.4676.0020.0002] # LINEAR B IDEOGRAM B176 TREE +100B8 ; [.4677.0020.0002] # LINEAR B IDEOGRAM B177 +100B9 ; [.4678.0020.0002] # LINEAR B IDEOGRAM B178 +100BA ; [.4679.0020.0002] # LINEAR B IDEOGRAM B179 +100BB ; [.467A.0020.0002] # LINEAR B IDEOGRAM B180 +100BC ; [.467B.0020.0002] # LINEAR B IDEOGRAM B181 +100BD ; [.467C.0020.0002] # LINEAR B IDEOGRAM B182 +100BE ; [.467D.0020.0002] # LINEAR B IDEOGRAM B183 +100BF ; [.467E.0020.0002] # LINEAR B IDEOGRAM B184 +100C0 ; [.467F.0020.0002] # LINEAR B IDEOGRAM B185 +100C1 ; [.4680.0020.0002] # LINEAR B IDEOGRAM B189 +100C2 ; [.4681.0020.0002] # LINEAR B IDEOGRAM B190 +100C3 ; [.4682.0020.0002] # LINEAR B IDEOGRAM B191 HELMET +100C4 ; [.4683.0020.0002] # LINEAR B IDEOGRAM B220 FOOTSTOOL +100C5 ; [.4684.0020.0002] # LINEAR B IDEOGRAM B225 BATHTUB +100C6 ; [.4685.0020.0002] # LINEAR B IDEOGRAM B230 SPEAR +100C7 ; [.4686.0020.0002] # LINEAR B IDEOGRAM B231 ARROW +100C8 ; [.4687.0020.0002] # LINEAR B IDEOGRAM B232 +100C9 ; [.4688.0020.0002] # LINEAR B IDEOGRAM B233 SWORD +100CA ; [.4689.0020.0002] # LINEAR B IDEOGRAM B234 +100CB ; [.468A.0020.0002] # LINEAR B IDEOGRAM B236 +100CC ; [.468B.0020.0002] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT +100CD ; [.468C.0020.0002] # LINEAR B IDEOGRAM B241 CHARIOT +100CE ; [.468D.0020.0002] # LINEAR B IDEOGRAM B242 CHARIOT FRAME +100CF ; [.468E.0020.0002] # LINEAR B IDEOGRAM B243 WHEEL +100D0 ; [.468F.0020.0002] # LINEAR B IDEOGRAM B245 +100D1 ; [.4690.0020.0002] # LINEAR B IDEOGRAM B246 +100D2 ; [.4691.0020.0002] # LINEAR B MONOGRAM B247 DIPTE +100D3 ; [.4692.0020.0002] # LINEAR B IDEOGRAM B248 +100D4 ; [.4693.0020.0002] # LINEAR B IDEOGRAM B249 +100D5 ; [.4694.0020.0002] # LINEAR B IDEOGRAM B251 +100D6 ; [.4695.0020.0002] # LINEAR B IDEOGRAM B252 +100D7 ; [.4696.0020.0002] # LINEAR B IDEOGRAM B253 +100D8 ; [.4697.0020.0002] # LINEAR B IDEOGRAM B254 DART +100D9 ; [.4698.0020.0002] # LINEAR B IDEOGRAM B255 +100DA ; [.4699.0020.0002] # LINEAR B IDEOGRAM B256 +100DB ; [.469A.0020.0002] # LINEAR B IDEOGRAM B257 +100DC ; [.469B.0020.0002] # LINEAR B IDEOGRAM B258 +100DD ; [.469C.0020.0002] # LINEAR B IDEOGRAM B259 +100DE ; [.469D.0020.0002] # LINEAR B IDEOGRAM VESSEL B155 +100DF ; [.469E.0020.0002] # LINEAR B IDEOGRAM VESSEL B200 +100E0 ; [.469F.0020.0002] # LINEAR B IDEOGRAM VESSEL B201 +100E1 ; [.46A0.0020.0002] # LINEAR B IDEOGRAM VESSEL B202 +100E2 ; [.46A1.0020.0002] # LINEAR B IDEOGRAM VESSEL B203 +100E3 ; [.46A2.0020.0002] # LINEAR B IDEOGRAM VESSEL B204 +100E4 ; [.46A3.0020.0002] # LINEAR B IDEOGRAM VESSEL B205 +100E5 ; [.46A4.0020.0002] # LINEAR B IDEOGRAM VESSEL B206 +100E6 ; [.46A5.0020.0002] # LINEAR B IDEOGRAM VESSEL B207 +100E7 ; [.46A6.0020.0002] # LINEAR B IDEOGRAM VESSEL B208 +100E8 ; [.46A7.0020.0002] # LINEAR B IDEOGRAM VESSEL B209 +100E9 ; [.46A8.0020.0002] # LINEAR B IDEOGRAM VESSEL B210 +100EA ; [.46A9.0020.0002] # LINEAR B IDEOGRAM VESSEL B211 +100EB ; [.46AA.0020.0002] # LINEAR B IDEOGRAM VESSEL B212 +100EC ; [.46AB.0020.0002] # LINEAR B IDEOGRAM VESSEL B213 +100ED ; [.46AC.0020.0002] # LINEAR B IDEOGRAM VESSEL B214 +100EE ; [.46AD.0020.0002] # LINEAR B IDEOGRAM VESSEL B215 +100EF ; [.46AE.0020.0002] # LINEAR B IDEOGRAM VESSEL B216 +100F0 ; [.46AF.0020.0002] # LINEAR B IDEOGRAM VESSEL B217 +100F1 ; [.46B0.0020.0002] # LINEAR B IDEOGRAM VESSEL B218 +100F2 ; [.46B1.0020.0002] # LINEAR B IDEOGRAM VESSEL B219 +100F3 ; [.46B2.0020.0002] # LINEAR B IDEOGRAM VESSEL B221 +100F4 ; [.46B3.0020.0002] # LINEAR B IDEOGRAM VESSEL B222 +100F5 ; [.46B4.0020.0002] # LINEAR B IDEOGRAM VESSEL B226 +100F6 ; [.46B5.0020.0002] # LINEAR B IDEOGRAM VESSEL B227 +100F7 ; [.46B6.0020.0002] # LINEAR B IDEOGRAM VESSEL B228 +100F8 ; [.46B7.0020.0002] # LINEAR B IDEOGRAM VESSEL B229 +100F9 ; [.46B8.0020.0002] # LINEAR B IDEOGRAM VESSEL B250 +100FA ; [.46B9.0020.0002] # LINEAR B IDEOGRAM VESSEL B305 +10600 ; [.46BA.0020.0002] # LINEAR A SIGN AB001 +10601 ; [.46BB.0020.0002] # LINEAR A SIGN AB002 +10602 ; [.46BC.0020.0002] # LINEAR A SIGN AB003 +10603 ; [.46BD.0020.0002] # LINEAR A SIGN AB004 +10604 ; [.46BE.0020.0002] # LINEAR A SIGN AB005 +10605 ; [.46BF.0020.0002] # LINEAR A SIGN AB006 +10606 ; [.46C0.0020.0002] # LINEAR A SIGN AB007 +10607 ; [.46C1.0020.0002] # LINEAR A SIGN AB008 +10608 ; [.46C2.0020.0002] # LINEAR A SIGN AB009 +10609 ; [.46C3.0020.0002] # LINEAR A SIGN AB010 +1060A ; [.46C4.0020.0002] # LINEAR A SIGN AB011 +1060B ; [.46C5.0020.0002] # LINEAR A SIGN AB013 +1060C ; [.46C6.0020.0002] # LINEAR A SIGN AB016 +1060D ; [.46C7.0020.0002] # LINEAR A SIGN AB017 +1060E ; [.46C8.0020.0002] # LINEAR A SIGN AB020 +1060F ; [.46C9.0020.0002] # LINEAR A SIGN AB021 +10610 ; [.46CA.0020.0002] # LINEAR A SIGN AB021F +10611 ; [.46CB.0020.0002] # LINEAR A SIGN AB021M +10612 ; [.46CC.0020.0002] # LINEAR A SIGN AB022 +10613 ; [.46CD.0020.0002] # LINEAR A SIGN AB022F +10614 ; [.46CE.0020.0002] # LINEAR A SIGN AB022M +10615 ; [.46CF.0020.0002] # LINEAR A SIGN AB023 +10616 ; [.46D0.0020.0002] # LINEAR A SIGN AB023M +10617 ; [.46D1.0020.0002] # LINEAR A SIGN AB024 +10618 ; [.46D2.0020.0002] # LINEAR A SIGN AB026 +10619 ; [.46D3.0020.0002] # LINEAR A SIGN AB027 +1061A ; [.46D4.0020.0002] # LINEAR A SIGN AB028 +1061B ; [.46D5.0020.0002] # LINEAR A SIGN A028B +1061C ; [.46D6.0020.0002] # LINEAR A SIGN AB029 +1061D ; [.46D7.0020.0002] # LINEAR A SIGN AB030 +1061E ; [.46D8.0020.0002] # LINEAR A SIGN AB031 +1061F ; [.46D9.0020.0002] # LINEAR A SIGN AB034 +10620 ; [.46DA.0020.0002] # LINEAR A SIGN AB037 +10621 ; [.46DB.0020.0002] # LINEAR A SIGN AB038 +10622 ; [.46DC.0020.0002] # LINEAR A SIGN AB039 +10623 ; [.46DD.0020.0002] # LINEAR A SIGN AB040 +10624 ; [.46DE.0020.0002] # LINEAR A SIGN AB041 +10625 ; [.46DF.0020.0002] # LINEAR A SIGN AB044 +10626 ; [.46E0.0020.0002] # LINEAR A SIGN AB045 +10627 ; [.46E1.0020.0002] # LINEAR A SIGN AB046 +10628 ; [.46E2.0020.0002] # LINEAR A SIGN AB047 +10629 ; [.46E3.0020.0002] # LINEAR A SIGN AB048 +1062A ; [.46E4.0020.0002] # LINEAR A SIGN AB049 +1062B ; [.46E5.0020.0002] # LINEAR A SIGN AB050 +1062C ; [.46E6.0020.0002] # LINEAR A SIGN AB051 +1062D ; [.46E7.0020.0002] # LINEAR A SIGN AB053 +1062E ; [.46E8.0020.0002] # LINEAR A SIGN AB054 +1062F ; [.46E9.0020.0002] # LINEAR A SIGN AB055 +10630 ; [.46EA.0020.0002] # LINEAR A SIGN AB056 +10631 ; [.46EB.0020.0002] # LINEAR A SIGN AB057 +10632 ; [.46EC.0020.0002] # LINEAR A SIGN AB058 +10633 ; [.46ED.0020.0002] # LINEAR A SIGN AB059 +10634 ; [.46EE.0020.0002] # LINEAR A SIGN AB060 +10635 ; [.46EF.0020.0002] # LINEAR A SIGN AB061 +10636 ; [.46F0.0020.0002] # LINEAR A SIGN AB065 +10637 ; [.46F1.0020.0002] # LINEAR A SIGN AB066 +10638 ; [.46F2.0020.0002] # LINEAR A SIGN AB067 +10639 ; [.46F3.0020.0002] # LINEAR A SIGN AB069 +1063A ; [.46F4.0020.0002] # LINEAR A SIGN AB070 +1063B ; [.46F5.0020.0002] # LINEAR A SIGN AB073 +1063C ; [.46F6.0020.0002] # LINEAR A SIGN AB074 +1063D ; [.46F7.0020.0002] # LINEAR A SIGN AB076 +1063E ; [.46F8.0020.0002] # LINEAR A SIGN AB077 +1063F ; [.46F9.0020.0002] # LINEAR A SIGN AB078 +10640 ; [.46FA.0020.0002] # LINEAR A SIGN AB079 +10641 ; [.46FB.0020.0002] # LINEAR A SIGN AB080 +10642 ; [.46FC.0020.0002] # LINEAR A SIGN AB081 +10643 ; [.46FD.0020.0002] # LINEAR A SIGN AB082 +10644 ; [.46FE.0020.0002] # LINEAR A SIGN AB085 +10645 ; [.46FF.0020.0002] # LINEAR A SIGN AB086 +10646 ; [.4700.0020.0002] # LINEAR A SIGN AB087 +10647 ; [.4701.0020.0002] # LINEAR A SIGN A100-102 +10648 ; [.4702.0020.0002] # LINEAR A SIGN AB118 +10649 ; [.4703.0020.0002] # LINEAR A SIGN AB120 +1064A ; [.4704.0020.0002] # LINEAR A SIGN A120B +1064B ; [.4705.0020.0002] # LINEAR A SIGN AB122 +1064C ; [.4706.0020.0002] # LINEAR A SIGN AB123 +1064D ; [.4707.0020.0002] # LINEAR A SIGN AB131A +1064E ; [.4708.0020.0002] # LINEAR A SIGN AB131B +1064F ; [.4709.0020.0002] # LINEAR A SIGN A131C +10650 ; [.470A.0020.0002] # LINEAR A SIGN AB164 +10651 ; [.470B.0020.0002] # LINEAR A SIGN AB171 +10652 ; [.470C.0020.0002] # LINEAR A SIGN AB180 +10653 ; [.470D.0020.0002] # LINEAR A SIGN AB188 +10654 ; [.470E.0020.0002] # LINEAR A SIGN AB191 +10655 ; [.470F.0020.0002] # LINEAR A SIGN A301 +10656 ; [.4710.0020.0002] # LINEAR A SIGN A302 +10657 ; [.4711.0020.0002] # LINEAR A SIGN A303 +10658 ; [.4712.0020.0002] # LINEAR A SIGN A304 +10659 ; [.4713.0020.0002] # LINEAR A SIGN A305 +1065A ; [.4714.0020.0002] # LINEAR A SIGN A306 +1065B ; [.4715.0020.0002] # LINEAR A SIGN A307 +1065C ; [.4716.0020.0002] # LINEAR A SIGN A308 +1065D ; [.4717.0020.0002] # LINEAR A SIGN A309A +1065E ; [.4718.0020.0002] # LINEAR A SIGN A309B +1065F ; [.4719.0020.0002] # LINEAR A SIGN A309C +10660 ; [.471A.0020.0002] # LINEAR A SIGN A310 +10661 ; [.471B.0020.0002] # LINEAR A SIGN A311 +10662 ; [.471C.0020.0002] # LINEAR A SIGN A312 +10663 ; [.471D.0020.0002] # LINEAR A SIGN A313A +10664 ; [.471E.0020.0002] # LINEAR A SIGN A313B +10665 ; [.471F.0020.0002] # LINEAR A SIGN A313C +10666 ; [.4720.0020.0002] # LINEAR A SIGN A314 +10667 ; [.4721.0020.0002] # LINEAR A SIGN A315 +10668 ; [.4722.0020.0002] # LINEAR A SIGN A316 +10669 ; [.4723.0020.0002] # LINEAR A SIGN A317 +1066A ; [.4724.0020.0002] # LINEAR A SIGN A318 +1066B ; [.4725.0020.0002] # LINEAR A SIGN A319 +1066C ; [.4726.0020.0002] # LINEAR A SIGN A320 +1066D ; [.4727.0020.0002] # LINEAR A SIGN A321 +1066E ; [.4728.0020.0002] # LINEAR A SIGN A322 +1066F ; [.4729.0020.0002] # LINEAR A SIGN A323 +10670 ; [.472A.0020.0002] # LINEAR A SIGN A324 +10671 ; [.472B.0020.0002] # LINEAR A SIGN A325 +10672 ; [.472C.0020.0002] # LINEAR A SIGN A326 +10673 ; [.472D.0020.0002] # LINEAR A SIGN A327 +10674 ; [.472E.0020.0002] # LINEAR A SIGN A328 +10675 ; [.472F.0020.0002] # LINEAR A SIGN A329 +10676 ; [.4730.0020.0002] # LINEAR A SIGN A330 +10677 ; [.4731.0020.0002] # LINEAR A SIGN A331 +10678 ; [.4732.0020.0002] # LINEAR A SIGN A332 +10679 ; [.4733.0020.0002] # LINEAR A SIGN A333 +1067A ; [.4734.0020.0002] # LINEAR A SIGN A334 +1067B ; [.4735.0020.0002] # LINEAR A SIGN A335 +1067C ; [.4736.0020.0002] # LINEAR A SIGN A336 +1067D ; [.4737.0020.0002] # LINEAR A SIGN A337 +1067E ; [.4738.0020.0002] # LINEAR A SIGN A338 +1067F ; [.4739.0020.0002] # LINEAR A SIGN A339 +10680 ; [.473A.0020.0002] # LINEAR A SIGN A340 +10681 ; [.473B.0020.0002] # LINEAR A SIGN A341 +10682 ; [.473C.0020.0002] # LINEAR A SIGN A342 +10683 ; [.473D.0020.0002] # LINEAR A SIGN A343 +10684 ; [.473E.0020.0002] # LINEAR A SIGN A344 +10685 ; [.473F.0020.0002] # LINEAR A SIGN A345 +10686 ; [.4740.0020.0002] # LINEAR A SIGN A346 +10687 ; [.4741.0020.0002] # LINEAR A SIGN A347 +10688 ; [.4742.0020.0002] # LINEAR A SIGN A348 +10689 ; [.4743.0020.0002] # LINEAR A SIGN A349 +1068A ; [.4744.0020.0002] # LINEAR A SIGN A350 +1068B ; [.4745.0020.0002] # LINEAR A SIGN A351 +1068C ; [.4746.0020.0002] # LINEAR A SIGN A352 +1068D ; [.4747.0020.0002] # LINEAR A SIGN A353 +1068E ; [.4748.0020.0002] # LINEAR A SIGN A354 +1068F ; [.4749.0020.0002] # LINEAR A SIGN A355 +10690 ; [.474A.0020.0002] # LINEAR A SIGN A356 +10691 ; [.474B.0020.0002] # LINEAR A SIGN A357 +10692 ; [.474C.0020.0002] # LINEAR A SIGN A358 +10693 ; [.474D.0020.0002] # LINEAR A SIGN A359 +10694 ; [.474E.0020.0002] # LINEAR A SIGN A360 +10695 ; [.474F.0020.0002] # LINEAR A SIGN A361 +10696 ; [.4750.0020.0002] # LINEAR A SIGN A362 +10697 ; [.4751.0020.0002] # LINEAR A SIGN A363 +10698 ; [.4752.0020.0002] # LINEAR A SIGN A364 +10699 ; [.4753.0020.0002] # LINEAR A SIGN A365 +1069A ; [.4754.0020.0002] # LINEAR A SIGN A366 +1069B ; [.4755.0020.0002] # LINEAR A SIGN A367 +1069C ; [.4756.0020.0002] # LINEAR A SIGN A368 +1069D ; [.4757.0020.0002] # LINEAR A SIGN A369 +1069E ; [.4758.0020.0002] # LINEAR A SIGN A370 +1069F ; [.4759.0020.0002] # LINEAR A SIGN A371 +106A0 ; [.475A.0020.0002] # LINEAR A SIGN A400-VAS +106A1 ; [.475B.0020.0002] # LINEAR A SIGN A401-VAS +106A2 ; [.475C.0020.0002] # LINEAR A SIGN A402-VAS +106A3 ; [.475D.0020.0002] # LINEAR A SIGN A403-VAS +106A4 ; [.475E.0020.0002] # LINEAR A SIGN A404-VAS +106A5 ; [.475F.0020.0002] # LINEAR A SIGN A405-VAS +106A6 ; [.4760.0020.0002] # LINEAR A SIGN A406-VAS +106A7 ; [.4761.0020.0002] # LINEAR A SIGN A407-VAS +106A8 ; [.4762.0020.0002] # LINEAR A SIGN A408-VAS +106A9 ; [.4763.0020.0002] # LINEAR A SIGN A409-VAS +106AA ; [.4764.0020.0002] # LINEAR A SIGN A410-VAS +106AB ; [.4765.0020.0002] # LINEAR A SIGN A411-VAS +106AC ; [.4766.0020.0002] # LINEAR A SIGN A412-VAS +106AD ; [.4767.0020.0002] # LINEAR A SIGN A413-VAS +106AE ; [.4768.0020.0002] # LINEAR A SIGN A414-VAS +106AF ; [.4769.0020.0002] # LINEAR A SIGN A415-VAS +106B0 ; [.476A.0020.0002] # LINEAR A SIGN A416-VAS +106B1 ; [.476B.0020.0002] # LINEAR A SIGN A417-VAS +106B2 ; [.476C.0020.0002] # LINEAR A SIGN A418-VAS +106B3 ; [.476D.0020.0002] # LINEAR A SIGN A501 +106B4 ; [.476E.0020.0002] # LINEAR A SIGN A502 +106B5 ; [.476F.0020.0002] # LINEAR A SIGN A503 +106B6 ; [.4770.0020.0002] # LINEAR A SIGN A504 +106B7 ; [.4771.0020.0002] # LINEAR A SIGN A505 +106B8 ; [.4772.0020.0002] # LINEAR A SIGN A506 +106B9 ; [.4773.0020.0002] # LINEAR A SIGN A508 +106BA ; [.4774.0020.0002] # LINEAR A SIGN A509 +106BB ; [.4775.0020.0002] # LINEAR A SIGN A510 +106BC ; [.4776.0020.0002] # LINEAR A SIGN A511 +106BD ; [.4777.0020.0002] # LINEAR A SIGN A512 +106BE ; [.4778.0020.0002] # LINEAR A SIGN A513 +106BF ; [.4779.0020.0002] # LINEAR A SIGN A515 +106C0 ; [.477A.0020.0002] # LINEAR A SIGN A516 +106C1 ; [.477B.0020.0002] # LINEAR A SIGN A520 +106C2 ; [.477C.0020.0002] # LINEAR A SIGN A521 +106C3 ; [.477D.0020.0002] # LINEAR A SIGN A523 +106C4 ; [.477E.0020.0002] # LINEAR A SIGN A524 +106C5 ; [.477F.0020.0002] # LINEAR A SIGN A525 +106C6 ; [.4780.0020.0002] # LINEAR A SIGN A526 +106C7 ; [.4781.0020.0002] # LINEAR A SIGN A527 +106C8 ; [.4782.0020.0002] # LINEAR A SIGN A528 +106C9 ; [.4783.0020.0002] # LINEAR A SIGN A529 +106CA ; [.4784.0020.0002] # LINEAR A SIGN A530 +106CB ; [.4785.0020.0002] # LINEAR A SIGN A531 +106CC ; [.4786.0020.0002] # LINEAR A SIGN A532 +106CD ; [.4787.0020.0002] # LINEAR A SIGN A534 +106CE ; [.4788.0020.0002] # LINEAR A SIGN A535 +106CF ; [.4789.0020.0002] # LINEAR A SIGN A536 +106D0 ; [.478A.0020.0002] # LINEAR A SIGN A537 +106D1 ; [.478B.0020.0002] # LINEAR A SIGN A538 +106D2 ; [.478C.0020.0002] # LINEAR A SIGN A539 +106D3 ; [.478D.0020.0002] # LINEAR A SIGN A540 +106D4 ; [.478E.0020.0002] # LINEAR A SIGN A541 +106D5 ; [.478F.0020.0002] # LINEAR A SIGN A542 +106D6 ; [.4790.0020.0002] # LINEAR A SIGN A545 +106D7 ; [.4791.0020.0002] # LINEAR A SIGN A547 +106D8 ; [.4792.0020.0002] # LINEAR A SIGN A548 +106D9 ; [.4793.0020.0002] # LINEAR A SIGN A549 +106DA ; [.4794.0020.0002] # LINEAR A SIGN A550 +106DB ; [.4795.0020.0002] # LINEAR A SIGN A551 +106DC ; [.4796.0020.0002] # LINEAR A SIGN A552 +106DD ; [.4797.0020.0002] # LINEAR A SIGN A553 +106DE ; [.4798.0020.0002] # LINEAR A SIGN A554 +106DF ; [.4799.0020.0002] # LINEAR A SIGN A555 +106E0 ; [.479A.0020.0002] # LINEAR A SIGN A556 +106E1 ; [.479B.0020.0002] # LINEAR A SIGN A557 +106E2 ; [.479C.0020.0002] # LINEAR A SIGN A559 +106E3 ; [.479D.0020.0002] # LINEAR A SIGN A563 +106E4 ; [.479E.0020.0002] # LINEAR A SIGN A564 +106E5 ; [.479F.0020.0002] # LINEAR A SIGN A565 +106E6 ; [.47A0.0020.0002] # LINEAR A SIGN A566 +106E7 ; [.47A1.0020.0002] # LINEAR A SIGN A568 +106E8 ; [.47A2.0020.0002] # LINEAR A SIGN A569 +106E9 ; [.47A3.0020.0002] # LINEAR A SIGN A570 +106EA ; [.47A4.0020.0002] # LINEAR A SIGN A571 +106EB ; [.47A5.0020.0002] # LINEAR A SIGN A572 +106EC ; [.47A6.0020.0002] # LINEAR A SIGN A573 +106ED ; [.47A7.0020.0002] # LINEAR A SIGN A574 +106EE ; [.47A8.0020.0002] # LINEAR A SIGN A575 +106EF ; [.47A9.0020.0002] # LINEAR A SIGN A576 +106F0 ; [.47AA.0020.0002] # LINEAR A SIGN A577 +106F1 ; [.47AB.0020.0002] # LINEAR A SIGN A578 +106F2 ; [.47AC.0020.0002] # LINEAR A SIGN A579 +106F3 ; [.47AD.0020.0002] # LINEAR A SIGN A580 +106F4 ; [.47AE.0020.0002] # LINEAR A SIGN A581 +106F5 ; [.47AF.0020.0002] # LINEAR A SIGN A582 +106F6 ; [.47B0.0020.0002] # LINEAR A SIGN A583 +106F7 ; [.47B1.0020.0002] # LINEAR A SIGN A584 +106F8 ; [.47B2.0020.0002] # LINEAR A SIGN A585 +106F9 ; [.47B3.0020.0002] # LINEAR A SIGN A586 +106FA ; [.47B4.0020.0002] # LINEAR A SIGN A587 +106FB ; [.47B5.0020.0002] # LINEAR A SIGN A588 +106FC ; [.47B6.0020.0002] # LINEAR A SIGN A589 +106FD ; [.47B7.0020.0002] # LINEAR A SIGN A591 +106FE ; [.47B8.0020.0002] # LINEAR A SIGN A592 +106FF ; [.47B9.0020.0002] # LINEAR A SIGN A594 +10700 ; [.47BA.0020.0002] # LINEAR A SIGN A595 +10701 ; [.47BB.0020.0002] # LINEAR A SIGN A596 +10702 ; [.47BC.0020.0002] # LINEAR A SIGN A598 +10703 ; [.47BD.0020.0002] # LINEAR A SIGN A600 +10704 ; [.47BE.0020.0002] # LINEAR A SIGN A601 +10705 ; [.47BF.0020.0002] # LINEAR A SIGN A602 +10706 ; [.47C0.0020.0002] # LINEAR A SIGN A603 +10707 ; [.47C1.0020.0002] # LINEAR A SIGN A604 +10708 ; [.47C2.0020.0002] # LINEAR A SIGN A606 +10709 ; [.47C3.0020.0002] # LINEAR A SIGN A608 +1070A ; [.47C4.0020.0002] # LINEAR A SIGN A609 +1070B ; [.47C5.0020.0002] # LINEAR A SIGN A610 +1070C ; [.47C6.0020.0002] # LINEAR A SIGN A611 +1070D ; [.47C7.0020.0002] # LINEAR A SIGN A612 +1070E ; [.47C8.0020.0002] # LINEAR A SIGN A613 +1070F ; [.47C9.0020.0002] # LINEAR A SIGN A614 +10710 ; [.47CA.0020.0002] # LINEAR A SIGN A615 +10711 ; [.47CB.0020.0002] # LINEAR A SIGN A616 +10712 ; [.47CC.0020.0002] # LINEAR A SIGN A617 +10713 ; [.47CD.0020.0002] # LINEAR A SIGN A618 +10714 ; [.47CE.0020.0002] # LINEAR A SIGN A619 +10715 ; [.47CF.0020.0002] # LINEAR A SIGN A620 +10716 ; [.47D0.0020.0002] # LINEAR A SIGN A621 +10717 ; [.47D1.0020.0002] # LINEAR A SIGN A622 +10718 ; [.47D2.0020.0002] # LINEAR A SIGN A623 +10719 ; [.47D3.0020.0002] # LINEAR A SIGN A624 +1071A ; [.47D4.0020.0002] # LINEAR A SIGN A626 +1071B ; [.47D5.0020.0002] # LINEAR A SIGN A627 +1071C ; [.47D6.0020.0002] # LINEAR A SIGN A628 +1071D ; [.47D7.0020.0002] # LINEAR A SIGN A629 +1071E ; [.47D8.0020.0002] # LINEAR A SIGN A634 +1071F ; [.47D9.0020.0002] # LINEAR A SIGN A637 +10720 ; [.47DA.0020.0002] # LINEAR A SIGN A638 +10721 ; [.47DB.0020.0002] # LINEAR A SIGN A640 +10722 ; [.47DC.0020.0002] # LINEAR A SIGN A642 +10723 ; [.47DD.0020.0002] # LINEAR A SIGN A643 +10724 ; [.47DE.0020.0002] # LINEAR A SIGN A644 +10725 ; [.47DF.0020.0002] # LINEAR A SIGN A645 +10726 ; [.47E0.0020.0002] # LINEAR A SIGN A646 +10727 ; [.47E1.0020.0002] # LINEAR A SIGN A648 +10728 ; [.47E2.0020.0002] # LINEAR A SIGN A649 +10729 ; [.47E3.0020.0002] # LINEAR A SIGN A651 +1072A ; [.47E4.0020.0002] # LINEAR A SIGN A652 +1072B ; [.47E5.0020.0002] # LINEAR A SIGN A653 +1072C ; [.47E6.0020.0002] # LINEAR A SIGN A654 +1072D ; [.47E7.0020.0002] # LINEAR A SIGN A655 +1072E ; [.47E8.0020.0002] # LINEAR A SIGN A656 +1072F ; [.47E9.0020.0002] # LINEAR A SIGN A657 +10730 ; [.47EA.0020.0002] # LINEAR A SIGN A658 +10731 ; [.47EB.0020.0002] # LINEAR A SIGN A659 +10732 ; [.47EC.0020.0002] # LINEAR A SIGN A660 +10733 ; [.47ED.0020.0002] # LINEAR A SIGN A661 +10734 ; [.47EE.0020.0002] # LINEAR A SIGN A662 +10735 ; [.47EF.0020.0002] # LINEAR A SIGN A663 +10736 ; [.47F0.0020.0002] # LINEAR A SIGN A664 +10740 ; [.47F1.0020.0002] # LINEAR A SIGN A701 A +10741 ; [.47F2.0020.0002] # LINEAR A SIGN A702 B +10742 ; [.47F3.0020.0002] # LINEAR A SIGN A703 D +10743 ; [.47F4.0020.0002] # LINEAR A SIGN A704 E +10744 ; [.47F5.0020.0002] # LINEAR A SIGN A705 F +10745 ; [.47F6.0020.0002] # LINEAR A SIGN A706 H +10746 ; [.47F7.0020.0002] # LINEAR A SIGN A707 J +10747 ; [.47F8.0020.0002] # LINEAR A SIGN A708 K +10748 ; [.47F9.0020.0002] # LINEAR A SIGN A709 L +10749 ; [.47FA.0020.0002] # LINEAR A SIGN A709-2 L2 +1074A ; [.47FB.0020.0002] # LINEAR A SIGN A709-3 L3 +1074B ; [.47FC.0020.0002] # LINEAR A SIGN A709-4 L4 +1074C ; [.47FD.0020.0002] # LINEAR A SIGN A709-6 L6 +1074D ; [.47FE.0020.0002] # LINEAR A SIGN A710 W +1074E ; [.47FF.0020.0002] # LINEAR A SIGN A711 X +1074F ; [.4800.0020.0002] # LINEAR A SIGN A712 Y +10750 ; [.4801.0020.0002] # LINEAR A SIGN A713 OMEGA +10751 ; [.4802.0020.0002] # LINEAR A SIGN A714 ABB +10752 ; [.4803.0020.0002] # LINEAR A SIGN A715 BB +10753 ; [.4804.0020.0002] # LINEAR A SIGN A717 DD +10754 ; [.4805.0020.0002] # LINEAR A SIGN A726 EYYY +10755 ; [.4806.0020.0002] # LINEAR A SIGN A732 JE +10760 ; [.4807.0020.0002] # LINEAR A SIGN A800 +10761 ; [.4808.0020.0002] # LINEAR A SIGN A801 +10762 ; [.4809.0020.0002] # LINEAR A SIGN A802 +10763 ; [.480A.0020.0002] # LINEAR A SIGN A803 +10764 ; [.480B.0020.0002] # LINEAR A SIGN A804 +10765 ; [.480C.0020.0002] # LINEAR A SIGN A805 +10766 ; [.480D.0020.0002] # LINEAR A SIGN A806 +10767 ; [.480E.0020.0002] # LINEAR A SIGN A807 +10800 ; [.480F.0020.0002] # CYPRIOT SYLLABLE A +10801 ; [.4810.0020.0002] # CYPRIOT SYLLABLE E +10802 ; [.4811.0020.0002] # CYPRIOT SYLLABLE I +10803 ; [.4812.0020.0002] # CYPRIOT SYLLABLE O +10804 ; [.4813.0020.0002] # CYPRIOT SYLLABLE U +10805 ; [.4814.0020.0002] # CYPRIOT SYLLABLE JA +10808 ; [.4815.0020.0002] # CYPRIOT SYLLABLE JO +1080A ; [.4816.0020.0002] # CYPRIOT SYLLABLE KA +1080B ; [.4817.0020.0002] # CYPRIOT SYLLABLE KE +1080C ; [.4818.0020.0002] # CYPRIOT SYLLABLE KI +1080D ; [.4819.0020.0002] # CYPRIOT SYLLABLE KO +1080E ; [.481A.0020.0002] # CYPRIOT SYLLABLE KU +1080F ; [.481B.0020.0002] # CYPRIOT SYLLABLE LA +10810 ; [.481C.0020.0002] # CYPRIOT SYLLABLE LE +10811 ; [.481D.0020.0002] # CYPRIOT SYLLABLE LI +10812 ; [.481E.0020.0002] # CYPRIOT SYLLABLE LO +10813 ; [.481F.0020.0002] # CYPRIOT SYLLABLE LU +10814 ; [.4820.0020.0002] # CYPRIOT SYLLABLE MA +10815 ; [.4821.0020.0002] # CYPRIOT SYLLABLE ME +10816 ; [.4822.0020.0002] # CYPRIOT SYLLABLE MI +10817 ; [.4823.0020.0002] # CYPRIOT SYLLABLE MO +10818 ; [.4824.0020.0002] # CYPRIOT SYLLABLE MU +10819 ; [.4825.0020.0002] # CYPRIOT SYLLABLE NA +1081A ; [.4826.0020.0002] # CYPRIOT SYLLABLE NE +1081B ; [.4827.0020.0002] # CYPRIOT SYLLABLE NI +1081C ; [.4828.0020.0002] # CYPRIOT SYLLABLE NO +1081D ; [.4829.0020.0002] # CYPRIOT SYLLABLE NU +1081E ; [.482A.0020.0002] # CYPRIOT SYLLABLE PA +1081F ; [.482B.0020.0002] # CYPRIOT SYLLABLE PE +10820 ; [.482C.0020.0002] # CYPRIOT SYLLABLE PI +10821 ; [.482D.0020.0002] # CYPRIOT SYLLABLE PO +10822 ; [.482E.0020.0002] # CYPRIOT SYLLABLE PU +10823 ; [.482F.0020.0002] # CYPRIOT SYLLABLE RA +10824 ; [.4830.0020.0002] # CYPRIOT SYLLABLE RE +10825 ; [.4831.0020.0002] # CYPRIOT SYLLABLE RI +10826 ; [.4832.0020.0002] # CYPRIOT SYLLABLE RO +10827 ; [.4833.0020.0002] # CYPRIOT SYLLABLE RU +10828 ; [.4834.0020.0002] # CYPRIOT SYLLABLE SA +10829 ; [.4835.0020.0002] # CYPRIOT SYLLABLE SE +1082A ; [.4836.0020.0002] # CYPRIOT SYLLABLE SI +1082B ; [.4837.0020.0002] # CYPRIOT SYLLABLE SO +1082C ; [.4838.0020.0002] # CYPRIOT SYLLABLE SU +1082D ; [.4839.0020.0002] # CYPRIOT SYLLABLE TA +1082E ; [.483A.0020.0002] # CYPRIOT SYLLABLE TE +1082F ; [.483B.0020.0002] # CYPRIOT SYLLABLE TI +10830 ; [.483C.0020.0002] # CYPRIOT SYLLABLE TO +10831 ; [.483D.0020.0002] # CYPRIOT SYLLABLE TU +10832 ; [.483E.0020.0002] # CYPRIOT SYLLABLE WA +10833 ; [.483F.0020.0002] # CYPRIOT SYLLABLE WE +10834 ; [.4840.0020.0002] # CYPRIOT SYLLABLE WI +10835 ; [.4841.0020.0002] # CYPRIOT SYLLABLE WO +10837 ; [.4842.0020.0002] # CYPRIOT SYLLABLE XA +10838 ; [.4843.0020.0002] # CYPRIOT SYLLABLE XE +1083C ; [.4844.0020.0002] # CYPRIOT SYLLABLE ZA +1083F ; [.4845.0020.0002] # CYPRIOT SYLLABLE ZO +10A60 ; [.4846.0020.0002] # OLD SOUTH ARABIAN LETTER HE +10A61 ; [.4847.0020.0002] # OLD SOUTH ARABIAN LETTER LAMEDH +10A62 ; [.4848.0020.0002] # OLD SOUTH ARABIAN LETTER HETH +10A63 ; [.4849.0020.0002] # OLD SOUTH ARABIAN LETTER MEM +10A64 ; [.484A.0020.0002] # OLD SOUTH ARABIAN LETTER QOPH +10A65 ; [.484B.0020.0002] # OLD SOUTH ARABIAN LETTER WAW +10A66 ; [.484C.0020.0002] # OLD SOUTH ARABIAN LETTER SHIN +10A67 ; [.484D.0020.0002] # OLD SOUTH ARABIAN LETTER RESH +10A68 ; [.484E.0020.0002] # OLD SOUTH ARABIAN LETTER BETH +10A69 ; [.484F.0020.0002] # OLD SOUTH ARABIAN LETTER TAW +10A6A ; [.4850.0020.0002] # OLD SOUTH ARABIAN LETTER SAT +10A6B ; [.4851.0020.0002] # OLD SOUTH ARABIAN LETTER KAPH +10A6C ; [.4852.0020.0002] # OLD SOUTH ARABIAN LETTER NUN +10A6D ; [.4853.0020.0002] # OLD SOUTH ARABIAN LETTER KHETH +10A6E ; [.4854.0020.0002] # OLD SOUTH ARABIAN LETTER SADHE +10A6F ; [.4855.0020.0002] # OLD SOUTH ARABIAN LETTER SAMEKH +10A70 ; [.4856.0020.0002] # OLD SOUTH ARABIAN LETTER FE +10A71 ; [.4857.0020.0002] # OLD SOUTH ARABIAN LETTER ALEF +10A72 ; [.4858.0020.0002] # OLD SOUTH ARABIAN LETTER AYN +10A73 ; [.4859.0020.0002] # OLD SOUTH ARABIAN LETTER DHADHE +10A74 ; [.485A.0020.0002] # OLD SOUTH ARABIAN LETTER GIMEL +10A75 ; [.485B.0020.0002] # OLD SOUTH ARABIAN LETTER DALETH +10A76 ; [.485C.0020.0002] # OLD SOUTH ARABIAN LETTER GHAYN +10A77 ; [.485D.0020.0002] # OLD SOUTH ARABIAN LETTER TETH +10A78 ; [.485E.0020.0002] # OLD SOUTH ARABIAN LETTER ZAYN +10A79 ; [.485F.0020.0002] # OLD SOUTH ARABIAN LETTER DHALETH +10A7A ; [.4860.0020.0002] # OLD SOUTH ARABIAN LETTER YODH +10A7B ; [.4861.0020.0002] # OLD SOUTH ARABIAN LETTER THAW +10A7C ; [.4862.0020.0002] # OLD SOUTH ARABIAN LETTER THETH +10A80 ; [.4863.0020.0002] # OLD NORTH ARABIAN LETTER HEH +10A81 ; [.4864.0020.0002] # OLD NORTH ARABIAN LETTER LAM +10A82 ; [.4865.0020.0002] # OLD NORTH ARABIAN LETTER HAH +10A83 ; [.4866.0020.0002] # OLD NORTH ARABIAN LETTER MEEM +10A84 ; [.4867.0020.0002] # OLD NORTH ARABIAN LETTER QAF +10A85 ; [.4868.0020.0002] # OLD NORTH ARABIAN LETTER WAW +10A86 ; [.4869.0020.0002] # OLD NORTH ARABIAN LETTER ES-2 +10A87 ; [.486A.0020.0002] # OLD NORTH ARABIAN LETTER REH +10A88 ; [.486B.0020.0002] # OLD NORTH ARABIAN LETTER BEH +10A89 ; [.486C.0020.0002] # OLD NORTH ARABIAN LETTER TEH +10A8A ; [.486D.0020.0002] # OLD NORTH ARABIAN LETTER ES-1 +10A8B ; [.486E.0020.0002] # OLD NORTH ARABIAN LETTER KAF +10A8C ; [.486F.0020.0002] # OLD NORTH ARABIAN LETTER NOON +10A8D ; [.4870.0020.0002] # OLD NORTH ARABIAN LETTER KHAH +10A8E ; [.4871.0020.0002] # OLD NORTH ARABIAN LETTER SAD +10A8F ; [.4872.0020.0002] # OLD NORTH ARABIAN LETTER ES-3 +10A90 ; [.4873.0020.0002] # OLD NORTH ARABIAN LETTER FEH +10A91 ; [.4874.0020.0002] # OLD NORTH ARABIAN LETTER ALEF +10A92 ; [.4875.0020.0002] # OLD NORTH ARABIAN LETTER AIN +10A93 ; [.4876.0020.0002] # OLD NORTH ARABIAN LETTER DAD +10A94 ; [.4877.0020.0002] # OLD NORTH ARABIAN LETTER GEEM +10A95 ; [.4878.0020.0002] # OLD NORTH ARABIAN LETTER DAL +10A96 ; [.4879.0020.0002] # OLD NORTH ARABIAN LETTER GHAIN +10A97 ; [.487A.0020.0002] # OLD NORTH ARABIAN LETTER TAH +10A98 ; [.487B.0020.0002] # OLD NORTH ARABIAN LETTER ZAIN +10A99 ; [.487C.0020.0002] # OLD NORTH ARABIAN LETTER THAL +10A9A ; [.487D.0020.0002] # OLD NORTH ARABIAN LETTER YEH +10A9B ; [.487E.0020.0002] # OLD NORTH ARABIAN LETTER THEH +10A9C ; [.487F.0020.0002] # OLD NORTH ARABIAN LETTER ZAH +10B00 ; [.4880.0020.0002] # AVESTAN LETTER A +10B01 ; [.4881.0020.0002] # AVESTAN LETTER AA +10B02 ; [.4882.0020.0002] # AVESTAN LETTER AO +10B03 ; [.4883.0020.0002] # AVESTAN LETTER AAO +10B04 ; [.4884.0020.0002] # AVESTAN LETTER AN +10B05 ; [.4885.0020.0002] # AVESTAN LETTER AAN +10B06 ; [.4886.0020.0002] # AVESTAN LETTER AE +10B07 ; [.4887.0020.0002] # AVESTAN LETTER AEE +10B08 ; [.4888.0020.0002] # AVESTAN LETTER E +10B09 ; [.4889.0020.0002] # AVESTAN LETTER EE +10B0A ; [.488A.0020.0002] # AVESTAN LETTER O +10B0B ; [.488B.0020.0002] # AVESTAN LETTER OO +10B0C ; [.488C.0020.0002] # AVESTAN LETTER I +10B0D ; [.488D.0020.0002] # AVESTAN LETTER II +10B0E ; [.488E.0020.0002] # AVESTAN LETTER U +10B0F ; [.488F.0020.0002] # AVESTAN LETTER UU +10B10 ; [.4890.0020.0002] # AVESTAN LETTER KE +10B11 ; [.4891.0020.0002] # AVESTAN LETTER XE +10B12 ; [.4892.0020.0002] # AVESTAN LETTER XYE +10B13 ; [.4893.0020.0002] # AVESTAN LETTER XVE +10B14 ; [.4894.0020.0002] # AVESTAN LETTER GE +10B15 ; [.4895.0020.0002] # AVESTAN LETTER GGE +10B16 ; [.4896.0020.0002] # AVESTAN LETTER GHE +10B17 ; [.4897.0020.0002] # AVESTAN LETTER CE +10B18 ; [.4898.0020.0002] # AVESTAN LETTER JE +10B19 ; [.4899.0020.0002] # AVESTAN LETTER TE +10B1A ; [.489A.0020.0002] # AVESTAN LETTER THE +10B1B ; [.489B.0020.0002] # AVESTAN LETTER DE +10B1C ; [.489C.0020.0002] # AVESTAN LETTER DHE +10B1D ; [.489D.0020.0002] # AVESTAN LETTER TTE +10B1E ; [.489E.0020.0002] # AVESTAN LETTER PE +10B1F ; [.489F.0020.0002] # AVESTAN LETTER FE +10B20 ; [.48A0.0020.0002] # AVESTAN LETTER BE +10B21 ; [.48A1.0020.0002] # AVESTAN LETTER BHE +10B22 ; [.48A2.0020.0002] # AVESTAN LETTER NGE +10B23 ; [.48A3.0020.0002] # AVESTAN LETTER NGYE +10B24 ; [.48A4.0020.0002] # AVESTAN LETTER NGVE +10B25 ; [.48A5.0020.0002] # AVESTAN LETTER NE +10B26 ; [.48A6.0020.0002] # AVESTAN LETTER NYE +10B27 ; [.48A7.0020.0002] # AVESTAN LETTER NNE +10B28 ; [.48A8.0020.0002] # AVESTAN LETTER ME +10B29 ; [.48A9.0020.0002] # AVESTAN LETTER HME +10B2A ; [.48AA.0020.0002] # AVESTAN LETTER YYE +10B2B ; [.48AB.0020.0002] # AVESTAN LETTER YE +10B2C ; [.48AC.0020.0002] # AVESTAN LETTER VE +10B2D ; [.48AD.0020.0002] # AVESTAN LETTER RE +10B2E ; [.48AD.0020.0004][.0000.0110.0004] # AVESTAN LETTER LE +10B2F ; [.48AE.0020.0002] # AVESTAN LETTER SE +10B30 ; [.48AF.0020.0002] # AVESTAN LETTER ZE +10B31 ; [.48B0.0020.0002] # AVESTAN LETTER SHE +10B32 ; [.48B1.0020.0002] # AVESTAN LETTER ZHE +10B33 ; [.48B2.0020.0002] # AVESTAN LETTER SHYE +10B34 ; [.48B3.0020.0002] # AVESTAN LETTER SSHE +10B35 ; [.48B4.0020.0002] # AVESTAN LETTER HE +10860 ; [.48B5.0020.0002] # PALMYRENE LETTER ALEPH +10861 ; [.48B6.0020.0002] # PALMYRENE LETTER BETH +10862 ; [.48B7.0020.0002] # PALMYRENE LETTER GIMEL +10863 ; [.48B8.0020.0002] # PALMYRENE LETTER DALETH +10864 ; [.48B9.0020.0002] # PALMYRENE LETTER HE +10865 ; [.48BA.0020.0002] # PALMYRENE LETTER WAW +10866 ; [.48BB.0020.0002] # PALMYRENE LETTER ZAYIN +10867 ; [.48BC.0020.0002] # PALMYRENE LETTER HETH +10868 ; [.48BD.0020.0002] # PALMYRENE LETTER TETH +10869 ; [.48BE.0020.0002] # PALMYRENE LETTER YODH +1086A ; [.48BF.0020.0002] # PALMYRENE LETTER KAPH +1086B ; [.48C0.0020.0002] # PALMYRENE LETTER LAMEDH +1086C ; [.48C1.0020.0002] # PALMYRENE LETTER MEM +1086E ; [.48C2.0020.0002] # PALMYRENE LETTER NUN +1086D ; [.48C2.0020.0019] # PALMYRENE LETTER FINAL NUN +1086F ; [.48C3.0020.0002] # PALMYRENE LETTER SAMEKH +10870 ; [.48C4.0020.0002] # PALMYRENE LETTER AYIN +10871 ; [.48C5.0020.0002] # PALMYRENE LETTER PE +10872 ; [.48C6.0020.0002] # PALMYRENE LETTER SADHE +10873 ; [.48C7.0020.0002] # PALMYRENE LETTER QOPH +10874 ; [.48C8.0020.0002] # PALMYRENE LETTER RESH +10875 ; [.48C9.0020.0002] # PALMYRENE LETTER SHIN +10876 ; [.48CA.0020.0002] # PALMYRENE LETTER TAW +10881 ; [.48CB.0020.0002] # NABATAEAN LETTER ALEPH +10880 ; [.48CB.0020.0019] # NABATAEAN LETTER FINAL ALEPH +10883 ; [.48CC.0020.0002] # NABATAEAN LETTER BETH +10882 ; [.48CC.0020.0019] # NABATAEAN LETTER FINAL BETH +10884 ; [.48CD.0020.0002] # NABATAEAN LETTER GIMEL +10885 ; [.48CE.0020.0002] # NABATAEAN LETTER DALETH +10887 ; [.48CF.0020.0002] # NABATAEAN LETTER HE +10886 ; [.48CF.0020.0019] # NABATAEAN LETTER FINAL HE +10888 ; [.48D0.0020.0002] # NABATAEAN LETTER WAW +10889 ; [.48D1.0020.0002] # NABATAEAN LETTER ZAYIN +1088A ; [.48D2.0020.0002] # NABATAEAN LETTER HETH +1088B ; [.48D3.0020.0002] # NABATAEAN LETTER TETH +1088D ; [.48D4.0020.0002] # NABATAEAN LETTER YODH +1088C ; [.48D4.0020.0019] # NABATAEAN LETTER FINAL YODH +1088F ; [.48D5.0020.0002] # NABATAEAN LETTER KAPH +1088E ; [.48D5.0020.0019] # NABATAEAN LETTER FINAL KAPH +10891 ; [.48D6.0020.0002] # NABATAEAN LETTER LAMEDH +10890 ; [.48D6.0020.0019] # NABATAEAN LETTER FINAL LAMEDH +10893 ; [.48D7.0020.0002] # NABATAEAN LETTER MEM +10892 ; [.48D7.0020.0019] # NABATAEAN LETTER FINAL MEM +10895 ; [.48D8.0020.0002] # NABATAEAN LETTER NUN +10894 ; [.48D8.0020.0019] # NABATAEAN LETTER FINAL NUN +10896 ; [.48D9.0020.0002] # NABATAEAN LETTER SAMEKH +10897 ; [.48DA.0020.0002] # NABATAEAN LETTER AYIN +10898 ; [.48DB.0020.0002] # NABATAEAN LETTER PE +10899 ; [.48DC.0020.0002] # NABATAEAN LETTER SADHE +1089A ; [.48DD.0020.0002] # NABATAEAN LETTER QOPH +1089B ; [.48DE.0020.0002] # NABATAEAN LETTER RESH +1089D ; [.48DF.0020.0002] # NABATAEAN LETTER SHIN +1089C ; [.48DF.0020.0019] # NABATAEAN LETTER FINAL SHIN +1089E ; [.48E0.0020.0002] # NABATAEAN LETTER TAW +108E0 ; [.48E1.0020.0002] # HATRAN LETTER ALEPH +108E1 ; [.48E2.0020.0002] # HATRAN LETTER BETH +108E2 ; [.48E3.0020.0002] # HATRAN LETTER GIMEL +108E3 ; [.48E4.0020.0002] # HATRAN LETTER DALETH-RESH +108E4 ; [.48E5.0020.0002] # HATRAN LETTER HE +108E5 ; [.48E6.0020.0002] # HATRAN LETTER WAW +108E6 ; [.48E7.0020.0002] # HATRAN LETTER ZAYN +108E7 ; [.48E8.0020.0002] # HATRAN LETTER HETH +108E8 ; [.48E9.0020.0002] # HATRAN LETTER TETH +108E9 ; [.48EA.0020.0002] # HATRAN LETTER YODH +108EA ; [.48EB.0020.0002] # HATRAN LETTER KAPH +108EB ; [.48EC.0020.0002] # HATRAN LETTER LAMEDH +108EC ; [.48ED.0020.0002] # HATRAN LETTER MEM +108ED ; [.48EE.0020.0002] # HATRAN LETTER NUN +108EE ; [.48EF.0020.0002] # HATRAN LETTER SAMEKH +108EF ; [.48F0.0020.0002] # HATRAN LETTER AYN +108F0 ; [.48F1.0020.0002] # HATRAN LETTER PE +108F1 ; [.48F2.0020.0002] # HATRAN LETTER SADHE +108F2 ; [.48F3.0020.0002] # HATRAN LETTER QOPH +108F4 ; [.48F4.0020.0002] # HATRAN LETTER SHIN +108F5 ; [.48F5.0020.0002] # HATRAN LETTER TAW +10840 ; [.48F6.0020.0002] # IMPERIAL ARAMAIC LETTER ALEPH +10841 ; [.48F7.0020.0002] # IMPERIAL ARAMAIC LETTER BETH +10842 ; [.48F8.0020.0002] # IMPERIAL ARAMAIC LETTER GIMEL +10843 ; [.48F9.0020.0002] # IMPERIAL ARAMAIC LETTER DALETH +10844 ; [.48FA.0020.0002] # IMPERIAL ARAMAIC LETTER HE +10845 ; [.48FB.0020.0002] # IMPERIAL ARAMAIC LETTER WAW +10846 ; [.48FC.0020.0002] # IMPERIAL ARAMAIC LETTER ZAYIN +10847 ; [.48FD.0020.0002] # IMPERIAL ARAMAIC LETTER HETH +10848 ; [.48FE.0020.0002] # IMPERIAL ARAMAIC LETTER TETH +10849 ; [.48FF.0020.0002] # IMPERIAL ARAMAIC LETTER YODH +1084A ; [.4900.0020.0002] # IMPERIAL ARAMAIC LETTER KAPH +1084B ; [.4901.0020.0002] # IMPERIAL ARAMAIC LETTER LAMEDH +1084C ; [.4902.0020.0002] # IMPERIAL ARAMAIC LETTER MEM +1084D ; [.4903.0020.0002] # IMPERIAL ARAMAIC LETTER NUN +1084E ; [.4904.0020.0002] # IMPERIAL ARAMAIC LETTER SAMEKH +1084F ; [.4905.0020.0002] # IMPERIAL ARAMAIC LETTER AYIN +10850 ; [.4906.0020.0002] # IMPERIAL ARAMAIC LETTER PE +10851 ; [.4907.0020.0002] # IMPERIAL ARAMAIC LETTER SADHE +10852 ; [.4908.0020.0002] # IMPERIAL ARAMAIC LETTER QOPH +10853 ; [.4909.0020.0002] # IMPERIAL ARAMAIC LETTER RESH +10854 ; [.490A.0020.0002] # IMPERIAL ARAMAIC LETTER SHIN +10855 ; [.490B.0020.0002] # IMPERIAL ARAMAIC LETTER TAW +10B40 ; [.490C.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ALEPH +10B41 ; [.490D.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER BETH +10B42 ; [.490E.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER GIMEL +10B43 ; [.490F.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER DALETH +10B44 ; [.4910.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HE +10B45 ; [.4911.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER WAW +10B46 ; [.4912.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ZAYIN +10B47 ; [.4913.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HETH +10B48 ; [.4914.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TETH +10B49 ; [.4915.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER YODH +10B4A ; [.4916.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER KAPH +10B4B ; [.4917.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER LAMEDH +10B4C ; [.4918.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER MEM +10B4D ; [.4919.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER NUN +10B4E ; [.491A.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SAMEKH +10B4F ; [.491B.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER AYIN +10B50 ; [.491C.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER PE +10B51 ; [.491D.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SADHE +10B52 ; [.491E.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER QOPH +10B53 ; [.491F.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER RESH +10B54 ; [.4920.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SHIN +10B55 ; [.4921.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TAW +10B60 ; [.4922.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ALEPH +10B61 ; [.4923.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER BETH +10B62 ; [.4924.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER GIMEL +10B63 ; [.4925.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER DALETH +10B64 ; [.4926.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HE +10B65 ; [.4927.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH +10B66 ; [.4928.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ZAYIN +10B67 ; [.4929.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HETH +10B68 ; [.492A.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TETH +10B69 ; [.492B.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER YODH +10B6A ; [.492C.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER KAPH +10B6B ; [.492D.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER LAMEDH +10B6C ; [.492E.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH +10B6D ; [.492F.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER NUN +10B6E ; [.4930.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SAMEKH +10B6F ; [.4931.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER PE +10B70 ; [.4932.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SADHE +10B71 ; [.4933.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SHIN +10B72 ; [.4934.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TAW +10B80 ; [.4935.0020.0002] # PSALTER PAHLAVI LETTER ALEPH +10B81 ; [.4936.0020.0002] # PSALTER PAHLAVI LETTER BETH +10B82 ; [.4937.0020.0002] # PSALTER PAHLAVI LETTER GIMEL +10B83 ; [.4938.0020.0002] # PSALTER PAHLAVI LETTER DALETH +10B84 ; [.4939.0020.0002] # PSALTER PAHLAVI LETTER HE +10B85 ; [.493A.0020.0002] # PSALTER PAHLAVI LETTER WAW-AYIN-RESH +10B86 ; [.493B.0020.0002] # PSALTER PAHLAVI LETTER ZAYIN +10B87 ; [.493C.0020.0002] # PSALTER PAHLAVI LETTER HETH +10B88 ; [.493D.0020.0002] # PSALTER PAHLAVI LETTER YODH +10B89 ; [.493E.0020.0002] # PSALTER PAHLAVI LETTER KAPH +10B8A ; [.493F.0020.0002] # PSALTER PAHLAVI LETTER LAMEDH +10B8B ; [.4940.0020.0002] # PSALTER PAHLAVI LETTER MEM-QOPH +10B8C ; [.4941.0020.0002] # PSALTER PAHLAVI LETTER NUN +10B8D ; [.4942.0020.0002] # PSALTER PAHLAVI LETTER SAMEKH +10B8E ; [.4943.0020.0002] # PSALTER PAHLAVI LETTER PE +10B8F ; [.4944.0020.0002] # PSALTER PAHLAVI LETTER SADHE +10B90 ; [.4945.0020.0002] # PSALTER PAHLAVI LETTER SHIN +10B91 ; [.4946.0020.0002] # PSALTER PAHLAVI LETTER TAW +10AC0 ; [.4947.0020.0002] # MANICHAEAN LETTER ALEPH +10AC1 ; [.4948.0020.0002] # MANICHAEAN LETTER BETH +10AC2 ; [.4949.0020.0002] # MANICHAEAN LETTER BHETH +10AC3 ; [.494A.0020.0002] # MANICHAEAN LETTER GIMEL +10AC4 ; [.494B.0020.0002] # MANICHAEAN LETTER GHIMEL +10AC5 ; [.494C.0020.0002] # MANICHAEAN LETTER DALETH +10AC6 ; [.494D.0020.0002] # MANICHAEAN LETTER HE +10AC7 ; [.494E.0020.0002] # MANICHAEAN LETTER WAW +10AC8 ; [.494E.0020.0004][.0000.0111.0004] # MANICHAEAN SIGN UD +10AC9 ; [.494F.0020.0002] # MANICHAEAN LETTER ZAYIN +10ACA ; [.4950.0020.0002] # MANICHAEAN LETTER ZHAYIN +10ACB ; [.4951.0020.0002] # MANICHAEAN LETTER JAYIN +10ACC ; [.4952.0020.0002] # MANICHAEAN LETTER JHAYIN +10ACD ; [.4953.0020.0002] # MANICHAEAN LETTER HETH +10ACE ; [.4954.0020.0002] # MANICHAEAN LETTER TETH +10ACF ; [.4955.0020.0002] # MANICHAEAN LETTER YODH +10AD0 ; [.4956.0020.0002] # MANICHAEAN LETTER KAPH +10AD1 ; [.4957.0020.0002] # MANICHAEAN LETTER XAPH +10AD2 ; [.4958.0020.0002] # MANICHAEAN LETTER KHAPH +10AD3 ; [.4959.0020.0002] # MANICHAEAN LETTER LAMEDH +10AD4 ; [.495A.0020.0002] # MANICHAEAN LETTER DHAMEDH +10AD5 ; [.495B.0020.0002] # MANICHAEAN LETTER THAMEDH +10AD6 ; [.495C.0020.0002] # MANICHAEAN LETTER MEM +10AD7 ; [.495D.0020.0002] # MANICHAEAN LETTER NUN +10AD8 ; [.495E.0020.0002] # MANICHAEAN LETTER SAMEKH +10AD9 ; [.495F.0020.0002] # MANICHAEAN LETTER AYIN +10ADA ; [.4960.0020.0002] # MANICHAEAN LETTER AAYIN +10ADB ; [.4961.0020.0002] # MANICHAEAN LETTER PE +10ADC ; [.4962.0020.0002] # MANICHAEAN LETTER FE +10ADD ; [.4963.0020.0002] # MANICHAEAN LETTER SADHE +10ADE ; [.4964.0020.0002] # MANICHAEAN LETTER QOPH +10ADF ; [.4965.0020.0002] # MANICHAEAN LETTER XOPH +10AE0 ; [.4966.0020.0002] # MANICHAEAN LETTER QHOPH +10AE1 ; [.4967.0020.0002] # MANICHAEAN LETTER RESH +10AE2 ; [.4968.0020.0002] # MANICHAEAN LETTER SHIN +10AE3 ; [.4969.0020.0002] # MANICHAEAN LETTER SSHIN +10AE4 ; [.496A.0020.0002] # MANICHAEAN LETTER TAW +10380 ; [.496B.0020.0002] # UGARITIC LETTER ALPA +10381 ; [.496C.0020.0002] # UGARITIC LETTER BETA +10382 ; [.496D.0020.0002] # UGARITIC LETTER GAMLA +10383 ; [.496E.0020.0002] # UGARITIC LETTER KHA +10384 ; [.496F.0020.0002] # UGARITIC LETTER DELTA +10385 ; [.4970.0020.0002] # UGARITIC LETTER HO +10386 ; [.4971.0020.0002] # UGARITIC LETTER WO +10387 ; [.4972.0020.0002] # UGARITIC LETTER ZETA +10388 ; [.4973.0020.0002] # UGARITIC LETTER HOTA +10389 ; [.4974.0020.0002] # UGARITIC LETTER TET +1038A ; [.4975.0020.0002] # UGARITIC LETTER YOD +1038B ; [.4976.0020.0002] # UGARITIC LETTER KAF +1038C ; [.4977.0020.0002] # UGARITIC LETTER SHIN +1038D ; [.4978.0020.0002] # UGARITIC LETTER LAMDA +1038E ; [.4979.0020.0002] # UGARITIC LETTER MEM +1038F ; [.497A.0020.0002] # UGARITIC LETTER DHAL +10390 ; [.497B.0020.0002] # UGARITIC LETTER NUN +10391 ; [.497C.0020.0002] # UGARITIC LETTER ZU +10392 ; [.497D.0020.0002] # UGARITIC LETTER SAMKA +10393 ; [.497E.0020.0002] # UGARITIC LETTER AIN +10394 ; [.497F.0020.0002] # UGARITIC LETTER PU +10395 ; [.4980.0020.0002] # UGARITIC LETTER SADE +10396 ; [.4981.0020.0002] # UGARITIC LETTER QOPA +10397 ; [.4982.0020.0002] # UGARITIC LETTER RASHA +10398 ; [.4983.0020.0002] # UGARITIC LETTER THANNA +10399 ; [.4984.0020.0002] # UGARITIC LETTER GHAIN +1039A ; [.4985.0020.0002] # UGARITIC LETTER TO +1039B ; [.4986.0020.0002] # UGARITIC LETTER I +1039C ; [.4987.0020.0002] # UGARITIC LETTER U +1039D ; [.4988.0020.0002] # UGARITIC LETTER SSU +103A0 ; [.4989.0020.0002] # OLD PERSIAN SIGN A +103A1 ; [.498A.0020.0002] # OLD PERSIAN SIGN I +103A2 ; [.498B.0020.0002] # OLD PERSIAN SIGN U +103A3 ; [.498C.0020.0002] # OLD PERSIAN SIGN KA +103A4 ; [.498D.0020.0002] # OLD PERSIAN SIGN KU +103A5 ; [.498E.0020.0002] # OLD PERSIAN SIGN GA +103A6 ; [.498F.0020.0002] # OLD PERSIAN SIGN GU +103A7 ; [.4990.0020.0002] # OLD PERSIAN SIGN XA +103A8 ; [.4991.0020.0002] # OLD PERSIAN SIGN CA +103A9 ; [.4992.0020.0002] # OLD PERSIAN SIGN JA +103AA ; [.4993.0020.0002] # OLD PERSIAN SIGN JI +103AB ; [.4994.0020.0002] # OLD PERSIAN SIGN TA +103AC ; [.4995.0020.0002] # OLD PERSIAN SIGN TU +103AD ; [.4996.0020.0002] # OLD PERSIAN SIGN DA +103AE ; [.4997.0020.0002] # OLD PERSIAN SIGN DI +103AF ; [.4998.0020.0002] # OLD PERSIAN SIGN DU +103B0 ; [.4999.0020.0002] # OLD PERSIAN SIGN THA +103B1 ; [.499A.0020.0002] # OLD PERSIAN SIGN PA +103B2 ; [.499B.0020.0002] # OLD PERSIAN SIGN BA +103B3 ; [.499C.0020.0002] # OLD PERSIAN SIGN FA +103B4 ; [.499D.0020.0002] # OLD PERSIAN SIGN NA +103B5 ; [.499E.0020.0002] # OLD PERSIAN SIGN NU +103B6 ; [.499F.0020.0002] # OLD PERSIAN SIGN MA +103B7 ; [.49A0.0020.0002] # OLD PERSIAN SIGN MI +103B8 ; [.49A1.0020.0002] # OLD PERSIAN SIGN MU +103B9 ; [.49A2.0020.0002] # OLD PERSIAN SIGN YA +103BA ; [.49A3.0020.0002] # OLD PERSIAN SIGN VA +103BB ; [.49A4.0020.0002] # OLD PERSIAN SIGN VI +103BC ; [.49A5.0020.0002] # OLD PERSIAN SIGN RA +103BD ; [.49A6.0020.0002] # OLD PERSIAN SIGN RU +103BE ; [.49A7.0020.0002] # OLD PERSIAN SIGN LA +103BF ; [.49A8.0020.0002] # OLD PERSIAN SIGN SA +103C0 ; [.49A9.0020.0002] # OLD PERSIAN SIGN ZA +103C1 ; [.49AA.0020.0002] # OLD PERSIAN SIGN SHA +103C2 ; [.49AB.0020.0002] # OLD PERSIAN SIGN SSA +103C3 ; [.49AC.0020.0002] # OLD PERSIAN SIGN HA +103C8 ; [.49AD.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA +103C9 ; [.49AE.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA-2 +103CA ; [.49AF.0020.0002] # OLD PERSIAN SIGN AURAMAZDAAHA +103CB ; [.49B0.0020.0002] # OLD PERSIAN SIGN XSHAAYATHIYA +103CC ; [.49B1.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH +103CD ; [.49B2.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH-2 +103CE ; [.49B3.0020.0002] # OLD PERSIAN SIGN BAGA +103CF ; [.49B4.0020.0002] # OLD PERSIAN SIGN BUUMISH +12000 ; [.49B5.0020.0002] # CUNEIFORM SIGN A +12001 ; [.49B6.0020.0002] # CUNEIFORM SIGN A TIMES A +12002 ; [.49B7.0020.0002] # CUNEIFORM SIGN A TIMES BAD +12003 ; [.49B8.0020.0002] # CUNEIFORM SIGN A TIMES GAN2 TENU +12004 ; [.49B9.0020.0002] # CUNEIFORM SIGN A TIMES HA +12005 ; [.49BA.0020.0002] # CUNEIFORM SIGN A TIMES IGI +12006 ; [.49BB.0020.0002] # CUNEIFORM SIGN A TIMES LAGAR GUNU +12007 ; [.49BC.0020.0002] # CUNEIFORM SIGN A TIMES MUSH +12008 ; [.49BD.0020.0002] # CUNEIFORM SIGN A TIMES SAG +12009 ; [.49BE.0020.0002] # CUNEIFORM SIGN A2 +1200A ; [.49BF.0020.0002] # CUNEIFORM SIGN AB +1200B ; [.49C0.0020.0002] # CUNEIFORM SIGN AB TIMES ASH2 +1200C ; [.49C1.0020.0002] # CUNEIFORM SIGN AB TIMES DUN3 GUNU +1200D ; [.49C2.0020.0002] # CUNEIFORM SIGN AB TIMES GAL +1200E ; [.49C3.0020.0002] # CUNEIFORM SIGN AB TIMES GAN2 TENU +1200F ; [.49C4.0020.0002] # CUNEIFORM SIGN AB TIMES HA +12010 ; [.49C5.0020.0002] # CUNEIFORM SIGN AB TIMES IGI GUNU +12011 ; [.49C6.0020.0002] # CUNEIFORM SIGN AB TIMES IMIN +12012 ; [.49C7.0020.0002] # CUNEIFORM SIGN AB TIMES LAGAB +12013 ; [.49C8.0020.0002] # CUNEIFORM SIGN AB TIMES SHESH +12014 ; [.49C9.0020.0002] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U +12015 ; [.49CA.0020.0002] # CUNEIFORM SIGN AB GUNU +12016 ; [.49CB.0020.0002] # CUNEIFORM SIGN AB2 +12017 ; [.49CC.0020.0002] # CUNEIFORM SIGN AB2 TIMES BALAG +12018 ; [.49CD.0020.0002] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU +12019 ; [.49CE.0020.0002] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN +1201A ; [.49CF.0020.0002] # CUNEIFORM SIGN AB2 TIMES SHA3 +1201B ; [.49D0.0020.0002] # CUNEIFORM SIGN AB2 TIMES TAK4 +1201C ; [.49D1.0020.0002] # CUNEIFORM SIGN AD +1201D ; [.49D2.0020.0002] # CUNEIFORM SIGN AK +1201E ; [.49D3.0020.0002] # CUNEIFORM SIGN AK TIMES ERIN2 +1201F ; [.49D4.0020.0002] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH +12020 ; [.49D5.0020.0002] # CUNEIFORM SIGN AL +12021 ; [.49D6.0020.0002] # CUNEIFORM SIGN AL TIMES AL +12022 ; [.49D7.0020.0002] # CUNEIFORM SIGN AL TIMES DIM2 +12023 ; [.49D8.0020.0002] # CUNEIFORM SIGN AL TIMES GISH +12024 ; [.49D9.0020.0002] # CUNEIFORM SIGN AL TIMES HA +12025 ; [.49DA.0020.0002] # CUNEIFORM SIGN AL TIMES KAD3 +12026 ; [.49DB.0020.0002] # CUNEIFORM SIGN AL TIMES KI +12027 ; [.49DC.0020.0002] # CUNEIFORM SIGN AL TIMES SHE +12028 ; [.49DD.0020.0002] # CUNEIFORM SIGN AL TIMES USH +12029 ; [.49DE.0020.0002] # CUNEIFORM SIGN ALAN +1202A ; [.49DF.0020.0002] # CUNEIFORM SIGN ALEPH +1202B ; [.49E0.0020.0002] # CUNEIFORM SIGN AMAR +1202C ; [.49E1.0020.0002] # CUNEIFORM SIGN AMAR TIMES SHE +1202D ; [.49E2.0020.0002] # CUNEIFORM SIGN AN +1202E ; [.49E3.0020.0002] # CUNEIFORM SIGN AN OVER AN +1202F ; [.49E4.0020.0002] # CUNEIFORM SIGN AN THREE TIMES +12030 ; [.49E5.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA +12031 ; [.49E6.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA SQUARED +12032 ; [.49E7.0020.0002] # CUNEIFORM SIGN ANSHE +12033 ; [.49E8.0020.0002] # CUNEIFORM SIGN APIN +12034 ; [.49E9.0020.0002] # CUNEIFORM SIGN ARAD +12035 ; [.49EA.0020.0002] # CUNEIFORM SIGN ARAD TIMES KUR +12036 ; [.49EB.0020.0002] # CUNEIFORM SIGN ARKAB +12037 ; [.49EC.0020.0002] # CUNEIFORM SIGN ASAL2 +12038 ; [.49ED.0020.0002] # CUNEIFORM SIGN ASH +12039 ; [.49EE.0020.0002] # CUNEIFORM SIGN ASH ZIDA TENU +1203A ; [.49EF.0020.0002] # CUNEIFORM SIGN ASH KABA TENU +1203B ; [.49F0.0020.0002] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP +1203C ; [.49F1.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH +1203D ; [.49F2.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH +1203E ; [.49F3.0020.0002] # CUNEIFORM SIGN ASH2 +1203F ; [.49F4.0020.0002] # CUNEIFORM SIGN ASHGAB +12040 ; [.49F5.0020.0002] # CUNEIFORM SIGN BA +12041 ; [.49F6.0020.0002] # CUNEIFORM SIGN BAD +12042 ; [.49F7.0020.0002] # CUNEIFORM SIGN BAG3 +12043 ; [.49F8.0020.0002] # CUNEIFORM SIGN BAHAR2 +12044 ; [.49F9.0020.0002] # CUNEIFORM SIGN BAL +12045 ; [.49FA.0020.0002] # CUNEIFORM SIGN BAL OVER BAL +12046 ; [.49FB.0020.0002] # CUNEIFORM SIGN BALAG +12047 ; [.49FC.0020.0002] # CUNEIFORM SIGN BAR +12048 ; [.49FD.0020.0002] # CUNEIFORM SIGN BARA2 +12049 ; [.49FE.0020.0002] # CUNEIFORM SIGN BI +1204A ; [.49FF.0020.0002] # CUNEIFORM SIGN BI TIMES A +1204B ; [.4A00.0020.0002] # CUNEIFORM SIGN BI TIMES GAR +1204C ; [.4A01.0020.0002] # CUNEIFORM SIGN BI TIMES IGI GUNU +1204D ; [.4A02.0020.0002] # CUNEIFORM SIGN BU +1204E ; [.4A03.0020.0002] # CUNEIFORM SIGN BU OVER BU AB +1204F ; [.4A04.0020.0002] # CUNEIFORM SIGN BU OVER BU UN +12050 ; [.4A05.0020.0002] # CUNEIFORM SIGN BU CROSSING BU +12051 ; [.4A06.0020.0002] # CUNEIFORM SIGN BULUG +12052 ; [.4A07.0020.0002] # CUNEIFORM SIGN BULUG OVER BULUG +12053 ; [.4A08.0020.0002] # CUNEIFORM SIGN BUR +12054 ; [.4A09.0020.0002] # CUNEIFORM SIGN BUR2 +12055 ; [.4A0A.0020.0002] # CUNEIFORM SIGN DA +12056 ; [.4A0B.0020.0002] # CUNEIFORM SIGN DAG +12057 ; [.4A0C.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH +12058 ; [.4A0D.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR +12059 ; [.4A0E.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG +1205A ; [.4A0F.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BI +1205B ; [.4A10.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA +1205C ; [.4A11.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH +1205D ; [.4A12.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GI +1205E ; [.4A13.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2 +1205F ; [.4A14.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD +12060 ; [.4A15.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES HA +12061 ; [.4A16.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR +12062 ; [.4A17.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU +12063 ; [.4A18.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK +12064 ; [.4A19.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LA +12065 ; [.4A1A.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU +12066 ; [.4A1B.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2 +12067 ; [.4A1C.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM +12068 ; [.4A1D.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES NE +12069 ; [.4A1E.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP +1206A ; [.4A1F.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES SI +1206B ; [.4A20.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4 +1206C ; [.4A21.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2 +1206D ; [.4A22.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES USH +1206E ; [.4A23.0020.0002] # CUNEIFORM SIGN DAM +1206F ; [.4A24.0020.0002] # CUNEIFORM SIGN DAR +12070 ; [.4A25.0020.0002] # CUNEIFORM SIGN DARA3 +12071 ; [.4A26.0020.0002] # CUNEIFORM SIGN DARA4 +12072 ; [.4A27.0020.0002] # CUNEIFORM SIGN DI +12073 ; [.4A28.0020.0002] # CUNEIFORM SIGN DIB +12074 ; [.4A29.0020.0002] # CUNEIFORM SIGN DIM +12075 ; [.4A2A.0020.0002] # CUNEIFORM SIGN DIM TIMES SHE +12076 ; [.4A2B.0020.0002] # CUNEIFORM SIGN DIM2 +12077 ; [.4A2C.0020.0002] # CUNEIFORM SIGN DIN +12078 ; [.4A2D.0020.0002] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH +12079 ; [.4A2E.0020.0002] # CUNEIFORM SIGN DISH +1207A ; [.4A2F.0020.0002] # CUNEIFORM SIGN DU +1207B ; [.4A30.0020.0002] # CUNEIFORM SIGN DU OVER DU +1207C ; [.4A31.0020.0002] # CUNEIFORM SIGN DU GUNU +1207D ; [.4A32.0020.0002] # CUNEIFORM SIGN DU SHESHIG +1207E ; [.4A33.0020.0002] # CUNEIFORM SIGN DUB +1207F ; [.4A34.0020.0002] # CUNEIFORM SIGN DUB TIMES ESH2 +12080 ; [.4A35.0020.0002] # CUNEIFORM SIGN DUB2 +12081 ; [.4A36.0020.0002] # CUNEIFORM SIGN DUG +12082 ; [.4A37.0020.0002] # CUNEIFORM SIGN DUGUD +12083 ; [.4A38.0020.0002] # CUNEIFORM SIGN DUH +12084 ; [.4A39.0020.0002] # CUNEIFORM SIGN DUN +12085 ; [.4A3A.0020.0002] # CUNEIFORM SIGN DUN3 +12086 ; [.4A3B.0020.0002] # CUNEIFORM SIGN DUN3 GUNU +12087 ; [.4A3C.0020.0002] # CUNEIFORM SIGN DUN3 GUNU GUNU +12088 ; [.4A3D.0020.0002] # CUNEIFORM SIGN DUN4 +12089 ; [.4A3E.0020.0002] # CUNEIFORM SIGN DUR2 +1208A ; [.4A3F.0020.0002] # CUNEIFORM SIGN E +1208B ; [.4A40.0020.0002] # CUNEIFORM SIGN E TIMES PAP +1208C ; [.4A41.0020.0002] # CUNEIFORM SIGN E OVER E NUN OVER NUN +1208D ; [.4A42.0020.0002] # CUNEIFORM SIGN E2 +1208E ; [.4A43.0020.0002] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA +1208F ; [.4A44.0020.0002] # CUNEIFORM SIGN E2 TIMES GAR +12090 ; [.4A45.0020.0002] # CUNEIFORM SIGN E2 TIMES MI +12091 ; [.4A46.0020.0002] # CUNEIFORM SIGN E2 TIMES SAL +12092 ; [.4A47.0020.0002] # CUNEIFORM SIGN E2 TIMES SHE +12093 ; [.4A48.0020.0002] # CUNEIFORM SIGN E2 TIMES U +12094 ; [.4A49.0020.0002] # CUNEIFORM SIGN EDIN +12095 ; [.4A4A.0020.0002] # CUNEIFORM SIGN EGIR +12096 ; [.4A4B.0020.0002] # CUNEIFORM SIGN EL +12097 ; [.4A4C.0020.0002] # CUNEIFORM SIGN EN +12098 ; [.4A4D.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 +12099 ; [.4A4E.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 TENU +1209A ; [.4A4F.0020.0002] # CUNEIFORM SIGN EN TIMES ME +1209B ; [.4A50.0020.0002] # CUNEIFORM SIGN EN CROSSING EN +1209C ; [.4A51.0020.0002] # CUNEIFORM SIGN EN OPPOSING EN +1209D ; [.4A52.0020.0002] # CUNEIFORM SIGN EN SQUARED +1209E ; [.4A53.0020.0002] # CUNEIFORM SIGN EREN +1209F ; [.4A54.0020.0002] # CUNEIFORM SIGN ERIN2 +120A0 ; [.4A55.0020.0002] # CUNEIFORM SIGN ESH2 +120A1 ; [.4A56.0020.0002] # CUNEIFORM SIGN EZEN +120A2 ; [.4A57.0020.0002] # CUNEIFORM SIGN EZEN TIMES A +120A3 ; [.4A58.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL +120A4 ; [.4A59.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL +120A5 ; [.4A5A.0020.0002] # CUNEIFORM SIGN EZEN TIMES AN +120A6 ; [.4A5B.0020.0002] # CUNEIFORM SIGN EZEN TIMES BAD +120A7 ; [.4A5C.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU +120A8 ; [.4A5D.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU +120A9 ; [.4A5E.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA +120AA ; [.4A5F.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA GUNU +120AB ; [.4A60.0020.0002] # CUNEIFORM SIGN EZEN TIMES IGI GUNU +120AC ; [.4A61.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL +120AD ; [.4A62.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED +120AE ; [.4A63.0020.0002] # CUNEIFORM SIGN EZEN TIMES KU3 +120AF ; [.4A64.0020.0002] # CUNEIFORM SIGN EZEN TIMES LA +120B0 ; [.4A65.0020.0002] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL +120B1 ; [.4A66.0020.0002] # CUNEIFORM SIGN EZEN TIMES LI +120B2 ; [.4A67.0020.0002] # CUNEIFORM SIGN EZEN TIMES LU +120B3 ; [.4A68.0020.0002] # CUNEIFORM SIGN EZEN TIMES U2 +120B4 ; [.4A69.0020.0002] # CUNEIFORM SIGN EZEN TIMES UD +120B5 ; [.4A6A.0020.0002] # CUNEIFORM SIGN GA +120B6 ; [.4A6B.0020.0002] # CUNEIFORM SIGN GA GUNU +120B7 ; [.4A6C.0020.0002] # CUNEIFORM SIGN GA2 +120B8 ; [.4A6D.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA +120B9 ; [.4A6E.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS HA +120BA ; [.4A6F.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI +120BB ; [.4A70.0020.0002] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB +120BC ; [.4A71.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN +120BD ; [.4A72.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH +120BE ; [.4A73.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL +120BF ; [.4A74.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAD +120C0 ; [.4A75.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA +120C1 ; [.4A76.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR +120C2 ; [.4A77.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA +120C3 ; [.4A78.0020.0002] # CUNEIFORM SIGN GA2 TIMES DA +120C4 ; [.4A79.0020.0002] # CUNEIFORM SIGN GA2 TIMES DI +120C5 ; [.4A7A.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE +120C6 ; [.4A7B.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUB +120C7 ; [.4A7C.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL +120C8 ; [.4A7D.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA +120C9 ; [.4A7E.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN +120CA ; [.4A7F.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU +120CB ; [.4A80.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU +120CC ; [.4A81.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR +120CD ; [.4A82.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI +120CE ; [.4A83.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 +120CF ; [.4A84.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A +120D0 ; [.4A85.0020.0002] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU +120D1 ; [.4A86.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2 +120D2 ; [.4A87.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL +120D3 ; [.4A88.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA +120D4 ; [.4A89.0020.0002] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI +120D5 ; [.4A8A.0020.0002] # CUNEIFORM SIGN GA2 TIMES HUB2 +120D6 ; [.4A8B.0020.0002] # CUNEIFORM SIGN GA2 TIMES IGI GUNU +120D7 ; [.4A8C.0020.0002] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH +120D8 ; [.4A8D.0020.0002] # CUNEIFORM SIGN GA2 TIMES KAK +120D9 ; [.4A8E.0020.0002] # CUNEIFORM SIGN GA2 TIMES KASKAL +120DA ; [.4A8F.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID +120DB ; [.4A90.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL +120DC ; [.4A91.0020.0002] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN +120DD ; [.4A92.0020.0002] # CUNEIFORM SIGN GA2 TIMES LA +120DE ; [.4A93.0020.0002] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN +120DF ; [.4A94.0020.0002] # CUNEIFORM SIGN GA2 TIMES MI +120E0 ; [.4A95.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN +120E1 ; [.4A96.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN +120E2 ; [.4A97.0020.0002] # CUNEIFORM SIGN GA2 TIMES PA +120E3 ; [.4A98.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAL +120E4 ; [.4A99.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAR +120E5 ; [.4A9A.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE +120E6 ; [.4A9B.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR +120E7 ; [.4A9C.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHID +120E8 ; [.4A9D.0020.0002] # CUNEIFORM SIGN GA2 TIMES SUM +120E9 ; [.4A9E.0020.0002] # CUNEIFORM SIGN GA2 TIMES TAK4 +120EA ; [.4A9F.0020.0002] # CUNEIFORM SIGN GA2 TIMES U +120EB ; [.4AA0.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD +120EC ; [.4AA1.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU +120ED ; [.4AA2.0020.0002] # CUNEIFORM SIGN GA2 OVER GA2 +120EE ; [.4AA3.0020.0002] # CUNEIFORM SIGN GABA +120EF ; [.4AA4.0020.0002] # CUNEIFORM SIGN GABA CROSSING GABA +120F0 ; [.4AA5.0020.0002] # CUNEIFORM SIGN GAD +120F1 ; [.4AA6.0020.0002] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR +120F2 ; [.4AA7.0020.0002] # CUNEIFORM SIGN GAL +120F3 ; [.4AA8.0020.0002] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR +120F4 ; [.4AA9.0020.0002] # CUNEIFORM SIGN GALAM +120F5 ; [.4AAA.0020.0002] # CUNEIFORM SIGN GAM +120F6 ; [.4AAB.0020.0002] # CUNEIFORM SIGN GAN +120F7 ; [.4AAC.0020.0002] # CUNEIFORM SIGN GAN2 +120F8 ; [.4AAD.0020.0002] # CUNEIFORM SIGN GAN2 TENU +120F9 ; [.4AAE.0020.0002] # CUNEIFORM SIGN GAN2 OVER GAN2 +120FA ; [.4AAF.0020.0002] # CUNEIFORM SIGN GAN2 CROSSING GAN2 +120FB ; [.4AB0.0020.0002] # CUNEIFORM SIGN GAR +120FC ; [.4AB1.0020.0002] # CUNEIFORM SIGN GAR3 +120FD ; [.4AB2.0020.0002] # CUNEIFORM SIGN GASHAN +120FE ; [.4AB3.0020.0002] # CUNEIFORM SIGN GESHTIN +120FF ; [.4AB4.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES KUR +12100 ; [.4AB5.0020.0002] # CUNEIFORM SIGN GI +12101 ; [.4AB6.0020.0002] # CUNEIFORM SIGN GI TIMES E +12102 ; [.4AB7.0020.0002] # CUNEIFORM SIGN GI TIMES U +12103 ; [.4AB8.0020.0002] # CUNEIFORM SIGN GI CROSSING GI +12104 ; [.4AB9.0020.0002] # CUNEIFORM SIGN GI4 +12105 ; [.4ABA.0020.0002] # CUNEIFORM SIGN GI4 OVER GI4 +12106 ; [.4ABB.0020.0002] # CUNEIFORM SIGN GI4 CROSSING GI4 +12107 ; [.4ABC.0020.0002] # CUNEIFORM SIGN GIDIM +12108 ; [.4ABD.0020.0002] # CUNEIFORM SIGN GIR2 +12109 ; [.4ABE.0020.0002] # CUNEIFORM SIGN GIR2 GUNU +1210A ; [.4ABF.0020.0002] # CUNEIFORM SIGN GIR3 +1210B ; [.4AC0.0020.0002] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI +1210C ; [.4AC1.0020.0002] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU +1210D ; [.4AC2.0020.0002] # CUNEIFORM SIGN GIR3 TIMES IGI +1210E ; [.4AC3.0020.0002] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI +1210F ; [.4AC4.0020.0002] # CUNEIFORM SIGN GIR3 TIMES PA +12110 ; [.4AC5.0020.0002] # CUNEIFORM SIGN GISAL +12111 ; [.4AC6.0020.0002] # CUNEIFORM SIGN GISH +12112 ; [.4AC7.0020.0002] # CUNEIFORM SIGN GISH CROSSING GISH +12113 ; [.4AC8.0020.0002] # CUNEIFORM SIGN GISH TIMES BAD +12114 ; [.4AC9.0020.0002] # CUNEIFORM SIGN GISH TIMES TAK4 +12115 ; [.4ACA.0020.0002] # CUNEIFORM SIGN GISH TENU +12116 ; [.4ACB.0020.0002] # CUNEIFORM SIGN GU +12117 ; [.4ACC.0020.0002] # CUNEIFORM SIGN GU CROSSING GU +12118 ; [.4ACD.0020.0002] # CUNEIFORM SIGN GU2 +12119 ; [.4ACE.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK +1211A ; [.4ACF.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU +1211B ; [.4AD0.0020.0002] # CUNEIFORM SIGN GU2 TIMES NUN +1211C ; [.4AD1.0020.0002] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2 +1211D ; [.4AD2.0020.0002] # CUNEIFORM SIGN GU2 GUNU +1211E ; [.4AD3.0020.0002] # CUNEIFORM SIGN GUD +1211F ; [.4AD4.0020.0002] # CUNEIFORM SIGN GUD TIMES A PLUS KUR +12120 ; [.4AD5.0020.0002] # CUNEIFORM SIGN GUD TIMES KUR +12121 ; [.4AD6.0020.0002] # CUNEIFORM SIGN GUD OVER GUD LUGAL +12122 ; [.4AD7.0020.0002] # CUNEIFORM SIGN GUL +12123 ; [.4AD8.0020.0002] # CUNEIFORM SIGN GUM +12124 ; [.4AD9.0020.0002] # CUNEIFORM SIGN GUM TIMES SHE +12125 ; [.4ADA.0020.0002] # CUNEIFORM SIGN GUR +12126 ; [.4ADB.0020.0002] # CUNEIFORM SIGN GUR7 +12127 ; [.4ADC.0020.0002] # CUNEIFORM SIGN GURUN +12128 ; [.4ADD.0020.0002] # CUNEIFORM SIGN GURUSH +12129 ; [.4ADE.0020.0002] # CUNEIFORM SIGN HA +1212A ; [.4ADF.0020.0002] # CUNEIFORM SIGN HA TENU +1212B ; [.4AE0.0020.0002] # CUNEIFORM SIGN HA GUNU +1212C ; [.4AE1.0020.0002] # CUNEIFORM SIGN HAL +1212D ; [.4AE2.0020.0002] # CUNEIFORM SIGN HI +1212E ; [.4AE3.0020.0002] # CUNEIFORM SIGN HI TIMES ASH +1212F ; [.4AE4.0020.0002] # CUNEIFORM SIGN HI TIMES ASH2 +12130 ; [.4AE5.0020.0002] # CUNEIFORM SIGN HI TIMES BAD +12131 ; [.4AE6.0020.0002] # CUNEIFORM SIGN HI TIMES DISH +12132 ; [.4AE7.0020.0002] # CUNEIFORM SIGN HI TIMES GAD +12133 ; [.4AE8.0020.0002] # CUNEIFORM SIGN HI TIMES KIN +12134 ; [.4AE9.0020.0002] # CUNEIFORM SIGN HI TIMES NUN +12135 ; [.4AEA.0020.0002] # CUNEIFORM SIGN HI TIMES SHE +12136 ; [.4AEB.0020.0002] # CUNEIFORM SIGN HI TIMES U +12137 ; [.4AEC.0020.0002] # CUNEIFORM SIGN HU +12138 ; [.4AED.0020.0002] # CUNEIFORM SIGN HUB2 +12139 ; [.4AEE.0020.0002] # CUNEIFORM SIGN HUB2 TIMES AN +1213A ; [.4AEF.0020.0002] # CUNEIFORM SIGN HUB2 TIMES HAL +1213B ; [.4AF0.0020.0002] # CUNEIFORM SIGN HUB2 TIMES KASKAL +1213C ; [.4AF1.0020.0002] # CUNEIFORM SIGN HUB2 TIMES LISH +1213D ; [.4AF2.0020.0002] # CUNEIFORM SIGN HUB2 TIMES UD +1213E ; [.4AF3.0020.0002] # CUNEIFORM SIGN HUL2 +1213F ; [.4AF4.0020.0002] # CUNEIFORM SIGN I +12140 ; [.4AF5.0020.0002] # CUNEIFORM SIGN I A +12141 ; [.4AF6.0020.0002] # CUNEIFORM SIGN IB +12142 ; [.4AF7.0020.0002] # CUNEIFORM SIGN IDIM +12143 ; [.4AF8.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM BUR +12144 ; [.4AF9.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED +12145 ; [.4AFA.0020.0002] # CUNEIFORM SIGN IG +12146 ; [.4AFB.0020.0002] # CUNEIFORM SIGN IGI +12147 ; [.4AFC.0020.0002] # CUNEIFORM SIGN IGI DIB +12148 ; [.4AFD.0020.0002] # CUNEIFORM SIGN IGI RI +12149 ; [.4AFE.0020.0002] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD +1214A ; [.4AFF.0020.0002] # CUNEIFORM SIGN IGI GUNU +1214B ; [.4B00.0020.0002] # CUNEIFORM SIGN IL +1214C ; [.4B01.0020.0002] # CUNEIFORM SIGN IL TIMES GAN2 TENU +1214D ; [.4B02.0020.0002] # CUNEIFORM SIGN IL2 +1214E ; [.4B03.0020.0002] # CUNEIFORM SIGN IM +1214F ; [.4B04.0020.0002] # CUNEIFORM SIGN IM TIMES TAK4 +12150 ; [.4B05.0020.0002] # CUNEIFORM SIGN IM CROSSING IM +12151 ; [.4B06.0020.0002] # CUNEIFORM SIGN IM OPPOSING IM +12152 ; [.4B07.0020.0002] # CUNEIFORM SIGN IM SQUARED +12153 ; [.4B08.0020.0002] # CUNEIFORM SIGN IMIN +12154 ; [.4B09.0020.0002] # CUNEIFORM SIGN IN +12155 ; [.4B0A.0020.0002] # CUNEIFORM SIGN IR +12156 ; [.4B0B.0020.0002] # CUNEIFORM SIGN ISH +12157 ; [.4B0C.0020.0002] # CUNEIFORM SIGN KA +12158 ; [.4B0D.0020.0002] # CUNEIFORM SIGN KA TIMES A +12159 ; [.4B0E.0020.0002] # CUNEIFORM SIGN KA TIMES AD +1215A ; [.4B0F.0020.0002] # CUNEIFORM SIGN KA TIMES AD PLUS KU3 +1215B ; [.4B10.0020.0002] # CUNEIFORM SIGN KA TIMES ASH2 +1215C ; [.4B11.0020.0002] # CUNEIFORM SIGN KA TIMES BAD +1215D ; [.4B12.0020.0002] # CUNEIFORM SIGN KA TIMES BALAG +1215E ; [.4B13.0020.0002] # CUNEIFORM SIGN KA TIMES BAR +1215F ; [.4B14.0020.0002] # CUNEIFORM SIGN KA TIMES BI +12160 ; [.4B15.0020.0002] # CUNEIFORM SIGN KA TIMES ERIN2 +12161 ; [.4B16.0020.0002] # CUNEIFORM SIGN KA TIMES ESH2 +12162 ; [.4B17.0020.0002] # CUNEIFORM SIGN KA TIMES GA +12163 ; [.4B18.0020.0002] # CUNEIFORM SIGN KA TIMES GAL +12164 ; [.4B19.0020.0002] # CUNEIFORM SIGN KA TIMES GAN2 TENU +12165 ; [.4B1A.0020.0002] # CUNEIFORM SIGN KA TIMES GAR +12166 ; [.4B1B.0020.0002] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A +12167 ; [.4B1C.0020.0002] # CUNEIFORM SIGN KA TIMES GI +12168 ; [.4B1D.0020.0002] # CUNEIFORM SIGN KA TIMES GIR2 +12169 ; [.4B1E.0020.0002] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR +1216A ; [.4B1F.0020.0002] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH +1216B ; [.4B20.0020.0002] # CUNEIFORM SIGN KA TIMES GU +1216C ; [.4B21.0020.0002] # CUNEIFORM SIGN KA TIMES GUR7 +1216D ; [.4B22.0020.0002] # CUNEIFORM SIGN KA TIMES IGI +1216E ; [.4B23.0020.0002] # CUNEIFORM SIGN KA TIMES IM +1216F ; [.4B24.0020.0002] # CUNEIFORM SIGN KA TIMES KAK +12170 ; [.4B25.0020.0002] # CUNEIFORM SIGN KA TIMES KI +12171 ; [.4B26.0020.0002] # CUNEIFORM SIGN KA TIMES KID +12172 ; [.4B27.0020.0002] # CUNEIFORM SIGN KA TIMES LI +12173 ; [.4B28.0020.0002] # CUNEIFORM SIGN KA TIMES LU +12174 ; [.4B29.0020.0002] # CUNEIFORM SIGN KA TIMES ME +12175 ; [.4B2A.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS DU +12176 ; [.4B2B.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS GI +12177 ; [.4B2C.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS TE +12178 ; [.4B2D.0020.0002] # CUNEIFORM SIGN KA TIMES MI +12179 ; [.4B2E.0020.0002] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ +1217A ; [.4B2F.0020.0002] # CUNEIFORM SIGN KA TIMES NE +1217B ; [.4B30.0020.0002] # CUNEIFORM SIGN KA TIMES NUN +1217C ; [.4B31.0020.0002] # CUNEIFORM SIGN KA TIMES PI +1217D ; [.4B32.0020.0002] # CUNEIFORM SIGN KA TIMES RU +1217E ; [.4B33.0020.0002] # CUNEIFORM SIGN KA TIMES SA +1217F ; [.4B34.0020.0002] # CUNEIFORM SIGN KA TIMES SAR +12180 ; [.4B35.0020.0002] # CUNEIFORM SIGN KA TIMES SHA +12181 ; [.4B36.0020.0002] # CUNEIFORM SIGN KA TIMES SHE +12182 ; [.4B37.0020.0002] # CUNEIFORM SIGN KA TIMES SHID +12183 ; [.4B38.0020.0002] # CUNEIFORM SIGN KA TIMES SHU +12184 ; [.4B39.0020.0002] # CUNEIFORM SIGN KA TIMES SIG +12185 ; [.4B3A.0020.0002] # CUNEIFORM SIGN KA TIMES SUHUR +12186 ; [.4B3B.0020.0002] # CUNEIFORM SIGN KA TIMES TAR +12187 ; [.4B3C.0020.0002] # CUNEIFORM SIGN KA TIMES U +12188 ; [.4B3D.0020.0002] # CUNEIFORM SIGN KA TIMES U2 +12189 ; [.4B3E.0020.0002] # CUNEIFORM SIGN KA TIMES UD +1218A ; [.4B3F.0020.0002] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA +1218B ; [.4B40.0020.0002] # CUNEIFORM SIGN KA TIMES USH +1218C ; [.4B41.0020.0002] # CUNEIFORM SIGN KA TIMES ZI +1218D ; [.4B42.0020.0002] # CUNEIFORM SIGN KA2 +1218E ; [.4B43.0020.0002] # CUNEIFORM SIGN KA2 CROSSING KA2 +1218F ; [.4B44.0020.0002] # CUNEIFORM SIGN KAB +12190 ; [.4B45.0020.0002] # CUNEIFORM SIGN KAD2 +12191 ; [.4B46.0020.0002] # CUNEIFORM SIGN KAD3 +12192 ; [.4B47.0020.0002] # CUNEIFORM SIGN KAD4 +12193 ; [.4B48.0020.0002] # CUNEIFORM SIGN KAD5 +12194 ; [.4B49.0020.0002] # CUNEIFORM SIGN KAD5 OVER KAD5 +12195 ; [.4B4A.0020.0002] # CUNEIFORM SIGN KAK +12196 ; [.4B4B.0020.0002] # CUNEIFORM SIGN KAK TIMES IGI GUNU +12197 ; [.4B4C.0020.0002] # CUNEIFORM SIGN KAL +12198 ; [.4B4D.0020.0002] # CUNEIFORM SIGN KAL TIMES BAD +12199 ; [.4B4E.0020.0002] # CUNEIFORM SIGN KAL CROSSING KAL +1219A ; [.4B4F.0020.0002] # CUNEIFORM SIGN KAM2 +1219B ; [.4B50.0020.0002] # CUNEIFORM SIGN KAM4 +1219C ; [.4B51.0020.0002] # CUNEIFORM SIGN KASKAL +1219D ; [.4B52.0020.0002] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U +1219E ; [.4B53.0020.0002] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U +1219F ; [.4B54.0020.0002] # CUNEIFORM SIGN KESH2 +121A0 ; [.4B55.0020.0002] # CUNEIFORM SIGN KI +121A1 ; [.4B56.0020.0002] # CUNEIFORM SIGN KI TIMES BAD +121A2 ; [.4B57.0020.0002] # CUNEIFORM SIGN KI TIMES U +121A3 ; [.4B58.0020.0002] # CUNEIFORM SIGN KI TIMES UD +121A4 ; [.4B59.0020.0002] # CUNEIFORM SIGN KID +121A5 ; [.4B5A.0020.0002] # CUNEIFORM SIGN KIN +121A6 ; [.4B5B.0020.0002] # CUNEIFORM SIGN KISAL +121A7 ; [.4B5C.0020.0002] # CUNEIFORM SIGN KISH +121A8 ; [.4B5D.0020.0002] # CUNEIFORM SIGN KISIM5 +121A9 ; [.4B5E.0020.0002] # CUNEIFORM SIGN KISIM5 OVER KISIM5 +121AA ; [.4B5F.0020.0002] # CUNEIFORM SIGN KU +121AB ; [.4B60.0020.0002] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2 +121AC ; [.4B61.0020.0002] # CUNEIFORM SIGN KU3 +121AD ; [.4B62.0020.0002] # CUNEIFORM SIGN KU4 +121AE ; [.4B63.0020.0002] # CUNEIFORM SIGN KU4 VARIANT FORM +121AF ; [.4B64.0020.0002] # CUNEIFORM SIGN KU7 +121B0 ; [.4B65.0020.0002] # CUNEIFORM SIGN KUL +121B1 ; [.4B66.0020.0002] # CUNEIFORM SIGN KUL GUNU +121B2 ; [.4B67.0020.0002] # CUNEIFORM SIGN KUN +121B3 ; [.4B68.0020.0002] # CUNEIFORM SIGN KUR +121B4 ; [.4B69.0020.0002] # CUNEIFORM SIGN KUR OPPOSING KUR +121B5 ; [.4B6A.0020.0002] # CUNEIFORM SIGN KUSHU2 +121B6 ; [.4B6B.0020.0002] # CUNEIFORM SIGN KWU318 +121B7 ; [.4B6C.0020.0002] # CUNEIFORM SIGN LA +121B8 ; [.4B6D.0020.0002] # CUNEIFORM SIGN LAGAB +121B9 ; [.4B6E.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A +121BA ; [.4B6F.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA +121BB ; [.4B70.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR +121BC ; [.4B71.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL +121BD ; [.4B72.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AL +121BE ; [.4B73.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AN +121BF ; [.4B74.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU +121C0 ; [.4B75.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BAD +121C1 ; [.4B76.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BI +121C2 ; [.4B77.0020.0002] # CUNEIFORM SIGN LAGAB TIMES DAR +121C3 ; [.4B78.0020.0002] # CUNEIFORM SIGN LAGAB TIMES EN +121C4 ; [.4B79.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GA +121C5 ; [.4B7A.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GAR +121C6 ; [.4B7B.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD +121C7 ; [.4B7C.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD +121C8 ; [.4B7D.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HA +121C9 ; [.4B7E.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HAL +121CA ; [.4B7F.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN +121CB ; [.4B80.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU +121CC ; [.4B81.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM +121CD ; [.4B82.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA +121CE ; [.4B83.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU +121CF ; [.4B84.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KI +121D0 ; [.4B85.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KIN +121D1 ; [.4B86.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KU3 +121D2 ; [.4B87.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL +121D3 ; [.4B88.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A +121D4 ; [.4B89.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LAGAB +121D5 ; [.4B8A.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LISH +121D6 ; [.4B8B.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LU +121D7 ; [.4B8C.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LUL +121D8 ; [.4B8D.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME +121D9 ; [.4B8E.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN +121DA ; [.4B8F.0020.0002] # CUNEIFORM SIGN LAGAB TIMES MUSH +121DB ; [.4B90.0020.0002] # CUNEIFORM SIGN LAGAB TIMES NE +121DC ; [.4B91.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM +121DD ; [.4B92.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2 +121DE ; [.4B93.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU +121DF ; [.4B94.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 +121E0 ; [.4B95.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2 +121E1 ; [.4B96.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SUM +121E2 ; [.4B97.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAG +121E3 ; [.4B98.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAK4 +121E4 ; [.4B99.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA +121E5 ; [.4B9A.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U +121E6 ; [.4B9B.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS A +121E7 ; [.4B9C.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U +121E8 ; [.4B9D.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH +121E9 ; [.4B9E.0020.0002] # CUNEIFORM SIGN LAGAB TIMES UD +121EA ; [.4B9F.0020.0002] # CUNEIFORM SIGN LAGAB TIMES USH +121EB ; [.4BA0.0020.0002] # CUNEIFORM SIGN LAGAB SQUARED +121EC ; [.4BA1.0020.0002] # CUNEIFORM SIGN LAGAR +121ED ; [.4BA2.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE +121EE ; [.4BA3.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM +121EF ; [.4BA4.0020.0002] # CUNEIFORM SIGN LAGAR GUNU +121F0 ; [.4BA5.0020.0002] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE +121F1 ; [.4BA6.0020.0002] # CUNEIFORM SIGN LAHSHU +121F2 ; [.4BA7.0020.0002] # CUNEIFORM SIGN LAL +121F3 ; [.4BA8.0020.0002] # CUNEIFORM SIGN LAL TIMES LAL +121F4 ; [.4BA9.0020.0002] # CUNEIFORM SIGN LAM +121F5 ; [.4BAA.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR +121F6 ; [.4BAB.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU +121F7 ; [.4BAC.0020.0002] # CUNEIFORM SIGN LI +121F8 ; [.4BAD.0020.0002] # CUNEIFORM SIGN LIL +121F9 ; [.4BAE.0020.0002] # CUNEIFORM SIGN LIMMU2 +121FA ; [.4BAF.0020.0002] # CUNEIFORM SIGN LISH +121FB ; [.4BB0.0020.0002] # CUNEIFORM SIGN LU +121FC ; [.4BB1.0020.0002] # CUNEIFORM SIGN LU TIMES BAD +121FD ; [.4BB2.0020.0002] # CUNEIFORM SIGN LU2 +121FE ; [.4BB3.0020.0002] # CUNEIFORM SIGN LU2 TIMES AL +121FF ; [.4BB4.0020.0002] # CUNEIFORM SIGN LU2 TIMES BAD +12200 ; [.4BB5.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 +12201 ; [.4BB6.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU +12202 ; [.4BB7.0020.0002] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU +12203 ; [.4BB8.0020.0002] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD +12204 ; [.4BB9.0020.0002] # CUNEIFORM SIGN LU2 TIMES IM +12205 ; [.4BBA.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD2 +12206 ; [.4BBB.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 +12207 ; [.4BBC.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH +12208 ; [.4BBD.0020.0002] # CUNEIFORM SIGN LU2 TIMES KI +12209 ; [.4BBE.0020.0002] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH +1220A ; [.4BBF.0020.0002] # CUNEIFORM SIGN LU2 TIMES LAGAB +1220B ; [.4BC0.0020.0002] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN +1220C ; [.4BC1.0020.0002] # CUNEIFORM SIGN LU2 TIMES NE +1220D ; [.4BC2.0020.0002] # CUNEIFORM SIGN LU2 TIMES NU +1220E ; [.4BC3.0020.0002] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH +1220F ; [.4BC4.0020.0002] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU +12210 ; [.4BC5.0020.0002] # CUNEIFORM SIGN LU2 TIMES TUG2 +12211 ; [.4BC6.0020.0002] # CUNEIFORM SIGN LU2 TENU +12212 ; [.4BC7.0020.0002] # CUNEIFORM SIGN LU2 CROSSING LU2 +12213 ; [.4BC8.0020.0002] # CUNEIFORM SIGN LU2 OPPOSING LU2 +12214 ; [.4BC9.0020.0002] # CUNEIFORM SIGN LU2 SQUARED +12215 ; [.4BCA.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG +12216 ; [.4BCB.0020.0002] # CUNEIFORM SIGN LU3 +12217 ; [.4BCC.0020.0002] # CUNEIFORM SIGN LUGAL +12218 ; [.4BCD.0020.0002] # CUNEIFORM SIGN LUGAL OVER LUGAL +12219 ; [.4BCE.0020.0002] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL +1221A ; [.4BCF.0020.0002] # CUNEIFORM SIGN LUGAL SHESHIG +1221B ; [.4BD0.0020.0002] # CUNEIFORM SIGN LUH +1221C ; [.4BD1.0020.0002] # CUNEIFORM SIGN LUL +1221D ; [.4BD2.0020.0002] # CUNEIFORM SIGN LUM +1221E ; [.4BD3.0020.0002] # CUNEIFORM SIGN LUM OVER LUM +1221F ; [.4BD4.0020.0002] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR +12220 ; [.4BD5.0020.0002] # CUNEIFORM SIGN MA +12221 ; [.4BD6.0020.0002] # CUNEIFORM SIGN MA TIMES TAK4 +12222 ; [.4BD7.0020.0002] # CUNEIFORM SIGN MA GUNU +12223 ; [.4BD8.0020.0002] # CUNEIFORM SIGN MA2 +12224 ; [.4BD9.0020.0002] # CUNEIFORM SIGN MAH +12225 ; [.4BDA.0020.0002] # CUNEIFORM SIGN MAR +12226 ; [.4BDB.0020.0002] # CUNEIFORM SIGN MASH +12227 ; [.4BDC.0020.0002] # CUNEIFORM SIGN MASH2 +12228 ; [.4BDD.0020.0002] # CUNEIFORM SIGN ME +12229 ; [.4BDE.0020.0002] # CUNEIFORM SIGN MES +1222A ; [.4BDF.0020.0002] # CUNEIFORM SIGN MI +1222B ; [.4BE0.0020.0002] # CUNEIFORM SIGN MIN +1222C ; [.4BE1.0020.0002] # CUNEIFORM SIGN MU +1222D ; [.4BE2.0020.0002] # CUNEIFORM SIGN MU OVER MU +1222E ; [.4BE3.0020.0002] # CUNEIFORM SIGN MUG +1222F ; [.4BE4.0020.0002] # CUNEIFORM SIGN MUG GUNU +12230 ; [.4BE5.0020.0002] # CUNEIFORM SIGN MUNSUB +12231 ; [.4BE6.0020.0002] # CUNEIFORM SIGN MURGU2 +12232 ; [.4BE7.0020.0002] # CUNEIFORM SIGN MUSH +12233 ; [.4BE8.0020.0002] # CUNEIFORM SIGN MUSH TIMES A +12234 ; [.4BE9.0020.0002] # CUNEIFORM SIGN MUSH TIMES KUR +12235 ; [.4BEA.0020.0002] # CUNEIFORM SIGN MUSH TIMES ZA +12236 ; [.4BEB.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH +12237 ; [.4BEC.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA +12238 ; [.4BED.0020.0002] # CUNEIFORM SIGN MUSH CROSSING MUSH +12239 ; [.4BEE.0020.0002] # CUNEIFORM SIGN MUSH3 +1223A ; [.4BEF.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A +1223B ; [.4BF0.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI +1223C ; [.4BF1.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES DI +1223D ; [.4BF2.0020.0002] # CUNEIFORM SIGN MUSH3 GUNU +1223E ; [.4BF3.0020.0002] # CUNEIFORM SIGN NA +1223F ; [.4BF4.0020.0002] # CUNEIFORM SIGN NA2 +12240 ; [.4BF5.0020.0002] # CUNEIFORM SIGN NAGA +12241 ; [.4BF6.0020.0002] # CUNEIFORM SIGN NAGA INVERTED +12242 ; [.4BF7.0020.0002] # CUNEIFORM SIGN NAGA TIMES SHU TENU +12243 ; [.4BF8.0020.0002] # CUNEIFORM SIGN NAGA OPPOSING NAGA +12244 ; [.4BF9.0020.0002] # CUNEIFORM SIGN NAGAR +12245 ; [.4BFA.0020.0002] # CUNEIFORM SIGN NAM NUTILLU +12246 ; [.4BFB.0020.0002] # CUNEIFORM SIGN NAM +12247 ; [.4BFC.0020.0002] # CUNEIFORM SIGN NAM2 +12248 ; [.4BFD.0020.0002] # CUNEIFORM SIGN NE +12249 ; [.4BFE.0020.0002] # CUNEIFORM SIGN NE TIMES A +1224A ; [.4BFF.0020.0002] # CUNEIFORM SIGN NE TIMES UD +1224B ; [.4C00.0020.0002] # CUNEIFORM SIGN NE SHESHIG +1224C ; [.4C01.0020.0002] # CUNEIFORM SIGN NI +1224D ; [.4C02.0020.0002] # CUNEIFORM SIGN NI TIMES E +1224E ; [.4C03.0020.0002] # CUNEIFORM SIGN NI2 +1224F ; [.4C04.0020.0002] # CUNEIFORM SIGN NIM +12250 ; [.4C05.0020.0002] # CUNEIFORM SIGN NIM TIMES GAN2 TENU +12251 ; [.4C06.0020.0002] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU +12252 ; [.4C07.0020.0002] # CUNEIFORM SIGN NINDA2 +12253 ; [.4C08.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES AN +12254 ; [.4C09.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH +12255 ; [.4C0A.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH +12256 ; [.4C0B.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUD +12257 ; [.4C0C.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU +12258 ; [.4C0D.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NE +12259 ; [.4C0E.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NUN +1225A ; [.4C0F.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE +1225B ; [.4C10.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN +1225C ; [.4C11.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH +1225D ; [.4C12.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH +1225E ; [.4C13.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH +1225F ; [.4C14.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES USH +12260 ; [.4C15.0020.0002] # CUNEIFORM SIGN NISAG +12261 ; [.4C16.0020.0002] # CUNEIFORM SIGN NU +12262 ; [.4C17.0020.0002] # CUNEIFORM SIGN NU11 +122D4 ; [.4C18.0020.0002] # CUNEIFORM SIGN SHIR TENU +122D5 ; [.4C19.0020.0002] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR +12263 ; [.4C1A.0020.0002] # CUNEIFORM SIGN NUN +12264 ; [.4C1B.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES GAR +12265 ; [.4C1C.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES MASH +12266 ; [.4C1D.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL +12267 ; [.4C1E.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL +12268 ; [.4C1F.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES USH +12269 ; [.4C20.0020.0002] # CUNEIFORM SIGN NUN TENU +1226A ; [.4C21.0020.0002] # CUNEIFORM SIGN NUN OVER NUN +1226B ; [.4C22.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN +1226C ; [.4C23.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR +1226D ; [.4C24.0020.0002] # CUNEIFORM SIGN NUNUZ +1226E ; [.4C25.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB +1226F ; [.4C26.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI +12270 ; [.4C27.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG +12271 ; [.4C28.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD +12272 ; [.4C29.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU +12273 ; [.4C2A.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3 +12274 ; [.4C2B.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA +12275 ; [.4C2C.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE +12276 ; [.4C2D.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3 +12277 ; [.4C2E.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2 +12278 ; [.4C2F.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI +12279 ; [.4C30.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U +1227A ; [.4C31.0020.0002] # CUNEIFORM SIGN PA +1227B ; [.4C32.0020.0002] # CUNEIFORM SIGN PAD +1227C ; [.4C33.0020.0002] # CUNEIFORM SIGN PAN +1227D ; [.4C34.0020.0002] # CUNEIFORM SIGN PAP +1227E ; [.4C35.0020.0002] # CUNEIFORM SIGN PESH2 +1227F ; [.4C36.0020.0002] # CUNEIFORM SIGN PI +12280 ; [.4C37.0020.0002] # CUNEIFORM SIGN PI TIMES A +12281 ; [.4C38.0020.0002] # CUNEIFORM SIGN PI TIMES AB +12282 ; [.4C39.0020.0002] # CUNEIFORM SIGN PI TIMES BI +12283 ; [.4C3A.0020.0002] # CUNEIFORM SIGN PI TIMES BU +12284 ; [.4C3B.0020.0002] # CUNEIFORM SIGN PI TIMES E +12285 ; [.4C3C.0020.0002] # CUNEIFORM SIGN PI TIMES I +12286 ; [.4C3D.0020.0002] # CUNEIFORM SIGN PI TIMES IB +12287 ; [.4C3E.0020.0002] # CUNEIFORM SIGN PI TIMES U +12288 ; [.4C3F.0020.0002] # CUNEIFORM SIGN PI TIMES U2 +12289 ; [.4C40.0020.0002] # CUNEIFORM SIGN PI CROSSING PI +1228A ; [.4C41.0020.0002] # CUNEIFORM SIGN PIRIG +1228B ; [.4C42.0020.0002] # CUNEIFORM SIGN PIRIG TIMES KAL +1228C ; [.4C43.0020.0002] # CUNEIFORM SIGN PIRIG TIMES UD +1228D ; [.4C44.0020.0002] # CUNEIFORM SIGN PIRIG TIMES ZA +1228E ; [.4C45.0020.0002] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG +1228F ; [.4C46.0020.0002] # CUNEIFORM SIGN RA +12290 ; [.4C47.0020.0002] # CUNEIFORM SIGN RAB +12291 ; [.4C48.0020.0002] # CUNEIFORM SIGN RI +12292 ; [.4C49.0020.0002] # CUNEIFORM SIGN RU +12293 ; [.4C4A.0020.0002] # CUNEIFORM SIGN SA +12294 ; [.4C4B.0020.0002] # CUNEIFORM SIGN SAG NUTILLU +12295 ; [.4C4C.0020.0002] # CUNEIFORM SIGN SAG +12296 ; [.4C4D.0020.0002] # CUNEIFORM SIGN SAG TIMES A +12297 ; [.4C4E.0020.0002] # CUNEIFORM SIGN SAG TIMES DU +12298 ; [.4C4F.0020.0002] # CUNEIFORM SIGN SAG TIMES DUB +12299 ; [.4C50.0020.0002] # CUNEIFORM SIGN SAG TIMES HA +1229A ; [.4C51.0020.0002] # CUNEIFORM SIGN SAG TIMES KAK +1229B ; [.4C52.0020.0002] # CUNEIFORM SIGN SAG TIMES KUR +1229C ; [.4C53.0020.0002] # CUNEIFORM SIGN SAG TIMES LUM +1229D ; [.4C54.0020.0002] # CUNEIFORM SIGN SAG TIMES MI +1229E ; [.4C55.0020.0002] # CUNEIFORM SIGN SAG TIMES NUN +1229F ; [.4C56.0020.0002] # CUNEIFORM SIGN SAG TIMES SAL +122A0 ; [.4C57.0020.0002] # CUNEIFORM SIGN SAG TIMES SHID +122A1 ; [.4C58.0020.0002] # CUNEIFORM SIGN SAG TIMES TAB +122A2 ; [.4C59.0020.0002] # CUNEIFORM SIGN SAG TIMES U2 +122A3 ; [.4C5A.0020.0002] # CUNEIFORM SIGN SAG TIMES UB +122A4 ; [.4C5B.0020.0002] # CUNEIFORM SIGN SAG TIMES UM +122A5 ; [.4C5C.0020.0002] # CUNEIFORM SIGN SAG TIMES UR +122A6 ; [.4C5D.0020.0002] # CUNEIFORM SIGN SAG TIMES USH +122A7 ; [.4C5E.0020.0002] # CUNEIFORM SIGN SAG OVER SAG +122A8 ; [.4C5F.0020.0002] # CUNEIFORM SIGN SAG GUNU +122A9 ; [.4C60.0020.0002] # CUNEIFORM SIGN SAL +122AA ; [.4C61.0020.0002] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2 +122AB ; [.4C62.0020.0002] # CUNEIFORM SIGN SANGA2 +122AC ; [.4C63.0020.0002] # CUNEIFORM SIGN SAR +122AD ; [.4C64.0020.0002] # CUNEIFORM SIGN SHA +122AE ; [.4C65.0020.0002] # CUNEIFORM SIGN SHA3 +122AF ; [.4C66.0020.0002] # CUNEIFORM SIGN SHA3 TIMES A +122B0 ; [.4C67.0020.0002] # CUNEIFORM SIGN SHA3 TIMES BAD +122B1 ; [.4C68.0020.0002] # CUNEIFORM SIGN SHA3 TIMES GISH +122B2 ; [.4C69.0020.0002] # CUNEIFORM SIGN SHA3 TIMES NE +122B3 ; [.4C6A.0020.0002] # CUNEIFORM SIGN SHA3 TIMES SHU2 +122B4 ; [.4C6B.0020.0002] # CUNEIFORM SIGN SHA3 TIMES TUR +122B5 ; [.4C6C.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U +122B6 ; [.4C6D.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U PLUS A +122B7 ; [.4C6E.0020.0002] # CUNEIFORM SIGN SHA6 +122B8 ; [.4C6F.0020.0002] # CUNEIFORM SIGN SHAB6 +122B9 ; [.4C70.0020.0002] # CUNEIFORM SIGN SHAR2 +122BA ; [.4C71.0020.0002] # CUNEIFORM SIGN SHE +122BB ; [.4C72.0020.0002] # CUNEIFORM SIGN SHE HU +122BC ; [.4C73.0020.0002] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR +122BD ; [.4C74.0020.0002] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR +122BE ; [.4C75.0020.0002] # CUNEIFORM SIGN SHEG9 +122BF ; [.4C76.0020.0002] # CUNEIFORM SIGN SHEN +122C0 ; [.4C77.0020.0002] # CUNEIFORM SIGN SHESH +122C1 ; [.4C78.0020.0002] # CUNEIFORM SIGN SHESH2 +122C2 ; [.4C79.0020.0002] # CUNEIFORM SIGN SHESHLAM +122C3 ; [.4C7A.0020.0002] # CUNEIFORM SIGN SHID +122C4 ; [.4C7B.0020.0002] # CUNEIFORM SIGN SHID TIMES A +122C5 ; [.4C7C.0020.0002] # CUNEIFORM SIGN SHID TIMES IM +122C6 ; [.4C7D.0020.0002] # CUNEIFORM SIGN SHIM +122C7 ; [.4C7E.0020.0002] # CUNEIFORM SIGN SHIM TIMES A +122C8 ; [.4C7F.0020.0002] # CUNEIFORM SIGN SHIM TIMES BAL +122C9 ; [.4C80.0020.0002] # CUNEIFORM SIGN SHIM TIMES BULUG +122CA ; [.4C81.0020.0002] # CUNEIFORM SIGN SHIM TIMES DIN +122CB ; [.4C82.0020.0002] # CUNEIFORM SIGN SHIM TIMES GAR +122CC ; [.4C83.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI +122CD ; [.4C84.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI GUNU +122CE ; [.4C85.0020.0002] # CUNEIFORM SIGN SHIM TIMES KUSHU2 +122CF ; [.4C86.0020.0002] # CUNEIFORM SIGN SHIM TIMES LUL +122D0 ; [.4C87.0020.0002] # CUNEIFORM SIGN SHIM TIMES MUG +122D1 ; [.4C88.0020.0002] # CUNEIFORM SIGN SHIM TIMES SAL +122D2 ; [.4C89.0020.0002] # CUNEIFORM SIGN SHINIG +122D3 ; [.4C8A.0020.0002] # CUNEIFORM SIGN SHIR +122D6 ; [.4C8B.0020.0002] # CUNEIFORM SIGN SHITA +122D7 ; [.4C8C.0020.0002] # CUNEIFORM SIGN SHU +122D8 ; [.4C8D.0020.0002] # CUNEIFORM SIGN SHU OVER INVERTED SHU +122D9 ; [.4C8E.0020.0002] # CUNEIFORM SIGN SHU2 +122DA ; [.4C8F.0020.0002] # CUNEIFORM SIGN SHUBUR +122DB ; [.4C90.0020.0002] # CUNEIFORM SIGN SI +122DC ; [.4C91.0020.0002] # CUNEIFORM SIGN SI GUNU +122DD ; [.4C92.0020.0002] # CUNEIFORM SIGN SIG +122DE ; [.4C93.0020.0002] # CUNEIFORM SIGN SIG4 +122DF ; [.4C94.0020.0002] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2 +122E0 ; [.4C95.0020.0002] # CUNEIFORM SIGN SIK2 +122E1 ; [.4C96.0020.0002] # CUNEIFORM SIGN SILA3 +122E2 ; [.4C97.0020.0002] # CUNEIFORM SIGN SU +122E3 ; [.4C98.0020.0002] # CUNEIFORM SIGN SU OVER SU +122E4 ; [.4C99.0020.0002] # CUNEIFORM SIGN SUD +122E5 ; [.4C9A.0020.0002] # CUNEIFORM SIGN SUD2 +122E6 ; [.4C9B.0020.0002] # CUNEIFORM SIGN SUHUR +122E7 ; [.4C9C.0020.0002] # CUNEIFORM SIGN SUM +122E8 ; [.4C9D.0020.0002] # CUNEIFORM SIGN SUMASH +122E9 ; [.4C9E.0020.0002] # CUNEIFORM SIGN SUR +122EA ; [.4C9F.0020.0002] # CUNEIFORM SIGN SUR9 +122EB ; [.4CA0.0020.0002] # CUNEIFORM SIGN TA +122EC ; [.4CA1.0020.0002] # CUNEIFORM SIGN TA ASTERISK +122ED ; [.4CA2.0020.0002] # CUNEIFORM SIGN TA TIMES HI +122EE ; [.4CA3.0020.0002] # CUNEIFORM SIGN TA TIMES MI +122EF ; [.4CA4.0020.0002] # CUNEIFORM SIGN TA GUNU +122F0 ; [.4CA5.0020.0002] # CUNEIFORM SIGN TAB +122F1 ; [.4CA6.0020.0002] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH +122F2 ; [.4CA7.0020.0002] # CUNEIFORM SIGN TAB SQUARED +122F3 ; [.4CA8.0020.0002] # CUNEIFORM SIGN TAG +122F4 ; [.4CA9.0020.0002] # CUNEIFORM SIGN TAG TIMES BI +122F5 ; [.4CAA.0020.0002] # CUNEIFORM SIGN TAG TIMES GUD +122F6 ; [.4CAB.0020.0002] # CUNEIFORM SIGN TAG TIMES SHE +122F7 ; [.4CAC.0020.0002] # CUNEIFORM SIGN TAG TIMES SHU +122F8 ; [.4CAD.0020.0002] # CUNEIFORM SIGN TAG TIMES TUG2 +122F9 ; [.4CAE.0020.0002] # CUNEIFORM SIGN TAG TIMES UD +122FA ; [.4CAF.0020.0002] # CUNEIFORM SIGN TAK4 +122FB ; [.4CB0.0020.0002] # CUNEIFORM SIGN TAR +122FC ; [.4CB1.0020.0002] # CUNEIFORM SIGN TE +122FD ; [.4CB2.0020.0002] # CUNEIFORM SIGN TE GUNU +122FE ; [.4CB3.0020.0002] # CUNEIFORM SIGN TI +122FF ; [.4CB4.0020.0002] # CUNEIFORM SIGN TI TENU +12300 ; [.4CB5.0020.0002] # CUNEIFORM SIGN TIL +12301 ; [.4CB6.0020.0002] # CUNEIFORM SIGN TIR +12302 ; [.4CB7.0020.0002] # CUNEIFORM SIGN TIR TIMES TAK4 +12303 ; [.4CB8.0020.0002] # CUNEIFORM SIGN TIR OVER TIR +12304 ; [.4CB9.0020.0002] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR +12305 ; [.4CBA.0020.0002] # CUNEIFORM SIGN TU +12306 ; [.4CBB.0020.0002] # CUNEIFORM SIGN TUG2 +12307 ; [.4CBC.0020.0002] # CUNEIFORM SIGN TUK +12308 ; [.4CBD.0020.0002] # CUNEIFORM SIGN TUM +12309 ; [.4CBE.0020.0002] # CUNEIFORM SIGN TUR +1230A ; [.4CBF.0020.0002] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA +1230B ; [.4CC0.0020.0002] # CUNEIFORM SIGN U +1230C ; [.4CC1.0020.0002] # CUNEIFORM SIGN U GUD +1230D ; [.4CC2.0020.0002] # CUNEIFORM SIGN U U U +1230E ; [.4CC3.0020.0002] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR +1230F ; [.4CC4.0020.0002] # CUNEIFORM SIGN U OVER U SUR OVER SUR +12310 ; [.4CC5.0020.0002] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED +12311 ; [.4CC6.0020.0002] # CUNEIFORM SIGN U2 +12312 ; [.4CC7.0020.0002] # CUNEIFORM SIGN UB +12313 ; [.4CC8.0020.0002] # CUNEIFORM SIGN UD +12314 ; [.4CC9.0020.0002] # CUNEIFORM SIGN UD KUSHU2 +12315 ; [.4CCA.0020.0002] # CUNEIFORM SIGN UD TIMES BAD +12316 ; [.4CCB.0020.0002] # CUNEIFORM SIGN UD TIMES MI +12317 ; [.4CCC.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U +12318 ; [.4CCD.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU +12319 ; [.4CCE.0020.0002] # CUNEIFORM SIGN UD GUNU +1231A ; [.4CCF.0020.0002] # CUNEIFORM SIGN UD SHESHIG +1231B ; [.4CD0.0020.0002] # CUNEIFORM SIGN UD SHESHIG TIMES BAD +1231C ; [.4CD1.0020.0002] # CUNEIFORM SIGN UDUG +1231D ; [.4CD2.0020.0002] # CUNEIFORM SIGN UM +1231E ; [.4CD3.0020.0002] # CUNEIFORM SIGN UM TIMES LAGAB +1231F ; [.4CD4.0020.0002] # CUNEIFORM SIGN UM TIMES ME PLUS DA +12320 ; [.4CD5.0020.0002] # CUNEIFORM SIGN UM TIMES SHA3 +12321 ; [.4CD6.0020.0002] # CUNEIFORM SIGN UM TIMES U +12322 ; [.4CD7.0020.0002] # CUNEIFORM SIGN UMBIN +12323 ; [.4CD8.0020.0002] # CUNEIFORM SIGN UMUM +12324 ; [.4CD9.0020.0002] # CUNEIFORM SIGN UMUM TIMES KASKAL +12325 ; [.4CDA.0020.0002] # CUNEIFORM SIGN UMUM TIMES PA +12326 ; [.4CDB.0020.0002] # CUNEIFORM SIGN UN +12327 ; [.4CDC.0020.0002] # CUNEIFORM SIGN UN GUNU +12328 ; [.4CDD.0020.0002] # CUNEIFORM SIGN UR +12329 ; [.4CDE.0020.0002] # CUNEIFORM SIGN UR CROSSING UR +1232A ; [.4CDF.0020.0002] # CUNEIFORM SIGN UR SHESHIG +1232B ; [.4CE0.0020.0002] # CUNEIFORM SIGN UR2 +1232C ; [.4CE1.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS HA +1232D ; [.4CE2.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS NA +1232E ; [.4CE3.0020.0002] # CUNEIFORM SIGN UR2 TIMES AL +1232F ; [.4CE4.0020.0002] # CUNEIFORM SIGN UR2 TIMES HA +12330 ; [.4CE5.0020.0002] # CUNEIFORM SIGN UR2 TIMES NUN +12331 ; [.4CE6.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 +12332 ; [.4CE7.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH +12333 ; [.4CE8.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI +12334 ; [.4CE9.0020.0002] # CUNEIFORM SIGN UR4 +12335 ; [.4CEA.0020.0002] # CUNEIFORM SIGN URI +12336 ; [.4CEB.0020.0002] # CUNEIFORM SIGN URI3 +12337 ; [.4CEC.0020.0002] # CUNEIFORM SIGN URU +12338 ; [.4CED.0020.0002] # CUNEIFORM SIGN URU TIMES A +12339 ; [.4CEE.0020.0002] # CUNEIFORM SIGN URU TIMES ASHGAB +1233A ; [.4CEF.0020.0002] # CUNEIFORM SIGN URU TIMES BAR +1233B ; [.4CF0.0020.0002] # CUNEIFORM SIGN URU TIMES DUN +1233C ; [.4CF1.0020.0002] # CUNEIFORM SIGN URU TIMES GA +1233D ; [.4CF2.0020.0002] # CUNEIFORM SIGN URU TIMES GAL +1233E ; [.4CF3.0020.0002] # CUNEIFORM SIGN URU TIMES GAN2 TENU +1233F ; [.4CF4.0020.0002] # CUNEIFORM SIGN URU TIMES GAR +12340 ; [.4CF5.0020.0002] # CUNEIFORM SIGN URU TIMES GU +12341 ; [.4CF6.0020.0002] # CUNEIFORM SIGN URU TIMES HA +12342 ; [.4CF7.0020.0002] # CUNEIFORM SIGN URU TIMES IGI +12343 ; [.4CF8.0020.0002] # CUNEIFORM SIGN URU TIMES IM +12344 ; [.4CF9.0020.0002] # CUNEIFORM SIGN URU TIMES ISH +12345 ; [.4CFA.0020.0002] # CUNEIFORM SIGN URU TIMES KI +12346 ; [.4CFB.0020.0002] # CUNEIFORM SIGN URU TIMES LUM +12347 ; [.4CFC.0020.0002] # CUNEIFORM SIGN URU TIMES MIN +12348 ; [.4CFD.0020.0002] # CUNEIFORM SIGN URU TIMES PA +12349 ; [.4CFE.0020.0002] # CUNEIFORM SIGN URU TIMES SHE +1234A ; [.4CFF.0020.0002] # CUNEIFORM SIGN URU TIMES SIG4 +1234B ; [.4D00.0020.0002] # CUNEIFORM SIGN URU TIMES TU +1234C ; [.4D01.0020.0002] # CUNEIFORM SIGN URU TIMES U PLUS GUD +1234D ; [.4D02.0020.0002] # CUNEIFORM SIGN URU TIMES UD +1234E ; [.4D03.0020.0002] # CUNEIFORM SIGN URU TIMES URUDA +1234F ; [.4D04.0020.0002] # CUNEIFORM SIGN URUDA +12350 ; [.4D05.0020.0002] # CUNEIFORM SIGN URUDA TIMES U +12351 ; [.4D06.0020.0002] # CUNEIFORM SIGN USH +12352 ; [.4D07.0020.0002] # CUNEIFORM SIGN USH TIMES A +12353 ; [.4D08.0020.0002] # CUNEIFORM SIGN USH TIMES KU +12354 ; [.4D09.0020.0002] # CUNEIFORM SIGN USH TIMES KUR +12355 ; [.4D0A.0020.0002] # CUNEIFORM SIGN USH TIMES TAK4 +12356 ; [.4D0B.0020.0002] # CUNEIFORM SIGN USHX +12357 ; [.4D0C.0020.0002] # CUNEIFORM SIGN USH2 +12358 ; [.4D0D.0020.0002] # CUNEIFORM SIGN USHUMX +12359 ; [.4D0E.0020.0002] # CUNEIFORM SIGN UTUKI +1235A ; [.4D0F.0020.0002] # CUNEIFORM SIGN UZ3 +1235B ; [.4D10.0020.0002] # CUNEIFORM SIGN UZ3 TIMES KASKAL +1235C ; [.4D11.0020.0002] # CUNEIFORM SIGN UZU +1235D ; [.4D12.0020.0002] # CUNEIFORM SIGN ZA +1235E ; [.4D13.0020.0002] # CUNEIFORM SIGN ZA TENU +1235F ; [.4D14.0020.0002] # CUNEIFORM SIGN ZA SQUARED TIMES KUR +12360 ; [.4D15.0020.0002] # CUNEIFORM SIGN ZAG +12361 ; [.4D16.0020.0002] # CUNEIFORM SIGN ZAMX +12362 ; [.4D17.0020.0002] # CUNEIFORM SIGN ZE2 +12363 ; [.4D18.0020.0002] # CUNEIFORM SIGN ZI +12364 ; [.4D19.0020.0002] # CUNEIFORM SIGN ZI OVER ZI +12365 ; [.4D1A.0020.0002] # CUNEIFORM SIGN ZI3 +12366 ; [.4D1B.0020.0002] # CUNEIFORM SIGN ZIB +12367 ; [.4D1C.0020.0002] # CUNEIFORM SIGN ZIB KABA TENU +12368 ; [.4D1D.0020.0002] # CUNEIFORM SIGN ZIG +12369 ; [.4D1E.0020.0002] # CUNEIFORM SIGN ZIZ2 +1236A ; [.4D1F.0020.0002] # CUNEIFORM SIGN ZU +1236B ; [.4D20.0020.0002] # CUNEIFORM SIGN ZU5 +1236C ; [.4D21.0020.0002] # CUNEIFORM SIGN ZU5 TIMES A +1236D ; [.4D22.0020.0002] # CUNEIFORM SIGN ZUBUR +1236E ; [.4D23.0020.0002] # CUNEIFORM SIGN ZUM +1236F ; [.4D24.0020.0002] # CUNEIFORM SIGN KAP ELAMITE +12370 ; [.4D25.0020.0002] # CUNEIFORM SIGN AB TIMES NUN +12371 ; [.4D26.0020.0002] # CUNEIFORM SIGN AB2 TIMES A +12372 ; [.4D27.0020.0002] # CUNEIFORM SIGN AMAR TIMES KUG +12373 ; [.4D28.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH +12374 ; [.4D29.0020.0002] # CUNEIFORM SIGN DAG3 +12375 ; [.4D2A.0020.0002] # CUNEIFORM SIGN DISH PLUS SHU +12376 ; [.4D2B.0020.0002] # CUNEIFORM SIGN DUB TIMES SHE +12377 ; [.4D2C.0020.0002] # CUNEIFORM SIGN EZEN TIMES GUD +12378 ; [.4D2D.0020.0002] # CUNEIFORM SIGN EZEN TIMES SHE +12379 ; [.4D2E.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A +1237A ; [.4D2F.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 +1237B ; [.4D30.0020.0002] # CUNEIFORM SIGN GE22 +1237C ; [.4D31.0020.0002] # CUNEIFORM SIGN GIG +1237D ; [.4D32.0020.0002] # CUNEIFORM SIGN HUSH +1237E ; [.4D33.0020.0002] # CUNEIFORM SIGN KA TIMES ANSHE +1237F ; [.4D34.0020.0002] # CUNEIFORM SIGN KA TIMES ASH3 +12380 ; [.4D35.0020.0002] # CUNEIFORM SIGN KA TIMES GISH +12381 ; [.4D36.0020.0002] # CUNEIFORM SIGN KA TIMES GUD +12382 ; [.4D37.0020.0002] # CUNEIFORM SIGN KA TIMES HI TIMES ASH2 +12383 ; [.4D38.0020.0002] # CUNEIFORM SIGN KA TIMES LUM +12384 ; [.4D39.0020.0002] # CUNEIFORM SIGN KA TIMES PA +12385 ; [.4D3A.0020.0002] # CUNEIFORM SIGN KA TIMES SHUL +12386 ; [.4D3B.0020.0002] # CUNEIFORM SIGN KA TIMES TU +12387 ; [.4D3C.0020.0002] # CUNEIFORM SIGN KA TIMES UR2 +12388 ; [.4D3D.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GI +12389 ; [.4D3E.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG TIMES BAD +1238A ; [.4D3F.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL +1238B ; [.4D40.0020.0002] # CUNEIFORM SIGN LU2 TIMES SHU +1238C ; [.4D41.0020.0002] # CUNEIFORM SIGN MESH +1238D ; [.4D42.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES ZA +1238E ; [.4D43.0020.0002] # CUNEIFORM SIGN NA4 +1238F ; [.4D44.0020.0002] # CUNEIFORM SIGN NIN +12390 ; [.4D45.0020.0002] # CUNEIFORM SIGN NIN9 +12391 ; [.4D46.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES BAL +12392 ; [.4D47.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GI +12393 ; [.4D48.0020.0002] # CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES +12394 ; [.4D49.0020.0002] # CUNEIFORM SIGN PESH2 ASTERISK +12395 ; [.4D4A.0020.0002] # CUNEIFORM SIGN PIR2 +12396 ; [.4D4B.0020.0002] # CUNEIFORM SIGN SAG TIMES IGI GUNU +12397 ; [.4D4C.0020.0002] # CUNEIFORM SIGN TI2 +12398 ; [.4D4D.0020.0002] # CUNEIFORM SIGN UM TIMES ME +12399 ; [.4D4E.0020.0002] # CUNEIFORM SIGN U U +12480 ; [.4D4F.0020.0002] # CUNEIFORM SIGN AB TIMES NUN TENU +12481 ; [.4D50.0020.0002] # CUNEIFORM SIGN AB TIMES SHU2 +12482 ; [.4D51.0020.0002] # CUNEIFORM SIGN AD TIMES ESH2 +12483 ; [.4D52.0020.0002] # CUNEIFORM SIGN BAD TIMES DISH TENU +12484 ; [.4D53.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES AB2 +12485 ; [.4D54.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES NI +12486 ; [.4D55.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES ZA +12487 ; [.4D56.0020.0002] # CUNEIFORM SIGN BU OVER BU TIMES NA2 +12488 ; [.4D57.0020.0002] # CUNEIFORM SIGN DA TIMES TAK4 +12489 ; [.4D58.0020.0002] # CUNEIFORM SIGN DAG TIMES KUR +1248A ; [.4D59.0020.0002] # CUNEIFORM SIGN DIM TIMES IGI +1248B ; [.4D5A.0020.0002] # CUNEIFORM SIGN DIM TIMES U U U +1248C ; [.4D5B.0020.0002] # CUNEIFORM SIGN DIM2 TIMES UD +1248D ; [.4D5C.0020.0002] # CUNEIFORM SIGN DUG TIMES ANSHE +1248E ; [.4D5D.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH +1248F ; [.4D5E.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH AT LEFT +12490 ; [.4D5F.0020.0002] # CUNEIFORM SIGN DUG TIMES DIN +12491 ; [.4D60.0020.0002] # CUNEIFORM SIGN DUG TIMES DUN +12492 ; [.4D61.0020.0002] # CUNEIFORM SIGN DUG TIMES ERIN2 +12493 ; [.4D62.0020.0002] # CUNEIFORM SIGN DUG TIMES GA +12494 ; [.4D63.0020.0002] # CUNEIFORM SIGN DUG TIMES GI +12495 ; [.4D64.0020.0002] # CUNEIFORM SIGN DUG TIMES GIR2 GUNU +12496 ; [.4D65.0020.0002] # CUNEIFORM SIGN DUG TIMES GISH +12497 ; [.4D66.0020.0002] # CUNEIFORM SIGN DUG TIMES HA +12498 ; [.4D67.0020.0002] # CUNEIFORM SIGN DUG TIMES HI +12499 ; [.4D68.0020.0002] # CUNEIFORM SIGN DUG TIMES IGI GUNU +1249A ; [.4D69.0020.0002] # CUNEIFORM SIGN DUG TIMES KASKAL +1249B ; [.4D6A.0020.0002] # CUNEIFORM SIGN DUG TIMES KUR +1249C ; [.4D6B.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 +1249D ; [.4D6C.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL +1249E ; [.4D6D.0020.0002] # CUNEIFORM SIGN DUG TIMES LAK-020 +1249F ; [.4D6E.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM +124A0 ; [.4D6F.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM TIMES KUR +124A1 ; [.4D70.0020.0002] # CUNEIFORM SIGN DUG TIMES LUH PLUS GISH +124A2 ; [.4D71.0020.0002] # CUNEIFORM SIGN DUG TIMES MASH +124A3 ; [.4D72.0020.0002] # CUNEIFORM SIGN DUG TIMES MES +124A4 ; [.4D73.0020.0002] # CUNEIFORM SIGN DUG TIMES MI +124A5 ; [.4D74.0020.0002] # CUNEIFORM SIGN DUG TIMES NI +124A6 ; [.4D75.0020.0002] # CUNEIFORM SIGN DUG TIMES PI +124A7 ; [.4D76.0020.0002] # CUNEIFORM SIGN DUG TIMES SHE +124A8 ; [.4D77.0020.0002] # CUNEIFORM SIGN DUG TIMES SI GUNU +124A9 ; [.4D78.0020.0002] # CUNEIFORM SIGN E2 TIMES KUR +124AA ; [.4D79.0020.0002] # CUNEIFORM SIGN E2 TIMES PAP +124AB ; [.4D7A.0020.0002] # CUNEIFORM SIGN ERIN2 X +124AC ; [.4D7B.0020.0002] # CUNEIFORM SIGN ESH2 CROSSING ESH2 +124AD ; [.4D7C.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ASH +124AE ; [.4D7D.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES HI +124AF ; [.4D7E.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU +124B0 ; [.4D7F.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LA +124B1 ; [.4D80.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LAL +124B2 ; [.4D81.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ME +124B3 ; [.4D82.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES MES +124B4 ; [.4D83.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES SU +124B5 ; [.4D84.0020.0002] # CUNEIFORM SIGN EZEN TIMES SU +124B6 ; [.4D85.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAHAR2 +124B7 ; [.4D86.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM GUNU +124B8 ; [.4D87.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU +124B9 ; [.4D88.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL +124BA ; [.4D89.0020.0002] # CUNEIFORM SIGN GA2 TIMES EREN +124BB ; [.4D8A.0020.0002] # CUNEIFORM SIGN GA2 TIMES GA +124BC ; [.4D8B.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS DI +124BD ; [.4D8C.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS NE +124BE ; [.4D8D.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS A +124BF ; [.4D8E.0020.0002] # CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL +124C0 ; [.4D8F.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM +124C1 ; [.4D90.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR +124C2 ; [.4D91.0020.0002] # CUNEIFORM SIGN GA2 TIMES LUH +124C3 ; [.4D92.0020.0002] # CUNEIFORM SIGN GA2 TIMES MUSH +124C4 ; [.4D93.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE +124C5 ; [.4D94.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS E2 +124C6 ; [.4D95.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS GI +124C7 ; [.4D96.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHIM +124C8 ; [.4D97.0020.0002] # CUNEIFORM SIGN GA2 TIMES ZIZ2 +124C9 ; [.4D98.0020.0002] # CUNEIFORM SIGN GABA ROTATED NINETY DEGREES +124CA ; [.4D99.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES U +124CB ; [.4D9A.0020.0002] # CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH +124CC ; [.4D9B.0020.0002] # CUNEIFORM SIGN GU2 TIMES IGI GUNU +124CD ; [.4D9C.0020.0002] # CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4 +124CE ; [.4D9D.0020.0002] # CUNEIFORM SIGN HA TENU GUNU +124CF ; [.4D9E.0020.0002] # CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH +124D0 ; [.4D9F.0020.0002] # CUNEIFORM SIGN KA TIMES BU +124D1 ; [.4DA0.0020.0002] # CUNEIFORM SIGN KA TIMES KA +124D2 ; [.4DA1.0020.0002] # CUNEIFORM SIGN KA TIMES U U U +124D3 ; [.4DA2.0020.0002] # CUNEIFORM SIGN KA TIMES UR +124D4 ; [.4DA3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU +124D5 ; [.4DA4.0020.0002] # CUNEIFORM SIGN LAK-003 +124D6 ; [.4DA5.0020.0002] # CUNEIFORM SIGN LAK-021 +124D7 ; [.4DA6.0020.0002] # CUNEIFORM SIGN LAK-025 +124D8 ; [.4DA7.0020.0002] # CUNEIFORM SIGN LAK-030 +124D9 ; [.4DA8.0020.0002] # CUNEIFORM SIGN LAK-050 +124DA ; [.4DA9.0020.0002] # CUNEIFORM SIGN LAK-051 +124DB ; [.4DAA.0020.0002] # CUNEIFORM SIGN LAK-062 +124DC ; [.4DAB.0020.0002] # CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU +124DD ; [.4DAC.0020.0002] # CUNEIFORM SIGN LAK-080 +124DE ; [.4DAD.0020.0002] # CUNEIFORM SIGN LAK-081 OVER LAK-081 +124DF ; [.4DAE.0020.0002] # CUNEIFORM SIGN LAK-092 +124E0 ; [.4DAF.0020.0002] # CUNEIFORM SIGN LAK-130 +124E1 ; [.4DB0.0020.0002] # CUNEIFORM SIGN LAK-142 +124E2 ; [.4DB1.0020.0002] # CUNEIFORM SIGN LAK-210 +124E3 ; [.4DB2.0020.0002] # CUNEIFORM SIGN LAK-219 +124E4 ; [.4DB3.0020.0002] # CUNEIFORM SIGN LAK-220 +124E5 ; [.4DB4.0020.0002] # CUNEIFORM SIGN LAK-225 +124E6 ; [.4DB5.0020.0002] # CUNEIFORM SIGN LAK-228 +124E7 ; [.4DB6.0020.0002] # CUNEIFORM SIGN LAK-238 +124E8 ; [.4DB7.0020.0002] # CUNEIFORM SIGN LAK-265 +124E9 ; [.4DB8.0020.0002] # CUNEIFORM SIGN LAK-266 +124EA ; [.4DB9.0020.0002] # CUNEIFORM SIGN LAK-343 +124EB ; [.4DBA.0020.0002] # CUNEIFORM SIGN LAK-347 +124EC ; [.4DBB.0020.0002] # CUNEIFORM SIGN LAK-348 +124ED ; [.4DBC.0020.0002] # CUNEIFORM SIGN LAK-383 +124EE ; [.4DBD.0020.0002] # CUNEIFORM SIGN LAK-384 +124EF ; [.4DBE.0020.0002] # CUNEIFORM SIGN LAK-390 +124F0 ; [.4DBF.0020.0002] # CUNEIFORM SIGN LAK-441 +124F1 ; [.4DC0.0020.0002] # CUNEIFORM SIGN LAK-449 +124F2 ; [.4DC1.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES GU +124F3 ; [.4DC2.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES IGI +124F4 ; [.4DC3.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3 +124F5 ; [.4DC4.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3 +124F6 ; [.4DC5.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA +124F7 ; [.4DC6.0020.0002] # CUNEIFORM SIGN LAK-450 +124F8 ; [.4DC7.0020.0002] # CUNEIFORM SIGN LAK-457 +124F9 ; [.4DC8.0020.0002] # CUNEIFORM SIGN LAK-470 +124FA ; [.4DC9.0020.0002] # CUNEIFORM SIGN LAK-483 +124FB ; [.4DCA.0020.0002] # CUNEIFORM SIGN LAK-490 +124FC ; [.4DCB.0020.0002] # CUNEIFORM SIGN LAK-492 +124FD ; [.4DCC.0020.0002] # CUNEIFORM SIGN LAK-493 +124FE ; [.4DCD.0020.0002] # CUNEIFORM SIGN LAK-495 +124FF ; [.4DCE.0020.0002] # CUNEIFORM SIGN LAK-550 +12500 ; [.4DCF.0020.0002] # CUNEIFORM SIGN LAK-608 +12501 ; [.4DD0.0020.0002] # CUNEIFORM SIGN LAK-617 +12502 ; [.4DD1.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES ASH +12503 ; [.4DD2.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES BAD +12504 ; [.4DD3.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU +12505 ; [.4DD4.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES KU3 +12506 ; [.4DD5.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES LA +12507 ; [.4DD6.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TAR +12508 ; [.4DD7.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TE +12509 ; [.4DD8.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES U2 +1250A ; [.4DD9.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES UD +1250B ; [.4DDA.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES URUDA +1250C ; [.4DDB.0020.0002] # CUNEIFORM SIGN LAK-636 +1250D ; [.4DDC.0020.0002] # CUNEIFORM SIGN LAK-648 +1250E ; [.4DDD.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES DUB +1250F ; [.4DDE.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES GA +12510 ; [.4DDF.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI +12511 ; [.4DE0.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI GUNU +12512 ; [.4DE1.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES NI +12513 ; [.4DE2.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3 +12514 ; [.4DE3.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI +12515 ; [.4DE4.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES UD +12516 ; [.4DE5.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES URUDA +12517 ; [.4DE6.0020.0002] # CUNEIFORM SIGN LAK-724 +12518 ; [.4DE7.0020.0002] # CUNEIFORM SIGN LAK-749 +12519 ; [.4DE8.0020.0002] # CUNEIFORM SIGN LU2 GUNU TIMES ASH +1251A ; [.4DE9.0020.0002] # CUNEIFORM SIGN LU2 TIMES DISH +1251B ; [.4DEA.0020.0002] # CUNEIFORM SIGN LU2 TIMES HAL +1251C ; [.4DEB.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP +1251D ; [.4DEC.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3 +1251E ; [.4DED.0020.0002] # CUNEIFORM SIGN LU2 TIMES TAK4 +1251F ; [.4DEE.0020.0002] # CUNEIFORM SIGN MI PLUS ZA7 +12520 ; [.4DEF.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES GA +12521 ; [.4DF0.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK +12522 ; [.4DF1.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES DIM GUNU +12523 ; [.4DF2.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GISH +12524 ; [.4DF3.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUL +12525 ; [.4DF4.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES HI +12526 ; [.4DF5.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES KESH2 +12527 ; [.4DF6.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES LAK-050 +12528 ; [.4DF7.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES MASH +12529 ; [.4DF8.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP +1252A ; [.4DF9.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U +1252B ; [.4DFA.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U PLUS U +1252C ; [.4DFB.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES URUDA +1252D ; [.4DFC.0020.0002] # CUNEIFORM SIGN SAG GUNU TIMES HA +1252E ; [.4DFD.0020.0002] # CUNEIFORM SIGN SAG TIMES EN +1252F ; [.4DFE.0020.0002] # CUNEIFORM SIGN SAG TIMES SHE AT LEFT +12530 ; [.4DFF.0020.0002] # CUNEIFORM SIGN SAG TIMES TAK4 +12531 ; [.4E00.0020.0002] # CUNEIFORM SIGN SHA6 TENU +12532 ; [.4E01.0020.0002] # CUNEIFORM SIGN SHE OVER SHE +12533 ; [.4E02.0020.0002] # CUNEIFORM SIGN SHE PLUS HUB2 +12534 ; [.4E03.0020.0002] # CUNEIFORM SIGN SHE PLUS NAM2 +12535 ; [.4E04.0020.0002] # CUNEIFORM SIGN SHE PLUS SAR +12536 ; [.4E05.0020.0002] # CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI +12537 ; [.4E06.0020.0002] # CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN +12538 ; [.4E07.0020.0002] # CUNEIFORM SIGN SI TIMES TAK4 +12539 ; [.4E08.0020.0002] # CUNEIFORM SIGN TAK4 PLUS SAG +1253A ; [.4E09.0020.0002] # CUNEIFORM SIGN TUM TIMES GAN2 TENU +1253B ; [.4E0A.0020.0002] # CUNEIFORM SIGN TUM TIMES THREE DISH +1253C ; [.4E0B.0020.0002] # CUNEIFORM SIGN UR2 INVERTED +1253D ; [.4E0C.0020.0002] # CUNEIFORM SIGN UR2 TIMES UD +1253E ; [.4E0D.0020.0002] # CUNEIFORM SIGN URU TIMES DARA3 +1253F ; [.4E0E.0020.0002] # CUNEIFORM SIGN URU TIMES LAK-668 +12540 ; [.4E0F.0020.0002] # CUNEIFORM SIGN URU TIMES LU3 +12541 ; [.4E10.0020.0002] # CUNEIFORM SIGN ZA7 +12542 ; [.4E11.0020.0002] # CUNEIFORM SIGN ZU OVER ZU PLUS SAR +12543 ; [.4E12.0020.0002] # CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000 ; [.4E13.0020.0002] # EGYPTIAN HIEROGLYPH A001 +13001 ; [.4E14.0020.0002] # EGYPTIAN HIEROGLYPH A002 +13002 ; [.4E15.0020.0002] # EGYPTIAN HIEROGLYPH A003 +13003 ; [.4E16.0020.0002] # EGYPTIAN HIEROGLYPH A004 +13004 ; [.4E17.0020.0002] # EGYPTIAN HIEROGLYPH A005 +13005 ; [.4E18.0020.0002] # EGYPTIAN HIEROGLYPH A005A +13006 ; [.4E19.0020.0002] # EGYPTIAN HIEROGLYPH A006 +13007 ; [.4E1A.0020.0002] # EGYPTIAN HIEROGLYPH A006A +13008 ; [.4E1B.0020.0002] # EGYPTIAN HIEROGLYPH A006B +13009 ; [.4E1C.0020.0002] # EGYPTIAN HIEROGLYPH A007 +1300A ; [.4E1D.0020.0002] # EGYPTIAN HIEROGLYPH A008 +1300B ; [.4E1E.0020.0002] # EGYPTIAN HIEROGLYPH A009 +1300C ; [.4E1F.0020.0002] # EGYPTIAN HIEROGLYPH A010 +1300D ; [.4E20.0020.0002] # EGYPTIAN HIEROGLYPH A011 +1300E ; [.4E21.0020.0002] # EGYPTIAN HIEROGLYPH A012 +1300F ; [.4E22.0020.0002] # EGYPTIAN HIEROGLYPH A013 +13010 ; [.4E23.0020.0002] # EGYPTIAN HIEROGLYPH A014 +13011 ; [.4E24.0020.0002] # EGYPTIAN HIEROGLYPH A014A +13012 ; [.4E25.0020.0002] # EGYPTIAN HIEROGLYPH A015 +13013 ; [.4E26.0020.0002] # EGYPTIAN HIEROGLYPH A016 +13014 ; [.4E27.0020.0002] # EGYPTIAN HIEROGLYPH A017 +13015 ; [.4E28.0020.0002] # EGYPTIAN HIEROGLYPH A017A +13016 ; [.4E29.0020.0002] # EGYPTIAN HIEROGLYPH A018 +13017 ; [.4E2A.0020.0002] # EGYPTIAN HIEROGLYPH A019 +13018 ; [.4E2B.0020.0002] # EGYPTIAN HIEROGLYPH A020 +13019 ; [.4E2C.0020.0002] # EGYPTIAN HIEROGLYPH A021 +1301A ; [.4E2D.0020.0002] # EGYPTIAN HIEROGLYPH A022 +1301B ; [.4E2E.0020.0002] # EGYPTIAN HIEROGLYPH A023 +1301C ; [.4E2F.0020.0002] # EGYPTIAN HIEROGLYPH A024 +1301D ; [.4E30.0020.0002] # EGYPTIAN HIEROGLYPH A025 +1301E ; [.4E31.0020.0002] # EGYPTIAN HIEROGLYPH A026 +1301F ; [.4E32.0020.0002] # EGYPTIAN HIEROGLYPH A027 +13020 ; [.4E33.0020.0002] # EGYPTIAN HIEROGLYPH A028 +13021 ; [.4E34.0020.0002] # EGYPTIAN HIEROGLYPH A029 +13022 ; [.4E35.0020.0002] # EGYPTIAN HIEROGLYPH A030 +13023 ; [.4E36.0020.0002] # EGYPTIAN HIEROGLYPH A031 +13024 ; [.4E37.0020.0002] # EGYPTIAN HIEROGLYPH A032 +13025 ; [.4E38.0020.0002] # EGYPTIAN HIEROGLYPH A032A +13026 ; [.4E39.0020.0002] # EGYPTIAN HIEROGLYPH A033 +13027 ; [.4E3A.0020.0002] # EGYPTIAN HIEROGLYPH A034 +13028 ; [.4E3B.0020.0002] # EGYPTIAN HIEROGLYPH A035 +13029 ; [.4E3C.0020.0002] # EGYPTIAN HIEROGLYPH A036 +1302A ; [.4E3D.0020.0002] # EGYPTIAN HIEROGLYPH A037 +1302B ; [.4E3E.0020.0002] # EGYPTIAN HIEROGLYPH A038 +1302C ; [.4E3F.0020.0002] # EGYPTIAN HIEROGLYPH A039 +1302D ; [.4E40.0020.0002] # EGYPTIAN HIEROGLYPH A040 +1302E ; [.4E41.0020.0002] # EGYPTIAN HIEROGLYPH A040A +1302F ; [.4E42.0020.0002] # EGYPTIAN HIEROGLYPH A041 +13030 ; [.4E43.0020.0002] # EGYPTIAN HIEROGLYPH A042 +13031 ; [.4E44.0020.0002] # EGYPTIAN HIEROGLYPH A042A +13032 ; [.4E45.0020.0002] # EGYPTIAN HIEROGLYPH A043 +13033 ; [.4E46.0020.0002] # EGYPTIAN HIEROGLYPH A043A +13034 ; [.4E47.0020.0002] # EGYPTIAN HIEROGLYPH A044 +13035 ; [.4E48.0020.0002] # EGYPTIAN HIEROGLYPH A045 +13036 ; [.4E49.0020.0002] # EGYPTIAN HIEROGLYPH A045A +13037 ; [.4E4A.0020.0002] # EGYPTIAN HIEROGLYPH A046 +13038 ; [.4E4B.0020.0002] # EGYPTIAN HIEROGLYPH A047 +13039 ; [.4E4C.0020.0002] # EGYPTIAN HIEROGLYPH A048 +1303A ; [.4E4D.0020.0002] # EGYPTIAN HIEROGLYPH A049 +1303B ; [.4E4E.0020.0002] # EGYPTIAN HIEROGLYPH A050 +1303C ; [.4E4F.0020.0002] # EGYPTIAN HIEROGLYPH A051 +1303D ; [.4E50.0020.0002] # EGYPTIAN HIEROGLYPH A052 +1303E ; [.4E51.0020.0002] # EGYPTIAN HIEROGLYPH A053 +1303F ; [.4E52.0020.0002] # EGYPTIAN HIEROGLYPH A054 +13040 ; [.4E53.0020.0002] # EGYPTIAN HIEROGLYPH A055 +13041 ; [.4E54.0020.0002] # EGYPTIAN HIEROGLYPH A056 +13042 ; [.4E55.0020.0002] # EGYPTIAN HIEROGLYPH A057 +13043 ; [.4E56.0020.0002] # EGYPTIAN HIEROGLYPH A058 +13044 ; [.4E57.0020.0002] # EGYPTIAN HIEROGLYPH A059 +13045 ; [.4E58.0020.0002] # EGYPTIAN HIEROGLYPH A060 +13046 ; [.4E59.0020.0002] # EGYPTIAN HIEROGLYPH A061 +13047 ; [.4E5A.0020.0002] # EGYPTIAN HIEROGLYPH A062 +13048 ; [.4E5B.0020.0002] # EGYPTIAN HIEROGLYPH A063 +13049 ; [.4E5C.0020.0002] # EGYPTIAN HIEROGLYPH A064 +1304A ; [.4E5D.0020.0002] # EGYPTIAN HIEROGLYPH A065 +1304B ; [.4E5E.0020.0002] # EGYPTIAN HIEROGLYPH A066 +1304C ; [.4E5F.0020.0002] # EGYPTIAN HIEROGLYPH A067 +1304D ; [.4E60.0020.0002] # EGYPTIAN HIEROGLYPH A068 +1304E ; [.4E61.0020.0002] # EGYPTIAN HIEROGLYPH A069 +1304F ; [.4E62.0020.0002] # EGYPTIAN HIEROGLYPH A070 +13050 ; [.4E63.0020.0002] # EGYPTIAN HIEROGLYPH B001 +13051 ; [.4E64.0020.0002] # EGYPTIAN HIEROGLYPH B002 +13052 ; [.4E65.0020.0002] # EGYPTIAN HIEROGLYPH B003 +13053 ; [.4E66.0020.0002] # EGYPTIAN HIEROGLYPH B004 +13054 ; [.4E67.0020.0002] # EGYPTIAN HIEROGLYPH B005 +13055 ; [.4E68.0020.0002] # EGYPTIAN HIEROGLYPH B005A +13056 ; [.4E69.0020.0002] # EGYPTIAN HIEROGLYPH B006 +13057 ; [.4E6A.0020.0002] # EGYPTIAN HIEROGLYPH B007 +13058 ; [.4E6B.0020.0002] # EGYPTIAN HIEROGLYPH B008 +13059 ; [.4E6C.0020.0002] # EGYPTIAN HIEROGLYPH B009 +1305A ; [.4E6D.0020.0002] # EGYPTIAN HIEROGLYPH C001 +1305B ; [.4E6E.0020.0002] # EGYPTIAN HIEROGLYPH C002 +1305C ; [.4E6F.0020.0002] # EGYPTIAN HIEROGLYPH C002A +1305D ; [.4E70.0020.0002] # EGYPTIAN HIEROGLYPH C002B +1305E ; [.4E71.0020.0002] # EGYPTIAN HIEROGLYPH C002C +1305F ; [.4E72.0020.0002] # EGYPTIAN HIEROGLYPH C003 +13060 ; [.4E73.0020.0002] # EGYPTIAN HIEROGLYPH C004 +13061 ; [.4E74.0020.0002] # EGYPTIAN HIEROGLYPH C005 +13062 ; [.4E75.0020.0002] # EGYPTIAN HIEROGLYPH C006 +13063 ; [.4E76.0020.0002] # EGYPTIAN HIEROGLYPH C007 +13064 ; [.4E77.0020.0002] # EGYPTIAN HIEROGLYPH C008 +13065 ; [.4E78.0020.0002] # EGYPTIAN HIEROGLYPH C009 +13066 ; [.4E79.0020.0002] # EGYPTIAN HIEROGLYPH C010 +13067 ; [.4E7A.0020.0002] # EGYPTIAN HIEROGLYPH C010A +13068 ; [.4E7B.0020.0002] # EGYPTIAN HIEROGLYPH C011 +13069 ; [.4E7C.0020.0002] # EGYPTIAN HIEROGLYPH C012 +1306A ; [.4E7D.0020.0002] # EGYPTIAN HIEROGLYPH C013 +1306B ; [.4E7E.0020.0002] # EGYPTIAN HIEROGLYPH C014 +1306C ; [.4E7F.0020.0002] # EGYPTIAN HIEROGLYPH C015 +1306D ; [.4E80.0020.0002] # EGYPTIAN HIEROGLYPH C016 +1306E ; [.4E81.0020.0002] # EGYPTIAN HIEROGLYPH C017 +1306F ; [.4E82.0020.0002] # EGYPTIAN HIEROGLYPH C018 +13070 ; [.4E83.0020.0002] # EGYPTIAN HIEROGLYPH C019 +13071 ; [.4E84.0020.0002] # EGYPTIAN HIEROGLYPH C020 +13072 ; [.4E85.0020.0002] # EGYPTIAN HIEROGLYPH C021 +13073 ; [.4E86.0020.0002] # EGYPTIAN HIEROGLYPH C022 +13074 ; [.4E87.0020.0002] # EGYPTIAN HIEROGLYPH C023 +13075 ; [.4E88.0020.0002] # EGYPTIAN HIEROGLYPH C024 +13076 ; [.4E89.0020.0002] # EGYPTIAN HIEROGLYPH D001 +13077 ; [.4E8A.0020.0002] # EGYPTIAN HIEROGLYPH D002 +13078 ; [.4E8B.0020.0002] # EGYPTIAN HIEROGLYPH D003 +13079 ; [.4E8C.0020.0002] # EGYPTIAN HIEROGLYPH D004 +1307A ; [.4E8D.0020.0002] # EGYPTIAN HIEROGLYPH D005 +1307B ; [.4E8E.0020.0002] # EGYPTIAN HIEROGLYPH D006 +1307C ; [.4E8F.0020.0002] # EGYPTIAN HIEROGLYPH D007 +1307D ; [.4E90.0020.0002] # EGYPTIAN HIEROGLYPH D008 +1307E ; [.4E91.0020.0002] # EGYPTIAN HIEROGLYPH D008A +1307F ; [.4E92.0020.0002] # EGYPTIAN HIEROGLYPH D009 +13080 ; [.4E93.0020.0002] # EGYPTIAN HIEROGLYPH D010 +13081 ; [.4E94.0020.0002] # EGYPTIAN HIEROGLYPH D011 +13082 ; [.4E95.0020.0002] # EGYPTIAN HIEROGLYPH D012 +13083 ; [.4E96.0020.0002] # EGYPTIAN HIEROGLYPH D013 +13084 ; [.4E97.0020.0002] # EGYPTIAN HIEROGLYPH D014 +13085 ; [.4E98.0020.0002] # EGYPTIAN HIEROGLYPH D015 +13086 ; [.4E99.0020.0002] # EGYPTIAN HIEROGLYPH D016 +13087 ; [.4E9A.0020.0002] # EGYPTIAN HIEROGLYPH D017 +13088 ; [.4E9B.0020.0002] # EGYPTIAN HIEROGLYPH D018 +13089 ; [.4E9C.0020.0002] # EGYPTIAN HIEROGLYPH D019 +1308A ; [.4E9D.0020.0002] # EGYPTIAN HIEROGLYPH D020 +1308B ; [.4E9E.0020.0002] # EGYPTIAN HIEROGLYPH D021 +1308C ; [.4E9F.0020.0002] # EGYPTIAN HIEROGLYPH D022 +1308D ; [.4EA0.0020.0002] # EGYPTIAN HIEROGLYPH D023 +1308E ; [.4EA1.0020.0002] # EGYPTIAN HIEROGLYPH D024 +1308F ; [.4EA2.0020.0002] # EGYPTIAN HIEROGLYPH D025 +13090 ; [.4EA3.0020.0002] # EGYPTIAN HIEROGLYPH D026 +13091 ; [.4EA4.0020.0002] # EGYPTIAN HIEROGLYPH D027 +13092 ; [.4EA5.0020.0002] # EGYPTIAN HIEROGLYPH D027A +13093 ; [.4EA6.0020.0002] # EGYPTIAN HIEROGLYPH D028 +13094 ; [.4EA7.0020.0002] # EGYPTIAN HIEROGLYPH D029 +13095 ; [.4EA8.0020.0002] # EGYPTIAN HIEROGLYPH D030 +13096 ; [.4EA9.0020.0002] # EGYPTIAN HIEROGLYPH D031 +13097 ; [.4EAA.0020.0002] # EGYPTIAN HIEROGLYPH D031A +13098 ; [.4EAB.0020.0002] # EGYPTIAN HIEROGLYPH D032 +13099 ; [.4EAC.0020.0002] # EGYPTIAN HIEROGLYPH D033 +1309A ; [.4EAD.0020.0002] # EGYPTIAN HIEROGLYPH D034 +1309B ; [.4EAE.0020.0002] # EGYPTIAN HIEROGLYPH D034A +1309C ; [.4EAF.0020.0002] # EGYPTIAN HIEROGLYPH D035 +1309D ; [.4EB0.0020.0002] # EGYPTIAN HIEROGLYPH D036 +1309E ; [.4EB1.0020.0002] # EGYPTIAN HIEROGLYPH D037 +1309F ; [.4EB2.0020.0002] # EGYPTIAN HIEROGLYPH D038 +130A0 ; [.4EB3.0020.0002] # EGYPTIAN HIEROGLYPH D039 +130A1 ; [.4EB4.0020.0002] # EGYPTIAN HIEROGLYPH D040 +130A2 ; [.4EB5.0020.0002] # EGYPTIAN HIEROGLYPH D041 +130A3 ; [.4EB6.0020.0002] # EGYPTIAN HIEROGLYPH D042 +130A4 ; [.4EB7.0020.0002] # EGYPTIAN HIEROGLYPH D043 +130A5 ; [.4EB8.0020.0002] # EGYPTIAN HIEROGLYPH D044 +130A6 ; [.4EB9.0020.0002] # EGYPTIAN HIEROGLYPH D045 +130A7 ; [.4EBA.0020.0002] # EGYPTIAN HIEROGLYPH D046 +130A8 ; [.4EBB.0020.0002] # EGYPTIAN HIEROGLYPH D046A +130A9 ; [.4EBC.0020.0002] # EGYPTIAN HIEROGLYPH D047 +130AA ; [.4EBD.0020.0002] # EGYPTIAN HIEROGLYPH D048 +130AB ; [.4EBE.0020.0002] # EGYPTIAN HIEROGLYPH D048A +130AC ; [.4EBF.0020.0002] # EGYPTIAN HIEROGLYPH D049 +130AD ; [.4EC0.0020.0002] # EGYPTIAN HIEROGLYPH D050 +130AE ; [.4EC1.0020.0002] # EGYPTIAN HIEROGLYPH D050A +130AF ; [.4EC2.0020.0002] # EGYPTIAN HIEROGLYPH D050B +130B0 ; [.4EC3.0020.0002] # EGYPTIAN HIEROGLYPH D050C +130B1 ; [.4EC4.0020.0002] # EGYPTIAN HIEROGLYPH D050D +130B2 ; [.4EC5.0020.0002] # EGYPTIAN HIEROGLYPH D050E +130B3 ; [.4EC6.0020.0002] # EGYPTIAN HIEROGLYPH D050F +130B4 ; [.4EC7.0020.0002] # EGYPTIAN HIEROGLYPH D050G +130B5 ; [.4EC8.0020.0002] # EGYPTIAN HIEROGLYPH D050H +130B6 ; [.4EC9.0020.0002] # EGYPTIAN HIEROGLYPH D050I +130B7 ; [.4ECA.0020.0002] # EGYPTIAN HIEROGLYPH D051 +130B8 ; [.4ECB.0020.0002] # EGYPTIAN HIEROGLYPH D052 +130B9 ; [.4ECC.0020.0002] # EGYPTIAN HIEROGLYPH D052A +130BA ; [.4ECD.0020.0002] # EGYPTIAN HIEROGLYPH D053 +130BB ; [.4ECE.0020.0002] # EGYPTIAN HIEROGLYPH D054 +130BC ; [.4ECF.0020.0002] # EGYPTIAN HIEROGLYPH D054A +130BD ; [.4ED0.0020.0002] # EGYPTIAN HIEROGLYPH D055 +130BE ; [.4ED1.0020.0002] # EGYPTIAN HIEROGLYPH D056 +130BF ; [.4ED2.0020.0002] # EGYPTIAN HIEROGLYPH D057 +130C0 ; [.4ED3.0020.0002] # EGYPTIAN HIEROGLYPH D058 +130C1 ; [.4ED4.0020.0002] # EGYPTIAN HIEROGLYPH D059 +130C2 ; [.4ED5.0020.0002] # EGYPTIAN HIEROGLYPH D060 +130C3 ; [.4ED6.0020.0002] # EGYPTIAN HIEROGLYPH D061 +130C4 ; [.4ED7.0020.0002] # EGYPTIAN HIEROGLYPH D062 +130C5 ; [.4ED8.0020.0002] # EGYPTIAN HIEROGLYPH D063 +130C6 ; [.4ED9.0020.0002] # EGYPTIAN HIEROGLYPH D064 +130C7 ; [.4EDA.0020.0002] # EGYPTIAN HIEROGLYPH D065 +130C8 ; [.4EDB.0020.0002] # EGYPTIAN HIEROGLYPH D066 +130C9 ; [.4EDC.0020.0002] # EGYPTIAN HIEROGLYPH D067 +130CA ; [.4EDD.0020.0002] # EGYPTIAN HIEROGLYPH D067A +130CB ; [.4EDE.0020.0002] # EGYPTIAN HIEROGLYPH D067B +130CC ; [.4EDF.0020.0002] # EGYPTIAN HIEROGLYPH D067C +130CD ; [.4EE0.0020.0002] # EGYPTIAN HIEROGLYPH D067D +130CE ; [.4EE1.0020.0002] # EGYPTIAN HIEROGLYPH D067E +130CF ; [.4EE2.0020.0002] # EGYPTIAN HIEROGLYPH D067F +130D0 ; [.4EE3.0020.0002] # EGYPTIAN HIEROGLYPH D067G +130D1 ; [.4EE4.0020.0002] # EGYPTIAN HIEROGLYPH D067H +130D2 ; [.4EE5.0020.0002] # EGYPTIAN HIEROGLYPH E001 +130D3 ; [.4EE6.0020.0002] # EGYPTIAN HIEROGLYPH E002 +130D4 ; [.4EE7.0020.0002] # EGYPTIAN HIEROGLYPH E003 +130D5 ; [.4EE8.0020.0002] # EGYPTIAN HIEROGLYPH E004 +130D6 ; [.4EE9.0020.0002] # EGYPTIAN HIEROGLYPH E005 +130D7 ; [.4EEA.0020.0002] # EGYPTIAN HIEROGLYPH E006 +130D8 ; [.4EEB.0020.0002] # EGYPTIAN HIEROGLYPH E007 +130D9 ; [.4EEC.0020.0002] # EGYPTIAN HIEROGLYPH E008 +130DA ; [.4EED.0020.0002] # EGYPTIAN HIEROGLYPH E008A +130DB ; [.4EEE.0020.0002] # EGYPTIAN HIEROGLYPH E009 +130DC ; [.4EEF.0020.0002] # EGYPTIAN HIEROGLYPH E009A +130DD ; [.4EF0.0020.0002] # EGYPTIAN HIEROGLYPH E010 +130DE ; [.4EF1.0020.0002] # EGYPTIAN HIEROGLYPH E011 +130DF ; [.4EF2.0020.0002] # EGYPTIAN HIEROGLYPH E012 +130E0 ; [.4EF3.0020.0002] # EGYPTIAN HIEROGLYPH E013 +130E1 ; [.4EF4.0020.0002] # EGYPTIAN HIEROGLYPH E014 +130E2 ; [.4EF5.0020.0002] # EGYPTIAN HIEROGLYPH E015 +130E3 ; [.4EF6.0020.0002] # EGYPTIAN HIEROGLYPH E016 +130E4 ; [.4EF7.0020.0002] # EGYPTIAN HIEROGLYPH E016A +130E5 ; [.4EF8.0020.0002] # EGYPTIAN HIEROGLYPH E017 +130E6 ; [.4EF9.0020.0002] # EGYPTIAN HIEROGLYPH E017A +130E7 ; [.4EFA.0020.0002] # EGYPTIAN HIEROGLYPH E018 +130E8 ; [.4EFB.0020.0002] # EGYPTIAN HIEROGLYPH E019 +130E9 ; [.4EFC.0020.0002] # EGYPTIAN HIEROGLYPH E020 +130EA ; [.4EFD.0020.0002] # EGYPTIAN HIEROGLYPH E020A +130EB ; [.4EFE.0020.0002] # EGYPTIAN HIEROGLYPH E021 +130EC ; [.4EFF.0020.0002] # EGYPTIAN HIEROGLYPH E022 +130ED ; [.4F00.0020.0002] # EGYPTIAN HIEROGLYPH E023 +130EE ; [.4F01.0020.0002] # EGYPTIAN HIEROGLYPH E024 +130EF ; [.4F02.0020.0002] # EGYPTIAN HIEROGLYPH E025 +130F0 ; [.4F03.0020.0002] # EGYPTIAN HIEROGLYPH E026 +130F1 ; [.4F04.0020.0002] # EGYPTIAN HIEROGLYPH E027 +130F2 ; [.4F05.0020.0002] # EGYPTIAN HIEROGLYPH E028 +130F3 ; [.4F06.0020.0002] # EGYPTIAN HIEROGLYPH E028A +130F4 ; [.4F07.0020.0002] # EGYPTIAN HIEROGLYPH E029 +130F5 ; [.4F08.0020.0002] # EGYPTIAN HIEROGLYPH E030 +130F6 ; [.4F09.0020.0002] # EGYPTIAN HIEROGLYPH E031 +130F7 ; [.4F0A.0020.0002] # EGYPTIAN HIEROGLYPH E032 +130F8 ; [.4F0B.0020.0002] # EGYPTIAN HIEROGLYPH E033 +130F9 ; [.4F0C.0020.0002] # EGYPTIAN HIEROGLYPH E034 +130FA ; [.4F0D.0020.0002] # EGYPTIAN HIEROGLYPH E034A +130FB ; [.4F0E.0020.0002] # EGYPTIAN HIEROGLYPH E036 +130FC ; [.4F0F.0020.0002] # EGYPTIAN HIEROGLYPH E037 +130FD ; [.4F10.0020.0002] # EGYPTIAN HIEROGLYPH E038 +130FE ; [.4F11.0020.0002] # EGYPTIAN HIEROGLYPH F001 +130FF ; [.4F12.0020.0002] # EGYPTIAN HIEROGLYPH F001A +13100 ; [.4F13.0020.0002] # EGYPTIAN HIEROGLYPH F002 +13101 ; [.4F14.0020.0002] # EGYPTIAN HIEROGLYPH F003 +13102 ; [.4F15.0020.0002] # EGYPTIAN HIEROGLYPH F004 +13103 ; [.4F16.0020.0002] # EGYPTIAN HIEROGLYPH F005 +13104 ; [.4F17.0020.0002] # EGYPTIAN HIEROGLYPH F006 +13105 ; [.4F18.0020.0002] # EGYPTIAN HIEROGLYPH F007 +13106 ; [.4F19.0020.0002] # EGYPTIAN HIEROGLYPH F008 +13107 ; [.4F1A.0020.0002] # EGYPTIAN HIEROGLYPH F009 +13108 ; [.4F1B.0020.0002] # EGYPTIAN HIEROGLYPH F010 +13109 ; [.4F1C.0020.0002] # EGYPTIAN HIEROGLYPH F011 +1310A ; [.4F1D.0020.0002] # EGYPTIAN HIEROGLYPH F012 +1310B ; [.4F1E.0020.0002] # EGYPTIAN HIEROGLYPH F013 +1310C ; [.4F1F.0020.0002] # EGYPTIAN HIEROGLYPH F013A +1310D ; [.4F20.0020.0002] # EGYPTIAN HIEROGLYPH F014 +1310E ; [.4F21.0020.0002] # EGYPTIAN HIEROGLYPH F015 +1310F ; [.4F22.0020.0002] # EGYPTIAN HIEROGLYPH F016 +13110 ; [.4F23.0020.0002] # EGYPTIAN HIEROGLYPH F017 +13111 ; [.4F24.0020.0002] # EGYPTIAN HIEROGLYPH F018 +13112 ; [.4F25.0020.0002] # EGYPTIAN HIEROGLYPH F019 +13113 ; [.4F26.0020.0002] # EGYPTIAN HIEROGLYPH F020 +13114 ; [.4F27.0020.0002] # EGYPTIAN HIEROGLYPH F021 +13115 ; [.4F28.0020.0002] # EGYPTIAN HIEROGLYPH F021A +13116 ; [.4F29.0020.0002] # EGYPTIAN HIEROGLYPH F022 +13117 ; [.4F2A.0020.0002] # EGYPTIAN HIEROGLYPH F023 +13118 ; [.4F2B.0020.0002] # EGYPTIAN HIEROGLYPH F024 +13119 ; [.4F2C.0020.0002] # EGYPTIAN HIEROGLYPH F025 +1311A ; [.4F2D.0020.0002] # EGYPTIAN HIEROGLYPH F026 +1311B ; [.4F2E.0020.0002] # EGYPTIAN HIEROGLYPH F027 +1311C ; [.4F2F.0020.0002] # EGYPTIAN HIEROGLYPH F028 +1311D ; [.4F30.0020.0002] # EGYPTIAN HIEROGLYPH F029 +1311E ; [.4F31.0020.0002] # EGYPTIAN HIEROGLYPH F030 +1311F ; [.4F32.0020.0002] # EGYPTIAN HIEROGLYPH F031 +13120 ; [.4F33.0020.0002] # EGYPTIAN HIEROGLYPH F031A +13121 ; [.4F34.0020.0002] # EGYPTIAN HIEROGLYPH F032 +13122 ; [.4F35.0020.0002] # EGYPTIAN HIEROGLYPH F033 +13123 ; [.4F36.0020.0002] # EGYPTIAN HIEROGLYPH F034 +13124 ; [.4F37.0020.0002] # EGYPTIAN HIEROGLYPH F035 +13125 ; [.4F38.0020.0002] # EGYPTIAN HIEROGLYPH F036 +13126 ; [.4F39.0020.0002] # EGYPTIAN HIEROGLYPH F037 +13127 ; [.4F3A.0020.0002] # EGYPTIAN HIEROGLYPH F037A +13128 ; [.4F3B.0020.0002] # EGYPTIAN HIEROGLYPH F038 +13129 ; [.4F3C.0020.0002] # EGYPTIAN HIEROGLYPH F038A +1312A ; [.4F3D.0020.0002] # EGYPTIAN HIEROGLYPH F039 +1312B ; [.4F3E.0020.0002] # EGYPTIAN HIEROGLYPH F040 +1312C ; [.4F3F.0020.0002] # EGYPTIAN HIEROGLYPH F041 +1312D ; [.4F40.0020.0002] # EGYPTIAN HIEROGLYPH F042 +1312E ; [.4F41.0020.0002] # EGYPTIAN HIEROGLYPH F043 +1312F ; [.4F42.0020.0002] # EGYPTIAN HIEROGLYPH F044 +13130 ; [.4F43.0020.0002] # EGYPTIAN HIEROGLYPH F045 +13131 ; [.4F44.0020.0002] # EGYPTIAN HIEROGLYPH F045A +13132 ; [.4F45.0020.0002] # EGYPTIAN HIEROGLYPH F046 +13133 ; [.4F46.0020.0002] # EGYPTIAN HIEROGLYPH F046A +13134 ; [.4F47.0020.0002] # EGYPTIAN HIEROGLYPH F047 +13135 ; [.4F48.0020.0002] # EGYPTIAN HIEROGLYPH F047A +13136 ; [.4F49.0020.0002] # EGYPTIAN HIEROGLYPH F048 +13137 ; [.4F4A.0020.0002] # EGYPTIAN HIEROGLYPH F049 +13138 ; [.4F4B.0020.0002] # EGYPTIAN HIEROGLYPH F050 +13139 ; [.4F4C.0020.0002] # EGYPTIAN HIEROGLYPH F051 +1313A ; [.4F4D.0020.0002] # EGYPTIAN HIEROGLYPH F051A +1313B ; [.4F4E.0020.0002] # EGYPTIAN HIEROGLYPH F051B +1313C ; [.4F4F.0020.0002] # EGYPTIAN HIEROGLYPH F051C +1313D ; [.4F50.0020.0002] # EGYPTIAN HIEROGLYPH F052 +1313E ; [.4F51.0020.0002] # EGYPTIAN HIEROGLYPH F053 +1313F ; [.4F52.0020.0002] # EGYPTIAN HIEROGLYPH G001 +13140 ; [.4F53.0020.0002] # EGYPTIAN HIEROGLYPH G002 +13141 ; [.4F54.0020.0002] # EGYPTIAN HIEROGLYPH G003 +13142 ; [.4F55.0020.0002] # EGYPTIAN HIEROGLYPH G004 +13143 ; [.4F56.0020.0002] # EGYPTIAN HIEROGLYPH G005 +13144 ; [.4F57.0020.0002] # EGYPTIAN HIEROGLYPH G006 +13145 ; [.4F58.0020.0002] # EGYPTIAN HIEROGLYPH G006A +13146 ; [.4F59.0020.0002] # EGYPTIAN HIEROGLYPH G007 +13147 ; [.4F5A.0020.0002] # EGYPTIAN HIEROGLYPH G007A +13148 ; [.4F5B.0020.0002] # EGYPTIAN HIEROGLYPH G007B +13149 ; [.4F5C.0020.0002] # EGYPTIAN HIEROGLYPH G008 +1314A ; [.4F5D.0020.0002] # EGYPTIAN HIEROGLYPH G009 +1314B ; [.4F5E.0020.0002] # EGYPTIAN HIEROGLYPH G010 +1314C ; [.4F5F.0020.0002] # EGYPTIAN HIEROGLYPH G011 +1314D ; [.4F60.0020.0002] # EGYPTIAN HIEROGLYPH G011A +1314E ; [.4F61.0020.0002] # EGYPTIAN HIEROGLYPH G012 +1314F ; [.4F62.0020.0002] # EGYPTIAN HIEROGLYPH G013 +13150 ; [.4F63.0020.0002] # EGYPTIAN HIEROGLYPH G014 +13151 ; [.4F64.0020.0002] # EGYPTIAN HIEROGLYPH G015 +13152 ; [.4F65.0020.0002] # EGYPTIAN HIEROGLYPH G016 +13153 ; [.4F66.0020.0002] # EGYPTIAN HIEROGLYPH G017 +13154 ; [.4F67.0020.0002] # EGYPTIAN HIEROGLYPH G018 +13155 ; [.4F68.0020.0002] # EGYPTIAN HIEROGLYPH G019 +13156 ; [.4F69.0020.0002] # EGYPTIAN HIEROGLYPH G020 +13157 ; [.4F6A.0020.0002] # EGYPTIAN HIEROGLYPH G020A +13158 ; [.4F6B.0020.0002] # EGYPTIAN HIEROGLYPH G021 +13159 ; [.4F6C.0020.0002] # EGYPTIAN HIEROGLYPH G022 +1315A ; [.4F6D.0020.0002] # EGYPTIAN HIEROGLYPH G023 +1315B ; [.4F6E.0020.0002] # EGYPTIAN HIEROGLYPH G024 +1315C ; [.4F6F.0020.0002] # EGYPTIAN HIEROGLYPH G025 +1315D ; [.4F70.0020.0002] # EGYPTIAN HIEROGLYPH G026 +1315E ; [.4F71.0020.0002] # EGYPTIAN HIEROGLYPH G026A +1315F ; [.4F72.0020.0002] # EGYPTIAN HIEROGLYPH G027 +13160 ; [.4F73.0020.0002] # EGYPTIAN HIEROGLYPH G028 +13161 ; [.4F74.0020.0002] # EGYPTIAN HIEROGLYPH G029 +13162 ; [.4F75.0020.0002] # EGYPTIAN HIEROGLYPH G030 +13163 ; [.4F76.0020.0002] # EGYPTIAN HIEROGLYPH G031 +13164 ; [.4F77.0020.0002] # EGYPTIAN HIEROGLYPH G032 +13165 ; [.4F78.0020.0002] # EGYPTIAN HIEROGLYPH G033 +13166 ; [.4F79.0020.0002] # EGYPTIAN HIEROGLYPH G034 +13167 ; [.4F7A.0020.0002] # EGYPTIAN HIEROGLYPH G035 +13168 ; [.4F7B.0020.0002] # EGYPTIAN HIEROGLYPH G036 +13169 ; [.4F7C.0020.0002] # EGYPTIAN HIEROGLYPH G036A +1316A ; [.4F7D.0020.0002] # EGYPTIAN HIEROGLYPH G037 +1316B ; [.4F7E.0020.0002] # EGYPTIAN HIEROGLYPH G037A +1316C ; [.4F7F.0020.0002] # EGYPTIAN HIEROGLYPH G038 +1316D ; [.4F80.0020.0002] # EGYPTIAN HIEROGLYPH G039 +1316E ; [.4F81.0020.0002] # EGYPTIAN HIEROGLYPH G040 +1316F ; [.4F82.0020.0002] # EGYPTIAN HIEROGLYPH G041 +13170 ; [.4F83.0020.0002] # EGYPTIAN HIEROGLYPH G042 +13171 ; [.4F84.0020.0002] # EGYPTIAN HIEROGLYPH G043 +13172 ; [.4F85.0020.0002] # EGYPTIAN HIEROGLYPH G043A +13173 ; [.4F86.0020.0002] # EGYPTIAN HIEROGLYPH G044 +13174 ; [.4F87.0020.0002] # EGYPTIAN HIEROGLYPH G045 +13175 ; [.4F88.0020.0002] # EGYPTIAN HIEROGLYPH G045A +13176 ; [.4F89.0020.0002] # EGYPTIAN HIEROGLYPH G046 +13177 ; [.4F8A.0020.0002] # EGYPTIAN HIEROGLYPH G047 +13178 ; [.4F8B.0020.0002] # EGYPTIAN HIEROGLYPH G048 +13179 ; [.4F8C.0020.0002] # EGYPTIAN HIEROGLYPH G049 +1317A ; [.4F8D.0020.0002] # EGYPTIAN HIEROGLYPH G050 +1317B ; [.4F8E.0020.0002] # EGYPTIAN HIEROGLYPH G051 +1317C ; [.4F8F.0020.0002] # EGYPTIAN HIEROGLYPH G052 +1317D ; [.4F90.0020.0002] # EGYPTIAN HIEROGLYPH G053 +1317E ; [.4F91.0020.0002] # EGYPTIAN HIEROGLYPH G054 +1317F ; [.4F92.0020.0002] # EGYPTIAN HIEROGLYPH H001 +13180 ; [.4F93.0020.0002] # EGYPTIAN HIEROGLYPH H002 +13181 ; [.4F94.0020.0002] # EGYPTIAN HIEROGLYPH H003 +13182 ; [.4F95.0020.0002] # EGYPTIAN HIEROGLYPH H004 +13183 ; [.4F96.0020.0002] # EGYPTIAN HIEROGLYPH H005 +13184 ; [.4F97.0020.0002] # EGYPTIAN HIEROGLYPH H006 +13185 ; [.4F98.0020.0002] # EGYPTIAN HIEROGLYPH H006A +13186 ; [.4F99.0020.0002] # EGYPTIAN HIEROGLYPH H007 +13187 ; [.4F9A.0020.0002] # EGYPTIAN HIEROGLYPH H008 +13188 ; [.4F9B.0020.0002] # EGYPTIAN HIEROGLYPH I001 +13189 ; [.4F9C.0020.0002] # EGYPTIAN HIEROGLYPH I002 +1318A ; [.4F9D.0020.0002] # EGYPTIAN HIEROGLYPH I003 +1318B ; [.4F9E.0020.0002] # EGYPTIAN HIEROGLYPH I004 +1318C ; [.4F9F.0020.0002] # EGYPTIAN HIEROGLYPH I005 +1318D ; [.4FA0.0020.0002] # EGYPTIAN HIEROGLYPH I005A +1318E ; [.4FA1.0020.0002] # EGYPTIAN HIEROGLYPH I006 +1318F ; [.4FA2.0020.0002] # EGYPTIAN HIEROGLYPH I007 +13190 ; [.4FA3.0020.0002] # EGYPTIAN HIEROGLYPH I008 +13191 ; [.4FA4.0020.0002] # EGYPTIAN HIEROGLYPH I009 +13192 ; [.4FA5.0020.0002] # EGYPTIAN HIEROGLYPH I009A +13193 ; [.4FA6.0020.0002] # EGYPTIAN HIEROGLYPH I010 +13194 ; [.4FA7.0020.0002] # EGYPTIAN HIEROGLYPH I010A +13195 ; [.4FA8.0020.0002] # EGYPTIAN HIEROGLYPH I011 +13196 ; [.4FA9.0020.0002] # EGYPTIAN HIEROGLYPH I011A +13197 ; [.4FAA.0020.0002] # EGYPTIAN HIEROGLYPH I012 +13198 ; [.4FAB.0020.0002] # EGYPTIAN HIEROGLYPH I013 +13199 ; [.4FAC.0020.0002] # EGYPTIAN HIEROGLYPH I014 +1319A ; [.4FAD.0020.0002] # EGYPTIAN HIEROGLYPH I015 +1319B ; [.4FAE.0020.0002] # EGYPTIAN HIEROGLYPH K001 +1319C ; [.4FAF.0020.0002] # EGYPTIAN HIEROGLYPH K002 +1319D ; [.4FB0.0020.0002] # EGYPTIAN HIEROGLYPH K003 +1319E ; [.4FB1.0020.0002] # EGYPTIAN HIEROGLYPH K004 +1319F ; [.4FB2.0020.0002] # EGYPTIAN HIEROGLYPH K005 +131A0 ; [.4FB3.0020.0002] # EGYPTIAN HIEROGLYPH K006 +131A1 ; [.4FB4.0020.0002] # EGYPTIAN HIEROGLYPH K007 +131A2 ; [.4FB5.0020.0002] # EGYPTIAN HIEROGLYPH K008 +131A3 ; [.4FB6.0020.0002] # EGYPTIAN HIEROGLYPH L001 +131A4 ; [.4FB7.0020.0002] # EGYPTIAN HIEROGLYPH L002 +131A5 ; [.4FB8.0020.0002] # EGYPTIAN HIEROGLYPH L002A +131A6 ; [.4FB9.0020.0002] # EGYPTIAN HIEROGLYPH L003 +131A7 ; [.4FBA.0020.0002] # EGYPTIAN HIEROGLYPH L004 +131A8 ; [.4FBB.0020.0002] # EGYPTIAN HIEROGLYPH L005 +131A9 ; [.4FBC.0020.0002] # EGYPTIAN HIEROGLYPH L006 +131AA ; [.4FBD.0020.0002] # EGYPTIAN HIEROGLYPH L006A +131AB ; [.4FBE.0020.0002] # EGYPTIAN HIEROGLYPH L007 +131AC ; [.4FBF.0020.0002] # EGYPTIAN HIEROGLYPH L008 +131AD ; [.4FC0.0020.0002] # EGYPTIAN HIEROGLYPH M001 +131AE ; [.4FC1.0020.0002] # EGYPTIAN HIEROGLYPH M001A +131AF ; [.4FC2.0020.0002] # EGYPTIAN HIEROGLYPH M001B +131B0 ; [.4FC3.0020.0002] # EGYPTIAN HIEROGLYPH M002 +131B1 ; [.4FC4.0020.0002] # EGYPTIAN HIEROGLYPH M003 +131B2 ; [.4FC5.0020.0002] # EGYPTIAN HIEROGLYPH M003A +131B3 ; [.4FC6.0020.0002] # EGYPTIAN HIEROGLYPH M004 +131B4 ; [.4FC7.0020.0002] # EGYPTIAN HIEROGLYPH M005 +131B5 ; [.4FC8.0020.0002] # EGYPTIAN HIEROGLYPH M006 +131B6 ; [.4FC9.0020.0002] # EGYPTIAN HIEROGLYPH M007 +131B7 ; [.4FCA.0020.0002] # EGYPTIAN HIEROGLYPH M008 +131B8 ; [.4FCB.0020.0002] # EGYPTIAN HIEROGLYPH M009 +131B9 ; [.4FCC.0020.0002] # EGYPTIAN HIEROGLYPH M010 +131BA ; [.4FCD.0020.0002] # EGYPTIAN HIEROGLYPH M010A +131BB ; [.4FCE.0020.0002] # EGYPTIAN HIEROGLYPH M011 +131BC ; [.4FCF.0020.0002] # EGYPTIAN HIEROGLYPH M012 +131BD ; [.4FD0.0020.0002] # EGYPTIAN HIEROGLYPH M012A +131BE ; [.4FD1.0020.0002] # EGYPTIAN HIEROGLYPH M012B +131BF ; [.4FD2.0020.0002] # EGYPTIAN HIEROGLYPH M012C +131C0 ; [.4FD3.0020.0002] # EGYPTIAN HIEROGLYPH M012D +131C1 ; [.4FD4.0020.0002] # EGYPTIAN HIEROGLYPH M012E +131C2 ; [.4FD5.0020.0002] # EGYPTIAN HIEROGLYPH M012F +131C3 ; [.4FD6.0020.0002] # EGYPTIAN HIEROGLYPH M012G +131C4 ; [.4FD7.0020.0002] # EGYPTIAN HIEROGLYPH M012H +131C5 ; [.4FD8.0020.0002] # EGYPTIAN HIEROGLYPH M013 +131C6 ; [.4FD9.0020.0002] # EGYPTIAN HIEROGLYPH M014 +131C7 ; [.4FDA.0020.0002] # EGYPTIAN HIEROGLYPH M015 +131C8 ; [.4FDB.0020.0002] # EGYPTIAN HIEROGLYPH M015A +131C9 ; [.4FDC.0020.0002] # EGYPTIAN HIEROGLYPH M016 +131CA ; [.4FDD.0020.0002] # EGYPTIAN HIEROGLYPH M016A +131CB ; [.4FDE.0020.0002] # EGYPTIAN HIEROGLYPH M017 +131CC ; [.4FDF.0020.0002] # EGYPTIAN HIEROGLYPH M017A +131CD ; [.4FE0.0020.0002] # EGYPTIAN HIEROGLYPH M018 +131CE ; [.4FE1.0020.0002] # EGYPTIAN HIEROGLYPH M019 +131CF ; [.4FE2.0020.0002] # EGYPTIAN HIEROGLYPH M020 +131D0 ; [.4FE3.0020.0002] # EGYPTIAN HIEROGLYPH M021 +131D1 ; [.4FE4.0020.0002] # EGYPTIAN HIEROGLYPH M022 +131D2 ; [.4FE5.0020.0002] # EGYPTIAN HIEROGLYPH M022A +131D3 ; [.4FE6.0020.0002] # EGYPTIAN HIEROGLYPH M023 +131D4 ; [.4FE7.0020.0002] # EGYPTIAN HIEROGLYPH M024 +131D5 ; [.4FE8.0020.0002] # EGYPTIAN HIEROGLYPH M024A +131D6 ; [.4FE9.0020.0002] # EGYPTIAN HIEROGLYPH M025 +131D7 ; [.4FEA.0020.0002] # EGYPTIAN HIEROGLYPH M026 +131D8 ; [.4FEB.0020.0002] # EGYPTIAN HIEROGLYPH M027 +131D9 ; [.4FEC.0020.0002] # EGYPTIAN HIEROGLYPH M028 +131DA ; [.4FED.0020.0002] # EGYPTIAN HIEROGLYPH M028A +131DB ; [.4FEE.0020.0002] # EGYPTIAN HIEROGLYPH M029 +131DC ; [.4FEF.0020.0002] # EGYPTIAN HIEROGLYPH M030 +131DD ; [.4FF0.0020.0002] # EGYPTIAN HIEROGLYPH M031 +131DE ; [.4FF1.0020.0002] # EGYPTIAN HIEROGLYPH M031A +131DF ; [.4FF2.0020.0002] # EGYPTIAN HIEROGLYPH M032 +131E0 ; [.4FF3.0020.0002] # EGYPTIAN HIEROGLYPH M033 +131E1 ; [.4FF4.0020.0002] # EGYPTIAN HIEROGLYPH M033A +131E2 ; [.4FF5.0020.0002] # EGYPTIAN HIEROGLYPH M033B +131E3 ; [.4FF6.0020.0002] # EGYPTIAN HIEROGLYPH M034 +131E4 ; [.4FF7.0020.0002] # EGYPTIAN HIEROGLYPH M035 +131E5 ; [.4FF8.0020.0002] # EGYPTIAN HIEROGLYPH M036 +131E6 ; [.4FF9.0020.0002] # EGYPTIAN HIEROGLYPH M037 +131E7 ; [.4FFA.0020.0002] # EGYPTIAN HIEROGLYPH M038 +131E8 ; [.4FFB.0020.0002] # EGYPTIAN HIEROGLYPH M039 +131E9 ; [.4FFC.0020.0002] # EGYPTIAN HIEROGLYPH M040 +131EA ; [.4FFD.0020.0002] # EGYPTIAN HIEROGLYPH M040A +131EB ; [.4FFE.0020.0002] # EGYPTIAN HIEROGLYPH M041 +131EC ; [.4FFF.0020.0002] # EGYPTIAN HIEROGLYPH M042 +131ED ; [.5000.0020.0002] # EGYPTIAN HIEROGLYPH M043 +131EE ; [.5001.0020.0002] # EGYPTIAN HIEROGLYPH M044 +131EF ; [.5002.0020.0002] # EGYPTIAN HIEROGLYPH N001 +131F0 ; [.5003.0020.0002] # EGYPTIAN HIEROGLYPH N002 +131F1 ; [.5004.0020.0002] # EGYPTIAN HIEROGLYPH N003 +131F2 ; [.5005.0020.0002] # EGYPTIAN HIEROGLYPH N004 +131F3 ; [.5006.0020.0002] # EGYPTIAN HIEROGLYPH N005 +131F4 ; [.5007.0020.0002] # EGYPTIAN HIEROGLYPH N006 +131F5 ; [.5008.0020.0002] # EGYPTIAN HIEROGLYPH N007 +131F6 ; [.5009.0020.0002] # EGYPTIAN HIEROGLYPH N008 +131F7 ; [.500A.0020.0002] # EGYPTIAN HIEROGLYPH N009 +131F8 ; [.500B.0020.0002] # EGYPTIAN HIEROGLYPH N010 +131F9 ; [.500C.0020.0002] # EGYPTIAN HIEROGLYPH N011 +131FA ; [.500D.0020.0002] # EGYPTIAN HIEROGLYPH N012 +131FB ; [.500E.0020.0002] # EGYPTIAN HIEROGLYPH N013 +131FC ; [.500F.0020.0002] # EGYPTIAN HIEROGLYPH N014 +131FD ; [.5010.0020.0002] # EGYPTIAN HIEROGLYPH N015 +131FE ; [.5011.0020.0002] # EGYPTIAN HIEROGLYPH N016 +131FF ; [.5012.0020.0002] # EGYPTIAN HIEROGLYPH N017 +13200 ; [.5013.0020.0002] # EGYPTIAN HIEROGLYPH N018 +13201 ; [.5014.0020.0002] # EGYPTIAN HIEROGLYPH N018A +13202 ; [.5015.0020.0002] # EGYPTIAN HIEROGLYPH N018B +13203 ; [.5016.0020.0002] # EGYPTIAN HIEROGLYPH N019 +13204 ; [.5017.0020.0002] # EGYPTIAN HIEROGLYPH N020 +13205 ; [.5018.0020.0002] # EGYPTIAN HIEROGLYPH N021 +13206 ; [.5019.0020.0002] # EGYPTIAN HIEROGLYPH N022 +13207 ; [.501A.0020.0002] # EGYPTIAN HIEROGLYPH N023 +13208 ; [.501B.0020.0002] # EGYPTIAN HIEROGLYPH N024 +13209 ; [.501C.0020.0002] # EGYPTIAN HIEROGLYPH N025 +1320A ; [.501D.0020.0002] # EGYPTIAN HIEROGLYPH N025A +1320B ; [.501E.0020.0002] # EGYPTIAN HIEROGLYPH N026 +1320C ; [.501F.0020.0002] # EGYPTIAN HIEROGLYPH N027 +1320D ; [.5020.0020.0002] # EGYPTIAN HIEROGLYPH N028 +1320E ; [.5021.0020.0002] # EGYPTIAN HIEROGLYPH N029 +1320F ; [.5022.0020.0002] # EGYPTIAN HIEROGLYPH N030 +13210 ; [.5023.0020.0002] # EGYPTIAN HIEROGLYPH N031 +13211 ; [.5024.0020.0002] # EGYPTIAN HIEROGLYPH N032 +13212 ; [.5025.0020.0002] # EGYPTIAN HIEROGLYPH N033 +13213 ; [.5026.0020.0002] # EGYPTIAN HIEROGLYPH N033A +13214 ; [.5027.0020.0002] # EGYPTIAN HIEROGLYPH N034 +13215 ; [.5028.0020.0002] # EGYPTIAN HIEROGLYPH N034A +13216 ; [.5029.0020.0002] # EGYPTIAN HIEROGLYPH N035 +13217 ; [.502A.0020.0002] # EGYPTIAN HIEROGLYPH N035A +13218 ; [.502B.0020.0002] # EGYPTIAN HIEROGLYPH N036 +13219 ; [.502C.0020.0002] # EGYPTIAN HIEROGLYPH N037 +1321A ; [.502D.0020.0002] # EGYPTIAN HIEROGLYPH N037A +1321B ; [.502E.0020.0002] # EGYPTIAN HIEROGLYPH N038 +1321C ; [.502F.0020.0002] # EGYPTIAN HIEROGLYPH N039 +1321D ; [.5030.0020.0002] # EGYPTIAN HIEROGLYPH N040 +1321E ; [.5031.0020.0002] # EGYPTIAN HIEROGLYPH N041 +1321F ; [.5032.0020.0002] # EGYPTIAN HIEROGLYPH N042 +13220 ; [.5033.0020.0002] # EGYPTIAN HIEROGLYPH NL001 +13221 ; [.5034.0020.0002] # EGYPTIAN HIEROGLYPH NL002 +13222 ; [.5035.0020.0002] # EGYPTIAN HIEROGLYPH NL003 +13223 ; [.5036.0020.0002] # EGYPTIAN HIEROGLYPH NL004 +13224 ; [.5037.0020.0002] # EGYPTIAN HIEROGLYPH NL005 +13225 ; [.5038.0020.0002] # EGYPTIAN HIEROGLYPH NL005A +13226 ; [.5039.0020.0002] # EGYPTIAN HIEROGLYPH NL006 +13227 ; [.503A.0020.0002] # EGYPTIAN HIEROGLYPH NL007 +13228 ; [.503B.0020.0002] # EGYPTIAN HIEROGLYPH NL008 +13229 ; [.503C.0020.0002] # EGYPTIAN HIEROGLYPH NL009 +1322A ; [.503D.0020.0002] # EGYPTIAN HIEROGLYPH NL010 +1322B ; [.503E.0020.0002] # EGYPTIAN HIEROGLYPH NL011 +1322C ; [.503F.0020.0002] # EGYPTIAN HIEROGLYPH NL012 +1322D ; [.5040.0020.0002] # EGYPTIAN HIEROGLYPH NL013 +1322E ; [.5041.0020.0002] # EGYPTIAN HIEROGLYPH NL014 +1322F ; [.5042.0020.0002] # EGYPTIAN HIEROGLYPH NL015 +13230 ; [.5043.0020.0002] # EGYPTIAN HIEROGLYPH NL016 +13231 ; [.5044.0020.0002] # EGYPTIAN HIEROGLYPH NL017 +13232 ; [.5045.0020.0002] # EGYPTIAN HIEROGLYPH NL017A +13233 ; [.5046.0020.0002] # EGYPTIAN HIEROGLYPH NL018 +13234 ; [.5047.0020.0002] # EGYPTIAN HIEROGLYPH NL019 +13235 ; [.5048.0020.0002] # EGYPTIAN HIEROGLYPH NL020 +13236 ; [.5049.0020.0002] # EGYPTIAN HIEROGLYPH NU001 +13237 ; [.504A.0020.0002] # EGYPTIAN HIEROGLYPH NU002 +13238 ; [.504B.0020.0002] # EGYPTIAN HIEROGLYPH NU003 +13239 ; [.504C.0020.0002] # EGYPTIAN HIEROGLYPH NU004 +1323A ; [.504D.0020.0002] # EGYPTIAN HIEROGLYPH NU005 +1323B ; [.504E.0020.0002] # EGYPTIAN HIEROGLYPH NU006 +1323C ; [.504F.0020.0002] # EGYPTIAN HIEROGLYPH NU007 +1323D ; [.5050.0020.0002] # EGYPTIAN HIEROGLYPH NU008 +1323E ; [.5051.0020.0002] # EGYPTIAN HIEROGLYPH NU009 +1323F ; [.5052.0020.0002] # EGYPTIAN HIEROGLYPH NU010 +13240 ; [.5053.0020.0002] # EGYPTIAN HIEROGLYPH NU010A +13241 ; [.5054.0020.0002] # EGYPTIAN HIEROGLYPH NU011 +13242 ; [.5055.0020.0002] # EGYPTIAN HIEROGLYPH NU011A +13243 ; [.5056.0020.0002] # EGYPTIAN HIEROGLYPH NU012 +13244 ; [.5057.0020.0002] # EGYPTIAN HIEROGLYPH NU013 +13245 ; [.5058.0020.0002] # EGYPTIAN HIEROGLYPH NU014 +13246 ; [.5059.0020.0002] # EGYPTIAN HIEROGLYPH NU015 +13247 ; [.505A.0020.0002] # EGYPTIAN HIEROGLYPH NU016 +13248 ; [.505B.0020.0002] # EGYPTIAN HIEROGLYPH NU017 +13249 ; [.505C.0020.0002] # EGYPTIAN HIEROGLYPH NU018 +1324A ; [.505D.0020.0002] # EGYPTIAN HIEROGLYPH NU018A +1324B ; [.505E.0020.0002] # EGYPTIAN HIEROGLYPH NU019 +1324C ; [.505F.0020.0002] # EGYPTIAN HIEROGLYPH NU020 +1324D ; [.5060.0020.0002] # EGYPTIAN HIEROGLYPH NU021 +1324E ; [.5061.0020.0002] # EGYPTIAN HIEROGLYPH NU022 +1324F ; [.5062.0020.0002] # EGYPTIAN HIEROGLYPH NU022A +13250 ; [.5063.0020.0002] # EGYPTIAN HIEROGLYPH O001 +13251 ; [.5064.0020.0002] # EGYPTIAN HIEROGLYPH O001A +13252 ; [.5065.0020.0002] # EGYPTIAN HIEROGLYPH O002 +13253 ; [.5066.0020.0002] # EGYPTIAN HIEROGLYPH O003 +13254 ; [.5067.0020.0002] # EGYPTIAN HIEROGLYPH O004 +13255 ; [.5068.0020.0002] # EGYPTIAN HIEROGLYPH O005 +13256 ; [.5069.0020.0002] # EGYPTIAN HIEROGLYPH O005A +13257 ; [.506A.0020.0002] # EGYPTIAN HIEROGLYPH O006 +13258 ; [.506B.0020.0002] # EGYPTIAN HIEROGLYPH O006A +13259 ; [.506C.0020.0002] # EGYPTIAN HIEROGLYPH O006B +1325A ; [.506D.0020.0002] # EGYPTIAN HIEROGLYPH O006C +1325B ; [.506E.0020.0002] # EGYPTIAN HIEROGLYPH O006D +1325C ; [.506F.0020.0002] # EGYPTIAN HIEROGLYPH O006E +1325D ; [.5070.0020.0002] # EGYPTIAN HIEROGLYPH O006F +1325E ; [.5071.0020.0002] # EGYPTIAN HIEROGLYPH O007 +1325F ; [.5072.0020.0002] # EGYPTIAN HIEROGLYPH O008 +13260 ; [.5073.0020.0002] # EGYPTIAN HIEROGLYPH O009 +13261 ; [.5074.0020.0002] # EGYPTIAN HIEROGLYPH O010 +13262 ; [.5075.0020.0002] # EGYPTIAN HIEROGLYPH O010A +13263 ; [.5076.0020.0002] # EGYPTIAN HIEROGLYPH O010B +13264 ; [.5077.0020.0002] # EGYPTIAN HIEROGLYPH O010C +13265 ; [.5078.0020.0002] # EGYPTIAN HIEROGLYPH O011 +13266 ; [.5079.0020.0002] # EGYPTIAN HIEROGLYPH O012 +13267 ; [.507A.0020.0002] # EGYPTIAN HIEROGLYPH O013 +13268 ; [.507B.0020.0002] # EGYPTIAN HIEROGLYPH O014 +13269 ; [.507C.0020.0002] # EGYPTIAN HIEROGLYPH O015 +1326A ; [.507D.0020.0002] # EGYPTIAN HIEROGLYPH O016 +1326B ; [.507E.0020.0002] # EGYPTIAN HIEROGLYPH O017 +1326C ; [.507F.0020.0002] # EGYPTIAN HIEROGLYPH O018 +1326D ; [.5080.0020.0002] # EGYPTIAN HIEROGLYPH O019 +1326E ; [.5081.0020.0002] # EGYPTIAN HIEROGLYPH O019A +1326F ; [.5082.0020.0002] # EGYPTIAN HIEROGLYPH O020 +13270 ; [.5083.0020.0002] # EGYPTIAN HIEROGLYPH O020A +13271 ; [.5084.0020.0002] # EGYPTIAN HIEROGLYPH O021 +13272 ; [.5085.0020.0002] # EGYPTIAN HIEROGLYPH O022 +13273 ; [.5086.0020.0002] # EGYPTIAN HIEROGLYPH O023 +13274 ; [.5087.0020.0002] # EGYPTIAN HIEROGLYPH O024 +13275 ; [.5088.0020.0002] # EGYPTIAN HIEROGLYPH O024A +13276 ; [.5089.0020.0002] # EGYPTIAN HIEROGLYPH O025 +13277 ; [.508A.0020.0002] # EGYPTIAN HIEROGLYPH O025A +13278 ; [.508B.0020.0002] # EGYPTIAN HIEROGLYPH O026 +13279 ; [.508C.0020.0002] # EGYPTIAN HIEROGLYPH O027 +1327A ; [.508D.0020.0002] # EGYPTIAN HIEROGLYPH O028 +1327B ; [.508E.0020.0002] # EGYPTIAN HIEROGLYPH O029 +1327C ; [.508F.0020.0002] # EGYPTIAN HIEROGLYPH O029A +1327D ; [.5090.0020.0002] # EGYPTIAN HIEROGLYPH O030 +1327E ; [.5091.0020.0002] # EGYPTIAN HIEROGLYPH O030A +1327F ; [.5092.0020.0002] # EGYPTIAN HIEROGLYPH O031 +13280 ; [.5093.0020.0002] # EGYPTIAN HIEROGLYPH O032 +13281 ; [.5094.0020.0002] # EGYPTIAN HIEROGLYPH O033 +13282 ; [.5095.0020.0002] # EGYPTIAN HIEROGLYPH O033A +13283 ; [.5096.0020.0002] # EGYPTIAN HIEROGLYPH O034 +13284 ; [.5097.0020.0002] # EGYPTIAN HIEROGLYPH O035 +13285 ; [.5098.0020.0002] # EGYPTIAN HIEROGLYPH O036 +13286 ; [.5099.0020.0002] # EGYPTIAN HIEROGLYPH O036A +13287 ; [.509A.0020.0002] # EGYPTIAN HIEROGLYPH O036B +13288 ; [.509B.0020.0002] # EGYPTIAN HIEROGLYPH O036C +13289 ; [.509C.0020.0002] # EGYPTIAN HIEROGLYPH O036D +1328A ; [.509D.0020.0002] # EGYPTIAN HIEROGLYPH O037 +1328B ; [.509E.0020.0002] # EGYPTIAN HIEROGLYPH O038 +1328C ; [.509F.0020.0002] # EGYPTIAN HIEROGLYPH O039 +1328D ; [.50A0.0020.0002] # EGYPTIAN HIEROGLYPH O040 +1328E ; [.50A1.0020.0002] # EGYPTIAN HIEROGLYPH O041 +1328F ; [.50A2.0020.0002] # EGYPTIAN HIEROGLYPH O042 +13290 ; [.50A3.0020.0002] # EGYPTIAN HIEROGLYPH O043 +13291 ; [.50A4.0020.0002] # EGYPTIAN HIEROGLYPH O044 +13292 ; [.50A5.0020.0002] # EGYPTIAN HIEROGLYPH O045 +13293 ; [.50A6.0020.0002] # EGYPTIAN HIEROGLYPH O046 +13294 ; [.50A7.0020.0002] # EGYPTIAN HIEROGLYPH O047 +13295 ; [.50A8.0020.0002] # EGYPTIAN HIEROGLYPH O048 +13296 ; [.50A9.0020.0002] # EGYPTIAN HIEROGLYPH O049 +13297 ; [.50AA.0020.0002] # EGYPTIAN HIEROGLYPH O050 +13298 ; [.50AB.0020.0002] # EGYPTIAN HIEROGLYPH O050A +13299 ; [.50AC.0020.0002] # EGYPTIAN HIEROGLYPH O050B +1329A ; [.50AD.0020.0002] # EGYPTIAN HIEROGLYPH O051 +1329B ; [.50AE.0020.0002] # EGYPTIAN HIEROGLYPH P001 +1329C ; [.50AF.0020.0002] # EGYPTIAN HIEROGLYPH P001A +1329D ; [.50B0.0020.0002] # EGYPTIAN HIEROGLYPH P002 +1329E ; [.50B1.0020.0002] # EGYPTIAN HIEROGLYPH P003 +1329F ; [.50B2.0020.0002] # EGYPTIAN HIEROGLYPH P003A +132A0 ; [.50B3.0020.0002] # EGYPTIAN HIEROGLYPH P004 +132A1 ; [.50B4.0020.0002] # EGYPTIAN HIEROGLYPH P005 +132A2 ; [.50B5.0020.0002] # EGYPTIAN HIEROGLYPH P006 +132A3 ; [.50B6.0020.0002] # EGYPTIAN HIEROGLYPH P007 +132A4 ; [.50B7.0020.0002] # EGYPTIAN HIEROGLYPH P008 +132A5 ; [.50B8.0020.0002] # EGYPTIAN HIEROGLYPH P009 +132A6 ; [.50B9.0020.0002] # EGYPTIAN HIEROGLYPH P010 +132A7 ; [.50BA.0020.0002] # EGYPTIAN HIEROGLYPH P011 +132A8 ; [.50BB.0020.0002] # EGYPTIAN HIEROGLYPH Q001 +132A9 ; [.50BC.0020.0002] # EGYPTIAN HIEROGLYPH Q002 +132AA ; [.50BD.0020.0002] # EGYPTIAN HIEROGLYPH Q003 +132AB ; [.50BE.0020.0002] # EGYPTIAN HIEROGLYPH Q004 +132AC ; [.50BF.0020.0002] # EGYPTIAN HIEROGLYPH Q005 +132AD ; [.50C0.0020.0002] # EGYPTIAN HIEROGLYPH Q006 +132AE ; [.50C1.0020.0002] # EGYPTIAN HIEROGLYPH Q007 +132AF ; [.50C2.0020.0002] # EGYPTIAN HIEROGLYPH R001 +132B0 ; [.50C3.0020.0002] # EGYPTIAN HIEROGLYPH R002 +132B1 ; [.50C4.0020.0002] # EGYPTIAN HIEROGLYPH R002A +132B2 ; [.50C5.0020.0002] # EGYPTIAN HIEROGLYPH R003 +132B3 ; [.50C6.0020.0002] # EGYPTIAN HIEROGLYPH R003A +132B4 ; [.50C7.0020.0002] # EGYPTIAN HIEROGLYPH R003B +132B5 ; [.50C8.0020.0002] # EGYPTIAN HIEROGLYPH R004 +132B6 ; [.50C9.0020.0002] # EGYPTIAN HIEROGLYPH R005 +132B7 ; [.50CA.0020.0002] # EGYPTIAN HIEROGLYPH R006 +132B8 ; [.50CB.0020.0002] # EGYPTIAN HIEROGLYPH R007 +132B9 ; [.50CC.0020.0002] # EGYPTIAN HIEROGLYPH R008 +132BA ; [.50CD.0020.0002] # EGYPTIAN HIEROGLYPH R009 +132BB ; [.50CE.0020.0002] # EGYPTIAN HIEROGLYPH R010 +132BC ; [.50CF.0020.0002] # EGYPTIAN HIEROGLYPH R010A +132BD ; [.50D0.0020.0002] # EGYPTIAN HIEROGLYPH R011 +132BE ; [.50D1.0020.0002] # EGYPTIAN HIEROGLYPH R012 +132BF ; [.50D2.0020.0002] # EGYPTIAN HIEROGLYPH R013 +132C0 ; [.50D3.0020.0002] # EGYPTIAN HIEROGLYPH R014 +132C1 ; [.50D4.0020.0002] # EGYPTIAN HIEROGLYPH R015 +132C2 ; [.50D5.0020.0002] # EGYPTIAN HIEROGLYPH R016 +132C3 ; [.50D6.0020.0002] # EGYPTIAN HIEROGLYPH R016A +132C4 ; [.50D7.0020.0002] # EGYPTIAN HIEROGLYPH R017 +132C5 ; [.50D8.0020.0002] # EGYPTIAN HIEROGLYPH R018 +132C6 ; [.50D9.0020.0002] # EGYPTIAN HIEROGLYPH R019 +132C7 ; [.50DA.0020.0002] # EGYPTIAN HIEROGLYPH R020 +132C8 ; [.50DB.0020.0002] # EGYPTIAN HIEROGLYPH R021 +132C9 ; [.50DC.0020.0002] # EGYPTIAN HIEROGLYPH R022 +132CA ; [.50DD.0020.0002] # EGYPTIAN HIEROGLYPH R023 +132CB ; [.50DE.0020.0002] # EGYPTIAN HIEROGLYPH R024 +132CC ; [.50DF.0020.0002] # EGYPTIAN HIEROGLYPH R025 +132CD ; [.50E0.0020.0002] # EGYPTIAN HIEROGLYPH R026 +132CE ; [.50E1.0020.0002] # EGYPTIAN HIEROGLYPH R027 +132CF ; [.50E2.0020.0002] # EGYPTIAN HIEROGLYPH R028 +132D0 ; [.50E3.0020.0002] # EGYPTIAN HIEROGLYPH R029 +132D1 ; [.50E4.0020.0002] # EGYPTIAN HIEROGLYPH S001 +132D2 ; [.50E5.0020.0002] # EGYPTIAN HIEROGLYPH S002 +132D3 ; [.50E6.0020.0002] # EGYPTIAN HIEROGLYPH S002A +132D4 ; [.50E7.0020.0002] # EGYPTIAN HIEROGLYPH S003 +132D5 ; [.50E8.0020.0002] # EGYPTIAN HIEROGLYPH S004 +132D6 ; [.50E9.0020.0002] # EGYPTIAN HIEROGLYPH S005 +132D7 ; [.50EA.0020.0002] # EGYPTIAN HIEROGLYPH S006 +132D8 ; [.50EB.0020.0002] # EGYPTIAN HIEROGLYPH S006A +132D9 ; [.50EC.0020.0002] # EGYPTIAN HIEROGLYPH S007 +132DA ; [.50ED.0020.0002] # EGYPTIAN HIEROGLYPH S008 +132DB ; [.50EE.0020.0002] # EGYPTIAN HIEROGLYPH S009 +132DC ; [.50EF.0020.0002] # EGYPTIAN HIEROGLYPH S010 +132DD ; [.50F0.0020.0002] # EGYPTIAN HIEROGLYPH S011 +132DE ; [.50F1.0020.0002] # EGYPTIAN HIEROGLYPH S012 +132DF ; [.50F2.0020.0002] # EGYPTIAN HIEROGLYPH S013 +132E0 ; [.50F3.0020.0002] # EGYPTIAN HIEROGLYPH S014 +132E1 ; [.50F4.0020.0002] # EGYPTIAN HIEROGLYPH S014A +132E2 ; [.50F5.0020.0002] # EGYPTIAN HIEROGLYPH S014B +132E3 ; [.50F6.0020.0002] # EGYPTIAN HIEROGLYPH S015 +132E4 ; [.50F7.0020.0002] # EGYPTIAN HIEROGLYPH S016 +132E5 ; [.50F8.0020.0002] # EGYPTIAN HIEROGLYPH S017 +132E6 ; [.50F9.0020.0002] # EGYPTIAN HIEROGLYPH S017A +132E7 ; [.50FA.0020.0002] # EGYPTIAN HIEROGLYPH S018 +132E8 ; [.50FB.0020.0002] # EGYPTIAN HIEROGLYPH S019 +132E9 ; [.50FC.0020.0002] # EGYPTIAN HIEROGLYPH S020 +132EA ; [.50FD.0020.0002] # EGYPTIAN HIEROGLYPH S021 +132EB ; [.50FE.0020.0002] # EGYPTIAN HIEROGLYPH S022 +132EC ; [.50FF.0020.0002] # EGYPTIAN HIEROGLYPH S023 +132ED ; [.5100.0020.0002] # EGYPTIAN HIEROGLYPH S024 +132EE ; [.5101.0020.0002] # EGYPTIAN HIEROGLYPH S025 +132EF ; [.5102.0020.0002] # EGYPTIAN HIEROGLYPH S026 +132F0 ; [.5103.0020.0002] # EGYPTIAN HIEROGLYPH S026A +132F1 ; [.5104.0020.0002] # EGYPTIAN HIEROGLYPH S026B +132F2 ; [.5105.0020.0002] # EGYPTIAN HIEROGLYPH S027 +132F3 ; [.5106.0020.0002] # EGYPTIAN HIEROGLYPH S028 +132F4 ; [.5107.0020.0002] # EGYPTIAN HIEROGLYPH S029 +132F5 ; [.5108.0020.0002] # EGYPTIAN HIEROGLYPH S030 +132F6 ; [.5109.0020.0002] # EGYPTIAN HIEROGLYPH S031 +132F7 ; [.510A.0020.0002] # EGYPTIAN HIEROGLYPH S032 +132F8 ; [.510B.0020.0002] # EGYPTIAN HIEROGLYPH S033 +132F9 ; [.510C.0020.0002] # EGYPTIAN HIEROGLYPH S034 +132FA ; [.510D.0020.0002] # EGYPTIAN HIEROGLYPH S035 +132FB ; [.510E.0020.0002] # EGYPTIAN HIEROGLYPH S035A +132FC ; [.510F.0020.0002] # EGYPTIAN HIEROGLYPH S036 +132FD ; [.5110.0020.0002] # EGYPTIAN HIEROGLYPH S037 +132FE ; [.5111.0020.0002] # EGYPTIAN HIEROGLYPH S038 +132FF ; [.5112.0020.0002] # EGYPTIAN HIEROGLYPH S039 +13300 ; [.5113.0020.0002] # EGYPTIAN HIEROGLYPH S040 +13301 ; [.5114.0020.0002] # EGYPTIAN HIEROGLYPH S041 +13302 ; [.5115.0020.0002] # EGYPTIAN HIEROGLYPH S042 +13303 ; [.5116.0020.0002] # EGYPTIAN HIEROGLYPH S043 +13304 ; [.5117.0020.0002] # EGYPTIAN HIEROGLYPH S044 +13305 ; [.5118.0020.0002] # EGYPTIAN HIEROGLYPH S045 +13306 ; [.5119.0020.0002] # EGYPTIAN HIEROGLYPH S046 +13307 ; [.511A.0020.0002] # EGYPTIAN HIEROGLYPH T001 +13308 ; [.511B.0020.0002] # EGYPTIAN HIEROGLYPH T002 +13309 ; [.511C.0020.0002] # EGYPTIAN HIEROGLYPH T003 +1330A ; [.511D.0020.0002] # EGYPTIAN HIEROGLYPH T003A +1330B ; [.511E.0020.0002] # EGYPTIAN HIEROGLYPH T004 +1330C ; [.511F.0020.0002] # EGYPTIAN HIEROGLYPH T005 +1330D ; [.5120.0020.0002] # EGYPTIAN HIEROGLYPH T006 +1330E ; [.5121.0020.0002] # EGYPTIAN HIEROGLYPH T007 +1330F ; [.5122.0020.0002] # EGYPTIAN HIEROGLYPH T007A +13310 ; [.5123.0020.0002] # EGYPTIAN HIEROGLYPH T008 +13311 ; [.5124.0020.0002] # EGYPTIAN HIEROGLYPH T008A +13312 ; [.5125.0020.0002] # EGYPTIAN HIEROGLYPH T009 +13313 ; [.5126.0020.0002] # EGYPTIAN HIEROGLYPH T009A +13314 ; [.5127.0020.0002] # EGYPTIAN HIEROGLYPH T010 +13315 ; [.5128.0020.0002] # EGYPTIAN HIEROGLYPH T011 +13316 ; [.5129.0020.0002] # EGYPTIAN HIEROGLYPH T011A +13317 ; [.512A.0020.0002] # EGYPTIAN HIEROGLYPH T012 +13318 ; [.512B.0020.0002] # EGYPTIAN HIEROGLYPH T013 +13319 ; [.512C.0020.0002] # EGYPTIAN HIEROGLYPH T014 +1331A ; [.512D.0020.0002] # EGYPTIAN HIEROGLYPH T015 +1331B ; [.512E.0020.0002] # EGYPTIAN HIEROGLYPH T016 +1331C ; [.512F.0020.0002] # EGYPTIAN HIEROGLYPH T016A +1331D ; [.5130.0020.0002] # EGYPTIAN HIEROGLYPH T017 +1331E ; [.5131.0020.0002] # EGYPTIAN HIEROGLYPH T018 +1331F ; [.5132.0020.0002] # EGYPTIAN HIEROGLYPH T019 +13320 ; [.5133.0020.0002] # EGYPTIAN HIEROGLYPH T020 +13321 ; [.5134.0020.0002] # EGYPTIAN HIEROGLYPH T021 +13322 ; [.5135.0020.0002] # EGYPTIAN HIEROGLYPH T022 +13323 ; [.5136.0020.0002] # EGYPTIAN HIEROGLYPH T023 +13324 ; [.5137.0020.0002] # EGYPTIAN HIEROGLYPH T024 +13325 ; [.5138.0020.0002] # EGYPTIAN HIEROGLYPH T025 +13326 ; [.5139.0020.0002] # EGYPTIAN HIEROGLYPH T026 +13327 ; [.513A.0020.0002] # EGYPTIAN HIEROGLYPH T027 +13328 ; [.513B.0020.0002] # EGYPTIAN HIEROGLYPH T028 +13329 ; [.513C.0020.0002] # EGYPTIAN HIEROGLYPH T029 +1332A ; [.513D.0020.0002] # EGYPTIAN HIEROGLYPH T030 +1332B ; [.513E.0020.0002] # EGYPTIAN HIEROGLYPH T031 +1332C ; [.513F.0020.0002] # EGYPTIAN HIEROGLYPH T032 +1332D ; [.5140.0020.0002] # EGYPTIAN HIEROGLYPH T032A +1332E ; [.5141.0020.0002] # EGYPTIAN HIEROGLYPH T033 +1332F ; [.5142.0020.0002] # EGYPTIAN HIEROGLYPH T033A +13330 ; [.5143.0020.0002] # EGYPTIAN HIEROGLYPH T034 +13331 ; [.5144.0020.0002] # EGYPTIAN HIEROGLYPH T035 +13332 ; [.5145.0020.0002] # EGYPTIAN HIEROGLYPH T036 +13333 ; [.5146.0020.0002] # EGYPTIAN HIEROGLYPH U001 +13334 ; [.5147.0020.0002] # EGYPTIAN HIEROGLYPH U002 +13335 ; [.5148.0020.0002] # EGYPTIAN HIEROGLYPH U003 +13336 ; [.5149.0020.0002] # EGYPTIAN HIEROGLYPH U004 +13337 ; [.514A.0020.0002] # EGYPTIAN HIEROGLYPH U005 +13338 ; [.514B.0020.0002] # EGYPTIAN HIEROGLYPH U006 +13339 ; [.514C.0020.0002] # EGYPTIAN HIEROGLYPH U006A +1333A ; [.514D.0020.0002] # EGYPTIAN HIEROGLYPH U006B +1333B ; [.514E.0020.0002] # EGYPTIAN HIEROGLYPH U007 +1333C ; [.514F.0020.0002] # EGYPTIAN HIEROGLYPH U008 +1333D ; [.5150.0020.0002] # EGYPTIAN HIEROGLYPH U009 +1333E ; [.5151.0020.0002] # EGYPTIAN HIEROGLYPH U010 +1333F ; [.5152.0020.0002] # EGYPTIAN HIEROGLYPH U011 +13340 ; [.5153.0020.0002] # EGYPTIAN HIEROGLYPH U012 +13341 ; [.5154.0020.0002] # EGYPTIAN HIEROGLYPH U013 +13342 ; [.5155.0020.0002] # EGYPTIAN HIEROGLYPH U014 +13343 ; [.5156.0020.0002] # EGYPTIAN HIEROGLYPH U015 +13344 ; [.5157.0020.0002] # EGYPTIAN HIEROGLYPH U016 +13345 ; [.5158.0020.0002] # EGYPTIAN HIEROGLYPH U017 +13346 ; [.5159.0020.0002] # EGYPTIAN HIEROGLYPH U018 +13347 ; [.515A.0020.0002] # EGYPTIAN HIEROGLYPH U019 +13348 ; [.515B.0020.0002] # EGYPTIAN HIEROGLYPH U020 +13349 ; [.515C.0020.0002] # EGYPTIAN HIEROGLYPH U021 +1334A ; [.515D.0020.0002] # EGYPTIAN HIEROGLYPH U022 +1334B ; [.515E.0020.0002] # EGYPTIAN HIEROGLYPH U023 +1334C ; [.515F.0020.0002] # EGYPTIAN HIEROGLYPH U023A +1334D ; [.5160.0020.0002] # EGYPTIAN HIEROGLYPH U024 +1334E ; [.5161.0020.0002] # EGYPTIAN HIEROGLYPH U025 +1334F ; [.5162.0020.0002] # EGYPTIAN HIEROGLYPH U026 +13350 ; [.5163.0020.0002] # EGYPTIAN HIEROGLYPH U027 +13351 ; [.5164.0020.0002] # EGYPTIAN HIEROGLYPH U028 +13352 ; [.5165.0020.0002] # EGYPTIAN HIEROGLYPH U029 +13353 ; [.5166.0020.0002] # EGYPTIAN HIEROGLYPH U029A +13354 ; [.5167.0020.0002] # EGYPTIAN HIEROGLYPH U030 +13355 ; [.5168.0020.0002] # EGYPTIAN HIEROGLYPH U031 +13356 ; [.5169.0020.0002] # EGYPTIAN HIEROGLYPH U032 +13357 ; [.516A.0020.0002] # EGYPTIAN HIEROGLYPH U032A +13358 ; [.516B.0020.0002] # EGYPTIAN HIEROGLYPH U033 +13359 ; [.516C.0020.0002] # EGYPTIAN HIEROGLYPH U034 +1335A ; [.516D.0020.0002] # EGYPTIAN HIEROGLYPH U035 +1335B ; [.516E.0020.0002] # EGYPTIAN HIEROGLYPH U036 +1335C ; [.516F.0020.0002] # EGYPTIAN HIEROGLYPH U037 +1335D ; [.5170.0020.0002] # EGYPTIAN HIEROGLYPH U038 +1335E ; [.5171.0020.0002] # EGYPTIAN HIEROGLYPH U039 +1335F ; [.5172.0020.0002] # EGYPTIAN HIEROGLYPH U040 +13360 ; [.5173.0020.0002] # EGYPTIAN HIEROGLYPH U041 +13361 ; [.5174.0020.0002] # EGYPTIAN HIEROGLYPH U042 +13362 ; [.5175.0020.0002] # EGYPTIAN HIEROGLYPH V001 +13363 ; [.5176.0020.0002] # EGYPTIAN HIEROGLYPH V001A +13364 ; [.5177.0020.0002] # EGYPTIAN HIEROGLYPH V001B +13365 ; [.5178.0020.0002] # EGYPTIAN HIEROGLYPH V001C +13366 ; [.5179.0020.0002] # EGYPTIAN HIEROGLYPH V001D +13367 ; [.517A.0020.0002] # EGYPTIAN HIEROGLYPH V001E +13368 ; [.517B.0020.0002] # EGYPTIAN HIEROGLYPH V001F +13369 ; [.517C.0020.0002] # EGYPTIAN HIEROGLYPH V001G +1336A ; [.517D.0020.0002] # EGYPTIAN HIEROGLYPH V001H +1336B ; [.517E.0020.0002] # EGYPTIAN HIEROGLYPH V001I +1336C ; [.517F.0020.0002] # EGYPTIAN HIEROGLYPH V002 +1336D ; [.5180.0020.0002] # EGYPTIAN HIEROGLYPH V002A +1336E ; [.5181.0020.0002] # EGYPTIAN HIEROGLYPH V003 +1336F ; [.5182.0020.0002] # EGYPTIAN HIEROGLYPH V004 +13370 ; [.5183.0020.0002] # EGYPTIAN HIEROGLYPH V005 +13371 ; [.5184.0020.0002] # EGYPTIAN HIEROGLYPH V006 +13372 ; [.5185.0020.0002] # EGYPTIAN HIEROGLYPH V007 +13373 ; [.5186.0020.0002] # EGYPTIAN HIEROGLYPH V007A +13374 ; [.5187.0020.0002] # EGYPTIAN HIEROGLYPH V007B +13375 ; [.5188.0020.0002] # EGYPTIAN HIEROGLYPH V008 +13376 ; [.5189.0020.0002] # EGYPTIAN HIEROGLYPH V009 +13377 ; [.518A.0020.0002] # EGYPTIAN HIEROGLYPH V010 +13378 ; [.518B.0020.0002] # EGYPTIAN HIEROGLYPH V011 +13379 ; [.518C.0020.0002] # EGYPTIAN HIEROGLYPH V011A +1337A ; [.518D.0020.0002] # EGYPTIAN HIEROGLYPH V011B +1337B ; [.518E.0020.0002] # EGYPTIAN HIEROGLYPH V011C +1337C ; [.518F.0020.0002] # EGYPTIAN HIEROGLYPH V012 +1337D ; [.5190.0020.0002] # EGYPTIAN HIEROGLYPH V012A +1337E ; [.5191.0020.0002] # EGYPTIAN HIEROGLYPH V012B +1337F ; [.5192.0020.0002] # EGYPTIAN HIEROGLYPH V013 +13380 ; [.5193.0020.0002] # EGYPTIAN HIEROGLYPH V014 +13381 ; [.5194.0020.0002] # EGYPTIAN HIEROGLYPH V015 +13382 ; [.5195.0020.0002] # EGYPTIAN HIEROGLYPH V016 +13383 ; [.5196.0020.0002] # EGYPTIAN HIEROGLYPH V017 +13384 ; [.5197.0020.0002] # EGYPTIAN HIEROGLYPH V018 +13385 ; [.5198.0020.0002] # EGYPTIAN HIEROGLYPH V019 +13386 ; [.5199.0020.0002] # EGYPTIAN HIEROGLYPH V020 +13387 ; [.519A.0020.0002] # EGYPTIAN HIEROGLYPH V020A +13388 ; [.519B.0020.0002] # EGYPTIAN HIEROGLYPH V020B +13389 ; [.519C.0020.0002] # EGYPTIAN HIEROGLYPH V020C +1338A ; [.519D.0020.0002] # EGYPTIAN HIEROGLYPH V020D +1338B ; [.519E.0020.0002] # EGYPTIAN HIEROGLYPH V020E +1338C ; [.519F.0020.0002] # EGYPTIAN HIEROGLYPH V020F +1338D ; [.51A0.0020.0002] # EGYPTIAN HIEROGLYPH V020G +1338E ; [.51A1.0020.0002] # EGYPTIAN HIEROGLYPH V020H +1338F ; [.51A2.0020.0002] # EGYPTIAN HIEROGLYPH V020I +13390 ; [.51A3.0020.0002] # EGYPTIAN HIEROGLYPH V020J +13391 ; [.51A4.0020.0002] # EGYPTIAN HIEROGLYPH V020K +13392 ; [.51A5.0020.0002] # EGYPTIAN HIEROGLYPH V020L +13393 ; [.51A6.0020.0002] # EGYPTIAN HIEROGLYPH V021 +13394 ; [.51A7.0020.0002] # EGYPTIAN HIEROGLYPH V022 +13395 ; [.51A8.0020.0002] # EGYPTIAN HIEROGLYPH V023 +13396 ; [.51A9.0020.0002] # EGYPTIAN HIEROGLYPH V023A +13397 ; [.51AA.0020.0002] # EGYPTIAN HIEROGLYPH V024 +13398 ; [.51AB.0020.0002] # EGYPTIAN HIEROGLYPH V025 +13399 ; [.51AC.0020.0002] # EGYPTIAN HIEROGLYPH V026 +1339A ; [.51AD.0020.0002] # EGYPTIAN HIEROGLYPH V027 +1339B ; [.51AE.0020.0002] # EGYPTIAN HIEROGLYPH V028 +1339C ; [.51AF.0020.0002] # EGYPTIAN HIEROGLYPH V028A +1339D ; [.51B0.0020.0002] # EGYPTIAN HIEROGLYPH V029 +1339E ; [.51B1.0020.0002] # EGYPTIAN HIEROGLYPH V029A +1339F ; [.51B2.0020.0002] # EGYPTIAN HIEROGLYPH V030 +133A0 ; [.51B3.0020.0002] # EGYPTIAN HIEROGLYPH V030A +133A1 ; [.51B4.0020.0002] # EGYPTIAN HIEROGLYPH V031 +133A2 ; [.51B5.0020.0002] # EGYPTIAN HIEROGLYPH V031A +133A3 ; [.51B6.0020.0002] # EGYPTIAN HIEROGLYPH V032 +133A4 ; [.51B7.0020.0002] # EGYPTIAN HIEROGLYPH V033 +133A5 ; [.51B8.0020.0002] # EGYPTIAN HIEROGLYPH V033A +133A6 ; [.51B9.0020.0002] # EGYPTIAN HIEROGLYPH V034 +133A7 ; [.51BA.0020.0002] # EGYPTIAN HIEROGLYPH V035 +133A8 ; [.51BB.0020.0002] # EGYPTIAN HIEROGLYPH V036 +133A9 ; [.51BC.0020.0002] # EGYPTIAN HIEROGLYPH V037 +133AA ; [.51BD.0020.0002] # EGYPTIAN HIEROGLYPH V037A +133AB ; [.51BE.0020.0002] # EGYPTIAN HIEROGLYPH V038 +133AC ; [.51BF.0020.0002] # EGYPTIAN HIEROGLYPH V039 +133AD ; [.51C0.0020.0002] # EGYPTIAN HIEROGLYPH V040 +133AE ; [.51C1.0020.0002] # EGYPTIAN HIEROGLYPH V040A +133AF ; [.51C2.0020.0002] # EGYPTIAN HIEROGLYPH W001 +133B0 ; [.51C3.0020.0002] # EGYPTIAN HIEROGLYPH W002 +133B1 ; [.51C4.0020.0002] # EGYPTIAN HIEROGLYPH W003 +133B2 ; [.51C5.0020.0002] # EGYPTIAN HIEROGLYPH W003A +133B3 ; [.51C6.0020.0002] # EGYPTIAN HIEROGLYPH W004 +133B4 ; [.51C7.0020.0002] # EGYPTIAN HIEROGLYPH W005 +133B5 ; [.51C8.0020.0002] # EGYPTIAN HIEROGLYPH W006 +133B6 ; [.51C9.0020.0002] # EGYPTIAN HIEROGLYPH W007 +133B7 ; [.51CA.0020.0002] # EGYPTIAN HIEROGLYPH W008 +133B8 ; [.51CB.0020.0002] # EGYPTIAN HIEROGLYPH W009 +133B9 ; [.51CC.0020.0002] # EGYPTIAN HIEROGLYPH W009A +133BA ; [.51CD.0020.0002] # EGYPTIAN HIEROGLYPH W010 +133BB ; [.51CE.0020.0002] # EGYPTIAN HIEROGLYPH W010A +133BC ; [.51CF.0020.0002] # EGYPTIAN HIEROGLYPH W011 +133BD ; [.51D0.0020.0002] # EGYPTIAN HIEROGLYPH W012 +133BE ; [.51D1.0020.0002] # EGYPTIAN HIEROGLYPH W013 +133BF ; [.51D2.0020.0002] # EGYPTIAN HIEROGLYPH W014 +133C0 ; [.51D3.0020.0002] # EGYPTIAN HIEROGLYPH W014A +133C1 ; [.51D4.0020.0002] # EGYPTIAN HIEROGLYPH W015 +133C2 ; [.51D5.0020.0002] # EGYPTIAN HIEROGLYPH W016 +133C3 ; [.51D6.0020.0002] # EGYPTIAN HIEROGLYPH W017 +133C4 ; [.51D7.0020.0002] # EGYPTIAN HIEROGLYPH W017A +133C5 ; [.51D8.0020.0002] # EGYPTIAN HIEROGLYPH W018 +133C6 ; [.51D9.0020.0002] # EGYPTIAN HIEROGLYPH W018A +133C7 ; [.51DA.0020.0002] # EGYPTIAN HIEROGLYPH W019 +133C8 ; [.51DB.0020.0002] # EGYPTIAN HIEROGLYPH W020 +133C9 ; [.51DC.0020.0002] # EGYPTIAN HIEROGLYPH W021 +133CA ; [.51DD.0020.0002] # EGYPTIAN HIEROGLYPH W022 +133CB ; [.51DE.0020.0002] # EGYPTIAN HIEROGLYPH W023 +133CC ; [.51DF.0020.0002] # EGYPTIAN HIEROGLYPH W024 +133CD ; [.51E0.0020.0002] # EGYPTIAN HIEROGLYPH W024A +133CE ; [.51E1.0020.0002] # EGYPTIAN HIEROGLYPH W025 +133CF ; [.51E2.0020.0002] # EGYPTIAN HIEROGLYPH X001 +133D0 ; [.51E3.0020.0002] # EGYPTIAN HIEROGLYPH X002 +133D1 ; [.51E4.0020.0002] # EGYPTIAN HIEROGLYPH X003 +133D2 ; [.51E5.0020.0002] # EGYPTIAN HIEROGLYPH X004 +133D3 ; [.51E6.0020.0002] # EGYPTIAN HIEROGLYPH X004A +133D4 ; [.51E7.0020.0002] # EGYPTIAN HIEROGLYPH X004B +133D5 ; [.51E8.0020.0002] # EGYPTIAN HIEROGLYPH X005 +133D6 ; [.51E9.0020.0002] # EGYPTIAN HIEROGLYPH X006 +133D7 ; [.51EA.0020.0002] # EGYPTIAN HIEROGLYPH X006A +133D8 ; [.51EB.0020.0002] # EGYPTIAN HIEROGLYPH X007 +133D9 ; [.51EC.0020.0002] # EGYPTIAN HIEROGLYPH X008 +133DA ; [.51ED.0020.0002] # EGYPTIAN HIEROGLYPH X008A +133DB ; [.51EE.0020.0002] # EGYPTIAN HIEROGLYPH Y001 +133DC ; [.51EF.0020.0002] # EGYPTIAN HIEROGLYPH Y001A +133DD ; [.51F0.0020.0002] # EGYPTIAN HIEROGLYPH Y002 +133DE ; [.51F1.0020.0002] # EGYPTIAN HIEROGLYPH Y003 +133DF ; [.51F2.0020.0002] # EGYPTIAN HIEROGLYPH Y004 +133E0 ; [.51F3.0020.0002] # EGYPTIAN HIEROGLYPH Y005 +133E1 ; [.51F4.0020.0002] # EGYPTIAN HIEROGLYPH Y006 +133E2 ; [.51F5.0020.0002] # EGYPTIAN HIEROGLYPH Y007 +133E3 ; [.51F6.0020.0002] # EGYPTIAN HIEROGLYPH Y008 +133E4 ; [.51F7.0020.0002] # EGYPTIAN HIEROGLYPH Z001 +133E5 ; [.51F8.0020.0002] # EGYPTIAN HIEROGLYPH Z002 +133E6 ; [.51F9.0020.0002] # EGYPTIAN HIEROGLYPH Z002A +133E7 ; [.51FA.0020.0002] # EGYPTIAN HIEROGLYPH Z002B +133E8 ; [.51FB.0020.0002] # EGYPTIAN HIEROGLYPH Z002C +133E9 ; [.51FC.0020.0002] # EGYPTIAN HIEROGLYPH Z002D +133EA ; [.51FD.0020.0002] # EGYPTIAN HIEROGLYPH Z003 +133EB ; [.51FE.0020.0002] # EGYPTIAN HIEROGLYPH Z003A +133EC ; [.51FF.0020.0002] # EGYPTIAN HIEROGLYPH Z003B +133ED ; [.5200.0020.0002] # EGYPTIAN HIEROGLYPH Z004 +133EE ; [.5201.0020.0002] # EGYPTIAN HIEROGLYPH Z004A +133EF ; [.5202.0020.0002] # EGYPTIAN HIEROGLYPH Z005 +133F0 ; [.5203.0020.0002] # EGYPTIAN HIEROGLYPH Z005A +133F1 ; [.5204.0020.0002] # EGYPTIAN HIEROGLYPH Z006 +133F2 ; [.5205.0020.0002] # EGYPTIAN HIEROGLYPH Z007 +133F3 ; [.5206.0020.0002] # EGYPTIAN HIEROGLYPH Z008 +133F4 ; [.5207.0020.0002] # EGYPTIAN HIEROGLYPH Z009 +133F5 ; [.5208.0020.0002] # EGYPTIAN HIEROGLYPH Z010 +133F6 ; [.5209.0020.0002] # EGYPTIAN HIEROGLYPH Z011 +133F7 ; [.520A.0020.0002] # EGYPTIAN HIEROGLYPH Z012 +133F8 ; [.520B.0020.0002] # EGYPTIAN HIEROGLYPH Z013 +133F9 ; [.520C.0020.0002] # EGYPTIAN HIEROGLYPH Z014 +133FA ; [.520D.0020.0002] # EGYPTIAN HIEROGLYPH Z015 +133FB ; [.520E.0020.0002] # EGYPTIAN HIEROGLYPH Z015A +133FC ; [.520F.0020.0002] # EGYPTIAN HIEROGLYPH Z015B +133FD ; [.5210.0020.0002] # EGYPTIAN HIEROGLYPH Z015C +133FE ; [.5211.0020.0002] # EGYPTIAN HIEROGLYPH Z015D +133FF ; [.5212.0020.0002] # EGYPTIAN HIEROGLYPH Z015E +13400 ; [.5213.0020.0002] # EGYPTIAN HIEROGLYPH Z015F +13401 ; [.5214.0020.0002] # EGYPTIAN HIEROGLYPH Z015G +13402 ; [.5215.0020.0002] # EGYPTIAN HIEROGLYPH Z015H +13403 ; [.5216.0020.0002] # EGYPTIAN HIEROGLYPH Z015I +13404 ; [.5217.0020.0002] # EGYPTIAN HIEROGLYPH Z016 +13405 ; [.5218.0020.0002] # EGYPTIAN HIEROGLYPH Z016A +13406 ; [.5219.0020.0002] # EGYPTIAN HIEROGLYPH Z016B +13407 ; [.521A.0020.0002] # EGYPTIAN HIEROGLYPH Z016C +13408 ; [.521B.0020.0002] # EGYPTIAN HIEROGLYPH Z016D +13409 ; [.521C.0020.0002] # EGYPTIAN HIEROGLYPH Z016E +1340A ; [.521D.0020.0002] # EGYPTIAN HIEROGLYPH Z016F +1340B ; [.521E.0020.0002] # EGYPTIAN HIEROGLYPH Z016G +1340C ; [.521F.0020.0002] # EGYPTIAN HIEROGLYPH Z016H +1340D ; [.5220.0020.0002] # EGYPTIAN HIEROGLYPH AA001 +1340E ; [.5221.0020.0002] # EGYPTIAN HIEROGLYPH AA002 +1340F ; [.5222.0020.0002] # EGYPTIAN HIEROGLYPH AA003 +13410 ; [.5223.0020.0002] # EGYPTIAN HIEROGLYPH AA004 +13411 ; [.5224.0020.0002] # EGYPTIAN HIEROGLYPH AA005 +13412 ; [.5225.0020.0002] # EGYPTIAN HIEROGLYPH AA006 +13413 ; [.5226.0020.0002] # EGYPTIAN HIEROGLYPH AA007 +13414 ; [.5227.0020.0002] # EGYPTIAN HIEROGLYPH AA007A +13415 ; [.5228.0020.0002] # EGYPTIAN HIEROGLYPH AA007B +13416 ; [.5229.0020.0002] # EGYPTIAN HIEROGLYPH AA008 +13417 ; [.522A.0020.0002] # EGYPTIAN HIEROGLYPH AA009 +13418 ; [.522B.0020.0002] # EGYPTIAN HIEROGLYPH AA010 +13419 ; [.522C.0020.0002] # EGYPTIAN HIEROGLYPH AA011 +1341A ; [.522D.0020.0002] # EGYPTIAN HIEROGLYPH AA012 +1341B ; [.522E.0020.0002] # EGYPTIAN HIEROGLYPH AA013 +1341C ; [.522F.0020.0002] # EGYPTIAN HIEROGLYPH AA014 +1341D ; [.5230.0020.0002] # EGYPTIAN HIEROGLYPH AA015 +1341E ; [.5231.0020.0002] # EGYPTIAN HIEROGLYPH AA016 +1341F ; [.5232.0020.0002] # EGYPTIAN HIEROGLYPH AA017 +13420 ; [.5233.0020.0002] # EGYPTIAN HIEROGLYPH AA018 +13421 ; [.5234.0020.0002] # EGYPTIAN HIEROGLYPH AA019 +13422 ; [.5235.0020.0002] # EGYPTIAN HIEROGLYPH AA020 +13423 ; [.5236.0020.0002] # EGYPTIAN HIEROGLYPH AA021 +13424 ; [.5237.0020.0002] # EGYPTIAN HIEROGLYPH AA022 +13425 ; [.5238.0020.0002] # EGYPTIAN HIEROGLYPH AA023 +13426 ; [.5239.0020.0002] # EGYPTIAN HIEROGLYPH AA024 +13427 ; [.523A.0020.0002] # EGYPTIAN HIEROGLYPH AA025 +13428 ; [.523B.0020.0002] # EGYPTIAN HIEROGLYPH AA026 +13429 ; [.523C.0020.0002] # EGYPTIAN HIEROGLYPH AA027 +1342A ; [.523D.0020.0002] # EGYPTIAN HIEROGLYPH AA028 +1342B ; [.523E.0020.0002] # EGYPTIAN HIEROGLYPH AA029 +1342C ; [.523F.0020.0002] # EGYPTIAN HIEROGLYPH AA030 +1342D ; [.5240.0020.0002] # EGYPTIAN HIEROGLYPH AA031 +1342E ; [.5241.0020.0002] # EGYPTIAN HIEROGLYPH AA032 +109A0 ; [.5242.0020.0002] # MEROITIC CURSIVE LETTER A +10980 ; [.5242.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER A +109A1 ; [.5243.0020.0002] # MEROITIC CURSIVE LETTER E +10981 ; [.5243.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER E +109A2 ; [.5244.0020.0002] # MEROITIC CURSIVE LETTER I +10982 ; [.5244.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER I +109A3 ; [.5245.0020.0002] # MEROITIC CURSIVE LETTER O +10983 ; [.5245.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER O +109A4 ; [.5246.0020.0002] # MEROITIC CURSIVE LETTER YA +10984 ; [.5246.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER YA +109A5 ; [.5247.0020.0002] # MEROITIC CURSIVE LETTER WA +10985 ; [.5247.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER WA +109A6 ; [.5248.0020.0002] # MEROITIC CURSIVE LETTER BA +10986 ; [.5248.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER BA +10987 ; [.5248.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER BA-2 +109A7 ; [.5249.0020.0002] # MEROITIC CURSIVE LETTER PA +10988 ; [.5249.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER PA +109A8 ; [.524A.0020.0002] # MEROITIC CURSIVE LETTER MA +10989 ; [.524A.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER MA +109A9 ; [.524B.0020.0002] # MEROITIC CURSIVE LETTER NA +1098A ; [.524B.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER NA +1098B ; [.524B.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER NA-2 +109AA ; [.524C.0020.0002] # MEROITIC CURSIVE LETTER NE +1098C ; [.524C.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER NE +1098D ; [.524C.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER NE-2 +109AB ; [.524D.0020.0002] # MEROITIC CURSIVE LETTER RA +1098E ; [.524D.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER RA +1098F ; [.524D.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER RA-2 +109AC ; [.524E.0020.0002] # MEROITIC CURSIVE LETTER LA +10990 ; [.524E.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER LA +109AD ; [.524F.0020.0002] # MEROITIC CURSIVE LETTER KHA +10991 ; [.524F.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER KHA +109AE ; [.5250.0020.0002] # MEROITIC CURSIVE LETTER HHA +10992 ; [.5250.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER HHA +109AF ; [.5251.0020.0002] # MEROITIC CURSIVE LETTER SA +109B0 ; [.5251.0020.0004][.0000.0110.0004] # MEROITIC CURSIVE LETTER ARCHAIC SA +10993 ; [.5251.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER SA +10994 ; [.5251.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER SA-2 +109B1 ; [.5252.0020.0002] # MEROITIC CURSIVE LETTER SE +10995 ; [.5252.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER SE +109B2 ; [.5253.0020.0002] # MEROITIC CURSIVE LETTER KA +10996 ; [.5253.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER KA +109B3 ; [.5254.0020.0002] # MEROITIC CURSIVE LETTER QA +10997 ; [.5254.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER QA +109B4 ; [.5255.0020.0002] # MEROITIC CURSIVE LETTER TA +10998 ; [.5255.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER TA +10999 ; [.5255.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER TA-2 +109B5 ; [.5256.0020.0002] # MEROITIC CURSIVE LETTER TE +1099A ; [.5256.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER TE +1099B ; [.5256.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER TE-2 +109B6 ; [.5257.0020.0002] # MEROITIC CURSIVE LETTER TO +1099C ; [.5257.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER TO +109B7 ; [.5258.0020.0002] # MEROITIC CURSIVE LETTER DA +1099D ; [.5258.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER DA +109BE ; [.5259.0020.0002] # MEROITIC CURSIVE LOGOGRAM RMT +109BF ; [.525A.0020.0002] # MEROITIC CURSIVE LOGOGRAM IMN +1099E ; [.525B.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ +1099F ; [.525C.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +14400 ; [.525D.0020.0002] # ANATOLIAN HIEROGLYPH A001 +14401 ; [.525E.0020.0002] # ANATOLIAN HIEROGLYPH A002 +14402 ; [.525F.0020.0002] # ANATOLIAN HIEROGLYPH A003 +14403 ; [.5260.0020.0002] # ANATOLIAN HIEROGLYPH A004 +14404 ; [.5261.0020.0002] # ANATOLIAN HIEROGLYPH A005 +14405 ; [.5262.0020.0002] # ANATOLIAN HIEROGLYPH A006 +14406 ; [.5263.0020.0002] # ANATOLIAN HIEROGLYPH A007 +14407 ; [.5264.0020.0002] # ANATOLIAN HIEROGLYPH A008 +14408 ; [.5265.0020.0002] # ANATOLIAN HIEROGLYPH A009 +14409 ; [.5266.0020.0002] # ANATOLIAN HIEROGLYPH A010 +1440A ; [.5267.0020.0002] # ANATOLIAN HIEROGLYPH A010A +1440B ; [.5268.0020.0002] # ANATOLIAN HIEROGLYPH A011 +1440C ; [.5269.0020.0002] # ANATOLIAN HIEROGLYPH A012 +1440D ; [.526A.0020.0002] # ANATOLIAN HIEROGLYPH A013 +1440E ; [.526B.0020.0002] # ANATOLIAN HIEROGLYPH A014 +1440F ; [.526C.0020.0002] # ANATOLIAN HIEROGLYPH A015 +14410 ; [.526D.0020.0002] # ANATOLIAN HIEROGLYPH A016 +14411 ; [.526E.0020.0002] # ANATOLIAN HIEROGLYPH A017 +14412 ; [.526F.0020.0002] # ANATOLIAN HIEROGLYPH A018 +14413 ; [.5270.0020.0002] # ANATOLIAN HIEROGLYPH A019 +14414 ; [.5271.0020.0002] # ANATOLIAN HIEROGLYPH A020 +14415 ; [.5272.0020.0002] # ANATOLIAN HIEROGLYPH A021 +14416 ; [.5273.0020.0002] # ANATOLIAN HIEROGLYPH A022 +14417 ; [.5274.0020.0002] # ANATOLIAN HIEROGLYPH A023 +14418 ; [.5275.0020.0002] # ANATOLIAN HIEROGLYPH A024 +14419 ; [.5276.0020.0002] # ANATOLIAN HIEROGLYPH A025 +1441A ; [.5277.0020.0002] # ANATOLIAN HIEROGLYPH A026 +1441B ; [.5278.0020.0002] # ANATOLIAN HIEROGLYPH A026A +1441C ; [.5279.0020.0002] # ANATOLIAN HIEROGLYPH A027 +1441D ; [.527A.0020.0002] # ANATOLIAN HIEROGLYPH A028 +1441E ; [.527B.0020.0002] # ANATOLIAN HIEROGLYPH A029 +1441F ; [.527C.0020.0002] # ANATOLIAN HIEROGLYPH A030 +14420 ; [.527D.0020.0002] # ANATOLIAN HIEROGLYPH A031 +14421 ; [.527E.0020.0002] # ANATOLIAN HIEROGLYPH A032 +14422 ; [.527F.0020.0002] # ANATOLIAN HIEROGLYPH A033 +14423 ; [.5280.0020.0002] # ANATOLIAN HIEROGLYPH A034 +14424 ; [.5281.0020.0002] # ANATOLIAN HIEROGLYPH A035 +14425 ; [.5282.0020.0002] # ANATOLIAN HIEROGLYPH A036 +14426 ; [.5283.0020.0002] # ANATOLIAN HIEROGLYPH A037 +14427 ; [.5284.0020.0002] # ANATOLIAN HIEROGLYPH A038 +14428 ; [.5285.0020.0002] # ANATOLIAN HIEROGLYPH A039 +14429 ; [.5286.0020.0002] # ANATOLIAN HIEROGLYPH A039A +1442A ; [.5287.0020.0002] # ANATOLIAN HIEROGLYPH A040 +1442B ; [.5288.0020.0002] # ANATOLIAN HIEROGLYPH A041 +1442C ; [.5289.0020.0002] # ANATOLIAN HIEROGLYPH A041A +1442D ; [.528A.0020.0002] # ANATOLIAN HIEROGLYPH A042 +1442E ; [.528B.0020.0002] # ANATOLIAN HIEROGLYPH A043 +1442F ; [.528C.0020.0002] # ANATOLIAN HIEROGLYPH A044 +14430 ; [.528D.0020.0002] # ANATOLIAN HIEROGLYPH A045 +14431 ; [.528E.0020.0002] # ANATOLIAN HIEROGLYPH A045A +14432 ; [.528F.0020.0002] # ANATOLIAN HIEROGLYPH A046 +14433 ; [.5290.0020.0002] # ANATOLIAN HIEROGLYPH A046A +14434 ; [.5291.0020.0002] # ANATOLIAN HIEROGLYPH A046B +14435 ; [.5292.0020.0002] # ANATOLIAN HIEROGLYPH A047 +14436 ; [.5293.0020.0002] # ANATOLIAN HIEROGLYPH A048 +14437 ; [.5294.0020.0002] # ANATOLIAN HIEROGLYPH A049 +14438 ; [.5295.0020.0002] # ANATOLIAN HIEROGLYPH A050 +14439 ; [.5296.0020.0002] # ANATOLIAN HIEROGLYPH A051 +1443A ; [.5297.0020.0002] # ANATOLIAN HIEROGLYPH A052 +1443B ; [.5298.0020.0002] # ANATOLIAN HIEROGLYPH A053 +1443C ; [.5299.0020.0002] # ANATOLIAN HIEROGLYPH A054 +1443D ; [.529A.0020.0002] # ANATOLIAN HIEROGLYPH A055 +1443E ; [.529B.0020.0002] # ANATOLIAN HIEROGLYPH A056 +1443F ; [.529C.0020.0002] # ANATOLIAN HIEROGLYPH A057 +14440 ; [.529D.0020.0002] # ANATOLIAN HIEROGLYPH A058 +14441 ; [.529E.0020.0002] # ANATOLIAN HIEROGLYPH A059 +14442 ; [.529F.0020.0002] # ANATOLIAN HIEROGLYPH A060 +14443 ; [.52A0.0020.0002] # ANATOLIAN HIEROGLYPH A061 +14444 ; [.52A1.0020.0002] # ANATOLIAN HIEROGLYPH A062 +14445 ; [.52A2.0020.0002] # ANATOLIAN HIEROGLYPH A063 +14446 ; [.52A3.0020.0002] # ANATOLIAN HIEROGLYPH A064 +14447 ; [.52A4.0020.0002] # ANATOLIAN HIEROGLYPH A065 +14448 ; [.52A5.0020.0002] # ANATOLIAN HIEROGLYPH A066 +14449 ; [.52A6.0020.0002] # ANATOLIAN HIEROGLYPH A066A +1444A ; [.52A7.0020.0002] # ANATOLIAN HIEROGLYPH A066B +1444B ; [.52A8.0020.0002] # ANATOLIAN HIEROGLYPH A066C +1444C ; [.52A9.0020.0002] # ANATOLIAN HIEROGLYPH A067 +1444D ; [.52AA.0020.0002] # ANATOLIAN HIEROGLYPH A068 +1444E ; [.52AB.0020.0002] # ANATOLIAN HIEROGLYPH A069 +1444F ; [.52AC.0020.0002] # ANATOLIAN HIEROGLYPH A070 +14450 ; [.52AD.0020.0002] # ANATOLIAN HIEROGLYPH A071 +14451 ; [.52AE.0020.0002] # ANATOLIAN HIEROGLYPH A072 +14452 ; [.52AF.0020.0002] # ANATOLIAN HIEROGLYPH A073 +14453 ; [.52B0.0020.0002] # ANATOLIAN HIEROGLYPH A074 +14454 ; [.52B1.0020.0002] # ANATOLIAN HIEROGLYPH A075 +14455 ; [.52B2.0020.0002] # ANATOLIAN HIEROGLYPH A076 +14456 ; [.52B3.0020.0002] # ANATOLIAN HIEROGLYPH A077 +14457 ; [.52B4.0020.0002] # ANATOLIAN HIEROGLYPH A078 +14458 ; [.52B5.0020.0002] # ANATOLIAN HIEROGLYPH A079 +14459 ; [.52B6.0020.0002] # ANATOLIAN HIEROGLYPH A080 +1445A ; [.52B7.0020.0002] # ANATOLIAN HIEROGLYPH A081 +1445B ; [.52B8.0020.0002] # ANATOLIAN HIEROGLYPH A082 +1445C ; [.52B9.0020.0002] # ANATOLIAN HIEROGLYPH A083 +1445D ; [.52BA.0020.0002] # ANATOLIAN HIEROGLYPH A084 +1445E ; [.52BB.0020.0002] # ANATOLIAN HIEROGLYPH A085 +1445F ; [.52BC.0020.0002] # ANATOLIAN HIEROGLYPH A086 +14460 ; [.52BD.0020.0002] # ANATOLIAN HIEROGLYPH A087 +14461 ; [.52BE.0020.0002] # ANATOLIAN HIEROGLYPH A088 +14462 ; [.52BF.0020.0002] # ANATOLIAN HIEROGLYPH A089 +14463 ; [.52C0.0020.0002] # ANATOLIAN HIEROGLYPH A090 +14464 ; [.52C1.0020.0002] # ANATOLIAN HIEROGLYPH A091 +14465 ; [.52C2.0020.0002] # ANATOLIAN HIEROGLYPH A092 +14466 ; [.52C3.0020.0002] # ANATOLIAN HIEROGLYPH A093 +14467 ; [.52C4.0020.0002] # ANATOLIAN HIEROGLYPH A094 +14468 ; [.52C5.0020.0002] # ANATOLIAN HIEROGLYPH A095 +14469 ; [.52C6.0020.0002] # ANATOLIAN HIEROGLYPH A096 +1446A ; [.52C7.0020.0002] # ANATOLIAN HIEROGLYPH A097 +1446B ; [.52C8.0020.0002] # ANATOLIAN HIEROGLYPH A097A +1446C ; [.52C9.0020.0002] # ANATOLIAN HIEROGLYPH A098 +1446D ; [.52CA.0020.0002] # ANATOLIAN HIEROGLYPH A098A +1446E ; [.52CB.0020.0002] # ANATOLIAN HIEROGLYPH A099 +1446F ; [.52CC.0020.0002] # ANATOLIAN HIEROGLYPH A100 +14470 ; [.52CD.0020.0002] # ANATOLIAN HIEROGLYPH A100A +14471 ; [.52CE.0020.0002] # ANATOLIAN HIEROGLYPH A101 +14472 ; [.52CF.0020.0002] # ANATOLIAN HIEROGLYPH A101A +14473 ; [.52D0.0020.0002] # ANATOLIAN HIEROGLYPH A102 +14474 ; [.52D1.0020.0002] # ANATOLIAN HIEROGLYPH A102A +14475 ; [.52D2.0020.0002] # ANATOLIAN HIEROGLYPH A103 +14476 ; [.52D3.0020.0002] # ANATOLIAN HIEROGLYPH A104 +14477 ; [.52D4.0020.0002] # ANATOLIAN HIEROGLYPH A104A +14478 ; [.52D5.0020.0002] # ANATOLIAN HIEROGLYPH A104B +14479 ; [.52D6.0020.0002] # ANATOLIAN HIEROGLYPH A104C +1447A ; [.52D7.0020.0002] # ANATOLIAN HIEROGLYPH A105 +1447B ; [.52D8.0020.0002] # ANATOLIAN HIEROGLYPH A105A +1447C ; [.52D9.0020.0002] # ANATOLIAN HIEROGLYPH A105B +1447D ; [.52DA.0020.0002] # ANATOLIAN HIEROGLYPH A106 +1447E ; [.52DB.0020.0002] # ANATOLIAN HIEROGLYPH A107 +1447F ; [.52DC.0020.0002] # ANATOLIAN HIEROGLYPH A107A +14480 ; [.52DD.0020.0002] # ANATOLIAN HIEROGLYPH A107B +14481 ; [.52DE.0020.0002] # ANATOLIAN HIEROGLYPH A107C +14482 ; [.52DF.0020.0002] # ANATOLIAN HIEROGLYPH A108 +14483 ; [.52E0.0020.0002] # ANATOLIAN HIEROGLYPH A109 +14484 ; [.52E1.0020.0002] # ANATOLIAN HIEROGLYPH A110 +14485 ; [.52E2.0020.0002] # ANATOLIAN HIEROGLYPH A110A +14486 ; [.52E3.0020.0002] # ANATOLIAN HIEROGLYPH A110B +14487 ; [.52E4.0020.0002] # ANATOLIAN HIEROGLYPH A111 +14488 ; [.52E5.0020.0002] # ANATOLIAN HIEROGLYPH A112 +14489 ; [.52E6.0020.0002] # ANATOLIAN HIEROGLYPH A113 +1448A ; [.52E7.0020.0002] # ANATOLIAN HIEROGLYPH A114 +1448B ; [.52E8.0020.0002] # ANATOLIAN HIEROGLYPH A115 +1448C ; [.52E9.0020.0002] # ANATOLIAN HIEROGLYPH A115A +1448D ; [.52EA.0020.0002] # ANATOLIAN HIEROGLYPH A116 +1448E ; [.52EB.0020.0002] # ANATOLIAN HIEROGLYPH A117 +1448F ; [.52EC.0020.0002] # ANATOLIAN HIEROGLYPH A118 +14490 ; [.52ED.0020.0002] # ANATOLIAN HIEROGLYPH A119 +14491 ; [.52EE.0020.0002] # ANATOLIAN HIEROGLYPH A120 +14492 ; [.52EF.0020.0002] # ANATOLIAN HIEROGLYPH A121 +14493 ; [.52F0.0020.0002] # ANATOLIAN HIEROGLYPH A122 +14494 ; [.52F1.0020.0002] # ANATOLIAN HIEROGLYPH A123 +14495 ; [.52F2.0020.0002] # ANATOLIAN HIEROGLYPH A124 +14496 ; [.52F3.0020.0002] # ANATOLIAN HIEROGLYPH A125 +14497 ; [.52F4.0020.0002] # ANATOLIAN HIEROGLYPH A125A +14498 ; [.52F5.0020.0002] # ANATOLIAN HIEROGLYPH A126 +14499 ; [.52F6.0020.0002] # ANATOLIAN HIEROGLYPH A127 +1449A ; [.52F7.0020.0002] # ANATOLIAN HIEROGLYPH A128 +1449B ; [.52F8.0020.0002] # ANATOLIAN HIEROGLYPH A129 +1449C ; [.52F9.0020.0002] # ANATOLIAN HIEROGLYPH A130 +1449D ; [.52FA.0020.0002] # ANATOLIAN HIEROGLYPH A131 +1449E ; [.52FB.0020.0002] # ANATOLIAN HIEROGLYPH A132 +1449F ; [.52FC.0020.0002] # ANATOLIAN HIEROGLYPH A133 +144A0 ; [.52FD.0020.0002] # ANATOLIAN HIEROGLYPH A134 +144A1 ; [.52FE.0020.0002] # ANATOLIAN HIEROGLYPH A135 +144A2 ; [.52FF.0020.0002] # ANATOLIAN HIEROGLYPH A135A +144A3 ; [.5300.0020.0002] # ANATOLIAN HIEROGLYPH A136 +144A4 ; [.5301.0020.0002] # ANATOLIAN HIEROGLYPH A137 +144A5 ; [.5302.0020.0002] # ANATOLIAN HIEROGLYPH A138 +144A6 ; [.5303.0020.0002] # ANATOLIAN HIEROGLYPH A139 +144A7 ; [.5304.0020.0002] # ANATOLIAN HIEROGLYPH A140 +144A8 ; [.5305.0020.0002] # ANATOLIAN HIEROGLYPH A141 +144A9 ; [.5306.0020.0002] # ANATOLIAN HIEROGLYPH A142 +144AA ; [.5307.0020.0002] # ANATOLIAN HIEROGLYPH A143 +144AB ; [.5308.0020.0002] # ANATOLIAN HIEROGLYPH A144 +144AC ; [.5309.0020.0002] # ANATOLIAN HIEROGLYPH A145 +144AD ; [.530A.0020.0002] # ANATOLIAN HIEROGLYPH A146 +144AE ; [.530B.0020.0002] # ANATOLIAN HIEROGLYPH A147 +144AF ; [.530C.0020.0002] # ANATOLIAN HIEROGLYPH A148 +144B0 ; [.530D.0020.0002] # ANATOLIAN HIEROGLYPH A149 +144B1 ; [.530E.0020.0002] # ANATOLIAN HIEROGLYPH A150 +144B2 ; [.530F.0020.0002] # ANATOLIAN HIEROGLYPH A151 +144B3 ; [.5310.0020.0002] # ANATOLIAN HIEROGLYPH A152 +144B4 ; [.5311.0020.0002] # ANATOLIAN HIEROGLYPH A153 +144B5 ; [.5312.0020.0002] # ANATOLIAN HIEROGLYPH A154 +144B6 ; [.5313.0020.0002] # ANATOLIAN HIEROGLYPH A155 +144B7 ; [.5314.0020.0002] # ANATOLIAN HIEROGLYPH A156 +144B8 ; [.5315.0020.0002] # ANATOLIAN HIEROGLYPH A157 +144B9 ; [.5316.0020.0002] # ANATOLIAN HIEROGLYPH A158 +144BA ; [.5317.0020.0002] # ANATOLIAN HIEROGLYPH A159 +144BB ; [.5318.0020.0002] # ANATOLIAN HIEROGLYPH A160 +144BC ; [.5319.0020.0002] # ANATOLIAN HIEROGLYPH A161 +144BD ; [.531A.0020.0002] # ANATOLIAN HIEROGLYPH A162 +144BE ; [.531B.0020.0002] # ANATOLIAN HIEROGLYPH A163 +144BF ; [.531C.0020.0002] # ANATOLIAN HIEROGLYPH A164 +144C0 ; [.531D.0020.0002] # ANATOLIAN HIEROGLYPH A165 +144C1 ; [.531E.0020.0002] # ANATOLIAN HIEROGLYPH A166 +144C2 ; [.531F.0020.0002] # ANATOLIAN HIEROGLYPH A167 +144C3 ; [.5320.0020.0002] # ANATOLIAN HIEROGLYPH A168 +144C4 ; [.5321.0020.0002] # ANATOLIAN HIEROGLYPH A169 +144C5 ; [.5322.0020.0002] # ANATOLIAN HIEROGLYPH A170 +144C6 ; [.5323.0020.0002] # ANATOLIAN HIEROGLYPH A171 +144C7 ; [.5324.0020.0002] # ANATOLIAN HIEROGLYPH A172 +144C8 ; [.5325.0020.0002] # ANATOLIAN HIEROGLYPH A173 +144C9 ; [.5326.0020.0002] # ANATOLIAN HIEROGLYPH A174 +144CA ; [.5327.0020.0002] # ANATOLIAN HIEROGLYPH A175 +144CB ; [.5328.0020.0002] # ANATOLIAN HIEROGLYPH A176 +144CC ; [.5329.0020.0002] # ANATOLIAN HIEROGLYPH A177 +144CD ; [.532A.0020.0002] # ANATOLIAN HIEROGLYPH A178 +144CE ; [.532B.0020.0002] # ANATOLIAN HIEROGLYPH A179 +144CF ; [.532C.0020.0002] # ANATOLIAN HIEROGLYPH A180 +144D0 ; [.532D.0020.0002] # ANATOLIAN HIEROGLYPH A181 +144D1 ; [.532E.0020.0002] # ANATOLIAN HIEROGLYPH A182 +144D2 ; [.532F.0020.0002] # ANATOLIAN HIEROGLYPH A183 +144D3 ; [.5330.0020.0002] # ANATOLIAN HIEROGLYPH A184 +144D4 ; [.5331.0020.0002] # ANATOLIAN HIEROGLYPH A185 +144D5 ; [.5332.0020.0002] # ANATOLIAN HIEROGLYPH A186 +144D6 ; [.5333.0020.0002] # ANATOLIAN HIEROGLYPH A187 +144D7 ; [.5334.0020.0002] # ANATOLIAN HIEROGLYPH A188 +144D8 ; [.5335.0020.0002] # ANATOLIAN HIEROGLYPH A189 +144D9 ; [.5336.0020.0002] # ANATOLIAN HIEROGLYPH A190 +144DA ; [.5337.0020.0002] # ANATOLIAN HIEROGLYPH A191 +144DB ; [.5338.0020.0002] # ANATOLIAN HIEROGLYPH A192 +144DC ; [.5339.0020.0002] # ANATOLIAN HIEROGLYPH A193 +144DD ; [.533A.0020.0002] # ANATOLIAN HIEROGLYPH A194 +144DE ; [.533B.0020.0002] # ANATOLIAN HIEROGLYPH A195 +144DF ; [.533C.0020.0002] # ANATOLIAN HIEROGLYPH A196 +144E0 ; [.533D.0020.0002] # ANATOLIAN HIEROGLYPH A197 +144E1 ; [.533E.0020.0002] # ANATOLIAN HIEROGLYPH A198 +144E2 ; [.533F.0020.0002] # ANATOLIAN HIEROGLYPH A199 +144E3 ; [.5340.0020.0002] # ANATOLIAN HIEROGLYPH A200 +144E4 ; [.5341.0020.0002] # ANATOLIAN HIEROGLYPH A201 +144E5 ; [.5342.0020.0002] # ANATOLIAN HIEROGLYPH A202 +144E6 ; [.5343.0020.0002] # ANATOLIAN HIEROGLYPH A202A +144E7 ; [.5344.0020.0002] # ANATOLIAN HIEROGLYPH A202B +144E8 ; [.5345.0020.0002] # ANATOLIAN HIEROGLYPH A203 +144E9 ; [.5346.0020.0002] # ANATOLIAN HIEROGLYPH A204 +144EA ; [.5347.0020.0002] # ANATOLIAN HIEROGLYPH A205 +144EB ; [.5348.0020.0002] # ANATOLIAN HIEROGLYPH A206 +144EC ; [.5349.0020.0002] # ANATOLIAN HIEROGLYPH A207 +144ED ; [.534A.0020.0002] # ANATOLIAN HIEROGLYPH A207A +144EE ; [.534B.0020.0002] # ANATOLIAN HIEROGLYPH A208 +144EF ; [.534C.0020.0002] # ANATOLIAN HIEROGLYPH A209 +144F0 ; [.534D.0020.0002] # ANATOLIAN HIEROGLYPH A209A +144F1 ; [.534E.0020.0002] # ANATOLIAN HIEROGLYPH A210 +144F2 ; [.534F.0020.0002] # ANATOLIAN HIEROGLYPH A211 +144F3 ; [.5350.0020.0002] # ANATOLIAN HIEROGLYPH A212 +144F4 ; [.5351.0020.0002] # ANATOLIAN HIEROGLYPH A213 +144F5 ; [.5352.0020.0002] # ANATOLIAN HIEROGLYPH A214 +144F6 ; [.5353.0020.0002] # ANATOLIAN HIEROGLYPH A215 +144F7 ; [.5354.0020.0002] # ANATOLIAN HIEROGLYPH A215A +144F8 ; [.5355.0020.0002] # ANATOLIAN HIEROGLYPH A216 +144F9 ; [.5356.0020.0002] # ANATOLIAN HIEROGLYPH A216A +144FA ; [.5357.0020.0002] # ANATOLIAN HIEROGLYPH A217 +144FB ; [.5358.0020.0002] # ANATOLIAN HIEROGLYPH A218 +144FC ; [.5359.0020.0002] # ANATOLIAN HIEROGLYPH A219 +144FD ; [.535A.0020.0002] # ANATOLIAN HIEROGLYPH A220 +144FE ; [.535B.0020.0002] # ANATOLIAN HIEROGLYPH A221 +144FF ; [.535C.0020.0002] # ANATOLIAN HIEROGLYPH A222 +14500 ; [.535D.0020.0002] # ANATOLIAN HIEROGLYPH A223 +14501 ; [.535E.0020.0002] # ANATOLIAN HIEROGLYPH A224 +14502 ; [.535F.0020.0002] # ANATOLIAN HIEROGLYPH A225 +14503 ; [.5360.0020.0002] # ANATOLIAN HIEROGLYPH A226 +14504 ; [.5361.0020.0002] # ANATOLIAN HIEROGLYPH A227 +14505 ; [.5362.0020.0002] # ANATOLIAN HIEROGLYPH A227A +14506 ; [.5363.0020.0002] # ANATOLIAN HIEROGLYPH A228 +14507 ; [.5364.0020.0002] # ANATOLIAN HIEROGLYPH A229 +14508 ; [.5365.0020.0002] # ANATOLIAN HIEROGLYPH A230 +14509 ; [.5366.0020.0002] # ANATOLIAN HIEROGLYPH A231 +1450A ; [.5367.0020.0002] # ANATOLIAN HIEROGLYPH A232 +1450B ; [.5368.0020.0002] # ANATOLIAN HIEROGLYPH A233 +1450C ; [.5369.0020.0002] # ANATOLIAN HIEROGLYPH A234 +1450D ; [.536A.0020.0002] # ANATOLIAN HIEROGLYPH A235 +1450E ; [.536B.0020.0002] # ANATOLIAN HIEROGLYPH A236 +1450F ; [.536C.0020.0002] # ANATOLIAN HIEROGLYPH A237 +14510 ; [.536D.0020.0002] # ANATOLIAN HIEROGLYPH A238 +14511 ; [.536E.0020.0002] # ANATOLIAN HIEROGLYPH A239 +14512 ; [.536F.0020.0002] # ANATOLIAN HIEROGLYPH A240 +14513 ; [.5370.0020.0002] # ANATOLIAN HIEROGLYPH A241 +14514 ; [.5371.0020.0002] # ANATOLIAN HIEROGLYPH A242 +14515 ; [.5372.0020.0002] # ANATOLIAN HIEROGLYPH A243 +14516 ; [.5373.0020.0002] # ANATOLIAN HIEROGLYPH A244 +14517 ; [.5374.0020.0002] # ANATOLIAN HIEROGLYPH A245 +14518 ; [.5375.0020.0002] # ANATOLIAN HIEROGLYPH A246 +14519 ; [.5376.0020.0002] # ANATOLIAN HIEROGLYPH A247 +1451A ; [.5377.0020.0002] # ANATOLIAN HIEROGLYPH A248 +1451B ; [.5378.0020.0002] # ANATOLIAN HIEROGLYPH A249 +1451C ; [.5379.0020.0002] # ANATOLIAN HIEROGLYPH A250 +1451D ; [.537A.0020.0002] # ANATOLIAN HIEROGLYPH A251 +1451E ; [.537B.0020.0002] # ANATOLIAN HIEROGLYPH A252 +1451F ; [.537C.0020.0002] # ANATOLIAN HIEROGLYPH A253 +14520 ; [.537D.0020.0002] # ANATOLIAN HIEROGLYPH A254 +14521 ; [.537E.0020.0002] # ANATOLIAN HIEROGLYPH A255 +14522 ; [.537F.0020.0002] # ANATOLIAN HIEROGLYPH A256 +14523 ; [.5380.0020.0002] # ANATOLIAN HIEROGLYPH A257 +14524 ; [.5381.0020.0002] # ANATOLIAN HIEROGLYPH A258 +14525 ; [.5382.0020.0002] # ANATOLIAN HIEROGLYPH A259 +14526 ; [.5383.0020.0002] # ANATOLIAN HIEROGLYPH A260 +14527 ; [.5384.0020.0002] # ANATOLIAN HIEROGLYPH A261 +14528 ; [.5385.0020.0002] # ANATOLIAN HIEROGLYPH A262 +14529 ; [.5386.0020.0002] # ANATOLIAN HIEROGLYPH A263 +1452A ; [.5387.0020.0002] # ANATOLIAN HIEROGLYPH A264 +1452B ; [.5388.0020.0002] # ANATOLIAN HIEROGLYPH A265 +1452C ; [.5389.0020.0002] # ANATOLIAN HIEROGLYPH A266 +1452D ; [.538A.0020.0002] # ANATOLIAN HIEROGLYPH A267 +1452E ; [.538B.0020.0002] # ANATOLIAN HIEROGLYPH A267A +1452F ; [.538C.0020.0002] # ANATOLIAN HIEROGLYPH A268 +14530 ; [.538D.0020.0002] # ANATOLIAN HIEROGLYPH A269 +14531 ; [.538E.0020.0002] # ANATOLIAN HIEROGLYPH A270 +14532 ; [.538F.0020.0002] # ANATOLIAN HIEROGLYPH A271 +14533 ; [.5390.0020.0002] # ANATOLIAN HIEROGLYPH A272 +14534 ; [.5391.0020.0002] # ANATOLIAN HIEROGLYPH A273 +14535 ; [.5392.0020.0002] # ANATOLIAN HIEROGLYPH A274 +14536 ; [.5393.0020.0002] # ANATOLIAN HIEROGLYPH A275 +14537 ; [.5394.0020.0002] # ANATOLIAN HIEROGLYPH A276 +14538 ; [.5395.0020.0002] # ANATOLIAN HIEROGLYPH A277 +14539 ; [.5396.0020.0002] # ANATOLIAN HIEROGLYPH A278 +1453A ; [.5397.0020.0002] # ANATOLIAN HIEROGLYPH A279 +1453B ; [.5398.0020.0002] # ANATOLIAN HIEROGLYPH A280 +1453C ; [.5399.0020.0002] # ANATOLIAN HIEROGLYPH A281 +1453D ; [.539A.0020.0002] # ANATOLIAN HIEROGLYPH A282 +1453E ; [.539B.0020.0002] # ANATOLIAN HIEROGLYPH A283 +1453F ; [.539C.0020.0002] # ANATOLIAN HIEROGLYPH A284 +14540 ; [.539D.0020.0002] # ANATOLIAN HIEROGLYPH A285 +14541 ; [.539E.0020.0002] # ANATOLIAN HIEROGLYPH A286 +14542 ; [.539F.0020.0002] # ANATOLIAN HIEROGLYPH A287 +14543 ; [.53A0.0020.0002] # ANATOLIAN HIEROGLYPH A288 +14544 ; [.53A1.0020.0002] # ANATOLIAN HIEROGLYPH A289 +14545 ; [.53A2.0020.0002] # ANATOLIAN HIEROGLYPH A289A +14546 ; [.53A3.0020.0002] # ANATOLIAN HIEROGLYPH A290 +14547 ; [.53A4.0020.0002] # ANATOLIAN HIEROGLYPH A291 +14548 ; [.53A5.0020.0002] # ANATOLIAN HIEROGLYPH A292 +14549 ; [.53A6.0020.0002] # ANATOLIAN HIEROGLYPH A293 +1454A ; [.53A7.0020.0002] # ANATOLIAN HIEROGLYPH A294 +1454B ; [.53A8.0020.0002] # ANATOLIAN HIEROGLYPH A294A +1454C ; [.53A9.0020.0002] # ANATOLIAN HIEROGLYPH A295 +1454D ; [.53AA.0020.0002] # ANATOLIAN HIEROGLYPH A296 +1454E ; [.53AB.0020.0002] # ANATOLIAN HIEROGLYPH A297 +1454F ; [.53AC.0020.0002] # ANATOLIAN HIEROGLYPH A298 +14550 ; [.53AD.0020.0002] # ANATOLIAN HIEROGLYPH A299 +14551 ; [.53AE.0020.0002] # ANATOLIAN HIEROGLYPH A299A +14552 ; [.53AF.0020.0002] # ANATOLIAN HIEROGLYPH A300 +14553 ; [.53B0.0020.0002] # ANATOLIAN HIEROGLYPH A301 +14554 ; [.53B1.0020.0002] # ANATOLIAN HIEROGLYPH A302 +14555 ; [.53B2.0020.0002] # ANATOLIAN HIEROGLYPH A303 +14556 ; [.53B3.0020.0002] # ANATOLIAN HIEROGLYPH A304 +14557 ; [.53B4.0020.0002] # ANATOLIAN HIEROGLYPH A305 +14558 ; [.53B5.0020.0002] # ANATOLIAN HIEROGLYPH A306 +14559 ; [.53B6.0020.0002] # ANATOLIAN HIEROGLYPH A307 +1455A ; [.53B7.0020.0002] # ANATOLIAN HIEROGLYPH A308 +1455B ; [.53B8.0020.0002] # ANATOLIAN HIEROGLYPH A309 +1455C ; [.53B9.0020.0002] # ANATOLIAN HIEROGLYPH A309A +1455D ; [.53BA.0020.0002] # ANATOLIAN HIEROGLYPH A310 +1455E ; [.53BB.0020.0002] # ANATOLIAN HIEROGLYPH A311 +1455F ; [.53BC.0020.0002] # ANATOLIAN HIEROGLYPH A312 +14560 ; [.53BD.0020.0002] # ANATOLIAN HIEROGLYPH A313 +14561 ; [.53BE.0020.0002] # ANATOLIAN HIEROGLYPH A314 +14562 ; [.53BF.0020.0002] # ANATOLIAN HIEROGLYPH A315 +14563 ; [.53C0.0020.0002] # ANATOLIAN HIEROGLYPH A316 +14564 ; [.53C1.0020.0002] # ANATOLIAN HIEROGLYPH A317 +14565 ; [.53C2.0020.0002] # ANATOLIAN HIEROGLYPH A318 +14566 ; [.53C3.0020.0002] # ANATOLIAN HIEROGLYPH A319 +14567 ; [.53C4.0020.0002] # ANATOLIAN HIEROGLYPH A320 +14568 ; [.53C5.0020.0002] # ANATOLIAN HIEROGLYPH A321 +14569 ; [.53C6.0020.0002] # ANATOLIAN HIEROGLYPH A322 +1456A ; [.53C7.0020.0002] # ANATOLIAN HIEROGLYPH A323 +1456B ; [.53C8.0020.0002] # ANATOLIAN HIEROGLYPH A324 +1456C ; [.53C9.0020.0002] # ANATOLIAN HIEROGLYPH A325 +1456D ; [.53CA.0020.0002] # ANATOLIAN HIEROGLYPH A326 +1456E ; [.53CB.0020.0002] # ANATOLIAN HIEROGLYPH A327 +1456F ; [.53CC.0020.0002] # ANATOLIAN HIEROGLYPH A328 +14570 ; [.53CD.0020.0002] # ANATOLIAN HIEROGLYPH A329 +14571 ; [.53CE.0020.0002] # ANATOLIAN HIEROGLYPH A329A +14572 ; [.53CF.0020.0002] # ANATOLIAN HIEROGLYPH A330 +14573 ; [.53D0.0020.0002] # ANATOLIAN HIEROGLYPH A331 +14574 ; [.53D1.0020.0002] # ANATOLIAN HIEROGLYPH A332A +14575 ; [.53D2.0020.0002] # ANATOLIAN HIEROGLYPH A332B +14576 ; [.53D3.0020.0002] # ANATOLIAN HIEROGLYPH A332C +14577 ; [.53D4.0020.0002] # ANATOLIAN HIEROGLYPH A333 +14578 ; [.53D5.0020.0002] # ANATOLIAN HIEROGLYPH A334 +14579 ; [.53D6.0020.0002] # ANATOLIAN HIEROGLYPH A335 +1457A ; [.53D7.0020.0002] # ANATOLIAN HIEROGLYPH A336 +1457B ; [.53D8.0020.0002] # ANATOLIAN HIEROGLYPH A336A +1457C ; [.53D9.0020.0002] # ANATOLIAN HIEROGLYPH A336B +1457D ; [.53DA.0020.0002] # ANATOLIAN HIEROGLYPH A336C +1457E ; [.53DB.0020.0002] # ANATOLIAN HIEROGLYPH A337 +1457F ; [.53DC.0020.0002] # ANATOLIAN HIEROGLYPH A338 +14580 ; [.53DD.0020.0002] # ANATOLIAN HIEROGLYPH A339 +14581 ; [.53DE.0020.0002] # ANATOLIAN HIEROGLYPH A340 +14582 ; [.53DF.0020.0002] # ANATOLIAN HIEROGLYPH A341 +14583 ; [.53E0.0020.0002] # ANATOLIAN HIEROGLYPH A342 +14584 ; [.53E1.0020.0002] # ANATOLIAN HIEROGLYPH A343 +14585 ; [.53E2.0020.0002] # ANATOLIAN HIEROGLYPH A344 +14586 ; [.53E3.0020.0002] # ANATOLIAN HIEROGLYPH A345 +14587 ; [.53E4.0020.0002] # ANATOLIAN HIEROGLYPH A346 +14588 ; [.53E5.0020.0002] # ANATOLIAN HIEROGLYPH A347 +14589 ; [.53E6.0020.0002] # ANATOLIAN HIEROGLYPH A348 +1458A ; [.53E7.0020.0002] # ANATOLIAN HIEROGLYPH A349 +1458B ; [.53E8.0020.0002] # ANATOLIAN HIEROGLYPH A350 +1458C ; [.53E9.0020.0002] # ANATOLIAN HIEROGLYPH A351 +1458D ; [.53EA.0020.0002] # ANATOLIAN HIEROGLYPH A352 +1458E ; [.53EB.0020.0002] # ANATOLIAN HIEROGLYPH A353 +1458F ; [.53EC.0020.0002] # ANATOLIAN HIEROGLYPH A354 +14590 ; [.53ED.0020.0002] # ANATOLIAN HIEROGLYPH A355 +14591 ; [.53EE.0020.0002] # ANATOLIAN HIEROGLYPH A356 +14592 ; [.53EF.0020.0002] # ANATOLIAN HIEROGLYPH A357 +14593 ; [.53F0.0020.0002] # ANATOLIAN HIEROGLYPH A358 +14594 ; [.53F1.0020.0002] # ANATOLIAN HIEROGLYPH A359 +14595 ; [.53F2.0020.0002] # ANATOLIAN HIEROGLYPH A359A +14596 ; [.53F3.0020.0002] # ANATOLIAN HIEROGLYPH A360 +14597 ; [.53F4.0020.0002] # ANATOLIAN HIEROGLYPH A361 +14598 ; [.53F5.0020.0002] # ANATOLIAN HIEROGLYPH A362 +14599 ; [.53F6.0020.0002] # ANATOLIAN HIEROGLYPH A363 +1459A ; [.53F7.0020.0002] # ANATOLIAN HIEROGLYPH A364 +1459B ; [.53F8.0020.0002] # ANATOLIAN HIEROGLYPH A364A +1459C ; [.53F9.0020.0002] # ANATOLIAN HIEROGLYPH A365 +1459D ; [.53FA.0020.0002] # ANATOLIAN HIEROGLYPH A366 +1459E ; [.53FB.0020.0002] # ANATOLIAN HIEROGLYPH A367 +1459F ; [.53FC.0020.0002] # ANATOLIAN HIEROGLYPH A368 +145A0 ; [.53FD.0020.0002] # ANATOLIAN HIEROGLYPH A368A +145A1 ; [.53FE.0020.0002] # ANATOLIAN HIEROGLYPH A369 +145A2 ; [.53FF.0020.0002] # ANATOLIAN HIEROGLYPH A370 +145A3 ; [.5400.0020.0002] # ANATOLIAN HIEROGLYPH A371 +145A4 ; [.5401.0020.0002] # ANATOLIAN HIEROGLYPH A371A +145A5 ; [.5402.0020.0002] # ANATOLIAN HIEROGLYPH A372 +145A6 ; [.5403.0020.0002] # ANATOLIAN HIEROGLYPH A373 +145A7 ; [.5404.0020.0002] # ANATOLIAN HIEROGLYPH A374 +145A8 ; [.5405.0020.0002] # ANATOLIAN HIEROGLYPH A375 +145A9 ; [.5406.0020.0002] # ANATOLIAN HIEROGLYPH A376 +145AA ; [.5407.0020.0002] # ANATOLIAN HIEROGLYPH A377 +145AB ; [.5408.0020.0002] # ANATOLIAN HIEROGLYPH A378 +145AC ; [.5409.0020.0002] # ANATOLIAN HIEROGLYPH A379 +145AD ; [.540A.0020.0002] # ANATOLIAN HIEROGLYPH A380 +145AE ; [.540B.0020.0002] # ANATOLIAN HIEROGLYPH A381 +145AF ; [.540C.0020.0002] # ANATOLIAN HIEROGLYPH A381A +145B0 ; [.540D.0020.0002] # ANATOLIAN HIEROGLYPH A382 +145B1 ; [.540E.0020.0002] # ANATOLIAN HIEROGLYPH A383 RA OR RI +145B2 ; [.540F.0020.0002] # ANATOLIAN HIEROGLYPH A383A +145B3 ; [.5410.0020.0002] # ANATOLIAN HIEROGLYPH A384 +145B4 ; [.5411.0020.0002] # ANATOLIAN HIEROGLYPH A385 +145B5 ; [.5412.0020.0002] # ANATOLIAN HIEROGLYPH A386 +145B6 ; [.5413.0020.0002] # ANATOLIAN HIEROGLYPH A386A +145B7 ; [.5414.0020.0002] # ANATOLIAN HIEROGLYPH A387 +145B8 ; [.5415.0020.0002] # ANATOLIAN HIEROGLYPH A388 +145B9 ; [.5416.0020.0002] # ANATOLIAN HIEROGLYPH A389 +145BA ; [.5417.0020.0002] # ANATOLIAN HIEROGLYPH A390 +145BB ; [.5418.0020.0002] # ANATOLIAN HIEROGLYPH A391 +145BC ; [.5419.0020.0002] # ANATOLIAN HIEROGLYPH A392 +145BD ; [.541A.0020.0002] # ANATOLIAN HIEROGLYPH A393 EIGHT +145BE ; [.541B.0020.0002] # ANATOLIAN HIEROGLYPH A394 +145BF ; [.541C.0020.0002] # ANATOLIAN HIEROGLYPH A395 +145C0 ; [.541D.0020.0002] # ANATOLIAN HIEROGLYPH A396 +145C1 ; [.541E.0020.0002] # ANATOLIAN HIEROGLYPH A397 +145C2 ; [.541F.0020.0002] # ANATOLIAN HIEROGLYPH A398 +145C3 ; [.5420.0020.0002] # ANATOLIAN HIEROGLYPH A399 +145C4 ; [.5421.0020.0002] # ANATOLIAN HIEROGLYPH A400 +145C5 ; [.5422.0020.0002] # ANATOLIAN HIEROGLYPH A401 +145C6 ; [.5423.0020.0002] # ANATOLIAN HIEROGLYPH A402 +145C7 ; [.5424.0020.0002] # ANATOLIAN HIEROGLYPH A403 +145C8 ; [.5425.0020.0002] # ANATOLIAN HIEROGLYPH A404 +145C9 ; [.5426.0020.0002] # ANATOLIAN HIEROGLYPH A405 +145CA ; [.5427.0020.0002] # ANATOLIAN HIEROGLYPH A406 +145CB ; [.5428.0020.0002] # ANATOLIAN HIEROGLYPH A407 +145CC ; [.5429.0020.0002] # ANATOLIAN HIEROGLYPH A408 +145CD ; [.542A.0020.0002] # ANATOLIAN HIEROGLYPH A409 +145CE ; [.542B.0020.0002] # ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK +145CF ; [.542C.0020.0002] # ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK +145D0 ; [.542D.0020.0002] # ANATOLIAN HIEROGLYPH A411 +145D1 ; [.542E.0020.0002] # ANATOLIAN HIEROGLYPH A412 +145D2 ; [.542F.0020.0002] # ANATOLIAN HIEROGLYPH A413 +145D3 ; [.5430.0020.0002] # ANATOLIAN HIEROGLYPH A414 +145D4 ; [.5431.0020.0002] # ANATOLIAN HIEROGLYPH A415 +145D5 ; [.5432.0020.0002] # ANATOLIAN HIEROGLYPH A416 +145D6 ; [.5433.0020.0002] # ANATOLIAN HIEROGLYPH A417 +145D7 ; [.5434.0020.0002] # ANATOLIAN HIEROGLYPH A418 +145D8 ; [.5435.0020.0002] # ANATOLIAN HIEROGLYPH A419 +145D9 ; [.5436.0020.0002] # ANATOLIAN HIEROGLYPH A420 +145DA ; [.5437.0020.0002] # ANATOLIAN HIEROGLYPH A421 +145DB ; [.5438.0020.0002] # ANATOLIAN HIEROGLYPH A422 +145DC ; [.5439.0020.0002] # ANATOLIAN HIEROGLYPH A423 +145DD ; [.543A.0020.0002] # ANATOLIAN HIEROGLYPH A424 +145DE ; [.543B.0020.0002] # ANATOLIAN HIEROGLYPH A425 +145DF ; [.543C.0020.0002] # ANATOLIAN HIEROGLYPH A426 +145E0 ; [.543D.0020.0002] # ANATOLIAN HIEROGLYPH A427 +145E1 ; [.543E.0020.0002] # ANATOLIAN HIEROGLYPH A428 +145E2 ; [.543F.0020.0002] # ANATOLIAN HIEROGLYPH A429 +145E3 ; [.5440.0020.0002] # ANATOLIAN HIEROGLYPH A430 +145E4 ; [.5441.0020.0002] # ANATOLIAN HIEROGLYPH A431 +145E5 ; [.5442.0020.0002] # ANATOLIAN HIEROGLYPH A432 +145E6 ; [.5443.0020.0002] # ANATOLIAN HIEROGLYPH A433 +145E7 ; [.5444.0020.0002] # ANATOLIAN HIEROGLYPH A434 +145E8 ; [.5445.0020.0002] # ANATOLIAN HIEROGLYPH A435 +145E9 ; [.5446.0020.0002] # ANATOLIAN HIEROGLYPH A436 +145EA ; [.5447.0020.0002] # ANATOLIAN HIEROGLYPH A437 +145EB ; [.5448.0020.0002] # ANATOLIAN HIEROGLYPH A438 +145EC ; [.5449.0020.0002] # ANATOLIAN HIEROGLYPH A439 +145ED ; [.544A.0020.0002] # ANATOLIAN HIEROGLYPH A440 +145EE ; [.544B.0020.0002] # ANATOLIAN HIEROGLYPH A441 +145EF ; [.544C.0020.0002] # ANATOLIAN HIEROGLYPH A442 +145F0 ; [.544D.0020.0002] # ANATOLIAN HIEROGLYPH A443 +145F1 ; [.544E.0020.0002] # ANATOLIAN HIEROGLYPH A444 +145F2 ; [.544F.0020.0002] # ANATOLIAN HIEROGLYPH A445 +145F3 ; [.5450.0020.0002] # ANATOLIAN HIEROGLYPH A446 +145F4 ; [.5451.0020.0002] # ANATOLIAN HIEROGLYPH A447 +145F5 ; [.5452.0020.0002] # ANATOLIAN HIEROGLYPH A448 +145F6 ; [.5453.0020.0002] # ANATOLIAN HIEROGLYPH A449 +145F7 ; [.5454.0020.0002] # ANATOLIAN HIEROGLYPH A450 +145F8 ; [.5455.0020.0002] # ANATOLIAN HIEROGLYPH A450A +145F9 ; [.5456.0020.0002] # ANATOLIAN HIEROGLYPH A451 +145FA ; [.5457.0020.0002] # ANATOLIAN HIEROGLYPH A452 +145FB ; [.5458.0020.0002] # ANATOLIAN HIEROGLYPH A453 +145FC ; [.5459.0020.0002] # ANATOLIAN HIEROGLYPH A454 +145FD ; [.545A.0020.0002] # ANATOLIAN HIEROGLYPH A455 +145FE ; [.545B.0020.0002] # ANATOLIAN HIEROGLYPH A456 +145FF ; [.545C.0020.0002] # ANATOLIAN HIEROGLYPH A457 +14600 ; [.545D.0020.0002] # ANATOLIAN HIEROGLYPH A457A +14601 ; [.545E.0020.0002] # ANATOLIAN HIEROGLYPH A458 +14602 ; [.545F.0020.0002] # ANATOLIAN HIEROGLYPH A459 +14603 ; [.5460.0020.0002] # ANATOLIAN HIEROGLYPH A460 +14604 ; [.5461.0020.0002] # ANATOLIAN HIEROGLYPH A461 +14605 ; [.5462.0020.0002] # ANATOLIAN HIEROGLYPH A462 +14606 ; [.5463.0020.0002] # ANATOLIAN HIEROGLYPH A463 +14607 ; [.5464.0020.0002] # ANATOLIAN HIEROGLYPH A464 +14608 ; [.5465.0020.0002] # ANATOLIAN HIEROGLYPH A465 +14609 ; [.5466.0020.0002] # ANATOLIAN HIEROGLYPH A466 +1460A ; [.5467.0020.0002] # ANATOLIAN HIEROGLYPH A467 +1460B ; [.5468.0020.0002] # ANATOLIAN HIEROGLYPH A468 +1460C ; [.5469.0020.0002] # ANATOLIAN HIEROGLYPH A469 +1460D ; [.546A.0020.0002] # ANATOLIAN HIEROGLYPH A470 +1460E ; [.546B.0020.0002] # ANATOLIAN HIEROGLYPH A471 +1460F ; [.546C.0020.0002] # ANATOLIAN HIEROGLYPH A472 +14610 ; [.546D.0020.0002] # ANATOLIAN HIEROGLYPH A473 +14611 ; [.546E.0020.0002] # ANATOLIAN HIEROGLYPH A474 +14612 ; [.546F.0020.0002] # ANATOLIAN HIEROGLYPH A475 +14613 ; [.5470.0020.0002] # ANATOLIAN HIEROGLYPH A476 +14614 ; [.5471.0020.0002] # ANATOLIAN HIEROGLYPH A477 +14615 ; [.5472.0020.0002] # ANATOLIAN HIEROGLYPH A478 +14616 ; [.5473.0020.0002] # ANATOLIAN HIEROGLYPH A479 +14617 ; [.5474.0020.0002] # ANATOLIAN HIEROGLYPH A480 +14618 ; [.5475.0020.0002] # ANATOLIAN HIEROGLYPH A481 +14619 ; [.5476.0020.0002] # ANATOLIAN HIEROGLYPH A482 +1461A ; [.5477.0020.0002] # ANATOLIAN HIEROGLYPH A483 +1461B ; [.5478.0020.0002] # ANATOLIAN HIEROGLYPH A484 +1461C ; [.5479.0020.0002] # ANATOLIAN HIEROGLYPH A485 +1461D ; [.547A.0020.0002] # ANATOLIAN HIEROGLYPH A486 +1461E ; [.547B.0020.0002] # ANATOLIAN HIEROGLYPH A487 +1461F ; [.547C.0020.0002] # ANATOLIAN HIEROGLYPH A488 +14620 ; [.547D.0020.0002] # ANATOLIAN HIEROGLYPH A489 +14621 ; [.547E.0020.0002] # ANATOLIAN HIEROGLYPH A490 +14622 ; [.547F.0020.0002] # ANATOLIAN HIEROGLYPH A491 +14623 ; [.5480.0020.0002] # ANATOLIAN HIEROGLYPH A492 +14624 ; [.5481.0020.0002] # ANATOLIAN HIEROGLYPH A493 +14625 ; [.5482.0020.0002] # ANATOLIAN HIEROGLYPH A494 +14626 ; [.5483.0020.0002] # ANATOLIAN HIEROGLYPH A495 +14627 ; [.5484.0020.0002] # ANATOLIAN HIEROGLYPH A496 +14628 ; [.5485.0020.0002] # ANATOLIAN HIEROGLYPH A497 +14629 ; [.5486.0020.0002] # ANATOLIAN HIEROGLYPH A501 +1462A ; [.5487.0020.0002] # ANATOLIAN HIEROGLYPH A502 +1462B ; [.5488.0020.0002] # ANATOLIAN HIEROGLYPH A503 +1462C ; [.5489.0020.0002] # ANATOLIAN HIEROGLYPH A504 +1462D ; [.548A.0020.0002] # ANATOLIAN HIEROGLYPH A505 +1462E ; [.548B.0020.0002] # ANATOLIAN HIEROGLYPH A506 +1462F ; [.548C.0020.0002] # ANATOLIAN HIEROGLYPH A507 +14630 ; [.548D.0020.0002] # ANATOLIAN HIEROGLYPH A508 +14631 ; [.548E.0020.0002] # ANATOLIAN HIEROGLYPH A509 +14632 ; [.548F.0020.0002] # ANATOLIAN HIEROGLYPH A510 +14633 ; [.5490.0020.0002] # ANATOLIAN HIEROGLYPH A511 +14634 ; [.5491.0020.0002] # ANATOLIAN HIEROGLYPH A512 +14635 ; [.5492.0020.0002] # ANATOLIAN HIEROGLYPH A513 +14636 ; [.5493.0020.0002] # ANATOLIAN HIEROGLYPH A514 +14637 ; [.5494.0020.0002] # ANATOLIAN HIEROGLYPH A515 +14638 ; [.5495.0020.0002] # ANATOLIAN HIEROGLYPH A516 +14639 ; [.5496.0020.0002] # ANATOLIAN HIEROGLYPH A517 +1463A ; [.5497.0020.0002] # ANATOLIAN HIEROGLYPH A518 +1463B ; [.5498.0020.0002] # ANATOLIAN HIEROGLYPH A519 +1463C ; [.5499.0020.0002] # ANATOLIAN HIEROGLYPH A520 +1463D ; [.549A.0020.0002] # ANATOLIAN HIEROGLYPH A521 +1463E ; [.549B.0020.0002] # ANATOLIAN HIEROGLYPH A522 +1463F ; [.549C.0020.0002] # ANATOLIAN HIEROGLYPH A523 +14640 ; [.549D.0020.0002] # ANATOLIAN HIEROGLYPH A524 +14641 ; [.549E.0020.0002] # ANATOLIAN HIEROGLYPH A525 +14642 ; [.549F.0020.0002] # ANATOLIAN HIEROGLYPH A526 +14643 ; [.54A0.0020.0002] # ANATOLIAN HIEROGLYPH A527 +14644 ; [.54A1.0020.0002] # ANATOLIAN HIEROGLYPH A528 +14645 ; [.54A2.0020.0002] # ANATOLIAN HIEROGLYPH A529 +14646 ; [.54A3.0020.0002] # ANATOLIAN HIEROGLYPH A530 2F00 ; [.FB40.0020.0004][.CE00.0000.0000] # KANGXI RADICAL ONE -3220 ; [*0310.0020.0004][.FB40.0020.0004][.CE00.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH ONE +3220 ; [*0317.0020.0004][.FB40.0020.0004][.CE00.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH ONE 3280 ; [.FB40.0020.0006][.CE00.0000.0000] # CIRCLED IDEOGRAPH ONE 3192 ; [.FB40.0020.0014][.CE00.0000.0000] # IDEOGRAPHIC ANNOTATION ONE MARK 1F229 ; [.FB40.0020.001C][.CE00.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E00 319C ; [.FB40.0020.0014][.CE01.0000.0000] # IDEOGRAPHIC ANNOTATION FOURTH MARK -3226 ; [*0310.0020.0004][.FB40.0020.0004][.CE03.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SEVEN +3226 ; [*0317.0020.0004][.FB40.0020.0004][.CE03.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SEVEN 3286 ; [.FB40.0020.0006][.CE03.0000.0000] # CIRCLED IDEOGRAPH SEVEN -3222 ; [*0310.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH THREE -1F241 ; [*0372.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 +3222 ; [*0317.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH THREE +1F241 ; [*0379.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 3282 ; [.FB40.0020.0006][.CE09.0000.0000] # CIRCLED IDEOGRAPH THREE 3194 ; [.FB40.0020.0014][.CE09.0000.0000] # IDEOGRAPHIC ANNOTATION THREE MARK 1F22A ; [.FB40.0020.001C][.CE09.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E09 @@ -28593,7 +29213,7 @@ FA70 ; [.FB40.0020.0002][.CE26.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA70 1F22D ; [.FB40.0020.001C][.CE2D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E2D F905 ; [.FB40.0020.0002][.CE32.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F905 2F02 ; [.FB40.0020.0004][.CE36.0000.0000] # KANGXI RADICAL DOT -2E80 ; [.FB40.0020.0004][.CE36.0000.0000][.0000.010B.0004] # CJK RADICAL REPEAT +2E80 ; [.FB40.0020.0004][.CE36.0000.0000][.0000.0110.0004] # CJK RADICAL REPEAT 2F801 ; [.FB40.0020.0002][.CE38.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F801 F95E ; [.FB40.0020.0002][.CE39.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95E 2F800 ; [.FB40.0020.0002][.CE3D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F800 @@ -28601,21 +29221,21 @@ F95E ; [.FB40.0020.0002][.CE39.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95E 2F802 ; [.FB40.0020.0002][.CE41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F802 2F04 ; [.FB40.0020.0004][.CE59.0000.0000] # KANGXI RADICAL SECOND 319A ; [.FB40.0020.0014][.CE59.0000.0000] # IDEOGRAPHIC ANNOTATION SECOND MARK -2E84 ; [.FB40.0020.0004][.CE59.0000.0000][.0000.010B.0004] # CJK RADICAL SECOND THREE +2E84 ; [.FB40.0020.0004][.CE59.0000.0000][.0000.0110.0004] # CJK RADICAL SECOND THREE 2E83 ; [.FB40.0020.0004][.CE5A.0000.0000] # CJK RADICAL SECOND TWO 2E82 ; [.FB40.0020.0004][.CE5B.0000.0000] # CJK RADICAL SECOND ONE -3228 ; [*0310.0020.0004][.FB40.0020.0004][.CE5D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH NINE +3228 ; [*0317.0020.0004][.FB40.0020.0004][.CE5D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH NINE 3288 ; [.FB40.0020.0006][.CE5D.0000.0000] # CIRCLED IDEOGRAPH NINE F91B ; [.FB40.0020.0002][.CE82.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91B 2F05 ; [.FB40.0020.0004][.CE85.0000.0000] # KANGXI RADICAL HOOK F9BA ; [.FB40.0020.0002][.CE86.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BA 2F06 ; [.FB40.0020.0004][.CE8C.0000.0000] # KANGXI RADICAL TWO -3221 ; [*0310.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH TWO -1F242 ; [*0372.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C +3221 ; [*0317.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH TWO +1F242 ; [*0379.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C 3281 ; [.FB40.0020.0006][.CE8C.0000.0000] # CIRCLED IDEOGRAPH TWO 3193 ; [.FB40.0020.0014][.CE8C.0000.0000] # IDEOGRAPHIC ANNOTATION TWO MARK 1F214 ; [.FB40.0020.001C][.CE8C.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E8C -3224 ; [*0310.0020.0004][.FB40.0020.0004][.CE94.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FIVE +3224 ; [*0317.0020.0004][.FB40.0020.0004][.CE94.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FIVE 3284 ; [.FB40.0020.0006][.CE94.0000.0000] # CIRCLED IDEOGRAPH FIVE 2F07 ; [.FB40.0020.0004][.CEA0.0000.0000] # KANGXI RADICAL LID 1F218 ; [.FB40.0020.001C][.CEA4.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4EA4 @@ -28625,11 +29245,11 @@ F977 ; [.FB40.0020.0002][.CEAE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F977 2E85 ; [.FB40.0020.0004][.CEBB.0000.0000] # CJK RADICAL PERSON F9FD ; [.FB40.0020.0002][.CEC0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FD 2F819 ; [.FB40.0020.0002][.CECC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F819 -3239 ; [*0310.0020.0004][.FB40.0020.0004][.CEE3.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH REPRESENT +3239 ; [*0317.0020.0004][.FB40.0020.0004][.CEE3.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH REPRESENT F9A8 ; [.FB40.0020.0002][.CEE4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A8 -323D ; [*0310.0020.0004][.FB40.0020.0004][.CF01.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH ENTERPRISE +323D ; [*0317.0020.0004][.FB40.0020.0004][.CF01.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH ENTERPRISE 32AD ; [.FB40.0020.0006][.CF01.0000.0000] # CIRCLED IDEOGRAPH ENTERPRISE -3241 ; [*0310.0020.0004][.FB40.0020.0004][.CF11.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH REST +3241 ; [*0317.0020.0004][.FB40.0020.0004][.CF11.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH REST 32A1 ; [.FB40.0020.0006][.CF11.0000.0000] # CIRCLED IDEOGRAPH REST 2F804 ; [.FB40.0020.0002][.CF60.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F804 FA73 ; [.FB40.0020.0002][.CF80.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA73 @@ -28660,15 +29280,15 @@ FA32 ; [.FB40.0020.0002][.D14D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA32 FA72 ; [.FB40.0020.0002][.D168.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA72 F978 ; [.FB40.0020.0002][.D169.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F978 2F0B ; [.FB40.0020.0004][.D16B.0000.0000] # KANGXI RADICAL EIGHT -3227 ; [*0310.0020.0004][.FB40.0020.0004][.D16B.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH EIGHT +3227 ; [*0317.0020.0004][.FB40.0020.0004][.D16B.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH EIGHT 3287 ; [.FB40.0020.0006][.D16B.0000.0000] # CIRCLED IDEOGRAPH EIGHT F9D1 ; [.FB40.0020.0002][.D16D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D1 -3225 ; [*0310.0020.0004][.FB40.0020.0004][.D16D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SIX +3225 ; [*0317.0020.0004][.FB40.0020.0004][.D16D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SIX 3285 ; [.FB40.0020.0006][.D16D.0000.0000] # CIRCLED IDEOGRAPH SIX 2F811 ; [.FB40.0020.0002][.D177.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F811 FA75 ; [.FB40.0020.0002][.D180.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA75 2F0C ; [.FB40.0020.0004][.D182.0000.0000] # KANGXI RADICAL DOWN BOX -2E86 ; [.FB40.0020.0004][.D182.0000.0000][.0000.010B.0004] # CJK RADICAL BOX +2E86 ; [.FB40.0020.0004][.D182.0000.0000][.0000.0110.0004] # CJK RADICAL BOX 2F815 ; [.FB40.0020.0002][.D18D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F815 1F21E ; [.FB40.0020.001C][.D18D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-518D 2F8D2 ; [.FB40.0020.0002][.D192.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D2 @@ -28687,11 +29307,11 @@ F955 ; [.FB40.0020.0002][.D1CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F955 F954 ; [.FB40.0020.0002][.D1DC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F954 FA15 ; [.FB40.0020.0002][.D1DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA15 2F0F ; [.FB40.0020.0004][.D1E0.0000.0000] # KANGXI RADICAL TABLE -2E87 ; [.FB40.0020.0004][.D1E0.0000.0000][.0000.010B.0004] # CJK RADICAL TABLE +2E87 ; [.FB40.0020.0004][.D1E0.0000.0000][.0000.0110.0004] # CJK RADICAL TABLE 2F81D ; [.FB40.0020.0002][.D1F5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81D 2F10 ; [.FB40.0020.0004][.D1F5.0000.0000] # KANGXI RADICAL OPEN BOX 2F11 ; [.FB40.0020.0004][.D200.0000.0000] # KANGXI RADICAL KNIFE -2E88 ; [.FB40.0020.0004][.D200.0000.0000][.0000.010B.0004] # CJK RADICAL KNIFE ONE +2E88 ; [.FB40.0020.0004][.D200.0000.0000][.0000.0110.0004] # CJK RADICAL KNIFE ONE 2E89 ; [.FB40.0020.0004][.D202.0000.0000] # CJK RADICAL KNIFE TWO 2F81E ; [.FB40.0020.0002][.D203.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81E FA00 ; [.FB40.0020.0002][.D207.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA00 @@ -28711,14 +29331,14 @@ F98A ; [.FB40.0020.0002][.D29B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98A 2F12 ; [.FB40.0020.0004][.D29B.0000.0000] # KANGXI RADICAL POWER F99D ; [.FB40.0020.0002][.D2A3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99D 2F992 ; [.FB40.0020.0002][.D2B3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F992 -3238 ; [*0310.0020.0004][.FB40.0020.0004][.D2B4.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH LABOR +3238 ; [*0317.0020.0004][.FB40.0020.0004][.D2B4.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH LABOR 3298 ; [.FB40.0020.0006][.D2B4.0000.0000] # CIRCLED IDEOGRAPH LABOR FA76 ; [.FB40.0020.0002][.D2C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA76 2F825 ; [.FB40.0020.0002][.D2C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F825 FA33 ; [.FB40.0020.0002][.D2C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA33 2F826 ; [.FB40.0020.0002][.D2C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F826 F952 ; [.FB40.0020.0002][.D2D2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F952 -1F247 ; [*0372.0020.0004][.FB40.0020.0004][.D2DD.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD +1F247 ; [*0379.0020.0004][.FB40.0020.0004][.D2DD.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD F92F ; [.FB40.0020.0002][.D2DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92F FA34 ; [.FB40.0020.0002][.D2E4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA34 2F827 ; [.FB40.0020.0002][.D2E4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F827 @@ -28737,20 +29357,20 @@ F963 ; [.FB40.0020.0002][.D317.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F963 F9EB ; [.FB40.0020.0002][.D33F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EB 2F17 ; [.FB40.0020.0004][.D341.0000.0000] # KANGXI RADICAL TEN 3038 ; [.FB40.0020.0004][.D341.0000.0000] # HANGZHOU NUMERAL TEN -3229 ; [*0310.0020.0004][.FB40.0020.0004][.D341.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH TEN +3229 ; [*0317.0020.0004][.FB40.0020.0004][.D341.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH TEN 3289 ; [.FB40.0020.0006][.D341.0000.0000] # CIRCLED IDEOGRAPH TEN 3039 ; [.FB40.0020.0004][.D344.0000.0000] # HANGZHOU NUMERAL TWENTY 303A ; [.FB40.0020.0004][.D345.0000.0000] # HANGZHOU NUMERAL THIRTY 2F82C ; [.FB40.0020.0002][.D349.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82C FA35 ; [.FB40.0020.0002][.D351.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA35 2F82D ; [.FB40.0020.0002][.D351.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82D -323F ; [*0310.0020.0004][.FB40.0020.0004][.D354.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH ALLIANCE +323F ; [*0317.0020.0004][.FB40.0020.0004][.D354.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH ALLIANCE 32AF ; [.FB40.0020.0006][.D354.0000.0000] # CIRCLED IDEOGRAPH ALLIANCE 2F82E ; [.FB40.0020.0002][.D35A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82E 2F18 ; [.FB40.0020.0004][.D35C.0000.0000] # KANGXI RADICAL DIVINATION -2E8A ; [.FB40.0020.0004][.D35C.0000.0000][.0000.010B.0004] # CJK RADICAL DIVINATION +2E8A ; [.FB40.0020.0004][.D35C.0000.0000][.0000.0110.0004] # CJK RADICAL DIVINATION 2F19 ; [.FB40.0020.0004][.D369.0000.0000] # KANGXI RADICAL SEAL -2E8B ; [.FB40.0020.0004][.D369.0000.0000][.0000.010B.0004] # CJK RADICAL SEAL +2E8B ; [.FB40.0020.0004][.D369.0000.0000][.0000.0110.0004] # CJK RADICAL SEAL 329E ; [.FB40.0020.0006][.D370.0000.0000] # CIRCLED IDEOGRAPH PRINT 2F82F ; [.FB40.0020.0002][.D373.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82F F91C ; [.FB40.0020.0002][.D375.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91C @@ -28759,7 +29379,7 @@ F91C ; [.FB40.0020.0002][.D375.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91C 2F832 ; [.FB40.0020.0002][.D37F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F832 2F833 ; [.FB40.0020.0002][.D37F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F833 2F1A ; [.FB40.0020.0004][.D382.0000.0000] # KANGXI RADICAL CLIFF -2E81 ; [.FB40.0020.0004][.D382.0000.0000][.0000.010B.0004] # CJK RADICAL CLIFF +2E81 ; [.FB40.0020.0004][.D382.0000.0000][.0000.0110.0004] # CJK RADICAL CLIFF 2F1B ; [.FB40.0020.0004][.D3B6.0000.0000] # KANGXI RADICAL PRIVATE F96B ; [.FB40.0020.0002][.D3C3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96B 2F1C ; [.FB40.0020.0004][.D3C8.0000.0000] # KANGXI RADICAL AGAIN @@ -28775,7 +29395,7 @@ F906 ; [.FB40.0020.0002][.D3E5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F906 1F22E ; [.FB40.0020.001C][.D3F3.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-53F3 2F83B ; [.FB40.0020.0002][.D406.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83B 1F234 ; [.FB40.0020.001C][.D408.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5408 -3234 ; [*0310.0020.0004][.FB40.0020.0004][.D40D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH NAME +3234 ; [*0317.0020.0004][.FB40.0020.0004][.D40D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH NAME 3294 ; [.FB40.0020.0006][.D40D.0000.0000] # CIRCLED IDEOGRAPH NAME F9DE ; [.FB40.0020.0002][.D40F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DE F9ED ; [.FB40.0020.0002][.D41D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9ED @@ -28784,7 +29404,7 @@ F9ED ; [.FB40.0020.0002][.D41D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9ED F980 ; [.FB40.0020.0002][.D442.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F980 2F83E ; [.FB40.0020.0002][.D448.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83E 2F83F ; [.FB40.0020.0002][.D468.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83F -323A ; [*0310.0020.0004][.FB40.0020.0004][.D47C.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH CALL +323A ; [*0317.0020.0004][.FB40.0020.0004][.D47C.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH CALL 2F83C ; [.FB40.0020.0002][.D49E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83C 2F840 ; [.FB40.0020.0002][.D4A2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F840 F99E ; [.FB40.0020.0002][.D4BD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99E @@ -28813,14 +29433,14 @@ FA37 ; [.FB40.0020.0002][.D606.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA37 FA38 ; [.FB40.0020.0002][.D668.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA38 2F84F ; [.FB40.0020.0002][.D674.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84F 2F1E ; [.FB40.0020.0004][.D6D7.0000.0000] # KANGXI RADICAL ENCLOSURE -3223 ; [*0310.0020.0004][.FB40.0020.0004][.D6DB.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FOUR +3223 ; [*0317.0020.0004][.FB40.0020.0004][.D6DB.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FOUR 3283 ; [.FB40.0020.0006][.D6DB.0000.0000] # CIRCLED IDEOGRAPH FOUR 3195 ; [.FB40.0020.0014][.D6DB.0000.0000] # IDEOGRAPHIC ANNOTATION FOUR MARK F9A9 ; [.FB40.0020.0002][.D6F9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A9 2F84B ; [.FB40.0020.0002][.D716.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84B 2F84D ; [.FB40.0020.0002][.D717.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84D 2F1F ; [.FB40.0020.0004][.D71F.0000.0000] # KANGXI RADICAL EARTH -322F ; [*0310.0020.0004][.FB40.0020.0004][.D71F.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH EARTH +322F ; [*0317.0020.0004][.FB40.0020.0004][.D71F.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH EARTH 328F ; [.FB40.0020.0006][.D71F.0000.0000] # CIRCLED IDEOGRAPH EARTH 319E ; [.FB40.0020.0014][.D730.0000.0000] # IDEOGRAPHIC ANNOTATION EARTH MARK 2F855 ; [.FB40.0020.0002][.D78B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F855 @@ -28876,11 +29496,11 @@ FA81 ; [.FB40.0020.0002][.DB28.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA81 2F86B ; [.FB40.0020.0002][.DB3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86B 2F26 ; [.FB40.0020.0004][.DB50.0000.0000] # KANGXI RADICAL CHILD 1F211 ; [.FB40.0020.001C][.DB57.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5B57 -323B ; [*0310.0020.0004][.FB40.0020.0004][.DB66.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH STUDY +323B ; [*0317.0020.0004][.FB40.0020.0004][.DB66.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH STUDY 32AB ; [.FB40.0020.0006][.DB66.0000.0000] # CIRCLED IDEOGRAPH STUDY 2F27 ; [.FB40.0020.0004][.DB80.0000.0000] # KANGXI RADICAL ROOF FA04 ; [.FB40.0020.0002][.DB85.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA04 -1F243 ; [*0372.0020.0004][.FB40.0020.0004][.DB89.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 +1F243 ; [*0379.0020.0004][.FB40.0020.0004][.DB89.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 32AA ; [.FB40.0020.0006][.DB97.0000.0000] # CIRCLED IDEOGRAPH RELIGION 2F86D ; [.FB40.0020.0002][.DBC3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86D 2F86E ; [.FB40.0020.0002][.DBD8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86E @@ -28893,14 +29513,14 @@ F9BC ; [.FB40.0020.0002][.DBEE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BC 2F872 ; [.FB40.0020.0002][.DBFF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F872 2F873 ; [.FB40.0020.0002][.DC06.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F873 2F29 ; [.FB40.0020.0004][.DC0F.0000.0000] # KANGXI RADICAL SMALL -2E8C ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.010B.0004] # CJK RADICAL SMALL ONE -2E8D ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.010C.0004] # CJK RADICAL SMALL TWO +2E8C ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.0110.0004] # CJK RADICAL SMALL ONE +2E8D ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.0111.0004] # CJK RADICAL SMALL TWO 2F875 ; [.FB40.0020.0002][.DC22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F875 2E90 ; [.FB40.0020.0004][.DC22.0000.0000] # CJK RADICAL LAME THREE 2F2A ; [.FB40.0020.0004][.DC22.0000.0000] # KANGXI RADICAL LAME -2E8E ; [.FB40.0020.0004][.DC22.0000.0000][.0000.010B.0004] # CJK RADICAL LAME ONE +2E8E ; [.FB40.0020.0004][.DC22.0000.0000][.0000.0110.0004] # CJK RADICAL LAME ONE 2E8F ; [.FB40.0020.0004][.DC23.0000.0000] # CJK RADICAL LAME TWO -2E91 ; [.FB40.0020.0004][.DC23.0000.0000][.0000.010B.0004] # CJK RADICAL LAME FOUR +2E91 ; [.FB40.0020.0004][.DC23.0000.0000][.0000.0110.0004] # CJK RADICAL LAME FOUR 2F2B ; [.FB40.0020.0004][.DC38.0000.0000] # KANGXI RADICAL CORPSE F9BD ; [.FB40.0020.0002][.DC3F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BD 2F877 ; [.FB40.0020.0002][.DC60.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F877 @@ -28961,7 +29581,7 @@ F943 ; [.FB40.0020.0002][.DF04.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F943 2F894 ; [.FB40.0020.0002][.DF22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F894 2F895 ; [.FB40.0020.0002][.DF22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F895 2F39 ; [.FB40.0020.0004][.DF50.0000.0000] # KANGXI RADICAL SNOUT -2E95 ; [.FB40.0020.0004][.DF50.0000.0000][.0000.010B.0004] # CJK RADICAL SNOUT TWO +2E95 ; [.FB40.0020.0004][.DF50.0000.0000][.0000.0110.0004] # CJK RADICAL SNOUT TWO 2E94 ; [.FB40.0020.0004][.DF51.0000.0000] # CJK RADICAL SNOUT ONE 2F874 ; [.FB40.0020.0002][.DF53.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F874 2F3A ; [.FB40.0020.0004][.DF61.0000.0000] # KANGXI RADICAL BRISTLE @@ -28976,7 +29596,7 @@ F9D8 ; [.FB40.0020.0002][.DF8B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D8 F966 ; [.FB40.0020.0002][.DFA9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F966 FA85 ; [.FB40.0020.0002][.DFAD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA85 2F3C ; [.FB40.0020.0004][.DFC3.0000.0000] # KANGXI RADICAL HEART -2E97 ; [.FB40.0020.0004][.DFC3.0000.0000][.0000.010B.0004] # CJK RADICAL HEART TWO +2E97 ; [.FB40.0020.0004][.DFC3.0000.0000][.0000.0110.0004] # CJK RADICAL HEART TWO 2E96 ; [.FB40.0020.0004][.DFC4.0000.0000] # CJK RADICAL HEART ONE 2F89D ; [.FB40.0020.0002][.DFCD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89D 2F89E ; [.FB40.0020.0002][.DFD7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89E @@ -29024,7 +29644,7 @@ FA8C ; [.FB40.0020.0002][.E234.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA8C 2F3F ; [.FB40.0020.0004][.E24B.0000.0000] # KANGXI RADICAL HAND 1F210 ; [.FB40.0020.001C][.E24B.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-624B 2E98 ; [.FB40.0020.0004][.E24C.0000.0000] # CJK RADICAL HAND -1F245 ; [*0372.0020.0004][.FB40.0020.0004][.E253.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 +1F245 ; [*0379.0020.0004][.FB40.0020.0004][.E253.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 1F231 ; [.FB40.0020.001C][.E253.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6253 2F8B4 ; [.FB40.0020.0002][.E25D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B4 1F227 ; [.FB40.0020.001C][.E295.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6295 @@ -29062,7 +29682,7 @@ F930 ; [.FB40.0020.0002][.E4C4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F930 FA41 ; [.FB40.0020.0002][.E54F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA41 2F8C8 ; [.FB40.0020.0002][.E54F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C8 FA90 ; [.FB40.0020.0002][.E556.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA90 -1F248 ; [*0372.0020.0004][.FB40.0020.0004][.E557.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F248 ; [*0379.0020.0004][.FB40.0020.0004][.E557.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 2F8C9 ; [.FB40.0020.0002][.E56C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C9 F969 ; [.FB40.0020.0002][.E578.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F969 2F42 ; [.FB40.0020.0004][.E587.0000.0000] # KANGXI RADICAL SCRIPT @@ -29079,9 +29699,9 @@ F983 ; [.FB40.0020.0002][.E5C5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F983 FA42 ; [.FB40.0020.0002][.E5E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA42 2F8CB ; [.FB40.0020.0002][.E5E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CB 2F47 ; [.FB40.0020.0004][.E5E5.0000.0000] # KANGXI RADICAL SUN -3230 ; [*0310.0020.0004][.FB40.0020.0004][.E5E5.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SUN +3230 ; [*0317.0020.0004][.FB40.0020.0004][.E5E5.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SUN 3290 ; [.FB40.0020.0006][.E5E5.0000.0000] # CIRCLED IDEOGRAPH SUN -2E9C ; [.FB40.0020.0004][.E5E5.0000.0000][.0000.010B.0004] # CJK RADICAL SUN +2E9C ; [.FB40.0020.0004][.E5E5.0000.0000][.0000.0110.0004] # CJK RADICAL SUN 337E ; [.FB40.0020.001C][.E60E.0000.0000][.FB40.0020.001C][.ECBB.0000.0000] # SQUARE ERA NAME MEIZI F9E0 ; [.FB40.0020.0002][.E613.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E0 1F219 ; [.FB40.0020.001C][.E620.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6620 @@ -29100,11 +29720,11 @@ F901 ; [.FB40.0020.0002][.E6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F901 2F8CC ; [.FB40.0020.0002][.E6F8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CC 2F8D4 ; [.FB40.0020.0002][.E700.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D4 2F49 ; [.FB40.0020.0004][.E708.0000.0000] # KANGXI RADICAL MOON -322A ; [*0310.0020.0004][.FB40.0020.0004][.E708.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH MOON +322A ; [*0317.0020.0004][.FB40.0020.0004][.E708.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH MOON 328A ; [.FB40.0020.0006][.E708.0000.0000] # CIRCLED IDEOGRAPH MOON 1F237 ; [.FB40.0020.001C][.E708.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6708 -2E9D ; [.FB40.0020.0004][.E708.0000.0000][.0000.010B.0004] # CJK RADICAL MOON -3232 ; [*0310.0020.0004][.FB40.0020.0004][.E709.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH HAVE +2E9D ; [.FB40.0020.0004][.E708.0000.0000][.0000.0110.0004] # CJK RADICAL MOON +3232 ; [*0317.0020.0004][.FB40.0020.0004][.E709.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH HAVE 3292 ; [.FB40.0020.0006][.E709.0000.0000] # CIRCLED IDEOGRAPH HAVE 1F236 ; [.FB40.0020.001C][.E709.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6709 F929 ; [.FB40.0020.0002][.E717.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F929 @@ -29114,9 +29734,9 @@ FA93 ; [.FB40.0020.0002][.E71B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA93 2F8D9 ; [.FB40.0020.0002][.E71B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D9 2F8DA ; [.FB40.0020.0002][.E721.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DA 2F4A ; [.FB40.0020.0004][.E728.0000.0000] # KANGXI RADICAL TREE -322D ; [*0310.0020.0004][.FB40.0020.0004][.E728.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH WOOD +322D ; [*0317.0020.0004][.FB40.0020.0004][.E728.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH WOOD 328D ; [.FB40.0020.0006][.E728.0000.0000] # CIRCLED IDEOGRAPH WOOD -1F240 ; [*0372.0020.0004][.FB40.0020.0004][.E72C.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C +1F240 ; [*0379.0020.0004][.FB40.0020.0004][.E72C.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C F9E1 ; [.FB40.0020.0002][.E74E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E1 2F8DC ; [.FB40.0020.0002][.E753.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DC FA94 ; [.FB40.0020.0002][.E756.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA94 @@ -29128,7 +29748,7 @@ F9C9 ; [.FB40.0020.0002][.E7F3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C9 2F8DF ; [.FB40.0020.0002][.E7FA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DF F9DA ; [.FB40.0020.0002][.E817.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DA 2F8E5 ; [.FB40.0020.0002][.E81F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E5 -3231 ; [*0310.0020.0004][.FB40.0020.0004][.E82A.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH STOCK +3231 ; [*0317.0020.0004][.FB40.0020.0004][.E82A.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH STOCK 3291 ; [.FB40.0020.0006][.E82A.0000.0000] # CIRCLED IDEOGRAPH STOCK 337F ; [.FB40.0020.001C][.E82A.0000.0000][.FB40.0020.001C][.DF0F.0000.0000][.FB40.0020.001C][.CF1A.0000.0000][.FB40.0020.001C][.F93E.0000.0000] # SQUARE CORPORATION 2F8E1 ; [.FB40.0020.0002][.E852.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E1 @@ -29158,7 +29778,7 @@ F91D ; [.FB40.0020.0002][.EB04.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91D F98C ; [.FB40.0020.0002][.EB77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98C FA95 ; [.FB40.0020.0002][.EB79.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA95 2F4D ; [.FB40.0020.0004][.EB79.0000.0000] # KANGXI RADICAL DEATH -2E9E ; [.FB40.0020.0004][.EB7A.0000.0000][.0000.010B.0004] # CJK RADICAL DEATH +2E9E ; [.FB40.0020.0004][.EB7A.0000.0000][.0000.0110.0004] # CJK RADICAL DEATH 2F8F4 ; [.FB40.0020.0002][.EB9F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F4 F9A5 ; [.FB40.0020.0002][.EBAE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A5 2F4E ; [.FB40.0020.0004][.EBB3.0000.0000] # KANGXI RADICAL WEAPON @@ -29174,7 +29794,7 @@ FA96 ; [.FB40.0020.0002][.EBBA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA96 2EA0 ; [.FB40.0020.0004][.EC11.0000.0000] # CJK RADICAL CIVILIAN 2F53 ; [.FB40.0020.0004][.EC14.0000.0000] # KANGXI RADICAL STEAM 2F54 ; [.FB40.0020.0004][.EC34.0000.0000] # KANGXI RADICAL WATER -322C ; [*0310.0020.0004][.FB40.0020.0004][.EC34.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH WATER +322C ; [*0317.0020.0004][.FB40.0020.0004][.EC34.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH WATER 328C ; [.FB40.0020.0006][.EC34.0000.0000] # CIRCLED IDEOGRAPH WATER 2EA1 ; [.FB40.0020.0004][.EC35.0000.0000] # CJK RADICAL WATER ONE 2EA2 ; [.FB40.0020.0004][.EC3A.0000.0000] # CJK RADICAL WATER TWO @@ -29230,7 +29850,7 @@ FA9B ; [.FB40.0020.0002][.F01E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9B 2F913 ; [.FB40.0020.0002][.F039.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F913 2F917 ; [.FB40.0020.0002][.F04A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F917 2F55 ; [.FB40.0020.0004][.F06B.0000.0000] # KANGXI RADICAL FIRE -322B ; [*0310.0020.0004][.FB40.0020.0004][.F06B.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FIRE +322B ; [*0317.0020.0004][.FB40.0020.0004][.F06B.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FIRE 328B ; [.FB40.0020.0006][.F06B.0000.0000] # CIRCLED IDEOGRAPH FIRE 2EA3 ; [.FB40.0020.0004][.F06C.0000.0000] # CJK RADICAL FIRE 2F835 ; [.FB40.0020.0002][.F070.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F835 @@ -29238,7 +29858,7 @@ FA9B ; [.FB40.0020.0002][.F01E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9B 2F918 ; [.FB40.0020.0002][.F07D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F918 F9FB ; [.FB40.0020.0002][.F099.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FB 2F91A ; [.FB40.0020.0002][.F0AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F91A -1F244 ; [*0372.0020.0004][.FB40.0020.0004][.F0B9.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 +1F244 ; [*0379.0020.0004][.FB40.0020.0004][.F0B9.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 F99F ; [.FB40.0020.0002][.F0C8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99F F916 ; [.FB40.0020.0002][.F0D9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F916 1F21A ; [.FB40.0020.001C][.F121.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7121 @@ -29255,7 +29875,7 @@ F91E ; [.FB40.0020.0002][.F21B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91E 2F56 ; [.FB40.0020.0004][.F22A.0000.0000] # KANGXI RADICAL CLAW FA49 ; [.FB40.0020.0002][.F22B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA49 2EA4 ; [.FB40.0020.0004][.F22B.0000.0000] # CJK RADICAL PAW ONE -2EA5 ; [.FB40.0020.0004][.F22B.0000.0000][.0000.010B.0004] # CJK RADICAL PAW TWO +2EA5 ; [.FB40.0020.0004][.F22B.0000.0000][.0000.0110.0004] # CJK RADICAL PAW TWO FA9E ; [.FB40.0020.0002][.F235.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9E 2F921 ; [.FB40.0020.0002][.F235.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F921 2F57 ; [.FB40.0020.0004][.F236.0000.0000] # KANGXI RADICAL FATHER @@ -29265,9 +29885,9 @@ FA9E ; [.FB40.0020.0002][.F235.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9E 2F922 ; [.FB40.0020.0002][.F250.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F922 2F5B ; [.FB40.0020.0004][.F259.0000.0000] # KANGXI RADICAL FANG 2F5C ; [.FB40.0020.0004][.F25B.0000.0000] # KANGXI RADICAL COW -2EA7 ; [.FB40.0020.0004][.F25B.0000.0000][.0000.010B.0004] # CJK RADICAL COW +2EA7 ; [.FB40.0020.0004][.F25B.0000.0000][.0000.0110.0004] # CJK RADICAL COW F946 ; [.FB40.0020.0002][.F262.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F946 -3235 ; [*0310.0020.0004][.FB40.0020.0004][.F279.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SPECIAL +3235 ; [*0317.0020.0004][.FB40.0020.0004][.F279.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SPECIAL 3295 ; [.FB40.0020.0006][.F279.0000.0000] # CIRCLED IDEOGRAPH SPECIAL 2F924 ; [.FB40.0020.0002][.F280.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F924 2F925 ; [.FB40.0020.0002][.F295.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F925 @@ -29285,7 +29905,7 @@ F961 ; [.FB40.0020.0002][.F387.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F961 F9DB ; [.FB40.0020.0002][.F387.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DB 2F5F ; [.FB40.0020.0004][.F389.0000.0000] # KANGXI RADICAL JADE 2F929 ; [.FB40.0020.0002][.F38B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F929 -2EA9 ; [.FB40.0020.0004][.F38B.0000.0000][.0000.010B.0004] # CJK RADICAL JADE +2EA9 ; [.FB40.0020.0004][.F38B.0000.0000][.0000.0110.0004] # CJK RADICAL JADE 2F92B ; [.FB40.0020.0002][.F3A5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F92B F9AD ; [.FB40.0020.0002][.F3B2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AD F917 ; [.FB40.0020.0002][.F3DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F917 @@ -29320,7 +29940,7 @@ F976 ; [.FB40.0020.0002][.F565.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F976 F962 ; [.FB40.0020.0002][.F570.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F962 2F938 ; [.FB40.0020.0002][.F570.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F938 2F66 ; [.FB40.0020.0004][.F58B.0000.0000] # KANGXI RADICAL BOLT OF CLOTH -2EAA ; [.FB40.0020.0004][.F58B.0000.0000][.0000.010B.0004] # CJK RADICAL BOLT OF CLOTH +2EAA ; [.FB40.0020.0004][.F58B.0000.0000][.0000.0110.0004] # CJK RADICAL BOLT OF CLOTH 2F67 ; [.FB40.0020.0004][.F592.0000.0000] # KANGXI RADICAL SICKNESS F9E5 ; [.FB40.0020.0002][.F5E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E5 2F93A ; [.FB40.0020.0002][.F610.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F93A @@ -29334,13 +29954,13 @@ F90E ; [.FB40.0020.0002][.F669.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90E 2F6B ; [.FB40.0020.0004][.F6BF.0000.0000] # KANGXI RADICAL DISH FA17 ; [.FB40.0020.0002][.F6CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA17 FAA6 ; [.FB40.0020.0002][.F6CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA6 -1F246 ; [*0372.0020.0004][.FB40.0020.0004][.F6D7.0000.0000][*0373.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 +1F246 ; [*0379.0020.0004][.FB40.0020.0004][.F6D7.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 FAA7 ; [.FB40.0020.0002][.F6DB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA7 -323C ; [*0310.0020.0004][.FB40.0020.0004][.F6E3.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SUPERVISE +323C ; [*0317.0020.0004][.FB40.0020.0004][.F6E3.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SUPERVISE 32AC ; [.FB40.0020.0006][.F6E3.0000.0000] # CIRCLED IDEOGRAPH SUPERVISE F933 ; [.FB40.0020.0002][.F6E7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F933 2F6C ; [.FB40.0020.0004][.F6EE.0000.0000] # KANGXI RADICAL EYE -2EAB ; [.FB40.0020.0004][.F6EE.0000.0000][.0000.010B.0004] # CJK RADICAL EYE +2EAB ; [.FB40.0020.0004][.F6EE.0000.0000][.0000.0110.0004] # CJK RADICAL EYE FAA8 ; [.FB40.0020.0002][.F6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA8 2F940 ; [.FB40.0020.0002][.F6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F940 F96D ; [.FB40.0020.0002][.F701.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96D @@ -29366,11 +29986,11 @@ FAAB ; [.FB40.0020.0002][.F8CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAAB F964 ; [.FB40.0020.0002][.F8FB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F964 F985 ; [.FB40.0020.0002][.F92A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F985 2F70 ; [.FB40.0020.0004][.F93A.0000.0000] # KANGXI RADICAL SPIRIT -2EAC ; [.FB40.0020.0004][.F93A.0000.0000][.0000.010B.0004] # CJK RADICAL SPIRIT ONE +2EAC ; [.FB40.0020.0004][.F93A.0000.0000][.0000.0110.0004] # CJK RADICAL SPIRIT ONE 2EAD ; [.FB40.0020.0004][.F93B.0000.0000] # CJK RADICAL SPIRIT TWO FA18 ; [.FB40.0020.0002][.F93C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA18 FA4C ; [.FB40.0020.0002][.F93E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4C -3233 ; [*0310.0020.0004][.FB40.0020.0004][.F93E.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SOCIETY +3233 ; [*0317.0020.0004][.FB40.0020.0004][.F93E.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SOCIETY 3293 ; [.FB40.0020.0006][.F93E.0000.0000] # CIRCLED IDEOGRAPH SOCIETY FA4E ; [.FB40.0020.0002][.F948.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4E FA4D ; [.FB40.0020.0002][.F949.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4D @@ -29378,11 +29998,11 @@ FA4F ; [.FB40.0020.0002][.F950.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4F FA50 ; [.FB40.0020.0002][.F956.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA50 2F953 ; [.FB40.0020.0002][.F956.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F953 FA51 ; [.FB40.0020.0002][.F95D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA51 -3237 ; [*0310.0020.0004][.FB40.0020.0004][.F95D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH CONGRATULATION +3237 ; [*0317.0020.0004][.FB40.0020.0004][.F95D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH CONGRATULATION 3297 ; [.FB40.0020.0006][.F95D.0000.0000] # CIRCLED IDEOGRAPH CONGRATULATION FA19 ; [.FB40.0020.0002][.F95E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA19 FA1A ; [.FB40.0020.0002][.F965.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA1A -3240 ; [*0310.0020.0004][.FB40.0020.0004][.F96D.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FESTIVAL +3240 ; [*0317.0020.0004][.FB40.0020.0004][.F96D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FESTIVAL F93C ; [.FB40.0020.0002][.F97F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93C 1F232 ; [.FB40.0020.001C][.F981.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7981 FA52 ; [.FB40.0020.0002][.F98D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA52 @@ -29408,7 +30028,7 @@ F9F7 ; [.FB40.0020.0002][.FACB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F7 2F74 ; [.FB40.0020.0004][.FACB.0000.0000] # KANGXI RADICAL STAND 2F95F ; [.FB40.0020.0002][.FAEE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F95F 2F75 ; [.FB40.0020.0004][.FAF9.0000.0000] # KANGXI RADICAL BAMBOO -2EAE ; [.FB40.0020.0004][.FAF9.0000.0000][.0000.010B.0004] # CJK RADICAL BAMBOO +2EAE ; [.FB40.0020.0004][.FAF9.0000.0000][.0000.0110.0004] # CJK RADICAL BAMBOO F9F8 ; [.FB40.0020.0002][.FB20.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F8 3247 ; [.FB40.0020.0006][.FB8F.0000.0000] # CIRCLED IDEOGRAPH KOTO FA56 ; [.FB40.0020.0002][.FBC0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA56 @@ -29451,17 +30071,17 @@ FA59 ; [.FB40.0020.0002][.FE41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA59 FAB1 ; [.FB40.0020.0002][.FF3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB1 2F79 ; [.FB40.0020.0004][.FF51.0000.0000] # KANGXI RADICAL NET 2EB2 ; [.FB40.0020.0004][.FF52.0000.0000] # CJK RADICAL NET TWO -2EB5 ; [.FB40.0020.0004][.FF52.0000.0000][.0000.010B.0004] # CJK RADICAL MESH +2EB5 ; [.FB40.0020.0004][.FF52.0000.0000][.0000.0110.0004] # CJK RADICAL MESH 2EB1 ; [.FB40.0020.0004][.FF53.0000.0000] # CJK RADICAL NET ONE -2EB3 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.010B.0004] # CJK RADICAL NET THREE -2EB4 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.010C.0004] # CJK RADICAL NET FOUR +2EB3 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.0110.0004] # CJK RADICAL NET THREE +2EB4 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.0111.0004] # CJK RADICAL NET FOUR FA5A ; [.FB40.0020.0002][.FF72.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5A F9E6 ; [.FB40.0020.0002][.FF79.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E6 2F976 ; [.FB40.0020.0002][.FF7A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F976 F90F ; [.FB40.0020.0002][.FF85.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90F 2F7A ; [.FB40.0020.0004][.FF8A.0000.0000] # KANGXI RADICAL SHEEP -2EB6 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.010B.0004] # CJK RADICAL SHEEP -2EB7 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.010C.0004] # CJK RADICAL RAM +2EB6 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.0110.0004] # CJK RADICAL SHEEP +2EB7 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.0111.0004] # CJK RADICAL RAM 2EB8 ; [.FB40.0020.0004][.FF8B.0000.0000] # CJK RADICAL EWE 2F978 ; [.FB40.0020.0002][.FF95.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F978 F9AF ; [.FB40.0020.0002][.FF9A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AF @@ -29483,10 +30103,10 @@ F997 ; [.FB41.0020.0002][.806F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F997 2F97F ; [.FB41.0020.0002][.8070.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F97F F945 ; [.FB41.0020.0002][.807E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F945 2F80 ; [.FB41.0020.0004][.807F.0000.0000] # KANGXI RADICAL BRUSH -2EBB ; [.FB41.0020.0004][.807F.0000.0000][.0000.010B.0004] # CJK RADICAL BRUSH TWO +2EBB ; [.FB41.0020.0004][.807F.0000.0000][.0000.0110.0004] # CJK RADICAL BRUSH TWO 2EBA ; [.FB41.0020.0004][.8080.0000.0000] # CJK RADICAL BRUSH ONE 2F81 ; [.FB41.0020.0004][.8089.0000.0000] # KANGXI RADICAL MEAT -2EBC ; [.FB41.0020.0004][.8089.0000.0000][.0000.010B.0004] # CJK RADICAL MEAT +2EBC ; [.FB41.0020.0004][.8089.0000.0000][.0000.0110.0004] # CJK RADICAL MEAT F953 ; [.FB41.0020.0002][.808B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F953 2F8D6 ; [.FB41.0020.0002][.80AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D6 2F982 ; [.FB41.0020.0002][.80B2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F982 @@ -29496,12 +30116,12 @@ F926 ; [.FB41.0020.0002][.81D8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F926 2F82 ; [.FB41.0020.0004][.81E3.0000.0000] # KANGXI RADICAL MINISTER F9F6 ; [.FB41.0020.0002][.81E8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F6 2F83 ; [.FB41.0020.0004][.81EA.0000.0000] # KANGXI RADICAL SELF -3242 ; [*0310.0020.0004][.FB41.0020.0004][.81EA.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH SELF +3242 ; [*0317.0020.0004][.FB41.0020.0004][.81EA.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SELF FA5C ; [.FB41.0020.0002][.81ED.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5C 2F84 ; [.FB41.0020.0004][.81F3.0000.0000] # KANGXI RADICAL ARRIVE -3243 ; [*0310.0020.0004][.FB41.0020.0004][.81F3.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH REACH +3243 ; [*0317.0020.0004][.FB41.0020.0004][.81F3.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH REACH 2F85 ; [.FB41.0020.0004][.81FC.0000.0000] # KANGXI RADICAL MORTAR -2EBD ; [.FB41.0020.0004][.81FC.0000.0000][.0000.010B.0004] # CJK RADICAL MORTAR +2EBD ; [.FB41.0020.0004][.81FC.0000.0000][.0000.0110.0004] # CJK RADICAL MORTAR 2F893 ; [.FB41.0020.0002][.8201.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F893 2F98B ; [.FB41.0020.0002][.8201.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98B 2F98C ; [.FB41.0020.0002][.8204.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98C @@ -29516,8 +30136,8 @@ F97C ; [.FB41.0020.0002][.826F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97C FA5D ; [.FB41.0020.0002][.8279.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5D FA5E ; [.FB41.0020.0002][.8279.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5E 2EBE ; [.FB41.0020.0004][.8279.0000.0000] # CJK RADICAL GRASS ONE -2EBF ; [.FB41.0020.0004][.8279.0000.0000][.0000.010B.0004] # CJK RADICAL GRASS TWO -2EC0 ; [.FB41.0020.0004][.8279.0000.0000][.0000.010C.0004] # CJK RADICAL GRASS THREE +2EBF ; [.FB41.0020.0004][.8279.0000.0000][.0000.0110.0004] # CJK RADICAL GRASS TWO +2EC0 ; [.FB41.0020.0004][.8279.0000.0000][.0000.0111.0004] # CJK RADICAL GRASS THREE 2F990 ; [.FB41.0020.0002][.828B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F990 2F98F ; [.FB41.0020.0002][.8291.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98F 2F991 ; [.FB41.0020.0002][.829D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F991 @@ -29607,7 +30227,7 @@ FAB8 ; [.FB41.0020.0002][.8996.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB8 2EC5 ; [.FB41.0020.0004][.89C1.0000.0000] # CJK RADICAL C-SIMPLIFIED SEE 2EC6 ; [.FB41.0020.0004][.89D2.0000.0000] # CJK RADICAL SIMPLIFIED HORN 2F93 ; [.FB41.0020.0004][.89D2.0000.0000] # KANGXI RADICAL HORN -2EC7 ; [.FB41.0020.0004][.89D2.0000.0000][.0000.010B.0004] # CJK RADICAL HORN +2EC7 ; [.FB41.0020.0004][.89D2.0000.0000][.0000.0110.0004] # CJK RADICAL HORN 1F216 ; [.FB41.0020.001C][.89E3.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-89E3 2F94 ; [.FB41.0020.0004][.8A00.0000.0000] # KANGXI RADICAL SPEECH 2F9CF ; [.FB41.0020.0002][.8AA0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9CF @@ -29639,13 +30259,13 @@ F900 ; [.FB41.0020.0002][.8C48.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F900 2F97 ; [.FB41.0020.0004][.8C55.0000.0000] # KANGXI RADICAL PIG 2F98 ; [.FB41.0020.0004][.8C78.0000.0000] # KANGXI RADICAL BADGER 2F99 ; [.FB41.0020.0004][.8C9D.0000.0000] # KANGXI RADICAL SHELL -3236 ; [*0310.0020.0004][.FB41.0020.0004][.8CA1.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH FINANCIAL +3236 ; [*0317.0020.0004][.FB41.0020.0004][.8CA1.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FINANCIAL 3296 ; [.FB41.0020.0006][.8CA1.0000.0000] # CIRCLED IDEOGRAPH FINANCIAL 1F223 ; [.FB41.0020.001C][.8CA9.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-8CA9 2F9D4 ; [.FB41.0020.0002][.8CAB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D4 2F9D5 ; [.FB41.0020.0002][.8CC1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D5 F948 ; [.FB41.0020.0002][.8CC2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F948 -323E ; [*0310.0020.0004][.FB41.0020.0004][.8CC7.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH RESOURCE +323E ; [*0317.0020.0004][.FB41.0020.0004][.8CC7.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH RESOURCE 32AE ; [.FB41.0020.0006][.8CC7.0000.0000] # CIRCLED IDEOGRAPH RESOURCE F903 ; [.FB41.0020.0002][.8CC8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F903 FA64 ; [.FB41.0020.0002][.8CD3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA64 @@ -29658,7 +30278,7 @@ FAC1 ; [.FB41.0020.0002][.8D08.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC1 1F230 ; [.FB41.0020.001C][.8D70.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-8D70 2F9D7 ; [.FB41.0020.0002][.8D77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D7 2F9C ; [.FB41.0020.0004][.8DB3.0000.0000] # KANGXI RADICAL FOOT -2ECA ; [.FB41.0020.0004][.8DB3.0000.0000][.0000.010B.0004] # CJK RADICAL FOOT +2ECA ; [.FB41.0020.0004][.8DB3.0000.0000][.0000.0110.0004] # CJK RADICAL FOOT 2F9DB ; [.FB41.0020.0002][.8DBC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DB 2F9DA ; [.FB41.0020.0002][.8DCB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DA F937 ; [.FB41.0020.0002][.8DEF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F937 @@ -29681,8 +30301,8 @@ F971 ; [.FB41.0020.0002][.8FB0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F971 2FA1 ; [.FB41.0020.0004][.8FB5.0000.0000] # KANGXI RADICAL WALK FA66 ; [.FB41.0020.0002][.8FB6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA66 2ECC ; [.FB41.0020.0004][.8FB6.0000.0000] # CJK RADICAL SIMPLIFIED WALK -2ECD ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.010B.0004] # CJK RADICAL WALK ONE -2ECE ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.010C.0004] # CJK RADICAL WALK TWO +2ECD ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.0110.0004] # CJK RADICAL WALK ONE +2ECE ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.0111.0004] # CJK RADICAL WALK TWO F99A ; [.FB41.0020.0002][.9023.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99A FA25 ; [.FB41.0020.0002][.9038.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA25 FA67 ; [.FB41.0020.0002][.9038.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA67 @@ -29692,7 +30312,7 @@ FAC3 ; [.FB41.0020.0002][.9072.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC3 F9C3 ; [.FB41.0020.0002][.907C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C3 F913 ; [.FB41.0020.0002][.908F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F913 2FA2 ; [.FB41.0020.0004][.9091.0000.0000] # KANGXI RADICAL CITY -2ECF ; [.FB41.0020.0004][.9091.0000.0000][.0000.010B.0004] # CJK RADICAL CITY +2ECF ; [.FB41.0020.0004][.9091.0000.0000][.0000.0110.0004] # CJK RADICAL CITY 2F9E2 ; [.FB41.0020.0002][.9094.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E2 F92C ; [.FB41.0020.0002][.90CE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92C FA2E ; [.FB41.0020.0002][.90DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2E @@ -29701,6 +30321,7 @@ FA26 ; [.FB41.0020.0002][.90FD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA26 2F9E4 ; [.FB41.0020.0002][.9111.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E4 2F9E6 ; [.FB41.0020.0002][.911B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E6 2FA3 ; [.FB41.0020.0004][.9149.0000.0000] # KANGXI RADICAL WINE +1F23B ; [.FB41.0020.001C][.914D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-914D F919 ; [.FB41.0020.0002][.916A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F919 FAC4 ; [.FB41.0020.0002][.9199.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC4 F9B7 ; [.FB41.0020.0002][.91B4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B7 @@ -29710,7 +30331,7 @@ F9E9 ; [.FB41.0020.0002][.91CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E9 F97E ; [.FB41.0020.0002][.91CF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97E F90A ; [.FB41.0020.0002][.91D1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90A 2FA6 ; [.FB41.0020.0004][.91D1.0000.0000] # KANGXI RADICAL GOLD -322E ; [*0310.0020.0004][.FB41.0020.0004][.91D1.0000.0000][*0311.0020.0004] # PARENTHESIZED IDEOGRAPH METAL +322E ; [*0317.0020.0004][.FB41.0020.0004][.91D1.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH METAL 328E ; [.FB41.0020.0006][.91D1.0000.0000] # CIRCLED IDEOGRAPH METAL F9B1 ; [.FB41.0020.0002][.9234.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B1 2F9E7 ; [.FB41.0020.0002][.9238.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E7 @@ -29733,7 +30354,7 @@ F986 ; [.FB41.0020.0002][.95AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F986 2F9F0 ; [.FB41.0020.0002][.95B7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F0 2ED4 ; [.FB41.0020.0004][.95E8.0000.0000] # CJK RADICAL C-SIMPLIFIED GATE 2FA9 ; [.FB41.0020.0004][.961C.0000.0000] # KANGXI RADICAL MOUND -2ED5 ; [.FB41.0020.0004][.961C.0000.0000][.0000.010B.0004] # CJK RADICAL MOUND ONE +2ED5 ; [.FB41.0020.0004][.961C.0000.0000][.0000.0110.0004] # CJK RADICAL MOUND ONE 2ED6 ; [.FB41.0020.0004][.961D.0000.0000] # CJK RADICAL MOUND TWO F9C6 ; [.FB41.0020.0002][.962E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C6 F951 ; [.FB41.0020.0002][.964B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F951 @@ -29752,7 +30373,7 @@ F9EA ; [.FB41.0020.0002][.96E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EA FA68 ; [.FB41.0020.0002][.96E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA68 FAC7 ; [.FB41.0020.0002][.96E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC7 2FAC ; [.FB41.0020.0004][.96E8.0000.0000] # KANGXI RADICAL RAIN -2ED7 ; [.FB41.0020.0004][.96E8.0000.0000][.0000.010B.0004] # CJK RADICAL RAIN +2ED7 ; [.FB41.0020.0004][.96E8.0000.0000][.0000.0110.0004] # CJK RADICAL RAIN F9B2 ; [.FB41.0020.0002][.96F6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B2 F949 ; [.FB41.0020.0002][.96F7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F949 2F9F5 ; [.FB41.0020.0002][.9723.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F5 @@ -29791,7 +30412,7 @@ F9D0 ; [.FB41.0020.0002][.985E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D0 2EDD ; [.FB41.0020.0004][.98DF.0000.0000] # CJK RADICAL EAT ONE 2FB7 ; [.FB41.0020.0004][.98DF.0000.0000] # KANGXI RADICAL EAT 2EDF ; [.FB41.0020.0004][.98E0.0000.0000] # CJK RADICAL EAT THREE -2EDE ; [.FB41.0020.0004][.98E0.0000.0000][.0000.010B.0004] # CJK RADICAL EAT TWO +2EDE ; [.FB41.0020.0004][.98E0.0000.0000][.0000.0110.0004] # CJK RADICAL EAT TWO 2FA02 ; [.FB41.0020.0002][.98E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA02 FA2A ; [.FB41.0020.0002][.98EF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2A FA2B ; [.FB41.0020.0002][.98FC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2B @@ -29799,7 +30420,7 @@ FA2C ; [.FB41.0020.0002][.9928.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2C 2FA04 ; [.FB41.0020.0002][.9929.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA04 2EE0 ; [.FB41.0020.0004][.9963.0000.0000] # CJK RADICAL C-SIMPLIFIED EAT 2FB8 ; [.FB41.0020.0004][.9996.0000.0000] # KANGXI RADICAL HEAD -2EE1 ; [.FB41.0020.0004][.9996.0000.0000][.0000.010B.0004] # CJK RADICAL HEAD +2EE1 ; [.FB41.0020.0004][.9996.0000.0000][.0000.0110.0004] # CJK RADICAL HEAD 2FB9 ; [.FB41.0020.0004][.9999.0000.0000] # KANGXI RADICAL FRAGRANT 2FA05 ; [.FB41.0020.0002][.99A7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA05 2FBA ; [.FB41.0020.0004][.99AC.0000.0000] # KANGXI RADICAL HORSE @@ -29809,7 +30430,7 @@ F91A ; [.FB41.0020.0002][.99F1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91A F987 ; [.FB41.0020.0002][.9A6A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F987 2EE2 ; [.FB41.0020.0004][.9A6C.0000.0000] # CJK RADICAL C-SIMPLIFIED HORSE 2FBB ; [.FB41.0020.0004][.9AA8.0000.0000] # KANGXI RADICAL BONE -2EE3 ; [.FB41.0020.0004][.9AA8.0000.0000][.0000.010B.0004] # CJK RADICAL BONE +2EE3 ; [.FB41.0020.0004][.9AA8.0000.0000][.0000.0110.0004] # CJK RADICAL BONE 2FBC ; [.FB41.0020.0004][.9AD8.0000.0000] # KANGXI RADICAL TALL 2FBD ; [.FB41.0020.0004][.9ADF.0000.0000] # KANGXI RADICAL HAIR FACD ; [.FB41.0020.0002][.9B12.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACD @@ -29818,7 +30439,7 @@ FACD ; [.FB41.0020.0002][.9B12.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACD 2FBF ; [.FB41.0020.0004][.9B2F.0000.0000] # KANGXI RADICAL SACRIFICIAL WINE 2FC0 ; [.FB41.0020.0004][.9B32.0000.0000] # KANGXI RADICAL CAULDRON 2FC1 ; [.FB41.0020.0004][.9B3C.0000.0000] # KANGXI RADICAL GHOST -2EE4 ; [.FB41.0020.0004][.9B3C.0000.0000][.0000.010B.0004] # CJK RADICAL GHOST +2EE4 ; [.FB41.0020.0004][.9B3C.0000.0000][.0000.0110.0004] # CJK RADICAL GHOST 2FC2 ; [.FB41.0020.0004][.9B5A.0000.0000] # KANGXI RADICAL FISH F939 ; [.FB41.0020.0002][.9B6F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F939 2FA0B ; [.FB41.0020.0002][.9C40.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA0B @@ -29832,7 +30453,7 @@ F93A ; [.FB41.0020.0002][.9DFA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93A F920 ; [.FB41.0020.0002][.9E1E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F920 2EE6 ; [.FB41.0020.0004][.9E1F.0000.0000] # CJK RADICAL C-SIMPLIFIED BIRD 2FC4 ; [.FB41.0020.0004][.9E75.0000.0000] # KANGXI RADICAL SALT -2EE7 ; [.FB41.0020.0004][.9E75.0000.0000][.0000.010B.0004] # CJK RADICAL C-SIMPLIFIED SALT +2EE7 ; [.FB41.0020.0004][.9E75.0000.0000][.0000.0110.0004] # CJK RADICAL C-SIMPLIFIED SALT F940 ; [.FB41.0020.0002][.9E7F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F940 2FC5 ; [.FB41.0020.0004][.9E7F.0000.0000] # KANGXI RADICAL DEER F988 ; [.FB41.0020.0002][.9E97.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F988 @@ -29861,22 +30482,22 @@ F989 ; [.FB41.0020.0002][.9ECE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F989 2FD0 ; [.FB41.0020.0004][.9F3B.0000.0000] # KANGXI RADICAL NOSE FAD8 ; [.FB41.0020.0002][.9F43.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD8 2FD1 ; [.FB41.0020.0004][.9F4A.0000.0000] # KANGXI RADICAL EVEN -2EEB ; [.FB41.0020.0004][.9F4A.0000.0000][.0000.010B.0004] # CJK RADICAL J-SIMPLIFIED EVEN +2EEB ; [.FB41.0020.0004][.9F4A.0000.0000][.0000.0110.0004] # CJK RADICAL J-SIMPLIFIED EVEN 2EEC ; [.FB41.0020.0004][.9F50.0000.0000] # CJK RADICAL C-SIMPLIFIED EVEN 2FD2 ; [.FB41.0020.0004][.9F52.0000.0000] # KANGXI RADICAL TOOTH -2EED ; [.FB41.0020.0004][.9F52.0000.0000][.0000.010B.0004] # CJK RADICAL J-SIMPLIFIED TOOTH +2EED ; [.FB41.0020.0004][.9F52.0000.0000][.0000.0110.0004] # CJK RADICAL J-SIMPLIFIED TOOTH 2EEE ; [.FB41.0020.0004][.9F7F.0000.0000] # CJK RADICAL C-SIMPLIFIED TOOTH F9C4 ; [.FB41.0020.0002][.9F8D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C4 2FD3 ; [.FB41.0020.0004][.9F8D.0000.0000] # KANGXI RADICAL DRAGON -2EEF ; [.FB41.0020.0004][.9F8D.0000.0000][.0000.010B.0004] # CJK RADICAL J-SIMPLIFIED DRAGON +2EEF ; [.FB41.0020.0004][.9F8D.0000.0000][.0000.0110.0004] # CJK RADICAL J-SIMPLIFIED DRAGON FAD9 ; [.FB41.0020.0002][.9F8E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD9 2EF0 ; [.FB41.0020.0004][.9F99.0000.0000] # CJK RADICAL C-SIMPLIFIED DRAGON F907 ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F907 F908 ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F908 FACE ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACE 2FD4 ; [.FB41.0020.0004][.9F9C.0000.0000] # KANGXI RADICAL TURTLE -2EF1 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.010B.0004] # CJK RADICAL TURTLE -2EF2 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.010C.0004] # CJK RADICAL J-SIMPLIFIED TURTLE +2EF1 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.0110.0004] # CJK RADICAL TURTLE +2EF2 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.0111.0004] # CJK RADICAL J-SIMPLIFIED TURTLE 2EF3 ; [.FB41.0020.0004][.9F9F.0000.0000] # CJK RADICAL C-SIMPLIFIED TURTLE 2FD5 ; [.FB41.0020.0004][.9FA0.0000.0000] # KANGXI RADICAL FLUTE FA0E ; [.FB41.0020.0002][.FA0E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA0E @@ -30074,3 +30695,5 @@ FAD7 ; [.FB84.0020.0002][.FED3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD7 2F88F ; [.FB85.0020.0002][.A392.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F88F 2FA1D ; [.FB85.0020.0002][.A600.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA1D FFFD ; [.FFFD.0020.0002] # REPLACEMENT CHARACTER + +# EOF diff --git a/tools-for-build/more-ucd-consts.lisp-expr b/tools-for-build/more-ucd-consts.lisp-expr index b1a2b57bad..120b89268e 100644 --- a/tools-for-build/more-ucd-consts.lisp-expr +++ b/tools-for-build/more-ucd-consts.lisp-expr @@ -36,9 +36,9 @@ "Psalter_Pahlavi" "Grantha" "Mro" "Siddham" "Khojki" "Nabataean" "Tirhuta" "Khudawadi" "Old_North_Arabian" "Warang_Citi" "Linear_A" "Old_Permic" "Ahom" "Anatolian_Hieroglyphs" "Hatran" "Multani" "Old_Hungarian" - "SignWriting")) + "SignWriting" "Adlam" "Bhaiksuki" "Marchen" "Newa" "Osage" "Tangut")) (*line-break-classes* - ("XX" "AI" "AL" "B2" "BA" "BB" "BK" "CB" "CJ" "CL" "CM" "CP" "CR" "EX" "GL" - "HL" "HY" "ID" "IN" "IS" "LF" "NL" "NS" "NU" "OP" "PO" "PR" "QU" "RI" "SA" - "SG" "SP" "SY" "WJ" "ZW"))) + ("XX" "AI" "AL" "B2" "BA" "BB" "BK" "CB" "CJ" "CL" "CM" "CP" "CR" "EB" "EM" + "EX" "GL" "HL" "HY" "ID" "IN" "IS" "LF" "NL" "NS" "NU" "OP" "PO" "PR" "QU" + "RI" "SA" "SG" "SP" "SY" "WJ" "ZW" "ZWJ"))) diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index e1f9217b31..3ba3cf17db 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -18,15 +18,18 @@ (setf (gethash (format nil "tools-for-build/~A.txt" ,name) *ucd-inputs*) 'used) ,@body)) -(defmacro with-input-utf8-file ((s name &key (eszets 0)) &body body) - ;; KLUDGE: CaseFolding.txt as distributed by Unicode contains a - ;; non-ASCII character, an eszet, within a comment to act as an +(defmacro with-input-utf8-file + ((s name &key (eszets 0) (registereds 1) (copyrights 1)) &body body) + ;; KLUDGE: Unicode data files in general have registered and + ;; copyright marks (non-ASCII characters) in the header; + ;; additionally, CaseFolding.txt as distributed by Unicode contains + ;; a non-ASCII character, an eszet, within a comment to act as an ;; example. We can't in general assume that our host lisp will let - ;; us read that, and we can't portably write that we don't care + ;; us read those, and we can't portably write that we don't care ;; about the text content of anything on a line after a hash because - ;; text decoding happens at a lower level. So here we rewrite the - ;; CaseFolding.txt file to exclude the UTF-8 sequence corresponding - ;; to the eszet character. + ;; text decoding happens at a lower level. So here we rewrite data + ;; files to exclude the UTF-8 sequences corresponding to those + ;; characters (and error if we see any other UTF-8 sequence). (let ((in (gensym "IN")) (out (gensym "OUT"))) `(let ((filename (format nil "~A.txt" ,name))) @@ -43,11 +46,21 @@ (setf (gethash (format nil "output/~A.txt" ,name) *ucd-outputs*) 'made) (do ((inbyte (read-byte ,in nil nil) (read-byte ,in nil nil)) (eszet (map '(vector (unsigned-byte 8)) 'char-code "<eszet>")) - (eszet-count 0)) + (eszet-count 0) + (copyright (map '(vector (unsigned-byte 8)) 'char-code "<copyright>")) + (copyright-count 0) + (registered (map '(vector (unsigned-byte 8)) 'char-code "<registered>")) + (registered-count 0)) ((null inbyte) (unless (= eszet-count ,eszets) (error "Unexpected number of eszets in ~A: ~D (expected ~D)" - filename eszet-count ,eszets))) + filename eszet-count ,eszets)) + (unless (= copyright-count ,copyrights) + (error "Unexpected number of copyright symbols in ~A: ~D (expected ~D)" + filename copyright-count ,copyrights)) + (unless (= registered-count ,registereds) + (error "Unexpected number of registered symbols in ~A: ~D (expected ~D)" + filename registered-count ,registereds))) (cond ((= inbyte #xc3) (let ((second (read-byte ,in nil nil))) @@ -57,6 +70,13 @@ ((= second #x9f) (incf eszet-count) (write-sequence eszet ,out)) (t (error "Unexpected continuation after #xc3 in ~A: #x~X" filename second))))) + ((= inbyte #xc2) + (let ((second (read-byte ,in nil nil))) + (cond + ((null second) + (error "No continuation after #xc2 in ~A" filename)) + ((= second #xa9) (incf copyright-count) (write-sequence copyright ,out)) + ((= second #xae) (incf registered-count) (write-sequence registered ,out))))) ((>= inbyte #x7f) (error "Unexpected octet in ~A: #x~X" filename inbyte)) (t (write-byte inbyte ,out)))))) @@ -148,7 +168,7 @@ :adjustable t)) ; 10000 is not a significant number (defparameter *decomposition-corrections* - (with-input-txt-file (s "NormalizationCorrections") + (with-input-utf8-file (s "NormalizationCorrections") (loop with result = nil for line = (read-line s nil nil) while line do (when (position #\; line) @@ -163,7 +183,7 @@ (defparameter *compositions* (make-hash-table :test #'equal)) (defparameter *composition-exclusions* - (with-input-txt-file (s "CompositionExclusions") + (with-input-utf8-file (s "CompositionExclusions") (loop with result = nil for line = (read-line s nil nil) while line when (and (> (length line) 0) (char/= (char line 0) #\#)) @@ -175,7 +195,7 @@ (defparameter *different-casefolds* nil) (defparameter *case-mapping* - (with-input-txt-file (s "SpecialCasing") + (with-input-utf8-file (s "SpecialCasing") (loop with hash = (make-hash-table) for line = (read-line s nil nil) while line unless (or (not (position #\# line)) (= 0 (position #\# line))) @@ -211,7 +231,7 @@ Length should be adjusted when the standard changes.") (defparameter *line-break-classes* (init-indices '*line-break-classes*)) (defparameter *east-asian-width-table* - (with-input-txt-file (s "EastAsianWidth") + (with-input-utf8-file (s "EastAsianWidth") (loop with hash = (make-hash-table) for line = (read-line s nil nil) while line unless (or (not (position #\# line)) (= 0 (position #\# line))) @@ -226,7 +246,7 @@ Length should be adjusted when the standard changes.") "Table of East Asian Widths. Used in the creation of misc entries.") (defparameter *script-table* - (with-input-txt-file (s "Scripts") + (with-input-utf8-file (s "Scripts") (loop with hash = (make-hash-table) for line = (read-line s nil nil) while line unless (or (not (position #\# line)) (= 0 (position #\# line))) @@ -241,7 +261,7 @@ Length should be adjusted when the standard changes.") "Table of scripts. Used in the creation of misc entries.") (defparameter *line-break-class-table* - (with-input-txt-file (s "LineBreak") + (with-input-utf8-file (s "LineBreak") (loop with hash = (make-hash-table) for line = (read-line s nil nil) while line unless (or (not (position #\# line)) (= 0 (position #\# line))) @@ -261,7 +281,7 @@ Length should be adjusted when the standard changes.") "Table of line break classes. Used in the creation of misc entries.") (defparameter *age-table* - (with-input-txt-file (s "DerivedAge") + (with-input-utf8-file (s "DerivedAge") (loop with hash = (make-hash-table) for line = (read-line s nil nil) while line unless (or (not (position #\# line)) (= 0 (position #\# line))) @@ -427,7 +447,7 @@ Length should be adjusted when the standard changes.") (ncount (* vcount tcount)) (table (make-hash-table))) (declare (ignore lcount)) - (with-input-txt-file (*standard-input* "Jamo") + (with-input-utf8-file (*standard-input* "Jamo") (loop for line = (read-line nil nil) while line if (position #\; line) @@ -678,7 +698,7 @@ Length should be adjusted when the standard changes.") (push result **proplist-properties**)))) (defun slurp-proplist () - (with-input-txt-file (s "PropList") + (with-input-utf8-file (s "PropList") (parse-property s) ;; Initial comments (parse-property s :white-space) (parse-property s :bidi-control) @@ -708,12 +728,13 @@ Length should be adjusted when the standard changes.") (parse-property s :logical-order-exception) (parse-property s :other-id-start) (parse-property s :other-id-continue) - (parse-property s :sterm) + (parse-property s :sentence-terminal) (parse-property s :variation-selector) (parse-property s :pattern-white-space) - (parse-property s :pattern-syntax)) + (parse-property s :pattern-syntax) + (parse-property s :prepended-concatenation-mark)) - (with-input-txt-file (s "DerivedNormalizationProps") + (with-input-utf8-file (s "DerivedNormalizationProps") (parse-property s) ;; Initial comments (parse-property s) ;; FC_NFKC_Closure (parse-property s) ;; FC_NFKC_Closure @@ -796,7 +817,7 @@ Length should be adjusted when the standard changes.") "List of confusable codepoint sets") (defparameter *bidi-mirroring-glyphs* - (with-input-txt-file (s "BidiMirroring") + (with-input-utf8-file (s "BidiMirroring") (loop for line = (read-line s nil nil) while line when (and (plusp (length line)) (char/= (char line 0) #\#)) @@ -808,7 +829,7 @@ Length should be adjusted when the standard changes.") (defparameter *blocks* (let (ranges names) - (with-input-txt-file (stream "Blocks") + (with-input-utf8-file (stream "Blocks") (loop (let ((line (read-line stream nil nil))) (cond ((not line) (return)) From f88989694200a5192fb68047d43d0500b2165f7b Mon Sep 17 00:00:00 2001 From: Robert Schiele <rschiele@gmail.com> Date: Fri, 24 Jun 2022 16:50:54 +0200 Subject: [PATCH 3617/4023] take contrib blocklist into account for doc generation If some contrib module is blocked for building also block it in documentation generation since this will fail otherwise. Additionally this fixes a shift operation that is needed unconditionally when parsing the script parameters since otherwise the first parameter is used for the second parameter as well if it turns out to be empty. --- doc/manual/generate-texinfo.lisp | 9 +++++---- doc/manual/make-tempfiles.sh | 8 +++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/doc/manual/generate-texinfo.lisp b/doc/manual/generate-texinfo.lisp index 83451754d9..44e5edca80 100644 --- a/doc/manual/generate-texinfo.lisp +++ b/doc/manual/generate-texinfo.lisp @@ -32,8 +32,9 @@ finally (return result))) (defun generate-docstrings-texinfo (runtime - &key (docstring-directory "docstrings/")) - (let* ((contribs (sort (documented-contribs) #'string< :key #'car)) + &key (docstring-directory "docstrings/") + (blocklist '())) + (let* ((contribs (sort (documented-contribs :exclude (append '("asdf") blocklist)) #'string< :key #'car)) (packages (sort (append *documented-packages* (map 'list #'cdr contribs)) #'string<))) @@ -92,10 +93,10 @@ ;;;; Entry point -(destructuring-bind (program runtime docstring-directory) *posix-argv* +(destructuring-bind (program runtime docstring-directory blocklist) *posix-argv* (declare (ignore program)) (generate-docstrings-texinfo - runtime :docstring-directory docstring-directory) + runtime :docstring-directory docstring-directory :blocklist (uiop:split-string blocklist)) (expand-variables) (generate-external-format-texinfo)) diff --git a/doc/manual/make-tempfiles.sh b/doc/manual/make-tempfiles.sh index bf36ab1ec1..faf1bbbf99 100644 --- a/doc/manual/make-tempfiles.sh +++ b/doc/manual/make-tempfiles.sh @@ -26,18 +26,20 @@ if [ -z "$1" ] ; then else SBCLRUNTIME="`command -v sbcl`" fi + . $SBCL_TOP/output/build-config else SBCLRUNTIME="$1" - shift + SBCL_CONTRIB_BLOCKLIST= fi +shift if [ -z "$1" ] ; then DOCSTRINGDIR="${DOCSTRINGDIR:-docstrings/}" else DOCSTRINGDIR="$1" - shift fi +shift ${SBCLRUNTIME} \ --noinform --no-sysinit --no-userinit --noprint --disable-debugger \ - --script generate-texinfo.lisp "${SBCLRUNTIME}" "${DOCSTRINGDIR}" + --script generate-texinfo.lisp "${SBCLRUNTIME}" "${DOCSTRINGDIR}" "${SBCL_CONTRIB_BLOCKLIST}" From 521a206b73cde5b4beb410aeb9d419378c707a75 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 4 Jul 2022 01:58:06 +0300 Subject: [PATCH 3618/4023] Use round-float when truncating floats. Instead of coercing integers to floats. --- src/code/numbers.lisp | 12 ++++++++++-- src/compiler/float-tran.lisp | 17 +++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index 96746b08d2..1bbefacaf0 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -316,10 +316,18 @@ (declare (explicit-check)) (macrolet ((truncate-float (rtype) `(let* ((float-div (coerce divisor ',rtype)) - (res (%unary-truncate (/ number float-div)))) + (divided (/ number float-div)) + (res (%unary-truncate divided))) (values res (- number - (* (coerce res ',rtype) float-div))))) + (* #-round-float + (coerce res ',rtype) + #+round-float + (,(ecase rtype + (double-float 'round-double) + (single-float 'round-single)) + divided :truncate) + float-div))))) (single-digit-bignum-p (x) #+(or x86-64 x86 ppc64) `(or (typep ,x 'word) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 8efc3d6428..11a469ba51 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1620,10 +1620,19 @@ (values res x))) (if compute-all `(let* ((f (,',coerce y)) - (res (,',unary (/ x f)))) - (values res (- x (* f (locally - (declare (flushable ,',coerce)) - (,',coerce res)))))) + (div (/ x f)) + (res (,',unary div))) + (values res + (- x (* f + #+round-float + (,',(ecase type + (double-float 'round-double) + (single-float 'round-single)) + div :truncate) + #-round-float + (locally + (declare (flushable ,',coerce)) + (,',coerce res)))))) `(let* ((f (,',coerce y)) (res (,',unary (/ x f)))) ;; Dummy secondary value! From 5c05a76e96ea3d1f42c465726b6660f4401735e6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 4 Jul 2022 02:31:20 +0300 Subject: [PATCH 3619/4023] x86-64: correctly detect sse4 for #+round-float. --- src/cold/shared.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 4c1f919d45..de04df344b 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -304,7 +304,8 @@ ;; Just print something and go on with life. (setq sb-xc:*features* (remove :int4-breakpoints sb-xc:*features*)) (warn "Removed :INT4-BREAKPOINTS from target features")) - (when (target-featurep '(:or :arm64 :sse4)) + (when (or (target-featurep :arm64) + (member :sse4 backend-subfeatures)) (push :round-float sb-xc:*features*)) (when (target-featurep '(:and :arm64 :darwin)) (push :arm-v8.1 backend-subfeatures)) From 86f1e37f8859ba38ad646b6dccf137975ea8e5b1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 4 Jul 2022 02:33:41 +0300 Subject: [PATCH 3620/4023] arm64: peephole fmul + fsub -> fmsub. --- src/compiler/arm64/insts.lisp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 1c263db3ed..716cc8fdd3 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -3553,3 +3553,15 @@ (add-stmt-labels next (stmt-labels stmt)) (delete-stmt stmt) next)))) + +(defpattern "fmul + fsub -> fmsub" ((fmul) (fsub)) (stmt next) + (destructuring-bind (dst1 srcn1 srcm1) (stmt-operands stmt) + (destructuring-bind (dst2 srcn2 srcm2) (stmt-operands next) + (when (and (location= dst1 srcm2) + (not (location= srcn2 srcm2)) + (stmt-delete-safe-p dst1 dst2 '(-))) + (setf (stmt-mnemonic next) 'fmsub + (stmt-operands next) (list dst2 srcn1 srcm1 srcn2)) + (add-stmt-labels next (stmt-labels stmt)) + (delete-stmt stmt) + next)))) From 2946d3657a58b788cd084ed6af34a2f98d0e9dba Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 4 Jul 2022 15:22:26 +0300 Subject: [PATCH 3621/4023] Construct a dummy value when transforming unary-truncate. Can't simply produce a single value. Reported by Eric Marsden. --- src/compiler/float-tran.lisp | 63 ++++++++++++++++++++++++++++++++++-- tests/arith.pure.lisp | 12 +++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 11a469ba51..4c4a1bb205 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1570,11 +1570,70 @@ (deftransform %unary-truncate ((x) (double-float)) `(%unary-truncate/double-float x)) +(defun value-within-numeric-type (type) + (labels ((try (x) + (when (ctypep x type) + (return-from value-within-numeric-type x))) + (next-float (float) + (multiple-value-bind (frac exp sign) + (integer-decode-float float) + (* (scale-float (float (1+ frac) float) exp) + sign))) + (prev-float (float) + (multiple-value-bind (frac exp sign) + (integer-decode-float float) + (* (scale-float (float (1- frac) float) exp) + sign))) + (next (x) + (typecase x + (integer + (1+ x)) + (float + (next-float x)) + (t + 0))) + (prev (x) + (typecase x + (integer + (1- x)) + (float + (prev-float x)) + (t + 0))) + (ratio-between (low high) + (+ low (/ (- high low) 2))) + (numeric (x) + (when (numeric-type-p x) + (let ((lo (numeric-type-low x)) + (hi (numeric-type-high x))) + (when (numberp lo) + (try lo)) + (when (numberp hi) + (try hi)) + (when (consp lo) + (try (next (car lo)))) + (when (consp hi) + (try (prev (car hi)))) + (when (and (typep lo '(cons rational)) + (typep hi '(cons rational))) + (try (ratio-between (car lo) (car hi)))) + (when (csubtypep x (specifier-type 'rational)) + (try 0)) + (when (csubtypep x (specifier-type 'double-float)) + (try $0d0)) + (when (csubtypep x (specifier-type 'single-float)) + (try $0f0)))))) + (typecase type + (numeric-type (numeric type)) + (union-type (mapc #'numeric (union-type-types type)))) + (error "Couldn't come up with a value for ~s" type))) + (deftransform unary-truncate ((x) * * :result result :node node) (unless (lvar-single-value-p result) (give-up-ir1-transform)) - (derive-node-type node (single-value-type (node-derived-type node)) :from-scratch t) - `(%unary-truncate x)) + (let ((rem-type (second (values-type-required (node-derived-type node))))) + `(values (%unary-truncate x) + ,(value-within-numeric-type rem-type)))) (macrolet ((def (type) `(deftransform unary-truncate ((number) (,type)) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index e60d4302f4..426cc495d2 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -1078,3 +1078,15 @@ (truncate (expt (complex a 0) 0)) 1) ((1) 1))) + +(with-test (:name :unary-truncate-discard-second-value.2) + (checked-compile-and-assert + (:allow-style-warnings t) + `(lambda (a b) + (boole boole-nand + (dpb (* b (unwind-protect 0 b)) (byte 31 28) a) + (ignore-errors + (truncate + (eval + (values 1 2)))))) + ((1 2) -2))) From 551fdde71a70783332d01ea8e0d69dc8fc93ff49 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 4 Jul 2022 15:53:44 +0300 Subject: [PATCH 3622/4023] Fix xc. No integer-decode-float in the cross compiler. --- src/compiler/float-tran.lisp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 4c4a1bb205..7e596770ed 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1574,11 +1574,13 @@ (labels ((try (x) (when (ctypep x type) (return-from value-within-numeric-type x))) + #-sb-xc-host (next-float (float) (multiple-value-bind (frac exp sign) (integer-decode-float float) (* (scale-float (float (1+ frac) float) exp) sign))) + #-sb-xc-host (prev-float (float) (multiple-value-bind (frac exp sign) (integer-decode-float float) @@ -1588,6 +1590,7 @@ (typecase x (integer (1+ x)) + #-sb-xc-host (float (next-float x)) (t @@ -1596,6 +1599,7 @@ (typecase x (integer (1- x)) + #-sb-xc-host (float (prev-float x)) (t From 71d75f09a6e6e245c6d57319363909f9b70c826a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 4 Jul 2022 17:25:16 +0300 Subject: [PATCH 3623/4023] Check for :sse4 only on x86-64. --- src/cold/shared.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index de04df344b..0299e94214 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -305,7 +305,8 @@ (setq sb-xc:*features* (remove :int4-breakpoints sb-xc:*features*)) (warn "Removed :INT4-BREAKPOINTS from target features")) (when (or (target-featurep :arm64) - (member :sse4 backend-subfeatures)) + (and (target-featurep :x86-64) + (member :sse4 backend-subfeatures))) (push :round-float sb-xc:*features*)) (when (target-featurep '(:and :arm64 :darwin)) (push :arm-v8.1 backend-subfeatures)) From abbbd5c49cbf4b77f710ba909611b0cb11572f0f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 4 Jul 2022 20:13:08 -0400 Subject: [PATCH 3624/4023] Update math journal --- float-math.lisp-expr | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 24b4ab41cf..b4f39717bf 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -520,6 +520,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) @@ -568,6 +569,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x538637BD)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) +(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5F000000)) T) @@ -596,7 +598,9 @@ (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) +(< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) @@ -718,6 +722,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) @@ -764,6 +769,8 @@ (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) T) @@ -833,8 +840,10 @@ (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) @@ -1033,6 +1042,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) @@ -1201,6 +1211,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5E000000) #x0) NIL) @@ -1327,6 +1338,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) @@ -1545,6 +1557,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -2005,7 +2018,10 @@ (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) NIL) @@ -2149,8 +2165,10 @@ (= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) +(= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) T) @@ -2540,6 +2558,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x-368BDC10) #.(MAKE-SINGLE-FLOAT #x497423F0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) @@ -2557,6 +2576,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22000000) #.(MAKE-SINGLE-FLOAT #x-22000000)) NIL) @@ -2657,6 +2677,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x447A0000) #.(MAKE-SINGLE-FLOAT #x447A0000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x49742400) #.(MAKE-SINGLE-FLOAT #x49742400)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) @@ -2680,6 +2701,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) T) +(> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) @@ -2792,6 +2814,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) NIL) @@ -2968,6 +2991,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000)) NIL) @@ -2977,6 +3001,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) NIL) @@ -3115,6 +3140,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) NIL) @@ -3166,6 +3192,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-3136F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-22000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21000000)) T) @@ -3339,6 +3366,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) NIL) @@ -3397,6 +3425,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) T) From 2833a1ea0ae7689290d114e66396f8f6d20b8443 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 4 Jul 2022 21:08:21 -0400 Subject: [PATCH 3625/4023] Standardize on :ABSOLUTE fixup being N-WORD-BYTES Depending on endianness this fixes a bug in the simple-fun header for xfuncallable-instance-tramp on ppc64 which is currently unbuildable for unrelated reasons. --- src/compiler/assem.lisp | 5 ++--- src/compiler/ppc/vm.lisp | 2 +- src/compiler/ppc64/insts.lisp | 6 +++--- src/compiler/ppc64/vm.lisp | 2 +- src/compiler/x86-64/insts.lisp | 28 ++++++++++++++-------------- src/compiler/x86-64/parms.lisp | 3 +-- 6 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index 76e371a1c6..95b733a43b 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -1963,13 +1963,12 @@ (cond ((label-p val) ;; note a fixup prior to writing the backpatch so that the fixup's ;; position is the location counter at the patch point - ;; (i.e. prior to skipping 8 bytes) + ;; (i.e. prior to skipping N-WORD-BYTES bytes) ;; This fixup is *not* recorded in code->fixups. Instead, trans_code() ;; will fixup a counted initial subsequence of unboxed words. ;; Q: why are fixup notes a "compiler" abstractions? ;; They seem pretty assembler-related to me. - (sb-c:note-fixup segment (or #+64-bit :absolute64 :absolute) - (sb-c:make-fixup nil :code-object 0)) + (sb-c:note-fixup segment :absolute (sb-c:make-fixup nil :code-object 0)) (emit-back-patch segment sb-vm:n-word-bytes diff --git a/src/compiler/ppc/vm.lisp b/src/compiler/ppc/vm.lisp index af6cc1ea0e..966c6df227 100644 --- a/src/compiler/ppc/vm.lisp +++ b/src/compiler/ppc/vm.lisp @@ -11,7 +11,7 @@ (in-package "SB-VM") -(defconstant-eqx +fixup-kinds+ #(:absolute :absolute64 :layout-id :b :ba :ha :l) #'equalp) +(defconstant-eqx +fixup-kinds+ #(:absolute :layout-id :b :ba :ha :l) #'equalp) ;;; NUMBER-STACK-DISPLACEMENT ;;; diff --git a/src/compiler/ppc64/insts.lisp b/src/compiler/ppc64/insts.lisp index 8441a65589..4494f2d5cc 100644 --- a/src/compiler/ppc64/insts.lisp +++ b/src/compiler/ppc64/insts.lisp @@ -2232,6 +2232,7 @@ (:delay 0) (:emitter (etypecase word + #-64-bit (fixup (note-fixup segment :absolute word) (emit-word segment 0)) @@ -2243,6 +2244,7 @@ (:delay 0) (:emitter (etypecase dword + #+64-bit (fixup (note-fixup segment :absolute dword) (emit-dword segment 0)) @@ -2401,9 +2403,7 @@ (ecase kind (:absolute ;; There is an implicit addend currently stored in the fixup location. - (incf (sap-ref-32 sap offset) value)) - (:absolute64 - (incf (sap-ref-64 sap offset) value)) + (incf (sap-ref-word sap offset) value)) (:layout-id (aver (zerop (sap-ref-32 sap offset))) (setf (signed-sap-ref-32 sap offset) (the layout-id value))) diff --git a/src/compiler/ppc64/vm.lisp b/src/compiler/ppc64/vm.lisp index f6f207a5ed..812b020087 100644 --- a/src/compiler/ppc64/vm.lisp +++ b/src/compiler/ppc64/vm.lisp @@ -11,7 +11,7 @@ (in-package "SB-VM") -(defconstant-eqx +fixup-kinds+ #(:absolute :absolute64 :layout-id :b :ba :ha :l :rldic-m) +(defconstant-eqx +fixup-kinds+ #(:absolute :layout-id :b :ba :ha :l :rldic-m) #'equalp) ;;; NUMBER-STACK-DISPLACEMENT diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index 5d596f767d..ce77ec4f6c 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -863,14 +863,14 @@ ;;;; fixup emitters (defun emit-absolute-fixup (segment fixup &optional quad-p) - (note-fixup segment (if quad-p :absolute64 :absolute) fixup) + (note-fixup segment (if quad-p :absolute :abs32) fixup) (let ((offset (fixup-offset fixup))) (if quad-p (emit-qword segment offset) (emit-signed-dword segment offset)))) (defun emit-relative-fixup (segment fixup) - (note-fixup segment :relative fixup) + (note-fixup segment :rel32 fixup) (emit-signed-dword segment (fixup-offset fixup))) @@ -3334,15 +3334,15 @@ ;; All x86-64 fixup locations contain an implicit addend at the location ;; to be fixed up. The addend is always zero for certain <KIND,FLAVOR> pairs, ;; but we don't need to assert that. - (incf value (if (eq kind :absolute64) + (incf value (if (eq kind :absolute) (signed-sap-ref-64 sap offset) (signed-sap-ref-32 sap offset))) (ecase kind - (:absolute ; 32 bits. most are unsigned, except :layout-id which is signed + (:abs32 ; 32 bits. most are unsigned, except :layout-id which is signed (if (eq flavor :layout-id) (setf (signed-sap-ref-32 sap offset) value) (setf (sap-ref-32 sap offset) value))) - (:relative + (:rel32 ;; Replace word with the difference between VALUE and current pc. ;; JMP/CALL are relative to the next instruction, ;; so add 4 bytes for the size of the displacement itself. @@ -3352,24 +3352,24 @@ (unless (immobile-space-obj-p code) (error "Can't compute fixup relative to movable object ~S" code)) (setf (signed-sap-ref-32 sap offset) (- value (+ (sap-int sap) offset 4)))) - (:absolute64 + (:absolute ;; These are used for jump tables and are not recorded in %code-fixups. ;; GC knows to adjust the values if code is moved. (setf (sap-ref-64 sap offset) value)))) nil) (defun sb-c::pack-retained-fixups (fixup-notes) - (let (abs-fixups rel-fixups imm-fixups) + (let (abs32-fixups rel32-fixups imm-fixups) ;; An absolute fixup is stored in the code header's %FIXUPS slot if it ;; references an immobile-space (but not static-space) object. ;; Note that: - ;; (1) Call fixups occur in both :RELATIVE and :ABSOLUTE kinds. - ;; We can ignore the :RELATIVE kind, except for foreign call, + ;; (1) Call fixups occur in both :REL32 and :ABS32 kinds. + ;; We can ignore the :REL32 kind, except for foreign call, ;; as those point to the linkage table which has an absolute address ;; and therefore might change in displacement from the call site ;; if the immobile code space is relocated on startup. ;; (2) :STATIC-CALL fixups point to immobile space, not static space. - (dolist (note fixup-notes (sb-c:pack-code-fixup-locs abs-fixups rel-fixups imm-fixups)) + (dolist (note fixup-notes (sb-c:pack-code-fixup-locs abs32-fixups rel32-fixups imm-fixups)) (let* ((fixup (fixup-note-fixup note)) (offset (fixup-note-position note)) (kind (fixup-note-kind note)) @@ -3378,14 +3378,14 @@ ((and (memq flavor '(:named-call :layout :immobile-symbol :symbol-value ; -> fixedobj subspace :assembly-routine :assembly-routine* :static-call)) ; -> varyobj subspace - (eq kind :absolute)) - #+immobile-space (push offset abs-fixups)) - ((and (eq flavor :foreign) (eq kind :relative)) + (eq kind :abs32)) + #+immobile-space (push offset abs32-fixups)) + ((and (eq flavor :foreign) (eq kind :rel32)) ;; linkage-table calls using the "CALL rel32" format need to be saved, ;; because the linkage table resides at a fixed address. ;; Space defragmentation can handle the fixup automatically, ;; but core relocation can't - it can't find all the call sites. - #+immobile-space (push offset rel-fixups))))))) + #+immobile-space (push offset rel32-fixups))))))) ;;; Coverage support diff --git a/src/compiler/x86-64/parms.lisp b/src/compiler/x86-64/parms.lisp index e5f7faa779..2c32359e8f 100644 --- a/src/compiler/x86-64/parms.lisp +++ b/src/compiler/x86-64/parms.lisp @@ -17,8 +17,7 @@ (defconstant sb-assem:+inst-alignment-bytes+ 1) (defconstant +backend-fasl-file-implementation+ :x86-64) -(defconstant-eqx +fixup-kinds+ #(:absolute :relative :absolute64) - #'equalp) +(defconstant-eqx +fixup-kinds+ #(:abs32 :rel32 :absolute) #'equalp) ;;; This size is supposed to indicate something about the actual granularity ;;; at which you can map memory. We just hardwire it, but that may or may not From cba0f3383df2ff1a1ae8b2f0301399d25b3f174c Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 5 Jul 2022 16:31:46 +0300 Subject: [PATCH 3626/4023] Fix describe_internal_error on ppc64le. --- src/runtime/interr.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/runtime/interr.c b/src/runtime/interr.c index 521a8420ad..03d41eda44 100644 --- a/src/runtime/interr.c +++ b/src/runtime/interr.c @@ -330,6 +330,8 @@ describe_internal_error(os_context_t *context) uint32_t trap_instruction = *(uint32_t *)ptr; unsigned char trap = trap_instruction >> 5 & 0xFF; ptr += 4; +#elif defined(LISP_FEATURE_PPC64) && defined(LISP_FEATURE_LITTLE_ENDIAN) + unsigned char trap = *(ptr-4); #else unsigned char trap = *(ptr-1); #endif From 9d1c91edc2462177d4070a4202480e12ae5ae919 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 5 Jul 2022 16:32:41 +0300 Subject: [PATCH 3627/4023] Workaround a bootstrapping problem on ppc64, riscv. They can't handle parsing (member 0d0) types at cold-init time due to some undefined functions. --- src/compiler/fndb.lisp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index d0b42d1fa7..e615c1fd57 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -349,8 +349,12 @@ (defknown unary-truncate-single-float-to-bignum (single-float) (values bignum (eql $0f0)) (foldable movable flushable)) -(defknown unary-truncate-double-float-to-bignum (double-float) (values bignum #+64-bit (eql $0d0) - #-64-bit double-float) +(defknown unary-truncate-double-float-to-bignum (double-float) + (values bignum (and + #+(and 64-bit + (not (or riscv ppc64))) ;; they can't survive cold-init + (eql $0d0) + double-float)) (foldable movable flushable)) (defknown %multiply-high (word word) word From 02c44c4076cbcd1490daeba314df3e985ce1841c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 5 Jul 2022 12:50:44 -0400 Subject: [PATCH 3628/4023] Simplify & fix a bug in immobile symbol allocator The C fallback didn't adjust the free_index if it had just consumed the highest addressable object on a page. That helped my first attempt at the allocation vop which wanted the free_index to always be a usable object. But it didn't work, so the vop checks for overrun prior to using the index in any case. That being so, free_index can and must be bumped up, otherwise update_immobile_nursery_bits() might not see a newly allocated object. To fix it, get rid of two slots from the page struct, and always reflect the correct generation mask right away. --- src/compiler/x86-64/alloc.lisp | 15 ++++++--------- src/runtime/gencgc-internal.h | 5 +---- src/runtime/immobile-space.c | 22 ++++------------------ src/runtime/verify.inc | 10 ++++++++++ 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index ef63327126..e09bf49266 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -1023,17 +1023,16 @@ (inst mov :dword rax (ea 4 rax)) ; rax := fixedobj_page_hint[1] (sizeclass=SYMBOL) (inst test :dword rax rax) (inst jmp :z FAIL) ; fail if hint page is 0 - (inst lea rcx (ea rax rax 2)) ; rcx := rax * 3 - (inst lea rbx (ea rbx rcx 4)) ; rbx := &fixedobj_pages[hint].free_index + (inst lea rbx (ea rbx rax 8)) ; rbx := &fixedobj_pages[hint].free_index ;; compute fixedobj_page_address(hint) into RAX (inst mov rcx (ea (make-fixup "FIXEDOBJ_SPACE_START" :foreign-dataref))) (inst shl rax (integer-length (1- immobile-card-bytes))) (inst add rax (ea rcx)) ;; load the page's free pointer (inst mov :dword rcx (ea rbx)) ; rcx := fixedobj_pages[hint].free_index - ;; fail if set_page_full() was invoked on the page - (inst cmp :dword rcx immobile-card-bytes) - (inst jmp :ae FAIL) + ;; fail if allocation would overrun the page + (inst cmp :dword rcx (- immobile-card-bytes (* symbol-size n-word-bytes))) + (inst jmp :a FAIL) ;; compute address of the allegedly free memory block into RESULT (inst lea result (ea rcx rax)) ; free_index + page_base ;; read the potential symbol header @@ -1046,11 +1045,9 @@ (inst jmp :ne FAIL) ; already taken ;; compute new free_index = spacing + old header + free_index (inst lea :dword rax (ea (* symbol-size n-word-bytes) rax rcx)) - (inst cmp :dword rax ; don't store if it's not a valid object index - (- immobile-card-bytes (rem immobile-card-bytes (* symbol-size n-word-bytes)))) - (inst jmp :ae NO-WRITEBACK) (inst mov :dword (ea rbx) rax) ; store new free_index - NO-WRITEBACK + ;; set the low bit of the 'gens' field + (inst or :lock :byte (ea 3 rbx) 1) (inst or :byte result other-pointer-lowtag) ; make_lispobj() (inst jmp OUT) FAIL diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 4f2596d9fb..ed7e09023d 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -332,7 +332,7 @@ static boolean __attribute__((unused)) new_space_p(lispobj obj) } #ifdef LISP_FEATURE_IMMOBILE_SPACE -struct fixedobj_page { // 12 bytes per page +struct fixedobj_page { // 8 bytes per page unsigned int free_index; // index is in bytes. 4 bytes union immobile_page_attr { int packed; @@ -344,9 +344,6 @@ struct fixedobj_page { // 12 bytes per page unsigned char gens_; // a bitmap } parts; } attr; - unsigned short int prior_gc_free_word_index; // index is in words. 2 bytes - /* page index of next page with same attributes */ - short int page_link; // 2 bytes }; extern struct fixedobj_page *fixedobj_pages; #define fixedobj_page_obj_align(i) (fixedobj_pages[i].attr.parts.obj_align<<WORD_SHIFT) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 0703cfeb6e..800ba19534 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -303,7 +303,6 @@ alloc_immobile_fixedobj(int size_class, int spacing_words, uword_t header) char *page_data = fixedobj_page_address(page); char *limit = page_data + IMMOBILE_CARD_BYTES - spacing_in_bytes; char *obj_ptr = page_data + fixedobj_pages[page].free_index; - gc_assert(obj_ptr <= limit || (char*)obj_ptr == (page_data + IMMOBILE_CARD_BYTES)); while (obj_ptr <= limit) { word = *(lispobj*)obj_ptr; char *next_obj_ptr = obj_ptr + spacing_in_bytes; @@ -312,10 +311,11 @@ alloc_immobile_fixedobj(int size_class, int spacing_words, uword_t header) word, header)) { // The value formerly in the header word was the offset to // the next hole. Use it to update the freelist pointer. - // Just slam it in, unless too large to use for the next object. + // Just slam it in int new_free_index = next_obj_ptr + word - page_data; - if (new_free_index + spacing_in_bytes <= (int)IMMOBILE_CARD_BYTES) - fixedobj_pages[page].free_index = new_free_index; + fixedobj_pages[page].free_index = new_free_index; + // Indicate in the generation mask that there is a generation0 object + __sync_fetch_and_or(&fixedobj_pages[page].attr.parts.gens_, 1); return compute_lispobj((lispobj*)obj_ptr); } // If some other thread updated the free_index @@ -360,9 +360,6 @@ Threads A, and B, and C each want to claim index 6. void update_immobile_nursery_bits() { - low_page_index_t max_used_fixedobj_page = calc_max_used_fixedobj_page(); - low_page_index_t page; - if (ENABLE_PAGE_PROTECTION) { // Unprotect the in-use ranges. Any page could be written during scavenge os_protect((os_vm_address_t)FIXEDOBJ_SPACE_START, @@ -370,15 +367,6 @@ void update_immobile_nursery_bits() OS_VM_PROT_ALL); } - for (page=0; page <= max_used_fixedobj_page ; ++page) { - // any page whose free index changed contains nursery objects - if (fixedobj_pages[page].free_index >> WORD_SHIFT != - fixedobj_pages[page].prior_gc_free_word_index) - fixedobj_pages[page].gens |= 1; -#ifdef VERIFY_PAGE_GENS - check_fixedobj_page(page, 0xff, 0xff); -#endif - } #ifdef VERIFY_PAGE_GENS check_varyobj_pages(); #endif @@ -997,8 +985,6 @@ sweep_fixedobj_pages(int raise) } while (NEXT_FIXEDOBJ(obj, obj_spacing) <= limit); if ( hole ) // terminate the chain of holes *hole = (lispobj)((char*)obj - ((char*)hole + obj_spacing)); - fixedobj_pages[page].prior_gc_free_word_index = - fixedobj_pages[page].free_index >> WORD_SHIFT; COMPUTE_NEW_MASK(mask, fixedobj_pages[page].gens); if ( mask ) { diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index f3b01c0f4e..c6886496a1 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -502,7 +502,17 @@ void gc_show_pte(lispobj obj) static int hexdump_counter; __attribute__((unused)) static void dump_immobile(lispobj* where, lispobj* end, FILE*f) { + uword_t prev_page = 0; while (where < end) { + if (ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES) != prev_page) { + low_page_index_t page = find_fixedobj_page_index(where); + fprintf(f, " page @ %p: gens=%x free=%x%s\n", + (void*)ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES), + fixedobj_pages[page].attr.parts.gens_, + fixedobj_pages[page].free_index, + (fixedobj_pages[page].attr.parts.flags & 0x80)?" WP":""); + prev_page = ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES); + } fprintf(f, "%"OBJ_FMTX": %"OBJ_FMTX"\n", (uword_t)where, *where); where += object_size(where); } From 4a488e49c6f74bb193ccc6b1e74387d454e74b22 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 5 Jul 2022 21:12:59 +0300 Subject: [PATCH 3629/4023] Restore -immobile-space builds. --- src/runtime/verify.inc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index c6886496a1..ad36fa43de 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -500,6 +500,8 @@ void gc_show_pte(lispobj obj) #include <stdio.h> static int hexdump_counter; + +#ifdef LISP_FEATURE_IMMOBILE_SPACE __attribute__((unused)) static void dump_immobile(lispobj* where, lispobj* end, FILE*f) { uword_t prev_page = 0; @@ -517,6 +519,8 @@ __attribute__((unused)) static void dump_immobile(lispobj* where, lispobj* end, where += object_size(where); } } +#endif + static int dump_completely_p(lispobj* obj, struct verify_state* state) { int i; From cb1fca7373e41577f673fe7f49e771212284e348 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 5 Jul 2022 03:17:38 +0300 Subject: [PATCH 3630/4023] Add support for unboxed entry points. Passing floats in float registers, words in non-descriptor registers. Implemented on arm64 so far. --- src/compiler/arm64/call.lisp | 22 +++-- src/compiler/arm64/vm.lisp | 5 +- src/compiler/fun-info.lisp | 6 +- src/compiler/generic/utils.lisp | 26 +++++ src/compiler/ir1tran-lambda.lisp | 20 +++- src/compiler/ir2tran.lisp | 164 ++++++++++++++++++++----------- src/compiler/knownfun.lisp | 5 + src/compiler/locall.lisp | 12 ++- src/compiler/meta-vmdef.lisp | 4 +- src/compiler/represent.lisp | 31 +++--- src/compiler/vop.lisp | 2 +- 11 files changed, 204 insertions(+), 93 deletions(-) diff --git a/src/compiler/arm64/call.lisp b/src/compiler/arm64/call.lisp index dc6bca2100..9802f6cc34 100644 --- a/src/compiler/arm64/call.lisp +++ b/src/compiler/arm64/call.lisp @@ -861,7 +861,7 @@ ;;; In tail call with fixed arguments, the passing locations are passed as a ;;; more arg, but there is no new-FP, since the arguments have been set up in ;;; the current frame. -(defmacro define-full-call (name named return variable) +(defmacro define-full-call (name named return variable &optional args) (aver (not (and variable (eq return :tail)))) `(define-vop (,name ,@(when (eq return :unknown) @@ -881,15 +881,20 @@ '((old-fp) (return-pc))) - ,@(unless variable '((args :more t :scs (descriptor-reg))))) + ,@(unless variable `((args :more t ,@(unless (eq args :fixed) + '(:scs (descriptor-reg))))))) ,@(when (eq return :fixed) '((:results (values :more t)))) (:save-p ,(if (eq return :tail) :compute-only t)) - ,@(unless (or (eq return :tail) variable) - '((:move-args :full-call))) + ,@(unless (or (eq return :tail) + variable) + `((:move-args ,(if (eq args :fixed) + :fixed + :full-call)))) + (:vop-var vop) (:node-var node) @@ -1076,6 +1081,8 @@ (define-full-call call-variable nil :fixed t) (define-full-call multiple-call-variable nil :unknown t) +(define-full-call fixed-call-named t :fixed nil :fixed) +(define-full-call fixed-tail-call-named t :tail nil :fixed) ;;; Defined separately, since needs special code that BLT's the ;;; arguments down. (define-vop (tail-call-variable) @@ -1099,9 +1106,9 @@ (inst add nsp-tn cur-nfp (add-sub-immediate (bytes-needed-for-non-descriptor-stack-frame))))) (load-inline-constant tmp-tn - (if (eq fun-type :function) - '(:fixup tail-call-variable :assembly-routine) - '(:fixup tail-call-callable-variable :assembly-routine))) + (if (eq fun-type :function) + '(:fixup tail-call-variable :assembly-routine) + '(:fixup tail-call-callable-variable :assembly-routine))) (inst br tmp-tn))) ;;; Invoke the function-designator FUN. @@ -1282,3 +1289,4 @@ ;; single-step-before-trap. (inst brk single-step-before-trap) DONE)) + diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp index 6087f8b254..3aac2a21d9 100644 --- a/src/compiler/arm64/vm.lisp +++ b/src/compiler/arm64/vm.lisp @@ -93,7 +93,10 @@ (defconstant register-arg-count 4) ;; names and offsets for registers used to pass arguments (defregset *register-arg-offsets* r0 r1 r2 r3) - (defparameter *register-arg-names* '(r0 r1 r2 r3))) + (defparameter *register-arg-names* '(r0 r1 r2 r3)) + (defregset *desctiptor-args* r0 r1 r2 r3 r4 r5 r6 r7 r8 r9) + (defregset *non-desctiptor-args* nl0 nl1 nl2 nl3 nl4 nl5 nl6 nl7 nl8 nl9) + (defparameter *float-args* (loop for i below 32 collect i))) ;;;; SB and SC definition: diff --git a/src/compiler/fun-info.lisp b/src/compiler/fun-info.lisp index d88ef04a47..f076905b64 100644 --- a/src/compiler/fun-info.lisp +++ b/src/compiler/fun-info.lisp @@ -96,7 +96,11 @@ reoptimize-when-unlinking ;; The function does not verify the arg count and must be always ;; called with the right arguments and can avoid passing NARGS. - no-verify-arg-count) + no-verify-arg-count + ;; Arguments are can be passed unboxed, no type checking on entry is + ;; performed, and the number of arguments passed in registers can be + ;; greater than the standard number. Only fixed arguments can be used. + fixed-args) (defstruct (fun-info (:copier nil) #-sb-xc-host (:pure t)) diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 9e7eec1193..8a33d512c9 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -142,6 +142,32 @@ (nth n *register-arg-offsets*)) (make-sc+offset control-stack-sc-number n))) +(defstruct fixed-call-args-state + (descriptors -1 :type fixnum) + (non-descriptors -1 :type fixnum) + (float -1 :type fixnum)) + +(defvar *float-args*) +(defvar *non-desctiptor-args*) +(defvar *desctiptor-args*) + +(defun fixed-call-arg-location (type state) + (let* ((primtype (primitive-type type)) + (sc (find descriptor-reg-sc-number (sb-c::primitive-type-scs primtype) :test-not #'eql))) + (case (primitive-type-name primtype) + ((double-float single-float) + (make-wired-tn primtype + sc + (elt *float-args* (incf (fixed-call-args-state-float state))))) + ((unsigned-byte-64 signed-byte-64) + (make-wired-tn primtype + sc + (elt *non-desctiptor-args* (incf (fixed-call-args-state-non-descriptors state))))) + (t + (make-wired-tn primtype + descriptor-reg-sc-number + (elt *desctiptor-args* (incf (fixed-call-args-state-descriptors state)))))))) + ;;; Make a TN to hold the number-stack frame pointer. This is allocated ;;; once per component, and is component-live. (defun make-nfp-tn () diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index aeea5dfaae..18dd679c34 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -873,10 +873,19 @@ (defvar *lambda-conversions*) +(defun add-types-for-fixed-args (fun vars) + (let ((fun-info (info :function :info fun))) + (when (and fun-info + (ir1-attributep (fun-info-attributes fun-info) fixed-args)) + (loop for type in (fun-type-required (info :function :type fun)) + for var in vars + do (setf (lambda-var-type var) type)))) + vars) + ;;; Convert a LAMBDA form into a LAMBDA leaf or an OPTIONAL-DISPATCH leaf. (defun ir1-convert-lambda (form &key (source-name '.anonymous.) - debug-name maybe-add-debug-catch - system-lambda) + debug-name maybe-add-debug-catch + system-lambda) (unless (consp form) (compiler-error "A ~S was found when expecting a lambda expression:~% ~S" (type-of form) @@ -926,7 +935,8 @@ :debug-name debug-name :system-lambda system-lambda)) (t - (ir1-convert-lambda-body forms vars + (ir1-convert-lambda-body forms + (add-types-for-fixed-args source-name vars) :aux-vars aux-vars :aux-vals aux-vals :post-binding-lexenv post-binding-lexenv @@ -1018,7 +1028,9 @@ (defined-fun-same-block-p defined-fun-res) t) ;; FIXME: Should non-entry block compiled defuns have ;; this propagate? - (assert-global-function-definition-type name res) + (unless (and info + (ir1-attributep (fun-info-attributes info) fixed-args)) + (assert-global-function-definition-type name res)) ;; If in a simple environment, then we can allow ;; backward references to this function from following ;; top-level forms. diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 942f83a07a..b878aae7c7 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -1073,15 +1073,20 @@ (let ((args (basic-combination-args node)) (last nil) (first nil)) - (dotimes (num (length args)) - (let ((loc (standard-arg-location num))) - (emit-move node block (lvar-tn node block (elt args num)) loc) - (let ((ref (reference-tn loc nil))) - (if last - (setf (tn-ref-across last) ref) - (setf first ref)) - (setq last ref)))) - first)) + (multiple-value-bind (fixed-args-state fixed-args-types) + (fixed-args-state node) + (dotimes (num (length args)) + (let ((loc (cond (fixed-args-state + (sb-vm::fixed-call-arg-location (pop fixed-args-types) fixed-args-state)) + (t + (standard-arg-location num))))) + (emit-move node block (lvar-tn node block (elt args num)) loc) + (let ((ref (reference-tn loc nil))) + (if last + (setf (tn-ref-across last) ref) + (setf first ref)) + (setq last ref)))) + (values first fixed-args-state)))) #+call-symbol (defun fun-tn-type (lvar tn) @@ -1110,62 +1115,83 @@ (let* ((env (environment-info (node-environment node))) (args (basic-combination-args node)) (nargs (length args)) - (pass-refs (move-tail-full-call-args node block)) (old-fp (ir2-environment-old-fp env)) (return-pc (ir2-environment-return-pc env)) (fun-lvar (basic-combination-fun node)) (nargs (if (pass-nargs-p node) nargs (list nargs)))) - (multiple-value-bind (fun-tn named) - (fun-lvar-tn node block fun-lvar) - (cond ((not named) - (vop* tail-call node block - (fun-tn old-fp return-pc pass-refs) - (nil) - nargs (emit-step-p node) - #+call-symbol - (fun-tn-type fun-lvar fun-tn))) - #-immobile-code - ((eq fun-tn named) - (vop* static-tail-call-named node block - (old-fp return-pc pass-refs) ; args - (nil) ; results - nargs named (emit-step-p node))) - (t - (vop* tail-call-named node block - (#-immobile-code fun-tn old-fp return-pc pass-refs) ; args - (nil) ; results - nargs #+immobile-code named (emit-step-p node)))))) ; info + (multiple-value-bind (pass-refs fixed-args-p) + (move-tail-full-call-args node block) + (multiple-value-bind (fun-tn named) + (fun-lvar-tn node block fun-lvar) + (cond ((not named) + (vop* tail-call node block + (fun-tn old-fp return-pc pass-refs) + (nil) + nargs (emit-step-p node) + #+call-symbol + (fun-tn-type fun-lvar fun-tn))) + #-immobile-code + ((eq fun-tn named) + (vop* static-tail-call-named node block + (old-fp return-pc pass-refs) ; args + (nil) ; results + nargs named (emit-step-p node))) + (fixed-args-p + (when-vop-existsp (:named sb-vm::fixed-tail-call-named) + (vop* sb-vm::fixed-tail-call-named node block + (#-immobile-code fun-tn old-fp return-pc pass-refs) ; args + (nil) ; results + nargs #+immobile-code named (emit-step-p node)))) + (t + (vop* tail-call-named node block + (#-immobile-code fun-tn old-fp return-pc pass-refs) ; args + (nil) ; results + nargs #+immobile-code named (emit-step-p node))))))) ; info (values)) +(defun fixed-args-state (node) + (let ((info (combination-fun-info node))) + (when (and info + (ir1-attributep (fun-info-attributes info) fixed-args)) + (values (sb-vm::make-fixed-call-args-state) + (fun-type-required (info :function :type (combination-fun-source-name node) )))))) + ;;; like IR2-CONVERT-LOCAL-CALL-ARGS, only different (defun ir2-convert-full-call-args (node block) (declare (type combination node) (type ir2-block block)) (let* ((args (basic-combination-args node)) (nargs (length args)) (fp (make-stack-pointer-tn nargs))) - (vop allocate-full-call-frame node block nargs fp) - (collect ((locs)) - (let ((last nil) - (first nil)) - (dotimes (num nargs) - (locs (sb-vm::standard-call-arg-location num)) - (let ((ref (reference-tn (lvar-tn node block (elt args num)) - nil))) - (if last - (setf (tn-ref-across last) ref) - (setf first ref)) - (setq last ref))) - - (values fp first (locs) nargs))))) + (multiple-value-bind (fixed-args-state fixed-args-types) + (fixed-args-state node) + (vop allocate-full-call-frame node block nargs fp) + (collect ((locs)) + (let ((last nil) + (first nil)) + (dotimes (num nargs) + (let* ((arg (elt args num)) + (ref (reference-tn (lvar-tn node block arg) + nil))) + (locs + (cond (fixed-args-state + (sb-vm::fixed-call-arg-location (pop fixed-args-types) fixed-args-state)) + (t + (sb-vm::standard-call-arg-location num)))) + + (if last + (setf (tn-ref-across last) ref) + (setf first ref)) + (setq last ref))) + (values fp first (locs) nargs fixed-args-state)))))) ;;; Do full call when a fixed number of values are desired. We make ;;; STANDARD-RESULT-TNS for our lvar, then deliver the result using ;;; MOVE-LVAR-RESULT. We do named or normal call, as appropriate. (defun ir2-convert-fixed-full-call (node block) (declare (type combination node) (type ir2-block block)) - (multiple-value-bind (fp args arg-locs nargs) + (multiple-value-bind (fp args arg-locs nargs fixed-args-p) (ir2-convert-full-call-args node block) (let* ((lvar (node-lvar node)) (locs (and lvar @@ -1198,6 +1224,13 @@ (loc-refs) arg-locs nargs named nvals (emit-step-p node))) + (fixed-args-p + (when-vop-existsp (:named sb-vm::fixed-call-named) + (vop* sb-vm::fixed-call-named node block + (fp #-immobile-code fun-tn args) ; args + (loc-refs) ; results + arg-locs nargs #+immobile-code named nvals ; info + (emit-step-p node)))) (t (vop* call-named node block (fp #-immobile-code fun-tn args) ; args @@ -1427,21 +1460,32 @@ (vop setup-closure-environment node block start-label closure) (let ((n -1)) (dolist (loc (ir2-environment-closure env)) - (vop closure-ref node block closure (incf n) (cdr loc))))))) - (unless (eq (functional-kind fun) :toplevel) - (let ((vars (lambda-vars fun)) - (n 0)) - (when (leaf-refs (first vars)) - (emit-move node block arg-count-tn (leaf-info (first vars)))) - (dolist (arg (rest vars)) - (when (leaf-refs arg) - (let ((pass (standard-arg-location n)) - (home (leaf-info arg))) - (if (and (lambda-var-indirect arg) - (lambda-var-explicit-value-cell arg)) - (emit-make-value-cell node block pass home) - (emit-move node block pass home)))) - (incf n)))) + (vop closure-ref node block closure (incf n) (cdr loc)))))) + (unless (eq (functional-kind fun) :toplevel) + (let* ((vars (lambda-vars fun)) + (n 0) + (name (functional-%source-name ef)) + (fun-info (info :function :info name)) + (fixed-args + (and fun-info + (ir1-attributep (fun-info-attributes fun-info) fixed-args))) + (arg-types (and fixed-args + (fun-type-required (info :function :type name)))) + (fixed-arg-state (and fixed-args + (sb-vm::make-fixed-call-args-state)))) + (when (leaf-refs (first vars)) + (emit-move node block arg-count-tn (leaf-info (first vars)))) + (dolist (arg (rest vars)) + (when (leaf-refs arg) + (let ((pass (if fixed-args + (sb-vm::fixed-call-arg-location (pop arg-types) fixed-arg-state) + (standard-arg-location n))) + (home (leaf-info arg))) + (if (and (lambda-var-indirect arg) + (lambda-var-explicit-value-cell arg)) + (emit-make-value-cell node block pass home) + (emit-move node block pass home)))) + (incf n))))) #-fp-and-pc-standard-save (emit-move node block (make-old-fp-passing-location) (ir2-environment-old-fp env))) diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index a43a65317b..1e45629f25 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -173,6 +173,11 @@ (pushnew 'unsafely-flushable attributes)) #-(or x86-64 arm64) ;; Needs to be supported by the call VOPs (setf attributes (remove 'no-verify-arg-count attributes)) + #-arm64 ;; Needs to be supported by the call VOPs, sb-vm::fixed-call-arg-location + (setf attributes (remove 'fixed-args attributes)) + (when (memq 'fixed-args attributes) + (pushnew 'no-verify-arg-count attributes)) + (multiple-value-bind (type annotation) (split-type-info arg-types result-type) `(%defknown ',(if (and (consp name) diff --git a/src/compiler/locall.lisp b/src/compiler/locall.lisp index d7f61b3f90..9e4bc273c9 100644 --- a/src/compiler/locall.lisp +++ b/src/compiler/locall.lisp @@ -178,10 +178,18 @@ (clambda (let* ((n-supplied (gensym)) (nargs (length (lambda-vars fun))) - (temps (make-gensym-list nargs))) + (temps (make-gensym-list nargs)) + (info (info :function :info (functional-%source-name fun))) + (types (and info + (ir1-attributep (fun-info-attributes info) fixed-args) + (loop for var in (lambda-vars fun) + for temp in temps + collect `(type ,(type-specifier (lambda-var-type var)) ,temp))))) + `(lambda (,n-supplied ,@temps) (declare (type index ,n-supplied) - (ignore ,n-supplied)) + (ignore ,n-supplied) + ,@types) (%funcall ,fun ,@temps)))) (optional-dispatch ;; Force conversion of all entries diff --git a/src/compiler/meta-vmdef.lisp b/src/compiler/meta-vmdef.lisp index b4572c1485..5b0233cfd4 100644 --- a/src/compiler/meta-vmdef.lisp +++ b/src/compiler/meta-vmdef.lisp @@ -341,7 +341,7 @@ (save-p nil :type (member t nil :compute-only :force-to-stack)) ;; info about how to emit MOVE-ARG VOPs for the &MORE operand in ;; call/return VOPs - (move-args nil :type (member nil :local-call :full-call :known-return)) + (move-args nil :type (member nil :local-call :full-call :known-return :fixed)) (args-var '.args. :type symbol) (results-var '.results. :type symbol) (before-load :unspecified :type (or (member :unspecified) list))) @@ -1065,7 +1065,7 @@ (:move-args (setf (vop-parse-move-args parse) (vop-spec-arg spec '(member nil :local-call :full-call - :known-return)))) + :known-return :fixed)))) (:node-var (setf (vop-parse-node-var parse) (vop-spec-arg spec 'symbol))) (:note diff --git a/src/compiler/represent.lisp b/src/compiler/represent.lisp index 12085f5b7f..0591bd1550 100644 --- a/src/compiler/represent.lisp +++ b/src/compiler/represent.lisp @@ -569,21 +569,22 @@ (change-tn-ref-tn val pass-tn) (let* ((this-fp - (cond ((not (sc-number-stack-p pass-sc)) fp-tn) - (nfp-tn) - (t - (aver (eq how :known-return)) - (setq nfp-tn (make-number-stack-pointer-tn)) - (setf (tn-sc nfp-tn) - (svref *backend-sc-numbers* - (first (primitive-type-scs - (tn-primitive-type nfp-tn))))) - (emit-context-template - node block - (template-or-lose 'compute-old-nfp) - nfp-tn vop) - (aver (not (sc-number-stack-p (tn-sc nfp-tn)))) - nfp-tn))) + (cond ((or (eq how :fixed) + (not (sc-number-stack-p pass-sc))) fp-tn) + (nfp-tn) + (t + (aver (eq how :known-return)) + (setq nfp-tn (make-number-stack-pointer-tn)) + (setf (tn-sc nfp-tn) + (svref *backend-sc-numbers* + (first (primitive-type-scs + (tn-primitive-type nfp-tn))))) + (emit-context-template + node block + (template-or-lose 'compute-old-nfp) + nfp-tn vop) + (aver (not (sc-number-stack-p (tn-sc nfp-tn)))) + nfp-tn))) (new (emit-move-arg-template node block res val-tn this-fp pass-tn vop)) (after diff --git a/src/compiler/vop.lisp b/src/compiler/vop.lisp index dff37df800..99b4d9372d 100644 --- a/src/compiler/vop.lisp +++ b/src/compiler/vop.lisp @@ -695,7 +695,7 @@ ;; ;; :KNOWN-RETURN ;; If needed, the old NFP is computed using COMPUTE-OLD-NFP. - (move-args nil :type (member nil :full-call :local-call :known-return)) + (move-args nil :type (member nil :full-call :local-call :known-return :fixed)) ;; a list of sc-vectors representing the loading costs of each fixed ;; argument and result (arg-costs nil :type list) From 690c86fc59e1b4400a53c6d56148952c071865c8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 5 Jul 2022 04:44:09 +0300 Subject: [PATCH 3631/4023] Inline %unary-truncate in (truncate float). --- src/code/float.lisp | 10 ++++++++++ src/cold/exports.lisp | 2 ++ src/compiler/float-tran.lisp | 14 ++++++++++---- src/compiler/fndb.lisp | 5 +++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index 62dfc3ed5f..dd8736adbd 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -612,6 +612,16 @@ (def double-float) (def single-float)) +(macrolet ((def (type) + (let ((decode (symbolicate 'integer-decode- type))) + `(defun ,(symbolicate '%unary-truncate- type '-to-bignum) (number) + (declare (inline ,decode)) + (multiple-value-bind (bits exp sign) (,decode number) + (ash (if (minusp sign) (- bits) bits) + exp)))))) + (def double-float) + (def single-float)) + ;;; Specialized versions for floats. (macrolet ((def (type name) `(defun ,name (number) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 5efeac4284..e8b90d88e4 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1962,6 +1962,8 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "%UNARY-FTRUNCATE" "UNARY-TRUNCATE-SINGLE-FLOAT-TO-BIGNUM" "UNARY-TRUNCATE-DOUBLE-FLOAT-TO-BIGNUM" + "%UNARY-TRUNCATE-SINGLE-FLOAT-TO-BIGNUM" + "%UNARY-TRUNCATE-DOUBLE-FLOAT-TO-BIGNUM" "%WITH-ARRAY-DATA" "%WITH-ARRAY-DATA/FP" diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 7e596770ed..4c209096f6 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1663,8 +1663,14 @@ ;;; depending on FLOAT-ACCURACY. Finally, leave out the secondary value when ;;; we know it is unused: COERCE is not flushable. (macrolet ((def (type other-float-arg-types) - (let ((unary (symbolicate "%UNARY-TRUNCATE/" type)) - (coerce (symbolicate "%" type))) + (let* ((unary (symbolicate "%UNARY-TRUNCATE/" type)) + (unary-to-bignum (symbolicate '%unary-truncate- type '-to-bignum)) + (coerce (symbolicate "%" type)) + (unary `(lambda (number) + (if (and (<= ,(coerce most-negative-fixnum type) number) + (< number ,(coerce most-positive-fixnum type))) + (truly-the fixnum (,unary number)) + (,unary-to-bignum number))))) `(deftransform truncate ((x &optional y) (,type &optional (or ,type ,@other-float-arg-types integer)) @@ -1689,8 +1695,8 @@ (- x (* f #+round-float (,',(ecase type - (double-float 'round-double) - (single-float 'round-single)) + (double-float 'round-double) + (single-float 'round-single)) div :truncate) #-round-float (locally diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index e615c1fd57..cd6c76a126 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -357,6 +357,11 @@ double-float)) (foldable movable flushable)) +(defknown %unary-truncate-single-float-to-bignum (single-float) bignum + (foldable movable flushable fixed-args)) +(defknown %unary-truncate-double-float-to-bignum (double-float) bignum + (foldable movable flushable fixed-args)) + (defknown %multiply-high (word word) word (movable foldable flushable)) From eeb225ee299177a49f07ae01e35b8d13b031bf66 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 5 Jul 2022 21:05:52 +0300 Subject: [PATCH 3632/4023] Use fixed-args for unary-truncate-float-to-bignum. Avoiding boxing floats. --- NEWS | 2 ++ src/compiler/fndb.lisp | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 40382fee07..c9cca6a72c 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- +changes relative to sbcl-2.2.6: + * optimization: faster TRUNCATE with float arguments. changes in sbcl-2.2.6 relative to sbcl-2.2.5: * minor incompatible change: support for 32-bit x86 on macOS has been diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index cd6c76a126..a22f0e5bd6 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -348,14 +348,14 @@ (movable foldable flushable)) (defknown unary-truncate-single-float-to-bignum (single-float) (values bignum (eql $0f0)) - (foldable movable flushable)) + (foldable movable flushable fixed-args)) (defknown unary-truncate-double-float-to-bignum (double-float) (values bignum (and #+(and 64-bit (not (or riscv ppc64))) ;; they can't survive cold-init (eql $0d0) double-float)) - (foldable movable flushable)) + (foldable movable flushable fixed-args)) (defknown %unary-truncate-single-float-to-bignum (single-float) bignum (foldable movable flushable fixed-args)) From 4aa5442db709efd65c72135e812f8567be8206db Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 5 Jul 2022 20:00:13 -0400 Subject: [PATCH 3633/4023] Implement sb-unicode:proplist-p without a hash-table It's an inline hash-table thanks to the ECASE optimizer, not to mention that most uses can be compile-time transformed to remove one level of lookup. --- src/code/target-unicode.lisp | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 1fcb87629d..0ee7166e59 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -15,13 +15,13 @@ #.(sb-cold:read-from-file "output/numerics.lisp-expr") #'equalp) -(sb-ext:define-load-time-global **proplist-properties** - (let* ((list '#.(sb-cold:read-from-file "output/misc-properties.lisp-expr")) - (hash (make-hash-table :size (length list)))) - (loop for (symbol ranges) on list by #'cddr - do (setf (gethash symbol hash) - (coerce ranges '(vector (unsigned-byte 32))))) - hash)) +(eval-when (:compile-toplevel) + (defun plist-to-alist (list) + (loop for (key value) on list by #'cddr collect (cons key value)))) +(eval-when (:compile-toplevel :load-toplevel :execute) + (defparameter *proplist-properties* + (mapcar (lambda (x) (cons (car x) (sb-xc:coerce (cdr x) '(vector (unsigned-byte 32))))) + '#.(plist-to-alist (sb-cold:read-from-file "output/misc-properties.lisp-expr"))))) (sb-ext:define-load-time-global **confusables** (let* ((data '#.(sb-cold:read-from-file "output/confusables.lisp-expr")) @@ -96,8 +96,19 @@ "Returns T if CHARACTER has the specified PROPERTY. PROPERTY is a keyword representing one of the properties from PropList.txt, with underscores replaced by dashes." - (ordered-ranges-member (char-code character) - (gethash property **proplist-properties**))) + (macrolet ((get-ub32-vector () + ;; This ECASE gets optimized into parallel arrays, + ;; and does not depend on jump tables + `(ecase property ,@(mapcar (lambda (x) (list (car x) (cdr x))) + *proplist-properties*)))) + (ordered-ranges-member (char-code character) (get-ub32-vector)))) + +(define-compiler-macro proplist-p (&whole form character property) + (if (keywordp property) + `(ordered-ranges-member (char-code ,character) + ,(or (cdr (assoc property *proplist-properties*)) + (error "No such property ~S" property))) + form)) (eval-when (:compile-toplevel) (defvar *slurped-random-constants* @@ -1585,3 +1596,5 @@ according to the IDNA confusableSummary.txt table" (skeleton1 (normalize-string (canonically-deconfuse str1) form)) (skeleton2 (normalize-string (canonically-deconfuse str2) form))) (string= skeleton1 skeleton2))) + +(clear-info :function :compiler-macro-function 'proplist-p) From a0329ac59e6cb44d98eeafad6ffe8f20e8a7f918 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 5 Jul 2022 21:12:20 -0400 Subject: [PATCH 3634/4023] Shake out some more symbols --- make-target-2-load.lisp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index 14f56d68d3..da11a29743 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -419,14 +419,21 @@ Please check that all strings which were not recognizable to the compiler (let ((s (string symbol))) (and (search "THREAD-" s) (search "-SLOT" s))) (search "-OFFSET" (string symbol)) (search "-TN" (string symbol)))) + (#.(find-package "SB-ALIEN") + (or (eq accessibility :external) (eq symbol 'sb-alien::alien-callback-p))) ((#.(find-package "SB-C") #.(find-package "SB-ASSEM") #.(find-package "SB-DISASSEM") #.(find-package "SB-IMPL") + #.(find-package "SB-LOOP") + #.(find-package "SB-FORMAT") #.(find-package "SB-UNIX") #.(find-package "SB-PCL") #.(find-package "SB-MOP") #.(find-package "SB-PRETTY") + #.(find-package "SB-REGALLOC") + #.(find-package "SB-SYS") + #.(find-package "SB-UNICODE") #.(find-package "SB-BROTHERTREE") #.(find-package "SB-KERNEL")) ;; Assume all and only external symbols must be retained From 113cf667134774b56763bdd3a36a8af35373bf83 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 5 Jul 2022 21:42:05 -0400 Subject: [PATCH 3635/4023] Use a hash-table for sb-unicode:numeric-value Twice the speed for about 50% more space (7Kb of index vector etc) --- src/code/target-unicode.lisp | 13 ++++++++----- tools-for-build/ucd.lisp | 9 +++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 0ee7166e59..5bfa37e4b4 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -11,10 +11,6 @@ (in-package "SB-UNICODE") -(defconstant-eqx +special-numerics+ - #.(sb-cold:read-from-file "output/numerics.lisp-expr") - #'equalp) - (eval-when (:compile-toplevel) (defun plist-to-alist (list) (loop for (key value) on list by #'cddr collect (cons key value)))) @@ -169,7 +165,14 @@ that have a digit value but no decimal digit value" "Returns the numeric value of CHARACTER or NIL if there is no such value. Numeric value is the most general of the Unicode numeric properties. The only constraint on the numeric value is that it be a rational number." - (or (double-vector-binary-search (char-code character) +special-numerics+) + (or (gethash character + (load-time-value + (let* ((list '#.(sb-cold:read-from-file "output/numerics.lisp-expr")) + (hash (make-hash-table :test #'eq :size (length list)))) + (loop for (k . v) in list + do (setf (gethash (code-char k) hash) v)) + hash) + t)) (digit-value character))) (defun mirrored-p (character) diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index 3ba3cf17db..7a56b26db1 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -1024,12 +1024,9 @@ Used to look up block data.") (setf *unicode-1-names* nil)) (with-output-lisp-expr-file (*standard-output* "numerics") - (let ((result (make-array (* (length *different-numerics*) 2)))) - (loop for (code . value) in (sort *different-numerics* #'< :key #'car) - for i by 2 - do (setf (aref result i) code - (aref result (1+ i)) (read-from-string value))) - (prin1 result))) + (prin1 (mapcar (lambda (x) (cons (car x) (read-from-string (cdr x)))) + ;; Print it low to high. It was collected with PUSH + (reverse *different-numerics*)))) (with-output-lisp-expr-file (*standard-output* "titlecases") (prin1 *different-titlecases*)) (with-output-lisp-expr-file (*standard-output* "foldcases") From 011ab6b960de6708810d23fa06d9a6701da381b6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 6 Jul 2022 14:13:33 +0300 Subject: [PATCH 3636/4023] Fix -sb-unicode. --- src/code/target-unicode.lisp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 5bfa37e4b4..ce488857b1 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -165,14 +165,15 @@ that have a digit value but no decimal digit value" "Returns the numeric value of CHARACTER or NIL if there is no such value. Numeric value is the most general of the Unicode numeric properties. The only constraint on the numeric value is that it be a rational number." - (or (gethash character + (or #+sb-unicode + (gethash character (load-time-value - (let* ((list '#.(sb-cold:read-from-file "output/numerics.lisp-expr")) - (hash (make-hash-table :test #'eq :size (length list)))) - (loop for (k . v) in list - do (setf (gethash (code-char k) hash) v)) - hash) - t)) + (let* ((list '#.(sb-cold:read-from-file "output/numerics.lisp-expr")) + (hash (make-hash-table :test #'eq :size (length list)))) + (loop for (k . v) in list + do (setf (gethash (code-char k) hash) v)) + hash) + t)) (digit-value character))) (defun mirrored-p (character) From d4930085579931ba9f7a2fcf987fa11db9eef96d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 6 Jul 2022 14:39:42 +0300 Subject: [PATCH 3637/4023] Fix -sb-unicode in a different way. --- src/code/target-unicode.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index ce488857b1..43cab5de73 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -165,12 +165,12 @@ that have a digit value but no decimal digit value" "Returns the numeric value of CHARACTER or NIL if there is no such value. Numeric value is the most general of the Unicode numeric properties. The only constraint on the numeric value is that it be a rational number." - (or #+sb-unicode - (gethash character + (or (gethash character (load-time-value (let* ((list '#.(sb-cold:read-from-file "output/numerics.lisp-expr")) (hash (make-hash-table :test #'eq :size (length list)))) (loop for (k . v) in list + when (< k char-code-limit) do (setf (gethash (code-char k) hash) v)) hash) t)) From 5f674e1f9a92857ffb28a32d95202ec207380b0e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 6 Jul 2022 15:37:33 +0300 Subject: [PATCH 3638/4023] Implement fixed-args calls on x86-64. --- src/compiler/arm64/vm.lisp | 16 +++++++--------- src/compiler/generic/utils.lisp | 18 ++++++++++++------ src/compiler/ir2tran.lisp | 2 +- src/compiler/knownfun.lisp | 4 ++-- src/compiler/x86-64/call.lisp | 14 ++++++++++---- src/compiler/x86-64/vm.lisp | 3 ++- 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp index 3aac2a21d9..5e87d0e339 100644 --- a/src/compiler/arm64/vm.lisp +++ b/src/compiler/arm64/vm.lisp @@ -18,20 +18,18 @@ ;;;; register specs -(eval-when (:compile-toplevel :load-toplevel :execute) - (defvar *register-names* (make-array 32 :initial-element nil))) +(defvar *register-names* (make-array 32 :initial-element nil)) (macrolet ((defreg (name offset) (let ((offset-sym (symbolicate name "-OFFSET"))) - `(eval-when (:compile-toplevel :load-toplevel :execute) + `(progn (defconstant ,offset-sym ,offset) (setf (svref *register-names* ,offset-sym) ,(symbol-name name))))) (defregset (name &rest regs) - `(eval-when (:compile-toplevel :load-toplevel :execute) - (defparameter ,name + `(defglobal ,name (list ,@(mapcar #'(lambda (name) - (symbolicate name "-OFFSET")) regs)))))) + (symbolicate name "-OFFSET")) regs))))) (defreg nl0 0) (defreg nl1 1) @@ -94,9 +92,9 @@ ;; names and offsets for registers used to pass arguments (defregset *register-arg-offsets* r0 r1 r2 r3) (defparameter *register-arg-names* '(r0 r1 r2 r3)) - (defregset *desctiptor-args* r0 r1 r2 r3 r4 r5 r6 r7 r8 r9) - (defregset *non-desctiptor-args* nl0 nl1 nl2 nl3 nl4 nl5 nl6 nl7 nl8 nl9) - (defparameter *float-args* (loop for i below 32 collect i))) + (defregset *descriptor-args* r0 r1 r2 r3 r4 r5 r6 r7 r8 r9) + (defregset *non-descriptor-args* nl0 nl1 nl2 nl3 nl4 nl5 nl6 nl7 nl8 nl9) + (defglobal *float-regs* (loop for i below 32 collect i))) ;;;; SB and SC definition: diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 8a33d512c9..90cb5f3f1a 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -144,12 +144,14 @@ (defstruct fixed-call-args-state (descriptors -1 :type fixnum) + #-c-stack-is-control-stack (non-descriptors -1 :type fixnum) (float -1 :type fixnum)) -(defvar *float-args*) -(defvar *non-desctiptor-args*) -(defvar *desctiptor-args*) +(declaim (#+sb-xc-host special + #-sb-xc-host sb-ext:global + *float-args* *desctiptor-args* + #-c-stack-is-control-stack *non-desctiptor-args*)) (defun fixed-call-arg-location (type state) (let* ((primtype (primitive-type type)) @@ -158,15 +160,19 @@ ((double-float single-float) (make-wired-tn primtype sc - (elt *float-args* (incf (fixed-call-args-state-float state))))) + (elt *float-regs* (incf (fixed-call-args-state-float state))))) ((unsigned-byte-64 signed-byte-64) (make-wired-tn primtype sc - (elt *non-desctiptor-args* (incf (fixed-call-args-state-non-descriptors state))))) + (elt #-c-stack-is-control-stack *non-descriptor-args* + #+c-stack-is-control-stack *descriptor-args* + (incf (#-c-stack-is-control-stack fixed-call-args-state-non-descriptors + #+c-stack-is-control-stack fixed-call-args-state-descriptors + state))))) (t (make-wired-tn primtype descriptor-reg-sc-number - (elt *desctiptor-args* (incf (fixed-call-args-state-descriptors state)))))))) + (elt *descriptor-args* (incf (fixed-call-args-state-descriptors state)))))))) ;;; Make a TN to hold the number-stack frame pointer. This is allocated ;;; once per component, and is component-live. diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index b878aae7c7..ccba7b23a8 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -1156,7 +1156,7 @@ (when (and info (ir1-attributep (fun-info-attributes info) fixed-args)) (values (sb-vm::make-fixed-call-args-state) - (fun-type-required (info :function :type (combination-fun-source-name node) )))))) + (fun-type-required (info :function :type (combination-fun-source-name node))))))) ;;; like IR2-CONVERT-LOCAL-CALL-ARGS, only different (defun ir2-convert-full-call-args (node block) diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index 1e45629f25..3a946df9e9 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -171,9 +171,9 @@ (setq attributes (union '(unwind) attributes))) (when (member 'flushable attributes) (pushnew 'unsafely-flushable attributes)) - #-(or x86-64 arm64) ;; Needs to be supported by the call VOPs + #-(or arm64 x86-64) ;; Needs to be supported by the call VOPs (setf attributes (remove 'no-verify-arg-count attributes)) - #-arm64 ;; Needs to be supported by the call VOPs, sb-vm::fixed-call-arg-location + #-(or arm64 x86-64) ;; Needs to be supported by the call VOPs, sb-vm::fixed-call-arg-location (setf attributes (remove 'fixed-args attributes)) (when (memq 'fixed-args attributes) (pushnew 'no-verify-arg-count attributes)) diff --git a/src/compiler/x86-64/call.lisp b/src/compiler/x86-64/call.lisp index bcb08e6962..c963a480ef 100644 --- a/src/compiler/x86-64/call.lisp +++ b/src/compiler/x86-64/call.lisp @@ -589,7 +589,7 @@ ;;; In tail call with fixed arguments, the passing locations are ;;; passed as a more arg, but there is no new-FP, since the arguments ;;; have been set up in the current frame. -(macrolet ((define-full-call (vop-name named return variable) +(macrolet ((define-full-call (vop-name named return variable &optional args) (aver (not (and variable (eq return :tail)))) #+immobile-code (when named (setq named :direct)) `(define-vop (,vop-name ,@(when (eq return :unknown) @@ -610,7 +610,9 @@ '((old-fp) (return-pc))) - ,@(unless variable '((args :more t :scs (descriptor-reg))))) + ,@(unless variable + `((args :more t ,@(unless (eq args :fixed) + '(:scs (descriptor-reg))))))) ,@(when (eq return :fixed) '((:results (values :more t)))) @@ -618,7 +620,9 @@ (:save-p ,(if (eq return :tail) :compute-only t)) ,@(unless (or (eq return :tail) variable) - '((:move-args :full-call))) + `((:move-args ,(if (eq args :fixed) + :fixed + :full-call)))) (:vop-var vop) (:node-var node) @@ -850,7 +854,9 @@ (define-full-call static-tail-call-named :direct :tail nil) (define-full-call call-variable nil :fixed t) - (define-full-call multiple-call-variable nil :unknown t)) + (define-full-call multiple-call-variable nil :unknown t) + (define-full-call fixed-call-named t :fixed nil :fixed) + (define-full-call fixed-tail-call-named t :tail nil :fixed)) ;;; Invoke the function-designator FUN. (defun tail-call-unnamed (fun type vop) diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index 9db7765645..d233ea8a89 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -174,7 +174,8 @@ #-win32 (defregset *c-call-register-arg-offsets* rdi rsi rdx rcx r8 r9) #+win32 - (defregset *c-call-register-arg-offsets* rcx rdx r8 r9)) + (defregset *c-call-register-arg-offsets* rcx rdx r8 r9) + (defregset *descriptor-args* rdx rdi rsi rax rbx rcx r8 r9 r10 r14 r15)) ;;;; SB definitions From a78a183cc0fb3661e337d41a4b46f61d5e2d7c90 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 6 Jul 2022 09:03:31 -0400 Subject: [PATCH 3639/4023] Remove **character-primary-compositions** as a thing Don't use the custom UTF-24 codec to write it out and re-read and re-pack it for no ostensible purpose. It's just a hash-table ultimately. --- make-host-1.lisp | 2 +- src/code/target-char.lisp | 14 -------------- src/code/target-unicode.lisp | 18 +++++++++++------- src/cold/exports.lisp | 1 - tools-for-build/ucd.lisp | 12 ++++++------ 5 files changed, 18 insertions(+), 29 deletions(-) diff --git a/make-host-1.lisp b/make-host-1.lisp index 0fe6c495cd..2a36c56d06 100644 --- a/make-host-1.lisp +++ b/make-host-1.lisp @@ -98,7 +98,7 @@ "output/casepages.dat" "output/casepages.lisp-expr" "output/collation.dat" - "output/comp.dat" + "output/comp.lisp-expr" "output/CompositionExclusions.txt" "output/confusables.lisp-expr" "output/decomp.dat" diff --git a/src/code/target-char.lisp b/src/code/target-char.lisp index f97ec8474b..224647de5c 100644 --- a/src/code/target-char.lisp +++ b/src/code/target-char.lisp @@ -88,7 +88,6 @@ (ucd-high-pages (read-ub8-vector (file "ucdhigh" "dat"))) (ucd-low-pages (read-ub8-vector (file "ucdlow" "dat"))) (decompositions (read-ub8-vector (file "decomp" "dat"))) - (primary-compositions (read-ub8-vector (file "comp" "dat"))) (case-data (read-ub8-vector (file "case" "dat"))) (case-pages (read-ub8-vector (file "casepages" "dat"))) (collations (read-ub8-vector (file "collation" "dat"))) @@ -103,19 +102,6 @@ (defconstant-eqx sb-unicode::+character-decompositions+ ,(make-ubn-vector decompositions 3) #'equalp) (defconstant-eqx +character-case-pages+ ,%*character-case-pages*% #'equalp) - (declaim (hash-table **character-primary-compositions**)) - (define-load-time-global **character-primary-compositions** - ,(let ((info (make-ubn-vector primary-compositions 3)) - (alist)) - (dotimes (i (/ (length info) 3)) - (let* ((3i (* 3 i)) - (key (dpb (aref info 3i) (byte 21 21) (aref info (1+ 3i)))) - (value (aref info (+ 3i 2)))) - (push (cons key value) alist))) - `(%stuff-hash-table (make-hash-table #+64-bit :test #+64-bit #'eq - :size ,(/ (length info) 3)) - ,(nreverse (coerce alist 'vector))))) - ,@(let* ((unicode-table (make-array (* 64 (1+ (aref %*character-case-pages*% diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 43cab5de73..8730661b9a 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -450,8 +450,7 @@ disappears when accents are placed on top of it. and NIL otherwise" (nreverse chars)))) (defun primary-composition (char1 char2) - (flet ((maybe (fn x) (when x (funcall fn x))) - (composition-hangul-syllable-type (cp) + (flet ((composition-hangul-syllable-type (cp) (cond ((and (<= #x1100 cp) (<= cp #x1112)) :L) ((and (<= #x1161 cp) (<= cp #x1175)) :V) @@ -461,19 +460,24 @@ disappears when accents are placed on top of it. and NIL otherwise" (declare (inline composition-hangul-syllable-type)) (let ((c1 (char-code char1)) (c2 (char-code char2))) - (maybe - #'code-char (cond ((gethash (dpb c1 (byte 21 21) c2) - **character-primary-compositions**)) + (load-time-value + (let* ((data '#.(sb-cold:read-from-file "output/comp.lisp-expr")) + (hash (make-hash-table :size (length data) + #+64-bit :test #+64-bit #'eq))) + (dovector (pair data hash) + (when (< (cdr pair) char-code-limit) ; Why is this even defined if #-sb-unicode? + (setf (gethash (car pair) hash) (code-char (cdr pair)))))) + t))) ((and (eql (composition-hangul-syllable-type c1) :L) (eql (composition-hangul-syllable-type c2) :V)) (let ((lindex (- c1 #x1100)) (vindex (- c2 #x1161))) - (+ #xac00 (* lindex 588) (* vindex 28)))) + (code-char (+ #xac00 (* lindex 588) (* vindex 28))))) ((and (eql (composition-hangul-syllable-type c1) :LV) (eql (composition-hangul-syllable-type c2) :T)) - (+ c1 (- c2 #x11a7)))))))) + (code-char (+ c1 (- c2 #x11a7)))))))) (defun canonically-compose (list) (let* ((result list) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index e8b90d88e4..0289ac4abd 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -3409,7 +3409,6 @@ possibly temporarily, because it might be used internally.") ;; Character database - "**CHARACTER-PRIMARY-COMPOSITIONS**" "**CHARACTER-COLLATIONS**" ;; Character database access diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index 7a56b26db1..d14a5cd47b 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -925,14 +925,14 @@ Used to look up block data.") (print (length *decompositions*)))) (defun output-composition-data () - (with-output-dat-file (stream "comp") + (with-output-lisp-expr-file (stream "comp") (let (comp) (maphash (lambda (k v) (push (cons k v) comp)) *compositions*) - (setq comp (sort comp #'< :key #'cdr)) - (loop for (k . v) in comp - do (write-codepoint (car k) stream) - (write-codepoint (cdr k) stream) - (write-codepoint v stream))))) + (format stream "#(~%") + (loop for (k . v) in (sort comp #'< :key #'cdr) + do (format stream "(~D . ~D) ; #x~X + #x~X~%" + (logior (ash (car k) 21) (cdr k)) v (car k) (cdr k))) + (format stream ")~%")))) (defun output-case-data () (let (casing-pages points-with-case) From 7952a55568b1dd4815b7b88efcb03e5fceb3460a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 6 Jul 2022 16:31:22 +0300 Subject: [PATCH 3640/4023] Try to fix (:no-consing :hash-tables). Run the first (setf gethash) outside of assert-no-consing, as it will be allocating the underlying vectors. --- tests/dynamic-extent.pure.lisp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/dynamic-extent.pure.lisp b/tests/dynamic-extent.pure.lisp index 0e77eb8e73..c323d50083 100644 --- a/tests/dynamic-extent.pure.lisp +++ b/tests/dynamic-extent.pure.lisp @@ -775,9 +775,12 @@ (defun test-hash-table () (setf (gethash 5 *table*) 13) - (gethash 5 *table*)) + (setf (gethash 6 *table*) 14) + (values (gethash 5 *table*) + (gethash 6 *table*))) (with-test (:name (:no-consing :hash-tables)) + (test-hash-table) ;; initialize all the vectors first (assert-no-consing (test-hash-table))) ;;; Both with-pinned-objects and without-gcing should not cons From 79cb1abedb06f9d47332ace69270e12a23537ab3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 6 Jul 2022 16:34:16 +0300 Subject: [PATCH 3641/4023] Fix typos. --- src/compiler/generic/utils.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 90cb5f3f1a..95e70be16f 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -150,8 +150,8 @@ (declaim (#+sb-xc-host special #-sb-xc-host sb-ext:global - *float-args* *desctiptor-args* - #-c-stack-is-control-stack *non-desctiptor-args*)) + *float-args* *descriptor-args* + #-c-stack-is-control-stack *non-descriptor-args*)) (defun fixed-call-arg-location (type state) (let* ((primtype (primitive-type type)) From 18d7ec5723a2fe2576be72f8961dfc9630dab174 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 6 Jul 2022 17:07:05 +0300 Subject: [PATCH 3642/4023] More typos. --- src/compiler/generic/utils.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 95e70be16f..7284e58df8 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -150,7 +150,7 @@ (declaim (#+sb-xc-host special #-sb-xc-host sb-ext:global - *float-args* *descriptor-args* + *float-regs* *descriptor-args* #-c-stack-is-control-stack *non-descriptor-args*)) (defun fixed-call-arg-location (type state) From 1f60a570bfcfc43fd9c81ddf265eb0081af6b84c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 6 Jul 2022 12:27:10 -0400 Subject: [PATCH 3643/4023] Delete baroque logic from ucd Reading allkeys would parse, then encode then decode then encode (and decode upon use). We only care about the final form. This change produces an EQUALP hash table in far fewer convolutions. I think we have no assertions to check it though. --- make-host-1.lisp | 3 +- src/code/target-char.lisp | 34 ------------------- src/code/target-unicode.lisp | 13 ++++++-- src/cold/exports.lisp | 4 --- tools-for-build/ucd.lisp | 65 ++++++++++++------------------------ 5 files changed, 33 insertions(+), 86 deletions(-) diff --git a/make-host-1.lisp b/make-host-1.lisp index 2a36c56d06..0a0cde559d 100644 --- a/make-host-1.lisp +++ b/make-host-1.lisp @@ -97,7 +97,7 @@ "output/CaseFolding.txt" "output/casepages.dat" "output/casepages.lisp-expr" - "output/collation.dat" + "output/collation.lisp-expr" "output/comp.lisp-expr" "output/CompositionExclusions.txt" "output/confusables.lisp-expr" @@ -109,7 +109,6 @@ "output/Jamo.txt" "output/LineBreak.txt" "output/misc-properties.lisp-expr" - "output/n-collation-entries.lisp-expr" "output/NormalizationCorrections.txt" "output/numerics.lisp-expr" "output/other-collation-info.lisp-expr" diff --git a/src/code/target-char.lisp b/src/code/target-char.lisp index 224647de5c..d890896402 100644 --- a/src/code/target-char.lisp +++ b/src/code/target-char.lisp @@ -90,7 +90,6 @@ (decompositions (read-ub8-vector (file "decomp" "dat"))) (case-data (read-ub8-vector (file "case" "dat"))) (case-pages (read-ub8-vector (file "casepages" "dat"))) - (collations (read-ub8-vector (file "collation" "dat"))) (high-pages (make-ubn-vector ucd-high-pages 2)) (low-pages (make-ubn-vector ucd-low-pages 2)) (%*character-case-pages*% (make-ubn-vector case-pages 1))) @@ -160,39 +159,6 @@ `((defconstant-eqx +character-unicode-cases+ ,unicode-table #'equalp) (defconstant-eqx +character-cases+ ,table #'equalp))) - (define-load-time-global **character-collations** - ,(let* ((n-entries - (with-open-file (s (file "n-collation-entries" "lisp-expr")) - (read s))) - (table) - (index 0) - (info (make-ubn-vector collations 4)) - (len (length info))) - (loop while (< index len) do - (let* ((entry-head (aref info index)) - (cp-length (ldb (byte 4 28) entry-head)) - (key-length (ldb (byte 5 23) entry-head)) - (key 0) - (codepoints nil)) - (aver (and (/= cp-length 0) (/= key-length 0))) - (loop repeat cp-length do - (push (dpb 0 (byte 10 22) (aref info index)) - codepoints) - (incf index)) - (setf codepoints (nreverse codepoints)) - (dotimes (i key-length) - (setf (ldb (byte 32 (* i 32)) key) (aref info index)) - (incf index)) - ;; verify the validity of - ;; :test 'eq on 64-bit - #+64-bit (aver (sb-xc:typep (apply #'pack-3-codepoints codepoints) - 'sb-xc:fixnum)) - (push (cons (apply #'pack-3-codepoints codepoints) key) table))) - (aver (= (length table) n-entries)) - `(%stuff-hash-table - (make-hash-table :size ,n-entries #+64-bit :test #+64-bit #'eq) - ,(nreverse (coerce table 'vector))))) - ,@(with-open-file (stream (file "ucd-names" "lisp-expr")) (with-open-file (u1-stream (file "ucd1-names" "lisp-expr")) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 8730661b9a..5eaab2cd0f 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -1426,6 +1426,15 @@ it defaults to 80 characters" (defun variable-p (x) (<= 1 x +maximum-variable-primary-element+)) +(macrolet ((collations-hash-table () + (let ((data (let ((*read-base* 16)) + (sb-cold:read-from-file "output/collation.lisp-expr")))) + #+64-bit (dovector (item data) (aver (fixnump (car item)))) + `(load-time-value + (sb-impl::%stuff-hash-table + (make-hash-table :size ,(length data) #+64-bit :test #+64-bit 'eq) + ',data) + t)))) (defun collation-key (string start end) (let (char1 (char2 (code-char 0)) @@ -1442,7 +1451,7 @@ it defaults to 80 characters" (return-from collation-key nil))) (let* ((code1 (char-code char1)) (packed-key (gethash (pack-3-codepoints code1 (char-code char2) (char-code char3)) - **character-collations**))) + (collations-hash-table)))) (if packed-key (unpack-collation-key packed-key) (when (char= (code-char 0) char2 char3) @@ -1457,7 +1466,7 @@ it defaults to 80 characters" (t #xFBC0))) (a (+ base (if tangut-p 0 (ash code1 -15)))) (b (logior #x8000 (if tangut-p (- code1 #x17000) (logand code1 #x7FFF))))) - (list (list a #x20 #x2) (list b 0 0)))))))) + (list (list a #x20 #x2) (list b 0 0))))))))) (defun sort-key (string) (let* ((str (normalize-string string :nfd)) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 0289ac4abd..2dbdaad95d 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -3407,10 +3407,6 @@ possibly temporarily, because it might be used internally.") "*REPL-PROMPT-FUN*" "*REPL-READ-FORM-FUN*" - ;; Character database - - "**CHARACTER-COLLATIONS**" - ;; Character database access "MISC-INDEX" diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index d14a5cd47b..0e9475352c 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -785,15 +785,6 @@ Length should be adjusted when the standard changes.") (bitpack-collation-key primary secondary tertiary))))) (values code-points ret)))) -(defparameter *collation-table* - (with-input-txt-file (stream "allkeys") - (loop with hash = (make-hash-table :test #'equal) - for line = (read-line stream nil nil) while line - unless (or (string= line "") (eql 0 (position #\@ line)) (eql 0 (position #\# line))) - do (multiple-value-bind (codepoints keys) (parse-collation-line line) - (setf (gethash codepoints hash) keys)) - finally (return hash)))) - ;;; Other properties (defparameter *confusables* @@ -851,13 +842,6 @@ Used to look up block data.") (write-byte (ldb (byte 8 8) code-point) stream) (write-byte (ldb (byte 8 0) code-point) stream)) -(defun write-4-byte (value stream) - (declare (type (unsigned-byte 32) value)) - (write-byte (ldb (byte 8 24) value) stream) - (write-byte (ldb (byte 8 16) value) stream) - (write-byte (ldb (byte 8 8) value) stream) - (write-byte (ldb (byte 8 0) value) stream)) - (defun output-misc-data () (with-output-dat-file (stream "ucdmisc") (loop for (gc-index bidi-index ccc digit decomposition-info flags @@ -964,37 +948,30 @@ Used to look up block data.") (print casing-pages stream)))) (defun output-collation-data () - (with-output-dat-file (stream "collation") - (flet ((length-tag (list1 list2) - ;; takes two lists of UB32 (with the caveat that list1[0] - ;; needs its high 8 bits free (codepoints always have - ;; that) and do - (let* ((l1 (length list1)) (l2 (length list2)) - (tag (dpb l1 (byte 4 28) (dpb l2 (byte 5 23) (car list1))))) - (assert (<= l1 3)) - (write-4-byte tag stream) - (map nil #'(lambda (l) (write-4-byte l stream)) (append (cdr list1) list2))))) - (let (coll) - (maphash (lambda (k v) (push (cons k v) coll)) *collation-table*) - (labels ((sorter (o1 o2) - (cond - ((null o1) t) - ((null o2) nil) - (t (or (< (car o1) (car o2)) - (and (= (car o1) (car o2)) - (sorter (cdr o1) (cdr o2)))))))) - (setq coll (sort coll #'sorter :key #'car))) - (loop for (k . v) in coll - do (length-tag k v))))) + (with-output-lisp-expr-file (output "collation") + (format output ";;;; This is 'allkeys.txt' converted to Lisp syntax~%") + (format output ";;;; Assume *READ-BASE* is 16.~%#(~%") + (with-input-txt-file (input "allkeys") + (loop for line = (read-line input nil nil) while line + unless (or (string= line "") + (eql 0 (position #\@ line)) (eql 0 (position #\# line))) + do + (multiple-value-bind (codepoints keys) (parse-collation-line line) + (format output "(~x . ~x)~%" + ;; Pack up to 3 codepoints, rightmost in the highest bits + (destructuring-bind (first &optional second third) codepoints + (cond (third (logior (ash third 42) (ash second 21) first)) + (second (logior (ash second 21) first)) + (t first))) + ;; Pack the blob of "keys" using 32 bits each + (let ((sum 0)) + (dolist (part (reverse keys) sum) + (setq sum (logior (ash sum 32) part)))))))) + (format output ")~%")) (with-output-lisp-expr-file (*standard-output* "other-collation-info") (write-string ";;; The highest primary variable collation index") (terpri) - (prin1 *maximum-variable-key*) (terpri)) - (with-output-lisp-expr-file (*standard-output* "n-collation-entries") - (write-string ";;; The number of entries in the collation table") - (terpri) - (prin1 (hash-table-count *collation-table*)) - (terpri))) + (prin1 *maximum-variable-key*) (terpri))) (defun output (&optional (*output-directory* *output-directory*)) (output-misc-data) From bdd7c0c086d573d6563a1fd23a288c0b43cdcfed Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 7 Jul 2022 00:59:58 +0300 Subject: [PATCH 3644/4023] Fix :code-object fixups on darwin-jit. Where fixups are applied to a copy of a code object. --- src/code/load.lisp | 5 +++-- src/compiler/generic/target-core.lisp | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 56adb026a7..822cbea7df 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1160,11 +1160,12 @@ (if (oddp header) :immobile :dynamic) (align-up n-boxed-words sb-c::code-boxed-words-align) n-code-bytes)) - (debug-info (svref stack (+ ptr n-constants)))) + (real-code code) + (debug-info (svref stack (+ ptr n-constants)))) (with-writable-code-instructions (code total-nwords debug-info n-named-calls n-simple-funs) :copy (read-n-bytes (fasl-input-stream) (code-instructions code) 0 n-code-bytes) - :fixup (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts)) + :fixup (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts real-code)) ;; Don't need the code pinned from here on (progn (setf (sb-c::debug-info-source (%code-debug-info code)) diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index a282f31c86..714bd1b626 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -70,7 +70,8 @@ (define-load-time-global sb-fasl::*asm-routine-index-to-name* #()) (declaim (simple-vector sb-fasl::*asm-routine-index-to-name*)) -(flet ((fixup (code-obj offset name kind flavor preserved-lists statically-link-p) +(flet ((fixup (code-obj offset name kind flavor preserved-lists statically-link-p + real-code-obj) (declare (ignorable statically-link-p preserved-lists)) ;; NAME depends on the kind and flavor of fixup. ;; PRESERVED-LISTS is a vector of lists of locations (by kind) @@ -87,7 +88,7 @@ (if (eq flavor :asm-routine-nil-offset) sb-vm:nil-value 0))) (:foreign (foreign-symbol-address name)) (:foreign-dataref (foreign-symbol-address name t)) - (:code-object (get-lisp-obj-address code-obj)) + (:code-object (get-lisp-obj-address real-code-obj)) #+sb-thread (:symbol-tls-index (ensure-symbol-tls-index name)) (:layout (get-lisp-obj-address (wrapper-friend (if (symbolp name) (find-layout name) name)))) @@ -127,7 +128,7 @@ ;; Return fixups amenable to static linking (aref preserved-lists 0))) - (defun apply-fasl-fixups (code-obj fixups index count &aux (end (1- (+ index count)))) + (defun apply-fasl-fixups (code-obj fixups index count real-code-obj &aux (end (1- (+ index count)))) (dx-let ((preserved (make-array 5 :initial-element nil))) (let ((retained-fixups (svref fixups index))) (incf index) @@ -145,10 +146,10 @@ (member flavor '(:assembly-routine :assembly-routine*))) (aref sb-fasl::*asm-routine-index-to-name* data)) (t (svref fixups (incf index)))))) - (fixup code-obj offset name kind flavor preserved nil))) + (fixup code-obj offset name kind flavor preserved nil real-code-obj))) (finish-fixups code-obj preserved))) - (defun apply-core-fixups (code-obj fixup-notes retained-fixups) + (defun apply-core-fixups (code-obj fixup-notes retained-fixups real-code-obj) (declare (list fixup-notes)) (unless (eql retained-fixups 0) (setf (sb-vm::%code-fixups code-obj) retained-fixups)) @@ -160,7 +161,8 @@ (fixup-name fixup) (fixup-note-kind note) (fixup-flavor fixup) - preserved t))) + preserved t + real-code-obj))) (finish-fixups code-obj preserved)))) ;;; Return a behaviorally identical copy of CODE which is used for TRACE @@ -315,13 +317,14 @@ (bytes (the (simple-array assembly-unit 1) (segment-contents-as-vector segment))) (n-simple-funs (length (ir2-component-entries 2comp))) - (named-call-fixups nil)) + (named-call-fixups nil) + (real-code-obj code-obj)) (declare (ignorable boxed-data)) (sb-fasl::with-writable-code-instructions (code-obj total-nwords debug-info n-named-calls n-simple-funs) :copy (%byte-blt bytes 0 (code-instructions code-obj) 0 (length bytes)) :fixup (setq named-call-fixups - (apply-core-fixups code-obj fixup-notes retained-fixups))) + (apply-core-fixups code-obj fixup-notes retained-fixups real-code-obj))) (when alloc-points #+(and x86-64 sb-thread) From ebd0b64bfa6fc5deaa25a9b31f90e70cfe4aafeb Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 6 Jul 2022 19:54:02 -0400 Subject: [PATCH 3645/4023] Revert "Remove need_zerofill bit from page table" This reverts commit 938320b20997f2b32217c17cabab8648f764ec1b. The change caused the kernel to perceive increased RSS, because an OS page that was paged out and already known to need zerofill on next use could get paged in just to store to its first word despite there being otherwise no reason to touch the page when freeing oldspace. --- contrib/sb-introspect/introspect.lisp | 4 +++- src/code/room.lisp | 12 ++++++---- src/runtime/fullcgc.c | 2 +- src/runtime/gencgc-internal.h | 14 +++++------ src/runtime/gencgc-private.h | 6 ++--- src/runtime/gencgc.c | 34 ++++++++++++++++++++------- src/runtime/private-cons.inc | 2 +- tests/allocator.pure.lisp | 3 ++- tests/debug.pure.lisp | 5 ++-- tests/gc-testlib.c | 1 + tests/private-cons.impure.lisp | 4 ++-- 11 files changed, 56 insertions(+), 31 deletions(-) diff --git a/contrib/sb-introspect/introspect.lisp b/contrib/sb-introspect/introspect.lisp index 565acd1dd8..3bbffc3465 100644 --- a/contrib/sb-introspect/introspect.lisp +++ b/contrib/sb-introspect/introspect.lisp @@ -829,7 +829,9 @@ Experimental: interface subject to change." (let* ((wp (page-protected-p object)) (index (sb-vm:find-page-index (get-lisp-obj-address object))) - (type (sb-alien:slot page 'sb-vm::flags))) + (flags (sb-alien:slot page 'sb-vm::flags)) + (type #+little-endian (ldb (byte 6 0) flags) + #+big-endian (ldb (byte 6 2) flags))) (list :space space :generation (sb-alien:slot page 'sb-vm::gen) :write-protected wp diff --git a/src/code/room.lisp b/src/code/room.lisp index d0179cb876..0cfc54d04f 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -405,7 +405,10 @@ We could try a few things to mitigate this: end-page-bytes-used) most-positive-word))))) (when (sap> end start) - (let ((flags (slot (deref page-table start-page) 'flags))) + ;; The bits in the 6-bit 'type' field have fixed positions, + ;; but the position of the field itself depends on endianness. + (let ((flags (ldb (byte 6 (+ #+big-endian 2)) + (slot (deref page-table start-page) 'flags)))) ;; The GEN slot is declared as (SIGNED 8) which does not satisfy the ;; type restriction on the first argument to LOGBITP. ;; Masking it to 3 bits fixes that, and allows using the other 5 bits @@ -1154,8 +1157,8 @@ We could try a few things to mitigate this: (setq page-num next-page seen-filler nil)))))))) (let ((i 0)) (loop while (< i total-pages) - do (let ((type (slot (deref page-table i) 'flags))) - (if (= (logand type 7) 7) + do (let ((type (ldb (byte 2 0) (slot (deref page-table i) 'flags)))) + (if (= type 3) (setq i (dump-page i)) (incf i))))) (let* ((n-pages (count 1 pages)) @@ -1224,7 +1227,8 @@ We could try a few things to mitigate this: ;; gen0 conses on MIXED pages, but even that is not enough- pinned conses ;; will promote but keep their MIXED page type. So don't bother with this. #+use-cons-region - (let* ((type (slot (deref page-table (find-page-index obj-addr)) 'flags)) + (let* ((flags (slot (deref page-table (find-page-index obj-addr)) 'flags)) + (type (ldb (byte 6 (+ #+big-endian 2)) flags)) (ok (if (consp obj) (or (= type #b101) ; PAGE_TYPE_CONS (and (eq (car obj) 0) (eq (cdr obj) 0))) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 9fdf8dd7e8..e41c135086 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -714,7 +714,7 @@ void execute_full_sweep_phase() for (page = free_page; page < page_table_pages; ++page) { gc_assert((page_table[page].type & PAGE_TYPE_MASK) == PAGE_TYPE_UNBOXED); gc_assert(!page_bytes_used(page)); - set_page_needs_zerofill(page); + set_page_need_to_zero(page, 1); page_table[page].type = FREE_PAGE_FLAG; } } diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index ed7e09023d..53834408a5 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -30,12 +30,7 @@ #endif #define GENCGC_PAGE_WORDS (GENCGC_PAGE_BYTES/N_WORD_BYTES) - -/* Calculate the start address for the given page number. */ -static inline char *page_address(page_index_t page_num) { - return (void*)(DYNAMIC_SPACE_START + (page_num * GENCGC_PAGE_BYTES)); -} - +extern char *page_address(page_index_t); int gencgc_handle_wp_violation(void*, void*); @@ -126,6 +121,7 @@ struct page { // !!! If bit positions are changed, be sure to reflect the changes into // page_extensible_p() as well as ALLOCATION-INFORMATION in sb-introspect // and WALK-DYNAMIC-SPACE. + unsigned char /* * The 4 low bits of 'type' are defined by PAGE_TYPE_x constants. * 0000 free @@ -134,7 +130,11 @@ struct page { * ?011 mixed boxed/unboxed non-code objects * ?111 code * The next two bits are SINGLE_OBJECT and OPEN_REGION */ - unsigned char type; + type :6, + /* Whether the page was used at all. This is the only bit that can + * be 1 on a free page */ + need_zerofill :1, + dontuse :1; /* the generation that this page belongs to. This should be valid * for all pages that may have objects allocated, even current diff --git a/src/runtime/gencgc-private.h b/src/runtime/gencgc-private.h index e3e0f4d523..41e1e5297d 100644 --- a/src/runtime/gencgc-private.h +++ b/src/runtime/gencgc-private.h @@ -18,12 +18,12 @@ typedef unsigned int page_bytes_t; #define page_words_used(index) page_table[index].words_used_ #define page_bytes_used(index) ((page_bytes_t)page_table[index].words_used_<<WORD_SHIFT) #if defined LISP_FEATURE_RISCV && defined LISP_FEATURE_LINUX // KLUDGE -#define page_need_to_zero(index) (mmap_does_not_zero || (*(uword_t*)page_address(index) != 0)) +#define page_need_to_zero(index) (mmap_does_not_zero || page_table[index].need_zerofill) #else -#define page_need_to_zero(index) (*(uword_t*)page_address(index) != 0) +#define page_need_to_zero(index) page_table[index].need_zerofill #endif #define set_page_bytes_used(index,val) page_table[index].words_used_ = ((val)>>WORD_SHIFT) -#define set_page_needs_zerofill(index) *(uword_t*)page_address(index) = 0xBADBAD +#define set_page_need_to_zero(index,val) page_table[index].need_zerofill = val #if !CONDENSED_PAGE_TABLE diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 8cc14804fc..c0775a213b 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -193,6 +193,12 @@ static inline boolean protect_page_p(page_index_t page, generation_index_t gener } #endif +/* Calculate the start address for the given page number. */ +inline char *page_address(page_index_t page_num) +{ + return (void*)(DYNAMIC_SPACE_START + (page_num * GENCGC_PAGE_BYTES)); +} + /* Calculate the address where the allocation region associated with * the page starts. */ static inline void * @@ -256,7 +262,8 @@ page_index_t contiguous_block_final_page(page_index_t first) { /* We maintain the invariant that pages with FREE_PAGE_FLAG have * scan_start of zero, to optimize page_ends_contiguous_block_p(). - * Clear all the flags that don't pertain to a free page. */ + * Clear all the flags that don't pertain to a free page. + * Particularly the 'need_zerofill' bit MUST remain as-is */ static inline void reset_page_flags(page_index_t page) { page_table[page].scan_start_offset_ = 0; #ifdef LISP_FEATURE_DARWIN_JIT @@ -265,6 +272,7 @@ static inline void reset_page_flags(page_index_t page) { if (page_table[page].type == PAGE_TYPE_CODE) set_page_needs_zerofill(page); #endif page_table[page].type = 0; + page_table[page].dontuse = 0; gc_page_pins[page] = 0; // Why can't the 'gen' get cleared? It caused failures. THIS MAKES NO SENSE!!! // page_table[page].gen = 0; @@ -827,7 +835,7 @@ void zeroize_pages_if_needed(page_index_t start, page_index_t end, int page_type for (i = start; i <= end; i++) any_need_to_zero |= page_need_to_zero(i); if (any_need_to_zero) { zero_pages(start, end); - // Zeroing the page clears the need-to-zerofill status implicitly + for (i = start; i <= end; i++) set_page_need_to_zero(i, 0); } #else boolean usable_by_lisp = @@ -837,7 +845,7 @@ void zeroize_pages_if_needed(page_index_t start, page_index_t end, int page_type for (i = start; i <= end; i++) if (page_need_to_zero(i)) { zero_pages(i, i); - // Zeroing the page clears the need-to-zerofill status implicitly + set_page_need_to_zero(i, 0); } } #endif @@ -988,11 +996,18 @@ page_extensible_p(page_index_t index, generation_index_t gen, int type) { && page_table[index].gen == gen && !gc_page_pins[index]; #else - /* Test 'gen' and 'type' as one comparison. - * The type is at 1 byte prior to 'gen' in the page structure. + /* Test the three conditions above as a single comparison. + * + * pin -\ + * v vvvvvv -- type + * #b11111111_10111111 + * ^ + * need_zerofill (ignored) + * + * The flags reside at 1 byte prior to 'gen' in the page structure. */ int attributes_match = - *(int16_t*)(&page_table[index].gen-1) == ((gen<<8)|type); + (*(int16_t*)(&page_table[index].gen-1) & 0xFFBF) == ((gen<<8)|type); #endif #ifdef LISP_FEATURE_SOFT_CARD_MARKS return attributes_match && page_cards_all_marked_nonsticky(index); @@ -1797,7 +1812,7 @@ static uword_t adjust_obj_ptes(page_index_t first_page, #endif /* It checks out OK, free the page. */ prev_bytes_used = page_bytes_used(page); - set_page_needs_zerofill(page); + set_page_need_to_zero(page, 1); set_page_bytes_used(page, 0); reset_page_flags(page); bytes_freed += prev_bytes_used; @@ -3458,7 +3473,7 @@ static void free_oldspace(void) gc_dcheck(page_cards_all_marked_nonsticky(last_page)); /* Free the page. */ int used = page_words_used(page); - if (used) set_page_needs_zerofill(page); + if (used) set_page_need_to_zero(page, 1); set_page_bytes_used(page, 0); reset_page_flags(page); bytes_freed += used << WORD_SHIFT; @@ -4456,7 +4471,8 @@ remap_page_range (page_index_t from, page_index_t to) zero_pages(from, to); } #endif - // Zeroing the range clears the need-to-zerofill status implicitly + page_index_t i; + for (i = from; i <= to; i++) set_page_need_to_zero(i, 0); } static void diff --git a/src/runtime/private-cons.inc b/src/runtime/private-cons.inc index 4f748c9ae0..2d15bc22e0 100644 --- a/src/runtime/private-cons.inc +++ b/src/runtime/private-cons.inc @@ -114,7 +114,7 @@ static void release_pages_impl() if (PRIVATE_CONS_DEBUG) fprintf(stderr, "Freeing GC-private page @ %p (index %ld)\n", list, (long)index); - set_page_needs_zerofill(index); + set_page_need_to_zero(index, 1); set_page_bytes_used(index, 0); reset_page_flags(index); } diff --git a/tests/allocator.pure.lisp b/tests/allocator.pure.lisp index 5afa5fb954..a891719d27 100644 --- a/tests/allocator.pure.lisp +++ b/tests/allocator.pure.lisp @@ -8,7 +8,8 @@ (sb-vm:find-page-index (sb-kernel:get-lisp-obj-address x))) 'sb-vm::flags)))) - (logbitp 4 flags)))) ; SINGLE_OBJECT_FLAG + (logbitp 4 ; SINGLE_OBJECT_FLAG + (ldb (byte 6 (+ #+big-endian 2)) flags))))) (compile 'on-large-page-p) ;;; Pseudo-static large objects should retain the single-object flag diff --git a/tests/debug.pure.lisp b/tests/debug.pure.lisp index 9d20bfdaeb..1f8db58cb3 100644 --- a/tests/debug.pure.lisp +++ b/tests/debug.pure.lisp @@ -41,8 +41,9 @@ (declare (ignore widetag)) (let* ((index (sb-vm::find-page-index (sb-kernel:get-lisp-obj-address obj))) - (type (sb-alien:slot (sb-alien:deref sb-vm::page-table index) - 'sb-vm::flags))) + (type (ldb (byte 6 (+ #+big-endian 2)) + (sb-alien:slot (sb-alien:deref sb-vm::page-table index) + 'sb-vm::flags)))) ;; mask off the SINGLE_OBJECT and OPEN_REGION bits (when (and (eq (logand type 7) 2) ; PAGE_TYPE_BOXED ;; Cons cells on boxed pags are page filler diff --git a/tests/gc-testlib.c b/tests/gc-testlib.c index 636fcec039..d449443aaf 100644 --- a/tests/gc-testlib.c +++ b/tests/gc-testlib.c @@ -24,6 +24,7 @@ static void make_instances(int page_type, generation_index_t gen, lispobj result page_table[page].gen = 1; gc_assert(page_table[page].scan_start_offset_ == 0); page_table[page].words_used_ = (2 * GENCGC_CARD_BYTES) >> WORD_SHIFT; + page_table[page].need_zerofill = 1; bytes_allocated += 2 * GENCGC_CARD_BYTES; generations[gen].bytes_allocated += 2 * GENCGC_CARD_BYTES; diff --git a/tests/private-cons.impure.lisp b/tests/private-cons.impure.lisp index 9f3e365604..ea48445d31 100644 --- a/tests/private-cons.impure.lisp +++ b/tests/private-cons.impure.lisp @@ -34,8 +34,8 @@ #+gencgc (progn (defun page-need-to-zero (index) - (let ((addr (+ sb-vm:dynamic-space-start (* index sb-vm:gencgc-page-bytes)))) - (/= 0 (sb-sys:sap-ref-word (sb-sys:int-sap addr) 0)))) + (logbitp #+little-endian 6 #+big-endian 1 + (slot (deref sb-vm::page-table index) 'sb-vm::flags))) (defun test-private-consing () (let ((conses-per-page ; subtract one for the page header cons (1- (/ sb-vm:gencgc-page-bytes (* 2 sb-vm:n-word-bytes)))) From 69b797a59e5c529d6bf52a9b43e3cda7a848245d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 7 Jul 2022 08:16:52 -0400 Subject: [PATCH 3646/4023] Fix arm64 darwin Play some whack-a-mole due to previous revert not applying cleanly --- src/runtime/gencgc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index c0775a213b..4a0c3b6ba9 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -269,7 +269,7 @@ static inline void reset_page_flags(page_index_t page) { #ifdef LISP_FEATURE_DARWIN_JIT // Whenever a page was mapped as code, it potentially needs to be remapped on the next use. // This avoids any affect of pthread_jit_write_protect_np when next used. - if (page_table[page].type == PAGE_TYPE_CODE) set_page_needs_zerofill(page); + if (page_table[page].type == PAGE_TYPE_CODE) set_page_need_to_zero(page, 1); #endif page_table[page].type = 0; page_table[page].dontuse = 0; @@ -1172,6 +1172,9 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re os_invalidate(page_address(remap_from), len); mmap(page_address(remap_from), len, OS_VM_PROT_ALL, MAP_ANON|MAP_PRIVATE|MAP_JIT, -1, 0); + page_index_t p; + // Ensure that zeroize_pages_if_needed() below does ABSOLUTELY NOTHING! + for(p=remap_from; p<=last_page; ++p) set_page_need_to_zero(p,0); } } #endif From b8129f1cfef1d85b9345d2e37bcd228cec765d19 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 7 Jul 2022 08:41:46 -0400 Subject: [PATCH 3647/4023] Checkin some commented-out wrappers on mmap etc --- src/runtime/os-common.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 20fcd44a94..2ce204c10d 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -410,3 +410,44 @@ lispobj* duplicate_codeblob_offheap(lispobj code) memcpy(copy, (char*)code-OTHER_POINTER_LOWTAG, nwords<<WORD_SHIFT); return mem; } + +#if 0 // interceptors for debugging so I don't have to reinvent them every time +static void decode_protbits(int prot, char result[4]) { + result[0] = (prot & PROT_READ) ? 'r' : '-'; + result[1] = (prot & PROT_READ) ? 'w' : '-'; + result[2] = (prot & PROT_READ) ? 'x' : '-'; + result[3] = 0; +} +static void decode_flagbits(int flags, char result[40]) { + char *p = result; + char delim = '{'; +#define APPEND(str) { *p++ = delim; delim = '|'; strcpy(p, str); p += sizeof str-1; } + if (flags & MAP_PRIVATE) APPEND("Pvt"); + if (flags & MAP_ANON) APPEND("Anon"); + if (flags & MAP_NORESERVE) APPEND("NoRsv"); + if (flags & MAP_JIT) APPEND("JIT"); +#undef APPEND + strcpy(p, "}"); +} +void* sbcl_mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) { + char decoded_prot[4], decoded_flags[40]; + decode_protbits(prot, decoded_prot); + decode_flagbits(flags, decoded_flags); + void* result = mmap(addr, length, prot, flags, fd, offset); + fprintf(stderr, "mmap(%p,%lx,%s,%s,%d,%llx)=%p\n", addr, length, + decoded_prot, decoded_flags, fd, offset, result); + return result; +} +int sbcl_munmap(void* addr, size_t length) { + int result = munmap(addr, length); + fprintf(stderr, "munmap(%p,%lx)=%d\n", addr, length, result); + return result; +} +int sbcl_mprotect(void* addr, size_t length, int prot) { + char decoded_prot[4]; + decode_protbits(prot, decoded_prot); + int result = mprotect(addr, length, prot); + fprintf(stderr, "mprotect(%p,%lx,%s)=%d\n", addr, length, decoded_prot, result); + return result; +} +#endif From fb52190dced982fa61465f871662af39e74366ad Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 7 Jul 2022 17:22:47 -0400 Subject: [PATCH 3648/4023] Make more vectors literal data and/or flagged as read-only In preparation for possibly creating a new heap space for read-only leaf objects, I wanted to see how many objects have that nature. And lo and behold, I found that 16% of the base core could potentially be mapped as READONLY + MAP_SHARED instead of RW + MAP_PRIVATE. (I am supposing that this will scale up for real applications) SHARED benefits space accounting, because multiple processes aren't each "charged" for the same memory in containerization systems that require you to specify these kinds of things. And copy-on-write isn't zero-cost. --- src/code/external-formats/mb-util.lisp | 18 ++++++---- src/code/target-hash-table.lisp | 15 +++++++- src/code/target-unicode.lisp | 50 ++++++++++++++------------ src/runtime/os-common.c | 4 +-- tools-for-build/ucd.lisp | 2 ++ 5 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/code/external-formats/mb-util.lisp b/src/code/external-formats/mb-util.lisp index fdeed099de..b1ff4e17b4 100644 --- a/src/code/external-formats/mb-util.lisp +++ b/src/code/external-formats/mb-util.lisp @@ -1,13 +1,17 @@ (in-package "SB-IMPL") (defmacro define-multibyte-mapper (name list) - (let ((list (sort (copy-list list) #'< :key #'car)) - (hi (loop for x in list maximize (max (car x) (cadr x))))) - `(defconstant-eqx ,name - (make-array '(,(length list) 2) - :element-type '(integer 0 ,hi) - :initial-contents ',list) - #'equalp))) + (let* ((list (sort (copy-list list) #'< :key #'car)) + (hi (loop for x in list maximize (max (car x) (cadr x)))) + (array (make-array `(,(length list) 2) + :element-type `(integer 0 ,hi) + :initial-contents list))) + ;; This used to invoke MAKE-ARRAY in the defining form, but a quoted constant + ;; is better - it's literal and therefore implicitly readonly. + ;; And the cross-compiler dumps specialized arrays correctly these days, + ;; but guess what, this is compiled in warm build anyway, so who even cares + ;; what the cross-compiler used to not be OK with? + `(defconstant-eqx ,name ,array #'equalp))) (defun get-multibyte-mapper (table code) (declare (optimize speed #.*safety-0*) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 476e0ba320..26ce0f2ff0 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -1970,10 +1970,23 @@ table itself." ;;; Stuff an association list, or a vector, into HASH-TABLE. Return the hash table, ;;; so that we can use this for the *PRINT-READABLY* case in PRINT-OBJECT (HASH-TABLE T) ;;; without having to worry about LET forms and readable gensyms and stuff. -(defun %stuff-hash-table (hash-table data) +(defun %stuff-hash-table (hash-table data &optional pure) (if (vectorp data) (dovector (x data) (setf (gethash (car x) hash-table) (cdr x))) (dolist (x data) (setf (gethash (car x) hash-table) (cdr x)))) + (when pure + ;; Mark the index vector, next-vector, hash-vector (if present), + ;; and even the key vector, as shareable, provided that no key is hashed + ;; address-sensitively. As a first crack I'm just requiring keys to be + ;; fixnum or character, but some table types would stably hash more things. + (let ((stably-hashed + (loop for k being each hash-key of hash-table + always (typep k '(or fixnum character))))) + (when stably-hashed + (logically-readonlyize (hash-table-pairs hash-table)) + (logically-readonlyize (hash-table-index-vector hash-table)) + (logically-readonlyize (hash-table-next-vector hash-table)) + (awhen (hash-table-hash-vector hash-table) (logically-readonlyize it))))) hash-table) ;;; Return a list of keyword args and values to use for MAKE-HASH-TABLE diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 5eaab2cd0f..5f72004259 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -20,11 +20,12 @@ '#.(plist-to-alist (sb-cold:read-from-file "output/misc-properties.lisp-expr"))))) (sb-ext:define-load-time-global **confusables** - (let* ((data '#.(sb-cold:read-from-file "output/confusables.lisp-expr")) - (hash (make-hash-table :test #'eq #+sb-unicode :size #+sb-unicode (length data)))) - (loop for (source . target) in data + (let ((data '#.(sb-cold:read-from-file "output/confusables.lisp-expr"))) + (sb-impl::%stuff-hash-table + (make-hash-table :test #'eq #+sb-unicode :size #+sb-unicode (length data)) + (loop for (source . target) in data when (and #-sb-unicode (< source char-code-limit)) - do (flet ((minimize (x) + collect (flet ((minimize (x) (case (length x) (1 (elt x 0)) @@ -35,14 +36,15 @@ (t (logically-readonlyize (possibly-base-stringize (map 'string #'code-char x))))))) - (setf (gethash (code-char source) hash) (minimize target)))) - hash)) + (cons (code-char source) (minimize target)))) + t))) (sb-ext:define-load-time-global **bidi-mirroring-glyphs** - (let* ((list '#.(sb-cold:read-from-file "output/bidi-mirrors.lisp-expr")) - (hash (make-hash-table :test #'eq :size (length list)))) - (loop for (k v) in list do (setf (gethash k hash) v)) - hash)) + (let ((list '#.(sb-cold:read-from-file "output/bidi-mirrors.lisp-expr"))) + (sb-impl::%stuff-hash-table + (make-hash-table :test #'eq :size (length list)) + (loop for (k v) in list collect (cons k v)) + t))) ;;; Unicode property access (defun ordered-ranges-member (item vector) @@ -167,12 +169,13 @@ Numeric value is the most general of the Unicode numeric properties. The only constraint on the numeric value is that it be a rational number." (or (gethash character (load-time-value - (let* ((list '#.(sb-cold:read-from-file "output/numerics.lisp-expr")) - (hash (make-hash-table :test #'eq :size (length list)))) - (loop for (k . v) in list - when (< k char-code-limit) - do (setf (gethash (code-char k) hash) v)) - hash) + (let ((list '#.(sb-cold:read-from-file "output/numerics.lisp-expr"))) + (sb-impl::%stuff-hash-table + (make-hash-table :test #'eq :size (length list)) + (loop for (k . v) in list + when (< k char-code-limit) + collect (cons (code-char k) v)) + t)) t)) (digit-value character))) @@ -463,12 +466,13 @@ disappears when accents are placed on top of it. and NIL otherwise" (cond ((gethash (dpb c1 (byte 21 21) c2) (load-time-value - (let* ((data '#.(sb-cold:read-from-file "output/comp.lisp-expr")) - (hash (make-hash-table :size (length data) - #+64-bit :test #+64-bit #'eq))) - (dovector (pair data hash) - (when (< (cdr pair) char-code-limit) ; Why is this even defined if #-sb-unicode? - (setf (gethash (car pair) hash) (code-char (cdr pair)))))) + (let ((data '#.(sb-cold:read-from-file "output/comp.lisp-expr"))) + (sb-impl::%stuff-hash-table + (make-hash-table :size (length data) #+64-bit :test #+64-bit #'eq) + (loop for pair across data + when (< (cdr pair) char-code-limit) ; Why is this even defined if #-sb-unicode? + collect (cons (car pair) (code-char (cdr pair)))) + t)) t))) ((and (eql (composition-hangul-syllable-type c1) :L) (eql (composition-hangul-syllable-type c2) :V)) @@ -1433,7 +1437,7 @@ it defaults to 80 characters" `(load-time-value (sb-impl::%stuff-hash-table (make-hash-table :size ,(length data) #+64-bit :test #+64-bit 'eq) - ',data) + ',data t) t)))) (defun collation-key (string start end) (let (char1 diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 2ce204c10d..941f2b9afa 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -414,8 +414,8 @@ lispobj* duplicate_codeblob_offheap(lispobj code) #if 0 // interceptors for debugging so I don't have to reinvent them every time static void decode_protbits(int prot, char result[4]) { result[0] = (prot & PROT_READ) ? 'r' : '-'; - result[1] = (prot & PROT_READ) ? 'w' : '-'; - result[2] = (prot & PROT_READ) ? 'x' : '-'; + result[1] = (prot & PROT_WRITE) ? 'w' : '-'; + result[2] = (prot & PROT_EXEC) ? 'x' : '-'; result[3] = 0; } static void decode_flagbits(int flags, char result[40]) { diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index 0e9475352c..3606c1d1e0 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -965,6 +965,8 @@ Used to look up block data.") (t first))) ;; Pack the blob of "keys" using 32 bits each (let ((sum 0)) + ;; reversal here is magic. Don't worry about getting it wrong- + ;; unicode-collation.pure checks that. (dolist (part (reverse keys) sum) (setq sum (logior (ash sum 32) part)))))))) (format output ")~%")) From 7b840040bde25df604e774ea08faea26803ef99e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 8 Jul 2022 14:10:56 -0400 Subject: [PATCH 3649/4023] Fix buggy bugfix from 02c44c4076cb --- src/compiler/x86-64/alloc.lisp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index e09bf49266..9078390a3f 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -998,6 +998,9 @@ ;;; Evaluation took: 0.043 seconds of real time ;;; With vop: 0.028 seconds of real time +(eval-when (:compile-toplevel) + (aver (evenp symbol-size))) ; assumptions in the code below + (define-vop (fast-alloc-immobile-symbol) (:results (result :scs (descriptor-reg))) (:temporary (:sc unsigned-reg :offset rax-offset) rax) @@ -1047,7 +1050,7 @@ (inst lea :dword rax (ea (* symbol-size n-word-bytes) rax rcx)) (inst mov :dword (ea rbx) rax) ; store new free_index ;; set the low bit of the 'gens' field - (inst or :lock :byte (ea 3 rbx) 1) + (inst or :lock :byte (ea 7 rbx) 1) ; 7+rbx = &fixedobj_pages[i].attr.parts.gens_ (inst or :byte result other-pointer-lowtag) ; make_lispobj() (inst jmp OUT) FAIL From 8bf7faed6d65396ce914e6e705a06dedacb5c930 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 8 Jul 2022 21:19:49 +0300 Subject: [PATCH 3650/4023] Use tail calls when calling simd-nreverse*. --- src/code/arm64-simd.lisp | 162 +++++++++++++++++++------------------- src/code/seq.lisp | 70 ++++++++-------- src/code/share-vm.lisp | 3 + src/code/simd-fndb.lisp | 8 +- src/code/x86-64-simd.lisp | 32 ++++---- 5 files changed, 142 insertions(+), 133 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 5e19bb5da9..1f99507728 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -58,6 +58,15 @@ ((res complex-double-reg complex-double-float)) (inst movi res value :16b))) +;;; Basically like the x86 with-pinned-object, +;;; but here only the boxed registers are pinned. +;;; This doesn't prevent the var from going to the stack, but none of +;;; the routines should do that. +(defmacro with-pinned-objects-in-registers (vars &body body) + `(multiple-value-prog1 ,@body + ,@(loop for var in vars + collect `(touch-object ,var)))) + (defmacro simd-string-case (a source destination index fallback) `(let ((ascii-p (simd-mask-32 192)) (a-mask (simd-mask-32 ,(char-code a))) @@ -88,83 +97,85 @@ (inst s-and temp temp flip) (inst s-eor res bits temp))))))) -(defun simd-nreverse8 (vector start end) +(defun simd-nreverse8 (result vector start end) (declare ((simple-array * (*)) vector) (fixnum start end) (optimize speed (safety 0))) (let ((sap (vector-sap vector))) - (inline-vop (((left sap-reg t) sap) - ((start any-reg tagged-num) start) - ((end) end) - ((right signed-reg signed-num)) - ((gl)) - ((gr)) - ((vl complex-double-reg complex-double-float)) - ((vr))) - () - (inst add right left (lsr end 1)) - (inst add left left (lsr start 1)) - (inst sub gl right left) - (inst cmp gl 32) - (inst b :lt WORD) - (inst sub right right 16) - - LOOP - (inst ldr vl (@ left)) - (inst ldr vr (@ right)) - - (inst rev64 vl vl) - (inst ext vl vl vl 8) - (inst rev64 vr vr) - (inst ext vr vr vr 8) - - (inst str vr (@ left 16 :post-index)) - (inst str vl (@ right -16 :post-index)) - (inst cmp left right) - (inst b :lt loop) - - (inst add right right 16) - (inst sub tmp-tn right left) - (inst cmp tmp-tn 1) - (inst b :le DONE) - - WORD - (inst sub tmp-tn right left) - (inst cmp tmp-tn 16) - (inst b :lt BYTE) - - (inst ldr gl (@ left)) - (inst ldr gr (@ right -8 :pre-index)) - (inst rev gl gl) - (inst rev gr gr) - (inst str gr (@ left 8 :post-index)) - (inst str gl (@ right)) - - BYTE - (inst sub right right 1) - (inst cmp right left) - (inst b :lt DONE) - - ;; After the 16-element copy above there are at most 15 - ;; elements, have to swap 14 elements with one staying in the - ;; middle. - (loop repeat 7 - do - (inst ldrb gl (@ left)) - (inst ldrb gr (@ right)) - (inst strb gr (@ left 1 :post-index)) - (inst strb gl (@ right -1 :post-index)) - (inst cmp left right) - (inst b :ge DONE)) - DONE)) - vector) - -(defun simd-nreverse32 (vector start end) + (with-pinned-objects-in-registers (vector) + (inline-vop (((left sap-reg t) sap) + ((start any-reg tagged-num) start) + ((end) end) + ((right signed-reg signed-num)) + ((gl)) + ((gr)) + ((vl complex-double-reg complex-double-float)) + ((vr))) + () + (inst add right left (lsr end 1)) + (inst add left left (lsr start 1)) + (inst sub gl right left) + (inst cmp gl 32) + (inst b :lt WORD) + (inst sub right right 16) + + LOOP + (inst ldr vl (@ left)) + (inst ldr vr (@ right)) + + (inst rev64 vl vl) + (inst ext vl vl vl 8) + (inst rev64 vr vr) + (inst ext vr vr vr 8) + + (inst str vr (@ left 16 :post-index)) + (inst str vl (@ right -16 :post-index)) + (inst cmp left right) + (inst b :lt loop) + + (inst add right right 16) + (inst sub tmp-tn right left) + (inst cmp tmp-tn 1) + (inst b :le DONE) + + WORD + (inst sub tmp-tn right left) + (inst cmp tmp-tn 16) + (inst b :lt BYTE) + + (inst ldr gl (@ left)) + (inst ldr gr (@ right -8 :pre-index)) + (inst rev gl gl) + (inst rev gr gr) + (inst str gr (@ left 8 :post-index)) + (inst str gl (@ right)) + + BYTE + (inst sub right right 1) + (inst cmp right left) + (inst b :lt DONE) + + ;; After the 16-element copy above there are at most 15 + ;; elements, have to swap 14 elements with one staying in the + ;; middle. + (loop repeat 7 + do + (inst ldrb gl (@ left)) + (inst ldrb gr (@ right)) + (inst strb gr (@ left 1 :post-index)) + (inst strb gl (@ right -1 :post-index)) + (inst cmp left right) + (inst b :ge DONE)) + DONE))) + result) + +(defun simd-nreverse32 (result vector start end) (declare ((simple-array * (*)) vector) (fixnum start end) (optimize speed (safety 0))) - (let ((sap (vector-sap vector))) - (inline-vop (((left sap-reg t) sap) + + (with-pinned-objects-in-registers (vector) + (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) ((end) end) ((right signed-reg signed-num)) @@ -215,7 +226,7 @@ (inst cmp left right) (inst b :ge DONE)) DONE)) - vector) + result) (defun simd-reverse8 (source start length target) (declare ((simple-array * (*)) vector target) @@ -323,15 +334,6 @@ DONE)) target) -;;; Basically like the x86 with-pinned-object, -;;; but here only the boxed registers are pinned. -;;; This doesn't prevent the var from going to the stack, but none of -;;; the routines should do that. -(defmacro with-pinned-objects-in-registers (vars &body body) - `(multiple-value-prog1 ,@body - ,@(loop for var in vars - collect `(touch-object ,var)))) - (defun simd-cmp-8-32 (byte-array 32-bit-array) (declare ((simple-array * (*)) byte-array 32-bit-array) (optimize speed (safety 0))) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 4117d09a36..6590bf0099 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -962,43 +962,47 @@ many elements are copied." (defun vector-nreverse (vector) (declare (vector vector)) (when (> (length vector) 1) - (with-array-data ((vector vector) (start) (end) - :check-fill-pointer t) - (let ((tag (%other-pointer-widetag vector))) - (cond ((= tag sb-vm:simple-vector-widetag) - (do ((left-index start (1+ left-index)) - (right-index (1- end) (1- right-index))) - ((<= right-index left-index)) - (declare (type index left-index right-index)) - (let ((left (svref vector left-index)) - (right (svref vector right-index))) - (setf (svref vector left-index) right - (svref vector right-index) left)))) - ((word-specialized-vector-tag-p tag) - (nreverse-word-specialized-vector vector start end)) - #+(or arm64 x86-64) - ((typep vector '(or (simple-array base-char (*)) - (simple-array (signed-byte 8) (*)) - (simple-array (unsigned-byte 8) (*)))) - (sb-vm::simd-nreverse8 vector start end)) - #+(or arm64 x86-64) - ((typep vector '(or #+sb-unicode - (simple-array character (*)) - (simple-array (signed-byte 32) (*)) - (simple-array (unsigned-byte 32) (*)) - (simple-array single-float (*)))) - (sb-vm::simd-nreverse32 vector start end)) - (t - (let* ((getter (the function (svref %%data-vector-reffers%% tag))) - (setter (the function (svref %%data-vector-setters%% tag)))) + (let ((original-vector vector)) + (with-array-data ((vector vector) (start) (end) + :check-fill-pointer t + :force-inline t) + (let ((tag (%other-pointer-widetag vector))) + (cond ((= tag sb-vm:simple-vector-widetag) (do ((left-index start (1+ left-index)) (right-index (1- end) (1- right-index))) ((<= right-index left-index)) (declare (type index left-index right-index)) - (let ((left (funcall getter vector left-index)) - (right (funcall getter vector right-index))) - (funcall setter vector left-index right) - (funcall setter vector right-index left))))))))) + (let ((left (svref vector left-index)) + (right (svref vector right-index))) + (setf (svref vector left-index) right + (svref vector right-index) left)))) + ((word-specialized-vector-tag-p tag) + (nreverse-word-specialized-vector vector start end)) + #+(or arm64 x86-64) + ((typep vector '(or (simple-array base-char (*)) + (simple-array (signed-byte 8) (*)) + (simple-array (unsigned-byte 8) (*)))) + (return-from vector-nreverse + (sb-vm::simd-nreverse8 original-vector vector start end))) + #+(or arm64 x86-64) + ((typep vector '(or #+sb-unicode + (simple-array character (*)) + (simple-array (signed-byte 32) (*)) + (simple-array (unsigned-byte 32) (*)) + (simple-array single-float (*)))) + (return-from vector-nreverse + (sb-vm::simd-nreverse32 original-vector vector start end))) + (t + (let* ((getter (the function (svref %%data-vector-reffers%% tag))) + (setter (the function (svref %%data-vector-setters%% tag)))) + (do ((left-index start (1+ left-index)) + (right-index (1- end) (1- right-index))) + ((<= right-index left-index)) + (declare (type index left-index right-index)) + (let ((left (funcall getter vector left-index)) + (right (funcall getter vector right-index))) + (funcall setter vector left-index right) + (funcall setter vector right-index left)))))))))) vector) (defun nreverse (sequence) diff --git a/src/code/share-vm.lisp b/src/code/share-vm.lisp index 0c4fd5d10d..891903d1bc 100644 --- a/src/code/share-vm.lisp +++ b/src/code/share-vm.lisp @@ -153,6 +153,9 @@ (defmacro def-variant (name cpu-feature lambda-list &body body) (let ((variant (symbolicate name '- cpu-feature))) `(progn + (eval-when (:compile-toplevel :load-toplevel :execute) + (setf (info :function :type ',variant) (info :function :type ',name) + (info :function :info ',variant) (info :function :info ',name))) (defun ,variant ,lambda-list ,@body) ;; Avoid STATICALLY-LINK-CORE from making it harder to redefine. diff --git a/src/code/simd-fndb.lisp b/src/code/simd-fndb.lisp index d20a62005f..611549aa8f 100644 --- a/src/code/simd-fndb.lisp +++ b/src/code/simd-fndb.lisp @@ -19,13 +19,13 @@ (defknown (setf vector-ref-128) (128-element t index) (values) ()) -(defknown (simd-nreverse8 simd-nreverse32) ((simple-array * (*)) fixnum fixnum) - (simple-array * (*)) - (sb-c::no-verify-arg-count)) +(defknown (simd-nreverse8 simd-nreverse32) (vector (simple-array * (*)) fixnum fixnum) + vector + (sb-c::fixed-args)) (defknown (simd-reverse8 simd-reverse32) ((simple-array * (*)) fixnum fixnum (simple-array * (*))) (simple-array * (*)) - (sb-c::no-verify-arg-count)) + (sb-c::fixed-args)) (defknown (simd-cmp-8-8 simd-cmp-8-32 simd-cmp-32-32 simd-base-string-equal simd-base-character-string-equal) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index caa2003dcb..d359d9df91 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -82,12 +82,12 @@ (move res bits) (inst pxor res temp))))))) -(defun simd-nreverse8 (vector start end) +(defun simd-nreverse8 (result vector start end) (declare ((simple-array * (*)) vector) (fixnum start end) (optimize speed (safety 0))) - (let ((sap (vector-sap vector))) - (inline-vop (((left sap-reg t) sap) + (with-pinned-objects (vector) + (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) ((end) end) ((right signed-reg signed-num)) @@ -137,7 +137,7 @@ (inst cmp left right) (inst jmp :ge DONE)) DONE)) - vector) + result) (eval-when (:compile-toplevel :load-toplevel :execute) (defun concat-ub8 (ub8s) @@ -152,12 +152,12 @@ do (setf result (logior (ash result 32) ub32))) result))) -(def-variant simd-nreverse8 :avx2 (vector start end) +(def-variant simd-nreverse8 :avx2 (result vector start end) (declare ((simple-array * (*)) vector) (fixnum start end) (optimize speed (safety 0))) - (let ((sap (vector-sap vector))) - (inline-vop (((left sap-reg t) sap) + (with-pinned-objects (vector) + (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) ((end) end) ((right signed-reg signed-num)) @@ -250,14 +250,14 @@ (inst jmp :ge DONE)) DONE)))) - vector) + result) -(defun simd-nreverse32 (vector start end) +(defun simd-nreverse32 (result vector start end) (declare ((simple-array * (*)) vector) (fixnum start end) (optimize speed (safety 0))) - (let ((sap (vector-sap vector))) - (inline-vop (((left sap-reg t) sap) + (with-pinned-objects (vector) + (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) ((end) end) ((right signed-reg signed-num)) @@ -298,14 +298,14 @@ (inst mov :dword (ea left) r) (inst mov :dword (ea right) l) DONE)) - vector) + result) -(def-variant simd-nreverse32 :avx2 (vector start end) +(def-variant simd-nreverse32 :avx2 (result vector start end) (declare ((simple-array * (*)) vector) (fixnum start end) (optimize speed (safety 0))) - (let ((sap (vector-sap vector))) - (inline-vop (((left sap-reg t) sap) + (with-pinned-objects (vector) + (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) ((end) end) ((right signed-reg signed-num)) @@ -385,7 +385,7 @@ (inst mov :dword (ea left) r) (inst mov :dword (ea right) l) DONE)) - vector) + result) (defun simd-reverse8 (source start length target) (declare ((simple-array * (*)) vector target) From 922785b319663f32702e47be344a6f61372e4b24 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 8 Jul 2022 23:38:42 +0300 Subject: [PATCH 3651/4023] Unused variable warning. --- src/code/seq.lisp | 81 +++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 6590bf0099..18db5f41d3 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -959,51 +959,50 @@ many elements are copied." (%vector-raw-bits vector right-index) left))) vector) -(defun vector-nreverse (vector) - (declare (vector vector)) - (when (> (length vector) 1) - (let ((original-vector vector)) - (with-array-data ((vector vector) (start) (end) - :check-fill-pointer t - :force-inline t) - (let ((tag (%other-pointer-widetag vector))) - (cond ((= tag sb-vm:simple-vector-widetag) +(defun vector-nreverse (original-vector) + (declare (vector original-vector)) + (when (> (length original-vector) 1) + (with-array-data ((vector original-vector) (start) (end) + :check-fill-pointer t + :force-inline t) + (let ((tag (%other-pointer-widetag vector))) + (cond ((= tag sb-vm:simple-vector-widetag) + (do ((left-index start (1+ left-index)) + (right-index (1- end) (1- right-index))) + ((<= right-index left-index)) + (declare (type index left-index right-index)) + (let ((left (svref vector left-index)) + (right (svref vector right-index))) + (setf (svref vector left-index) right + (svref vector right-index) left)))) + ((word-specialized-vector-tag-p tag) + (nreverse-word-specialized-vector vector start end)) + #+(or arm64 x86-64) + ((typep vector '(or (simple-array base-char (*)) + (simple-array (signed-byte 8) (*)) + (simple-array (unsigned-byte 8) (*)))) + (return-from vector-nreverse + (sb-vm::simd-nreverse8 original-vector vector start end))) + #+(or arm64 x86-64) + ((typep vector '(or #+sb-unicode + (simple-array character (*)) + (simple-array (signed-byte 32) (*)) + (simple-array (unsigned-byte 32) (*)) + (simple-array single-float (*)))) + (return-from vector-nreverse + (sb-vm::simd-nreverse32 original-vector vector start end))) + (t + (let* ((getter (the function (svref %%data-vector-reffers%% tag))) + (setter (the function (svref %%data-vector-setters%% tag)))) (do ((left-index start (1+ left-index)) (right-index (1- end) (1- right-index))) ((<= right-index left-index)) (declare (type index left-index right-index)) - (let ((left (svref vector left-index)) - (right (svref vector right-index))) - (setf (svref vector left-index) right - (svref vector right-index) left)))) - ((word-specialized-vector-tag-p tag) - (nreverse-word-specialized-vector vector start end)) - #+(or arm64 x86-64) - ((typep vector '(or (simple-array base-char (*)) - (simple-array (signed-byte 8) (*)) - (simple-array (unsigned-byte 8) (*)))) - (return-from vector-nreverse - (sb-vm::simd-nreverse8 original-vector vector start end))) - #+(or arm64 x86-64) - ((typep vector '(or #+sb-unicode - (simple-array character (*)) - (simple-array (signed-byte 32) (*)) - (simple-array (unsigned-byte 32) (*)) - (simple-array single-float (*)))) - (return-from vector-nreverse - (sb-vm::simd-nreverse32 original-vector vector start end))) - (t - (let* ((getter (the function (svref %%data-vector-reffers%% tag))) - (setter (the function (svref %%data-vector-setters%% tag)))) - (do ((left-index start (1+ left-index)) - (right-index (1- end) (1- right-index))) - ((<= right-index left-index)) - (declare (type index left-index right-index)) - (let ((left (funcall getter vector left-index)) - (right (funcall getter vector right-index))) - (funcall setter vector left-index right) - (funcall setter vector right-index left)))))))))) - vector) + (let ((left (funcall getter vector left-index)) + (right (funcall getter vector right-index))) + (funcall setter vector left-index right) + (funcall setter vector right-index left))))))))) + original-vector) (defun nreverse (sequence) "Return a sequence of the same elements in reverse order; the argument From d5e27289e3303d719380e56aef8eab73b31a6a0b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 8 Jul 2022 23:53:52 +0300 Subject: [PATCH 3652/4023] arm64 insts: remove assert-same-size. Too restrictive. --- src/compiler/arm64/insts.lisp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 716cc8fdd3..ff75ea5443 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -157,12 +157,6 @@ (fp-register-p tn))) (tn-offset tn)) -(defmacro assert-same-size (&rest things) - `(assert (= ,@(loop for thing in things - collect `(reg-size ,thing))) - ,things - "Registers should have the same size: ~@{~a~%, ~}" ,@things)) - (define-instruction byte (segment byte) (:emitter (emit-byte segment byte))) @@ -475,7 +469,6 @@ (cond ((or (register-p rm) (shifter-operand-p rm)) (multiple-value-bind (shift amount rm) (encode-shifted-register rm) - (assert-same-size rd rn rm) (emit-add-sub-shift-reg segment size ,op shift (reg-offset rm) amount (reg-offset rn) (reg-offset rd)))) ((extend-p rm) @@ -490,7 +483,6 @@ (:sxtw #b110) (:sxtx #b111))) (rm (extend-register rm))) - (assert-same-size rd rn rm) (emit-add-sub-ext-reg segment size ,op (reg-offset rm) extend shift (reg-offset rn) (reg-offset rd)))) @@ -502,7 +494,6 @@ (not (ldb-test (byte 12 0) imm))) (setf imm (ash imm -12) shift 1)) - (assert-same-size rn rd) (emit-add-sub-imm segment size ,op shift imm (reg-offset rn) (reg-offset rd))))))))) @@ -943,7 +934,6 @@ (t :name)) :tab rd ", " rn (:unless (:same-as rn) ", " rm) ", " imm)) (:emitter - (assert-same-size rd rn rm) (let ((size (reg-size rd))) (emit-extract segment size size (reg-offset rm) @@ -1181,7 +1171,6 @@ ,@(and alias `('(',alias :tab rd ", " rn ", " rm)))) (:emitter - (assert-same-size rd rn rm) (emit-data-processing-2 segment (reg-size rd) (reg-offset rm) ,opc (reg-offset rn) (reg-offset rd))))) From 9d3cab8d54ca4b4d634bd031b29a335a90ef18a7 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 9 Jul 2022 01:33:00 +0300 Subject: [PATCH 3653/4023] Fix -immobile-space. RAX is wired in calls. --- src/compiler/x86-64/vm.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index d233ea8a89..d624111921 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -175,7 +175,7 @@ (defregset *c-call-register-arg-offsets* rdi rsi rdx rcx r8 r9) #+win32 (defregset *c-call-register-arg-offsets* rcx rdx r8 r9) - (defregset *descriptor-args* rdx rdi rsi rax rbx rcx r8 r9 r10 r14 r15)) + (defregset *descriptor-args* rdx rdi rsi rbx rcx r8 r9 r10 r14 r15)) ;;;; SB definitions From 98ca8c12a8fe0f47c5c0f72b933ee34953c2eb71 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 9 Jul 2022 01:48:54 +0300 Subject: [PATCH 3654/4023] Declare the type of hash-table-puthash-impl. So that it can be tail-called by %puthash. --- src/code/hash-table.lisp | 8 ++++---- src/code/target-hash-table.lisp | 11 +++-------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/code/hash-table.lisp b/src/code/hash-table.lisp index fd03507b64..61a71eab2c 100644 --- a/src/code/hash-table.lisp +++ b/src/code/hash-table.lisp @@ -77,10 +77,10 @@ next-vector hash-vector))) - (gethash-impl #'error :type function :read-only t) - (puthash-impl #'error :type function :read-only t) - (remhash-impl #'error :type function :read-only t) - (clrhash-impl #'error :type function :read-only t) + (gethash-impl #'error :type (sfunction * (values t boolean)) :read-only t) + (puthash-impl #'error :type (sfunction * t) :read-only t) + (remhash-impl #'error :type (sfunction * t) :read-only t) + (clrhash-impl #'error :type (sfunction * t) :read-only t) ;; The Key-Value pair vector. ;; Note: this vector has a "high water mark" which resembles a fill ;; pointer, but unlike a fill pointer, GC can ignore elements diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 26ce0f2ff0..636c92dfff 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -1538,9 +1538,7 @@ nnnn 1_ any linear scan ;;; Three argument version of GETHASH (defun gethash3 (key hash-table default) (declare (type hash-table hash-table)) - (funcall (truly-the (sfunction (t t t) (values t boolean)) - (hash-table-gethash-impl hash-table)) - key hash-table default)) + (funcall (hash-table-gethash-impl hash-table) key hash-table default)) ;;; so people can call #'(SETF GETHASH) ;;; FIXME: this function is not mandated. Why do we have it? @@ -1892,15 +1890,12 @@ there was such an entry, or NIL if not." :test (hash-table-test-fun hash-table)))) (when cell (setf (hash-table-%alist hash-table) (delq1 cell (hash-table-%alist hash-table))))) - (funcall (truly-the (sfunction (t t) (values boolean &optional)) - (hash-table-remhash-impl hash-table)) - key hash-table)) + (funcall (hash-table-remhash-impl hash-table) key hash-table)) (defun clrhash (hash-table) "This removes all the entries from HASH-TABLE and returns the hash table itself." - (truly-the (values hash-table &optional) - (funcall (hash-table-clrhash-impl hash-table) hash-table))) + (funcall (hash-table-clrhash-impl hash-table) hash-table)) (defun clrhash-impl (hash-table) ;; This used to do nothing at all for tables that has a COUNT of 0, From 26c31f9e55a0c8eeb6631d392914933fce887250 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 9 Jul 2022 16:21:07 +0300 Subject: [PATCH 3655/4023] def-variant: handle redefinition at run-time. --- src/code/share-vm.lisp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/code/share-vm.lisp b/src/code/share-vm.lisp index 891903d1bc..6dd9824a1e 100644 --- a/src/code/share-vm.lisp +++ b/src/code/share-vm.lisp @@ -160,8 +160,12 @@ ,@body) ;; Avoid STATICALLY-LINK-CORE from making it harder to redefine. (proclaim '(notinline ,name)) - (setf (getf ,(symbolicate '+ cpu-feature '-routines+) (find-fdefn ',name)) - #',variant)))) + (let ((fdefn (find-fdefn ',name)) + (fun (fdefinition ',variant))) + (setf (getf ,(symbolicate '+ cpu-feature '-routines+) fdefn) fun) + ;; Redifinition at run-time. + (when (eq (%fun-name (fdefn-fun fdefn)) ',variant) + (setf (fdefn-fun fdefn) fun)))))) (defvar *previous-cpu-routines* nil) From feb8fbcdeef1b1baecde6fe4b9f4a6599968bbe7 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 9 Jul 2022 18:24:26 +0300 Subject: [PATCH 3656/4023] Minor assembly improvements. --- src/code/arm64-simd.lisp | 10 ++-------- src/code/x86-64-simd.lisp | 36 +++++++++++++++++------------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 1f99507728..057122a438 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -134,13 +134,10 @@ (inst b :lt loop) (inst add right right 16) - (inst sub tmp-tn right left) - (inst cmp tmp-tn 1) - (inst b :le DONE) + (inst sub gl right left) WORD - (inst sub tmp-tn right left) - (inst cmp tmp-tn 16) + (inst cmp gl 16) (inst b :lt BYTE) (inst ldr gl (@ left)) @@ -206,9 +203,6 @@ (inst b :lt loop) (inst add right right 16) - (inst sub tmp-tn right left) - (inst cmp tmp-tn 1) - (inst b :le DONE) SCALAR (inst sub right right 4) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index d359d9df91..a0697eaef8 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -200,12 +200,11 @@ (inst vzeroupper) (inst add right 32) + (inst mov l right) + (inst sub l left) XMM - (inst mov r right) - (inst sub r 32) - (inst cmp r left) - (inst jmp :b WORD) - + (inst cmp l 32) + (inst jmp :l WORD) (inst sub right 16) (inst vmovdqu reverse-mask-xmm reverse-mask-c) (inst vmovdqu vl-xmm (ea left)) @@ -216,12 +215,13 @@ (inst vmovdqu (ea right) vl-xmm) (inst add left 16) + + (inst mov l right) + (inst sub l left) WORD - (inst mov r right) - (inst sub r 16) - (inst cmp r left) - (inst jmp :b BYTE) + (inst cmp l 16) + (inst jmp :l BYTE) (inst sub right 8) (inst mov l (ea left)) @@ -232,7 +232,6 @@ (inst mov (ea right) l) (inst add left 8) - BYTE (inst sub right 1) (inst cmp right left) @@ -344,11 +343,11 @@ (inst vzeroupper) (inst add right 32) + (inst mov l right) + (inst sub l left) XMM - (inst mov r right) - (inst sub r 32) - (inst cmp r left) - (inst jmp :b WORD) + (inst cmp l 32) + (inst jmp :l WORD) (inst sub right 16) (inst vmovdqu vl-xmm (ea left)) @@ -359,12 +358,11 @@ (inst vmovdqu (ea right) vl-xmm) (inst add left 16) + (inst mov l right) + (inst sub l left) WORD - - (inst mov r right) - (inst sub r 16) - (inst cmp r left) - (inst jmp :b SCALAR) + (inst cmp l 16) + (inst jmp :l SCALAR) (inst sub right 8) (inst mov l (ea left)) From 327efdbd76a3a571834fb7c1f5356e1895e79421 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 11 Jul 2022 11:00:45 +0100 Subject: [PATCH 3657/4023] Restore undefined variable warnings The change in d788babebfef30af6ff0a329865de20b849f749f to respect scope of mufflings inadvertently removed warnings from a number of cases, including type and extent declarations and setq forms. Restore them, fixing in the sources a few instances of undefined declarations that have crept in, and an instance in our tests whose behaviour inexplicably changed somehow. This also changes the condition kind of a free, unknown dynamic extent declaration on a variable to a full warning (it was a style warning before). --- NEWS | 7 ++++++ src/code/x86-64-simd.lisp | 8 +++---- src/compiler/ir1-translators.lisp | 1 + src/compiler/ir1report.lisp | 6 ++++++ src/compiler/ir1tran.lisp | 36 ++++++++++++------------------- src/compiler/knownfun.lisp | 5 +++++ tests/compiler.pure-cload.lisp | 3 ++- tests/compiler.test.sh | 24 +++++++++++++++++++++ tests/dynamic-extent.pure.lisp | 2 +- 9 files changed, 64 insertions(+), 28 deletions(-) diff --git a/NEWS b/NEWS index c9cca6a72c..6c621bd2dc 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,12 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- + changes relative to sbcl-2.2.6: + * minor incompatible change: the compiler emits full WARNINGs for undefined + references to variables in TYPE and DYNAMIC-EXTENT declarations, and for + SETQ of an undefined variable. (This was the historic behaviour for + everything except the DYNAMIC-EXTENT case, which used to emit a + STYLE-WARNING, but these diagnostics got lost in a refactoring since + sbcl-2.2.2) * optimization: faster TRUNCATE with float arguments. changes in sbcl-2.2.6 relative to sbcl-2.2.5: diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index a0697eaef8..203e0f5d66 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -386,7 +386,7 @@ result) (defun simd-reverse8 (source start length target) - (declare ((simple-array * (*)) vector target) + (declare ((simple-array * (*)) source target) (fixnum start length) (optimize speed (safety 0))) (let ((source (vector-sap source)) @@ -433,7 +433,7 @@ target) (def-variant simd-reverse8 :avx2 (source start length target) - (declare ((simple-array * (*)) vector target) + (declare ((simple-array * (*)) source target) (fixnum start length) (optimize speed (safety 0))) (let ((source (vector-sap source)) @@ -509,7 +509,7 @@ target) (defun simd-reverse32 (source start length target) - (declare ((simple-array * (*)) vector target) + (declare ((simple-array * (*)) source target) (fixnum start length) (optimize speed (safety 0))) (let ((source (vector-sap source)) @@ -552,7 +552,7 @@ (def-variant simd-reverse32 :avx2 (source start length target) - (declare ((simple-array * (*)) vector target) + (declare ((simple-array * (*)) source target) (fixnum start length) (optimize speed (safety 0))) (let ((source (vector-sap source)) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 5903baf116..426e6e47dc 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -1226,6 +1226,7 @@ care." (let* ((name (first things)) (value-form (second things)) (leaf (or (lexenv-find name vars) (find-free-var name)))) + (maybe-note-undefined-variable-reference leaf name) (etypecase leaf (leaf (when (constant-p leaf) diff --git a/src/compiler/ir1report.lisp b/src/compiler/ir1report.lisp index fb597178d5..432cbd6aa6 100644 --- a/src/compiler/ir1report.lisp +++ b/src/compiler/ir1report.lisp @@ -652,6 +652,12 @@ has written, having proved that it is unreachable.")) (incf (undefined-warning-count res)))))) (values)) +(defun maybe-note-undefined-variable-reference (var name) + (when (and (global-var-p var) + (eq (global-var-kind var) :unknown) + (not (deprecated-thing-p 'variable name))) + (note-undefined-reference name :variable))) + (defun note-key-arg-mismatch (name keys) (let* ((found (find name *argument-mismatch-warnings* diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index e36af9dc92..92548079ec 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -274,16 +274,11 @@ (declaim (end-block)) -(defun maybe-find-free-var (name) - (let ((found (gethash name (free-vars *ir1-namespace*)))) - (unless (eq found :deprecated) - found))) - ;;; Return the LEAF node for a global variable reference to NAME. If ;;; NAME is already entered in (FREE-VARS *IR1-NAMESPACE*), then we just return the ;;; corresponding value. Otherwise, we make a new leaf using ;;; information from the global environment and enter it in -;;; FREE-VARS. If the variable is unknown, then we emit a warning. +;;; FREE-VARS. (declaim (ftype (sfunction (t) (or leaf cons heap-alien-info)) find-free-var)) (defun find-free-var (name &aux (free-vars (free-vars *ir1-namespace*)) (existing (gethash name free-vars))) @@ -708,12 +703,9 @@ ;; processing our own code, though. #+sb-xc-host (warn "reading an ignored variable: ~S" name))) - (when (and (global-var-p var) - (eq (global-var-kind var) :unknown) - (not (deprecated-thing-p 'variable name))) - (note-undefined-reference name :variable)) + (maybe-note-undefined-variable-reference var name) (reference-leaf start next result var name)) - ((cons (eql macro)) ; symbol-macro + ((cons (eql macro)) ; symbol-macro ;; FIXME: the following comment is probably wrong now. ;; If we warn here on :early and :late deprecation ;; then we get an extra warning somehow. @@ -1160,6 +1152,7 @@ (var (or bound-var (lexenv-find var-name vars) (find-free-var var-name)))) + (maybe-note-undefined-variable-reference var var-name) (etypecase var (leaf (flet @@ -1475,22 +1468,21 @@ the stack without triggering overflow protection.") (let* ((bound-var (find-in-bindings vars name)) (var (or bound-var (lexenv-find name vars) - (maybe-find-free-var name)))) + (find-free-var name)))) + (maybe-note-undefined-variable-reference var name) (etypecase var (leaf - (if bound-var - (if (and (leaf-extent var) (neq extent (leaf-extent var))) - (warn "Multiple incompatible extent declarations for ~S?" name) - (setf (leaf-extent var) extent)) - (compiler-notify - "Ignoring free ~S declaration: ~S" kind name))) + (cond + ((and (typep var 'global-var) (eq (global-var-kind var) :unknown))) + (bound-var + (if (and (leaf-extent var) (neq extent (leaf-extent var))) + (warn "Multiple incompatible extent declarations for ~S?" name) + (setf (leaf-extent var) extent))) + (t (compiler-notify "Ignoring free ~S declaration: ~S" kind name)))) (cons (compiler-error "~S on symbol-macro: ~S" kind name)) (heap-alien-info - (compiler-error "~S on alien-variable: ~S" kind name)) - (null - (compiler-style-warn - "Unbound variable declared ~S: ~S" kind name))))) + (compiler-error "~S on alien-variable: ~S" kind name))))) ((and (consp name) (eq (car name) 'function) (null (cddr name)) diff --git a/src/compiler/knownfun.lisp b/src/compiler/knownfun.lisp index 3a946df9e9..43abbe6ede 100644 --- a/src/compiler/knownfun.lisp +++ b/src/compiler/knownfun.lisp @@ -279,6 +279,11 @@ ;;;; generic type inference methods +(defun maybe-find-free-var (name) + (let ((found (gethash name (free-vars *ir1-namespace*)))) + (unless (eq found :deprecated) + found))) + (defun symbol-value-derive-type (node &aux (args (basic-combination-args node)) (lvar (pop args))) (unless (and lvar (endp args)) diff --git a/tests/compiler.pure-cload.lisp b/tests/compiler.pure-cload.lisp index 122ccb37e5..f9016082c6 100644 --- a/tests/compiler.pure-cload.lisp +++ b/tests/compiler.pure-cload.lisp @@ -27,7 +27,8 @@ ;;; isn't declared as a variable, but to set its SYMBOL-VALUE anyway. ;;; ;;; This bug was in sbcl-0.6.11.13. -(print (setq improperly-declared-var '(1 2))) +(locally (declare (sb-ext:muffle-conditions warning)) + (print (setq improperly-declared-var '(1 2)))) (assert (equal (symbol-value 'improperly-declared-var) '(1 2))) (makunbound 'improperly-declared-var) ;;; This is a slightly different way of getting the same symptoms out diff --git a/tests/compiler.test.sh b/tests/compiler.test.sh index ac78ae1a84..4d22c0ded4 100644 --- a/tests/compiler.test.sh +++ b/tests/compiler.test.sh @@ -600,5 +600,29 @@ cat > $tmpfilename <<EOF EOF expect_clean_cload $tmpfilename +# Test compiler warning generation for unbound variables from type declaration... +cat > $tmpfilename <<EOF +(defun foo (bar) + (declare (type vector baz)) + (length bar)) +EOF +expect_failed_compile $tmpfilename + +# ... extent declaration ... +cat > $tmpfilename <<EOF +(defun foo (n) + (declare (type (mod 32) n)) + (let ((vect (make-array n :element-type 'fixnum))) + (declare (dynamic-extent vec)) + (1+ (length vect)))) +EOF +expect_failed_compile $tmpfilename + +# ... and setq +cat > $tmpfilename <<EOF +(setq nonexistent t) +EOF +expect_failed_compile $tmpfilename + # success exit $EXIT_TEST_WIN diff --git a/tests/dynamic-extent.pure.lisp b/tests/dynamic-extent.pure.lisp index c323d50083..09db5d822f 100644 --- a/tests/dynamic-extent.pure.lisp +++ b/tests/dynamic-extent.pure.lisp @@ -1120,7 +1120,7 @@ (test `(lambda () (declare (dynamic-extent #'bar))) :allow-style-warnings 'style-warning) (test `(lambda () (declare (dynamic-extent bar))) - :allow-style-warnings 'style-warning) + :allow-warnings 'warning) (test `(lambda (bar) (cons bar (lambda () (declare (dynamic-extent bar))))) :allow-notes 'sb-ext:compiler-note) (test `(lambda () From 8e358e22a7eedb2a27f6ec4c824838212c3be3fa Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 11 Jul 2022 15:25:07 +0300 Subject: [PATCH 3658/4023] Fix undefined variable warnings. --- src/code/arm64-simd.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 057122a438..497d8e708f 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -223,7 +223,7 @@ result) (defun simd-reverse8 (source start length target) - (declare ((simple-array * (*)) vector target) + (declare ((simple-array * (*)) source target) (fixnum start length) (optimize speed (safety 0))) (let ((source (vector-sap source)) @@ -280,7 +280,7 @@ target) (defun simd-reverse32 (source start length target) - (declare ((simple-array * (*)) vector target) + (declare ((simple-array * (*)) source target) (fixnum start length) (optimize speed (safety 0))) (let ((source (vector-sap source)) From 1b42bf7f732983d545881315c69a47bb60a989dd Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 11 Jul 2022 18:14:46 +0300 Subject: [PATCH 3659/4023] string=*: add explicit-check. --- src/code/string.lisp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index f71a4ec945..a288ef9c30 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -127,9 +127,10 @@ (return nil)))))) (defun string=* (string1 string2 start1 end1 start2 end2) + (declare (explicit-check)) #+(or arm64 (and x86-64 sb-unicode)) - (when (and (zerop start1) - (zerop start2) + (when (and (eql start1 0) + (eql start2 0) (not end1) (not end2)) ;; With the range spanning the whole string it can be compared From cbd51be420a22d0ea479972569c6ebd456041312 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 11 Jul 2022 18:24:57 +0300 Subject: [PATCH 3660/4023] Pass LENGTH to simd-cmp* functions. Avoiding reading it again. --- src/code/arm64-simd.lisp | 32 +++++++++----------- src/code/simd-fndb.lisp | 2 +- src/code/string.lisp | 61 ++++++++++++++++++++------------------- src/code/x86-64-simd.lisp | 7 ++--- 4 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 497d8e708f..f824112f44 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -328,13 +328,12 @@ DONE)) target) -(defun simd-cmp-8-32 (byte-array 32-bit-array) - (declare ((simple-array * (*)) byte-array 32-bit-array) - (optimize speed (safety 0))) +(defun simd-cmp-8-32 (byte-array 32-bit-array length) + (declare (optimize speed (safety 0))) (with-pinned-objects-in-registers (byte-array 32-bit-array) (inline-vop (((byte-array sap-reg t) (vector-sap byte-array)) ((32-bit-array sap-reg t) (vector-sap 32-bit-array)) - ((length any-reg) (length byte-array)) + ((length any-reg) length) ((32-bits complex-double-reg)) ((bytes single-reg)) ((cmp unsigned-reg)) @@ -362,13 +361,12 @@ (inst mov res null-tn) DONE))) -(defun simd-cmp-8-8 (a b) - (declare ((simple-array * (*)) a b) - (optimize speed (safety 0))) +(defun simd-cmp-8-8 (a b length) + (declare (optimize speed (safety 0))) (with-pinned-objects-in-registers (a b) (inline-vop (((a-array sap-reg t) (vector-sap a)) ((b-array sap-reg t) (vector-sap b)) - ((length any-reg) (length a)) + ((length any-reg) length) ((a complex-double-reg)) ((b)) ((cmp unsigned-reg)) @@ -391,13 +389,12 @@ (inst mov res null-tn) DONE))) -(defun simd-cmp-32-32 (a b) - (declare ((simple-array * (*)) a b) - (optimize speed (safety 0))) +(defun simd-cmp-32-32 (a b length) + (declare (optimize speed (safety 0))) (with-pinned-objects-in-registers (a b) (inline-vop (((a-array sap-reg t) (vector-sap a)) ((b-array sap-reg t) (vector-sap b)) - ((length any-reg) (length a)) + ((length any-reg) length) ((a complex-double-reg)) ((b)) ((cmp unsigned-reg)) @@ -420,13 +417,13 @@ (inst mov res null-tn) DONE))) -(defun simd-base-string-equal (a b) +(defun simd-base-string-equal (a b length) (declare (simple-base-string a b) (optimize speed (safety 0))) (with-pinned-objects-in-registers (a b) (inline-vop (((a-array sap-reg t) (vector-sap a)) ((b-array sap-reg t) (vector-sap b)) - ((length any-reg) (length a)) + ((length any-reg) length) ((a complex-double-reg)) ((b)) ((cmp unsigned-reg)) @@ -472,13 +469,12 @@ DONE))) #+sb-unicode -(defun simd-base-character-string-equal (base-string character-string) - (declare ((simple-array * (*)) base-string character-string) - (optimize speed (safety 0))) +(defun simd-base-character-string-equal (base-string character-string length) + (declare (optimize speed (safety 0))) (with-pinned-objects-in-registers (base-string character-string) (inline-vop (((base-string sap-reg t) (vector-sap base-string)) ((character-string sap-reg t) (vector-sap character-string)) - ((length any-reg) (length base-string)) + ((length any-reg) length) ((characters complex-double-reg)) ((base-chars single-reg)) ((cmp unsigned-reg)) diff --git a/src/code/simd-fndb.lisp b/src/code/simd-fndb.lisp index 611549aa8f..e7b74a81c7 100644 --- a/src/code/simd-fndb.lisp +++ b/src/code/simd-fndb.lisp @@ -29,6 +29,6 @@ (defknown (simd-cmp-8-8 simd-cmp-8-32 simd-cmp-32-32 simd-base-string-equal simd-base-character-string-equal) - ((simple-array * (*)) (simple-array * (*))) + ((simple-array * (*)) (simple-array * (*)) fixnum) (boolean) (sb-c::no-verify-arg-count)) diff --git a/src/code/string.lisp b/src/code/string.lisp index a288ef9c30..2ce04b88ae 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -161,22 +161,25 @@ (go normal))) 8-32 (return-from string=* - (and (= (length string1) - (length string2)) - (sb-vm::simd-cmp-8-32 string1 string2))) + (let ((length1 (length string1))) + (and (= length1 + (length string2)) + (sb-vm::simd-cmp-8-32 string1 string2 length1)))) 8-8 #+arm64 (return-from string=* - (and (= (length string1) - (length string2)) - (sb-vm::simd-cmp-8-8 string1 string2))) + (let ((length1 (length string1))) + (and (= length1 + (length string2)) + (sb-vm::simd-cmp-8-8 string1 string2 length1)))) 32-32 #+arm64 (return-from string=* - (and (= (length string1) - (length string2)) - (sb-vm::simd-cmp-32-32 string1 string2))) + (let ((length1 (length string1))) + (and (= length1 + (length string2)) + (sb-vm::simd-cmp-32-32 string1 string2 length1)))) normal)) (with-two-strings string1 string2 start1 end1 nil start2 end2 (let ((len (- end1 start1))) @@ -234,13 +237,12 @@ (when (and (zerop start1) (zerop start2) (not end1) - (not end2) - (simple-base-string-p string1) - (simple-base-string-p string2)) + (not end2)) (return-from simple-base-string= - (and (= (length string1) - (length string2)) - (sb-vm::simd-cmp-8-8 string1 string2)))) + (let ((length1 (length string1))) + (and (= length1 + (length string2)) + (sb-vm::simd-cmp-8-8 string1 string2 length1))))) (with-two-strings string1 string2 start1 end1 nil start2 end2 (let ((len (- end1 start1))) (cond ((/= len (- end2 start2)) @@ -255,16 +257,15 @@ #+sb-unicode (defun simple-character-string= (string1 string2 start1 end1 start2 end2) #+arm64 - (when (and (zerop start1) - (zerop start2) + (when (and (eql start1 0) + (eql start2 0) (not end1) - (not end2) - (simple-character-string-p string1) - (simple-character-string-p string2)) + (not end2)) (return-from simple-character-string= - (and (= (length string1) - (length string2)) - (sb-vm::simd-cmp-32-32 string1 string2)))) + (let ((length1 (length string1))) + (and (= length1 + (length string2)) + (sb-vm::simd-cmp-32-32 string1 string2 length1))))) (with-two-strings string1 string2 start1 end1 nil start2 end2 (let ((len (- end1 start1))) (cond ((/= len (- end2 start2)) @@ -432,14 +433,16 @@ 8-32 #+sb-unicode (return-from two-arg-string-equal - (and (= (length string1) - (length string2)) - (sb-vm::simd-base-character-string-equal string1 string2))) + (let ((length1 (length string1))) + (and (= length1 + (length string2)) + (sb-vm::simd-base-character-string-equal string1 string2 length1)))) 8-8 (return-from two-arg-string-equal - (and (= (length string1) - (length string2)) - (sb-vm::simd-base-string-equal string1 string2))) + (let ((length1 (length string1))) + (and (= length1 + (length string2)) + (sb-vm::simd-base-string-equal string1 string2 length1)))) 32-32 normal) (with-two-arg-strings string1 string2 start1 end1 nil start2 end2 diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 203e0f5d66..27c685b622 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -617,14 +617,13 @@ DONE)) target) -(defun simd-cmp-8-32 (byte-array 32-bit-array) - (declare ((simple-array * (*)) byte-array 32-bit-array) - (optimize speed (safety 0))) +(defun simd-cmp-8-32 (byte-array 32-bit-array length) + (declare (optimize speed (safety 0))) (with-pinned-objects (byte-array 32-bit-array) (inline-vop (((byte-array sap-reg t) (vector-sap byte-array)) ((32-bit-array sap-reg t) (vector-sap 32-bit-array)) ((end)) - ((length any-reg) (length byte-array)) + ((length any-reg) length) ((cmp unsigned-reg)) ((bytes int-sse-reg)) ((32-bits)) From 64245708810072990d9f054820e85bd8c618257f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 11 Jul 2022 18:38:20 +0300 Subject: [PATCH 3661/4023] simd-reverse: rearrange the argument order. For better register utilization, matching the first argument with the result. --- src/code/arm64-simd.lisp | 21 ++++++--------------- src/code/seq.lisp | 4 ++-- src/code/simd-fndb.lisp | 2 +- src/code/x86-64-simd.lisp | 37 +++++++++++-------------------------- 4 files changed, 20 insertions(+), 44 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index f824112f44..6f6c37683b 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -98,9 +98,7 @@ (inst s-eor res bits temp))))))) (defun simd-nreverse8 (result vector start end) - (declare ((simple-array * (*)) vector) - (fixnum start end) - (optimize speed (safety 0))) + (declare (optimize speed (safety 0))) (let ((sap (vector-sap vector))) (with-pinned-objects-in-registers (vector) (inline-vop (((left sap-reg t) sap) @@ -167,10 +165,7 @@ result) (defun simd-nreverse32 (result vector start end) - (declare ((simple-array * (*)) vector) - (fixnum start end) - (optimize speed (safety 0))) - + (declare (optimize speed (safety 0))) (with-pinned-objects-in-registers (vector) (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) @@ -222,10 +217,8 @@ DONE)) result) -(defun simd-reverse8 (source start length target) - (declare ((simple-array * (*)) source target) - (fixnum start length) - (optimize speed (safety 0))) +(defun simd-reverse8 (target source start length) + (declare (optimize speed (safety 0))) (let ((source (vector-sap source)) (target (vector-sap target))) (inline-vop (((source sap-reg t) source) @@ -279,10 +272,8 @@ DONE)) target) -(defun simd-reverse32 (source start length target) - (declare ((simple-array * (*)) source target) - (fixnum start length) - (optimize speed (safety 0))) +(defun simd-reverse32 (target source start length) + (declare (optimize speed (safety 0))) (let ((source (vector-sap source)) (target (vector-sap target))) (inline-vop (((source sap-reg t) source) diff --git a/src/code/seq.lisp b/src/code/seq.lisp index 18db5f41d3..063c55a74c 100644 --- a/src/code/seq.lisp +++ b/src/code/seq.lisp @@ -918,14 +918,14 @@ many elements are copied." ((typep vector '(or (simple-array base-char (*)) (simple-array (signed-byte 8) (*)) (simple-array (unsigned-byte 8) (*)))) - (sb-vm::simd-reverse8 vector start length new-vector)) + (sb-vm::simd-reverse8 new-vector vector start length)) #+(or arm64 x86-64) ((typep vector '(or #+sb-unicode (simple-array character (*)) (simple-array (signed-byte 32) (*)) (simple-array (unsigned-byte 32) (*)) (simple-array single-float (*)))) - (sb-vm::simd-reverse32 vector start length new-vector)) + (sb-vm::simd-reverse32 new-vector vector start length)) (t (let ((getter (the function (svref %%data-vector-reffers%% tag))) (setter (the function (svref %%data-vector-setters%% tag)))) diff --git a/src/code/simd-fndb.lisp b/src/code/simd-fndb.lisp index e7b74a81c7..c8a15b4426 100644 --- a/src/code/simd-fndb.lisp +++ b/src/code/simd-fndb.lisp @@ -23,7 +23,7 @@ vector (sb-c::fixed-args)) -(defknown (simd-reverse8 simd-reverse32) ((simple-array * (*)) fixnum fixnum (simple-array * (*))) +(defknown (simd-reverse8 simd-reverse32) ((simple-array * (*)) (simple-array * (*)) fixnum fixnum) (simple-array * (*)) (sb-c::fixed-args)) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 27c685b622..46633c1e8c 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -153,9 +153,7 @@ result))) (def-variant simd-nreverse8 :avx2 (result vector start end) - (declare ((simple-array * (*)) vector) - (fixnum start end) - (optimize speed (safety 0))) + (declare (optimize speed (safety 0))) (with-pinned-objects (vector) (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) @@ -252,9 +250,7 @@ result) (defun simd-nreverse32 (result vector start end) - (declare ((simple-array * (*)) vector) - (fixnum start end) - (optimize speed (safety 0))) + (declare (optimize speed (safety 0))) (with-pinned-objects (vector) (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) @@ -300,9 +296,7 @@ result) (def-variant simd-nreverse32 :avx2 (result vector start end) - (declare ((simple-array * (*)) vector) - (fixnum start end) - (optimize speed (safety 0))) + (declare (optimize speed (safety 0))) (with-pinned-objects (vector) (inline-vop (((left sap-reg t) (vector-sap vector)) ((start any-reg tagged-num) start) @@ -385,10 +379,8 @@ DONE)) result) -(defun simd-reverse8 (source start length target) - (declare ((simple-array * (*)) source target) - (fixnum start length) - (optimize speed (safety 0))) +(defun simd-reverse8 (target source start length) + (declare (optimize speed (safety 0))) (let ((source (vector-sap source)) (target (vector-sap target))) (inline-vop (((source sap-reg t) source) @@ -432,10 +424,8 @@ DONE)) target) -(def-variant simd-reverse8 :avx2 (source start length target) - (declare ((simple-array * (*)) source target) - (fixnum start length) - (optimize speed (safety 0))) +(def-variant simd-reverse8 :avx2 (target source start length) + (declare (optimize speed (safety 0))) (let ((source (vector-sap source)) (target (vector-sap target))) (inline-vop (((source sap-reg t) source) @@ -508,10 +498,8 @@ DONE)))) target) -(defun simd-reverse32 (source start length target) - (declare ((simple-array * (*)) source target) - (fixnum start length) - (optimize speed (safety 0))) +(defun simd-reverse32 (target source start length) + (declare (optimize speed (safety 0))) (let ((source (vector-sap source)) (target (vector-sap target))) (inline-vop (((source sap-reg t) source) @@ -550,11 +538,8 @@ DONE)) target) - -(def-variant simd-reverse32 :avx2 (source start length target) - (declare ((simple-array * (*)) source target) - (fixnum start length) - (optimize speed (safety 0))) +(def-variant simd-reverse32 :avx2 (target source start length) + (declare (optimize speed (safety 0))) (let ((source (vector-sap source)) (target (vector-sap target))) (inline-vop (((source sap-reg t) source) From 8aaad078cfe78ea246c9e9d8799a41a40e93997b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 11 Jul 2022 23:30:07 -0400 Subject: [PATCH 3662/4023] Update math journal --- float-math.lisp-expr | 63 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index b4f39717bf..3d5458b43b 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -169,6 +169,7 @@ (+ (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA)) #.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) #.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000)) +(+ (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) @@ -189,6 +190,7 @@ (+ (#.(MAKE-DOUBLE-FLOAT #x40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x40100000 #x0)) (+ (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) (+ (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) +(+ (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) (+ (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) (+ (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) (+ (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) @@ -520,6 +522,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) @@ -566,6 +569,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) +(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x538637BD)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) @@ -598,8 +602,10 @@ (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) +(< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) @@ -699,6 +705,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) @@ -722,6 +729,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) T) @@ -767,6 +775,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x1FFFFF #xFFFFFFFE)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) @@ -1042,6 +1051,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) @@ -1183,6 +1193,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) @@ -1306,16 +1317,21 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) T) @@ -1335,7 +1351,10 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x60000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) @@ -1394,7 +1413,9 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) NIL) @@ -1506,6 +1527,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) @@ -1518,10 +1540,13 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -1543,6 +1568,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) @@ -1747,6 +1773,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) @@ -2004,7 +2031,10 @@ (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4E800000) #x0) NIL) @@ -2055,14 +2085,17 @@ (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) +(= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -2100,6 +2133,7 @@ (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) @@ -2110,6 +2144,7 @@ (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) @@ -2144,10 +2179,12 @@ (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) @@ -2341,6 +2378,8 @@ (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -2351,6 +2390,7 @@ (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) +(= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -2428,10 +2468,13 @@ (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0) #x0 #x0) NIL) @@ -2558,12 +2601,14 @@ (> (#.(MAKE-SINGLE-FLOAT #x-368BDC10) #.(MAKE-SINGLE-FLOAT #x497423F0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x-31800000)) NIL) @@ -2677,6 +2722,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x447A0000) #.(MAKE-SINGLE-FLOAT #x447A0000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x49742400) #.(MAKE-SINGLE-FLOAT #x49742400)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) @@ -2685,6 +2731,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) T) +(> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) @@ -2792,6 +2839,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) @@ -2799,8 +2847,10 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) @@ -2969,6 +3019,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) @@ -2990,6 +3041,9 @@ (> (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) @@ -3140,6 +3194,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -3190,6 +3245,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-3FB6F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-31800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-3136F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-22000000)) T) @@ -3351,11 +3407,14 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #x0) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) @@ -3365,10 +3424,12 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x60000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #x0) NIL) @@ -3529,6 +3590,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) @@ -3540,6 +3602,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) From 2faf4b79a7cbe0f218cb6727fb22144c9e270a91 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 11 Jul 2022 23:33:38 -0400 Subject: [PATCH 3663/4023] gc_and_save noticeably faster Don't collect garbage from gen 0 into 1, 1 into 2, ..., 4 into 5. Instead change all objects to generation 0, and collect 0 into 0, Then do it again into lower addresses, which is silly, but only slightly, because we might actually eliminate some objects after coalescing. (I wish we could coalesce when loading fasls instead of core saving, because turning non-EQ objects into EQ is an observable behavior, but no complaints have surfaced in 5 years since rev d4966343ce62) --- src/runtime/core.h | 9 +++++ src/runtime/gc-common.c | 2 +- src/runtime/gc-private.h | 4 ++- src/runtime/gencgc.c | 65 ++++++++++++++++++------------------ src/runtime/immobile-space.c | 53 ++++++++--------------------- src/runtime/immobile-space.h | 2 -- 6 files changed, 59 insertions(+), 76 deletions(-) diff --git a/src/runtime/core.h b/src/runtime/core.h index 9033723c35..bcab13f028 100644 --- a/src/runtime/core.h +++ b/src/runtime/core.h @@ -52,6 +52,14 @@ extern unsigned char build_id[]; char* get_asm_routine_by_name(const char* name, int*); +// Oddly enough, MIPS stopped working with pseudo-static pages after the speedup to +// gc_and_save. I spent a day trying to figure out why, and gave up. +// I surmise that it exposed a bug in the soft card marking implementation +// on MIPS, which considering that we have no evidence that users of SBCL on MIPS exist, +// does not seem important enough to demand a fix. +#ifdef LISP_FEATURE_MIPS +#define CORE_PAGE_GENERATION 0 +#else // By setting this to 0, all objects begin life in the nursery, and nothing // is pseudo-static. As such, any bugs due to code movement are likely to // occur sooner. Or set it to 1 to make things sort of not move immediately. @@ -59,3 +67,4 @@ char* get_asm_routine_by_name(const char* name, int*); //#define CORE_PAGE_GENERATION 0 #define CORE_PAGE_GENERATION PSEUDO_STATIC_GENERATION #endif +#endif diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 0f644297d5..526b5fb027 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -62,7 +62,7 @@ os_vm_size_t dynamic_space_size = DEFAULT_DYNAMIC_SPACE_SIZE; os_vm_size_t thread_control_stack_size = DEFAULT_CONTROL_STACK_SIZE; sword_t (*const scavtab[256])(lispobj *where, lispobj object); -uword_t gc_copied_nwords; +uword_t gc_copied_nwords, gc_in_situ_live_nwords; /* If sb_sprof_enabled was used and the data are not in the final form * (in the *SAMPLES* instance) then all code remains live. diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index e4accf15ae..1ffd661fe1 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -64,7 +64,9 @@ void really_note_transporting(lispobj old,void*new,sword_t nwords); #define NOTE_TRANSPORTING(old, new, nwords) /* do nothing */ #endif -extern uword_t gc_copied_nwords; +// In-situ live objects are those which get logically "moved" from oldspace to newspace +// by frobbing the generation byte in the page table, not copying. +extern uword_t gc_copied_nwords, gc_in_situ_live_nwords; static inline lispobj gc_copy_object(lispobj object, size_t nwords, void* region, int page_type) { diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 4a0c3b6ba9..da1967211b 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1874,6 +1874,7 @@ copy_potential_large_object(lispobj object, sword_t nwords, bytes_allocated -= bytes_freed; /* Add the region to the new_areas if requested. */ + gc_in_situ_live_nwords += nbytes>>WORD_SHIFT; if (boxed_type_p(page_type)) add_new_area(first_page, 0, nbytes); return object; @@ -3414,8 +3415,11 @@ unprotect_oldspace(void) __attribute__((unused)) char *page_addr = 0; uword_t region_bytes = 0; - // should never have protection applied to gen0, do so nothing. - if (from_space == 0) return; + /* Gen0 never has protection applied, so we can usually skip the un-protect step, + * however, in the final GC, because everything got moved to gen0 by brute force + * adjustment of the page table, we don't know the state of the protection. + * Therefore only skip out if NOT in the final GC */ + if (conservative_stack && from_space == 0) return; for (i = 0; i < next_free_page; i++) { #ifdef LISP_FEATURE_SOFT_CARD_MARKS @@ -4379,9 +4383,10 @@ garbage_collect_generation(generation_index_t generation, int raise, // can't use fprintf() inside GC because of malloc. snprintf() can deadlock too, // but seems to do so much less often. int n = snprintf(buffer, sizeof buffer, - "gen%d: %ldw copied in %f sec (%.0f %s/sec)," - " %d pinned objects (%ldw), %ldw freed (%.1f%%)\n", + "gen%d: %ldw copied in %f sec (%.0f %s/sec), %ldw in-situ," + " %d pins (%ldw), %ldw freed (%.1f%%)\n", generation, gc_copied_nwords, et_sec, speed, units, + gc_in_situ_live_nwords, gc_pin_count, gc_pinned_nwords, bytes_freed >> WORD_SHIFT, pct_freed*100.0); write(2, buffer, n); @@ -4390,7 +4395,7 @@ garbage_collect_generation(generation_index_t generation, int raise, root_vector_words_scanned, root_mixed_words_scanned); write(2, buffer, n); } - gc_copied_nwords = gc_pinned_nwords = 0; + gc_copied_nwords = gc_in_situ_live_nwords = gc_pinned_nwords = 0; root_boxed_words_scanned = root_vector_words_scanned = root_mixed_words_scanned = 0; #endif @@ -4574,9 +4579,14 @@ collect_garbage(generation_index_t last_gen) ensure_region_closed(code_region, PAGE_TYPE_CODE); if (gencgc_verbose > 2) fprintf(stderr, "[%d] BEGIN gc(%d)\n", n_gcs, last_gen); - /* Immobile space generation bits are lazily updated for gen0 - (not touched on every object allocation) so do it now */ - update_immobile_nursery_bits(); +#ifdef LISP_FEATURE_IMMOBILE_SPACE + if (ENABLE_PAGE_PROTECTION) { + // Unprotect the in-use ranges. Any page could be written during scavenge + os_protect((os_vm_address_t)FIXEDOBJ_SPACE_START, + (lispobj)fixedobj_free_pointer - FIXEDOBJ_SPACE_START, + OS_VM_PROT_ALL); + } +#endif lispobj* cur_thread_approx_stackptr = (lispobj*)ALIGN_DOWN((uword_t)&last_gen, N_WORD_BYTES); @@ -5434,9 +5444,8 @@ zero_all_free_ranges() /* called only by gc_and_save() */ * * + Single-object pages aren't moved by the GC, so we need to * unset that flag from all pages. - * + The pseudo-static generation isn't normally collected, but it seems - * reasonable to collect it at least when saving a core. So move the - * pages to a normal generation. + * + Change all pages' generations to 0 so that we can do all the collection + * in a single invocation of collect_generation() * + Instances on unboxed pages need to have their layout pointer visited, * so all pages have to be turned to boxed. */ @@ -5454,11 +5463,12 @@ prepare_for_final_gc () // which were relocated to unboxed pages get scanned and fixed. if ((page_table[i].type & PAGE_TYPE_MASK) == PAGE_TYPE_UNBOXED) page_table[i].type = PAGE_TYPE_MIXED; - if (page_table[i].gen == PSEUDO_STATIC_GENERATION) { + generation_index_t gen = page_table[i].gen; + if (gen != 0) { int used = page_bytes_used(i); - page_table[i].gen = HIGHEST_NORMAL_GENERATION; - generations[PSEUDO_STATIC_GENERATION].bytes_allocated -= used; - generations[HIGHEST_NORMAL_GENERATION].bytes_allocated += used; + page_table[i].gen = 0; + generations[gen].bytes_allocated -= used; + generations[0].bytes_allocated += used; } } @@ -5470,14 +5480,8 @@ prepare_for_final_gc () char *end = (char*)thread + dynamic_values_bytes; memset(start, 0, end-start); #endif - // Make sure that it's done after zeroing above, the GC needs to - // see a list there -#ifdef PINNED_OBJECTS - struct thread *th; - for_each_thread(th) { - write_TLS(PINNED_OBJECTS, NIL, th); - } -#endif + // After zeroing, make sure PINNED_OBJECTS is a list again. + write_TLS(PINNED_OBJECTS, NIL, thread); } /* Set this switch to 1 for coalescing of strings dumped to fasl, @@ -5551,20 +5555,15 @@ gc_and_save(char *filename, boolean prepend_runtime, * as empty pages, because we can't represent discontiguous ranges. */ conservative_stack = 0; - /* We MUST collect all generations now, or else the coalescing by similarity - * would have to be extra cautious not to create any old->young pointers. - * Resetting oldest_gen_to_gc to its default is legal, because it is merely - * a hint to the collector that no significant amount of memory would be - * freed by increasingly aggressive levels of collection. It is NOT a mandate - * that some objects be retained despite appearing to be unreachable. - */ - gencgc_oldest_gen_to_gc = HIGHEST_NORMAL_GENERATION; + gencgc_oldest_gen_to_gc = 0; // From here on until exit, there is no chance of continuing // in Lisp if something goes wrong during GC. + pre_verify_gen_0 = 1; prepare_for_final_gc(); unwind_binding_stack(); gencgc_alloc_start_page = next_free_page; - collect_garbage(HIGHEST_NORMAL_GENERATION+1); + collect_garbage(0); + verify_heap(0, VERIFY_POST_GC); THREAD_JIT(0); @@ -5585,7 +5584,7 @@ gc_and_save(char *filename, boolean prepend_runtime, if (verbose) { printf("[performing final GC..."); fflush(stdout); } prepare_for_final_gc(); gencgc_alloc_start_page = 0; - collect_garbage(HIGHEST_NORMAL_GENERATION+1); + collect_garbage(0); /* All global allocation regions should be empty */ ASSERT_REGIONS_CLOSED(); // Enforce (rather, warn for lack of) self-containedness of the heap diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 800ba19534..835465f94d 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -358,20 +358,6 @@ Threads A, and B, and C each want to claim index 6. #define calc_max_used_fixedobj_page() find_fixedobj_page_index(fixedobj_free_pointer-1) #define calc_max_used_varyobj_page() find_varyobj_page_index(varyobj_free_pointer-1) -void update_immobile_nursery_bits() -{ - if (ENABLE_PAGE_PROTECTION) { - // Unprotect the in-use ranges. Any page could be written during scavenge - os_protect((os_vm_address_t)FIXEDOBJ_SPACE_START, - (lispobj)fixedobj_free_pointer - FIXEDOBJ_SPACE_START, - OS_VM_PROT_ALL); - } - -#ifdef VERIFY_PAGE_GENS - check_varyobj_pages(); -#endif -} - /* Turn a white object grey. Also enqueue the object for re-scan if required */ void enliven_immobile_obj(lispobj *ptr, int rescan) // a native pointer @@ -1267,8 +1253,7 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t varyobj_len) page_attributes_valid = 1; } -// Demote pseudo-static to highest normal generation -// so that all objects become eligible for collection. +// Change all objects to generation 0 void prepare_immobile_space_for_final_gc() { int page; @@ -1278,38 +1263,28 @@ void prepare_immobile_space_for_final_gc() // The list of holes need not be saved. SYMBOL(IMMOBILE_FREELIST)->value = NIL; - // This scan allow dissimilar object sizes. In the grand scheme of things - // it's not terribly important to optimize out the calls to the sizing function - // for the pages which have a unique size of object. for (page = 0, page_base = fixedobj_page_address(page) ; page_base < page_end ; page_base += IMMOBILE_CARD_BYTES, ++page) { - unsigned char mask = fixedobj_pages[page].gens; - if (mask & 1<<PSEUDO_STATIC_GENERATION) { - lispobj* obj = (lispobj*)page_base; - lispobj* limit = (lispobj*)((uword_t)obj + IMMOBILE_CARD_BYTES); - for ( ; obj < limit ; obj += object_size(obj) ) - if (other_immediate_lowtag_p(*obj) && - immobile_obj_gen_bits(obj) == PSEUDO_STATIC_GENERATION) - assign_generation(obj, HIGHEST_NORMAL_GENERATION); - fixedobj_pages[page].gens = (mask & ~(1<<PSEUDO_STATIC_GENERATION)) - | 1<<HIGHEST_NORMAL_GENERATION; + lispobj* obj = (lispobj*)page_base; + lispobj* limit = (lispobj*)((uword_t)obj + IMMOBILE_CARD_BYTES); + // Never set the generation mask on an empty page! + int spacing = fixedobj_page_obj_align(page) >> WORD_SHIFT; + if (spacing) { + for ( ; obj < limit ; obj += spacing ) { + if (other_immediate_lowtag_p(*obj) && immobile_obj_gen_bits(obj) != 0) + assign_generation(obj, 0); + } + fixedobj_pages[page].gens = 1; // only generation 0 is present } } lispobj* obj = (lispobj*)VARYOBJ_SPACE_START; lispobj* limit = varyobj_free_pointer; for ( ; obj < limit ; obj += headerobj_size(obj) ) { - if (immobile_obj_gen_bits(obj) == PSEUDO_STATIC_GENERATION) - assign_generation(obj, HIGHEST_NORMAL_GENERATION); - } - int max_page = find_varyobj_page_index(limit-1); - for ( page = 0 ; page <= max_page ; ++page ) { - int mask = varyobj_pages[page].generations; - if (mask & (1<<PSEUDO_STATIC_GENERATION)) { - varyobj_pages[page].generations - = (mask & ~(1<<PSEUDO_STATIC_GENERATION)) - | 1<<HIGHEST_NORMAL_GENERATION; + if (!filler_obj_p(obj) && immobile_obj_gen_bits(obj) != 0) { + assign_generation(obj, 0); + varyobj_pages[find_varyobj_page_index(obj)].generations = 1; } } } diff --git a/src/runtime/immobile-space.h b/src/runtime/immobile-space.h index 726f27ea98..80869432c7 100644 --- a/src/runtime/immobile-space.h +++ b/src/runtime/immobile-space.h @@ -23,7 +23,6 @@ extern void prepare_immobile_space_for_final_gc(void); extern void prepare_immobile_space_for_save(boolean verbose); extern boolean immobile_space_preserve_pointer(void*); -extern void update_immobile_nursery_bits(void); extern void scavenge_immobile_roots(generation_index_t,generation_index_t); extern void scavenge_immobile_newspace(void); extern void sweep_immobile_space(int raise); @@ -118,7 +117,6 @@ static inline boolean immobile_space_p(lispobj __attribute__((unused)) obj) { re #define scavenge_immobile_roots(dummy1,dummy2) #define scavenge_immobile_newspace(dummy) #define sweep_immobile_space(dummy) -#define update_immobile_nursery_bits() #define write_protect_immobile_space() #define immobile_scav_queue_count 0 #define immobile_card_protected_p(dummy) (0) From 16cacefc61f82116327f19dac83bcc715f36f3b4 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 15:12:19 +0300 Subject: [PATCH 3664/4023] Correct the type of unary-truncate-double-float-to-bignum for 32-bit. It might return most-positive-fixnum there, as double-floats still have enough precision after 29 bits. --- src/compiler/fndb.lisp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index a22f0e5bd6..34f7b75127 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -350,11 +350,12 @@ (defknown unary-truncate-single-float-to-bignum (single-float) (values bignum (eql $0f0)) (foldable movable flushable fixed-args)) (defknown unary-truncate-double-float-to-bignum (double-float) - (values bignum (and - #+(and 64-bit - (not (or riscv ppc64))) ;; they can't survive cold-init - (eql $0d0) - double-float)) + (values #+64-bit bignum #-64-bit integer + (and + #+(and 64-bit + (not (or riscv ppc64))) ;; they can't survive cold-init + (eql $0d0) + double-float)) (foldable movable flushable fixed-args)) (defknown %unary-truncate-single-float-to-bignum (single-float) bignum From bae62226891274dbf9c539f5adc35fed69f74be3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 15:17:43 +0300 Subject: [PATCH 3665/4023] Compare against most--fixnum--float. Instead of (coerce most--fixnum float). It's not the same depending on the fixnum length. --- src/code/float.lisp | 138 ++++++++++++++++++----------------- src/code/target-sxhash.lisp | 7 +- src/compiler/float-tran.lisp | 10 ++- 3 files changed, 80 insertions(+), 75 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index dd8736adbd..fd14990e67 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -546,54 +546,55 @@ ;;; caller if needed. ;;; ;;; In the float case, we pick off small arguments so that compiler -;;; can use special-case operations. We use an exclusive test, since -;;; (due to round-off error), (float most-positive-fixnum) is likely -;;; to be equal to (1+ most-positive-fixnum). An exclusive test is -;;; good enough, because most-positive-fixnum will be one less than a -;;; power of two, and that power of two will be exactly representable -;;; as a float (at least until we get 128-bit fixnums). +;;; can use special-case operations. (defun %unary-truncate (number) - (number-dispatch ((number real)) - ((integer) number) - ((ratio) (values (truncate (numerator number) (denominator number)))) - (((foreach single-float double-float #+long-float long-float)) - (if (and (<= (float most-negative-fixnum number) number) - (< number (float most-positive-fixnum number))) - (truly-the fixnum (%unary-truncate number)) - (multiple-value-bind (bits exp sign) (integer-decode-float number) - (ash (if (minusp sign) - (- bits) - bits) - exp)))))) + (macrolet ((fits-fixnum (type) + `(<= ,(symbolicate 'most-negative-fixnum- type) + number + ,(symbolicate 'most-positive-fixnum- type)))) + (number-dispatch ((number real)) + ((integer) number) + ((ratio) (values (truncate (numerator number) (denominator number)))) + (((foreach single-float double-float #+long-float long-float)) + (if (fits-fixnum (dispatch-type number)) + (truly-the fixnum (%unary-truncate number)) + (multiple-value-bind (bits exp sign) (integer-decode-float number) + (ash (if (minusp sign) + (- bits) + bits) + exp))))))) ;;; Produce both values, unlike %unary-truncate (defun unary-truncate (number) - (number-dispatch ((number real)) - ((integer) (values number 0)) - ((ratio) - (let ((truncated (truncate (numerator number) (denominator number)))) - (values truncated - (- number truncated)))) - (((foreach single-float double-float #+long-float long-float)) - (if (and (<= (float most-negative-fixnum number) number) - (< number (float most-positive-fixnum number))) - (let* ((truncated (truly-the fixnum (%unary-truncate number)))) - (values truncated - (- number - (coerce truncated '(dispatch-type number))))) - (multiple-value-bind (bits exp sign) (integer-decode-float number) - (let ((truncated (ash (if (minusp sign) - (- bits) - bits) - exp))) - (values - truncated - #+64-bit - (coerce 0 '(dispatch-type number)) - #-64-bit - (if (eq '(dispatch-type number) 'single-float) - (coerce 0 '(dispatch-type number)) - (- number (coerce truncated '(dispatch-type number))))))))))) + (macrolet ((fits-fixnum (type) + `(<= ,(symbolicate 'most-negative-fixnum- type) + number + ,(symbolicate 'most-positive-fixnum- type)))) + (number-dispatch ((number real)) + ((integer) (values number 0)) + ((ratio) + (let ((truncated (truncate (numerator number) (denominator number)))) + (values truncated + (- number truncated)))) + (((foreach single-float double-float #+long-float long-float)) + (if (fits-fixnum (dispatch-type number)) + (let* ((truncated (truly-the fixnum (%unary-truncate number)))) + (values truncated + (- number + (coerce truncated '(dispatch-type number))))) + (multiple-value-bind (bits exp sign) (integer-decode-float number) + (let ((truncated (ash (if (minusp sign) + (- bits) + bits) + exp))) + (values + truncated + #+64-bit + (coerce 0 '(dispatch-type number)) + #-64-bit + (if (eq '(dispatch-type number) 'single-float) + (coerce 0 '(dispatch-type number)) + (- number (coerce truncated '(dispatch-type number)))))))))))) (macrolet ((def (type) `(defun ,(symbolicate 'unary-truncate- type '-to-bignum) (number) @@ -625,8 +626,9 @@ ;;; Specialized versions for floats. (macrolet ((def (type name) `(defun ,name (number) - (if (and (<= ,(coerce most-negative-fixnum type) number) - (< number ,(coerce most-positive-fixnum type))) + (if (<= ,(symbolicate 'most-negative-fixnum- type) + number + ,(symbolicate 'most-positive-fixnum- type)) (truly-the fixnum (,name number)) ;; General -- slow -- case. (multiple-value-bind (bits exp) (integer-decode-float number) @@ -646,27 +648,29 @@ ;;; so all single-floats larger than most-positive-fixnum can be precisely ;;; represented by an integer.] (defun %unary-round (number) - (number-dispatch ((number real)) - ((integer) number) - ((ratio) (values (round (numerator number) (denominator number)))) - (((foreach single-float double-float #+long-float long-float)) - (if (< (float most-negative-fixnum number) - number - (float most-positive-fixnum number)) - (truly-the fixnum (%unary-round number)) - (multiple-value-bind (bits exp) (integer-decode-float number) - (let* ((shifted (ash bits exp)) - (rounded (if (minusp exp) - (let ((fractional-bits (logand bits (lognot (ash -1 (- exp))))) - (0.5bits (ash 1 (- -1 exp)))) - (cond - ((> fractional-bits 0.5bits) (1+ shifted)) - ((< fractional-bits 0.5bits) shifted) - (t (if (oddp shifted) (1+ shifted) shifted)))) - shifted))) - (if (minusp number) - (- rounded) - rounded))))))) + (macrolet ((fits-fixnum (type) + `(<= ,(symbolicate 'most-negative-fixnum- type) + number + ,(symbolicate 'most-positive-fixnum- type)))) + (number-dispatch ((number real)) + ((integer) number) + ((ratio) (values (round (numerator number) (denominator number)))) + (((foreach single-float double-float #+long-float long-float)) + (if (fits-fixnum (dispatch-type number)) + (truly-the fixnum (%unary-round number)) + (multiple-value-bind (bits exp) (integer-decode-float number) + (let* ((shifted (ash bits exp)) + (rounded (if (minusp exp) + (let ((fractional-bits (logand bits (lognot (ash -1 (- exp))))) + (0.5bits (ash 1 (- -1 exp)))) + (cond + ((> fractional-bits 0.5bits) (1+ shifted)) + ((< fractional-bits 0.5bits) shifted) + (t (if (oddp shifted) (1+ shifted) shifted)))) + shifted))) + (if (minusp number) + (- rounded) + rounded)))))))) #-round-float (defun %unary-ftruncate (number) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 1bd42e9f19..c2b86bbdf8 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -358,13 +358,12 @@ ;;; like SXHASH, but for EQUALP hashing instead of EQUAL hashing (macrolet ((hash-float (type key) ;; Floats that represent integers must hash as the integer would. - (let ((lo (coerce most-negative-fixnum type)) - (hi (coerce most-positive-fixnum type))) + (let ((lo (symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type))) + (hi (symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type)))) `(let ((key ,key)) (cond (;; This clause allows FIXNUM-sized integer ;; values to be handled without consing. - (and (<= ,lo key) - (< key ,hi)) + (<= ,lo key ,hi) (multiple-value-bind (q r) (floor (the (,type ,lo ,hi) key)) (if (zerop (the ,type r)) (sxhash q) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 4c209096f6..e7a616811d 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1641,8 +1641,9 @@ (macrolet ((def (type) `(deftransform unary-truncate ((number) (,type)) - '(if (and (<= (float most-negative-fixnum number) number) - (< number (float most-positive-fixnum number))) + '(if (<= ,(package-symbolicate :sb-kernel 'most-negative-fixnum- type) + number + ,(package-symbolicate :sb-kernel 'most-positive-fixnum- type)) (let ((truncated (truly-the fixnum (%unary-truncate number)))) (values truncated (- number @@ -1667,8 +1668,9 @@ (unary-to-bignum (symbolicate '%unary-truncate- type '-to-bignum)) (coerce (symbolicate "%" type)) (unary `(lambda (number) - (if (and (<= ,(coerce most-negative-fixnum type) number) - (< number ,(coerce most-positive-fixnum type))) + (if (<= ,(package-symbolicate :sb-kernel 'most-negative-fixnum- type) + number + ,(package-symbolicate :sb-kernel 'most-positive-fixnum- type)) (truly-the fixnum (,unary number)) (,unary-to-bignum number))))) `(deftransform truncate ((x &optional y) From ae5b3d160fe261206ae421851bf16979cb267b17 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 15:32:14 +0300 Subject: [PATCH 3666/4023] Inline integer-decode-float in unary-truncate-float-to-bignum. To avoid consing. --- src/code/float.lisp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index fd14990e67..250d16d05b 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -597,19 +597,21 @@ (- number (coerce truncated '(dispatch-type number)))))))))))) (macrolet ((def (type) - `(defun ,(symbolicate 'unary-truncate- type '-to-bignum) (number) - (multiple-value-bind (bits exp sign) (integer-decode-float number) - (let ((truncated (ash (if (minusp sign) - (- bits) - bits) - exp))) - (values - truncated - ,(case type - ((single-float #+64-bit double-float) - `(coerce 0 ',type)) - (t - `(- number (coerce truncated ',type)))))))))) + (let ((decode (symbolicate 'integer-decode- type))) + `(defun ,(symbolicate 'unary-truncate- type '-to-bignum) (number) + (declare (inline ,decode)) + (multiple-value-bind (bits exp sign) (,decode number) + (let ((truncated (ash (if (minusp sign) + (- bits) + bits) + exp))) + (values + truncated + ,(case type + ((single-float #+64-bit double-float) + `(coerce 0 ',type)) + (t + `(- number (coerce truncated ',type))))))))))) (def double-float) (def single-float)) From 88e6e32cc926d132236b9826b8809cd60cfca2b1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 15:48:35 +0300 Subject: [PATCH 3667/4023] Fix gc-cardmark.impure There's no update_immobile_nursery_bits anymore. --- tests/gc-testlib.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/gc-testlib.c b/tests/gc-testlib.c index d449443aaf..976b46cf8b 100644 --- a/tests/gc-testlib.c +++ b/tests/gc-testlib.c @@ -65,13 +65,12 @@ static void make_instances(int page_type, generation_index_t gen, lispobj result static void perform_gc(lispobj* stackptr) { - extern void close_current_thread_tlab(), update_immobile_nursery_bits(); + extern void close_current_thread_tlab(); extern void garbage_collect_generation(generation_index_t, int, void*); gc_active_p = 1; gc_close_collector_regions(0); // TODO: should be THREAD_PAGE_FLAG close_current_thread_tlab(); - update_immobile_nursery_bits(); verify_heap(stackptr, VERIFY_PRE_GC); garbage_collect_generation(0, 0, stackptr); gc_active_p = 0; From f3e51a268de882fa2bce4080a03f1c780ee2d972 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 16:40:41 +0300 Subject: [PATCH 3668/4023] Don't cons when hashing large floats. Replicate the logic of bignum-ashift-left-fixnum and mix enough zeros. --- float-math.lisp-expr | 14 ++++++++++++ src/code/float.lisp | 39 ++++++++++++++++++++++++++++++++++ src/code/target-sxhash.lisp | 20 +++++++++++------ src/cold/build-order.lisp-expr | 4 ++-- src/cold/exports.lisp | 1 + src/compiler/fndb.lisp | 5 +++++ tests/hash.pure.lisp | 4 +++- 7 files changed, 78 insertions(+), 9 deletions(-) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 3d5458b43b..f47da5616f 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -287,6 +287,7 @@ (- (#.(MAKE-SINGLE-FLOAT #x-32000000) #x20000000) #.(MAKE-SINGLE-FLOAT #x-31800000)) (- (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) #.(MAKE-SINGLE-FLOAT #x-31800000)) (- (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) #.(MAKE-SINGLE-FLOAT #x-22000000)) +(- (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) #.(MAKE-SINGLE-FLOAT #x-21000000)) (- (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) #.(MAKE-SINGLE-FLOAT #x-21000000)) (- (#.(MAKE-SINGLE-FLOAT #x0) #x64) #.(MAKE-SINGLE-FLOAT #x-3D380000)) (- (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) #.(MAKE-SINGLE-FLOAT #x-32000000)) @@ -297,6 +298,7 @@ (- (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x4E000000)) (- (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) #.(MAKE-SINGLE-FLOAT #x5E000000)) (- (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x5D800000)) +(- (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) #.(MAKE-SINGLE-FLOAT #x5F000000)) (- (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) #.(MAKE-SINGLE-FLOAT #x5F000000)) (- (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x5E800000)) (- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x134) #.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA)) @@ -308,6 +310,7 @@ (- (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) (- (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) +(- (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x64) #.(MAKE-DOUBLE-FLOAT #x-3FA70000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) @@ -327,6 +330,7 @@ (- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) (- (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) +(- (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) (/ (#x0 #.(MAKE-SINGLE-FLOAT #x3089705F)) #.(MAKE-SINGLE-FLOAT #x0)) @@ -922,6 +926,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -1867,6 +1872,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xE0000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) @@ -2003,6 +2009,7 @@ (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E000000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5F000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) @@ -2149,6 +2156,7 @@ (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x1FFFFF #xFFFFFFFE) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -2752,6 +2760,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) @@ -2886,6 +2895,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xE0000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) NIL) @@ -3059,6 +3069,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) @@ -3328,6 +3339,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) @@ -3623,6 +3635,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -3794,6 +3807,7 @@ (COERCE (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x60000000)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5D800000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5E490FDB) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000)) +(COERCE (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xE0000000)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5E800000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5F490FDB) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x60000000)) (COERCE (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-40800000)) diff --git a/src/code/float.lisp b/src/code/float.lisp index 250d16d05b..92dc30a949 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -625,6 +625,45 @@ (def double-float) (def single-float)) +;;; Needs to be synchronized with sxhash-bignum +(macrolet ((def (type) + (let ((decode (symbolicate 'integer-decode- type))) + `(defun ,(symbolicate 'sxhash-bignum- type) (number) + (declare (inline ,decode)) + (let ((result 316495330) + (digit-size sb-bignum::digit-size)) + (declare (type fixnum result)) + (multiple-value-bind (bits exp sign) (,decode number) + (let ((bits (if (minusp sign) + (- bits) + bits))) + (multiple-value-bind (digits remaining) (truncate exp digit-size) + (dotimes (i digits) + do (mixf result 0)) + ;; Taken from bignum-ashift-left-fixnum. + (let* ((right-half (ldb (byte digit-size 0) + (ash bits remaining))) + (sign-bit-p + (logbitp (1- digit-size) right-half)) + (left-half (ash bits + (- remaining digit-size))) + (left-half-p (if sign-bit-p + (/= left-half -1) + (/= left-half 0)))) + (mixf result + (logand most-positive-fixnum + (logxor right-half + (ash right-half -7)))) + (when left-half-p + (let ((left-half (ldb (byte digit-size 0) left-half))) + (mixf result + (logand most-positive-fixnum + (logxor left-half + (ash left-half -7)))))))))) + result))))) + (def double-float) + (def single-float)) + ;;; Specialized versions for floats. (macrolet ((def (type name) `(defun ,name (number) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index c2b86bbdf8..b43f793e22 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -359,12 +359,14 @@ (macrolet ((hash-float (type key) ;; Floats that represent integers must hash as the integer would. (let ((lo (symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type))) - (hi (symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type)))) + (hi (symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type))) + (bignum-hash (symbolicate 'sxhash-bignum- type))) `(let ((key ,key)) + (declare (inline float-infinity-p)) (cond (;; This clause allows FIXNUM-sized integer ;; values to be handled without consing. (<= ,lo key ,hi) - (multiple-value-bind (q r) (floor (the (,type ,lo ,hi) key)) + (multiple-value-bind (q r) (truly-the fixnum (floor (the (,type ,lo ,hi) key))) (if (zerop (the ,type r)) (sxhash q) (sxhash (coerce key 'double-float))))) @@ -373,11 +375,17 @@ (if (minusp key) (sxhash sb-ext:single-float-negative-infinity) (sxhash sb-ext:single-float-positive-infinity))) + #+64-bit (t - (multiple-value-bind (q r) (floor key) - (if (zerop (the ,type r)) - (sxhash q) - (sxhash (coerce key 'double-float)))))))))) + (,bignum-hash key)) + #-64-bit + (t + ,(if (eq type 'double-float) + `(multiple-value-bind (q r) (floor key) + (if (zerop (the ,type r)) + (sxhash q) + (sxhash key))) + (,bignum-hash key)))))))) (defun psxhash (key) (declare (optimize speed)) (labels diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 83204529b6..35d7327c3c 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -252,6 +252,8 @@ ;; around the compilation of "code/class". Why? ("src/code/class" :c-headers) ("src/pcl/pre-warm") + ("src/code/number-dispatch" :not-host) + ("src/code/float-inf-nan" :not-host) ("src/code/target-sxhash" :not-host) ; needs most-fooative-foo-float constants ("src/code/debug-info" :c-headers) @@ -323,8 +325,6 @@ ("src/code/unix" :not-host) ("src/code/symbol" :not-host) ("src/code/bignum" :not-host #-(or bignum-assertions sb-devel) :block-compile) - ("src/code/number-dispatch" :not-host) - ("src/code/float-inf-nan" :not-host) ("src/code/numbers" :not-host) ("src/code/float-trap" :not-host) ("src/code/float" :not-host) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 2dbdaad95d..a6c61c2c2b 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1964,6 +1964,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "UNARY-TRUNCATE-DOUBLE-FLOAT-TO-BIGNUM" "%UNARY-TRUNCATE-SINGLE-FLOAT-TO-BIGNUM" "%UNARY-TRUNCATE-DOUBLE-FLOAT-TO-BIGNUM" + "SXHASH-BIGNUM-DOUBLE-FLOAT" "SXHASH-BIGNUM-SINGLE-FLOAT" "%WITH-ARRAY-DATA" "%WITH-ARRAY-DATA/FP" diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 34f7b75127..ce53eb548f 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -363,6 +363,11 @@ (defknown %unary-truncate-double-float-to-bignum (double-float) bignum (foldable movable flushable fixed-args)) +(defknown sxhash-bignum-double-float (double-float) hash-code + (foldable movable flushable fixed-args)) +(defknown sxhash-bignum-single-float (single-float) hash-code + (foldable movable flushable fixed-args)) + (defknown %multiply-high (word word) word (movable foldable flushable)) diff --git a/tests/hash.pure.lisp b/tests/hash.pure.lisp index ac4462bcf2..4d2ff89213 100644 --- a/tests/hash.pure.lisp +++ b/tests/hash.pure.lisp @@ -405,7 +405,9 @@ (assert-error (sxhash displaced-string)))) (with-test (:name :array-psxhash-non-consing :skipped-on :interpreter) - (let ((a (make-array 1000 :element-type 'double-float))) + (let ((a (make-array 1000 :element-type 'double-float + :initial-element (+ 0d0 #+(or arm64 x86-64) + 1d300)))) (ctu:assert-no-consing (sb-int:psxhash a)))) (with-test (:name :array-psxhash) From edfc64f40def8a1f11e61539159f284c0f2cb3ea Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 17:28:03 +0300 Subject: [PATCH 3669/4023] Remove unused constants. --- src/compiler/generic/early-vm.lisp | 9 --------- tests/arith.pure.lisp | 12 ++++++++++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index bc65bb196c..8ba89af537 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -124,15 +124,6 @@ ;;; running full tilt will exhaust this faster, but it's still plenty enough. (defconstant sb-kernel::internal-time-bits 61) -(defconstant most-positive-exactly-single-float-fixnum - (min (expt 2 single-float-digits) most-positive-fixnum)) -(defconstant most-negative-exactly-single-float-fixnum - (max (- (expt 2 single-float-digits)) most-negative-fixnum)) -(defconstant most-positive-exactly-double-float-fixnum - (min (expt 2 double-float-digits) most-positive-fixnum)) -(defconstant most-negative-exactly-double-float-fixnum - (max (- (expt 2 double-float-digits)) most-negative-fixnum)) - ;;;; Point where continuous area starting at dynamic-space-start bumps into ;;;; next space. Computed for genesis/constants.h, not used in Lisp. #+(and gencgc sb-xc-host) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index 426cc495d2..d779542679 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -286,6 +286,15 @@ (assert-error (funcall fn 1) division-by-zero)))) (mapc #'frob '(mod truncate rem / floor ceiling)))) +(defconstant most-positive-exactly-single-float-fixnum + (min (expt 2 sb-vm:single-float-digits) most-positive-fixnum)) +(defconstant most-negative-exactly-single-float-fixnum + (max (- (expt 2 sb-vm:single-float-digits)) most-negative-fixnum)) +(defconstant most-positive-exactly-double-float-fixnum + (min (expt 2 sb-vm:double-float-digits) most-positive-fixnum)) +(defconstant most-negative-exactly-double-float-fixnum + (max (- (expt 2 sb-vm:double-float-digits)) most-negative-fixnum)) + ;; Check that the logic in SB-KERNEL::BASIC-COMPARE for doing fixnum/float ;; comparisons without rationalizing the floats still gives the right anwers ;; in the edge cases (had a fencepost error). @@ -294,8 +303,7 @@ floats (start (- ,(find-symbol (format nil "MOST-~A-EXACTLY-~A-FIXNUM" - sign type) - :sb-kernel) + sign type)) ,range))) (dotimes (i (1+ (* ,range 2))) (let* ((x (+ start i)) From 4b0099e54d3c900eda8bca422acf88305826c438 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 17:34:47 +0300 Subject: [PATCH 3670/4023] Revert "Remove unused constants." This reverts commit edfc64f40def8a1f11e61539159f284c0f2cb3ea. Turns out it's used on x86-only. --- src/compiler/generic/early-vm.lisp | 9 +++++++++ tests/arith.pure.lisp | 12 ++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index 8ba89af537..bc65bb196c 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -124,6 +124,15 @@ ;;; running full tilt will exhaust this faster, but it's still plenty enough. (defconstant sb-kernel::internal-time-bits 61) +(defconstant most-positive-exactly-single-float-fixnum + (min (expt 2 single-float-digits) most-positive-fixnum)) +(defconstant most-negative-exactly-single-float-fixnum + (max (- (expt 2 single-float-digits)) most-negative-fixnum)) +(defconstant most-positive-exactly-double-float-fixnum + (min (expt 2 double-float-digits) most-positive-fixnum)) +(defconstant most-negative-exactly-double-float-fixnum + (max (- (expt 2 double-float-digits)) most-negative-fixnum)) + ;;;; Point where continuous area starting at dynamic-space-start bumps into ;;;; next space. Computed for genesis/constants.h, not used in Lisp. #+(and gencgc sb-xc-host) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index d779542679..426cc495d2 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -286,15 +286,6 @@ (assert-error (funcall fn 1) division-by-zero)))) (mapc #'frob '(mod truncate rem / floor ceiling)))) -(defconstant most-positive-exactly-single-float-fixnum - (min (expt 2 sb-vm:single-float-digits) most-positive-fixnum)) -(defconstant most-negative-exactly-single-float-fixnum - (max (- (expt 2 sb-vm:single-float-digits)) most-negative-fixnum)) -(defconstant most-positive-exactly-double-float-fixnum - (min (expt 2 sb-vm:double-float-digits) most-positive-fixnum)) -(defconstant most-negative-exactly-double-float-fixnum - (max (- (expt 2 sb-vm:double-float-digits)) most-negative-fixnum)) - ;; Check that the logic in SB-KERNEL::BASIC-COMPARE for doing fixnum/float ;; comparisons without rationalizing the floats still gives the right anwers ;; in the edge cases (had a fencepost error). @@ -303,7 +294,8 @@ floats (start (- ,(find-symbol (format nil "MOST-~A-EXACTLY-~A-FIXNUM" - sign type)) + sign type) + :sb-kernel) ,range))) (dotimes (i (1+ (* ,range 2))) (let* ((x (+ start i)) From 604eb05f925588ea49ce0b809c2b7a813b6cf602 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 17:36:34 +0300 Subject: [PATCH 3671/4023] Fix 32-bit. --- src/code/target-sxhash.lisp | 2 +- tests/float.pure.lisp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index b43f793e22..b05beeb0a5 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -385,7 +385,7 @@ (if (zerop (the ,type r)) (sxhash q) (sxhash key))) - (,bignum-hash key)))))))) + `(,bignum-hash key)))))))) (defun psxhash (key) (declare (optimize speed)) (labels diff --git a/tests/float.pure.lisp b/tests/float.pure.lisp index 9bc9670b7b..95c6106182 100644 --- a/tests/float.pure.lisp +++ b/tests/float.pure.lisp @@ -526,12 +526,12 @@ (with-test (:name :conservative-floor-bounds) (assert - (equal (sb-kernel:%simple-fun-type - (checked-compile - `(lambda (x) - (declare (unsigned-byte x)) - (values (truncate 1.0 x))))) - '(function (unsigned-byte) (values unsigned-byte &optional))))) + (subtypep (second (third (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (x) + (declare (unsigned-byte x)) + (values (truncate 1.0 x))))))) + 'unsigned-byte))) (with-test (:name :single-float-sign-stubs) (checked-compile-and-assert From 20b0d74db959f84e731ef8509507d3a97f90cb1b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 12 Jul 2022 13:39:07 -0400 Subject: [PATCH 3672/4023] Improve style I didn't even realize that "if (x);" is legal C syntax (when THREAD_JIT is #defined to be nothing) --- src/runtime/gencgc.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index da1967211b..69090d43bd 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1417,11 +1417,9 @@ void *gc_alloc_large(sword_t nbytes, int page_type) // Anyway it's best if the new page resembles a valid object ASAP. uword_t nwords = nbytes >> WORD_SHIFT; lispobj* addr = (lispobj*)page_address(first_page); - if (locked) - THREAD_JIT(0); + if (locked) { THREAD_JIT(0); } *addr = make_filler_header(nwords); - if (locked) // avoid enabling while GCing - THREAD_JIT(1); + if (locked) { THREAD_JIT(1); } // avoid enabling while GCing os_vm_size_t scan_start_offset = 0; for (page = first_page; page < last_page; ++page) { From 0399cf0328db4e4a1464181e5ab7462f1588a840 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 12 Jul 2022 23:30:23 +0300 Subject: [PATCH 3673/4023] Fix cold init on some backends. #-(or x86 x86-64 arm64) platforms can't handle float constants without load-time-value functions, which run after their values are needed in cold-init. Reported by Bruce O'Neel. --- src/code/float.lisp | 16 ++++++++-------- src/compiler/float-tran.lisp | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index 92dc30a949..516409b76b 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -549,9 +549,9 @@ ;;; can use special-case operations. (defun %unary-truncate (number) (macrolet ((fits-fixnum (type) - `(<= ,(symbolicate 'most-negative-fixnum- type) + `(<= ,(symbol-value (symbolicate 'most-negative-fixnum- type)) number - ,(symbolicate 'most-positive-fixnum- type)))) + ,(symbol-value (symbolicate 'most-positive-fixnum- type))))) (number-dispatch ((number real)) ((integer) number) ((ratio) (values (truncate (numerator number) (denominator number)))) @@ -567,9 +567,9 @@ ;;; Produce both values, unlike %unary-truncate (defun unary-truncate (number) (macrolet ((fits-fixnum (type) - `(<= ,(symbolicate 'most-negative-fixnum- type) + `(<= ,(symbol-value (symbolicate 'most-negative-fixnum- type)) number - ,(symbolicate 'most-positive-fixnum- type)))) + ,(symbol-value (symbolicate 'most-positive-fixnum- type))))) (number-dispatch ((number real)) ((integer) (values number 0)) ((ratio) @@ -667,9 +667,9 @@ ;;; Specialized versions for floats. (macrolet ((def (type name) `(defun ,name (number) - (if (<= ,(symbolicate 'most-negative-fixnum- type) + (if (<= ,(symbol-value (symbolicate 'most-negative-fixnum- type)) number - ,(symbolicate 'most-positive-fixnum- type)) + ,(symbol-value (symbolicate 'most-positive-fixnum- type))) (truly-the fixnum (,name number)) ;; General -- slow -- case. (multiple-value-bind (bits exp) (integer-decode-float number) @@ -690,9 +690,9 @@ ;;; represented by an integer.] (defun %unary-round (number) (macrolet ((fits-fixnum (type) - `(<= ,(symbolicate 'most-negative-fixnum- type) + `(<= ,(symbol-value (symbolicate 'most-negative-fixnum- type)) number - ,(symbolicate 'most-positive-fixnum- type)))) + ,(symbol-value (symbolicate 'most-positive-fixnum- type))))) (number-dispatch ((number real)) ((integer) number) ((ratio) (values (round (numerator number) (denominator number)))) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index e7a616811d..63e275579c 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1641,9 +1641,9 @@ (macrolet ((def (type) `(deftransform unary-truncate ((number) (,type)) - '(if (<= ,(package-symbolicate :sb-kernel 'most-negative-fixnum- type) + '(if (<= ,(symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type)) number - ,(package-symbolicate :sb-kernel 'most-positive-fixnum- type)) + ,(symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type))) (let ((truncated (truly-the fixnum (%unary-truncate number)))) (values truncated (- number @@ -1668,9 +1668,9 @@ (unary-to-bignum (symbolicate '%unary-truncate- type '-to-bignum)) (coerce (symbolicate "%" type)) (unary `(lambda (number) - (if (<= ,(package-symbolicate :sb-kernel 'most-negative-fixnum- type) + (if (<= ,(symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type)) number - ,(package-symbolicate :sb-kernel 'most-positive-fixnum- type)) + ,(symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type))) (truly-the fixnum (,unary number)) (,unary-to-bignum number))))) `(deftransform truncate ((x &optional y) From 5cad4b2fa44b6e865cf5168003286878b02c3b1b Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Tue, 12 Jul 2022 14:44:30 +0100 Subject: [PATCH 3674/4023] Typo fixes. --- src/code/target-unicode.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 5f72004259..03f4037f1c 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -1550,7 +1550,7 @@ If :STRICT is NIL, UNICODE= tests compatibility equavalence instead." (defun unicode-equal (string1 string2 &key (start1 0) end1 (start2 0) end2 (strict t)) "Determines whether STRING1 and STRING2 are canonically equivalent after -casefoldin8 (that is, ignoring case differences) according to Unicode. The +casefolding (that is, ignoring case differences) according to Unicode. The START and END arguments behave like the arguments to STRING=. If :STRICT is NIL, UNICODE= tests compatibility equavalence instead." (let ((str1 (normalize-string (subseq string1 start1 end1) (if strict :nfd :nfkd))) @@ -1561,7 +1561,7 @@ NIL, UNICODE= tests compatibility equavalence instead." (defun unicode< (string1 string2 &key (start1 0) end1 (start2 0) end2) "Determines whether STRING1 sorts before STRING2 using the Unicode Collation -Algorithm, The function uses an untailored Default Unicode Collation Element Table +Algorithm. The function uses an untailored Default Unicode Collation Element Table to produce the sort keys. The function uses the Shifted method for dealing with variable-weight characters, as described in UTS #10" (let* ((s1 (subseq string1 start1 end1)) From 35bc9e7fa728550bbe03650ddf270d0008522a0d Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Tue, 12 Jul 2022 20:37:21 +0100 Subject: [PATCH 3675/4023] Update to Unicode 10.0 This update principally expands the character repertoire, and additionally brings minor changes to the collation and word/grapheme/line breaking algorithms. --- NEWS | 3 + src/code/target-unicode.lisp | 58 +- tests/data/CollationTest_SHIFTED_SHORT.txt | 4017 +- tests/data/DerivedBidiClass.txt | 142 +- tests/data/GraphemeBreakProperty.txt | 78 +- tests/data/GraphemeBreakTest.txt | 175 +- tests/data/HangulSyllableType.txt | 6 +- tests/data/LineBreakTest.txt | 23 +- tests/data/NormalizationTest.txt | 30 +- tests/data/SentenceBreakProperty.txt | 66 +- tests/data/SentenceBreakTest.txt | 17 +- tests/data/WordBreakProperty.txt | 105 +- tests/data/WordBreakTest.txt | 263 +- tools-for-build/BidiMirroring.txt | 24 +- tools-for-build/Blocks.txt | 17 +- tools-for-build/CaseFolding.txt | 8 +- tools-for-build/CompositionExclusions.txt | 6 +- tools-for-build/DerivedAge.txt | 57 +- tools-for-build/DerivedNormalizationProps.txt | 6 +- tools-for-build/EastAsianWidth.txt | 90 +- tools-for-build/Jamo.txt | 8 +- tools-for-build/LineBreak.txt | 147 +- tools-for-build/NormalizationCorrections.txt | 10 +- tools-for-build/PropList.txt | 83 +- tools-for-build/Scripts.txt | 129 +- tools-for-build/SpecialCasing.txt | 8 +- tools-for-build/UnicodeData.txt | 1028 +- tools-for-build/allkeys.txt | 56368 ++++++++-------- tools-for-build/more-ucd-consts.lisp-expr | 3 +- tools-for-build/ucd.lisp | 15 +- 30 files changed, 34513 insertions(+), 28477 deletions(-) diff --git a/NEWS b/NEWS index 6c621bd2dc..692020eceb 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,9 @@ changes relative to sbcl-2.2.6: everything except the DYNAMIC-EXTENT case, which used to emit a STYLE-WARNING, but these diagnostics got lost in a refactoring since sbcl-2.2.2) + * enhancement: Unicode support has been updated to support version 10.0.0 of + the Unicode standard, including addition of characters and refinements to + breaking and collation algorithms. * optimization: faster TRUNCATE with float arguments. changes in sbcl-2.2.6 relative to sbcl-2.2.5: diff --git a/src/code/target-unicode.lisp b/src/code/target-unicode.lisp index 03f4037f1c..1868bc39e5 100644 --- a/src/code/target-unicode.lisp +++ b/src/code/target-unicode.lisp @@ -802,8 +802,9 @@ The result is not guaranteed to have the same length as the input." #x26F9 #x270A #x270B #x270C #x270D #x1F385 - #x1F3C3 #x1F3C4 - #x1F3CA #x1F3CB + #x1F3C2 #x1F3C3 #x1F3C4 + #x1F3C7 + #x1F3CA #x1F3CB #x1F3CC #x1F442 #x1F443 #x1F446 #x1F447 #x1F448 #x1F449 #x1F44A #x1F44B #x1F44C #x1F44D #x1F44E #x1F44F #x1F450 #x1F46E @@ -812,7 +813,7 @@ The result is not guaranteed to have the same length as the input." #x1F481 #x1F482 #x1F483 #x1F485 #x1F486 #x1F487 #x1F4AA - #x1F575 + #x1F574 #x1F575 #x1F57A #x1F590 #x1F595 #x1F596 @@ -821,15 +822,38 @@ The result is not guaranteed to have the same length as the input." #x1F6A3 #x1F6B4 #x1F6B5 #x1F6B6 #x1F6C0 - #x1F918 #x1F919 #x1F91A #x1F91B #x1F91C #x1F91D #x1F91E + #x1F6CC + #x1F918 #x1F919 #x1F91A #x1F91B #x1F91C + #x1F91E #x1F91F #x1F926 - #x1F930 - #x1F933 #x1F934 #x1F935 #x1F936 #x1F937 #x1F938 #x1F939 - #x1F93C #x1F93D #x1F93E))) + #x1F930 #x1F931 #x1F932 #x1F933 #x1F934 #x1F935 #x1F936 #x1F937 #x1F938 #x1F939 + #x1F93D #x1F93E + #x1F9D1 #x1F9D2 #x1F9D3 #x1F9D4 #x1F9D5 #x1F9D6 #x1F9D7 #x1F9D8 #x1F9D9 #x1F9DA #x1F9DB #x1F9DC #x1F9DD)) + (glue-after-zwj + #(#x2640 + #x2642 + #x2695 #x2696 + #x2708 + #x2764 + #x1F308 + #x1F33E + #x1F373 + #x1F393 + #x1F3A4 + #x1F3A8 + #x1F3EB + #x1F3ED + #x1F48B + #x1F4BB #x1F4BC + #x1F527 + #x1F52C + #x1F5E8 + #x1F680 + #x1F692))) (cond ((binary-search code e-base) :e-base) ((<= #x1F3FB code #x1F3FF) :e-modifier) - ((or (= code #x2764) (= code #x1F48B) (= code #x1F5E8)) :glue-after-zwj) + ((binary-search code glue-after-zwj) :glue-after-zwj) ((<= #x1F466 code #x1F469) :e-base-gaz)))) (defun grapheme-break-class (char) @@ -943,6 +967,11 @@ grapheme breaking rules specified in UAX #29, returning a list of strings." #(#x3031 #x3035 #x309B #x309C #x30A0 #x30A0 #x30FC #x30FC #xFF70 #xFF70))) + (also-aletter + #(#x02C2 #x02C3 #x02C4 #x02C5 #x02D2 #x02D3 #x02D4 #x02D5 #x02D6 #x02D7 + #x02DE #x02DF #x02ED #x02EF #x02F0 #x02F1 #x02F2 #x02F3 #x02F4 #x02F5 + #x02F6 #x02F7 #x02F8 #x02F9 #x02FA #x02FB #x02FC #x02FD #x02FE #x02FF + #x05F3 #xA720 #xA721 #xA789 #xA78A #xAB5B)) (midnumlet #(#x002E #x2018 #x2019 #x2024 #xFE52 #xFF07 #xFF0E)) (midletter #(#x003A #x00B7 #x002D7 #x0387 #x05F4 #x2027 #xFE13 #xFE55 #xFF1A)) @@ -956,14 +985,14 @@ grapheme breaking rules specified in UAX #29, returning a list of strings." ((= cp 13) :CR) ((ordered-ranges-member cp newlines) :newline) ((or (eql (grapheme-break-class char) :extend) - (eql gc :mc)) :extend) + (and (eql gc :mc) (not (= cp #x200D)))) :extend) ((= cp #x200D) :zwj) ((<= #x1F1E6 cp #x1F1FF) :regional-indicator) ((and (eql gc :Cf) (not (<= #x200B cp #x200D))) :format) ((or (eql (script char) :katakana) (ordered-ranges-member cp also-katakana)) :katakana) ((and (eql (script char) :Hebrew) (eql gc :lo)) :hebrew-letter) - ((and (or (alphabetic-p char) (= cp #x05F3)) + ((and (or (alphabetic-p char) (binary-search cp also-aletter)) (not (or (ideographic-p char) (eql (line-break-class char) :sa) (eql (script char) :hiragana)))) :aletter) @@ -1461,15 +1490,18 @@ it defaults to 80 characters" (when (char= (code-char 0) char2 char3) (let* ((unified-ideograph-p (proplist-p char1 :unified-ideograph)) (tangut-p (<= #x17000 code1 #x18AFF)) + (nushu-p (<= #x1B170 code1 #x1B2FF)) + (boffset 0) (base (cond ((and unified-ideograph-p (or (<= #x4E00 code1 #x9FFF) (<= #xF900 code1 #xFAFF))) #xFB40) (unified-ideograph-p #xFB80) - (tangut-p #xFB00) + (tangut-p (setq boffset #x17000) #xFB00) + (nushu-p (setq boffset #x1B170) #xFB01) (t #xFBC0))) - (a (+ base (if tangut-p 0 (ash code1 -15)))) - (b (logior #x8000 (if tangut-p (- code1 #x17000) (logand code1 #x7FFF))))) + (a (+ base (if (or tangut-p nushu-p) 0 (ash code1 -15)))) + (b (logior #x8000 (if (or tangut-p nushu-p) (- code1 boffset) (logand code1 #x7FFF))))) (list (list a #x20 #x2) (list b 0 0))))))))) (defun sort-key (string) diff --git a/tests/data/CollationTest_SHIFTED_SHORT.txt b/tests/data/CollationTest_SHIFTED_SHORT.txt index 8091f9c864..2aff0cfdef 100644 --- a/tests/data/CollationTest_SHIFTED_SHORT.txt +++ b/tests/data/CollationTest_SHIFTED_SHORT.txt @@ -1,10 +1,10 @@ # CollationTest_SHIFTED_SHORT.txt -# Date: 2016-04-04, 20:31:42 GMT -# © 2016 Unicode®, Inc. +# Date: 2017-06-05, 23:16:56 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html -# UCA Version: 9.0.0 -# UCD Version: 9.0.0 +# UCA Version: 10.0.0 +# UCD Version: 10.0.0 # For a description of the format and usage, see CollationTest.html 0009 0021 @@ -205,6 +205,8 @@ FF1B 003F 2E35 003F A6F6 0021 A6F6 003F +2E49 0021 +2E49 003F 2A74 0021 2A74 003F 003A 0021 @@ -515,6 +517,7 @@ A6F4 003F 1CE7 0021 1CE8 0021 1CF4 0021 +1CF7 0021 1CF8 0021 1CF9 0021 200B 0021 @@ -1373,6 +1376,7 @@ FF01 003F 1CE7 003F 1CE8 003F 1CF4 003F +1CF7 003F 1CF8 003F 1CF9 003F 200B 003F @@ -2905,6 +2909,14 @@ FF05 003F 2E1F 003F 2E44 0021 2E44 003F +2E45 0021 +2E45 003F +2E46 0021 +2E46 003F +2E47 0021 +2E47 003F +2E48 0021 +2E48 003F A67E 0021 A67E 003F 055A 0021 @@ -2986,6 +2998,8 @@ A8FA 0021 A8FA 003F A8FC 0021 A8FC 003F +09FD 0021 +09FD 003F 0AF0 0021 0AF0 003F 0DF4 0021 @@ -3046,6 +3060,54 @@ AADF 003F 0FD9 003F 0FDA 0021 0FDA 003F +11A3F 0334 +11A3F 0021 +11A3F 003F +11A40 0334 +11A40 0021 +11A40 003F +11A41 0334 +11A41 0021 +11A41 003F +11A42 0334 +11A42 0021 +11A42 003F +11A43 0334 +11A43 0021 +11A43 003F +11A44 0334 +11A44 0021 +11A44 003F +11A45 0334 +11A45 0021 +11A45 003F +11A46 0334 +11A46 0021 +11A46 003F +11A9A 0334 +11A9A 0021 +11A9A 003F +11A9B 0334 +11A9B 0021 +11A9B 003F +11A9C 0334 +11A9C 0021 +11A9C 003F +11A9E 0334 +11A9E 0021 +11A9E 003F +11A9F 0334 +11A9F 0021 +11A9F 003F +11AA0 0334 +11AA0 0021 +11AA0 003F +11AA1 0334 +11AA1 0021 +11AA1 003F +11AA2 0334 +11AA2 0021 +11AA2 003F 11C70 0334 11C70 0021 11C70 003F @@ -5446,6 +5508,8 @@ FF5E 003F 23FD 003F 23FE 0021 23FE 003F +23FF 0021 +23FF 003F 2400 0021 2400 003F 2401 0021 @@ -8386,6 +8450,8 @@ FFEE 003F 2BD0 003F 2BD1 0021 2BD1 003F +2BD2 0021 +2BD2 003F 2BEC 0021 2BEC 003F 2BED 0021 @@ -11972,6 +12038,24 @@ A4C6 003F 1F0F5 0334 1F0F5 0021 1F0F5 003F +1F260 0334 +1F260 0021 +1F260 003F +1F261 0334 +1F261 0021 +1F261 003F +1F262 0334 +1F262 0021 +1F262 003F +1F263 0334 +1F263 0021 +1F263 003F +1F264 0334 +1F264 0021 +1F264 003F +1F265 0334 +1F265 0021 +1F265 003F 1F300 0334 1F300 0021 1F300 003F @@ -14276,6 +14360,42 @@ A4C6 003F 1F5FF 0334 1F5FF 0021 1F5FF 003F +1F900 0334 +1F900 0021 +1F900 003F +1F901 0334 +1F901 0021 +1F901 003F +1F902 0334 +1F902 0021 +1F902 003F +1F903 0334 +1F903 0021 +1F903 003F +1F904 0334 +1F904 0021 +1F904 003F +1F905 0334 +1F905 0021 +1F905 003F +1F906 0334 +1F906 0021 +1F906 003F +1F907 0334 +1F907 0021 +1F907 003F +1F908 0334 +1F908 0021 +1F908 003F +1F909 0334 +1F909 0021 +1F909 003F +1F90A 0334 +1F90A 0021 +1F90A 003F +1F90B 0334 +1F90B 0021 +1F90B 003F 1F910 0334 1F910 0021 1F910 003F @@ -14321,6 +14441,9 @@ A4C6 003F 1F91E 0334 1F91E 0021 1F91E 003F +1F91F 0334 +1F91F 0021 +1F91F 003F 1F920 0334 1F920 0021 1F920 003F @@ -14345,9 +14468,39 @@ A4C6 003F 1F927 0334 1F927 0021 1F927 003F +1F928 0334 +1F928 0021 +1F928 003F +1F929 0334 +1F929 0021 +1F929 003F +1F92A 0334 +1F92A 0021 +1F92A 003F +1F92B 0334 +1F92B 0021 +1F92B 003F +1F92C 0334 +1F92C 0021 +1F92C 003F +1F92D 0334 +1F92D 0021 +1F92D 003F +1F92E 0334 +1F92E 0021 +1F92E 003F +1F92F 0334 +1F92F 0021 +1F92F 003F 1F930 0334 1F930 0021 1F930 003F +1F931 0334 +1F931 0021 +1F931 003F +1F932 0334 +1F932 0021 +1F932 003F 1F933 0334 1F933 0021 1F933 003F @@ -14420,6 +14573,9 @@ A4C6 003F 1F94B 0334 1F94B 0021 1F94B 003F +1F94C 0334 +1F94C 0021 +1F94C 003F 1F950 0334 1F950 0021 1F950 003F @@ -14465,6 +14621,45 @@ A4C6 003F 1F95E 0334 1F95E 0021 1F95E 003F +1F95F 0334 +1F95F 0021 +1F95F 003F +1F960 0334 +1F960 0021 +1F960 003F +1F961 0334 +1F961 0021 +1F961 003F +1F962 0334 +1F962 0021 +1F962 003F +1F963 0334 +1F963 0021 +1F963 003F +1F964 0334 +1F964 0021 +1F964 003F +1F965 0334 +1F965 0021 +1F965 003F +1F966 0334 +1F966 0021 +1F966 003F +1F967 0334 +1F967 0021 +1F967 003F +1F968 0334 +1F968 0021 +1F968 003F +1F969 0334 +1F969 0021 +1F969 003F +1F96A 0334 +1F96A 0021 +1F96A 003F +1F96B 0334 +1F96B 0021 +1F96B 003F 1F980 0334 1F980 0021 1F980 003F @@ -14519,9 +14714,96 @@ A4C6 003F 1F991 0334 1F991 0021 1F991 003F +1F992 0334 +1F992 0021 +1F992 003F +1F993 0334 +1F993 0021 +1F993 003F +1F994 0334 +1F994 0021 +1F994 003F +1F995 0334 +1F995 0021 +1F995 003F +1F996 0334 +1F996 0021 +1F996 003F +1F997 0334 +1F997 0021 +1F997 003F 1F9C0 0334 1F9C0 0021 1F9C0 003F +1F9D0 0334 +1F9D0 0021 +1F9D0 003F +1F9D1 0334 +1F9D1 0021 +1F9D1 003F +1F9D2 0334 +1F9D2 0021 +1F9D2 003F +1F9D3 0334 +1F9D3 0021 +1F9D3 003F +1F9D4 0334 +1F9D4 0021 +1F9D4 003F +1F9D5 0334 +1F9D5 0021 +1F9D5 003F +1F9D6 0334 +1F9D6 0021 +1F9D6 003F +1F9D7 0334 +1F9D7 0021 +1F9D7 003F +1F9D8 0334 +1F9D8 0021 +1F9D8 003F +1F9D9 0334 +1F9D9 0021 +1F9D9 003F +1F9DA 0334 +1F9DA 0021 +1F9DA 003F +1F9DB 0334 +1F9DB 0021 +1F9DB 003F +1F9DC 0334 +1F9DC 0021 +1F9DC 003F +1F9DD 0334 +1F9DD 0021 +1F9DD 003F +1F9DE 0334 +1F9DE 0021 +1F9DE 003F +1F9DF 0334 +1F9DF 0021 +1F9DF 003F +1F9E0 0334 +1F9E0 0021 +1F9E0 003F +1F9E1 0334 +1F9E1 0021 +1F9E1 003F +1F9E2 0334 +1F9E2 0021 +1F9E2 003F +1F9E3 0334 +1F9E3 0021 +1F9E3 003F +1F9E4 0334 +1F9E4 0021 +1F9E4 003F +1F9E5 0334 +1F9E5 0021 +1F9E5 003F +1F9E6 0334 +1F9E6 0021 +1F9E6 003F 1F600 0334 1F600 0021 1F600 003F @@ -15155,6 +15437,12 @@ A4C6 003F 1F6D2 0334 1F6D2 0021 1F6D2 003F +1F6D3 0334 +1F6D3 0021 +1F6D3 003F +1F6D4 0334 +1F6D4 0021 +1F6D4 003F 1F6E0 0334 1F6E0 0021 1F6E0 003F @@ -15215,6 +15503,12 @@ A4C6 003F 1F6F6 0334 1F6F6 0021 1F6F6 003F +1F6F7 0334 +1F6F7 0021 +1F6F7 003F +1F6F8 0334 +1F6F8 0021 +1F6F8 003F 1F700 0334 1F700 0021 1F700 003F @@ -19119,6 +19413,9 @@ A835 003F 1DCE 0021 1DD1 0021 1DF5 0021 +1DF6 0021 +1DF7 0021 +1DF8 0021 1DFB 0021 1DFE 0021 20F0 0021 @@ -19180,6 +19477,9 @@ A67D 0021 1DCE 003F 1DD1 003F 1DF5 003F +1DF6 003F +1DF7 003F +1DF8 003F 1DFB 003F 1DFE 003F 20F0 003F @@ -19236,6 +19536,7 @@ A67D 003F 1DC2 0021 1DCF 0021 1DD0 0021 +1DF9 0021 1DFC 0021 1DFD 0021 1DFF 0021 @@ -19293,6 +19594,7 @@ FE27 0021 1DC2 003F 1DCF 003F 1DD0 003F +1DF9 003F 1DFC 003F 1DFD 003F 1DFF 003F @@ -19531,19 +19833,33 @@ FF9F 003F 0749 0334 0334 074A 074A 0334 +0334 08D4 08D4 0334 +0334 08D5 08D5 0334 +0334 08D6 08D6 0334 +0334 08D7 08D7 0334 +0334 08D8 08D8 0334 +0334 08D9 08D9 0334 +0334 08DA 08DA 0334 +0334 08DB 08DB 0334 +0334 08DC 08DC 0334 +0334 08DD 08DD 0334 +0334 08DE 08DE 0334 +0334 08DF 08DF 0334 +0334 08E0 08E0 0334 +0334 08E1 08E1 0334 0334 08EA 08EA 0334 @@ -20435,6 +20751,13 @@ E01EF 0334 1DD1 0334 0334 1DF5 1DF5 0334 +0334 1DF6 +1DF6 0334 +0334 1DF7 +1DF7 0334 +0334 1DF8 +1DF8 0334 +0334 1DFB 1DFB 0334 0334 1DFE 1DFE 0334 @@ -20542,6 +20865,8 @@ A67D 0334 1DCF 0334 0334 1DD0 1DD0 0334 +0334 1DF9 +1DF9 0334 0334 1DFC 1DFC 0334 0334 1DFD @@ -20843,12 +21168,19 @@ FB1E 0334 A6F0 0334 0334 A6F1 A6F1 0334 +0334 1E944 1E944 0334 +0334 1E945 1E945 0334 +0334 1E946 1E946 0334 +0334 1E94A 1E94A 0334 +0334 1E947 1E947 0334 +0334 1E948 1E948 0334 +0334 1E949 1E949 0334 0334 093C 093C 0334 @@ -20882,6 +21214,7 @@ A9B3 0334 112E9 0334 0334 1133C 1133C 0334 +0334 11446 11446 0334 0334 114C3 114C3 0334 @@ -20889,6 +21222,8 @@ A9B3 0334 115C0 0334 0334 116B7 116B7 0334 +0334 11D42 +11D42 0334 0334 11100 11100 0334 0334 1CED @@ -21180,8 +21515,10 @@ FC62 003F 08F6 0021 08F6 003F 0651 0021 +0AFB 0021 11237 0021 0651 003F +0AFB 003F 11237 003F FE7D 0021 FE7D 003F @@ -21191,8 +21528,10 @@ FE7C 003F FC63 0021 FC63 003F 0652 0021 +0AFA 0021 1123E 0021 0652 003F +0AFA 003F 1123E 003F FE7F 0021 FE7F 003F @@ -21200,7 +21539,9 @@ FE7E 0021 FE7E 003F 1123E 0334 0653 0021 +0AFC 0021 0653 003F +0AFC 003F 0654 0021 0654 003F 0655 0021 @@ -21340,6 +21681,9 @@ A6F1 003F 09BC 0021 0A3C 0021 0ABC 0021 +0AFD 0021 +0AFE 0021 +0AFF 0021 0B3C 0021 0CBC 0021 1B34 0021 @@ -21356,10 +21700,15 @@ A9B3 0021 114C3 0021 115C0 0021 116B7 0021 +11A33 0021 +11D42 0021 093C 003F 09BC 003F 0A3C 003F 0ABC 003F +0AFD 003F +0AFE 003F +0AFF 003F 0B3C 003F 0CBC 003F 1B34 003F @@ -21376,6 +21725,9 @@ A9B3 003F 114C3 003F 115C0 003F 116B7 003F +11A33 003F +11D42 003F +11A33 0334 0900 0021 0901 0021 0981 0021 @@ -21399,8 +21751,12 @@ A980 0021 114BF 0021 115BC 0021 11640 0021 +11A35 0021 +11A36 0021 +11A37 0021 11C3C 0021 11CB6 0021 +11D43 0021 0900 003F 0901 003F 0981 003F @@ -21424,8 +21780,12 @@ A980 003F 114BF 003F 115BC 003F 11640 003F +11A35 003F +11A36 003F +11A37 003F 11C3C 003F 11CB6 003F +11D43 003F 11000 0334 11080 0334 11180 0334 @@ -21434,8 +21794,12 @@ A980 003F 114BF 0334 115BC 0334 11640 0334 +11A35 0334 +11A36 0334 +11A37 0334 11C3C 0334 11CB6 0334 +11D43 0334 0902 0021 0982 0021 0A02 0021 @@ -21444,6 +21808,7 @@ A980 003F 0B82 0021 0C02 0021 0C82 0021 +0D00 0021 0D02 0021 0D82 0021 0F7E 0021 @@ -21470,8 +21835,11 @@ A981 0021 115BD 0021 1163D 0021 116AB 0021 +11A38 0021 +11A96 0021 11C3D 0021 11CB5 0021 +11D40 0021 0902 003F 0982 003F 0A02 003F @@ -21480,6 +21848,7 @@ A981 0021 0B82 003F 0C02 003F 0C82 003F +0D00 003F 0D02 003F 0D82 003F 0F7E 003F @@ -21506,8 +21875,11 @@ A981 003F 115BD 003F 1163D 003F 116AB 003F +11A38 003F +11A96 003F 11C3D 003F 11CB5 003F +11D40 003F 10A0E 0334 11001 0334 11081 0334 @@ -21521,8 +21893,11 @@ A981 003F 115BD 0334 1163D 0334 116AB 0334 +11A38 0334 +11A96 0334 11C3D 0334 11CB5 0334 +11D40 0334 0903 0021 0983 0021 0A03 0021 @@ -21552,7 +21927,10 @@ A983 0021 115BE 0021 1163E 0021 116AC 0021 +11A39 0021 +11A97 0021 11C3E 0021 +11D41 0021 0903 003F 0983 003F 0A03 003F @@ -21582,7 +21960,10 @@ A983 003F 115BE 003F 1163E 003F 116AC 003F +11A39 003F +11A97 003F 11C3E 003F +11D41 003F 11002 0334 11082 0334 11182 0334 @@ -21592,7 +21973,10 @@ A983 003F 115BE 0334 1163E 0334 116AC 0334 +11A39 0334 +11A97 0334 11C3E 0334 +11D41 0334 0A70 0021 0A70 003F 0A71 0021 @@ -21618,6 +22002,9 @@ ABEC 003F 111CC 0021 111CC 003F 111CC 0334 +11A98 0021 +11A98 003F +11A98 0334 0E4E 0021 0E4E 003F 0E47 0021 @@ -21842,6 +22229,12 @@ AAF4 0062 16FE0 0061 16FE0 0041 16FE0 0062 +16FE1 0021 +16FE1 003F +16FE1 0334 +16FE1 0061 +16FE1 0041 +16FE1 0062 3031 0021 3031 003F 3032 0021 @@ -22158,6 +22551,11 @@ FFE6 0062 20BE 0061 20BE 0041 20BE 0062 +20BF 0021 +20BF 003F +20BF 0061 +20BF 0041 +20BF 0062 0030 0021 0660 0021 06F0 0021 @@ -22211,6 +22609,7 @@ ABF0 0021 11730 0021 118E0 0021 11C50 0021 +11D50 0021 16A60 0021 16B50 0021 1E950 0021 @@ -22267,6 +22666,7 @@ ABF0 003F 11730 003F 118E0 003F 11C50 003F +11D50 003F 16A60 003F 16B50 003F 1E950 003F @@ -22316,6 +22716,7 @@ FF10 003F 11730 0334 118E0 0334 11C50 0334 +11D50 0334 16A60 0334 16B50 0334 1E950 0334 @@ -22384,6 +22785,7 @@ ABF0 0061 11730 0061 118E0 0061 11C50 0061 +11D50 0061 16A60 0061 16B50 0061 1E950 0061 @@ -22440,6 +22842,7 @@ ABF0 0041 11730 0041 118E0 0041 11C50 0041 +11D50 0041 16A60 0041 16B50 0041 1E950 0041 @@ -22526,6 +22929,7 @@ ABF0 0062 11730 0062 118E0 0062 11C50 0062 +11D50 0062 16A60 0062 16B50 0062 1E950 0062 @@ -22630,6 +23034,7 @@ ABF1 0021 118E1 0021 11C51 0021 11C5A 0021 +11D51 0021 12415 0021 1241E 0021 1242C 0021 @@ -22722,6 +23127,7 @@ ABF1 003F 118E1 003F 11C51 003F 11C5A 003F +11D51 003F 12415 003F 1241E 003F 1242C 003F @@ -22809,6 +23215,7 @@ FF11 003F 118E1 0334 11C51 0334 11C5A 0334 +11D51 0334 12415 0334 1241E 0334 1242C 0334 @@ -23292,6 +23699,7 @@ ABF1 0061 118E1 0061 11C51 0061 11C5A 0061 +11D51 0061 12415 0061 1241E 0061 1242C 0061 @@ -23384,6 +23792,7 @@ ABF1 0041 118E1 0041 11C51 0041 11C5A 0041 +11D51 0041 12415 0041 1241E 0041 1242C 0041 @@ -23512,6 +23921,7 @@ ABF1 0062 118E1 0062 11C51 0062 11C5A 0062 +11D51 0062 12415 0062 1241E 0062 1242C 0062 @@ -23630,6 +24040,7 @@ ABF2 0021 118E2 0021 11C52 0021 11C5B 0021 +11D52 0021 12400 0021 12416 0021 1241F 0021 @@ -23719,6 +24130,7 @@ ABF2 003F 118E2 003F 11C52 003F 11C5B 003F +11D52 003F 12400 003F 12416 003F 1241F 003F @@ -23802,6 +24214,7 @@ FF12 003F 118E2 0334 11C52 0334 11C5B 0334 +11D52 0334 12400 0334 12416 0334 1241F 0334 @@ -24057,6 +24470,7 @@ ABF2 0061 118E2 0061 11C52 0061 11C5B 0061 +11D52 0061 12400 0061 12416 0061 1241F 0061 @@ -24146,6 +24560,7 @@ ABF2 0041 118E2 0041 11C52 0041 11C5B 0041 +11D52 0041 12400 0041 12416 0041 1241F 0041 @@ -24269,6 +24684,7 @@ ABF2 0062 118E2 0062 11C52 0062 11C5B 0062 +11D52 0062 12400 0062 12416 0062 1241F 0062 @@ -24397,6 +24813,7 @@ ABF3 0021 118E3 0021 11C53 0021 11C5C 0021 +11D53 0021 12401 0021 12408 0021 12417 0021 @@ -24486,6 +24903,7 @@ ABF3 003F 118E3 003F 11C53 003F 11C5C 003F +11D53 003F 12401 003F 12408 003F 12417 003F @@ -24569,6 +24987,7 @@ FF13 003F 118E3 0334 11C53 0334 11C5C 0334 +11D53 0334 12401 0334 12408 0334 12417 0334 @@ -24743,6 +25162,7 @@ ABF3 0061 118E3 0061 11C53 0061 11C5C 0061 +11D53 0061 12401 0061 12408 0061 12417 0061 @@ -24832,6 +25252,7 @@ ABF3 0041 118E3 0041 11C53 0041 11C5C 0041 +11D53 0041 12401 0041 12408 0041 12417 0041 @@ -24955,6 +25376,7 @@ ABF3 0062 118E3 0062 11C53 0062 11C5C 0062 +11D53 0062 12401 0062 12408 0062 12417 0062 @@ -25079,6 +25501,7 @@ ABF4 0021 118E4 0021 11C54 0021 11C5D 0021 +11D54 0021 12402 0021 12409 0021 1240F 0021 @@ -25166,6 +25589,7 @@ ABF4 003F 118E4 003F 11C54 003F 11C5D 003F +11D54 003F 12402 003F 12409 003F 1240F 003F @@ -25249,6 +25673,7 @@ FF14 003F 118E4 0334 11C54 0334 11C5D 0334 +11D54 0334 12402 0334 12409 0334 1240F 0334 @@ -25401,6 +25826,7 @@ ABF4 0061 118E4 0061 11C54 0061 11C5D 0061 +11D54 0061 12402 0061 12409 0061 1240F 0061 @@ -25488,6 +25914,7 @@ ABF4 0041 118E4 0041 11C54 0041 11C5D 0041 +11D54 0041 12402 0041 12409 0041 1240F 0041 @@ -25609,6 +26036,7 @@ ABF4 0062 118E4 0062 11C54 0062 11C5D 0062 +11D54 0062 12402 0062 12409 0062 1240F 0062 @@ -25738,6 +26166,7 @@ ABF5 0021 118E5 0021 11C55 0021 11C5E 0021 +11D55 0021 12403 0021 1240A 0021 12410 0021 @@ -25825,6 +26254,7 @@ ABF5 003F 118E5 003F 11C55 003F 11C5E 003F +11D55 003F 12403 003F 1240A 003F 12410 003F @@ -25908,6 +26338,7 @@ FF15 003F 118E5 0334 11C55 0334 11C5E 0334 +11D55 0334 12403 0334 1240A 0334 12410 0334 @@ -26026,6 +26457,7 @@ ABF5 0061 118E5 0061 11C55 0061 11C5E 0061 +11D55 0061 12403 0061 1240A 0061 12410 0061 @@ -26113,6 +26545,7 @@ ABF5 0041 118E5 0041 11C55 0041 11C5E 0041 +11D55 0041 12403 0041 1240A 0041 12410 0041 @@ -26234,6 +26667,7 @@ ABF5 0062 118E5 0062 11C55 0062 11C5E 0062 +11D55 0062 12403 0062 1240A 0062 12410 0062 @@ -26343,6 +26777,7 @@ ABF6 0021 118E6 0021 11C56 0021 11C5F 0021 +11D56 0021 12404 0021 1240B 0021 12411 0021 @@ -26416,6 +26851,7 @@ ABF6 003F 118E6 003F 11C56 003F 11C5F 003F +11D56 003F 12404 003F 1240B 003F 12411 003F @@ -26484,6 +26920,7 @@ FF16 003F 118E6 0334 11C56 0334 11C5F 0334 +11D56 0334 12404 0334 1240B 0334 12411 0334 @@ -26573,6 +27010,7 @@ ABF6 0061 118E6 0061 11C56 0061 11C5F 0061 +11D56 0061 12404 0061 1240B 0061 12411 0061 @@ -26646,6 +27084,7 @@ ABF6 0041 118E6 0041 11C56 0041 11C5F 0041 +11D56 0041 12404 0041 1240B 0041 12411 0041 @@ -26753,6 +27192,7 @@ ABF6 0062 118E6 0062 11C56 0062 11C5F 0062 +11D56 0062 12404 0062 1240B 0062 12411 0062 @@ -26857,6 +27297,7 @@ ABF7 0021 118E7 0021 11C57 0021 11C60 0021 +11D57 0021 12405 0021 1240C 0021 12412 0021 @@ -26930,6 +27371,7 @@ ABF7 003F 118E7 003F 11C57 003F 11C60 003F +11D57 003F 12405 003F 1240C 003F 12412 003F @@ -26999,6 +27441,7 @@ FF17 003F 118E7 0334 11C57 0334 11C60 0334 +11D57 0334 12405 0334 1240C 0334 12412 0334 @@ -27093,6 +27536,7 @@ ABF7 0061 118E7 0061 11C57 0061 11C60 0061 +11D57 0061 12405 0061 1240C 0061 12412 0061 @@ -27166,6 +27610,7 @@ ABF7 0041 118E7 0041 11C57 0041 11C60 0041 +11D57 0041 12405 0041 1240C 0041 12412 0041 @@ -27273,6 +27718,7 @@ ABF7 0062 118E7 0062 11C57 0062 11C60 0062 +11D57 0062 12405 0062 1240C 0062 12412 0062 @@ -27378,6 +27824,7 @@ ABF8 0021 118E8 0021 11C58 0021 11C61 0021 +11D58 0021 12406 0021 1240D 0021 12413 0021 @@ -27450,6 +27897,7 @@ ABF8 003F 118E8 003F 11C58 003F 11C61 003F +11D58 003F 12406 003F 1240D 003F 12413 003F @@ -27518,6 +27966,7 @@ FF18 003F 118E8 0334 11C58 0334 11C61 0334 +11D58 0334 12406 0334 1240D 0334 12413 0334 @@ -27600,6 +28049,7 @@ ABF8 0061 118E8 0061 11C58 0061 11C61 0061 +11D58 0061 12406 0061 1240D 0061 12413 0061 @@ -27672,6 +28122,7 @@ ABF8 0041 118E8 0041 11C58 0041 11C61 0041 +11D58 0041 12406 0041 1240D 0041 12413 0041 @@ -27778,6 +28229,7 @@ ABF8 0062 118E8 0062 11C58 0062 11C61 0062 +11D58 0062 12406 0062 1240D 0062 12413 0062 @@ -27888,6 +28340,7 @@ ABF9 0021 118E9 0021 11C59 0021 11C62 0021 +11D59 0021 12407 0021 1240E 0021 12414 0021 @@ -27962,6 +28415,7 @@ ABF9 003F 118E9 003F 11C59 003F 11C62 003F +11D59 003F 12407 003F 1240E 003F 12414 003F @@ -28032,6 +28486,7 @@ FF19 003F 118E9 0334 11C59 0334 11C62 0334 +11D59 0334 12407 0334 1240E 0334 12414 0334 @@ -28111,6 +28566,7 @@ ABF9 0061 118E9 0061 11C59 0061 11C62 0061 +11D59 0061 12407 0061 1240E 0061 12414 0061 @@ -28185,6 +28641,7 @@ ABF9 0041 118E9 0041 11C59 0041 11C62 0041 +11D59 0041 12407 0041 1240E 0041 12414 0041 @@ -28293,6 +28750,7 @@ ABF9 0062 118E9 0062 11C59 0062 11C62 0062 +11D59 0062 12407 0062 1240E 0062 12414 0062 @@ -28439,6 +28897,7 @@ FF1B 0061 204F 0061 2E35 0061 A6F6 0061 +2E49 0061 2A74 0061 003A 0061 FE13 0061 @@ -28926,6 +29385,10 @@ FF05 0061 2E1E 0061 2E1F 0061 2E44 0061 +2E45 0061 +2E46 0061 +2E47 0061 +2E48 0061 A67E 0061 055A 0061 055B 0061 @@ -28960,6 +29423,7 @@ A8F8 0061 A8F9 0061 A8FA 0061 A8FC 0061 +09FD 0061 0AF0 0061 0DF4 0061 0E4F 0061 @@ -28990,6 +29454,22 @@ AADF 0061 0FD4 0061 0FD9 0061 0FDA 0061 +11A3F 0061 +11A40 0061 +11A41 0061 +11A42 0061 +11A43 0061 +11A44 0061 +11A45 0061 +11A46 0061 +11A9A 0061 +11A9B 0061 +11A9C 0061 +11A9E 0061 +11A9F 0061 +11AA0 0061 +11AA1 0061 +11AA2 0061 11C70 0061 11C71 0061 1C3D 0061 @@ -30082,6 +30562,7 @@ FF5E 0061 23FC 0061 23FD 0061 23FE 0061 +23FF 0061 2400 0061 2401 0061 2402 0061 @@ -31538,6 +32019,7 @@ FFEE 0061 2BCF 0061 2BD0 0061 2BD1 0061 +2BD2 0061 2BEC 0061 2BED 0061 2BEE 0061 @@ -32854,6 +33336,12 @@ A4C6 0061 1F0F3 0061 1F0F4 0061 1F0F5 0061 +1F260 0061 +1F261 0061 +1F262 0061 +1F263 0061 +1F264 0061 +1F265 0061 1F300 0061 1F301 0061 1F302 0061 @@ -33622,6 +34110,18 @@ A4C6 0061 1F5FD 0061 1F5FE 0061 1F5FF 0061 +1F900 0061 +1F901 0061 +1F902 0061 +1F903 0061 +1F904 0061 +1F905 0061 +1F906 0061 +1F907 0061 +1F908 0061 +1F909 0061 +1F90A 0061 +1F90B 0061 1F910 0061 1F911 0061 1F912 0061 @@ -33637,6 +34137,7 @@ A4C6 0061 1F91C 0061 1F91D 0061 1F91E 0061 +1F91F 0061 1F920 0061 1F921 0061 1F922 0061 @@ -33645,7 +34146,17 @@ A4C6 0061 1F925 0061 1F926 0061 1F927 0061 +1F928 0061 +1F929 0061 +1F92A 0061 +1F92B 0061 +1F92C 0061 +1F92D 0061 +1F92E 0061 +1F92F 0061 1F930 0061 +1F931 0061 +1F932 0061 1F933 0061 1F934 0061 1F935 0061 @@ -33670,6 +34181,7 @@ A4C6 0061 1F949 0061 1F94A 0061 1F94B 0061 +1F94C 0061 1F950 0061 1F951 0061 1F952 0061 @@ -33685,6 +34197,19 @@ A4C6 0061 1F95C 0061 1F95D 0061 1F95E 0061 +1F95F 0061 +1F960 0061 +1F961 0061 +1F962 0061 +1F963 0061 +1F964 0061 +1F965 0061 +1F966 0061 +1F967 0061 +1F968 0061 +1F969 0061 +1F96A 0061 +1F96B 0061 1F980 0061 1F981 0061 1F982 0061 @@ -33703,7 +34228,36 @@ A4C6 0061 1F98F 0061 1F990 0061 1F991 0061 +1F992 0061 +1F993 0061 +1F994 0061 +1F995 0061 +1F996 0061 +1F997 0061 1F9C0 0061 +1F9D0 0061 +1F9D1 0061 +1F9D2 0061 +1F9D3 0061 +1F9D4 0061 +1F9D5 0061 +1F9D6 0061 +1F9D7 0061 +1F9D8 0061 +1F9D9 0061 +1F9DA 0061 +1F9DB 0061 +1F9DC 0061 +1F9DD 0061 +1F9DE 0061 +1F9DF 0061 +1F9E0 0061 +1F9E1 0061 +1F9E2 0061 +1F9E3 0061 +1F9E4 0061 +1F9E5 0061 +1F9E6 0061 1F600 0061 1F601 0061 1F602 0061 @@ -33915,6 +34469,8 @@ A4C6 0061 1F6D0 0061 1F6D1 0061 1F6D2 0061 +1F6D3 0061 +1F6D4 0061 1F6E0 0061 1F6E1 0061 1F6E2 0061 @@ -33935,6 +34491,8 @@ A4C6 0061 1F6F4 0061 1F6F5 0061 1F6F6 0061 +1F6F7 0061 +1F6F8 0061 1F700 0061 1F701 0061 1F702 0061 @@ -35462,6 +36020,7 @@ A835 0061 1CE7 0061 1CE8 0061 1CF4 0061 +1CF7 0061 1CF8 0061 1CF9 0061 200B 0061 @@ -36208,6 +36767,7 @@ FF1B 0041 204F 0041 2E35 0041 A6F6 0041 +2E49 0041 2A74 0041 003A 0041 FE13 0041 @@ -36695,6 +37255,10 @@ FF05 0041 2E1E 0041 2E1F 0041 2E44 0041 +2E45 0041 +2E46 0041 +2E47 0041 +2E48 0041 A67E 0041 055A 0041 055B 0041 @@ -36729,6 +37293,7 @@ A8F8 0041 A8F9 0041 A8FA 0041 A8FC 0041 +09FD 0041 0AF0 0041 0DF4 0041 0E4F 0041 @@ -36759,6 +37324,22 @@ AADF 0041 0FD4 0041 0FD9 0041 0FDA 0041 +11A3F 0041 +11A40 0041 +11A41 0041 +11A42 0041 +11A43 0041 +11A44 0041 +11A45 0041 +11A46 0041 +11A9A 0041 +11A9B 0041 +11A9C 0041 +11A9E 0041 +11A9F 0041 +11AA0 0041 +11AA1 0041 +11AA2 0041 11C70 0041 11C71 0041 1C3D 0041 @@ -37851,6 +38432,7 @@ FF5E 0041 23FC 0041 23FD 0041 23FE 0041 +23FF 0041 2400 0041 2401 0041 2402 0041 @@ -39307,6 +39889,7 @@ FFEE 0041 2BCF 0041 2BD0 0041 2BD1 0041 +2BD2 0041 2BEC 0041 2BED 0041 2BEE 0041 @@ -40623,6 +41206,12 @@ A4C6 0041 1F0F3 0041 1F0F4 0041 1F0F5 0041 +1F260 0041 +1F261 0041 +1F262 0041 +1F263 0041 +1F264 0041 +1F265 0041 1F300 0041 1F301 0041 1F302 0041 @@ -41391,6 +41980,18 @@ A4C6 0041 1F5FD 0041 1F5FE 0041 1F5FF 0041 +1F900 0041 +1F901 0041 +1F902 0041 +1F903 0041 +1F904 0041 +1F905 0041 +1F906 0041 +1F907 0041 +1F908 0041 +1F909 0041 +1F90A 0041 +1F90B 0041 1F910 0041 1F911 0041 1F912 0041 @@ -41406,6 +42007,7 @@ A4C6 0041 1F91C 0041 1F91D 0041 1F91E 0041 +1F91F 0041 1F920 0041 1F921 0041 1F922 0041 @@ -41414,7 +42016,17 @@ A4C6 0041 1F925 0041 1F926 0041 1F927 0041 +1F928 0041 +1F929 0041 +1F92A 0041 +1F92B 0041 +1F92C 0041 +1F92D 0041 +1F92E 0041 +1F92F 0041 1F930 0041 +1F931 0041 +1F932 0041 1F933 0041 1F934 0041 1F935 0041 @@ -41439,6 +42051,7 @@ A4C6 0041 1F949 0041 1F94A 0041 1F94B 0041 +1F94C 0041 1F950 0041 1F951 0041 1F952 0041 @@ -41454,6 +42067,19 @@ A4C6 0041 1F95C 0041 1F95D 0041 1F95E 0041 +1F95F 0041 +1F960 0041 +1F961 0041 +1F962 0041 +1F963 0041 +1F964 0041 +1F965 0041 +1F966 0041 +1F967 0041 +1F968 0041 +1F969 0041 +1F96A 0041 +1F96B 0041 1F980 0041 1F981 0041 1F982 0041 @@ -41472,7 +42098,36 @@ A4C6 0041 1F98F 0041 1F990 0041 1F991 0041 +1F992 0041 +1F993 0041 +1F994 0041 +1F995 0041 +1F996 0041 +1F997 0041 1F9C0 0041 +1F9D0 0041 +1F9D1 0041 +1F9D2 0041 +1F9D3 0041 +1F9D4 0041 +1F9D5 0041 +1F9D6 0041 +1F9D7 0041 +1F9D8 0041 +1F9D9 0041 +1F9DA 0041 +1F9DB 0041 +1F9DC 0041 +1F9DD 0041 +1F9DE 0041 +1F9DF 0041 +1F9E0 0041 +1F9E1 0041 +1F9E2 0041 +1F9E3 0041 +1F9E4 0041 +1F9E5 0041 +1F9E6 0041 1F600 0041 1F601 0041 1F602 0041 @@ -41684,6 +42339,8 @@ A4C6 0041 1F6D0 0041 1F6D1 0041 1F6D2 0041 +1F6D3 0041 +1F6D4 0041 1F6E0 0041 1F6E1 0041 1F6E2 0041 @@ -41704,6 +42361,8 @@ A4C6 0041 1F6F4 0041 1F6F5 0041 1F6F6 0041 +1F6F7 0041 +1F6F8 0041 1F700 0041 1F701 0041 1F702 0041 @@ -43231,6 +43890,7 @@ A835 0041 1CE7 0041 1CE8 0041 1CF4 0041 +1CF7 0041 1CF8 0041 1CF9 0041 200B 0041 @@ -44360,6 +45020,9 @@ A79A 003F 1DCE 0061 1DD1 0061 1DF5 0061 +1DF6 0061 +1DF7 0061 +1DF8 0061 1DFB 0061 1DFE 0061 20F0 0061 @@ -44421,6 +45084,9 @@ A67D 0061 1DCE 0041 1DD1 0041 1DF5 0041 +1DF6 0041 +1DF7 0041 +1DF8 0041 1DFB 0041 1DFE 0041 20F0 0041 @@ -44476,6 +45142,7 @@ A67D 0041 1DC2 0061 1DCF 0061 1DD0 0061 +1DF9 0061 1DFC 0061 1DFD 0061 1DFF 0061 @@ -44533,6 +45200,7 @@ FE27 0061 1DC2 0041 1DCF 0041 1DD0 0041 +1DF9 0041 1DFC 0041 1DFD 0041 1DFF 0041 @@ -44800,8 +45468,10 @@ FC62 0041 08F6 0061 08F6 0041 0651 0061 +0AFB 0061 11237 0061 0651 0041 +0AFB 0041 11237 0041 FE7D 0061 FE7D 0041 @@ -44810,15 +45480,19 @@ FE7C 0041 FC63 0061 FC63 0041 0652 0061 +0AFA 0061 1123E 0061 0652 0041 +0AFA 0041 1123E 0041 FE7F 0061 FE7F 0041 FE7E 0061 FE7E 0041 0653 0061 +0AFC 0061 0653 0041 +0AFC 0041 0654 0061 0654 0041 0655 0061 @@ -44953,6 +45627,9 @@ A6F1 0041 09BC 0061 0A3C 0061 0ABC 0061 +0AFD 0061 +0AFE 0061 +0AFF 0061 0B3C 0061 0CBC 0061 1B34 0061 @@ -44969,10 +45646,15 @@ A9B3 0061 114C3 0061 115C0 0061 116B7 0061 +11A33 0061 +11D42 0061 093C 0041 09BC 0041 0A3C 0041 0ABC 0041 +0AFD 0041 +0AFE 0041 +0AFF 0041 0B3C 0041 0CBC 0041 1B34 0041 @@ -44989,6 +45671,8 @@ A9B3 0041 114C3 0041 115C0 0041 116B7 0041 +11A33 0041 +11D42 0041 0900 0061 0901 0061 0981 0061 @@ -45012,8 +45696,12 @@ A980 0061 114BF 0061 115BC 0061 11640 0061 +11A35 0061 +11A36 0061 +11A37 0061 11C3C 0061 11CB6 0061 +11D43 0061 0900 0041 0901 0041 0981 0041 @@ -45037,8 +45725,12 @@ A980 0041 114BF 0041 115BC 0041 11640 0041 +11A35 0041 +11A36 0041 +11A37 0041 11C3C 0041 11CB6 0041 +11D43 0041 0902 0061 0982 0061 0A02 0061 @@ -45047,6 +45739,7 @@ A980 0041 0B82 0061 0C02 0061 0C82 0061 +0D00 0061 0D02 0061 0D82 0061 0F7E 0061 @@ -45073,8 +45766,11 @@ A981 0061 115BD 0061 1163D 0061 116AB 0061 +11A38 0061 +11A96 0061 11C3D 0061 11CB5 0061 +11D40 0061 0902 0041 0982 0041 0A02 0041 @@ -45083,6 +45779,7 @@ A981 0061 0B82 0041 0C02 0041 0C82 0041 +0D00 0041 0D02 0041 0D82 0041 0F7E 0041 @@ -45109,8 +45806,11 @@ A981 0041 115BD 0041 1163D 0041 116AB 0041 +11A38 0041 +11A96 0041 11C3D 0041 11CB5 0041 +11D40 0041 0903 0061 0983 0061 0A03 0061 @@ -45140,7 +45840,10 @@ A983 0061 115BE 0061 1163E 0061 116AC 0061 +11A39 0061 +11A97 0061 11C3E 0061 +11D41 0061 0903 0041 0983 0041 0A03 0041 @@ -45170,7 +45873,10 @@ A983 0041 115BE 0041 1163E 0041 116AC 0041 +11A39 0041 +11A97 0041 11C3E 0041 +11D41 0041 0A70 0061 0A70 0041 0A71 0061 @@ -45193,6 +45899,8 @@ ABEC 0041 111CB 0041 111CC 0061 111CC 0041 +11A98 0061 +11A98 0041 0E4E 0061 0E4E 0041 0E47 0061 @@ -46013,6 +46721,7 @@ FF1B 0062 204F 0062 2E35 0062 A6F6 0062 +2E49 0062 2A74 0062 003A 0062 FE13 0062 @@ -46500,6 +47209,10 @@ FF05 0062 2E1E 0062 2E1F 0062 2E44 0062 +2E45 0062 +2E46 0062 +2E47 0062 +2E48 0062 A67E 0062 055A 0062 055B 0062 @@ -46534,6 +47247,7 @@ A8F8 0062 A8F9 0062 A8FA 0062 A8FC 0062 +09FD 0062 0AF0 0062 0DF4 0062 0E4F 0062 @@ -46564,6 +47278,22 @@ AADF 0062 0FD4 0062 0FD9 0062 0FDA 0062 +11A3F 0062 +11A40 0062 +11A41 0062 +11A42 0062 +11A43 0062 +11A44 0062 +11A45 0062 +11A46 0062 +11A9A 0062 +11A9B 0062 +11A9C 0062 +11A9E 0062 +11A9F 0062 +11AA0 0062 +11AA1 0062 +11AA2 0062 11C70 0062 11C71 0062 1C3D 0062 @@ -47656,6 +48386,7 @@ FF5E 0062 23FC 0062 23FD 0062 23FE 0062 +23FF 0062 2400 0062 2401 0062 2402 0062 @@ -49112,6 +49843,7 @@ FFEE 0062 2BCF 0062 2BD0 0062 2BD1 0062 +2BD2 0062 2BEC 0062 2BED 0062 2BEE 0062 @@ -50428,6 +51160,12 @@ A4C6 0062 1F0F3 0062 1F0F4 0062 1F0F5 0062 +1F260 0062 +1F261 0062 +1F262 0062 +1F263 0062 +1F264 0062 +1F265 0062 1F300 0062 1F301 0062 1F302 0062 @@ -51196,6 +51934,18 @@ A4C6 0062 1F5FD 0062 1F5FE 0062 1F5FF 0062 +1F900 0062 +1F901 0062 +1F902 0062 +1F903 0062 +1F904 0062 +1F905 0062 +1F906 0062 +1F907 0062 +1F908 0062 +1F909 0062 +1F90A 0062 +1F90B 0062 1F910 0062 1F911 0062 1F912 0062 @@ -51211,6 +51961,7 @@ A4C6 0062 1F91C 0062 1F91D 0062 1F91E 0062 +1F91F 0062 1F920 0062 1F921 0062 1F922 0062 @@ -51219,7 +51970,17 @@ A4C6 0062 1F925 0062 1F926 0062 1F927 0062 +1F928 0062 +1F929 0062 +1F92A 0062 +1F92B 0062 +1F92C 0062 +1F92D 0062 +1F92E 0062 +1F92F 0062 1F930 0062 +1F931 0062 +1F932 0062 1F933 0062 1F934 0062 1F935 0062 @@ -51244,6 +52005,7 @@ A4C6 0062 1F949 0062 1F94A 0062 1F94B 0062 +1F94C 0062 1F950 0062 1F951 0062 1F952 0062 @@ -51259,6 +52021,19 @@ A4C6 0062 1F95C 0062 1F95D 0062 1F95E 0062 +1F95F 0062 +1F960 0062 +1F961 0062 +1F962 0062 +1F963 0062 +1F964 0062 +1F965 0062 +1F966 0062 +1F967 0062 +1F968 0062 +1F969 0062 +1F96A 0062 +1F96B 0062 1F980 0062 1F981 0062 1F982 0062 @@ -51277,7 +52052,36 @@ A4C6 0062 1F98F 0062 1F990 0062 1F991 0062 +1F992 0062 +1F993 0062 +1F994 0062 +1F995 0062 +1F996 0062 +1F997 0062 1F9C0 0062 +1F9D0 0062 +1F9D1 0062 +1F9D2 0062 +1F9D3 0062 +1F9D4 0062 +1F9D5 0062 +1F9D6 0062 +1F9D7 0062 +1F9D8 0062 +1F9D9 0062 +1F9DA 0062 +1F9DB 0062 +1F9DC 0062 +1F9DD 0062 +1F9DE 0062 +1F9DF 0062 +1F9E0 0062 +1F9E1 0062 +1F9E2 0062 +1F9E3 0062 +1F9E4 0062 +1F9E5 0062 +1F9E6 0062 1F600 0062 1F601 0062 1F602 0062 @@ -51489,6 +52293,8 @@ A4C6 0062 1F6D0 0062 1F6D1 0062 1F6D2 0062 +1F6D3 0062 +1F6D4 0062 1F6E0 0062 1F6E1 0062 1F6E2 0062 @@ -51509,6 +52315,8 @@ A4C6 0062 1F6F4 0062 1F6F5 0062 1F6F6 0062 +1F6F7 0062 +1F6F8 0062 1F700 0062 1F701 0062 1F702 0062 @@ -53036,6 +53844,7 @@ A835 0062 1CE7 0062 1CE8 0062 1CF4 0062 +1CF7 0062 1CF8 0062 1CF9 0062 200B 0062 @@ -53867,6 +54676,9 @@ FF22 003F 1DCE 0062 1DD1 0062 1DF5 0062 +1DF6 0062 +1DF7 0062 +1DF8 0062 1DFB 0062 1DFE 0062 20F0 0062 @@ -53922,6 +54734,7 @@ A67D 0062 1DC2 0062 1DCF 0062 1DD0 0062 +1DF9 0062 1DFC 0062 1DFD 0062 1DFF 0062 @@ -54060,15 +54873,18 @@ FC62 0062 08E6 0062 08F6 0062 0651 0062 +0AFB 0062 11237 0062 FE7D 0062 FE7C 0062 FC63 0062 0652 0062 +0AFA 0062 1123E 0062 FE7F 0062 FE7E 0062 0653 0062 +0AFC 0062 0654 0062 0655 0062 065F 0062 @@ -54138,6 +54954,9 @@ A6F1 0062 09BC 0062 0A3C 0062 0ABC 0062 +0AFD 0062 +0AFE 0062 +0AFF 0062 0B3C 0062 0CBC 0062 1B34 0062 @@ -54154,6 +54973,8 @@ A9B3 0062 114C3 0062 115C0 0062 116B7 0062 +11A33 0062 +11D42 0062 0900 0062 0901 0062 0981 0062 @@ -54177,8 +54998,12 @@ A980 0062 114BF 0062 115BC 0062 11640 0062 +11A35 0062 +11A36 0062 +11A37 0062 11C3C 0062 11CB6 0062 +11D43 0062 0902 0062 0982 0062 0A02 0062 @@ -54187,6 +55012,7 @@ A980 0062 0B82 0062 0C02 0062 0C82 0062 +0D00 0062 0D02 0062 0D82 0062 0F7E 0062 @@ -54213,8 +55039,11 @@ A981 0062 115BD 0062 1163D 0062 116AB 0062 +11A38 0062 +11A96 0062 11C3D 0062 11CB5 0062 +11D40 0062 0903 0062 0983 0062 0A03 0062 @@ -54244,7 +55073,10 @@ A983 0062 115BE 0062 1163E 0062 116AC 0062 +11A39 0062 +11A97 0062 11C3E 0062 +11D41 0062 0A70 0062 0A71 0062 1B03 0062 @@ -54256,6 +55088,7 @@ ABEC 0062 10A3A 0062 111CB 0062 111CC 0062 +11A98 0062 0E4E 0062 0E47 0062 0E48 0062 @@ -75222,6 +76055,7 @@ A65E 0062 1E000 003F 2C00 0021 2C00 003F +0334 1E000 1E000 0334 2C30 0061 2C30 0041 @@ -75238,6 +76072,7 @@ A65E 0062 1E001 003F 2C01 0021 2C01 003F +0334 1E001 1E001 0334 2C31 0061 2C31 0041 @@ -75254,6 +76089,7 @@ A65E 0062 1E002 003F 2C02 0021 2C02 003F +0334 1E002 1E002 0334 2C32 0061 2C32 0041 @@ -75270,6 +76106,7 @@ A65E 0062 1E003 003F 2C03 0021 2C03 003F +0334 1E003 1E003 0334 2C33 0061 2C33 0041 @@ -75286,6 +76123,7 @@ A65E 0062 1E004 003F 2C04 0021 2C04 003F +0334 1E004 1E004 0334 2C34 0061 2C34 0041 @@ -75302,6 +76140,7 @@ A65E 0062 1E005 003F 2C05 0021 2C05 003F +0334 1E005 1E005 0334 2C35 0061 2C35 0041 @@ -75318,6 +76157,7 @@ A65E 0062 1E006 003F 2C06 0021 2C06 003F +0334 1E006 1E006 0334 2C36 0061 2C36 0041 @@ -75344,6 +76184,7 @@ A65E 0062 1E008 003F 2C08 0021 2C08 003F +0334 1E008 1E008 0334 2C38 0061 2C38 0041 @@ -75360,6 +76201,7 @@ A65E 0062 1E009 003F 2C09 0021 2C09 003F +0334 1E009 1E009 0334 2C39 0061 2C39 0041 @@ -75376,6 +76218,7 @@ A65E 0062 1E00A 003F 2C0A 0021 2C0A 003F +0334 1E00A 1E00A 0334 2C3A 0061 2C3A 0041 @@ -75392,6 +76235,7 @@ A65E 0062 1E00B 003F 2C0B 0021 2C0B 003F +0334 1E00B 1E00B 0334 2C3B 0061 2C3B 0041 @@ -75408,6 +76252,7 @@ A65E 0062 1E00C 003F 2C0C 0021 2C0C 003F +0334 1E00C 1E00C 0334 2C3C 0061 2C3C 0041 @@ -75424,6 +76269,7 @@ A65E 0062 1E00D 003F 2C0D 0021 2C0D 003F +0334 1E00D 1E00D 0334 2C3D 0061 2C3D 0041 @@ -75440,6 +76286,7 @@ A65E 0062 1E00E 003F 2C0E 0021 2C0E 003F +0334 1E00E 1E00E 0334 2C3E 0061 2C3E 0041 @@ -75456,6 +76303,7 @@ A65E 0062 1E00F 003F 2C0F 0021 2C0F 003F +0334 1E00F 1E00F 0334 2C3F 0061 2C3F 0041 @@ -75472,6 +76320,7 @@ A65E 0062 1E010 003F 2C10 0021 2C10 003F +0334 1E010 1E010 0334 2C40 0061 2C40 0041 @@ -75488,6 +76337,7 @@ A65E 0062 1E011 003F 2C11 0021 2C11 003F +0334 1E011 1E011 0334 2C41 0061 2C41 0041 @@ -75504,6 +76354,7 @@ A65E 0062 1E012 003F 2C12 0021 2C12 003F +0334 1E012 1E012 0334 2C42 0061 2C42 0041 @@ -75520,6 +76371,7 @@ A65E 0062 1E013 003F 2C13 0021 2C13 003F +0334 1E013 1E013 0334 2C43 0061 2C43 0041 @@ -75536,6 +76388,7 @@ A65E 0062 1E014 003F 2C14 0021 2C14 003F +0334 1E014 1E014 0334 2C44 0061 2C44 0041 @@ -75552,6 +76405,7 @@ A65E 0062 1E015 003F 2C15 0021 2C15 003F +0334 1E015 1E015 0334 2C45 0061 2C45 0041 @@ -75568,6 +76422,7 @@ A65E 0062 1E016 003F 2C16 0021 2C16 003F +0334 1E016 1E016 0334 2C46 0061 2C46 0041 @@ -75584,6 +76439,7 @@ A65E 0062 1E017 003F 2C17 0021 2C17 003F +0334 1E017 1E017 0334 2C47 0061 2C47 0041 @@ -75600,6 +76456,7 @@ A65E 0062 1E018 003F 2C18 0021 2C18 003F +0334 1E018 1E018 0334 2C48 0061 2C48 0041 @@ -75636,6 +76493,7 @@ A65E 0062 1E01B 003F 2C1B 0021 2C1B 003F +0334 1E01B 1E01B 0334 2C4B 0061 2C4B 0041 @@ -75652,6 +76510,7 @@ A65E 0062 1E01C 003F 2C1C 0021 2C1C 003F +0334 1E01C 1E01C 0334 2C4C 0061 2C4C 0041 @@ -75668,6 +76527,7 @@ A65E 0062 1E01D 003F 2C1D 0021 2C1D 003F +0334 1E01D 1E01D 0334 2C4D 0061 2C4D 0041 @@ -75684,6 +76544,7 @@ A65E 0062 1E01E 003F 2C1E 0021 2C1E 003F +0334 1E01E 1E01E 0334 2C4E 0061 2C4E 0041 @@ -75700,6 +76561,7 @@ A65E 0062 1E01F 003F 2C1F 0021 2C1F 003F +0334 1E01F 1E01F 0334 2C4F 0061 2C4F 0041 @@ -75716,6 +76578,7 @@ A65E 0062 1E020 003F 2C20 0021 2C20 003F +0334 1E020 1E020 0334 2C50 0061 2C50 0041 @@ -75732,6 +76595,7 @@ A65E 0062 1E021 003F 2C21 0021 2C21 003F +0334 1E021 1E021 0334 2C51 0061 2C51 0041 @@ -75758,6 +76622,7 @@ A65E 0062 1E023 003F 2C23 0021 2C23 003F +0334 1E023 1E023 0334 2C53 0061 2C53 0041 @@ -75774,6 +76639,7 @@ A65E 0062 1E024 003F 2C24 0021 2C24 003F +0334 1E024 1E024 0334 2C54 0061 2C54 0041 @@ -75800,6 +76666,7 @@ A65E 0062 1E026 003F 2C26 0021 2C26 003F +0334 1E026 1E026 0334 2C56 0061 2C56 0041 @@ -75816,6 +76683,7 @@ A65E 0062 1E027 003F 2C27 0021 2C27 003F +0334 1E027 1E027 0334 2C57 0061 2C57 0041 @@ -75832,6 +76700,7 @@ A65E 0062 1E028 003F 2C28 0021 2C28 003F +0334 1E028 1E028 0334 2C58 0061 2C58 0041 @@ -75848,6 +76717,7 @@ A65E 0062 1E029 003F 2C29 0021 2C29 003F +0334 1E029 1E029 0334 2C59 0061 2C59 0041 @@ -75864,6 +76734,7 @@ A65E 0062 1E02A 003F 2C2A 0021 2C2A 003F +0334 1E02A 1E02A 0334 2C5A 0061 2C5A 0041 @@ -83764,6 +84635,61 @@ FBB0 0062 072C 0061 072C 0041 072C 0062 +0860 0021 +0860 003F +0860 0061 +0860 0041 +0860 0062 +0861 0021 +0861 003F +0861 0061 +0861 0041 +0861 0062 +0862 0021 +0862 003F +0862 0061 +0862 0041 +0862 0062 +0863 0021 +0863 003F +0863 0061 +0863 0041 +0863 0062 +0864 0021 +0864 003F +0864 0061 +0864 0041 +0864 0062 +0865 0021 +0865 003F +0865 0061 +0865 0041 +0865 0062 +0866 0021 +0866 003F +0866 0061 +0866 0041 +0866 0062 +0867 0021 +0867 003F +0867 0061 +0867 0041 +0867 0062 +0868 0021 +0868 003F +0868 0061 +0868 0041 +0868 0062 +0869 0021 +0869 003F +0869 0061 +0869 0041 +0869 0062 +086A 0021 +086A 003F +086A 0061 +086A 0041 +086A 0062 0840 0021 0840 003F 0840 0061 @@ -87886,6 +88812,11 @@ A8FB 0062 09D7 0061 09D7 0041 09D7 0062 +09FC 0021 +09FC 003F +09FC 0061 +09FC 0041 +09FC 0062 0A74 0021 0A74 003F 0A74 0061 @@ -90475,11 +91406,25 @@ A8FB 0062 0D57 0062 0D4D 0021 0D4D 003F +0D3B 0021 +0D3C 0021 +0D3B 003F +0D3C 003F 0334 0D4D 0D4D 0334 +0334 0D3B +0D3B 0334 +0334 0D3C +0D3C 0334 0D4D 0061 0D4D 0041 +0D3B 0061 +0D3C 0061 +0D3B 0041 +0D3C 0041 0D4D 0062 +0D3B 0062 +0D3C 0062 0D85 0021 0D85 003F 0D85 0061 @@ -94459,6 +95404,7 @@ A8C4 0062 11441 0062 11442 0021 11442 003F +0334 11442 11442 0334 11442 0061 11442 0041 @@ -96247,6 +97193,374 @@ A8C4 0062 1171F 0061 1171F 0041 1171F 0062 +11D00 0021 +11D00 003F +11D00 0334 +11D00 0061 +11D00 0041 +11D00 0062 +11D01 0021 +11D01 003F +11D01 0334 +11D01 0061 +11D01 0041 +11D01 0062 +11D02 0021 +11D02 003F +11D02 0334 +11D02 0061 +11D02 0041 +11D02 0062 +11D03 0021 +11D03 003F +11D03 0334 +11D03 0061 +11D03 0041 +11D03 0062 +11D04 0021 +11D04 003F +11D04 0334 +11D04 0061 +11D04 0041 +11D04 0062 +11D05 0021 +11D05 003F +11D05 0334 +11D05 0061 +11D05 0041 +11D05 0062 +11D06 0021 +11D06 003F +11D06 0334 +11D06 0061 +11D06 0041 +11D06 0062 +11D08 0021 +11D08 003F +11D08 0334 +11D08 0061 +11D08 0041 +11D08 0062 +11D09 0021 +11D09 003F +11D09 0334 +11D09 0061 +11D09 0041 +11D09 0062 +11D0B 0021 +11D0B 003F +11D0B 0334 +11D0B 0061 +11D0B 0041 +11D0B 0062 +11D0C 0021 +11D0C 003F +11D0C 0334 +11D0C 0061 +11D0C 0041 +11D0C 0062 +11D0D 0021 +11D0D 003F +11D0D 0334 +11D0D 0061 +11D0D 0041 +11D0D 0062 +11D0E 0021 +11D0E 003F +11D0E 0334 +11D0E 0061 +11D0E 0041 +11D0E 0062 +11D0F 0021 +11D0F 003F +11D0F 0334 +11D0F 0061 +11D0F 0041 +11D0F 0062 +11D10 0021 +11D10 003F +11D10 0334 +11D10 0061 +11D10 0041 +11D10 0062 +11D11 0021 +11D11 003F +11D11 0334 +11D11 0061 +11D11 0041 +11D11 0062 +11D12 0021 +11D12 003F +11D12 0334 +11D12 0061 +11D12 0041 +11D12 0062 +11D13 0021 +11D13 003F +11D13 0334 +11D13 0061 +11D13 0041 +11D13 0062 +11D14 0021 +11D14 003F +11D14 0334 +11D14 0061 +11D14 0041 +11D14 0062 +11D15 0021 +11D15 003F +11D15 0334 +11D15 0061 +11D15 0041 +11D15 0062 +11D16 0021 +11D16 003F +11D16 0334 +11D16 0061 +11D16 0041 +11D16 0062 +11D17 0021 +11D17 003F +11D17 0334 +11D17 0061 +11D17 0041 +11D17 0062 +11D18 0021 +11D18 003F +11D18 0334 +11D18 0061 +11D18 0041 +11D18 0062 +11D19 0021 +11D19 003F +11D19 0334 +11D19 0061 +11D19 0041 +11D19 0062 +11D1A 0021 +11D1A 003F +11D1A 0334 +11D1A 0061 +11D1A 0041 +11D1A 0062 +11D1B 0021 +11D1B 003F +11D1B 0334 +11D1B 0061 +11D1B 0041 +11D1B 0062 +11D1C 0021 +11D1C 003F +11D1C 0334 +11D1C 0061 +11D1C 0041 +11D1C 0062 +11D1D 0021 +11D1D 003F +11D1D 0334 +11D1D 0061 +11D1D 0041 +11D1D 0062 +11D1E 0021 +11D1E 003F +11D1E 0334 +11D1E 0061 +11D1E 0041 +11D1E 0062 +11D1F 0021 +11D1F 003F +11D1F 0334 +11D1F 0061 +11D1F 0041 +11D1F 0062 +11D20 0021 +11D20 003F +11D20 0334 +11D20 0061 +11D20 0041 +11D20 0062 +11D21 0021 +11D21 003F +11D21 0334 +11D21 0061 +11D21 0041 +11D21 0062 +11D22 0021 +11D22 003F +11D22 0334 +11D22 0061 +11D22 0041 +11D22 0062 +11D23 0021 +11D23 003F +11D23 0334 +11D23 0061 +11D23 0041 +11D23 0062 +11D24 0021 +11D24 003F +11D24 0334 +11D24 0061 +11D24 0041 +11D24 0062 +11D25 0021 +11D25 003F +11D25 0334 +11D25 0061 +11D25 0041 +11D25 0062 +11D26 0021 +11D26 003F +11D46 0021 +11D46 003F +11D47 0021 +11D47 003F +11D26 0334 +11D46 0334 +11D47 0334 +11D26 0061 +11D26 0041 +11D46 0061 +11D46 0041 +11D47 0061 +11D47 0041 +11D26 0062 +11D46 0062 +11D47 0062 +11D27 0021 +11D27 003F +11D27 0334 +11D27 0061 +11D27 0041 +11D27 0062 +11D28 0021 +11D28 003F +11D28 0334 +11D28 0061 +11D28 0041 +11D28 0062 +11D29 0021 +11D29 003F +11D29 0334 +11D29 0061 +11D29 0041 +11D29 0062 +11D2A 0021 +11D2A 003F +11D2A 0334 +11D2A 0061 +11D2A 0041 +11D2A 0062 +11D2B 0021 +11D2B 003F +11D2B 0334 +11D2B 0061 +11D2B 0041 +11D2B 0062 +11D2C 0021 +11D2C 003F +11D2C 0334 +11D2C 0061 +11D2C 0041 +11D2C 0062 +11D2D 0021 +11D2D 003F +11D2D 0334 +11D2D 0061 +11D2D 0041 +11D2D 0062 +11D2E 0021 +11D2E 003F +11D2E 0334 +11D2E 0061 +11D2E 0041 +11D2E 0062 +11D2F 0021 +11D2F 003F +11D2F 0334 +11D2F 0061 +11D2F 0041 +11D2F 0062 +11D30 0021 +11D30 003F +11D30 0334 +11D30 0061 +11D30 0041 +11D30 0062 +11D31 0021 +11D31 003F +11D31 0334 +11D31 0061 +11D31 0041 +11D31 0062 +11D32 0021 +11D32 003F +11D32 0334 +11D32 0061 +11D32 0041 +11D32 0062 +11D33 0021 +11D33 003F +11D33 0334 +11D33 0061 +11D33 0041 +11D33 0062 +11D34 0021 +11D34 003F +11D34 0334 +11D34 0061 +11D34 0041 +11D34 0062 +11D35 0021 +11D35 003F +11D35 0334 +11D35 0061 +11D35 0041 +11D35 0062 +11D36 0021 +11D36 003F +11D36 0334 +11D36 0061 +11D36 0041 +11D36 0062 +11D3A 0021 +11D3A 003F +11D3A 0334 +11D3A 0061 +11D3A 0041 +11D3A 0062 +11D3C 0021 +11D3C 003F +11D3C 0334 +11D3C 0061 +11D3C 0041 +11D3C 0062 +11D3D 0021 +11D3D 003F +11D3D 0334 +11D3D 0061 +11D3D 0041 +11D3D 0062 +11D3F 0021 +11D3F 003F +11D3F 0334 +11D3F 0061 +11D3F 0041 +11D3F 0062 +11D44 0021 +11D44 003F +0334 11D44 +11D44 0334 +11D44 0061 +11D44 0041 +11D44 0062 +11D45 0021 +11D45 003F +0334 11D45 +11D45 0334 +11D45 0061 +11D45 0041 +11D45 0062 1B83 0021 1B83 003F 1BBA 0021 @@ -97531,6 +98845,7 @@ A8C4 0062 11C3B 0062 11C3F 0021 11C3F 003F +0334 11C3F 11C3F 0334 11C3F 0061 11C3F 0041 @@ -104167,6 +105482,771 @@ AADC 0062 0F84 0061 0F84 0041 0F84 0062 +11A0B 0021 +11A0B 003F +11A0B 0334 +11A0B 0061 +11A0B 0041 +11A0B 0062 +11A32 0021 +11A32 003F +11A32 0334 +11A32 0061 +11A32 0041 +11A32 0062 +11A0C 0021 +11A0C 003F +11A0C 0334 +11A0C 0061 +11A0C 0041 +11A0C 0062 +11A0D 0021 +11A0D 003F +11A0D 0334 +11A0D 0061 +11A0D 0041 +11A0D 0062 +11A0E 0021 +11A0E 003F +11A0E 0334 +11A0E 0061 +11A0E 0041 +11A0E 0062 +11A0F 0021 +11A0F 003F +11A0F 0334 +11A0F 0061 +11A0F 0041 +11A0F 0062 +11A10 0021 +11A10 003F +11A10 0334 +11A10 0061 +11A10 0041 +11A10 0062 +11A11 0021 +11A11 003F +11A11 0334 +11A11 0061 +11A11 0041 +11A11 0062 +11A12 0021 +11A12 003F +11A12 0334 +11A12 0061 +11A12 0041 +11A12 0062 +11A13 0021 +11A13 003F +11A13 0334 +11A13 0061 +11A13 0041 +11A13 0062 +11A14 0021 +11A14 003F +11A14 0334 +11A14 0061 +11A14 0041 +11A14 0062 +11A15 0021 +11A15 003F +11A15 0334 +11A15 0061 +11A15 0041 +11A15 0062 +11A16 0021 +11A16 003F +11A16 0334 +11A16 0061 +11A16 0041 +11A16 0062 +11A17 0021 +11A17 003F +11A17 0334 +11A17 0061 +11A17 0041 +11A17 0062 +11A18 0021 +11A18 003F +11A18 0334 +11A18 0061 +11A18 0041 +11A18 0062 +11A19 0021 +11A19 003F +11A19 0334 +11A19 0061 +11A19 0041 +11A19 0062 +11A1A 0021 +11A1A 003F +11A1A 0334 +11A1A 0061 +11A1A 0041 +11A1A 0062 +11A1B 0021 +11A1B 003F +11A1B 0334 +11A1B 0061 +11A1B 0041 +11A1B 0062 +11A1C 0021 +11A1C 003F +11A1C 0334 +11A1C 0061 +11A1C 0041 +11A1C 0062 +11A1D 0021 +11A1D 003F +11A1D 0334 +11A1D 0061 +11A1D 0041 +11A1D 0062 +11A1E 0021 +11A1E 003F +11A1E 0334 +11A1E 0061 +11A1E 0041 +11A1E 0062 +11A1F 0021 +11A1F 003F +11A1F 0334 +11A1F 0061 +11A1F 0041 +11A1F 0062 +11A20 0021 +11A20 003F +11A20 0334 +11A20 0061 +11A20 0041 +11A20 0062 +11A21 0021 +11A21 003F +11A21 0334 +11A21 0061 +11A21 0041 +11A21 0062 +11A22 0021 +11A22 003F +11A22 0334 +11A22 0061 +11A22 0041 +11A22 0062 +11A23 0021 +11A23 003F +11A23 0334 +11A23 0061 +11A23 0041 +11A23 0062 +11A24 0021 +11A24 003F +11A24 0334 +11A24 0061 +11A24 0041 +11A24 0062 +11A25 0021 +11A25 003F +11A25 0334 +11A25 0061 +11A25 0041 +11A25 0062 +11A26 0021 +11A26 003F +11A26 0334 +11A26 0061 +11A26 0041 +11A26 0062 +11A27 0021 +11A27 003F +11A27 0334 +11A27 0061 +11A27 0041 +11A27 0062 +11A28 0021 +11A28 003F +11A28 0334 +11A28 0061 +11A28 0041 +11A28 0062 +11A29 0021 +11A29 003F +11A29 0334 +11A29 0061 +11A29 0041 +11A29 0062 +11A2A 0021 +11A2A 003F +11A3B 0021 +11A3B 003F +11A2A 0334 +11A3B 0334 +11A2A 0061 +11A2A 0041 +11A3B 0061 +11A3B 0041 +11A2A 0062 +11A3B 0062 +11A2B 0021 +11A2B 003F +11A3A 0021 +11A3A 003F +11A3C 0021 +11A3C 003F +11A2B 0334 +11A3A 0334 +11A3C 0334 +11A2B 0061 +11A2B 0041 +11A3A 0061 +11A3A 0041 +11A3C 0061 +11A3C 0041 +11A2B 0062 +11A3A 0062 +11A3C 0062 +11A2C 0021 +11A2C 003F +11A3D 0021 +11A3D 003F +11A2C 0334 +11A3D 0334 +11A2C 0061 +11A2C 0041 +11A3D 0061 +11A3D 0041 +11A2C 0062 +11A3D 0062 +11A2D 0021 +11A2D 003F +11A3E 0021 +11A3E 003F +11A2D 0334 +11A3E 0334 +11A2D 0061 +11A2D 0041 +11A3E 0061 +11A3E 0041 +11A2D 0062 +11A3E 0062 +11A2E 0021 +11A2E 003F +11A2E 0334 +11A2E 0061 +11A2E 0041 +11A2E 0062 +11A2F 0021 +11A2F 003F +11A2F 0334 +11A2F 0061 +11A2F 0041 +11A2F 0062 +11A30 0021 +11A30 003F +11A30 0334 +11A30 0061 +11A30 0041 +11A30 0062 +11A31 0021 +11A31 003F +11A31 0334 +11A31 0061 +11A31 0041 +11A31 0062 +11A00 0021 +11A00 003F +11A00 0334 +11A00 0061 +11A00 0041 +11A00 0062 +11A01 0021 +11A01 003F +11A01 0334 +11A01 0061 +11A01 0041 +11A01 0062 +11A02 0021 +11A02 003F +11A02 0334 +11A02 0061 +11A02 0041 +11A02 0062 +11A03 0021 +11A03 003F +11A03 0334 +11A03 0061 +11A03 0041 +11A03 0062 +11A04 0021 +11A04 003F +11A04 0334 +11A04 0061 +11A04 0041 +11A04 0062 +11A05 0021 +11A05 003F +11A05 0334 +11A05 0061 +11A05 0041 +11A05 0062 +11A06 0021 +11A06 003F +11A06 0334 +11A06 0061 +11A06 0041 +11A06 0062 +11A07 0021 +11A07 003F +11A07 0334 +11A07 0061 +11A07 0041 +11A07 0062 +11A08 0021 +11A08 003F +11A08 0334 +11A08 0061 +11A08 0041 +11A08 0062 +11A09 0021 +11A09 003F +11A09 0334 +11A09 0061 +11A09 0041 +11A09 0062 +11A0A 0021 +11A0A 003F +11A0A 0334 +11A0A 0061 +11A0A 0041 +11A0A 0062 +11A34 0021 +11A34 003F +0334 11A34 +11A34 0334 +11A34 0061 +11A34 0041 +11A34 0062 +11A47 0021 +11A47 003F +0334 11A47 +11A47 0334 +11A47 0061 +11A47 0041 +11A47 0062 +11A50 0021 +11A50 003F +11A50 0334 +11A50 0061 +11A50 0041 +11A50 0062 +11A51 0021 +11A51 003F +11A51 0334 +11A51 0061 +11A51 0041 +11A51 0062 +11A52 0021 +11A52 003F +11A52 0334 +11A52 0061 +11A52 0041 +11A52 0062 +11A53 0021 +11A53 003F +11A53 0334 +11A53 0061 +11A53 0041 +11A53 0062 +11A59 0021 +11A59 003F +11A59 0334 +11A59 0061 +11A59 0041 +11A59 0062 +11A5A 0021 +11A5A 003F +11A5A 0334 +11A5A 0061 +11A5A 0041 +11A5A 0062 +11A54 0021 +11A54 003F +11A54 0334 +11A54 0061 +11A54 0041 +11A54 0062 +11A56 0021 +11A56 003F +11A56 0334 +11A56 0061 +11A56 0041 +11A56 0062 +11A55 0021 +11A55 003F +11A55 0334 +11A55 0061 +11A55 0041 +11A55 0062 +11A57 0021 +11A57 003F +11A57 0334 +11A57 0061 +11A57 0041 +11A57 0062 +11A58 0021 +11A58 003F +11A58 0334 +11A58 0061 +11A58 0041 +11A58 0062 +11A5B 0021 +11A5B 003F +11A5B 0334 +11A5B 0061 +11A5B 0041 +11A5B 0062 +11A5C 0021 +11A5C 003F +11A8A 0021 +11A8A 003F +11A5C 0334 +11A8A 0334 +11A5C 0061 +11A5C 0041 +11A8A 0061 +11A8A 0041 +11A5C 0062 +11A8A 0062 +11A83 0021 +11A83 003F +11A83 0334 +11A83 0061 +11A83 0041 +11A83 0062 +11A5D 0021 +11A5D 003F +11A8B 0021 +11A8B 003F +11A5D 0334 +11A8B 0334 +11A5D 0061 +11A5D 0041 +11A8B 0061 +11A8B 0041 +11A5D 0062 +11A8B 0062 +11A5E 0021 +11A5E 003F +11A5E 0334 +11A5E 0061 +11A5E 0041 +11A5E 0062 +11A5F 0021 +11A5F 003F +11A5F 0334 +11A5F 0061 +11A5F 0041 +11A5F 0062 +11A60 0021 +11A60 003F +11A8C 0021 +11A8C 003F +11A60 0334 +11A8C 0334 +11A60 0061 +11A60 0041 +11A8C 0061 +11A8C 0041 +11A60 0062 +11A8C 0062 +11A61 0021 +11A61 003F +11A61 0334 +11A61 0061 +11A61 0041 +11A61 0062 +11A62 0021 +11A62 003F +11A62 0334 +11A62 0061 +11A62 0041 +11A62 0062 +11A63 0021 +11A63 003F +11A63 0334 +11A63 0061 +11A63 0041 +11A63 0062 +11A64 0021 +11A64 003F +11A64 0334 +11A64 0061 +11A64 0041 +11A64 0062 +11A65 0021 +11A65 003F +11A65 0334 +11A65 0061 +11A65 0041 +11A65 0062 +11A66 0021 +11A66 003F +11A66 0334 +11A66 0061 +11A66 0041 +11A66 0062 +11A67 0021 +11A67 003F +11A67 0334 +11A67 0061 +11A67 0041 +11A67 0062 +11A68 0021 +11A68 003F +11A68 0334 +11A68 0061 +11A68 0041 +11A68 0062 +11A69 0021 +11A69 003F +11A69 0334 +11A69 0061 +11A69 0041 +11A69 0062 +11A6A 0021 +11A6A 003F +11A6A 0334 +11A6A 0061 +11A6A 0041 +11A6A 0062 +11A6B 0021 +11A6B 003F +11A8D 0021 +11A8D 003F +11A6B 0334 +11A8D 0334 +11A6B 0061 +11A6B 0041 +11A8D 0061 +11A8D 0041 +11A6B 0062 +11A8D 0062 +11A6C 0021 +11A6C 003F +11A6C 0334 +11A6C 0061 +11A6C 0041 +11A6C 0062 +11A6D 0021 +11A6D 003F +11A6D 0334 +11A6D 0061 +11A6D 0041 +11A6D 0062 +11A6E 0021 +11A6E 003F +11A6E 0334 +11A6E 0061 +11A6E 0041 +11A6E 0062 +11A6F 0021 +11A6F 003F +11A8E 0021 +11A8E 003F +11A6F 0334 +11A8E 0334 +11A6F 0061 +11A6F 0041 +11A8E 0061 +11A8E 0041 +11A6F 0062 +11A8E 0062 +11A70 0021 +11A70 003F +11A8F 0021 +11A8F 003F +11A70 0334 +11A8F 0334 +11A70 0061 +11A70 0041 +11A8F 0061 +11A8F 0041 +11A70 0062 +11A8F 0062 +11A71 0021 +11A71 003F +11A71 0334 +11A71 0061 +11A71 0041 +11A71 0062 +11A72 0021 +11A72 003F +11A72 0334 +11A72 0061 +11A72 0041 +11A72 0062 +11A73 0021 +11A73 003F +11A73 0334 +11A73 0061 +11A73 0041 +11A73 0062 +11A74 0021 +11A74 003F +11A90 0021 +11A90 003F +11A74 0334 +11A90 0334 +11A74 0061 +11A74 0041 +11A90 0061 +11A90 0041 +11A74 0062 +11A90 0062 +11A75 0021 +11A75 003F +11A75 0334 +11A75 0061 +11A75 0041 +11A75 0062 +11A76 0021 +11A76 003F +11A76 0334 +11A76 0061 +11A76 0041 +11A76 0062 +11A77 0021 +11A77 003F +11A77 0334 +11A77 0061 +11A77 0041 +11A77 0062 +11A78 0021 +11A78 003F +11A78 0334 +11A78 0061 +11A78 0041 +11A78 0062 +11A79 0021 +11A79 003F +11A79 0334 +11A79 0061 +11A79 0041 +11A79 0062 +11A7A 0021 +11A7A 003F +11A95 0021 +11A95 003F +11A7A 0334 +11A95 0334 +11A7A 0061 +11A7A 0041 +11A95 0061 +11A95 0041 +11A7A 0062 +11A95 0062 +11A7B 0021 +11A7B 003F +11A7B 0334 +11A7B 0061 +11A7B 0041 +11A7B 0062 +11A7C 0021 +11A7C 003F +11A86 0021 +11A86 003F +11A91 0021 +11A91 003F +11A7C 0334 +11A86 0334 +11A91 0334 +11A7C 0061 +11A7C 0041 +11A86 0061 +11A86 0041 +11A91 0061 +11A91 0041 +11A7C 0062 +11A86 0062 +11A91 0062 +11A7D 0021 +11A7D 003F +11A87 0021 +11A87 003F +11A92 0021 +11A92 003F +11A7D 0334 +11A87 0334 +11A92 0334 +11A7D 0061 +11A7D 0041 +11A87 0061 +11A87 0041 +11A92 0061 +11A92 0041 +11A7D 0062 +11A87 0062 +11A92 0062 +11A7E 0021 +11A7E 003F +11A7E 0334 +11A7E 0061 +11A7E 0041 +11A7E 0062 +11A7F 0021 +11A7F 003F +11A88 0021 +11A88 003F +11A93 0021 +11A93 003F +11A7F 0334 +11A88 0334 +11A93 0334 +11A7F 0061 +11A7F 0041 +11A88 0061 +11A88 0041 +11A93 0061 +11A93 0041 +11A7F 0062 +11A88 0062 +11A93 0062 +11A80 0021 +11A80 003F +11A80 0334 +11A80 0061 +11A80 0041 +11A80 0062 +11A81 0021 +11A81 003F +11A89 0021 +11A89 003F +11A94 0021 +11A94 003F +11A81 0334 +11A89 0334 +11A94 0334 +11A81 0061 +11A81 0041 +11A89 0061 +11A89 0041 +11A94 0061 +11A94 0041 +11A81 0062 +11A89 0062 +11A94 0062 +11A82 0021 +11A82 003F +11A82 0334 +11A82 0061 +11A82 0041 +11A82 0062 +11A99 0021 +11A99 003F +0334 11A99 +11A99 0334 +11A99 0061 +11A99 0041 +11A99 0062 11C72 0021 11C72 003F 11C72 0334 @@ -130571,12 +132651,6 @@ FF95 0062 3350 0061 3350 0041 3350 0062 -1B001 0021 -1B001 003F -1B001 0334 -1B001 0061 -1B001 0041 -1B001 0062 3087 0021 3087 003F 3088 0021 @@ -130904,6 +132978,1722 @@ FF9D 0041 3093 0062 30F3 0062 FF9D 0062 +1B002 0021 +1B002 003F +1B002 0334 +1B002 0061 +1B002 0041 +1B002 0062 +1B003 0021 +1B003 003F +1B003 0334 +1B003 0061 +1B003 0041 +1B003 0062 +1B004 0021 +1B004 003F +1B004 0334 +1B004 0061 +1B004 0041 +1B004 0062 +1B005 0021 +1B005 003F +1B005 0334 +1B005 0061 +1B005 0041 +1B005 0062 +1B006 0021 +1B006 003F +1B006 0334 +1B006 0061 +1B006 0041 +1B006 0062 +1B007 0021 +1B007 003F +1B007 0334 +1B007 0061 +1B007 0041 +1B007 0062 +1B008 0021 +1B008 003F +1B008 0334 +1B008 0061 +1B008 0041 +1B008 0062 +1B009 0021 +1B009 003F +1B009 0334 +1B009 0061 +1B009 0041 +1B009 0062 +1B00A 0021 +1B00A 003F +1B00A 0334 +1B00A 0061 +1B00A 0041 +1B00A 0062 +1B00B 0021 +1B00B 003F +1B00B 0334 +1B00B 0061 +1B00B 0041 +1B00B 0062 +1B00C 0021 +1B00C 003F +1B00C 0334 +1B00C 0061 +1B00C 0041 +1B00C 0062 +1B00D 0021 +1B00D 003F +1B00D 0334 +1B00D 0061 +1B00D 0041 +1B00D 0062 +1B00E 0021 +1B00E 003F +1B00E 0334 +1B00E 0061 +1B00E 0041 +1B00E 0062 +1B001 0021 +1B001 003F +1B001 0334 +1B001 0061 +1B001 0041 +1B001 0062 +1B00F 0021 +1B00F 003F +1B00F 0334 +1B00F 0061 +1B00F 0041 +1B00F 0062 +1B010 0021 +1B010 003F +1B010 0334 +1B010 0061 +1B010 0041 +1B010 0062 +1B011 0021 +1B011 003F +1B011 0334 +1B011 0061 +1B011 0041 +1B011 0062 +1B012 0021 +1B012 003F +1B012 0334 +1B012 0061 +1B012 0041 +1B012 0062 +1B013 0021 +1B013 003F +1B013 0334 +1B013 0061 +1B013 0041 +1B013 0062 +1B014 0021 +1B014 003F +1B014 0334 +1B014 0061 +1B014 0041 +1B014 0062 +1B015 0021 +1B015 003F +1B015 0334 +1B015 0061 +1B015 0041 +1B015 0062 +1B016 0021 +1B016 003F +1B016 0334 +1B016 0061 +1B016 0041 +1B016 0062 +1B017 0021 +1B017 003F +1B017 0334 +1B017 0061 +1B017 0041 +1B017 0062 +1B018 0021 +1B018 003F +1B018 0334 +1B018 0061 +1B018 0041 +1B018 0062 +1B019 0021 +1B019 003F +1B019 0334 +1B019 0061 +1B019 0041 +1B019 0062 +1B01A 0021 +1B01A 003F +1B01A 0334 +1B01A 0061 +1B01A 0041 +1B01A 0062 +1B01B 0021 +1B01B 003F +1B01B 0334 +1B01B 0061 +1B01B 0041 +1B01B 0062 +1B01C 0021 +1B01C 003F +1B01C 0334 +1B01C 0061 +1B01C 0041 +1B01C 0062 +1B01D 0021 +1B01D 003F +1B01D 0334 +1B01D 0061 +1B01D 0041 +1B01D 0062 +1B01E 0021 +1B01E 003F +1B01E 0334 +1B01E 0061 +1B01E 0041 +1B01E 0062 +1B01F 0021 +1B01F 003F +1B01F 0334 +1B01F 0061 +1B01F 0041 +1B01F 0062 +1B020 0021 +1B020 003F +1B020 0334 +1B020 0061 +1B020 0041 +1B020 0062 +1B021 0021 +1B021 003F +1B021 0334 +1B021 0061 +1B021 0041 +1B021 0062 +1B022 0021 +1B022 003F +1B022 0334 +1B022 0061 +1B022 0041 +1B022 0062 +1B023 0021 +1B023 003F +1B023 0334 +1B023 0061 +1B023 0041 +1B023 0062 +1B024 0021 +1B024 003F +1B024 0334 +1B024 0061 +1B024 0041 +1B024 0062 +1B025 0021 +1B025 003F +1B025 0334 +1B025 0061 +1B025 0041 +1B025 0062 +1B026 0021 +1B026 003F +1B026 0334 +1B026 0061 +1B026 0041 +1B026 0062 +1B027 0021 +1B027 003F +1B027 0334 +1B027 0061 +1B027 0041 +1B027 0062 +1B028 0021 +1B028 003F +1B028 0334 +1B028 0061 +1B028 0041 +1B028 0062 +1B029 0021 +1B029 003F +1B029 0334 +1B029 0061 +1B029 0041 +1B029 0062 +1B02A 0021 +1B02A 003F +1B02A 0334 +1B02A 0061 +1B02A 0041 +1B02A 0062 +1B02B 0021 +1B02B 003F +1B02B 0334 +1B02B 0061 +1B02B 0041 +1B02B 0062 +1B02C 0021 +1B02C 003F +1B02C 0334 +1B02C 0061 +1B02C 0041 +1B02C 0062 +1B02D 0021 +1B02D 003F +1B02D 0334 +1B02D 0061 +1B02D 0041 +1B02D 0062 +1B02E 0021 +1B02E 003F +1B02E 0334 +1B02E 0061 +1B02E 0041 +1B02E 0062 +1B02F 0021 +1B02F 003F +1B02F 0334 +1B02F 0061 +1B02F 0041 +1B02F 0062 +1B030 0021 +1B030 003F +1B030 0334 +1B030 0061 +1B030 0041 +1B030 0062 +1B031 0021 +1B031 003F +1B031 0334 +1B031 0061 +1B031 0041 +1B031 0062 +1B032 0021 +1B032 003F +1B032 0334 +1B032 0061 +1B032 0041 +1B032 0062 +1B033 0021 +1B033 003F +1B033 0334 +1B033 0061 +1B033 0041 +1B033 0062 +1B034 0021 +1B034 003F +1B034 0334 +1B034 0061 +1B034 0041 +1B034 0062 +1B035 0021 +1B035 003F +1B035 0334 +1B035 0061 +1B035 0041 +1B035 0062 +1B036 0021 +1B036 003F +1B036 0334 +1B036 0061 +1B036 0041 +1B036 0062 +1B037 0021 +1B037 003F +1B037 0334 +1B037 0061 +1B037 0041 +1B037 0062 +1B038 0021 +1B038 003F +1B038 0334 +1B038 0061 +1B038 0041 +1B038 0062 +1B039 0021 +1B039 003F +1B039 0334 +1B039 0061 +1B039 0041 +1B039 0062 +1B03A 0021 +1B03A 003F +1B03A 0334 +1B03A 0061 +1B03A 0041 +1B03A 0062 +1B03B 0021 +1B03B 003F +1B03B 0334 +1B03B 0061 +1B03B 0041 +1B03B 0062 +1B03C 0021 +1B03C 003F +1B03C 0334 +1B03C 0061 +1B03C 0041 +1B03C 0062 +1B03D 0021 +1B03D 003F +1B03D 0334 +1B03D 0061 +1B03D 0041 +1B03D 0062 +1B03E 0021 +1B03E 003F +1B03E 0334 +1B03E 0061 +1B03E 0041 +1B03E 0062 +1B03F 0021 +1B03F 003F +1B03F 0334 +1B03F 0061 +1B03F 0041 +1B03F 0062 +1B040 0021 +1B040 003F +1B040 0334 +1B040 0061 +1B040 0041 +1B040 0062 +1B041 0021 +1B041 003F +1B041 0334 +1B041 0061 +1B041 0041 +1B041 0062 +1B042 0021 +1B042 003F +1B042 0334 +1B042 0061 +1B042 0041 +1B042 0062 +1B043 0021 +1B043 003F +1B043 0334 +1B043 0061 +1B043 0041 +1B043 0062 +1B044 0021 +1B044 003F +1B044 0334 +1B044 0061 +1B044 0041 +1B044 0062 +1B045 0021 +1B045 003F +1B045 0334 +1B045 0061 +1B045 0041 +1B045 0062 +1B046 0021 +1B046 003F +1B046 0334 +1B046 0061 +1B046 0041 +1B046 0062 +1B047 0021 +1B047 003F +1B047 0334 +1B047 0061 +1B047 0041 +1B047 0062 +1B048 0021 +1B048 003F +1B048 0334 +1B048 0061 +1B048 0041 +1B048 0062 +1B049 0021 +1B049 003F +1B049 0334 +1B049 0061 +1B049 0041 +1B049 0062 +1B04A 0021 +1B04A 003F +1B04A 0334 +1B04A 0061 +1B04A 0041 +1B04A 0062 +1B04B 0021 +1B04B 003F +1B04B 0334 +1B04B 0061 +1B04B 0041 +1B04B 0062 +1B04C 0021 +1B04C 003F +1B04C 0334 +1B04C 0061 +1B04C 0041 +1B04C 0062 +1B04D 0021 +1B04D 003F +1B04D 0334 +1B04D 0061 +1B04D 0041 +1B04D 0062 +1B04E 0021 +1B04E 003F +1B04E 0334 +1B04E 0061 +1B04E 0041 +1B04E 0062 +1B04F 0021 +1B04F 003F +1B04F 0334 +1B04F 0061 +1B04F 0041 +1B04F 0062 +1B050 0021 +1B050 003F +1B050 0334 +1B050 0061 +1B050 0041 +1B050 0062 +1B051 0021 +1B051 003F +1B051 0334 +1B051 0061 +1B051 0041 +1B051 0062 +1B052 0021 +1B052 003F +1B052 0334 +1B052 0061 +1B052 0041 +1B052 0062 +1B053 0021 +1B053 003F +1B053 0334 +1B053 0061 +1B053 0041 +1B053 0062 +1B054 0021 +1B054 003F +1B054 0334 +1B054 0061 +1B054 0041 +1B054 0062 +1B055 0021 +1B055 003F +1B055 0334 +1B055 0061 +1B055 0041 +1B055 0062 +1B056 0021 +1B056 003F +1B056 0334 +1B056 0061 +1B056 0041 +1B056 0062 +1B057 0021 +1B057 003F +1B057 0334 +1B057 0061 +1B057 0041 +1B057 0062 +1B058 0021 +1B058 003F +1B058 0334 +1B058 0061 +1B058 0041 +1B058 0062 +1B059 0021 +1B059 003F +1B059 0334 +1B059 0061 +1B059 0041 +1B059 0062 +1B05A 0021 +1B05A 003F +1B05A 0334 +1B05A 0061 +1B05A 0041 +1B05A 0062 +1B05B 0021 +1B05B 003F +1B05B 0334 +1B05B 0061 +1B05B 0041 +1B05B 0062 +1B05C 0021 +1B05C 003F +1B05C 0334 +1B05C 0061 +1B05C 0041 +1B05C 0062 +1B05D 0021 +1B05D 003F +1B05D 0334 +1B05D 0061 +1B05D 0041 +1B05D 0062 +1B05E 0021 +1B05E 003F +1B05E 0334 +1B05E 0061 +1B05E 0041 +1B05E 0062 +1B05F 0021 +1B05F 003F +1B05F 0334 +1B05F 0061 +1B05F 0041 +1B05F 0062 +1B060 0021 +1B060 003F +1B060 0334 +1B060 0061 +1B060 0041 +1B060 0062 +1B061 0021 +1B061 003F +1B061 0334 +1B061 0061 +1B061 0041 +1B061 0062 +1B062 0021 +1B062 003F +1B062 0334 +1B062 0061 +1B062 0041 +1B062 0062 +1B063 0021 +1B063 003F +1B063 0334 +1B063 0061 +1B063 0041 +1B063 0062 +1B064 0021 +1B064 003F +1B064 0334 +1B064 0061 +1B064 0041 +1B064 0062 +1B065 0021 +1B065 003F +1B065 0334 +1B065 0061 +1B065 0041 +1B065 0062 +1B066 0021 +1B066 003F +1B066 0334 +1B066 0061 +1B066 0041 +1B066 0062 +1B067 0021 +1B067 003F +1B067 0334 +1B067 0061 +1B067 0041 +1B067 0062 +1B068 0021 +1B068 003F +1B068 0334 +1B068 0061 +1B068 0041 +1B068 0062 +1B069 0021 +1B069 003F +1B069 0334 +1B069 0061 +1B069 0041 +1B069 0062 +1B06A 0021 +1B06A 003F +1B06A 0334 +1B06A 0061 +1B06A 0041 +1B06A 0062 +1B06B 0021 +1B06B 003F +1B06B 0334 +1B06B 0061 +1B06B 0041 +1B06B 0062 +1B06C 0021 +1B06C 003F +1B06C 0334 +1B06C 0061 +1B06C 0041 +1B06C 0062 +1B06D 0021 +1B06D 003F +1B06D 0334 +1B06D 0061 +1B06D 0041 +1B06D 0062 +1B06E 0021 +1B06E 003F +1B06E 0334 +1B06E 0061 +1B06E 0041 +1B06E 0062 +1B06F 0021 +1B06F 003F +1B06F 0334 +1B06F 0061 +1B06F 0041 +1B06F 0062 +1B070 0021 +1B070 003F +1B070 0334 +1B070 0061 +1B070 0041 +1B070 0062 +1B071 0021 +1B071 003F +1B071 0334 +1B071 0061 +1B071 0041 +1B071 0062 +1B072 0021 +1B072 003F +1B072 0334 +1B072 0061 +1B072 0041 +1B072 0062 +1B073 0021 +1B073 003F +1B073 0334 +1B073 0061 +1B073 0041 +1B073 0062 +1B074 0021 +1B074 003F +1B074 0334 +1B074 0061 +1B074 0041 +1B074 0062 +1B075 0021 +1B075 003F +1B075 0334 +1B075 0061 +1B075 0041 +1B075 0062 +1B076 0021 +1B076 003F +1B076 0334 +1B076 0061 +1B076 0041 +1B076 0062 +1B077 0021 +1B077 003F +1B077 0334 +1B077 0061 +1B077 0041 +1B077 0062 +1B078 0021 +1B078 003F +1B078 0334 +1B078 0061 +1B078 0041 +1B078 0062 +1B079 0021 +1B079 003F +1B079 0334 +1B079 0061 +1B079 0041 +1B079 0062 +1B07A 0021 +1B07A 003F +1B07A 0334 +1B07A 0061 +1B07A 0041 +1B07A 0062 +1B07B 0021 +1B07B 003F +1B07B 0334 +1B07B 0061 +1B07B 0041 +1B07B 0062 +1B07C 0021 +1B07C 003F +1B07C 0334 +1B07C 0061 +1B07C 0041 +1B07C 0062 +1B07D 0021 +1B07D 003F +1B07D 0334 +1B07D 0061 +1B07D 0041 +1B07D 0062 +1B07E 0021 +1B07E 003F +1B07E 0334 +1B07E 0061 +1B07E 0041 +1B07E 0062 +1B07F 0021 +1B07F 003F +1B07F 0334 +1B07F 0061 +1B07F 0041 +1B07F 0062 +1B080 0021 +1B080 003F +1B080 0334 +1B080 0061 +1B080 0041 +1B080 0062 +1B081 0021 +1B081 003F +1B081 0334 +1B081 0061 +1B081 0041 +1B081 0062 +1B082 0021 +1B082 003F +1B082 0334 +1B082 0061 +1B082 0041 +1B082 0062 +1B083 0021 +1B083 003F +1B083 0334 +1B083 0061 +1B083 0041 +1B083 0062 +1B084 0021 +1B084 003F +1B084 0334 +1B084 0061 +1B084 0041 +1B084 0062 +1B085 0021 +1B085 003F +1B085 0334 +1B085 0061 +1B085 0041 +1B085 0062 +1B086 0021 +1B086 003F +1B086 0334 +1B086 0061 +1B086 0041 +1B086 0062 +1B087 0021 +1B087 003F +1B087 0334 +1B087 0061 +1B087 0041 +1B087 0062 +1B088 0021 +1B088 003F +1B088 0334 +1B088 0061 +1B088 0041 +1B088 0062 +1B089 0021 +1B089 003F +1B089 0334 +1B089 0061 +1B089 0041 +1B089 0062 +1B08A 0021 +1B08A 003F +1B08A 0334 +1B08A 0061 +1B08A 0041 +1B08A 0062 +1B08B 0021 +1B08B 003F +1B08B 0334 +1B08B 0061 +1B08B 0041 +1B08B 0062 +1B08C 0021 +1B08C 003F +1B08C 0334 +1B08C 0061 +1B08C 0041 +1B08C 0062 +1B08D 0021 +1B08D 003F +1B08D 0334 +1B08D 0061 +1B08D 0041 +1B08D 0062 +1B08E 0021 +1B08E 003F +1B08E 0334 +1B08E 0061 +1B08E 0041 +1B08E 0062 +1B08F 0021 +1B08F 003F +1B08F 0334 +1B08F 0061 +1B08F 0041 +1B08F 0062 +1B090 0021 +1B090 003F +1B090 0334 +1B090 0061 +1B090 0041 +1B090 0062 +1B091 0021 +1B091 003F +1B091 0334 +1B091 0061 +1B091 0041 +1B091 0062 +1B092 0021 +1B092 003F +1B092 0334 +1B092 0061 +1B092 0041 +1B092 0062 +1B093 0021 +1B093 003F +1B093 0334 +1B093 0061 +1B093 0041 +1B093 0062 +1B094 0021 +1B094 003F +1B094 0334 +1B094 0061 +1B094 0041 +1B094 0062 +1B095 0021 +1B095 003F +1B095 0334 +1B095 0061 +1B095 0041 +1B095 0062 +1B096 0021 +1B096 003F +1B096 0334 +1B096 0061 +1B096 0041 +1B096 0062 +1B097 0021 +1B097 003F +1B097 0334 +1B097 0061 +1B097 0041 +1B097 0062 +1B098 0021 +1B098 003F +1B098 0334 +1B098 0061 +1B098 0041 +1B098 0062 +1B099 0021 +1B099 003F +1B099 0334 +1B099 0061 +1B099 0041 +1B099 0062 +1B09A 0021 +1B09A 003F +1B09A 0334 +1B09A 0061 +1B09A 0041 +1B09A 0062 +1B09B 0021 +1B09B 003F +1B09B 0334 +1B09B 0061 +1B09B 0041 +1B09B 0062 +1B09C 0021 +1B09C 003F +1B09C 0334 +1B09C 0061 +1B09C 0041 +1B09C 0062 +1B09D 0021 +1B09D 003F +1B09D 0334 +1B09D 0061 +1B09D 0041 +1B09D 0062 +1B09E 0021 +1B09E 003F +1B09E 0334 +1B09E 0061 +1B09E 0041 +1B09E 0062 +1B09F 0021 +1B09F 003F +1B09F 0334 +1B09F 0061 +1B09F 0041 +1B09F 0062 +1B0A0 0021 +1B0A0 003F +1B0A0 0334 +1B0A0 0061 +1B0A0 0041 +1B0A0 0062 +1B0A1 0021 +1B0A1 003F +1B0A1 0334 +1B0A1 0061 +1B0A1 0041 +1B0A1 0062 +1B0A2 0021 +1B0A2 003F +1B0A2 0334 +1B0A2 0061 +1B0A2 0041 +1B0A2 0062 +1B0A3 0021 +1B0A3 003F +1B0A3 0334 +1B0A3 0061 +1B0A3 0041 +1B0A3 0062 +1B0A4 0021 +1B0A4 003F +1B0A4 0334 +1B0A4 0061 +1B0A4 0041 +1B0A4 0062 +1B0A5 0021 +1B0A5 003F +1B0A5 0334 +1B0A5 0061 +1B0A5 0041 +1B0A5 0062 +1B0A6 0021 +1B0A6 003F +1B0A6 0334 +1B0A6 0061 +1B0A6 0041 +1B0A6 0062 +1B0A7 0021 +1B0A7 003F +1B0A7 0334 +1B0A7 0061 +1B0A7 0041 +1B0A7 0062 +1B0A8 0021 +1B0A8 003F +1B0A8 0334 +1B0A8 0061 +1B0A8 0041 +1B0A8 0062 +1B0A9 0021 +1B0A9 003F +1B0A9 0334 +1B0A9 0061 +1B0A9 0041 +1B0A9 0062 +1B0AA 0021 +1B0AA 003F +1B0AA 0334 +1B0AA 0061 +1B0AA 0041 +1B0AA 0062 +1B0AB 0021 +1B0AB 003F +1B0AB 0334 +1B0AB 0061 +1B0AB 0041 +1B0AB 0062 +1B0AC 0021 +1B0AC 003F +1B0AC 0334 +1B0AC 0061 +1B0AC 0041 +1B0AC 0062 +1B0AD 0021 +1B0AD 003F +1B0AD 0334 +1B0AD 0061 +1B0AD 0041 +1B0AD 0062 +1B0AE 0021 +1B0AE 003F +1B0AE 0334 +1B0AE 0061 +1B0AE 0041 +1B0AE 0062 +1B0AF 0021 +1B0AF 003F +1B0AF 0334 +1B0AF 0061 +1B0AF 0041 +1B0AF 0062 +1B0B0 0021 +1B0B0 003F +1B0B0 0334 +1B0B0 0061 +1B0B0 0041 +1B0B0 0062 +1B0B1 0021 +1B0B1 003F +1B0B1 0334 +1B0B1 0061 +1B0B1 0041 +1B0B1 0062 +1B0B2 0021 +1B0B2 003F +1B0B2 0334 +1B0B2 0061 +1B0B2 0041 +1B0B2 0062 +1B0B3 0021 +1B0B3 003F +1B0B3 0334 +1B0B3 0061 +1B0B3 0041 +1B0B3 0062 +1B0B4 0021 +1B0B4 003F +1B0B4 0334 +1B0B4 0061 +1B0B4 0041 +1B0B4 0062 +1B0B5 0021 +1B0B5 003F +1B0B5 0334 +1B0B5 0061 +1B0B5 0041 +1B0B5 0062 +1B0B6 0021 +1B0B6 003F +1B0B6 0334 +1B0B6 0061 +1B0B6 0041 +1B0B6 0062 +1B0B7 0021 +1B0B7 003F +1B0B7 0334 +1B0B7 0061 +1B0B7 0041 +1B0B7 0062 +1B0B8 0021 +1B0B8 003F +1B0B8 0334 +1B0B8 0061 +1B0B8 0041 +1B0B8 0062 +1B0B9 0021 +1B0B9 003F +1B0B9 0334 +1B0B9 0061 +1B0B9 0041 +1B0B9 0062 +1B0BA 0021 +1B0BA 003F +1B0BA 0334 +1B0BA 0061 +1B0BA 0041 +1B0BA 0062 +1B0BB 0021 +1B0BB 003F +1B0BB 0334 +1B0BB 0061 +1B0BB 0041 +1B0BB 0062 +1B0BC 0021 +1B0BC 003F +1B0BC 0334 +1B0BC 0061 +1B0BC 0041 +1B0BC 0062 +1B0BD 0021 +1B0BD 003F +1B0BD 0334 +1B0BD 0061 +1B0BD 0041 +1B0BD 0062 +1B0BE 0021 +1B0BE 003F +1B0BE 0334 +1B0BE 0061 +1B0BE 0041 +1B0BE 0062 +1B0BF 0021 +1B0BF 003F +1B0BF 0334 +1B0BF 0061 +1B0BF 0041 +1B0BF 0062 +1B0C0 0021 +1B0C0 003F +1B0C0 0334 +1B0C0 0061 +1B0C0 0041 +1B0C0 0062 +1B0C1 0021 +1B0C1 003F +1B0C1 0334 +1B0C1 0061 +1B0C1 0041 +1B0C1 0062 +1B0C2 0021 +1B0C2 003F +1B0C2 0334 +1B0C2 0061 +1B0C2 0041 +1B0C2 0062 +1B0C3 0021 +1B0C3 003F +1B0C3 0334 +1B0C3 0061 +1B0C3 0041 +1B0C3 0062 +1B0C4 0021 +1B0C4 003F +1B0C4 0334 +1B0C4 0061 +1B0C4 0041 +1B0C4 0062 +1B0C5 0021 +1B0C5 003F +1B0C5 0334 +1B0C5 0061 +1B0C5 0041 +1B0C5 0062 +1B0C6 0021 +1B0C6 003F +1B0C6 0334 +1B0C6 0061 +1B0C6 0041 +1B0C6 0062 +1B0C7 0021 +1B0C7 003F +1B0C7 0334 +1B0C7 0061 +1B0C7 0041 +1B0C7 0062 +1B0C8 0021 +1B0C8 003F +1B0C8 0334 +1B0C8 0061 +1B0C8 0041 +1B0C8 0062 +1B0C9 0021 +1B0C9 003F +1B0C9 0334 +1B0C9 0061 +1B0C9 0041 +1B0C9 0062 +1B0CA 0021 +1B0CA 003F +1B0CA 0334 +1B0CA 0061 +1B0CA 0041 +1B0CA 0062 +1B0CB 0021 +1B0CB 003F +1B0CB 0334 +1B0CB 0061 +1B0CB 0041 +1B0CB 0062 +1B0CC 0021 +1B0CC 003F +1B0CC 0334 +1B0CC 0061 +1B0CC 0041 +1B0CC 0062 +1B0CD 0021 +1B0CD 003F +1B0CD 0334 +1B0CD 0061 +1B0CD 0041 +1B0CD 0062 +1B0CE 0021 +1B0CE 003F +1B0CE 0334 +1B0CE 0061 +1B0CE 0041 +1B0CE 0062 +1B0CF 0021 +1B0CF 003F +1B0CF 0334 +1B0CF 0061 +1B0CF 0041 +1B0CF 0062 +1B0D0 0021 +1B0D0 003F +1B0D0 0334 +1B0D0 0061 +1B0D0 0041 +1B0D0 0062 +1B0D1 0021 +1B0D1 003F +1B0D1 0334 +1B0D1 0061 +1B0D1 0041 +1B0D1 0062 +1B0D2 0021 +1B0D2 003F +1B0D2 0334 +1B0D2 0061 +1B0D2 0041 +1B0D2 0062 +1B0D3 0021 +1B0D3 003F +1B0D3 0334 +1B0D3 0061 +1B0D3 0041 +1B0D3 0062 +1B0D4 0021 +1B0D4 003F +1B0D4 0334 +1B0D4 0061 +1B0D4 0041 +1B0D4 0062 +1B0D5 0021 +1B0D5 003F +1B0D5 0334 +1B0D5 0061 +1B0D5 0041 +1B0D5 0062 +1B0D6 0021 +1B0D6 003F +1B0D6 0334 +1B0D6 0061 +1B0D6 0041 +1B0D6 0062 +1B0D7 0021 +1B0D7 003F +1B0D7 0334 +1B0D7 0061 +1B0D7 0041 +1B0D7 0062 +1B0D8 0021 +1B0D8 003F +1B0D8 0334 +1B0D8 0061 +1B0D8 0041 +1B0D8 0062 +1B0D9 0021 +1B0D9 003F +1B0D9 0334 +1B0D9 0061 +1B0D9 0041 +1B0D9 0062 +1B0DA 0021 +1B0DA 003F +1B0DA 0334 +1B0DA 0061 +1B0DA 0041 +1B0DA 0062 +1B0DB 0021 +1B0DB 003F +1B0DB 0334 +1B0DB 0061 +1B0DB 0041 +1B0DB 0062 +1B0DC 0021 +1B0DC 003F +1B0DC 0334 +1B0DC 0061 +1B0DC 0041 +1B0DC 0062 +1B0DD 0021 +1B0DD 003F +1B0DD 0334 +1B0DD 0061 +1B0DD 0041 +1B0DD 0062 +1B0DE 0021 +1B0DE 003F +1B0DE 0334 +1B0DE 0061 +1B0DE 0041 +1B0DE 0062 +1B0DF 0021 +1B0DF 003F +1B0DF 0334 +1B0DF 0061 +1B0DF 0041 +1B0DF 0062 +1B0E0 0021 +1B0E0 003F +1B0E0 0334 +1B0E0 0061 +1B0E0 0041 +1B0E0 0062 +1B0E1 0021 +1B0E1 003F +1B0E1 0334 +1B0E1 0061 +1B0E1 0041 +1B0E1 0062 +1B0E2 0021 +1B0E2 003F +1B0E2 0334 +1B0E2 0061 +1B0E2 0041 +1B0E2 0062 +1B0E3 0021 +1B0E3 003F +1B0E3 0334 +1B0E3 0061 +1B0E3 0041 +1B0E3 0062 +1B0E4 0021 +1B0E4 003F +1B0E4 0334 +1B0E4 0061 +1B0E4 0041 +1B0E4 0062 +1B0E5 0021 +1B0E5 003F +1B0E5 0334 +1B0E5 0061 +1B0E5 0041 +1B0E5 0062 +1B0E6 0021 +1B0E6 003F +1B0E6 0334 +1B0E6 0061 +1B0E6 0041 +1B0E6 0062 +1B0E7 0021 +1B0E7 003F +1B0E7 0334 +1B0E7 0061 +1B0E7 0041 +1B0E7 0062 +1B0E8 0021 +1B0E8 003F +1B0E8 0334 +1B0E8 0061 +1B0E8 0041 +1B0E8 0062 +1B0E9 0021 +1B0E9 003F +1B0E9 0334 +1B0E9 0061 +1B0E9 0041 +1B0E9 0062 +1B0EA 0021 +1B0EA 003F +1B0EA 0334 +1B0EA 0061 +1B0EA 0041 +1B0EA 0062 +1B0EB 0021 +1B0EB 003F +1B0EB 0334 +1B0EB 0061 +1B0EB 0041 +1B0EB 0062 +1B0EC 0021 +1B0EC 003F +1B0EC 0334 +1B0EC 0061 +1B0EC 0041 +1B0EC 0062 +1B0ED 0021 +1B0ED 003F +1B0ED 0334 +1B0ED 0061 +1B0ED 0041 +1B0ED 0062 +1B0EE 0021 +1B0EE 003F +1B0EE 0334 +1B0EE 0061 +1B0EE 0041 +1B0EE 0062 +1B0EF 0021 +1B0EF 003F +1B0EF 0334 +1B0EF 0061 +1B0EF 0041 +1B0EF 0062 +1B0F0 0021 +1B0F0 003F +1B0F0 0334 +1B0F0 0061 +1B0F0 0041 +1B0F0 0062 +1B0F1 0021 +1B0F1 003F +1B0F1 0334 +1B0F1 0061 +1B0F1 0041 +1B0F1 0062 +1B0F2 0021 +1B0F2 003F +1B0F2 0334 +1B0F2 0061 +1B0F2 0041 +1B0F2 0062 +1B0F3 0021 +1B0F3 003F +1B0F3 0334 +1B0F3 0061 +1B0F3 0041 +1B0F3 0062 +1B0F4 0021 +1B0F4 003F +1B0F4 0334 +1B0F4 0061 +1B0F4 0041 +1B0F4 0062 +1B0F5 0021 +1B0F5 003F +1B0F5 0334 +1B0F5 0061 +1B0F5 0041 +1B0F5 0062 +1B0F6 0021 +1B0F6 003F +1B0F6 0334 +1B0F6 0061 +1B0F6 0041 +1B0F6 0062 +1B0F7 0021 +1B0F7 003F +1B0F7 0334 +1B0F7 0061 +1B0F7 0041 +1B0F7 0062 +1B0F8 0021 +1B0F8 003F +1B0F8 0334 +1B0F8 0061 +1B0F8 0041 +1B0F8 0062 +1B0F9 0021 +1B0F9 003F +1B0F9 0334 +1B0F9 0061 +1B0F9 0041 +1B0F9 0062 +1B0FA 0021 +1B0FA 003F +1B0FA 0334 +1B0FA 0061 +1B0FA 0041 +1B0FA 0062 +1B0FB 0021 +1B0FB 003F +1B0FB 0334 +1B0FB 0061 +1B0FB 0041 +1B0FB 0062 +1B0FC 0021 +1B0FC 003F +1B0FC 0334 +1B0FC 0061 +1B0FC 0041 +1B0FC 0062 +1B0FD 0021 +1B0FD 003F +1B0FD 0334 +1B0FD 0061 +1B0FD 0041 +1B0FD 0062 +1B0FE 0021 +1B0FE 003F +1B0FE 0334 +1B0FE 0061 +1B0FE 0041 +1B0FE 0062 +1B0FF 0021 +1B0FF 003F +1B0FF 0334 +1B0FF 0061 +1B0FF 0041 +1B0FF 0062 +1B100 0021 +1B100 003F +1B100 0334 +1B100 0061 +1B100 0041 +1B100 0062 +1B101 0021 +1B101 003F +1B101 0334 +1B101 0061 +1B101 0041 +1B101 0062 +1B102 0021 +1B102 003F +1B102 0334 +1B102 0061 +1B102 0041 +1B102 0062 +1B103 0021 +1B103 003F +1B103 0334 +1B103 0061 +1B103 0041 +1B103 0062 +1B104 0021 +1B104 003F +1B104 0334 +1B104 0061 +1B104 0041 +1B104 0062 +1B105 0021 +1B105 003F +1B105 0334 +1B105 0061 +1B105 0041 +1B105 0062 +1B106 0021 +1B106 003F +1B106 0334 +1B106 0061 +1B106 0041 +1B106 0062 +1B107 0021 +1B107 003F +1B107 0334 +1B107 0061 +1B107 0041 +1B107 0062 +1B108 0021 +1B108 003F +1B108 0334 +1B108 0061 +1B108 0041 +1B108 0062 +1B109 0021 +1B109 003F +1B109 0334 +1B109 0061 +1B109 0041 +1B109 0062 +1B10A 0021 +1B10A 003F +1B10A 0334 +1B10A 0061 +1B10A 0041 +1B10A 0062 +1B10B 0021 +1B10B 003F +1B10B 0334 +1B10B 0061 +1B10B 0041 +1B10B 0062 +1B10C 0021 +1B10C 003F +1B10C 0334 +1B10C 0061 +1B10C 0041 +1B10C 0062 +1B10D 0021 +1B10D 003F +1B10D 0334 +1B10D 0061 +1B10D 0041 +1B10D 0062 +1B10E 0021 +1B10E 003F +1B10E 0334 +1B10E 0061 +1B10E 0041 +1B10E 0062 +1B10F 0021 +1B10F 003F +1B10F 0334 +1B10F 0061 +1B10F 0041 +1B10F 0062 +1B110 0021 +1B110 003F +1B110 0334 +1B110 0061 +1B110 0041 +1B110 0062 +1B111 0021 +1B111 003F +1B111 0334 +1B111 0061 +1B111 0041 +1B111 0062 +1B112 0021 +1B112 003F +1B112 0334 +1B112 0061 +1B112 0041 +1B112 0062 +1B113 0021 +1B113 003F +1B113 0334 +1B113 0061 +1B113 0041 +1B113 0062 +1B114 0021 +1B114 003F +1B114 0334 +1B114 0061 +1B114 0041 +1B114 0062 +1B115 0021 +1B115 003F +1B115 0334 +1B115 0061 +1B115 0041 +1B115 0062 +1B116 0021 +1B116 003F +1B116 0334 +1B116 0061 +1B116 0041 +1B116 0062 +1B117 0021 +1B117 003F +1B117 0334 +1B117 0061 +1B117 0041 +1B117 0062 +1B118 0021 +1B118 003F +1B118 0334 +1B118 0061 +1B118 0041 +1B118 0062 +1B119 0021 +1B119 003F +1B119 0334 +1B119 0061 +1B119 0041 +1B119 0062 +1B11A 0021 +1B11A 003F +1B11A 0334 +1B11A 0061 +1B11A 0041 +1B11A 0062 +1B11B 0021 +1B11B 003F +1B11B 0334 +1B11B 0061 +1B11B 0041 +1B11B 0062 +1B11C 0021 +1B11C 003F +1B11C 0334 +1B11C 0061 +1B11C 0041 +1B11C 0062 +1B11D 0021 +1B11D 003F +1B11D 0334 +1B11D 0061 +1B11D 0041 +1B11D 0062 +1B11E 0021 +1B11E 003F +1B11E 0334 +1B11E 0061 +1B11E 0041 +1B11E 0062 3105 0021 3105 003F 31A0 0021 @@ -131111,9 +134901,14 @@ FF9D 0062 31A6 0062 311C 0021 311C 003F +312E 0021 +312E 003F 311C 0061 311C 0041 +312E 0061 +312E 0041 311C 0062 +312E 0062 311D 0021 311D 003F 311D 0061 @@ -140185,6 +143980,24 @@ A4F7 0062 1031E 0061 1031E 0041 1031E 0062 +1032D 0021 +1032D 003F +1032D 0334 +1032D 0061 +1032D 0041 +1032D 0062 +1032E 0021 +1032E 003F +1032E 0334 +1032E 0061 +1032E 0041 +1032E 0062 +1032F 0021 +1032F 003F +1032F 0334 +1032F 0061 +1032F 0041 +1032F 0062 10330 0021 10330 003F 10330 0334 @@ -165937,12 +169750,6 @@ A4F7 0062 17003 0061 17003 0041 17003 0062 -17004 0021 -17004 003F -17004 0334 -17004 0061 -17004 0041 -17004 0062 18800 0021 18800 003F 18800 0334 @@ -165967,18 +169774,42 @@ A4F7 0062 18803 0061 18803 0041 18803 0062 -18804 0021 -18804 003F -18804 0334 -18804 0061 -18804 0041 -18804 0062 18AF2 0021 18AF2 003F 18AF2 0334 18AF2 0061 18AF2 0041 18AF2 0062 +1B170 0021 +1B170 003F +1B170 0334 +1B170 0061 +1B170 0041 +1B170 0062 +1B171 0021 +1B171 003F +1B171 0334 +1B171 0061 +1B171 0041 +1B171 0062 +1B172 0021 +1B172 003F +1B172 0334 +1B172 0061 +1B172 0041 +1B172 0062 +1B173 0021 +1B173 003F +1B173 0334 +1B173 0061 +1B173 0041 +1B173 0062 +1B2FB 0021 +1B2FB 003F +1B2FB 0334 +1B2FB 0061 +1B2FB 0041 +1B2FB 0062 4E00 0021 4E00 003F 3220 0021 @@ -173003,31 +176834,31 @@ FACE 0062 2FD5 0061 2FD5 0041 2FD5 0062 -9FD1 0021 -9FD1 003F -9FD1 0061 -9FD1 0041 -9FD1 0062 -9FD2 0021 -9FD2 003F -9FD2 0061 -9FD2 0041 -9FD2 0062 -9FD3 0021 -9FD3 003F -9FD3 0061 -9FD3 0041 -9FD3 0062 -9FD4 0021 -9FD4 003F -9FD4 0061 -9FD4 0041 -9FD4 0062 -9FD5 0021 -9FD5 003F -9FD5 0061 -9FD5 0041 -9FD5 0062 +9FE6 0021 +9FE6 003F +9FE6 0061 +9FE6 0041 +9FE6 0062 +9FE7 0021 +9FE7 003F +9FE7 0061 +9FE7 0041 +9FE7 0062 +9FE8 0021 +9FE8 003F +9FE8 0061 +9FE8 0041 +9FE8 0062 +9FE9 0021 +9FE9 003F +9FE9 0061 +9FE9 0041 +9FE9 0062 +9FEA 0021 +9FEA 003F +9FEA 0061 +9FEA 0041 +9FEA 0062 FA0E 0021 FA0E 003F FA0E 0061 @@ -207344,6 +211175,72 @@ FAD7 0062 2CEA1 0061 2CEA1 0041 2CEA1 0062 +2CEB0 0021 +2CEB0 003F +2CEB0 0334 +2CEB0 0061 +2CEB0 0041 +2CEB0 0062 +2CEB1 0021 +2CEB1 003F +2CEB1 0334 +2CEB1 0061 +2CEB1 0041 +2CEB1 0062 +2CEB2 0021 +2CEB2 003F +2CEB2 0334 +2CEB2 0061 +2CEB2 0041 +2CEB2 0062 +2CEB3 0021 +2CEB3 003F +2CEB3 0334 +2CEB3 0061 +2CEB3 0041 +2CEB3 0062 +2CEB4 0021 +2CEB4 003F +2CEB4 0334 +2CEB4 0061 +2CEB4 0041 +2CEB4 0062 +2CEB5 0021 +2CEB5 003F +2CEB5 0334 +2CEB5 0061 +2CEB5 0041 +2CEB5 0062 +2EBDC 0021 +2EBDC 003F +2EBDC 0334 +2EBDC 0061 +2EBDC 0041 +2EBDC 0062 +2EBDD 0021 +2EBDD 003F +2EBDD 0334 +2EBDD 0061 +2EBDD 0041 +2EBDD 0062 +2EBDE 0021 +2EBDE 003F +2EBDE 0334 +2EBDE 0061 +2EBDE 0041 +2EBDE 0062 +2EBDF 0021 +2EBDF 003F +2EBDF 0334 +2EBDF 0061 +2EBDF 0041 +2EBDF 0062 +2EBE0 0021 +2EBE0 003F +2EBE0 0334 +2EBE0 0061 +2EBE0 0041 +2EBE0 0062 0378 0021 0378 003F 0378 0061 @@ -207354,11 +211251,11 @@ FAD7 0062 4DB6 0061 4DB6 0041 4DB6 0062 -9FD6 0021 -9FD6 003F -9FD6 0061 -9FD6 0041 -9FD6 0062 +9FEB 0021 +9FEB 003F +9FEB 0061 +9FEB 0041 +9FEB 0062 D800 0021 D800 003F D800 0061 @@ -207379,11 +211276,6 @@ D803 003F D803 0061 D803 0041 D803 0062 -D804 0021 -D804 003F -D804 0061 -D804 0041 -D804 0062 DC00 0021 DC00 003F DC00 0061 @@ -207474,11 +211366,6 @@ FDD3 003F FDD3 0061 FDD3 0041 FDD3 0062 -FDD4 0021 -FDD4 003F -FDD4 0061 -FDD4 0041 -FDD4 0062 FFF0 0021 FFF0 003F FFF0 0061 @@ -207530,6 +211417,12 @@ FFFF 0062 2CEA2 0061 2CEA2 0041 2CEA2 0062 +2EBE1 0021 +2EBE1 003F +2EBE1 0334 +2EBE1 0061 +2EBE1 0041 +2EBE1 0062 2FFFE 0021 2FFFE 003F 2FFFE 0334 diff --git a/tests/data/DerivedBidiClass.txt b/tests/data/DerivedBidiClass.txt index 451cef2a63..ca9cc6ad9a 100644 --- a/tests/data/DerivedBidiClass.txt +++ b/tests/data/DerivedBidiClass.txt @@ -1,6 +1,6 @@ -# DerivedBidiClass-9.0.0.txt -# Date: 2016-06-01, 10:34:22 GMT -# © 2016 Unicode®, Inc. +# DerivedBidiClass-10.0.0.txt +# Date: 2017-03-08, 08:41:46 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -14,44 +14,21 @@ # reserved for right-to-left scripts are given either types R or AL. # # The unassigned code points that default to AL are in the ranges: -# [\u0600-\u07BF \u08A0-\u08FF \uFB50-\uFDCF \uFDF0-\uFDFF \uFE70-\uFEFF \U0001EE00-\U0001EEFF] +# [\u0600-\u07BF \u0860-\u086F \u08A0-\u08FF +# \uFB50-\uFDCF \uFDF0-\uFDFF \uFE70-\uFEFF \U0001EE00-\U0001EEFF] # -# Arabic: U+0600 - U+06FF -# Syriac: U+0700 - U+074F -# Arabic_Supplement: U+0750 - U+077F -# Thaana: U+0780 - U+07BF -# Arabic Extended-A: U+08A0 - U+08FF -# Arabic_Presentation_Forms_A: -# U+FB50 - U+FDCF -# U+FDF0 - U+FDFF -# Arabic_Presentation_Forms_B: -# U+FE70 - U+FEFF -# Arabic Mathematical Alphabetic Symbols: -# U+1EE00 - U+1EEFF +# This includes code points in the Arabic, Syriac, and Thaana blocks, among others. # # The unassigned code points that default to R are in the ranges: -# [\u0590-\u05FF \u07C0-\u089F \uFB1D-\uFB4F \U00010800-\U00010FFF \U0001E800-\U0001EDFF \U0001EF00-\U0001EFFF] +# [\u0590-\u05FF \u07C0-\u085F \u0870-\u089F \uFB1D-\uFB4F +# \U00010800-\U00010FFF \U0001E800-\U0001EDFF \U0001EF00-\U0001EFFF] # -# Hebrew: U+0590 - U+05FF -# NKo: U+07C0 - U+07FF -# Cypriot_Syllabary: U+10800 - U+1083F -# Phoenician: U+10900 - U+1091F -# Lydian: U+10920 - U+1093F -# Meroitic Hieroglyphs: -# U+10980 - U+1099F -# Meroitic Cursive: U+109A0 - U+109FF -# Kharoshthi: U+10A00 - U+10A5F -# and any others in the ranges: -# U+0800 - U+089F, -# U+FB1D - U+FB4F, -# U+10840 - U+10FFF, -# U+1E800 - U+1EDFF, -# U+1EF00 - U+1EFFF +# This includes code points in the Hebrew, NKo, and Phoenician blocks, among others. # # The unassigned code points that default to ET are in the range: # [\u20A0-\u20CF] # -# Currency Symbols: U+20A0 - U+20CF +# This consists of code points in the Currency Symbols block. # # The unassigned code points that default to BN have one of the following properties: # Default_Ignorable_Code_Point @@ -138,6 +115,8 @@ 09F0..09F1 ; L # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL 09F4..09F9 ; L # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN 09FA ; L # So BENGALI ISSHAR +09FC ; L # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; L # Po BENGALI ABBREVIATION SIGN 0A03 ; L # Mc GURMUKHI SIGN VISARGA 0A05..0A0A ; L # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU 0A0F..0A10 ; L # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI @@ -463,6 +442,7 @@ 1CEE..1CF1 ; L # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA 1CF2..1CF3 ; L # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA 1CF5..1CF6 ; L # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; L # Mc VEDIC SIGN ATIKRAMA 1D00..1D2B ; L # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL 1D2C..1D6A ; L # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI 1D6B..1D77 ; L # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G @@ -553,7 +533,7 @@ 30A1..30FA ; L # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO 30FC..30FE ; L # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK 30FF ; L # Lo KATAKANA DIGRAPH KOTO -3105..312D ; L # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH +3105..312E ; L # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE 3131..318E ; L # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE 3190..3191 ; L # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK 3192..3195 ; L # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK @@ -574,7 +554,7 @@ 337B..33DD ; L # So [99] SQUARE ERA NAME HEISEI..SQUARE WB 33E0..33FE ; L # So [31] IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE 3400..4DB5 ; L # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FD5 ; L # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5 +4E00..9FEA ; L # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA A000..A014 ; L # Lo [21] YI SYLLABLE IT..YI SYLLABLE E A015 ; L # Lm YI SYLLABLE WU A016..A48C ; L # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR @@ -728,7 +708,7 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 102A0..102D0 ; L # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 10300..1031F ; L # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS 10320..10323 ; L # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY -10330..10340 ; L # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +1032D..10340 ; L # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA 10341 ; L # Nl GOTHIC LETTER NINETY 10342..10349 ; L # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL 1034A ; L # Nl GOTHIC LETTER NINE HUNDRED @@ -862,6 +842,19 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 118E0..118E9 ; L # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE 118EA..118F2 ; L # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY 118FF ; L # Lo WARANG CITI OM +11A00 ; L # Lo ZANABAZAR SQUARE LETTER A +11A07..11A08 ; L # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU +11A0B..11A32 ; L # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A39 ; L # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; L # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3F..11A46 ; L # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A50 ; L # Lo SOYOMBO LETTER A +11A57..11A58 ; L # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A5C..11A83 ; L # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; L # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A97 ; L # Mc SOYOMBO SIGN VISARGA +11A9A..11A9C ; L # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9E..11AA2 ; L # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 11AC0..11AF8 ; L # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL 11C00..11C08 ; L # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E ; L # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA @@ -877,6 +870,11 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 11CA9 ; L # Mc MARCHEN SUBJOINED LETTER YA 11CB1 ; L # Mc MARCHEN VOWEL SIGN I 11CB4 ; L # Mc MARCHEN VOWEL SIGN O +11D00..11D06 ; L # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; L # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; L # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D46 ; L # Lo MASARAM GONDI REPHA +11D50..11D59 ; L # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE 12000..12399 ; L # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; L # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12470..12474 ; L # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON @@ -903,10 +901,11 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 16F50 ; L # Lo MIAO LETTER NASALIZATION 16F51..16F7E ; L # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 16F93..16F9F ; L # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 -16FE0 ; L # Lm TANGUT ITERATION MARK +16FE0..16FE1 ; L # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK 17000..187EC ; L # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC 18800..18AF2 ; L # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 -1B000..1B001 ; L # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE +1B000..1B11E ; L # Lo [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; L # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; L # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; L # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK 1BC80..1BC88 ; L # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL @@ -975,12 +974,13 @@ FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER 2A700..2B734 ; L # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 2B740..2B81D ; L # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; L # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; L # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; L # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D F0000..FFFFD ; L # Co [65534] <private-use-F0000>..<private-use-FFFFD> 100000..10FFFD; L # Co [65534] <private-use-100000>..<private-use-10FFFD> -# The above property value applies to 841609 code points not listed here. -# Total code points: 1097280 +# The above property value applies to 833103 code points not listed here. +# Total code points: 1097124 # ================================================ @@ -1012,7 +1012,8 @@ F0000..FFFFD ; L # Co [65534] <private-use-F0000>..<private-use-FFFFD> 0840..0858 ; R # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN 085C..085D ; R # Cn [2] <reserved-085C>..<reserved-085D> 085E ; R # Po MANDAIC PUNCTUATION -085F..089F ; R # Cn [65] <reserved-085F>..<reserved-089F> +085F ; R # Cn <reserved-085F> +0870..089F ; R # Cn [48] <reserved-0870>..<reserved-089F> 200F ; R # Cf RIGHT-TO-LEFT MARK FB1D ; R # Lo HEBREW LETTER YOD WITH HIRIQ FB1F..FB28 ; R # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV @@ -1129,7 +1130,7 @@ FB46..FB4F ; R # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE AL 1E960..1EDFF ; R # Cn [1184] <reserved-1E960>..<reserved-1EDFF> 1EF00..1EFFF ; R # Cn [256] <reserved-1EF00>..<reserved-1EFFF> -# Total code points: 4070 +# Total code points: 4054 # ================================================ @@ -1187,8 +1188,8 @@ FF0D ; ES # Pd FULLWIDTH HYPHEN-MINUS 0E3F ; ET # Sc THAI CURRENCY SYMBOL BAHT 17DB ; ET # Sc KHMER CURRENCY SYMBOL RIEL 2030..2034 ; ET # Po [5] PER MILLE SIGN..TRIPLE PRIME -20A0..20BE ; ET # Sc [31] EURO-CURRENCY SIGN..LARI SIGN -20BF..20CF ; ET # Cn [17] <reserved-20BF>..<reserved-20CF> +20A0..20BF ; ET # Sc [32] EURO-CURRENCY SIGN..BITCOIN SIGN +20C0..20CF ; ET # Cn [16] <reserved-20C0>..<reserved-20CF> 212E ; ET # So ESTIMATED SYMBOL 2213 ; ET # Sm MINUS-OR-PLUS SIGN A838 ; ET # Sc NORTH INDIC RUPEE MARK @@ -1443,8 +1444,7 @@ FF1A ; CS # Po FULLWIDTH COLON 239B..23B3 ; ON # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM 23B4..23DB ; ON # So [40] TOP SQUARE BRACKET..FUSE 23DC..23E1 ; ON # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23FE ; ON # So [29] WHITE TRAPEZIUM..POWER SLEEP SYMBOL -2400..2426 ; ON # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +23E2..2426 ; ON # So [69] WHITE TRAPEZIUM..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A ; ON # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 2460..2487 ; ON # No [40] CIRCLED DIGIT ONE..PARENTHESIZED NUMBER TWENTY 24EA..24FF ; ON # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO @@ -1529,7 +1529,7 @@ FF1A ; CS # Po FULLWIDTH COLON 2B76..2B95 ; ON # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW 2B98..2BB9 ; ON # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX 2BBD..2BC8 ; ON # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED -2BCA..2BD1 ; ON # So [8] TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN +2BCA..2BD2 ; ON # So [9] TOP HALF BLACK CIRCLE..GROUP MARK 2BEC..2BEF ; ON # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS 2CE5..2CEA ; ON # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA 2CF9..2CFC ; ON # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER @@ -1572,7 +1572,7 @@ FF1A ; CS # Po FULLWIDTH COLON 2E40 ; ON # Pd DOUBLE HYPHEN 2E41 ; ON # Po REVERSED COMMA 2E42 ; ON # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E44 ; ON # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK +2E43..2E49 ; ON # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA 2E80..2E99 ; ON # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3 ; ON # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5 ; ON # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE @@ -1737,11 +1737,12 @@ FFFC..FFFD ; ON # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTE 1F0D1..1F0F5 ; ON # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 1F10B..1F10C ; ON # No [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO 1F16A..1F16B ; ON # So [2] RAISED MC SIGN..RAISED MD SIGN +1F260..1F265 ; ON # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI 1F300..1F3FA ; ON # So [251] CYCLONE..AMPHORA 1F3FB..1F3FF ; ON # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F6D2 ; ON # So [723] RAT..SHOPPING TROLLEY +1F400..1F6D4 ; ON # So [725] RAT..PAGODA 1F6E0..1F6EC ; ON # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING -1F6F0..1F6F6 ; ON # So [7] SATELLITE..CANOE +1F6F0..1F6F8 ; ON # So [9] SATELLITE..FLYING SAUCER 1F700..1F773 ; ON # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F780..1F7D4 ; ON # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR 1F800..1F80B ; ON # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -1749,16 +1750,15 @@ FFFC..FFFD ; ON # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTE 1F850..1F859 ; ON # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW 1F860..1F887 ; ON # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW 1F890..1F8AD ; ON # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910..1F91E ; ON # So [15] ZIPPER-MOUTH FACE..HAND WITH INDEX AND MIDDLE FINGERS CROSSED -1F920..1F927 ; ON # So [8] FACE WITH COWBOY HAT..SNEEZING FACE -1F930 ; ON # So PREGNANT WOMAN -1F933..1F93E ; ON # So [12] SELFIE..HANDBALL -1F940..1F94B ; ON # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM -1F950..1F95E ; ON # So [15] CROISSANT..PANCAKES -1F980..1F991 ; ON # So [18] CRAB..SQUID +1F900..1F90B ; ON # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F910..1F93E ; ON # So [47] ZIPPER-MOUTH FACE..HANDBALL +1F940..1F94C ; ON # So [13] WILTED FLOWER..CURLING STONE +1F950..1F96B ; ON # So [28] CROISSANT..CANNED FOOD +1F980..1F997 ; ON # So [24] CRAB..CRICKET 1F9C0 ; ON # So CHEESE WEDGE +1F9D0..1F9E6 ; ON # So [23] FACE WITH MONOCLE..SOCKS -# Total code points: 5267 +# Total code points: 5350 # ================================================ @@ -1859,6 +1859,7 @@ FFFFE..FFFFF ; BN # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> 0AC7..0AC8 ; NSM # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI 0ACD ; NSM # Mn GUJARATI SIGN VIRAMA 0AE2..0AE3 ; NSM # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFF ; NSM # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B01 ; NSM # Mn ORIYA SIGN CANDRABINDU 0B3C ; NSM # Mn ORIYA SIGN NUKTA 0B3F ; NSM # Mn ORIYA VOWEL SIGN I @@ -1879,7 +1880,8 @@ FFFFE..FFFFF ; BN # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> 0CBC ; NSM # Mn KANNADA SIGN NUKTA 0CCC..0CCD ; NSM # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA 0CE2..0CE3 ; NSM # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0D01 ; NSM # Mn MALAYALAM SIGN CANDRABINDU +0D00..0D01 ; NSM # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D3B..0D3C ; NSM # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D41..0D44 ; NSM # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR 0D4D ; NSM # Mn MALAYALAM SIGN VIRAMA 0D62..0D63 ; NSM # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL @@ -1964,7 +1966,7 @@ FFFFE..FFFFF ; BN # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> 1CED ; NSM # Mn VEDIC SIGN TIRYAK 1CF4 ; NSM # Mn VEDIC TONE CANDRA ABOVE 1CF8..1CF9 ; NSM # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1DC0..1DF5 ; NSM # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE +1DC0..1DF9 ; NSM # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW 1DFB..1DFF ; NSM # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 20D0..20DC ; NSM # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0 ; NSM # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH @@ -2066,12 +2068,26 @@ FE20..FE2F ; NSM # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC 1171D..1171F ; NSM # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA 11722..11725 ; NSM # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11727..1172B ; NSM # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11A01..11A06 ; NSM # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +11A09..11A0A ; NSM # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A33..11A38 ; NSM # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A3B..11A3E ; NSM # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A47 ; NSM # Mn ZANABAZAR SQUARE SUBJOINER +11A51..11A56 ; NSM # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A59..11A5B ; NSM # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; NSM # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A98..11A99 ; NSM # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER 11C30..11C36 ; NSM # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L 11C38..11C3D ; NSM # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA 11C92..11CA7 ; NSM # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA 11CAA..11CB0 ; NSM # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA 11CB2..11CB3 ; NSM # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E 11CB5..11CB6 ; NSM # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; NSM # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; NSM # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; NSM # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; NSM # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D47 ; NSM # Mn MASARAM GONDI RA-KARA 16AF0..16AF4 ; NSM # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; NSM # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F8F..16F92 ; NSM # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW @@ -2096,7 +2112,7 @@ FE20..FE2F ; NSM # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC 1E944..1E94A ; NSM # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA E0100..E01EF ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 1700 +# Total code points: 1773 # ================================================ @@ -2131,6 +2147,8 @@ E0100..E01EF ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 074D..07A5 ; AL # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU 07B1 ; AL # Lo THAANA LETTER NAA 07B2..07BF ; AL # Cn [14] <reserved-07B2>..<reserved-07BF> +0860..086A ; AL # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +086B..086F ; AL # Cn [5] <reserved-086B>..<reserved-086F> 08A0..08B4 ; AL # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW 08B5 ; AL # Cn <reserved-08B5> 08B6..08BD ; AL # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON @@ -2219,7 +2237,7 @@ FEFD..FEFE ; AL # Cn [2] <reserved-FEFD>..<reserved-FEFE> 1EEBC..1EEEF ; AL # Cn [52] <reserved-1EEBC>..<reserved-1EEEF> 1EEF2..1EEFF ; AL # Cn [14] <reserved-1EEF2>..<reserved-1EEFF> -# Total code points: 1420 +# Total code points: 1436 # ================================================ diff --git a/tests/data/GraphemeBreakProperty.txt b/tests/data/GraphemeBreakProperty.txt index c5e94a3762..32bb12e47e 100644 --- a/tests/data/GraphemeBreakProperty.txt +++ b/tests/data/GraphemeBreakProperty.txt @@ -1,6 +1,6 @@ -# GraphemeBreakProperty-9.0.0.txt -# Date: 2016-06-03, 22:23:55 GMT -# © 2016 Unicode®, Inc. +# GraphemeBreakProperty-10.0.0.txt +# Date: 2017-03-12, 07:03:41 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -25,8 +25,11 @@ 0D4E ; Prepend # Lo MALAYALAM LETTER DOT REPH 110BD ; Prepend # Cf KAITHI NUMBER SIGN 111C2..111C3 ; Prepend # Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA +11A3A ; Prepend # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A86..11A89 ; Prepend # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11D46 ; Prepend # Lo MASARAM GONDI REPHA -# Total code points: 13 +# Total code points: 19 # ================================================ @@ -126,6 +129,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> 0AC7..0AC8 ; Extend # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI 0ACD ; Extend # Mn GUJARATI SIGN VIRAMA 0AE2..0AE3 ; Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFF ; Extend # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B01 ; Extend # Mn ORIYA SIGN CANDRABINDU 0B3C ; Extend # Mn ORIYA SIGN NUKTA 0B3E ; Extend # Mc ORIYA VOWEL SIGN AA @@ -154,7 +158,8 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> 0CCC..0CCD ; Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA 0CD5..0CD6 ; Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK 0CE2..0CE3 ; Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0D01 ; Extend # Mn MALAYALAM SIGN CANDRABINDU +0D00..0D01 ; Extend # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D3B..0D3C ; Extend # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D3E ; Extend # Mc MALAYALAM VOWEL SIGN AA 0D41..0D44 ; Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR 0D4D ; Extend # Mn MALAYALAM SIGN VIRAMA @@ -243,7 +248,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> 1CED ; Extend # Mn VEDIC SIGN TIRYAK 1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE 1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1DC0..1DF5 ; Extend # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE +1DC0..1DF9 ; Extend # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW 1DFB..1DFF ; Extend # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 200C ; Extend # Cf ZERO WIDTH NON-JOINER 20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE @@ -353,6 +358,15 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 1171D..1171F ; Extend # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA 11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11A01..11A06 ; Extend # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +11A09..11A0A ; Extend # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A33..11A38 ; Extend # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A3B..11A3E ; Extend # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A47 ; Extend # Mn ZANABAZAR SQUARE SUBJOINER +11A51..11A56 ; Extend # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A59..11A5B ; Extend # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; Extend # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A98..11A99 ; Extend # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER 11C30..11C36 ; Extend # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L 11C38..11C3D ; Extend # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA 11C3F ; Extend # Mn BHAIKSUKI SIGN VIRAMA @@ -360,6 +374,11 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11CAA..11CB0 ; Extend # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA 11CB2..11CB3 ; Extend # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E 11CB5..11CB6 ; Extend # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; Extend # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Extend # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Extend # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; Extend # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D47 ; Extend # Mn MASARAM GONDI RA-KARA 16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F8F..16F92 ; Extend # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW @@ -387,7 +406,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 1828 +# Total code points: 1901 # ================================================ @@ -472,6 +491,7 @@ E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 1C34..1C35 ; SpacingMark # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG 1CE1 ; SpacingMark # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA 1CF2..1CF3 ; SpacingMark # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF7 ; SpacingMark # Mc VEDIC SIGN ATIKRAMA A823..A824 ; SpacingMark # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I A827 ; SpacingMark # Mc SYLOTI NAGRI VOWEL SIGN OO A880..A881 ; SpacingMark # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA @@ -529,6 +549,10 @@ ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK 116B6 ; SpacingMark # Mc TAKRI SIGN VIRAMA 11720..11721 ; SpacingMark # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA 11726 ; SpacingMark # Mc AHOM VOWEL SIGN E +11A07..11A08 ; SpacingMark # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU +11A39 ; SpacingMark # Mc ZANABAZAR SQUARE SIGN VISARGA +11A57..11A58 ; SpacingMark # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A97 ; SpacingMark # Mc SOYOMBO SIGN VISARGA 11C2F ; SpacingMark # Mc BHAIKSUKI VOWEL SIGN AA 11C3E ; SpacingMark # Mc BHAIKSUKI SIGN VISARGA 11CA9 ; SpacingMark # Mc MARCHEN SUBJOINED LETTER YA @@ -538,7 +562,7 @@ ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK 1D166 ; SpacingMark # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D16D ; SpacingMark # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT -# Total code points: 341 +# Total code points: 348 # ================================================ @@ -1375,8 +1399,9 @@ D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH 26F9 ; E_Base # So PERSON WITH BALL 270A..270D ; E_Base # So [4] RAISED FIST..WRITING HAND 1F385 ; E_Base # So FATHER CHRISTMAS -1F3C3..1F3C4 ; E_Base # So [2] RUNNER..SURFER -1F3CA..1F3CB ; E_Base # So [2] SWIMMER..WEIGHT LIFTER +1F3C2..1F3C4 ; E_Base # So [3] SNOWBOARDER..SURFER +1F3C7 ; E_Base # So HORSE RACING +1F3CA..1F3CC ; E_Base # So [3] SWIMMER..GOLFER 1F442..1F443 ; E_Base # So [2] EAR..NOSE 1F446..1F450 ; E_Base # So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN 1F46E ; E_Base # So POLICE OFFICER @@ -1385,7 +1410,7 @@ D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH 1F481..1F483 ; E_Base # So [3] INFORMATION DESK PERSON..DANCER 1F485..1F487 ; E_Base # So [3] NAIL POLISH..HAIRCUT 1F4AA ; E_Base # So FLEXED BICEPS -1F575 ; E_Base # So SLEUTH OR SPY +1F574..1F575 ; E_Base # So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY 1F57A ; E_Base # So MAN DANCING 1F590 ; E_Base # So RAISED HAND WITH FINGERS SPLAYED 1F595..1F596 ; E_Base # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS @@ -1394,13 +1419,15 @@ D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH 1F6A3 ; E_Base # So ROWBOAT 1F6B4..1F6B6 ; E_Base # So [3] BICYCLIST..PEDESTRIAN 1F6C0 ; E_Base # So BATH -1F918..1F91E ; E_Base # So [7] SIGN OF THE HORNS..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F6CC ; E_Base # So SLEEPING ACCOMMODATION +1F918..1F91C ; E_Base # So [5] SIGN OF THE HORNS..RIGHT-FACING FIST +1F91E..1F91F ; E_Base # So [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN 1F926 ; E_Base # So FACE PALM -1F930 ; E_Base # So PREGNANT WOMAN -1F933..1F939 ; E_Base # So [7] SELFIE..JUGGLING -1F93C..1F93E ; E_Base # So [3] WRESTLERS..HANDBALL +1F930..1F939 ; E_Base # So [10] PREGNANT WOMAN..JUGGLING +1F93D..1F93E ; E_Base # So [2] WATER POLO..HANDBALL +1F9D1..1F9DD ; E_Base # So [13] ADULT..ELF -# Total code points: 79 +# Total code points: 98 # ================================================ @@ -1416,11 +1443,28 @@ D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH # ================================================ +2640 ; Glue_After_Zwj # So FEMALE SIGN +2642 ; Glue_After_Zwj # So MALE SIGN +2695..2696 ; Glue_After_Zwj # So [2] STAFF OF AESCULAPIUS..SCALES +2708 ; Glue_After_Zwj # So AIRPLANE 2764 ; Glue_After_Zwj # So HEAVY BLACK HEART +1F308 ; Glue_After_Zwj # So RAINBOW +1F33E ; Glue_After_Zwj # So EAR OF RICE +1F373 ; Glue_After_Zwj # So COOKING +1F393 ; Glue_After_Zwj # So GRADUATION CAP +1F3A4 ; Glue_After_Zwj # So MICROPHONE +1F3A8 ; Glue_After_Zwj # So ARTIST PALETTE +1F3EB ; Glue_After_Zwj # So SCHOOL +1F3ED ; Glue_After_Zwj # So FACTORY 1F48B ; Glue_After_Zwj # So KISS MARK +1F4BB..1F4BC ; Glue_After_Zwj # So [2] PERSONAL COMPUTER..BRIEFCASE +1F527 ; Glue_After_Zwj # So WRENCH +1F52C ; Glue_After_Zwj # So MICROSCOPE 1F5E8 ; Glue_After_Zwj # So LEFT SPEECH BUBBLE +1F680 ; Glue_After_Zwj # So ROCKET +1F692 ; Glue_After_Zwj # So FIRE ENGINE -# Total code points: 3 +# Total code points: 22 # ================================================ diff --git a/tests/data/GraphemeBreakTest.txt b/tests/data/GraphemeBreakTest.txt index 4bb4b1369b..d7d8f90de0 100644 --- a/tests/data/GraphemeBreakTest.txt +++ b/tests/data/GraphemeBreakTest.txt @@ -1,23 +1,24 @@ -# GraphemeBreakTest-9.0.0.txt -# Date: 2016-06-02, 18:28:17 GMT -# © 2016 Unicode®, Inc. +# GraphemeBreakTest-10.0.0.txt +# Date: 2017-04-14, 05:40:29 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database # For documentation, see http://www.unicode.org/reports/tr44/ # -# Default Grapheme Break Test +# Default Grapheme_Cluster_Break Test # # Format: -# <string> (# <comment>)? -# <string> contains hex Unicode code points, with -# ÷ wherever there is a break opportunity, and +# <string> (# <comment>)? +# <string> contains hex Unicode code points, with +# ÷ wherever there is a break opportunity, and # × wherever there is not. # <comment> the format can change, but currently it shows: # - the sample character name # - (x) the Grapheme_Cluster_Break property value for the sample character -# - [x] the rule that determines whether there is a break or not +# - [x] the rule that determines whether there is a break or not, +# as listed in the Rules section of GraphemeBreakTest.html # # These samples may be extended or changed in the future. # @@ -53,8 +54,8 @@ ÷ 0020 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0020 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 0020 × 0308 × 200D ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 0020 ÷ 2764 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0020 × 0308 ÷ 2764 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0020 ÷ 2640 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0020 × 0308 ÷ 2640 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0020 ÷ 1F466 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0020 × 0308 ÷ 1F466 ÷ # ÷ [0.2] SPACE (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0020 ÷ 0378 ÷ # ÷ [0.2] SPACE (Other) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -93,8 +94,8 @@ ÷ 000D ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 000D ÷ 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 000D ÷ 0308 × 200D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 000D ÷ 2764 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000D ÷ 2640 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 000D ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] BOY (EBG) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000D ÷ 0378 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3] @@ -133,8 +134,8 @@ ÷ 000A ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 000A ÷ 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 000A ÷ 0308 × 200D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 000A ÷ 2764 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000A ÷ 2640 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 000A ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] BOY (EBG) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000A ÷ 0378 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3] @@ -173,8 +174,8 @@ ÷ 0001 ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0001 ÷ 200D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 0001 ÷ 0308 × 200D ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 0001 ÷ 2764 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0001 ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0001 ÷ 2640 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0001 ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0001 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] BOY (EBG) ÷ [0.3] ÷ 0001 ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0001 ÷ 0378 ÷ # ÷ [0.2] <START OF HEADING> (Control) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3] @@ -213,8 +214,8 @@ ÷ 0300 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0300 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 0300 × 0308 × 200D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 0300 ÷ 2764 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0300 × 0308 ÷ 2764 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0300 ÷ 2640 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0300 × 0308 ÷ 2640 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0300 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0300 × 0308 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0300 ÷ 0378 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -253,8 +254,8 @@ ÷ 0600 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0600 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 0600 × 0308 × 200D ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 0600 × 2764 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0600 × 0308 ÷ 2764 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0600 × 2640 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0600 × 0308 ÷ 2640 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0600 × 1F466 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] BOY (EBG) ÷ [0.3] ÷ 0600 × 0308 ÷ 1F466 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0600 × 0378 ÷ # ÷ [0.2] ARABIC NUMBER SIGN (Prepend) × [9.2] <reserved-0378> (Other) ÷ [0.3] @@ -293,8 +294,8 @@ ÷ 0903 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0903 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 0903 × 0308 × 200D ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 0903 ÷ 2764 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0903 × 0308 ÷ 2764 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0903 ÷ 2640 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0903 × 0308 ÷ 2640 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0903 ÷ 1F466 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0903 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0903 ÷ 0378 ÷ # ÷ [0.2] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -333,8 +334,8 @@ ÷ 1100 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 1100 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 1100 × 0308 × 200D ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 1100 ÷ 2764 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 1100 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1100 ÷ 2640 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 1100 × 0308 ÷ 2640 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 1100 ÷ 1F466 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1100 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1100 ÷ 0378 ÷ # ÷ [0.2] HANGUL CHOSEONG KIYEOK (L) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -373,8 +374,8 @@ ÷ 1160 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 1160 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 1160 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 1160 ÷ 2764 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 1160 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1160 ÷ 2640 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 1160 × 0308 ÷ 2640 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 1160 ÷ 1F466 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1160 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1160 ÷ 0378 ÷ # ÷ [0.2] HANGUL JUNGSEONG FILLER (V) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -413,8 +414,8 @@ ÷ 11A8 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 11A8 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 11A8 × 0308 × 200D ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 11A8 ÷ 2764 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 11A8 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 11A8 ÷ 2640 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 11A8 × 0308 ÷ 2640 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 11A8 ÷ 1F466 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 11A8 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 11A8 ÷ 0378 ÷ # ÷ [0.2] HANGUL JONGSEONG KIYEOK (T) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -453,8 +454,8 @@ ÷ AC00 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ AC00 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ AC00 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ AC00 ÷ 2764 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ AC00 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ AC00 ÷ 2640 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ AC00 × 0308 ÷ 2640 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ AC00 ÷ 1F466 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ AC00 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ AC00 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GA (LV) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -493,8 +494,8 @@ ÷ AC01 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ AC01 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ AC01 × 0308 × 200D ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ AC01 ÷ 2764 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ AC01 × 0308 ÷ 2764 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ AC01 ÷ 2640 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ AC01 × 0308 ÷ 2640 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ AC01 ÷ 1F466 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ AC01 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ AC01 ÷ 0378 ÷ # ÷ [0.2] HANGUL SYLLABLE GAG (LVT) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -533,8 +534,8 @@ ÷ 1F1E6 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 1F1E6 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 1F1E6 × 0308 × 200D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 1F1E6 ÷ 2764 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 2764 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F1E6 ÷ 2640 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 2640 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 1F1E6 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F1E6 ÷ 0378 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -573,8 +574,8 @@ ÷ 261D × 0308 × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 261D × 200D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 261D × 0308 × 200D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 261D ÷ 2764 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 261D × 0308 ÷ 2764 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 261D ÷ 2640 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 261D × 0308 ÷ 2640 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 261D ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 261D × 0308 ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 261D ÷ 0378 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -613,8 +614,8 @@ ÷ 1F3FB × 0308 ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 1F3FB × 200D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 1F3FB × 0308 × 200D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 1F3FB ÷ 2764 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 1F3FB × 0308 ÷ 2764 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F3FB ÷ 2640 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 2640 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 1F3FB ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F3FB × 0308 ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F3FB ÷ 0378 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -653,54 +654,54 @@ ÷ 200D × 0308 ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 200D × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 200D × 0308 × 200D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 200D × 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 200D × 0308 ÷ 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 0308 ÷ 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] BOY (EBG) ÷ [0.3] ÷ 200D × 0308 ÷ 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 200D ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 200D × 0308 ÷ 0378 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] ÷ 200D ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] ÷ 200D × 0308 ÷ D800 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] -÷ 2764 ÷ 0020 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 2764 × 0308 ÷ 0020 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] -÷ 2764 ÷ 000D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 2764 × 0308 ÷ 000D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 2764 ÷ 000A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 2764 × 0308 ÷ 000A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 2764 ÷ 0001 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] -÷ 2764 × 0308 ÷ 0001 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] -÷ 2764 × 0300 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] -÷ 2764 × 0308 × 0300 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] -÷ 2764 ÷ 0600 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 2764 × 0308 ÷ 0600 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] -÷ 2764 × 0903 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 2764 × 0308 × 0903 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] -÷ 2764 ÷ 1100 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 2764 × 0308 ÷ 1100 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] -÷ 2764 ÷ 1160 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 2764 × 0308 ÷ 1160 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] -÷ 2764 ÷ 11A8 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 2764 × 0308 ÷ 11A8 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] -÷ 2764 ÷ AC00 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 2764 × 0308 ÷ AC00 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] -÷ 2764 ÷ AC01 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 2764 × 0308 ÷ AC01 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] -÷ 2764 ÷ 1F1E6 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 2764 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 2764 ÷ 261D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] -÷ 2764 × 0308 ÷ 261D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] -÷ 2764 ÷ 1F3FB ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 2764 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 2764 × 200D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 2764 × 0308 × 200D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 2764 ÷ 2764 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 2764 × 0308 ÷ 2764 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 2764 ÷ 1F466 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] BOY (EBG) ÷ [0.3] -÷ 2764 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] -÷ 2764 ÷ 0378 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] -÷ 2764 × 0308 ÷ 0378 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] -÷ 2764 ÷ D800 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] -÷ 2764 × 0308 ÷ D800 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 2640 ÷ 0020 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 2640 × 0308 ÷ 0020 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] +÷ 2640 ÷ 000D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 2640 × 0308 ÷ 000D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 2640 ÷ 000A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 2640 × 0308 ÷ 000A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 2640 ÷ 0001 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 2640 × 0308 ÷ 0001 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <START OF HEADING> (Control) ÷ [0.3] +÷ 2640 × 0300 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 2640 × 0308 × 0300 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] COMBINING GRAVE ACCENT (Extend) ÷ [0.3] +÷ 2640 ÷ 0600 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 2640 × 0308 ÷ 0600 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] +÷ 2640 × 0903 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 2640 × 0308 × 0903 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] +÷ 2640 ÷ 1100 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 2640 × 0308 ÷ 1100 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] +÷ 2640 ÷ 1160 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 2640 × 0308 ÷ 1160 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] +÷ 2640 ÷ 11A8 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 2640 × 0308 ÷ 11A8 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] +÷ 2640 ÷ AC00 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 2640 × 0308 ÷ AC00 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] +÷ 2640 ÷ AC01 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 2640 × 0308 ÷ AC01 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] +÷ 2640 ÷ 1F1E6 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 2640 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 2640 ÷ 261D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 2640 × 0308 ÷ 261D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 2640 ÷ 1F3FB ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 2640 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 2640 × 200D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 2640 × 0308 × 200D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] +÷ 2640 ÷ 2640 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 2640 × 0308 ÷ 2640 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 2640 ÷ 1F466 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 2640 × 0308 ÷ 1F466 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 2640 ÷ 0378 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 2640 × 0308 ÷ 0378 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] +÷ 2640 ÷ D800 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] +÷ 2640 × 0308 ÷ D800 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [9.0] COMBINING DIAERESIS (Extend) ÷ [5.0] <surrogate-D800> (Control) ÷ [0.3] ÷ 1F466 ÷ 0020 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1F466 × 0308 ÷ 0020 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] SPACE (Other) ÷ [0.3] ÷ 1F466 ÷ 000D ÷ # ÷ [0.2] BOY (EBG) ÷ [5.0] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] @@ -733,8 +734,8 @@ ÷ 1F466 × 0308 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 1F466 × 200D ÷ # ÷ [0.2] BOY (EBG) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 1F466 × 0308 × 200D ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 1F466 ÷ 2764 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 1F466 × 0308 ÷ 2764 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F466 ÷ 2640 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 1F466 × 0308 ÷ 2640 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F466 × 0308 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F466 ÷ 0378 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -773,8 +774,8 @@ ÷ 0378 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0378 × 200D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ 0378 × 0308 × 200D ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ 0378 ÷ 2764 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0378 × 0308 ÷ 2764 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0378 ÷ 2640 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0378 × 0308 ÷ 2640 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0378 ÷ 1F466 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0378 × 0308 ÷ 1F466 ÷ # ÷ [0.2] <reserved-0378> (Other) × [9.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0378 ÷ 0378 ÷ # ÷ [0.2] <reserved-0378> (Other) ÷ [999.0] <reserved-0378> (Other) ÷ [0.3] @@ -813,8 +814,8 @@ ÷ D800 ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ D800 ÷ 200D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] ÷ D800 ÷ 0308 × 200D ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) × [9.0] ZERO WIDTH JOINER (ZWJ) ÷ [0.3] -÷ D800 ÷ 2764 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ D800 ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ D800 ÷ 2640 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ D800 ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ D800 ÷ 1F466 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] BOY (EBG) ÷ [0.3] ÷ D800 ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] COMBINING DIAERESIS (Extend) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ D800 ÷ 0378 ÷ # ÷ [0.2] <surrogate-D800> (Control) ÷ [4.0] <reserved-0378> (Other) ÷ [0.3] @@ -840,7 +841,7 @@ ÷ 261D × 1F3FB ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 200D × 1F466 × 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] BOY (EBG) × [10.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 200D × 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ) × [11.0] BOY (EBG) ÷ [0.3] ÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3] # diff --git a/tests/data/HangulSyllableType.txt b/tests/data/HangulSyllableType.txt index 951787bc0c..9c990d7aba 100644 --- a/tests/data/HangulSyllableType.txt +++ b/tests/data/HangulSyllableType.txt @@ -1,6 +1,6 @@ -# HangulSyllableType-9.0.0.txt -# Date: 2016-03-02, 18:55:01 GMT -# © 2016 Unicode®, Inc. +# HangulSyllableType-10.0.0.txt +# Date: 2017-02-14, 04:26:11 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # diff --git a/tests/data/LineBreakTest.txt b/tests/data/LineBreakTest.txt index 05efcf5a44..6715446aba 100644 --- a/tests/data/LineBreakTest.txt +++ b/tests/data/LineBreakTest.txt @@ -1,25 +1,28 @@ -# LineBreakTest-9.0.0.txt -# Date: 2016-06-18, 00:42:06 GMT -# © 2016 Unicode®, Inc. +# LineBreakTest-10.0.0.txt +# Date: 2017-04-14, 05:40:30 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database # For documentation, see http://www.unicode.org/reports/tr44/ # -# Default Line Break Test +# Default Line_Break Test # # Format: -# <string> (# <comment>)? -# <string> contains hex Unicode code points, with -# ÷ wherever there is a break opportunity, and +# <string> (# <comment>)? +# <string> contains hex Unicode code points, with +# ÷ wherever there is a break opportunity, and # × wherever there is not. # <comment> the format can change, but currently it shows: # - the sample character name # - (x) the Line_Break property value for the sample character -# - [x] the rule that determines whether there is a break or not -# Note: The Line Break tests use tailoring of numbers described in Example 7 of Section 8.2 Examples of Customization. -# They also differ from the results produced by a pair table implementation in sequences like: ZW SP CL. +# - [x] the rule that determines whether there is a break or not, +# as listed in the Rules section of LineBreakTest.html +# +# Note: +# The Line_Break tests use tailoring of numbers described in +# Example 7 of Section 8.2, "Examples of Customization" of UAX #14. # # These samples may be extended or changed in the future. # diff --git a/tests/data/NormalizationTest.txt b/tests/data/NormalizationTest.txt index e133fa8a78..71f2371c5e 100644 --- a/tests/data/NormalizationTest.txt +++ b/tests/data/NormalizationTest.txt @@ -1,6 +1,6 @@ -# NormalizationTest-9.0.0.txt -# Date: 2016-04-04, 11:41:55 GMT -# © 2016 Unicode®, Inc. +# NormalizationTest-10.0.0.txt +# Date: 2017-03-08, 08:41:55 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -17653,6 +17653,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 0CBC 3099 093C 0334 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062;0061 0334 0CBC 093C 3099 0062; # (a◌಼◌゙◌़◌̴b; a◌̴◌಼◌़◌゙b; a◌̴◌಼◌़◌゙b; a◌̴◌಼◌़◌゙b; a◌̴◌಼◌़◌゙b; ) LATIN SMALL LETTER A, KANNADA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 05B0 094D 3099 0CCD 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062; # (a◌ְ◌्◌゙◌್b; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KANNADA SIGN VIRAMA, LATIN SMALL LETTER B 0061 0CCD 05B0 094D 3099 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062; # (a◌್◌ְ◌्◌゙b; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; ) LATIN SMALL LETTER A, KANNADA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0D3B 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062; # (a◌ְ◌्◌゙◌഻b; a◌゙◌्◌഻◌ְb; a◌゙◌्◌഻◌ְb; a◌゙◌्◌഻◌ְb; a◌゙◌्◌഻◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MALAYALAM SIGN VERTICAL BAR VIRAMA, LATIN SMALL LETTER B +0061 0D3B 05B0 094D 3099 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062; # (a◌഻◌ְ◌्◌゙b; a◌゙◌഻◌्◌ְb; a◌゙◌഻◌्◌ְb; a◌゙◌഻◌्◌ְb; a◌゙◌഻◌्◌ְb; ) LATIN SMALL LETTER A, MALAYALAM SIGN VERTICAL BAR VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0D3C 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062; # (a◌ְ◌्◌゙◌഼b; a◌゙◌्◌഼◌ְb; a◌゙◌्◌഼◌ְb; a◌゙◌्◌഼◌ְb; a◌゙◌्◌഼◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MALAYALAM SIGN CIRCULAR VIRAMA, LATIN SMALL LETTER B +0061 0D3C 05B0 094D 3099 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062; # (a◌഼◌ְ◌्◌゙b; a◌゙◌഼◌्◌ְb; a◌゙◌഼◌्◌ְb; a◌゙◌഼◌्◌ְb; a◌゙◌഼◌्◌ְb; ) LATIN SMALL LETTER A, MALAYALAM SIGN CIRCULAR VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 05B0 094D 3099 0D4D 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062; # (a◌ְ◌्◌゙◌്b; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MALAYALAM SIGN VIRAMA, LATIN SMALL LETTER B 0061 0D4D 05B0 094D 3099 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062; # (a◌്◌ְ◌्◌゙b; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; ) LATIN SMALL LETTER A, MALAYALAM SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 05B0 094D 3099 0DCA 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062; # (a◌ְ◌्◌゙◌්b; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SINHALA SIGN AL-LAKUNA, LATIN SMALL LETTER B @@ -17999,6 +18003,14 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 1DF4 0315 0300 05AE 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062; # (a◌ᷴ◌̕◌̀◌֮b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER U WITH DIAERESIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 0315 0300 05AE 1DF5 0062;00E0 05AE 1DF5 0315 0062;0061 05AE 0300 1DF5 0315 0062;00E0 05AE 1DF5 0315 0062;0061 05AE 0300 1DF5 0315 0062; # (a◌̕◌̀◌֮◌᷵b; à◌֮◌᷵◌̕b; a◌֮◌̀◌᷵◌̕b; à◌֮◌᷵◌̕b; a◌֮◌̀◌᷵◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING UP TACK ABOVE, LATIN SMALL LETTER B 0061 1DF5 0315 0300 05AE 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062; # (a◌᷵◌̕◌̀◌֮b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING UP TACK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 035C 0315 0300 1DF6 0062;00E0 0315 1DF6 035C 0062;0061 0300 0315 1DF6 035C 0062;00E0 0315 1DF6 035C 0062;0061 0300 0315 1DF6 035C 0062; # (a◌͜◌̕◌̀◌᷶b; à◌̕◌᷶◌͜b; a◌̀◌̕◌᷶◌͜b; à◌̕◌᷶◌͜b; a◌̀◌̕◌᷶◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING KAVYKA ABOVE RIGHT, LATIN SMALL LETTER B +0061 1DF6 035C 0315 0300 0062;00E0 1DF6 0315 035C 0062;0061 0300 1DF6 0315 035C 0062;00E0 1DF6 0315 035C 0062;0061 0300 1DF6 0315 035C 0062; # (a◌᷶◌͜◌̕◌̀b; à◌᷶◌̕◌͜b; a◌̀◌᷶◌̕◌͜b; à◌᷶◌̕◌͜b; a◌̀◌᷶◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING KAVYKA ABOVE RIGHT, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 1DF7 0062;00E0 1D16D 05AE 1DF7 0062;0061 1D16D 05AE 1DF7 0300 0062;00E0 1D16D 05AE 1DF7 0062;0061 1D16D 05AE 1DF7 0300 0062; # (a◌̀◌𝅭֮◌᷷b; à𝅭◌֮◌᷷b; a𝅭◌֮◌᷷◌̀b; à𝅭◌֮◌᷷b; a𝅭◌֮◌᷷◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, COMBINING KAVYKA ABOVE LEFT, LATIN SMALL LETTER B +0061 1DF7 0300 05AE 1D16D 0062;00E0 1D16D 1DF7 05AE 0062;0061 1D16D 1DF7 05AE 0300 0062;00E0 1D16D 1DF7 05AE 0062;0061 1D16D 1DF7 05AE 0300 0062; # (a◌᷷◌̀◌𝅭֮b; à𝅭◌᷷◌֮b; a𝅭◌᷷◌֮◌̀b; à𝅭◌᷷◌֮b; a𝅭◌᷷◌֮◌̀b; ) LATIN SMALL LETTER A, COMBINING KAVYKA ABOVE LEFT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 1DF8 0062;00E0 1D16D 05AE 1DF8 0062;0061 1D16D 05AE 1DF8 0300 0062;00E0 1D16D 05AE 1DF8 0062;0061 1D16D 05AE 1DF8 0300 0062; # (a◌̀◌𝅭֮◌᷸b; à𝅭◌֮◌᷸b; a𝅭◌֮◌᷸◌̀b; à𝅭◌֮◌᷸b; a𝅭◌֮◌᷸◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, COMBINING DOT ABOVE LEFT, LATIN SMALL LETTER B +0061 1DF8 0300 05AE 1D16D 0062;00E0 1D16D 1DF8 05AE 0062;0061 1D16D 1DF8 05AE 0300 0062;00E0 1D16D 1DF8 05AE 0062;0061 1D16D 1DF8 05AE 0300 0062; # (a◌᷸◌̀◌𝅭֮b; à𝅭◌᷸◌֮b; a𝅭◌᷸◌֮◌̀b; à𝅭◌᷸◌֮b; a𝅭◌᷸◌֮◌̀b; ) LATIN SMALL LETTER A, COMBINING DOT ABOVE LEFT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 059A 0316 302A 1DF9 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062; # (a◌֚◌̖◌〪◌᷹b; a◌〪◌̖◌᷹◌֚b; a◌〪◌̖◌᷹◌֚b; a◌〪◌̖◌᷹◌֚b; a◌〪◌̖◌᷹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING WIDE INVERTED BRIDGE BELOW, LATIN SMALL LETTER B +0061 1DF9 059A 0316 302A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062; # (a◌᷹◌֚◌̖◌〪b; a◌〪◌᷹◌̖◌֚b; a◌〪◌᷹◌̖◌֚b; a◌〪◌᷹◌̖◌֚b; a◌〪◌᷹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING WIDE INVERTED BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B 0061 0315 0300 05AE 1DFB 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062; # (a◌̕◌̀◌֮◌᷻b; à◌֮◌᷻◌̕b; a◌֮◌̀◌᷻◌̕b; à◌֮◌᷻◌̕b; a◌֮◌̀◌᷻◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DELETION MARK, LATIN SMALL LETTER B 0061 1DFB 0315 0300 05AE 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062; # (a◌᷻◌̕◌̀◌֮b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DELETION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B 0061 035D 035C 0315 1DFC 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062; # (a◌͝◌͜◌̕◌᷼b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE INVERTED BREVE BELOW, LATIN SMALL LETTER B @@ -18397,8 +18409,20 @@ FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE 0061 116B7 3099 093C 0334 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062;0061 0334 116B7 093C 3099 0062; # (a◌𑚷◌゙◌़◌̴b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; a◌̴◌𑚷◌़◌゙b; ) LATIN SMALL LETTER A, TAKRI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 05B0 094D 3099 1172B 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062; # (a◌ְ◌्◌゙◌𑜫b; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, AHOM SIGN KILLER, LATIN SMALL LETTER B 0061 1172B 05B0 094D 3099 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062; # (a◌𑜫◌ְ◌्◌゙b; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; ) LATIN SMALL LETTER A, AHOM SIGN KILLER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11A34 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062; # (a◌ְ◌्◌゙◌𑨴b; a◌゙◌्◌𑨴◌ְb; a◌゙◌्◌𑨴◌ְb; a◌゙◌्◌𑨴◌ְb; a◌゙◌्◌𑨴◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, ZANABAZAR SQUARE SIGN VIRAMA, LATIN SMALL LETTER B +0061 11A34 05B0 094D 3099 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062; # (a◌𑨴◌ְ◌्◌゙b; a◌゙◌𑨴◌्◌ְb; a◌゙◌𑨴◌्◌ְb; a◌゙◌𑨴◌्◌ְb; a◌゙◌𑨴◌्◌ְb; ) LATIN SMALL LETTER A, ZANABAZAR SQUARE SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11A47 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062; # (a◌ְ◌्◌゙◌𑩇b; a◌゙◌्◌𑩇◌ְb; a◌゙◌्◌𑩇◌ְb; a◌゙◌्◌𑩇◌ְb; a◌゙◌्◌𑩇◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, ZANABAZAR SQUARE SUBJOINER, LATIN SMALL LETTER B +0061 11A47 05B0 094D 3099 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062; # (a◌𑩇◌ְ◌्◌゙b; a◌゙◌𑩇◌्◌ְb; a◌゙◌𑩇◌्◌ְb; a◌゙◌𑩇◌्◌ְb; a◌゙◌𑩇◌्◌ְb; ) LATIN SMALL LETTER A, ZANABAZAR SQUARE SUBJOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11A99 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062; # (a◌ְ◌्◌゙◌𑪙b; a◌゙◌्◌𑪙◌ְb; a◌゙◌्◌𑪙◌ְb; a◌゙◌्◌𑪙◌ְb; a◌゙◌्◌𑪙◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SOYOMBO SUBJOINER, LATIN SMALL LETTER B +0061 11A99 05B0 094D 3099 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062; # (a◌𑪙◌ְ◌्◌゙b; a◌゙◌𑪙◌्◌ְb; a◌゙◌𑪙◌्◌ְb; a◌゙◌𑪙◌्◌ְb; a◌゙◌𑪙◌्◌ְb; ) LATIN SMALL LETTER A, SOYOMBO SUBJOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 05B0 094D 3099 11C3F 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062; # (a◌ְ◌्◌゙◌𑰿b; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BHAIKSUKI SIGN VIRAMA, LATIN SMALL LETTER B 0061 11C3F 05B0 094D 3099 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062; # (a◌𑰿◌ְ◌्◌゙b; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; ) LATIN SMALL LETTER A, BHAIKSUKI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 0334 11D42 0062;0061 0334 093C 11D42 3099 0062;0061 0334 093C 11D42 3099 0062;0061 0334 093C 11D42 3099 0062;0061 0334 093C 11D42 3099 0062; # (a◌゙◌़◌̴◌𑵂b; a◌̴◌़◌𑵂◌゙b; a◌̴◌़◌𑵂◌゙b; a◌̴◌़◌𑵂◌゙b; a◌̴◌़◌𑵂◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, MASARAM GONDI SIGN NUKTA, LATIN SMALL LETTER B +0061 11D42 3099 093C 0334 0062;0061 0334 11D42 093C 3099 0062;0061 0334 11D42 093C 3099 0062;0061 0334 11D42 093C 3099 0062;0061 0334 11D42 093C 3099 0062; # (a◌𑵂◌゙◌़◌̴b; a◌̴◌𑵂◌़◌゙b; a◌̴◌𑵂◌़◌゙b; a◌̴◌𑵂◌़◌゙b; a◌̴◌𑵂◌़◌゙b; ) LATIN SMALL LETTER A, MASARAM GONDI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05B0 094D 3099 11D44 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062; # (a◌ְ◌्◌゙◌𑵄b; a◌゙◌्◌𑵄◌ְb; a◌゙◌्◌𑵄◌ְb; a◌゙◌्◌𑵄◌ְb; a◌゙◌्◌𑵄◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MASARAM GONDI SIGN HALANTA, LATIN SMALL LETTER B +0061 11D44 05B0 094D 3099 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062; # (a◌𑵄◌ְ◌्◌゙b; a◌゙◌𑵄◌्◌ְb; a◌゙◌𑵄◌्◌ְb; a◌゙◌𑵄◌्◌ְb; a◌゙◌𑵄◌्◌ְb; ) LATIN SMALL LETTER A, MASARAM GONDI SIGN HALANTA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11D45 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062; # (a◌ְ◌्◌゙◌𑵅b; a◌゙◌्◌𑵅◌ְb; a◌゙◌्◌𑵅◌ְb; a◌゙◌्◌𑵅◌ְb; a◌゙◌्◌𑵅◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MASARAM GONDI VIRAMA, LATIN SMALL LETTER B +0061 11D45 05B0 094D 3099 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062; # (a◌𑵅◌ְ◌्◌゙b; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; ) LATIN SMALL LETTER A, MASARAM GONDI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B 0061 093C 0334 16AF0 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062;0061 0334 16AF0 093C 0062; # (a◌़◌̴◌𖫰b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; a◌̴◌𖫰◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING HIGH TONE, LATIN SMALL LETTER B 0061 16AF0 093C 0334 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062;0061 16AF0 0334 093C 0062; # (a◌𖫰◌़◌̴b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; a◌𖫰◌̴◌़b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING HIGH TONE, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B 0061 093C 0334 16AF1 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062;0061 0334 16AF1 093C 0062; # (a◌़◌̴◌𖫱b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; a◌̴◌𖫱◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING LOW TONE, LATIN SMALL LETTER B diff --git a/tests/data/SentenceBreakProperty.txt b/tests/data/SentenceBreakProperty.txt index 9309493cf7..cd698150f4 100644 --- a/tests/data/SentenceBreakProperty.txt +++ b/tests/data/SentenceBreakProperty.txt @@ -1,6 +1,6 @@ -# SentenceBreakProperty-9.0.0.txt -# Date: 2016-06-01, 10:34:38 GMT -# © 2016 Unicode®, Inc. +# SentenceBreakProperty-10.0.0.txt +# Date: 2017-03-08, 08:42:08 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -97,6 +97,7 @@ 0ACB..0ACC ; Extend # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU 0ACD ; Extend # Mn GUJARATI SIGN VIRAMA 0AE2..0AE3 ; Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFF ; Extend # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B01 ; Extend # Mn ORIYA SIGN CANDRABINDU 0B02..0B03 ; Extend # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA 0B3C ; Extend # Mn ORIYA SIGN NUKTA @@ -138,8 +139,9 @@ 0CCC..0CCD ; Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA 0CD5..0CD6 ; Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK 0CE2..0CE3 ; Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0D01 ; Extend # Mn MALAYALAM SIGN CANDRABINDU +0D00..0D01 ; Extend # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; Extend # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D3B..0D3C ; Extend # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D3E..0D40 ; Extend # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II 0D41..0D44 ; Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR 0D46..0D48 ; Extend # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI @@ -274,8 +276,9 @@ 1CED ; Extend # Mn VEDIC SIGN TIRYAK 1CF2..1CF3 ; Extend # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA 1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE +1CF7 ; Extend # Mc VEDIC SIGN ATIKRAMA 1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1DC0..1DF5 ; Extend # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE +1DC0..1DF9 ; Extend # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW 1DFB..1DFF ; Extend # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 200C..200D ; Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE @@ -439,6 +442,19 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11726 ; Extend # Mc AHOM VOWEL SIGN E 11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11A01..11A06 ; Extend # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +11A07..11A08 ; Extend # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU +11A09..11A0A ; Extend # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A33..11A38 ; Extend # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Extend # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3B..11A3E ; Extend # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A47 ; Extend # Mn ZANABAZAR SQUARE SUBJOINER +11A51..11A56 ; Extend # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Extend # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Extend # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; Extend # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Extend # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; Extend # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER 11C2F ; Extend # Mc BHAIKSUKI VOWEL SIGN AA 11C30..11C36 ; Extend # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L 11C38..11C3D ; Extend # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA @@ -451,6 +467,11 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11CB2..11CB3 ; Extend # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E 11CB4 ; Extend # Mc MARCHEN VOWEL SIGN O 11CB5..11CB6 ; Extend # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; Extend # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Extend # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Extend # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; Extend # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D47 ; Extend # Mn MASARAM GONDI RA-KARA 16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F51..16F7E ; Extend # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG @@ -479,7 +500,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 2197 +# Total code points: 2277 # ================================================ @@ -1859,6 +1880,7 @@ FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT 0824 ; OLetter # Lm SAMARITAN MODIFIER LETTER SHORT A 0828 ; OLetter # Lm SAMARITAN MODIFIER LETTER I 0840..0858 ; OLetter # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0860..086A ; OLetter # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA 08A0..08B4 ; OLetter # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW 08B6..08BD ; OLetter # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON 0904..0939 ; OLetter # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA @@ -1878,6 +1900,7 @@ FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT 09DC..09DD ; OLetter # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA 09DF..09E1 ; OLetter # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL 09F0..09F1 ; OLetter # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09FC ; OLetter # Lo BENGALI LETTER VEDIC ANUSVARA 0A05..0A0A ; OLetter # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU 0A0F..0A10 ; OLetter # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI 0A13..0A28 ; OLetter # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA @@ -2073,12 +2096,12 @@ FF21..FF3A ; Upper # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LAT 30A1..30FA ; OLetter # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO 30FC..30FE ; OLetter # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK 30FF ; OLetter # Lo KATAKANA DIGRAPH KOTO -3105..312D ; OLetter # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH +3105..312E ; OLetter # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE 3131..318E ; OLetter # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE 31A0..31BA ; OLetter # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY 31F0..31FF ; OLetter # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO 3400..4DB5 ; OLetter # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FD5 ; OLetter # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5 +4E00..9FEA ; OLetter # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA A000..A014 ; OLetter # Lo [21] YI SYLLABLE IT..YI SYLLABLE E A015 ; OLetter # Lm YI SYLLABLE WU A016..A48C ; OLetter # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR @@ -2176,7 +2199,7 @@ FFDA..FFDC ; OLetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 10280..1029C ; OLetter # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X 102A0..102D0 ; OLetter # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 10300..1031F ; OLetter # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS -10330..10340 ; OLetter # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +1032D..10340 ; OLetter # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA 10341 ; OLetter # Nl GOTHIC LETTER NINETY 10342..10349 ; OLetter # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL 1034A ; OLetter # Nl GOTHIC LETTER NINE HUNDRED @@ -2257,11 +2280,21 @@ FFDA..FFDC ; OLetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 11680..116AA ; OLetter # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA 11700..11719 ; OLetter # Lo [26] AHOM LETTER KA..AHOM LETTER JHA 118FF ; OLetter # Lo WARANG CITI OM +11A00 ; OLetter # Lo ZANABAZAR SQUARE LETTER A +11A0B..11A32 ; OLetter # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A3A ; OLetter # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A50 ; OLetter # Lo SOYOMBO LETTER A +11A5C..11A83 ; OLetter # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; OLetter # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA 11AC0..11AF8 ; OLetter # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL 11C00..11C08 ; OLetter # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E ; OLetter # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA 11C40 ; OLetter # Lo BHAIKSUKI SIGN AVAGRAHA 11C72..11C8F ; OLetter # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11D00..11D06 ; OLetter # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; OLetter # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; OLetter # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D46 ; OLetter # Lo MASARAM GONDI REPHA 12000..12399 ; OLetter # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; OLetter # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; OLetter # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU @@ -2277,10 +2310,11 @@ FFDA..FFDC ; OLetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 16F00..16F44 ; OLetter # Lo [69] MIAO LETTER PA..MIAO LETTER HHA 16F50 ; OLetter # Lo MIAO LETTER NASALIZATION 16F93..16F9F ; OLetter # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 -16FE0 ; OLetter # Lm TANGUT ITERATION MARK +16FE0..16FE1 ; OLetter # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK 17000..187EC ; OLetter # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC 18800..18AF2 ; OLetter # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 -1B000..1B001 ; OLetter # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE +1B000..1B11E ; OLetter # Lo [287] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; OLetter # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; OLetter # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; OLetter # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK 1BC80..1BC88 ; OLetter # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL @@ -2323,9 +2357,10 @@ FFDA..FFDC ; OLetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 2A700..2B734 ; OLetter # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 2B740..2B81D ; OLetter # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; OLetter # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; OLetter # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; OLetter # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 113027 +# Total code points: 121354 # ================================================ @@ -2379,12 +2414,13 @@ ABF0..ABF9 ; Numeric # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT N 11730..11739 ; Numeric # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE 118E0..118E9 ; Numeric # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE 11C50..11C59 ; Numeric # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11D50..11D59 ; Numeric # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE 16A60..16A69 ; Numeric # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE 16B50..16B59 ; Numeric # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE 1D7CE..1D7FF ; Numeric # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE 1E950..1E959 ; Numeric # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE -# Total code points: 572 +# Total code points: 582 # ================================================ @@ -2453,6 +2489,8 @@ FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP 115C9..115D7 ; STerm # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES 11641..11642 ; STerm # Po [2] MODI DANDA..MODI DOUBLE DANDA 1173C..1173E ; STerm # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11A42..11A43 ; STerm # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD +11A9B..11A9C ; STerm # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD 11C41..11C42 ; STerm # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA 16A6E..16A6F ; STerm # Po [2] MRO DANDA..MRO DOUBLE DANDA 16AF5 ; STerm # Po BASSA VAH FULL STOP @@ -2461,7 +2499,7 @@ FF61 ; STerm # Po HALFWIDTH IDEOGRAPHIC FULL STOP 1BC9F ; STerm # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA88 ; STerm # Po SIGNWRITING FULL STOP -# Total code points: 121 +# Total code points: 125 # ================================================ diff --git a/tests/data/SentenceBreakTest.txt b/tests/data/SentenceBreakTest.txt index c7b6465c0c..2985b84cf8 100644 --- a/tests/data/SentenceBreakTest.txt +++ b/tests/data/SentenceBreakTest.txt @@ -1,23 +1,24 @@ -# SentenceBreakTest-9.0.0.txt -# Date: 2016-06-02, 18:28:30 GMT -# © 2016 Unicode®, Inc. +# SentenceBreakTest-10.0.0.txt +# Date: 2017-04-14, 05:40:43 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database # For documentation, see http://www.unicode.org/reports/tr44/ # -# Default Sentence Break Test +# Default Sentence_Break Test # # Format: -# <string> (# <comment>)? -# <string> contains hex Unicode code points, with -# ÷ wherever there is a break opportunity, and +# <string> (# <comment>)? +# <string> contains hex Unicode code points, with +# ÷ wherever there is a break opportunity, and # × wherever there is not. # <comment> the format can change, but currently it shows: # - the sample character name # - (x) the Sentence_Break property value for the sample character -# - [x] the rule that determines whether there is a break or not +# - [x] the rule that determines whether there is a break or not, +# as listed in the Rules section of SentenceBreakTest.html # # These samples may be extended or changed in the future. # diff --git a/tests/data/WordBreakProperty.txt b/tests/data/WordBreakProperty.txt index 6ccba54650..4c5440a894 100644 --- a/tests/data/WordBreakProperty.txt +++ b/tests/data/WordBreakProperty.txt @@ -1,6 +1,6 @@ -# WordBreakProperty-9.0.0.txt -# Date: 2016-06-01, 10:34:38 GMT -# © 2016 Unicode®, Inc. +# WordBreakProperty-10.0.0.txt +# Date: 2017-03-10, 02:00:42 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -133,6 +133,7 @@ FB46..FB4F ; Hebrew_Letter # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW 0ACB..0ACC ; Extend # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU 0ACD ; Extend # Mn GUJARATI SIGN VIRAMA 0AE2..0AE3 ; Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFF ; Extend # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B01 ; Extend # Mn ORIYA SIGN CANDRABINDU 0B02..0B03 ; Extend # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA 0B3C ; Extend # Mn ORIYA SIGN NUKTA @@ -174,8 +175,9 @@ FB46..FB4F ; Hebrew_Letter # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW 0CCC..0CCD ; Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA 0CD5..0CD6 ; Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK 0CE2..0CE3 ; Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0D01 ; Extend # Mn MALAYALAM SIGN CANDRABINDU +0D00..0D01 ; Extend # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; Extend # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D3B..0D3C ; Extend # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D3E..0D40 ; Extend # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II 0D41..0D44 ; Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR 0D46..0D48 ; Extend # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI @@ -310,8 +312,9 @@ FB46..FB4F ; Hebrew_Letter # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW 1CED ; Extend # Mn VEDIC SIGN TIRYAK 1CF2..1CF3 ; Extend # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA 1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE +1CF7 ; Extend # Mc VEDIC SIGN ATIKRAMA 1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1DC0..1DF5 ; Extend # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE +1DC0..1DF9 ; Extend # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW 1DFB..1DFF ; Extend # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 200C ; Extend # Cf ZERO WIDTH NON-JOINER 20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE @@ -475,6 +478,19 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11726 ; Extend # Mc AHOM VOWEL SIGN E 11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11A01..11A06 ; Extend # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +11A07..11A08 ; Extend # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU +11A09..11A0A ; Extend # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A33..11A38 ; Extend # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Extend # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3B..11A3E ; Extend # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A47 ; Extend # Mn ZANABAZAR SQUARE SUBJOINER +11A51..11A56 ; Extend # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Extend # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Extend # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; Extend # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Extend # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; Extend # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER 11C2F ; Extend # Mc BHAIKSUKI VOWEL SIGN AA 11C30..11C36 ; Extend # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L 11C38..11C3D ; Extend # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA @@ -487,6 +503,11 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT 11CB2..11CB3 ; Extend # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E 11CB4 ; Extend # Mc MARCHEN VOWEL SIGN O 11CB5..11CB6 ; Extend # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; Extend # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Extend # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Extend # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; Extend # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D47 ; Extend # Mn MASARAM GONDI RA-KARA 16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F51..16F7E ; Extend # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG @@ -515,7 +536,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 2196 +# Total code points: 2276 # ================================================ @@ -580,10 +601,15 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 0294 ; ALetter # Lo LATIN LETTER GLOTTAL STOP 0295..02AF ; ALetter # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL 02B0..02C1 ; ALetter # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; ALetter # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD 02C6..02D1 ; ALetter # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02D7 ; ALetter # Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN +02DE..02DF ; ALetter # Sk [2] MODIFIER LETTER RHOTIC HOOK..MODIFIER LETTER CROSS ACCENT 02E0..02E4 ; ALetter # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP 02EC ; ALetter # Lm MODIFIER LETTER VOICING +02ED ; ALetter # Sk MODIFIER LETTER UNASPIRATED 02EE ; ALetter # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; ALetter # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW 0370..0373 ; ALetter # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI 0374 ; ALetter # Lm GREEK NUMERAL SIGN 0376..0377 ; ALetter # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA @@ -623,6 +649,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 0824 ; ALetter # Lm SAMARITAN MODIFIER LETTER SHORT A 0828 ; ALetter # Lm SAMARITAN MODIFIER LETTER I 0840..0858 ; ALetter # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0860..086A ; ALetter # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA 08A0..08B4 ; ALetter # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW 08B6..08BD ; ALetter # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON 0904..0939 ; ALetter # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA @@ -642,6 +669,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 09DC..09DD ; ALetter # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA 09DF..09E1 ; ALetter # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL 09F0..09F1 ; ALetter # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09FC ; ALetter # Lo BENGALI LETTER VEDIC ANUSVARA 0A05..0A0A ; ALetter # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU 0A0F..0A10 ; ALetter # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI 0A13..0A28 ; ALetter # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA @@ -847,7 +875,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 3005 ; ALetter # Lm IDEOGRAPHIC ITERATION MARK 303B ; ALetter # Lm VERTICAL IDEOGRAPHIC ITERATION MARK 303C ; ALetter # Lo MASU MARK -3105..312D ; ALetter # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH +3105..312E ; ALetter # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE 3131..318E ; ALetter # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE 31A0..31BA ; ALetter # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY A000..A014 ; ALetter # Lo [21] YI SYLLABLE IT..YI SYLLABLE E @@ -867,10 +895,12 @@ A69C..A69D ; ALetter # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER A6A0..A6E5 ; ALetter # Lo [70] BAMUM LETTER A..BAMUM LETTER KI A6E6..A6EF ; ALetter # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM A717..A71F ; ALetter # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; ALetter # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE A722..A76F ; ALetter # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON A770 ; ALetter # Lm MODIFIER LETTER US A771..A787 ; ALetter # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T A788 ; ALetter # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; ALetter # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN A78B..A78E ; ALetter # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT A78F ; ALetter # Lo LATIN LETTER SINOLOGICAL DOT A790..A7AE ; ALetter # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I @@ -904,6 +934,7 @@ AB11..AB16 ; ALetter # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO AB20..AB26 ; ALetter # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO AB28..AB2E ; ALetter # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO AB30..AB5A ; ALetter # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B ; ALetter # Sk MODIFIER BREVE WITH INVERTED BREVE AB5C..AB5F ; ALetter # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB65 ; ALetter # L& [6] LATIN SMALL LETTER SAKHA YAT..GREEK LETTER SMALL CAPITAL OMEGA AB70..ABBF ; ALetter # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA @@ -938,7 +969,7 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 10280..1029C ; ALetter # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X 102A0..102D0 ; ALetter # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 10300..1031F ; ALetter # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS -10330..10340 ; ALetter # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +1032D..10340 ; ALetter # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA 10341 ; ALetter # Nl GOTHIC LETTER NINETY 10342..10349 ; ALetter # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL 1034A ; ALetter # Nl GOTHIC LETTER NINE HUNDRED @@ -1024,11 +1055,21 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 11680..116AA ; ALetter # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA 118A0..118DF ; ALetter # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO 118FF ; ALetter # Lo WARANG CITI OM +11A00 ; ALetter # Lo ZANABAZAR SQUARE LETTER A +11A0B..11A32 ; ALetter # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A3A ; ALetter # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A50 ; ALetter # Lo SOYOMBO LETTER A +11A5C..11A83 ; ALetter # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; ALetter # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA 11AC0..11AF8 ; ALetter # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL 11C00..11C08 ; ALetter # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E ; ALetter # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA 11C40 ; ALetter # Lo BHAIKSUKI SIGN AVAGRAHA 11C72..11C8F ; ALetter # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11D00..11D06 ; ALetter # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; ALetter # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; ALetter # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D46 ; ALetter # Lo MASARAM GONDI REPHA 12000..12399 ; ALetter # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; ALetter # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; ALetter # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU @@ -1044,7 +1085,7 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 16F00..16F44 ; ALetter # Lo [69] MIAO LETTER PA..MIAO LETTER HHA 16F50 ; ALetter # Lo MIAO LETTER NASALIZATION 16F93..16F9F ; ALetter # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 -16FE0 ; ALetter # Lm TANGUT ITERATION MARK +16FE0..16FE1 ; ALetter # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK 1BC00..1BC6A ; ALetter # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C ; ALetter # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK 1BC80..1BC88 ; ALetter # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL @@ -1118,13 +1159,12 @@ FFDA..FFDC ; ALetter # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL 1F150..1F169 ; ALetter # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; ALetter # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 27992 +# Total code points: 28179 # ================================================ 003A ; MidLetter # Po COLON 00B7 ; MidLetter # Po MIDDLE DOT -02D7 ; MidLetter # Sk MODIFIER LETTER MINUS SIGN 0387 ; MidLetter # Po GREEK ANO TELEIA 05F4 ; MidLetter # Po HEBREW PUNCTUATION GERSHAYIM 2027 ; MidLetter # Po HYPHENATION POINT @@ -1132,7 +1172,7 @@ FE13 ; MidLetter # Po PRESENTATION FORM FOR VERTICAL COLON FE55 ; MidLetter # Po SMALL COLON FF1A ; MidLetter # Po FULLWIDTH COLON -# Total code points: 9 +# Total code points: 8 # ================================================ @@ -1217,12 +1257,13 @@ ABF0..ABF9 ; Numeric # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT N 11730..11739 ; Numeric # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE 118E0..118E9 ; Numeric # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE 11C50..11C59 ; Numeric # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11D50..11D59 ; Numeric # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE 16A60..16A69 ; Numeric # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE 16B50..16B59 ; Numeric # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE 1D7CE..1D7FF ; Numeric # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE 1E950..1E959 ; Numeric # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE -# Total code points: 571 +# Total code points: 581 # ================================================ @@ -1242,8 +1283,9 @@ FF3F ; ExtendNumLet # Pc FULLWIDTH LOW LINE 26F9 ; E_Base # So PERSON WITH BALL 270A..270D ; E_Base # So [4] RAISED FIST..WRITING HAND 1F385 ; E_Base # So FATHER CHRISTMAS -1F3C3..1F3C4 ; E_Base # So [2] RUNNER..SURFER -1F3CA..1F3CB ; E_Base # So [2] SWIMMER..WEIGHT LIFTER +1F3C2..1F3C4 ; E_Base # So [3] SNOWBOARDER..SURFER +1F3C7 ; E_Base # So HORSE RACING +1F3CA..1F3CC ; E_Base # So [3] SWIMMER..GOLFER 1F442..1F443 ; E_Base # So [2] EAR..NOSE 1F446..1F450 ; E_Base # So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN 1F46E ; E_Base # So POLICE OFFICER @@ -1252,7 +1294,7 @@ FF3F ; ExtendNumLet # Pc FULLWIDTH LOW LINE 1F481..1F483 ; E_Base # So [3] INFORMATION DESK PERSON..DANCER 1F485..1F487 ; E_Base # So [3] NAIL POLISH..HAIRCUT 1F4AA ; E_Base # So FLEXED BICEPS -1F575 ; E_Base # So SLEUTH OR SPY +1F574..1F575 ; E_Base # So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY 1F57A ; E_Base # So MAN DANCING 1F590 ; E_Base # So RAISED HAND WITH FINGERS SPLAYED 1F595..1F596 ; E_Base # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS @@ -1261,13 +1303,15 @@ FF3F ; ExtendNumLet # Pc FULLWIDTH LOW LINE 1F6A3 ; E_Base # So ROWBOAT 1F6B4..1F6B6 ; E_Base # So [3] BICYCLIST..PEDESTRIAN 1F6C0 ; E_Base # So BATH -1F918..1F91E ; E_Base # So [7] SIGN OF THE HORNS..HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F6CC ; E_Base # So SLEEPING ACCOMMODATION +1F918..1F91C ; E_Base # So [5] SIGN OF THE HORNS..RIGHT-FACING FIST +1F91E..1F91F ; E_Base # So [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN 1F926 ; E_Base # So FACE PALM -1F930 ; E_Base # So PREGNANT WOMAN -1F933..1F939 ; E_Base # So [7] SELFIE..JUGGLING -1F93C..1F93E ; E_Base # So [3] WRESTLERS..HANDBALL +1F930..1F939 ; E_Base # So [10] PREGNANT WOMAN..JUGGLING +1F93D..1F93E ; E_Base # So [2] WATER POLO..HANDBALL +1F9D1..1F9DD ; E_Base # So [13] ADULT..ELF -# Total code points: 79 +# Total code points: 98 # ================================================ @@ -1283,11 +1327,28 @@ FF3F ; ExtendNumLet # Pc FULLWIDTH LOW LINE # ================================================ +2640 ; Glue_After_Zwj # So FEMALE SIGN +2642 ; Glue_After_Zwj # So MALE SIGN +2695..2696 ; Glue_After_Zwj # So [2] STAFF OF AESCULAPIUS..SCALES +2708 ; Glue_After_Zwj # So AIRPLANE 2764 ; Glue_After_Zwj # So HEAVY BLACK HEART +1F308 ; Glue_After_Zwj # So RAINBOW +1F33E ; Glue_After_Zwj # So EAR OF RICE +1F373 ; Glue_After_Zwj # So COOKING +1F393 ; Glue_After_Zwj # So GRADUATION CAP +1F3A4 ; Glue_After_Zwj # So MICROPHONE +1F3A8 ; Glue_After_Zwj # So ARTIST PALETTE +1F3EB ; Glue_After_Zwj # So SCHOOL +1F3ED ; Glue_After_Zwj # So FACTORY 1F48B ; Glue_After_Zwj # So KISS MARK +1F4BB..1F4BC ; Glue_After_Zwj # So [2] PERSONAL COMPUTER..BRIEFCASE +1F527 ; Glue_After_Zwj # So WRENCH +1F52C ; Glue_After_Zwj # So MICROSCOPE 1F5E8 ; Glue_After_Zwj # So LEFT SPEECH BUBBLE +1F680 ; Glue_After_Zwj # So ROCKET +1F692 ; Glue_After_Zwj # So FIRE ENGINE -# Total code points: 3 +# Total code points: 22 # ================================================ diff --git a/tests/data/WordBreakTest.txt b/tests/data/WordBreakTest.txt index a3a4b0548e..63761026ce 100644 --- a/tests/data/WordBreakTest.txt +++ b/tests/data/WordBreakTest.txt @@ -1,23 +1,24 @@ -# WordBreakTest-9.0.0.txt -# Date: 2016-06-02, 18:28:31 GMT -# © 2016 Unicode®, Inc. +# WordBreakTest-10.0.0.txt +# Date: 2017-04-14, 05:40:44 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database # For documentation, see http://www.unicode.org/reports/tr44/ # -# Default Word Break Test +# Default Word_Break Test # # Format: -# <string> (# <comment>)? -# <string> contains hex Unicode code points, with -# ÷ wherever there is a break opportunity, and +# <string> (# <comment>)? +# <string> contains hex Unicode code points, with +# ÷ wherever there is a break opportunity, and # × wherever there is not. # <comment> the format can change, but currently it shows: # - the sample character name # - (x) the Word_Break property value for the sample character -# - [x] the rule that determines whether there is a break or not +# - [x] the rule that determines whether there is a break or not, +# as listed in the Rules section of WordBreakTest.html # # These samples may be extended or changed in the future. # @@ -55,8 +56,8 @@ ÷ 0001 × 0308 ÷ 261D ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0001 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0001 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0001 ÷ 2764 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0001 × 0308 ÷ 2764 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0001 ÷ 2640 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0001 × 0308 ÷ 2640 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0001 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Other) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0001 × 0308 ÷ 1F466 ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0001 × 00AD ÷ # ÷ [0.2] <START OF HEADING> (Other) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -117,8 +118,8 @@ ÷ 000D ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 000D ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 000D ÷ 2764 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 000D ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000D ÷ 2640 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 000D ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 000D ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] BOY (EBG) ÷ [0.3] ÷ 000D ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000D ÷ 00AD ÷ # ÷ [0.2] <CARRIAGE RETURN (CR)> (CR) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -179,8 +180,8 @@ ÷ 000A ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 000A ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 000A ÷ 2764 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 000A ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000A ÷ 2640 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 000A ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 000A ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] BOY (EBG) ÷ [0.3] ÷ 000A ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000A ÷ 00AD ÷ # ÷ [0.2] <LINE FEED (LF)> (LF) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -241,8 +242,8 @@ ÷ 000B ÷ 0308 ÷ 261D ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 000B ÷ 1F3FB ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 000B ÷ 0308 ÷ 1F3FB ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 000B ÷ 2764 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 000B ÷ 0308 ÷ 2764 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 000B ÷ 2640 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 000B ÷ 0308 ÷ 2640 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 000B ÷ 1F466 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] BOY (EBG) ÷ [0.3] ÷ 000B ÷ 0308 ÷ 1F466 ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 000B ÷ 00AD ÷ # ÷ [0.2] <LINE TABULATION> (Newline) ÷ [3.1] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -303,8 +304,8 @@ ÷ 3031 × 0308 ÷ 261D ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 3031 ÷ 1F3FB ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 3031 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 3031 ÷ 2764 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 3031 × 0308 ÷ 2764 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 3031 ÷ 2640 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 3031 × 0308 ÷ 2640 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 3031 ÷ 1F466 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 3031 × 0308 ÷ 1F466 ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 3031 × 00AD ÷ # ÷ [0.2] VERTICAL KANA REPEAT MARK (Katakana) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -365,8 +366,8 @@ ÷ 0041 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0041 ÷ 1F3FB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0041 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0041 ÷ 2764 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0041 × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0041 ÷ 2640 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0041 × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0041 ÷ 1F466 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0041 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0041 × 00AD ÷ # ÷ [0.2] LATIN CAPITAL LETTER A (ALetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -427,8 +428,8 @@ ÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 003A ÷ 2764 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 003A × 0308 ÷ 2764 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 003A ÷ 2640 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 003A × 0308 ÷ 2640 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 003A ÷ 1F466 ÷ # ÷ [0.2] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 003A × 00AD ÷ # ÷ [0.2] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -489,8 +490,8 @@ ÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 002C ÷ 2764 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 002C × 0308 ÷ 2764 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 002C ÷ 2640 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 002C × 0308 ÷ 2640 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 002C ÷ 1F466 ÷ # ÷ [0.2] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 002C × 00AD ÷ # ÷ [0.2] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -551,8 +552,8 @@ ÷ 002E × 0308 ÷ 261D ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 002E ÷ 1F3FB ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 002E × 0308 ÷ 1F3FB ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 002E ÷ 2764 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 002E × 0308 ÷ 2764 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 002E ÷ 2640 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 002E × 0308 ÷ 2640 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 002E ÷ 1F466 ÷ # ÷ [0.2] FULL STOP (MidNumLet) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 002E × 0308 ÷ 1F466 ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 002E × 00AD ÷ # ÷ [0.2] FULL STOP (MidNumLet) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -613,8 +614,8 @@ ÷ 0030 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0030 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0030 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0030 ÷ 2764 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0030 × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0030 ÷ 2640 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0030 × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0030 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0030 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0030 × 00AD ÷ # ÷ [0.2] DIGIT ZERO (Numeric) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -675,8 +676,8 @@ ÷ 005F × 0308 ÷ 261D ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 005F ÷ 1F3FB ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 005F × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 005F ÷ 2764 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 005F × 0308 ÷ 2764 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 005F ÷ 2640 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 005F × 0308 ÷ 2640 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 005F ÷ 1F466 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 005F × 0308 ÷ 1F466 ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 005F × 00AD ÷ # ÷ [0.2] LOW LINE (ExtendNumLet) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -737,8 +738,8 @@ ÷ 1F1E6 × 0308 ÷ 261D ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 1F1E6 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 1F1E6 ÷ 2764 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 1F1E6 × 0308 ÷ 2764 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F1E6 ÷ 2640 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 1F1E6 × 0308 ÷ 2640 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 1F1E6 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F1E6 × 0308 ÷ 1F466 ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F1E6 × 00AD ÷ # ÷ [0.2] REGIONAL INDICATOR SYMBOL LETTER A (RI) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -799,8 +800,8 @@ ÷ 05D0 × 0308 ÷ 261D ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 05D0 ÷ 1F3FB ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 05D0 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 05D0 ÷ 2764 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 05D0 × 0308 ÷ 2764 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 05D0 ÷ 2640 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 05D0 × 0308 ÷ 2640 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 05D0 ÷ 1F466 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 05D0 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 05D0 × 00AD ÷ # ÷ [0.2] HEBREW LETTER ALEF (Hebrew_Letter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -861,8 +862,8 @@ ÷ 0022 × 0308 ÷ 261D ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0022 ÷ 1F3FB ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0022 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0022 ÷ 2764 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0022 × 0308 ÷ 2764 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0022 ÷ 2640 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0022 × 0308 ÷ 2640 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0022 ÷ 1F466 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0022 × 0308 ÷ 1F466 ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0022 × 00AD ÷ # ÷ [0.2] QUOTATION MARK (Double_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -923,8 +924,8 @@ ÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0027 ÷ 2764 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0027 × 0308 ÷ 2764 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0027 ÷ 2640 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0027 × 0308 ÷ 2640 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0027 × 00AD ÷ # ÷ [0.2] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -985,8 +986,8 @@ ÷ 261D × 0308 ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 261D × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 261D × 0308 × 1F3FB ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 261D ÷ 2764 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 261D × 0308 ÷ 2764 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 261D ÷ 2640 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 261D × 0308 ÷ 2640 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 261D ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 261D × 0308 ÷ 1F466 ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 261D × 00AD ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1047,8 +1048,8 @@ ÷ 1F3FB × 0308 ÷ 261D ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 1F3FB ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 1F3FB × 0308 ÷ 1F3FB ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 1F3FB ÷ 2764 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 1F3FB × 0308 ÷ 2764 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F3FB ÷ 2640 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 1F3FB × 0308 ÷ 2640 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 1F3FB ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F3FB × 0308 ÷ 1F466 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F3FB × 00AD ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1075,68 +1076,68 @@ ÷ 1F3FB × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] ÷ 1F3FB ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 1F3FB × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2764 ÷ 0001 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 2764 × 0308 ÷ 0001 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] -÷ 2764 ÷ 000D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 2764 × 0308 ÷ 000D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] -÷ 2764 ÷ 000A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 2764 × 0308 ÷ 000A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] -÷ 2764 ÷ 000B ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] -÷ 2764 × 0308 ÷ 000B ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] -÷ 2764 ÷ 3031 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] -÷ 2764 × 0308 ÷ 3031 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] -÷ 2764 ÷ 0041 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] -÷ 2764 × 0308 ÷ 0041 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] -÷ 2764 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 2764 × 0308 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 2764 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 2764 × 0308 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 2764 ÷ 002E ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] -÷ 2764 × 0308 ÷ 002E ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] -÷ 2764 ÷ 0030 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 2764 × 0308 ÷ 0030 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] -÷ 2764 ÷ 005F ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 2764 × 0308 ÷ 005F ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] -÷ 2764 ÷ 1F1E6 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 2764 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] -÷ 2764 ÷ 05D0 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] -÷ 2764 × 0308 ÷ 05D0 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] -÷ 2764 ÷ 0022 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] -÷ 2764 × 0308 ÷ 0022 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] -÷ 2764 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 2764 × 0308 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 2764 ÷ 261D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] -÷ 2764 × 0308 ÷ 261D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] -÷ 2764 ÷ 1F3FB ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 2764 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 2764 ÷ 2764 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 2764 × 0308 ÷ 2764 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 2764 ÷ 1F466 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] BOY (EBG) ÷ [0.3] -÷ 2764 × 0308 ÷ 1F466 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] -÷ 2764 × 00AD ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] -÷ 2764 × 0308 × 00AD ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] -÷ 2764 × 0300 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 2764 × 0308 × 0300 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] -÷ 2764 × 200D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] -÷ 2764 × 0308 × 200D ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] -÷ 2764 ÷ 0061 × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2764 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2764 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 2764 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 2764 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 2764 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 2764 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2764 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2764 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 2764 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 2764 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 2764 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] -÷ 2764 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 2764 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] -÷ 2764 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 2764 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] -÷ 2764 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] -÷ 2764 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] HEAVY BLACK HEART (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2640 ÷ 0001 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 2640 × 0308 ÷ 0001 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] +÷ 2640 ÷ 000D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 2640 × 0308 ÷ 000D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] +÷ 2640 ÷ 000A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 2640 × 0308 ÷ 000A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE FEED (LF)> (LF) ÷ [0.3] +÷ 2640 ÷ 000B ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 2640 × 0308 ÷ 000B ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [3.2] <LINE TABULATION> (Newline) ÷ [0.3] +÷ 2640 ÷ 3031 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 2640 × 0308 ÷ 3031 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] VERTICAL KANA REPEAT MARK (Katakana) ÷ [0.3] +÷ 2640 ÷ 0041 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 2640 × 0308 ÷ 0041 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN CAPITAL LETTER A (ALetter) ÷ [0.3] +÷ 2640 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2640 × 0308 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2640 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2640 × 0308 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2640 ÷ 002E ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 2640 × 0308 ÷ 002E ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FULL STOP (MidNumLet) ÷ [0.3] +÷ 2640 ÷ 0030 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 2640 × 0308 ÷ 0030 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ZERO (Numeric) ÷ [0.3] +÷ 2640 ÷ 005F ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 2640 × 0308 ÷ 005F ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LOW LINE (ExtendNumLet) ÷ [0.3] +÷ 2640 ÷ 1F1E6 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 2640 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] +÷ 2640 ÷ 05D0 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 2640 × 0308 ÷ 05D0 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEBREW LETTER ALEF (Hebrew_Letter) ÷ [0.3] +÷ 2640 ÷ 0022 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 2640 × 0308 ÷ 0022 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] QUOTATION MARK (Double_Quote) ÷ [0.3] +÷ 2640 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2640 × 0308 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2640 ÷ 261D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 2640 × 0308 ÷ 261D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] +÷ 2640 ÷ 1F3FB ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 2640 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] +÷ 2640 ÷ 2640 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 2640 × 0308 ÷ 2640 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 2640 ÷ 1F466 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 2640 × 0308 ÷ 1F466 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] +÷ 2640 × 00AD ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 2640 × 0308 × 00AD ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] +÷ 2640 × 0300 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 2640 × 0308 × 0300 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] COMBINING GRAVE ACCENT (Extend_FE) ÷ [0.3] +÷ 2640 × 200D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 2640 × 0308 × 200D ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) ÷ [0.3] +÷ 2640 ÷ 0061 × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2640 × 0308 ÷ 0061 × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2640 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2640 × 0308 ÷ 0061 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2640 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2640 × 0308 ÷ 0061 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2640 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2640 × 0308 ÷ 0061 ÷ 0027 × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2640 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2640 × 0308 ÷ 0061 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2640 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2640 × 0308 ÷ 0031 ÷ 003A ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [0.3] +÷ 2640 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2640 × 0308 ÷ 0031 ÷ 0027 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [0.3] +÷ 2640 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2640 × 0308 ÷ 0031 ÷ 002C ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [0.3] +÷ 2640 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] +÷ 2640 × 0308 ÷ 0031 ÷ 002E × 2060 ÷ # ÷ [0.2] FEMALE SIGN (Glue_After_Zwj) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [0.3] ÷ 1F466 ÷ 0001 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 1F466 × 0308 ÷ 0001 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] <START OF HEADING> (Other) ÷ [0.3] ÷ 1F466 ÷ 000D ÷ # ÷ [0.2] BOY (EBG) ÷ [3.2] <CARRIAGE RETURN (CR)> (CR) ÷ [0.3] @@ -1171,8 +1172,8 @@ ÷ 1F466 × 0308 ÷ 261D ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 1F466 × 0308 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 1F466 ÷ 2764 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 1F466 × 0308 ÷ 2764 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 1F466 ÷ 2640 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 1F466 × 0308 ÷ 2640 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F466 × 0308 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 1F466 × 00AD ÷ # ÷ [0.2] BOY (EBG) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1233,8 +1234,8 @@ ÷ 00AD × 0308 ÷ 261D ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 00AD ÷ 1F3FB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 00AD × 0308 ÷ 1F3FB ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 00AD ÷ 2764 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 00AD × 0308 ÷ 2764 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 00AD ÷ 2640 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 00AD × 0308 ÷ 2640 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 00AD ÷ 1F466 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 00AD × 0308 ÷ 1F466 ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 00AD × 00AD ÷ # ÷ [0.2] SOFT HYPHEN (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1295,8 +1296,8 @@ ÷ 0300 × 0308 ÷ 261D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0300 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0300 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0300 ÷ 2764 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0300 × 0308 ÷ 2764 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0300 ÷ 2640 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0300 × 0308 ÷ 2640 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0300 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0300 × 0308 ÷ 1F466 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0300 × 00AD ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1357,8 +1358,8 @@ ÷ 200D × 0308 ÷ 261D ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 200D ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 200D × 0308 ÷ 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 200D × 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 200D × 0308 ÷ 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 0308 ÷ 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) ÷ [0.3] ÷ 200D × 0308 ÷ 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 200D × 00AD ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1419,8 +1420,8 @@ ÷ 0061 × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0061 × 2060 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0061 × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0061 × 2060 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0061 × 2060 × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 × 2060 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0061 × 2060 × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0061 × 2060 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 × 2060 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1481,8 +1482,8 @@ ÷ 0061 ÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0061 ÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0061 ÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0061 ÷ 003A ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0061 ÷ 003A × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 003A ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 003A × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0061 ÷ 003A ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 003A × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1543,8 +1544,8 @@ ÷ 0061 ÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0061 ÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0061 ÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0061 ÷ 0027 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0061 ÷ 0027 × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 0027 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 0027 × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0061 ÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 0027 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1605,8 +1606,8 @@ ÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0061 ÷ 0027 × 2060 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 0027 × 2060 × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1667,8 +1668,8 @@ ÷ 0061 ÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0061 ÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0061 ÷ 002C ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0061 ÷ 002C × 0308 ÷ 2764 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 002C ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0061 ÷ 002C × 0308 ÷ 2640 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0061 ÷ 002C ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 ÷ 002C × 00AD ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) ÷ [999.0] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1729,8 +1730,8 @@ ÷ 0031 ÷ 003A × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0031 ÷ 003A ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0031 ÷ 003A × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 003A ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 003A × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0031 ÷ 003A ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 003A × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 003A × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COLON (MidLetter) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1791,8 +1792,8 @@ ÷ 0031 ÷ 0027 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0031 ÷ 0027 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0031 ÷ 0027 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0031 ÷ 0027 × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 0027 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 0027 × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0031 ÷ 0027 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 0027 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 0027 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] APOSTROPHE (Single_Quote) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1853,8 +1854,8 @@ ÷ 0031 ÷ 002C × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0031 ÷ 002C ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0031 ÷ 002C ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0031 ÷ 002C × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 002C ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 002C × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0031 ÷ 002C ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 002C × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 002C × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] COMMA (MidNum) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1915,8 +1916,8 @@ ÷ 0031 ÷ 002E × 2060 × 0308 ÷ 261D ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F3FB ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 0031 ÷ 002E × 2060 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] -÷ 0031 ÷ 002E × 2060 × 0308 ÷ 2764 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] +÷ 0031 ÷ 002E × 2060 × 0308 ÷ 2640 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 0308 ÷ 1F466 ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0031 ÷ 002E × 2060 × 00AD ÷ # ÷ [0.2] DIGIT ONE (Numeric) ÷ [999.0] FULL STOP (MidNumLet) × [4.0] WORD JOINER (Format_FE) × [4.0] SOFT HYPHEN (Format_FE) ÷ [0.3] @@ -1966,7 +1967,7 @@ ÷ 261D × 1F3FB ÷ 261D ÷ # ÷ [0.2] WHITE UP POINTING INDEX (E_Base) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [999.0] WHITE UP POINTING INDEX (E_Base) ÷ [0.3] ÷ 1F466 × 1F3FB ÷ # ÷ [0.2] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] ÷ 200D × 1F466 × 1F3FB ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) × [14.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (E_Modifier) ÷ [0.3] -÷ 200D × 2764 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] HEAVY BLACK HEART (Glue_After_Zwj) ÷ [0.3] +÷ 200D × 2640 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] FEMALE SIGN (Glue_After_Zwj) ÷ [0.3] ÷ 200D × 1F466 ÷ # ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [3.3] BOY (EBG) ÷ [0.3] ÷ 1F466 ÷ 1F466 ÷ # ÷ [0.2] BOY (EBG) ÷ [999.0] BOY (EBG) ÷ [0.3] ÷ 0061 × 0308 × 200D × 0308 × 0062 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] COMBINING DIAERESIS (Extend_FE) × [4.0] ZERO WIDTH JOINER (ZWJ_FE) × [4.0] COMBINING DIAERESIS (Extend_FE) × [5.0] LATIN SMALL LETTER B (ALetter) ÷ [0.3] diff --git a/tools-for-build/BidiMirroring.txt b/tools-for-build/BidiMirroring.txt index 68142c5e32..cbb61c4b57 100644 --- a/tools-for-build/BidiMirroring.txt +++ b/tools-for-build/BidiMirroring.txt @@ -1,13 +1,13 @@ -# BidiMirroring-9.0.0.txt -# Date: 2016-01-21, 22:00:00 GMT [KW, LI] -# © 2016 Unicode®, Inc. +# BidiMirroring-10.0.0.txt +# Date: 2017-04-12, 17:30:00 GMT [KW, LI] +# © 2017 Unicode®, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database # For documentation, see http://www.unicode.org/reports/tr44/ # # Bidi_Mirroring_Glyph Property -# +# # This file is an informative contributory data file in the # Unicode Character Database. # @@ -15,20 +15,20 @@ # value, for which there is another Unicode character that typically has a glyph # that is the mirror image of the original character's glyph. # -# The repertoire covered by the file is Unicode 9.0.0. -# +# The repertoire covered by the file is Unicode 10.0.0. +# # The file contains a list of lines with mappings from one code point # to another one for character-based mirroring. # Note that for "real" mirroring, a rendering engine needs to select # appropriate alternative glyphs, and that many Unicode characters do not # have a mirror-image Unicode character. -# +# # Each mapping line contains two fields, separated by a semicolon (';'). # Each of the two fields contains a code point represented as a # variable-length hexadecimal value with 4 to 6 digits. # A comment indicates where the characters are "BEST FIT" mirroring. -# -# Code points for which Bidi_Mirrored=Yes, but for which no appropriate +# +# Code points for which Bidi_Mirrored=Yes, but for which no appropriate # characters exist with mirrored glyphs, are # listed as comments at the end of the file. # @@ -38,14 +38,14 @@ # point has the default value for the Bidi_Mirroring_Glyph property, # that means that no other character exists whose glyph is suitable # for character-based mirroring. -# +# # For information on bidi mirroring, see UAX #9: Unicode Bidirectional Algorithm, # at http://www.unicode.org/unicode/reports/tr9/ -# +# # This file was originally created by Markus Scherer. # Extended for Unicode 3.2, 4.0, 4.1, 5.0, 5.1, 5.2, and 6.0 by Ken Whistler, # and for subsequent versions by Ken Whistler and Laurentiu Iancu. -# +# # ############################################################ # # Property: Bidi_Mirroring_Glyph diff --git a/tools-for-build/Blocks.txt b/tools-for-build/Blocks.txt index 74c41e58a8..a4f851b14a 100644 --- a/tools-for-build/Blocks.txt +++ b/tools-for-build/Blocks.txt @@ -1,6 +1,6 @@ -# Blocks-9.0.0.txt -# Date: 2016-02-05, 23:48:00 GMT [KW] -# © 2016 Unicode®, Inc. +# Blocks-10.0.0.txt +# Date: 2017-04-12, 17:30:00 GMT [KW] +# © 2017 Unicode®, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database @@ -14,12 +14,12 @@ # Note: When comparing block names, casing, whitespace, hyphens, # and underbars are ignored. # For example, "Latin Extended-A" and "latin extended a" are equivalent. -# For more information on the comparison of property values, +# For more information on the comparison of property values, # see UAX #44: http://www.unicode.org/reports/tr44/ # # All block ranges start with a value where (cp MOD 16) = 0, # and end with a value where (cp MOD 16) = 15. In other words, -# the last hexadecimal digit of the start of range is ...0 +# the last hexadecimal digit of the start of range is ...0 # and the last hexadecimal digit of the end of range is ...F. # This constraint on block ranges guarantees that allocations # are done in terms of whole columns, and that code chart display @@ -51,6 +51,7 @@ 07C0..07FF; NKo 0800..083F; Samaritan 0840..085F; Mandaic +0860..086F; Syriac Supplement 08A0..08FF; Arabic Extended-A 0900..097F; Devanagari 0980..09FF; Bengali @@ -253,9 +254,12 @@ FFF0..FFFF; Specials 11680..116CF; Takri 11700..1173F; Ahom 118A0..118FF; Warang Citi +11A00..11A4F; Zanabazar Square +11A50..11AAF; Soyombo 11AC0..11AFF; Pau Cin Hau 11C00..11C6F; Bhaiksuki 11C70..11CBF; Marchen +11D00..11D5F; Masaram Gondi 12000..123FF; Cuneiform 12400..1247F; Cuneiform Numbers and Punctuation 12480..1254F; Early Dynastic Cuneiform @@ -270,6 +274,8 @@ FFF0..FFFF; Specials 17000..187FF; Tangut 18800..18AFF; Tangut Components 1B000..1B0FF; Kana Supplement +1B100..1B12F; Kana Extended-A +1B170..1B2FF; Nushu 1BC00..1BC9F; Duployan 1BCA0..1BCAF; Shorthand Format Controls 1D000..1D0FF; Byzantine Musical Symbols @@ -300,6 +306,7 @@ FFF0..FFFF; Specials 2A700..2B73F; CJK Unified Ideographs Extension C 2B740..2B81F; CJK Unified Ideographs Extension D 2B820..2CEAF; CJK Unified Ideographs Extension E +2CEB0..2EBEF; CJK Unified Ideographs Extension F 2F800..2FA1F; CJK Compatibility Ideographs Supplement E0000..E007F; Tags E0100..E01EF; Variation Selectors Supplement diff --git a/tools-for-build/CaseFolding.txt b/tools-for-build/CaseFolding.txt index 372ee68bd8..efdf18e441 100644 --- a/tools-for-build/CaseFolding.txt +++ b/tools-for-build/CaseFolding.txt @@ -1,6 +1,6 @@ -# CaseFolding-9.0.0.txt -# Date: 2016-03-02, 18:54:54 GMT -# © 2016 Unicode®, Inc. +# CaseFolding-10.0.0.txt +# Date: 2017-04-14, 05:40:18 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -24,7 +24,7 @@ # # NOTE: case folding does not preserve normalization formats! # -# For information on case folding, including how to have case folding +# For information on case folding, including how to have case folding # preserve normalization formats, see Section 3.13 Default Case Algorithms in # The Unicode Standard. # diff --git a/tools-for-build/CompositionExclusions.txt b/tools-for-build/CompositionExclusions.txt index 1999ed1328..ff42508686 100644 --- a/tools-for-build/CompositionExclusions.txt +++ b/tools-for-build/CompositionExclusions.txt @@ -1,6 +1,6 @@ -# CompositionExclusions-9.0.0.txt -# Date: 2016-01-21, 22:00:00 GMT [KW, LI] -# © 2016 Unicode®, Inc. +# CompositionExclusions-10.0.0.txt +# Date: 2017-02-15, 00:00:00 GMT [KW, LI] +# © 2017 Unicode®, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database diff --git a/tools-for-build/DerivedAge.txt b/tools-for-build/DerivedAge.txt index e9c7cd65f7..917afd413c 100644 --- a/tools-for-build/DerivedAge.txt +++ b/tools-for-build/DerivedAge.txt @@ -1,6 +1,6 @@ -# DerivedAge-9.0.0.txt -# Date: 2016-03-02, 18:54:54 GMT -# © 2016 Unicode®, Inc. +# DerivedAge-10.0.0.txt +# Date: 2017-04-14, 05:40:18 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -13,7 +13,7 @@ # Notes: # # - The term 'assigned' means that a previously reserved code point was assigned -# to be a character (graphic, format, control, or private-use); +# to be a character (graphic, format, control, or private-use); # a noncharacter code point; or a surrogate code point. # For more information, see The Unicode Standard Section 2.4 # @@ -1598,4 +1598,53 @@ A8C5 ; 9.0 # SAURASHTRA SIGN CANDRABINDU # Total code points: 7500 +# ================================================ + +# Age=V10_0 + +# Newly assigned in Unicode 10.0.0 (June, 2017) + +0860..086A ; 10.0 # [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +09FC..09FD ; 10.0 # [2] BENGALI LETTER VEDIC ANUSVARA..BENGALI ABBREVIATION SIGN +0AFA..0AFF ; 10.0 # [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0D00 ; 10.0 # MALAYALAM SIGN COMBINING ANUSVARA ABOVE +0D3B..0D3C ; 10.0 # [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +1CF7 ; 10.0 # VEDIC SIGN ATIKRAMA +1DF6..1DF9 ; 10.0 # [4] COMBINING KAVYKA ABOVE RIGHT..COMBINING WIDE INVERTED BRIDGE BELOW +20BF ; 10.0 # BITCOIN SIGN +23FF ; 10.0 # OBSERVER EYE SYMBOL +2BD2 ; 10.0 # GROUP MARK +2E45..2E49 ; 10.0 # [5] INVERTED LOW KAVYKA..DOUBLE STACKED COMMA +312E ; 10.0 # BOPOMOFO LETTER O WITH DOT ABOVE +9FD6..9FEA ; 10.0 # [21] CJK UNIFIED IDEOGRAPH-9FD6..CJK UNIFIED IDEOGRAPH-9FEA +1032D..1032F ; 10.0 # [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE +11A00..11A47 ; 10.0 # [72] ZANABAZAR SQUARE LETTER A..ZANABAZAR SQUARE SUBJOINER +11A50..11A83 ; 10.0 # [52] SOYOMBO LETTER A..SOYOMBO LETTER KSSA +11A86..11A9C ; 10.0 # [23] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO MARK DOUBLE SHAD +11A9E..11AA2 ; 10.0 # [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 +11D00..11D06 ; 10.0 # [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; 10.0 # [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D36 ; 10.0 # [44] MASARAM GONDI LETTER AU..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; 10.0 # MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; 10.0 # [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D47 ; 10.0 # [9] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI RA-KARA +11D50..11D59 ; 10.0 # [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +16FE1 ; 10.0 # NUSHU ITERATION MARK +1B002..1B11E ; 10.0 # [285] HENTAIGANA LETTER A-1..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB ; 10.0 # [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1F260..1F265 ; 10.0 # [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F6D3..1F6D4 ; 10.0 # [2] STUPA..PAGODA +1F6F7..1F6F8 ; 10.0 # [2] SLED..FLYING SAUCER +1F900..1F90B ; 10.0 # [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F91F ; 10.0 # I LOVE YOU HAND SIGN +1F928..1F92F ; 10.0 # [8] FACE WITH ONE EYEBROW RAISED..SHOCKED FACE WITH EXPLODING HEAD +1F931..1F932 ; 10.0 # [2] BREAST-FEEDING..PALMS UP TOGETHER +1F94C ; 10.0 # CURLING STONE +1F95F..1F96B ; 10.0 # [13] DUMPLING..CANNED FOOD +1F992..1F997 ; 10.0 # [6] GIRAFFE FACE..CRICKET +1F9D0..1F9E6 ; 10.0 # [23] FACE WITH MONOCLE..SOCKS +2CEB0..2EBE0 ; 10.0 # [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 + +# Total code points: 8518 + # EOF diff --git a/tools-for-build/DerivedNormalizationProps.txt b/tools-for-build/DerivedNormalizationProps.txt index 089bd42abe..941c310b96 100644 --- a/tools-for-build/DerivedNormalizationProps.txt +++ b/tools-for-build/DerivedNormalizationProps.txt @@ -1,6 +1,6 @@ -# DerivedNormalizationProps-9.0.0.txt -# Date: 2016-03-02, 18:54:59 GMT -# © 2016 Unicode®, Inc. +# DerivedNormalizationProps-10.0.0.txt +# Date: 2017-02-14, 04:26:07 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # diff --git a/tools-for-build/EastAsianWidth.txt b/tools-for-build/EastAsianWidth.txt index 5a2ede5d59..0d3129bb0a 100644 --- a/tools-for-build/EastAsianWidth.txt +++ b/tools-for-build/EastAsianWidth.txt @@ -1,6 +1,6 @@ -# EastAsianWidth-9.0.0.txt -# Date: 2016-05-27, 17:00:00 GMT [KW, LI] -# © 2016 Unicode®, Inc. +# EastAsianWidth-10.0.0.txt +# Date: 2017-03-08, 02:00:00 GMT [KW, LI] +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -328,6 +328,7 @@ 0840..0858;N # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN 0859..085B;N # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK 085E;N # Po MANDAIC PUNCTUATION +0860..086A;N # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA 08A0..08B4;N # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW 08B6..08BD;N # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON 08D4..08E1;N # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA @@ -381,6 +382,8 @@ 09F4..09F9;N # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN 09FA;N # So BENGALI ISSHAR 09FB;N # Sc BENGALI GANDA MARK +09FC;N # Lo BENGALI LETTER VEDIC ANUSVARA +09FD;N # Po BENGALI ABBREVIATION SIGN 0A01..0A02;N # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI 0A03;N # Mc GURMUKHI SIGN VISARGA 0A05..0A0A;N # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU @@ -425,6 +428,7 @@ 0AF0;N # Po GUJARATI ABBREVIATION SIGN 0AF1;N # Sc GUJARATI RUPEE SIGN 0AF9;N # Lo GUJARATI LETTER ZHA +0AFA..0AFF;N # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B01;N # Mn ORIYA SIGN CANDRABINDU 0B02..0B03;N # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA 0B05..0B0C;N # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L @@ -516,11 +520,12 @@ 0CE2..0CE3;N # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF;N # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2;N # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -0D01;N # Mn MALAYALAM SIGN CANDRABINDU +0D00..0D01;N # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03;N # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D05..0D0C;N # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L 0D0E..0D10;N # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI 0D12..0D3A;N # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C;N # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D3D;N # Lo MALAYALAM SIGN AVAGRAHA 0D3E..0D40;N # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II 0D41..0D44;N # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR @@ -853,6 +858,7 @@ 1CF2..1CF3;N # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA 1CF4;N # Mn VEDIC TONE CANDRA ABOVE 1CF5..1CF6;N # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7;N # Mc VEDIC SIGN ATIKRAMA 1CF8..1CF9;N # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1D00..1D2B;N # Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL 1D2C..1D6A;N # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI @@ -861,7 +867,7 @@ 1D79..1D7F;N # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE 1D80..1D9A;N # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK 1D9B..1DBF;N # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA -1DC0..1DF5;N # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE +1DC0..1DF9;N # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW 1DFB..1DFF;N # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 1E00..1EFF;N # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP 1F00..1F15;N # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA @@ -954,7 +960,7 @@ 20A9;H # Sc WON SIGN 20AA..20AB;N # Sc [2] NEW SHEQEL SIGN..DONG SIGN 20AC;A # Sc EURO SIGN -20AD..20BE;N # Sc [18] KIP SIGN..LARI SIGN +20AD..20BF;N # Sc [19] KIP SIGN..BITCOIN SIGN 20D0..20DC;N # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0;N # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 20E1;N # Mn COMBINING LEFT RIGHT ARROW ABOVE @@ -1120,7 +1126,7 @@ 23F0;W # So ALARM CLOCK 23F1..23F2;N # So [2] STOPWATCH..TIMER CLOCK 23F3;W # So HOURGLASS WITH FLOWING SAND -23F4..23FE;N # So [11] BLACK MEDIUM LEFT-POINTING TRIANGLE..POWER SLEEP SYMBOL +23F4..23FF;N # So [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL 2400..2426;N # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A;N # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 2460..249B;A # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP @@ -1328,7 +1334,7 @@ 2B76..2B95;N # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW 2B98..2BB9;N # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX 2BBD..2BC8;N # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED -2BCA..2BD1;N # So [8] TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN +2BCA..2BD2;N # So [9] TOP HALF BLACK CIRCLE..GROUP MARK 2BEC..2BEF;N # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS 2C00..2C2E;N # Lu [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE 2C30..2C5E;N # Ll [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE @@ -1397,7 +1403,7 @@ 2E40;N # Pd DOUBLE HYPHEN 2E41;N # Po REVERSED COMMA 2E42;N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E44;N # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK +2E43..2E49;N # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA 2E80..2E99;W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3;W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5;W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE @@ -1453,7 +1459,7 @@ 30FB;W # Po KATAKANA MIDDLE DOT 30FC..30FE;W # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK 30FF;W # Lo KATAKANA DIGRAPH KOTO -3105..312D;W # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH +3105..312E;W # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE 3131..318E;W # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE 3190..3191;W # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK 3192..3195;W # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK @@ -1476,8 +1482,8 @@ 3400..4DB5;W # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 4DB6..4DBF;W # Cn [10] <reserved-4DB6>..<reserved-4DBF> 4DC0..4DFF;N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -4E00..9FD5;W # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5 -9FD6..9FFF;W # Cn [42] <reserved-9FD6>..<reserved-9FFF> +4E00..9FEA;W # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA +9FEB..9FFF;W # Cn [21] <reserved-9FEB>..<reserved-9FFF> A000..A014;W # Lo [21] YI SYLLABLE IT..YI SYLLABLE E A015;W # Lm YI SYLLABLE WU A016..A48C;W # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR @@ -1803,6 +1809,7 @@ FFFD;A # So REPLACEMENT CHARACTER 102E1..102FB;N # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED 10300..1031F;N # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS 10320..10323;N # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..1032F;N # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE 10330..10340;N # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA 10341;N # Nl GOTHIC LETTER NINETY 10342..10349;N # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL @@ -2050,6 +2057,28 @@ FFFD;A # So REPLACEMENT CHARACTER 118E0..118E9;N # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE 118EA..118F2;N # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY 118FF;N # Lo WARANG CITI OM +11A00;N # Lo ZANABAZAR SQUARE LETTER A +11A01..11A06;N # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +11A07..11A08;N # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU +11A09..11A0A;N # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32;N # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38;N # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39;N # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A;N # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E;N # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F..11A46;N # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47;N # Mn ZANABAZAR SQUARE SUBJOINER +11A50;N # Lo SOYOMBO LETTER A +11A51..11A56;N # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58;N # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B;N # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A83;N # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89;N # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96;N # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97;N # Mc SOYOMBO SIGN VISARGA +11A98..11A99;N # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C;N # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9E..11AA2;N # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 11AC0..11AF8;N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL 11C00..11C08;N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E;N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA @@ -2071,6 +2100,16 @@ FFFD;A # So REPLACEMENT CHARACTER 11CB2..11CB3;N # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E 11CB4;N # Mc MARCHEN VOWEL SIGN O 11CB5..11CB6;N # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06;N # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09;N # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30;N # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36;N # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A;N # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D;N # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45;N # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46;N # Lo MASARAM GONDI REPHA +11D47;N # Mn MASARAM GONDI RA-KARA +11D50..11D59;N # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE 12000..12399;N # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E;N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12470..12474;N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON @@ -2100,10 +2139,12 @@ FFFD;A # So REPLACEMENT CHARACTER 16F51..16F7E;N # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 16F8F..16F92;N # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW 16F93..16F9F;N # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 -16FE0;W # Lm TANGUT ITERATION MARK +16FE0..16FE1;W # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK 17000..187EC;W # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC 18800..18AF2;W # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 -1B000..1B001;W # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE +1B000..1B0FF;W # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 +1B100..1B11E;W # Lo [31] HENTAIGANA LETTER RE-3..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB;W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A;N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C;N # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK 1BC80..1BC88;N # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL @@ -2255,6 +2296,7 @@ FFFD;A # So REPLACEMENT CHARACTER 1F210..1F23B;W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240..1F248;W # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F250..1F251;W # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F260..1F265;W # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI 1F300..1F320;W # So [33] CYCLONE..SHOOTING STAR 1F321..1F32C;N # So [12] THERMOMETER..WIND BLOWING FACE 1F32D..1F335;W # So [9] HOT DOG..CACTUS @@ -2299,10 +2341,11 @@ FFFD;A # So REPLACEMENT CHARACTER 1F6CC;W # So SLEEPING ACCOMMODATION 1F6CD..1F6CF;N # So [3] SHOPPING BAGS..BED 1F6D0..1F6D2;W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY +1F6D3..1F6D4;N # So [2] STUPA..PAGODA 1F6E0..1F6EA;N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE 1F6EB..1F6EC;W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING 1F6F0..1F6F3;N # So [4] SATELLITE..PASSENGER SHIP -1F6F4..1F6F6;W # So [3] SCOOTER..CANOE +1F6F4..1F6F8;W # So [5] SCOOTER..FLYING SAUCER 1F700..1F773;N # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F780..1F7D4;N # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR 1F800..1F80B;N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -2310,14 +2353,13 @@ FFFD;A # So REPLACEMENT CHARACTER 1F850..1F859;N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW 1F860..1F887;N # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW 1F890..1F8AD;N # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910..1F91E;W # So [15] ZIPPER-MOUTH FACE..HAND WITH INDEX AND MIDDLE FINGERS CROSSED -1F920..1F927;W # So [8] FACE WITH COWBOY HAT..SNEEZING FACE -1F930;W # So PREGNANT WOMAN -1F933..1F93E;W # So [12] SELFIE..HANDBALL -1F940..1F94B;W # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM -1F950..1F95E;W # So [15] CROISSANT..PANCAKES -1F980..1F991;W # So [18] CRAB..SQUID +1F900..1F90B;N # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F910..1F93E;W # So [47] ZIPPER-MOUTH FACE..HANDBALL +1F940..1F94C;W # So [13] WILTED FLOWER..CURLING STONE +1F950..1F96B;W # So [28] CROISSANT..CANNED FOOD +1F980..1F997;W # So [24] CRAB..CRICKET 1F9C0;W # So CHEESE WEDGE +1F9D0..1F9E6;W # So [23] FACE WITH MONOCLE..SOCKS 20000..2A6D6;W # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2A6D7..2A6FF;W # Cn [41] <reserved-2A6D7>..<reserved-2A6FF> 2A700..2B734;W # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 @@ -2325,7 +2367,9 @@ FFFD;A # So REPLACEMENT CHARACTER 2B740..2B81D;W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B81E..2B81F;W # Cn [2] <reserved-2B81E>..<reserved-2B81F> 2B820..2CEA1;W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 -2CEA2..2F7FF;W # Cn [10590] <reserved-2CEA2>..<reserved-2F7FF> +2CEA2..2CEAF;W # Cn [14] <reserved-2CEA2>..<reserved-2CEAF> +2CEB0..2EBE0;W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBE1..2F7FF;W # Cn [3103] <reserved-2EBE1>..<reserved-2F7FF> 2F800..2FA1D;W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 2FA1E..2FFFD;W # Cn [1504] <reserved-2FA1E>..<reserved-2FFFD> 30000..3FFFD;W # Cn [65534] <reserved-30000>..<reserved-3FFFD> diff --git a/tools-for-build/Jamo.txt b/tools-for-build/Jamo.txt index 13111e1001..f2b5ecb5ca 100644 --- a/tools-for-build/Jamo.txt +++ b/tools-for-build/Jamo.txt @@ -1,6 +1,6 @@ -# Jamo-9.0.0.txt -# Date: 2016-01-21, 22:00:00 GMT [KW, LI] -# © 2016 Unicode®, Inc. +# Jamo-10.0.0.txt +# Date: 2017-02-15, 00:00:00 GMT [KW, LI] +# © 2017 Unicode®, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database @@ -8,7 +8,7 @@ # # This file defines the Jamo_Short_Name property. # -# See Section 3.12 of The Unicode Standard, Version 9.0 +# See Section 3.12 of The Unicode Standard, Version 10.0 # for more information. # # Each line contains two fields, separated by a semicolon. diff --git a/tools-for-build/LineBreak.txt b/tools-for-build/LineBreak.txt index 5f09ad728b..d80210bde3 100644 --- a/tools-for-build/LineBreak.txt +++ b/tools-for-build/LineBreak.txt @@ -1,6 +1,6 @@ -# LineBreak-9.0.0.txt -# Date: 2016-05-26, 01:00:00 GMT [KW, LI] -# © 2016 Unicode®, Inc. +# LineBreak-10.0.0.txt +# Date: 2017-03-08, 02:00:00 GMT [KW, LI] +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -273,6 +273,7 @@ 0840..0858;AL # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN 0859..085B;CM # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK 085E;AL # Po MANDAIC PUNCTUATION +0860..086A;AL # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA 08A0..08B4;AL # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW 08B6..08BD;AL # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON 08D4..08E1;CM # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA @@ -327,6 +328,8 @@ 09F9;PO # No BENGALI CURRENCY DENOMINATOR SIXTEEN 09FA;AL # So BENGALI ISSHAR 09FB;PR # Sc BENGALI GANDA MARK +09FC;AL # Lo BENGALI LETTER VEDIC ANUSVARA +09FD;AL # Po BENGALI ABBREVIATION SIGN 0A01..0A02;CM # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI 0A03;CM # Mc GURMUKHI SIGN VISARGA 0A05..0A0A;AL # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU @@ -371,6 +374,7 @@ 0AF0;AL # Po GUJARATI ABBREVIATION SIGN 0AF1;PR # Sc GUJARATI RUPEE SIGN 0AF9;AL # Lo GUJARATI LETTER ZHA +0AFA..0AFF;CM # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B01;CM # Mn ORIYA SIGN CANDRABINDU 0B02..0B03;CM # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA 0B05..0B0C;AL # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L @@ -462,11 +466,12 @@ 0CE2..0CE3;CM # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF;NU # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2;AL # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -0D01;CM # Mn MALAYALAM SIGN CANDRABINDU +0D00..0D01;CM # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03;CM # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D05..0D0C;AL # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L 0D0E..0D10;AL # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI 0D12..0D3A;AL # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C;CM # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D3D;AL # Lo MALAYALAM SIGN AVAGRAHA 0D3E..0D40;CM # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II 0D41..0D44;CM # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR @@ -824,6 +829,7 @@ 1CF2..1CF3;CM # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA 1CF4;CM # Mn VEDIC TONE CANDRA ABOVE 1CF5..1CF6;AL # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7;CM # Mc VEDIC SIGN ATIKRAMA 1CF8..1CF9;CM # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1D00..1D2B;AL # Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL 1D2C..1D6A;AL # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI @@ -832,7 +838,7 @@ 1D79..1D7F;AL # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE 1D80..1D9A;AL # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK 1D9B..1DBF;AL # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA -1DC0..1DF5;CM # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE +1DC0..1DF9;CM # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW 1DFB..1DFF;CM # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 1E00..1EFF;AL # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP 1F00..1F15;AL # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA @@ -940,7 +946,8 @@ 20BB;PO # Sc NORDIC MARK SIGN 20BC..20BD;PR # Sc [2] MANAT SIGN..RUBLE SIGN 20BE;PO # Sc LARI SIGN -20BF..20CF;PR # Cn [17] <reserved-20BF>..<reserved-20CF> +20BF;PR # Sc BITCOIN SIGN +20C0..20CF;PR # Cn [16] <reserved-20C0>..<reserved-20CF> 20D0..20DC;CM # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 20DD..20E0;CM # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 20E1;CM # Mn COMBINING LEFT RIGHT ARROW ABOVE @@ -1103,7 +1110,7 @@ 23DC..23E1;AL # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET 23E2..23EF;AL # So [14] WHITE TRAPEZIUM..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR 23F0..23F3;ID # So [4] ALARM CLOCK..HOURGLASS WITH FLOWING SAND -23F4..23FE;AL # So [11] BLACK MEDIUM LEFT-POINTING TRIANGLE..POWER SLEEP SYMBOL +23F4..23FF;AL # So [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL 2400..2426;AL # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A;AL # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 2460..249B;AI # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP @@ -1295,7 +1302,7 @@ 2B76..2B95;AL # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW 2B98..2BB9;AL # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX 2BBD..2BC8;AL # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED -2BCA..2BD1;AL # So [8] TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN +2BCA..2BD2;AL # So [9] TOP HALF BLACK CIRCLE..GROUP MARK 2BEC..2BEF;AL # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS 2C00..2C2E;AL # Lu [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE 2C30..2C5E;AL # Ll [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE @@ -1373,7 +1380,7 @@ 2E40;BA # Pd DOUBLE HYPHEN 2E41;BA # Po REVERSED COMMA 2E42;OP # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E44;BA # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK +2E43..2E49;BA # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA 2E80..2E99;ID # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP 2E9B..2EF3;ID # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE 2F00..2FD5;ID # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE @@ -1472,7 +1479,7 @@ 30FC;CJ # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK 30FD..30FE;NS # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK 30FF;ID # Lo KATAKANA DIGRAPH KOTO -3105..312D;ID # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH +3105..312E;ID # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE 3131..318E;ID # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE 3190..3191;ID # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK 3192..3195;ID # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK @@ -1495,8 +1502,8 @@ 3400..4DB5;ID # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 4DB6..4DBF;ID # Cn [10] <reserved-4DB6>..<reserved-4DBF> 4DC0..4DFF;AL # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -4E00..9FD5;ID # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5 -9FD6..9FFF;ID # Cn [42] <reserved-9FD6>..<reserved-9FFF> +4E00..9FEA;ID # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA +9FEB..9FFF;ID # Cn [21] <reserved-9FEB>..<reserved-9FFF> A000..A014;ID # Lo [21] YI SYLLABLE IT..YI SYLLABLE E A015;NS # Lm YI SYLLABLE WU A016..A48C;ID # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR @@ -2640,6 +2647,7 @@ FFFD;AI # So REPLACEMENT CHARACTER 102E1..102FB;AL # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED 10300..1031F;AL # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS 10320..10323;AL # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..1032F;AL # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE 10330..10340;AL # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA 10341;AL # Nl GOTHIC LETTER NINETY 10342..10349;AL # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL @@ -2903,6 +2911,33 @@ FFFD;AI # So REPLACEMENT CHARACTER 118E0..118E9;NU # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE 118EA..118F2;AL # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY 118FF;AL # Lo WARANG CITI OM +11A00;AL # Lo ZANABAZAR SQUARE LETTER A +11A01..11A06;CM # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +11A07..11A08;CM # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU +11A09..11A0A;CM # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32;AL # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38;CM # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39;CM # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A;AL # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E;CM # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F;BB # Po ZANABAZAR SQUARE INITIAL HEAD MARK +11A40;AL # Po ZANABAZAR SQUARE CLOSING HEAD MARK +11A41..11A44;BA # Po [4] ZANABAZAR SQUARE MARK TSHEG..ZANABAZAR SQUARE MARK LONG TSHEG +11A45;BB # Po ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK +11A46;AL # Po ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47;CM # Mn ZANABAZAR SQUARE SUBJOINER +11A50;AL # Lo SOYOMBO LETTER A +11A51..11A56;CM # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58;CM # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B;CM # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A83;AL # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89;AL # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96;CM # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97;CM # Mc SOYOMBO SIGN VISARGA +11A98..11A99;CM # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C;BA # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9E..11AA0;BB # Po [3] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO HEAD MARK WITH MOON AND SUN +11AA1..11AA2;BA # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2 11AC0..11AF8;AL # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL 11C00..11C08;AL # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E;AL # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA @@ -2925,6 +2960,16 @@ FFFD;AI # So REPLACEMENT CHARACTER 11CB2..11CB3;CM # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E 11CB4;CM # Mc MARCHEN VOWEL SIGN O 11CB5..11CB6;CM # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06;AL # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09;AL # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30;AL # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36;CM # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A;CM # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D;CM # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45;CM # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46;AL # Lo MASARAM GONDI REPHA +11D47;CM # Mn MASARAM GONDI RA-KARA +11D50..11D59;NU # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE 12000..12399;AL # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E;AL # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12470..12474;BA # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON @@ -2971,10 +3016,12 @@ FFFD;AI # So REPLACEMENT CHARACTER 16F51..16F7E;CM # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 16F8F..16F92;CM # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW 16F93..16F9F;AL # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 -16FE0;NS # Lm TANGUT ITERATION MARK +16FE0..16FE1;NS # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK 17000..187EC;ID # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC 18800..18AF2;ID # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 -1B000..1B001;ID # Lo [2] KATAKANA LETTER ARCHAIC E..HIRAGANA LETTER ARCHAIC YE +1B000..1B0FF;ID # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 +1B100..1B11E;ID # Lo [31] HENTAIGANA LETTER RE-3..HENTAIGANA LETTER N-MU-MO-2 +1B170..1B2FB;ID # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A;AL # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M 1BC70..1BC7C;AL # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK 1BC80..1BC88;AL # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL @@ -3132,7 +3179,9 @@ FFFD;AI # So REPLACEMENT CHARACTER 1F240..1F248;ID # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F249..1F24F;ID # Cn [7] <reserved-1F249>..<reserved-1F24F> 1F250..1F251;ID # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT -1F252..1F2FF;ID # Cn [174] <reserved-1F252>..<reserved-1F2FF> +1F252..1F25F;ID # Cn [14] <reserved-1F252>..<reserved-1F25F> +1F260..1F265;ID # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F266..1F2FF;ID # Cn [154] <reserved-1F266>..<reserved-1F2FF> 1F300..1F384;ID # So [133] CYCLONE..CHRISTMAS TREE 1F385;EB # So FATHER CHRISTMAS 1F386..1F39B;ID # So [22] FIREWORKS..CONTROL KNOBS @@ -3141,11 +3190,13 @@ FFFD;AI # So REPLACEMENT CHARACTER 1F3B5..1F3B6;AL # So [2] MUSICAL NOTE..MULTIPLE MUSICAL NOTES 1F3B7..1F3BB;ID # So [5] SAXOPHONE..VIOLIN 1F3BC;AL # So MUSICAL SCORE -1F3BD..1F3C2;ID # So [6] RUNNING SHIRT WITH SASH..SNOWBOARDER -1F3C3..1F3C4;EB # So [2] RUNNER..SURFER -1F3C5..1F3C9;ID # So [5] SPORTS MEDAL..RUGBY FOOTBALL -1F3CA..1F3CB;EB # So [2] SWIMMER..WEIGHT LIFTER -1F3CC..1F3FA;ID # So [47] GOLFER..AMPHORA +1F3BD..1F3C1;ID # So [5] RUNNING SHIRT WITH SASH..CHEQUERED FLAG +1F3C2..1F3C4;EB # So [3] SNOWBOARDER..SURFER +1F3C5..1F3C6;ID # So [2] SPORTS MEDAL..TROPHY +1F3C7;EB # So HORSE RACING +1F3C8..1F3C9;ID # So [2] AMERICAN FOOTBALL..RUGBY FOOTBALL +1F3CA..1F3CC;EB # So [3] SWIMMER..GOLFER +1F3CD..1F3FA;ID # So [46] RACING MOTORCYCLE..AMPHORA 1F3FB..1F3FF;EM # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 1F400..1F441;ID # So [66] RAT..EYE 1F442..1F443;EB # So [2] EAR..NOSE @@ -3181,8 +3232,8 @@ FFFD;AI # So REPLACEMENT CHARACTER 1F517..1F524;AL # So [14] LINK SYMBOL..INPUT SYMBOL FOR LATIN LETTERS 1F525..1F531;ID # So [13] FIRE..TRIDENT EMBLEM 1F532..1F549;AL # So [24] BLACK SQUARE BUTTON..OM SYMBOL -1F54A..1F574;ID # So [43] DOVE OF PEACE..MAN IN BUSINESS SUIT LEVITATING -1F575;EB # So SLEUTH OR SPY +1F54A..1F573;ID # So [42] DOVE OF PEACE..HOLE +1F574..1F575;EB # So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY 1F576..1F579;ID # So [4] DARK SUNGLASSES..JOYSTICK 1F57A;EB # So MAN DANCING 1F57B..1F58F;ID # So [21] LEFT HAND TELEPHONE RECEIVER..TURNED OK HAND SIGN @@ -3208,12 +3259,14 @@ FFFD;AI # So REPLACEMENT CHARACTER 1F6B4..1F6B6;EB # So [3] BICYCLIST..PEDESTRIAN 1F6B7..1F6BF;ID # So [9] NO PEDESTRIANS..SHOWER 1F6C0;EB # So BATH -1F6C1..1F6D2;ID # So [18] BATHTUB..SHOPPING TROLLEY -1F6D3..1F6DF;ID # Cn [13] <reserved-1F6D3>..<reserved-1F6DF> +1F6C1..1F6CB;ID # So [11] BATHTUB..COUCH AND LAMP +1F6CC;EB # So SLEEPING ACCOMMODATION +1F6CD..1F6D4;ID # So [8] SHOPPING BAGS..PAGODA +1F6D5..1F6DF;ID # Cn [11] <reserved-1F6D5>..<reserved-1F6DF> 1F6E0..1F6EC;ID # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING 1F6ED..1F6EF;ID # Cn [3] <reserved-1F6ED>..<reserved-1F6EF> -1F6F0..1F6F6;ID # So [7] SATELLITE..CANOE -1F6F7..1F6FF;ID # Cn [9] <reserved-1F6F7>..<reserved-1F6FF> +1F6F0..1F6F8;ID # So [9] SATELLITE..FLYING SAUCER +1F6F9..1F6FF;ID # Cn [7] <reserved-1F6F9>..<reserved-1F6FF> 1F700..1F773;AL # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F774..1F77F;ID # Cn [12] <reserved-1F774>..<reserved-1F77F> 1F780..1F7D4;AL # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR @@ -3227,28 +3280,32 @@ FFFD;AI # So REPLACEMENT CHARACTER 1F860..1F887;AL # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW 1F888..1F88F;ID # Cn [8] <reserved-1F888>..<reserved-1F88F> 1F890..1F8AD;AL # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F8AE..1F90F;ID # Cn [98] <reserved-1F8AE>..<reserved-1F90F> +1F8AE..1F8FF;ID # Cn [82] <reserved-1F8AE>..<reserved-1F8FF> +1F900..1F90B;AL # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F90C..1F90F;ID # Cn [4] <reserved-1F90C>..<reserved-1F90F> 1F910..1F917;ID # So [8] ZIPPER-MOUTH FACE..HUGGING FACE -1F918..1F91E;EB # So [7] SIGN OF THE HORNS..HAND WITH INDEX AND MIDDLE FINGERS CROSSED -1F91F;ID # Cn <reserved-1F91F> +1F918..1F91C;EB # So [5] SIGN OF THE HORNS..RIGHT-FACING FIST +1F91D;ID # So HANDSHAKE +1F91E..1F91F;EB # So [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN 1F920..1F925;ID # So [6] FACE WITH COWBOY HAT..LYING FACE 1F926;EB # So FACE PALM -1F927;ID # So SNEEZING FACE -1F928..1F92F;ID # Cn [8] <reserved-1F928>..<reserved-1F92F> -1F930;EB # So PREGNANT WOMAN -1F931..1F932;ID # Cn [2] <reserved-1F931>..<reserved-1F932> -1F933..1F939;EB # So [7] SELFIE..JUGGLING -1F93A..1F93B;ID # So [2] FENCER..MODERN PENTATHLON -1F93C..1F93E;EB # So [3] WRESTLERS..HANDBALL +1F927..1F92F;ID # So [9] SNEEZING FACE..SHOCKED FACE WITH EXPLODING HEAD +1F930..1F939;EB # So [10] PREGNANT WOMAN..JUGGLING +1F93A..1F93C;ID # So [3] FENCER..WRESTLERS +1F93D..1F93E;EB # So [2] WATER POLO..HANDBALL 1F93F;ID # Cn <reserved-1F93F> -1F940..1F94B;ID # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM -1F94C..1F94F;ID # Cn [4] <reserved-1F94C>..<reserved-1F94F> -1F950..1F95E;ID # So [15] CROISSANT..PANCAKES -1F95F..1F97F;ID # Cn [33] <reserved-1F95F>..<reserved-1F97F> -1F980..1F991;ID # So [18] CRAB..SQUID -1F992..1F9BF;ID # Cn [46] <reserved-1F992>..<reserved-1F9BF> +1F940..1F94C;ID # So [13] WILTED FLOWER..CURLING STONE +1F94D..1F94F;ID # Cn [3] <reserved-1F94D>..<reserved-1F94F> +1F950..1F96B;ID # So [28] CROISSANT..CANNED FOOD +1F96C..1F97F;ID # Cn [20] <reserved-1F96C>..<reserved-1F97F> +1F980..1F997;ID # So [24] CRAB..CRICKET +1F998..1F9BF;ID # Cn [40] <reserved-1F998>..<reserved-1F9BF> 1F9C0;ID # So CHEESE WEDGE -1F9C1..1FFFD;ID # Cn [1597] <reserved-1F9C1>..<reserved-1FFFD> +1F9C1..1F9CF;ID # Cn [15] <reserved-1F9C1>..<reserved-1F9CF> +1F9D0;ID # So FACE WITH MONOCLE +1F9D1..1F9DD;EB # So [13] ADULT..ELF +1F9DE..1F9E6;ID # So [9] GENIE..SOCKS +1F9E7..1FFFD;ID # Cn [1559] <reserved-1F9E7>..<reserved-1FFFD> 20000..2A6D6;ID # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2A6D7..2A6FF;ID # Cn [41] <reserved-2A6D7>..<reserved-2A6FF> 2A700..2B734;ID # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 @@ -3256,7 +3313,9 @@ FFFD;AI # So REPLACEMENT CHARACTER 2B740..2B81D;ID # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B81E..2B81F;ID # Cn [2] <reserved-2B81E>..<reserved-2B81F> 2B820..2CEA1;ID # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 -2CEA2..2F7FF;ID # Cn [10590] <reserved-2CEA2>..<reserved-2F7FF> +2CEA2..2CEAF;ID # Cn [14] <reserved-2CEA2>..<reserved-2CEAF> +2CEB0..2EBE0;ID # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBE1..2F7FF;ID # Cn [3103] <reserved-2EBE1>..<reserved-2F7FF> 2F800..2FA1D;ID # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 2FA1E..2FFFD;ID # Cn [1504] <reserved-2FA1E>..<reserved-2FFFD> 30000..3FFFD;ID # Cn [65534] <reserved-30000>..<reserved-3FFFD> diff --git a/tools-for-build/NormalizationCorrections.txt b/tools-for-build/NormalizationCorrections.txt index 836d29c100..f7fc35e52c 100644 --- a/tools-for-build/NormalizationCorrections.txt +++ b/tools-for-build/NormalizationCorrections.txt @@ -1,6 +1,6 @@ -# NormalizationCorrections-9.0.0.txt -# Date: 2016-01-21, 22:00:00 GMT [KW, LI] -# © 2016 Unicode®, Inc. +# NormalizationCorrections-10.0.0.txt +# Date: 2017-04-13, 01:00:00 GMT [KW, LI] +# © 2017 Unicode®, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database @@ -27,7 +27,7 @@ # # Currently this list has exactly six entries in it, one for the # typo found and corrected in Corrigendum #3, and five for -# the typos and misidentifications found and corrected in +# the typos and misidentifications found and corrected in # Corrigendum #4. All efforts # will be made to keep the entries limited to just those fixes. # @@ -37,7 +37,7 @@ # Field 2: Corrected decomposition # Field 3: Version of Unicode for which the correction was # entered into UnicodeData.txt, in n.n.n format. -# Comment: Indicates the Unicode Corrigendum which documents +# Comment: Indicates the Unicode Corrigendum which documents # the correction # # For more information, see UAX #15, Unicode Normalization Forms. diff --git a/tools-for-build/PropList.txt b/tools-for-build/PropList.txt index a8c0da7135..9a2d0e4b1c 100644 --- a/tools-for-build/PropList.txt +++ b/tools-for-build/PropList.txt @@ -1,6 +1,6 @@ -# PropList-9.0.0.txt -# Date: 2016-06-01, 10:34:30 GMT -# © 2016 Unicode®, Inc. +# PropList-10.0.0.txt +# Date: 2017-03-10, 08:25:30 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -199,6 +199,9 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA 115C9..115D7 ; Terminal_Punctuation # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES 11641..11642 ; Terminal_Punctuation # Po [2] MODI DANDA..MODI DOUBLE DANDA 1173C..1173E ; Terminal_Punctuation # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11A42..11A43 ; Terminal_Punctuation # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD +11A9B..11A9C ; Terminal_Punctuation # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD +11AA1..11AA2 ; Terminal_Punctuation # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2 11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR 11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD 12470..12474 ; Terminal_Punctuation # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON @@ -209,7 +212,7 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA 1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON -# Total code points: 246 +# Total code points: 252 # ================================================ @@ -471,6 +474,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L 0AC9 ; Other_Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O 0ACB..0ACC ; Other_Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU 0AE2..0AE3 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFC ; Other_Alphabetic # Mn [3] GUJARATI SIGN SUKUN..GUJARATI SIGN MADDAH 0B01 ; Other_Alphabetic # Mn ORIYA SIGN CANDRABINDU 0B02..0B03 ; Other_Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA 0B3E ; Other_Alphabetic # Mc ORIYA VOWEL SIGN AA @@ -508,7 +512,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L 0CCC ; Other_Alphabetic # Mn KANNADA VOWEL SIGN AU 0CD5..0CD6 ; Other_Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK 0CE2..0CE3 ; Other_Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0D01 ; Other_Alphabetic # Mn MALAYALAM SIGN CANDRABINDU +0D00..0D01 ; Other_Alphabetic # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; Other_Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D3E..0D40 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II 0D41..0D44 ; Other_Alphabetic # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR @@ -726,6 +730,17 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 11722..11725 ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E 11727..1172A ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM +11A01..11A06 ; Other_Alphabetic # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +11A07..11A08 ; Other_Alphabetic # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU +11A09..11A0A ; Other_Alphabetic # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A35..11A38 ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Other_Alphabetic # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3B..11A3E ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A51..11A56 ; Other_Alphabetic # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Other_Alphabetic # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Other_Alphabetic # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; Other_Alphabetic # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Other_Alphabetic # Mc SOYOMBO SIGN VISARGA 11C2F ; Other_Alphabetic # Mc BHAIKSUKI VOWEL SIGN AA 11C30..11C36 ; Other_Alphabetic # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L 11C38..11C3D ; Other_Alphabetic # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA @@ -737,6 +752,12 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 11CB2..11CB3 ; Other_Alphabetic # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E 11CB4 ; Other_Alphabetic # Mc MARCHEN VOWEL SIGN O 11CB5..11CB6 ; Other_Alphabetic # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; Other_Alphabetic # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Other_Alphabetic # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Other_Alphabetic # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D41 ; Other_Alphabetic # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA +11D43 ; Other_Alphabetic # Mn MASARAM GONDI SIGN CANDRA +11D47 ; Other_Alphabetic # Mn MASARAM GONDI RA-KARA 16B30..16B36 ; Other_Alphabetic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F51..16F7E ; Other_Alphabetic # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 1BC9E ; Other_Alphabetic # Mn DUPLOYAN DOUBLE MARK @@ -750,7 +771,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 1238 +# Total code points: 1300 # ================================================ @@ -759,18 +780,20 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA 3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE 3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY 3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FD5 ; Ideographic # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5 +4E00..9FEA ; Ideographic # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA F900..FA6D ; Ideographic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 17000..187EC ; Ideographic # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC 18800..18AF2 ; Ideographic # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 +1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2A700..2B734 ; Ideographic # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 2B740..2B81D ; Ideographic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Ideographic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 88284 +# Total code points: 96174 # ================================================ @@ -826,12 +849,14 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM 0A4D ; Diacritic # Mn GURMUKHI SIGN VIRAMA 0ABC ; Diacritic # Mn GUJARATI SIGN NUKTA 0ACD ; Diacritic # Mn GUJARATI SIGN VIRAMA +0AFD..0AFF ; Diacritic # Mn [3] GUJARATI SIGN THREE-DOT NUKTA ABOVE..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B3C ; Diacritic # Mn ORIYA SIGN NUKTA 0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA 0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA 0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA 0CBC ; Diacritic # Mn KANNADA SIGN NUKTA 0CCD ; Diacritic # Mn KANNADA SIGN VIRAMA +0D3B..0D3C ; Diacritic # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D4D ; Diacritic # Mn MALAYALAM SIGN VIRAMA 0DCA ; Diacritic # Mn SINHALA SIGN AL-LAKUNA 0E47..0E4C ; Diacritic # Mn [6] THAI CHARACTER MAITAIKHU..THAI CHARACTER THANTHAKHAT @@ -871,10 +896,11 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM 1CE2..1CE8 ; Diacritic # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL 1CED ; Diacritic # Mn VEDIC SIGN TIRYAK 1CF4 ; Diacritic # Mn VEDIC TONE CANDRA ABOVE +1CF7 ; Diacritic # Mc VEDIC SIGN ATIKRAMA 1CF8..1CF9 ; Diacritic # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 1D2C..1D6A ; Diacritic # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI 1DC4..1DCF ; Diacritic # Mn [12] COMBINING MACRON-ACUTE..COMBINING ZIGZAG BELOW -1DF5 ; Diacritic # Mn COMBINING UP TACK ABOVE +1DF5..1DF9 ; Diacritic # Mn [5] COMBINING UP TACK ABOVE..COMBINING WIDE INVERTED BRIDGE BELOW 1DFD..1DFF ; Diacritic # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 1FBD ; Diacritic # Sk GREEK KORONIS 1FBF..1FC1 ; Diacritic # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI @@ -947,7 +973,12 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON 116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA 116B7 ; Diacritic # Mn TAKRI SIGN NUKTA 1172B ; Diacritic # Mn AHOM SIGN KILLER +11A34 ; Diacritic # Mn ZANABAZAR SQUARE SIGN VIRAMA +11A47 ; Diacritic # Mn ZANABAZAR SQUARE SUBJOINER +11A99 ; Diacritic # Mn SOYOMBO SUBJOINER 11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA +11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA +11D44..11D45 ; Diacritic # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA 16AF0..16AF4 ; Diacritic # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW 16F93..16F9F ; Diacritic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 @@ -960,7 +991,7 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON 1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK 1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA -# Total code points: 782 +# Total code points: 798 # ================================================ @@ -989,11 +1020,12 @@ AAF3..AAF4 ; Extender # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETE FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK 1135D ; Extender # Lo GRANTHA SIGN PLUTA 115C6..115C8 ; Extender # Po [3] SIDDHAM REPETITION MARK-1..SIDDHAM REPETITION MARK-3 +11A98 ; Extender # Mn SOYOMBO GEMINATION MARK 16B42..16B43 ; Extender # Lm [2] PAHAWH HMONG SIGN VOS NRUA..PAHAWH HMONG SIGN IB YAM -16FE0 ; Extender # Lm TANGUT ITERATION MARK +16FE0..16FE1 ; Extender # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK 1E944..1E946 ; Extender # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK -# Total code points: 42 +# Total code points: 44 # ================================================ @@ -1105,7 +1137,7 @@ E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG # ================================================ 3400..4DB5 ; Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FD5 ; Unified_Ideograph # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5 +4E00..9FEA ; Unified_Ideograph # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11 FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14 @@ -1117,8 +1149,9 @@ FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..C 2A700..2B734 ; Unified_Ideograph # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 2B740..2B81D ; Unified_Ideograph # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Unified_Ideograph # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 -# Total code points: 80388 +# Total code points: 87882 # ================================================ @@ -1277,6 +1310,8 @@ FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP 115C9..115D7 ; Sentence_Terminal # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES 11641..11642 ; Sentence_Terminal # Po [2] MODI DANDA..MODI DOUBLE DANDA 1173C..1173E ; Sentence_Terminal # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11A42..11A43 ; Sentence_Terminal # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD +11A9B..11A9C ; Sentence_Terminal # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD 11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA 16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA 16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP @@ -1285,7 +1320,7 @@ FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP 1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP -# Total code points: 124 +# Total code points: 128 # ================================================ @@ -1402,9 +1437,7 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S 239B..23B3 ; Pattern_Syntax # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM 23B4..23DB ; Pattern_Syntax # So [40] TOP SQUARE BRACKET..FUSE 23DC..23E1 ; Pattern_Syntax # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23FE ; Pattern_Syntax # So [29] WHITE TRAPEZIUM..POWER SLEEP SYMBOL -23FF ; Pattern_Syntax # Cn <reserved-23FF> -2400..2426 ; Pattern_Syntax # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +23E2..2426 ; Pattern_Syntax # So [69] WHITE TRAPEZIUM..SYMBOL FOR SUBSTITUTE FORM TWO 2427..243F ; Pattern_Syntax # Cn [25] <reserved-2427>..<reserved-243F> 2440..244A ; Pattern_Syntax # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 244B..245F ; Pattern_Syntax # Cn [21] <reserved-244B>..<reserved-245F> @@ -1492,8 +1525,8 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S 2BBA..2BBC ; Pattern_Syntax # Cn [3] <reserved-2BBA>..<reserved-2BBC> 2BBD..2BC8 ; Pattern_Syntax # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED 2BC9 ; Pattern_Syntax # Cn <reserved-2BC9> -2BCA..2BD1 ; Pattern_Syntax # So [8] TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN -2BD2..2BEB ; Pattern_Syntax # Cn [26] <reserved-2BD2>..<reserved-2BEB> +2BCA..2BD2 ; Pattern_Syntax # So [9] TOP HALF BLACK CIRCLE..GROUP MARK +2BD3..2BEB ; Pattern_Syntax # Cn [25] <reserved-2BD3>..<reserved-2BEB> 2BEC..2BEF ; Pattern_Syntax # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS 2BF0..2BFF ; Pattern_Syntax # Cn [16] <reserved-2BF0>..<reserved-2BFF> 2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER @@ -1533,8 +1566,8 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S 2E40 ; Pattern_Syntax # Pd DOUBLE HYPHEN 2E41 ; Pattern_Syntax # Po REVERSED COMMA 2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E44 ; Pattern_Syntax # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK -2E45..2E7F ; Pattern_Syntax # Cn [59] <reserved-2E45>..<reserved-2E7F> +2E43..2E49 ; Pattern_Syntax # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA +2E4A..2E7F ; Pattern_Syntax # Cn [54] <reserved-2E4A>..<reserved-2E7F> 3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK 3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET 3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET @@ -1576,4 +1609,10 @@ FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT # Total code points: 10 +# ================================================ + +1F1E6..1F1FF ; Regional_Indicator # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + +# Total code points: 26 + # EOF diff --git a/tools-for-build/Scripts.txt b/tools-for-build/Scripts.txt index 687994b58e..72319448e9 100644 --- a/tools-for-build/Scripts.txt +++ b/tools-for-build/Scripts.txt @@ -1,6 +1,6 @@ -# Scripts-9.0.0.txt -# Date: 2016-06-01, 10:34:37 GMT -# © 2016 Unicode®, Inc. +# Scripts-10.0.0.txt +# Date: 2017-03-11, 06:40:37 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -93,7 +93,6 @@ 0605 ; Common # Cf ARABIC NUMBER MARK ABOVE 060C ; Common # Po ARABIC COMMA 061B ; Common # Po ARABIC SEMICOLON -061C ; Common # Cf ARABIC LETTER MARK 061F ; Common # Po ARABIC QUESTION MARK 0640 ; Common # Lm ARABIC TATWEEL 06DD ; Common # Cf ARABIC END OF AYAH @@ -112,6 +111,7 @@ 1CEE..1CF1 ; Common # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA 1CF2..1CF3 ; Common # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA 1CF5..1CF6 ; Common # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; Common # Mc VEDIC SIGN ATIKRAMA 2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE 200B ; Common # Cf ZERO WIDTH SPACE 200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK @@ -155,7 +155,7 @@ 208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN 208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS 208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS -20A0..20BE ; Common # Sc [31] EURO-CURRENCY SIGN..LARI SIGN +20A0..20BF ; Common # Sc [32] EURO-CURRENCY SIGN..BITCOIN SIGN 2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT 2102 ; Common # L& DOUBLE-STRUCK CAPITAL C 2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA @@ -225,8 +225,7 @@ 239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM 23B4..23DB ; Common # So [40] TOP SQUARE BRACKET..FUSE 23DC..23E1 ; Common # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23FE ; Common # So [29] WHITE TRAPEZIUM..POWER SLEEP SYMBOL -2400..2426 ; Common # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +23E2..2426 ; Common # So [69] WHITE TRAPEZIUM..SYMBOL FOR SUBSTITUTE FORM TWO 2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH 2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP 249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z @@ -311,7 +310,7 @@ 2B76..2B95 ; Common # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW 2B98..2BB9 ; Common # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX 2BBD..2BC8 ; Common # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED -2BCA..2BD1 ; Common # So [8] TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN +2BCA..2BD2 ; Common # So [9] TOP HALF BLACK CIRCLE..GROUP MARK 2BEC..2BEF ; Common # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS 2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER 2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET @@ -350,7 +349,7 @@ 2E40 ; Common # Pd DOUBLE HYPHEN 2E41 ; Common # Po REVERSED COMMA 2E42 ; Common # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E44 ; Common # Po [2] DASH WITH LEFT UPTURN..DOUBLE SUSPENSION MARK +2E43..2E49 ; Common # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA 2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID 3000 ; Common # Zs IDEOGRAPHIC SPACE 3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK @@ -581,11 +580,12 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR 1F210..1F23B ; Common # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D 1F240..1F248 ; Common # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 1F250..1F251 ; Common # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F260..1F265 ; Common # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI 1F300..1F3FA ; Common # So [251] CYCLONE..AMPHORA 1F3FB..1F3FF ; Common # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F6D2 ; Common # So [723] RAT..SHOPPING TROLLEY +1F400..1F6D4 ; Common # So [725] RAT..PAGODA 1F6E0..1F6EC ; Common # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING -1F6F0..1F6F6 ; Common # So [7] SATELLITE..CANOE +1F6F0..1F6F8 ; Common # So [9] SATELLITE..FLYING SAUCER 1F700..1F773 ; Common # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE 1F780..1F7D4 ; Common # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR 1F800..1F80B ; Common # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -593,18 +593,17 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR 1F850..1F859 ; Common # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW 1F860..1F887 ; Common # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW 1F890..1F8AD ; Common # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910..1F91E ; Common # So [15] ZIPPER-MOUTH FACE..HAND WITH INDEX AND MIDDLE FINGERS CROSSED -1F920..1F927 ; Common # So [8] FACE WITH COWBOY HAT..SNEEZING FACE -1F930 ; Common # So PREGNANT WOMAN -1F933..1F93E ; Common # So [12] SELFIE..HANDBALL -1F940..1F94B ; Common # So [12] WILTED FLOWER..MARTIAL ARTS UNIFORM -1F950..1F95E ; Common # So [15] CROISSANT..PANCAKES -1F980..1F991 ; Common # So [18] CRAB..SQUID +1F900..1F90B ; Common # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F910..1F93E ; Common # So [47] ZIPPER-MOUTH FACE..HANDBALL +1F940..1F94C ; Common # So [13] WILTED FLOWER..CURLING STONE +1F950..1F96B ; Common # So [28] CROISSANT..CANNED FOOD +1F980..1F997 ; Common # So [24] CRAB..CRICKET 1F9C0 ; Common # So CHEESE WEDGE +1F9D0..1F9E6 ; Common # So [23] FACE WITH MONOCLE..SOCKS E0001 ; Common # Cf LANGUAGE TAG E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG -# Total code points: 7279 +# Total code points: 7363 # ================================================ @@ -798,6 +797,7 @@ FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATU 060D ; Arabic # Po ARABIC DATE SEPARATOR 060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA 0610..061A ; Arabic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061C ; Arabic # Cf ARABIC LETTER MARK 061E ; Arabic # Po ARABIC TRIPLE DOT PUNCTUATION MARK 0620..063F ; Arabic # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE 0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH @@ -871,7 +871,7 @@ FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA 1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -# Total code points: 1279 +# Total code points: 1280 # ================================================ @@ -882,8 +882,9 @@ FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA 0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH 0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH 074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0860..086A ; Syriac # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA -# Total code points: 77 +# Total code points: 88 # ================================================ @@ -953,8 +954,10 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM 09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN 09FA ; Bengali # So BENGALI ISSHAR 09FB ; Bengali # Sc BENGALI GANDA MARK +09FC ; Bengali # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; Bengali # Po BENGALI ABBREVIATION SIGN -# Total code points: 93 +# Total code points: 95 # ================================================ @@ -1007,8 +1010,9 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM 0AF0 ; Gujarati # Po GUJARATI ABBREVIATION SIGN 0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN 0AF9 ; Gujarati # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; Gujarati # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE -# Total code points: 85 +# Total code points: 91 # ================================================ @@ -1123,11 +1127,12 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM # ================================================ -0D01 ; Malayalam # Mn MALAYALAM SIGN CANDRABINDU +0D00..0D01 ; Malayalam # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D05..0D0C ; Malayalam # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L 0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI 0D12..0D3A ; Malayalam # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; Malayalam # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D3D ; Malayalam # Lo MALAYALAM SIGN AVAGRAHA 0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II 0D41..0D44 ; Malayalam # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR @@ -1146,7 +1151,7 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM 0D79 ; Malayalam # So MALAYALAM DATE MARK 0D7A..0D7F ; Malayalam # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K -# Total code points: 114 +# Total code points: 117 # ================================================ @@ -1463,10 +1468,10 @@ AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETT 3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE 309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK 309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI -1B001 ; Hiragana # Lo HIRAGANA LETTER ARCHAIC YE +1B001..1B11E ; Hiragana # Lo [286] HIRAGANA LETTER ARCHAIC YE..HENTAIGANA LETTER N-MU-MO-2 1F200 ; Hiragana # So SQUARE HIRAGANA HOKA -# Total code points: 91 +# Total code points: 376 # ================================================ @@ -1485,10 +1490,10 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK # ================================================ 02EA..02EB ; Bopomofo # Sk [2] MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK -3105..312D ; Bopomofo # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH +3105..312E ; Bopomofo # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE 31A0..31BA ; Bopomofo # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY -# Total code points: 70 +# Total code points: 71 # ================================================ @@ -1501,16 +1506,17 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK 3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY 303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK 3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FD5 ; Han # Lo [20950] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FD5 +4E00..9FEA ; Han # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA F900..FA6D ; Han # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 2A700..2B734 ; Han # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 2B740..2B81D ; Han # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Han # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; Han # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 81734 +# Total code points: 89228 # ================================================ @@ -1525,8 +1531,9 @@ A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE 10300..1031F ; Old_Italic # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS 10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..1032F ; Old_Italic # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE -# Total code points: 36 +# Total code points: 39 # ================================================ @@ -1558,7 +1565,7 @@ A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE 1CED ; Inherited # Mn VEDIC SIGN TIRYAK 1CF4 ; Inherited # Mn VEDIC TONE CANDRA ABOVE 1CF8..1CF9 ; Inherited # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1DC0..1DF5 ; Inherited # Mn [54] COMBINING DOTTED GRAVE ACCENT..COMBINING UP TACK ABOVE +1DC0..1DF9 ; Inherited # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW 1DFB..1DFF ; Inherited # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE @@ -1578,7 +1585,7 @@ FE20..FE2D ; Inherited # Mn [14] COMBINING LIGATURE LEFT HALF..COMBINING CON 1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 564 +# Total code points: 568 # ================================================ @@ -2629,4 +2636,58 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI # Total code points: 6881 +# ================================================ + +11D00..11D06 ; Masaram_Gondi # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; Masaram_Gondi # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; Masaram_Gondi # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; Masaram_Gondi # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Masaram_Gondi # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Masaram_Gondi # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; Masaram_Gondi # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; Masaram_Gondi # Lo MASARAM GONDI REPHA +11D47 ; Masaram_Gondi # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; Masaram_Gondi # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE + +# Total code points: 75 + +# ================================================ + +16FE1 ; Nushu # Lm NUSHU ITERATION MARK +1B170..1B2FB ; Nushu # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB + +# Total code points: 397 + +# ================================================ + +11A50 ; Soyombo # Lo SOYOMBO LETTER A +11A51..11A56 ; Soyombo # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Soyombo # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Soyombo # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A83 ; Soyombo # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA +11A86..11A89 ; Soyombo # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; Soyombo # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Soyombo # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; Soyombo # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C ; Soyombo # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9E..11AA2 ; Soyombo # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 + +# Total code points: 80 + +# ================================================ + +11A00 ; Zanabazar_Square # Lo ZANABAZAR SQUARE LETTER A +11A01..11A06 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O +11A07..11A08 ; Zanabazar_Square # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU +11A09..11A0A ; Zanabazar_Square # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; Zanabazar_Square # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Zanabazar_Square # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; Zanabazar_Square # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; Zanabazar_Square # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F..11A46 ; Zanabazar_Square # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47 ; Zanabazar_Square # Mn ZANABAZAR SQUARE SUBJOINER + +# Total code points: 72 + # EOF diff --git a/tools-for-build/SpecialCasing.txt b/tools-for-build/SpecialCasing.txt index b23fa7f768..b9ba0d81c1 100644 --- a/tools-for-build/SpecialCasing.txt +++ b/tools-for-build/SpecialCasing.txt @@ -1,6 +1,6 @@ -# SpecialCasing-9.0.0.txt -# Date: 2016-03-02, 18:55:13 GMT -# © 2016 Unicode®, Inc. +# SpecialCasing-10.0.0.txt +# Date: 2017-04-14, 05:40:43 GMT +# © 2017 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see http://www.unicode.org/terms_of_use.html # @@ -197,7 +197,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH # ================================================================================ # Conditional Mappings -# The remainder of this file provides conditional casing data used to produce +# The remainder of this file provides conditional casing data used to produce # full case mappings. # ================================================================================ # Language-Insensitive Mappings diff --git a/tools-for-build/UnicodeData.txt b/tools-for-build/UnicodeData.txt index a756976461..d89c64f526 100644 --- a/tools-for-build/UnicodeData.txt +++ b/tools-for-build/UnicodeData.txt @@ -2072,6 +2072,17 @@ 085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; 085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; 085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; +0860;SYRIAC LETTER MALAYALAM NGA;Lo;0;AL;;;;;N;;;;; +0861;SYRIAC LETTER MALAYALAM JA;Lo;0;AL;;;;;N;;;;; +0862;SYRIAC LETTER MALAYALAM NYA;Lo;0;AL;;;;;N;;;;; +0863;SYRIAC LETTER MALAYALAM TTA;Lo;0;AL;;;;;N;;;;; +0864;SYRIAC LETTER MALAYALAM NNA;Lo;0;AL;;;;;N;;;;; +0865;SYRIAC LETTER MALAYALAM NNNA;Lo;0;AL;;;;;N;;;;; +0866;SYRIAC LETTER MALAYALAM BHA;Lo;0;AL;;;;;N;;;;; +0867;SYRIAC LETTER MALAYALAM RA;Lo;0;AL;;;;;N;;;;; +0868;SYRIAC LETTER MALAYALAM LLA;Lo;0;AL;;;;;N;;;;; +0869;SYRIAC LETTER MALAYALAM LLLA;Lo;0;AL;;;;;N;;;;; +086A;SYRIAC LETTER MALAYALAM SSA;Lo;0;AL;;;;;N;;;;; 08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; 08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; 08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; @@ -2366,6 +2377,8 @@ 09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; 09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; 09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; +09FC;BENGALI LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +09FD;BENGALI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; 0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; 0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2530,6 +2543,12 @@ 0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; 0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; +0AFA;GUJARATI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; +0AFB;GUJARATI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +0AFC;GUJARATI SIGN MADDAH;Mn;0;NSM;;;;;N;;;;; +0AFD;GUJARATI SIGN THREE-DOT NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFE;GUJARATI SIGN CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFF;GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; 0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2876,6 +2895,7 @@ 0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; 0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +0D00;MALAYALAM SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; 0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2931,6 +2951,8 @@ 0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; 0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; 0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; +0D3B;MALAYALAM SIGN VERTICAL BAR VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D3C;MALAYALAM SIGN CIRCULAR VIRAMA;Mn;9;NSM;;;;;N;;;;; 0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; 0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; 0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; @@ -6413,6 +6435,7 @@ 1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; 1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; 1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +1CF7;VEDIC SIGN ATIKRAMA;Mc;0;L;;;;;N;;;;; 1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; 1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; 1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; @@ -6661,6 +6684,10 @@ 1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; 1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1DF6;COMBINING KAVYKA ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +1DF7;COMBINING KAVYKA ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF8;COMBINING DOT ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF9;COMBINING WIDE INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;;;;; 1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;; 1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; 1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; @@ -7339,6 +7366,7 @@ 20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; 20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; 20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; +20BF;BITCOIN SIGN;Sc;0;ET;;;;;N;;;;; 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; @@ -8135,6 +8163,7 @@ 23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;; 23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;; 23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;; +23FF;OBSERVER EYE SYMBOL;So;0;ON;;;;;N;;;;; 2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; 2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; 2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; @@ -10083,6 +10112,7 @@ 2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; 2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; 2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2BD2;GROUP MARK;So;0;ON;;;;;N;;;;; 2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; @@ -10615,6 +10645,11 @@ 2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; 2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;; 2E44;DOUBLE SUSPENSION MARK;Po;0;ON;;;;;N;;;;; +2E45;INVERTED LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E46;INVERTED LOW KAVYKA WITH KAVYKA ABOVE;Po;0;ON;;;;;N;;;;; +2E47;LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E48;LOW KAVYKA WITH DOT;Po;0;ON;;;;;N;;;;; +2E49;DOUBLE STACKED COMMA;Po;0;ON;;;;;N;;;;; 2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; 2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; 2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; @@ -11250,6 +11285,7 @@ 312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; 312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; 312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; +312E;BOPOMOFO LETTER O WITH DOT ABOVE;Lo;0;L;;;;;N;;;;; 3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;; 3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; 3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; @@ -12016,7 +12052,7 @@ 4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; 4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; 4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; -9FD5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; +9FEA;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; @@ -17093,6 +17129,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; 10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; 10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +1032D;OLD ITALIC LETTER YE;Lo;0;L;;;;;N;;;;; +1032E;OLD ITALIC LETTER NORTHERN TSE;Lo;0;L;;;;;N;;;;; +1032F;OLD ITALIC LETTER SOUTHERN TSE;Lo;0;L;;;;;N;;;;; 10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; 10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; 10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; @@ -20068,6 +20107,158 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; 118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; 118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; +11A00;ZANABAZAR SQUARE LETTER A;Lo;0;L;;;;;N;;;;; +11A01;ZANABAZAR SQUARE VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A02;ZANABAZAR SQUARE VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A03;ZANABAZAR SQUARE VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A04;ZANABAZAR SQUARE VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A05;ZANABAZAR SQUARE VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A06;ZANABAZAR SQUARE VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A07;ZANABAZAR SQUARE VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11A09;ZANABAZAR SQUARE VOWEL SIGN REVERSED I;Mn;0;NSM;;;;;N;;;;; +11A0A;ZANABAZAR SQUARE VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A0B;ZANABAZAR SQUARE LETTER KA;Lo;0;L;;;;;N;;;;; +11A0C;ZANABAZAR SQUARE LETTER KHA;Lo;0;L;;;;;N;;;;; +11A0D;ZANABAZAR SQUARE LETTER GA;Lo;0;L;;;;;N;;;;; +11A0E;ZANABAZAR SQUARE LETTER GHA;Lo;0;L;;;;;N;;;;; +11A0F;ZANABAZAR SQUARE LETTER NGA;Lo;0;L;;;;;N;;;;; +11A10;ZANABAZAR SQUARE LETTER CA;Lo;0;L;;;;;N;;;;; +11A11;ZANABAZAR SQUARE LETTER CHA;Lo;0;L;;;;;N;;;;; +11A12;ZANABAZAR SQUARE LETTER JA;Lo;0;L;;;;;N;;;;; +11A13;ZANABAZAR SQUARE LETTER NYA;Lo;0;L;;;;;N;;;;; +11A14;ZANABAZAR SQUARE LETTER TTA;Lo;0;L;;;;;N;;;;; +11A15;ZANABAZAR SQUARE LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A16;ZANABAZAR SQUARE LETTER DDA;Lo;0;L;;;;;N;;;;; +11A17;ZANABAZAR SQUARE LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A18;ZANABAZAR SQUARE LETTER NNA;Lo;0;L;;;;;N;;;;; +11A19;ZANABAZAR SQUARE LETTER TA;Lo;0;L;;;;;N;;;;; +11A1A;ZANABAZAR SQUARE LETTER THA;Lo;0;L;;;;;N;;;;; +11A1B;ZANABAZAR SQUARE LETTER DA;Lo;0;L;;;;;N;;;;; +11A1C;ZANABAZAR SQUARE LETTER DHA;Lo;0;L;;;;;N;;;;; +11A1D;ZANABAZAR SQUARE LETTER NA;Lo;0;L;;;;;N;;;;; +11A1E;ZANABAZAR SQUARE LETTER PA;Lo;0;L;;;;;N;;;;; +11A1F;ZANABAZAR SQUARE LETTER PHA;Lo;0;L;;;;;N;;;;; +11A20;ZANABAZAR SQUARE LETTER BA;Lo;0;L;;;;;N;;;;; +11A21;ZANABAZAR SQUARE LETTER BHA;Lo;0;L;;;;;N;;;;; +11A22;ZANABAZAR SQUARE LETTER MA;Lo;0;L;;;;;N;;;;; +11A23;ZANABAZAR SQUARE LETTER TSA;Lo;0;L;;;;;N;;;;; +11A24;ZANABAZAR SQUARE LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A25;ZANABAZAR SQUARE LETTER DZA;Lo;0;L;;;;;N;;;;; +11A26;ZANABAZAR SQUARE LETTER DZHA;Lo;0;L;;;;;N;;;;; +11A27;ZANABAZAR SQUARE LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A28;ZANABAZAR SQUARE LETTER ZA;Lo;0;L;;;;;N;;;;; +11A29;ZANABAZAR SQUARE LETTER -A;Lo;0;L;;;;;N;;;;; +11A2A;ZANABAZAR SQUARE LETTER YA;Lo;0;L;;;;;N;;;;; +11A2B;ZANABAZAR SQUARE LETTER RA;Lo;0;L;;;;;N;;;;; +11A2C;ZANABAZAR SQUARE LETTER LA;Lo;0;L;;;;;N;;;;; +11A2D;ZANABAZAR SQUARE LETTER VA;Lo;0;L;;;;;N;;;;; +11A2E;ZANABAZAR SQUARE LETTER SHA;Lo;0;L;;;;;N;;;;; +11A2F;ZANABAZAR SQUARE LETTER SSA;Lo;0;L;;;;;N;;;;; +11A30;ZANABAZAR SQUARE LETTER SA;Lo;0;L;;;;;N;;;;; +11A31;ZANABAZAR SQUARE LETTER HA;Lo;0;L;;;;;N;;;;; +11A32;ZANABAZAR SQUARE LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A33;ZANABAZAR SQUARE FINAL CONSONANT MARK;Mn;0;NSM;;;;;N;;;;; +11A34;ZANABAZAR SQUARE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11A35;ZANABAZAR SQUARE SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11A36;ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A37;ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A38;ZANABAZAR SQUARE SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A39;ZANABAZAR SQUARE SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A3A;ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A3B;ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA;Mn;0;NSM;;;;;N;;;;; +11A3C;ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA;Mn;0;NSM;;;;;N;;;;; +11A3D;ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA;Mn;0;NSM;;;;;N;;;;; +11A3E;ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA;Mn;0;NSM;;;;;N;;;;; +11A3F;ZANABAZAR SQUARE INITIAL HEAD MARK;Po;0;L;;;;;N;;;;; +11A40;ZANABAZAR SQUARE CLOSING HEAD MARK;Po;0;L;;;;;N;;;;; +11A41;ZANABAZAR SQUARE MARK TSHEG;Po;0;L;;;;;N;;;;; +11A42;ZANABAZAR SQUARE MARK SHAD;Po;0;L;;;;;N;;;;; +11A43;ZANABAZAR SQUARE MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A44;ZANABAZAR SQUARE MARK LONG TSHEG;Po;0;L;;;;;N;;;;; +11A45;ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A46;ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A47;ZANABAZAR SQUARE SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A50;SOYOMBO LETTER A;Lo;0;L;;;;;N;;;;; +11A51;SOYOMBO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A52;SOYOMBO VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A53;SOYOMBO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A54;SOYOMBO VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A55;SOYOMBO VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A56;SOYOMBO VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A57;SOYOMBO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11A58;SOYOMBO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11A59;SOYOMBO VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11A5A;SOYOMBO VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11A5B;SOYOMBO VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A5C;SOYOMBO LETTER KA;Lo;0;L;;;;;N;;;;; +11A5D;SOYOMBO LETTER KHA;Lo;0;L;;;;;N;;;;; +11A5E;SOYOMBO LETTER GA;Lo;0;L;;;;;N;;;;; +11A5F;SOYOMBO LETTER GHA;Lo;0;L;;;;;N;;;;; +11A60;SOYOMBO LETTER NGA;Lo;0;L;;;;;N;;;;; +11A61;SOYOMBO LETTER CA;Lo;0;L;;;;;N;;;;; +11A62;SOYOMBO LETTER CHA;Lo;0;L;;;;;N;;;;; +11A63;SOYOMBO LETTER JA;Lo;0;L;;;;;N;;;;; +11A64;SOYOMBO LETTER JHA;Lo;0;L;;;;;N;;;;; +11A65;SOYOMBO LETTER NYA;Lo;0;L;;;;;N;;;;; +11A66;SOYOMBO LETTER TTA;Lo;0;L;;;;;N;;;;; +11A67;SOYOMBO LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A68;SOYOMBO LETTER DDA;Lo;0;L;;;;;N;;;;; +11A69;SOYOMBO LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A6A;SOYOMBO LETTER NNA;Lo;0;L;;;;;N;;;;; +11A6B;SOYOMBO LETTER TA;Lo;0;L;;;;;N;;;;; +11A6C;SOYOMBO LETTER THA;Lo;0;L;;;;;N;;;;; +11A6D;SOYOMBO LETTER DA;Lo;0;L;;;;;N;;;;; +11A6E;SOYOMBO LETTER DHA;Lo;0;L;;;;;N;;;;; +11A6F;SOYOMBO LETTER NA;Lo;0;L;;;;;N;;;;; +11A70;SOYOMBO LETTER PA;Lo;0;L;;;;;N;;;;; +11A71;SOYOMBO LETTER PHA;Lo;0;L;;;;;N;;;;; +11A72;SOYOMBO LETTER BA;Lo;0;L;;;;;N;;;;; +11A73;SOYOMBO LETTER BHA;Lo;0;L;;;;;N;;;;; +11A74;SOYOMBO LETTER MA;Lo;0;L;;;;;N;;;;; +11A75;SOYOMBO LETTER TSA;Lo;0;L;;;;;N;;;;; +11A76;SOYOMBO LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A77;SOYOMBO LETTER DZA;Lo;0;L;;;;;N;;;;; +11A78;SOYOMBO LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A79;SOYOMBO LETTER ZA;Lo;0;L;;;;;N;;;;; +11A7A;SOYOMBO LETTER -A;Lo;0;L;;;;;N;;;;; +11A7B;SOYOMBO LETTER YA;Lo;0;L;;;;;N;;;;; +11A7C;SOYOMBO LETTER RA;Lo;0;L;;;;;N;;;;; +11A7D;SOYOMBO LETTER LA;Lo;0;L;;;;;N;;;;; +11A7E;SOYOMBO LETTER VA;Lo;0;L;;;;;N;;;;; +11A7F;SOYOMBO LETTER SHA;Lo;0;L;;;;;N;;;;; +11A80;SOYOMBO LETTER SSA;Lo;0;L;;;;;N;;;;; +11A81;SOYOMBO LETTER SA;Lo;0;L;;;;;N;;;;; +11A82;SOYOMBO LETTER HA;Lo;0;L;;;;;N;;;;; +11A83;SOYOMBO LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A86;SOYOMBO CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A87;SOYOMBO CLUSTER-INITIAL LETTER LA;Lo;0;L;;;;;N;;;;; +11A88;SOYOMBO CLUSTER-INITIAL LETTER SHA;Lo;0;L;;;;;N;;;;; +11A89;SOYOMBO CLUSTER-INITIAL LETTER SA;Lo;0;L;;;;;N;;;;; +11A8A;SOYOMBO FINAL CONSONANT SIGN G;Mn;0;NSM;;;;;N;;;;; +11A8B;SOYOMBO FINAL CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +11A8C;SOYOMBO FINAL CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +11A8D;SOYOMBO FINAL CONSONANT SIGN D;Mn;0;NSM;;;;;N;;;;; +11A8E;SOYOMBO FINAL CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +11A8F;SOYOMBO FINAL CONSONANT SIGN B;Mn;0;NSM;;;;;N;;;;; +11A90;SOYOMBO FINAL CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +11A91;SOYOMBO FINAL CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +11A92;SOYOMBO FINAL CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +11A93;SOYOMBO FINAL CONSONANT SIGN SH;Mn;0;NSM;;;;;N;;;;; +11A94;SOYOMBO FINAL CONSONANT SIGN S;Mn;0;NSM;;;;;N;;;;; +11A95;SOYOMBO FINAL CONSONANT SIGN -A;Mn;0;NSM;;;;;N;;;;; +11A96;SOYOMBO SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A97;SOYOMBO SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A98;SOYOMBO GEMINATION MARK;Mn;0;NSM;;;;;N;;;;; +11A99;SOYOMBO SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A9A;SOYOMBO MARK TSHEG;Po;0;L;;;;;N;;;;; +11A9B;SOYOMBO MARK SHAD;Po;0;L;;;;;N;;;;; +11A9C;SOYOMBO MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A9E;SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME;Po;0;L;;;;;N;;;;; +11A9F;SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME;Po;0;L;;;;;N;;;;; +11AA0;SOYOMBO HEAD MARK WITH MOON AND SUN;Po;0;L;;;;;N;;;;; +11AA1;SOYOMBO TERMINAL MARK-1;Po;0;L;;;;;N;;;;; +11AA2;SOYOMBO TERMINAL MARK-2;Po;0;L;;;;;N;;;;; 11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; 11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; 11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; @@ -20290,6 +20481,81 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;; 11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; 11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11D00;MASARAM GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D01;MASARAM GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D02;MASARAM GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D03;MASARAM GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D04;MASARAM GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D05;MASARAM GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D06;MASARAM GONDI LETTER E;Lo;0;L;;;;;N;;;;; +11D08;MASARAM GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D09;MASARAM GONDI LETTER O;Lo;0;L;;;;;N;;;;; +11D0B;MASARAM GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D0C;MASARAM GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D0D;MASARAM GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D0E;MASARAM GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D0F;MASARAM GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D10;MASARAM GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D11;MASARAM GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D12;MASARAM GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D13;MASARAM GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D14;MASARAM GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D15;MASARAM GONDI LETTER NYA;Lo;0;L;;;;;N;;;;; +11D16;MASARAM GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D17;MASARAM GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D18;MASARAM GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D19;MASARAM GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D1A;MASARAM GONDI LETTER NNA;Lo;0;L;;;;;N;;;;; +11D1B;MASARAM GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D1C;MASARAM GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D1D;MASARAM GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D1E;MASARAM GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D1F;MASARAM GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D20;MASARAM GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D21;MASARAM GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D22;MASARAM GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D23;MASARAM GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D24;MASARAM GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D25;MASARAM GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D26;MASARAM GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D27;MASARAM GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D28;MASARAM GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D29;MASARAM GONDI LETTER SHA;Lo;0;L;;;;;N;;;;; +11D2A;MASARAM GONDI LETTER SSA;Lo;0;L;;;;;N;;;;; +11D2B;MASARAM GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D2C;MASARAM GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D2D;MASARAM GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D2E;MASARAM GONDI LETTER KSSA;Lo;0;L;;;;;N;;;;; +11D2F;MASARAM GONDI LETTER JNYA;Lo;0;L;;;;;N;;;;; +11D30;MASARAM GONDI LETTER TRA;Lo;0;L;;;;;N;;;;; +11D31;MASARAM GONDI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11D32;MASARAM GONDI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11D33;MASARAM GONDI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11D34;MASARAM GONDI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11D35;MASARAM GONDI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11D36;MASARAM GONDI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11D3A;MASARAM GONDI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11D3C;MASARAM GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D3D;MASARAM GONDI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11D3F;MASARAM GONDI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11D40;MASARAM GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D41;MASARAM GONDI SIGN VISARGA;Mn;0;NSM;;;;;N;;;;; +11D42;MASARAM GONDI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11D43;MASARAM GONDI SIGN CANDRA;Mn;0;NSM;;;;;N;;;;; +11D44;MASARAM GONDI SIGN HALANTA;Mn;9;NSM;;;;;N;;;;; +11D45;MASARAM GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D46;MASARAM GONDI REPHA;Lo;0;L;;;;;N;;;;; +11D47;MASARAM GONDI RA-KARA;Mn;0;NSM;;;;;N;;;;; +11D50;MASARAM GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11D51;MASARAM GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11D52;MASARAM GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11D53;MASARAM GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11D54;MASARAM GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11D55;MASARAM GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11D56;MASARAM GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11D57;MASARAM GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11D58;MASARAM GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11D59;MASARAM GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; 12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; 12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; @@ -24087,6 +24353,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; 16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; 16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;; 17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;; 187EC;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;; 18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;; @@ -24846,6 +25113,687 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 18AF2;TANGUT COMPONENT-755;Lo;0;L;;;;;N;;;;; 1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; 1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1B002;HENTAIGANA LETTER A-1;Lo;0;L;;;;;N;;;;; +1B003;HENTAIGANA LETTER A-2;Lo;0;L;;;;;N;;;;; +1B004;HENTAIGANA LETTER A-3;Lo;0;L;;;;;N;;;;; +1B005;HENTAIGANA LETTER A-WO;Lo;0;L;;;;;N;;;;; +1B006;HENTAIGANA LETTER I-1;Lo;0;L;;;;;N;;;;; +1B007;HENTAIGANA LETTER I-2;Lo;0;L;;;;;N;;;;; +1B008;HENTAIGANA LETTER I-3;Lo;0;L;;;;;N;;;;; +1B009;HENTAIGANA LETTER I-4;Lo;0;L;;;;;N;;;;; +1B00A;HENTAIGANA LETTER U-1;Lo;0;L;;;;;N;;;;; +1B00B;HENTAIGANA LETTER U-2;Lo;0;L;;;;;N;;;;; +1B00C;HENTAIGANA LETTER U-3;Lo;0;L;;;;;N;;;;; +1B00D;HENTAIGANA LETTER U-4;Lo;0;L;;;;;N;;;;; +1B00E;HENTAIGANA LETTER U-5;Lo;0;L;;;;;N;;;;; +1B00F;HENTAIGANA LETTER E-2;Lo;0;L;;;;;N;;;;; +1B010;HENTAIGANA LETTER E-3;Lo;0;L;;;;;N;;;;; +1B011;HENTAIGANA LETTER E-4;Lo;0;L;;;;;N;;;;; +1B012;HENTAIGANA LETTER E-5;Lo;0;L;;;;;N;;;;; +1B013;HENTAIGANA LETTER E-6;Lo;0;L;;;;;N;;;;; +1B014;HENTAIGANA LETTER O-1;Lo;0;L;;;;;N;;;;; +1B015;HENTAIGANA LETTER O-2;Lo;0;L;;;;;N;;;;; +1B016;HENTAIGANA LETTER O-3;Lo;0;L;;;;;N;;;;; +1B017;HENTAIGANA LETTER KA-1;Lo;0;L;;;;;N;;;;; +1B018;HENTAIGANA LETTER KA-2;Lo;0;L;;;;;N;;;;; +1B019;HENTAIGANA LETTER KA-3;Lo;0;L;;;;;N;;;;; +1B01A;HENTAIGANA LETTER KA-4;Lo;0;L;;;;;N;;;;; +1B01B;HENTAIGANA LETTER KA-5;Lo;0;L;;;;;N;;;;; +1B01C;HENTAIGANA LETTER KA-6;Lo;0;L;;;;;N;;;;; +1B01D;HENTAIGANA LETTER KA-7;Lo;0;L;;;;;N;;;;; +1B01E;HENTAIGANA LETTER KA-8;Lo;0;L;;;;;N;;;;; +1B01F;HENTAIGANA LETTER KA-9;Lo;0;L;;;;;N;;;;; +1B020;HENTAIGANA LETTER KA-10;Lo;0;L;;;;;N;;;;; +1B021;HENTAIGANA LETTER KA-11;Lo;0;L;;;;;N;;;;; +1B022;HENTAIGANA LETTER KA-KE;Lo;0;L;;;;;N;;;;; +1B023;HENTAIGANA LETTER KI-1;Lo;0;L;;;;;N;;;;; +1B024;HENTAIGANA LETTER KI-2;Lo;0;L;;;;;N;;;;; +1B025;HENTAIGANA LETTER KI-3;Lo;0;L;;;;;N;;;;; +1B026;HENTAIGANA LETTER KI-4;Lo;0;L;;;;;N;;;;; +1B027;HENTAIGANA LETTER KI-5;Lo;0;L;;;;;N;;;;; +1B028;HENTAIGANA LETTER KI-6;Lo;0;L;;;;;N;;;;; +1B029;HENTAIGANA LETTER KI-7;Lo;0;L;;;;;N;;;;; +1B02A;HENTAIGANA LETTER KI-8;Lo;0;L;;;;;N;;;;; +1B02B;HENTAIGANA LETTER KU-1;Lo;0;L;;;;;N;;;;; +1B02C;HENTAIGANA LETTER KU-2;Lo;0;L;;;;;N;;;;; +1B02D;HENTAIGANA LETTER KU-3;Lo;0;L;;;;;N;;;;; +1B02E;HENTAIGANA LETTER KU-4;Lo;0;L;;;;;N;;;;; +1B02F;HENTAIGANA LETTER KU-5;Lo;0;L;;;;;N;;;;; +1B030;HENTAIGANA LETTER KU-6;Lo;0;L;;;;;N;;;;; +1B031;HENTAIGANA LETTER KU-7;Lo;0;L;;;;;N;;;;; +1B032;HENTAIGANA LETTER KE-1;Lo;0;L;;;;;N;;;;; +1B033;HENTAIGANA LETTER KE-2;Lo;0;L;;;;;N;;;;; +1B034;HENTAIGANA LETTER KE-3;Lo;0;L;;;;;N;;;;; +1B035;HENTAIGANA LETTER KE-4;Lo;0;L;;;;;N;;;;; +1B036;HENTAIGANA LETTER KE-5;Lo;0;L;;;;;N;;;;; +1B037;HENTAIGANA LETTER KE-6;Lo;0;L;;;;;N;;;;; +1B038;HENTAIGANA LETTER KO-1;Lo;0;L;;;;;N;;;;; +1B039;HENTAIGANA LETTER KO-2;Lo;0;L;;;;;N;;;;; +1B03A;HENTAIGANA LETTER KO-3;Lo;0;L;;;;;N;;;;; +1B03B;HENTAIGANA LETTER KO-KI;Lo;0;L;;;;;N;;;;; +1B03C;HENTAIGANA LETTER SA-1;Lo;0;L;;;;;N;;;;; +1B03D;HENTAIGANA LETTER SA-2;Lo;0;L;;;;;N;;;;; +1B03E;HENTAIGANA LETTER SA-3;Lo;0;L;;;;;N;;;;; +1B03F;HENTAIGANA LETTER SA-4;Lo;0;L;;;;;N;;;;; +1B040;HENTAIGANA LETTER SA-5;Lo;0;L;;;;;N;;;;; +1B041;HENTAIGANA LETTER SA-6;Lo;0;L;;;;;N;;;;; +1B042;HENTAIGANA LETTER SA-7;Lo;0;L;;;;;N;;;;; +1B043;HENTAIGANA LETTER SA-8;Lo;0;L;;;;;N;;;;; +1B044;HENTAIGANA LETTER SI-1;Lo;0;L;;;;;N;;;;; +1B045;HENTAIGANA LETTER SI-2;Lo;0;L;;;;;N;;;;; +1B046;HENTAIGANA LETTER SI-3;Lo;0;L;;;;;N;;;;; +1B047;HENTAIGANA LETTER SI-4;Lo;0;L;;;;;N;;;;; +1B048;HENTAIGANA LETTER SI-5;Lo;0;L;;;;;N;;;;; +1B049;HENTAIGANA LETTER SI-6;Lo;0;L;;;;;N;;;;; +1B04A;HENTAIGANA LETTER SU-1;Lo;0;L;;;;;N;;;;; +1B04B;HENTAIGANA LETTER SU-2;Lo;0;L;;;;;N;;;;; +1B04C;HENTAIGANA LETTER SU-3;Lo;0;L;;;;;N;;;;; +1B04D;HENTAIGANA LETTER SU-4;Lo;0;L;;;;;N;;;;; +1B04E;HENTAIGANA LETTER SU-5;Lo;0;L;;;;;N;;;;; +1B04F;HENTAIGANA LETTER SU-6;Lo;0;L;;;;;N;;;;; +1B050;HENTAIGANA LETTER SU-7;Lo;0;L;;;;;N;;;;; +1B051;HENTAIGANA LETTER SU-8;Lo;0;L;;;;;N;;;;; +1B052;HENTAIGANA LETTER SE-1;Lo;0;L;;;;;N;;;;; +1B053;HENTAIGANA LETTER SE-2;Lo;0;L;;;;;N;;;;; +1B054;HENTAIGANA LETTER SE-3;Lo;0;L;;;;;N;;;;; +1B055;HENTAIGANA LETTER SE-4;Lo;0;L;;;;;N;;;;; +1B056;HENTAIGANA LETTER SE-5;Lo;0;L;;;;;N;;;;; +1B057;HENTAIGANA LETTER SO-1;Lo;0;L;;;;;N;;;;; +1B058;HENTAIGANA LETTER SO-2;Lo;0;L;;;;;N;;;;; +1B059;HENTAIGANA LETTER SO-3;Lo;0;L;;;;;N;;;;; +1B05A;HENTAIGANA LETTER SO-4;Lo;0;L;;;;;N;;;;; +1B05B;HENTAIGANA LETTER SO-5;Lo;0;L;;;;;N;;;;; +1B05C;HENTAIGANA LETTER SO-6;Lo;0;L;;;;;N;;;;; +1B05D;HENTAIGANA LETTER SO-7;Lo;0;L;;;;;N;;;;; +1B05E;HENTAIGANA LETTER TA-1;Lo;0;L;;;;;N;;;;; +1B05F;HENTAIGANA LETTER TA-2;Lo;0;L;;;;;N;;;;; +1B060;HENTAIGANA LETTER TA-3;Lo;0;L;;;;;N;;;;; +1B061;HENTAIGANA LETTER TA-4;Lo;0;L;;;;;N;;;;; +1B062;HENTAIGANA LETTER TI-1;Lo;0;L;;;;;N;;;;; +1B063;HENTAIGANA LETTER TI-2;Lo;0;L;;;;;N;;;;; +1B064;HENTAIGANA LETTER TI-3;Lo;0;L;;;;;N;;;;; +1B065;HENTAIGANA LETTER TI-4;Lo;0;L;;;;;N;;;;; +1B066;HENTAIGANA LETTER TI-5;Lo;0;L;;;;;N;;;;; +1B067;HENTAIGANA LETTER TI-6;Lo;0;L;;;;;N;;;;; +1B068;HENTAIGANA LETTER TI-7;Lo;0;L;;;;;N;;;;; +1B069;HENTAIGANA LETTER TU-1;Lo;0;L;;;;;N;;;;; +1B06A;HENTAIGANA LETTER TU-2;Lo;0;L;;;;;N;;;;; +1B06B;HENTAIGANA LETTER TU-3;Lo;0;L;;;;;N;;;;; +1B06C;HENTAIGANA LETTER TU-4;Lo;0;L;;;;;N;;;;; +1B06D;HENTAIGANA LETTER TU-TO;Lo;0;L;;;;;N;;;;; +1B06E;HENTAIGANA LETTER TE-1;Lo;0;L;;;;;N;;;;; +1B06F;HENTAIGANA LETTER TE-2;Lo;0;L;;;;;N;;;;; +1B070;HENTAIGANA LETTER TE-3;Lo;0;L;;;;;N;;;;; +1B071;HENTAIGANA LETTER TE-4;Lo;0;L;;;;;N;;;;; +1B072;HENTAIGANA LETTER TE-5;Lo;0;L;;;;;N;;;;; +1B073;HENTAIGANA LETTER TE-6;Lo;0;L;;;;;N;;;;; +1B074;HENTAIGANA LETTER TE-7;Lo;0;L;;;;;N;;;;; +1B075;HENTAIGANA LETTER TE-8;Lo;0;L;;;;;N;;;;; +1B076;HENTAIGANA LETTER TE-9;Lo;0;L;;;;;N;;;;; +1B077;HENTAIGANA LETTER TO-1;Lo;0;L;;;;;N;;;;; +1B078;HENTAIGANA LETTER TO-2;Lo;0;L;;;;;N;;;;; +1B079;HENTAIGANA LETTER TO-3;Lo;0;L;;;;;N;;;;; +1B07A;HENTAIGANA LETTER TO-4;Lo;0;L;;;;;N;;;;; +1B07B;HENTAIGANA LETTER TO-5;Lo;0;L;;;;;N;;;;; +1B07C;HENTAIGANA LETTER TO-6;Lo;0;L;;;;;N;;;;; +1B07D;HENTAIGANA LETTER TO-RA;Lo;0;L;;;;;N;;;;; +1B07E;HENTAIGANA LETTER NA-1;Lo;0;L;;;;;N;;;;; +1B07F;HENTAIGANA LETTER NA-2;Lo;0;L;;;;;N;;;;; +1B080;HENTAIGANA LETTER NA-3;Lo;0;L;;;;;N;;;;; +1B081;HENTAIGANA LETTER NA-4;Lo;0;L;;;;;N;;;;; +1B082;HENTAIGANA LETTER NA-5;Lo;0;L;;;;;N;;;;; +1B083;HENTAIGANA LETTER NA-6;Lo;0;L;;;;;N;;;;; +1B084;HENTAIGANA LETTER NA-7;Lo;0;L;;;;;N;;;;; +1B085;HENTAIGANA LETTER NA-8;Lo;0;L;;;;;N;;;;; +1B086;HENTAIGANA LETTER NA-9;Lo;0;L;;;;;N;;;;; +1B087;HENTAIGANA LETTER NI-1;Lo;0;L;;;;;N;;;;; +1B088;HENTAIGANA LETTER NI-2;Lo;0;L;;;;;N;;;;; +1B089;HENTAIGANA LETTER NI-3;Lo;0;L;;;;;N;;;;; +1B08A;HENTAIGANA LETTER NI-4;Lo;0;L;;;;;N;;;;; +1B08B;HENTAIGANA LETTER NI-5;Lo;0;L;;;;;N;;;;; +1B08C;HENTAIGANA LETTER NI-6;Lo;0;L;;;;;N;;;;; +1B08D;HENTAIGANA LETTER NI-7;Lo;0;L;;;;;N;;;;; +1B08E;HENTAIGANA LETTER NI-TE;Lo;0;L;;;;;N;;;;; +1B08F;HENTAIGANA LETTER NU-1;Lo;0;L;;;;;N;;;;; +1B090;HENTAIGANA LETTER NU-2;Lo;0;L;;;;;N;;;;; +1B091;HENTAIGANA LETTER NU-3;Lo;0;L;;;;;N;;;;; +1B092;HENTAIGANA LETTER NE-1;Lo;0;L;;;;;N;;;;; +1B093;HENTAIGANA LETTER NE-2;Lo;0;L;;;;;N;;;;; +1B094;HENTAIGANA LETTER NE-3;Lo;0;L;;;;;N;;;;; +1B095;HENTAIGANA LETTER NE-4;Lo;0;L;;;;;N;;;;; +1B096;HENTAIGANA LETTER NE-5;Lo;0;L;;;;;N;;;;; +1B097;HENTAIGANA LETTER NE-6;Lo;0;L;;;;;N;;;;; +1B098;HENTAIGANA LETTER NE-KO;Lo;0;L;;;;;N;;;;; +1B099;HENTAIGANA LETTER NO-1;Lo;0;L;;;;;N;;;;; +1B09A;HENTAIGANA LETTER NO-2;Lo;0;L;;;;;N;;;;; +1B09B;HENTAIGANA LETTER NO-3;Lo;0;L;;;;;N;;;;; +1B09C;HENTAIGANA LETTER NO-4;Lo;0;L;;;;;N;;;;; +1B09D;HENTAIGANA LETTER NO-5;Lo;0;L;;;;;N;;;;; +1B09E;HENTAIGANA LETTER HA-1;Lo;0;L;;;;;N;;;;; +1B09F;HENTAIGANA LETTER HA-2;Lo;0;L;;;;;N;;;;; +1B0A0;HENTAIGANA LETTER HA-3;Lo;0;L;;;;;N;;;;; +1B0A1;HENTAIGANA LETTER HA-4;Lo;0;L;;;;;N;;;;; +1B0A2;HENTAIGANA LETTER HA-5;Lo;0;L;;;;;N;;;;; +1B0A3;HENTAIGANA LETTER HA-6;Lo;0;L;;;;;N;;;;; +1B0A4;HENTAIGANA LETTER HA-7;Lo;0;L;;;;;N;;;;; +1B0A5;HENTAIGANA LETTER HA-8;Lo;0;L;;;;;N;;;;; +1B0A6;HENTAIGANA LETTER HA-9;Lo;0;L;;;;;N;;;;; +1B0A7;HENTAIGANA LETTER HA-10;Lo;0;L;;;;;N;;;;; +1B0A8;HENTAIGANA LETTER HA-11;Lo;0;L;;;;;N;;;;; +1B0A9;HENTAIGANA LETTER HI-1;Lo;0;L;;;;;N;;;;; +1B0AA;HENTAIGANA LETTER HI-2;Lo;0;L;;;;;N;;;;; +1B0AB;HENTAIGANA LETTER HI-3;Lo;0;L;;;;;N;;;;; +1B0AC;HENTAIGANA LETTER HI-4;Lo;0;L;;;;;N;;;;; +1B0AD;HENTAIGANA LETTER HI-5;Lo;0;L;;;;;N;;;;; +1B0AE;HENTAIGANA LETTER HI-6;Lo;0;L;;;;;N;;;;; +1B0AF;HENTAIGANA LETTER HI-7;Lo;0;L;;;;;N;;;;; +1B0B0;HENTAIGANA LETTER HU-1;Lo;0;L;;;;;N;;;;; +1B0B1;HENTAIGANA LETTER HU-2;Lo;0;L;;;;;N;;;;; +1B0B2;HENTAIGANA LETTER HU-3;Lo;0;L;;;;;N;;;;; +1B0B3;HENTAIGANA LETTER HE-1;Lo;0;L;;;;;N;;;;; +1B0B4;HENTAIGANA LETTER HE-2;Lo;0;L;;;;;N;;;;; +1B0B5;HENTAIGANA LETTER HE-3;Lo;0;L;;;;;N;;;;; +1B0B6;HENTAIGANA LETTER HE-4;Lo;0;L;;;;;N;;;;; +1B0B7;HENTAIGANA LETTER HE-5;Lo;0;L;;;;;N;;;;; +1B0B8;HENTAIGANA LETTER HE-6;Lo;0;L;;;;;N;;;;; +1B0B9;HENTAIGANA LETTER HE-7;Lo;0;L;;;;;N;;;;; +1B0BA;HENTAIGANA LETTER HO-1;Lo;0;L;;;;;N;;;;; +1B0BB;HENTAIGANA LETTER HO-2;Lo;0;L;;;;;N;;;;; +1B0BC;HENTAIGANA LETTER HO-3;Lo;0;L;;;;;N;;;;; +1B0BD;HENTAIGANA LETTER HO-4;Lo;0;L;;;;;N;;;;; +1B0BE;HENTAIGANA LETTER HO-5;Lo;0;L;;;;;N;;;;; +1B0BF;HENTAIGANA LETTER HO-6;Lo;0;L;;;;;N;;;;; +1B0C0;HENTAIGANA LETTER HO-7;Lo;0;L;;;;;N;;;;; +1B0C1;HENTAIGANA LETTER HO-8;Lo;0;L;;;;;N;;;;; +1B0C2;HENTAIGANA LETTER MA-1;Lo;0;L;;;;;N;;;;; +1B0C3;HENTAIGANA LETTER MA-2;Lo;0;L;;;;;N;;;;; +1B0C4;HENTAIGANA LETTER MA-3;Lo;0;L;;;;;N;;;;; +1B0C5;HENTAIGANA LETTER MA-4;Lo;0;L;;;;;N;;;;; +1B0C6;HENTAIGANA LETTER MA-5;Lo;0;L;;;;;N;;;;; +1B0C7;HENTAIGANA LETTER MA-6;Lo;0;L;;;;;N;;;;; +1B0C8;HENTAIGANA LETTER MA-7;Lo;0;L;;;;;N;;;;; +1B0C9;HENTAIGANA LETTER MI-1;Lo;0;L;;;;;N;;;;; +1B0CA;HENTAIGANA LETTER MI-2;Lo;0;L;;;;;N;;;;; +1B0CB;HENTAIGANA LETTER MI-3;Lo;0;L;;;;;N;;;;; +1B0CC;HENTAIGANA LETTER MI-4;Lo;0;L;;;;;N;;;;; +1B0CD;HENTAIGANA LETTER MI-5;Lo;0;L;;;;;N;;;;; +1B0CE;HENTAIGANA LETTER MI-6;Lo;0;L;;;;;N;;;;; +1B0CF;HENTAIGANA LETTER MI-7;Lo;0;L;;;;;N;;;;; +1B0D0;HENTAIGANA LETTER MU-1;Lo;0;L;;;;;N;;;;; +1B0D1;HENTAIGANA LETTER MU-2;Lo;0;L;;;;;N;;;;; +1B0D2;HENTAIGANA LETTER MU-3;Lo;0;L;;;;;N;;;;; +1B0D3;HENTAIGANA LETTER MU-4;Lo;0;L;;;;;N;;;;; +1B0D4;HENTAIGANA LETTER ME-1;Lo;0;L;;;;;N;;;;; +1B0D5;HENTAIGANA LETTER ME-2;Lo;0;L;;;;;N;;;;; +1B0D6;HENTAIGANA LETTER ME-MA;Lo;0;L;;;;;N;;;;; +1B0D7;HENTAIGANA LETTER MO-1;Lo;0;L;;;;;N;;;;; +1B0D8;HENTAIGANA LETTER MO-2;Lo;0;L;;;;;N;;;;; +1B0D9;HENTAIGANA LETTER MO-3;Lo;0;L;;;;;N;;;;; +1B0DA;HENTAIGANA LETTER MO-4;Lo;0;L;;;;;N;;;;; +1B0DB;HENTAIGANA LETTER MO-5;Lo;0;L;;;;;N;;;;; +1B0DC;HENTAIGANA LETTER MO-6;Lo;0;L;;;;;N;;;;; +1B0DD;HENTAIGANA LETTER YA-1;Lo;0;L;;;;;N;;;;; +1B0DE;HENTAIGANA LETTER YA-2;Lo;0;L;;;;;N;;;;; +1B0DF;HENTAIGANA LETTER YA-3;Lo;0;L;;;;;N;;;;; +1B0E0;HENTAIGANA LETTER YA-4;Lo;0;L;;;;;N;;;;; +1B0E1;HENTAIGANA LETTER YA-5;Lo;0;L;;;;;N;;;;; +1B0E2;HENTAIGANA LETTER YA-YO;Lo;0;L;;;;;N;;;;; +1B0E3;HENTAIGANA LETTER YU-1;Lo;0;L;;;;;N;;;;; +1B0E4;HENTAIGANA LETTER YU-2;Lo;0;L;;;;;N;;;;; +1B0E5;HENTAIGANA LETTER YU-3;Lo;0;L;;;;;N;;;;; +1B0E6;HENTAIGANA LETTER YU-4;Lo;0;L;;;;;N;;;;; +1B0E7;HENTAIGANA LETTER YO-1;Lo;0;L;;;;;N;;;;; +1B0E8;HENTAIGANA LETTER YO-2;Lo;0;L;;;;;N;;;;; +1B0E9;HENTAIGANA LETTER YO-3;Lo;0;L;;;;;N;;;;; +1B0EA;HENTAIGANA LETTER YO-4;Lo;0;L;;;;;N;;;;; +1B0EB;HENTAIGANA LETTER YO-5;Lo;0;L;;;;;N;;;;; +1B0EC;HENTAIGANA LETTER YO-6;Lo;0;L;;;;;N;;;;; +1B0ED;HENTAIGANA LETTER RA-1;Lo;0;L;;;;;N;;;;; +1B0EE;HENTAIGANA LETTER RA-2;Lo;0;L;;;;;N;;;;; +1B0EF;HENTAIGANA LETTER RA-3;Lo;0;L;;;;;N;;;;; +1B0F0;HENTAIGANA LETTER RA-4;Lo;0;L;;;;;N;;;;; +1B0F1;HENTAIGANA LETTER RI-1;Lo;0;L;;;;;N;;;;; +1B0F2;HENTAIGANA LETTER RI-2;Lo;0;L;;;;;N;;;;; +1B0F3;HENTAIGANA LETTER RI-3;Lo;0;L;;;;;N;;;;; +1B0F4;HENTAIGANA LETTER RI-4;Lo;0;L;;;;;N;;;;; +1B0F5;HENTAIGANA LETTER RI-5;Lo;0;L;;;;;N;;;;; +1B0F6;HENTAIGANA LETTER RI-6;Lo;0;L;;;;;N;;;;; +1B0F7;HENTAIGANA LETTER RI-7;Lo;0;L;;;;;N;;;;; +1B0F8;HENTAIGANA LETTER RU-1;Lo;0;L;;;;;N;;;;; +1B0F9;HENTAIGANA LETTER RU-2;Lo;0;L;;;;;N;;;;; +1B0FA;HENTAIGANA LETTER RU-3;Lo;0;L;;;;;N;;;;; +1B0FB;HENTAIGANA LETTER RU-4;Lo;0;L;;;;;N;;;;; +1B0FC;HENTAIGANA LETTER RU-5;Lo;0;L;;;;;N;;;;; +1B0FD;HENTAIGANA LETTER RU-6;Lo;0;L;;;;;N;;;;; +1B0FE;HENTAIGANA LETTER RE-1;Lo;0;L;;;;;N;;;;; +1B0FF;HENTAIGANA LETTER RE-2;Lo;0;L;;;;;N;;;;; +1B100;HENTAIGANA LETTER RE-3;Lo;0;L;;;;;N;;;;; +1B101;HENTAIGANA LETTER RE-4;Lo;0;L;;;;;N;;;;; +1B102;HENTAIGANA LETTER RO-1;Lo;0;L;;;;;N;;;;; +1B103;HENTAIGANA LETTER RO-2;Lo;0;L;;;;;N;;;;; +1B104;HENTAIGANA LETTER RO-3;Lo;0;L;;;;;N;;;;; +1B105;HENTAIGANA LETTER RO-4;Lo;0;L;;;;;N;;;;; +1B106;HENTAIGANA LETTER RO-5;Lo;0;L;;;;;N;;;;; +1B107;HENTAIGANA LETTER RO-6;Lo;0;L;;;;;N;;;;; +1B108;HENTAIGANA LETTER WA-1;Lo;0;L;;;;;N;;;;; +1B109;HENTAIGANA LETTER WA-2;Lo;0;L;;;;;N;;;;; +1B10A;HENTAIGANA LETTER WA-3;Lo;0;L;;;;;N;;;;; +1B10B;HENTAIGANA LETTER WA-4;Lo;0;L;;;;;N;;;;; +1B10C;HENTAIGANA LETTER WA-5;Lo;0;L;;;;;N;;;;; +1B10D;HENTAIGANA LETTER WI-1;Lo;0;L;;;;;N;;;;; +1B10E;HENTAIGANA LETTER WI-2;Lo;0;L;;;;;N;;;;; +1B10F;HENTAIGANA LETTER WI-3;Lo;0;L;;;;;N;;;;; +1B110;HENTAIGANA LETTER WI-4;Lo;0;L;;;;;N;;;;; +1B111;HENTAIGANA LETTER WI-5;Lo;0;L;;;;;N;;;;; +1B112;HENTAIGANA LETTER WE-1;Lo;0;L;;;;;N;;;;; +1B113;HENTAIGANA LETTER WE-2;Lo;0;L;;;;;N;;;;; +1B114;HENTAIGANA LETTER WE-3;Lo;0;L;;;;;N;;;;; +1B115;HENTAIGANA LETTER WE-4;Lo;0;L;;;;;N;;;;; +1B116;HENTAIGANA LETTER WO-1;Lo;0;L;;;;;N;;;;; +1B117;HENTAIGANA LETTER WO-2;Lo;0;L;;;;;N;;;;; +1B118;HENTAIGANA LETTER WO-3;Lo;0;L;;;;;N;;;;; +1B119;HENTAIGANA LETTER WO-4;Lo;0;L;;;;;N;;;;; +1B11A;HENTAIGANA LETTER WO-5;Lo;0;L;;;;;N;;;;; +1B11B;HENTAIGANA LETTER WO-6;Lo;0;L;;;;;N;;;;; +1B11C;HENTAIGANA LETTER WO-7;Lo;0;L;;;;;N;;;;; +1B11D;HENTAIGANA LETTER N-MU-MO-1;Lo;0;L;;;;;N;;;;; +1B11E;HENTAIGANA LETTER N-MU-MO-2;Lo;0;L;;;;;N;;;;; +1B170;NUSHU CHARACTER-1B170;Lo;0;L;;;;;N;;;;; +1B171;NUSHU CHARACTER-1B171;Lo;0;L;;;;;N;;;;; +1B172;NUSHU CHARACTER-1B172;Lo;0;L;;;;;N;;;;; +1B173;NUSHU CHARACTER-1B173;Lo;0;L;;;;;N;;;;; +1B174;NUSHU CHARACTER-1B174;Lo;0;L;;;;;N;;;;; +1B175;NUSHU CHARACTER-1B175;Lo;0;L;;;;;N;;;;; +1B176;NUSHU CHARACTER-1B176;Lo;0;L;;;;;N;;;;; +1B177;NUSHU CHARACTER-1B177;Lo;0;L;;;;;N;;;;; +1B178;NUSHU CHARACTER-1B178;Lo;0;L;;;;;N;;;;; +1B179;NUSHU CHARACTER-1B179;Lo;0;L;;;;;N;;;;; +1B17A;NUSHU CHARACTER-1B17A;Lo;0;L;;;;;N;;;;; +1B17B;NUSHU CHARACTER-1B17B;Lo;0;L;;;;;N;;;;; +1B17C;NUSHU CHARACTER-1B17C;Lo;0;L;;;;;N;;;;; +1B17D;NUSHU CHARACTER-1B17D;Lo;0;L;;;;;N;;;;; +1B17E;NUSHU CHARACTER-1B17E;Lo;0;L;;;;;N;;;;; +1B17F;NUSHU CHARACTER-1B17F;Lo;0;L;;;;;N;;;;; +1B180;NUSHU CHARACTER-1B180;Lo;0;L;;;;;N;;;;; +1B181;NUSHU CHARACTER-1B181;Lo;0;L;;;;;N;;;;; +1B182;NUSHU CHARACTER-1B182;Lo;0;L;;;;;N;;;;; +1B183;NUSHU CHARACTER-1B183;Lo;0;L;;;;;N;;;;; +1B184;NUSHU CHARACTER-1B184;Lo;0;L;;;;;N;;;;; +1B185;NUSHU CHARACTER-1B185;Lo;0;L;;;;;N;;;;; +1B186;NUSHU CHARACTER-1B186;Lo;0;L;;;;;N;;;;; +1B187;NUSHU CHARACTER-1B187;Lo;0;L;;;;;N;;;;; +1B188;NUSHU CHARACTER-1B188;Lo;0;L;;;;;N;;;;; +1B189;NUSHU CHARACTER-1B189;Lo;0;L;;;;;N;;;;; +1B18A;NUSHU CHARACTER-1B18A;Lo;0;L;;;;;N;;;;; +1B18B;NUSHU CHARACTER-1B18B;Lo;0;L;;;;;N;;;;; +1B18C;NUSHU CHARACTER-1B18C;Lo;0;L;;;;;N;;;;; +1B18D;NUSHU CHARACTER-1B18D;Lo;0;L;;;;;N;;;;; +1B18E;NUSHU CHARACTER-1B18E;Lo;0;L;;;;;N;;;;; +1B18F;NUSHU CHARACTER-1B18F;Lo;0;L;;;;;N;;;;; +1B190;NUSHU CHARACTER-1B190;Lo;0;L;;;;;N;;;;; +1B191;NUSHU CHARACTER-1B191;Lo;0;L;;;;;N;;;;; +1B192;NUSHU CHARACTER-1B192;Lo;0;L;;;;;N;;;;; +1B193;NUSHU CHARACTER-1B193;Lo;0;L;;;;;N;;;;; +1B194;NUSHU CHARACTER-1B194;Lo;0;L;;;;;N;;;;; +1B195;NUSHU CHARACTER-1B195;Lo;0;L;;;;;N;;;;; +1B196;NUSHU CHARACTER-1B196;Lo;0;L;;;;;N;;;;; +1B197;NUSHU CHARACTER-1B197;Lo;0;L;;;;;N;;;;; +1B198;NUSHU CHARACTER-1B198;Lo;0;L;;;;;N;;;;; +1B199;NUSHU CHARACTER-1B199;Lo;0;L;;;;;N;;;;; +1B19A;NUSHU CHARACTER-1B19A;Lo;0;L;;;;;N;;;;; +1B19B;NUSHU CHARACTER-1B19B;Lo;0;L;;;;;N;;;;; +1B19C;NUSHU CHARACTER-1B19C;Lo;0;L;;;;;N;;;;; +1B19D;NUSHU CHARACTER-1B19D;Lo;0;L;;;;;N;;;;; +1B19E;NUSHU CHARACTER-1B19E;Lo;0;L;;;;;N;;;;; +1B19F;NUSHU CHARACTER-1B19F;Lo;0;L;;;;;N;;;;; +1B1A0;NUSHU CHARACTER-1B1A0;Lo;0;L;;;;;N;;;;; +1B1A1;NUSHU CHARACTER-1B1A1;Lo;0;L;;;;;N;;;;; +1B1A2;NUSHU CHARACTER-1B1A2;Lo;0;L;;;;;N;;;;; +1B1A3;NUSHU CHARACTER-1B1A3;Lo;0;L;;;;;N;;;;; +1B1A4;NUSHU CHARACTER-1B1A4;Lo;0;L;;;;;N;;;;; +1B1A5;NUSHU CHARACTER-1B1A5;Lo;0;L;;;;;N;;;;; +1B1A6;NUSHU CHARACTER-1B1A6;Lo;0;L;;;;;N;;;;; +1B1A7;NUSHU CHARACTER-1B1A7;Lo;0;L;;;;;N;;;;; +1B1A8;NUSHU CHARACTER-1B1A8;Lo;0;L;;;;;N;;;;; +1B1A9;NUSHU CHARACTER-1B1A9;Lo;0;L;;;;;N;;;;; +1B1AA;NUSHU CHARACTER-1B1AA;Lo;0;L;;;;;N;;;;; +1B1AB;NUSHU CHARACTER-1B1AB;Lo;0;L;;;;;N;;;;; +1B1AC;NUSHU CHARACTER-1B1AC;Lo;0;L;;;;;N;;;;; +1B1AD;NUSHU CHARACTER-1B1AD;Lo;0;L;;;;;N;;;;; +1B1AE;NUSHU CHARACTER-1B1AE;Lo;0;L;;;;;N;;;;; +1B1AF;NUSHU CHARACTER-1B1AF;Lo;0;L;;;;;N;;;;; +1B1B0;NUSHU CHARACTER-1B1B0;Lo;0;L;;;;;N;;;;; +1B1B1;NUSHU CHARACTER-1B1B1;Lo;0;L;;;;;N;;;;; +1B1B2;NUSHU CHARACTER-1B1B2;Lo;0;L;;;;;N;;;;; +1B1B3;NUSHU CHARACTER-1B1B3;Lo;0;L;;;;;N;;;;; +1B1B4;NUSHU CHARACTER-1B1B4;Lo;0;L;;;;;N;;;;; +1B1B5;NUSHU CHARACTER-1B1B5;Lo;0;L;;;;;N;;;;; +1B1B6;NUSHU CHARACTER-1B1B6;Lo;0;L;;;;;N;;;;; +1B1B7;NUSHU CHARACTER-1B1B7;Lo;0;L;;;;;N;;;;; +1B1B8;NUSHU CHARACTER-1B1B8;Lo;0;L;;;;;N;;;;; +1B1B9;NUSHU CHARACTER-1B1B9;Lo;0;L;;;;;N;;;;; +1B1BA;NUSHU CHARACTER-1B1BA;Lo;0;L;;;;;N;;;;; +1B1BB;NUSHU CHARACTER-1B1BB;Lo;0;L;;;;;N;;;;; +1B1BC;NUSHU CHARACTER-1B1BC;Lo;0;L;;;;;N;;;;; +1B1BD;NUSHU CHARACTER-1B1BD;Lo;0;L;;;;;N;;;;; +1B1BE;NUSHU CHARACTER-1B1BE;Lo;0;L;;;;;N;;;;; +1B1BF;NUSHU CHARACTER-1B1BF;Lo;0;L;;;;;N;;;;; +1B1C0;NUSHU CHARACTER-1B1C0;Lo;0;L;;;;;N;;;;; +1B1C1;NUSHU CHARACTER-1B1C1;Lo;0;L;;;;;N;;;;; +1B1C2;NUSHU CHARACTER-1B1C2;Lo;0;L;;;;;N;;;;; +1B1C3;NUSHU CHARACTER-1B1C3;Lo;0;L;;;;;N;;;;; +1B1C4;NUSHU CHARACTER-1B1C4;Lo;0;L;;;;;N;;;;; +1B1C5;NUSHU CHARACTER-1B1C5;Lo;0;L;;;;;N;;;;; +1B1C6;NUSHU CHARACTER-1B1C6;Lo;0;L;;;;;N;;;;; +1B1C7;NUSHU CHARACTER-1B1C7;Lo;0;L;;;;;N;;;;; +1B1C8;NUSHU CHARACTER-1B1C8;Lo;0;L;;;;;N;;;;; +1B1C9;NUSHU CHARACTER-1B1C9;Lo;0;L;;;;;N;;;;; +1B1CA;NUSHU CHARACTER-1B1CA;Lo;0;L;;;;;N;;;;; +1B1CB;NUSHU CHARACTER-1B1CB;Lo;0;L;;;;;N;;;;; +1B1CC;NUSHU CHARACTER-1B1CC;Lo;0;L;;;;;N;;;;; +1B1CD;NUSHU CHARACTER-1B1CD;Lo;0;L;;;;;N;;;;; +1B1CE;NUSHU CHARACTER-1B1CE;Lo;0;L;;;;;N;;;;; +1B1CF;NUSHU CHARACTER-1B1CF;Lo;0;L;;;;;N;;;;; +1B1D0;NUSHU CHARACTER-1B1D0;Lo;0;L;;;;;N;;;;; +1B1D1;NUSHU CHARACTER-1B1D1;Lo;0;L;;;;;N;;;;; +1B1D2;NUSHU CHARACTER-1B1D2;Lo;0;L;;;;;N;;;;; +1B1D3;NUSHU CHARACTER-1B1D3;Lo;0;L;;;;;N;;;;; +1B1D4;NUSHU CHARACTER-1B1D4;Lo;0;L;;;;;N;;;;; +1B1D5;NUSHU CHARACTER-1B1D5;Lo;0;L;;;;;N;;;;; +1B1D6;NUSHU CHARACTER-1B1D6;Lo;0;L;;;;;N;;;;; +1B1D7;NUSHU CHARACTER-1B1D7;Lo;0;L;;;;;N;;;;; +1B1D8;NUSHU CHARACTER-1B1D8;Lo;0;L;;;;;N;;;;; +1B1D9;NUSHU CHARACTER-1B1D9;Lo;0;L;;;;;N;;;;; +1B1DA;NUSHU CHARACTER-1B1DA;Lo;0;L;;;;;N;;;;; +1B1DB;NUSHU CHARACTER-1B1DB;Lo;0;L;;;;;N;;;;; +1B1DC;NUSHU CHARACTER-1B1DC;Lo;0;L;;;;;N;;;;; +1B1DD;NUSHU CHARACTER-1B1DD;Lo;0;L;;;;;N;;;;; +1B1DE;NUSHU CHARACTER-1B1DE;Lo;0;L;;;;;N;;;;; +1B1DF;NUSHU CHARACTER-1B1DF;Lo;0;L;;;;;N;;;;; +1B1E0;NUSHU CHARACTER-1B1E0;Lo;0;L;;;;;N;;;;; +1B1E1;NUSHU CHARACTER-1B1E1;Lo;0;L;;;;;N;;;;; +1B1E2;NUSHU CHARACTER-1B1E2;Lo;0;L;;;;;N;;;;; +1B1E3;NUSHU CHARACTER-1B1E3;Lo;0;L;;;;;N;;;;; +1B1E4;NUSHU CHARACTER-1B1E4;Lo;0;L;;;;;N;;;;; +1B1E5;NUSHU CHARACTER-1B1E5;Lo;0;L;;;;;N;;;;; +1B1E6;NUSHU CHARACTER-1B1E6;Lo;0;L;;;;;N;;;;; +1B1E7;NUSHU CHARACTER-1B1E7;Lo;0;L;;;;;N;;;;; +1B1E8;NUSHU CHARACTER-1B1E8;Lo;0;L;;;;;N;;;;; +1B1E9;NUSHU CHARACTER-1B1E9;Lo;0;L;;;;;N;;;;; +1B1EA;NUSHU CHARACTER-1B1EA;Lo;0;L;;;;;N;;;;; +1B1EB;NUSHU CHARACTER-1B1EB;Lo;0;L;;;;;N;;;;; +1B1EC;NUSHU CHARACTER-1B1EC;Lo;0;L;;;;;N;;;;; +1B1ED;NUSHU CHARACTER-1B1ED;Lo;0;L;;;;;N;;;;; +1B1EE;NUSHU CHARACTER-1B1EE;Lo;0;L;;;;;N;;;;; +1B1EF;NUSHU CHARACTER-1B1EF;Lo;0;L;;;;;N;;;;; +1B1F0;NUSHU CHARACTER-1B1F0;Lo;0;L;;;;;N;;;;; +1B1F1;NUSHU CHARACTER-1B1F1;Lo;0;L;;;;;N;;;;; +1B1F2;NUSHU CHARACTER-1B1F2;Lo;0;L;;;;;N;;;;; +1B1F3;NUSHU CHARACTER-1B1F3;Lo;0;L;;;;;N;;;;; +1B1F4;NUSHU CHARACTER-1B1F4;Lo;0;L;;;;;N;;;;; +1B1F5;NUSHU CHARACTER-1B1F5;Lo;0;L;;;;;N;;;;; +1B1F6;NUSHU CHARACTER-1B1F6;Lo;0;L;;;;;N;;;;; +1B1F7;NUSHU CHARACTER-1B1F7;Lo;0;L;;;;;N;;;;; +1B1F8;NUSHU CHARACTER-1B1F8;Lo;0;L;;;;;N;;;;; +1B1F9;NUSHU CHARACTER-1B1F9;Lo;0;L;;;;;N;;;;; +1B1FA;NUSHU CHARACTER-1B1FA;Lo;0;L;;;;;N;;;;; +1B1FB;NUSHU CHARACTER-1B1FB;Lo;0;L;;;;;N;;;;; +1B1FC;NUSHU CHARACTER-1B1FC;Lo;0;L;;;;;N;;;;; +1B1FD;NUSHU CHARACTER-1B1FD;Lo;0;L;;;;;N;;;;; +1B1FE;NUSHU CHARACTER-1B1FE;Lo;0;L;;;;;N;;;;; +1B1FF;NUSHU CHARACTER-1B1FF;Lo;0;L;;;;;N;;;;; +1B200;NUSHU CHARACTER-1B200;Lo;0;L;;;;;N;;;;; +1B201;NUSHU CHARACTER-1B201;Lo;0;L;;;;;N;;;;; +1B202;NUSHU CHARACTER-1B202;Lo;0;L;;;;;N;;;;; +1B203;NUSHU CHARACTER-1B203;Lo;0;L;;;;;N;;;;; +1B204;NUSHU CHARACTER-1B204;Lo;0;L;;;;;N;;;;; +1B205;NUSHU CHARACTER-1B205;Lo;0;L;;;;;N;;;;; +1B206;NUSHU CHARACTER-1B206;Lo;0;L;;;;;N;;;;; +1B207;NUSHU CHARACTER-1B207;Lo;0;L;;;;;N;;;;; +1B208;NUSHU CHARACTER-1B208;Lo;0;L;;;;;N;;;;; +1B209;NUSHU CHARACTER-1B209;Lo;0;L;;;;;N;;;;; +1B20A;NUSHU CHARACTER-1B20A;Lo;0;L;;;;;N;;;;; +1B20B;NUSHU CHARACTER-1B20B;Lo;0;L;;;;;N;;;;; +1B20C;NUSHU CHARACTER-1B20C;Lo;0;L;;;;;N;;;;; +1B20D;NUSHU CHARACTER-1B20D;Lo;0;L;;;;;N;;;;; +1B20E;NUSHU CHARACTER-1B20E;Lo;0;L;;;;;N;;;;; +1B20F;NUSHU CHARACTER-1B20F;Lo;0;L;;;;;N;;;;; +1B210;NUSHU CHARACTER-1B210;Lo;0;L;;;;;N;;;;; +1B211;NUSHU CHARACTER-1B211;Lo;0;L;;;;;N;;;;; +1B212;NUSHU CHARACTER-1B212;Lo;0;L;;;;;N;;;;; +1B213;NUSHU CHARACTER-1B213;Lo;0;L;;;;;N;;;;; +1B214;NUSHU CHARACTER-1B214;Lo;0;L;;;;;N;;;;; +1B215;NUSHU CHARACTER-1B215;Lo;0;L;;;;;N;;;;; +1B216;NUSHU CHARACTER-1B216;Lo;0;L;;;;;N;;;;; +1B217;NUSHU CHARACTER-1B217;Lo;0;L;;;;;N;;;;; +1B218;NUSHU CHARACTER-1B218;Lo;0;L;;;;;N;;;;; +1B219;NUSHU CHARACTER-1B219;Lo;0;L;;;;;N;;;;; +1B21A;NUSHU CHARACTER-1B21A;Lo;0;L;;;;;N;;;;; +1B21B;NUSHU CHARACTER-1B21B;Lo;0;L;;;;;N;;;;; +1B21C;NUSHU CHARACTER-1B21C;Lo;0;L;;;;;N;;;;; +1B21D;NUSHU CHARACTER-1B21D;Lo;0;L;;;;;N;;;;; +1B21E;NUSHU CHARACTER-1B21E;Lo;0;L;;;;;N;;;;; +1B21F;NUSHU CHARACTER-1B21F;Lo;0;L;;;;;N;;;;; +1B220;NUSHU CHARACTER-1B220;Lo;0;L;;;;;N;;;;; +1B221;NUSHU CHARACTER-1B221;Lo;0;L;;;;;N;;;;; +1B222;NUSHU CHARACTER-1B222;Lo;0;L;;;;;N;;;;; +1B223;NUSHU CHARACTER-1B223;Lo;0;L;;;;;N;;;;; +1B224;NUSHU CHARACTER-1B224;Lo;0;L;;;;;N;;;;; +1B225;NUSHU CHARACTER-1B225;Lo;0;L;;;;;N;;;;; +1B226;NUSHU CHARACTER-1B226;Lo;0;L;;;;;N;;;;; +1B227;NUSHU CHARACTER-1B227;Lo;0;L;;;;;N;;;;; +1B228;NUSHU CHARACTER-1B228;Lo;0;L;;;;;N;;;;; +1B229;NUSHU CHARACTER-1B229;Lo;0;L;;;;;N;;;;; +1B22A;NUSHU CHARACTER-1B22A;Lo;0;L;;;;;N;;;;; +1B22B;NUSHU CHARACTER-1B22B;Lo;0;L;;;;;N;;;;; +1B22C;NUSHU CHARACTER-1B22C;Lo;0;L;;;;;N;;;;; +1B22D;NUSHU CHARACTER-1B22D;Lo;0;L;;;;;N;;;;; +1B22E;NUSHU CHARACTER-1B22E;Lo;0;L;;;;;N;;;;; +1B22F;NUSHU CHARACTER-1B22F;Lo;0;L;;;;;N;;;;; +1B230;NUSHU CHARACTER-1B230;Lo;0;L;;;;;N;;;;; +1B231;NUSHU CHARACTER-1B231;Lo;0;L;;;;;N;;;;; +1B232;NUSHU CHARACTER-1B232;Lo;0;L;;;;;N;;;;; +1B233;NUSHU CHARACTER-1B233;Lo;0;L;;;;;N;;;;; +1B234;NUSHU CHARACTER-1B234;Lo;0;L;;;;;N;;;;; +1B235;NUSHU CHARACTER-1B235;Lo;0;L;;;;;N;;;;; +1B236;NUSHU CHARACTER-1B236;Lo;0;L;;;;;N;;;;; +1B237;NUSHU CHARACTER-1B237;Lo;0;L;;;;;N;;;;; +1B238;NUSHU CHARACTER-1B238;Lo;0;L;;;;;N;;;;; +1B239;NUSHU CHARACTER-1B239;Lo;0;L;;;;;N;;;;; +1B23A;NUSHU CHARACTER-1B23A;Lo;0;L;;;;;N;;;;; +1B23B;NUSHU CHARACTER-1B23B;Lo;0;L;;;;;N;;;;; +1B23C;NUSHU CHARACTER-1B23C;Lo;0;L;;;;;N;;;;; +1B23D;NUSHU CHARACTER-1B23D;Lo;0;L;;;;;N;;;;; +1B23E;NUSHU CHARACTER-1B23E;Lo;0;L;;;;;N;;;;; +1B23F;NUSHU CHARACTER-1B23F;Lo;0;L;;;;;N;;;;; +1B240;NUSHU CHARACTER-1B240;Lo;0;L;;;;;N;;;;; +1B241;NUSHU CHARACTER-1B241;Lo;0;L;;;;;N;;;;; +1B242;NUSHU CHARACTER-1B242;Lo;0;L;;;;;N;;;;; +1B243;NUSHU CHARACTER-1B243;Lo;0;L;;;;;N;;;;; +1B244;NUSHU CHARACTER-1B244;Lo;0;L;;;;;N;;;;; +1B245;NUSHU CHARACTER-1B245;Lo;0;L;;;;;N;;;;; +1B246;NUSHU CHARACTER-1B246;Lo;0;L;;;;;N;;;;; +1B247;NUSHU CHARACTER-1B247;Lo;0;L;;;;;N;;;;; +1B248;NUSHU CHARACTER-1B248;Lo;0;L;;;;;N;;;;; +1B249;NUSHU CHARACTER-1B249;Lo;0;L;;;;;N;;;;; +1B24A;NUSHU CHARACTER-1B24A;Lo;0;L;;;;;N;;;;; +1B24B;NUSHU CHARACTER-1B24B;Lo;0;L;;;;;N;;;;; +1B24C;NUSHU CHARACTER-1B24C;Lo;0;L;;;;;N;;;;; +1B24D;NUSHU CHARACTER-1B24D;Lo;0;L;;;;;N;;;;; +1B24E;NUSHU CHARACTER-1B24E;Lo;0;L;;;;;N;;;;; +1B24F;NUSHU CHARACTER-1B24F;Lo;0;L;;;;;N;;;;; +1B250;NUSHU CHARACTER-1B250;Lo;0;L;;;;;N;;;;; +1B251;NUSHU CHARACTER-1B251;Lo;0;L;;;;;N;;;;; +1B252;NUSHU CHARACTER-1B252;Lo;0;L;;;;;N;;;;; +1B253;NUSHU CHARACTER-1B253;Lo;0;L;;;;;N;;;;; +1B254;NUSHU CHARACTER-1B254;Lo;0;L;;;;;N;;;;; +1B255;NUSHU CHARACTER-1B255;Lo;0;L;;;;;N;;;;; +1B256;NUSHU CHARACTER-1B256;Lo;0;L;;;;;N;;;;; +1B257;NUSHU CHARACTER-1B257;Lo;0;L;;;;;N;;;;; +1B258;NUSHU CHARACTER-1B258;Lo;0;L;;;;;N;;;;; +1B259;NUSHU CHARACTER-1B259;Lo;0;L;;;;;N;;;;; +1B25A;NUSHU CHARACTER-1B25A;Lo;0;L;;;;;N;;;;; +1B25B;NUSHU CHARACTER-1B25B;Lo;0;L;;;;;N;;;;; +1B25C;NUSHU CHARACTER-1B25C;Lo;0;L;;;;;N;;;;; +1B25D;NUSHU CHARACTER-1B25D;Lo;0;L;;;;;N;;;;; +1B25E;NUSHU CHARACTER-1B25E;Lo;0;L;;;;;N;;;;; +1B25F;NUSHU CHARACTER-1B25F;Lo;0;L;;;;;N;;;;; +1B260;NUSHU CHARACTER-1B260;Lo;0;L;;;;;N;;;;; +1B261;NUSHU CHARACTER-1B261;Lo;0;L;;;;;N;;;;; +1B262;NUSHU CHARACTER-1B262;Lo;0;L;;;;;N;;;;; +1B263;NUSHU CHARACTER-1B263;Lo;0;L;;;;;N;;;;; +1B264;NUSHU CHARACTER-1B264;Lo;0;L;;;;;N;;;;; +1B265;NUSHU CHARACTER-1B265;Lo;0;L;;;;;N;;;;; +1B266;NUSHU CHARACTER-1B266;Lo;0;L;;;;;N;;;;; +1B267;NUSHU CHARACTER-1B267;Lo;0;L;;;;;N;;;;; +1B268;NUSHU CHARACTER-1B268;Lo;0;L;;;;;N;;;;; +1B269;NUSHU CHARACTER-1B269;Lo;0;L;;;;;N;;;;; +1B26A;NUSHU CHARACTER-1B26A;Lo;0;L;;;;;N;;;;; +1B26B;NUSHU CHARACTER-1B26B;Lo;0;L;;;;;N;;;;; +1B26C;NUSHU CHARACTER-1B26C;Lo;0;L;;;;;N;;;;; +1B26D;NUSHU CHARACTER-1B26D;Lo;0;L;;;;;N;;;;; +1B26E;NUSHU CHARACTER-1B26E;Lo;0;L;;;;;N;;;;; +1B26F;NUSHU CHARACTER-1B26F;Lo;0;L;;;;;N;;;;; +1B270;NUSHU CHARACTER-1B270;Lo;0;L;;;;;N;;;;; +1B271;NUSHU CHARACTER-1B271;Lo;0;L;;;;;N;;;;; +1B272;NUSHU CHARACTER-1B272;Lo;0;L;;;;;N;;;;; +1B273;NUSHU CHARACTER-1B273;Lo;0;L;;;;;N;;;;; +1B274;NUSHU CHARACTER-1B274;Lo;0;L;;;;;N;;;;; +1B275;NUSHU CHARACTER-1B275;Lo;0;L;;;;;N;;;;; +1B276;NUSHU CHARACTER-1B276;Lo;0;L;;;;;N;;;;; +1B277;NUSHU CHARACTER-1B277;Lo;0;L;;;;;N;;;;; +1B278;NUSHU CHARACTER-1B278;Lo;0;L;;;;;N;;;;; +1B279;NUSHU CHARACTER-1B279;Lo;0;L;;;;;N;;;;; +1B27A;NUSHU CHARACTER-1B27A;Lo;0;L;;;;;N;;;;; +1B27B;NUSHU CHARACTER-1B27B;Lo;0;L;;;;;N;;;;; +1B27C;NUSHU CHARACTER-1B27C;Lo;0;L;;;;;N;;;;; +1B27D;NUSHU CHARACTER-1B27D;Lo;0;L;;;;;N;;;;; +1B27E;NUSHU CHARACTER-1B27E;Lo;0;L;;;;;N;;;;; +1B27F;NUSHU CHARACTER-1B27F;Lo;0;L;;;;;N;;;;; +1B280;NUSHU CHARACTER-1B280;Lo;0;L;;;;;N;;;;; +1B281;NUSHU CHARACTER-1B281;Lo;0;L;;;;;N;;;;; +1B282;NUSHU CHARACTER-1B282;Lo;0;L;;;;;N;;;;; +1B283;NUSHU CHARACTER-1B283;Lo;0;L;;;;;N;;;;; +1B284;NUSHU CHARACTER-1B284;Lo;0;L;;;;;N;;;;; +1B285;NUSHU CHARACTER-1B285;Lo;0;L;;;;;N;;;;; +1B286;NUSHU CHARACTER-1B286;Lo;0;L;;;;;N;;;;; +1B287;NUSHU CHARACTER-1B287;Lo;0;L;;;;;N;;;;; +1B288;NUSHU CHARACTER-1B288;Lo;0;L;;;;;N;;;;; +1B289;NUSHU CHARACTER-1B289;Lo;0;L;;;;;N;;;;; +1B28A;NUSHU CHARACTER-1B28A;Lo;0;L;;;;;N;;;;; +1B28B;NUSHU CHARACTER-1B28B;Lo;0;L;;;;;N;;;;; +1B28C;NUSHU CHARACTER-1B28C;Lo;0;L;;;;;N;;;;; +1B28D;NUSHU CHARACTER-1B28D;Lo;0;L;;;;;N;;;;; +1B28E;NUSHU CHARACTER-1B28E;Lo;0;L;;;;;N;;;;; +1B28F;NUSHU CHARACTER-1B28F;Lo;0;L;;;;;N;;;;; +1B290;NUSHU CHARACTER-1B290;Lo;0;L;;;;;N;;;;; +1B291;NUSHU CHARACTER-1B291;Lo;0;L;;;;;N;;;;; +1B292;NUSHU CHARACTER-1B292;Lo;0;L;;;;;N;;;;; +1B293;NUSHU CHARACTER-1B293;Lo;0;L;;;;;N;;;;; +1B294;NUSHU CHARACTER-1B294;Lo;0;L;;;;;N;;;;; +1B295;NUSHU CHARACTER-1B295;Lo;0;L;;;;;N;;;;; +1B296;NUSHU CHARACTER-1B296;Lo;0;L;;;;;N;;;;; +1B297;NUSHU CHARACTER-1B297;Lo;0;L;;;;;N;;;;; +1B298;NUSHU CHARACTER-1B298;Lo;0;L;;;;;N;;;;; +1B299;NUSHU CHARACTER-1B299;Lo;0;L;;;;;N;;;;; +1B29A;NUSHU CHARACTER-1B29A;Lo;0;L;;;;;N;;;;; +1B29B;NUSHU CHARACTER-1B29B;Lo;0;L;;;;;N;;;;; +1B29C;NUSHU CHARACTER-1B29C;Lo;0;L;;;;;N;;;;; +1B29D;NUSHU CHARACTER-1B29D;Lo;0;L;;;;;N;;;;; +1B29E;NUSHU CHARACTER-1B29E;Lo;0;L;;;;;N;;;;; +1B29F;NUSHU CHARACTER-1B29F;Lo;0;L;;;;;N;;;;; +1B2A0;NUSHU CHARACTER-1B2A0;Lo;0;L;;;;;N;;;;; +1B2A1;NUSHU CHARACTER-1B2A1;Lo;0;L;;;;;N;;;;; +1B2A2;NUSHU CHARACTER-1B2A2;Lo;0;L;;;;;N;;;;; +1B2A3;NUSHU CHARACTER-1B2A3;Lo;0;L;;;;;N;;;;; +1B2A4;NUSHU CHARACTER-1B2A4;Lo;0;L;;;;;N;;;;; +1B2A5;NUSHU CHARACTER-1B2A5;Lo;0;L;;;;;N;;;;; +1B2A6;NUSHU CHARACTER-1B2A6;Lo;0;L;;;;;N;;;;; +1B2A7;NUSHU CHARACTER-1B2A7;Lo;0;L;;;;;N;;;;; +1B2A8;NUSHU CHARACTER-1B2A8;Lo;0;L;;;;;N;;;;; +1B2A9;NUSHU CHARACTER-1B2A9;Lo;0;L;;;;;N;;;;; +1B2AA;NUSHU CHARACTER-1B2AA;Lo;0;L;;;;;N;;;;; +1B2AB;NUSHU CHARACTER-1B2AB;Lo;0;L;;;;;N;;;;; +1B2AC;NUSHU CHARACTER-1B2AC;Lo;0;L;;;;;N;;;;; +1B2AD;NUSHU CHARACTER-1B2AD;Lo;0;L;;;;;N;;;;; +1B2AE;NUSHU CHARACTER-1B2AE;Lo;0;L;;;;;N;;;;; +1B2AF;NUSHU CHARACTER-1B2AF;Lo;0;L;;;;;N;;;;; +1B2B0;NUSHU CHARACTER-1B2B0;Lo;0;L;;;;;N;;;;; +1B2B1;NUSHU CHARACTER-1B2B1;Lo;0;L;;;;;N;;;;; +1B2B2;NUSHU CHARACTER-1B2B2;Lo;0;L;;;;;N;;;;; +1B2B3;NUSHU CHARACTER-1B2B3;Lo;0;L;;;;;N;;;;; +1B2B4;NUSHU CHARACTER-1B2B4;Lo;0;L;;;;;N;;;;; +1B2B5;NUSHU CHARACTER-1B2B5;Lo;0;L;;;;;N;;;;; +1B2B6;NUSHU CHARACTER-1B2B6;Lo;0;L;;;;;N;;;;; +1B2B7;NUSHU CHARACTER-1B2B7;Lo;0;L;;;;;N;;;;; +1B2B8;NUSHU CHARACTER-1B2B8;Lo;0;L;;;;;N;;;;; +1B2B9;NUSHU CHARACTER-1B2B9;Lo;0;L;;;;;N;;;;; +1B2BA;NUSHU CHARACTER-1B2BA;Lo;0;L;;;;;N;;;;; +1B2BB;NUSHU CHARACTER-1B2BB;Lo;0;L;;;;;N;;;;; +1B2BC;NUSHU CHARACTER-1B2BC;Lo;0;L;;;;;N;;;;; +1B2BD;NUSHU CHARACTER-1B2BD;Lo;0;L;;;;;N;;;;; +1B2BE;NUSHU CHARACTER-1B2BE;Lo;0;L;;;;;N;;;;; +1B2BF;NUSHU CHARACTER-1B2BF;Lo;0;L;;;;;N;;;;; +1B2C0;NUSHU CHARACTER-1B2C0;Lo;0;L;;;;;N;;;;; +1B2C1;NUSHU CHARACTER-1B2C1;Lo;0;L;;;;;N;;;;; +1B2C2;NUSHU CHARACTER-1B2C2;Lo;0;L;;;;;N;;;;; +1B2C3;NUSHU CHARACTER-1B2C3;Lo;0;L;;;;;N;;;;; +1B2C4;NUSHU CHARACTER-1B2C4;Lo;0;L;;;;;N;;;;; +1B2C5;NUSHU CHARACTER-1B2C5;Lo;0;L;;;;;N;;;;; +1B2C6;NUSHU CHARACTER-1B2C6;Lo;0;L;;;;;N;;;;; +1B2C7;NUSHU CHARACTER-1B2C7;Lo;0;L;;;;;N;;;;; +1B2C8;NUSHU CHARACTER-1B2C8;Lo;0;L;;;;;N;;;;; +1B2C9;NUSHU CHARACTER-1B2C9;Lo;0;L;;;;;N;;;;; +1B2CA;NUSHU CHARACTER-1B2CA;Lo;0;L;;;;;N;;;;; +1B2CB;NUSHU CHARACTER-1B2CB;Lo;0;L;;;;;N;;;;; +1B2CC;NUSHU CHARACTER-1B2CC;Lo;0;L;;;;;N;;;;; +1B2CD;NUSHU CHARACTER-1B2CD;Lo;0;L;;;;;N;;;;; +1B2CE;NUSHU CHARACTER-1B2CE;Lo;0;L;;;;;N;;;;; +1B2CF;NUSHU CHARACTER-1B2CF;Lo;0;L;;;;;N;;;;; +1B2D0;NUSHU CHARACTER-1B2D0;Lo;0;L;;;;;N;;;;; +1B2D1;NUSHU CHARACTER-1B2D1;Lo;0;L;;;;;N;;;;; +1B2D2;NUSHU CHARACTER-1B2D2;Lo;0;L;;;;;N;;;;; +1B2D3;NUSHU CHARACTER-1B2D3;Lo;0;L;;;;;N;;;;; +1B2D4;NUSHU CHARACTER-1B2D4;Lo;0;L;;;;;N;;;;; +1B2D5;NUSHU CHARACTER-1B2D5;Lo;0;L;;;;;N;;;;; +1B2D6;NUSHU CHARACTER-1B2D6;Lo;0;L;;;;;N;;;;; +1B2D7;NUSHU CHARACTER-1B2D7;Lo;0;L;;;;;N;;;;; +1B2D8;NUSHU CHARACTER-1B2D8;Lo;0;L;;;;;N;;;;; +1B2D9;NUSHU CHARACTER-1B2D9;Lo;0;L;;;;;N;;;;; +1B2DA;NUSHU CHARACTER-1B2DA;Lo;0;L;;;;;N;;;;; +1B2DB;NUSHU CHARACTER-1B2DB;Lo;0;L;;;;;N;;;;; +1B2DC;NUSHU CHARACTER-1B2DC;Lo;0;L;;;;;N;;;;; +1B2DD;NUSHU CHARACTER-1B2DD;Lo;0;L;;;;;N;;;;; +1B2DE;NUSHU CHARACTER-1B2DE;Lo;0;L;;;;;N;;;;; +1B2DF;NUSHU CHARACTER-1B2DF;Lo;0;L;;;;;N;;;;; +1B2E0;NUSHU CHARACTER-1B2E0;Lo;0;L;;;;;N;;;;; +1B2E1;NUSHU CHARACTER-1B2E1;Lo;0;L;;;;;N;;;;; +1B2E2;NUSHU CHARACTER-1B2E2;Lo;0;L;;;;;N;;;;; +1B2E3;NUSHU CHARACTER-1B2E3;Lo;0;L;;;;;N;;;;; +1B2E4;NUSHU CHARACTER-1B2E4;Lo;0;L;;;;;N;;;;; +1B2E5;NUSHU CHARACTER-1B2E5;Lo;0;L;;;;;N;;;;; +1B2E6;NUSHU CHARACTER-1B2E6;Lo;0;L;;;;;N;;;;; +1B2E7;NUSHU CHARACTER-1B2E7;Lo;0;L;;;;;N;;;;; +1B2E8;NUSHU CHARACTER-1B2E8;Lo;0;L;;;;;N;;;;; +1B2E9;NUSHU CHARACTER-1B2E9;Lo;0;L;;;;;N;;;;; +1B2EA;NUSHU CHARACTER-1B2EA;Lo;0;L;;;;;N;;;;; +1B2EB;NUSHU CHARACTER-1B2EB;Lo;0;L;;;;;N;;;;; +1B2EC;NUSHU CHARACTER-1B2EC;Lo;0;L;;;;;N;;;;; +1B2ED;NUSHU CHARACTER-1B2ED;Lo;0;L;;;;;N;;;;; +1B2EE;NUSHU CHARACTER-1B2EE;Lo;0;L;;;;;N;;;;; +1B2EF;NUSHU CHARACTER-1B2EF;Lo;0;L;;;;;N;;;;; +1B2F0;NUSHU CHARACTER-1B2F0;Lo;0;L;;;;;N;;;;; +1B2F1;NUSHU CHARACTER-1B2F1;Lo;0;L;;;;;N;;;;; +1B2F2;NUSHU CHARACTER-1B2F2;Lo;0;L;;;;;N;;;;; +1B2F3;NUSHU CHARACTER-1B2F3;Lo;0;L;;;;;N;;;;; +1B2F4;NUSHU CHARACTER-1B2F4;Lo;0;L;;;;;N;;;;; +1B2F5;NUSHU CHARACTER-1B2F5;Lo;0;L;;;;;N;;;;; +1B2F6;NUSHU CHARACTER-1B2F6;Lo;0;L;;;;;N;;;;; +1B2F7;NUSHU CHARACTER-1B2F7;Lo;0;L;;;;;N;;;;; +1B2F8;NUSHU CHARACTER-1B2F8;Lo;0;L;;;;;N;;;;; +1B2F9;NUSHU CHARACTER-1B2F9;Lo;0;L;;;;;N;;;;; +1B2FA;NUSHU CHARACTER-1B2FA;Lo;0;L;;;;;N;;;;; +1B2FB;NUSHU CHARACTER-1B2FB;Lo;0;L;;;;;N;;;;; 1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; 1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; 1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; @@ -28269,6 +29217,12 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L;<compat> 3014 6557 3015;;;;N;;;;; 1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L;<circle> 5F97;;;;N;;;;; 1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L;<circle> 53EF;;;;N;;;;; +1F260;ROUNDED SYMBOL FOR FU;So;0;ON;;;;;N;;;;; +1F261;ROUNDED SYMBOL FOR LU;So;0;ON;;;;;N;;;;; +1F262;ROUNDED SYMBOL FOR SHOU;So;0;ON;;;;;N;;;;; +1F263;ROUNDED SYMBOL FOR XI;So;0;ON;;;;;N;;;;; +1F264;ROUNDED SYMBOL FOR SHUANGXI;So;0;ON;;;;;N;;;;; +1F265;ROUNDED SYMBOL FOR CAI;So;0;ON;;;;;N;;;;; 1F300;CYCLONE;So;0;ON;;;;;N;;;;; 1F301;FOGGY;So;0;ON;;;;;N;;;;; 1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; @@ -29248,6 +30202,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; 1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;; 1F6D2;SHOPPING TROLLEY;So;0;ON;;;;;N;;;;; +1F6D3;STUPA;So;0;ON;;;;;N;;;;; +1F6D4;PAGODA;So;0;ON;;;;;N;;;;; 1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; 1F6E1;SHIELD;So;0;ON;;;;;N;;;;; 1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; @@ -29268,6 +30224,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6F4;SCOOTER;So;0;ON;;;;;N;;;;; 1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;; 1F6F6;CANOE;So;0;ON;;;;;N;;;;; +1F6F7;SLED;So;0;ON;;;;;N;;;;; +1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;; 1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; 1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; 1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; @@ -29617,6 +30575,18 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; 1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F900;CIRCLED CROSS FORMEE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F901;CIRCLED CROSS FORMEE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F902;CIRCLED CROSS FORMEE;So;0;ON;;;;;N;;;;; +1F903;LEFT HALF CIRCLE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F904;LEFT HALF CIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F905;LEFT HALF CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F906;LEFT HALF CIRCLE WITH DOT;So;0;ON;;;;;N;;;;; +1F907;LEFT HALF CIRCLE;So;0;ON;;;;;N;;;;; +1F908;DOWNWARD FACING HOOK;So;0;ON;;;;;N;;;;; +1F909;DOWNWARD FACING NOTCHED HOOK;So;0;ON;;;;;N;;;;; +1F90A;DOWNWARD FACING HOOK WITH DOT;So;0;ON;;;;;N;;;;; +1F90B;DOWNWARD FACING NOTCHED HOOK WITH DOT;So;0;ON;;;;;N;;;;; 1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; 1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; 1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; @@ -29632,6 +30602,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;; 1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;; 1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;; +1F91F;I LOVE YOU HAND SIGN;So;0;ON;;;;;N;;;;; 1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;; 1F921;CLOWN FACE;So;0;ON;;;;;N;;;;; 1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;; @@ -29640,7 +30611,17 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F925;LYING FACE;So;0;ON;;;;;N;;;;; 1F926;FACE PALM;So;0;ON;;;;;N;;;;; 1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;; +1F928;FACE WITH ONE EYEBROW RAISED;So;0;ON;;;;;N;;;;; +1F929;GRINNING FACE WITH STAR EYES;So;0;ON;;;;;N;;;;; +1F92A;GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE;So;0;ON;;;;;N;;;;; +1F92B;FACE WITH FINGER COVERING CLOSED LIPS;So;0;ON;;;;;N;;;;; +1F92C;SERIOUS FACE WITH SYMBOLS COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92D;SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92E;FACE WITH OPEN MOUTH VOMITING;So;0;ON;;;;;N;;;;; +1F92F;SHOCKED FACE WITH EXPLODING HEAD;So;0;ON;;;;;N;;;;; 1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;; +1F931;BREAST-FEEDING;So;0;ON;;;;;N;;;;; +1F932;PALMS UP TOGETHER;So;0;ON;;;;;N;;;;; 1F933;SELFIE;So;0;ON;;;;;N;;;;; 1F934;PRINCE;So;0;ON;;;;;N;;;;; 1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;; @@ -29665,6 +30646,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;; 1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;; 1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;; +1F94C;CURLING STONE;So;0;ON;;;;;N;;;;; 1F950;CROISSANT;So;0;ON;;;;;N;;;;; 1F951;AVOCADO;So;0;ON;;;;;N;;;;; 1F952;CUCUMBER;So;0;ON;;;;;N;;;;; @@ -29680,6 +30662,19 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F95C;PEANUTS;So;0;ON;;;;;N;;;;; 1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;; 1F95E;PANCAKES;So;0;ON;;;;;N;;;;; +1F95F;DUMPLING;So;0;ON;;;;;N;;;;; +1F960;FORTUNE COOKIE;So;0;ON;;;;;N;;;;; +1F961;TAKEOUT BOX;So;0;ON;;;;;N;;;;; +1F962;CHOPSTICKS;So;0;ON;;;;;N;;;;; +1F963;BOWL WITH SPOON;So;0;ON;;;;;N;;;;; +1F964;CUP WITH STRAW;So;0;ON;;;;;N;;;;; +1F965;COCONUT;So;0;ON;;;;;N;;;;; +1F966;BROCCOLI;So;0;ON;;;;;N;;;;; +1F967;PIE;So;0;ON;;;;;N;;;;; +1F968;PRETZEL;So;0;ON;;;;;N;;;;; +1F969;CUT OF MEAT;So;0;ON;;;;;N;;;;; +1F96A;SANDWICH;So;0;ON;;;;;N;;;;; +1F96B;CANNED FOOD;So;0;ON;;;;;N;;;;; 1F980;CRAB;So;0;ON;;;;;N;;;;; 1F981;LION FACE;So;0;ON;;;;;N;;;;; 1F982;SCORPION;So;0;ON;;;;;N;;;;; @@ -29698,7 +30693,36 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;; 1F990;SHRIMP;So;0;ON;;;;;N;;;;; 1F991;SQUID;So;0;ON;;;;;N;;;;; +1F992;GIRAFFE FACE;So;0;ON;;;;;N;;;;; +1F993;ZEBRA FACE;So;0;ON;;;;;N;;;;; +1F994;HEDGEHOG;So;0;ON;;;;;N;;;;; +1F995;SAUROPOD;So;0;ON;;;;;N;;;;; +1F996;T-REX;So;0;ON;;;;;N;;;;; +1F997;CRICKET;So;0;ON;;;;;N;;;;; 1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; +1F9D0;FACE WITH MONOCLE;So;0;ON;;;;;N;;;;; +1F9D1;ADULT;So;0;ON;;;;;N;;;;; +1F9D2;CHILD;So;0;ON;;;;;N;;;;; +1F9D3;OLDER ADULT;So;0;ON;;;;;N;;;;; +1F9D4;BEARDED PERSON;So;0;ON;;;;;N;;;;; +1F9D5;PERSON WITH HEADSCARF;So;0;ON;;;;;N;;;;; +1F9D6;PERSON IN STEAMY ROOM;So;0;ON;;;;;N;;;;; +1F9D7;PERSON CLIMBING;So;0;ON;;;;;N;;;;; +1F9D8;PERSON IN LOTUS POSITION;So;0;ON;;;;;N;;;;; +1F9D9;MAGE;So;0;ON;;;;;N;;;;; +1F9DA;FAIRY;So;0;ON;;;;;N;;;;; +1F9DB;VAMPIRE;So;0;ON;;;;;N;;;;; +1F9DC;MERPERSON;So;0;ON;;;;;N;;;;; +1F9DD;ELF;So;0;ON;;;;;N;;;;; +1F9DE;GENIE;So;0;ON;;;;;N;;;;; +1F9DF;ZOMBIE;So;0;ON;;;;;N;;;;; +1F9E0;BRAIN;So;0;ON;;;;;N;;;;; +1F9E1;ORANGE HEART;So;0;ON;;;;;N;;;;; +1F9E2;BILLED CAP;So;0;ON;;;;;N;;;;; +1F9E3;SCARF;So;0;ON;;;;;N;;;;; +1F9E4;GLOVES;So;0;ON;;;;;N;;;;; +1F9E5;COAT;So;0;ON;;;;;N;;;;; +1F9E6;SOCKS;So;0;ON;;;;;N;;;;; 20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;; 2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;; 2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;; @@ -29707,6 +30731,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 2B81D;<CJK Ideograph Extension D, Last>;Lo;0;L;;;;;N;;;;; 2B820;<CJK Ideograph Extension E, First>;Lo;0;L;;;;;N;;;;; 2CEA1;<CJK Ideograph Extension E, Last>;Lo;0;L;;;;;N;;;;; +2CEB0;<CJK Ideograph Extension F, First>;Lo;0;L;;;;;N;;;;; +2EBE0;<CJK Ideograph Extension F, Last>;Lo;0;L;;;;;N;;;;; 2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; 2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; 2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; diff --git a/tools-for-build/allkeys.txt b/tools-for-build/allkeys.txt index 9c92b5e2ac..7cc05743c1 100644 --- a/tools-for-build/allkeys.txt +++ b/tools-for-build/allkeys.txt @@ -1,6 +1,6 @@ -# allkeys-9.0.0.txt -# Date: 2016-05-16, 18:21:19 GMT [KW] -# Copyright 2016 Unicode, Inc. +# allkeys-10.0.0.txt +# Date: 2017-04-26, 11:47:03 GMT [KW] +# Copyright 2017 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # This file defines the Default Unicode Collation Element Table @@ -9,15 +9,17 @@ # See UTS #10, Unicode Collation Algorithm, for more information. # # Diagnostic weight ranges -# Primary weight range: 0200..54A3 (21156) -# Secondary weight range: 0020..0114 (245) -# Variant secondaries: 0110..0114 (5) +# Primary weight range: 0200..56DA (21723) +# Secondary weight range: 0020..0115 (246) +# Variant secondaries: 0111..0115 (5) # Tertiary weight range: 0002..001F (30) # -@version 9.0.0 +@version 10.0.0 @implicitweights 17000..18AFF; FB00 # Tangut and Tangut Components +@implicitweights 1B170..1B2FF; FB01 # Nushu + 0000 ; [.0000.0000.0000] # NULL (in ISO 6429) 0001 ; [.0000.0000.0000] # START OF HEADING (in ISO 6429) 0002 ; [.0000.0000.0000] # START OF TEXT (in ISO 6429) @@ -481,135 +483,135 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 000C ; [*0204.0020.0002] # FORM FEED (in ISO 6429) 000D ; [*0205.0020.0002] # CARRIAGE RETURN (in ISO 6429) 0020 ; [*0209.0020.0002] # SPACE -0021 ; [*0260.0020.0002] # EXCLAMATION MARK -0022 ; [*030C.0020.0002] # QUOTATION MARK -0023 ; [*0398.0020.0002] # NUMBER SIGN -0025 ; [*0399.0020.0002] # PERCENT SIGN -0026 ; [*0396.0020.0002] # AMPERSAND -0027 ; [*0305.0020.0002] # APOSTROPHE -0028 ; [*0317.0020.0002] # LEFT PARENTHESIS -0029 ; [*0318.0020.0002] # RIGHT PARENTHESIS -002A ; [*038F.0020.0002] # ASTERISK -002B ; [*0616.0020.0002] # PLUS SIGN +0021 ; [*0261.0020.0002] # EXCLAMATION MARK +0022 ; [*030D.0020.0002] # QUOTATION MARK +0023 ; [*0399.0020.0002] # NUMBER SIGN +0025 ; [*039A.0020.0002] # PERCENT SIGN +0026 ; [*0397.0020.0002] # AMPERSAND +0027 ; [*0306.0020.0002] # APOSTROPHE +0028 ; [*0318.0020.0002] # LEFT PARENTHESIS +0029 ; [*0319.0020.0002] # RIGHT PARENTHESIS +002A ; [*0390.0020.0002] # ASTERISK +002B ; [*062C.0020.0002] # PLUS SIGN 002C ; [*0222.0020.0002] # COMMA 002D ; [*020D.0020.0002] # HYPHEN-MINUS -002E ; [*0277.0020.0002] # FULL STOP -002F ; [*0394.0020.0002] # SOLIDUS -003A ; [*0239.0020.0002] # COLON +002E ; [*0278.0020.0002] # FULL STOP +002F ; [*0395.0020.0002] # SOLIDUS +003A ; [*023A.0020.0002] # COLON 003B ; [*0234.0020.0002] # SEMICOLON -003C ; [*061A.0020.0002] # LESS-THAN SIGN -003D ; [*061B.0020.0002] # EQUALS SIGN -003E ; [*061C.0020.0002] # GREATER-THAN SIGN -003F ; [*0266.0020.0002] # QUESTION MARK -0040 ; [*038E.0020.0002] # COMMERCIAL AT -005B ; [*0319.0020.0002] # LEFT SQUARE BRACKET -005C ; [*0395.0020.0002] # REVERSE SOLIDUS -005D ; [*031A.0020.0002] # RIGHT SQUARE BRACKET -005E ; [*0485.0020.0002] # CIRCUMFLEX ACCENT +003C ; [*0630.0020.0002] # LESS-THAN SIGN +003D ; [*0631.0020.0002] # EQUALS SIGN +003E ; [*0632.0020.0002] # GREATER-THAN SIGN +003F ; [*0267.0020.0002] # QUESTION MARK +0040 ; [*038F.0020.0002] # COMMERCIAL AT +005B ; [*031A.0020.0002] # LEFT SQUARE BRACKET +005C ; [*0396.0020.0002] # REVERSE SOLIDUS +005D ; [*031B.0020.0002] # RIGHT SQUARE BRACKET +005E ; [*049B.0020.0002] # CIRCUMFLEX ACCENT 005F ; [*020B.0020.0002] # LOW LINE -0060 ; [*0482.0020.0002] # GRAVE ACCENT -007B ; [*031B.0020.0002] # LEFT CURLY BRACKET -007C ; [*061E.0020.0002] # VERTICAL LINE -007D ; [*031C.0020.0002] # RIGHT CURLY BRACKET -007E ; [*0620.0020.0002] # TILDE +0060 ; [*0498.0020.0002] # GRAVE ACCENT +007B ; [*031C.0020.0002] # LEFT CURLY BRACKET +007C ; [*0634.0020.0002] # VERTICAL LINE +007D ; [*031D.0020.0002] # RIGHT CURLY BRACKET +007E ; [*0636.0020.0002] # TILDE 0085 ; [*0206.0020.0002] # NEXT LINE (in ISO 6429) 00A0 ; [*0209.0020.001B] # NO-BREAK SPACE -00A1 ; [*0261.0020.0002] # INVERTED EXCLAMATION MARK -00A6 ; [*061F.0020.0002] # BROKEN BAR -00A7 ; [*0389.0020.0002] # SECTION SIGN -00A8 ; [*0489.0020.0002] # DIAERESIS -00A9 ; [*0584.0020.0002] # COPYRIGHT SIGN -00AB ; [*0315.0020.0002] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00AC ; [*061D.0020.0002] # NOT SIGN -00AE ; [*0585.0020.0002] # REGISTERED SIGN -00AF ; [*0486.0020.0002] # MACRON -00B0 ; [*04F6.0020.0002] # DEGREE SIGN -00B1 ; [*0617.0020.0002] # PLUS-MINUS SIGN -00B4 ; [*0483.0020.0002] # ACUTE ACCENT -00B6 ; [*038B.0020.0002] # PILCROW SIGN -00B7 ; [*028B.0020.0002] # MIDDLE DOT -00B8 ; [*048C.0020.0002] # CEDILLA -00BB ; [*0316.0020.0002] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -00BF ; [*0267.0020.0002] # INVERTED QUESTION MARK -00D7 ; [*0619.0020.0002] # MULTIPLICATION SIGN -00F7 ; [*0618.0020.0002] # DIVISION SIGN -02B9 ; [*0493.0020.0002] # MODIFIER LETTER PRIME -02BA ; [*0495.0020.0002] # MODIFIER LETTER DOUBLE PRIME -02C2 ; [*0496.0020.0002] # MODIFIER LETTER LEFT ARROWHEAD -02C3 ; [*0497.0020.0002] # MODIFIER LETTER RIGHT ARROWHEAD -02C4 ; [*0498.0020.0002] # MODIFIER LETTER UP ARROWHEAD -02C5 ; [*0499.0020.0002] # MODIFIER LETTER DOWN ARROWHEAD -02C6 ; [*049A.0020.0002] # MODIFIER LETTER CIRCUMFLEX ACCENT -02C7 ; [*049B.0020.0002] # CARON -02C8 ; [*049C.0020.0002] # MODIFIER LETTER VERTICAL LINE -02C9 ; [*049D.0020.0002] # MODIFIER LETTER MACRON -02CA ; [*049E.0020.0002] # MODIFIER LETTER ACUTE ACCENT -02CB ; [*049F.0020.0002] # MODIFIER LETTER GRAVE ACCENT -02CC ; [*04A0.0020.0002] # MODIFIER LETTER LOW VERTICAL LINE -02CD ; [*04A1.0020.0002] # MODIFIER LETTER LOW MACRON -02CE ; [*04A2.0020.0002] # MODIFIER LETTER LOW GRAVE ACCENT -02CF ; [*04A3.0020.0002] # MODIFIER LETTER LOW ACUTE ACCENT -02D2 ; [*04A4.0020.0002] # MODIFIER LETTER CENTRED RIGHT HALF RING -02D3 ; [*04A5.0020.0002] # MODIFIER LETTER CENTRED LEFT HALF RING -02D4 ; [*04A6.0020.0002] # MODIFIER LETTER UP TACK -02D5 ; [*04A7.0020.0002] # MODIFIER LETTER DOWN TACK -02D6 ; [*04A8.0020.0002] # MODIFIER LETTER PLUS SIGN -02D7 ; [*04A9.0020.0002] # MODIFIER LETTER MINUS SIGN -02D8 ; [*0487.0020.0002] # BREVE -02D9 ; [*0488.0020.0002] # DOT ABOVE -02DA ; [*048A.0020.0002] # RING ABOVE -02DB ; [*048D.0020.0002] # OGONEK -02DC ; [*0484.0020.0002] # SMALL TILDE -02DD ; [*048B.0020.0002] # DOUBLE ACUTE ACCENT -02DE ; [*04AA.0020.0002] # MODIFIER LETTER RHOTIC HOOK -02DF ; [*04AB.0020.0002] # MODIFIER LETTER CROSS ACCENT -02E5 ; [*04AC.0020.0002] # MODIFIER LETTER EXTRA-HIGH TONE BAR -02E6 ; [*04AD.0020.0002] # MODIFIER LETTER HIGH TONE BAR -02E7 ; [*04AE.0020.0002] # MODIFIER LETTER MID TONE BAR -02E8 ; [*04AF.0020.0002] # MODIFIER LETTER LOW TONE BAR -02E9 ; [*04B0.0020.0002] # MODIFIER LETTER EXTRA-LOW TONE BAR -02EA ; [*04B1.0020.0002] # MODIFIER LETTER YIN DEPARTING TONE MARK -02EB ; [*04B2.0020.0002] # MODIFIER LETTER YANG DEPARTING TONE MARK -02EC ; [*04B3.0020.0002] # MODIFIER LETTER VOICING -02ED ; [*04B4.0020.0002] # MODIFIER LETTER UNASPIRATED -02EF ; [*04B5.0020.0002] # MODIFIER LETTER LOW DOWN ARROWHEAD -02F0 ; [*04B6.0020.0002] # MODIFIER LETTER LOW UP ARROWHEAD -02F1 ; [*04B7.0020.0002] # MODIFIER LETTER LOW LEFT ARROWHEAD -02F2 ; [*04B8.0020.0002] # MODIFIER LETTER LOW RIGHT ARROWHEAD -02F3 ; [*04B9.0020.0002] # MODIFIER LETTER LOW RING -02F4 ; [*04BA.0020.0002] # MODIFIER LETTER MIDDLE GRAVE ACCENT -02F5 ; [*04BB.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT -02F6 ; [*04BC.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT -02F7 ; [*04BD.0020.0002] # MODIFIER LETTER LOW TILDE -02F8 ; [*04BE.0020.0002] # MODIFIER LETTER RAISED COLON -02F9 ; [*04BF.0020.0002] # MODIFIER LETTER BEGIN HIGH TONE -02FA ; [*04C0.0020.0002] # MODIFIER LETTER END HIGH TONE -02FB ; [*04C1.0020.0002] # MODIFIER LETTER BEGIN LOW TONE -02FC ; [*04C2.0020.0002] # MODIFIER LETTER END LOW TONE -02FD ; [*04C3.0020.0002] # MODIFIER LETTER SHELF -02FE ; [*04C4.0020.0002] # MODIFIER LETTER OPEN SHELF -02FF ; [*04C5.0020.0002] # MODIFIER LETTER LOW LEFT ARROW +00A1 ; [*0262.0020.0002] # INVERTED EXCLAMATION MARK +00A6 ; [*0635.0020.0002] # BROKEN BAR +00A7 ; [*038A.0020.0002] # SECTION SIGN +00A8 ; [*049F.0020.0002] # DIAERESIS +00A9 ; [*059A.0020.0002] # COPYRIGHT SIGN +00AB ; [*0316.0020.0002] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; [*0633.0020.0002] # NOT SIGN +00AE ; [*059B.0020.0002] # REGISTERED SIGN +00AF ; [*049C.0020.0002] # MACRON +00B0 ; [*050C.0020.0002] # DEGREE SIGN +00B1 ; [*062D.0020.0002] # PLUS-MINUS SIGN +00B4 ; [*0499.0020.0002] # ACUTE ACCENT +00B6 ; [*038C.0020.0002] # PILCROW SIGN +00B7 ; [*028C.0020.0002] # MIDDLE DOT +00B8 ; [*04A2.0020.0002] # CEDILLA +00BB ; [*0317.0020.0002] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BF ; [*0268.0020.0002] # INVERTED QUESTION MARK +00D7 ; [*062F.0020.0002] # MULTIPLICATION SIGN +00F7 ; [*062E.0020.0002] # DIVISION SIGN +02B9 ; [*04A9.0020.0002] # MODIFIER LETTER PRIME +02BA ; [*04AB.0020.0002] # MODIFIER LETTER DOUBLE PRIME +02C2 ; [*04AC.0020.0002] # MODIFIER LETTER LEFT ARROWHEAD +02C3 ; [*04AD.0020.0002] # MODIFIER LETTER RIGHT ARROWHEAD +02C4 ; [*04AE.0020.0002] # MODIFIER LETTER UP ARROWHEAD +02C5 ; [*04AF.0020.0002] # MODIFIER LETTER DOWN ARROWHEAD +02C6 ; [*04B0.0020.0002] # MODIFIER LETTER CIRCUMFLEX ACCENT +02C7 ; [*04B1.0020.0002] # CARON +02C8 ; [*04B2.0020.0002] # MODIFIER LETTER VERTICAL LINE +02C9 ; [*04B3.0020.0002] # MODIFIER LETTER MACRON +02CA ; [*04B4.0020.0002] # MODIFIER LETTER ACUTE ACCENT +02CB ; [*04B5.0020.0002] # MODIFIER LETTER GRAVE ACCENT +02CC ; [*04B6.0020.0002] # MODIFIER LETTER LOW VERTICAL LINE +02CD ; [*04B7.0020.0002] # MODIFIER LETTER LOW MACRON +02CE ; [*04B8.0020.0002] # MODIFIER LETTER LOW GRAVE ACCENT +02CF ; [*04B9.0020.0002] # MODIFIER LETTER LOW ACUTE ACCENT +02D2 ; [*04BA.0020.0002] # MODIFIER LETTER CENTRED RIGHT HALF RING +02D3 ; [*04BB.0020.0002] # MODIFIER LETTER CENTRED LEFT HALF RING +02D4 ; [*04BC.0020.0002] # MODIFIER LETTER UP TACK +02D5 ; [*04BD.0020.0002] # MODIFIER LETTER DOWN TACK +02D6 ; [*04BE.0020.0002] # MODIFIER LETTER PLUS SIGN +02D7 ; [*04BF.0020.0002] # MODIFIER LETTER MINUS SIGN +02D8 ; [*049D.0020.0002] # BREVE +02D9 ; [*049E.0020.0002] # DOT ABOVE +02DA ; [*04A0.0020.0002] # RING ABOVE +02DB ; [*04A3.0020.0002] # OGONEK +02DC ; [*049A.0020.0002] # SMALL TILDE +02DD ; [*04A1.0020.0002] # DOUBLE ACUTE ACCENT +02DE ; [*04C0.0020.0002] # MODIFIER LETTER RHOTIC HOOK +02DF ; [*04C1.0020.0002] # MODIFIER LETTER CROSS ACCENT +02E5 ; [*04C2.0020.0002] # MODIFIER LETTER EXTRA-HIGH TONE BAR +02E6 ; [*04C3.0020.0002] # MODIFIER LETTER HIGH TONE BAR +02E7 ; [*04C4.0020.0002] # MODIFIER LETTER MID TONE BAR +02E8 ; [*04C5.0020.0002] # MODIFIER LETTER LOW TONE BAR +02E9 ; [*04C6.0020.0002] # MODIFIER LETTER EXTRA-LOW TONE BAR +02EA ; [*04C7.0020.0002] # MODIFIER LETTER YIN DEPARTING TONE MARK +02EB ; [*04C8.0020.0002] # MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; [*04C9.0020.0002] # MODIFIER LETTER VOICING +02ED ; [*04CA.0020.0002] # MODIFIER LETTER UNASPIRATED +02EF ; [*04CB.0020.0002] # MODIFIER LETTER LOW DOWN ARROWHEAD +02F0 ; [*04CC.0020.0002] # MODIFIER LETTER LOW UP ARROWHEAD +02F1 ; [*04CD.0020.0002] # MODIFIER LETTER LOW LEFT ARROWHEAD +02F2 ; [*04CE.0020.0002] # MODIFIER LETTER LOW RIGHT ARROWHEAD +02F3 ; [*04CF.0020.0002] # MODIFIER LETTER LOW RING +02F4 ; [*04D0.0020.0002] # MODIFIER LETTER MIDDLE GRAVE ACCENT +02F5 ; [*04D1.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT +02F6 ; [*04D2.0020.0002] # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT +02F7 ; [*04D3.0020.0002] # MODIFIER LETTER LOW TILDE +02F8 ; [*04D4.0020.0002] # MODIFIER LETTER RAISED COLON +02F9 ; [*04D5.0020.0002] # MODIFIER LETTER BEGIN HIGH TONE +02FA ; [*04D6.0020.0002] # MODIFIER LETTER END HIGH TONE +02FB ; [*04D7.0020.0002] # MODIFIER LETTER BEGIN LOW TONE +02FC ; [*04D8.0020.0002] # MODIFIER LETTER END LOW TONE +02FD ; [*04D9.0020.0002] # MODIFIER LETTER SHELF +02FE ; [*04DA.0020.0002] # MODIFIER LETTER OPEN SHELF +02FF ; [*04DB.0020.0002] # MODIFIER LETTER LOW LEFT ARROW 034F ; [.0000.0000.0000] # COMBINING GRAPHEME JOINER -0374 ; [*0493.0020.0002] # GREEK NUMERAL SIGN -0375 ; [*0494.0020.0002] # GREEK LOWER NUMERAL SIGN +0374 ; [*04A9.0020.0002] # GREEK NUMERAL SIGN +0375 ; [*04AA.0020.0002] # GREEK LOWER NUMERAL SIGN 037E ; [*0234.0020.0002] # GREEK QUESTION MARK -0384 ; [*0483.0020.0002] # GREEK TONOS -0385 ; [*0489.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA TONOS -0387 ; [*028B.0020.0002] # GREEK ANO TELEIA -03F6 ; [*0611.0020.0002] # GREEK REVERSED LUNATE EPSILON SYMBOL -0482 ; [*04F7.0020.0002] # CYRILLIC THOUSANDS SIGN +0384 ; [*0499.0020.0002] # GREEK TONOS +0385 ; [*049F.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA TONOS +0387 ; [*028C.0020.0002] # GREEK ANO TELEIA +03F6 ; [*0627.0020.0002] # GREEK REVERSED LUNATE EPSILON SYMBOL +0482 ; [*050D.0020.0002] # CYRILLIC THOUSANDS SIGN 0488 ; [.0000.0000.0000] # COMBINING CYRILLIC HUNDRED THOUSANDS SIGN 0489 ; [.0000.0000.0000] # COMBINING CYRILLIC MILLIONS SIGN -055A ; [*03CB.0020.0002] # ARMENIAN APOSTROPHE -055B ; [*03CC.0020.0002] # ARMENIAN EMPHASIS MARK -055C ; [*0262.0020.0002] # ARMENIAN EXCLAMATION MARK +055A ; [*03D0.0020.0002] # ARMENIAN APOSTROPHE +055B ; [*03D1.0020.0002] # ARMENIAN EMPHASIS MARK +055C ; [*0263.0020.0002] # ARMENIAN EXCLAMATION MARK 055D ; [*0226.0020.0002] # ARMENIAN COMMA -055E ; [*0269.0020.0002] # ARMENIAN QUESTION MARK -055F ; [*03CD.0020.0002] # ARMENIAN ABBREVIATION MARK -0589 ; [*023A.0020.0002] # ARMENIAN FULL STOP +055E ; [*026A.0020.0002] # ARMENIAN QUESTION MARK +055F ; [*03D2.0020.0002] # ARMENIAN ABBREVIATION MARK +0589 ; [*023B.0020.0002] # ARMENIAN FULL STOP 058A ; [*020E.0020.0002] # ARMENIAN HYPHEN -058D ; [*04F8.0020.0002] # RIGHT-FACING ARMENIAN ETERNITY SIGN -058E ; [*04F9.0020.0002] # LEFT-FACING ARMENIAN ETERNITY SIGN +058D ; [*050E.0020.0002] # RIGHT-FACING ARMENIAN ETERNITY SIGN +058E ; [*050F.0020.0002] # LEFT-FACING ARMENIAN ETERNITY SIGN 0591 ; [.0000.0000.0000] # HEBREW ACCENT ETNAHTA 0592 ; [.0000.0000.0000] # HEBREW ACCENT SEGOL 0593 ; [.0000.0000.0000] # HEBREW ACCENT SHALSHELET @@ -642,29 +644,29 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 05AE ; [.0000.0000.0000] # HEBREW ACCENT ZINOR 05AF ; [.0000.0000.0000] # HEBREW MARK MASORA CIRCLE 05BD ; [.0000.0000.0000] # HEBREW POINT METEG -05BE ; [*03CE.0020.0002] # HEBREW PUNCTUATION MAQAF -05C0 ; [*03CF.0020.0002] # HEBREW PUNCTUATION PASEQ -05C3 ; [*03D0.0020.0002] # HEBREW PUNCTUATION SOF PASUQ +05BE ; [*03D3.0020.0002] # HEBREW PUNCTUATION MAQAF +05C0 ; [*03D4.0020.0002] # HEBREW PUNCTUATION PASEQ +05C3 ; [*03D5.0020.0002] # HEBREW PUNCTUATION SOF PASUQ 05C4 ; [.0000.0000.0000] # HEBREW MARK UPPER DOT 05C5 ; [.0000.0000.0000] # HEBREW MARK LOWER DOT -05C6 ; [*03D1.0020.0002] # HEBREW PUNCTUATION NUN HAFUKHA -05F3 ; [*03D2.0020.0002] # HEBREW PUNCTUATION GERESH -05F4 ; [*03D3.0020.0002] # HEBREW PUNCTUATION GERSHAYIM +05C6 ; [*03D6.0020.0002] # HEBREW PUNCTUATION NUN HAFUKHA +05F3 ; [*03D7.0020.0002] # HEBREW PUNCTUATION GERESH +05F4 ; [*03D8.0020.0002] # HEBREW PUNCTUATION GERSHAYIM 0600 ; [.0000.0000.0000] # ARABIC NUMBER SIGN 0601 ; [.0000.0000.0000] # ARABIC SIGN SANAH 0602 ; [.0000.0000.0000] # ARABIC FOOTNOTE MARKER 0603 ; [.0000.0000.0000] # ARABIC SIGN SAFHA 0604 ; [.0000.0000.0000] # ARABIC SIGN SAMVAT 0605 ; [.0000.0000.0000] # ARABIC NUMBER MARK ABOVE -0606 ; [*062D.0020.0002] # ARABIC-INDIC CUBE ROOT -0607 ; [*062F.0020.0002] # ARABIC-INDIC FOURTH ROOT -0608 ; [*04FA.0020.0002] # ARABIC RAY -0609 ; [*039C.0020.0002] # ARABIC-INDIC PER MILLE SIGN -060A ; [*039E.0020.0002] # ARABIC-INDIC PER TEN THOUSAND SIGN +0606 ; [*0643.0020.0002] # ARABIC-INDIC CUBE ROOT +0607 ; [*0645.0020.0002] # ARABIC-INDIC FOURTH ROOT +0608 ; [*0510.0020.0002] # ARABIC RAY +0609 ; [*039D.0020.0002] # ARABIC-INDIC PER MILLE SIGN +060A ; [*039F.0020.0002] # ARABIC-INDIC PER TEN THOUSAND SIGN 060C ; [*0227.0020.0002] # ARABIC COMMA 060D ; [*0228.0020.0002] # ARABIC DATE SEPARATOR -060E ; [*04FD.0020.0002] # ARABIC POETIC VERSE SIGN -060F ; [*04FE.0020.0002] # ARABIC SIGN MISRA +060E ; [*0513.0020.0002] # ARABIC POETIC VERSE SIGN +060F ; [*0514.0020.0002] # ARABIC SIGN MISRA 0610 ; [.0000.0000.0000] # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM 0611 ; [.0000.0000.0000] # ARABIC SIGN ALAYHE ASSALLAM 0612 ; [.0000.0000.0000] # ARABIC SIGN RAHMATULLAH ALAYHE @@ -677,14 +679,14 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 0619 ; [.0000.0000.0000] # ARABIC SMALL DAMMA 061A ; [.0000.0000.0000] # ARABIC SMALL KASRA 061B ; [*0235.0020.0002] # ARABIC SEMICOLON -061E ; [*023B.0020.0002] # ARABIC TRIPLE DOT PUNCTUATION MARK -061F ; [*026A.0020.0002] # ARABIC QUESTION MARK +061E ; [*023C.0020.0002] # ARABIC TRIPLE DOT PUNCTUATION MARK +061F ; [*026B.0020.0002] # ARABIC QUESTION MARK 0640 ; [.0000.0000.0000] # ARABIC TATWEEL -066A ; [*039A.0020.0002] # ARABIC PERCENT SIGN +066A ; [*039B.0020.0002] # ARABIC PERCENT SIGN 066B ; [*0229.0020.0002] # ARABIC DECIMAL SEPARATOR 066C ; [*022A.0020.0002] # ARABIC THOUSANDS SEPARATOR -066D ; [*0392.0020.0002] # ARABIC FIVE POINTED STAR -06D4 ; [*0279.0020.0002] # ARABIC FULL STOP +066D ; [*0393.0020.0002] # ARABIC FIVE POINTED STAR +06D4 ; [*027A.0020.0002] # ARABIC FULL STOP 06D6 ; [.0000.0000.0000] # ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA 06D7 ; [.0000.0000.0000] # ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA 06D8 ; [.0000.0000.0000] # ARABIC SMALL HIGH MEEM INITIAL FORM @@ -693,7 +695,7 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 06DB ; [.0000.0000.0000] # ARABIC SMALL HIGH THREE DOTS 06DC ; [.0000.0000.0000] # ARABIC SMALL HIGH SEEN 06DD ; [.0000.0000.0000] # ARABIC END OF AYAH -06DE ; [*04FF.0020.0002] # ARABIC START OF RUB EL HIZB +06DE ; [*0515.0020.0002] # ARABIC START OF RUB EL HIZB 06DF ; [.0000.0000.0000] # ARABIC SMALL HIGH ROUNDED ZERO 06E0 ; [.0000.0000.0000] # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO 06E1 ; [.0000.0000.0000] # ARABIC SMALL HIGH DOTLESS HEAD OF KHAH @@ -702,25 +704,25 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 06E4 ; [.0000.0000.0000] # ARABIC SMALL HIGH MADDA 06E7 ; [.0000.0000.0000] # ARABIC SMALL HIGH YEH 06E8 ; [.0000.0000.0000] # ARABIC SMALL HIGH NOON -06E9 ; [*0500.0020.0002] # ARABIC PLACE OF SAJDAH +06E9 ; [*0516.0020.0002] # ARABIC PLACE OF SAJDAH 06EA ; [.0000.0000.0000] # ARABIC EMPTY CENTRE LOW STOP 06EB ; [.0000.0000.0000] # ARABIC EMPTY CENTRE HIGH STOP 06EC ; [.0000.0000.0000] # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE 06ED ; [.0000.0000.0000] # ARABIC SMALL LOW MEEM -0700 ; [*02C4.0020.0002] # SYRIAC END OF PARAGRAPH -0701 ; [*027A.0020.0002] # SYRIAC SUPRALINEAR FULL STOP -0702 ; [*027B.0020.0002] # SYRIAC SUBLINEAR FULL STOP -0703 ; [*023C.0020.0002] # SYRIAC SUPRALINEAR COLON -0704 ; [*023D.0020.0002] # SYRIAC SUBLINEAR COLON -0705 ; [*023E.0020.0002] # SYRIAC HORIZONTAL COLON -0706 ; [*023F.0020.0002] # SYRIAC COLON SKEWED LEFT -0707 ; [*0240.0020.0002] # SYRIAC COLON SKEWED RIGHT -0708 ; [*0241.0020.0002] # SYRIAC SUPRALINEAR COLON SKEWED LEFT -0709 ; [*026B.0020.0002] # SYRIAC SUBLINEAR COLON SKEWED RIGHT -070A ; [*03D4.0020.0002] # SYRIAC CONTRACTION -070B ; [*03D5.0020.0002] # SYRIAC HARKLEAN OBELUS -070C ; [*03D6.0020.0002] # SYRIAC HARKLEAN METOBELUS -070D ; [*03D7.0020.0002] # SYRIAC HARKLEAN ASTERISCUS +0700 ; [*02C5.0020.0002] # SYRIAC END OF PARAGRAPH +0701 ; [*027B.0020.0002] # SYRIAC SUPRALINEAR FULL STOP +0702 ; [*027C.0020.0002] # SYRIAC SUBLINEAR FULL STOP +0703 ; [*023D.0020.0002] # SYRIAC SUPRALINEAR COLON +0704 ; [*023E.0020.0002] # SYRIAC SUBLINEAR COLON +0705 ; [*023F.0020.0002] # SYRIAC HORIZONTAL COLON +0706 ; [*0240.0020.0002] # SYRIAC COLON SKEWED LEFT +0707 ; [*0241.0020.0002] # SYRIAC COLON SKEWED RIGHT +0708 ; [*0242.0020.0002] # SYRIAC SUPRALINEAR COLON SKEWED LEFT +0709 ; [*026C.0020.0002] # SYRIAC SUBLINEAR COLON SKEWED RIGHT +070A ; [*03D9.0020.0002] # SYRIAC CONTRACTION +070B ; [*03DA.0020.0002] # SYRIAC HARKLEAN OBELUS +070C ; [*03DB.0020.0002] # SYRIAC HARKLEAN METOBELUS +070D ; [*03DC.0020.0002] # SYRIAC HARKLEAN ASTERISCUS 0740 ; [.0000.0000.0000] # SYRIAC FEMININE DOT 0743 ; [.0000.0000.0000] # SYRIAC TWO VERTICAL DOTS ABOVE 0744 ; [.0000.0000.0000] # SYRIAC TWO VERTICAL DOTS BELOW @@ -728,27 +730,27 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 0748 ; [.0000.0000.0000] # SYRIAC OBLIQUE LINE BELOW 0749 ; [.0000.0000.0000] # SYRIAC MUSIC 074A ; [.0000.0000.0000] # SYRIAC BARREKH -07F6 ; [*0512.0020.0002] # NKO SYMBOL OO DENNEN -07F7 ; [*02C5.0020.0002] # NKO SYMBOL GBAKURUNEN +07F6 ; [*0528.0020.0002] # NKO SYMBOL OO DENNEN +07F7 ; [*02C6.0020.0002] # NKO SYMBOL GBAKURUNEN 07F8 ; [*022B.0020.0002] # NKO COMMA -07F9 ; [*0263.0020.0002] # NKO EXCLAMATION MARK +07F9 ; [*0264.0020.0002] # NKO EXCLAMATION MARK 07FA ; [.0000.0000.0000] # NKO LAJANYALAN -0830 ; [*0242.0020.0002] # SAMARITAN PUNCTUATION NEQUDAA -0831 ; [*0243.0020.0002] # SAMARITAN PUNCTUATION AFSAAQ -0832 ; [*0244.0020.0002] # SAMARITAN PUNCTUATION ANGED -0833 ; [*0245.0020.0002] # SAMARITAN PUNCTUATION BAU -0834 ; [*0246.0020.0002] # SAMARITAN PUNCTUATION ATMAAU -0835 ; [*0247.0020.0002] # SAMARITAN PUNCTUATION SHIYYAALAA -0836 ; [*0248.0020.0002] # SAMARITAN ABBREVIATION MARK -0837 ; [*0249.0020.0002] # SAMARITAN PUNCTUATION MELODIC QITSA -0838 ; [*024A.0020.0002] # SAMARITAN PUNCTUATION ZIQAA -0839 ; [*024B.0020.0002] # SAMARITAN PUNCTUATION QITSA -083A ; [*024C.0020.0002] # SAMARITAN PUNCTUATION ZAEF -083B ; [*024D.0020.0002] # SAMARITAN PUNCTUATION TURU -083C ; [*024E.0020.0002] # SAMARITAN PUNCTUATION ARKAANU -083D ; [*024F.0020.0002] # SAMARITAN PUNCTUATION SOF MASHFAAT -083E ; [*0250.0020.0002] # SAMARITAN PUNCTUATION ANNAAU -085E ; [*03D8.0020.0002] # MANDAIC PUNCTUATION +0830 ; [*0243.0020.0002] # SAMARITAN PUNCTUATION NEQUDAA +0831 ; [*0244.0020.0002] # SAMARITAN PUNCTUATION AFSAAQ +0832 ; [*0245.0020.0002] # SAMARITAN PUNCTUATION ANGED +0833 ; [*0246.0020.0002] # SAMARITAN PUNCTUATION BAU +0834 ; [*0247.0020.0002] # SAMARITAN PUNCTUATION ATMAAU +0835 ; [*0248.0020.0002] # SAMARITAN PUNCTUATION SHIYYAALAA +0836 ; [*0249.0020.0002] # SAMARITAN ABBREVIATION MARK +0837 ; [*024A.0020.0002] # SAMARITAN PUNCTUATION MELODIC QITSA +0838 ; [*024B.0020.0002] # SAMARITAN PUNCTUATION ZIQAA +0839 ; [*024C.0020.0002] # SAMARITAN PUNCTUATION QITSA +083A ; [*024D.0020.0002] # SAMARITAN PUNCTUATION ZAEF +083B ; [*024E.0020.0002] # SAMARITAN PUNCTUATION TURU +083C ; [*024F.0020.0002] # SAMARITAN PUNCTUATION ARKAANU +083D ; [*0250.0020.0002] # SAMARITAN PUNCTUATION SOF MASHFAAT +083E ; [*0251.0020.0002] # SAMARITAN PUNCTUATION ANNAAU +085E ; [*03DD.0020.0002] # MANDAIC PUNCTUATION 08D4 ; [.0000.0000.0000] # ARABIC SMALL HIGH WORD AR-RUB 08D5 ; [.0000.0000.0000] # ARABIC SMALL HIGH SAD 08D6 ; [.0000.0000.0000] # ARABIC SMALL HIGH AIN @@ -772,270 +774,271 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 08F3 ; [.0000.0000.0000] # ARABIC SMALL HIGH WAW 0951 ; [.0000.0000.0000] # DEVANAGARI STRESS SIGN UDATTA 0952 ; [.0000.0000.0000] # DEVANAGARI STRESS SIGN ANUDATTA -0964 ; [*028E.0020.0002] # DEVANAGARI DANDA -0965 ; [*028F.0020.0002] # DEVANAGARI DOUBLE DANDA -0970 ; [*03E7.0020.0002] # DEVANAGARI ABBREVIATION SIGN -09F4 ; [*1A96.0020.0002] # BENGALI CURRENCY NUMERATOR ONE -09F5 ; [*1A97.0020.0002] # BENGALI CURRENCY NUMERATOR TWO -09F6 ; [*1A98.0020.0002] # BENGALI CURRENCY NUMERATOR THREE -09F7 ; [*1A99.0020.0002] # BENGALI CURRENCY NUMERATOR FOUR -09F8 ; [*1A9A.0020.0002] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR -09F9 ; [*1A9B.0020.0002] # BENGALI CURRENCY DENOMINATOR SIXTEEN -09FA ; [*0513.0020.0002] # BENGALI ISSHAR -0AF0 ; [*03EC.0020.0002] # GUJARATI ABBREVIATION SIGN -0B70 ; [*0514.0020.0002] # ORIYA ISSHAR -0B72 ; [*1A9C.0020.0002] # ORIYA FRACTION ONE QUARTER -0B73 ; [*1A9D.0020.0002] # ORIYA FRACTION ONE HALF -0B74 ; [*1A9E.0020.0002] # ORIYA FRACTION THREE QUARTERS -0B75 ; [*1A9F.0020.0002] # ORIYA FRACTION ONE SIXTEENTH -0B76 ; [*1AA0.0020.0002] # ORIYA FRACTION ONE EIGHTH -0B77 ; [*1AA1.0020.0002] # ORIYA FRACTION THREE SIXTEENTHS -0BF0 ; [*1AA8.0020.0002] # TAMIL NUMBER TEN -0BF1 ; [*1AA9.0020.0002] # TAMIL NUMBER ONE HUNDRED -0BF2 ; [*1AAA.0020.0002] # TAMIL NUMBER ONE THOUSAND -0BF3 ; [*0515.0020.0002] # TAMIL DAY SIGN -0BF4 ; [*0516.0020.0002] # TAMIL MONTH SIGN -0BF5 ; [*0517.0020.0002] # TAMIL YEAR SIGN -0BF6 ; [*0518.0020.0002] # TAMIL DEBIT SIGN -0BF7 ; [*0519.0020.0002] # TAMIL CREDIT SIGN -0BF8 ; [*051A.0020.0002] # TAMIL AS ABOVE SIGN -0BFA ; [*051B.0020.0002] # TAMIL NUMBER SIGN -0C7F ; [*051C.0020.0002] # TELUGU SIGN TUUMU -0D4F ; [*051D.0020.0002] # MALAYALAM SIGN PARA -0D58 ; [*1AAB.0020.0002] # MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH -0D59 ; [*1AAC.0020.0002] # MALAYALAM FRACTION ONE FORTIETH -0D5A ; [*1AAD.0020.0002] # MALAYALAM FRACTION THREE EIGHTIETHS -0D5B ; [*1AAE.0020.0002] # MALAYALAM FRACTION ONE TWENTIETH -0D5C ; [*1AAF.0020.0002] # MALAYALAM FRACTION ONE TENTH -0D5D ; [*1AB0.0020.0002] # MALAYALAM FRACTION THREE TWENTIETHS -0D5E ; [*1AB1.0020.0002] # MALAYALAM FRACTION ONE FIFTH -0D70 ; [*1AB2.0020.0002] # MALAYALAM NUMBER TEN -0D71 ; [*1AB3.0020.0002] # MALAYALAM NUMBER ONE HUNDRED -0D72 ; [*1AB4.0020.0002] # MALAYALAM NUMBER ONE THOUSAND -0D73 ; [*1AB5.0020.0002] # MALAYALAM FRACTION ONE QUARTER -0D74 ; [*1AB6.0020.0002] # MALAYALAM FRACTION ONE HALF -0D75 ; [*1AB7.0020.0002] # MALAYALAM FRACTION THREE QUARTERS -0D76 ; [*1AB8.0020.0002] # MALAYALAM FRACTION ONE SIXTEENTH -0D77 ; [*1AB9.0020.0002] # MALAYALAM FRACTION ONE EIGHTH -0D78 ; [*1ABA.0020.0002] # MALAYALAM FRACTION THREE SIXTEENTHS -0D79 ; [*051E.0020.0002] # MALAYALAM DATE MARK -0DF4 ; [*03ED.0020.0002] # SINHALA PUNCTUATION KUNDDALIYA -0E4F ; [*03EE.0020.0002] # THAI CHARACTER FONGMAN -0E5A ; [*03EF.0020.0002] # THAI CHARACTER ANGKHANKHU -0E5B ; [*03F0.0020.0002] # THAI CHARACTER KHOMUT -0F01 ; [*0526.0020.0002] # TIBETAN MARK GTER YIG MGO TRUNCATED A -0F02 ; [*0527.0020.0002] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA -0F03 ; [*0528.0020.0002] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA -0F04 ; [*03F3.0020.0002] # TIBETAN MARK INITIAL YIG MGO MDUN MA -0F05 ; [*03F4.0020.0002] # TIBETAN MARK CLOSING YIG MGO SGAB MA -0F06 ; [*03F5.0020.0002] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA -0F07 ; [*03F6.0020.0002] # TIBETAN MARK YIG MGO TSHEG SHAD MA -0F08 ; [*03F7.0020.0002] # TIBETAN MARK SBRUL SHAD -0F09 ; [*03F8.0020.0002] # TIBETAN MARK BSKUR YIG MGO -0F0A ; [*03F9.0020.0002] # TIBETAN MARK BKA- SHOG YIG MGO -0F0B ; [*03FC.0020.0002] # TIBETAN MARK INTERSYLLABIC TSHEG -0F0C ; [*03FC.0020.001B] # TIBETAN MARK DELIMITER TSHEG BSTAR -0F0D ; [*03FD.0020.0002] # TIBETAN MARK SHAD -0F0E ; [*03FE.0020.0002] # TIBETAN MARK NYIS SHAD -0F0F ; [*03FF.0020.0002] # TIBETAN MARK TSHEG SHAD -0F10 ; [*0400.0020.0002] # TIBETAN MARK NYIS TSHEG SHAD -0F11 ; [*0401.0020.0002] # TIBETAN MARK RIN CHEN SPUNGS SHAD -0F12 ; [*0402.0020.0002] # TIBETAN MARK RGYA GRAM SHAD -0F13 ; [*0529.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN -0F14 ; [*0258.0020.0002] # TIBETAN MARK GTER TSHEG -0F15 ; [*052A.0020.0002] # TIBETAN LOGOTYPE SIGN CHAD RTAGS -0F16 ; [*052B.0020.0002] # TIBETAN LOGOTYPE SIGN LHAG RTAGS -0F17 ; [*052C.0020.0002] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0964 ; [*028F.0020.0002] # DEVANAGARI DANDA +0965 ; [*0290.0020.0002] # DEVANAGARI DOUBLE DANDA +0970 ; [*03EC.0020.0002] # DEVANAGARI ABBREVIATION SIGN +09F4 ; [*1AFA.0020.0002] # BENGALI CURRENCY NUMERATOR ONE +09F5 ; [*1AFB.0020.0002] # BENGALI CURRENCY NUMERATOR TWO +09F6 ; [*1AFC.0020.0002] # BENGALI CURRENCY NUMERATOR THREE +09F7 ; [*1AFD.0020.0002] # BENGALI CURRENCY NUMERATOR FOUR +09F8 ; [*1AFE.0020.0002] # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +09F9 ; [*1AFF.0020.0002] # BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; [*0529.0020.0002] # BENGALI ISSHAR +09FD ; [*03F1.0020.0002] # BENGALI ABBREVIATION SIGN +0AF0 ; [*03F2.0020.0002] # GUJARATI ABBREVIATION SIGN +0B70 ; [*052A.0020.0002] # ORIYA ISSHAR +0B72 ; [*1B00.0020.0002] # ORIYA FRACTION ONE QUARTER +0B73 ; [*1B01.0020.0002] # ORIYA FRACTION ONE HALF +0B74 ; [*1B02.0020.0002] # ORIYA FRACTION THREE QUARTERS +0B75 ; [*1B03.0020.0002] # ORIYA FRACTION ONE SIXTEENTH +0B76 ; [*1B04.0020.0002] # ORIYA FRACTION ONE EIGHTH +0B77 ; [*1B05.0020.0002] # ORIYA FRACTION THREE SIXTEENTHS +0BF0 ; [*1B0C.0020.0002] # TAMIL NUMBER TEN +0BF1 ; [*1B0D.0020.0002] # TAMIL NUMBER ONE HUNDRED +0BF2 ; [*1B0E.0020.0002] # TAMIL NUMBER ONE THOUSAND +0BF3 ; [*052B.0020.0002] # TAMIL DAY SIGN +0BF4 ; [*052C.0020.0002] # TAMIL MONTH SIGN +0BF5 ; [*052D.0020.0002] # TAMIL YEAR SIGN +0BF6 ; [*052E.0020.0002] # TAMIL DEBIT SIGN +0BF7 ; [*052F.0020.0002] # TAMIL CREDIT SIGN +0BF8 ; [*0530.0020.0002] # TAMIL AS ABOVE SIGN +0BFA ; [*0531.0020.0002] # TAMIL NUMBER SIGN +0C7F ; [*0532.0020.0002] # TELUGU SIGN TUUMU +0D4F ; [*0533.0020.0002] # MALAYALAM SIGN PARA +0D58 ; [*1B0F.0020.0002] # MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH +0D59 ; [*1B10.0020.0002] # MALAYALAM FRACTION ONE FORTIETH +0D5A ; [*1B11.0020.0002] # MALAYALAM FRACTION THREE EIGHTIETHS +0D5B ; [*1B12.0020.0002] # MALAYALAM FRACTION ONE TWENTIETH +0D5C ; [*1B13.0020.0002] # MALAYALAM FRACTION ONE TENTH +0D5D ; [*1B14.0020.0002] # MALAYALAM FRACTION THREE TWENTIETHS +0D5E ; [*1B15.0020.0002] # MALAYALAM FRACTION ONE FIFTH +0D70 ; [*1B16.0020.0002] # MALAYALAM NUMBER TEN +0D71 ; [*1B17.0020.0002] # MALAYALAM NUMBER ONE HUNDRED +0D72 ; [*1B18.0020.0002] # MALAYALAM NUMBER ONE THOUSAND +0D73 ; [*1B19.0020.0002] # MALAYALAM FRACTION ONE QUARTER +0D74 ; [*1B1A.0020.0002] # MALAYALAM FRACTION ONE HALF +0D75 ; [*1B1B.0020.0002] # MALAYALAM FRACTION THREE QUARTERS +0D76 ; [*1B1C.0020.0002] # MALAYALAM FRACTION ONE SIXTEENTH +0D77 ; [*1B1D.0020.0002] # MALAYALAM FRACTION ONE EIGHTH +0D78 ; [*1B1E.0020.0002] # MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; [*0534.0020.0002] # MALAYALAM DATE MARK +0DF4 ; [*03F3.0020.0002] # SINHALA PUNCTUATION KUNDDALIYA +0E4F ; [*03F4.0020.0002] # THAI CHARACTER FONGMAN +0E5A ; [*03F5.0020.0002] # THAI CHARACTER ANGKHANKHU +0E5B ; [*03F6.0020.0002] # THAI CHARACTER KHOMUT +0F01 ; [*053C.0020.0002] # TIBETAN MARK GTER YIG MGO TRUNCATED A +0F02 ; [*053D.0020.0002] # TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA +0F03 ; [*053E.0020.0002] # TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04 ; [*03F9.0020.0002] # TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05 ; [*03FA.0020.0002] # TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06 ; [*03FB.0020.0002] # TIBETAN MARK CARET YIG MGO PHUR SHAD MA +0F07 ; [*03FC.0020.0002] # TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08 ; [*03FD.0020.0002] # TIBETAN MARK SBRUL SHAD +0F09 ; [*03FE.0020.0002] # TIBETAN MARK BSKUR YIG MGO +0F0A ; [*03FF.0020.0002] # TIBETAN MARK BKA- SHOG YIG MGO +0F0B ; [*0402.0020.0002] # TIBETAN MARK INTERSYLLABIC TSHEG +0F0C ; [*0402.0020.001B] # TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D ; [*0403.0020.0002] # TIBETAN MARK SHAD +0F0E ; [*0404.0020.0002] # TIBETAN MARK NYIS SHAD +0F0F ; [*0405.0020.0002] # TIBETAN MARK TSHEG SHAD +0F10 ; [*0406.0020.0002] # TIBETAN MARK NYIS TSHEG SHAD +0F11 ; [*0407.0020.0002] # TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12 ; [*0408.0020.0002] # TIBETAN MARK RGYA GRAM SHAD +0F13 ; [*053F.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; [*0259.0020.0002] # TIBETAN MARK GTER TSHEG +0F15 ; [*0540.0020.0002] # TIBETAN LOGOTYPE SIGN CHAD RTAGS +0F16 ; [*0541.0020.0002] # TIBETAN LOGOTYPE SIGN LHAG RTAGS +0F17 ; [*0542.0020.0002] # TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS 0F18 ; [.0000.0000.0000] # TIBETAN ASTROLOGICAL SIGN -KHYUD PA 0F19 ; [.0000.0000.0000] # TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F1A ; [*052D.0020.0002] # TIBETAN SIGN RDEL DKAR GCIG -0F1B ; [*052E.0020.0002] # TIBETAN SIGN RDEL DKAR GNYIS -0F1C ; [*052F.0020.0002] # TIBETAN SIGN RDEL DKAR GSUM -0F1D ; [*0530.0020.0002] # TIBETAN SIGN RDEL NAG GCIG -0F1E ; [*0531.0020.0002] # TIBETAN SIGN RDEL NAG GNYIS -0F1F ; [*0532.0020.0002] # TIBETAN SIGN RDEL DKAR RDEL NAG -0F34 ; [*0533.0020.0002] # TIBETAN MARK BSDUS RTAGS +0F1A ; [*0543.0020.0002] # TIBETAN SIGN RDEL DKAR GCIG +0F1B ; [*0544.0020.0002] # TIBETAN SIGN RDEL DKAR GNYIS +0F1C ; [*0545.0020.0002] # TIBETAN SIGN RDEL DKAR GSUM +0F1D ; [*0546.0020.0002] # TIBETAN SIGN RDEL NAG GCIG +0F1E ; [*0547.0020.0002] # TIBETAN SIGN RDEL NAG GNYIS +0F1F ; [*0548.0020.0002] # TIBETAN SIGN RDEL DKAR RDEL NAG +0F34 ; [*0549.0020.0002] # TIBETAN MARK BSDUS RTAGS 0F35 ; [.0000.0000.0000] # TIBETAN MARK NGAS BZUNG NYI ZLA -0F36 ; [*0534.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F36 ; [*054A.0020.0002] # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN 0F37 ; [.0000.0000.0000] # TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F38 ; [*0535.0020.0002] # TIBETAN MARK CHE MGO -0F3A ; [*031D.0020.0002] # TIBETAN MARK GUG RTAGS GYON -0F3B ; [*031E.0020.0002] # TIBETAN MARK GUG RTAGS GYAS -0F3C ; [*031F.0020.0002] # TIBETAN MARK ANG KHANG GYON -0F3D ; [*0320.0020.0002] # TIBETAN MARK ANG KHANG GYAS +0F38 ; [*054B.0020.0002] # TIBETAN MARK CHE MGO +0F3A ; [*031E.0020.0002] # TIBETAN MARK GUG RTAGS GYON +0F3B ; [*031F.0020.0002] # TIBETAN MARK GUG RTAGS GYAS +0F3C ; [*0320.0020.0002] # TIBETAN MARK ANG KHANG GYON +0F3D ; [*0321.0020.0002] # TIBETAN MARK ANG KHANG GYAS 0F3E ; [.0000.0000.0000] # TIBETAN SIGN YAR TSHES 0F3F ; [.0000.0000.0000] # TIBETAN SIGN MAR TSHES 0F82 ; [.0000.0000.0000] # TIBETAN SIGN NYI ZLA NAA DA 0F83 ; [.0000.0000.0000] # TIBETAN SIGN SNA LDAN -0F85 ; [*0403.0020.0002] # TIBETAN MARK PALUTA +0F85 ; [*0409.0020.0002] # TIBETAN MARK PALUTA 0F86 ; [.0000.0000.0000] # TIBETAN SIGN LCI RTAGS 0F87 ; [.0000.0000.0000] # TIBETAN SIGN YANG RTAGS -0FBE ; [*0536.0020.0002] # TIBETAN KU RU KHA -0FBF ; [*0537.0020.0002] # TIBETAN KU RU KHA BZHI MIG CAN -0FC0 ; [*0538.0020.0002] # TIBETAN CANTILLATION SIGN HEAVY BEAT -0FC1 ; [*0539.0020.0002] # TIBETAN CANTILLATION SIGN LIGHT BEAT -0FC2 ; [*053A.0020.0002] # TIBETAN CANTILLATION SIGN CANG TE-U -0FC3 ; [*053B.0020.0002] # TIBETAN CANTILLATION SIGN SBUB -CHAL -0FC4 ; [*053C.0020.0002] # TIBETAN SYMBOL DRIL BU -0FC5 ; [*053D.0020.0002] # TIBETAN SYMBOL RDO RJE +0FBE ; [*054C.0020.0002] # TIBETAN KU RU KHA +0FBF ; [*054D.0020.0002] # TIBETAN KU RU KHA BZHI MIG CAN +0FC0 ; [*054E.0020.0002] # TIBETAN CANTILLATION SIGN HEAVY BEAT +0FC1 ; [*054F.0020.0002] # TIBETAN CANTILLATION SIGN LIGHT BEAT +0FC2 ; [*0550.0020.0002] # TIBETAN CANTILLATION SIGN CANG TE-U +0FC3 ; [*0551.0020.0002] # TIBETAN CANTILLATION SIGN SBUB -CHAL +0FC4 ; [*0552.0020.0002] # TIBETAN SYMBOL DRIL BU +0FC5 ; [*0553.0020.0002] # TIBETAN SYMBOL RDO RJE 0FC6 ; [.0000.0000.0000] # TIBETAN SYMBOL PADMA GDAN -0FC7 ; [*053E.0020.0002] # TIBETAN SYMBOL RDO RJE RGYA GRAM -0FC8 ; [*053F.0020.0002] # TIBETAN SYMBOL PHUR PA -0FC9 ; [*0540.0020.0002] # TIBETAN SYMBOL NOR BU -0FCA ; [*0541.0020.0002] # TIBETAN SYMBOL NOR BU NYIS -KHYIL -0FCB ; [*0542.0020.0002] # TIBETAN SYMBOL NOR BU GSUM -KHYIL -0FCC ; [*0543.0020.0002] # TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCE ; [*0544.0020.0002] # TIBETAN SIGN RDEL NAG RDEL DKAR -0FCF ; [*0545.0020.0002] # TIBETAN SIGN RDEL NAG GSUM -0FD0 ; [*03FA.0020.0002] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN -0FD1 ; [*03FB.0020.0002] # TIBETAN MARK MNYAM YIG GI MGO RGYAN -0FD2 ; [*0404.0020.0002] # TIBETAN MARK NYIS TSHEG -0FD3 ; [*0405.0020.0002] # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA -0FD4 ; [*0406.0020.0002] # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA -0FD5 ; [*0546.0020.0002] # RIGHT-FACING SVASTI SIGN -0FD6 ; [*0547.0020.0002] # LEFT-FACING SVASTI SIGN -0FD7 ; [*0548.0020.0002] # RIGHT-FACING SVASTI SIGN WITH DOTS -0FD8 ; [*0549.0020.0002] # LEFT-FACING SVASTI SIGN WITH DOTS -0FD9 ; [*0407.0020.0002] # TIBETAN MARK LEADING MCHAN RTAGS -0FDA ; [*0408.0020.0002] # TIBETAN MARK TRAILING MCHAN RTAGS -104A ; [*0299.0020.0002] # MYANMAR SIGN LITTLE SECTION -104B ; [*029A.0020.0002] # MYANMAR SIGN SECTION -104C ; [*040E.0020.0002] # MYANMAR SYMBOL LOCATIVE -104D ; [*040F.0020.0002] # MYANMAR SYMBOL COMPLETED -104E ; [*0410.0020.0002] # MYANMAR SYMBOL AFOREMENTIONED -104F ; [*0411.0020.0002] # MYANMAR SYMBOL GENITIVE -109E ; [*054B.0020.0002] # MYANMAR SYMBOL SHAN ONE -109F ; [*054C.0020.0002] # MYANMAR SYMBOL SHAN EXCLAMATION -10FB ; [*02C6.0020.0002] # GEORGIAN PARAGRAPH SEPARATOR -1360 ; [*02C7.0020.0002] # ETHIOPIC SECTION MARK -1361 ; [*0251.0020.0002] # ETHIOPIC WORDSPACE -1362 ; [*027C.0020.0002] # ETHIOPIC FULL STOP -1363 ; [*0252.0020.0002] # ETHIOPIC COMMA -1364 ; [*0253.0020.0002] # ETHIOPIC SEMICOLON -1365 ; [*0254.0020.0002] # ETHIOPIC COLON -1366 ; [*0255.0020.0002] # ETHIOPIC PREFACE COLON -1367 ; [*026C.0020.0002] # ETHIOPIC QUESTION MARK -1368 ; [*02C8.0020.0002] # ETHIOPIC PARAGRAPH SEPARATOR -1372 ; [*1ABB.0020.0002] # ETHIOPIC NUMBER TEN -1373 ; [*1ABC.0020.0002] # ETHIOPIC NUMBER TWENTY -1374 ; [*1ABD.0020.0002] # ETHIOPIC NUMBER THIRTY -1375 ; [*1ABE.0020.0002] # ETHIOPIC NUMBER FORTY -1376 ; [*1ABF.0020.0002] # ETHIOPIC NUMBER FIFTY -1377 ; [*1AC0.0020.0002] # ETHIOPIC NUMBER SIXTY -1378 ; [*1AC1.0020.0002] # ETHIOPIC NUMBER SEVENTY -1379 ; [*1AC2.0020.0002] # ETHIOPIC NUMBER EIGHTY -137A ; [*1AC3.0020.0002] # ETHIOPIC NUMBER NINETY -137B ; [*1AC4.0020.0002] # ETHIOPIC NUMBER HUNDRED -137C ; [*1AC5.0020.0002] # ETHIOPIC NUMBER TEN THOUSAND -1390 ; [*04C6.0020.0002] # ETHIOPIC TONAL MARK YIZET -1391 ; [*04C7.0020.0002] # ETHIOPIC TONAL MARK DERET -1392 ; [*04C8.0020.0002] # ETHIOPIC TONAL MARK RIKRIK -1393 ; [*04C9.0020.0002] # ETHIOPIC TONAL MARK SHORT RIKRIK -1394 ; [*04CA.0020.0002] # ETHIOPIC TONAL MARK DIFAT -1395 ; [*04CB.0020.0002] # ETHIOPIC TONAL MARK KENAT -1396 ; [*04CC.0020.0002] # ETHIOPIC TONAL MARK CHIRET -1397 ; [*04CD.0020.0002] # ETHIOPIC TONAL MARK HIDET -1398 ; [*04CE.0020.0002] # ETHIOPIC TONAL MARK DERET-HIDET -1399 ; [*04CF.0020.0002] # ETHIOPIC TONAL MARK KURT +0FC7 ; [*0554.0020.0002] # TIBETAN SYMBOL RDO RJE RGYA GRAM +0FC8 ; [*0555.0020.0002] # TIBETAN SYMBOL PHUR PA +0FC9 ; [*0556.0020.0002] # TIBETAN SYMBOL NOR BU +0FCA ; [*0557.0020.0002] # TIBETAN SYMBOL NOR BU NYIS -KHYIL +0FCB ; [*0558.0020.0002] # TIBETAN SYMBOL NOR BU GSUM -KHYIL +0FCC ; [*0559.0020.0002] # TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE ; [*055A.0020.0002] # TIBETAN SIGN RDEL NAG RDEL DKAR +0FCF ; [*055B.0020.0002] # TIBETAN SIGN RDEL NAG GSUM +0FD0 ; [*0400.0020.0002] # TIBETAN MARK BSKA- SHOG GI MGO RGYAN +0FD1 ; [*0401.0020.0002] # TIBETAN MARK MNYAM YIG GI MGO RGYAN +0FD2 ; [*040A.0020.0002] # TIBETAN MARK NYIS TSHEG +0FD3 ; [*040B.0020.0002] # TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA +0FD4 ; [*040C.0020.0002] # TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5 ; [*055C.0020.0002] # RIGHT-FACING SVASTI SIGN +0FD6 ; [*055D.0020.0002] # LEFT-FACING SVASTI SIGN +0FD7 ; [*055E.0020.0002] # RIGHT-FACING SVASTI SIGN WITH DOTS +0FD8 ; [*055F.0020.0002] # LEFT-FACING SVASTI SIGN WITH DOTS +0FD9 ; [*040D.0020.0002] # TIBETAN MARK LEADING MCHAN RTAGS +0FDA ; [*040E.0020.0002] # TIBETAN MARK TRAILING MCHAN RTAGS +104A ; [*029A.0020.0002] # MYANMAR SIGN LITTLE SECTION +104B ; [*029B.0020.0002] # MYANMAR SIGN SECTION +104C ; [*0424.0020.0002] # MYANMAR SYMBOL LOCATIVE +104D ; [*0425.0020.0002] # MYANMAR SYMBOL COMPLETED +104E ; [*0426.0020.0002] # MYANMAR SYMBOL AFOREMENTIONED +104F ; [*0427.0020.0002] # MYANMAR SYMBOL GENITIVE +109E ; [*0561.0020.0002] # MYANMAR SYMBOL SHAN ONE +109F ; [*0562.0020.0002] # MYANMAR SYMBOL SHAN EXCLAMATION +10FB ; [*02C7.0020.0002] # GEORGIAN PARAGRAPH SEPARATOR +1360 ; [*02C8.0020.0002] # ETHIOPIC SECTION MARK +1361 ; [*0252.0020.0002] # ETHIOPIC WORDSPACE +1362 ; [*027D.0020.0002] # ETHIOPIC FULL STOP +1363 ; [*0253.0020.0002] # ETHIOPIC COMMA +1364 ; [*0254.0020.0002] # ETHIOPIC SEMICOLON +1365 ; [*0255.0020.0002] # ETHIOPIC COLON +1366 ; [*0256.0020.0002] # ETHIOPIC PREFACE COLON +1367 ; [*026D.0020.0002] # ETHIOPIC QUESTION MARK +1368 ; [*02C9.0020.0002] # ETHIOPIC PARAGRAPH SEPARATOR +1372 ; [*1B1F.0020.0002] # ETHIOPIC NUMBER TEN +1373 ; [*1B20.0020.0002] # ETHIOPIC NUMBER TWENTY +1374 ; [*1B21.0020.0002] # ETHIOPIC NUMBER THIRTY +1375 ; [*1B22.0020.0002] # ETHIOPIC NUMBER FORTY +1376 ; [*1B23.0020.0002] # ETHIOPIC NUMBER FIFTY +1377 ; [*1B24.0020.0002] # ETHIOPIC NUMBER SIXTY +1378 ; [*1B25.0020.0002] # ETHIOPIC NUMBER SEVENTY +1379 ; [*1B26.0020.0002] # ETHIOPIC NUMBER EIGHTY +137A ; [*1B27.0020.0002] # ETHIOPIC NUMBER NINETY +137B ; [*1B28.0020.0002] # ETHIOPIC NUMBER HUNDRED +137C ; [*1B29.0020.0002] # ETHIOPIC NUMBER TEN THOUSAND +1390 ; [*04DC.0020.0002] # ETHIOPIC TONAL MARK YIZET +1391 ; [*04DD.0020.0002] # ETHIOPIC TONAL MARK DERET +1392 ; [*04DE.0020.0002] # ETHIOPIC TONAL MARK RIKRIK +1393 ; [*04DF.0020.0002] # ETHIOPIC TONAL MARK SHORT RIKRIK +1394 ; [*04E0.0020.0002] # ETHIOPIC TONAL MARK DIFAT +1395 ; [*04E1.0020.0002] # ETHIOPIC TONAL MARK KENAT +1396 ; [*04E2.0020.0002] # ETHIOPIC TONAL MARK CHIRET +1397 ; [*04E3.0020.0002] # ETHIOPIC TONAL MARK HIDET +1398 ; [*04E4.0020.0002] # ETHIOPIC TONAL MARK DERET-HIDET +1399 ; [*04E5.0020.0002] # ETHIOPIC TONAL MARK KURT 1400 ; [*020F.0020.0002] # CANADIAN SYLLABICS HYPHEN -166D ; [*041E.0020.0002] # CANADIAN SYLLABICS CHI SIGN -166E ; [*027F.0020.0002] # CANADIAN SYLLABICS FULL STOP +166D ; [*0434.0020.0002] # CANADIAN SYLLABICS CHI SIGN +166E ; [*0280.0020.0002] # CANADIAN SYLLABICS FULL STOP 1680 ; [*0209.0020.0004] # OGHAM SPACE MARK -169B ; [*0321.0020.0002] # OGHAM FEATHER MARK -169C ; [*0322.0020.0002] # OGHAM REVERSED FEATHER MARK -16EB ; [*025C.0020.0002] # RUNIC SINGLE PUNCTUATION -16EC ; [*025D.0020.0002] # RUNIC MULTIPLE PUNCTUATION -16ED ; [*025E.0020.0002] # RUNIC CROSS PUNCTUATION -1735 ; [*0296.0020.0002] # PHILIPPINE SINGLE PUNCTUATION -1736 ; [*0297.0020.0002] # PHILIPPINE DOUBLE PUNCTUATION +169B ; [*0322.0020.0002] # OGHAM FEATHER MARK +169C ; [*0323.0020.0002] # OGHAM REVERSED FEATHER MARK +16EB ; [*025D.0020.0002] # RUNIC SINGLE PUNCTUATION +16EC ; [*025E.0020.0002] # RUNIC MULTIPLE PUNCTUATION +16ED ; [*025F.0020.0002] # RUNIC CROSS PUNCTUATION +1735 ; [*0297.0020.0002] # PHILIPPINE SINGLE PUNCTUATION +1736 ; [*0298.0020.0002] # PHILIPPINE DOUBLE PUNCTUATION 17B4 ; [.0000.0000.0000] # KHMER VOWEL INHERENT AQ 17B5 ; [.0000.0000.0000] # KHMER VOWEL INHERENT AA 17D3 ; [.0000.0000.0000] # KHMER SIGN BATHAMASAT -17D4 ; [*029B.0020.0002] # KHMER SIGN KHAN -17D5 ; [*029C.0020.0002] # KHMER SIGN BARIYOOSAN -17D6 ; [*0259.0020.0002] # KHMER SIGN CAMNUC PII KUUH -17D8 ; [*0412.0020.0002] # KHMER SIGN BEYYAL -17D9 ; [*0413.0020.0002] # KHMER SIGN PHNAEK MUAN -17DA ; [*0414.0020.0002] # KHMER SIGN KOOMUUT -1800 ; [*03D9.0020.0002] # MONGOLIAN BIRGA -1801 ; [*0278.0020.0002] # MONGOLIAN ELLIPSIS +17D4 ; [*029C.0020.0002] # KHMER SIGN KHAN +17D5 ; [*029D.0020.0002] # KHMER SIGN BARIYOOSAN +17D6 ; [*025A.0020.0002] # KHMER SIGN CAMNUC PII KUUH +17D8 ; [*0428.0020.0002] # KHMER SIGN BEYYAL +17D9 ; [*0429.0020.0002] # KHMER SIGN PHNAEK MUAN +17DA ; [*042A.0020.0002] # KHMER SIGN KOOMUUT +1800 ; [*03DE.0020.0002] # MONGOLIAN BIRGA +1801 ; [*0279.0020.0002] # MONGOLIAN ELLIPSIS 1802 ; [*022C.0020.0002] # MONGOLIAN COMMA -1803 ; [*027D.0020.0002] # MONGOLIAN FULL STOP -1804 ; [*0256.0020.0002] # MONGOLIAN COLON -1805 ; [*0257.0020.0002] # MONGOLIAN FOUR DOTS +1803 ; [*027E.0020.0002] # MONGOLIAN FULL STOP +1804 ; [*0257.0020.0002] # MONGOLIAN COLON +1805 ; [*0258.0020.0002] # MONGOLIAN FOUR DOTS 1806 ; [*0211.0020.0002] # MONGOLIAN TODO SOFT HYPHEN 1807 ; [*0212.0020.0002] # MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER 1808 ; [*022D.0020.0002] # MONGOLIAN MANCHU COMMA -1809 ; [*027E.0020.0002] # MONGOLIAN MANCHU FULL STOP +1809 ; [*027F.0020.0002] # MONGOLIAN MANCHU FULL STOP 180A ; [.0000.0000.0000] # MONGOLIAN NIRUGU -1940 ; [*054A.0020.0002] # LIMBU SIGN LOO -1944 ; [*0264.0020.0002] # LIMBU EXCLAMATION MARK -1945 ; [*026D.0020.0002] # LIMBU QUESTION MARK -19E0 ; [*0551.0020.0002] # KHMER SYMBOL PATHAMASAT -19E1 ; [*0552.0020.0002] # KHMER SYMBOL MUOY KOET -19E2 ; [*0553.0020.0002] # KHMER SYMBOL PII KOET -19E3 ; [*0554.0020.0002] # KHMER SYMBOL BEI KOET -19E4 ; [*0555.0020.0002] # KHMER SYMBOL BUON KOET -19E5 ; [*0556.0020.0002] # KHMER SYMBOL PRAM KOET -19E6 ; [*0557.0020.0002] # KHMER SYMBOL PRAM-MUOY KOET -19E7 ; [*0558.0020.0002] # KHMER SYMBOL PRAM-PII KOET -19E8 ; [*0559.0020.0002] # KHMER SYMBOL PRAM-BEI KOET -19E9 ; [*055A.0020.0002] # KHMER SYMBOL PRAM-BUON KOET -19EA ; [*055B.0020.0002] # KHMER SYMBOL DAP KOET -19EB ; [*055C.0020.0002] # KHMER SYMBOL DAP-MUOY KOET -19EC ; [*055D.0020.0002] # KHMER SYMBOL DAP-PII KOET -19ED ; [*055E.0020.0002] # KHMER SYMBOL DAP-BEI KOET -19EE ; [*055F.0020.0002] # KHMER SYMBOL DAP-BUON KOET -19EF ; [*0560.0020.0002] # KHMER SYMBOL DAP-PRAM KOET -19F0 ; [*0561.0020.0002] # KHMER SYMBOL TUTEYASAT -19F1 ; [*0562.0020.0002] # KHMER SYMBOL MUOY ROC -19F2 ; [*0563.0020.0002] # KHMER SYMBOL PII ROC -19F3 ; [*0564.0020.0002] # KHMER SYMBOL BEI ROC -19F4 ; [*0565.0020.0002] # KHMER SYMBOL BUON ROC -19F5 ; [*0566.0020.0002] # KHMER SYMBOL PRAM ROC -19F6 ; [*0567.0020.0002] # KHMER SYMBOL PRAM-MUOY ROC -19F7 ; [*0568.0020.0002] # KHMER SYMBOL PRAM-PII ROC -19F8 ; [*0569.0020.0002] # KHMER SYMBOL PRAM-BEI ROC -19F9 ; [*056A.0020.0002] # KHMER SYMBOL PRAM-BUON ROC -19FA ; [*056B.0020.0002] # KHMER SYMBOL DAP ROC -19FB ; [*056C.0020.0002] # KHMER SYMBOL DAP-MUOY ROC -19FC ; [*056D.0020.0002] # KHMER SYMBOL DAP-PII ROC -19FD ; [*056E.0020.0002] # KHMER SYMBOL DAP-BEI ROC -19FE ; [*056F.0020.0002] # KHMER SYMBOL DAP-BUON ROC -19FF ; [*0570.0020.0002] # KHMER SYMBOL DAP-PRAM ROC -1A1E ; [*02C9.0020.0002] # BUGINESE PALLAWA -1A1F ; [*02CA.0020.0002] # BUGINESE END OF SECTION +1940 ; [*0560.0020.0002] # LIMBU SIGN LOO +1944 ; [*0265.0020.0002] # LIMBU EXCLAMATION MARK +1945 ; [*026E.0020.0002] # LIMBU QUESTION MARK +19E0 ; [*0567.0020.0002] # KHMER SYMBOL PATHAMASAT +19E1 ; [*0568.0020.0002] # KHMER SYMBOL MUOY KOET +19E2 ; [*0569.0020.0002] # KHMER SYMBOL PII KOET +19E3 ; [*056A.0020.0002] # KHMER SYMBOL BEI KOET +19E4 ; [*056B.0020.0002] # KHMER SYMBOL BUON KOET +19E5 ; [*056C.0020.0002] # KHMER SYMBOL PRAM KOET +19E6 ; [*056D.0020.0002] # KHMER SYMBOL PRAM-MUOY KOET +19E7 ; [*056E.0020.0002] # KHMER SYMBOL PRAM-PII KOET +19E8 ; [*056F.0020.0002] # KHMER SYMBOL PRAM-BEI KOET +19E9 ; [*0570.0020.0002] # KHMER SYMBOL PRAM-BUON KOET +19EA ; [*0571.0020.0002] # KHMER SYMBOL DAP KOET +19EB ; [*0572.0020.0002] # KHMER SYMBOL DAP-MUOY KOET +19EC ; [*0573.0020.0002] # KHMER SYMBOL DAP-PII KOET +19ED ; [*0574.0020.0002] # KHMER SYMBOL DAP-BEI KOET +19EE ; [*0575.0020.0002] # KHMER SYMBOL DAP-BUON KOET +19EF ; [*0576.0020.0002] # KHMER SYMBOL DAP-PRAM KOET +19F0 ; [*0577.0020.0002] # KHMER SYMBOL TUTEYASAT +19F1 ; [*0578.0020.0002] # KHMER SYMBOL MUOY ROC +19F2 ; [*0579.0020.0002] # KHMER SYMBOL PII ROC +19F3 ; [*057A.0020.0002] # KHMER SYMBOL BEI ROC +19F4 ; [*057B.0020.0002] # KHMER SYMBOL BUON ROC +19F5 ; [*057C.0020.0002] # KHMER SYMBOL PRAM ROC +19F6 ; [*057D.0020.0002] # KHMER SYMBOL PRAM-MUOY ROC +19F7 ; [*057E.0020.0002] # KHMER SYMBOL PRAM-PII ROC +19F8 ; [*057F.0020.0002] # KHMER SYMBOL PRAM-BEI ROC +19F9 ; [*0580.0020.0002] # KHMER SYMBOL PRAM-BUON ROC +19FA ; [*0581.0020.0002] # KHMER SYMBOL DAP ROC +19FB ; [*0582.0020.0002] # KHMER SYMBOL DAP-MUOY ROC +19FC ; [*0583.0020.0002] # KHMER SYMBOL DAP-PII ROC +19FD ; [*0584.0020.0002] # KHMER SYMBOL DAP-BEI ROC +19FE ; [*0585.0020.0002] # KHMER SYMBOL DAP-BUON ROC +19FF ; [*0586.0020.0002] # KHMER SYMBOL DAP-PRAM ROC +1A1E ; [*02CA.0020.0002] # BUGINESE PALLAWA +1A1F ; [*02CB.0020.0002] # BUGINESE END OF SECTION 1A7F ; [.0000.0000.0000] # TAI THAM COMBINING CRYPTOGRAMMIC DOT -1AA0 ; [*0415.0020.0002] # TAI THAM SIGN WIANG -1AA1 ; [*0416.0020.0002] # TAI THAM SIGN WIANGWAAK -1AA2 ; [*0417.0020.0002] # TAI THAM SIGN SAWAN -1AA3 ; [*0418.0020.0002] # TAI THAM SIGN KEOW -1AA4 ; [*0419.0020.0002] # TAI THAM SIGN HOY -1AA5 ; [*041A.0020.0002] # TAI THAM SIGN DOKMAI -1AA6 ; [*041B.0020.0002] # TAI THAM SIGN REVERSED ROTATED RANA -1AA8 ; [*029D.0020.0002] # TAI THAM SIGN KAAN -1AA9 ; [*029E.0020.0002] # TAI THAM SIGN KAANKUU -1AAA ; [*029F.0020.0002] # TAI THAM SIGN SATKAAN -1AAB ; [*02A0.0020.0002] # TAI THAM SIGN SATKAANKUU -1AAC ; [*041C.0020.0002] # TAI THAM SIGN HANG -1AAD ; [*041D.0020.0002] # TAI THAM SIGN CAANG -1B5A ; [*02CB.0020.0002] # BALINESE PANTI -1B5B ; [*02CC.0020.0002] # BALINESE PAMADA -1B5C ; [*0280.0020.0002] # BALINESE WINDU -1B5D ; [*025A.0020.0002] # BALINESE CARIK PAMUNGKAH -1B5E ; [*02A1.0020.0002] # BALINESE CARIK SIKI -1B5F ; [*02A2.0020.0002] # BALINESE CARIK PAREREN +1AA0 ; [*042B.0020.0002] # TAI THAM SIGN WIANG +1AA1 ; [*042C.0020.0002] # TAI THAM SIGN WIANGWAAK +1AA2 ; [*042D.0020.0002] # TAI THAM SIGN SAWAN +1AA3 ; [*042E.0020.0002] # TAI THAM SIGN KEOW +1AA4 ; [*042F.0020.0002] # TAI THAM SIGN HOY +1AA5 ; [*0430.0020.0002] # TAI THAM SIGN DOKMAI +1AA6 ; [*0431.0020.0002] # TAI THAM SIGN REVERSED ROTATED RANA +1AA8 ; [*029E.0020.0002] # TAI THAM SIGN KAAN +1AA9 ; [*029F.0020.0002] # TAI THAM SIGN KAANKUU +1AAA ; [*02A0.0020.0002] # TAI THAM SIGN SATKAAN +1AAB ; [*02A1.0020.0002] # TAI THAM SIGN SATKAANKUU +1AAC ; [*0432.0020.0002] # TAI THAM SIGN HANG +1AAD ; [*0433.0020.0002] # TAI THAM SIGN CAANG +1B5A ; [*02CC.0020.0002] # BALINESE PANTI +1B5B ; [*02CD.0020.0002] # BALINESE PAMADA +1B5C ; [*0281.0020.0002] # BALINESE WINDU +1B5D ; [*025B.0020.0002] # BALINESE CARIK PAMUNGKAH +1B5E ; [*02A2.0020.0002] # BALINESE CARIK SIKI +1B5F ; [*02A3.0020.0002] # BALINESE CARIK PAREREN 1B60 ; [*0210.0020.0002] # BALINESE PAMENENG -1B61 ; [*0571.0020.0002] # BALINESE MUSICAL SYMBOL DONG -1B62 ; [*0572.0020.0002] # BALINESE MUSICAL SYMBOL DENG -1B63 ; [*0573.0020.0002] # BALINESE MUSICAL SYMBOL DUNG -1B64 ; [*0574.0020.0002] # BALINESE MUSICAL SYMBOL DANG -1B65 ; [*0575.0020.0002] # BALINESE MUSICAL SYMBOL DANG SURANG -1B66 ; [*0576.0020.0002] # BALINESE MUSICAL SYMBOL DING -1B67 ; [*0577.0020.0002] # BALINESE MUSICAL SYMBOL DAENG -1B68 ; [*0578.0020.0002] # BALINESE MUSICAL SYMBOL DEUNG -1B69 ; [*0579.0020.0002] # BALINESE MUSICAL SYMBOL DAING -1B6A ; [*057A.0020.0002] # BALINESE MUSICAL SYMBOL DANG GEDE +1B61 ; [*0587.0020.0002] # BALINESE MUSICAL SYMBOL DONG +1B62 ; [*0588.0020.0002] # BALINESE MUSICAL SYMBOL DENG +1B63 ; [*0589.0020.0002] # BALINESE MUSICAL SYMBOL DUNG +1B64 ; [*058A.0020.0002] # BALINESE MUSICAL SYMBOL DANG +1B65 ; [*058B.0020.0002] # BALINESE MUSICAL SYMBOL DANG SURANG +1B66 ; [*058C.0020.0002] # BALINESE MUSICAL SYMBOL DING +1B67 ; [*058D.0020.0002] # BALINESE MUSICAL SYMBOL DAENG +1B68 ; [*058E.0020.0002] # BALINESE MUSICAL SYMBOL DEUNG +1B69 ; [*058F.0020.0002] # BALINESE MUSICAL SYMBOL DAING +1B6A ; [*0590.0020.0002] # BALINESE MUSICAL SYMBOL DANG GEDE 1B6B ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING TEGEH 1B6C ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING ENDEP 1B6D ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING KEMPUL @@ -1045,34 +1048,34 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 1B71 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN 1B72 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING BENDE 1B73 ; [.0000.0000.0000] # BALINESE MUSICAL SYMBOL COMBINING GONG -1B74 ; [*057B.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG -1B75 ; [*057C.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG -1B76 ; [*057D.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK -1B77 ; [*057E.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK -1B78 ; [*057F.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG -1B79 ; [*0580.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG -1B7A ; [*0581.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK -1B7B ; [*0582.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK -1B7C ; [*0583.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING -1BFC ; [*042A.0020.0002] # BATAK SYMBOL BINDU NA METEK -1BFD ; [*042B.0020.0002] # BATAK SYMBOL BINDU PINARBORAS -1BFE ; [*042C.0020.0002] # BATAK SYMBOL BINDU JUDUL -1BFF ; [*042D.0020.0002] # BATAK SYMBOL BINDU PANGOLAT -1C3B ; [*0292.0020.0002] # LEPCHA PUNCTUATION TA-ROL -1C3C ; [*0293.0020.0002] # LEPCHA PUNCTUATION NYET THYOOM TA-ROL -1C3D ; [*040B.0020.0002] # LEPCHA PUNCTUATION CER-WA -1C3E ; [*040C.0020.0002] # LEPCHA PUNCTUATION TSHOOK CER-WA -1C3F ; [*040D.0020.0002] # LEPCHA PUNCTUATION TSHOOK -1C7E ; [*02C2.0020.0002] # OL CHIKI PUNCTUATION MUCAAD -1C7F ; [*02C3.0020.0002] # OL CHIKI PUNCTUATION DOUBLE MUCAAD -1CC0 ; [*041F.0020.0002] # SUNDANESE PUNCTUATION BINDU SURYA -1CC1 ; [*0420.0020.0002] # SUNDANESE PUNCTUATION BINDU PANGLONG -1CC2 ; [*0421.0020.0002] # SUNDANESE PUNCTUATION BINDU PURNAMA -1CC3 ; [*0422.0020.0002] # SUNDANESE PUNCTUATION BINDU CAKRA -1CC4 ; [*0423.0020.0002] # SUNDANESE PUNCTUATION BINDU LEU SATANGA -1CC5 ; [*0424.0020.0002] # SUNDANESE PUNCTUATION BINDU KA SATANGA -1CC6 ; [*0425.0020.0002] # SUNDANESE PUNCTUATION BINDU DA SATANGA -1CC7 ; [*0426.0020.0002] # SUNDANESE PUNCTUATION BINDU BA SATANGA +1B74 ; [*0591.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG +1B75 ; [*0592.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG +1B76 ; [*0593.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK +1B77 ; [*0594.0020.0002] # BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK +1B78 ; [*0595.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG +1B79 ; [*0596.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG +1B7A ; [*0597.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK +1B7B ; [*0598.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK +1B7C ; [*0599.0020.0002] # BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1BFC ; [*0440.0020.0002] # BATAK SYMBOL BINDU NA METEK +1BFD ; [*0441.0020.0002] # BATAK SYMBOL BINDU PINARBORAS +1BFE ; [*0442.0020.0002] # BATAK SYMBOL BINDU JUDUL +1BFF ; [*0443.0020.0002] # BATAK SYMBOL BINDU PANGOLAT +1C3B ; [*0293.0020.0002] # LEPCHA PUNCTUATION TA-ROL +1C3C ; [*0294.0020.0002] # LEPCHA PUNCTUATION NYET THYOOM TA-ROL +1C3D ; [*0421.0020.0002] # LEPCHA PUNCTUATION CER-WA +1C3E ; [*0422.0020.0002] # LEPCHA PUNCTUATION TSHOOK CER-WA +1C3F ; [*0423.0020.0002] # LEPCHA PUNCTUATION TSHOOK +1C7E ; [*02C3.0020.0002] # OL CHIKI PUNCTUATION MUCAAD +1C7F ; [*02C4.0020.0002] # OL CHIKI PUNCTUATION DOUBLE MUCAAD +1CC0 ; [*0435.0020.0002] # SUNDANESE PUNCTUATION BINDU SURYA +1CC1 ; [*0436.0020.0002] # SUNDANESE PUNCTUATION BINDU PANGLONG +1CC2 ; [*0437.0020.0002] # SUNDANESE PUNCTUATION BINDU PURNAMA +1CC3 ; [*0438.0020.0002] # SUNDANESE PUNCTUATION BINDU CAKRA +1CC4 ; [*0439.0020.0002] # SUNDANESE PUNCTUATION BINDU LEU SATANGA +1CC5 ; [*043A.0020.0002] # SUNDANESE PUNCTUATION BINDU KA SATANGA +1CC6 ; [*043B.0020.0002] # SUNDANESE PUNCTUATION BINDU DA SATANGA +1CC7 ; [*043C.0020.0002] # SUNDANESE PUNCTUATION BINDU BA SATANGA 1CD0 ; [.0000.0000.0000] # VEDIC TONE KARSHANA 1CD1 ; [.0000.0000.0000] # VEDIC TONE SHARA 1CD2 ; [.0000.0000.0000] # VEDIC TONE PRENKHA @@ -1099,23 +1102,24 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 1CE7 ; [.0000.0000.0000] # VEDIC SIGN VISARGA UDATTA WITH TAIL 1CE8 ; [.0000.0000.0000] # VEDIC SIGN VISARGA ANUDATTA WITH TAIL 1CF4 ; [.0000.0000.0000] # VEDIC TONE CANDRA ABOVE +1CF7 ; [.0000.0000.0000] # VEDIC SIGN ATIKRAMA 1CF8 ; [.0000.0000.0000] # VEDIC TONE RING ABOVE 1CF9 ; [.0000.0000.0000] # VEDIC TONE DOUBLE RING ABOVE -1FBD ; [*048E.0020.0002] # GREEK KORONIS -1FBF ; [*048E.0020.0002] # GREEK PSILI -1FC0 ; [*0490.0020.0002] # GREEK PERISPOMENI -1FC1 ; [*0489.0020.0002][.0000.002A.0002] # GREEK DIALYTIKA AND PERISPOMENI -1FCD ; [*048E.0020.0002][.0000.0025.0002] # GREEK PSILI AND VARIA -1FCE ; [*048E.0020.0002][.0000.0024.0002] # GREEK PSILI AND OXIA -1FCF ; [*048E.0020.0002][.0000.002A.0002] # GREEK PSILI AND PERISPOMENI -1FDD ; [*048F.0020.0002][.0000.0025.0002] # GREEK DASIA AND VARIA -1FDE ; [*048F.0020.0002][.0000.0024.0002] # GREEK DASIA AND OXIA -1FDF ; [*048F.0020.0002][.0000.002A.0002] # GREEK DASIA AND PERISPOMENI -1FED ; [*0489.0020.0002][.0000.0025.0002] # GREEK DIALYTIKA AND VARIA -1FEE ; [*0489.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA AND OXIA -1FEF ; [*0482.0020.0002] # GREEK VARIA -1FFD ; [*0483.0020.0002] # GREEK OXIA -1FFE ; [*048F.0020.0002] # GREEK DASIA +1FBD ; [*04A4.0020.0002] # GREEK KORONIS +1FBF ; [*04A4.0020.0002] # GREEK PSILI +1FC0 ; [*04A6.0020.0002] # GREEK PERISPOMENI +1FC1 ; [*049F.0020.0002][.0000.002A.0002] # GREEK DIALYTIKA AND PERISPOMENI +1FCD ; [*04A4.0020.0002][.0000.0025.0002] # GREEK PSILI AND VARIA +1FCE ; [*04A4.0020.0002][.0000.0024.0002] # GREEK PSILI AND OXIA +1FCF ; [*04A4.0020.0002][.0000.002A.0002] # GREEK PSILI AND PERISPOMENI +1FDD ; [*04A5.0020.0002][.0000.0025.0002] # GREEK DASIA AND VARIA +1FDE ; [*04A5.0020.0002][.0000.0024.0002] # GREEK DASIA AND OXIA +1FDF ; [*04A5.0020.0002][.0000.002A.0002] # GREEK DASIA AND PERISPOMENI +1FED ; [*049F.0020.0002][.0000.0025.0002] # GREEK DIALYTIKA AND VARIA +1FEE ; [*049F.0020.0002][.0000.0024.0002] # GREEK DIALYTIKA AND OXIA +1FEF ; [*0498.0020.0002] # GREEK VARIA +1FFD ; [*0499.0020.0002] # GREEK OXIA +1FFE ; [*04A5.0020.0002] # GREEK DASIA 2000 ; [*0209.0020.0004] # EN QUAD 2001 ; [*0209.0020.0004] # EM QUAD 2002 ; [*0209.0020.0004] # EN SPACE @@ -1133,2869 +1137,2876 @@ E01EF ; [.0000.0000.0000] # VARIATION SELECTOR-256 2013 ; [*0215.0020.0002] # EN DASH 2014 ; [*0216.0020.0002] # EM DASH 2015 ; [*0217.0020.0002] # HORIZONTAL BAR -2016 ; [*0383.0020.0002] # DOUBLE VERTICAL LINE +2016 ; [*0384.0020.0002] # DOUBLE VERTICAL LINE 2017 ; [*020C.0020.0002] # DOUBLE LOW LINE -2018 ; [*0306.0020.0002] # LEFT SINGLE QUOTATION MARK -2019 ; [*0307.0020.0002] # RIGHT SINGLE QUOTATION MARK -201A ; [*0308.0020.0002] # SINGLE LOW-9 QUOTATION MARK -201B ; [*0309.0020.0002] # SINGLE HIGH-REVERSED-9 QUOTATION MARK -201C ; [*030D.0020.0002] # LEFT DOUBLE QUOTATION MARK -201D ; [*030E.0020.0002] # RIGHT DOUBLE QUOTATION MARK -201E ; [*030F.0020.0002] # DOUBLE LOW-9 QUOTATION MARK -201F ; [*0310.0020.0002] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK -2020 ; [*039F.0020.0002] # DAGGER -2021 ; [*03A0.0020.0002] # DOUBLE DAGGER -2022 ; [*03A4.0020.0002] # BULLET -2023 ; [*03A5.0020.0002] # TRIANGULAR BULLET -2024 ; [*0277.0020.0004] # ONE DOT LEADER -2025 ; [*0277.0020.0004][*0277.0020.0004] # TWO DOT LEADER -2026 ; [*0277.0020.0004][*0277.0020.0004][*0277.0020.0004] # HORIZONTAL ELLIPSIS -2027 ; [*03A6.0020.0002] # HYPHENATION POINT +2018 ; [*0307.0020.0002] # LEFT SINGLE QUOTATION MARK +2019 ; [*0308.0020.0002] # RIGHT SINGLE QUOTATION MARK +201A ; [*0309.0020.0002] # SINGLE LOW-9 QUOTATION MARK +201B ; [*030A.0020.0002] # SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C ; [*030E.0020.0002] # LEFT DOUBLE QUOTATION MARK +201D ; [*030F.0020.0002] # RIGHT DOUBLE QUOTATION MARK +201E ; [*0310.0020.0002] # DOUBLE LOW-9 QUOTATION MARK +201F ; [*0311.0020.0002] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020 ; [*03A0.0020.0002] # DAGGER +2021 ; [*03A1.0020.0002] # DOUBLE DAGGER +2022 ; [*03A5.0020.0002] # BULLET +2023 ; [*03A6.0020.0002] # TRIANGULAR BULLET +2024 ; [*0278.0020.0004] # ONE DOT LEADER +2025 ; [*0278.0020.0004][*0278.0020.0004] # TWO DOT LEADER +2026 ; [*0278.0020.0004][*0278.0020.0004][*0278.0020.0004] # HORIZONTAL ELLIPSIS +2027 ; [*03A7.0020.0002] # HYPHENATION POINT 2028 ; [*0207.0020.0002] # LINE SEPARATOR 2029 ; [*0208.0020.0002] # PARAGRAPH SEPARATOR 202F ; [*0209.0020.001B] # NARROW NO-BREAK SPACE -2030 ; [*039B.0020.0002] # PER MILLE SIGN -2031 ; [*039D.0020.0002] # PER TEN THOUSAND SIGN -2032 ; [*03AA.0020.0002] # PRIME -2033 ; [*03AA.0020.0004][*03AA.0020.0004] # DOUBLE PRIME -2034 ; [*03AA.0020.0004][*03AA.0020.0004][*03AA.0020.0004] # TRIPLE PRIME -2035 ; [*03AB.0020.0002] # REVERSED PRIME -2036 ; [*03AB.0020.0004][*03AB.0020.0004] # REVERSED DOUBLE PRIME -2037 ; [*03AB.0020.0004][*03AB.0020.0004][*03AB.0020.0004] # REVERSED TRIPLE PRIME -2038 ; [*03AE.0020.0002] # CARET -2039 ; [*030A.0020.0002] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A ; [*030B.0020.0002] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -203B ; [*03AF.0020.0002] # REFERENCE MARK -203C ; [*0260.0020.0004][*0260.0020.0004] # DOUBLE EXCLAMATION MARK -203D ; [*0275.0020.0002] # INTERROBANG +2030 ; [*039C.0020.0002] # PER MILLE SIGN +2031 ; [*039E.0020.0002] # PER TEN THOUSAND SIGN +2032 ; [*03AB.0020.0002] # PRIME +2033 ; [*03AB.0020.0004][*03AB.0020.0004] # DOUBLE PRIME +2034 ; [*03AB.0020.0004][*03AB.0020.0004][*03AB.0020.0004] # TRIPLE PRIME +2035 ; [*03AC.0020.0002] # REVERSED PRIME +2036 ; [*03AC.0020.0004][*03AC.0020.0004] # REVERSED DOUBLE PRIME +2037 ; [*03AC.0020.0004][*03AC.0020.0004][*03AC.0020.0004] # REVERSED TRIPLE PRIME +2038 ; [*03AF.0020.0002] # CARET +2039 ; [*030B.0020.0002] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; [*030C.0020.0002] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B ; [*03B0.0020.0002] # REFERENCE MARK +203C ; [*0261.0020.0004][*0261.0020.0004] # DOUBLE EXCLAMATION MARK +203D ; [*0276.0020.0002] # INTERROBANG 203E ; [*020A.0020.0002] # OVERLINE -203F ; [*03B0.0020.0002] # UNDERTIE -2040 ; [*03B2.0020.0002] # CHARACTER TIE -2041 ; [*03B4.0020.0002] # CARET INSERTION POINT -2042 ; [*03B5.0020.0002] # ASTERISM -2043 ; [*03A7.0020.0002] # HYPHEN BULLET -2044 ; [*0626.0020.0002] # FRACTION SLASH -2045 ; [*0323.0020.0002] # LEFT SQUARE BRACKET WITH QUILL -2046 ; [*0324.0020.0002] # RIGHT SQUARE BRACKET WITH QUILL -2047 ; [*0266.0020.0004][*0266.0020.0004] # DOUBLE QUESTION MARK -2048 ; [*0266.0020.0004][*0260.0020.0004] # QUESTION EXCLAMATION MARK -2049 ; [*0260.0020.0004][*0266.0020.0004] # EXCLAMATION QUESTION MARK -204A ; [*0397.0020.0002] # TIRONIAN SIGN ET -204B ; [*038C.0020.0002] # REVERSED PILCROW SIGN -204C ; [*03A8.0020.0002] # BLACK LEFTWARDS BULLET -204D ; [*03A9.0020.0002] # BLACK RIGHTWARDS BULLET -204E ; [*0390.0020.0002] # LOW ASTERISK +203F ; [*03B1.0020.0002] # UNDERTIE +2040 ; [*03B3.0020.0002] # CHARACTER TIE +2041 ; [*03B5.0020.0002] # CARET INSERTION POINT +2042 ; [*03B6.0020.0002] # ASTERISM +2043 ; [*03A8.0020.0002] # HYPHEN BULLET +2044 ; [*063C.0020.0002] # FRACTION SLASH +2045 ; [*0324.0020.0002] # LEFT SQUARE BRACKET WITH QUILL +2046 ; [*0325.0020.0002] # RIGHT SQUARE BRACKET WITH QUILL +2047 ; [*0267.0020.0004][*0267.0020.0004] # DOUBLE QUESTION MARK +2048 ; [*0267.0020.0004][*0261.0020.0004] # QUESTION EXCLAMATION MARK +2049 ; [*0261.0020.0004][*0267.0020.0004] # EXCLAMATION QUESTION MARK +204A ; [*0398.0020.0002] # TIRONIAN SIGN ET +204B ; [*038D.0020.0002] # REVERSED PILCROW SIGN +204C ; [*03A9.0020.0002] # BLACK LEFTWARDS BULLET +204D ; [*03AA.0020.0002] # BLACK RIGHTWARDS BULLET +204E ; [*0391.0020.0002] # LOW ASTERISK 204F ; [*0236.0020.0002] # REVERSED SEMICOLON -2050 ; [*03B3.0020.0002] # CLOSE UP -2051 ; [*0391.0020.0002] # TWO ASTERISKS ALIGNED VERTICALLY -2052 ; [*0622.0020.0002] # COMMERCIAL MINUS SIGN +2050 ; [*03B4.0020.0002] # CLOSE UP +2051 ; [*0392.0020.0002] # TWO ASTERISKS ALIGNED VERTICALLY +2052 ; [*0638.0020.0002] # COMMERCIAL MINUS SIGN 2053 ; [*021A.0020.0002] # SWUNG DASH -2054 ; [*03B1.0020.0002] # INVERTED UNDERTIE -2055 ; [*02E8.0020.0002] # FLOWER PUNCTUATION MARK -2056 ; [*02E9.0020.0002] # THREE DOT PUNCTUATION -2057 ; [*03AA.0020.0004][*03AA.0020.0004][*03AA.0020.0004][*03AA.0020.0004] # QUADRUPLE PRIME -2058 ; [*02EA.0020.0002] # FOUR DOT PUNCTUATION -2059 ; [*02EB.0020.0002] # FIVE DOT PUNCTUATION -205A ; [*02EC.0020.0002] # TWO DOT PUNCTUATION -205B ; [*02ED.0020.0002] # FOUR DOT MARK -205C ; [*02EE.0020.0002] # DOTTED CROSS -205D ; [*02EF.0020.0002] # TRICOLON -205E ; [*02F0.0020.0002] # VERTICAL FOUR DOTS +2054 ; [*03B2.0020.0002] # INVERTED UNDERTIE +2055 ; [*02E9.0020.0002] # FLOWER PUNCTUATION MARK +2056 ; [*02EA.0020.0002] # THREE DOT PUNCTUATION +2057 ; [*03AB.0020.0004][*03AB.0020.0004][*03AB.0020.0004][*03AB.0020.0004] # QUADRUPLE PRIME +2058 ; [*02EB.0020.0002] # FOUR DOT PUNCTUATION +2059 ; [*02EC.0020.0002] # FIVE DOT PUNCTUATION +205A ; [*02ED.0020.0002] # TWO DOT PUNCTUATION +205B ; [*02EE.0020.0002] # FOUR DOT MARK +205C ; [*02EF.0020.0002] # DOTTED CROSS +205D ; [*02F0.0020.0002] # TRICOLON +205E ; [*02F1.0020.0002] # VERTICAL FOUR DOTS 205F ; [*0209.0020.0004] # MEDIUM MATHEMATICAL SPACE 2061 ; [.0000.0000.0000] # FUNCTION APPLICATION 2062 ; [.0000.0000.0000] # INVISIBLE TIMES 2063 ; [.0000.0000.0000] # INVISIBLE SEPARATOR 2064 ; [.0000.0000.0000] # INVISIBLE PLUS -207A ; [*0616.0020.0014] # SUPERSCRIPT PLUS SIGN -207B ; [*0621.0020.0014] # SUPERSCRIPT MINUS -207C ; [*061B.0020.0014] # SUPERSCRIPT EQUALS SIGN -207D ; [*0317.0020.0014] # SUPERSCRIPT LEFT PARENTHESIS -207E ; [*0318.0020.0014] # SUPERSCRIPT RIGHT PARENTHESIS -208A ; [*0616.0020.0015] # SUBSCRIPT PLUS SIGN -208B ; [*0621.0020.0015] # SUBSCRIPT MINUS -208C ; [*061B.0020.0015] # SUBSCRIPT EQUALS SIGN -208D ; [*0317.0020.0015] # SUBSCRIPT LEFT PARENTHESIS -208E ; [*0318.0020.0015] # SUBSCRIPT RIGHT PARENTHESIS -2104 ; [*0586.0020.0002] # CENTRE LINE SYMBOL -2108 ; [*0587.0020.0002] # SCRUPLE -2114 ; [*0588.0020.0002] # L B BAR SYMBOL -2117 ; [*0589.0020.0002] # SOUND RECORDING COPYRIGHT -2118 ; [*058A.0020.0002] # SCRIPT CAPITAL P -211E ; [*058B.0020.0002] # PRESCRIPTION TAKE -211F ; [*058C.0020.0002] # RESPONSE -2123 ; [*058D.0020.0002] # VERSICLE -2125 ; [*058E.0020.0002] # OUNCE SIGN -2127 ; [*058F.0020.0002] # INVERTED OHM SIGN -2129 ; [*0590.0020.0002] # TURNED GREEK SMALL LETTER IOTA -212E ; [*0591.0020.0002] # ESTIMATED SYMBOL -213A ; [*0592.0020.0002] # ROTATED CAPITAL Q -2140 ; [*0615.0020.0005] # DOUBLE-STRUCK N-ARY SUMMATION -2141 ; [*0593.0020.0002] # TURNED SANS-SERIF CAPITAL G -2142 ; [*0594.0020.0002] # TURNED SANS-SERIF CAPITAL L -2143 ; [*0595.0020.0002] # REVERSED SANS-SERIF CAPITAL L -2144 ; [*0596.0020.0002] # TURNED SANS-SERIF CAPITAL Y -214A ; [*0597.0020.0002] # PROPERTY LINE -214B ; [*06B1.0020.0002] # TURNED AMPERSAND -214C ; [*0598.0020.0002] # PER SIGN -214F ; [*0599.0020.0002] # SYMBOL FOR SAMARITAN SOURCE -2180 ; [*1AC6.0020.0002] # ROMAN NUMERAL ONE THOUSAND C D -2181 ; [*1AC7.0020.0002] # ROMAN NUMERAL FIVE THOUSAND -2182 ; [*1AC8.0020.0002] # ROMAN NUMERAL TEN THOUSAND -2186 ; [*1AC9.0020.0002] # ROMAN NUMERAL FIFTY EARLY FORM -2187 ; [*1ACA.0020.0002] # ROMAN NUMERAL FIFTY THOUSAND -2188 ; [*1ACB.0020.0002] # ROMAN NUMERAL ONE HUNDRED THOUSAND -218A ; [*059A.0020.0002] # TURNED DIGIT TWO -218B ; [*059B.0020.0002] # TURNED DIGIT THREE -2190 ; [*059C.0020.0002] # LEFTWARDS ARROW -2191 ; [*059E.0020.0002] # UPWARDS ARROW -2192 ; [*059D.0020.0002] # RIGHTWARDS ARROW -2193 ; [*059F.0020.0002] # DOWNWARDS ARROW -2194 ; [*05A0.0020.0002] # LEFT RIGHT ARROW -2195 ; [*05A1.0020.0002] # UP DOWN ARROW -2196 ; [*05A2.0020.0002] # NORTH WEST ARROW -2197 ; [*05A3.0020.0002] # NORTH EAST ARROW -2198 ; [*05A4.0020.0002] # SOUTH EAST ARROW -2199 ; [*05A5.0020.0002] # SOUTH WEST ARROW -219A ; [*059C.0020.0002][.0000.002F.0002] # LEFTWARDS ARROW WITH STROKE -219B ; [*059D.0020.0002][.0000.002F.0002] # RIGHTWARDS ARROW WITH STROKE -219C ; [*05A6.0020.0002] # LEFTWARDS WAVE ARROW -219D ; [*05A7.0020.0002] # RIGHTWARDS WAVE ARROW -219E ; [*05A8.0020.0002] # LEFTWARDS TWO HEADED ARROW -219F ; [*05A9.0020.0002] # UPWARDS TWO HEADED ARROW -21A0 ; [*05AA.0020.0002] # RIGHTWARDS TWO HEADED ARROW -21A1 ; [*05AB.0020.0002] # DOWNWARDS TWO HEADED ARROW -21A2 ; [*05AC.0020.0002] # LEFTWARDS ARROW WITH TAIL -21A3 ; [*05AD.0020.0002] # RIGHTWARDS ARROW WITH TAIL -21A4 ; [*05AE.0020.0002] # LEFTWARDS ARROW FROM BAR -21A5 ; [*05AF.0020.0002] # UPWARDS ARROW FROM BAR -21A6 ; [*05B0.0020.0002] # RIGHTWARDS ARROW FROM BAR -21A7 ; [*05B1.0020.0002] # DOWNWARDS ARROW FROM BAR -21A8 ; [*05B2.0020.0002] # UP DOWN ARROW WITH BASE -21A9 ; [*05B3.0020.0002] # LEFTWARDS ARROW WITH HOOK -21AA ; [*05B4.0020.0002] # RIGHTWARDS ARROW WITH HOOK -21AB ; [*05B5.0020.0002] # LEFTWARDS ARROW WITH LOOP -21AC ; [*05B6.0020.0002] # RIGHTWARDS ARROW WITH LOOP -21AD ; [*05B7.0020.0002] # LEFT RIGHT WAVE ARROW -21AE ; [*05A0.0020.0002][.0000.002F.0002] # LEFT RIGHT ARROW WITH STROKE -21AF ; [*05B8.0020.0002] # DOWNWARDS ZIGZAG ARROW -21B0 ; [*05B9.0020.0002] # UPWARDS ARROW WITH TIP LEFTWARDS -21B1 ; [*05BA.0020.0002] # UPWARDS ARROW WITH TIP RIGHTWARDS -21B2 ; [*05BB.0020.0002] # DOWNWARDS ARROW WITH TIP LEFTWARDS -21B3 ; [*05BC.0020.0002] # DOWNWARDS ARROW WITH TIP RIGHTWARDS -21B4 ; [*05BD.0020.0002] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS -21B5 ; [*05BE.0020.0002] # DOWNWARDS ARROW WITH CORNER LEFTWARDS -21B6 ; [*05BF.0020.0002] # ANTICLOCKWISE TOP SEMICIRCLE ARROW -21B7 ; [*05C0.0020.0002] # CLOCKWISE TOP SEMICIRCLE ARROW -21B8 ; [*05C1.0020.0002] # NORTH WEST ARROW TO LONG BAR -21B9 ; [*05C2.0020.0002] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR -21BA ; [*05C3.0020.0002] # ANTICLOCKWISE OPEN CIRCLE ARROW -21BB ; [*05C4.0020.0002] # CLOCKWISE OPEN CIRCLE ARROW -21BC ; [*05C5.0020.0002] # LEFTWARDS HARPOON WITH BARB UPWARDS -21BD ; [*05C6.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWNWARDS -21BE ; [*05C7.0020.0002] # UPWARDS HARPOON WITH BARB RIGHTWARDS -21BF ; [*05C8.0020.0002] # UPWARDS HARPOON WITH BARB LEFTWARDS -21C0 ; [*05C9.0020.0002] # RIGHTWARDS HARPOON WITH BARB UPWARDS -21C1 ; [*05CA.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS -21C2 ; [*05CB.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS -21C3 ; [*05CC.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFTWARDS -21C4 ; [*05CD.0020.0002] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW -21C5 ; [*05CE.0020.0002] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW -21C6 ; [*05CF.0020.0002] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW -21C7 ; [*05D0.0020.0002] # LEFTWARDS PAIRED ARROWS -21C8 ; [*05D1.0020.0002] # UPWARDS PAIRED ARROWS -21C9 ; [*05D2.0020.0002] # RIGHTWARDS PAIRED ARROWS -21CA ; [*05D3.0020.0002] # DOWNWARDS PAIRED ARROWS -21CB ; [*05D4.0020.0002] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON -21CC ; [*05D5.0020.0002] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON -21CD ; [*05D6.0020.0002][.0000.002F.0002] # LEFTWARDS DOUBLE ARROW WITH STROKE -21CE ; [*05DA.0020.0002][.0000.002F.0002] # LEFT RIGHT DOUBLE ARROW WITH STROKE -21CF ; [*05D8.0020.0002][.0000.002F.0002] # RIGHTWARDS DOUBLE ARROW WITH STROKE -21D0 ; [*05D6.0020.0002] # LEFTWARDS DOUBLE ARROW -21D1 ; [*05D7.0020.0002] # UPWARDS DOUBLE ARROW -21D2 ; [*05D8.0020.0002] # RIGHTWARDS DOUBLE ARROW -21D3 ; [*05D9.0020.0002] # DOWNWARDS DOUBLE ARROW -21D4 ; [*05DA.0020.0002] # LEFT RIGHT DOUBLE ARROW -21D5 ; [*05DB.0020.0002] # UP DOWN DOUBLE ARROW -21D6 ; [*05DC.0020.0002] # NORTH WEST DOUBLE ARROW -21D7 ; [*05DD.0020.0002] # NORTH EAST DOUBLE ARROW -21D8 ; [*05DE.0020.0002] # SOUTH EAST DOUBLE ARROW -21D9 ; [*05DF.0020.0002] # SOUTH WEST DOUBLE ARROW -21DA ; [*05E0.0020.0002] # LEFTWARDS TRIPLE ARROW -21DB ; [*05E1.0020.0002] # RIGHTWARDS TRIPLE ARROW -21DC ; [*05E2.0020.0002] # LEFTWARDS SQUIGGLE ARROW -21DD ; [*05E3.0020.0002] # RIGHTWARDS SQUIGGLE ARROW -21DE ; [*05E4.0020.0002] # UPWARDS ARROW WITH DOUBLE STROKE -21DF ; [*05E5.0020.0002] # DOWNWARDS ARROW WITH DOUBLE STROKE -21E0 ; [*05E6.0020.0002] # LEFTWARDS DASHED ARROW -21E1 ; [*05E7.0020.0002] # UPWARDS DASHED ARROW -21E2 ; [*05E8.0020.0002] # RIGHTWARDS DASHED ARROW -21E3 ; [*05E9.0020.0002] # DOWNWARDS DASHED ARROW -21E4 ; [*05EA.0020.0002] # LEFTWARDS ARROW TO BAR -21E5 ; [*05EB.0020.0002] # RIGHTWARDS ARROW TO BAR -21E6 ; [*05EC.0020.0002] # LEFTWARDS WHITE ARROW -21E7 ; [*05ED.0020.0002] # UPWARDS WHITE ARROW -21E8 ; [*05EE.0020.0002] # RIGHTWARDS WHITE ARROW -21E9 ; [*05EF.0020.0002] # DOWNWARDS WHITE ARROW -21EA ; [*05F0.0020.0002] # UPWARDS WHITE ARROW FROM BAR -21EB ; [*05F1.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL -21EC ; [*05F2.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR -21ED ; [*05F3.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR -21EE ; [*05F4.0020.0002] # UPWARDS WHITE DOUBLE ARROW -21EF ; [*05F5.0020.0002] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL -21F0 ; [*05F6.0020.0002] # RIGHTWARDS WHITE ARROW FROM WALL -21F1 ; [*05F7.0020.0002] # NORTH WEST ARROW TO CORNER -21F2 ; [*05F8.0020.0002] # SOUTH EAST ARROW TO CORNER -21F3 ; [*05F9.0020.0002] # UP DOWN WHITE ARROW -21F4 ; [*05FA.0020.0002] # RIGHT ARROW WITH SMALL CIRCLE -21F5 ; [*05FB.0020.0002] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW -21F6 ; [*05FC.0020.0002] # THREE RIGHTWARDS ARROWS -21F7 ; [*05FD.0020.0002] # LEFTWARDS ARROW WITH VERTICAL STROKE -21F8 ; [*05FE.0020.0002] # RIGHTWARDS ARROW WITH VERTICAL STROKE -21F9 ; [*05FF.0020.0002] # LEFT RIGHT ARROW WITH VERTICAL STROKE -21FA ; [*0600.0020.0002] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE -21FB ; [*0601.0020.0002] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE -21FC ; [*0602.0020.0002] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE -21FD ; [*0603.0020.0002] # LEFTWARDS OPEN-HEADED ARROW -21FE ; [*0604.0020.0002] # RIGHTWARDS OPEN-HEADED ARROW -21FF ; [*0605.0020.0002] # LEFT RIGHT OPEN-HEADED ARROW -2200 ; [*0606.0020.0002] # FOR ALL -2201 ; [*0607.0020.0002] # COMPLEMENT -2202 ; [*0608.0020.0002] # PARTIAL DIFFERENTIAL -2203 ; [*0609.0020.0002] # THERE EXISTS -2204 ; [*0609.0020.0002][.0000.002F.0002] # THERE DOES NOT EXIST -2205 ; [*060A.0020.0002] # EMPTY SET -2206 ; [*060B.0020.0002] # INCREMENT -2207 ; [*060C.0020.0002] # NABLA -2208 ; [*060D.0020.0002] # ELEMENT OF -2209 ; [*060D.0020.0002][.0000.002F.0002] # NOT AN ELEMENT OF -220A ; [*060E.0020.0002] # SMALL ELEMENT OF -220B ; [*060F.0020.0002] # CONTAINS AS MEMBER -220C ; [*060F.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS MEMBER -220D ; [*0610.0020.0002] # SMALL CONTAINS AS MEMBER -220E ; [*0612.0020.0002] # END OF PROOF -220F ; [*0613.0020.0002] # N-ARY PRODUCT -2210 ; [*0614.0020.0002] # N-ARY COPRODUCT -2211 ; [*0615.0020.0002] # N-ARY SUMMATION -2212 ; [*0621.0020.0002] # MINUS SIGN -2213 ; [*0623.0020.0002] # MINUS-OR-PLUS SIGN -2214 ; [*0624.0020.0002] # DOT PLUS -2215 ; [*0625.0020.0002] # DIVISION SLASH -2216 ; [*0627.0020.0002] # SET MINUS -2217 ; [*0628.0020.0002] # ASTERISK OPERATOR -2218 ; [*0629.0020.0002] # RING OPERATOR -2219 ; [*062A.0020.0002] # BULLET OPERATOR -221A ; [*062B.0020.0002] # SQUARE ROOT -221B ; [*062C.0020.0002] # CUBE ROOT -221C ; [*062E.0020.0002] # FOURTH ROOT -221D ; [*0630.0020.0002] # PROPORTIONAL TO -221E ; [*0631.0020.0002] # INFINITY -221F ; [*0632.0020.0002] # RIGHT ANGLE -2220 ; [*0633.0020.0002] # ANGLE -2221 ; [*0634.0020.0002] # MEASURED ANGLE -2222 ; [*0635.0020.0002] # SPHERICAL ANGLE -2223 ; [*0636.0020.0002] # DIVIDES -2224 ; [*0636.0020.0002][.0000.002F.0002] # DOES NOT DIVIDE -2225 ; [*0637.0020.0002] # PARALLEL TO -2226 ; [*0637.0020.0002][.0000.002F.0002] # NOT PARALLEL TO -2227 ; [*0638.0020.0002] # LOGICAL AND -2228 ; [*0639.0020.0002] # LOGICAL OR -2229 ; [*063A.0020.0002] # INTERSECTION -222A ; [*063B.0020.0002] # UNION -222B ; [*063C.0020.0002] # INTEGRAL -222C ; [*063C.0020.0004][*063C.0020.0004] # DOUBLE INTEGRAL -222D ; [*063C.0020.0004][*063C.0020.0004][*063C.0020.0004] # TRIPLE INTEGRAL -222E ; [*063D.0020.0002] # CONTOUR INTEGRAL -222F ; [*063D.0020.0004][*063D.0020.0004] # SURFACE INTEGRAL -2230 ; [*063D.0020.0004][*063D.0020.0004][*063D.0020.0004] # VOLUME INTEGRAL -2231 ; [*063E.0020.0002] # CLOCKWISE INTEGRAL -2232 ; [*063F.0020.0002] # CLOCKWISE CONTOUR INTEGRAL -2233 ; [*0640.0020.0002] # ANTICLOCKWISE CONTOUR INTEGRAL -2234 ; [*0641.0020.0002] # THEREFORE -2235 ; [*0642.0020.0002] # BECAUSE -2236 ; [*0643.0020.0002] # RATIO -2237 ; [*0644.0020.0002] # PROPORTION -2238 ; [*0645.0020.0002] # DOT MINUS -2239 ; [*0646.0020.0002] # EXCESS -223A ; [*0647.0020.0002] # GEOMETRIC PROPORTION -223B ; [*0648.0020.0002] # HOMOTHETIC -223C ; [*0649.0020.0002] # TILDE OPERATOR -223D ; [*064A.0020.0002] # REVERSED TILDE -223E ; [*064B.0020.0002] # INVERTED LAZY S -223F ; [*064C.0020.0002] # SINE WAVE -2240 ; [*064D.0020.0002] # WREATH PRODUCT -2241 ; [*0649.0020.0002][.0000.002F.0002] # NOT TILDE -2242 ; [*064E.0020.0002] # MINUS TILDE -2243 ; [*064F.0020.0002] # ASYMPTOTICALLY EQUAL TO -2244 ; [*064F.0020.0002][.0000.002F.0002] # NOT ASYMPTOTICALLY EQUAL TO -2245 ; [*0650.0020.0002] # APPROXIMATELY EQUAL TO -2246 ; [*0651.0020.0002] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO -2247 ; [*0650.0020.0002][.0000.002F.0002] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO -2248 ; [*0652.0020.0002] # ALMOST EQUAL TO -2249 ; [*0652.0020.0002][.0000.002F.0002] # NOT ALMOST EQUAL TO -224A ; [*0653.0020.0002] # ALMOST EQUAL OR EQUAL TO -224B ; [*0654.0020.0002] # TRIPLE TILDE -224C ; [*0655.0020.0002] # ALL EQUAL TO -224D ; [*0656.0020.0002] # EQUIVALENT TO -224E ; [*0657.0020.0002] # GEOMETRICALLY EQUIVALENT TO -224F ; [*0658.0020.0002] # DIFFERENCE BETWEEN -2250 ; [*0659.0020.0002] # APPROACHES THE LIMIT -2251 ; [*065A.0020.0002] # GEOMETRICALLY EQUAL TO -2252 ; [*065B.0020.0002] # APPROXIMATELY EQUAL TO OR THE IMAGE OF -2253 ; [*065C.0020.0002] # IMAGE OF OR APPROXIMATELY EQUAL TO -2254 ; [*065D.0020.0002] # COLON EQUALS -2255 ; [*065E.0020.0002] # EQUALS COLON -2256 ; [*065F.0020.0002] # RING IN EQUAL TO -2257 ; [*0660.0020.0002] # RING EQUAL TO -2258 ; [*0661.0020.0002] # CORRESPONDS TO -2259 ; [*0662.0020.0002] # ESTIMATES -225A ; [*0663.0020.0002] # EQUIANGULAR TO -225B ; [*0664.0020.0002] # STAR EQUALS -225C ; [*0665.0020.0002] # DELTA EQUAL TO -225D ; [*0666.0020.0002] # EQUAL TO BY DEFINITION -225E ; [*0667.0020.0002] # MEASURED BY -225F ; [*0668.0020.0002] # QUESTIONED EQUAL TO -2260 ; [*061B.0020.0002][.0000.002F.0002] # NOT EQUAL TO -2261 ; [*0669.0020.0002] # IDENTICAL TO -2262 ; [*0669.0020.0002][.0000.002F.0002] # NOT IDENTICAL TO -2263 ; [*066A.0020.0002] # STRICTLY EQUIVALENT TO -2264 ; [*066B.0020.0002] # LESS-THAN OR EQUAL TO -2265 ; [*066C.0020.0002] # GREATER-THAN OR EQUAL TO -2266 ; [*066D.0020.0002] # LESS-THAN OVER EQUAL TO -2267 ; [*066E.0020.0002] # GREATER-THAN OVER EQUAL TO -2268 ; [*066F.0020.0002] # LESS-THAN BUT NOT EQUAL TO -2269 ; [*0670.0020.0002] # GREATER-THAN BUT NOT EQUAL TO -226A ; [*0671.0020.0002] # MUCH LESS-THAN -226B ; [*0672.0020.0002] # MUCH GREATER-THAN -226C ; [*0673.0020.0002] # BETWEEN -226D ; [*0656.0020.0002][.0000.002F.0002] # NOT EQUIVALENT TO -226E ; [*061A.0020.0002][.0000.002F.0002] # NOT LESS-THAN -226F ; [*061C.0020.0002][.0000.002F.0002] # NOT GREATER-THAN -2270 ; [*066B.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUAL TO -2271 ; [*066C.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUAL TO -2272 ; [*0674.0020.0002] # LESS-THAN OR EQUIVALENT TO -2273 ; [*0675.0020.0002] # GREATER-THAN OR EQUIVALENT TO -2274 ; [*0674.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUIVALENT TO -2275 ; [*0675.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUIVALENT TO -2276 ; [*0676.0020.0002] # LESS-THAN OR GREATER-THAN -2277 ; [*0677.0020.0002] # GREATER-THAN OR LESS-THAN -2278 ; [*0676.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR GREATER-THAN -2279 ; [*0677.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR LESS-THAN -227A ; [*0678.0020.0002] # PRECEDES -227B ; [*0679.0020.0002] # SUCCEEDS -227C ; [*067A.0020.0002] # PRECEDES OR EQUAL TO -227D ; [*067B.0020.0002] # SUCCEEDS OR EQUAL TO -227E ; [*067C.0020.0002] # PRECEDES OR EQUIVALENT TO -227F ; [*067D.0020.0002] # SUCCEEDS OR EQUIVALENT TO -2280 ; [*0678.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE -2281 ; [*0679.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED -2282 ; [*067E.0020.0002] # SUBSET OF -2283 ; [*067F.0020.0002] # SUPERSET OF -2284 ; [*067E.0020.0002][.0000.002F.0002] # NOT A SUBSET OF -2285 ; [*067F.0020.0002][.0000.002F.0002] # NOT A SUPERSET OF -2286 ; [*0680.0020.0002] # SUBSET OF OR EQUAL TO -2287 ; [*0681.0020.0002] # SUPERSET OF OR EQUAL TO -2288 ; [*0680.0020.0002][.0000.002F.0002] # NEITHER A SUBSET OF NOR EQUAL TO -2289 ; [*0681.0020.0002][.0000.002F.0002] # NEITHER A SUPERSET OF NOR EQUAL TO -228A ; [*0682.0020.0002] # SUBSET OF WITH NOT EQUAL TO -228B ; [*0683.0020.0002] # SUPERSET OF WITH NOT EQUAL TO -228C ; [*0684.0020.0002] # MULTISET -228D ; [*0685.0020.0002] # MULTISET MULTIPLICATION -228E ; [*0686.0020.0002] # MULTISET UNION -228F ; [*0687.0020.0002] # SQUARE IMAGE OF -2290 ; [*0688.0020.0002] # SQUARE ORIGINAL OF -2291 ; [*0689.0020.0002] # SQUARE IMAGE OF OR EQUAL TO -2292 ; [*068A.0020.0002] # SQUARE ORIGINAL OF OR EQUAL TO -2293 ; [*068B.0020.0002] # SQUARE CAP -2294 ; [*068C.0020.0002] # SQUARE CUP -2295 ; [*068D.0020.0002] # CIRCLED PLUS -2296 ; [*068E.0020.0002] # CIRCLED MINUS -2297 ; [*068F.0020.0002] # CIRCLED TIMES -2298 ; [*0690.0020.0002] # CIRCLED DIVISION SLASH -2299 ; [*0691.0020.0002] # CIRCLED DOT OPERATOR -229A ; [*0692.0020.0002] # CIRCLED RING OPERATOR -229B ; [*0693.0020.0002] # CIRCLED ASTERISK OPERATOR -229C ; [*0694.0020.0002] # CIRCLED EQUALS -229D ; [*0695.0020.0002] # CIRCLED DASH -229E ; [*0696.0020.0002] # SQUARED PLUS -229F ; [*0697.0020.0002] # SQUARED MINUS -22A0 ; [*0698.0020.0002] # SQUARED TIMES -22A1 ; [*0699.0020.0002] # SQUARED DOT OPERATOR -22A2 ; [*069A.0020.0002] # RIGHT TACK -22A3 ; [*069B.0020.0002] # LEFT TACK -22A4 ; [*069C.0020.0002] # DOWN TACK -22A5 ; [*069D.0020.0002] # UP TACK -22A6 ; [*069E.0020.0002] # ASSERTION -22A7 ; [*069F.0020.0002] # MODELS -22A8 ; [*06A0.0020.0002] # TRUE -22A9 ; [*06A1.0020.0002] # FORCES -22AA ; [*06A2.0020.0002] # TRIPLE VERTICAL BAR RIGHT TURNSTILE -22AB ; [*06A3.0020.0002] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE -22AC ; [*069A.0020.0002][.0000.002F.0002] # DOES NOT PROVE -22AD ; [*06A0.0020.0002][.0000.002F.0002] # NOT TRUE -22AE ; [*06A1.0020.0002][.0000.002F.0002] # DOES NOT FORCE -22AF ; [*06A3.0020.0002][.0000.002F.0002] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE -22B0 ; [*06A4.0020.0002] # PRECEDES UNDER RELATION -22B1 ; [*06A5.0020.0002] # SUCCEEDS UNDER RELATION -22B2 ; [*06A6.0020.0002] # NORMAL SUBGROUP OF -22B3 ; [*06A7.0020.0002] # CONTAINS AS NORMAL SUBGROUP -22B4 ; [*06A8.0020.0002] # NORMAL SUBGROUP OF OR EQUAL TO -22B5 ; [*06A9.0020.0002] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO -22B6 ; [*06AA.0020.0002] # ORIGINAL OF -22B7 ; [*06AB.0020.0002] # IMAGE OF -22B8 ; [*06AC.0020.0002] # MULTIMAP -22B9 ; [*06AD.0020.0002] # HERMITIAN CONJUGATE MATRIX -22BA ; [*06AE.0020.0002] # INTERCALATE -22BB ; [*06AF.0020.0002] # XOR -22BC ; [*06B0.0020.0002] # NAND -22BD ; [*06B2.0020.0002] # NOR -22BE ; [*06B3.0020.0002] # RIGHT ANGLE WITH ARC -22BF ; [*06B4.0020.0002] # RIGHT TRIANGLE -22C0 ; [*06B5.0020.0002] # N-ARY LOGICAL AND -22C1 ; [*06B6.0020.0002] # N-ARY LOGICAL OR -22C2 ; [*06B7.0020.0002] # N-ARY INTERSECTION -22C3 ; [*06B8.0020.0002] # N-ARY UNION -22C4 ; [*06B9.0020.0002] # DIAMOND OPERATOR -22C5 ; [*06BA.0020.0002] # DOT OPERATOR -22C6 ; [*06BB.0020.0002] # STAR OPERATOR -22C7 ; [*06BC.0020.0002] # DIVISION TIMES -22C8 ; [*06BD.0020.0002] # BOWTIE -22C9 ; [*06BE.0020.0002] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT -22CA ; [*06BF.0020.0002] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT -22CB ; [*06C0.0020.0002] # LEFT SEMIDIRECT PRODUCT -22CC ; [*06C1.0020.0002] # RIGHT SEMIDIRECT PRODUCT -22CD ; [*06C2.0020.0002] # REVERSED TILDE EQUALS -22CE ; [*06C3.0020.0002] # CURLY LOGICAL OR -22CF ; [*06C4.0020.0002] # CURLY LOGICAL AND -22D0 ; [*06C5.0020.0002] # DOUBLE SUBSET -22D1 ; [*06C6.0020.0002] # DOUBLE SUPERSET -22D2 ; [*06C7.0020.0002] # DOUBLE INTERSECTION -22D3 ; [*06C8.0020.0002] # DOUBLE UNION -22D4 ; [*06C9.0020.0002] # PITCHFORK -22D5 ; [*06CA.0020.0002] # EQUAL AND PARALLEL TO -22D6 ; [*06CB.0020.0002] # LESS-THAN WITH DOT -22D7 ; [*06CC.0020.0002] # GREATER-THAN WITH DOT -22D8 ; [*06CD.0020.0002] # VERY MUCH LESS-THAN -22D9 ; [*06CE.0020.0002] # VERY MUCH GREATER-THAN -22DA ; [*06CF.0020.0002] # LESS-THAN EQUAL TO OR GREATER-THAN -22DB ; [*06D0.0020.0002] # GREATER-THAN EQUAL TO OR LESS-THAN -22DC ; [*06D1.0020.0002] # EQUAL TO OR LESS-THAN -22DD ; [*06D2.0020.0002] # EQUAL TO OR GREATER-THAN -22DE ; [*06D3.0020.0002] # EQUAL TO OR PRECEDES -22DF ; [*06D4.0020.0002] # EQUAL TO OR SUCCEEDS -22E0 ; [*067A.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE OR EQUAL -22E1 ; [*067B.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED OR EQUAL -22E2 ; [*0689.0020.0002][.0000.002F.0002] # NOT SQUARE IMAGE OF OR EQUAL TO -22E3 ; [*068A.0020.0002][.0000.002F.0002] # NOT SQUARE ORIGINAL OF OR EQUAL TO -22E4 ; [*06D5.0020.0002] # SQUARE IMAGE OF OR NOT EQUAL TO -22E5 ; [*06D6.0020.0002] # SQUARE ORIGINAL OF OR NOT EQUAL TO -22E6 ; [*06D7.0020.0002] # LESS-THAN BUT NOT EQUIVALENT TO -22E7 ; [*06D8.0020.0002] # GREATER-THAN BUT NOT EQUIVALENT TO -22E8 ; [*06D9.0020.0002] # PRECEDES BUT NOT EQUIVALENT TO -22E9 ; [*06DA.0020.0002] # SUCCEEDS BUT NOT EQUIVALENT TO -22EA ; [*06A6.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF -22EB ; [*06A7.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP -22EC ; [*06A8.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF OR EQUAL TO -22ED ; [*06A9.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL -22EE ; [*06DB.0020.0002] # VERTICAL ELLIPSIS -22EF ; [*06DC.0020.0002] # MIDLINE HORIZONTAL ELLIPSIS -22F0 ; [*06DD.0020.0002] # UP RIGHT DIAGONAL ELLIPSIS -22F1 ; [*06DE.0020.0002] # DOWN RIGHT DIAGONAL ELLIPSIS -22F2 ; [*06DF.0020.0002] # ELEMENT OF WITH LONG HORIZONTAL STROKE -22F3 ; [*06E0.0020.0002] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22F4 ; [*06E1.0020.0002] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22F5 ; [*06E2.0020.0002] # ELEMENT OF WITH DOT ABOVE -22F6 ; [*06E3.0020.0002] # ELEMENT OF WITH OVERBAR -22F7 ; [*06E4.0020.0002] # SMALL ELEMENT OF WITH OVERBAR -22F8 ; [*06E5.0020.0002] # ELEMENT OF WITH UNDERBAR -22F9 ; [*06E6.0020.0002] # ELEMENT OF WITH TWO HORIZONTAL STROKES -22FA ; [*06E7.0020.0002] # CONTAINS WITH LONG HORIZONTAL STROKE -22FB ; [*06E8.0020.0002] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22FC ; [*06E9.0020.0002] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22FD ; [*06EA.0020.0002] # CONTAINS WITH OVERBAR -22FE ; [*06EB.0020.0002] # SMALL CONTAINS WITH OVERBAR -22FF ; [*06EC.0020.0002] # Z NOTATION BAG MEMBERSHIP -2300 ; [*06ED.0020.0002] # DIAMETER SIGN -2301 ; [*06EE.0020.0002] # ELECTRIC ARROW -2302 ; [*06EF.0020.0002] # HOUSE -2303 ; [*06F0.0020.0002] # UP ARROWHEAD -2304 ; [*06F1.0020.0002] # DOWN ARROWHEAD -2305 ; [*06F2.0020.0002] # PROJECTIVE -2306 ; [*06F3.0020.0002] # PERSPECTIVE -2307 ; [*06F4.0020.0002] # WAVY LINE -2308 ; [*0325.0020.0002] # LEFT CEILING -2309 ; [*0326.0020.0002] # RIGHT CEILING -230A ; [*0327.0020.0002] # LEFT FLOOR -230B ; [*0328.0020.0002] # RIGHT FLOOR -230C ; [*06F5.0020.0002] # BOTTOM RIGHT CROP -230D ; [*06F6.0020.0002] # BOTTOM LEFT CROP -230E ; [*06F7.0020.0002] # TOP RIGHT CROP -230F ; [*06F8.0020.0002] # TOP LEFT CROP -2310 ; [*06F9.0020.0002] # REVERSED NOT SIGN -2311 ; [*06FA.0020.0002] # SQUARE LOZENGE -2312 ; [*06FB.0020.0002] # ARC -2313 ; [*06FC.0020.0002] # SEGMENT -2314 ; [*06FD.0020.0002] # SECTOR -2315 ; [*06FE.0020.0002] # TELEPHONE RECORDER -2316 ; [*06FF.0020.0002] # POSITION INDICATOR -2317 ; [*0700.0020.0002] # VIEWDATA SQUARE -2318 ; [*0701.0020.0002] # PLACE OF INTEREST SIGN -2319 ; [*0702.0020.0002] # TURNED NOT SIGN -231A ; [*0703.0020.0002] # WATCH -231B ; [*0704.0020.0002] # HOURGLASS -231C ; [*0705.0020.0002] # TOP LEFT CORNER -231D ; [*0706.0020.0002] # TOP RIGHT CORNER -231E ; [*0707.0020.0002] # BOTTOM LEFT CORNER -231F ; [*0708.0020.0002] # BOTTOM RIGHT CORNER -2320 ; [*0709.0020.0002] # TOP HALF INTEGRAL -2321 ; [*070A.0020.0002] # BOTTOM HALF INTEGRAL -2322 ; [*070B.0020.0002] # FROWN -2323 ; [*070C.0020.0002] # SMILE -2324 ; [*070D.0020.0002] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS -2325 ; [*070E.0020.0002] # OPTION KEY -2326 ; [*070F.0020.0002] # ERASE TO THE RIGHT -2327 ; [*0710.0020.0002] # X IN A RECTANGLE BOX -2328 ; [*0711.0020.0002] # KEYBOARD -2329 ; [*036F.0020.0002] # LEFT-POINTING ANGLE BRACKET -232A ; [*0370.0020.0002] # RIGHT-POINTING ANGLE BRACKET -232B ; [*0712.0020.0002] # ERASE TO THE LEFT -232C ; [*0713.0020.0002] # BENZENE RING -232D ; [*0714.0020.0002] # CYLINDRICITY -232E ; [*0715.0020.0002] # ALL AROUND-PROFILE -232F ; [*0716.0020.0002] # SYMMETRY -2330 ; [*0717.0020.0002] # TOTAL RUNOUT -2331 ; [*0718.0020.0002] # DIMENSION ORIGIN -2332 ; [*0719.0020.0002] # CONICAL TAPER -2333 ; [*071A.0020.0002] # SLOPE -2334 ; [*071B.0020.0002] # COUNTERBORE -2335 ; [*071C.0020.0002] # COUNTERSINK -2336 ; [*071D.0020.0002] # APL FUNCTIONAL SYMBOL I-BEAM -2337 ; [*071E.0020.0002] # APL FUNCTIONAL SYMBOL SQUISH QUAD -2338 ; [*071F.0020.0002] # APL FUNCTIONAL SYMBOL QUAD EQUAL -2339 ; [*0720.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIVIDE -233A ; [*0721.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIAMOND -233B ; [*0722.0020.0002] # APL FUNCTIONAL SYMBOL QUAD JOT -233C ; [*0723.0020.0002] # APL FUNCTIONAL SYMBOL QUAD CIRCLE -233D ; [*0724.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STILE -233E ; [*0725.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE JOT -233F ; [*0726.0020.0002] # APL FUNCTIONAL SYMBOL SLASH BAR -2340 ; [*0727.0020.0002] # APL FUNCTIONAL SYMBOL BACKSLASH BAR -2341 ; [*0728.0020.0002] # APL FUNCTIONAL SYMBOL QUAD SLASH -2342 ; [*0729.0020.0002] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH -2343 ; [*072A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN -2344 ; [*072B.0020.0002] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN -2345 ; [*072C.0020.0002] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE -2346 ; [*072D.0020.0002] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE -2347 ; [*072E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW -2348 ; [*072F.0020.0002] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW -2349 ; [*0730.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH -234A ; [*0731.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR -234B ; [*0732.0020.0002] # APL FUNCTIONAL SYMBOL DELTA STILE -234C ; [*0733.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET -234D ; [*0734.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DELTA -234E ; [*0735.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK JOT -234F ; [*0736.0020.0002] # APL FUNCTIONAL SYMBOL UPWARDS VANE -2350 ; [*0737.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW -2351 ; [*0738.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR -2352 ; [*0739.0020.0002] # APL FUNCTIONAL SYMBOL DEL STILE -2353 ; [*073A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UP CARET -2354 ; [*073B.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DEL -2355 ; [*073C.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK JOT -2356 ; [*073D.0020.0002] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE -2357 ; [*073E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW -2358 ; [*073F.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR -2359 ; [*0740.0020.0002] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR -235A ; [*0741.0020.0002] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR -235B ; [*0742.0020.0002] # APL FUNCTIONAL SYMBOL JOT UNDERBAR -235C ; [*0743.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR -235D ; [*0744.0020.0002] # APL FUNCTIONAL SYMBOL UP SHOE JOT -235E ; [*0745.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE QUAD -235F ; [*0746.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STAR -2360 ; [*0747.0020.0002] # APL FUNCTIONAL SYMBOL QUAD COLON -2361 ; [*0748.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS -2362 ; [*0749.0020.0002] # APL FUNCTIONAL SYMBOL DEL DIAERESIS -2363 ; [*074A.0020.0002] # APL FUNCTIONAL SYMBOL STAR DIAERESIS -2364 ; [*074B.0020.0002] # APL FUNCTIONAL SYMBOL JOT DIAERESIS -2365 ; [*074C.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS -2366 ; [*074D.0020.0002] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE -2367 ; [*074E.0020.0002] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE -2368 ; [*074F.0020.0002] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS -2369 ; [*0750.0020.0002] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS -236A ; [*0751.0020.0002] # APL FUNCTIONAL SYMBOL COMMA BAR -236B ; [*0752.0020.0002] # APL FUNCTIONAL SYMBOL DEL TILDE -236C ; [*0753.0020.0002] # APL FUNCTIONAL SYMBOL ZILDE -236D ; [*0754.0020.0002] # APL FUNCTIONAL SYMBOL STILE TILDE -236E ; [*0755.0020.0002] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR -236F ; [*0756.0020.0002] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL -2370 ; [*0757.0020.0002] # APL FUNCTIONAL SYMBOL QUAD QUESTION -2371 ; [*0758.0020.0002] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE -2372 ; [*0759.0020.0002] # APL FUNCTIONAL SYMBOL UP CARET TILDE -2373 ; [*075A.0020.0002] # APL FUNCTIONAL SYMBOL IOTA -2374 ; [*075B.0020.0002] # APL FUNCTIONAL SYMBOL RHO -2375 ; [*075C.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA -2376 ; [*075D.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR -2377 ; [*075E.0020.0002] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR -2378 ; [*075F.0020.0002] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR -2379 ; [*0760.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR -237A ; [*0761.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA -237B ; [*0762.0020.0002] # NOT CHECK MARK -237C ; [*0763.0020.0002] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -237D ; [*0764.0020.0002] # SHOULDERED OPEN BOX -237E ; [*0765.0020.0002] # BELL SYMBOL -237F ; [*0766.0020.0002] # VERTICAL LINE WITH MIDDLE DOT -2380 ; [*0767.0020.0002] # INSERTION SYMBOL -2381 ; [*0768.0020.0002] # CONTINUOUS UNDERLINE SYMBOL -2382 ; [*0769.0020.0002] # DISCONTINUOUS UNDERLINE SYMBOL -2383 ; [*076A.0020.0002] # EMPHASIS SYMBOL -2384 ; [*076B.0020.0002] # COMPOSITION SYMBOL -2385 ; [*076C.0020.0002] # WHITE SQUARE WITH CENTRE VERTICAL LINE -2386 ; [*076D.0020.0002] # ENTER SYMBOL -2387 ; [*076E.0020.0002] # ALTERNATIVE KEY SYMBOL -2388 ; [*076F.0020.0002] # HELM SYMBOL -2389 ; [*0770.0020.0002] # CIRCLED HORIZONTAL BAR WITH NOTCH -238A ; [*0771.0020.0002] # CIRCLED TRIANGLE DOWN -238B ; [*0772.0020.0002] # BROKEN CIRCLE WITH NORTHWEST ARROW -238C ; [*0773.0020.0002] # UNDO SYMBOL -238D ; [*0774.0020.0002] # MONOSTABLE SYMBOL -238E ; [*0775.0020.0002] # HYSTERESIS SYMBOL -238F ; [*0776.0020.0002] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL -2390 ; [*0777.0020.0002] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL -2391 ; [*0778.0020.0002] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL -2392 ; [*0779.0020.0002] # PASSIVE-PULL-UP-OUTPUT SYMBOL -2393 ; [*077A.0020.0002] # DIRECT CURRENT SYMBOL FORM TWO -2394 ; [*077B.0020.0002] # SOFTWARE-FUNCTION SYMBOL -2395 ; [*077C.0020.0002] # APL FUNCTIONAL SYMBOL QUAD -2396 ; [*077D.0020.0002] # DECIMAL SEPARATOR KEY SYMBOL -2397 ; [*077E.0020.0002] # PREVIOUS PAGE -2398 ; [*077F.0020.0002] # NEXT PAGE -2399 ; [*0780.0020.0002] # PRINT SCREEN SYMBOL -239A ; [*0781.0020.0002] # CLEAR SCREEN SYMBOL -239B ; [*0782.0020.0002] # LEFT PARENTHESIS UPPER HOOK -239C ; [*0783.0020.0002] # LEFT PARENTHESIS EXTENSION -239D ; [*0784.0020.0002] # LEFT PARENTHESIS LOWER HOOK -239E ; [*0785.0020.0002] # RIGHT PARENTHESIS UPPER HOOK -239F ; [*0786.0020.0002] # RIGHT PARENTHESIS EXTENSION -23A0 ; [*0787.0020.0002] # RIGHT PARENTHESIS LOWER HOOK -23A1 ; [*0788.0020.0002] # LEFT SQUARE BRACKET UPPER CORNER -23A2 ; [*0789.0020.0002] # LEFT SQUARE BRACKET EXTENSION -23A3 ; [*078A.0020.0002] # LEFT SQUARE BRACKET LOWER CORNER -23A4 ; [*078B.0020.0002] # RIGHT SQUARE BRACKET UPPER CORNER -23A5 ; [*078C.0020.0002] # RIGHT SQUARE BRACKET EXTENSION -23A6 ; [*078D.0020.0002] # RIGHT SQUARE BRACKET LOWER CORNER -23A7 ; [*078E.0020.0002] # LEFT CURLY BRACKET UPPER HOOK -23A8 ; [*078F.0020.0002] # LEFT CURLY BRACKET MIDDLE PIECE -23A9 ; [*0790.0020.0002] # LEFT CURLY BRACKET LOWER HOOK -23AA ; [*0791.0020.0002] # CURLY BRACKET EXTENSION -23AB ; [*0792.0020.0002] # RIGHT CURLY BRACKET UPPER HOOK -23AC ; [*0793.0020.0002] # RIGHT CURLY BRACKET MIDDLE PIECE -23AD ; [*0794.0020.0002] # RIGHT CURLY BRACKET LOWER HOOK -23AE ; [*0795.0020.0002] # INTEGRAL EXTENSION -23AF ; [*0796.0020.0002] # HORIZONTAL LINE EXTENSION -23B0 ; [*0797.0020.0002] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION -23B1 ; [*0798.0020.0002] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION -23B2 ; [*0799.0020.0002] # SUMMATION TOP -23B3 ; [*079A.0020.0002] # SUMMATION BOTTOM -23B4 ; [*079B.0020.0002] # TOP SQUARE BRACKET -23B5 ; [*079C.0020.0002] # BOTTOM SQUARE BRACKET -23B6 ; [*079D.0020.0002] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET -23B7 ; [*079E.0020.0002] # RADICAL SYMBOL BOTTOM -23B8 ; [*079F.0020.0002] # LEFT VERTICAL BOX LINE -23B9 ; [*07A0.0020.0002] # RIGHT VERTICAL BOX LINE -23BA ; [*07A1.0020.0002] # HORIZONTAL SCAN LINE-1 -23BB ; [*07A2.0020.0002] # HORIZONTAL SCAN LINE-3 -23BC ; [*07A3.0020.0002] # HORIZONTAL SCAN LINE-7 -23BD ; [*07A4.0020.0002] # HORIZONTAL SCAN LINE-9 -23BE ; [*07A5.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT -23BF ; [*07A6.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT -23C0 ; [*07A7.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE -23C1 ; [*07A8.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE -23C2 ; [*07A9.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE -23C3 ; [*07AA.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE -23C4 ; [*07AB.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE -23C5 ; [*07AC.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE -23C6 ; [*07AD.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE -23C7 ; [*07AE.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE -23C8 ; [*07AF.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE -23C9 ; [*07B0.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL -23CA ; [*07B1.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL -23CB ; [*07B2.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT -23CC ; [*07B3.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT -23CD ; [*07B4.0020.0002] # SQUARE FOOT -23CE ; [*07B5.0020.0002] # RETURN SYMBOL -23CF ; [*07B6.0020.0002] # EJECT SYMBOL -23D0 ; [*07B7.0020.0002] # VERTICAL LINE EXTENSION -23D1 ; [*07B8.0020.0002] # METRICAL BREVE -23D2 ; [*07B9.0020.0002] # METRICAL LONG OVER SHORT -23D3 ; [*07BA.0020.0002] # METRICAL SHORT OVER LONG -23D4 ; [*07BB.0020.0002] # METRICAL LONG OVER TWO SHORTS -23D5 ; [*07BC.0020.0002] # METRICAL TWO SHORTS OVER LONG -23D6 ; [*07BD.0020.0002] # METRICAL TWO SHORTS JOINED -23D7 ; [*07BE.0020.0002] # METRICAL TRISEME -23D8 ; [*07BF.0020.0002] # METRICAL TETRASEME -23D9 ; [*07C0.0020.0002] # METRICAL PENTASEME -23DA ; [*07C1.0020.0002] # EARTH GROUND -23DB ; [*07C2.0020.0002] # FUSE -23DC ; [*07C3.0020.0002] # TOP PARENTHESIS -23DD ; [*07C4.0020.0002] # BOTTOM PARENTHESIS -23DE ; [*07C5.0020.0002] # TOP CURLY BRACKET -23DF ; [*07C6.0020.0002] # BOTTOM CURLY BRACKET -23E0 ; [*07C7.0020.0002] # TOP TORTOISE SHELL BRACKET -23E1 ; [*07C8.0020.0002] # BOTTOM TORTOISE SHELL BRACKET -23E2 ; [*07C9.0020.0002] # WHITE TRAPEZIUM -23E3 ; [*07CA.0020.0002] # BENZENE RING WITH CIRCLE -23E4 ; [*07CB.0020.0002] # STRAIGHTNESS -23E5 ; [*07CC.0020.0002] # FLATNESS -23E6 ; [*07CD.0020.0002] # AC CURRENT -23E7 ; [*07CE.0020.0002] # ELECTRICAL INTERSECTION -23E8 ; [*07CF.0020.0002] # DECIMAL EXPONENT SYMBOL -23E9 ; [*07D0.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE -23EA ; [*07D1.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE -23EB ; [*07D2.0020.0002] # BLACK UP-POINTING DOUBLE TRIANGLE -23EC ; [*07D3.0020.0002] # BLACK DOWN-POINTING DOUBLE TRIANGLE -23ED ; [*07D4.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR -23EE ; [*07D5.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR -23EF ; [*07D6.0020.0002] # BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR -23F0 ; [*07D7.0020.0002] # ALARM CLOCK -23F1 ; [*07D8.0020.0002] # STOPWATCH -23F2 ; [*07D9.0020.0002] # TIMER CLOCK -23F3 ; [*07DA.0020.0002] # HOURGLASS WITH FLOWING SAND -23F4 ; [*07DB.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE -23F5 ; [*07DC.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE -23F6 ; [*07DD.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE -23F7 ; [*07DE.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE -23F8 ; [*07DF.0020.0002] # DOUBLE VERTICAL BAR -23F9 ; [*07E0.0020.0002] # BLACK SQUARE FOR STOP -23FA ; [*07E1.0020.0002] # BLACK CIRCLE FOR RECORD -23FB ; [*07E2.0020.0002] # POWER SYMBOL -23FC ; [*07E3.0020.0002] # POWER ON-OFF SYMBOL -23FD ; [*07E4.0020.0002] # POWER ON SYMBOL -23FE ; [*07E5.0020.0002] # POWER SLEEP SYMBOL -2400 ; [*07E6.0020.0002] # SYMBOL FOR NULL -2401 ; [*07E7.0020.0002] # SYMBOL FOR START OF HEADING -2402 ; [*07E8.0020.0002] # SYMBOL FOR START OF TEXT -2403 ; [*07E9.0020.0002] # SYMBOL FOR END OF TEXT -2404 ; [*07EA.0020.0002] # SYMBOL FOR END OF TRANSMISSION -2405 ; [*07EB.0020.0002] # SYMBOL FOR ENQUIRY -2406 ; [*07EC.0020.0002] # SYMBOL FOR ACKNOWLEDGE -2407 ; [*07ED.0020.0002] # SYMBOL FOR BELL -2408 ; [*07EE.0020.0002] # SYMBOL FOR BACKSPACE -2409 ; [*07EF.0020.0002] # SYMBOL FOR HORIZONTAL TABULATION -240A ; [*07F0.0020.0002] # SYMBOL FOR LINE FEED -240B ; [*07F1.0020.0002] # SYMBOL FOR VERTICAL TABULATION -240C ; [*07F2.0020.0002] # SYMBOL FOR FORM FEED -240D ; [*07F3.0020.0002] # SYMBOL FOR CARRIAGE RETURN -240E ; [*07F4.0020.0002] # SYMBOL FOR SHIFT OUT -240F ; [*07F5.0020.0002] # SYMBOL FOR SHIFT IN -2410 ; [*07F6.0020.0002] # SYMBOL FOR DATA LINK ESCAPE -2411 ; [*07F7.0020.0002] # SYMBOL FOR DEVICE CONTROL ONE -2412 ; [*07F8.0020.0002] # SYMBOL FOR DEVICE CONTROL TWO -2413 ; [*07F9.0020.0002] # SYMBOL FOR DEVICE CONTROL THREE -2414 ; [*07FA.0020.0002] # SYMBOL FOR DEVICE CONTROL FOUR -2415 ; [*07FB.0020.0002] # SYMBOL FOR NEGATIVE ACKNOWLEDGE -2416 ; [*07FC.0020.0002] # SYMBOL FOR SYNCHRONOUS IDLE -2417 ; [*07FD.0020.0002] # SYMBOL FOR END OF TRANSMISSION BLOCK -2418 ; [*07FE.0020.0002] # SYMBOL FOR CANCEL -2419 ; [*07FF.0020.0002] # SYMBOL FOR END OF MEDIUM -241A ; [*0800.0020.0002] # SYMBOL FOR SUBSTITUTE -241B ; [*0801.0020.0002] # SYMBOL FOR ESCAPE -241C ; [*0802.0020.0002] # SYMBOL FOR FILE SEPARATOR -241D ; [*0803.0020.0002] # SYMBOL FOR GROUP SEPARATOR -241E ; [*0804.0020.0002] # SYMBOL FOR RECORD SEPARATOR -241F ; [*0805.0020.0002] # SYMBOL FOR UNIT SEPARATOR -2420 ; [*0806.0020.0002] # SYMBOL FOR SPACE -2421 ; [*0807.0020.0002] # SYMBOL FOR DELETE -2422 ; [*0808.0020.0002] # BLANK SYMBOL -2423 ; [*0809.0020.0002] # OPEN BOX -2424 ; [*080A.0020.0002] # SYMBOL FOR NEWLINE -2425 ; [*080B.0020.0002] # SYMBOL FOR DELETE FORM TWO -2426 ; [*080C.0020.0002] # SYMBOL FOR SUBSTITUTE FORM TWO -2440 ; [*080D.0020.0002] # OCR HOOK -2441 ; [*080E.0020.0002] # OCR CHAIR -2442 ; [*080F.0020.0002] # OCR FORK -2443 ; [*0810.0020.0002] # OCR INVERTED FORK -2444 ; [*0811.0020.0002] # OCR BELT BUCKLE -2445 ; [*0812.0020.0002] # OCR BOW TIE -2446 ; [*0813.0020.0002] # OCR BRANCH BANK IDENTIFICATION -2447 ; [*0814.0020.0002] # OCR AMOUNT OF CHECK -2448 ; [*0815.0020.0002] # OCR DASH -2449 ; [*0816.0020.0002] # OCR CUSTOMER ACCOUNT NUMBER -244A ; [*0817.0020.0002] # OCR DOUBLE BACKSLASH -2500 ; [*0818.0020.0002] # BOX DRAWINGS LIGHT HORIZONTAL -2501 ; [*0819.0020.0002] # BOX DRAWINGS HEAVY HORIZONTAL -2502 ; [*081A.0020.0002] # BOX DRAWINGS LIGHT VERTICAL -2503 ; [*081B.0020.0002] # BOX DRAWINGS HEAVY VERTICAL -2504 ; [*081C.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL -2505 ; [*081D.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL -2506 ; [*081E.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL -2507 ; [*081F.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL -2508 ; [*0820.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL -2509 ; [*0821.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL -250A ; [*0822.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL -250B ; [*0823.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL -250C ; [*0824.0020.0002] # BOX DRAWINGS LIGHT DOWN AND RIGHT -250D ; [*0825.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY -250E ; [*0826.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT -250F ; [*0827.0020.0002] # BOX DRAWINGS HEAVY DOWN AND RIGHT -2510 ; [*0828.0020.0002] # BOX DRAWINGS LIGHT DOWN AND LEFT -2511 ; [*0829.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY -2512 ; [*082A.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT -2513 ; [*082B.0020.0002] # BOX DRAWINGS HEAVY DOWN AND LEFT -2514 ; [*082C.0020.0002] # BOX DRAWINGS LIGHT UP AND RIGHT -2515 ; [*082D.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY -2516 ; [*082E.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT -2517 ; [*082F.0020.0002] # BOX DRAWINGS HEAVY UP AND RIGHT -2518 ; [*0830.0020.0002] # BOX DRAWINGS LIGHT UP AND LEFT -2519 ; [*0831.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY -251A ; [*0832.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT -251B ; [*0833.0020.0002] # BOX DRAWINGS HEAVY UP AND LEFT -251C ; [*0834.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT -251D ; [*0835.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY -251E ; [*0836.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT -251F ; [*0837.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT -2520 ; [*0838.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT -2521 ; [*0839.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY -2522 ; [*083A.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY -2523 ; [*083B.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT -2524 ; [*083C.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND LEFT -2525 ; [*083D.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY -2526 ; [*083E.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT -2527 ; [*083F.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT -2528 ; [*0840.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT -2529 ; [*0841.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY -252A ; [*0842.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY -252B ; [*0843.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND LEFT -252C ; [*0844.0020.0002] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL -252D ; [*0845.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT -252E ; [*0846.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT -252F ; [*0847.0020.0002] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY -2530 ; [*0848.0020.0002] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT -2531 ; [*0849.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY -2532 ; [*084A.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY -2533 ; [*084B.0020.0002] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL -2534 ; [*084C.0020.0002] # BOX DRAWINGS LIGHT UP AND HORIZONTAL -2535 ; [*084D.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT -2536 ; [*084E.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT -2537 ; [*084F.0020.0002] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY -2538 ; [*0850.0020.0002] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT -2539 ; [*0851.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY -253A ; [*0852.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY -253B ; [*0853.0020.0002] # BOX DRAWINGS HEAVY UP AND HORIZONTAL -253C ; [*0854.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL -253D ; [*0855.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT -253E ; [*0856.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT -253F ; [*0857.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY -2540 ; [*0858.0020.0002] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT -2541 ; [*0859.0020.0002] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT -2542 ; [*085A.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT -2543 ; [*085B.0020.0002] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT -2544 ; [*085C.0020.0002] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT -2545 ; [*085D.0020.0002] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT -2546 ; [*085E.0020.0002] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT -2547 ; [*085F.0020.0002] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY -2548 ; [*0860.0020.0002] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY -2549 ; [*0861.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY -254A ; [*0862.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY -254B ; [*0863.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL -254C ; [*0864.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL -254D ; [*0865.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL -254E ; [*0866.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL -254F ; [*0867.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL -2550 ; [*0868.0020.0002] # BOX DRAWINGS DOUBLE HORIZONTAL -2551 ; [*0869.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL -2552 ; [*086A.0020.0002] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE -2553 ; [*086B.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE -2554 ; [*086C.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND RIGHT -2555 ; [*086D.0020.0002] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE -2556 ; [*086E.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE -2557 ; [*086F.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND LEFT -2558 ; [*0870.0020.0002] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE -2559 ; [*0871.0020.0002] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE -255A ; [*0872.0020.0002] # BOX DRAWINGS DOUBLE UP AND RIGHT -255B ; [*0873.0020.0002] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE -255C ; [*0874.0020.0002] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE -255D ; [*0875.0020.0002] # BOX DRAWINGS DOUBLE UP AND LEFT -255E ; [*0876.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE -255F ; [*0877.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE -2560 ; [*0878.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT -2561 ; [*0879.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE -2562 ; [*087A.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE -2563 ; [*087B.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT -2564 ; [*087C.0020.0002] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE -2565 ; [*087D.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE -2566 ; [*087E.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL -2567 ; [*087F.0020.0002] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE -2568 ; [*0880.0020.0002] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE -2569 ; [*0881.0020.0002] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL -256A ; [*0882.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE -256B ; [*0883.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE -256C ; [*0884.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL -256D ; [*0885.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT -256E ; [*0886.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT -256F ; [*0887.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND LEFT -2570 ; [*0888.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND RIGHT -2571 ; [*0889.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT -2572 ; [*088A.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT -2573 ; [*088B.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL CROSS -2574 ; [*088C.0020.0002] # BOX DRAWINGS LIGHT LEFT -2575 ; [*088D.0020.0002] # BOX DRAWINGS LIGHT UP -2576 ; [*088E.0020.0002] # BOX DRAWINGS LIGHT RIGHT -2577 ; [*088F.0020.0002] # BOX DRAWINGS LIGHT DOWN -2578 ; [*0890.0020.0002] # BOX DRAWINGS HEAVY LEFT -2579 ; [*0891.0020.0002] # BOX DRAWINGS HEAVY UP -257A ; [*0892.0020.0002] # BOX DRAWINGS HEAVY RIGHT -257B ; [*0893.0020.0002] # BOX DRAWINGS HEAVY DOWN -257C ; [*0894.0020.0002] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT -257D ; [*0895.0020.0002] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN -257E ; [*0896.0020.0002] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT -257F ; [*0897.0020.0002] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN -2580 ; [*0898.0020.0002] # UPPER HALF BLOCK -2581 ; [*0899.0020.0002] # LOWER ONE EIGHTH BLOCK -2582 ; [*089A.0020.0002] # LOWER ONE QUARTER BLOCK -2583 ; [*089B.0020.0002] # LOWER THREE EIGHTHS BLOCK -2584 ; [*089C.0020.0002] # LOWER HALF BLOCK -2585 ; [*089D.0020.0002] # LOWER FIVE EIGHTHS BLOCK -2586 ; [*089E.0020.0002] # LOWER THREE QUARTERS BLOCK -2587 ; [*089F.0020.0002] # LOWER SEVEN EIGHTHS BLOCK -2588 ; [*08A0.0020.0002] # FULL BLOCK -2589 ; [*08A1.0020.0002] # LEFT SEVEN EIGHTHS BLOCK -258A ; [*08A2.0020.0002] # LEFT THREE QUARTERS BLOCK -258B ; [*08A3.0020.0002] # LEFT FIVE EIGHTHS BLOCK -258C ; [*08A4.0020.0002] # LEFT HALF BLOCK -258D ; [*08A5.0020.0002] # LEFT THREE EIGHTHS BLOCK -258E ; [*08A6.0020.0002] # LEFT ONE QUARTER BLOCK -258F ; [*08A7.0020.0002] # LEFT ONE EIGHTH BLOCK -2590 ; [*08A8.0020.0002] # RIGHT HALF BLOCK -2591 ; [*08A9.0020.0002] # LIGHT SHADE -2592 ; [*08AA.0020.0002] # MEDIUM SHADE -2593 ; [*08AB.0020.0002] # DARK SHADE -2594 ; [*08AC.0020.0002] # UPPER ONE EIGHTH BLOCK -2595 ; [*08AD.0020.0002] # RIGHT ONE EIGHTH BLOCK -2596 ; [*08AE.0020.0002] # QUADRANT LOWER LEFT -2597 ; [*08AF.0020.0002] # QUADRANT LOWER RIGHT -2598 ; [*08B0.0020.0002] # QUADRANT UPPER LEFT -2599 ; [*08B1.0020.0002] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT -259A ; [*08B2.0020.0002] # QUADRANT UPPER LEFT AND LOWER RIGHT -259B ; [*08B3.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT -259C ; [*08B4.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT -259D ; [*08B5.0020.0002] # QUADRANT UPPER RIGHT -259E ; [*08B6.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT -259F ; [*08B7.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT -25A0 ; [*08B8.0020.0002] # BLACK SQUARE -25A1 ; [*08B9.0020.0002] # WHITE SQUARE -25A2 ; [*08BA.0020.0002] # WHITE SQUARE WITH ROUNDED CORNERS -25A3 ; [*08BB.0020.0002] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE -25A4 ; [*08BC.0020.0002] # SQUARE WITH HORIZONTAL FILL -25A5 ; [*08BD.0020.0002] # SQUARE WITH VERTICAL FILL -25A6 ; [*08BE.0020.0002] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL -25A7 ; [*08BF.0020.0002] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL -25A8 ; [*08C0.0020.0002] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL -25A9 ; [*08C1.0020.0002] # SQUARE WITH DIAGONAL CROSSHATCH FILL -25AA ; [*08C2.0020.0002] # BLACK SMALL SQUARE -25AB ; [*08C3.0020.0002] # WHITE SMALL SQUARE -25AC ; [*08C4.0020.0002] # BLACK RECTANGLE -25AD ; [*08C5.0020.0002] # WHITE RECTANGLE -25AE ; [*08C6.0020.0002] # BLACK VERTICAL RECTANGLE -25AF ; [*08C7.0020.0002] # WHITE VERTICAL RECTANGLE -25B0 ; [*08C8.0020.0002] # BLACK PARALLELOGRAM -25B1 ; [*08C9.0020.0002] # WHITE PARALLELOGRAM -25B2 ; [*08CA.0020.0002] # BLACK UP-POINTING TRIANGLE -25B3 ; [*08CB.0020.0002] # WHITE UP-POINTING TRIANGLE -25B4 ; [*08CC.0020.0002] # BLACK UP-POINTING SMALL TRIANGLE -25B5 ; [*08CD.0020.0002] # WHITE UP-POINTING SMALL TRIANGLE -25B6 ; [*08CE.0020.0002] # BLACK RIGHT-POINTING TRIANGLE -25B7 ; [*08CF.0020.0002] # WHITE RIGHT-POINTING TRIANGLE -25B8 ; [*08D0.0020.0002] # BLACK RIGHT-POINTING SMALL TRIANGLE -25B9 ; [*08D1.0020.0002] # WHITE RIGHT-POINTING SMALL TRIANGLE -25BA ; [*08D2.0020.0002] # BLACK RIGHT-POINTING POINTER -25BB ; [*08D3.0020.0002] # WHITE RIGHT-POINTING POINTER -25BC ; [*08D4.0020.0002] # BLACK DOWN-POINTING TRIANGLE -25BD ; [*08D5.0020.0002] # WHITE DOWN-POINTING TRIANGLE -25BE ; [*08D6.0020.0002] # BLACK DOWN-POINTING SMALL TRIANGLE -25BF ; [*08D7.0020.0002] # WHITE DOWN-POINTING SMALL TRIANGLE -25C0 ; [*08D8.0020.0002] # BLACK LEFT-POINTING TRIANGLE -25C1 ; [*08D9.0020.0002] # WHITE LEFT-POINTING TRIANGLE -25C2 ; [*08DA.0020.0002] # BLACK LEFT-POINTING SMALL TRIANGLE -25C3 ; [*08DB.0020.0002] # WHITE LEFT-POINTING SMALL TRIANGLE -25C4 ; [*08DC.0020.0002] # BLACK LEFT-POINTING POINTER -25C5 ; [*08DD.0020.0002] # WHITE LEFT-POINTING POINTER -25C6 ; [*08DE.0020.0002] # BLACK DIAMOND -25C7 ; [*08DF.0020.0002] # WHITE DIAMOND -25C8 ; [*08E0.0020.0002] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND -25C9 ; [*08E1.0020.0002] # FISHEYE -25CA ; [*08E2.0020.0002] # LOZENGE -25CB ; [*08E3.0020.0002] # WHITE CIRCLE -25CC ; [*08E4.0020.0002] # DOTTED CIRCLE -25CD ; [*08E5.0020.0002] # CIRCLE WITH VERTICAL FILL -25CE ; [*08E6.0020.0002] # BULLSEYE -25CF ; [*08E7.0020.0002] # BLACK CIRCLE -25D0 ; [*08E8.0020.0002] # CIRCLE WITH LEFT HALF BLACK -25D1 ; [*08E9.0020.0002] # CIRCLE WITH RIGHT HALF BLACK -25D2 ; [*08EA.0020.0002] # CIRCLE WITH LOWER HALF BLACK -25D3 ; [*08EB.0020.0002] # CIRCLE WITH UPPER HALF BLACK -25D4 ; [*08EC.0020.0002] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK -25D5 ; [*08ED.0020.0002] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK -25D6 ; [*08EE.0020.0002] # LEFT HALF BLACK CIRCLE -25D7 ; [*08EF.0020.0002] # RIGHT HALF BLACK CIRCLE -25D8 ; [*08F0.0020.0002] # INVERSE BULLET -25D9 ; [*08F1.0020.0002] # INVERSE WHITE CIRCLE -25DA ; [*08F2.0020.0002] # UPPER HALF INVERSE WHITE CIRCLE -25DB ; [*08F3.0020.0002] # LOWER HALF INVERSE WHITE CIRCLE -25DC ; [*08F4.0020.0002] # UPPER LEFT QUADRANT CIRCULAR ARC -25DD ; [*08F5.0020.0002] # UPPER RIGHT QUADRANT CIRCULAR ARC -25DE ; [*08F6.0020.0002] # LOWER RIGHT QUADRANT CIRCULAR ARC -25DF ; [*08F7.0020.0002] # LOWER LEFT QUADRANT CIRCULAR ARC -25E0 ; [*08F8.0020.0002] # UPPER HALF CIRCLE -25E1 ; [*08F9.0020.0002] # LOWER HALF CIRCLE -25E2 ; [*08FA.0020.0002] # BLACK LOWER RIGHT TRIANGLE -25E3 ; [*08FB.0020.0002] # BLACK LOWER LEFT TRIANGLE -25E4 ; [*08FC.0020.0002] # BLACK UPPER LEFT TRIANGLE -25E5 ; [*08FD.0020.0002] # BLACK UPPER RIGHT TRIANGLE -25E6 ; [*08FE.0020.0002] # WHITE BULLET -25E7 ; [*08FF.0020.0002] # SQUARE WITH LEFT HALF BLACK -25E8 ; [*0900.0020.0002] # SQUARE WITH RIGHT HALF BLACK -25E9 ; [*0901.0020.0002] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK -25EA ; [*0902.0020.0002] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK -25EB ; [*0903.0020.0002] # WHITE SQUARE WITH VERTICAL BISECTING LINE -25EC ; [*0904.0020.0002] # WHITE UP-POINTING TRIANGLE WITH DOT -25ED ; [*0905.0020.0002] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK -25EE ; [*0906.0020.0002] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK -25EF ; [*0907.0020.0002] # LARGE CIRCLE -25F0 ; [*0908.0020.0002] # WHITE SQUARE WITH UPPER LEFT QUADRANT -25F1 ; [*0909.0020.0002] # WHITE SQUARE WITH LOWER LEFT QUADRANT -25F2 ; [*090A.0020.0002] # WHITE SQUARE WITH LOWER RIGHT QUADRANT -25F3 ; [*090B.0020.0002] # WHITE SQUARE WITH UPPER RIGHT QUADRANT -25F4 ; [*090C.0020.0002] # WHITE CIRCLE WITH UPPER LEFT QUADRANT -25F5 ; [*090D.0020.0002] # WHITE CIRCLE WITH LOWER LEFT QUADRANT -25F6 ; [*090E.0020.0002] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT -25F7 ; [*090F.0020.0002] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8 ; [*0910.0020.0002] # UPPER LEFT TRIANGLE -25F9 ; [*0911.0020.0002] # UPPER RIGHT TRIANGLE -25FA ; [*0912.0020.0002] # LOWER LEFT TRIANGLE -25FB ; [*0913.0020.0002] # WHITE MEDIUM SQUARE -25FC ; [*0914.0020.0002] # BLACK MEDIUM SQUARE -25FD ; [*0915.0020.0002] # WHITE MEDIUM SMALL SQUARE -25FE ; [*0916.0020.0002] # BLACK MEDIUM SMALL SQUARE -25FF ; [*0917.0020.0002] # LOWER RIGHT TRIANGLE -2600 ; [*0918.0020.0002] # BLACK SUN WITH RAYS -2601 ; [*0919.0020.0002] # CLOUD -2602 ; [*091A.0020.0002] # UMBRELLA -2603 ; [*091B.0020.0002] # SNOWMAN -2604 ; [*091C.0020.0002] # COMET -2605 ; [*091D.0020.0002] # BLACK STAR -2606 ; [*091E.0020.0002] # WHITE STAR -2607 ; [*091F.0020.0002] # LIGHTNING -2608 ; [*0920.0020.0002] # THUNDERSTORM -2609 ; [*0921.0020.0002] # SUN -260A ; [*0922.0020.0002] # ASCENDING NODE -260B ; [*0923.0020.0002] # DESCENDING NODE -260C ; [*0924.0020.0002] # CONJUNCTION -260D ; [*0925.0020.0002] # OPPOSITION -260E ; [*0926.0020.0002] # BLACK TELEPHONE -260F ; [*0927.0020.0002] # WHITE TELEPHONE -2610 ; [*0928.0020.0002] # BALLOT BOX -2611 ; [*0929.0020.0002] # BALLOT BOX WITH CHECK -2612 ; [*092A.0020.0002] # BALLOT BOX WITH X -2613 ; [*092B.0020.0002] # SALTIRE -2614 ; [*092C.0020.0002] # UMBRELLA WITH RAIN DROPS -2615 ; [*092D.0020.0002] # HOT BEVERAGE -2616 ; [*092E.0020.0002] # WHITE SHOGI PIECE -2617 ; [*092F.0020.0002] # BLACK SHOGI PIECE -2618 ; [*0930.0020.0002] # SHAMROCK -2619 ; [*0931.0020.0002] # REVERSED ROTATED FLORAL HEART BULLET -261A ; [*0932.0020.0002] # BLACK LEFT POINTING INDEX -261B ; [*0933.0020.0002] # BLACK RIGHT POINTING INDEX -261C ; [*0934.0020.0002] # WHITE LEFT POINTING INDEX -261D ; [*0935.0020.0002] # WHITE UP POINTING INDEX -261E ; [*0936.0020.0002] # WHITE RIGHT POINTING INDEX -261F ; [*0937.0020.0002] # WHITE DOWN POINTING INDEX -2620 ; [*0938.0020.0002] # SKULL AND CROSSBONES -2621 ; [*0939.0020.0002] # CAUTION SIGN -2622 ; [*093A.0020.0002] # RADIOACTIVE SIGN -2623 ; [*093B.0020.0002] # BIOHAZARD SIGN -2624 ; [*093C.0020.0002] # CADUCEUS -2625 ; [*093D.0020.0002] # ANKH -2626 ; [*093E.0020.0002] # ORTHODOX CROSS -2627 ; [*093F.0020.0002] # CHI RHO -2628 ; [*0940.0020.0002] # CROSS OF LORRAINE -2629 ; [*0941.0020.0002] # CROSS OF JERUSALEM -262A ; [*0942.0020.0002] # STAR AND CRESCENT -262B ; [*0943.0020.0002] # FARSI SYMBOL -262C ; [*0944.0020.0002] # ADI SHAKTI -262D ; [*0945.0020.0002] # HAMMER AND SICKLE -262E ; [*0946.0020.0002] # PEACE SYMBOL -262F ; [*0947.0020.0002] # YIN YANG -2630 ; [*0EA2.0020.0002] # TRIGRAM FOR HEAVEN -2631 ; [*0EA3.0020.0002] # TRIGRAM FOR LAKE -2632 ; [*0EA4.0020.0002] # TRIGRAM FOR FIRE -2633 ; [*0EA5.0020.0002] # TRIGRAM FOR THUNDER -2634 ; [*0EA6.0020.0002] # TRIGRAM FOR WIND -2635 ; [*0EA7.0020.0002] # TRIGRAM FOR WATER -2636 ; [*0EA8.0020.0002] # TRIGRAM FOR MOUNTAIN -2637 ; [*0EA9.0020.0002] # TRIGRAM FOR EARTH -2638 ; [*0948.0020.0002] # WHEEL OF DHARMA -2639 ; [*0949.0020.0002] # WHITE FROWNING FACE -263A ; [*094A.0020.0002] # WHITE SMILING FACE -263B ; [*094B.0020.0002] # BLACK SMILING FACE -263C ; [*094C.0020.0002] # WHITE SUN WITH RAYS -263D ; [*094D.0020.0002] # FIRST QUARTER MOON -263E ; [*094E.0020.0002] # LAST QUARTER MOON -263F ; [*094F.0020.0002] # MERCURY -2640 ; [*0950.0020.0002] # FEMALE SIGN -2641 ; [*0951.0020.0002] # EARTH -2642 ; [*0952.0020.0002] # MALE SIGN -2643 ; [*0953.0020.0002] # JUPITER -2644 ; [*0954.0020.0002] # SATURN -2645 ; [*0955.0020.0002] # URANUS -2646 ; [*0956.0020.0002] # NEPTUNE -2647 ; [*0957.0020.0002] # PLUTO -2648 ; [*0958.0020.0002] # ARIES -2649 ; [*0959.0020.0002] # TAURUS -264A ; [*095A.0020.0002] # GEMINI -264B ; [*095B.0020.0002] # CANCER -264C ; [*095C.0020.0002] # LEO -264D ; [*095D.0020.0002] # VIRGO -264E ; [*095E.0020.0002] # LIBRA -264F ; [*095F.0020.0002] # SCORPIUS -2650 ; [*0960.0020.0002] # SAGITTARIUS -2651 ; [*0961.0020.0002] # CAPRICORN -2652 ; [*0962.0020.0002] # AQUARIUS -2653 ; [*0963.0020.0002] # PISCES -2654 ; [*0964.0020.0002] # WHITE CHESS KING -2655 ; [*0965.0020.0002] # WHITE CHESS QUEEN -2656 ; [*0966.0020.0002] # WHITE CHESS ROOK -2657 ; [*0967.0020.0002] # WHITE CHESS BISHOP -2658 ; [*0968.0020.0002] # WHITE CHESS KNIGHT -2659 ; [*0969.0020.0002] # WHITE CHESS PAWN -265A ; [*096A.0020.0002] # BLACK CHESS KING -265B ; [*096B.0020.0002] # BLACK CHESS QUEEN -265C ; [*096C.0020.0002] # BLACK CHESS ROOK -265D ; [*096D.0020.0002] # BLACK CHESS BISHOP -265E ; [*096E.0020.0002] # BLACK CHESS KNIGHT -265F ; [*096F.0020.0002] # BLACK CHESS PAWN -2660 ; [*0970.0020.0002] # BLACK SPADE SUIT -2661 ; [*0971.0020.0002] # WHITE HEART SUIT -2662 ; [*0972.0020.0002] # WHITE DIAMOND SUIT -2663 ; [*0973.0020.0002] # BLACK CLUB SUIT -2664 ; [*0974.0020.0002] # WHITE SPADE SUIT -2665 ; [*0975.0020.0002] # BLACK HEART SUIT -2666 ; [*0976.0020.0002] # BLACK DIAMOND SUIT -2667 ; [*0977.0020.0002] # WHITE CLUB SUIT -2668 ; [*0978.0020.0002] # HOT SPRINGS -2669 ; [*0979.0020.0002] # QUARTER NOTE -266A ; [*097A.0020.0002] # EIGHTH NOTE -266B ; [*097B.0020.0002] # BEAMED EIGHTH NOTES -266C ; [*097C.0020.0002] # BEAMED SIXTEENTH NOTES -266D ; [*10F3.0020.0002] # MUSIC FLAT SIGN -266E ; [*10F4.0020.0002] # MUSIC NATURAL SIGN -266F ; [*10F5.0020.0002] # MUSIC SHARP SIGN -2670 ; [*097D.0020.0002] # WEST SYRIAC CROSS -2671 ; [*097E.0020.0002] # EAST SYRIAC CROSS -2672 ; [*097F.0020.0002] # UNIVERSAL RECYCLING SYMBOL -2673 ; [*0980.0020.0002] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS -2674 ; [*0981.0020.0002] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS -2675 ; [*0982.0020.0002] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS -2676 ; [*0983.0020.0002] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS -2677 ; [*0984.0020.0002] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS -2678 ; [*0985.0020.0002] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS -2679 ; [*0986.0020.0002] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS -267A ; [*0987.0020.0002] # RECYCLING SYMBOL FOR GENERIC MATERIALS -267B ; [*0988.0020.0002] # BLACK UNIVERSAL RECYCLING SYMBOL -267C ; [*0989.0020.0002] # RECYCLED PAPER SYMBOL -267D ; [*098A.0020.0002] # PARTIALLY-RECYCLED PAPER SYMBOL -267E ; [*098B.0020.0002] # PERMANENT PAPER SIGN -267F ; [*098C.0020.0002] # WHEELCHAIR SYMBOL -2680 ; [*098D.0020.0002] # DIE FACE-1 -2681 ; [*098E.0020.0002] # DIE FACE-2 -2682 ; [*098F.0020.0002] # DIE FACE-3 -2683 ; [*0990.0020.0002] # DIE FACE-4 -2684 ; [*0991.0020.0002] # DIE FACE-5 -2685 ; [*0992.0020.0002] # DIE FACE-6 -2686 ; [*0993.0020.0002] # WHITE CIRCLE WITH DOT RIGHT -2687 ; [*0994.0020.0002] # WHITE CIRCLE WITH TWO DOTS -2688 ; [*0995.0020.0002] # BLACK CIRCLE WITH WHITE DOT RIGHT -2689 ; [*0996.0020.0002] # BLACK CIRCLE WITH TWO WHITE DOTS -268A ; [*0E9C.0020.0002] # MONOGRAM FOR YANG -268B ; [*0E9D.0020.0002] # MONOGRAM FOR YIN -268C ; [*0E9E.0020.0002] # DIGRAM FOR GREATER YANG -268D ; [*0E9F.0020.0002] # DIGRAM FOR LESSER YIN -268E ; [*0EA0.0020.0002] # DIGRAM FOR LESSER YANG -268F ; [*0EA1.0020.0002] # DIGRAM FOR GREATER YIN -2690 ; [*0997.0020.0002] # WHITE FLAG -2691 ; [*0998.0020.0002] # BLACK FLAG -2692 ; [*0999.0020.0002] # HAMMER AND PICK -2693 ; [*099A.0020.0002] # ANCHOR -2694 ; [*099B.0020.0002] # CROSSED SWORDS -2695 ; [*099C.0020.0002] # STAFF OF AESCULAPIUS -2696 ; [*099D.0020.0002] # SCALES -2697 ; [*099E.0020.0002] # ALEMBIC -2698 ; [*099F.0020.0002] # FLOWER -2699 ; [*09A0.0020.0002] # GEAR -269A ; [*09A1.0020.0002] # STAFF OF HERMES -269B ; [*09A2.0020.0002] # ATOM SYMBOL -269C ; [*09A3.0020.0002] # FLEUR-DE-LIS -269D ; [*09A4.0020.0002] # OUTLINED WHITE STAR -269E ; [*09A5.0020.0002] # THREE LINES CONVERGING RIGHT -269F ; [*09A6.0020.0002] # THREE LINES CONVERGING LEFT -26A0 ; [*09A7.0020.0002] # WARNING SIGN -26A1 ; [*09A8.0020.0002] # HIGH VOLTAGE SIGN -26A2 ; [*09A9.0020.0002] # DOUBLED FEMALE SIGN -26A3 ; [*09AA.0020.0002] # DOUBLED MALE SIGN -26A4 ; [*09AB.0020.0002] # INTERLOCKED FEMALE AND MALE SIGN -26A5 ; [*09AC.0020.0002] # MALE AND FEMALE SIGN -26A6 ; [*09AD.0020.0002] # MALE WITH STROKE SIGN -26A7 ; [*09AE.0020.0002] # MALE WITH STROKE AND MALE AND FEMALE SIGN -26A8 ; [*09AF.0020.0002] # VERTICAL MALE WITH STROKE SIGN -26A9 ; [*09B0.0020.0002] # HORIZONTAL MALE WITH STROKE SIGN -26AA ; [*09B1.0020.0002] # MEDIUM WHITE CIRCLE -26AB ; [*09B2.0020.0002] # MEDIUM BLACK CIRCLE -26AC ; [*09B3.0020.0002] # MEDIUM SMALL WHITE CIRCLE -26AD ; [*09B4.0020.0002] # MARRIAGE SYMBOL -26AE ; [*09B5.0020.0002] # DIVORCE SYMBOL -26AF ; [*09B6.0020.0002] # UNMARRIED PARTNERSHIP SYMBOL -26B0 ; [*09B7.0020.0002] # COFFIN -26B1 ; [*09B8.0020.0002] # FUNERAL URN -26B2 ; [*09B9.0020.0002] # NEUTER -26B3 ; [*09BA.0020.0002] # CERES -26B4 ; [*09BB.0020.0002] # PALLAS -26B5 ; [*09BC.0020.0002] # JUNO -26B6 ; [*09BD.0020.0002] # VESTA -26B7 ; [*09BE.0020.0002] # CHIRON -26B8 ; [*09BF.0020.0002] # BLACK MOON LILITH -26B9 ; [*09C0.0020.0002] # SEXTILE -26BA ; [*09C1.0020.0002] # SEMISEXTILE -26BB ; [*09C2.0020.0002] # QUINCUNX -26BC ; [*09C3.0020.0002] # SESQUIQUADRATE -26BD ; [*09C4.0020.0002] # SOCCER BALL -26BE ; [*09C5.0020.0002] # BASEBALL -26BF ; [*09C6.0020.0002] # SQUARED KEY -26C0 ; [*09C7.0020.0002] # WHITE DRAUGHTS MAN -26C1 ; [*09C8.0020.0002] # WHITE DRAUGHTS KING -26C2 ; [*09C9.0020.0002] # BLACK DRAUGHTS MAN -26C3 ; [*09CA.0020.0002] # BLACK DRAUGHTS KING -26C4 ; [*09CB.0020.0002] # SNOWMAN WITHOUT SNOW -26C5 ; [*09CC.0020.0002] # SUN BEHIND CLOUD -26C6 ; [*09CD.0020.0002] # RAIN -26C7 ; [*09CE.0020.0002] # BLACK SNOWMAN -26C8 ; [*09CF.0020.0002] # THUNDER CLOUD AND RAIN -26C9 ; [*09D0.0020.0002] # TURNED WHITE SHOGI PIECE -26CA ; [*09D1.0020.0002] # TURNED BLACK SHOGI PIECE -26CB ; [*09D2.0020.0002] # WHITE DIAMOND IN SQUARE -26CC ; [*09D3.0020.0002] # CROSSING LANES -26CD ; [*09D4.0020.0002] # DISABLED CAR -26CE ; [*09D5.0020.0002] # OPHIUCHUS -26CF ; [*09D6.0020.0002] # PICK -26D0 ; [*09D7.0020.0002] # CAR SLIDING -26D1 ; [*09D8.0020.0002] # HELMET WITH WHITE CROSS -26D2 ; [*09D9.0020.0002] # CIRCLED CROSSING LANES -26D3 ; [*09DA.0020.0002] # CHAINS -26D4 ; [*09DB.0020.0002] # NO ENTRY -26D5 ; [*09DC.0020.0002] # ALTERNATE ONE-WAY LEFT WAY TRAFFIC -26D6 ; [*09DD.0020.0002] # BLACK TWO-WAY LEFT WAY TRAFFIC -26D7 ; [*09DE.0020.0002] # WHITE TWO-WAY LEFT WAY TRAFFIC -26D8 ; [*09DF.0020.0002] # BLACK LEFT LANE MERGE -26D9 ; [*09E0.0020.0002] # WHITE LEFT LANE MERGE -26DA ; [*09E1.0020.0002] # DRIVE SLOW SIGN -26DB ; [*09E2.0020.0002] # HEAVY WHITE DOWN-POINTING TRIANGLE -26DC ; [*09E3.0020.0002] # LEFT CLOSED ENTRY -26DD ; [*09E4.0020.0002] # SQUARED SALTIRE -26DE ; [*09E5.0020.0002] # FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE -26DF ; [*09E6.0020.0002] # BLACK TRUCK -26E0 ; [*09E7.0020.0002] # RESTRICTED LEFT ENTRY-1 -26E1 ; [*09E8.0020.0002] # RESTRICTED LEFT ENTRY-2 -26E2 ; [*09E9.0020.0002] # ASTRONOMICAL SYMBOL FOR URANUS -26E3 ; [*09EA.0020.0002] # HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE -26E4 ; [*09EB.0020.0002] # PENTAGRAM -26E5 ; [*09EC.0020.0002] # RIGHT-HANDED INTERLACED PENTAGRAM -26E6 ; [*09ED.0020.0002] # LEFT-HANDED INTERLACED PENTAGRAM -26E7 ; [*09EE.0020.0002] # INVERTED PENTAGRAM -26E8 ; [*09EF.0020.0002] # BLACK CROSS ON SHIELD -26E9 ; [*09F0.0020.0002] # SHINTO SHRINE -26EA ; [*09F1.0020.0002] # CHURCH -26EB ; [*09F2.0020.0002] # CASTLE -26EC ; [*09F3.0020.0002] # HISTORIC SITE -26ED ; [*09F4.0020.0002] # GEAR WITHOUT HUB -26EE ; [*09F5.0020.0002] # GEAR WITH HANDLES -26EF ; [*09F6.0020.0002] # MAP SYMBOL FOR LIGHTHOUSE -26F0 ; [*09F7.0020.0002] # MOUNTAIN -26F1 ; [*09F8.0020.0002] # UMBRELLA ON GROUND -26F2 ; [*09F9.0020.0002] # FOUNTAIN -26F3 ; [*09FA.0020.0002] # FLAG IN HOLE -26F4 ; [*09FB.0020.0002] # FERRY -26F5 ; [*09FC.0020.0002] # SAILBOAT -26F6 ; [*09FD.0020.0002] # SQUARE FOUR CORNERS -26F7 ; [*09FE.0020.0002] # SKIER -26F8 ; [*09FF.0020.0002] # ICE SKATE -26F9 ; [*0A00.0020.0002] # PERSON WITH BALL -26FA ; [*0A01.0020.0002] # TENT -26FB ; [*0A02.0020.0002] # JAPANESE BANK SYMBOL -26FC ; [*0A03.0020.0002] # HEADSTONE GRAVEYARD SYMBOL -26FD ; [*0A04.0020.0002] # FUEL PUMP -26FE ; [*0A05.0020.0002] # CUP ON BLACK SQUARE -26FF ; [*0A06.0020.0002] # WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE -2700 ; [*0A21.0020.0002] # BLACK SAFETY SCISSORS -2701 ; [*0A22.0020.0002] # UPPER BLADE SCISSORS -2702 ; [*0A23.0020.0002] # BLACK SCISSORS -2703 ; [*0A24.0020.0002] # LOWER BLADE SCISSORS -2704 ; [*0A25.0020.0002] # WHITE SCISSORS -2705 ; [*0A26.0020.0002] # WHITE HEAVY CHECK MARK -2706 ; [*0A27.0020.0002] # TELEPHONE LOCATION SIGN -2707 ; [*0A28.0020.0002] # TAPE DRIVE -2708 ; [*0A29.0020.0002] # AIRPLANE -2709 ; [*0A2A.0020.0002] # ENVELOPE -270A ; [*0A2B.0020.0002] # RAISED FIST -270B ; [*0A2C.0020.0002] # RAISED HAND -270C ; [*0A2D.0020.0002] # VICTORY HAND -270D ; [*0A2E.0020.0002] # WRITING HAND -270E ; [*0A2F.0020.0002] # LOWER RIGHT PENCIL -270F ; [*0A30.0020.0002] # PENCIL -2710 ; [*0A31.0020.0002] # UPPER RIGHT PENCIL -2711 ; [*0A32.0020.0002] # WHITE NIB -2712 ; [*0A33.0020.0002] # BLACK NIB -2713 ; [*0A34.0020.0002] # CHECK MARK -2714 ; [*0A35.0020.0002] # HEAVY CHECK MARK -2715 ; [*0A36.0020.0002] # MULTIPLICATION X -2716 ; [*0A37.0020.0002] # HEAVY MULTIPLICATION X -2717 ; [*0A38.0020.0002] # BALLOT X -2718 ; [*0A39.0020.0002] # HEAVY BALLOT X -2719 ; [*0A3A.0020.0002] # OUTLINED GREEK CROSS -271A ; [*0A3B.0020.0002] # HEAVY GREEK CROSS -271B ; [*0A3C.0020.0002] # OPEN CENTRE CROSS -271C ; [*0A3D.0020.0002] # HEAVY OPEN CENTRE CROSS -271D ; [*0A3E.0020.0002] # LATIN CROSS -271E ; [*0A3F.0020.0002] # SHADOWED WHITE LATIN CROSS -271F ; [*0A40.0020.0002] # OUTLINED LATIN CROSS -2720 ; [*0A41.0020.0002] # MALTESE CROSS -2721 ; [*0A42.0020.0002] # STAR OF DAVID -2722 ; [*0A43.0020.0002] # FOUR TEARDROP-SPOKED ASTERISK -2723 ; [*0A44.0020.0002] # FOUR BALLOON-SPOKED ASTERISK -2724 ; [*0A45.0020.0002] # HEAVY FOUR BALLOON-SPOKED ASTERISK -2725 ; [*0A46.0020.0002] # FOUR CLUB-SPOKED ASTERISK -2726 ; [*0A47.0020.0002] # BLACK FOUR POINTED STAR -2727 ; [*0A48.0020.0002] # WHITE FOUR POINTED STAR -2728 ; [*0A49.0020.0002] # SPARKLES -2729 ; [*0A4A.0020.0002] # STRESS OUTLINED WHITE STAR -272A ; [*0A4B.0020.0002] # CIRCLED WHITE STAR -272B ; [*0A4C.0020.0002] # OPEN CENTRE BLACK STAR -272C ; [*0A4D.0020.0002] # BLACK CENTRE WHITE STAR -272D ; [*0A4E.0020.0002] # OUTLINED BLACK STAR -272E ; [*0A4F.0020.0002] # HEAVY OUTLINED BLACK STAR -272F ; [*0A50.0020.0002] # PINWHEEL STAR -2730 ; [*0A51.0020.0002] # SHADOWED WHITE STAR -2731 ; [*0A52.0020.0002] # HEAVY ASTERISK -2732 ; [*0A53.0020.0002] # OPEN CENTRE ASTERISK -2733 ; [*0A54.0020.0002] # EIGHT SPOKED ASTERISK -2734 ; [*0A55.0020.0002] # EIGHT POINTED BLACK STAR -2735 ; [*0A56.0020.0002] # EIGHT POINTED PINWHEEL STAR -2736 ; [*0A57.0020.0002] # SIX POINTED BLACK STAR -2737 ; [*0A58.0020.0002] # EIGHT POINTED RECTILINEAR BLACK STAR -2738 ; [*0A59.0020.0002] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR -2739 ; [*0A5A.0020.0002] # TWELVE POINTED BLACK STAR -273A ; [*0A5B.0020.0002] # SIXTEEN POINTED ASTERISK -273B ; [*0A5C.0020.0002] # TEARDROP-SPOKED ASTERISK -273C ; [*0A5D.0020.0002] # OPEN CENTRE TEARDROP-SPOKED ASTERISK -273D ; [*0A5E.0020.0002] # HEAVY TEARDROP-SPOKED ASTERISK -273E ; [*0A5F.0020.0002] # SIX PETALLED BLACK AND WHITE FLORETTE -273F ; [*0A60.0020.0002] # BLACK FLORETTE -2740 ; [*0A61.0020.0002] # WHITE FLORETTE -2741 ; [*0A62.0020.0002] # EIGHT PETALLED OUTLINED BLACK FLORETTE -2742 ; [*0A63.0020.0002] # CIRCLED OPEN CENTRE EIGHT POINTED STAR -2743 ; [*0A64.0020.0002] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK -2744 ; [*0A65.0020.0002] # SNOWFLAKE -2745 ; [*0A66.0020.0002] # TIGHT TRIFOLIATE SNOWFLAKE -2746 ; [*0A67.0020.0002] # HEAVY CHEVRON SNOWFLAKE -2747 ; [*0A68.0020.0002] # SPARKLE -2748 ; [*0A69.0020.0002] # HEAVY SPARKLE -2749 ; [*0A6A.0020.0002] # BALLOON-SPOKED ASTERISK -274A ; [*0A6B.0020.0002] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274B ; [*0A6C.0020.0002] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274C ; [*0A6D.0020.0002] # CROSS MARK -274D ; [*0A6E.0020.0002] # SHADOWED WHITE CIRCLE -274E ; [*0A6F.0020.0002] # NEGATIVE SQUARED CROSS MARK -274F ; [*0A70.0020.0002] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE -2750 ; [*0A71.0020.0002] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE -2751 ; [*0A72.0020.0002] # LOWER RIGHT SHADOWED WHITE SQUARE -2752 ; [*0A73.0020.0002] # UPPER RIGHT SHADOWED WHITE SQUARE -2753 ; [*0A74.0020.0002] # BLACK QUESTION MARK ORNAMENT -2754 ; [*0A75.0020.0002] # WHITE QUESTION MARK ORNAMENT -2755 ; [*0A76.0020.0002] # WHITE EXCLAMATION MARK ORNAMENT -2756 ; [*0A77.0020.0002] # BLACK DIAMOND MINUS WHITE X -2757 ; [*0A78.0020.0002] # HEAVY EXCLAMATION MARK SYMBOL -2758 ; [*0A79.0020.0002] # LIGHT VERTICAL BAR -2759 ; [*0A7A.0020.0002] # MEDIUM VERTICAL BAR -275A ; [*0A7B.0020.0002] # HEAVY VERTICAL BAR -275B ; [*0A7C.0020.0002] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT -275C ; [*0A7D.0020.0002] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT -275D ; [*0A7E.0020.0002] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT -275E ; [*0A7F.0020.0002] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -275F ; [*0A80.0020.0002] # HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT -2760 ; [*0A81.0020.0002] # HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT -2761 ; [*0A82.0020.0002] # CURVED STEM PARAGRAPH SIGN ORNAMENT -2762 ; [*0A83.0020.0002] # HEAVY EXCLAMATION MARK ORNAMENT -2763 ; [*0A84.0020.0002] # HEAVY HEART EXCLAMATION MARK ORNAMENT -2764 ; [*0A85.0020.0002] # HEAVY BLACK HEART -2765 ; [*0A86.0020.0002] # ROTATED HEAVY BLACK HEART BULLET -2766 ; [*0A87.0020.0002] # FLORAL HEART -2767 ; [*0A88.0020.0002] # ROTATED FLORAL HEART BULLET -2768 ; [*034D.0020.0002] # MEDIUM LEFT PARENTHESIS ORNAMENT -2769 ; [*034E.0020.0002] # MEDIUM RIGHT PARENTHESIS ORNAMENT -276A ; [*034F.0020.0002] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276B ; [*0350.0020.0002] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276C ; [*0351.0020.0002] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276D ; [*0352.0020.0002] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276E ; [*0353.0020.0002] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -276F ; [*0354.0020.0002] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770 ; [*0355.0020.0002] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2771 ; [*0356.0020.0002] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2772 ; [*0357.0020.0002] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -2773 ; [*0358.0020.0002] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -2774 ; [*0359.0020.0002] # MEDIUM LEFT CURLY BRACKET ORNAMENT -2775 ; [*035A.0020.0002] # MEDIUM RIGHT CURLY BRACKET ORNAMENT -2794 ; [*0A89.0020.0002] # HEAVY WIDE-HEADED RIGHTWARDS ARROW -2795 ; [*0A8A.0020.0002] # HEAVY PLUS SIGN -2796 ; [*0A8B.0020.0002] # HEAVY MINUS SIGN -2797 ; [*0A8C.0020.0002] # HEAVY DIVISION SIGN -2798 ; [*0A8D.0020.0002] # HEAVY SOUTH EAST ARROW -2799 ; [*0A8E.0020.0002] # HEAVY RIGHTWARDS ARROW -279A ; [*0A8F.0020.0002] # HEAVY NORTH EAST ARROW -279B ; [*0A90.0020.0002] # DRAFTING POINT RIGHTWARDS ARROW -279C ; [*0A91.0020.0002] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW -279D ; [*0A92.0020.0002] # TRIANGLE-HEADED RIGHTWARDS ARROW -279E ; [*0A93.0020.0002] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW -279F ; [*0A94.0020.0002] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW -27A0 ; [*0A95.0020.0002] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW -27A1 ; [*0A96.0020.0002] # BLACK RIGHTWARDS ARROW -27A2 ; [*0A97.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD -27A3 ; [*0A98.0020.0002] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD -27A4 ; [*0A99.0020.0002] # BLACK RIGHTWARDS ARROWHEAD -27A5 ; [*0A9A.0020.0002] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW -27A6 ; [*0A9B.0020.0002] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW -27A7 ; [*0A9C.0020.0002] # SQUAT BLACK RIGHTWARDS ARROW -27A8 ; [*0A9D.0020.0002] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW -27A9 ; [*0A9E.0020.0002] # RIGHT-SHADED WHITE RIGHTWARDS ARROW -27AA ; [*0A9F.0020.0002] # LEFT-SHADED WHITE RIGHTWARDS ARROW -27AB ; [*0AA0.0020.0002] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW -27AC ; [*0AA1.0020.0002] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW -27AD ; [*0AA2.0020.0002] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27AE ; [*0AA3.0020.0002] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27AF ; [*0AA4.0020.0002] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B0 ; [*0AA5.0020.0002] # CURLY LOOP -27B1 ; [*0AA6.0020.0002] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B2 ; [*0AA7.0020.0002] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW -27B3 ; [*0AA8.0020.0002] # WHITE-FEATHERED RIGHTWARDS ARROW -27B4 ; [*0AA9.0020.0002] # BLACK-FEATHERED SOUTH EAST ARROW -27B5 ; [*0AAA.0020.0002] # BLACK-FEATHERED RIGHTWARDS ARROW -27B6 ; [*0AAB.0020.0002] # BLACK-FEATHERED NORTH EAST ARROW -27B7 ; [*0AAC.0020.0002] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW -27B8 ; [*0AAD.0020.0002] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW -27B9 ; [*0AAE.0020.0002] # HEAVY BLACK-FEATHERED NORTH EAST ARROW -27BA ; [*0AAF.0020.0002] # TEARDROP-BARBED RIGHTWARDS ARROW -27BB ; [*0AB0.0020.0002] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW -27BC ; [*0AB1.0020.0002] # WEDGE-TAILED RIGHTWARDS ARROW -27BD ; [*0AB2.0020.0002] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW -27BE ; [*0AB3.0020.0002] # OPEN-OUTLINED RIGHTWARDS ARROW -27BF ; [*0AB4.0020.0002] # DOUBLE CURLY LOOP -27C0 ; [*0AB5.0020.0002] # THREE DIMENSIONAL ANGLE -27C1 ; [*0AB6.0020.0002] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE -27C2 ; [*0AB7.0020.0002] # PERPENDICULAR -27C3 ; [*0AB8.0020.0002] # OPEN SUBSET -27C4 ; [*0AB9.0020.0002] # OPEN SUPERSET -27C5 ; [*0341.0020.0002] # LEFT S-SHAPED BAG DELIMITER -27C6 ; [*0342.0020.0002] # RIGHT S-SHAPED BAG DELIMITER -27C7 ; [*0ABA.0020.0002] # OR WITH DOT INSIDE -27C8 ; [*0ABB.0020.0002] # REVERSE SOLIDUS PRECEDING SUBSET -27C9 ; [*0ABC.0020.0002] # SUPERSET PRECEDING SOLIDUS -27CA ; [*0ABD.0020.0002] # VERTICAL BAR WITH HORIZONTAL STROKE -27CB ; [*0ABE.0020.0002] # MATHEMATICAL RISING DIAGONAL -27CC ; [*0ABF.0020.0002] # LONG DIVISION -27CD ; [*0AC0.0020.0002] # MATHEMATICAL FALLING DIAGONAL -27CE ; [*0AC1.0020.0002] # SQUARED LOGICAL AND -27CF ; [*0AC2.0020.0002] # SQUARED LOGICAL OR -27D0 ; [*0AC3.0020.0002] # WHITE DIAMOND WITH CENTRED DOT -27D1 ; [*0AC4.0020.0002] # AND WITH DOT -27D2 ; [*0AC5.0020.0002] # ELEMENT OF OPENING UPWARDS -27D3 ; [*0AC6.0020.0002] # LOWER RIGHT CORNER WITH DOT -27D4 ; [*0AC7.0020.0002] # UPPER LEFT CORNER WITH DOT -27D5 ; [*0AC8.0020.0002] # LEFT OUTER JOIN -27D6 ; [*0AC9.0020.0002] # RIGHT OUTER JOIN -27D7 ; [*0ACA.0020.0002] # FULL OUTER JOIN -27D8 ; [*0ACB.0020.0002] # LARGE UP TACK -27D9 ; [*0ACC.0020.0002] # LARGE DOWN TACK -27DA ; [*0ACD.0020.0002] # LEFT AND RIGHT DOUBLE TURNSTILE -27DB ; [*0ACE.0020.0002] # LEFT AND RIGHT TACK -27DC ; [*0ACF.0020.0002] # LEFT MULTIMAP -27DD ; [*0AD0.0020.0002] # LONG RIGHT TACK -27DE ; [*0AD1.0020.0002] # LONG LEFT TACK -27DF ; [*0AD2.0020.0002] # UP TACK WITH CIRCLE ABOVE -27E0 ; [*0AD3.0020.0002] # LOZENGE DIVIDED BY HORIZONTAL RULE -27E1 ; [*0AD4.0020.0002] # WHITE CONCAVE-SIDED DIAMOND -27E2 ; [*0AD5.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK -27E3 ; [*0AD6.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK -27E4 ; [*0AD7.0020.0002] # WHITE SQUARE WITH LEFTWARDS TICK -27E5 ; [*0AD8.0020.0002] # WHITE SQUARE WITH RIGHTWARDS TICK -27E6 ; [*0343.0020.0002] # MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E7 ; [*0344.0020.0002] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E8 ; [*0345.0020.0002] # MATHEMATICAL LEFT ANGLE BRACKET -27E9 ; [*0346.0020.0002] # MATHEMATICAL RIGHT ANGLE BRACKET -27EA ; [*0347.0020.0002] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EB ; [*0348.0020.0002] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27EC ; [*0349.0020.0002] # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -27ED ; [*034A.0020.0002] # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -27EE ; [*034B.0020.0002] # MATHEMATICAL LEFT FLATTENED PARENTHESIS -27EF ; [*034C.0020.0002] # MATHEMATICAL RIGHT FLATTENED PARENTHESIS -27F0 ; [*0AD9.0020.0002] # UPWARDS QUADRUPLE ARROW -27F1 ; [*0ADA.0020.0002] # DOWNWARDS QUADRUPLE ARROW -27F2 ; [*0ADB.0020.0002] # ANTICLOCKWISE GAPPED CIRCLE ARROW -27F3 ; [*0ADC.0020.0002] # CLOCKWISE GAPPED CIRCLE ARROW -27F4 ; [*0ADD.0020.0002] # RIGHT ARROW WITH CIRCLED PLUS -27F5 ; [*0ADE.0020.0002] # LONG LEFTWARDS ARROW -27F6 ; [*0ADF.0020.0002] # LONG RIGHTWARDS ARROW -27F7 ; [*0AE0.0020.0002] # LONG LEFT RIGHT ARROW -27F8 ; [*0AE1.0020.0002] # LONG LEFTWARDS DOUBLE ARROW -27F9 ; [*0AE2.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW -27FA ; [*0AE3.0020.0002] # LONG LEFT RIGHT DOUBLE ARROW -27FB ; [*0AE4.0020.0002] # LONG LEFTWARDS ARROW FROM BAR -27FC ; [*0AE5.0020.0002] # LONG RIGHTWARDS ARROW FROM BAR -27FD ; [*0AE6.0020.0002] # LONG LEFTWARDS DOUBLE ARROW FROM BAR -27FE ; [*0AE7.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR -27FF ; [*0AE8.0020.0002] # LONG RIGHTWARDS SQUIGGLE ARROW -2800 ; [*0D9C.0020.0002] # BRAILLE PATTERN BLANK -2801 ; [*0D9D.0020.0002] # BRAILLE PATTERN DOTS-1 -2802 ; [*0D9E.0020.0002] # BRAILLE PATTERN DOTS-2 -2803 ; [*0D9F.0020.0002] # BRAILLE PATTERN DOTS-12 -2804 ; [*0DA0.0020.0002] # BRAILLE PATTERN DOTS-3 -2805 ; [*0DA1.0020.0002] # BRAILLE PATTERN DOTS-13 -2806 ; [*0DA2.0020.0002] # BRAILLE PATTERN DOTS-23 -2807 ; [*0DA3.0020.0002] # BRAILLE PATTERN DOTS-123 -2808 ; [*0DA4.0020.0002] # BRAILLE PATTERN DOTS-4 -2809 ; [*0DA5.0020.0002] # BRAILLE PATTERN DOTS-14 -280A ; [*0DA6.0020.0002] # BRAILLE PATTERN DOTS-24 -280B ; [*0DA7.0020.0002] # BRAILLE PATTERN DOTS-124 -280C ; [*0DA8.0020.0002] # BRAILLE PATTERN DOTS-34 -280D ; [*0DA9.0020.0002] # BRAILLE PATTERN DOTS-134 -280E ; [*0DAA.0020.0002] # BRAILLE PATTERN DOTS-234 -280F ; [*0DAB.0020.0002] # BRAILLE PATTERN DOTS-1234 -2810 ; [*0DAC.0020.0002] # BRAILLE PATTERN DOTS-5 -2811 ; [*0DAD.0020.0002] # BRAILLE PATTERN DOTS-15 -2812 ; [*0DAE.0020.0002] # BRAILLE PATTERN DOTS-25 -2813 ; [*0DAF.0020.0002] # BRAILLE PATTERN DOTS-125 -2814 ; [*0DB0.0020.0002] # BRAILLE PATTERN DOTS-35 -2815 ; [*0DB1.0020.0002] # BRAILLE PATTERN DOTS-135 -2816 ; [*0DB2.0020.0002] # BRAILLE PATTERN DOTS-235 -2817 ; [*0DB3.0020.0002] # BRAILLE PATTERN DOTS-1235 -2818 ; [*0DB4.0020.0002] # BRAILLE PATTERN DOTS-45 -2819 ; [*0DB5.0020.0002] # BRAILLE PATTERN DOTS-145 -281A ; [*0DB6.0020.0002] # BRAILLE PATTERN DOTS-245 -281B ; [*0DB7.0020.0002] # BRAILLE PATTERN DOTS-1245 -281C ; [*0DB8.0020.0002] # BRAILLE PATTERN DOTS-345 -281D ; [*0DB9.0020.0002] # BRAILLE PATTERN DOTS-1345 -281E ; [*0DBA.0020.0002] # BRAILLE PATTERN DOTS-2345 -281F ; [*0DBB.0020.0002] # BRAILLE PATTERN DOTS-12345 -2820 ; [*0DBC.0020.0002] # BRAILLE PATTERN DOTS-6 -2821 ; [*0DBD.0020.0002] # BRAILLE PATTERN DOTS-16 -2822 ; [*0DBE.0020.0002] # BRAILLE PATTERN DOTS-26 -2823 ; [*0DBF.0020.0002] # BRAILLE PATTERN DOTS-126 -2824 ; [*0DC0.0020.0002] # BRAILLE PATTERN DOTS-36 -2825 ; [*0DC1.0020.0002] # BRAILLE PATTERN DOTS-136 -2826 ; [*0DC2.0020.0002] # BRAILLE PATTERN DOTS-236 -2827 ; [*0DC3.0020.0002] # BRAILLE PATTERN DOTS-1236 -2828 ; [*0DC4.0020.0002] # BRAILLE PATTERN DOTS-46 -2829 ; [*0DC5.0020.0002] # BRAILLE PATTERN DOTS-146 -282A ; [*0DC6.0020.0002] # BRAILLE PATTERN DOTS-246 -282B ; [*0DC7.0020.0002] # BRAILLE PATTERN DOTS-1246 -282C ; [*0DC8.0020.0002] # BRAILLE PATTERN DOTS-346 -282D ; [*0DC9.0020.0002] # BRAILLE PATTERN DOTS-1346 -282E ; [*0DCA.0020.0002] # BRAILLE PATTERN DOTS-2346 -282F ; [*0DCB.0020.0002] # BRAILLE PATTERN DOTS-12346 -2830 ; [*0DCC.0020.0002] # BRAILLE PATTERN DOTS-56 -2831 ; [*0DCD.0020.0002] # BRAILLE PATTERN DOTS-156 -2832 ; [*0DCE.0020.0002] # BRAILLE PATTERN DOTS-256 -2833 ; [*0DCF.0020.0002] # BRAILLE PATTERN DOTS-1256 -2834 ; [*0DD0.0020.0002] # BRAILLE PATTERN DOTS-356 -2835 ; [*0DD1.0020.0002] # BRAILLE PATTERN DOTS-1356 -2836 ; [*0DD2.0020.0002] # BRAILLE PATTERN DOTS-2356 -2837 ; [*0DD3.0020.0002] # BRAILLE PATTERN DOTS-12356 -2838 ; [*0DD4.0020.0002] # BRAILLE PATTERN DOTS-456 -2839 ; [*0DD5.0020.0002] # BRAILLE PATTERN DOTS-1456 -283A ; [*0DD6.0020.0002] # BRAILLE PATTERN DOTS-2456 -283B ; [*0DD7.0020.0002] # BRAILLE PATTERN DOTS-12456 -283C ; [*0DD8.0020.0002] # BRAILLE PATTERN DOTS-3456 -283D ; [*0DD9.0020.0002] # BRAILLE PATTERN DOTS-13456 -283E ; [*0DDA.0020.0002] # BRAILLE PATTERN DOTS-23456 -283F ; [*0DDB.0020.0002] # BRAILLE PATTERN DOTS-123456 -2840 ; [*0DDC.0020.0002] # BRAILLE PATTERN DOTS-7 -2841 ; [*0DDD.0020.0002] # BRAILLE PATTERN DOTS-17 -2842 ; [*0DDE.0020.0002] # BRAILLE PATTERN DOTS-27 -2843 ; [*0DDF.0020.0002] # BRAILLE PATTERN DOTS-127 -2844 ; [*0DE0.0020.0002] # BRAILLE PATTERN DOTS-37 -2845 ; [*0DE1.0020.0002] # BRAILLE PATTERN DOTS-137 -2846 ; [*0DE2.0020.0002] # BRAILLE PATTERN DOTS-237 -2847 ; [*0DE3.0020.0002] # BRAILLE PATTERN DOTS-1237 -2848 ; [*0DE4.0020.0002] # BRAILLE PATTERN DOTS-47 -2849 ; [*0DE5.0020.0002] # BRAILLE PATTERN DOTS-147 -284A ; [*0DE6.0020.0002] # BRAILLE PATTERN DOTS-247 -284B ; [*0DE7.0020.0002] # BRAILLE PATTERN DOTS-1247 -284C ; [*0DE8.0020.0002] # BRAILLE PATTERN DOTS-347 -284D ; [*0DE9.0020.0002] # BRAILLE PATTERN DOTS-1347 -284E ; [*0DEA.0020.0002] # BRAILLE PATTERN DOTS-2347 -284F ; [*0DEB.0020.0002] # BRAILLE PATTERN DOTS-12347 -2850 ; [*0DEC.0020.0002] # BRAILLE PATTERN DOTS-57 -2851 ; [*0DED.0020.0002] # BRAILLE PATTERN DOTS-157 -2852 ; [*0DEE.0020.0002] # BRAILLE PATTERN DOTS-257 -2853 ; [*0DEF.0020.0002] # BRAILLE PATTERN DOTS-1257 -2854 ; [*0DF0.0020.0002] # BRAILLE PATTERN DOTS-357 -2855 ; [*0DF1.0020.0002] # BRAILLE PATTERN DOTS-1357 -2856 ; [*0DF2.0020.0002] # BRAILLE PATTERN DOTS-2357 -2857 ; [*0DF3.0020.0002] # BRAILLE PATTERN DOTS-12357 -2858 ; [*0DF4.0020.0002] # BRAILLE PATTERN DOTS-457 -2859 ; [*0DF5.0020.0002] # BRAILLE PATTERN DOTS-1457 -285A ; [*0DF6.0020.0002] # BRAILLE PATTERN DOTS-2457 -285B ; [*0DF7.0020.0002] # BRAILLE PATTERN DOTS-12457 -285C ; [*0DF8.0020.0002] # BRAILLE PATTERN DOTS-3457 -285D ; [*0DF9.0020.0002] # BRAILLE PATTERN DOTS-13457 -285E ; [*0DFA.0020.0002] # BRAILLE PATTERN DOTS-23457 -285F ; [*0DFB.0020.0002] # BRAILLE PATTERN DOTS-123457 -2860 ; [*0DFC.0020.0002] # BRAILLE PATTERN DOTS-67 -2861 ; [*0DFD.0020.0002] # BRAILLE PATTERN DOTS-167 -2862 ; [*0DFE.0020.0002] # BRAILLE PATTERN DOTS-267 -2863 ; [*0DFF.0020.0002] # BRAILLE PATTERN DOTS-1267 -2864 ; [*0E00.0020.0002] # BRAILLE PATTERN DOTS-367 -2865 ; [*0E01.0020.0002] # BRAILLE PATTERN DOTS-1367 -2866 ; [*0E02.0020.0002] # BRAILLE PATTERN DOTS-2367 -2867 ; [*0E03.0020.0002] # BRAILLE PATTERN DOTS-12367 -2868 ; [*0E04.0020.0002] # BRAILLE PATTERN DOTS-467 -2869 ; [*0E05.0020.0002] # BRAILLE PATTERN DOTS-1467 -286A ; [*0E06.0020.0002] # BRAILLE PATTERN DOTS-2467 -286B ; [*0E07.0020.0002] # BRAILLE PATTERN DOTS-12467 -286C ; [*0E08.0020.0002] # BRAILLE PATTERN DOTS-3467 -286D ; [*0E09.0020.0002] # BRAILLE PATTERN DOTS-13467 -286E ; [*0E0A.0020.0002] # BRAILLE PATTERN DOTS-23467 -286F ; [*0E0B.0020.0002] # BRAILLE PATTERN DOTS-123467 -2870 ; [*0E0C.0020.0002] # BRAILLE PATTERN DOTS-567 -2871 ; [*0E0D.0020.0002] # BRAILLE PATTERN DOTS-1567 -2872 ; [*0E0E.0020.0002] # BRAILLE PATTERN DOTS-2567 -2873 ; [*0E0F.0020.0002] # BRAILLE PATTERN DOTS-12567 -2874 ; [*0E10.0020.0002] # BRAILLE PATTERN DOTS-3567 -2875 ; [*0E11.0020.0002] # BRAILLE PATTERN DOTS-13567 -2876 ; [*0E12.0020.0002] # BRAILLE PATTERN DOTS-23567 -2877 ; [*0E13.0020.0002] # BRAILLE PATTERN DOTS-123567 -2878 ; [*0E14.0020.0002] # BRAILLE PATTERN DOTS-4567 -2879 ; [*0E15.0020.0002] # BRAILLE PATTERN DOTS-14567 -287A ; [*0E16.0020.0002] # BRAILLE PATTERN DOTS-24567 -287B ; [*0E17.0020.0002] # BRAILLE PATTERN DOTS-124567 -287C ; [*0E18.0020.0002] # BRAILLE PATTERN DOTS-34567 -287D ; [*0E19.0020.0002] # BRAILLE PATTERN DOTS-134567 -287E ; [*0E1A.0020.0002] # BRAILLE PATTERN DOTS-234567 -287F ; [*0E1B.0020.0002] # BRAILLE PATTERN DOTS-1234567 -2880 ; [*0E1C.0020.0002] # BRAILLE PATTERN DOTS-8 -2881 ; [*0E1D.0020.0002] # BRAILLE PATTERN DOTS-18 -2882 ; [*0E1E.0020.0002] # BRAILLE PATTERN DOTS-28 -2883 ; [*0E1F.0020.0002] # BRAILLE PATTERN DOTS-128 -2884 ; [*0E20.0020.0002] # BRAILLE PATTERN DOTS-38 -2885 ; [*0E21.0020.0002] # BRAILLE PATTERN DOTS-138 -2886 ; [*0E22.0020.0002] # BRAILLE PATTERN DOTS-238 -2887 ; [*0E23.0020.0002] # BRAILLE PATTERN DOTS-1238 -2888 ; [*0E24.0020.0002] # BRAILLE PATTERN DOTS-48 -2889 ; [*0E25.0020.0002] # BRAILLE PATTERN DOTS-148 -288A ; [*0E26.0020.0002] # BRAILLE PATTERN DOTS-248 -288B ; [*0E27.0020.0002] # BRAILLE PATTERN DOTS-1248 -288C ; [*0E28.0020.0002] # BRAILLE PATTERN DOTS-348 -288D ; [*0E29.0020.0002] # BRAILLE PATTERN DOTS-1348 -288E ; [*0E2A.0020.0002] # BRAILLE PATTERN DOTS-2348 -288F ; [*0E2B.0020.0002] # BRAILLE PATTERN DOTS-12348 -2890 ; [*0E2C.0020.0002] # BRAILLE PATTERN DOTS-58 -2891 ; [*0E2D.0020.0002] # BRAILLE PATTERN DOTS-158 -2892 ; [*0E2E.0020.0002] # BRAILLE PATTERN DOTS-258 -2893 ; [*0E2F.0020.0002] # BRAILLE PATTERN DOTS-1258 -2894 ; [*0E30.0020.0002] # BRAILLE PATTERN DOTS-358 -2895 ; [*0E31.0020.0002] # BRAILLE PATTERN DOTS-1358 -2896 ; [*0E32.0020.0002] # BRAILLE PATTERN DOTS-2358 -2897 ; [*0E33.0020.0002] # BRAILLE PATTERN DOTS-12358 -2898 ; [*0E34.0020.0002] # BRAILLE PATTERN DOTS-458 -2899 ; [*0E35.0020.0002] # BRAILLE PATTERN DOTS-1458 -289A ; [*0E36.0020.0002] # BRAILLE PATTERN DOTS-2458 -289B ; [*0E37.0020.0002] # BRAILLE PATTERN DOTS-12458 -289C ; [*0E38.0020.0002] # BRAILLE PATTERN DOTS-3458 -289D ; [*0E39.0020.0002] # BRAILLE PATTERN DOTS-13458 -289E ; [*0E3A.0020.0002] # BRAILLE PATTERN DOTS-23458 -289F ; [*0E3B.0020.0002] # BRAILLE PATTERN DOTS-123458 -28A0 ; [*0E3C.0020.0002] # BRAILLE PATTERN DOTS-68 -28A1 ; [*0E3D.0020.0002] # BRAILLE PATTERN DOTS-168 -28A2 ; [*0E3E.0020.0002] # BRAILLE PATTERN DOTS-268 -28A3 ; [*0E3F.0020.0002] # BRAILLE PATTERN DOTS-1268 -28A4 ; [*0E40.0020.0002] # BRAILLE PATTERN DOTS-368 -28A5 ; [*0E41.0020.0002] # BRAILLE PATTERN DOTS-1368 -28A6 ; [*0E42.0020.0002] # BRAILLE PATTERN DOTS-2368 -28A7 ; [*0E43.0020.0002] # BRAILLE PATTERN DOTS-12368 -28A8 ; [*0E44.0020.0002] # BRAILLE PATTERN DOTS-468 -28A9 ; [*0E45.0020.0002] # BRAILLE PATTERN DOTS-1468 -28AA ; [*0E46.0020.0002] # BRAILLE PATTERN DOTS-2468 -28AB ; [*0E47.0020.0002] # BRAILLE PATTERN DOTS-12468 -28AC ; [*0E48.0020.0002] # BRAILLE PATTERN DOTS-3468 -28AD ; [*0E49.0020.0002] # BRAILLE PATTERN DOTS-13468 -28AE ; [*0E4A.0020.0002] # BRAILLE PATTERN DOTS-23468 -28AF ; [*0E4B.0020.0002] # BRAILLE PATTERN DOTS-123468 -28B0 ; [*0E4C.0020.0002] # BRAILLE PATTERN DOTS-568 -28B1 ; [*0E4D.0020.0002] # BRAILLE PATTERN DOTS-1568 -28B2 ; [*0E4E.0020.0002] # BRAILLE PATTERN DOTS-2568 -28B3 ; [*0E4F.0020.0002] # BRAILLE PATTERN DOTS-12568 -28B4 ; [*0E50.0020.0002] # BRAILLE PATTERN DOTS-3568 -28B5 ; [*0E51.0020.0002] # BRAILLE PATTERN DOTS-13568 -28B6 ; [*0E52.0020.0002] # BRAILLE PATTERN DOTS-23568 -28B7 ; [*0E53.0020.0002] # BRAILLE PATTERN DOTS-123568 -28B8 ; [*0E54.0020.0002] # BRAILLE PATTERN DOTS-4568 -28B9 ; [*0E55.0020.0002] # BRAILLE PATTERN DOTS-14568 -28BA ; [*0E56.0020.0002] # BRAILLE PATTERN DOTS-24568 -28BB ; [*0E57.0020.0002] # BRAILLE PATTERN DOTS-124568 -28BC ; [*0E58.0020.0002] # BRAILLE PATTERN DOTS-34568 -28BD ; [*0E59.0020.0002] # BRAILLE PATTERN DOTS-134568 -28BE ; [*0E5A.0020.0002] # BRAILLE PATTERN DOTS-234568 -28BF ; [*0E5B.0020.0002] # BRAILLE PATTERN DOTS-1234568 -28C0 ; [*0E5C.0020.0002] # BRAILLE PATTERN DOTS-78 -28C1 ; [*0E5D.0020.0002] # BRAILLE PATTERN DOTS-178 -28C2 ; [*0E5E.0020.0002] # BRAILLE PATTERN DOTS-278 -28C3 ; [*0E5F.0020.0002] # BRAILLE PATTERN DOTS-1278 -28C4 ; [*0E60.0020.0002] # BRAILLE PATTERN DOTS-378 -28C5 ; [*0E61.0020.0002] # BRAILLE PATTERN DOTS-1378 -28C6 ; [*0E62.0020.0002] # BRAILLE PATTERN DOTS-2378 -28C7 ; [*0E63.0020.0002] # BRAILLE PATTERN DOTS-12378 -28C8 ; [*0E64.0020.0002] # BRAILLE PATTERN DOTS-478 -28C9 ; [*0E65.0020.0002] # BRAILLE PATTERN DOTS-1478 -28CA ; [*0E66.0020.0002] # BRAILLE PATTERN DOTS-2478 -28CB ; [*0E67.0020.0002] # BRAILLE PATTERN DOTS-12478 -28CC ; [*0E68.0020.0002] # BRAILLE PATTERN DOTS-3478 -28CD ; [*0E69.0020.0002] # BRAILLE PATTERN DOTS-13478 -28CE ; [*0E6A.0020.0002] # BRAILLE PATTERN DOTS-23478 -28CF ; [*0E6B.0020.0002] # BRAILLE PATTERN DOTS-123478 -28D0 ; [*0E6C.0020.0002] # BRAILLE PATTERN DOTS-578 -28D1 ; [*0E6D.0020.0002] # BRAILLE PATTERN DOTS-1578 -28D2 ; [*0E6E.0020.0002] # BRAILLE PATTERN DOTS-2578 -28D3 ; [*0E6F.0020.0002] # BRAILLE PATTERN DOTS-12578 -28D4 ; [*0E70.0020.0002] # BRAILLE PATTERN DOTS-3578 -28D5 ; [*0E71.0020.0002] # BRAILLE PATTERN DOTS-13578 -28D6 ; [*0E72.0020.0002] # BRAILLE PATTERN DOTS-23578 -28D7 ; [*0E73.0020.0002] # BRAILLE PATTERN DOTS-123578 -28D8 ; [*0E74.0020.0002] # BRAILLE PATTERN DOTS-4578 -28D9 ; [*0E75.0020.0002] # BRAILLE PATTERN DOTS-14578 -28DA ; [*0E76.0020.0002] # BRAILLE PATTERN DOTS-24578 -28DB ; [*0E77.0020.0002] # BRAILLE PATTERN DOTS-124578 -28DC ; [*0E78.0020.0002] # BRAILLE PATTERN DOTS-34578 -28DD ; [*0E79.0020.0002] # BRAILLE PATTERN DOTS-134578 -28DE ; [*0E7A.0020.0002] # BRAILLE PATTERN DOTS-234578 -28DF ; [*0E7B.0020.0002] # BRAILLE PATTERN DOTS-1234578 -28E0 ; [*0E7C.0020.0002] # BRAILLE PATTERN DOTS-678 -28E1 ; [*0E7D.0020.0002] # BRAILLE PATTERN DOTS-1678 -28E2 ; [*0E7E.0020.0002] # BRAILLE PATTERN DOTS-2678 -28E3 ; [*0E7F.0020.0002] # BRAILLE PATTERN DOTS-12678 -28E4 ; [*0E80.0020.0002] # BRAILLE PATTERN DOTS-3678 -28E5 ; [*0E81.0020.0002] # BRAILLE PATTERN DOTS-13678 -28E6 ; [*0E82.0020.0002] # BRAILLE PATTERN DOTS-23678 -28E7 ; [*0E83.0020.0002] # BRAILLE PATTERN DOTS-123678 -28E8 ; [*0E84.0020.0002] # BRAILLE PATTERN DOTS-4678 -28E9 ; [*0E85.0020.0002] # BRAILLE PATTERN DOTS-14678 -28EA ; [*0E86.0020.0002] # BRAILLE PATTERN DOTS-24678 -28EB ; [*0E87.0020.0002] # BRAILLE PATTERN DOTS-124678 -28EC ; [*0E88.0020.0002] # BRAILLE PATTERN DOTS-34678 -28ED ; [*0E89.0020.0002] # BRAILLE PATTERN DOTS-134678 -28EE ; [*0E8A.0020.0002] # BRAILLE PATTERN DOTS-234678 -28EF ; [*0E8B.0020.0002] # BRAILLE PATTERN DOTS-1234678 -28F0 ; [*0E8C.0020.0002] # BRAILLE PATTERN DOTS-5678 -28F1 ; [*0E8D.0020.0002] # BRAILLE PATTERN DOTS-15678 -28F2 ; [*0E8E.0020.0002] # BRAILLE PATTERN DOTS-25678 -28F3 ; [*0E8F.0020.0002] # BRAILLE PATTERN DOTS-125678 -28F4 ; [*0E90.0020.0002] # BRAILLE PATTERN DOTS-35678 -28F5 ; [*0E91.0020.0002] # BRAILLE PATTERN DOTS-135678 -28F6 ; [*0E92.0020.0002] # BRAILLE PATTERN DOTS-235678 -28F7 ; [*0E93.0020.0002] # BRAILLE PATTERN DOTS-1235678 -28F8 ; [*0E94.0020.0002] # BRAILLE PATTERN DOTS-45678 -28F9 ; [*0E95.0020.0002] # BRAILLE PATTERN DOTS-145678 -28FA ; [*0E96.0020.0002] # BRAILLE PATTERN DOTS-245678 -28FB ; [*0E97.0020.0002] # BRAILLE PATTERN DOTS-1245678 -28FC ; [*0E98.0020.0002] # BRAILLE PATTERN DOTS-345678 -28FD ; [*0E99.0020.0002] # BRAILLE PATTERN DOTS-1345678 -28FE ; [*0E9A.0020.0002] # BRAILLE PATTERN DOTS-2345678 -28FF ; [*0E9B.0020.0002] # BRAILLE PATTERN DOTS-12345678 -2900 ; [*0AE9.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE -2901 ; [*0AEA.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE -2902 ; [*0AEB.0020.0002] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE -2903 ; [*0AEC.0020.0002] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE -2904 ; [*0AED.0020.0002] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE -2905 ; [*0AEE.0020.0002] # RIGHTWARDS TWO-HEADED ARROW FROM BAR -2906 ; [*0AEF.0020.0002] # LEFTWARDS DOUBLE ARROW FROM BAR -2907 ; [*0AF0.0020.0002] # RIGHTWARDS DOUBLE ARROW FROM BAR -2908 ; [*0AF1.0020.0002] # DOWNWARDS ARROW WITH HORIZONTAL STROKE -2909 ; [*0AF2.0020.0002] # UPWARDS ARROW WITH HORIZONTAL STROKE -290A ; [*0AF3.0020.0002] # UPWARDS TRIPLE ARROW -290B ; [*0AF4.0020.0002] # DOWNWARDS TRIPLE ARROW -290C ; [*0AF5.0020.0002] # LEFTWARDS DOUBLE DASH ARROW -290D ; [*0AF6.0020.0002] # RIGHTWARDS DOUBLE DASH ARROW -290E ; [*0AF7.0020.0002] # LEFTWARDS TRIPLE DASH ARROW -290F ; [*0AF8.0020.0002] # RIGHTWARDS TRIPLE DASH ARROW -2910 ; [*0AF9.0020.0002] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW -2911 ; [*0AFA.0020.0002] # RIGHTWARDS ARROW WITH DOTTED STEM -2912 ; [*0AFB.0020.0002] # UPWARDS ARROW TO BAR -2913 ; [*0AFC.0020.0002] # DOWNWARDS ARROW TO BAR -2914 ; [*0AFD.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE -2915 ; [*0AFE.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -2916 ; [*0AFF.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL -2917 ; [*0B00.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE -2918 ; [*0B01.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -2919 ; [*0B02.0020.0002] # LEFTWARDS ARROW-TAIL -291A ; [*0B03.0020.0002] # RIGHTWARDS ARROW-TAIL -291B ; [*0B04.0020.0002] # LEFTWARDS DOUBLE ARROW-TAIL -291C ; [*0B05.0020.0002] # RIGHTWARDS DOUBLE ARROW-TAIL -291D ; [*0B06.0020.0002] # LEFTWARDS ARROW TO BLACK DIAMOND -291E ; [*0B07.0020.0002] # RIGHTWARDS ARROW TO BLACK DIAMOND -291F ; [*0B08.0020.0002] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND -2920 ; [*0B09.0020.0002] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND -2921 ; [*0B0A.0020.0002] # NORTH WEST AND SOUTH EAST ARROW -2922 ; [*0B0B.0020.0002] # NORTH EAST AND SOUTH WEST ARROW -2923 ; [*0B0C.0020.0002] # NORTH WEST ARROW WITH HOOK -2924 ; [*0B0D.0020.0002] # NORTH EAST ARROW WITH HOOK -2925 ; [*0B0E.0020.0002] # SOUTH EAST ARROW WITH HOOK -2926 ; [*0B0F.0020.0002] # SOUTH WEST ARROW WITH HOOK -2927 ; [*0B10.0020.0002] # NORTH WEST ARROW AND NORTH EAST ARROW -2928 ; [*0B11.0020.0002] # NORTH EAST ARROW AND SOUTH EAST ARROW -2929 ; [*0B12.0020.0002] # SOUTH EAST ARROW AND SOUTH WEST ARROW -292A ; [*0B13.0020.0002] # SOUTH WEST ARROW AND NORTH WEST ARROW -292B ; [*0B14.0020.0002] # RISING DIAGONAL CROSSING FALLING DIAGONAL -292C ; [*0B15.0020.0002] # FALLING DIAGONAL CROSSING RISING DIAGONAL -292D ; [*0B16.0020.0002] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW -292E ; [*0B17.0020.0002] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW -292F ; [*0B18.0020.0002] # FALLING DIAGONAL CROSSING NORTH EAST ARROW -2930 ; [*0B19.0020.0002] # RISING DIAGONAL CROSSING SOUTH EAST ARROW -2931 ; [*0B1A.0020.0002] # NORTH EAST ARROW CROSSING NORTH WEST ARROW -2932 ; [*0B1B.0020.0002] # NORTH WEST ARROW CROSSING NORTH EAST ARROW -2933 ; [*0B1C.0020.0002] # WAVE ARROW POINTING DIRECTLY RIGHT -2934 ; [*0B1D.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS -2935 ; [*0B1E.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS -2936 ; [*0B1F.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS -2937 ; [*0B20.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS -2938 ; [*0B21.0020.0002] # RIGHT-SIDE ARC CLOCKWISE ARROW -2939 ; [*0B22.0020.0002] # LEFT-SIDE ARC ANTICLOCKWISE ARROW -293A ; [*0B23.0020.0002] # TOP ARC ANTICLOCKWISE ARROW -293B ; [*0B24.0020.0002] # BOTTOM ARC ANTICLOCKWISE ARROW -293C ; [*0B25.0020.0002] # TOP ARC CLOCKWISE ARROW WITH MINUS -293D ; [*0B26.0020.0002] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS -293E ; [*0B27.0020.0002] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW -293F ; [*0B28.0020.0002] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW -2940 ; [*0B29.0020.0002] # ANTICLOCKWISE CLOSED CIRCLE ARROW -2941 ; [*0B2A.0020.0002] # CLOCKWISE CLOSED CIRCLE ARROW -2942 ; [*0B2B.0020.0002] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW -2943 ; [*0B2C.0020.0002] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW -2944 ; [*0B2D.0020.0002] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW -2945 ; [*0B2E.0020.0002] # RIGHTWARDS ARROW WITH PLUS BELOW -2946 ; [*0B2F.0020.0002] # LEFTWARDS ARROW WITH PLUS BELOW -2947 ; [*0B30.0020.0002] # RIGHTWARDS ARROW THROUGH X -2948 ; [*0B31.0020.0002] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE -2949 ; [*0B32.0020.0002] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE -294A ; [*0B33.0020.0002] # LEFT BARB UP RIGHT BARB DOWN HARPOON -294B ; [*0B34.0020.0002] # LEFT BARB DOWN RIGHT BARB UP HARPOON -294C ; [*0B35.0020.0002] # UP BARB RIGHT DOWN BARB LEFT HARPOON -294D ; [*0B36.0020.0002] # UP BARB LEFT DOWN BARB RIGHT HARPOON -294E ; [*0B37.0020.0002] # LEFT BARB UP RIGHT BARB UP HARPOON -294F ; [*0B38.0020.0002] # UP BARB RIGHT DOWN BARB RIGHT HARPOON -2950 ; [*0B39.0020.0002] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON -2951 ; [*0B3A.0020.0002] # UP BARB LEFT DOWN BARB LEFT HARPOON -2952 ; [*0B3B.0020.0002] # LEFTWARDS HARPOON WITH BARB UP TO BAR -2953 ; [*0B3C.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP TO BAR -2954 ; [*0B3D.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT TO BAR -2955 ; [*0B3E.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR -2956 ; [*0B3F.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR -2957 ; [*0B40.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR -2958 ; [*0B41.0020.0002] # UPWARDS HARPOON WITH BARB LEFT TO BAR -2959 ; [*0B42.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR -295A ; [*0B43.0020.0002] # LEFTWARDS HARPOON WITH BARB UP FROM BAR -295B ; [*0B44.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR -295C ; [*0B45.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR -295D ; [*0B46.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR -295E ; [*0B47.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR -295F ; [*0B48.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR -2960 ; [*0B49.0020.0002] # UPWARDS HARPOON WITH BARB LEFT FROM BAR -2961 ; [*0B4A.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR -2962 ; [*0B4B.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN -2963 ; [*0B4C.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT -2964 ; [*0B4D.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN -2965 ; [*0B4E.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT -2966 ; [*0B4F.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP -2967 ; [*0B50.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN -2968 ; [*0B51.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP -2969 ; [*0B52.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN -296A ; [*0B53.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH -296B ; [*0B54.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH -296C ; [*0B55.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH -296D ; [*0B56.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH -296E ; [*0B57.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT -296F ; [*0B58.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT -2970 ; [*0B59.0020.0002] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD -2971 ; [*0B5A.0020.0002] # EQUALS SIGN ABOVE RIGHTWARDS ARROW -2972 ; [*0B5B.0020.0002] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW -2973 ; [*0B5C.0020.0002] # LEFTWARDS ARROW ABOVE TILDE OPERATOR -2974 ; [*0B5D.0020.0002] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR -2975 ; [*0B5E.0020.0002] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO -2976 ; [*0B5F.0020.0002] # LESS-THAN ABOVE LEFTWARDS ARROW -2977 ; [*0B60.0020.0002] # LEFTWARDS ARROW THROUGH LESS-THAN -2978 ; [*0B61.0020.0002] # GREATER-THAN ABOVE RIGHTWARDS ARROW -2979 ; [*0B62.0020.0002] # SUBSET ABOVE RIGHTWARDS ARROW -297A ; [*0B63.0020.0002] # LEFTWARDS ARROW THROUGH SUBSET -297B ; [*0B64.0020.0002] # SUPERSET ABOVE LEFTWARDS ARROW -297C ; [*0B65.0020.0002] # LEFT FISH TAIL -297D ; [*0B66.0020.0002] # RIGHT FISH TAIL -297E ; [*0B67.0020.0002] # UP FISH TAIL -297F ; [*0B68.0020.0002] # DOWN FISH TAIL -2980 ; [*0B69.0020.0002] # TRIPLE VERTICAL BAR DELIMITER -2981 ; [*0B6A.0020.0002] # Z NOTATION SPOT -2982 ; [*0B6B.0020.0002] # Z NOTATION TYPE COLON -2983 ; [*032B.0020.0002] # LEFT WHITE CURLY BRACKET -2984 ; [*032C.0020.0002] # RIGHT WHITE CURLY BRACKET -2985 ; [*032D.0020.0002] # LEFT WHITE PARENTHESIS -2986 ; [*032E.0020.0002] # RIGHT WHITE PARENTHESIS -2987 ; [*032F.0020.0002] # Z NOTATION LEFT IMAGE BRACKET -2988 ; [*0330.0020.0002] # Z NOTATION RIGHT IMAGE BRACKET -2989 ; [*0331.0020.0002] # Z NOTATION LEFT BINDING BRACKET -298A ; [*0332.0020.0002] # Z NOTATION RIGHT BINDING BRACKET -298B ; [*0333.0020.0002] # LEFT SQUARE BRACKET WITH UNDERBAR -298C ; [*0334.0020.0002] # RIGHT SQUARE BRACKET WITH UNDERBAR -298D ; [*0335.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298E ; [*0336.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -298F ; [*0337.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990 ; [*0338.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2991 ; [*0339.0020.0002] # LEFT ANGLE BRACKET WITH DOT -2992 ; [*033A.0020.0002] # RIGHT ANGLE BRACKET WITH DOT -2993 ; [*033B.0020.0002] # LEFT ARC LESS-THAN BRACKET -2994 ; [*033C.0020.0002] # RIGHT ARC GREATER-THAN BRACKET -2995 ; [*033D.0020.0002] # DOUBLE LEFT ARC GREATER-THAN BRACKET -2996 ; [*033E.0020.0002] # DOUBLE RIGHT ARC LESS-THAN BRACKET -2997 ; [*033F.0020.0002] # LEFT BLACK TORTOISE SHELL BRACKET -2998 ; [*0340.0020.0002] # RIGHT BLACK TORTOISE SHELL BRACKET -2999 ; [*0B6C.0020.0002] # DOTTED FENCE -299A ; [*0B6D.0020.0002] # VERTICAL ZIGZAG LINE -299B ; [*0B6E.0020.0002] # MEASURED ANGLE OPENING LEFT -299C ; [*0B6F.0020.0002] # RIGHT ANGLE VARIANT WITH SQUARE -299D ; [*0B70.0020.0002] # MEASURED RIGHT ANGLE WITH DOT -299E ; [*0B71.0020.0002] # ANGLE WITH S INSIDE -299F ; [*0B72.0020.0002] # ACUTE ANGLE -29A0 ; [*0B73.0020.0002] # SPHERICAL ANGLE OPENING LEFT -29A1 ; [*0B74.0020.0002] # SPHERICAL ANGLE OPENING UP -29A2 ; [*0B75.0020.0002] # TURNED ANGLE -29A3 ; [*0B76.0020.0002] # REVERSED ANGLE -29A4 ; [*0B77.0020.0002] # ANGLE WITH UNDERBAR -29A5 ; [*0B78.0020.0002] # REVERSED ANGLE WITH UNDERBAR -29A6 ; [*0B79.0020.0002] # OBLIQUE ANGLE OPENING UP -29A7 ; [*0B7A.0020.0002] # OBLIQUE ANGLE OPENING DOWN -29A8 ; [*0B7B.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT -29A9 ; [*0B7C.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT -29AA ; [*0B7D.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT -29AB ; [*0B7E.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT -29AC ; [*0B7F.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP -29AD ; [*0B80.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP -29AE ; [*0B81.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN -29AF ; [*0B82.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN -29B0 ; [*0B83.0020.0002] # REVERSED EMPTY SET -29B1 ; [*0B84.0020.0002] # EMPTY SET WITH OVERBAR -29B2 ; [*0B85.0020.0002] # EMPTY SET WITH SMALL CIRCLE ABOVE -29B3 ; [*0B86.0020.0002] # EMPTY SET WITH RIGHT ARROW ABOVE -29B4 ; [*0B87.0020.0002] # EMPTY SET WITH LEFT ARROW ABOVE -29B5 ; [*0B88.0020.0002] # CIRCLE WITH HORIZONTAL BAR -29B6 ; [*0B89.0020.0002] # CIRCLED VERTICAL BAR -29B7 ; [*0B8A.0020.0002] # CIRCLED PARALLEL -29B8 ; [*0B8B.0020.0002] # CIRCLED REVERSE SOLIDUS -29B9 ; [*0B8C.0020.0002] # CIRCLED PERPENDICULAR -29BA ; [*0B8D.0020.0002] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR -29BB ; [*0B8E.0020.0002] # CIRCLE WITH SUPERIMPOSED X -29BC ; [*0B8F.0020.0002] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN -29BD ; [*0B90.0020.0002] # UP ARROW THROUGH CIRCLE -29BE ; [*0B91.0020.0002] # CIRCLED WHITE BULLET -29BF ; [*0B92.0020.0002] # CIRCLED BULLET -29C0 ; [*0B93.0020.0002] # CIRCLED LESS-THAN -29C1 ; [*0B94.0020.0002] # CIRCLED GREATER-THAN -29C2 ; [*0B95.0020.0002] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT -29C3 ; [*0B96.0020.0002] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT -29C4 ; [*0B97.0020.0002] # SQUARED RISING DIAGONAL SLASH -29C5 ; [*0B98.0020.0002] # SQUARED FALLING DIAGONAL SLASH -29C6 ; [*0B99.0020.0002] # SQUARED ASTERISK -29C7 ; [*0B9A.0020.0002] # SQUARED SMALL CIRCLE -29C8 ; [*0B9B.0020.0002] # SQUARED SQUARE -29C9 ; [*0B9C.0020.0002] # TWO JOINED SQUARES -29CA ; [*0B9D.0020.0002] # TRIANGLE WITH DOT ABOVE -29CB ; [*0B9E.0020.0002] # TRIANGLE WITH UNDERBAR -29CC ; [*0B9F.0020.0002] # S IN TRIANGLE -29CD ; [*0BA0.0020.0002] # TRIANGLE WITH SERIFS AT BOTTOM -29CE ; [*0BA1.0020.0002] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE -29CF ; [*0BA2.0020.0002] # LEFT TRIANGLE BESIDE VERTICAL BAR -29D0 ; [*0BA3.0020.0002] # VERTICAL BAR BESIDE RIGHT TRIANGLE -29D1 ; [*0BA4.0020.0002] # BOWTIE WITH LEFT HALF BLACK -29D2 ; [*0BA5.0020.0002] # BOWTIE WITH RIGHT HALF BLACK -29D3 ; [*0BA6.0020.0002] # BLACK BOWTIE -29D4 ; [*0BA7.0020.0002] # TIMES WITH LEFT HALF BLACK -29D5 ; [*0BA8.0020.0002] # TIMES WITH RIGHT HALF BLACK -29D6 ; [*0BA9.0020.0002] # WHITE HOURGLASS -29D7 ; [*0BAA.0020.0002] # BLACK HOURGLASS -29D8 ; [*0385.0020.0002] # LEFT WIGGLY FENCE -29D9 ; [*0386.0020.0002] # RIGHT WIGGLY FENCE -29DA ; [*0387.0020.0002] # LEFT DOUBLE WIGGLY FENCE -29DB ; [*0388.0020.0002] # RIGHT DOUBLE WIGGLY FENCE -29DC ; [*0BAB.0020.0002] # INCOMPLETE INFINITY -29DD ; [*0BAC.0020.0002] # TIE OVER INFINITY -29DE ; [*0BAD.0020.0002] # INFINITY NEGATED WITH VERTICAL BAR -29DF ; [*0BAE.0020.0002] # DOUBLE-ENDED MULTIMAP -29E0 ; [*0BAF.0020.0002] # SQUARE WITH CONTOURED OUTLINE -29E1 ; [*0BB0.0020.0002] # INCREASES AS -29E2 ; [*0BB1.0020.0002] # SHUFFLE PRODUCT -29E3 ; [*0BB2.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL -29E4 ; [*0BB3.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE -29E5 ; [*0BB4.0020.0002] # IDENTICAL TO AND SLANTED PARALLEL -29E6 ; [*0BB5.0020.0002] # GLEICH STARK -29E7 ; [*0BB6.0020.0002] # THERMODYNAMIC -29E8 ; [*0BB7.0020.0002] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK -29E9 ; [*0BB8.0020.0002] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK -29EA ; [*0BB9.0020.0002] # BLACK DIAMOND WITH DOWN ARROW -29EB ; [*0BBA.0020.0002] # BLACK LOZENGE -29EC ; [*0BBB.0020.0002] # WHITE CIRCLE WITH DOWN ARROW -29ED ; [*0BBC.0020.0002] # BLACK CIRCLE WITH DOWN ARROW -29EE ; [*0BBD.0020.0002] # ERROR-BARRED WHITE SQUARE -29EF ; [*0BBE.0020.0002] # ERROR-BARRED BLACK SQUARE -29F0 ; [*0BBF.0020.0002] # ERROR-BARRED WHITE DIAMOND -29F1 ; [*0BC0.0020.0002] # ERROR-BARRED BLACK DIAMOND -29F2 ; [*0BC1.0020.0002] # ERROR-BARRED WHITE CIRCLE -29F3 ; [*0BC2.0020.0002] # ERROR-BARRED BLACK CIRCLE -29F4 ; [*0BC3.0020.0002] # RULE-DELAYED -29F5 ; [*0BC4.0020.0002] # REVERSE SOLIDUS OPERATOR -29F6 ; [*0BC5.0020.0002] # SOLIDUS WITH OVERBAR -29F7 ; [*0BC6.0020.0002] # REVERSE SOLIDUS WITH HORIZONTAL STROKE -29F8 ; [*0BC7.0020.0002] # BIG SOLIDUS -29F9 ; [*0BC8.0020.0002] # BIG REVERSE SOLIDUS -29FA ; [*0BC9.0020.0002] # DOUBLE PLUS -29FB ; [*0BCA.0020.0002] # TRIPLE PLUS -29FC ; [*0329.0020.0002] # LEFT-POINTING CURVED ANGLE BRACKET -29FD ; [*032A.0020.0002] # RIGHT-POINTING CURVED ANGLE BRACKET -29FE ; [*0BCB.0020.0002] # TINY -29FF ; [*0BCC.0020.0002] # MINY -2A00 ; [*0BCD.0020.0002] # N-ARY CIRCLED DOT OPERATOR -2A01 ; [*0BCE.0020.0002] # N-ARY CIRCLED PLUS OPERATOR -2A02 ; [*0BCF.0020.0002] # N-ARY CIRCLED TIMES OPERATOR -2A03 ; [*0BD0.0020.0002] # N-ARY UNION OPERATOR WITH DOT -2A04 ; [*0BD1.0020.0002] # N-ARY UNION OPERATOR WITH PLUS -2A05 ; [*0BD2.0020.0002] # N-ARY SQUARE INTERSECTION OPERATOR -2A06 ; [*0BD3.0020.0002] # N-ARY SQUARE UNION OPERATOR -2A07 ; [*0BD4.0020.0002] # TWO LOGICAL AND OPERATOR -2A08 ; [*0BD5.0020.0002] # TWO LOGICAL OR OPERATOR -2A09 ; [*0BD6.0020.0002] # N-ARY TIMES OPERATOR -2A0A ; [*0BD7.0020.0002] # MODULO TWO SUM -2A0B ; [*0BD8.0020.0002] # SUMMATION WITH INTEGRAL -2A0C ; [*063C.0020.0004][*063C.0020.0004][*063C.0020.0004][*063C.0020.0004] # QUADRUPLE INTEGRAL OPERATOR -2A0D ; [*0BD9.0020.0002] # FINITE PART INTEGRAL -2A0E ; [*0BDA.0020.0002] # INTEGRAL WITH DOUBLE STROKE -2A0F ; [*0BDB.0020.0002] # INTEGRAL AVERAGE WITH SLASH -2A10 ; [*0BDC.0020.0002] # CIRCULATION FUNCTION -2A11 ; [*0BDD.0020.0002] # ANTICLOCKWISE INTEGRATION -2A12 ; [*0BDE.0020.0002] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE -2A13 ; [*0BDF.0020.0002] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE -2A14 ; [*0BE0.0020.0002] # LINE INTEGRATION NOT INCLUDING THE POLE -2A15 ; [*0BE1.0020.0002] # INTEGRAL AROUND A POINT OPERATOR -2A16 ; [*0BE2.0020.0002] # QUATERNION INTEGRAL OPERATOR -2A17 ; [*0BE3.0020.0002] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK -2A18 ; [*0BE4.0020.0002] # INTEGRAL WITH TIMES SIGN -2A19 ; [*0BE5.0020.0002] # INTEGRAL WITH INTERSECTION -2A1A ; [*0BE6.0020.0002] # INTEGRAL WITH UNION -2A1B ; [*0BE7.0020.0002] # INTEGRAL WITH OVERBAR -2A1C ; [*0BE8.0020.0002] # INTEGRAL WITH UNDERBAR -2A1D ; [*0BE9.0020.0002] # JOIN -2A1E ; [*0BEA.0020.0002] # LARGE LEFT TRIANGLE OPERATOR -2A1F ; [*0BEB.0020.0002] # Z NOTATION SCHEMA COMPOSITION -2A20 ; [*0BEC.0020.0002] # Z NOTATION SCHEMA PIPING -2A21 ; [*0BED.0020.0002] # Z NOTATION SCHEMA PROJECTION -2A22 ; [*0BEE.0020.0002] # PLUS SIGN WITH SMALL CIRCLE ABOVE -2A23 ; [*0BEF.0020.0002] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE -2A24 ; [*0BF0.0020.0002] # PLUS SIGN WITH TILDE ABOVE -2A25 ; [*0BF1.0020.0002] # PLUS SIGN WITH DOT BELOW -2A26 ; [*0BF2.0020.0002] # PLUS SIGN WITH TILDE BELOW -2A27 ; [*0BF3.0020.0002] # PLUS SIGN WITH SUBSCRIPT TWO -2A28 ; [*0BF4.0020.0002] # PLUS SIGN WITH BLACK TRIANGLE -2A29 ; [*0BF5.0020.0002] # MINUS SIGN WITH COMMA ABOVE -2A2A ; [*0BF6.0020.0002] # MINUS SIGN WITH DOT BELOW -2A2B ; [*0BF7.0020.0002] # MINUS SIGN WITH FALLING DOTS -2A2C ; [*0BF8.0020.0002] # MINUS SIGN WITH RISING DOTS -2A2D ; [*0BF9.0020.0002] # PLUS SIGN IN LEFT HALF CIRCLE -2A2E ; [*0BFA.0020.0002] # PLUS SIGN IN RIGHT HALF CIRCLE -2A2F ; [*0BFB.0020.0002] # VECTOR OR CROSS PRODUCT -2A30 ; [*0BFC.0020.0002] # MULTIPLICATION SIGN WITH DOT ABOVE -2A31 ; [*0BFD.0020.0002] # MULTIPLICATION SIGN WITH UNDERBAR -2A32 ; [*0BFE.0020.0002] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED -2A33 ; [*0BFF.0020.0002] # SMASH PRODUCT -2A34 ; [*0C00.0020.0002] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE -2A35 ; [*0C01.0020.0002] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE -2A36 ; [*0C02.0020.0002] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT -2A37 ; [*0C03.0020.0002] # MULTIPLICATION SIGN IN DOUBLE CIRCLE -2A38 ; [*0C04.0020.0002] # CIRCLED DIVISION SIGN -2A39 ; [*0C05.0020.0002] # PLUS SIGN IN TRIANGLE -2A3A ; [*0C06.0020.0002] # MINUS SIGN IN TRIANGLE -2A3B ; [*0C07.0020.0002] # MULTIPLICATION SIGN IN TRIANGLE -2A3C ; [*0C08.0020.0002] # INTERIOR PRODUCT -2A3D ; [*0C09.0020.0002] # RIGHTHAND INTERIOR PRODUCT -2A3E ; [*0C0A.0020.0002] # Z NOTATION RELATIONAL COMPOSITION -2A3F ; [*0C0B.0020.0002] # AMALGAMATION OR COPRODUCT -2A40 ; [*0C0C.0020.0002] # INTERSECTION WITH DOT -2A41 ; [*0C0D.0020.0002] # UNION WITH MINUS SIGN -2A42 ; [*0C0E.0020.0002] # UNION WITH OVERBAR -2A43 ; [*0C0F.0020.0002] # INTERSECTION WITH OVERBAR -2A44 ; [*0C10.0020.0002] # INTERSECTION WITH LOGICAL AND -2A45 ; [*0C11.0020.0002] # UNION WITH LOGICAL OR -2A46 ; [*0C12.0020.0002] # UNION ABOVE INTERSECTION -2A47 ; [*0C13.0020.0002] # INTERSECTION ABOVE UNION -2A48 ; [*0C14.0020.0002] # UNION ABOVE BAR ABOVE INTERSECTION -2A49 ; [*0C15.0020.0002] # INTERSECTION ABOVE BAR ABOVE UNION -2A4A ; [*0C16.0020.0002] # UNION BESIDE AND JOINED WITH UNION -2A4B ; [*0C17.0020.0002] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION -2A4C ; [*0C18.0020.0002] # CLOSED UNION WITH SERIFS -2A4D ; [*0C19.0020.0002] # CLOSED INTERSECTION WITH SERIFS -2A4E ; [*0C1A.0020.0002] # DOUBLE SQUARE INTERSECTION -2A4F ; [*0C1B.0020.0002] # DOUBLE SQUARE UNION -2A50 ; [*0C1C.0020.0002] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT -2A51 ; [*0C1D.0020.0002] # LOGICAL AND WITH DOT ABOVE -2A52 ; [*0C1E.0020.0002] # LOGICAL OR WITH DOT ABOVE -2A53 ; [*0C1F.0020.0002] # DOUBLE LOGICAL AND -2A54 ; [*0C20.0020.0002] # DOUBLE LOGICAL OR -2A55 ; [*0C21.0020.0002] # TWO INTERSECTING LOGICAL AND -2A56 ; [*0C22.0020.0002] # TWO INTERSECTING LOGICAL OR -2A57 ; [*0C23.0020.0002] # SLOPING LARGE OR -2A58 ; [*0C24.0020.0002] # SLOPING LARGE AND -2A59 ; [*0C25.0020.0002] # LOGICAL OR OVERLAPPING LOGICAL AND -2A5A ; [*0C26.0020.0002] # LOGICAL AND WITH MIDDLE STEM -2A5B ; [*0C27.0020.0002] # LOGICAL OR WITH MIDDLE STEM -2A5C ; [*0C28.0020.0002] # LOGICAL AND WITH HORIZONTAL DASH -2A5D ; [*0C29.0020.0002] # LOGICAL OR WITH HORIZONTAL DASH -2A5E ; [*0C2A.0020.0002] # LOGICAL AND WITH DOUBLE OVERBAR -2A5F ; [*0C2B.0020.0002] # LOGICAL AND WITH UNDERBAR -2A60 ; [*0C2C.0020.0002] # LOGICAL AND WITH DOUBLE UNDERBAR -2A61 ; [*0C2D.0020.0002] # SMALL VEE WITH UNDERBAR -2A62 ; [*0C2E.0020.0002] # LOGICAL OR WITH DOUBLE OVERBAR -2A63 ; [*0C2F.0020.0002] # LOGICAL OR WITH DOUBLE UNDERBAR -2A64 ; [*0C30.0020.0002] # Z NOTATION DOMAIN ANTIRESTRICTION -2A65 ; [*0C31.0020.0002] # Z NOTATION RANGE ANTIRESTRICTION -2A66 ; [*0C32.0020.0002] # EQUALS SIGN WITH DOT BELOW -2A67 ; [*0C33.0020.0002] # IDENTICAL WITH DOT ABOVE -2A68 ; [*0C34.0020.0002] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE -2A69 ; [*0C35.0020.0002] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE -2A6A ; [*0C36.0020.0002] # TILDE OPERATOR WITH DOT ABOVE -2A6B ; [*0C37.0020.0002] # TILDE OPERATOR WITH RISING DOTS -2A6C ; [*0C38.0020.0002] # SIMILAR MINUS SIMILAR -2A6D ; [*0C39.0020.0002] # CONGRUENT WITH DOT ABOVE -2A6E ; [*0C3A.0020.0002] # EQUALS WITH ASTERISK -2A6F ; [*0C3B.0020.0002] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT -2A70 ; [*0C3C.0020.0002] # APPROXIMATELY EQUAL OR EQUAL TO -2A71 ; [*0C3D.0020.0002] # EQUALS SIGN ABOVE PLUS SIGN -2A72 ; [*0C3E.0020.0002] # PLUS SIGN ABOVE EQUALS SIGN -2A73 ; [*0C3F.0020.0002] # EQUALS SIGN ABOVE TILDE OPERATOR -2A74 ; [*0239.0020.0004][*0239.0020.0004][*061B.0020.0004] # DOUBLE COLON EQUAL -2A75 ; [*061B.0020.0004][*061B.0020.0004] # TWO CONSECUTIVE EQUALS SIGNS -2A76 ; [*061B.0020.0004][*061B.0020.0004][*061B.0020.0004] # THREE CONSECUTIVE EQUALS SIGNS -2A77 ; [*0C40.0020.0002] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW -2A78 ; [*0C41.0020.0002] # EQUIVALENT WITH FOUR DOTS ABOVE -2A79 ; [*0C42.0020.0002] # LESS-THAN WITH CIRCLE INSIDE -2A7A ; [*0C43.0020.0002] # GREATER-THAN WITH CIRCLE INSIDE -2A7B ; [*0C44.0020.0002] # LESS-THAN WITH QUESTION MARK ABOVE -2A7C ; [*0C45.0020.0002] # GREATER-THAN WITH QUESTION MARK ABOVE -2A7D ; [*0C46.0020.0002] # LESS-THAN OR SLANTED EQUAL TO -2A7E ; [*0C47.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO -2A7F ; [*0C48.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE -2A80 ; [*0C49.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE -2A81 ; [*0C4A.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE -2A82 ; [*0C4B.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE -2A83 ; [*0C4C.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT -2A84 ; [*0C4D.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT -2A85 ; [*0C4E.0020.0002] # LESS-THAN OR APPROXIMATE -2A86 ; [*0C4F.0020.0002] # GREATER-THAN OR APPROXIMATE -2A87 ; [*0C50.0020.0002] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO -2A88 ; [*0C51.0020.0002] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO -2A89 ; [*0C52.0020.0002] # LESS-THAN AND NOT APPROXIMATE -2A8A ; [*0C53.0020.0002] # GREATER-THAN AND NOT APPROXIMATE -2A8B ; [*0C54.0020.0002] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN -2A8C ; [*0C55.0020.0002] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN -2A8D ; [*0C56.0020.0002] # LESS-THAN ABOVE SIMILAR OR EQUAL -2A8E ; [*0C57.0020.0002] # GREATER-THAN ABOVE SIMILAR OR EQUAL -2A8F ; [*0C58.0020.0002] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN -2A90 ; [*0C59.0020.0002] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN -2A91 ; [*0C5A.0020.0002] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL -2A92 ; [*0C5B.0020.0002] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL -2A93 ; [*0C5C.0020.0002] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL -2A94 ; [*0C5D.0020.0002] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL -2A95 ; [*0C5E.0020.0002] # SLANTED EQUAL TO OR LESS-THAN -2A96 ; [*0C5F.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN -2A97 ; [*0C60.0020.0002] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE -2A98 ; [*0C61.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE -2A99 ; [*0C62.0020.0002] # DOUBLE-LINE EQUAL TO OR LESS-THAN -2A9A ; [*0C63.0020.0002] # DOUBLE-LINE EQUAL TO OR GREATER-THAN -2A9B ; [*0C64.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN -2A9C ; [*0C65.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN -2A9D ; [*0C66.0020.0002] # SIMILAR OR LESS-THAN -2A9E ; [*0C67.0020.0002] # SIMILAR OR GREATER-THAN -2A9F ; [*0C68.0020.0002] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN -2AA0 ; [*0C69.0020.0002] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN -2AA1 ; [*0C6A.0020.0002] # DOUBLE NESTED LESS-THAN -2AA2 ; [*0C6B.0020.0002] # DOUBLE NESTED GREATER-THAN -2AA3 ; [*0C6C.0020.0002] # DOUBLE NESTED LESS-THAN WITH UNDERBAR -2AA4 ; [*0C6D.0020.0002] # GREATER-THAN OVERLAPPING LESS-THAN -2AA5 ; [*0C6E.0020.0002] # GREATER-THAN BESIDE LESS-THAN -2AA6 ; [*0C6F.0020.0002] # LESS-THAN CLOSED BY CURVE -2AA7 ; [*0C70.0020.0002] # GREATER-THAN CLOSED BY CURVE -2AA8 ; [*0C71.0020.0002] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL -2AA9 ; [*0C72.0020.0002] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL -2AAA ; [*0C73.0020.0002] # SMALLER THAN -2AAB ; [*0C74.0020.0002] # LARGER THAN -2AAC ; [*0C75.0020.0002] # SMALLER THAN OR EQUAL TO -2AAD ; [*0C76.0020.0002] # LARGER THAN OR EQUAL TO -2AAE ; [*0C77.0020.0002] # EQUALS SIGN WITH BUMPY ABOVE -2AAF ; [*0C78.0020.0002] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN -2AB0 ; [*0C79.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN -2AB1 ; [*0C7A.0020.0002] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO -2AB2 ; [*0C7B.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO -2AB3 ; [*0C7C.0020.0002] # PRECEDES ABOVE EQUALS SIGN -2AB4 ; [*0C7D.0020.0002] # SUCCEEDS ABOVE EQUALS SIGN -2AB5 ; [*0C7E.0020.0002] # PRECEDES ABOVE NOT EQUAL TO -2AB6 ; [*0C7F.0020.0002] # SUCCEEDS ABOVE NOT EQUAL TO -2AB7 ; [*0C80.0020.0002] # PRECEDES ABOVE ALMOST EQUAL TO -2AB8 ; [*0C81.0020.0002] # SUCCEEDS ABOVE ALMOST EQUAL TO -2AB9 ; [*0C82.0020.0002] # PRECEDES ABOVE NOT ALMOST EQUAL TO -2ABA ; [*0C83.0020.0002] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO -2ABB ; [*0C84.0020.0002] # DOUBLE PRECEDES -2ABC ; [*0C85.0020.0002] # DOUBLE SUCCEEDS -2ABD ; [*0C86.0020.0002] # SUBSET WITH DOT -2ABE ; [*0C87.0020.0002] # SUPERSET WITH DOT -2ABF ; [*0C88.0020.0002] # SUBSET WITH PLUS SIGN BELOW -2AC0 ; [*0C89.0020.0002] # SUPERSET WITH PLUS SIGN BELOW -2AC1 ; [*0C8A.0020.0002] # SUBSET WITH MULTIPLICATION SIGN BELOW -2AC2 ; [*0C8B.0020.0002] # SUPERSET WITH MULTIPLICATION SIGN BELOW -2AC3 ; [*0C8C.0020.0002] # SUBSET OF OR EQUAL TO WITH DOT ABOVE -2AC4 ; [*0C8D.0020.0002] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE -2AC5 ; [*0C8E.0020.0002] # SUBSET OF ABOVE EQUALS SIGN -2AC6 ; [*0C8F.0020.0002] # SUPERSET OF ABOVE EQUALS SIGN -2AC7 ; [*0C90.0020.0002] # SUBSET OF ABOVE TILDE OPERATOR -2AC8 ; [*0C91.0020.0002] # SUPERSET OF ABOVE TILDE OPERATOR -2AC9 ; [*0C92.0020.0002] # SUBSET OF ABOVE ALMOST EQUAL TO -2ACA ; [*0C93.0020.0002] # SUPERSET OF ABOVE ALMOST EQUAL TO -2ACB ; [*0C94.0020.0002] # SUBSET OF ABOVE NOT EQUAL TO -2ACC ; [*0C95.0020.0002] # SUPERSET OF ABOVE NOT EQUAL TO -2ACD ; [*0C96.0020.0002] # SQUARE LEFT OPEN BOX OPERATOR -2ACE ; [*0C97.0020.0002] # SQUARE RIGHT OPEN BOX OPERATOR -2ACF ; [*0C98.0020.0002] # CLOSED SUBSET -2AD0 ; [*0C99.0020.0002] # CLOSED SUPERSET -2AD1 ; [*0C9A.0020.0002] # CLOSED SUBSET OR EQUAL TO -2AD2 ; [*0C9B.0020.0002] # CLOSED SUPERSET OR EQUAL TO -2AD3 ; [*0C9C.0020.0002] # SUBSET ABOVE SUPERSET -2AD4 ; [*0C9D.0020.0002] # SUPERSET ABOVE SUBSET -2AD5 ; [*0C9E.0020.0002] # SUBSET ABOVE SUBSET -2AD6 ; [*0C9F.0020.0002] # SUPERSET ABOVE SUPERSET -2AD7 ; [*0CA0.0020.0002] # SUPERSET BESIDE SUBSET -2AD8 ; [*0CA1.0020.0002] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET -2AD9 ; [*0CA2.0020.0002] # ELEMENT OF OPENING DOWNWARDS -2ADA ; [*0CA3.0020.0002] # PITCHFORK WITH TEE TOP -2ADB ; [*0CA4.0020.0002] # TRANSVERSAL INTERSECTION -2ADC ; [*0CA5.0020.0002][.0000.002F.0002] # FORKING -2ADD ; [*0CA5.0020.0002] # NONFORKING -2ADE ; [*0CA6.0020.0002] # SHORT LEFT TACK -2ADF ; [*0CA7.0020.0002] # SHORT DOWN TACK -2AE0 ; [*0CA8.0020.0002] # SHORT UP TACK -2AE1 ; [*0CA9.0020.0002] # PERPENDICULAR WITH S -2AE2 ; [*0CAA.0020.0002] # VERTICAL BAR TRIPLE RIGHT TURNSTILE -2AE3 ; [*0CAB.0020.0002] # DOUBLE VERTICAL BAR LEFT TURNSTILE -2AE4 ; [*0CAC.0020.0002] # VERTICAL BAR DOUBLE LEFT TURNSTILE -2AE5 ; [*0CAD.0020.0002] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE -2AE6 ; [*0CAE.0020.0002] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL -2AE7 ; [*0CAF.0020.0002] # SHORT DOWN TACK WITH OVERBAR -2AE8 ; [*0CB0.0020.0002] # SHORT UP TACK WITH UNDERBAR -2AE9 ; [*0CB1.0020.0002] # SHORT UP TACK ABOVE SHORT DOWN TACK -2AEA ; [*0CB2.0020.0002] # DOUBLE DOWN TACK -2AEB ; [*0CB3.0020.0002] # DOUBLE UP TACK -2AEC ; [*0CB4.0020.0002] # DOUBLE STROKE NOT SIGN -2AED ; [*0CB5.0020.0002] # REVERSED DOUBLE STROKE NOT SIGN -2AEE ; [*0CB6.0020.0002] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH -2AEF ; [*0CB7.0020.0002] # VERTICAL LINE WITH CIRCLE ABOVE -2AF0 ; [*0CB8.0020.0002] # VERTICAL LINE WITH CIRCLE BELOW -2AF1 ; [*0CB9.0020.0002] # DOWN TACK WITH CIRCLE BELOW -2AF2 ; [*0CBA.0020.0002] # PARALLEL WITH HORIZONTAL STROKE -2AF3 ; [*0CBB.0020.0002] # PARALLEL WITH TILDE OPERATOR -2AF4 ; [*0CBC.0020.0002] # TRIPLE VERTICAL BAR BINARY RELATION -2AF5 ; [*0CBD.0020.0002] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE -2AF6 ; [*0CBE.0020.0002] # TRIPLE COLON OPERATOR -2AF7 ; [*0CBF.0020.0002] # TRIPLE NESTED LESS-THAN -2AF8 ; [*0CC0.0020.0002] # TRIPLE NESTED GREATER-THAN -2AF9 ; [*0CC1.0020.0002] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO -2AFA ; [*0CC2.0020.0002] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO -2AFB ; [*0CC3.0020.0002] # TRIPLE SOLIDUS BINARY RELATION -2AFC ; [*0CC4.0020.0002] # LARGE TRIPLE VERTICAL BAR OPERATOR -2AFD ; [*0CC5.0020.0002] # DOUBLE SOLIDUS OPERATOR -2AFE ; [*0CC6.0020.0002] # WHITE VERTICAL BAR -2AFF ; [*0CC7.0020.0002] # N-ARY WHITE VERTICAL BAR -2B00 ; [*0CC8.0020.0002] # NORTH EAST WHITE ARROW -2B01 ; [*0CC9.0020.0002] # NORTH WEST WHITE ARROW -2B02 ; [*0CCA.0020.0002] # SOUTH EAST WHITE ARROW -2B03 ; [*0CCB.0020.0002] # SOUTH WEST WHITE ARROW -2B04 ; [*0CCC.0020.0002] # LEFT RIGHT WHITE ARROW -2B05 ; [*0CCD.0020.0002] # LEFTWARDS BLACK ARROW -2B06 ; [*0CCE.0020.0002] # UPWARDS BLACK ARROW -2B07 ; [*0CCF.0020.0002] # DOWNWARDS BLACK ARROW -2B08 ; [*0CD0.0020.0002] # NORTH EAST BLACK ARROW -2B09 ; [*0CD1.0020.0002] # NORTH WEST BLACK ARROW -2B0A ; [*0CD2.0020.0002] # SOUTH EAST BLACK ARROW -2B0B ; [*0CD3.0020.0002] # SOUTH WEST BLACK ARROW -2B0C ; [*0CD4.0020.0002] # LEFT RIGHT BLACK ARROW -2B0D ; [*0CD5.0020.0002] # UP DOWN BLACK ARROW -2B0E ; [*0CD6.0020.0002] # RIGHTWARDS ARROW WITH TIP DOWNWARDS -2B0F ; [*0CD7.0020.0002] # RIGHTWARDS ARROW WITH TIP UPWARDS -2B10 ; [*0CD8.0020.0002] # LEFTWARDS ARROW WITH TIP DOWNWARDS -2B11 ; [*0CD9.0020.0002] # LEFTWARDS ARROW WITH TIP UPWARDS -2B12 ; [*0CDA.0020.0002] # SQUARE WITH TOP HALF BLACK -2B13 ; [*0CDB.0020.0002] # SQUARE WITH BOTTOM HALF BLACK -2B14 ; [*0CDC.0020.0002] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK -2B15 ; [*0CDD.0020.0002] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK -2B16 ; [*0CDE.0020.0002] # DIAMOND WITH LEFT HALF BLACK -2B17 ; [*0CDF.0020.0002] # DIAMOND WITH RIGHT HALF BLACK -2B18 ; [*0CE0.0020.0002] # DIAMOND WITH TOP HALF BLACK -2B19 ; [*0CE1.0020.0002] # DIAMOND WITH BOTTOM HALF BLACK -2B1A ; [*0CE2.0020.0002] # DOTTED SQUARE -2B1B ; [*0CE3.0020.0002] # BLACK LARGE SQUARE -2B1C ; [*0CE4.0020.0002] # WHITE LARGE SQUARE -2B1D ; [*0CE5.0020.0002] # BLACK VERY SMALL SQUARE -2B1E ; [*0CE6.0020.0002] # WHITE VERY SMALL SQUARE -2B1F ; [*0CE7.0020.0002] # BLACK PENTAGON -2B20 ; [*0CE8.0020.0002] # WHITE PENTAGON -2B21 ; [*0CE9.0020.0002] # WHITE HEXAGON -2B22 ; [*0CEA.0020.0002] # BLACK HEXAGON -2B23 ; [*0CEB.0020.0002] # HORIZONTAL BLACK HEXAGON -2B24 ; [*0CEC.0020.0002] # BLACK LARGE CIRCLE -2B25 ; [*0CED.0020.0002] # BLACK MEDIUM DIAMOND -2B26 ; [*0CEE.0020.0002] # WHITE MEDIUM DIAMOND -2B27 ; [*0CEF.0020.0002] # BLACK MEDIUM LOZENGE -2B28 ; [*0CF0.0020.0002] # WHITE MEDIUM LOZENGE -2B29 ; [*0CF1.0020.0002] # BLACK SMALL DIAMOND -2B2A ; [*0CF2.0020.0002] # BLACK SMALL LOZENGE -2B2B ; [*0CF3.0020.0002] # WHITE SMALL LOZENGE -2B2C ; [*0CF4.0020.0002] # BLACK HORIZONTAL ELLIPSE -2B2D ; [*0CF5.0020.0002] # WHITE HORIZONTAL ELLIPSE -2B2E ; [*0CF6.0020.0002] # BLACK VERTICAL ELLIPSE -2B2F ; [*0CF7.0020.0002] # WHITE VERTICAL ELLIPSE -2B30 ; [*0CF8.0020.0002] # LEFT ARROW WITH SMALL CIRCLE -2B31 ; [*0CF9.0020.0002] # THREE LEFTWARDS ARROWS -2B32 ; [*0CFA.0020.0002] # LEFT ARROW WITH CIRCLED PLUS -2B33 ; [*0CFB.0020.0002] # LONG LEFTWARDS SQUIGGLE ARROW -2B34 ; [*0CFC.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE -2B35 ; [*0CFD.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE -2B36 ; [*0CFE.0020.0002] # LEFTWARDS TWO-HEADED ARROW FROM BAR -2B37 ; [*0CFF.0020.0002] # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW -2B38 ; [*0D00.0020.0002] # LEFTWARDS ARROW WITH DOTTED STEM -2B39 ; [*0D01.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE -2B3A ; [*0D02.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -2B3B ; [*0D03.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL -2B3C ; [*0D04.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE -2B3D ; [*0D05.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE -2B3E ; [*0D06.0020.0002] # LEFTWARDS ARROW THROUGH X -2B3F ; [*0D07.0020.0002] # WAVE ARROW POINTING DIRECTLY LEFT -2B40 ; [*0D08.0020.0002] # EQUALS SIGN ABOVE LEFTWARDS ARROW -2B41 ; [*0D09.0020.0002] # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW -2B42 ; [*0D0A.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO -2B43 ; [*0D0B.0020.0002] # RIGHTWARDS ARROW THROUGH GREATER-THAN -2B44 ; [*0D0C.0020.0002] # RIGHTWARDS ARROW THROUGH SUPERSET -2B45 ; [*0D0D.0020.0002] # LEFTWARDS QUADRUPLE ARROW -2B46 ; [*0D0E.0020.0002] # RIGHTWARDS QUADRUPLE ARROW -2B47 ; [*0D0F.0020.0002] # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW -2B48 ; [*0D10.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO -2B49 ; [*0D11.0020.0002] # TILDE OPERATOR ABOVE LEFTWARDS ARROW -2B4A ; [*0D12.0020.0002] # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO -2B4B ; [*0D13.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B4C ; [*0D14.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B4D ; [*0D15.0020.0002] # DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW -2B4E ; [*0D16.0020.0002] # SHORT SLANTED NORTH ARROW -2B4F ; [*0D17.0020.0002] # SHORT BACKSLANTED SOUTH ARROW -2B50 ; [*0D18.0020.0002] # WHITE MEDIUM STAR -2B51 ; [*0D19.0020.0002] # BLACK SMALL STAR -2B52 ; [*0D1A.0020.0002] # WHITE SMALL STAR -2B53 ; [*0D1B.0020.0002] # BLACK RIGHT-POINTING PENTAGON -2B54 ; [*0D1C.0020.0002] # WHITE RIGHT-POINTING PENTAGON -2B55 ; [*0D1D.0020.0002] # HEAVY LARGE CIRCLE -2B56 ; [*0D1E.0020.0002] # HEAVY OVAL WITH OVAL INSIDE -2B57 ; [*0D1F.0020.0002] # HEAVY CIRCLE WITH CIRCLE INSIDE -2B58 ; [*0D20.0020.0002] # HEAVY CIRCLE -2B59 ; [*0D21.0020.0002] # HEAVY CIRCLED SALTIRE -2B5A ; [*0D22.0020.0002] # SLANTED NORTH ARROW WITH HOOKED HEAD -2B5B ; [*0D23.0020.0002] # BACKSLANTED SOUTH ARROW WITH HOOKED TAIL -2B5C ; [*0D24.0020.0002] # SLANTED NORTH ARROW WITH HORIZONTAL TAIL -2B5D ; [*0D25.0020.0002] # BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL -2B5E ; [*0D26.0020.0002] # BENT ARROW POINTING DOWNWARDS THEN NORTH EAST -2B5F ; [*0D27.0020.0002] # SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST -2B60 ; [*0D28.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW -2B61 ; [*0D29.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW -2B62 ; [*0D2A.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW -2B63 ; [*0D2B.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW -2B64 ; [*0D2C.0020.0002] # LEFT RIGHT TRIANGLE-HEADED ARROW -2B65 ; [*0D2D.0020.0002] # UP DOWN TRIANGLE-HEADED ARROW -2B66 ; [*0D2E.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW -2B67 ; [*0D2F.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW -2B68 ; [*0D30.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW -2B69 ; [*0D31.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW -2B6A ; [*0D32.0020.0002] # LEFTWARDS TRIANGLE-HEADED DASHED ARROW -2B6B ; [*0D33.0020.0002] # UPWARDS TRIANGLE-HEADED DASHED ARROW -2B6C ; [*0D34.0020.0002] # RIGHTWARDS TRIANGLE-HEADED DASHED ARROW -2B6D ; [*0D35.0020.0002] # DOWNWARDS TRIANGLE-HEADED DASHED ARROW -2B6E ; [*0D36.0020.0002] # CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW -2B6F ; [*0D37.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW -2B70 ; [*0D38.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW TO BAR -2B71 ; [*0D39.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW TO BAR -2B72 ; [*0D3A.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR -2B73 ; [*0D3B.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW TO BAR -2B76 ; [*0D3C.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW TO BAR -2B77 ; [*0D3D.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW TO BAR -2B78 ; [*0D3E.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW TO BAR -2B79 ; [*0D3F.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW TO BAR -2B7A ; [*0D40.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -2B7B ; [*0D41.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -2B7C ; [*0D42.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -2B7D ; [*0D43.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE -2B7E ; [*0D44.0020.0002] # HORIZONTAL TAB KEY -2B7F ; [*0D45.0020.0002] # VERTICAL TAB KEY -2B80 ; [*0D46.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW -2B81 ; [*0D47.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW -2B82 ; [*0D48.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW -2B83 ; [*0D49.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW -2B84 ; [*0D4A.0020.0002] # LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS -2B85 ; [*0D4B.0020.0002] # UPWARDS TRIANGLE-HEADED PAIRED ARROWS -2B86 ; [*0D4C.0020.0002] # RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS -2B87 ; [*0D4D.0020.0002] # DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS -2B88 ; [*0D4E.0020.0002] # LEFTWARDS BLACK CIRCLED WHITE ARROW -2B89 ; [*0D4F.0020.0002] # UPWARDS BLACK CIRCLED WHITE ARROW -2B8A ; [*0D50.0020.0002] # RIGHTWARDS BLACK CIRCLED WHITE ARROW -2B8B ; [*0D51.0020.0002] # DOWNWARDS BLACK CIRCLED WHITE ARROW -2B8C ; [*0D52.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW -2B8D ; [*0D53.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW -2B8E ; [*0D54.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW -2B8F ; [*0D55.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW -2B90 ; [*0D56.0020.0002] # RETURN LEFT -2B91 ; [*0D57.0020.0002] # RETURN RIGHT -2B92 ; [*0D58.0020.0002] # NEWLINE LEFT -2B93 ; [*0D59.0020.0002] # NEWLINE RIGHT -2B94 ; [*0D5A.0020.0002] # FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE -2B95 ; [*0D5B.0020.0002] # RIGHTWARDS BLACK ARROW -2B98 ; [*0D5C.0020.0002] # THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD -2B99 ; [*0D5D.0020.0002] # THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD -2B9A ; [*0D5E.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD -2B9B ; [*0D5F.0020.0002] # THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD -2B9C ; [*0D60.0020.0002] # BLACK LEFTWARDS EQUILATERAL ARROWHEAD -2B9D ; [*0D61.0020.0002] # BLACK UPWARDS EQUILATERAL ARROWHEAD -2B9E ; [*0D62.0020.0002] # BLACK RIGHTWARDS EQUILATERAL ARROWHEAD -2B9F ; [*0D63.0020.0002] # BLACK DOWNWARDS EQUILATERAL ARROWHEAD -2BA0 ; [*0D64.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS -2BA1 ; [*0D65.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS -2BA2 ; [*0D66.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS -2BA3 ; [*0D67.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS -2BA4 ; [*0D68.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS -2BA5 ; [*0D69.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS -2BA6 ; [*0D6A.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS -2BA7 ; [*0D6B.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS -2BA8 ; [*0D6C.0020.0002] # BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW -2BA9 ; [*0D6D.0020.0002] # BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW -2BAA ; [*0D6E.0020.0002] # BLACK CURVED UPWARDS AND LEFTWARDS ARROW -2BAB ; [*0D6F.0020.0002] # BLACK CURVED UPWARDS AND RIGHTWARDS ARROW -2BAC ; [*0D70.0020.0002] # BLACK CURVED LEFTWARDS AND UPWARDS ARROW -2BAD ; [*0D71.0020.0002] # BLACK CURVED RIGHTWARDS AND UPWARDS ARROW -2BAE ; [*0D72.0020.0002] # BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW -2BAF ; [*0D73.0020.0002] # BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW -2BB0 ; [*0D74.0020.0002] # RIBBON ARROW DOWN LEFT -2BB1 ; [*0D75.0020.0002] # RIBBON ARROW DOWN RIGHT -2BB2 ; [*0D76.0020.0002] # RIBBON ARROW UP LEFT -2BB3 ; [*0D77.0020.0002] # RIBBON ARROW UP RIGHT -2BB4 ; [*0D78.0020.0002] # RIBBON ARROW LEFT UP -2BB5 ; [*0D79.0020.0002] # RIBBON ARROW RIGHT UP -2BB6 ; [*0D7A.0020.0002] # RIBBON ARROW LEFT DOWN -2BB7 ; [*0D7B.0020.0002] # RIBBON ARROW RIGHT DOWN -2BB8 ; [*0D7C.0020.0002] # UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR -2BB9 ; [*0D7D.0020.0002] # UP ARROWHEAD IN A RECTANGLE BOX -2BBD ; [*0D7E.0020.0002] # BALLOT BOX WITH LIGHT X -2BBE ; [*0D7F.0020.0002] # CIRCLED X -2BBF ; [*0D80.0020.0002] # CIRCLED BOLD X -2BC0 ; [*0D81.0020.0002] # BLACK SQUARE CENTRED -2BC1 ; [*0D82.0020.0002] # BLACK DIAMOND CENTRED -2BC2 ; [*0D83.0020.0002] # TURNED BLACK PENTAGON -2BC3 ; [*0D84.0020.0002] # HORIZONTAL BLACK OCTAGON -2BC4 ; [*0D85.0020.0002] # BLACK OCTAGON -2BC5 ; [*0D86.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE CENTRED -2BC6 ; [*0D87.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED -2BC7 ; [*0D88.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED -2BC8 ; [*0D89.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED -2BCA ; [*0D8A.0020.0002] # TOP HALF BLACK CIRCLE -2BCB ; [*0D8B.0020.0002] # BOTTOM HALF BLACK CIRCLE -2BCC ; [*0D8C.0020.0002] # LIGHT FOUR POINTED BLACK CUSP -2BCD ; [*0D8D.0020.0002] # ROTATED LIGHT FOUR POINTED BLACK CUSP -2BCE ; [*0D8E.0020.0002] # WHITE FOUR POINTED CUSP -2BCF ; [*0D8F.0020.0002] # ROTATED WHITE FOUR POINTED CUSP -2BD0 ; [*0D90.0020.0002] # SQUARE POSITION INDICATOR -2BD1 ; [*0D91.0020.0002] # UNCERTAINTY SIGN -2BEC ; [*0D92.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2BED ; [*0D93.0020.0002] # UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2BEE ; [*0D94.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2BEF ; [*0D95.0020.0002] # DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2CE5 ; [*0D96.0020.0002] # COPTIC SYMBOL MI RO -2CE6 ; [*0D97.0020.0002] # COPTIC SYMBOL PI RO -2CE7 ; [*0D98.0020.0002] # COPTIC SYMBOL STAUROS -2CE8 ; [*0D99.0020.0002] # COPTIC SYMBOL TAU RO -2CE9 ; [*0D9A.0020.0002] # COPTIC SYMBOL KHI RO -2CEA ; [*0D9B.0020.0002] # COPTIC SYMBOL SHIMA SIMA -2CF9 ; [*0281.0020.0002] # COPTIC OLD NUBIAN FULL STOP -2CFA ; [*026E.0020.0002] # COPTIC OLD NUBIAN DIRECT QUESTION MARK -2CFB ; [*026F.0020.0002] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK -2CFC ; [*02F6.0020.0002] # COPTIC OLD NUBIAN VERSE DIVIDER -2CFD ; [*1AE2.0020.0002] # COPTIC FRACTION ONE HALF -2CFE ; [*0282.0020.0002] # COPTIC FULL STOP -2CFF ; [*02F7.0020.0002] # COPTIC MORPHOLOGICAL DIVIDER -2D70 ; [*0427.0020.0002] # TIFINAGH SEPARATOR MARK +207A ; [*062C.0020.0014] # SUPERSCRIPT PLUS SIGN +207B ; [*0637.0020.0014] # SUPERSCRIPT MINUS +207C ; [*0631.0020.0014] # SUPERSCRIPT EQUALS SIGN +207D ; [*0318.0020.0014] # SUPERSCRIPT LEFT PARENTHESIS +207E ; [*0319.0020.0014] # SUPERSCRIPT RIGHT PARENTHESIS +208A ; [*062C.0020.0015] # SUBSCRIPT PLUS SIGN +208B ; [*0637.0020.0015] # SUBSCRIPT MINUS +208C ; [*0631.0020.0015] # SUBSCRIPT EQUALS SIGN +208D ; [*0318.0020.0015] # SUBSCRIPT LEFT PARENTHESIS +208E ; [*0319.0020.0015] # SUBSCRIPT RIGHT PARENTHESIS +2104 ; [*059C.0020.0002] # CENTRE LINE SYMBOL +2108 ; [*059D.0020.0002] # SCRUPLE +2114 ; [*059E.0020.0002] # L B BAR SYMBOL +2117 ; [*059F.0020.0002] # SOUND RECORDING COPYRIGHT +2118 ; [*05A0.0020.0002] # SCRIPT CAPITAL P +211E ; [*05A1.0020.0002] # PRESCRIPTION TAKE +211F ; [*05A2.0020.0002] # RESPONSE +2123 ; [*05A3.0020.0002] # VERSICLE +2125 ; [*05A4.0020.0002] # OUNCE SIGN +2127 ; [*05A5.0020.0002] # INVERTED OHM SIGN +2129 ; [*05A6.0020.0002] # TURNED GREEK SMALL LETTER IOTA +212E ; [*05A7.0020.0002] # ESTIMATED SYMBOL +213A ; [*05A8.0020.0002] # ROTATED CAPITAL Q +2140 ; [*062B.0020.0005] # DOUBLE-STRUCK N-ARY SUMMATION +2141 ; [*05A9.0020.0002] # TURNED SANS-SERIF CAPITAL G +2142 ; [*05AA.0020.0002] # TURNED SANS-SERIF CAPITAL L +2143 ; [*05AB.0020.0002] # REVERSED SANS-SERIF CAPITAL L +2144 ; [*05AC.0020.0002] # TURNED SANS-SERIF CAPITAL Y +214A ; [*05AD.0020.0002] # PROPERTY LINE +214B ; [*06C7.0020.0002] # TURNED AMPERSAND +214C ; [*05AE.0020.0002] # PER SIGN +214F ; [*05AF.0020.0002] # SYMBOL FOR SAMARITAN SOURCE +2180 ; [*1B2A.0020.0002] # ROMAN NUMERAL ONE THOUSAND C D +2181 ; [*1B2B.0020.0002] # ROMAN NUMERAL FIVE THOUSAND +2182 ; [*1B2C.0020.0002] # ROMAN NUMERAL TEN THOUSAND +2186 ; [*1B2D.0020.0002] # ROMAN NUMERAL FIFTY EARLY FORM +2187 ; [*1B2E.0020.0002] # ROMAN NUMERAL FIFTY THOUSAND +2188 ; [*1B2F.0020.0002] # ROMAN NUMERAL ONE HUNDRED THOUSAND +218A ; [*05B0.0020.0002] # TURNED DIGIT TWO +218B ; [*05B1.0020.0002] # TURNED DIGIT THREE +2190 ; [*05B2.0020.0002] # LEFTWARDS ARROW +2191 ; [*05B4.0020.0002] # UPWARDS ARROW +2192 ; [*05B3.0020.0002] # RIGHTWARDS ARROW +2193 ; [*05B5.0020.0002] # DOWNWARDS ARROW +2194 ; [*05B6.0020.0002] # LEFT RIGHT ARROW +2195 ; [*05B7.0020.0002] # UP DOWN ARROW +2196 ; [*05B8.0020.0002] # NORTH WEST ARROW +2197 ; [*05B9.0020.0002] # NORTH EAST ARROW +2198 ; [*05BA.0020.0002] # SOUTH EAST ARROW +2199 ; [*05BB.0020.0002] # SOUTH WEST ARROW +219A ; [*05B2.0020.0002][.0000.002F.0002] # LEFTWARDS ARROW WITH STROKE +219B ; [*05B3.0020.0002][.0000.002F.0002] # RIGHTWARDS ARROW WITH STROKE +219C ; [*05BC.0020.0002] # LEFTWARDS WAVE ARROW +219D ; [*05BD.0020.0002] # RIGHTWARDS WAVE ARROW +219E ; [*05BE.0020.0002] # LEFTWARDS TWO HEADED ARROW +219F ; [*05BF.0020.0002] # UPWARDS TWO HEADED ARROW +21A0 ; [*05C0.0020.0002] # RIGHTWARDS TWO HEADED ARROW +21A1 ; [*05C1.0020.0002] # DOWNWARDS TWO HEADED ARROW +21A2 ; [*05C2.0020.0002] # LEFTWARDS ARROW WITH TAIL +21A3 ; [*05C3.0020.0002] # RIGHTWARDS ARROW WITH TAIL +21A4 ; [*05C4.0020.0002] # LEFTWARDS ARROW FROM BAR +21A5 ; [*05C5.0020.0002] # UPWARDS ARROW FROM BAR +21A6 ; [*05C6.0020.0002] # RIGHTWARDS ARROW FROM BAR +21A7 ; [*05C7.0020.0002] # DOWNWARDS ARROW FROM BAR +21A8 ; [*05C8.0020.0002] # UP DOWN ARROW WITH BASE +21A9 ; [*05C9.0020.0002] # LEFTWARDS ARROW WITH HOOK +21AA ; [*05CA.0020.0002] # RIGHTWARDS ARROW WITH HOOK +21AB ; [*05CB.0020.0002] # LEFTWARDS ARROW WITH LOOP +21AC ; [*05CC.0020.0002] # RIGHTWARDS ARROW WITH LOOP +21AD ; [*05CD.0020.0002] # LEFT RIGHT WAVE ARROW +21AE ; [*05B6.0020.0002][.0000.002F.0002] # LEFT RIGHT ARROW WITH STROKE +21AF ; [*05CE.0020.0002] # DOWNWARDS ZIGZAG ARROW +21B0 ; [*05CF.0020.0002] # UPWARDS ARROW WITH TIP LEFTWARDS +21B1 ; [*05D0.0020.0002] # UPWARDS ARROW WITH TIP RIGHTWARDS +21B2 ; [*05D1.0020.0002] # DOWNWARDS ARROW WITH TIP LEFTWARDS +21B3 ; [*05D2.0020.0002] # DOWNWARDS ARROW WITH TIP RIGHTWARDS +21B4 ; [*05D3.0020.0002] # RIGHTWARDS ARROW WITH CORNER DOWNWARDS +21B5 ; [*05D4.0020.0002] # DOWNWARDS ARROW WITH CORNER LEFTWARDS +21B6 ; [*05D5.0020.0002] # ANTICLOCKWISE TOP SEMICIRCLE ARROW +21B7 ; [*05D6.0020.0002] # CLOCKWISE TOP SEMICIRCLE ARROW +21B8 ; [*05D7.0020.0002] # NORTH WEST ARROW TO LONG BAR +21B9 ; [*05D8.0020.0002] # LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA ; [*05D9.0020.0002] # ANTICLOCKWISE OPEN CIRCLE ARROW +21BB ; [*05DA.0020.0002] # CLOCKWISE OPEN CIRCLE ARROW +21BC ; [*05DB.0020.0002] # LEFTWARDS HARPOON WITH BARB UPWARDS +21BD ; [*05DC.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWNWARDS +21BE ; [*05DD.0020.0002] # UPWARDS HARPOON WITH BARB RIGHTWARDS +21BF ; [*05DE.0020.0002] # UPWARDS HARPOON WITH BARB LEFTWARDS +21C0 ; [*05DF.0020.0002] # RIGHTWARDS HARPOON WITH BARB UPWARDS +21C1 ; [*05E0.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWNWARDS +21C2 ; [*05E1.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHTWARDS +21C3 ; [*05E2.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFTWARDS +21C4 ; [*05E3.0020.0002] # RIGHTWARDS ARROW OVER LEFTWARDS ARROW +21C5 ; [*05E4.0020.0002] # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +21C6 ; [*05E5.0020.0002] # LEFTWARDS ARROW OVER RIGHTWARDS ARROW +21C7 ; [*05E6.0020.0002] # LEFTWARDS PAIRED ARROWS +21C8 ; [*05E7.0020.0002] # UPWARDS PAIRED ARROWS +21C9 ; [*05E8.0020.0002] # RIGHTWARDS PAIRED ARROWS +21CA ; [*05E9.0020.0002] # DOWNWARDS PAIRED ARROWS +21CB ; [*05EA.0020.0002] # LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +21CC ; [*05EB.0020.0002] # RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +21CD ; [*05EC.0020.0002][.0000.002F.0002] # LEFTWARDS DOUBLE ARROW WITH STROKE +21CE ; [*05F0.0020.0002][.0000.002F.0002] # LEFT RIGHT DOUBLE ARROW WITH STROKE +21CF ; [*05EE.0020.0002][.0000.002F.0002] # RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0 ; [*05EC.0020.0002] # LEFTWARDS DOUBLE ARROW +21D1 ; [*05ED.0020.0002] # UPWARDS DOUBLE ARROW +21D2 ; [*05EE.0020.0002] # RIGHTWARDS DOUBLE ARROW +21D3 ; [*05EF.0020.0002] # DOWNWARDS DOUBLE ARROW +21D4 ; [*05F0.0020.0002] # LEFT RIGHT DOUBLE ARROW +21D5 ; [*05F1.0020.0002] # UP DOWN DOUBLE ARROW +21D6 ; [*05F2.0020.0002] # NORTH WEST DOUBLE ARROW +21D7 ; [*05F3.0020.0002] # NORTH EAST DOUBLE ARROW +21D8 ; [*05F4.0020.0002] # SOUTH EAST DOUBLE ARROW +21D9 ; [*05F5.0020.0002] # SOUTH WEST DOUBLE ARROW +21DA ; [*05F6.0020.0002] # LEFTWARDS TRIPLE ARROW +21DB ; [*05F7.0020.0002] # RIGHTWARDS TRIPLE ARROW +21DC ; [*05F8.0020.0002] # LEFTWARDS SQUIGGLE ARROW +21DD ; [*05F9.0020.0002] # RIGHTWARDS SQUIGGLE ARROW +21DE ; [*05FA.0020.0002] # UPWARDS ARROW WITH DOUBLE STROKE +21DF ; [*05FB.0020.0002] # DOWNWARDS ARROW WITH DOUBLE STROKE +21E0 ; [*05FC.0020.0002] # LEFTWARDS DASHED ARROW +21E1 ; [*05FD.0020.0002] # UPWARDS DASHED ARROW +21E2 ; [*05FE.0020.0002] # RIGHTWARDS DASHED ARROW +21E3 ; [*05FF.0020.0002] # DOWNWARDS DASHED ARROW +21E4 ; [*0600.0020.0002] # LEFTWARDS ARROW TO BAR +21E5 ; [*0601.0020.0002] # RIGHTWARDS ARROW TO BAR +21E6 ; [*0602.0020.0002] # LEFTWARDS WHITE ARROW +21E7 ; [*0603.0020.0002] # UPWARDS WHITE ARROW +21E8 ; [*0604.0020.0002] # RIGHTWARDS WHITE ARROW +21E9 ; [*0605.0020.0002] # DOWNWARDS WHITE ARROW +21EA ; [*0606.0020.0002] # UPWARDS WHITE ARROW FROM BAR +21EB ; [*0607.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL +21EC ; [*0608.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR +21ED ; [*0609.0020.0002] # UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR +21EE ; [*060A.0020.0002] # UPWARDS WHITE DOUBLE ARROW +21EF ; [*060B.0020.0002] # UPWARDS WHITE DOUBLE ARROW ON PEDESTAL +21F0 ; [*060C.0020.0002] # RIGHTWARDS WHITE ARROW FROM WALL +21F1 ; [*060D.0020.0002] # NORTH WEST ARROW TO CORNER +21F2 ; [*060E.0020.0002] # SOUTH EAST ARROW TO CORNER +21F3 ; [*060F.0020.0002] # UP DOWN WHITE ARROW +21F4 ; [*0610.0020.0002] # RIGHT ARROW WITH SMALL CIRCLE +21F5 ; [*0611.0020.0002] # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +21F6 ; [*0612.0020.0002] # THREE RIGHTWARDS ARROWS +21F7 ; [*0613.0020.0002] # LEFTWARDS ARROW WITH VERTICAL STROKE +21F8 ; [*0614.0020.0002] # RIGHTWARDS ARROW WITH VERTICAL STROKE +21F9 ; [*0615.0020.0002] # LEFT RIGHT ARROW WITH VERTICAL STROKE +21FA ; [*0616.0020.0002] # LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FB ; [*0617.0020.0002] # RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE +21FC ; [*0618.0020.0002] # LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE +21FD ; [*0619.0020.0002] # LEFTWARDS OPEN-HEADED ARROW +21FE ; [*061A.0020.0002] # RIGHTWARDS OPEN-HEADED ARROW +21FF ; [*061B.0020.0002] # LEFT RIGHT OPEN-HEADED ARROW +2200 ; [*061C.0020.0002] # FOR ALL +2201 ; [*061D.0020.0002] # COMPLEMENT +2202 ; [*061E.0020.0002] # PARTIAL DIFFERENTIAL +2203 ; [*061F.0020.0002] # THERE EXISTS +2204 ; [*061F.0020.0002][.0000.002F.0002] # THERE DOES NOT EXIST +2205 ; [*0620.0020.0002] # EMPTY SET +2206 ; [*0621.0020.0002] # INCREMENT +2207 ; [*0622.0020.0002] # NABLA +2208 ; [*0623.0020.0002] # ELEMENT OF +2209 ; [*0623.0020.0002][.0000.002F.0002] # NOT AN ELEMENT OF +220A ; [*0624.0020.0002] # SMALL ELEMENT OF +220B ; [*0625.0020.0002] # CONTAINS AS MEMBER +220C ; [*0625.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS MEMBER +220D ; [*0626.0020.0002] # SMALL CONTAINS AS MEMBER +220E ; [*0628.0020.0002] # END OF PROOF +220F ; [*0629.0020.0002] # N-ARY PRODUCT +2210 ; [*062A.0020.0002] # N-ARY COPRODUCT +2211 ; [*062B.0020.0002] # N-ARY SUMMATION +2212 ; [*0637.0020.0002] # MINUS SIGN +2213 ; [*0639.0020.0002] # MINUS-OR-PLUS SIGN +2214 ; [*063A.0020.0002] # DOT PLUS +2215 ; [*063B.0020.0002] # DIVISION SLASH +2216 ; [*063D.0020.0002] # SET MINUS +2217 ; [*063E.0020.0002] # ASTERISK OPERATOR +2218 ; [*063F.0020.0002] # RING OPERATOR +2219 ; [*0640.0020.0002] # BULLET OPERATOR +221A ; [*0641.0020.0002] # SQUARE ROOT +221B ; [*0642.0020.0002] # CUBE ROOT +221C ; [*0644.0020.0002] # FOURTH ROOT +221D ; [*0646.0020.0002] # PROPORTIONAL TO +221E ; [*0647.0020.0002] # INFINITY +221F ; [*0648.0020.0002] # RIGHT ANGLE +2220 ; [*0649.0020.0002] # ANGLE +2221 ; [*064A.0020.0002] # MEASURED ANGLE +2222 ; [*064B.0020.0002] # SPHERICAL ANGLE +2223 ; [*064C.0020.0002] # DIVIDES +2224 ; [*064C.0020.0002][.0000.002F.0002] # DOES NOT DIVIDE +2225 ; [*064D.0020.0002] # PARALLEL TO +2226 ; [*064D.0020.0002][.0000.002F.0002] # NOT PARALLEL TO +2227 ; [*064E.0020.0002] # LOGICAL AND +2228 ; [*064F.0020.0002] # LOGICAL OR +2229 ; [*0650.0020.0002] # INTERSECTION +222A ; [*0651.0020.0002] # UNION +222B ; [*0652.0020.0002] # INTEGRAL +222C ; [*0652.0020.0004][*0652.0020.0004] # DOUBLE INTEGRAL +222D ; [*0652.0020.0004][*0652.0020.0004][*0652.0020.0004] # TRIPLE INTEGRAL +222E ; [*0653.0020.0002] # CONTOUR INTEGRAL +222F ; [*0653.0020.0004][*0653.0020.0004] # SURFACE INTEGRAL +2230 ; [*0653.0020.0004][*0653.0020.0004][*0653.0020.0004] # VOLUME INTEGRAL +2231 ; [*0654.0020.0002] # CLOCKWISE INTEGRAL +2232 ; [*0655.0020.0002] # CLOCKWISE CONTOUR INTEGRAL +2233 ; [*0656.0020.0002] # ANTICLOCKWISE CONTOUR INTEGRAL +2234 ; [*0657.0020.0002] # THEREFORE +2235 ; [*0658.0020.0002] # BECAUSE +2236 ; [*0659.0020.0002] # RATIO +2237 ; [*065A.0020.0002] # PROPORTION +2238 ; [*065B.0020.0002] # DOT MINUS +2239 ; [*065C.0020.0002] # EXCESS +223A ; [*065D.0020.0002] # GEOMETRIC PROPORTION +223B ; [*065E.0020.0002] # HOMOTHETIC +223C ; [*065F.0020.0002] # TILDE OPERATOR +223D ; [*0660.0020.0002] # REVERSED TILDE +223E ; [*0661.0020.0002] # INVERTED LAZY S +223F ; [*0662.0020.0002] # SINE WAVE +2240 ; [*0663.0020.0002] # WREATH PRODUCT +2241 ; [*065F.0020.0002][.0000.002F.0002] # NOT TILDE +2242 ; [*0664.0020.0002] # MINUS TILDE +2243 ; [*0665.0020.0002] # ASYMPTOTICALLY EQUAL TO +2244 ; [*0665.0020.0002][.0000.002F.0002] # NOT ASYMPTOTICALLY EQUAL TO +2245 ; [*0666.0020.0002] # APPROXIMATELY EQUAL TO +2246 ; [*0667.0020.0002] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +2247 ; [*0666.0020.0002][.0000.002F.0002] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248 ; [*0668.0020.0002] # ALMOST EQUAL TO +2249 ; [*0668.0020.0002][.0000.002F.0002] # NOT ALMOST EQUAL TO +224A ; [*0669.0020.0002] # ALMOST EQUAL OR EQUAL TO +224B ; [*066A.0020.0002] # TRIPLE TILDE +224C ; [*066B.0020.0002] # ALL EQUAL TO +224D ; [*066C.0020.0002] # EQUIVALENT TO +224E ; [*066D.0020.0002] # GEOMETRICALLY EQUIVALENT TO +224F ; [*066E.0020.0002] # DIFFERENCE BETWEEN +2250 ; [*066F.0020.0002] # APPROACHES THE LIMIT +2251 ; [*0670.0020.0002] # GEOMETRICALLY EQUAL TO +2252 ; [*0671.0020.0002] # APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253 ; [*0672.0020.0002] # IMAGE OF OR APPROXIMATELY EQUAL TO +2254 ; [*0673.0020.0002] # COLON EQUALS +2255 ; [*0674.0020.0002] # EQUALS COLON +2256 ; [*0675.0020.0002] # RING IN EQUAL TO +2257 ; [*0676.0020.0002] # RING EQUAL TO +2258 ; [*0677.0020.0002] # CORRESPONDS TO +2259 ; [*0678.0020.0002] # ESTIMATES +225A ; [*0679.0020.0002] # EQUIANGULAR TO +225B ; [*067A.0020.0002] # STAR EQUALS +225C ; [*067B.0020.0002] # DELTA EQUAL TO +225D ; [*067C.0020.0002] # EQUAL TO BY DEFINITION +225E ; [*067D.0020.0002] # MEASURED BY +225F ; [*067E.0020.0002] # QUESTIONED EQUAL TO +2260 ; [*0631.0020.0002][.0000.002F.0002] # NOT EQUAL TO +2261 ; [*067F.0020.0002] # IDENTICAL TO +2262 ; [*067F.0020.0002][.0000.002F.0002] # NOT IDENTICAL TO +2263 ; [*0680.0020.0002] # STRICTLY EQUIVALENT TO +2264 ; [*0681.0020.0002] # LESS-THAN OR EQUAL TO +2265 ; [*0682.0020.0002] # GREATER-THAN OR EQUAL TO +2266 ; [*0683.0020.0002] # LESS-THAN OVER EQUAL TO +2267 ; [*0684.0020.0002] # GREATER-THAN OVER EQUAL TO +2268 ; [*0685.0020.0002] # LESS-THAN BUT NOT EQUAL TO +2269 ; [*0686.0020.0002] # GREATER-THAN BUT NOT EQUAL TO +226A ; [*0687.0020.0002] # MUCH LESS-THAN +226B ; [*0688.0020.0002] # MUCH GREATER-THAN +226C ; [*0689.0020.0002] # BETWEEN +226D ; [*066C.0020.0002][.0000.002F.0002] # NOT EQUIVALENT TO +226E ; [*0630.0020.0002][.0000.002F.0002] # NOT LESS-THAN +226F ; [*0632.0020.0002][.0000.002F.0002] # NOT GREATER-THAN +2270 ; [*0681.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUAL TO +2271 ; [*0682.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUAL TO +2272 ; [*068A.0020.0002] # LESS-THAN OR EQUIVALENT TO +2273 ; [*068B.0020.0002] # GREATER-THAN OR EQUIVALENT TO +2274 ; [*068A.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR EQUIVALENT TO +2275 ; [*068B.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR EQUIVALENT TO +2276 ; [*068C.0020.0002] # LESS-THAN OR GREATER-THAN +2277 ; [*068D.0020.0002] # GREATER-THAN OR LESS-THAN +2278 ; [*068C.0020.0002][.0000.002F.0002] # NEITHER LESS-THAN NOR GREATER-THAN +2279 ; [*068D.0020.0002][.0000.002F.0002] # NEITHER GREATER-THAN NOR LESS-THAN +227A ; [*068E.0020.0002] # PRECEDES +227B ; [*068F.0020.0002] # SUCCEEDS +227C ; [*0690.0020.0002] # PRECEDES OR EQUAL TO +227D ; [*0691.0020.0002] # SUCCEEDS OR EQUAL TO +227E ; [*0692.0020.0002] # PRECEDES OR EQUIVALENT TO +227F ; [*0693.0020.0002] # SUCCEEDS OR EQUIVALENT TO +2280 ; [*068E.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE +2281 ; [*068F.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED +2282 ; [*0694.0020.0002] # SUBSET OF +2283 ; [*0695.0020.0002] # SUPERSET OF +2284 ; [*0694.0020.0002][.0000.002F.0002] # NOT A SUBSET OF +2285 ; [*0695.0020.0002][.0000.002F.0002] # NOT A SUPERSET OF +2286 ; [*0696.0020.0002] # SUBSET OF OR EQUAL TO +2287 ; [*0697.0020.0002] # SUPERSET OF OR EQUAL TO +2288 ; [*0696.0020.0002][.0000.002F.0002] # NEITHER A SUBSET OF NOR EQUAL TO +2289 ; [*0697.0020.0002][.0000.002F.0002] # NEITHER A SUPERSET OF NOR EQUAL TO +228A ; [*0698.0020.0002] # SUBSET OF WITH NOT EQUAL TO +228B ; [*0699.0020.0002] # SUPERSET OF WITH NOT EQUAL TO +228C ; [*069A.0020.0002] # MULTISET +228D ; [*069B.0020.0002] # MULTISET MULTIPLICATION +228E ; [*069C.0020.0002] # MULTISET UNION +228F ; [*069D.0020.0002] # SQUARE IMAGE OF +2290 ; [*069E.0020.0002] # SQUARE ORIGINAL OF +2291 ; [*069F.0020.0002] # SQUARE IMAGE OF OR EQUAL TO +2292 ; [*06A0.0020.0002] # SQUARE ORIGINAL OF OR EQUAL TO +2293 ; [*06A1.0020.0002] # SQUARE CAP +2294 ; [*06A2.0020.0002] # SQUARE CUP +2295 ; [*06A3.0020.0002] # CIRCLED PLUS +2296 ; [*06A4.0020.0002] # CIRCLED MINUS +2297 ; [*06A5.0020.0002] # CIRCLED TIMES +2298 ; [*06A6.0020.0002] # CIRCLED DIVISION SLASH +2299 ; [*06A7.0020.0002] # CIRCLED DOT OPERATOR +229A ; [*06A8.0020.0002] # CIRCLED RING OPERATOR +229B ; [*06A9.0020.0002] # CIRCLED ASTERISK OPERATOR +229C ; [*06AA.0020.0002] # CIRCLED EQUALS +229D ; [*06AB.0020.0002] # CIRCLED DASH +229E ; [*06AC.0020.0002] # SQUARED PLUS +229F ; [*06AD.0020.0002] # SQUARED MINUS +22A0 ; [*06AE.0020.0002] # SQUARED TIMES +22A1 ; [*06AF.0020.0002] # SQUARED DOT OPERATOR +22A2 ; [*06B0.0020.0002] # RIGHT TACK +22A3 ; [*06B1.0020.0002] # LEFT TACK +22A4 ; [*06B2.0020.0002] # DOWN TACK +22A5 ; [*06B3.0020.0002] # UP TACK +22A6 ; [*06B4.0020.0002] # ASSERTION +22A7 ; [*06B5.0020.0002] # MODELS +22A8 ; [*06B6.0020.0002] # TRUE +22A9 ; [*06B7.0020.0002] # FORCES +22AA ; [*06B8.0020.0002] # TRIPLE VERTICAL BAR RIGHT TURNSTILE +22AB ; [*06B9.0020.0002] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22AC ; [*06B0.0020.0002][.0000.002F.0002] # DOES NOT PROVE +22AD ; [*06B6.0020.0002][.0000.002F.0002] # NOT TRUE +22AE ; [*06B7.0020.0002][.0000.002F.0002] # DOES NOT FORCE +22AF ; [*06B9.0020.0002][.0000.002F.0002] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22B0 ; [*06BA.0020.0002] # PRECEDES UNDER RELATION +22B1 ; [*06BB.0020.0002] # SUCCEEDS UNDER RELATION +22B2 ; [*06BC.0020.0002] # NORMAL SUBGROUP OF +22B3 ; [*06BD.0020.0002] # CONTAINS AS NORMAL SUBGROUP +22B4 ; [*06BE.0020.0002] # NORMAL SUBGROUP OF OR EQUAL TO +22B5 ; [*06BF.0020.0002] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6 ; [*06C0.0020.0002] # ORIGINAL OF +22B7 ; [*06C1.0020.0002] # IMAGE OF +22B8 ; [*06C2.0020.0002] # MULTIMAP +22B9 ; [*06C3.0020.0002] # HERMITIAN CONJUGATE MATRIX +22BA ; [*06C4.0020.0002] # INTERCALATE +22BB ; [*06C5.0020.0002] # XOR +22BC ; [*06C6.0020.0002] # NAND +22BD ; [*06C8.0020.0002] # NOR +22BE ; [*06C9.0020.0002] # RIGHT ANGLE WITH ARC +22BF ; [*06CA.0020.0002] # RIGHT TRIANGLE +22C0 ; [*06CB.0020.0002] # N-ARY LOGICAL AND +22C1 ; [*06CC.0020.0002] # N-ARY LOGICAL OR +22C2 ; [*06CD.0020.0002] # N-ARY INTERSECTION +22C3 ; [*06CE.0020.0002] # N-ARY UNION +22C4 ; [*06CF.0020.0002] # DIAMOND OPERATOR +22C5 ; [*06D0.0020.0002] # DOT OPERATOR +22C6 ; [*06D1.0020.0002] # STAR OPERATOR +22C7 ; [*06D2.0020.0002] # DIVISION TIMES +22C8 ; [*06D3.0020.0002] # BOWTIE +22C9 ; [*06D4.0020.0002] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA ; [*06D5.0020.0002] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB ; [*06D6.0020.0002] # LEFT SEMIDIRECT PRODUCT +22CC ; [*06D7.0020.0002] # RIGHT SEMIDIRECT PRODUCT +22CD ; [*06D8.0020.0002] # REVERSED TILDE EQUALS +22CE ; [*06D9.0020.0002] # CURLY LOGICAL OR +22CF ; [*06DA.0020.0002] # CURLY LOGICAL AND +22D0 ; [*06DB.0020.0002] # DOUBLE SUBSET +22D1 ; [*06DC.0020.0002] # DOUBLE SUPERSET +22D2 ; [*06DD.0020.0002] # DOUBLE INTERSECTION +22D3 ; [*06DE.0020.0002] # DOUBLE UNION +22D4 ; [*06DF.0020.0002] # PITCHFORK +22D5 ; [*06E0.0020.0002] # EQUAL AND PARALLEL TO +22D6 ; [*06E1.0020.0002] # LESS-THAN WITH DOT +22D7 ; [*06E2.0020.0002] # GREATER-THAN WITH DOT +22D8 ; [*06E3.0020.0002] # VERY MUCH LESS-THAN +22D9 ; [*06E4.0020.0002] # VERY MUCH GREATER-THAN +22DA ; [*06E5.0020.0002] # LESS-THAN EQUAL TO OR GREATER-THAN +22DB ; [*06E6.0020.0002] # GREATER-THAN EQUAL TO OR LESS-THAN +22DC ; [*06E7.0020.0002] # EQUAL TO OR LESS-THAN +22DD ; [*06E8.0020.0002] # EQUAL TO OR GREATER-THAN +22DE ; [*06E9.0020.0002] # EQUAL TO OR PRECEDES +22DF ; [*06EA.0020.0002] # EQUAL TO OR SUCCEEDS +22E0 ; [*0690.0020.0002][.0000.002F.0002] # DOES NOT PRECEDE OR EQUAL +22E1 ; [*0691.0020.0002][.0000.002F.0002] # DOES NOT SUCCEED OR EQUAL +22E2 ; [*069F.0020.0002][.0000.002F.0002] # NOT SQUARE IMAGE OF OR EQUAL TO +22E3 ; [*06A0.0020.0002][.0000.002F.0002] # NOT SQUARE ORIGINAL OF OR EQUAL TO +22E4 ; [*06EB.0020.0002] # SQUARE IMAGE OF OR NOT EQUAL TO +22E5 ; [*06EC.0020.0002] # SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6 ; [*06ED.0020.0002] # LESS-THAN BUT NOT EQUIVALENT TO +22E7 ; [*06EE.0020.0002] # GREATER-THAN BUT NOT EQUIVALENT TO +22E8 ; [*06EF.0020.0002] # PRECEDES BUT NOT EQUIVALENT TO +22E9 ; [*06F0.0020.0002] # SUCCEEDS BUT NOT EQUIVALENT TO +22EA ; [*06BC.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF +22EB ; [*06BD.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC ; [*06BE.0020.0002][.0000.002F.0002] # NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED ; [*06BF.0020.0002][.0000.002F.0002] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +22EE ; [*06F1.0020.0002] # VERTICAL ELLIPSIS +22EF ; [*06F2.0020.0002] # MIDLINE HORIZONTAL ELLIPSIS +22F0 ; [*06F3.0020.0002] # UP RIGHT DIAGONAL ELLIPSIS +22F1 ; [*06F4.0020.0002] # DOWN RIGHT DIAGONAL ELLIPSIS +22F2 ; [*06F5.0020.0002] # ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3 ; [*06F6.0020.0002] # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4 ; [*06F7.0020.0002] # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F5 ; [*06F8.0020.0002] # ELEMENT OF WITH DOT ABOVE +22F6 ; [*06F9.0020.0002] # ELEMENT OF WITH OVERBAR +22F7 ; [*06FA.0020.0002] # SMALL ELEMENT OF WITH OVERBAR +22F8 ; [*06FB.0020.0002] # ELEMENT OF WITH UNDERBAR +22F9 ; [*06FC.0020.0002] # ELEMENT OF WITH TWO HORIZONTAL STROKES +22FA ; [*06FD.0020.0002] # CONTAINS WITH LONG HORIZONTAL STROKE +22FB ; [*06FE.0020.0002] # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC ; [*06FF.0020.0002] # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD ; [*0700.0020.0002] # CONTAINS WITH OVERBAR +22FE ; [*0701.0020.0002] # SMALL CONTAINS WITH OVERBAR +22FF ; [*0702.0020.0002] # Z NOTATION BAG MEMBERSHIP +2300 ; [*0703.0020.0002] # DIAMETER SIGN +2301 ; [*0704.0020.0002] # ELECTRIC ARROW +2302 ; [*0705.0020.0002] # HOUSE +2303 ; [*0706.0020.0002] # UP ARROWHEAD +2304 ; [*0707.0020.0002] # DOWN ARROWHEAD +2305 ; [*0708.0020.0002] # PROJECTIVE +2306 ; [*0709.0020.0002] # PERSPECTIVE +2307 ; [*070A.0020.0002] # WAVY LINE +2308 ; [*0326.0020.0002] # LEFT CEILING +2309 ; [*0327.0020.0002] # RIGHT CEILING +230A ; [*0328.0020.0002] # LEFT FLOOR +230B ; [*0329.0020.0002] # RIGHT FLOOR +230C ; [*070B.0020.0002] # BOTTOM RIGHT CROP +230D ; [*070C.0020.0002] # BOTTOM LEFT CROP +230E ; [*070D.0020.0002] # TOP RIGHT CROP +230F ; [*070E.0020.0002] # TOP LEFT CROP +2310 ; [*070F.0020.0002] # REVERSED NOT SIGN +2311 ; [*0710.0020.0002] # SQUARE LOZENGE +2312 ; [*0711.0020.0002] # ARC +2313 ; [*0712.0020.0002] # SEGMENT +2314 ; [*0713.0020.0002] # SECTOR +2315 ; [*0714.0020.0002] # TELEPHONE RECORDER +2316 ; [*0715.0020.0002] # POSITION INDICATOR +2317 ; [*0716.0020.0002] # VIEWDATA SQUARE +2318 ; [*0717.0020.0002] # PLACE OF INTEREST SIGN +2319 ; [*0718.0020.0002] # TURNED NOT SIGN +231A ; [*0719.0020.0002] # WATCH +231B ; [*071A.0020.0002] # HOURGLASS +231C ; [*071B.0020.0002] # TOP LEFT CORNER +231D ; [*071C.0020.0002] # TOP RIGHT CORNER +231E ; [*071D.0020.0002] # BOTTOM LEFT CORNER +231F ; [*071E.0020.0002] # BOTTOM RIGHT CORNER +2320 ; [*071F.0020.0002] # TOP HALF INTEGRAL +2321 ; [*0720.0020.0002] # BOTTOM HALF INTEGRAL +2322 ; [*0721.0020.0002] # FROWN +2323 ; [*0722.0020.0002] # SMILE +2324 ; [*0723.0020.0002] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS +2325 ; [*0724.0020.0002] # OPTION KEY +2326 ; [*0725.0020.0002] # ERASE TO THE RIGHT +2327 ; [*0726.0020.0002] # X IN A RECTANGLE BOX +2328 ; [*0727.0020.0002] # KEYBOARD +2329 ; [*0370.0020.0002] # LEFT-POINTING ANGLE BRACKET +232A ; [*0371.0020.0002] # RIGHT-POINTING ANGLE BRACKET +232B ; [*0728.0020.0002] # ERASE TO THE LEFT +232C ; [*0729.0020.0002] # BENZENE RING +232D ; [*072A.0020.0002] # CYLINDRICITY +232E ; [*072B.0020.0002] # ALL AROUND-PROFILE +232F ; [*072C.0020.0002] # SYMMETRY +2330 ; [*072D.0020.0002] # TOTAL RUNOUT +2331 ; [*072E.0020.0002] # DIMENSION ORIGIN +2332 ; [*072F.0020.0002] # CONICAL TAPER +2333 ; [*0730.0020.0002] # SLOPE +2334 ; [*0731.0020.0002] # COUNTERBORE +2335 ; [*0732.0020.0002] # COUNTERSINK +2336 ; [*0733.0020.0002] # APL FUNCTIONAL SYMBOL I-BEAM +2337 ; [*0734.0020.0002] # APL FUNCTIONAL SYMBOL SQUISH QUAD +2338 ; [*0735.0020.0002] # APL FUNCTIONAL SYMBOL QUAD EQUAL +2339 ; [*0736.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIVIDE +233A ; [*0737.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DIAMOND +233B ; [*0738.0020.0002] # APL FUNCTIONAL SYMBOL QUAD JOT +233C ; [*0739.0020.0002] # APL FUNCTIONAL SYMBOL QUAD CIRCLE +233D ; [*073A.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STILE +233E ; [*073B.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE JOT +233F ; [*073C.0020.0002] # APL FUNCTIONAL SYMBOL SLASH BAR +2340 ; [*073D.0020.0002] # APL FUNCTIONAL SYMBOL BACKSLASH BAR +2341 ; [*073E.0020.0002] # APL FUNCTIONAL SYMBOL QUAD SLASH +2342 ; [*073F.0020.0002] # APL FUNCTIONAL SYMBOL QUAD BACKSLASH +2343 ; [*0740.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LESS-THAN +2344 ; [*0741.0020.0002] # APL FUNCTIONAL SYMBOL QUAD GREATER-THAN +2345 ; [*0742.0020.0002] # APL FUNCTIONAL SYMBOL LEFTWARDS VANE +2346 ; [*0743.0020.0002] # APL FUNCTIONAL SYMBOL RIGHTWARDS VANE +2347 ; [*0744.0020.0002] # APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW +2348 ; [*0745.0020.0002] # APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW +2349 ; [*0746.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH +234A ; [*0747.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR +234B ; [*0748.0020.0002] # APL FUNCTIONAL SYMBOL DELTA STILE +234C ; [*0749.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWN CARET +234D ; [*074A.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DELTA +234E ; [*074B.0020.0002] # APL FUNCTIONAL SYMBOL DOWN TACK JOT +234F ; [*074C.0020.0002] # APL FUNCTIONAL SYMBOL UPWARDS VANE +2350 ; [*074D.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +2351 ; [*074E.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK OVERBAR +2352 ; [*074F.0020.0002] # APL FUNCTIONAL SYMBOL DEL STILE +2353 ; [*0750.0020.0002] # APL FUNCTIONAL SYMBOL QUAD UP CARET +2354 ; [*0751.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DEL +2355 ; [*0752.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK JOT +2356 ; [*0753.0020.0002] # APL FUNCTIONAL SYMBOL DOWNWARDS VANE +2357 ; [*0754.0020.0002] # APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +2358 ; [*0755.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE UNDERBAR +2359 ; [*0756.0020.0002] # APL FUNCTIONAL SYMBOL DELTA UNDERBAR +235A ; [*0757.0020.0002] # APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR +235B ; [*0758.0020.0002] # APL FUNCTIONAL SYMBOL JOT UNDERBAR +235C ; [*0759.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR +235D ; [*075A.0020.0002] # APL FUNCTIONAL SYMBOL UP SHOE JOT +235E ; [*075B.0020.0002] # APL FUNCTIONAL SYMBOL QUOTE QUAD +235F ; [*075C.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE STAR +2360 ; [*075D.0020.0002] # APL FUNCTIONAL SYMBOL QUAD COLON +2361 ; [*075E.0020.0002] # APL FUNCTIONAL SYMBOL UP TACK DIAERESIS +2362 ; [*075F.0020.0002] # APL FUNCTIONAL SYMBOL DEL DIAERESIS +2363 ; [*0760.0020.0002] # APL FUNCTIONAL SYMBOL STAR DIAERESIS +2364 ; [*0761.0020.0002] # APL FUNCTIONAL SYMBOL JOT DIAERESIS +2365 ; [*0762.0020.0002] # APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS +2366 ; [*0763.0020.0002] # APL FUNCTIONAL SYMBOL DOWN SHOE STILE +2367 ; [*0764.0020.0002] # APL FUNCTIONAL SYMBOL LEFT SHOE STILE +2368 ; [*0765.0020.0002] # APL FUNCTIONAL SYMBOL TILDE DIAERESIS +2369 ; [*0766.0020.0002] # APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS +236A ; [*0767.0020.0002] # APL FUNCTIONAL SYMBOL COMMA BAR +236B ; [*0768.0020.0002] # APL FUNCTIONAL SYMBOL DEL TILDE +236C ; [*0769.0020.0002] # APL FUNCTIONAL SYMBOL ZILDE +236D ; [*076A.0020.0002] # APL FUNCTIONAL SYMBOL STILE TILDE +236E ; [*076B.0020.0002] # APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR +236F ; [*076C.0020.0002] # APL FUNCTIONAL SYMBOL QUAD NOT EQUAL +2370 ; [*076D.0020.0002] # APL FUNCTIONAL SYMBOL QUAD QUESTION +2371 ; [*076E.0020.0002] # APL FUNCTIONAL SYMBOL DOWN CARET TILDE +2372 ; [*076F.0020.0002] # APL FUNCTIONAL SYMBOL UP CARET TILDE +2373 ; [*0770.0020.0002] # APL FUNCTIONAL SYMBOL IOTA +2374 ; [*0771.0020.0002] # APL FUNCTIONAL SYMBOL RHO +2375 ; [*0772.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA +2376 ; [*0773.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA UNDERBAR +2377 ; [*0774.0020.0002] # APL FUNCTIONAL SYMBOL EPSILON UNDERBAR +2378 ; [*0775.0020.0002] # APL FUNCTIONAL SYMBOL IOTA UNDERBAR +2379 ; [*0776.0020.0002] # APL FUNCTIONAL SYMBOL OMEGA UNDERBAR +237A ; [*0777.0020.0002] # APL FUNCTIONAL SYMBOL ALPHA +237B ; [*0778.0020.0002] # NOT CHECK MARK +237C ; [*0779.0020.0002] # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D ; [*077A.0020.0002] # SHOULDERED OPEN BOX +237E ; [*077B.0020.0002] # BELL SYMBOL +237F ; [*077C.0020.0002] # VERTICAL LINE WITH MIDDLE DOT +2380 ; [*077D.0020.0002] # INSERTION SYMBOL +2381 ; [*077E.0020.0002] # CONTINUOUS UNDERLINE SYMBOL +2382 ; [*077F.0020.0002] # DISCONTINUOUS UNDERLINE SYMBOL +2383 ; [*0780.0020.0002] # EMPHASIS SYMBOL +2384 ; [*0781.0020.0002] # COMPOSITION SYMBOL +2385 ; [*0782.0020.0002] # WHITE SQUARE WITH CENTRE VERTICAL LINE +2386 ; [*0783.0020.0002] # ENTER SYMBOL +2387 ; [*0784.0020.0002] # ALTERNATIVE KEY SYMBOL +2388 ; [*0785.0020.0002] # HELM SYMBOL +2389 ; [*0786.0020.0002] # CIRCLED HORIZONTAL BAR WITH NOTCH +238A ; [*0787.0020.0002] # CIRCLED TRIANGLE DOWN +238B ; [*0788.0020.0002] # BROKEN CIRCLE WITH NORTHWEST ARROW +238C ; [*0789.0020.0002] # UNDO SYMBOL +238D ; [*078A.0020.0002] # MONOSTABLE SYMBOL +238E ; [*078B.0020.0002] # HYSTERESIS SYMBOL +238F ; [*078C.0020.0002] # OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL +2390 ; [*078D.0020.0002] # OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL +2391 ; [*078E.0020.0002] # PASSIVE-PULL-DOWN-OUTPUT SYMBOL +2392 ; [*078F.0020.0002] # PASSIVE-PULL-UP-OUTPUT SYMBOL +2393 ; [*0790.0020.0002] # DIRECT CURRENT SYMBOL FORM TWO +2394 ; [*0791.0020.0002] # SOFTWARE-FUNCTION SYMBOL +2395 ; [*0792.0020.0002] # APL FUNCTIONAL SYMBOL QUAD +2396 ; [*0793.0020.0002] # DECIMAL SEPARATOR KEY SYMBOL +2397 ; [*0794.0020.0002] # PREVIOUS PAGE +2398 ; [*0795.0020.0002] # NEXT PAGE +2399 ; [*0796.0020.0002] # PRINT SCREEN SYMBOL +239A ; [*0797.0020.0002] # CLEAR SCREEN SYMBOL +239B ; [*0798.0020.0002] # LEFT PARENTHESIS UPPER HOOK +239C ; [*0799.0020.0002] # LEFT PARENTHESIS EXTENSION +239D ; [*079A.0020.0002] # LEFT PARENTHESIS LOWER HOOK +239E ; [*079B.0020.0002] # RIGHT PARENTHESIS UPPER HOOK +239F ; [*079C.0020.0002] # RIGHT PARENTHESIS EXTENSION +23A0 ; [*079D.0020.0002] # RIGHT PARENTHESIS LOWER HOOK +23A1 ; [*079E.0020.0002] # LEFT SQUARE BRACKET UPPER CORNER +23A2 ; [*079F.0020.0002] # LEFT SQUARE BRACKET EXTENSION +23A3 ; [*07A0.0020.0002] # LEFT SQUARE BRACKET LOWER CORNER +23A4 ; [*07A1.0020.0002] # RIGHT SQUARE BRACKET UPPER CORNER +23A5 ; [*07A2.0020.0002] # RIGHT SQUARE BRACKET EXTENSION +23A6 ; [*07A3.0020.0002] # RIGHT SQUARE BRACKET LOWER CORNER +23A7 ; [*07A4.0020.0002] # LEFT CURLY BRACKET UPPER HOOK +23A8 ; [*07A5.0020.0002] # LEFT CURLY BRACKET MIDDLE PIECE +23A9 ; [*07A6.0020.0002] # LEFT CURLY BRACKET LOWER HOOK +23AA ; [*07A7.0020.0002] # CURLY BRACKET EXTENSION +23AB ; [*07A8.0020.0002] # RIGHT CURLY BRACKET UPPER HOOK +23AC ; [*07A9.0020.0002] # RIGHT CURLY BRACKET MIDDLE PIECE +23AD ; [*07AA.0020.0002] # RIGHT CURLY BRACKET LOWER HOOK +23AE ; [*07AB.0020.0002] # INTEGRAL EXTENSION +23AF ; [*07AC.0020.0002] # HORIZONTAL LINE EXTENSION +23B0 ; [*07AD.0020.0002] # UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +23B1 ; [*07AE.0020.0002] # UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +23B2 ; [*07AF.0020.0002] # SUMMATION TOP +23B3 ; [*07B0.0020.0002] # SUMMATION BOTTOM +23B4 ; [*07B1.0020.0002] # TOP SQUARE BRACKET +23B5 ; [*07B2.0020.0002] # BOTTOM SQUARE BRACKET +23B6 ; [*07B3.0020.0002] # BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7 ; [*07B4.0020.0002] # RADICAL SYMBOL BOTTOM +23B8 ; [*07B5.0020.0002] # LEFT VERTICAL BOX LINE +23B9 ; [*07B6.0020.0002] # RIGHT VERTICAL BOX LINE +23BA ; [*07B7.0020.0002] # HORIZONTAL SCAN LINE-1 +23BB ; [*07B8.0020.0002] # HORIZONTAL SCAN LINE-3 +23BC ; [*07B9.0020.0002] # HORIZONTAL SCAN LINE-7 +23BD ; [*07BA.0020.0002] # HORIZONTAL SCAN LINE-9 +23BE ; [*07BB.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT +23BF ; [*07BC.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT +23C0 ; [*07BD.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE +23C1 ; [*07BE.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE +23C2 ; [*07BF.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE +23C3 ; [*07C0.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE +23C4 ; [*07C1.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE +23C5 ; [*07C2.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE +23C6 ; [*07C3.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE +23C7 ; [*07C4.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE +23C8 ; [*07C5.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE +23C9 ; [*07C6.0020.0002] # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL +23CA ; [*07C7.0020.0002] # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL +23CB ; [*07C8.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT +23CC ; [*07C9.0020.0002] # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT +23CD ; [*07CA.0020.0002] # SQUARE FOOT +23CE ; [*07CB.0020.0002] # RETURN SYMBOL +23CF ; [*07CC.0020.0002] # EJECT SYMBOL +23D0 ; [*07CD.0020.0002] # VERTICAL LINE EXTENSION +23D1 ; [*07CE.0020.0002] # METRICAL BREVE +23D2 ; [*07CF.0020.0002] # METRICAL LONG OVER SHORT +23D3 ; [*07D0.0020.0002] # METRICAL SHORT OVER LONG +23D4 ; [*07D1.0020.0002] # METRICAL LONG OVER TWO SHORTS +23D5 ; [*07D2.0020.0002] # METRICAL TWO SHORTS OVER LONG +23D6 ; [*07D3.0020.0002] # METRICAL TWO SHORTS JOINED +23D7 ; [*07D4.0020.0002] # METRICAL TRISEME +23D8 ; [*07D5.0020.0002] # METRICAL TETRASEME +23D9 ; [*07D6.0020.0002] # METRICAL PENTASEME +23DA ; [*07D7.0020.0002] # EARTH GROUND +23DB ; [*07D8.0020.0002] # FUSE +23DC ; [*07D9.0020.0002] # TOP PARENTHESIS +23DD ; [*07DA.0020.0002] # BOTTOM PARENTHESIS +23DE ; [*07DB.0020.0002] # TOP CURLY BRACKET +23DF ; [*07DC.0020.0002] # BOTTOM CURLY BRACKET +23E0 ; [*07DD.0020.0002] # TOP TORTOISE SHELL BRACKET +23E1 ; [*07DE.0020.0002] # BOTTOM TORTOISE SHELL BRACKET +23E2 ; [*07DF.0020.0002] # WHITE TRAPEZIUM +23E3 ; [*07E0.0020.0002] # BENZENE RING WITH CIRCLE +23E4 ; [*07E1.0020.0002] # STRAIGHTNESS +23E5 ; [*07E2.0020.0002] # FLATNESS +23E6 ; [*07E3.0020.0002] # AC CURRENT +23E7 ; [*07E4.0020.0002] # ELECTRICAL INTERSECTION +23E8 ; [*07E5.0020.0002] # DECIMAL EXPONENT SYMBOL +23E9 ; [*07E6.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE +23EA ; [*07E7.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE +23EB ; [*07E8.0020.0002] # BLACK UP-POINTING DOUBLE TRIANGLE +23EC ; [*07E9.0020.0002] # BLACK DOWN-POINTING DOUBLE TRIANGLE +23ED ; [*07EA.0020.0002] # BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR +23EE ; [*07EB.0020.0002] # BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR +23EF ; [*07EC.0020.0002] # BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +23F0 ; [*07ED.0020.0002] # ALARM CLOCK +23F1 ; [*07EE.0020.0002] # STOPWATCH +23F2 ; [*07EF.0020.0002] # TIMER CLOCK +23F3 ; [*07F0.0020.0002] # HOURGLASS WITH FLOWING SAND +23F4 ; [*07F1.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE +23F5 ; [*07F2.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE +23F6 ; [*07F3.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE +23F7 ; [*07F4.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE +23F8 ; [*07F5.0020.0002] # DOUBLE VERTICAL BAR +23F9 ; [*07F6.0020.0002] # BLACK SQUARE FOR STOP +23FA ; [*07F7.0020.0002] # BLACK CIRCLE FOR RECORD +23FB ; [*07F8.0020.0002] # POWER SYMBOL +23FC ; [*07F9.0020.0002] # POWER ON-OFF SYMBOL +23FD ; [*07FA.0020.0002] # POWER ON SYMBOL +23FE ; [*07FB.0020.0002] # POWER SLEEP SYMBOL +23FF ; [*07FC.0020.0002] # OBSERVER EYE SYMBOL +2400 ; [*07FD.0020.0002] # SYMBOL FOR NULL +2401 ; [*07FE.0020.0002] # SYMBOL FOR START OF HEADING +2402 ; [*07FF.0020.0002] # SYMBOL FOR START OF TEXT +2403 ; [*0800.0020.0002] # SYMBOL FOR END OF TEXT +2404 ; [*0801.0020.0002] # SYMBOL FOR END OF TRANSMISSION +2405 ; [*0802.0020.0002] # SYMBOL FOR ENQUIRY +2406 ; [*0803.0020.0002] # SYMBOL FOR ACKNOWLEDGE +2407 ; [*0804.0020.0002] # SYMBOL FOR BELL +2408 ; [*0805.0020.0002] # SYMBOL FOR BACKSPACE +2409 ; [*0806.0020.0002] # SYMBOL FOR HORIZONTAL TABULATION +240A ; [*0807.0020.0002] # SYMBOL FOR LINE FEED +240B ; [*0808.0020.0002] # SYMBOL FOR VERTICAL TABULATION +240C ; [*0809.0020.0002] # SYMBOL FOR FORM FEED +240D ; [*080A.0020.0002] # SYMBOL FOR CARRIAGE RETURN +240E ; [*080B.0020.0002] # SYMBOL FOR SHIFT OUT +240F ; [*080C.0020.0002] # SYMBOL FOR SHIFT IN +2410 ; [*080D.0020.0002] # SYMBOL FOR DATA LINK ESCAPE +2411 ; [*080E.0020.0002] # SYMBOL FOR DEVICE CONTROL ONE +2412 ; [*080F.0020.0002] # SYMBOL FOR DEVICE CONTROL TWO +2413 ; [*0810.0020.0002] # SYMBOL FOR DEVICE CONTROL THREE +2414 ; [*0811.0020.0002] # SYMBOL FOR DEVICE CONTROL FOUR +2415 ; [*0812.0020.0002] # SYMBOL FOR NEGATIVE ACKNOWLEDGE +2416 ; [*0813.0020.0002] # SYMBOL FOR SYNCHRONOUS IDLE +2417 ; [*0814.0020.0002] # SYMBOL FOR END OF TRANSMISSION BLOCK +2418 ; [*0815.0020.0002] # SYMBOL FOR CANCEL +2419 ; [*0816.0020.0002] # SYMBOL FOR END OF MEDIUM +241A ; [*0817.0020.0002] # SYMBOL FOR SUBSTITUTE +241B ; [*0818.0020.0002] # SYMBOL FOR ESCAPE +241C ; [*0819.0020.0002] # SYMBOL FOR FILE SEPARATOR +241D ; [*081A.0020.0002] # SYMBOL FOR GROUP SEPARATOR +241E ; [*081B.0020.0002] # SYMBOL FOR RECORD SEPARATOR +241F ; [*081C.0020.0002] # SYMBOL FOR UNIT SEPARATOR +2420 ; [*081D.0020.0002] # SYMBOL FOR SPACE +2421 ; [*081E.0020.0002] # SYMBOL FOR DELETE +2422 ; [*081F.0020.0002] # BLANK SYMBOL +2423 ; [*0820.0020.0002] # OPEN BOX +2424 ; [*0821.0020.0002] # SYMBOL FOR NEWLINE +2425 ; [*0822.0020.0002] # SYMBOL FOR DELETE FORM TWO +2426 ; [*0823.0020.0002] # SYMBOL FOR SUBSTITUTE FORM TWO +2440 ; [*0824.0020.0002] # OCR HOOK +2441 ; [*0825.0020.0002] # OCR CHAIR +2442 ; [*0826.0020.0002] # OCR FORK +2443 ; [*0827.0020.0002] # OCR INVERTED FORK +2444 ; [*0828.0020.0002] # OCR BELT BUCKLE +2445 ; [*0829.0020.0002] # OCR BOW TIE +2446 ; [*082A.0020.0002] # OCR BRANCH BANK IDENTIFICATION +2447 ; [*082B.0020.0002] # OCR AMOUNT OF CHECK +2448 ; [*082C.0020.0002] # OCR DASH +2449 ; [*082D.0020.0002] # OCR CUSTOMER ACCOUNT NUMBER +244A ; [*082E.0020.0002] # OCR DOUBLE BACKSLASH +2500 ; [*082F.0020.0002] # BOX DRAWINGS LIGHT HORIZONTAL +2501 ; [*0830.0020.0002] # BOX DRAWINGS HEAVY HORIZONTAL +2502 ; [*0831.0020.0002] # BOX DRAWINGS LIGHT VERTICAL +2503 ; [*0832.0020.0002] # BOX DRAWINGS HEAVY VERTICAL +2504 ; [*0833.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +2505 ; [*0834.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +2506 ; [*0835.0020.0002] # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +2507 ; [*0836.0020.0002] # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +2508 ; [*0837.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +2509 ; [*0838.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +250A ; [*0839.0020.0002] # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +250B ; [*083A.0020.0002] # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +250C ; [*083B.0020.0002] # BOX DRAWINGS LIGHT DOWN AND RIGHT +250D ; [*083C.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +250E ; [*083D.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +250F ; [*083E.0020.0002] # BOX DRAWINGS HEAVY DOWN AND RIGHT +2510 ; [*083F.0020.0002] # BOX DRAWINGS LIGHT DOWN AND LEFT +2511 ; [*0840.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +2512 ; [*0841.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +2513 ; [*0842.0020.0002] # BOX DRAWINGS HEAVY DOWN AND LEFT +2514 ; [*0843.0020.0002] # BOX DRAWINGS LIGHT UP AND RIGHT +2515 ; [*0844.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +2516 ; [*0845.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +2517 ; [*0846.0020.0002] # BOX DRAWINGS HEAVY UP AND RIGHT +2518 ; [*0847.0020.0002] # BOX DRAWINGS LIGHT UP AND LEFT +2519 ; [*0848.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT HEAVY +251A ; [*0849.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT LIGHT +251B ; [*084A.0020.0002] # BOX DRAWINGS HEAVY UP AND LEFT +251C ; [*084B.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +251D ; [*084C.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +251E ; [*084D.0020.0002] # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +251F ; [*084E.0020.0002] # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +2520 ; [*084F.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +2521 ; [*0850.0020.0002] # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +2522 ; [*0851.0020.0002] # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +2523 ; [*0852.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND RIGHT +2524 ; [*0853.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND LEFT +2525 ; [*0854.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +2526 ; [*0855.0020.0002] # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +2527 ; [*0856.0020.0002] # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +2528 ; [*0857.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +2529 ; [*0858.0020.0002] # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +252A ; [*0859.0020.0002] # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +252B ; [*085A.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND LEFT +252C ; [*085B.0020.0002] # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +252D ; [*085C.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +252E ; [*085D.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +252F ; [*085E.0020.0002] # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +2530 ; [*085F.0020.0002] # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +2531 ; [*0860.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +2532 ; [*0861.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +2533 ; [*0862.0020.0002] # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +2534 ; [*0863.0020.0002] # BOX DRAWINGS LIGHT UP AND HORIZONTAL +2535 ; [*0864.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +2536 ; [*0865.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +2537 ; [*0866.0020.0002] # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +2538 ; [*0867.0020.0002] # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +2539 ; [*0868.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +253A ; [*0869.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +253B ; [*086A.0020.0002] # BOX DRAWINGS HEAVY UP AND HORIZONTAL +253C ; [*086B.0020.0002] # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +253D ; [*086C.0020.0002] # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +253E ; [*086D.0020.0002] # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +253F ; [*086E.0020.0002] # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +2540 ; [*086F.0020.0002] # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +2541 ; [*0870.0020.0002] # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +2542 ; [*0871.0020.0002] # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +2543 ; [*0872.0020.0002] # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +2544 ; [*0873.0020.0002] # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +2545 ; [*0874.0020.0002] # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +2546 ; [*0875.0020.0002] # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +2547 ; [*0876.0020.0002] # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +2548 ; [*0877.0020.0002] # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +2549 ; [*0878.0020.0002] # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +254A ; [*0879.0020.0002] # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +254B ; [*087A.0020.0002] # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C ; [*087B.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +254D ; [*087C.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +254E ; [*087D.0020.0002] # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +254F ; [*087E.0020.0002] # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550 ; [*087F.0020.0002] # BOX DRAWINGS DOUBLE HORIZONTAL +2551 ; [*0880.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL +2552 ; [*0881.0020.0002] # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +2553 ; [*0882.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +2554 ; [*0883.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND RIGHT +2555 ; [*0884.0020.0002] # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +2556 ; [*0885.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +2557 ; [*0886.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND LEFT +2558 ; [*0887.0020.0002] # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +2559 ; [*0888.0020.0002] # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +255A ; [*0889.0020.0002] # BOX DRAWINGS DOUBLE UP AND RIGHT +255B ; [*088A.0020.0002] # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +255C ; [*088B.0020.0002] # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +255D ; [*088C.0020.0002] # BOX DRAWINGS DOUBLE UP AND LEFT +255E ; [*088D.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +255F ; [*088E.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +2560 ; [*088F.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +2561 ; [*0890.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +2562 ; [*0891.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +2563 ; [*0892.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND LEFT +2564 ; [*0893.0020.0002] # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +2565 ; [*0894.0020.0002] # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +2566 ; [*0895.0020.0002] # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +2567 ; [*0896.0020.0002] # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +2568 ; [*0897.0020.0002] # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +2569 ; [*0898.0020.0002] # BOX DRAWINGS DOUBLE UP AND HORIZONTAL +256A ; [*0899.0020.0002] # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +256B ; [*089A.0020.0002] # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256C ; [*089B.0020.0002] # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +256D ; [*089C.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +256E ; [*089D.0020.0002] # BOX DRAWINGS LIGHT ARC DOWN AND LEFT +256F ; [*089E.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND LEFT +2570 ; [*089F.0020.0002] # BOX DRAWINGS LIGHT ARC UP AND RIGHT +2571 ; [*08A0.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +2572 ; [*08A1.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +2573 ; [*08A2.0020.0002] # BOX DRAWINGS LIGHT DIAGONAL CROSS +2574 ; [*08A3.0020.0002] # BOX DRAWINGS LIGHT LEFT +2575 ; [*08A4.0020.0002] # BOX DRAWINGS LIGHT UP +2576 ; [*08A5.0020.0002] # BOX DRAWINGS LIGHT RIGHT +2577 ; [*08A6.0020.0002] # BOX DRAWINGS LIGHT DOWN +2578 ; [*08A7.0020.0002] # BOX DRAWINGS HEAVY LEFT +2579 ; [*08A8.0020.0002] # BOX DRAWINGS HEAVY UP +257A ; [*08A9.0020.0002] # BOX DRAWINGS HEAVY RIGHT +257B ; [*08AA.0020.0002] # BOX DRAWINGS HEAVY DOWN +257C ; [*08AB.0020.0002] # BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +257D ; [*08AC.0020.0002] # BOX DRAWINGS LIGHT UP AND HEAVY DOWN +257E ; [*08AD.0020.0002] # BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +257F ; [*08AE.0020.0002] # BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580 ; [*08AF.0020.0002] # UPPER HALF BLOCK +2581 ; [*08B0.0020.0002] # LOWER ONE EIGHTH BLOCK +2582 ; [*08B1.0020.0002] # LOWER ONE QUARTER BLOCK +2583 ; [*08B2.0020.0002] # LOWER THREE EIGHTHS BLOCK +2584 ; [*08B3.0020.0002] # LOWER HALF BLOCK +2585 ; [*08B4.0020.0002] # LOWER FIVE EIGHTHS BLOCK +2586 ; [*08B5.0020.0002] # LOWER THREE QUARTERS BLOCK +2587 ; [*08B6.0020.0002] # LOWER SEVEN EIGHTHS BLOCK +2588 ; [*08B7.0020.0002] # FULL BLOCK +2589 ; [*08B8.0020.0002] # LEFT SEVEN EIGHTHS BLOCK +258A ; [*08B9.0020.0002] # LEFT THREE QUARTERS BLOCK +258B ; [*08BA.0020.0002] # LEFT FIVE EIGHTHS BLOCK +258C ; [*08BB.0020.0002] # LEFT HALF BLOCK +258D ; [*08BC.0020.0002] # LEFT THREE EIGHTHS BLOCK +258E ; [*08BD.0020.0002] # LEFT ONE QUARTER BLOCK +258F ; [*08BE.0020.0002] # LEFT ONE EIGHTH BLOCK +2590 ; [*08BF.0020.0002] # RIGHT HALF BLOCK +2591 ; [*08C0.0020.0002] # LIGHT SHADE +2592 ; [*08C1.0020.0002] # MEDIUM SHADE +2593 ; [*08C2.0020.0002] # DARK SHADE +2594 ; [*08C3.0020.0002] # UPPER ONE EIGHTH BLOCK +2595 ; [*08C4.0020.0002] # RIGHT ONE EIGHTH BLOCK +2596 ; [*08C5.0020.0002] # QUADRANT LOWER LEFT +2597 ; [*08C6.0020.0002] # QUADRANT LOWER RIGHT +2598 ; [*08C7.0020.0002] # QUADRANT UPPER LEFT +2599 ; [*08C8.0020.0002] # QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +259A ; [*08C9.0020.0002] # QUADRANT UPPER LEFT AND LOWER RIGHT +259B ; [*08CA.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +259C ; [*08CB.0020.0002] # QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +259D ; [*08CC.0020.0002] # QUADRANT UPPER RIGHT +259E ; [*08CD.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT +259F ; [*08CE.0020.0002] # QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0 ; [*08CF.0020.0002] # BLACK SQUARE +25A1 ; [*08D0.0020.0002] # WHITE SQUARE +25A2 ; [*08D1.0020.0002] # WHITE SQUARE WITH ROUNDED CORNERS +25A3 ; [*08D2.0020.0002] # WHITE SQUARE CONTAINING BLACK SMALL SQUARE +25A4 ; [*08D3.0020.0002] # SQUARE WITH HORIZONTAL FILL +25A5 ; [*08D4.0020.0002] # SQUARE WITH VERTICAL FILL +25A6 ; [*08D5.0020.0002] # SQUARE WITH ORTHOGONAL CROSSHATCH FILL +25A7 ; [*08D6.0020.0002] # SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +25A8 ; [*08D7.0020.0002] # SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +25A9 ; [*08D8.0020.0002] # SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA ; [*08D9.0020.0002] # BLACK SMALL SQUARE +25AB ; [*08DA.0020.0002] # WHITE SMALL SQUARE +25AC ; [*08DB.0020.0002] # BLACK RECTANGLE +25AD ; [*08DC.0020.0002] # WHITE RECTANGLE +25AE ; [*08DD.0020.0002] # BLACK VERTICAL RECTANGLE +25AF ; [*08DE.0020.0002] # WHITE VERTICAL RECTANGLE +25B0 ; [*08DF.0020.0002] # BLACK PARALLELOGRAM +25B1 ; [*08E0.0020.0002] # WHITE PARALLELOGRAM +25B2 ; [*08E1.0020.0002] # BLACK UP-POINTING TRIANGLE +25B3 ; [*08E2.0020.0002] # WHITE UP-POINTING TRIANGLE +25B4 ; [*08E3.0020.0002] # BLACK UP-POINTING SMALL TRIANGLE +25B5 ; [*08E4.0020.0002] # WHITE UP-POINTING SMALL TRIANGLE +25B6 ; [*08E5.0020.0002] # BLACK RIGHT-POINTING TRIANGLE +25B7 ; [*08E6.0020.0002] # WHITE RIGHT-POINTING TRIANGLE +25B8 ; [*08E7.0020.0002] # BLACK RIGHT-POINTING SMALL TRIANGLE +25B9 ; [*08E8.0020.0002] # WHITE RIGHT-POINTING SMALL TRIANGLE +25BA ; [*08E9.0020.0002] # BLACK RIGHT-POINTING POINTER +25BB ; [*08EA.0020.0002] # WHITE RIGHT-POINTING POINTER +25BC ; [*08EB.0020.0002] # BLACK DOWN-POINTING TRIANGLE +25BD ; [*08EC.0020.0002] # WHITE DOWN-POINTING TRIANGLE +25BE ; [*08ED.0020.0002] # BLACK DOWN-POINTING SMALL TRIANGLE +25BF ; [*08EE.0020.0002] # WHITE DOWN-POINTING SMALL TRIANGLE +25C0 ; [*08EF.0020.0002] # BLACK LEFT-POINTING TRIANGLE +25C1 ; [*08F0.0020.0002] # WHITE LEFT-POINTING TRIANGLE +25C2 ; [*08F1.0020.0002] # BLACK LEFT-POINTING SMALL TRIANGLE +25C3 ; [*08F2.0020.0002] # WHITE LEFT-POINTING SMALL TRIANGLE +25C4 ; [*08F3.0020.0002] # BLACK LEFT-POINTING POINTER +25C5 ; [*08F4.0020.0002] # WHITE LEFT-POINTING POINTER +25C6 ; [*08F5.0020.0002] # BLACK DIAMOND +25C7 ; [*08F6.0020.0002] # WHITE DIAMOND +25C8 ; [*08F7.0020.0002] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9 ; [*08F8.0020.0002] # FISHEYE +25CA ; [*08F9.0020.0002] # LOZENGE +25CB ; [*08FA.0020.0002] # WHITE CIRCLE +25CC ; [*08FB.0020.0002] # DOTTED CIRCLE +25CD ; [*08FC.0020.0002] # CIRCLE WITH VERTICAL FILL +25CE ; [*08FD.0020.0002] # BULLSEYE +25CF ; [*08FE.0020.0002] # BLACK CIRCLE +25D0 ; [*08FF.0020.0002] # CIRCLE WITH LEFT HALF BLACK +25D1 ; [*0900.0020.0002] # CIRCLE WITH RIGHT HALF BLACK +25D2 ; [*0901.0020.0002] # CIRCLE WITH LOWER HALF BLACK +25D3 ; [*0902.0020.0002] # CIRCLE WITH UPPER HALF BLACK +25D4 ; [*0903.0020.0002] # CIRCLE WITH UPPER RIGHT QUADRANT BLACK +25D5 ; [*0904.0020.0002] # CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +25D6 ; [*0905.0020.0002] # LEFT HALF BLACK CIRCLE +25D7 ; [*0906.0020.0002] # RIGHT HALF BLACK CIRCLE +25D8 ; [*0907.0020.0002] # INVERSE BULLET +25D9 ; [*0908.0020.0002] # INVERSE WHITE CIRCLE +25DA ; [*0909.0020.0002] # UPPER HALF INVERSE WHITE CIRCLE +25DB ; [*090A.0020.0002] # LOWER HALF INVERSE WHITE CIRCLE +25DC ; [*090B.0020.0002] # UPPER LEFT QUADRANT CIRCULAR ARC +25DD ; [*090C.0020.0002] # UPPER RIGHT QUADRANT CIRCULAR ARC +25DE ; [*090D.0020.0002] # LOWER RIGHT QUADRANT CIRCULAR ARC +25DF ; [*090E.0020.0002] # LOWER LEFT QUADRANT CIRCULAR ARC +25E0 ; [*090F.0020.0002] # UPPER HALF CIRCLE +25E1 ; [*0910.0020.0002] # LOWER HALF CIRCLE +25E2 ; [*0911.0020.0002] # BLACK LOWER RIGHT TRIANGLE +25E3 ; [*0912.0020.0002] # BLACK LOWER LEFT TRIANGLE +25E4 ; [*0913.0020.0002] # BLACK UPPER LEFT TRIANGLE +25E5 ; [*0914.0020.0002] # BLACK UPPER RIGHT TRIANGLE +25E6 ; [*0915.0020.0002] # WHITE BULLET +25E7 ; [*0916.0020.0002] # SQUARE WITH LEFT HALF BLACK +25E8 ; [*0917.0020.0002] # SQUARE WITH RIGHT HALF BLACK +25E9 ; [*0918.0020.0002] # SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +25EA ; [*0919.0020.0002] # SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +25EB ; [*091A.0020.0002] # WHITE SQUARE WITH VERTICAL BISECTING LINE +25EC ; [*091B.0020.0002] # WHITE UP-POINTING TRIANGLE WITH DOT +25ED ; [*091C.0020.0002] # UP-POINTING TRIANGLE WITH LEFT HALF BLACK +25EE ; [*091D.0020.0002] # UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF ; [*091E.0020.0002] # LARGE CIRCLE +25F0 ; [*091F.0020.0002] # WHITE SQUARE WITH UPPER LEFT QUADRANT +25F1 ; [*0920.0020.0002] # WHITE SQUARE WITH LOWER LEFT QUADRANT +25F2 ; [*0921.0020.0002] # WHITE SQUARE WITH LOWER RIGHT QUADRANT +25F3 ; [*0922.0020.0002] # WHITE SQUARE WITH UPPER RIGHT QUADRANT +25F4 ; [*0923.0020.0002] # WHITE CIRCLE WITH UPPER LEFT QUADRANT +25F5 ; [*0924.0020.0002] # WHITE CIRCLE WITH LOWER LEFT QUADRANT +25F6 ; [*0925.0020.0002] # WHITE CIRCLE WITH LOWER RIGHT QUADRANT +25F7 ; [*0926.0020.0002] # WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8 ; [*0927.0020.0002] # UPPER LEFT TRIANGLE +25F9 ; [*0928.0020.0002] # UPPER RIGHT TRIANGLE +25FA ; [*0929.0020.0002] # LOWER LEFT TRIANGLE +25FB ; [*092A.0020.0002] # WHITE MEDIUM SQUARE +25FC ; [*092B.0020.0002] # BLACK MEDIUM SQUARE +25FD ; [*092C.0020.0002] # WHITE MEDIUM SMALL SQUARE +25FE ; [*092D.0020.0002] # BLACK MEDIUM SMALL SQUARE +25FF ; [*092E.0020.0002] # LOWER RIGHT TRIANGLE +2600 ; [*092F.0020.0002] # BLACK SUN WITH RAYS +2601 ; [*0930.0020.0002] # CLOUD +2602 ; [*0931.0020.0002] # UMBRELLA +2603 ; [*0932.0020.0002] # SNOWMAN +2604 ; [*0933.0020.0002] # COMET +2605 ; [*0934.0020.0002] # BLACK STAR +2606 ; [*0935.0020.0002] # WHITE STAR +2607 ; [*0936.0020.0002] # LIGHTNING +2608 ; [*0937.0020.0002] # THUNDERSTORM +2609 ; [*0938.0020.0002] # SUN +260A ; [*0939.0020.0002] # ASCENDING NODE +260B ; [*093A.0020.0002] # DESCENDING NODE +260C ; [*093B.0020.0002] # CONJUNCTION +260D ; [*093C.0020.0002] # OPPOSITION +260E ; [*093D.0020.0002] # BLACK TELEPHONE +260F ; [*093E.0020.0002] # WHITE TELEPHONE +2610 ; [*093F.0020.0002] # BALLOT BOX +2611 ; [*0940.0020.0002] # BALLOT BOX WITH CHECK +2612 ; [*0941.0020.0002] # BALLOT BOX WITH X +2613 ; [*0942.0020.0002] # SALTIRE +2614 ; [*0943.0020.0002] # UMBRELLA WITH RAIN DROPS +2615 ; [*0944.0020.0002] # HOT BEVERAGE +2616 ; [*0945.0020.0002] # WHITE SHOGI PIECE +2617 ; [*0946.0020.0002] # BLACK SHOGI PIECE +2618 ; [*0947.0020.0002] # SHAMROCK +2619 ; [*0948.0020.0002] # REVERSED ROTATED FLORAL HEART BULLET +261A ; [*0949.0020.0002] # BLACK LEFT POINTING INDEX +261B ; [*094A.0020.0002] # BLACK RIGHT POINTING INDEX +261C ; [*094B.0020.0002] # WHITE LEFT POINTING INDEX +261D ; [*094C.0020.0002] # WHITE UP POINTING INDEX +261E ; [*094D.0020.0002] # WHITE RIGHT POINTING INDEX +261F ; [*094E.0020.0002] # WHITE DOWN POINTING INDEX +2620 ; [*094F.0020.0002] # SKULL AND CROSSBONES +2621 ; [*0950.0020.0002] # CAUTION SIGN +2622 ; [*0951.0020.0002] # RADIOACTIVE SIGN +2623 ; [*0952.0020.0002] # BIOHAZARD SIGN +2624 ; [*0953.0020.0002] # CADUCEUS +2625 ; [*0954.0020.0002] # ANKH +2626 ; [*0955.0020.0002] # ORTHODOX CROSS +2627 ; [*0956.0020.0002] # CHI RHO +2628 ; [*0957.0020.0002] # CROSS OF LORRAINE +2629 ; [*0958.0020.0002] # CROSS OF JERUSALEM +262A ; [*0959.0020.0002] # STAR AND CRESCENT +262B ; [*095A.0020.0002] # FARSI SYMBOL +262C ; [*095B.0020.0002] # ADI SHAKTI +262D ; [*095C.0020.0002] # HAMMER AND SICKLE +262E ; [*095D.0020.0002] # PEACE SYMBOL +262F ; [*095E.0020.0002] # YIN YANG +2630 ; [*0EBA.0020.0002] # TRIGRAM FOR HEAVEN +2631 ; [*0EBB.0020.0002] # TRIGRAM FOR LAKE +2632 ; [*0EBC.0020.0002] # TRIGRAM FOR FIRE +2633 ; [*0EBD.0020.0002] # TRIGRAM FOR THUNDER +2634 ; [*0EBE.0020.0002] # TRIGRAM FOR WIND +2635 ; [*0EBF.0020.0002] # TRIGRAM FOR WATER +2636 ; [*0EC0.0020.0002] # TRIGRAM FOR MOUNTAIN +2637 ; [*0EC1.0020.0002] # TRIGRAM FOR EARTH +2638 ; [*095F.0020.0002] # WHEEL OF DHARMA +2639 ; [*0960.0020.0002] # WHITE FROWNING FACE +263A ; [*0961.0020.0002] # WHITE SMILING FACE +263B ; [*0962.0020.0002] # BLACK SMILING FACE +263C ; [*0963.0020.0002] # WHITE SUN WITH RAYS +263D ; [*0964.0020.0002] # FIRST QUARTER MOON +263E ; [*0965.0020.0002] # LAST QUARTER MOON +263F ; [*0966.0020.0002] # MERCURY +2640 ; [*0967.0020.0002] # FEMALE SIGN +2641 ; [*0968.0020.0002] # EARTH +2642 ; [*0969.0020.0002] # MALE SIGN +2643 ; [*096A.0020.0002] # JUPITER +2644 ; [*096B.0020.0002] # SATURN +2645 ; [*096C.0020.0002] # URANUS +2646 ; [*096D.0020.0002] # NEPTUNE +2647 ; [*096E.0020.0002] # PLUTO +2648 ; [*096F.0020.0002] # ARIES +2649 ; [*0970.0020.0002] # TAURUS +264A ; [*0971.0020.0002] # GEMINI +264B ; [*0972.0020.0002] # CANCER +264C ; [*0973.0020.0002] # LEO +264D ; [*0974.0020.0002] # VIRGO +264E ; [*0975.0020.0002] # LIBRA +264F ; [*0976.0020.0002] # SCORPIUS +2650 ; [*0977.0020.0002] # SAGITTARIUS +2651 ; [*0978.0020.0002] # CAPRICORN +2652 ; [*0979.0020.0002] # AQUARIUS +2653 ; [*097A.0020.0002] # PISCES +2654 ; [*097B.0020.0002] # WHITE CHESS KING +2655 ; [*097C.0020.0002] # WHITE CHESS QUEEN +2656 ; [*097D.0020.0002] # WHITE CHESS ROOK +2657 ; [*097E.0020.0002] # WHITE CHESS BISHOP +2658 ; [*097F.0020.0002] # WHITE CHESS KNIGHT +2659 ; [*0980.0020.0002] # WHITE CHESS PAWN +265A ; [*0981.0020.0002] # BLACK CHESS KING +265B ; [*0982.0020.0002] # BLACK CHESS QUEEN +265C ; [*0983.0020.0002] # BLACK CHESS ROOK +265D ; [*0984.0020.0002] # BLACK CHESS BISHOP +265E ; [*0985.0020.0002] # BLACK CHESS KNIGHT +265F ; [*0986.0020.0002] # BLACK CHESS PAWN +2660 ; [*0987.0020.0002] # BLACK SPADE SUIT +2661 ; [*0988.0020.0002] # WHITE HEART SUIT +2662 ; [*0989.0020.0002] # WHITE DIAMOND SUIT +2663 ; [*098A.0020.0002] # BLACK CLUB SUIT +2664 ; [*098B.0020.0002] # WHITE SPADE SUIT +2665 ; [*098C.0020.0002] # BLACK HEART SUIT +2666 ; [*098D.0020.0002] # BLACK DIAMOND SUIT +2667 ; [*098E.0020.0002] # WHITE CLUB SUIT +2668 ; [*098F.0020.0002] # HOT SPRINGS +2669 ; [*0990.0020.0002] # QUARTER NOTE +266A ; [*0991.0020.0002] # EIGHTH NOTE +266B ; [*0992.0020.0002] # BEAMED EIGHTH NOTES +266C ; [*0993.0020.0002] # BEAMED SIXTEENTH NOTES +266D ; [*110B.0020.0002] # MUSIC FLAT SIGN +266E ; [*110C.0020.0002] # MUSIC NATURAL SIGN +266F ; [*110D.0020.0002] # MUSIC SHARP SIGN +2670 ; [*0994.0020.0002] # WEST SYRIAC CROSS +2671 ; [*0995.0020.0002] # EAST SYRIAC CROSS +2672 ; [*0996.0020.0002] # UNIVERSAL RECYCLING SYMBOL +2673 ; [*0997.0020.0002] # RECYCLING SYMBOL FOR TYPE-1 PLASTICS +2674 ; [*0998.0020.0002] # RECYCLING SYMBOL FOR TYPE-2 PLASTICS +2675 ; [*0999.0020.0002] # RECYCLING SYMBOL FOR TYPE-3 PLASTICS +2676 ; [*099A.0020.0002] # RECYCLING SYMBOL FOR TYPE-4 PLASTICS +2677 ; [*099B.0020.0002] # RECYCLING SYMBOL FOR TYPE-5 PLASTICS +2678 ; [*099C.0020.0002] # RECYCLING SYMBOL FOR TYPE-6 PLASTICS +2679 ; [*099D.0020.0002] # RECYCLING SYMBOL FOR TYPE-7 PLASTICS +267A ; [*099E.0020.0002] # RECYCLING SYMBOL FOR GENERIC MATERIALS +267B ; [*099F.0020.0002] # BLACK UNIVERSAL RECYCLING SYMBOL +267C ; [*09A0.0020.0002] # RECYCLED PAPER SYMBOL +267D ; [*09A1.0020.0002] # PARTIALLY-RECYCLED PAPER SYMBOL +267E ; [*09A2.0020.0002] # PERMANENT PAPER SIGN +267F ; [*09A3.0020.0002] # WHEELCHAIR SYMBOL +2680 ; [*09A4.0020.0002] # DIE FACE-1 +2681 ; [*09A5.0020.0002] # DIE FACE-2 +2682 ; [*09A6.0020.0002] # DIE FACE-3 +2683 ; [*09A7.0020.0002] # DIE FACE-4 +2684 ; [*09A8.0020.0002] # DIE FACE-5 +2685 ; [*09A9.0020.0002] # DIE FACE-6 +2686 ; [*09AA.0020.0002] # WHITE CIRCLE WITH DOT RIGHT +2687 ; [*09AB.0020.0002] # WHITE CIRCLE WITH TWO DOTS +2688 ; [*09AC.0020.0002] # BLACK CIRCLE WITH WHITE DOT RIGHT +2689 ; [*09AD.0020.0002] # BLACK CIRCLE WITH TWO WHITE DOTS +268A ; [*0EB4.0020.0002] # MONOGRAM FOR YANG +268B ; [*0EB5.0020.0002] # MONOGRAM FOR YIN +268C ; [*0EB6.0020.0002] # DIGRAM FOR GREATER YANG +268D ; [*0EB7.0020.0002] # DIGRAM FOR LESSER YIN +268E ; [*0EB8.0020.0002] # DIGRAM FOR LESSER YANG +268F ; [*0EB9.0020.0002] # DIGRAM FOR GREATER YIN +2690 ; [*09AE.0020.0002] # WHITE FLAG +2691 ; [*09AF.0020.0002] # BLACK FLAG +2692 ; [*09B0.0020.0002] # HAMMER AND PICK +2693 ; [*09B1.0020.0002] # ANCHOR +2694 ; [*09B2.0020.0002] # CROSSED SWORDS +2695 ; [*09B3.0020.0002] # STAFF OF AESCULAPIUS +2696 ; [*09B4.0020.0002] # SCALES +2697 ; [*09B5.0020.0002] # ALEMBIC +2698 ; [*09B6.0020.0002] # FLOWER +2699 ; [*09B7.0020.0002] # GEAR +269A ; [*09B8.0020.0002] # STAFF OF HERMES +269B ; [*09B9.0020.0002] # ATOM SYMBOL +269C ; [*09BA.0020.0002] # FLEUR-DE-LIS +269D ; [*09BB.0020.0002] # OUTLINED WHITE STAR +269E ; [*09BC.0020.0002] # THREE LINES CONVERGING RIGHT +269F ; [*09BD.0020.0002] # THREE LINES CONVERGING LEFT +26A0 ; [*09BE.0020.0002] # WARNING SIGN +26A1 ; [*09BF.0020.0002] # HIGH VOLTAGE SIGN +26A2 ; [*09C0.0020.0002] # DOUBLED FEMALE SIGN +26A3 ; [*09C1.0020.0002] # DOUBLED MALE SIGN +26A4 ; [*09C2.0020.0002] # INTERLOCKED FEMALE AND MALE SIGN +26A5 ; [*09C3.0020.0002] # MALE AND FEMALE SIGN +26A6 ; [*09C4.0020.0002] # MALE WITH STROKE SIGN +26A7 ; [*09C5.0020.0002] # MALE WITH STROKE AND MALE AND FEMALE SIGN +26A8 ; [*09C6.0020.0002] # VERTICAL MALE WITH STROKE SIGN +26A9 ; [*09C7.0020.0002] # HORIZONTAL MALE WITH STROKE SIGN +26AA ; [*09C8.0020.0002] # MEDIUM WHITE CIRCLE +26AB ; [*09C9.0020.0002] # MEDIUM BLACK CIRCLE +26AC ; [*09CA.0020.0002] # MEDIUM SMALL WHITE CIRCLE +26AD ; [*09CB.0020.0002] # MARRIAGE SYMBOL +26AE ; [*09CC.0020.0002] # DIVORCE SYMBOL +26AF ; [*09CD.0020.0002] # UNMARRIED PARTNERSHIP SYMBOL +26B0 ; [*09CE.0020.0002] # COFFIN +26B1 ; [*09CF.0020.0002] # FUNERAL URN +26B2 ; [*09D0.0020.0002] # NEUTER +26B3 ; [*09D1.0020.0002] # CERES +26B4 ; [*09D2.0020.0002] # PALLAS +26B5 ; [*09D3.0020.0002] # JUNO +26B6 ; [*09D4.0020.0002] # VESTA +26B7 ; [*09D5.0020.0002] # CHIRON +26B8 ; [*09D6.0020.0002] # BLACK MOON LILITH +26B9 ; [*09D7.0020.0002] # SEXTILE +26BA ; [*09D8.0020.0002] # SEMISEXTILE +26BB ; [*09D9.0020.0002] # QUINCUNX +26BC ; [*09DA.0020.0002] # SESQUIQUADRATE +26BD ; [*09DB.0020.0002] # SOCCER BALL +26BE ; [*09DC.0020.0002] # BASEBALL +26BF ; [*09DD.0020.0002] # SQUARED KEY +26C0 ; [*09DE.0020.0002] # WHITE DRAUGHTS MAN +26C1 ; [*09DF.0020.0002] # WHITE DRAUGHTS KING +26C2 ; [*09E0.0020.0002] # BLACK DRAUGHTS MAN +26C3 ; [*09E1.0020.0002] # BLACK DRAUGHTS KING +26C4 ; [*09E2.0020.0002] # SNOWMAN WITHOUT SNOW +26C5 ; [*09E3.0020.0002] # SUN BEHIND CLOUD +26C6 ; [*09E4.0020.0002] # RAIN +26C7 ; [*09E5.0020.0002] # BLACK SNOWMAN +26C8 ; [*09E6.0020.0002] # THUNDER CLOUD AND RAIN +26C9 ; [*09E7.0020.0002] # TURNED WHITE SHOGI PIECE +26CA ; [*09E8.0020.0002] # TURNED BLACK SHOGI PIECE +26CB ; [*09E9.0020.0002] # WHITE DIAMOND IN SQUARE +26CC ; [*09EA.0020.0002] # CROSSING LANES +26CD ; [*09EB.0020.0002] # DISABLED CAR +26CE ; [*09EC.0020.0002] # OPHIUCHUS +26CF ; [*09ED.0020.0002] # PICK +26D0 ; [*09EE.0020.0002] # CAR SLIDING +26D1 ; [*09EF.0020.0002] # HELMET WITH WHITE CROSS +26D2 ; [*09F0.0020.0002] # CIRCLED CROSSING LANES +26D3 ; [*09F1.0020.0002] # CHAINS +26D4 ; [*09F2.0020.0002] # NO ENTRY +26D5 ; [*09F3.0020.0002] # ALTERNATE ONE-WAY LEFT WAY TRAFFIC +26D6 ; [*09F4.0020.0002] # BLACK TWO-WAY LEFT WAY TRAFFIC +26D7 ; [*09F5.0020.0002] # WHITE TWO-WAY LEFT WAY TRAFFIC +26D8 ; [*09F6.0020.0002] # BLACK LEFT LANE MERGE +26D9 ; [*09F7.0020.0002] # WHITE LEFT LANE MERGE +26DA ; [*09F8.0020.0002] # DRIVE SLOW SIGN +26DB ; [*09F9.0020.0002] # HEAVY WHITE DOWN-POINTING TRIANGLE +26DC ; [*09FA.0020.0002] # LEFT CLOSED ENTRY +26DD ; [*09FB.0020.0002] # SQUARED SALTIRE +26DE ; [*09FC.0020.0002] # FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE +26DF ; [*09FD.0020.0002] # BLACK TRUCK +26E0 ; [*09FE.0020.0002] # RESTRICTED LEFT ENTRY-1 +26E1 ; [*09FF.0020.0002] # RESTRICTED LEFT ENTRY-2 +26E2 ; [*0A00.0020.0002] # ASTRONOMICAL SYMBOL FOR URANUS +26E3 ; [*0A01.0020.0002] # HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E4 ; [*0A02.0020.0002] # PENTAGRAM +26E5 ; [*0A03.0020.0002] # RIGHT-HANDED INTERLACED PENTAGRAM +26E6 ; [*0A04.0020.0002] # LEFT-HANDED INTERLACED PENTAGRAM +26E7 ; [*0A05.0020.0002] # INVERTED PENTAGRAM +26E8 ; [*0A06.0020.0002] # BLACK CROSS ON SHIELD +26E9 ; [*0A07.0020.0002] # SHINTO SHRINE +26EA ; [*0A08.0020.0002] # CHURCH +26EB ; [*0A09.0020.0002] # CASTLE +26EC ; [*0A0A.0020.0002] # HISTORIC SITE +26ED ; [*0A0B.0020.0002] # GEAR WITHOUT HUB +26EE ; [*0A0C.0020.0002] # GEAR WITH HANDLES +26EF ; [*0A0D.0020.0002] # MAP SYMBOL FOR LIGHTHOUSE +26F0 ; [*0A0E.0020.0002] # MOUNTAIN +26F1 ; [*0A0F.0020.0002] # UMBRELLA ON GROUND +26F2 ; [*0A10.0020.0002] # FOUNTAIN +26F3 ; [*0A11.0020.0002] # FLAG IN HOLE +26F4 ; [*0A12.0020.0002] # FERRY +26F5 ; [*0A13.0020.0002] # SAILBOAT +26F6 ; [*0A14.0020.0002] # SQUARE FOUR CORNERS +26F7 ; [*0A15.0020.0002] # SKIER +26F8 ; [*0A16.0020.0002] # ICE SKATE +26F9 ; [*0A17.0020.0002] # PERSON WITH BALL +26FA ; [*0A18.0020.0002] # TENT +26FB ; [*0A19.0020.0002] # JAPANESE BANK SYMBOL +26FC ; [*0A1A.0020.0002] # HEADSTONE GRAVEYARD SYMBOL +26FD ; [*0A1B.0020.0002] # FUEL PUMP +26FE ; [*0A1C.0020.0002] # CUP ON BLACK SQUARE +26FF ; [*0A1D.0020.0002] # WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +2700 ; [*0A38.0020.0002] # BLACK SAFETY SCISSORS +2701 ; [*0A39.0020.0002] # UPPER BLADE SCISSORS +2702 ; [*0A3A.0020.0002] # BLACK SCISSORS +2703 ; [*0A3B.0020.0002] # LOWER BLADE SCISSORS +2704 ; [*0A3C.0020.0002] # WHITE SCISSORS +2705 ; [*0A3D.0020.0002] # WHITE HEAVY CHECK MARK +2706 ; [*0A3E.0020.0002] # TELEPHONE LOCATION SIGN +2707 ; [*0A3F.0020.0002] # TAPE DRIVE +2708 ; [*0A40.0020.0002] # AIRPLANE +2709 ; [*0A41.0020.0002] # ENVELOPE +270A ; [*0A42.0020.0002] # RAISED FIST +270B ; [*0A43.0020.0002] # RAISED HAND +270C ; [*0A44.0020.0002] # VICTORY HAND +270D ; [*0A45.0020.0002] # WRITING HAND +270E ; [*0A46.0020.0002] # LOWER RIGHT PENCIL +270F ; [*0A47.0020.0002] # PENCIL +2710 ; [*0A48.0020.0002] # UPPER RIGHT PENCIL +2711 ; [*0A49.0020.0002] # WHITE NIB +2712 ; [*0A4A.0020.0002] # BLACK NIB +2713 ; [*0A4B.0020.0002] # CHECK MARK +2714 ; [*0A4C.0020.0002] # HEAVY CHECK MARK +2715 ; [*0A4D.0020.0002] # MULTIPLICATION X +2716 ; [*0A4E.0020.0002] # HEAVY MULTIPLICATION X +2717 ; [*0A4F.0020.0002] # BALLOT X +2718 ; [*0A50.0020.0002] # HEAVY BALLOT X +2719 ; [*0A51.0020.0002] # OUTLINED GREEK CROSS +271A ; [*0A52.0020.0002] # HEAVY GREEK CROSS +271B ; [*0A53.0020.0002] # OPEN CENTRE CROSS +271C ; [*0A54.0020.0002] # HEAVY OPEN CENTRE CROSS +271D ; [*0A55.0020.0002] # LATIN CROSS +271E ; [*0A56.0020.0002] # SHADOWED WHITE LATIN CROSS +271F ; [*0A57.0020.0002] # OUTLINED LATIN CROSS +2720 ; [*0A58.0020.0002] # MALTESE CROSS +2721 ; [*0A59.0020.0002] # STAR OF DAVID +2722 ; [*0A5A.0020.0002] # FOUR TEARDROP-SPOKED ASTERISK +2723 ; [*0A5B.0020.0002] # FOUR BALLOON-SPOKED ASTERISK +2724 ; [*0A5C.0020.0002] # HEAVY FOUR BALLOON-SPOKED ASTERISK +2725 ; [*0A5D.0020.0002] # FOUR CLUB-SPOKED ASTERISK +2726 ; [*0A5E.0020.0002] # BLACK FOUR POINTED STAR +2727 ; [*0A5F.0020.0002] # WHITE FOUR POINTED STAR +2728 ; [*0A60.0020.0002] # SPARKLES +2729 ; [*0A61.0020.0002] # STRESS OUTLINED WHITE STAR +272A ; [*0A62.0020.0002] # CIRCLED WHITE STAR +272B ; [*0A63.0020.0002] # OPEN CENTRE BLACK STAR +272C ; [*0A64.0020.0002] # BLACK CENTRE WHITE STAR +272D ; [*0A65.0020.0002] # OUTLINED BLACK STAR +272E ; [*0A66.0020.0002] # HEAVY OUTLINED BLACK STAR +272F ; [*0A67.0020.0002] # PINWHEEL STAR +2730 ; [*0A68.0020.0002] # SHADOWED WHITE STAR +2731 ; [*0A69.0020.0002] # HEAVY ASTERISK +2732 ; [*0A6A.0020.0002] # OPEN CENTRE ASTERISK +2733 ; [*0A6B.0020.0002] # EIGHT SPOKED ASTERISK +2734 ; [*0A6C.0020.0002] # EIGHT POINTED BLACK STAR +2735 ; [*0A6D.0020.0002] # EIGHT POINTED PINWHEEL STAR +2736 ; [*0A6E.0020.0002] # SIX POINTED BLACK STAR +2737 ; [*0A6F.0020.0002] # EIGHT POINTED RECTILINEAR BLACK STAR +2738 ; [*0A70.0020.0002] # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +2739 ; [*0A71.0020.0002] # TWELVE POINTED BLACK STAR +273A ; [*0A72.0020.0002] # SIXTEEN POINTED ASTERISK +273B ; [*0A73.0020.0002] # TEARDROP-SPOKED ASTERISK +273C ; [*0A74.0020.0002] # OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D ; [*0A75.0020.0002] # HEAVY TEARDROP-SPOKED ASTERISK +273E ; [*0A76.0020.0002] # SIX PETALLED BLACK AND WHITE FLORETTE +273F ; [*0A77.0020.0002] # BLACK FLORETTE +2740 ; [*0A78.0020.0002] # WHITE FLORETTE +2741 ; [*0A79.0020.0002] # EIGHT PETALLED OUTLINED BLACK FLORETTE +2742 ; [*0A7A.0020.0002] # CIRCLED OPEN CENTRE EIGHT POINTED STAR +2743 ; [*0A7B.0020.0002] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +2744 ; [*0A7C.0020.0002] # SNOWFLAKE +2745 ; [*0A7D.0020.0002] # TIGHT TRIFOLIATE SNOWFLAKE +2746 ; [*0A7E.0020.0002] # HEAVY CHEVRON SNOWFLAKE +2747 ; [*0A7F.0020.0002] # SPARKLE +2748 ; [*0A80.0020.0002] # HEAVY SPARKLE +2749 ; [*0A81.0020.0002] # BALLOON-SPOKED ASTERISK +274A ; [*0A82.0020.0002] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274B ; [*0A83.0020.0002] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274C ; [*0A84.0020.0002] # CROSS MARK +274D ; [*0A85.0020.0002] # SHADOWED WHITE CIRCLE +274E ; [*0A86.0020.0002] # NEGATIVE SQUARED CROSS MARK +274F ; [*0A87.0020.0002] # LOWER RIGHT DROP-SHADOWED WHITE SQUARE +2750 ; [*0A88.0020.0002] # UPPER RIGHT DROP-SHADOWED WHITE SQUARE +2751 ; [*0A89.0020.0002] # LOWER RIGHT SHADOWED WHITE SQUARE +2752 ; [*0A8A.0020.0002] # UPPER RIGHT SHADOWED WHITE SQUARE +2753 ; [*0A8B.0020.0002] # BLACK QUESTION MARK ORNAMENT +2754 ; [*0A8C.0020.0002] # WHITE QUESTION MARK ORNAMENT +2755 ; [*0A8D.0020.0002] # WHITE EXCLAMATION MARK ORNAMENT +2756 ; [*0A8E.0020.0002] # BLACK DIAMOND MINUS WHITE X +2757 ; [*0A8F.0020.0002] # HEAVY EXCLAMATION MARK SYMBOL +2758 ; [*0A90.0020.0002] # LIGHT VERTICAL BAR +2759 ; [*0A91.0020.0002] # MEDIUM VERTICAL BAR +275A ; [*0A92.0020.0002] # HEAVY VERTICAL BAR +275B ; [*0A93.0020.0002] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT +275C ; [*0A94.0020.0002] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT +275D ; [*0A95.0020.0002] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +275E ; [*0A96.0020.0002] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +275F ; [*0A97.0020.0002] # HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT +2760 ; [*0A98.0020.0002] # HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +2761 ; [*0A99.0020.0002] # CURVED STEM PARAGRAPH SIGN ORNAMENT +2762 ; [*0A9A.0020.0002] # HEAVY EXCLAMATION MARK ORNAMENT +2763 ; [*0A9B.0020.0002] # HEAVY HEART EXCLAMATION MARK ORNAMENT +2764 ; [*0A9C.0020.0002] # HEAVY BLACK HEART +2765 ; [*0A9D.0020.0002] # ROTATED HEAVY BLACK HEART BULLET +2766 ; [*0A9E.0020.0002] # FLORAL HEART +2767 ; [*0A9F.0020.0002] # ROTATED FLORAL HEART BULLET +2768 ; [*034E.0020.0002] # MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; [*034F.0020.0002] # MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; [*0350.0020.0002] # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; [*0351.0020.0002] # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; [*0352.0020.0002] # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; [*0353.0020.0002] # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; [*0354.0020.0002] # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; [*0355.0020.0002] # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; [*0356.0020.0002] # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; [*0357.0020.0002] # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; [*0358.0020.0002] # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; [*0359.0020.0002] # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; [*035A.0020.0002] # MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; [*035B.0020.0002] # MEDIUM RIGHT CURLY BRACKET ORNAMENT +2794 ; [*0AA0.0020.0002] # HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795 ; [*0AA1.0020.0002] # HEAVY PLUS SIGN +2796 ; [*0AA2.0020.0002] # HEAVY MINUS SIGN +2797 ; [*0AA3.0020.0002] # HEAVY DIVISION SIGN +2798 ; [*0AA4.0020.0002] # HEAVY SOUTH EAST ARROW +2799 ; [*0AA5.0020.0002] # HEAVY RIGHTWARDS ARROW +279A ; [*0AA6.0020.0002] # HEAVY NORTH EAST ARROW +279B ; [*0AA7.0020.0002] # DRAFTING POINT RIGHTWARDS ARROW +279C ; [*0AA8.0020.0002] # HEAVY ROUND-TIPPED RIGHTWARDS ARROW +279D ; [*0AA9.0020.0002] # TRIANGLE-HEADED RIGHTWARDS ARROW +279E ; [*0AAA.0020.0002] # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +279F ; [*0AAB.0020.0002] # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A0 ; [*0AAC.0020.0002] # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +27A1 ; [*0AAD.0020.0002] # BLACK RIGHTWARDS ARROW +27A2 ; [*0AAE.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +27A3 ; [*0AAF.0020.0002] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +27A4 ; [*0AB0.0020.0002] # BLACK RIGHTWARDS ARROWHEAD +27A5 ; [*0AB1.0020.0002] # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +27A6 ; [*0AB2.0020.0002] # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +27A7 ; [*0AB3.0020.0002] # SQUAT BLACK RIGHTWARDS ARROW +27A8 ; [*0AB4.0020.0002] # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +27A9 ; [*0AB5.0020.0002] # RIGHT-SHADED WHITE RIGHTWARDS ARROW +27AA ; [*0AB6.0020.0002] # LEFT-SHADED WHITE RIGHTWARDS ARROW +27AB ; [*0AB7.0020.0002] # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AC ; [*0AB8.0020.0002] # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +27AD ; [*0AB9.0020.0002] # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AE ; [*0ABA.0020.0002] # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27AF ; [*0ABB.0020.0002] # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B0 ; [*0ABC.0020.0002] # CURLY LOOP +27B1 ; [*0ABD.0020.0002] # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B2 ; [*0ABE.0020.0002] # CIRCLED HEAVY WHITE RIGHTWARDS ARROW +27B3 ; [*0ABF.0020.0002] # WHITE-FEATHERED RIGHTWARDS ARROW +27B4 ; [*0AC0.0020.0002] # BLACK-FEATHERED SOUTH EAST ARROW +27B5 ; [*0AC1.0020.0002] # BLACK-FEATHERED RIGHTWARDS ARROW +27B6 ; [*0AC2.0020.0002] # BLACK-FEATHERED NORTH EAST ARROW +27B7 ; [*0AC3.0020.0002] # HEAVY BLACK-FEATHERED SOUTH EAST ARROW +27B8 ; [*0AC4.0020.0002] # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +27B9 ; [*0AC5.0020.0002] # HEAVY BLACK-FEATHERED NORTH EAST ARROW +27BA ; [*0AC6.0020.0002] # TEARDROP-BARBED RIGHTWARDS ARROW +27BB ; [*0AC7.0020.0002] # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +27BC ; [*0AC8.0020.0002] # WEDGE-TAILED RIGHTWARDS ARROW +27BD ; [*0AC9.0020.0002] # HEAVY WEDGE-TAILED RIGHTWARDS ARROW +27BE ; [*0ACA.0020.0002] # OPEN-OUTLINED RIGHTWARDS ARROW +27BF ; [*0ACB.0020.0002] # DOUBLE CURLY LOOP +27C0 ; [*0ACC.0020.0002] # THREE DIMENSIONAL ANGLE +27C1 ; [*0ACD.0020.0002] # WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE +27C2 ; [*0ACE.0020.0002] # PERPENDICULAR +27C3 ; [*0ACF.0020.0002] # OPEN SUBSET +27C4 ; [*0AD0.0020.0002] # OPEN SUPERSET +27C5 ; [*0342.0020.0002] # LEFT S-SHAPED BAG DELIMITER +27C6 ; [*0343.0020.0002] # RIGHT S-SHAPED BAG DELIMITER +27C7 ; [*0AD1.0020.0002] # OR WITH DOT INSIDE +27C8 ; [*0AD2.0020.0002] # REVERSE SOLIDUS PRECEDING SUBSET +27C9 ; [*0AD3.0020.0002] # SUPERSET PRECEDING SOLIDUS +27CA ; [*0AD4.0020.0002] # VERTICAL BAR WITH HORIZONTAL STROKE +27CB ; [*0AD5.0020.0002] # MATHEMATICAL RISING DIAGONAL +27CC ; [*0AD6.0020.0002] # LONG DIVISION +27CD ; [*0AD7.0020.0002] # MATHEMATICAL FALLING DIAGONAL +27CE ; [*0AD8.0020.0002] # SQUARED LOGICAL AND +27CF ; [*0AD9.0020.0002] # SQUARED LOGICAL OR +27D0 ; [*0ADA.0020.0002] # WHITE DIAMOND WITH CENTRED DOT +27D1 ; [*0ADB.0020.0002] # AND WITH DOT +27D2 ; [*0ADC.0020.0002] # ELEMENT OF OPENING UPWARDS +27D3 ; [*0ADD.0020.0002] # LOWER RIGHT CORNER WITH DOT +27D4 ; [*0ADE.0020.0002] # UPPER LEFT CORNER WITH DOT +27D5 ; [*0ADF.0020.0002] # LEFT OUTER JOIN +27D6 ; [*0AE0.0020.0002] # RIGHT OUTER JOIN +27D7 ; [*0AE1.0020.0002] # FULL OUTER JOIN +27D8 ; [*0AE2.0020.0002] # LARGE UP TACK +27D9 ; [*0AE3.0020.0002] # LARGE DOWN TACK +27DA ; [*0AE4.0020.0002] # LEFT AND RIGHT DOUBLE TURNSTILE +27DB ; [*0AE5.0020.0002] # LEFT AND RIGHT TACK +27DC ; [*0AE6.0020.0002] # LEFT MULTIMAP +27DD ; [*0AE7.0020.0002] # LONG RIGHT TACK +27DE ; [*0AE8.0020.0002] # LONG LEFT TACK +27DF ; [*0AE9.0020.0002] # UP TACK WITH CIRCLE ABOVE +27E0 ; [*0AEA.0020.0002] # LOZENGE DIVIDED BY HORIZONTAL RULE +27E1 ; [*0AEB.0020.0002] # WHITE CONCAVE-SIDED DIAMOND +27E2 ; [*0AEC.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +27E3 ; [*0AED.0020.0002] # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +27E4 ; [*0AEE.0020.0002] # WHITE SQUARE WITH LEFTWARDS TICK +27E5 ; [*0AEF.0020.0002] # WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; [*0344.0020.0002] # MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; [*0345.0020.0002] # MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; [*0346.0020.0002] # MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; [*0347.0020.0002] # MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; [*0348.0020.0002] # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; [*0349.0020.0002] # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; [*034A.0020.0002] # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; [*034B.0020.0002] # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; [*034C.0020.0002] # MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; [*034D.0020.0002] # MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0 ; [*0AF0.0020.0002] # UPWARDS QUADRUPLE ARROW +27F1 ; [*0AF1.0020.0002] # DOWNWARDS QUADRUPLE ARROW +27F2 ; [*0AF2.0020.0002] # ANTICLOCKWISE GAPPED CIRCLE ARROW +27F3 ; [*0AF3.0020.0002] # CLOCKWISE GAPPED CIRCLE ARROW +27F4 ; [*0AF4.0020.0002] # RIGHT ARROW WITH CIRCLED PLUS +27F5 ; [*0AF5.0020.0002] # LONG LEFTWARDS ARROW +27F6 ; [*0AF6.0020.0002] # LONG RIGHTWARDS ARROW +27F7 ; [*0AF7.0020.0002] # LONG LEFT RIGHT ARROW +27F8 ; [*0AF8.0020.0002] # LONG LEFTWARDS DOUBLE ARROW +27F9 ; [*0AF9.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW +27FA ; [*0AFA.0020.0002] # LONG LEFT RIGHT DOUBLE ARROW +27FB ; [*0AFB.0020.0002] # LONG LEFTWARDS ARROW FROM BAR +27FC ; [*0AFC.0020.0002] # LONG RIGHTWARDS ARROW FROM BAR +27FD ; [*0AFD.0020.0002] # LONG LEFTWARDS DOUBLE ARROW FROM BAR +27FE ; [*0AFE.0020.0002] # LONG RIGHTWARDS DOUBLE ARROW FROM BAR +27FF ; [*0AFF.0020.0002] # LONG RIGHTWARDS SQUIGGLE ARROW +2800 ; [*0DB4.0020.0002] # BRAILLE PATTERN BLANK +2801 ; [*0DB5.0020.0002] # BRAILLE PATTERN DOTS-1 +2802 ; [*0DB6.0020.0002] # BRAILLE PATTERN DOTS-2 +2803 ; [*0DB7.0020.0002] # BRAILLE PATTERN DOTS-12 +2804 ; [*0DB8.0020.0002] # BRAILLE PATTERN DOTS-3 +2805 ; [*0DB9.0020.0002] # BRAILLE PATTERN DOTS-13 +2806 ; [*0DBA.0020.0002] # BRAILLE PATTERN DOTS-23 +2807 ; [*0DBB.0020.0002] # BRAILLE PATTERN DOTS-123 +2808 ; [*0DBC.0020.0002] # BRAILLE PATTERN DOTS-4 +2809 ; [*0DBD.0020.0002] # BRAILLE PATTERN DOTS-14 +280A ; [*0DBE.0020.0002] # BRAILLE PATTERN DOTS-24 +280B ; [*0DBF.0020.0002] # BRAILLE PATTERN DOTS-124 +280C ; [*0DC0.0020.0002] # BRAILLE PATTERN DOTS-34 +280D ; [*0DC1.0020.0002] # BRAILLE PATTERN DOTS-134 +280E ; [*0DC2.0020.0002] # BRAILLE PATTERN DOTS-234 +280F ; [*0DC3.0020.0002] # BRAILLE PATTERN DOTS-1234 +2810 ; [*0DC4.0020.0002] # BRAILLE PATTERN DOTS-5 +2811 ; [*0DC5.0020.0002] # BRAILLE PATTERN DOTS-15 +2812 ; [*0DC6.0020.0002] # BRAILLE PATTERN DOTS-25 +2813 ; [*0DC7.0020.0002] # BRAILLE PATTERN DOTS-125 +2814 ; [*0DC8.0020.0002] # BRAILLE PATTERN DOTS-35 +2815 ; [*0DC9.0020.0002] # BRAILLE PATTERN DOTS-135 +2816 ; [*0DCA.0020.0002] # BRAILLE PATTERN DOTS-235 +2817 ; [*0DCB.0020.0002] # BRAILLE PATTERN DOTS-1235 +2818 ; [*0DCC.0020.0002] # BRAILLE PATTERN DOTS-45 +2819 ; [*0DCD.0020.0002] # BRAILLE PATTERN DOTS-145 +281A ; [*0DCE.0020.0002] # BRAILLE PATTERN DOTS-245 +281B ; [*0DCF.0020.0002] # BRAILLE PATTERN DOTS-1245 +281C ; [*0DD0.0020.0002] # BRAILLE PATTERN DOTS-345 +281D ; [*0DD1.0020.0002] # BRAILLE PATTERN DOTS-1345 +281E ; [*0DD2.0020.0002] # BRAILLE PATTERN DOTS-2345 +281F ; [*0DD3.0020.0002] # BRAILLE PATTERN DOTS-12345 +2820 ; [*0DD4.0020.0002] # BRAILLE PATTERN DOTS-6 +2821 ; [*0DD5.0020.0002] # BRAILLE PATTERN DOTS-16 +2822 ; [*0DD6.0020.0002] # BRAILLE PATTERN DOTS-26 +2823 ; [*0DD7.0020.0002] # BRAILLE PATTERN DOTS-126 +2824 ; [*0DD8.0020.0002] # BRAILLE PATTERN DOTS-36 +2825 ; [*0DD9.0020.0002] # BRAILLE PATTERN DOTS-136 +2826 ; [*0DDA.0020.0002] # BRAILLE PATTERN DOTS-236 +2827 ; [*0DDB.0020.0002] # BRAILLE PATTERN DOTS-1236 +2828 ; [*0DDC.0020.0002] # BRAILLE PATTERN DOTS-46 +2829 ; [*0DDD.0020.0002] # BRAILLE PATTERN DOTS-146 +282A ; [*0DDE.0020.0002] # BRAILLE PATTERN DOTS-246 +282B ; [*0DDF.0020.0002] # BRAILLE PATTERN DOTS-1246 +282C ; [*0DE0.0020.0002] # BRAILLE PATTERN DOTS-346 +282D ; [*0DE1.0020.0002] # BRAILLE PATTERN DOTS-1346 +282E ; [*0DE2.0020.0002] # BRAILLE PATTERN DOTS-2346 +282F ; [*0DE3.0020.0002] # BRAILLE PATTERN DOTS-12346 +2830 ; [*0DE4.0020.0002] # BRAILLE PATTERN DOTS-56 +2831 ; [*0DE5.0020.0002] # BRAILLE PATTERN DOTS-156 +2832 ; [*0DE6.0020.0002] # BRAILLE PATTERN DOTS-256 +2833 ; [*0DE7.0020.0002] # BRAILLE PATTERN DOTS-1256 +2834 ; [*0DE8.0020.0002] # BRAILLE PATTERN DOTS-356 +2835 ; [*0DE9.0020.0002] # BRAILLE PATTERN DOTS-1356 +2836 ; [*0DEA.0020.0002] # BRAILLE PATTERN DOTS-2356 +2837 ; [*0DEB.0020.0002] # BRAILLE PATTERN DOTS-12356 +2838 ; [*0DEC.0020.0002] # BRAILLE PATTERN DOTS-456 +2839 ; [*0DED.0020.0002] # BRAILLE PATTERN DOTS-1456 +283A ; [*0DEE.0020.0002] # BRAILLE PATTERN DOTS-2456 +283B ; [*0DEF.0020.0002] # BRAILLE PATTERN DOTS-12456 +283C ; [*0DF0.0020.0002] # BRAILLE PATTERN DOTS-3456 +283D ; [*0DF1.0020.0002] # BRAILLE PATTERN DOTS-13456 +283E ; [*0DF2.0020.0002] # BRAILLE PATTERN DOTS-23456 +283F ; [*0DF3.0020.0002] # BRAILLE PATTERN DOTS-123456 +2840 ; [*0DF4.0020.0002] # BRAILLE PATTERN DOTS-7 +2841 ; [*0DF5.0020.0002] # BRAILLE PATTERN DOTS-17 +2842 ; [*0DF6.0020.0002] # BRAILLE PATTERN DOTS-27 +2843 ; [*0DF7.0020.0002] # BRAILLE PATTERN DOTS-127 +2844 ; [*0DF8.0020.0002] # BRAILLE PATTERN DOTS-37 +2845 ; [*0DF9.0020.0002] # BRAILLE PATTERN DOTS-137 +2846 ; [*0DFA.0020.0002] # BRAILLE PATTERN DOTS-237 +2847 ; [*0DFB.0020.0002] # BRAILLE PATTERN DOTS-1237 +2848 ; [*0DFC.0020.0002] # BRAILLE PATTERN DOTS-47 +2849 ; [*0DFD.0020.0002] # BRAILLE PATTERN DOTS-147 +284A ; [*0DFE.0020.0002] # BRAILLE PATTERN DOTS-247 +284B ; [*0DFF.0020.0002] # BRAILLE PATTERN DOTS-1247 +284C ; [*0E00.0020.0002] # BRAILLE PATTERN DOTS-347 +284D ; [*0E01.0020.0002] # BRAILLE PATTERN DOTS-1347 +284E ; [*0E02.0020.0002] # BRAILLE PATTERN DOTS-2347 +284F ; [*0E03.0020.0002] # BRAILLE PATTERN DOTS-12347 +2850 ; [*0E04.0020.0002] # BRAILLE PATTERN DOTS-57 +2851 ; [*0E05.0020.0002] # BRAILLE PATTERN DOTS-157 +2852 ; [*0E06.0020.0002] # BRAILLE PATTERN DOTS-257 +2853 ; [*0E07.0020.0002] # BRAILLE PATTERN DOTS-1257 +2854 ; [*0E08.0020.0002] # BRAILLE PATTERN DOTS-357 +2855 ; [*0E09.0020.0002] # BRAILLE PATTERN DOTS-1357 +2856 ; [*0E0A.0020.0002] # BRAILLE PATTERN DOTS-2357 +2857 ; [*0E0B.0020.0002] # BRAILLE PATTERN DOTS-12357 +2858 ; [*0E0C.0020.0002] # BRAILLE PATTERN DOTS-457 +2859 ; [*0E0D.0020.0002] # BRAILLE PATTERN DOTS-1457 +285A ; [*0E0E.0020.0002] # BRAILLE PATTERN DOTS-2457 +285B ; [*0E0F.0020.0002] # BRAILLE PATTERN DOTS-12457 +285C ; [*0E10.0020.0002] # BRAILLE PATTERN DOTS-3457 +285D ; [*0E11.0020.0002] # BRAILLE PATTERN DOTS-13457 +285E ; [*0E12.0020.0002] # BRAILLE PATTERN DOTS-23457 +285F ; [*0E13.0020.0002] # BRAILLE PATTERN DOTS-123457 +2860 ; [*0E14.0020.0002] # BRAILLE PATTERN DOTS-67 +2861 ; [*0E15.0020.0002] # BRAILLE PATTERN DOTS-167 +2862 ; [*0E16.0020.0002] # BRAILLE PATTERN DOTS-267 +2863 ; [*0E17.0020.0002] # BRAILLE PATTERN DOTS-1267 +2864 ; [*0E18.0020.0002] # BRAILLE PATTERN DOTS-367 +2865 ; [*0E19.0020.0002] # BRAILLE PATTERN DOTS-1367 +2866 ; [*0E1A.0020.0002] # BRAILLE PATTERN DOTS-2367 +2867 ; [*0E1B.0020.0002] # BRAILLE PATTERN DOTS-12367 +2868 ; [*0E1C.0020.0002] # BRAILLE PATTERN DOTS-467 +2869 ; [*0E1D.0020.0002] # BRAILLE PATTERN DOTS-1467 +286A ; [*0E1E.0020.0002] # BRAILLE PATTERN DOTS-2467 +286B ; [*0E1F.0020.0002] # BRAILLE PATTERN DOTS-12467 +286C ; [*0E20.0020.0002] # BRAILLE PATTERN DOTS-3467 +286D ; [*0E21.0020.0002] # BRAILLE PATTERN DOTS-13467 +286E ; [*0E22.0020.0002] # BRAILLE PATTERN DOTS-23467 +286F ; [*0E23.0020.0002] # BRAILLE PATTERN DOTS-123467 +2870 ; [*0E24.0020.0002] # BRAILLE PATTERN DOTS-567 +2871 ; [*0E25.0020.0002] # BRAILLE PATTERN DOTS-1567 +2872 ; [*0E26.0020.0002] # BRAILLE PATTERN DOTS-2567 +2873 ; [*0E27.0020.0002] # BRAILLE PATTERN DOTS-12567 +2874 ; [*0E28.0020.0002] # BRAILLE PATTERN DOTS-3567 +2875 ; [*0E29.0020.0002] # BRAILLE PATTERN DOTS-13567 +2876 ; [*0E2A.0020.0002] # BRAILLE PATTERN DOTS-23567 +2877 ; [*0E2B.0020.0002] # BRAILLE PATTERN DOTS-123567 +2878 ; [*0E2C.0020.0002] # BRAILLE PATTERN DOTS-4567 +2879 ; [*0E2D.0020.0002] # BRAILLE PATTERN DOTS-14567 +287A ; [*0E2E.0020.0002] # BRAILLE PATTERN DOTS-24567 +287B ; [*0E2F.0020.0002] # BRAILLE PATTERN DOTS-124567 +287C ; [*0E30.0020.0002] # BRAILLE PATTERN DOTS-34567 +287D ; [*0E31.0020.0002] # BRAILLE PATTERN DOTS-134567 +287E ; [*0E32.0020.0002] # BRAILLE PATTERN DOTS-234567 +287F ; [*0E33.0020.0002] # BRAILLE PATTERN DOTS-1234567 +2880 ; [*0E34.0020.0002] # BRAILLE PATTERN DOTS-8 +2881 ; [*0E35.0020.0002] # BRAILLE PATTERN DOTS-18 +2882 ; [*0E36.0020.0002] # BRAILLE PATTERN DOTS-28 +2883 ; [*0E37.0020.0002] # BRAILLE PATTERN DOTS-128 +2884 ; [*0E38.0020.0002] # BRAILLE PATTERN DOTS-38 +2885 ; [*0E39.0020.0002] # BRAILLE PATTERN DOTS-138 +2886 ; [*0E3A.0020.0002] # BRAILLE PATTERN DOTS-238 +2887 ; [*0E3B.0020.0002] # BRAILLE PATTERN DOTS-1238 +2888 ; [*0E3C.0020.0002] # BRAILLE PATTERN DOTS-48 +2889 ; [*0E3D.0020.0002] # BRAILLE PATTERN DOTS-148 +288A ; [*0E3E.0020.0002] # BRAILLE PATTERN DOTS-248 +288B ; [*0E3F.0020.0002] # BRAILLE PATTERN DOTS-1248 +288C ; [*0E40.0020.0002] # BRAILLE PATTERN DOTS-348 +288D ; [*0E41.0020.0002] # BRAILLE PATTERN DOTS-1348 +288E ; [*0E42.0020.0002] # BRAILLE PATTERN DOTS-2348 +288F ; [*0E43.0020.0002] # BRAILLE PATTERN DOTS-12348 +2890 ; [*0E44.0020.0002] # BRAILLE PATTERN DOTS-58 +2891 ; [*0E45.0020.0002] # BRAILLE PATTERN DOTS-158 +2892 ; [*0E46.0020.0002] # BRAILLE PATTERN DOTS-258 +2893 ; [*0E47.0020.0002] # BRAILLE PATTERN DOTS-1258 +2894 ; [*0E48.0020.0002] # BRAILLE PATTERN DOTS-358 +2895 ; [*0E49.0020.0002] # BRAILLE PATTERN DOTS-1358 +2896 ; [*0E4A.0020.0002] # BRAILLE PATTERN DOTS-2358 +2897 ; [*0E4B.0020.0002] # BRAILLE PATTERN DOTS-12358 +2898 ; [*0E4C.0020.0002] # BRAILLE PATTERN DOTS-458 +2899 ; [*0E4D.0020.0002] # BRAILLE PATTERN DOTS-1458 +289A ; [*0E4E.0020.0002] # BRAILLE PATTERN DOTS-2458 +289B ; [*0E4F.0020.0002] # BRAILLE PATTERN DOTS-12458 +289C ; [*0E50.0020.0002] # BRAILLE PATTERN DOTS-3458 +289D ; [*0E51.0020.0002] # BRAILLE PATTERN DOTS-13458 +289E ; [*0E52.0020.0002] # BRAILLE PATTERN DOTS-23458 +289F ; [*0E53.0020.0002] # BRAILLE PATTERN DOTS-123458 +28A0 ; [*0E54.0020.0002] # BRAILLE PATTERN DOTS-68 +28A1 ; [*0E55.0020.0002] # BRAILLE PATTERN DOTS-168 +28A2 ; [*0E56.0020.0002] # BRAILLE PATTERN DOTS-268 +28A3 ; [*0E57.0020.0002] # BRAILLE PATTERN DOTS-1268 +28A4 ; [*0E58.0020.0002] # BRAILLE PATTERN DOTS-368 +28A5 ; [*0E59.0020.0002] # BRAILLE PATTERN DOTS-1368 +28A6 ; [*0E5A.0020.0002] # BRAILLE PATTERN DOTS-2368 +28A7 ; [*0E5B.0020.0002] # BRAILLE PATTERN DOTS-12368 +28A8 ; [*0E5C.0020.0002] # BRAILLE PATTERN DOTS-468 +28A9 ; [*0E5D.0020.0002] # BRAILLE PATTERN DOTS-1468 +28AA ; [*0E5E.0020.0002] # BRAILLE PATTERN DOTS-2468 +28AB ; [*0E5F.0020.0002] # BRAILLE PATTERN DOTS-12468 +28AC ; [*0E60.0020.0002] # BRAILLE PATTERN DOTS-3468 +28AD ; [*0E61.0020.0002] # BRAILLE PATTERN DOTS-13468 +28AE ; [*0E62.0020.0002] # BRAILLE PATTERN DOTS-23468 +28AF ; [*0E63.0020.0002] # BRAILLE PATTERN DOTS-123468 +28B0 ; [*0E64.0020.0002] # BRAILLE PATTERN DOTS-568 +28B1 ; [*0E65.0020.0002] # BRAILLE PATTERN DOTS-1568 +28B2 ; [*0E66.0020.0002] # BRAILLE PATTERN DOTS-2568 +28B3 ; [*0E67.0020.0002] # BRAILLE PATTERN DOTS-12568 +28B4 ; [*0E68.0020.0002] # BRAILLE PATTERN DOTS-3568 +28B5 ; [*0E69.0020.0002] # BRAILLE PATTERN DOTS-13568 +28B6 ; [*0E6A.0020.0002] # BRAILLE PATTERN DOTS-23568 +28B7 ; [*0E6B.0020.0002] # BRAILLE PATTERN DOTS-123568 +28B8 ; [*0E6C.0020.0002] # BRAILLE PATTERN DOTS-4568 +28B9 ; [*0E6D.0020.0002] # BRAILLE PATTERN DOTS-14568 +28BA ; [*0E6E.0020.0002] # BRAILLE PATTERN DOTS-24568 +28BB ; [*0E6F.0020.0002] # BRAILLE PATTERN DOTS-124568 +28BC ; [*0E70.0020.0002] # BRAILLE PATTERN DOTS-34568 +28BD ; [*0E71.0020.0002] # BRAILLE PATTERN DOTS-134568 +28BE ; [*0E72.0020.0002] # BRAILLE PATTERN DOTS-234568 +28BF ; [*0E73.0020.0002] # BRAILLE PATTERN DOTS-1234568 +28C0 ; [*0E74.0020.0002] # BRAILLE PATTERN DOTS-78 +28C1 ; [*0E75.0020.0002] # BRAILLE PATTERN DOTS-178 +28C2 ; [*0E76.0020.0002] # BRAILLE PATTERN DOTS-278 +28C3 ; [*0E77.0020.0002] # BRAILLE PATTERN DOTS-1278 +28C4 ; [*0E78.0020.0002] # BRAILLE PATTERN DOTS-378 +28C5 ; [*0E79.0020.0002] # BRAILLE PATTERN DOTS-1378 +28C6 ; [*0E7A.0020.0002] # BRAILLE PATTERN DOTS-2378 +28C7 ; [*0E7B.0020.0002] # BRAILLE PATTERN DOTS-12378 +28C8 ; [*0E7C.0020.0002] # BRAILLE PATTERN DOTS-478 +28C9 ; [*0E7D.0020.0002] # BRAILLE PATTERN DOTS-1478 +28CA ; [*0E7E.0020.0002] # BRAILLE PATTERN DOTS-2478 +28CB ; [*0E7F.0020.0002] # BRAILLE PATTERN DOTS-12478 +28CC ; [*0E80.0020.0002] # BRAILLE PATTERN DOTS-3478 +28CD ; [*0E81.0020.0002] # BRAILLE PATTERN DOTS-13478 +28CE ; [*0E82.0020.0002] # BRAILLE PATTERN DOTS-23478 +28CF ; [*0E83.0020.0002] # BRAILLE PATTERN DOTS-123478 +28D0 ; [*0E84.0020.0002] # BRAILLE PATTERN DOTS-578 +28D1 ; [*0E85.0020.0002] # BRAILLE PATTERN DOTS-1578 +28D2 ; [*0E86.0020.0002] # BRAILLE PATTERN DOTS-2578 +28D3 ; [*0E87.0020.0002] # BRAILLE PATTERN DOTS-12578 +28D4 ; [*0E88.0020.0002] # BRAILLE PATTERN DOTS-3578 +28D5 ; [*0E89.0020.0002] # BRAILLE PATTERN DOTS-13578 +28D6 ; [*0E8A.0020.0002] # BRAILLE PATTERN DOTS-23578 +28D7 ; [*0E8B.0020.0002] # BRAILLE PATTERN DOTS-123578 +28D8 ; [*0E8C.0020.0002] # BRAILLE PATTERN DOTS-4578 +28D9 ; [*0E8D.0020.0002] # BRAILLE PATTERN DOTS-14578 +28DA ; [*0E8E.0020.0002] # BRAILLE PATTERN DOTS-24578 +28DB ; [*0E8F.0020.0002] # BRAILLE PATTERN DOTS-124578 +28DC ; [*0E90.0020.0002] # BRAILLE PATTERN DOTS-34578 +28DD ; [*0E91.0020.0002] # BRAILLE PATTERN DOTS-134578 +28DE ; [*0E92.0020.0002] # BRAILLE PATTERN DOTS-234578 +28DF ; [*0E93.0020.0002] # BRAILLE PATTERN DOTS-1234578 +28E0 ; [*0E94.0020.0002] # BRAILLE PATTERN DOTS-678 +28E1 ; [*0E95.0020.0002] # BRAILLE PATTERN DOTS-1678 +28E2 ; [*0E96.0020.0002] # BRAILLE PATTERN DOTS-2678 +28E3 ; [*0E97.0020.0002] # BRAILLE PATTERN DOTS-12678 +28E4 ; [*0E98.0020.0002] # BRAILLE PATTERN DOTS-3678 +28E5 ; [*0E99.0020.0002] # BRAILLE PATTERN DOTS-13678 +28E6 ; [*0E9A.0020.0002] # BRAILLE PATTERN DOTS-23678 +28E7 ; [*0E9B.0020.0002] # BRAILLE PATTERN DOTS-123678 +28E8 ; [*0E9C.0020.0002] # BRAILLE PATTERN DOTS-4678 +28E9 ; [*0E9D.0020.0002] # BRAILLE PATTERN DOTS-14678 +28EA ; [*0E9E.0020.0002] # BRAILLE PATTERN DOTS-24678 +28EB ; [*0E9F.0020.0002] # BRAILLE PATTERN DOTS-124678 +28EC ; [*0EA0.0020.0002] # BRAILLE PATTERN DOTS-34678 +28ED ; [*0EA1.0020.0002] # BRAILLE PATTERN DOTS-134678 +28EE ; [*0EA2.0020.0002] # BRAILLE PATTERN DOTS-234678 +28EF ; [*0EA3.0020.0002] # BRAILLE PATTERN DOTS-1234678 +28F0 ; [*0EA4.0020.0002] # BRAILLE PATTERN DOTS-5678 +28F1 ; [*0EA5.0020.0002] # BRAILLE PATTERN DOTS-15678 +28F2 ; [*0EA6.0020.0002] # BRAILLE PATTERN DOTS-25678 +28F3 ; [*0EA7.0020.0002] # BRAILLE PATTERN DOTS-125678 +28F4 ; [*0EA8.0020.0002] # BRAILLE PATTERN DOTS-35678 +28F5 ; [*0EA9.0020.0002] # BRAILLE PATTERN DOTS-135678 +28F6 ; [*0EAA.0020.0002] # BRAILLE PATTERN DOTS-235678 +28F7 ; [*0EAB.0020.0002] # BRAILLE PATTERN DOTS-1235678 +28F8 ; [*0EAC.0020.0002] # BRAILLE PATTERN DOTS-45678 +28F9 ; [*0EAD.0020.0002] # BRAILLE PATTERN DOTS-145678 +28FA ; [*0EAE.0020.0002] # BRAILLE PATTERN DOTS-245678 +28FB ; [*0EAF.0020.0002] # BRAILLE PATTERN DOTS-1245678 +28FC ; [*0EB0.0020.0002] # BRAILLE PATTERN DOTS-345678 +28FD ; [*0EB1.0020.0002] # BRAILLE PATTERN DOTS-1345678 +28FE ; [*0EB2.0020.0002] # BRAILLE PATTERN DOTS-2345678 +28FF ; [*0EB3.0020.0002] # BRAILLE PATTERN DOTS-12345678 +2900 ; [*0B00.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2901 ; [*0B01.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2902 ; [*0B02.0020.0002] # LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2903 ; [*0B03.0020.0002] # RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +2904 ; [*0B04.0020.0002] # LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +2905 ; [*0B05.0020.0002] # RIGHTWARDS TWO-HEADED ARROW FROM BAR +2906 ; [*0B06.0020.0002] # LEFTWARDS DOUBLE ARROW FROM BAR +2907 ; [*0B07.0020.0002] # RIGHTWARDS DOUBLE ARROW FROM BAR +2908 ; [*0B08.0020.0002] # DOWNWARDS ARROW WITH HORIZONTAL STROKE +2909 ; [*0B09.0020.0002] # UPWARDS ARROW WITH HORIZONTAL STROKE +290A ; [*0B0A.0020.0002] # UPWARDS TRIPLE ARROW +290B ; [*0B0B.0020.0002] # DOWNWARDS TRIPLE ARROW +290C ; [*0B0C.0020.0002] # LEFTWARDS DOUBLE DASH ARROW +290D ; [*0B0D.0020.0002] # RIGHTWARDS DOUBLE DASH ARROW +290E ; [*0B0E.0020.0002] # LEFTWARDS TRIPLE DASH ARROW +290F ; [*0B0F.0020.0002] # RIGHTWARDS TRIPLE DASH ARROW +2910 ; [*0B10.0020.0002] # RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +2911 ; [*0B11.0020.0002] # RIGHTWARDS ARROW WITH DOTTED STEM +2912 ; [*0B12.0020.0002] # UPWARDS ARROW TO BAR +2913 ; [*0B13.0020.0002] # DOWNWARDS ARROW TO BAR +2914 ; [*0B14.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2915 ; [*0B15.0020.0002] # RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2916 ; [*0B16.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL +2917 ; [*0B17.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2918 ; [*0B18.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2919 ; [*0B19.0020.0002] # LEFTWARDS ARROW-TAIL +291A ; [*0B1A.0020.0002] # RIGHTWARDS ARROW-TAIL +291B ; [*0B1B.0020.0002] # LEFTWARDS DOUBLE ARROW-TAIL +291C ; [*0B1C.0020.0002] # RIGHTWARDS DOUBLE ARROW-TAIL +291D ; [*0B1D.0020.0002] # LEFTWARDS ARROW TO BLACK DIAMOND +291E ; [*0B1E.0020.0002] # RIGHTWARDS ARROW TO BLACK DIAMOND +291F ; [*0B1F.0020.0002] # LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +2920 ; [*0B20.0020.0002] # RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +2921 ; [*0B21.0020.0002] # NORTH WEST AND SOUTH EAST ARROW +2922 ; [*0B22.0020.0002] # NORTH EAST AND SOUTH WEST ARROW +2923 ; [*0B23.0020.0002] # NORTH WEST ARROW WITH HOOK +2924 ; [*0B24.0020.0002] # NORTH EAST ARROW WITH HOOK +2925 ; [*0B25.0020.0002] # SOUTH EAST ARROW WITH HOOK +2926 ; [*0B26.0020.0002] # SOUTH WEST ARROW WITH HOOK +2927 ; [*0B27.0020.0002] # NORTH WEST ARROW AND NORTH EAST ARROW +2928 ; [*0B28.0020.0002] # NORTH EAST ARROW AND SOUTH EAST ARROW +2929 ; [*0B29.0020.0002] # SOUTH EAST ARROW AND SOUTH WEST ARROW +292A ; [*0B2A.0020.0002] # SOUTH WEST ARROW AND NORTH WEST ARROW +292B ; [*0B2B.0020.0002] # RISING DIAGONAL CROSSING FALLING DIAGONAL +292C ; [*0B2C.0020.0002] # FALLING DIAGONAL CROSSING RISING DIAGONAL +292D ; [*0B2D.0020.0002] # SOUTH EAST ARROW CROSSING NORTH EAST ARROW +292E ; [*0B2E.0020.0002] # NORTH EAST ARROW CROSSING SOUTH EAST ARROW +292F ; [*0B2F.0020.0002] # FALLING DIAGONAL CROSSING NORTH EAST ARROW +2930 ; [*0B30.0020.0002] # RISING DIAGONAL CROSSING SOUTH EAST ARROW +2931 ; [*0B31.0020.0002] # NORTH EAST ARROW CROSSING NORTH WEST ARROW +2932 ; [*0B32.0020.0002] # NORTH WEST ARROW CROSSING NORTH EAST ARROW +2933 ; [*0B33.0020.0002] # WAVE ARROW POINTING DIRECTLY RIGHT +2934 ; [*0B34.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS +2935 ; [*0B35.0020.0002] # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +2936 ; [*0B36.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +2937 ; [*0B37.0020.0002] # ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +2938 ; [*0B38.0020.0002] # RIGHT-SIDE ARC CLOCKWISE ARROW +2939 ; [*0B39.0020.0002] # LEFT-SIDE ARC ANTICLOCKWISE ARROW +293A ; [*0B3A.0020.0002] # TOP ARC ANTICLOCKWISE ARROW +293B ; [*0B3B.0020.0002] # BOTTOM ARC ANTICLOCKWISE ARROW +293C ; [*0B3C.0020.0002] # TOP ARC CLOCKWISE ARROW WITH MINUS +293D ; [*0B3D.0020.0002] # TOP ARC ANTICLOCKWISE ARROW WITH PLUS +293E ; [*0B3E.0020.0002] # LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW +293F ; [*0B3F.0020.0002] # LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW +2940 ; [*0B40.0020.0002] # ANTICLOCKWISE CLOSED CIRCLE ARROW +2941 ; [*0B41.0020.0002] # CLOCKWISE CLOSED CIRCLE ARROW +2942 ; [*0B42.0020.0002] # RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW +2943 ; [*0B43.0020.0002] # LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW +2944 ; [*0B44.0020.0002] # SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW +2945 ; [*0B45.0020.0002] # RIGHTWARDS ARROW WITH PLUS BELOW +2946 ; [*0B46.0020.0002] # LEFTWARDS ARROW WITH PLUS BELOW +2947 ; [*0B47.0020.0002] # RIGHTWARDS ARROW THROUGH X +2948 ; [*0B48.0020.0002] # LEFT RIGHT ARROW THROUGH SMALL CIRCLE +2949 ; [*0B49.0020.0002] # UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +294A ; [*0B4A.0020.0002] # LEFT BARB UP RIGHT BARB DOWN HARPOON +294B ; [*0B4B.0020.0002] # LEFT BARB DOWN RIGHT BARB UP HARPOON +294C ; [*0B4C.0020.0002] # UP BARB RIGHT DOWN BARB LEFT HARPOON +294D ; [*0B4D.0020.0002] # UP BARB LEFT DOWN BARB RIGHT HARPOON +294E ; [*0B4E.0020.0002] # LEFT BARB UP RIGHT BARB UP HARPOON +294F ; [*0B4F.0020.0002] # UP BARB RIGHT DOWN BARB RIGHT HARPOON +2950 ; [*0B50.0020.0002] # LEFT BARB DOWN RIGHT BARB DOWN HARPOON +2951 ; [*0B51.0020.0002] # UP BARB LEFT DOWN BARB LEFT HARPOON +2952 ; [*0B52.0020.0002] # LEFTWARDS HARPOON WITH BARB UP TO BAR +2953 ; [*0B53.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP TO BAR +2954 ; [*0B54.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT TO BAR +2955 ; [*0B55.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +2956 ; [*0B56.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN TO BAR +2957 ; [*0B57.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +2958 ; [*0B58.0020.0002] # UPWARDS HARPOON WITH BARB LEFT TO BAR +2959 ; [*0B59.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT TO BAR +295A ; [*0B5A.0020.0002] # LEFTWARDS HARPOON WITH BARB UP FROM BAR +295B ; [*0B5B.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP FROM BAR +295C ; [*0B5C.0020.0002] # UPWARDS HARPOON WITH BARB RIGHT FROM BAR +295D ; [*0B5D.0020.0002] # DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +295E ; [*0B5E.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +295F ; [*0B5F.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +2960 ; [*0B60.0020.0002] # UPWARDS HARPOON WITH BARB LEFT FROM BAR +2961 ; [*0B61.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +2962 ; [*0B62.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +2963 ; [*0B63.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2964 ; [*0B64.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2965 ; [*0B65.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +2966 ; [*0B66.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +2967 ; [*0B67.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +2968 ; [*0B68.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +2969 ; [*0B69.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +296A ; [*0B6A.0020.0002] # LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296B ; [*0B6B.0020.0002] # LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296C ; [*0B6C.0020.0002] # RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +296D ; [*0B6D.0020.0002] # RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +296E ; [*0B6E.0020.0002] # UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +296F ; [*0B6F.0020.0002] # DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +2970 ; [*0B70.0020.0002] # RIGHT DOUBLE ARROW WITH ROUNDED HEAD +2971 ; [*0B71.0020.0002] # EQUALS SIGN ABOVE RIGHTWARDS ARROW +2972 ; [*0B72.0020.0002] # TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2973 ; [*0B73.0020.0002] # LEFTWARDS ARROW ABOVE TILDE OPERATOR +2974 ; [*0B74.0020.0002] # RIGHTWARDS ARROW ABOVE TILDE OPERATOR +2975 ; [*0B75.0020.0002] # RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +2976 ; [*0B76.0020.0002] # LESS-THAN ABOVE LEFTWARDS ARROW +2977 ; [*0B77.0020.0002] # LEFTWARDS ARROW THROUGH LESS-THAN +2978 ; [*0B78.0020.0002] # GREATER-THAN ABOVE RIGHTWARDS ARROW +2979 ; [*0B79.0020.0002] # SUBSET ABOVE RIGHTWARDS ARROW +297A ; [*0B7A.0020.0002] # LEFTWARDS ARROW THROUGH SUBSET +297B ; [*0B7B.0020.0002] # SUPERSET ABOVE LEFTWARDS ARROW +297C ; [*0B7C.0020.0002] # LEFT FISH TAIL +297D ; [*0B7D.0020.0002] # RIGHT FISH TAIL +297E ; [*0B7E.0020.0002] # UP FISH TAIL +297F ; [*0B7F.0020.0002] # DOWN FISH TAIL +2980 ; [*0B80.0020.0002] # TRIPLE VERTICAL BAR DELIMITER +2981 ; [*0B81.0020.0002] # Z NOTATION SPOT +2982 ; [*0B82.0020.0002] # Z NOTATION TYPE COLON +2983 ; [*032C.0020.0002] # LEFT WHITE CURLY BRACKET +2984 ; [*032D.0020.0002] # RIGHT WHITE CURLY BRACKET +2985 ; [*032E.0020.0002] # LEFT WHITE PARENTHESIS +2986 ; [*032F.0020.0002] # RIGHT WHITE PARENTHESIS +2987 ; [*0330.0020.0002] # Z NOTATION LEFT IMAGE BRACKET +2988 ; [*0331.0020.0002] # Z NOTATION RIGHT IMAGE BRACKET +2989 ; [*0332.0020.0002] # Z NOTATION LEFT BINDING BRACKET +298A ; [*0333.0020.0002] # Z NOTATION RIGHT BINDING BRACKET +298B ; [*0334.0020.0002] # LEFT SQUARE BRACKET WITH UNDERBAR +298C ; [*0335.0020.0002] # RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; [*0336.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; [*0337.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; [*0338.0020.0002] # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; [*0339.0020.0002] # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; [*033A.0020.0002] # LEFT ANGLE BRACKET WITH DOT +2992 ; [*033B.0020.0002] # RIGHT ANGLE BRACKET WITH DOT +2993 ; [*033C.0020.0002] # LEFT ARC LESS-THAN BRACKET +2994 ; [*033D.0020.0002] # RIGHT ARC GREATER-THAN BRACKET +2995 ; [*033E.0020.0002] # DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; [*033F.0020.0002] # DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; [*0340.0020.0002] # LEFT BLACK TORTOISE SHELL BRACKET +2998 ; [*0341.0020.0002] # RIGHT BLACK TORTOISE SHELL BRACKET +2999 ; [*0B83.0020.0002] # DOTTED FENCE +299A ; [*0B84.0020.0002] # VERTICAL ZIGZAG LINE +299B ; [*0B85.0020.0002] # MEASURED ANGLE OPENING LEFT +299C ; [*0B86.0020.0002] # RIGHT ANGLE VARIANT WITH SQUARE +299D ; [*0B87.0020.0002] # MEASURED RIGHT ANGLE WITH DOT +299E ; [*0B88.0020.0002] # ANGLE WITH S INSIDE +299F ; [*0B89.0020.0002] # ACUTE ANGLE +29A0 ; [*0B8A.0020.0002] # SPHERICAL ANGLE OPENING LEFT +29A1 ; [*0B8B.0020.0002] # SPHERICAL ANGLE OPENING UP +29A2 ; [*0B8C.0020.0002] # TURNED ANGLE +29A3 ; [*0B8D.0020.0002] # REVERSED ANGLE +29A4 ; [*0B8E.0020.0002] # ANGLE WITH UNDERBAR +29A5 ; [*0B8F.0020.0002] # REVERSED ANGLE WITH UNDERBAR +29A6 ; [*0B90.0020.0002] # OBLIQUE ANGLE OPENING UP +29A7 ; [*0B91.0020.0002] # OBLIQUE ANGLE OPENING DOWN +29A8 ; [*0B92.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +29A9 ; [*0B93.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +29AA ; [*0B94.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +29AB ; [*0B95.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +29AC ; [*0B96.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +29AD ; [*0B97.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +29AE ; [*0B98.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +29AF ; [*0B99.0020.0002] # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +29B0 ; [*0B9A.0020.0002] # REVERSED EMPTY SET +29B1 ; [*0B9B.0020.0002] # EMPTY SET WITH OVERBAR +29B2 ; [*0B9C.0020.0002] # EMPTY SET WITH SMALL CIRCLE ABOVE +29B3 ; [*0B9D.0020.0002] # EMPTY SET WITH RIGHT ARROW ABOVE +29B4 ; [*0B9E.0020.0002] # EMPTY SET WITH LEFT ARROW ABOVE +29B5 ; [*0B9F.0020.0002] # CIRCLE WITH HORIZONTAL BAR +29B6 ; [*0BA0.0020.0002] # CIRCLED VERTICAL BAR +29B7 ; [*0BA1.0020.0002] # CIRCLED PARALLEL +29B8 ; [*0BA2.0020.0002] # CIRCLED REVERSE SOLIDUS +29B9 ; [*0BA3.0020.0002] # CIRCLED PERPENDICULAR +29BA ; [*0BA4.0020.0002] # CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR +29BB ; [*0BA5.0020.0002] # CIRCLE WITH SUPERIMPOSED X +29BC ; [*0BA6.0020.0002] # CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +29BD ; [*0BA7.0020.0002] # UP ARROW THROUGH CIRCLE +29BE ; [*0BA8.0020.0002] # CIRCLED WHITE BULLET +29BF ; [*0BA9.0020.0002] # CIRCLED BULLET +29C0 ; [*0BAA.0020.0002] # CIRCLED LESS-THAN +29C1 ; [*0BAB.0020.0002] # CIRCLED GREATER-THAN +29C2 ; [*0BAC.0020.0002] # CIRCLE WITH SMALL CIRCLE TO THE RIGHT +29C3 ; [*0BAD.0020.0002] # CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +29C4 ; [*0BAE.0020.0002] # SQUARED RISING DIAGONAL SLASH +29C5 ; [*0BAF.0020.0002] # SQUARED FALLING DIAGONAL SLASH +29C6 ; [*0BB0.0020.0002] # SQUARED ASTERISK +29C7 ; [*0BB1.0020.0002] # SQUARED SMALL CIRCLE +29C8 ; [*0BB2.0020.0002] # SQUARED SQUARE +29C9 ; [*0BB3.0020.0002] # TWO JOINED SQUARES +29CA ; [*0BB4.0020.0002] # TRIANGLE WITH DOT ABOVE +29CB ; [*0BB5.0020.0002] # TRIANGLE WITH UNDERBAR +29CC ; [*0BB6.0020.0002] # S IN TRIANGLE +29CD ; [*0BB7.0020.0002] # TRIANGLE WITH SERIFS AT BOTTOM +29CE ; [*0BB8.0020.0002] # RIGHT TRIANGLE ABOVE LEFT TRIANGLE +29CF ; [*0BB9.0020.0002] # LEFT TRIANGLE BESIDE VERTICAL BAR +29D0 ; [*0BBA.0020.0002] # VERTICAL BAR BESIDE RIGHT TRIANGLE +29D1 ; [*0BBB.0020.0002] # BOWTIE WITH LEFT HALF BLACK +29D2 ; [*0BBC.0020.0002] # BOWTIE WITH RIGHT HALF BLACK +29D3 ; [*0BBD.0020.0002] # BLACK BOWTIE +29D4 ; [*0BBE.0020.0002] # TIMES WITH LEFT HALF BLACK +29D5 ; [*0BBF.0020.0002] # TIMES WITH RIGHT HALF BLACK +29D6 ; [*0BC0.0020.0002] # WHITE HOURGLASS +29D7 ; [*0BC1.0020.0002] # BLACK HOURGLASS +29D8 ; [*0386.0020.0002] # LEFT WIGGLY FENCE +29D9 ; [*0387.0020.0002] # RIGHT WIGGLY FENCE +29DA ; [*0388.0020.0002] # LEFT DOUBLE WIGGLY FENCE +29DB ; [*0389.0020.0002] # RIGHT DOUBLE WIGGLY FENCE +29DC ; [*0BC2.0020.0002] # INCOMPLETE INFINITY +29DD ; [*0BC3.0020.0002] # TIE OVER INFINITY +29DE ; [*0BC4.0020.0002] # INFINITY NEGATED WITH VERTICAL BAR +29DF ; [*0BC5.0020.0002] # DOUBLE-ENDED MULTIMAP +29E0 ; [*0BC6.0020.0002] # SQUARE WITH CONTOURED OUTLINE +29E1 ; [*0BC7.0020.0002] # INCREASES AS +29E2 ; [*0BC8.0020.0002] # SHUFFLE PRODUCT +29E3 ; [*0BC9.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL +29E4 ; [*0BCA.0020.0002] # EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +29E5 ; [*0BCB.0020.0002] # IDENTICAL TO AND SLANTED PARALLEL +29E6 ; [*0BCC.0020.0002] # GLEICH STARK +29E7 ; [*0BCD.0020.0002] # THERMODYNAMIC +29E8 ; [*0BCE.0020.0002] # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +29E9 ; [*0BCF.0020.0002] # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +29EA ; [*0BD0.0020.0002] # BLACK DIAMOND WITH DOWN ARROW +29EB ; [*0BD1.0020.0002] # BLACK LOZENGE +29EC ; [*0BD2.0020.0002] # WHITE CIRCLE WITH DOWN ARROW +29ED ; [*0BD3.0020.0002] # BLACK CIRCLE WITH DOWN ARROW +29EE ; [*0BD4.0020.0002] # ERROR-BARRED WHITE SQUARE +29EF ; [*0BD5.0020.0002] # ERROR-BARRED BLACK SQUARE +29F0 ; [*0BD6.0020.0002] # ERROR-BARRED WHITE DIAMOND +29F1 ; [*0BD7.0020.0002] # ERROR-BARRED BLACK DIAMOND +29F2 ; [*0BD8.0020.0002] # ERROR-BARRED WHITE CIRCLE +29F3 ; [*0BD9.0020.0002] # ERROR-BARRED BLACK CIRCLE +29F4 ; [*0BDA.0020.0002] # RULE-DELAYED +29F5 ; [*0BDB.0020.0002] # REVERSE SOLIDUS OPERATOR +29F6 ; [*0BDC.0020.0002] # SOLIDUS WITH OVERBAR +29F7 ; [*0BDD.0020.0002] # REVERSE SOLIDUS WITH HORIZONTAL STROKE +29F8 ; [*0BDE.0020.0002] # BIG SOLIDUS +29F9 ; [*0BDF.0020.0002] # BIG REVERSE SOLIDUS +29FA ; [*0BE0.0020.0002] # DOUBLE PLUS +29FB ; [*0BE1.0020.0002] # TRIPLE PLUS +29FC ; [*032A.0020.0002] # LEFT-POINTING CURVED ANGLE BRACKET +29FD ; [*032B.0020.0002] # RIGHT-POINTING CURVED ANGLE BRACKET +29FE ; [*0BE2.0020.0002] # TINY +29FF ; [*0BE3.0020.0002] # MINY +2A00 ; [*0BE4.0020.0002] # N-ARY CIRCLED DOT OPERATOR +2A01 ; [*0BE5.0020.0002] # N-ARY CIRCLED PLUS OPERATOR +2A02 ; [*0BE6.0020.0002] # N-ARY CIRCLED TIMES OPERATOR +2A03 ; [*0BE7.0020.0002] # N-ARY UNION OPERATOR WITH DOT +2A04 ; [*0BE8.0020.0002] # N-ARY UNION OPERATOR WITH PLUS +2A05 ; [*0BE9.0020.0002] # N-ARY SQUARE INTERSECTION OPERATOR +2A06 ; [*0BEA.0020.0002] # N-ARY SQUARE UNION OPERATOR +2A07 ; [*0BEB.0020.0002] # TWO LOGICAL AND OPERATOR +2A08 ; [*0BEC.0020.0002] # TWO LOGICAL OR OPERATOR +2A09 ; [*0BED.0020.0002] # N-ARY TIMES OPERATOR +2A0A ; [*0BEE.0020.0002] # MODULO TWO SUM +2A0B ; [*0BEF.0020.0002] # SUMMATION WITH INTEGRAL +2A0C ; [*0652.0020.0004][*0652.0020.0004][*0652.0020.0004][*0652.0020.0004] # QUADRUPLE INTEGRAL OPERATOR +2A0D ; [*0BF0.0020.0002] # FINITE PART INTEGRAL +2A0E ; [*0BF1.0020.0002] # INTEGRAL WITH DOUBLE STROKE +2A0F ; [*0BF2.0020.0002] # INTEGRAL AVERAGE WITH SLASH +2A10 ; [*0BF3.0020.0002] # CIRCULATION FUNCTION +2A11 ; [*0BF4.0020.0002] # ANTICLOCKWISE INTEGRATION +2A12 ; [*0BF5.0020.0002] # LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +2A13 ; [*0BF6.0020.0002] # LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +2A14 ; [*0BF7.0020.0002] # LINE INTEGRATION NOT INCLUDING THE POLE +2A15 ; [*0BF8.0020.0002] # INTEGRAL AROUND A POINT OPERATOR +2A16 ; [*0BF9.0020.0002] # QUATERNION INTEGRAL OPERATOR +2A17 ; [*0BFA.0020.0002] # INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +2A18 ; [*0BFB.0020.0002] # INTEGRAL WITH TIMES SIGN +2A19 ; [*0BFC.0020.0002] # INTEGRAL WITH INTERSECTION +2A1A ; [*0BFD.0020.0002] # INTEGRAL WITH UNION +2A1B ; [*0BFE.0020.0002] # INTEGRAL WITH OVERBAR +2A1C ; [*0BFF.0020.0002] # INTEGRAL WITH UNDERBAR +2A1D ; [*0C00.0020.0002] # JOIN +2A1E ; [*0C01.0020.0002] # LARGE LEFT TRIANGLE OPERATOR +2A1F ; [*0C02.0020.0002] # Z NOTATION SCHEMA COMPOSITION +2A20 ; [*0C03.0020.0002] # Z NOTATION SCHEMA PIPING +2A21 ; [*0C04.0020.0002] # Z NOTATION SCHEMA PROJECTION +2A22 ; [*0C05.0020.0002] # PLUS SIGN WITH SMALL CIRCLE ABOVE +2A23 ; [*0C06.0020.0002] # PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +2A24 ; [*0C07.0020.0002] # PLUS SIGN WITH TILDE ABOVE +2A25 ; [*0C08.0020.0002] # PLUS SIGN WITH DOT BELOW +2A26 ; [*0C09.0020.0002] # PLUS SIGN WITH TILDE BELOW +2A27 ; [*0C0A.0020.0002] # PLUS SIGN WITH SUBSCRIPT TWO +2A28 ; [*0C0B.0020.0002] # PLUS SIGN WITH BLACK TRIANGLE +2A29 ; [*0C0C.0020.0002] # MINUS SIGN WITH COMMA ABOVE +2A2A ; [*0C0D.0020.0002] # MINUS SIGN WITH DOT BELOW +2A2B ; [*0C0E.0020.0002] # MINUS SIGN WITH FALLING DOTS +2A2C ; [*0C0F.0020.0002] # MINUS SIGN WITH RISING DOTS +2A2D ; [*0C10.0020.0002] # PLUS SIGN IN LEFT HALF CIRCLE +2A2E ; [*0C11.0020.0002] # PLUS SIGN IN RIGHT HALF CIRCLE +2A2F ; [*0C12.0020.0002] # VECTOR OR CROSS PRODUCT +2A30 ; [*0C13.0020.0002] # MULTIPLICATION SIGN WITH DOT ABOVE +2A31 ; [*0C14.0020.0002] # MULTIPLICATION SIGN WITH UNDERBAR +2A32 ; [*0C15.0020.0002] # SEMIDIRECT PRODUCT WITH BOTTOM CLOSED +2A33 ; [*0C16.0020.0002] # SMASH PRODUCT +2A34 ; [*0C17.0020.0002] # MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35 ; [*0C18.0020.0002] # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A36 ; [*0C19.0020.0002] # CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +2A37 ; [*0C1A.0020.0002] # MULTIPLICATION SIGN IN DOUBLE CIRCLE +2A38 ; [*0C1B.0020.0002] # CIRCLED DIVISION SIGN +2A39 ; [*0C1C.0020.0002] # PLUS SIGN IN TRIANGLE +2A3A ; [*0C1D.0020.0002] # MINUS SIGN IN TRIANGLE +2A3B ; [*0C1E.0020.0002] # MULTIPLICATION SIGN IN TRIANGLE +2A3C ; [*0C1F.0020.0002] # INTERIOR PRODUCT +2A3D ; [*0C20.0020.0002] # RIGHTHAND INTERIOR PRODUCT +2A3E ; [*0C21.0020.0002] # Z NOTATION RELATIONAL COMPOSITION +2A3F ; [*0C22.0020.0002] # AMALGAMATION OR COPRODUCT +2A40 ; [*0C23.0020.0002] # INTERSECTION WITH DOT +2A41 ; [*0C24.0020.0002] # UNION WITH MINUS SIGN +2A42 ; [*0C25.0020.0002] # UNION WITH OVERBAR +2A43 ; [*0C26.0020.0002] # INTERSECTION WITH OVERBAR +2A44 ; [*0C27.0020.0002] # INTERSECTION WITH LOGICAL AND +2A45 ; [*0C28.0020.0002] # UNION WITH LOGICAL OR +2A46 ; [*0C29.0020.0002] # UNION ABOVE INTERSECTION +2A47 ; [*0C2A.0020.0002] # INTERSECTION ABOVE UNION +2A48 ; [*0C2B.0020.0002] # UNION ABOVE BAR ABOVE INTERSECTION +2A49 ; [*0C2C.0020.0002] # INTERSECTION ABOVE BAR ABOVE UNION +2A4A ; [*0C2D.0020.0002] # UNION BESIDE AND JOINED WITH UNION +2A4B ; [*0C2E.0020.0002] # INTERSECTION BESIDE AND JOINED WITH INTERSECTION +2A4C ; [*0C2F.0020.0002] # CLOSED UNION WITH SERIFS +2A4D ; [*0C30.0020.0002] # CLOSED INTERSECTION WITH SERIFS +2A4E ; [*0C31.0020.0002] # DOUBLE SQUARE INTERSECTION +2A4F ; [*0C32.0020.0002] # DOUBLE SQUARE UNION +2A50 ; [*0C33.0020.0002] # CLOSED UNION WITH SERIFS AND SMASH PRODUCT +2A51 ; [*0C34.0020.0002] # LOGICAL AND WITH DOT ABOVE +2A52 ; [*0C35.0020.0002] # LOGICAL OR WITH DOT ABOVE +2A53 ; [*0C36.0020.0002] # DOUBLE LOGICAL AND +2A54 ; [*0C37.0020.0002] # DOUBLE LOGICAL OR +2A55 ; [*0C38.0020.0002] # TWO INTERSECTING LOGICAL AND +2A56 ; [*0C39.0020.0002] # TWO INTERSECTING LOGICAL OR +2A57 ; [*0C3A.0020.0002] # SLOPING LARGE OR +2A58 ; [*0C3B.0020.0002] # SLOPING LARGE AND +2A59 ; [*0C3C.0020.0002] # LOGICAL OR OVERLAPPING LOGICAL AND +2A5A ; [*0C3D.0020.0002] # LOGICAL AND WITH MIDDLE STEM +2A5B ; [*0C3E.0020.0002] # LOGICAL OR WITH MIDDLE STEM +2A5C ; [*0C3F.0020.0002] # LOGICAL AND WITH HORIZONTAL DASH +2A5D ; [*0C40.0020.0002] # LOGICAL OR WITH HORIZONTAL DASH +2A5E ; [*0C41.0020.0002] # LOGICAL AND WITH DOUBLE OVERBAR +2A5F ; [*0C42.0020.0002] # LOGICAL AND WITH UNDERBAR +2A60 ; [*0C43.0020.0002] # LOGICAL AND WITH DOUBLE UNDERBAR +2A61 ; [*0C44.0020.0002] # SMALL VEE WITH UNDERBAR +2A62 ; [*0C45.0020.0002] # LOGICAL OR WITH DOUBLE OVERBAR +2A63 ; [*0C46.0020.0002] # LOGICAL OR WITH DOUBLE UNDERBAR +2A64 ; [*0C47.0020.0002] # Z NOTATION DOMAIN ANTIRESTRICTION +2A65 ; [*0C48.0020.0002] # Z NOTATION RANGE ANTIRESTRICTION +2A66 ; [*0C49.0020.0002] # EQUALS SIGN WITH DOT BELOW +2A67 ; [*0C4A.0020.0002] # IDENTICAL WITH DOT ABOVE +2A68 ; [*0C4B.0020.0002] # TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE +2A69 ; [*0C4C.0020.0002] # TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE +2A6A ; [*0C4D.0020.0002] # TILDE OPERATOR WITH DOT ABOVE +2A6B ; [*0C4E.0020.0002] # TILDE OPERATOR WITH RISING DOTS +2A6C ; [*0C4F.0020.0002] # SIMILAR MINUS SIMILAR +2A6D ; [*0C50.0020.0002] # CONGRUENT WITH DOT ABOVE +2A6E ; [*0C51.0020.0002] # EQUALS WITH ASTERISK +2A6F ; [*0C52.0020.0002] # ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +2A70 ; [*0C53.0020.0002] # APPROXIMATELY EQUAL OR EQUAL TO +2A71 ; [*0C54.0020.0002] # EQUALS SIGN ABOVE PLUS SIGN +2A72 ; [*0C55.0020.0002] # PLUS SIGN ABOVE EQUALS SIGN +2A73 ; [*0C56.0020.0002] # EQUALS SIGN ABOVE TILDE OPERATOR +2A74 ; [*023A.0020.0004][*023A.0020.0004][*0631.0020.0004] # DOUBLE COLON EQUAL +2A75 ; [*0631.0020.0004][*0631.0020.0004] # TWO CONSECUTIVE EQUALS SIGNS +2A76 ; [*0631.0020.0004][*0631.0020.0004][*0631.0020.0004] # THREE CONSECUTIVE EQUALS SIGNS +2A77 ; [*0C57.0020.0002] # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +2A78 ; [*0C58.0020.0002] # EQUIVALENT WITH FOUR DOTS ABOVE +2A79 ; [*0C59.0020.0002] # LESS-THAN WITH CIRCLE INSIDE +2A7A ; [*0C5A.0020.0002] # GREATER-THAN WITH CIRCLE INSIDE +2A7B ; [*0C5B.0020.0002] # LESS-THAN WITH QUESTION MARK ABOVE +2A7C ; [*0C5C.0020.0002] # GREATER-THAN WITH QUESTION MARK ABOVE +2A7D ; [*0C5D.0020.0002] # LESS-THAN OR SLANTED EQUAL TO +2A7E ; [*0C5E.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO +2A7F ; [*0C5F.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80 ; [*0C60.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81 ; [*0C61.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82 ; [*0C62.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83 ; [*0C63.0020.0002] # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84 ; [*0C64.0020.0002] # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A85 ; [*0C65.0020.0002] # LESS-THAN OR APPROXIMATE +2A86 ; [*0C66.0020.0002] # GREATER-THAN OR APPROXIMATE +2A87 ; [*0C67.0020.0002] # LESS-THAN AND SINGLE-LINE NOT EQUAL TO +2A88 ; [*0C68.0020.0002] # GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +2A89 ; [*0C69.0020.0002] # LESS-THAN AND NOT APPROXIMATE +2A8A ; [*0C6A.0020.0002] # GREATER-THAN AND NOT APPROXIMATE +2A8B ; [*0C6B.0020.0002] # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +2A8C ; [*0C6C.0020.0002] # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +2A8D ; [*0C6D.0020.0002] # LESS-THAN ABOVE SIMILAR OR EQUAL +2A8E ; [*0C6E.0020.0002] # GREATER-THAN ABOVE SIMILAR OR EQUAL +2A8F ; [*0C6F.0020.0002] # LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +2A90 ; [*0C70.0020.0002] # GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +2A91 ; [*0C71.0020.0002] # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92 ; [*0C72.0020.0002] # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93 ; [*0C73.0020.0002] # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94 ; [*0C74.0020.0002] # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95 ; [*0C75.0020.0002] # SLANTED EQUAL TO OR LESS-THAN +2A96 ; [*0C76.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN +2A97 ; [*0C77.0020.0002] # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98 ; [*0C78.0020.0002] # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99 ; [*0C79.0020.0002] # DOUBLE-LINE EQUAL TO OR LESS-THAN +2A9A ; [*0C7A.0020.0002] # DOUBLE-LINE EQUAL TO OR GREATER-THAN +2A9B ; [*0C7B.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C ; [*0C7C.0020.0002] # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2A9D ; [*0C7D.0020.0002] # SIMILAR OR LESS-THAN +2A9E ; [*0C7E.0020.0002] # SIMILAR OR GREATER-THAN +2A9F ; [*0C7F.0020.0002] # SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +2AA0 ; [*0C80.0020.0002] # SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +2AA1 ; [*0C81.0020.0002] # DOUBLE NESTED LESS-THAN +2AA2 ; [*0C82.0020.0002] # DOUBLE NESTED GREATER-THAN +2AA3 ; [*0C83.0020.0002] # DOUBLE NESTED LESS-THAN WITH UNDERBAR +2AA4 ; [*0C84.0020.0002] # GREATER-THAN OVERLAPPING LESS-THAN +2AA5 ; [*0C85.0020.0002] # GREATER-THAN BESIDE LESS-THAN +2AA6 ; [*0C86.0020.0002] # LESS-THAN CLOSED BY CURVE +2AA7 ; [*0C87.0020.0002] # GREATER-THAN CLOSED BY CURVE +2AA8 ; [*0C88.0020.0002] # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9 ; [*0C89.0020.0002] # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA ; [*0C8A.0020.0002] # SMALLER THAN +2AAB ; [*0C8B.0020.0002] # LARGER THAN +2AAC ; [*0C8C.0020.0002] # SMALLER THAN OR EQUAL TO +2AAD ; [*0C8D.0020.0002] # LARGER THAN OR EQUAL TO +2AAE ; [*0C8E.0020.0002] # EQUALS SIGN WITH BUMPY ABOVE +2AAF ; [*0C8F.0020.0002] # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +2AB0 ; [*0C90.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +2AB1 ; [*0C91.0020.0002] # PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +2AB2 ; [*0C92.0020.0002] # SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +2AB3 ; [*0C93.0020.0002] # PRECEDES ABOVE EQUALS SIGN +2AB4 ; [*0C94.0020.0002] # SUCCEEDS ABOVE EQUALS SIGN +2AB5 ; [*0C95.0020.0002] # PRECEDES ABOVE NOT EQUAL TO +2AB6 ; [*0C96.0020.0002] # SUCCEEDS ABOVE NOT EQUAL TO +2AB7 ; [*0C97.0020.0002] # PRECEDES ABOVE ALMOST EQUAL TO +2AB8 ; [*0C98.0020.0002] # SUCCEEDS ABOVE ALMOST EQUAL TO +2AB9 ; [*0C99.0020.0002] # PRECEDES ABOVE NOT ALMOST EQUAL TO +2ABA ; [*0C9A.0020.0002] # SUCCEEDS ABOVE NOT ALMOST EQUAL TO +2ABB ; [*0C9B.0020.0002] # DOUBLE PRECEDES +2ABC ; [*0C9C.0020.0002] # DOUBLE SUCCEEDS +2ABD ; [*0C9D.0020.0002] # SUBSET WITH DOT +2ABE ; [*0C9E.0020.0002] # SUPERSET WITH DOT +2ABF ; [*0C9F.0020.0002] # SUBSET WITH PLUS SIGN BELOW +2AC0 ; [*0CA0.0020.0002] # SUPERSET WITH PLUS SIGN BELOW +2AC1 ; [*0CA1.0020.0002] # SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2 ; [*0CA2.0020.0002] # SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3 ; [*0CA3.0020.0002] # SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4 ; [*0CA4.0020.0002] # SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5 ; [*0CA5.0020.0002] # SUBSET OF ABOVE EQUALS SIGN +2AC6 ; [*0CA6.0020.0002] # SUPERSET OF ABOVE EQUALS SIGN +2AC7 ; [*0CA7.0020.0002] # SUBSET OF ABOVE TILDE OPERATOR +2AC8 ; [*0CA8.0020.0002] # SUPERSET OF ABOVE TILDE OPERATOR +2AC9 ; [*0CA9.0020.0002] # SUBSET OF ABOVE ALMOST EQUAL TO +2ACA ; [*0CAA.0020.0002] # SUPERSET OF ABOVE ALMOST EQUAL TO +2ACB ; [*0CAB.0020.0002] # SUBSET OF ABOVE NOT EQUAL TO +2ACC ; [*0CAC.0020.0002] # SUPERSET OF ABOVE NOT EQUAL TO +2ACD ; [*0CAD.0020.0002] # SQUARE LEFT OPEN BOX OPERATOR +2ACE ; [*0CAE.0020.0002] # SQUARE RIGHT OPEN BOX OPERATOR +2ACF ; [*0CAF.0020.0002] # CLOSED SUBSET +2AD0 ; [*0CB0.0020.0002] # CLOSED SUPERSET +2AD1 ; [*0CB1.0020.0002] # CLOSED SUBSET OR EQUAL TO +2AD2 ; [*0CB2.0020.0002] # CLOSED SUPERSET OR EQUAL TO +2AD3 ; [*0CB3.0020.0002] # SUBSET ABOVE SUPERSET +2AD4 ; [*0CB4.0020.0002] # SUPERSET ABOVE SUBSET +2AD5 ; [*0CB5.0020.0002] # SUBSET ABOVE SUBSET +2AD6 ; [*0CB6.0020.0002] # SUPERSET ABOVE SUPERSET +2AD7 ; [*0CB7.0020.0002] # SUPERSET BESIDE SUBSET +2AD8 ; [*0CB8.0020.0002] # SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +2AD9 ; [*0CB9.0020.0002] # ELEMENT OF OPENING DOWNWARDS +2ADA ; [*0CBA.0020.0002] # PITCHFORK WITH TEE TOP +2ADB ; [*0CBB.0020.0002] # TRANSVERSAL INTERSECTION +2ADC ; [*0CBC.0020.0002][.0000.002F.0002] # FORKING +2ADD ; [*0CBC.0020.0002] # NONFORKING +2ADE ; [*0CBD.0020.0002] # SHORT LEFT TACK +2ADF ; [*0CBE.0020.0002] # SHORT DOWN TACK +2AE0 ; [*0CBF.0020.0002] # SHORT UP TACK +2AE1 ; [*0CC0.0020.0002] # PERPENDICULAR WITH S +2AE2 ; [*0CC1.0020.0002] # VERTICAL BAR TRIPLE RIGHT TURNSTILE +2AE3 ; [*0CC2.0020.0002] # DOUBLE VERTICAL BAR LEFT TURNSTILE +2AE4 ; [*0CC3.0020.0002] # VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE5 ; [*0CC4.0020.0002] # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE6 ; [*0CC5.0020.0002] # LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +2AE7 ; [*0CC6.0020.0002] # SHORT DOWN TACK WITH OVERBAR +2AE8 ; [*0CC7.0020.0002] # SHORT UP TACK WITH UNDERBAR +2AE9 ; [*0CC8.0020.0002] # SHORT UP TACK ABOVE SHORT DOWN TACK +2AEA ; [*0CC9.0020.0002] # DOUBLE DOWN TACK +2AEB ; [*0CCA.0020.0002] # DOUBLE UP TACK +2AEC ; [*0CCB.0020.0002] # DOUBLE STROKE NOT SIGN +2AED ; [*0CCC.0020.0002] # REVERSED DOUBLE STROKE NOT SIGN +2AEE ; [*0CCD.0020.0002] # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +2AEF ; [*0CCE.0020.0002] # VERTICAL LINE WITH CIRCLE ABOVE +2AF0 ; [*0CCF.0020.0002] # VERTICAL LINE WITH CIRCLE BELOW +2AF1 ; [*0CD0.0020.0002] # DOWN TACK WITH CIRCLE BELOW +2AF2 ; [*0CD1.0020.0002] # PARALLEL WITH HORIZONTAL STROKE +2AF3 ; [*0CD2.0020.0002] # PARALLEL WITH TILDE OPERATOR +2AF4 ; [*0CD3.0020.0002] # TRIPLE VERTICAL BAR BINARY RELATION +2AF5 ; [*0CD4.0020.0002] # TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE +2AF6 ; [*0CD5.0020.0002] # TRIPLE COLON OPERATOR +2AF7 ; [*0CD6.0020.0002] # TRIPLE NESTED LESS-THAN +2AF8 ; [*0CD7.0020.0002] # TRIPLE NESTED GREATER-THAN +2AF9 ; [*0CD8.0020.0002] # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +2AFA ; [*0CD9.0020.0002] # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +2AFB ; [*0CDA.0020.0002] # TRIPLE SOLIDUS BINARY RELATION +2AFC ; [*0CDB.0020.0002] # LARGE TRIPLE VERTICAL BAR OPERATOR +2AFD ; [*0CDC.0020.0002] # DOUBLE SOLIDUS OPERATOR +2AFE ; [*0CDD.0020.0002] # WHITE VERTICAL BAR +2AFF ; [*0CDE.0020.0002] # N-ARY WHITE VERTICAL BAR +2B00 ; [*0CDF.0020.0002] # NORTH EAST WHITE ARROW +2B01 ; [*0CE0.0020.0002] # NORTH WEST WHITE ARROW +2B02 ; [*0CE1.0020.0002] # SOUTH EAST WHITE ARROW +2B03 ; [*0CE2.0020.0002] # SOUTH WEST WHITE ARROW +2B04 ; [*0CE3.0020.0002] # LEFT RIGHT WHITE ARROW +2B05 ; [*0CE4.0020.0002] # LEFTWARDS BLACK ARROW +2B06 ; [*0CE5.0020.0002] # UPWARDS BLACK ARROW +2B07 ; [*0CE6.0020.0002] # DOWNWARDS BLACK ARROW +2B08 ; [*0CE7.0020.0002] # NORTH EAST BLACK ARROW +2B09 ; [*0CE8.0020.0002] # NORTH WEST BLACK ARROW +2B0A ; [*0CE9.0020.0002] # SOUTH EAST BLACK ARROW +2B0B ; [*0CEA.0020.0002] # SOUTH WEST BLACK ARROW +2B0C ; [*0CEB.0020.0002] # LEFT RIGHT BLACK ARROW +2B0D ; [*0CEC.0020.0002] # UP DOWN BLACK ARROW +2B0E ; [*0CED.0020.0002] # RIGHTWARDS ARROW WITH TIP DOWNWARDS +2B0F ; [*0CEE.0020.0002] # RIGHTWARDS ARROW WITH TIP UPWARDS +2B10 ; [*0CEF.0020.0002] # LEFTWARDS ARROW WITH TIP DOWNWARDS +2B11 ; [*0CF0.0020.0002] # LEFTWARDS ARROW WITH TIP UPWARDS +2B12 ; [*0CF1.0020.0002] # SQUARE WITH TOP HALF BLACK +2B13 ; [*0CF2.0020.0002] # SQUARE WITH BOTTOM HALF BLACK +2B14 ; [*0CF3.0020.0002] # SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK +2B15 ; [*0CF4.0020.0002] # SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK +2B16 ; [*0CF5.0020.0002] # DIAMOND WITH LEFT HALF BLACK +2B17 ; [*0CF6.0020.0002] # DIAMOND WITH RIGHT HALF BLACK +2B18 ; [*0CF7.0020.0002] # DIAMOND WITH TOP HALF BLACK +2B19 ; [*0CF8.0020.0002] # DIAMOND WITH BOTTOM HALF BLACK +2B1A ; [*0CF9.0020.0002] # DOTTED SQUARE +2B1B ; [*0CFA.0020.0002] # BLACK LARGE SQUARE +2B1C ; [*0CFB.0020.0002] # WHITE LARGE SQUARE +2B1D ; [*0CFC.0020.0002] # BLACK VERY SMALL SQUARE +2B1E ; [*0CFD.0020.0002] # WHITE VERY SMALL SQUARE +2B1F ; [*0CFE.0020.0002] # BLACK PENTAGON +2B20 ; [*0CFF.0020.0002] # WHITE PENTAGON +2B21 ; [*0D00.0020.0002] # WHITE HEXAGON +2B22 ; [*0D01.0020.0002] # BLACK HEXAGON +2B23 ; [*0D02.0020.0002] # HORIZONTAL BLACK HEXAGON +2B24 ; [*0D03.0020.0002] # BLACK LARGE CIRCLE +2B25 ; [*0D04.0020.0002] # BLACK MEDIUM DIAMOND +2B26 ; [*0D05.0020.0002] # WHITE MEDIUM DIAMOND +2B27 ; [*0D06.0020.0002] # BLACK MEDIUM LOZENGE +2B28 ; [*0D07.0020.0002] # WHITE MEDIUM LOZENGE +2B29 ; [*0D08.0020.0002] # BLACK SMALL DIAMOND +2B2A ; [*0D09.0020.0002] # BLACK SMALL LOZENGE +2B2B ; [*0D0A.0020.0002] # WHITE SMALL LOZENGE +2B2C ; [*0D0B.0020.0002] # BLACK HORIZONTAL ELLIPSE +2B2D ; [*0D0C.0020.0002] # WHITE HORIZONTAL ELLIPSE +2B2E ; [*0D0D.0020.0002] # BLACK VERTICAL ELLIPSE +2B2F ; [*0D0E.0020.0002] # WHITE VERTICAL ELLIPSE +2B30 ; [*0D0F.0020.0002] # LEFT ARROW WITH SMALL CIRCLE +2B31 ; [*0D10.0020.0002] # THREE LEFTWARDS ARROWS +2B32 ; [*0D11.0020.0002] # LEFT ARROW WITH CIRCLED PLUS +2B33 ; [*0D12.0020.0002] # LONG LEFTWARDS SQUIGGLE ARROW +2B34 ; [*0D13.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +2B35 ; [*0D14.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +2B36 ; [*0D15.0020.0002] # LEFTWARDS TWO-HEADED ARROW FROM BAR +2B37 ; [*0D16.0020.0002] # LEFTWARDS TWO-HEADED TRIPLE DASH ARROW +2B38 ; [*0D17.0020.0002] # LEFTWARDS ARROW WITH DOTTED STEM +2B39 ; [*0D18.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +2B3A ; [*0D19.0020.0002] # LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2B3B ; [*0D1A.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL +2B3C ; [*0D1B.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +2B3D ; [*0D1C.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +2B3E ; [*0D1D.0020.0002] # LEFTWARDS ARROW THROUGH X +2B3F ; [*0D1E.0020.0002] # WAVE ARROW POINTING DIRECTLY LEFT +2B40 ; [*0D1F.0020.0002] # EQUALS SIGN ABOVE LEFTWARDS ARROW +2B41 ; [*0D20.0020.0002] # REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW +2B42 ; [*0D21.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO +2B43 ; [*0D22.0020.0002] # RIGHTWARDS ARROW THROUGH GREATER-THAN +2B44 ; [*0D23.0020.0002] # RIGHTWARDS ARROW THROUGH SUPERSET +2B45 ; [*0D24.0020.0002] # LEFTWARDS QUADRUPLE ARROW +2B46 ; [*0D25.0020.0002] # RIGHTWARDS QUADRUPLE ARROW +2B47 ; [*0D26.0020.0002] # REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW +2B48 ; [*0D27.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO +2B49 ; [*0D28.0020.0002] # TILDE OPERATOR ABOVE LEFTWARDS ARROW +2B4A ; [*0D29.0020.0002] # LEFTWARDS ARROW ABOVE ALMOST EQUAL TO +2B4B ; [*0D2A.0020.0002] # LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4C ; [*0D2B.0020.0002] # RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D ; [*0D2C.0020.0002] # DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW +2B4E ; [*0D2D.0020.0002] # SHORT SLANTED NORTH ARROW +2B4F ; [*0D2E.0020.0002] # SHORT BACKSLANTED SOUTH ARROW +2B50 ; [*0D2F.0020.0002] # WHITE MEDIUM STAR +2B51 ; [*0D30.0020.0002] # BLACK SMALL STAR +2B52 ; [*0D31.0020.0002] # WHITE SMALL STAR +2B53 ; [*0D32.0020.0002] # BLACK RIGHT-POINTING PENTAGON +2B54 ; [*0D33.0020.0002] # WHITE RIGHT-POINTING PENTAGON +2B55 ; [*0D34.0020.0002] # HEAVY LARGE CIRCLE +2B56 ; [*0D35.0020.0002] # HEAVY OVAL WITH OVAL INSIDE +2B57 ; [*0D36.0020.0002] # HEAVY CIRCLE WITH CIRCLE INSIDE +2B58 ; [*0D37.0020.0002] # HEAVY CIRCLE +2B59 ; [*0D38.0020.0002] # HEAVY CIRCLED SALTIRE +2B5A ; [*0D39.0020.0002] # SLANTED NORTH ARROW WITH HOOKED HEAD +2B5B ; [*0D3A.0020.0002] # BACKSLANTED SOUTH ARROW WITH HOOKED TAIL +2B5C ; [*0D3B.0020.0002] # SLANTED NORTH ARROW WITH HORIZONTAL TAIL +2B5D ; [*0D3C.0020.0002] # BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL +2B5E ; [*0D3D.0020.0002] # BENT ARROW POINTING DOWNWARDS THEN NORTH EAST +2B5F ; [*0D3E.0020.0002] # SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST +2B60 ; [*0D3F.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW +2B61 ; [*0D40.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW +2B62 ; [*0D41.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW +2B63 ; [*0D42.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW +2B64 ; [*0D43.0020.0002] # LEFT RIGHT TRIANGLE-HEADED ARROW +2B65 ; [*0D44.0020.0002] # UP DOWN TRIANGLE-HEADED ARROW +2B66 ; [*0D45.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW +2B67 ; [*0D46.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW +2B68 ; [*0D47.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW +2B69 ; [*0D48.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW +2B6A ; [*0D49.0020.0002] # LEFTWARDS TRIANGLE-HEADED DASHED ARROW +2B6B ; [*0D4A.0020.0002] # UPWARDS TRIANGLE-HEADED DASHED ARROW +2B6C ; [*0D4B.0020.0002] # RIGHTWARDS TRIANGLE-HEADED DASHED ARROW +2B6D ; [*0D4C.0020.0002] # DOWNWARDS TRIANGLE-HEADED DASHED ARROW +2B6E ; [*0D4D.0020.0002] # CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW +2B6F ; [*0D4E.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW +2B70 ; [*0D4F.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW TO BAR +2B71 ; [*0D50.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW TO BAR +2B72 ; [*0D51.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR +2B73 ; [*0D52.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76 ; [*0D53.0020.0002] # NORTH WEST TRIANGLE-HEADED ARROW TO BAR +2B77 ; [*0D54.0020.0002] # NORTH EAST TRIANGLE-HEADED ARROW TO BAR +2B78 ; [*0D55.0020.0002] # SOUTH EAST TRIANGLE-HEADED ARROW TO BAR +2B79 ; [*0D56.0020.0002] # SOUTH WEST TRIANGLE-HEADED ARROW TO BAR +2B7A ; [*0D57.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7B ; [*0D58.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7C ; [*0D59.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7D ; [*0D5A.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +2B7E ; [*0D5B.0020.0002] # HORIZONTAL TAB KEY +2B7F ; [*0D5C.0020.0002] # VERTICAL TAB KEY +2B80 ; [*0D5D.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW +2B81 ; [*0D5E.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW +2B82 ; [*0D5F.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW +2B83 ; [*0D60.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW +2B84 ; [*0D61.0020.0002] # LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS +2B85 ; [*0D62.0020.0002] # UPWARDS TRIANGLE-HEADED PAIRED ARROWS +2B86 ; [*0D63.0020.0002] # RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS +2B87 ; [*0D64.0020.0002] # DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS +2B88 ; [*0D65.0020.0002] # LEFTWARDS BLACK CIRCLED WHITE ARROW +2B89 ; [*0D66.0020.0002] # UPWARDS BLACK CIRCLED WHITE ARROW +2B8A ; [*0D67.0020.0002] # RIGHTWARDS BLACK CIRCLED WHITE ARROW +2B8B ; [*0D68.0020.0002] # DOWNWARDS BLACK CIRCLED WHITE ARROW +2B8C ; [*0D69.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW +2B8D ; [*0D6A.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW +2B8E ; [*0D6B.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW +2B8F ; [*0D6C.0020.0002] # ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW +2B90 ; [*0D6D.0020.0002] # RETURN LEFT +2B91 ; [*0D6E.0020.0002] # RETURN RIGHT +2B92 ; [*0D6F.0020.0002] # NEWLINE LEFT +2B93 ; [*0D70.0020.0002] # NEWLINE RIGHT +2B94 ; [*0D71.0020.0002] # FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE +2B95 ; [*0D72.0020.0002] # RIGHTWARDS BLACK ARROW +2B98 ; [*0D73.0020.0002] # THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD +2B99 ; [*0D74.0020.0002] # THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD +2B9A ; [*0D75.0020.0002] # THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD +2B9B ; [*0D76.0020.0002] # THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD +2B9C ; [*0D77.0020.0002] # BLACK LEFTWARDS EQUILATERAL ARROWHEAD +2B9D ; [*0D78.0020.0002] # BLACK UPWARDS EQUILATERAL ARROWHEAD +2B9E ; [*0D79.0020.0002] # BLACK RIGHTWARDS EQUILATERAL ARROWHEAD +2B9F ; [*0D7A.0020.0002] # BLACK DOWNWARDS EQUILATERAL ARROWHEAD +2BA0 ; [*0D7B.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS +2BA1 ; [*0D7C.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS +2BA2 ; [*0D7D.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS +2BA3 ; [*0D7E.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS +2BA4 ; [*0D7F.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS +2BA5 ; [*0D80.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS +2BA6 ; [*0D81.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS +2BA7 ; [*0D82.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS +2BA8 ; [*0D83.0020.0002] # BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW +2BA9 ; [*0D84.0020.0002] # BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +2BAA ; [*0D85.0020.0002] # BLACK CURVED UPWARDS AND LEFTWARDS ARROW +2BAB ; [*0D86.0020.0002] # BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +2BAC ; [*0D87.0020.0002] # BLACK CURVED LEFTWARDS AND UPWARDS ARROW +2BAD ; [*0D88.0020.0002] # BLACK CURVED RIGHTWARDS AND UPWARDS ARROW +2BAE ; [*0D89.0020.0002] # BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW +2BAF ; [*0D8A.0020.0002] # BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW +2BB0 ; [*0D8B.0020.0002] # RIBBON ARROW DOWN LEFT +2BB1 ; [*0D8C.0020.0002] # RIBBON ARROW DOWN RIGHT +2BB2 ; [*0D8D.0020.0002] # RIBBON ARROW UP LEFT +2BB3 ; [*0D8E.0020.0002] # RIBBON ARROW UP RIGHT +2BB4 ; [*0D8F.0020.0002] # RIBBON ARROW LEFT UP +2BB5 ; [*0D90.0020.0002] # RIBBON ARROW RIGHT UP +2BB6 ; [*0D91.0020.0002] # RIBBON ARROW LEFT DOWN +2BB7 ; [*0D92.0020.0002] # RIBBON ARROW RIGHT DOWN +2BB8 ; [*0D93.0020.0002] # UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR +2BB9 ; [*0D94.0020.0002] # UP ARROWHEAD IN A RECTANGLE BOX +2BBD ; [*0D95.0020.0002] # BALLOT BOX WITH LIGHT X +2BBE ; [*0D96.0020.0002] # CIRCLED X +2BBF ; [*0D97.0020.0002] # CIRCLED BOLD X +2BC0 ; [*0D98.0020.0002] # BLACK SQUARE CENTRED +2BC1 ; [*0D99.0020.0002] # BLACK DIAMOND CENTRED +2BC2 ; [*0D9A.0020.0002] # TURNED BLACK PENTAGON +2BC3 ; [*0D9B.0020.0002] # HORIZONTAL BLACK OCTAGON +2BC4 ; [*0D9C.0020.0002] # BLACK OCTAGON +2BC5 ; [*0D9D.0020.0002] # BLACK MEDIUM UP-POINTING TRIANGLE CENTRED +2BC6 ; [*0D9E.0020.0002] # BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED +2BC7 ; [*0D9F.0020.0002] # BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED +2BC8 ; [*0DA0.0020.0002] # BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +2BCA ; [*0DA1.0020.0002] # TOP HALF BLACK CIRCLE +2BCB ; [*0DA2.0020.0002] # BOTTOM HALF BLACK CIRCLE +2BCC ; [*0DA3.0020.0002] # LIGHT FOUR POINTED BLACK CUSP +2BCD ; [*0DA4.0020.0002] # ROTATED LIGHT FOUR POINTED BLACK CUSP +2BCE ; [*0DA5.0020.0002] # WHITE FOUR POINTED CUSP +2BCF ; [*0DA6.0020.0002] # ROTATED WHITE FOUR POINTED CUSP +2BD0 ; [*0DA7.0020.0002] # SQUARE POSITION INDICATOR +2BD1 ; [*0DA8.0020.0002] # UNCERTAINTY SIGN +2BD2 ; [*0DA9.0020.0002] # GROUP MARK +2BEC ; [*0DAA.0020.0002] # LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BED ; [*0DAB.0020.0002] # UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BEE ; [*0DAC.0020.0002] # RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BEF ; [*0DAD.0020.0002] # DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2CE5 ; [*0DAE.0020.0002] # COPTIC SYMBOL MI RO +2CE6 ; [*0DAF.0020.0002] # COPTIC SYMBOL PI RO +2CE7 ; [*0DB0.0020.0002] # COPTIC SYMBOL STAUROS +2CE8 ; [*0DB1.0020.0002] # COPTIC SYMBOL TAU RO +2CE9 ; [*0DB2.0020.0002] # COPTIC SYMBOL KHI RO +2CEA ; [*0DB3.0020.0002] # COPTIC SYMBOL SHIMA SIMA +2CF9 ; [*0282.0020.0002] # COPTIC OLD NUBIAN FULL STOP +2CFA ; [*026F.0020.0002] # COPTIC OLD NUBIAN DIRECT QUESTION MARK +2CFB ; [*0270.0020.0002] # COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2CFC ; [*02F7.0020.0002] # COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; [*1B46.0020.0002] # COPTIC FRACTION ONE HALF +2CFE ; [*0283.0020.0002] # COPTIC FULL STOP +2CFF ; [*02F8.0020.0002] # COPTIC MORPHOLOGICAL DIVIDER +2D70 ; [*043D.0020.0002] # TIFINAGH SEPARATOR MARK 2D7F ; [.0000.0000.0000] # TIFINAGH CONSONANT JOINER -2E00 ; [*03B6.0020.0002] # RIGHT ANGLE SUBSTITUTION MARKER -2E01 ; [*03B7.0020.0002] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER -2E02 ; [*035B.0020.0002] # LEFT SUBSTITUTION BRACKET -2E03 ; [*035C.0020.0002] # RIGHT SUBSTITUTION BRACKET -2E04 ; [*035D.0020.0002] # LEFT DOTTED SUBSTITUTION BRACKET -2E05 ; [*035E.0020.0002] # RIGHT DOTTED SUBSTITUTION BRACKET -2E06 ; [*03B8.0020.0002] # RAISED INTERPOLATION MARKER -2E07 ; [*03B9.0020.0002] # RAISED DOTTED INTERPOLATION MARKER -2E08 ; [*03BA.0020.0002] # DOTTED TRANSPOSITION MARKER -2E09 ; [*035F.0020.0002] # LEFT TRANSPOSITION BRACKET -2E0A ; [*0360.0020.0002] # RIGHT TRANSPOSITION BRACKET -2E0B ; [*03BB.0020.0002] # RAISED SQUARE -2E0C ; [*0361.0020.0002] # LEFT RAISED OMISSION BRACKET -2E0D ; [*0362.0020.0002] # RIGHT RAISED OMISSION BRACKET -2E0E ; [*03BC.0020.0002] # EDITORIAL CORONIS -2E0F ; [*03BD.0020.0002] # PARAGRAPHOS -2E10 ; [*03BE.0020.0002] # FORKED PARAGRAPHOS -2E11 ; [*03BF.0020.0002] # REVERSED FORKED PARAGRAPHOS -2E12 ; [*03C0.0020.0002] # HYPODIASTOLE -2E13 ; [*03C1.0020.0002] # DOTTED OBELOS -2E14 ; [*03C2.0020.0002] # DOWNWARDS ANCORA -2E15 ; [*03C3.0020.0002] # UPWARDS ANCORA -2E16 ; [*03C4.0020.0002] # DOTTED RIGHT-POINTING ANGLE +2E00 ; [*03B7.0020.0002] # RIGHT ANGLE SUBSTITUTION MARKER +2E01 ; [*03B8.0020.0002] # RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; [*035C.0020.0002] # LEFT SUBSTITUTION BRACKET +2E03 ; [*035D.0020.0002] # RIGHT SUBSTITUTION BRACKET +2E04 ; [*035E.0020.0002] # LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; [*035F.0020.0002] # RIGHT DOTTED SUBSTITUTION BRACKET +2E06 ; [*03B9.0020.0002] # RAISED INTERPOLATION MARKER +2E07 ; [*03BA.0020.0002] # RAISED DOTTED INTERPOLATION MARKER +2E08 ; [*03BB.0020.0002] # DOTTED TRANSPOSITION MARKER +2E09 ; [*0360.0020.0002] # LEFT TRANSPOSITION BRACKET +2E0A ; [*0361.0020.0002] # RIGHT TRANSPOSITION BRACKET +2E0B ; [*03BC.0020.0002] # RAISED SQUARE +2E0C ; [*0362.0020.0002] # LEFT RAISED OMISSION BRACKET +2E0D ; [*0363.0020.0002] # RIGHT RAISED OMISSION BRACKET +2E0E ; [*03BD.0020.0002] # EDITORIAL CORONIS +2E0F ; [*03BE.0020.0002] # PARAGRAPHOS +2E10 ; [*03BF.0020.0002] # FORKED PARAGRAPHOS +2E11 ; [*03C0.0020.0002] # REVERSED FORKED PARAGRAPHOS +2E12 ; [*03C1.0020.0002] # HYPODIASTOLE +2E13 ; [*03C2.0020.0002] # DOTTED OBELOS +2E14 ; [*03C3.0020.0002] # DOWNWARDS ANCORA +2E15 ; [*03C4.0020.0002] # UPWARDS ANCORA +2E16 ; [*03C5.0020.0002] # DOTTED RIGHT-POINTING ANGLE 2E17 ; [*021C.0020.0002] # DOUBLE OBLIQUE HYPHEN -2E18 ; [*0276.0020.0002] # INVERTED INTERROBANG -2E19 ; [*02F8.0020.0002] # PALM BRANCH -2E1A ; [*03C5.0020.0002] # HYPHEN WITH DIAERESIS -2E1B ; [*03C6.0020.0002] # TILDE WITH RING ABOVE -2E1C ; [*0363.0020.0002] # LEFT LOW PARAPHRASE BRACKET -2E1D ; [*0364.0020.0002] # RIGHT LOW PARAPHRASE BRACKET -2E1E ; [*03C7.0020.0002] # TILDE WITH DOT ABOVE -2E1F ; [*03C8.0020.0002] # TILDE WITH DOT BELOW -2E20 ; [*0365.0020.0002] # LEFT VERTICAL BAR WITH QUILL -2E21 ; [*0366.0020.0002] # RIGHT VERTICAL BAR WITH QUILL -2E22 ; [*0367.0020.0002] # TOP LEFT HALF BRACKET -2E23 ; [*0368.0020.0002] # TOP RIGHT HALF BRACKET -2E24 ; [*0369.0020.0002] # BOTTOM LEFT HALF BRACKET -2E25 ; [*036A.0020.0002] # BOTTOM RIGHT HALF BRACKET -2E26 ; [*036B.0020.0002] # LEFT SIDEWAYS U BRACKET -2E27 ; [*036C.0020.0002] # RIGHT SIDEWAYS U BRACKET -2E28 ; [*036D.0020.0002] # LEFT DOUBLE PARENTHESIS -2E29 ; [*036E.0020.0002] # RIGHT DOUBLE PARENTHESIS -2E2A ; [*02F1.0020.0002] # TWO DOTS OVER ONE DOT PUNCTUATION -2E2B ; [*02F2.0020.0002] # ONE DOT OVER TWO DOTS PUNCTUATION -2E2C ; [*02F3.0020.0002] # SQUARED FOUR DOT PUNCTUATION -2E2D ; [*02F4.0020.0002] # FIVE DOT MARK -2E2E ; [*0268.0020.0002] # REVERSED QUESTION MARK -2E30 ; [*0283.0020.0002] # RING POINT -2E31 ; [*028C.0020.0002] # WORD SEPARATOR MIDDLE DOT +2E18 ; [*0277.0020.0002] # INVERTED INTERROBANG +2E19 ; [*02F9.0020.0002] # PALM BRANCH +2E1A ; [*03C6.0020.0002] # HYPHEN WITH DIAERESIS +2E1B ; [*03C7.0020.0002] # TILDE WITH RING ABOVE +2E1C ; [*0364.0020.0002] # LEFT LOW PARAPHRASE BRACKET +2E1D ; [*0365.0020.0002] # RIGHT LOW PARAPHRASE BRACKET +2E1E ; [*03C8.0020.0002] # TILDE WITH DOT ABOVE +2E1F ; [*03C9.0020.0002] # TILDE WITH DOT BELOW +2E20 ; [*0366.0020.0002] # LEFT VERTICAL BAR WITH QUILL +2E21 ; [*0367.0020.0002] # RIGHT VERTICAL BAR WITH QUILL +2E22 ; [*0368.0020.0002] # TOP LEFT HALF BRACKET +2E23 ; [*0369.0020.0002] # TOP RIGHT HALF BRACKET +2E24 ; [*036A.0020.0002] # BOTTOM LEFT HALF BRACKET +2E25 ; [*036B.0020.0002] # BOTTOM RIGHT HALF BRACKET +2E26 ; [*036C.0020.0002] # LEFT SIDEWAYS U BRACKET +2E27 ; [*036D.0020.0002] # RIGHT SIDEWAYS U BRACKET +2E28 ; [*036E.0020.0002] # LEFT DOUBLE PARENTHESIS +2E29 ; [*036F.0020.0002] # RIGHT DOUBLE PARENTHESIS +2E2A ; [*02F2.0020.0002] # TWO DOTS OVER ONE DOT PUNCTUATION +2E2B ; [*02F3.0020.0002] # ONE DOT OVER TWO DOTS PUNCTUATION +2E2C ; [*02F4.0020.0002] # SQUARED FOUR DOT PUNCTUATION +2E2D ; [*02F5.0020.0002] # FIVE DOT MARK +2E2E ; [*0269.0020.0002] # REVERSED QUESTION MARK +2E30 ; [*0284.0020.0002] # RING POINT +2E31 ; [*028D.0020.0002] # WORD SEPARATOR MIDDLE DOT 2E32 ; [*0224.0020.0002] # TURNED COMMA -2E33 ; [*028D.0020.0002] # RAISED DOT +2E33 ; [*028E.0020.0002] # RAISED DOT 2E34 ; [*0223.0020.0002] # RAISED COMMA 2E35 ; [*0237.0020.0002] # TURNED SEMICOLON -2E36 ; [*03A1.0020.0002] # DAGGER WITH LEFT GUARD -2E37 ; [*03A2.0020.0002] # DAGGER WITH RIGHT GUARD -2E38 ; [*03A3.0020.0002] # TURNED DAGGER -2E39 ; [*038A.0020.0002] # TOP HALF SECTION SIGN +2E36 ; [*03A2.0020.0002] # DAGGER WITH LEFT GUARD +2E37 ; [*03A3.0020.0002] # DAGGER WITH RIGHT GUARD +2E38 ; [*03A4.0020.0002] # TURNED DAGGER +2E39 ; [*038B.0020.0002] # TOP HALF SECTION SIGN 2E3A ; [*0218.0020.0002] # TWO-EM DASH 2E3B ; [*0219.0020.0002] # THREE-EM DASH -2E3C ; [*0284.0020.0002] # STENOGRAPHIC FULL STOP -2E3D ; [*02F5.0020.0002] # VERTICAL SIX DOTS -2E3E ; [*0384.0020.0002] # WIGGLY VERTICAL LINE -2E3F ; [*038D.0020.0002] # CAPITULUM +2E3C ; [*0285.0020.0002] # STENOGRAPHIC FULL STOP +2E3D ; [*02F6.0020.0002] # VERTICAL SIX DOTS +2E3E ; [*0385.0020.0002] # WIGGLY VERTICAL LINE +2E3F ; [*038E.0020.0002] # CAPITULUM 2E40 ; [*021D.0020.0002] # DOUBLE HYPHEN 2E41 ; [*0225.0020.0002] # REVERSED COMMA -2E42 ; [*0311.0020.0002] # DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E42 ; [*0312.0020.0002] # DOUBLE LOW-REVERSED-9 QUOTATION MARK 2E43 ; [*021B.0020.0002] # DASH WITH LEFT UPTURN -2E44 ; [*03C9.0020.0002] # DOUBLE SUSPENSION MARK -2FF0 ; [*1A5B.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT -2FF1 ; [*1A5C.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW -2FF2 ; [*1A5D.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT -2FF3 ; [*1A5E.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW -2FF4 ; [*1A5F.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND -2FF5 ; [*1A60.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE -2FF6 ; [*1A61.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW -2FF7 ; [*1A62.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT -2FF8 ; [*1A63.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT -2FF9 ; [*1A64.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT -2FFA ; [*1A65.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT -2FFB ; [*1A66.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +2E44 ; [*03CA.0020.0002] # DOUBLE SUSPENSION MARK +2E45 ; [*03CB.0020.0002] # INVERTED LOW KAVYKA +2E46 ; [*03CC.0020.0002] # INVERTED LOW KAVYKA WITH KAVYKA ABOVE +2E47 ; [*03CD.0020.0002] # LOW KAVYKA +2E48 ; [*03CE.0020.0002] # LOW KAVYKA WITH DOT +2E49 ; [*0239.0020.0002] # DOUBLE STACKED COMMA +2FF0 ; [*1ABF.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT +2FF1 ; [*1AC0.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF2 ; [*1AC1.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT +2FF3 ; [*1AC2.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW +2FF4 ; [*1AC3.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND +2FF5 ; [*1AC4.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE +2FF6 ; [*1AC5.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW +2FF7 ; [*1AC6.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT +2FF8 ; [*1AC7.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT +2FF9 ; [*1AC8.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT +2FFA ; [*1AC9.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT +2FFB ; [*1ACA.0020.0002] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID 3000 ; [*0209.0020.0003] # IDEOGRAPHIC SPACE 3001 ; [*0231.0020.0002] # IDEOGRAPHIC COMMA -3002 ; [*028A.0020.0002] # IDEOGRAPHIC FULL STOP -3003 ; [*03AC.0020.0002] # DITTO MARK -3004 ; [*1A8B.0020.0002] # JAPANESE INDUSTRIAL STANDARD SYMBOL -3008 ; [*036F.0020.0002] # LEFT ANGLE BRACKET -3009 ; [*0370.0020.0002] # RIGHT ANGLE BRACKET -300A ; [*0371.0020.0002] # LEFT DOUBLE ANGLE BRACKET -300B ; [*0372.0020.0002] # RIGHT DOUBLE ANGLE BRACKET -300C ; [*0373.0020.0002] # LEFT CORNER BRACKET -300D ; [*0374.0020.0002] # RIGHT CORNER BRACKET -300E ; [*0375.0020.0002] # LEFT WHITE CORNER BRACKET -300F ; [*0376.0020.0002] # RIGHT WHITE CORNER BRACKET -3010 ; [*0377.0020.0002] # LEFT BLACK LENTICULAR BRACKET -3011 ; [*0378.0020.0002] # RIGHT BLACK LENTICULAR BRACKET -3012 ; [*1A8C.0020.0002] # POSTAL MARK -3013 ; [*1A8D.0020.0002] # GETA MARK -3014 ; [*0379.0020.0002] # LEFT TORTOISE SHELL BRACKET -3015 ; [*037A.0020.0002] # RIGHT TORTOISE SHELL BRACKET -3016 ; [*037B.0020.0002] # LEFT WHITE LENTICULAR BRACKET -3017 ; [*037C.0020.0002] # RIGHT WHITE LENTICULAR BRACKET -3018 ; [*037D.0020.0002] # LEFT WHITE TORTOISE SHELL BRACKET -3019 ; [*037E.0020.0002] # RIGHT WHITE TORTOISE SHELL BRACKET -301A ; [*037F.0020.0002] # LEFT WHITE SQUARE BRACKET -301B ; [*0380.0020.0002] # RIGHT WHITE SQUARE BRACKET +3002 ; [*028B.0020.0002] # IDEOGRAPHIC FULL STOP +3003 ; [*03AD.0020.0002] # DITTO MARK +3004 ; [*1AEF.0020.0002] # JAPANESE INDUSTRIAL STANDARD SYMBOL +3008 ; [*0370.0020.0002] # LEFT ANGLE BRACKET +3009 ; [*0371.0020.0002] # RIGHT ANGLE BRACKET +300A ; [*0372.0020.0002] # LEFT DOUBLE ANGLE BRACKET +300B ; [*0373.0020.0002] # RIGHT DOUBLE ANGLE BRACKET +300C ; [*0374.0020.0002] # LEFT CORNER BRACKET +300D ; [*0375.0020.0002] # RIGHT CORNER BRACKET +300E ; [*0376.0020.0002] # LEFT WHITE CORNER BRACKET +300F ; [*0377.0020.0002] # RIGHT WHITE CORNER BRACKET +3010 ; [*0378.0020.0002] # LEFT BLACK LENTICULAR BRACKET +3011 ; [*0379.0020.0002] # RIGHT BLACK LENTICULAR BRACKET +3012 ; [*1AF0.0020.0002] # POSTAL MARK +3013 ; [*1AF1.0020.0002] # GETA MARK +3014 ; [*037A.0020.0002] # LEFT TORTOISE SHELL BRACKET +3015 ; [*037B.0020.0002] # RIGHT TORTOISE SHELL BRACKET +3016 ; [*037C.0020.0002] # LEFT WHITE LENTICULAR BRACKET +3017 ; [*037D.0020.0002] # RIGHT WHITE LENTICULAR BRACKET +3018 ; [*037E.0020.0002] # LEFT WHITE TORTOISE SHELL BRACKET +3019 ; [*037F.0020.0002] # RIGHT WHITE TORTOISE SHELL BRACKET +301A ; [*0380.0020.0002] # LEFT WHITE SQUARE BRACKET +301B ; [*0381.0020.0002] # RIGHT WHITE SQUARE BRACKET 301C ; [*021E.0020.0002] # WAVE DASH -301D ; [*0312.0020.0002] # REVERSED DOUBLE PRIME QUOTATION MARK -301E ; [*0313.0020.0002] # DOUBLE PRIME QUOTATION MARK -301F ; [*0314.0020.0002] # LOW DOUBLE PRIME QUOTATION MARK -3020 ; [*1A8E.0020.0002] # POSTAL MARK FACE +301D ; [*0313.0020.0002] # REVERSED DOUBLE PRIME QUOTATION MARK +301E ; [*0314.0020.0002] # DOUBLE PRIME QUOTATION MARK +301F ; [*0315.0020.0002] # LOW DOUBLE PRIME QUOTATION MARK +3020 ; [*1AF2.0020.0002] # POSTAL MARK FACE 3030 ; [*021F.0020.0002] # WAVY DASH -3036 ; [*1A8C.0020.0004] # CIRCLED POSTAL MARK -3037 ; [*1A8F.0020.0002] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -303D ; [*03AD.0020.0002] # PART ALTERNATION MARK -303E ; [*1A90.0020.0002] # IDEOGRAPHIC VARIATION INDICATOR -303F ; [*1A91.0020.0002] # IDEOGRAPHIC HALF FILL SPACE -309B ; [*0491.0020.0002] # KATAKANA-HIRAGANA VOICED SOUND MARK -309C ; [*0492.0020.0002] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +3036 ; [*1AF0.0020.0004] # CIRCLED POSTAL MARK +3037 ; [*1AF3.0020.0002] # IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +303D ; [*03AE.0020.0002] # PART ALTERNATION MARK +303E ; [*1AF4.0020.0002] # IDEOGRAPHIC VARIATION INDICATOR +303F ; [*1AF5.0020.0002] # IDEOGRAPHIC HALF FILL SPACE +309B ; [*04A7.0020.0002] # KATAKANA-HIRAGANA VOICED SOUND MARK +309C ; [*04A8.0020.0002] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 30A0 ; [*0220.0020.0002] # KATAKANA-HIRAGANA DOUBLE HYPHEN 30FB ; [*0221.0020.0002] # KATAKANA MIDDLE DOT -3190 ; [*1A92.0020.0002] # IDEOGRAPHIC ANNOTATION LINKING MARK -3191 ; [*1A93.0020.0002] # IDEOGRAPHIC ANNOTATION REVERSE MARK -31C0 ; [*1A67.0020.0002] # CJK STROKE T -31C1 ; [*1A68.0020.0002] # CJK STROKE WG -31C2 ; [*1A69.0020.0002] # CJK STROKE XG -31C3 ; [*1A6A.0020.0002] # CJK STROKE BXG -31C4 ; [*1A6B.0020.0002] # CJK STROKE SW -31C5 ; [*1A6C.0020.0002] # CJK STROKE HZZ -31C6 ; [*1A6D.0020.0002] # CJK STROKE HZG -31C7 ; [*1A6E.0020.0002] # CJK STROKE HP -31C8 ; [*1A6F.0020.0002] # CJK STROKE HZWG -31C9 ; [*1A70.0020.0002] # CJK STROKE SZWG -31CA ; [*1A71.0020.0002] # CJK STROKE HZT -31CB ; [*1A72.0020.0002] # CJK STROKE HZZP -31CC ; [*1A73.0020.0002] # CJK STROKE HPWG -31CD ; [*1A74.0020.0002] # CJK STROKE HZW -31CE ; [*1A75.0020.0002] # CJK STROKE HZZZ -31CF ; [*1A76.0020.0002] # CJK STROKE N -31D0 ; [*1A77.0020.0002] # CJK STROKE H -31D1 ; [*1A78.0020.0002] # CJK STROKE S -31D2 ; [*1A79.0020.0002] # CJK STROKE P -31D3 ; [*1A7A.0020.0002] # CJK STROKE SP -31D4 ; [*1A7B.0020.0002] # CJK STROKE D -31D5 ; [*1A7C.0020.0002] # CJK STROKE HZ -31D6 ; [*1A7D.0020.0002] # CJK STROKE HG -31D7 ; [*1A7E.0020.0002] # CJK STROKE SZ -31D8 ; [*1A7F.0020.0002] # CJK STROKE SWZ -31D9 ; [*1A80.0020.0002] # CJK STROKE ST -31DA ; [*1A81.0020.0002] # CJK STROKE SG -31DB ; [*1A82.0020.0002] # CJK STROKE PD -31DC ; [*1A83.0020.0002] # CJK STROKE PZ -31DD ; [*1A84.0020.0002] # CJK STROKE TN -31DE ; [*1A85.0020.0002] # CJK STROKE SZZ -31DF ; [*1A86.0020.0002] # CJK STROKE SWG -31E0 ; [*1A87.0020.0002] # CJK STROKE HXWG -31E1 ; [*1A88.0020.0002] # CJK STROKE HZZZG -31E2 ; [*1A89.0020.0002] # CJK STROKE PG -31E3 ; [*1A8A.0020.0002] # CJK STROKE Q -327F ; [*1A94.0020.0002] # KOREAN STANDARD SYMBOL -4DC0 ; [*0EAA.0020.0002] # HEXAGRAM FOR THE CREATIVE HEAVEN -4DC1 ; [*0EAB.0020.0002] # HEXAGRAM FOR THE RECEPTIVE EARTH -4DC2 ; [*0EAC.0020.0002] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING -4DC3 ; [*0EAD.0020.0002] # HEXAGRAM FOR YOUTHFUL FOLLY -4DC4 ; [*0EAE.0020.0002] # HEXAGRAM FOR WAITING -4DC5 ; [*0EAF.0020.0002] # HEXAGRAM FOR CONFLICT -4DC6 ; [*0EB0.0020.0002] # HEXAGRAM FOR THE ARMY -4DC7 ; [*0EB1.0020.0002] # HEXAGRAM FOR HOLDING TOGETHER -4DC8 ; [*0EB2.0020.0002] # HEXAGRAM FOR SMALL TAMING -4DC9 ; [*0EB3.0020.0002] # HEXAGRAM FOR TREADING -4DCA ; [*0EB4.0020.0002] # HEXAGRAM FOR PEACE -4DCB ; [*0EB5.0020.0002] # HEXAGRAM FOR STANDSTILL -4DCC ; [*0EB6.0020.0002] # HEXAGRAM FOR FELLOWSHIP -4DCD ; [*0EB7.0020.0002] # HEXAGRAM FOR GREAT POSSESSION -4DCE ; [*0EB8.0020.0002] # HEXAGRAM FOR MODESTY -4DCF ; [*0EB9.0020.0002] # HEXAGRAM FOR ENTHUSIASM -4DD0 ; [*0EBA.0020.0002] # HEXAGRAM FOR FOLLOWING -4DD1 ; [*0EBB.0020.0002] # HEXAGRAM FOR WORK ON THE DECAYED -4DD2 ; [*0EBC.0020.0002] # HEXAGRAM FOR APPROACH -4DD3 ; [*0EBD.0020.0002] # HEXAGRAM FOR CONTEMPLATION -4DD4 ; [*0EBE.0020.0002] # HEXAGRAM FOR BITING THROUGH -4DD5 ; [*0EBF.0020.0002] # HEXAGRAM FOR GRACE -4DD6 ; [*0EC0.0020.0002] # HEXAGRAM FOR SPLITTING APART -4DD7 ; [*0EC1.0020.0002] # HEXAGRAM FOR RETURN -4DD8 ; [*0EC2.0020.0002] # HEXAGRAM FOR INNOCENCE -4DD9 ; [*0EC3.0020.0002] # HEXAGRAM FOR GREAT TAMING -4DDA ; [*0EC4.0020.0002] # HEXAGRAM FOR MOUTH CORNERS -4DDB ; [*0EC5.0020.0002] # HEXAGRAM FOR GREAT PREPONDERANCE -4DDC ; [*0EC6.0020.0002] # HEXAGRAM FOR THE ABYSMAL WATER -4DDD ; [*0EC7.0020.0002] # HEXAGRAM FOR THE CLINGING FIRE -4DDE ; [*0EC8.0020.0002] # HEXAGRAM FOR INFLUENCE -4DDF ; [*0EC9.0020.0002] # HEXAGRAM FOR DURATION -4DE0 ; [*0ECA.0020.0002] # HEXAGRAM FOR RETREAT -4DE1 ; [*0ECB.0020.0002] # HEXAGRAM FOR GREAT POWER -4DE2 ; [*0ECC.0020.0002] # HEXAGRAM FOR PROGRESS -4DE3 ; [*0ECD.0020.0002] # HEXAGRAM FOR DARKENING OF THE LIGHT -4DE4 ; [*0ECE.0020.0002] # HEXAGRAM FOR THE FAMILY -4DE5 ; [*0ECF.0020.0002] # HEXAGRAM FOR OPPOSITION -4DE6 ; [*0ED0.0020.0002] # HEXAGRAM FOR OBSTRUCTION -4DE7 ; [*0ED1.0020.0002] # HEXAGRAM FOR DELIVERANCE -4DE8 ; [*0ED2.0020.0002] # HEXAGRAM FOR DECREASE -4DE9 ; [*0ED3.0020.0002] # HEXAGRAM FOR INCREASE -4DEA ; [*0ED4.0020.0002] # HEXAGRAM FOR BREAKTHROUGH -4DEB ; [*0ED5.0020.0002] # HEXAGRAM FOR COMING TO MEET -4DEC ; [*0ED6.0020.0002] # HEXAGRAM FOR GATHERING TOGETHER -4DED ; [*0ED7.0020.0002] # HEXAGRAM FOR PUSHING UPWARD -4DEE ; [*0ED8.0020.0002] # HEXAGRAM FOR OPPRESSION -4DEF ; [*0ED9.0020.0002] # HEXAGRAM FOR THE WELL -4DF0 ; [*0EDA.0020.0002] # HEXAGRAM FOR REVOLUTION -4DF1 ; [*0EDB.0020.0002] # HEXAGRAM FOR THE CAULDRON -4DF2 ; [*0EDC.0020.0002] # HEXAGRAM FOR THE AROUSING THUNDER -4DF3 ; [*0EDD.0020.0002] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN -4DF4 ; [*0EDE.0020.0002] # HEXAGRAM FOR DEVELOPMENT -4DF5 ; [*0EDF.0020.0002] # HEXAGRAM FOR THE MARRYING MAIDEN -4DF6 ; [*0EE0.0020.0002] # HEXAGRAM FOR ABUNDANCE -4DF7 ; [*0EE1.0020.0002] # HEXAGRAM FOR THE WANDERER -4DF8 ; [*0EE2.0020.0002] # HEXAGRAM FOR THE GENTLE WIND -4DF9 ; [*0EE3.0020.0002] # HEXAGRAM FOR THE JOYOUS LAKE -4DFA ; [*0EE4.0020.0002] # HEXAGRAM FOR DISPERSION -4DFB ; [*0EE5.0020.0002] # HEXAGRAM FOR LIMITATION -4DFC ; [*0EE6.0020.0002] # HEXAGRAM FOR INNER TRUTH -4DFD ; [*0EE7.0020.0002] # HEXAGRAM FOR SMALL PREPONDERANCE -4DFE ; [*0EE8.0020.0002] # HEXAGRAM FOR AFTER COMPLETION -4DFF ; [*0EE9.0020.0002] # HEXAGRAM FOR BEFORE COMPLETION -A490 ; [*0F41.0020.0002] # YI RADICAL QOT -A491 ; [*0F42.0020.0002] # YI RADICAL LI -A492 ; [*0F43.0020.0002] # YI RADICAL KIT -A493 ; [*0F44.0020.0002] # YI RADICAL NYIP -A494 ; [*0F45.0020.0002] # YI RADICAL CYP -A495 ; [*0F46.0020.0002] # YI RADICAL SSI -A496 ; [*0F47.0020.0002] # YI RADICAL GGOP -A497 ; [*0F48.0020.0002] # YI RADICAL GEP -A498 ; [*0F49.0020.0002] # YI RADICAL MI -A499 ; [*0F4A.0020.0002] # YI RADICAL HXIT -A49A ; [*0F4B.0020.0002] # YI RADICAL LYR -A49B ; [*0F4C.0020.0002] # YI RADICAL BBUT -A49C ; [*0F4D.0020.0002] # YI RADICAL MOP -A49D ; [*0F4E.0020.0002] # YI RADICAL YO -A49E ; [*0F4F.0020.0002] # YI RADICAL PUT -A49F ; [*0F50.0020.0002] # YI RADICAL HXUO -A4A0 ; [*0F51.0020.0002] # YI RADICAL TAT -A4A1 ; [*0F52.0020.0002] # YI RADICAL GA -A4A2 ; [*0F53.0020.0002] # YI RADICAL ZUP -A4A3 ; [*0F54.0020.0002] # YI RADICAL CYT -A4A4 ; [*0F55.0020.0002] # YI RADICAL DDUR -A4A5 ; [*0F56.0020.0002] # YI RADICAL BUR -A4A6 ; [*0F57.0020.0002] # YI RADICAL GGUO -A4A7 ; [*0F58.0020.0002] # YI RADICAL NYOP -A4A8 ; [*0F59.0020.0002] # YI RADICAL TU -A4A9 ; [*0F5A.0020.0002] # YI RADICAL OP -A4AA ; [*0F5B.0020.0002] # YI RADICAL JJUT -A4AB ; [*0F5C.0020.0002] # YI RADICAL ZOT -A4AC ; [*0F5D.0020.0002] # YI RADICAL PYT -A4AD ; [*0F5E.0020.0002] # YI RADICAL HMO -A4AE ; [*0F5F.0020.0002] # YI RADICAL YIT -A4AF ; [*0F60.0020.0002] # YI RADICAL VUR -A4B0 ; [*0F61.0020.0002] # YI RADICAL SHY -A4B1 ; [*0F62.0020.0002] # YI RADICAL VEP -A4B2 ; [*0F63.0020.0002] # YI RADICAL ZA -A4B3 ; [*0F64.0020.0002] # YI RADICAL JO -A4B4 ; [*0F65.0020.0002] # YI RADICAL NZUP -A4B5 ; [*0F66.0020.0002] # YI RADICAL JJY -A4B6 ; [*0F67.0020.0002] # YI RADICAL GOT -A4B7 ; [*0F68.0020.0002] # YI RADICAL JJIE -A4B8 ; [*0F69.0020.0002] # YI RADICAL WO -A4B9 ; [*0F6A.0020.0002] # YI RADICAL DU -A4BA ; [*0F6B.0020.0002] # YI RADICAL SHUR -A4BB ; [*0F6C.0020.0002] # YI RADICAL LIE -A4BC ; [*0F6D.0020.0002] # YI RADICAL CY -A4BD ; [*0F6E.0020.0002] # YI RADICAL CUOP -A4BE ; [*0F6F.0020.0002] # YI RADICAL CIP -A4BF ; [*0F70.0020.0002] # YI RADICAL HXOP -A4C0 ; [*0F71.0020.0002] # YI RADICAL SHAT -A4C1 ; [*0F72.0020.0002] # YI RADICAL ZUR -A4C2 ; [*0F73.0020.0002] # YI RADICAL SHOP -A4C3 ; [*0F74.0020.0002] # YI RADICAL CHE -A4C4 ; [*0F75.0020.0002] # YI RADICAL ZZIET -A4C5 ; [*0F76.0020.0002] # YI RADICAL NBIE -A4C6 ; [*0F77.0020.0002] # YI RADICAL KE +3190 ; [*1AF6.0020.0002] # IDEOGRAPHIC ANNOTATION LINKING MARK +3191 ; [*1AF7.0020.0002] # IDEOGRAPHIC ANNOTATION REVERSE MARK +31C0 ; [*1ACB.0020.0002] # CJK STROKE T +31C1 ; [*1ACC.0020.0002] # CJK STROKE WG +31C2 ; [*1ACD.0020.0002] # CJK STROKE XG +31C3 ; [*1ACE.0020.0002] # CJK STROKE BXG +31C4 ; [*1ACF.0020.0002] # CJK STROKE SW +31C5 ; [*1AD0.0020.0002] # CJK STROKE HZZ +31C6 ; [*1AD1.0020.0002] # CJK STROKE HZG +31C7 ; [*1AD2.0020.0002] # CJK STROKE HP +31C8 ; [*1AD3.0020.0002] # CJK STROKE HZWG +31C9 ; [*1AD4.0020.0002] # CJK STROKE SZWG +31CA ; [*1AD5.0020.0002] # CJK STROKE HZT +31CB ; [*1AD6.0020.0002] # CJK STROKE HZZP +31CC ; [*1AD7.0020.0002] # CJK STROKE HPWG +31CD ; [*1AD8.0020.0002] # CJK STROKE HZW +31CE ; [*1AD9.0020.0002] # CJK STROKE HZZZ +31CF ; [*1ADA.0020.0002] # CJK STROKE N +31D0 ; [*1ADB.0020.0002] # CJK STROKE H +31D1 ; [*1ADC.0020.0002] # CJK STROKE S +31D2 ; [*1ADD.0020.0002] # CJK STROKE P +31D3 ; [*1ADE.0020.0002] # CJK STROKE SP +31D4 ; [*1ADF.0020.0002] # CJK STROKE D +31D5 ; [*1AE0.0020.0002] # CJK STROKE HZ +31D6 ; [*1AE1.0020.0002] # CJK STROKE HG +31D7 ; [*1AE2.0020.0002] # CJK STROKE SZ +31D8 ; [*1AE3.0020.0002] # CJK STROKE SWZ +31D9 ; [*1AE4.0020.0002] # CJK STROKE ST +31DA ; [*1AE5.0020.0002] # CJK STROKE SG +31DB ; [*1AE6.0020.0002] # CJK STROKE PD +31DC ; [*1AE7.0020.0002] # CJK STROKE PZ +31DD ; [*1AE8.0020.0002] # CJK STROKE TN +31DE ; [*1AE9.0020.0002] # CJK STROKE SZZ +31DF ; [*1AEA.0020.0002] # CJK STROKE SWG +31E0 ; [*1AEB.0020.0002] # CJK STROKE HXWG +31E1 ; [*1AEC.0020.0002] # CJK STROKE HZZZG +31E2 ; [*1AED.0020.0002] # CJK STROKE PG +31E3 ; [*1AEE.0020.0002] # CJK STROKE Q +327F ; [*1AF8.0020.0002] # KOREAN STANDARD SYMBOL +4DC0 ; [*0EC2.0020.0002] # HEXAGRAM FOR THE CREATIVE HEAVEN +4DC1 ; [*0EC3.0020.0002] # HEXAGRAM FOR THE RECEPTIVE EARTH +4DC2 ; [*0EC4.0020.0002] # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING +4DC3 ; [*0EC5.0020.0002] # HEXAGRAM FOR YOUTHFUL FOLLY +4DC4 ; [*0EC6.0020.0002] # HEXAGRAM FOR WAITING +4DC5 ; [*0EC7.0020.0002] # HEXAGRAM FOR CONFLICT +4DC6 ; [*0EC8.0020.0002] # HEXAGRAM FOR THE ARMY +4DC7 ; [*0EC9.0020.0002] # HEXAGRAM FOR HOLDING TOGETHER +4DC8 ; [*0ECA.0020.0002] # HEXAGRAM FOR SMALL TAMING +4DC9 ; [*0ECB.0020.0002] # HEXAGRAM FOR TREADING +4DCA ; [*0ECC.0020.0002] # HEXAGRAM FOR PEACE +4DCB ; [*0ECD.0020.0002] # HEXAGRAM FOR STANDSTILL +4DCC ; [*0ECE.0020.0002] # HEXAGRAM FOR FELLOWSHIP +4DCD ; [*0ECF.0020.0002] # HEXAGRAM FOR GREAT POSSESSION +4DCE ; [*0ED0.0020.0002] # HEXAGRAM FOR MODESTY +4DCF ; [*0ED1.0020.0002] # HEXAGRAM FOR ENTHUSIASM +4DD0 ; [*0ED2.0020.0002] # HEXAGRAM FOR FOLLOWING +4DD1 ; [*0ED3.0020.0002] # HEXAGRAM FOR WORK ON THE DECAYED +4DD2 ; [*0ED4.0020.0002] # HEXAGRAM FOR APPROACH +4DD3 ; [*0ED5.0020.0002] # HEXAGRAM FOR CONTEMPLATION +4DD4 ; [*0ED6.0020.0002] # HEXAGRAM FOR BITING THROUGH +4DD5 ; [*0ED7.0020.0002] # HEXAGRAM FOR GRACE +4DD6 ; [*0ED8.0020.0002] # HEXAGRAM FOR SPLITTING APART +4DD7 ; [*0ED9.0020.0002] # HEXAGRAM FOR RETURN +4DD8 ; [*0EDA.0020.0002] # HEXAGRAM FOR INNOCENCE +4DD9 ; [*0EDB.0020.0002] # HEXAGRAM FOR GREAT TAMING +4DDA ; [*0EDC.0020.0002] # HEXAGRAM FOR MOUTH CORNERS +4DDB ; [*0EDD.0020.0002] # HEXAGRAM FOR GREAT PREPONDERANCE +4DDC ; [*0EDE.0020.0002] # HEXAGRAM FOR THE ABYSMAL WATER +4DDD ; [*0EDF.0020.0002] # HEXAGRAM FOR THE CLINGING FIRE +4DDE ; [*0EE0.0020.0002] # HEXAGRAM FOR INFLUENCE +4DDF ; [*0EE1.0020.0002] # HEXAGRAM FOR DURATION +4DE0 ; [*0EE2.0020.0002] # HEXAGRAM FOR RETREAT +4DE1 ; [*0EE3.0020.0002] # HEXAGRAM FOR GREAT POWER +4DE2 ; [*0EE4.0020.0002] # HEXAGRAM FOR PROGRESS +4DE3 ; [*0EE5.0020.0002] # HEXAGRAM FOR DARKENING OF THE LIGHT +4DE4 ; [*0EE6.0020.0002] # HEXAGRAM FOR THE FAMILY +4DE5 ; [*0EE7.0020.0002] # HEXAGRAM FOR OPPOSITION +4DE6 ; [*0EE8.0020.0002] # HEXAGRAM FOR OBSTRUCTION +4DE7 ; [*0EE9.0020.0002] # HEXAGRAM FOR DELIVERANCE +4DE8 ; [*0EEA.0020.0002] # HEXAGRAM FOR DECREASE +4DE9 ; [*0EEB.0020.0002] # HEXAGRAM FOR INCREASE +4DEA ; [*0EEC.0020.0002] # HEXAGRAM FOR BREAKTHROUGH +4DEB ; [*0EED.0020.0002] # HEXAGRAM FOR COMING TO MEET +4DEC ; [*0EEE.0020.0002] # HEXAGRAM FOR GATHERING TOGETHER +4DED ; [*0EEF.0020.0002] # HEXAGRAM FOR PUSHING UPWARD +4DEE ; [*0EF0.0020.0002] # HEXAGRAM FOR OPPRESSION +4DEF ; [*0EF1.0020.0002] # HEXAGRAM FOR THE WELL +4DF0 ; [*0EF2.0020.0002] # HEXAGRAM FOR REVOLUTION +4DF1 ; [*0EF3.0020.0002] # HEXAGRAM FOR THE CAULDRON +4DF2 ; [*0EF4.0020.0002] # HEXAGRAM FOR THE AROUSING THUNDER +4DF3 ; [*0EF5.0020.0002] # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN +4DF4 ; [*0EF6.0020.0002] # HEXAGRAM FOR DEVELOPMENT +4DF5 ; [*0EF7.0020.0002] # HEXAGRAM FOR THE MARRYING MAIDEN +4DF6 ; [*0EF8.0020.0002] # HEXAGRAM FOR ABUNDANCE +4DF7 ; [*0EF9.0020.0002] # HEXAGRAM FOR THE WANDERER +4DF8 ; [*0EFA.0020.0002] # HEXAGRAM FOR THE GENTLE WIND +4DF9 ; [*0EFB.0020.0002] # HEXAGRAM FOR THE JOYOUS LAKE +4DFA ; [*0EFC.0020.0002] # HEXAGRAM FOR DISPERSION +4DFB ; [*0EFD.0020.0002] # HEXAGRAM FOR LIMITATION +4DFC ; [*0EFE.0020.0002] # HEXAGRAM FOR INNER TRUTH +4DFD ; [*0EFF.0020.0002] # HEXAGRAM FOR SMALL PREPONDERANCE +4DFE ; [*0F00.0020.0002] # HEXAGRAM FOR AFTER COMPLETION +4DFF ; [*0F01.0020.0002] # HEXAGRAM FOR BEFORE COMPLETION +A490 ; [*0F59.0020.0002] # YI RADICAL QOT +A491 ; [*0F5A.0020.0002] # YI RADICAL LI +A492 ; [*0F5B.0020.0002] # YI RADICAL KIT +A493 ; [*0F5C.0020.0002] # YI RADICAL NYIP +A494 ; [*0F5D.0020.0002] # YI RADICAL CYP +A495 ; [*0F5E.0020.0002] # YI RADICAL SSI +A496 ; [*0F5F.0020.0002] # YI RADICAL GGOP +A497 ; [*0F60.0020.0002] # YI RADICAL GEP +A498 ; [*0F61.0020.0002] # YI RADICAL MI +A499 ; [*0F62.0020.0002] # YI RADICAL HXIT +A49A ; [*0F63.0020.0002] # YI RADICAL LYR +A49B ; [*0F64.0020.0002] # YI RADICAL BBUT +A49C ; [*0F65.0020.0002] # YI RADICAL MOP +A49D ; [*0F66.0020.0002] # YI RADICAL YO +A49E ; [*0F67.0020.0002] # YI RADICAL PUT +A49F ; [*0F68.0020.0002] # YI RADICAL HXUO +A4A0 ; [*0F69.0020.0002] # YI RADICAL TAT +A4A1 ; [*0F6A.0020.0002] # YI RADICAL GA +A4A2 ; [*0F6B.0020.0002] # YI RADICAL ZUP +A4A3 ; [*0F6C.0020.0002] # YI RADICAL CYT +A4A4 ; [*0F6D.0020.0002] # YI RADICAL DDUR +A4A5 ; [*0F6E.0020.0002] # YI RADICAL BUR +A4A6 ; [*0F6F.0020.0002] # YI RADICAL GGUO +A4A7 ; [*0F70.0020.0002] # YI RADICAL NYOP +A4A8 ; [*0F71.0020.0002] # YI RADICAL TU +A4A9 ; [*0F72.0020.0002] # YI RADICAL OP +A4AA ; [*0F73.0020.0002] # YI RADICAL JJUT +A4AB ; [*0F74.0020.0002] # YI RADICAL ZOT +A4AC ; [*0F75.0020.0002] # YI RADICAL PYT +A4AD ; [*0F76.0020.0002] # YI RADICAL HMO +A4AE ; [*0F77.0020.0002] # YI RADICAL YIT +A4AF ; [*0F78.0020.0002] # YI RADICAL VUR +A4B0 ; [*0F79.0020.0002] # YI RADICAL SHY +A4B1 ; [*0F7A.0020.0002] # YI RADICAL VEP +A4B2 ; [*0F7B.0020.0002] # YI RADICAL ZA +A4B3 ; [*0F7C.0020.0002] # YI RADICAL JO +A4B4 ; [*0F7D.0020.0002] # YI RADICAL NZUP +A4B5 ; [*0F7E.0020.0002] # YI RADICAL JJY +A4B6 ; [*0F7F.0020.0002] # YI RADICAL GOT +A4B7 ; [*0F80.0020.0002] # YI RADICAL JJIE +A4B8 ; [*0F81.0020.0002] # YI RADICAL WO +A4B9 ; [*0F82.0020.0002] # YI RADICAL DU +A4BA ; [*0F83.0020.0002] # YI RADICAL SHUR +A4BB ; [*0F84.0020.0002] # YI RADICAL LIE +A4BC ; [*0F85.0020.0002] # YI RADICAL CY +A4BD ; [*0F86.0020.0002] # YI RADICAL CUOP +A4BE ; [*0F87.0020.0002] # YI RADICAL CIP +A4BF ; [*0F88.0020.0002] # YI RADICAL HXOP +A4C0 ; [*0F89.0020.0002] # YI RADICAL SHAT +A4C1 ; [*0F8A.0020.0002] # YI RADICAL ZUR +A4C2 ; [*0F8B.0020.0002] # YI RADICAL SHOP +A4C3 ; [*0F8C.0020.0002] # YI RADICAL CHE +A4C4 ; [*0F8D.0020.0002] # YI RADICAL ZZIET +A4C5 ; [*0F8E.0020.0002] # YI RADICAL NBIE +A4C6 ; [*0F8F.0020.0002] # YI RADICAL KE A4FE ; [*022E.0020.0002] # LISU PUNCTUATION COMMA -A4FF ; [*0285.0020.0002] # LISU PUNCTUATION FULL STOP +A4FF ; [*0286.0020.0002] # LISU PUNCTUATION FULL STOP A60D ; [*022F.0020.0002] # VAI COMMA -A60E ; [*0286.0020.0002] # VAI FULL STOP -A60F ; [*0270.0020.0002] # VAI QUESTION MARK +A60E ; [*0287.0020.0002] # VAI FULL STOP +A60F ; [*0271.0020.0002] # VAI QUESTION MARK A670 ; [.0000.0000.0000] # COMBINING CYRILLIC TEN MILLIONS SIGN A671 ; [.0000.0000.0000] # COMBINING CYRILLIC HUNDRED MILLIONS SIGN A672 ; [.0000.0000.0000] # COMBINING CYRILLIC THOUSAND MILLIONS SIGN -A673 ; [*0393.0020.0002] # SLAVONIC ASTERISK -A67E ; [*03CA.0020.0002] # CYRILLIC KAVYKA -A6F2 ; [*02D7.0020.0002] # BAMUM NJAEMLI -A6F3 ; [*0287.0020.0002] # BAMUM FULL STOP -A6F4 ; [*025F.0020.0002] # BAMUM COLON +A673 ; [*0394.0020.0002] # SLAVONIC ASTERISK +A67E ; [*03CF.0020.0002] # CYRILLIC KAVYKA +A6F2 ; [*02D8.0020.0002] # BAMUM NJAEMLI +A6F3 ; [*0288.0020.0002] # BAMUM FULL STOP +A6F4 ; [*0260.0020.0002] # BAMUM COLON A6F5 ; [*0230.0020.0002] # BAMUM COMMA A6F6 ; [*0238.0020.0002] # BAMUM SEMICOLON -A6F7 ; [*0271.0020.0002] # BAMUM QUESTION MARK -A700 ; [*04D0.0020.0002] # MODIFIER LETTER CHINESE TONE YIN PING -A701 ; [*04D1.0020.0002] # MODIFIER LETTER CHINESE TONE YANG PING -A702 ; [*04D2.0020.0002] # MODIFIER LETTER CHINESE TONE YIN SHANG -A703 ; [*04D3.0020.0002] # MODIFIER LETTER CHINESE TONE YANG SHANG -A704 ; [*04D4.0020.0002] # MODIFIER LETTER CHINESE TONE YIN QU -A705 ; [*04D5.0020.0002] # MODIFIER LETTER CHINESE TONE YANG QU -A706 ; [*04D6.0020.0002] # MODIFIER LETTER CHINESE TONE YIN RU -A707 ; [*04D7.0020.0002] # MODIFIER LETTER CHINESE TONE YANG RU -A708 ; [*04D8.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR -A709 ; [*04D9.0020.0002] # MODIFIER LETTER HIGH DOTTED TONE BAR -A70A ; [*04DA.0020.0002] # MODIFIER LETTER MID DOTTED TONE BAR -A70B ; [*04DB.0020.0002] # MODIFIER LETTER LOW DOTTED TONE BAR -A70C ; [*04DC.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR -A70D ; [*04DD.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR -A70E ; [*04DE.0020.0002] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR -A70F ; [*04DF.0020.0002] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR -A710 ; [*04E0.0020.0002] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR -A711 ; [*04E1.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR -A712 ; [*04E2.0020.0002] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR -A713 ; [*04E3.0020.0002] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR -A714 ; [*04E4.0020.0002] # MODIFIER LETTER MID LEFT-STEM TONE BAR -A715 ; [*04E5.0020.0002] # MODIFIER LETTER LOW LEFT-STEM TONE BAR -A716 ; [*04E6.0020.0002] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR -A717 ; [*04E7.0020.0002] # MODIFIER LETTER DOT VERTICAL BAR -A718 ; [*04E8.0020.0002] # MODIFIER LETTER DOT SLASH -A719 ; [*04E9.0020.0002] # MODIFIER LETTER DOT HORIZONTAL BAR -A71A ; [*04EA.0020.0002] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE -A71B ; [*04EB.0020.0002] # MODIFIER LETTER RAISED UP ARROW -A71C ; [*04EC.0020.0002] # MODIFIER LETTER RAISED DOWN ARROW -A71D ; [*04ED.0020.0002] # MODIFIER LETTER RAISED EXCLAMATION MARK -A71E ; [*04EE.0020.0002] # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK -A71F ; [*04EF.0020.0002] # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK -A720 ; [*04F0.0020.0002] # MODIFIER LETTER STRESS AND HIGH TONE -A721 ; [*04F1.0020.0002] # MODIFIER LETTER STRESS AND LOW TONE -A788 ; [*04F2.0020.0002] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT -A789 ; [*04F3.0020.0002] # MODIFIER LETTER COLON -A78A ; [*04F4.0020.0002] # MODIFIER LETTER SHORT EQUALS SIGN -A828 ; [*051F.0020.0002] # SYLOTI NAGRI POETRY MARK-1 -A829 ; [*0520.0020.0002] # SYLOTI NAGRI POETRY MARK-2 -A82A ; [*0521.0020.0002] # SYLOTI NAGRI POETRY MARK-3 -A82B ; [*0522.0020.0002] # SYLOTI NAGRI POETRY MARK-4 -A830 ; [*1AA2.0020.0002] # NORTH INDIC FRACTION ONE QUARTER -A831 ; [*1AA3.0020.0002] # NORTH INDIC FRACTION ONE HALF -A832 ; [*1AA4.0020.0002] # NORTH INDIC FRACTION THREE QUARTERS -A833 ; [*1AA5.0020.0002] # NORTH INDIC FRACTION ONE SIXTEENTH -A834 ; [*1AA6.0020.0002] # NORTH INDIC FRACTION ONE EIGHTH -A835 ; [*1AA7.0020.0002] # NORTH INDIC FRACTION THREE SIXTEENTHS -A836 ; [*0523.0020.0002] # NORTH INDIC QUARTER MARK -A837 ; [*0524.0020.0002] # NORTH INDIC PLACEHOLDER MARK -A839 ; [*0525.0020.0002] # NORTH INDIC QUANTITY MARK -A874 ; [*0428.0020.0002] # PHAGS-PA SINGLE HEAD MARK -A875 ; [*0429.0020.0002] # PHAGS-PA DOUBLE HEAD MARK -A876 ; [*0294.0020.0002] # PHAGS-PA MARK SHAD -A877 ; [*0295.0020.0002] # PHAGS-PA MARK DOUBLE SHAD -A8CE ; [*0290.0020.0002] # SAURASHTRA DANDA -A8CF ; [*0291.0020.0002] # SAURASHTRA DOUBLE DANDA +A6F7 ; [*0272.0020.0002] # BAMUM QUESTION MARK +A700 ; [*04E6.0020.0002] # MODIFIER LETTER CHINESE TONE YIN PING +A701 ; [*04E7.0020.0002] # MODIFIER LETTER CHINESE TONE YANG PING +A702 ; [*04E8.0020.0002] # MODIFIER LETTER CHINESE TONE YIN SHANG +A703 ; [*04E9.0020.0002] # MODIFIER LETTER CHINESE TONE YANG SHANG +A704 ; [*04EA.0020.0002] # MODIFIER LETTER CHINESE TONE YIN QU +A705 ; [*04EB.0020.0002] # MODIFIER LETTER CHINESE TONE YANG QU +A706 ; [*04EC.0020.0002] # MODIFIER LETTER CHINESE TONE YIN RU +A707 ; [*04ED.0020.0002] # MODIFIER LETTER CHINESE TONE YANG RU +A708 ; [*04EE.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR +A709 ; [*04EF.0020.0002] # MODIFIER LETTER HIGH DOTTED TONE BAR +A70A ; [*04F0.0020.0002] # MODIFIER LETTER MID DOTTED TONE BAR +A70B ; [*04F1.0020.0002] # MODIFIER LETTER LOW DOTTED TONE BAR +A70C ; [*04F2.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR +A70D ; [*04F3.0020.0002] # MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR +A70E ; [*04F4.0020.0002] # MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR +A70F ; [*04F5.0020.0002] # MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR +A710 ; [*04F6.0020.0002] # MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR +A711 ; [*04F7.0020.0002] # MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR +A712 ; [*04F8.0020.0002] # MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR +A713 ; [*04F9.0020.0002] # MODIFIER LETTER HIGH LEFT-STEM TONE BAR +A714 ; [*04FA.0020.0002] # MODIFIER LETTER MID LEFT-STEM TONE BAR +A715 ; [*04FB.0020.0002] # MODIFIER LETTER LOW LEFT-STEM TONE BAR +A716 ; [*04FC.0020.0002] # MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717 ; [*04FD.0020.0002] # MODIFIER LETTER DOT VERTICAL BAR +A718 ; [*04FE.0020.0002] # MODIFIER LETTER DOT SLASH +A719 ; [*04FF.0020.0002] # MODIFIER LETTER DOT HORIZONTAL BAR +A71A ; [*0500.0020.0002] # MODIFIER LETTER LOWER RIGHT CORNER ANGLE +A71B ; [*0501.0020.0002] # MODIFIER LETTER RAISED UP ARROW +A71C ; [*0502.0020.0002] # MODIFIER LETTER RAISED DOWN ARROW +A71D ; [*0503.0020.0002] # MODIFIER LETTER RAISED EXCLAMATION MARK +A71E ; [*0504.0020.0002] # MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK +A71F ; [*0505.0020.0002] # MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720 ; [*0506.0020.0002] # MODIFIER LETTER STRESS AND HIGH TONE +A721 ; [*0507.0020.0002] # MODIFIER LETTER STRESS AND LOW TONE +A788 ; [*0508.0020.0002] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789 ; [*0509.0020.0002] # MODIFIER LETTER COLON +A78A ; [*050A.0020.0002] # MODIFIER LETTER SHORT EQUALS SIGN +A828 ; [*0535.0020.0002] # SYLOTI NAGRI POETRY MARK-1 +A829 ; [*0536.0020.0002] # SYLOTI NAGRI POETRY MARK-2 +A82A ; [*0537.0020.0002] # SYLOTI NAGRI POETRY MARK-3 +A82B ; [*0538.0020.0002] # SYLOTI NAGRI POETRY MARK-4 +A830 ; [*1B06.0020.0002] # NORTH INDIC FRACTION ONE QUARTER +A831 ; [*1B07.0020.0002] # NORTH INDIC FRACTION ONE HALF +A832 ; [*1B08.0020.0002] # NORTH INDIC FRACTION THREE QUARTERS +A833 ; [*1B09.0020.0002] # NORTH INDIC FRACTION ONE SIXTEENTH +A834 ; [*1B0A.0020.0002] # NORTH INDIC FRACTION ONE EIGHTH +A835 ; [*1B0B.0020.0002] # NORTH INDIC FRACTION THREE SIXTEENTHS +A836 ; [*0539.0020.0002] # NORTH INDIC QUARTER MARK +A837 ; [*053A.0020.0002] # NORTH INDIC PLACEHOLDER MARK +A839 ; [*053B.0020.0002] # NORTH INDIC QUANTITY MARK +A874 ; [*043E.0020.0002] # PHAGS-PA SINGLE HEAD MARK +A875 ; [*043F.0020.0002] # PHAGS-PA DOUBLE HEAD MARK +A876 ; [*0295.0020.0002] # PHAGS-PA MARK SHAD +A877 ; [*0296.0020.0002] # PHAGS-PA MARK DOUBLE SHAD +A8CE ; [*0291.0020.0002] # SAURASHTRA DANDA +A8CF ; [*0292.0020.0002] # SAURASHTRA DOUBLE DANDA A8E0 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT ZERO A8E1 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT ONE A8E2 ; [.0000.0000.0000] # COMBINING DEVANAGARI DIGIT TWO @@ -4014,71 +4025,71 @@ A8EE ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER PA A8EF ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER RA A8F0 ; [.0000.0000.0000] # COMBINING DEVANAGARI LETTER VI A8F1 ; [.0000.0000.0000] # COMBINING DEVANAGARI SIGN AVAGRAHA -A8F8 ; [*03E8.0020.0002] # DEVANAGARI SIGN PUSHPIKA -A8F9 ; [*03E9.0020.0002] # DEVANAGARI GAP FILLER -A8FA ; [*03EA.0020.0002] # DEVANAGARI CARET -A8FC ; [*03EB.0020.0002] # DEVANAGARI SIGN SIDDHAM -A92E ; [*042E.0020.0002] # KAYAH LI SIGN CWI -A92F ; [*0298.0020.0002] # KAYAH LI SIGN SHYA -A95F ; [*02D8.0020.0002] # REJANG SECTION MARK -A9C1 ; [*02CD.0020.0002] # JAVANESE LEFT RERENGGAN -A9C2 ; [*02CE.0020.0002] # JAVANESE RIGHT RERENGGAN -A9C3 ; [*02CF.0020.0002] # JAVANESE PADA ANDAP -A9C4 ; [*02D0.0020.0002] # JAVANESE PADA MADYA -A9C5 ; [*02D1.0020.0002] # JAVANESE PADA LUHUR -A9C6 ; [*02D2.0020.0002] # JAVANESE PADA WINDU -A9C7 ; [*025B.0020.0002] # JAVANESE PADA PANGKAT -A9C8 ; [*02A3.0020.0002] # JAVANESE PADA LINGSA -A9C9 ; [*02A4.0020.0002] # JAVANESE PADA LUNGSI -A9CA ; [*02D3.0020.0002] # JAVANESE PADA ADEG -A9CB ; [*02D4.0020.0002] # JAVANESE PADA ADEG ADEG -A9CC ; [*02D5.0020.0002] # JAVANESE PADA PISELEH -A9CD ; [*02D6.0020.0002] # JAVANESE TURNED PADA PISELEH -A9DE ; [*042F.0020.0002] # JAVANESE PADA TIRTA TUMETES -A9DF ; [*0430.0020.0002] # JAVANESE PADA ISEN-ISEN -AA5C ; [*0431.0020.0002] # CHAM PUNCTUATION SPIRAL -AA5D ; [*02A5.0020.0002] # CHAM PUNCTUATION DANDA -AA5E ; [*02A6.0020.0002] # CHAM PUNCTUATION DOUBLE DANDA -AA5F ; [*02A7.0020.0002] # CHAM PUNCTUATION TRIPLE DANDA -AA77 ; [*054D.0020.0002] # MYANMAR SYMBOL AITON EXCLAMATION -AA78 ; [*054E.0020.0002] # MYANMAR SYMBOL AITON ONE -AA79 ; [*054F.0020.0002] # MYANMAR SYMBOL AITON TWO -AADE ; [*03F1.0020.0002] # TAI VIET SYMBOL HO HOI -AADF ; [*03F2.0020.0002] # TAI VIET SYMBOL KOI KOI -AAF0 ; [*02A8.0020.0002] # MEETEI MAYEK CHEIKHAN -AAF1 ; [*0272.0020.0002] # MEETEI MAYEK AHANG KHUDAM -AB5B ; [*04F5.0020.0002] # MODIFIER BREVE WITH INVERTED BREVE -ABEB ; [*02A9.0020.0002] # MEETEI MAYEK CHEIKHEI -FB29 ; [*0616.0020.0005] # HEBREW LETTER ALTERNATIVE PLUS SIGN -FBB2 ; [*0502.0020.0002] # ARABIC SYMBOL DOT ABOVE -FBB3 ; [*0503.0020.0002] # ARABIC SYMBOL DOT BELOW -FBB4 ; [*0504.0020.0002] # ARABIC SYMBOL TWO DOTS ABOVE -FBB5 ; [*0505.0020.0002] # ARABIC SYMBOL TWO DOTS BELOW -FBB6 ; [*0506.0020.0002] # ARABIC SYMBOL THREE DOTS ABOVE -FBB7 ; [*0507.0020.0002] # ARABIC SYMBOL THREE DOTS BELOW -FBB8 ; [*0508.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE -FBB9 ; [*0509.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW -FBBA ; [*050A.0020.0002] # ARABIC SYMBOL FOUR DOTS ABOVE -FBBB ; [*050B.0020.0002] # ARABIC SYMBOL FOUR DOTS BELOW -FBBC ; [*050C.0020.0002] # ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW -FBBD ; [*050D.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE -FBBE ; [*050E.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY BELOW -FBBF ; [*050F.0020.0002] # ARABIC SYMBOL RING -FBC0 ; [*0510.0020.0002] # ARABIC SYMBOL SMALL TAH ABOVE -FBC1 ; [*0511.0020.0002] # ARABIC SYMBOL SMALL TAH BELOW -FD3E ; [*0381.0020.0002] # ORNATE LEFT PARENTHESIS -FD3F ; [*0382.0020.0002] # ORNATE RIGHT PARENTHESIS -FDFD ; [*0501.0020.0002] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +A8F8 ; [*03ED.0020.0002] # DEVANAGARI SIGN PUSHPIKA +A8F9 ; [*03EE.0020.0002] # DEVANAGARI GAP FILLER +A8FA ; [*03EF.0020.0002] # DEVANAGARI CARET +A8FC ; [*03F0.0020.0002] # DEVANAGARI SIGN SIDDHAM +A92E ; [*0444.0020.0002] # KAYAH LI SIGN CWI +A92F ; [*0299.0020.0002] # KAYAH LI SIGN SHYA +A95F ; [*02D9.0020.0002] # REJANG SECTION MARK +A9C1 ; [*02CE.0020.0002] # JAVANESE LEFT RERENGGAN +A9C2 ; [*02CF.0020.0002] # JAVANESE RIGHT RERENGGAN +A9C3 ; [*02D0.0020.0002] # JAVANESE PADA ANDAP +A9C4 ; [*02D1.0020.0002] # JAVANESE PADA MADYA +A9C5 ; [*02D2.0020.0002] # JAVANESE PADA LUHUR +A9C6 ; [*02D3.0020.0002] # JAVANESE PADA WINDU +A9C7 ; [*025C.0020.0002] # JAVANESE PADA PANGKAT +A9C8 ; [*02A4.0020.0002] # JAVANESE PADA LINGSA +A9C9 ; [*02A5.0020.0002] # JAVANESE PADA LUNGSI +A9CA ; [*02D4.0020.0002] # JAVANESE PADA ADEG +A9CB ; [*02D5.0020.0002] # JAVANESE PADA ADEG ADEG +A9CC ; [*02D6.0020.0002] # JAVANESE PADA PISELEH +A9CD ; [*02D7.0020.0002] # JAVANESE TURNED PADA PISELEH +A9DE ; [*0445.0020.0002] # JAVANESE PADA TIRTA TUMETES +A9DF ; [*0446.0020.0002] # JAVANESE PADA ISEN-ISEN +AA5C ; [*0447.0020.0002] # CHAM PUNCTUATION SPIRAL +AA5D ; [*02A6.0020.0002] # CHAM PUNCTUATION DANDA +AA5E ; [*02A7.0020.0002] # CHAM PUNCTUATION DOUBLE DANDA +AA5F ; [*02A8.0020.0002] # CHAM PUNCTUATION TRIPLE DANDA +AA77 ; [*0563.0020.0002] # MYANMAR SYMBOL AITON EXCLAMATION +AA78 ; [*0564.0020.0002] # MYANMAR SYMBOL AITON ONE +AA79 ; [*0565.0020.0002] # MYANMAR SYMBOL AITON TWO +AADE ; [*03F7.0020.0002] # TAI VIET SYMBOL HO HOI +AADF ; [*03F8.0020.0002] # TAI VIET SYMBOL KOI KOI +AAF0 ; [*02A9.0020.0002] # MEETEI MAYEK CHEIKHAN +AAF1 ; [*0273.0020.0002] # MEETEI MAYEK AHANG KHUDAM +AB5B ; [*050B.0020.0002] # MODIFIER BREVE WITH INVERTED BREVE +ABEB ; [*02AA.0020.0002] # MEETEI MAYEK CHEIKHEI +FB29 ; [*062C.0020.0005] # HEBREW LETTER ALTERNATIVE PLUS SIGN +FBB2 ; [*0518.0020.0002] # ARABIC SYMBOL DOT ABOVE +FBB3 ; [*0519.0020.0002] # ARABIC SYMBOL DOT BELOW +FBB4 ; [*051A.0020.0002] # ARABIC SYMBOL TWO DOTS ABOVE +FBB5 ; [*051B.0020.0002] # ARABIC SYMBOL TWO DOTS BELOW +FBB6 ; [*051C.0020.0002] # ARABIC SYMBOL THREE DOTS ABOVE +FBB7 ; [*051D.0020.0002] # ARABIC SYMBOL THREE DOTS BELOW +FBB8 ; [*051E.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE +FBB9 ; [*051F.0020.0002] # ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW +FBBA ; [*0520.0020.0002] # ARABIC SYMBOL FOUR DOTS ABOVE +FBBB ; [*0521.0020.0002] # ARABIC SYMBOL FOUR DOTS BELOW +FBBC ; [*0522.0020.0002] # ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW +FBBD ; [*0523.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE +FBBE ; [*0524.0020.0002] # ARABIC SYMBOL TWO DOTS VERTICALLY BELOW +FBBF ; [*0525.0020.0002] # ARABIC SYMBOL RING +FBC0 ; [*0526.0020.0002] # ARABIC SYMBOL SMALL TAH ABOVE +FBC1 ; [*0527.0020.0002] # ARABIC SYMBOL SMALL TAH BELOW +FD3E ; [*0382.0020.0002] # ORNATE LEFT PARENTHESIS +FD3F ; [*0383.0020.0002] # ORNATE RIGHT PARENTHESIS +FDFD ; [*0517.0020.0002] # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM FE10 ; [*0222.0020.0016] # PRESENTATION FORM FOR VERTICAL COMMA FE11 ; [*0231.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA -FE12 ; [*028A.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP -FE13 ; [*0239.0020.0016] # PRESENTATION FORM FOR VERTICAL COLON +FE12 ; [*028B.0020.0016] # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13 ; [*023A.0020.0016] # PRESENTATION FORM FOR VERTICAL COLON FE14 ; [*0234.0020.0016] # PRESENTATION FORM FOR VERTICAL SEMICOLON -FE15 ; [*0260.0020.0016] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK -FE16 ; [*0266.0020.0016] # PRESENTATION FORM FOR VERTICAL QUESTION MARK -FE17 ; [*037B.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -FE18 ; [*037C.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -FE19 ; [*0277.0020.0016][*0277.0020.0016][*0277.0020.0016] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE15 ; [*0261.0020.0016] # PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +FE16 ; [*0267.0020.0016] # PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; [*037C.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; [*037D.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; [*0278.0020.0016][*0278.0020.0016][*0278.0020.0016] # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS FE21 ; [.0000.0000.0000] # COMBINING LIGATURE RIGHT HALF FE23 ; [.0000.0000.0000] # COMBINING DOUBLE TILDE RIGHT HALF FE24 ; [.0000.0000.0000] # COMBINING MACRON LEFT HALF @@ -4090,31 +4101,31 @@ FE2B ; [.0000.0000.0000] # COMBINING MACRON LEFT HALF BELOW FE2C ; [.0000.0000.0000] # COMBINING MACRON RIGHT HALF BELOW FE2D ; [.0000.0000.0000] # COMBINING CONJOINING MACRON BELOW FE2F ; [.0000.0000.0000] # COMBINING CYRILLIC TITLO RIGHT HALF -FE30 ; [*0277.0020.0016][*0277.0020.0016] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE30 ; [*0278.0020.0016][*0278.0020.0016] # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER FE31 ; [*0216.0020.0016] # PRESENTATION FORM FOR VERTICAL EM DASH FE32 ; [*0215.0020.0016] # PRESENTATION FORM FOR VERTICAL EN DASH FE33 ; [*020B.0020.0016] # PRESENTATION FORM FOR VERTICAL LOW LINE FE34 ; [*020B.0020.0016] # PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE35 ; [*0317.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; [*0318.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; [*031B.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; [*031C.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE39 ; [*0379.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3A ; [*037A.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3B ; [*0377.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3C ; [*0378.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3D ; [*0371.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3E ; [*0372.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE3F ; [*036F.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE40 ; [*0370.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE41 ; [*0373.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE42 ; [*0374.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE43 ; [*0375.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE44 ; [*0376.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE35 ; [*0318.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; [*0319.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; [*031C.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; [*031D.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; [*037A.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; [*037B.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; [*0378.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; [*0379.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; [*0372.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; [*0373.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; [*0370.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; [*0371.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; [*0374.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; [*0375.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; [*0376.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; [*0377.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET FE45 ; [*0232.0020.0002] # SESAME DOT FE46 ; [*0233.0020.0002] # WHITE SESAME DOT -FE47 ; [*0319.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; [*031A.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE47 ; [*031A.0020.0016] # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; [*031B.0020.0016] # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET FE49 ; [*020A.0020.0004] # DASHED OVERLINE FE4A ; [*020A.0020.0004] # CENTRELINE OVERLINE FE4B ; [*020A.0020.0004] # WAVY OVERLINE @@ -4124,487 +4135,487 @@ FE4E ; [*020B.0020.0004] # CENTRELINE LOW LINE FE4F ; [*020B.0020.0004] # WAVY LOW LINE FE50 ; [*0222.0020.000F] # SMALL COMMA FE51 ; [*0231.0020.000F] # SMALL IDEOGRAPHIC COMMA -FE52 ; [*0277.0020.000F] # SMALL FULL STOP +FE52 ; [*0278.0020.000F] # SMALL FULL STOP FE54 ; [*0234.0020.000F] # SMALL SEMICOLON -FE55 ; [*0239.0020.000F] # SMALL COLON -FE56 ; [*0266.0020.000F] # SMALL QUESTION MARK -FE57 ; [*0260.0020.000F] # SMALL EXCLAMATION MARK +FE55 ; [*023A.0020.000F] # SMALL COLON +FE56 ; [*0267.0020.000F] # SMALL QUESTION MARK +FE57 ; [*0261.0020.000F] # SMALL EXCLAMATION MARK FE58 ; [*0216.0020.000F] # SMALL EM DASH -FE59 ; [*0317.0020.000F] # SMALL LEFT PARENTHESIS -FE5A ; [*0318.0020.000F] # SMALL RIGHT PARENTHESIS -FE5B ; [*031B.0020.000F] # SMALL LEFT CURLY BRACKET -FE5C ; [*031C.0020.000F] # SMALL RIGHT CURLY BRACKET -FE5D ; [*0379.0020.000F] # SMALL LEFT TORTOISE SHELL BRACKET -FE5E ; [*037A.0020.000F] # SMALL RIGHT TORTOISE SHELL BRACKET -FE5F ; [*0398.0020.000F] # SMALL NUMBER SIGN -FE60 ; [*0396.0020.000F] # SMALL AMPERSAND -FE61 ; [*038F.0020.000F] # SMALL ASTERISK -FE62 ; [*0616.0020.000F] # SMALL PLUS SIGN +FE59 ; [*0318.0020.000F] # SMALL LEFT PARENTHESIS +FE5A ; [*0319.0020.000F] # SMALL RIGHT PARENTHESIS +FE5B ; [*031C.0020.000F] # SMALL LEFT CURLY BRACKET +FE5C ; [*031D.0020.000F] # SMALL RIGHT CURLY BRACKET +FE5D ; [*037A.0020.000F] # SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; [*037B.0020.000F] # SMALL RIGHT TORTOISE SHELL BRACKET +FE5F ; [*0399.0020.000F] # SMALL NUMBER SIGN +FE60 ; [*0397.0020.000F] # SMALL AMPERSAND +FE61 ; [*0390.0020.000F] # SMALL ASTERISK +FE62 ; [*062C.0020.000F] # SMALL PLUS SIGN FE63 ; [*020D.0020.000F] # SMALL HYPHEN-MINUS -FE64 ; [*061A.0020.000F] # SMALL LESS-THAN SIGN -FE65 ; [*061C.0020.000F] # SMALL GREATER-THAN SIGN -FE66 ; [*061B.0020.000F] # SMALL EQUALS SIGN -FE68 ; [*0395.0020.000F] # SMALL REVERSE SOLIDUS -FE6A ; [*0399.0020.000F] # SMALL PERCENT SIGN -FE6B ; [*038E.0020.000F] # SMALL COMMERCIAL AT +FE64 ; [*0630.0020.000F] # SMALL LESS-THAN SIGN +FE65 ; [*0632.0020.000F] # SMALL GREATER-THAN SIGN +FE66 ; [*0631.0020.000F] # SMALL EQUALS SIGN +FE68 ; [*0396.0020.000F] # SMALL REVERSE SOLIDUS +FE6A ; [*039A.0020.000F] # SMALL PERCENT SIGN +FE6B ; [*038F.0020.000F] # SMALL COMMERCIAL AT FE73 ; [.0000.0000.0000] # ARABIC TAIL FRAGMENT -FF01 ; [*0260.0020.0003] # FULLWIDTH EXCLAMATION MARK -FF02 ; [*030C.0020.0003] # FULLWIDTH QUOTATION MARK -FF03 ; [*0398.0020.0003] # FULLWIDTH NUMBER SIGN -FF05 ; [*0399.0020.0003] # FULLWIDTH PERCENT SIGN -FF06 ; [*0396.0020.0003] # FULLWIDTH AMPERSAND -FF07 ; [*0305.0020.0003] # FULLWIDTH APOSTROPHE -FF08 ; [*0317.0020.0003] # FULLWIDTH LEFT PARENTHESIS -FF09 ; [*0318.0020.0003] # FULLWIDTH RIGHT PARENTHESIS -FF0A ; [*038F.0020.0003] # FULLWIDTH ASTERISK -FF0B ; [*0616.0020.0003] # FULLWIDTH PLUS SIGN +FF01 ; [*0261.0020.0003] # FULLWIDTH EXCLAMATION MARK +FF02 ; [*030D.0020.0003] # FULLWIDTH QUOTATION MARK +FF03 ; [*0399.0020.0003] # FULLWIDTH NUMBER SIGN +FF05 ; [*039A.0020.0003] # FULLWIDTH PERCENT SIGN +FF06 ; [*0397.0020.0003] # FULLWIDTH AMPERSAND +FF07 ; [*0306.0020.0003] # FULLWIDTH APOSTROPHE +FF08 ; [*0318.0020.0003] # FULLWIDTH LEFT PARENTHESIS +FF09 ; [*0319.0020.0003] # FULLWIDTH RIGHT PARENTHESIS +FF0A ; [*0390.0020.0003] # FULLWIDTH ASTERISK +FF0B ; [*062C.0020.0003] # FULLWIDTH PLUS SIGN FF0C ; [*0222.0020.0003] # FULLWIDTH COMMA FF0D ; [*020D.0020.0003] # FULLWIDTH HYPHEN-MINUS -FF0E ; [*0277.0020.0003] # FULLWIDTH FULL STOP -FF0F ; [*0394.0020.0003] # FULLWIDTH SOLIDUS -FF1A ; [*0239.0020.0003] # FULLWIDTH COLON +FF0E ; [*0278.0020.0003] # FULLWIDTH FULL STOP +FF0F ; [*0395.0020.0003] # FULLWIDTH SOLIDUS +FF1A ; [*023A.0020.0003] # FULLWIDTH COLON FF1B ; [*0234.0020.0003] # FULLWIDTH SEMICOLON -FF1C ; [*061A.0020.0003] # FULLWIDTH LESS-THAN SIGN -FF1D ; [*061B.0020.0003] # FULLWIDTH EQUALS SIGN -FF1E ; [*061C.0020.0003] # FULLWIDTH GREATER-THAN SIGN -FF1F ; [*0266.0020.0003] # FULLWIDTH QUESTION MARK -FF20 ; [*038E.0020.0003] # FULLWIDTH COMMERCIAL AT -FF3B ; [*0319.0020.0003] # FULLWIDTH LEFT SQUARE BRACKET -FF3C ; [*0395.0020.0003] # FULLWIDTH REVERSE SOLIDUS -FF3D ; [*031A.0020.0003] # FULLWIDTH RIGHT SQUARE BRACKET -FF3E ; [*0485.0020.0003] # FULLWIDTH CIRCUMFLEX ACCENT +FF1C ; [*0630.0020.0003] # FULLWIDTH LESS-THAN SIGN +FF1D ; [*0631.0020.0003] # FULLWIDTH EQUALS SIGN +FF1E ; [*0632.0020.0003] # FULLWIDTH GREATER-THAN SIGN +FF1F ; [*0267.0020.0003] # FULLWIDTH QUESTION MARK +FF20 ; [*038F.0020.0003] # FULLWIDTH COMMERCIAL AT +FF3B ; [*031A.0020.0003] # FULLWIDTH LEFT SQUARE BRACKET +FF3C ; [*0396.0020.0003] # FULLWIDTH REVERSE SOLIDUS +FF3D ; [*031B.0020.0003] # FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; [*049B.0020.0003] # FULLWIDTH CIRCUMFLEX ACCENT FF3F ; [*020B.0020.0003] # FULLWIDTH LOW LINE -FF40 ; [*0482.0020.0003] # FULLWIDTH GRAVE ACCENT -FF5B ; [*031B.0020.0003] # FULLWIDTH LEFT CURLY BRACKET -FF5C ; [*061E.0020.0003] # FULLWIDTH VERTICAL LINE -FF5D ; [*031C.0020.0003] # FULLWIDTH RIGHT CURLY BRACKET -FF5E ; [*0620.0020.0003] # FULLWIDTH TILDE -FF5F ; [*032D.0020.0003] # FULLWIDTH LEFT WHITE PARENTHESIS -FF60 ; [*032E.0020.0003] # FULLWIDTH RIGHT WHITE PARENTHESIS -FF61 ; [*028A.0020.0012] # HALFWIDTH IDEOGRAPHIC FULL STOP -FF62 ; [*0373.0020.0012] # HALFWIDTH LEFT CORNER BRACKET -FF63 ; [*0374.0020.0012] # HALFWIDTH RIGHT CORNER BRACKET +FF40 ; [*0498.0020.0003] # FULLWIDTH GRAVE ACCENT +FF5B ; [*031C.0020.0003] # FULLWIDTH LEFT CURLY BRACKET +FF5C ; [*0634.0020.0003] # FULLWIDTH VERTICAL LINE +FF5D ; [*031D.0020.0003] # FULLWIDTH RIGHT CURLY BRACKET +FF5E ; [*0636.0020.0003] # FULLWIDTH TILDE +FF5F ; [*032E.0020.0003] # FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; [*032F.0020.0003] # FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; [*028B.0020.0012] # HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; [*0374.0020.0012] # HALFWIDTH LEFT CORNER BRACKET +FF63 ; [*0375.0020.0012] # HALFWIDTH RIGHT CORNER BRACKET FF64 ; [*0231.0020.0012] # HALFWIDTH IDEOGRAPHIC COMMA FF65 ; [*0221.0020.0012] # HALFWIDTH KATAKANA MIDDLE DOT -FFE2 ; [*061D.0020.0003] # FULLWIDTH NOT SIGN -FFE3 ; [*0486.0020.0003] # FULLWIDTH MACRON -FFE4 ; [*061F.0020.0003] # FULLWIDTH BROKEN BAR -FFE8 ; [*081A.0020.0012] # HALFWIDTH FORMS LIGHT VERTICAL -FFE9 ; [*059C.0020.0012] # HALFWIDTH LEFTWARDS ARROW -FFEA ; [*059E.0020.0012] # HALFWIDTH UPWARDS ARROW -FFEB ; [*059D.0020.0012] # HALFWIDTH RIGHTWARDS ARROW -FFEC ; [*059F.0020.0012] # HALFWIDTH DOWNWARDS ARROW -FFED ; [*08B8.0020.0012] # HALFWIDTH BLACK SQUARE -FFEE ; [*08E3.0020.0012] # HALFWIDTH WHITE CIRCLE -FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER -10100 ; [*02FA.0020.0002] # AEGEAN WORD SEPARATOR LINE -10101 ; [*02FB.0020.0002] # AEGEAN WORD SEPARATOR DOT -10102 ; [*02FC.0020.0002] # AEGEAN CHECK MARK -10110 ; [*1AE9.0020.0002] # AEGEAN NUMBER TEN -10111 ; [*1AEA.0020.0002] # AEGEAN NUMBER TWENTY -10112 ; [*1AEB.0020.0002] # AEGEAN NUMBER THIRTY -10113 ; [*1AEC.0020.0002] # AEGEAN NUMBER FORTY -10114 ; [*1AED.0020.0002] # AEGEAN NUMBER FIFTY -10115 ; [*1AEE.0020.0002] # AEGEAN NUMBER SIXTY -10116 ; [*1AEF.0020.0002] # AEGEAN NUMBER SEVENTY -10117 ; [*1AF0.0020.0002] # AEGEAN NUMBER EIGHTY -10118 ; [*1AF1.0020.0002] # AEGEAN NUMBER NINETY -10119 ; [*1AF2.0020.0002] # AEGEAN NUMBER ONE HUNDRED -1011A ; [*1AF3.0020.0002] # AEGEAN NUMBER TWO HUNDRED -1011B ; [*1AF4.0020.0002] # AEGEAN NUMBER THREE HUNDRED -1011C ; [*1AF5.0020.0002] # AEGEAN NUMBER FOUR HUNDRED -1011D ; [*1AF6.0020.0002] # AEGEAN NUMBER FIVE HUNDRED -1011E ; [*1AF7.0020.0002] # AEGEAN NUMBER SIX HUNDRED -1011F ; [*1AF8.0020.0002] # AEGEAN NUMBER SEVEN HUNDRED -10120 ; [*1AF9.0020.0002] # AEGEAN NUMBER EIGHT HUNDRED -10121 ; [*1AFA.0020.0002] # AEGEAN NUMBER NINE HUNDRED -10122 ; [*1AFB.0020.0002] # AEGEAN NUMBER ONE THOUSAND -10123 ; [*1AFC.0020.0002] # AEGEAN NUMBER TWO THOUSAND -10124 ; [*1AFD.0020.0002] # AEGEAN NUMBER THREE THOUSAND -10125 ; [*1AFE.0020.0002] # AEGEAN NUMBER FOUR THOUSAND -10126 ; [*1AFF.0020.0002] # AEGEAN NUMBER FIVE THOUSAND -10127 ; [*1B00.0020.0002] # AEGEAN NUMBER SIX THOUSAND -10128 ; [*1B01.0020.0002] # AEGEAN NUMBER SEVEN THOUSAND -10129 ; [*1B02.0020.0002] # AEGEAN NUMBER EIGHT THOUSAND -1012A ; [*1B03.0020.0002] # AEGEAN NUMBER NINE THOUSAND -1012B ; [*1B04.0020.0002] # AEGEAN NUMBER TEN THOUSAND -1012C ; [*1B05.0020.0002] # AEGEAN NUMBER TWENTY THOUSAND -1012D ; [*1B06.0020.0002] # AEGEAN NUMBER THIRTY THOUSAND -1012E ; [*1B07.0020.0002] # AEGEAN NUMBER FORTY THOUSAND -1012F ; [*1B08.0020.0002] # AEGEAN NUMBER FIFTY THOUSAND -10130 ; [*1B09.0020.0002] # AEGEAN NUMBER SIXTY THOUSAND -10131 ; [*1B0A.0020.0002] # AEGEAN NUMBER SEVENTY THOUSAND -10132 ; [*1B0B.0020.0002] # AEGEAN NUMBER EIGHTY THOUSAND -10133 ; [*1B0C.0020.0002] # AEGEAN NUMBER NINETY THOUSAND -10137 ; [*0F78.0020.0002] # AEGEAN WEIGHT BASE UNIT -10138 ; [*0F79.0020.0002] # AEGEAN WEIGHT FIRST SUBUNIT -10139 ; [*0F7A.0020.0002] # AEGEAN WEIGHT SECOND SUBUNIT -1013A ; [*0F7B.0020.0002] # AEGEAN WEIGHT THIRD SUBUNIT -1013B ; [*0F7C.0020.0002] # AEGEAN WEIGHT FOURTH SUBUNIT -1013C ; [*0F7D.0020.0002] # AEGEAN DRY MEASURE FIRST SUBUNIT -1013D ; [*0F7E.0020.0002] # AEGEAN LIQUID MEASURE FIRST SUBUNIT -1013E ; [*0F7F.0020.0002] # AEGEAN MEASURE SECOND SUBUNIT -1013F ; [*0F80.0020.0002] # AEGEAN MEASURE THIRD SUBUNIT -10140 ; [*1B0D.0020.0002] # GREEK ACROPHONIC ATTIC ONE QUARTER -10141 ; [*1B0E.0020.0002] # GREEK ACROPHONIC ATTIC ONE HALF -10144 ; [*1B0F.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY -10145 ; [*1B10.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED -10146 ; [*1B11.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND -10147 ; [*1B12.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND -10149 ; [*1B13.0020.0002] # GREEK ACROPHONIC ATTIC TEN TALENTS -1014A ; [*1B14.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY TALENTS -1014B ; [*1B15.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS -1014C ; [*1B16.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS -1014D ; [*1B17.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS -1014E ; [*1B18.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS -10150 ; [*1B19.0020.0002] # GREEK ACROPHONIC ATTIC TEN STATERS -10151 ; [*1B1A.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY STATERS -10152 ; [*1B1B.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS -10153 ; [*1B1C.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS -10154 ; [*1B1D.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS -10155 ; [*1B1E.0020.0002] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS -10156 ; [*1B1F.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS -10157 ; [*1B20.0020.0002] # GREEK ACROPHONIC ATTIC TEN MNAS -10160 ; [*1B21.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN -10161 ; [*1B22.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM -10162 ; [*1B23.0020.0002] # GREEK ACROPHONIC HERMIONIAN TEN -10163 ; [*1B24.0020.0002] # GREEK ACROPHONIC MESSENIAN TEN -10164 ; [*1B25.0020.0002] # GREEK ACROPHONIC THESPIAN TEN -10165 ; [*1B26.0020.0002] # GREEK ACROPHONIC THESPIAN THIRTY -10166 ; [*1B27.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY -10167 ; [*1B28.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM -10168 ; [*1B29.0020.0002] # GREEK ACROPHONIC HERMIONIAN FIFTY -10169 ; [*1B2A.0020.0002] # GREEK ACROPHONIC THESPIAN FIFTY -1016A ; [*1B2B.0020.0002] # GREEK ACROPHONIC THESPIAN ONE HUNDRED -1016B ; [*1B2C.0020.0002] # GREEK ACROPHONIC THESPIAN THREE HUNDRED -1016C ; [*1B2D.0020.0002] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED -1016D ; [*1B2E.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED -1016E ; [*1B2F.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED -1016F ; [*1B30.0020.0002] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED -10170 ; [*1B31.0020.0002] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED -10171 ; [*1B32.0020.0002] # GREEK ACROPHONIC THESPIAN ONE THOUSAND -10172 ; [*1B33.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND -10174 ; [*1B34.0020.0002] # GREEK ACROPHONIC STRATIAN FIFTY MNAS -10175 ; [*1B35.0020.0002] # GREEK ONE HALF SIGN -10176 ; [*1B36.0020.0002] # GREEK ONE HALF SIGN ALTERNATE FORM -10177 ; [*1B37.0020.0002] # GREEK TWO THIRDS SIGN -10178 ; [*1B38.0020.0002] # GREEK THREE QUARTERS SIGN -10179 ; [*0F81.0020.0002] # GREEK YEAR SIGN -1017A ; [*0F82.0020.0002] # GREEK TALENT SIGN -1017B ; [*0F83.0020.0002] # GREEK DRACHMA SIGN -1017C ; [*0F84.0020.0002] # GREEK OBOL SIGN -1017D ; [*0F85.0020.0002] # GREEK TWO OBOLS SIGN -1017E ; [*0F86.0020.0002] # GREEK THREE OBOLS SIGN -1017F ; [*0F87.0020.0002] # GREEK FOUR OBOLS SIGN -10180 ; [*0F88.0020.0002] # GREEK FIVE OBOLS SIGN -10181 ; [*0F89.0020.0002] # GREEK METRETES SIGN -10182 ; [*0F8A.0020.0002] # GREEK KYATHOS BASE SIGN -10183 ; [*0F8B.0020.0002] # GREEK LITRA SIGN -10184 ; [*0F8C.0020.0002] # GREEK OUNKIA SIGN -10185 ; [*0F8D.0020.0002] # GREEK XESTES SIGN -10186 ; [*0F8E.0020.0002] # GREEK ARTABE SIGN -10187 ; [*0F8F.0020.0002] # GREEK AROURA SIGN -10188 ; [*0F90.0020.0002] # GREEK GRAMMA SIGN -10189 ; [*0F91.0020.0002] # GREEK TRYBLION BASE SIGN -1018B ; [*1B39.0020.0002] # GREEK ONE QUARTER SIGN -1018C ; [*0F92.0020.0002] # GREEK SINUSOID SIGN -1018D ; [*0F93.0020.0002] # GREEK INDICTION SIGN -1018E ; [*0F94.0020.0002] # NOMISMA SIGN -10190 ; [*0F95.0020.0002] # ROMAN SEXTANS SIGN -10191 ; [*0F96.0020.0002] # ROMAN UNCIA SIGN -10192 ; [*0F97.0020.0002] # ROMAN SEMUNCIA SIGN -10193 ; [*0F98.0020.0002] # ROMAN SEXTULA SIGN -10194 ; [*0F99.0020.0002] # ROMAN DIMIDIA SEXTULA SIGN -10195 ; [*0F9A.0020.0002] # ROMAN SILIQUA SIGN -10196 ; [*0F9B.0020.0002] # ROMAN DENARIUS SIGN -10197 ; [*0F9C.0020.0002] # ROMAN QUINARIUS SIGN -10198 ; [*0F9D.0020.0002] # ROMAN SESTERTIUS SIGN -10199 ; [*0F9E.0020.0002] # ROMAN DUPONDIUS SIGN -1019A ; [*0F9F.0020.0002] # ROMAN AS SIGN -1019B ; [*0FA0.0020.0002] # ROMAN CENTURIAL SIGN -101A0 ; [*0FA1.0020.0002] # GREEK SYMBOL TAU RHO -101D0 ; [*0FA2.0020.0002] # PHAISTOS DISC SIGN PEDESTRIAN -101D1 ; [*0FA3.0020.0002] # PHAISTOS DISC SIGN PLUMED HEAD -101D2 ; [*0FA4.0020.0002] # PHAISTOS DISC SIGN TATTOOED HEAD -101D3 ; [*0FA5.0020.0002] # PHAISTOS DISC SIGN CAPTIVE -101D4 ; [*0FA6.0020.0002] # PHAISTOS DISC SIGN CHILD -101D5 ; [*0FA7.0020.0002] # PHAISTOS DISC SIGN WOMAN -101D6 ; [*0FA8.0020.0002] # PHAISTOS DISC SIGN HELMET -101D7 ; [*0FA9.0020.0002] # PHAISTOS DISC SIGN GAUNTLET -101D8 ; [*0FAA.0020.0002] # PHAISTOS DISC SIGN TIARA -101D9 ; [*0FAB.0020.0002] # PHAISTOS DISC SIGN ARROW -101DA ; [*0FAC.0020.0002] # PHAISTOS DISC SIGN BOW -101DB ; [*0FAD.0020.0002] # PHAISTOS DISC SIGN SHIELD -101DC ; [*0FAE.0020.0002] # PHAISTOS DISC SIGN CLUB -101DD ; [*0FAF.0020.0002] # PHAISTOS DISC SIGN MANACLES -101DE ; [*0FB0.0020.0002] # PHAISTOS DISC SIGN MATTOCK -101DF ; [*0FB1.0020.0002] # PHAISTOS DISC SIGN SAW -101E0 ; [*0FB2.0020.0002] # PHAISTOS DISC SIGN LID -101E1 ; [*0FB3.0020.0002] # PHAISTOS DISC SIGN BOOMERANG -101E2 ; [*0FB4.0020.0002] # PHAISTOS DISC SIGN CARPENTRY PLANE -101E3 ; [*0FB5.0020.0002] # PHAISTOS DISC SIGN DOLIUM -101E4 ; [*0FB6.0020.0002] # PHAISTOS DISC SIGN COMB -101E5 ; [*0FB7.0020.0002] # PHAISTOS DISC SIGN SLING -101E6 ; [*0FB8.0020.0002] # PHAISTOS DISC SIGN COLUMN -101E7 ; [*0FB9.0020.0002] # PHAISTOS DISC SIGN BEEHIVE -101E8 ; [*0FBA.0020.0002] # PHAISTOS DISC SIGN SHIP -101E9 ; [*0FBB.0020.0002] # PHAISTOS DISC SIGN HORN -101EA ; [*0FBC.0020.0002] # PHAISTOS DISC SIGN HIDE -101EB ; [*0FBD.0020.0002] # PHAISTOS DISC SIGN BULLS LEG -101EC ; [*0FBE.0020.0002] # PHAISTOS DISC SIGN CAT -101ED ; [*0FBF.0020.0002] # PHAISTOS DISC SIGN RAM -101EE ; [*0FC0.0020.0002] # PHAISTOS DISC SIGN EAGLE -101EF ; [*0FC1.0020.0002] # PHAISTOS DISC SIGN DOVE -101F0 ; [*0FC2.0020.0002] # PHAISTOS DISC SIGN TUNNY -101F1 ; [*0FC3.0020.0002] # PHAISTOS DISC SIGN BEE -101F2 ; [*0FC4.0020.0002] # PHAISTOS DISC SIGN PLANE TREE -101F3 ; [*0FC5.0020.0002] # PHAISTOS DISC SIGN VINE -101F4 ; [*0FC6.0020.0002] # PHAISTOS DISC SIGN PAPYRUS -101F5 ; [*0FC7.0020.0002] # PHAISTOS DISC SIGN ROSETTE -101F6 ; [*0FC8.0020.0002] # PHAISTOS DISC SIGN LILY -101F7 ; [*0FC9.0020.0002] # PHAISTOS DISC SIGN OX BACK -101F8 ; [*0FCA.0020.0002] # PHAISTOS DISC SIGN FLUTE -101F9 ; [*0FCB.0020.0002] # PHAISTOS DISC SIGN GRATER -101FA ; [*0FCC.0020.0002] # PHAISTOS DISC SIGN STRAINER -101FB ; [*0FCD.0020.0002] # PHAISTOS DISC SIGN SMALL AXE -101FC ; [*0FCE.0020.0002] # PHAISTOS DISC SIGN WAVY BAND +FFE2 ; [*0633.0020.0003] # FULLWIDTH NOT SIGN +FFE3 ; [*049C.0020.0003] # FULLWIDTH MACRON +FFE4 ; [*0635.0020.0003] # FULLWIDTH BROKEN BAR +FFE8 ; [*0831.0020.0012] # HALFWIDTH FORMS LIGHT VERTICAL +FFE9 ; [*05B2.0020.0012] # HALFWIDTH LEFTWARDS ARROW +FFEA ; [*05B4.0020.0012] # HALFWIDTH UPWARDS ARROW +FFEB ; [*05B3.0020.0012] # HALFWIDTH RIGHTWARDS ARROW +FFEC ; [*05B5.0020.0012] # HALFWIDTH DOWNWARDS ARROW +FFED ; [*08CF.0020.0012] # HALFWIDTH BLACK SQUARE +FFEE ; [*08FA.0020.0012] # HALFWIDTH WHITE CIRCLE +FFFC ; [*1AF9.0020.0002] # OBJECT REPLACEMENT CHARACTER +10100 ; [*02FB.0020.0002] # AEGEAN WORD SEPARATOR LINE +10101 ; [*02FC.0020.0002] # AEGEAN WORD SEPARATOR DOT +10102 ; [*02FD.0020.0002] # AEGEAN CHECK MARK +10110 ; [*1B4D.0020.0002] # AEGEAN NUMBER TEN +10111 ; [*1B4E.0020.0002] # AEGEAN NUMBER TWENTY +10112 ; [*1B4F.0020.0002] # AEGEAN NUMBER THIRTY +10113 ; [*1B50.0020.0002] # AEGEAN NUMBER FORTY +10114 ; [*1B51.0020.0002] # AEGEAN NUMBER FIFTY +10115 ; [*1B52.0020.0002] # AEGEAN NUMBER SIXTY +10116 ; [*1B53.0020.0002] # AEGEAN NUMBER SEVENTY +10117 ; [*1B54.0020.0002] # AEGEAN NUMBER EIGHTY +10118 ; [*1B55.0020.0002] # AEGEAN NUMBER NINETY +10119 ; [*1B56.0020.0002] # AEGEAN NUMBER ONE HUNDRED +1011A ; [*1B57.0020.0002] # AEGEAN NUMBER TWO HUNDRED +1011B ; [*1B58.0020.0002] # AEGEAN NUMBER THREE HUNDRED +1011C ; [*1B59.0020.0002] # AEGEAN NUMBER FOUR HUNDRED +1011D ; [*1B5A.0020.0002] # AEGEAN NUMBER FIVE HUNDRED +1011E ; [*1B5B.0020.0002] # AEGEAN NUMBER SIX HUNDRED +1011F ; [*1B5C.0020.0002] # AEGEAN NUMBER SEVEN HUNDRED +10120 ; [*1B5D.0020.0002] # AEGEAN NUMBER EIGHT HUNDRED +10121 ; [*1B5E.0020.0002] # AEGEAN NUMBER NINE HUNDRED +10122 ; [*1B5F.0020.0002] # AEGEAN NUMBER ONE THOUSAND +10123 ; [*1B60.0020.0002] # AEGEAN NUMBER TWO THOUSAND +10124 ; [*1B61.0020.0002] # AEGEAN NUMBER THREE THOUSAND +10125 ; [*1B62.0020.0002] # AEGEAN NUMBER FOUR THOUSAND +10126 ; [*1B63.0020.0002] # AEGEAN NUMBER FIVE THOUSAND +10127 ; [*1B64.0020.0002] # AEGEAN NUMBER SIX THOUSAND +10128 ; [*1B65.0020.0002] # AEGEAN NUMBER SEVEN THOUSAND +10129 ; [*1B66.0020.0002] # AEGEAN NUMBER EIGHT THOUSAND +1012A ; [*1B67.0020.0002] # AEGEAN NUMBER NINE THOUSAND +1012B ; [*1B68.0020.0002] # AEGEAN NUMBER TEN THOUSAND +1012C ; [*1B69.0020.0002] # AEGEAN NUMBER TWENTY THOUSAND +1012D ; [*1B6A.0020.0002] # AEGEAN NUMBER THIRTY THOUSAND +1012E ; [*1B6B.0020.0002] # AEGEAN NUMBER FORTY THOUSAND +1012F ; [*1B6C.0020.0002] # AEGEAN NUMBER FIFTY THOUSAND +10130 ; [*1B6D.0020.0002] # AEGEAN NUMBER SIXTY THOUSAND +10131 ; [*1B6E.0020.0002] # AEGEAN NUMBER SEVENTY THOUSAND +10132 ; [*1B6F.0020.0002] # AEGEAN NUMBER EIGHTY THOUSAND +10133 ; [*1B70.0020.0002] # AEGEAN NUMBER NINETY THOUSAND +10137 ; [*0F90.0020.0002] # AEGEAN WEIGHT BASE UNIT +10138 ; [*0F91.0020.0002] # AEGEAN WEIGHT FIRST SUBUNIT +10139 ; [*0F92.0020.0002] # AEGEAN WEIGHT SECOND SUBUNIT +1013A ; [*0F93.0020.0002] # AEGEAN WEIGHT THIRD SUBUNIT +1013B ; [*0F94.0020.0002] # AEGEAN WEIGHT FOURTH SUBUNIT +1013C ; [*0F95.0020.0002] # AEGEAN DRY MEASURE FIRST SUBUNIT +1013D ; [*0F96.0020.0002] # AEGEAN LIQUID MEASURE FIRST SUBUNIT +1013E ; [*0F97.0020.0002] # AEGEAN MEASURE SECOND SUBUNIT +1013F ; [*0F98.0020.0002] # AEGEAN MEASURE THIRD SUBUNIT +10140 ; [*1B71.0020.0002] # GREEK ACROPHONIC ATTIC ONE QUARTER +10141 ; [*1B72.0020.0002] # GREEK ACROPHONIC ATTIC ONE HALF +10144 ; [*1B73.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY +10145 ; [*1B74.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED +10146 ; [*1B75.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND +10147 ; [*1B76.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND +10149 ; [*1B77.0020.0002] # GREEK ACROPHONIC ATTIC TEN TALENTS +1014A ; [*1B78.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY TALENTS +1014B ; [*1B79.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS +1014C ; [*1B7A.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS +1014D ; [*1B7B.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS +1014E ; [*1B7C.0020.0002] # GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS +10150 ; [*1B7D.0020.0002] # GREEK ACROPHONIC ATTIC TEN STATERS +10151 ; [*1B7E.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY STATERS +10152 ; [*1B7F.0020.0002] # GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS +10153 ; [*1B80.0020.0002] # GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS +10154 ; [*1B81.0020.0002] # GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS +10155 ; [*1B82.0020.0002] # GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS +10156 ; [*1B83.0020.0002] # GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS +10157 ; [*1B84.0020.0002] # GREEK ACROPHONIC ATTIC TEN MNAS +10160 ; [*1B85.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN +10161 ; [*1B86.0020.0002] # GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM +10162 ; [*1B87.0020.0002] # GREEK ACROPHONIC HERMIONIAN TEN +10163 ; [*1B88.0020.0002] # GREEK ACROPHONIC MESSENIAN TEN +10164 ; [*1B89.0020.0002] # GREEK ACROPHONIC THESPIAN TEN +10165 ; [*1B8A.0020.0002] # GREEK ACROPHONIC THESPIAN THIRTY +10166 ; [*1B8B.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY +10167 ; [*1B8C.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM +10168 ; [*1B8D.0020.0002] # GREEK ACROPHONIC HERMIONIAN FIFTY +10169 ; [*1B8E.0020.0002] # GREEK ACROPHONIC THESPIAN FIFTY +1016A ; [*1B8F.0020.0002] # GREEK ACROPHONIC THESPIAN ONE HUNDRED +1016B ; [*1B90.0020.0002] # GREEK ACROPHONIC THESPIAN THREE HUNDRED +1016C ; [*1B91.0020.0002] # GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED +1016D ; [*1B92.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED +1016E ; [*1B93.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE HUNDRED +1016F ; [*1B94.0020.0002] # GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED +10170 ; [*1B95.0020.0002] # GREEK ACROPHONIC NAXIAN FIVE HUNDRED +10171 ; [*1B96.0020.0002] # GREEK ACROPHONIC THESPIAN ONE THOUSAND +10172 ; [*1B97.0020.0002] # GREEK ACROPHONIC THESPIAN FIVE THOUSAND +10174 ; [*1B98.0020.0002] # GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175 ; [*1B99.0020.0002] # GREEK ONE HALF SIGN +10176 ; [*1B9A.0020.0002] # GREEK ONE HALF SIGN ALTERNATE FORM +10177 ; [*1B9B.0020.0002] # GREEK TWO THIRDS SIGN +10178 ; [*1B9C.0020.0002] # GREEK THREE QUARTERS SIGN +10179 ; [*0F99.0020.0002] # GREEK YEAR SIGN +1017A ; [*0F9A.0020.0002] # GREEK TALENT SIGN +1017B ; [*0F9B.0020.0002] # GREEK DRACHMA SIGN +1017C ; [*0F9C.0020.0002] # GREEK OBOL SIGN +1017D ; [*0F9D.0020.0002] # GREEK TWO OBOLS SIGN +1017E ; [*0F9E.0020.0002] # GREEK THREE OBOLS SIGN +1017F ; [*0F9F.0020.0002] # GREEK FOUR OBOLS SIGN +10180 ; [*0FA0.0020.0002] # GREEK FIVE OBOLS SIGN +10181 ; [*0FA1.0020.0002] # GREEK METRETES SIGN +10182 ; [*0FA2.0020.0002] # GREEK KYATHOS BASE SIGN +10183 ; [*0FA3.0020.0002] # GREEK LITRA SIGN +10184 ; [*0FA4.0020.0002] # GREEK OUNKIA SIGN +10185 ; [*0FA5.0020.0002] # GREEK XESTES SIGN +10186 ; [*0FA6.0020.0002] # GREEK ARTABE SIGN +10187 ; [*0FA7.0020.0002] # GREEK AROURA SIGN +10188 ; [*0FA8.0020.0002] # GREEK GRAMMA SIGN +10189 ; [*0FA9.0020.0002] # GREEK TRYBLION BASE SIGN +1018B ; [*1B9D.0020.0002] # GREEK ONE QUARTER SIGN +1018C ; [*0FAA.0020.0002] # GREEK SINUSOID SIGN +1018D ; [*0FAB.0020.0002] # GREEK INDICTION SIGN +1018E ; [*0FAC.0020.0002] # NOMISMA SIGN +10190 ; [*0FAD.0020.0002] # ROMAN SEXTANS SIGN +10191 ; [*0FAE.0020.0002] # ROMAN UNCIA SIGN +10192 ; [*0FAF.0020.0002] # ROMAN SEMUNCIA SIGN +10193 ; [*0FB0.0020.0002] # ROMAN SEXTULA SIGN +10194 ; [*0FB1.0020.0002] # ROMAN DIMIDIA SEXTULA SIGN +10195 ; [*0FB2.0020.0002] # ROMAN SILIQUA SIGN +10196 ; [*0FB3.0020.0002] # ROMAN DENARIUS SIGN +10197 ; [*0FB4.0020.0002] # ROMAN QUINARIUS SIGN +10198 ; [*0FB5.0020.0002] # ROMAN SESTERTIUS SIGN +10199 ; [*0FB6.0020.0002] # ROMAN DUPONDIUS SIGN +1019A ; [*0FB7.0020.0002] # ROMAN AS SIGN +1019B ; [*0FB8.0020.0002] # ROMAN CENTURIAL SIGN +101A0 ; [*0FB9.0020.0002] # GREEK SYMBOL TAU RHO +101D0 ; [*0FBA.0020.0002] # PHAISTOS DISC SIGN PEDESTRIAN +101D1 ; [*0FBB.0020.0002] # PHAISTOS DISC SIGN PLUMED HEAD +101D2 ; [*0FBC.0020.0002] # PHAISTOS DISC SIGN TATTOOED HEAD +101D3 ; [*0FBD.0020.0002] # PHAISTOS DISC SIGN CAPTIVE +101D4 ; [*0FBE.0020.0002] # PHAISTOS DISC SIGN CHILD +101D5 ; [*0FBF.0020.0002] # PHAISTOS DISC SIGN WOMAN +101D6 ; [*0FC0.0020.0002] # PHAISTOS DISC SIGN HELMET +101D7 ; [*0FC1.0020.0002] # PHAISTOS DISC SIGN GAUNTLET +101D8 ; [*0FC2.0020.0002] # PHAISTOS DISC SIGN TIARA +101D9 ; [*0FC3.0020.0002] # PHAISTOS DISC SIGN ARROW +101DA ; [*0FC4.0020.0002] # PHAISTOS DISC SIGN BOW +101DB ; [*0FC5.0020.0002] # PHAISTOS DISC SIGN SHIELD +101DC ; [*0FC6.0020.0002] # PHAISTOS DISC SIGN CLUB +101DD ; [*0FC7.0020.0002] # PHAISTOS DISC SIGN MANACLES +101DE ; [*0FC8.0020.0002] # PHAISTOS DISC SIGN MATTOCK +101DF ; [*0FC9.0020.0002] # PHAISTOS DISC SIGN SAW +101E0 ; [*0FCA.0020.0002] # PHAISTOS DISC SIGN LID +101E1 ; [*0FCB.0020.0002] # PHAISTOS DISC SIGN BOOMERANG +101E2 ; [*0FCC.0020.0002] # PHAISTOS DISC SIGN CARPENTRY PLANE +101E3 ; [*0FCD.0020.0002] # PHAISTOS DISC SIGN DOLIUM +101E4 ; [*0FCE.0020.0002] # PHAISTOS DISC SIGN COMB +101E5 ; [*0FCF.0020.0002] # PHAISTOS DISC SIGN SLING +101E6 ; [*0FD0.0020.0002] # PHAISTOS DISC SIGN COLUMN +101E7 ; [*0FD1.0020.0002] # PHAISTOS DISC SIGN BEEHIVE +101E8 ; [*0FD2.0020.0002] # PHAISTOS DISC SIGN SHIP +101E9 ; [*0FD3.0020.0002] # PHAISTOS DISC SIGN HORN +101EA ; [*0FD4.0020.0002] # PHAISTOS DISC SIGN HIDE +101EB ; [*0FD5.0020.0002] # PHAISTOS DISC SIGN BULLS LEG +101EC ; [*0FD6.0020.0002] # PHAISTOS DISC SIGN CAT +101ED ; [*0FD7.0020.0002] # PHAISTOS DISC SIGN RAM +101EE ; [*0FD8.0020.0002] # PHAISTOS DISC SIGN EAGLE +101EF ; [*0FD9.0020.0002] # PHAISTOS DISC SIGN DOVE +101F0 ; [*0FDA.0020.0002] # PHAISTOS DISC SIGN TUNNY +101F1 ; [*0FDB.0020.0002] # PHAISTOS DISC SIGN BEE +101F2 ; [*0FDC.0020.0002] # PHAISTOS DISC SIGN PLANE TREE +101F3 ; [*0FDD.0020.0002] # PHAISTOS DISC SIGN VINE +101F4 ; [*0FDE.0020.0002] # PHAISTOS DISC SIGN PAPYRUS +101F5 ; [*0FDF.0020.0002] # PHAISTOS DISC SIGN ROSETTE +101F6 ; [*0FE0.0020.0002] # PHAISTOS DISC SIGN LILY +101F7 ; [*0FE1.0020.0002] # PHAISTOS DISC SIGN OX BACK +101F8 ; [*0FE2.0020.0002] # PHAISTOS DISC SIGN FLUTE +101F9 ; [*0FE3.0020.0002] # PHAISTOS DISC SIGN GRATER +101FA ; [*0FE4.0020.0002] # PHAISTOS DISC SIGN STRAINER +101FB ; [*0FE5.0020.0002] # PHAISTOS DISC SIGN SMALL AXE +101FC ; [*0FE6.0020.0002] # PHAISTOS DISC SIGN WAVY BAND 102E0 ; [.0000.0000.0000] # COPTIC EPACT THOUSANDS MARK -102EA ; [*1B3A.0020.0002] # COPTIC EPACT NUMBER TEN -102EB ; [*1B3B.0020.0002] # COPTIC EPACT NUMBER TWENTY -102EC ; [*1B3C.0020.0002] # COPTIC EPACT NUMBER THIRTY -102ED ; [*1B3D.0020.0002] # COPTIC EPACT NUMBER FORTY -102EE ; [*1B3E.0020.0002] # COPTIC EPACT NUMBER FIFTY -102EF ; [*1B3F.0020.0002] # COPTIC EPACT NUMBER SIXTY -102F0 ; [*1B40.0020.0002] # COPTIC EPACT NUMBER SEVENTY -102F1 ; [*1B41.0020.0002] # COPTIC EPACT NUMBER EIGHTY -102F2 ; [*1B42.0020.0002] # COPTIC EPACT NUMBER NINETY -102F3 ; [*1B43.0020.0002] # COPTIC EPACT NUMBER ONE HUNDRED -102F4 ; [*1B44.0020.0002] # COPTIC EPACT NUMBER TWO HUNDRED -102F5 ; [*1B45.0020.0002] # COPTIC EPACT NUMBER THREE HUNDRED -102F6 ; [*1B46.0020.0002] # COPTIC EPACT NUMBER FOUR HUNDRED -102F7 ; [*1B47.0020.0002] # COPTIC EPACT NUMBER FIVE HUNDRED -102F8 ; [*1B48.0020.0002] # COPTIC EPACT NUMBER SIX HUNDRED -102F9 ; [*1B49.0020.0002] # COPTIC EPACT NUMBER SEVEN HUNDRED -102FA ; [*1B4A.0020.0002] # COPTIC EPACT NUMBER EIGHT HUNDRED -102FB ; [*1B4B.0020.0002] # COPTIC EPACT NUMBER NINE HUNDRED -10322 ; [*1AE3.0020.0002] # OLD ITALIC NUMERAL TEN -10323 ; [*1AE4.0020.0002] # OLD ITALIC NUMERAL FIFTY -1039F ; [*02FD.0020.0002] # UGARITIC WORD DIVIDER -103D0 ; [*02FE.0020.0002] # OLD PERSIAN WORD DIVIDER -103D3 ; [*1B4C.0020.0002] # OLD PERSIAN NUMBER TEN -103D4 ; [*1B4D.0020.0002] # OLD PERSIAN NUMBER TWENTY -103D5 ; [*1B4E.0020.0002] # OLD PERSIAN NUMBER HUNDRED -1056F ; [*0432.0020.0002] # CAUCASIAN ALBANIAN CITATION MARK -10857 ; [*02D9.0020.0002] # IMPERIAL ARAMAIC SECTION SIGN -1085B ; [*1B5E.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN -1085C ; [*1B5F.0020.0002] # IMPERIAL ARAMAIC NUMBER TWENTY -1085D ; [*1B60.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE HUNDRED -1085E ; [*1B61.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE THOUSAND -1085F ; [*1B62.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN THOUSAND -10877 ; [*0FCF.0020.0002] # PALMYRENE LEFT-POINTING FLEURON -10878 ; [*0FD0.0020.0002] # PALMYRENE RIGHT-POINTING FLEURON -1087E ; [*1B4F.0020.0002] # PALMYRENE NUMBER TEN -1087F ; [*1B50.0020.0002] # PALMYRENE NUMBER TWENTY -108AD ; [*1B51.0020.0002] # NABATAEAN NUMBER TEN -108AE ; [*1B52.0020.0002] # NABATAEAN NUMBER TWENTY -108AF ; [*1B53.0020.0002] # NABATAEAN NUMBER ONE HUNDRED -108FD ; [*1B54.0020.0002] # HATRAN NUMBER TEN -108FE ; [*1B55.0020.0002] # HATRAN NUMBER TWENTY -108FF ; [*1B56.0020.0002] # HATRAN NUMBER ONE HUNDRED -10917 ; [*1B5B.0020.0002] # PHOENICIAN NUMBER TEN -10918 ; [*1B5C.0020.0002] # PHOENICIAN NUMBER TWENTY -10919 ; [*1B5D.0020.0002] # PHOENICIAN NUMBER ONE HUNDRED -1091F ; [*02FF.0020.0002] # PHOENICIAN WORD SEPARATOR -1093F ; [*02F9.0020.0002] # LYDIAN TRIANGULAR MARK -109BC ; [*1BDD.0020.0002] # MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS -109BD ; [*1BD2.0020.0002] # MEROITIC CURSIVE FRACTION ONE HALF -109C9 ; [*1BA7.0020.0002] # MEROITIC CURSIVE NUMBER TEN -109CA ; [*1BA8.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY -109CB ; [*1BA9.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY -109CC ; [*1BAA.0020.0002] # MEROITIC CURSIVE NUMBER FORTY -109CD ; [*1BAB.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY -109CE ; [*1BAC.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY -109CF ; [*1BAD.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY -109D2 ; [*1BAE.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED -109D3 ; [*1BAF.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED -109D4 ; [*1BB0.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED -109D5 ; [*1BB1.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED -109D6 ; [*1BB2.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED -109D7 ; [*1BB3.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED -109D8 ; [*1BB4.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED -109D9 ; [*1BB5.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED -109DA ; [*1BB6.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED -109DB ; [*1BB7.0020.0002] # MEROITIC CURSIVE NUMBER ONE THOUSAND -109DC ; [*1BB8.0020.0002] # MEROITIC CURSIVE NUMBER TWO THOUSAND -109DD ; [*1BB9.0020.0002] # MEROITIC CURSIVE NUMBER THREE THOUSAND -109DE ; [*1BBA.0020.0002] # MEROITIC CURSIVE NUMBER FOUR THOUSAND -109DF ; [*1BBB.0020.0002] # MEROITIC CURSIVE NUMBER FIVE THOUSAND -109E0 ; [*1BBC.0020.0002] # MEROITIC CURSIVE NUMBER SIX THOUSAND -109E1 ; [*1BBD.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN THOUSAND -109E2 ; [*1BBE.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT THOUSAND -109E3 ; [*1BBF.0020.0002] # MEROITIC CURSIVE NUMBER NINE THOUSAND -109E4 ; [*1BC0.0020.0002] # MEROITIC CURSIVE NUMBER TEN THOUSAND -109E5 ; [*1BC1.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY THOUSAND -109E6 ; [*1BC2.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY THOUSAND -109E7 ; [*1BC3.0020.0002] # MEROITIC CURSIVE NUMBER FORTY THOUSAND -109E8 ; [*1BC4.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY THOUSAND -109E9 ; [*1BC5.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY THOUSAND -109EA ; [*1BC6.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY THOUSAND -109EB ; [*1BC7.0020.0002] # MEROITIC CURSIVE NUMBER EIGHTY THOUSAND -109EC ; [*1BC8.0020.0002] # MEROITIC CURSIVE NUMBER NINETY THOUSAND -109ED ; [*1BC9.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND -109EE ; [*1BCA.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND -109EF ; [*1BCB.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND -109F0 ; [*1BCC.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND -109F1 ; [*1BCD.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND -109F2 ; [*1BCE.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND -109F3 ; [*1BCF.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND -109F4 ; [*1BD0.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND -109F5 ; [*1BD1.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND -109F6 ; [*1BD3.0020.0002] # MEROITIC CURSIVE FRACTION ONE TWELFTH -109F7 ; [*1BD4.0020.0002] # MEROITIC CURSIVE FRACTION TWO TWELFTHS -109F8 ; [*1BD5.0020.0002] # MEROITIC CURSIVE FRACTION THREE TWELFTHS -109F9 ; [*1BD6.0020.0002] # MEROITIC CURSIVE FRACTION FOUR TWELFTHS -109FA ; [*1BD7.0020.0002] # MEROITIC CURSIVE FRACTION FIVE TWELFTHS -109FB ; [*1BD8.0020.0002] # MEROITIC CURSIVE FRACTION SIX TWELFTHS -109FC ; [*1BD9.0020.0002] # MEROITIC CURSIVE FRACTION SEVEN TWELFTHS -109FD ; [*1BDA.0020.0002] # MEROITIC CURSIVE FRACTION EIGHT TWELFTHS -109FE ; [*1BDB.0020.0002] # MEROITIC CURSIVE FRACTION NINE TWELFTHS -109FF ; [*1BDC.0020.0002] # MEROITIC CURSIVE FRACTION TEN TWELFTHS -10A44 ; [*1B7E.0020.0002] # KHAROSHTHI NUMBER TEN -10A45 ; [*1B7F.0020.0002] # KHAROSHTHI NUMBER TWENTY -10A46 ; [*1B80.0020.0002] # KHAROSHTHI NUMBER ONE HUNDRED -10A47 ; [*1B81.0020.0002] # KHAROSHTHI NUMBER ONE THOUSAND -10A50 ; [*0438.0020.0002] # KHAROSHTHI PUNCTUATION DOT -10A51 ; [*0439.0020.0002] # KHAROSHTHI PUNCTUATION SMALL CIRCLE -10A52 ; [*043A.0020.0002] # KHAROSHTHI PUNCTUATION CIRCLE -10A53 ; [*043B.0020.0002] # KHAROSHTHI PUNCTUATION CRESCENT BAR -10A54 ; [*043C.0020.0002] # KHAROSHTHI PUNCTUATION MANGALAM -10A55 ; [*043D.0020.0002] # KHAROSHTHI PUNCTUATION LOTUS -10A56 ; [*02AA.0020.0002] # KHAROSHTHI PUNCTUATION DANDA -10A57 ; [*02AB.0020.0002] # KHAROSHTHI PUNCTUATION DOUBLE DANDA -10A58 ; [*043E.0020.0002] # KHAROSHTHI PUNCTUATION LINES -10A7E ; [*1B57.0020.0002] # OLD SOUTH ARABIAN NUMBER FIFTY -10A7F ; [*1B58.0020.0002] # OLD SOUTH ARABIAN NUMERIC INDICATOR -10A9E ; [*1B59.0020.0002] # OLD NORTH ARABIAN NUMBER TEN -10A9F ; [*1B5A.0020.0002] # OLD NORTH ARABIAN NUMBER TWENTY -10AED ; [*1B63.0020.0002] # MANICHAEAN NUMBER TEN -10AEE ; [*1B64.0020.0002] # MANICHAEAN NUMBER TWENTY -10AEF ; [*1B65.0020.0002] # MANICHAEAN NUMBER ONE HUNDRED -10AF0 ; [*0443.0020.0002] # MANICHAEAN PUNCTUATION STAR -10AF1 ; [*0444.0020.0002] # MANICHAEAN PUNCTUATION FLEURON -10AF2 ; [*0445.0020.0002] # MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT -10AF3 ; [*0446.0020.0002] # MANICHAEAN PUNCTUATION DOT WITHIN DOT -10AF4 ; [*0447.0020.0002] # MANICHAEAN PUNCTUATION DOT -10AF5 ; [*0448.0020.0002] # MANICHAEAN PUNCTUATION TWO DOTS -10AF6 ; [*0449.0020.0002] # MANICHAEAN PUNCTUATION LINE FILLER -10B39 ; [*0442.0020.0002] # AVESTAN ABBREVIATION MARK -10B3A ; [*02DA.0020.0002] # TINY TWO DOTS OVER ONE DOT PUNCTUATION -10B3B ; [*02DB.0020.0002] # SMALL TWO DOTS OVER ONE DOT PUNCTUATION -10B3C ; [*02DC.0020.0002] # LARGE TWO DOTS OVER ONE DOT PUNCTUATION -10B3D ; [*02DD.0020.0002] # LARGE ONE DOT OVER TWO DOTS PUNCTUATION -10B3E ; [*02DE.0020.0002] # LARGE TWO RINGS OVER ONE RING PUNCTUATION -10B3F ; [*02DF.0020.0002] # LARGE ONE RING OVER TWO RINGS PUNCTUATION -10B5C ; [*1B66.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TEN -10B5D ; [*1B67.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWENTY -10B5E ; [*1B68.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED -10B5F ; [*1B69.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND -10B7C ; [*1B6A.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TEN -10B7D ; [*1B6B.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWENTY -10B7E ; [*1B6C.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED -10B7F ; [*1B6D.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND -10B99 ; [*044A.0020.0002] # PSALTER PAHLAVI SECTION MARK -10B9A ; [*044B.0020.0002] # PSALTER PAHLAVI TURNED SECTION MARK -10B9B ; [*044C.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH CROSS -10B9C ; [*044D.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH DOT -10BAD ; [*1B6E.0020.0002] # PSALTER PAHLAVI NUMBER TEN -10BAE ; [*1B6F.0020.0002] # PSALTER PAHLAVI NUMBER TWENTY -10BAF ; [*1B70.0020.0002] # PSALTER PAHLAVI NUMBER ONE HUNDRED -10CFC ; [*1AE5.0020.0002] # OLD HUNGARIAN NUMBER TEN -10CFD ; [*1AE6.0020.0002] # OLD HUNGARIAN NUMBER FIFTY -10CFE ; [*1AE7.0020.0002] # OLD HUNGARIAN NUMBER ONE HUNDRED -10CFF ; [*1AE8.0020.0002] # OLD HUNGARIAN NUMBER ONE THOUSAND -10E69 ; [*1ACC.0020.0002] # RUMI NUMBER TEN -10E6A ; [*1ACD.0020.0002] # RUMI NUMBER TWENTY -10E6B ; [*1ACE.0020.0002] # RUMI NUMBER THIRTY -10E6C ; [*1ACF.0020.0002] # RUMI NUMBER FORTY -10E6D ; [*1AD0.0020.0002] # RUMI NUMBER FIFTY -10E6E ; [*1AD1.0020.0002] # RUMI NUMBER SIXTY -10E6F ; [*1AD2.0020.0002] # RUMI NUMBER SEVENTY -10E70 ; [*1AD3.0020.0002] # RUMI NUMBER EIGHTY -10E71 ; [*1AD4.0020.0002] # RUMI NUMBER NINETY -10E72 ; [*1AD5.0020.0002] # RUMI NUMBER ONE HUNDRED -10E73 ; [*1AD6.0020.0002] # RUMI NUMBER TWO HUNDRED -10E74 ; [*1AD7.0020.0002] # RUMI NUMBER THREE HUNDRED -10E75 ; [*1AD8.0020.0002] # RUMI NUMBER FOUR HUNDRED -10E76 ; [*1AD9.0020.0002] # RUMI NUMBER FIVE HUNDRED -10E77 ; [*1ADA.0020.0002] # RUMI NUMBER SIX HUNDRED -10E78 ; [*1ADB.0020.0002] # RUMI NUMBER SEVEN HUNDRED -10E79 ; [*1ADC.0020.0002] # RUMI NUMBER EIGHT HUNDRED -10E7A ; [*1ADD.0020.0002] # RUMI NUMBER NINE HUNDRED -10E7B ; [*1ADE.0020.0002] # RUMI FRACTION ONE HALF -10E7C ; [*1ADF.0020.0002] # RUMI FRACTION ONE QUARTER -10E7D ; [*1AE0.0020.0002] # RUMI FRACTION ONE THIRD -10E7E ; [*1AE1.0020.0002] # RUMI FRACTION TWO THIRDS -11047 ; [*02AC.0020.0002] # BRAHMI DANDA -11048 ; [*02AD.0020.0002] # BRAHMI DOUBLE DANDA -11049 ; [*0433.0020.0002] # BRAHMI PUNCTUATION DOT -1104A ; [*0434.0020.0002] # BRAHMI PUNCTUATION DOUBLE DOT -1104B ; [*0435.0020.0002] # BRAHMI PUNCTUATION LINE -1104C ; [*0436.0020.0002] # BRAHMI PUNCTUATION CRESCENT BAR -1104D ; [*0437.0020.0002] # BRAHMI PUNCTUATION LOTUS -1105B ; [*1B73.0020.0002] # BRAHMI NUMBER TEN -1105C ; [*1B74.0020.0002] # BRAHMI NUMBER TWENTY -1105D ; [*1B75.0020.0002] # BRAHMI NUMBER THIRTY -1105E ; [*1B76.0020.0002] # BRAHMI NUMBER FORTY -1105F ; [*1B77.0020.0002] # BRAHMI NUMBER FIFTY -11060 ; [*1B78.0020.0002] # BRAHMI NUMBER SIXTY -11061 ; [*1B79.0020.0002] # BRAHMI NUMBER SEVENTY -11062 ; [*1B7A.0020.0002] # BRAHMI NUMBER EIGHTY -11063 ; [*1B7B.0020.0002] # BRAHMI NUMBER NINETY -11064 ; [*1B7C.0020.0002] # BRAHMI NUMBER ONE HUNDRED -11065 ; [*1B7D.0020.0002] # BRAHMI NUMBER ONE THOUSAND -110BB ; [*044E.0020.0002] # KAITHI ABBREVIATION SIGN -110BC ; [*044F.0020.0002] # KAITHI ENUMERATION SIGN +102EA ; [*1B9E.0020.0002] # COPTIC EPACT NUMBER TEN +102EB ; [*1B9F.0020.0002] # COPTIC EPACT NUMBER TWENTY +102EC ; [*1BA0.0020.0002] # COPTIC EPACT NUMBER THIRTY +102ED ; [*1BA1.0020.0002] # COPTIC EPACT NUMBER FORTY +102EE ; [*1BA2.0020.0002] # COPTIC EPACT NUMBER FIFTY +102EF ; [*1BA3.0020.0002] # COPTIC EPACT NUMBER SIXTY +102F0 ; [*1BA4.0020.0002] # COPTIC EPACT NUMBER SEVENTY +102F1 ; [*1BA5.0020.0002] # COPTIC EPACT NUMBER EIGHTY +102F2 ; [*1BA6.0020.0002] # COPTIC EPACT NUMBER NINETY +102F3 ; [*1BA7.0020.0002] # COPTIC EPACT NUMBER ONE HUNDRED +102F4 ; [*1BA8.0020.0002] # COPTIC EPACT NUMBER TWO HUNDRED +102F5 ; [*1BA9.0020.0002] # COPTIC EPACT NUMBER THREE HUNDRED +102F6 ; [*1BAA.0020.0002] # COPTIC EPACT NUMBER FOUR HUNDRED +102F7 ; [*1BAB.0020.0002] # COPTIC EPACT NUMBER FIVE HUNDRED +102F8 ; [*1BAC.0020.0002] # COPTIC EPACT NUMBER SIX HUNDRED +102F9 ; [*1BAD.0020.0002] # COPTIC EPACT NUMBER SEVEN HUNDRED +102FA ; [*1BAE.0020.0002] # COPTIC EPACT NUMBER EIGHT HUNDRED +102FB ; [*1BAF.0020.0002] # COPTIC EPACT NUMBER NINE HUNDRED +10322 ; [*1B47.0020.0002] # OLD ITALIC NUMERAL TEN +10323 ; [*1B48.0020.0002] # OLD ITALIC NUMERAL FIFTY +1039F ; [*02FE.0020.0002] # UGARITIC WORD DIVIDER +103D0 ; [*02FF.0020.0002] # OLD PERSIAN WORD DIVIDER +103D3 ; [*1BB0.0020.0002] # OLD PERSIAN NUMBER TEN +103D4 ; [*1BB1.0020.0002] # OLD PERSIAN NUMBER TWENTY +103D5 ; [*1BB2.0020.0002] # OLD PERSIAN NUMBER HUNDRED +1056F ; [*0448.0020.0002] # CAUCASIAN ALBANIAN CITATION MARK +10857 ; [*02DA.0020.0002] # IMPERIAL ARAMAIC SECTION SIGN +1085B ; [*1BC2.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN +1085C ; [*1BC3.0020.0002] # IMPERIAL ARAMAIC NUMBER TWENTY +1085D ; [*1BC4.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE HUNDRED +1085E ; [*1BC5.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE THOUSAND +1085F ; [*1BC6.0020.0002] # IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10877 ; [*0FE7.0020.0002] # PALMYRENE LEFT-POINTING FLEURON +10878 ; [*0FE8.0020.0002] # PALMYRENE RIGHT-POINTING FLEURON +1087E ; [*1BB3.0020.0002] # PALMYRENE NUMBER TEN +1087F ; [*1BB4.0020.0002] # PALMYRENE NUMBER TWENTY +108AD ; [*1BB5.0020.0002] # NABATAEAN NUMBER TEN +108AE ; [*1BB6.0020.0002] # NABATAEAN NUMBER TWENTY +108AF ; [*1BB7.0020.0002] # NABATAEAN NUMBER ONE HUNDRED +108FD ; [*1BB8.0020.0002] # HATRAN NUMBER TEN +108FE ; [*1BB9.0020.0002] # HATRAN NUMBER TWENTY +108FF ; [*1BBA.0020.0002] # HATRAN NUMBER ONE HUNDRED +10917 ; [*1BBF.0020.0002] # PHOENICIAN NUMBER TEN +10918 ; [*1BC0.0020.0002] # PHOENICIAN NUMBER TWENTY +10919 ; [*1BC1.0020.0002] # PHOENICIAN NUMBER ONE HUNDRED +1091F ; [*0300.0020.0002] # PHOENICIAN WORD SEPARATOR +1093F ; [*02FA.0020.0002] # LYDIAN TRIANGULAR MARK +109BC ; [*1C41.0020.0002] # MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS +109BD ; [*1C36.0020.0002] # MEROITIC CURSIVE FRACTION ONE HALF +109C9 ; [*1C0B.0020.0002] # MEROITIC CURSIVE NUMBER TEN +109CA ; [*1C0C.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY +109CB ; [*1C0D.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY +109CC ; [*1C0E.0020.0002] # MEROITIC CURSIVE NUMBER FORTY +109CD ; [*1C0F.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY +109CE ; [*1C10.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY +109CF ; [*1C11.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY +109D2 ; [*1C12.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED +109D3 ; [*1C13.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED +109D4 ; [*1C14.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED +109D5 ; [*1C15.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED +109D6 ; [*1C16.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED +109D7 ; [*1C17.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED +109D8 ; [*1C18.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED +109D9 ; [*1C19.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED +109DA ; [*1C1A.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED +109DB ; [*1C1B.0020.0002] # MEROITIC CURSIVE NUMBER ONE THOUSAND +109DC ; [*1C1C.0020.0002] # MEROITIC CURSIVE NUMBER TWO THOUSAND +109DD ; [*1C1D.0020.0002] # MEROITIC CURSIVE NUMBER THREE THOUSAND +109DE ; [*1C1E.0020.0002] # MEROITIC CURSIVE NUMBER FOUR THOUSAND +109DF ; [*1C1F.0020.0002] # MEROITIC CURSIVE NUMBER FIVE THOUSAND +109E0 ; [*1C20.0020.0002] # MEROITIC CURSIVE NUMBER SIX THOUSAND +109E1 ; [*1C21.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN THOUSAND +109E2 ; [*1C22.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT THOUSAND +109E3 ; [*1C23.0020.0002] # MEROITIC CURSIVE NUMBER NINE THOUSAND +109E4 ; [*1C24.0020.0002] # MEROITIC CURSIVE NUMBER TEN THOUSAND +109E5 ; [*1C25.0020.0002] # MEROITIC CURSIVE NUMBER TWENTY THOUSAND +109E6 ; [*1C26.0020.0002] # MEROITIC CURSIVE NUMBER THIRTY THOUSAND +109E7 ; [*1C27.0020.0002] # MEROITIC CURSIVE NUMBER FORTY THOUSAND +109E8 ; [*1C28.0020.0002] # MEROITIC CURSIVE NUMBER FIFTY THOUSAND +109E9 ; [*1C29.0020.0002] # MEROITIC CURSIVE NUMBER SIXTY THOUSAND +109EA ; [*1C2A.0020.0002] # MEROITIC CURSIVE NUMBER SEVENTY THOUSAND +109EB ; [*1C2B.0020.0002] # MEROITIC CURSIVE NUMBER EIGHTY THOUSAND +109EC ; [*1C2C.0020.0002] # MEROITIC CURSIVE NUMBER NINETY THOUSAND +109ED ; [*1C2D.0020.0002] # MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND +109EE ; [*1C2E.0020.0002] # MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND +109EF ; [*1C2F.0020.0002] # MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND +109F0 ; [*1C30.0020.0002] # MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND +109F1 ; [*1C31.0020.0002] # MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND +109F2 ; [*1C32.0020.0002] # MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND +109F3 ; [*1C33.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND +109F4 ; [*1C34.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND +109F5 ; [*1C35.0020.0002] # MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND +109F6 ; [*1C37.0020.0002] # MEROITIC CURSIVE FRACTION ONE TWELFTH +109F7 ; [*1C38.0020.0002] # MEROITIC CURSIVE FRACTION TWO TWELFTHS +109F8 ; [*1C39.0020.0002] # MEROITIC CURSIVE FRACTION THREE TWELFTHS +109F9 ; [*1C3A.0020.0002] # MEROITIC CURSIVE FRACTION FOUR TWELFTHS +109FA ; [*1C3B.0020.0002] # MEROITIC CURSIVE FRACTION FIVE TWELFTHS +109FB ; [*1C3C.0020.0002] # MEROITIC CURSIVE FRACTION SIX TWELFTHS +109FC ; [*1C3D.0020.0002] # MEROITIC CURSIVE FRACTION SEVEN TWELFTHS +109FD ; [*1C3E.0020.0002] # MEROITIC CURSIVE FRACTION EIGHT TWELFTHS +109FE ; [*1C3F.0020.0002] # MEROITIC CURSIVE FRACTION NINE TWELFTHS +109FF ; [*1C40.0020.0002] # MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A44 ; [*1BE2.0020.0002] # KHAROSHTHI NUMBER TEN +10A45 ; [*1BE3.0020.0002] # KHAROSHTHI NUMBER TWENTY +10A46 ; [*1BE4.0020.0002] # KHAROSHTHI NUMBER ONE HUNDRED +10A47 ; [*1BE5.0020.0002] # KHAROSHTHI NUMBER ONE THOUSAND +10A50 ; [*044E.0020.0002] # KHAROSHTHI PUNCTUATION DOT +10A51 ; [*044F.0020.0002] # KHAROSHTHI PUNCTUATION SMALL CIRCLE +10A52 ; [*0450.0020.0002] # KHAROSHTHI PUNCTUATION CIRCLE +10A53 ; [*0451.0020.0002] # KHAROSHTHI PUNCTUATION CRESCENT BAR +10A54 ; [*0452.0020.0002] # KHAROSHTHI PUNCTUATION MANGALAM +10A55 ; [*0453.0020.0002] # KHAROSHTHI PUNCTUATION LOTUS +10A56 ; [*02AB.0020.0002] # KHAROSHTHI PUNCTUATION DANDA +10A57 ; [*02AC.0020.0002] # KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58 ; [*0454.0020.0002] # KHAROSHTHI PUNCTUATION LINES +10A7E ; [*1BBB.0020.0002] # OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; [*1BBC.0020.0002] # OLD SOUTH ARABIAN NUMERIC INDICATOR +10A9E ; [*1BBD.0020.0002] # OLD NORTH ARABIAN NUMBER TEN +10A9F ; [*1BBE.0020.0002] # OLD NORTH ARABIAN NUMBER TWENTY +10AED ; [*1BC7.0020.0002] # MANICHAEAN NUMBER TEN +10AEE ; [*1BC8.0020.0002] # MANICHAEAN NUMBER TWENTY +10AEF ; [*1BC9.0020.0002] # MANICHAEAN NUMBER ONE HUNDRED +10AF0 ; [*0459.0020.0002] # MANICHAEAN PUNCTUATION STAR +10AF1 ; [*045A.0020.0002] # MANICHAEAN PUNCTUATION FLEURON +10AF2 ; [*045B.0020.0002] # MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT +10AF3 ; [*045C.0020.0002] # MANICHAEAN PUNCTUATION DOT WITHIN DOT +10AF4 ; [*045D.0020.0002] # MANICHAEAN PUNCTUATION DOT +10AF5 ; [*045E.0020.0002] # MANICHAEAN PUNCTUATION TWO DOTS +10AF6 ; [*045F.0020.0002] # MANICHAEAN PUNCTUATION LINE FILLER +10B39 ; [*0458.0020.0002] # AVESTAN ABBREVIATION MARK +10B3A ; [*02DB.0020.0002] # TINY TWO DOTS OVER ONE DOT PUNCTUATION +10B3B ; [*02DC.0020.0002] # SMALL TWO DOTS OVER ONE DOT PUNCTUATION +10B3C ; [*02DD.0020.0002] # LARGE TWO DOTS OVER ONE DOT PUNCTUATION +10B3D ; [*02DE.0020.0002] # LARGE ONE DOT OVER TWO DOTS PUNCTUATION +10B3E ; [*02DF.0020.0002] # LARGE TWO RINGS OVER ONE RING PUNCTUATION +10B3F ; [*02E0.0020.0002] # LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B5C ; [*1BCA.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TEN +10B5D ; [*1BCB.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWENTY +10B5E ; [*1BCC.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED +10B5F ; [*1BCD.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B7C ; [*1BCE.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TEN +10B7D ; [*1BCF.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWENTY +10B7E ; [*1BD0.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED +10B7F ; [*1BD1.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B99 ; [*0460.0020.0002] # PSALTER PAHLAVI SECTION MARK +10B9A ; [*0461.0020.0002] # PSALTER PAHLAVI TURNED SECTION MARK +10B9B ; [*0462.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH CROSS +10B9C ; [*0463.0020.0002] # PSALTER PAHLAVI FOUR DOTS WITH DOT +10BAD ; [*1BD2.0020.0002] # PSALTER PAHLAVI NUMBER TEN +10BAE ; [*1BD3.0020.0002] # PSALTER PAHLAVI NUMBER TWENTY +10BAF ; [*1BD4.0020.0002] # PSALTER PAHLAVI NUMBER ONE HUNDRED +10CFC ; [*1B49.0020.0002] # OLD HUNGARIAN NUMBER TEN +10CFD ; [*1B4A.0020.0002] # OLD HUNGARIAN NUMBER FIFTY +10CFE ; [*1B4B.0020.0002] # OLD HUNGARIAN NUMBER ONE HUNDRED +10CFF ; [*1B4C.0020.0002] # OLD HUNGARIAN NUMBER ONE THOUSAND +10E69 ; [*1B30.0020.0002] # RUMI NUMBER TEN +10E6A ; [*1B31.0020.0002] # RUMI NUMBER TWENTY +10E6B ; [*1B32.0020.0002] # RUMI NUMBER THIRTY +10E6C ; [*1B33.0020.0002] # RUMI NUMBER FORTY +10E6D ; [*1B34.0020.0002] # RUMI NUMBER FIFTY +10E6E ; [*1B35.0020.0002] # RUMI NUMBER SIXTY +10E6F ; [*1B36.0020.0002] # RUMI NUMBER SEVENTY +10E70 ; [*1B37.0020.0002] # RUMI NUMBER EIGHTY +10E71 ; [*1B38.0020.0002] # RUMI NUMBER NINETY +10E72 ; [*1B39.0020.0002] # RUMI NUMBER ONE HUNDRED +10E73 ; [*1B3A.0020.0002] # RUMI NUMBER TWO HUNDRED +10E74 ; [*1B3B.0020.0002] # RUMI NUMBER THREE HUNDRED +10E75 ; [*1B3C.0020.0002] # RUMI NUMBER FOUR HUNDRED +10E76 ; [*1B3D.0020.0002] # RUMI NUMBER FIVE HUNDRED +10E77 ; [*1B3E.0020.0002] # RUMI NUMBER SIX HUNDRED +10E78 ; [*1B3F.0020.0002] # RUMI NUMBER SEVEN HUNDRED +10E79 ; [*1B40.0020.0002] # RUMI NUMBER EIGHT HUNDRED +10E7A ; [*1B41.0020.0002] # RUMI NUMBER NINE HUNDRED +10E7B ; [*1B42.0020.0002] # RUMI FRACTION ONE HALF +10E7C ; [*1B43.0020.0002] # RUMI FRACTION ONE QUARTER +10E7D ; [*1B44.0020.0002] # RUMI FRACTION ONE THIRD +10E7E ; [*1B45.0020.0002] # RUMI FRACTION TWO THIRDS +11047 ; [*02AD.0020.0002] # BRAHMI DANDA +11048 ; [*02AE.0020.0002] # BRAHMI DOUBLE DANDA +11049 ; [*0449.0020.0002] # BRAHMI PUNCTUATION DOT +1104A ; [*044A.0020.0002] # BRAHMI PUNCTUATION DOUBLE DOT +1104B ; [*044B.0020.0002] # BRAHMI PUNCTUATION LINE +1104C ; [*044C.0020.0002] # BRAHMI PUNCTUATION CRESCENT BAR +1104D ; [*044D.0020.0002] # BRAHMI PUNCTUATION LOTUS +1105B ; [*1BD7.0020.0002] # BRAHMI NUMBER TEN +1105C ; [*1BD8.0020.0002] # BRAHMI NUMBER TWENTY +1105D ; [*1BD9.0020.0002] # BRAHMI NUMBER THIRTY +1105E ; [*1BDA.0020.0002] # BRAHMI NUMBER FORTY +1105F ; [*1BDB.0020.0002] # BRAHMI NUMBER FIFTY +11060 ; [*1BDC.0020.0002] # BRAHMI NUMBER SIXTY +11061 ; [*1BDD.0020.0002] # BRAHMI NUMBER SEVENTY +11062 ; [*1BDE.0020.0002] # BRAHMI NUMBER EIGHTY +11063 ; [*1BDF.0020.0002] # BRAHMI NUMBER NINETY +11064 ; [*1BE0.0020.0002] # BRAHMI NUMBER ONE HUNDRED +11065 ; [*1BE1.0020.0002] # BRAHMI NUMBER ONE THOUSAND +110BB ; [*0464.0020.0002] # KAITHI ABBREVIATION SIGN +110BC ; [*0465.0020.0002] # KAITHI ENUMERATION SIGN 110BD ; [.0000.0000.0000] # KAITHI NUMBER SIGN -110BE ; [*02E0.0020.0002] # KAITHI SECTION MARK -110BF ; [*02E1.0020.0002] # KAITHI DOUBLE SECTION MARK -110C0 ; [*02AE.0020.0002] # KAITHI DANDA -110C1 ; [*02AF.0020.0002] # KAITHI DOUBLE DANDA -11140 ; [*02E2.0020.0002] # CHAKMA SECTION MARK -11141 ; [*02B0.0020.0002] # CHAKMA DANDA -11142 ; [*02B1.0020.0002] # CHAKMA DOUBLE DANDA -11143 ; [*0273.0020.0002] # CHAKMA QUESTION MARK -11174 ; [*0450.0020.0002] # MAHAJANI ABBREVIATION SIGN -11175 ; [*0451.0020.0002] # MAHAJANI SECTION MARK -111C5 ; [*02B2.0020.0002] # SHARADA DANDA -111C6 ; [*02B3.0020.0002] # SHARADA DOUBLE DANDA -111C7 ; [*0453.0020.0002] # SHARADA ABBREVIATION SIGN -111C8 ; [*02E3.0020.0002] # SHARADA SEPARATOR -111C9 ; [*0454.0020.0002] # SHARADA SANDHI MARK -111CD ; [*0452.0020.0002] # SHARADA SUTRA MARK -111DB ; [*0455.0020.0002] # SHARADA SIGN SIDDHAM -111DD ; [*0456.0020.0002] # SHARADA CONTINUATION SIGN -111DE ; [*02E4.0020.0002] # SHARADA SECTION MARK-1 -111DF ; [*02E5.0020.0002] # SHARADA SECTION MARK-2 -111EA ; [*1B8C.0020.0002] # SINHALA ARCHAIC NUMBER TEN -111EB ; [*1B8D.0020.0002] # SINHALA ARCHAIC NUMBER TWENTY -111EC ; [*1B8E.0020.0002] # SINHALA ARCHAIC NUMBER THIRTY -111ED ; [*1B8F.0020.0002] # SINHALA ARCHAIC NUMBER FORTY -111EE ; [*1B90.0020.0002] # SINHALA ARCHAIC NUMBER FIFTY -111EF ; [*1B91.0020.0002] # SINHALA ARCHAIC NUMBER SIXTY -111F0 ; [*1B92.0020.0002] # SINHALA ARCHAIC NUMBER SEVENTY -111F1 ; [*1B93.0020.0002] # SINHALA ARCHAIC NUMBER EIGHTY -111F2 ; [*1B94.0020.0002] # SINHALA ARCHAIC NUMBER NINETY -111F3 ; [*1B95.0020.0002] # SINHALA ARCHAIC NUMBER ONE HUNDRED -111F4 ; [*1B96.0020.0002] # SINHALA ARCHAIC NUMBER ONE THOUSAND -11238 ; [*02B4.0020.0002] # KHOJKI DANDA -11239 ; [*02B5.0020.0002] # KHOJKI DOUBLE DANDA -1123A ; [*0457.0020.0002] # KHOJKI WORD SEPARATOR -1123B ; [*0458.0020.0002] # KHOJKI SECTION MARK -1123C ; [*0459.0020.0002] # KHOJKI DOUBLE SECTION MARK -1123D ; [*045A.0020.0002] # KHOJKI ABBREVIATION SIGN -112A9 ; [*02E6.0020.0002] # MULTANI SECTION MARK +110BE ; [*02E1.0020.0002] # KAITHI SECTION MARK +110BF ; [*02E2.0020.0002] # KAITHI DOUBLE SECTION MARK +110C0 ; [*02AF.0020.0002] # KAITHI DANDA +110C1 ; [*02B0.0020.0002] # KAITHI DOUBLE DANDA +11140 ; [*02E3.0020.0002] # CHAKMA SECTION MARK +11141 ; [*02B1.0020.0002] # CHAKMA DANDA +11142 ; [*02B2.0020.0002] # CHAKMA DOUBLE DANDA +11143 ; [*0274.0020.0002] # CHAKMA QUESTION MARK +11174 ; [*0466.0020.0002] # MAHAJANI ABBREVIATION SIGN +11175 ; [*0467.0020.0002] # MAHAJANI SECTION MARK +111C5 ; [*02B3.0020.0002] # SHARADA DANDA +111C6 ; [*02B4.0020.0002] # SHARADA DOUBLE DANDA +111C7 ; [*0469.0020.0002] # SHARADA ABBREVIATION SIGN +111C8 ; [*02E4.0020.0002] # SHARADA SEPARATOR +111C9 ; [*046A.0020.0002] # SHARADA SANDHI MARK +111CD ; [*0468.0020.0002] # SHARADA SUTRA MARK +111DB ; [*046B.0020.0002] # SHARADA SIGN SIDDHAM +111DD ; [*046C.0020.0002] # SHARADA CONTINUATION SIGN +111DE ; [*02E5.0020.0002] # SHARADA SECTION MARK-1 +111DF ; [*02E6.0020.0002] # SHARADA SECTION MARK-2 +111EA ; [*1BF0.0020.0002] # SINHALA ARCHAIC NUMBER TEN +111EB ; [*1BF1.0020.0002] # SINHALA ARCHAIC NUMBER TWENTY +111EC ; [*1BF2.0020.0002] # SINHALA ARCHAIC NUMBER THIRTY +111ED ; [*1BF3.0020.0002] # SINHALA ARCHAIC NUMBER FORTY +111EE ; [*1BF4.0020.0002] # SINHALA ARCHAIC NUMBER FIFTY +111EF ; [*1BF5.0020.0002] # SINHALA ARCHAIC NUMBER SIXTY +111F0 ; [*1BF6.0020.0002] # SINHALA ARCHAIC NUMBER SEVENTY +111F1 ; [*1BF7.0020.0002] # SINHALA ARCHAIC NUMBER EIGHTY +111F2 ; [*1BF8.0020.0002] # SINHALA ARCHAIC NUMBER NINETY +111F3 ; [*1BF9.0020.0002] # SINHALA ARCHAIC NUMBER ONE HUNDRED +111F4 ; [*1BFA.0020.0002] # SINHALA ARCHAIC NUMBER ONE THOUSAND +11238 ; [*02B5.0020.0002] # KHOJKI DANDA +11239 ; [*02B6.0020.0002] # KHOJKI DOUBLE DANDA +1123A ; [*046D.0020.0002] # KHOJKI WORD SEPARATOR +1123B ; [*046E.0020.0002] # KHOJKI SECTION MARK +1123C ; [*046F.0020.0002] # KHOJKI DOUBLE SECTION MARK +1123D ; [*0470.0020.0002] # KHOJKI ABBREVIATION SIGN +112A9 ; [*02E7.0020.0002] # MULTANI SECTION MARK 11366 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT ZERO 11367 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT ONE 11368 ; [.0000.0000.0000] # COMBINING GRANTHA DIGIT TWO @@ -4617,483 +4628,499 @@ FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER 11372 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER NA 11373 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER VI 11374 ; [.0000.0000.0000] # COMBINING GRANTHA LETTER PA -1144B ; [*02B6.0020.0002] # NEWA DANDA -1144C ; [*02B7.0020.0002] # NEWA DOUBLE DANDA -1144D ; [*045B.0020.0002] # NEWA COMMA -1144E ; [*045C.0020.0002] # NEWA GAP FILLER -1144F ; [*045D.0020.0002] # NEWA ABBREVIATION SIGN -1145B ; [*045E.0020.0002] # NEWA PLACEHOLDER MARK -1145D ; [*045F.0020.0002] # NEWA INSERTION SIGN -114C6 ; [*0460.0020.0002] # TIRHUTA ABBREVIATION SIGN -115C1 ; [*0461.0020.0002] # SIDDHAM SIGN SIDDHAM -115C2 ; [*02B8.0020.0002] # SIDDHAM DANDA -115C3 ; [*02B9.0020.0002] # SIDDHAM DOUBLE DANDA -115C4 ; [*0462.0020.0002] # SIDDHAM SEPARATOR DOT -115C5 ; [*0463.0020.0002] # SIDDHAM SEPARATOR BAR -115C6 ; [*0464.0020.0002] # SIDDHAM REPETITION MARK-1 -115C7 ; [*0465.0020.0002] # SIDDHAM REPETITION MARK-2 -115C8 ; [*0466.0020.0002] # SIDDHAM REPETITION MARK-3 -115C9 ; [*0467.0020.0002] # SIDDHAM END OF TEXT MARK -115CA ; [*0468.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS -115CB ; [*0469.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS -115CC ; [*046A.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS -115CD ; [*046B.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS -115CE ; [*046C.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS -115CF ; [*046D.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING -115D0 ; [*046E.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING WITH RAYS -115D1 ; [*046F.0020.0002] # SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS -115D2 ; [*0470.0020.0002] # SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS -115D3 ; [*0471.0020.0002] # SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS -115D4 ; [*0472.0020.0002] # SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS -115D5 ; [*0473.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND RAYS -115D6 ; [*0474.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES -115D7 ; [*0475.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES -11641 ; [*02BA.0020.0002] # MODI DANDA -11642 ; [*02BB.0020.0002] # MODI DOUBLE DANDA -11643 ; [*0476.0020.0002] # MODI ABBREVIATION SIGN -11660 ; [*03DA.0020.0002] # MONGOLIAN BIRGA WITH ORNAMENT -11661 ; [*03DB.0020.0002] # MONGOLIAN ROTATED BIRGA -11662 ; [*03DC.0020.0002] # MONGOLIAN DOUBLE BIRGA WITH ORNAMENT -11663 ; [*03DD.0020.0002] # MONGOLIAN TRIPLE BIRGA WITH ORNAMENT -11664 ; [*03DE.0020.0002] # MONGOLIAN BIRGA WITH DOUBLE ORNAMENT -11665 ; [*03DF.0020.0002] # MONGOLIAN ROTATED BIRGA WITH ORNAMENT -11666 ; [*03E0.0020.0002] # MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT -11667 ; [*03E1.0020.0002] # MONGOLIAN INVERTED BIRGA -11668 ; [*03E2.0020.0002] # MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT -11669 ; [*03E3.0020.0002] # MONGOLIAN SWIRL BIRGA -1166A ; [*03E4.0020.0002] # MONGOLIAN SWIRL BIRGA WITH ORNAMENT -1166B ; [*03E5.0020.0002] # MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT -1166C ; [*03E6.0020.0002] # MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT -1173A ; [*1B71.0020.0002] # AHOM NUMBER TEN -1173B ; [*1B72.0020.0002] # AHOM NUMBER TWENTY -1173C ; [*02BC.0020.0002] # AHOM SIGN SMALL SECTION -1173D ; [*02BD.0020.0002] # AHOM SIGN SECTION -1173E ; [*02E7.0020.0002] # AHOM SIGN RULAI -1173F ; [*0550.0020.0002] # AHOM SYMBOL VI -118EA ; [*1B97.0020.0002] # WARANG CITI NUMBER TEN -118EB ; [*1B98.0020.0002] # WARANG CITI NUMBER TWENTY -118EC ; [*1B99.0020.0002] # WARANG CITI NUMBER THIRTY -118ED ; [*1B9A.0020.0002] # WARANG CITI NUMBER FORTY -118EE ; [*1B9B.0020.0002] # WARANG CITI NUMBER FIFTY -118EF ; [*1B9C.0020.0002] # WARANG CITI NUMBER SIXTY -118F0 ; [*1B9D.0020.0002] # WARANG CITI NUMBER SEVENTY -118F1 ; [*1B9E.0020.0002] # WARANG CITI NUMBER EIGHTY -118F2 ; [*1B9F.0020.0002] # WARANG CITI NUMBER NINETY -11C41 ; [*02BE.0020.0002] # BHAIKSUKI DANDA -11C42 ; [*02BF.0020.0002] # BHAIKSUKI DOUBLE DANDA -11C43 ; [*043F.0020.0002] # BHAIKSUKI WORD SEPARATOR -11C44 ; [*0440.0020.0002] # BHAIKSUKI GAP FILLER-1 -11C45 ; [*0441.0020.0002] # BHAIKSUKI GAP FILLER-2 -11C63 ; [*1B82.0020.0002] # BHAIKSUKI NUMBER TEN -11C64 ; [*1B83.0020.0002] # BHAIKSUKI NUMBER TWENTY -11C65 ; [*1B84.0020.0002] # BHAIKSUKI NUMBER THIRTY -11C66 ; [*1B85.0020.0002] # BHAIKSUKI NUMBER FORTY -11C67 ; [*1B86.0020.0002] # BHAIKSUKI NUMBER FIFTY -11C68 ; [*1B87.0020.0002] # BHAIKSUKI NUMBER SIXTY -11C69 ; [*1B88.0020.0002] # BHAIKSUKI NUMBER SEVENTY -11C6A ; [*1B89.0020.0002] # BHAIKSUKI NUMBER EIGHTY -11C6B ; [*1B8A.0020.0002] # BHAIKSUKI NUMBER NINETY -11C6C ; [*1B8B.0020.0002] # BHAIKSUKI HUNDREDS UNIT MARK -11C70 ; [*0409.0020.0002] # MARCHEN HEAD MARK -11C71 ; [*040A.0020.0002] # MARCHEN MARK SHAD -12432 ; [*1BDE.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH -12433 ; [*1BDF.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN -1245A ; [*1BE0.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH -1245B ; [*1BE1.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH -1245C ; [*1BE2.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH -1245D ; [*1BE3.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A -1245E ; [*1BE4.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A -1245F ; [*1BE5.0020.0002] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH -12460 ; [*1BE6.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH -12461 ; [*1BE7.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH -12462 ; [*1BE8.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER -12463 ; [*1BE9.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER GUR -12464 ; [*1BEA.0020.0002] # CUNEIFORM NUMERIC SIGN ONE HALF GUR -12465 ; [*1BEB.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD -12466 ; [*1BEC.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS -12467 ; [*1BED.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FORTY -12468 ; [*1BEE.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FIFTY -12470 ; [*0300.0020.0002] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER -12471 ; [*0301.0020.0002] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON -12472 ; [*0302.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON -12473 ; [*0303.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON -12474 ; [*0304.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON -16A6E ; [*02C0.0020.0002] # MRO DANDA -16A6F ; [*02C1.0020.0002] # MRO DOUBLE DANDA -16AF5 ; [*0288.0020.0002] # BASSA VAH FULL STOP -16B37 ; [*0477.0020.0002] # PAHAWH HMONG SIGN VOS THOM -16B38 ; [*0478.0020.0002] # PAHAWH HMONG SIGN VOS TSHAB CEEB -16B39 ; [*0479.0020.0002] # PAHAWH HMONG SIGN CIM CHEEM -16B3A ; [*047A.0020.0002] # PAHAWH HMONG SIGN VOS THIAB -16B3B ; [*047B.0020.0002] # PAHAWH HMONG SIGN VOS FEEM -16B3C ; [*0FD1.0020.0002] # PAHAWH HMONG SIGN XYEEM NTXIV -16B3D ; [*0FD2.0020.0002] # PAHAWH HMONG SIGN XYEEM RHO -16B3E ; [*0FD3.0020.0002] # PAHAWH HMONG SIGN XYEEM TOV -16B3F ; [*0FD4.0020.0002] # PAHAWH HMONG SIGN XYEEM FAIB -16B44 ; [*047C.0020.0002] # PAHAWH HMONG SIGN XAUS -16B45 ; [*0FD5.0020.0002] # PAHAWH HMONG SIGN CIM TSOV ROG -16B5B ; [*1BA0.0020.0002] # PAHAWH HMONG NUMBER TENS -16B5C ; [*1BA1.0020.0002] # PAHAWH HMONG NUMBER HUNDREDS -16B5D ; [*1BA2.0020.0002] # PAHAWH HMONG NUMBER TEN THOUSANDS -16B5E ; [*1BA3.0020.0002] # PAHAWH HMONG NUMBER MILLIONS -16B5F ; [*1BA4.0020.0002] # PAHAWH HMONG NUMBER HUNDRED MILLIONS -16B60 ; [*1BA5.0020.0002] # PAHAWH HMONG NUMBER TEN BILLIONS -16B61 ; [*1BA6.0020.0002] # PAHAWH HMONG NUMBER TRILLIONS -1BC9C ; [*11C6.0020.0002] # DUPLOYAN SIGN O WITH CROSS -1BC9F ; [*0289.0020.0002] # DUPLOYAN PUNCTUATION CHINOOK FULL STOP -1D000 ; [*0FD6.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILI -1D001 ; [*0FD7.0020.0002] # BYZANTINE MUSICAL SYMBOL DASEIA -1D002 ; [*0FD8.0020.0002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI -1D003 ; [*0FD9.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON -1D004 ; [*0FDA.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI -1D005 ; [*0FDB.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON -1D006 ; [*0FDC.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI -1D007 ; [*0FDD.0020.0002] # BYZANTINE MUSICAL SYMBOL KATHISTI -1D008 ; [*0FDE.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMATIKI -1D009 ; [*0FDF.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI -1D00A ; [*0FE0.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS -1D00B ; [*0FE1.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI -1D00C ; [*0FE2.0020.0002] # BYZANTINE MUSICAL SYMBOL KREMASTI -1D00D ; [*0FE3.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON -1D00E ; [*0FE4.0020.0002] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON -1D00F ; [*0FE5.0020.0002] # BYZANTINE MUSICAL SYMBOL TELEIA -1D010 ; [*0FE6.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA -1D011 ; [*0FE7.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS -1D012 ; [*0FE8.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI -1D013 ; [*0FE9.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNEVMA -1D014 ; [*0FEA.0020.0002] # BYZANTINE MUSICAL SYMBOL THITA -1D015 ; [*0FEB.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION -1D016 ; [*0FEC.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION -1D017 ; [*0FED.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILON -1D018 ; [*0FEE.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILON -1D019 ; [*0FEF.0020.0002] # BYZANTINE MUSICAL SYMBOL VATHY -1D01A ; [*0FF0.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION -1D01B ; [*0FF1.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION -1D01C ; [*0FF2.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION -1D01D ; [*0FF3.0020.0002] # BYZANTINE MUSICAL SYMBOL SAXIMATA -1D01E ; [*0FF4.0020.0002] # BYZANTINE MUSICAL SYMBOL PARICHON -1D01F ; [*0FF5.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA -1D020 ; [*0FF6.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION -1D021 ; [*0FF7.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION -1D022 ; [*0FF8.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION -1D023 ; [*0FF9.0020.0002] # BYZANTINE MUSICAL SYMBOL APOTHEMA -1D024 ; [*0FFA.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA -1D025 ; [*0FFB.0020.0002] # BYZANTINE MUSICAL SYMBOL REVMA -1D026 ; [*0FFC.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION -1D027 ; [*0FFD.0020.0002] # BYZANTINE MUSICAL SYMBOL TINAGMA -1D028 ; [*0FFE.0020.0002] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA -1D029 ; [*0FFF.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA -1D02A ; [*1000.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION -1D02B ; [*1001.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU -1D02C ; [*1002.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION -1D02D ; [*1003.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA -1D02E ; [*1004.0020.0002] # BYZANTINE MUSICAL SYMBOL LEMOI -1D02F ; [*1005.0020.0002] # BYZANTINE MUSICAL SYMBOL DYO -1D030 ; [*1006.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIA -1D031 ; [*1007.0020.0002] # BYZANTINE MUSICAL SYMBOL TESSERA -1D032 ; [*1008.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMATA -1D033 ; [*1009.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO -1D034 ; [*100A.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION -1D035 ; [*100B.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORA -1D036 ; [*100C.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION -1D037 ; [*100D.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON -1D038 ; [*100E.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON -1D039 ; [*100F.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON -1D03A ; [*1010.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA -1D03B ; [*1011.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION -1D03C ; [*1012.0020.0002] # BYZANTINE MUSICAL SYMBOL RAPISMA -1D03D ; [*1013.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION -1D03E ; [*1014.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION -1D03F ; [*1015.0020.0002] # BYZANTINE MUSICAL SYMBOL ICHADIN -1D040 ; [*1016.0020.0002] # BYZANTINE MUSICAL SYMBOL NANA -1D041 ; [*1017.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASMA -1D042 ; [*1018.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO -1D043 ; [*1019.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO -1D044 ; [*101A.0020.0002] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA -1D045 ; [*101B.0020.0002] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA -1D046 ; [*101C.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON NEO -1D047 ; [*101D.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON NEO -1D048 ; [*101E.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA NEO -1D049 ; [*101F.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTI -1D04A ; [*1020.0020.0002] # BYZANTINE MUSICAL SYMBOL KOUFISMA -1D04B ; [*1021.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA -1D04C ; [*1022.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA -1D04D ; [*1023.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON NEO -1D04E ; [*1024.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO -1D04F ; [*1025.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO -1D050 ; [*1026.0020.0002] # BYZANTINE MUSICAL SYMBOL YPSILI -1D051 ; [*1027.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO -1D052 ; [*1028.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO -1D053 ; [*1029.0020.0002] # BYZANTINE MUSICAL SYMBOL YPORROI -1D054 ; [*102A.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON -1D055 ; [*102B.0020.0002] # BYZANTINE MUSICAL SYMBOL ELAFRON -1D056 ; [*102C.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILI -1D057 ; [*102D.0020.0002] # BYZANTINE MUSICAL SYMBOL MIKRON ISON -1D058 ; [*102E.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA NEO -1D059 ; [*102F.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA NEO -1D05A ; [*1030.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO -1D05B ; [*1031.0020.0002] # BYZANTINE MUSICAL SYMBOL OMALON -1D05C ; [*1032.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA -1D05D ; [*1033.0020.0002] # BYZANTINE MUSICAL SYMBOL LYGISMA -1D05E ; [*1034.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO -1D05F ; [*1035.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO -1D060 ; [*1036.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA -1D061 ; [*1037.0020.0002] # BYZANTINE MUSICAL SYMBOL KYLISMA -1D062 ; [*1038.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA -1D063 ; [*1039.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO -1D064 ; [*103A.0020.0002] # BYZANTINE MUSICAL SYMBOL EKSTREPTON -1D065 ; [*103B.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO -1D066 ; [*103C.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMA -1D067 ; [*103D.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO -1D068 ; [*103E.0020.0002] # BYZANTINE MUSICAL SYMBOL EPEGERMA -1D069 ; [*103F.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA NEO -1D06A ; [*1040.0020.0002] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA -1D06B ; [*1041.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON -1D06C ; [*1042.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA -1D06D ; [*1043.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA -1D06E ; [*1044.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA -1D06F ; [*1045.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA -1D070 ; [*1046.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA -1D071 ; [*1047.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA -1D072 ; [*1048.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON -1D073 ; [*1049.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON -1D074 ; [*104A.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON -1D075 ; [*104B.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO -1D076 ; [*104C.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO -1D077 ; [*104D.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO -1D078 ; [*104E.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN -1D079 ; [*104F.0020.0002] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES -1D07A ; [*1050.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVASMA -1D07B ; [*1051.0020.0002] # BYZANTINE MUSICAL SYMBOL ENDOFONON -1D07C ; [*1052.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN KATO -1D07D ; [*1053.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN ANO -1D07E ; [*1054.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS -1D07F ; [*1055.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA ANO -1D080 ; [*1056.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION -1D081 ; [*1057.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION -1D082 ; [*1058.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO -1D083 ; [*1059.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO -1D084 ; [*105A.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA NEO -1D085 ; [*105B.0020.0002] # BYZANTINE MUSICAL SYMBOL APLI -1D086 ; [*105C.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI -1D087 ; [*105D.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIPLI -1D088 ; [*105E.0020.0002] # BYZANTINE MUSICAL SYMBOL TETRAPLI -1D089 ; [*105F.0020.0002] # BYZANTINE MUSICAL SYMBOL KORONIS -1D08A ; [*1060.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU -1D08B ; [*1061.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON -1D08C ; [*1062.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON -1D08D ; [*1063.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON -1D08E ; [*1064.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU -1D08F ; [*1065.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO -1D090 ; [*1066.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA -1D091 ; [*1067.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA -1D092 ; [*1068.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON -1D093 ; [*1069.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO -1D094 ; [*106A.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO -1D095 ; [*106B.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA -1D096 ; [*106C.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIGORGON -1D097 ; [*106D.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGON -1D098 ; [*106E.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIDIARGON -1D099 ; [*106F.0020.0002] # BYZANTINE MUSICAL SYMBOL DIARGON -1D09A ; [*1070.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI -1D09B ; [*1071.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI -1D09C ; [*1072.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI -1D09D ; [*1073.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA -1D09E ; [*1074.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI MESI -1D09F ; [*1075.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI -1D0A0 ; [*1076.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI -1D0A1 ; [*1077.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI -1D0A2 ; [*1078.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS -1D0A3 ; [*1079.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS -1D0A4 ; [*107A.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS -1D0A5 ; [*107B.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS -1D0A6 ; [*107C.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS -1D0A7 ; [*107D.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS -1D0A8 ; [*107E.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS -1D0A9 ; [*107F.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS -1D0AA ; [*1080.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS -1D0AB ; [*1081.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS -1D0AC ; [*1082.0020.0002] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS -1D0AD ; [*1083.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS -1D0AE ; [*1084.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS -1D0AF ; [*1085.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS -1D0B0 ; [*1086.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS -1D0B1 ; [*1087.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS -1D0B2 ; [*1088.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS -1D0B3 ; [*1089.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS -1D0B4 ; [*108A.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN -1D0B5 ; [*108B.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN -1D0B6 ; [*108C.0020.0002] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU -1D0B7 ; [*108D.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFONON -1D0B8 ; [*108E.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORON -1D0B9 ; [*108F.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU -1D0BA ; [*1090.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA -1D0BB ; [*1091.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA -1D0BC ; [*1092.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS -1D0BD ; [*1093.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI -1D0BE ; [*1094.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI -1D0BF ; [*1095.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE -1D0C0 ; [*1096.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO -1D0C1 ; [*1097.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO -1D0C2 ; [*1098.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO -1D0C3 ; [*1099.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS -1D0C4 ; [*109A.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS -1D0C5 ; [*109B.0020.0002] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS -1D0C6 ; [*109C.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI -1D0C7 ; [*109D.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO -1D0C8 ; [*109E.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS -1D0C9 ; [*109F.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA KLITON -1D0CA ; [*10A0.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI -1D0CB ; [*10A1.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION -1D0CC ; [*10A2.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA -1D0CD ; [*10A3.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION -1D0CE ; [*10A4.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION -1D0CF ; [*10A5.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION -1D0D0 ; [*10A6.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA -1D0D1 ; [*10A7.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA -1D0D2 ; [*10A8.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA -1D0D3 ; [*10A9.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA -1D0D4 ; [*10AA.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA -1D0D5 ; [*10AB.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA -1D0D6 ; [*10AC.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA -1D0D7 ; [*10AD.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA -1D0D8 ; [*10AE.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS -1D0D9 ; [*10AF.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS -1D0DA ; [*10B0.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI -1D0DB ; [*10B1.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI -1D0DC ; [*10B2.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI -1D0DD ; [*10B3.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS -1D0DE ; [*10B4.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS -1D0DF ; [*10B5.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU -1D0E0 ; [*10B6.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU -1D0E1 ; [*10B7.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU -1D0E2 ; [*10B8.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS -1D0E3 ; [*10B9.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU -1D0E4 ; [*10BA.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU -1D0E5 ; [*10BB.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU -1D0E6 ; [*10BC.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG -1D0E7 ; [*10BD.0020.0002] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU -1D0E8 ; [*10BE.0020.0002] # BYZANTINE MUSICAL SYMBOL STIGMA -1D0E9 ; [*10BF.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA -1D0EA ; [*10C0.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU -1D0EB ; [*10C1.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA -1D0EC ; [*10C2.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI -1D0ED ; [*10C3.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE -1D0EE ; [*10C4.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO -1D0EF ; [*10C5.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI -1D0F0 ; [*10C6.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO -1D0F1 ; [*10C7.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO -1D0F2 ; [*10C8.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO -1D0F3 ; [*10C9.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO -1D0F4 ; [*10CA.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA KATO -1D0F5 ; [*10CB.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D100 ; [*10CC.0020.0002] # MUSICAL SYMBOL SINGLE BARLINE -1D101 ; [*10CD.0020.0002] # MUSICAL SYMBOL DOUBLE BARLINE -1D102 ; [*10CE.0020.0002] # MUSICAL SYMBOL FINAL BARLINE -1D103 ; [*10CF.0020.0002] # MUSICAL SYMBOL REVERSE FINAL BARLINE -1D104 ; [*10D0.0020.0002] # MUSICAL SYMBOL DASHED BARLINE -1D105 ; [*10D1.0020.0002] # MUSICAL SYMBOL SHORT BARLINE -1D106 ; [*10D2.0020.0002] # MUSICAL SYMBOL LEFT REPEAT SIGN -1D107 ; [*10D3.0020.0002] # MUSICAL SYMBOL RIGHT REPEAT SIGN -1D108 ; [*10D4.0020.0002] # MUSICAL SYMBOL REPEAT DOTS -1D109 ; [*10D5.0020.0002] # MUSICAL SYMBOL DAL SEGNO -1D10A ; [*10D6.0020.0002] # MUSICAL SYMBOL DA CAPO -1D10B ; [*10D7.0020.0002] # MUSICAL SYMBOL SEGNO -1D10C ; [*10D8.0020.0002] # MUSICAL SYMBOL CODA -1D10D ; [*10D9.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-1 -1D10E ; [*10DA.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-2 -1D10F ; [*10DB.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-3 -1D110 ; [*10DC.0020.0002] # MUSICAL SYMBOL FERMATA -1D111 ; [*10DD.0020.0002] # MUSICAL SYMBOL FERMATA BELOW -1D112 ; [*10DE.0020.0002] # MUSICAL SYMBOL BREATH MARK -1D113 ; [*10DF.0020.0002] # MUSICAL SYMBOL CAESURA -1D114 ; [*10E0.0020.0002] # MUSICAL SYMBOL BRACE -1D115 ; [*10E1.0020.0002] # MUSICAL SYMBOL BRACKET -1D116 ; [*10E2.0020.0002] # MUSICAL SYMBOL ONE-LINE STAFF -1D117 ; [*10E3.0020.0002] # MUSICAL SYMBOL TWO-LINE STAFF -1D118 ; [*10E4.0020.0002] # MUSICAL SYMBOL THREE-LINE STAFF -1D119 ; [*10E5.0020.0002] # MUSICAL SYMBOL FOUR-LINE STAFF -1D11A ; [*10E6.0020.0002] # MUSICAL SYMBOL FIVE-LINE STAFF -1D11B ; [*10E7.0020.0002] # MUSICAL SYMBOL SIX-LINE STAFF -1D11C ; [*10E8.0020.0002] # MUSICAL SYMBOL SIX-STRING FRETBOARD -1D11D ; [*10E9.0020.0002] # MUSICAL SYMBOL FOUR-STRING FRETBOARD -1D11E ; [*10EA.0020.0002] # MUSICAL SYMBOL G CLEF -1D11F ; [*10EB.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA ALTA -1D120 ; [*10EC.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA BASSA -1D121 ; [*10ED.0020.0002] # MUSICAL SYMBOL C CLEF -1D122 ; [*10EE.0020.0002] # MUSICAL SYMBOL F CLEF -1D123 ; [*10EF.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA ALTA -1D124 ; [*10F0.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA BASSA -1D125 ; [*10F1.0020.0002] # MUSICAL SYMBOL DRUM CLEF-1 -1D126 ; [*10F2.0020.0002] # MUSICAL SYMBOL DRUM CLEF-2 -1D129 ; [*1106.0020.0002] # MUSICAL SYMBOL MULTIPLE MEASURE REST -1D12A ; [*10F6.0020.0002] # MUSICAL SYMBOL DOUBLE SHARP -1D12B ; [*10F7.0020.0002] # MUSICAL SYMBOL DOUBLE FLAT -1D12C ; [*10F8.0020.0002] # MUSICAL SYMBOL FLAT UP -1D12D ; [*10F9.0020.0002] # MUSICAL SYMBOL FLAT DOWN -1D12E ; [*10FA.0020.0002] # MUSICAL SYMBOL NATURAL UP -1D12F ; [*10FB.0020.0002] # MUSICAL SYMBOL NATURAL DOWN -1D130 ; [*10FC.0020.0002] # MUSICAL SYMBOL SHARP UP -1D131 ; [*10FD.0020.0002] # MUSICAL SYMBOL SHARP DOWN -1D132 ; [*10FE.0020.0002] # MUSICAL SYMBOL QUARTER TONE SHARP -1D133 ; [*10FF.0020.0002] # MUSICAL SYMBOL QUARTER TONE FLAT -1D134 ; [*1100.0020.0002] # MUSICAL SYMBOL COMMON TIME -1D135 ; [*1101.0020.0002] # MUSICAL SYMBOL CUT TIME -1D136 ; [*1102.0020.0002] # MUSICAL SYMBOL OTTAVA ALTA -1D137 ; [*1103.0020.0002] # MUSICAL SYMBOL OTTAVA BASSA -1D138 ; [*1104.0020.0002] # MUSICAL SYMBOL QUINDICESIMA ALTA -1D139 ; [*1105.0020.0002] # MUSICAL SYMBOL QUINDICESIMA BASSA -1D13A ; [*1107.0020.0002] # MUSICAL SYMBOL MULTI REST -1D13B ; [*1108.0020.0002] # MUSICAL SYMBOL WHOLE REST -1D13C ; [*1109.0020.0002] # MUSICAL SYMBOL HALF REST -1D13D ; [*110A.0020.0002] # MUSICAL SYMBOL QUARTER REST -1D13E ; [*110B.0020.0002] # MUSICAL SYMBOL EIGHTH REST -1D13F ; [*110C.0020.0002] # MUSICAL SYMBOL SIXTEENTH REST -1D140 ; [*110D.0020.0002] # MUSICAL SYMBOL THIRTY-SECOND REST -1D141 ; [*110E.0020.0002] # MUSICAL SYMBOL SIXTY-FOURTH REST -1D142 ; [*110F.0020.0002] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST -1D143 ; [*1110.0020.0002] # MUSICAL SYMBOL X NOTEHEAD -1D144 ; [*1111.0020.0002] # MUSICAL SYMBOL PLUS NOTEHEAD -1D145 ; [*1112.0020.0002] # MUSICAL SYMBOL CIRCLE X NOTEHEAD -1D146 ; [*1113.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE -1D147 ; [*1114.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK -1D148 ; [*1115.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE -1D149 ; [*1116.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK -1D14A ; [*1117.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE -1D14B ; [*1118.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK -1D14C ; [*1119.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE -1D14D ; [*111A.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK -1D14E ; [*111B.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE -1D14F ; [*111C.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK -1D150 ; [*111D.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE -1D151 ; [*111E.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK -1D152 ; [*111F.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD WHITE -1D153 ; [*1120.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD BLACK -1D154 ; [*1121.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE -1D155 ; [*1122.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK -1D156 ; [*1123.0020.0002] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD -1D157 ; [*1124.0020.0002] # MUSICAL SYMBOL VOID NOTEHEAD -1D158 ; [*1125.0020.0002] # MUSICAL SYMBOL NOTEHEAD BLACK -1D159 ; [*1126.0020.0002] # MUSICAL SYMBOL NULL NOTEHEAD -1D15A ; [*1127.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE -1D15B ; [*1128.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK -1D15C ; [*1129.0020.0002] # MUSICAL SYMBOL BREVE -1D15D ; [*112A.0020.0002] # MUSICAL SYMBOL WHOLE NOTE -1D15E ; [*1124.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL HALF NOTE -1D15F ; [*1125.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL QUARTER NOTE -1D160 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL EIGHTH NOTE -1D161 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTEENTH NOTE -1D162 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL THIRTY-SECOND NOTE -1D163 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTY-FOURTH NOTE -1D164 ; [*1125.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1144B ; [*02B7.0020.0002] # NEWA DANDA +1144C ; [*02B8.0020.0002] # NEWA DOUBLE DANDA +1144D ; [*0471.0020.0002] # NEWA COMMA +1144E ; [*0472.0020.0002] # NEWA GAP FILLER +1144F ; [*0473.0020.0002] # NEWA ABBREVIATION SIGN +1145B ; [*0474.0020.0002] # NEWA PLACEHOLDER MARK +1145D ; [*0475.0020.0002] # NEWA INSERTION SIGN +114C6 ; [*0476.0020.0002] # TIRHUTA ABBREVIATION SIGN +115C1 ; [*0477.0020.0002] # SIDDHAM SIGN SIDDHAM +115C2 ; [*02B9.0020.0002] # SIDDHAM DANDA +115C3 ; [*02BA.0020.0002] # SIDDHAM DOUBLE DANDA +115C4 ; [*0478.0020.0002] # SIDDHAM SEPARATOR DOT +115C5 ; [*0479.0020.0002] # SIDDHAM SEPARATOR BAR +115C6 ; [*047A.0020.0002] # SIDDHAM REPETITION MARK-1 +115C7 ; [*047B.0020.0002] # SIDDHAM REPETITION MARK-2 +115C8 ; [*047C.0020.0002] # SIDDHAM REPETITION MARK-3 +115C9 ; [*047D.0020.0002] # SIDDHAM END OF TEXT MARK +115CA ; [*047E.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS +115CB ; [*047F.0020.0002] # SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS +115CC ; [*0480.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS +115CD ; [*0481.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS +115CE ; [*0482.0020.0002] # SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS +115CF ; [*0483.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING +115D0 ; [*0484.0020.0002] # SIDDHAM SECTION MARK DOUBLE RING WITH RAYS +115D1 ; [*0485.0020.0002] # SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS +115D2 ; [*0486.0020.0002] # SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS +115D3 ; [*0487.0020.0002] # SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS +115D4 ; [*0488.0020.0002] # SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS +115D5 ; [*0489.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND RAYS +115D6 ; [*048A.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES +115D7 ; [*048B.0020.0002] # SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +11641 ; [*02BB.0020.0002] # MODI DANDA +11642 ; [*02BC.0020.0002] # MODI DOUBLE DANDA +11643 ; [*048C.0020.0002] # MODI ABBREVIATION SIGN +11660 ; [*03DF.0020.0002] # MONGOLIAN BIRGA WITH ORNAMENT +11661 ; [*03E0.0020.0002] # MONGOLIAN ROTATED BIRGA +11662 ; [*03E1.0020.0002] # MONGOLIAN DOUBLE BIRGA WITH ORNAMENT +11663 ; [*03E2.0020.0002] # MONGOLIAN TRIPLE BIRGA WITH ORNAMENT +11664 ; [*03E3.0020.0002] # MONGOLIAN BIRGA WITH DOUBLE ORNAMENT +11665 ; [*03E4.0020.0002] # MONGOLIAN ROTATED BIRGA WITH ORNAMENT +11666 ; [*03E5.0020.0002] # MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT +11667 ; [*03E6.0020.0002] # MONGOLIAN INVERTED BIRGA +11668 ; [*03E7.0020.0002] # MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT +11669 ; [*03E8.0020.0002] # MONGOLIAN SWIRL BIRGA +1166A ; [*03E9.0020.0002] # MONGOLIAN SWIRL BIRGA WITH ORNAMENT +1166B ; [*03EA.0020.0002] # MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT +1166C ; [*03EB.0020.0002] # MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +1173A ; [*1BD5.0020.0002] # AHOM NUMBER TEN +1173B ; [*1BD6.0020.0002] # AHOM NUMBER TWENTY +1173C ; [*02BD.0020.0002] # AHOM SIGN SMALL SECTION +1173D ; [*02BE.0020.0002] # AHOM SIGN SECTION +1173E ; [*02E8.0020.0002] # AHOM SIGN RULAI +1173F ; [*0566.0020.0002] # AHOM SYMBOL VI +118EA ; [*1BFB.0020.0002] # WARANG CITI NUMBER TEN +118EB ; [*1BFC.0020.0002] # WARANG CITI NUMBER TWENTY +118EC ; [*1BFD.0020.0002] # WARANG CITI NUMBER THIRTY +118ED ; [*1BFE.0020.0002] # WARANG CITI NUMBER FORTY +118EE ; [*1BFF.0020.0002] # WARANG CITI NUMBER FIFTY +118EF ; [*1C00.0020.0002] # WARANG CITI NUMBER SIXTY +118F0 ; [*1C01.0020.0002] # WARANG CITI NUMBER SEVENTY +118F1 ; [*1C02.0020.0002] # WARANG CITI NUMBER EIGHTY +118F2 ; [*1C03.0020.0002] # WARANG CITI NUMBER NINETY +11A3F ; [*040F.0020.0002] # ZANABAZAR SQUARE INITIAL HEAD MARK +11A40 ; [*0410.0020.0002] # ZANABAZAR SQUARE CLOSING HEAD MARK +11A41 ; [*0411.0020.0002] # ZANABAZAR SQUARE MARK TSHEG +11A42 ; [*0412.0020.0002] # ZANABAZAR SQUARE MARK SHAD +11A43 ; [*0413.0020.0002] # ZANABAZAR SQUARE MARK DOUBLE SHAD +11A44 ; [*0414.0020.0002] # ZANABAZAR SQUARE MARK LONG TSHEG +11A45 ; [*0415.0020.0002] # ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK +11A46 ; [*0416.0020.0002] # ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A9A ; [*0417.0020.0002] # SOYOMBO MARK TSHEG +11A9B ; [*0418.0020.0002] # SOYOMBO MARK SHAD +11A9C ; [*0419.0020.0002] # SOYOMBO MARK DOUBLE SHAD +11A9E ; [*041A.0020.0002] # SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME +11A9F ; [*041B.0020.0002] # SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME +11AA0 ; [*041C.0020.0002] # SOYOMBO HEAD MARK WITH MOON AND SUN +11AA1 ; [*041D.0020.0002] # SOYOMBO TERMINAL MARK-1 +11AA2 ; [*041E.0020.0002] # SOYOMBO TERMINAL MARK-2 +11C41 ; [*02BF.0020.0002] # BHAIKSUKI DANDA +11C42 ; [*02C0.0020.0002] # BHAIKSUKI DOUBLE DANDA +11C43 ; [*0455.0020.0002] # BHAIKSUKI WORD SEPARATOR +11C44 ; [*0456.0020.0002] # BHAIKSUKI GAP FILLER-1 +11C45 ; [*0457.0020.0002] # BHAIKSUKI GAP FILLER-2 +11C63 ; [*1BE6.0020.0002] # BHAIKSUKI NUMBER TEN +11C64 ; [*1BE7.0020.0002] # BHAIKSUKI NUMBER TWENTY +11C65 ; [*1BE8.0020.0002] # BHAIKSUKI NUMBER THIRTY +11C66 ; [*1BE9.0020.0002] # BHAIKSUKI NUMBER FORTY +11C67 ; [*1BEA.0020.0002] # BHAIKSUKI NUMBER FIFTY +11C68 ; [*1BEB.0020.0002] # BHAIKSUKI NUMBER SIXTY +11C69 ; [*1BEC.0020.0002] # BHAIKSUKI NUMBER SEVENTY +11C6A ; [*1BED.0020.0002] # BHAIKSUKI NUMBER EIGHTY +11C6B ; [*1BEE.0020.0002] # BHAIKSUKI NUMBER NINETY +11C6C ; [*1BEF.0020.0002] # BHAIKSUKI HUNDREDS UNIT MARK +11C70 ; [*041F.0020.0002] # MARCHEN HEAD MARK +11C71 ; [*0420.0020.0002] # MARCHEN MARK SHAD +12432 ; [*1C42.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH +12433 ; [*1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN +1245A ; [*1C44.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD DISH +1245B ; [*1C45.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS DISH +1245C ; [*1C46.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH +1245D ; [*1C47.0020.0002] # CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A +1245E ; [*1C48.0020.0002] # CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A +1245F ; [*1C49.0020.0002] # CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH +12460 ; [*1C4A.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER ASH +12461 ; [*1C4B.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH +12462 ; [*1C4C.0020.0002] # CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER +12463 ; [*1C4D.0020.0002] # CUNEIFORM NUMERIC SIGN ONE QUARTER GUR +12464 ; [*1C4E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE HALF GUR +12465 ; [*1C4F.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD +12466 ; [*1C50.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS +12467 ; [*1C51.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FORTY +12468 ; [*1C52.0020.0002] # CUNEIFORM NUMERIC SIGN ELAMITE FIFTY +12470 ; [*0301.0020.0002] # CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER +12471 ; [*0302.0020.0002] # CUNEIFORM PUNCTUATION SIGN VERTICAL COLON +12472 ; [*0303.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON +12473 ; [*0304.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON +12474 ; [*0305.0020.0002] # CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +16A6E ; [*02C1.0020.0002] # MRO DANDA +16A6F ; [*02C2.0020.0002] # MRO DOUBLE DANDA +16AF5 ; [*0289.0020.0002] # BASSA VAH FULL STOP +16B37 ; [*048D.0020.0002] # PAHAWH HMONG SIGN VOS THOM +16B38 ; [*048E.0020.0002] # PAHAWH HMONG SIGN VOS TSHAB CEEB +16B39 ; [*048F.0020.0002] # PAHAWH HMONG SIGN CIM CHEEM +16B3A ; [*0490.0020.0002] # PAHAWH HMONG SIGN VOS THIAB +16B3B ; [*0491.0020.0002] # PAHAWH HMONG SIGN VOS FEEM +16B3C ; [*0FE9.0020.0002] # PAHAWH HMONG SIGN XYEEM NTXIV +16B3D ; [*0FEA.0020.0002] # PAHAWH HMONG SIGN XYEEM RHO +16B3E ; [*0FEB.0020.0002] # PAHAWH HMONG SIGN XYEEM TOV +16B3F ; [*0FEC.0020.0002] # PAHAWH HMONG SIGN XYEEM FAIB +16B44 ; [*0492.0020.0002] # PAHAWH HMONG SIGN XAUS +16B45 ; [*0FED.0020.0002] # PAHAWH HMONG SIGN CIM TSOV ROG +16B5B ; [*1C04.0020.0002] # PAHAWH HMONG NUMBER TENS +16B5C ; [*1C05.0020.0002] # PAHAWH HMONG NUMBER HUNDREDS +16B5D ; [*1C06.0020.0002] # PAHAWH HMONG NUMBER TEN THOUSANDS +16B5E ; [*1C07.0020.0002] # PAHAWH HMONG NUMBER MILLIONS +16B5F ; [*1C08.0020.0002] # PAHAWH HMONG NUMBER HUNDRED MILLIONS +16B60 ; [*1C09.0020.0002] # PAHAWH HMONG NUMBER TEN BILLIONS +16B61 ; [*1C0A.0020.0002] # PAHAWH HMONG NUMBER TRILLIONS +1BC9C ; [*11DE.0020.0002] # DUPLOYAN SIGN O WITH CROSS +1BC9F ; [*028A.0020.0002] # DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1D000 ; [*0FEE.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILI +1D001 ; [*0FEF.0020.0002] # BYZANTINE MUSICAL SYMBOL DASEIA +1D002 ; [*0FF0.0020.0002] # BYZANTINE MUSICAL SYMBOL PERISPOMENI +1D003 ; [*0FF1.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON +1D004 ; [*0FF2.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA DIPLI +1D005 ; [*0FF3.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON +1D006 ; [*0FF4.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA DIPLI +1D007 ; [*0FF5.0020.0002] # BYZANTINE MUSICAL SYMBOL KATHISTI +1D008 ; [*0FF6.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMATIKI +1D009 ; [*0FF7.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI +1D00A ; [*0FF8.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS +1D00B ; [*0FF9.0020.0002] # BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI +1D00C ; [*0FFA.0020.0002] # BYZANTINE MUSICAL SYMBOL KREMASTI +1D00D ; [*0FFB.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON +1D00E ; [*0FFC.0020.0002] # BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON +1D00F ; [*0FFD.0020.0002] # BYZANTINE MUSICAL SYMBOL TELEIA +1D010 ; [*0FFE.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA +1D011 ; [*0FFF.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS +1D012 ; [*1000.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI +1D013 ; [*1001.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNEVMA +1D014 ; [*1002.0020.0002] # BYZANTINE MUSICAL SYMBOL THITA +1D015 ; [*1003.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION +1D016 ; [*1004.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON ARCHAION +1D017 ; [*1005.0020.0002] # BYZANTINE MUSICAL SYMBOL PSILON +1D018 ; [*1006.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILON +1D019 ; [*1007.0020.0002] # BYZANTINE MUSICAL SYMBOL VATHY +1D01A ; [*1008.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON ARCHAION +1D01B ; [*1009.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION +1D01C ; [*100A.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION +1D01D ; [*100B.0020.0002] # BYZANTINE MUSICAL SYMBOL SAXIMATA +1D01E ; [*100C.0020.0002] # BYZANTINE MUSICAL SYMBOL PARICHON +1D01F ; [*100D.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA +1D020 ; [*100E.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION +1D021 ; [*100F.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION +1D022 ; [*1010.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION +1D023 ; [*1011.0020.0002] # BYZANTINE MUSICAL SYMBOL APOTHEMA +1D024 ; [*1012.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA +1D025 ; [*1013.0020.0002] # BYZANTINE MUSICAL SYMBOL REVMA +1D026 ; [*1014.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION +1D027 ; [*1015.0020.0002] # BYZANTINE MUSICAL SYMBOL TINAGMA +1D028 ; [*1016.0020.0002] # BYZANTINE MUSICAL SYMBOL ANATRICHISMA +1D029 ; [*1017.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA +1D02A ; [*1018.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION +1D02B ; [*1019.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU +1D02C ; [*101A.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION +1D02D ; [*101B.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA +1D02E ; [*101C.0020.0002] # BYZANTINE MUSICAL SYMBOL LEMOI +1D02F ; [*101D.0020.0002] # BYZANTINE MUSICAL SYMBOL DYO +1D030 ; [*101E.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIA +1D031 ; [*101F.0020.0002] # BYZANTINE MUSICAL SYMBOL TESSERA +1D032 ; [*1020.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMATA +1D033 ; [*1021.0020.0002] # BYZANTINE MUSICAL SYMBOL APESO EXO NEO +1D034 ; [*1022.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION +1D035 ; [*1023.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORA +1D036 ; [*1024.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION +1D037 ; [*1025.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON +1D038 ; [*1026.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON +1D039 ; [*1027.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON +1D03A ; [*1028.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA +1D03B ; [*1029.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION +1D03C ; [*102A.0020.0002] # BYZANTINE MUSICAL SYMBOL RAPISMA +1D03D ; [*102B.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION +1D03E ; [*102C.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION +1D03F ; [*102D.0020.0002] # BYZANTINE MUSICAL SYMBOL ICHADIN +1D040 ; [*102E.0020.0002] # BYZANTINE MUSICAL SYMBOL NANA +1D041 ; [*102F.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASMA +1D042 ; [*1030.0020.0002] # BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO +1D043 ; [*1031.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON ALLO +1D044 ; [*1032.0020.0002] # BYZANTINE MUSICAL SYMBOL STRAGGISMATA +1D045 ; [*1033.0020.0002] # BYZANTINE MUSICAL SYMBOL GRONTHISMATA +1D046 ; [*1034.0020.0002] # BYZANTINE MUSICAL SYMBOL ISON NEO +1D047 ; [*1035.0020.0002] # BYZANTINE MUSICAL SYMBOL OLIGON NEO +1D048 ; [*1036.0020.0002] # BYZANTINE MUSICAL SYMBOL OXEIA NEO +1D049 ; [*1037.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTI +1D04A ; [*1038.0020.0002] # BYZANTINE MUSICAL SYMBOL KOUFISMA +1D04B ; [*1039.0020.0002] # BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA +1D04C ; [*103A.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA +1D04D ; [*103B.0020.0002] # BYZANTINE MUSICAL SYMBOL PELASTON NEO +1D04E ; [*103C.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO +1D04F ; [*103D.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO +1D050 ; [*103E.0020.0002] # BYZANTINE MUSICAL SYMBOL YPSILI +1D051 ; [*103F.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO +1D052 ; [*1040.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO +1D053 ; [*1041.0020.0002] # BYZANTINE MUSICAL SYMBOL YPORROI +1D054 ; [*1042.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON +1D055 ; [*1043.0020.0002] # BYZANTINE MUSICAL SYMBOL ELAFRON +1D056 ; [*1044.0020.0002] # BYZANTINE MUSICAL SYMBOL CHAMILI +1D057 ; [*1045.0020.0002] # BYZANTINE MUSICAL SYMBOL MIKRON ISON +1D058 ; [*1046.0020.0002] # BYZANTINE MUSICAL SYMBOL VAREIA NEO +1D059 ; [*1047.0020.0002] # BYZANTINE MUSICAL SYMBOL PIASMA NEO +1D05A ; [*1048.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTON NEO +1D05B ; [*1049.0020.0002] # BYZANTINE MUSICAL SYMBOL OMALON +1D05C ; [*104A.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOMA +1D05D ; [*104B.0020.0002] # BYZANTINE MUSICAL SYMBOL LYGISMA +1D05E ; [*104C.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO +1D05F ; [*104D.0020.0002] # BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO +1D060 ; [*104E.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA +1D061 ; [*104F.0020.0002] # BYZANTINE MUSICAL SYMBOL KYLISMA +1D062 ; [*1050.0020.0002] # BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA +1D063 ; [*1051.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKON NEO +1D064 ; [*1052.0020.0002] # BYZANTINE MUSICAL SYMBOL EKSTREPTON +1D065 ; [*1053.0020.0002] # BYZANTINE MUSICAL SYMBOL SYNAGMA NEO +1D066 ; [*1054.0020.0002] # BYZANTINE MUSICAL SYMBOL SYRMA +1D067 ; [*1055.0020.0002] # BYZANTINE MUSICAL SYMBOL CHOREVMA NEO +1D068 ; [*1056.0020.0002] # BYZANTINE MUSICAL SYMBOL EPEGERMA +1D069 ; [*1057.0020.0002] # BYZANTINE MUSICAL SYMBOL SEISMA NEO +1D06A ; [*1058.0020.0002] # BYZANTINE MUSICAL SYMBOL XIRON KLASMA +1D06B ; [*1059.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON +1D06C ; [*105A.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA +1D06D ; [*105B.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA +1D06E ; [*105C.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA +1D06F ; [*105D.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA +1D070 ; [*105E.0020.0002] # BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA +1D071 ; [*105F.0020.0002] # BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA +1D072 ; [*1060.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON +1D073 ; [*1061.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON +1D074 ; [*1062.0020.0002] # BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON +1D075 ; [*1063.0020.0002] # BYZANTINE MUSICAL SYMBOL OYRANISMA NEO +1D076 ; [*1064.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO +1D077 ; [*1065.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO +1D078 ; [*1066.0020.0002] # BYZANTINE MUSICAL SYMBOL THEMA APLOUN +1D079 ; [*1067.0020.0002] # BYZANTINE MUSICAL SYMBOL THES KAI APOTHES +1D07A ; [*1068.0020.0002] # BYZANTINE MUSICAL SYMBOL KATAVASMA +1D07B ; [*1069.0020.0002] # BYZANTINE MUSICAL SYMBOL ENDOFONON +1D07C ; [*106A.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN KATO +1D07D ; [*106B.0020.0002] # BYZANTINE MUSICAL SYMBOL YFEN ANO +1D07E ; [*106C.0020.0002] # BYZANTINE MUSICAL SYMBOL STAVROS +1D07F ; [*106D.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA ANO +1D080 ; [*106E.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION +1D081 ; [*106F.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION +1D082 ; [*1070.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA ALLO +1D083 ; [*1071.0020.0002] # BYZANTINE MUSICAL SYMBOL KRATIMA NEO +1D084 ; [*1072.0020.0002] # BYZANTINE MUSICAL SYMBOL APODERMA NEO +1D085 ; [*1073.0020.0002] # BYZANTINE MUSICAL SYMBOL APLI +1D086 ; [*1074.0020.0002] # BYZANTINE MUSICAL SYMBOL DIPLI +1D087 ; [*1075.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIPLI +1D088 ; [*1076.0020.0002] # BYZANTINE MUSICAL SYMBOL TETRAPLI +1D089 ; [*1077.0020.0002] # BYZANTINE MUSICAL SYMBOL KORONIS +1D08A ; [*1078.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU +1D08B ; [*1079.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON +1D08C ; [*107A.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON +1D08D ; [*107B.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON +1D08E ; [*107C.0020.0002] # BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU +1D08F ; [*107D.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO ANO +1D090 ; [*107E.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA +1D091 ; [*107F.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA +1D092 ; [*1080.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON +1D093 ; [*1081.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO +1D094 ; [*1082.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO +1D095 ; [*1083.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA +1D096 ; [*1084.0020.0002] # BYZANTINE MUSICAL SYMBOL TRIGORGON +1D097 ; [*1085.0020.0002] # BYZANTINE MUSICAL SYMBOL ARGON +1D098 ; [*1086.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIDIARGON +1D099 ; [*1087.0020.0002] # BYZANTINE MUSICAL SYMBOL DIARGON +1D09A ; [*1088.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI +1D09B ; [*1089.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI +1D09C ; [*108A.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI ARGI +1D09D ; [*108B.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI METRIA +1D09E ; [*108C.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI MESI +1D09F ; [*108D.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGI +1D0A0 ; [*108E.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI +1D0A1 ; [*108F.0020.0002] # BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI +1D0A2 ; [*1090.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS +1D0A3 ; [*1091.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS +1D0A4 ; [*1092.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS +1D0A5 ; [*1093.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS +1D0A6 ; [*1094.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS +1D0A7 ; [*1095.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS +1D0A8 ; [*1096.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS +1D0A9 ; [*1097.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS +1D0AA ; [*1098.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS +1D0AB ; [*1099.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS +1D0AC ; [*109A.0020.0002] # BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS +1D0AD ; [*109B.0020.0002] # BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS +1D0AE ; [*109C.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS +1D0AF ; [*109D.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS +1D0B0 ; [*109E.0020.0002] # BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS +1D0B1 ; [*109F.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS +1D0B2 ; [*10A0.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS +1D0B3 ; [*10A1.0020.0002] # BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS +1D0B4 ; [*10A2.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN +1D0B5 ; [*10A3.0020.0002] # BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN +1D0B6 ; [*10A4.0020.0002] # BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU +1D0B7 ; [*10A5.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFONON +1D0B8 ; [*10A6.0020.0002] # BYZANTINE MUSICAL SYMBOL IMIFTHORON +1D0B9 ; [*10A7.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU +1D0BA ; [*10A8.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA +1D0BB ; [*10A9.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA +1D0BC ; [*10AA.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS +1D0BD ; [*10AB.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI +1D0BE ; [*10AC.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI +1D0BF ; [*10AD.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE +1D0C0 ; [*10AE.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO +1D0C1 ; [*10AF.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO +1D0C2 ; [*10B0.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO +1D0C3 ; [*10B1.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS +1D0C4 ; [*10B2.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS +1D0C5 ; [*10B3.0020.0002] # BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS +1D0C6 ; [*10B4.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI +1D0C7 ; [*10B5.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA NENANO +1D0C8 ; [*10B6.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA ZYGOS +1D0C9 ; [*10B7.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA KLITON +1D0CA ; [*10B8.0020.0002] # BYZANTINE MUSICAL SYMBOL CHROA SPATHI +1D0CB ; [*10B9.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION +1D0CC ; [*10BA.0020.0002] # BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA +1D0CD ; [*10BB.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION +1D0CE ; [*10BC.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION +1D0CF ; [*10BD.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION +1D0D0 ; [*10BE.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA +1D0D1 ; [*10BF.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA +1D0D2 ; [*10C0.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA +1D0D3 ; [*10C1.0020.0002] # BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA +1D0D4 ; [*10C2.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA +1D0D5 ; [*10C3.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA +1D0D6 ; [*10C4.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA +1D0D7 ; [*10C5.0020.0002] # BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA +1D0D8 ; [*10C6.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI DIESIS +1D0D9 ; [*10C7.0020.0002] # BYZANTINE MUSICAL SYMBOL GENIKI YFESIS +1D0DA ; [*10C8.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI +1D0DB ; [*10C9.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI +1D0DC ; [*10CA.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI +1D0DD ; [*10CB.0020.0002] # BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS +1D0DE ; [*10CC.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS +1D0DF ; [*10CD.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU +1D0E0 ; [*10CE.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU +1D0E1 ; [*10CF.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU +1D0E2 ; [*10D0.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS +1D0E3 ; [*10D1.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU +1D0E4 ; [*10D2.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU +1D0E5 ; [*10D3.0020.0002] # BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU +1D0E6 ; [*10D4.0020.0002] # BYZANTINE MUSICAL SYMBOL DIGRAMMA GG +1D0E7 ; [*10D5.0020.0002] # BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU +1D0E8 ; [*10D6.0020.0002] # BYZANTINE MUSICAL SYMBOL STIGMA +1D0E9 ; [*10D7.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO PA +1D0EA ; [*10D8.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO VOU +1D0EB ; [*10D9.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO GA +1D0EC ; [*10DA.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO DI +1D0ED ; [*10DB.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO KE +1D0EE ; [*10DC.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO ZO +1D0EF ; [*10DD.0020.0002] # BYZANTINE MUSICAL SYMBOL ARKTIKO NI +1D0F0 ; [*10DE.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO +1D0F1 ; [*10DF.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO +1D0F2 ; [*10E0.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO +1D0F3 ; [*10E1.0020.0002] # BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO +1D0F4 ; [*10E2.0020.0002] # BYZANTINE MUSICAL SYMBOL KLASMA KATO +1D0F5 ; [*10E3.0020.0002] # BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100 ; [*10E4.0020.0002] # MUSICAL SYMBOL SINGLE BARLINE +1D101 ; [*10E5.0020.0002] # MUSICAL SYMBOL DOUBLE BARLINE +1D102 ; [*10E6.0020.0002] # MUSICAL SYMBOL FINAL BARLINE +1D103 ; [*10E7.0020.0002] # MUSICAL SYMBOL REVERSE FINAL BARLINE +1D104 ; [*10E8.0020.0002] # MUSICAL SYMBOL DASHED BARLINE +1D105 ; [*10E9.0020.0002] # MUSICAL SYMBOL SHORT BARLINE +1D106 ; [*10EA.0020.0002] # MUSICAL SYMBOL LEFT REPEAT SIGN +1D107 ; [*10EB.0020.0002] # MUSICAL SYMBOL RIGHT REPEAT SIGN +1D108 ; [*10EC.0020.0002] # MUSICAL SYMBOL REPEAT DOTS +1D109 ; [*10ED.0020.0002] # MUSICAL SYMBOL DAL SEGNO +1D10A ; [*10EE.0020.0002] # MUSICAL SYMBOL DA CAPO +1D10B ; [*10EF.0020.0002] # MUSICAL SYMBOL SEGNO +1D10C ; [*10F0.0020.0002] # MUSICAL SYMBOL CODA +1D10D ; [*10F1.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-1 +1D10E ; [*10F2.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-2 +1D10F ; [*10F3.0020.0002] # MUSICAL SYMBOL REPEATED FIGURE-3 +1D110 ; [*10F4.0020.0002] # MUSICAL SYMBOL FERMATA +1D111 ; [*10F5.0020.0002] # MUSICAL SYMBOL FERMATA BELOW +1D112 ; [*10F6.0020.0002] # MUSICAL SYMBOL BREATH MARK +1D113 ; [*10F7.0020.0002] # MUSICAL SYMBOL CAESURA +1D114 ; [*10F8.0020.0002] # MUSICAL SYMBOL BRACE +1D115 ; [*10F9.0020.0002] # MUSICAL SYMBOL BRACKET +1D116 ; [*10FA.0020.0002] # MUSICAL SYMBOL ONE-LINE STAFF +1D117 ; [*10FB.0020.0002] # MUSICAL SYMBOL TWO-LINE STAFF +1D118 ; [*10FC.0020.0002] # MUSICAL SYMBOL THREE-LINE STAFF +1D119 ; [*10FD.0020.0002] # MUSICAL SYMBOL FOUR-LINE STAFF +1D11A ; [*10FE.0020.0002] # MUSICAL SYMBOL FIVE-LINE STAFF +1D11B ; [*10FF.0020.0002] # MUSICAL SYMBOL SIX-LINE STAFF +1D11C ; [*1100.0020.0002] # MUSICAL SYMBOL SIX-STRING FRETBOARD +1D11D ; [*1101.0020.0002] # MUSICAL SYMBOL FOUR-STRING FRETBOARD +1D11E ; [*1102.0020.0002] # MUSICAL SYMBOL G CLEF +1D11F ; [*1103.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA ALTA +1D120 ; [*1104.0020.0002] # MUSICAL SYMBOL G CLEF OTTAVA BASSA +1D121 ; [*1105.0020.0002] # MUSICAL SYMBOL C CLEF +1D122 ; [*1106.0020.0002] # MUSICAL SYMBOL F CLEF +1D123 ; [*1107.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA ALTA +1D124 ; [*1108.0020.0002] # MUSICAL SYMBOL F CLEF OTTAVA BASSA +1D125 ; [*1109.0020.0002] # MUSICAL SYMBOL DRUM CLEF-1 +1D126 ; [*110A.0020.0002] # MUSICAL SYMBOL DRUM CLEF-2 +1D129 ; [*111E.0020.0002] # MUSICAL SYMBOL MULTIPLE MEASURE REST +1D12A ; [*110E.0020.0002] # MUSICAL SYMBOL DOUBLE SHARP +1D12B ; [*110F.0020.0002] # MUSICAL SYMBOL DOUBLE FLAT +1D12C ; [*1110.0020.0002] # MUSICAL SYMBOL FLAT UP +1D12D ; [*1111.0020.0002] # MUSICAL SYMBOL FLAT DOWN +1D12E ; [*1112.0020.0002] # MUSICAL SYMBOL NATURAL UP +1D12F ; [*1113.0020.0002] # MUSICAL SYMBOL NATURAL DOWN +1D130 ; [*1114.0020.0002] # MUSICAL SYMBOL SHARP UP +1D131 ; [*1115.0020.0002] # MUSICAL SYMBOL SHARP DOWN +1D132 ; [*1116.0020.0002] # MUSICAL SYMBOL QUARTER TONE SHARP +1D133 ; [*1117.0020.0002] # MUSICAL SYMBOL QUARTER TONE FLAT +1D134 ; [*1118.0020.0002] # MUSICAL SYMBOL COMMON TIME +1D135 ; [*1119.0020.0002] # MUSICAL SYMBOL CUT TIME +1D136 ; [*111A.0020.0002] # MUSICAL SYMBOL OTTAVA ALTA +1D137 ; [*111B.0020.0002] # MUSICAL SYMBOL OTTAVA BASSA +1D138 ; [*111C.0020.0002] # MUSICAL SYMBOL QUINDICESIMA ALTA +1D139 ; [*111D.0020.0002] # MUSICAL SYMBOL QUINDICESIMA BASSA +1D13A ; [*111F.0020.0002] # MUSICAL SYMBOL MULTI REST +1D13B ; [*1120.0020.0002] # MUSICAL SYMBOL WHOLE REST +1D13C ; [*1121.0020.0002] # MUSICAL SYMBOL HALF REST +1D13D ; [*1122.0020.0002] # MUSICAL SYMBOL QUARTER REST +1D13E ; [*1123.0020.0002] # MUSICAL SYMBOL EIGHTH REST +1D13F ; [*1124.0020.0002] # MUSICAL SYMBOL SIXTEENTH REST +1D140 ; [*1125.0020.0002] # MUSICAL SYMBOL THIRTY-SECOND REST +1D141 ; [*1126.0020.0002] # MUSICAL SYMBOL SIXTY-FOURTH REST +1D142 ; [*1127.0020.0002] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST +1D143 ; [*1128.0020.0002] # MUSICAL SYMBOL X NOTEHEAD +1D144 ; [*1129.0020.0002] # MUSICAL SYMBOL PLUS NOTEHEAD +1D145 ; [*112A.0020.0002] # MUSICAL SYMBOL CIRCLE X NOTEHEAD +1D146 ; [*112B.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD WHITE +1D147 ; [*112C.0020.0002] # MUSICAL SYMBOL SQUARE NOTEHEAD BLACK +1D148 ; [*112D.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE +1D149 ; [*112E.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK +1D14A ; [*112F.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE +1D14B ; [*1130.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK +1D14C ; [*1131.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE +1D14D ; [*1132.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK +1D14E ; [*1133.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE +1D14F ; [*1134.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK +1D150 ; [*1135.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE +1D151 ; [*1136.0020.0002] # MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK +1D152 ; [*1137.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD WHITE +1D153 ; [*1138.0020.0002] # MUSICAL SYMBOL MOON NOTEHEAD BLACK +1D154 ; [*1139.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE +1D155 ; [*113A.0020.0002] # MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK +1D156 ; [*113B.0020.0002] # MUSICAL SYMBOL PARENTHESIS NOTEHEAD +1D157 ; [*113C.0020.0002] # MUSICAL SYMBOL VOID NOTEHEAD +1D158 ; [*113D.0020.0002] # MUSICAL SYMBOL NOTEHEAD BLACK +1D159 ; [*113E.0020.0002] # MUSICAL SYMBOL NULL NOTEHEAD +1D15A ; [*113F.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE +1D15B ; [*1140.0020.0002] # MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK +1D15C ; [*1141.0020.0002] # MUSICAL SYMBOL BREVE +1D15D ; [*1142.0020.0002] # MUSICAL SYMBOL WHOLE NOTE +1D15E ; [*113C.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL HALF NOTE +1D15F ; [*113D.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL QUARTER NOTE +1D160 ; [*113D.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL EIGHTH NOTE +1D161 ; [*113D.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTEENTH NOTE +1D162 ; [*113D.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163 ; [*113D.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164 ; [*113D.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE 1D165 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING STEM 1D166 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 1D167 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-1 1D168 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-2 1D169 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TREMOLO-3 -1D16A ; [*112B.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-1 -1D16B ; [*112C.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-2 -1D16C ; [*112D.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16A ; [*1143.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-1 +1D16B ; [*1144.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-2 +1D16C ; [*1145.0020.0002] # MUSICAL SYMBOL FINGERED TREMOLO-3 1D16D ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING AUGMENTATION DOT 1D16E ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-1 1D16F ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLAG-2 @@ -5108,8 +5135,8 @@ FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER 1D180 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING MARCATO-STACCATO 1D181 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING ACCENT-STACCATO 1D182 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING LOURE -1D183 ; [*112E.0020.0002] # MUSICAL SYMBOL ARPEGGIATO UP -1D184 ; [*112F.0020.0002] # MUSICAL SYMBOL ARPEGGIATO DOWN +1D183 ; [*1146.0020.0002] # MUSICAL SYMBOL ARPEGGIATO UP +1D184 ; [*1147.0020.0002] # MUSICAL SYMBOL ARPEGGIATO DOWN 1D185 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOIT 1D186 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING RIP 1D187 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING FLIP @@ -5117,787 +5144,787 @@ FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER 1D189 ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING BEND 1D18A ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOUBLE TONGUE 1D18B ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D18C ; [*1130.0020.0002] # MUSICAL SYMBOL RINFORZANDO -1D18D ; [*1131.0020.0002] # MUSICAL SYMBOL SUBITO -1D18E ; [*1132.0020.0002] # MUSICAL SYMBOL Z -1D18F ; [*1133.0020.0002] # MUSICAL SYMBOL PIANO -1D190 ; [*1134.0020.0002] # MUSICAL SYMBOL MEZZO -1D191 ; [*1135.0020.0002] # MUSICAL SYMBOL FORTE -1D192 ; [*1136.0020.0002] # MUSICAL SYMBOL CRESCENDO -1D193 ; [*1137.0020.0002] # MUSICAL SYMBOL DECRESCENDO -1D194 ; [*1138.0020.0002] # MUSICAL SYMBOL GRACE NOTE SLASH -1D195 ; [*1139.0020.0002] # MUSICAL SYMBOL GRACE NOTE NO SLASH -1D196 ; [*113A.0020.0002] # MUSICAL SYMBOL TR -1D197 ; [*113B.0020.0002] # MUSICAL SYMBOL TURN -1D198 ; [*113C.0020.0002] # MUSICAL SYMBOL INVERTED TURN -1D199 ; [*113D.0020.0002] # MUSICAL SYMBOL TURN SLASH -1D19A ; [*113E.0020.0002] # MUSICAL SYMBOL TURN UP -1D19B ; [*113F.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-1 -1D19C ; [*1140.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-2 -1D19D ; [*1141.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-3 -1D19E ; [*1142.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-4 -1D19F ; [*1143.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-5 -1D1A0 ; [*1144.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-6 -1D1A1 ; [*1145.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-7 -1D1A2 ; [*1146.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-8 -1D1A3 ; [*1147.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-9 -1D1A4 ; [*1148.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-10 -1D1A5 ; [*1149.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-11 -1D1A6 ; [*114A.0020.0002] # MUSICAL SYMBOL HAUPTSTIMME -1D1A7 ; [*114B.0020.0002] # MUSICAL SYMBOL NEBENSTIMME -1D1A8 ; [*114C.0020.0002] # MUSICAL SYMBOL END OF STIMME -1D1A9 ; [*114D.0020.0002] # MUSICAL SYMBOL DEGREE SLASH +1D18C ; [*1148.0020.0002] # MUSICAL SYMBOL RINFORZANDO +1D18D ; [*1149.0020.0002] # MUSICAL SYMBOL SUBITO +1D18E ; [*114A.0020.0002] # MUSICAL SYMBOL Z +1D18F ; [*114B.0020.0002] # MUSICAL SYMBOL PIANO +1D190 ; [*114C.0020.0002] # MUSICAL SYMBOL MEZZO +1D191 ; [*114D.0020.0002] # MUSICAL SYMBOL FORTE +1D192 ; [*114E.0020.0002] # MUSICAL SYMBOL CRESCENDO +1D193 ; [*114F.0020.0002] # MUSICAL SYMBOL DECRESCENDO +1D194 ; [*1150.0020.0002] # MUSICAL SYMBOL GRACE NOTE SLASH +1D195 ; [*1151.0020.0002] # MUSICAL SYMBOL GRACE NOTE NO SLASH +1D196 ; [*1152.0020.0002] # MUSICAL SYMBOL TR +1D197 ; [*1153.0020.0002] # MUSICAL SYMBOL TURN +1D198 ; [*1154.0020.0002] # MUSICAL SYMBOL INVERTED TURN +1D199 ; [*1155.0020.0002] # MUSICAL SYMBOL TURN SLASH +1D19A ; [*1156.0020.0002] # MUSICAL SYMBOL TURN UP +1D19B ; [*1157.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-1 +1D19C ; [*1158.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-2 +1D19D ; [*1159.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-3 +1D19E ; [*115A.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-4 +1D19F ; [*115B.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-5 +1D1A0 ; [*115C.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-6 +1D1A1 ; [*115D.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-7 +1D1A2 ; [*115E.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-8 +1D1A3 ; [*115F.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-9 +1D1A4 ; [*1160.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-10 +1D1A5 ; [*1161.0020.0002] # MUSICAL SYMBOL ORNAMENT STROKE-11 +1D1A6 ; [*1162.0020.0002] # MUSICAL SYMBOL HAUPTSTIMME +1D1A7 ; [*1163.0020.0002] # MUSICAL SYMBOL NEBENSTIMME +1D1A8 ; [*1164.0020.0002] # MUSICAL SYMBOL END OF STIMME +1D1A9 ; [*1165.0020.0002] # MUSICAL SYMBOL DEGREE SLASH 1D1AA ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING DOWN BOW 1D1AB ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING UP BOW 1D1AC ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING HARMONIC 1D1AD ; [.0000.0000.0000] # MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D1AE ; [*114E.0020.0002] # MUSICAL SYMBOL PEDAL MARK -1D1AF ; [*114F.0020.0002] # MUSICAL SYMBOL PEDAL UP MARK -1D1B0 ; [*1150.0020.0002] # MUSICAL SYMBOL HALF PEDAL MARK -1D1B1 ; [*1151.0020.0002] # MUSICAL SYMBOL GLISSANDO UP -1D1B2 ; [*1152.0020.0002] # MUSICAL SYMBOL GLISSANDO DOWN -1D1B3 ; [*1153.0020.0002] # MUSICAL SYMBOL WITH FINGERNAILS -1D1B4 ; [*1154.0020.0002] # MUSICAL SYMBOL DAMP -1D1B5 ; [*1155.0020.0002] # MUSICAL SYMBOL DAMP ALL -1D1B6 ; [*1156.0020.0002] # MUSICAL SYMBOL MAXIMA -1D1B7 ; [*1157.0020.0002] # MUSICAL SYMBOL LONGA -1D1B8 ; [*1158.0020.0002] # MUSICAL SYMBOL BREVIS -1D1B9 ; [*1159.0020.0002] # MUSICAL SYMBOL SEMIBREVIS WHITE -1D1BA ; [*115A.0020.0002] # MUSICAL SYMBOL SEMIBREVIS BLACK -1D1BB ; [*1159.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA -1D1BC ; [*115A.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA BLACK -1D1BD ; [*1159.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA WHITE -1D1BE ; [*115A.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA BLACK -1D1BF ; [*1159.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA WHITE -1D1C0 ; [*115A.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA BLACK -1D1C1 ; [*115B.0020.0002] # MUSICAL SYMBOL LONGA PERFECTA REST -1D1C2 ; [*115C.0020.0002] # MUSICAL SYMBOL LONGA IMPERFECTA REST -1D1C3 ; [*115D.0020.0002] # MUSICAL SYMBOL BREVIS REST -1D1C4 ; [*115E.0020.0002] # MUSICAL SYMBOL SEMIBREVIS REST -1D1C5 ; [*115F.0020.0002] # MUSICAL SYMBOL MINIMA REST -1D1C6 ; [*1160.0020.0002] # MUSICAL SYMBOL SEMIMINIMA REST -1D1C7 ; [*1161.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA -1D1C8 ; [*1162.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA -1D1C9 ; [*1163.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 -1D1CA ; [*1164.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA -1D1CB ; [*1165.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA -1D1CC ; [*1166.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 -1D1CD ; [*1167.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 -1D1CE ; [*1168.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 -1D1CF ; [*1169.0020.0002] # MUSICAL SYMBOL CROIX -1D1D0 ; [*116A.0020.0002] # MUSICAL SYMBOL GREGORIAN C CLEF -1D1D1 ; [*116B.0020.0002] # MUSICAL SYMBOL GREGORIAN F CLEF -1D1D2 ; [*116C.0020.0002] # MUSICAL SYMBOL SQUARE B -1D1D3 ; [*116D.0020.0002] # MUSICAL SYMBOL VIRGA -1D1D4 ; [*116E.0020.0002] # MUSICAL SYMBOL PODATUS -1D1D5 ; [*116F.0020.0002] # MUSICAL SYMBOL CLIVIS -1D1D6 ; [*1170.0020.0002] # MUSICAL SYMBOL SCANDICUS -1D1D7 ; [*1171.0020.0002] # MUSICAL SYMBOL CLIMACUS -1D1D8 ; [*1172.0020.0002] # MUSICAL SYMBOL TORCULUS -1D1D9 ; [*1173.0020.0002] # MUSICAL SYMBOL PORRECTUS -1D1DA ; [*1174.0020.0002] # MUSICAL SYMBOL PORRECTUS FLEXUS -1D1DB ; [*1175.0020.0002] # MUSICAL SYMBOL SCANDICUS FLEXUS -1D1DC ; [*1176.0020.0002] # MUSICAL SYMBOL TORCULUS RESUPINUS -1D1DD ; [*1177.0020.0002] # MUSICAL SYMBOL PES SUBPUNCTIS -1D1DE ; [*1178.0020.0002] # MUSICAL SYMBOL KIEVAN C CLEF -1D1DF ; [*1179.0020.0002] # MUSICAL SYMBOL KIEVAN END OF PIECE -1D1E0 ; [*117A.0020.0002] # MUSICAL SYMBOL KIEVAN FINAL NOTE -1D1E1 ; [*117B.0020.0002] # MUSICAL SYMBOL KIEVAN RECITATIVE MARK -1D1E2 ; [*117C.0020.0002] # MUSICAL SYMBOL KIEVAN WHOLE NOTE -1D1E3 ; [*117D.0020.0002] # MUSICAL SYMBOL KIEVAN HALF NOTE -1D1E4 ; [*117E.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN -1D1E5 ; [*117F.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP -1D1E6 ; [*1180.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN -1D1E7 ; [*1181.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP -1D1E8 ; [*1182.0020.0002] # MUSICAL SYMBOL KIEVAN FLAT SIGN -1D200 ; [*1183.0020.0002] # GREEK VOCAL NOTATION SYMBOL-1 -1D201 ; [*1184.0020.0002] # GREEK VOCAL NOTATION SYMBOL-2 -1D202 ; [*1185.0020.0002] # GREEK VOCAL NOTATION SYMBOL-3 -1D203 ; [*1186.0020.0002] # GREEK VOCAL NOTATION SYMBOL-4 -1D204 ; [*1187.0020.0002] # GREEK VOCAL NOTATION SYMBOL-5 -1D205 ; [*1188.0020.0002] # GREEK VOCAL NOTATION SYMBOL-6 -1D206 ; [*1189.0020.0002] # GREEK VOCAL NOTATION SYMBOL-7 -1D207 ; [*118A.0020.0002] # GREEK VOCAL NOTATION SYMBOL-8 -1D208 ; [*118B.0020.0002] # GREEK VOCAL NOTATION SYMBOL-9 -1D209 ; [*118C.0020.0002] # GREEK VOCAL NOTATION SYMBOL-10 -1D20A ; [*118D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-11 -1D20B ; [*118E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-12 -1D20C ; [*118F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-13 -1D20D ; [*1190.0020.0002] # GREEK VOCAL NOTATION SYMBOL-14 -1D20E ; [*1191.0020.0002] # GREEK VOCAL NOTATION SYMBOL-15 -1D20F ; [*1192.0020.0002] # GREEK VOCAL NOTATION SYMBOL-16 -1D210 ; [*1193.0020.0002] # GREEK VOCAL NOTATION SYMBOL-17 -1D211 ; [*1194.0020.0002] # GREEK VOCAL NOTATION SYMBOL-18 -1D212 ; [*1195.0020.0002] # GREEK VOCAL NOTATION SYMBOL-19 -1D213 ; [*1196.0020.0002] # GREEK VOCAL NOTATION SYMBOL-20 -1D214 ; [*1197.0020.0002] # GREEK VOCAL NOTATION SYMBOL-21 -1D215 ; [*1198.0020.0002] # GREEK VOCAL NOTATION SYMBOL-22 -1D216 ; [*1199.0020.0002] # GREEK VOCAL NOTATION SYMBOL-23 -1D217 ; [*119A.0020.0002] # GREEK VOCAL NOTATION SYMBOL-24 -1D218 ; [*119B.0020.0002] # GREEK VOCAL NOTATION SYMBOL-50 -1D219 ; [*119C.0020.0002] # GREEK VOCAL NOTATION SYMBOL-51 -1D21A ; [*119D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-52 -1D21B ; [*119E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-53 -1D21C ; [*119F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-54 -1D21D ; [*11A0.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-1 -1D21E ; [*11A1.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-2 -1D21F ; [*11A2.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-4 -1D220 ; [*11A3.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-5 -1D221 ; [*11A4.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-7 -1D222 ; [*11A5.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-8 -1D223 ; [*11A6.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-11 -1D224 ; [*11A7.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-12 -1D225 ; [*11A8.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-13 -1D226 ; [*11A9.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-14 -1D227 ; [*11AA.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-17 -1D228 ; [*11AB.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-18 -1D229 ; [*11AC.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-19 -1D22A ; [*11AD.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-23 -1D22B ; [*11AE.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-24 -1D22C ; [*11AF.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-25 -1D22D ; [*11B0.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-26 -1D22E ; [*11B1.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-27 -1D22F ; [*11B2.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-29 -1D230 ; [*11B3.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-30 -1D231 ; [*11B4.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-32 -1D232 ; [*11B5.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-36 -1D233 ; [*11B6.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-37 -1D234 ; [*11B7.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-38 -1D235 ; [*11B8.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-39 -1D236 ; [*11B9.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-40 -1D237 ; [*11BA.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-42 -1D238 ; [*11BB.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-43 -1D239 ; [*11BC.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-45 -1D23A ; [*11BD.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-47 -1D23B ; [*11BE.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-48 -1D23C ; [*11BF.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-49 -1D23D ; [*11C0.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-50 -1D23E ; [*11C1.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-51 -1D23F ; [*11C2.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-52 -1D240 ; [*11C3.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-53 -1D241 ; [*11C4.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D1AE ; [*1166.0020.0002] # MUSICAL SYMBOL PEDAL MARK +1D1AF ; [*1167.0020.0002] # MUSICAL SYMBOL PEDAL UP MARK +1D1B0 ; [*1168.0020.0002] # MUSICAL SYMBOL HALF PEDAL MARK +1D1B1 ; [*1169.0020.0002] # MUSICAL SYMBOL GLISSANDO UP +1D1B2 ; [*116A.0020.0002] # MUSICAL SYMBOL GLISSANDO DOWN +1D1B3 ; [*116B.0020.0002] # MUSICAL SYMBOL WITH FINGERNAILS +1D1B4 ; [*116C.0020.0002] # MUSICAL SYMBOL DAMP +1D1B5 ; [*116D.0020.0002] # MUSICAL SYMBOL DAMP ALL +1D1B6 ; [*116E.0020.0002] # MUSICAL SYMBOL MAXIMA +1D1B7 ; [*116F.0020.0002] # MUSICAL SYMBOL LONGA +1D1B8 ; [*1170.0020.0002] # MUSICAL SYMBOL BREVIS +1D1B9 ; [*1171.0020.0002] # MUSICAL SYMBOL SEMIBREVIS WHITE +1D1BA ; [*1172.0020.0002] # MUSICAL SYMBOL SEMIBREVIS BLACK +1D1BB ; [*1171.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA +1D1BC ; [*1172.0020.0002][.0000.0000.0000] # MUSICAL SYMBOL MINIMA BLACK +1D1BD ; [*1171.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE ; [*1172.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF ; [*1171.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA WHITE +1D1C0 ; [*1172.0020.0002][.0000.0000.0000][.0000.0000.0000] # MUSICAL SYMBOL FUSA BLACK +1D1C1 ; [*1173.0020.0002] # MUSICAL SYMBOL LONGA PERFECTA REST +1D1C2 ; [*1174.0020.0002] # MUSICAL SYMBOL LONGA IMPERFECTA REST +1D1C3 ; [*1175.0020.0002] # MUSICAL SYMBOL BREVIS REST +1D1C4 ; [*1176.0020.0002] # MUSICAL SYMBOL SEMIBREVIS REST +1D1C5 ; [*1177.0020.0002] # MUSICAL SYMBOL MINIMA REST +1D1C6 ; [*1178.0020.0002] # MUSICAL SYMBOL SEMIMINIMA REST +1D1C7 ; [*1179.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA +1D1C8 ; [*117A.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA +1D1C9 ; [*117B.0020.0002] # MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 +1D1CA ; [*117C.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA +1D1CB ; [*117D.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA +1D1CC ; [*117E.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 +1D1CD ; [*117F.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 +1D1CE ; [*1180.0020.0002] # MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 +1D1CF ; [*1181.0020.0002] # MUSICAL SYMBOL CROIX +1D1D0 ; [*1182.0020.0002] # MUSICAL SYMBOL GREGORIAN C CLEF +1D1D1 ; [*1183.0020.0002] # MUSICAL SYMBOL GREGORIAN F CLEF +1D1D2 ; [*1184.0020.0002] # MUSICAL SYMBOL SQUARE B +1D1D3 ; [*1185.0020.0002] # MUSICAL SYMBOL VIRGA +1D1D4 ; [*1186.0020.0002] # MUSICAL SYMBOL PODATUS +1D1D5 ; [*1187.0020.0002] # MUSICAL SYMBOL CLIVIS +1D1D6 ; [*1188.0020.0002] # MUSICAL SYMBOL SCANDICUS +1D1D7 ; [*1189.0020.0002] # MUSICAL SYMBOL CLIMACUS +1D1D8 ; [*118A.0020.0002] # MUSICAL SYMBOL TORCULUS +1D1D9 ; [*118B.0020.0002] # MUSICAL SYMBOL PORRECTUS +1D1DA ; [*118C.0020.0002] # MUSICAL SYMBOL PORRECTUS FLEXUS +1D1DB ; [*118D.0020.0002] # MUSICAL SYMBOL SCANDICUS FLEXUS +1D1DC ; [*118E.0020.0002] # MUSICAL SYMBOL TORCULUS RESUPINUS +1D1DD ; [*118F.0020.0002] # MUSICAL SYMBOL PES SUBPUNCTIS +1D1DE ; [*1190.0020.0002] # MUSICAL SYMBOL KIEVAN C CLEF +1D1DF ; [*1191.0020.0002] # MUSICAL SYMBOL KIEVAN END OF PIECE +1D1E0 ; [*1192.0020.0002] # MUSICAL SYMBOL KIEVAN FINAL NOTE +1D1E1 ; [*1193.0020.0002] # MUSICAL SYMBOL KIEVAN RECITATIVE MARK +1D1E2 ; [*1194.0020.0002] # MUSICAL SYMBOL KIEVAN WHOLE NOTE +1D1E3 ; [*1195.0020.0002] # MUSICAL SYMBOL KIEVAN HALF NOTE +1D1E4 ; [*1196.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN +1D1E5 ; [*1197.0020.0002] # MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP +1D1E6 ; [*1198.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN +1D1E7 ; [*1199.0020.0002] # MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP +1D1E8 ; [*119A.0020.0002] # MUSICAL SYMBOL KIEVAN FLAT SIGN +1D200 ; [*119B.0020.0002] # GREEK VOCAL NOTATION SYMBOL-1 +1D201 ; [*119C.0020.0002] # GREEK VOCAL NOTATION SYMBOL-2 +1D202 ; [*119D.0020.0002] # GREEK VOCAL NOTATION SYMBOL-3 +1D203 ; [*119E.0020.0002] # GREEK VOCAL NOTATION SYMBOL-4 +1D204 ; [*119F.0020.0002] # GREEK VOCAL NOTATION SYMBOL-5 +1D205 ; [*11A0.0020.0002] # GREEK VOCAL NOTATION SYMBOL-6 +1D206 ; [*11A1.0020.0002] # GREEK VOCAL NOTATION SYMBOL-7 +1D207 ; [*11A2.0020.0002] # GREEK VOCAL NOTATION SYMBOL-8 +1D208 ; [*11A3.0020.0002] # GREEK VOCAL NOTATION SYMBOL-9 +1D209 ; [*11A4.0020.0002] # GREEK VOCAL NOTATION SYMBOL-10 +1D20A ; [*11A5.0020.0002] # GREEK VOCAL NOTATION SYMBOL-11 +1D20B ; [*11A6.0020.0002] # GREEK VOCAL NOTATION SYMBOL-12 +1D20C ; [*11A7.0020.0002] # GREEK VOCAL NOTATION SYMBOL-13 +1D20D ; [*11A8.0020.0002] # GREEK VOCAL NOTATION SYMBOL-14 +1D20E ; [*11A9.0020.0002] # GREEK VOCAL NOTATION SYMBOL-15 +1D20F ; [*11AA.0020.0002] # GREEK VOCAL NOTATION SYMBOL-16 +1D210 ; [*11AB.0020.0002] # GREEK VOCAL NOTATION SYMBOL-17 +1D211 ; [*11AC.0020.0002] # GREEK VOCAL NOTATION SYMBOL-18 +1D212 ; [*11AD.0020.0002] # GREEK VOCAL NOTATION SYMBOL-19 +1D213 ; [*11AE.0020.0002] # GREEK VOCAL NOTATION SYMBOL-20 +1D214 ; [*11AF.0020.0002] # GREEK VOCAL NOTATION SYMBOL-21 +1D215 ; [*11B0.0020.0002] # GREEK VOCAL NOTATION SYMBOL-22 +1D216 ; [*11B1.0020.0002] # GREEK VOCAL NOTATION SYMBOL-23 +1D217 ; [*11B2.0020.0002] # GREEK VOCAL NOTATION SYMBOL-24 +1D218 ; [*11B3.0020.0002] # GREEK VOCAL NOTATION SYMBOL-50 +1D219 ; [*11B4.0020.0002] # GREEK VOCAL NOTATION SYMBOL-51 +1D21A ; [*11B5.0020.0002] # GREEK VOCAL NOTATION SYMBOL-52 +1D21B ; [*11B6.0020.0002] # GREEK VOCAL NOTATION SYMBOL-53 +1D21C ; [*11B7.0020.0002] # GREEK VOCAL NOTATION SYMBOL-54 +1D21D ; [*11B8.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-1 +1D21E ; [*11B9.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-2 +1D21F ; [*11BA.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-4 +1D220 ; [*11BB.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-5 +1D221 ; [*11BC.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-7 +1D222 ; [*11BD.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-8 +1D223 ; [*11BE.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-11 +1D224 ; [*11BF.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-12 +1D225 ; [*11C0.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-13 +1D226 ; [*11C1.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-14 +1D227 ; [*11C2.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-17 +1D228 ; [*11C3.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-18 +1D229 ; [*11C4.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-19 +1D22A ; [*11C5.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-23 +1D22B ; [*11C6.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-24 +1D22C ; [*11C7.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-25 +1D22D ; [*11C8.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-26 +1D22E ; [*11C9.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-27 +1D22F ; [*11CA.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-29 +1D230 ; [*11CB.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-30 +1D231 ; [*11CC.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-32 +1D232 ; [*11CD.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-36 +1D233 ; [*11CE.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-37 +1D234 ; [*11CF.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-38 +1D235 ; [*11D0.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-39 +1D236 ; [*11D1.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-40 +1D237 ; [*11D2.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-42 +1D238 ; [*11D3.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-43 +1D239 ; [*11D4.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-45 +1D23A ; [*11D5.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-47 +1D23B ; [*11D6.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-48 +1D23C ; [*11D7.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-49 +1D23D ; [*11D8.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-50 +1D23E ; [*11D9.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-51 +1D23F ; [*11DA.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-52 +1D240 ; [*11DB.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-53 +1D241 ; [*11DC.0020.0002] # GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D242 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL TRISEME 1D243 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL TETRASEME 1D244 ; [.0000.0000.0000] # COMBINING GREEK MUSICAL PENTASEME -1D245 ; [*11C5.0020.0002] # GREEK MUSICAL LEIMMA -1D300 ; [*0EEA.0020.0002] # MONOGRAM FOR EARTH -1D301 ; [*0EEB.0020.0002] # DIGRAM FOR HEAVENLY EARTH -1D302 ; [*0EEC.0020.0002] # DIGRAM FOR HUMAN EARTH -1D303 ; [*0EED.0020.0002] # DIGRAM FOR EARTHLY HEAVEN -1D304 ; [*0EEE.0020.0002] # DIGRAM FOR EARTHLY HUMAN -1D305 ; [*0EEF.0020.0002] # DIGRAM FOR EARTH -1D306 ; [*0EF0.0020.0002] # TETRAGRAM FOR CENTRE -1D307 ; [*0EF1.0020.0002] # TETRAGRAM FOR FULL CIRCLE -1D308 ; [*0EF2.0020.0002] # TETRAGRAM FOR MIRED -1D309 ; [*0EF3.0020.0002] # TETRAGRAM FOR BARRIER -1D30A ; [*0EF4.0020.0002] # TETRAGRAM FOR KEEPING SMALL -1D30B ; [*0EF5.0020.0002] # TETRAGRAM FOR CONTRARIETY -1D30C ; [*0EF6.0020.0002] # TETRAGRAM FOR ASCENT -1D30D ; [*0EF7.0020.0002] # TETRAGRAM FOR OPPOSITION -1D30E ; [*0EF8.0020.0002] # TETRAGRAM FOR BRANCHING OUT -1D30F ; [*0EF9.0020.0002] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION -1D310 ; [*0EFA.0020.0002] # TETRAGRAM FOR DIVERGENCE -1D311 ; [*0EFB.0020.0002] # TETRAGRAM FOR YOUTHFULNESS -1D312 ; [*0EFC.0020.0002] # TETRAGRAM FOR INCREASE -1D313 ; [*0EFD.0020.0002] # TETRAGRAM FOR PENETRATION -1D314 ; [*0EFE.0020.0002] # TETRAGRAM FOR REACH -1D315 ; [*0EFF.0020.0002] # TETRAGRAM FOR CONTACT -1D316 ; [*0F00.0020.0002] # TETRAGRAM FOR HOLDING BACK -1D317 ; [*0F01.0020.0002] # TETRAGRAM FOR WAITING -1D318 ; [*0F02.0020.0002] # TETRAGRAM FOR FOLLOWING -1D319 ; [*0F03.0020.0002] # TETRAGRAM FOR ADVANCE -1D31A ; [*0F04.0020.0002] # TETRAGRAM FOR RELEASE -1D31B ; [*0F05.0020.0002] # TETRAGRAM FOR RESISTANCE -1D31C ; [*0F06.0020.0002] # TETRAGRAM FOR EASE -1D31D ; [*0F07.0020.0002] # TETRAGRAM FOR JOY -1D31E ; [*0F08.0020.0002] # TETRAGRAM FOR CONTENTION -1D31F ; [*0F09.0020.0002] # TETRAGRAM FOR ENDEAVOUR -1D320 ; [*0F0A.0020.0002] # TETRAGRAM FOR DUTIES -1D321 ; [*0F0B.0020.0002] # TETRAGRAM FOR CHANGE -1D322 ; [*0F0C.0020.0002] # TETRAGRAM FOR DECISIVENESS -1D323 ; [*0F0D.0020.0002] # TETRAGRAM FOR BOLD RESOLUTION -1D324 ; [*0F0E.0020.0002] # TETRAGRAM FOR PACKING -1D325 ; [*0F0F.0020.0002] # TETRAGRAM FOR LEGION -1D326 ; [*0F10.0020.0002] # TETRAGRAM FOR CLOSENESS -1D327 ; [*0F11.0020.0002] # TETRAGRAM FOR KINSHIP -1D328 ; [*0F12.0020.0002] # TETRAGRAM FOR GATHERING -1D329 ; [*0F13.0020.0002] # TETRAGRAM FOR STRENGTH -1D32A ; [*0F14.0020.0002] # TETRAGRAM FOR PURITY -1D32B ; [*0F15.0020.0002] # TETRAGRAM FOR FULLNESS -1D32C ; [*0F16.0020.0002] # TETRAGRAM FOR RESIDENCE -1D32D ; [*0F17.0020.0002] # TETRAGRAM FOR LAW OR MODEL -1D32E ; [*0F18.0020.0002] # TETRAGRAM FOR RESPONSE -1D32F ; [*0F19.0020.0002] # TETRAGRAM FOR GOING TO MEET -1D330 ; [*0F1A.0020.0002] # TETRAGRAM FOR ENCOUNTERS -1D331 ; [*0F1B.0020.0002] # TETRAGRAM FOR STOVE -1D332 ; [*0F1C.0020.0002] # TETRAGRAM FOR GREATNESS -1D333 ; [*0F1D.0020.0002] # TETRAGRAM FOR ENLARGEMENT -1D334 ; [*0F1E.0020.0002] # TETRAGRAM FOR PATTERN -1D335 ; [*0F1F.0020.0002] # TETRAGRAM FOR RITUAL -1D336 ; [*0F20.0020.0002] # TETRAGRAM FOR FLIGHT -1D337 ; [*0F21.0020.0002] # TETRAGRAM FOR VASTNESS OR WASTING -1D338 ; [*0F22.0020.0002] # TETRAGRAM FOR CONSTANCY -1D339 ; [*0F23.0020.0002] # TETRAGRAM FOR MEASURE -1D33A ; [*0F24.0020.0002] # TETRAGRAM FOR ETERNITY -1D33B ; [*0F25.0020.0002] # TETRAGRAM FOR UNITY -1D33C ; [*0F26.0020.0002] # TETRAGRAM FOR DIMINISHMENT -1D33D ; [*0F27.0020.0002] # TETRAGRAM FOR CLOSED MOUTH -1D33E ; [*0F28.0020.0002] # TETRAGRAM FOR GUARDEDNESS -1D33F ; [*0F29.0020.0002] # TETRAGRAM FOR GATHERING IN -1D340 ; [*0F2A.0020.0002] # TETRAGRAM FOR MASSING -1D341 ; [*0F2B.0020.0002] # TETRAGRAM FOR ACCUMULATION -1D342 ; [*0F2C.0020.0002] # TETRAGRAM FOR EMBELLISHMENT -1D343 ; [*0F2D.0020.0002] # TETRAGRAM FOR DOUBT -1D344 ; [*0F2E.0020.0002] # TETRAGRAM FOR WATCH -1D345 ; [*0F2F.0020.0002] # TETRAGRAM FOR SINKING -1D346 ; [*0F30.0020.0002] # TETRAGRAM FOR INNER -1D347 ; [*0F31.0020.0002] # TETRAGRAM FOR DEPARTURE -1D348 ; [*0F32.0020.0002] # TETRAGRAM FOR DARKENING -1D349 ; [*0F33.0020.0002] # TETRAGRAM FOR DIMMING -1D34A ; [*0F34.0020.0002] # TETRAGRAM FOR EXHAUSTION -1D34B ; [*0F35.0020.0002] # TETRAGRAM FOR SEVERANCE -1D34C ; [*0F36.0020.0002] # TETRAGRAM FOR STOPPAGE -1D34D ; [*0F37.0020.0002] # TETRAGRAM FOR HARDNESS -1D34E ; [*0F38.0020.0002] # TETRAGRAM FOR COMPLETION -1D34F ; [*0F39.0020.0002] # TETRAGRAM FOR CLOSURE -1D350 ; [*0F3A.0020.0002] # TETRAGRAM FOR FAILURE -1D351 ; [*0F3B.0020.0002] # TETRAGRAM FOR AGGRAVATION -1D352 ; [*0F3C.0020.0002] # TETRAGRAM FOR COMPLIANCE -1D353 ; [*0F3D.0020.0002] # TETRAGRAM FOR ON THE VERGE -1D354 ; [*0F3E.0020.0002] # TETRAGRAM FOR DIFFICULTIES -1D355 ; [*0F3F.0020.0002] # TETRAGRAM FOR LABOURING -1D356 ; [*0F40.0020.0002] # TETRAGRAM FOR FOSTERING -1D369 ; [*1BEF.0020.0002] # COUNTING ROD TENS DIGIT ONE -1D36A ; [*1BF0.0020.0002] # COUNTING ROD TENS DIGIT TWO -1D36B ; [*1BF1.0020.0002] # COUNTING ROD TENS DIGIT THREE -1D36C ; [*1BF2.0020.0002] # COUNTING ROD TENS DIGIT FOUR -1D36D ; [*1BF3.0020.0002] # COUNTING ROD TENS DIGIT FIVE -1D36E ; [*1BF4.0020.0002] # COUNTING ROD TENS DIGIT SIX -1D36F ; [*1BF5.0020.0002] # COUNTING ROD TENS DIGIT SEVEN -1D370 ; [*1BF6.0020.0002] # COUNTING ROD TENS DIGIT EIGHT -1D371 ; [*1BF7.0020.0002] # COUNTING ROD TENS DIGIT NINE -1D6C1 ; [*060C.0020.0005] # MATHEMATICAL BOLD NABLA -1D6DB ; [*0608.0020.0005] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6FB ; [*060C.0020.0005] # MATHEMATICAL ITALIC NABLA -1D715 ; [*0608.0020.0005] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D735 ; [*060C.0020.0005] # MATHEMATICAL BOLD ITALIC NABLA -1D74F ; [*0608.0020.0005] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D76F ; [*060C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD NABLA -1D789 ; [*0608.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D7A9 ; [*060C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7C3 ; [*0608.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D800 ; [*183F.0020.0002] # SIGNWRITING HAND-FIST INDEX -1D801 ; [*1840.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX -1D802 ; [*1841.0020.0002] # SIGNWRITING HAND-CUP INDEX -1D803 ; [*1842.0020.0002] # SIGNWRITING HAND-OVAL INDEX -1D804 ; [*1843.0020.0002] # SIGNWRITING HAND-HINGE INDEX -1D805 ; [*1844.0020.0002] # SIGNWRITING HAND-ANGLE INDEX -1D806 ; [*1845.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT -1D807 ; [*1846.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX BENT -1D808 ; [*1847.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT -1D809 ; [*1848.0020.0002] # SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE -1D80A ; [*1849.0020.0002] # SIGNWRITING HAND-FIST INDEX CUPPED -1D80B ; [*184A.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED -1D80C ; [*184B.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED LOW -1D80D ; [*184C.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX HINGE -1D80E ; [*184D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE -1D80F ; [*184E.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE -1D810 ; [*184F.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT -1D811 ; [*1850.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES -1D812 ; [*1851.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED -1D813 ; [*1852.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED -1D814 ; [*1853.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP -1D815 ; [*1854.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED -1D816 ; [*1855.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT -1D817 ; [*1856.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT -1D818 ; [*1857.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED -1D819 ; [*1858.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED -1D81A ; [*1859.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED -1D81B ; [*185A.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED -1D81C ; [*185B.0020.0002] # SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX -1D81D ; [*185C.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE -1D81E ; [*185D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB -1D81F ; [*185E.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB -1D820 ; [*185F.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT -1D821 ; [*1860.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT -1D822 ; [*1861.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT -1D823 ; [*1862.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE -1D824 ; [*1863.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE -1D825 ; [*1864.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED -1D826 ; [*1865.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE -1D827 ; [*1866.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD -1D828 ; [*1867.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED -1D829 ; [*1868.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED -1D82A ; [*1869.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED -1D82B ; [*186A.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED -1D82C ; [*186B.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT -1D82D ; [*186C.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE -1D82E ; [*186D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED -1D82F ; [*186E.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT -1D830 ; [*186F.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP -1D831 ; [*1870.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP -1D832 ; [*1871.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE -1D833 ; [*1872.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE -1D834 ; [*1873.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD -1D835 ; [*1874.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD -1D836 ; [*1875.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP -1D837 ; [*1876.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP -1D838 ; [*1877.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP -1D839 ; [*1878.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED -1D83A ; [*1879.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP -1D83B ; [*187A.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP -1D83C ; [*187B.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP -1D83D ; [*187C.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED -1D83E ; [*187D.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT -1D83F ; [*187E.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED -1D840 ; [*187F.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP -1D841 ; [*1880.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED -1D842 ; [*1881.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP -1D843 ; [*1882.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED -1D844 ; [*1883.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS -1D845 ; [*1884.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS BENT -1D846 ; [*1885.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS HINGED -1D847 ; [*1886.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED -1D848 ; [*1887.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT -1D849 ; [*1888.0020.0002] # SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED -1D84A ; [*1889.0020.0002] # SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT -1D84B ; [*188A.0020.0002] # SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED -1D84C ; [*188B.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD -1D84D ; [*188C.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD -1D84E ; [*188D.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT -1D84F ; [*188E.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT -1D850 ; [*188F.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT -1D851 ; [*1890.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT -1D852 ; [*1891.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD -1D853 ; [*1892.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD -1D854 ; [*1893.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN -1D855 ; [*1894.0020.0002] # SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN -1D856 ; [*1895.0020.0002] # SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD -1D857 ; [*1896.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED -1D858 ; [*1897.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE -1D859 ; [*1898.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB -1D85A ; [*1899.0020.0002] # SIGNWRITING HAND-FLAT -1D85B ; [*189A.0020.0002] # SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS -1D85C ; [*189B.0020.0002] # SIGNWRITING HAND-FLAT HEEL -1D85D ; [*189C.0020.0002] # SIGNWRITING HAND-FLAT THUMB SIDE -1D85E ; [*189D.0020.0002] # SIGNWRITING HAND-FLAT HEEL THUMB SIDE -1D85F ; [*189E.0020.0002] # SIGNWRITING HAND-FLAT THUMB BENT -1D860 ; [*189F.0020.0002] # SIGNWRITING HAND-FLAT THUMB FORWARD -1D861 ; [*18A0.0020.0002] # SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE -1D862 ; [*18A1.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE -1D863 ; [*18A2.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE -1D864 ; [*18A3.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT -1D865 ; [*18A4.0020.0002] # SIGNWRITING HAND-FLAT SPLIT LITTLE -1D866 ; [*18A5.0020.0002] # SIGNWRITING HAND-CLAW -1D867 ; [*18A6.0020.0002] # SIGNWRITING HAND-CLAW THUMB SIDE -1D868 ; [*18A7.0020.0002] # SIGNWRITING HAND-CLAW NO THUMB -1D869 ; [*18A8.0020.0002] # SIGNWRITING HAND-CLAW THUMB FORWARD -1D86A ; [*18A9.0020.0002] # SIGNWRITING HAND-HOOK CURLICUE -1D86B ; [*18AA.0020.0002] # SIGNWRITING HAND-HOOK -1D86C ; [*18AB.0020.0002] # SIGNWRITING HAND-CUP OPEN -1D86D ; [*18AC.0020.0002] # SIGNWRITING HAND-CUP -1D86E ; [*18AD.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB SIDE -1D86F ; [*18AE.0020.0002] # SIGNWRITING HAND-CUP THUMB SIDE -1D870 ; [*18AF.0020.0002] # SIGNWRITING HAND-CUP OPEN NO THUMB -1D871 ; [*18B0.0020.0002] # SIGNWRITING HAND-CUP NO THUMB -1D872 ; [*18B1.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB FORWARD -1D873 ; [*18B2.0020.0002] # SIGNWRITING HAND-CUP THUMB FORWARD -1D874 ; [*18B3.0020.0002] # SIGNWRITING HAND-CURLICUE OPEN -1D875 ; [*18B4.0020.0002] # SIGNWRITING HAND-CURLICUE -1D876 ; [*18B5.0020.0002] # SIGNWRITING HAND-CIRCLE -1D877 ; [*18B6.0020.0002] # SIGNWRITING HAND-OVAL -1D878 ; [*18B7.0020.0002] # SIGNWRITING HAND-OVAL THUMB SIDE -1D879 ; [*18B8.0020.0002] # SIGNWRITING HAND-OVAL NO THUMB -1D87A ; [*18B9.0020.0002] # SIGNWRITING HAND-OVAL THUMB FORWARD -1D87B ; [*18BA.0020.0002] # SIGNWRITING HAND-HINGE OPEN -1D87C ; [*18BB.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB FORWARD -1D87D ; [*18BC.0020.0002] # SIGNWRITING HAND-HINGE -1D87E ; [*18BD.0020.0002] # SIGNWRITING HAND-HINGE SMALL -1D87F ; [*18BE.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB SIDE -1D880 ; [*18BF.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE -1D881 ; [*18C0.0020.0002] # SIGNWRITING HAND-HINGE OPEN NO THUMB -1D882 ; [*18C1.0020.0002] # SIGNWRITING HAND-HINGE NO THUMB -1D883 ; [*18C2.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX -1D884 ; [*18C3.0020.0002] # SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING -1D885 ; [*18C4.0020.0002] # SIGNWRITING HAND-ANGLE -1D886 ; [*18C5.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING -1D887 ; [*18C6.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING -1D888 ; [*18C7.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING -1D889 ; [*18C8.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE RING -1D88A ; [*18C9.0020.0002] # SIGNWRITING HAND-HINGE LITTLE -1D88B ; [*18CA.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT -1D88C ; [*18CB.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED -1D88D ; [*18CC.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED -1D88E ; [*18CD.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN -1D88F ; [*18CE.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT -1D890 ; [*18CF.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED -1D891 ; [*18D0.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED -1D892 ; [*18D1.0020.0002] # SIGNWRITING HAND-FIST LITTLE UP -1D893 ; [*18D2.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP -1D894 ; [*18D3.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE UP -1D895 ; [*18D4.0020.0002] # SIGNWRITING HAND-OVAL LITTLE UP -1D896 ; [*18D5.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE UP -1D897 ; [*18D6.0020.0002] # SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE -1D898 ; [*18D7.0020.0002] # SIGNWRITING HAND-FIST LITTLE BENT -1D899 ; [*18D8.0020.0002] # SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB -1D89A ; [*18D9.0020.0002] # SIGNWRITING HAND-FIST LITTLE THUMB -1D89B ; [*18DA.0020.0002] # SIGNWRITING HAND-HINGE LITTLE THUMB -1D89C ; [*18DB.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX THUMB -1D89D ; [*18DC.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX THUMB -1D89E ; [*18DD.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT -1D89F ; [*18DE.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB -1D8A0 ; [*18DF.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX -1D8A1 ; [*18E0.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE INDEX -1D8A2 ; [*18E1.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX -1D8A3 ; [*18E2.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX -1D8A4 ; [*18E3.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE -1D8A5 ; [*18E4.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE -1D8A6 ; [*18E5.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE -1D8A7 ; [*18E6.0020.0002] # SIGNWRITING HAND-HINGE RING -1D8A8 ; [*18E7.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE -1D8A9 ; [*18E8.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE -1D8AA ; [*18E9.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE -1D8AB ; [*18EA.0020.0002] # SIGNWRITING HAND-FIST RING DOWN -1D8AC ; [*18EB.0020.0002] # SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE -1D8AD ; [*18EC.0020.0002] # SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS -1D8AE ; [*18ED.0020.0002] # SIGNWRITING HAND-FIST RING UP -1D8AF ; [*18EE.0020.0002] # SIGNWRITING HAND-FIST RING RAISED KNUCKLE -1D8B0 ; [*18EF.0020.0002] # SIGNWRITING HAND-FIST RING LITTLE -1D8B1 ; [*18F0.0020.0002] # SIGNWRITING HAND-CIRCLE RING LITTLE -1D8B2 ; [*18F1.0020.0002] # SIGNWRITING HAND-OVAL RING LITTLE -1D8B3 ; [*18F2.0020.0002] # SIGNWRITING HAND-ANGLE RING LITTLE -1D8B4 ; [*18F3.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE -1D8B5 ; [*18F4.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE CONJOINED -1D8B6 ; [*18F5.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES -1D8B7 ; [*18F6.0020.0002] # SIGNWRITING HAND-FIST RING INDEX -1D8B8 ; [*18F7.0020.0002] # SIGNWRITING HAND-FIST RING THUMB -1D8B9 ; [*18F8.0020.0002] # SIGNWRITING HAND-HOOK RING THUMB -1D8BA ; [*18F9.0020.0002] # SIGNWRITING HAND-FIST INDEX RING LITTLE -1D8BB ; [*18FA.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX RING LITTLE -1D8BC ; [*18FB.0020.0002] # SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON -1D8BD ; [*18FC.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT -1D8BE ; [*18FD.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE IN -1D8BF ; [*18FE.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER -1D8C0 ; [*18FF.0020.0002] # SIGNWRITING HAND-CUP INDEX RING LITTLE -1D8C1 ; [*1900.0020.0002] # SIGNWRITING HAND-HINGE INDEX RING LITTLE -1D8C2 ; [*1901.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT -1D8C3 ; [*1902.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE -1D8C4 ; [*1903.0020.0002] # SIGNWRITING HAND-FIST MIDDLE DOWN -1D8C5 ; [*1904.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE -1D8C6 ; [*1905.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP -1D8C7 ; [*1906.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE UP -1D8C8 ; [*1907.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE -1D8C9 ; [*1908.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE -1D8CA ; [*1909.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE THUMB -1D8CB ; [*190A.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE -1D8CC ; [*190B.0020.0002] # SIGNWRITING HAND-FIST MIDDLE LITTLE -1D8CD ; [*190C.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RING LITTLE -1D8CE ; [*190D.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE -1D8CF ; [*190E.0020.0002] # SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON -1D8D0 ; [*190F.0020.0002] # SIGNWRITING HAND-CUP MIDDLE RING LITTLE -1D8D1 ; [*1910.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE RING LITTLE -1D8D2 ; [*1911.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT -1D8D3 ; [*1912.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN -1D8D4 ; [*1913.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE -1D8D5 ; [*1914.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT -1D8D6 ; [*1915.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED -1D8D7 ; [*1916.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE -1D8D8 ; [*1917.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT -1D8D9 ; [*1918.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN -1D8DA ; [*1919.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED -1D8DB ; [*191A.0020.0002] # SIGNWRITING HAND-HINGE INDEX HINGED -1D8DC ; [*191B.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE -1D8DD ; [*191C.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SIDE -1D8DE ; [*191D.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL -1D8DF ; [*191E.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED -1D8E0 ; [*191F.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT -1D8E1 ; [*1920.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT -1D8E2 ; [*1921.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT -1D8E3 ; [*1922.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE -1D8E4 ; [*1923.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT -1D8E5 ; [*1924.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT -1D8E6 ; [*1925.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOK -1D8E7 ; [*1926.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURLICUE -1D8E8 ; [*1927.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE -1D8E9 ; [*1928.0020.0002] # SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE -1D8EA ; [*1929.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER -1D8EB ; [*192A.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLE -1D8EC ; [*192B.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB -1D8ED ; [*192C.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB OPEN -1D8EE ; [*192D.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB OPEN -1D8EF ; [*192E.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB LARGE -1D8F0 ; [*192F.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB -1D8F1 ; [*1930.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SMALL -1D8F2 ; [*1931.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB OUT -1D8F3 ; [*1932.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB IN -1D8F4 ; [*1933.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB -1D8F5 ; [*1934.0020.0002] # SIGNWRITING HAND-FIST THUMB -1D8F6 ; [*1935.0020.0002] # SIGNWRITING HAND-FIST THUMB HEEL -1D8F7 ; [*1936.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL -1D8F8 ; [*1937.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE CONJOINED -1D8F9 ; [*1938.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE BENT -1D8FA ; [*1939.0020.0002] # SIGNWRITING HAND-FIST THUMB FORWARD -1D8FB ; [*193A.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE -1D8FC ; [*193B.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING -1D8FD ; [*193C.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE -1D8FE ; [*193D.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS -1D8FF ; [*193E.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS -1D900 ; [*193F.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS -1D901 ; [*1940.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS -1D902 ; [*1941.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES -1D903 ; [*1942.0020.0002] # SIGNWRITING HAND-FIST -1D904 ; [*1943.0020.0002] # SIGNWRITING HAND-FIST HEEL -1D905 ; [*1944.0020.0002] # SIGNWRITING TOUCH SINGLE -1D906 ; [*1945.0020.0002] # SIGNWRITING TOUCH MULTIPLE -1D907 ; [*1946.0020.0002] # SIGNWRITING TOUCH BETWEEN -1D908 ; [*1947.0020.0002] # SIGNWRITING GRASP SINGLE -1D909 ; [*1948.0020.0002] # SIGNWRITING GRASP MULTIPLE -1D90A ; [*1949.0020.0002] # SIGNWRITING GRASP BETWEEN -1D90B ; [*194A.0020.0002] # SIGNWRITING STRIKE SINGLE -1D90C ; [*194B.0020.0002] # SIGNWRITING STRIKE MULTIPLE -1D90D ; [*194C.0020.0002] # SIGNWRITING STRIKE BETWEEN -1D90E ; [*194D.0020.0002] # SIGNWRITING BRUSH SINGLE -1D90F ; [*194E.0020.0002] # SIGNWRITING BRUSH MULTIPLE -1D910 ; [*194F.0020.0002] # SIGNWRITING BRUSH BETWEEN -1D911 ; [*1950.0020.0002] # SIGNWRITING RUB SINGLE -1D912 ; [*1951.0020.0002] # SIGNWRITING RUB MULTIPLE -1D913 ; [*1952.0020.0002] # SIGNWRITING RUB BETWEEN -1D914 ; [*1953.0020.0002] # SIGNWRITING SURFACE SYMBOLS -1D915 ; [*1954.0020.0002] # SIGNWRITING SURFACE BETWEEN -1D916 ; [*1955.0020.0002] # SIGNWRITING SQUEEZE LARGE SINGLE -1D917 ; [*1956.0020.0002] # SIGNWRITING SQUEEZE SMALL SINGLE -1D918 ; [*1957.0020.0002] # SIGNWRITING SQUEEZE LARGE MULTIPLE -1D919 ; [*1958.0020.0002] # SIGNWRITING SQUEEZE SMALL MULTIPLE -1D91A ; [*1959.0020.0002] # SIGNWRITING SQUEEZE SEQUENTIAL -1D91B ; [*195A.0020.0002] # SIGNWRITING FLICK LARGE SINGLE -1D91C ; [*195B.0020.0002] # SIGNWRITING FLICK SMALL SINGLE -1D91D ; [*195C.0020.0002] # SIGNWRITING FLICK LARGE MULTIPLE -1D91E ; [*195D.0020.0002] # SIGNWRITING FLICK SMALL MULTIPLE -1D91F ; [*195E.0020.0002] # SIGNWRITING FLICK SEQUENTIAL -1D920 ; [*195F.0020.0002] # SIGNWRITING SQUEEZE FLICK ALTERNATING -1D921 ; [*1960.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE -1D922 ; [*1961.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL -1D923 ; [*1962.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL -1D924 ; [*1963.0020.0002] # SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL -1D925 ; [*1964.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE -1D926 ; [*1965.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL -1D927 ; [*1966.0020.0002] # SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS -1D928 ; [*1967.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT -1D929 ; [*1968.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT -1D92A ; [*1969.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL -1D92B ; [*196A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM -1D92C ; [*196B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE -1D92D ; [*196C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST -1D92E ; [*196D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX -1D92F ; [*196E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT -1D930 ; [*196F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX -1D931 ; [*1970.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING -1D932 ; [*1971.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX -1D933 ; [*1972.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CROSS -1D934 ; [*1973.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT -1D935 ; [*1974.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX -1D936 ; [*1975.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING -1D937 ; [*1976.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX -1D938 ; [*1977.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL -1D939 ; [*1978.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM -1D93A ; [*1979.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE -1D93B ; [*197A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL -1D93C ; [*197B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM -1D93D ; [*197C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE -1D93E ; [*197D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION -1D93F ; [*197E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL -1D940 ; [*197F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM -1D941 ; [*1980.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE -1D942 ; [*1981.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL -1D943 ; [*1982.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM -1D944 ; [*1983.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE -1D945 ; [*1984.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL -1D946 ; [*1985.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM -1D947 ; [*1986.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE -1D948 ; [*1987.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL -1D949 ; [*1988.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM -1D94A ; [*1989.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE -1D94B ; [*198A.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE -1D94C ; [*198B.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE -1D94D ; [*198C.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING -1D94E ; [*198D.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE -1D94F ; [*198E.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE -1D950 ; [*198F.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING -1D951 ; [*1990.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE SHAKING -1D952 ; [*1991.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE -1D953 ; [*1992.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE -1D954 ; [*1993.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE -1D955 ; [*1994.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL -1D956 ; [*1995.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM -1D957 ; [*1996.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE -1D958 ; [*1997.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST -1D959 ; [*1998.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL -1D95A ; [*1999.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM -1D95B ; [*199A.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE -1D95C ; [*199B.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST -1D95D ; [*199C.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL -1D95E ; [*199D.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM -1D95F ; [*199E.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE -1D960 ; [*199F.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST -1D961 ; [*19A0.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL -1D962 ; [*19A1.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM -1D963 ; [*19A2.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE -1D964 ; [*19A3.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST -1D965 ; [*19A4.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL -1D966 ; [*19A5.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM -1D967 ; [*19A6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE -1D968 ; [*19A7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST -1D969 ; [*19A8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX -1D96A ; [*19A9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT -1D96B ; [*19AA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX -1D96C ; [*19AB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING -1D96D ; [*19AC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX -1D96E ; [*19AD.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CROSS -1D96F ; [*19AE.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT -1D970 ; [*19AF.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX -1D971 ; [*19B0.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT -1D972 ; [*19B1.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX -1D973 ; [*19B2.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BEND -1D974 ; [*19B3.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL -1D975 ; [*19B4.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM -1D976 ; [*19B5.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE -1D977 ; [*19B6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CHECK -1D978 ; [*19B7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL -1D979 ; [*19B8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM -1D97A ; [*19B9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE -1D97B ; [*19BA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL -1D97C ; [*19BB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM -1D97D ; [*19BC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE -1D97E ; [*19BD.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL -1D97F ; [*19BE.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM -1D980 ; [*19BF.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE -1D981 ; [*19C0.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE -1D982 ; [*19C1.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE -1D983 ; [*19C2.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING -1D984 ; [*19C3.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE -1D985 ; [*19C4.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE -1D986 ; [*19C5.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING -1D987 ; [*19C6.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE SHAKING -1D988 ; [*19C7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL -1D989 ; [*19C8.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM -1D98A ; [*19C9.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE -1D98B ; [*19CA.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST -1D98C ; [*19CB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL -1D98D ; [*19CC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM -1D98E ; [*19CD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE -1D98F ; [*19CE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST -1D990 ; [*19CF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL -1D991 ; [*19D0.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM -1D992 ; [*19D1.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL -1D993 ; [*19D2.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM -1D994 ; [*19D3.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE -1D995 ; [*19D4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL -1D996 ; [*19D5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM -1D997 ; [*19D6.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE -1D998 ; [*19D7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE -1D999 ; [*19D8.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL -1D99A ; [*19D9.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM -1D99B ; [*19DA.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE -1D99C ; [*19DB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL -1D99D ; [*19DC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM -1D99E ; [*19DD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE -1D99F ; [*19DE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT -1D9A0 ; [*19DF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL -1D9A1 ; [*19E0.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM -1D9A2 ; [*19E1.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE -1D9A3 ; [*19E2.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE -1D9A4 ; [*19E3.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATE -1D9A5 ; [*19E4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SHAKING -1D9A6 ; [*19E5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL -1D9A7 ; [*19E6.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL -1D9A8 ; [*19E7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL -1D9A9 ; [*19E8.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL -1D9AA ; [*19E9.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL -1D9AB ; [*19EA.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL -1D9AC ; [*19EB.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL -1D9AD ; [*19EC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST -1D9AE ; [*19ED.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST -1D9AF ; [*19EE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST -1D9B0 ; [*19EF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST -1D9B1 ; [*19F0.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST -1D9B2 ; [*19F1.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST -1D9B3 ; [*19F2.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST -1D9B4 ; [*19F3.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL -1D9B5 ; [*19F4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM -1D9B6 ; [*19F5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE -1D9B7 ; [*19F6.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL -1D9B8 ; [*19F7.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE -1D9B9 ; [*19F8.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE -1D9BA ; [*19F9.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE -1D9BB ; [*19FA.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE -1D9BC ; [*19FB.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE -1D9BD ; [*19FC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE -1D9BE ; [*19FD.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE -1D9BF ; [*19FE.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE -1D9C0 ; [*19FF.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE -1D9C1 ; [*1A00.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL -1D9C2 ; [*1A01.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE -1D9C3 ; [*1A02.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING -1D9C4 ; [*1A03.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING -1D9C5 ; [*1A04.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING -1D9C6 ; [*1A05.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL -1D9C7 ; [*1A06.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE -1D9C8 ; [*1A07.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE -1D9C9 ; [*1A08.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE -1D9CA ; [*1A09.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE -1D9CB ; [*1A0A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE -1D9CC ; [*1A0B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE -1D9CD ; [*1A0C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE -1D9CE ; [*1A0D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE -1D9CF ; [*1A0E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE -1D9D0 ; [*1A0F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL -1D9D1 ; [*1A10.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE -1D9D2 ; [*1A11.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR -1D9D3 ; [*1A12.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR -1D9D4 ; [*1A13.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR -1D9D5 ; [*1A14.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL -1D9D6 ; [*1A15.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM -1D9D7 ; [*1A16.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE -1D9D8 ; [*1A17.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST -1D9D9 ; [*1A18.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED -1D9DA ; [*1A19.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL -1D9DB ; [*1A1A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL -1D9DC ; [*1A1B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE -1D9DD ; [*1A1C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL -1D9DE ; [*1A1D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE -1D9DF ; [*1A1E.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE -1D9E0 ; [*1A1F.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE -1D9E1 ; [*1A20.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING -1D9E2 ; [*1A21.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL -1D9E3 ; [*1A22.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE -1D9E4 ; [*1A23.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE -1D9E5 ; [*1A24.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE -1D9E6 ; [*1A25.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE -1D9E7 ; [*1A26.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE -1D9E8 ; [*1A27.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE -1D9E9 ; [*1A28.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE -1D9EA ; [*1A29.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE -1D9EB ; [*1A2A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE -1D9EC ; [*1A2B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE -1D9ED ; [*1A2C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE -1D9EE ; [*1A2D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE -1D9EF ; [*1A2E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE -1D9F0 ; [*1A2F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE -1D9F1 ; [*1A30.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE -1D9F2 ; [*1A31.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE -1D9F3 ; [*1A32.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE -1D9F4 ; [*1A33.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE -1D9F5 ; [*1A34.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD SMALL -1D9F6 ; [*1A35.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD LARGE -1D9F7 ; [*1A36.0020.0002] # SIGNWRITING DYNAMIC FAST -1D9F8 ; [*1A37.0020.0002] # SIGNWRITING DYNAMIC SLOW -1D9F9 ; [*1A38.0020.0002] # SIGNWRITING DYNAMIC TENSE -1D9FA ; [*1A39.0020.0002] # SIGNWRITING DYNAMIC RELAXED -1D9FB ; [*1A3A.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS -1D9FC ; [*1A3B.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING -1D9FD ; [*1A3C.0020.0002] # SIGNWRITING DYNAMIC EVERY OTHER TIME -1D9FE ; [*1A3D.0020.0002] # SIGNWRITING DYNAMIC GRADUAL -1D9FF ; [*1A3E.0020.0002] # SIGNWRITING HEAD +1D245 ; [*11DD.0020.0002] # GREEK MUSICAL LEIMMA +1D300 ; [*0F02.0020.0002] # MONOGRAM FOR EARTH +1D301 ; [*0F03.0020.0002] # DIGRAM FOR HEAVENLY EARTH +1D302 ; [*0F04.0020.0002] # DIGRAM FOR HUMAN EARTH +1D303 ; [*0F05.0020.0002] # DIGRAM FOR EARTHLY HEAVEN +1D304 ; [*0F06.0020.0002] # DIGRAM FOR EARTHLY HUMAN +1D305 ; [*0F07.0020.0002] # DIGRAM FOR EARTH +1D306 ; [*0F08.0020.0002] # TETRAGRAM FOR CENTRE +1D307 ; [*0F09.0020.0002] # TETRAGRAM FOR FULL CIRCLE +1D308 ; [*0F0A.0020.0002] # TETRAGRAM FOR MIRED +1D309 ; [*0F0B.0020.0002] # TETRAGRAM FOR BARRIER +1D30A ; [*0F0C.0020.0002] # TETRAGRAM FOR KEEPING SMALL +1D30B ; [*0F0D.0020.0002] # TETRAGRAM FOR CONTRARIETY +1D30C ; [*0F0E.0020.0002] # TETRAGRAM FOR ASCENT +1D30D ; [*0F0F.0020.0002] # TETRAGRAM FOR OPPOSITION +1D30E ; [*0F10.0020.0002] # TETRAGRAM FOR BRANCHING OUT +1D30F ; [*0F11.0020.0002] # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION +1D310 ; [*0F12.0020.0002] # TETRAGRAM FOR DIVERGENCE +1D311 ; [*0F13.0020.0002] # TETRAGRAM FOR YOUTHFULNESS +1D312 ; [*0F14.0020.0002] # TETRAGRAM FOR INCREASE +1D313 ; [*0F15.0020.0002] # TETRAGRAM FOR PENETRATION +1D314 ; [*0F16.0020.0002] # TETRAGRAM FOR REACH +1D315 ; [*0F17.0020.0002] # TETRAGRAM FOR CONTACT +1D316 ; [*0F18.0020.0002] # TETRAGRAM FOR HOLDING BACK +1D317 ; [*0F19.0020.0002] # TETRAGRAM FOR WAITING +1D318 ; [*0F1A.0020.0002] # TETRAGRAM FOR FOLLOWING +1D319 ; [*0F1B.0020.0002] # TETRAGRAM FOR ADVANCE +1D31A ; [*0F1C.0020.0002] # TETRAGRAM FOR RELEASE +1D31B ; [*0F1D.0020.0002] # TETRAGRAM FOR RESISTANCE +1D31C ; [*0F1E.0020.0002] # TETRAGRAM FOR EASE +1D31D ; [*0F1F.0020.0002] # TETRAGRAM FOR JOY +1D31E ; [*0F20.0020.0002] # TETRAGRAM FOR CONTENTION +1D31F ; [*0F21.0020.0002] # TETRAGRAM FOR ENDEAVOUR +1D320 ; [*0F22.0020.0002] # TETRAGRAM FOR DUTIES +1D321 ; [*0F23.0020.0002] # TETRAGRAM FOR CHANGE +1D322 ; [*0F24.0020.0002] # TETRAGRAM FOR DECISIVENESS +1D323 ; [*0F25.0020.0002] # TETRAGRAM FOR BOLD RESOLUTION +1D324 ; [*0F26.0020.0002] # TETRAGRAM FOR PACKING +1D325 ; [*0F27.0020.0002] # TETRAGRAM FOR LEGION +1D326 ; [*0F28.0020.0002] # TETRAGRAM FOR CLOSENESS +1D327 ; [*0F29.0020.0002] # TETRAGRAM FOR KINSHIP +1D328 ; [*0F2A.0020.0002] # TETRAGRAM FOR GATHERING +1D329 ; [*0F2B.0020.0002] # TETRAGRAM FOR STRENGTH +1D32A ; [*0F2C.0020.0002] # TETRAGRAM FOR PURITY +1D32B ; [*0F2D.0020.0002] # TETRAGRAM FOR FULLNESS +1D32C ; [*0F2E.0020.0002] # TETRAGRAM FOR RESIDENCE +1D32D ; [*0F2F.0020.0002] # TETRAGRAM FOR LAW OR MODEL +1D32E ; [*0F30.0020.0002] # TETRAGRAM FOR RESPONSE +1D32F ; [*0F31.0020.0002] # TETRAGRAM FOR GOING TO MEET +1D330 ; [*0F32.0020.0002] # TETRAGRAM FOR ENCOUNTERS +1D331 ; [*0F33.0020.0002] # TETRAGRAM FOR STOVE +1D332 ; [*0F34.0020.0002] # TETRAGRAM FOR GREATNESS +1D333 ; [*0F35.0020.0002] # TETRAGRAM FOR ENLARGEMENT +1D334 ; [*0F36.0020.0002] # TETRAGRAM FOR PATTERN +1D335 ; [*0F37.0020.0002] # TETRAGRAM FOR RITUAL +1D336 ; [*0F38.0020.0002] # TETRAGRAM FOR FLIGHT +1D337 ; [*0F39.0020.0002] # TETRAGRAM FOR VASTNESS OR WASTING +1D338 ; [*0F3A.0020.0002] # TETRAGRAM FOR CONSTANCY +1D339 ; [*0F3B.0020.0002] # TETRAGRAM FOR MEASURE +1D33A ; [*0F3C.0020.0002] # TETRAGRAM FOR ETERNITY +1D33B ; [*0F3D.0020.0002] # TETRAGRAM FOR UNITY +1D33C ; [*0F3E.0020.0002] # TETRAGRAM FOR DIMINISHMENT +1D33D ; [*0F3F.0020.0002] # TETRAGRAM FOR CLOSED MOUTH +1D33E ; [*0F40.0020.0002] # TETRAGRAM FOR GUARDEDNESS +1D33F ; [*0F41.0020.0002] # TETRAGRAM FOR GATHERING IN +1D340 ; [*0F42.0020.0002] # TETRAGRAM FOR MASSING +1D341 ; [*0F43.0020.0002] # TETRAGRAM FOR ACCUMULATION +1D342 ; [*0F44.0020.0002] # TETRAGRAM FOR EMBELLISHMENT +1D343 ; [*0F45.0020.0002] # TETRAGRAM FOR DOUBT +1D344 ; [*0F46.0020.0002] # TETRAGRAM FOR WATCH +1D345 ; [*0F47.0020.0002] # TETRAGRAM FOR SINKING +1D346 ; [*0F48.0020.0002] # TETRAGRAM FOR INNER +1D347 ; [*0F49.0020.0002] # TETRAGRAM FOR DEPARTURE +1D348 ; [*0F4A.0020.0002] # TETRAGRAM FOR DARKENING +1D349 ; [*0F4B.0020.0002] # TETRAGRAM FOR DIMMING +1D34A ; [*0F4C.0020.0002] # TETRAGRAM FOR EXHAUSTION +1D34B ; [*0F4D.0020.0002] # TETRAGRAM FOR SEVERANCE +1D34C ; [*0F4E.0020.0002] # TETRAGRAM FOR STOPPAGE +1D34D ; [*0F4F.0020.0002] # TETRAGRAM FOR HARDNESS +1D34E ; [*0F50.0020.0002] # TETRAGRAM FOR COMPLETION +1D34F ; [*0F51.0020.0002] # TETRAGRAM FOR CLOSURE +1D350 ; [*0F52.0020.0002] # TETRAGRAM FOR FAILURE +1D351 ; [*0F53.0020.0002] # TETRAGRAM FOR AGGRAVATION +1D352 ; [*0F54.0020.0002] # TETRAGRAM FOR COMPLIANCE +1D353 ; [*0F55.0020.0002] # TETRAGRAM FOR ON THE VERGE +1D354 ; [*0F56.0020.0002] # TETRAGRAM FOR DIFFICULTIES +1D355 ; [*0F57.0020.0002] # TETRAGRAM FOR LABOURING +1D356 ; [*0F58.0020.0002] # TETRAGRAM FOR FOSTERING +1D369 ; [*1C53.0020.0002] # COUNTING ROD TENS DIGIT ONE +1D36A ; [*1C54.0020.0002] # COUNTING ROD TENS DIGIT TWO +1D36B ; [*1C55.0020.0002] # COUNTING ROD TENS DIGIT THREE +1D36C ; [*1C56.0020.0002] # COUNTING ROD TENS DIGIT FOUR +1D36D ; [*1C57.0020.0002] # COUNTING ROD TENS DIGIT FIVE +1D36E ; [*1C58.0020.0002] # COUNTING ROD TENS DIGIT SIX +1D36F ; [*1C59.0020.0002] # COUNTING ROD TENS DIGIT SEVEN +1D370 ; [*1C5A.0020.0002] # COUNTING ROD TENS DIGIT EIGHT +1D371 ; [*1C5B.0020.0002] # COUNTING ROD TENS DIGIT NINE +1D6C1 ; [*0622.0020.0005] # MATHEMATICAL BOLD NABLA +1D6DB ; [*061E.0020.0005] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6FB ; [*0622.0020.0005] # MATHEMATICAL ITALIC NABLA +1D715 ; [*061E.0020.0005] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D735 ; [*0622.0020.0005] # MATHEMATICAL BOLD ITALIC NABLA +1D74F ; [*061E.0020.0005] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D76F ; [*0622.0020.0005] # MATHEMATICAL SANS-SERIF BOLD NABLA +1D789 ; [*061E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D7A9 ; [*0622.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7C3 ; [*061E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D800 ; [*18A3.0020.0002] # SIGNWRITING HAND-FIST INDEX +1D801 ; [*18A4.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX +1D802 ; [*18A5.0020.0002] # SIGNWRITING HAND-CUP INDEX +1D803 ; [*18A6.0020.0002] # SIGNWRITING HAND-OVAL INDEX +1D804 ; [*18A7.0020.0002] # SIGNWRITING HAND-HINGE INDEX +1D805 ; [*18A8.0020.0002] # SIGNWRITING HAND-ANGLE INDEX +1D806 ; [*18A9.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT +1D807 ; [*18AA.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX BENT +1D808 ; [*18AB.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT +1D809 ; [*18AC.0020.0002] # SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE +1D80A ; [*18AD.0020.0002] # SIGNWRITING HAND-FIST INDEX CUPPED +1D80B ; [*18AE.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED +1D80C ; [*18AF.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED LOW +1D80D ; [*18B0.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX HINGE +1D80E ; [*18B1.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE +1D80F ; [*18B2.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE +1D810 ; [*18B3.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT +1D811 ; [*18B4.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES +1D812 ; [*18B5.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED +1D813 ; [*18B6.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED +1D814 ; [*18B7.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP +1D815 ; [*18B8.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED +1D816 ; [*18B9.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT +1D817 ; [*18BA.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT +1D818 ; [*18BB.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED +1D819 ; [*18BC.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED +1D81A ; [*18BD.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED +1D81B ; [*18BE.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED +1D81C ; [*18BF.0020.0002] # SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX +1D81D ; [*18C0.0020.0002] # SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE +1D81E ; [*18C1.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB +1D81F ; [*18C2.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB +1D820 ; [*18C3.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT +1D821 ; [*18C4.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT +1D822 ; [*18C5.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT +1D823 ; [*18C6.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE +1D824 ; [*18C7.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE +1D825 ; [*18C8.0020.0002] # SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED +1D826 ; [*18C9.0020.0002] # SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE +1D827 ; [*18CA.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD +1D828 ; [*18CB.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED +1D829 ; [*18CC.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED +1D82A ; [*18CD.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED +1D82B ; [*18CE.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED +1D82C ; [*18CF.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT +1D82D ; [*18D0.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE +1D82E ; [*18D1.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED +1D82F ; [*18D2.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT +1D830 ; [*18D3.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP +1D831 ; [*18D4.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP +1D832 ; [*18D5.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE +1D833 ; [*18D6.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE +1D834 ; [*18D7.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD +1D835 ; [*18D8.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD +1D836 ; [*18D9.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP +1D837 ; [*18DA.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP +1D838 ; [*18DB.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP +1D839 ; [*18DC.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED +1D83A ; [*18DD.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP +1D83B ; [*18DE.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP +1D83C ; [*18DF.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP +1D83D ; [*18E0.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED +1D83E ; [*18E1.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT +1D83F ; [*18E2.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED +1D840 ; [*18E3.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP +1D841 ; [*18E4.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED +1D842 ; [*18E5.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP +1D843 ; [*18E6.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED +1D844 ; [*18E7.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS +1D845 ; [*18E8.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS BENT +1D846 ; [*18E9.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS HINGED +1D847 ; [*18EA.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED +1D848 ; [*18EB.0020.0002] # SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT +1D849 ; [*18EC.0020.0002] # SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED +1D84A ; [*18ED.0020.0002] # SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT +1D84B ; [*18EE.0020.0002] # SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED +1D84C ; [*18EF.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD +1D84D ; [*18F0.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD +1D84E ; [*18F1.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT +1D84F ; [*18F2.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT +1D850 ; [*18F3.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT +1D851 ; [*18F4.0020.0002] # SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT +1D852 ; [*18F5.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD +1D853 ; [*18F6.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD +1D854 ; [*18F7.0020.0002] # SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN +1D855 ; [*18F8.0020.0002] # SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN +1D856 ; [*18F9.0020.0002] # SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD +1D857 ; [*18FA.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED +1D858 ; [*18FB.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE +1D859 ; [*18FC.0020.0002] # SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB +1D85A ; [*18FD.0020.0002] # SIGNWRITING HAND-FLAT +1D85B ; [*18FE.0020.0002] # SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS +1D85C ; [*18FF.0020.0002] # SIGNWRITING HAND-FLAT HEEL +1D85D ; [*1900.0020.0002] # SIGNWRITING HAND-FLAT THUMB SIDE +1D85E ; [*1901.0020.0002] # SIGNWRITING HAND-FLAT HEEL THUMB SIDE +1D85F ; [*1902.0020.0002] # SIGNWRITING HAND-FLAT THUMB BENT +1D860 ; [*1903.0020.0002] # SIGNWRITING HAND-FLAT THUMB FORWARD +1D861 ; [*1904.0020.0002] # SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE +1D862 ; [*1905.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE +1D863 ; [*1906.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE +1D864 ; [*1907.0020.0002] # SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT +1D865 ; [*1908.0020.0002] # SIGNWRITING HAND-FLAT SPLIT LITTLE +1D866 ; [*1909.0020.0002] # SIGNWRITING HAND-CLAW +1D867 ; [*190A.0020.0002] # SIGNWRITING HAND-CLAW THUMB SIDE +1D868 ; [*190B.0020.0002] # SIGNWRITING HAND-CLAW NO THUMB +1D869 ; [*190C.0020.0002] # SIGNWRITING HAND-CLAW THUMB FORWARD +1D86A ; [*190D.0020.0002] # SIGNWRITING HAND-HOOK CURLICUE +1D86B ; [*190E.0020.0002] # SIGNWRITING HAND-HOOK +1D86C ; [*190F.0020.0002] # SIGNWRITING HAND-CUP OPEN +1D86D ; [*1910.0020.0002] # SIGNWRITING HAND-CUP +1D86E ; [*1911.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB SIDE +1D86F ; [*1912.0020.0002] # SIGNWRITING HAND-CUP THUMB SIDE +1D870 ; [*1913.0020.0002] # SIGNWRITING HAND-CUP OPEN NO THUMB +1D871 ; [*1914.0020.0002] # SIGNWRITING HAND-CUP NO THUMB +1D872 ; [*1915.0020.0002] # SIGNWRITING HAND-CUP OPEN THUMB FORWARD +1D873 ; [*1916.0020.0002] # SIGNWRITING HAND-CUP THUMB FORWARD +1D874 ; [*1917.0020.0002] # SIGNWRITING HAND-CURLICUE OPEN +1D875 ; [*1918.0020.0002] # SIGNWRITING HAND-CURLICUE +1D876 ; [*1919.0020.0002] # SIGNWRITING HAND-CIRCLE +1D877 ; [*191A.0020.0002] # SIGNWRITING HAND-OVAL +1D878 ; [*191B.0020.0002] # SIGNWRITING HAND-OVAL THUMB SIDE +1D879 ; [*191C.0020.0002] # SIGNWRITING HAND-OVAL NO THUMB +1D87A ; [*191D.0020.0002] # SIGNWRITING HAND-OVAL THUMB FORWARD +1D87B ; [*191E.0020.0002] # SIGNWRITING HAND-HINGE OPEN +1D87C ; [*191F.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB FORWARD +1D87D ; [*1920.0020.0002] # SIGNWRITING HAND-HINGE +1D87E ; [*1921.0020.0002] # SIGNWRITING HAND-HINGE SMALL +1D87F ; [*1922.0020.0002] # SIGNWRITING HAND-HINGE OPEN THUMB SIDE +1D880 ; [*1923.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE +1D881 ; [*1924.0020.0002] # SIGNWRITING HAND-HINGE OPEN NO THUMB +1D882 ; [*1925.0020.0002] # SIGNWRITING HAND-HINGE NO THUMB +1D883 ; [*1926.0020.0002] # SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX +1D884 ; [*1927.0020.0002] # SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING +1D885 ; [*1928.0020.0002] # SIGNWRITING HAND-ANGLE +1D886 ; [*1929.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING +1D887 ; [*192A.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING +1D888 ; [*192B.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING +1D889 ; [*192C.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE RING +1D88A ; [*192D.0020.0002] # SIGNWRITING HAND-HINGE LITTLE +1D88B ; [*192E.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT +1D88C ; [*192F.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED +1D88D ; [*1930.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED +1D88E ; [*1931.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN +1D88F ; [*1932.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT +1D890 ; [*1933.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED +1D891 ; [*1934.0020.0002] # SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED +1D892 ; [*1935.0020.0002] # SIGNWRITING HAND-FIST LITTLE UP +1D893 ; [*1936.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP +1D894 ; [*1937.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE UP +1D895 ; [*1938.0020.0002] # SIGNWRITING HAND-OVAL LITTLE UP +1D896 ; [*1939.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE UP +1D897 ; [*193A.0020.0002] # SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE +1D898 ; [*193B.0020.0002] # SIGNWRITING HAND-FIST LITTLE BENT +1D899 ; [*193C.0020.0002] # SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB +1D89A ; [*193D.0020.0002] # SIGNWRITING HAND-FIST LITTLE THUMB +1D89B ; [*193E.0020.0002] # SIGNWRITING HAND-HINGE LITTLE THUMB +1D89C ; [*193F.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX THUMB +1D89D ; [*1940.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX THUMB +1D89E ; [*1941.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT +1D89F ; [*1942.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB +1D8A0 ; [*1943.0020.0002] # SIGNWRITING HAND-FIST LITTLE INDEX +1D8A1 ; [*1944.0020.0002] # SIGNWRITING HAND-CIRCLE LITTLE INDEX +1D8A2 ; [*1945.0020.0002] # SIGNWRITING HAND-HINGE LITTLE INDEX +1D8A3 ; [*1946.0020.0002] # SIGNWRITING HAND-ANGLE LITTLE INDEX +1D8A4 ; [*1947.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE +1D8A5 ; [*1948.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE +1D8A6 ; [*1949.0020.0002] # SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE +1D8A7 ; [*194A.0020.0002] # SIGNWRITING HAND-HINGE RING +1D8A8 ; [*194B.0020.0002] # SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE +1D8A9 ; [*194C.0020.0002] # SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE +1D8AA ; [*194D.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE +1D8AB ; [*194E.0020.0002] # SIGNWRITING HAND-FIST RING DOWN +1D8AC ; [*194F.0020.0002] # SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE +1D8AD ; [*1950.0020.0002] # SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS +1D8AE ; [*1951.0020.0002] # SIGNWRITING HAND-FIST RING UP +1D8AF ; [*1952.0020.0002] # SIGNWRITING HAND-FIST RING RAISED KNUCKLE +1D8B0 ; [*1953.0020.0002] # SIGNWRITING HAND-FIST RING LITTLE +1D8B1 ; [*1954.0020.0002] # SIGNWRITING HAND-CIRCLE RING LITTLE +1D8B2 ; [*1955.0020.0002] # SIGNWRITING HAND-OVAL RING LITTLE +1D8B3 ; [*1956.0020.0002] # SIGNWRITING HAND-ANGLE RING LITTLE +1D8B4 ; [*1957.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE +1D8B5 ; [*1958.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE CONJOINED +1D8B6 ; [*1959.0020.0002] # SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES +1D8B7 ; [*195A.0020.0002] # SIGNWRITING HAND-FIST RING INDEX +1D8B8 ; [*195B.0020.0002] # SIGNWRITING HAND-FIST RING THUMB +1D8B9 ; [*195C.0020.0002] # SIGNWRITING HAND-HOOK RING THUMB +1D8BA ; [*195D.0020.0002] # SIGNWRITING HAND-FIST INDEX RING LITTLE +1D8BB ; [*195E.0020.0002] # SIGNWRITING HAND-CIRCLE INDEX RING LITTLE +1D8BC ; [*195F.0020.0002] # SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON +1D8BD ; [*1960.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT +1D8BE ; [*1961.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE IN +1D8BF ; [*1962.0020.0002] # SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER +1D8C0 ; [*1963.0020.0002] # SIGNWRITING HAND-CUP INDEX RING LITTLE +1D8C1 ; [*1964.0020.0002] # SIGNWRITING HAND-HINGE INDEX RING LITTLE +1D8C2 ; [*1965.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT +1D8C3 ; [*1966.0020.0002] # SIGNWRITING HAND-ANGLE INDEX RING LITTLE +1D8C4 ; [*1967.0020.0002] # SIGNWRITING HAND-FIST MIDDLE DOWN +1D8C5 ; [*1968.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE +1D8C6 ; [*1969.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP +1D8C7 ; [*196A.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE UP +1D8C8 ; [*196B.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE +1D8C9 ; [*196C.0020.0002] # SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE +1D8CA ; [*196D.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE THUMB +1D8CB ; [*196E.0020.0002] # SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE +1D8CC ; [*196F.0020.0002] # SIGNWRITING HAND-FIST MIDDLE LITTLE +1D8CD ; [*1970.0020.0002] # SIGNWRITING HAND-FIST MIDDLE RING LITTLE +1D8CE ; [*1971.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE +1D8CF ; [*1972.0020.0002] # SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON +1D8D0 ; [*1973.0020.0002] # SIGNWRITING HAND-CUP MIDDLE RING LITTLE +1D8D1 ; [*1974.0020.0002] # SIGNWRITING HAND-HINGE MIDDLE RING LITTLE +1D8D2 ; [*1975.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT +1D8D3 ; [*1976.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN +1D8D4 ; [*1977.0020.0002] # SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE +1D8D5 ; [*1978.0020.0002] # SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT +1D8D6 ; [*1979.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED +1D8D7 ; [*197A.0020.0002] # SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE +1D8D8 ; [*197B.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT +1D8D9 ; [*197C.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN +1D8DA ; [*197D.0020.0002] # SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED +1D8DB ; [*197E.0020.0002] # SIGNWRITING HAND-HINGE INDEX HINGED +1D8DC ; [*197F.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE +1D8DD ; [*1980.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SIDE +1D8DE ; [*1981.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL +1D8DF ; [*1982.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED +1D8E0 ; [*1983.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT +1D8E1 ; [*1984.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT +1D8E2 ; [*1985.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT +1D8E3 ; [*1986.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE +1D8E4 ; [*1987.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT +1D8E5 ; [*1988.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT +1D8E6 ; [*1989.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB HOOK +1D8E7 ; [*198A.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURLICUE +1D8E8 ; [*198B.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE +1D8E9 ; [*198C.0020.0002] # SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE +1D8EA ; [*198D.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER +1D8EB ; [*198E.0020.0002] # SIGNWRITING HAND-FIST INDEX THUMB CIRCLE +1D8EC ; [*198F.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB +1D8ED ; [*1990.0020.0002] # SIGNWRITING HAND-CUP INDEX THUMB OPEN +1D8EE ; [*1991.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB OPEN +1D8EF ; [*1992.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB LARGE +1D8F0 ; [*1993.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB +1D8F1 ; [*1994.0020.0002] # SIGNWRITING HAND-HINGE INDEX THUMB SMALL +1D8F2 ; [*1995.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB OUT +1D8F3 ; [*1996.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB IN +1D8F4 ; [*1997.0020.0002] # SIGNWRITING HAND-ANGLE INDEX THUMB +1D8F5 ; [*1998.0020.0002] # SIGNWRITING HAND-FIST THUMB +1D8F6 ; [*1999.0020.0002] # SIGNWRITING HAND-FIST THUMB HEEL +1D8F7 ; [*199A.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL +1D8F8 ; [*199B.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE CONJOINED +1D8F9 ; [*199C.0020.0002] # SIGNWRITING HAND-FIST THUMB SIDE BENT +1D8FA ; [*199D.0020.0002] # SIGNWRITING HAND-FIST THUMB FORWARD +1D8FB ; [*199E.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE +1D8FC ; [*199F.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING +1D8FD ; [*19A0.0020.0002] # SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE +1D8FE ; [*19A1.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS +1D8FF ; [*19A2.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS +1D900 ; [*19A3.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS +1D901 ; [*19A4.0020.0002] # SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS +1D902 ; [*19A5.0020.0002] # SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES +1D903 ; [*19A6.0020.0002] # SIGNWRITING HAND-FIST +1D904 ; [*19A7.0020.0002] # SIGNWRITING HAND-FIST HEEL +1D905 ; [*19A8.0020.0002] # SIGNWRITING TOUCH SINGLE +1D906 ; [*19A9.0020.0002] # SIGNWRITING TOUCH MULTIPLE +1D907 ; [*19AA.0020.0002] # SIGNWRITING TOUCH BETWEEN +1D908 ; [*19AB.0020.0002] # SIGNWRITING GRASP SINGLE +1D909 ; [*19AC.0020.0002] # SIGNWRITING GRASP MULTIPLE +1D90A ; [*19AD.0020.0002] # SIGNWRITING GRASP BETWEEN +1D90B ; [*19AE.0020.0002] # SIGNWRITING STRIKE SINGLE +1D90C ; [*19AF.0020.0002] # SIGNWRITING STRIKE MULTIPLE +1D90D ; [*19B0.0020.0002] # SIGNWRITING STRIKE BETWEEN +1D90E ; [*19B1.0020.0002] # SIGNWRITING BRUSH SINGLE +1D90F ; [*19B2.0020.0002] # SIGNWRITING BRUSH MULTIPLE +1D910 ; [*19B3.0020.0002] # SIGNWRITING BRUSH BETWEEN +1D911 ; [*19B4.0020.0002] # SIGNWRITING RUB SINGLE +1D912 ; [*19B5.0020.0002] # SIGNWRITING RUB MULTIPLE +1D913 ; [*19B6.0020.0002] # SIGNWRITING RUB BETWEEN +1D914 ; [*19B7.0020.0002] # SIGNWRITING SURFACE SYMBOLS +1D915 ; [*19B8.0020.0002] # SIGNWRITING SURFACE BETWEEN +1D916 ; [*19B9.0020.0002] # SIGNWRITING SQUEEZE LARGE SINGLE +1D917 ; [*19BA.0020.0002] # SIGNWRITING SQUEEZE SMALL SINGLE +1D918 ; [*19BB.0020.0002] # SIGNWRITING SQUEEZE LARGE MULTIPLE +1D919 ; [*19BC.0020.0002] # SIGNWRITING SQUEEZE SMALL MULTIPLE +1D91A ; [*19BD.0020.0002] # SIGNWRITING SQUEEZE SEQUENTIAL +1D91B ; [*19BE.0020.0002] # SIGNWRITING FLICK LARGE SINGLE +1D91C ; [*19BF.0020.0002] # SIGNWRITING FLICK SMALL SINGLE +1D91D ; [*19C0.0020.0002] # SIGNWRITING FLICK LARGE MULTIPLE +1D91E ; [*19C1.0020.0002] # SIGNWRITING FLICK SMALL MULTIPLE +1D91F ; [*19C2.0020.0002] # SIGNWRITING FLICK SEQUENTIAL +1D920 ; [*19C3.0020.0002] # SIGNWRITING SQUEEZE FLICK ALTERNATING +1D921 ; [*19C4.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE +1D922 ; [*19C5.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL +1D923 ; [*19C6.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL +1D924 ; [*19C7.0020.0002] # SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL +1D925 ; [*19C8.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE +1D926 ; [*19C9.0020.0002] # SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL +1D927 ; [*19CA.0020.0002] # SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS +1D928 ; [*19CB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT +1D929 ; [*19CC.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT +1D92A ; [*19CD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL +1D92B ; [*19CE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM +1D92C ; [*19CF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE +1D92D ; [*19D0.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST +1D92E ; [*19D1.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX +1D92F ; [*19D2.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT +1D930 ; [*19D3.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX +1D931 ; [*19D4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING +1D932 ; [*19D5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX +1D933 ; [*19D6.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CROSS +1D934 ; [*19D7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT +1D935 ; [*19D8.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX +1D936 ; [*19D9.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING +1D937 ; [*19DA.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX +1D938 ; [*19DB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL +1D939 ; [*19DC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM +1D93A ; [*19DD.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE +1D93B ; [*19DE.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL +1D93C ; [*19DF.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM +1D93D ; [*19E0.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE +1D93E ; [*19E1.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION +1D93F ; [*19E2.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL +1D940 ; [*19E3.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM +1D941 ; [*19E4.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE +1D942 ; [*19E5.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL +1D943 ; [*19E6.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM +1D944 ; [*19E7.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE +1D945 ; [*19E8.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL +1D946 ; [*19E9.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM +1D947 ; [*19EA.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE +1D948 ; [*19EB.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL +1D949 ; [*19EC.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM +1D94A ; [*19ED.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE +1D94B ; [*19EE.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE +1D94C ; [*19EF.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE +1D94D ; [*19F0.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING +1D94E ; [*19F1.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE +1D94F ; [*19F2.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE +1D950 ; [*19F3.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING +1D951 ; [*19F4.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE SHAKING +1D952 ; [*19F5.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE +1D953 ; [*19F6.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE +1D954 ; [*19F7.0020.0002] # SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE +1D955 ; [*19F8.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL +1D956 ; [*19F9.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM +1D957 ; [*19FA.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE +1D958 ; [*19FB.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST +1D959 ; [*19FC.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL +1D95A ; [*19FD.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM +1D95B ; [*19FE.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE +1D95C ; [*19FF.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST +1D95D ; [*1A00.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL +1D95E ; [*1A01.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM +1D95F ; [*1A02.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE +1D960 ; [*1A03.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST +1D961 ; [*1A04.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL +1D962 ; [*1A05.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM +1D963 ; [*1A06.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE +1D964 ; [*1A07.0020.0002] # SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST +1D965 ; [*1A08.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL +1D966 ; [*1A09.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM +1D967 ; [*1A0A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE +1D968 ; [*1A0B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST +1D969 ; [*1A0C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX +1D96A ; [*1A0D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT +1D96B ; [*1A0E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX +1D96C ; [*1A0F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING +1D96D ; [*1A10.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX +1D96E ; [*1A11.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CROSS +1D96F ; [*1A12.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT +1D970 ; [*1A13.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX +1D971 ; [*1A14.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT +1D972 ; [*1A15.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX +1D973 ; [*1A16.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BEND +1D974 ; [*1A17.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL +1D975 ; [*1A18.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM +1D976 ; [*1A19.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE +1D977 ; [*1A1A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CHECK +1D978 ; [*1A1B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL +1D979 ; [*1A1C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM +1D97A ; [*1A1D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE +1D97B ; [*1A1E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL +1D97C ; [*1A1F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM +1D97D ; [*1A20.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE +1D97E ; [*1A21.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL +1D97F ; [*1A22.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM +1D980 ; [*1A23.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE +1D981 ; [*1A24.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE +1D982 ; [*1A25.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE +1D983 ; [*1A26.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING +1D984 ; [*1A27.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE +1D985 ; [*1A28.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE +1D986 ; [*1A29.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING +1D987 ; [*1A2A.0020.0002] # SIGNWRITING TRAVEL-FLOORPLANE SHAKING +1D988 ; [*1A2B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL +1D989 ; [*1A2C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM +1D98A ; [*1A2D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE +1D98B ; [*1A2E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST +1D98C ; [*1A2F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL +1D98D ; [*1A30.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM +1D98E ; [*1A31.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE +1D98F ; [*1A32.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST +1D990 ; [*1A33.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL +1D991 ; [*1A34.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM +1D992 ; [*1A35.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL +1D993 ; [*1A36.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM +1D994 ; [*1A37.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE +1D995 ; [*1A38.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL +1D996 ; [*1A39.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM +1D997 ; [*1A3A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE +1D998 ; [*1A3B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE +1D999 ; [*1A3C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL +1D99A ; [*1A3D.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM +1D99B ; [*1A3E.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE +1D99C ; [*1A3F.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL +1D99D ; [*1A40.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM +1D99E ; [*1A41.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE +1D99F ; [*1A42.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT +1D9A0 ; [*1A43.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL +1D9A1 ; [*1A44.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM +1D9A2 ; [*1A45.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE +1D9A3 ; [*1A46.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE +1D9A4 ; [*1A47.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATE +1D9A5 ; [*1A48.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE SHAKING +1D9A6 ; [*1A49.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL +1D9A7 ; [*1A4A.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL +1D9A8 ; [*1A4B.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL +1D9A9 ; [*1A4C.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL +1D9AA ; [*1A4D.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL +1D9AB ; [*1A4E.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL +1D9AC ; [*1A4F.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL +1D9AD ; [*1A50.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST +1D9AE ; [*1A51.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST +1D9AF ; [*1A52.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST +1D9B0 ; [*1A53.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST +1D9B1 ; [*1A54.0020.0002] # SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST +1D9B2 ; [*1A55.0020.0002] # SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST +1D9B3 ; [*1A56.0020.0002] # SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST +1D9B4 ; [*1A57.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL +1D9B5 ; [*1A58.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM +1D9B6 ; [*1A59.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE +1D9B7 ; [*1A5A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL +1D9B8 ; [*1A5B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE +1D9B9 ; [*1A5C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE +1D9BA ; [*1A5D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE +1D9BB ; [*1A5E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE +1D9BC ; [*1A5F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE +1D9BD ; [*1A60.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE +1D9BE ; [*1A61.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE +1D9BF ; [*1A62.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE +1D9C0 ; [*1A63.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE +1D9C1 ; [*1A64.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL +1D9C2 ; [*1A65.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE +1D9C3 ; [*1A66.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING +1D9C4 ; [*1A67.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING +1D9C5 ; [*1A68.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING +1D9C6 ; [*1A69.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL +1D9C7 ; [*1A6A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE +1D9C8 ; [*1A6B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE +1D9C9 ; [*1A6C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE +1D9CA ; [*1A6D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE +1D9CB ; [*1A6E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE +1D9CC ; [*1A6F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE +1D9CD ; [*1A70.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE +1D9CE ; [*1A71.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE +1D9CF ; [*1A72.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE +1D9D0 ; [*1A73.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL +1D9D1 ; [*1A74.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE +1D9D2 ; [*1A75.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR +1D9D3 ; [*1A76.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR +1D9D4 ; [*1A77.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR +1D9D5 ; [*1A78.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL +1D9D6 ; [*1A79.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM +1D9D7 ; [*1A7A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE +1D9D8 ; [*1A7B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST +1D9D9 ; [*1A7C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED +1D9DA ; [*1A7D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL +1D9DB ; [*1A7E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL +1D9DC ; [*1A7F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE +1D9DD ; [*1A80.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL +1D9DE ; [*1A81.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE +1D9DF ; [*1A82.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE SINGLE +1D9E0 ; [*1A83.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE DOUBLE +1D9E1 ; [*1A84.0020.0002] # SIGNWRITING ROTATION-FLOORPLANE ALTERNATING +1D9E2 ; [*1A85.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL +1D9E3 ; [*1A86.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE +1D9E4 ; [*1A87.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE +1D9E5 ; [*1A88.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE +1D9E6 ; [*1A89.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE +1D9E7 ; [*1A8A.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE +1D9E8 ; [*1A8B.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE +1D9E9 ; [*1A8C.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE +1D9EA ; [*1A8D.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE +1D9EB ; [*1A8E.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE +1D9EC ; [*1A8F.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE +1D9ED ; [*1A90.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE +1D9EE ; [*1A91.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE +1D9EF ; [*1A92.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE +1D9F0 ; [*1A93.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE +1D9F1 ; [*1A94.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE +1D9F2 ; [*1A95.0020.0002] # SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE +1D9F3 ; [*1A96.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE +1D9F4 ; [*1A97.0020.0002] # SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE +1D9F5 ; [*1A98.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD SMALL +1D9F6 ; [*1A99.0020.0002] # SIGNWRITING DYNAMIC ARROWHEAD LARGE +1D9F7 ; [*1A9A.0020.0002] # SIGNWRITING DYNAMIC FAST +1D9F8 ; [*1A9B.0020.0002] # SIGNWRITING DYNAMIC SLOW +1D9F9 ; [*1A9C.0020.0002] # SIGNWRITING DYNAMIC TENSE +1D9FA ; [*1A9D.0020.0002] # SIGNWRITING DYNAMIC RELAXED +1D9FB ; [*1A9E.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS +1D9FC ; [*1A9F.0020.0002] # SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING +1D9FD ; [*1AA0.0020.0002] # SIGNWRITING DYNAMIC EVERY OTHER TIME +1D9FE ; [*1AA1.0020.0002] # SIGNWRITING DYNAMIC GRADUAL +1D9FF ; [*1AA2.0020.0002] # SIGNWRITING HEAD 1DA00 ; [.0000.0000.0000] # SIGNWRITING HEAD RIM 1DA01 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT 1DA02 ; [.0000.0000.0000] # SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT @@ -5953,10 +5980,10 @@ FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER 1DA34 ; [.0000.0000.0000] # SIGNWRITING NOSE WIGGLES 1DA35 ; [.0000.0000.0000] # SIGNWRITING AIR BLOWING OUT 1DA36 ; [.0000.0000.0000] # SIGNWRITING AIR SUCKING IN -1DA37 ; [*1A3F.0020.0002] # SIGNWRITING AIR BLOW SMALL ROTATIONS -1DA38 ; [*1A40.0020.0002] # SIGNWRITING AIR SUCK SMALL ROTATIONS -1DA39 ; [*1A41.0020.0002] # SIGNWRITING BREATH INHALE -1DA3A ; [*1A42.0020.0002] # SIGNWRITING BREATH EXHALE +1DA37 ; [*1AA3.0020.0002] # SIGNWRITING AIR BLOW SMALL ROTATIONS +1DA38 ; [*1AA4.0020.0002] # SIGNWRITING AIR SUCK SMALL ROTATIONS +1DA39 ; [*1AA5.0020.0002] # SIGNWRITING BREATH INHALE +1DA3A ; [*1AA6.0020.0002] # SIGNWRITING BREATH EXHALE 1DA3B ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED NEUTRAL 1DA3C ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED FORWARD 1DA3D ; [.0000.0000.0000] # SIGNWRITING MOUTH CLOSED CONTACT @@ -6007,37 +6034,37 @@ FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER 1DA6A ; [.0000.0000.0000] # SIGNWRITING NECK 1DA6B ; [.0000.0000.0000] # SIGNWRITING HAIR 1DA6C ; [.0000.0000.0000] # SIGNWRITING EXCITEMENT -1DA6D ; [*1A43.0020.0002] # SIGNWRITING SHOULDER HIP SPINE -1DA6E ; [*1A44.0020.0002] # SIGNWRITING SHOULDER HIP POSITIONS -1DA6F ; [*1A45.0020.0002] # SIGNWRITING WALLPLANE SHOULDER HIP MOVE -1DA70 ; [*1A46.0020.0002] # SIGNWRITING FLOORPLANE SHOULDER HIP MOVE -1DA71 ; [*1A47.0020.0002] # SIGNWRITING SHOULDER TILTING FROM WAIST -1DA72 ; [*1A48.0020.0002] # SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH -1DA73 ; [*1A49.0020.0002] # SIGNWRITING TORSO-WALLPLANE CURVED BEND -1DA74 ; [*1A4A.0020.0002] # SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA6D ; [*1AA7.0020.0002] # SIGNWRITING SHOULDER HIP SPINE +1DA6E ; [*1AA8.0020.0002] # SIGNWRITING SHOULDER HIP POSITIONS +1DA6F ; [*1AA9.0020.0002] # SIGNWRITING WALLPLANE SHOULDER HIP MOVE +1DA70 ; [*1AAA.0020.0002] # SIGNWRITING FLOORPLANE SHOULDER HIP MOVE +1DA71 ; [*1AAB.0020.0002] # SIGNWRITING SHOULDER TILTING FROM WAIST +1DA72 ; [*1AAC.0020.0002] # SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH +1DA73 ; [*1AAD.0020.0002] # SIGNWRITING TORSO-WALLPLANE CURVED BEND +1DA74 ; [*1AAE.0020.0002] # SIGNWRITING TORSO-FLOORPLANE TWISTING 1DA75 ; [.0000.0000.0000] # SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS -1DA76 ; [*1A4B.0020.0002] # SIGNWRITING LIMB COMBINATION -1DA77 ; [*1A4C.0020.0002] # SIGNWRITING LIMB LENGTH-1 -1DA78 ; [*1A4D.0020.0002] # SIGNWRITING LIMB LENGTH-2 -1DA79 ; [*1A4E.0020.0002] # SIGNWRITING LIMB LENGTH-3 -1DA7A ; [*1A4F.0020.0002] # SIGNWRITING LIMB LENGTH-4 -1DA7B ; [*1A50.0020.0002] # SIGNWRITING LIMB LENGTH-5 -1DA7C ; [*1A51.0020.0002] # SIGNWRITING LIMB LENGTH-6 -1DA7D ; [*1A52.0020.0002] # SIGNWRITING LIMB LENGTH-7 -1DA7E ; [*1A53.0020.0002] # SIGNWRITING FINGER -1DA7F ; [*1A54.0020.0002] # SIGNWRITING LOCATION-WALLPLANE SPACE -1DA80 ; [*1A55.0020.0002] # SIGNWRITING LOCATION-FLOORPLANE SPACE -1DA81 ; [*1A56.0020.0002] # SIGNWRITING LOCATION HEIGHT -1DA82 ; [*1A57.0020.0002] # SIGNWRITING LOCATION WIDTH -1DA83 ; [*1A58.0020.0002] # SIGNWRITING LOCATION DEPTH +1DA76 ; [*1AAF.0020.0002] # SIGNWRITING LIMB COMBINATION +1DA77 ; [*1AB0.0020.0002] # SIGNWRITING LIMB LENGTH-1 +1DA78 ; [*1AB1.0020.0002] # SIGNWRITING LIMB LENGTH-2 +1DA79 ; [*1AB2.0020.0002] # SIGNWRITING LIMB LENGTH-3 +1DA7A ; [*1AB3.0020.0002] # SIGNWRITING LIMB LENGTH-4 +1DA7B ; [*1AB4.0020.0002] # SIGNWRITING LIMB LENGTH-5 +1DA7C ; [*1AB5.0020.0002] # SIGNWRITING LIMB LENGTH-6 +1DA7D ; [*1AB6.0020.0002] # SIGNWRITING LIMB LENGTH-7 +1DA7E ; [*1AB7.0020.0002] # SIGNWRITING FINGER +1DA7F ; [*1AB8.0020.0002] # SIGNWRITING LOCATION-WALLPLANE SPACE +1DA80 ; [*1AB9.0020.0002] # SIGNWRITING LOCATION-FLOORPLANE SPACE +1DA81 ; [*1ABA.0020.0002] # SIGNWRITING LOCATION HEIGHT +1DA82 ; [*1ABB.0020.0002] # SIGNWRITING LOCATION WIDTH +1DA83 ; [*1ABC.0020.0002] # SIGNWRITING LOCATION DEPTH 1DA84 ; [.0000.0000.0000] # SIGNWRITING LOCATION HEAD NECK -1DA85 ; [*1A59.0020.0002] # SIGNWRITING LOCATION TORSO -1DA86 ; [*1A5A.0020.0002] # SIGNWRITING LOCATION LIMBS DIGITS -1DA87 ; [*047D.0020.0002] # SIGNWRITING COMMA -1DA88 ; [*047E.0020.0002] # SIGNWRITING FULL STOP -1DA89 ; [*047F.0020.0002] # SIGNWRITING SEMICOLON -1DA8A ; [*0480.0020.0002] # SIGNWRITING COLON -1DA8B ; [*0481.0020.0002] # SIGNWRITING PARENTHESIS +1DA85 ; [*1ABD.0020.0002] # SIGNWRITING LOCATION TORSO +1DA86 ; [*1ABE.0020.0002] # SIGNWRITING LOCATION LIMBS DIGITS +1DA87 ; [*0493.0020.0002] # SIGNWRITING COMMA +1DA88 ; [*0494.0020.0002] # SIGNWRITING FULL STOP +1DA89 ; [*0495.0020.0002] # SIGNWRITING SEMICOLON +1DA8A ; [*0496.0020.0002] # SIGNWRITING COLON +1DA8B ; [*0497.0020.0002] # SIGNWRITING PARENTHESIS 1DA9B ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-2 1DA9C ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-3 1DA9D ; [.0000.0000.0000] # SIGNWRITING FILL MODIFIER-4 @@ -6065,1692 +6092,1768 @@ FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER 1E8D4 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS 1E8D5 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS 1E8D6 ; [.0000.0000.0000] # MENDE KIKAKUI COMBINING NUMBER MILLIONS -1E95E ; [*0265.0020.0002] # ADLAM INITIAL EXCLAMATION MARK -1E95F ; [*0274.0020.0002] # ADLAM INITIAL QUESTION MARK -1EEF0 ; [*04FB.0020.0002] # ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL -1EEF1 ; [*04FC.0020.0002] # ARABIC MATHEMATICAL OPERATOR HAH WITH DAL -1F000 ; [*11C7.0020.0002] # MAHJONG TILE EAST WIND -1F001 ; [*11C8.0020.0002] # MAHJONG TILE SOUTH WIND -1F002 ; [*11C9.0020.0002] # MAHJONG TILE WEST WIND -1F003 ; [*11CA.0020.0002] # MAHJONG TILE NORTH WIND -1F004 ; [*11CB.0020.0002] # MAHJONG TILE RED DRAGON -1F005 ; [*11CC.0020.0002] # MAHJONG TILE GREEN DRAGON -1F006 ; [*11CD.0020.0002] # MAHJONG TILE WHITE DRAGON -1F007 ; [*11CE.0020.0002] # MAHJONG TILE ONE OF CHARACTERS -1F008 ; [*11CF.0020.0002] # MAHJONG TILE TWO OF CHARACTERS -1F009 ; [*11D0.0020.0002] # MAHJONG TILE THREE OF CHARACTERS -1F00A ; [*11D1.0020.0002] # MAHJONG TILE FOUR OF CHARACTERS -1F00B ; [*11D2.0020.0002] # MAHJONG TILE FIVE OF CHARACTERS -1F00C ; [*11D3.0020.0002] # MAHJONG TILE SIX OF CHARACTERS -1F00D ; [*11D4.0020.0002] # MAHJONG TILE SEVEN OF CHARACTERS -1F00E ; [*11D5.0020.0002] # MAHJONG TILE EIGHT OF CHARACTERS -1F00F ; [*11D6.0020.0002] # MAHJONG TILE NINE OF CHARACTERS -1F010 ; [*11D7.0020.0002] # MAHJONG TILE ONE OF BAMBOOS -1F011 ; [*11D8.0020.0002] # MAHJONG TILE TWO OF BAMBOOS -1F012 ; [*11D9.0020.0002] # MAHJONG TILE THREE OF BAMBOOS -1F013 ; [*11DA.0020.0002] # MAHJONG TILE FOUR OF BAMBOOS -1F014 ; [*11DB.0020.0002] # MAHJONG TILE FIVE OF BAMBOOS -1F015 ; [*11DC.0020.0002] # MAHJONG TILE SIX OF BAMBOOS -1F016 ; [*11DD.0020.0002] # MAHJONG TILE SEVEN OF BAMBOOS -1F017 ; [*11DE.0020.0002] # MAHJONG TILE EIGHT OF BAMBOOS -1F018 ; [*11DF.0020.0002] # MAHJONG TILE NINE OF BAMBOOS -1F019 ; [*11E0.0020.0002] # MAHJONG TILE ONE OF CIRCLES -1F01A ; [*11E1.0020.0002] # MAHJONG TILE TWO OF CIRCLES -1F01B ; [*11E2.0020.0002] # MAHJONG TILE THREE OF CIRCLES -1F01C ; [*11E3.0020.0002] # MAHJONG TILE FOUR OF CIRCLES -1F01D ; [*11E4.0020.0002] # MAHJONG TILE FIVE OF CIRCLES -1F01E ; [*11E5.0020.0002] # MAHJONG TILE SIX OF CIRCLES -1F01F ; [*11E6.0020.0002] # MAHJONG TILE SEVEN OF CIRCLES -1F020 ; [*11E7.0020.0002] # MAHJONG TILE EIGHT OF CIRCLES -1F021 ; [*11E8.0020.0002] # MAHJONG TILE NINE OF CIRCLES -1F022 ; [*11E9.0020.0002] # MAHJONG TILE PLUM -1F023 ; [*11EA.0020.0002] # MAHJONG TILE ORCHID -1F024 ; [*11EB.0020.0002] # MAHJONG TILE BAMBOO -1F025 ; [*11EC.0020.0002] # MAHJONG TILE CHRYSANTHEMUM -1F026 ; [*11ED.0020.0002] # MAHJONG TILE SPRING -1F027 ; [*11EE.0020.0002] # MAHJONG TILE SUMMER -1F028 ; [*11EF.0020.0002] # MAHJONG TILE AUTUMN -1F029 ; [*11F0.0020.0002] # MAHJONG TILE WINTER -1F02A ; [*11F1.0020.0002] # MAHJONG TILE JOKER -1F02B ; [*11F2.0020.0002] # MAHJONG TILE BACK -1F030 ; [*11F3.0020.0002] # DOMINO TILE HORIZONTAL BACK -1F031 ; [*11F4.0020.0002] # DOMINO TILE HORIZONTAL-00-00 -1F032 ; [*11F5.0020.0002] # DOMINO TILE HORIZONTAL-00-01 -1F033 ; [*11F6.0020.0002] # DOMINO TILE HORIZONTAL-00-02 -1F034 ; [*11F7.0020.0002] # DOMINO TILE HORIZONTAL-00-03 -1F035 ; [*11F8.0020.0002] # DOMINO TILE HORIZONTAL-00-04 -1F036 ; [*11F9.0020.0002] # DOMINO TILE HORIZONTAL-00-05 -1F037 ; [*11FA.0020.0002] # DOMINO TILE HORIZONTAL-00-06 -1F038 ; [*11FB.0020.0002] # DOMINO TILE HORIZONTAL-01-00 -1F039 ; [*11FC.0020.0002] # DOMINO TILE HORIZONTAL-01-01 -1F03A ; [*11FD.0020.0002] # DOMINO TILE HORIZONTAL-01-02 -1F03B ; [*11FE.0020.0002] # DOMINO TILE HORIZONTAL-01-03 -1F03C ; [*11FF.0020.0002] # DOMINO TILE HORIZONTAL-01-04 -1F03D ; [*1200.0020.0002] # DOMINO TILE HORIZONTAL-01-05 -1F03E ; [*1201.0020.0002] # DOMINO TILE HORIZONTAL-01-06 -1F03F ; [*1202.0020.0002] # DOMINO TILE HORIZONTAL-02-00 -1F040 ; [*1203.0020.0002] # DOMINO TILE HORIZONTAL-02-01 -1F041 ; [*1204.0020.0002] # DOMINO TILE HORIZONTAL-02-02 -1F042 ; [*1205.0020.0002] # DOMINO TILE HORIZONTAL-02-03 -1F043 ; [*1206.0020.0002] # DOMINO TILE HORIZONTAL-02-04 -1F044 ; [*1207.0020.0002] # DOMINO TILE HORIZONTAL-02-05 -1F045 ; [*1208.0020.0002] # DOMINO TILE HORIZONTAL-02-06 -1F046 ; [*1209.0020.0002] # DOMINO TILE HORIZONTAL-03-00 -1F047 ; [*120A.0020.0002] # DOMINO TILE HORIZONTAL-03-01 -1F048 ; [*120B.0020.0002] # DOMINO TILE HORIZONTAL-03-02 -1F049 ; [*120C.0020.0002] # DOMINO TILE HORIZONTAL-03-03 -1F04A ; [*120D.0020.0002] # DOMINO TILE HORIZONTAL-03-04 -1F04B ; [*120E.0020.0002] # DOMINO TILE HORIZONTAL-03-05 -1F04C ; [*120F.0020.0002] # DOMINO TILE HORIZONTAL-03-06 -1F04D ; [*1210.0020.0002] # DOMINO TILE HORIZONTAL-04-00 -1F04E ; [*1211.0020.0002] # DOMINO TILE HORIZONTAL-04-01 -1F04F ; [*1212.0020.0002] # DOMINO TILE HORIZONTAL-04-02 -1F050 ; [*1213.0020.0002] # DOMINO TILE HORIZONTAL-04-03 -1F051 ; [*1214.0020.0002] # DOMINO TILE HORIZONTAL-04-04 -1F052 ; [*1215.0020.0002] # DOMINO TILE HORIZONTAL-04-05 -1F053 ; [*1216.0020.0002] # DOMINO TILE HORIZONTAL-04-06 -1F054 ; [*1217.0020.0002] # DOMINO TILE HORIZONTAL-05-00 -1F055 ; [*1218.0020.0002] # DOMINO TILE HORIZONTAL-05-01 -1F056 ; [*1219.0020.0002] # DOMINO TILE HORIZONTAL-05-02 -1F057 ; [*121A.0020.0002] # DOMINO TILE HORIZONTAL-05-03 -1F058 ; [*121B.0020.0002] # DOMINO TILE HORIZONTAL-05-04 -1F059 ; [*121C.0020.0002] # DOMINO TILE HORIZONTAL-05-05 -1F05A ; [*121D.0020.0002] # DOMINO TILE HORIZONTAL-05-06 -1F05B ; [*121E.0020.0002] # DOMINO TILE HORIZONTAL-06-00 -1F05C ; [*121F.0020.0002] # DOMINO TILE HORIZONTAL-06-01 -1F05D ; [*1220.0020.0002] # DOMINO TILE HORIZONTAL-06-02 -1F05E ; [*1221.0020.0002] # DOMINO TILE HORIZONTAL-06-03 -1F05F ; [*1222.0020.0002] # DOMINO TILE HORIZONTAL-06-04 -1F060 ; [*1223.0020.0002] # DOMINO TILE HORIZONTAL-06-05 -1F061 ; [*1224.0020.0002] # DOMINO TILE HORIZONTAL-06-06 -1F062 ; [*1225.0020.0002] # DOMINO TILE VERTICAL BACK -1F063 ; [*1226.0020.0002] # DOMINO TILE VERTICAL-00-00 -1F064 ; [*1227.0020.0002] # DOMINO TILE VERTICAL-00-01 -1F065 ; [*1228.0020.0002] # DOMINO TILE VERTICAL-00-02 -1F066 ; [*1229.0020.0002] # DOMINO TILE VERTICAL-00-03 -1F067 ; [*122A.0020.0002] # DOMINO TILE VERTICAL-00-04 -1F068 ; [*122B.0020.0002] # DOMINO TILE VERTICAL-00-05 -1F069 ; [*122C.0020.0002] # DOMINO TILE VERTICAL-00-06 -1F06A ; [*122D.0020.0002] # DOMINO TILE VERTICAL-01-00 -1F06B ; [*122E.0020.0002] # DOMINO TILE VERTICAL-01-01 -1F06C ; [*122F.0020.0002] # DOMINO TILE VERTICAL-01-02 -1F06D ; [*1230.0020.0002] # DOMINO TILE VERTICAL-01-03 -1F06E ; [*1231.0020.0002] # DOMINO TILE VERTICAL-01-04 -1F06F ; [*1232.0020.0002] # DOMINO TILE VERTICAL-01-05 -1F070 ; [*1233.0020.0002] # DOMINO TILE VERTICAL-01-06 -1F071 ; [*1234.0020.0002] # DOMINO TILE VERTICAL-02-00 -1F072 ; [*1235.0020.0002] # DOMINO TILE VERTICAL-02-01 -1F073 ; [*1236.0020.0002] # DOMINO TILE VERTICAL-02-02 -1F074 ; [*1237.0020.0002] # DOMINO TILE VERTICAL-02-03 -1F075 ; [*1238.0020.0002] # DOMINO TILE VERTICAL-02-04 -1F076 ; [*1239.0020.0002] # DOMINO TILE VERTICAL-02-05 -1F077 ; [*123A.0020.0002] # DOMINO TILE VERTICAL-02-06 -1F078 ; [*123B.0020.0002] # DOMINO TILE VERTICAL-03-00 -1F079 ; [*123C.0020.0002] # DOMINO TILE VERTICAL-03-01 -1F07A ; [*123D.0020.0002] # DOMINO TILE VERTICAL-03-02 -1F07B ; [*123E.0020.0002] # DOMINO TILE VERTICAL-03-03 -1F07C ; [*123F.0020.0002] # DOMINO TILE VERTICAL-03-04 -1F07D ; [*1240.0020.0002] # DOMINO TILE VERTICAL-03-05 -1F07E ; [*1241.0020.0002] # DOMINO TILE VERTICAL-03-06 -1F07F ; [*1242.0020.0002] # DOMINO TILE VERTICAL-04-00 -1F080 ; [*1243.0020.0002] # DOMINO TILE VERTICAL-04-01 -1F081 ; [*1244.0020.0002] # DOMINO TILE VERTICAL-04-02 -1F082 ; [*1245.0020.0002] # DOMINO TILE VERTICAL-04-03 -1F083 ; [*1246.0020.0002] # DOMINO TILE VERTICAL-04-04 -1F084 ; [*1247.0020.0002] # DOMINO TILE VERTICAL-04-05 -1F085 ; [*1248.0020.0002] # DOMINO TILE VERTICAL-04-06 -1F086 ; [*1249.0020.0002] # DOMINO TILE VERTICAL-05-00 -1F087 ; [*124A.0020.0002] # DOMINO TILE VERTICAL-05-01 -1F088 ; [*124B.0020.0002] # DOMINO TILE VERTICAL-05-02 -1F089 ; [*124C.0020.0002] # DOMINO TILE VERTICAL-05-03 -1F08A ; [*124D.0020.0002] # DOMINO TILE VERTICAL-05-04 -1F08B ; [*124E.0020.0002] # DOMINO TILE VERTICAL-05-05 -1F08C ; [*124F.0020.0002] # DOMINO TILE VERTICAL-05-06 -1F08D ; [*1250.0020.0002] # DOMINO TILE VERTICAL-06-00 -1F08E ; [*1251.0020.0002] # DOMINO TILE VERTICAL-06-01 -1F08F ; [*1252.0020.0002] # DOMINO TILE VERTICAL-06-02 -1F090 ; [*1253.0020.0002] # DOMINO TILE VERTICAL-06-03 -1F091 ; [*1254.0020.0002] # DOMINO TILE VERTICAL-06-04 -1F092 ; [*1255.0020.0002] # DOMINO TILE VERTICAL-06-05 -1F093 ; [*1256.0020.0002] # DOMINO TILE VERTICAL-06-06 -1F0A0 ; [*1257.0020.0002] # PLAYING CARD BACK -1F0A1 ; [*1258.0020.0002] # PLAYING CARD ACE OF SPADES -1F0A2 ; [*1259.0020.0002] # PLAYING CARD TWO OF SPADES -1F0A3 ; [*125A.0020.0002] # PLAYING CARD THREE OF SPADES -1F0A4 ; [*125B.0020.0002] # PLAYING CARD FOUR OF SPADES -1F0A5 ; [*125C.0020.0002] # PLAYING CARD FIVE OF SPADES -1F0A6 ; [*125D.0020.0002] # PLAYING CARD SIX OF SPADES -1F0A7 ; [*125E.0020.0002] # PLAYING CARD SEVEN OF SPADES -1F0A8 ; [*125F.0020.0002] # PLAYING CARD EIGHT OF SPADES -1F0A9 ; [*1260.0020.0002] # PLAYING CARD NINE OF SPADES -1F0AA ; [*1261.0020.0002] # PLAYING CARD TEN OF SPADES -1F0AB ; [*1262.0020.0002] # PLAYING CARD JACK OF SPADES -1F0AC ; [*1263.0020.0002] # PLAYING CARD KNIGHT OF SPADES -1F0AD ; [*1264.0020.0002] # PLAYING CARD QUEEN OF SPADES -1F0AE ; [*1265.0020.0002] # PLAYING CARD KING OF SPADES -1F0B1 ; [*1266.0020.0002] # PLAYING CARD ACE OF HEARTS -1F0B2 ; [*1267.0020.0002] # PLAYING CARD TWO OF HEARTS -1F0B3 ; [*1268.0020.0002] # PLAYING CARD THREE OF HEARTS -1F0B4 ; [*1269.0020.0002] # PLAYING CARD FOUR OF HEARTS -1F0B5 ; [*126A.0020.0002] # PLAYING CARD FIVE OF HEARTS -1F0B6 ; [*126B.0020.0002] # PLAYING CARD SIX OF HEARTS -1F0B7 ; [*126C.0020.0002] # PLAYING CARD SEVEN OF HEARTS -1F0B8 ; [*126D.0020.0002] # PLAYING CARD EIGHT OF HEARTS -1F0B9 ; [*126E.0020.0002] # PLAYING CARD NINE OF HEARTS -1F0BA ; [*126F.0020.0002] # PLAYING CARD TEN OF HEARTS -1F0BB ; [*1270.0020.0002] # PLAYING CARD JACK OF HEARTS -1F0BC ; [*1271.0020.0002] # PLAYING CARD KNIGHT OF HEARTS -1F0BD ; [*1272.0020.0002] # PLAYING CARD QUEEN OF HEARTS -1F0BE ; [*1273.0020.0002] # PLAYING CARD KING OF HEARTS -1F0BF ; [*1274.0020.0002] # PLAYING CARD RED JOKER -1F0C1 ; [*1275.0020.0002] # PLAYING CARD ACE OF DIAMONDS -1F0C2 ; [*1276.0020.0002] # PLAYING CARD TWO OF DIAMONDS -1F0C3 ; [*1277.0020.0002] # PLAYING CARD THREE OF DIAMONDS -1F0C4 ; [*1278.0020.0002] # PLAYING CARD FOUR OF DIAMONDS -1F0C5 ; [*1279.0020.0002] # PLAYING CARD FIVE OF DIAMONDS -1F0C6 ; [*127A.0020.0002] # PLAYING CARD SIX OF DIAMONDS -1F0C7 ; [*127B.0020.0002] # PLAYING CARD SEVEN OF DIAMONDS -1F0C8 ; [*127C.0020.0002] # PLAYING CARD EIGHT OF DIAMONDS -1F0C9 ; [*127D.0020.0002] # PLAYING CARD NINE OF DIAMONDS -1F0CA ; [*127E.0020.0002] # PLAYING CARD TEN OF DIAMONDS -1F0CB ; [*127F.0020.0002] # PLAYING CARD JACK OF DIAMONDS -1F0CC ; [*1280.0020.0002] # PLAYING CARD KNIGHT OF DIAMONDS -1F0CD ; [*1281.0020.0002] # PLAYING CARD QUEEN OF DIAMONDS -1F0CE ; [*1282.0020.0002] # PLAYING CARD KING OF DIAMONDS -1F0CF ; [*1283.0020.0002] # PLAYING CARD BLACK JOKER -1F0D1 ; [*1284.0020.0002] # PLAYING CARD ACE OF CLUBS -1F0D2 ; [*1285.0020.0002] # PLAYING CARD TWO OF CLUBS -1F0D3 ; [*1286.0020.0002] # PLAYING CARD THREE OF CLUBS -1F0D4 ; [*1287.0020.0002] # PLAYING CARD FOUR OF CLUBS -1F0D5 ; [*1288.0020.0002] # PLAYING CARD FIVE OF CLUBS -1F0D6 ; [*1289.0020.0002] # PLAYING CARD SIX OF CLUBS -1F0D7 ; [*128A.0020.0002] # PLAYING CARD SEVEN OF CLUBS -1F0D8 ; [*128B.0020.0002] # PLAYING CARD EIGHT OF CLUBS -1F0D9 ; [*128C.0020.0002] # PLAYING CARD NINE OF CLUBS -1F0DA ; [*128D.0020.0002] # PLAYING CARD TEN OF CLUBS -1F0DB ; [*128E.0020.0002] # PLAYING CARD JACK OF CLUBS -1F0DC ; [*128F.0020.0002] # PLAYING CARD KNIGHT OF CLUBS -1F0DD ; [*1290.0020.0002] # PLAYING CARD QUEEN OF CLUBS -1F0DE ; [*1291.0020.0002] # PLAYING CARD KING OF CLUBS -1F0DF ; [*1292.0020.0002] # PLAYING CARD WHITE JOKER -1F0E0 ; [*1293.0020.0002] # PLAYING CARD FOOL -1F0E1 ; [*1294.0020.0002] # PLAYING CARD TRUMP-1 -1F0E2 ; [*1295.0020.0002] # PLAYING CARD TRUMP-2 -1F0E3 ; [*1296.0020.0002] # PLAYING CARD TRUMP-3 -1F0E4 ; [*1297.0020.0002] # PLAYING CARD TRUMP-4 -1F0E5 ; [*1298.0020.0002] # PLAYING CARD TRUMP-5 -1F0E6 ; [*1299.0020.0002] # PLAYING CARD TRUMP-6 -1F0E7 ; [*129A.0020.0002] # PLAYING CARD TRUMP-7 -1F0E8 ; [*129B.0020.0002] # PLAYING CARD TRUMP-8 -1F0E9 ; [*129C.0020.0002] # PLAYING CARD TRUMP-9 -1F0EA ; [*129D.0020.0002] # PLAYING CARD TRUMP-10 -1F0EB ; [*129E.0020.0002] # PLAYING CARD TRUMP-11 -1F0EC ; [*129F.0020.0002] # PLAYING CARD TRUMP-12 -1F0ED ; [*12A0.0020.0002] # PLAYING CARD TRUMP-13 -1F0EE ; [*12A1.0020.0002] # PLAYING CARD TRUMP-14 -1F0EF ; [*12A2.0020.0002] # PLAYING CARD TRUMP-15 -1F0F0 ; [*12A3.0020.0002] # PLAYING CARD TRUMP-16 -1F0F1 ; [*12A4.0020.0002] # PLAYING CARD TRUMP-17 -1F0F2 ; [*12A5.0020.0002] # PLAYING CARD TRUMP-18 -1F0F3 ; [*12A6.0020.0002] # PLAYING CARD TRUMP-19 -1F0F4 ; [*12A7.0020.0002] # PLAYING CARD TRUMP-20 -1F0F5 ; [*12A8.0020.0002] # PLAYING CARD TRUMP-21 -1F1E6 ; [*0A07.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER A -1F1E7 ; [*0A08.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER B -1F1E8 ; [*0A09.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER C -1F1E9 ; [*0A0A.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER D -1F1EA ; [*0A0B.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER E -1F1EB ; [*0A0C.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER F -1F1EC ; [*0A0D.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER G -1F1ED ; [*0A0E.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER H -1F1EE ; [*0A0F.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER I -1F1EF ; [*0A10.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER J -1F1F0 ; [*0A11.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER K -1F1F1 ; [*0A12.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER L -1F1F2 ; [*0A13.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER M -1F1F3 ; [*0A14.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER N -1F1F4 ; [*0A15.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER O -1F1F5 ; [*0A16.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER P -1F1F6 ; [*0A17.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Q -1F1F7 ; [*0A18.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER R -1F1F8 ; [*0A19.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER S -1F1F9 ; [*0A1A.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER T -1F1FA ; [*0A1B.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER U -1F1FB ; [*0A1C.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER V -1F1FC ; [*0A1D.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER W -1F1FD ; [*0A1E.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER X -1F1FE ; [*0A1F.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Y -1F1FF ; [*0A20.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Z -1F300 ; [*12A9.0020.0002] # CYCLONE -1F301 ; [*12AA.0020.0002] # FOGGY -1F302 ; [*12AB.0020.0002] # CLOSED UMBRELLA -1F303 ; [*12AC.0020.0002] # NIGHT WITH STARS -1F304 ; [*12AD.0020.0002] # SUNRISE OVER MOUNTAINS -1F305 ; [*12AE.0020.0002] # SUNRISE -1F306 ; [*12AF.0020.0002] # CITYSCAPE AT DUSK -1F307 ; [*12B0.0020.0002] # SUNSET OVER BUILDINGS -1F308 ; [*12B1.0020.0002] # RAINBOW -1F309 ; [*12B2.0020.0002] # BRIDGE AT NIGHT -1F30A ; [*12B3.0020.0002] # WATER WAVE -1F30B ; [*12B4.0020.0002] # VOLCANO -1F30C ; [*12B5.0020.0002] # MILKY WAY -1F30D ; [*12B6.0020.0002] # EARTH GLOBE EUROPE-AFRICA -1F30E ; [*12B7.0020.0002] # EARTH GLOBE AMERICAS -1F30F ; [*12B8.0020.0002] # EARTH GLOBE ASIA-AUSTRALIA -1F310 ; [*12B9.0020.0002] # GLOBE WITH MERIDIANS -1F311 ; [*12BA.0020.0002] # NEW MOON SYMBOL -1F312 ; [*12BB.0020.0002] # WAXING CRESCENT MOON SYMBOL -1F313 ; [*12BC.0020.0002] # FIRST QUARTER MOON SYMBOL -1F314 ; [*12BD.0020.0002] # WAXING GIBBOUS MOON SYMBOL -1F315 ; [*12BE.0020.0002] # FULL MOON SYMBOL -1F316 ; [*12BF.0020.0002] # WANING GIBBOUS MOON SYMBOL -1F317 ; [*12C0.0020.0002] # LAST QUARTER MOON SYMBOL -1F318 ; [*12C1.0020.0002] # WANING CRESCENT MOON SYMBOL -1F319 ; [*12C2.0020.0002] # CRESCENT MOON -1F31A ; [*12C3.0020.0002] # NEW MOON WITH FACE -1F31B ; [*12C4.0020.0002] # FIRST QUARTER MOON WITH FACE -1F31C ; [*12C5.0020.0002] # LAST QUARTER MOON WITH FACE -1F31D ; [*12C6.0020.0002] # FULL MOON WITH FACE -1F31E ; [*12C7.0020.0002] # SUN WITH FACE -1F31F ; [*12C8.0020.0002] # GLOWING STAR -1F320 ; [*12C9.0020.0002] # SHOOTING STAR -1F321 ; [*12CA.0020.0002] # THERMOMETER -1F322 ; [*12CB.0020.0002] # BLACK DROPLET -1F323 ; [*12CC.0020.0002] # WHITE SUN -1F324 ; [*12CD.0020.0002] # WHITE SUN WITH SMALL CLOUD -1F325 ; [*12CE.0020.0002] # WHITE SUN BEHIND CLOUD -1F326 ; [*12CF.0020.0002] # WHITE SUN BEHIND CLOUD WITH RAIN -1F327 ; [*12D0.0020.0002] # CLOUD WITH RAIN -1F328 ; [*12D1.0020.0002] # CLOUD WITH SNOW -1F329 ; [*12D2.0020.0002] # CLOUD WITH LIGHTNING -1F32A ; [*12D3.0020.0002] # CLOUD WITH TORNADO -1F32B ; [*12D4.0020.0002] # FOG -1F32C ; [*12D5.0020.0002] # WIND BLOWING FACE -1F32D ; [*12D6.0020.0002] # HOT DOG -1F32E ; [*12D7.0020.0002] # TACO -1F32F ; [*12D8.0020.0002] # BURRITO -1F330 ; [*12D9.0020.0002] # CHESTNUT -1F331 ; [*12DA.0020.0002] # SEEDLING -1F332 ; [*12DB.0020.0002] # EVERGREEN TREE -1F333 ; [*12DC.0020.0002] # DECIDUOUS TREE -1F334 ; [*12DD.0020.0002] # PALM TREE -1F335 ; [*12DE.0020.0002] # CACTUS -1F336 ; [*12DF.0020.0002] # HOT PEPPER -1F337 ; [*12E0.0020.0002] # TULIP -1F338 ; [*12E1.0020.0002] # CHERRY BLOSSOM -1F339 ; [*12E2.0020.0002] # ROSE -1F33A ; [*12E3.0020.0002] # HIBISCUS -1F33B ; [*12E4.0020.0002] # SUNFLOWER -1F33C ; [*12E5.0020.0002] # BLOSSOM -1F33D ; [*12E6.0020.0002] # EAR OF MAIZE -1F33E ; [*12E7.0020.0002] # EAR OF RICE -1F33F ; [*12E8.0020.0002] # HERB -1F340 ; [*12E9.0020.0002] # FOUR LEAF CLOVER -1F341 ; [*12EA.0020.0002] # MAPLE LEAF -1F342 ; [*12EB.0020.0002] # FALLEN LEAF -1F343 ; [*12EC.0020.0002] # LEAF FLUTTERING IN WIND -1F344 ; [*12ED.0020.0002] # MUSHROOM -1F345 ; [*12EE.0020.0002] # TOMATO -1F346 ; [*12EF.0020.0002] # AUBERGINE -1F347 ; [*12F0.0020.0002] # GRAPES -1F348 ; [*12F1.0020.0002] # MELON -1F349 ; [*12F2.0020.0002] # WATERMELON -1F34A ; [*12F3.0020.0002] # TANGERINE -1F34B ; [*12F4.0020.0002] # LEMON -1F34C ; [*12F5.0020.0002] # BANANA -1F34D ; [*12F6.0020.0002] # PINEAPPLE -1F34E ; [*12F7.0020.0002] # RED APPLE -1F34F ; [*12F8.0020.0002] # GREEN APPLE -1F350 ; [*12F9.0020.0002] # PEAR -1F351 ; [*12FA.0020.0002] # PEACH -1F352 ; [*12FB.0020.0002] # CHERRIES -1F353 ; [*12FC.0020.0002] # STRAWBERRY -1F354 ; [*12FD.0020.0002] # HAMBURGER -1F355 ; [*12FE.0020.0002] # SLICE OF PIZZA -1F356 ; [*12FF.0020.0002] # MEAT ON BONE -1F357 ; [*1300.0020.0002] # POULTRY LEG -1F358 ; [*1301.0020.0002] # RICE CRACKER -1F359 ; [*1302.0020.0002] # RICE BALL -1F35A ; [*1303.0020.0002] # COOKED RICE -1F35B ; [*1304.0020.0002] # CURRY AND RICE -1F35C ; [*1305.0020.0002] # STEAMING BOWL -1F35D ; [*1306.0020.0002] # SPAGHETTI -1F35E ; [*1307.0020.0002] # BREAD -1F35F ; [*1308.0020.0002] # FRENCH FRIES -1F360 ; [*1309.0020.0002] # ROASTED SWEET POTATO -1F361 ; [*130A.0020.0002] # DANGO -1F362 ; [*130B.0020.0002] # ODEN -1F363 ; [*130C.0020.0002] # SUSHI -1F364 ; [*130D.0020.0002] # FRIED SHRIMP -1F365 ; [*130E.0020.0002] # FISH CAKE WITH SWIRL DESIGN -1F366 ; [*130F.0020.0002] # SOFT ICE CREAM -1F367 ; [*1310.0020.0002] # SHAVED ICE -1F368 ; [*1311.0020.0002] # ICE CREAM -1F369 ; [*1312.0020.0002] # DOUGHNUT -1F36A ; [*1313.0020.0002] # COOKIE -1F36B ; [*1314.0020.0002] # CHOCOLATE BAR -1F36C ; [*1315.0020.0002] # CANDY -1F36D ; [*1316.0020.0002] # LOLLIPOP -1F36E ; [*1317.0020.0002] # CUSTARD -1F36F ; [*1318.0020.0002] # HONEY POT -1F370 ; [*1319.0020.0002] # SHORTCAKE -1F371 ; [*131A.0020.0002] # BENTO BOX -1F372 ; [*131B.0020.0002] # POT OF FOOD -1F373 ; [*131C.0020.0002] # COOKING -1F374 ; [*131D.0020.0002] # FORK AND KNIFE -1F375 ; [*131E.0020.0002] # TEACUP WITHOUT HANDLE -1F376 ; [*131F.0020.0002] # SAKE BOTTLE AND CUP -1F377 ; [*1320.0020.0002] # WINE GLASS -1F378 ; [*1321.0020.0002] # COCKTAIL GLASS -1F379 ; [*1322.0020.0002] # TROPICAL DRINK -1F37A ; [*1323.0020.0002] # BEER MUG -1F37B ; [*1324.0020.0002] # CLINKING BEER MUGS -1F37C ; [*1325.0020.0002] # BABY BOTTLE -1F37D ; [*1326.0020.0002] # FORK AND KNIFE WITH PLATE -1F37E ; [*1327.0020.0002] # BOTTLE WITH POPPING CORK -1F37F ; [*1328.0020.0002] # POPCORN -1F380 ; [*1329.0020.0002] # RIBBON -1F381 ; [*132A.0020.0002] # WRAPPED PRESENT -1F382 ; [*132B.0020.0002] # BIRTHDAY CAKE -1F383 ; [*132C.0020.0002] # JACK-O-LANTERN -1F384 ; [*132D.0020.0002] # CHRISTMAS TREE -1F385 ; [*132E.0020.0002] # FATHER CHRISTMAS -1F386 ; [*132F.0020.0002] # FIREWORKS -1F387 ; [*1330.0020.0002] # FIREWORK SPARKLER -1F388 ; [*1331.0020.0002] # BALLOON -1F389 ; [*1332.0020.0002] # PARTY POPPER -1F38A ; [*1333.0020.0002] # CONFETTI BALL -1F38B ; [*1334.0020.0002] # TANABATA TREE -1F38C ; [*1335.0020.0002] # CROSSED FLAGS -1F38D ; [*1336.0020.0002] # PINE DECORATION -1F38E ; [*1337.0020.0002] # JAPANESE DOLLS -1F38F ; [*1338.0020.0002] # CARP STREAMER -1F390 ; [*1339.0020.0002] # WIND CHIME -1F391 ; [*133A.0020.0002] # MOON VIEWING CEREMONY -1F392 ; [*133B.0020.0002] # SCHOOL SATCHEL -1F393 ; [*133C.0020.0002] # GRADUATION CAP -1F394 ; [*133D.0020.0002] # HEART WITH TIP ON THE LEFT -1F395 ; [*133E.0020.0002] # BOUQUET OF FLOWERS -1F396 ; [*133F.0020.0002] # MILITARY MEDAL -1F397 ; [*1340.0020.0002] # REMINDER RIBBON -1F398 ; [*1341.0020.0002] # MUSICAL KEYBOARD WITH JACKS -1F399 ; [*1342.0020.0002] # STUDIO MICROPHONE -1F39A ; [*1343.0020.0002] # LEVEL SLIDER -1F39B ; [*1344.0020.0002] # CONTROL KNOBS -1F39C ; [*1345.0020.0002] # BEAMED ASCENDING MUSICAL NOTES -1F39D ; [*1346.0020.0002] # BEAMED DESCENDING MUSICAL NOTES -1F39E ; [*1347.0020.0002] # FILM FRAMES -1F39F ; [*1348.0020.0002] # ADMISSION TICKETS -1F3A0 ; [*1349.0020.0002] # CAROUSEL HORSE -1F3A1 ; [*134A.0020.0002] # FERRIS WHEEL -1F3A2 ; [*134B.0020.0002] # ROLLER COASTER -1F3A3 ; [*134C.0020.0002] # FISHING POLE AND FISH -1F3A4 ; [*134D.0020.0002] # MICROPHONE -1F3A5 ; [*134E.0020.0002] # MOVIE CAMERA -1F3A6 ; [*134F.0020.0002] # CINEMA -1F3A7 ; [*1350.0020.0002] # HEADPHONE -1F3A8 ; [*1351.0020.0002] # ARTIST PALETTE -1F3A9 ; [*1352.0020.0002] # TOP HAT -1F3AA ; [*1353.0020.0002] # CIRCUS TENT -1F3AB ; [*1354.0020.0002] # TICKET -1F3AC ; [*1355.0020.0002] # CLAPPER BOARD -1F3AD ; [*1356.0020.0002] # PERFORMING ARTS -1F3AE ; [*1357.0020.0002] # VIDEO GAME -1F3AF ; [*1358.0020.0002] # DIRECT HIT -1F3B0 ; [*1359.0020.0002] # SLOT MACHINE -1F3B1 ; [*135A.0020.0002] # BILLIARDS -1F3B2 ; [*135B.0020.0002] # GAME DIE -1F3B3 ; [*135C.0020.0002] # BOWLING -1F3B4 ; [*135D.0020.0002] # FLOWER PLAYING CARDS -1F3B5 ; [*135E.0020.0002] # MUSICAL NOTE -1F3B6 ; [*135F.0020.0002] # MULTIPLE MUSICAL NOTES -1F3B7 ; [*1360.0020.0002] # SAXOPHONE -1F3B8 ; [*1361.0020.0002] # GUITAR -1F3B9 ; [*1362.0020.0002] # MUSICAL KEYBOARD -1F3BA ; [*1363.0020.0002] # TRUMPET -1F3BB ; [*1364.0020.0002] # VIOLIN -1F3BC ; [*1365.0020.0002] # MUSICAL SCORE -1F3BD ; [*1366.0020.0002] # RUNNING SHIRT WITH SASH -1F3BE ; [*1367.0020.0002] # TENNIS RACQUET AND BALL -1F3BF ; [*1368.0020.0002] # SKI AND SKI BOOT -1F3C0 ; [*1369.0020.0002] # BASKETBALL AND HOOP -1F3C1 ; [*136A.0020.0002] # CHEQUERED FLAG -1F3C2 ; [*136B.0020.0002] # SNOWBOARDER -1F3C3 ; [*136C.0020.0002] # RUNNER -1F3C4 ; [*136D.0020.0002] # SURFER -1F3C5 ; [*136E.0020.0002] # SPORTS MEDAL -1F3C6 ; [*136F.0020.0002] # TROPHY -1F3C7 ; [*1370.0020.0002] # HORSE RACING -1F3C8 ; [*1371.0020.0002] # AMERICAN FOOTBALL -1F3C9 ; [*1372.0020.0002] # RUGBY FOOTBALL -1F3CA ; [*1373.0020.0002] # SWIMMER -1F3CB ; [*1374.0020.0002] # WEIGHT LIFTER -1F3CC ; [*1375.0020.0002] # GOLFER -1F3CD ; [*1376.0020.0002] # RACING MOTORCYCLE -1F3CE ; [*1377.0020.0002] # RACING CAR -1F3CF ; [*1378.0020.0002] # CRICKET BAT AND BALL -1F3D0 ; [*1379.0020.0002] # VOLLEYBALL -1F3D1 ; [*137A.0020.0002] # FIELD HOCKEY STICK AND BALL -1F3D2 ; [*137B.0020.0002] # ICE HOCKEY STICK AND PUCK -1F3D3 ; [*137C.0020.0002] # TABLE TENNIS PADDLE AND BALL -1F3D4 ; [*137D.0020.0002] # SNOW CAPPED MOUNTAIN -1F3D5 ; [*137E.0020.0002] # CAMPING -1F3D6 ; [*137F.0020.0002] # BEACH WITH UMBRELLA -1F3D7 ; [*1380.0020.0002] # BUILDING CONSTRUCTION -1F3D8 ; [*1381.0020.0002] # HOUSE BUILDINGS -1F3D9 ; [*1382.0020.0002] # CITYSCAPE -1F3DA ; [*1383.0020.0002] # DERELICT HOUSE BUILDING -1F3DB ; [*1384.0020.0002] # CLASSICAL BUILDING -1F3DC ; [*1385.0020.0002] # DESERT -1F3DD ; [*1386.0020.0002] # DESERT ISLAND -1F3DE ; [*1387.0020.0002] # NATIONAL PARK -1F3DF ; [*1388.0020.0002] # STADIUM -1F3E0 ; [*1389.0020.0002] # HOUSE BUILDING -1F3E1 ; [*138A.0020.0002] # HOUSE WITH GARDEN -1F3E2 ; [*138B.0020.0002] # OFFICE BUILDING -1F3E3 ; [*138C.0020.0002] # JAPANESE POST OFFICE -1F3E4 ; [*138D.0020.0002] # EUROPEAN POST OFFICE -1F3E5 ; [*138E.0020.0002] # HOSPITAL -1F3E6 ; [*138F.0020.0002] # BANK -1F3E7 ; [*1390.0020.0002] # AUTOMATED TELLER MACHINE -1F3E8 ; [*1391.0020.0002] # HOTEL -1F3E9 ; [*1392.0020.0002] # LOVE HOTEL -1F3EA ; [*1393.0020.0002] # CONVENIENCE STORE -1F3EB ; [*1394.0020.0002] # SCHOOL -1F3EC ; [*1395.0020.0002] # DEPARTMENT STORE -1F3ED ; [*1396.0020.0002] # FACTORY -1F3EE ; [*1397.0020.0002] # IZAKAYA LANTERN -1F3EF ; [*1398.0020.0002] # JAPANESE CASTLE -1F3F0 ; [*1399.0020.0002] # EUROPEAN CASTLE -1F3F1 ; [*139A.0020.0002] # WHITE PENNANT -1F3F2 ; [*139B.0020.0002] # BLACK PENNANT -1F3F3 ; [*139C.0020.0002] # WAVING WHITE FLAG -1F3F4 ; [*139D.0020.0002] # WAVING BLACK FLAG -1F3F5 ; [*139E.0020.0002] # ROSETTE -1F3F6 ; [*139F.0020.0002] # BLACK ROSETTE -1F3F7 ; [*13A0.0020.0002] # LABEL -1F3F8 ; [*13A1.0020.0002] # BADMINTON RACQUET AND SHUTTLECOCK -1F3F9 ; [*13A2.0020.0002] # BOW AND ARROW -1F3FA ; [*13A3.0020.0002] # AMPHORA -1F3FB ; [*13A4.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-1-2 -1F3FC ; [*13A5.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-3 -1F3FD ; [*13A6.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-4 -1F3FE ; [*13A7.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-5 -1F3FF ; [*13A8.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400 ; [*13A9.0020.0002] # RAT -1F401 ; [*13AA.0020.0002] # MOUSE -1F402 ; [*13AB.0020.0002] # OX -1F403 ; [*13AC.0020.0002] # WATER BUFFALO -1F404 ; [*13AD.0020.0002] # COW -1F405 ; [*13AE.0020.0002] # TIGER -1F406 ; [*13AF.0020.0002] # LEOPARD -1F407 ; [*13B0.0020.0002] # RABBIT -1F408 ; [*13B1.0020.0002] # CAT -1F409 ; [*13B2.0020.0002] # DRAGON -1F40A ; [*13B3.0020.0002] # CROCODILE -1F40B ; [*13B4.0020.0002] # WHALE -1F40C ; [*13B5.0020.0002] # SNAIL -1F40D ; [*13B6.0020.0002] # SNAKE -1F40E ; [*13B7.0020.0002] # HORSE -1F40F ; [*13B8.0020.0002] # RAM -1F410 ; [*13B9.0020.0002] # GOAT -1F411 ; [*13BA.0020.0002] # SHEEP -1F412 ; [*13BB.0020.0002] # MONKEY -1F413 ; [*13BC.0020.0002] # ROOSTER -1F414 ; [*13BD.0020.0002] # CHICKEN -1F415 ; [*13BE.0020.0002] # DOG -1F416 ; [*13BF.0020.0002] # PIG -1F417 ; [*13C0.0020.0002] # BOAR -1F418 ; [*13C1.0020.0002] # ELEPHANT -1F419 ; [*13C2.0020.0002] # OCTOPUS -1F41A ; [*13C3.0020.0002] # SPIRAL SHELL -1F41B ; [*13C4.0020.0002] # BUG -1F41C ; [*13C5.0020.0002] # ANT -1F41D ; [*13C6.0020.0002] # HONEYBEE -1F41E ; [*13C7.0020.0002] # LADY BEETLE -1F41F ; [*13C8.0020.0002] # FISH -1F420 ; [*13C9.0020.0002] # TROPICAL FISH -1F421 ; [*13CA.0020.0002] # BLOWFISH -1F422 ; [*13CB.0020.0002] # TURTLE -1F423 ; [*13CC.0020.0002] # HATCHING CHICK -1F424 ; [*13CD.0020.0002] # BABY CHICK -1F425 ; [*13CE.0020.0002] # FRONT-FACING BABY CHICK -1F426 ; [*13CF.0020.0002] # BIRD -1F427 ; [*13D0.0020.0002] # PENGUIN -1F428 ; [*13D1.0020.0002] # KOALA -1F429 ; [*13D2.0020.0002] # POODLE -1F42A ; [*13D3.0020.0002] # DROMEDARY CAMEL -1F42B ; [*13D4.0020.0002] # BACTRIAN CAMEL -1F42C ; [*13D5.0020.0002] # DOLPHIN -1F42D ; [*13D6.0020.0002] # MOUSE FACE -1F42E ; [*13D7.0020.0002] # COW FACE -1F42F ; [*13D8.0020.0002] # TIGER FACE -1F430 ; [*13D9.0020.0002] # RABBIT FACE -1F431 ; [*13DA.0020.0002] # CAT FACE -1F432 ; [*13DB.0020.0002] # DRAGON FACE -1F433 ; [*13DC.0020.0002] # SPOUTING WHALE -1F434 ; [*13DD.0020.0002] # HORSE FACE -1F435 ; [*13DE.0020.0002] # MONKEY FACE -1F436 ; [*13DF.0020.0002] # DOG FACE -1F437 ; [*13E0.0020.0002] # PIG FACE -1F438 ; [*13E1.0020.0002] # FROG FACE -1F439 ; [*13E2.0020.0002] # HAMSTER FACE -1F43A ; [*13E3.0020.0002] # WOLF FACE -1F43B ; [*13E4.0020.0002] # BEAR FACE -1F43C ; [*13E5.0020.0002] # PANDA FACE -1F43D ; [*13E6.0020.0002] # PIG NOSE -1F43E ; [*13E7.0020.0002] # PAW PRINTS -1F43F ; [*13E8.0020.0002] # CHIPMUNK -1F440 ; [*13E9.0020.0002] # EYES -1F441 ; [*13EA.0020.0002] # EYE -1F442 ; [*13EB.0020.0002] # EAR -1F443 ; [*13EC.0020.0002] # NOSE -1F444 ; [*13ED.0020.0002] # MOUTH -1F445 ; [*13EE.0020.0002] # TONGUE -1F446 ; [*13EF.0020.0002] # WHITE UP POINTING BACKHAND INDEX -1F447 ; [*13F0.0020.0002] # WHITE DOWN POINTING BACKHAND INDEX -1F448 ; [*13F1.0020.0002] # WHITE LEFT POINTING BACKHAND INDEX -1F449 ; [*13F2.0020.0002] # WHITE RIGHT POINTING BACKHAND INDEX -1F44A ; [*13F3.0020.0002] # FISTED HAND SIGN -1F44B ; [*13F4.0020.0002] # WAVING HAND SIGN -1F44C ; [*13F5.0020.0002] # OK HAND SIGN -1F44D ; [*13F6.0020.0002] # THUMBS UP SIGN -1F44E ; [*13F7.0020.0002] # THUMBS DOWN SIGN -1F44F ; [*13F8.0020.0002] # CLAPPING HANDS SIGN -1F450 ; [*13F9.0020.0002] # OPEN HANDS SIGN -1F451 ; [*13FA.0020.0002] # CROWN -1F452 ; [*13FB.0020.0002] # WOMANS HAT -1F453 ; [*13FC.0020.0002] # EYEGLASSES -1F454 ; [*13FD.0020.0002] # NECKTIE -1F455 ; [*13FE.0020.0002] # T-SHIRT -1F456 ; [*13FF.0020.0002] # JEANS -1F457 ; [*1400.0020.0002] # DRESS -1F458 ; [*1401.0020.0002] # KIMONO -1F459 ; [*1402.0020.0002] # BIKINI -1F45A ; [*1403.0020.0002] # WOMANS CLOTHES -1F45B ; [*1404.0020.0002] # PURSE -1F45C ; [*1405.0020.0002] # HANDBAG -1F45D ; [*1406.0020.0002] # POUCH -1F45E ; [*1407.0020.0002] # MANS SHOE -1F45F ; [*1408.0020.0002] # ATHLETIC SHOE -1F460 ; [*1409.0020.0002] # HIGH-HEELED SHOE -1F461 ; [*140A.0020.0002] # WOMANS SANDAL -1F462 ; [*140B.0020.0002] # WOMANS BOOTS -1F463 ; [*140C.0020.0002] # FOOTPRINTS -1F464 ; [*140D.0020.0002] # BUST IN SILHOUETTE -1F465 ; [*140E.0020.0002] # BUSTS IN SILHOUETTE -1F466 ; [*140F.0020.0002] # BOY -1F467 ; [*1410.0020.0002] # GIRL -1F468 ; [*1411.0020.0002] # MAN -1F469 ; [*1412.0020.0002] # WOMAN -1F46A ; [*1413.0020.0002] # FAMILY -1F46B ; [*1414.0020.0002] # MAN AND WOMAN HOLDING HANDS -1F46C ; [*1415.0020.0002] # TWO MEN HOLDING HANDS -1F46D ; [*1416.0020.0002] # TWO WOMEN HOLDING HANDS -1F46E ; [*1417.0020.0002] # POLICE OFFICER -1F46F ; [*1418.0020.0002] # WOMAN WITH BUNNY EARS -1F470 ; [*1419.0020.0002] # BRIDE WITH VEIL -1F471 ; [*141A.0020.0002] # PERSON WITH BLOND HAIR -1F472 ; [*141B.0020.0002] # MAN WITH GUA PI MAO -1F473 ; [*141C.0020.0002] # MAN WITH TURBAN -1F474 ; [*141D.0020.0002] # OLDER MAN -1F475 ; [*141E.0020.0002] # OLDER WOMAN -1F476 ; [*141F.0020.0002] # BABY -1F477 ; [*1420.0020.0002] # CONSTRUCTION WORKER -1F478 ; [*1421.0020.0002] # PRINCESS -1F479 ; [*1422.0020.0002] # JAPANESE OGRE -1F47A ; [*1423.0020.0002] # JAPANESE GOBLIN -1F47B ; [*1424.0020.0002] # GHOST -1F47C ; [*1425.0020.0002] # BABY ANGEL -1F47D ; [*1426.0020.0002] # EXTRATERRESTRIAL ALIEN -1F47E ; [*1427.0020.0002] # ALIEN MONSTER -1F47F ; [*1428.0020.0002] # IMP -1F480 ; [*1429.0020.0002] # SKULL -1F481 ; [*142A.0020.0002] # INFORMATION DESK PERSON -1F482 ; [*142B.0020.0002] # GUARDSMAN -1F483 ; [*142C.0020.0002] # DANCER -1F484 ; [*142D.0020.0002] # LIPSTICK -1F485 ; [*142E.0020.0002] # NAIL POLISH -1F486 ; [*142F.0020.0002] # FACE MASSAGE -1F487 ; [*1430.0020.0002] # HAIRCUT -1F488 ; [*1431.0020.0002] # BARBER POLE -1F489 ; [*1432.0020.0002] # SYRINGE -1F48A ; [*1433.0020.0002] # PILL -1F48B ; [*1434.0020.0002] # KISS MARK -1F48C ; [*1435.0020.0002] # LOVE LETTER -1F48D ; [*1436.0020.0002] # RING -1F48E ; [*1437.0020.0002] # GEM STONE -1F48F ; [*1438.0020.0002] # KISS -1F490 ; [*1439.0020.0002] # BOUQUET -1F491 ; [*143A.0020.0002] # COUPLE WITH HEART -1F492 ; [*143B.0020.0002] # WEDDING -1F493 ; [*143C.0020.0002] # BEATING HEART -1F494 ; [*143D.0020.0002] # BROKEN HEART -1F495 ; [*143E.0020.0002] # TWO HEARTS -1F496 ; [*143F.0020.0002] # SPARKLING HEART -1F497 ; [*1440.0020.0002] # GROWING HEART -1F498 ; [*1441.0020.0002] # HEART WITH ARROW -1F499 ; [*1442.0020.0002] # BLUE HEART -1F49A ; [*1443.0020.0002] # GREEN HEART -1F49B ; [*1444.0020.0002] # YELLOW HEART -1F49C ; [*1445.0020.0002] # PURPLE HEART -1F49D ; [*1446.0020.0002] # HEART WITH RIBBON -1F49E ; [*1447.0020.0002] # REVOLVING HEARTS -1F49F ; [*1448.0020.0002] # HEART DECORATION -1F4A0 ; [*1449.0020.0002] # DIAMOND SHAPE WITH A DOT INSIDE -1F4A1 ; [*144A.0020.0002] # ELECTRIC LIGHT BULB -1F4A2 ; [*144B.0020.0002] # ANGER SYMBOL -1F4A3 ; [*144C.0020.0002] # BOMB -1F4A4 ; [*144D.0020.0002] # SLEEPING SYMBOL -1F4A5 ; [*144E.0020.0002] # COLLISION SYMBOL -1F4A6 ; [*144F.0020.0002] # SPLASHING SWEAT SYMBOL -1F4A7 ; [*1450.0020.0002] # DROPLET -1F4A8 ; [*1451.0020.0002] # DASH SYMBOL -1F4A9 ; [*1452.0020.0002] # PILE OF POO -1F4AA ; [*1453.0020.0002] # FLEXED BICEPS -1F4AB ; [*1454.0020.0002] # DIZZY SYMBOL -1F4AC ; [*1455.0020.0002] # SPEECH BALLOON -1F4AD ; [*1456.0020.0002] # THOUGHT BALLOON -1F4AE ; [*1457.0020.0002] # WHITE FLOWER -1F4AF ; [*1458.0020.0002] # HUNDRED POINTS SYMBOL -1F4B0 ; [*1459.0020.0002] # MONEY BAG -1F4B1 ; [*145A.0020.0002] # CURRENCY EXCHANGE -1F4B2 ; [*145B.0020.0002] # HEAVY DOLLAR SIGN -1F4B3 ; [*145C.0020.0002] # CREDIT CARD -1F4B4 ; [*145D.0020.0002] # BANKNOTE WITH YEN SIGN -1F4B5 ; [*145E.0020.0002] # BANKNOTE WITH DOLLAR SIGN -1F4B6 ; [*145F.0020.0002] # BANKNOTE WITH EURO SIGN -1F4B7 ; [*1460.0020.0002] # BANKNOTE WITH POUND SIGN -1F4B8 ; [*1461.0020.0002] # MONEY WITH WINGS -1F4B9 ; [*1462.0020.0002] # CHART WITH UPWARDS TREND AND YEN SIGN -1F4BA ; [*1463.0020.0002] # SEAT -1F4BB ; [*1464.0020.0002] # PERSONAL COMPUTER -1F4BC ; [*1465.0020.0002] # BRIEFCASE -1F4BD ; [*1466.0020.0002] # MINIDISC -1F4BE ; [*1467.0020.0002] # FLOPPY DISK -1F4BF ; [*1468.0020.0002] # OPTICAL DISC -1F4C0 ; [*1469.0020.0002] # DVD -1F4C1 ; [*146A.0020.0002] # FILE FOLDER -1F4C2 ; [*146B.0020.0002] # OPEN FILE FOLDER -1F4C3 ; [*146C.0020.0002] # PAGE WITH CURL -1F4C4 ; [*146D.0020.0002] # PAGE FACING UP -1F4C5 ; [*146E.0020.0002] # CALENDAR -1F4C6 ; [*146F.0020.0002] # TEAR-OFF CALENDAR -1F4C7 ; [*1470.0020.0002] # CARD INDEX -1F4C8 ; [*1471.0020.0002] # CHART WITH UPWARDS TREND -1F4C9 ; [*1472.0020.0002] # CHART WITH DOWNWARDS TREND -1F4CA ; [*1473.0020.0002] # BAR CHART -1F4CB ; [*1474.0020.0002] # CLIPBOARD -1F4CC ; [*1475.0020.0002] # PUSHPIN -1F4CD ; [*1476.0020.0002] # ROUND PUSHPIN -1F4CE ; [*1477.0020.0002] # PAPERCLIP -1F4CF ; [*1478.0020.0002] # STRAIGHT RULER -1F4D0 ; [*1479.0020.0002] # TRIANGULAR RULER -1F4D1 ; [*147A.0020.0002] # BOOKMARK TABS -1F4D2 ; [*147B.0020.0002] # LEDGER -1F4D3 ; [*147C.0020.0002] # NOTEBOOK -1F4D4 ; [*147D.0020.0002] # NOTEBOOK WITH DECORATIVE COVER -1F4D5 ; [*147E.0020.0002] # CLOSED BOOK -1F4D6 ; [*147F.0020.0002] # OPEN BOOK -1F4D7 ; [*1480.0020.0002] # GREEN BOOK -1F4D8 ; [*1481.0020.0002] # BLUE BOOK -1F4D9 ; [*1482.0020.0002] # ORANGE BOOK -1F4DA ; [*1483.0020.0002] # BOOKS -1F4DB ; [*1484.0020.0002] # NAME BADGE -1F4DC ; [*1485.0020.0002] # SCROLL -1F4DD ; [*1486.0020.0002] # MEMO -1F4DE ; [*1487.0020.0002] # TELEPHONE RECEIVER -1F4DF ; [*1488.0020.0002] # PAGER -1F4E0 ; [*1489.0020.0002] # FAX MACHINE -1F4E1 ; [*148A.0020.0002] # SATELLITE ANTENNA -1F4E2 ; [*148B.0020.0002] # PUBLIC ADDRESS LOUDSPEAKER -1F4E3 ; [*148C.0020.0002] # CHEERING MEGAPHONE -1F4E4 ; [*148D.0020.0002] # OUTBOX TRAY -1F4E5 ; [*148E.0020.0002] # INBOX TRAY -1F4E6 ; [*148F.0020.0002] # PACKAGE -1F4E7 ; [*1490.0020.0002] # E-MAIL SYMBOL -1F4E8 ; [*1491.0020.0002] # INCOMING ENVELOPE -1F4E9 ; [*1492.0020.0002] # ENVELOPE WITH DOWNWARDS ARROW ABOVE -1F4EA ; [*1493.0020.0002] # CLOSED MAILBOX WITH LOWERED FLAG -1F4EB ; [*1494.0020.0002] # CLOSED MAILBOX WITH RAISED FLAG -1F4EC ; [*1495.0020.0002] # OPEN MAILBOX WITH RAISED FLAG -1F4ED ; [*1496.0020.0002] # OPEN MAILBOX WITH LOWERED FLAG -1F4EE ; [*1497.0020.0002] # POSTBOX -1F4EF ; [*1498.0020.0002] # POSTAL HORN -1F4F0 ; [*1499.0020.0002] # NEWSPAPER -1F4F1 ; [*149A.0020.0002] # MOBILE PHONE -1F4F2 ; [*149B.0020.0002] # MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT -1F4F3 ; [*149C.0020.0002] # VIBRATION MODE -1F4F4 ; [*149D.0020.0002] # MOBILE PHONE OFF -1F4F5 ; [*149E.0020.0002] # NO MOBILE PHONES -1F4F6 ; [*149F.0020.0002] # ANTENNA WITH BARS -1F4F7 ; [*14A0.0020.0002] # CAMERA -1F4F8 ; [*14A1.0020.0002] # CAMERA WITH FLASH -1F4F9 ; [*14A2.0020.0002] # VIDEO CAMERA -1F4FA ; [*14A3.0020.0002] # TELEVISION -1F4FB ; [*14A4.0020.0002] # RADIO -1F4FC ; [*14A5.0020.0002] # VIDEOCASSETTE -1F4FD ; [*14A6.0020.0002] # FILM PROJECTOR -1F4FE ; [*14A7.0020.0002] # PORTABLE STEREO -1F4FF ; [*14A8.0020.0002] # PRAYER BEADS -1F500 ; [*14A9.0020.0002] # TWISTED RIGHTWARDS ARROWS -1F501 ; [*14AA.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS -1F502 ; [*14AB.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY -1F503 ; [*14AC.0020.0002] # CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS -1F504 ; [*14AD.0020.0002] # ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS -1F505 ; [*14AE.0020.0002] # LOW BRIGHTNESS SYMBOL -1F506 ; [*14AF.0020.0002] # HIGH BRIGHTNESS SYMBOL -1F507 ; [*14B0.0020.0002] # SPEAKER WITH CANCELLATION STROKE -1F508 ; [*14B1.0020.0002] # SPEAKER -1F509 ; [*14B2.0020.0002] # SPEAKER WITH ONE SOUND WAVE -1F50A ; [*14B3.0020.0002] # SPEAKER WITH THREE SOUND WAVES -1F50B ; [*14B4.0020.0002] # BATTERY -1F50C ; [*14B5.0020.0002] # ELECTRIC PLUG -1F50D ; [*14B6.0020.0002] # LEFT-POINTING MAGNIFYING GLASS -1F50E ; [*14B7.0020.0002] # RIGHT-POINTING MAGNIFYING GLASS -1F50F ; [*14B8.0020.0002] # LOCK WITH INK PEN -1F510 ; [*14B9.0020.0002] # CLOSED LOCK WITH KEY -1F511 ; [*14BA.0020.0002] # KEY -1F512 ; [*14BB.0020.0002] # LOCK -1F513 ; [*14BC.0020.0002] # OPEN LOCK -1F514 ; [*14BD.0020.0002] # BELL -1F515 ; [*14BE.0020.0002] # BELL WITH CANCELLATION STROKE -1F516 ; [*14BF.0020.0002] # BOOKMARK -1F517 ; [*14C0.0020.0002] # LINK SYMBOL -1F518 ; [*14C1.0020.0002] # RADIO BUTTON -1F519 ; [*14C2.0020.0002] # BACK WITH LEFTWARDS ARROW ABOVE -1F51A ; [*14C3.0020.0002] # END WITH LEFTWARDS ARROW ABOVE -1F51B ; [*14C4.0020.0002] # ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE -1F51C ; [*14C5.0020.0002] # SOON WITH RIGHTWARDS ARROW ABOVE -1F51D ; [*14C6.0020.0002] # TOP WITH UPWARDS ARROW ABOVE -1F51E ; [*14C7.0020.0002] # NO ONE UNDER EIGHTEEN SYMBOL -1F51F ; [*14C8.0020.0002] # KEYCAP TEN -1F520 ; [*14C9.0020.0002] # INPUT SYMBOL FOR LATIN CAPITAL LETTERS -1F521 ; [*14CA.0020.0002] # INPUT SYMBOL FOR LATIN SMALL LETTERS -1F522 ; [*14CB.0020.0002] # INPUT SYMBOL FOR NUMBERS -1F523 ; [*14CC.0020.0002] # INPUT SYMBOL FOR SYMBOLS -1F524 ; [*14CD.0020.0002] # INPUT SYMBOL FOR LATIN LETTERS -1F525 ; [*14CE.0020.0002] # FIRE -1F526 ; [*14CF.0020.0002] # ELECTRIC TORCH -1F527 ; [*14D0.0020.0002] # WRENCH -1F528 ; [*14D1.0020.0002] # HAMMER -1F529 ; [*14D2.0020.0002] # NUT AND BOLT -1F52A ; [*14D3.0020.0002] # HOCHO -1F52B ; [*14D4.0020.0002] # PISTOL -1F52C ; [*14D5.0020.0002] # MICROSCOPE -1F52D ; [*14D6.0020.0002] # TELESCOPE -1F52E ; [*14D7.0020.0002] # CRYSTAL BALL -1F52F ; [*14D8.0020.0002] # SIX POINTED STAR WITH MIDDLE DOT -1F530 ; [*14D9.0020.0002] # JAPANESE SYMBOL FOR BEGINNER -1F531 ; [*14DA.0020.0002] # TRIDENT EMBLEM -1F532 ; [*14DB.0020.0002] # BLACK SQUARE BUTTON -1F533 ; [*14DC.0020.0002] # WHITE SQUARE BUTTON -1F534 ; [*14DD.0020.0002] # LARGE RED CIRCLE -1F535 ; [*14DE.0020.0002] # LARGE BLUE CIRCLE -1F536 ; [*14DF.0020.0002] # LARGE ORANGE DIAMOND -1F537 ; [*14E0.0020.0002] # LARGE BLUE DIAMOND -1F538 ; [*14E1.0020.0002] # SMALL ORANGE DIAMOND -1F539 ; [*14E2.0020.0002] # SMALL BLUE DIAMOND -1F53A ; [*14E3.0020.0002] # UP-POINTING RED TRIANGLE -1F53B ; [*14E4.0020.0002] # DOWN-POINTING RED TRIANGLE -1F53C ; [*14E5.0020.0002] # UP-POINTING SMALL RED TRIANGLE -1F53D ; [*14E6.0020.0002] # DOWN-POINTING SMALL RED TRIANGLE -1F53E ; [*14E7.0020.0002] # LOWER RIGHT SHADOWED WHITE CIRCLE -1F53F ; [*14E8.0020.0002] # UPPER RIGHT SHADOWED WHITE CIRCLE -1F540 ; [*14E9.0020.0002] # CIRCLED CROSS POMMEE -1F541 ; [*14EA.0020.0002] # CROSS POMMEE WITH HALF-CIRCLE BELOW -1F542 ; [*14EB.0020.0002] # CROSS POMMEE -1F543 ; [*14EC.0020.0002] # NOTCHED LEFT SEMICIRCLE WITH THREE DOTS -1F544 ; [*14ED.0020.0002] # NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS -1F545 ; [*14EE.0020.0002] # SYMBOL FOR MARKS CHAPTER -1F546 ; [*14EF.0020.0002] # WHITE LATIN CROSS -1F547 ; [*14F0.0020.0002] # HEAVY LATIN CROSS -1F548 ; [*14F1.0020.0002] # CELTIC CROSS -1F549 ; [*14F2.0020.0002] # OM SYMBOL -1F54A ; [*14F3.0020.0002] # DOVE OF PEACE -1F54B ; [*14F4.0020.0002] # KAABA -1F54C ; [*14F5.0020.0002] # MOSQUE -1F54D ; [*14F6.0020.0002] # SYNAGOGUE -1F54E ; [*14F7.0020.0002] # MENORAH WITH NINE BRANCHES -1F54F ; [*14F8.0020.0002] # BOWL OF HYGIEIA -1F550 ; [*14F9.0020.0002] # CLOCK FACE ONE OCLOCK -1F551 ; [*14FA.0020.0002] # CLOCK FACE TWO OCLOCK -1F552 ; [*14FB.0020.0002] # CLOCK FACE THREE OCLOCK -1F553 ; [*14FC.0020.0002] # CLOCK FACE FOUR OCLOCK -1F554 ; [*14FD.0020.0002] # CLOCK FACE FIVE OCLOCK -1F555 ; [*14FE.0020.0002] # CLOCK FACE SIX OCLOCK -1F556 ; [*14FF.0020.0002] # CLOCK FACE SEVEN OCLOCK -1F557 ; [*1500.0020.0002] # CLOCK FACE EIGHT OCLOCK -1F558 ; [*1501.0020.0002] # CLOCK FACE NINE OCLOCK -1F559 ; [*1502.0020.0002] # CLOCK FACE TEN OCLOCK -1F55A ; [*1503.0020.0002] # CLOCK FACE ELEVEN OCLOCK -1F55B ; [*1504.0020.0002] # CLOCK FACE TWELVE OCLOCK -1F55C ; [*1505.0020.0002] # CLOCK FACE ONE-THIRTY -1F55D ; [*1506.0020.0002] # CLOCK FACE TWO-THIRTY -1F55E ; [*1507.0020.0002] # CLOCK FACE THREE-THIRTY -1F55F ; [*1508.0020.0002] # CLOCK FACE FOUR-THIRTY -1F560 ; [*1509.0020.0002] # CLOCK FACE FIVE-THIRTY -1F561 ; [*150A.0020.0002] # CLOCK FACE SIX-THIRTY -1F562 ; [*150B.0020.0002] # CLOCK FACE SEVEN-THIRTY -1F563 ; [*150C.0020.0002] # CLOCK FACE EIGHT-THIRTY -1F564 ; [*150D.0020.0002] # CLOCK FACE NINE-THIRTY -1F565 ; [*150E.0020.0002] # CLOCK FACE TEN-THIRTY -1F566 ; [*150F.0020.0002] # CLOCK FACE ELEVEN-THIRTY -1F567 ; [*1510.0020.0002] # CLOCK FACE TWELVE-THIRTY -1F568 ; [*1511.0020.0002] # RIGHT SPEAKER -1F569 ; [*1512.0020.0002] # RIGHT SPEAKER WITH ONE SOUND WAVE -1F56A ; [*1513.0020.0002] # RIGHT SPEAKER WITH THREE SOUND WAVES -1F56B ; [*1514.0020.0002] # BULLHORN -1F56C ; [*1515.0020.0002] # BULLHORN WITH SOUND WAVES -1F56D ; [*1516.0020.0002] # RINGING BELL -1F56E ; [*1517.0020.0002] # BOOK -1F56F ; [*1518.0020.0002] # CANDLE -1F570 ; [*1519.0020.0002] # MANTELPIECE CLOCK -1F571 ; [*151A.0020.0002] # BLACK SKULL AND CROSSBONES -1F572 ; [*151B.0020.0002] # NO PIRACY -1F573 ; [*151C.0020.0002] # HOLE -1F574 ; [*151D.0020.0002] # MAN IN BUSINESS SUIT LEVITATING -1F575 ; [*151E.0020.0002] # SLEUTH OR SPY -1F576 ; [*151F.0020.0002] # DARK SUNGLASSES -1F577 ; [*1520.0020.0002] # SPIDER -1F578 ; [*1521.0020.0002] # SPIDER WEB -1F579 ; [*1522.0020.0002] # JOYSTICK -1F57A ; [*1523.0020.0002] # MAN DANCING -1F57B ; [*1524.0020.0002] # LEFT HAND TELEPHONE RECEIVER -1F57C ; [*1525.0020.0002] # TELEPHONE RECEIVER WITH PAGE -1F57D ; [*1526.0020.0002] # RIGHT HAND TELEPHONE RECEIVER -1F57E ; [*1527.0020.0002] # WHITE TOUCHTONE TELEPHONE -1F57F ; [*1528.0020.0002] # BLACK TOUCHTONE TELEPHONE -1F580 ; [*1529.0020.0002] # TELEPHONE ON TOP OF MODEM -1F581 ; [*152A.0020.0002] # CLAMSHELL MOBILE PHONE -1F582 ; [*152B.0020.0002] # BACK OF ENVELOPE -1F583 ; [*152C.0020.0002] # STAMPED ENVELOPE -1F584 ; [*152D.0020.0002] # ENVELOPE WITH LIGHTNING -1F585 ; [*152E.0020.0002] # FLYING ENVELOPE -1F586 ; [*152F.0020.0002] # PEN OVER STAMPED ENVELOPE -1F587 ; [*1530.0020.0002] # LINKED PAPERCLIPS -1F588 ; [*1531.0020.0002] # BLACK PUSHPIN -1F589 ; [*1532.0020.0002] # LOWER LEFT PENCIL -1F58A ; [*1533.0020.0002] # LOWER LEFT BALLPOINT PEN -1F58B ; [*1534.0020.0002] # LOWER LEFT FOUNTAIN PEN -1F58C ; [*1535.0020.0002] # LOWER LEFT PAINTBRUSH -1F58D ; [*1536.0020.0002] # LOWER LEFT CRAYON -1F58E ; [*1537.0020.0002] # LEFT WRITING HAND -1F58F ; [*1538.0020.0002] # TURNED OK HAND SIGN -1F590 ; [*1539.0020.0002] # RAISED HAND WITH FINGERS SPLAYED -1F591 ; [*153A.0020.0002] # REVERSED RAISED HAND WITH FINGERS SPLAYED -1F592 ; [*153B.0020.0002] # REVERSED THUMBS UP SIGN -1F593 ; [*153C.0020.0002] # REVERSED THUMBS DOWN SIGN -1F594 ; [*153D.0020.0002] # REVERSED VICTORY HAND -1F595 ; [*153E.0020.0002] # REVERSED HAND WITH MIDDLE FINGER EXTENDED -1F596 ; [*153F.0020.0002] # RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS -1F597 ; [*1540.0020.0002] # WHITE DOWN POINTING LEFT HAND INDEX -1F598 ; [*1541.0020.0002] # SIDEWAYS WHITE LEFT POINTING INDEX -1F599 ; [*1542.0020.0002] # SIDEWAYS WHITE RIGHT POINTING INDEX -1F59A ; [*1543.0020.0002] # SIDEWAYS BLACK LEFT POINTING INDEX -1F59B ; [*1544.0020.0002] # SIDEWAYS BLACK RIGHT POINTING INDEX -1F59C ; [*1545.0020.0002] # BLACK LEFT POINTING BACKHAND INDEX -1F59D ; [*1546.0020.0002] # BLACK RIGHT POINTING BACKHAND INDEX -1F59E ; [*1547.0020.0002] # SIDEWAYS WHITE UP POINTING INDEX -1F59F ; [*1548.0020.0002] # SIDEWAYS WHITE DOWN POINTING INDEX -1F5A0 ; [*1549.0020.0002] # SIDEWAYS BLACK UP POINTING INDEX -1F5A1 ; [*154A.0020.0002] # SIDEWAYS BLACK DOWN POINTING INDEX -1F5A2 ; [*154B.0020.0002] # BLACK UP POINTING BACKHAND INDEX -1F5A3 ; [*154C.0020.0002] # BLACK DOWN POINTING BACKHAND INDEX -1F5A4 ; [*154D.0020.0002] # BLACK HEART -1F5A5 ; [*154E.0020.0002] # DESKTOP COMPUTER -1F5A6 ; [*154F.0020.0002] # KEYBOARD AND MOUSE -1F5A7 ; [*1550.0020.0002] # THREE NETWORKED COMPUTERS -1F5A8 ; [*1551.0020.0002] # PRINTER -1F5A9 ; [*1552.0020.0002] # POCKET CALCULATOR -1F5AA ; [*1553.0020.0002] # BLACK HARD SHELL FLOPPY DISK -1F5AB ; [*1554.0020.0002] # WHITE HARD SHELL FLOPPY DISK -1F5AC ; [*1555.0020.0002] # SOFT SHELL FLOPPY DISK -1F5AD ; [*1556.0020.0002] # TAPE CARTRIDGE -1F5AE ; [*1557.0020.0002] # WIRED KEYBOARD -1F5AF ; [*1558.0020.0002] # ONE BUTTON MOUSE -1F5B0 ; [*1559.0020.0002] # TWO BUTTON MOUSE -1F5B1 ; [*155A.0020.0002] # THREE BUTTON MOUSE -1F5B2 ; [*155B.0020.0002] # TRACKBALL -1F5B3 ; [*155C.0020.0002] # OLD PERSONAL COMPUTER -1F5B4 ; [*155D.0020.0002] # HARD DISK -1F5B5 ; [*155E.0020.0002] # SCREEN -1F5B6 ; [*155F.0020.0002] # PRINTER ICON -1F5B7 ; [*1560.0020.0002] # FAX ICON -1F5B8 ; [*1561.0020.0002] # OPTICAL DISC ICON -1F5B9 ; [*1562.0020.0002] # DOCUMENT WITH TEXT -1F5BA ; [*1563.0020.0002] # DOCUMENT WITH TEXT AND PICTURE -1F5BB ; [*1564.0020.0002] # DOCUMENT WITH PICTURE -1F5BC ; [*1565.0020.0002] # FRAME WITH PICTURE -1F5BD ; [*1566.0020.0002] # FRAME WITH TILES -1F5BE ; [*1567.0020.0002] # FRAME WITH AN X -1F5BF ; [*1568.0020.0002] # BLACK FOLDER -1F5C0 ; [*1569.0020.0002] # FOLDER -1F5C1 ; [*156A.0020.0002] # OPEN FOLDER -1F5C2 ; [*156B.0020.0002] # CARD INDEX DIVIDERS -1F5C3 ; [*156C.0020.0002] # CARD FILE BOX -1F5C4 ; [*156D.0020.0002] # FILE CABINET -1F5C5 ; [*156E.0020.0002] # EMPTY NOTE -1F5C6 ; [*156F.0020.0002] # EMPTY NOTE PAGE -1F5C7 ; [*1570.0020.0002] # EMPTY NOTE PAD -1F5C8 ; [*1571.0020.0002] # NOTE -1F5C9 ; [*1572.0020.0002] # NOTE PAGE -1F5CA ; [*1573.0020.0002] # NOTE PAD -1F5CB ; [*1574.0020.0002] # EMPTY DOCUMENT -1F5CC ; [*1575.0020.0002] # EMPTY PAGE -1F5CD ; [*1576.0020.0002] # EMPTY PAGES -1F5CE ; [*1577.0020.0002] # DOCUMENT -1F5CF ; [*1578.0020.0002] # PAGE -1F5D0 ; [*1579.0020.0002] # PAGES -1F5D1 ; [*157A.0020.0002] # WASTEBASKET -1F5D2 ; [*157B.0020.0002] # SPIRAL NOTE PAD -1F5D3 ; [*157C.0020.0002] # SPIRAL CALENDAR PAD -1F5D4 ; [*157D.0020.0002] # DESKTOP WINDOW -1F5D5 ; [*157E.0020.0002] # MINIMIZE -1F5D6 ; [*157F.0020.0002] # MAXIMIZE -1F5D7 ; [*1580.0020.0002] # OVERLAP -1F5D8 ; [*1581.0020.0002] # CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS -1F5D9 ; [*1582.0020.0002] # CANCELLATION X -1F5DA ; [*1583.0020.0002] # INCREASE FONT SIZE SYMBOL -1F5DB ; [*1584.0020.0002] # DECREASE FONT SIZE SYMBOL -1F5DC ; [*1585.0020.0002] # COMPRESSION -1F5DD ; [*1586.0020.0002] # OLD KEY -1F5DE ; [*1587.0020.0002] # ROLLED-UP NEWSPAPER -1F5DF ; [*1588.0020.0002] # PAGE WITH CIRCLED TEXT -1F5E0 ; [*1589.0020.0002] # STOCK CHART -1F5E1 ; [*158A.0020.0002] # DAGGER KNIFE -1F5E2 ; [*158B.0020.0002] # LIPS -1F5E3 ; [*158C.0020.0002] # SPEAKING HEAD IN SILHOUETTE -1F5E4 ; [*158D.0020.0002] # THREE RAYS ABOVE -1F5E5 ; [*158E.0020.0002] # THREE RAYS BELOW -1F5E6 ; [*158F.0020.0002] # THREE RAYS LEFT -1F5E7 ; [*1590.0020.0002] # THREE RAYS RIGHT -1F5E8 ; [*1591.0020.0002] # LEFT SPEECH BUBBLE -1F5E9 ; [*1592.0020.0002] # RIGHT SPEECH BUBBLE -1F5EA ; [*1593.0020.0002] # TWO SPEECH BUBBLES -1F5EB ; [*1594.0020.0002] # THREE SPEECH BUBBLES -1F5EC ; [*1595.0020.0002] # LEFT THOUGHT BUBBLE -1F5ED ; [*1596.0020.0002] # RIGHT THOUGHT BUBBLE -1F5EE ; [*1597.0020.0002] # LEFT ANGER BUBBLE -1F5EF ; [*1598.0020.0002] # RIGHT ANGER BUBBLE -1F5F0 ; [*1599.0020.0002] # MOOD BUBBLE -1F5F1 ; [*159A.0020.0002] # LIGHTNING MOOD BUBBLE -1F5F2 ; [*159B.0020.0002] # LIGHTNING MOOD -1F5F3 ; [*159C.0020.0002] # BALLOT BOX WITH BALLOT -1F5F4 ; [*159D.0020.0002] # BALLOT SCRIPT X -1F5F5 ; [*159E.0020.0002] # BALLOT BOX WITH SCRIPT X -1F5F6 ; [*159F.0020.0002] # BALLOT BOLD SCRIPT X -1F5F7 ; [*15A0.0020.0002] # BALLOT BOX WITH BOLD SCRIPT X -1F5F8 ; [*15A1.0020.0002] # LIGHT CHECK MARK -1F5F9 ; [*15A2.0020.0002] # BALLOT BOX WITH BOLD CHECK -1F5FA ; [*15A3.0020.0002] # WORLD MAP -1F5FB ; [*15A4.0020.0002] # MOUNT FUJI -1F5FC ; [*15A5.0020.0002] # TOKYO TOWER -1F5FD ; [*15A6.0020.0002] # STATUE OF LIBERTY -1F5FE ; [*15A7.0020.0002] # SILHOUETTE OF JAPAN -1F5FF ; [*15A8.0020.0002] # MOYAI -1F600 ; [*15FB.0020.0002] # GRINNING FACE -1F601 ; [*15FC.0020.0002] # GRINNING FACE WITH SMILING EYES -1F602 ; [*15FD.0020.0002] # FACE WITH TEARS OF JOY -1F603 ; [*15FE.0020.0002] # SMILING FACE WITH OPEN MOUTH -1F604 ; [*15FF.0020.0002] # SMILING FACE WITH OPEN MOUTH AND SMILING EYES -1F605 ; [*1600.0020.0002] # SMILING FACE WITH OPEN MOUTH AND COLD SWEAT -1F606 ; [*1601.0020.0002] # SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES -1F607 ; [*1602.0020.0002] # SMILING FACE WITH HALO -1F608 ; [*1603.0020.0002] # SMILING FACE WITH HORNS -1F609 ; [*1604.0020.0002] # WINKING FACE -1F60A ; [*1605.0020.0002] # SMILING FACE WITH SMILING EYES -1F60B ; [*1606.0020.0002] # FACE SAVOURING DELICIOUS FOOD -1F60C ; [*1607.0020.0002] # RELIEVED FACE -1F60D ; [*1608.0020.0002] # SMILING FACE WITH HEART-SHAPED EYES -1F60E ; [*1609.0020.0002] # SMILING FACE WITH SUNGLASSES -1F60F ; [*160A.0020.0002] # SMIRKING FACE -1F610 ; [*160B.0020.0002] # NEUTRAL FACE -1F611 ; [*160C.0020.0002] # EXPRESSIONLESS FACE -1F612 ; [*160D.0020.0002] # UNAMUSED FACE -1F613 ; [*160E.0020.0002] # FACE WITH COLD SWEAT -1F614 ; [*160F.0020.0002] # PENSIVE FACE -1F615 ; [*1610.0020.0002] # CONFUSED FACE -1F616 ; [*1611.0020.0002] # CONFOUNDED FACE -1F617 ; [*1612.0020.0002] # KISSING FACE -1F618 ; [*1613.0020.0002] # FACE THROWING A KISS -1F619 ; [*1614.0020.0002] # KISSING FACE WITH SMILING EYES -1F61A ; [*1615.0020.0002] # KISSING FACE WITH CLOSED EYES -1F61B ; [*1616.0020.0002] # FACE WITH STUCK-OUT TONGUE -1F61C ; [*1617.0020.0002] # FACE WITH STUCK-OUT TONGUE AND WINKING EYE -1F61D ; [*1618.0020.0002] # FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES -1F61E ; [*1619.0020.0002] # DISAPPOINTED FACE -1F61F ; [*161A.0020.0002] # WORRIED FACE -1F620 ; [*161B.0020.0002] # ANGRY FACE -1F621 ; [*161C.0020.0002] # POUTING FACE -1F622 ; [*161D.0020.0002] # CRYING FACE -1F623 ; [*161E.0020.0002] # PERSEVERING FACE -1F624 ; [*161F.0020.0002] # FACE WITH LOOK OF TRIUMPH -1F625 ; [*1620.0020.0002] # DISAPPOINTED BUT RELIEVED FACE -1F626 ; [*1621.0020.0002] # FROWNING FACE WITH OPEN MOUTH -1F627 ; [*1622.0020.0002] # ANGUISHED FACE -1F628 ; [*1623.0020.0002] # FEARFUL FACE -1F629 ; [*1624.0020.0002] # WEARY FACE -1F62A ; [*1625.0020.0002] # SLEEPY FACE -1F62B ; [*1626.0020.0002] # TIRED FACE -1F62C ; [*1627.0020.0002] # GRIMACING FACE -1F62D ; [*1628.0020.0002] # LOUDLY CRYING FACE -1F62E ; [*1629.0020.0002] # FACE WITH OPEN MOUTH -1F62F ; [*162A.0020.0002] # HUSHED FACE -1F630 ; [*162B.0020.0002] # FACE WITH OPEN MOUTH AND COLD SWEAT -1F631 ; [*162C.0020.0002] # FACE SCREAMING IN FEAR -1F632 ; [*162D.0020.0002] # ASTONISHED FACE -1F633 ; [*162E.0020.0002] # FLUSHED FACE -1F634 ; [*162F.0020.0002] # SLEEPING FACE -1F635 ; [*1630.0020.0002] # DIZZY FACE -1F636 ; [*1631.0020.0002] # FACE WITHOUT MOUTH -1F637 ; [*1632.0020.0002] # FACE WITH MEDICAL MASK -1F638 ; [*1633.0020.0002] # GRINNING CAT FACE WITH SMILING EYES -1F639 ; [*1634.0020.0002] # CAT FACE WITH TEARS OF JOY -1F63A ; [*1635.0020.0002] # SMILING CAT FACE WITH OPEN MOUTH -1F63B ; [*1636.0020.0002] # SMILING CAT FACE WITH HEART-SHAPED EYES -1F63C ; [*1637.0020.0002] # CAT FACE WITH WRY SMILE -1F63D ; [*1638.0020.0002] # KISSING CAT FACE WITH CLOSED EYES -1F63E ; [*1639.0020.0002] # POUTING CAT FACE -1F63F ; [*163A.0020.0002] # CRYING CAT FACE -1F640 ; [*163B.0020.0002] # WEARY CAT FACE -1F641 ; [*163C.0020.0002] # SLIGHTLY FROWNING FACE -1F642 ; [*163D.0020.0002] # SLIGHTLY SMILING FACE -1F643 ; [*163E.0020.0002] # UPSIDE-DOWN FACE -1F644 ; [*163F.0020.0002] # FACE WITH ROLLING EYES -1F645 ; [*1640.0020.0002] # FACE WITH NO GOOD GESTURE -1F646 ; [*1641.0020.0002] # FACE WITH OK GESTURE -1F647 ; [*1642.0020.0002] # PERSON BOWING DEEPLY -1F648 ; [*1643.0020.0002] # SEE-NO-EVIL MONKEY -1F649 ; [*1644.0020.0002] # HEAR-NO-EVIL MONKEY -1F64A ; [*1645.0020.0002] # SPEAK-NO-EVIL MONKEY -1F64B ; [*1646.0020.0002] # HAPPY PERSON RAISING ONE HAND -1F64C ; [*1647.0020.0002] # PERSON RAISING BOTH HANDS IN CELEBRATION -1F64D ; [*1648.0020.0002] # PERSON FROWNING -1F64E ; [*1649.0020.0002] # PERSON WITH POUTING FACE -1F64F ; [*164A.0020.0002] # PERSON WITH FOLDED HANDS -1F650 ; [*164B.0020.0002] # NORTH WEST POINTING LEAF -1F651 ; [*164C.0020.0002] # SOUTH WEST POINTING LEAF -1F652 ; [*164D.0020.0002] # NORTH EAST POINTING LEAF -1F653 ; [*164E.0020.0002] # SOUTH EAST POINTING LEAF -1F654 ; [*164F.0020.0002] # TURNED NORTH WEST POINTING LEAF -1F655 ; [*1650.0020.0002] # TURNED SOUTH WEST POINTING LEAF -1F656 ; [*1651.0020.0002] # TURNED NORTH EAST POINTING LEAF -1F657 ; [*1652.0020.0002] # TURNED SOUTH EAST POINTING LEAF -1F658 ; [*1653.0020.0002] # NORTH WEST POINTING VINE LEAF -1F659 ; [*1654.0020.0002] # SOUTH WEST POINTING VINE LEAF -1F65A ; [*1655.0020.0002] # NORTH EAST POINTING VINE LEAF -1F65B ; [*1656.0020.0002] # SOUTH EAST POINTING VINE LEAF -1F65C ; [*1657.0020.0002] # HEAVY NORTH WEST POINTING VINE LEAF -1F65D ; [*1658.0020.0002] # HEAVY SOUTH WEST POINTING VINE LEAF -1F65E ; [*1659.0020.0002] # HEAVY NORTH EAST POINTING VINE LEAF -1F65F ; [*165A.0020.0002] # HEAVY SOUTH EAST POINTING VINE LEAF -1F660 ; [*165B.0020.0002] # NORTH WEST POINTING BUD -1F661 ; [*165C.0020.0002] # SOUTH WEST POINTING BUD -1F662 ; [*165D.0020.0002] # NORTH EAST POINTING BUD -1F663 ; [*165E.0020.0002] # SOUTH EAST POINTING BUD -1F664 ; [*165F.0020.0002] # HEAVY NORTH WEST POINTING BUD -1F665 ; [*1660.0020.0002] # HEAVY SOUTH WEST POINTING BUD -1F666 ; [*1661.0020.0002] # HEAVY NORTH EAST POINTING BUD -1F667 ; [*1662.0020.0002] # HEAVY SOUTH EAST POINTING BUD -1F668 ; [*1663.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT -1F669 ; [*1664.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE -1F66A ; [*1665.0020.0002] # SOLID QUILT SQUARE ORNAMENT -1F66B ; [*1666.0020.0002] # SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE -1F66C ; [*1667.0020.0002] # LEFTWARDS ROCKET -1F66D ; [*1668.0020.0002] # UPWARDS ROCKET -1F66E ; [*1669.0020.0002] # RIGHTWARDS ROCKET -1F66F ; [*166A.0020.0002] # DOWNWARDS ROCKET -1F670 ; [*166B.0020.0002] # SCRIPT LIGATURE ET ORNAMENT -1F671 ; [*166C.0020.0002] # HEAVY SCRIPT LIGATURE ET ORNAMENT -1F672 ; [*166D.0020.0002] # LIGATURE OPEN ET ORNAMENT -1F673 ; [*166E.0020.0002] # HEAVY LIGATURE OPEN ET ORNAMENT -1F674 ; [*166F.0020.0002] # HEAVY AMPERSAND ORNAMENT -1F675 ; [*1670.0020.0002] # SWASH AMPERSAND ORNAMENT -1F676 ; [*1671.0020.0002] # SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT -1F677 ; [*1672.0020.0002] # SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -1F678 ; [*1673.0020.0002] # SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT -1F679 ; [*1674.0020.0002] # HEAVY INTERROBANG ORNAMENT -1F67A ; [*1675.0020.0002] # SANS-SERIF INTERROBANG ORNAMENT -1F67B ; [*1676.0020.0002] # HEAVY SANS-SERIF INTERROBANG ORNAMENT -1F67C ; [*1677.0020.0002] # VERY HEAVY SOLIDUS -1F67D ; [*1678.0020.0002] # VERY HEAVY REVERSE SOLIDUS -1F67E ; [*1679.0020.0002] # CHECKER BOARD -1F67F ; [*167A.0020.0002] # REVERSE CHECKER BOARD -1F680 ; [*167B.0020.0002] # ROCKET -1F681 ; [*167C.0020.0002] # HELICOPTER -1F682 ; [*167D.0020.0002] # STEAM LOCOMOTIVE -1F683 ; [*167E.0020.0002] # RAILWAY CAR -1F684 ; [*167F.0020.0002] # HIGH-SPEED TRAIN -1F685 ; [*1680.0020.0002] # HIGH-SPEED TRAIN WITH BULLET NOSE -1F686 ; [*1681.0020.0002] # TRAIN -1F687 ; [*1682.0020.0002] # METRO -1F688 ; [*1683.0020.0002] # LIGHT RAIL -1F689 ; [*1684.0020.0002] # STATION -1F68A ; [*1685.0020.0002] # TRAM -1F68B ; [*1686.0020.0002] # TRAM CAR -1F68C ; [*1687.0020.0002] # BUS -1F68D ; [*1688.0020.0002] # ONCOMING BUS -1F68E ; [*1689.0020.0002] # TROLLEYBUS -1F68F ; [*168A.0020.0002] # BUS STOP -1F690 ; [*168B.0020.0002] # MINIBUS -1F691 ; [*168C.0020.0002] # AMBULANCE -1F692 ; [*168D.0020.0002] # FIRE ENGINE -1F693 ; [*168E.0020.0002] # POLICE CAR -1F694 ; [*168F.0020.0002] # ONCOMING POLICE CAR -1F695 ; [*1690.0020.0002] # TAXI -1F696 ; [*1691.0020.0002] # ONCOMING TAXI -1F697 ; [*1692.0020.0002] # AUTOMOBILE -1F698 ; [*1693.0020.0002] # ONCOMING AUTOMOBILE -1F699 ; [*1694.0020.0002] # RECREATIONAL VEHICLE -1F69A ; [*1695.0020.0002] # DELIVERY TRUCK -1F69B ; [*1696.0020.0002] # ARTICULATED LORRY -1F69C ; [*1697.0020.0002] # TRACTOR -1F69D ; [*1698.0020.0002] # MONORAIL -1F69E ; [*1699.0020.0002] # MOUNTAIN RAILWAY -1F69F ; [*169A.0020.0002] # SUSPENSION RAILWAY -1F6A0 ; [*169B.0020.0002] # MOUNTAIN CABLEWAY -1F6A1 ; [*169C.0020.0002] # AERIAL TRAMWAY -1F6A2 ; [*169D.0020.0002] # SHIP -1F6A3 ; [*169E.0020.0002] # ROWBOAT -1F6A4 ; [*169F.0020.0002] # SPEEDBOAT -1F6A5 ; [*16A0.0020.0002] # HORIZONTAL TRAFFIC LIGHT -1F6A6 ; [*16A1.0020.0002] # VERTICAL TRAFFIC LIGHT -1F6A7 ; [*16A2.0020.0002] # CONSTRUCTION SIGN -1F6A8 ; [*16A3.0020.0002] # POLICE CARS REVOLVING LIGHT -1F6A9 ; [*16A4.0020.0002] # TRIANGULAR FLAG ON POST -1F6AA ; [*16A5.0020.0002] # DOOR -1F6AB ; [*16A6.0020.0002] # NO ENTRY SIGN -1F6AC ; [*16A7.0020.0002] # SMOKING SYMBOL -1F6AD ; [*16A8.0020.0002] # NO SMOKING SYMBOL -1F6AE ; [*16A9.0020.0002] # PUT LITTER IN ITS PLACE SYMBOL -1F6AF ; [*16AA.0020.0002] # DO NOT LITTER SYMBOL -1F6B0 ; [*16AB.0020.0002] # POTABLE WATER SYMBOL -1F6B1 ; [*16AC.0020.0002] # NON-POTABLE WATER SYMBOL -1F6B2 ; [*16AD.0020.0002] # BICYCLE -1F6B3 ; [*16AE.0020.0002] # NO BICYCLES -1F6B4 ; [*16AF.0020.0002] # BICYCLIST -1F6B5 ; [*16B0.0020.0002] # MOUNTAIN BICYCLIST -1F6B6 ; [*16B1.0020.0002] # PEDESTRIAN -1F6B7 ; [*16B2.0020.0002] # NO PEDESTRIANS -1F6B8 ; [*16B3.0020.0002] # CHILDREN CROSSING -1F6B9 ; [*16B4.0020.0002] # MENS SYMBOL -1F6BA ; [*16B5.0020.0002] # WOMENS SYMBOL -1F6BB ; [*16B6.0020.0002] # RESTROOM -1F6BC ; [*16B7.0020.0002] # BABY SYMBOL -1F6BD ; [*16B8.0020.0002] # TOILET -1F6BE ; [*16B9.0020.0002] # WATER CLOSET -1F6BF ; [*16BA.0020.0002] # SHOWER -1F6C0 ; [*16BB.0020.0002] # BATH -1F6C1 ; [*16BC.0020.0002] # BATHTUB -1F6C2 ; [*16BD.0020.0002] # PASSPORT CONTROL -1F6C3 ; [*16BE.0020.0002] # CUSTOMS -1F6C4 ; [*16BF.0020.0002] # BAGGAGE CLAIM -1F6C5 ; [*16C0.0020.0002] # LEFT LUGGAGE -1F6C6 ; [*16C1.0020.0002] # TRIANGLE WITH ROUNDED CORNERS -1F6C7 ; [*16C2.0020.0002] # PROHIBITED SIGN -1F6C8 ; [*16C3.0020.0002] # CIRCLED INFORMATION SOURCE -1F6C9 ; [*16C4.0020.0002] # BOYS SYMBOL -1F6CA ; [*16C5.0020.0002] # GIRLS SYMBOL -1F6CB ; [*16C6.0020.0002] # COUCH AND LAMP -1F6CC ; [*16C7.0020.0002] # SLEEPING ACCOMMODATION -1F6CD ; [*16C8.0020.0002] # SHOPPING BAGS -1F6CE ; [*16C9.0020.0002] # BELLHOP BELL -1F6CF ; [*16CA.0020.0002] # BED -1F6D0 ; [*16CB.0020.0002] # PLACE OF WORSHIP -1F6D1 ; [*16CC.0020.0002] # OCTAGONAL SIGN -1F6D2 ; [*16CD.0020.0002] # SHOPPING TROLLEY -1F6E0 ; [*16CE.0020.0002] # HAMMER AND WRENCH -1F6E1 ; [*16CF.0020.0002] # SHIELD -1F6E2 ; [*16D0.0020.0002] # OIL DRUM -1F6E3 ; [*16D1.0020.0002] # MOTORWAY -1F6E4 ; [*16D2.0020.0002] # RAILWAY TRACK -1F6E5 ; [*16D3.0020.0002] # MOTOR BOAT -1F6E6 ; [*16D4.0020.0002] # UP-POINTING MILITARY AIRPLANE -1F6E7 ; [*16D5.0020.0002] # UP-POINTING AIRPLANE -1F6E8 ; [*16D6.0020.0002] # UP-POINTING SMALL AIRPLANE -1F6E9 ; [*16D7.0020.0002] # SMALL AIRPLANE -1F6EA ; [*16D8.0020.0002] # NORTHEAST-POINTING AIRPLANE -1F6EB ; [*16D9.0020.0002] # AIRPLANE DEPARTURE -1F6EC ; [*16DA.0020.0002] # AIRPLANE ARRIVING -1F6F0 ; [*16DB.0020.0002] # SATELLITE -1F6F1 ; [*16DC.0020.0002] # ONCOMING FIRE ENGINE -1F6F2 ; [*16DD.0020.0002] # DIESEL LOCOMOTIVE -1F6F3 ; [*16DE.0020.0002] # PASSENGER SHIP -1F6F4 ; [*16DF.0020.0002] # SCOOTER -1F6F5 ; [*16E0.0020.0002] # MOTOR SCOOTER -1F6F6 ; [*16E1.0020.0002] # CANOE -1F700 ; [*16E2.0020.0002] # ALCHEMICAL SYMBOL FOR QUINTESSENCE -1F701 ; [*16E3.0020.0002] # ALCHEMICAL SYMBOL FOR AIR -1F702 ; [*16E4.0020.0002] # ALCHEMICAL SYMBOL FOR FIRE -1F703 ; [*16E5.0020.0002] # ALCHEMICAL SYMBOL FOR EARTH -1F704 ; [*16E6.0020.0002] # ALCHEMICAL SYMBOL FOR WATER -1F705 ; [*16E7.0020.0002] # ALCHEMICAL SYMBOL FOR AQUAFORTIS -1F706 ; [*16E8.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA -1F707 ; [*16E9.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA-2 -1F708 ; [*16EA.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE -1F709 ; [*16EB.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE-2 -1F70A ; [*16EC.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR -1F70B ; [*16ED.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-2 -1F70C ; [*16EE.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-3 -1F70D ; [*16EF.0020.0002] # ALCHEMICAL SYMBOL FOR SULFUR -1F70E ; [*16F0.0020.0002] # ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR -1F70F ; [*16F1.0020.0002] # ALCHEMICAL SYMBOL FOR BLACK SULFUR -1F710 ; [*16F2.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE -1F711 ; [*16F3.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 -1F712 ; [*16F4.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 -1F713 ; [*16F5.0020.0002] # ALCHEMICAL SYMBOL FOR CINNABAR -1F714 ; [*16F6.0020.0002] # ALCHEMICAL SYMBOL FOR SALT -1F715 ; [*16F7.0020.0002] # ALCHEMICAL SYMBOL FOR NITRE -1F716 ; [*16F8.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL -1F717 ; [*16F9.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL-2 -1F718 ; [*16FA.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT -1F719 ; [*16FB.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT-2 -1F71A ; [*16FC.0020.0002] # ALCHEMICAL SYMBOL FOR GOLD -1F71B ; [*16FD.0020.0002] # ALCHEMICAL SYMBOL FOR SILVER -1F71C ; [*16FE.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE -1F71D ; [*16FF.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE-2 -1F71E ; [*1700.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF IRON -1F71F ; [*1701.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF IRON -1F720 ; [*1702.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ORE -1F721 ; [*1703.0020.0002] # ALCHEMICAL SYMBOL FOR IRON-COPPER ORE -1F722 ; [*1704.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER -1F723 ; [*1705.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER -1F724 ; [*1706.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 -1F725 ; [*1707.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE -1F726 ; [*1708.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE -1F727 ; [*1709.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER -1F728 ; [*170A.0020.0002] # ALCHEMICAL SYMBOL FOR VERDIGRIS -1F729 ; [*170B.0020.0002] # ALCHEMICAL SYMBOL FOR TIN ORE -1F72A ; [*170C.0020.0002] # ALCHEMICAL SYMBOL FOR LEAD ORE -1F72B ; [*170D.0020.0002] # ALCHEMICAL SYMBOL FOR ANTIMONY ORE -1F72C ; [*170E.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY -1F72D ; [*170F.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY -1F72E ; [*1710.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY -1F72F ; [*1711.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY -1F730 ; [*1712.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY -1F731 ; [*1713.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 -1F732 ; [*1714.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS -1F733 ; [*1715.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-2 -1F734 ; [*1716.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-3 -1F735 ; [*1717.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-4 -1F736 ; [*1718.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI -1F737 ; [*1719.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI-2 -1F738 ; [*171A.0020.0002] # ALCHEMICAL SYMBOL FOR MARCASITE -1F739 ; [*171B.0020.0002] # ALCHEMICAL SYMBOL FOR SAL-AMMONIAC -1F73A ; [*171C.0020.0002] # ALCHEMICAL SYMBOL FOR ARSENIC -1F73B ; [*171D.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR -1F73C ; [*171E.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR-2 -1F73D ; [*171F.0020.0002] # ALCHEMICAL SYMBOL FOR AURIPIGMENT -1F73E ; [*1720.0020.0002] # ALCHEMICAL SYMBOL FOR BISMUTH ORE -1F73F ; [*1721.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR -1F740 ; [*1722.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR-2 -1F741 ; [*1723.0020.0002] # ALCHEMICAL SYMBOL FOR QUICK LIME -1F742 ; [*1724.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX -1F743 ; [*1725.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-2 -1F744 ; [*1726.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-3 -1F745 ; [*1727.0020.0002] # ALCHEMICAL SYMBOL FOR ALUM -1F746 ; [*1728.0020.0002] # ALCHEMICAL SYMBOL FOR OIL -1F747 ; [*1729.0020.0002] # ALCHEMICAL SYMBOL FOR SPIRIT -1F748 ; [*172A.0020.0002] # ALCHEMICAL SYMBOL FOR TINCTURE -1F749 ; [*172B.0020.0002] # ALCHEMICAL SYMBOL FOR GUM -1F74A ; [*172C.0020.0002] # ALCHEMICAL SYMBOL FOR WAX -1F74B ; [*172D.0020.0002] # ALCHEMICAL SYMBOL FOR POWDER -1F74C ; [*172E.0020.0002] # ALCHEMICAL SYMBOL FOR CALX -1F74D ; [*172F.0020.0002] # ALCHEMICAL SYMBOL FOR TUTTY -1F74E ; [*1730.0020.0002] # ALCHEMICAL SYMBOL FOR CAPUT MORTUUM -1F74F ; [*1731.0020.0002] # ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE -1F750 ; [*1732.0020.0002] # ALCHEMICAL SYMBOL FOR CADUCEUS -1F751 ; [*1733.0020.0002] # ALCHEMICAL SYMBOL FOR TRIDENT -1F752 ; [*1734.0020.0002] # ALCHEMICAL SYMBOL FOR STARRED TRIDENT -1F753 ; [*1735.0020.0002] # ALCHEMICAL SYMBOL FOR LODESTONE -1F754 ; [*1736.0020.0002] # ALCHEMICAL SYMBOL FOR SOAP -1F755 ; [*1737.0020.0002] # ALCHEMICAL SYMBOL FOR URINE -1F756 ; [*1738.0020.0002] # ALCHEMICAL SYMBOL FOR HORSE DUNG -1F757 ; [*1739.0020.0002] # ALCHEMICAL SYMBOL FOR ASHES -1F758 ; [*173A.0020.0002] # ALCHEMICAL SYMBOL FOR POT ASHES -1F759 ; [*173B.0020.0002] # ALCHEMICAL SYMBOL FOR BRICK -1F75A ; [*173C.0020.0002] # ALCHEMICAL SYMBOL FOR POWDERED BRICK -1F75B ; [*173D.0020.0002] # ALCHEMICAL SYMBOL FOR AMALGAM -1F75C ; [*173E.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM -1F75D ; [*173F.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 -1F75E ; [*1740.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATION -1F75F ; [*1741.0020.0002] # ALCHEMICAL SYMBOL FOR PRECIPITATE -1F760 ; [*1742.0020.0002] # ALCHEMICAL SYMBOL FOR DISTILL -1F761 ; [*1743.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE -1F762 ; [*1744.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE-2 -1F763 ; [*1745.0020.0002] # ALCHEMICAL SYMBOL FOR PURIFY -1F764 ; [*1746.0020.0002] # ALCHEMICAL SYMBOL FOR PUTREFACTION -1F765 ; [*1747.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE -1F766 ; [*1748.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-2 -1F767 ; [*1749.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-3 -1F768 ; [*174A.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-4 -1F769 ; [*174B.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-5 -1F76A ; [*174C.0020.0002] # ALCHEMICAL SYMBOL FOR ALEMBIC -1F76B ; [*174D.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF MARY -1F76C ; [*174E.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF VAPOURS -1F76D ; [*174F.0020.0002] # ALCHEMICAL SYMBOL FOR RETORT -1F76E ; [*1750.0020.0002] # ALCHEMICAL SYMBOL FOR HOUR -1F76F ; [*1751.0020.0002] # ALCHEMICAL SYMBOL FOR NIGHT -1F770 ; [*1752.0020.0002] # ALCHEMICAL SYMBOL FOR DAY-NIGHT -1F771 ; [*1753.0020.0002] # ALCHEMICAL SYMBOL FOR MONTH -1F772 ; [*1754.0020.0002] # ALCHEMICAL SYMBOL FOR HALF DRAM -1F773 ; [*1755.0020.0002] # ALCHEMICAL SYMBOL FOR HALF OUNCE -1F780 ; [*1756.0020.0002] # BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE -1F781 ; [*1757.0020.0002] # BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE -1F782 ; [*1758.0020.0002] # BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE -1F783 ; [*1759.0020.0002] # BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE -1F784 ; [*175A.0020.0002] # BLACK SLIGHTLY SMALL CIRCLE -1F785 ; [*175B.0020.0002] # MEDIUM BOLD WHITE CIRCLE -1F786 ; [*175C.0020.0002] # BOLD WHITE CIRCLE -1F787 ; [*175D.0020.0002] # HEAVY WHITE CIRCLE -1F788 ; [*175E.0020.0002] # VERY HEAVY WHITE CIRCLE -1F789 ; [*175F.0020.0002] # EXTREMELY HEAVY WHITE CIRCLE -1F78A ; [*1760.0020.0002] # WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE -1F78B ; [*1761.0020.0002] # ROUND TARGET -1F78C ; [*1762.0020.0002] # BLACK TINY SQUARE -1F78D ; [*1763.0020.0002] # BLACK SLIGHTLY SMALL SQUARE -1F78E ; [*1764.0020.0002] # LIGHT WHITE SQUARE -1F78F ; [*1765.0020.0002] # MEDIUM WHITE SQUARE -1F790 ; [*1766.0020.0002] # BOLD WHITE SQUARE -1F791 ; [*1767.0020.0002] # HEAVY WHITE SQUARE -1F792 ; [*1768.0020.0002] # VERY HEAVY WHITE SQUARE -1F793 ; [*1769.0020.0002] # EXTREMELY HEAVY WHITE SQUARE -1F794 ; [*176A.0020.0002] # WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE -1F795 ; [*176B.0020.0002] # WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE -1F796 ; [*176C.0020.0002] # SQUARE TARGET -1F797 ; [*176D.0020.0002] # BLACK TINY DIAMOND -1F798 ; [*176E.0020.0002] # BLACK VERY SMALL DIAMOND -1F799 ; [*176F.0020.0002] # BLACK MEDIUM SMALL DIAMOND -1F79A ; [*1770.0020.0002] # WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND -1F79B ; [*1771.0020.0002] # WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND -1F79C ; [*1772.0020.0002] # DIAMOND TARGET -1F79D ; [*1773.0020.0002] # BLACK TINY LOZENGE -1F79E ; [*1774.0020.0002] # BLACK VERY SMALL LOZENGE -1F79F ; [*1775.0020.0002] # BLACK MEDIUM SMALL LOZENGE -1F7A0 ; [*1776.0020.0002] # WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE -1F7A1 ; [*1777.0020.0002] # THIN GREEK CROSS -1F7A2 ; [*1778.0020.0002] # LIGHT GREEK CROSS -1F7A3 ; [*1779.0020.0002] # MEDIUM GREEK CROSS -1F7A4 ; [*177A.0020.0002] # BOLD GREEK CROSS -1F7A5 ; [*177B.0020.0002] # VERY BOLD GREEK CROSS -1F7A6 ; [*177C.0020.0002] # VERY HEAVY GREEK CROSS -1F7A7 ; [*177D.0020.0002] # EXTREMELY HEAVY GREEK CROSS -1F7A8 ; [*177E.0020.0002] # THIN SALTIRE -1F7A9 ; [*177F.0020.0002] # LIGHT SALTIRE -1F7AA ; [*1780.0020.0002] # MEDIUM SALTIRE -1F7AB ; [*1781.0020.0002] # BOLD SALTIRE -1F7AC ; [*1782.0020.0002] # HEAVY SALTIRE -1F7AD ; [*1783.0020.0002] # VERY HEAVY SALTIRE -1F7AE ; [*1784.0020.0002] # EXTREMELY HEAVY SALTIRE -1F7AF ; [*1785.0020.0002] # LIGHT FIVE SPOKED ASTERISK -1F7B0 ; [*1786.0020.0002] # MEDIUM FIVE SPOKED ASTERISK -1F7B1 ; [*1787.0020.0002] # BOLD FIVE SPOKED ASTERISK -1F7B2 ; [*1788.0020.0002] # HEAVY FIVE SPOKED ASTERISK -1F7B3 ; [*1789.0020.0002] # VERY HEAVY FIVE SPOKED ASTERISK -1F7B4 ; [*178A.0020.0002] # EXTREMELY HEAVY FIVE SPOKED ASTERISK -1F7B5 ; [*178B.0020.0002] # LIGHT SIX SPOKED ASTERISK -1F7B6 ; [*178C.0020.0002] # MEDIUM SIX SPOKED ASTERISK -1F7B7 ; [*178D.0020.0002] # BOLD SIX SPOKED ASTERISK -1F7B8 ; [*178E.0020.0002] # HEAVY SIX SPOKED ASTERISK -1F7B9 ; [*178F.0020.0002] # VERY HEAVY SIX SPOKED ASTERISK -1F7BA ; [*1790.0020.0002] # EXTREMELY HEAVY SIX SPOKED ASTERISK -1F7BB ; [*1791.0020.0002] # LIGHT EIGHT SPOKED ASTERISK -1F7BC ; [*1792.0020.0002] # MEDIUM EIGHT SPOKED ASTERISK -1F7BD ; [*1793.0020.0002] # BOLD EIGHT SPOKED ASTERISK -1F7BE ; [*1794.0020.0002] # HEAVY EIGHT SPOKED ASTERISK -1F7BF ; [*1795.0020.0002] # VERY HEAVY EIGHT SPOKED ASTERISK -1F7C0 ; [*1796.0020.0002] # LIGHT THREE POINTED BLACK STAR -1F7C1 ; [*1797.0020.0002] # MEDIUM THREE POINTED BLACK STAR -1F7C2 ; [*1798.0020.0002] # THREE POINTED BLACK STAR -1F7C3 ; [*1799.0020.0002] # MEDIUM THREE POINTED PINWHEEL STAR -1F7C4 ; [*179A.0020.0002] # LIGHT FOUR POINTED BLACK STAR -1F7C5 ; [*179B.0020.0002] # MEDIUM FOUR POINTED BLACK STAR -1F7C6 ; [*179C.0020.0002] # FOUR POINTED BLACK STAR -1F7C7 ; [*179D.0020.0002] # MEDIUM FOUR POINTED PINWHEEL STAR -1F7C8 ; [*179E.0020.0002] # REVERSE LIGHT FOUR POINTED PINWHEEL STAR -1F7C9 ; [*179F.0020.0002] # LIGHT FIVE POINTED BLACK STAR -1F7CA ; [*17A0.0020.0002] # HEAVY FIVE POINTED BLACK STAR -1F7CB ; [*17A1.0020.0002] # MEDIUM SIX POINTED BLACK STAR -1F7CC ; [*17A2.0020.0002] # HEAVY SIX POINTED BLACK STAR -1F7CD ; [*17A3.0020.0002] # SIX POINTED PINWHEEL STAR -1F7CE ; [*17A4.0020.0002] # MEDIUM EIGHT POINTED BLACK STAR -1F7CF ; [*17A5.0020.0002] # HEAVY EIGHT POINTED BLACK STAR -1F7D0 ; [*17A6.0020.0002] # VERY HEAVY EIGHT POINTED BLACK STAR -1F7D1 ; [*17A7.0020.0002] # HEAVY EIGHT POINTED PINWHEEL STAR -1F7D2 ; [*17A8.0020.0002] # LIGHT TWELVE POINTED BLACK STAR -1F7D3 ; [*17A9.0020.0002] # HEAVY TWELVE POINTED BLACK STAR -1F7D4 ; [*17AA.0020.0002] # HEAVY TWELVE POINTED PINWHEEL STAR -1F800 ; [*17AB.0020.0002] # LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -1F801 ; [*17AC.0020.0002] # UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -1F802 ; [*17AD.0020.0002] # RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -1F803 ; [*17AE.0020.0002] # DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD -1F804 ; [*17AF.0020.0002] # LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -1F805 ; [*17B0.0020.0002] # UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -1F806 ; [*17B1.0020.0002] # RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -1F807 ; [*17B2.0020.0002] # DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD -1F808 ; [*17B3.0020.0002] # LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F809 ; [*17B4.0020.0002] # UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F80A ; [*17B5.0020.0002] # RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F80B ; [*17B6.0020.0002] # DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F810 ; [*17B7.0020.0002] # LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -1F811 ; [*17B8.0020.0002] # UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -1F812 ; [*17B9.0020.0002] # RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -1F813 ; [*17BA.0020.0002] # DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD -1F814 ; [*17BB.0020.0002] # LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F815 ; [*17BC.0020.0002] # UPWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F816 ; [*17BD.0020.0002] # RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F817 ; [*17BE.0020.0002] # DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F818 ; [*17BF.0020.0002] # HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F819 ; [*17C0.0020.0002] # HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F81A ; [*17C1.0020.0002] # HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F81B ; [*17C2.0020.0002] # HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD -1F81C ; [*17C3.0020.0002] # HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -1F81D ; [*17C4.0020.0002] # HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -1F81E ; [*17C5.0020.0002] # HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -1F81F ; [*17C6.0020.0002] # HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD -1F820 ; [*17C7.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -1F821 ; [*17C8.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -1F822 ; [*17C9.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -1F823 ; [*17CA.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT -1F824 ; [*17CB.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -1F825 ; [*17CC.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -1F826 ; [*17CD.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -1F827 ; [*17CE.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT -1F828 ; [*17CF.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -1F829 ; [*17D0.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -1F82A ; [*17D1.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -1F82B ; [*17D2.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT -1F82C ; [*17D3.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -1F82D ; [*17D4.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -1F82E ; [*17D5.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -1F82F ; [*17D6.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT -1F830 ; [*17D7.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -1F831 ; [*17D8.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -1F832 ; [*17D9.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -1F833 ; [*17DA.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT -1F834 ; [*17DB.0020.0002] # LEFTWARDS FINGER-POST ARROW -1F835 ; [*17DC.0020.0002] # UPWARDS FINGER-POST ARROW -1F836 ; [*17DD.0020.0002] # RIGHTWARDS FINGER-POST ARROW -1F837 ; [*17DE.0020.0002] # DOWNWARDS FINGER-POST ARROW -1F838 ; [*17DF.0020.0002] # LEFTWARDS SQUARED ARROW -1F839 ; [*17E0.0020.0002] # UPWARDS SQUARED ARROW -1F83A ; [*17E1.0020.0002] # RIGHTWARDS SQUARED ARROW -1F83B ; [*17E2.0020.0002] # DOWNWARDS SQUARED ARROW -1F83C ; [*17E3.0020.0002] # LEFTWARDS COMPRESSED ARROW -1F83D ; [*17E4.0020.0002] # UPWARDS COMPRESSED ARROW -1F83E ; [*17E5.0020.0002] # RIGHTWARDS COMPRESSED ARROW -1F83F ; [*17E6.0020.0002] # DOWNWARDS COMPRESSED ARROW -1F840 ; [*17E7.0020.0002] # LEFTWARDS HEAVY COMPRESSED ARROW -1F841 ; [*17E8.0020.0002] # UPWARDS HEAVY COMPRESSED ARROW -1F842 ; [*17E9.0020.0002] # RIGHTWARDS HEAVY COMPRESSED ARROW -1F843 ; [*17EA.0020.0002] # DOWNWARDS HEAVY COMPRESSED ARROW -1F844 ; [*17EB.0020.0002] # LEFTWARDS HEAVY ARROW -1F845 ; [*17EC.0020.0002] # UPWARDS HEAVY ARROW -1F846 ; [*17ED.0020.0002] # RIGHTWARDS HEAVY ARROW -1F847 ; [*17EE.0020.0002] # DOWNWARDS HEAVY ARROW -1F850 ; [*17EF.0020.0002] # LEFTWARDS SANS-SERIF ARROW -1F851 ; [*17F0.0020.0002] # UPWARDS SANS-SERIF ARROW -1F852 ; [*17F1.0020.0002] # RIGHTWARDS SANS-SERIF ARROW -1F853 ; [*17F2.0020.0002] # DOWNWARDS SANS-SERIF ARROW -1F854 ; [*17F3.0020.0002] # NORTH WEST SANS-SERIF ARROW -1F855 ; [*17F4.0020.0002] # NORTH EAST SANS-SERIF ARROW -1F856 ; [*17F5.0020.0002] # SOUTH EAST SANS-SERIF ARROW -1F857 ; [*17F6.0020.0002] # SOUTH WEST SANS-SERIF ARROW -1F858 ; [*17F7.0020.0002] # LEFT RIGHT SANS-SERIF ARROW -1F859 ; [*17F8.0020.0002] # UP DOWN SANS-SERIF ARROW -1F860 ; [*17F9.0020.0002] # WIDE-HEADED LEFTWARDS LIGHT BARB ARROW -1F861 ; [*17FA.0020.0002] # WIDE-HEADED UPWARDS LIGHT BARB ARROW -1F862 ; [*17FB.0020.0002] # WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW -1F863 ; [*17FC.0020.0002] # WIDE-HEADED DOWNWARDS LIGHT BARB ARROW -1F864 ; [*17FD.0020.0002] # WIDE-HEADED NORTH WEST LIGHT BARB ARROW -1F865 ; [*17FE.0020.0002] # WIDE-HEADED NORTH EAST LIGHT BARB ARROW -1F866 ; [*17FF.0020.0002] # WIDE-HEADED SOUTH EAST LIGHT BARB ARROW -1F867 ; [*1800.0020.0002] # WIDE-HEADED SOUTH WEST LIGHT BARB ARROW -1F868 ; [*1801.0020.0002] # WIDE-HEADED LEFTWARDS BARB ARROW -1F869 ; [*1802.0020.0002] # WIDE-HEADED UPWARDS BARB ARROW -1F86A ; [*1803.0020.0002] # WIDE-HEADED RIGHTWARDS BARB ARROW -1F86B ; [*1804.0020.0002] # WIDE-HEADED DOWNWARDS BARB ARROW -1F86C ; [*1805.0020.0002] # WIDE-HEADED NORTH WEST BARB ARROW -1F86D ; [*1806.0020.0002] # WIDE-HEADED NORTH EAST BARB ARROW -1F86E ; [*1807.0020.0002] # WIDE-HEADED SOUTH EAST BARB ARROW -1F86F ; [*1808.0020.0002] # WIDE-HEADED SOUTH WEST BARB ARROW -1F870 ; [*1809.0020.0002] # WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW -1F871 ; [*180A.0020.0002] # WIDE-HEADED UPWARDS MEDIUM BARB ARROW -1F872 ; [*180B.0020.0002] # WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW -1F873 ; [*180C.0020.0002] # WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW -1F874 ; [*180D.0020.0002] # WIDE-HEADED NORTH WEST MEDIUM BARB ARROW -1F875 ; [*180E.0020.0002] # WIDE-HEADED NORTH EAST MEDIUM BARB ARROW -1F876 ; [*180F.0020.0002] # WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW -1F877 ; [*1810.0020.0002] # WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW -1F878 ; [*1811.0020.0002] # WIDE-HEADED LEFTWARDS HEAVY BARB ARROW -1F879 ; [*1812.0020.0002] # WIDE-HEADED UPWARDS HEAVY BARB ARROW -1F87A ; [*1813.0020.0002] # WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW -1F87B ; [*1814.0020.0002] # WIDE-HEADED DOWNWARDS HEAVY BARB ARROW -1F87C ; [*1815.0020.0002] # WIDE-HEADED NORTH WEST HEAVY BARB ARROW -1F87D ; [*1816.0020.0002] # WIDE-HEADED NORTH EAST HEAVY BARB ARROW -1F87E ; [*1817.0020.0002] # WIDE-HEADED SOUTH EAST HEAVY BARB ARROW -1F87F ; [*1818.0020.0002] # WIDE-HEADED SOUTH WEST HEAVY BARB ARROW -1F880 ; [*1819.0020.0002] # WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW -1F881 ; [*181A.0020.0002] # WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW -1F882 ; [*181B.0020.0002] # WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW -1F883 ; [*181C.0020.0002] # WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW -1F884 ; [*181D.0020.0002] # WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW -1F885 ; [*181E.0020.0002] # WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW -1F886 ; [*181F.0020.0002] # WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW -1F887 ; [*1820.0020.0002] # WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW -1F890 ; [*1821.0020.0002] # LEFTWARDS TRIANGLE ARROWHEAD -1F891 ; [*1822.0020.0002] # UPWARDS TRIANGLE ARROWHEAD -1F892 ; [*1823.0020.0002] # RIGHTWARDS TRIANGLE ARROWHEAD -1F893 ; [*1824.0020.0002] # DOWNWARDS TRIANGLE ARROWHEAD -1F894 ; [*1825.0020.0002] # LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -1F895 ; [*1826.0020.0002] # UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -1F896 ; [*1827.0020.0002] # RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -1F897 ; [*1828.0020.0002] # DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD -1F898 ; [*1829.0020.0002] # LEFTWARDS ARROW WITH NOTCHED TAIL -1F899 ; [*182A.0020.0002] # UPWARDS ARROW WITH NOTCHED TAIL -1F89A ; [*182B.0020.0002] # RIGHTWARDS ARROW WITH NOTCHED TAIL -1F89B ; [*182C.0020.0002] # DOWNWARDS ARROW WITH NOTCHED TAIL -1F89C ; [*182D.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE -1F89D ; [*182E.0020.0002] # HEAVY ARROW SHAFT WIDTH TWO THIRDS -1F89E ; [*182F.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE HALF -1F89F ; [*1830.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE THIRD -1F8A0 ; [*1831.0020.0002] # LEFTWARDS BOTTOM-SHADED WHITE ARROW -1F8A1 ; [*1832.0020.0002] # RIGHTWARDS BOTTOM SHADED WHITE ARROW -1F8A2 ; [*1833.0020.0002] # LEFTWARDS TOP SHADED WHITE ARROW -1F8A3 ; [*1834.0020.0002] # RIGHTWARDS TOP SHADED WHITE ARROW -1F8A4 ; [*1835.0020.0002] # LEFTWARDS LEFT-SHADED WHITE ARROW -1F8A5 ; [*1836.0020.0002] # RIGHTWARDS RIGHT-SHADED WHITE ARROW -1F8A6 ; [*1837.0020.0002] # LEFTWARDS RIGHT-SHADED WHITE ARROW -1F8A7 ; [*1838.0020.0002] # RIGHTWARDS LEFT-SHADED WHITE ARROW -1F8A8 ; [*1839.0020.0002] # LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW -1F8A9 ; [*183A.0020.0002] # RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW -1F8AA ; [*183B.0020.0002] # LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW -1F8AB ; [*183C.0020.0002] # RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW -1F8AC ; [*183D.0020.0002] # WHITE ARROW SHAFT WIDTH ONE -1F8AD ; [*183E.0020.0002] # WHITE ARROW SHAFT WIDTH TWO THIRDS -1F910 ; [*15A9.0020.0002] # ZIPPER-MOUTH FACE -1F911 ; [*15AA.0020.0002] # MONEY-MOUTH FACE -1F912 ; [*15AB.0020.0002] # FACE WITH THERMOMETER -1F913 ; [*15AC.0020.0002] # NERD FACE -1F914 ; [*15AD.0020.0002] # THINKING FACE -1F915 ; [*15AE.0020.0002] # FACE WITH HEAD-BANDAGE -1F916 ; [*15AF.0020.0002] # ROBOT FACE -1F917 ; [*15B0.0020.0002] # HUGGING FACE -1F918 ; [*15B1.0020.0002] # SIGN OF THE HORNS -1F919 ; [*15B2.0020.0002] # CALL ME HAND -1F91A ; [*15B3.0020.0002] # RAISED BACK OF HAND -1F91B ; [*15B4.0020.0002] # LEFT-FACING FIST -1F91C ; [*15B5.0020.0002] # RIGHT-FACING FIST -1F91D ; [*15B6.0020.0002] # HANDSHAKE -1F91E ; [*15B7.0020.0002] # HAND WITH INDEX AND MIDDLE FINGERS CROSSED -1F920 ; [*15B8.0020.0002] # FACE WITH COWBOY HAT -1F921 ; [*15B9.0020.0002] # CLOWN FACE -1F922 ; [*15BA.0020.0002] # NAUSEATED FACE -1F923 ; [*15BB.0020.0002] # ROLLING ON THE FLOOR LAUGHING -1F924 ; [*15BC.0020.0002] # DROOLING FACE -1F925 ; [*15BD.0020.0002] # LYING FACE -1F926 ; [*15BE.0020.0002] # FACE PALM -1F927 ; [*15BF.0020.0002] # SNEEZING FACE -1F930 ; [*15C0.0020.0002] # PREGNANT WOMAN -1F933 ; [*15C1.0020.0002] # SELFIE -1F934 ; [*15C2.0020.0002] # PRINCE -1F935 ; [*15C3.0020.0002] # MAN IN TUXEDO -1F936 ; [*15C4.0020.0002] # MOTHER CHRISTMAS -1F937 ; [*15C5.0020.0002] # SHRUG -1F938 ; [*15C6.0020.0002] # PERSON DOING CARTWHEEL -1F939 ; [*15C7.0020.0002] # JUGGLING -1F93A ; [*15C8.0020.0002] # FENCER -1F93B ; [*15C9.0020.0002] # MODERN PENTATHLON -1F93C ; [*15CA.0020.0002] # WRESTLERS -1F93D ; [*15CB.0020.0002] # WATER POLO -1F93E ; [*15CC.0020.0002] # HANDBALL -1F940 ; [*15CD.0020.0002] # WILTED FLOWER -1F941 ; [*15CE.0020.0002] # DRUM WITH DRUMSTICKS -1F942 ; [*15CF.0020.0002] # CLINKING GLASSES -1F943 ; [*15D0.0020.0002] # TUMBLER GLASS -1F944 ; [*15D1.0020.0002] # SPOON -1F945 ; [*15D2.0020.0002] # GOAL NET -1F946 ; [*15D3.0020.0002] # RIFLE -1F947 ; [*15D4.0020.0002] # FIRST PLACE MEDAL -1F948 ; [*15D5.0020.0002] # SECOND PLACE MEDAL -1F949 ; [*15D6.0020.0002] # THIRD PLACE MEDAL -1F94A ; [*15D7.0020.0002] # BOXING GLOVE -1F94B ; [*15D8.0020.0002] # MARTIAL ARTS UNIFORM -1F950 ; [*15D9.0020.0002] # CROISSANT -1F951 ; [*15DA.0020.0002] # AVOCADO -1F952 ; [*15DB.0020.0002] # CUCUMBER -1F953 ; [*15DC.0020.0002] # BACON -1F954 ; [*15DD.0020.0002] # POTATO -1F955 ; [*15DE.0020.0002] # CARROT -1F956 ; [*15DF.0020.0002] # BAGUETTE BREAD -1F957 ; [*15E0.0020.0002] # GREEN SALAD -1F958 ; [*15E1.0020.0002] # SHALLOW PAN OF FOOD -1F959 ; [*15E2.0020.0002] # STUFFED FLATBREAD -1F95A ; [*15E3.0020.0002] # EGG -1F95B ; [*15E4.0020.0002] # GLASS OF MILK -1F95C ; [*15E5.0020.0002] # PEANUTS -1F95D ; [*15E6.0020.0002] # KIWIFRUIT -1F95E ; [*15E7.0020.0002] # PANCAKES -1F980 ; [*15E8.0020.0002] # CRAB -1F981 ; [*15E9.0020.0002] # LION FACE -1F982 ; [*15EA.0020.0002] # SCORPION -1F983 ; [*15EB.0020.0002] # TURKEY -1F984 ; [*15EC.0020.0002] # UNICORN FACE -1F985 ; [*15ED.0020.0002] # EAGLE -1F986 ; [*15EE.0020.0002] # DUCK -1F987 ; [*15EF.0020.0002] # BAT -1F988 ; [*15F0.0020.0002] # SHARK -1F989 ; [*15F1.0020.0002] # OWL -1F98A ; [*15F2.0020.0002] # FOX FACE -1F98B ; [*15F3.0020.0002] # BUTTERFLY -1F98C ; [*15F4.0020.0002] # DEER -1F98D ; [*15F5.0020.0002] # GORILLA -1F98E ; [*15F6.0020.0002] # LIZARD -1F98F ; [*15F7.0020.0002] # RHINOCEROS -1F990 ; [*15F8.0020.0002] # SHRIMP -1F991 ; [*15F9.0020.0002] # SQUID -1F9C0 ; [*15FA.0020.0002] # CHEESE WEDGE +1E95E ; [*0266.0020.0002] # ADLAM INITIAL EXCLAMATION MARK +1E95F ; [*0275.0020.0002] # ADLAM INITIAL QUESTION MARK +1EEF0 ; [*0511.0020.0002] # ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL +1EEF1 ; [*0512.0020.0002] # ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000 ; [*11DF.0020.0002] # MAHJONG TILE EAST WIND +1F001 ; [*11E0.0020.0002] # MAHJONG TILE SOUTH WIND +1F002 ; [*11E1.0020.0002] # MAHJONG TILE WEST WIND +1F003 ; [*11E2.0020.0002] # MAHJONG TILE NORTH WIND +1F004 ; [*11E3.0020.0002] # MAHJONG TILE RED DRAGON +1F005 ; [*11E4.0020.0002] # MAHJONG TILE GREEN DRAGON +1F006 ; [*11E5.0020.0002] # MAHJONG TILE WHITE DRAGON +1F007 ; [*11E6.0020.0002] # MAHJONG TILE ONE OF CHARACTERS +1F008 ; [*11E7.0020.0002] # MAHJONG TILE TWO OF CHARACTERS +1F009 ; [*11E8.0020.0002] # MAHJONG TILE THREE OF CHARACTERS +1F00A ; [*11E9.0020.0002] # MAHJONG TILE FOUR OF CHARACTERS +1F00B ; [*11EA.0020.0002] # MAHJONG TILE FIVE OF CHARACTERS +1F00C ; [*11EB.0020.0002] # MAHJONG TILE SIX OF CHARACTERS +1F00D ; [*11EC.0020.0002] # MAHJONG TILE SEVEN OF CHARACTERS +1F00E ; [*11ED.0020.0002] # MAHJONG TILE EIGHT OF CHARACTERS +1F00F ; [*11EE.0020.0002] # MAHJONG TILE NINE OF CHARACTERS +1F010 ; [*11EF.0020.0002] # MAHJONG TILE ONE OF BAMBOOS +1F011 ; [*11F0.0020.0002] # MAHJONG TILE TWO OF BAMBOOS +1F012 ; [*11F1.0020.0002] # MAHJONG TILE THREE OF BAMBOOS +1F013 ; [*11F2.0020.0002] # MAHJONG TILE FOUR OF BAMBOOS +1F014 ; [*11F3.0020.0002] # MAHJONG TILE FIVE OF BAMBOOS +1F015 ; [*11F4.0020.0002] # MAHJONG TILE SIX OF BAMBOOS +1F016 ; [*11F5.0020.0002] # MAHJONG TILE SEVEN OF BAMBOOS +1F017 ; [*11F6.0020.0002] # MAHJONG TILE EIGHT OF BAMBOOS +1F018 ; [*11F7.0020.0002] # MAHJONG TILE NINE OF BAMBOOS +1F019 ; [*11F8.0020.0002] # MAHJONG TILE ONE OF CIRCLES +1F01A ; [*11F9.0020.0002] # MAHJONG TILE TWO OF CIRCLES +1F01B ; [*11FA.0020.0002] # MAHJONG TILE THREE OF CIRCLES +1F01C ; [*11FB.0020.0002] # MAHJONG TILE FOUR OF CIRCLES +1F01D ; [*11FC.0020.0002] # MAHJONG TILE FIVE OF CIRCLES +1F01E ; [*11FD.0020.0002] # MAHJONG TILE SIX OF CIRCLES +1F01F ; [*11FE.0020.0002] # MAHJONG TILE SEVEN OF CIRCLES +1F020 ; [*11FF.0020.0002] # MAHJONG TILE EIGHT OF CIRCLES +1F021 ; [*1200.0020.0002] # MAHJONG TILE NINE OF CIRCLES +1F022 ; [*1201.0020.0002] # MAHJONG TILE PLUM +1F023 ; [*1202.0020.0002] # MAHJONG TILE ORCHID +1F024 ; [*1203.0020.0002] # MAHJONG TILE BAMBOO +1F025 ; [*1204.0020.0002] # MAHJONG TILE CHRYSANTHEMUM +1F026 ; [*1205.0020.0002] # MAHJONG TILE SPRING +1F027 ; [*1206.0020.0002] # MAHJONG TILE SUMMER +1F028 ; [*1207.0020.0002] # MAHJONG TILE AUTUMN +1F029 ; [*1208.0020.0002] # MAHJONG TILE WINTER +1F02A ; [*1209.0020.0002] # MAHJONG TILE JOKER +1F02B ; [*120A.0020.0002] # MAHJONG TILE BACK +1F030 ; [*120B.0020.0002] # DOMINO TILE HORIZONTAL BACK +1F031 ; [*120C.0020.0002] # DOMINO TILE HORIZONTAL-00-00 +1F032 ; [*120D.0020.0002] # DOMINO TILE HORIZONTAL-00-01 +1F033 ; [*120E.0020.0002] # DOMINO TILE HORIZONTAL-00-02 +1F034 ; [*120F.0020.0002] # DOMINO TILE HORIZONTAL-00-03 +1F035 ; [*1210.0020.0002] # DOMINO TILE HORIZONTAL-00-04 +1F036 ; [*1211.0020.0002] # DOMINO TILE HORIZONTAL-00-05 +1F037 ; [*1212.0020.0002] # DOMINO TILE HORIZONTAL-00-06 +1F038 ; [*1213.0020.0002] # DOMINO TILE HORIZONTAL-01-00 +1F039 ; [*1214.0020.0002] # DOMINO TILE HORIZONTAL-01-01 +1F03A ; [*1215.0020.0002] # DOMINO TILE HORIZONTAL-01-02 +1F03B ; [*1216.0020.0002] # DOMINO TILE HORIZONTAL-01-03 +1F03C ; [*1217.0020.0002] # DOMINO TILE HORIZONTAL-01-04 +1F03D ; [*1218.0020.0002] # DOMINO TILE HORIZONTAL-01-05 +1F03E ; [*1219.0020.0002] # DOMINO TILE HORIZONTAL-01-06 +1F03F ; [*121A.0020.0002] # DOMINO TILE HORIZONTAL-02-00 +1F040 ; [*121B.0020.0002] # DOMINO TILE HORIZONTAL-02-01 +1F041 ; [*121C.0020.0002] # DOMINO TILE HORIZONTAL-02-02 +1F042 ; [*121D.0020.0002] # DOMINO TILE HORIZONTAL-02-03 +1F043 ; [*121E.0020.0002] # DOMINO TILE HORIZONTAL-02-04 +1F044 ; [*121F.0020.0002] # DOMINO TILE HORIZONTAL-02-05 +1F045 ; [*1220.0020.0002] # DOMINO TILE HORIZONTAL-02-06 +1F046 ; [*1221.0020.0002] # DOMINO TILE HORIZONTAL-03-00 +1F047 ; [*1222.0020.0002] # DOMINO TILE HORIZONTAL-03-01 +1F048 ; [*1223.0020.0002] # DOMINO TILE HORIZONTAL-03-02 +1F049 ; [*1224.0020.0002] # DOMINO TILE HORIZONTAL-03-03 +1F04A ; [*1225.0020.0002] # DOMINO TILE HORIZONTAL-03-04 +1F04B ; [*1226.0020.0002] # DOMINO TILE HORIZONTAL-03-05 +1F04C ; [*1227.0020.0002] # DOMINO TILE HORIZONTAL-03-06 +1F04D ; [*1228.0020.0002] # DOMINO TILE HORIZONTAL-04-00 +1F04E ; [*1229.0020.0002] # DOMINO TILE HORIZONTAL-04-01 +1F04F ; [*122A.0020.0002] # DOMINO TILE HORIZONTAL-04-02 +1F050 ; [*122B.0020.0002] # DOMINO TILE HORIZONTAL-04-03 +1F051 ; [*122C.0020.0002] # DOMINO TILE HORIZONTAL-04-04 +1F052 ; [*122D.0020.0002] # DOMINO TILE HORIZONTAL-04-05 +1F053 ; [*122E.0020.0002] # DOMINO TILE HORIZONTAL-04-06 +1F054 ; [*122F.0020.0002] # DOMINO TILE HORIZONTAL-05-00 +1F055 ; [*1230.0020.0002] # DOMINO TILE HORIZONTAL-05-01 +1F056 ; [*1231.0020.0002] # DOMINO TILE HORIZONTAL-05-02 +1F057 ; [*1232.0020.0002] # DOMINO TILE HORIZONTAL-05-03 +1F058 ; [*1233.0020.0002] # DOMINO TILE HORIZONTAL-05-04 +1F059 ; [*1234.0020.0002] # DOMINO TILE HORIZONTAL-05-05 +1F05A ; [*1235.0020.0002] # DOMINO TILE HORIZONTAL-05-06 +1F05B ; [*1236.0020.0002] # DOMINO TILE HORIZONTAL-06-00 +1F05C ; [*1237.0020.0002] # DOMINO TILE HORIZONTAL-06-01 +1F05D ; [*1238.0020.0002] # DOMINO TILE HORIZONTAL-06-02 +1F05E ; [*1239.0020.0002] # DOMINO TILE HORIZONTAL-06-03 +1F05F ; [*123A.0020.0002] # DOMINO TILE HORIZONTAL-06-04 +1F060 ; [*123B.0020.0002] # DOMINO TILE HORIZONTAL-06-05 +1F061 ; [*123C.0020.0002] # DOMINO TILE HORIZONTAL-06-06 +1F062 ; [*123D.0020.0002] # DOMINO TILE VERTICAL BACK +1F063 ; [*123E.0020.0002] # DOMINO TILE VERTICAL-00-00 +1F064 ; [*123F.0020.0002] # DOMINO TILE VERTICAL-00-01 +1F065 ; [*1240.0020.0002] # DOMINO TILE VERTICAL-00-02 +1F066 ; [*1241.0020.0002] # DOMINO TILE VERTICAL-00-03 +1F067 ; [*1242.0020.0002] # DOMINO TILE VERTICAL-00-04 +1F068 ; [*1243.0020.0002] # DOMINO TILE VERTICAL-00-05 +1F069 ; [*1244.0020.0002] # DOMINO TILE VERTICAL-00-06 +1F06A ; [*1245.0020.0002] # DOMINO TILE VERTICAL-01-00 +1F06B ; [*1246.0020.0002] # DOMINO TILE VERTICAL-01-01 +1F06C ; [*1247.0020.0002] # DOMINO TILE VERTICAL-01-02 +1F06D ; [*1248.0020.0002] # DOMINO TILE VERTICAL-01-03 +1F06E ; [*1249.0020.0002] # DOMINO TILE VERTICAL-01-04 +1F06F ; [*124A.0020.0002] # DOMINO TILE VERTICAL-01-05 +1F070 ; [*124B.0020.0002] # DOMINO TILE VERTICAL-01-06 +1F071 ; [*124C.0020.0002] # DOMINO TILE VERTICAL-02-00 +1F072 ; [*124D.0020.0002] # DOMINO TILE VERTICAL-02-01 +1F073 ; [*124E.0020.0002] # DOMINO TILE VERTICAL-02-02 +1F074 ; [*124F.0020.0002] # DOMINO TILE VERTICAL-02-03 +1F075 ; [*1250.0020.0002] # DOMINO TILE VERTICAL-02-04 +1F076 ; [*1251.0020.0002] # DOMINO TILE VERTICAL-02-05 +1F077 ; [*1252.0020.0002] # DOMINO TILE VERTICAL-02-06 +1F078 ; [*1253.0020.0002] # DOMINO TILE VERTICAL-03-00 +1F079 ; [*1254.0020.0002] # DOMINO TILE VERTICAL-03-01 +1F07A ; [*1255.0020.0002] # DOMINO TILE VERTICAL-03-02 +1F07B ; [*1256.0020.0002] # DOMINO TILE VERTICAL-03-03 +1F07C ; [*1257.0020.0002] # DOMINO TILE VERTICAL-03-04 +1F07D ; [*1258.0020.0002] # DOMINO TILE VERTICAL-03-05 +1F07E ; [*1259.0020.0002] # DOMINO TILE VERTICAL-03-06 +1F07F ; [*125A.0020.0002] # DOMINO TILE VERTICAL-04-00 +1F080 ; [*125B.0020.0002] # DOMINO TILE VERTICAL-04-01 +1F081 ; [*125C.0020.0002] # DOMINO TILE VERTICAL-04-02 +1F082 ; [*125D.0020.0002] # DOMINO TILE VERTICAL-04-03 +1F083 ; [*125E.0020.0002] # DOMINO TILE VERTICAL-04-04 +1F084 ; [*125F.0020.0002] # DOMINO TILE VERTICAL-04-05 +1F085 ; [*1260.0020.0002] # DOMINO TILE VERTICAL-04-06 +1F086 ; [*1261.0020.0002] # DOMINO TILE VERTICAL-05-00 +1F087 ; [*1262.0020.0002] # DOMINO TILE VERTICAL-05-01 +1F088 ; [*1263.0020.0002] # DOMINO TILE VERTICAL-05-02 +1F089 ; [*1264.0020.0002] # DOMINO TILE VERTICAL-05-03 +1F08A ; [*1265.0020.0002] # DOMINO TILE VERTICAL-05-04 +1F08B ; [*1266.0020.0002] # DOMINO TILE VERTICAL-05-05 +1F08C ; [*1267.0020.0002] # DOMINO TILE VERTICAL-05-06 +1F08D ; [*1268.0020.0002] # DOMINO TILE VERTICAL-06-00 +1F08E ; [*1269.0020.0002] # DOMINO TILE VERTICAL-06-01 +1F08F ; [*126A.0020.0002] # DOMINO TILE VERTICAL-06-02 +1F090 ; [*126B.0020.0002] # DOMINO TILE VERTICAL-06-03 +1F091 ; [*126C.0020.0002] # DOMINO TILE VERTICAL-06-04 +1F092 ; [*126D.0020.0002] # DOMINO TILE VERTICAL-06-05 +1F093 ; [*126E.0020.0002] # DOMINO TILE VERTICAL-06-06 +1F0A0 ; [*126F.0020.0002] # PLAYING CARD BACK +1F0A1 ; [*1270.0020.0002] # PLAYING CARD ACE OF SPADES +1F0A2 ; [*1271.0020.0002] # PLAYING CARD TWO OF SPADES +1F0A3 ; [*1272.0020.0002] # PLAYING CARD THREE OF SPADES +1F0A4 ; [*1273.0020.0002] # PLAYING CARD FOUR OF SPADES +1F0A5 ; [*1274.0020.0002] # PLAYING CARD FIVE OF SPADES +1F0A6 ; [*1275.0020.0002] # PLAYING CARD SIX OF SPADES +1F0A7 ; [*1276.0020.0002] # PLAYING CARD SEVEN OF SPADES +1F0A8 ; [*1277.0020.0002] # PLAYING CARD EIGHT OF SPADES +1F0A9 ; [*1278.0020.0002] # PLAYING CARD NINE OF SPADES +1F0AA ; [*1279.0020.0002] # PLAYING CARD TEN OF SPADES +1F0AB ; [*127A.0020.0002] # PLAYING CARD JACK OF SPADES +1F0AC ; [*127B.0020.0002] # PLAYING CARD KNIGHT OF SPADES +1F0AD ; [*127C.0020.0002] # PLAYING CARD QUEEN OF SPADES +1F0AE ; [*127D.0020.0002] # PLAYING CARD KING OF SPADES +1F0B1 ; [*127E.0020.0002] # PLAYING CARD ACE OF HEARTS +1F0B2 ; [*127F.0020.0002] # PLAYING CARD TWO OF HEARTS +1F0B3 ; [*1280.0020.0002] # PLAYING CARD THREE OF HEARTS +1F0B4 ; [*1281.0020.0002] # PLAYING CARD FOUR OF HEARTS +1F0B5 ; [*1282.0020.0002] # PLAYING CARD FIVE OF HEARTS +1F0B6 ; [*1283.0020.0002] # PLAYING CARD SIX OF HEARTS +1F0B7 ; [*1284.0020.0002] # PLAYING CARD SEVEN OF HEARTS +1F0B8 ; [*1285.0020.0002] # PLAYING CARD EIGHT OF HEARTS +1F0B9 ; [*1286.0020.0002] # PLAYING CARD NINE OF HEARTS +1F0BA ; [*1287.0020.0002] # PLAYING CARD TEN OF HEARTS +1F0BB ; [*1288.0020.0002] # PLAYING CARD JACK OF HEARTS +1F0BC ; [*1289.0020.0002] # PLAYING CARD KNIGHT OF HEARTS +1F0BD ; [*128A.0020.0002] # PLAYING CARD QUEEN OF HEARTS +1F0BE ; [*128B.0020.0002] # PLAYING CARD KING OF HEARTS +1F0BF ; [*128C.0020.0002] # PLAYING CARD RED JOKER +1F0C1 ; [*128D.0020.0002] # PLAYING CARD ACE OF DIAMONDS +1F0C2 ; [*128E.0020.0002] # PLAYING CARD TWO OF DIAMONDS +1F0C3 ; [*128F.0020.0002] # PLAYING CARD THREE OF DIAMONDS +1F0C4 ; [*1290.0020.0002] # PLAYING CARD FOUR OF DIAMONDS +1F0C5 ; [*1291.0020.0002] # PLAYING CARD FIVE OF DIAMONDS +1F0C6 ; [*1292.0020.0002] # PLAYING CARD SIX OF DIAMONDS +1F0C7 ; [*1293.0020.0002] # PLAYING CARD SEVEN OF DIAMONDS +1F0C8 ; [*1294.0020.0002] # PLAYING CARD EIGHT OF DIAMONDS +1F0C9 ; [*1295.0020.0002] # PLAYING CARD NINE OF DIAMONDS +1F0CA ; [*1296.0020.0002] # PLAYING CARD TEN OF DIAMONDS +1F0CB ; [*1297.0020.0002] # PLAYING CARD JACK OF DIAMONDS +1F0CC ; [*1298.0020.0002] # PLAYING CARD KNIGHT OF DIAMONDS +1F0CD ; [*1299.0020.0002] # PLAYING CARD QUEEN OF DIAMONDS +1F0CE ; [*129A.0020.0002] # PLAYING CARD KING OF DIAMONDS +1F0CF ; [*129B.0020.0002] # PLAYING CARD BLACK JOKER +1F0D1 ; [*129C.0020.0002] # PLAYING CARD ACE OF CLUBS +1F0D2 ; [*129D.0020.0002] # PLAYING CARD TWO OF CLUBS +1F0D3 ; [*129E.0020.0002] # PLAYING CARD THREE OF CLUBS +1F0D4 ; [*129F.0020.0002] # PLAYING CARD FOUR OF CLUBS +1F0D5 ; [*12A0.0020.0002] # PLAYING CARD FIVE OF CLUBS +1F0D6 ; [*12A1.0020.0002] # PLAYING CARD SIX OF CLUBS +1F0D7 ; [*12A2.0020.0002] # PLAYING CARD SEVEN OF CLUBS +1F0D8 ; [*12A3.0020.0002] # PLAYING CARD EIGHT OF CLUBS +1F0D9 ; [*12A4.0020.0002] # PLAYING CARD NINE OF CLUBS +1F0DA ; [*12A5.0020.0002] # PLAYING CARD TEN OF CLUBS +1F0DB ; [*12A6.0020.0002] # PLAYING CARD JACK OF CLUBS +1F0DC ; [*12A7.0020.0002] # PLAYING CARD KNIGHT OF CLUBS +1F0DD ; [*12A8.0020.0002] # PLAYING CARD QUEEN OF CLUBS +1F0DE ; [*12A9.0020.0002] # PLAYING CARD KING OF CLUBS +1F0DF ; [*12AA.0020.0002] # PLAYING CARD WHITE JOKER +1F0E0 ; [*12AB.0020.0002] # PLAYING CARD FOOL +1F0E1 ; [*12AC.0020.0002] # PLAYING CARD TRUMP-1 +1F0E2 ; [*12AD.0020.0002] # PLAYING CARD TRUMP-2 +1F0E3 ; [*12AE.0020.0002] # PLAYING CARD TRUMP-3 +1F0E4 ; [*12AF.0020.0002] # PLAYING CARD TRUMP-4 +1F0E5 ; [*12B0.0020.0002] # PLAYING CARD TRUMP-5 +1F0E6 ; [*12B1.0020.0002] # PLAYING CARD TRUMP-6 +1F0E7 ; [*12B2.0020.0002] # PLAYING CARD TRUMP-7 +1F0E8 ; [*12B3.0020.0002] # PLAYING CARD TRUMP-8 +1F0E9 ; [*12B4.0020.0002] # PLAYING CARD TRUMP-9 +1F0EA ; [*12B5.0020.0002] # PLAYING CARD TRUMP-10 +1F0EB ; [*12B6.0020.0002] # PLAYING CARD TRUMP-11 +1F0EC ; [*12B7.0020.0002] # PLAYING CARD TRUMP-12 +1F0ED ; [*12B8.0020.0002] # PLAYING CARD TRUMP-13 +1F0EE ; [*12B9.0020.0002] # PLAYING CARD TRUMP-14 +1F0EF ; [*12BA.0020.0002] # PLAYING CARD TRUMP-15 +1F0F0 ; [*12BB.0020.0002] # PLAYING CARD TRUMP-16 +1F0F1 ; [*12BC.0020.0002] # PLAYING CARD TRUMP-17 +1F0F2 ; [*12BD.0020.0002] # PLAYING CARD TRUMP-18 +1F0F3 ; [*12BE.0020.0002] # PLAYING CARD TRUMP-19 +1F0F4 ; [*12BF.0020.0002] # PLAYING CARD TRUMP-20 +1F0F5 ; [*12C0.0020.0002] # PLAYING CARD TRUMP-21 +1F1E6 ; [*0A1E.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER A +1F1E7 ; [*0A1F.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER B +1F1E8 ; [*0A20.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER C +1F1E9 ; [*0A21.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER D +1F1EA ; [*0A22.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER E +1F1EB ; [*0A23.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER F +1F1EC ; [*0A24.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER G +1F1ED ; [*0A25.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER H +1F1EE ; [*0A26.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER I +1F1EF ; [*0A27.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER J +1F1F0 ; [*0A28.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER K +1F1F1 ; [*0A29.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER L +1F1F2 ; [*0A2A.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER M +1F1F3 ; [*0A2B.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER N +1F1F4 ; [*0A2C.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER O +1F1F5 ; [*0A2D.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER P +1F1F6 ; [*0A2E.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Q +1F1F7 ; [*0A2F.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER R +1F1F8 ; [*0A30.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER S +1F1F9 ; [*0A31.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER T +1F1FA ; [*0A32.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER U +1F1FB ; [*0A33.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER V +1F1FC ; [*0A34.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER W +1F1FD ; [*0A35.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER X +1F1FE ; [*0A36.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Y +1F1FF ; [*0A37.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Z +1F260 ; [*12C1.0020.0002] # ROUNDED SYMBOL FOR FU +1F261 ; [*12C2.0020.0002] # ROUNDED SYMBOL FOR LU +1F262 ; [*12C3.0020.0002] # ROUNDED SYMBOL FOR SHOU +1F263 ; [*12C4.0020.0002] # ROUNDED SYMBOL FOR XI +1F264 ; [*12C5.0020.0002] # ROUNDED SYMBOL FOR SHUANGXI +1F265 ; [*12C6.0020.0002] # ROUNDED SYMBOL FOR CAI +1F300 ; [*12C7.0020.0002] # CYCLONE +1F301 ; [*12C8.0020.0002] # FOGGY +1F302 ; [*12C9.0020.0002] # CLOSED UMBRELLA +1F303 ; [*12CA.0020.0002] # NIGHT WITH STARS +1F304 ; [*12CB.0020.0002] # SUNRISE OVER MOUNTAINS +1F305 ; [*12CC.0020.0002] # SUNRISE +1F306 ; [*12CD.0020.0002] # CITYSCAPE AT DUSK +1F307 ; [*12CE.0020.0002] # SUNSET OVER BUILDINGS +1F308 ; [*12CF.0020.0002] # RAINBOW +1F309 ; [*12D0.0020.0002] # BRIDGE AT NIGHT +1F30A ; [*12D1.0020.0002] # WATER WAVE +1F30B ; [*12D2.0020.0002] # VOLCANO +1F30C ; [*12D3.0020.0002] # MILKY WAY +1F30D ; [*12D4.0020.0002] # EARTH GLOBE EUROPE-AFRICA +1F30E ; [*12D5.0020.0002] # EARTH GLOBE AMERICAS +1F30F ; [*12D6.0020.0002] # EARTH GLOBE ASIA-AUSTRALIA +1F310 ; [*12D7.0020.0002] # GLOBE WITH MERIDIANS +1F311 ; [*12D8.0020.0002] # NEW MOON SYMBOL +1F312 ; [*12D9.0020.0002] # WAXING CRESCENT MOON SYMBOL +1F313 ; [*12DA.0020.0002] # FIRST QUARTER MOON SYMBOL +1F314 ; [*12DB.0020.0002] # WAXING GIBBOUS MOON SYMBOL +1F315 ; [*12DC.0020.0002] # FULL MOON SYMBOL +1F316 ; [*12DD.0020.0002] # WANING GIBBOUS MOON SYMBOL +1F317 ; [*12DE.0020.0002] # LAST QUARTER MOON SYMBOL +1F318 ; [*12DF.0020.0002] # WANING CRESCENT MOON SYMBOL +1F319 ; [*12E0.0020.0002] # CRESCENT MOON +1F31A ; [*12E1.0020.0002] # NEW MOON WITH FACE +1F31B ; [*12E2.0020.0002] # FIRST QUARTER MOON WITH FACE +1F31C ; [*12E3.0020.0002] # LAST QUARTER MOON WITH FACE +1F31D ; [*12E4.0020.0002] # FULL MOON WITH FACE +1F31E ; [*12E5.0020.0002] # SUN WITH FACE +1F31F ; [*12E6.0020.0002] # GLOWING STAR +1F320 ; [*12E7.0020.0002] # SHOOTING STAR +1F321 ; [*12E8.0020.0002] # THERMOMETER +1F322 ; [*12E9.0020.0002] # BLACK DROPLET +1F323 ; [*12EA.0020.0002] # WHITE SUN +1F324 ; [*12EB.0020.0002] # WHITE SUN WITH SMALL CLOUD +1F325 ; [*12EC.0020.0002] # WHITE SUN BEHIND CLOUD +1F326 ; [*12ED.0020.0002] # WHITE SUN BEHIND CLOUD WITH RAIN +1F327 ; [*12EE.0020.0002] # CLOUD WITH RAIN +1F328 ; [*12EF.0020.0002] # CLOUD WITH SNOW +1F329 ; [*12F0.0020.0002] # CLOUD WITH LIGHTNING +1F32A ; [*12F1.0020.0002] # CLOUD WITH TORNADO +1F32B ; [*12F2.0020.0002] # FOG +1F32C ; [*12F3.0020.0002] # WIND BLOWING FACE +1F32D ; [*12F4.0020.0002] # HOT DOG +1F32E ; [*12F5.0020.0002] # TACO +1F32F ; [*12F6.0020.0002] # BURRITO +1F330 ; [*12F7.0020.0002] # CHESTNUT +1F331 ; [*12F8.0020.0002] # SEEDLING +1F332 ; [*12F9.0020.0002] # EVERGREEN TREE +1F333 ; [*12FA.0020.0002] # DECIDUOUS TREE +1F334 ; [*12FB.0020.0002] # PALM TREE +1F335 ; [*12FC.0020.0002] # CACTUS +1F336 ; [*12FD.0020.0002] # HOT PEPPER +1F337 ; [*12FE.0020.0002] # TULIP +1F338 ; [*12FF.0020.0002] # CHERRY BLOSSOM +1F339 ; [*1300.0020.0002] # ROSE +1F33A ; [*1301.0020.0002] # HIBISCUS +1F33B ; [*1302.0020.0002] # SUNFLOWER +1F33C ; [*1303.0020.0002] # BLOSSOM +1F33D ; [*1304.0020.0002] # EAR OF MAIZE +1F33E ; [*1305.0020.0002] # EAR OF RICE +1F33F ; [*1306.0020.0002] # HERB +1F340 ; [*1307.0020.0002] # FOUR LEAF CLOVER +1F341 ; [*1308.0020.0002] # MAPLE LEAF +1F342 ; [*1309.0020.0002] # FALLEN LEAF +1F343 ; [*130A.0020.0002] # LEAF FLUTTERING IN WIND +1F344 ; [*130B.0020.0002] # MUSHROOM +1F345 ; [*130C.0020.0002] # TOMATO +1F346 ; [*130D.0020.0002] # AUBERGINE +1F347 ; [*130E.0020.0002] # GRAPES +1F348 ; [*130F.0020.0002] # MELON +1F349 ; [*1310.0020.0002] # WATERMELON +1F34A ; [*1311.0020.0002] # TANGERINE +1F34B ; [*1312.0020.0002] # LEMON +1F34C ; [*1313.0020.0002] # BANANA +1F34D ; [*1314.0020.0002] # PINEAPPLE +1F34E ; [*1315.0020.0002] # RED APPLE +1F34F ; [*1316.0020.0002] # GREEN APPLE +1F350 ; [*1317.0020.0002] # PEAR +1F351 ; [*1318.0020.0002] # PEACH +1F352 ; [*1319.0020.0002] # CHERRIES +1F353 ; [*131A.0020.0002] # STRAWBERRY +1F354 ; [*131B.0020.0002] # HAMBURGER +1F355 ; [*131C.0020.0002] # SLICE OF PIZZA +1F356 ; [*131D.0020.0002] # MEAT ON BONE +1F357 ; [*131E.0020.0002] # POULTRY LEG +1F358 ; [*131F.0020.0002] # RICE CRACKER +1F359 ; [*1320.0020.0002] # RICE BALL +1F35A ; [*1321.0020.0002] # COOKED RICE +1F35B ; [*1322.0020.0002] # CURRY AND RICE +1F35C ; [*1323.0020.0002] # STEAMING BOWL +1F35D ; [*1324.0020.0002] # SPAGHETTI +1F35E ; [*1325.0020.0002] # BREAD +1F35F ; [*1326.0020.0002] # FRENCH FRIES +1F360 ; [*1327.0020.0002] # ROASTED SWEET POTATO +1F361 ; [*1328.0020.0002] # DANGO +1F362 ; [*1329.0020.0002] # ODEN +1F363 ; [*132A.0020.0002] # SUSHI +1F364 ; [*132B.0020.0002] # FRIED SHRIMP +1F365 ; [*132C.0020.0002] # FISH CAKE WITH SWIRL DESIGN +1F366 ; [*132D.0020.0002] # SOFT ICE CREAM +1F367 ; [*132E.0020.0002] # SHAVED ICE +1F368 ; [*132F.0020.0002] # ICE CREAM +1F369 ; [*1330.0020.0002] # DOUGHNUT +1F36A ; [*1331.0020.0002] # COOKIE +1F36B ; [*1332.0020.0002] # CHOCOLATE BAR +1F36C ; [*1333.0020.0002] # CANDY +1F36D ; [*1334.0020.0002] # LOLLIPOP +1F36E ; [*1335.0020.0002] # CUSTARD +1F36F ; [*1336.0020.0002] # HONEY POT +1F370 ; [*1337.0020.0002] # SHORTCAKE +1F371 ; [*1338.0020.0002] # BENTO BOX +1F372 ; [*1339.0020.0002] # POT OF FOOD +1F373 ; [*133A.0020.0002] # COOKING +1F374 ; [*133B.0020.0002] # FORK AND KNIFE +1F375 ; [*133C.0020.0002] # TEACUP WITHOUT HANDLE +1F376 ; [*133D.0020.0002] # SAKE BOTTLE AND CUP +1F377 ; [*133E.0020.0002] # WINE GLASS +1F378 ; [*133F.0020.0002] # COCKTAIL GLASS +1F379 ; [*1340.0020.0002] # TROPICAL DRINK +1F37A ; [*1341.0020.0002] # BEER MUG +1F37B ; [*1342.0020.0002] # CLINKING BEER MUGS +1F37C ; [*1343.0020.0002] # BABY BOTTLE +1F37D ; [*1344.0020.0002] # FORK AND KNIFE WITH PLATE +1F37E ; [*1345.0020.0002] # BOTTLE WITH POPPING CORK +1F37F ; [*1346.0020.0002] # POPCORN +1F380 ; [*1347.0020.0002] # RIBBON +1F381 ; [*1348.0020.0002] # WRAPPED PRESENT +1F382 ; [*1349.0020.0002] # BIRTHDAY CAKE +1F383 ; [*134A.0020.0002] # JACK-O-LANTERN +1F384 ; [*134B.0020.0002] # CHRISTMAS TREE +1F385 ; [*134C.0020.0002] # FATHER CHRISTMAS +1F386 ; [*134D.0020.0002] # FIREWORKS +1F387 ; [*134E.0020.0002] # FIREWORK SPARKLER +1F388 ; [*134F.0020.0002] # BALLOON +1F389 ; [*1350.0020.0002] # PARTY POPPER +1F38A ; [*1351.0020.0002] # CONFETTI BALL +1F38B ; [*1352.0020.0002] # TANABATA TREE +1F38C ; [*1353.0020.0002] # CROSSED FLAGS +1F38D ; [*1354.0020.0002] # PINE DECORATION +1F38E ; [*1355.0020.0002] # JAPANESE DOLLS +1F38F ; [*1356.0020.0002] # CARP STREAMER +1F390 ; [*1357.0020.0002] # WIND CHIME +1F391 ; [*1358.0020.0002] # MOON VIEWING CEREMONY +1F392 ; [*1359.0020.0002] # SCHOOL SATCHEL +1F393 ; [*135A.0020.0002] # GRADUATION CAP +1F394 ; [*135B.0020.0002] # HEART WITH TIP ON THE LEFT +1F395 ; [*135C.0020.0002] # BOUQUET OF FLOWERS +1F396 ; [*135D.0020.0002] # MILITARY MEDAL +1F397 ; [*135E.0020.0002] # REMINDER RIBBON +1F398 ; [*135F.0020.0002] # MUSICAL KEYBOARD WITH JACKS +1F399 ; [*1360.0020.0002] # STUDIO MICROPHONE +1F39A ; [*1361.0020.0002] # LEVEL SLIDER +1F39B ; [*1362.0020.0002] # CONTROL KNOBS +1F39C ; [*1363.0020.0002] # BEAMED ASCENDING MUSICAL NOTES +1F39D ; [*1364.0020.0002] # BEAMED DESCENDING MUSICAL NOTES +1F39E ; [*1365.0020.0002] # FILM FRAMES +1F39F ; [*1366.0020.0002] # ADMISSION TICKETS +1F3A0 ; [*1367.0020.0002] # CAROUSEL HORSE +1F3A1 ; [*1368.0020.0002] # FERRIS WHEEL +1F3A2 ; [*1369.0020.0002] # ROLLER COASTER +1F3A3 ; [*136A.0020.0002] # FISHING POLE AND FISH +1F3A4 ; [*136B.0020.0002] # MICROPHONE +1F3A5 ; [*136C.0020.0002] # MOVIE CAMERA +1F3A6 ; [*136D.0020.0002] # CINEMA +1F3A7 ; [*136E.0020.0002] # HEADPHONE +1F3A8 ; [*136F.0020.0002] # ARTIST PALETTE +1F3A9 ; [*1370.0020.0002] # TOP HAT +1F3AA ; [*1371.0020.0002] # CIRCUS TENT +1F3AB ; [*1372.0020.0002] # TICKET +1F3AC ; [*1373.0020.0002] # CLAPPER BOARD +1F3AD ; [*1374.0020.0002] # PERFORMING ARTS +1F3AE ; [*1375.0020.0002] # VIDEO GAME +1F3AF ; [*1376.0020.0002] # DIRECT HIT +1F3B0 ; [*1377.0020.0002] # SLOT MACHINE +1F3B1 ; [*1378.0020.0002] # BILLIARDS +1F3B2 ; [*1379.0020.0002] # GAME DIE +1F3B3 ; [*137A.0020.0002] # BOWLING +1F3B4 ; [*137B.0020.0002] # FLOWER PLAYING CARDS +1F3B5 ; [*137C.0020.0002] # MUSICAL NOTE +1F3B6 ; [*137D.0020.0002] # MULTIPLE MUSICAL NOTES +1F3B7 ; [*137E.0020.0002] # SAXOPHONE +1F3B8 ; [*137F.0020.0002] # GUITAR +1F3B9 ; [*1380.0020.0002] # MUSICAL KEYBOARD +1F3BA ; [*1381.0020.0002] # TRUMPET +1F3BB ; [*1382.0020.0002] # VIOLIN +1F3BC ; [*1383.0020.0002] # MUSICAL SCORE +1F3BD ; [*1384.0020.0002] # RUNNING SHIRT WITH SASH +1F3BE ; [*1385.0020.0002] # TENNIS RACQUET AND BALL +1F3BF ; [*1386.0020.0002] # SKI AND SKI BOOT +1F3C0 ; [*1387.0020.0002] # BASKETBALL AND HOOP +1F3C1 ; [*1388.0020.0002] # CHEQUERED FLAG +1F3C2 ; [*1389.0020.0002] # SNOWBOARDER +1F3C3 ; [*138A.0020.0002] # RUNNER +1F3C4 ; [*138B.0020.0002] # SURFER +1F3C5 ; [*138C.0020.0002] # SPORTS MEDAL +1F3C6 ; [*138D.0020.0002] # TROPHY +1F3C7 ; [*138E.0020.0002] # HORSE RACING +1F3C8 ; [*138F.0020.0002] # AMERICAN FOOTBALL +1F3C9 ; [*1390.0020.0002] # RUGBY FOOTBALL +1F3CA ; [*1391.0020.0002] # SWIMMER +1F3CB ; [*1392.0020.0002] # WEIGHT LIFTER +1F3CC ; [*1393.0020.0002] # GOLFER +1F3CD ; [*1394.0020.0002] # RACING MOTORCYCLE +1F3CE ; [*1395.0020.0002] # RACING CAR +1F3CF ; [*1396.0020.0002] # CRICKET BAT AND BALL +1F3D0 ; [*1397.0020.0002] # VOLLEYBALL +1F3D1 ; [*1398.0020.0002] # FIELD HOCKEY STICK AND BALL +1F3D2 ; [*1399.0020.0002] # ICE HOCKEY STICK AND PUCK +1F3D3 ; [*139A.0020.0002] # TABLE TENNIS PADDLE AND BALL +1F3D4 ; [*139B.0020.0002] # SNOW CAPPED MOUNTAIN +1F3D5 ; [*139C.0020.0002] # CAMPING +1F3D6 ; [*139D.0020.0002] # BEACH WITH UMBRELLA +1F3D7 ; [*139E.0020.0002] # BUILDING CONSTRUCTION +1F3D8 ; [*139F.0020.0002] # HOUSE BUILDINGS +1F3D9 ; [*13A0.0020.0002] # CITYSCAPE +1F3DA ; [*13A1.0020.0002] # DERELICT HOUSE BUILDING +1F3DB ; [*13A2.0020.0002] # CLASSICAL BUILDING +1F3DC ; [*13A3.0020.0002] # DESERT +1F3DD ; [*13A4.0020.0002] # DESERT ISLAND +1F3DE ; [*13A5.0020.0002] # NATIONAL PARK +1F3DF ; [*13A6.0020.0002] # STADIUM +1F3E0 ; [*13A7.0020.0002] # HOUSE BUILDING +1F3E1 ; [*13A8.0020.0002] # HOUSE WITH GARDEN +1F3E2 ; [*13A9.0020.0002] # OFFICE BUILDING +1F3E3 ; [*13AA.0020.0002] # JAPANESE POST OFFICE +1F3E4 ; [*13AB.0020.0002] # EUROPEAN POST OFFICE +1F3E5 ; [*13AC.0020.0002] # HOSPITAL +1F3E6 ; [*13AD.0020.0002] # BANK +1F3E7 ; [*13AE.0020.0002] # AUTOMATED TELLER MACHINE +1F3E8 ; [*13AF.0020.0002] # HOTEL +1F3E9 ; [*13B0.0020.0002] # LOVE HOTEL +1F3EA ; [*13B1.0020.0002] # CONVENIENCE STORE +1F3EB ; [*13B2.0020.0002] # SCHOOL +1F3EC ; [*13B3.0020.0002] # DEPARTMENT STORE +1F3ED ; [*13B4.0020.0002] # FACTORY +1F3EE ; [*13B5.0020.0002] # IZAKAYA LANTERN +1F3EF ; [*13B6.0020.0002] # JAPANESE CASTLE +1F3F0 ; [*13B7.0020.0002] # EUROPEAN CASTLE +1F3F1 ; [*13B8.0020.0002] # WHITE PENNANT +1F3F2 ; [*13B9.0020.0002] # BLACK PENNANT +1F3F3 ; [*13BA.0020.0002] # WAVING WHITE FLAG +1F3F4 ; [*13BB.0020.0002] # WAVING BLACK FLAG +1F3F5 ; [*13BC.0020.0002] # ROSETTE +1F3F6 ; [*13BD.0020.0002] # BLACK ROSETTE +1F3F7 ; [*13BE.0020.0002] # LABEL +1F3F8 ; [*13BF.0020.0002] # BADMINTON RACQUET AND SHUTTLECOCK +1F3F9 ; [*13C0.0020.0002] # BOW AND ARROW +1F3FA ; [*13C1.0020.0002] # AMPHORA +1F3FB ; [*13C2.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-1-2 +1F3FC ; [*13C3.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-3 +1F3FD ; [*13C4.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-4 +1F3FE ; [*13C5.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-5 +1F3FF ; [*13C6.0020.0002] # EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400 ; [*13C7.0020.0002] # RAT +1F401 ; [*13C8.0020.0002] # MOUSE +1F402 ; [*13C9.0020.0002] # OX +1F403 ; [*13CA.0020.0002] # WATER BUFFALO +1F404 ; [*13CB.0020.0002] # COW +1F405 ; [*13CC.0020.0002] # TIGER +1F406 ; [*13CD.0020.0002] # LEOPARD +1F407 ; [*13CE.0020.0002] # RABBIT +1F408 ; [*13CF.0020.0002] # CAT +1F409 ; [*13D0.0020.0002] # DRAGON +1F40A ; [*13D1.0020.0002] # CROCODILE +1F40B ; [*13D2.0020.0002] # WHALE +1F40C ; [*13D3.0020.0002] # SNAIL +1F40D ; [*13D4.0020.0002] # SNAKE +1F40E ; [*13D5.0020.0002] # HORSE +1F40F ; [*13D6.0020.0002] # RAM +1F410 ; [*13D7.0020.0002] # GOAT +1F411 ; [*13D8.0020.0002] # SHEEP +1F412 ; [*13D9.0020.0002] # MONKEY +1F413 ; [*13DA.0020.0002] # ROOSTER +1F414 ; [*13DB.0020.0002] # CHICKEN +1F415 ; [*13DC.0020.0002] # DOG +1F416 ; [*13DD.0020.0002] # PIG +1F417 ; [*13DE.0020.0002] # BOAR +1F418 ; [*13DF.0020.0002] # ELEPHANT +1F419 ; [*13E0.0020.0002] # OCTOPUS +1F41A ; [*13E1.0020.0002] # SPIRAL SHELL +1F41B ; [*13E2.0020.0002] # BUG +1F41C ; [*13E3.0020.0002] # ANT +1F41D ; [*13E4.0020.0002] # HONEYBEE +1F41E ; [*13E5.0020.0002] # LADY BEETLE +1F41F ; [*13E6.0020.0002] # FISH +1F420 ; [*13E7.0020.0002] # TROPICAL FISH +1F421 ; [*13E8.0020.0002] # BLOWFISH +1F422 ; [*13E9.0020.0002] # TURTLE +1F423 ; [*13EA.0020.0002] # HATCHING CHICK +1F424 ; [*13EB.0020.0002] # BABY CHICK +1F425 ; [*13EC.0020.0002] # FRONT-FACING BABY CHICK +1F426 ; [*13ED.0020.0002] # BIRD +1F427 ; [*13EE.0020.0002] # PENGUIN +1F428 ; [*13EF.0020.0002] # KOALA +1F429 ; [*13F0.0020.0002] # POODLE +1F42A ; [*13F1.0020.0002] # DROMEDARY CAMEL +1F42B ; [*13F2.0020.0002] # BACTRIAN CAMEL +1F42C ; [*13F3.0020.0002] # DOLPHIN +1F42D ; [*13F4.0020.0002] # MOUSE FACE +1F42E ; [*13F5.0020.0002] # COW FACE +1F42F ; [*13F6.0020.0002] # TIGER FACE +1F430 ; [*13F7.0020.0002] # RABBIT FACE +1F431 ; [*13F8.0020.0002] # CAT FACE +1F432 ; [*13F9.0020.0002] # DRAGON FACE +1F433 ; [*13FA.0020.0002] # SPOUTING WHALE +1F434 ; [*13FB.0020.0002] # HORSE FACE +1F435 ; [*13FC.0020.0002] # MONKEY FACE +1F436 ; [*13FD.0020.0002] # DOG FACE +1F437 ; [*13FE.0020.0002] # PIG FACE +1F438 ; [*13FF.0020.0002] # FROG FACE +1F439 ; [*1400.0020.0002] # HAMSTER FACE +1F43A ; [*1401.0020.0002] # WOLF FACE +1F43B ; [*1402.0020.0002] # BEAR FACE +1F43C ; [*1403.0020.0002] # PANDA FACE +1F43D ; [*1404.0020.0002] # PIG NOSE +1F43E ; [*1405.0020.0002] # PAW PRINTS +1F43F ; [*1406.0020.0002] # CHIPMUNK +1F440 ; [*1407.0020.0002] # EYES +1F441 ; [*1408.0020.0002] # EYE +1F442 ; [*1409.0020.0002] # EAR +1F443 ; [*140A.0020.0002] # NOSE +1F444 ; [*140B.0020.0002] # MOUTH +1F445 ; [*140C.0020.0002] # TONGUE +1F446 ; [*140D.0020.0002] # WHITE UP POINTING BACKHAND INDEX +1F447 ; [*140E.0020.0002] # WHITE DOWN POINTING BACKHAND INDEX +1F448 ; [*140F.0020.0002] # WHITE LEFT POINTING BACKHAND INDEX +1F449 ; [*1410.0020.0002] # WHITE RIGHT POINTING BACKHAND INDEX +1F44A ; [*1411.0020.0002] # FISTED HAND SIGN +1F44B ; [*1412.0020.0002] # WAVING HAND SIGN +1F44C ; [*1413.0020.0002] # OK HAND SIGN +1F44D ; [*1414.0020.0002] # THUMBS UP SIGN +1F44E ; [*1415.0020.0002] # THUMBS DOWN SIGN +1F44F ; [*1416.0020.0002] # CLAPPING HANDS SIGN +1F450 ; [*1417.0020.0002] # OPEN HANDS SIGN +1F451 ; [*1418.0020.0002] # CROWN +1F452 ; [*1419.0020.0002] # WOMANS HAT +1F453 ; [*141A.0020.0002] # EYEGLASSES +1F454 ; [*141B.0020.0002] # NECKTIE +1F455 ; [*141C.0020.0002] # T-SHIRT +1F456 ; [*141D.0020.0002] # JEANS +1F457 ; [*141E.0020.0002] # DRESS +1F458 ; [*141F.0020.0002] # KIMONO +1F459 ; [*1420.0020.0002] # BIKINI +1F45A ; [*1421.0020.0002] # WOMANS CLOTHES +1F45B ; [*1422.0020.0002] # PURSE +1F45C ; [*1423.0020.0002] # HANDBAG +1F45D ; [*1424.0020.0002] # POUCH +1F45E ; [*1425.0020.0002] # MANS SHOE +1F45F ; [*1426.0020.0002] # ATHLETIC SHOE +1F460 ; [*1427.0020.0002] # HIGH-HEELED SHOE +1F461 ; [*1428.0020.0002] # WOMANS SANDAL +1F462 ; [*1429.0020.0002] # WOMANS BOOTS +1F463 ; [*142A.0020.0002] # FOOTPRINTS +1F464 ; [*142B.0020.0002] # BUST IN SILHOUETTE +1F465 ; [*142C.0020.0002] # BUSTS IN SILHOUETTE +1F466 ; [*142D.0020.0002] # BOY +1F467 ; [*142E.0020.0002] # GIRL +1F468 ; [*142F.0020.0002] # MAN +1F469 ; [*1430.0020.0002] # WOMAN +1F46A ; [*1431.0020.0002] # FAMILY +1F46B ; [*1432.0020.0002] # MAN AND WOMAN HOLDING HANDS +1F46C ; [*1433.0020.0002] # TWO MEN HOLDING HANDS +1F46D ; [*1434.0020.0002] # TWO WOMEN HOLDING HANDS +1F46E ; [*1435.0020.0002] # POLICE OFFICER +1F46F ; [*1436.0020.0002] # WOMAN WITH BUNNY EARS +1F470 ; [*1437.0020.0002] # BRIDE WITH VEIL +1F471 ; [*1438.0020.0002] # PERSON WITH BLOND HAIR +1F472 ; [*1439.0020.0002] # MAN WITH GUA PI MAO +1F473 ; [*143A.0020.0002] # MAN WITH TURBAN +1F474 ; [*143B.0020.0002] # OLDER MAN +1F475 ; [*143C.0020.0002] # OLDER WOMAN +1F476 ; [*143D.0020.0002] # BABY +1F477 ; [*143E.0020.0002] # CONSTRUCTION WORKER +1F478 ; [*143F.0020.0002] # PRINCESS +1F479 ; [*1440.0020.0002] # JAPANESE OGRE +1F47A ; [*1441.0020.0002] # JAPANESE GOBLIN +1F47B ; [*1442.0020.0002] # GHOST +1F47C ; [*1443.0020.0002] # BABY ANGEL +1F47D ; [*1444.0020.0002] # EXTRATERRESTRIAL ALIEN +1F47E ; [*1445.0020.0002] # ALIEN MONSTER +1F47F ; [*1446.0020.0002] # IMP +1F480 ; [*1447.0020.0002] # SKULL +1F481 ; [*1448.0020.0002] # INFORMATION DESK PERSON +1F482 ; [*1449.0020.0002] # GUARDSMAN +1F483 ; [*144A.0020.0002] # DANCER +1F484 ; [*144B.0020.0002] # LIPSTICK +1F485 ; [*144C.0020.0002] # NAIL POLISH +1F486 ; [*144D.0020.0002] # FACE MASSAGE +1F487 ; [*144E.0020.0002] # HAIRCUT +1F488 ; [*144F.0020.0002] # BARBER POLE +1F489 ; [*1450.0020.0002] # SYRINGE +1F48A ; [*1451.0020.0002] # PILL +1F48B ; [*1452.0020.0002] # KISS MARK +1F48C ; [*1453.0020.0002] # LOVE LETTER +1F48D ; [*1454.0020.0002] # RING +1F48E ; [*1455.0020.0002] # GEM STONE +1F48F ; [*1456.0020.0002] # KISS +1F490 ; [*1457.0020.0002] # BOUQUET +1F491 ; [*1458.0020.0002] # COUPLE WITH HEART +1F492 ; [*1459.0020.0002] # WEDDING +1F493 ; [*145A.0020.0002] # BEATING HEART +1F494 ; [*145B.0020.0002] # BROKEN HEART +1F495 ; [*145C.0020.0002] # TWO HEARTS +1F496 ; [*145D.0020.0002] # SPARKLING HEART +1F497 ; [*145E.0020.0002] # GROWING HEART +1F498 ; [*145F.0020.0002] # HEART WITH ARROW +1F499 ; [*1460.0020.0002] # BLUE HEART +1F49A ; [*1461.0020.0002] # GREEN HEART +1F49B ; [*1462.0020.0002] # YELLOW HEART +1F49C ; [*1463.0020.0002] # PURPLE HEART +1F49D ; [*1464.0020.0002] # HEART WITH RIBBON +1F49E ; [*1465.0020.0002] # REVOLVING HEARTS +1F49F ; [*1466.0020.0002] # HEART DECORATION +1F4A0 ; [*1467.0020.0002] # DIAMOND SHAPE WITH A DOT INSIDE +1F4A1 ; [*1468.0020.0002] # ELECTRIC LIGHT BULB +1F4A2 ; [*1469.0020.0002] # ANGER SYMBOL +1F4A3 ; [*146A.0020.0002] # BOMB +1F4A4 ; [*146B.0020.0002] # SLEEPING SYMBOL +1F4A5 ; [*146C.0020.0002] # COLLISION SYMBOL +1F4A6 ; [*146D.0020.0002] # SPLASHING SWEAT SYMBOL +1F4A7 ; [*146E.0020.0002] # DROPLET +1F4A8 ; [*146F.0020.0002] # DASH SYMBOL +1F4A9 ; [*1470.0020.0002] # PILE OF POO +1F4AA ; [*1471.0020.0002] # FLEXED BICEPS +1F4AB ; [*1472.0020.0002] # DIZZY SYMBOL +1F4AC ; [*1473.0020.0002] # SPEECH BALLOON +1F4AD ; [*1474.0020.0002] # THOUGHT BALLOON +1F4AE ; [*1475.0020.0002] # WHITE FLOWER +1F4AF ; [*1476.0020.0002] # HUNDRED POINTS SYMBOL +1F4B0 ; [*1477.0020.0002] # MONEY BAG +1F4B1 ; [*1478.0020.0002] # CURRENCY EXCHANGE +1F4B2 ; [*1479.0020.0002] # HEAVY DOLLAR SIGN +1F4B3 ; [*147A.0020.0002] # CREDIT CARD +1F4B4 ; [*147B.0020.0002] # BANKNOTE WITH YEN SIGN +1F4B5 ; [*147C.0020.0002] # BANKNOTE WITH DOLLAR SIGN +1F4B6 ; [*147D.0020.0002] # BANKNOTE WITH EURO SIGN +1F4B7 ; [*147E.0020.0002] # BANKNOTE WITH POUND SIGN +1F4B8 ; [*147F.0020.0002] # MONEY WITH WINGS +1F4B9 ; [*1480.0020.0002] # CHART WITH UPWARDS TREND AND YEN SIGN +1F4BA ; [*1481.0020.0002] # SEAT +1F4BB ; [*1482.0020.0002] # PERSONAL COMPUTER +1F4BC ; [*1483.0020.0002] # BRIEFCASE +1F4BD ; [*1484.0020.0002] # MINIDISC +1F4BE ; [*1485.0020.0002] # FLOPPY DISK +1F4BF ; [*1486.0020.0002] # OPTICAL DISC +1F4C0 ; [*1487.0020.0002] # DVD +1F4C1 ; [*1488.0020.0002] # FILE FOLDER +1F4C2 ; [*1489.0020.0002] # OPEN FILE FOLDER +1F4C3 ; [*148A.0020.0002] # PAGE WITH CURL +1F4C4 ; [*148B.0020.0002] # PAGE FACING UP +1F4C5 ; [*148C.0020.0002] # CALENDAR +1F4C6 ; [*148D.0020.0002] # TEAR-OFF CALENDAR +1F4C7 ; [*148E.0020.0002] # CARD INDEX +1F4C8 ; [*148F.0020.0002] # CHART WITH UPWARDS TREND +1F4C9 ; [*1490.0020.0002] # CHART WITH DOWNWARDS TREND +1F4CA ; [*1491.0020.0002] # BAR CHART +1F4CB ; [*1492.0020.0002] # CLIPBOARD +1F4CC ; [*1493.0020.0002] # PUSHPIN +1F4CD ; [*1494.0020.0002] # ROUND PUSHPIN +1F4CE ; [*1495.0020.0002] # PAPERCLIP +1F4CF ; [*1496.0020.0002] # STRAIGHT RULER +1F4D0 ; [*1497.0020.0002] # TRIANGULAR RULER +1F4D1 ; [*1498.0020.0002] # BOOKMARK TABS +1F4D2 ; [*1499.0020.0002] # LEDGER +1F4D3 ; [*149A.0020.0002] # NOTEBOOK +1F4D4 ; [*149B.0020.0002] # NOTEBOOK WITH DECORATIVE COVER +1F4D5 ; [*149C.0020.0002] # CLOSED BOOK +1F4D6 ; [*149D.0020.0002] # OPEN BOOK +1F4D7 ; [*149E.0020.0002] # GREEN BOOK +1F4D8 ; [*149F.0020.0002] # BLUE BOOK +1F4D9 ; [*14A0.0020.0002] # ORANGE BOOK +1F4DA ; [*14A1.0020.0002] # BOOKS +1F4DB ; [*14A2.0020.0002] # NAME BADGE +1F4DC ; [*14A3.0020.0002] # SCROLL +1F4DD ; [*14A4.0020.0002] # MEMO +1F4DE ; [*14A5.0020.0002] # TELEPHONE RECEIVER +1F4DF ; [*14A6.0020.0002] # PAGER +1F4E0 ; [*14A7.0020.0002] # FAX MACHINE +1F4E1 ; [*14A8.0020.0002] # SATELLITE ANTENNA +1F4E2 ; [*14A9.0020.0002] # PUBLIC ADDRESS LOUDSPEAKER +1F4E3 ; [*14AA.0020.0002] # CHEERING MEGAPHONE +1F4E4 ; [*14AB.0020.0002] # OUTBOX TRAY +1F4E5 ; [*14AC.0020.0002] # INBOX TRAY +1F4E6 ; [*14AD.0020.0002] # PACKAGE +1F4E7 ; [*14AE.0020.0002] # E-MAIL SYMBOL +1F4E8 ; [*14AF.0020.0002] # INCOMING ENVELOPE +1F4E9 ; [*14B0.0020.0002] # ENVELOPE WITH DOWNWARDS ARROW ABOVE +1F4EA ; [*14B1.0020.0002] # CLOSED MAILBOX WITH LOWERED FLAG +1F4EB ; [*14B2.0020.0002] # CLOSED MAILBOX WITH RAISED FLAG +1F4EC ; [*14B3.0020.0002] # OPEN MAILBOX WITH RAISED FLAG +1F4ED ; [*14B4.0020.0002] # OPEN MAILBOX WITH LOWERED FLAG +1F4EE ; [*14B5.0020.0002] # POSTBOX +1F4EF ; [*14B6.0020.0002] # POSTAL HORN +1F4F0 ; [*14B7.0020.0002] # NEWSPAPER +1F4F1 ; [*14B8.0020.0002] # MOBILE PHONE +1F4F2 ; [*14B9.0020.0002] # MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT +1F4F3 ; [*14BA.0020.0002] # VIBRATION MODE +1F4F4 ; [*14BB.0020.0002] # MOBILE PHONE OFF +1F4F5 ; [*14BC.0020.0002] # NO MOBILE PHONES +1F4F6 ; [*14BD.0020.0002] # ANTENNA WITH BARS +1F4F7 ; [*14BE.0020.0002] # CAMERA +1F4F8 ; [*14BF.0020.0002] # CAMERA WITH FLASH +1F4F9 ; [*14C0.0020.0002] # VIDEO CAMERA +1F4FA ; [*14C1.0020.0002] # TELEVISION +1F4FB ; [*14C2.0020.0002] # RADIO +1F4FC ; [*14C3.0020.0002] # VIDEOCASSETTE +1F4FD ; [*14C4.0020.0002] # FILM PROJECTOR +1F4FE ; [*14C5.0020.0002] # PORTABLE STEREO +1F4FF ; [*14C6.0020.0002] # PRAYER BEADS +1F500 ; [*14C7.0020.0002] # TWISTED RIGHTWARDS ARROWS +1F501 ; [*14C8.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS +1F502 ; [*14C9.0020.0002] # CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY +1F503 ; [*14CA.0020.0002] # CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS +1F504 ; [*14CB.0020.0002] # ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS +1F505 ; [*14CC.0020.0002] # LOW BRIGHTNESS SYMBOL +1F506 ; [*14CD.0020.0002] # HIGH BRIGHTNESS SYMBOL +1F507 ; [*14CE.0020.0002] # SPEAKER WITH CANCELLATION STROKE +1F508 ; [*14CF.0020.0002] # SPEAKER +1F509 ; [*14D0.0020.0002] # SPEAKER WITH ONE SOUND WAVE +1F50A ; [*14D1.0020.0002] # SPEAKER WITH THREE SOUND WAVES +1F50B ; [*14D2.0020.0002] # BATTERY +1F50C ; [*14D3.0020.0002] # ELECTRIC PLUG +1F50D ; [*14D4.0020.0002] # LEFT-POINTING MAGNIFYING GLASS +1F50E ; [*14D5.0020.0002] # RIGHT-POINTING MAGNIFYING GLASS +1F50F ; [*14D6.0020.0002] # LOCK WITH INK PEN +1F510 ; [*14D7.0020.0002] # CLOSED LOCK WITH KEY +1F511 ; [*14D8.0020.0002] # KEY +1F512 ; [*14D9.0020.0002] # LOCK +1F513 ; [*14DA.0020.0002] # OPEN LOCK +1F514 ; [*14DB.0020.0002] # BELL +1F515 ; [*14DC.0020.0002] # BELL WITH CANCELLATION STROKE +1F516 ; [*14DD.0020.0002] # BOOKMARK +1F517 ; [*14DE.0020.0002] # LINK SYMBOL +1F518 ; [*14DF.0020.0002] # RADIO BUTTON +1F519 ; [*14E0.0020.0002] # BACK WITH LEFTWARDS ARROW ABOVE +1F51A ; [*14E1.0020.0002] # END WITH LEFTWARDS ARROW ABOVE +1F51B ; [*14E2.0020.0002] # ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE +1F51C ; [*14E3.0020.0002] # SOON WITH RIGHTWARDS ARROW ABOVE +1F51D ; [*14E4.0020.0002] # TOP WITH UPWARDS ARROW ABOVE +1F51E ; [*14E5.0020.0002] # NO ONE UNDER EIGHTEEN SYMBOL +1F51F ; [*14E6.0020.0002] # KEYCAP TEN +1F520 ; [*14E7.0020.0002] # INPUT SYMBOL FOR LATIN CAPITAL LETTERS +1F521 ; [*14E8.0020.0002] # INPUT SYMBOL FOR LATIN SMALL LETTERS +1F522 ; [*14E9.0020.0002] # INPUT SYMBOL FOR NUMBERS +1F523 ; [*14EA.0020.0002] # INPUT SYMBOL FOR SYMBOLS +1F524 ; [*14EB.0020.0002] # INPUT SYMBOL FOR LATIN LETTERS +1F525 ; [*14EC.0020.0002] # FIRE +1F526 ; [*14ED.0020.0002] # ELECTRIC TORCH +1F527 ; [*14EE.0020.0002] # WRENCH +1F528 ; [*14EF.0020.0002] # HAMMER +1F529 ; [*14F0.0020.0002] # NUT AND BOLT +1F52A ; [*14F1.0020.0002] # HOCHO +1F52B ; [*14F2.0020.0002] # PISTOL +1F52C ; [*14F3.0020.0002] # MICROSCOPE +1F52D ; [*14F4.0020.0002] # TELESCOPE +1F52E ; [*14F5.0020.0002] # CRYSTAL BALL +1F52F ; [*14F6.0020.0002] # SIX POINTED STAR WITH MIDDLE DOT +1F530 ; [*14F7.0020.0002] # JAPANESE SYMBOL FOR BEGINNER +1F531 ; [*14F8.0020.0002] # TRIDENT EMBLEM +1F532 ; [*14F9.0020.0002] # BLACK SQUARE BUTTON +1F533 ; [*14FA.0020.0002] # WHITE SQUARE BUTTON +1F534 ; [*14FB.0020.0002] # LARGE RED CIRCLE +1F535 ; [*14FC.0020.0002] # LARGE BLUE CIRCLE +1F536 ; [*14FD.0020.0002] # LARGE ORANGE DIAMOND +1F537 ; [*14FE.0020.0002] # LARGE BLUE DIAMOND +1F538 ; [*14FF.0020.0002] # SMALL ORANGE DIAMOND +1F539 ; [*1500.0020.0002] # SMALL BLUE DIAMOND +1F53A ; [*1501.0020.0002] # UP-POINTING RED TRIANGLE +1F53B ; [*1502.0020.0002] # DOWN-POINTING RED TRIANGLE +1F53C ; [*1503.0020.0002] # UP-POINTING SMALL RED TRIANGLE +1F53D ; [*1504.0020.0002] # DOWN-POINTING SMALL RED TRIANGLE +1F53E ; [*1505.0020.0002] # LOWER RIGHT SHADOWED WHITE CIRCLE +1F53F ; [*1506.0020.0002] # UPPER RIGHT SHADOWED WHITE CIRCLE +1F540 ; [*1507.0020.0002] # CIRCLED CROSS POMMEE +1F541 ; [*1508.0020.0002] # CROSS POMMEE WITH HALF-CIRCLE BELOW +1F542 ; [*1509.0020.0002] # CROSS POMMEE +1F543 ; [*150A.0020.0002] # NOTCHED LEFT SEMICIRCLE WITH THREE DOTS +1F544 ; [*150B.0020.0002] # NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS +1F545 ; [*150C.0020.0002] # SYMBOL FOR MARKS CHAPTER +1F546 ; [*150D.0020.0002] # WHITE LATIN CROSS +1F547 ; [*150E.0020.0002] # HEAVY LATIN CROSS +1F548 ; [*150F.0020.0002] # CELTIC CROSS +1F549 ; [*1510.0020.0002] # OM SYMBOL +1F54A ; [*1511.0020.0002] # DOVE OF PEACE +1F54B ; [*1512.0020.0002] # KAABA +1F54C ; [*1513.0020.0002] # MOSQUE +1F54D ; [*1514.0020.0002] # SYNAGOGUE +1F54E ; [*1515.0020.0002] # MENORAH WITH NINE BRANCHES +1F54F ; [*1516.0020.0002] # BOWL OF HYGIEIA +1F550 ; [*1517.0020.0002] # CLOCK FACE ONE OCLOCK +1F551 ; [*1518.0020.0002] # CLOCK FACE TWO OCLOCK +1F552 ; [*1519.0020.0002] # CLOCK FACE THREE OCLOCK +1F553 ; [*151A.0020.0002] # CLOCK FACE FOUR OCLOCK +1F554 ; [*151B.0020.0002] # CLOCK FACE FIVE OCLOCK +1F555 ; [*151C.0020.0002] # CLOCK FACE SIX OCLOCK +1F556 ; [*151D.0020.0002] # CLOCK FACE SEVEN OCLOCK +1F557 ; [*151E.0020.0002] # CLOCK FACE EIGHT OCLOCK +1F558 ; [*151F.0020.0002] # CLOCK FACE NINE OCLOCK +1F559 ; [*1520.0020.0002] # CLOCK FACE TEN OCLOCK +1F55A ; [*1521.0020.0002] # CLOCK FACE ELEVEN OCLOCK +1F55B ; [*1522.0020.0002] # CLOCK FACE TWELVE OCLOCK +1F55C ; [*1523.0020.0002] # CLOCK FACE ONE-THIRTY +1F55D ; [*1524.0020.0002] # CLOCK FACE TWO-THIRTY +1F55E ; [*1525.0020.0002] # CLOCK FACE THREE-THIRTY +1F55F ; [*1526.0020.0002] # CLOCK FACE FOUR-THIRTY +1F560 ; [*1527.0020.0002] # CLOCK FACE FIVE-THIRTY +1F561 ; [*1528.0020.0002] # CLOCK FACE SIX-THIRTY +1F562 ; [*1529.0020.0002] # CLOCK FACE SEVEN-THIRTY +1F563 ; [*152A.0020.0002] # CLOCK FACE EIGHT-THIRTY +1F564 ; [*152B.0020.0002] # CLOCK FACE NINE-THIRTY +1F565 ; [*152C.0020.0002] # CLOCK FACE TEN-THIRTY +1F566 ; [*152D.0020.0002] # CLOCK FACE ELEVEN-THIRTY +1F567 ; [*152E.0020.0002] # CLOCK FACE TWELVE-THIRTY +1F568 ; [*152F.0020.0002] # RIGHT SPEAKER +1F569 ; [*1530.0020.0002] # RIGHT SPEAKER WITH ONE SOUND WAVE +1F56A ; [*1531.0020.0002] # RIGHT SPEAKER WITH THREE SOUND WAVES +1F56B ; [*1532.0020.0002] # BULLHORN +1F56C ; [*1533.0020.0002] # BULLHORN WITH SOUND WAVES +1F56D ; [*1534.0020.0002] # RINGING BELL +1F56E ; [*1535.0020.0002] # BOOK +1F56F ; [*1536.0020.0002] # CANDLE +1F570 ; [*1537.0020.0002] # MANTELPIECE CLOCK +1F571 ; [*1538.0020.0002] # BLACK SKULL AND CROSSBONES +1F572 ; [*1539.0020.0002] # NO PIRACY +1F573 ; [*153A.0020.0002] # HOLE +1F574 ; [*153B.0020.0002] # MAN IN BUSINESS SUIT LEVITATING +1F575 ; [*153C.0020.0002] # SLEUTH OR SPY +1F576 ; [*153D.0020.0002] # DARK SUNGLASSES +1F577 ; [*153E.0020.0002] # SPIDER +1F578 ; [*153F.0020.0002] # SPIDER WEB +1F579 ; [*1540.0020.0002] # JOYSTICK +1F57A ; [*1541.0020.0002] # MAN DANCING +1F57B ; [*1542.0020.0002] # LEFT HAND TELEPHONE RECEIVER +1F57C ; [*1543.0020.0002] # TELEPHONE RECEIVER WITH PAGE +1F57D ; [*1544.0020.0002] # RIGHT HAND TELEPHONE RECEIVER +1F57E ; [*1545.0020.0002] # WHITE TOUCHTONE TELEPHONE +1F57F ; [*1546.0020.0002] # BLACK TOUCHTONE TELEPHONE +1F580 ; [*1547.0020.0002] # TELEPHONE ON TOP OF MODEM +1F581 ; [*1548.0020.0002] # CLAMSHELL MOBILE PHONE +1F582 ; [*1549.0020.0002] # BACK OF ENVELOPE +1F583 ; [*154A.0020.0002] # STAMPED ENVELOPE +1F584 ; [*154B.0020.0002] # ENVELOPE WITH LIGHTNING +1F585 ; [*154C.0020.0002] # FLYING ENVELOPE +1F586 ; [*154D.0020.0002] # PEN OVER STAMPED ENVELOPE +1F587 ; [*154E.0020.0002] # LINKED PAPERCLIPS +1F588 ; [*154F.0020.0002] # BLACK PUSHPIN +1F589 ; [*1550.0020.0002] # LOWER LEFT PENCIL +1F58A ; [*1551.0020.0002] # LOWER LEFT BALLPOINT PEN +1F58B ; [*1552.0020.0002] # LOWER LEFT FOUNTAIN PEN +1F58C ; [*1553.0020.0002] # LOWER LEFT PAINTBRUSH +1F58D ; [*1554.0020.0002] # LOWER LEFT CRAYON +1F58E ; [*1555.0020.0002] # LEFT WRITING HAND +1F58F ; [*1556.0020.0002] # TURNED OK HAND SIGN +1F590 ; [*1557.0020.0002] # RAISED HAND WITH FINGERS SPLAYED +1F591 ; [*1558.0020.0002] # REVERSED RAISED HAND WITH FINGERS SPLAYED +1F592 ; [*1559.0020.0002] # REVERSED THUMBS UP SIGN +1F593 ; [*155A.0020.0002] # REVERSED THUMBS DOWN SIGN +1F594 ; [*155B.0020.0002] # REVERSED VICTORY HAND +1F595 ; [*155C.0020.0002] # REVERSED HAND WITH MIDDLE FINGER EXTENDED +1F596 ; [*155D.0020.0002] # RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597 ; [*155E.0020.0002] # WHITE DOWN POINTING LEFT HAND INDEX +1F598 ; [*155F.0020.0002] # SIDEWAYS WHITE LEFT POINTING INDEX +1F599 ; [*1560.0020.0002] # SIDEWAYS WHITE RIGHT POINTING INDEX +1F59A ; [*1561.0020.0002] # SIDEWAYS BLACK LEFT POINTING INDEX +1F59B ; [*1562.0020.0002] # SIDEWAYS BLACK RIGHT POINTING INDEX +1F59C ; [*1563.0020.0002] # BLACK LEFT POINTING BACKHAND INDEX +1F59D ; [*1564.0020.0002] # BLACK RIGHT POINTING BACKHAND INDEX +1F59E ; [*1565.0020.0002] # SIDEWAYS WHITE UP POINTING INDEX +1F59F ; [*1566.0020.0002] # SIDEWAYS WHITE DOWN POINTING INDEX +1F5A0 ; [*1567.0020.0002] # SIDEWAYS BLACK UP POINTING INDEX +1F5A1 ; [*1568.0020.0002] # SIDEWAYS BLACK DOWN POINTING INDEX +1F5A2 ; [*1569.0020.0002] # BLACK UP POINTING BACKHAND INDEX +1F5A3 ; [*156A.0020.0002] # BLACK DOWN POINTING BACKHAND INDEX +1F5A4 ; [*156B.0020.0002] # BLACK HEART +1F5A5 ; [*156C.0020.0002] # DESKTOP COMPUTER +1F5A6 ; [*156D.0020.0002] # KEYBOARD AND MOUSE +1F5A7 ; [*156E.0020.0002] # THREE NETWORKED COMPUTERS +1F5A8 ; [*156F.0020.0002] # PRINTER +1F5A9 ; [*1570.0020.0002] # POCKET CALCULATOR +1F5AA ; [*1571.0020.0002] # BLACK HARD SHELL FLOPPY DISK +1F5AB ; [*1572.0020.0002] # WHITE HARD SHELL FLOPPY DISK +1F5AC ; [*1573.0020.0002] # SOFT SHELL FLOPPY DISK +1F5AD ; [*1574.0020.0002] # TAPE CARTRIDGE +1F5AE ; [*1575.0020.0002] # WIRED KEYBOARD +1F5AF ; [*1576.0020.0002] # ONE BUTTON MOUSE +1F5B0 ; [*1577.0020.0002] # TWO BUTTON MOUSE +1F5B1 ; [*1578.0020.0002] # THREE BUTTON MOUSE +1F5B2 ; [*1579.0020.0002] # TRACKBALL +1F5B3 ; [*157A.0020.0002] # OLD PERSONAL COMPUTER +1F5B4 ; [*157B.0020.0002] # HARD DISK +1F5B5 ; [*157C.0020.0002] # SCREEN +1F5B6 ; [*157D.0020.0002] # PRINTER ICON +1F5B7 ; [*157E.0020.0002] # FAX ICON +1F5B8 ; [*157F.0020.0002] # OPTICAL DISC ICON +1F5B9 ; [*1580.0020.0002] # DOCUMENT WITH TEXT +1F5BA ; [*1581.0020.0002] # DOCUMENT WITH TEXT AND PICTURE +1F5BB ; [*1582.0020.0002] # DOCUMENT WITH PICTURE +1F5BC ; [*1583.0020.0002] # FRAME WITH PICTURE +1F5BD ; [*1584.0020.0002] # FRAME WITH TILES +1F5BE ; [*1585.0020.0002] # FRAME WITH AN X +1F5BF ; [*1586.0020.0002] # BLACK FOLDER +1F5C0 ; [*1587.0020.0002] # FOLDER +1F5C1 ; [*1588.0020.0002] # OPEN FOLDER +1F5C2 ; [*1589.0020.0002] # CARD INDEX DIVIDERS +1F5C3 ; [*158A.0020.0002] # CARD FILE BOX +1F5C4 ; [*158B.0020.0002] # FILE CABINET +1F5C5 ; [*158C.0020.0002] # EMPTY NOTE +1F5C6 ; [*158D.0020.0002] # EMPTY NOTE PAGE +1F5C7 ; [*158E.0020.0002] # EMPTY NOTE PAD +1F5C8 ; [*158F.0020.0002] # NOTE +1F5C9 ; [*1590.0020.0002] # NOTE PAGE +1F5CA ; [*1591.0020.0002] # NOTE PAD +1F5CB ; [*1592.0020.0002] # EMPTY DOCUMENT +1F5CC ; [*1593.0020.0002] # EMPTY PAGE +1F5CD ; [*1594.0020.0002] # EMPTY PAGES +1F5CE ; [*1595.0020.0002] # DOCUMENT +1F5CF ; [*1596.0020.0002] # PAGE +1F5D0 ; [*1597.0020.0002] # PAGES +1F5D1 ; [*1598.0020.0002] # WASTEBASKET +1F5D2 ; [*1599.0020.0002] # SPIRAL NOTE PAD +1F5D3 ; [*159A.0020.0002] # SPIRAL CALENDAR PAD +1F5D4 ; [*159B.0020.0002] # DESKTOP WINDOW +1F5D5 ; [*159C.0020.0002] # MINIMIZE +1F5D6 ; [*159D.0020.0002] # MAXIMIZE +1F5D7 ; [*159E.0020.0002] # OVERLAP +1F5D8 ; [*159F.0020.0002] # CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS +1F5D9 ; [*15A0.0020.0002] # CANCELLATION X +1F5DA ; [*15A1.0020.0002] # INCREASE FONT SIZE SYMBOL +1F5DB ; [*15A2.0020.0002] # DECREASE FONT SIZE SYMBOL +1F5DC ; [*15A3.0020.0002] # COMPRESSION +1F5DD ; [*15A4.0020.0002] # OLD KEY +1F5DE ; [*15A5.0020.0002] # ROLLED-UP NEWSPAPER +1F5DF ; [*15A6.0020.0002] # PAGE WITH CIRCLED TEXT +1F5E0 ; [*15A7.0020.0002] # STOCK CHART +1F5E1 ; [*15A8.0020.0002] # DAGGER KNIFE +1F5E2 ; [*15A9.0020.0002] # LIPS +1F5E3 ; [*15AA.0020.0002] # SPEAKING HEAD IN SILHOUETTE +1F5E4 ; [*15AB.0020.0002] # THREE RAYS ABOVE +1F5E5 ; [*15AC.0020.0002] # THREE RAYS BELOW +1F5E6 ; [*15AD.0020.0002] # THREE RAYS LEFT +1F5E7 ; [*15AE.0020.0002] # THREE RAYS RIGHT +1F5E8 ; [*15AF.0020.0002] # LEFT SPEECH BUBBLE +1F5E9 ; [*15B0.0020.0002] # RIGHT SPEECH BUBBLE +1F5EA ; [*15B1.0020.0002] # TWO SPEECH BUBBLES +1F5EB ; [*15B2.0020.0002] # THREE SPEECH BUBBLES +1F5EC ; [*15B3.0020.0002] # LEFT THOUGHT BUBBLE +1F5ED ; [*15B4.0020.0002] # RIGHT THOUGHT BUBBLE +1F5EE ; [*15B5.0020.0002] # LEFT ANGER BUBBLE +1F5EF ; [*15B6.0020.0002] # RIGHT ANGER BUBBLE +1F5F0 ; [*15B7.0020.0002] # MOOD BUBBLE +1F5F1 ; [*15B8.0020.0002] # LIGHTNING MOOD BUBBLE +1F5F2 ; [*15B9.0020.0002] # LIGHTNING MOOD +1F5F3 ; [*15BA.0020.0002] # BALLOT BOX WITH BALLOT +1F5F4 ; [*15BB.0020.0002] # BALLOT SCRIPT X +1F5F5 ; [*15BC.0020.0002] # BALLOT BOX WITH SCRIPT X +1F5F6 ; [*15BD.0020.0002] # BALLOT BOLD SCRIPT X +1F5F7 ; [*15BE.0020.0002] # BALLOT BOX WITH BOLD SCRIPT X +1F5F8 ; [*15BF.0020.0002] # LIGHT CHECK MARK +1F5F9 ; [*15C0.0020.0002] # BALLOT BOX WITH BOLD CHECK +1F5FA ; [*15C1.0020.0002] # WORLD MAP +1F5FB ; [*15C2.0020.0002] # MOUNT FUJI +1F5FC ; [*15C3.0020.0002] # TOKYO TOWER +1F5FD ; [*15C4.0020.0002] # STATUE OF LIBERTY +1F5FE ; [*15C5.0020.0002] # SILHOUETTE OF JAPAN +1F5FF ; [*15C6.0020.0002] # MOYAI +1F600 ; [*165B.0020.0002] # GRINNING FACE +1F601 ; [*165C.0020.0002] # GRINNING FACE WITH SMILING EYES +1F602 ; [*165D.0020.0002] # FACE WITH TEARS OF JOY +1F603 ; [*165E.0020.0002] # SMILING FACE WITH OPEN MOUTH +1F604 ; [*165F.0020.0002] # SMILING FACE WITH OPEN MOUTH AND SMILING EYES +1F605 ; [*1660.0020.0002] # SMILING FACE WITH OPEN MOUTH AND COLD SWEAT +1F606 ; [*1661.0020.0002] # SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES +1F607 ; [*1662.0020.0002] # SMILING FACE WITH HALO +1F608 ; [*1663.0020.0002] # SMILING FACE WITH HORNS +1F609 ; [*1664.0020.0002] # WINKING FACE +1F60A ; [*1665.0020.0002] # SMILING FACE WITH SMILING EYES +1F60B ; [*1666.0020.0002] # FACE SAVOURING DELICIOUS FOOD +1F60C ; [*1667.0020.0002] # RELIEVED FACE +1F60D ; [*1668.0020.0002] # SMILING FACE WITH HEART-SHAPED EYES +1F60E ; [*1669.0020.0002] # SMILING FACE WITH SUNGLASSES +1F60F ; [*166A.0020.0002] # SMIRKING FACE +1F610 ; [*166B.0020.0002] # NEUTRAL FACE +1F611 ; [*166C.0020.0002] # EXPRESSIONLESS FACE +1F612 ; [*166D.0020.0002] # UNAMUSED FACE +1F613 ; [*166E.0020.0002] # FACE WITH COLD SWEAT +1F614 ; [*166F.0020.0002] # PENSIVE FACE +1F615 ; [*1670.0020.0002] # CONFUSED FACE +1F616 ; [*1671.0020.0002] # CONFOUNDED FACE +1F617 ; [*1672.0020.0002] # KISSING FACE +1F618 ; [*1673.0020.0002] # FACE THROWING A KISS +1F619 ; [*1674.0020.0002] # KISSING FACE WITH SMILING EYES +1F61A ; [*1675.0020.0002] # KISSING FACE WITH CLOSED EYES +1F61B ; [*1676.0020.0002] # FACE WITH STUCK-OUT TONGUE +1F61C ; [*1677.0020.0002] # FACE WITH STUCK-OUT TONGUE AND WINKING EYE +1F61D ; [*1678.0020.0002] # FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES +1F61E ; [*1679.0020.0002] # DISAPPOINTED FACE +1F61F ; [*167A.0020.0002] # WORRIED FACE +1F620 ; [*167B.0020.0002] # ANGRY FACE +1F621 ; [*167C.0020.0002] # POUTING FACE +1F622 ; [*167D.0020.0002] # CRYING FACE +1F623 ; [*167E.0020.0002] # PERSEVERING FACE +1F624 ; [*167F.0020.0002] # FACE WITH LOOK OF TRIUMPH +1F625 ; [*1680.0020.0002] # DISAPPOINTED BUT RELIEVED FACE +1F626 ; [*1681.0020.0002] # FROWNING FACE WITH OPEN MOUTH +1F627 ; [*1682.0020.0002] # ANGUISHED FACE +1F628 ; [*1683.0020.0002] # FEARFUL FACE +1F629 ; [*1684.0020.0002] # WEARY FACE +1F62A ; [*1685.0020.0002] # SLEEPY FACE +1F62B ; [*1686.0020.0002] # TIRED FACE +1F62C ; [*1687.0020.0002] # GRIMACING FACE +1F62D ; [*1688.0020.0002] # LOUDLY CRYING FACE +1F62E ; [*1689.0020.0002] # FACE WITH OPEN MOUTH +1F62F ; [*168A.0020.0002] # HUSHED FACE +1F630 ; [*168B.0020.0002] # FACE WITH OPEN MOUTH AND COLD SWEAT +1F631 ; [*168C.0020.0002] # FACE SCREAMING IN FEAR +1F632 ; [*168D.0020.0002] # ASTONISHED FACE +1F633 ; [*168E.0020.0002] # FLUSHED FACE +1F634 ; [*168F.0020.0002] # SLEEPING FACE +1F635 ; [*1690.0020.0002] # DIZZY FACE +1F636 ; [*1691.0020.0002] # FACE WITHOUT MOUTH +1F637 ; [*1692.0020.0002] # FACE WITH MEDICAL MASK +1F638 ; [*1693.0020.0002] # GRINNING CAT FACE WITH SMILING EYES +1F639 ; [*1694.0020.0002] # CAT FACE WITH TEARS OF JOY +1F63A ; [*1695.0020.0002] # SMILING CAT FACE WITH OPEN MOUTH +1F63B ; [*1696.0020.0002] # SMILING CAT FACE WITH HEART-SHAPED EYES +1F63C ; [*1697.0020.0002] # CAT FACE WITH WRY SMILE +1F63D ; [*1698.0020.0002] # KISSING CAT FACE WITH CLOSED EYES +1F63E ; [*1699.0020.0002] # POUTING CAT FACE +1F63F ; [*169A.0020.0002] # CRYING CAT FACE +1F640 ; [*169B.0020.0002] # WEARY CAT FACE +1F641 ; [*169C.0020.0002] # SLIGHTLY FROWNING FACE +1F642 ; [*169D.0020.0002] # SLIGHTLY SMILING FACE +1F643 ; [*169E.0020.0002] # UPSIDE-DOWN FACE +1F644 ; [*169F.0020.0002] # FACE WITH ROLLING EYES +1F645 ; [*16A0.0020.0002] # FACE WITH NO GOOD GESTURE +1F646 ; [*16A1.0020.0002] # FACE WITH OK GESTURE +1F647 ; [*16A2.0020.0002] # PERSON BOWING DEEPLY +1F648 ; [*16A3.0020.0002] # SEE-NO-EVIL MONKEY +1F649 ; [*16A4.0020.0002] # HEAR-NO-EVIL MONKEY +1F64A ; [*16A5.0020.0002] # SPEAK-NO-EVIL MONKEY +1F64B ; [*16A6.0020.0002] # HAPPY PERSON RAISING ONE HAND +1F64C ; [*16A7.0020.0002] # PERSON RAISING BOTH HANDS IN CELEBRATION +1F64D ; [*16A8.0020.0002] # PERSON FROWNING +1F64E ; [*16A9.0020.0002] # PERSON WITH POUTING FACE +1F64F ; [*16AA.0020.0002] # PERSON WITH FOLDED HANDS +1F650 ; [*16AB.0020.0002] # NORTH WEST POINTING LEAF +1F651 ; [*16AC.0020.0002] # SOUTH WEST POINTING LEAF +1F652 ; [*16AD.0020.0002] # NORTH EAST POINTING LEAF +1F653 ; [*16AE.0020.0002] # SOUTH EAST POINTING LEAF +1F654 ; [*16AF.0020.0002] # TURNED NORTH WEST POINTING LEAF +1F655 ; [*16B0.0020.0002] # TURNED SOUTH WEST POINTING LEAF +1F656 ; [*16B1.0020.0002] # TURNED NORTH EAST POINTING LEAF +1F657 ; [*16B2.0020.0002] # TURNED SOUTH EAST POINTING LEAF +1F658 ; [*16B3.0020.0002] # NORTH WEST POINTING VINE LEAF +1F659 ; [*16B4.0020.0002] # SOUTH WEST POINTING VINE LEAF +1F65A ; [*16B5.0020.0002] # NORTH EAST POINTING VINE LEAF +1F65B ; [*16B6.0020.0002] # SOUTH EAST POINTING VINE LEAF +1F65C ; [*16B7.0020.0002] # HEAVY NORTH WEST POINTING VINE LEAF +1F65D ; [*16B8.0020.0002] # HEAVY SOUTH WEST POINTING VINE LEAF +1F65E ; [*16B9.0020.0002] # HEAVY NORTH EAST POINTING VINE LEAF +1F65F ; [*16BA.0020.0002] # HEAVY SOUTH EAST POINTING VINE LEAF +1F660 ; [*16BB.0020.0002] # NORTH WEST POINTING BUD +1F661 ; [*16BC.0020.0002] # SOUTH WEST POINTING BUD +1F662 ; [*16BD.0020.0002] # NORTH EAST POINTING BUD +1F663 ; [*16BE.0020.0002] # SOUTH EAST POINTING BUD +1F664 ; [*16BF.0020.0002] # HEAVY NORTH WEST POINTING BUD +1F665 ; [*16C0.0020.0002] # HEAVY SOUTH WEST POINTING BUD +1F666 ; [*16C1.0020.0002] # HEAVY NORTH EAST POINTING BUD +1F667 ; [*16C2.0020.0002] # HEAVY SOUTH EAST POINTING BUD +1F668 ; [*16C3.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT +1F669 ; [*16C4.0020.0002] # HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE +1F66A ; [*16C5.0020.0002] # SOLID QUILT SQUARE ORNAMENT +1F66B ; [*16C6.0020.0002] # SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE +1F66C ; [*16C7.0020.0002] # LEFTWARDS ROCKET +1F66D ; [*16C8.0020.0002] # UPWARDS ROCKET +1F66E ; [*16C9.0020.0002] # RIGHTWARDS ROCKET +1F66F ; [*16CA.0020.0002] # DOWNWARDS ROCKET +1F670 ; [*16CB.0020.0002] # SCRIPT LIGATURE ET ORNAMENT +1F671 ; [*16CC.0020.0002] # HEAVY SCRIPT LIGATURE ET ORNAMENT +1F672 ; [*16CD.0020.0002] # LIGATURE OPEN ET ORNAMENT +1F673 ; [*16CE.0020.0002] # HEAVY LIGATURE OPEN ET ORNAMENT +1F674 ; [*16CF.0020.0002] # HEAVY AMPERSAND ORNAMENT +1F675 ; [*16D0.0020.0002] # SWASH AMPERSAND ORNAMENT +1F676 ; [*16D1.0020.0002] # SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +1F677 ; [*16D2.0020.0002] # SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +1F678 ; [*16D3.0020.0002] # SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +1F679 ; [*16D4.0020.0002] # HEAVY INTERROBANG ORNAMENT +1F67A ; [*16D5.0020.0002] # SANS-SERIF INTERROBANG ORNAMENT +1F67B ; [*16D6.0020.0002] # HEAVY SANS-SERIF INTERROBANG ORNAMENT +1F67C ; [*16D7.0020.0002] # VERY HEAVY SOLIDUS +1F67D ; [*16D8.0020.0002] # VERY HEAVY REVERSE SOLIDUS +1F67E ; [*16D9.0020.0002] # CHECKER BOARD +1F67F ; [*16DA.0020.0002] # REVERSE CHECKER BOARD +1F680 ; [*16DB.0020.0002] # ROCKET +1F681 ; [*16DC.0020.0002] # HELICOPTER +1F682 ; [*16DD.0020.0002] # STEAM LOCOMOTIVE +1F683 ; [*16DE.0020.0002] # RAILWAY CAR +1F684 ; [*16DF.0020.0002] # HIGH-SPEED TRAIN +1F685 ; [*16E0.0020.0002] # HIGH-SPEED TRAIN WITH BULLET NOSE +1F686 ; [*16E1.0020.0002] # TRAIN +1F687 ; [*16E2.0020.0002] # METRO +1F688 ; [*16E3.0020.0002] # LIGHT RAIL +1F689 ; [*16E4.0020.0002] # STATION +1F68A ; [*16E5.0020.0002] # TRAM +1F68B ; [*16E6.0020.0002] # TRAM CAR +1F68C ; [*16E7.0020.0002] # BUS +1F68D ; [*16E8.0020.0002] # ONCOMING BUS +1F68E ; [*16E9.0020.0002] # TROLLEYBUS +1F68F ; [*16EA.0020.0002] # BUS STOP +1F690 ; [*16EB.0020.0002] # MINIBUS +1F691 ; [*16EC.0020.0002] # AMBULANCE +1F692 ; [*16ED.0020.0002] # FIRE ENGINE +1F693 ; [*16EE.0020.0002] # POLICE CAR +1F694 ; [*16EF.0020.0002] # ONCOMING POLICE CAR +1F695 ; [*16F0.0020.0002] # TAXI +1F696 ; [*16F1.0020.0002] # ONCOMING TAXI +1F697 ; [*16F2.0020.0002] # AUTOMOBILE +1F698 ; [*16F3.0020.0002] # ONCOMING AUTOMOBILE +1F699 ; [*16F4.0020.0002] # RECREATIONAL VEHICLE +1F69A ; [*16F5.0020.0002] # DELIVERY TRUCK +1F69B ; [*16F6.0020.0002] # ARTICULATED LORRY +1F69C ; [*16F7.0020.0002] # TRACTOR +1F69D ; [*16F8.0020.0002] # MONORAIL +1F69E ; [*16F9.0020.0002] # MOUNTAIN RAILWAY +1F69F ; [*16FA.0020.0002] # SUSPENSION RAILWAY +1F6A0 ; [*16FB.0020.0002] # MOUNTAIN CABLEWAY +1F6A1 ; [*16FC.0020.0002] # AERIAL TRAMWAY +1F6A2 ; [*16FD.0020.0002] # SHIP +1F6A3 ; [*16FE.0020.0002] # ROWBOAT +1F6A4 ; [*16FF.0020.0002] # SPEEDBOAT +1F6A5 ; [*1700.0020.0002] # HORIZONTAL TRAFFIC LIGHT +1F6A6 ; [*1701.0020.0002] # VERTICAL TRAFFIC LIGHT +1F6A7 ; [*1702.0020.0002] # CONSTRUCTION SIGN +1F6A8 ; [*1703.0020.0002] # POLICE CARS REVOLVING LIGHT +1F6A9 ; [*1704.0020.0002] # TRIANGULAR FLAG ON POST +1F6AA ; [*1705.0020.0002] # DOOR +1F6AB ; [*1706.0020.0002] # NO ENTRY SIGN +1F6AC ; [*1707.0020.0002] # SMOKING SYMBOL +1F6AD ; [*1708.0020.0002] # NO SMOKING SYMBOL +1F6AE ; [*1709.0020.0002] # PUT LITTER IN ITS PLACE SYMBOL +1F6AF ; [*170A.0020.0002] # DO NOT LITTER SYMBOL +1F6B0 ; [*170B.0020.0002] # POTABLE WATER SYMBOL +1F6B1 ; [*170C.0020.0002] # NON-POTABLE WATER SYMBOL +1F6B2 ; [*170D.0020.0002] # BICYCLE +1F6B3 ; [*170E.0020.0002] # NO BICYCLES +1F6B4 ; [*170F.0020.0002] # BICYCLIST +1F6B5 ; [*1710.0020.0002] # MOUNTAIN BICYCLIST +1F6B6 ; [*1711.0020.0002] # PEDESTRIAN +1F6B7 ; [*1712.0020.0002] # NO PEDESTRIANS +1F6B8 ; [*1713.0020.0002] # CHILDREN CROSSING +1F6B9 ; [*1714.0020.0002] # MENS SYMBOL +1F6BA ; [*1715.0020.0002] # WOMENS SYMBOL +1F6BB ; [*1716.0020.0002] # RESTROOM +1F6BC ; [*1717.0020.0002] # BABY SYMBOL +1F6BD ; [*1718.0020.0002] # TOILET +1F6BE ; [*1719.0020.0002] # WATER CLOSET +1F6BF ; [*171A.0020.0002] # SHOWER +1F6C0 ; [*171B.0020.0002] # BATH +1F6C1 ; [*171C.0020.0002] # BATHTUB +1F6C2 ; [*171D.0020.0002] # PASSPORT CONTROL +1F6C3 ; [*171E.0020.0002] # CUSTOMS +1F6C4 ; [*171F.0020.0002] # BAGGAGE CLAIM +1F6C5 ; [*1720.0020.0002] # LEFT LUGGAGE +1F6C6 ; [*1721.0020.0002] # TRIANGLE WITH ROUNDED CORNERS +1F6C7 ; [*1722.0020.0002] # PROHIBITED SIGN +1F6C8 ; [*1723.0020.0002] # CIRCLED INFORMATION SOURCE +1F6C9 ; [*1724.0020.0002] # BOYS SYMBOL +1F6CA ; [*1725.0020.0002] # GIRLS SYMBOL +1F6CB ; [*1726.0020.0002] # COUCH AND LAMP +1F6CC ; [*1727.0020.0002] # SLEEPING ACCOMMODATION +1F6CD ; [*1728.0020.0002] # SHOPPING BAGS +1F6CE ; [*1729.0020.0002] # BELLHOP BELL +1F6CF ; [*172A.0020.0002] # BED +1F6D0 ; [*172B.0020.0002] # PLACE OF WORSHIP +1F6D1 ; [*172C.0020.0002] # OCTAGONAL SIGN +1F6D2 ; [*172D.0020.0002] # SHOPPING TROLLEY +1F6D3 ; [*172E.0020.0002] # STUPA +1F6D4 ; [*172F.0020.0002] # PAGODA +1F6E0 ; [*1730.0020.0002] # HAMMER AND WRENCH +1F6E1 ; [*1731.0020.0002] # SHIELD +1F6E2 ; [*1732.0020.0002] # OIL DRUM +1F6E3 ; [*1733.0020.0002] # MOTORWAY +1F6E4 ; [*1734.0020.0002] # RAILWAY TRACK +1F6E5 ; [*1735.0020.0002] # MOTOR BOAT +1F6E6 ; [*1736.0020.0002] # UP-POINTING MILITARY AIRPLANE +1F6E7 ; [*1737.0020.0002] # UP-POINTING AIRPLANE +1F6E8 ; [*1738.0020.0002] # UP-POINTING SMALL AIRPLANE +1F6E9 ; [*1739.0020.0002] # SMALL AIRPLANE +1F6EA ; [*173A.0020.0002] # NORTHEAST-POINTING AIRPLANE +1F6EB ; [*173B.0020.0002] # AIRPLANE DEPARTURE +1F6EC ; [*173C.0020.0002] # AIRPLANE ARRIVING +1F6F0 ; [*173D.0020.0002] # SATELLITE +1F6F1 ; [*173E.0020.0002] # ONCOMING FIRE ENGINE +1F6F2 ; [*173F.0020.0002] # DIESEL LOCOMOTIVE +1F6F3 ; [*1740.0020.0002] # PASSENGER SHIP +1F6F4 ; [*1741.0020.0002] # SCOOTER +1F6F5 ; [*1742.0020.0002] # MOTOR SCOOTER +1F6F6 ; [*1743.0020.0002] # CANOE +1F6F7 ; [*1744.0020.0002] # SLED +1F6F8 ; [*1745.0020.0002] # FLYING SAUCER +1F700 ; [*1746.0020.0002] # ALCHEMICAL SYMBOL FOR QUINTESSENCE +1F701 ; [*1747.0020.0002] # ALCHEMICAL SYMBOL FOR AIR +1F702 ; [*1748.0020.0002] # ALCHEMICAL SYMBOL FOR FIRE +1F703 ; [*1749.0020.0002] # ALCHEMICAL SYMBOL FOR EARTH +1F704 ; [*174A.0020.0002] # ALCHEMICAL SYMBOL FOR WATER +1F705 ; [*174B.0020.0002] # ALCHEMICAL SYMBOL FOR AQUAFORTIS +1F706 ; [*174C.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA +1F707 ; [*174D.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA REGIA-2 +1F708 ; [*174E.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE +1F709 ; [*174F.0020.0002] # ALCHEMICAL SYMBOL FOR AQUA VITAE-2 +1F70A ; [*1750.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR +1F70B ; [*1751.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-2 +1F70C ; [*1752.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR-3 +1F70D ; [*1753.0020.0002] # ALCHEMICAL SYMBOL FOR SULFUR +1F70E ; [*1754.0020.0002] # ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR +1F70F ; [*1755.0020.0002] # ALCHEMICAL SYMBOL FOR BLACK SULFUR +1F710 ; [*1756.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE +1F711 ; [*1757.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 +1F712 ; [*1758.0020.0002] # ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 +1F713 ; [*1759.0020.0002] # ALCHEMICAL SYMBOL FOR CINNABAR +1F714 ; [*175A.0020.0002] # ALCHEMICAL SYMBOL FOR SALT +1F715 ; [*175B.0020.0002] # ALCHEMICAL SYMBOL FOR NITRE +1F716 ; [*175C.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL +1F717 ; [*175D.0020.0002] # ALCHEMICAL SYMBOL FOR VITRIOL-2 +1F718 ; [*175E.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT +1F719 ; [*175F.0020.0002] # ALCHEMICAL SYMBOL FOR ROCK SALT-2 +1F71A ; [*1760.0020.0002] # ALCHEMICAL SYMBOL FOR GOLD +1F71B ; [*1761.0020.0002] # ALCHEMICAL SYMBOL FOR SILVER +1F71C ; [*1762.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE +1F71D ; [*1763.0020.0002] # ALCHEMICAL SYMBOL FOR IRON ORE-2 +1F71E ; [*1764.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF IRON +1F71F ; [*1765.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF IRON +1F720 ; [*1766.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ORE +1F721 ; [*1767.0020.0002] # ALCHEMICAL SYMBOL FOR IRON-COPPER ORE +1F722 ; [*1768.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER +1F723 ; [*1769.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER +1F724 ; [*176A.0020.0002] # ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 +1F725 ; [*176B.0020.0002] # ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE +1F726 ; [*176C.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE +1F727 ; [*176D.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER +1F728 ; [*176E.0020.0002] # ALCHEMICAL SYMBOL FOR VERDIGRIS +1F729 ; [*176F.0020.0002] # ALCHEMICAL SYMBOL FOR TIN ORE +1F72A ; [*1770.0020.0002] # ALCHEMICAL SYMBOL FOR LEAD ORE +1F72B ; [*1771.0020.0002] # ALCHEMICAL SYMBOL FOR ANTIMONY ORE +1F72C ; [*1772.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY +1F72D ; [*1773.0020.0002] # ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY +1F72E ; [*1774.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY +1F72F ; [*1775.0020.0002] # ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY +1F730 ; [*1776.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY +1F731 ; [*1777.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 +1F732 ; [*1778.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS +1F733 ; [*1779.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-2 +1F734 ; [*177A.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-3 +1F735 ; [*177B.0020.0002] # ALCHEMICAL SYMBOL FOR REGULUS-4 +1F736 ; [*177C.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI +1F737 ; [*177D.0020.0002] # ALCHEMICAL SYMBOL FOR ALKALI-2 +1F738 ; [*177E.0020.0002] # ALCHEMICAL SYMBOL FOR MARCASITE +1F739 ; [*177F.0020.0002] # ALCHEMICAL SYMBOL FOR SAL-AMMONIAC +1F73A ; [*1780.0020.0002] # ALCHEMICAL SYMBOL FOR ARSENIC +1F73B ; [*1781.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR +1F73C ; [*1782.0020.0002] # ALCHEMICAL SYMBOL FOR REALGAR-2 +1F73D ; [*1783.0020.0002] # ALCHEMICAL SYMBOL FOR AURIPIGMENT +1F73E ; [*1784.0020.0002] # ALCHEMICAL SYMBOL FOR BISMUTH ORE +1F73F ; [*1785.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR +1F740 ; [*1786.0020.0002] # ALCHEMICAL SYMBOL FOR TARTAR-2 +1F741 ; [*1787.0020.0002] # ALCHEMICAL SYMBOL FOR QUICK LIME +1F742 ; [*1788.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX +1F743 ; [*1789.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-2 +1F744 ; [*178A.0020.0002] # ALCHEMICAL SYMBOL FOR BORAX-3 +1F745 ; [*178B.0020.0002] # ALCHEMICAL SYMBOL FOR ALUM +1F746 ; [*178C.0020.0002] # ALCHEMICAL SYMBOL FOR OIL +1F747 ; [*178D.0020.0002] # ALCHEMICAL SYMBOL FOR SPIRIT +1F748 ; [*178E.0020.0002] # ALCHEMICAL SYMBOL FOR TINCTURE +1F749 ; [*178F.0020.0002] # ALCHEMICAL SYMBOL FOR GUM +1F74A ; [*1790.0020.0002] # ALCHEMICAL SYMBOL FOR WAX +1F74B ; [*1791.0020.0002] # ALCHEMICAL SYMBOL FOR POWDER +1F74C ; [*1792.0020.0002] # ALCHEMICAL SYMBOL FOR CALX +1F74D ; [*1793.0020.0002] # ALCHEMICAL SYMBOL FOR TUTTY +1F74E ; [*1794.0020.0002] # ALCHEMICAL SYMBOL FOR CAPUT MORTUUM +1F74F ; [*1795.0020.0002] # ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE +1F750 ; [*1796.0020.0002] # ALCHEMICAL SYMBOL FOR CADUCEUS +1F751 ; [*1797.0020.0002] # ALCHEMICAL SYMBOL FOR TRIDENT +1F752 ; [*1798.0020.0002] # ALCHEMICAL SYMBOL FOR STARRED TRIDENT +1F753 ; [*1799.0020.0002] # ALCHEMICAL SYMBOL FOR LODESTONE +1F754 ; [*179A.0020.0002] # ALCHEMICAL SYMBOL FOR SOAP +1F755 ; [*179B.0020.0002] # ALCHEMICAL SYMBOL FOR URINE +1F756 ; [*179C.0020.0002] # ALCHEMICAL SYMBOL FOR HORSE DUNG +1F757 ; [*179D.0020.0002] # ALCHEMICAL SYMBOL FOR ASHES +1F758 ; [*179E.0020.0002] # ALCHEMICAL SYMBOL FOR POT ASHES +1F759 ; [*179F.0020.0002] # ALCHEMICAL SYMBOL FOR BRICK +1F75A ; [*17A0.0020.0002] # ALCHEMICAL SYMBOL FOR POWDERED BRICK +1F75B ; [*17A1.0020.0002] # ALCHEMICAL SYMBOL FOR AMALGAM +1F75C ; [*17A2.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM +1F75D ; [*17A3.0020.0002] # ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 +1F75E ; [*17A4.0020.0002] # ALCHEMICAL SYMBOL FOR SUBLIMATION +1F75F ; [*17A5.0020.0002] # ALCHEMICAL SYMBOL FOR PRECIPITATE +1F760 ; [*17A6.0020.0002] # ALCHEMICAL SYMBOL FOR DISTILL +1F761 ; [*17A7.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE +1F762 ; [*17A8.0020.0002] # ALCHEMICAL SYMBOL FOR DISSOLVE-2 +1F763 ; [*17A9.0020.0002] # ALCHEMICAL SYMBOL FOR PURIFY +1F764 ; [*17AA.0020.0002] # ALCHEMICAL SYMBOL FOR PUTREFACTION +1F765 ; [*17AB.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE +1F766 ; [*17AC.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-2 +1F767 ; [*17AD.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-3 +1F768 ; [*17AE.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-4 +1F769 ; [*17AF.0020.0002] # ALCHEMICAL SYMBOL FOR CRUCIBLE-5 +1F76A ; [*17B0.0020.0002] # ALCHEMICAL SYMBOL FOR ALEMBIC +1F76B ; [*17B1.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF MARY +1F76C ; [*17B2.0020.0002] # ALCHEMICAL SYMBOL FOR BATH OF VAPOURS +1F76D ; [*17B3.0020.0002] # ALCHEMICAL SYMBOL FOR RETORT +1F76E ; [*17B4.0020.0002] # ALCHEMICAL SYMBOL FOR HOUR +1F76F ; [*17B5.0020.0002] # ALCHEMICAL SYMBOL FOR NIGHT +1F770 ; [*17B6.0020.0002] # ALCHEMICAL SYMBOL FOR DAY-NIGHT +1F771 ; [*17B7.0020.0002] # ALCHEMICAL SYMBOL FOR MONTH +1F772 ; [*17B8.0020.0002] # ALCHEMICAL SYMBOL FOR HALF DRAM +1F773 ; [*17B9.0020.0002] # ALCHEMICAL SYMBOL FOR HALF OUNCE +1F780 ; [*17BA.0020.0002] # BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE +1F781 ; [*17BB.0020.0002] # BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE +1F782 ; [*17BC.0020.0002] # BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE +1F783 ; [*17BD.0020.0002] # BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE +1F784 ; [*17BE.0020.0002] # BLACK SLIGHTLY SMALL CIRCLE +1F785 ; [*17BF.0020.0002] # MEDIUM BOLD WHITE CIRCLE +1F786 ; [*17C0.0020.0002] # BOLD WHITE CIRCLE +1F787 ; [*17C1.0020.0002] # HEAVY WHITE CIRCLE +1F788 ; [*17C2.0020.0002] # VERY HEAVY WHITE CIRCLE +1F789 ; [*17C3.0020.0002] # EXTREMELY HEAVY WHITE CIRCLE +1F78A ; [*17C4.0020.0002] # WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE +1F78B ; [*17C5.0020.0002] # ROUND TARGET +1F78C ; [*17C6.0020.0002] # BLACK TINY SQUARE +1F78D ; [*17C7.0020.0002] # BLACK SLIGHTLY SMALL SQUARE +1F78E ; [*17C8.0020.0002] # LIGHT WHITE SQUARE +1F78F ; [*17C9.0020.0002] # MEDIUM WHITE SQUARE +1F790 ; [*17CA.0020.0002] # BOLD WHITE SQUARE +1F791 ; [*17CB.0020.0002] # HEAVY WHITE SQUARE +1F792 ; [*17CC.0020.0002] # VERY HEAVY WHITE SQUARE +1F793 ; [*17CD.0020.0002] # EXTREMELY HEAVY WHITE SQUARE +1F794 ; [*17CE.0020.0002] # WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE +1F795 ; [*17CF.0020.0002] # WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE +1F796 ; [*17D0.0020.0002] # SQUARE TARGET +1F797 ; [*17D1.0020.0002] # BLACK TINY DIAMOND +1F798 ; [*17D2.0020.0002] # BLACK VERY SMALL DIAMOND +1F799 ; [*17D3.0020.0002] # BLACK MEDIUM SMALL DIAMOND +1F79A ; [*17D4.0020.0002] # WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND +1F79B ; [*17D5.0020.0002] # WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND +1F79C ; [*17D6.0020.0002] # DIAMOND TARGET +1F79D ; [*17D7.0020.0002] # BLACK TINY LOZENGE +1F79E ; [*17D8.0020.0002] # BLACK VERY SMALL LOZENGE +1F79F ; [*17D9.0020.0002] # BLACK MEDIUM SMALL LOZENGE +1F7A0 ; [*17DA.0020.0002] # WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE +1F7A1 ; [*17DB.0020.0002] # THIN GREEK CROSS +1F7A2 ; [*17DC.0020.0002] # LIGHT GREEK CROSS +1F7A3 ; [*17DD.0020.0002] # MEDIUM GREEK CROSS +1F7A4 ; [*17DE.0020.0002] # BOLD GREEK CROSS +1F7A5 ; [*17DF.0020.0002] # VERY BOLD GREEK CROSS +1F7A6 ; [*17E0.0020.0002] # VERY HEAVY GREEK CROSS +1F7A7 ; [*17E1.0020.0002] # EXTREMELY HEAVY GREEK CROSS +1F7A8 ; [*17E2.0020.0002] # THIN SALTIRE +1F7A9 ; [*17E3.0020.0002] # LIGHT SALTIRE +1F7AA ; [*17E4.0020.0002] # MEDIUM SALTIRE +1F7AB ; [*17E5.0020.0002] # BOLD SALTIRE +1F7AC ; [*17E6.0020.0002] # HEAVY SALTIRE +1F7AD ; [*17E7.0020.0002] # VERY HEAVY SALTIRE +1F7AE ; [*17E8.0020.0002] # EXTREMELY HEAVY SALTIRE +1F7AF ; [*17E9.0020.0002] # LIGHT FIVE SPOKED ASTERISK +1F7B0 ; [*17EA.0020.0002] # MEDIUM FIVE SPOKED ASTERISK +1F7B1 ; [*17EB.0020.0002] # BOLD FIVE SPOKED ASTERISK +1F7B2 ; [*17EC.0020.0002] # HEAVY FIVE SPOKED ASTERISK +1F7B3 ; [*17ED.0020.0002] # VERY HEAVY FIVE SPOKED ASTERISK +1F7B4 ; [*17EE.0020.0002] # EXTREMELY HEAVY FIVE SPOKED ASTERISK +1F7B5 ; [*17EF.0020.0002] # LIGHT SIX SPOKED ASTERISK +1F7B6 ; [*17F0.0020.0002] # MEDIUM SIX SPOKED ASTERISK +1F7B7 ; [*17F1.0020.0002] # BOLD SIX SPOKED ASTERISK +1F7B8 ; [*17F2.0020.0002] # HEAVY SIX SPOKED ASTERISK +1F7B9 ; [*17F3.0020.0002] # VERY HEAVY SIX SPOKED ASTERISK +1F7BA ; [*17F4.0020.0002] # EXTREMELY HEAVY SIX SPOKED ASTERISK +1F7BB ; [*17F5.0020.0002] # LIGHT EIGHT SPOKED ASTERISK +1F7BC ; [*17F6.0020.0002] # MEDIUM EIGHT SPOKED ASTERISK +1F7BD ; [*17F7.0020.0002] # BOLD EIGHT SPOKED ASTERISK +1F7BE ; [*17F8.0020.0002] # HEAVY EIGHT SPOKED ASTERISK +1F7BF ; [*17F9.0020.0002] # VERY HEAVY EIGHT SPOKED ASTERISK +1F7C0 ; [*17FA.0020.0002] # LIGHT THREE POINTED BLACK STAR +1F7C1 ; [*17FB.0020.0002] # MEDIUM THREE POINTED BLACK STAR +1F7C2 ; [*17FC.0020.0002] # THREE POINTED BLACK STAR +1F7C3 ; [*17FD.0020.0002] # MEDIUM THREE POINTED PINWHEEL STAR +1F7C4 ; [*17FE.0020.0002] # LIGHT FOUR POINTED BLACK STAR +1F7C5 ; [*17FF.0020.0002] # MEDIUM FOUR POINTED BLACK STAR +1F7C6 ; [*1800.0020.0002] # FOUR POINTED BLACK STAR +1F7C7 ; [*1801.0020.0002] # MEDIUM FOUR POINTED PINWHEEL STAR +1F7C8 ; [*1802.0020.0002] # REVERSE LIGHT FOUR POINTED PINWHEEL STAR +1F7C9 ; [*1803.0020.0002] # LIGHT FIVE POINTED BLACK STAR +1F7CA ; [*1804.0020.0002] # HEAVY FIVE POINTED BLACK STAR +1F7CB ; [*1805.0020.0002] # MEDIUM SIX POINTED BLACK STAR +1F7CC ; [*1806.0020.0002] # HEAVY SIX POINTED BLACK STAR +1F7CD ; [*1807.0020.0002] # SIX POINTED PINWHEEL STAR +1F7CE ; [*1808.0020.0002] # MEDIUM EIGHT POINTED BLACK STAR +1F7CF ; [*1809.0020.0002] # HEAVY EIGHT POINTED BLACK STAR +1F7D0 ; [*180A.0020.0002] # VERY HEAVY EIGHT POINTED BLACK STAR +1F7D1 ; [*180B.0020.0002] # HEAVY EIGHT POINTED PINWHEEL STAR +1F7D2 ; [*180C.0020.0002] # LIGHT TWELVE POINTED BLACK STAR +1F7D3 ; [*180D.0020.0002] # HEAVY TWELVE POINTED BLACK STAR +1F7D4 ; [*180E.0020.0002] # HEAVY TWELVE POINTED PINWHEEL STAR +1F800 ; [*180F.0020.0002] # LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F801 ; [*1810.0020.0002] # UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F802 ; [*1811.0020.0002] # RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F803 ; [*1812.0020.0002] # DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F804 ; [*1813.0020.0002] # LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F805 ; [*1814.0020.0002] # UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F806 ; [*1815.0020.0002] # RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F807 ; [*1816.0020.0002] # DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F808 ; [*1817.0020.0002] # LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F809 ; [*1818.0020.0002] # UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80A ; [*1819.0020.0002] # RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80B ; [*181A.0020.0002] # DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810 ; [*181B.0020.0002] # LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F811 ; [*181C.0020.0002] # UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F812 ; [*181D.0020.0002] # RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F813 ; [*181E.0020.0002] # DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F814 ; [*181F.0020.0002] # LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F815 ; [*1820.0020.0002] # UPWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F816 ; [*1821.0020.0002] # RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F817 ; [*1822.0020.0002] # DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F818 ; [*1823.0020.0002] # HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F819 ; [*1824.0020.0002] # HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81A ; [*1825.0020.0002] # HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81B ; [*1826.0020.0002] # HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81C ; [*1827.0020.0002] # HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81D ; [*1828.0020.0002] # HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81E ; [*1829.0020.0002] # HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81F ; [*182A.0020.0002] # HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F820 ; [*182B.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F821 ; [*182C.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F822 ; [*182D.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F823 ; [*182E.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F824 ; [*182F.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F825 ; [*1830.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F826 ; [*1831.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F827 ; [*1832.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F828 ; [*1833.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F829 ; [*1834.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82A ; [*1835.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82B ; [*1836.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82C ; [*1837.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82D ; [*1838.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82E ; [*1839.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82F ; [*183A.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F830 ; [*183B.0020.0002] # LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F831 ; [*183C.0020.0002] # UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F832 ; [*183D.0020.0002] # RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F833 ; [*183E.0020.0002] # DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F834 ; [*183F.0020.0002] # LEFTWARDS FINGER-POST ARROW +1F835 ; [*1840.0020.0002] # UPWARDS FINGER-POST ARROW +1F836 ; [*1841.0020.0002] # RIGHTWARDS FINGER-POST ARROW +1F837 ; [*1842.0020.0002] # DOWNWARDS FINGER-POST ARROW +1F838 ; [*1843.0020.0002] # LEFTWARDS SQUARED ARROW +1F839 ; [*1844.0020.0002] # UPWARDS SQUARED ARROW +1F83A ; [*1845.0020.0002] # RIGHTWARDS SQUARED ARROW +1F83B ; [*1846.0020.0002] # DOWNWARDS SQUARED ARROW +1F83C ; [*1847.0020.0002] # LEFTWARDS COMPRESSED ARROW +1F83D ; [*1848.0020.0002] # UPWARDS COMPRESSED ARROW +1F83E ; [*1849.0020.0002] # RIGHTWARDS COMPRESSED ARROW +1F83F ; [*184A.0020.0002] # DOWNWARDS COMPRESSED ARROW +1F840 ; [*184B.0020.0002] # LEFTWARDS HEAVY COMPRESSED ARROW +1F841 ; [*184C.0020.0002] # UPWARDS HEAVY COMPRESSED ARROW +1F842 ; [*184D.0020.0002] # RIGHTWARDS HEAVY COMPRESSED ARROW +1F843 ; [*184E.0020.0002] # DOWNWARDS HEAVY COMPRESSED ARROW +1F844 ; [*184F.0020.0002] # LEFTWARDS HEAVY ARROW +1F845 ; [*1850.0020.0002] # UPWARDS HEAVY ARROW +1F846 ; [*1851.0020.0002] # RIGHTWARDS HEAVY ARROW +1F847 ; [*1852.0020.0002] # DOWNWARDS HEAVY ARROW +1F850 ; [*1853.0020.0002] # LEFTWARDS SANS-SERIF ARROW +1F851 ; [*1854.0020.0002] # UPWARDS SANS-SERIF ARROW +1F852 ; [*1855.0020.0002] # RIGHTWARDS SANS-SERIF ARROW +1F853 ; [*1856.0020.0002] # DOWNWARDS SANS-SERIF ARROW +1F854 ; [*1857.0020.0002] # NORTH WEST SANS-SERIF ARROW +1F855 ; [*1858.0020.0002] # NORTH EAST SANS-SERIF ARROW +1F856 ; [*1859.0020.0002] # SOUTH EAST SANS-SERIF ARROW +1F857 ; [*185A.0020.0002] # SOUTH WEST SANS-SERIF ARROW +1F858 ; [*185B.0020.0002] # LEFT RIGHT SANS-SERIF ARROW +1F859 ; [*185C.0020.0002] # UP DOWN SANS-SERIF ARROW +1F860 ; [*185D.0020.0002] # WIDE-HEADED LEFTWARDS LIGHT BARB ARROW +1F861 ; [*185E.0020.0002] # WIDE-HEADED UPWARDS LIGHT BARB ARROW +1F862 ; [*185F.0020.0002] # WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW +1F863 ; [*1860.0020.0002] # WIDE-HEADED DOWNWARDS LIGHT BARB ARROW +1F864 ; [*1861.0020.0002] # WIDE-HEADED NORTH WEST LIGHT BARB ARROW +1F865 ; [*1862.0020.0002] # WIDE-HEADED NORTH EAST LIGHT BARB ARROW +1F866 ; [*1863.0020.0002] # WIDE-HEADED SOUTH EAST LIGHT BARB ARROW +1F867 ; [*1864.0020.0002] # WIDE-HEADED SOUTH WEST LIGHT BARB ARROW +1F868 ; [*1865.0020.0002] # WIDE-HEADED LEFTWARDS BARB ARROW +1F869 ; [*1866.0020.0002] # WIDE-HEADED UPWARDS BARB ARROW +1F86A ; [*1867.0020.0002] # WIDE-HEADED RIGHTWARDS BARB ARROW +1F86B ; [*1868.0020.0002] # WIDE-HEADED DOWNWARDS BARB ARROW +1F86C ; [*1869.0020.0002] # WIDE-HEADED NORTH WEST BARB ARROW +1F86D ; [*186A.0020.0002] # WIDE-HEADED NORTH EAST BARB ARROW +1F86E ; [*186B.0020.0002] # WIDE-HEADED SOUTH EAST BARB ARROW +1F86F ; [*186C.0020.0002] # WIDE-HEADED SOUTH WEST BARB ARROW +1F870 ; [*186D.0020.0002] # WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW +1F871 ; [*186E.0020.0002] # WIDE-HEADED UPWARDS MEDIUM BARB ARROW +1F872 ; [*186F.0020.0002] # WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW +1F873 ; [*1870.0020.0002] # WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW +1F874 ; [*1871.0020.0002] # WIDE-HEADED NORTH WEST MEDIUM BARB ARROW +1F875 ; [*1872.0020.0002] # WIDE-HEADED NORTH EAST MEDIUM BARB ARROW +1F876 ; [*1873.0020.0002] # WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW +1F877 ; [*1874.0020.0002] # WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW +1F878 ; [*1875.0020.0002] # WIDE-HEADED LEFTWARDS HEAVY BARB ARROW +1F879 ; [*1876.0020.0002] # WIDE-HEADED UPWARDS HEAVY BARB ARROW +1F87A ; [*1877.0020.0002] # WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW +1F87B ; [*1878.0020.0002] # WIDE-HEADED DOWNWARDS HEAVY BARB ARROW +1F87C ; [*1879.0020.0002] # WIDE-HEADED NORTH WEST HEAVY BARB ARROW +1F87D ; [*187A.0020.0002] # WIDE-HEADED NORTH EAST HEAVY BARB ARROW +1F87E ; [*187B.0020.0002] # WIDE-HEADED SOUTH EAST HEAVY BARB ARROW +1F87F ; [*187C.0020.0002] # WIDE-HEADED SOUTH WEST HEAVY BARB ARROW +1F880 ; [*187D.0020.0002] # WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW +1F881 ; [*187E.0020.0002] # WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW +1F882 ; [*187F.0020.0002] # WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW +1F883 ; [*1880.0020.0002] # WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW +1F884 ; [*1881.0020.0002] # WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW +1F885 ; [*1882.0020.0002] # WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW +1F886 ; [*1883.0020.0002] # WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW +1F887 ; [*1884.0020.0002] # WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890 ; [*1885.0020.0002] # LEFTWARDS TRIANGLE ARROWHEAD +1F891 ; [*1886.0020.0002] # UPWARDS TRIANGLE ARROWHEAD +1F892 ; [*1887.0020.0002] # RIGHTWARDS TRIANGLE ARROWHEAD +1F893 ; [*1888.0020.0002] # DOWNWARDS TRIANGLE ARROWHEAD +1F894 ; [*1889.0020.0002] # LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F895 ; [*188A.0020.0002] # UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F896 ; [*188B.0020.0002] # RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F897 ; [*188C.0020.0002] # DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F898 ; [*188D.0020.0002] # LEFTWARDS ARROW WITH NOTCHED TAIL +1F899 ; [*188E.0020.0002] # UPWARDS ARROW WITH NOTCHED TAIL +1F89A ; [*188F.0020.0002] # RIGHTWARDS ARROW WITH NOTCHED TAIL +1F89B ; [*1890.0020.0002] # DOWNWARDS ARROW WITH NOTCHED TAIL +1F89C ; [*1891.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE +1F89D ; [*1892.0020.0002] # HEAVY ARROW SHAFT WIDTH TWO THIRDS +1F89E ; [*1893.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE HALF +1F89F ; [*1894.0020.0002] # HEAVY ARROW SHAFT WIDTH ONE THIRD +1F8A0 ; [*1895.0020.0002] # LEFTWARDS BOTTOM-SHADED WHITE ARROW +1F8A1 ; [*1896.0020.0002] # RIGHTWARDS BOTTOM SHADED WHITE ARROW +1F8A2 ; [*1897.0020.0002] # LEFTWARDS TOP SHADED WHITE ARROW +1F8A3 ; [*1898.0020.0002] # RIGHTWARDS TOP SHADED WHITE ARROW +1F8A4 ; [*1899.0020.0002] # LEFTWARDS LEFT-SHADED WHITE ARROW +1F8A5 ; [*189A.0020.0002] # RIGHTWARDS RIGHT-SHADED WHITE ARROW +1F8A6 ; [*189B.0020.0002] # LEFTWARDS RIGHT-SHADED WHITE ARROW +1F8A7 ; [*189C.0020.0002] # RIGHTWARDS LEFT-SHADED WHITE ARROW +1F8A8 ; [*189D.0020.0002] # LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW +1F8A9 ; [*189E.0020.0002] # RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW +1F8AA ; [*189F.0020.0002] # LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW +1F8AB ; [*18A0.0020.0002] # RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW +1F8AC ; [*18A1.0020.0002] # WHITE ARROW SHAFT WIDTH ONE +1F8AD ; [*18A2.0020.0002] # WHITE ARROW SHAFT WIDTH TWO THIRDS +1F900 ; [*15C7.0020.0002] # CIRCLED CROSS FORMEE WITH FOUR DOTS +1F901 ; [*15C8.0020.0002] # CIRCLED CROSS FORMEE WITH TWO DOTS +1F902 ; [*15C9.0020.0002] # CIRCLED CROSS FORMEE +1F903 ; [*15CA.0020.0002] # LEFT HALF CIRCLE WITH FOUR DOTS +1F904 ; [*15CB.0020.0002] # LEFT HALF CIRCLE WITH THREE DOTS +1F905 ; [*15CC.0020.0002] # LEFT HALF CIRCLE WITH TWO DOTS +1F906 ; [*15CD.0020.0002] # LEFT HALF CIRCLE WITH DOT +1F907 ; [*15CE.0020.0002] # LEFT HALF CIRCLE +1F908 ; [*15CF.0020.0002] # DOWNWARD FACING HOOK +1F909 ; [*15D0.0020.0002] # DOWNWARD FACING NOTCHED HOOK +1F90A ; [*15D1.0020.0002] # DOWNWARD FACING HOOK WITH DOT +1F90B ; [*15D2.0020.0002] # DOWNWARD FACING NOTCHED HOOK WITH DOT +1F910 ; [*15D3.0020.0002] # ZIPPER-MOUTH FACE +1F911 ; [*15D4.0020.0002] # MONEY-MOUTH FACE +1F912 ; [*15D5.0020.0002] # FACE WITH THERMOMETER +1F913 ; [*15D6.0020.0002] # NERD FACE +1F914 ; [*15D7.0020.0002] # THINKING FACE +1F915 ; [*15D8.0020.0002] # FACE WITH HEAD-BANDAGE +1F916 ; [*15D9.0020.0002] # ROBOT FACE +1F917 ; [*15DA.0020.0002] # HUGGING FACE +1F918 ; [*15DB.0020.0002] # SIGN OF THE HORNS +1F919 ; [*15DC.0020.0002] # CALL ME HAND +1F91A ; [*15DD.0020.0002] # RAISED BACK OF HAND +1F91B ; [*15DE.0020.0002] # LEFT-FACING FIST +1F91C ; [*15DF.0020.0002] # RIGHT-FACING FIST +1F91D ; [*15E0.0020.0002] # HANDSHAKE +1F91E ; [*15E1.0020.0002] # HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F91F ; [*15E2.0020.0002] # I LOVE YOU HAND SIGN +1F920 ; [*15E3.0020.0002] # FACE WITH COWBOY HAT +1F921 ; [*15E4.0020.0002] # CLOWN FACE +1F922 ; [*15E5.0020.0002] # NAUSEATED FACE +1F923 ; [*15E6.0020.0002] # ROLLING ON THE FLOOR LAUGHING +1F924 ; [*15E7.0020.0002] # DROOLING FACE +1F925 ; [*15E8.0020.0002] # LYING FACE +1F926 ; [*15E9.0020.0002] # FACE PALM +1F927 ; [*15EA.0020.0002] # SNEEZING FACE +1F928 ; [*15EB.0020.0002] # FACE WITH ONE EYEBROW RAISED +1F929 ; [*15EC.0020.0002] # GRINNING FACE WITH STAR EYES +1F92A ; [*15ED.0020.0002] # GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE +1F92B ; [*15EE.0020.0002] # FACE WITH FINGER COVERING CLOSED LIPS +1F92C ; [*15EF.0020.0002] # SERIOUS FACE WITH SYMBOLS COVERING MOUTH +1F92D ; [*15F0.0020.0002] # SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH +1F92E ; [*15F1.0020.0002] # FACE WITH OPEN MOUTH VOMITING +1F92F ; [*15F2.0020.0002] # SHOCKED FACE WITH EXPLODING HEAD +1F930 ; [*15F3.0020.0002] # PREGNANT WOMAN +1F931 ; [*15F4.0020.0002] # BREAST-FEEDING +1F932 ; [*15F5.0020.0002] # PALMS UP TOGETHER +1F933 ; [*15F6.0020.0002] # SELFIE +1F934 ; [*15F7.0020.0002] # PRINCE +1F935 ; [*15F8.0020.0002] # MAN IN TUXEDO +1F936 ; [*15F9.0020.0002] # MOTHER CHRISTMAS +1F937 ; [*15FA.0020.0002] # SHRUG +1F938 ; [*15FB.0020.0002] # PERSON DOING CARTWHEEL +1F939 ; [*15FC.0020.0002] # JUGGLING +1F93A ; [*15FD.0020.0002] # FENCER +1F93B ; [*15FE.0020.0002] # MODERN PENTATHLON +1F93C ; [*15FF.0020.0002] # WRESTLERS +1F93D ; [*1600.0020.0002] # WATER POLO +1F93E ; [*1601.0020.0002] # HANDBALL +1F940 ; [*1602.0020.0002] # WILTED FLOWER +1F941 ; [*1603.0020.0002] # DRUM WITH DRUMSTICKS +1F942 ; [*1604.0020.0002] # CLINKING GLASSES +1F943 ; [*1605.0020.0002] # TUMBLER GLASS +1F944 ; [*1606.0020.0002] # SPOON +1F945 ; [*1607.0020.0002] # GOAL NET +1F946 ; [*1608.0020.0002] # RIFLE +1F947 ; [*1609.0020.0002] # FIRST PLACE MEDAL +1F948 ; [*160A.0020.0002] # SECOND PLACE MEDAL +1F949 ; [*160B.0020.0002] # THIRD PLACE MEDAL +1F94A ; [*160C.0020.0002] # BOXING GLOVE +1F94B ; [*160D.0020.0002] # MARTIAL ARTS UNIFORM +1F94C ; [*160E.0020.0002] # CURLING STONE +1F950 ; [*160F.0020.0002] # CROISSANT +1F951 ; [*1610.0020.0002] # AVOCADO +1F952 ; [*1611.0020.0002] # CUCUMBER +1F953 ; [*1612.0020.0002] # BACON +1F954 ; [*1613.0020.0002] # POTATO +1F955 ; [*1614.0020.0002] # CARROT +1F956 ; [*1615.0020.0002] # BAGUETTE BREAD +1F957 ; [*1616.0020.0002] # GREEN SALAD +1F958 ; [*1617.0020.0002] # SHALLOW PAN OF FOOD +1F959 ; [*1618.0020.0002] # STUFFED FLATBREAD +1F95A ; [*1619.0020.0002] # EGG +1F95B ; [*161A.0020.0002] # GLASS OF MILK +1F95C ; [*161B.0020.0002] # PEANUTS +1F95D ; [*161C.0020.0002] # KIWIFRUIT +1F95E ; [*161D.0020.0002] # PANCAKES +1F95F ; [*161E.0020.0002] # DUMPLING +1F960 ; [*161F.0020.0002] # FORTUNE COOKIE +1F961 ; [*1620.0020.0002] # TAKEOUT BOX +1F962 ; [*1621.0020.0002] # CHOPSTICKS +1F963 ; [*1622.0020.0002] # BOWL WITH SPOON +1F964 ; [*1623.0020.0002] # CUP WITH STRAW +1F965 ; [*1624.0020.0002] # COCONUT +1F966 ; [*1625.0020.0002] # BROCCOLI +1F967 ; [*1626.0020.0002] # PIE +1F968 ; [*1627.0020.0002] # PRETZEL +1F969 ; [*1628.0020.0002] # CUT OF MEAT +1F96A ; [*1629.0020.0002] # SANDWICH +1F96B ; [*162A.0020.0002] # CANNED FOOD +1F980 ; [*162B.0020.0002] # CRAB +1F981 ; [*162C.0020.0002] # LION FACE +1F982 ; [*162D.0020.0002] # SCORPION +1F983 ; [*162E.0020.0002] # TURKEY +1F984 ; [*162F.0020.0002] # UNICORN FACE +1F985 ; [*1630.0020.0002] # EAGLE +1F986 ; [*1631.0020.0002] # DUCK +1F987 ; [*1632.0020.0002] # BAT +1F988 ; [*1633.0020.0002] # SHARK +1F989 ; [*1634.0020.0002] # OWL +1F98A ; [*1635.0020.0002] # FOX FACE +1F98B ; [*1636.0020.0002] # BUTTERFLY +1F98C ; [*1637.0020.0002] # DEER +1F98D ; [*1638.0020.0002] # GORILLA +1F98E ; [*1639.0020.0002] # LIZARD +1F98F ; [*163A.0020.0002] # RHINOCEROS +1F990 ; [*163B.0020.0002] # SHRIMP +1F991 ; [*163C.0020.0002] # SQUID +1F992 ; [*163D.0020.0002] # GIRAFFE FACE +1F993 ; [*163E.0020.0002] # ZEBRA FACE +1F994 ; [*163F.0020.0002] # HEDGEHOG +1F995 ; [*1640.0020.0002] # SAUROPOD +1F996 ; [*1641.0020.0002] # T-REX +1F997 ; [*1642.0020.0002] # CRICKET +1F9C0 ; [*1643.0020.0002] # CHEESE WEDGE +1F9D0 ; [*1644.0020.0002] # FACE WITH MONOCLE +1F9D1 ; [*1645.0020.0002] # ADULT +1F9D2 ; [*1646.0020.0002] # CHILD +1F9D3 ; [*1647.0020.0002] # OLDER ADULT +1F9D4 ; [*1648.0020.0002] # BEARDED PERSON +1F9D5 ; [*1649.0020.0002] # PERSON WITH HEADSCARF +1F9D6 ; [*164A.0020.0002] # PERSON IN STEAMY ROOM +1F9D7 ; [*164B.0020.0002] # PERSON CLIMBING +1F9D8 ; [*164C.0020.0002] # PERSON IN LOTUS POSITION +1F9D9 ; [*164D.0020.0002] # MAGE +1F9DA ; [*164E.0020.0002] # FAIRY +1F9DB ; [*164F.0020.0002] # VAMPIRE +1F9DC ; [*1650.0020.0002] # MERPERSON +1F9DD ; [*1651.0020.0002] # ELF +1F9DE ; [*1652.0020.0002] # GENIE +1F9DF ; [*1653.0020.0002] # ZOMBIE +1F9E0 ; [*1654.0020.0002] # BRAIN +1F9E1 ; [*1655.0020.0002] # ORANGE HEART +1F9E2 ; [*1656.0020.0002] # BILLED CAP +1F9E3 ; [*1657.0020.0002] # SCARF +1F9E4 ; [*1658.0020.0002] # GLOVES +1F9E5 ; [*1659.0020.0002] # COAT +1F9E6 ; [*165A.0020.0002] # SOCKS 0332 ; [.0000.0021.0002] # COMBINING LOW LINE 0313 ; [.0000.0022.0002] # COMBINING COMMA ABOVE 0343 ; [.0000.0022.0002] # COMBINING GREEK KORONIS @@ -7832,6 +7935,9 @@ FFFC ; [*1A95.0020.0002] # OBJECT REPLACEMENT CHARACTER 1DCE ; [.0000.0033.0002] # COMBINING OGONEK ABOVE 1DD1 ; [.0000.0033.0002] # COMBINING UR ABOVE 1DF5 ; [.0000.0033.0002] # COMBINING UP TACK ABOVE +1DF6 ; [.0000.0033.0002] # COMBINING KAVYKA ABOVE RIGHT +1DF7 ; [.0000.0033.0002] # COMBINING KAVYKA ABOVE LEFT +1DF8 ; [.0000.0033.0002] # COMBINING DOT ABOVE LEFT 1DFB ; [.0000.0033.0002] # COMBINING DELETION MARK 1DFE ; [.0000.0033.0002] # COMBINING LEFT ARROWHEAD ABOVE 20F0 ; [.0000.0033.0002] # COMBINING ASTERISK ABOVE @@ -7887,6 +7993,7 @@ A67D ; [.0000.0033.0002] # COMBINING CYRILLIC PAYEROK 1DC2 ; [.0000.0034.0002] # COMBINING SNAKE BELOW 1DCF ; [.0000.0034.0002] # COMBINING ZIGZAG BELOW 1DD0 ; [.0000.0034.0002] # COMBINING IS BELOW +1DF9 ; [.0000.0034.0002] # COMBINING WIDE INVERTED BRIDGE BELOW 1DFC ; [.0000.0034.0002] # COMBINING DOUBLE INVERTED BREVE BELOW 1DFD ; [.0000.0034.0002] # COMBINING ALMOST EQUAL TO BELOW 1DFF ; [.0000.0034.0002] # COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW @@ -8023,15 +8130,18 @@ FC62 ; [.0000.007D.001A][.0000.0080.001A] # ARABIC LIGATURE SHADDA WITH KASRA I 08E6 ; [.0000.007E.0002] # ARABIC CURLY KASRA 08F6 ; [.0000.007F.0002] # ARABIC KASRA WITH DOT BELOW 0651 ; [.0000.0080.0002] # ARABIC SHADDA +0AFB ; [.0000.0080.0002] # GUJARATI SIGN SHADDA 11237 ; [.0000.0080.0002] # KHOJKI SIGN SHADDA FE7D ; [.0000.0080.0018] # ARABIC SHADDA MEDIAL FORM FE7C ; [.0000.0080.001A] # ARABIC SHADDA ISOLATED FORM FC63 ; [.0000.0080.001A][.0000.0098.001A] # ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM 0652 ; [.0000.0081.0002] # ARABIC SUKUN +0AFA ; [.0000.0081.0002] # GUJARATI SIGN SUKUN 1123E ; [.0000.0081.0002] # KHOJKI SIGN SUKUN FE7F ; [.0000.0081.0018] # ARABIC SUKUN MEDIAL FORM FE7E ; [.0000.0081.001A] # ARABIC SUKUN ISOLATED FORM 0653 ; [.0000.0082.0002] # ARABIC MADDAH ABOVE +0AFC ; [.0000.0082.0002] # GUJARATI SIGN MADDAH 0654 ; [.0000.0083.0002] # ARABIC HAMZA ABOVE 0655 ; [.0000.0084.0002] # ARABIC HAMZA BELOW 065F ; [.0000.0085.0002] # ARABIC WAVY HAMZA BELOW @@ -8101,6 +8211,9 @@ A6F1 ; [.0000.00B7.0002] # BAMUM COMBINING MARK TUKWENTIS 09BC ; [.0000.00C2.0002] # BENGALI SIGN NUKTA 0A3C ; [.0000.00C2.0002] # GURMUKHI SIGN NUKTA 0ABC ; [.0000.00C2.0002] # GUJARATI SIGN NUKTA +0AFD ; [.0000.00C2.0002] # GUJARATI SIGN THREE-DOT NUKTA ABOVE +0AFE ; [.0000.00C2.0002] # GUJARATI SIGN CIRCLE NUKTA ABOVE +0AFF ; [.0000.00C2.0002] # GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 0B3C ; [.0000.00C2.0002] # ORIYA SIGN NUKTA 0CBC ; [.0000.00C2.0002] # KANNADA SIGN NUKTA 1B34 ; [.0000.00C2.0002] # BALINESE SIGN REREKAN @@ -8117,6 +8230,8 @@ A9B3 ; [.0000.00C2.0002] # JAVANESE SIGN CECAK TELU 114C3 ; [.0000.00C2.0002] # TIRHUTA SIGN NUKTA 115C0 ; [.0000.00C2.0002] # SIDDHAM SIGN NUKTA 116B7 ; [.0000.00C2.0002] # TAKRI SIGN NUKTA +11A33 ; [.0000.00C2.0002] # ZANABAZAR SQUARE FINAL CONSONANT MARK +11D42 ; [.0000.00C2.0002] # MASARAM GONDI SIGN NUKTA 0900 ; [.0000.00C3.0002] # DEVANAGARI SIGN INVERTED CANDRABINDU 0901 ; [.0000.00C3.0002] # DEVANAGARI SIGN CANDRABINDU 0981 ; [.0000.00C3.0002] # BENGALI SIGN CANDRABINDU @@ -8140,8 +8255,12 @@ A980 ; [.0000.00C3.0002] # JAVANESE SIGN PANYANGGA 114BF ; [.0000.00C3.0002] # TIRHUTA SIGN CANDRABINDU 115BC ; [.0000.00C3.0002] # SIDDHAM SIGN CANDRABINDU 11640 ; [.0000.00C3.0002] # MODI SIGN ARDHACANDRA +11A35 ; [.0000.00C3.0002] # ZANABAZAR SQUARE SIGN CANDRABINDU +11A36 ; [.0000.00C3.0002] # ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT +11A37 ; [.0000.00C3.0002] # ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT 11C3C ; [.0000.00C3.0002] # BHAIKSUKI SIGN CANDRABINDU 11CB6 ; [.0000.00C3.0002] # MARCHEN SIGN CANDRABINDU +11D43 ; [.0000.00C3.0002] # MASARAM GONDI SIGN CANDRA 0902 ; [.0000.00C4.0002] # DEVANAGARI SIGN ANUSVARA 0982 ; [.0000.00C4.0002] # BENGALI SIGN ANUSVARA 0A02 ; [.0000.00C4.0002] # GURMUKHI SIGN BINDI @@ -8150,6 +8269,7 @@ A980 ; [.0000.00C3.0002] # JAVANESE SIGN PANYANGGA 0B82 ; [.0000.00C4.0002] # TAMIL SIGN ANUSVARA 0C02 ; [.0000.00C4.0002] # TELUGU SIGN ANUSVARA 0C82 ; [.0000.00C4.0002] # KANNADA SIGN ANUSVARA +0D00 ; [.0000.00C4.0002] # MALAYALAM SIGN COMBINING ANUSVARA ABOVE 0D02 ; [.0000.00C4.0002] # MALAYALAM SIGN ANUSVARA 0D82 ; [.0000.00C4.0002] # SINHALA SIGN ANUSVARAYA 0F7E ; [.0000.00C4.0002] # TIBETAN SIGN RJES SU NGA RO @@ -8176,8 +8296,11 @@ A981 ; [.0000.00C4.0002] # JAVANESE SIGN CECAK 115BD ; [.0000.00C4.0002] # SIDDHAM SIGN ANUSVARA 1163D ; [.0000.00C4.0002] # MODI SIGN ANUSVARA 116AB ; [.0000.00C4.0002] # TAKRI SIGN ANUSVARA +11A38 ; [.0000.00C4.0002] # ZANABAZAR SQUARE SIGN ANUSVARA +11A96 ; [.0000.00C4.0002] # SOYOMBO SIGN ANUSVARA 11C3D ; [.0000.00C4.0002] # BHAIKSUKI SIGN ANUSVARA 11CB5 ; [.0000.00C4.0002] # MARCHEN SIGN ANUSVARA +11D40 ; [.0000.00C4.0002] # MASARAM GONDI SIGN ANUSVARA 0903 ; [.0000.00C5.0002] # DEVANAGARI SIGN VISARGA 0983 ; [.0000.00C5.0002] # BENGALI SIGN VISARGA 0A03 ; [.0000.00C5.0002] # GURMUKHI SIGN VISARGA @@ -8207,7 +8330,10 @@ A983 ; [.0000.00C5.0002] # JAVANESE SIGN WIGNYAN 115BE ; [.0000.00C5.0002] # SIDDHAM SIGN VISARGA 1163E ; [.0000.00C5.0002] # MODI SIGN VISARGA 116AC ; [.0000.00C5.0002] # TAKRI SIGN VISARGA +11A39 ; [.0000.00C5.0002] # ZANABAZAR SQUARE SIGN VISARGA +11A97 ; [.0000.00C5.0002] # SOYOMBO SIGN VISARGA 11C3E ; [.0000.00C5.0002] # BHAIKSUKI SIGN VISARGA +11D41 ; [.0000.00C5.0002] # MASARAM GONDI SIGN VISARGA 0A70 ; [.0000.00C6.0002] # GURMUKHI TIPPI 0A71 ; [.0000.00C7.0002] # GURMUKHI ADDAK 1B03 ; [.0000.00C8.0002] # BALINESE SIGN SURANG @@ -8219,20983 +8345,21487 @@ ABEC ; [.0000.00CB.0002] # MEETEI MAYEK LUM IYEK 10A3A ; [.0000.00CE.0002] # KHAROSHTHI SIGN DOT BELOW 111CB ; [.0000.00CF.0002] # SHARADA VOWEL MODIFIER MARK 111CC ; [.0000.00D0.0002] # SHARADA EXTRA SHORT VOWEL MARK -0E4E ; [.0000.00D1.0002] # THAI CHARACTER YAMAKKAN -0E47 ; [.0000.00D2.0002] # THAI CHARACTER MAITAIKHU -0E48 ; [.0000.00D3.0002] # THAI CHARACTER MAI EK -0E49 ; [.0000.00D4.0002] # THAI CHARACTER MAI THO -0E4A ; [.0000.00D5.0002] # THAI CHARACTER MAI TRI -0E4B ; [.0000.00D6.0002] # THAI CHARACTER MAI CHATTAWA -0E4C ; [.0000.00D7.0002] # THAI CHARACTER THANTHAKHAT -0E4D ; [.0000.00D8.0002] # THAI CHARACTER NIKHAHIT -0EC8 ; [.0000.00D9.0002] # LAO TONE MAI EK -0EC9 ; [.0000.00DA.0002] # LAO TONE MAI THO -0ECA ; [.0000.00DB.0002] # LAO TONE MAI TI -0ECB ; [.0000.00DC.0002] # LAO TONE MAI CATAWA -0ECC ; [.0000.00DD.0002] # LAO CANCELLATION MARK -0ECD ; [.0000.00DE.0002] # LAO NIGGAHITA -AABF ; [.0000.00DF.0002] # TAI VIET TONE MAI EK -AAC1 ; [.0000.00E0.0002] # TAI VIET TONE MAI THO -0F39 ; [.0000.00E1.0002] # TIBETAN MARK TSA -PHRU -A92B ; [.0000.00E2.0002] # KAYAH LI TONE PLOPHU -A92C ; [.0000.00E3.0002] # KAYAH LI TONE CALYA -A92D ; [.0000.00E4.0002] # KAYAH LI TONE CALYA PLOPHU -1037 ; [.0000.00E5.0002] # MYANMAR SIGN DOT BELOW -17C8 ; [.0000.00E6.0002] # KHMER SIGN YUUKALEAPINTU -17C9 ; [.0000.00E7.0002] # KHMER SIGN MUUSIKATOAN -17CA ; [.0000.00E8.0002] # KHMER SIGN TRIISAP -1A75 ; [.0000.00E9.0002] # TAI THAM SIGN TONE-1 -1A76 ; [.0000.00EA.0002] # TAI THAM SIGN TONE-2 -1A77 ; [.0000.00EB.0002] # TAI THAM SIGN KHUEN TONE-3 -1A78 ; [.0000.00EC.0002] # TAI THAM SIGN KHUEN TONE-4 -1A79 ; [.0000.00ED.0002] # TAI THAM SIGN KHUEN TONE-5 -1A7A ; [.0000.00EE.0002] # TAI THAM SIGN RA HAAM -1A7B ; [.0000.00EF.0002] # TAI THAM SIGN MAI SAM -1A7C ; [.0000.00F0.0002] # TAI THAM SIGN KHUEN-LUE KARAN -1939 ; [.0000.00F1.0002] # LIMBU SIGN MUKPHRENG -193A ; [.0000.00F2.0002] # LIMBU SIGN KEMPHRENG -193B ; [.0000.00F3.0002] # LIMBU SIGN SA-I -16B30 ; [.0000.00F4.0002] # PAHAWH HMONG MARK CIM TUB -16B31 ; [.0000.00F5.0002] # PAHAWH HMONG MARK CIM SO -16B32 ; [.0000.00F6.0002] # PAHAWH HMONG MARK CIM KES -16B33 ; [.0000.00F7.0002] # PAHAWH HMONG MARK CIM KHAV -16B34 ; [.0000.00F8.0002] # PAHAWH HMONG MARK CIM SUAM -16B35 ; [.0000.00F9.0002] # PAHAWH HMONG MARK CIM HOM -16B36 ; [.0000.00FA.0002] # PAHAWH HMONG MARK CIM TAUM -302A ; [.0000.00FB.0002] # IDEOGRAPHIC LEVEL TONE MARK -302B ; [.0000.00FC.0002] # IDEOGRAPHIC RISING TONE MARK -302C ; [.0000.00FD.0002] # IDEOGRAPHIC DEPARTING TONE MARK -302D ; [.0000.00FE.0002] # IDEOGRAPHIC ENTERING TONE MARK -302E ; [.0000.00FF.0002] # HANGUL SINGLE DOT TONE MARK -302F ; [.0000.0100.0002] # HANGUL DOUBLE DOT TONE MARK -20D0 ; [.0000.0101.0002] # COMBINING LEFT HARPOON ABOVE -20D1 ; [.0000.0102.0002] # COMBINING RIGHT HARPOON ABOVE -20D2 ; [.0000.0103.0002] # COMBINING LONG VERTICAL LINE OVERLAY -20D3 ; [.0000.0103.0002] # COMBINING SHORT VERTICAL LINE OVERLAY -20D4 ; [.0000.0104.0002] # COMBINING ANTICLOCKWISE ARROW ABOVE -20D5 ; [.0000.0105.0002] # COMBINING CLOCKWISE ARROW ABOVE -20D6 ; [.0000.0106.0002] # COMBINING LEFT ARROW ABOVE -20D7 ; [.0000.0107.0002] # COMBINING RIGHT ARROW ABOVE -20DB ; [.0000.0108.0002] # COMBINING THREE DOTS ABOVE -20DC ; [.0000.0109.0002] # COMBINING FOUR DOTS ABOVE -20E1 ; [.0000.010A.0002] # COMBINING LEFT RIGHT ARROW ABOVE -20E6 ; [.0000.010B.0002] # COMBINING DOUBLE VERTICAL STROKE OVERLAY -20E7 ; [.0000.010C.0002] # COMBINING ANNUITY SYMBOL -20E8 ; [.0000.010D.0002] # COMBINING TRIPLE UNDERDOT -20E9 ; [.0000.010E.0002] # COMBINING WIDE BRIDGE ABOVE -101FD ; [.0000.010F.0002] # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -02D0 ; [.1BF8.0020.0002] # MODIFIER LETTER TRIANGULAR COLON -02D1 ; [.1BF9.0020.0002] # MODIFIER LETTER HALF TRIANGULAR COLON -0971 ; [.1BFA.0020.0002] # DEVANAGARI SIGN HIGH SPACING DOT -0E46 ; [.1BFB.0020.0002] # THAI CHARACTER MAIYAMOK -0EC6 ; [.1BFC.0020.0002] # LAO KO LA -17D7 ; [.1BFD.0020.0002] # KHMER SIGN LEK TOO -1AA7 ; [.1BFE.0020.0002] # TAI THAM SIGN MAI YAMOK -A9CF ; [.1BFF.0020.0002] # JAVANESE PANGRANGKEP -A9E6 ; [.1C00.0020.0002] # MYANMAR MODIFIER LETTER SHAN REDUPLICATION -AA70 ; [.1C01.0020.0002] # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION -AADD ; [.1C02.0020.0002] # TAI VIET SYMBOL SAM -AAF3 ; [.1C03.0020.0002] # MEETEI MAYEK SYLLABLE REPETITION MARK -AAF4 ; [.1C04.0020.0002] # MEETEI MAYEK WORD REPETITION MARK -16B42 ; [.1C05.0020.0002] # PAHAWH HMONG SIGN VOS NRUA -16B43 ; [.1C06.0020.0002] # PAHAWH HMONG SIGN IB YAM -3005 ; [.1C07.0020.0002] # IDEOGRAPHIC ITERATION MARK -303B ; [.1C08.0020.0002] # VERTICAL IDEOGRAPHIC ITERATION MARK -16FE0 ; [.1C09.0020.0002] # TANGUT ITERATION MARK -3031 ; [.1C0A.0020.0002] # VERTICAL KANA REPEAT MARK -3032 ; [.1C0A.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK -3033 ; [.1C0B.0020.0002] # VERTICAL KANA REPEAT MARK UPPER HALF -3034 ; [.1C0B.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF -3035 ; [.1C0C.0020.0002] # VERTICAL KANA REPEAT MARK LOWER HALF -309D ; [.1C0D.0020.0002] # HIRAGANA ITERATION MARK -309E ; [.1C0D.0020.0002][.0000.0037.0002] # HIRAGANA VOICED ITERATION MARK -30FC ; [.1C0E.0020.0002] # KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF70 ; [.1C0E.0020.0012] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -30FD ; [.1C0F.0020.0002] # KATAKANA ITERATION MARK -30FE ; [.1C0F.0020.0002][.0000.0037.0002] # KATAKANA VOICED ITERATION MARK -00A4 ; [.1C10.0020.0002] # CURRENCY SIGN -00A2 ; [.1C11.0020.0002] # CENT SIGN -FFE0 ; [.1C11.0020.0003] # FULLWIDTH CENT SIGN -0024 ; [.1C12.0020.0002] # DOLLAR SIGN -FF04 ; [.1C12.0020.0003] # FULLWIDTH DOLLAR SIGN -FE69 ; [.1C12.0020.000F] # SMALL DOLLAR SIGN -00A3 ; [.1C13.0020.0002] # POUND SIGN -FFE1 ; [.1C13.0020.0003] # FULLWIDTH POUND SIGN -00A5 ; [.1C14.0020.0002] # YEN SIGN -FFE5 ; [.1C14.0020.0003] # FULLWIDTH YEN SIGN -058F ; [.1C15.0020.0002] # ARMENIAN DRAM SIGN -060B ; [.1C16.0020.0002] # AFGHANI SIGN -09F2 ; [.1C17.0020.0002] # BENGALI RUPEE MARK -09F3 ; [.1C18.0020.0002] # BENGALI RUPEE SIGN -09FB ; [.1C19.0020.0002] # BENGALI GANDA MARK -0AF1 ; [.1C1A.0020.0002] # GUJARATI RUPEE SIGN -A838 ; [.1C1B.0020.0002] # NORTH INDIC RUPEE MARK -0BF9 ; [.1C1C.0020.0002] # TAMIL RUPEE SIGN -0E3F ; [.1C1D.0020.0002] # THAI CURRENCY SYMBOL BAHT -17DB ; [.1C1E.0020.0002] # KHMER CURRENCY SYMBOL RIEL -20A0 ; [.1C1F.0020.0002] # EURO-CURRENCY SIGN -20A1 ; [.1C20.0020.0002] # COLON SIGN -20A2 ; [.1C21.0020.0002] # CRUZEIRO SIGN -20A3 ; [.1C22.0020.0002] # FRENCH FRANC SIGN -20A4 ; [.1C23.0020.0002] # LIRA SIGN -20A5 ; [.1C24.0020.0002] # MILL SIGN -20A6 ; [.1C25.0020.0002] # NAIRA SIGN -20A7 ; [.1C26.0020.0002] # PESETA SIGN -20A9 ; [.1C27.0020.0002] # WON SIGN -FFE6 ; [.1C27.0020.0003] # FULLWIDTH WON SIGN -20AA ; [.1C28.0020.0002] # NEW SHEQEL SIGN -20AB ; [.1C29.0020.0002] # DONG SIGN -20AC ; [.1C2A.0020.0002] # EURO SIGN -20AD ; [.1C2B.0020.0002] # KIP SIGN -20AE ; [.1C2C.0020.0002] # TUGRIK SIGN -20AF ; [.1C2D.0020.0002] # DRACHMA SIGN -20B0 ; [.1C2E.0020.0002] # GERMAN PENNY SIGN -20B1 ; [.1C2F.0020.0002] # PESO SIGN -20B2 ; [.1C30.0020.0002] # GUARANI SIGN -20B3 ; [.1C31.0020.0002] # AUSTRAL SIGN -20B4 ; [.1C32.0020.0002] # HRYVNIA SIGN -20B5 ; [.1C33.0020.0002] # CEDI SIGN -20B6 ; [.1C34.0020.0002] # LIVRE TOURNOIS SIGN -20B7 ; [.1C35.0020.0002] # SPESMILO SIGN -20B8 ; [.1C36.0020.0002] # TENGE SIGN -20B9 ; [.1C37.0020.0002] # INDIAN RUPEE SIGN -20BA ; [.1C38.0020.0002] # TURKISH LIRA SIGN -20BB ; [.1C39.0020.0002] # NORDIC MARK SIGN -20BC ; [.1C3A.0020.0002] # MANAT SIGN -20BD ; [.1C3B.0020.0002] # RUBLE SIGN -20BE ; [.1C3C.0020.0002] # LARI SIGN -0030 ; [.1C3D.0020.0002] # DIGIT ZERO -0660 ; [.1C3D.0020.0002] # ARABIC-INDIC DIGIT ZERO -06F0 ; [.1C3D.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ZERO -07C0 ; [.1C3D.0020.0002] # NKO DIGIT ZERO -0966 ; [.1C3D.0020.0002] # DEVANAGARI DIGIT ZERO -09E6 ; [.1C3D.0020.0002] # BENGALI DIGIT ZERO -0A66 ; [.1C3D.0020.0002] # GURMUKHI DIGIT ZERO -0AE6 ; [.1C3D.0020.0002] # GUJARATI DIGIT ZERO -0B66 ; [.1C3D.0020.0002] # ORIYA DIGIT ZERO -0BE6 ; [.1C3D.0020.0002] # TAMIL DIGIT ZERO -0C66 ; [.1C3D.0020.0002] # TELUGU DIGIT ZERO -0C78 ; [.1C3D.0020.0002] # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR -0CE6 ; [.1C3D.0020.0002] # KANNADA DIGIT ZERO -0D66 ; [.1C3D.0020.0002] # MALAYALAM DIGIT ZERO -0DE6 ; [.1C3D.0020.0002] # SINHALA LITH DIGIT ZERO -0E50 ; [.1C3D.0020.0002] # THAI DIGIT ZERO -0ED0 ; [.1C3D.0020.0002] # LAO DIGIT ZERO -0F20 ; [.1C3D.0020.0002] # TIBETAN DIGIT ZERO -1040 ; [.1C3D.0020.0002] # MYANMAR DIGIT ZERO -1090 ; [.1C3D.0020.0002] # MYANMAR SHAN DIGIT ZERO -17E0 ; [.1C3D.0020.0002] # KHMER DIGIT ZERO -17F0 ; [.1C3D.0020.0002] # KHMER SYMBOL LEK ATTAK SON -1810 ; [.1C3D.0020.0002] # MONGOLIAN DIGIT ZERO -1946 ; [.1C3D.0020.0002] # LIMBU DIGIT ZERO -19D0 ; [.1C3D.0020.0002] # NEW TAI LUE DIGIT ZERO -1A80 ; [.1C3D.0020.0002] # TAI THAM HORA DIGIT ZERO -1A90 ; [.1C3D.0020.0002] # TAI THAM THAM DIGIT ZERO -1B50 ; [.1C3D.0020.0002] # BALINESE DIGIT ZERO -1BB0 ; [.1C3D.0020.0002] # SUNDANESE DIGIT ZERO -1C40 ; [.1C3D.0020.0002] # LEPCHA DIGIT ZERO -1C50 ; [.1C3D.0020.0002] # OL CHIKI DIGIT ZERO -3007 ; [.1C3D.0020.0002] # IDEOGRAPHIC NUMBER ZERO -A620 ; [.1C3D.0020.0002] # VAI DIGIT ZERO -A8D0 ; [.1C3D.0020.0002] # SAURASHTRA DIGIT ZERO -A900 ; [.1C3D.0020.0002] # KAYAH LI DIGIT ZERO -A9D0 ; [.1C3D.0020.0002] # JAVANESE DIGIT ZERO -A9F0 ; [.1C3D.0020.0002] # MYANMAR TAI LAING DIGIT ZERO -AA50 ; [.1C3D.0020.0002] # CHAM DIGIT ZERO -ABF0 ; [.1C3D.0020.0002] # MEETEI MAYEK DIGIT ZERO -1018A ; [.1C3D.0020.0002] # GREEK ZERO SIGN -104A0 ; [.1C3D.0020.0002] # OSMANYA DIGIT ZERO -11066 ; [.1C3D.0020.0002] # BRAHMI DIGIT ZERO -110F0 ; [.1C3D.0020.0002] # SORA SOMPENG DIGIT ZERO -11136 ; [.1C3D.0020.0002] # CHAKMA DIGIT ZERO -111D0 ; [.1C3D.0020.0002] # SHARADA DIGIT ZERO -112F0 ; [.1C3D.0020.0002] # KHUDAWADI DIGIT ZERO -11450 ; [.1C3D.0020.0002] # NEWA DIGIT ZERO -114D0 ; [.1C3D.0020.0002] # TIRHUTA DIGIT ZERO -11650 ; [.1C3D.0020.0002] # MODI DIGIT ZERO -116C0 ; [.1C3D.0020.0002] # TAKRI DIGIT ZERO -11730 ; [.1C3D.0020.0002] # AHOM DIGIT ZERO -118E0 ; [.1C3D.0020.0002] # WARANG CITI DIGIT ZERO -11C50 ; [.1C3D.0020.0002] # BHAIKSUKI DIGIT ZERO -16A60 ; [.1C3D.0020.0002] # MRO DIGIT ZERO -16B50 ; [.1C3D.0020.0002] # PAHAWH HMONG DIGIT ZERO -1E950 ; [.1C3D.0020.0002] # ADLAM DIGIT ZERO -FF10 ; [.1C3D.0020.0003] # FULLWIDTH DIGIT ZERO -0F33 ; [.1C3D.0020.0004] # TIBETAN DIGIT HALF ZERO -1F100 ; [.1C3D.0020.0004][*0277.0020.0004] # DIGIT ZERO FULL STOP -1F101 ; [.1C3D.0020.0004][*0222.0020.0004] # DIGIT ZERO COMMA -1D7CE ; [.1C3D.0020.0005] # MATHEMATICAL BOLD DIGIT ZERO -1D7D8 ; [.1C3D.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO -1D7E2 ; [.1C3D.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ZERO -1D7EC ; [.1C3D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO -1D7F6 ; [.1C3D.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ZERO -24EA ; [.1C3D.0020.0006] # CIRCLED DIGIT ZERO -24FF ; [.1C3D.0020.0006] # NEGATIVE CIRCLED DIGIT ZERO -1F10B ; [.1C3D.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ZERO -1F10C ; [.1C3D.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO -2070 ; [.1C3D.0020.0014] # SUPERSCRIPT ZERO -2080 ; [.1C3D.0020.0015] # SUBSCRIPT ZERO -2189 ; [.1C3D.0020.001E][*0626.0020.001E][.1C40.0020.001E] # VULGAR FRACTION ZERO THIRDS -3358 ; [.1C3D.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO -0031 ; [.1C3E.0020.0002] # DIGIT ONE -0661 ; [.1C3E.0020.0002] # ARABIC-INDIC DIGIT ONE -06F1 ; [.1C3E.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ONE -07C1 ; [.1C3E.0020.0002] # NKO DIGIT ONE -0967 ; [.1C3E.0020.0002] # DEVANAGARI DIGIT ONE -09E7 ; [.1C3E.0020.0002] # BENGALI DIGIT ONE -0A67 ; [.1C3E.0020.0002] # GURMUKHI DIGIT ONE -0AE7 ; [.1C3E.0020.0002] # GUJARATI DIGIT ONE -0B67 ; [.1C3E.0020.0002] # ORIYA DIGIT ONE -0BE7 ; [.1C3E.0020.0002] # TAMIL DIGIT ONE -0C67 ; [.1C3E.0020.0002] # TELUGU DIGIT ONE -0C79 ; [.1C3E.0020.0002] # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR -0C7C ; [.1C3E.0020.0002] # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR -0CE7 ; [.1C3E.0020.0002] # KANNADA DIGIT ONE -0D67 ; [.1C3E.0020.0002] # MALAYALAM DIGIT ONE -0DE7 ; [.1C3E.0020.0002] # SINHALA LITH DIGIT ONE -0E51 ; [.1C3E.0020.0002] # THAI DIGIT ONE -0ED1 ; [.1C3E.0020.0002] # LAO DIGIT ONE -0F21 ; [.1C3E.0020.0002] # TIBETAN DIGIT ONE -1041 ; [.1C3E.0020.0002] # MYANMAR DIGIT ONE -1091 ; [.1C3E.0020.0002] # MYANMAR SHAN DIGIT ONE -1369 ; [.1C3E.0020.0002] # ETHIOPIC DIGIT ONE -17E1 ; [.1C3E.0020.0002] # KHMER DIGIT ONE -17F1 ; [.1C3E.0020.0002] # KHMER SYMBOL LEK ATTAK MUOY -1811 ; [.1C3E.0020.0002] # MONGOLIAN DIGIT ONE -1947 ; [.1C3E.0020.0002] # LIMBU DIGIT ONE -19D1 ; [.1C3E.0020.0002] # NEW TAI LUE DIGIT ONE -19DA ; [.1C3E.0020.0002] # NEW TAI LUE THAM DIGIT ONE -1A81 ; [.1C3E.0020.0002] # TAI THAM HORA DIGIT ONE -1A91 ; [.1C3E.0020.0002] # TAI THAM THAM DIGIT ONE -1B51 ; [.1C3E.0020.0002] # BALINESE DIGIT ONE -1BB1 ; [.1C3E.0020.0002] # SUNDANESE DIGIT ONE -1C41 ; [.1C3E.0020.0002] # LEPCHA DIGIT ONE -1C51 ; [.1C3E.0020.0002] # OL CHIKI DIGIT ONE -3021 ; [.1C3E.0020.0002] # HANGZHOU NUMERAL ONE -A621 ; [.1C3E.0020.0002] # VAI DIGIT ONE -A8D1 ; [.1C3E.0020.0002] # SAURASHTRA DIGIT ONE -A901 ; [.1C3E.0020.0002] # KAYAH LI DIGIT ONE -A9D1 ; [.1C3E.0020.0002] # JAVANESE DIGIT ONE -A9F1 ; [.1C3E.0020.0002] # MYANMAR TAI LAING DIGIT ONE -AA51 ; [.1C3E.0020.0002] # CHAM DIGIT ONE -ABF1 ; [.1C3E.0020.0002] # MEETEI MAYEK DIGIT ONE -10107 ; [.1C3E.0020.0002] # AEGEAN NUMBER ONE -10142 ; [.1C3E.0020.0002] # GREEK ACROPHONIC ATTIC ONE DRACHMA -10158 ; [.1C3E.0020.0002] # GREEK ACROPHONIC HERAEUM ONE PLETHRON -10159 ; [.1C3E.0020.0002] # GREEK ACROPHONIC THESPIAN ONE -1015A ; [.1C3E.0020.0002] # GREEK ACROPHONIC HERMIONIAN ONE -102E1 ; [.1C3E.0020.0002] # COPTIC EPACT DIGIT ONE -10320 ; [.1C3E.0020.0002] # OLD ITALIC NUMERAL ONE -103D1 ; [.1C3E.0020.0002] # OLD PERSIAN NUMBER ONE -104A1 ; [.1C3E.0020.0002] # OSMANYA DIGIT ONE -10858 ; [.1C3E.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE -10879 ; [.1C3E.0020.0002] # PALMYRENE NUMBER ONE -108A7 ; [.1C3E.0020.0002] # NABATAEAN NUMBER ONE -108FB ; [.1C3E.0020.0002] # HATRAN NUMBER ONE -10916 ; [.1C3E.0020.0002] # PHOENICIAN NUMBER ONE -109C0 ; [.1C3E.0020.0002] # MEROITIC CURSIVE NUMBER ONE -10A40 ; [.1C3E.0020.0002] # KHAROSHTHI DIGIT ONE -10A7D ; [.1C3E.0020.0002] # OLD SOUTH ARABIAN NUMBER ONE -10A9D ; [.1C3E.0020.0002] # OLD NORTH ARABIAN NUMBER ONE -10AEB ; [.1C3E.0020.0002] # MANICHAEAN NUMBER ONE -10B58 ; [.1C3E.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE -10B78 ; [.1C3E.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE -10BA9 ; [.1C3E.0020.0002] # PSALTER PAHLAVI NUMBER ONE -10CFA ; [.1C3E.0020.0002] # OLD HUNGARIAN NUMBER ONE -10E60 ; [.1C3E.0020.0002] # RUMI DIGIT ONE -11052 ; [.1C3E.0020.0002] # BRAHMI NUMBER ONE -11067 ; [.1C3E.0020.0002] # BRAHMI DIGIT ONE -110F1 ; [.1C3E.0020.0002] # SORA SOMPENG DIGIT ONE -11137 ; [.1C3E.0020.0002] # CHAKMA DIGIT ONE -111D1 ; [.1C3E.0020.0002] # SHARADA DIGIT ONE -111E1 ; [.1C3E.0020.0002] # SINHALA ARCHAIC DIGIT ONE -112F1 ; [.1C3E.0020.0002] # KHUDAWADI DIGIT ONE -11451 ; [.1C3E.0020.0002] # NEWA DIGIT ONE -114D1 ; [.1C3E.0020.0002] # TIRHUTA DIGIT ONE -11651 ; [.1C3E.0020.0002] # MODI DIGIT ONE -116C1 ; [.1C3E.0020.0002] # TAKRI DIGIT ONE -11731 ; [.1C3E.0020.0002] # AHOM DIGIT ONE -118E1 ; [.1C3E.0020.0002] # WARANG CITI DIGIT ONE -11C51 ; [.1C3E.0020.0002] # BHAIKSUKI DIGIT ONE -11C5A ; [.1C3E.0020.0002] # BHAIKSUKI NUMBER ONE -12415 ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESH2 -1241E ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESHU -1242C ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE SHARU -12434 ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BURU -1244F ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BAN2 -12458 ; [.1C3E.0020.0002] # CUNEIFORM NUMERIC SIGN ONE ESHE3 -16A61 ; [.1C3E.0020.0002] # MRO DIGIT ONE -16B51 ; [.1C3E.0020.0002] # PAHAWH HMONG DIGIT ONE -1D360 ; [.1C3E.0020.0002] # COUNTING ROD UNIT DIGIT ONE -1E8C7 ; [.1C3E.0020.0002] # MENDE KIKAKUI DIGIT ONE -1E951 ; [.1C3E.0020.0002] # ADLAM DIGIT ONE -FF11 ; [.1C3E.0020.0003] # FULLWIDTH DIGIT ONE -0F2A ; [.1C3E.0020.0004] # TIBETAN DIGIT HALF ONE -2474 ; [*0317.0020.0004][.1C3E.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT ONE -2488 ; [.1C3E.0020.0004][*0277.0020.0004] # DIGIT ONE FULL STOP -1F102 ; [.1C3E.0020.0004][*0222.0020.0004] # DIGIT ONE COMMA -1D7CF ; [.1C3E.0020.0005] # MATHEMATICAL BOLD DIGIT ONE -1D7D9 ; [.1C3E.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE -1D7E3 ; [.1C3E.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ONE -1D7ED ; [.1C3E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE -1D7F7 ; [.1C3E.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ONE -2460 ; [.1C3E.0020.0006] # CIRCLED DIGIT ONE -24F5 ; [.1C3E.0020.0006] # DOUBLE CIRCLED DIGIT ONE -2776 ; [.1C3E.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT ONE -2780 ; [.1C3E.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE -278A ; [.1C3E.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE -00B9 ; [.1C3E.0020.0014] # SUPERSCRIPT ONE -2081 ; [.1C3E.0020.0015] # SUBSCRIPT ONE -215F ; [.1C3E.0020.001E][*0626.0020.001E] # FRACTION NUMERATOR ONE -247D ; [*0317.0020.0004][.1C3E.0020.0004][.1C3D.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER TEN -2491 ; [.1C3E.0020.0004][.1C3D.0020.0004][*0277.0020.0004] # NUMBER TEN FULL STOP -2469 ; [.1C3E.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER TEN -24FE ; [.1C3E.0020.0006][.1C3D.0020.0006] # DOUBLE CIRCLED NUMBER TEN -277F ; [.1C3E.0020.0006][.1C3D.0020.0006] # DINGBAT NEGATIVE CIRCLED NUMBER TEN -2789 ; [.1C3E.0020.0006][.1C3D.0020.0006] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN -2793 ; [.1C3E.0020.0006][.1C3D.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -3248 ; [.1C3E.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER TEN ON BLACK SQUARE -33E9 ; [.1C3E.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN -32C9 ; [.1C3E.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER -3362 ; [.1C3E.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN -247E ; [*0317.0020.0004][.1C3E.0020.0004][.1C3E.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER ELEVEN -2492 ; [.1C3E.0020.0004][.1C3E.0020.0004][*0277.0020.0004] # NUMBER ELEVEN FULL STOP -246A ; [.1C3E.0020.0006][.1C3E.0020.0006] # CIRCLED NUMBER ELEVEN -24EB ; [.1C3E.0020.0006][.1C3E.0020.0006] # NEGATIVE CIRCLED NUMBER ELEVEN -2152 ; [.1C3E.0020.001E][*0626.0020.001E][.1C3E.0020.001E][.1C3D.0020.001E] # VULGAR FRACTION ONE TENTH -33EA ; [.1C3E.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN -32CA ; [.1C3E.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER -3363 ; [.1C3E.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN -247F ; [*0317.0020.0004][.1C3E.0020.0004][.1C3F.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER TWELVE -2493 ; [.1C3E.0020.0004][.1C3F.0020.0004][*0277.0020.0004] # NUMBER TWELVE FULL STOP -246B ; [.1C3E.0020.0006][.1C3F.0020.0006] # CIRCLED NUMBER TWELVE -24EC ; [.1C3E.0020.0006][.1C3F.0020.0006] # NEGATIVE CIRCLED NUMBER TWELVE -00BD ; [.1C3E.0020.001E][*0626.0020.001E][.1C3F.0020.001E] # VULGAR FRACTION ONE HALF -1F1A4 ; [.1C3E.0020.001C][.1C3F.0020.001C][.1C3D.0020.001C][.1E0C.0020.001D] # SQUARED ONE HUNDRED TWENTY P -33EB ; [.1C3E.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE -32CB ; [.1C3E.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER -3364 ; [.1C3E.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE -2480 ; [*0317.0020.0004][.1C3E.0020.0004][.1C40.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER THIRTEEN -2494 ; [.1C3E.0020.0004][.1C40.0020.0004][*0277.0020.0004] # NUMBER THIRTEEN FULL STOP -246C ; [.1C3E.0020.0006][.1C40.0020.0006] # CIRCLED NUMBER THIRTEEN -24ED ; [.1C3E.0020.0006][.1C40.0020.0006] # NEGATIVE CIRCLED NUMBER THIRTEEN -2153 ; [.1C3E.0020.001E][*0626.0020.001E][.1C40.0020.001E] # VULGAR FRACTION ONE THIRD -33EC ; [.1C3E.0020.0004][.1C40.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN -3365 ; [.1C3E.0020.0004][.1C40.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN -2481 ; [*0317.0020.0004][.1C3E.0020.0004][.1C41.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER FOURTEEN -2495 ; [.1C3E.0020.0004][.1C41.0020.0004][*0277.0020.0004] # NUMBER FOURTEEN FULL STOP -246D ; [.1C3E.0020.0006][.1C41.0020.0006] # CIRCLED NUMBER FOURTEEN -24EE ; [.1C3E.0020.0006][.1C41.0020.0006] # NEGATIVE CIRCLED NUMBER FOURTEEN -00BC ; [.1C3E.0020.001E][*0626.0020.001E][.1C41.0020.001E] # VULGAR FRACTION ONE QUARTER -33ED ; [.1C3E.0020.0004][.1C41.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN -3366 ; [.1C3E.0020.0004][.1C41.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN -2482 ; [*0317.0020.0004][.1C3E.0020.0004][.1C42.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER FIFTEEN -2496 ; [.1C3E.0020.0004][.1C42.0020.0004][*0277.0020.0004] # NUMBER FIFTEEN FULL STOP -246E ; [.1C3E.0020.0006][.1C42.0020.0006] # CIRCLED NUMBER FIFTEEN -24EF ; [.1C3E.0020.0006][.1C42.0020.0006] # NEGATIVE CIRCLED NUMBER FIFTEEN -2155 ; [.1C3E.0020.001E][*0626.0020.001E][.1C42.0020.001E] # VULGAR FRACTION ONE FIFTH -33EE ; [.1C3E.0020.0004][.1C42.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN -3367 ; [.1C3E.0020.0004][.1C42.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN -2483 ; [*0317.0020.0004][.1C3E.0020.0004][.1C43.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER SIXTEEN -2497 ; [.1C3E.0020.0004][.1C43.0020.0004][*0277.0020.0004] # NUMBER SIXTEEN FULL STOP -246F ; [.1C3E.0020.0006][.1C43.0020.0006] # CIRCLED NUMBER SIXTEEN -24F0 ; [.1C3E.0020.0006][.1C43.0020.0006] # NEGATIVE CIRCLED NUMBER SIXTEEN -2159 ; [.1C3E.0020.001E][*0626.0020.001E][.1C43.0020.001E] # VULGAR FRACTION ONE SIXTH -33EF ; [.1C3E.0020.0004][.1C43.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN -3368 ; [.1C3E.0020.0004][.1C43.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN -2484 ; [*0317.0020.0004][.1C3E.0020.0004][.1C44.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER SEVENTEEN -2498 ; [.1C3E.0020.0004][.1C44.0020.0004][*0277.0020.0004] # NUMBER SEVENTEEN FULL STOP -2470 ; [.1C3E.0020.0006][.1C44.0020.0006] # CIRCLED NUMBER SEVENTEEN -24F1 ; [.1C3E.0020.0006][.1C44.0020.0006] # NEGATIVE CIRCLED NUMBER SEVENTEEN -2150 ; [.1C3E.0020.001E][*0626.0020.001E][.1C44.0020.001E] # VULGAR FRACTION ONE SEVENTH -33F0 ; [.1C3E.0020.0004][.1C44.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN -3369 ; [.1C3E.0020.0004][.1C44.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN -2485 ; [*0317.0020.0004][.1C3E.0020.0004][.1C45.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER EIGHTEEN -2499 ; [.1C3E.0020.0004][.1C45.0020.0004][*0277.0020.0004] # NUMBER EIGHTEEN FULL STOP -2471 ; [.1C3E.0020.0006][.1C45.0020.0006] # CIRCLED NUMBER EIGHTEEN -24F2 ; [.1C3E.0020.0006][.1C45.0020.0006] # NEGATIVE CIRCLED NUMBER EIGHTEEN -215B ; [.1C3E.0020.001E][*0626.0020.001E][.1C45.0020.001E] # VULGAR FRACTION ONE EIGHTH -33F1 ; [.1C3E.0020.0004][.1C45.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN -336A ; [.1C3E.0020.0004][.1C45.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN -2486 ; [*0317.0020.0004][.1C3E.0020.0004][.1C46.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER NINETEEN -249A ; [.1C3E.0020.0004][.1C46.0020.0004][*0277.0020.0004] # NUMBER NINETEEN FULL STOP -2472 ; [.1C3E.0020.0006][.1C46.0020.0006] # CIRCLED NUMBER NINETEEN -24F3 ; [.1C3E.0020.0006][.1C46.0020.0006] # NEGATIVE CIRCLED NUMBER NINETEEN -2151 ; [.1C3E.0020.001E][*0626.0020.001E][.1C46.0020.001E] # VULGAR FRACTION ONE NINTH -33F2 ; [.1C3E.0020.0004][.1C46.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN -336B ; [.1C3E.0020.0004][.1C46.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN -33E0 ; [.1C3E.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE -32C0 ; [.1C3E.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY -3359 ; [.1C3E.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE -0032 ; [.1C3F.0020.0002] # DIGIT TWO -0662 ; [.1C3F.0020.0002] # ARABIC-INDIC DIGIT TWO -06F2 ; [.1C3F.0020.0002] # EXTENDED ARABIC-INDIC DIGIT TWO -07C2 ; [.1C3F.0020.0002] # NKO DIGIT TWO -0968 ; [.1C3F.0020.0002] # DEVANAGARI DIGIT TWO -09E8 ; [.1C3F.0020.0002] # BENGALI DIGIT TWO -0A68 ; [.1C3F.0020.0002] # GURMUKHI DIGIT TWO -0AE8 ; [.1C3F.0020.0002] # GUJARATI DIGIT TWO -0B68 ; [.1C3F.0020.0002] # ORIYA DIGIT TWO -0BE8 ; [.1C3F.0020.0002] # TAMIL DIGIT TWO -0C68 ; [.1C3F.0020.0002] # TELUGU DIGIT TWO -0C7A ; [.1C3F.0020.0002] # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR -0C7D ; [.1C3F.0020.0002] # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR -0CE8 ; [.1C3F.0020.0002] # KANNADA DIGIT TWO -0D68 ; [.1C3F.0020.0002] # MALAYALAM DIGIT TWO -0DE8 ; [.1C3F.0020.0002] # SINHALA LITH DIGIT TWO -0E52 ; [.1C3F.0020.0002] # THAI DIGIT TWO -0ED2 ; [.1C3F.0020.0002] # LAO DIGIT TWO -0F22 ; [.1C3F.0020.0002] # TIBETAN DIGIT TWO -1042 ; [.1C3F.0020.0002] # MYANMAR DIGIT TWO -1092 ; [.1C3F.0020.0002] # MYANMAR SHAN DIGIT TWO -136A ; [.1C3F.0020.0002] # ETHIOPIC DIGIT TWO -17E2 ; [.1C3F.0020.0002] # KHMER DIGIT TWO -17F2 ; [.1C3F.0020.0002] # KHMER SYMBOL LEK ATTAK PII -1812 ; [.1C3F.0020.0002] # MONGOLIAN DIGIT TWO -1948 ; [.1C3F.0020.0002] # LIMBU DIGIT TWO -19D2 ; [.1C3F.0020.0002] # NEW TAI LUE DIGIT TWO -1A82 ; [.1C3F.0020.0002] # TAI THAM HORA DIGIT TWO -1A92 ; [.1C3F.0020.0002] # TAI THAM THAM DIGIT TWO -1B52 ; [.1C3F.0020.0002] # BALINESE DIGIT TWO -1BB2 ; [.1C3F.0020.0002] # SUNDANESE DIGIT TWO -1C42 ; [.1C3F.0020.0002] # LEPCHA DIGIT TWO -1C52 ; [.1C3F.0020.0002] # OL CHIKI DIGIT TWO -3022 ; [.1C3F.0020.0002] # HANGZHOU NUMERAL TWO -A622 ; [.1C3F.0020.0002] # VAI DIGIT TWO -A8D2 ; [.1C3F.0020.0002] # SAURASHTRA DIGIT TWO -A902 ; [.1C3F.0020.0002] # KAYAH LI DIGIT TWO -A9D2 ; [.1C3F.0020.0002] # JAVANESE DIGIT TWO -A9F2 ; [.1C3F.0020.0002] # MYANMAR TAI LAING DIGIT TWO -AA52 ; [.1C3F.0020.0002] # CHAM DIGIT TWO -ABF2 ; [.1C3F.0020.0002] # MEETEI MAYEK DIGIT TWO -10108 ; [.1C3F.0020.0002] # AEGEAN NUMBER TWO -1015B ; [.1C3F.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO -1015C ; [.1C3F.0020.0002] # GREEK ACROPHONIC THESPIAN TWO -1015D ; [.1C3F.0020.0002] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS -1015E ; [.1C3F.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS -102E2 ; [.1C3F.0020.0002] # COPTIC EPACT DIGIT TWO -103D2 ; [.1C3F.0020.0002] # OLD PERSIAN NUMBER TWO -104A2 ; [.1C3F.0020.0002] # OSMANYA DIGIT TWO -10859 ; [.1C3F.0020.0002] # IMPERIAL ARAMAIC NUMBER TWO -1087A ; [.1C3F.0020.0002] # PALMYRENE NUMBER TWO -108A8 ; [.1C3F.0020.0002] # NABATAEAN NUMBER TWO -1091A ; [.1C3F.0020.0002] # PHOENICIAN NUMBER TWO -109C1 ; [.1C3F.0020.0002] # MEROITIC CURSIVE NUMBER TWO -10A41 ; [.1C3F.0020.0002] # KHAROSHTHI DIGIT TWO -10B59 ; [.1C3F.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWO -10B79 ; [.1C3F.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWO -10BAA ; [.1C3F.0020.0002] # PSALTER PAHLAVI NUMBER TWO -10E61 ; [.1C3F.0020.0002] # RUMI DIGIT TWO -11053 ; [.1C3F.0020.0002] # BRAHMI NUMBER TWO -11068 ; [.1C3F.0020.0002] # BRAHMI DIGIT TWO -110F2 ; [.1C3F.0020.0002] # SORA SOMPENG DIGIT TWO -11138 ; [.1C3F.0020.0002] # CHAKMA DIGIT TWO -111D2 ; [.1C3F.0020.0002] # SHARADA DIGIT TWO -111E2 ; [.1C3F.0020.0002] # SINHALA ARCHAIC DIGIT TWO -112F2 ; [.1C3F.0020.0002] # KHUDAWADI DIGIT TWO -11452 ; [.1C3F.0020.0002] # NEWA DIGIT TWO -114D2 ; [.1C3F.0020.0002] # TIRHUTA DIGIT TWO -11652 ; [.1C3F.0020.0002] # MODI DIGIT TWO -116C2 ; [.1C3F.0020.0002] # TAKRI DIGIT TWO -11732 ; [.1C3F.0020.0002] # AHOM DIGIT TWO -118E2 ; [.1C3F.0020.0002] # WARANG CITI DIGIT TWO -11C52 ; [.1C3F.0020.0002] # BHAIKSUKI DIGIT TWO -11C5B ; [.1C3F.0020.0002] # BHAIKSUKI NUMBER TWO -12400 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH -12416 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESH2 -1241F ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESHU -12423 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHAR2 -1242D ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHARU -12435 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BURU -1244A ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH TENU -12450 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BAN2 -12456 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAMIN -12459 ; [.1C3F.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ESHE3 -16A62 ; [.1C3F.0020.0002] # MRO DIGIT TWO -16B52 ; [.1C3F.0020.0002] # PAHAWH HMONG DIGIT TWO -1D361 ; [.1C3F.0020.0002] # COUNTING ROD UNIT DIGIT TWO -1E8C8 ; [.1C3F.0020.0002] # MENDE KIKAKUI DIGIT TWO -1E952 ; [.1C3F.0020.0002] # ADLAM DIGIT TWO -FF12 ; [.1C3F.0020.0003] # FULLWIDTH DIGIT TWO -0F2B ; [.1C3F.0020.0004] # TIBETAN DIGIT HALF TWO -2475 ; [*0317.0020.0004][.1C3F.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT TWO -2489 ; [.1C3F.0020.0004][*0277.0020.0004] # DIGIT TWO FULL STOP -1F103 ; [.1C3F.0020.0004][*0222.0020.0004] # DIGIT TWO COMMA -1D7D0 ; [.1C3F.0020.0005] # MATHEMATICAL BOLD DIGIT TWO -1D7DA ; [.1C3F.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO -1D7E4 ; [.1C3F.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT TWO -1D7EE ; [.1C3F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO -1D7F8 ; [.1C3F.0020.0005] # MATHEMATICAL MONOSPACE DIGIT TWO -2461 ; [.1C3F.0020.0006] # CIRCLED DIGIT TWO -24F6 ; [.1C3F.0020.0006] # DOUBLE CIRCLED DIGIT TWO -2777 ; [.1C3F.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT TWO -2781 ; [.1C3F.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO -278B ; [.1C3F.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO -00B2 ; [.1C3F.0020.0014] # SUPERSCRIPT TWO -2082 ; [.1C3F.0020.0015] # SUBSCRIPT TWO -2487 ; [*0317.0020.0004][.1C3F.0020.0004][.1C3D.0020.0004][*0318.0020.0004] # PARENTHESIZED NUMBER TWENTY -249B ; [.1C3F.0020.0004][.1C3D.0020.0004][*0277.0020.0004] # NUMBER TWENTY FULL STOP -2473 ; [.1C3F.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER TWENTY -24F4 ; [.1C3F.0020.0006][.1C3D.0020.0006] # NEGATIVE CIRCLED NUMBER TWENTY -3249 ; [.1C3F.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER TWENTY ON BLACK SQUARE -33F3 ; [.1C3F.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY -336C ; [.1C3F.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY -3251 ; [.1C3F.0020.0006][.1C3E.0020.0006] # CIRCLED NUMBER TWENTY ONE -33F4 ; [.1C3F.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE -336D ; [.1C3F.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE -3252 ; [.1C3F.0020.0006][.1C3F.0020.0006] # CIRCLED NUMBER TWENTY TWO -1F1A2 ; [.1C3F.0020.001C][.1C3F.0020.001C][*0277.0020.001C][.1C3F.0020.001C] # SQUARED TWENTY-TWO POINT TWO -33F5 ; [.1C3F.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO -336E ; [.1C3F.0020.0004][.1C3F.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO -3253 ; [.1C3F.0020.0006][.1C40.0020.0006] # CIRCLED NUMBER TWENTY THREE -2154 ; [.1C3F.0020.001E][*0626.0020.001E][.1C40.0020.001E] # VULGAR FRACTION TWO THIRDS -33F6 ; [.1C3F.0020.0004][.1C40.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE -336F ; [.1C3F.0020.0004][.1C40.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE -3254 ; [.1C3F.0020.0006][.1C41.0020.0006] # CIRCLED NUMBER TWENTY FOUR -33F7 ; [.1C3F.0020.0004][.1C41.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR -3370 ; [.1C3F.0020.0004][.1C41.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR -3255 ; [.1C3F.0020.0006][.1C42.0020.0006] # CIRCLED NUMBER TWENTY FIVE -2156 ; [.1C3F.0020.001E][*0626.0020.001E][.1C42.0020.001E] # VULGAR FRACTION TWO FIFTHS -33F8 ; [.1C3F.0020.0004][.1C42.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE -3256 ; [.1C3F.0020.0006][.1C43.0020.0006] # CIRCLED NUMBER TWENTY SIX -33F9 ; [.1C3F.0020.0004][.1C43.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX -3257 ; [.1C3F.0020.0006][.1C44.0020.0006] # CIRCLED NUMBER TWENTY SEVEN -33FA ; [.1C3F.0020.0004][.1C44.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN -3258 ; [.1C3F.0020.0006][.1C45.0020.0006] # CIRCLED NUMBER TWENTY EIGHT -33FB ; [.1C3F.0020.0004][.1C45.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT -3259 ; [.1C3F.0020.0006][.1C46.0020.0006] # CIRCLED NUMBER TWENTY NINE -33FC ; [.1C3F.0020.0004][.1C46.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE -1F19D ; [.1C3F.0020.001C][.1D65.0020.001D] # SQUARED TWO K -1F19C ; [.1C3F.0020.001C][.1DB9.0020.001C][.1C8F.0020.001C][*0209.0020.001C][.1E71.0020.001D][.1C7A.0020.001C][.1E33.0020.001C] # SQUARED SECOND SCREEN -33E1 ; [.1C3F.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO -32C1 ; [.1C3F.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY -335A ; [.1C3F.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO -0033 ; [.1C40.0020.0002] # DIGIT THREE -0663 ; [.1C40.0020.0002] # ARABIC-INDIC DIGIT THREE -06F3 ; [.1C40.0020.0002] # EXTENDED ARABIC-INDIC DIGIT THREE -07C3 ; [.1C40.0020.0002] # NKO DIGIT THREE -0969 ; [.1C40.0020.0002] # DEVANAGARI DIGIT THREE -09E9 ; [.1C40.0020.0002] # BENGALI DIGIT THREE -0A69 ; [.1C40.0020.0002] # GURMUKHI DIGIT THREE -0AE9 ; [.1C40.0020.0002] # GUJARATI DIGIT THREE -0B69 ; [.1C40.0020.0002] # ORIYA DIGIT THREE -0BE9 ; [.1C40.0020.0002] # TAMIL DIGIT THREE -0C69 ; [.1C40.0020.0002] # TELUGU DIGIT THREE -0C7B ; [.1C40.0020.0002] # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR -0C7E ; [.1C40.0020.0002] # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR -0CE9 ; [.1C40.0020.0002] # KANNADA DIGIT THREE -0D69 ; [.1C40.0020.0002] # MALAYALAM DIGIT THREE -0DE9 ; [.1C40.0020.0002] # SINHALA LITH DIGIT THREE -0E53 ; [.1C40.0020.0002] # THAI DIGIT THREE -0ED3 ; [.1C40.0020.0002] # LAO DIGIT THREE -0F23 ; [.1C40.0020.0002] # TIBETAN DIGIT THREE -1043 ; [.1C40.0020.0002] # MYANMAR DIGIT THREE -1093 ; [.1C40.0020.0002] # MYANMAR SHAN DIGIT THREE -136B ; [.1C40.0020.0002] # ETHIOPIC DIGIT THREE -17E3 ; [.1C40.0020.0002] # KHMER DIGIT THREE -17F3 ; [.1C40.0020.0002] # KHMER SYMBOL LEK ATTAK BEI -1813 ; [.1C40.0020.0002] # MONGOLIAN DIGIT THREE -1949 ; [.1C40.0020.0002] # LIMBU DIGIT THREE -19D3 ; [.1C40.0020.0002] # NEW TAI LUE DIGIT THREE -1A83 ; [.1C40.0020.0002] # TAI THAM HORA DIGIT THREE -1A93 ; [.1C40.0020.0002] # TAI THAM THAM DIGIT THREE -1B53 ; [.1C40.0020.0002] # BALINESE DIGIT THREE -1BB3 ; [.1C40.0020.0002] # SUNDANESE DIGIT THREE -1C43 ; [.1C40.0020.0002] # LEPCHA DIGIT THREE -1C53 ; [.1C40.0020.0002] # OL CHIKI DIGIT THREE -3023 ; [.1C40.0020.0002] # HANGZHOU NUMERAL THREE -A623 ; [.1C40.0020.0002] # VAI DIGIT THREE -A8D3 ; [.1C40.0020.0002] # SAURASHTRA DIGIT THREE -A903 ; [.1C40.0020.0002] # KAYAH LI DIGIT THREE -A9D3 ; [.1C40.0020.0002] # JAVANESE DIGIT THREE -A9F3 ; [.1C40.0020.0002] # MYANMAR TAI LAING DIGIT THREE -AA53 ; [.1C40.0020.0002] # CHAM DIGIT THREE -ABF3 ; [.1C40.0020.0002] # MEETEI MAYEK DIGIT THREE -10109 ; [.1C40.0020.0002] # AEGEAN NUMBER THREE -102E3 ; [.1C40.0020.0002] # COPTIC EPACT DIGIT THREE -104A3 ; [.1C40.0020.0002] # OSMANYA DIGIT THREE -1085A ; [.1C40.0020.0002] # IMPERIAL ARAMAIC NUMBER THREE -1087B ; [.1C40.0020.0002] # PALMYRENE NUMBER THREE -108A9 ; [.1C40.0020.0002] # NABATAEAN NUMBER THREE -1091B ; [.1C40.0020.0002] # PHOENICIAN NUMBER THREE -109C2 ; [.1C40.0020.0002] # MEROITIC CURSIVE NUMBER THREE -10A42 ; [.1C40.0020.0002] # KHAROSHTHI DIGIT THREE -10B5A ; [.1C40.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER THREE -10B7A ; [.1C40.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER THREE -10BAB ; [.1C40.0020.0002] # PSALTER PAHLAVI NUMBER THREE -10E62 ; [.1C40.0020.0002] # RUMI DIGIT THREE -11054 ; [.1C40.0020.0002] # BRAHMI NUMBER THREE -11069 ; [.1C40.0020.0002] # BRAHMI DIGIT THREE -110F3 ; [.1C40.0020.0002] # SORA SOMPENG DIGIT THREE -11139 ; [.1C40.0020.0002] # CHAKMA DIGIT THREE -111D3 ; [.1C40.0020.0002] # SHARADA DIGIT THREE -111E3 ; [.1C40.0020.0002] # SINHALA ARCHAIC DIGIT THREE -112F3 ; [.1C40.0020.0002] # KHUDAWADI DIGIT THREE -11453 ; [.1C40.0020.0002] # NEWA DIGIT THREE -114D3 ; [.1C40.0020.0002] # TIRHUTA DIGIT THREE -11653 ; [.1C40.0020.0002] # MODI DIGIT THREE -116C3 ; [.1C40.0020.0002] # TAKRI DIGIT THREE -11733 ; [.1C40.0020.0002] # AHOM DIGIT THREE -118E3 ; [.1C40.0020.0002] # WARANG CITI DIGIT THREE -11C53 ; [.1C40.0020.0002] # BHAIKSUKI DIGIT THREE -11C5C ; [.1C40.0020.0002] # BHAIKSUKI NUMBER THREE -12401 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH -12408 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE DISH -12417 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESH2 -12420 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESHU -12424 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 -12425 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM -1242E ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU -1242F ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM -12436 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU -12437 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM -1243A ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16 -1243B ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21 -1244B ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH TENU -12451 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BAN2 -12457 ; [.1C40.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAESH -16A63 ; [.1C40.0020.0002] # MRO DIGIT THREE -16B53 ; [.1C40.0020.0002] # PAHAWH HMONG DIGIT THREE -1D362 ; [.1C40.0020.0002] # COUNTING ROD UNIT DIGIT THREE -1E8C9 ; [.1C40.0020.0002] # MENDE KIKAKUI DIGIT THREE -1E953 ; [.1C40.0020.0002] # ADLAM DIGIT THREE -FF13 ; [.1C40.0020.0003] # FULLWIDTH DIGIT THREE -0F2C ; [.1C40.0020.0004] # TIBETAN DIGIT HALF THREE -2476 ; [*0317.0020.0004][.1C40.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT THREE -248A ; [.1C40.0020.0004][*0277.0020.0004] # DIGIT THREE FULL STOP -1F104 ; [.1C40.0020.0004][*0222.0020.0004] # DIGIT THREE COMMA -1D7D1 ; [.1C40.0020.0005] # MATHEMATICAL BOLD DIGIT THREE -1D7DB ; [.1C40.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE -1D7E5 ; [.1C40.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT THREE -1D7EF ; [.1C40.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE -1D7F9 ; [.1C40.0020.0005] # MATHEMATICAL MONOSPACE DIGIT THREE -2462 ; [.1C40.0020.0006] # CIRCLED DIGIT THREE -24F7 ; [.1C40.0020.0006] # DOUBLE CIRCLED DIGIT THREE -2778 ; [.1C40.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT THREE -2782 ; [.1C40.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE -278C ; [.1C40.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE -00B3 ; [.1C40.0020.0014] # SUPERSCRIPT THREE -2083 ; [.1C40.0020.0015] # SUBSCRIPT THREE -324A ; [.1C40.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER THIRTY ON BLACK SQUARE -325A ; [.1C40.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER THIRTY -33FD ; [.1C40.0020.0004][.1C3D.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY -325B ; [.1C40.0020.0006][.1C3E.0020.0006] # CIRCLED NUMBER THIRTY ONE -33FE ; [.1C40.0020.0004][.1C3E.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE -325C ; [.1C40.0020.0006][.1C3F.0020.0006] # CIRCLED NUMBER THIRTY TWO -325D ; [.1C40.0020.0006][.1C40.0020.0006] # CIRCLED NUMBER THIRTY THREE -325E ; [.1C40.0020.0006][.1C41.0020.0006] # CIRCLED NUMBER THIRTY FOUR -00BE ; [.1C40.0020.001E][*0626.0020.001E][.1C41.0020.001E] # VULGAR FRACTION THREE QUARTERS -325F ; [.1C40.0020.0006][.1C42.0020.0006] # CIRCLED NUMBER THIRTY FIVE -2157 ; [.1C40.0020.001E][*0626.0020.001E][.1C42.0020.001E] # VULGAR FRACTION THREE FIFTHS -32B1 ; [.1C40.0020.0006][.1C43.0020.0006] # CIRCLED NUMBER THIRTY SIX -32B2 ; [.1C40.0020.0006][.1C44.0020.0006] # CIRCLED NUMBER THIRTY SEVEN -32B3 ; [.1C40.0020.0006][.1C45.0020.0006] # CIRCLED NUMBER THIRTY EIGHT -215C ; [.1C40.0020.001E][*0626.0020.001E][.1C45.0020.001E] # VULGAR FRACTION THREE EIGHTHS -32B4 ; [.1C40.0020.0006][.1C46.0020.0006] # CIRCLED NUMBER THIRTY NINE -1F19B ; [.1C40.0020.001C][.1C8F.0020.001D] # SQUARED THREE D -33E2 ; [.1C40.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE -32C2 ; [.1C40.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH -335B ; [.1C40.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE -0034 ; [.1C41.0020.0002] # DIGIT FOUR -0664 ; [.1C41.0020.0002] # ARABIC-INDIC DIGIT FOUR -06F4 ; [.1C41.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FOUR -07C4 ; [.1C41.0020.0002] # NKO DIGIT FOUR -096A ; [.1C41.0020.0002] # DEVANAGARI DIGIT FOUR -09EA ; [.1C41.0020.0002] # BENGALI DIGIT FOUR -0A6A ; [.1C41.0020.0002] # GURMUKHI DIGIT FOUR -0AEA ; [.1C41.0020.0002] # GUJARATI DIGIT FOUR -0B6A ; [.1C41.0020.0002] # ORIYA DIGIT FOUR -0BEA ; [.1C41.0020.0002] # TAMIL DIGIT FOUR -0C6A ; [.1C41.0020.0002] # TELUGU DIGIT FOUR -0CEA ; [.1C41.0020.0002] # KANNADA DIGIT FOUR -0D6A ; [.1C41.0020.0002] # MALAYALAM DIGIT FOUR -0DEA ; [.1C41.0020.0002] # SINHALA LITH DIGIT FOUR -0E54 ; [.1C41.0020.0002] # THAI DIGIT FOUR -0ED4 ; [.1C41.0020.0002] # LAO DIGIT FOUR -0F24 ; [.1C41.0020.0002] # TIBETAN DIGIT FOUR -1044 ; [.1C41.0020.0002] # MYANMAR DIGIT FOUR -1094 ; [.1C41.0020.0002] # MYANMAR SHAN DIGIT FOUR -136C ; [.1C41.0020.0002] # ETHIOPIC DIGIT FOUR -17E4 ; [.1C41.0020.0002] # KHMER DIGIT FOUR -17F4 ; [.1C41.0020.0002] # KHMER SYMBOL LEK ATTAK BUON -1814 ; [.1C41.0020.0002] # MONGOLIAN DIGIT FOUR -194A ; [.1C41.0020.0002] # LIMBU DIGIT FOUR -19D4 ; [.1C41.0020.0002] # NEW TAI LUE DIGIT FOUR -1A84 ; [.1C41.0020.0002] # TAI THAM HORA DIGIT FOUR -1A94 ; [.1C41.0020.0002] # TAI THAM THAM DIGIT FOUR -1B54 ; [.1C41.0020.0002] # BALINESE DIGIT FOUR -1BB4 ; [.1C41.0020.0002] # SUNDANESE DIGIT FOUR -1C44 ; [.1C41.0020.0002] # LEPCHA DIGIT FOUR -1C54 ; [.1C41.0020.0002] # OL CHIKI DIGIT FOUR -3024 ; [.1C41.0020.0002] # HANGZHOU NUMERAL FOUR -A624 ; [.1C41.0020.0002] # VAI DIGIT FOUR -A8D4 ; [.1C41.0020.0002] # SAURASHTRA DIGIT FOUR -A904 ; [.1C41.0020.0002] # KAYAH LI DIGIT FOUR -A9D4 ; [.1C41.0020.0002] # JAVANESE DIGIT FOUR -A9F4 ; [.1C41.0020.0002] # MYANMAR TAI LAING DIGIT FOUR -AA54 ; [.1C41.0020.0002] # CHAM DIGIT FOUR -ABF4 ; [.1C41.0020.0002] # MEETEI MAYEK DIGIT FOUR -1010A ; [.1C41.0020.0002] # AEGEAN NUMBER FOUR -102E4 ; [.1C41.0020.0002] # COPTIC EPACT DIGIT FOUR -104A4 ; [.1C41.0020.0002] # OSMANYA DIGIT FOUR -1087C ; [.1C41.0020.0002] # PALMYRENE NUMBER FOUR -108AA ; [.1C41.0020.0002] # NABATAEAN NUMBER FOUR -108AB ; [.1C41.0020.0002] # NABATAEAN CRUCIFORM NUMBER FOUR -109C3 ; [.1C41.0020.0002] # MEROITIC CURSIVE NUMBER FOUR -10A43 ; [.1C41.0020.0002] # KHAROSHTHI DIGIT FOUR -10B5B ; [.1C41.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER FOUR -10B7B ; [.1C41.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER FOUR -10BAC ; [.1C41.0020.0002] # PSALTER PAHLAVI NUMBER FOUR -10E63 ; [.1C41.0020.0002] # RUMI DIGIT FOUR -11055 ; [.1C41.0020.0002] # BRAHMI NUMBER FOUR -1106A ; [.1C41.0020.0002] # BRAHMI DIGIT FOUR -110F4 ; [.1C41.0020.0002] # SORA SOMPENG DIGIT FOUR -1113A ; [.1C41.0020.0002] # CHAKMA DIGIT FOUR -111D4 ; [.1C41.0020.0002] # SHARADA DIGIT FOUR -111E4 ; [.1C41.0020.0002] # SINHALA ARCHAIC DIGIT FOUR -112F4 ; [.1C41.0020.0002] # KHUDAWADI DIGIT FOUR -11454 ; [.1C41.0020.0002] # NEWA DIGIT FOUR -114D4 ; [.1C41.0020.0002] # TIRHUTA DIGIT FOUR -11654 ; [.1C41.0020.0002] # MODI DIGIT FOUR -116C4 ; [.1C41.0020.0002] # TAKRI DIGIT FOUR -11734 ; [.1C41.0020.0002] # AHOM DIGIT FOUR -118E4 ; [.1C41.0020.0002] # WARANG CITI DIGIT FOUR -11C54 ; [.1C41.0020.0002] # BHAIKSUKI DIGIT FOUR -11C5D ; [.1C41.0020.0002] # BHAIKSUKI NUMBER FOUR -12402 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH -12409 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR DISH -1240F ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U -12418 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESH2 -12421 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESHU -12426 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHAR2 -12430 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHARU -12438 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BURU -1243C ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU -1243D ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4 -1243E ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A -1243F ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B -1244C ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU -12452 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 -12453 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM -12469 ; [.1C41.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM -16A64 ; [.1C41.0020.0002] # MRO DIGIT FOUR -16B54 ; [.1C41.0020.0002] # PAHAWH HMONG DIGIT FOUR -1D363 ; [.1C41.0020.0002] # COUNTING ROD UNIT DIGIT FOUR -1E8CA ; [.1C41.0020.0002] # MENDE KIKAKUI DIGIT FOUR -1E954 ; [.1C41.0020.0002] # ADLAM DIGIT FOUR -FF14 ; [.1C41.0020.0003] # FULLWIDTH DIGIT FOUR -0F2D ; [.1C41.0020.0004] # TIBETAN DIGIT HALF FOUR -2477 ; [*0317.0020.0004][.1C41.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT FOUR -248B ; [.1C41.0020.0004][*0277.0020.0004] # DIGIT FOUR FULL STOP -1F105 ; [.1C41.0020.0004][*0222.0020.0004] # DIGIT FOUR COMMA -1D7D2 ; [.1C41.0020.0005] # MATHEMATICAL BOLD DIGIT FOUR -1D7DC ; [.1C41.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR -1D7E6 ; [.1C41.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FOUR -1D7F0 ; [.1C41.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR -1D7FA ; [.1C41.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FOUR -2463 ; [.1C41.0020.0006] # CIRCLED DIGIT FOUR -24F8 ; [.1C41.0020.0006] # DOUBLE CIRCLED DIGIT FOUR -2779 ; [.1C41.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR -2783 ; [.1C41.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR -278D ; [.1C41.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR -2074 ; [.1C41.0020.0014] # SUPERSCRIPT FOUR -2084 ; [.1C41.0020.0015] # SUBSCRIPT FOUR -324B ; [.1C41.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER FORTY ON BLACK SQUARE -32B5 ; [.1C41.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER FORTY -32B6 ; [.1C41.0020.0006][.1C3E.0020.0006] # CIRCLED NUMBER FORTY ONE -32B7 ; [.1C41.0020.0006][.1C3F.0020.0006] # CIRCLED NUMBER FORTY TWO -32B8 ; [.1C41.0020.0006][.1C40.0020.0006] # CIRCLED NUMBER FORTY THREE -32B9 ; [.1C41.0020.0006][.1C41.0020.0006] # CIRCLED NUMBER FORTY FOUR -32BA ; [.1C41.0020.0006][.1C42.0020.0006] # CIRCLED NUMBER FORTY FIVE -2158 ; [.1C41.0020.001E][*0626.0020.001E][.1C42.0020.001E] # VULGAR FRACTION FOUR FIFTHS -32BB ; [.1C41.0020.0006][.1C43.0020.0006] # CIRCLED NUMBER FORTY SIX -32BC ; [.1C41.0020.0006][.1C44.0020.0006] # CIRCLED NUMBER FORTY SEVEN -32BD ; [.1C41.0020.0006][.1C45.0020.0006] # CIRCLED NUMBER FORTY EIGHT -32BE ; [.1C41.0020.0006][.1C46.0020.0006] # CIRCLED NUMBER FORTY NINE -1F19E ; [.1C41.0020.001C][.1D65.0020.001D] # SQUARED FOUR K -33E3 ; [.1C41.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR -32C3 ; [.1C41.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL -335C ; [.1C41.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR -0035 ; [.1C42.0020.0002] # DIGIT FIVE -0665 ; [.1C42.0020.0002] # ARABIC-INDIC DIGIT FIVE -06F5 ; [.1C42.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FIVE -07C5 ; [.1C42.0020.0002] # NKO DIGIT FIVE -096B ; [.1C42.0020.0002] # DEVANAGARI DIGIT FIVE -09EB ; [.1C42.0020.0002] # BENGALI DIGIT FIVE -0A6B ; [.1C42.0020.0002] # GURMUKHI DIGIT FIVE -0AEB ; [.1C42.0020.0002] # GUJARATI DIGIT FIVE -0B6B ; [.1C42.0020.0002] # ORIYA DIGIT FIVE -0BEB ; [.1C42.0020.0002] # TAMIL DIGIT FIVE -0C6B ; [.1C42.0020.0002] # TELUGU DIGIT FIVE -0CEB ; [.1C42.0020.0002] # KANNADA DIGIT FIVE -0D6B ; [.1C42.0020.0002] # MALAYALAM DIGIT FIVE -0DEB ; [.1C42.0020.0002] # SINHALA LITH DIGIT FIVE -0E55 ; [.1C42.0020.0002] # THAI DIGIT FIVE -0ED5 ; [.1C42.0020.0002] # LAO DIGIT FIVE -0F25 ; [.1C42.0020.0002] # TIBETAN DIGIT FIVE -1045 ; [.1C42.0020.0002] # MYANMAR DIGIT FIVE -1095 ; [.1C42.0020.0002] # MYANMAR SHAN DIGIT FIVE -136D ; [.1C42.0020.0002] # ETHIOPIC DIGIT FIVE -17E5 ; [.1C42.0020.0002] # KHMER DIGIT FIVE -17F5 ; [.1C42.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM -1815 ; [.1C42.0020.0002] # MONGOLIAN DIGIT FIVE -194B ; [.1C42.0020.0002] # LIMBU DIGIT FIVE -19D5 ; [.1C42.0020.0002] # NEW TAI LUE DIGIT FIVE -1A85 ; [.1C42.0020.0002] # TAI THAM HORA DIGIT FIVE -1A95 ; [.1C42.0020.0002] # TAI THAM THAM DIGIT FIVE -1B55 ; [.1C42.0020.0002] # BALINESE DIGIT FIVE -1BB5 ; [.1C42.0020.0002] # SUNDANESE DIGIT FIVE -1C45 ; [.1C42.0020.0002] # LEPCHA DIGIT FIVE -1C55 ; [.1C42.0020.0002] # OL CHIKI DIGIT FIVE -3025 ; [.1C42.0020.0002] # HANGZHOU NUMERAL FIVE -A625 ; [.1C42.0020.0002] # VAI DIGIT FIVE -A8D5 ; [.1C42.0020.0002] # SAURASHTRA DIGIT FIVE -A905 ; [.1C42.0020.0002] # KAYAH LI DIGIT FIVE -A9D5 ; [.1C42.0020.0002] # JAVANESE DIGIT FIVE -A9F5 ; [.1C42.0020.0002] # MYANMAR TAI LAING DIGIT FIVE -AA55 ; [.1C42.0020.0002] # CHAM DIGIT FIVE -ABF5 ; [.1C42.0020.0002] # MEETEI MAYEK DIGIT FIVE -1010B ; [.1C42.0020.0002] # AEGEAN NUMBER FIVE -10143 ; [.1C42.0020.0002] # GREEK ACROPHONIC ATTIC FIVE -10148 ; [.1C42.0020.0002] # GREEK ACROPHONIC ATTIC FIVE TALENTS -1014F ; [.1C42.0020.0002] # GREEK ACROPHONIC ATTIC FIVE STATERS -1015F ; [.1C42.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE -10173 ; [.1C42.0020.0002] # GREEK ACROPHONIC DELPHIC FIVE MNAS -102E5 ; [.1C42.0020.0002] # COPTIC EPACT DIGIT FIVE -10321 ; [.1C42.0020.0002] # OLD ITALIC NUMERAL FIVE -104A5 ; [.1C42.0020.0002] # OSMANYA DIGIT FIVE -1087D ; [.1C42.0020.0002] # PALMYRENE NUMBER FIVE -108AC ; [.1C42.0020.0002] # NABATAEAN NUMBER FIVE -108FC ; [.1C42.0020.0002] # HATRAN NUMBER FIVE -109C4 ; [.1C42.0020.0002] # MEROITIC CURSIVE NUMBER FIVE -10AEC ; [.1C42.0020.0002] # MANICHAEAN NUMBER FIVE -10CFB ; [.1C42.0020.0002] # OLD HUNGARIAN NUMBER FIVE -10E64 ; [.1C42.0020.0002] # RUMI DIGIT FIVE -11056 ; [.1C42.0020.0002] # BRAHMI NUMBER FIVE -1106B ; [.1C42.0020.0002] # BRAHMI DIGIT FIVE -110F5 ; [.1C42.0020.0002] # SORA SOMPENG DIGIT FIVE -1113B ; [.1C42.0020.0002] # CHAKMA DIGIT FIVE -111D5 ; [.1C42.0020.0002] # SHARADA DIGIT FIVE -111E5 ; [.1C42.0020.0002] # SINHALA ARCHAIC DIGIT FIVE -112F5 ; [.1C42.0020.0002] # KHUDAWADI DIGIT FIVE -11455 ; [.1C42.0020.0002] # NEWA DIGIT FIVE -114D5 ; [.1C42.0020.0002] # TIRHUTA DIGIT FIVE -11655 ; [.1C42.0020.0002] # MODI DIGIT FIVE -116C5 ; [.1C42.0020.0002] # TAKRI DIGIT FIVE -11735 ; [.1C42.0020.0002] # AHOM DIGIT FIVE -118E5 ; [.1C42.0020.0002] # WARANG CITI DIGIT FIVE -11C55 ; [.1C42.0020.0002] # BHAIKSUKI DIGIT FIVE -11C5E ; [.1C42.0020.0002] # BHAIKSUKI NUMBER FIVE -12403 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH -1240A ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE DISH -12410 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U -12419 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESH2 -12422 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESHU -12427 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHAR2 -12431 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHARU -12439 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BURU -1244D ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU -12454 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 -12455 ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM -1246A ; [.1C42.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM -16A65 ; [.1C42.0020.0002] # MRO DIGIT FIVE -16B55 ; [.1C42.0020.0002] # PAHAWH HMONG DIGIT FIVE -1D364 ; [.1C42.0020.0002] # COUNTING ROD UNIT DIGIT FIVE -1E8CB ; [.1C42.0020.0002] # MENDE KIKAKUI DIGIT FIVE -1E955 ; [.1C42.0020.0002] # ADLAM DIGIT FIVE -FF15 ; [.1C42.0020.0003] # FULLWIDTH DIGIT FIVE -0F2E ; [.1C42.0020.0004] # TIBETAN DIGIT HALF FIVE -2478 ; [*0317.0020.0004][.1C42.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT FIVE -248C ; [.1C42.0020.0004][*0277.0020.0004] # DIGIT FIVE FULL STOP -1F106 ; [.1C42.0020.0004][*0222.0020.0004] # DIGIT FIVE COMMA -1D7D3 ; [.1C42.0020.0005] # MATHEMATICAL BOLD DIGIT FIVE -1D7DD ; [.1C42.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE -1D7E7 ; [.1C42.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FIVE -1D7F1 ; [.1C42.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE -1D7FB ; [.1C42.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FIVE -2464 ; [.1C42.0020.0006] # CIRCLED DIGIT FIVE -24F9 ; [.1C42.0020.0006] # DOUBLE CIRCLED DIGIT FIVE -277A ; [.1C42.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE -2784 ; [.1C42.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE -278E ; [.1C42.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE -2075 ; [.1C42.0020.0014] # SUPERSCRIPT FIVE -2085 ; [.1C42.0020.0015] # SUBSCRIPT FIVE -324C ; [.1C42.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER FIFTY ON BLACK SQUARE -32BF ; [.1C42.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER FIFTY -1F1A0 ; [.1C42.0020.001C][*0277.0020.001C][.1C3E.0020.001C] # SQUARED FIVE POINT ONE -215A ; [.1C42.0020.001E][*0626.0020.001E][.1C43.0020.001E] # VULGAR FRACTION FIVE SIXTHS -215D ; [.1C42.0020.001E][*0626.0020.001E][.1C45.0020.001E] # VULGAR FRACTION FIVE EIGHTHS -33E4 ; [.1C42.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE -32C4 ; [.1C42.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY -335D ; [.1C42.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE -0036 ; [.1C43.0020.0002] # DIGIT SIX -0666 ; [.1C43.0020.0002] # ARABIC-INDIC DIGIT SIX -06F6 ; [.1C43.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SIX -07C6 ; [.1C43.0020.0002] # NKO DIGIT SIX -096C ; [.1C43.0020.0002] # DEVANAGARI DIGIT SIX -09EC ; [.1C43.0020.0002] # BENGALI DIGIT SIX -0A6C ; [.1C43.0020.0002] # GURMUKHI DIGIT SIX -0AEC ; [.1C43.0020.0002] # GUJARATI DIGIT SIX -0B6C ; [.1C43.0020.0002] # ORIYA DIGIT SIX -0BEC ; [.1C43.0020.0002] # TAMIL DIGIT SIX -0C6C ; [.1C43.0020.0002] # TELUGU DIGIT SIX -0CEC ; [.1C43.0020.0002] # KANNADA DIGIT SIX -0D6C ; [.1C43.0020.0002] # MALAYALAM DIGIT SIX -0DEC ; [.1C43.0020.0002] # SINHALA LITH DIGIT SIX -0E56 ; [.1C43.0020.0002] # THAI DIGIT SIX -0ED6 ; [.1C43.0020.0002] # LAO DIGIT SIX -0F26 ; [.1C43.0020.0002] # TIBETAN DIGIT SIX -1046 ; [.1C43.0020.0002] # MYANMAR DIGIT SIX -1096 ; [.1C43.0020.0002] # MYANMAR SHAN DIGIT SIX -136E ; [.1C43.0020.0002] # ETHIOPIC DIGIT SIX -17E6 ; [.1C43.0020.0002] # KHMER DIGIT SIX -17F6 ; [.1C43.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-MUOY -1816 ; [.1C43.0020.0002] # MONGOLIAN DIGIT SIX -194C ; [.1C43.0020.0002] # LIMBU DIGIT SIX -19D6 ; [.1C43.0020.0002] # NEW TAI LUE DIGIT SIX -1A86 ; [.1C43.0020.0002] # TAI THAM HORA DIGIT SIX -1A96 ; [.1C43.0020.0002] # TAI THAM THAM DIGIT SIX -1B56 ; [.1C43.0020.0002] # BALINESE DIGIT SIX -1BB6 ; [.1C43.0020.0002] # SUNDANESE DIGIT SIX -1C46 ; [.1C43.0020.0002] # LEPCHA DIGIT SIX -1C56 ; [.1C43.0020.0002] # OL CHIKI DIGIT SIX -2185 ; [.1C43.0020.0002] # ROMAN NUMERAL SIX LATE FORM -3026 ; [.1C43.0020.0002] # HANGZHOU NUMERAL SIX -A626 ; [.1C43.0020.0002] # VAI DIGIT SIX -A8D6 ; [.1C43.0020.0002] # SAURASHTRA DIGIT SIX -A906 ; [.1C43.0020.0002] # KAYAH LI DIGIT SIX -A9D6 ; [.1C43.0020.0002] # JAVANESE DIGIT SIX -A9F6 ; [.1C43.0020.0002] # MYANMAR TAI LAING DIGIT SIX -AA56 ; [.1C43.0020.0002] # CHAM DIGIT SIX -ABF6 ; [.1C43.0020.0002] # MEETEI MAYEK DIGIT SIX -1010C ; [.1C43.0020.0002] # AEGEAN NUMBER SIX -102E6 ; [.1C43.0020.0002] # COPTIC EPACT DIGIT SIX -104A6 ; [.1C43.0020.0002] # OSMANYA DIGIT SIX -109C5 ; [.1C43.0020.0002] # MEROITIC CURSIVE NUMBER SIX -10E65 ; [.1C43.0020.0002] # RUMI DIGIT SIX -11057 ; [.1C43.0020.0002] # BRAHMI NUMBER SIX -1106C ; [.1C43.0020.0002] # BRAHMI DIGIT SIX -110F6 ; [.1C43.0020.0002] # SORA SOMPENG DIGIT SIX -1113C ; [.1C43.0020.0002] # CHAKMA DIGIT SIX -111D6 ; [.1C43.0020.0002] # SHARADA DIGIT SIX -111E6 ; [.1C43.0020.0002] # SINHALA ARCHAIC DIGIT SIX -112F6 ; [.1C43.0020.0002] # KHUDAWADI DIGIT SIX -11456 ; [.1C43.0020.0002] # NEWA DIGIT SIX -114D6 ; [.1C43.0020.0002] # TIRHUTA DIGIT SIX -11656 ; [.1C43.0020.0002] # MODI DIGIT SIX -116C6 ; [.1C43.0020.0002] # TAKRI DIGIT SIX -11736 ; [.1C43.0020.0002] # AHOM DIGIT SIX -118E6 ; [.1C43.0020.0002] # WARANG CITI DIGIT SIX -11C56 ; [.1C43.0020.0002] # BHAIKSUKI DIGIT SIX -11C5F ; [.1C43.0020.0002] # BHAIKSUKI NUMBER SIX -12404 ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH -1240B ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX DISH -12411 ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U -1241A ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX GESH2 -12428 ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX SHAR2 -12440 ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9 -1244E ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH TENU -1246B ; [.1C43.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM -16A66 ; [.1C43.0020.0002] # MRO DIGIT SIX -16B56 ; [.1C43.0020.0002] # PAHAWH HMONG DIGIT SIX -1D365 ; [.1C43.0020.0002] # COUNTING ROD UNIT DIGIT SIX -1E8CC ; [.1C43.0020.0002] # MENDE KIKAKUI DIGIT SIX -1E956 ; [.1C43.0020.0002] # ADLAM DIGIT SIX -FF16 ; [.1C43.0020.0003] # FULLWIDTH DIGIT SIX -0F2F ; [.1C43.0020.0004] # TIBETAN DIGIT HALF SIX -2479 ; [*0317.0020.0004][.1C43.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT SIX -248D ; [.1C43.0020.0004][*0277.0020.0004] # DIGIT SIX FULL STOP -1F107 ; [.1C43.0020.0004][*0222.0020.0004] # DIGIT SIX COMMA -1D7D4 ; [.1C43.0020.0005] # MATHEMATICAL BOLD DIGIT SIX -1D7DE ; [.1C43.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX -1D7E8 ; [.1C43.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SIX -1D7F2 ; [.1C43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX -1D7FC ; [.1C43.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SIX -2465 ; [.1C43.0020.0006] # CIRCLED DIGIT SIX -24FA ; [.1C43.0020.0006] # DOUBLE CIRCLED DIGIT SIX -277B ; [.1C43.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SIX -2785 ; [.1C43.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX -278F ; [.1C43.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX -2076 ; [.1C43.0020.0014] # SUPERSCRIPT SIX -2086 ; [.1C43.0020.0015] # SUBSCRIPT SIX -324D ; [.1C43.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER SIXTY ON BLACK SQUARE -1F1A3 ; [.1C43.0020.001C][.1C3D.0020.001C][.1E0C.0020.001D] # SQUARED SIXTY P -33E5 ; [.1C43.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX -32C5 ; [.1C43.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE -335E ; [.1C43.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX -0037 ; [.1C44.0020.0002] # DIGIT SEVEN -0667 ; [.1C44.0020.0002] # ARABIC-INDIC DIGIT SEVEN -06F7 ; [.1C44.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SEVEN -07C7 ; [.1C44.0020.0002] # NKO DIGIT SEVEN -096D ; [.1C44.0020.0002] # DEVANAGARI DIGIT SEVEN -09ED ; [.1C44.0020.0002] # BENGALI DIGIT SEVEN -0A6D ; [.1C44.0020.0002] # GURMUKHI DIGIT SEVEN -0AED ; [.1C44.0020.0002] # GUJARATI DIGIT SEVEN -0B6D ; [.1C44.0020.0002] # ORIYA DIGIT SEVEN -0BED ; [.1C44.0020.0002] # TAMIL DIGIT SEVEN -0C6D ; [.1C44.0020.0002] # TELUGU DIGIT SEVEN -0CED ; [.1C44.0020.0002] # KANNADA DIGIT SEVEN -0D6D ; [.1C44.0020.0002] # MALAYALAM DIGIT SEVEN -0DED ; [.1C44.0020.0002] # SINHALA LITH DIGIT SEVEN -0E57 ; [.1C44.0020.0002] # THAI DIGIT SEVEN -0ED7 ; [.1C44.0020.0002] # LAO DIGIT SEVEN -0F27 ; [.1C44.0020.0002] # TIBETAN DIGIT SEVEN -1047 ; [.1C44.0020.0002] # MYANMAR DIGIT SEVEN -1097 ; [.1C44.0020.0002] # MYANMAR SHAN DIGIT SEVEN -136F ; [.1C44.0020.0002] # ETHIOPIC DIGIT SEVEN -17E7 ; [.1C44.0020.0002] # KHMER DIGIT SEVEN -17F7 ; [.1C44.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-PII -1817 ; [.1C44.0020.0002] # MONGOLIAN DIGIT SEVEN -194D ; [.1C44.0020.0002] # LIMBU DIGIT SEVEN -19D7 ; [.1C44.0020.0002] # NEW TAI LUE DIGIT SEVEN -1A87 ; [.1C44.0020.0002] # TAI THAM HORA DIGIT SEVEN -1A97 ; [.1C44.0020.0002] # TAI THAM THAM DIGIT SEVEN -1B57 ; [.1C44.0020.0002] # BALINESE DIGIT SEVEN -1BB7 ; [.1C44.0020.0002] # SUNDANESE DIGIT SEVEN -1C47 ; [.1C44.0020.0002] # LEPCHA DIGIT SEVEN -1C57 ; [.1C44.0020.0002] # OL CHIKI DIGIT SEVEN -3027 ; [.1C44.0020.0002] # HANGZHOU NUMERAL SEVEN -A627 ; [.1C44.0020.0002] # VAI DIGIT SEVEN -A8D7 ; [.1C44.0020.0002] # SAURASHTRA DIGIT SEVEN -A907 ; [.1C44.0020.0002] # KAYAH LI DIGIT SEVEN -A9D7 ; [.1C44.0020.0002] # JAVANESE DIGIT SEVEN -A9F7 ; [.1C44.0020.0002] # MYANMAR TAI LAING DIGIT SEVEN -AA57 ; [.1C44.0020.0002] # CHAM DIGIT SEVEN -ABF7 ; [.1C44.0020.0002] # MEETEI MAYEK DIGIT SEVEN -1010D ; [.1C44.0020.0002] # AEGEAN NUMBER SEVEN -102E7 ; [.1C44.0020.0002] # COPTIC EPACT DIGIT SEVEN -104A7 ; [.1C44.0020.0002] # OSMANYA DIGIT SEVEN -109C6 ; [.1C44.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN -10E66 ; [.1C44.0020.0002] # RUMI DIGIT SEVEN -11058 ; [.1C44.0020.0002] # BRAHMI NUMBER SEVEN -1106D ; [.1C44.0020.0002] # BRAHMI DIGIT SEVEN -110F7 ; [.1C44.0020.0002] # SORA SOMPENG DIGIT SEVEN -1113D ; [.1C44.0020.0002] # CHAKMA DIGIT SEVEN -111D7 ; [.1C44.0020.0002] # SHARADA DIGIT SEVEN -111E7 ; [.1C44.0020.0002] # SINHALA ARCHAIC DIGIT SEVEN -112F7 ; [.1C44.0020.0002] # KHUDAWADI DIGIT SEVEN -11457 ; [.1C44.0020.0002] # NEWA DIGIT SEVEN -114D7 ; [.1C44.0020.0002] # TIRHUTA DIGIT SEVEN -11657 ; [.1C44.0020.0002] # MODI DIGIT SEVEN -116C7 ; [.1C44.0020.0002] # TAKRI DIGIT SEVEN -11737 ; [.1C44.0020.0002] # AHOM DIGIT SEVEN -118E7 ; [.1C44.0020.0002] # WARANG CITI DIGIT SEVEN -11C57 ; [.1C44.0020.0002] # BHAIKSUKI DIGIT SEVEN -11C60 ; [.1C44.0020.0002] # BHAIKSUKI NUMBER SEVEN -12405 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN ASH -1240C ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN DISH -12412 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U -1241B ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN GESH2 -12429 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2 -12441 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3 -12442 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A -12443 ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B -1246C ; [.1C44.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM -16A67 ; [.1C44.0020.0002] # MRO DIGIT SEVEN -16B57 ; [.1C44.0020.0002] # PAHAWH HMONG DIGIT SEVEN -1D366 ; [.1C44.0020.0002] # COUNTING ROD UNIT DIGIT SEVEN -1E8CD ; [.1C44.0020.0002] # MENDE KIKAKUI DIGIT SEVEN -1E957 ; [.1C44.0020.0002] # ADLAM DIGIT SEVEN -FF17 ; [.1C44.0020.0003] # FULLWIDTH DIGIT SEVEN -0F30 ; [.1C44.0020.0004] # TIBETAN DIGIT HALF SEVEN -247A ; [*0317.0020.0004][.1C44.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT SEVEN -248E ; [.1C44.0020.0004][*0277.0020.0004] # DIGIT SEVEN FULL STOP -1F108 ; [.1C44.0020.0004][*0222.0020.0004] # DIGIT SEVEN COMMA -1D7D5 ; [.1C44.0020.0005] # MATHEMATICAL BOLD DIGIT SEVEN -1D7DF ; [.1C44.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN -1D7E9 ; [.1C44.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SEVEN -1D7F3 ; [.1C44.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN -1D7FD ; [.1C44.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SEVEN -2466 ; [.1C44.0020.0006] # CIRCLED DIGIT SEVEN -24FB ; [.1C44.0020.0006] # DOUBLE CIRCLED DIGIT SEVEN -277C ; [.1C44.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN -2786 ; [.1C44.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN -2790 ; [.1C44.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN -2077 ; [.1C44.0020.0014] # SUPERSCRIPT SEVEN -2087 ; [.1C44.0020.0015] # SUBSCRIPT SEVEN -324E ; [.1C44.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER SEVENTY ON BLACK SQUARE -1F1A1 ; [.1C44.0020.001C][*0277.0020.001C][.1C3E.0020.001C] # SQUARED SEVEN POINT ONE -215E ; [.1C44.0020.001E][*0626.0020.001E][.1C45.0020.001E] # VULGAR FRACTION SEVEN EIGHTHS -33E6 ; [.1C44.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN -32C6 ; [.1C44.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY -335F ; [.1C44.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN -0038 ; [.1C45.0020.0002] # DIGIT EIGHT -0668 ; [.1C45.0020.0002] # ARABIC-INDIC DIGIT EIGHT -06F8 ; [.1C45.0020.0002] # EXTENDED ARABIC-INDIC DIGIT EIGHT -07C8 ; [.1C45.0020.0002] # NKO DIGIT EIGHT -096E ; [.1C45.0020.0002] # DEVANAGARI DIGIT EIGHT -09EE ; [.1C45.0020.0002] # BENGALI DIGIT EIGHT -0A6E ; [.1C45.0020.0002] # GURMUKHI DIGIT EIGHT -0AEE ; [.1C45.0020.0002] # GUJARATI DIGIT EIGHT -0B6E ; [.1C45.0020.0002] # ORIYA DIGIT EIGHT -0BEE ; [.1C45.0020.0002] # TAMIL DIGIT EIGHT -0C6E ; [.1C45.0020.0002] # TELUGU DIGIT EIGHT -0CEE ; [.1C45.0020.0002] # KANNADA DIGIT EIGHT -0D6E ; [.1C45.0020.0002] # MALAYALAM DIGIT EIGHT -0DEE ; [.1C45.0020.0002] # SINHALA LITH DIGIT EIGHT -0E58 ; [.1C45.0020.0002] # THAI DIGIT EIGHT -0ED8 ; [.1C45.0020.0002] # LAO DIGIT EIGHT -0F28 ; [.1C45.0020.0002] # TIBETAN DIGIT EIGHT -1048 ; [.1C45.0020.0002] # MYANMAR DIGIT EIGHT -1098 ; [.1C45.0020.0002] # MYANMAR SHAN DIGIT EIGHT -1370 ; [.1C45.0020.0002] # ETHIOPIC DIGIT EIGHT -17E8 ; [.1C45.0020.0002] # KHMER DIGIT EIGHT -17F8 ; [.1C45.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BEI -1818 ; [.1C45.0020.0002] # MONGOLIAN DIGIT EIGHT -194E ; [.1C45.0020.0002] # LIMBU DIGIT EIGHT -19D8 ; [.1C45.0020.0002] # NEW TAI LUE DIGIT EIGHT -1A88 ; [.1C45.0020.0002] # TAI THAM HORA DIGIT EIGHT -1A98 ; [.1C45.0020.0002] # TAI THAM THAM DIGIT EIGHT -1B58 ; [.1C45.0020.0002] # BALINESE DIGIT EIGHT -1BB8 ; [.1C45.0020.0002] # SUNDANESE DIGIT EIGHT -1C48 ; [.1C45.0020.0002] # LEPCHA DIGIT EIGHT -1C58 ; [.1C45.0020.0002] # OL CHIKI DIGIT EIGHT -3028 ; [.1C45.0020.0002] # HANGZHOU NUMERAL EIGHT -A628 ; [.1C45.0020.0002] # VAI DIGIT EIGHT -A8D8 ; [.1C45.0020.0002] # SAURASHTRA DIGIT EIGHT -A908 ; [.1C45.0020.0002] # KAYAH LI DIGIT EIGHT -A9D8 ; [.1C45.0020.0002] # JAVANESE DIGIT EIGHT -A9F8 ; [.1C45.0020.0002] # MYANMAR TAI LAING DIGIT EIGHT -AA58 ; [.1C45.0020.0002] # CHAM DIGIT EIGHT -ABF8 ; [.1C45.0020.0002] # MEETEI MAYEK DIGIT EIGHT -1010E ; [.1C45.0020.0002] # AEGEAN NUMBER EIGHT -102E8 ; [.1C45.0020.0002] # COPTIC EPACT DIGIT EIGHT -104A8 ; [.1C45.0020.0002] # OSMANYA DIGIT EIGHT -109C7 ; [.1C45.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT -10E67 ; [.1C45.0020.0002] # RUMI DIGIT EIGHT -11059 ; [.1C45.0020.0002] # BRAHMI NUMBER EIGHT -1106E ; [.1C45.0020.0002] # BRAHMI DIGIT EIGHT -110F8 ; [.1C45.0020.0002] # SORA SOMPENG DIGIT EIGHT -1113E ; [.1C45.0020.0002] # CHAKMA DIGIT EIGHT -111D8 ; [.1C45.0020.0002] # SHARADA DIGIT EIGHT -111E8 ; [.1C45.0020.0002] # SINHALA ARCHAIC DIGIT EIGHT -112F8 ; [.1C45.0020.0002] # KHUDAWADI DIGIT EIGHT -11458 ; [.1C45.0020.0002] # NEWA DIGIT EIGHT -114D8 ; [.1C45.0020.0002] # TIRHUTA DIGIT EIGHT -11658 ; [.1C45.0020.0002] # MODI DIGIT EIGHT -116C8 ; [.1C45.0020.0002] # TAKRI DIGIT EIGHT -11738 ; [.1C45.0020.0002] # AHOM DIGIT EIGHT -118E8 ; [.1C45.0020.0002] # WARANG CITI DIGIT EIGHT -11C58 ; [.1C45.0020.0002] # BHAIKSUKI DIGIT EIGHT -11C61 ; [.1C45.0020.0002] # BHAIKSUKI NUMBER EIGHT -12406 ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT ASH -1240D ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT DISH -12413 ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U -1241C ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT GESH2 -1242A ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2 -12444 ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU -12445 ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3 -1246D ; [.1C45.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM -16A68 ; [.1C45.0020.0002] # MRO DIGIT EIGHT -16B58 ; [.1C45.0020.0002] # PAHAWH HMONG DIGIT EIGHT -1D367 ; [.1C45.0020.0002] # COUNTING ROD UNIT DIGIT EIGHT -1E8CE ; [.1C45.0020.0002] # MENDE KIKAKUI DIGIT EIGHT -1E958 ; [.1C45.0020.0002] # ADLAM DIGIT EIGHT -FF18 ; [.1C45.0020.0003] # FULLWIDTH DIGIT EIGHT -0F31 ; [.1C45.0020.0004] # TIBETAN DIGIT HALF EIGHT -247B ; [*0317.0020.0004][.1C45.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT EIGHT -248F ; [.1C45.0020.0004][*0277.0020.0004] # DIGIT EIGHT FULL STOP -1F109 ; [.1C45.0020.0004][*0222.0020.0004] # DIGIT EIGHT COMMA -1D7D6 ; [.1C45.0020.0005] # MATHEMATICAL BOLD DIGIT EIGHT -1D7E0 ; [.1C45.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT -1D7EA ; [.1C45.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT EIGHT -1D7F4 ; [.1C45.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT -1D7FE ; [.1C45.0020.0005] # MATHEMATICAL MONOSPACE DIGIT EIGHT -2467 ; [.1C45.0020.0006] # CIRCLED DIGIT EIGHT -24FC ; [.1C45.0020.0006] # DOUBLE CIRCLED DIGIT EIGHT -277D ; [.1C45.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT -2787 ; [.1C45.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT -2791 ; [.1C45.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT -2078 ; [.1C45.0020.0014] # SUPERSCRIPT EIGHT -2088 ; [.1C45.0020.0015] # SUBSCRIPT EIGHT -324F ; [.1C45.0020.0006][.1C3D.0020.0006] # CIRCLED NUMBER EIGHTY ON BLACK SQUARE -1F19F ; [.1C45.0020.001C][.1D65.0020.001D] # SQUARED EIGHT K -33E7 ; [.1C45.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT -32C7 ; [.1C45.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST -3360 ; [.1C45.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT -0039 ; [.1C46.0020.0002] # DIGIT NINE -0669 ; [.1C46.0020.0002] # ARABIC-INDIC DIGIT NINE -06F9 ; [.1C46.0020.0002] # EXTENDED ARABIC-INDIC DIGIT NINE -07C9 ; [.1C46.0020.0002] # NKO DIGIT NINE -096F ; [.1C46.0020.0002] # DEVANAGARI DIGIT NINE -09EF ; [.1C46.0020.0002] # BENGALI DIGIT NINE -0A6F ; [.1C46.0020.0002] # GURMUKHI DIGIT NINE -0AEF ; [.1C46.0020.0002] # GUJARATI DIGIT NINE -0B6F ; [.1C46.0020.0002] # ORIYA DIGIT NINE -0BEF ; [.1C46.0020.0002] # TAMIL DIGIT NINE -0C6F ; [.1C46.0020.0002] # TELUGU DIGIT NINE -0CEF ; [.1C46.0020.0002] # KANNADA DIGIT NINE -0D6F ; [.1C46.0020.0002] # MALAYALAM DIGIT NINE -0DEF ; [.1C46.0020.0002] # SINHALA LITH DIGIT NINE -0E59 ; [.1C46.0020.0002] # THAI DIGIT NINE -0ED9 ; [.1C46.0020.0002] # LAO DIGIT NINE -0F29 ; [.1C46.0020.0002] # TIBETAN DIGIT NINE -1049 ; [.1C46.0020.0002] # MYANMAR DIGIT NINE -1099 ; [.1C46.0020.0002] # MYANMAR SHAN DIGIT NINE -1371 ; [.1C46.0020.0002] # ETHIOPIC DIGIT NINE -17E9 ; [.1C46.0020.0002] # KHMER DIGIT NINE -17F9 ; [.1C46.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BUON -1819 ; [.1C46.0020.0002] # MONGOLIAN DIGIT NINE -194F ; [.1C46.0020.0002] # LIMBU DIGIT NINE -19D9 ; [.1C46.0020.0002] # NEW TAI LUE DIGIT NINE -1A89 ; [.1C46.0020.0002] # TAI THAM HORA DIGIT NINE -1A99 ; [.1C46.0020.0002] # TAI THAM THAM DIGIT NINE -1B59 ; [.1C46.0020.0002] # BALINESE DIGIT NINE -1BB9 ; [.1C46.0020.0002] # SUNDANESE DIGIT NINE -1C49 ; [.1C46.0020.0002] # LEPCHA DIGIT NINE -1C59 ; [.1C46.0020.0002] # OL CHIKI DIGIT NINE -3029 ; [.1C46.0020.0002] # HANGZHOU NUMERAL NINE -A629 ; [.1C46.0020.0002] # VAI DIGIT NINE -A8D9 ; [.1C46.0020.0002] # SAURASHTRA DIGIT NINE -A909 ; [.1C46.0020.0002] # KAYAH LI DIGIT NINE -A9D9 ; [.1C46.0020.0002] # JAVANESE DIGIT NINE -A9F9 ; [.1C46.0020.0002] # MYANMAR TAI LAING DIGIT NINE -AA59 ; [.1C46.0020.0002] # CHAM DIGIT NINE -ABF9 ; [.1C46.0020.0002] # MEETEI MAYEK DIGIT NINE -1010F ; [.1C46.0020.0002] # AEGEAN NUMBER NINE -102E9 ; [.1C46.0020.0002] # COPTIC EPACT DIGIT NINE -104A9 ; [.1C46.0020.0002] # OSMANYA DIGIT NINE -109C8 ; [.1C46.0020.0002] # MEROITIC CURSIVE NUMBER NINE -10E68 ; [.1C46.0020.0002] # RUMI DIGIT NINE -1105A ; [.1C46.0020.0002] # BRAHMI NUMBER NINE -1106F ; [.1C46.0020.0002] # BRAHMI DIGIT NINE -110F9 ; [.1C46.0020.0002] # SORA SOMPENG DIGIT NINE -1113F ; [.1C46.0020.0002] # CHAKMA DIGIT NINE -111D9 ; [.1C46.0020.0002] # SHARADA DIGIT NINE -111E9 ; [.1C46.0020.0002] # SINHALA ARCHAIC DIGIT NINE -112F9 ; [.1C46.0020.0002] # KHUDAWADI DIGIT NINE -11459 ; [.1C46.0020.0002] # NEWA DIGIT NINE -114D9 ; [.1C46.0020.0002] # TIRHUTA DIGIT NINE -11659 ; [.1C46.0020.0002] # MODI DIGIT NINE -116C9 ; [.1C46.0020.0002] # TAKRI DIGIT NINE -11739 ; [.1C46.0020.0002] # AHOM DIGIT NINE -118E9 ; [.1C46.0020.0002] # WARANG CITI DIGIT NINE -11C59 ; [.1C46.0020.0002] # BHAIKSUKI DIGIT NINE -11C62 ; [.1C46.0020.0002] # BHAIKSUKI NUMBER NINE -12407 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE ASH -1240E ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE DISH -12414 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U -1241D ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE GESH2 -1242B ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE SHAR2 -12446 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU -12447 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3 -12448 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4 -12449 ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A -1246E ; [.1C46.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM -16A69 ; [.1C46.0020.0002] # MRO DIGIT NINE -16B59 ; [.1C46.0020.0002] # PAHAWH HMONG DIGIT NINE -1D368 ; [.1C46.0020.0002] # COUNTING ROD UNIT DIGIT NINE -1E8CF ; [.1C46.0020.0002] # MENDE KIKAKUI DIGIT NINE -1E959 ; [.1C46.0020.0002] # ADLAM DIGIT NINE -FF19 ; [.1C46.0020.0003] # FULLWIDTH DIGIT NINE -0F32 ; [.1C46.0020.0004] # TIBETAN DIGIT HALF NINE -247C ; [*0317.0020.0004][.1C46.0020.0004][*0318.0020.0004] # PARENTHESIZED DIGIT NINE -2490 ; [.1C46.0020.0004][*0277.0020.0004] # DIGIT NINE FULL STOP -1F10A ; [.1C46.0020.0004][*0222.0020.0004] # DIGIT NINE COMMA -1D7D7 ; [.1C46.0020.0005] # MATHEMATICAL BOLD DIGIT NINE -1D7E1 ; [.1C46.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE -1D7EB ; [.1C46.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT NINE -1D7F5 ; [.1C46.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE -1D7FF ; [.1C46.0020.0005] # MATHEMATICAL MONOSPACE DIGIT NINE -2468 ; [.1C46.0020.0006] # CIRCLED DIGIT NINE -24FD ; [.1C46.0020.0006] # DOUBLE CIRCLED DIGIT NINE -277E ; [.1C46.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT NINE -2788 ; [.1C46.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE -2792 ; [.1C46.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE -2079 ; [.1C46.0020.0014] # SUPERSCRIPT NINE -2089 ; [.1C46.0020.0015] # SUBSCRIPT NINE -33E8 ; [.1C46.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE -32C8 ; [.1C46.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER -3361 ; [.1C46.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE -0061 ; [.1C47.0020.0002] # LATIN SMALL LETTER A -FF41 ; [.1C47.0020.0003] # FULLWIDTH LATIN SMALL LETTER A -0363 ; [.1C47.0020.0004] # COMBINING LATIN SMALL LETTER A -249C ; [*0317.0020.0004][.1C47.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER A -1D41A ; [.1C47.0020.0005] # MATHEMATICAL BOLD SMALL A -1D44E ; [.1C47.0020.0005] # MATHEMATICAL ITALIC SMALL A -1D482 ; [.1C47.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL A -1D4B6 ; [.1C47.0020.0005] # MATHEMATICAL SCRIPT SMALL A -1D4EA ; [.1C47.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL A -1D51E ; [.1C47.0020.0005] # MATHEMATICAL FRAKTUR SMALL A -1D552 ; [.1C47.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL A -1D586 ; [.1C47.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL A -1D5BA ; [.1C47.0020.0005] # MATHEMATICAL SANS-SERIF SMALL A -1D5EE ; [.1C47.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL A -1D622 ; [.1C47.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL A -1D656 ; [.1C47.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A -1D68A ; [.1C47.0020.0005] # MATHEMATICAL MONOSPACE SMALL A -24D0 ; [.1C47.0020.0006] # CIRCLED LATIN SMALL LETTER A -0041 ; [.1C47.0020.0008] # LATIN CAPITAL LETTER A -FF21 ; [.1C47.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER A -1F110 ; [*0317.0020.0004][.1C47.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER A -1D400 ; [.1C47.0020.000B] # MATHEMATICAL BOLD CAPITAL A -1D434 ; [.1C47.0020.000B] # MATHEMATICAL ITALIC CAPITAL A -1D468 ; [.1C47.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL A -1D49C ; [.1C47.0020.000B] # MATHEMATICAL SCRIPT CAPITAL A -1D4D0 ; [.1C47.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL A -1D504 ; [.1C47.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL A -1D538 ; [.1C47.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A -1D56C ; [.1C47.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL A -1D5A0 ; [.1C47.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL A -1D5D4 ; [.1C47.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A -1D608 ; [.1C47.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A -1D63C ; [.1C47.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A -1D670 ; [.1C47.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL A -24B6 ; [.1C47.0020.000C] # CIRCLED LATIN CAPITAL LETTER A -1F150 ; [.1C47.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER A -00AA ; [.1C47.0020.0014] # FEMININE ORDINAL INDICATOR -1D43 ; [.1C47.0020.0014] # MODIFIER LETTER SMALL A -2090 ; [.1C47.0020.0015] # LATIN SUBSCRIPT SMALL LETTER A -1D2C ; [.1C47.0020.001D] # MODIFIER LETTER CAPITAL A -1F130 ; [.1C47.0020.001D] # SQUARED LATIN CAPITAL LETTER A -1F170 ; [.1C47.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER A -00E1 ; [.1C47.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH ACUTE -00C1 ; [.1C47.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH ACUTE -00E0 ; [.1C47.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH GRAVE -00C0 ; [.1C47.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH GRAVE -0103 ; [.1C47.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE -0102 ; [.1C47.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE -1EAF ; [.1C47.0020.0002][.0000.0026.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH BREVE AND ACUTE -1EAE ; [.1C47.0020.0008][.0000.0026.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE -1EB1 ; [.1C47.0020.0002][.0000.0026.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH BREVE AND GRAVE -1EB0 ; [.1C47.0020.0008][.0000.0026.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE -1EB5 ; [.1C47.0020.0002][.0000.0026.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH BREVE AND TILDE -1EB4 ; [.1C47.0020.0008][.0000.0026.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE -1EB3 ; [.1C47.0020.0002][.0000.0026.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE -1EB2 ; [.1C47.0020.0008][.0000.0026.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE -00E2 ; [.1C47.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX -00C2 ; [.1C47.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -1EA5 ; [.1C47.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA4 ; [.1C47.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA7 ; [.1C47.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE -1EA6 ; [.1C47.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE -1EAB ; [.1C47.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE -1EAA ; [.1C47.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE -1EA9 ; [.1C47.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -1EA8 ; [.1C47.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -01CE ; [.1C47.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER A WITH CARON -01CD ; [.1C47.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER A WITH CARON -00E5 ; [.1C47.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER A WITH RING ABOVE -00C5 ; [.1C47.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE -212B ; [.1C47.0020.0008][.0000.0029.0002] # ANGSTROM SIGN -01FB ; [.1C47.0020.0002][.0000.0029.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE -01FA ; [.1C47.0020.0008][.0000.0029.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE -00E4 ; [.1C47.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER A WITH DIAERESIS -1DF2 ; [.1C47.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER A WITH DIAERESIS -A79B ; [.1C47.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK AE -00C4 ; [.1C47.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS -A79A ; [.1C47.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK AE -01DF ; [.1C47.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON -01DE ; [.1C47.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON -00E3 ; [.1C47.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH TILDE -00C3 ; [.1C47.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH TILDE -0227 ; [.1C47.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER A WITH DOT ABOVE -0226 ; [.1C47.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE -01E1 ; [.1C47.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON -01E0 ; [.1C47.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON -0105 ; [.1C47.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER A WITH OGONEK -0104 ; [.1C47.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER A WITH OGONEK -0101 ; [.1C47.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH MACRON -0100 ; [.1C47.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH MACRON -1EA3 ; [.1C47.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH HOOK ABOVE -1EA2 ; [.1C47.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH HOOK ABOVE -0201 ; [.1C47.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER A WITH DOUBLE GRAVE -0200 ; [.1C47.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE -0203 ; [.1C47.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER A WITH INVERTED BREVE -0202 ; [.1C47.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER A WITH INVERTED BREVE -1EA1 ; [.1C47.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER A WITH DOT BELOW -1EA0 ; [.1C47.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER A WITH DOT BELOW -1EB7 ; [.1C47.0020.0002][.0000.0042.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW -1EB6 ; [.1C47.0020.0008][.0000.0042.0002][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW -1EAD ; [.1C47.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1EAC ; [.1C47.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1E01 ; [.1C47.0020.0002][.0000.0044.0002] # LATIN SMALL LETTER A WITH RING BELOW -1E00 ; [.1C47.0020.0008][.0000.0044.0002] # LATIN CAPITAL LETTER A WITH RING BELOW -1DD3 ; [.1C47.0020.0004][.0000.0110.0004] # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE -A733 ; [.1C47.0020.0004][.1C47.0020.0004] # LATIN SMALL LETTER AA -A732 ; [.1C47.0020.000A][.1C47.0020.000A] # LATIN CAPITAL LETTER AA -1F18E ; [.1C47.0020.001D][.1C60.0020.001D] # NEGATIVE SQUARED AB -2100 ; [.1C47.0020.0004][*0394.0020.0004][.1C7A.0020.0004] # ACCOUNT OF -00E6 ; [.1C47.0020.0004][.0000.0110.0004][.1CAA.0020.0004] # LATIN SMALL LETTER AE -1DD4 ; [.1C47.0020.0004][.0000.0110.0004][.1CAA.0020.0004] # COMBINING LATIN SMALL LETTER AE -00C6 ; [.1C47.0020.000A][.0000.0110.0004][.1CAA.0020.000A] # LATIN CAPITAL LETTER AE -1D2D ; [.1C47.0020.0014][.0000.0110.0014][.1CAA.0020.0014] # MODIFIER LETTER CAPITAL AE -01FD ; [.1C47.0020.0004][.0000.0110.0004][.1CAA.0020.0004][.0000.0024.0002] # LATIN SMALL LETTER AE WITH ACUTE -01FC ; [.1C47.0020.000A][.0000.0110.0004][.1CAA.0020.000A][.0000.0024.0002] # LATIN CAPITAL LETTER AE WITH ACUTE -01E3 ; [.1C47.0020.0004][.0000.0110.0004][.1CAA.0020.0004][.0000.0032.0002] # LATIN SMALL LETTER AE WITH MACRON -01E2 ; [.1C47.0020.000A][.0000.0110.0004][.1CAA.0020.000A][.0000.0032.0002] # LATIN CAPITAL LETTER AE WITH MACRON -33C2 ; [.1C47.0020.001C][*0277.0020.001C][.1DAA.0020.001C][*0277.0020.001C] # SQUARE AM -33DF ; [.1C47.0020.001D][*0625.0020.001C][.1DAA.0020.001C] # SQUARE A OVER M -1DD5 ; [.1C47.0020.0004][.1DDD.0020.0004] # COMBINING LATIN SMALL LETTER AO -A735 ; [.1C47.0020.0004][.1DDD.0020.0004] # LATIN SMALL LETTER AO -A734 ; [.1C47.0020.000A][.1DDD.0020.000A] # LATIN CAPITAL LETTER AO -2101 ; [.1C47.0020.0004][*0394.0020.0004][.1E71.0020.0004] # ADDRESSED TO THE SUBJECT -214D ; [.1C47.0020.000A][*0394.0020.0004][.1E71.0020.000A] # AKTIESELSKAB -A737 ; [.1C47.0020.0004][.1EB5.0020.0004] # LATIN SMALL LETTER AU -A736 ; [.1C47.0020.000A][.1EB5.0020.000A] # LATIN CAPITAL LETTER AU -3373 ; [.1C47.0020.001D][.1EB5.0020.001D] # SQUARE AU -1DD6 ; [.1C47.0020.0004][.1EE3.0020.0004] # COMBINING LATIN SMALL LETTER AV -A739 ; [.1C47.0020.0004][.1EE3.0020.0004] # LATIN SMALL LETTER AV -A738 ; [.1C47.0020.000A][.1EE3.0020.000A] # LATIN CAPITAL LETTER AV -A73B ; [.1C47.0020.0004][.0000.0110.0004][.1EE3.0020.0004] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR -A73A ; [.1C47.0020.000A][.0000.0110.0004][.1EE3.0020.000A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR -A73D ; [.1C47.0020.0004][.1F0B.0020.0004] # LATIN SMALL LETTER AY -A73C ; [.1C47.0020.000A][.1F0B.0020.000A] # LATIN CAPITAL LETTER AY -1E9A ; [.1C47.0020.0004][.1F80.0020.0004] # LATIN SMALL LETTER A WITH RIGHT HALF RING -1D00 ; [.1C4B.0020.0002] # LATIN LETTER SMALL CAPITAL A -2C65 ; [.1C4C.0020.0002] # LATIN SMALL LETTER A WITH STROKE -023A ; [.1C4C.0020.0008] # LATIN CAPITAL LETTER A WITH STROKE -1D8F ; [.1C4D.0020.0002] # LATIN SMALL LETTER A WITH RETROFLEX HOOK -1D01 ; [.1C4E.0020.0002] # LATIN LETTER SMALL CAPITAL AE -1D02 ; [.1C4F.0020.0002] # LATIN SMALL LETTER TURNED AE -1D46 ; [.1C4F.0020.0014] # MODIFIER LETTER SMALL TURNED AE -AB31 ; [.1C50.0020.0002] # LATIN SMALL LETTER A REVERSED-SCHWA -0250 ; [.1C51.0020.0002] # LATIN SMALL LETTER TURNED A -2C6F ; [.1C51.0020.0008] # LATIN CAPITAL LETTER TURNED A -1D44 ; [.1C51.0020.0014] # MODIFIER LETTER SMALL TURNED A -0251 ; [.1C55.0020.0002] # LATIN SMALL LETTER ALPHA -1DE7 ; [.1C55.0020.0004] # COMBINING LATIN SMALL LETTER ALPHA -2C6D ; [.1C55.0020.0008] # LATIN CAPITAL LETTER ALPHA -1D45 ; [.1C55.0020.0014] # MODIFIER LETTER SMALL ALPHA -AB30 ; [.1C59.0020.0002] # LATIN SMALL LETTER BARRED ALPHA -1D90 ; [.1C5A.0020.0002] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK -0252 ; [.1C5B.0020.0002] # LATIN SMALL LETTER TURNED ALPHA -2C70 ; [.1C5B.0020.0008] # LATIN CAPITAL LETTER TURNED ALPHA -1D9B ; [.1C5B.0020.0014] # MODIFIER LETTER SMALL TURNED ALPHA -AB64 ; [.1C5F.0020.0002] # LATIN SMALL LETTER INVERTED ALPHA -0062 ; [.1C60.0020.0002] # LATIN SMALL LETTER B -FF42 ; [.1C60.0020.0003] # FULLWIDTH LATIN SMALL LETTER B -1DE8 ; [.1C60.0020.0004] # COMBINING LATIN SMALL LETTER B -249D ; [*0317.0020.0004][.1C60.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER B -1D41B ; [.1C60.0020.0005] # MATHEMATICAL BOLD SMALL B -1D44F ; [.1C60.0020.0005] # MATHEMATICAL ITALIC SMALL B -1D483 ; [.1C60.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL B -1D4B7 ; [.1C60.0020.0005] # MATHEMATICAL SCRIPT SMALL B -1D4EB ; [.1C60.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL B -1D51F ; [.1C60.0020.0005] # MATHEMATICAL FRAKTUR SMALL B -1D553 ; [.1C60.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL B -1D587 ; [.1C60.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL B -1D5BB ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF SMALL B -1D5EF ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL B -1D623 ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL B -1D657 ; [.1C60.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B -1D68B ; [.1C60.0020.0005] # MATHEMATICAL MONOSPACE SMALL B -24D1 ; [.1C60.0020.0006] # CIRCLED LATIN SMALL LETTER B -0042 ; [.1C60.0020.0008] # LATIN CAPITAL LETTER B -FF22 ; [.1C60.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER B -1F111 ; [*0317.0020.0004][.1C60.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER B -212C ; [.1C60.0020.000B] # SCRIPT CAPITAL B -1D401 ; [.1C60.0020.000B] # MATHEMATICAL BOLD CAPITAL B -1D435 ; [.1C60.0020.000B] # MATHEMATICAL ITALIC CAPITAL B -1D469 ; [.1C60.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL B -1D4D1 ; [.1C60.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL B -1D505 ; [.1C60.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL B -1D539 ; [.1C60.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D56D ; [.1C60.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL B -1D5A1 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL B -1D5D5 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B -1D609 ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B -1D63D ; [.1C60.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B -1D671 ; [.1C60.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL B -24B7 ; [.1C60.0020.000C] # CIRCLED LATIN CAPITAL LETTER B -1F151 ; [.1C60.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER B -1D47 ; [.1C60.0020.0014] # MODIFIER LETTER SMALL B -1D2E ; [.1C60.0020.001D] # MODIFIER LETTER CAPITAL B -1F131 ; [.1C60.0020.001D] # SQUARED LATIN CAPITAL LETTER B -1F171 ; [.1C60.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER B -1E03 ; [.1C60.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER B WITH DOT ABOVE -1E02 ; [.1C60.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER B WITH DOT ABOVE -1E05 ; [.1C60.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER B WITH DOT BELOW -1E04 ; [.1C60.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER B WITH DOT BELOW -1E07 ; [.1C60.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER B WITH LINE BELOW -1E06 ; [.1C60.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER B WITH LINE BELOW -3374 ; [.1C60.0020.001C][.1C47.0020.001C][.1E33.0020.001C] # SQUARE BAR -33C3 ; [.1C60.0020.001D][.1E21.0020.001C] # SQUARE BQ -0299 ; [.1C64.0020.0002] # LATIN LETTER SMALL CAPITAL B -0180 ; [.1C68.0020.0002] # LATIN SMALL LETTER B WITH STROKE -0243 ; [.1C68.0020.0008] # LATIN CAPITAL LETTER B WITH STROKE -1D2F ; [.1C6C.0020.0002] # MODIFIER LETTER CAPITAL BARRED B -1D03 ; [.1C6D.0020.0002] # LATIN LETTER SMALL CAPITAL BARRED B -1D6C ; [.1C6E.0020.0002] # LATIN SMALL LETTER B WITH MIDDLE TILDE -A797 ; [.1C6F.0020.0002] # LATIN SMALL LETTER B WITH FLOURISH -A796 ; [.1C6F.0020.0008] # LATIN CAPITAL LETTER B WITH FLOURISH -1D80 ; [.1C70.0020.0002] # LATIN SMALL LETTER B WITH PALATAL HOOK -0253 ; [.1C71.0020.0002] # LATIN SMALL LETTER B WITH HOOK -0181 ; [.1C71.0020.0008] # LATIN CAPITAL LETTER B WITH HOOK -0183 ; [.1C75.0020.0002] # LATIN SMALL LETTER B WITH TOPBAR -0182 ; [.1C75.0020.0008] # LATIN CAPITAL LETTER B WITH TOPBAR -A7B5 ; [.1C79.0020.0002] # LATIN SMALL LETTER BETA -1DE9 ; [.1C79.0020.0004] # COMBINING LATIN SMALL LETTER BETA -A7B4 ; [.1C79.0020.0008] # LATIN CAPITAL LETTER BETA -0063 ; [.1C7A.0020.0002] # LATIN SMALL LETTER C -FF43 ; [.1C7A.0020.0003] # FULLWIDTH LATIN SMALL LETTER C -0368 ; [.1C7A.0020.0004] # COMBINING LATIN SMALL LETTER C -217D ; [.1C7A.0020.0004] # SMALL ROMAN NUMERAL ONE HUNDRED -249E ; [*0317.0020.0004][.1C7A.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER C -1D41C ; [.1C7A.0020.0005] # MATHEMATICAL BOLD SMALL C -1D450 ; [.1C7A.0020.0005] # MATHEMATICAL ITALIC SMALL C -1D484 ; [.1C7A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL C -1D4B8 ; [.1C7A.0020.0005] # MATHEMATICAL SCRIPT SMALL C -1D4EC ; [.1C7A.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL C -1D520 ; [.1C7A.0020.0005] # MATHEMATICAL FRAKTUR SMALL C -1D554 ; [.1C7A.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL C -1D588 ; [.1C7A.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL C -1D5BC ; [.1C7A.0020.0005] # MATHEMATICAL SANS-SERIF SMALL C -1D5F0 ; [.1C7A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL C -1D624 ; [.1C7A.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL C -1D658 ; [.1C7A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C -1D68C ; [.1C7A.0020.0005] # MATHEMATICAL MONOSPACE SMALL C -24D2 ; [.1C7A.0020.0006] # CIRCLED LATIN SMALL LETTER C -0043 ; [.1C7A.0020.0008] # LATIN CAPITAL LETTER C -FF23 ; [.1C7A.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER C -2103 ; [*04F6.0020.0004][.1C7A.0020.000A] # DEGREE CELSIUS -216D ; [.1C7A.0020.000A] # ROMAN NUMERAL ONE HUNDRED -1F112 ; [*0317.0020.0004][.1C7A.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER C -2102 ; [.1C7A.0020.000B] # DOUBLE-STRUCK CAPITAL C -212D ; [.1C7A.0020.000B] # BLACK-LETTER CAPITAL C -1D402 ; [.1C7A.0020.000B] # MATHEMATICAL BOLD CAPITAL C -1D436 ; [.1C7A.0020.000B] # MATHEMATICAL ITALIC CAPITAL C -1D46A ; [.1C7A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL C -1D49E ; [.1C7A.0020.000B] # MATHEMATICAL SCRIPT CAPITAL C -1D4D2 ; [.1C7A.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL C -1D56E ; [.1C7A.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL C -1D5A2 ; [.1C7A.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL C -1D5D6 ; [.1C7A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C -1D60A ; [.1C7A.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C -1D63E ; [.1C7A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C -1D672 ; [.1C7A.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL C -24B8 ; [.1C7A.0020.000C] # CIRCLED LATIN CAPITAL LETTER C -1F12B ; [.1C7A.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER C -1F152 ; [.1C7A.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER C -1D9C ; [.1C7A.0020.0014] # MODIFIER LETTER SMALL C -1F132 ; [.1C7A.0020.001D] # SQUARED LATIN CAPITAL LETTER C -1F172 ; [.1C7A.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER C -0107 ; [.1C7A.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH ACUTE -0106 ; [.1C7A.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH ACUTE -0109 ; [.1C7A.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER C WITH CIRCUMFLEX -0108 ; [.1C7A.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX -010D ; [.1C7A.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER C WITH CARON -010C ; [.1C7A.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER C WITH CARON -010B ; [.1C7A.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER C WITH DOT ABOVE -010A ; [.1C7A.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER C WITH DOT ABOVE -00E7 ; [.1C7A.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER C WITH CEDILLA -1DD7 ; [.1C7A.0020.0004][.0000.0030.0004] # COMBINING LATIN SMALL LETTER C CEDILLA -00C7 ; [.1C7A.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER C WITH CEDILLA -1E09 ; [.1C7A.0020.0002][.0000.0030.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE -1E08 ; [.1C7A.0020.0008][.0000.0030.0002][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE -3388 ; [.1C7A.0020.001C][.1C47.0020.001C][.1D77.0020.001C] # SQUARE CAL -33C4 ; [.1C7A.0020.001C][.1C7A.0020.001C] # SQUARE CC -1F12D ; [.1C7A.0020.000C][.1C8F.0020.000C] # CIRCLED CD -33C5 ; [.1C7A.0020.001C][.1C8F.0020.001C] # SQUARE CD -33C6 ; [.1C7A.0020.001D][*0625.0020.001C][.1D65.0020.001C][.1CF4.0020.001C] # SQUARE C OVER KG -1F191 ; [.1C7A.0020.001D][.1D77.0020.001D] # SQUARED CL -339D ; [.1C7A.0020.001C][.1DAA.0020.001C] # SQUARE CM -33A0 ; [.1C7A.0020.001C][.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE CM SQUARED -33A4 ; [.1C7A.0020.001C][.1DAA.0020.001C][.1C40.0020.001C] # SQUARE CM CUBED -2105 ; [.1C7A.0020.0004][*0394.0020.0004][.1DDD.0020.0004] # CARE OF -33C7 ; [.1C7A.0020.001D][.1DDD.0020.001C][*0277.0020.001C] # SQUARE CO -1F192 ; [.1C7A.0020.001D][.1DDD.0020.001D][.1DDD.0020.001D][.1D77.0020.001D] # SQUARED COOL -2106 ; [.1C7A.0020.0004][*0394.0020.0004][.1EB5.0020.0004] # CADA UNA -1D04 ; [.1C7E.0020.0002] # LATIN LETTER SMALL CAPITAL C -023C ; [.1C7F.0020.0002] # LATIN SMALL LETTER C WITH STROKE -023B ; [.1C7F.0020.0008] # LATIN CAPITAL LETTER C WITH STROKE -A793 ; [.1C83.0020.0002] # LATIN SMALL LETTER C WITH BAR -A792 ; [.1C83.0020.0008] # LATIN CAPITAL LETTER C WITH BAR -A794 ; [.1C84.0020.0002] # LATIN SMALL LETTER C WITH PALATAL HOOK -0188 ; [.1C85.0020.0002] # LATIN SMALL LETTER C WITH HOOK -0187 ; [.1C85.0020.0008] # LATIN CAPITAL LETTER C WITH HOOK -0255 ; [.1C89.0020.0002] # LATIN SMALL LETTER C WITH CURL -1D9D ; [.1C89.0020.0014] # MODIFIER LETTER SMALL C WITH CURL -2184 ; [.1C8D.0020.0002] # LATIN SMALL LETTER REVERSED C -2183 ; [.1C8D.0020.0008] # ROMAN NUMERAL REVERSED ONE HUNDRED -A73F ; [.1C8E.0020.0002] # LATIN SMALL LETTER REVERSED C WITH DOT -A73E ; [.1C8E.0020.0008] # LATIN CAPITAL LETTER REVERSED C WITH DOT -0064 ; [.1C8F.0020.0002] # LATIN SMALL LETTER D -FF44 ; [.1C8F.0020.0003] # FULLWIDTH LATIN SMALL LETTER D -0369 ; [.1C8F.0020.0004] # COMBINING LATIN SMALL LETTER D -217E ; [.1C8F.0020.0004] # SMALL ROMAN NUMERAL FIVE HUNDRED -249F ; [*0317.0020.0004][.1C8F.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER D -2146 ; [.1C8F.0020.0005] # DOUBLE-STRUCK ITALIC SMALL D -1D41D ; [.1C8F.0020.0005] # MATHEMATICAL BOLD SMALL D -1D451 ; [.1C8F.0020.0005] # MATHEMATICAL ITALIC SMALL D -1D485 ; [.1C8F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL D -1D4B9 ; [.1C8F.0020.0005] # MATHEMATICAL SCRIPT SMALL D -1D4ED ; [.1C8F.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL D -1D521 ; [.1C8F.0020.0005] # MATHEMATICAL FRAKTUR SMALL D -1D555 ; [.1C8F.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL D -1D589 ; [.1C8F.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL D -1D5BD ; [.1C8F.0020.0005] # MATHEMATICAL SANS-SERIF SMALL D -1D5F1 ; [.1C8F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL D -1D625 ; [.1C8F.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL D -1D659 ; [.1C8F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D -1D68D ; [.1C8F.0020.0005] # MATHEMATICAL MONOSPACE SMALL D -24D3 ; [.1C8F.0020.0006] # CIRCLED LATIN SMALL LETTER D -0044 ; [.1C8F.0020.0008] # LATIN CAPITAL LETTER D -FF24 ; [.1C8F.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER D -216E ; [.1C8F.0020.000A] # ROMAN NUMERAL FIVE HUNDRED -1F113 ; [*0317.0020.0004][.1C8F.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER D -2145 ; [.1C8F.0020.000B] # DOUBLE-STRUCK ITALIC CAPITAL D -1D403 ; [.1C8F.0020.000B] # MATHEMATICAL BOLD CAPITAL D -1D437 ; [.1C8F.0020.000B] # MATHEMATICAL ITALIC CAPITAL D -1D46B ; [.1C8F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL D -1D49F ; [.1C8F.0020.000B] # MATHEMATICAL SCRIPT CAPITAL D -1D4D3 ; [.1C8F.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL D -1D507 ; [.1C8F.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL D -1D53B ; [.1C8F.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D -1D56F ; [.1C8F.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL D -1D5A3 ; [.1C8F.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL D -1D5D7 ; [.1C8F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D -1D60B ; [.1C8F.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D -1D63F ; [.1C8F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D -1D673 ; [.1C8F.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL D -24B9 ; [.1C8F.0020.000C] # CIRCLED LATIN CAPITAL LETTER D -1F153 ; [.1C8F.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER D -1D48 ; [.1C8F.0020.0014] # MODIFIER LETTER SMALL D -1F1A5 ; [.1C8F.0020.001C] # SQUARED LATIN SMALL LETTER D -1D30 ; [.1C8F.0020.001D] # MODIFIER LETTER CAPITAL D -1F133 ; [.1C8F.0020.001D] # SQUARED LATIN CAPITAL LETTER D -1F173 ; [.1C8F.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER D -010F ; [.1C8F.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER D WITH CARON -010E ; [.1C8F.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER D WITH CARON -1E0B ; [.1C8F.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER D WITH DOT ABOVE -1E0A ; [.1C8F.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER D WITH DOT ABOVE -1E11 ; [.1C8F.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER D WITH CEDILLA -1E10 ; [.1C8F.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER D WITH CEDILLA -0111 ; [.1C8F.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER D WITH STROKE -0110 ; [.1C8F.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER D WITH STROKE -1E0D ; [.1C8F.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER D WITH DOT BELOW -1E0C ; [.1C8F.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER D WITH DOT BELOW -1E13 ; [.1C8F.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW -1E12 ; [.1C8F.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW -1E0F ; [.1C8F.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER D WITH LINE BELOW -1E0E ; [.1C8F.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER D WITH LINE BELOW -00F0 ; [.1C8F.0020.0004][.0000.0110.0004] # LATIN SMALL LETTER ETH -1DD9 ; [.1C8F.0020.0004][.0000.0110.0004] # COMBINING LATIN SMALL LETTER ETH -00D0 ; [.1C8F.0020.000A][.0000.0110.0004] # LATIN CAPITAL LETTER ETH -1D9E ; [.1C8F.0020.0014][.0000.0110.0014] # MODIFIER LETTER SMALL ETH -1DD8 ; [.1C8F.0020.0004][.0000.0111.0004] # COMBINING LATIN SMALL LETTER INSULAR D -A77A ; [.1C8F.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR D -A779 ; [.1C8F.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR D -3372 ; [.1C8F.0020.001C][.1C47.0020.001C] # SQUARE DA -0238 ; [.1C8F.0020.0004][.1C60.0020.0004] # LATIN SMALL LETTER DB DIGRAPH -33C8 ; [.1C8F.0020.001C][.1C60.0020.001D] # SQUARE DB -1F190 ; [.1C8F.0020.001D][.1D4C.0020.001D] # SQUARE DJ -3397 ; [.1C8F.0020.001C][.1D77.0020.001C] # SQUARE DL -3377 ; [.1C8F.0020.001C][.1DAA.0020.001C] # SQUARE DM -3378 ; [.1C8F.0020.001C][.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE DM SQUARED -3379 ; [.1C8F.0020.001C][.1DAA.0020.001C][.1C40.0020.001C] # SQUARE DM CUBED -01F3 ; [.1C8F.0020.0004][.1F21.0020.0004] # LATIN SMALL LETTER DZ -02A3 ; [.1C8F.0020.0004][.1F21.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH -01F2 ; [.1C8F.0020.000A][.1F21.0020.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z -01F1 ; [.1C8F.0020.000A][.1F21.0020.000A] # LATIN CAPITAL LETTER DZ -01C6 ; [.1C8F.0020.0004][.1F21.0020.0004][.0000.0028.0004] # LATIN SMALL LETTER DZ WITH CARON -01C5 ; [.1C8F.0020.000A][.1F21.0020.0004][.0000.0028.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON -01C4 ; [.1C8F.0020.000A][.1F21.0020.000A][.0000.0028.0004] # LATIN CAPITAL LETTER DZ WITH CARON -02A5 ; [.1C8F.0020.0004][.1F34.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL -02A4 ; [.1C8F.0020.0004][.1F3E.0020.0004] # LATIN SMALL LETTER DEZH DIGRAPH -1D05 ; [.1C93.0020.0002] # LATIN LETTER SMALL CAPITAL D -1D06 ; [.1C94.0020.0002] # LATIN LETTER SMALL CAPITAL ETH -1D6D ; [.1C95.0020.0002] # LATIN SMALL LETTER D WITH MIDDLE TILDE -1D81 ; [.1C96.0020.0002] # LATIN SMALL LETTER D WITH PALATAL HOOK -0256 ; [.1C97.0020.0002] # LATIN SMALL LETTER D WITH TAIL -0189 ; [.1C97.0020.0008] # LATIN CAPITAL LETTER AFRICAN D -0257 ; [.1C9B.0020.0002] # LATIN SMALL LETTER D WITH HOOK -018A ; [.1C9B.0020.0008] # LATIN CAPITAL LETTER D WITH HOOK -1D91 ; [.1C9F.0020.0002] # LATIN SMALL LETTER D WITH HOOK AND TAIL -018C ; [.1CA0.0020.0002] # LATIN SMALL LETTER D WITH TOPBAR -018B ; [.1CA0.0020.0008] # LATIN CAPITAL LETTER D WITH TOPBAR -0221 ; [.1CA4.0020.0002] # LATIN SMALL LETTER D WITH CURL -A771 ; [.1CA8.0020.0002] # LATIN SMALL LETTER DUM -1E9F ; [.1CA9.0020.0002] # LATIN SMALL LETTER DELTA -0065 ; [.1CAA.0020.0002] # LATIN SMALL LETTER E -FF45 ; [.1CAA.0020.0003] # FULLWIDTH LATIN SMALL LETTER E -0364 ; [.1CAA.0020.0004] # COMBINING LATIN SMALL LETTER E -24A0 ; [*0317.0020.0004][.1CAA.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER E -212F ; [.1CAA.0020.0005] # SCRIPT SMALL E -2147 ; [.1CAA.0020.0005] # DOUBLE-STRUCK ITALIC SMALL E -1D41E ; [.1CAA.0020.0005] # MATHEMATICAL BOLD SMALL E -1D452 ; [.1CAA.0020.0005] # MATHEMATICAL ITALIC SMALL E -1D486 ; [.1CAA.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL E -1D4EE ; [.1CAA.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL E -1D522 ; [.1CAA.0020.0005] # MATHEMATICAL FRAKTUR SMALL E -1D556 ; [.1CAA.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL E -1D58A ; [.1CAA.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL E -1D5BE ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF SMALL E -1D5F2 ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL E -1D626 ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL E -1D65A ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E -1D68E ; [.1CAA.0020.0005] # MATHEMATICAL MONOSPACE SMALL E -24D4 ; [.1CAA.0020.0006] # CIRCLED LATIN SMALL LETTER E -0045 ; [.1CAA.0020.0008] # LATIN CAPITAL LETTER E -FF25 ; [.1CAA.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER E -1F114 ; [*0317.0020.0004][.1CAA.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER E -2130 ; [.1CAA.0020.000B] # SCRIPT CAPITAL E -1D404 ; [.1CAA.0020.000B] # MATHEMATICAL BOLD CAPITAL E -1D438 ; [.1CAA.0020.000B] # MATHEMATICAL ITALIC CAPITAL E -1D46C ; [.1CAA.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL E -1D4D4 ; [.1CAA.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL E -1D508 ; [.1CAA.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL E -1D53C ; [.1CAA.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E -1D570 ; [.1CAA.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL E -1D5A4 ; [.1CAA.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL E -1D5D8 ; [.1CAA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E -1D60C ; [.1CAA.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E -1D640 ; [.1CAA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E -1D674 ; [.1CAA.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL E -24BA ; [.1CAA.0020.000C] # CIRCLED LATIN CAPITAL LETTER E -1F154 ; [.1CAA.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER E -1D49 ; [.1CAA.0020.0014] # MODIFIER LETTER SMALL E -2091 ; [.1CAA.0020.0015] # LATIN SUBSCRIPT SMALL LETTER E -1D31 ; [.1CAA.0020.001D] # MODIFIER LETTER CAPITAL E -1F134 ; [.1CAA.0020.001D] # SQUARED LATIN CAPITAL LETTER E -1F174 ; [.1CAA.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER E -00E9 ; [.1CAA.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH ACUTE -00C9 ; [.1CAA.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH ACUTE -00E8 ; [.1CAA.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH GRAVE -00C8 ; [.1CAA.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH GRAVE -0115 ; [.1CAA.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH BREVE -0114 ; [.1CAA.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH BREVE -00EA ; [.1CAA.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX -00CA ; [.1CAA.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -1EBF ; [.1CAA.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE -1EBE ; [.1CAA.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE -1EC1 ; [.1CAA.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC0 ; [.1CAA.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC5 ; [.1CAA.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE -1EC4 ; [.1CAA.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE -1EC3 ; [.1CAA.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -1EC2 ; [.1CAA.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -011B ; [.1CAA.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER E WITH CARON -011A ; [.1CAA.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER E WITH CARON -00EB ; [.1CAA.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER E WITH DIAERESIS -00CB ; [.1CAA.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER E WITH DIAERESIS -1EBD ; [.1CAA.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH TILDE -1EBC ; [.1CAA.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH TILDE -0117 ; [.1CAA.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER E WITH DOT ABOVE -0116 ; [.1CAA.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER E WITH DOT ABOVE -0229 ; [.1CAA.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER E WITH CEDILLA -0228 ; [.1CAA.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER E WITH CEDILLA -1E1D ; [.1CAA.0020.0002][.0000.0030.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE -1E1C ; [.1CAA.0020.0008][.0000.0030.0002][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE -0119 ; [.1CAA.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER E WITH OGONEK -0118 ; [.1CAA.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER E WITH OGONEK -0113 ; [.1CAA.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER E WITH MACRON -0112 ; [.1CAA.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER E WITH MACRON -1E17 ; [.1CAA.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH MACRON AND ACUTE -1E16 ; [.1CAA.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE -1E15 ; [.1CAA.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH MACRON AND GRAVE -1E14 ; [.1CAA.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE -1EBB ; [.1CAA.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH HOOK ABOVE -1EBA ; [.1CAA.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH HOOK ABOVE -0205 ; [.1CAA.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER E WITH DOUBLE GRAVE -0204 ; [.1CAA.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE -0207 ; [.1CAA.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER E WITH INVERTED BREVE -0206 ; [.1CAA.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER E WITH INVERTED BREVE -1EB9 ; [.1CAA.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER E WITH DOT BELOW -1EB8 ; [.1CAA.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER E WITH DOT BELOW -1EC7 ; [.1CAA.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1EC6 ; [.1CAA.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1E19 ; [.1CAA.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW -1E18 ; [.1CAA.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW -1E1B ; [.1CAA.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER E WITH TILDE BELOW -1E1A ; [.1CAA.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER E WITH TILDE BELOW -32CD ; [.1CAA.0020.001C][.1E33.0020.001C][.1CF4.0020.001C] # SQUARE ERG -32CE ; [.1CAA.0020.001C][.1EE3.0020.001D] # SQUARE EV -1D07 ; [.1CAE.0020.0002] # LATIN LETTER SMALL CAPITAL E -AB32 ; [.1CAF.0020.0002] # LATIN SMALL LETTER BLACKLETTER E -AB33 ; [.1CB0.0020.0002] # LATIN SMALL LETTER BARRED E -0247 ; [.1CB1.0020.0002] # LATIN SMALL LETTER E WITH STROKE -0246 ; [.1CB1.0020.0008] # LATIN CAPITAL LETTER E WITH STROKE -1D92 ; [.1CB5.0020.0002] # LATIN SMALL LETTER E WITH RETROFLEX HOOK -AB34 ; [.1CB6.0020.0002] # LATIN SMALL LETTER E WITH FLOURISH -2C78 ; [.1CB7.0020.0002] # LATIN SMALL LETTER E WITH NOTCH -01DD ; [.1CB8.0020.0002] # LATIN SMALL LETTER TURNED E -018E ; [.1CB8.0020.0008] # LATIN CAPITAL LETTER REVERSED E -1D32 ; [.1CB8.0020.001D] # MODIFIER LETTER CAPITAL REVERSED E -2C7B ; [.1CBC.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED E -0259 ; [.1CBD.0020.0002] # LATIN SMALL LETTER SCHWA -1DEA ; [.1CBD.0020.0004] # COMBINING LATIN SMALL LETTER SCHWA -018F ; [.1CBD.0020.0008] # LATIN CAPITAL LETTER SCHWA -1D4A ; [.1CBD.0020.0014] # MODIFIER LETTER SMALL SCHWA -2094 ; [.1CBD.0020.0015] # LATIN SUBSCRIPT SMALL LETTER SCHWA -1D95 ; [.1CC1.0020.0002] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK -025B ; [.1CC2.0020.0002] # LATIN SMALL LETTER OPEN E -0190 ; [.1CC2.0020.0008] # LATIN CAPITAL LETTER OPEN E -2107 ; [.1CC2.0020.000A] # EULER CONSTANT -1D4B ; [.1CC2.0020.0014] # MODIFIER LETTER SMALL OPEN E -1D93 ; [.1CC6.0020.0002] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK -0258 ; [.1CC7.0020.0002] # LATIN SMALL LETTER REVERSED E -025A ; [.1CCB.0020.0002] # LATIN SMALL LETTER SCHWA WITH HOOK -025C ; [.1CCF.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E -A7AB ; [.1CCF.0020.0008] # LATIN CAPITAL LETTER REVERSED OPEN E -1D9F ; [.1CCF.0020.0014] # MODIFIER LETTER SMALL REVERSED OPEN E -1D94 ; [.1CD3.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK -1D08 ; [.1CD4.0020.0002] # LATIN SMALL LETTER TURNED OPEN E -1D4C ; [.1CD4.0020.0014] # MODIFIER LETTER SMALL TURNED OPEN E -025D ; [.1CD5.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK -025E ; [.1CD9.0020.0002] # LATIN SMALL LETTER CLOSED REVERSED OPEN E -029A ; [.1CDD.0020.0002] # LATIN SMALL LETTER CLOSED OPEN E -0264 ; [.1CE1.0020.0002] # LATIN SMALL LETTER RAMS HORN -0066 ; [.1CE5.0020.0002] # LATIN SMALL LETTER F -FF46 ; [.1CE5.0020.0003] # FULLWIDTH LATIN SMALL LETTER F -1DEB ; [.1CE5.0020.0004] # COMBINING LATIN SMALL LETTER F -24A1 ; [*0317.0020.0004][.1CE5.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER F -1D41F ; [.1CE5.0020.0005] # MATHEMATICAL BOLD SMALL F -1D453 ; [.1CE5.0020.0005] # MATHEMATICAL ITALIC SMALL F -1D487 ; [.1CE5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL F -1D4BB ; [.1CE5.0020.0005] # MATHEMATICAL SCRIPT SMALL F -1D4EF ; [.1CE5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL F -1D523 ; [.1CE5.0020.0005] # MATHEMATICAL FRAKTUR SMALL F -1D557 ; [.1CE5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL F -1D58B ; [.1CE5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL F -1D5BF ; [.1CE5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL F -1D5F3 ; [.1CE5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL F -1D627 ; [.1CE5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL F -1D65B ; [.1CE5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F -1D68F ; [.1CE5.0020.0005] # MATHEMATICAL MONOSPACE SMALL F -24D5 ; [.1CE5.0020.0006] # CIRCLED LATIN SMALL LETTER F -0046 ; [.1CE5.0020.0008] # LATIN CAPITAL LETTER F -FF26 ; [.1CE5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER F -2109 ; [*04F6.0020.0004][.1CE5.0020.000A] # DEGREE FAHRENHEIT -1F115 ; [*0317.0020.0004][.1CE5.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER F -2131 ; [.1CE5.0020.000B] # SCRIPT CAPITAL F -1D405 ; [.1CE5.0020.000B] # MATHEMATICAL BOLD CAPITAL F -1D439 ; [.1CE5.0020.000B] # MATHEMATICAL ITALIC CAPITAL F -1D46D ; [.1CE5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL F -1D4D5 ; [.1CE5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL F -1D509 ; [.1CE5.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL F -1D53D ; [.1CE5.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F -1D571 ; [.1CE5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL F -1D5A5 ; [.1CE5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL F -1D5D9 ; [.1CE5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F -1D60D ; [.1CE5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F -1D641 ; [.1CE5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F -1D675 ; [.1CE5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL F -24BB ; [.1CE5.0020.000C] # CIRCLED LATIN CAPITAL LETTER F -1F155 ; [.1CE5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER F -1DA0 ; [.1CE5.0020.0014] # MODIFIER LETTER SMALL F -1F135 ; [.1CE5.0020.001D] # SQUARED LATIN CAPITAL LETTER F -1F175 ; [.1CE5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER F -1E1F ; [.1CE5.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER F WITH DOT ABOVE -1E1E ; [.1CE5.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER F WITH DOT ABOVE -A77C ; [.1CE5.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR F -A77B ; [.1CE5.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR F -213B ; [.1CE5.0020.000A][.1C47.0020.000A][.1EFF.0020.000A] # FACSIMILE SIGN -FB00 ; [.1CE5.0020.0004][.1CE5.0020.0004] # LATIN SMALL LIGATURE FF -FB03 ; [.1CE5.0020.0004][.1CE5.0020.0004][.1D32.0020.0004] # LATIN SMALL LIGATURE FFI -FB04 ; [.1CE5.0020.0004][.1CE5.0020.0004][.1D77.0020.0004] # LATIN SMALL LIGATURE FFL -FB01 ; [.1CE5.0020.0004][.1D32.0020.0004] # LATIN SMALL LIGATURE FI -FB02 ; [.1CE5.0020.0004][.1D77.0020.0004] # LATIN SMALL LIGATURE FL -3399 ; [.1CE5.0020.001C][.1DAA.0020.001C] # SQUARE FM -02A9 ; [.1CE5.0020.0004][.1DD8.0020.0004] # LATIN SMALL LETTER FENG DIGRAPH -1F193 ; [.1CE5.0020.001D][.1E33.0020.001D][.1CAA.0020.001D][.1CAA.0020.001D] # SQUARED FREE -A730 ; [.1CE9.0020.0002] # LATIN LETTER SMALL CAPITAL F -AB35 ; [.1CEA.0020.0002] # LATIN SMALL LETTER LENIS F -A799 ; [.1CEB.0020.0002] # LATIN SMALL LETTER F WITH STROKE -A798 ; [.1CEB.0020.0008] # LATIN CAPITAL LETTER F WITH STROKE -1D6E ; [.1CEC.0020.0002] # LATIN SMALL LETTER F WITH MIDDLE TILDE -1D82 ; [.1CED.0020.0002] # LATIN SMALL LETTER F WITH PALATAL HOOK -0192 ; [.1CEE.0020.0002] # LATIN SMALL LETTER F WITH HOOK -0191 ; [.1CEE.0020.0008] # LATIN CAPITAL LETTER F WITH HOOK -214E ; [.1CF2.0020.0002] # TURNED SMALL F -2132 ; [.1CF2.0020.0008] # TURNED CAPITAL F -A7FB ; [.1CF3.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED F -0067 ; [.1CF4.0020.0002] # LATIN SMALL LETTER G -FF47 ; [.1CF4.0020.0003] # FULLWIDTH LATIN SMALL LETTER G -1DDA ; [.1CF4.0020.0004] # COMBINING LATIN SMALL LETTER G -24A2 ; [*0317.0020.0004][.1CF4.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER G -210A ; [.1CF4.0020.0005] # SCRIPT SMALL G -1D420 ; [.1CF4.0020.0005] # MATHEMATICAL BOLD SMALL G -1D454 ; [.1CF4.0020.0005] # MATHEMATICAL ITALIC SMALL G -1D488 ; [.1CF4.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL G -1D4F0 ; [.1CF4.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL G -1D524 ; [.1CF4.0020.0005] # MATHEMATICAL FRAKTUR SMALL G -1D558 ; [.1CF4.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL G -1D58C ; [.1CF4.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL G -1D5C0 ; [.1CF4.0020.0005] # MATHEMATICAL SANS-SERIF SMALL G -1D5F4 ; [.1CF4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL G -1D628 ; [.1CF4.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL G -1D65C ; [.1CF4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G -1D690 ; [.1CF4.0020.0005] # MATHEMATICAL MONOSPACE SMALL G -24D6 ; [.1CF4.0020.0006] # CIRCLED LATIN SMALL LETTER G -0047 ; [.1CF4.0020.0008] # LATIN CAPITAL LETTER G -FF27 ; [.1CF4.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER G -1F116 ; [*0317.0020.0004][.1CF4.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER G -1D406 ; [.1CF4.0020.000B] # MATHEMATICAL BOLD CAPITAL G -1D43A ; [.1CF4.0020.000B] # MATHEMATICAL ITALIC CAPITAL G -1D46E ; [.1CF4.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL G -1D4A2 ; [.1CF4.0020.000B] # MATHEMATICAL SCRIPT CAPITAL G -1D4D6 ; [.1CF4.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL G -1D50A ; [.1CF4.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL G -1D53E ; [.1CF4.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D572 ; [.1CF4.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL G -1D5A6 ; [.1CF4.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL G -1D5DA ; [.1CF4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G -1D60E ; [.1CF4.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G -1D642 ; [.1CF4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G -1D676 ; [.1CF4.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL G -24BC ; [.1CF4.0020.000C] # CIRCLED LATIN CAPITAL LETTER G -1F156 ; [.1CF4.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER G -1D4D ; [.1CF4.0020.0014] # MODIFIER LETTER SMALL G -1D33 ; [.1CF4.0020.001D] # MODIFIER LETTER CAPITAL G -1F136 ; [.1CF4.0020.001D] # SQUARED LATIN CAPITAL LETTER G -1F176 ; [.1CF4.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER G -01F5 ; [.1CF4.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER G WITH ACUTE -01F4 ; [.1CF4.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER G WITH ACUTE -011F ; [.1CF4.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER G WITH BREVE -011E ; [.1CF4.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER G WITH BREVE -011D ; [.1CF4.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER G WITH CIRCUMFLEX -011C ; [.1CF4.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX -01E7 ; [.1CF4.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER G WITH CARON -01E6 ; [.1CF4.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER G WITH CARON -0121 ; [.1CF4.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER G WITH DOT ABOVE -0120 ; [.1CF4.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER G WITH DOT ABOVE -0123 ; [.1CF4.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER G WITH CEDILLA -0122 ; [.1CF4.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER G WITH CEDILLA -1E21 ; [.1CF4.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER G WITH MACRON -1E20 ; [.1CF4.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER G WITH MACRON -A7A1 ; [.1CF4.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER G WITH OBLIQUE STROKE -A7A0 ; [.1CF4.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE -1D79 ; [.1CF4.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR G -A77D ; [.1CF4.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR G -33FF ; [.1CF4.0020.001C][.1C47.0020.001C][.1D77.0020.001C] # SQUARE GAL -3387 ; [.1CF4.0020.001D][.1C60.0020.001D] # SQUARE GB -3393 ; [.1CF4.0020.001D][.1D18.0020.001D][.1F21.0020.001C] # SQUARE GHZ -33AC ; [.1CF4.0020.001D][.1E0C.0020.001D][.1C47.0020.001C] # SQUARE GPA -33C9 ; [.1CF4.0020.001D][.1F0B.0020.001C] # SQUARE GY -0261 ; [.1CF8.0020.0002] # LATIN SMALL LETTER SCRIPT G -A7AC ; [.1CF8.0020.0008] # LATIN CAPITAL LETTER SCRIPT G -1DA2 ; [.1CF8.0020.0014] # MODIFIER LETTER SMALL SCRIPT G -AB36 ; [.1CFC.0020.0002] # LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL -0262 ; [.1CFD.0020.0002] # LATIN LETTER SMALL CAPITAL G -1DDB ; [.1CFD.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL G -01E5 ; [.1D01.0020.0002] # LATIN SMALL LETTER G WITH STROKE -01E4 ; [.1D01.0020.0008] # LATIN CAPITAL LETTER G WITH STROKE -1D83 ; [.1D05.0020.0002] # LATIN SMALL LETTER G WITH PALATAL HOOK -0260 ; [.1D06.0020.0002] # LATIN SMALL LETTER G WITH HOOK -0193 ; [.1D06.0020.0008] # LATIN CAPITAL LETTER G WITH HOOK -029B ; [.1D0A.0020.0002] # LATIN LETTER SMALL CAPITAL G WITH HOOK -1D77 ; [.1D0E.0020.0002] # LATIN SMALL LETTER TURNED G -A77F ; [.1D0F.0020.0002] # LATIN SMALL LETTER TURNED INSULAR G -A77E ; [.1D0F.0020.0008] # LATIN CAPITAL LETTER TURNED INSULAR G -0263 ; [.1D10.0020.0002] # LATIN SMALL LETTER GAMMA -0194 ; [.1D10.0020.0008] # LATIN CAPITAL LETTER GAMMA -02E0 ; [.1D10.0020.0014] # MODIFIER LETTER SMALL GAMMA -01A3 ; [.1D14.0020.0002] # LATIN SMALL LETTER OI -01A2 ; [.1D14.0020.0008] # LATIN CAPITAL LETTER OI -0068 ; [.1D18.0020.0002] # LATIN SMALL LETTER H -FF48 ; [.1D18.0020.0003] # FULLWIDTH LATIN SMALL LETTER H -036A ; [.1D18.0020.0004] # COMBINING LATIN SMALL LETTER H -24A3 ; [*0317.0020.0004][.1D18.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER H -210E ; [.1D18.0020.0005] # PLANCK CONSTANT -1D421 ; [.1D18.0020.0005] # MATHEMATICAL BOLD SMALL H -1D489 ; [.1D18.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL H -1D4BD ; [.1D18.0020.0005] # MATHEMATICAL SCRIPT SMALL H -1D4F1 ; [.1D18.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL H -1D525 ; [.1D18.0020.0005] # MATHEMATICAL FRAKTUR SMALL H -1D559 ; [.1D18.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL H -1D58D ; [.1D18.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL H -1D5C1 ; [.1D18.0020.0005] # MATHEMATICAL SANS-SERIF SMALL H -1D5F5 ; [.1D18.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL H -1D629 ; [.1D18.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL H -1D65D ; [.1D18.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H -1D691 ; [.1D18.0020.0005] # MATHEMATICAL MONOSPACE SMALL H -24D7 ; [.1D18.0020.0006] # CIRCLED LATIN SMALL LETTER H -0048 ; [.1D18.0020.0008] # LATIN CAPITAL LETTER H -FF28 ; [.1D18.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER H -1F117 ; [*0317.0020.0004][.1D18.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER H -210B ; [.1D18.0020.000B] # SCRIPT CAPITAL H -210C ; [.1D18.0020.000B] # BLACK-LETTER CAPITAL H -210D ; [.1D18.0020.000B] # DOUBLE-STRUCK CAPITAL H -1D407 ; [.1D18.0020.000B] # MATHEMATICAL BOLD CAPITAL H -1D43B ; [.1D18.0020.000B] # MATHEMATICAL ITALIC CAPITAL H -1D46F ; [.1D18.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL H -1D4D7 ; [.1D18.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL H -1D573 ; [.1D18.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL H -1D5A7 ; [.1D18.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL H -1D5DB ; [.1D18.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H -1D60F ; [.1D18.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H -1D643 ; [.1D18.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H -1D677 ; [.1D18.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL H -24BD ; [.1D18.0020.000C] # CIRCLED LATIN CAPITAL LETTER H -1F157 ; [.1D18.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H -02B0 ; [.1D18.0020.0014] # MODIFIER LETTER SMALL H -2095 ; [.1D18.0020.0015] # LATIN SUBSCRIPT SMALL LETTER H -1D34 ; [.1D18.0020.001D] # MODIFIER LETTER CAPITAL H -1F137 ; [.1D18.0020.001D] # SQUARED LATIN CAPITAL LETTER H -1F177 ; [.1D18.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER H -0125 ; [.1D18.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER H WITH CIRCUMFLEX -0124 ; [.1D18.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX -021F ; [.1D18.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER H WITH CARON -021E ; [.1D18.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER H WITH CARON -1E27 ; [.1D18.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER H WITH DIAERESIS -1E26 ; [.1D18.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER H WITH DIAERESIS -1E23 ; [.1D18.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER H WITH DOT ABOVE -1E22 ; [.1D18.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER H WITH DOT ABOVE -1E29 ; [.1D18.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER H WITH CEDILLA -1E28 ; [.1D18.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER H WITH CEDILLA -0127 ; [.1D18.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER H WITH STROKE -210F ; [.1D18.0020.0002][.0000.0039.0002] # PLANCK CONSTANT OVER TWO PI -0126 ; [.1D18.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER H WITH STROKE -A7F8 ; [.1D18.0020.0014][.0000.0039.0014] # MODIFIER LETTER CAPITAL H WITH STROKE -1E25 ; [.1D18.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER H WITH DOT BELOW -1E24 ; [.1D18.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER H WITH DOT BELOW -1E2B ; [.1D18.0020.0002][.0000.0047.0002] # LATIN SMALL LETTER H WITH BREVE BELOW -1E2A ; [.1D18.0020.0008][.0000.0047.0002] # LATIN CAPITAL LETTER H WITH BREVE BELOW -1E96 ; [.1D18.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER H WITH LINE BELOW -33CA ; [.1D18.0020.001C][.1C47.0020.001C] # SQUARE HA -1F1A6 ; [.1D18.0020.001D][.1C7A.0020.001C] # SQUARED HC -1F1A7 ; [.1D18.0020.001D][.1C8F.0020.001C][.1E33.0020.001D] # SQUARED HDR -32CC ; [.1D18.0020.001D][.1CF4.0020.001C] # SQUARE HG -1F1A8 ; [.1D18.0020.001D][.1D32.0020.001C][*0209.0020.001C][.1E33.0020.001D][.1CAA.0020.001C][.1E71.0020.001C] # SQUARED HI-RES -33CB ; [.1D18.0020.001D][.1E0C.0020.001D] # SQUARE HP -3371 ; [.1D18.0020.001C][.1E0C.0020.001D][.1C47.0020.001C] # SQUARE HPA -1F14A ; [.1D18.0020.001D][.1EE3.0020.001D] # SQUARED HV -3390 ; [.1D18.0020.001D][.1F21.0020.001C] # SQUARE HZ -029C ; [.1D1C.0020.0002] # LATIN LETTER SMALL CAPITAL H -0195 ; [.1D20.0020.0002] # LATIN SMALL LETTER HV -01F6 ; [.1D20.0020.0008] # LATIN CAPITAL LETTER HWAIR -A795 ; [.1D24.0020.0002] # LATIN SMALL LETTER H WITH PALATAL HOOK -0266 ; [.1D25.0020.0002] # LATIN SMALL LETTER H WITH HOOK -A7AA ; [.1D25.0020.0008] # LATIN CAPITAL LETTER H WITH HOOK -02B1 ; [.1D25.0020.0014] # MODIFIER LETTER SMALL H WITH HOOK -2C68 ; [.1D29.0020.0002] # LATIN SMALL LETTER H WITH DESCENDER -2C67 ; [.1D29.0020.0008] # LATIN CAPITAL LETTER H WITH DESCENDER -2C76 ; [.1D2A.0020.0002] # LATIN SMALL LETTER HALF H -2C75 ; [.1D2A.0020.0008] # LATIN CAPITAL LETTER HALF H -A727 ; [.1D2B.0020.0002] # LATIN SMALL LETTER HENG -A726 ; [.1D2B.0020.0008] # LATIN CAPITAL LETTER HENG -AB5C ; [.1D2B.0020.0014] # MODIFIER LETTER SMALL HENG -0267 ; [.1D2C.0020.0002] # LATIN SMALL LETTER HENG WITH HOOK -02BB ; [.1D30.0020.0002] # MODIFIER LETTER TURNED COMMA -02BD ; [.1D31.0020.0002] # MODIFIER LETTER REVERSED COMMA -0069 ; [.1D32.0020.0002] # LATIN SMALL LETTER I -FF49 ; [.1D32.0020.0003] # FULLWIDTH LATIN SMALL LETTER I -0365 ; [.1D32.0020.0004] # COMBINING LATIN SMALL LETTER I -2170 ; [.1D32.0020.0004] # SMALL ROMAN NUMERAL ONE -24A4 ; [*0317.0020.0004][.1D32.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER I -2139 ; [.1D32.0020.0005] # INFORMATION SOURCE -2148 ; [.1D32.0020.0005] # DOUBLE-STRUCK ITALIC SMALL I -1D422 ; [.1D32.0020.0005] # MATHEMATICAL BOLD SMALL I -1D456 ; [.1D32.0020.0005] # MATHEMATICAL ITALIC SMALL I -1D48A ; [.1D32.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL I -1D4BE ; [.1D32.0020.0005] # MATHEMATICAL SCRIPT SMALL I -1D4F2 ; [.1D32.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL I -1D526 ; [.1D32.0020.0005] # MATHEMATICAL FRAKTUR SMALL I -1D55A ; [.1D32.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL I -1D58E ; [.1D32.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL I -1D5C2 ; [.1D32.0020.0005] # MATHEMATICAL SANS-SERIF SMALL I -1D5F6 ; [.1D32.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL I -1D62A ; [.1D32.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL I -1D65E ; [.1D32.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I -1D692 ; [.1D32.0020.0005] # MATHEMATICAL MONOSPACE SMALL I -24D8 ; [.1D32.0020.0006] # CIRCLED LATIN SMALL LETTER I -0049 ; [.1D32.0020.0008] # LATIN CAPITAL LETTER I -FF29 ; [.1D32.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER I -2160 ; [.1D32.0020.000A] # ROMAN NUMERAL ONE -1F118 ; [*0317.0020.0004][.1D32.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER I -2110 ; [.1D32.0020.000B] # SCRIPT CAPITAL I -2111 ; [.1D32.0020.000B] # BLACK-LETTER CAPITAL I -1D408 ; [.1D32.0020.000B] # MATHEMATICAL BOLD CAPITAL I -1D43C ; [.1D32.0020.000B] # MATHEMATICAL ITALIC CAPITAL I -1D470 ; [.1D32.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL I -1D4D8 ; [.1D32.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL I -1D540 ; [.1D32.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I -1D574 ; [.1D32.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL I -1D5A8 ; [.1D32.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL I -1D5DC ; [.1D32.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I -1D610 ; [.1D32.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I -1D644 ; [.1D32.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I -1D678 ; [.1D32.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL I -24BE ; [.1D32.0020.000C] # CIRCLED LATIN CAPITAL LETTER I -1F158 ; [.1D32.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER I -2071 ; [.1D32.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER I -1D62 ; [.1D32.0020.0015] # LATIN SUBSCRIPT SMALL LETTER I -1D35 ; [.1D32.0020.001D] # MODIFIER LETTER CAPITAL I -1F138 ; [.1D32.0020.001D] # SQUARED LATIN CAPITAL LETTER I -1F178 ; [.1D32.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER I -00ED ; [.1D32.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH ACUTE -00CD ; [.1D32.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH ACUTE -00EC ; [.1D32.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER I WITH GRAVE -00CC ; [.1D32.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER I WITH GRAVE -012D ; [.1D32.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER I WITH BREVE -012C ; [.1D32.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER I WITH BREVE -00EE ; [.1D32.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER I WITH CIRCUMFLEX -00CE ; [.1D32.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -01D0 ; [.1D32.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER I WITH CARON -01CF ; [.1D32.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER I WITH CARON -00EF ; [.1D32.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER I WITH DIAERESIS -00CF ; [.1D32.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS -1E2F ; [.1D32.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE -1E2E ; [.1D32.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE -0129 ; [.1D32.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER I WITH TILDE -0128 ; [.1D32.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER I WITH TILDE -0130 ; [.1D32.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER I WITH DOT ABOVE -012F ; [.1D32.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER I WITH OGONEK -012E ; [.1D32.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER I WITH OGONEK -012B ; [.1D32.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER I WITH MACRON -012A ; [.1D32.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER I WITH MACRON -1EC9 ; [.1D32.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER I WITH HOOK ABOVE -1EC8 ; [.1D32.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER I WITH HOOK ABOVE -0209 ; [.1D32.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER I WITH DOUBLE GRAVE -0208 ; [.1D32.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE -020B ; [.1D32.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER I WITH INVERTED BREVE -020A ; [.1D32.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER I WITH INVERTED BREVE -1ECB ; [.1D32.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER I WITH DOT BELOW -1ECA ; [.1D32.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER I WITH DOT BELOW -1E2D ; [.1D32.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER I WITH TILDE BELOW -1E2C ; [.1D32.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER I WITH TILDE BELOW -1F18B ; [.1D32.0020.001D][.1C7A.0020.001D] # NEGATIVE SQUARED IC -1F194 ; [.1D32.0020.001D][.1C8F.0020.001D] # SQUARED ID -2171 ; [.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL TWO -2161 ; [.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL TWO -2172 ; [.1D32.0020.0004][.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL THREE -2162 ; [.1D32.0020.000A][.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL THREE -0133 ; [.1D32.0020.0004][.1D4C.0020.0004] # LATIN SMALL LIGATURE IJ -0132 ; [.1D32.0020.000A][.1D4C.0020.000A] # LATIN CAPITAL LIGATURE IJ -33CC ; [.1D32.0020.001C][.1DB9.0020.001C] # SQUARE IN -337A ; [.1D32.0020.001D][.1EB5.0020.001D] # SQUARE IU -2173 ; [.1D32.0020.0004][.1EE3.0020.0004] # SMALL ROMAN NUMERAL FOUR -2163 ; [.1D32.0020.000A][.1EE3.0020.000A] # ROMAN NUMERAL FOUR -2178 ; [.1D32.0020.0004][.1EFF.0020.0004] # SMALL ROMAN NUMERAL NINE -2168 ; [.1D32.0020.000A][.1EFF.0020.000A] # ROMAN NUMERAL NINE -0131 ; [.1D36.0020.0002] # LATIN SMALL LETTER DOTLESS I -1D6A4 ; [.1D36.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS I -026A ; [.1D3A.0020.0002] # LATIN LETTER SMALL CAPITAL I -A7AE ; [.1D3A.0020.0008] # LATIN CAPITAL LETTER SMALL CAPITAL I -1DA6 ; [.1D3A.0020.0014] # MODIFIER LETTER SMALL CAPITAL I -A7FE ; [.1D3E.0020.0002] # LATIN EPIGRAPHIC LETTER I LONGA -A7F7 ; [.1D3F.0020.0002] # LATIN EPIGRAPHIC LETTER SIDEWAYS I -1D09 ; [.1D40.0020.0002] # LATIN SMALL LETTER TURNED I -1D4E ; [.1D40.0020.0014] # MODIFIER LETTER SMALL TURNED I -0268 ; [.1D41.0020.0002] # LATIN SMALL LETTER I WITH STROKE -0197 ; [.1D41.0020.0008] # LATIN CAPITAL LETTER I WITH STROKE -1DA4 ; [.1D41.0020.0014] # MODIFIER LETTER SMALL I WITH STROKE -1D7B ; [.1D45.0020.0002] # LATIN SMALL CAPITAL LETTER I WITH STROKE -1DA7 ; [.1D45.0020.0014] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE -1D96 ; [.1D46.0020.0002] # LATIN SMALL LETTER I WITH RETROFLEX HOOK -0269 ; [.1D47.0020.0002] # LATIN SMALL LETTER IOTA -0196 ; [.1D47.0020.0008] # LATIN CAPITAL LETTER IOTA -1DA5 ; [.1D47.0020.0014] # MODIFIER LETTER SMALL IOTA -1D7C ; [.1D4B.0020.0002] # LATIN SMALL LETTER IOTA WITH STROKE -006A ; [.1D4C.0020.0002] # LATIN SMALL LETTER J -FF4A ; [.1D4C.0020.0003] # FULLWIDTH LATIN SMALL LETTER J -24A5 ; [*0317.0020.0004][.1D4C.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER J -2149 ; [.1D4C.0020.0005] # DOUBLE-STRUCK ITALIC SMALL J -1D423 ; [.1D4C.0020.0005] # MATHEMATICAL BOLD SMALL J -1D457 ; [.1D4C.0020.0005] # MATHEMATICAL ITALIC SMALL J -1D48B ; [.1D4C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL J -1D4BF ; [.1D4C.0020.0005] # MATHEMATICAL SCRIPT SMALL J -1D4F3 ; [.1D4C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL J -1D527 ; [.1D4C.0020.0005] # MATHEMATICAL FRAKTUR SMALL J -1D55B ; [.1D4C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL J -1D58F ; [.1D4C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL J -1D5C3 ; [.1D4C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL J -1D5F7 ; [.1D4C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL J -1D62B ; [.1D4C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL J -1D65F ; [.1D4C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J -1D693 ; [.1D4C.0020.0005] # MATHEMATICAL MONOSPACE SMALL J -24D9 ; [.1D4C.0020.0006] # CIRCLED LATIN SMALL LETTER J -004A ; [.1D4C.0020.0008] # LATIN CAPITAL LETTER J -FF2A ; [.1D4C.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER J -1F119 ; [*0317.0020.0004][.1D4C.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER J -1D409 ; [.1D4C.0020.000B] # MATHEMATICAL BOLD CAPITAL J -1D43D ; [.1D4C.0020.000B] # MATHEMATICAL ITALIC CAPITAL J -1D471 ; [.1D4C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL J -1D4A5 ; [.1D4C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL J -1D4D9 ; [.1D4C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL J -1D50D ; [.1D4C.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL J -1D541 ; [.1D4C.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J -1D575 ; [.1D4C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL J -1D5A9 ; [.1D4C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL J -1D5DD ; [.1D4C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J -1D611 ; [.1D4C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J -1D645 ; [.1D4C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J -1D679 ; [.1D4C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL J -24BF ; [.1D4C.0020.000C] # CIRCLED LATIN CAPITAL LETTER J -1F159 ; [.1D4C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER J -02B2 ; [.1D4C.0020.0014] # MODIFIER LETTER SMALL J -2C7C ; [.1D4C.0020.0015] # LATIN SUBSCRIPT SMALL LETTER J -1D36 ; [.1D4C.0020.001D] # MODIFIER LETTER CAPITAL J -1F139 ; [.1D4C.0020.001D] # SQUARED LATIN CAPITAL LETTER J -1F179 ; [.1D4C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER J -0135 ; [.1D4C.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER J WITH CIRCUMFLEX -0134 ; [.1D4C.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX -01F0 ; [.1D4C.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER J WITH CARON -0237 ; [.1D50.0020.0002] # LATIN SMALL LETTER DOTLESS J -1D6A5 ; [.1D50.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS J -1D0A ; [.1D54.0020.0002] # LATIN LETTER SMALL CAPITAL J -0249 ; [.1D55.0020.0002] # LATIN SMALL LETTER J WITH STROKE -0248 ; [.1D55.0020.0008] # LATIN CAPITAL LETTER J WITH STROKE -029D ; [.1D59.0020.0002] # LATIN SMALL LETTER J WITH CROSSED-TAIL -A7B2 ; [.1D59.0020.0008] # LATIN CAPITAL LETTER J WITH CROSSED-TAIL -1DA8 ; [.1D59.0020.0014] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL -025F ; [.1D5D.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE -1DA1 ; [.1D5D.0020.0014] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE -0284 ; [.1D61.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK -006B ; [.1D65.0020.0002] # LATIN SMALL LETTER K -FF4B ; [.1D65.0020.0003] # FULLWIDTH LATIN SMALL LETTER K -1DDC ; [.1D65.0020.0004] # COMBINING LATIN SMALL LETTER K -24A6 ; [*0317.0020.0004][.1D65.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER K -1D424 ; [.1D65.0020.0005] # MATHEMATICAL BOLD SMALL K -1D458 ; [.1D65.0020.0005] # MATHEMATICAL ITALIC SMALL K -1D48C ; [.1D65.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL K -1D4C0 ; [.1D65.0020.0005] # MATHEMATICAL SCRIPT SMALL K -1D4F4 ; [.1D65.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL K -1D528 ; [.1D65.0020.0005] # MATHEMATICAL FRAKTUR SMALL K -1D55C ; [.1D65.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL K -1D590 ; [.1D65.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL K -1D5C4 ; [.1D65.0020.0005] # MATHEMATICAL SANS-SERIF SMALL K -1D5F8 ; [.1D65.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL K -1D62C ; [.1D65.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL K -1D660 ; [.1D65.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K -1D694 ; [.1D65.0020.0005] # MATHEMATICAL MONOSPACE SMALL K -24DA ; [.1D65.0020.0006] # CIRCLED LATIN SMALL LETTER K -004B ; [.1D65.0020.0008] # LATIN CAPITAL LETTER K -212A ; [.1D65.0020.0008] # KELVIN SIGN -FF2B ; [.1D65.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER K -1F11A ; [*0317.0020.0004][.1D65.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER K -1D40A ; [.1D65.0020.000B] # MATHEMATICAL BOLD CAPITAL K -1D43E ; [.1D65.0020.000B] # MATHEMATICAL ITALIC CAPITAL K -1D472 ; [.1D65.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL K -1D4A6 ; [.1D65.0020.000B] # MATHEMATICAL SCRIPT CAPITAL K -1D4DA ; [.1D65.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL K -1D50E ; [.1D65.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL K -1D542 ; [.1D65.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K -1D576 ; [.1D65.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL K -1D5AA ; [.1D65.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL K -1D5DE ; [.1D65.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K -1D612 ; [.1D65.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K -1D646 ; [.1D65.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K -1D67A ; [.1D65.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL K -24C0 ; [.1D65.0020.000C] # CIRCLED LATIN CAPITAL LETTER K -1F15A ; [.1D65.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER K -1D4F ; [.1D65.0020.0014] # MODIFIER LETTER SMALL K -2096 ; [.1D65.0020.0015] # LATIN SUBSCRIPT SMALL LETTER K -1D37 ; [.1D65.0020.001D] # MODIFIER LETTER CAPITAL K -1F13A ; [.1D65.0020.001D] # SQUARED LATIN CAPITAL LETTER K -1F17A ; [.1D65.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER K -1E31 ; [.1D65.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER K WITH ACUTE -1E30 ; [.1D65.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER K WITH ACUTE -01E9 ; [.1D65.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER K WITH CARON -01E8 ; [.1D65.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER K WITH CARON -0137 ; [.1D65.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER K WITH CEDILLA -0136 ; [.1D65.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER K WITH CEDILLA -A7A3 ; [.1D65.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER K WITH OBLIQUE STROKE -A7A2 ; [.1D65.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE -1E33 ; [.1D65.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER K WITH DOT BELOW -1E32 ; [.1D65.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER K WITH DOT BELOW -1E35 ; [.1D65.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER K WITH LINE BELOW -1E34 ; [.1D65.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER K WITH LINE BELOW -3384 ; [.1D65.0020.001C][.1C47.0020.001D] # SQUARE KA -3385 ; [.1D65.0020.001D][.1C60.0020.001D] # SQUARE KB -3389 ; [.1D65.0020.001C][.1C7A.0020.001C][.1C47.0020.001C][.1D77.0020.001C] # SQUARE KCAL -338F ; [.1D65.0020.001C][.1CF4.0020.001C] # SQUARE KG -3391 ; [.1D65.0020.001C][.1D18.0020.001D][.1F21.0020.001C] # SQUARE KHZ -33CD ; [.1D65.0020.001D][.1D65.0020.001D] # SQUARE KK -3398 ; [.1D65.0020.001C][.1D77.0020.001C] # SQUARE KL -339E ; [.1D65.0020.001C][.1DAA.0020.001C] # SQUARE KM -33CE ; [.1D65.0020.001D][.1DAA.0020.001D] # SQUARE KM CAPITAL -33A2 ; [.1D65.0020.001C][.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE KM SQUARED -33A6 ; [.1D65.0020.001C][.1DAA.0020.001C][.1C40.0020.001C] # SQUARE KM CUBED -33AA ; [.1D65.0020.001C][.1E0C.0020.001D][.1C47.0020.001C] # SQUARE KPA -33CF ; [.1D65.0020.001C][.1E95.0020.001C] # SQUARE KT -33B8 ; [.1D65.0020.001C][.1EE3.0020.001D] # SQUARE KV -33BE ; [.1D65.0020.001C][.1EF5.0020.001D] # SQUARE KW -33C0 ; [.1D65.0020.001C][.1FE1.0020.001D] # SQUARE K OHM -1D0B ; [.1D69.0020.0002] # LATIN LETTER SMALL CAPITAL K -1D84 ; [.1D6A.0020.0002] # LATIN SMALL LETTER K WITH PALATAL HOOK -0199 ; [.1D6B.0020.0002] # LATIN SMALL LETTER K WITH HOOK -0198 ; [.1D6B.0020.0008] # LATIN CAPITAL LETTER K WITH HOOK -2C6A ; [.1D6F.0020.0002] # LATIN SMALL LETTER K WITH DESCENDER -2C69 ; [.1D6F.0020.0008] # LATIN CAPITAL LETTER K WITH DESCENDER -A741 ; [.1D70.0020.0002] # LATIN SMALL LETTER K WITH STROKE -A740 ; [.1D70.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE -A743 ; [.1D71.0020.0002] # LATIN SMALL LETTER K WITH DIAGONAL STROKE -A742 ; [.1D71.0020.0008] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE -A745 ; [.1D72.0020.0002] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE -A744 ; [.1D72.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE -029E ; [.1D73.0020.0002] # LATIN SMALL LETTER TURNED K -A7B0 ; [.1D73.0020.0008] # LATIN CAPITAL LETTER TURNED K -006C ; [.1D77.0020.0002] # LATIN SMALL LETTER L -FF4C ; [.1D77.0020.0003] # FULLWIDTH LATIN SMALL LETTER L -1DDD ; [.1D77.0020.0004] # COMBINING LATIN SMALL LETTER L -217C ; [.1D77.0020.0004] # SMALL ROMAN NUMERAL FIFTY -24A7 ; [*0317.0020.0004][.1D77.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER L -2113 ; [.1D77.0020.0005] # SCRIPT SMALL L -1D425 ; [.1D77.0020.0005] # MATHEMATICAL BOLD SMALL L -1D459 ; [.1D77.0020.0005] # MATHEMATICAL ITALIC SMALL L -1D48D ; [.1D77.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL L -1D4C1 ; [.1D77.0020.0005] # MATHEMATICAL SCRIPT SMALL L -1D4F5 ; [.1D77.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL L -1D529 ; [.1D77.0020.0005] # MATHEMATICAL FRAKTUR SMALL L -1D55D ; [.1D77.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL L -1D591 ; [.1D77.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL L -1D5C5 ; [.1D77.0020.0005] # MATHEMATICAL SANS-SERIF SMALL L -1D5F9 ; [.1D77.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL L -1D62D ; [.1D77.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL L -1D661 ; [.1D77.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L -1D695 ; [.1D77.0020.0005] # MATHEMATICAL MONOSPACE SMALL L -24DB ; [.1D77.0020.0006] # CIRCLED LATIN SMALL LETTER L -004C ; [.1D77.0020.0008] # LATIN CAPITAL LETTER L -FF2C ; [.1D77.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER L -216C ; [.1D77.0020.000A] # ROMAN NUMERAL FIFTY -1F11B ; [*0317.0020.0004][.1D77.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER L -2112 ; [.1D77.0020.000B] # SCRIPT CAPITAL L -1D40B ; [.1D77.0020.000B] # MATHEMATICAL BOLD CAPITAL L -1D43F ; [.1D77.0020.000B] # MATHEMATICAL ITALIC CAPITAL L -1D473 ; [.1D77.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL L -1D4DB ; [.1D77.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL L -1D50F ; [.1D77.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL L -1D543 ; [.1D77.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L -1D577 ; [.1D77.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL L -1D5AB ; [.1D77.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL L -1D5DF ; [.1D77.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L -1D613 ; [.1D77.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L -1D647 ; [.1D77.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L -1D67B ; [.1D77.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL L -24C1 ; [.1D77.0020.000C] # CIRCLED LATIN CAPITAL LETTER L -1F15B ; [.1D77.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER L -02E1 ; [.1D77.0020.0014] # MODIFIER LETTER SMALL L -2097 ; [.1D77.0020.0015] # LATIN SUBSCRIPT SMALL LETTER L -1D38 ; [.1D77.0020.001D] # MODIFIER LETTER CAPITAL L -1F13B ; [.1D77.0020.001D] # SQUARED LATIN CAPITAL LETTER L -1F17B ; [.1D77.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER L -013A ; [.1D77.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER L WITH ACUTE -0139 ; [.1D77.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER L WITH ACUTE -013E ; [.1D77.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER L WITH CARON -013D ; [.1D77.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER L WITH CARON -013C ; [.1D77.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER L WITH CEDILLA -013B ; [.1D77.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER L WITH CEDILLA -0142 ; [.1D77.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER L WITH STROKE -0141 ; [.1D77.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER L WITH STROKE -1E37 ; [.1D77.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER L WITH DOT BELOW -1E36 ; [.1D77.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW -1E39 ; [.1D77.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON -1E38 ; [.1D77.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON -1E3D ; [.1D77.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW -1E3C ; [.1D77.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW -1E3B ; [.1D77.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER L WITH LINE BELOW -1E3A ; [.1D77.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER L WITH LINE BELOW -0140 ; [.1D77.0020.0002][.0000.0110.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT -006C 00B7 ; [.1D77.0020.0002][.0000.0110.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT -006C 0387 ; [.1D77.0020.0002][.0000.0110.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT -013F ; [.1D77.0020.0008][.0000.0110.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT -004C 00B7 ; [.1D77.0020.0008][.0000.0110.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT -004C 0387 ; [.1D77.0020.0008][.0000.0110.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT -01C9 ; [.1D77.0020.0004][.1D4C.0020.0004] # LATIN SMALL LETTER LJ -01C8 ; [.1D77.0020.000A][.1D4C.0020.0004] # LATIN CAPITAL LETTER L WITH SMALL LETTER J -01C7 ; [.1D77.0020.000A][.1D4C.0020.000A] # LATIN CAPITAL LETTER LJ -1EFB ; [.1D77.0020.0004][.1D77.0020.0004] # LATIN SMALL LETTER MIDDLE-WELSH LL -1EFA ; [.1D77.0020.000A][.1D77.0020.000A] # LATIN CAPITAL LETTER MIDDLE-WELSH LL -33D0 ; [.1D77.0020.001C][.1DAA.0020.001C] # SQUARE LM -33D1 ; [.1D77.0020.001C][.1DB9.0020.001C] # SQUARE LN -33D2 ; [.1D77.0020.001C][.1DDD.0020.001C][.1CF4.0020.001C] # SQUARE LOG -1F1A9 ; [.1D77.0020.001D][.1DDD.0020.001C][.1E71.0020.001C][.1E71.0020.001C][.1D77.0020.001C][.1CAA.0020.001C][.1E71.0020.001C][.1E71.0020.001C] # SQUARED LOSSLESS -02AA ; [.1D77.0020.0004][.1E71.0020.0004] # LATIN SMALL LETTER LS DIGRAPH -32CF ; [.1D77.0020.001D][.1E95.0020.001D][.1C8F.0020.001D] # LIMITED LIABILITY SIGN -33D3 ; [.1D77.0020.001C][.1EFF.0020.001C] # SQUARE LX -02AB ; [.1D77.0020.0004][.1F21.0020.0004] # LATIN SMALL LETTER LZ DIGRAPH -029F ; [.1D7B.0020.0002] # LATIN LETTER SMALL CAPITAL L -1DDE ; [.1D7B.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL L -1DAB ; [.1D7B.0020.0014] # MODIFIER LETTER SMALL CAPITAL L -A747 ; [.1D7F.0020.0002] # LATIN SMALL LETTER BROKEN L -A746 ; [.1D7F.0020.0008] # LATIN CAPITAL LETTER BROKEN L -1D0C ; [.1D80.0020.0002] # LATIN LETTER SMALL CAPITAL L WITH STROKE -A749 ; [.1D81.0020.0002] # LATIN SMALL LETTER L WITH HIGH STROKE -A748 ; [.1D81.0020.0008] # LATIN CAPITAL LETTER L WITH HIGH STROKE -019A ; [.1D82.0020.0002] # LATIN SMALL LETTER L WITH BAR -023D ; [.1D82.0020.0008] # LATIN CAPITAL LETTER L WITH BAR -2C61 ; [.1D86.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE BAR -2C60 ; [.1D86.0020.0008] # LATIN CAPITAL LETTER L WITH DOUBLE BAR -026B ; [.1D87.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE TILDE -2C62 ; [.1D87.0020.0008] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE -AB5E ; [.1D87.0020.0014] # MODIFIER LETTER SMALL L WITH MIDDLE TILDE -AB38 ; [.1D8B.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE -1DEC ; [.1D8B.0020.0004] # COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE -AB39 ; [.1D8C.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE RING -026C ; [.1D8D.0020.0002] # LATIN SMALL LETTER L WITH BELT -A7AD ; [.1D8D.0020.0008] # LATIN CAPITAL LETTER L WITH BELT -AB37 ; [.1D91.0020.0002] # LATIN SMALL LETTER L WITH INVERTED LAZY S -AB5D ; [.1D91.0020.0014] # MODIFIER LETTER SMALL L WITH INVERTED LAZY S -1D85 ; [.1D92.0020.0002] # LATIN SMALL LETTER L WITH PALATAL HOOK -1DAA ; [.1D92.0020.0014] # MODIFIER LETTER SMALL L WITH PALATAL HOOK -026D ; [.1D93.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK -1DA9 ; [.1D93.0020.0014] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK -A78E ; [.1D97.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT -0234 ; [.1D98.0020.0002] # LATIN SMALL LETTER L WITH CURL -A772 ; [.1D9C.0020.0002] # LATIN SMALL LETTER LUM -026E ; [.1D9D.0020.0002] # LATIN SMALL LETTER LEZH -A781 ; [.1DA1.0020.0002] # LATIN SMALL LETTER TURNED L -A780 ; [.1DA1.0020.0008] # LATIN CAPITAL LETTER TURNED L -019B ; [.1DA2.0020.0002] # LATIN SMALL LETTER LAMBDA WITH STROKE -028E ; [.1DA6.0020.0002] # LATIN SMALL LETTER TURNED Y -006D ; [.1DAA.0020.0002] # LATIN SMALL LETTER M -FF4D ; [.1DAA.0020.0003] # FULLWIDTH LATIN SMALL LETTER M -036B ; [.1DAA.0020.0004] # COMBINING LATIN SMALL LETTER M -217F ; [.1DAA.0020.0004] # SMALL ROMAN NUMERAL ONE THOUSAND -24A8 ; [*0317.0020.0004][.1DAA.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER M -1D426 ; [.1DAA.0020.0005] # MATHEMATICAL BOLD SMALL M -1D45A ; [.1DAA.0020.0005] # MATHEMATICAL ITALIC SMALL M -1D48E ; [.1DAA.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL M -1D4C2 ; [.1DAA.0020.0005] # MATHEMATICAL SCRIPT SMALL M -1D4F6 ; [.1DAA.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL M -1D52A ; [.1DAA.0020.0005] # MATHEMATICAL FRAKTUR SMALL M -1D55E ; [.1DAA.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL M -1D592 ; [.1DAA.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL M -1D5C6 ; [.1DAA.0020.0005] # MATHEMATICAL SANS-SERIF SMALL M -1D5FA ; [.1DAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL M -1D62E ; [.1DAA.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL M -1D662 ; [.1DAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M -1D696 ; [.1DAA.0020.0005] # MATHEMATICAL MONOSPACE SMALL M -24DC ; [.1DAA.0020.0006] # CIRCLED LATIN SMALL LETTER M -004D ; [.1DAA.0020.0008] # LATIN CAPITAL LETTER M -FF2D ; [.1DAA.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER M -216F ; [.1DAA.0020.000A] # ROMAN NUMERAL ONE THOUSAND -1F11C ; [*0317.0020.0004][.1DAA.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER M -2133 ; [.1DAA.0020.000B] # SCRIPT CAPITAL M -1D40C ; [.1DAA.0020.000B] # MATHEMATICAL BOLD CAPITAL M -1D440 ; [.1DAA.0020.000B] # MATHEMATICAL ITALIC CAPITAL M -1D474 ; [.1DAA.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL M -1D4DC ; [.1DAA.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL M -1D510 ; [.1DAA.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL M -1D544 ; [.1DAA.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D578 ; [.1DAA.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL M -1D5AC ; [.1DAA.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL M -1D5E0 ; [.1DAA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M -1D614 ; [.1DAA.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M -1D648 ; [.1DAA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M -1D67C ; [.1DAA.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL M -24C2 ; [.1DAA.0020.000C] # CIRCLED LATIN CAPITAL LETTER M -1F15C ; [.1DAA.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER M -1D50 ; [.1DAA.0020.0014] # MODIFIER LETTER SMALL M -2098 ; [.1DAA.0020.0015] # LATIN SUBSCRIPT SMALL LETTER M -1D39 ; [.1DAA.0020.001D] # MODIFIER LETTER CAPITAL M -1F13C ; [.1DAA.0020.001D] # SQUARED LATIN CAPITAL LETTER M -1F17C ; [.1DAA.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER M -1E3F ; [.1DAA.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER M WITH ACUTE -1E3E ; [.1DAA.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER M WITH ACUTE -1E41 ; [.1DAA.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER M WITH DOT ABOVE -1E40 ; [.1DAA.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER M WITH DOT ABOVE -1E43 ; [.1DAA.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER M WITH DOT BELOW -1E42 ; [.1DAA.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER M WITH DOT BELOW -33A1 ; [.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE M SQUARED -33A5 ; [.1DAA.0020.001C][.1C40.0020.001C] # SQUARE M CUBED -3383 ; [.1DAA.0020.001C][.1C47.0020.001D] # SQUARE MA -33D4 ; [.1DAA.0020.001C][.1C60.0020.001C] # SQUARE MB SMALL -3386 ; [.1DAA.0020.001D][.1C60.0020.001D] # SQUARE MB -1F16A ; [.1DAA.0020.0014][.1C7A.0020.0014] # RAISED MC SIGN -1F16B ; [.1DAA.0020.0014][.1C8F.0020.0014] # RAISED MD SIGN -338E ; [.1DAA.0020.001C][.1CF4.0020.001C] # SQUARE MG -3392 ; [.1DAA.0020.001D][.1D18.0020.001D][.1F21.0020.001C] # SQUARE MHZ -33D5 ; [.1DAA.0020.001C][.1D32.0020.001C][.1D77.0020.001C] # SQUARE MIL -3396 ; [.1DAA.0020.001C][.1D77.0020.001C] # SQUARE ML -339C ; [.1DAA.0020.001C][.1DAA.0020.001C] # SQUARE MM -339F ; [.1DAA.0020.001C][.1DAA.0020.001C][.1C3F.0020.001C] # SQUARE MM SQUARED -33A3 ; [.1DAA.0020.001C][.1DAA.0020.001C][.1C40.0020.001C] # SQUARE MM CUBED -33D6 ; [.1DAA.0020.001C][.1DDD.0020.001C][.1D77.0020.001C] # SQUARE MOL -33AB ; [.1DAA.0020.001D][.1E0C.0020.001D][.1C47.0020.001C] # SQUARE MPA -33A7 ; [.1DAA.0020.001C][*0625.0020.001C][.1E71.0020.001C] # SQUARE M OVER S -33B3 ; [.1DAA.0020.001C][.1E71.0020.001C] # SQUARE MS -33A8 ; [.1DAA.0020.001C][*0625.0020.001C][.1E71.0020.001C][.1C3F.0020.001C] # SQUARE M OVER S SQUARED -33B7 ; [.1DAA.0020.001C][.1EE3.0020.001D] # SQUARE MV -33B9 ; [.1DAA.0020.001D][.1EE3.0020.001D] # SQUARE MV MEGA -1F14B ; [.1DAA.0020.001D][.1EE3.0020.001D] # SQUARED MV -33BD ; [.1DAA.0020.001C][.1EF5.0020.001D] # SQUARE MW -33BF ; [.1DAA.0020.001D][.1EF5.0020.001D] # SQUARE MW MEGA -33C1 ; [.1DAA.0020.001D][.1FE1.0020.001D] # SQUARE M OHM -1D0D ; [.1DAE.0020.0002] # LATIN LETTER SMALL CAPITAL M -1DDF ; [.1DAE.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL M -1D6F ; [.1DAF.0020.0002] # LATIN SMALL LETTER M WITH MIDDLE TILDE -1D86 ; [.1DB0.0020.0002] # LATIN SMALL LETTER M WITH PALATAL HOOK -0271 ; [.1DB1.0020.0002] # LATIN SMALL LETTER M WITH HOOK -2C6E ; [.1DB1.0020.0008] # LATIN CAPITAL LETTER M WITH HOOK -1DAC ; [.1DB1.0020.0014] # MODIFIER LETTER SMALL M WITH HOOK -AB3A ; [.1DB5.0020.0002] # LATIN SMALL LETTER M WITH CROSSED-TAIL -A7FD ; [.1DB6.0020.0002] # LATIN EPIGRAPHIC LETTER INVERTED M -A7FF ; [.1DB7.0020.0002] # LATIN EPIGRAPHIC LETTER ARCHAIC M -A773 ; [.1DB8.0020.0002] # LATIN SMALL LETTER MUM -006E ; [.1DB9.0020.0002] # LATIN SMALL LETTER N -FF4E ; [.1DB9.0020.0003] # FULLWIDTH LATIN SMALL LETTER N -1DE0 ; [.1DB9.0020.0004] # COMBINING LATIN SMALL LETTER N -24A9 ; [*0317.0020.0004][.1DB9.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER N -1D427 ; [.1DB9.0020.0005] # MATHEMATICAL BOLD SMALL N -1D45B ; [.1DB9.0020.0005] # MATHEMATICAL ITALIC SMALL N -1D48F ; [.1DB9.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL N -1D4C3 ; [.1DB9.0020.0005] # MATHEMATICAL SCRIPT SMALL N -1D4F7 ; [.1DB9.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL N -1D52B ; [.1DB9.0020.0005] # MATHEMATICAL FRAKTUR SMALL N -1D55F ; [.1DB9.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL N -1D593 ; [.1DB9.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL N -1D5C7 ; [.1DB9.0020.0005] # MATHEMATICAL SANS-SERIF SMALL N -1D5FB ; [.1DB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL N -1D62F ; [.1DB9.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL N -1D663 ; [.1DB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N -1D697 ; [.1DB9.0020.0005] # MATHEMATICAL MONOSPACE SMALL N -24DD ; [.1DB9.0020.0006] # CIRCLED LATIN SMALL LETTER N -004E ; [.1DB9.0020.0008] # LATIN CAPITAL LETTER N -FF2E ; [.1DB9.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER N -1F11D ; [*0317.0020.0004][.1DB9.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER N -2115 ; [.1DB9.0020.000B] # DOUBLE-STRUCK CAPITAL N -1D40D ; [.1DB9.0020.000B] # MATHEMATICAL BOLD CAPITAL N -1D441 ; [.1DB9.0020.000B] # MATHEMATICAL ITALIC CAPITAL N -1D475 ; [.1DB9.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL N -1D4A9 ; [.1DB9.0020.000B] # MATHEMATICAL SCRIPT CAPITAL N -1D4DD ; [.1DB9.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL N -1D511 ; [.1DB9.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL N -1D579 ; [.1DB9.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL N -1D5AD ; [.1DB9.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL N -1D5E1 ; [.1DB9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N -1D615 ; [.1DB9.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N -1D649 ; [.1DB9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N -1D67D ; [.1DB9.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL N -24C3 ; [.1DB9.0020.000C] # CIRCLED LATIN CAPITAL LETTER N -1F15D ; [.1DB9.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER N -207F ; [.1DB9.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER N -2099 ; [.1DB9.0020.0015] # LATIN SUBSCRIPT SMALL LETTER N -1D3A ; [.1DB9.0020.001D] # MODIFIER LETTER CAPITAL N -1F13D ; [.1DB9.0020.001D] # SQUARED LATIN CAPITAL LETTER N -1F17D ; [.1DB9.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER N -0144 ; [.1DB9.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER N WITH ACUTE -0143 ; [.1DB9.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER N WITH ACUTE -01F9 ; [.1DB9.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER N WITH GRAVE -01F8 ; [.1DB9.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER N WITH GRAVE -0148 ; [.1DB9.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER N WITH CARON -0147 ; [.1DB9.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER N WITH CARON -00F1 ; [.1DB9.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER N WITH TILDE -00D1 ; [.1DB9.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER N WITH TILDE -1E45 ; [.1DB9.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER N WITH DOT ABOVE -1E44 ; [.1DB9.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER N WITH DOT ABOVE -0146 ; [.1DB9.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER N WITH CEDILLA -0145 ; [.1DB9.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER N WITH CEDILLA -A7A5 ; [.1DB9.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER N WITH OBLIQUE STROKE -A7A4 ; [.1DB9.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE -1E47 ; [.1DB9.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER N WITH DOT BELOW -1E46 ; [.1DB9.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER N WITH DOT BELOW -1E4B ; [.1DB9.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW -1E4A ; [.1DB9.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW -1E49 ; [.1DB9.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER N WITH LINE BELOW -1E48 ; [.1DB9.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER N WITH LINE BELOW -3381 ; [.1DB9.0020.001C][.1C47.0020.001D] # SQUARE NA -1F195 ; [.1DB9.0020.001D][.1CAA.0020.001D][.1EF5.0020.001D] # SQUARED NEW -338B ; [.1DB9.0020.001C][.1CE5.0020.001D] # SQUARE NF -1F196 ; [.1DB9.0020.001D][.1CF4.0020.001D] # SQUARED NG -01CC ; [.1DB9.0020.0004][.1D4C.0020.0004] # LATIN SMALL LETTER NJ -01CB ; [.1DB9.0020.000A][.1D4C.0020.0004] # LATIN CAPITAL LETTER N WITH SMALL LETTER J -01CA ; [.1DB9.0020.000A][.1D4C.0020.000A] # LATIN CAPITAL LETTER NJ -339A ; [.1DB9.0020.001C][.1DAA.0020.001C] # SQUARE NM -2116 ; [.1DB9.0020.000A][.1DDD.0020.0004] # NUMERO SIGN -33B1 ; [.1DB9.0020.001C][.1E71.0020.001C] # SQUARE NS -33B5 ; [.1DB9.0020.001C][.1EE3.0020.001D] # SQUARE NV -33BB ; [.1DB9.0020.001C][.1EF5.0020.001D] # SQUARE NW -0274 ; [.1DBD.0020.0002] # LATIN LETTER SMALL CAPITAL N -1DE1 ; [.1DBD.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL N -1DB0 ; [.1DBD.0020.0014] # MODIFIER LETTER SMALL CAPITAL N -1D3B ; [.1DC1.0020.0002] # MODIFIER LETTER CAPITAL REVERSED N -1D0E ; [.1DC2.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED N -1D70 ; [.1DC3.0020.0002] # LATIN SMALL LETTER N WITH MIDDLE TILDE -0272 ; [.1DC4.0020.0002] # LATIN SMALL LETTER N WITH LEFT HOOK -019D ; [.1DC4.0020.0008] # LATIN CAPITAL LETTER N WITH LEFT HOOK -1DAE ; [.1DC4.0020.0014] # MODIFIER LETTER SMALL N WITH LEFT HOOK -019E ; [.1DC8.0020.0002] # LATIN SMALL LETTER N WITH LONG RIGHT LEG -0220 ; [.1DC8.0020.0008] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG -A791 ; [.1DCC.0020.0002] # LATIN SMALL LETTER N WITH DESCENDER -A790 ; [.1DCC.0020.0008] # LATIN CAPITAL LETTER N WITH DESCENDER -1D87 ; [.1DCD.0020.0002] # LATIN SMALL LETTER N WITH PALATAL HOOK -0273 ; [.1DCE.0020.0002] # LATIN SMALL LETTER N WITH RETROFLEX HOOK -1DAF ; [.1DCE.0020.0014] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK -0235 ; [.1DD2.0020.0002] # LATIN SMALL LETTER N WITH CURL -AB3B ; [.1DD6.0020.0002] # LATIN SMALL LETTER N WITH CROSSED-TAIL -A774 ; [.1DD7.0020.0002] # LATIN SMALL LETTER NUM -014B ; [.1DD8.0020.0002] # LATIN SMALL LETTER ENG -014A ; [.1DD8.0020.0008] # LATIN CAPITAL LETTER ENG -1D51 ; [.1DD8.0020.0014] # MODIFIER LETTER SMALL ENG -AB3C ; [.1DDC.0020.0002] # LATIN SMALL LETTER ENG WITH CROSSED-TAIL -006F ; [.1DDD.0020.0002] # LATIN SMALL LETTER O -FF4F ; [.1DDD.0020.0003] # FULLWIDTH LATIN SMALL LETTER O -0366 ; [.1DDD.0020.0004] # COMBINING LATIN SMALL LETTER O -24AA ; [*0317.0020.0004][.1DDD.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER O -2134 ; [.1DDD.0020.0005] # SCRIPT SMALL O -1D428 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD SMALL O -1D45C ; [.1DDD.0020.0005] # MATHEMATICAL ITALIC SMALL O -1D490 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL O -1D4F8 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL O -1D52C ; [.1DDD.0020.0005] # MATHEMATICAL FRAKTUR SMALL O -1D560 ; [.1DDD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL O -1D594 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL O -1D5C8 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF SMALL O -1D5FC ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL O -1D630 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL O -1D664 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O -1D698 ; [.1DDD.0020.0005] # MATHEMATICAL MONOSPACE SMALL O -24DE ; [.1DDD.0020.0006] # CIRCLED LATIN SMALL LETTER O -004F ; [.1DDD.0020.0008] # LATIN CAPITAL LETTER O -FF2F ; [.1DDD.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER O -1F11E ; [*0317.0020.0004][.1DDD.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER O -1D40E ; [.1DDD.0020.000B] # MATHEMATICAL BOLD CAPITAL O -1D442 ; [.1DDD.0020.000B] # MATHEMATICAL ITALIC CAPITAL O -1D476 ; [.1DDD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL O -1D4AA ; [.1DDD.0020.000B] # MATHEMATICAL SCRIPT CAPITAL O -1D4DE ; [.1DDD.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL O -1D512 ; [.1DDD.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL O -1D546 ; [.1DDD.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D57A ; [.1DDD.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL O -1D5AE ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL O -1D5E2 ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O -1D616 ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O -1D64A ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O -1D67E ; [.1DDD.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL O -24C4 ; [.1DDD.0020.000C] # CIRCLED LATIN CAPITAL LETTER O -1F15E ; [.1DDD.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER O -00BA ; [.1DDD.0020.0014] # MASCULINE ORDINAL INDICATOR -1D52 ; [.1DDD.0020.0014] # MODIFIER LETTER SMALL O -2092 ; [.1DDD.0020.0015] # LATIN SUBSCRIPT SMALL LETTER O -1D3C ; [.1DDD.0020.001D] # MODIFIER LETTER CAPITAL O -1F13E ; [.1DDD.0020.001D] # SQUARED LATIN CAPITAL LETTER O -1F17E ; [.1DDD.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER O -00F3 ; [.1DDD.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH ACUTE -00D3 ; [.1DDD.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH ACUTE -00F2 ; [.1DDD.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH GRAVE -00D2 ; [.1DDD.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH GRAVE -014F ; [.1DDD.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER O WITH BREVE -014E ; [.1DDD.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER O WITH BREVE -00F4 ; [.1DDD.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX -00D4 ; [.1DDD.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -1ED1 ; [.1DDD.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED0 ; [.1DDD.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED3 ; [.1DDD.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED2 ; [.1DDD.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED7 ; [.1DDD.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE -1ED6 ; [.1DDD.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE -1ED5 ; [.1DDD.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -1ED4 ; [.1DDD.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -01D2 ; [.1DDD.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER O WITH CARON -01D1 ; [.1DDD.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER O WITH CARON -00F6 ; [.1DDD.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH DIAERESIS -1DF3 ; [.1DDD.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER O WITH DIAERESIS -A79D ; [.1DDD.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK OE -00D6 ; [.1DDD.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS -A79C ; [.1DDD.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK OE -022B ; [.1DDD.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON -022A ; [.1DDD.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON -0151 ; [.1DDD.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER O WITH DOUBLE ACUTE -0150 ; [.1DDD.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -00F5 ; [.1DDD.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH TILDE -00D5 ; [.1DDD.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH TILDE -1E4D ; [.1DDD.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH TILDE AND ACUTE -1E4C ; [.1DDD.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE -1E4F ; [.1DDD.0020.0002][.0000.002D.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS -1E4E ; [.1DDD.0020.0008][.0000.002D.0002][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS -022D ; [.1DDD.0020.0002][.0000.002D.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH TILDE AND MACRON -022C ; [.1DDD.0020.0008][.0000.002D.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON -022F ; [.1DDD.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER O WITH DOT ABOVE -022E ; [.1DDD.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE -0231 ; [.1DDD.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON -0230 ; [.1DDD.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON -00F8 ; [.1DDD.0020.0002][.0000.002F.0002] # LATIN SMALL LETTER O WITH STROKE -00D8 ; [.1DDD.0020.0008][.0000.002F.0002] # LATIN CAPITAL LETTER O WITH STROKE -01FF ; [.1DDD.0020.0002][.0000.002F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH STROKE AND ACUTE -01FE ; [.1DDD.0020.0008][.0000.002F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE -01EB ; [.1DDD.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER O WITH OGONEK -01EA ; [.1DDD.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER O WITH OGONEK -01ED ; [.1DDD.0020.0002][.0000.0031.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH OGONEK AND MACRON -01EC ; [.1DDD.0020.0008][.0000.0031.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON -014D ; [.1DDD.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH MACRON -014C ; [.1DDD.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH MACRON -1E53 ; [.1DDD.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH MACRON AND ACUTE -1E52 ; [.1DDD.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE -1E51 ; [.1DDD.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH MACRON AND GRAVE -1E50 ; [.1DDD.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE -1DED ; [.1DDD.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE -1ECF ; [.1DDD.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HOOK ABOVE -1ECE ; [.1DDD.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HOOK ABOVE -020D ; [.1DDD.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER O WITH DOUBLE GRAVE -020C ; [.1DDD.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE -020F ; [.1DDD.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER O WITH INVERTED BREVE -020E ; [.1DDD.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER O WITH INVERTED BREVE -01A1 ; [.1DDD.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER O WITH HORN -01A0 ; [.1DDD.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER O WITH HORN -1EDB ; [.1DDD.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH HORN AND ACUTE -1EDA ; [.1DDD.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE -1EDD ; [.1DDD.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH HORN AND GRAVE -1EDC ; [.1DDD.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE -1EE1 ; [.1DDD.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH HORN AND TILDE -1EE0 ; [.1DDD.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH HORN AND TILDE -1EDF ; [.1DDD.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE -1EDE ; [.1DDD.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE -1EE3 ; [.1DDD.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW -1EE2 ; [.1DDD.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW -1ECD ; [.1DDD.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH DOT BELOW -1ECC ; [.1DDD.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH DOT BELOW -1ED9 ; [.1DDD.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW -1ED8 ; [.1DDD.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW -0153 ; [.1DDD.0020.0004][.0000.0110.0004][.1CAA.0020.0004] # LATIN SMALL LIGATURE OE -0152 ; [.1DDD.0020.000A][.0000.0110.0004][.1CAA.0020.000A] # LATIN CAPITAL LIGATURE OE -A7F9 ; [.1DDD.0020.0014][.0000.0110.0014][.1CAA.0020.0014] # MODIFIER LETTER SMALL LIGATURE OE -1F197 ; [.1DDD.0020.001D][.1D65.0020.001D] # SQUARED OK -A74F ; [.1DDD.0020.0004][.1DDD.0020.0004] # LATIN SMALL LETTER OO -A74E ; [.1DDD.0020.000A][.1DDD.0020.000A] # LATIN CAPITAL LETTER OO -3375 ; [.1DDD.0020.001C][.1EE3.0020.001D] # SQUARE OV -1D0F ; [.1DE1.0020.0002] # LATIN LETTER SMALL CAPITAL O -1D11 ; [.1DE2.0020.0002] # LATIN SMALL LETTER SIDEWAYS O -AB3D ; [.1DE3.0020.0002] # LATIN SMALL LETTER BLACKLETTER O -0276 ; [.1DE4.0020.0002] # LATIN LETTER SMALL CAPITAL OE -1D14 ; [.1DE8.0020.0002] # LATIN SMALL LETTER TURNED OE -AB41 ; [.1DE9.0020.0002] # LATIN SMALL LETTER TURNED OE WITH STROKE -AB42 ; [.1DEA.0020.0002] # LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE -AB40 ; [.1DEB.0020.0002] # LATIN SMALL LETTER INVERTED OE -AB43 ; [.1DEC.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O -AB44 ; [.1DED.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE -1D13 ; [.1DEE.0020.0002] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE -AB3E ; [.1DEF.0020.0002] # LATIN SMALL LETTER BLACKLETTER O WITH STROKE -0254 ; [.1DF0.0020.0002] # LATIN SMALL LETTER OPEN O -0186 ; [.1DF0.0020.0008] # LATIN CAPITAL LETTER OPEN O -1D53 ; [.1DF0.0020.0014] # MODIFIER LETTER SMALL OPEN O -1D10 ; [.1DF4.0020.0002] # LATIN LETTER SMALL CAPITAL OPEN O -1D12 ; [.1DF5.0020.0002] # LATIN SMALL LETTER SIDEWAYS OPEN O -AB3F ; [.1DF6.0020.0002] # LATIN SMALL LETTER OPEN O WITH STROKE -1D97 ; [.1DF7.0020.0002] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK -AB62 ; [.1DF8.0020.0002] # LATIN SMALL LETTER OPEN OE -A74D ; [.1DF9.0020.0002] # LATIN SMALL LETTER O WITH LOOP -A74C ; [.1DF9.0020.0008] # LATIN CAPITAL LETTER O WITH LOOP -1D16 ; [.1DFA.0020.0002] # LATIN SMALL LETTER TOP HALF O -1D54 ; [.1DFA.0020.0014] # MODIFIER LETTER SMALL TOP HALF O -1D17 ; [.1DFB.0020.0002] # LATIN SMALL LETTER BOTTOM HALF O -1D55 ; [.1DFB.0020.0014] # MODIFIER LETTER SMALL BOTTOM HALF O -2C7A ; [.1DFC.0020.0002] # LATIN SMALL LETTER O WITH LOW RING INSIDE -0275 ; [.1DFD.0020.0002] # LATIN SMALL LETTER BARRED O -019F ; [.1DFD.0020.0008] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE -1DB1 ; [.1DFD.0020.0014] # MODIFIER LETTER SMALL BARRED O -A74B ; [.1E01.0020.0002] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY -A74A ; [.1E01.0020.0008] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY -0277 ; [.1E02.0020.0002] # LATIN SMALL LETTER CLOSED OMEGA -A7B7 ; [.1E06.0020.0002] # LATIN SMALL LETTER OMEGA -A7B6 ; [.1E06.0020.0008] # LATIN CAPITAL LETTER OMEGA -0223 ; [.1E07.0020.0002] # LATIN SMALL LETTER OU -0222 ; [.1E07.0020.0008] # LATIN CAPITAL LETTER OU -1D3D ; [.1E07.0020.001D] # MODIFIER LETTER CAPITAL OU -1D15 ; [.1E0B.0020.0002] # LATIN LETTER SMALL CAPITAL OU -0070 ; [.1E0C.0020.0002] # LATIN SMALL LETTER P -FF50 ; [.1E0C.0020.0003] # FULLWIDTH LATIN SMALL LETTER P -1DEE ; [.1E0C.0020.0004] # COMBINING LATIN SMALL LETTER P -24AB ; [*0317.0020.0004][.1E0C.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER P -1D429 ; [.1E0C.0020.0005] # MATHEMATICAL BOLD SMALL P -1D45D ; [.1E0C.0020.0005] # MATHEMATICAL ITALIC SMALL P -1D491 ; [.1E0C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL P -1D4C5 ; [.1E0C.0020.0005] # MATHEMATICAL SCRIPT SMALL P -1D4F9 ; [.1E0C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL P -1D52D ; [.1E0C.0020.0005] # MATHEMATICAL FRAKTUR SMALL P -1D561 ; [.1E0C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL P -1D595 ; [.1E0C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL P -1D5C9 ; [.1E0C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL P -1D5FD ; [.1E0C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL P -1D631 ; [.1E0C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL P -1D665 ; [.1E0C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P -1D699 ; [.1E0C.0020.0005] # MATHEMATICAL MONOSPACE SMALL P -24DF ; [.1E0C.0020.0006] # CIRCLED LATIN SMALL LETTER P -0050 ; [.1E0C.0020.0008] # LATIN CAPITAL LETTER P -FF30 ; [.1E0C.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER P -1F11F ; [*0317.0020.0004][.1E0C.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER P -2119 ; [.1E0C.0020.000B] # DOUBLE-STRUCK CAPITAL P -1D40F ; [.1E0C.0020.000B] # MATHEMATICAL BOLD CAPITAL P -1D443 ; [.1E0C.0020.000B] # MATHEMATICAL ITALIC CAPITAL P -1D477 ; [.1E0C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL P -1D4AB ; [.1E0C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL P -1D4DF ; [.1E0C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL P -1D513 ; [.1E0C.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL P -1D57B ; [.1E0C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P -1D5AF ; [.1E0C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL P -1D5E3 ; [.1E0C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P -1D617 ; [.1E0C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P -1D64B ; [.1E0C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P -1D67F ; [.1E0C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL P -24C5 ; [.1E0C.0020.000C] # CIRCLED LATIN CAPITAL LETTER P -1F15F ; [.1E0C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P -1D56 ; [.1E0C.0020.0014] # MODIFIER LETTER SMALL P -209A ; [.1E0C.0020.0015] # LATIN SUBSCRIPT SMALL LETTER P -1D3E ; [.1E0C.0020.001D] # MODIFIER LETTER CAPITAL P -1F13F ; [.1E0C.0020.001D] # SQUARED LATIN CAPITAL LETTER P -1F17F ; [.1E0C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER P -1F18A ; [.1E0C.0020.001D] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P -1E55 ; [.1E0C.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER P WITH ACUTE -1E54 ; [.1E0C.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER P WITH ACUTE -1E57 ; [.1E0C.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER P WITH DOT ABOVE -1E56 ; [.1E0C.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER P WITH DOT ABOVE -3380 ; [.1E0C.0020.001C][.1C47.0020.001D] # SQUARE PA AMPS -33A9 ; [.1E0C.0020.001D][.1C47.0020.001C] # SQUARE PA -1F18C ; [.1E0C.0020.001D][.1C47.0020.001D] # NEGATIVE SQUARED PA -3376 ; [.1E0C.0020.001C][.1C7A.0020.001C] # SQUARE PC -338A ; [.1E0C.0020.001C][.1CE5.0020.001D] # SQUARE PF -33D7 ; [.1E0C.0020.001D][.1D18.0020.001D] # SQUARE PH -33D8 ; [.1E0C.0020.001C][*0277.0020.001C][.1DAA.0020.001C][*0277.0020.001C] # SQUARE PM -33D9 ; [.1E0C.0020.001D][.1E0C.0020.001D][.1DAA.0020.001D] # SQUARE PPM -1F14E ; [.1E0C.0020.001D][.1E0C.0020.001D][.1EE3.0020.001D] # SQUARED PPV -33DA ; [.1E0C.0020.001D][.1E33.0020.001D] # SQUARE PR -33B0 ; [.1E0C.0020.001C][.1E71.0020.001C] # SQUARE PS -3250 ; [.1E0C.0020.001D][.1E95.0020.001D][.1CAA.0020.001D] # PARTNERSHIP SIGN -33B4 ; [.1E0C.0020.001C][.1EE3.0020.001D] # SQUARE PV -33BA ; [.1E0C.0020.001C][.1EF5.0020.001D] # SQUARE PW -1D18 ; [.1E10.0020.0002] # LATIN LETTER SMALL CAPITAL P -1D7D ; [.1E11.0020.0002] # LATIN SMALL LETTER P WITH STROKE -2C63 ; [.1E11.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE -A751 ; [.1E12.0020.0002] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER -A750 ; [.1E12.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER -1D71 ; [.1E13.0020.0002] # LATIN SMALL LETTER P WITH MIDDLE TILDE -1D88 ; [.1E14.0020.0002] # LATIN SMALL LETTER P WITH PALATAL HOOK -01A5 ; [.1E15.0020.0002] # LATIN SMALL LETTER P WITH HOOK -01A4 ; [.1E15.0020.0008] # LATIN CAPITAL LETTER P WITH HOOK -A753 ; [.1E19.0020.0002] # LATIN SMALL LETTER P WITH FLOURISH -A752 ; [.1E19.0020.0008] # LATIN CAPITAL LETTER P WITH FLOURISH -A755 ; [.1E1A.0020.0002] # LATIN SMALL LETTER P WITH SQUIRREL TAIL -A754 ; [.1E1A.0020.0008] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL -A7FC ; [.1E1B.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED P -0278 ; [.1E1C.0020.0002] # LATIN SMALL LETTER PHI -1DB2 ; [.1E1C.0020.0014] # MODIFIER LETTER SMALL PHI -2C77 ; [.1E20.0020.0002] # LATIN SMALL LETTER TAILLESS PHI -0071 ; [.1E21.0020.0002] # LATIN SMALL LETTER Q -FF51 ; [.1E21.0020.0003] # FULLWIDTH LATIN SMALL LETTER Q -24AC ; [*0317.0020.0004][.1E21.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Q -1D42A ; [.1E21.0020.0005] # MATHEMATICAL BOLD SMALL Q -1D45E ; [.1E21.0020.0005] # MATHEMATICAL ITALIC SMALL Q -1D492 ; [.1E21.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Q -1D4C6 ; [.1E21.0020.0005] # MATHEMATICAL SCRIPT SMALL Q -1D4FA ; [.1E21.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Q -1D52E ; [.1E21.0020.0005] # MATHEMATICAL FRAKTUR SMALL Q -1D562 ; [.1E21.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Q -1D596 ; [.1E21.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Q -1D5CA ; [.1E21.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Q -1D5FE ; [.1E21.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Q -1D632 ; [.1E21.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q -1D666 ; [.1E21.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q -1D69A ; [.1E21.0020.0005] # MATHEMATICAL MONOSPACE SMALL Q -24E0 ; [.1E21.0020.0006] # CIRCLED LATIN SMALL LETTER Q -0051 ; [.1E21.0020.0008] # LATIN CAPITAL LETTER Q -FF31 ; [.1E21.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Q -1F120 ; [*0317.0020.0004][.1E21.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Q -211A ; [.1E21.0020.000B] # DOUBLE-STRUCK CAPITAL Q -1D410 ; [.1E21.0020.000B] # MATHEMATICAL BOLD CAPITAL Q -1D444 ; [.1E21.0020.000B] # MATHEMATICAL ITALIC CAPITAL Q -1D478 ; [.1E21.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Q -1D4AC ; [.1E21.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Q -1D4E0 ; [.1E21.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Q -1D514 ; [.1E21.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Q -1D57C ; [.1E21.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q -1D5B0 ; [.1E21.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Q -1D5E4 ; [.1E21.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q -1D618 ; [.1E21.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q -1D64C ; [.1E21.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q -1D680 ; [.1E21.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Q -24C6 ; [.1E21.0020.000C] # CIRCLED LATIN CAPITAL LETTER Q -1F160 ; [.1E21.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Q -1F140 ; [.1E21.0020.001D] # SQUARED LATIN CAPITAL LETTER Q -1F180 ; [.1E21.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Q -0239 ; [.1E21.0020.0004][.1E0C.0020.0004] # LATIN SMALL LETTER QP DIGRAPH -A757 ; [.1E25.0020.0002] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER -A756 ; [.1E25.0020.0008] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER -A759 ; [.1E26.0020.0002] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE -A758 ; [.1E26.0020.0008] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE -02A0 ; [.1E27.0020.0002] # LATIN SMALL LETTER Q WITH HOOK -024B ; [.1E2B.0020.0002] # LATIN SMALL LETTER Q WITH HOOK TAIL -024A ; [.1E2B.0020.0008] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL -0138 ; [.1E2F.0020.0002] # LATIN SMALL LETTER KRA -0072 ; [.1E33.0020.0002] # LATIN SMALL LETTER R -FF52 ; [.1E33.0020.0003] # FULLWIDTH LATIN SMALL LETTER R -036C ; [.1E33.0020.0004] # COMBINING LATIN SMALL LETTER R -1DCA ; [.1E33.0020.0004] # COMBINING LATIN SMALL LETTER R BELOW -24AD ; [*0317.0020.0004][.1E33.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER R -1D42B ; [.1E33.0020.0005] # MATHEMATICAL BOLD SMALL R -1D45F ; [.1E33.0020.0005] # MATHEMATICAL ITALIC SMALL R -1D493 ; [.1E33.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL R -1D4C7 ; [.1E33.0020.0005] # MATHEMATICAL SCRIPT SMALL R -1D4FB ; [.1E33.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL R -1D52F ; [.1E33.0020.0005] # MATHEMATICAL FRAKTUR SMALL R -1D563 ; [.1E33.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL R -1D597 ; [.1E33.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL R -1D5CB ; [.1E33.0020.0005] # MATHEMATICAL SANS-SERIF SMALL R -1D5FF ; [.1E33.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL R -1D633 ; [.1E33.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL R -1D667 ; [.1E33.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R -1D69B ; [.1E33.0020.0005] # MATHEMATICAL MONOSPACE SMALL R -24E1 ; [.1E33.0020.0006] # CIRCLED LATIN SMALL LETTER R -0052 ; [.1E33.0020.0008] # LATIN CAPITAL LETTER R -FF32 ; [.1E33.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER R -1F121 ; [*0317.0020.0004][.1E33.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER R -211B ; [.1E33.0020.000B] # SCRIPT CAPITAL R -211C ; [.1E33.0020.000B] # BLACK-LETTER CAPITAL R -211D ; [.1E33.0020.000B] # DOUBLE-STRUCK CAPITAL R -1D411 ; [.1E33.0020.000B] # MATHEMATICAL BOLD CAPITAL R -1D445 ; [.1E33.0020.000B] # MATHEMATICAL ITALIC CAPITAL R -1D479 ; [.1E33.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL R -1D4E1 ; [.1E33.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL R -1D57D ; [.1E33.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL R -1D5B1 ; [.1E33.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL R -1D5E5 ; [.1E33.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R -1D619 ; [.1E33.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R -1D64D ; [.1E33.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R -1D681 ; [.1E33.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL R -24C7 ; [.1E33.0020.000C] # CIRCLED LATIN CAPITAL LETTER R -1F12C ; [.1E33.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER R -1F161 ; [.1E33.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER R -02B3 ; [.1E33.0020.0014] # MODIFIER LETTER SMALL R -1D63 ; [.1E33.0020.0015] # LATIN SUBSCRIPT SMALL LETTER R -1D3F ; [.1E33.0020.001D] # MODIFIER LETTER CAPITAL R -1F141 ; [.1E33.0020.001D] # SQUARED LATIN CAPITAL LETTER R -1F181 ; [.1E33.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER R -0155 ; [.1E33.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER R WITH ACUTE -0154 ; [.1E33.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER R WITH ACUTE -0159 ; [.1E33.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER R WITH CARON -0158 ; [.1E33.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER R WITH CARON -1E59 ; [.1E33.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER R WITH DOT ABOVE -1E58 ; [.1E33.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER R WITH DOT ABOVE -0157 ; [.1E33.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER R WITH CEDILLA -0156 ; [.1E33.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER R WITH CEDILLA -A7A7 ; [.1E33.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER R WITH OBLIQUE STROKE -A7A6 ; [.1E33.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE -0211 ; [.1E33.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER R WITH DOUBLE GRAVE -0210 ; [.1E33.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE -0213 ; [.1E33.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER R WITH INVERTED BREVE -0212 ; [.1E33.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER R WITH INVERTED BREVE -1E5B ; [.1E33.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER R WITH DOT BELOW -1E5A ; [.1E33.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW -1E5D ; [.1E33.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON -1E5C ; [.1E33.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON -1E5F ; [.1E33.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER R WITH LINE BELOW -1E5E ; [.1E33.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER R WITH LINE BELOW -A783 ; [.1E33.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR R -A782 ; [.1E33.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR R -33AD ; [.1E33.0020.001C][.1C47.0020.001C][.1C8F.0020.001C] # SQUARE RAD -33AE ; [.1E33.0020.001C][.1C47.0020.001C][.1C8F.0020.001C][*0625.0020.001C][.1E71.0020.001C] # SQUARE RAD OVER S -33AF ; [.1E33.0020.001C][.1C47.0020.001C][.1C8F.0020.001C][*0625.0020.001C][.1E71.0020.001C][.1C3F.0020.001C] # SQUARE RAD OVER S SQUARED -20A8 ; [.1E33.0020.000A][.1E71.0020.0004] # RUPEE SIGN -AB45 ; [.1E37.0020.0002] # LATIN SMALL LETTER STIRRUP R -0280 ; [.1E38.0020.0002] # LATIN LETTER SMALL CAPITAL R -1DE2 ; [.1E38.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL R -01A6 ; [.1E38.0020.0008] # LATIN LETTER YR -AB46 ; [.1E3C.0020.0002] # LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG -A75B ; [.1E3D.0020.0002] # LATIN SMALL LETTER R ROTUNDA -1DE3 ; [.1E3D.0020.0004] # COMBINING LATIN SMALL LETTER R ROTUNDA -A75A ; [.1E3D.0020.0008] # LATIN CAPITAL LETTER R ROTUNDA -1D19 ; [.1E3E.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED R -024D ; [.1E3F.0020.0002] # LATIN SMALL LETTER R WITH STROKE -024C ; [.1E3F.0020.0008] # LATIN CAPITAL LETTER R WITH STROKE -1D72 ; [.1E43.0020.0002] # LATIN SMALL LETTER R WITH MIDDLE TILDE -0279 ; [.1E44.0020.0002] # LATIN SMALL LETTER TURNED R -02B4 ; [.1E44.0020.0014] # MODIFIER LETTER SMALL TURNED R -1D1A ; [.1E48.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED R -027A ; [.1E49.0020.0002] # LATIN SMALL LETTER TURNED R WITH LONG LEG -1D89 ; [.1E4D.0020.0002] # LATIN SMALL LETTER R WITH PALATAL HOOK -027B ; [.1E4E.0020.0002] # LATIN SMALL LETTER TURNED R WITH HOOK -02B5 ; [.1E4E.0020.0014] # MODIFIER LETTER SMALL TURNED R WITH HOOK -2C79 ; [.1E52.0020.0002] # LATIN SMALL LETTER TURNED R WITH TAIL -027C ; [.1E53.0020.0002] # LATIN SMALL LETTER R WITH LONG LEG -027D ; [.1E57.0020.0002] # LATIN SMALL LETTER R WITH TAIL -2C64 ; [.1E57.0020.0008] # LATIN CAPITAL LETTER R WITH TAIL -AB49 ; [.1E5B.0020.0002] # LATIN SMALL LETTER R WITH CROSSED-TAIL -027E ; [.1E5C.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK -1D73 ; [.1E60.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE -027F ; [.1E61.0020.0002] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK -AB47 ; [.1E65.0020.0002] # LATIN SMALL LETTER R WITHOUT HANDLE -AB48 ; [.1E66.0020.0002] # LATIN SMALL LETTER DOUBLE R -AB4A ; [.1E67.0020.0002] # LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL -AB4B ; [.1E68.0020.0002] # LATIN SMALL LETTER SCRIPT R -AB4C ; [.1E69.0020.0002] # LATIN SMALL LETTER SCRIPT R WITH RING -0281 ; [.1E6A.0020.0002] # LATIN LETTER SMALL CAPITAL INVERTED R -02B6 ; [.1E6A.0020.0014] # MODIFIER LETTER SMALL CAPITAL INVERTED R -A775 ; [.1E6E.0020.0002] # LATIN SMALL LETTER RUM -A776 ; [.1E6F.0020.0002] # LATIN LETTER SMALL CAPITAL RUM -A75D ; [.1E70.0020.0002] # LATIN SMALL LETTER RUM ROTUNDA -A75C ; [.1E70.0020.0008] # LATIN CAPITAL LETTER RUM ROTUNDA -0073 ; [.1E71.0020.0002] # LATIN SMALL LETTER S -FF53 ; [.1E71.0020.0003] # FULLWIDTH LATIN SMALL LETTER S -1DE4 ; [.1E71.0020.0004] # COMBINING LATIN SMALL LETTER S -24AE ; [*0317.0020.0004][.1E71.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER S -1D42C ; [.1E71.0020.0005] # MATHEMATICAL BOLD SMALL S -1D460 ; [.1E71.0020.0005] # MATHEMATICAL ITALIC SMALL S -1D494 ; [.1E71.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL S -1D4C8 ; [.1E71.0020.0005] # MATHEMATICAL SCRIPT SMALL S -1D4FC ; [.1E71.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL S -1D530 ; [.1E71.0020.0005] # MATHEMATICAL FRAKTUR SMALL S -1D564 ; [.1E71.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL S -1D598 ; [.1E71.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL S -1D5CC ; [.1E71.0020.0005] # MATHEMATICAL SANS-SERIF SMALL S -1D600 ; [.1E71.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL S -1D634 ; [.1E71.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL S -1D668 ; [.1E71.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S -1D69C ; [.1E71.0020.0005] # MATHEMATICAL MONOSPACE SMALL S -24E2 ; [.1E71.0020.0006] # CIRCLED LATIN SMALL LETTER S -0053 ; [.1E71.0020.0008] # LATIN CAPITAL LETTER S -FF33 ; [.1E71.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER S -1F122 ; [*0317.0020.0004][.1E71.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER S -1F12A ; [*0379.0020.0004][.1E71.0020.000A][*037A.0020.0004] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S -1D412 ; [.1E71.0020.000B] # MATHEMATICAL BOLD CAPITAL S -1D446 ; [.1E71.0020.000B] # MATHEMATICAL ITALIC CAPITAL S -1D47A ; [.1E71.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL S -1D4AE ; [.1E71.0020.000B] # MATHEMATICAL SCRIPT CAPITAL S -1D4E2 ; [.1E71.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL S -1D516 ; [.1E71.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL S -1D54A ; [.1E71.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S -1D57E ; [.1E71.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL S -1D5B2 ; [.1E71.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL S -1D5E6 ; [.1E71.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S -1D61A ; [.1E71.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S -1D64E ; [.1E71.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S -1D682 ; [.1E71.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL S -24C8 ; [.1E71.0020.000C] # CIRCLED LATIN CAPITAL LETTER S -1F162 ; [.1E71.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER S -02E2 ; [.1E71.0020.0014] # MODIFIER LETTER SMALL S -209B ; [.1E71.0020.0015] # LATIN SUBSCRIPT SMALL LETTER S -1F142 ; [.1E71.0020.001D] # SQUARED LATIN CAPITAL LETTER S -1F182 ; [.1E71.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER S -015B ; [.1E71.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER S WITH ACUTE -015A ; [.1E71.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER S WITH ACUTE -1E65 ; [.1E71.0020.0002][.0000.0024.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE -1E64 ; [.1E71.0020.0008][.0000.0024.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE -015D ; [.1E71.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER S WITH CIRCUMFLEX -015C ; [.1E71.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX -0161 ; [.1E71.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER S WITH CARON -0160 ; [.1E71.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER S WITH CARON -1E67 ; [.1E71.0020.0002][.0000.0028.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE -1E66 ; [.1E71.0020.0008][.0000.0028.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE -1E61 ; [.1E71.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT ABOVE -1E60 ; [.1E71.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT ABOVE -015F ; [.1E71.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER S WITH CEDILLA -015E ; [.1E71.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER S WITH CEDILLA -A7A9 ; [.1E71.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER S WITH OBLIQUE STROKE -A7A8 ; [.1E71.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE -1E63 ; [.1E71.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER S WITH DOT BELOW -1E62 ; [.1E71.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW -1E69 ; [.1E71.0020.0002][.0000.0042.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE -1E68 ; [.1E71.0020.0008][.0000.0042.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE -0219 ; [.1E71.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER S WITH COMMA BELOW -0218 ; [.1E71.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER S WITH COMMA BELOW -017F ; [.1E71.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER LONG S -1DE5 ; [.1E71.0020.0004][.0000.0111.0004] # COMBINING LATIN SMALL LETTER LONG S -A785 ; [.1E71.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR S -A784 ; [.1E71.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR S -1E9B ; [.1E71.0020.0004][.0000.0111.0004][.0000.002E.0002] # LATIN SMALL LETTER LONG S WITH DOT ABOVE -1F18D ; [.1E71.0020.001D][.1C47.0020.001D] # NEGATIVE SQUARED SA -1F14C ; [.1E71.0020.001D][.1C8F.0020.001D] # SQUARED SD -1F1AA ; [.1E71.0020.001D][.1D18.0020.001D][.1EE3.0020.001D] # SQUARED SHV -2120 ; [.1E71.0020.0014][.1DAA.0020.0014] # SERVICE MARK -1F198 ; [.1E71.0020.001D][.1DDD.0020.001D][.1E71.0020.001D] # SQUARED SOS -33DB ; [.1E71.0020.001C][.1E33.0020.001C] # SQUARE SR -1F14D ; [.1E71.0020.001D][.1E71.0020.001D] # SQUARED SS -00DF ; [.1E71.0020.0004][.0000.0110.0004][.1E71.0020.0004] # LATIN SMALL LETTER SHARP S -1E9E ; [.1E71.0020.000A][.0000.0110.0004][.1E71.0020.000A] # LATIN CAPITAL LETTER SHARP S -FB06 ; [.1E71.0020.0004][.1E95.0020.0004] # LATIN SMALL LIGATURE ST -FB05 ; [.1E71.0020.0004][.0000.0111.0004][.1E95.0020.0004] # LATIN SMALL LIGATURE LONG S T -33DC ; [.1E71.0020.001D][.1EE3.0020.001C] # SQUARE SV -A731 ; [.1E75.0020.0002] # LATIN LETTER SMALL CAPITAL S -1D74 ; [.1E76.0020.0002] # LATIN SMALL LETTER S WITH MIDDLE TILDE -1D8A ; [.1E77.0020.0002] # LATIN SMALL LETTER S WITH PALATAL HOOK -0282 ; [.1E78.0020.0002] # LATIN SMALL LETTER S WITH HOOK -1DB3 ; [.1E78.0020.0014] # MODIFIER LETTER SMALL S WITH HOOK -023F ; [.1E7C.0020.0002] # LATIN SMALL LETTER S WITH SWASH TAIL -2C7E ; [.1E7C.0020.0008] # LATIN CAPITAL LETTER S WITH SWASH TAIL -1E9C ; [.1E80.0020.0002] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE -1E9D ; [.1E81.0020.0002] # LATIN SMALL LETTER LONG S WITH HIGH STROKE -0283 ; [.1E82.0020.0002] # LATIN SMALL LETTER ESH -1DEF ; [.1E82.0020.0004] # COMBINING LATIN SMALL LETTER ESH -01A9 ; [.1E82.0020.0008] # LATIN CAPITAL LETTER ESH -1DB4 ; [.1E82.0020.0014] # MODIFIER LETTER SMALL ESH -AB4D ; [.1E86.0020.0002] # LATIN SMALL LETTER BASELINE ESH -1D8B ; [.1E87.0020.0002] # LATIN SMALL LETTER ESH WITH PALATAL HOOK -01AA ; [.1E88.0020.0002] # LATIN LETTER REVERSED ESH LOOP -0285 ; [.1E8C.0020.0002] # LATIN SMALL LETTER SQUAT REVERSED ESH -1D98 ; [.1E90.0020.0002] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK -0286 ; [.1E91.0020.0002] # LATIN SMALL LETTER ESH WITH CURL -0074 ; [.1E95.0020.0002] # LATIN SMALL LETTER T -FF54 ; [.1E95.0020.0003] # FULLWIDTH LATIN SMALL LETTER T -036D ; [.1E95.0020.0004] # COMBINING LATIN SMALL LETTER T -24AF ; [*0317.0020.0004][.1E95.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER T -1D42D ; [.1E95.0020.0005] # MATHEMATICAL BOLD SMALL T -1D461 ; [.1E95.0020.0005] # MATHEMATICAL ITALIC SMALL T -1D495 ; [.1E95.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL T -1D4C9 ; [.1E95.0020.0005] # MATHEMATICAL SCRIPT SMALL T -1D4FD ; [.1E95.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL T -1D531 ; [.1E95.0020.0005] # MATHEMATICAL FRAKTUR SMALL T -1D565 ; [.1E95.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL T -1D599 ; [.1E95.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL T -1D5CD ; [.1E95.0020.0005] # MATHEMATICAL SANS-SERIF SMALL T -1D601 ; [.1E95.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL T -1D635 ; [.1E95.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL T -1D669 ; [.1E95.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T -1D69D ; [.1E95.0020.0005] # MATHEMATICAL MONOSPACE SMALL T -24E3 ; [.1E95.0020.0006] # CIRCLED LATIN SMALL LETTER T -0054 ; [.1E95.0020.0008] # LATIN CAPITAL LETTER T -FF34 ; [.1E95.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER T -1F123 ; [*0317.0020.0004][.1E95.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER T -1D413 ; [.1E95.0020.000B] # MATHEMATICAL BOLD CAPITAL T -1D447 ; [.1E95.0020.000B] # MATHEMATICAL ITALIC CAPITAL T -1D47B ; [.1E95.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL T -1D4AF ; [.1E95.0020.000B] # MATHEMATICAL SCRIPT CAPITAL T -1D4E3 ; [.1E95.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL T -1D517 ; [.1E95.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL T -1D54B ; [.1E95.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T -1D57F ; [.1E95.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL T -1D5B3 ; [.1E95.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL T -1D5E7 ; [.1E95.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T -1D61B ; [.1E95.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T -1D64F ; [.1E95.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T -1D683 ; [.1E95.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL T -24C9 ; [.1E95.0020.000C] # CIRCLED LATIN CAPITAL LETTER T -1F163 ; [.1E95.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER T -1D57 ; [.1E95.0020.0014] # MODIFIER LETTER SMALL T -209C ; [.1E95.0020.0015] # LATIN SUBSCRIPT SMALL LETTER T -1D40 ; [.1E95.0020.001D] # MODIFIER LETTER CAPITAL T -1F143 ; [.1E95.0020.001D] # SQUARED LATIN CAPITAL LETTER T -1F183 ; [.1E95.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER T -0165 ; [.1E95.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER T WITH CARON -0164 ; [.1E95.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER T WITH CARON -1E97 ; [.1E95.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER T WITH DIAERESIS -1E6B ; [.1E95.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER T WITH DOT ABOVE -1E6A ; [.1E95.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER T WITH DOT ABOVE -0163 ; [.1E95.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER T WITH CEDILLA -0162 ; [.1E95.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER T WITH CEDILLA -1E6D ; [.1E95.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER T WITH DOT BELOW -1E6C ; [.1E95.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER T WITH DOT BELOW -021B ; [.1E95.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER T WITH COMMA BELOW -021A ; [.1E95.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER T WITH COMMA BELOW -1E71 ; [.1E95.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW -1E70 ; [.1E95.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW -1E6F ; [.1E95.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER T WITH LINE BELOW -1E6E ; [.1E95.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER T WITH LINE BELOW -A787 ; [.1E95.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER INSULAR T -A786 ; [.1E95.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER INSULAR T -02A8 ; [.1E95.0020.0004][.1C89.0020.0004] # LATIN SMALL LETTER TC DIGRAPH WITH CURL -2121 ; [.1E95.0020.000A][.1CAA.0020.000A][.1D77.0020.000A] # TELEPHONE SIGN -1D7A ; [.1E95.0020.0004][.0000.0110.0004][.1D18.0020.0004] # LATIN SMALL LETTER TH WITH STRIKETHROUGH -3394 ; [.1E95.0020.001D][.1D18.0020.001D][.1F21.0020.001C] # SQUARE THZ -2122 ; [.1E95.0020.0014][.1DAA.0020.0014] # TRADE MARK SIGN -01BE ; [.1E95.0020.0004][.1E71.0020.0004] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE -02A6 ; [.1E95.0020.0004][.1E71.0020.0004] # LATIN SMALL LETTER TS DIGRAPH -02A7 ; [.1E95.0020.0004][.1E82.0020.0004] # LATIN SMALL LETTER TESH DIGRAPH -A729 ; [.1E95.0020.0004][.1F21.0020.0004] # LATIN SMALL LETTER TZ -A728 ; [.1E95.0020.000A][.1F21.0020.0004] # LATIN CAPITAL LETTER TZ -1D1B ; [.1E99.0020.0002] # LATIN LETTER SMALL CAPITAL T -0167 ; [.1E9A.0020.0002] # LATIN SMALL LETTER T WITH STROKE -0166 ; [.1E9A.0020.0008] # LATIN CAPITAL LETTER T WITH STROKE -2C66 ; [.1E9E.0020.0002] # LATIN SMALL LETTER T WITH DIAGONAL STROKE -023E ; [.1E9E.0020.0008] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE -1D75 ; [.1E9F.0020.0002] # LATIN SMALL LETTER T WITH MIDDLE TILDE -01AB ; [.1EA0.0020.0002] # LATIN SMALL LETTER T WITH PALATAL HOOK -1DB5 ; [.1EA0.0020.0014] # MODIFIER LETTER SMALL T WITH PALATAL HOOK -01AD ; [.1EA4.0020.0002] # LATIN SMALL LETTER T WITH HOOK -01AC ; [.1EA4.0020.0008] # LATIN CAPITAL LETTER T WITH HOOK -0288 ; [.1EA8.0020.0002] # LATIN SMALL LETTER T WITH RETROFLEX HOOK -01AE ; [.1EA8.0020.0008] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK -0236 ; [.1EAC.0020.0002] # LATIN SMALL LETTER T WITH CURL -A777 ; [.1EB0.0020.0002] # LATIN SMALL LETTER TUM -0287 ; [.1EB1.0020.0002] # LATIN SMALL LETTER TURNED T -A7B1 ; [.1EB1.0020.0008] # LATIN CAPITAL LETTER TURNED T -0075 ; [.1EB5.0020.0002] # LATIN SMALL LETTER U -FF55 ; [.1EB5.0020.0003] # FULLWIDTH LATIN SMALL LETTER U -0367 ; [.1EB5.0020.0004] # COMBINING LATIN SMALL LETTER U -24B0 ; [*0317.0020.0004][.1EB5.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER U -1D42E ; [.1EB5.0020.0005] # MATHEMATICAL BOLD SMALL U -1D462 ; [.1EB5.0020.0005] # MATHEMATICAL ITALIC SMALL U -1D496 ; [.1EB5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL U -1D4CA ; [.1EB5.0020.0005] # MATHEMATICAL SCRIPT SMALL U -1D4FE ; [.1EB5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL U -1D532 ; [.1EB5.0020.0005] # MATHEMATICAL FRAKTUR SMALL U -1D566 ; [.1EB5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL U -1D59A ; [.1EB5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL U -1D5CE ; [.1EB5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL U -1D602 ; [.1EB5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL U -1D636 ; [.1EB5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL U -1D66A ; [.1EB5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U -1D69E ; [.1EB5.0020.0005] # MATHEMATICAL MONOSPACE SMALL U -24E4 ; [.1EB5.0020.0006] # CIRCLED LATIN SMALL LETTER U -0055 ; [.1EB5.0020.0008] # LATIN CAPITAL LETTER U -FF35 ; [.1EB5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER U -1F124 ; [*0317.0020.0004][.1EB5.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER U -1D414 ; [.1EB5.0020.000B] # MATHEMATICAL BOLD CAPITAL U -1D448 ; [.1EB5.0020.000B] # MATHEMATICAL ITALIC CAPITAL U -1D47C ; [.1EB5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL U -1D4B0 ; [.1EB5.0020.000B] # MATHEMATICAL SCRIPT CAPITAL U -1D4E4 ; [.1EB5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL U -1D518 ; [.1EB5.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL U -1D54C ; [.1EB5.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U -1D580 ; [.1EB5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL U -1D5B4 ; [.1EB5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL U -1D5E8 ; [.1EB5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U -1D61C ; [.1EB5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U -1D650 ; [.1EB5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U -1D684 ; [.1EB5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL U -24CA ; [.1EB5.0020.000C] # CIRCLED LATIN CAPITAL LETTER U -1F164 ; [.1EB5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER U -1D58 ; [.1EB5.0020.0014] # MODIFIER LETTER SMALL U -1D64 ; [.1EB5.0020.0015] # LATIN SUBSCRIPT SMALL LETTER U -1D41 ; [.1EB5.0020.001D] # MODIFIER LETTER CAPITAL U -1F144 ; [.1EB5.0020.001D] # SQUARED LATIN CAPITAL LETTER U -1F184 ; [.1EB5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER U -00FA ; [.1EB5.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH ACUTE -00DA ; [.1EB5.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH ACUTE -00F9 ; [.1EB5.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH GRAVE -00D9 ; [.1EB5.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH GRAVE -016D ; [.1EB5.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER U WITH BREVE -016C ; [.1EB5.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER U WITH BREVE -00FB ; [.1EB5.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX -00DB ; [.1EB5.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -01D4 ; [.1EB5.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH CARON -01D3 ; [.1EB5.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH CARON -016F ; [.1EB5.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER U WITH RING ABOVE -016E ; [.1EB5.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER U WITH RING ABOVE -00FC ; [.1EB5.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH DIAERESIS -1DF4 ; [.1EB5.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER U WITH DIAERESIS -A79F ; [.1EB5.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK UE -00DC ; [.1EB5.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS -A79E ; [.1EB5.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK UE -01D8 ; [.1EB5.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE -01D7 ; [.1EB5.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE -01DC ; [.1EB5.0020.0002][.0000.002B.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE -01DB ; [.1EB5.0020.0008][.0000.002B.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE -01DA ; [.1EB5.0020.0002][.0000.002B.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON -01D9 ; [.1EB5.0020.0008][.0000.002B.0002][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON -01D6 ; [.1EB5.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON -01D5 ; [.1EB5.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON -0171 ; [.1EB5.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER U WITH DOUBLE ACUTE -0170 ; [.1EB5.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0169 ; [.1EB5.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH TILDE -0168 ; [.1EB5.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH TILDE -1E79 ; [.1EB5.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH TILDE AND ACUTE -1E78 ; [.1EB5.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE -0173 ; [.1EB5.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER U WITH OGONEK -0172 ; [.1EB5.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER U WITH OGONEK -016B ; [.1EB5.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH MACRON -016A ; [.1EB5.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH MACRON -1E7B ; [.1EB5.0020.0002][.0000.0032.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS -1E7A ; [.1EB5.0020.0008][.0000.0032.0002][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS -1DF0 ; [.1EB5.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE -1EE7 ; [.1EB5.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HOOK ABOVE -1EE6 ; [.1EB5.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HOOK ABOVE -0215 ; [.1EB5.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER U WITH DOUBLE GRAVE -0214 ; [.1EB5.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE -0217 ; [.1EB5.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER U WITH INVERTED BREVE -0216 ; [.1EB5.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER U WITH INVERTED BREVE -01B0 ; [.1EB5.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER U WITH HORN -01AF ; [.1EB5.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER U WITH HORN -1EE9 ; [.1EB5.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH HORN AND ACUTE -1EE8 ; [.1EB5.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE -1EEB ; [.1EB5.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH HORN AND GRAVE -1EEA ; [.1EB5.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE -1EEF ; [.1EB5.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH HORN AND TILDE -1EEE ; [.1EB5.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH HORN AND TILDE -1EED ; [.1EB5.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE -1EEC ; [.1EB5.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE -1EF1 ; [.1EB5.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW -1EF0 ; [.1EB5.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW -1EE5 ; [.1EB5.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH DOT BELOW -1EE4 ; [.1EB5.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH DOT BELOW -1E73 ; [.1EB5.0020.0002][.0000.0043.0002] # LATIN SMALL LETTER U WITH DIAERESIS BELOW -1E72 ; [.1EB5.0020.0008][.0000.0043.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW -1E77 ; [.1EB5.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW -1E76 ; [.1EB5.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW -1E75 ; [.1EB5.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER U WITH TILDE BELOW -1E74 ; [.1EB5.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER U WITH TILDE BELOW -1F1AB ; [.1EB5.0020.001D][.1D18.0020.001D][.1C8F.0020.001D] # SQUARED UHD -1F199 ; [.1EB5.0020.001D][.1E0C.0020.001D][*0260.0020.001C] # SQUARED UP WITH EXCLAMATION MARK -1D1C ; [.1EB9.0020.0002] # LATIN LETTER SMALL CAPITAL U -1DB8 ; [.1EB9.0020.0014] # MODIFIER LETTER SMALL CAPITAL U -AB4E ; [.1EBA.0020.0002] # LATIN SMALL LETTER U WITH SHORT RIGHT LEG -1D1D ; [.1EBB.0020.0002] # LATIN SMALL LETTER SIDEWAYS U -1D59 ; [.1EBB.0020.0014] # MODIFIER LETTER SMALL SIDEWAYS U -1D1E ; [.1EBC.0020.0002] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U -1D6B ; [.1EBD.0020.0002] # LATIN SMALL LETTER UE -AB50 ; [.1EBE.0020.0002] # LATIN SMALL LETTER UI -AB51 ; [.1EBF.0020.0002] # LATIN SMALL LETTER TURNED UI -0289 ; [.1EC0.0020.0002] # LATIN SMALL LETTER U BAR -0244 ; [.1EC0.0020.0008] # LATIN CAPITAL LETTER U BAR -1DB6 ; [.1EC0.0020.0014] # MODIFIER LETTER SMALL U BAR -AB4F ; [.1EC4.0020.0002] # LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG -1D7E ; [.1EC5.0020.0002] # LATIN SMALL CAPITAL LETTER U WITH STROKE -1D99 ; [.1EC6.0020.0002] # LATIN SMALL LETTER U WITH RETROFLEX HOOK -AB52 ; [.1EC7.0020.0002] # LATIN SMALL LETTER U WITH LEFT HOOK -AB5F ; [.1EC7.0020.0014] # MODIFIER LETTER SMALL U WITH LEFT HOOK -0265 ; [.1EC8.0020.0002] # LATIN SMALL LETTER TURNED H -A78D ; [.1EC8.0020.0008] # LATIN CAPITAL LETTER TURNED H -1DA3 ; [.1EC8.0020.0014] # MODIFIER LETTER SMALL TURNED H -02AE ; [.1ECC.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK -02AF ; [.1ED0.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -026F ; [.1ED4.0020.0002] # LATIN SMALL LETTER TURNED M -019C ; [.1ED4.0020.0008] # LATIN CAPITAL LETTER TURNED M -1D5A ; [.1ED4.0020.0014] # MODIFIER LETTER SMALL TURNED M -A7FA ; [.1ED8.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED M -1D1F ; [.1ED9.0020.0002] # LATIN SMALL LETTER SIDEWAYS TURNED M -0270 ; [.1EDA.0020.0002] # LATIN SMALL LETTER TURNED M WITH LONG LEG -1DAD ; [.1EDA.0020.0014] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG -028A ; [.1EDE.0020.0002] # LATIN SMALL LETTER UPSILON -01B1 ; [.1EDE.0020.0008] # LATIN CAPITAL LETTER UPSILON -1DB7 ; [.1EDE.0020.0014] # MODIFIER LETTER SMALL UPSILON -1D7F ; [.1EE2.0020.0002] # LATIN SMALL LETTER UPSILON WITH STROKE -0076 ; [.1EE3.0020.0002] # LATIN SMALL LETTER V -FF56 ; [.1EE3.0020.0003] # FULLWIDTH LATIN SMALL LETTER V -036E ; [.1EE3.0020.0004] # COMBINING LATIN SMALL LETTER V -2174 ; [.1EE3.0020.0004] # SMALL ROMAN NUMERAL FIVE -24B1 ; [*0317.0020.0004][.1EE3.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER V -1D42F ; [.1EE3.0020.0005] # MATHEMATICAL BOLD SMALL V -1D463 ; [.1EE3.0020.0005] # MATHEMATICAL ITALIC SMALL V -1D497 ; [.1EE3.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL V -1D4CB ; [.1EE3.0020.0005] # MATHEMATICAL SCRIPT SMALL V -1D4FF ; [.1EE3.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL V -1D533 ; [.1EE3.0020.0005] # MATHEMATICAL FRAKTUR SMALL V -1D567 ; [.1EE3.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL V -1D59B ; [.1EE3.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL V -1D5CF ; [.1EE3.0020.0005] # MATHEMATICAL SANS-SERIF SMALL V -1D603 ; [.1EE3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL V -1D637 ; [.1EE3.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL V -1D66B ; [.1EE3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V -1D69F ; [.1EE3.0020.0005] # MATHEMATICAL MONOSPACE SMALL V -24E5 ; [.1EE3.0020.0006] # CIRCLED LATIN SMALL LETTER V -0056 ; [.1EE3.0020.0008] # LATIN CAPITAL LETTER V -FF36 ; [.1EE3.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER V -2164 ; [.1EE3.0020.000A] # ROMAN NUMERAL FIVE -1F125 ; [*0317.0020.0004][.1EE3.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER V -1D415 ; [.1EE3.0020.000B] # MATHEMATICAL BOLD CAPITAL V -1D449 ; [.1EE3.0020.000B] # MATHEMATICAL ITALIC CAPITAL V -1D47D ; [.1EE3.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL V -1D4B1 ; [.1EE3.0020.000B] # MATHEMATICAL SCRIPT CAPITAL V -1D4E5 ; [.1EE3.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL V -1D519 ; [.1EE3.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL V -1D54D ; [.1EE3.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V -1D581 ; [.1EE3.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL V -1D5B5 ; [.1EE3.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL V -1D5E9 ; [.1EE3.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V -1D61D ; [.1EE3.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V -1D651 ; [.1EE3.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V -1D685 ; [.1EE3.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL V -24CB ; [.1EE3.0020.000C] # CIRCLED LATIN CAPITAL LETTER V -1F165 ; [.1EE3.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER V -1D5B ; [.1EE3.0020.0014] # MODIFIER LETTER SMALL V -1D65 ; [.1EE3.0020.0015] # LATIN SUBSCRIPT SMALL LETTER V -2C7D ; [.1EE3.0020.001D] # MODIFIER LETTER CAPITAL V -1F145 ; [.1EE3.0020.001D] # SQUARED LATIN CAPITAL LETTER V -1F185 ; [.1EE3.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER V -1E7D ; [.1EE3.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER V WITH TILDE -1E7C ; [.1EE3.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER V WITH TILDE -1E7F ; [.1EE3.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER V WITH DOT BELOW -1E7E ; [.1EE3.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER V WITH DOT BELOW -2175 ; [.1EE3.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL SIX -2165 ; [.1EE3.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL SIX -2176 ; [.1EE3.0020.0004][.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL SEVEN -2166 ; [.1EE3.0020.000A][.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL SEVEN -2177 ; [.1EE3.0020.0004][.1D32.0020.0004][.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL EIGHT -2167 ; [.1EE3.0020.000A][.1D32.0020.000A][.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL EIGHT -33DE ; [.1EE3.0020.001D][*0625.0020.001C][.1DAA.0020.001C] # SQUARE V OVER M -1F1AC ; [.1EE3.0020.001D][.1DDD.0020.001D][.1C8F.0020.001D] # SQUARED VOD -1F19A ; [.1EE3.0020.001D][.1E71.0020.001D] # SQUARED VS -A761 ; [.1EE3.0020.0004][.1F0B.0020.0004] # LATIN SMALL LETTER VY -A760 ; [.1EE3.0020.000A][.1F0B.0020.000A] # LATIN CAPITAL LETTER VY -1D20 ; [.1EE7.0020.0002] # LATIN LETTER SMALL CAPITAL V -A75F ; [.1EE8.0020.0002] # LATIN SMALL LETTER V WITH DIAGONAL STROKE -A75E ; [.1EE8.0020.0008] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE -1D8C ; [.1EE9.0020.0002] # LATIN SMALL LETTER V WITH PALATAL HOOK -028B ; [.1EEA.0020.0002] # LATIN SMALL LETTER V WITH HOOK -01B2 ; [.1EEA.0020.0008] # LATIN CAPITAL LETTER V WITH HOOK -1DB9 ; [.1EEA.0020.0014] # MODIFIER LETTER SMALL V WITH HOOK -2C71 ; [.1EEE.0020.0002] # LATIN SMALL LETTER V WITH RIGHT HOOK -2C74 ; [.1EEF.0020.0002] # LATIN SMALL LETTER V WITH CURL -1EFD ; [.1EF0.0020.0002] # LATIN SMALL LETTER MIDDLE-WELSH V -1EFC ; [.1EF0.0020.0008] # LATIN CAPITAL LETTER MIDDLE-WELSH V -028C ; [.1EF1.0020.0002] # LATIN SMALL LETTER TURNED V -0245 ; [.1EF1.0020.0008] # LATIN CAPITAL LETTER TURNED V -1DBA ; [.1EF1.0020.0014] # MODIFIER LETTER SMALL TURNED V -0077 ; [.1EF5.0020.0002] # LATIN SMALL LETTER W -FF57 ; [.1EF5.0020.0003] # FULLWIDTH LATIN SMALL LETTER W -1DF1 ; [.1EF5.0020.0004] # COMBINING LATIN SMALL LETTER W -24B2 ; [*0317.0020.0004][.1EF5.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER W -1D430 ; [.1EF5.0020.0005] # MATHEMATICAL BOLD SMALL W -1D464 ; [.1EF5.0020.0005] # MATHEMATICAL ITALIC SMALL W -1D498 ; [.1EF5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL W -1D4CC ; [.1EF5.0020.0005] # MATHEMATICAL SCRIPT SMALL W -1D500 ; [.1EF5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL W -1D534 ; [.1EF5.0020.0005] # MATHEMATICAL FRAKTUR SMALL W -1D568 ; [.1EF5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL W -1D59C ; [.1EF5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL W -1D5D0 ; [.1EF5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL W -1D604 ; [.1EF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL W -1D638 ; [.1EF5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL W -1D66C ; [.1EF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W -1D6A0 ; [.1EF5.0020.0005] # MATHEMATICAL MONOSPACE SMALL W -24E6 ; [.1EF5.0020.0006] # CIRCLED LATIN SMALL LETTER W -0057 ; [.1EF5.0020.0008] # LATIN CAPITAL LETTER W -FF37 ; [.1EF5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER W -1F126 ; [*0317.0020.0004][.1EF5.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER W -1D416 ; [.1EF5.0020.000B] # MATHEMATICAL BOLD CAPITAL W -1D44A ; [.1EF5.0020.000B] # MATHEMATICAL ITALIC CAPITAL W -1D47E ; [.1EF5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL W -1D4B2 ; [.1EF5.0020.000B] # MATHEMATICAL SCRIPT CAPITAL W -1D4E6 ; [.1EF5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL W -1D51A ; [.1EF5.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL W -1D54E ; [.1EF5.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W -1D582 ; [.1EF5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL W -1D5B6 ; [.1EF5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL W -1D5EA ; [.1EF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W -1D61E ; [.1EF5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W -1D652 ; [.1EF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W -1D686 ; [.1EF5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL W -24CC ; [.1EF5.0020.000C] # CIRCLED LATIN CAPITAL LETTER W -1F166 ; [.1EF5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER W -02B7 ; [.1EF5.0020.0014] # MODIFIER LETTER SMALL W -1D42 ; [.1EF5.0020.001D] # MODIFIER LETTER CAPITAL W -1F146 ; [.1EF5.0020.001D] # SQUARED LATIN CAPITAL LETTER W -1F186 ; [.1EF5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER W -1E83 ; [.1EF5.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER W WITH ACUTE -1E82 ; [.1EF5.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER W WITH ACUTE -1E81 ; [.1EF5.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER W WITH GRAVE -1E80 ; [.1EF5.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER W WITH GRAVE -0175 ; [.1EF5.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER W WITH CIRCUMFLEX -0174 ; [.1EF5.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX -1E98 ; [.1EF5.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER W WITH RING ABOVE -1E85 ; [.1EF5.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER W WITH DIAERESIS -1E84 ; [.1EF5.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER W WITH DIAERESIS -1E87 ; [.1EF5.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER W WITH DOT ABOVE -1E86 ; [.1EF5.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER W WITH DOT ABOVE -1E89 ; [.1EF5.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER W WITH DOT BELOW -1E88 ; [.1EF5.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER W WITH DOT BELOW -33DD ; [.1EF5.0020.001D][.1C60.0020.001C] # SQUARE WB -1F14F ; [.1EF5.0020.001D][.1C7A.0020.001D] # SQUARED WC -1F18F ; [.1EF5.0020.001D][.1C7A.0020.001D] # NEGATIVE SQUARED WC -1F12E ; [.1EF5.0020.000C][.1F21.0020.000C] # CIRCLED WZ -1D21 ; [.1EF9.0020.0002] # LATIN LETTER SMALL CAPITAL W -2C73 ; [.1EFA.0020.0002] # LATIN SMALL LETTER W WITH HOOK -2C72 ; [.1EFA.0020.0008] # LATIN CAPITAL LETTER W WITH HOOK -028D ; [.1EFB.0020.0002] # LATIN SMALL LETTER TURNED W -0078 ; [.1EFF.0020.0002] # LATIN SMALL LETTER X -FF58 ; [.1EFF.0020.0003] # FULLWIDTH LATIN SMALL LETTER X -036F ; [.1EFF.0020.0004] # COMBINING LATIN SMALL LETTER X -2179 ; [.1EFF.0020.0004] # SMALL ROMAN NUMERAL TEN -24B3 ; [*0317.0020.0004][.1EFF.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER X -1D431 ; [.1EFF.0020.0005] # MATHEMATICAL BOLD SMALL X -1D465 ; [.1EFF.0020.0005] # MATHEMATICAL ITALIC SMALL X -1D499 ; [.1EFF.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL X -1D4CD ; [.1EFF.0020.0005] # MATHEMATICAL SCRIPT SMALL X -1D501 ; [.1EFF.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL X -1D535 ; [.1EFF.0020.0005] # MATHEMATICAL FRAKTUR SMALL X -1D569 ; [.1EFF.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL X -1D59D ; [.1EFF.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL X -1D5D1 ; [.1EFF.0020.0005] # MATHEMATICAL SANS-SERIF SMALL X -1D605 ; [.1EFF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL X -1D639 ; [.1EFF.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL X -1D66D ; [.1EFF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X -1D6A1 ; [.1EFF.0020.0005] # MATHEMATICAL MONOSPACE SMALL X -24E7 ; [.1EFF.0020.0006] # CIRCLED LATIN SMALL LETTER X -0058 ; [.1EFF.0020.0008] # LATIN CAPITAL LETTER X -FF38 ; [.1EFF.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER X -2169 ; [.1EFF.0020.000A] # ROMAN NUMERAL TEN -1F127 ; [*0317.0020.0004][.1EFF.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER X -1D417 ; [.1EFF.0020.000B] # MATHEMATICAL BOLD CAPITAL X -1D44B ; [.1EFF.0020.000B] # MATHEMATICAL ITALIC CAPITAL X -1D47F ; [.1EFF.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL X -1D4B3 ; [.1EFF.0020.000B] # MATHEMATICAL SCRIPT CAPITAL X -1D4E7 ; [.1EFF.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL X -1D51B ; [.1EFF.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL X -1D54F ; [.1EFF.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X -1D583 ; [.1EFF.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL X -1D5B7 ; [.1EFF.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL X -1D5EB ; [.1EFF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X -1D61F ; [.1EFF.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X -1D653 ; [.1EFF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X -1D687 ; [.1EFF.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL X -24CD ; [.1EFF.0020.000C] # CIRCLED LATIN CAPITAL LETTER X -1F167 ; [.1EFF.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER X -02E3 ; [.1EFF.0020.0014] # MODIFIER LETTER SMALL X -2093 ; [.1EFF.0020.0015] # LATIN SUBSCRIPT SMALL LETTER X -1F147 ; [.1EFF.0020.001D] # SQUARED LATIN CAPITAL LETTER X -1F187 ; [.1EFF.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER X -1E8D ; [.1EFF.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER X WITH DIAERESIS -1E8C ; [.1EFF.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER X WITH DIAERESIS -1E8B ; [.1EFF.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER X WITH DOT ABOVE -1E8A ; [.1EFF.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER X WITH DOT ABOVE -217A ; [.1EFF.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL ELEVEN -216A ; [.1EFF.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL ELEVEN -217B ; [.1EFF.0020.0004][.1D32.0020.0004][.1D32.0020.0004] # SMALL ROMAN NUMERAL TWELVE -216B ; [.1EFF.0020.000A][.1D32.0020.000A][.1D32.0020.000A] # ROMAN NUMERAL TWELVE -1D8D ; [.1F03.0020.0002] # LATIN SMALL LETTER X WITH PALATAL HOOK -AB56 ; [.1F04.0020.0002] # LATIN SMALL LETTER X WITH LOW RIGHT RING -AB57 ; [.1F05.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG -AB58 ; [.1F06.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING -AB59 ; [.1F07.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF -AB53 ; [.1F08.0020.0002] # LATIN SMALL LETTER CHI -A7B3 ; [.1F08.0020.0008] # LATIN CAPITAL LETTER CHI -AB54 ; [.1F09.0020.0002] # LATIN SMALL LETTER CHI WITH LOW RIGHT RING -AB55 ; [.1F0A.0020.0002] # LATIN SMALL LETTER CHI WITH LOW LEFT SERIF -0079 ; [.1F0B.0020.0002] # LATIN SMALL LETTER Y -FF59 ; [.1F0B.0020.0003] # FULLWIDTH LATIN SMALL LETTER Y -24B4 ; [*0317.0020.0004][.1F0B.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Y -1D432 ; [.1F0B.0020.0005] # MATHEMATICAL BOLD SMALL Y -1D466 ; [.1F0B.0020.0005] # MATHEMATICAL ITALIC SMALL Y -1D49A ; [.1F0B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Y -1D4CE ; [.1F0B.0020.0005] # MATHEMATICAL SCRIPT SMALL Y -1D502 ; [.1F0B.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Y -1D536 ; [.1F0B.0020.0005] # MATHEMATICAL FRAKTUR SMALL Y -1D56A ; [.1F0B.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Y -1D59E ; [.1F0B.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Y -1D5D2 ; [.1F0B.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Y -1D606 ; [.1F0B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Y -1D63A ; [.1F0B.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y -1D66E ; [.1F0B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y -1D6A2 ; [.1F0B.0020.0005] # MATHEMATICAL MONOSPACE SMALL Y -24E8 ; [.1F0B.0020.0006] # CIRCLED LATIN SMALL LETTER Y -0059 ; [.1F0B.0020.0008] # LATIN CAPITAL LETTER Y -FF39 ; [.1F0B.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Y -1F128 ; [*0317.0020.0004][.1F0B.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Y -1D418 ; [.1F0B.0020.000B] # MATHEMATICAL BOLD CAPITAL Y -1D44C ; [.1F0B.0020.000B] # MATHEMATICAL ITALIC CAPITAL Y -1D480 ; [.1F0B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Y -1D4B4 ; [.1F0B.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Y -1D4E8 ; [.1F0B.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Y -1D51C ; [.1F0B.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Y -1D550 ; [.1F0B.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D584 ; [.1F0B.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y -1D5B8 ; [.1F0B.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Y -1D5EC ; [.1F0B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y -1D620 ; [.1F0B.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y -1D654 ; [.1F0B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y -1D688 ; [.1F0B.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Y -24CE ; [.1F0B.0020.000C] # CIRCLED LATIN CAPITAL LETTER Y -1F168 ; [.1F0B.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Y -02B8 ; [.1F0B.0020.0014] # MODIFIER LETTER SMALL Y -1F148 ; [.1F0B.0020.001D] # SQUARED LATIN CAPITAL LETTER Y -1F188 ; [.1F0B.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Y -00FD ; [.1F0B.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Y WITH ACUTE -00DD ; [.1F0B.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Y WITH ACUTE -1EF3 ; [.1F0B.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER Y WITH GRAVE -1EF2 ; [.1F0B.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER Y WITH GRAVE -0177 ; [.1F0B.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Y WITH CIRCUMFLEX -0176 ; [.1F0B.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX -1E99 ; [.1F0B.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER Y WITH RING ABOVE -00FF ; [.1F0B.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER Y WITH DIAERESIS -0178 ; [.1F0B.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER Y WITH DIAERESIS -1EF9 ; [.1F0B.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER Y WITH TILDE -1EF8 ; [.1F0B.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER Y WITH TILDE -1E8F ; [.1F0B.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Y WITH DOT ABOVE -1E8E ; [.1F0B.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Y WITH DOT ABOVE -0233 ; [.1F0B.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER Y WITH MACRON -0232 ; [.1F0B.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER Y WITH MACRON -1EF7 ; [.1F0B.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER Y WITH HOOK ABOVE -1EF6 ; [.1F0B.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE -1EF5 ; [.1F0B.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Y WITH DOT BELOW -1EF4 ; [.1F0B.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Y WITH DOT BELOW -028F ; [.1F0F.0020.0002] # LATIN LETTER SMALL CAPITAL Y -024F ; [.1F13.0020.0002] # LATIN SMALL LETTER Y WITH STROKE -024E ; [.1F13.0020.0008] # LATIN CAPITAL LETTER Y WITH STROKE -01B4 ; [.1F17.0020.0002] # LATIN SMALL LETTER Y WITH HOOK -01B3 ; [.1F17.0020.0008] # LATIN CAPITAL LETTER Y WITH HOOK -1EFF ; [.1F1B.0020.0002] # LATIN SMALL LETTER Y WITH LOOP -1EFE ; [.1F1B.0020.0008] # LATIN CAPITAL LETTER Y WITH LOOP -AB5A ; [.1F1C.0020.0002] # LATIN SMALL LETTER Y WITH SHORT RIGHT LEG -021D ; [.1F1D.0020.0002] # LATIN SMALL LETTER YOGH -021C ; [.1F1D.0020.0008] # LATIN CAPITAL LETTER YOGH -007A ; [.1F21.0020.0002] # LATIN SMALL LETTER Z -FF5A ; [.1F21.0020.0003] # FULLWIDTH LATIN SMALL LETTER Z -1DE6 ; [.1F21.0020.0004] # COMBINING LATIN SMALL LETTER Z -24B5 ; [*0317.0020.0004][.1F21.0020.0004][*0318.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Z -1D433 ; [.1F21.0020.0005] # MATHEMATICAL BOLD SMALL Z -1D467 ; [.1F21.0020.0005] # MATHEMATICAL ITALIC SMALL Z -1D49B ; [.1F21.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Z -1D4CF ; [.1F21.0020.0005] # MATHEMATICAL SCRIPT SMALL Z -1D503 ; [.1F21.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Z -1D537 ; [.1F21.0020.0005] # MATHEMATICAL FRAKTUR SMALL Z -1D56B ; [.1F21.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Z -1D59F ; [.1F21.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Z -1D5D3 ; [.1F21.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Z -1D607 ; [.1F21.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Z -1D63B ; [.1F21.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z -1D66F ; [.1F21.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z -1D6A3 ; [.1F21.0020.0005] # MATHEMATICAL MONOSPACE SMALL Z -24E9 ; [.1F21.0020.0006] # CIRCLED LATIN SMALL LETTER Z -005A ; [.1F21.0020.0008] # LATIN CAPITAL LETTER Z -FF3A ; [.1F21.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Z -1F129 ; [*0317.0020.0004][.1F21.0020.000A][*0318.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Z -2124 ; [.1F21.0020.000B] # DOUBLE-STRUCK CAPITAL Z -2128 ; [.1F21.0020.000B] # BLACK-LETTER CAPITAL Z -1D419 ; [.1F21.0020.000B] # MATHEMATICAL BOLD CAPITAL Z -1D44D ; [.1F21.0020.000B] # MATHEMATICAL ITALIC CAPITAL Z -1D481 ; [.1F21.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Z -1D4B5 ; [.1F21.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Z -1D4E9 ; [.1F21.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Z -1D585 ; [.1F21.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z -1D5B9 ; [.1F21.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Z -1D5ED ; [.1F21.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z -1D621 ; [.1F21.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z -1D655 ; [.1F21.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z -1D689 ; [.1F21.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Z -24CF ; [.1F21.0020.000C] # CIRCLED LATIN CAPITAL LETTER Z -1F169 ; [.1F21.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Z -1DBB ; [.1F21.0020.0014] # MODIFIER LETTER SMALL Z -1F149 ; [.1F21.0020.001D] # SQUARED LATIN CAPITAL LETTER Z -1F189 ; [.1F21.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Z -017A ; [.1F21.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Z WITH ACUTE -0179 ; [.1F21.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Z WITH ACUTE -1E91 ; [.1F21.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Z WITH CIRCUMFLEX -1E90 ; [.1F21.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX -017E ; [.1F21.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER Z WITH CARON -017D ; [.1F21.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER Z WITH CARON -017C ; [.1F21.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Z WITH DOT ABOVE -017B ; [.1F21.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Z WITH DOT ABOVE -1E93 ; [.1F21.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Z WITH DOT BELOW -1E92 ; [.1F21.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Z WITH DOT BELOW -1E95 ; [.1F21.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER Z WITH LINE BELOW -1E94 ; [.1F21.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER Z WITH LINE BELOW -018D ; [.1F21.0020.0004][.1EF5.0020.0004] # LATIN SMALL LETTER TURNED DELTA -1D22 ; [.1F25.0020.0002] # LATIN LETTER SMALL CAPITAL Z -01B6 ; [.1F26.0020.0002] # LATIN SMALL LETTER Z WITH STROKE -01B5 ; [.1F26.0020.0008] # LATIN CAPITAL LETTER Z WITH STROKE -1D76 ; [.1F2A.0020.0002] # LATIN SMALL LETTER Z WITH MIDDLE TILDE -1D8E ; [.1F2B.0020.0002] # LATIN SMALL LETTER Z WITH PALATAL HOOK -0225 ; [.1F2C.0020.0002] # LATIN SMALL LETTER Z WITH HOOK -0224 ; [.1F2C.0020.0008] # LATIN CAPITAL LETTER Z WITH HOOK -0290 ; [.1F30.0020.0002] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK -1DBC ; [.1F30.0020.0014] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK -0291 ; [.1F34.0020.0002] # LATIN SMALL LETTER Z WITH CURL -1DBD ; [.1F34.0020.0014] # MODIFIER LETTER SMALL Z WITH CURL -0240 ; [.1F38.0020.0002] # LATIN SMALL LETTER Z WITH SWASH TAIL -2C7F ; [.1F38.0020.0008] # LATIN CAPITAL LETTER Z WITH SWASH TAIL -2C6C ; [.1F3C.0020.0002] # LATIN SMALL LETTER Z WITH DESCENDER -2C6B ; [.1F3C.0020.0008] # LATIN CAPITAL LETTER Z WITH DESCENDER -A763 ; [.1F3D.0020.0002] # LATIN SMALL LETTER VISIGOTHIC Z -A762 ; [.1F3D.0020.0008] # LATIN CAPITAL LETTER VISIGOTHIC Z -0292 ; [.1F3E.0020.0002] # LATIN SMALL LETTER EZH -01B7 ; [.1F3E.0020.0008] # LATIN CAPITAL LETTER EZH -1DBE ; [.1F3E.0020.0014] # MODIFIER LETTER SMALL EZH -01EF ; [.1F3E.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER EZH WITH CARON -01EE ; [.1F3E.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER EZH WITH CARON -1D23 ; [.1F42.0020.0002] # LATIN LETTER SMALL CAPITAL EZH -01B9 ; [.1F43.0020.0002] # LATIN SMALL LETTER EZH REVERSED -01B8 ; [.1F43.0020.0008] # LATIN CAPITAL LETTER EZH REVERSED -1D9A ; [.1F47.0020.0002] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK -01BA ; [.1F48.0020.0002] # LATIN SMALL LETTER EZH WITH TAIL -0293 ; [.1F4C.0020.0002] # LATIN SMALL LETTER EZH WITH CURL -00FE ; [.1F50.0020.0002] # LATIN SMALL LETTER THORN -00DE ; [.1F50.0020.0008] # LATIN CAPITAL LETTER THORN -A765 ; [.1F54.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE -A764 ; [.1F54.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE -A767 ; [.1F55.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER -A766 ; [.1F55.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER -01BF ; [.1F56.0020.0002] # LATIN LETTER WYNN -01F7 ; [.1F56.0020.0008] # LATIN CAPITAL LETTER WYNN -A769 ; [.1F5A.0020.0002] # LATIN SMALL LETTER VEND -A768 ; [.1F5A.0020.0008] # LATIN CAPITAL LETTER VEND -AB60 ; [.1F5B.0020.0002] # LATIN SMALL LETTER SAKHA YAT -AB61 ; [.1F5C.0020.0002] # LATIN SMALL LETTER IOTIFIED E -AB63 ; [.1F5D.0020.0002] # LATIN SMALL LETTER UO -A76B ; [.1F5E.0020.0002] # LATIN SMALL LETTER ET -A76A ; [.1F5E.0020.0008] # LATIN CAPITAL LETTER ET -A76D ; [.1F5F.0020.0002] # LATIN SMALL LETTER IS -A76C ; [.1F5F.0020.0008] # LATIN CAPITAL LETTER IS -A76F ; [.1F60.0020.0002] # LATIN SMALL LETTER CON -1DD2 ; [.1F60.0020.0004] # COMBINING US ABOVE -A76E ; [.1F60.0020.0008] # LATIN CAPITAL LETTER CON -A770 ; [.1F60.0020.0014] # MODIFIER LETTER US -A778 ; [.1F61.0020.0002] # LATIN SMALL LETTER UM -01BB ; [.1F62.0020.0002] # LATIN LETTER TWO WITH STROKE -A72B ; [.1F66.0020.0002] # LATIN SMALL LETTER TRESILLO -A72A ; [.1F66.0020.0008] # LATIN CAPITAL LETTER TRESILLO -A72D ; [.1F67.0020.0002] # LATIN SMALL LETTER CUATRILLO -A72C ; [.1F67.0020.0008] # LATIN CAPITAL LETTER CUATRILLO -A72F ; [.1F68.0020.0002] # LATIN SMALL LETTER CUATRILLO WITH COMMA -A72E ; [.1F68.0020.0008] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA -01A8 ; [.1F69.0020.0002] # LATIN SMALL LETTER TONE TWO -01A7 ; [.1F69.0020.0008] # LATIN CAPITAL LETTER TONE TWO -01BD ; [.1F6D.0020.0002] # LATIN SMALL LETTER TONE FIVE -01BC ; [.1F6D.0020.0008] # LATIN CAPITAL LETTER TONE FIVE -0185 ; [.1F71.0020.0002] # LATIN SMALL LETTER TONE SIX -0184 ; [.1F71.0020.0008] # LATIN CAPITAL LETTER TONE SIX -0294 ; [.1F75.0020.0002] # LATIN LETTER GLOTTAL STOP -0242 ; [.1F79.0020.0002] # LATIN SMALL LETTER GLOTTAL STOP -0241 ; [.1F79.0020.0008] # LATIN CAPITAL LETTER GLOTTAL STOP -02C0 ; [.1F7D.0020.0002] # MODIFIER LETTER GLOTTAL STOP -02BC ; [.1F7E.0020.0002] # MODIFIER LETTER APOSTROPHE -0149 ; [.1F7E.0020.0004][.1DB9.0020.0004] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -02EE ; [.1F7F.0020.0002] # MODIFIER LETTER DOUBLE APOSTROPHE -02BE ; [.1F80.0020.0002] # MODIFIER LETTER RIGHT HALF RING -A723 ; [.1F81.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF -A722 ; [.1F81.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF -A78C ; [.1F82.0020.0002] # LATIN SMALL LETTER SALTILLO -A78B ; [.1F82.0020.0008] # LATIN CAPITAL LETTER SALTILLO -A78F ; [.1F83.0020.0002] # LATIN LETTER SINOLOGICAL DOT -0295 ; [.1F84.0020.0002] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE -02E4 ; [.1F84.0020.0014] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02BF ; [.1F88.0020.0002] # MODIFIER LETTER LEFT HALF RING -02C1 ; [.1F89.0020.0002] # MODIFIER LETTER REVERSED GLOTTAL STOP -1D24 ; [.1F8A.0020.0002] # LATIN LETTER VOICED LARYNGEAL SPIRANT -1D25 ; [.1F8B.0020.0002] # LATIN LETTER AIN -1D5C ; [.1F8B.0020.0014] # MODIFIER LETTER SMALL AIN -A725 ; [.1F8C.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL AIN -A724 ; [.1F8C.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN -02A1 ; [.1F8D.0020.0002] # LATIN LETTER GLOTTAL STOP WITH STROKE -02A2 ; [.1F91.0020.0002] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE -0296 ; [.1F95.0020.0002] # LATIN LETTER INVERTED GLOTTAL STOP -01C0 ; [.1F99.0020.0002] # LATIN LETTER DENTAL CLICK -01C1 ; [.1F9D.0020.0002] # LATIN LETTER LATERAL CLICK -01C2 ; [.1FA1.0020.0002] # LATIN LETTER ALVEOLAR CLICK -01C3 ; [.1FA5.0020.0002] # LATIN LETTER RETROFLEX CLICK -0297 ; [.1FA9.0020.0002] # LATIN LETTER STRETCHED C -0298 ; [.1FAD.0020.0002] # LATIN LETTER BILABIAL CLICK -02AC ; [.1FB1.0020.0002] # LATIN LETTER BILABIAL PERCUSSIVE -02AD ; [.1FB5.0020.0002] # LATIN LETTER BIDENTAL PERCUSSIVE -03B1 ; [.1FB9.0020.0002] # GREEK SMALL LETTER ALPHA -1D6C2 ; [.1FB9.0020.0005] # MATHEMATICAL BOLD SMALL ALPHA -1D6FC ; [.1FB9.0020.0005] # MATHEMATICAL ITALIC SMALL ALPHA -1D736 ; [.1FB9.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ALPHA -1D770 ; [.1FB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA -1D7AA ; [.1FB9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA -0391 ; [.1FB9.0020.0008] # GREEK CAPITAL LETTER ALPHA -1D6A8 ; [.1FB9.0020.000B] # MATHEMATICAL BOLD CAPITAL ALPHA -1D6E2 ; [.1FB9.0020.000B] # MATHEMATICAL ITALIC CAPITAL ALPHA -1D71C ; [.1FB9.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA -1D756 ; [.1FB9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA -1D790 ; [.1FB9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA -1F00 ; [.1FB9.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ALPHA WITH PSILI -1F08 ; [.1FB9.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI -1F04 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA -1F0C ; [.1FB9.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA -1F84 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1F8C ; [.1FB9.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1F02 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA -1F0A ; [.1FB9.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA -1F82 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1F8A ; [.1FB9.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1F06 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI -1F0E ; [.1FB9.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI -1F86 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1F8E ; [.1FB9.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1F80 ; [.1FB9.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI -1F88 ; [.1FB9.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI -1F01 ; [.1FB9.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ALPHA WITH DASIA -1F09 ; [.1FB9.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA -1F05 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA -1F0D ; [.1FB9.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA -1F85 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1F8D ; [.1FB9.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1F03 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA -1F0B ; [.1FB9.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA -1F83 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1F8B ; [.1FB9.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1F07 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F0F ; [.1FB9.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F87 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1F8F ; [.1FB9.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1F81 ; [.1FB9.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI -1F89 ; [.1FB9.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI -03AC ; [.1FB9.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH TONOS -1F71 ; [.1FB9.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH OXIA -0386 ; [.1FB9.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH TONOS -1FBB ; [.1FB9.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH OXIA -1FB4 ; [.1FB9.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1F70 ; [.1FB9.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH VARIA -1FBA ; [.1FB9.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH VARIA -1FB2 ; [.1FB9.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI -1FB0 ; [.1FB9.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER ALPHA WITH VRACHY -1FB8 ; [.1FB9.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER ALPHA WITH VRACHY -1FB6 ; [.1FB9.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI -1FB7 ; [.1FB9.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI -1FB1 ; [.1FB9.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER ALPHA WITH MACRON -1FB9 ; [.1FB9.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER ALPHA WITH MACRON -1FB3 ; [.1FB9.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI -1FBC ; [.1FB9.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -03B2 ; [.1FBA.0020.0002] # GREEK SMALL LETTER BETA -03D0 ; [.1FBA.0020.0004] # GREEK BETA SYMBOL -1D6C3 ; [.1FBA.0020.0005] # MATHEMATICAL BOLD SMALL BETA -1D6FD ; [.1FBA.0020.0005] # MATHEMATICAL ITALIC SMALL BETA -1D737 ; [.1FBA.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL BETA -1D771 ; [.1FBA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA -1D7AB ; [.1FBA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA -0392 ; [.1FBA.0020.0008] # GREEK CAPITAL LETTER BETA -1D6A9 ; [.1FBA.0020.000B] # MATHEMATICAL BOLD CAPITAL BETA -1D6E3 ; [.1FBA.0020.000B] # MATHEMATICAL ITALIC CAPITAL BETA -1D71D ; [.1FBA.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL BETA -1D757 ; [.1FBA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA -1D791 ; [.1FBA.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA -1D5D ; [.1FBA.0020.0014] # MODIFIER LETTER SMALL BETA -1D66 ; [.1FBA.0020.0015] # GREEK SUBSCRIPT SMALL LETTER BETA -03B3 ; [.1FBB.0020.0002] # GREEK SMALL LETTER GAMMA -213D ; [.1FBB.0020.0005] # DOUBLE-STRUCK SMALL GAMMA -1D6C4 ; [.1FBB.0020.0005] # MATHEMATICAL BOLD SMALL GAMMA -1D6FE ; [.1FBB.0020.0005] # MATHEMATICAL ITALIC SMALL GAMMA -1D738 ; [.1FBB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL GAMMA -1D772 ; [.1FBB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA -1D7AC ; [.1FBB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA -0393 ; [.1FBB.0020.0008] # GREEK CAPITAL LETTER GAMMA -213E ; [.1FBB.0020.000B] # DOUBLE-STRUCK CAPITAL GAMMA -1D6AA ; [.1FBB.0020.000B] # MATHEMATICAL BOLD CAPITAL GAMMA -1D6E4 ; [.1FBB.0020.000B] # MATHEMATICAL ITALIC CAPITAL GAMMA -1D71E ; [.1FBB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA -1D758 ; [.1FBB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA -1D792 ; [.1FBB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA -1D5E ; [.1FBB.0020.0014] # MODIFIER LETTER SMALL GREEK GAMMA -1D67 ; [.1FBB.0020.0015] # GREEK SUBSCRIPT SMALL LETTER GAMMA -1D26 ; [.1FBC.0020.0002] # GREEK LETTER SMALL CAPITAL GAMMA -03B4 ; [.1FBD.0020.0002] # GREEK SMALL LETTER DELTA -1D6C5 ; [.1FBD.0020.0005] # MATHEMATICAL BOLD SMALL DELTA -1D6FF ; [.1FBD.0020.0005] # MATHEMATICAL ITALIC SMALL DELTA -1D739 ; [.1FBD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL DELTA -1D773 ; [.1FBD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA -1D7AD ; [.1FBD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA -0394 ; [.1FBD.0020.0008] # GREEK CAPITAL LETTER DELTA -1D6AB ; [.1FBD.0020.000B] # MATHEMATICAL BOLD CAPITAL DELTA -1D6E5 ; [.1FBD.0020.000B] # MATHEMATICAL ITALIC CAPITAL DELTA -1D71F ; [.1FBD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA -1D759 ; [.1FBD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA -1D793 ; [.1FBD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA -1D5F ; [.1FBD.0020.0014] # MODIFIER LETTER SMALL DELTA -03B5 ; [.1FBE.0020.0002] # GREEK SMALL LETTER EPSILON -03F5 ; [.1FBE.0020.0004] # GREEK LUNATE EPSILON SYMBOL -1D6C6 ; [.1FBE.0020.0005] # MATHEMATICAL BOLD SMALL EPSILON -1D6DC ; [.1FBE.0020.0005] # MATHEMATICAL BOLD EPSILON SYMBOL -1D700 ; [.1FBE.0020.0005] # MATHEMATICAL ITALIC SMALL EPSILON -1D716 ; [.1FBE.0020.0005] # MATHEMATICAL ITALIC EPSILON SYMBOL -1D73A ; [.1FBE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL EPSILON -1D750 ; [.1FBE.0020.0005] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL -1D774 ; [.1FBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON -1D78A ; [.1FBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL -1D7AE ; [.1FBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON -1D7C4 ; [.1FBE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL -0395 ; [.1FBE.0020.0008] # GREEK CAPITAL LETTER EPSILON -1D6AC ; [.1FBE.0020.000B] # MATHEMATICAL BOLD CAPITAL EPSILON -1D6E6 ; [.1FBE.0020.000B] # MATHEMATICAL ITALIC CAPITAL EPSILON -1D720 ; [.1FBE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON -1D75A ; [.1FBE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON -1D794 ; [.1FBE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON -1F10 ; [.1FBE.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER EPSILON WITH PSILI -1F18 ; [.1FBE.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI -1F14 ; [.1FBE.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA -1F1C ; [.1FBE.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA -1F12 ; [.1FBE.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA -1F1A ; [.1FBE.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA -1F11 ; [.1FBE.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER EPSILON WITH DASIA -1F19 ; [.1FBE.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA -1F15 ; [.1FBE.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F1D ; [.1FBE.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F13 ; [.1FBE.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA -1F1B ; [.1FBE.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA -03AD ; [.1FBE.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH TONOS -1F73 ; [.1FBE.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH OXIA -0388 ; [.1FBE.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH TONOS -1FC9 ; [.1FBE.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH OXIA -1F72 ; [.1FBE.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH VARIA -1FC8 ; [.1FBE.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH VARIA -03DD ; [.1FBF.0020.0002] # GREEK SMALL LETTER DIGAMMA -1D7CB ; [.1FBF.0020.0005] # MATHEMATICAL BOLD SMALL DIGAMMA -03DC ; [.1FBF.0020.0008] # GREEK LETTER DIGAMMA -1D7CA ; [.1FBF.0020.000B] # MATHEMATICAL BOLD CAPITAL DIGAMMA -0377 ; [.1FC0.0020.0002] # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA -0376 ; [.1FC0.0020.0008] # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA -03DB ; [.1FC1.0020.0002] # GREEK SMALL LETTER STIGMA -03DA ; [.1FC1.0020.0008] # GREEK LETTER STIGMA -03B6 ; [.1FC2.0020.0002] # GREEK SMALL LETTER ZETA -1D6C7 ; [.1FC2.0020.0005] # MATHEMATICAL BOLD SMALL ZETA -1D701 ; [.1FC2.0020.0005] # MATHEMATICAL ITALIC SMALL ZETA -1D73B ; [.1FC2.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ZETA -1D775 ; [.1FC2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA -1D7AF ; [.1FC2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA -0396 ; [.1FC2.0020.0008] # GREEK CAPITAL LETTER ZETA -1D6AD ; [.1FC2.0020.000B] # MATHEMATICAL BOLD CAPITAL ZETA -1D6E7 ; [.1FC2.0020.000B] # MATHEMATICAL ITALIC CAPITAL ZETA -1D721 ; [.1FC2.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA -1D75B ; [.1FC2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA -1D795 ; [.1FC2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA -0371 ; [.1FC3.0020.0002] # GREEK SMALL LETTER HETA -0370 ; [.1FC3.0020.0008] # GREEK CAPITAL LETTER HETA -03B7 ; [.1FC4.0020.0002] # GREEK SMALL LETTER ETA -1D6C8 ; [.1FC4.0020.0005] # MATHEMATICAL BOLD SMALL ETA -1D702 ; [.1FC4.0020.0005] # MATHEMATICAL ITALIC SMALL ETA -1D73C ; [.1FC4.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ETA -1D776 ; [.1FC4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA -1D7B0 ; [.1FC4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA -0397 ; [.1FC4.0020.0008] # GREEK CAPITAL LETTER ETA -1D6AE ; [.1FC4.0020.000B] # MATHEMATICAL BOLD CAPITAL ETA -1D6E8 ; [.1FC4.0020.000B] # MATHEMATICAL ITALIC CAPITAL ETA -1D722 ; [.1FC4.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ETA -1D75C ; [.1FC4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA -1D796 ; [.1FC4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA -1F20 ; [.1FC4.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ETA WITH PSILI -1F28 ; [.1FC4.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ETA WITH PSILI -1F24 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA -1F2C ; [.1FC4.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA -1F94 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1F9C ; [.1FC4.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1F22 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA -1F2A ; [.1FC4.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA -1F92 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1F9A ; [.1FC4.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1F26 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI -1F2E ; [.1FC4.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI -1F96 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1F9E ; [.1FC4.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1F90 ; [.1FC4.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI -1F98 ; [.1FC4.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI -1F21 ; [.1FC4.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ETA WITH DASIA -1F29 ; [.1FC4.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ETA WITH DASIA -1F25 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA -1F2D ; [.1FC4.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA -1F95 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1F9D ; [.1FC4.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1F23 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA -1F2B ; [.1FC4.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA -1F93 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1F9B ; [.1FC4.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1F27 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI -1F2F ; [.1FC4.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI -1F97 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1F9F ; [.1FC4.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1F91 ; [.1FC4.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI -1F99 ; [.1FC4.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI -03AE ; [.1FC4.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH TONOS -1F75 ; [.1FC4.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH OXIA -0389 ; [.1FC4.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH TONOS -1FCB ; [.1FC4.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH OXIA -1FC4 ; [.1FC4.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1F74 ; [.1FC4.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH VARIA -1FCA ; [.1FC4.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH VARIA -1FC2 ; [.1FC4.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI -1FC6 ; [.1FC4.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI -1FC7 ; [.1FC4.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI -1FC3 ; [.1FC4.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI -1FCC ; [.1FC4.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -03B8 ; [.1FC5.0020.0002] # GREEK SMALL LETTER THETA -03D1 ; [.1FC5.0020.0004] # GREEK THETA SYMBOL -1D6C9 ; [.1FC5.0020.0005] # MATHEMATICAL BOLD SMALL THETA -1D6DD ; [.1FC5.0020.0005] # MATHEMATICAL BOLD THETA SYMBOL -1D703 ; [.1FC5.0020.0005] # MATHEMATICAL ITALIC SMALL THETA -1D717 ; [.1FC5.0020.0005] # MATHEMATICAL ITALIC THETA SYMBOL -1D73D ; [.1FC5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL THETA -1D751 ; [.1FC5.0020.0005] # MATHEMATICAL BOLD ITALIC THETA SYMBOL -1D777 ; [.1FC5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA -1D78B ; [.1FC5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL -1D7B1 ; [.1FC5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA -1D7C5 ; [.1FC5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL -0398 ; [.1FC5.0020.0008] # GREEK CAPITAL LETTER THETA -03F4 ; [.1FC5.0020.000A] # GREEK CAPITAL THETA SYMBOL -1D6AF ; [.1FC5.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA -1D6B9 ; [.1FC5.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL -1D6E9 ; [.1FC5.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA -1D6F3 ; [.1FC5.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL -1D723 ; [.1FC5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA -1D72D ; [.1FC5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL -1D75D ; [.1FC5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA -1D767 ; [.1FC5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL -1D797 ; [.1FC5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA -1D7A1 ; [.1FC5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL -1DBF ; [.1FC5.0020.0014] # MODIFIER LETTER SMALL THETA -03B9 ; [.1FC6.0020.0002] # GREEK SMALL LETTER IOTA -1FBE ; [.1FC6.0020.0002] # GREEK PROSGEGRAMMENI -037A ; [.1FC6.0020.0004] # GREEK YPOGEGRAMMENI -1D6CA ; [.1FC6.0020.0005] # MATHEMATICAL BOLD SMALL IOTA -1D704 ; [.1FC6.0020.0005] # MATHEMATICAL ITALIC SMALL IOTA -1D73E ; [.1FC6.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL IOTA -1D778 ; [.1FC6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA -1D7B2 ; [.1FC6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA -0399 ; [.1FC6.0020.0008] # GREEK CAPITAL LETTER IOTA -1D6B0 ; [.1FC6.0020.000B] # MATHEMATICAL BOLD CAPITAL IOTA -1D6EA ; [.1FC6.0020.000B] # MATHEMATICAL ITALIC CAPITAL IOTA -1D724 ; [.1FC6.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA -1D75E ; [.1FC6.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA -1D798 ; [.1FC6.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA -1F30 ; [.1FC6.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER IOTA WITH PSILI -1F38 ; [.1FC6.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI -1F34 ; [.1FC6.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA -1F3C ; [.1FC6.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA -1F32 ; [.1FC6.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA -1F3A ; [.1FC6.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA -1F36 ; [.1FC6.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI -1F3E ; [.1FC6.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI -1F31 ; [.1FC6.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER IOTA WITH DASIA -1F39 ; [.1FC6.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA -1F35 ; [.1FC6.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA -1F3D ; [.1FC6.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA -1F33 ; [.1FC6.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA -1F3B ; [.1FC6.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA -1F37 ; [.1FC6.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI -1F3F ; [.1FC6.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI -03AF ; [.1FC6.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH TONOS -1F77 ; [.1FC6.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH OXIA -038A ; [.1FC6.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH TONOS -1FDB ; [.1FC6.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH OXIA -1F76 ; [.1FC6.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH VARIA -1FDA ; [.1FC6.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH VARIA -1FD0 ; [.1FC6.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER IOTA WITH VRACHY -1FD8 ; [.1FC6.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER IOTA WITH VRACHY -1FD6 ; [.1FC6.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PERISPOMENI -03CA ; [.1FC6.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA -03AA ; [.1FC6.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA -0390 ; [.1FC6.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -1FD3 ; [.1FC6.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD2 ; [.1FC6.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA -1FD7 ; [.1FC6.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI -1FD1 ; [.1FC6.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER IOTA WITH MACRON -1FD9 ; [.1FC6.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER IOTA WITH MACRON -03F3 ; [.1FC7.0020.0002] # GREEK LETTER YOT -037F ; [.1FC7.0020.0008] # GREEK CAPITAL LETTER YOT -03BA ; [.1FC8.0020.0002] # GREEK SMALL LETTER KAPPA -03F0 ; [.1FC8.0020.0004] # GREEK KAPPA SYMBOL -1D6CB ; [.1FC8.0020.0005] # MATHEMATICAL BOLD SMALL KAPPA -1D6DE ; [.1FC8.0020.0005] # MATHEMATICAL BOLD KAPPA SYMBOL -1D705 ; [.1FC8.0020.0005] # MATHEMATICAL ITALIC SMALL KAPPA -1D718 ; [.1FC8.0020.0005] # MATHEMATICAL ITALIC KAPPA SYMBOL -1D73F ; [.1FC8.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL KAPPA -1D752 ; [.1FC8.0020.0005] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL -1D779 ; [.1FC8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA -1D78C ; [.1FC8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL -1D7B3 ; [.1FC8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA -1D7C6 ; [.1FC8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL -039A ; [.1FC8.0020.0008] # GREEK CAPITAL LETTER KAPPA -1D6B1 ; [.1FC8.0020.000B] # MATHEMATICAL BOLD CAPITAL KAPPA -1D6EB ; [.1FC8.0020.000B] # MATHEMATICAL ITALIC CAPITAL KAPPA -1D725 ; [.1FC8.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA -1D75F ; [.1FC8.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA -1D799 ; [.1FC8.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA -03D7 ; [.1FC8.0020.0004][.1FB9.0020.0004][.1FC6.0020.0004] # GREEK KAI SYMBOL -03CF ; [.1FC8.0020.000A][.1FB9.0020.0004][.1FC6.0020.0004] # GREEK CAPITAL KAI SYMBOL -03BB ; [.1FC9.0020.0002] # GREEK SMALL LETTER LAMDA -1D6CC ; [.1FC9.0020.0005] # MATHEMATICAL BOLD SMALL LAMDA -1D706 ; [.1FC9.0020.0005] # MATHEMATICAL ITALIC SMALL LAMDA -1D740 ; [.1FC9.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL LAMDA -1D77A ; [.1FC9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA -1D7B4 ; [.1FC9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA -039B ; [.1FC9.0020.0008] # GREEK CAPITAL LETTER LAMDA -1D6B2 ; [.1FC9.0020.000B] # MATHEMATICAL BOLD CAPITAL LAMDA -1D6EC ; [.1FC9.0020.000B] # MATHEMATICAL ITALIC CAPITAL LAMDA -1D726 ; [.1FC9.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA -1D760 ; [.1FC9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA -1D79A ; [.1FC9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA -1D27 ; [.1FCA.0020.0002] # GREEK LETTER SMALL CAPITAL LAMDA -03BC ; [.1FCB.0020.0002] # GREEK SMALL LETTER MU -00B5 ; [.1FCB.0020.0004] # MICRO SIGN -1D6CD ; [.1FCB.0020.0005] # MATHEMATICAL BOLD SMALL MU -1D707 ; [.1FCB.0020.0005] # MATHEMATICAL ITALIC SMALL MU -1D741 ; [.1FCB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL MU -1D77B ; [.1FCB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL MU -1D7B5 ; [.1FCB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU -039C ; [.1FCB.0020.0008] # GREEK CAPITAL LETTER MU -1D6B3 ; [.1FCB.0020.000B] # MATHEMATICAL BOLD CAPITAL MU -1D6ED ; [.1FCB.0020.000B] # MATHEMATICAL ITALIC CAPITAL MU -1D727 ; [.1FCB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL MU -1D761 ; [.1FCB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU -1D79B ; [.1FCB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU -3382 ; [.1FCB.0020.001C][.1C47.0020.001D] # SQUARE MU A -338C ; [.1FCB.0020.001C][.1CE5.0020.001D] # SQUARE MU F -338D ; [.1FCB.0020.001C][.1CF4.0020.001C] # SQUARE MU G -3395 ; [.1FCB.0020.001C][.1D77.0020.001C] # SQUARE MU L -339B ; [.1FCB.0020.001C][.1DAA.0020.001C] # SQUARE MU M -33B2 ; [.1FCB.0020.001C][.1E71.0020.001C] # SQUARE MU S -33B6 ; [.1FCB.0020.001C][.1EE3.0020.001D] # SQUARE MU V -33BC ; [.1FCB.0020.001C][.1EF5.0020.001D] # SQUARE MU W -03BD ; [.1FCC.0020.0002] # GREEK SMALL LETTER NU -1D6CE ; [.1FCC.0020.0005] # MATHEMATICAL BOLD SMALL NU -1D708 ; [.1FCC.0020.0005] # MATHEMATICAL ITALIC SMALL NU -1D742 ; [.1FCC.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL NU -1D77C ; [.1FCC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL NU -1D7B6 ; [.1FCC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU -039D ; [.1FCC.0020.0008] # GREEK CAPITAL LETTER NU -1D6B4 ; [.1FCC.0020.000B] # MATHEMATICAL BOLD CAPITAL NU -1D6EE ; [.1FCC.0020.000B] # MATHEMATICAL ITALIC CAPITAL NU -1D728 ; [.1FCC.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL NU -1D762 ; [.1FCC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU -1D79C ; [.1FCC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU -03BE ; [.1FCD.0020.0002] # GREEK SMALL LETTER XI -1D6CF ; [.1FCD.0020.0005] # MATHEMATICAL BOLD SMALL XI -1D709 ; [.1FCD.0020.0005] # MATHEMATICAL ITALIC SMALL XI -1D743 ; [.1FCD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL XI -1D77D ; [.1FCD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL XI -1D7B7 ; [.1FCD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI -039E ; [.1FCD.0020.0008] # GREEK CAPITAL LETTER XI -1D6B5 ; [.1FCD.0020.000B] # MATHEMATICAL BOLD CAPITAL XI -1D6EF ; [.1FCD.0020.000B] # MATHEMATICAL ITALIC CAPITAL XI -1D729 ; [.1FCD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL XI -1D763 ; [.1FCD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI -1D79D ; [.1FCD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI -03BF ; [.1FCE.0020.0002] # GREEK SMALL LETTER OMICRON -1D6D0 ; [.1FCE.0020.0005] # MATHEMATICAL BOLD SMALL OMICRON -1D70A ; [.1FCE.0020.0005] # MATHEMATICAL ITALIC SMALL OMICRON -1D744 ; [.1FCE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMICRON -1D77E ; [.1FCE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON -1D7B8 ; [.1FCE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON -039F ; [.1FCE.0020.0008] # GREEK CAPITAL LETTER OMICRON -1D6B6 ; [.1FCE.0020.000B] # MATHEMATICAL BOLD CAPITAL OMICRON -1D6F0 ; [.1FCE.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMICRON -1D72A ; [.1FCE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON -1D764 ; [.1FCE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON -1D79E ; [.1FCE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON -1F40 ; [.1FCE.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMICRON WITH PSILI -1F48 ; [.1FCE.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI -1F44 ; [.1FCE.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA -1F4C ; [.1FCE.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA -1F42 ; [.1FCE.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA -1F4A ; [.1FCE.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA -1F41 ; [.1FCE.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMICRON WITH DASIA -1F49 ; [.1FCE.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA -1F45 ; [.1FCE.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F4D ; [.1FCE.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F43 ; [.1FCE.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA -1F4B ; [.1FCE.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA -03CC ; [.1FCE.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH TONOS -1F79 ; [.1FCE.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH OXIA -038C ; [.1FCE.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH TONOS -1FF9 ; [.1FCE.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH OXIA -1F78 ; [.1FCE.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH VARIA -1FF8 ; [.1FCE.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH VARIA -03C0 ; [.1FCF.0020.0002] # GREEK SMALL LETTER PI -03D6 ; [.1FCF.0020.0004] # GREEK PI SYMBOL -213C ; [.1FCF.0020.0005] # DOUBLE-STRUCK SMALL PI -1D6D1 ; [.1FCF.0020.0005] # MATHEMATICAL BOLD SMALL PI -1D6E1 ; [.1FCF.0020.0005] # MATHEMATICAL BOLD PI SYMBOL -1D70B ; [.1FCF.0020.0005] # MATHEMATICAL ITALIC SMALL PI -1D71B ; [.1FCF.0020.0005] # MATHEMATICAL ITALIC PI SYMBOL -1D745 ; [.1FCF.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PI -1D755 ; [.1FCF.0020.0005] # MATHEMATICAL BOLD ITALIC PI SYMBOL -1D77F ; [.1FCF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PI -1D78F ; [.1FCF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL -1D7B9 ; [.1FCF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI -1D7C9 ; [.1FCF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -03A0 ; [.1FCF.0020.0008] # GREEK CAPITAL LETTER PI -213F ; [.1FCF.0020.000B] # DOUBLE-STRUCK CAPITAL PI -1D6B7 ; [.1FCF.0020.000B] # MATHEMATICAL BOLD CAPITAL PI -1D6F1 ; [.1FCF.0020.000B] # MATHEMATICAL ITALIC CAPITAL PI -1D72B ; [.1FCF.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PI -1D765 ; [.1FCF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI -1D79F ; [.1FCF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI -1D28 ; [.1FD0.0020.0002] # GREEK LETTER SMALL CAPITAL PI -03FB ; [.1FD1.0020.0002] # GREEK SMALL LETTER SAN -03FA ; [.1FD1.0020.0008] # GREEK CAPITAL LETTER SAN -03DF ; [.1FD2.0020.0002] # GREEK SMALL LETTER KOPPA -03DE ; [.1FD2.0020.0008] # GREEK LETTER KOPPA -03D9 ; [.1FD3.0020.0002] # GREEK SMALL LETTER ARCHAIC KOPPA -03D8 ; [.1FD3.0020.0008] # GREEK LETTER ARCHAIC KOPPA -03C1 ; [.1FD4.0020.0002] # GREEK SMALL LETTER RHO -03F1 ; [.1FD4.0020.0004] # GREEK RHO SYMBOL -1D6D2 ; [.1FD4.0020.0005] # MATHEMATICAL BOLD SMALL RHO -1D6E0 ; [.1FD4.0020.0005] # MATHEMATICAL BOLD RHO SYMBOL -1D70C ; [.1FD4.0020.0005] # MATHEMATICAL ITALIC SMALL RHO -1D71A ; [.1FD4.0020.0005] # MATHEMATICAL ITALIC RHO SYMBOL -1D746 ; [.1FD4.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL RHO -1D754 ; [.1FD4.0020.0005] # MATHEMATICAL BOLD ITALIC RHO SYMBOL -1D780 ; [.1FD4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO -1D78E ; [.1FD4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL -1D7BA ; [.1FD4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO -1D7C8 ; [.1FD4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL -03A1 ; [.1FD4.0020.0008] # GREEK CAPITAL LETTER RHO -1D6B8 ; [.1FD4.0020.000B] # MATHEMATICAL BOLD CAPITAL RHO -1D6F2 ; [.1FD4.0020.000B] # MATHEMATICAL ITALIC CAPITAL RHO -1D72C ; [.1FD4.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL RHO -1D766 ; [.1FD4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO -1D7A0 ; [.1FD4.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO -1D68 ; [.1FD4.0020.0015] # GREEK SUBSCRIPT SMALL LETTER RHO -1FE4 ; [.1FD4.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER RHO WITH PSILI -1FE5 ; [.1FD4.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER RHO WITH DASIA -1FEC ; [.1FD4.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER RHO WITH DASIA -1D29 ; [.1FD5.0020.0002] # GREEK LETTER SMALL CAPITAL RHO -03FC ; [.1FD6.0020.0002] # GREEK RHO WITH STROKE SYMBOL -03C3 ; [.1FD7.0020.0002] # GREEK SMALL LETTER SIGMA -03F2 ; [.1FD7.0020.0004] # GREEK LUNATE SIGMA SYMBOL -1D6D3 ; [.1FD7.0020.0005] # MATHEMATICAL BOLD SMALL FINAL SIGMA -1D6D4 ; [.1FD7.0020.0005] # MATHEMATICAL BOLD SMALL SIGMA -1D70D ; [.1FD7.0020.0005] # MATHEMATICAL ITALIC SMALL FINAL SIGMA -1D70E ; [.1FD7.0020.0005] # MATHEMATICAL ITALIC SMALL SIGMA -1D747 ; [.1FD7.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA -1D748 ; [.1FD7.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL SIGMA -1D781 ; [.1FD7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA -1D782 ; [.1FD7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA -1D7BB ; [.1FD7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA -1D7BC ; [.1FD7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA -03A3 ; [.1FD7.0020.0008] # GREEK CAPITAL LETTER SIGMA -03F9 ; [.1FD7.0020.000A] # GREEK CAPITAL LUNATE SIGMA SYMBOL -1D6BA ; [.1FD7.0020.000B] # MATHEMATICAL BOLD CAPITAL SIGMA -1D6F4 ; [.1FD7.0020.000B] # MATHEMATICAL ITALIC CAPITAL SIGMA -1D72E ; [.1FD7.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA -1D768 ; [.1FD7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA -1D7A2 ; [.1FD7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA -03C2 ; [.1FD7.0020.0019] # GREEK SMALL LETTER FINAL SIGMA -037C ; [.1FD8.0020.0002] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL -03FE ; [.1FD8.0020.0008] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL -037B ; [.1FD9.0020.0002] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL -03FD ; [.1FD9.0020.0008] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL -037D ; [.1FDA.0020.0002] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL -03FF ; [.1FDA.0020.0008] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL -03C4 ; [.1FDB.0020.0002] # GREEK SMALL LETTER TAU -1D6D5 ; [.1FDB.0020.0005] # MATHEMATICAL BOLD SMALL TAU -1D70F ; [.1FDB.0020.0005] # MATHEMATICAL ITALIC SMALL TAU -1D749 ; [.1FDB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL TAU -1D783 ; [.1FDB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU -1D7BD ; [.1FDB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU -03A4 ; [.1FDB.0020.0008] # GREEK CAPITAL LETTER TAU -1D6BB ; [.1FDB.0020.000B] # MATHEMATICAL BOLD CAPITAL TAU -1D6F5 ; [.1FDB.0020.000B] # MATHEMATICAL ITALIC CAPITAL TAU -1D72F ; [.1FDB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL TAU -1D769 ; [.1FDB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU -1D7A3 ; [.1FDB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU -03C5 ; [.1FDC.0020.0002] # GREEK SMALL LETTER UPSILON -1D6D6 ; [.1FDC.0020.0005] # MATHEMATICAL BOLD SMALL UPSILON -1D710 ; [.1FDC.0020.0005] # MATHEMATICAL ITALIC SMALL UPSILON -1D74A ; [.1FDC.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL UPSILON -1D784 ; [.1FDC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON -1D7BE ; [.1FDC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON -03A5 ; [.1FDC.0020.0008] # GREEK CAPITAL LETTER UPSILON -03D2 ; [.1FDC.0020.000A] # GREEK UPSILON WITH HOOK SYMBOL -1D6BC ; [.1FDC.0020.000B] # MATHEMATICAL BOLD CAPITAL UPSILON -1D6F6 ; [.1FDC.0020.000B] # MATHEMATICAL ITALIC CAPITAL UPSILON -1D730 ; [.1FDC.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON -1D76A ; [.1FDC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON -1D7A4 ; [.1FDC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON -1F50 ; [.1FDC.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER UPSILON WITH PSILI -1F54 ; [.1FDC.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA -1F52 ; [.1FDC.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA -1F56 ; [.1FDC.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI -1F51 ; [.1FDC.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER UPSILON WITH DASIA -1F59 ; [.1FDC.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA -1F55 ; [.1FDC.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA -1F5D ; [.1FDC.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F53 ; [.1FDC.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA -1F5B ; [.1FDC.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F57 ; [.1FDC.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F5F ; [.1FDC.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI -03CD ; [.1FDC.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH TONOS -1F7B ; [.1FDC.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH OXIA -038E ; [.1FDC.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH TONOS -1FEB ; [.1FDC.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH OXIA -03D3 ; [.1FDC.0020.000A][.0000.0024.0002] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL -1F7A ; [.1FDC.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH VARIA -1FEA ; [.1FDC.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH VARIA -1FE0 ; [.1FDC.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER UPSILON WITH VRACHY -1FE8 ; [.1FDC.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER UPSILON WITH VRACHY -1FE6 ; [.1FDC.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI -03CB ; [.1FDC.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA -03AB ; [.1FDC.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -03D4 ; [.1FDC.0020.000A][.0000.002B.0002] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL -03B0 ; [.1FDC.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS -1FE3 ; [.1FDC.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA -1FE2 ; [.1FDC.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA -1FE7 ; [.1FDC.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI -1FE1 ; [.1FDC.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER UPSILON WITH MACRON -1FE9 ; [.1FDC.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER UPSILON WITH MACRON -03C6 ; [.1FDD.0020.0002] # GREEK SMALL LETTER PHI -03D5 ; [.1FDD.0020.0004] # GREEK PHI SYMBOL -1D6D7 ; [.1FDD.0020.0005] # MATHEMATICAL BOLD SMALL PHI -1D6DF ; [.1FDD.0020.0005] # MATHEMATICAL BOLD PHI SYMBOL -1D711 ; [.1FDD.0020.0005] # MATHEMATICAL ITALIC SMALL PHI -1D719 ; [.1FDD.0020.0005] # MATHEMATICAL ITALIC PHI SYMBOL -1D74B ; [.1FDD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PHI -1D753 ; [.1FDD.0020.0005] # MATHEMATICAL BOLD ITALIC PHI SYMBOL -1D785 ; [.1FDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI -1D78D ; [.1FDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL -1D7BF ; [.1FDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI -1D7C7 ; [.1FDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL -03A6 ; [.1FDD.0020.0008] # GREEK CAPITAL LETTER PHI -1D6BD ; [.1FDD.0020.000B] # MATHEMATICAL BOLD CAPITAL PHI -1D6F7 ; [.1FDD.0020.000B] # MATHEMATICAL ITALIC CAPITAL PHI -1D731 ; [.1FDD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PHI -1D76B ; [.1FDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI -1D7A5 ; [.1FDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI -1D60 ; [.1FDD.0020.0014] # MODIFIER LETTER SMALL GREEK PHI -1D69 ; [.1FDD.0020.0015] # GREEK SUBSCRIPT SMALL LETTER PHI -03C7 ; [.1FDE.0020.0002] # GREEK SMALL LETTER CHI -1D6D8 ; [.1FDE.0020.0005] # MATHEMATICAL BOLD SMALL CHI -1D712 ; [.1FDE.0020.0005] # MATHEMATICAL ITALIC SMALL CHI -1D74C ; [.1FDE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL CHI -1D786 ; [.1FDE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI -1D7C0 ; [.1FDE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI -03A7 ; [.1FDE.0020.0008] # GREEK CAPITAL LETTER CHI -1D6BE ; [.1FDE.0020.000B] # MATHEMATICAL BOLD CAPITAL CHI -1D6F8 ; [.1FDE.0020.000B] # MATHEMATICAL ITALIC CAPITAL CHI -1D732 ; [.1FDE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL CHI -1D76C ; [.1FDE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI -1D7A6 ; [.1FDE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI -1D61 ; [.1FDE.0020.0014] # MODIFIER LETTER SMALL CHI -1D6A ; [.1FDE.0020.0015] # GREEK SUBSCRIPT SMALL LETTER CHI -03C8 ; [.1FDF.0020.0002] # GREEK SMALL LETTER PSI -1D6D9 ; [.1FDF.0020.0005] # MATHEMATICAL BOLD SMALL PSI -1D713 ; [.1FDF.0020.0005] # MATHEMATICAL ITALIC SMALL PSI -1D74D ; [.1FDF.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PSI -1D787 ; [.1FDF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI -1D7C1 ; [.1FDF.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI -03A8 ; [.1FDF.0020.0008] # GREEK CAPITAL LETTER PSI -1D6BF ; [.1FDF.0020.000B] # MATHEMATICAL BOLD CAPITAL PSI -1D6F9 ; [.1FDF.0020.000B] # MATHEMATICAL ITALIC CAPITAL PSI -1D733 ; [.1FDF.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PSI -1D76D ; [.1FDF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI -1D7A7 ; [.1FDF.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI -1D2A ; [.1FE0.0020.0002] # GREEK LETTER SMALL CAPITAL PSI -03C9 ; [.1FE1.0020.0002] # GREEK SMALL LETTER OMEGA -1D6DA ; [.1FE1.0020.0005] # MATHEMATICAL BOLD SMALL OMEGA -1D714 ; [.1FE1.0020.0005] # MATHEMATICAL ITALIC SMALL OMEGA -1D74E ; [.1FE1.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D788 ; [.1FE1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D7C2 ; [.1FE1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -03A9 ; [.1FE1.0020.0008] # GREEK CAPITAL LETTER OMEGA -2126 ; [.1FE1.0020.0008] # OHM SIGN -1D6C0 ; [.1FE1.0020.000B] # MATHEMATICAL BOLD CAPITAL OMEGA -1D6FA ; [.1FE1.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMEGA -1D734 ; [.1FE1.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D76E ; [.1FE1.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D7A8 ; [.1FE1.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1F60 ; [.1FE1.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMEGA WITH PSILI -1F68 ; [.1FE1.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI -1F64 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA -1F6C ; [.1FE1.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA -1FA4 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI -1FAC ; [.1FE1.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI -1F62 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA -1F6A ; [.1FE1.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA -1FA2 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI -1FAA ; [.1FE1.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI -1F66 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI -1F6E ; [.1FE1.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI -1FA6 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI -1FAE ; [.1FE1.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI -1FA0 ; [.1FE1.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI -1FA8 ; [.1FE1.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI -1F61 ; [.1FE1.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMEGA WITH DASIA -1F69 ; [.1FE1.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA -1F65 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA -1F6D ; [.1FE1.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA -1FA5 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI -1FAD ; [.1FE1.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI -1F63 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA -1F6B ; [.1FE1.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA -1FA3 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI -1FAB ; [.1FE1.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI -1F67 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI -1F6F ; [.1FE1.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI -1FA7 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1FAF ; [.1FE1.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1FA1 ; [.1FE1.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI -1FA9 ; [.1FE1.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI -03CE ; [.1FE1.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH TONOS -1F7D ; [.1FE1.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH OXIA -038F ; [.1FE1.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH TONOS -1FFB ; [.1FE1.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH OXIA -1FF4 ; [.1FE1.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1F7C ; [.1FE1.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH VARIA -1FFA ; [.1FE1.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH VARIA -1FF2 ; [.1FE1.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI -1FF6 ; [.1FE1.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI -1FF7 ; [.1FE1.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI -1FF3 ; [.1FE1.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI -1FFC ; [.1FE1.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -AB65 ; [.1FE2.0020.0002] # GREEK LETTER SMALL CAPITAL OMEGA -03E1 ; [.1FE3.0020.0002] # GREEK SMALL LETTER SAMPI -03E0 ; [.1FE3.0020.0008] # GREEK LETTER SAMPI -0373 ; [.1FE4.0020.0002] # GREEK SMALL LETTER ARCHAIC SAMPI -0372 ; [.1FE4.0020.0008] # GREEK CAPITAL LETTER ARCHAIC SAMPI -03F8 ; [.1FE5.0020.0002] # GREEK SMALL LETTER SHO -03F7 ; [.1FE5.0020.0008] # GREEK CAPITAL LETTER SHO -2C81 ; [.1FE6.0020.0002] # COPTIC SMALL LETTER ALFA -2C80 ; [.1FE6.0020.0008] # COPTIC CAPITAL LETTER ALFA -2C83 ; [.1FE7.0020.0002] # COPTIC SMALL LETTER VIDA -2C82 ; [.1FE7.0020.0008] # COPTIC CAPITAL LETTER VIDA -2C85 ; [.1FE8.0020.0002] # COPTIC SMALL LETTER GAMMA -2C84 ; [.1FE8.0020.0008] # COPTIC CAPITAL LETTER GAMMA -2C87 ; [.1FE9.0020.0002] # COPTIC SMALL LETTER DALDA -2C86 ; [.1FE9.0020.0008] # COPTIC CAPITAL LETTER DALDA -2C89 ; [.1FEA.0020.0002] # COPTIC SMALL LETTER EIE -2C88 ; [.1FEA.0020.0008] # COPTIC CAPITAL LETTER EIE -2CB7 ; [.1FEB.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE -2CB6 ; [.1FEB.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE -2C8B ; [.1FEC.0020.0002] # COPTIC SMALL LETTER SOU -2C8A ; [.1FEC.0020.0008] # COPTIC CAPITAL LETTER SOU -2C8D ; [.1FED.0020.0002] # COPTIC SMALL LETTER ZATA -2C8C ; [.1FED.0020.0008] # COPTIC CAPITAL LETTER ZATA -2C8F ; [.1FEE.0020.0002] # COPTIC SMALL LETTER HATE -2C8E ; [.1FEE.0020.0008] # COPTIC CAPITAL LETTER HATE -2C91 ; [.1FEF.0020.0002] # COPTIC SMALL LETTER THETHE -2C90 ; [.1FEF.0020.0008] # COPTIC CAPITAL LETTER THETHE -2C93 ; [.1FF0.0020.0002] # COPTIC SMALL LETTER IAUDA -2C92 ; [.1FF0.0020.0008] # COPTIC CAPITAL LETTER IAUDA -2C95 ; [.1FF1.0020.0002] # COPTIC SMALL LETTER KAPA -2C94 ; [.1FF1.0020.0008] # COPTIC CAPITAL LETTER KAPA -2CE4 ; [.1FF1.0020.0004][.1FE6.0020.0004][.1FF0.0020.0004] # COPTIC SYMBOL KAI -2CB9 ; [.1FF2.0020.0002] # COPTIC SMALL LETTER DIALECT-P KAPA -2CB8 ; [.1FF2.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P KAPA -2C97 ; [.1FF3.0020.0002] # COPTIC SMALL LETTER LAULA -2C96 ; [.1FF3.0020.0008] # COPTIC CAPITAL LETTER LAULA -2C99 ; [.1FF4.0020.0002] # COPTIC SMALL LETTER MI -2C98 ; [.1FF4.0020.0008] # COPTIC CAPITAL LETTER MI -2C9B ; [.1FF5.0020.0002] # COPTIC SMALL LETTER NI -2C9A ; [.1FF5.0020.0008] # COPTIC CAPITAL LETTER NI -2CBB ; [.1FF6.0020.0002] # COPTIC SMALL LETTER DIALECT-P NI -2CBA ; [.1FF6.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P NI -2CBD ; [.1FF7.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI -2CBC ; [.1FF7.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI -2C9D ; [.1FF8.0020.0002] # COPTIC SMALL LETTER KSI -2C9C ; [.1FF8.0020.0008] # COPTIC CAPITAL LETTER KSI -2C9F ; [.1FF9.0020.0002] # COPTIC SMALL LETTER O -2C9E ; [.1FF9.0020.0008] # COPTIC CAPITAL LETTER O -2CA1 ; [.1FFA.0020.0002] # COPTIC SMALL LETTER PI -2CA0 ; [.1FFA.0020.0008] # COPTIC CAPITAL LETTER PI -2CA3 ; [.1FFB.0020.0002] # COPTIC SMALL LETTER RO -2CA2 ; [.1FFB.0020.0008] # COPTIC CAPITAL LETTER RO -2CA5 ; [.1FFC.0020.0002] # COPTIC SMALL LETTER SIMA -2CA4 ; [.1FFC.0020.0008] # COPTIC CAPITAL LETTER SIMA -2CA7 ; [.1FFD.0020.0002] # COPTIC SMALL LETTER TAU -2CA6 ; [.1FFD.0020.0008] # COPTIC CAPITAL LETTER TAU -2CA9 ; [.1FFE.0020.0002] # COPTIC SMALL LETTER UA -2CA8 ; [.1FFE.0020.0008] # COPTIC CAPITAL LETTER UA -2CAB ; [.1FFF.0020.0002] # COPTIC SMALL LETTER FI -2CAA ; [.1FFF.0020.0008] # COPTIC CAPITAL LETTER FI -2CAD ; [.2000.0020.0002] # COPTIC SMALL LETTER KHI -2CAC ; [.2000.0020.0008] # COPTIC CAPITAL LETTER KHI -2CAF ; [.2001.0020.0002] # COPTIC SMALL LETTER PSI -2CAE ; [.2001.0020.0008] # COPTIC CAPITAL LETTER PSI -2CB1 ; [.2002.0020.0002] # COPTIC SMALL LETTER OOU -2CB0 ; [.2002.0020.0008] # COPTIC CAPITAL LETTER OOU -2CBF ; [.2003.0020.0002] # COPTIC SMALL LETTER OLD COPTIC OOU -2CBE ; [.2003.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC OOU -2CC1 ; [.2004.0020.0002] # COPTIC SMALL LETTER SAMPI -2CC0 ; [.2004.0020.0008] # COPTIC CAPITAL LETTER SAMPI -03E3 ; [.2005.0020.0002] # COPTIC SMALL LETTER SHEI -03E2 ; [.2005.0020.0008] # COPTIC CAPITAL LETTER SHEI -2CEC ; [.2006.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI -2CEB ; [.2006.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI -2CC3 ; [.2007.0020.0002] # COPTIC SMALL LETTER CROSSED SHEI -2CC2 ; [.2007.0020.0008] # COPTIC CAPITAL LETTER CROSSED SHEI -2CC5 ; [.2008.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHEI -2CC4 ; [.2008.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHEI -2CC7 ; [.2009.0020.0002] # COPTIC SMALL LETTER OLD COPTIC ESH -2CC6 ; [.2009.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC ESH -03E5 ; [.200A.0020.0002] # COPTIC SMALL LETTER FEI -03E4 ; [.200A.0020.0008] # COPTIC CAPITAL LETTER FEI -03E7 ; [.200B.0020.0002] # COPTIC SMALL LETTER KHEI -03E6 ; [.200B.0020.0008] # COPTIC CAPITAL LETTER KHEI -2CF3 ; [.200C.0020.0002] # COPTIC SMALL LETTER BOHAIRIC KHEI -2CF2 ; [.200C.0020.0008] # COPTIC CAPITAL LETTER BOHAIRIC KHEI -2CC9 ; [.200D.0020.0002] # COPTIC SMALL LETTER AKHMIMIC KHEI -2CC8 ; [.200D.0020.0008] # COPTIC CAPITAL LETTER AKHMIMIC KHEI -03E9 ; [.200E.0020.0002] # COPTIC SMALL LETTER HORI -03E8 ; [.200E.0020.0008] # COPTIC CAPITAL LETTER HORI -2CCB ; [.200F.0020.0002] # COPTIC SMALL LETTER DIALECT-P HORI -2CCA ; [.200F.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P HORI -2CCD ; [.2010.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HORI -2CCC ; [.2010.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HORI -2CCF ; [.2011.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HA -2CCE ; [.2011.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HA -2CD1 ; [.2012.0020.0002] # COPTIC SMALL LETTER L-SHAPED HA -2CD0 ; [.2012.0020.0008] # COPTIC CAPITAL LETTER L-SHAPED HA -2CD3 ; [.2013.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HEI -2CD2 ; [.2013.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HEI -2CD5 ; [.2014.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HAT -2CD4 ; [.2014.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HAT -03EB ; [.2015.0020.0002] # COPTIC SMALL LETTER GANGIA -03EA ; [.2015.0020.0008] # COPTIC CAPITAL LETTER GANGIA -2CEE ; [.2016.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA -2CED ; [.2016.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA -2CD7 ; [.2017.0020.0002] # COPTIC SMALL LETTER OLD COPTIC GANGIA -2CD6 ; [.2017.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA -03ED ; [.2018.0020.0002] # COPTIC SMALL LETTER SHIMA -03EC ; [.2018.0020.0008] # COPTIC CAPITAL LETTER SHIMA -2CD9 ; [.2019.0020.0002] # COPTIC SMALL LETTER OLD COPTIC DJA -2CD8 ; [.2019.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC DJA -2CDB ; [.201A.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHIMA -2CDA ; [.201A.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA -2CDD ; [.201B.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN SHIMA -2CDC ; [.201B.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA -03EF ; [.201C.0020.0002] # COPTIC SMALL LETTER DEI -03EE ; [.201C.0020.0008] # COPTIC CAPITAL LETTER DEI -2CB3 ; [.201D.0020.0002] # COPTIC SMALL LETTER DIALECT-P ALEF -2CB2 ; [.201D.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P ALEF -2CB5 ; [.201E.0020.0002] # COPTIC SMALL LETTER OLD COPTIC AIN -2CB4 ; [.201E.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC AIN -2CDF ; [.201F.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NGI -2CDE ; [.201F.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NGI -2CE1 ; [.2020.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NYI -2CE0 ; [.2020.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NYI -2CE3 ; [.2021.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN WAU -2CE2 ; [.2021.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN WAU -0430 ; [.2022.0020.0002] # CYRILLIC SMALL LETTER A -2DF6 ; [.2022.0020.0004] # COMBINING CYRILLIC LETTER A -0410 ; [.2022.0020.0008] # CYRILLIC CAPITAL LETTER A -04D1 ; [.2022.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER A WITH BREVE -04D0 ; [.2022.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER A WITH BREVE -04D3 ; [.2022.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER A WITH DIAERESIS -04D2 ; [.2022.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS -04D9 ; [.2026.0020.0002] # CYRILLIC SMALL LETTER SCHWA -04D8 ; [.2026.0020.0008] # CYRILLIC CAPITAL LETTER SCHWA -04DB ; [.2026.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS -04DA ; [.2026.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS -04D5 ; [.202A.0020.0002] # CYRILLIC SMALL LIGATURE A IE -04D4 ; [.202A.0020.0008] # CYRILLIC CAPITAL LIGATURE A IE -0431 ; [.202E.0020.0002] # CYRILLIC SMALL LETTER BE -2DE0 ; [.202E.0020.0004] # COMBINING CYRILLIC LETTER BE -0411 ; [.202E.0020.0008] # CYRILLIC CAPITAL LETTER BE -0432 ; [.2032.0020.0002] # CYRILLIC SMALL LETTER VE -1C80 ; [.2032.0020.0004] # CYRILLIC SMALL LETTER ROUNDED VE -2DE1 ; [.2032.0020.0004] # COMBINING CYRILLIC LETTER VE -0412 ; [.2032.0020.0008] # CYRILLIC CAPITAL LETTER VE -0433 ; [.2036.0020.0002] # CYRILLIC SMALL LETTER GHE -2DE2 ; [.2036.0020.0004] # COMBINING CYRILLIC LETTER GHE -0413 ; [.2036.0020.0008] # CYRILLIC CAPITAL LETTER GHE -0453 ; [.2036.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER GJE -0403 ; [.2036.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER GJE -0491 ; [.2036.0020.0004][.0000.0111.0004] # CYRILLIC SMALL LETTER GHE WITH UPTURN -0490 ; [.2036.0020.000A][.0000.0111.0004] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN -0493 ; [.203A.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE -0492 ; [.203A.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE -04FB ; [.203E.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK -04FA ; [.203E.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK -0495 ; [.2042.0020.0002] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK -0494 ; [.2042.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK -04F7 ; [.2046.0020.0002] # CYRILLIC SMALL LETTER GHE WITH DESCENDER -04F6 ; [.2046.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER -0434 ; [.204A.0020.0002] # CYRILLIC SMALL LETTER DE -1C81 ; [.204A.0020.0004] # CYRILLIC SMALL LETTER LONG-LEGGED DE -2DE3 ; [.204A.0020.0004] # COMBINING CYRILLIC LETTER DE -0414 ; [.204A.0020.0008] # CYRILLIC CAPITAL LETTER DE -0501 ; [.204E.0020.0002] # CYRILLIC SMALL LETTER KOMI DE -0500 ; [.204E.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DE -A681 ; [.204F.0020.0002] # CYRILLIC SMALL LETTER DWE -A680 ; [.204F.0020.0008] # CYRILLIC CAPITAL LETTER DWE -0452 ; [.2050.0020.0002] # CYRILLIC SMALL LETTER DJE -0402 ; [.2050.0020.0008] # CYRILLIC CAPITAL LETTER DJE -A663 ; [.2054.0020.0002] # CYRILLIC SMALL LETTER SOFT DE -A662 ; [.2054.0020.0008] # CYRILLIC CAPITAL LETTER SOFT DE -0503 ; [.2055.0020.0002] # CYRILLIC SMALL LETTER KOMI DJE -0502 ; [.2055.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DJE -0499 ; [.2056.0020.0002] # CYRILLIC SMALL LETTER ZE WITH DESCENDER -0498 ; [.2056.0020.0008] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER -0435 ; [.205A.0020.0002] # CYRILLIC SMALL LETTER IE -2DF7 ; [.205A.0020.0004] # COMBINING CYRILLIC LETTER IE -0415 ; [.205A.0020.0008] # CYRILLIC CAPITAL LETTER IE -0450 ; [.205A.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER IE WITH GRAVE -0400 ; [.205A.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER IE WITH GRAVE -04D7 ; [.205A.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER IE WITH BREVE -04D6 ; [.205A.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER IE WITH BREVE -0451 ; [.205A.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER IO -0401 ; [.205A.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER IO -0454 ; [.205E.0020.0002] # CYRILLIC SMALL LETTER UKRAINIAN IE -A674 ; [.205E.0020.0004] # COMBINING CYRILLIC LETTER UKRAINIAN IE -0404 ; [.205E.0020.0008] # CYRILLIC CAPITAL LETTER UKRAINIAN IE -0436 ; [.2062.0020.0002] # CYRILLIC SMALL LETTER ZHE -2DE4 ; [.2062.0020.0004] # COMBINING CYRILLIC LETTER ZHE -0416 ; [.2062.0020.0008] # CYRILLIC CAPITAL LETTER ZHE -04C2 ; [.2062.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER ZHE WITH BREVE -04C1 ; [.2062.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE -04DD ; [.2062.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS -04DC ; [.2062.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS -052B ; [.2066.0020.0002] # CYRILLIC SMALL LETTER DZZHE -052A ; [.2066.0020.0008] # CYRILLIC CAPITAL LETTER DZZHE -A685 ; [.2067.0020.0002] # CYRILLIC SMALL LETTER ZHWE -A684 ; [.2067.0020.0008] # CYRILLIC CAPITAL LETTER ZHWE -0497 ; [.2068.0020.0002] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER -0496 ; [.2068.0020.0008] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER -0437 ; [.206C.0020.0002] # CYRILLIC SMALL LETTER ZE -2DE5 ; [.206C.0020.0004] # COMBINING CYRILLIC LETTER ZE -0417 ; [.206C.0020.0008] # CYRILLIC CAPITAL LETTER ZE -04DF ; [.206C.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS -04DE ; [.206C.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS -A641 ; [.2070.0020.0002] # CYRILLIC SMALL LETTER ZEMLYA -A640 ; [.2070.0020.0008] # CYRILLIC CAPITAL LETTER ZEMLYA -0505 ; [.2071.0020.0002] # CYRILLIC SMALL LETTER KOMI ZJE -0504 ; [.2071.0020.0008] # CYRILLIC CAPITAL LETTER KOMI ZJE -0511 ; [.2072.0020.0002] # CYRILLIC SMALL LETTER REVERSED ZE -0510 ; [.2072.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED ZE -A643 ; [.2073.0020.0002] # CYRILLIC SMALL LETTER DZELO -A642 ; [.2073.0020.0008] # CYRILLIC CAPITAL LETTER DZELO -0455 ; [.2074.0020.0002] # CYRILLIC SMALL LETTER DZE -0405 ; [.2074.0020.0008] # CYRILLIC CAPITAL LETTER DZE -A645 ; [.2078.0020.0002] # CYRILLIC SMALL LETTER REVERSED DZE -A644 ; [.2078.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED DZE -04E1 ; [.2079.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN DZE -04E0 ; [.2079.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE -A689 ; [.207D.0020.0002] # CYRILLIC SMALL LETTER DZZE -A688 ; [.207D.0020.0008] # CYRILLIC CAPITAL LETTER DZZE -0507 ; [.207E.0020.0002] # CYRILLIC SMALL LETTER KOMI DZJE -0506 ; [.207E.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DZJE -A683 ; [.207F.0020.0002] # CYRILLIC SMALL LETTER DZWE -A682 ; [.207F.0020.0008] # CYRILLIC CAPITAL LETTER DZWE -0438 ; [.2080.0020.0002] # CYRILLIC SMALL LETTER I -A675 ; [.2080.0020.0004] # COMBINING CYRILLIC LETTER I -0418 ; [.2080.0020.0008] # CYRILLIC CAPITAL LETTER I -045D ; [.2080.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER I WITH GRAVE -040D ; [.2080.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER I WITH GRAVE -04E5 ; [.2080.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER I WITH DIAERESIS -04E4 ; [.2080.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS -04E3 ; [.2080.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER I WITH MACRON -04E2 ; [.2080.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER I WITH MACRON -048B ; [.2084.0020.0002] # CYRILLIC SMALL LETTER SHORT I WITH TAIL -048A ; [.2084.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL -0456 ; [.2088.0020.0002] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -0406 ; [.2088.0020.0008] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -0457 ; [.2088.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YI -A676 ; [.2088.0020.0004][.0000.002B.0004] # COMBINING CYRILLIC LETTER YI -0407 ; [.2088.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YI -A647 ; [.208C.0020.0002] # CYRILLIC SMALL LETTER IOTA -A646 ; [.208C.0020.0008] # CYRILLIC CAPITAL LETTER IOTA -0439 ; [.208D.0020.0002] # CYRILLIC SMALL LETTER SHORT I -0438 0306 ; [.208D.0020.0002] # CYRILLIC SMALL LETTER SHORT I -0419 ; [.208D.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I -0418 0306 ; [.208D.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I -0458 ; [.2091.0020.0002] # CYRILLIC SMALL LETTER JE -0408 ; [.2091.0020.0008] # CYRILLIC CAPITAL LETTER JE -A649 ; [.2095.0020.0002] # CYRILLIC SMALL LETTER DJERV -2DF8 ; [.2095.0020.0004] # COMBINING CYRILLIC LETTER DJERV -A648 ; [.2095.0020.0008] # CYRILLIC CAPITAL LETTER DJERV -043A ; [.2096.0020.0002] # CYRILLIC SMALL LETTER KA -2DE6 ; [.2096.0020.0004] # COMBINING CYRILLIC LETTER KA -041A ; [.2096.0020.0008] # CYRILLIC CAPITAL LETTER KA -045C ; [.2096.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER KJE -040C ; [.2096.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER KJE -049B ; [.209A.0020.0002] # CYRILLIC SMALL LETTER KA WITH DESCENDER -049A ; [.209A.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER -04C4 ; [.209E.0020.0002] # CYRILLIC SMALL LETTER KA WITH HOOK -04C3 ; [.209E.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH HOOK -04A1 ; [.20A2.0020.0002] # CYRILLIC SMALL LETTER BASHKIR KA -04A0 ; [.20A2.0020.0008] # CYRILLIC CAPITAL LETTER BASHKIR KA -049F ; [.20A6.0020.0002] # CYRILLIC SMALL LETTER KA WITH STROKE -049E ; [.20A6.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH STROKE -049D ; [.20AA.0020.0002] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE -049C ; [.20AA.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE -051F ; [.20AE.0020.0002] # CYRILLIC SMALL LETTER ALEUT KA -051E ; [.20AE.0020.0008] # CYRILLIC CAPITAL LETTER ALEUT KA -051B ; [.20AF.0020.0002] # CYRILLIC SMALL LETTER QA -051A ; [.20AF.0020.0008] # CYRILLIC CAPITAL LETTER QA -043B ; [.20B0.0020.0002] # CYRILLIC SMALL LETTER EL -2DE7 ; [.20B0.0020.0004] # COMBINING CYRILLIC LETTER EL -041B ; [.20B0.0020.0008] # CYRILLIC CAPITAL LETTER EL -1D2B ; [.20B4.0020.0002] # CYRILLIC LETTER SMALL CAPITAL EL -04C6 ; [.20B5.0020.0002] # CYRILLIC SMALL LETTER EL WITH TAIL -04C5 ; [.20B5.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH TAIL -052F ; [.20B9.0020.0002] # CYRILLIC SMALL LETTER EL WITH DESCENDER -052E ; [.20B9.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH DESCENDER -0513 ; [.20BA.0020.0002] # CYRILLIC SMALL LETTER EL WITH HOOK -0512 ; [.20BA.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH HOOK -0521 ; [.20BB.0020.0002] # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK -0520 ; [.20BB.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK -0459 ; [.20BC.0020.0002] # CYRILLIC SMALL LETTER LJE -0409 ; [.20BC.0020.0008] # CYRILLIC CAPITAL LETTER LJE -A665 ; [.20C0.0020.0002] # CYRILLIC SMALL LETTER SOFT EL -A664 ; [.20C0.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EL -0509 ; [.20C1.0020.0002] # CYRILLIC SMALL LETTER KOMI LJE -0508 ; [.20C1.0020.0008] # CYRILLIC CAPITAL LETTER KOMI LJE -0515 ; [.20C2.0020.0002] # CYRILLIC SMALL LETTER LHA -0514 ; [.20C2.0020.0008] # CYRILLIC CAPITAL LETTER LHA -043C ; [.20C3.0020.0002] # CYRILLIC SMALL LETTER EM -2DE8 ; [.20C3.0020.0004] # COMBINING CYRILLIC LETTER EM -041C ; [.20C3.0020.0008] # CYRILLIC CAPITAL LETTER EM -04CE ; [.20C7.0020.0002] # CYRILLIC SMALL LETTER EM WITH TAIL -04CD ; [.20C7.0020.0008] # CYRILLIC CAPITAL LETTER EM WITH TAIL -A667 ; [.20CB.0020.0002] # CYRILLIC SMALL LETTER SOFT EM -A666 ; [.20CB.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EM -043D ; [.20CC.0020.0002] # CYRILLIC SMALL LETTER EN -2DE9 ; [.20CC.0020.0004] # COMBINING CYRILLIC LETTER EN -041D ; [.20CC.0020.0008] # CYRILLIC CAPITAL LETTER EN -1D78 ; [.20CC.0020.0014] # MODIFIER LETTER CYRILLIC EN -0529 ; [.20D0.0020.0002] # CYRILLIC SMALL LETTER EN WITH LEFT HOOK -0528 ; [.20D0.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK -04CA ; [.20D1.0020.0002] # CYRILLIC SMALL LETTER EN WITH TAIL -04C9 ; [.20D1.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH TAIL -04A3 ; [.20D5.0020.0002] # CYRILLIC SMALL LETTER EN WITH DESCENDER -04A2 ; [.20D5.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER -04C8 ; [.20D9.0020.0002] # CYRILLIC SMALL LETTER EN WITH HOOK -04C7 ; [.20D9.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH HOOK -0523 ; [.20DD.0020.0002] # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK -0522 ; [.20DD.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK -04A5 ; [.20DE.0020.0002] # CYRILLIC SMALL LIGATURE EN GHE -04A4 ; [.20DE.0020.0008] # CYRILLIC CAPITAL LIGATURE EN GHE -045A ; [.20E2.0020.0002] # CYRILLIC SMALL LETTER NJE -040A ; [.20E2.0020.0008] # CYRILLIC CAPITAL LETTER NJE -050B ; [.20E6.0020.0002] # CYRILLIC SMALL LETTER KOMI NJE -050A ; [.20E6.0020.0008] # CYRILLIC CAPITAL LETTER KOMI NJE -043E ; [.20E7.0020.0002] # CYRILLIC SMALL LETTER O -1C82 ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER NARROW O -2DEA ; [.20E7.0020.0004] # COMBINING CYRILLIC LETTER O -A669 ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER MONOCULAR O -A66B ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER BINOCULAR O -A66D ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O -A66E ; [.20E7.0020.0004] # CYRILLIC LETTER MULTIOCULAR O -A699 ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER DOUBLE O -A69B ; [.20E7.0020.0004] # CYRILLIC SMALL LETTER CROSSED O -041E ; [.20E7.0020.0008] # CYRILLIC CAPITAL LETTER O -A668 ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER MONOCULAR O -A66A ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER BINOCULAR O -A66C ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O -A698 ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE O -A69A ; [.20E7.0020.000A] # CYRILLIC CAPITAL LETTER CROSSED O -04E7 ; [.20E7.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER O WITH DIAERESIS -04E6 ; [.20E7.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS -04E9 ; [.20EB.0020.0002] # CYRILLIC SMALL LETTER BARRED O -04E8 ; [.20EB.0020.0008] # CYRILLIC CAPITAL LETTER BARRED O -04EB ; [.20EB.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS -04EA ; [.20EB.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS -043F ; [.20EF.0020.0002] # CYRILLIC SMALL LETTER PE -2DEB ; [.20EF.0020.0004] # COMBINING CYRILLIC LETTER PE -041F ; [.20EF.0020.0008] # CYRILLIC CAPITAL LETTER PE -0525 ; [.20F3.0020.0002] # CYRILLIC SMALL LETTER PE WITH DESCENDER -0524 ; [.20F3.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH DESCENDER -04A7 ; [.20F4.0020.0002] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK -04A6 ; [.20F4.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK -0481 ; [.20F8.0020.0002] # CYRILLIC SMALL LETTER KOPPA -0480 ; [.20F8.0020.0008] # CYRILLIC CAPITAL LETTER KOPPA -0440 ; [.20FC.0020.0002] # CYRILLIC SMALL LETTER ER -2DEC ; [.20FC.0020.0004] # COMBINING CYRILLIC LETTER ER -0420 ; [.20FC.0020.0008] # CYRILLIC CAPITAL LETTER ER -048F ; [.2100.0020.0002] # CYRILLIC SMALL LETTER ER WITH TICK -048E ; [.2100.0020.0008] # CYRILLIC CAPITAL LETTER ER WITH TICK -0517 ; [.2104.0020.0002] # CYRILLIC SMALL LETTER RHA -0516 ; [.2104.0020.0008] # CYRILLIC CAPITAL LETTER RHA -0441 ; [.2105.0020.0002] # CYRILLIC SMALL LETTER ES -1C83 ; [.2105.0020.0004] # CYRILLIC SMALL LETTER WIDE ES -2DED ; [.2105.0020.0004] # COMBINING CYRILLIC LETTER ES -0421 ; [.2105.0020.0008] # CYRILLIC CAPITAL LETTER ES -2DF5 ; [.2105.0020.0004][.210E.0020.0004] # COMBINING CYRILLIC LETTER ES-TE -050D ; [.2109.0020.0002] # CYRILLIC SMALL LETTER KOMI SJE -050C ; [.2109.0020.0008] # CYRILLIC CAPITAL LETTER KOMI SJE -04AB ; [.210A.0020.0002] # CYRILLIC SMALL LETTER ES WITH DESCENDER -04AA ; [.210A.0020.0008] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER -0442 ; [.210E.0020.0002] # CYRILLIC SMALL LETTER TE -1C84 ; [.210E.0020.0004] # CYRILLIC SMALL LETTER TALL TE -1C85 ; [.210E.0020.0004] # CYRILLIC SMALL LETTER THREE-LEGGED TE -2DEE ; [.210E.0020.0004] # COMBINING CYRILLIC LETTER TE -0422 ; [.210E.0020.0008] # CYRILLIC CAPITAL LETTER TE -A68D ; [.2112.0020.0002] # CYRILLIC SMALL LETTER TWE -A68C ; [.2112.0020.0008] # CYRILLIC CAPITAL LETTER TWE -050F ; [.2113.0020.0002] # CYRILLIC SMALL LETTER KOMI TJE -050E ; [.2113.0020.0008] # CYRILLIC CAPITAL LETTER KOMI TJE -04AD ; [.2114.0020.0002] # CYRILLIC SMALL LETTER TE WITH DESCENDER -04AC ; [.2114.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER -A68B ; [.2118.0020.0002] # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK -A68A ; [.2118.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK -045B ; [.2119.0020.0002] # CYRILLIC SMALL LETTER TSHE -040B ; [.2119.0020.0008] # CYRILLIC CAPITAL LETTER TSHE -0443 ; [.211D.0020.0002] # CYRILLIC SMALL LETTER U -A677 ; [.211D.0020.0004] # COMBINING CYRILLIC LETTER U -0423 ; [.211D.0020.0008] # CYRILLIC CAPITAL LETTER U -045E ; [.211D.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER SHORT U -040E ; [.211D.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER SHORT U -04F1 ; [.211D.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER U WITH DIAERESIS -04F0 ; [.211D.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS -04F3 ; [.211D.0020.0002][.0000.002C.0002] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE -04F2 ; [.211D.0020.0008][.0000.002C.0002] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE -04EF ; [.211D.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER U WITH MACRON -04EE ; [.211D.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER U WITH MACRON -04AF ; [.2121.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U -04AE ; [.2121.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U -04B1 ; [.2125.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE -04B0 ; [.2125.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE -A64B ; [.2129.0020.0002] # CYRILLIC SMALL LETTER MONOGRAPH UK -1C88 ; [.2129.0020.0004] # CYRILLIC SMALL LETTER UNBLENDED UK -2DF9 ; [.2129.0020.0004] # COMBINING CYRILLIC LETTER MONOGRAPH UK -A64A ; [.2129.0020.0008] # CYRILLIC CAPITAL LETTER MONOGRAPH UK -0479 ; [.212A.0020.0002] # CYRILLIC SMALL LETTER UK -0478 ; [.212A.0020.0008] # CYRILLIC CAPITAL LETTER UK -0444 ; [.212E.0020.0002] # CYRILLIC SMALL LETTER EF -A69E ; [.212E.0020.0004] # COMBINING CYRILLIC LETTER EF -0424 ; [.212E.0020.0008] # CYRILLIC CAPITAL LETTER EF -0445 ; [.2132.0020.0002] # CYRILLIC SMALL LETTER HA -2DEF ; [.2132.0020.0004] # COMBINING CYRILLIC LETTER HA -0425 ; [.2132.0020.0008] # CYRILLIC CAPITAL LETTER HA -04FD ; [.2136.0020.0002] # CYRILLIC SMALL LETTER HA WITH HOOK -04FC ; [.2136.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH HOOK -04FF ; [.213A.0020.0002] # CYRILLIC SMALL LETTER HA WITH STROKE -04FE ; [.213A.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH STROKE -04B3 ; [.213E.0020.0002] # CYRILLIC SMALL LETTER HA WITH DESCENDER -04B2 ; [.213E.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER -04BB ; [.2142.0020.0002] # CYRILLIC SMALL LETTER SHHA -04BA ; [.2142.0020.0008] # CYRILLIC CAPITAL LETTER SHHA -0527 ; [.2146.0020.0002] # CYRILLIC SMALL LETTER SHHA WITH DESCENDER -0526 ; [.2146.0020.0008] # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER -A695 ; [.2147.0020.0002] # CYRILLIC SMALL LETTER HWE -A694 ; [.2147.0020.0008] # CYRILLIC CAPITAL LETTER HWE -0461 ; [.2148.0020.0002] # CYRILLIC SMALL LETTER OMEGA -A67B ; [.2148.0020.0004] # COMBINING CYRILLIC LETTER OMEGA -0460 ; [.2148.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA -047F ; [.214C.0020.0002] # CYRILLIC SMALL LETTER OT -047E ; [.214C.0020.0008] # CYRILLIC CAPITAL LETTER OT -A64D ; [.2150.0020.0002] # CYRILLIC SMALL LETTER BROAD OMEGA -A64C ; [.2150.0020.0008] # CYRILLIC CAPITAL LETTER BROAD OMEGA -047D ; [.2151.0020.0002] # CYRILLIC SMALL LETTER OMEGA WITH TITLO -047C ; [.2151.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO -047B ; [.2155.0020.0002] # CYRILLIC SMALL LETTER ROUND OMEGA -047A ; [.2155.0020.0008] # CYRILLIC CAPITAL LETTER ROUND OMEGA -0446 ; [.2159.0020.0002] # CYRILLIC SMALL LETTER TSE -2DF0 ; [.2159.0020.0004] # COMBINING CYRILLIC LETTER TSE -0426 ; [.2159.0020.0008] # CYRILLIC CAPITAL LETTER TSE -A661 ; [.215D.0020.0002] # CYRILLIC SMALL LETTER REVERSED TSE -A660 ; [.215D.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED TSE -A68F ; [.215E.0020.0002] # CYRILLIC SMALL LETTER TSWE -A68E ; [.215E.0020.0008] # CYRILLIC CAPITAL LETTER TSWE -04B5 ; [.215F.0020.0002] # CYRILLIC SMALL LIGATURE TE TSE -04B4 ; [.215F.0020.0008] # CYRILLIC CAPITAL LIGATURE TE TSE -A691 ; [.2163.0020.0002] # CYRILLIC SMALL LETTER TSSE -A690 ; [.2163.0020.0008] # CYRILLIC CAPITAL LETTER TSSE -0447 ; [.2164.0020.0002] # CYRILLIC SMALL LETTER CHE -2DF1 ; [.2164.0020.0004] # COMBINING CYRILLIC LETTER CHE -0427 ; [.2164.0020.0008] # CYRILLIC CAPITAL LETTER CHE -04F5 ; [.2164.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F4 ; [.2164.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS -052D ; [.2168.0020.0002] # CYRILLIC SMALL LETTER DCHE -052C ; [.2168.0020.0008] # CYRILLIC CAPITAL LETTER DCHE -A693 ; [.2169.0020.0002] # CYRILLIC SMALL LETTER TCHE -A692 ; [.2169.0020.0008] # CYRILLIC CAPITAL LETTER TCHE -04B7 ; [.216A.0020.0002] # CYRILLIC SMALL LETTER CHE WITH DESCENDER -04B6 ; [.216A.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER -04CC ; [.216E.0020.0002] # CYRILLIC SMALL LETTER KHAKASSIAN CHE -04CB ; [.216E.0020.0008] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE -04B9 ; [.2172.0020.0002] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE -04B8 ; [.2172.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE -A687 ; [.2176.0020.0002] # CYRILLIC SMALL LETTER CCHE -A686 ; [.2176.0020.0008] # CYRILLIC CAPITAL LETTER CCHE -04BD ; [.2177.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE -04BC ; [.2177.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE -04BF ; [.217B.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER -04BE ; [.217B.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER -045F ; [.217F.0020.0002] # CYRILLIC SMALL LETTER DZHE -040F ; [.217F.0020.0008] # CYRILLIC CAPITAL LETTER DZHE -0448 ; [.2183.0020.0002] # CYRILLIC SMALL LETTER SHA -2DF2 ; [.2183.0020.0004] # COMBINING CYRILLIC LETTER SHA -0428 ; [.2183.0020.0008] # CYRILLIC CAPITAL LETTER SHA -A697 ; [.2187.0020.0002] # CYRILLIC SMALL LETTER SHWE -A696 ; [.2187.0020.0008] # CYRILLIC CAPITAL LETTER SHWE -0449 ; [.2188.0020.0002] # CYRILLIC SMALL LETTER SHCHA -2DF3 ; [.2188.0020.0004] # COMBINING CYRILLIC LETTER SHCHA -0429 ; [.2188.0020.0008] # CYRILLIC CAPITAL LETTER SHCHA -A64F ; [.218C.0020.0002] # CYRILLIC SMALL LETTER NEUTRAL YER -A64E ; [.218C.0020.0008] # CYRILLIC CAPITAL LETTER NEUTRAL YER -2E2F ; [.218D.0020.0002] # VERTICAL TILDE -A67F ; [.218E.0020.0002] # CYRILLIC PAYEROK -044A ; [.218F.0020.0002] # CYRILLIC SMALL LETTER HARD SIGN -1C86 ; [.218F.0020.0004] # CYRILLIC SMALL LETTER TALL HARD SIGN -A678 ; [.218F.0020.0004] # COMBINING CYRILLIC LETTER HARD SIGN -042A ; [.218F.0020.0008] # CYRILLIC CAPITAL LETTER HARD SIGN -A69C ; [.218F.0020.0014] # MODIFIER LETTER CYRILLIC HARD SIGN -A651 ; [.2193.0020.0002] # CYRILLIC SMALL LETTER YERU WITH BACK YER -A650 ; [.2193.0020.0008] # CYRILLIC CAPITAL LETTER YERU WITH BACK YER -044B ; [.2194.0020.0002] # CYRILLIC SMALL LETTER YERU -A679 ; [.2194.0020.0004] # COMBINING CYRILLIC LETTER YERU -042B ; [.2194.0020.0008] # CYRILLIC CAPITAL LETTER YERU -04F9 ; [.2194.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS -04F8 ; [.2194.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS -044C ; [.2198.0020.0002] # CYRILLIC SMALL LETTER SOFT SIGN -A67A ; [.2198.0020.0004] # COMBINING CYRILLIC LETTER SOFT SIGN -042C ; [.2198.0020.0008] # CYRILLIC CAPITAL LETTER SOFT SIGN -A69D ; [.2198.0020.0014] # MODIFIER LETTER CYRILLIC SOFT SIGN -048D ; [.219C.0020.0002] # CYRILLIC SMALL LETTER SEMISOFT SIGN -048C ; [.219C.0020.0008] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN -0463 ; [.21A0.0020.0002] # CYRILLIC SMALL LETTER YAT -1C87 ; [.21A0.0020.0004] # CYRILLIC SMALL LETTER TALL YAT -2DFA ; [.21A0.0020.0004] # COMBINING CYRILLIC LETTER YAT -0462 ; [.21A0.0020.0008] # CYRILLIC CAPITAL LETTER YAT -A653 ; [.21A4.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED YAT -A652 ; [.21A4.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED YAT -044D ; [.21A5.0020.0002] # CYRILLIC SMALL LETTER E -042D ; [.21A5.0020.0008] # CYRILLIC CAPITAL LETTER E -04ED ; [.21A5.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER E WITH DIAERESIS -04EC ; [.21A5.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS -044E ; [.21A9.0020.0002] # CYRILLIC SMALL LETTER YU -2DFB ; [.21A9.0020.0004] # COMBINING CYRILLIC LETTER YU -042E ; [.21A9.0020.0008] # CYRILLIC CAPITAL LETTER YU -A655 ; [.21AD.0020.0002] # CYRILLIC SMALL LETTER REVERSED YU -A654 ; [.21AD.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED YU -A657 ; [.21AE.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED A -2DFC ; [.21AE.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED A -A656 ; [.21AE.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED A -044F ; [.21AF.0020.0002] # CYRILLIC SMALL LETTER YA -042F ; [.21AF.0020.0008] # CYRILLIC CAPITAL LETTER YA -0519 ; [.21B3.0020.0002] # CYRILLIC SMALL LETTER YAE -0518 ; [.21B3.0020.0008] # CYRILLIC CAPITAL LETTER YAE -0465 ; [.21B4.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED E -A69F ; [.21B4.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED E -0464 ; [.21B4.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED E -0467 ; [.21B8.0020.0002] # CYRILLIC SMALL LETTER LITTLE YUS -2DFD ; [.21B8.0020.0004] # COMBINING CYRILLIC LETTER LITTLE YUS -0466 ; [.21B8.0020.0008] # CYRILLIC CAPITAL LETTER LITTLE YUS -A659 ; [.21BC.0020.0002] # CYRILLIC SMALL LETTER CLOSED LITTLE YUS -A658 ; [.21BC.0020.0008] # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS -046B ; [.21BD.0020.0002] # CYRILLIC SMALL LETTER BIG YUS -2DFE ; [.21BD.0020.0004] # COMBINING CYRILLIC LETTER BIG YUS -046A ; [.21BD.0020.0008] # CYRILLIC CAPITAL LETTER BIG YUS -A65B ; [.21C1.0020.0002] # CYRILLIC SMALL LETTER BLENDED YUS -A65A ; [.21C1.0020.0008] # CYRILLIC CAPITAL LETTER BLENDED YUS -0469 ; [.21C2.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS -0468 ; [.21C2.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS -A65D ; [.21C6.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS -A65C ; [.21C6.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS -046D ; [.21C7.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS -2DFF ; [.21C7.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -046C ; [.21C7.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS -046F ; [.21CB.0020.0002] # CYRILLIC SMALL LETTER KSI -046E ; [.21CB.0020.0008] # CYRILLIC CAPITAL LETTER KSI -0471 ; [.21CF.0020.0002] # CYRILLIC SMALL LETTER PSI -0470 ; [.21CF.0020.0008] # CYRILLIC CAPITAL LETTER PSI -0473 ; [.21D3.0020.0002] # CYRILLIC SMALL LETTER FITA -2DF4 ; [.21D3.0020.0004] # COMBINING CYRILLIC LETTER FITA -0472 ; [.21D3.0020.0008] # CYRILLIC CAPITAL LETTER FITA -0475 ; [.21D7.0020.0002] # CYRILLIC SMALL LETTER IZHITSA -0474 ; [.21D7.0020.0008] # CYRILLIC CAPITAL LETTER IZHITSA -0477 ; [.21D7.0020.0002][.0000.003C.0002] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -0476 ; [.21D7.0020.0008][.0000.003C.0002] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -A65F ; [.21DB.0020.0002] # CYRILLIC SMALL LETTER YN -A65E ; [.21DB.0020.0008] # CYRILLIC CAPITAL LETTER YN -04A9 ; [.21DC.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN HA -04A8 ; [.21DC.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN HA -051D ; [.21E0.0020.0002] # CYRILLIC SMALL LETTER WE -051C ; [.21E0.0020.0008] # CYRILLIC CAPITAL LETTER WE -04CF ; [.21E1.0020.0002] # CYRILLIC SMALL LETTER PALOCHKA -04C0 ; [.21E1.0020.0008] # CYRILLIC LETTER PALOCHKA -2C30 ; [.21E5.0020.0002] # GLAGOLITIC SMALL LETTER AZU -1E000 ; [.21E5.0020.0004] # COMBINING GLAGOLITIC LETTER AZU -2C00 ; [.21E5.0020.0008] # GLAGOLITIC CAPITAL LETTER AZU -2C31 ; [.21E6.0020.0002] # GLAGOLITIC SMALL LETTER BUKY -1E001 ; [.21E6.0020.0004] # COMBINING GLAGOLITIC LETTER BUKY -2C01 ; [.21E6.0020.0008] # GLAGOLITIC CAPITAL LETTER BUKY -2C32 ; [.21E7.0020.0002] # GLAGOLITIC SMALL LETTER VEDE -1E002 ; [.21E7.0020.0004] # COMBINING GLAGOLITIC LETTER VEDE -2C02 ; [.21E7.0020.0008] # GLAGOLITIC CAPITAL LETTER VEDE -2C33 ; [.21E8.0020.0002] # GLAGOLITIC SMALL LETTER GLAGOLI -1E003 ; [.21E8.0020.0004] # COMBINING GLAGOLITIC LETTER GLAGOLI -2C03 ; [.21E8.0020.0008] # GLAGOLITIC CAPITAL LETTER GLAGOLI -2C34 ; [.21E9.0020.0002] # GLAGOLITIC SMALL LETTER DOBRO -1E004 ; [.21E9.0020.0004] # COMBINING GLAGOLITIC LETTER DOBRO -2C04 ; [.21E9.0020.0008] # GLAGOLITIC CAPITAL LETTER DOBRO -2C35 ; [.21EA.0020.0002] # GLAGOLITIC SMALL LETTER YESTU -1E005 ; [.21EA.0020.0004] # COMBINING GLAGOLITIC LETTER YESTU -2C05 ; [.21EA.0020.0008] # GLAGOLITIC CAPITAL LETTER YESTU -2C36 ; [.21EB.0020.0002] # GLAGOLITIC SMALL LETTER ZHIVETE -1E006 ; [.21EB.0020.0004] # COMBINING GLAGOLITIC LETTER ZHIVETE -2C06 ; [.21EB.0020.0008] # GLAGOLITIC CAPITAL LETTER ZHIVETE -2C37 ; [.21EC.0020.0002] # GLAGOLITIC SMALL LETTER DZELO -2C07 ; [.21EC.0020.0008] # GLAGOLITIC CAPITAL LETTER DZELO -2C38 ; [.21ED.0020.0002] # GLAGOLITIC SMALL LETTER ZEMLJA -1E008 ; [.21ED.0020.0004] # COMBINING GLAGOLITIC LETTER ZEMLJA -2C08 ; [.21ED.0020.0008] # GLAGOLITIC CAPITAL LETTER ZEMLJA -2C39 ; [.21EE.0020.0002] # GLAGOLITIC SMALL LETTER IZHE -1E009 ; [.21EE.0020.0004] # COMBINING GLAGOLITIC LETTER IZHE -2C09 ; [.21EE.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHE -2C3A ; [.21EF.0020.0002] # GLAGOLITIC SMALL LETTER INITIAL IZHE -1E00A ; [.21EF.0020.0004] # COMBINING GLAGOLITIC LETTER INITIAL IZHE -2C0A ; [.21EF.0020.0008] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE -2C3B ; [.21F0.0020.0002] # GLAGOLITIC SMALL LETTER I -1E00B ; [.21F0.0020.0004] # COMBINING GLAGOLITIC LETTER I -2C0B ; [.21F0.0020.0008] # GLAGOLITIC CAPITAL LETTER I -2C3C ; [.21F1.0020.0002] # GLAGOLITIC SMALL LETTER DJERVI -1E00C ; [.21F1.0020.0004] # COMBINING GLAGOLITIC LETTER DJERVI -2C0C ; [.21F1.0020.0008] # GLAGOLITIC CAPITAL LETTER DJERVI -2C3D ; [.21F2.0020.0002] # GLAGOLITIC SMALL LETTER KAKO -1E00D ; [.21F2.0020.0004] # COMBINING GLAGOLITIC LETTER KAKO -2C0D ; [.21F2.0020.0008] # GLAGOLITIC CAPITAL LETTER KAKO -2C3E ; [.21F3.0020.0002] # GLAGOLITIC SMALL LETTER LJUDIJE -1E00E ; [.21F3.0020.0004] # COMBINING GLAGOLITIC LETTER LJUDIJE -2C0E ; [.21F3.0020.0008] # GLAGOLITIC CAPITAL LETTER LJUDIJE -2C3F ; [.21F4.0020.0002] # GLAGOLITIC SMALL LETTER MYSLITE -1E00F ; [.21F4.0020.0004] # COMBINING GLAGOLITIC LETTER MYSLITE -2C0F ; [.21F4.0020.0008] # GLAGOLITIC CAPITAL LETTER MYSLITE -2C40 ; [.21F5.0020.0002] # GLAGOLITIC SMALL LETTER NASHI -1E010 ; [.21F5.0020.0004] # COMBINING GLAGOLITIC LETTER NASHI -2C10 ; [.21F5.0020.0008] # GLAGOLITIC CAPITAL LETTER NASHI -2C41 ; [.21F6.0020.0002] # GLAGOLITIC SMALL LETTER ONU -1E011 ; [.21F6.0020.0004] # COMBINING GLAGOLITIC LETTER ONU -2C11 ; [.21F6.0020.0008] # GLAGOLITIC CAPITAL LETTER ONU -2C42 ; [.21F7.0020.0002] # GLAGOLITIC SMALL LETTER POKOJI -1E012 ; [.21F7.0020.0004] # COMBINING GLAGOLITIC LETTER POKOJI -2C12 ; [.21F7.0020.0008] # GLAGOLITIC CAPITAL LETTER POKOJI -2C43 ; [.21F8.0020.0002] # GLAGOLITIC SMALL LETTER RITSI -1E013 ; [.21F8.0020.0004] # COMBINING GLAGOLITIC LETTER RITSI -2C13 ; [.21F8.0020.0008] # GLAGOLITIC CAPITAL LETTER RITSI -2C44 ; [.21F9.0020.0002] # GLAGOLITIC SMALL LETTER SLOVO -1E014 ; [.21F9.0020.0004] # COMBINING GLAGOLITIC LETTER SLOVO -2C14 ; [.21F9.0020.0008] # GLAGOLITIC CAPITAL LETTER SLOVO -2C45 ; [.21FA.0020.0002] # GLAGOLITIC SMALL LETTER TVRIDO -1E015 ; [.21FA.0020.0004] # COMBINING GLAGOLITIC LETTER TVRIDO -2C15 ; [.21FA.0020.0008] # GLAGOLITIC CAPITAL LETTER TVRIDO -2C46 ; [.21FB.0020.0002] # GLAGOLITIC SMALL LETTER UKU -1E016 ; [.21FB.0020.0004] # COMBINING GLAGOLITIC LETTER UKU -2C16 ; [.21FB.0020.0008] # GLAGOLITIC CAPITAL LETTER UKU -2C47 ; [.21FC.0020.0002] # GLAGOLITIC SMALL LETTER FRITU -1E017 ; [.21FC.0020.0004] # COMBINING GLAGOLITIC LETTER FRITU -2C17 ; [.21FC.0020.0008] # GLAGOLITIC CAPITAL LETTER FRITU -2C48 ; [.21FD.0020.0002] # GLAGOLITIC SMALL LETTER HERU -1E018 ; [.21FD.0020.0004] # COMBINING GLAGOLITIC LETTER HERU -2C18 ; [.21FD.0020.0008] # GLAGOLITIC CAPITAL LETTER HERU -2C49 ; [.21FE.0020.0002] # GLAGOLITIC SMALL LETTER OTU -2C19 ; [.21FE.0020.0008] # GLAGOLITIC CAPITAL LETTER OTU -2C4A ; [.21FF.0020.0002] # GLAGOLITIC SMALL LETTER PE -2C1A ; [.21FF.0020.0008] # GLAGOLITIC CAPITAL LETTER PE -2C4B ; [.2200.0020.0002] # GLAGOLITIC SMALL LETTER SHTA -1E01B ; [.2200.0020.0004] # COMBINING GLAGOLITIC LETTER SHTA -2C1B ; [.2200.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTA -2C4C ; [.2201.0020.0002] # GLAGOLITIC SMALL LETTER TSI -1E01C ; [.2201.0020.0004] # COMBINING GLAGOLITIC LETTER TSI -2C1C ; [.2201.0020.0008] # GLAGOLITIC CAPITAL LETTER TSI -2C4D ; [.2202.0020.0002] # GLAGOLITIC SMALL LETTER CHRIVI -1E01D ; [.2202.0020.0004] # COMBINING GLAGOLITIC LETTER CHRIVI -2C1D ; [.2202.0020.0008] # GLAGOLITIC CAPITAL LETTER CHRIVI -2C4E ; [.2203.0020.0002] # GLAGOLITIC SMALL LETTER SHA -1E01E ; [.2203.0020.0004] # COMBINING GLAGOLITIC LETTER SHA -2C1E ; [.2203.0020.0008] # GLAGOLITIC CAPITAL LETTER SHA -2C4F ; [.2204.0020.0002] # GLAGOLITIC SMALL LETTER YERU -1E01F ; [.2204.0020.0004] # COMBINING GLAGOLITIC LETTER YERU -2C1F ; [.2204.0020.0008] # GLAGOLITIC CAPITAL LETTER YERU -2C50 ; [.2205.0020.0002] # GLAGOLITIC SMALL LETTER YERI -1E020 ; [.2205.0020.0004] # COMBINING GLAGOLITIC LETTER YERI -2C20 ; [.2205.0020.0008] # GLAGOLITIC CAPITAL LETTER YERI -2C51 ; [.2206.0020.0002] # GLAGOLITIC SMALL LETTER YATI -1E021 ; [.2206.0020.0004] # COMBINING GLAGOLITIC LETTER YATI -2C21 ; [.2206.0020.0008] # GLAGOLITIC CAPITAL LETTER YATI -2C52 ; [.2207.0020.0002] # GLAGOLITIC SMALL LETTER SPIDERY HA -2C22 ; [.2207.0020.0008] # GLAGOLITIC CAPITAL LETTER SPIDERY HA -2C53 ; [.2208.0020.0002] # GLAGOLITIC SMALL LETTER YU -1E023 ; [.2208.0020.0004] # COMBINING GLAGOLITIC LETTER YU -2C23 ; [.2208.0020.0008] # GLAGOLITIC CAPITAL LETTER YU -2C54 ; [.2209.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS -1E024 ; [.2209.0020.0004] # COMBINING GLAGOLITIC LETTER SMALL YUS -2C24 ; [.2209.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS -2C55 ; [.220A.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL -2C25 ; [.220A.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL -2C56 ; [.220B.0020.0002] # GLAGOLITIC SMALL LETTER YO -1E026 ; [.220B.0020.0004] # COMBINING GLAGOLITIC LETTER YO -2C26 ; [.220B.0020.0008] # GLAGOLITIC CAPITAL LETTER YO -2C57 ; [.220C.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS -1E027 ; [.220C.0020.0004] # COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS -2C27 ; [.220C.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS -2C58 ; [.220D.0020.0002] # GLAGOLITIC SMALL LETTER BIG YUS -1E028 ; [.220D.0020.0004] # COMBINING GLAGOLITIC LETTER BIG YUS -2C28 ; [.220D.0020.0008] # GLAGOLITIC CAPITAL LETTER BIG YUS -2C59 ; [.220E.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS -1E029 ; [.220E.0020.0004] # COMBINING GLAGOLITIC LETTER IOTATED BIG YUS -2C29 ; [.220E.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS -2C5A ; [.220F.0020.0002] # GLAGOLITIC SMALL LETTER FITA -1E02A ; [.220F.0020.0004] # COMBINING GLAGOLITIC LETTER FITA -2C2A ; [.220F.0020.0008] # GLAGOLITIC CAPITAL LETTER FITA -2C5B ; [.2210.0020.0002] # GLAGOLITIC SMALL LETTER IZHITSA -2C2B ; [.2210.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHITSA -2C5C ; [.2211.0020.0002] # GLAGOLITIC SMALL LETTER SHTAPIC -2C2C ; [.2211.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTAPIC -2C5D ; [.2212.0020.0002] # GLAGOLITIC SMALL LETTER TROKUTASTI A -2C2D ; [.2212.0020.0008] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A -2C5E ; [.2213.0020.0002] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE -2C2E ; [.2213.0020.0008] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE -10350 ; [.2214.0020.0002] # OLD PERMIC LETTER AN -10376 ; [.2214.0020.0004] # COMBINING OLD PERMIC LETTER AN -10351 ; [.2215.0020.0002] # OLD PERMIC LETTER BUR -10352 ; [.2216.0020.0002] # OLD PERMIC LETTER GAI -10353 ; [.2217.0020.0002] # OLD PERMIC LETTER DOI -10377 ; [.2217.0020.0004] # COMBINING OLD PERMIC LETTER DOI -10354 ; [.2218.0020.0002] # OLD PERMIC LETTER E -10355 ; [.2219.0020.0002] # OLD PERMIC LETTER ZHOI -10356 ; [.221A.0020.0002] # OLD PERMIC LETTER DZHOI -10357 ; [.221B.0020.0002] # OLD PERMIC LETTER ZATA -10378 ; [.221B.0020.0004] # COMBINING OLD PERMIC LETTER ZATA -10358 ; [.221C.0020.0002] # OLD PERMIC LETTER DZITA -10359 ; [.221D.0020.0002] # OLD PERMIC LETTER I -1035A ; [.221E.0020.0002] # OLD PERMIC LETTER KOKE -1035B ; [.221F.0020.0002] # OLD PERMIC LETTER LEI -1035C ; [.2220.0020.0002] # OLD PERMIC LETTER MENOE -1035D ; [.2221.0020.0002] # OLD PERMIC LETTER NENOE -10379 ; [.2221.0020.0004] # COMBINING OLD PERMIC LETTER NENOE -1035E ; [.2222.0020.0002] # OLD PERMIC LETTER VOOI -1035F ; [.2223.0020.0002] # OLD PERMIC LETTER PEEI -10360 ; [.2224.0020.0002] # OLD PERMIC LETTER REI -10361 ; [.2225.0020.0002] # OLD PERMIC LETTER SII -1037A ; [.2225.0020.0004] # COMBINING OLD PERMIC LETTER SII -10362 ; [.2226.0020.0002] # OLD PERMIC LETTER TAI -10363 ; [.2227.0020.0002] # OLD PERMIC LETTER U -10364 ; [.2228.0020.0002] # OLD PERMIC LETTER CHERY -10365 ; [.2229.0020.0002] # OLD PERMIC LETTER SHOOI -10366 ; [.222A.0020.0002] # OLD PERMIC LETTER SHCHOOI -10367 ; [.222B.0020.0002] # OLD PERMIC LETTER YRY -10368 ; [.222C.0020.0002] # OLD PERMIC LETTER YERU -10369 ; [.222D.0020.0002] # OLD PERMIC LETTER O -1036A ; [.222E.0020.0002] # OLD PERMIC LETTER OO -1036B ; [.222F.0020.0002] # OLD PERMIC LETTER EF -1036C ; [.2230.0020.0002] # OLD PERMIC LETTER HA -1036D ; [.2231.0020.0002] # OLD PERMIC LETTER TSIU -1036E ; [.2232.0020.0002] # OLD PERMIC LETTER VER -1036F ; [.2233.0020.0002] # OLD PERMIC LETTER YER -10370 ; [.2234.0020.0002] # OLD PERMIC LETTER YERI -10371 ; [.2235.0020.0002] # OLD PERMIC LETTER YAT -10372 ; [.2236.0020.0002] # OLD PERMIC LETTER IE -10373 ; [.2237.0020.0002] # OLD PERMIC LETTER YU -10374 ; [.2238.0020.0002] # OLD PERMIC LETTER YA -10375 ; [.2239.0020.0002] # OLD PERMIC LETTER IA -10D0 ; [.223A.0020.0002] # GEORGIAN LETTER AN -2D00 ; [.223B.0020.0002] # GEORGIAN SMALL LETTER AN -10A0 ; [.223B.0020.0008] # GEORGIAN CAPITAL LETTER AN -10D1 ; [.223C.0020.0002] # GEORGIAN LETTER BAN -2D01 ; [.223D.0020.0002] # GEORGIAN SMALL LETTER BAN -10A1 ; [.223D.0020.0008] # GEORGIAN CAPITAL LETTER BAN -10D2 ; [.223E.0020.0002] # GEORGIAN LETTER GAN -2D02 ; [.223F.0020.0002] # GEORGIAN SMALL LETTER GAN -10A2 ; [.223F.0020.0008] # GEORGIAN CAPITAL LETTER GAN -10D3 ; [.2240.0020.0002] # GEORGIAN LETTER DON -2D03 ; [.2241.0020.0002] # GEORGIAN SMALL LETTER DON -10A3 ; [.2241.0020.0008] # GEORGIAN CAPITAL LETTER DON -10D4 ; [.2242.0020.0002] # GEORGIAN LETTER EN -2D04 ; [.2243.0020.0002] # GEORGIAN SMALL LETTER EN -10A4 ; [.2243.0020.0008] # GEORGIAN CAPITAL LETTER EN -10D5 ; [.2244.0020.0002] # GEORGIAN LETTER VIN -2D05 ; [.2245.0020.0002] # GEORGIAN SMALL LETTER VIN -10A5 ; [.2245.0020.0008] # GEORGIAN CAPITAL LETTER VIN -10D6 ; [.2246.0020.0002] # GEORGIAN LETTER ZEN -2D06 ; [.2247.0020.0002] # GEORGIAN SMALL LETTER ZEN -10A6 ; [.2247.0020.0008] # GEORGIAN CAPITAL LETTER ZEN -10F1 ; [.2248.0020.0002] # GEORGIAN LETTER HE -2D21 ; [.2249.0020.0002] # GEORGIAN SMALL LETTER HE -10C1 ; [.2249.0020.0008] # GEORGIAN CAPITAL LETTER HE -10D7 ; [.224A.0020.0002] # GEORGIAN LETTER TAN -2D07 ; [.224B.0020.0002] # GEORGIAN SMALL LETTER TAN -10A7 ; [.224B.0020.0008] # GEORGIAN CAPITAL LETTER TAN -10D8 ; [.224C.0020.0002] # GEORGIAN LETTER IN -2D08 ; [.224D.0020.0002] # GEORGIAN SMALL LETTER IN -10A8 ; [.224D.0020.0008] # GEORGIAN CAPITAL LETTER IN -10D9 ; [.224E.0020.0002] # GEORGIAN LETTER KAN -2D09 ; [.224F.0020.0002] # GEORGIAN SMALL LETTER KAN -10A9 ; [.224F.0020.0008] # GEORGIAN CAPITAL LETTER KAN -10DA ; [.2250.0020.0002] # GEORGIAN LETTER LAS -2D0A ; [.2251.0020.0002] # GEORGIAN SMALL LETTER LAS -10AA ; [.2251.0020.0008] # GEORGIAN CAPITAL LETTER LAS -10DB ; [.2252.0020.0002] # GEORGIAN LETTER MAN -2D0B ; [.2253.0020.0002] # GEORGIAN SMALL LETTER MAN -10AB ; [.2253.0020.0008] # GEORGIAN CAPITAL LETTER MAN -10DC ; [.2254.0020.0002] # GEORGIAN LETTER NAR -10FC ; [.2254.0020.0014] # MODIFIER LETTER GEORGIAN NAR -2D0C ; [.2255.0020.0002] # GEORGIAN SMALL LETTER NAR -10AC ; [.2255.0020.0008] # GEORGIAN CAPITAL LETTER NAR -10F2 ; [.2256.0020.0002] # GEORGIAN LETTER HIE -2D22 ; [.2257.0020.0002] # GEORGIAN SMALL LETTER HIE -10C2 ; [.2257.0020.0008] # GEORGIAN CAPITAL LETTER HIE -10DD ; [.2258.0020.0002] # GEORGIAN LETTER ON -2D0D ; [.2259.0020.0002] # GEORGIAN SMALL LETTER ON -10AD ; [.2259.0020.0008] # GEORGIAN CAPITAL LETTER ON -10DE ; [.225A.0020.0002] # GEORGIAN LETTER PAR -2D0E ; [.225B.0020.0002] # GEORGIAN SMALL LETTER PAR -10AE ; [.225B.0020.0008] # GEORGIAN CAPITAL LETTER PAR -10DF ; [.225C.0020.0002] # GEORGIAN LETTER ZHAR -2D0F ; [.225D.0020.0002] # GEORGIAN SMALL LETTER ZHAR -10AF ; [.225D.0020.0008] # GEORGIAN CAPITAL LETTER ZHAR -10E0 ; [.225E.0020.0002] # GEORGIAN LETTER RAE -2D10 ; [.225F.0020.0002] # GEORGIAN SMALL LETTER RAE -10B0 ; [.225F.0020.0008] # GEORGIAN CAPITAL LETTER RAE -10E1 ; [.2260.0020.0002] # GEORGIAN LETTER SAN -2D11 ; [.2261.0020.0002] # GEORGIAN SMALL LETTER SAN -10B1 ; [.2261.0020.0008] # GEORGIAN CAPITAL LETTER SAN -10E2 ; [.2262.0020.0002] # GEORGIAN LETTER TAR -2D12 ; [.2263.0020.0002] # GEORGIAN SMALL LETTER TAR -10B2 ; [.2263.0020.0008] # GEORGIAN CAPITAL LETTER TAR -10F3 ; [.2264.0020.0002] # GEORGIAN LETTER WE -2D23 ; [.2265.0020.0002] # GEORGIAN SMALL LETTER WE -10C3 ; [.2265.0020.0008] # GEORGIAN CAPITAL LETTER WE -10E3 ; [.2266.0020.0002] # GEORGIAN LETTER UN -2D13 ; [.2267.0020.0002] # GEORGIAN SMALL LETTER UN -10B3 ; [.2267.0020.0008] # GEORGIAN CAPITAL LETTER UN -10E4 ; [.2268.0020.0002] # GEORGIAN LETTER PHAR -2D14 ; [.2269.0020.0002] # GEORGIAN SMALL LETTER PHAR -10B4 ; [.2269.0020.0008] # GEORGIAN CAPITAL LETTER PHAR -10E5 ; [.226A.0020.0002] # GEORGIAN LETTER KHAR -2D15 ; [.226B.0020.0002] # GEORGIAN SMALL LETTER KHAR -10B5 ; [.226B.0020.0008] # GEORGIAN CAPITAL LETTER KHAR -10E6 ; [.226C.0020.0002] # GEORGIAN LETTER GHAN -2D16 ; [.226D.0020.0002] # GEORGIAN SMALL LETTER GHAN -10B6 ; [.226D.0020.0008] # GEORGIAN CAPITAL LETTER GHAN -10E7 ; [.226E.0020.0002] # GEORGIAN LETTER QAR -2D17 ; [.226F.0020.0002] # GEORGIAN SMALL LETTER QAR -10B7 ; [.226F.0020.0008] # GEORGIAN CAPITAL LETTER QAR -10E8 ; [.2270.0020.0002] # GEORGIAN LETTER SHIN -2D18 ; [.2271.0020.0002] # GEORGIAN SMALL LETTER SHIN -10B8 ; [.2271.0020.0008] # GEORGIAN CAPITAL LETTER SHIN -10E9 ; [.2272.0020.0002] # GEORGIAN LETTER CHIN -2D19 ; [.2273.0020.0002] # GEORGIAN SMALL LETTER CHIN -10B9 ; [.2273.0020.0008] # GEORGIAN CAPITAL LETTER CHIN -10EA ; [.2274.0020.0002] # GEORGIAN LETTER CAN -2D1A ; [.2275.0020.0002] # GEORGIAN SMALL LETTER CAN -10BA ; [.2275.0020.0008] # GEORGIAN CAPITAL LETTER CAN -10EB ; [.2276.0020.0002] # GEORGIAN LETTER JIL -2D1B ; [.2277.0020.0002] # GEORGIAN SMALL LETTER JIL -10BB ; [.2277.0020.0008] # GEORGIAN CAPITAL LETTER JIL -10EC ; [.2278.0020.0002] # GEORGIAN LETTER CIL -2D1C ; [.2279.0020.0002] # GEORGIAN SMALL LETTER CIL -10BC ; [.2279.0020.0008] # GEORGIAN CAPITAL LETTER CIL -10ED ; [.227A.0020.0002] # GEORGIAN LETTER CHAR -2D1D ; [.227B.0020.0002] # GEORGIAN SMALL LETTER CHAR -10BD ; [.227B.0020.0008] # GEORGIAN CAPITAL LETTER CHAR -10EE ; [.227C.0020.0002] # GEORGIAN LETTER XAN -2D1E ; [.227D.0020.0002] # GEORGIAN SMALL LETTER XAN -10BE ; [.227D.0020.0008] # GEORGIAN CAPITAL LETTER XAN -10F4 ; [.227E.0020.0002] # GEORGIAN LETTER HAR -2D24 ; [.227F.0020.0002] # GEORGIAN SMALL LETTER HAR -10C4 ; [.227F.0020.0008] # GEORGIAN CAPITAL LETTER HAR -10EF ; [.2280.0020.0002] # GEORGIAN LETTER JHAN -2D1F ; [.2281.0020.0002] # GEORGIAN SMALL LETTER JHAN -10BF ; [.2281.0020.0008] # GEORGIAN CAPITAL LETTER JHAN -10F0 ; [.2282.0020.0002] # GEORGIAN LETTER HAE -2D20 ; [.2283.0020.0002] # GEORGIAN SMALL LETTER HAE -10C0 ; [.2283.0020.0008] # GEORGIAN CAPITAL LETTER HAE -10F5 ; [.2284.0020.0002] # GEORGIAN LETTER HOE -2D25 ; [.2285.0020.0002] # GEORGIAN SMALL LETTER HOE -10C5 ; [.2285.0020.0008] # GEORGIAN CAPITAL LETTER HOE -10F6 ; [.2286.0020.0002] # GEORGIAN LETTER FI -10F7 ; [.2287.0020.0002] # GEORGIAN LETTER YN -2D27 ; [.2288.0020.0002] # GEORGIAN SMALL LETTER YN -10C7 ; [.2288.0020.0008] # GEORGIAN CAPITAL LETTER YN -10F8 ; [.2289.0020.0002] # GEORGIAN LETTER ELIFI -10F9 ; [.228A.0020.0002] # GEORGIAN LETTER TURNED GAN -10FA ; [.228B.0020.0002] # GEORGIAN LETTER AIN -10FD ; [.228C.0020.0002] # GEORGIAN LETTER AEN -2D2D ; [.228D.0020.0002] # GEORGIAN SMALL LETTER AEN -10CD ; [.228D.0020.0008] # GEORGIAN CAPITAL LETTER AEN -10FE ; [.228E.0020.0002] # GEORGIAN LETTER HARD SIGN -10FF ; [.228F.0020.0002] # GEORGIAN LETTER LABIAL SIGN -0561 ; [.2290.0020.0002] # ARMENIAN SMALL LETTER AYB -0531 ; [.2290.0020.0008] # ARMENIAN CAPITAL LETTER AYB -0562 ; [.2291.0020.0002] # ARMENIAN SMALL LETTER BEN -0532 ; [.2291.0020.0008] # ARMENIAN CAPITAL LETTER BEN -0563 ; [.2292.0020.0002] # ARMENIAN SMALL LETTER GIM -0533 ; [.2292.0020.0008] # ARMENIAN CAPITAL LETTER GIM -0564 ; [.2293.0020.0002] # ARMENIAN SMALL LETTER DA -0534 ; [.2293.0020.0008] # ARMENIAN CAPITAL LETTER DA -0565 ; [.2294.0020.0002] # ARMENIAN SMALL LETTER ECH -0535 ; [.2294.0020.0008] # ARMENIAN CAPITAL LETTER ECH -0587 ; [.2294.0020.0004][.22B1.0020.0004] # ARMENIAN SMALL LIGATURE ECH YIWN -0566 ; [.2295.0020.0002] # ARMENIAN SMALL LETTER ZA -0536 ; [.2295.0020.0008] # ARMENIAN CAPITAL LETTER ZA -0567 ; [.2296.0020.0002] # ARMENIAN SMALL LETTER EH -0537 ; [.2296.0020.0008] # ARMENIAN CAPITAL LETTER EH -0568 ; [.2297.0020.0002] # ARMENIAN SMALL LETTER ET -0538 ; [.2297.0020.0008] # ARMENIAN CAPITAL LETTER ET -0569 ; [.2298.0020.0002] # ARMENIAN SMALL LETTER TO -0539 ; [.2298.0020.0008] # ARMENIAN CAPITAL LETTER TO -056A ; [.2299.0020.0002] # ARMENIAN SMALL LETTER ZHE -053A ; [.2299.0020.0008] # ARMENIAN CAPITAL LETTER ZHE -056B ; [.229A.0020.0002] # ARMENIAN SMALL LETTER INI -053B ; [.229A.0020.0008] # ARMENIAN CAPITAL LETTER INI -056C ; [.229B.0020.0002] # ARMENIAN SMALL LETTER LIWN -053C ; [.229B.0020.0008] # ARMENIAN CAPITAL LETTER LIWN -056D ; [.229C.0020.0002] # ARMENIAN SMALL LETTER XEH -053D ; [.229C.0020.0008] # ARMENIAN CAPITAL LETTER XEH -056E ; [.229D.0020.0002] # ARMENIAN SMALL LETTER CA -053E ; [.229D.0020.0008] # ARMENIAN CAPITAL LETTER CA -056F ; [.229E.0020.0002] # ARMENIAN SMALL LETTER KEN -053F ; [.229E.0020.0008] # ARMENIAN CAPITAL LETTER KEN -0570 ; [.229F.0020.0002] # ARMENIAN SMALL LETTER HO -0540 ; [.229F.0020.0008] # ARMENIAN CAPITAL LETTER HO -0571 ; [.22A0.0020.0002] # ARMENIAN SMALL LETTER JA -0541 ; [.22A0.0020.0008] # ARMENIAN CAPITAL LETTER JA -0572 ; [.22A1.0020.0002] # ARMENIAN SMALL LETTER GHAD -0542 ; [.22A1.0020.0008] # ARMENIAN CAPITAL LETTER GHAD -0573 ; [.22A2.0020.0002] # ARMENIAN SMALL LETTER CHEH -0543 ; [.22A2.0020.0008] # ARMENIAN CAPITAL LETTER CHEH -0574 ; [.22A3.0020.0002] # ARMENIAN SMALL LETTER MEN -0544 ; [.22A3.0020.0008] # ARMENIAN CAPITAL LETTER MEN -FB14 ; [.22A3.0020.0004][.2294.0020.0004] # ARMENIAN SMALL LIGATURE MEN ECH -FB15 ; [.22A3.0020.0004][.229A.0020.0004] # ARMENIAN SMALL LIGATURE MEN INI -FB17 ; [.22A3.0020.0004][.229C.0020.0004] # ARMENIAN SMALL LIGATURE MEN XEH -FB13 ; [.22A3.0020.0004][.22A5.0020.0004] # ARMENIAN SMALL LIGATURE MEN NOW -0575 ; [.22A4.0020.0002] # ARMENIAN SMALL LETTER YI -0545 ; [.22A4.0020.0008] # ARMENIAN CAPITAL LETTER YI -0576 ; [.22A5.0020.0002] # ARMENIAN SMALL LETTER NOW -0546 ; [.22A5.0020.0008] # ARMENIAN CAPITAL LETTER NOW -0577 ; [.22A6.0020.0002] # ARMENIAN SMALL LETTER SHA -0547 ; [.22A6.0020.0008] # ARMENIAN CAPITAL LETTER SHA -0578 ; [.22A7.0020.0002] # ARMENIAN SMALL LETTER VO -0548 ; [.22A7.0020.0008] # ARMENIAN CAPITAL LETTER VO -0579 ; [.22A8.0020.0002] # ARMENIAN SMALL LETTER CHA -0549 ; [.22A8.0020.0008] # ARMENIAN CAPITAL LETTER CHA -057A ; [.22A9.0020.0002] # ARMENIAN SMALL LETTER PEH -054A ; [.22A9.0020.0008] # ARMENIAN CAPITAL LETTER PEH -057B ; [.22AA.0020.0002] # ARMENIAN SMALL LETTER JHEH -054B ; [.22AA.0020.0008] # ARMENIAN CAPITAL LETTER JHEH -057C ; [.22AB.0020.0002] # ARMENIAN SMALL LETTER RA -054C ; [.22AB.0020.0008] # ARMENIAN CAPITAL LETTER RA -057D ; [.22AC.0020.0002] # ARMENIAN SMALL LETTER SEH -054D ; [.22AC.0020.0008] # ARMENIAN CAPITAL LETTER SEH -057E ; [.22AD.0020.0002] # ARMENIAN SMALL LETTER VEW -054E ; [.22AD.0020.0008] # ARMENIAN CAPITAL LETTER VEW -FB16 ; [.22AD.0020.0004][.22A5.0020.0004] # ARMENIAN SMALL LIGATURE VEW NOW -057F ; [.22AE.0020.0002] # ARMENIAN SMALL LETTER TIWN -054F ; [.22AE.0020.0008] # ARMENIAN CAPITAL LETTER TIWN -0580 ; [.22AF.0020.0002] # ARMENIAN SMALL LETTER REH -0550 ; [.22AF.0020.0008] # ARMENIAN CAPITAL LETTER REH -0581 ; [.22B0.0020.0002] # ARMENIAN SMALL LETTER CO -0551 ; [.22B0.0020.0008] # ARMENIAN CAPITAL LETTER CO -0582 ; [.22B1.0020.0002] # ARMENIAN SMALL LETTER YIWN -0552 ; [.22B1.0020.0008] # ARMENIAN CAPITAL LETTER YIWN -0583 ; [.22B2.0020.0002] # ARMENIAN SMALL LETTER PIWR -0553 ; [.22B2.0020.0008] # ARMENIAN CAPITAL LETTER PIWR -0584 ; [.22B3.0020.0002] # ARMENIAN SMALL LETTER KEH -0554 ; [.22B3.0020.0008] # ARMENIAN CAPITAL LETTER KEH -0585 ; [.22B4.0020.0002] # ARMENIAN SMALL LETTER OH -0555 ; [.22B4.0020.0008] # ARMENIAN CAPITAL LETTER OH -0586 ; [.22B5.0020.0002] # ARMENIAN SMALL LETTER FEH -0556 ; [.22B5.0020.0008] # ARMENIAN CAPITAL LETTER FEH -0559 ; [.22B6.0020.0002] # ARMENIAN MODIFIER LETTER LEFT HALF RING -05D0 ; [.22B7.0020.0002] # HEBREW LETTER ALEF -2135 ; [.22B7.0020.0004] # ALEF SYMBOL -FB21 ; [.22B7.0020.0005] # HEBREW LETTER WIDE ALEF -FB2E ; [.22B7.0020.0002][.0000.0059.0002] # HEBREW LETTER ALEF WITH PATAH -FB2F ; [.22B7.0020.0002][.0000.005A.0002] # HEBREW LETTER ALEF WITH QAMATS -FB30 ; [.22B7.0020.0002][.0000.005F.0002] # HEBREW LETTER ALEF WITH MAPIQ -FB4F ; [.22B7.0020.0004][.22C2.0020.0004] # HEBREW LIGATURE ALEF LAMED -05D1 ; [.22B8.0020.0002] # HEBREW LETTER BET -2136 ; [.22B8.0020.0004] # BET SYMBOL -FB31 ; [.22B8.0020.0002][.0000.005F.0002] # HEBREW LETTER BET WITH DAGESH -FB4C ; [.22B8.0020.0002][.0000.0060.0002] # HEBREW LETTER BET WITH RAFE -05D2 ; [.22B9.0020.0002] # HEBREW LETTER GIMEL -2137 ; [.22B9.0020.0004] # GIMEL SYMBOL -FB32 ; [.22B9.0020.0002][.0000.005F.0002] # HEBREW LETTER GIMEL WITH DAGESH -05D3 ; [.22BA.0020.0002] # HEBREW LETTER DALET -2138 ; [.22BA.0020.0004] # DALET SYMBOL -FB22 ; [.22BA.0020.0005] # HEBREW LETTER WIDE DALET -FB33 ; [.22BA.0020.0002][.0000.005F.0002] # HEBREW LETTER DALET WITH DAGESH -05D4 ; [.22BB.0020.0002] # HEBREW LETTER HE -FB23 ; [.22BB.0020.0005] # HEBREW LETTER WIDE HE -FB34 ; [.22BB.0020.0002][.0000.005F.0002] # HEBREW LETTER HE WITH MAPIQ -05D5 ; [.22BC.0020.0002] # HEBREW LETTER VAV -FB4B ; [.22BC.0020.0002][.0000.005B.0002] # HEBREW LETTER VAV WITH HOLAM -FB35 ; [.22BC.0020.0002][.0000.005F.0002] # HEBREW LETTER VAV WITH DAGESH -05F0 ; [.22BC.0020.0004][.22BC.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE VAV -05F1 ; [.22BC.0020.0004][.22C0.0020.0004] # HEBREW LIGATURE YIDDISH VAV YOD -05D6 ; [.22BD.0020.0002] # HEBREW LETTER ZAYIN -FB36 ; [.22BD.0020.0002][.0000.005F.0002] # HEBREW LETTER ZAYIN WITH DAGESH -05D7 ; [.22BE.0020.0002] # HEBREW LETTER HET -05D8 ; [.22BF.0020.0002] # HEBREW LETTER TET -FB38 ; [.22BF.0020.0002][.0000.005F.0002] # HEBREW LETTER TET WITH DAGESH -05D9 ; [.22C0.0020.0002] # HEBREW LETTER YOD -FB1D ; [.22C0.0020.0002][.0000.0056.0002] # HEBREW LETTER YOD WITH HIRIQ -FB39 ; [.22C0.0020.0002][.0000.005F.0002] # HEBREW LETTER YOD WITH DAGESH -05F2 ; [.22C0.0020.0004][.22C0.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE YOD -FB1F ; [.22C0.0020.0004][.22C0.0020.0004][.0000.0059.0002] # HEBREW LIGATURE YIDDISH YOD YOD PATAH -05DB ; [.22C1.0020.0002] # HEBREW LETTER KAF -FB24 ; [.22C1.0020.0005] # HEBREW LETTER WIDE KAF -05DA ; [.22C1.0020.0019] # HEBREW LETTER FINAL KAF -FB3B ; [.22C1.0020.0002][.0000.005F.0002] # HEBREW LETTER KAF WITH DAGESH -FB3A ; [.22C1.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL KAF WITH DAGESH -FB4D ; [.22C1.0020.0002][.0000.0060.0002] # HEBREW LETTER KAF WITH RAFE -05DC ; [.22C2.0020.0002] # HEBREW LETTER LAMED -FB25 ; [.22C2.0020.0005] # HEBREW LETTER WIDE LAMED -FB3C ; [.22C2.0020.0002][.0000.005F.0002] # HEBREW LETTER LAMED WITH DAGESH -05DE ; [.22C3.0020.0002] # HEBREW LETTER MEM -FB26 ; [.22C3.0020.0005] # HEBREW LETTER WIDE FINAL MEM -05DD ; [.22C3.0020.0019] # HEBREW LETTER FINAL MEM -FB3E ; [.22C3.0020.0002][.0000.005F.0002] # HEBREW LETTER MEM WITH DAGESH -05E0 ; [.22C4.0020.0002] # HEBREW LETTER NUN -05DF ; [.22C4.0020.0019] # HEBREW LETTER FINAL NUN -FB40 ; [.22C4.0020.0002][.0000.005F.0002] # HEBREW LETTER NUN WITH DAGESH -05E1 ; [.22C5.0020.0002] # HEBREW LETTER SAMEKH -FB41 ; [.22C5.0020.0002][.0000.005F.0002] # HEBREW LETTER SAMEKH WITH DAGESH -05E2 ; [.22C6.0020.0002] # HEBREW LETTER AYIN -FB20 ; [.22C6.0020.0005] # HEBREW LETTER ALTERNATIVE AYIN -05E4 ; [.22C7.0020.0002] # HEBREW LETTER PE -05E3 ; [.22C7.0020.0019] # HEBREW LETTER FINAL PE -FB44 ; [.22C7.0020.0002][.0000.005F.0002] # HEBREW LETTER PE WITH DAGESH -FB43 ; [.22C7.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL PE WITH DAGESH -FB4E ; [.22C7.0020.0002][.0000.0060.0002] # HEBREW LETTER PE WITH RAFE -05E6 ; [.22C8.0020.0002] # HEBREW LETTER TSADI -05E5 ; [.22C8.0020.0019] # HEBREW LETTER FINAL TSADI -FB46 ; [.22C8.0020.0002][.0000.005F.0002] # HEBREW LETTER TSADI WITH DAGESH -05E7 ; [.22C9.0020.0002] # HEBREW LETTER QOF -FB47 ; [.22C9.0020.0002][.0000.005F.0002] # HEBREW LETTER QOF WITH DAGESH -05E8 ; [.22CA.0020.0002] # HEBREW LETTER RESH -FB27 ; [.22CA.0020.0005] # HEBREW LETTER WIDE RESH -FB48 ; [.22CA.0020.0002][.0000.005F.0002] # HEBREW LETTER RESH WITH DAGESH -05E9 ; [.22CB.0020.0002] # HEBREW LETTER SHIN -FB2B ; [.22CB.0020.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH SIN DOT -FB2A ; [.22CB.0020.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH SHIN DOT -FB49 ; [.22CB.0020.0002][.0000.005F.0002] # HEBREW LETTER SHIN WITH DAGESH -FB2D ; [.22CB.0020.0002][.0000.005F.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT -FB2C ; [.22CB.0020.0002][.0000.005F.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT -05EA ; [.22CC.0020.0002] # HEBREW LETTER TAV -FB28 ; [.22CC.0020.0005] # HEBREW LETTER WIDE TAV -FB4A ; [.22CC.0020.0002][.0000.005F.0002] # HEBREW LETTER TAV WITH DAGESH -10900 ; [.22CD.0020.0002] # PHOENICIAN LETTER ALF -10901 ; [.22CE.0020.0002] # PHOENICIAN LETTER BET -10902 ; [.22CF.0020.0002] # PHOENICIAN LETTER GAML -10903 ; [.22D0.0020.0002] # PHOENICIAN LETTER DELT -10904 ; [.22D1.0020.0002] # PHOENICIAN LETTER HE -10905 ; [.22D2.0020.0002] # PHOENICIAN LETTER WAU -10906 ; [.22D3.0020.0002] # PHOENICIAN LETTER ZAI -10907 ; [.22D4.0020.0002] # PHOENICIAN LETTER HET -10908 ; [.22D5.0020.0002] # PHOENICIAN LETTER TET -10909 ; [.22D6.0020.0002] # PHOENICIAN LETTER YOD -1090A ; [.22D7.0020.0002] # PHOENICIAN LETTER KAF -1090B ; [.22D8.0020.0002] # PHOENICIAN LETTER LAMD -1090C ; [.22D9.0020.0002] # PHOENICIAN LETTER MEM -1090D ; [.22DA.0020.0002] # PHOENICIAN LETTER NUN -1090E ; [.22DB.0020.0002] # PHOENICIAN LETTER SEMK -1090F ; [.22DC.0020.0002] # PHOENICIAN LETTER AIN -10910 ; [.22DD.0020.0002] # PHOENICIAN LETTER PE -10911 ; [.22DE.0020.0002] # PHOENICIAN LETTER SADE -10912 ; [.22DF.0020.0002] # PHOENICIAN LETTER QOF -10913 ; [.22E0.0020.0002] # PHOENICIAN LETTER ROSH -10914 ; [.22E1.0020.0002] # PHOENICIAN LETTER SHIN -10915 ; [.22E2.0020.0002] # PHOENICIAN LETTER TAU -0800 ; [.22E3.0020.0002] # SAMARITAN LETTER ALAF -0801 ; [.22E4.0020.0002] # SAMARITAN LETTER BIT -0802 ; [.22E5.0020.0002] # SAMARITAN LETTER GAMAN -0803 ; [.22E6.0020.0002] # SAMARITAN LETTER DALAT -0804 ; [.22E7.0020.0002] # SAMARITAN LETTER IY -0805 ; [.22E8.0020.0002] # SAMARITAN LETTER BAA -0806 ; [.22E9.0020.0002] # SAMARITAN LETTER ZEN -0807 ; [.22EA.0020.0002] # SAMARITAN LETTER IT -0808 ; [.22EB.0020.0002] # SAMARITAN LETTER TIT -0809 ; [.22EC.0020.0002] # SAMARITAN LETTER YUT -080A ; [.22ED.0020.0002] # SAMARITAN LETTER KAAF -080B ; [.22EE.0020.0002] # SAMARITAN LETTER LABAT -080C ; [.22EF.0020.0002] # SAMARITAN LETTER MIM -080D ; [.22F0.0020.0002] # SAMARITAN LETTER NUN -080E ; [.22F1.0020.0002] # SAMARITAN LETTER SINGAAT -080F ; [.22F2.0020.0002] # SAMARITAN LETTER IN -0810 ; [.22F3.0020.0002] # SAMARITAN LETTER FI -0811 ; [.22F4.0020.0002] # SAMARITAN LETTER TSAADIY -0812 ; [.22F5.0020.0002] # SAMARITAN LETTER QUF -0813 ; [.22F6.0020.0002] # SAMARITAN LETTER RISH -0814 ; [.22F7.0020.0002] # SAMARITAN LETTER SHAN -0815 ; [.22F8.0020.0002] # SAMARITAN LETTER TAAF -0816 ; [.22F9.0020.0002] # SAMARITAN MARK IN -0817 ; [.22FA.0020.0002] # SAMARITAN MARK IN-ALAF -081A ; [.22FB.0020.0002] # SAMARITAN MODIFIER LETTER EPENTHETIC YUT -081B ; [.22FC.0020.0002] # SAMARITAN MARK EPENTHETIC YUT -0621 ; [.22FD.0020.0002] # ARABIC LETTER HAMZA -0674 ; [.22FD.0020.0004] # ARABIC LETTER HIGH HAMZA -FE80 ; [.22FD.0020.001A] # ARABIC LETTER HAMZA ISOLATED FORM -06FD ; [.22FD.0020.0004][.0000.0111.0004] # ARABIC SIGN SINDHI AMPERSAND -0622 ; [.22FE.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE -0627 0653 ; [.22FE.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE -FE82 ; [.22FE.0020.0019] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM -FE81 ; [.22FE.0020.001A] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM -0623 ; [.22FF.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE -0627 0654 ; [.22FF.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE -FE84 ; [.22FF.0020.0019] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM -FE83 ; [.22FF.0020.001A] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM -0672 ; [.2300.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE -0671 ; [.2301.0020.0002] # ARABIC LETTER ALEF WASLA -FB51 ; [.2301.0020.0019] # ARABIC LETTER ALEF WASLA FINAL FORM -FB50 ; [.2301.0020.001A] # ARABIC LETTER ALEF WASLA ISOLATED FORM -0624 ; [.2302.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE -0648 0654 ; [.2302.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE -FE86 ; [.2302.0020.0019] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM -FE85 ; [.2302.0020.001A] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM -0625 ; [.2303.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW -0627 0655 ; [.2303.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW -FE88 ; [.2303.0020.0019] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM -FE87 ; [.2303.0020.001A] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM -0673 ; [.2304.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW -0773 ; [.2305.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -0774 ; [.2306.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -0626 ; [.2307.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE -064A 0654 ; [.2307.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE -FE8B ; [.2307.0020.0017] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM -FE8C ; [.2307.0020.0018] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM -FE8A ; [.2307.0020.0019] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM -FE89 ; [.2307.0020.001A] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM -FBEB ; [.2307.0020.0019][.230B.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM -FBEA ; [.2307.0020.001A][.230B.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM -FC97 ; [.2307.0020.0017][.2325.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM -FC00 ; [.2307.0020.001A][.2325.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM -FC98 ; [.2307.0020.0017][.232C.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM -FC01 ; [.2307.0020.001A][.232C.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM -FC99 ; [.2307.0020.0017][.232D.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM -FC64 ; [.2307.0020.0019][.2346.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM -FC65 ; [.2307.0020.0019][.2347.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM -FC9A ; [.2307.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM -FCDF ; [.2307.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM -FC66 ; [.2307.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM -FC02 ; [.2307.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM -FC67 ; [.2307.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM -FC9B ; [.2307.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM -FCE0 ; [.2307.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM -FBED ; [.2307.0020.0019][.23B6.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM -FBEC ; [.2307.0020.001A][.23B6.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM -FBEF ; [.2307.0020.0019][.23B7.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM -FBEE ; [.2307.0020.001A][.23B7.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM -FBF3 ; [.2307.0020.0019][.23BA.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM -FBF2 ; [.2307.0020.001A][.23BA.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM -FBF1 ; [.2307.0020.0019][.23BB.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM -FBF0 ; [.2307.0020.001A][.23BB.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM -FBF5 ; [.2307.0020.0019][.23BC.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM -FBF4 ; [.2307.0020.001A][.23BC.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM -FBFB ; [.2307.0020.0017][.23C5.0020.0017] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM -FBFA ; [.2307.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM -FC68 ; [.2307.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM -FBF9 ; [.2307.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM -FC03 ; [.2307.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM -FC69 ; [.2307.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM -FC04 ; [.2307.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM -FBF8 ; [.2307.0020.0017][.23CA.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM -FBF7 ; [.2307.0020.0019][.23CA.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM -FBF6 ; [.2307.0020.001A][.23CA.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM -08A8 ; [.2308.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE -08A9 ; [.2309.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE -08AC ; [.230A.0020.0002] # ARABIC LETTER ROHINGYA YEH -0627 ; [.230B.0020.0002] # ARABIC LETTER ALEF -08AD ; [.230B.0020.0004] # ARABIC LETTER LOW ALEF -1EE00 ; [.230B.0020.0005] # ARABIC MATHEMATICAL ALEF -1EE80 ; [.230B.0020.0005] # ARABIC MATHEMATICAL LOOPED ALEF -FE8E ; [.230B.0020.0019] # ARABIC LETTER ALEF FINAL FORM -FE8D ; [.230B.0020.001A] # ARABIC LETTER ALEF ISOLATED FORM -FD3C ; [.230B.0020.0019][.0000.006D.0019] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM -FD3D ; [.230B.0020.001A][.0000.006D.001A] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -0675 ; [.230B.0020.0004][.22FD.0020.0004] # ARABIC LETTER HIGH HAMZA ALEF -FDF3 ; [.230B.0020.001A][.2387.0020.001A][.230D.0020.001A][.2346.0020.001A] # ARABIC LIGATURE AKBAR ISOLATED FORM -FDF2 ; [.230B.0020.001A][.239C.0020.001A][.239C.0020.001A][.23B1.0020.001A] # ARABIC LIGATURE ALLAH ISOLATED FORM -066E ; [.230C.0020.0002] # ARABIC LETTER DOTLESS BEH -1EE1C ; [.230C.0020.0005] # ARABIC MATHEMATICAL DOTLESS BEH -1EE7C ; [.230C.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS BEH -0628 ; [.230D.0020.0002] # ARABIC LETTER BEH -1EE01 ; [.230D.0020.0005] # ARABIC MATHEMATICAL BEH -1EE21 ; [.230D.0020.0005] # ARABIC MATHEMATICAL INITIAL BEH -1EE61 ; [.230D.0020.0005] # ARABIC MATHEMATICAL STRETCHED BEH -1EE81 ; [.230D.0020.0005] # ARABIC MATHEMATICAL LOOPED BEH -1EEA1 ; [.230D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK BEH -FE91 ; [.230D.0020.0017] # ARABIC LETTER BEH INITIAL FORM -FE92 ; [.230D.0020.0018] # ARABIC LETTER BEH MEDIAL FORM -FE90 ; [.230D.0020.0019] # ARABIC LETTER BEH FINAL FORM -FE8F ; [.230D.0020.001A] # ARABIC LETTER BEH ISOLATED FORM -FC9C ; [.230D.0020.0017][.2325.0020.0017] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM -FC05 ; [.230D.0020.001A][.2325.0020.001A] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM -FC9D ; [.230D.0020.0017][.232C.0020.0017] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM -FC06 ; [.230D.0020.001A][.232C.0020.001A] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM -FDC2 ; [.230D.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM -FC9E ; [.230D.0020.0017][.232D.0020.0017] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM -FC07 ; [.230D.0020.001A][.232D.0020.001A] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM -FD9E ; [.230D.0020.0019][.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM -FC6A ; [.230D.0020.0019][.2346.0020.0019] # ARABIC LIGATURE BEH WITH REH FINAL FORM -FC6B ; [.230D.0020.0019][.2347.0020.0019] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM -FC9F ; [.230D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM -FCE1 ; [.230D.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM -FC6C ; [.230D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM -FC08 ; [.230D.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM -FC6D ; [.230D.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE BEH WITH NOON FINAL FORM -FCA0 ; [.230D.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM -FCE2 ; [.230D.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM -FC6E ; [.230D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM -FC09 ; [.230D.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM -FC6F ; [.230D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE BEH WITH YEH FINAL FORM -FC0A ; [.230D.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM -067B ; [.230E.0020.0002] # ARABIC LETTER BEEH -FB54 ; [.230E.0020.0017] # ARABIC LETTER BEEH INITIAL FORM -FB55 ; [.230E.0020.0018] # ARABIC LETTER BEEH MEDIAL FORM -FB53 ; [.230E.0020.0019] # ARABIC LETTER BEEH FINAL FORM -FB52 ; [.230E.0020.001A] # ARABIC LETTER BEEH ISOLATED FORM -067E ; [.230F.0020.0002] # ARABIC LETTER PEH -FB58 ; [.230F.0020.0017] # ARABIC LETTER PEH INITIAL FORM -FB59 ; [.230F.0020.0018] # ARABIC LETTER PEH MEDIAL FORM -FB57 ; [.230F.0020.0019] # ARABIC LETTER PEH FINAL FORM -FB56 ; [.230F.0020.001A] # ARABIC LETTER PEH ISOLATED FORM -0680 ; [.2310.0020.0002] # ARABIC LETTER BEHEH -FB5C ; [.2310.0020.0017] # ARABIC LETTER BEHEH INITIAL FORM -FB5D ; [.2310.0020.0018] # ARABIC LETTER BEHEH MEDIAL FORM -FB5B ; [.2310.0020.0019] # ARABIC LETTER BEHEH FINAL FORM -FB5A ; [.2310.0020.001A] # ARABIC LETTER BEHEH ISOLATED FORM -0750 ; [.2311.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW -0751 ; [.2312.0020.0002] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE -0752 ; [.2313.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW -0753 ; [.2314.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE -0754 ; [.2315.0020.0002] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE -0755 ; [.2316.0020.0002] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW -08A0 ; [.2317.0020.0002] # ARABIC LETTER BEH WITH SMALL V BELOW -0756 ; [.2318.0020.0002] # ARABIC LETTER BEH WITH SMALL V -08A1 ; [.2319.0020.0002] # ARABIC LETTER BEH WITH HAMZA ABOVE -08B6 ; [.231A.0020.0002] # ARABIC LETTER BEH WITH SMALL MEEM ABOVE -08B7 ; [.231B.0020.0002] # ARABIC LETTER PEH WITH SMALL MEEM ABOVE -0629 ; [.231C.0020.0002] # ARABIC LETTER TEH MARBUTA -FE94 ; [.231C.0020.0019] # ARABIC LETTER TEH MARBUTA FINAL FORM -FE93 ; [.231C.0020.001A] # ARABIC LETTER TEH MARBUTA ISOLATED FORM -062A ; [.231D.0020.0002] # ARABIC LETTER TEH -1EE15 ; [.231D.0020.0005] # ARABIC MATHEMATICAL TEH -1EE35 ; [.231D.0020.0005] # ARABIC MATHEMATICAL INITIAL TEH -1EE75 ; [.231D.0020.0005] # ARABIC MATHEMATICAL STRETCHED TEH -1EE95 ; [.231D.0020.0005] # ARABIC MATHEMATICAL LOOPED TEH -1EEB5 ; [.231D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TEH -FE97 ; [.231D.0020.0017] # ARABIC LETTER TEH INITIAL FORM -FE98 ; [.231D.0020.0018] # ARABIC LETTER TEH MEDIAL FORM -FE96 ; [.231D.0020.0019] # ARABIC LETTER TEH FINAL FORM -FE95 ; [.231D.0020.001A] # ARABIC LETTER TEH ISOLATED FORM -FCA1 ; [.231D.0020.0017][.2325.0020.0017] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM -FC0B ; [.231D.0020.001A][.2325.0020.001A] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM -FD50 ; [.231D.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM -FDA0 ; [.231D.0020.0019][.2325.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM -FD9F ; [.231D.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM -FCA2 ; [.231D.0020.0017][.232C.0020.0017] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM -FC0C ; [.231D.0020.001A][.232C.0020.001A] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM -FD52 ; [.231D.0020.0017][.232C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM -FD51 ; [.231D.0020.0019][.232C.0020.0019][.2325.0020.0019] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM -FD53 ; [.231D.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM -FCA3 ; [.231D.0020.0017][.232D.0020.0017] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM -FC0D ; [.231D.0020.001A][.232D.0020.001A] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM -FD54 ; [.231D.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM -FDA2 ; [.231D.0020.0019][.232D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM -FDA1 ; [.231D.0020.0019][.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM -FC70 ; [.231D.0020.0019][.2346.0020.0019] # ARABIC LIGATURE TEH WITH REH FINAL FORM -FC71 ; [.231D.0020.0019][.2347.0020.0019] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM -FCA4 ; [.231D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM -FCE3 ; [.231D.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM -FC72 ; [.231D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM -FC0E ; [.231D.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM -FD55 ; [.231D.0020.0017][.23A3.0020.0017][.2325.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM -FD56 ; [.231D.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM -FD57 ; [.231D.0020.0017][.23A3.0020.0017][.232D.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM -FDA4 ; [.231D.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM -FDA3 ; [.231D.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM -FC73 ; [.231D.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE TEH WITH NOON FINAL FORM -FCA5 ; [.231D.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM -FCE4 ; [.231D.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM -FC74 ; [.231D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM -FC0F ; [.231D.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM -FC75 ; [.231D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TEH WITH YEH FINAL FORM -FC10 ; [.231D.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM -062B ; [.231E.0020.0002] # ARABIC LETTER THEH -1EE16 ; [.231E.0020.0005] # ARABIC MATHEMATICAL THEH -1EE36 ; [.231E.0020.0005] # ARABIC MATHEMATICAL INITIAL THEH -1EE76 ; [.231E.0020.0005] # ARABIC MATHEMATICAL STRETCHED THEH -1EE96 ; [.231E.0020.0005] # ARABIC MATHEMATICAL LOOPED THEH -1EEB6 ; [.231E.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THEH -FE9B ; [.231E.0020.0017] # ARABIC LETTER THEH INITIAL FORM -FE9C ; [.231E.0020.0018] # ARABIC LETTER THEH MEDIAL FORM -FE9A ; [.231E.0020.0019] # ARABIC LETTER THEH FINAL FORM -FE99 ; [.231E.0020.001A] # ARABIC LETTER THEH ISOLATED FORM -FC11 ; [.231E.0020.001A][.2325.0020.001A] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM -FC76 ; [.231E.0020.0019][.2346.0020.0019] # ARABIC LIGATURE THEH WITH REH FINAL FORM -FC77 ; [.231E.0020.0019][.2347.0020.0019] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM -FCA6 ; [.231E.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM -FCE5 ; [.231E.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM -FC78 ; [.231E.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM -FC12 ; [.231E.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM -FC79 ; [.231E.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE THEH WITH NOON FINAL FORM -FCE6 ; [.231E.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM -FC7A ; [.231E.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM -FC13 ; [.231E.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM -FC7B ; [.231E.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE THEH WITH YEH FINAL FORM -FC14 ; [.231E.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM -0679 ; [.231F.0020.0002] # ARABIC LETTER TTEH -FB68 ; [.231F.0020.0017] # ARABIC LETTER TTEH INITIAL FORM -FB69 ; [.231F.0020.0018] # ARABIC LETTER TTEH MEDIAL FORM -FB67 ; [.231F.0020.0019] # ARABIC LETTER TTEH FINAL FORM -FB66 ; [.231F.0020.001A] # ARABIC LETTER TTEH ISOLATED FORM -067A ; [.2320.0020.0002] # ARABIC LETTER TTEHEH -FB60 ; [.2320.0020.0017] # ARABIC LETTER TTEHEH INITIAL FORM -FB61 ; [.2320.0020.0018] # ARABIC LETTER TTEHEH MEDIAL FORM -FB5F ; [.2320.0020.0019] # ARABIC LETTER TTEHEH FINAL FORM -FB5E ; [.2320.0020.001A] # ARABIC LETTER TTEHEH ISOLATED FORM -067C ; [.2321.0020.0002] # ARABIC LETTER TEH WITH RING -067D ; [.2322.0020.0002] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS -067F ; [.2323.0020.0002] # ARABIC LETTER TEHEH -FB64 ; [.2323.0020.0017] # ARABIC LETTER TEHEH INITIAL FORM -FB65 ; [.2323.0020.0018] # ARABIC LETTER TEHEH MEDIAL FORM -FB63 ; [.2323.0020.0019] # ARABIC LETTER TEHEH FINAL FORM -FB62 ; [.2323.0020.001A] # ARABIC LETTER TEHEH ISOLATED FORM -08B8 ; [.2324.0020.0002] # ARABIC LETTER TEH WITH SMALL TEH ABOVE -062C ; [.2325.0020.0002] # ARABIC LETTER JEEM -1EE02 ; [.2325.0020.0005] # ARABIC MATHEMATICAL JEEM -1EE22 ; [.2325.0020.0005] # ARABIC MATHEMATICAL INITIAL JEEM -1EE42 ; [.2325.0020.0005] # ARABIC MATHEMATICAL TAILED JEEM -1EE62 ; [.2325.0020.0005] # ARABIC MATHEMATICAL STRETCHED JEEM -1EE82 ; [.2325.0020.0005] # ARABIC MATHEMATICAL LOOPED JEEM -1EEA2 ; [.2325.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM -FE9F ; [.2325.0020.0017] # ARABIC LETTER JEEM INITIAL FORM -FEA0 ; [.2325.0020.0018] # ARABIC LETTER JEEM MEDIAL FORM -FE9E ; [.2325.0020.0019] # ARABIC LETTER JEEM FINAL FORM -FE9D ; [.2325.0020.001A] # ARABIC LETTER JEEM ISOLATED FORM -FCA7 ; [.2325.0020.0017][.232C.0020.0017] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM -FC15 ; [.2325.0020.001A][.232C.0020.001A] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM -FDA6 ; [.2325.0020.0019][.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM -FDBE ; [.2325.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM -FDFB ; [.2325.0020.001A][.239C.0020.001A][*0209.0020.001A][.2325.0020.001A][.239C.0020.001A][.230B.0020.001A][.239C.0020.001A][.23B1.0020.001A] # ARABIC LIGATURE JALLAJALALOUHOU -FCA8 ; [.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM -FC16 ; [.2325.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM -FD59 ; [.2325.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM -FD58 ; [.2325.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM -FDA7 ; [.2325.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM -FDA5 ; [.2325.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM -FD1D ; [.2325.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM -FD01 ; [.2325.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM -FD1E ; [.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM -FD02 ; [.2325.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM -0683 ; [.2326.0020.0002] # ARABIC LETTER NYEH -FB78 ; [.2326.0020.0017] # ARABIC LETTER NYEH INITIAL FORM -FB79 ; [.2326.0020.0018] # ARABIC LETTER NYEH MEDIAL FORM -FB77 ; [.2326.0020.0019] # ARABIC LETTER NYEH FINAL FORM -FB76 ; [.2326.0020.001A] # ARABIC LETTER NYEH ISOLATED FORM -0684 ; [.2327.0020.0002] # ARABIC LETTER DYEH -FB74 ; [.2327.0020.0017] # ARABIC LETTER DYEH INITIAL FORM -FB75 ; [.2327.0020.0018] # ARABIC LETTER DYEH MEDIAL FORM -FB73 ; [.2327.0020.0019] # ARABIC LETTER DYEH FINAL FORM -FB72 ; [.2327.0020.001A] # ARABIC LETTER DYEH ISOLATED FORM -0686 ; [.2328.0020.0002] # ARABIC LETTER TCHEH -FB7C ; [.2328.0020.0017] # ARABIC LETTER TCHEH INITIAL FORM -FB7D ; [.2328.0020.0018] # ARABIC LETTER TCHEH MEDIAL FORM -FB7B ; [.2328.0020.0019] # ARABIC LETTER TCHEH FINAL FORM -FB7A ; [.2328.0020.001A] # ARABIC LETTER TCHEH ISOLATED FORM -06BF ; [.2329.0020.0002] # ARABIC LETTER TCHEH WITH DOT ABOVE -0687 ; [.232A.0020.0002] # ARABIC LETTER TCHEHEH -FB80 ; [.232A.0020.0017] # ARABIC LETTER TCHEHEH INITIAL FORM -FB81 ; [.232A.0020.0018] # ARABIC LETTER TCHEHEH MEDIAL FORM -FB7F ; [.232A.0020.0019] # ARABIC LETTER TCHEHEH FINAL FORM -FB7E ; [.232A.0020.001A] # ARABIC LETTER TCHEHEH ISOLATED FORM -08A2 ; [.232B.0020.0002] # ARABIC LETTER JEEM WITH TWO DOTS ABOVE -062D ; [.232C.0020.0002] # ARABIC LETTER HAH -1EE07 ; [.232C.0020.0005] # ARABIC MATHEMATICAL HAH -1EE27 ; [.232C.0020.0005] # ARABIC MATHEMATICAL INITIAL HAH -1EE47 ; [.232C.0020.0005] # ARABIC MATHEMATICAL TAILED HAH -1EE67 ; [.232C.0020.0005] # ARABIC MATHEMATICAL STRETCHED HAH -1EE87 ; [.232C.0020.0005] # ARABIC MATHEMATICAL LOOPED HAH -1EEA7 ; [.232C.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK HAH -FEA3 ; [.232C.0020.0017] # ARABIC LETTER HAH INITIAL FORM -FEA4 ; [.232C.0020.0018] # ARABIC LETTER HAH MEDIAL FORM -FEA2 ; [.232C.0020.0019] # ARABIC LETTER HAH FINAL FORM -FEA1 ; [.232C.0020.001A] # ARABIC LETTER HAH ISOLATED FORM -FCA9 ; [.232C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM -FC17 ; [.232C.0020.001A][.2325.0020.001A] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM -FDBF ; [.232C.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM -FCAA ; [.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM -FC18 ; [.232C.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM -FD5B ; [.232C.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD5A ; [.232C.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM -FD1B ; [.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM -FCFF ; [.232C.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM -FD1C ; [.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE HAH WITH YEH FINAL FORM -FD00 ; [.232C.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM -062E ; [.232D.0020.0002] # ARABIC LETTER KHAH -1EE17 ; [.232D.0020.0005] # ARABIC MATHEMATICAL KHAH -1EE37 ; [.232D.0020.0005] # ARABIC MATHEMATICAL INITIAL KHAH -1EE57 ; [.232D.0020.0005] # ARABIC MATHEMATICAL TAILED KHAH -1EE77 ; [.232D.0020.0005] # ARABIC MATHEMATICAL STRETCHED KHAH -1EE97 ; [.232D.0020.0005] # ARABIC MATHEMATICAL LOOPED KHAH -1EEB7 ; [.232D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH -FEA7 ; [.232D.0020.0017] # ARABIC LETTER KHAH INITIAL FORM -FEA8 ; [.232D.0020.0018] # ARABIC LETTER KHAH MEDIAL FORM -FEA6 ; [.232D.0020.0019] # ARABIC LETTER KHAH FINAL FORM -FEA5 ; [.232D.0020.001A] # ARABIC LETTER KHAH ISOLATED FORM -FCAB ; [.232D.0020.0017][.2325.0020.0017] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM -FC19 ; [.232D.0020.001A][.2325.0020.001A] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM -FC1A ; [.232D.0020.001A][.232C.0020.001A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM -FCAC ; [.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM -FC1B ; [.232D.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM -FD1F ; [.232D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM -FD03 ; [.232D.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM -FD20 ; [.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM -FD04 ; [.232D.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM -0681 ; [.232E.0020.0002] # ARABIC LETTER HAH WITH HAMZA ABOVE -0682 ; [.232F.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE -0685 ; [.2330.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS ABOVE -0757 ; [.2331.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS ABOVE -0758 ; [.2332.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW -076E ; [.2333.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW -076F ; [.2334.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS -0772 ; [.2335.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE -077C ; [.2336.0020.0002] # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW -062F ; [.2337.0020.0002] # ARABIC LETTER DAL -1EE03 ; [.2337.0020.0005] # ARABIC MATHEMATICAL DAL -1EE83 ; [.2337.0020.0005] # ARABIC MATHEMATICAL LOOPED DAL -1EEA3 ; [.2337.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAL -FEAA ; [.2337.0020.0019] # ARABIC LETTER DAL FINAL FORM -FEA9 ; [.2337.0020.001A] # ARABIC LETTER DAL ISOLATED FORM -0630 ; [.2338.0020.0002] # ARABIC LETTER THAL -1EE18 ; [.2338.0020.0005] # ARABIC MATHEMATICAL THAL -1EE98 ; [.2338.0020.0005] # ARABIC MATHEMATICAL LOOPED THAL -1EEB8 ; [.2338.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THAL -FEAC ; [.2338.0020.0019] # ARABIC LETTER THAL FINAL FORM -FEAB ; [.2338.0020.001A] # ARABIC LETTER THAL ISOLATED FORM -FC5B ; [.2338.0020.001A][.0000.0098.001A] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM -0688 ; [.2339.0020.0002] # ARABIC LETTER DDAL -FB89 ; [.2339.0020.0019] # ARABIC LETTER DDAL FINAL FORM -FB88 ; [.2339.0020.001A] # ARABIC LETTER DDAL ISOLATED FORM -0689 ; [.233A.0020.0002] # ARABIC LETTER DAL WITH RING -068A ; [.233B.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW -068B ; [.233C.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH -068C ; [.233D.0020.0002] # ARABIC LETTER DAHAL -FB85 ; [.233D.0020.0019] # ARABIC LETTER DAHAL FINAL FORM -FB84 ; [.233D.0020.001A] # ARABIC LETTER DAHAL ISOLATED FORM -068D ; [.233E.0020.0002] # ARABIC LETTER DDAHAL -FB83 ; [.233E.0020.0019] # ARABIC LETTER DDAHAL FINAL FORM -FB82 ; [.233E.0020.001A] # ARABIC LETTER DDAHAL ISOLATED FORM -08AE ; [.233F.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS BELOW -068E ; [.2340.0020.0002] # ARABIC LETTER DUL -FB87 ; [.2340.0020.0019] # ARABIC LETTER DUL FINAL FORM -FB86 ; [.2340.0020.001A] # ARABIC LETTER DUL ISOLATED FORM -068F ; [.2341.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS -0690 ; [.2342.0020.0002] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE -06EE ; [.2343.0020.0002] # ARABIC LETTER DAL WITH INVERTED V -0759 ; [.2344.0020.0002] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH -075A ; [.2345.0020.0002] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW -0631 ; [.2346.0020.0002] # ARABIC LETTER REH -1EE13 ; [.2346.0020.0005] # ARABIC MATHEMATICAL REH -1EE93 ; [.2346.0020.0005] # ARABIC MATHEMATICAL LOOPED REH -1EEB3 ; [.2346.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK REH -FEAE ; [.2346.0020.0019] # ARABIC LETTER REH FINAL FORM -FEAD ; [.2346.0020.001A] # ARABIC LETTER REH ISOLATED FORM -FC5C ; [.2346.0020.001A][.0000.0098.001A] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM -FDF6 ; [.2346.0020.001A][.2359.0020.001A][.23B7.0020.001A][.239C.0020.001A] # ARABIC LIGATURE RASOUL ISOLATED FORM -FDFC ; [.2346.0020.001A][.23C7.0020.001A][.230B.0020.001A][.239C.0020.001A] # RIAL SIGN -0632 ; [.2347.0020.0002] # ARABIC LETTER ZAIN -1EE06 ; [.2347.0020.0005] # ARABIC MATHEMATICAL ZAIN -1EE86 ; [.2347.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAIN -1EEA6 ; [.2347.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN -FEB0 ; [.2347.0020.0019] # ARABIC LETTER ZAIN FINAL FORM -FEAF ; [.2347.0020.001A] # ARABIC LETTER ZAIN ISOLATED FORM -0691 ; [.2348.0020.0002] # ARABIC LETTER RREH -FB8D ; [.2348.0020.0019] # ARABIC LETTER RREH FINAL FORM -FB8C ; [.2348.0020.001A] # ARABIC LETTER RREH ISOLATED FORM -0692 ; [.2349.0020.0002] # ARABIC LETTER REH WITH SMALL V -0693 ; [.234A.0020.0002] # ARABIC LETTER REH WITH RING -0694 ; [.234B.0020.0002] # ARABIC LETTER REH WITH DOT BELOW -0695 ; [.234C.0020.0002] # ARABIC LETTER REH WITH SMALL V BELOW -0696 ; [.234D.0020.0002] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE -0697 ; [.234E.0020.0002] # ARABIC LETTER REH WITH TWO DOTS ABOVE -0698 ; [.234F.0020.0002] # ARABIC LETTER JEH -FB8B ; [.234F.0020.0019] # ARABIC LETTER JEH FINAL FORM -FB8A ; [.234F.0020.001A] # ARABIC LETTER JEH ISOLATED FORM -0699 ; [.2350.0020.0002] # ARABIC LETTER REH WITH FOUR DOTS ABOVE -06EF ; [.2351.0020.0002] # ARABIC LETTER REH WITH INVERTED V -075B ; [.2352.0020.0002] # ARABIC LETTER REH WITH STROKE -076B ; [.2353.0020.0002] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE -076C ; [.2354.0020.0002] # ARABIC LETTER REH WITH HAMZA ABOVE -0771 ; [.2355.0020.0002] # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS -08AA ; [.2356.0020.0002] # ARABIC LETTER REH WITH LOOP -08B2 ; [.2357.0020.0002] # ARABIC LETTER ZAIN WITH INVERTED V ABOVE -08B9 ; [.2358.0020.0002] # ARABIC LETTER REH WITH SMALL NOON ABOVE -0633 ; [.2359.0020.0002] # ARABIC LETTER SEEN -1EE0E ; [.2359.0020.0005] # ARABIC MATHEMATICAL SEEN -1EE2E ; [.2359.0020.0005] # ARABIC MATHEMATICAL INITIAL SEEN -1EE4E ; [.2359.0020.0005] # ARABIC MATHEMATICAL TAILED SEEN -1EE6E ; [.2359.0020.0005] # ARABIC MATHEMATICAL STRETCHED SEEN -1EE8E ; [.2359.0020.0005] # ARABIC MATHEMATICAL LOOPED SEEN -1EEAE ; [.2359.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN -FEB3 ; [.2359.0020.0017] # ARABIC LETTER SEEN INITIAL FORM -FEB4 ; [.2359.0020.0018] # ARABIC LETTER SEEN MEDIAL FORM -FEB2 ; [.2359.0020.0019] # ARABIC LETTER SEEN FINAL FORM -FEB1 ; [.2359.0020.001A] # ARABIC LETTER SEEN ISOLATED FORM -FCAD ; [.2359.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM -FD34 ; [.2359.0020.0018][.2325.0020.0018] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM -FC1C ; [.2359.0020.001A][.2325.0020.001A] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM -FD5D ; [.2359.0020.0017][.2325.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM -FD5E ; [.2359.0020.0019][.2325.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM -FCAE ; [.2359.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM -FD35 ; [.2359.0020.0018][.232C.0020.0018] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM -FC1D ; [.2359.0020.001A][.232C.0020.001A] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM -FD5C ; [.2359.0020.0017][.232C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM -FCAF ; [.2359.0020.0017][.232D.0020.0017] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM -FD36 ; [.2359.0020.0018][.232D.0020.0018] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM -FC1E ; [.2359.0020.001A][.232D.0020.001A] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM -FDA8 ; [.2359.0020.0019][.232D.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM -FDC6 ; [.2359.0020.0019][.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM -FD2A ; [.2359.0020.0019][.2346.0020.0019] # ARABIC LIGATURE SEEN WITH REH FINAL FORM -FD0E ; [.2359.0020.001A][.2346.0020.001A] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM -FCB0 ; [.2359.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM -FCE7 ; [.2359.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM -FC1F ; [.2359.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM -FD61 ; [.2359.0020.0017][.23A3.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM -FD60 ; [.2359.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM -FD5F ; [.2359.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM -FD63 ; [.2359.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM -FD62 ; [.2359.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM -FD31 ; [.2359.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM -FCE8 ; [.2359.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM -FD17 ; [.2359.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM -FCFB ; [.2359.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM -FD18 ; [.2359.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM -FCFC ; [.2359.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM -0634 ; [.235A.0020.0002] # ARABIC LETTER SHEEN -1EE14 ; [.235A.0020.0005] # ARABIC MATHEMATICAL SHEEN -1EE34 ; [.235A.0020.0005] # ARABIC MATHEMATICAL INITIAL SHEEN -1EE54 ; [.235A.0020.0005] # ARABIC MATHEMATICAL TAILED SHEEN -1EE74 ; [.235A.0020.0005] # ARABIC MATHEMATICAL STRETCHED SHEEN -1EE94 ; [.235A.0020.0005] # ARABIC MATHEMATICAL LOOPED SHEEN -1EEB4 ; [.235A.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN -FEB7 ; [.235A.0020.0017] # ARABIC LETTER SHEEN INITIAL FORM -FEB8 ; [.235A.0020.0018] # ARABIC LETTER SHEEN MEDIAL FORM -FEB6 ; [.235A.0020.0019] # ARABIC LETTER SHEEN FINAL FORM -FEB5 ; [.235A.0020.001A] # ARABIC LETTER SHEEN ISOLATED FORM -FD2D ; [.235A.0020.0017][.2325.0020.0017] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM -FD37 ; [.235A.0020.0018][.2325.0020.0018] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM -FD25 ; [.235A.0020.0019][.2325.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM -FD09 ; [.235A.0020.001A][.2325.0020.001A] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM -FD69 ; [.235A.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM -FD2E ; [.235A.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM -FD38 ; [.235A.0020.0018][.232C.0020.0018] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM -FD26 ; [.235A.0020.0019][.232C.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM -FD0A ; [.235A.0020.001A][.232C.0020.001A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM -FD68 ; [.235A.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM -FD67 ; [.235A.0020.0019][.232C.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM -FDAA ; [.235A.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM -FD2F ; [.235A.0020.0017][.232D.0020.0017] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM -FD39 ; [.235A.0020.0018][.232D.0020.0018] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM -FD27 ; [.235A.0020.0019][.232D.0020.0019] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM -FD0B ; [.235A.0020.001A][.232D.0020.001A] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM -FD29 ; [.235A.0020.0019][.2346.0020.0019] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM -FD0D ; [.235A.0020.001A][.2346.0020.001A] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM -FD30 ; [.235A.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM -FCE9 ; [.235A.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM -FD28 ; [.235A.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM -FD0C ; [.235A.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM -FD6B ; [.235A.0020.0017][.23A3.0020.0017][.232D.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM -FD6A ; [.235A.0020.0019][.23A3.0020.0019][.232D.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM -FD6D ; [.235A.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM -FD6C ; [.235A.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM -FD32 ; [.235A.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM -FCEA ; [.235A.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM -FD19 ; [.235A.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM -FCFD ; [.235A.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM -FD1A ; [.235A.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM -FCFE ; [.235A.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM -069A ; [.235B.0020.0002] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE -069B ; [.235C.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW -069C ; [.235D.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE -06FA ; [.235E.0020.0002] # ARABIC LETTER SHEEN WITH DOT BELOW -075C ; [.235F.0020.0002] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE -076D ; [.2360.0020.0002] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE -0770 ; [.2361.0020.0002] # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS -077D ; [.2362.0020.0002] # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE -077E ; [.2363.0020.0002] # ARABIC LETTER SEEN WITH INVERTED V -0635 ; [.2364.0020.0002] # ARABIC LETTER SAD -1EE11 ; [.2364.0020.0005] # ARABIC MATHEMATICAL SAD -1EE31 ; [.2364.0020.0005] # ARABIC MATHEMATICAL INITIAL SAD -1EE51 ; [.2364.0020.0005] # ARABIC MATHEMATICAL TAILED SAD -1EE71 ; [.2364.0020.0005] # ARABIC MATHEMATICAL STRETCHED SAD -1EE91 ; [.2364.0020.0005] # ARABIC MATHEMATICAL LOOPED SAD -1EEB1 ; [.2364.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SAD -FEBB ; [.2364.0020.0017] # ARABIC LETTER SAD INITIAL FORM -FEBC ; [.2364.0020.0018] # ARABIC LETTER SAD MEDIAL FORM -FEBA ; [.2364.0020.0019] # ARABIC LETTER SAD FINAL FORM -FEB9 ; [.2364.0020.001A] # ARABIC LETTER SAD ISOLATED FORM -FCB1 ; [.2364.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM -FC20 ; [.2364.0020.001A][.232C.0020.001A] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM -FD65 ; [.2364.0020.0017][.232C.0020.0017][.232C.0020.0017] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM -FD64 ; [.2364.0020.0019][.232C.0020.0019][.232C.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM -FDA9 ; [.2364.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM -FCB2 ; [.2364.0020.0017][.232D.0020.0017] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM -FD2B ; [.2364.0020.0019][.2346.0020.0019] # ARABIC LIGATURE SAD WITH REH FINAL FORM -FD0F ; [.2364.0020.001A][.2346.0020.001A] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM -FDF5 ; [.2364.0020.001A][.239C.0020.001A][.236E.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SALAM ISOLATED FORM -FDF9 ; [.2364.0020.001A][.239C.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE SALLA ISOLATED FORM -FDFA ; [.2364.0020.001A][.239C.0020.001A][.23C5.0020.001A][*0209.0020.001A][.230B.0020.001A][.239C.0020.001A][.239C.0020.001A][.23B1.0020.001A][*0209.0020.001A][.236E.0020.001A][.239C.0020.001A][.23C6.0020.001A][.23B1.0020.001A][*0209.0020.001A][.23B7.0020.001A][.2359.0020.001A][.239C.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM -FDF0 ; [.2364.0020.001A][.239C.0020.001A][.23D4.0020.001A] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM -FCB3 ; [.2364.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM -FC21 ; [.2364.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM -FDC5 ; [.2364.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM -FD66 ; [.2364.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM -FD21 ; [.2364.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM -FD05 ; [.2364.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM -FD22 ; [.2364.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE SAD WITH YEH FINAL FORM -FD06 ; [.2364.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM -0636 ; [.2365.0020.0002] # ARABIC LETTER DAD -1EE19 ; [.2365.0020.0005] # ARABIC MATHEMATICAL DAD -1EE39 ; [.2365.0020.0005] # ARABIC MATHEMATICAL INITIAL DAD -1EE59 ; [.2365.0020.0005] # ARABIC MATHEMATICAL TAILED DAD -1EE79 ; [.2365.0020.0005] # ARABIC MATHEMATICAL STRETCHED DAD -1EE99 ; [.2365.0020.0005] # ARABIC MATHEMATICAL LOOPED DAD -1EEB9 ; [.2365.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAD -FEBF ; [.2365.0020.0017] # ARABIC LETTER DAD INITIAL FORM -FEC0 ; [.2365.0020.0018] # ARABIC LETTER DAD MEDIAL FORM -FEBE ; [.2365.0020.0019] # ARABIC LETTER DAD FINAL FORM -FEBD ; [.2365.0020.001A] # ARABIC LETTER DAD ISOLATED FORM -FCB4 ; [.2365.0020.0017][.2325.0020.0017] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM -FC22 ; [.2365.0020.001A][.2325.0020.001A] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM -FCB5 ; [.2365.0020.0017][.232C.0020.0017] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM -FC23 ; [.2365.0020.001A][.232C.0020.001A] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM -FD6E ; [.2365.0020.0019][.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM -FDAB ; [.2365.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM -FCB6 ; [.2365.0020.0017][.232D.0020.0017] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM -FC24 ; [.2365.0020.001A][.232D.0020.001A] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM -FD70 ; [.2365.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM -FD6F ; [.2365.0020.0019][.232D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM -FD2C ; [.2365.0020.0019][.2346.0020.0019] # ARABIC LIGATURE DAD WITH REH FINAL FORM -FD10 ; [.2365.0020.001A][.2346.0020.001A] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM -FCB7 ; [.2365.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM -FC25 ; [.2365.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM -FD23 ; [.2365.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM -FD07 ; [.2365.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM -FD24 ; [.2365.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE DAD WITH YEH FINAL FORM -FD08 ; [.2365.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM -069D ; [.2366.0020.0002] # ARABIC LETTER SAD WITH TWO DOTS BELOW -08AF ; [.2367.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS BELOW -069E ; [.2368.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS ABOVE -06FB ; [.2369.0020.0002] # ARABIC LETTER DAD WITH DOT BELOW -0637 ; [.236A.0020.0002] # ARABIC LETTER TAH -1EE08 ; [.236A.0020.0005] # ARABIC MATHEMATICAL TAH -1EE68 ; [.236A.0020.0005] # ARABIC MATHEMATICAL STRETCHED TAH -1EE88 ; [.236A.0020.0005] # ARABIC MATHEMATICAL LOOPED TAH -1EEA8 ; [.236A.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TAH -FEC3 ; [.236A.0020.0017] # ARABIC LETTER TAH INITIAL FORM -FEC4 ; [.236A.0020.0018] # ARABIC LETTER TAH MEDIAL FORM -FEC2 ; [.236A.0020.0019] # ARABIC LETTER TAH FINAL FORM -FEC1 ; [.236A.0020.001A] # ARABIC LETTER TAH ISOLATED FORM -FCB8 ; [.236A.0020.0017][.232C.0020.0017] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM -FC26 ; [.236A.0020.001A][.232C.0020.001A] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM -FD33 ; [.236A.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM -FD3A ; [.236A.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM -FC27 ; [.236A.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM -FD72 ; [.236A.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM -FD71 ; [.236A.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM -FD73 ; [.236A.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM -FD74 ; [.236A.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM -FD11 ; [.236A.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM -FCF5 ; [.236A.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM -FD12 ; [.236A.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE TAH WITH YEH FINAL FORM -FCF6 ; [.236A.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM -0638 ; [.236B.0020.0002] # ARABIC LETTER ZAH -1EE1A ; [.236B.0020.0005] # ARABIC MATHEMATICAL ZAH -1EE7A ; [.236B.0020.0005] # ARABIC MATHEMATICAL STRETCHED ZAH -1EE9A ; [.236B.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAH -1EEBA ; [.236B.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH -FEC7 ; [.236B.0020.0017] # ARABIC LETTER ZAH INITIAL FORM -FEC8 ; [.236B.0020.0018] # ARABIC LETTER ZAH MEDIAL FORM -FEC6 ; [.236B.0020.0019] # ARABIC LETTER ZAH FINAL FORM -FEC5 ; [.236B.0020.001A] # ARABIC LETTER ZAH ISOLATED FORM -FCB9 ; [.236B.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM -FD3B ; [.236B.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM -FC28 ; [.236B.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM -069F ; [.236C.0020.0002] # ARABIC LETTER TAH WITH THREE DOTS ABOVE -08A3 ; [.236D.0020.0002] # ARABIC LETTER TAH WITH TWO DOTS ABOVE -0639 ; [.236E.0020.0002] # ARABIC LETTER AIN -1EE0F ; [.236E.0020.0005] # ARABIC MATHEMATICAL AIN -1EE2F ; [.236E.0020.0005] # ARABIC MATHEMATICAL INITIAL AIN -1EE4F ; [.236E.0020.0005] # ARABIC MATHEMATICAL TAILED AIN -1EE6F ; [.236E.0020.0005] # ARABIC MATHEMATICAL STRETCHED AIN -1EE8F ; [.236E.0020.0005] # ARABIC MATHEMATICAL LOOPED AIN -1EEAF ; [.236E.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK AIN -FECB ; [.236E.0020.0017] # ARABIC LETTER AIN INITIAL FORM -FECC ; [.236E.0020.0018] # ARABIC LETTER AIN MEDIAL FORM -FECA ; [.236E.0020.0019] # ARABIC LETTER AIN FINAL FORM -FEC9 ; [.236E.0020.001A] # ARABIC LETTER AIN ISOLATED FORM -FCBA ; [.236E.0020.0017][.2325.0020.0017] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM -FC29 ; [.236E.0020.001A][.2325.0020.001A] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM -FDC4 ; [.236E.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM -FD75 ; [.236E.0020.0019][.2325.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM -FDF7 ; [.236E.0020.001A][.239C.0020.001A][.23C6.0020.001A][.23B1.0020.001A] # ARABIC LIGATURE ALAYHE ISOLATED FORM -FCBB ; [.236E.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM -FC2A ; [.236E.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM -FD77 ; [.236E.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM -FD76 ; [.236E.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM -FD78 ; [.236E.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM -FDB6 ; [.236E.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM -FD13 ; [.236E.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM -FCF7 ; [.236E.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM -FD14 ; [.236E.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE AIN WITH YEH FINAL FORM -FCF8 ; [.236E.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM -063A ; [.236F.0020.0002] # ARABIC LETTER GHAIN -1EE1B ; [.236F.0020.0005] # ARABIC MATHEMATICAL GHAIN -1EE3B ; [.236F.0020.0005] # ARABIC MATHEMATICAL INITIAL GHAIN -1EE5B ; [.236F.0020.0005] # ARABIC MATHEMATICAL TAILED GHAIN -1EE7B ; [.236F.0020.0005] # ARABIC MATHEMATICAL STRETCHED GHAIN -1EE9B ; [.236F.0020.0005] # ARABIC MATHEMATICAL LOOPED GHAIN -1EEBB ; [.236F.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN -FECF ; [.236F.0020.0017] # ARABIC LETTER GHAIN INITIAL FORM -FED0 ; [.236F.0020.0018] # ARABIC LETTER GHAIN MEDIAL FORM -FECE ; [.236F.0020.0019] # ARABIC LETTER GHAIN FINAL FORM -FECD ; [.236F.0020.001A] # ARABIC LETTER GHAIN ISOLATED FORM -FCBC ; [.236F.0020.0017][.2325.0020.0017] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM -FC2B ; [.236F.0020.001A][.2325.0020.001A] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM -FCBD ; [.236F.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM -FC2C ; [.236F.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM -FD79 ; [.236F.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM -FD7B ; [.236F.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD7A ; [.236F.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM -FD15 ; [.236F.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM -FCF9 ; [.236F.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM -FD16 ; [.236F.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM -FCFA ; [.236F.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM -06A0 ; [.2370.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS ABOVE -06FC ; [.2371.0020.0002] # ARABIC LETTER GHAIN WITH DOT BELOW -075D ; [.2372.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS ABOVE -075E ; [.2373.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE -075F ; [.2374.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE -08B3 ; [.2375.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS BELOW -0641 ; [.2376.0020.0002] # ARABIC LETTER FEH -1EE10 ; [.2376.0020.0005] # ARABIC MATHEMATICAL FEH -1EE30 ; [.2376.0020.0005] # ARABIC MATHEMATICAL INITIAL FEH -1EE70 ; [.2376.0020.0005] # ARABIC MATHEMATICAL STRETCHED FEH -1EE90 ; [.2376.0020.0005] # ARABIC MATHEMATICAL LOOPED FEH -1EEB0 ; [.2376.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK FEH -FED3 ; [.2376.0020.0017] # ARABIC LETTER FEH INITIAL FORM -FED4 ; [.2376.0020.0018] # ARABIC LETTER FEH MEDIAL FORM -FED2 ; [.2376.0020.0019] # ARABIC LETTER FEH FINAL FORM -FED1 ; [.2376.0020.001A] # ARABIC LETTER FEH ISOLATED FORM -FCBE ; [.2376.0020.0017][.2325.0020.0017] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM -FC2D ; [.2376.0020.001A][.2325.0020.001A] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM -FCBF ; [.2376.0020.0017][.232C.0020.0017] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM -FC2E ; [.2376.0020.001A][.232C.0020.001A] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM -FCC0 ; [.2376.0020.0017][.232D.0020.0017] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM -FC2F ; [.2376.0020.001A][.232D.0020.001A] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM -FD7D ; [.2376.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM -FD7C ; [.2376.0020.0019][.232D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM -FCC1 ; [.2376.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM -FC30 ; [.2376.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM -FDC1 ; [.2376.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM -FC7C ; [.2376.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM -FC31 ; [.2376.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM -FC7D ; [.2376.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE FEH WITH YEH FINAL FORM -FC32 ; [.2376.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM -06A1 ; [.2377.0020.0002] # ARABIC LETTER DOTLESS FEH -1EE1E ; [.2377.0020.0005] # ARABIC MATHEMATICAL DOTLESS FEH -1EE7E ; [.2377.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS FEH -06A2 ; [.2378.0020.0002] # ARABIC LETTER FEH WITH DOT MOVED BELOW -08BB ; [.2379.0020.0002] # ARABIC LETTER AFRICAN FEH -06A3 ; [.237A.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW -06A4 ; [.237B.0020.0002] # ARABIC LETTER VEH -FB6C ; [.237B.0020.0017] # ARABIC LETTER VEH INITIAL FORM -FB6D ; [.237B.0020.0018] # ARABIC LETTER VEH MEDIAL FORM -FB6B ; [.237B.0020.0019] # ARABIC LETTER VEH FINAL FORM -FB6A ; [.237B.0020.001A] # ARABIC LETTER VEH ISOLATED FORM -08A4 ; [.237C.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE -06A5 ; [.237D.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS BELOW -06A6 ; [.237E.0020.0002] # ARABIC LETTER PEHEH -FB70 ; [.237E.0020.0017] # ARABIC LETTER PEHEH INITIAL FORM -FB71 ; [.237E.0020.0018] # ARABIC LETTER PEHEH MEDIAL FORM -FB6F ; [.237E.0020.0019] # ARABIC LETTER PEHEH FINAL FORM -FB6E ; [.237E.0020.001A] # ARABIC LETTER PEHEH ISOLATED FORM -0760 ; [.237F.0020.0002] # ARABIC LETTER FEH WITH TWO DOTS BELOW -0761 ; [.2380.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW -066F ; [.2381.0020.0002] # ARABIC LETTER DOTLESS QAF -1EE1F ; [.2381.0020.0005] # ARABIC MATHEMATICAL DOTLESS QAF -1EE5F ; [.2381.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS QAF -0642 ; [.2382.0020.0002] # ARABIC LETTER QAF -1EE12 ; [.2382.0020.0005] # ARABIC MATHEMATICAL QAF -1EE32 ; [.2382.0020.0005] # ARABIC MATHEMATICAL INITIAL QAF -1EE52 ; [.2382.0020.0005] # ARABIC MATHEMATICAL TAILED QAF -1EE72 ; [.2382.0020.0005] # ARABIC MATHEMATICAL STRETCHED QAF -1EE92 ; [.2382.0020.0005] # ARABIC MATHEMATICAL LOOPED QAF -1EEB2 ; [.2382.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK QAF -FED7 ; [.2382.0020.0017] # ARABIC LETTER QAF INITIAL FORM -FED8 ; [.2382.0020.0018] # ARABIC LETTER QAF MEDIAL FORM -FED6 ; [.2382.0020.0019] # ARABIC LETTER QAF FINAL FORM -FED5 ; [.2382.0020.001A] # ARABIC LETTER QAF ISOLATED FORM -FCC2 ; [.2382.0020.0017][.232C.0020.0017] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM -FC33 ; [.2382.0020.001A][.232C.0020.001A] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM -FDF1 ; [.2382.0020.001A][.239C.0020.001A][.23D4.0020.001A] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM -FCC3 ; [.2382.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM -FC34 ; [.2382.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM -FDB4 ; [.2382.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM -FD7E ; [.2382.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM -FD7F ; [.2382.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM -FDB2 ; [.2382.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM -FC7E ; [.2382.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM -FC35 ; [.2382.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM -FC7F ; [.2382.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE QAF WITH YEH FINAL FORM -FC36 ; [.2382.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM -06A7 ; [.2383.0020.0002] # ARABIC LETTER QAF WITH DOT ABOVE -08BC ; [.2384.0020.0002] # ARABIC LETTER AFRICAN QAF -06A8 ; [.2385.0020.0002] # ARABIC LETTER QAF WITH THREE DOTS ABOVE -08A5 ; [.2386.0020.0002] # ARABIC LETTER QAF WITH DOT BELOW -0643 ; [.2387.0020.0002] # ARABIC LETTER KAF -1EE0A ; [.2387.0020.0005] # ARABIC MATHEMATICAL KAF -1EE2A ; [.2387.0020.0005] # ARABIC MATHEMATICAL INITIAL KAF -1EE6A ; [.2387.0020.0005] # ARABIC MATHEMATICAL STRETCHED KAF -FEDB ; [.2387.0020.0017] # ARABIC LETTER KAF INITIAL FORM -FEDC ; [.2387.0020.0018] # ARABIC LETTER KAF MEDIAL FORM -FEDA ; [.2387.0020.0019] # ARABIC LETTER KAF FINAL FORM -FED9 ; [.2387.0020.001A] # ARABIC LETTER KAF ISOLATED FORM -FC80 ; [.2387.0020.0019][.230B.0020.0019] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM -FC37 ; [.2387.0020.001A][.230B.0020.001A] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM -FCC4 ; [.2387.0020.0017][.2325.0020.0017] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM -FC38 ; [.2387.0020.001A][.2325.0020.001A] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM -FCC5 ; [.2387.0020.0017][.232C.0020.0017] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM -FC39 ; [.2387.0020.001A][.232C.0020.001A] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM -FCC6 ; [.2387.0020.0017][.232D.0020.0017] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM -FC3A ; [.2387.0020.001A][.232D.0020.001A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM -FCC7 ; [.2387.0020.0017][.239C.0020.0017] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM -FCEB ; [.2387.0020.0018][.239C.0020.0018] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM -FC81 ; [.2387.0020.0019][.239C.0020.0019] # ARABIC LIGATURE KAF WITH LAM FINAL FORM -FC3B ; [.2387.0020.001A][.239C.0020.001A] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM -FCC8 ; [.2387.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM -FCEC ; [.2387.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM -FC82 ; [.2387.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM -FC3C ; [.2387.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM -FDC3 ; [.2387.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM -FDBB ; [.2387.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM -FDB7 ; [.2387.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM -FC83 ; [.2387.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM -FC3D ; [.2387.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM -FC84 ; [.2387.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE KAF WITH YEH FINAL FORM -FC3E ; [.2387.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM -06A9 ; [.2388.0020.0002] # ARABIC LETTER KEHEH -FB90 ; [.2388.0020.0017] # ARABIC LETTER KEHEH INITIAL FORM -FB91 ; [.2388.0020.0018] # ARABIC LETTER KEHEH MEDIAL FORM -FB8F ; [.2388.0020.0019] # ARABIC LETTER KEHEH FINAL FORM -FB8E ; [.2388.0020.001A] # ARABIC LETTER KEHEH ISOLATED FORM -06AA ; [.2389.0020.0002] # ARABIC LETTER SWASH KAF -06AB ; [.238A.0020.0002] # ARABIC LETTER KAF WITH RING -06AC ; [.238B.0020.0002] # ARABIC LETTER KAF WITH DOT ABOVE -077F ; [.238C.0020.0002] # ARABIC LETTER KAF WITH TWO DOTS ABOVE -06AD ; [.238D.0020.0002] # ARABIC LETTER NG -FBD5 ; [.238D.0020.0017] # ARABIC LETTER NG INITIAL FORM -FBD6 ; [.238D.0020.0018] # ARABIC LETTER NG MEDIAL FORM -FBD4 ; [.238D.0020.0019] # ARABIC LETTER NG FINAL FORM -FBD3 ; [.238D.0020.001A] # ARABIC LETTER NG ISOLATED FORM -06AE ; [.238E.0020.0002] # ARABIC LETTER KAF WITH THREE DOTS BELOW -08B4 ; [.238F.0020.0002] # ARABIC LETTER KAF WITH DOT BELOW -06AF ; [.2390.0020.0002] # ARABIC LETTER GAF -FB94 ; [.2390.0020.0017] # ARABIC LETTER GAF INITIAL FORM -FB95 ; [.2390.0020.0018] # ARABIC LETTER GAF MEDIAL FORM -FB93 ; [.2390.0020.0019] # ARABIC LETTER GAF FINAL FORM -FB92 ; [.2390.0020.001A] # ARABIC LETTER GAF ISOLATED FORM -08B0 ; [.2391.0020.0002] # ARABIC LETTER GAF WITH INVERTED STROKE -06B0 ; [.2392.0020.0002] # ARABIC LETTER GAF WITH RING -06B1 ; [.2393.0020.0002] # ARABIC LETTER NGOEH -FB9C ; [.2393.0020.0017] # ARABIC LETTER NGOEH INITIAL FORM -FB9D ; [.2393.0020.0018] # ARABIC LETTER NGOEH MEDIAL FORM -FB9B ; [.2393.0020.0019] # ARABIC LETTER NGOEH FINAL FORM -FB9A ; [.2393.0020.001A] # ARABIC LETTER NGOEH ISOLATED FORM -06B2 ; [.2394.0020.0002] # ARABIC LETTER GAF WITH TWO DOTS BELOW -06B3 ; [.2395.0020.0002] # ARABIC LETTER GUEH -FB98 ; [.2395.0020.0017] # ARABIC LETTER GUEH INITIAL FORM -FB99 ; [.2395.0020.0018] # ARABIC LETTER GUEH MEDIAL FORM -FB97 ; [.2395.0020.0019] # ARABIC LETTER GUEH FINAL FORM -FB96 ; [.2395.0020.001A] # ARABIC LETTER GUEH ISOLATED FORM -06B4 ; [.2396.0020.0002] # ARABIC LETTER GAF WITH THREE DOTS ABOVE -0762 ; [.2397.0020.0002] # ARABIC LETTER KEHEH WITH DOT ABOVE -063B ; [.2398.0020.0002] # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE -063C ; [.2399.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS BELOW -0763 ; [.239A.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE -0764 ; [.239B.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW -0644 ; [.239C.0020.0002] # ARABIC LETTER LAM -1EE0B ; [.239C.0020.0005] # ARABIC MATHEMATICAL LAM -1EE2B ; [.239C.0020.0005] # ARABIC MATHEMATICAL INITIAL LAM -1EE4B ; [.239C.0020.0005] # ARABIC MATHEMATICAL TAILED LAM -1EE8B ; [.239C.0020.0005] # ARABIC MATHEMATICAL LOOPED LAM -1EEAB ; [.239C.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK LAM -FEDF ; [.239C.0020.0017] # ARABIC LETTER LAM INITIAL FORM -FEE0 ; [.239C.0020.0018] # ARABIC LETTER LAM MEDIAL FORM -FEDE ; [.239C.0020.0019] # ARABIC LETTER LAM FINAL FORM -FEDD ; [.239C.0020.001A] # ARABIC LETTER LAM ISOLATED FORM -FEF6 ; [.239C.0020.0019][.22FE.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM -FEF5 ; [.239C.0020.001A][.22FE.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM -FEF8 ; [.239C.0020.0019][.22FF.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM -FEF7 ; [.239C.0020.001A][.22FF.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM -FEFA ; [.239C.0020.0019][.2303.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM -FEF9 ; [.239C.0020.001A][.2303.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM -FEFC ; [.239C.0020.0019][.230B.0020.0019] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FEFB ; [.239C.0020.001A][.230B.0020.001A] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM -FCC9 ; [.239C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM -FC3F ; [.239C.0020.001A][.2325.0020.001A] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM -FD83 ; [.239C.0020.0017][.2325.0020.0017][.2325.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM -FD84 ; [.239C.0020.0019][.2325.0020.0019][.2325.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM -FDBA ; [.239C.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM -FDBC ; [.239C.0020.0019][.2325.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM -FDAC ; [.239C.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM -FCCA ; [.239C.0020.0017][.232C.0020.0017] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM -FC40 ; [.239C.0020.001A][.232C.0020.001A] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM -FDB5 ; [.239C.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM -FD80 ; [.239C.0020.0019][.232C.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM -FD82 ; [.239C.0020.0019][.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM -FD81 ; [.239C.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM -FCCB ; [.239C.0020.0017][.232D.0020.0017] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM -FC41 ; [.239C.0020.001A][.232D.0020.001A] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM -FD86 ; [.239C.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM -FD85 ; [.239C.0020.0019][.232D.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM -FCCC ; [.239C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM -FCED ; [.239C.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM -FC85 ; [.239C.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM -FC42 ; [.239C.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM -FD88 ; [.239C.0020.0017][.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM -FD87 ; [.239C.0020.0019][.23A3.0020.0019][.232C.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM -FDAD ; [.239C.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM -FCCD ; [.239C.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM -FC86 ; [.239C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM -FC43 ; [.239C.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM -FC87 ; [.239C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE LAM WITH YEH FINAL FORM -FC44 ; [.239C.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM -06B5 ; [.239D.0020.0002] # ARABIC LETTER LAM WITH SMALL V -06B6 ; [.239E.0020.0002] # ARABIC LETTER LAM WITH DOT ABOVE -06B7 ; [.239F.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS ABOVE -06B8 ; [.23A0.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS BELOW -076A ; [.23A1.0020.0002] # ARABIC LETTER LAM WITH BAR -08A6 ; [.23A2.0020.0002] # ARABIC LETTER LAM WITH DOUBLE BAR -0645 ; [.23A3.0020.0002] # ARABIC LETTER MEEM -1EE0C ; [.23A3.0020.0005] # ARABIC MATHEMATICAL MEEM -1EE2C ; [.23A3.0020.0005] # ARABIC MATHEMATICAL INITIAL MEEM -1EE6C ; [.23A3.0020.0005] # ARABIC MATHEMATICAL STRETCHED MEEM -1EE8C ; [.23A3.0020.0005] # ARABIC MATHEMATICAL LOOPED MEEM -1EEAC ; [.23A3.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM -FEE3 ; [.23A3.0020.0017] # ARABIC LETTER MEEM INITIAL FORM -FEE4 ; [.23A3.0020.0018] # ARABIC LETTER MEEM MEDIAL FORM -FEE2 ; [.23A3.0020.0019] # ARABIC LETTER MEEM FINAL FORM -FEE1 ; [.23A3.0020.001A] # ARABIC LETTER MEEM ISOLATED FORM -06FE ; [.23A3.0020.0004][.0000.0111.0004] # ARABIC SIGN SINDHI POSTPOSITION MEN -FC88 ; [.23A3.0020.0019][.230B.0020.0019] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM -FCCE ; [.23A3.0020.0017][.2325.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM -FC45 ; [.23A3.0020.001A][.2325.0020.001A] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM -FD8C ; [.23A3.0020.0017][.2325.0020.0017][.232C.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM -FD92 ; [.23A3.0020.0017][.2325.0020.0017][.232D.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM -FD8D ; [.23A3.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM -FDC0 ; [.23A3.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM -FCCF ; [.23A3.0020.0017][.232C.0020.0017] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM -FC46 ; [.23A3.0020.001A][.232C.0020.001A] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM -FD89 ; [.23A3.0020.0017][.232C.0020.0017][.2325.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM -FD8A ; [.23A3.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM -FDF4 ; [.23A3.0020.001A][.232C.0020.001A][.23A3.0020.001A][.2337.0020.001A] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM -FD8B ; [.23A3.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM -FCD0 ; [.23A3.0020.0017][.232D.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM -FC47 ; [.23A3.0020.001A][.232D.0020.001A] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM -FD8E ; [.23A3.0020.0017][.232D.0020.0017][.2325.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM -FD8F ; [.23A3.0020.0017][.232D.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FDB9 ; [.23A3.0020.0019][.232D.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM -FCD1 ; [.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM -FC89 ; [.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM -FC48 ; [.23A3.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM -FDB1 ; [.23A3.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM -FC49 ; [.23A3.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM -FC4A ; [.23A3.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM -0765 ; [.23A4.0020.0002] # ARABIC LETTER MEEM WITH DOT ABOVE -0766 ; [.23A5.0020.0002] # ARABIC LETTER MEEM WITH DOT BELOW -08A7 ; [.23A6.0020.0002] # ARABIC LETTER MEEM WITH THREE DOTS ABOVE -0646 ; [.23A7.0020.0002] # ARABIC LETTER NOON -1EE0D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL NOON -1EE2D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL INITIAL NOON -1EE4D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL TAILED NOON -1EE6D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL STRETCHED NOON -1EE8D ; [.23A7.0020.0005] # ARABIC MATHEMATICAL LOOPED NOON -1EEAD ; [.23A7.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK NOON -FEE7 ; [.23A7.0020.0017] # ARABIC LETTER NOON INITIAL FORM -FEE8 ; [.23A7.0020.0018] # ARABIC LETTER NOON MEDIAL FORM -FEE6 ; [.23A7.0020.0019] # ARABIC LETTER NOON FINAL FORM -FEE5 ; [.23A7.0020.001A] # ARABIC LETTER NOON ISOLATED FORM -FCD2 ; [.23A7.0020.0017][.2325.0020.0017] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM -FC4B ; [.23A7.0020.001A][.2325.0020.001A] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM -FDB8 ; [.23A7.0020.0017][.2325.0020.0017][.232C.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM -FDBD ; [.23A7.0020.0019][.2325.0020.0019][.232C.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM -FD98 ; [.23A7.0020.0017][.2325.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM -FD97 ; [.23A7.0020.0019][.2325.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM -FD99 ; [.23A7.0020.0019][.2325.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM -FDC7 ; [.23A7.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FCD3 ; [.23A7.0020.0017][.232C.0020.0017] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM -FC4C ; [.23A7.0020.001A][.232C.0020.001A] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM -FD95 ; [.23A7.0020.0017][.232C.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM -FD96 ; [.23A7.0020.0019][.232C.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM -FDB3 ; [.23A7.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM -FCD4 ; [.23A7.0020.0017][.232D.0020.0017] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM -FC4D ; [.23A7.0020.001A][.232D.0020.001A] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM -FC8A ; [.23A7.0020.0019][.2346.0020.0019] # ARABIC LIGATURE NOON WITH REH FINAL FORM -FC8B ; [.23A7.0020.0019][.2347.0020.0019] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM -FCD5 ; [.23A7.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM -FCEE ; [.23A7.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM -FC8C ; [.23A7.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM -FC4E ; [.23A7.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM -FD9B ; [.23A7.0020.0019][.23A3.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM -FD9A ; [.23A7.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM -FC8D ; [.23A7.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE NOON WITH NOON FINAL FORM -FCD6 ; [.23A7.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM -FCEF ; [.23A7.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM -FC8E ; [.23A7.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM -FC4F ; [.23A7.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM -FC8F ; [.23A7.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE NOON WITH YEH FINAL FORM -FC50 ; [.23A7.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM -06BA ; [.23A8.0020.0002] # ARABIC LETTER NOON GHUNNA -1EE1D ; [.23A8.0020.0005] # ARABIC MATHEMATICAL DOTLESS NOON -1EE5D ; [.23A8.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS NOON -FB9F ; [.23A8.0020.0019] # ARABIC LETTER NOON GHUNNA FINAL FORM -FB9E ; [.23A8.0020.001A] # ARABIC LETTER NOON GHUNNA ISOLATED FORM -08BD ; [.23A9.0020.0002] # ARABIC LETTER AFRICAN NOON -06BB ; [.23AA.0020.0002] # ARABIC LETTER RNOON -FBA2 ; [.23AA.0020.0017] # ARABIC LETTER RNOON INITIAL FORM -FBA3 ; [.23AA.0020.0018] # ARABIC LETTER RNOON MEDIAL FORM -FBA1 ; [.23AA.0020.0019] # ARABIC LETTER RNOON FINAL FORM -FBA0 ; [.23AA.0020.001A] # ARABIC LETTER RNOON ISOLATED FORM -06BC ; [.23AB.0020.0002] # ARABIC LETTER NOON WITH RING -06BD ; [.23AC.0020.0002] # ARABIC LETTER NOON WITH THREE DOTS ABOVE -06B9 ; [.23AD.0020.0002] # ARABIC LETTER NOON WITH DOT BELOW -0767 ; [.23AE.0020.0002] # ARABIC LETTER NOON WITH TWO DOTS BELOW -0768 ; [.23AF.0020.0002] # ARABIC LETTER NOON WITH SMALL TAH -0769 ; [.23B0.0020.0002] # ARABIC LETTER NOON WITH SMALL V -0647 ; [.23B1.0020.0002] # ARABIC LETTER HEH -1EE24 ; [.23B1.0020.0005] # ARABIC MATHEMATICAL INITIAL HEH -1EE64 ; [.23B1.0020.0005] # ARABIC MATHEMATICAL STRETCHED HEH -1EE84 ; [.23B1.0020.0005] # ARABIC MATHEMATICAL LOOPED HEH -FEEB ; [.23B1.0020.0017] # ARABIC LETTER HEH INITIAL FORM -FEEC ; [.23B1.0020.0018] # ARABIC LETTER HEH MEDIAL FORM -FEEA ; [.23B1.0020.0019] # ARABIC LETTER HEH FINAL FORM -FEE9 ; [.23B1.0020.001A] # ARABIC LETTER HEH ISOLATED FORM -FCD9 ; [.23B1.0020.0017][.0000.0098.0017] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM -FCD7 ; [.23B1.0020.0017][.2325.0020.0017] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM -FC51 ; [.23B1.0020.001A][.2325.0020.001A] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM -FCD8 ; [.23B1.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM -FC52 ; [.23B1.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM -FD93 ; [.23B1.0020.0017][.23A3.0020.0017][.2325.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM -FD94 ; [.23B1.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM -FC53 ; [.23B1.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM -FC54 ; [.23B1.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM -06BE ; [.23B2.0020.0002] # ARABIC LETTER HEH DOACHASHMEE -FBAC ; [.23B2.0020.0017] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM -FBAD ; [.23B2.0020.0018] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM -FBAB ; [.23B2.0020.0019] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM -FBAA ; [.23B2.0020.001A] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM -06C1 ; [.23B3.0020.0002] # ARABIC LETTER HEH GOAL -FBA8 ; [.23B3.0020.0017] # ARABIC LETTER HEH GOAL INITIAL FORM -FBA9 ; [.23B3.0020.0018] # ARABIC LETTER HEH GOAL MEDIAL FORM -FBA7 ; [.23B3.0020.0019] # ARABIC LETTER HEH GOAL FINAL FORM -FBA6 ; [.23B3.0020.001A] # ARABIC LETTER HEH GOAL ISOLATED FORM -06C2 ; [.23B3.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE -06C3 ; [.23B4.0020.0002] # ARABIC LETTER TEH MARBUTA GOAL -06FF ; [.23B5.0020.0002] # ARABIC LETTER HEH WITH INVERTED V -06D5 ; [.23B6.0020.0002] # ARABIC LETTER AE -06C0 ; [.23B6.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH WITH YEH ABOVE -FBA5 ; [.23B6.0020.0019][.0000.0083.0019] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM -FBA4 ; [.23B6.0020.001A][.0000.0083.001A] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM -0648 ; [.23B7.0020.0002] # ARABIC LETTER WAW -06E5 ; [.23B7.0020.0004] # ARABIC SMALL WAW -1EE05 ; [.23B7.0020.0005] # ARABIC MATHEMATICAL WAW -1EE85 ; [.23B7.0020.0005] # ARABIC MATHEMATICAL LOOPED WAW -1EEA5 ; [.23B7.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK WAW -FEEE ; [.23B7.0020.0019] # ARABIC LETTER WAW FINAL FORM -FEED ; [.23B7.0020.001A] # ARABIC LETTER WAW ISOLATED FORM -0676 ; [.23B7.0020.0004][.22FD.0020.0004] # ARABIC LETTER HIGH HAMZA WAW -FDF8 ; [.23B7.0020.001A][.2359.0020.001A][.239C.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE WASALLAM ISOLATED FORM -06C4 ; [.23B8.0020.0002] # ARABIC LETTER WAW WITH RING -06C5 ; [.23B9.0020.0002] # ARABIC LETTER KIRGHIZ OE -FBE1 ; [.23B9.0020.0019] # ARABIC LETTER KIRGHIZ OE FINAL FORM -FBE0 ; [.23B9.0020.001A] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM -06C6 ; [.23BA.0020.0002] # ARABIC LETTER OE -FBDA ; [.23BA.0020.0019] # ARABIC LETTER OE FINAL FORM -FBD9 ; [.23BA.0020.001A] # ARABIC LETTER OE ISOLATED FORM -06C7 ; [.23BB.0020.0002] # ARABIC LETTER U -FBD8 ; [.23BB.0020.0019] # ARABIC LETTER U FINAL FORM -FBD7 ; [.23BB.0020.001A] # ARABIC LETTER U ISOLATED FORM -0677 ; [.23BB.0020.0004][.22FD.0020.0004] # ARABIC LETTER U WITH HAMZA ABOVE -FBDD ; [.23BB.0020.001A][.22FD.0020.001A] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM -06C8 ; [.23BC.0020.0002] # ARABIC LETTER YU -FBDC ; [.23BC.0020.0019] # ARABIC LETTER YU FINAL FORM -FBDB ; [.23BC.0020.001A] # ARABIC LETTER YU ISOLATED FORM -06C9 ; [.23BD.0020.0002] # ARABIC LETTER KIRGHIZ YU -FBE3 ; [.23BD.0020.0019] # ARABIC LETTER KIRGHIZ YU FINAL FORM -FBE2 ; [.23BD.0020.001A] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM -06CA ; [.23BE.0020.0002] # ARABIC LETTER WAW WITH TWO DOTS ABOVE -06CB ; [.23BF.0020.0002] # ARABIC LETTER VE -FBDF ; [.23BF.0020.0019] # ARABIC LETTER VE FINAL FORM -FBDE ; [.23BF.0020.001A] # ARABIC LETTER VE ISOLATED FORM -08B1 ; [.23C0.0020.0002] # ARABIC LETTER STRAIGHT WAW -06CF ; [.23C1.0020.0002] # ARABIC LETTER WAW WITH DOT ABOVE -0778 ; [.23C2.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -0779 ; [.23C3.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -08AB ; [.23C4.0020.0002] # ARABIC LETTER WAW WITH DOT WITHIN -0649 ; [.23C5.0020.0002] # ARABIC LETTER ALEF MAKSURA -FBE8 ; [.23C5.0020.0017] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM -FBE9 ; [.23C5.0020.0018] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM -FEF0 ; [.23C5.0020.0019] # ARABIC LETTER ALEF MAKSURA FINAL FORM -FEEF ; [.23C5.0020.001A] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM -FC90 ; [.23C5.0020.0019][.0000.0098.0019] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM -FC5D ; [.23C5.0020.001A][.0000.0098.001A] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM -064A ; [.23C6.0020.0002] # ARABIC LETTER YEH -06E6 ; [.23C6.0020.0004] # ARABIC SMALL YEH -1EE09 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL YEH -1EE29 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL INITIAL YEH -1EE49 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL TAILED YEH -1EE69 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL STRETCHED YEH -1EE89 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL LOOPED YEH -1EEA9 ; [.23C6.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK YEH -FEF3 ; [.23C6.0020.0017] # ARABIC LETTER YEH INITIAL FORM -FEF4 ; [.23C6.0020.0018] # ARABIC LETTER YEH MEDIAL FORM -FEF2 ; [.23C6.0020.0019] # ARABIC LETTER YEH FINAL FORM -FEF1 ; [.23C6.0020.001A] # ARABIC LETTER YEH ISOLATED FORM -0678 ; [.23C6.0020.0004][.22FD.0020.0004] # ARABIC LETTER HIGH HAMZA YEH -FCDA ; [.23C6.0020.0017][.2325.0020.0017] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM -FC55 ; [.23C6.0020.001A][.2325.0020.001A] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM -FDAF ; [.23C6.0020.0019][.2325.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM -FCDB ; [.23C6.0020.0017][.232C.0020.0017] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM -FC56 ; [.23C6.0020.001A][.232C.0020.001A] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM -FDAE ; [.23C6.0020.0019][.232C.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM -FCDC ; [.23C6.0020.0017][.232D.0020.0017] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM -FC57 ; [.23C6.0020.001A][.232D.0020.001A] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM -FC91 ; [.23C6.0020.0019][.2346.0020.0019] # ARABIC LIGATURE YEH WITH REH FINAL FORM -FC92 ; [.23C6.0020.0019][.2347.0020.0019] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM -FCDD ; [.23C6.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM -FCF0 ; [.23C6.0020.0018][.23A3.0020.0018] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM -FC93 ; [.23C6.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM -FC58 ; [.23C6.0020.001A][.23A3.0020.001A] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM -FD9D ; [.23C6.0020.0017][.23A3.0020.0017][.23A3.0020.0017] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM -FD9C ; [.23C6.0020.0019][.23A3.0020.0019][.23A3.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM -FDB0 ; [.23C6.0020.0019][.23A3.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM -FC94 ; [.23C6.0020.0019][.23A7.0020.0019] # ARABIC LIGATURE YEH WITH NOON FINAL FORM -FCDE ; [.23C6.0020.0017][.23B1.0020.0017] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM -FCF1 ; [.23C6.0020.0018][.23B1.0020.0018] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM -FC95 ; [.23C6.0020.0019][.23C5.0020.0019] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM -FC59 ; [.23C6.0020.001A][.23C5.0020.001A] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM -FC96 ; [.23C6.0020.0019][.23C6.0020.0019] # ARABIC LIGATURE YEH WITH YEH FINAL FORM -FC5A ; [.23C6.0020.001A][.23C6.0020.001A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM -06CC ; [.23C7.0020.0002] # ARABIC LETTER FARSI YEH -FBFE ; [.23C7.0020.0017] # ARABIC LETTER FARSI YEH INITIAL FORM -FBFF ; [.23C7.0020.0018] # ARABIC LETTER FARSI YEH MEDIAL FORM -FBFD ; [.23C7.0020.0019] # ARABIC LETTER FARSI YEH FINAL FORM -FBFC ; [.23C7.0020.001A] # ARABIC LETTER FARSI YEH ISOLATED FORM -06CD ; [.23C8.0020.0002] # ARABIC LETTER YEH WITH TAIL -06CE ; [.23C9.0020.0002] # ARABIC LETTER YEH WITH SMALL V -06D0 ; [.23CA.0020.0002] # ARABIC LETTER E -FBE6 ; [.23CA.0020.0017] # ARABIC LETTER E INITIAL FORM -FBE7 ; [.23CA.0020.0018] # ARABIC LETTER E MEDIAL FORM -FBE5 ; [.23CA.0020.0019] # ARABIC LETTER E FINAL FORM -FBE4 ; [.23CA.0020.001A] # ARABIC LETTER E ISOLATED FORM -06D1 ; [.23CB.0020.0002] # ARABIC LETTER YEH WITH THREE DOTS BELOW -063D ; [.23CC.0020.0002] # ARABIC LETTER FARSI YEH WITH INVERTED V -063E ; [.23CD.0020.0002] # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE -063F ; [.23CE.0020.0002] # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -0620 ; [.23CF.0020.0002] # ARABIC LETTER KASHMIRI YEH -0775 ; [.23D0.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -0776 ; [.23D1.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -0777 ; [.23D2.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW -08BA ; [.23D3.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE -06D2 ; [.23D4.0020.0002] # ARABIC LETTER YEH BARREE -FBAF ; [.23D4.0020.0019] # ARABIC LETTER YEH BARREE FINAL FORM -FBAE ; [.23D4.0020.001A] # ARABIC LETTER YEH BARREE ISOLATED FORM -06D3 ; [.23D4.0020.0002][.0000.0083.0002] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -FBB1 ; [.23D4.0020.0019][.0000.0083.0019] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBB0 ; [.23D4.0020.001A][.0000.0083.001A] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM -077A ; [.23D5.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE -077B ; [.23D6.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE -0710 ; [.23D7.0020.0002] # SYRIAC LETTER ALAPH -0712 ; [.23D8.0020.0002] # SYRIAC LETTER BETH -072D ; [.23D8.0020.0004][.0000.0112.0004] # SYRIAC LETTER PERSIAN BHETH -0713 ; [.23D9.0020.0002] # SYRIAC LETTER GAMAL -0714 ; [.23D9.0020.0004][.0000.0111.0004] # SYRIAC LETTER GAMAL GARSHUNI -072E ; [.23D9.0020.0004][.0000.0112.0004] # SYRIAC LETTER PERSIAN GHAMAL -0716 ; [.23DA.0020.0002] # SYRIAC LETTER DOTLESS DALATH RISH -0715 ; [.23DB.0020.0002] # SYRIAC LETTER DALATH -072F ; [.23DB.0020.0004][.0000.0112.0004] # SYRIAC LETTER PERSIAN DHALATH -0717 ; [.23DC.0020.0002] # SYRIAC LETTER HE -0718 ; [.23DD.0020.0002] # SYRIAC LETTER WAW -0719 ; [.23DE.0020.0002] # SYRIAC LETTER ZAIN -074D ; [.23DF.0020.0002] # SYRIAC LETTER SOGDIAN ZHAIN -071A ; [.23E0.0020.0002] # SYRIAC LETTER HETH -071B ; [.23E1.0020.0002] # SYRIAC LETTER TETH -071C ; [.23E1.0020.0004][.0000.0111.0004] # SYRIAC LETTER TETH GARSHUNI -071D ; [.23E2.0020.0002] # SYRIAC LETTER YUDH -071E ; [.23E3.0020.0002] # SYRIAC LETTER YUDH HE -071F ; [.23E4.0020.0002] # SYRIAC LETTER KAPH -074E ; [.23E5.0020.0002] # SYRIAC LETTER SOGDIAN KHAPH -0720 ; [.23E6.0020.0002] # SYRIAC LETTER LAMADH -0721 ; [.23E7.0020.0002] # SYRIAC LETTER MIM -0722 ; [.23E8.0020.0002] # SYRIAC LETTER NUN -0723 ; [.23E9.0020.0002] # SYRIAC LETTER SEMKATH -0724 ; [.23E9.0020.0019] # SYRIAC LETTER FINAL SEMKATH -0725 ; [.23EA.0020.0002] # SYRIAC LETTER E -0726 ; [.23EB.0020.0002] # SYRIAC LETTER PE -0727 ; [.23EB.0020.0004][.0000.0111.0004] # SYRIAC LETTER REVERSED PE -074F ; [.23EC.0020.0002] # SYRIAC LETTER SOGDIAN FE -0728 ; [.23ED.0020.0002] # SYRIAC LETTER SADHE -0729 ; [.23EE.0020.0002] # SYRIAC LETTER QAPH -072A ; [.23EF.0020.0002] # SYRIAC LETTER RISH -072B ; [.23F0.0020.0002] # SYRIAC LETTER SHIN -072C ; [.23F1.0020.0002] # SYRIAC LETTER TAW -0840 ; [.23F2.0020.0002] # MANDAIC LETTER HALQA -0841 ; [.23F3.0020.0002] # MANDAIC LETTER AB -0842 ; [.23F4.0020.0002] # MANDAIC LETTER AG -0843 ; [.23F5.0020.0002] # MANDAIC LETTER AD -0844 ; [.23F6.0020.0002] # MANDAIC LETTER AH -0845 ; [.23F7.0020.0002] # MANDAIC LETTER USHENNA -0846 ; [.23F8.0020.0002] # MANDAIC LETTER AZ -0847 ; [.23F9.0020.0002] # MANDAIC LETTER IT -0848 ; [.23FA.0020.0002] # MANDAIC LETTER ATT -0849 ; [.23FB.0020.0002] # MANDAIC LETTER AKSA -084A ; [.23FC.0020.0002] # MANDAIC LETTER AK -084B ; [.23FD.0020.0002] # MANDAIC LETTER AL -084C ; [.23FE.0020.0002] # MANDAIC LETTER AM -084D ; [.23FF.0020.0002] # MANDAIC LETTER AN -084E ; [.2400.0020.0002] # MANDAIC LETTER AS -084F ; [.2401.0020.0002] # MANDAIC LETTER IN -0850 ; [.2402.0020.0002] # MANDAIC LETTER AP -0851 ; [.2403.0020.0002] # MANDAIC LETTER ASZ -0852 ; [.2404.0020.0002] # MANDAIC LETTER AQ -0853 ; [.2405.0020.0002] # MANDAIC LETTER AR -0854 ; [.2406.0020.0002] # MANDAIC LETTER ASH -0855 ; [.2407.0020.0002] # MANDAIC LETTER AT -0856 ; [.2408.0020.0002] # MANDAIC LETTER DUSHENNA -0857 ; [.2409.0020.0002] # MANDAIC LETTER KAD -0858 ; [.240A.0020.0002] # MANDAIC LETTER AIN -0780 ; [.240B.0020.0002] # THAANA LETTER HAA -0799 ; [.240C.0020.0002] # THAANA LETTER HHAA -079A ; [.240D.0020.0002] # THAANA LETTER KHAA -0781 ; [.240E.0020.0002] # THAANA LETTER SHAVIYANI -0782 ; [.240F.0020.0002] # THAANA LETTER NOONU -0783 ; [.2410.0020.0002] # THAANA LETTER RAA -079C ; [.2411.0020.0002] # THAANA LETTER ZAA -0784 ; [.2412.0020.0002] # THAANA LETTER BAA -0785 ; [.2413.0020.0002] # THAANA LETTER LHAVIYANI -0786 ; [.2414.0020.0002] # THAANA LETTER KAAFU -0787 ; [.2415.0020.0002] # THAANA LETTER ALIFU -07A2 ; [.2416.0020.0002] # THAANA LETTER AINU -07A3 ; [.2417.0020.0002] # THAANA LETTER GHAINU -0788 ; [.2418.0020.0002] # THAANA LETTER VAAVU -07A5 ; [.2419.0020.0002] # THAANA LETTER WAAVU -0789 ; [.241A.0020.0002] # THAANA LETTER MEEMU -078A ; [.241B.0020.0002] # THAANA LETTER FAAFU -078B ; [.241C.0020.0002] # THAANA LETTER DHAALU -079B ; [.241D.0020.0002] # THAANA LETTER THAALU -078C ; [.241E.0020.0002] # THAANA LETTER THAA -0798 ; [.241F.0020.0002] # THAANA LETTER TTAA -07A0 ; [.2420.0020.0002] # THAANA LETTER TO -07A1 ; [.2421.0020.0002] # THAANA LETTER ZO -078D ; [.2422.0020.0002] # THAANA LETTER LAAMU -078E ; [.2423.0020.0002] # THAANA LETTER GAAFU -07A4 ; [.2424.0020.0002] # THAANA LETTER QAAFU -078F ; [.2425.0020.0002] # THAANA LETTER GNAVIYANI -0790 ; [.2426.0020.0002] # THAANA LETTER SEENU -079D ; [.2427.0020.0002] # THAANA LETTER SHEENU -079E ; [.2428.0020.0002] # THAANA LETTER SAADHU -079F ; [.2429.0020.0002] # THAANA LETTER DAADHU -0791 ; [.242A.0020.0002] # THAANA LETTER DAVIYANI -0792 ; [.242B.0020.0002] # THAANA LETTER ZAVIYANI -0793 ; [.242C.0020.0002] # THAANA LETTER TAVIYANI -0794 ; [.242D.0020.0002] # THAANA LETTER YAA -0795 ; [.242E.0020.0002] # THAANA LETTER PAVIYANI -0796 ; [.242F.0020.0002] # THAANA LETTER JAVIYANI -0797 ; [.2430.0020.0002] # THAANA LETTER CHAVIYANI -07B1 ; [.2431.0020.0002] # THAANA LETTER NAA -07A6 ; [.2432.0020.0002] # THAANA ABAFILI -07A7 ; [.2433.0020.0002] # THAANA AABAAFILI -07A8 ; [.2434.0020.0002] # THAANA IBIFILI -07A9 ; [.2435.0020.0002] # THAANA EEBEEFILI -07AA ; [.2436.0020.0002] # THAANA UBUFILI -07AB ; [.2437.0020.0002] # THAANA OOBOOFILI -07AC ; [.2438.0020.0002] # THAANA EBEFILI -07AD ; [.2439.0020.0002] # THAANA EYBEYFILI -07AE ; [.243A.0020.0002] # THAANA OBOFILI -07AF ; [.243B.0020.0002] # THAANA OABOAFILI -07B0 ; [.243C.0020.0002] # THAANA SUKUN -07CA ; [.243D.0020.0002] # NKO LETTER A -07CB ; [.243E.0020.0002] # NKO LETTER EE -07CC ; [.243F.0020.0002] # NKO LETTER I -07CD ; [.2440.0020.0002] # NKO LETTER E -07CE ; [.2441.0020.0002] # NKO LETTER U -07CF ; [.2442.0020.0002] # NKO LETTER OO -07D0 ; [.2443.0020.0002] # NKO LETTER O -07D1 ; [.2444.0020.0002] # NKO LETTER DAGBASINNA -07D2 ; [.2445.0020.0002] # NKO LETTER N -07D3 ; [.2446.0020.0002] # NKO LETTER BA -07D4 ; [.2447.0020.0002] # NKO LETTER PA -07D5 ; [.2448.0020.0002] # NKO LETTER TA -07D6 ; [.2449.0020.0002] # NKO LETTER JA -07E8 ; [.2449.0020.0004][.0000.0110.0004] # NKO LETTER JONA JA -07D7 ; [.244A.0020.0002] # NKO LETTER CHA -07E9 ; [.244A.0020.0004][.0000.0110.0004] # NKO LETTER JONA CHA -07D8 ; [.244B.0020.0002] # NKO LETTER DA -07D9 ; [.244C.0020.0002] # NKO LETTER RA -07EA ; [.244C.0020.0004][.0000.0110.0004] # NKO LETTER JONA RA -07DA ; [.244D.0020.0002] # NKO LETTER RRA -07DB ; [.244E.0020.0002] # NKO LETTER SA -07DC ; [.244F.0020.0002] # NKO LETTER GBA -07DD ; [.2450.0020.0002] # NKO LETTER FA -07DE ; [.2451.0020.0002] # NKO LETTER KA -07DF ; [.2452.0020.0002] # NKO LETTER LA -07E0 ; [.2453.0020.0002] # NKO LETTER NA WOLOSO -07E1 ; [.2454.0020.0002] # NKO LETTER MA -07E2 ; [.2455.0020.0002] # NKO LETTER NYA -07E3 ; [.2456.0020.0002] # NKO LETTER NA -07E4 ; [.2457.0020.0002] # NKO LETTER HA -07E5 ; [.2458.0020.0002] # NKO LETTER WA -07E6 ; [.2459.0020.0002] # NKO LETTER YA -07E7 ; [.245A.0020.0002] # NKO LETTER NYA WOLOSO -07F4 ; [.245B.0020.0002] # NKO HIGH TONE APOSTROPHE -07F5 ; [.245C.0020.0002] # NKO LOW TONE APOSTROPHE -2D30 ; [.245D.0020.0002] # TIFINAGH LETTER YA -2D31 ; [.245E.0020.0002] # TIFINAGH LETTER YAB -2D32 ; [.245F.0020.0002] # TIFINAGH LETTER YABH -2D33 ; [.2460.0020.0002] # TIFINAGH LETTER YAG -2D34 ; [.2461.0020.0002] # TIFINAGH LETTER YAGHH -2D35 ; [.2462.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAJ -2D36 ; [.2463.0020.0002] # TIFINAGH LETTER YAJ -2D37 ; [.2464.0020.0002] # TIFINAGH LETTER YAD -2D38 ; [.2465.0020.0002] # TIFINAGH LETTER YADH -2D39 ; [.2466.0020.0002] # TIFINAGH LETTER YADD -2D3A ; [.2467.0020.0002] # TIFINAGH LETTER YADDH -2D3B ; [.2468.0020.0002] # TIFINAGH LETTER YEY -2D66 ; [.2469.0020.0002] # TIFINAGH LETTER YE -2D3C ; [.246A.0020.0002] # TIFINAGH LETTER YAF -2D3D ; [.246B.0020.0002] # TIFINAGH LETTER YAK -2D3E ; [.246C.0020.0002] # TIFINAGH LETTER TUAREG YAK -2D3F ; [.246D.0020.0002] # TIFINAGH LETTER YAKHH -2D40 ; [.246E.0020.0002] # TIFINAGH LETTER YAH -2D41 ; [.246F.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAH -2D42 ; [.2470.0020.0002] # TIFINAGH LETTER TUAREG YAH -2D43 ; [.2471.0020.0002] # TIFINAGH LETTER YAHH -2D44 ; [.2472.0020.0002] # TIFINAGH LETTER YAA -2D45 ; [.2473.0020.0002] # TIFINAGH LETTER YAKH -2D46 ; [.2474.0020.0002] # TIFINAGH LETTER TUAREG YAKH -2D47 ; [.2475.0020.0002] # TIFINAGH LETTER YAQ -2D48 ; [.2476.0020.0002] # TIFINAGH LETTER TUAREG YAQ -2D49 ; [.2477.0020.0002] # TIFINAGH LETTER YI -2D4A ; [.2478.0020.0002] # TIFINAGH LETTER YAZH -2D4B ; [.2479.0020.0002] # TIFINAGH LETTER AHAGGAR YAZH -2D4C ; [.247A.0020.0002] # TIFINAGH LETTER TUAREG YAZH -2D4D ; [.247B.0020.0002] # TIFINAGH LETTER YAL -2D4E ; [.247C.0020.0002] # TIFINAGH LETTER YAM -2D4F ; [.247D.0020.0002] # TIFINAGH LETTER YAN -2D50 ; [.247E.0020.0002] # TIFINAGH LETTER TUAREG YAGN -2D51 ; [.247F.0020.0002] # TIFINAGH LETTER TUAREG YANG -2D52 ; [.2480.0020.0002] # TIFINAGH LETTER YAP -2D53 ; [.2481.0020.0002] # TIFINAGH LETTER YU -2D67 ; [.2482.0020.0002] # TIFINAGH LETTER YO -2D54 ; [.2483.0020.0002] # TIFINAGH LETTER YAR -2D55 ; [.2484.0020.0002] # TIFINAGH LETTER YARR -2D56 ; [.2485.0020.0002] # TIFINAGH LETTER YAGH -2D57 ; [.2486.0020.0002] # TIFINAGH LETTER TUAREG YAGH -2D58 ; [.2487.0020.0002] # TIFINAGH LETTER AYER YAGH -2D59 ; [.2488.0020.0002] # TIFINAGH LETTER YAS -2D5A ; [.2489.0020.0002] # TIFINAGH LETTER YASS -2D5B ; [.248A.0020.0002] # TIFINAGH LETTER YASH -2D5C ; [.248B.0020.0002] # TIFINAGH LETTER YAT -2D5D ; [.248C.0020.0002] # TIFINAGH LETTER YATH -2D5E ; [.248D.0020.0002] # TIFINAGH LETTER YACH -2D5F ; [.248E.0020.0002] # TIFINAGH LETTER YATT -2D60 ; [.248F.0020.0002] # TIFINAGH LETTER YAV -2D61 ; [.2490.0020.0002] # TIFINAGH LETTER YAW -2D62 ; [.2491.0020.0002] # TIFINAGH LETTER YAY -2D63 ; [.2492.0020.0002] # TIFINAGH LETTER YAZ -2D64 ; [.2493.0020.0002] # TIFINAGH LETTER TAWELLEMET YAZ -2D65 ; [.2494.0020.0002] # TIFINAGH LETTER YAZZ -2D6F ; [.2495.0020.0002] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK -1200 ; [.2496.0020.0002] # ETHIOPIC SYLLABLE HA -1201 ; [.2497.0020.0002] # ETHIOPIC SYLLABLE HU -1202 ; [.2498.0020.0002] # ETHIOPIC SYLLABLE HI -1203 ; [.2499.0020.0002] # ETHIOPIC SYLLABLE HAA -1204 ; [.249A.0020.0002] # ETHIOPIC SYLLABLE HEE -1205 ; [.249B.0020.0002] # ETHIOPIC SYLLABLE HE -1206 ; [.249C.0020.0002] # ETHIOPIC SYLLABLE HO -1207 ; [.249D.0020.0002] # ETHIOPIC SYLLABLE HOA -1208 ; [.249E.0020.0002] # ETHIOPIC SYLLABLE LA -1209 ; [.249F.0020.0002] # ETHIOPIC SYLLABLE LU -120A ; [.24A0.0020.0002] # ETHIOPIC SYLLABLE LI -120B ; [.24A1.0020.0002] # ETHIOPIC SYLLABLE LAA -120C ; [.24A2.0020.0002] # ETHIOPIC SYLLABLE LEE -120D ; [.24A3.0020.0002] # ETHIOPIC SYLLABLE LE -120E ; [.24A4.0020.0002] # ETHIOPIC SYLLABLE LO -120F ; [.24A5.0020.0002] # ETHIOPIC SYLLABLE LWA -2D80 ; [.24A6.0020.0002] # ETHIOPIC SYLLABLE LOA -1210 ; [.24A7.0020.0002] # ETHIOPIC SYLLABLE HHA -1211 ; [.24A8.0020.0002] # ETHIOPIC SYLLABLE HHU -1212 ; [.24A9.0020.0002] # ETHIOPIC SYLLABLE HHI -1213 ; [.24AA.0020.0002] # ETHIOPIC SYLLABLE HHAA -1214 ; [.24AB.0020.0002] # ETHIOPIC SYLLABLE HHEE -1215 ; [.24AC.0020.0002] # ETHIOPIC SYLLABLE HHE -1216 ; [.24AD.0020.0002] # ETHIOPIC SYLLABLE HHO -1217 ; [.24AE.0020.0002] # ETHIOPIC SYLLABLE HHWA -1218 ; [.24AF.0020.0002] # ETHIOPIC SYLLABLE MA -1219 ; [.24B0.0020.0002] # ETHIOPIC SYLLABLE MU -121A ; [.24B1.0020.0002] # ETHIOPIC SYLLABLE MI -121B ; [.24B2.0020.0002] # ETHIOPIC SYLLABLE MAA -121C ; [.24B3.0020.0002] # ETHIOPIC SYLLABLE MEE -121D ; [.24B4.0020.0002] # ETHIOPIC SYLLABLE ME -121E ; [.24B5.0020.0002] # ETHIOPIC SYLLABLE MO -121F ; [.24B6.0020.0002] # ETHIOPIC SYLLABLE MWA -1380 ; [.24B7.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT MWA -1381 ; [.24B8.0020.0002] # ETHIOPIC SYLLABLE MWI -1382 ; [.24B9.0020.0002] # ETHIOPIC SYLLABLE MWEE -1383 ; [.24BA.0020.0002] # ETHIOPIC SYLLABLE MWE -2D81 ; [.24BB.0020.0002] # ETHIOPIC SYLLABLE MOA -1220 ; [.24BC.0020.0002] # ETHIOPIC SYLLABLE SZA -1221 ; [.24BD.0020.0002] # ETHIOPIC SYLLABLE SZU -1222 ; [.24BE.0020.0002] # ETHIOPIC SYLLABLE SZI -1223 ; [.24BF.0020.0002] # ETHIOPIC SYLLABLE SZAA -1224 ; [.24C0.0020.0002] # ETHIOPIC SYLLABLE SZEE -1225 ; [.24C1.0020.0002] # ETHIOPIC SYLLABLE SZE -1226 ; [.24C2.0020.0002] # ETHIOPIC SYLLABLE SZO -1227 ; [.24C3.0020.0002] # ETHIOPIC SYLLABLE SZWA -1228 ; [.24C4.0020.0002] # ETHIOPIC SYLLABLE RA -1229 ; [.24C5.0020.0002] # ETHIOPIC SYLLABLE RU -122A ; [.24C6.0020.0002] # ETHIOPIC SYLLABLE RI -122B ; [.24C7.0020.0002] # ETHIOPIC SYLLABLE RAA -122C ; [.24C8.0020.0002] # ETHIOPIC SYLLABLE REE -122D ; [.24C9.0020.0002] # ETHIOPIC SYLLABLE RE -122E ; [.24CA.0020.0002] # ETHIOPIC SYLLABLE RO -122F ; [.24CB.0020.0002] # ETHIOPIC SYLLABLE RWA -2D82 ; [.24CC.0020.0002] # ETHIOPIC SYLLABLE ROA -1230 ; [.24CD.0020.0002] # ETHIOPIC SYLLABLE SA -1231 ; [.24CE.0020.0002] # ETHIOPIC SYLLABLE SU -1232 ; [.24CF.0020.0002] # ETHIOPIC SYLLABLE SI -1233 ; [.24D0.0020.0002] # ETHIOPIC SYLLABLE SAA -1234 ; [.24D1.0020.0002] # ETHIOPIC SYLLABLE SEE -1235 ; [.24D2.0020.0002] # ETHIOPIC SYLLABLE SE -1236 ; [.24D3.0020.0002] # ETHIOPIC SYLLABLE SO -1237 ; [.24D4.0020.0002] # ETHIOPIC SYLLABLE SWA -2D83 ; [.24D5.0020.0002] # ETHIOPIC SYLLABLE SOA -AB01 ; [.24D6.0020.0002] # ETHIOPIC SYLLABLE TTHU -AB02 ; [.24D7.0020.0002] # ETHIOPIC SYLLABLE TTHI -AB03 ; [.24D8.0020.0002] # ETHIOPIC SYLLABLE TTHAA -AB04 ; [.24D9.0020.0002] # ETHIOPIC SYLLABLE TTHEE -AB05 ; [.24DA.0020.0002] # ETHIOPIC SYLLABLE TTHE -AB06 ; [.24DB.0020.0002] # ETHIOPIC SYLLABLE TTHO -1238 ; [.24DC.0020.0002] # ETHIOPIC SYLLABLE SHA -1239 ; [.24DD.0020.0002] # ETHIOPIC SYLLABLE SHU -123A ; [.24DE.0020.0002] # ETHIOPIC SYLLABLE SHI -123B ; [.24DF.0020.0002] # ETHIOPIC SYLLABLE SHAA -123C ; [.24E0.0020.0002] # ETHIOPIC SYLLABLE SHEE -123D ; [.24E1.0020.0002] # ETHIOPIC SYLLABLE SHE -123E ; [.24E2.0020.0002] # ETHIOPIC SYLLABLE SHO -123F ; [.24E3.0020.0002] # ETHIOPIC SYLLABLE SHWA -2D84 ; [.24E4.0020.0002] # ETHIOPIC SYLLABLE SHOA -1240 ; [.24E5.0020.0002] # ETHIOPIC SYLLABLE QA -1241 ; [.24E6.0020.0002] # ETHIOPIC SYLLABLE QU -1242 ; [.24E7.0020.0002] # ETHIOPIC SYLLABLE QI -1243 ; [.24E8.0020.0002] # ETHIOPIC SYLLABLE QAA -1244 ; [.24E9.0020.0002] # ETHIOPIC SYLLABLE QEE -1245 ; [.24EA.0020.0002] # ETHIOPIC SYLLABLE QE -1246 ; [.24EB.0020.0002] # ETHIOPIC SYLLABLE QO -1247 ; [.24EC.0020.0002] # ETHIOPIC SYLLABLE QOA -1248 ; [.24ED.0020.0002] # ETHIOPIC SYLLABLE QWA -124A ; [.24EE.0020.0002] # ETHIOPIC SYLLABLE QWI -124B ; [.24EF.0020.0002] # ETHIOPIC SYLLABLE QWAA -124C ; [.24F0.0020.0002] # ETHIOPIC SYLLABLE QWEE -124D ; [.24F1.0020.0002] # ETHIOPIC SYLLABLE QWE -1250 ; [.24F2.0020.0002] # ETHIOPIC SYLLABLE QHA -1251 ; [.24F3.0020.0002] # ETHIOPIC SYLLABLE QHU -1252 ; [.24F4.0020.0002] # ETHIOPIC SYLLABLE QHI -1253 ; [.24F5.0020.0002] # ETHIOPIC SYLLABLE QHAA -1254 ; [.24F6.0020.0002] # ETHIOPIC SYLLABLE QHEE -1255 ; [.24F7.0020.0002] # ETHIOPIC SYLLABLE QHE -1256 ; [.24F8.0020.0002] # ETHIOPIC SYLLABLE QHO -1258 ; [.24F9.0020.0002] # ETHIOPIC SYLLABLE QHWA -125A ; [.24FA.0020.0002] # ETHIOPIC SYLLABLE QHWI -125B ; [.24FB.0020.0002] # ETHIOPIC SYLLABLE QHWAA -125C ; [.24FC.0020.0002] # ETHIOPIC SYLLABLE QHWEE -125D ; [.24FD.0020.0002] # ETHIOPIC SYLLABLE QHWE -1260 ; [.24FE.0020.0002] # ETHIOPIC SYLLABLE BA -1261 ; [.24FF.0020.0002] # ETHIOPIC SYLLABLE BU -1262 ; [.2500.0020.0002] # ETHIOPIC SYLLABLE BI -1263 ; [.2501.0020.0002] # ETHIOPIC SYLLABLE BAA -1264 ; [.2502.0020.0002] # ETHIOPIC SYLLABLE BEE -1265 ; [.2503.0020.0002] # ETHIOPIC SYLLABLE BE -1266 ; [.2504.0020.0002] # ETHIOPIC SYLLABLE BO -1267 ; [.2505.0020.0002] # ETHIOPIC SYLLABLE BWA -1384 ; [.2506.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT BWA -1385 ; [.2507.0020.0002] # ETHIOPIC SYLLABLE BWI -1386 ; [.2508.0020.0002] # ETHIOPIC SYLLABLE BWEE -1387 ; [.2509.0020.0002] # ETHIOPIC SYLLABLE BWE -2D85 ; [.250A.0020.0002] # ETHIOPIC SYLLABLE BOA -1268 ; [.250B.0020.0002] # ETHIOPIC SYLLABLE VA -1269 ; [.250C.0020.0002] # ETHIOPIC SYLLABLE VU -126A ; [.250D.0020.0002] # ETHIOPIC SYLLABLE VI -126B ; [.250E.0020.0002] # ETHIOPIC SYLLABLE VAA -126C ; [.250F.0020.0002] # ETHIOPIC SYLLABLE VEE -126D ; [.2510.0020.0002] # ETHIOPIC SYLLABLE VE -126E ; [.2511.0020.0002] # ETHIOPIC SYLLABLE VO -126F ; [.2512.0020.0002] # ETHIOPIC SYLLABLE VWA -1270 ; [.2513.0020.0002] # ETHIOPIC SYLLABLE TA -1271 ; [.2514.0020.0002] # ETHIOPIC SYLLABLE TU -1272 ; [.2515.0020.0002] # ETHIOPIC SYLLABLE TI -1273 ; [.2516.0020.0002] # ETHIOPIC SYLLABLE TAA -1274 ; [.2517.0020.0002] # ETHIOPIC SYLLABLE TEE -1275 ; [.2518.0020.0002] # ETHIOPIC SYLLABLE TE -1276 ; [.2519.0020.0002] # ETHIOPIC SYLLABLE TO -1277 ; [.251A.0020.0002] # ETHIOPIC SYLLABLE TWA -2D86 ; [.251B.0020.0002] # ETHIOPIC SYLLABLE TOA -1278 ; [.251C.0020.0002] # ETHIOPIC SYLLABLE CA -1279 ; [.251D.0020.0002] # ETHIOPIC SYLLABLE CU -127A ; [.251E.0020.0002] # ETHIOPIC SYLLABLE CI -127B ; [.251F.0020.0002] # ETHIOPIC SYLLABLE CAA -127C ; [.2520.0020.0002] # ETHIOPIC SYLLABLE CEE -127D ; [.2521.0020.0002] # ETHIOPIC SYLLABLE CE -127E ; [.2522.0020.0002] # ETHIOPIC SYLLABLE CO -127F ; [.2523.0020.0002] # ETHIOPIC SYLLABLE CWA -2D87 ; [.2524.0020.0002] # ETHIOPIC SYLLABLE COA -1280 ; [.2525.0020.0002] # ETHIOPIC SYLLABLE XA -1281 ; [.2526.0020.0002] # ETHIOPIC SYLLABLE XU -1282 ; [.2527.0020.0002] # ETHIOPIC SYLLABLE XI -1283 ; [.2528.0020.0002] # ETHIOPIC SYLLABLE XAA -1284 ; [.2529.0020.0002] # ETHIOPIC SYLLABLE XEE -1285 ; [.252A.0020.0002] # ETHIOPIC SYLLABLE XE -1286 ; [.252B.0020.0002] # ETHIOPIC SYLLABLE XO -1287 ; [.252C.0020.0002] # ETHIOPIC SYLLABLE XOA -1288 ; [.252D.0020.0002] # ETHIOPIC SYLLABLE XWA -128A ; [.252E.0020.0002] # ETHIOPIC SYLLABLE XWI -128B ; [.252F.0020.0002] # ETHIOPIC SYLLABLE XWAA -128C ; [.2530.0020.0002] # ETHIOPIC SYLLABLE XWEE -128D ; [.2531.0020.0002] # ETHIOPIC SYLLABLE XWE -1290 ; [.2532.0020.0002] # ETHIOPIC SYLLABLE NA -1291 ; [.2533.0020.0002] # ETHIOPIC SYLLABLE NU -1292 ; [.2534.0020.0002] # ETHIOPIC SYLLABLE NI -1293 ; [.2535.0020.0002] # ETHIOPIC SYLLABLE NAA -1294 ; [.2536.0020.0002] # ETHIOPIC SYLLABLE NEE -1295 ; [.2537.0020.0002] # ETHIOPIC SYLLABLE NE -1296 ; [.2538.0020.0002] # ETHIOPIC SYLLABLE NO -1297 ; [.2539.0020.0002] # ETHIOPIC SYLLABLE NWA -2D88 ; [.253A.0020.0002] # ETHIOPIC SYLLABLE NOA -1298 ; [.253B.0020.0002] # ETHIOPIC SYLLABLE NYA -1299 ; [.253C.0020.0002] # ETHIOPIC SYLLABLE NYU -129A ; [.253D.0020.0002] # ETHIOPIC SYLLABLE NYI -129B ; [.253E.0020.0002] # ETHIOPIC SYLLABLE NYAA -129C ; [.253F.0020.0002] # ETHIOPIC SYLLABLE NYEE -129D ; [.2540.0020.0002] # ETHIOPIC SYLLABLE NYE -129E ; [.2541.0020.0002] # ETHIOPIC SYLLABLE NYO -129F ; [.2542.0020.0002] # ETHIOPIC SYLLABLE NYWA -2D89 ; [.2543.0020.0002] # ETHIOPIC SYLLABLE NYOA -12A0 ; [.2544.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL A -12A1 ; [.2545.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL U -12A2 ; [.2546.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL I -12A3 ; [.2547.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL AA -12A4 ; [.2548.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL EE -12A5 ; [.2549.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL E -12A6 ; [.254A.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL O -12A7 ; [.254B.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL WA -2D8A ; [.254C.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL OA -12A8 ; [.254D.0020.0002] # ETHIOPIC SYLLABLE KA -12A9 ; [.254E.0020.0002] # ETHIOPIC SYLLABLE KU -12AA ; [.254F.0020.0002] # ETHIOPIC SYLLABLE KI -12AB ; [.2550.0020.0002] # ETHIOPIC SYLLABLE KAA -12AC ; [.2551.0020.0002] # ETHIOPIC SYLLABLE KEE -12AD ; [.2552.0020.0002] # ETHIOPIC SYLLABLE KE -12AE ; [.2553.0020.0002] # ETHIOPIC SYLLABLE KO -12AF ; [.2554.0020.0002] # ETHIOPIC SYLLABLE KOA -12B0 ; [.2555.0020.0002] # ETHIOPIC SYLLABLE KWA -12B2 ; [.2556.0020.0002] # ETHIOPIC SYLLABLE KWI -12B3 ; [.2557.0020.0002] # ETHIOPIC SYLLABLE KWAA -12B4 ; [.2558.0020.0002] # ETHIOPIC SYLLABLE KWEE -12B5 ; [.2559.0020.0002] # ETHIOPIC SYLLABLE KWE -12B8 ; [.255A.0020.0002] # ETHIOPIC SYLLABLE KXA -12B9 ; [.255B.0020.0002] # ETHIOPIC SYLLABLE KXU -12BA ; [.255C.0020.0002] # ETHIOPIC SYLLABLE KXI -12BB ; [.255D.0020.0002] # ETHIOPIC SYLLABLE KXAA -12BC ; [.255E.0020.0002] # ETHIOPIC SYLLABLE KXEE -12BD ; [.255F.0020.0002] # ETHIOPIC SYLLABLE KXE -12BE ; [.2560.0020.0002] # ETHIOPIC SYLLABLE KXO -12C0 ; [.2561.0020.0002] # ETHIOPIC SYLLABLE KXWA -12C2 ; [.2562.0020.0002] # ETHIOPIC SYLLABLE KXWI -12C3 ; [.2563.0020.0002] # ETHIOPIC SYLLABLE KXWAA -12C4 ; [.2564.0020.0002] # ETHIOPIC SYLLABLE KXWEE -12C5 ; [.2565.0020.0002] # ETHIOPIC SYLLABLE KXWE -12C8 ; [.2566.0020.0002] # ETHIOPIC SYLLABLE WA -12C9 ; [.2567.0020.0002] # ETHIOPIC SYLLABLE WU -12CA ; [.2568.0020.0002] # ETHIOPIC SYLLABLE WI -12CB ; [.2569.0020.0002] # ETHIOPIC SYLLABLE WAA -12CC ; [.256A.0020.0002] # ETHIOPIC SYLLABLE WEE -12CD ; [.256B.0020.0002] # ETHIOPIC SYLLABLE WE -12CE ; [.256C.0020.0002] # ETHIOPIC SYLLABLE WO -12CF ; [.256D.0020.0002] # ETHIOPIC SYLLABLE WOA -12D0 ; [.256E.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL A -12D1 ; [.256F.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL U -12D2 ; [.2570.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL I -12D3 ; [.2571.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL AA -12D4 ; [.2572.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL EE -12D5 ; [.2573.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL E -12D6 ; [.2574.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL O -12D8 ; [.2575.0020.0002] # ETHIOPIC SYLLABLE ZA -12D9 ; [.2576.0020.0002] # ETHIOPIC SYLLABLE ZU -12DA ; [.2577.0020.0002] # ETHIOPIC SYLLABLE ZI -12DB ; [.2578.0020.0002] # ETHIOPIC SYLLABLE ZAA -12DC ; [.2579.0020.0002] # ETHIOPIC SYLLABLE ZEE -12DD ; [.257A.0020.0002] # ETHIOPIC SYLLABLE ZE -12DE ; [.257B.0020.0002] # ETHIOPIC SYLLABLE ZO -12DF ; [.257C.0020.0002] # ETHIOPIC SYLLABLE ZWA -2D8B ; [.257D.0020.0002] # ETHIOPIC SYLLABLE ZOA -AB11 ; [.257E.0020.0002] # ETHIOPIC SYLLABLE DZU -AB12 ; [.257F.0020.0002] # ETHIOPIC SYLLABLE DZI -AB13 ; [.2580.0020.0002] # ETHIOPIC SYLLABLE DZAA -AB14 ; [.2581.0020.0002] # ETHIOPIC SYLLABLE DZEE -AB15 ; [.2582.0020.0002] # ETHIOPIC SYLLABLE DZE -AB16 ; [.2583.0020.0002] # ETHIOPIC SYLLABLE DZO -12E0 ; [.2584.0020.0002] # ETHIOPIC SYLLABLE ZHA -12E1 ; [.2585.0020.0002] # ETHIOPIC SYLLABLE ZHU -12E2 ; [.2586.0020.0002] # ETHIOPIC SYLLABLE ZHI -12E3 ; [.2587.0020.0002] # ETHIOPIC SYLLABLE ZHAA -12E4 ; [.2588.0020.0002] # ETHIOPIC SYLLABLE ZHEE -12E5 ; [.2589.0020.0002] # ETHIOPIC SYLLABLE ZHE -12E6 ; [.258A.0020.0002] # ETHIOPIC SYLLABLE ZHO -12E7 ; [.258B.0020.0002] # ETHIOPIC SYLLABLE ZHWA -12E8 ; [.258C.0020.0002] # ETHIOPIC SYLLABLE YA -12E9 ; [.258D.0020.0002] # ETHIOPIC SYLLABLE YU -12EA ; [.258E.0020.0002] # ETHIOPIC SYLLABLE YI -12EB ; [.258F.0020.0002] # ETHIOPIC SYLLABLE YAA -12EC ; [.2590.0020.0002] # ETHIOPIC SYLLABLE YEE -12ED ; [.2591.0020.0002] # ETHIOPIC SYLLABLE YE -12EE ; [.2592.0020.0002] # ETHIOPIC SYLLABLE YO -12EF ; [.2593.0020.0002] # ETHIOPIC SYLLABLE YOA -12F0 ; [.2594.0020.0002] # ETHIOPIC SYLLABLE DA -12F1 ; [.2595.0020.0002] # ETHIOPIC SYLLABLE DU -12F2 ; [.2596.0020.0002] # ETHIOPIC SYLLABLE DI -12F3 ; [.2597.0020.0002] # ETHIOPIC SYLLABLE DAA -12F4 ; [.2598.0020.0002] # ETHIOPIC SYLLABLE DEE -12F5 ; [.2599.0020.0002] # ETHIOPIC SYLLABLE DE -12F6 ; [.259A.0020.0002] # ETHIOPIC SYLLABLE DO -12F7 ; [.259B.0020.0002] # ETHIOPIC SYLLABLE DWA -2D8C ; [.259C.0020.0002] # ETHIOPIC SYLLABLE DOA -AB09 ; [.259D.0020.0002] # ETHIOPIC SYLLABLE DDHU -AB0A ; [.259E.0020.0002] # ETHIOPIC SYLLABLE DDHI -AB0B ; [.259F.0020.0002] # ETHIOPIC SYLLABLE DDHAA -AB0C ; [.25A0.0020.0002] # ETHIOPIC SYLLABLE DDHEE -AB0D ; [.25A1.0020.0002] # ETHIOPIC SYLLABLE DDHE -AB0E ; [.25A2.0020.0002] # ETHIOPIC SYLLABLE DDHO -12F8 ; [.25A3.0020.0002] # ETHIOPIC SYLLABLE DDA -12F9 ; [.25A4.0020.0002] # ETHIOPIC SYLLABLE DDU -12FA ; [.25A5.0020.0002] # ETHIOPIC SYLLABLE DDI -12FB ; [.25A6.0020.0002] # ETHIOPIC SYLLABLE DDAA -12FC ; [.25A7.0020.0002] # ETHIOPIC SYLLABLE DDEE -12FD ; [.25A8.0020.0002] # ETHIOPIC SYLLABLE DDE -12FE ; [.25A9.0020.0002] # ETHIOPIC SYLLABLE DDO -12FF ; [.25AA.0020.0002] # ETHIOPIC SYLLABLE DDWA -2D8D ; [.25AB.0020.0002] # ETHIOPIC SYLLABLE DDOA -1300 ; [.25AC.0020.0002] # ETHIOPIC SYLLABLE JA -1301 ; [.25AD.0020.0002] # ETHIOPIC SYLLABLE JU -1302 ; [.25AE.0020.0002] # ETHIOPIC SYLLABLE JI -1303 ; [.25AF.0020.0002] # ETHIOPIC SYLLABLE JAA -1304 ; [.25B0.0020.0002] # ETHIOPIC SYLLABLE JEE -1305 ; [.25B1.0020.0002] # ETHIOPIC SYLLABLE JE -1306 ; [.25B2.0020.0002] # ETHIOPIC SYLLABLE JO -1307 ; [.25B3.0020.0002] # ETHIOPIC SYLLABLE JWA -2D8E ; [.25B4.0020.0002] # ETHIOPIC SYLLABLE JOA -1308 ; [.25B5.0020.0002] # ETHIOPIC SYLLABLE GA -1309 ; [.25B6.0020.0002] # ETHIOPIC SYLLABLE GU -130A ; [.25B7.0020.0002] # ETHIOPIC SYLLABLE GI -130B ; [.25B8.0020.0002] # ETHIOPIC SYLLABLE GAA -130C ; [.25B9.0020.0002] # ETHIOPIC SYLLABLE GEE -130D ; [.25BA.0020.0002] # ETHIOPIC SYLLABLE GE -130E ; [.25BB.0020.0002] # ETHIOPIC SYLLABLE GO -130F ; [.25BC.0020.0002] # ETHIOPIC SYLLABLE GOA -1310 ; [.25BD.0020.0002] # ETHIOPIC SYLLABLE GWA -1312 ; [.25BE.0020.0002] # ETHIOPIC SYLLABLE GWI -1313 ; [.25BF.0020.0002] # ETHIOPIC SYLLABLE GWAA -1314 ; [.25C0.0020.0002] # ETHIOPIC SYLLABLE GWEE -1315 ; [.25C1.0020.0002] # ETHIOPIC SYLLABLE GWE -1318 ; [.25C2.0020.0002] # ETHIOPIC SYLLABLE GGA -1319 ; [.25C3.0020.0002] # ETHIOPIC SYLLABLE GGU -131A ; [.25C4.0020.0002] # ETHIOPIC SYLLABLE GGI -131B ; [.25C5.0020.0002] # ETHIOPIC SYLLABLE GGAA -131C ; [.25C6.0020.0002] # ETHIOPIC SYLLABLE GGEE -131D ; [.25C7.0020.0002] # ETHIOPIC SYLLABLE GGE -131E ; [.25C8.0020.0002] # ETHIOPIC SYLLABLE GGO -131F ; [.25C9.0020.0002] # ETHIOPIC SYLLABLE GGWAA -2D93 ; [.25CA.0020.0002] # ETHIOPIC SYLLABLE GGWA -2D94 ; [.25CB.0020.0002] # ETHIOPIC SYLLABLE GGWI -2D95 ; [.25CC.0020.0002] # ETHIOPIC SYLLABLE GGWEE -2D96 ; [.25CD.0020.0002] # ETHIOPIC SYLLABLE GGWE -1320 ; [.25CE.0020.0002] # ETHIOPIC SYLLABLE THA -1321 ; [.25CF.0020.0002] # ETHIOPIC SYLLABLE THU -1322 ; [.25D0.0020.0002] # ETHIOPIC SYLLABLE THI -1323 ; [.25D1.0020.0002] # ETHIOPIC SYLLABLE THAA -1324 ; [.25D2.0020.0002] # ETHIOPIC SYLLABLE THEE -1325 ; [.25D3.0020.0002] # ETHIOPIC SYLLABLE THE -1326 ; [.25D4.0020.0002] # ETHIOPIC SYLLABLE THO -1327 ; [.25D5.0020.0002] # ETHIOPIC SYLLABLE THWA -2D8F ; [.25D6.0020.0002] # ETHIOPIC SYLLABLE THOA -1328 ; [.25D7.0020.0002] # ETHIOPIC SYLLABLE CHA -1329 ; [.25D8.0020.0002] # ETHIOPIC SYLLABLE CHU -132A ; [.25D9.0020.0002] # ETHIOPIC SYLLABLE CHI -132B ; [.25DA.0020.0002] # ETHIOPIC SYLLABLE CHAA -132C ; [.25DB.0020.0002] # ETHIOPIC SYLLABLE CHEE -132D ; [.25DC.0020.0002] # ETHIOPIC SYLLABLE CHE -132E ; [.25DD.0020.0002] # ETHIOPIC SYLLABLE CHO -132F ; [.25DE.0020.0002] # ETHIOPIC SYLLABLE CHWA -2D90 ; [.25DF.0020.0002] # ETHIOPIC SYLLABLE CHOA -AB20 ; [.25E0.0020.0002] # ETHIOPIC SYLLABLE CCHHA -AB21 ; [.25E1.0020.0002] # ETHIOPIC SYLLABLE CCHHU -AB22 ; [.25E2.0020.0002] # ETHIOPIC SYLLABLE CCHHI -AB23 ; [.25E3.0020.0002] # ETHIOPIC SYLLABLE CCHHAA -AB24 ; [.25E4.0020.0002] # ETHIOPIC SYLLABLE CCHHEE -AB25 ; [.25E5.0020.0002] # ETHIOPIC SYLLABLE CCHHE -AB26 ; [.25E6.0020.0002] # ETHIOPIC SYLLABLE CCHHO -1330 ; [.25E7.0020.0002] # ETHIOPIC SYLLABLE PHA -1331 ; [.25E8.0020.0002] # ETHIOPIC SYLLABLE PHU -1332 ; [.25E9.0020.0002] # ETHIOPIC SYLLABLE PHI -1333 ; [.25EA.0020.0002] # ETHIOPIC SYLLABLE PHAA -1334 ; [.25EB.0020.0002] # ETHIOPIC SYLLABLE PHEE -1335 ; [.25EC.0020.0002] # ETHIOPIC SYLLABLE PHE -1336 ; [.25ED.0020.0002] # ETHIOPIC SYLLABLE PHO -1337 ; [.25EE.0020.0002] # ETHIOPIC SYLLABLE PHWA -2D91 ; [.25EF.0020.0002] # ETHIOPIC SYLLABLE PHOA -1338 ; [.25F0.0020.0002] # ETHIOPIC SYLLABLE TSA -1339 ; [.25F1.0020.0002] # ETHIOPIC SYLLABLE TSU -133A ; [.25F2.0020.0002] # ETHIOPIC SYLLABLE TSI -133B ; [.25F3.0020.0002] # ETHIOPIC SYLLABLE TSAA -133C ; [.25F4.0020.0002] # ETHIOPIC SYLLABLE TSEE -133D ; [.25F5.0020.0002] # ETHIOPIC SYLLABLE TSE -133E ; [.25F6.0020.0002] # ETHIOPIC SYLLABLE TSO -133F ; [.25F7.0020.0002] # ETHIOPIC SYLLABLE TSWA -AB28 ; [.25F8.0020.0002] # ETHIOPIC SYLLABLE BBA -AB29 ; [.25F9.0020.0002] # ETHIOPIC SYLLABLE BBU -AB2A ; [.25FA.0020.0002] # ETHIOPIC SYLLABLE BBI -AB2B ; [.25FB.0020.0002] # ETHIOPIC SYLLABLE BBAA -AB2C ; [.25FC.0020.0002] # ETHIOPIC SYLLABLE BBEE -AB2D ; [.25FD.0020.0002] # ETHIOPIC SYLLABLE BBE -AB2E ; [.25FE.0020.0002] # ETHIOPIC SYLLABLE BBO -1340 ; [.25FF.0020.0002] # ETHIOPIC SYLLABLE TZA -1341 ; [.2600.0020.0002] # ETHIOPIC SYLLABLE TZU -1342 ; [.2601.0020.0002] # ETHIOPIC SYLLABLE TZI -1343 ; [.2602.0020.0002] # ETHIOPIC SYLLABLE TZAA -1344 ; [.2603.0020.0002] # ETHIOPIC SYLLABLE TZEE -1345 ; [.2604.0020.0002] # ETHIOPIC SYLLABLE TZE -1346 ; [.2605.0020.0002] # ETHIOPIC SYLLABLE TZO -1347 ; [.2606.0020.0002] # ETHIOPIC SYLLABLE TZOA -1348 ; [.2607.0020.0002] # ETHIOPIC SYLLABLE FA -1349 ; [.2608.0020.0002] # ETHIOPIC SYLLABLE FU -134A ; [.2609.0020.0002] # ETHIOPIC SYLLABLE FI -134B ; [.260A.0020.0002] # ETHIOPIC SYLLABLE FAA -134C ; [.260B.0020.0002] # ETHIOPIC SYLLABLE FEE -134D ; [.260C.0020.0002] # ETHIOPIC SYLLABLE FE -134E ; [.260D.0020.0002] # ETHIOPIC SYLLABLE FO -134F ; [.260E.0020.0002] # ETHIOPIC SYLLABLE FWA -1388 ; [.260F.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT FWA -1389 ; [.2610.0020.0002] # ETHIOPIC SYLLABLE FWI -138A ; [.2611.0020.0002] # ETHIOPIC SYLLABLE FWEE -138B ; [.2612.0020.0002] # ETHIOPIC SYLLABLE FWE -1350 ; [.2613.0020.0002] # ETHIOPIC SYLLABLE PA -1351 ; [.2614.0020.0002] # ETHIOPIC SYLLABLE PU -1352 ; [.2615.0020.0002] # ETHIOPIC SYLLABLE PI -1353 ; [.2616.0020.0002] # ETHIOPIC SYLLABLE PAA -1354 ; [.2617.0020.0002] # ETHIOPIC SYLLABLE PEE -1355 ; [.2618.0020.0002] # ETHIOPIC SYLLABLE PE -1356 ; [.2619.0020.0002] # ETHIOPIC SYLLABLE PO -1357 ; [.261A.0020.0002] # ETHIOPIC SYLLABLE PWA -138C ; [.261B.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT PWA -138D ; [.261C.0020.0002] # ETHIOPIC SYLLABLE PWI -138E ; [.261D.0020.0002] # ETHIOPIC SYLLABLE PWEE -138F ; [.261E.0020.0002] # ETHIOPIC SYLLABLE PWE -2D92 ; [.261F.0020.0002] # ETHIOPIC SYLLABLE POA -1358 ; [.2620.0020.0002] # ETHIOPIC SYLLABLE RYA -1359 ; [.2621.0020.0002] # ETHIOPIC SYLLABLE MYA -135A ; [.2622.0020.0002] # ETHIOPIC SYLLABLE FYA -2DA0 ; [.2623.0020.0002] # ETHIOPIC SYLLABLE SSA -2DA1 ; [.2624.0020.0002] # ETHIOPIC SYLLABLE SSU -2DA2 ; [.2625.0020.0002] # ETHIOPIC SYLLABLE SSI -2DA3 ; [.2626.0020.0002] # ETHIOPIC SYLLABLE SSAA -2DA4 ; [.2627.0020.0002] # ETHIOPIC SYLLABLE SSEE -2DA5 ; [.2628.0020.0002] # ETHIOPIC SYLLABLE SSE -2DA6 ; [.2629.0020.0002] # ETHIOPIC SYLLABLE SSO -2DA8 ; [.262A.0020.0002] # ETHIOPIC SYLLABLE CCA -2DA9 ; [.262B.0020.0002] # ETHIOPIC SYLLABLE CCU -2DAA ; [.262C.0020.0002] # ETHIOPIC SYLLABLE CCI -2DAB ; [.262D.0020.0002] # ETHIOPIC SYLLABLE CCAA -2DAC ; [.262E.0020.0002] # ETHIOPIC SYLLABLE CCEE -2DAD ; [.262F.0020.0002] # ETHIOPIC SYLLABLE CCE -2DAE ; [.2630.0020.0002] # ETHIOPIC SYLLABLE CCO -2DB0 ; [.2631.0020.0002] # ETHIOPIC SYLLABLE ZZA -2DB1 ; [.2632.0020.0002] # ETHIOPIC SYLLABLE ZZU -2DB2 ; [.2633.0020.0002] # ETHIOPIC SYLLABLE ZZI -2DB3 ; [.2634.0020.0002] # ETHIOPIC SYLLABLE ZZAA -2DB4 ; [.2635.0020.0002] # ETHIOPIC SYLLABLE ZZEE -2DB5 ; [.2636.0020.0002] # ETHIOPIC SYLLABLE ZZE -2DB6 ; [.2637.0020.0002] # ETHIOPIC SYLLABLE ZZO -2DB8 ; [.2638.0020.0002] # ETHIOPIC SYLLABLE CCHA -2DB9 ; [.2639.0020.0002] # ETHIOPIC SYLLABLE CCHU -2DBA ; [.263A.0020.0002] # ETHIOPIC SYLLABLE CCHI -2DBB ; [.263B.0020.0002] # ETHIOPIC SYLLABLE CCHAA -2DBC ; [.263C.0020.0002] # ETHIOPIC SYLLABLE CCHEE -2DBD ; [.263D.0020.0002] # ETHIOPIC SYLLABLE CCHE -2DBE ; [.263E.0020.0002] # ETHIOPIC SYLLABLE CCHO -2DC0 ; [.263F.0020.0002] # ETHIOPIC SYLLABLE QYA -2DC1 ; [.2640.0020.0002] # ETHIOPIC SYLLABLE QYU -2DC2 ; [.2641.0020.0002] # ETHIOPIC SYLLABLE QYI -2DC3 ; [.2642.0020.0002] # ETHIOPIC SYLLABLE QYAA -2DC4 ; [.2643.0020.0002] # ETHIOPIC SYLLABLE QYEE -2DC5 ; [.2644.0020.0002] # ETHIOPIC SYLLABLE QYE -2DC6 ; [.2645.0020.0002] # ETHIOPIC SYLLABLE QYO -2DC8 ; [.2646.0020.0002] # ETHIOPIC SYLLABLE KYA -2DC9 ; [.2647.0020.0002] # ETHIOPIC SYLLABLE KYU -2DCA ; [.2648.0020.0002] # ETHIOPIC SYLLABLE KYI -2DCB ; [.2649.0020.0002] # ETHIOPIC SYLLABLE KYAA -2DCC ; [.264A.0020.0002] # ETHIOPIC SYLLABLE KYEE -2DCD ; [.264B.0020.0002] # ETHIOPIC SYLLABLE KYE -2DCE ; [.264C.0020.0002] # ETHIOPIC SYLLABLE KYO -2DD0 ; [.264D.0020.0002] # ETHIOPIC SYLLABLE XYA -2DD1 ; [.264E.0020.0002] # ETHIOPIC SYLLABLE XYU -2DD2 ; [.264F.0020.0002] # ETHIOPIC SYLLABLE XYI -2DD3 ; [.2650.0020.0002] # ETHIOPIC SYLLABLE XYAA -2DD4 ; [.2651.0020.0002] # ETHIOPIC SYLLABLE XYEE -2DD5 ; [.2652.0020.0002] # ETHIOPIC SYLLABLE XYE -2DD6 ; [.2653.0020.0002] # ETHIOPIC SYLLABLE XYO -2DD8 ; [.2654.0020.0002] # ETHIOPIC SYLLABLE GYA -2DD9 ; [.2655.0020.0002] # ETHIOPIC SYLLABLE GYU -2DDA ; [.2656.0020.0002] # ETHIOPIC SYLLABLE GYI -2DDB ; [.2657.0020.0002] # ETHIOPIC SYLLABLE GYAA -2DDC ; [.2658.0020.0002] # ETHIOPIC SYLLABLE GYEE -2DDD ; [.2659.0020.0002] # ETHIOPIC SYLLABLE GYE -2DDE ; [.265A.0020.0002] # ETHIOPIC SYLLABLE GYO -0950 ; [.265B.0020.0002] # DEVANAGARI OM -A8FD ; [.265C.0020.0002] # DEVANAGARI JAIN OM -0972 ; [.265D.0020.0002] # DEVANAGARI LETTER CANDRA A -0904 ; [.265E.0020.0002] # DEVANAGARI LETTER SHORT A -0905 ; [.265F.0020.0002] # DEVANAGARI LETTER A -0906 ; [.2660.0020.0002] # DEVANAGARI LETTER AA -0973 ; [.2661.0020.0002] # DEVANAGARI LETTER OE -0974 ; [.2662.0020.0002] # DEVANAGARI LETTER OOE -0975 ; [.2663.0020.0002] # DEVANAGARI LETTER AW -0976 ; [.2664.0020.0002] # DEVANAGARI LETTER UE -0977 ; [.2665.0020.0002] # DEVANAGARI LETTER UUE -0907 ; [.2666.0020.0002] # DEVANAGARI LETTER I -0908 ; [.2667.0020.0002] # DEVANAGARI LETTER II -0909 ; [.2668.0020.0002] # DEVANAGARI LETTER U -090A ; [.2669.0020.0002] # DEVANAGARI LETTER UU -090B ; [.266A.0020.0002] # DEVANAGARI LETTER VOCALIC R -0960 ; [.266B.0020.0002] # DEVANAGARI LETTER VOCALIC RR -090C ; [.266C.0020.0002] # DEVANAGARI LETTER VOCALIC L -0961 ; [.266D.0020.0002] # DEVANAGARI LETTER VOCALIC LL -090D ; [.266E.0020.0002] # DEVANAGARI LETTER CANDRA E -090E ; [.266F.0020.0002] # DEVANAGARI LETTER SHORT E -090F ; [.2670.0020.0002] # DEVANAGARI LETTER E -0910 ; [.2671.0020.0002] # DEVANAGARI LETTER AI -0911 ; [.2672.0020.0002] # DEVANAGARI LETTER CANDRA O -0912 ; [.2673.0020.0002] # DEVANAGARI LETTER SHORT O -0913 ; [.2674.0020.0002] # DEVANAGARI LETTER O -0914 ; [.2675.0020.0002] # DEVANAGARI LETTER AU -0915 ; [.2676.0020.0002] # DEVANAGARI LETTER KA -0958 ; [.2676.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER QA -0916 ; [.2677.0020.0002] # DEVANAGARI LETTER KHA -0959 ; [.2677.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER KHHA -0917 ; [.2678.0020.0002] # DEVANAGARI LETTER GA -095A ; [.2678.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER GHHA -097B ; [.2679.0020.0002] # DEVANAGARI LETTER GGA -0918 ; [.267A.0020.0002] # DEVANAGARI LETTER GHA -0919 ; [.267B.0020.0002] # DEVANAGARI LETTER NGA -091A ; [.267C.0020.0002] # DEVANAGARI LETTER CA -091B ; [.267D.0020.0002] # DEVANAGARI LETTER CHA -091C ; [.267E.0020.0002] # DEVANAGARI LETTER JA -095B ; [.267E.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER ZA -0979 ; [.267F.0020.0002] # DEVANAGARI LETTER ZHA -097C ; [.2680.0020.0002] # DEVANAGARI LETTER JJA -091D ; [.2681.0020.0002] # DEVANAGARI LETTER JHA -091E ; [.2682.0020.0002] # DEVANAGARI LETTER NYA -091F ; [.2683.0020.0002] # DEVANAGARI LETTER TTA -0920 ; [.2684.0020.0002] # DEVANAGARI LETTER TTHA -0978 ; [.2685.0020.0002] # DEVANAGARI LETTER MARWARI DDA -0921 ; [.2686.0020.0002] # DEVANAGARI LETTER DDA -095C ; [.2686.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER DDDHA -097E ; [.2687.0020.0002] # DEVANAGARI LETTER DDDA -0922 ; [.2688.0020.0002] # DEVANAGARI LETTER DDHA -095D ; [.2688.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER RHA -0923 ; [.2689.0020.0002] # DEVANAGARI LETTER NNA -0924 ; [.268A.0020.0002] # DEVANAGARI LETTER TA -0925 ; [.268B.0020.0002] # DEVANAGARI LETTER THA -0926 ; [.268C.0020.0002] # DEVANAGARI LETTER DA -0927 ; [.268D.0020.0002] # DEVANAGARI LETTER DHA -0928 ; [.268E.0020.0002] # DEVANAGARI LETTER NA -0929 ; [.268E.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER NNNA -092A ; [.268F.0020.0002] # DEVANAGARI LETTER PA -092B ; [.2690.0020.0002] # DEVANAGARI LETTER PHA -095E ; [.2690.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER FA -092C ; [.2691.0020.0002] # DEVANAGARI LETTER BA -097F ; [.2692.0020.0002] # DEVANAGARI LETTER BBA -092D ; [.2693.0020.0002] # DEVANAGARI LETTER BHA -092E ; [.2694.0020.0002] # DEVANAGARI LETTER MA -092F ; [.2695.0020.0002] # DEVANAGARI LETTER YA -095F ; [.2695.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER YYA -097A ; [.2696.0020.0002] # DEVANAGARI LETTER HEAVY YA -0930 ; [.2697.0020.0002] # DEVANAGARI LETTER RA -0931 ; [.2697.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER RRA -0932 ; [.2698.0020.0002] # DEVANAGARI LETTER LA -0933 ; [.2699.0020.0002] # DEVANAGARI LETTER LLA -0934 ; [.2699.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER LLLA -0935 ; [.269A.0020.0002] # DEVANAGARI LETTER VA -0936 ; [.269B.0020.0002] # DEVANAGARI LETTER SHA -0937 ; [.269C.0020.0002] # DEVANAGARI LETTER SSA -0938 ; [.269D.0020.0002] # DEVANAGARI LETTER SA -0939 ; [.269E.0020.0002] # DEVANAGARI LETTER HA -093D ; [.269F.0020.0002] # DEVANAGARI SIGN AVAGRAHA -097D ; [.26A0.0020.0002] # DEVANAGARI LETTER GLOTTAL STOP -1CE9 ; [.26A1.0020.0002] # VEDIC SIGN ANUSVARA ANTARGOMUKHA -1CEA ; [.26A1.0020.0004] # VEDIC SIGN ANUSVARA BAHIRGOMUKHA -1CEB ; [.26A1.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA -1CEC ; [.26A1.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL -1CEE ; [.26A1.0020.0004] # VEDIC SIGN HEXIFORM LONG ANUSVARA -1CEF ; [.26A1.0020.0004] # VEDIC SIGN LONG ANUSVARA -1CF0 ; [.26A1.0020.0004] # VEDIC SIGN RTHANG LONG ANUSVARA -1CF1 ; [.26A1.0020.0004] # VEDIC SIGN ANUSVARA UBHAYATO MUKHA -1CF5 ; [.26A2.0020.0002] # VEDIC SIGN JIHVAMULIYA -1CF6 ; [.26A3.0020.0002] # VEDIC SIGN UPADHMANIYA -A8F2 ; [.26A4.0020.0002] # DEVANAGARI SIGN SPACING CANDRABINDU -A8F3 ; [.26A4.0020.0004] # DEVANAGARI SIGN CANDRABINDU VIRAMA -A8F4 ; [.26A4.0020.0004] # DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA -A8F5 ; [.26A4.0020.0004] # DEVANAGARI SIGN CANDRABINDU TWO -A8F6 ; [.26A4.0020.0004] # DEVANAGARI SIGN CANDRABINDU THREE -A8F7 ; [.26A4.0020.0004] # DEVANAGARI SIGN CANDRABINDU AVAGRAHA -A8FB ; [.26A5.0020.0002] # DEVANAGARI HEADSTROKE -093E ; [.26A6.0020.0002] # DEVANAGARI VOWEL SIGN AA -093A ; [.26A7.0020.0002] # DEVANAGARI VOWEL SIGN OE -093B ; [.26A8.0020.0002] # DEVANAGARI VOWEL SIGN OOE -094F ; [.26A9.0020.0002] # DEVANAGARI VOWEL SIGN AW -0956 ; [.26AA.0020.0002] # DEVANAGARI VOWEL SIGN UE -0957 ; [.26AB.0020.0002] # DEVANAGARI VOWEL SIGN UUE -093F ; [.26AC.0020.0002] # DEVANAGARI VOWEL SIGN I -0940 ; [.26AD.0020.0002] # DEVANAGARI VOWEL SIGN II -0941 ; [.26AE.0020.0002] # DEVANAGARI VOWEL SIGN U -0942 ; [.26AF.0020.0002] # DEVANAGARI VOWEL SIGN UU -0943 ; [.26B0.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC R -0944 ; [.26B1.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC RR -0962 ; [.26B2.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC L -0963 ; [.26B3.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC LL -0945 ; [.26B4.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA E -0955 ; [.26B5.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA LONG E -0946 ; [.26B6.0020.0002] # DEVANAGARI VOWEL SIGN SHORT E -0947 ; [.26B7.0020.0002] # DEVANAGARI VOWEL SIGN E -094E ; [.26B8.0020.0002] # DEVANAGARI VOWEL SIGN PRISHTHAMATRA E -0948 ; [.26B9.0020.0002] # DEVANAGARI VOWEL SIGN AI -0949 ; [.26BA.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA O -094A ; [.26BB.0020.0002] # DEVANAGARI VOWEL SIGN SHORT O -094B ; [.26BC.0020.0002] # DEVANAGARI VOWEL SIGN O -094C ; [.26BD.0020.0002] # DEVANAGARI VOWEL SIGN AU -094D ; [.26BE.0020.0002] # DEVANAGARI SIGN VIRAMA -0980 ; [.26BF.0020.0002] # BENGALI ANJI -0985 ; [.26C0.0020.0002] # BENGALI LETTER A -0986 ; [.26C1.0020.0002] # BENGALI LETTER AA -0987 ; [.26C2.0020.0002] # BENGALI LETTER I -0988 ; [.26C3.0020.0002] # BENGALI LETTER II -0989 ; [.26C4.0020.0002] # BENGALI LETTER U -098A ; [.26C5.0020.0002] # BENGALI LETTER UU -098B ; [.26C6.0020.0002] # BENGALI LETTER VOCALIC R -09E0 ; [.26C7.0020.0002] # BENGALI LETTER VOCALIC RR -098C ; [.26C8.0020.0002] # BENGALI LETTER VOCALIC L -09E1 ; [.26C9.0020.0002] # BENGALI LETTER VOCALIC LL -098F ; [.26CA.0020.0002] # BENGALI LETTER E -0990 ; [.26CB.0020.0002] # BENGALI LETTER AI -0993 ; [.26CC.0020.0002] # BENGALI LETTER O -0994 ; [.26CD.0020.0002] # BENGALI LETTER AU -0995 ; [.26CE.0020.0002] # BENGALI LETTER KA -0996 ; [.26CF.0020.0002] # BENGALI LETTER KHA -0997 ; [.26D0.0020.0002] # BENGALI LETTER GA -0998 ; [.26D1.0020.0002] # BENGALI LETTER GHA -0999 ; [.26D2.0020.0002] # BENGALI LETTER NGA -099A ; [.26D3.0020.0002] # BENGALI LETTER CA -099B ; [.26D4.0020.0002] # BENGALI LETTER CHA -099C ; [.26D5.0020.0002] # BENGALI LETTER JA -099D ; [.26D6.0020.0002] # BENGALI LETTER JHA -099E ; [.26D7.0020.0002] # BENGALI LETTER NYA -099F ; [.26D8.0020.0002] # BENGALI LETTER TTA -09A0 ; [.26D9.0020.0002] # BENGALI LETTER TTHA -09A1 ; [.26DA.0020.0002] # BENGALI LETTER DDA -09DC ; [.26DA.0020.0002][.0000.00C2.0002] # BENGALI LETTER RRA -09A2 ; [.26DB.0020.0002] # BENGALI LETTER DDHA -09DD ; [.26DB.0020.0002][.0000.00C2.0002] # BENGALI LETTER RHA -09A3 ; [.26DC.0020.0002] # BENGALI LETTER NNA -09A4 ; [.26DD.0020.0002] # BENGALI LETTER TA -09CE ; [.26DD.0020.0004][.26FE.0020.0004] # BENGALI LETTER KHANDA TA -09A5 ; [.26DE.0020.0002] # BENGALI LETTER THA -09A6 ; [.26DF.0020.0002] # BENGALI LETTER DA -09A7 ; [.26E0.0020.0002] # BENGALI LETTER DHA -09A8 ; [.26E1.0020.0002] # BENGALI LETTER NA -09AA ; [.26E2.0020.0002] # BENGALI LETTER PA -09AB ; [.26E3.0020.0002] # BENGALI LETTER PHA -09AC ; [.26E4.0020.0002] # BENGALI LETTER BA -09AD ; [.26E5.0020.0002] # BENGALI LETTER BHA -09AE ; [.26E6.0020.0002] # BENGALI LETTER MA -09AF ; [.26E7.0020.0002] # BENGALI LETTER YA -09DF ; [.26E7.0020.0002][.0000.00C2.0002] # BENGALI LETTER YYA -09B0 ; [.26E8.0020.0002] # BENGALI LETTER RA -09F0 ; [.26E9.0020.0002] # BENGALI LETTER RA WITH MIDDLE DIAGONAL -09B2 ; [.26EA.0020.0002] # BENGALI LETTER LA -09F1 ; [.26EB.0020.0002] # BENGALI LETTER RA WITH LOWER DIAGONAL -09B6 ; [.26EC.0020.0002] # BENGALI LETTER SHA -09B7 ; [.26ED.0020.0002] # BENGALI LETTER SSA -09B8 ; [.26EE.0020.0002] # BENGALI LETTER SA -09B9 ; [.26EF.0020.0002] # BENGALI LETTER HA -09BD ; [.26F0.0020.0002] # BENGALI SIGN AVAGRAHA -09BE ; [.26F1.0020.0002] # BENGALI VOWEL SIGN AA -09BF ; [.26F2.0020.0002] # BENGALI VOWEL SIGN I -09C0 ; [.26F3.0020.0002] # BENGALI VOWEL SIGN II -09C1 ; [.26F4.0020.0002] # BENGALI VOWEL SIGN U -09C2 ; [.26F5.0020.0002] # BENGALI VOWEL SIGN UU -09C3 ; [.26F6.0020.0002] # BENGALI VOWEL SIGN VOCALIC R -09C4 ; [.26F7.0020.0002] # BENGALI VOWEL SIGN VOCALIC RR -09E2 ; [.26F8.0020.0002] # BENGALI VOWEL SIGN VOCALIC L -09E3 ; [.26F9.0020.0002] # BENGALI VOWEL SIGN VOCALIC LL -09C7 ; [.26FA.0020.0002] # BENGALI VOWEL SIGN E -09C8 ; [.26FB.0020.0002] # BENGALI VOWEL SIGN AI -09CB ; [.26FC.0020.0002] # BENGALI VOWEL SIGN O -09C7 09BE ; [.26FC.0020.0002] # BENGALI VOWEL SIGN O -09CC ; [.26FD.0020.0002] # BENGALI VOWEL SIGN AU -09C7 09D7 ; [.26FD.0020.0002] # BENGALI VOWEL SIGN AU -09CD ; [.26FE.0020.0002] # BENGALI SIGN VIRAMA -09D7 ; [.26FF.0020.0002] # BENGALI AU LENGTH MARK -0A74 ; [.2700.0020.0002] # GURMUKHI EK ONKAR -0A73 ; [.2701.0020.0002] # GURMUKHI URA -0A09 ; [.2702.0020.0002] # GURMUKHI LETTER U -0A0A ; [.2703.0020.0002] # GURMUKHI LETTER UU -0A13 ; [.2704.0020.0002] # GURMUKHI LETTER OO -0A05 ; [.2705.0020.0002] # GURMUKHI LETTER A -0A06 ; [.2706.0020.0002] # GURMUKHI LETTER AA -0A10 ; [.2707.0020.0002] # GURMUKHI LETTER AI -0A14 ; [.2708.0020.0002] # GURMUKHI LETTER AU -0A72 ; [.2709.0020.0002] # GURMUKHI IRI -0A07 ; [.270A.0020.0002] # GURMUKHI LETTER I -0A08 ; [.270B.0020.0002] # GURMUKHI LETTER II -0A0F ; [.270C.0020.0002] # GURMUKHI LETTER EE -0A38 ; [.270D.0020.0002] # GURMUKHI LETTER SA -0A36 ; [.270D.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER SHA -0A39 ; [.270E.0020.0002] # GURMUKHI LETTER HA -0A51 ; [.270F.0020.0002] # GURMUKHI SIGN UDAAT -0A15 ; [.2710.0020.0002] # GURMUKHI LETTER KA -0A16 ; [.2711.0020.0002] # GURMUKHI LETTER KHA -0A59 ; [.2711.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER KHHA -0A17 ; [.2712.0020.0002] # GURMUKHI LETTER GA -0A5A ; [.2712.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER GHHA -0A18 ; [.2713.0020.0002] # GURMUKHI LETTER GHA -0A19 ; [.2714.0020.0002] # GURMUKHI LETTER NGA -0A1A ; [.2715.0020.0002] # GURMUKHI LETTER CA -0A1B ; [.2716.0020.0002] # GURMUKHI LETTER CHA -0A1C ; [.2717.0020.0002] # GURMUKHI LETTER JA -0A5B ; [.2717.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER ZA -0A1D ; [.2718.0020.0002] # GURMUKHI LETTER JHA -0A1E ; [.2719.0020.0002] # GURMUKHI LETTER NYA -0A1F ; [.271A.0020.0002] # GURMUKHI LETTER TTA -0A20 ; [.271B.0020.0002] # GURMUKHI LETTER TTHA -0A21 ; [.271C.0020.0002] # GURMUKHI LETTER DDA -0A22 ; [.271D.0020.0002] # GURMUKHI LETTER DDHA -0A23 ; [.271E.0020.0002] # GURMUKHI LETTER NNA -0A24 ; [.271F.0020.0002] # GURMUKHI LETTER TA -0A25 ; [.2720.0020.0002] # GURMUKHI LETTER THA -0A26 ; [.2721.0020.0002] # GURMUKHI LETTER DA -0A27 ; [.2722.0020.0002] # GURMUKHI LETTER DHA -0A28 ; [.2723.0020.0002] # GURMUKHI LETTER NA -0A2A ; [.2724.0020.0002] # GURMUKHI LETTER PA -0A2B ; [.2725.0020.0002] # GURMUKHI LETTER PHA -0A5E ; [.2725.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER FA -0A2C ; [.2726.0020.0002] # GURMUKHI LETTER BA -0A2D ; [.2727.0020.0002] # GURMUKHI LETTER BHA -0A2E ; [.2728.0020.0002] # GURMUKHI LETTER MA -0A2F ; [.2729.0020.0002] # GURMUKHI LETTER YA -0A75 ; [.272A.0020.0002] # GURMUKHI SIGN YAKASH -0A30 ; [.272B.0020.0002] # GURMUKHI LETTER RA -0A32 ; [.272C.0020.0002] # GURMUKHI LETTER LA -0A33 ; [.272C.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER LLA -0A35 ; [.272D.0020.0002] # GURMUKHI LETTER VA -0A5C ; [.272E.0020.0002] # GURMUKHI LETTER RRA -0A3E ; [.272F.0020.0002] # GURMUKHI VOWEL SIGN AA -0A3F ; [.2730.0020.0002] # GURMUKHI VOWEL SIGN I -0A40 ; [.2731.0020.0002] # GURMUKHI VOWEL SIGN II -0A41 ; [.2732.0020.0002] # GURMUKHI VOWEL SIGN U -0A42 ; [.2733.0020.0002] # GURMUKHI VOWEL SIGN UU -0A47 ; [.2734.0020.0002] # GURMUKHI VOWEL SIGN EE -0A48 ; [.2735.0020.0002] # GURMUKHI VOWEL SIGN AI -0A4B ; [.2736.0020.0002] # GURMUKHI VOWEL SIGN OO -0A4C ; [.2737.0020.0002] # GURMUKHI VOWEL SIGN AU -0A4D ; [.2738.0020.0002] # GURMUKHI SIGN VIRAMA -0AD0 ; [.2739.0020.0002] # GUJARATI OM -0A85 ; [.273A.0020.0002] # GUJARATI LETTER A -0A86 ; [.273B.0020.0002] # GUJARATI LETTER AA -0A87 ; [.273C.0020.0002] # GUJARATI LETTER I -0A88 ; [.273D.0020.0002] # GUJARATI LETTER II -0A89 ; [.273E.0020.0002] # GUJARATI LETTER U -0A8A ; [.273F.0020.0002] # GUJARATI LETTER UU -0A8B ; [.2740.0020.0002] # GUJARATI LETTER VOCALIC R -0AE0 ; [.2741.0020.0002] # GUJARATI LETTER VOCALIC RR -0A8C ; [.2742.0020.0002] # GUJARATI LETTER VOCALIC L -0AE1 ; [.2743.0020.0002] # GUJARATI LETTER VOCALIC LL -0A8D ; [.2744.0020.0002] # GUJARATI VOWEL CANDRA E -0A8F ; [.2745.0020.0002] # GUJARATI LETTER E -0A90 ; [.2746.0020.0002] # GUJARATI LETTER AI -0A91 ; [.2747.0020.0002] # GUJARATI VOWEL CANDRA O -0A93 ; [.2748.0020.0002] # GUJARATI LETTER O -0A94 ; [.2749.0020.0002] # GUJARATI LETTER AU -0A95 ; [.274A.0020.0002] # GUJARATI LETTER KA -0A96 ; [.274B.0020.0002] # GUJARATI LETTER KHA -0A97 ; [.274C.0020.0002] # GUJARATI LETTER GA -0A98 ; [.274D.0020.0002] # GUJARATI LETTER GHA -0A99 ; [.274E.0020.0002] # GUJARATI LETTER NGA -0A9A ; [.274F.0020.0002] # GUJARATI LETTER CA -0A9B ; [.2750.0020.0002] # GUJARATI LETTER CHA -0A9C ; [.2751.0020.0002] # GUJARATI LETTER JA -0AF9 ; [.2752.0020.0002] # GUJARATI LETTER ZHA -0A9D ; [.2753.0020.0002] # GUJARATI LETTER JHA -0A9E ; [.2754.0020.0002] # GUJARATI LETTER NYA -0A9F ; [.2755.0020.0002] # GUJARATI LETTER TTA -0AA0 ; [.2756.0020.0002] # GUJARATI LETTER TTHA -0AA1 ; [.2757.0020.0002] # GUJARATI LETTER DDA -0AA2 ; [.2758.0020.0002] # GUJARATI LETTER DDHA -0AA3 ; [.2759.0020.0002] # GUJARATI LETTER NNA -0AA4 ; [.275A.0020.0002] # GUJARATI LETTER TA -0AA5 ; [.275B.0020.0002] # GUJARATI LETTER THA -0AA6 ; [.275C.0020.0002] # GUJARATI LETTER DA -0AA7 ; [.275D.0020.0002] # GUJARATI LETTER DHA -0AA8 ; [.275E.0020.0002] # GUJARATI LETTER NA -0AAA ; [.275F.0020.0002] # GUJARATI LETTER PA -0AAB ; [.2760.0020.0002] # GUJARATI LETTER PHA -0AAC ; [.2761.0020.0002] # GUJARATI LETTER BA -0AAD ; [.2762.0020.0002] # GUJARATI LETTER BHA -0AAE ; [.2763.0020.0002] # GUJARATI LETTER MA -0AAF ; [.2764.0020.0002] # GUJARATI LETTER YA -0AB0 ; [.2765.0020.0002] # GUJARATI LETTER RA -0AB2 ; [.2766.0020.0002] # GUJARATI LETTER LA -0AB5 ; [.2767.0020.0002] # GUJARATI LETTER VA -0AB6 ; [.2768.0020.0002] # GUJARATI LETTER SHA -0AB7 ; [.2769.0020.0002] # GUJARATI LETTER SSA -0AB8 ; [.276A.0020.0002] # GUJARATI LETTER SA -0AB9 ; [.276B.0020.0002] # GUJARATI LETTER HA -0AB3 ; [.276C.0020.0002] # GUJARATI LETTER LLA -0ABD ; [.276D.0020.0002] # GUJARATI SIGN AVAGRAHA -0ABE ; [.276E.0020.0002] # GUJARATI VOWEL SIGN AA -0ABF ; [.276F.0020.0002] # GUJARATI VOWEL SIGN I -0AC0 ; [.2770.0020.0002] # GUJARATI VOWEL SIGN II -0AC1 ; [.2771.0020.0002] # GUJARATI VOWEL SIGN U -0AC2 ; [.2772.0020.0002] # GUJARATI VOWEL SIGN UU -0AC3 ; [.2773.0020.0002] # GUJARATI VOWEL SIGN VOCALIC R -0AC4 ; [.2774.0020.0002] # GUJARATI VOWEL SIGN VOCALIC RR -0AE2 ; [.2775.0020.0002] # GUJARATI VOWEL SIGN VOCALIC L -0AE3 ; [.2776.0020.0002] # GUJARATI VOWEL SIGN VOCALIC LL -0AC5 ; [.2777.0020.0002] # GUJARATI VOWEL SIGN CANDRA E -0AC7 ; [.2778.0020.0002] # GUJARATI VOWEL SIGN E -0AC8 ; [.2779.0020.0002] # GUJARATI VOWEL SIGN AI -0AC9 ; [.277A.0020.0002] # GUJARATI VOWEL SIGN CANDRA O -0ACB ; [.277B.0020.0002] # GUJARATI VOWEL SIGN O -0ACC ; [.277C.0020.0002] # GUJARATI VOWEL SIGN AU -0ACD ; [.277D.0020.0002] # GUJARATI SIGN VIRAMA -0B05 ; [.277E.0020.0002] # ORIYA LETTER A -0B06 ; [.277F.0020.0002] # ORIYA LETTER AA -0B07 ; [.2780.0020.0002] # ORIYA LETTER I -0B08 ; [.2781.0020.0002] # ORIYA LETTER II -0B09 ; [.2782.0020.0002] # ORIYA LETTER U -0B0A ; [.2783.0020.0002] # ORIYA LETTER UU -0B0B ; [.2784.0020.0002] # ORIYA LETTER VOCALIC R -0B60 ; [.2785.0020.0002] # ORIYA LETTER VOCALIC RR -0B0C ; [.2786.0020.0002] # ORIYA LETTER VOCALIC L -0B61 ; [.2787.0020.0002] # ORIYA LETTER VOCALIC LL -0B0F ; [.2788.0020.0002] # ORIYA LETTER E -0B10 ; [.2789.0020.0002] # ORIYA LETTER AI -0B13 ; [.278A.0020.0002] # ORIYA LETTER O -0B14 ; [.278B.0020.0002] # ORIYA LETTER AU -0B15 ; [.278C.0020.0002] # ORIYA LETTER KA -0B16 ; [.278D.0020.0002] # ORIYA LETTER KHA -0B17 ; [.278E.0020.0002] # ORIYA LETTER GA -0B18 ; [.278F.0020.0002] # ORIYA LETTER GHA -0B19 ; [.2790.0020.0002] # ORIYA LETTER NGA -0B1A ; [.2791.0020.0002] # ORIYA LETTER CA -0B1B ; [.2792.0020.0002] # ORIYA LETTER CHA -0B1C ; [.2793.0020.0002] # ORIYA LETTER JA -0B1D ; [.2794.0020.0002] # ORIYA LETTER JHA -0B1E ; [.2795.0020.0002] # ORIYA LETTER NYA -0B1F ; [.2796.0020.0002] # ORIYA LETTER TTA -0B20 ; [.2797.0020.0002] # ORIYA LETTER TTHA -0B21 ; [.2798.0020.0002] # ORIYA LETTER DDA -0B5C ; [.2798.0020.0002][.0000.00C2.0002] # ORIYA LETTER RRA -0B22 ; [.2799.0020.0002] # ORIYA LETTER DDHA -0B5D ; [.2799.0020.0002][.0000.00C2.0002] # ORIYA LETTER RHA -0B23 ; [.279A.0020.0002] # ORIYA LETTER NNA -0B24 ; [.279B.0020.0002] # ORIYA LETTER TA -0B25 ; [.279C.0020.0002] # ORIYA LETTER THA -0B26 ; [.279D.0020.0002] # ORIYA LETTER DA -0B27 ; [.279E.0020.0002] # ORIYA LETTER DHA -0B28 ; [.279F.0020.0002] # ORIYA LETTER NA -0B2A ; [.27A0.0020.0002] # ORIYA LETTER PA -0B2B ; [.27A1.0020.0002] # ORIYA LETTER PHA -0B2C ; [.27A2.0020.0002] # ORIYA LETTER BA -0B2D ; [.27A3.0020.0002] # ORIYA LETTER BHA -0B2E ; [.27A4.0020.0002] # ORIYA LETTER MA -0B2F ; [.27A5.0020.0002] # ORIYA LETTER YA -0B5F ; [.27A6.0020.0002] # ORIYA LETTER YYA -0B30 ; [.27A7.0020.0002] # ORIYA LETTER RA -0B32 ; [.27A8.0020.0002] # ORIYA LETTER LA -0B33 ; [.27A9.0020.0002] # ORIYA LETTER LLA -0B35 ; [.27AA.0020.0002] # ORIYA LETTER VA -0B71 ; [.27AB.0020.0002] # ORIYA LETTER WA -0B36 ; [.27AC.0020.0002] # ORIYA LETTER SHA -0B37 ; [.27AD.0020.0002] # ORIYA LETTER SSA -0B38 ; [.27AE.0020.0002] # ORIYA LETTER SA -0B39 ; [.27AF.0020.0002] # ORIYA LETTER HA -0B3D ; [.27B0.0020.0002] # ORIYA SIGN AVAGRAHA -0B3E ; [.27B1.0020.0002] # ORIYA VOWEL SIGN AA -0B3F ; [.27B2.0020.0002] # ORIYA VOWEL SIGN I -0B40 ; [.27B3.0020.0002] # ORIYA VOWEL SIGN II -0B41 ; [.27B4.0020.0002] # ORIYA VOWEL SIGN U -0B42 ; [.27B5.0020.0002] # ORIYA VOWEL SIGN UU -0B43 ; [.27B6.0020.0002] # ORIYA VOWEL SIGN VOCALIC R -0B44 ; [.27B7.0020.0002] # ORIYA VOWEL SIGN VOCALIC RR -0B62 ; [.27B8.0020.0002] # ORIYA VOWEL SIGN VOCALIC L -0B63 ; [.27B9.0020.0002] # ORIYA VOWEL SIGN VOCALIC LL -0B47 ; [.27BA.0020.0002] # ORIYA VOWEL SIGN E -0B48 ; [.27BB.0020.0002] # ORIYA VOWEL SIGN AI -0B47 0B56 ; [.27BB.0020.0002] # ORIYA VOWEL SIGN AI -0B4B ; [.27BC.0020.0002] # ORIYA VOWEL SIGN O -0B47 0B3E ; [.27BC.0020.0002] # ORIYA VOWEL SIGN O -0B4C ; [.27BD.0020.0002] # ORIYA VOWEL SIGN AU -0B47 0B57 ; [.27BD.0020.0002] # ORIYA VOWEL SIGN AU -0B4D ; [.27BE.0020.0002] # ORIYA SIGN VIRAMA -0B56 ; [.27BF.0020.0002] # ORIYA AI LENGTH MARK -0B57 ; [.27C0.0020.0002] # ORIYA AU LENGTH MARK -0BD0 ; [.27C1.0020.0002] # TAMIL OM -0B85 ; [.27C2.0020.0002] # TAMIL LETTER A -0B86 ; [.27C3.0020.0002] # TAMIL LETTER AA -0B87 ; [.27C4.0020.0002] # TAMIL LETTER I -0B88 ; [.27C5.0020.0002] # TAMIL LETTER II -0B89 ; [.27C6.0020.0002] # TAMIL LETTER U -0B8A ; [.27C7.0020.0002] # TAMIL LETTER UU -0B8E ; [.27C8.0020.0002] # TAMIL LETTER E -0B8F ; [.27C9.0020.0002] # TAMIL LETTER EE -0B90 ; [.27CA.0020.0002] # TAMIL LETTER AI -0B92 ; [.27CB.0020.0002] # TAMIL LETTER O -0B93 ; [.27CC.0020.0002] # TAMIL LETTER OO -0B94 ; [.27CD.0020.0002] # TAMIL LETTER AU -0B92 0BD7 ; [.27CD.0020.0002] # TAMIL LETTER AU -0B83 ; [.27CE.0020.0002] # TAMIL SIGN VISARGA -0B95 ; [.27CF.0020.0002] # TAMIL LETTER KA -0B99 ; [.27D0.0020.0002] # TAMIL LETTER NGA -0B9A ; [.27D1.0020.0002] # TAMIL LETTER CA -0B9E ; [.27D2.0020.0002] # TAMIL LETTER NYA -0B9F ; [.27D3.0020.0002] # TAMIL LETTER TTA -0BA3 ; [.27D4.0020.0002] # TAMIL LETTER NNA -0BA4 ; [.27D5.0020.0002] # TAMIL LETTER TA -0BA8 ; [.27D6.0020.0002] # TAMIL LETTER NA -0BAA ; [.27D7.0020.0002] # TAMIL LETTER PA -0BAE ; [.27D8.0020.0002] # TAMIL LETTER MA -0BAF ; [.27D9.0020.0002] # TAMIL LETTER YA -0BB0 ; [.27DA.0020.0002] # TAMIL LETTER RA -0BB2 ; [.27DB.0020.0002] # TAMIL LETTER LA -0BB5 ; [.27DC.0020.0002] # TAMIL LETTER VA -0BB4 ; [.27DD.0020.0002] # TAMIL LETTER LLLA -0BB3 ; [.27DE.0020.0002] # TAMIL LETTER LLA -0BB1 ; [.27DF.0020.0002] # TAMIL LETTER RRA -0BA9 ; [.27E0.0020.0002] # TAMIL LETTER NNNA -0B9C ; [.27E1.0020.0002] # TAMIL LETTER JA -0BB6 ; [.27E2.0020.0002] # TAMIL LETTER SHA -0BB7 ; [.27E3.0020.0002] # TAMIL LETTER SSA -0BB8 ; [.27E4.0020.0002] # TAMIL LETTER SA -0BB9 ; [.27E5.0020.0002] # TAMIL LETTER HA -0BBE ; [.27E6.0020.0002] # TAMIL VOWEL SIGN AA -0BBF ; [.27E7.0020.0002] # TAMIL VOWEL SIGN I -0BC0 ; [.27E8.0020.0002] # TAMIL VOWEL SIGN II -0BC1 ; [.27E9.0020.0002] # TAMIL VOWEL SIGN U -0BC2 ; [.27EA.0020.0002] # TAMIL VOWEL SIGN UU -0BC6 ; [.27EB.0020.0002] # TAMIL VOWEL SIGN E -0BC7 ; [.27EC.0020.0002] # TAMIL VOWEL SIGN EE -0BC8 ; [.27ED.0020.0002] # TAMIL VOWEL SIGN AI -0BCA ; [.27EE.0020.0002] # TAMIL VOWEL SIGN O -0BC6 0BBE ; [.27EE.0020.0002] # TAMIL VOWEL SIGN O -0BCB ; [.27EF.0020.0002] # TAMIL VOWEL SIGN OO -0BC7 0BBE ; [.27EF.0020.0002] # TAMIL VOWEL SIGN OO -0BCC ; [.27F0.0020.0002] # TAMIL VOWEL SIGN AU -0BC6 0BD7 ; [.27F0.0020.0002] # TAMIL VOWEL SIGN AU -0BCD ; [.27F1.0020.0002] # TAMIL SIGN VIRAMA -0BD7 ; [.27F2.0020.0002] # TAMIL AU LENGTH MARK -0C05 ; [.27F3.0020.0002] # TELUGU LETTER A -0C06 ; [.27F4.0020.0002] # TELUGU LETTER AA -0C07 ; [.27F5.0020.0002] # TELUGU LETTER I -0C08 ; [.27F6.0020.0002] # TELUGU LETTER II -0C09 ; [.27F7.0020.0002] # TELUGU LETTER U -0C0A ; [.27F8.0020.0002] # TELUGU LETTER UU -0C0B ; [.27F9.0020.0002] # TELUGU LETTER VOCALIC R -0C60 ; [.27FA.0020.0002] # TELUGU LETTER VOCALIC RR -0C0C ; [.27FB.0020.0002] # TELUGU LETTER VOCALIC L -0C61 ; [.27FC.0020.0002] # TELUGU LETTER VOCALIC LL -0C0E ; [.27FD.0020.0002] # TELUGU LETTER E -0C0F ; [.27FE.0020.0002] # TELUGU LETTER EE -0C10 ; [.27FF.0020.0002] # TELUGU LETTER AI -0C12 ; [.2800.0020.0002] # TELUGU LETTER O -0C13 ; [.2801.0020.0002] # TELUGU LETTER OO -0C14 ; [.2802.0020.0002] # TELUGU LETTER AU -0C15 ; [.2803.0020.0002] # TELUGU LETTER KA -0C16 ; [.2804.0020.0002] # TELUGU LETTER KHA -0C17 ; [.2805.0020.0002] # TELUGU LETTER GA -0C18 ; [.2806.0020.0002] # TELUGU LETTER GHA -0C19 ; [.2807.0020.0002] # TELUGU LETTER NGA -0C1A ; [.2808.0020.0002] # TELUGU LETTER CA -0C58 ; [.2809.0020.0002] # TELUGU LETTER TSA -0C1B ; [.280A.0020.0002] # TELUGU LETTER CHA -0C1C ; [.280B.0020.0002] # TELUGU LETTER JA -0C59 ; [.280C.0020.0002] # TELUGU LETTER DZA -0C1D ; [.280D.0020.0002] # TELUGU LETTER JHA -0C1E ; [.280E.0020.0002] # TELUGU LETTER NYA -0C1F ; [.280F.0020.0002] # TELUGU LETTER TTA -0C20 ; [.2810.0020.0002] # TELUGU LETTER TTHA -0C21 ; [.2811.0020.0002] # TELUGU LETTER DDA -0C22 ; [.2812.0020.0002] # TELUGU LETTER DDHA -0C23 ; [.2813.0020.0002] # TELUGU LETTER NNA -0C24 ; [.2814.0020.0002] # TELUGU LETTER TA -0C25 ; [.2815.0020.0002] # TELUGU LETTER THA -0C26 ; [.2816.0020.0002] # TELUGU LETTER DA -0C27 ; [.2817.0020.0002] # TELUGU LETTER DHA -0C28 ; [.2818.0020.0002] # TELUGU LETTER NA -0C2A ; [.2819.0020.0002] # TELUGU LETTER PA -0C2B ; [.281A.0020.0002] # TELUGU LETTER PHA -0C2C ; [.281B.0020.0002] # TELUGU LETTER BA -0C2D ; [.281C.0020.0002] # TELUGU LETTER BHA -0C2E ; [.281D.0020.0002] # TELUGU LETTER MA -0C2F ; [.281E.0020.0002] # TELUGU LETTER YA -0C30 ; [.281F.0020.0002] # TELUGU LETTER RA -0C31 ; [.2820.0020.0002] # TELUGU LETTER RRA -0C32 ; [.2821.0020.0002] # TELUGU LETTER LA -0C35 ; [.2822.0020.0002] # TELUGU LETTER VA -0C36 ; [.2823.0020.0002] # TELUGU LETTER SHA -0C37 ; [.2824.0020.0002] # TELUGU LETTER SSA -0C38 ; [.2825.0020.0002] # TELUGU LETTER SA -0C39 ; [.2826.0020.0002] # TELUGU LETTER HA -0C33 ; [.2827.0020.0002] # TELUGU LETTER LLA -0C34 ; [.2828.0020.0002] # TELUGU LETTER LLLA -0C5A ; [.2829.0020.0002] # TELUGU LETTER RRRA -0C3D ; [.282A.0020.0002] # TELUGU SIGN AVAGRAHA -0C3E ; [.282B.0020.0002] # TELUGU VOWEL SIGN AA -0C3F ; [.282C.0020.0002] # TELUGU VOWEL SIGN I -0C40 ; [.282D.0020.0002] # TELUGU VOWEL SIGN II -0C41 ; [.282E.0020.0002] # TELUGU VOWEL SIGN U -0C42 ; [.282F.0020.0002] # TELUGU VOWEL SIGN UU -0C43 ; [.2830.0020.0002] # TELUGU VOWEL SIGN VOCALIC R -0C44 ; [.2831.0020.0002] # TELUGU VOWEL SIGN VOCALIC RR -0C62 ; [.2832.0020.0002] # TELUGU VOWEL SIGN VOCALIC L -0C63 ; [.2833.0020.0002] # TELUGU VOWEL SIGN VOCALIC LL -0C46 ; [.2834.0020.0002] # TELUGU VOWEL SIGN E -0C47 ; [.2835.0020.0002] # TELUGU VOWEL SIGN EE -0C48 ; [.2836.0020.0002] # TELUGU VOWEL SIGN AI -0C46 0C56 ; [.2836.0020.0002] # TELUGU VOWEL SIGN AI -0C4A ; [.2837.0020.0002] # TELUGU VOWEL SIGN O -0C4B ; [.2838.0020.0002] # TELUGU VOWEL SIGN OO -0C4C ; [.2839.0020.0002] # TELUGU VOWEL SIGN AU -0C4D ; [.283A.0020.0002] # TELUGU SIGN VIRAMA -0C55 ; [.283B.0020.0002] # TELUGU LENGTH MARK -0C56 ; [.283C.0020.0002] # TELUGU AI LENGTH MARK -0C85 ; [.283D.0020.0002] # KANNADA LETTER A -0C86 ; [.283E.0020.0002] # KANNADA LETTER AA -0C87 ; [.283F.0020.0002] # KANNADA LETTER I -0C88 ; [.2840.0020.0002] # KANNADA LETTER II -0C89 ; [.2841.0020.0002] # KANNADA LETTER U -0C8A ; [.2842.0020.0002] # KANNADA LETTER UU -0C8B ; [.2843.0020.0002] # KANNADA LETTER VOCALIC R -0CE0 ; [.2844.0020.0002] # KANNADA LETTER VOCALIC RR -0C8C ; [.2845.0020.0002] # KANNADA LETTER VOCALIC L -0CE1 ; [.2846.0020.0002] # KANNADA LETTER VOCALIC LL -0C8E ; [.2847.0020.0002] # KANNADA LETTER E -0C8F ; [.2848.0020.0002] # KANNADA LETTER EE -0C90 ; [.2849.0020.0002] # KANNADA LETTER AI -0C92 ; [.284A.0020.0002] # KANNADA LETTER O -0C93 ; [.284B.0020.0002] # KANNADA LETTER OO -0C94 ; [.284C.0020.0002] # KANNADA LETTER AU -0C95 ; [.284D.0020.0002] # KANNADA LETTER KA -0C96 ; [.284E.0020.0002] # KANNADA LETTER KHA -0C97 ; [.284F.0020.0002] # KANNADA LETTER GA -0C98 ; [.2850.0020.0002] # KANNADA LETTER GHA -0C99 ; [.2851.0020.0002] # KANNADA LETTER NGA -0C9A ; [.2852.0020.0002] # KANNADA LETTER CA -0C9B ; [.2853.0020.0002] # KANNADA LETTER CHA -0C9C ; [.2854.0020.0002] # KANNADA LETTER JA -0C9D ; [.2855.0020.0002] # KANNADA LETTER JHA -0C9E ; [.2856.0020.0002] # KANNADA LETTER NYA -0C9F ; [.2857.0020.0002] # KANNADA LETTER TTA -0CA0 ; [.2858.0020.0002] # KANNADA LETTER TTHA -0CA1 ; [.2859.0020.0002] # KANNADA LETTER DDA -0CA2 ; [.285A.0020.0002] # KANNADA LETTER DDHA -0CA3 ; [.285B.0020.0002] # KANNADA LETTER NNA -0CA4 ; [.285C.0020.0002] # KANNADA LETTER TA -0CA5 ; [.285D.0020.0002] # KANNADA LETTER THA -0CA6 ; [.285E.0020.0002] # KANNADA LETTER DA -0CA7 ; [.285F.0020.0002] # KANNADA LETTER DHA -0CA8 ; [.2860.0020.0002] # KANNADA LETTER NA -0CAA ; [.2861.0020.0002] # KANNADA LETTER PA -0CAB ; [.2862.0020.0002] # KANNADA LETTER PHA -0CAC ; [.2863.0020.0002] # KANNADA LETTER BA -0CAD ; [.2864.0020.0002] # KANNADA LETTER BHA -0CAE ; [.2865.0020.0002] # KANNADA LETTER MA -0CAF ; [.2866.0020.0002] # KANNADA LETTER YA -0CB0 ; [.2867.0020.0002] # KANNADA LETTER RA -0CB1 ; [.2868.0020.0002] # KANNADA LETTER RRA -0CB2 ; [.2869.0020.0002] # KANNADA LETTER LA -0CB5 ; [.286A.0020.0002] # KANNADA LETTER VA -0CB6 ; [.286B.0020.0002] # KANNADA LETTER SHA -0CB7 ; [.286C.0020.0002] # KANNADA LETTER SSA -0CB8 ; [.286D.0020.0002] # KANNADA LETTER SA -0CB9 ; [.286E.0020.0002] # KANNADA LETTER HA -0CB3 ; [.286F.0020.0002] # KANNADA LETTER LLA -0CDE ; [.2870.0020.0002] # KANNADA LETTER FA -0CBD ; [.2871.0020.0002] # KANNADA SIGN AVAGRAHA -0CF1 ; [.2872.0020.0002] # KANNADA SIGN JIHVAMULIYA -0CF2 ; [.2873.0020.0002] # KANNADA SIGN UPADHMANIYA -0C80 ; [.2874.0020.0002] # KANNADA SIGN SPACING CANDRABINDU -0CBE ; [.2875.0020.0002] # KANNADA VOWEL SIGN AA -0CBF ; [.2876.0020.0002] # KANNADA VOWEL SIGN I -0CC0 ; [.2877.0020.0002] # KANNADA VOWEL SIGN II -0CBF 0CD5 ; [.2877.0020.0002] # KANNADA VOWEL SIGN II -0CC1 ; [.2878.0020.0002] # KANNADA VOWEL SIGN U -0CC2 ; [.2879.0020.0002] # KANNADA VOWEL SIGN UU -0CC3 ; [.287A.0020.0002] # KANNADA VOWEL SIGN VOCALIC R -0CC4 ; [.287B.0020.0002] # KANNADA VOWEL SIGN VOCALIC RR -0CE2 ; [.287C.0020.0002] # KANNADA VOWEL SIGN VOCALIC L -0CE3 ; [.287D.0020.0002] # KANNADA VOWEL SIGN VOCALIC LL -0CC6 ; [.287E.0020.0002] # KANNADA VOWEL SIGN E -0CC7 ; [.287F.0020.0002] # KANNADA VOWEL SIGN EE -0CC6 0CD5 ; [.287F.0020.0002] # KANNADA VOWEL SIGN EE -0CC8 ; [.2880.0020.0002] # KANNADA VOWEL SIGN AI -0CC6 0CD6 ; [.2880.0020.0002] # KANNADA VOWEL SIGN AI -0CCA ; [.2881.0020.0002] # KANNADA VOWEL SIGN O -0CC6 0CC2 ; [.2881.0020.0002] # KANNADA VOWEL SIGN O -0CCB ; [.2882.0020.0002] # KANNADA VOWEL SIGN OO -0CC6 0CC2 0CD5 ; [.2882.0020.0002] # KANNADA VOWEL SIGN OO -0CCA 0CD5 ; [.2882.0020.0002] # KANNADA VOWEL SIGN OO -0CCC ; [.2883.0020.0002] # KANNADA VOWEL SIGN AU -0CCD ; [.2884.0020.0002] # KANNADA SIGN VIRAMA -0CD5 ; [.2885.0020.0002] # KANNADA LENGTH MARK -0CD6 ; [.2886.0020.0002] # KANNADA AI LENGTH MARK -0D05 ; [.2887.0020.0002] # MALAYALAM LETTER A -0D06 ; [.2888.0020.0002] # MALAYALAM LETTER AA -0D07 ; [.2889.0020.0002] # MALAYALAM LETTER I -0D08 ; [.288A.0020.0002] # MALAYALAM LETTER II -0D5F ; [.288B.0020.0002] # MALAYALAM LETTER ARCHAIC II -0D09 ; [.288C.0020.0002] # MALAYALAM LETTER U -0D0A ; [.288D.0020.0002] # MALAYALAM LETTER UU -0D0B ; [.288E.0020.0002] # MALAYALAM LETTER VOCALIC R -0D60 ; [.288F.0020.0002] # MALAYALAM LETTER VOCALIC RR -0D0C ; [.2890.0020.0002] # MALAYALAM LETTER VOCALIC L -0D61 ; [.2891.0020.0002] # MALAYALAM LETTER VOCALIC LL -0D0E ; [.2892.0020.0002] # MALAYALAM LETTER E -0D0F ; [.2893.0020.0002] # MALAYALAM LETTER EE -0D10 ; [.2894.0020.0002] # MALAYALAM LETTER AI -0D12 ; [.2895.0020.0002] # MALAYALAM LETTER O -0D13 ; [.2896.0020.0002] # MALAYALAM LETTER OO -0D14 ; [.2897.0020.0002] # MALAYALAM LETTER AU -0D15 ; [.2898.0020.0002] # MALAYALAM LETTER KA -0D7F ; [.2898.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU K -0D16 ; [.2899.0020.0002] # MALAYALAM LETTER KHA -0D17 ; [.289A.0020.0002] # MALAYALAM LETTER GA -0D18 ; [.289B.0020.0002] # MALAYALAM LETTER GHA -0D19 ; [.289C.0020.0002] # MALAYALAM LETTER NGA -0D1A ; [.289D.0020.0002] # MALAYALAM LETTER CA -0D1B ; [.289E.0020.0002] # MALAYALAM LETTER CHA -0D1C ; [.289F.0020.0002] # MALAYALAM LETTER JA -0D1D ; [.28A0.0020.0002] # MALAYALAM LETTER JHA -0D1E ; [.28A1.0020.0002] # MALAYALAM LETTER NYA -0D1F ; [.28A2.0020.0002] # MALAYALAM LETTER TTA -0D20 ; [.28A3.0020.0002] # MALAYALAM LETTER TTHA -0D21 ; [.28A4.0020.0002] # MALAYALAM LETTER DDA -0D22 ; [.28A5.0020.0002] # MALAYALAM LETTER DDHA -0D23 ; [.28A6.0020.0002] # MALAYALAM LETTER NNA -0D7A ; [.28A6.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU NN -0D24 ; [.28A7.0020.0002] # MALAYALAM LETTER TA -0D25 ; [.28A8.0020.0002] # MALAYALAM LETTER THA -0D26 ; [.28A9.0020.0002] # MALAYALAM LETTER DA -0D27 ; [.28AA.0020.0002] # MALAYALAM LETTER DHA -0D28 ; [.28AB.0020.0002] # MALAYALAM LETTER NA -0D7B ; [.28AB.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU N -0D29 ; [.28AC.0020.0002] # MALAYALAM LETTER NNNA -0D2A ; [.28AD.0020.0002] # MALAYALAM LETTER PA -0D2B ; [.28AE.0020.0002] # MALAYALAM LETTER PHA -0D2C ; [.28AF.0020.0002] # MALAYALAM LETTER BA -0D2D ; [.28B0.0020.0002] # MALAYALAM LETTER BHA -0D2E ; [.28B1.0020.0002] # MALAYALAM LETTER MA -0D54 ; [.28B1.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU M -0D2F ; [.28B2.0020.0002] # MALAYALAM LETTER YA -0D55 ; [.28B2.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU Y -0D30 ; [.28B3.0020.0002] # MALAYALAM LETTER RA -0D4E ; [.28B3.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER DOT REPH -0D7C ; [.28B3.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU RR -0D32 ; [.28B4.0020.0002] # MALAYALAM LETTER LA -0D7D ; [.28B4.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU L -0D35 ; [.28B5.0020.0002] # MALAYALAM LETTER VA -0D36 ; [.28B6.0020.0002] # MALAYALAM LETTER SHA -0D37 ; [.28B7.0020.0002] # MALAYALAM LETTER SSA -0D38 ; [.28B8.0020.0002] # MALAYALAM LETTER SA -0D39 ; [.28B9.0020.0002] # MALAYALAM LETTER HA -0D33 ; [.28BA.0020.0002] # MALAYALAM LETTER LLA -0D7E ; [.28BA.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU LL -0D34 ; [.28BB.0020.0002] # MALAYALAM LETTER LLLA -0D56 ; [.28BB.0020.0004][.28CF.0020.0004] # MALAYALAM LETTER CHILLU LLL -0D31 ; [.28BC.0020.0002] # MALAYALAM LETTER RRA -0D3A ; [.28BD.0020.0002] # MALAYALAM LETTER TTTA -0D3D ; [.28BE.0020.0002] # MALAYALAM SIGN AVAGRAHA -0D3E ; [.28BF.0020.0002] # MALAYALAM VOWEL SIGN AA -0D3F ; [.28C0.0020.0002] # MALAYALAM VOWEL SIGN I -0D40 ; [.28C1.0020.0002] # MALAYALAM VOWEL SIGN II -0D41 ; [.28C2.0020.0002] # MALAYALAM VOWEL SIGN U -0D42 ; [.28C3.0020.0002] # MALAYALAM VOWEL SIGN UU -0D43 ; [.28C4.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC R -0D44 ; [.28C5.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC RR -0D62 ; [.28C6.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC L -0D63 ; [.28C7.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC LL -0D46 ; [.28C8.0020.0002] # MALAYALAM VOWEL SIGN E -0D47 ; [.28C9.0020.0002] # MALAYALAM VOWEL SIGN EE -0D48 ; [.28CA.0020.0002] # MALAYALAM VOWEL SIGN AI -0D4A ; [.28CB.0020.0002] # MALAYALAM VOWEL SIGN O -0D46 0D3E ; [.28CB.0020.0002] # MALAYALAM VOWEL SIGN O -0D4B ; [.28CC.0020.0002] # MALAYALAM VOWEL SIGN OO -0D47 0D3E ; [.28CC.0020.0002] # MALAYALAM VOWEL SIGN OO -0D4C ; [.28CD.0020.0002] # MALAYALAM VOWEL SIGN AU -0D46 0D57 ; [.28CD.0020.0002] # MALAYALAM VOWEL SIGN AU -0D57 ; [.28CE.0020.0002] # MALAYALAM AU LENGTH MARK -0D4D ; [.28CF.0020.0002] # MALAYALAM SIGN VIRAMA -0D85 ; [.28D0.0020.0002] # SINHALA LETTER AYANNA -0D86 ; [.28D1.0020.0002] # SINHALA LETTER AAYANNA -0D87 ; [.28D2.0020.0002] # SINHALA LETTER AEYANNA -0D88 ; [.28D3.0020.0002] # SINHALA LETTER AEEYANNA -0D89 ; [.28D4.0020.0002] # SINHALA LETTER IYANNA -0D8A ; [.28D5.0020.0002] # SINHALA LETTER IIYANNA -0D8B ; [.28D6.0020.0002] # SINHALA LETTER UYANNA -0D8C ; [.28D7.0020.0002] # SINHALA LETTER UUYANNA -0D8D ; [.28D8.0020.0002] # SINHALA LETTER IRUYANNA -0D8E ; [.28D9.0020.0002] # SINHALA LETTER IRUUYANNA -0D8F ; [.28DA.0020.0002] # SINHALA LETTER ILUYANNA -0D90 ; [.28DB.0020.0002] # SINHALA LETTER ILUUYANNA -0D91 ; [.28DC.0020.0002] # SINHALA LETTER EYANNA -0D92 ; [.28DD.0020.0002] # SINHALA LETTER EEYANNA -0D93 ; [.28DE.0020.0002] # SINHALA LETTER AIYANNA -0D94 ; [.28DF.0020.0002] # SINHALA LETTER OYANNA -0D95 ; [.28E0.0020.0002] # SINHALA LETTER OOYANNA -0D96 ; [.28E1.0020.0002] # SINHALA LETTER AUYANNA -0D9A ; [.28E2.0020.0002] # SINHALA LETTER ALPAPRAANA KAYANNA -0D9B ; [.28E3.0020.0002] # SINHALA LETTER MAHAAPRAANA KAYANNA -0D9C ; [.28E4.0020.0002] # SINHALA LETTER ALPAPRAANA GAYANNA -0D9D ; [.28E5.0020.0002] # SINHALA LETTER MAHAAPRAANA GAYANNA -0D9E ; [.28E6.0020.0002] # SINHALA LETTER KANTAJA NAASIKYAYA -0D9F ; [.28E7.0020.0002] # SINHALA LETTER SANYAKA GAYANNA -0DA0 ; [.28E8.0020.0002] # SINHALA LETTER ALPAPRAANA CAYANNA -0DA1 ; [.28E9.0020.0002] # SINHALA LETTER MAHAAPRAANA CAYANNA -0DA2 ; [.28EA.0020.0002] # SINHALA LETTER ALPAPRAANA JAYANNA -0DA3 ; [.28EB.0020.0002] # SINHALA LETTER MAHAAPRAANA JAYANNA -0DA4 ; [.28EC.0020.0002] # SINHALA LETTER TAALUJA NAASIKYAYA -0DA5 ; [.28ED.0020.0002] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA -0DA6 ; [.28EE.0020.0002] # SINHALA LETTER SANYAKA JAYANNA -0DA7 ; [.28EF.0020.0002] # SINHALA LETTER ALPAPRAANA TTAYANNA -0DA8 ; [.28F0.0020.0002] # SINHALA LETTER MAHAAPRAANA TTAYANNA -0DA9 ; [.28F1.0020.0002] # SINHALA LETTER ALPAPRAANA DDAYANNA -0DAA ; [.28F2.0020.0002] # SINHALA LETTER MAHAAPRAANA DDAYANNA -0DAB ; [.28F3.0020.0002] # SINHALA LETTER MUURDHAJA NAYANNA -0DAC ; [.28F4.0020.0002] # SINHALA LETTER SANYAKA DDAYANNA -0DAD ; [.28F5.0020.0002] # SINHALA LETTER ALPAPRAANA TAYANNA -0DAE ; [.28F6.0020.0002] # SINHALA LETTER MAHAAPRAANA TAYANNA -0DAF ; [.28F7.0020.0002] # SINHALA LETTER ALPAPRAANA DAYANNA -0DB0 ; [.28F8.0020.0002] # SINHALA LETTER MAHAAPRAANA DAYANNA -0DB1 ; [.28F9.0020.0002] # SINHALA LETTER DANTAJA NAYANNA -0DB3 ; [.28FA.0020.0002] # SINHALA LETTER SANYAKA DAYANNA -0DB4 ; [.28FB.0020.0002] # SINHALA LETTER ALPAPRAANA PAYANNA -0DB5 ; [.28FC.0020.0002] # SINHALA LETTER MAHAAPRAANA PAYANNA -0DB6 ; [.28FD.0020.0002] # SINHALA LETTER ALPAPRAANA BAYANNA -0DB7 ; [.28FE.0020.0002] # SINHALA LETTER MAHAAPRAANA BAYANNA -0DB8 ; [.28FF.0020.0002] # SINHALA LETTER MAYANNA -0DB9 ; [.2900.0020.0002] # SINHALA LETTER AMBA BAYANNA -0DBA ; [.2901.0020.0002] # SINHALA LETTER YAYANNA -0DBB ; [.2902.0020.0002] # SINHALA LETTER RAYANNA -0DBD ; [.2903.0020.0002] # SINHALA LETTER DANTAJA LAYANNA -0DC0 ; [.2904.0020.0002] # SINHALA LETTER VAYANNA -0DC1 ; [.2905.0020.0002] # SINHALA LETTER TAALUJA SAYANNA -0DC2 ; [.2906.0020.0002] # SINHALA LETTER MUURDHAJA SAYANNA -0DC3 ; [.2907.0020.0002] # SINHALA LETTER DANTAJA SAYANNA -0DC4 ; [.2908.0020.0002] # SINHALA LETTER HAYANNA -0DC5 ; [.2909.0020.0002] # SINHALA LETTER MUURDHAJA LAYANNA -0DC6 ; [.290A.0020.0002] # SINHALA LETTER FAYANNA -0DCF ; [.290B.0020.0002] # SINHALA VOWEL SIGN AELA-PILLA -0DD0 ; [.290C.0020.0002] # SINHALA VOWEL SIGN KETTI AEDA-PILLA -0DD1 ; [.290D.0020.0002] # SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2 ; [.290E.0020.0002] # SINHALA VOWEL SIGN KETTI IS-PILLA -0DD3 ; [.290F.0020.0002] # SINHALA VOWEL SIGN DIGA IS-PILLA -0DD4 ; [.2910.0020.0002] # SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; [.2911.0020.0002] # SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8 ; [.2912.0020.0002] # SINHALA VOWEL SIGN GAETTA-PILLA -0DF2 ; [.2913.0020.0002] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA -0DDF ; [.2914.0020.0002] # SINHALA VOWEL SIGN GAYANUKITTA -0DF3 ; [.2915.0020.0002] # SINHALA VOWEL SIGN DIGA GAYANUKITTA -0DD9 ; [.2916.0020.0002] # SINHALA VOWEL SIGN KOMBUVA -0DDA ; [.2917.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA -0DD9 0DCA ; [.2917.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA -0DDB ; [.2918.0020.0002] # SINHALA VOWEL SIGN KOMBU DEKA -0DDC ; [.2919.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA -0DD9 0DCF ; [.2919.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA -0DDD ; [.291A.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA -0DD9 0DCF 0DCA ; [.291A.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA -0DDC 0DCA ; [.291A.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA -0DDE ; [.291B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -0DD9 0DDF ; [.291B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -0DCA ; [.291C.0020.0002] # SINHALA SIGN AL-LAKUNA -AAF2 ; [.291D.0020.0002] # MEETEI MAYEK ANJI -ABC0 ; [.291E.0020.0002] # MEETEI MAYEK LETTER KOK -ABC1 ; [.291F.0020.0002] # MEETEI MAYEK LETTER SAM -ABC2 ; [.2920.0020.0002] # MEETEI MAYEK LETTER LAI -ABC3 ; [.2921.0020.0002] # MEETEI MAYEK LETTER MIT -ABC4 ; [.2922.0020.0002] # MEETEI MAYEK LETTER PA -ABC5 ; [.2923.0020.0002] # MEETEI MAYEK LETTER NA -ABC6 ; [.2924.0020.0002] # MEETEI MAYEK LETTER CHIL -ABC7 ; [.2925.0020.0002] # MEETEI MAYEK LETTER TIL -ABC8 ; [.2926.0020.0002] # MEETEI MAYEK LETTER KHOU -ABC9 ; [.2927.0020.0002] # MEETEI MAYEK LETTER NGOU -ABCA ; [.2928.0020.0002] # MEETEI MAYEK LETTER THOU -ABCB ; [.2929.0020.0002] # MEETEI MAYEK LETTER WAI -ABCC ; [.292A.0020.0002] # MEETEI MAYEK LETTER YANG -ABCD ; [.292B.0020.0002] # MEETEI MAYEK LETTER HUK -ABCE ; [.292C.0020.0002] # MEETEI MAYEK LETTER UN -ABCF ; [.292D.0020.0002] # MEETEI MAYEK LETTER I -ABD0 ; [.292E.0020.0002] # MEETEI MAYEK LETTER PHAM -ABD1 ; [.292F.0020.0002] # MEETEI MAYEK LETTER ATIYA -ABD2 ; [.2930.0020.0002] # MEETEI MAYEK LETTER GOK -ABD3 ; [.2931.0020.0002] # MEETEI MAYEK LETTER JHAM -ABD4 ; [.2932.0020.0002] # MEETEI MAYEK LETTER RAI -ABD5 ; [.2933.0020.0002] # MEETEI MAYEK LETTER BA -ABD6 ; [.2934.0020.0002] # MEETEI MAYEK LETTER JIL -ABD7 ; [.2935.0020.0002] # MEETEI MAYEK LETTER DIL -ABD8 ; [.2936.0020.0002] # MEETEI MAYEK LETTER GHOU -ABD9 ; [.2937.0020.0002] # MEETEI MAYEK LETTER DHOU -ABDA ; [.2938.0020.0002] # MEETEI MAYEK LETTER BHAM -AAE0 ; [.2939.0020.0002] # MEETEI MAYEK LETTER E -AAE1 ; [.293A.0020.0002] # MEETEI MAYEK LETTER O -AAE2 ; [.293B.0020.0002] # MEETEI MAYEK LETTER CHA -AAE3 ; [.293C.0020.0002] # MEETEI MAYEK LETTER NYA -AAE4 ; [.293D.0020.0002] # MEETEI MAYEK LETTER TTA -AAE5 ; [.293E.0020.0002] # MEETEI MAYEK LETTER TTHA -AAE6 ; [.293F.0020.0002] # MEETEI MAYEK LETTER DDA -AAE7 ; [.2940.0020.0002] # MEETEI MAYEK LETTER DDHA -AAE8 ; [.2941.0020.0002] # MEETEI MAYEK LETTER NNA -AAE9 ; [.2942.0020.0002] # MEETEI MAYEK LETTER SHA -AAEA ; [.2943.0020.0002] # MEETEI MAYEK LETTER SSA -ABE3 ; [.2944.0020.0002] # MEETEI MAYEK VOWEL SIGN ONAP -ABE4 ; [.2945.0020.0002] # MEETEI MAYEK VOWEL SIGN INAP -ABE5 ; [.2946.0020.0002] # MEETEI MAYEK VOWEL SIGN ANAP -ABE6 ; [.2947.0020.0002] # MEETEI MAYEK VOWEL SIGN YENAP -ABE7 ; [.2948.0020.0002] # MEETEI MAYEK VOWEL SIGN SOUNAP -ABE8 ; [.2949.0020.0002] # MEETEI MAYEK VOWEL SIGN UNAP -ABE9 ; [.294A.0020.0002] # MEETEI MAYEK VOWEL SIGN CHEINAP -ABEA ; [.294B.0020.0002] # MEETEI MAYEK VOWEL SIGN NUNG -AAEB ; [.294C.0020.0002] # MEETEI MAYEK VOWEL SIGN II -AAEC ; [.294D.0020.0002] # MEETEI MAYEK VOWEL SIGN UU -AAED ; [.294E.0020.0002] # MEETEI MAYEK VOWEL SIGN AAI -AAEE ; [.294F.0020.0002] # MEETEI MAYEK VOWEL SIGN AU -AAEF ; [.2950.0020.0002] # MEETEI MAYEK VOWEL SIGN AAU -AAF5 ; [.2951.0020.0002] # MEETEI MAYEK VOWEL SIGN VISARGA -ABDB ; [.2952.0020.0002] # MEETEI MAYEK LETTER KOK LONSUM -ABDC ; [.2953.0020.0002] # MEETEI MAYEK LETTER LAI LONSUM -ABDD ; [.2954.0020.0002] # MEETEI MAYEK LETTER MIT LONSUM -ABDE ; [.2955.0020.0002] # MEETEI MAYEK LETTER PA LONSUM -ABDF ; [.2956.0020.0002] # MEETEI MAYEK LETTER NA LONSUM -ABE0 ; [.2957.0020.0002] # MEETEI MAYEK LETTER TIL LONSUM -ABE1 ; [.2958.0020.0002] # MEETEI MAYEK LETTER NGOU LONSUM -ABE2 ; [.2959.0020.0002] # MEETEI MAYEK LETTER I LONSUM -ABED ; [.295A.0020.0002] # MEETEI MAYEK APUN IYEK -AAF6 ; [.295B.0020.0002] # MEETEI MAYEK VIRAMA -A800 ; [.295C.0020.0002] # SYLOTI NAGRI LETTER A -A801 ; [.295D.0020.0002] # SYLOTI NAGRI LETTER I -A802 ; [.295E.0020.0002] # SYLOTI NAGRI SIGN DVISVARA -A803 ; [.295F.0020.0002] # SYLOTI NAGRI LETTER U -A804 ; [.2960.0020.0002] # SYLOTI NAGRI LETTER E -A805 ; [.2961.0020.0002] # SYLOTI NAGRI LETTER O -A806 ; [.2962.0020.0002] # SYLOTI NAGRI SIGN HASANTA -A807 ; [.2963.0020.0002] # SYLOTI NAGRI LETTER KO -A808 ; [.2964.0020.0002] # SYLOTI NAGRI LETTER KHO -A809 ; [.2965.0020.0002] # SYLOTI NAGRI LETTER GO -A80A ; [.2966.0020.0002] # SYLOTI NAGRI LETTER GHO -A80C ; [.2967.0020.0002] # SYLOTI NAGRI LETTER CO -A80D ; [.2968.0020.0002] # SYLOTI NAGRI LETTER CHO -A80E ; [.2969.0020.0002] # SYLOTI NAGRI LETTER JO -A80F ; [.296A.0020.0002] # SYLOTI NAGRI LETTER JHO -A810 ; [.296B.0020.0002] # SYLOTI NAGRI LETTER TTO -A811 ; [.296C.0020.0002] # SYLOTI NAGRI LETTER TTHO -A812 ; [.296D.0020.0002] # SYLOTI NAGRI LETTER DDO -A813 ; [.296E.0020.0002] # SYLOTI NAGRI LETTER DDHO -A814 ; [.296F.0020.0002] # SYLOTI NAGRI LETTER TO -A815 ; [.2970.0020.0002] # SYLOTI NAGRI LETTER THO -A816 ; [.2971.0020.0002] # SYLOTI NAGRI LETTER DO -A817 ; [.2972.0020.0002] # SYLOTI NAGRI LETTER DHO -A818 ; [.2973.0020.0002] # SYLOTI NAGRI LETTER NO -A819 ; [.2974.0020.0002] # SYLOTI NAGRI LETTER PO -A81A ; [.2975.0020.0002] # SYLOTI NAGRI LETTER PHO -A81B ; [.2976.0020.0002] # SYLOTI NAGRI LETTER BO -A81C ; [.2977.0020.0002] # SYLOTI NAGRI LETTER BHO -A81D ; [.2978.0020.0002] # SYLOTI NAGRI LETTER MO -A81E ; [.2979.0020.0002] # SYLOTI NAGRI LETTER RO -A81F ; [.297A.0020.0002] # SYLOTI NAGRI LETTER LO -A820 ; [.297B.0020.0002] # SYLOTI NAGRI LETTER RRO -A821 ; [.297C.0020.0002] # SYLOTI NAGRI LETTER SO -A822 ; [.297D.0020.0002] # SYLOTI NAGRI LETTER HO -A823 ; [.297E.0020.0002] # SYLOTI NAGRI VOWEL SIGN A -A824 ; [.297F.0020.0002] # SYLOTI NAGRI VOWEL SIGN I -A825 ; [.2980.0020.0002] # SYLOTI NAGRI VOWEL SIGN U -A826 ; [.2981.0020.0002] # SYLOTI NAGRI VOWEL SIGN E -A827 ; [.2982.0020.0002] # SYLOTI NAGRI VOWEL SIGN OO -A882 ; [.2983.0020.0002] # SAURASHTRA LETTER A -A883 ; [.2984.0020.0002] # SAURASHTRA LETTER AA -A884 ; [.2985.0020.0002] # SAURASHTRA LETTER I -A885 ; [.2986.0020.0002] # SAURASHTRA LETTER II -A886 ; [.2987.0020.0002] # SAURASHTRA LETTER U -A887 ; [.2988.0020.0002] # SAURASHTRA LETTER UU -A888 ; [.2989.0020.0002] # SAURASHTRA LETTER VOCALIC R -A889 ; [.298A.0020.0002] # SAURASHTRA LETTER VOCALIC RR -A88A ; [.298B.0020.0002] # SAURASHTRA LETTER VOCALIC L -A88B ; [.298C.0020.0002] # SAURASHTRA LETTER VOCALIC LL -A88C ; [.298D.0020.0002] # SAURASHTRA LETTER E -A88D ; [.298E.0020.0002] # SAURASHTRA LETTER EE -A88E ; [.298F.0020.0002] # SAURASHTRA LETTER AI -A88F ; [.2990.0020.0002] # SAURASHTRA LETTER O -A890 ; [.2991.0020.0002] # SAURASHTRA LETTER OO -A891 ; [.2992.0020.0002] # SAURASHTRA LETTER AU -A892 ; [.2993.0020.0002] # SAURASHTRA LETTER KA -A893 ; [.2994.0020.0002] # SAURASHTRA LETTER KHA -A894 ; [.2995.0020.0002] # SAURASHTRA LETTER GA -A895 ; [.2996.0020.0002] # SAURASHTRA LETTER GHA -A896 ; [.2997.0020.0002] # SAURASHTRA LETTER NGA -A897 ; [.2998.0020.0002] # SAURASHTRA LETTER CA -A898 ; [.2999.0020.0002] # SAURASHTRA LETTER CHA -A899 ; [.299A.0020.0002] # SAURASHTRA LETTER JA -A89A ; [.299B.0020.0002] # SAURASHTRA LETTER JHA -A89B ; [.299C.0020.0002] # SAURASHTRA LETTER NYA -A89C ; [.299D.0020.0002] # SAURASHTRA LETTER TTA -A89D ; [.299E.0020.0002] # SAURASHTRA LETTER TTHA -A89E ; [.299F.0020.0002] # SAURASHTRA LETTER DDA -A89F ; [.29A0.0020.0002] # SAURASHTRA LETTER DDHA -A8A0 ; [.29A1.0020.0002] # SAURASHTRA LETTER NNA -A8A1 ; [.29A2.0020.0002] # SAURASHTRA LETTER TA -A8A2 ; [.29A3.0020.0002] # SAURASHTRA LETTER THA -A8A3 ; [.29A4.0020.0002] # SAURASHTRA LETTER DA -A8A4 ; [.29A5.0020.0002] # SAURASHTRA LETTER DHA -A8A5 ; [.29A6.0020.0002] # SAURASHTRA LETTER NA -A8A6 ; [.29A7.0020.0002] # SAURASHTRA LETTER PA -A8A7 ; [.29A8.0020.0002] # SAURASHTRA LETTER PHA -A8A8 ; [.29A9.0020.0002] # SAURASHTRA LETTER BA -A8A9 ; [.29AA.0020.0002] # SAURASHTRA LETTER BHA -A8AA ; [.29AB.0020.0002] # SAURASHTRA LETTER MA -A8AB ; [.29AC.0020.0002] # SAURASHTRA LETTER YA -A8AC ; [.29AD.0020.0002] # SAURASHTRA LETTER RA -A8AD ; [.29AE.0020.0002] # SAURASHTRA LETTER LA -A8AE ; [.29AF.0020.0002] # SAURASHTRA LETTER VA -A8AF ; [.29B0.0020.0002] # SAURASHTRA LETTER SHA -A8B0 ; [.29B1.0020.0002] # SAURASHTRA LETTER SSA -A8B1 ; [.29B2.0020.0002] # SAURASHTRA LETTER SA -A8B2 ; [.29B3.0020.0002] # SAURASHTRA LETTER HA -A8B3 ; [.29B4.0020.0002] # SAURASHTRA LETTER LLA -A8B4 ; [.29B5.0020.0002] # SAURASHTRA CONSONANT SIGN HAARU -A8B5 ; [.29B6.0020.0002] # SAURASHTRA VOWEL SIGN AA -A8B6 ; [.29B7.0020.0002] # SAURASHTRA VOWEL SIGN I -A8B7 ; [.29B8.0020.0002] # SAURASHTRA VOWEL SIGN II -A8B8 ; [.29B9.0020.0002] # SAURASHTRA VOWEL SIGN U -A8B9 ; [.29BA.0020.0002] # SAURASHTRA VOWEL SIGN UU -A8BA ; [.29BB.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC R -A8BB ; [.29BC.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC RR -A8BC ; [.29BD.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC L -A8BD ; [.29BE.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC LL -A8BE ; [.29BF.0020.0002] # SAURASHTRA VOWEL SIGN E -A8BF ; [.29C0.0020.0002] # SAURASHTRA VOWEL SIGN EE -A8C0 ; [.29C1.0020.0002] # SAURASHTRA VOWEL SIGN AI -A8C1 ; [.29C2.0020.0002] # SAURASHTRA VOWEL SIGN O -A8C2 ; [.29C3.0020.0002] # SAURASHTRA VOWEL SIGN OO -A8C3 ; [.29C4.0020.0002] # SAURASHTRA VOWEL SIGN AU -A8C4 ; [.29C5.0020.0002] # SAURASHTRA SIGN VIRAMA -11083 ; [.29C6.0020.0002] # KAITHI LETTER A -11084 ; [.29C7.0020.0002] # KAITHI LETTER AA -11085 ; [.29C8.0020.0002] # KAITHI LETTER I -11086 ; [.29C9.0020.0002] # KAITHI LETTER II -11087 ; [.29CA.0020.0002] # KAITHI LETTER U -11088 ; [.29CB.0020.0002] # KAITHI LETTER UU -11089 ; [.29CC.0020.0002] # KAITHI LETTER E -1108A ; [.29CD.0020.0002] # KAITHI LETTER AI -1108B ; [.29CE.0020.0002] # KAITHI LETTER O -1108C ; [.29CF.0020.0002] # KAITHI LETTER AU -1108D ; [.29D0.0020.0002] # KAITHI LETTER KA -1108E ; [.29D1.0020.0002] # KAITHI LETTER KHA -1108F ; [.29D2.0020.0002] # KAITHI LETTER GA -11090 ; [.29D3.0020.0002] # KAITHI LETTER GHA -11091 ; [.29D4.0020.0002] # KAITHI LETTER NGA -11092 ; [.29D5.0020.0002] # KAITHI LETTER CA -11093 ; [.29D6.0020.0002] # KAITHI LETTER CHA -11094 ; [.29D7.0020.0002] # KAITHI LETTER JA -11095 ; [.29D8.0020.0002] # KAITHI LETTER JHA -11096 ; [.29D9.0020.0002] # KAITHI LETTER NYA -11097 ; [.29DA.0020.0002] # KAITHI LETTER TTA -11098 ; [.29DB.0020.0002] # KAITHI LETTER TTHA -11099 ; [.29DC.0020.0002] # KAITHI LETTER DDA -1109A ; [.29DC.0020.0002][.0000.00C2.0002] # KAITHI LETTER DDDHA -1109B ; [.29DD.0020.0002] # KAITHI LETTER DDHA -1109C ; [.29DD.0020.0002][.0000.00C2.0002] # KAITHI LETTER RHA -1109D ; [.29DE.0020.0002] # KAITHI LETTER NNA -1109E ; [.29DF.0020.0002] # KAITHI LETTER TA -1109F ; [.29E0.0020.0002] # KAITHI LETTER THA -110A0 ; [.29E1.0020.0002] # KAITHI LETTER DA -110A1 ; [.29E2.0020.0002] # KAITHI LETTER DHA -110A2 ; [.29E3.0020.0002] # KAITHI LETTER NA -110A3 ; [.29E4.0020.0002] # KAITHI LETTER PA -110A4 ; [.29E5.0020.0002] # KAITHI LETTER PHA -110A5 ; [.29E6.0020.0002] # KAITHI LETTER BA -110AB ; [.29E6.0020.0002][.0000.00C2.0002] # KAITHI LETTER VA -110A6 ; [.29E7.0020.0002] # KAITHI LETTER BHA -110A7 ; [.29E8.0020.0002] # KAITHI LETTER MA -110A8 ; [.29E9.0020.0002] # KAITHI LETTER YA -110A9 ; [.29EA.0020.0002] # KAITHI LETTER RA -110AA ; [.29EB.0020.0002] # KAITHI LETTER LA -110AC ; [.29EC.0020.0002] # KAITHI LETTER SHA -110AD ; [.29ED.0020.0002] # KAITHI LETTER SSA -110AE ; [.29EE.0020.0002] # KAITHI LETTER SA -110AF ; [.29EF.0020.0002] # KAITHI LETTER HA -110B0 ; [.29F0.0020.0002] # KAITHI VOWEL SIGN AA -110B1 ; [.29F1.0020.0002] # KAITHI VOWEL SIGN I -110B2 ; [.29F2.0020.0002] # KAITHI VOWEL SIGN II -110B3 ; [.29F3.0020.0002] # KAITHI VOWEL SIGN U -110B4 ; [.29F4.0020.0002] # KAITHI VOWEL SIGN UU -110B5 ; [.29F5.0020.0002] # KAITHI VOWEL SIGN E -110B6 ; [.29F6.0020.0002] # KAITHI VOWEL SIGN AI -110B7 ; [.29F7.0020.0002] # KAITHI VOWEL SIGN O -110B8 ; [.29F8.0020.0002] # KAITHI VOWEL SIGN AU -110B9 ; [.29F9.0020.0002] # KAITHI SIGN VIRAMA -11150 ; [.29FA.0020.0002] # MAHAJANI LETTER A -11151 ; [.29FB.0020.0002] # MAHAJANI LETTER I -11152 ; [.29FC.0020.0002] # MAHAJANI LETTER U -11153 ; [.29FD.0020.0002] # MAHAJANI LETTER E -11154 ; [.29FE.0020.0002] # MAHAJANI LETTER O -11155 ; [.29FF.0020.0002] # MAHAJANI LETTER KA -11156 ; [.2A00.0020.0002] # MAHAJANI LETTER KHA -11157 ; [.2A01.0020.0002] # MAHAJANI LETTER GA -11158 ; [.2A02.0020.0002] # MAHAJANI LETTER GHA -11159 ; [.2A03.0020.0002] # MAHAJANI LETTER CA -1115A ; [.2A04.0020.0002] # MAHAJANI LETTER CHA -1115B ; [.2A05.0020.0002] # MAHAJANI LETTER JA -1115C ; [.2A06.0020.0002] # MAHAJANI LETTER JHA -1115D ; [.2A07.0020.0002] # MAHAJANI LETTER NYA -1115E ; [.2A08.0020.0002] # MAHAJANI LETTER TTA -1115F ; [.2A09.0020.0002] # MAHAJANI LETTER TTHA -11160 ; [.2A0A.0020.0002] # MAHAJANI LETTER DDA -11161 ; [.2A0B.0020.0002] # MAHAJANI LETTER DDHA -11162 ; [.2A0C.0020.0002] # MAHAJANI LETTER NNA -11163 ; [.2A0D.0020.0002] # MAHAJANI LETTER TA -11164 ; [.2A0E.0020.0002] # MAHAJANI LETTER THA -11165 ; [.2A0F.0020.0002] # MAHAJANI LETTER DA -11166 ; [.2A10.0020.0002] # MAHAJANI LETTER DHA -11167 ; [.2A11.0020.0002] # MAHAJANI LETTER NA -11168 ; [.2A12.0020.0002] # MAHAJANI LETTER PA -11169 ; [.2A13.0020.0002] # MAHAJANI LETTER PHA -1116A ; [.2A14.0020.0002] # MAHAJANI LETTER BA -1116B ; [.2A15.0020.0002] # MAHAJANI LETTER BHA -1116C ; [.2A16.0020.0002] # MAHAJANI LETTER MA -1116D ; [.2A17.0020.0002] # MAHAJANI LETTER RA -1116E ; [.2A18.0020.0002] # MAHAJANI LETTER LA -1116F ; [.2A19.0020.0002] # MAHAJANI LETTER VA -11176 ; [.2A1A.0020.0002] # MAHAJANI LIGATURE SHRI -11170 ; [.2A1B.0020.0002] # MAHAJANI LETTER SA -11171 ; [.2A1C.0020.0002] # MAHAJANI LETTER HA -11172 ; [.2A1D.0020.0002] # MAHAJANI LETTER RRA -111C4 ; [.2A1E.0020.0002] # SHARADA OM -111DA ; [.2A1F.0020.0002] # SHARADA EKAM -11183 ; [.2A20.0020.0002] # SHARADA LETTER A -11184 ; [.2A21.0020.0002] # SHARADA LETTER AA -11185 ; [.2A22.0020.0002] # SHARADA LETTER I -11186 ; [.2A23.0020.0002] # SHARADA LETTER II -11187 ; [.2A24.0020.0002] # SHARADA LETTER U -11188 ; [.2A25.0020.0002] # SHARADA LETTER UU -11189 ; [.2A26.0020.0002] # SHARADA LETTER VOCALIC R -1118A ; [.2A27.0020.0002] # SHARADA LETTER VOCALIC RR -1118B ; [.2A28.0020.0002] # SHARADA LETTER VOCALIC L -1118C ; [.2A29.0020.0002] # SHARADA LETTER VOCALIC LL -1118D ; [.2A2A.0020.0002] # SHARADA LETTER E -1118E ; [.2A2B.0020.0002] # SHARADA LETTER AI -1118F ; [.2A2C.0020.0002] # SHARADA LETTER O -11190 ; [.2A2D.0020.0002] # SHARADA LETTER AU -11191 ; [.2A2E.0020.0002] # SHARADA LETTER KA -11192 ; [.2A2F.0020.0002] # SHARADA LETTER KHA -11193 ; [.2A30.0020.0002] # SHARADA LETTER GA -11194 ; [.2A31.0020.0002] # SHARADA LETTER GHA -11195 ; [.2A32.0020.0002] # SHARADA LETTER NGA -11196 ; [.2A33.0020.0002] # SHARADA LETTER CA -11197 ; [.2A34.0020.0002] # SHARADA LETTER CHA -11198 ; [.2A35.0020.0002] # SHARADA LETTER JA -11199 ; [.2A36.0020.0002] # SHARADA LETTER JHA -1119A ; [.2A37.0020.0002] # SHARADA LETTER NYA -1119B ; [.2A38.0020.0002] # SHARADA LETTER TTA -1119C ; [.2A39.0020.0002] # SHARADA LETTER TTHA -1119D ; [.2A3A.0020.0002] # SHARADA LETTER DDA -1119E ; [.2A3B.0020.0002] # SHARADA LETTER DDHA -1119F ; [.2A3C.0020.0002] # SHARADA LETTER NNA -111A0 ; [.2A3D.0020.0002] # SHARADA LETTER TA -111A1 ; [.2A3E.0020.0002] # SHARADA LETTER THA -111A2 ; [.2A3F.0020.0002] # SHARADA LETTER DA -111A3 ; [.2A40.0020.0002] # SHARADA LETTER DHA -111A4 ; [.2A41.0020.0002] # SHARADA LETTER NA -111A5 ; [.2A42.0020.0002] # SHARADA LETTER PA -111A6 ; [.2A43.0020.0002] # SHARADA LETTER PHA -111A7 ; [.2A44.0020.0002] # SHARADA LETTER BA -111A8 ; [.2A45.0020.0002] # SHARADA LETTER BHA -111A9 ; [.2A46.0020.0002] # SHARADA LETTER MA -111AA ; [.2A47.0020.0002] # SHARADA LETTER YA -111AB ; [.2A48.0020.0002] # SHARADA LETTER RA -111AC ; [.2A49.0020.0002] # SHARADA LETTER LA -111AD ; [.2A4A.0020.0002] # SHARADA LETTER LLA -111AE ; [.2A4B.0020.0002] # SHARADA LETTER VA -111AF ; [.2A4C.0020.0002] # SHARADA LETTER SHA -111B0 ; [.2A4D.0020.0002] # SHARADA LETTER SSA -111B1 ; [.2A4E.0020.0002] # SHARADA LETTER SA -111B2 ; [.2A4F.0020.0002] # SHARADA LETTER HA -111C1 ; [.2A50.0020.0002] # SHARADA SIGN AVAGRAHA -111C2 ; [.2A51.0020.0002] # SHARADA SIGN JIHVAMULIYA -111C3 ; [.2A52.0020.0002] # SHARADA SIGN UPADHMANIYA -111DC ; [.2A53.0020.0002] # SHARADA HEADSTROKE -111B3 ; [.2A54.0020.0002] # SHARADA VOWEL SIGN AA -111B4 ; [.2A55.0020.0002] # SHARADA VOWEL SIGN I -111B5 ; [.2A56.0020.0002] # SHARADA VOWEL SIGN II -111B6 ; [.2A57.0020.0002] # SHARADA VOWEL SIGN U -111B7 ; [.2A58.0020.0002] # SHARADA VOWEL SIGN UU -111B8 ; [.2A59.0020.0002] # SHARADA VOWEL SIGN VOCALIC R -111B9 ; [.2A5A.0020.0002] # SHARADA VOWEL SIGN VOCALIC RR -111BA ; [.2A5B.0020.0002] # SHARADA VOWEL SIGN VOCALIC L -111BB ; [.2A5C.0020.0002] # SHARADA VOWEL SIGN VOCALIC LL -111BC ; [.2A5D.0020.0002] # SHARADA VOWEL SIGN E -111BD ; [.2A5E.0020.0002] # SHARADA VOWEL SIGN AI -111BE ; [.2A5F.0020.0002] # SHARADA VOWEL SIGN O -111BF ; [.2A60.0020.0002] # SHARADA VOWEL SIGN AU -111C0 ; [.2A61.0020.0002] # SHARADA SIGN VIRAMA -11200 ; [.2A62.0020.0002] # KHOJKI LETTER A -11201 ; [.2A63.0020.0002] # KHOJKI LETTER AA -11202 ; [.2A64.0020.0002] # KHOJKI LETTER I -11203 ; [.2A65.0020.0002] # KHOJKI LETTER U -11204 ; [.2A66.0020.0002] # KHOJKI LETTER E -11205 ; [.2A67.0020.0002] # KHOJKI LETTER AI -11206 ; [.2A68.0020.0002] # KHOJKI LETTER O -11207 ; [.2A69.0020.0002] # KHOJKI LETTER AU -11208 ; [.2A6A.0020.0002] # KHOJKI LETTER KA -11209 ; [.2A6B.0020.0002] # KHOJKI LETTER KHA -1120A ; [.2A6C.0020.0002] # KHOJKI LETTER GA -1120B ; [.2A6D.0020.0002] # KHOJKI LETTER GGA -1120C ; [.2A6E.0020.0002] # KHOJKI LETTER GHA -1120D ; [.2A6F.0020.0002] # KHOJKI LETTER NGA -1120E ; [.2A70.0020.0002] # KHOJKI LETTER CA -1120F ; [.2A71.0020.0002] # KHOJKI LETTER CHA -11210 ; [.2A72.0020.0002] # KHOJKI LETTER JA -11211 ; [.2A73.0020.0002] # KHOJKI LETTER JJA -11213 ; [.2A74.0020.0002] # KHOJKI LETTER NYA -11214 ; [.2A75.0020.0002] # KHOJKI LETTER TTA -11215 ; [.2A76.0020.0002] # KHOJKI LETTER TTHA -11216 ; [.2A77.0020.0002] # KHOJKI LETTER DDA -11217 ; [.2A78.0020.0002] # KHOJKI LETTER DDHA -11218 ; [.2A79.0020.0002] # KHOJKI LETTER NNA -11219 ; [.2A7A.0020.0002] # KHOJKI LETTER TA -1121A ; [.2A7B.0020.0002] # KHOJKI LETTER THA -1121B ; [.2A7C.0020.0002] # KHOJKI LETTER DA -1121C ; [.2A7D.0020.0002] # KHOJKI LETTER DDDA -1121D ; [.2A7E.0020.0002] # KHOJKI LETTER DHA -1121E ; [.2A7F.0020.0002] # KHOJKI LETTER NA -1121F ; [.2A80.0020.0002] # KHOJKI LETTER PA -11220 ; [.2A81.0020.0002] # KHOJKI LETTER PHA -11221 ; [.2A82.0020.0002] # KHOJKI LETTER BA -11222 ; [.2A83.0020.0002] # KHOJKI LETTER BBA -11223 ; [.2A84.0020.0002] # KHOJKI LETTER BHA -11224 ; [.2A85.0020.0002] # KHOJKI LETTER MA -11225 ; [.2A86.0020.0002] # KHOJKI LETTER YA -11226 ; [.2A87.0020.0002] # KHOJKI LETTER RA -11227 ; [.2A88.0020.0002] # KHOJKI LETTER LA -11228 ; [.2A89.0020.0002] # KHOJKI LETTER VA -11229 ; [.2A8A.0020.0002] # KHOJKI LETTER SA -1122A ; [.2A8B.0020.0002] # KHOJKI LETTER HA -1122B ; [.2A8C.0020.0002] # KHOJKI LETTER LLA -1122C ; [.2A8D.0020.0002] # KHOJKI VOWEL SIGN AA -1122D ; [.2A8E.0020.0002] # KHOJKI VOWEL SIGN I -1122E ; [.2A8F.0020.0002] # KHOJKI VOWEL SIGN II -1122F ; [.2A90.0020.0002] # KHOJKI VOWEL SIGN U -11230 ; [.2A91.0020.0002] # KHOJKI VOWEL SIGN E -11231 ; [.2A92.0020.0002] # KHOJKI VOWEL SIGN AI -11232 ; [.2A93.0020.0002] # KHOJKI VOWEL SIGN O -11233 ; [.2A94.0020.0002] # KHOJKI VOWEL SIGN AU -11235 ; [.2A95.0020.0002] # KHOJKI SIGN VIRAMA -112B0 ; [.2A96.0020.0002] # KHUDAWADI LETTER A -112B1 ; [.2A97.0020.0002] # KHUDAWADI LETTER AA -112B2 ; [.2A98.0020.0002] # KHUDAWADI LETTER I -112B3 ; [.2A99.0020.0002] # KHUDAWADI LETTER II -112B4 ; [.2A9A.0020.0002] # KHUDAWADI LETTER U -112B5 ; [.2A9B.0020.0002] # KHUDAWADI LETTER UU -112B6 ; [.2A9C.0020.0002] # KHUDAWADI LETTER E -112B7 ; [.2A9D.0020.0002] # KHUDAWADI LETTER AI -112B8 ; [.2A9E.0020.0002] # KHUDAWADI LETTER O -112B9 ; [.2A9F.0020.0002] # KHUDAWADI LETTER AU -112BA ; [.2AA0.0020.0002] # KHUDAWADI LETTER KA -112BB ; [.2AA1.0020.0002] # KHUDAWADI LETTER KHA -112BC ; [.2AA2.0020.0002] # KHUDAWADI LETTER GA -112BD ; [.2AA3.0020.0002] # KHUDAWADI LETTER GGA -112BE ; [.2AA4.0020.0002] # KHUDAWADI LETTER GHA -112BF ; [.2AA5.0020.0002] # KHUDAWADI LETTER NGA -112C0 ; [.2AA6.0020.0002] # KHUDAWADI LETTER CA -112C1 ; [.2AA7.0020.0002] # KHUDAWADI LETTER CHA -112C2 ; [.2AA8.0020.0002] # KHUDAWADI LETTER JA -112C3 ; [.2AA9.0020.0002] # KHUDAWADI LETTER JJA -112C4 ; [.2AAA.0020.0002] # KHUDAWADI LETTER JHA -112C5 ; [.2AAB.0020.0002] # KHUDAWADI LETTER NYA -112C6 ; [.2AAC.0020.0002] # KHUDAWADI LETTER TTA -112C7 ; [.2AAD.0020.0002] # KHUDAWADI LETTER TTHA -112C8 ; [.2AAE.0020.0002] # KHUDAWADI LETTER DDA -112C9 ; [.2AAF.0020.0002] # KHUDAWADI LETTER DDDA -112CA ; [.2AB0.0020.0002] # KHUDAWADI LETTER RRA -112CB ; [.2AB1.0020.0002] # KHUDAWADI LETTER DDHA -112CC ; [.2AB2.0020.0002] # KHUDAWADI LETTER NNA -112CD ; [.2AB3.0020.0002] # KHUDAWADI LETTER TA -112CE ; [.2AB4.0020.0002] # KHUDAWADI LETTER THA -112CF ; [.2AB5.0020.0002] # KHUDAWADI LETTER DA -112D0 ; [.2AB6.0020.0002] # KHUDAWADI LETTER DHA -112D1 ; [.2AB7.0020.0002] # KHUDAWADI LETTER NA -112D2 ; [.2AB8.0020.0002] # KHUDAWADI LETTER PA -112D3 ; [.2AB9.0020.0002] # KHUDAWADI LETTER PHA -112D4 ; [.2ABA.0020.0002] # KHUDAWADI LETTER BA -112D5 ; [.2ABB.0020.0002] # KHUDAWADI LETTER BBA -112D6 ; [.2ABC.0020.0002] # KHUDAWADI LETTER BHA -112D7 ; [.2ABD.0020.0002] # KHUDAWADI LETTER MA -112D8 ; [.2ABE.0020.0002] # KHUDAWADI LETTER YA -112D9 ; [.2ABF.0020.0002] # KHUDAWADI LETTER RA -112DA ; [.2AC0.0020.0002] # KHUDAWADI LETTER LA -112DB ; [.2AC1.0020.0002] # KHUDAWADI LETTER VA -112DC ; [.2AC2.0020.0002] # KHUDAWADI LETTER SHA -112DD ; [.2AC3.0020.0002] # KHUDAWADI LETTER SA -112DE ; [.2AC4.0020.0002] # KHUDAWADI LETTER HA -112E0 ; [.2AC5.0020.0002] # KHUDAWADI VOWEL SIGN AA -112E1 ; [.2AC6.0020.0002] # KHUDAWADI VOWEL SIGN I -112E2 ; [.2AC7.0020.0002] # KHUDAWADI VOWEL SIGN II -112E3 ; [.2AC8.0020.0002] # KHUDAWADI VOWEL SIGN U -112E4 ; [.2AC9.0020.0002] # KHUDAWADI VOWEL SIGN UU -112E5 ; [.2ACA.0020.0002] # KHUDAWADI VOWEL SIGN E -112E6 ; [.2ACB.0020.0002] # KHUDAWADI VOWEL SIGN AI -112E7 ; [.2ACC.0020.0002] # KHUDAWADI VOWEL SIGN O -112E8 ; [.2ACD.0020.0002] # KHUDAWADI VOWEL SIGN AU -112EA ; [.2ACE.0020.0002] # KHUDAWADI SIGN VIRAMA -11280 ; [.2ACF.0020.0002] # MULTANI LETTER A -11281 ; [.2AD0.0020.0002] # MULTANI LETTER I -11282 ; [.2AD1.0020.0002] # MULTANI LETTER U -11283 ; [.2AD2.0020.0002] # MULTANI LETTER E -112A5 ; [.2AD3.0020.0002] # MULTANI LETTER SA -112A6 ; [.2AD4.0020.0002] # MULTANI LETTER HA -11284 ; [.2AD5.0020.0002] # MULTANI LETTER KA -11285 ; [.2AD6.0020.0002] # MULTANI LETTER KHA -11286 ; [.2AD7.0020.0002] # MULTANI LETTER GA -11288 ; [.2AD8.0020.0002] # MULTANI LETTER GHA -1128A ; [.2AD9.0020.0002] # MULTANI LETTER CA -1128B ; [.2ADA.0020.0002] # MULTANI LETTER CHA -1128C ; [.2ADB.0020.0002] # MULTANI LETTER JA -1128D ; [.2ADC.0020.0002] # MULTANI LETTER JJA -1128F ; [.2ADD.0020.0002] # MULTANI LETTER NYA -11290 ; [.2ADE.0020.0002] # MULTANI LETTER TTA -11291 ; [.2ADF.0020.0002] # MULTANI LETTER TTHA -11292 ; [.2AE0.0020.0002] # MULTANI LETTER DDA -11293 ; [.2AE1.0020.0002] # MULTANI LETTER DDDA -11294 ; [.2AE2.0020.0002] # MULTANI LETTER DDHA -11295 ; [.2AE3.0020.0002] # MULTANI LETTER NNA -11296 ; [.2AE4.0020.0002] # MULTANI LETTER TA -11297 ; [.2AE5.0020.0002] # MULTANI LETTER THA -11298 ; [.2AE6.0020.0002] # MULTANI LETTER DA -11299 ; [.2AE7.0020.0002] # MULTANI LETTER DHA -1129A ; [.2AE8.0020.0002] # MULTANI LETTER NA -1129B ; [.2AE9.0020.0002] # MULTANI LETTER PA -1129C ; [.2AEA.0020.0002] # MULTANI LETTER PHA -1129D ; [.2AEB.0020.0002] # MULTANI LETTER BA -1129F ; [.2AEC.0020.0002] # MULTANI LETTER BHA -112A0 ; [.2AED.0020.0002] # MULTANI LETTER MA -112A1 ; [.2AEE.0020.0002] # MULTANI LETTER YA -112A2 ; [.2AEF.0020.0002] # MULTANI LETTER RA -112A3 ; [.2AF0.0020.0002] # MULTANI LETTER LA -112A4 ; [.2AF1.0020.0002] # MULTANI LETTER VA -112A7 ; [.2AF2.0020.0002] # MULTANI LETTER RRA -112A8 ; [.2AF3.0020.0002] # MULTANI LETTER RHA -11350 ; [.2AF4.0020.0002] # GRANTHA OM -11305 ; [.2AF5.0020.0002] # GRANTHA LETTER A -11306 ; [.2AF6.0020.0002] # GRANTHA LETTER AA -11307 ; [.2AF7.0020.0002] # GRANTHA LETTER I -11308 ; [.2AF8.0020.0002] # GRANTHA LETTER II -11309 ; [.2AF9.0020.0002] # GRANTHA LETTER U -1130A ; [.2AFA.0020.0002] # GRANTHA LETTER UU -1130B ; [.2AFB.0020.0002] # GRANTHA LETTER VOCALIC R -11360 ; [.2AFC.0020.0002] # GRANTHA LETTER VOCALIC RR -1130C ; [.2AFD.0020.0002] # GRANTHA LETTER VOCALIC L -11361 ; [.2AFE.0020.0002] # GRANTHA LETTER VOCALIC LL -1130F ; [.2AFF.0020.0002] # GRANTHA LETTER EE -11310 ; [.2B00.0020.0002] # GRANTHA LETTER AI -11313 ; [.2B01.0020.0002] # GRANTHA LETTER OO -11314 ; [.2B02.0020.0002] # GRANTHA LETTER AU -11315 ; [.2B03.0020.0002] # GRANTHA LETTER KA -11316 ; [.2B04.0020.0002] # GRANTHA LETTER KHA -11317 ; [.2B05.0020.0002] # GRANTHA LETTER GA -11318 ; [.2B06.0020.0002] # GRANTHA LETTER GHA -11319 ; [.2B07.0020.0002] # GRANTHA LETTER NGA -1131A ; [.2B08.0020.0002] # GRANTHA LETTER CA -1131B ; [.2B09.0020.0002] # GRANTHA LETTER CHA -1131C ; [.2B0A.0020.0002] # GRANTHA LETTER JA -1131D ; [.2B0B.0020.0002] # GRANTHA LETTER JHA -1131E ; [.2B0C.0020.0002] # GRANTHA LETTER NYA -1131F ; [.2B0D.0020.0002] # GRANTHA LETTER TTA -11320 ; [.2B0E.0020.0002] # GRANTHA LETTER TTHA -11321 ; [.2B0F.0020.0002] # GRANTHA LETTER DDA -11322 ; [.2B10.0020.0002] # GRANTHA LETTER DDHA -11323 ; [.2B11.0020.0002] # GRANTHA LETTER NNA -11324 ; [.2B12.0020.0002] # GRANTHA LETTER TA -11325 ; [.2B13.0020.0002] # GRANTHA LETTER THA -11326 ; [.2B14.0020.0002] # GRANTHA LETTER DA -11327 ; [.2B15.0020.0002] # GRANTHA LETTER DHA -11328 ; [.2B16.0020.0002] # GRANTHA LETTER NA -1132A ; [.2B17.0020.0002] # GRANTHA LETTER PA -1132B ; [.2B18.0020.0002] # GRANTHA LETTER PHA -1132C ; [.2B19.0020.0002] # GRANTHA LETTER BA -1132D ; [.2B1A.0020.0002] # GRANTHA LETTER BHA -1132E ; [.2B1B.0020.0002] # GRANTHA LETTER MA -1132F ; [.2B1C.0020.0002] # GRANTHA LETTER YA -11330 ; [.2B1D.0020.0002] # GRANTHA LETTER RA -11332 ; [.2B1E.0020.0002] # GRANTHA LETTER LA -11333 ; [.2B1F.0020.0002] # GRANTHA LETTER LLA -11335 ; [.2B20.0020.0002] # GRANTHA LETTER VA -11336 ; [.2B21.0020.0002] # GRANTHA LETTER SHA -11337 ; [.2B22.0020.0002] # GRANTHA LETTER SSA -11338 ; [.2B23.0020.0002] # GRANTHA LETTER SA -11339 ; [.2B24.0020.0002] # GRANTHA LETTER HA -1133D ; [.2B25.0020.0002] # GRANTHA SIGN AVAGRAHA -1135E ; [.2B26.0020.0002] # GRANTHA LETTER VEDIC ANUSVARA -1135F ; [.2B27.0020.0002] # GRANTHA LETTER VEDIC DOUBLE ANUSVARA -1133E ; [.2B28.0020.0002] # GRANTHA VOWEL SIGN AA -1133F ; [.2B29.0020.0002] # GRANTHA VOWEL SIGN I -11340 ; [.2B2A.0020.0002] # GRANTHA VOWEL SIGN II -11341 ; [.2B2B.0020.0002] # GRANTHA VOWEL SIGN U -11342 ; [.2B2C.0020.0002] # GRANTHA VOWEL SIGN UU -11343 ; [.2B2D.0020.0002] # GRANTHA VOWEL SIGN VOCALIC R -11344 ; [.2B2E.0020.0002] # GRANTHA VOWEL SIGN VOCALIC RR -11362 ; [.2B2F.0020.0002] # GRANTHA VOWEL SIGN VOCALIC L -11363 ; [.2B30.0020.0002] # GRANTHA VOWEL SIGN VOCALIC LL -11347 ; [.2B31.0020.0002] # GRANTHA VOWEL SIGN EE -11348 ; [.2B32.0020.0002] # GRANTHA VOWEL SIGN AI -1134B ; [.2B33.0020.0002] # GRANTHA VOWEL SIGN OO -11347 1133E ; [.2B33.0020.0002] # GRANTHA VOWEL SIGN OO -1134C ; [.2B34.0020.0002] # GRANTHA VOWEL SIGN AU -11347 11357 ; [.2B34.0020.0002] # GRANTHA VOWEL SIGN AU -1134D ; [.2B35.0020.0002] # GRANTHA SIGN VIRAMA -11357 ; [.2B36.0020.0002] # GRANTHA AU LENGTH MARK -1135D ; [.2B37.0020.0002] # GRANTHA SIGN PLUTA -11449 ; [.2B38.0020.0002] # NEWA OM -1144A ; [.2B39.0020.0002] # NEWA SIDDHI -11400 ; [.2B3A.0020.0002] # NEWA LETTER A -11401 ; [.2B3B.0020.0002] # NEWA LETTER AA -11402 ; [.2B3C.0020.0002] # NEWA LETTER I -11403 ; [.2B3D.0020.0002] # NEWA LETTER II -11404 ; [.2B3E.0020.0002] # NEWA LETTER U -11405 ; [.2B3F.0020.0002] # NEWA LETTER UU -11406 ; [.2B40.0020.0002] # NEWA LETTER VOCALIC R -11407 ; [.2B41.0020.0002] # NEWA LETTER VOCALIC RR -11408 ; [.2B42.0020.0002] # NEWA LETTER VOCALIC L -11409 ; [.2B43.0020.0002] # NEWA LETTER VOCALIC LL -1140A ; [.2B44.0020.0002] # NEWA LETTER E -1140B ; [.2B45.0020.0002] # NEWA LETTER AI -1140C ; [.2B46.0020.0002] # NEWA LETTER O -1140D ; [.2B47.0020.0002] # NEWA LETTER AU -1140E ; [.2B48.0020.0002] # NEWA LETTER KA -1140F ; [.2B49.0020.0002] # NEWA LETTER KHA -11410 ; [.2B4A.0020.0002] # NEWA LETTER GA -11411 ; [.2B4B.0020.0002] # NEWA LETTER GHA -11412 ; [.2B4C.0020.0002] # NEWA LETTER NGA -11413 ; [.2B4D.0020.0002] # NEWA LETTER NGHA -11414 ; [.2B4E.0020.0002] # NEWA LETTER CA -11415 ; [.2B4F.0020.0002] # NEWA LETTER CHA -11416 ; [.2B50.0020.0002] # NEWA LETTER JA -11417 ; [.2B51.0020.0002] # NEWA LETTER JHA -11418 ; [.2B52.0020.0002] # NEWA LETTER NYA -11419 ; [.2B53.0020.0002] # NEWA LETTER NYHA -1141A ; [.2B54.0020.0002] # NEWA LETTER TTA -1141B ; [.2B55.0020.0002] # NEWA LETTER TTHA -1141C ; [.2B56.0020.0002] # NEWA LETTER DDA -1141D ; [.2B57.0020.0002] # NEWA LETTER DDHA -1141E ; [.2B58.0020.0002] # NEWA LETTER NNA -1141F ; [.2B59.0020.0002] # NEWA LETTER TA -11420 ; [.2B5A.0020.0002] # NEWA LETTER THA -11421 ; [.2B5B.0020.0002] # NEWA LETTER DA -11422 ; [.2B5C.0020.0002] # NEWA LETTER DHA -11423 ; [.2B5D.0020.0002] # NEWA LETTER NA -11424 ; [.2B5E.0020.0002] # NEWA LETTER NHA -11425 ; [.2B5F.0020.0002] # NEWA LETTER PA -11426 ; [.2B60.0020.0002] # NEWA LETTER PHA -11427 ; [.2B61.0020.0002] # NEWA LETTER BA -11428 ; [.2B62.0020.0002] # NEWA LETTER BHA -11429 ; [.2B63.0020.0002] # NEWA LETTER MA -1142A ; [.2B64.0020.0002] # NEWA LETTER MHA -1142B ; [.2B65.0020.0002] # NEWA LETTER YA -1142C ; [.2B66.0020.0002] # NEWA LETTER RA -1142D ; [.2B67.0020.0002] # NEWA LETTER RHA -1142E ; [.2B68.0020.0002] # NEWA LETTER LA -1142F ; [.2B69.0020.0002] # NEWA LETTER LHA -11430 ; [.2B6A.0020.0002] # NEWA LETTER WA -11431 ; [.2B6B.0020.0002] # NEWA LETTER SHA -11432 ; [.2B6C.0020.0002] # NEWA LETTER SSA -11433 ; [.2B6D.0020.0002] # NEWA LETTER SA -11434 ; [.2B6E.0020.0002] # NEWA LETTER HA -11447 ; [.2B6F.0020.0002] # NEWA SIGN AVAGRAHA -11448 ; [.2B70.0020.0002] # NEWA SIGN FINAL ANUSVARA -11435 ; [.2B71.0020.0002] # NEWA VOWEL SIGN AA -11436 ; [.2B72.0020.0002] # NEWA VOWEL SIGN I -11437 ; [.2B73.0020.0002] # NEWA VOWEL SIGN II -11438 ; [.2B74.0020.0002] # NEWA VOWEL SIGN U -11439 ; [.2B75.0020.0002] # NEWA VOWEL SIGN UU -1143A ; [.2B76.0020.0002] # NEWA VOWEL SIGN VOCALIC R -1143B ; [.2B77.0020.0002] # NEWA VOWEL SIGN VOCALIC RR -1143C ; [.2B78.0020.0002] # NEWA VOWEL SIGN VOCALIC L -1143D ; [.2B79.0020.0002] # NEWA VOWEL SIGN VOCALIC LL -1143E ; [.2B7A.0020.0002] # NEWA VOWEL SIGN E -1143F ; [.2B7B.0020.0002] # NEWA VOWEL SIGN AI -11440 ; [.2B7C.0020.0002] # NEWA VOWEL SIGN O -11441 ; [.2B7D.0020.0002] # NEWA VOWEL SIGN AU -11442 ; [.2B7E.0020.0002] # NEWA SIGN VIRAMA -114C7 ; [.2B7F.0020.0002] # TIRHUTA OM -11480 ; [.2B80.0020.0002] # TIRHUTA ANJI -11481 ; [.2B81.0020.0002] # TIRHUTA LETTER A -11482 ; [.2B82.0020.0002] # TIRHUTA LETTER AA -11483 ; [.2B83.0020.0002] # TIRHUTA LETTER I -11484 ; [.2B84.0020.0002] # TIRHUTA LETTER II -11485 ; [.2B85.0020.0002] # TIRHUTA LETTER U -11486 ; [.2B86.0020.0002] # TIRHUTA LETTER UU -11487 ; [.2B87.0020.0002] # TIRHUTA LETTER VOCALIC R -11488 ; [.2B88.0020.0002] # TIRHUTA LETTER VOCALIC RR -11489 ; [.2B89.0020.0002] # TIRHUTA LETTER VOCALIC L -1148A ; [.2B8A.0020.0002] # TIRHUTA LETTER VOCALIC LL -1148B ; [.2B8B.0020.0002] # TIRHUTA LETTER E -1148C ; [.2B8C.0020.0002] # TIRHUTA LETTER AI -1148D ; [.2B8D.0020.0002] # TIRHUTA LETTER O -1148E ; [.2B8E.0020.0002] # TIRHUTA LETTER AU -1148F ; [.2B8F.0020.0002] # TIRHUTA LETTER KA -11490 ; [.2B90.0020.0002] # TIRHUTA LETTER KHA -11491 ; [.2B91.0020.0002] # TIRHUTA LETTER GA -11492 ; [.2B92.0020.0002] # TIRHUTA LETTER GHA -11493 ; [.2B93.0020.0002] # TIRHUTA LETTER NGA -11494 ; [.2B94.0020.0002] # TIRHUTA LETTER CA -11495 ; [.2B95.0020.0002] # TIRHUTA LETTER CHA -11496 ; [.2B96.0020.0002] # TIRHUTA LETTER JA -11497 ; [.2B97.0020.0002] # TIRHUTA LETTER JHA -11498 ; [.2B98.0020.0002] # TIRHUTA LETTER NYA -11499 ; [.2B99.0020.0002] # TIRHUTA LETTER TTA -1149A ; [.2B9A.0020.0002] # TIRHUTA LETTER TTHA -1149B ; [.2B9B.0020.0002] # TIRHUTA LETTER DDA -1149C ; [.2B9C.0020.0002] # TIRHUTA LETTER DDHA -1149D ; [.2B9D.0020.0002] # TIRHUTA LETTER NNA -1149E ; [.2B9E.0020.0002] # TIRHUTA LETTER TA -1149F ; [.2B9F.0020.0002] # TIRHUTA LETTER THA -114A0 ; [.2BA0.0020.0002] # TIRHUTA LETTER DA -114A1 ; [.2BA1.0020.0002] # TIRHUTA LETTER DHA -114A2 ; [.2BA2.0020.0002] # TIRHUTA LETTER NA -114A3 ; [.2BA3.0020.0002] # TIRHUTA LETTER PA -114A4 ; [.2BA4.0020.0002] # TIRHUTA LETTER PHA -114A5 ; [.2BA5.0020.0002] # TIRHUTA LETTER BA -114A6 ; [.2BA6.0020.0002] # TIRHUTA LETTER BHA -114A7 ; [.2BA7.0020.0002] # TIRHUTA LETTER MA -114A8 ; [.2BA8.0020.0002] # TIRHUTA LETTER YA -114A9 ; [.2BA9.0020.0002] # TIRHUTA LETTER RA -114AA ; [.2BAA.0020.0002] # TIRHUTA LETTER LA -114AB ; [.2BAB.0020.0002] # TIRHUTA LETTER VA -114AC ; [.2BAC.0020.0002] # TIRHUTA LETTER SHA -114AD ; [.2BAD.0020.0002] # TIRHUTA LETTER SSA -114AE ; [.2BAE.0020.0002] # TIRHUTA LETTER SA -114AF ; [.2BAF.0020.0002] # TIRHUTA LETTER HA -114C4 ; [.2BB0.0020.0002] # TIRHUTA SIGN AVAGRAHA -114C5 ; [.2BB1.0020.0002] # TIRHUTA GVANG -114B0 ; [.2BB2.0020.0002] # TIRHUTA VOWEL SIGN AA -114B1 ; [.2BB3.0020.0002] # TIRHUTA VOWEL SIGN I -114B2 ; [.2BB4.0020.0002] # TIRHUTA VOWEL SIGN II -114B3 ; [.2BB5.0020.0002] # TIRHUTA VOWEL SIGN U -114B4 ; [.2BB6.0020.0002] # TIRHUTA VOWEL SIGN UU -114B5 ; [.2BB7.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC R -114B6 ; [.2BB8.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC RR -114B7 ; [.2BB9.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC L -114B8 ; [.2BBA.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC LL -114B9 ; [.2BBB.0020.0002] # TIRHUTA VOWEL SIGN E -114BA ; [.2BBC.0020.0002] # TIRHUTA VOWEL SIGN SHORT E -114BB ; [.2BBD.0020.0002] # TIRHUTA VOWEL SIGN AI -114B9 114BA ; [.2BBD.0020.0002] # TIRHUTA VOWEL SIGN AI -114BC ; [.2BBE.0020.0002] # TIRHUTA VOWEL SIGN O -114B9 114B0 ; [.2BBE.0020.0002] # TIRHUTA VOWEL SIGN O -114BD ; [.2BBF.0020.0002] # TIRHUTA VOWEL SIGN SHORT O -114BE ; [.2BC0.0020.0002] # TIRHUTA VOWEL SIGN AU -114B9 114BD ; [.2BC0.0020.0002] # TIRHUTA VOWEL SIGN AU -114C2 ; [.2BC1.0020.0002] # TIRHUTA SIGN VIRAMA -11580 ; [.2BC2.0020.0002] # SIDDHAM LETTER A -11581 ; [.2BC3.0020.0002] # SIDDHAM LETTER AA -11582 ; [.2BC4.0020.0002] # SIDDHAM LETTER I -115D8 ; [.2BC4.0020.0004][.0000.0110.0004] # SIDDHAM LETTER THREE-CIRCLE ALTERNATE I -115D9 ; [.2BC4.0020.0004][.0000.0111.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE I -11583 ; [.2BC5.0020.0002] # SIDDHAM LETTER II -115DA ; [.2BC5.0020.0004][.0000.0110.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE II -11584 ; [.2BC6.0020.0002] # SIDDHAM LETTER U -115DB ; [.2BC6.0020.0004][.0000.0110.0004] # SIDDHAM LETTER ALTERNATE U -11585 ; [.2BC7.0020.0002] # SIDDHAM LETTER UU -11586 ; [.2BC8.0020.0002] # SIDDHAM LETTER VOCALIC R -11587 ; [.2BC9.0020.0002] # SIDDHAM LETTER VOCALIC RR -11588 ; [.2BCA.0020.0002] # SIDDHAM LETTER VOCALIC L -11589 ; [.2BCB.0020.0002] # SIDDHAM LETTER VOCALIC LL -1158A ; [.2BCC.0020.0002] # SIDDHAM LETTER E -1158B ; [.2BCD.0020.0002] # SIDDHAM LETTER AI -1158C ; [.2BCE.0020.0002] # SIDDHAM LETTER O -1158D ; [.2BCF.0020.0002] # SIDDHAM LETTER AU -1158E ; [.2BD0.0020.0002] # SIDDHAM LETTER KA -1158F ; [.2BD1.0020.0002] # SIDDHAM LETTER KHA -11590 ; [.2BD2.0020.0002] # SIDDHAM LETTER GA -11591 ; [.2BD3.0020.0002] # SIDDHAM LETTER GHA -11592 ; [.2BD4.0020.0002] # SIDDHAM LETTER NGA -11593 ; [.2BD5.0020.0002] # SIDDHAM LETTER CA -11594 ; [.2BD6.0020.0002] # SIDDHAM LETTER CHA -11595 ; [.2BD7.0020.0002] # SIDDHAM LETTER JA -11596 ; [.2BD8.0020.0002] # SIDDHAM LETTER JHA -11597 ; [.2BD9.0020.0002] # SIDDHAM LETTER NYA -11598 ; [.2BDA.0020.0002] # SIDDHAM LETTER TTA -11599 ; [.2BDB.0020.0002] # SIDDHAM LETTER TTHA -1159A ; [.2BDC.0020.0002] # SIDDHAM LETTER DDA -1159B ; [.2BDD.0020.0002] # SIDDHAM LETTER DDHA -1159C ; [.2BDE.0020.0002] # SIDDHAM LETTER NNA -1159D ; [.2BDF.0020.0002] # SIDDHAM LETTER TA -1159E ; [.2BE0.0020.0002] # SIDDHAM LETTER THA -1159F ; [.2BE1.0020.0002] # SIDDHAM LETTER DA -115A0 ; [.2BE2.0020.0002] # SIDDHAM LETTER DHA -115A1 ; [.2BE3.0020.0002] # SIDDHAM LETTER NA -115A2 ; [.2BE4.0020.0002] # SIDDHAM LETTER PA -115A3 ; [.2BE5.0020.0002] # SIDDHAM LETTER PHA -115A4 ; [.2BE6.0020.0002] # SIDDHAM LETTER BA -115A5 ; [.2BE7.0020.0002] # SIDDHAM LETTER BHA -115A6 ; [.2BE8.0020.0002] # SIDDHAM LETTER MA -115A7 ; [.2BE9.0020.0002] # SIDDHAM LETTER YA -115A8 ; [.2BEA.0020.0002] # SIDDHAM LETTER RA -115A9 ; [.2BEB.0020.0002] # SIDDHAM LETTER LA -115AA ; [.2BEC.0020.0002] # SIDDHAM LETTER VA -115AB ; [.2BED.0020.0002] # SIDDHAM LETTER SHA -115AC ; [.2BEE.0020.0002] # SIDDHAM LETTER SSA -115AD ; [.2BEF.0020.0002] # SIDDHAM LETTER SA -115AE ; [.2BF0.0020.0002] # SIDDHAM LETTER HA -115AF ; [.2BF1.0020.0002] # SIDDHAM VOWEL SIGN AA -115B0 ; [.2BF2.0020.0002] # SIDDHAM VOWEL SIGN I -115B1 ; [.2BF3.0020.0002] # SIDDHAM VOWEL SIGN II -115B2 ; [.2BF4.0020.0002] # SIDDHAM VOWEL SIGN U -115DC ; [.2BF4.0020.0004][.0000.0110.0004] # SIDDHAM VOWEL SIGN ALTERNATE U -115B3 ; [.2BF5.0020.0002] # SIDDHAM VOWEL SIGN UU -115DD ; [.2BF5.0020.0004][.0000.0110.0004] # SIDDHAM VOWEL SIGN ALTERNATE UU -115B4 ; [.2BF6.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC R -115B5 ; [.2BF7.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC RR -115B8 ; [.2BF8.0020.0002] # SIDDHAM VOWEL SIGN E -115B9 ; [.2BF9.0020.0002] # SIDDHAM VOWEL SIGN AI -115BA ; [.2BFA.0020.0002] # SIDDHAM VOWEL SIGN O -115B8 115AF ; [.2BFA.0020.0002] # SIDDHAM VOWEL SIGN O -115BB ; [.2BFB.0020.0002] # SIDDHAM VOWEL SIGN AU -115B9 115AF ; [.2BFB.0020.0002] # SIDDHAM VOWEL SIGN AU -115BF ; [.2BFC.0020.0002] # SIDDHAM SIGN VIRAMA -11600 ; [.2BFD.0020.0002] # MODI LETTER A -11601 ; [.2BFE.0020.0002] # MODI LETTER AA -11602 ; [.2BFF.0020.0002] # MODI LETTER I -11603 ; [.2C00.0020.0002] # MODI LETTER II -11604 ; [.2C01.0020.0002] # MODI LETTER U -11605 ; [.2C02.0020.0002] # MODI LETTER UU -11606 ; [.2C03.0020.0002] # MODI LETTER VOCALIC R -11607 ; [.2C04.0020.0002] # MODI LETTER VOCALIC RR -11608 ; [.2C05.0020.0002] # MODI LETTER VOCALIC L -11609 ; [.2C06.0020.0002] # MODI LETTER VOCALIC LL -1160A ; [.2C07.0020.0002] # MODI LETTER E -1160B ; [.2C08.0020.0002] # MODI LETTER AI -1160C ; [.2C09.0020.0002] # MODI LETTER O -1160D ; [.2C0A.0020.0002] # MODI LETTER AU -1160E ; [.2C0B.0020.0002] # MODI LETTER KA -1160F ; [.2C0C.0020.0002] # MODI LETTER KHA -11610 ; [.2C0D.0020.0002] # MODI LETTER GA -11611 ; [.2C0E.0020.0002] # MODI LETTER GHA -11612 ; [.2C0F.0020.0002] # MODI LETTER NGA -11613 ; [.2C10.0020.0002] # MODI LETTER CA -11614 ; [.2C11.0020.0002] # MODI LETTER CHA -11615 ; [.2C12.0020.0002] # MODI LETTER JA -11616 ; [.2C13.0020.0002] # MODI LETTER JHA -11617 ; [.2C14.0020.0002] # MODI LETTER NYA -11618 ; [.2C15.0020.0002] # MODI LETTER TTA -11619 ; [.2C16.0020.0002] # MODI LETTER TTHA -1161A ; [.2C17.0020.0002] # MODI LETTER DDA -1161B ; [.2C18.0020.0002] # MODI LETTER DDHA -1161C ; [.2C19.0020.0002] # MODI LETTER NNA -1161D ; [.2C1A.0020.0002] # MODI LETTER TA -1161E ; [.2C1B.0020.0002] # MODI LETTER THA -1161F ; [.2C1C.0020.0002] # MODI LETTER DA -11620 ; [.2C1D.0020.0002] # MODI LETTER DHA -11621 ; [.2C1E.0020.0002] # MODI LETTER NA -11622 ; [.2C1F.0020.0002] # MODI LETTER PA -11623 ; [.2C20.0020.0002] # MODI LETTER PHA -11624 ; [.2C21.0020.0002] # MODI LETTER BA -11625 ; [.2C22.0020.0002] # MODI LETTER BHA -11626 ; [.2C23.0020.0002] # MODI LETTER MA -11627 ; [.2C24.0020.0002] # MODI LETTER YA -11628 ; [.2C25.0020.0002] # MODI LETTER RA -11629 ; [.2C26.0020.0002] # MODI LETTER LA -1162A ; [.2C27.0020.0002] # MODI LETTER VA -1162B ; [.2C28.0020.0002] # MODI LETTER SHA -1162C ; [.2C29.0020.0002] # MODI LETTER SSA -1162D ; [.2C2A.0020.0002] # MODI LETTER SA -1162E ; [.2C2B.0020.0002] # MODI LETTER HA -1162F ; [.2C2C.0020.0002] # MODI LETTER LLA -11630 ; [.2C2D.0020.0002] # MODI VOWEL SIGN AA -11631 ; [.2C2E.0020.0002] # MODI VOWEL SIGN I -11632 ; [.2C2F.0020.0002] # MODI VOWEL SIGN II -11633 ; [.2C30.0020.0002] # MODI VOWEL SIGN U -11634 ; [.2C31.0020.0002] # MODI VOWEL SIGN UU -11635 ; [.2C32.0020.0002] # MODI VOWEL SIGN VOCALIC R -11636 ; [.2C33.0020.0002] # MODI VOWEL SIGN VOCALIC RR -11637 ; [.2C34.0020.0002] # MODI VOWEL SIGN VOCALIC L -11638 ; [.2C35.0020.0002] # MODI VOWEL SIGN VOCALIC LL -11639 ; [.2C36.0020.0002] # MODI VOWEL SIGN E -1163A ; [.2C37.0020.0002] # MODI VOWEL SIGN AI -1163B ; [.2C38.0020.0002] # MODI VOWEL SIGN O -1163C ; [.2C39.0020.0002] # MODI VOWEL SIGN AU -1163F ; [.2C3A.0020.0002] # MODI SIGN VIRAMA -11644 ; [.2C3B.0020.0002] # MODI SIGN HUVA -11680 ; [.2C3C.0020.0002] # TAKRI LETTER A -11681 ; [.2C3D.0020.0002] # TAKRI LETTER AA -11682 ; [.2C3E.0020.0002] # TAKRI LETTER I -11683 ; [.2C3F.0020.0002] # TAKRI LETTER II -11684 ; [.2C40.0020.0002] # TAKRI LETTER U -11685 ; [.2C41.0020.0002] # TAKRI LETTER UU -11686 ; [.2C42.0020.0002] # TAKRI LETTER E -11687 ; [.2C43.0020.0002] # TAKRI LETTER AI -11688 ; [.2C44.0020.0002] # TAKRI LETTER O -11689 ; [.2C45.0020.0002] # TAKRI LETTER AU -116A8 ; [.2C46.0020.0002] # TAKRI LETTER SA -116A7 ; [.2C47.0020.0002] # TAKRI LETTER SHA -116A9 ; [.2C48.0020.0002] # TAKRI LETTER HA -1168A ; [.2C49.0020.0002] # TAKRI LETTER KA -1168B ; [.2C4A.0020.0002] # TAKRI LETTER KHA -1168C ; [.2C4B.0020.0002] # TAKRI LETTER GA -1168D ; [.2C4C.0020.0002] # TAKRI LETTER GHA -1168E ; [.2C4D.0020.0002] # TAKRI LETTER NGA -1168F ; [.2C4E.0020.0002] # TAKRI LETTER CA -11690 ; [.2C4F.0020.0002] # TAKRI LETTER CHA -11691 ; [.2C50.0020.0002] # TAKRI LETTER JA -11692 ; [.2C51.0020.0002] # TAKRI LETTER JHA -11693 ; [.2C52.0020.0002] # TAKRI LETTER NYA -11694 ; [.2C53.0020.0002] # TAKRI LETTER TTA -11695 ; [.2C54.0020.0002] # TAKRI LETTER TTHA -11696 ; [.2C55.0020.0002] # TAKRI LETTER DDA -11697 ; [.2C56.0020.0002] # TAKRI LETTER DDHA -11698 ; [.2C57.0020.0002] # TAKRI LETTER NNA -11699 ; [.2C58.0020.0002] # TAKRI LETTER TA -1169A ; [.2C59.0020.0002] # TAKRI LETTER THA -1169B ; [.2C5A.0020.0002] # TAKRI LETTER DA -1169C ; [.2C5B.0020.0002] # TAKRI LETTER DHA -1169D ; [.2C5C.0020.0002] # TAKRI LETTER NA -1169E ; [.2C5D.0020.0002] # TAKRI LETTER PA -1169F ; [.2C5E.0020.0002] # TAKRI LETTER PHA -116A0 ; [.2C5F.0020.0002] # TAKRI LETTER BA -116A1 ; [.2C60.0020.0002] # TAKRI LETTER BHA -116A2 ; [.2C61.0020.0002] # TAKRI LETTER MA -116A3 ; [.2C62.0020.0002] # TAKRI LETTER YA -116A4 ; [.2C63.0020.0002] # TAKRI LETTER RA -116A5 ; [.2C64.0020.0002] # TAKRI LETTER LA -116A6 ; [.2C65.0020.0002] # TAKRI LETTER VA -116AA ; [.2C66.0020.0002] # TAKRI LETTER RRA -116AD ; [.2C67.0020.0002] # TAKRI VOWEL SIGN AA -116AE ; [.2C68.0020.0002] # TAKRI VOWEL SIGN I -116AF ; [.2C69.0020.0002] # TAKRI VOWEL SIGN II -116B0 ; [.2C6A.0020.0002] # TAKRI VOWEL SIGN U -116B1 ; [.2C6B.0020.0002] # TAKRI VOWEL SIGN UU -116B2 ; [.2C6C.0020.0002] # TAKRI VOWEL SIGN E -116B3 ; [.2C6D.0020.0002] # TAKRI VOWEL SIGN AI -116B4 ; [.2C6E.0020.0002] # TAKRI VOWEL SIGN O -116B5 ; [.2C6F.0020.0002] # TAKRI VOWEL SIGN AU -116B6 ; [.2C70.0020.0002] # TAKRI SIGN VIRAMA -11700 ; [.2C71.0020.0002] # AHOM LETTER KA -11701 ; [.2C72.0020.0002] # AHOM LETTER KHA -11702 ; [.2C73.0020.0002] # AHOM LETTER NGA -11703 ; [.2C74.0020.0002] # AHOM LETTER NA -11704 ; [.2C75.0020.0002] # AHOM LETTER TA -11705 ; [.2C75.0020.0004][.0000.0110.0004] # AHOM LETTER ALTERNATE TA -11706 ; [.2C76.0020.0002] # AHOM LETTER PA -11707 ; [.2C77.0020.0002] # AHOM LETTER PHA -11708 ; [.2C78.0020.0002] # AHOM LETTER BA -11709 ; [.2C79.0020.0002] # AHOM LETTER MA -1170A ; [.2C7A.0020.0002] # AHOM LETTER JA -1170B ; [.2C7B.0020.0002] # AHOM LETTER CHA -1170C ; [.2C7C.0020.0002] # AHOM LETTER THA -1170D ; [.2C7D.0020.0002] # AHOM LETTER RA -1170E ; [.2C7E.0020.0002] # AHOM LETTER LA -1170F ; [.2C7F.0020.0002] # AHOM LETTER SA -11710 ; [.2C80.0020.0002] # AHOM LETTER NYA -11711 ; [.2C81.0020.0002] # AHOM LETTER HA -11712 ; [.2C82.0020.0002] # AHOM LETTER A -11713 ; [.2C83.0020.0002] # AHOM LETTER DA -11714 ; [.2C84.0020.0002] # AHOM LETTER DHA -11715 ; [.2C85.0020.0002] # AHOM LETTER GA -11716 ; [.2C85.0020.0004][.0000.0110.0004] # AHOM LETTER ALTERNATE GA -11717 ; [.2C86.0020.0002] # AHOM LETTER GHA -11718 ; [.2C87.0020.0002] # AHOM LETTER BHA -11719 ; [.2C88.0020.0002] # AHOM LETTER JHA -11720 ; [.2C89.0020.0002] # AHOM VOWEL SIGN A -11721 ; [.2C8A.0020.0002] # AHOM VOWEL SIGN AA -11722 ; [.2C8B.0020.0002] # AHOM VOWEL SIGN I -11723 ; [.2C8C.0020.0002] # AHOM VOWEL SIGN II -11724 ; [.2C8D.0020.0002] # AHOM VOWEL SIGN U -11725 ; [.2C8E.0020.0002] # AHOM VOWEL SIGN UU -11726 ; [.2C8F.0020.0002] # AHOM VOWEL SIGN E -11727 ; [.2C90.0020.0002] # AHOM VOWEL SIGN AW -11728 ; [.2C91.0020.0002] # AHOM VOWEL SIGN O -11729 ; [.2C92.0020.0002] # AHOM VOWEL SIGN AI -1172A ; [.2C93.0020.0002] # AHOM VOWEL SIGN AM -1172B ; [.2C94.0020.0002] # AHOM SIGN KILLER -1171D ; [.2C95.0020.0002] # AHOM CONSONANT SIGN MEDIAL LA -1171E ; [.2C96.0020.0002] # AHOM CONSONANT SIGN MEDIAL RA -1171F ; [.2C97.0020.0002] # AHOM CONSONANT SIGN MEDIAL LIGATING RA -1B83 ; [.2C98.0020.0002] # SUNDANESE LETTER A -1BBA ; [.2C98.0020.0004] # SUNDANESE AVAGRAHA -1B84 ; [.2C99.0020.0002] # SUNDANESE LETTER I -1B85 ; [.2C9A.0020.0002] # SUNDANESE LETTER U -1B86 ; [.2C9B.0020.0002] # SUNDANESE LETTER AE -1B87 ; [.2C9C.0020.0002] # SUNDANESE LETTER O -1B88 ; [.2C9D.0020.0002] # SUNDANESE LETTER E -1B89 ; [.2C9E.0020.0002] # SUNDANESE LETTER EU -1B8A ; [.2C9F.0020.0002] # SUNDANESE LETTER KA -1BBE ; [.2C9F.0020.0019] # SUNDANESE LETTER FINAL K -1BAE ; [.2CA0.0020.0002] # SUNDANESE LETTER KHA -1B8B ; [.2CA1.0020.0002] # SUNDANESE LETTER QA -1B8C ; [.2CA2.0020.0002] # SUNDANESE LETTER GA -1B8D ; [.2CA3.0020.0002] # SUNDANESE LETTER NGA -1B8E ; [.2CA4.0020.0002] # SUNDANESE LETTER CA -1B8F ; [.2CA5.0020.0002] # SUNDANESE LETTER JA -1B90 ; [.2CA6.0020.0002] # SUNDANESE LETTER ZA -1B91 ; [.2CA7.0020.0002] # SUNDANESE LETTER NYA -1B92 ; [.2CA8.0020.0002] # SUNDANESE LETTER TA -1B93 ; [.2CA9.0020.0002] # SUNDANESE LETTER DA -1B94 ; [.2CAA.0020.0002] # SUNDANESE LETTER NA -1B95 ; [.2CAB.0020.0002] # SUNDANESE LETTER PA -1B96 ; [.2CAC.0020.0002] # SUNDANESE LETTER FA -1B97 ; [.2CAD.0020.0002] # SUNDANESE LETTER VA -1B98 ; [.2CAE.0020.0002] # SUNDANESE LETTER BA -1BBD ; [.2CAF.0020.0002] # SUNDANESE LETTER BHA -1B99 ; [.2CB0.0020.0002] # SUNDANESE LETTER MA -1BBF ; [.2CB0.0020.0019] # SUNDANESE LETTER FINAL M -1BAC ; [.2CB1.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN MA -1B9A ; [.2CB2.0020.0002] # SUNDANESE LETTER YA -1BA1 ; [.2CB3.0020.0002] # SUNDANESE CONSONANT SIGN PAMINGKAL -1B9B ; [.2CB4.0020.0002] # SUNDANESE LETTER RA -1BA2 ; [.2CB5.0020.0002] # SUNDANESE CONSONANT SIGN PANYAKRA -1BBB ; [.2CB6.0020.0002] # SUNDANESE LETTER REU -1B9C ; [.2CB7.0020.0002] # SUNDANESE LETTER LA -1BA3 ; [.2CB8.0020.0002] # SUNDANESE CONSONANT SIGN PANYIKU -1BBC ; [.2CB9.0020.0002] # SUNDANESE LETTER LEU -1B9D ; [.2CBA.0020.0002] # SUNDANESE LETTER WA -1BAD ; [.2CBB.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN WA -1B9E ; [.2CBC.0020.0002] # SUNDANESE LETTER SA -1B9F ; [.2CBD.0020.0002] # SUNDANESE LETTER XA -1BAF ; [.2CBE.0020.0002] # SUNDANESE LETTER SYA -1BA0 ; [.2CBF.0020.0002] # SUNDANESE LETTER HA -1BA4 ; [.2CC0.0020.0002] # SUNDANESE VOWEL SIGN PANGHULU -1BA5 ; [.2CC1.0020.0002] # SUNDANESE VOWEL SIGN PANYUKU -1BA6 ; [.2CC2.0020.0002] # SUNDANESE VOWEL SIGN PANAELAENG -1BA7 ; [.2CC3.0020.0002] # SUNDANESE VOWEL SIGN PANOLONG -1BA8 ; [.2CC4.0020.0002] # SUNDANESE VOWEL SIGN PAMEPET -1BA9 ; [.2CC5.0020.0002] # SUNDANESE VOWEL SIGN PANEULEUNG -1BAA ; [.2CC6.0020.0002] # SUNDANESE SIGN PAMAAEH -1BAB ; [.2CC7.0020.0002] # SUNDANESE SIGN VIRAMA -11005 ; [.2CC8.0020.0002] # BRAHMI LETTER A -11006 ; [.2CC9.0020.0002] # BRAHMI LETTER AA -11007 ; [.2CCA.0020.0002] # BRAHMI LETTER I -11008 ; [.2CCB.0020.0002] # BRAHMI LETTER II -11009 ; [.2CCC.0020.0002] # BRAHMI LETTER U -1100A ; [.2CCD.0020.0002] # BRAHMI LETTER UU -1100B ; [.2CCE.0020.0002] # BRAHMI LETTER VOCALIC R -1100C ; [.2CCF.0020.0002] # BRAHMI LETTER VOCALIC RR -1100D ; [.2CD0.0020.0002] # BRAHMI LETTER VOCALIC L -1100E ; [.2CD1.0020.0002] # BRAHMI LETTER VOCALIC LL -1100F ; [.2CD2.0020.0002] # BRAHMI LETTER E -11010 ; [.2CD3.0020.0002] # BRAHMI LETTER AI -11011 ; [.2CD4.0020.0002] # BRAHMI LETTER O -11012 ; [.2CD5.0020.0002] # BRAHMI LETTER AU -11013 ; [.2CD6.0020.0002] # BRAHMI LETTER KA -11014 ; [.2CD7.0020.0002] # BRAHMI LETTER KHA -11015 ; [.2CD8.0020.0002] # BRAHMI LETTER GA -11016 ; [.2CD9.0020.0002] # BRAHMI LETTER GHA -11017 ; [.2CDA.0020.0002] # BRAHMI LETTER NGA -11018 ; [.2CDB.0020.0002] # BRAHMI LETTER CA -11019 ; [.2CDC.0020.0002] # BRAHMI LETTER CHA -1101A ; [.2CDD.0020.0002] # BRAHMI LETTER JA -1101B ; [.2CDE.0020.0002] # BRAHMI LETTER JHA -1101C ; [.2CDF.0020.0002] # BRAHMI LETTER NYA -1101D ; [.2CE0.0020.0002] # BRAHMI LETTER TTA -1101E ; [.2CE1.0020.0002] # BRAHMI LETTER TTHA -1101F ; [.2CE2.0020.0002] # BRAHMI LETTER DDA -11020 ; [.2CE3.0020.0002] # BRAHMI LETTER DDHA -11021 ; [.2CE4.0020.0002] # BRAHMI LETTER NNA -11022 ; [.2CE5.0020.0002] # BRAHMI LETTER TA -11023 ; [.2CE6.0020.0002] # BRAHMI LETTER THA -11024 ; [.2CE7.0020.0002] # BRAHMI LETTER DA -11025 ; [.2CE8.0020.0002] # BRAHMI LETTER DHA -11026 ; [.2CE9.0020.0002] # BRAHMI LETTER NA -11027 ; [.2CEA.0020.0002] # BRAHMI LETTER PA -11028 ; [.2CEB.0020.0002] # BRAHMI LETTER PHA -11029 ; [.2CEC.0020.0002] # BRAHMI LETTER BA -1102A ; [.2CED.0020.0002] # BRAHMI LETTER BHA -1102B ; [.2CEE.0020.0002] # BRAHMI LETTER MA -1102C ; [.2CEF.0020.0002] # BRAHMI LETTER YA -1102D ; [.2CF0.0020.0002] # BRAHMI LETTER RA -1102E ; [.2CF1.0020.0002] # BRAHMI LETTER LA -1102F ; [.2CF2.0020.0002] # BRAHMI LETTER VA -11030 ; [.2CF3.0020.0002] # BRAHMI LETTER SHA -11031 ; [.2CF4.0020.0002] # BRAHMI LETTER SSA -11032 ; [.2CF5.0020.0002] # BRAHMI LETTER SA -11033 ; [.2CF6.0020.0002] # BRAHMI LETTER HA -11003 ; [.2CF7.0020.0002] # BRAHMI SIGN JIHVAMULIYA -11004 ; [.2CF8.0020.0002] # BRAHMI SIGN UPADHMANIYA -11034 ; [.2CF9.0020.0002] # BRAHMI LETTER LLA -11035 ; [.2CFA.0020.0002] # BRAHMI LETTER OLD TAMIL LLLA -11036 ; [.2CFB.0020.0002] # BRAHMI LETTER OLD TAMIL RRA -11037 ; [.2CFC.0020.0002] # BRAHMI LETTER OLD TAMIL NNNA -11038 ; [.2CFD.0020.0002] # BRAHMI VOWEL SIGN AA -11039 ; [.2CFE.0020.0002] # BRAHMI VOWEL SIGN BHATTIPROLU AA -1103A ; [.2CFF.0020.0002] # BRAHMI VOWEL SIGN I -1103B ; [.2D00.0020.0002] # BRAHMI VOWEL SIGN II -1103C ; [.2D01.0020.0002] # BRAHMI VOWEL SIGN U -1103D ; [.2D02.0020.0002] # BRAHMI VOWEL SIGN UU -1103E ; [.2D03.0020.0002] # BRAHMI VOWEL SIGN VOCALIC R -1103F ; [.2D04.0020.0002] # BRAHMI VOWEL SIGN VOCALIC RR -11040 ; [.2D05.0020.0002] # BRAHMI VOWEL SIGN VOCALIC L -11041 ; [.2D06.0020.0002] # BRAHMI VOWEL SIGN VOCALIC LL -11042 ; [.2D07.0020.0002] # BRAHMI VOWEL SIGN E -11043 ; [.2D08.0020.0002] # BRAHMI VOWEL SIGN AI -11044 ; [.2D09.0020.0002] # BRAHMI VOWEL SIGN O -11045 ; [.2D0A.0020.0002] # BRAHMI VOWEL SIGN AU -11046 ; [.2D0B.0020.0002] # BRAHMI VIRAMA -1107F ; [.2D0C.0020.0002] # BRAHMI NUMBER JOINER -10A00 ; [.2D0D.0020.0002] # KHAROSHTHI LETTER A -10A01 ; [.2D0E.0020.0002] # KHAROSHTHI VOWEL SIGN I -10A02 ; [.2D0F.0020.0002] # KHAROSHTHI VOWEL SIGN U -10A03 ; [.2D10.0020.0002] # KHAROSHTHI VOWEL SIGN VOCALIC R -10A05 ; [.2D11.0020.0002] # KHAROSHTHI VOWEL SIGN E -10A06 ; [.2D12.0020.0002] # KHAROSHTHI VOWEL SIGN O -10A0C ; [.2D13.0020.0002] # KHAROSHTHI VOWEL LENGTH MARK -10A10 ; [.2D14.0020.0002] # KHAROSHTHI LETTER KA -10A11 ; [.2D15.0020.0002] # KHAROSHTHI LETTER KHA -10A12 ; [.2D16.0020.0002] # KHAROSHTHI LETTER GA -10A13 ; [.2D17.0020.0002] # KHAROSHTHI LETTER GHA -10A15 ; [.2D18.0020.0002] # KHAROSHTHI LETTER CA -10A16 ; [.2D19.0020.0002] # KHAROSHTHI LETTER CHA -10A17 ; [.2D1A.0020.0002] # KHAROSHTHI LETTER JA -10A19 ; [.2D1B.0020.0002] # KHAROSHTHI LETTER NYA -10A1A ; [.2D1C.0020.0002] # KHAROSHTHI LETTER TTA -10A1B ; [.2D1D.0020.0002] # KHAROSHTHI LETTER TTHA -10A1C ; [.2D1E.0020.0002] # KHAROSHTHI LETTER DDA -10A1D ; [.2D1F.0020.0002] # KHAROSHTHI LETTER DDHA -10A1E ; [.2D20.0020.0002] # KHAROSHTHI LETTER NNA -10A1F ; [.2D21.0020.0002] # KHAROSHTHI LETTER TA -10A20 ; [.2D22.0020.0002] # KHAROSHTHI LETTER THA -10A21 ; [.2D23.0020.0002] # KHAROSHTHI LETTER DA -10A22 ; [.2D24.0020.0002] # KHAROSHTHI LETTER DHA -10A23 ; [.2D25.0020.0002] # KHAROSHTHI LETTER NA -10A24 ; [.2D26.0020.0002] # KHAROSHTHI LETTER PA -10A25 ; [.2D27.0020.0002] # KHAROSHTHI LETTER PHA -10A26 ; [.2D28.0020.0002] # KHAROSHTHI LETTER BA -10A27 ; [.2D29.0020.0002] # KHAROSHTHI LETTER BHA -10A28 ; [.2D2A.0020.0002] # KHAROSHTHI LETTER MA -10A29 ; [.2D2B.0020.0002] # KHAROSHTHI LETTER YA -10A2A ; [.2D2C.0020.0002] # KHAROSHTHI LETTER RA -10A2B ; [.2D2D.0020.0002] # KHAROSHTHI LETTER LA -10A2C ; [.2D2E.0020.0002] # KHAROSHTHI LETTER VA -10A2D ; [.2D2F.0020.0002] # KHAROSHTHI LETTER SHA -10A2E ; [.2D30.0020.0002] # KHAROSHTHI LETTER SSA -10A2F ; [.2D31.0020.0002] # KHAROSHTHI LETTER SA -10A30 ; [.2D32.0020.0002] # KHAROSHTHI LETTER ZA -10A31 ; [.2D33.0020.0002] # KHAROSHTHI LETTER HA -10A32 ; [.2D34.0020.0002] # KHAROSHTHI LETTER KKA -10A33 ; [.2D35.0020.0002] # KHAROSHTHI LETTER TTTHA -10A3F ; [.2D36.0020.0002] # KHAROSHTHI VIRAMA -11C00 ; [.2D37.0020.0002] # BHAIKSUKI LETTER A -11C01 ; [.2D38.0020.0002] # BHAIKSUKI LETTER AA -11C02 ; [.2D39.0020.0002] # BHAIKSUKI LETTER I -11C03 ; [.2D3A.0020.0002] # BHAIKSUKI LETTER II -11C04 ; [.2D3B.0020.0002] # BHAIKSUKI LETTER U -11C05 ; [.2D3C.0020.0002] # BHAIKSUKI LETTER UU -11C06 ; [.2D3D.0020.0002] # BHAIKSUKI LETTER VOCALIC R -11C07 ; [.2D3E.0020.0002] # BHAIKSUKI LETTER VOCALIC RR -11C08 ; [.2D3F.0020.0002] # BHAIKSUKI LETTER VOCALIC L -11C0A ; [.2D40.0020.0002] # BHAIKSUKI LETTER E -11C0B ; [.2D41.0020.0002] # BHAIKSUKI LETTER AI -11C0C ; [.2D42.0020.0002] # BHAIKSUKI LETTER O -11C0D ; [.2D43.0020.0002] # BHAIKSUKI LETTER AU -11C0E ; [.2D44.0020.0002] # BHAIKSUKI LETTER KA -11C0F ; [.2D45.0020.0002] # BHAIKSUKI LETTER KHA -11C10 ; [.2D46.0020.0002] # BHAIKSUKI LETTER GA -11C11 ; [.2D47.0020.0002] # BHAIKSUKI LETTER GHA -11C12 ; [.2D48.0020.0002] # BHAIKSUKI LETTER NGA -11C13 ; [.2D49.0020.0002] # BHAIKSUKI LETTER CA -11C14 ; [.2D4A.0020.0002] # BHAIKSUKI LETTER CHA -11C15 ; [.2D4B.0020.0002] # BHAIKSUKI LETTER JA -11C16 ; [.2D4C.0020.0002] # BHAIKSUKI LETTER JHA -11C17 ; [.2D4D.0020.0002] # BHAIKSUKI LETTER NYA -11C18 ; [.2D4E.0020.0002] # BHAIKSUKI LETTER TTA -11C19 ; [.2D4F.0020.0002] # BHAIKSUKI LETTER TTHA -11C1A ; [.2D50.0020.0002] # BHAIKSUKI LETTER DDA -11C1B ; [.2D51.0020.0002] # BHAIKSUKI LETTER DDHA -11C1C ; [.2D52.0020.0002] # BHAIKSUKI LETTER NNA -11C1D ; [.2D53.0020.0002] # BHAIKSUKI LETTER TA -11C1E ; [.2D54.0020.0002] # BHAIKSUKI LETTER THA -11C1F ; [.2D55.0020.0002] # BHAIKSUKI LETTER DA -11C20 ; [.2D56.0020.0002] # BHAIKSUKI LETTER DHA -11C21 ; [.2D57.0020.0002] # BHAIKSUKI LETTER NA -11C22 ; [.2D58.0020.0002] # BHAIKSUKI LETTER PA -11C23 ; [.2D59.0020.0002] # BHAIKSUKI LETTER PHA -11C24 ; [.2D5A.0020.0002] # BHAIKSUKI LETTER BA -11C25 ; [.2D5B.0020.0002] # BHAIKSUKI LETTER BHA -11C26 ; [.2D5C.0020.0002] # BHAIKSUKI LETTER MA -11C27 ; [.2D5D.0020.0002] # BHAIKSUKI LETTER YA -11C28 ; [.2D5E.0020.0002] # BHAIKSUKI LETTER RA -11C29 ; [.2D5F.0020.0002] # BHAIKSUKI LETTER LA -11C2A ; [.2D60.0020.0002] # BHAIKSUKI LETTER VA -11C2B ; [.2D61.0020.0002] # BHAIKSUKI LETTER SHA -11C2C ; [.2D62.0020.0002] # BHAIKSUKI LETTER SSA -11C2D ; [.2D63.0020.0002] # BHAIKSUKI LETTER SA -11C2E ; [.2D64.0020.0002] # BHAIKSUKI LETTER HA -11C40 ; [.2D65.0020.0002] # BHAIKSUKI SIGN AVAGRAHA -11C2F ; [.2D66.0020.0002] # BHAIKSUKI VOWEL SIGN AA -11C30 ; [.2D67.0020.0002] # BHAIKSUKI VOWEL SIGN I -11C31 ; [.2D68.0020.0002] # BHAIKSUKI VOWEL SIGN II -11C32 ; [.2D69.0020.0002] # BHAIKSUKI VOWEL SIGN U -11C33 ; [.2D6A.0020.0002] # BHAIKSUKI VOWEL SIGN UU -11C34 ; [.2D6B.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC R -11C35 ; [.2D6C.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC RR -11C36 ; [.2D6D.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC L -11C38 ; [.2D6E.0020.0002] # BHAIKSUKI VOWEL SIGN E -11C39 ; [.2D6F.0020.0002] # BHAIKSUKI VOWEL SIGN AI -11C3A ; [.2D70.0020.0002] # BHAIKSUKI VOWEL SIGN O -11C3B ; [.2D71.0020.0002] # BHAIKSUKI VOWEL SIGN AU -11C3F ; [.2D72.0020.0002] # BHAIKSUKI SIGN VIRAMA -0E01 ; [.2D73.0020.0002] # THAI CHARACTER KO KAI -0E40 0E01 ; [.2D73.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI> -0E41 0E01 ; [.2D73.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI> -0E42 0E01 ; [.2D73.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI> -0E43 0E01 ; [.2D73.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI> -0E44 0E01 ; [.2D73.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI> -0E02 ; [.2D74.0020.0002] # THAI CHARACTER KHO KHAI -0E40 0E02 ; [.2D74.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI> -0E41 0E02 ; [.2D74.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI> -0E42 0E02 ; [.2D74.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI> -0E43 0E02 ; [.2D74.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI> -0E44 0E02 ; [.2D74.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI> -0E03 ; [.2D75.0020.0002] # THAI CHARACTER KHO KHUAT -0E40 0E03 ; [.2D75.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT> -0E41 0E03 ; [.2D75.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT> -0E42 0E03 ; [.2D75.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT> -0E43 0E03 ; [.2D75.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT> -0E44 0E03 ; [.2D75.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT> -0E04 ; [.2D76.0020.0002] # THAI CHARACTER KHO KHWAI -0E40 0E04 ; [.2D76.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI> -0E41 0E04 ; [.2D76.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI> -0E42 0E04 ; [.2D76.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI> -0E43 0E04 ; [.2D76.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI> -0E44 0E04 ; [.2D76.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI> -0E05 ; [.2D77.0020.0002] # THAI CHARACTER KHO KHON -0E40 0E05 ; [.2D77.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON> -0E41 0E05 ; [.2D77.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON> -0E42 0E05 ; [.2D77.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON> -0E43 0E05 ; [.2D77.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON> -0E44 0E05 ; [.2D77.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON> -0E06 ; [.2D78.0020.0002] # THAI CHARACTER KHO RAKHANG -0E40 0E06 ; [.2D78.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG> -0E41 0E06 ; [.2D78.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG> -0E42 0E06 ; [.2D78.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG> -0E43 0E06 ; [.2D78.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG> -0E44 0E06 ; [.2D78.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG> -0E07 ; [.2D79.0020.0002] # THAI CHARACTER NGO NGU -0E40 0E07 ; [.2D79.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU> -0E41 0E07 ; [.2D79.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU> -0E42 0E07 ; [.2D79.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU> -0E43 0E07 ; [.2D79.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU> -0E44 0E07 ; [.2D79.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU> -0E08 ; [.2D7A.0020.0002] # THAI CHARACTER CHO CHAN -0E40 0E08 ; [.2D7A.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN> -0E41 0E08 ; [.2D7A.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN> -0E42 0E08 ; [.2D7A.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN> -0E43 0E08 ; [.2D7A.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN> -0E44 0E08 ; [.2D7A.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN> -0E09 ; [.2D7B.0020.0002] # THAI CHARACTER CHO CHING -0E40 0E09 ; [.2D7B.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING> -0E41 0E09 ; [.2D7B.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING> -0E42 0E09 ; [.2D7B.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING> -0E43 0E09 ; [.2D7B.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING> -0E44 0E09 ; [.2D7B.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING> -0E0A ; [.2D7C.0020.0002] # THAI CHARACTER CHO CHANG -0E40 0E0A ; [.2D7C.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG> -0E41 0E0A ; [.2D7C.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG> -0E42 0E0A ; [.2D7C.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG> -0E43 0E0A ; [.2D7C.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG> -0E44 0E0A ; [.2D7C.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG> -0E0B ; [.2D7D.0020.0002] # THAI CHARACTER SO SO -0E40 0E0B ; [.2D7D.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO> -0E41 0E0B ; [.2D7D.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO> -0E42 0E0B ; [.2D7D.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO> -0E43 0E0B ; [.2D7D.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO> -0E44 0E0B ; [.2D7D.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO> -0E0C ; [.2D7E.0020.0002] # THAI CHARACTER CHO CHOE -0E40 0E0C ; [.2D7E.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE> -0E41 0E0C ; [.2D7E.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE> -0E42 0E0C ; [.2D7E.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE> -0E43 0E0C ; [.2D7E.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE> -0E44 0E0C ; [.2D7E.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE> -0E0D ; [.2D7F.0020.0002] # THAI CHARACTER YO YING -0E40 0E0D ; [.2D7F.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING> -0E41 0E0D ; [.2D7F.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING> -0E42 0E0D ; [.2D7F.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING> -0E43 0E0D ; [.2D7F.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING> -0E44 0E0D ; [.2D7F.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING> -0E0E ; [.2D80.0020.0002] # THAI CHARACTER DO CHADA -0E40 0E0E ; [.2D80.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA> -0E41 0E0E ; [.2D80.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA> -0E42 0E0E ; [.2D80.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA> -0E43 0E0E ; [.2D80.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA> -0E44 0E0E ; [.2D80.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA> -0E0F ; [.2D81.0020.0002] # THAI CHARACTER TO PATAK -0E40 0E0F ; [.2D81.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK> -0E41 0E0F ; [.2D81.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK> -0E42 0E0F ; [.2D81.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK> -0E43 0E0F ; [.2D81.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK> -0E44 0E0F ; [.2D81.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK> -0E10 ; [.2D82.0020.0002] # THAI CHARACTER THO THAN -0E40 0E10 ; [.2D82.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN> -0E41 0E10 ; [.2D82.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN> -0E42 0E10 ; [.2D82.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN> -0E43 0E10 ; [.2D82.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN> -0E44 0E10 ; [.2D82.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN> -0E11 ; [.2D83.0020.0002] # THAI CHARACTER THO NANGMONTHO -0E40 0E11 ; [.2D83.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO> -0E41 0E11 ; [.2D83.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO> -0E42 0E11 ; [.2D83.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO> -0E43 0E11 ; [.2D83.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO> -0E44 0E11 ; [.2D83.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO> -0E12 ; [.2D84.0020.0002] # THAI CHARACTER THO PHUTHAO -0E40 0E12 ; [.2D84.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO> -0E41 0E12 ; [.2D84.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO> -0E42 0E12 ; [.2D84.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO> -0E43 0E12 ; [.2D84.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO> -0E44 0E12 ; [.2D84.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO> -0E13 ; [.2D85.0020.0002] # THAI CHARACTER NO NEN -0E40 0E13 ; [.2D85.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN> -0E41 0E13 ; [.2D85.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN> -0E42 0E13 ; [.2D85.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN> -0E43 0E13 ; [.2D85.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN> -0E44 0E13 ; [.2D85.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN> -0E14 ; [.2D86.0020.0002] # THAI CHARACTER DO DEK -0E40 0E14 ; [.2D86.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK> -0E41 0E14 ; [.2D86.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK> -0E42 0E14 ; [.2D86.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK> -0E43 0E14 ; [.2D86.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK> -0E44 0E14 ; [.2D86.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK> -0E15 ; [.2D87.0020.0002] # THAI CHARACTER TO TAO -0E40 0E15 ; [.2D87.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO> -0E41 0E15 ; [.2D87.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO> -0E42 0E15 ; [.2D87.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO> -0E43 0E15 ; [.2D87.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO> -0E44 0E15 ; [.2D87.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO> -0E16 ; [.2D88.0020.0002] # THAI CHARACTER THO THUNG -0E40 0E16 ; [.2D88.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG> -0E41 0E16 ; [.2D88.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG> -0E42 0E16 ; [.2D88.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG> -0E43 0E16 ; [.2D88.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG> -0E44 0E16 ; [.2D88.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG> -0E17 ; [.2D89.0020.0002] # THAI CHARACTER THO THAHAN -0E40 0E17 ; [.2D89.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN> -0E41 0E17 ; [.2D89.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN> -0E42 0E17 ; [.2D89.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN> -0E43 0E17 ; [.2D89.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN> -0E44 0E17 ; [.2D89.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN> -0E18 ; [.2D8A.0020.0002] # THAI CHARACTER THO THONG -0E40 0E18 ; [.2D8A.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG> -0E41 0E18 ; [.2D8A.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG> -0E42 0E18 ; [.2D8A.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG> -0E43 0E18 ; [.2D8A.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG> -0E44 0E18 ; [.2D8A.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG> -0E19 ; [.2D8B.0020.0002] # THAI CHARACTER NO NU -0E40 0E19 ; [.2D8B.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU> -0E41 0E19 ; [.2D8B.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU> -0E42 0E19 ; [.2D8B.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU> -0E43 0E19 ; [.2D8B.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU> -0E44 0E19 ; [.2D8B.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU> -0E1A ; [.2D8C.0020.0002] # THAI CHARACTER BO BAIMAI -0E40 0E1A ; [.2D8C.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI> -0E41 0E1A ; [.2D8C.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI> -0E42 0E1A ; [.2D8C.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI> -0E43 0E1A ; [.2D8C.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI> -0E44 0E1A ; [.2D8C.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI> -0E1B ; [.2D8D.0020.0002] # THAI CHARACTER PO PLA -0E40 0E1B ; [.2D8D.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA> -0E41 0E1B ; [.2D8D.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA> -0E42 0E1B ; [.2D8D.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA> -0E43 0E1B ; [.2D8D.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA> -0E44 0E1B ; [.2D8D.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA> -0E1C ; [.2D8E.0020.0002] # THAI CHARACTER PHO PHUNG -0E40 0E1C ; [.2D8E.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG> -0E41 0E1C ; [.2D8E.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG> -0E42 0E1C ; [.2D8E.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG> -0E43 0E1C ; [.2D8E.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG> -0E44 0E1C ; [.2D8E.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG> -0E1D ; [.2D8F.0020.0002] # THAI CHARACTER FO FA -0E40 0E1D ; [.2D8F.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA> -0E41 0E1D ; [.2D8F.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA> -0E42 0E1D ; [.2D8F.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA> -0E43 0E1D ; [.2D8F.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA> -0E44 0E1D ; [.2D8F.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA> -0E1E ; [.2D90.0020.0002] # THAI CHARACTER PHO PHAN -0E40 0E1E ; [.2D90.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN> -0E41 0E1E ; [.2D90.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN> -0E42 0E1E ; [.2D90.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN> -0E43 0E1E ; [.2D90.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN> -0E44 0E1E ; [.2D90.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN> -0E1F ; [.2D91.0020.0002] # THAI CHARACTER FO FAN -0E40 0E1F ; [.2D91.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN> -0E41 0E1F ; [.2D91.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN> -0E42 0E1F ; [.2D91.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN> -0E43 0E1F ; [.2D91.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN> -0E44 0E1F ; [.2D91.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN> -0E20 ; [.2D92.0020.0002] # THAI CHARACTER PHO SAMPHAO -0E40 0E20 ; [.2D92.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO> -0E41 0E20 ; [.2D92.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO> -0E42 0E20 ; [.2D92.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO> -0E43 0E20 ; [.2D92.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO> -0E44 0E20 ; [.2D92.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO> -0E21 ; [.2D93.0020.0002] # THAI CHARACTER MO MA -0E40 0E21 ; [.2D93.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA> -0E41 0E21 ; [.2D93.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA> -0E42 0E21 ; [.2D93.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA> -0E43 0E21 ; [.2D93.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA> -0E44 0E21 ; [.2D93.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA> -0E22 ; [.2D94.0020.0002] # THAI CHARACTER YO YAK -0E40 0E22 ; [.2D94.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK> -0E41 0E22 ; [.2D94.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK> -0E42 0E22 ; [.2D94.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK> -0E43 0E22 ; [.2D94.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK> -0E44 0E22 ; [.2D94.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK> -0E23 ; [.2D95.0020.0002] # THAI CHARACTER RO RUA -0E40 0E23 ; [.2D95.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA> -0E41 0E23 ; [.2D95.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA> -0E42 0E23 ; [.2D95.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA> -0E43 0E23 ; [.2D95.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA> -0E44 0E23 ; [.2D95.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA> -0E24 ; [.2D96.0020.0002] # THAI CHARACTER RU -0E40 0E24 ; [.2D96.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RU> -0E41 0E24 ; [.2D96.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RU> -0E42 0E24 ; [.2D96.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RU> -0E43 0E24 ; [.2D96.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU> -0E44 0E24 ; [.2D96.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU> -0E25 ; [.2D97.0020.0002] # THAI CHARACTER LO LING -0E40 0E25 ; [.2D97.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING> -0E41 0E25 ; [.2D97.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING> -0E42 0E25 ; [.2D97.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING> -0E43 0E25 ; [.2D97.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING> -0E44 0E25 ; [.2D97.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING> -0E26 ; [.2D98.0020.0002] # THAI CHARACTER LU -0E40 0E26 ; [.2D98.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LU> -0E41 0E26 ; [.2D98.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LU> -0E42 0E26 ; [.2D98.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LU> -0E43 0E26 ; [.2D98.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU> -0E44 0E26 ; [.2D98.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU> -0E27 ; [.2D99.0020.0002] # THAI CHARACTER WO WAEN -0E40 0E27 ; [.2D99.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN> -0E41 0E27 ; [.2D99.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN> -0E42 0E27 ; [.2D99.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN> -0E43 0E27 ; [.2D99.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN> -0E44 0E27 ; [.2D99.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN> -0E28 ; [.2D9A.0020.0002] # THAI CHARACTER SO SALA -0E40 0E28 ; [.2D9A.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA> -0E41 0E28 ; [.2D9A.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA> -0E42 0E28 ; [.2D9A.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA> -0E43 0E28 ; [.2D9A.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA> -0E44 0E28 ; [.2D9A.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA> -0E29 ; [.2D9B.0020.0002] # THAI CHARACTER SO RUSI -0E40 0E29 ; [.2D9B.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI> -0E41 0E29 ; [.2D9B.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI> -0E42 0E29 ; [.2D9B.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI> -0E43 0E29 ; [.2D9B.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI> -0E44 0E29 ; [.2D9B.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI> -0E2A ; [.2D9C.0020.0002] # THAI CHARACTER SO SUA -0E40 0E2A ; [.2D9C.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA> -0E41 0E2A ; [.2D9C.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA> -0E42 0E2A ; [.2D9C.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA> -0E43 0E2A ; [.2D9C.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA> -0E44 0E2A ; [.2D9C.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA> -0E2B ; [.2D9D.0020.0002] # THAI CHARACTER HO HIP -0E40 0E2B ; [.2D9D.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP> -0E41 0E2B ; [.2D9D.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP> -0E42 0E2B ; [.2D9D.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP> -0E43 0E2B ; [.2D9D.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP> -0E44 0E2B ; [.2D9D.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP> -0E2C ; [.2D9E.0020.0002] # THAI CHARACTER LO CHULA -0E40 0E2C ; [.2D9E.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA> -0E41 0E2C ; [.2D9E.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA> -0E42 0E2C ; [.2D9E.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA> -0E43 0E2C ; [.2D9E.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA> -0E44 0E2C ; [.2D9E.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA> -0E2D ; [.2D9F.0020.0002] # THAI CHARACTER O ANG -0E40 0E2D ; [.2D9F.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG> -0E41 0E2D ; [.2D9F.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG> -0E42 0E2D ; [.2D9F.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG> -0E43 0E2D ; [.2D9F.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG> -0E44 0E2D ; [.2D9F.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG> -0E2E ; [.2DA0.0020.0002] # THAI CHARACTER HO NOKHUK -0E40 0E2E ; [.2DA0.0020.0002][.2DAD.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK> -0E41 0E2E ; [.2DA0.0020.0002][.2DAE.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK> -0E42 0E2E ; [.2DA0.0020.0002][.2DAF.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK> -0E43 0E2E ; [.2DA0.0020.0002][.2DB0.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK> -0E44 0E2E ; [.2DA0.0020.0002][.2DB1.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK> -0E2F ; [.2DA1.0020.0002] # THAI CHARACTER PAIYANNOI -0E30 ; [.2DA2.0020.0002] # THAI CHARACTER SARA A -0E31 ; [.2DA3.0020.0002] # THAI CHARACTER MAI HAN-AKAT -0E32 ; [.2DA4.0020.0002] # THAI CHARACTER SARA AA -0E33 ; [.2DA5.0020.0002] # THAI CHARACTER SARA AM -0E4D 0E32 ; [.2DA5.0020.0002] # THAI CHARACTER SARA AM -0E34 ; [.2DA6.0020.0002] # THAI CHARACTER SARA I -0E35 ; [.2DA7.0020.0002] # THAI CHARACTER SARA II -0E36 ; [.2DA8.0020.0002] # THAI CHARACTER SARA UE -0E37 ; [.2DA9.0020.0002] # THAI CHARACTER SARA UEE -0E38 ; [.2DAA.0020.0002] # THAI CHARACTER SARA U -0E39 ; [.2DAB.0020.0002] # THAI CHARACTER SARA UU -0E3A ; [.2DAC.0020.0002] # THAI CHARACTER PHINTHU -0E40 ; [.2DAD.0020.0002] # THAI CHARACTER SARA E -0E41 ; [.2DAE.0020.0002] # THAI CHARACTER SARA AE -0E42 ; [.2DAF.0020.0002] # THAI CHARACTER SARA O -0E43 ; [.2DB0.0020.0002] # THAI CHARACTER SARA AI MAIMUAN -0E44 ; [.2DB1.0020.0002] # THAI CHARACTER SARA AI MAIMALAI -0E45 ; [.2DB2.0020.0002] # THAI CHARACTER LAKKHANGYAO -0EDE ; [.2DB3.0020.0002] # LAO LETTER KHMU GO -0EC0 0EDE ; [.2DB3.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU GO> -0EC1 0EDE ; [.2DB3.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU GO> -0EC2 0EDE ; [.2DB3.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU GO> -0EC3 0EDE ; [.2DB3.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU GO> -0EC4 0EDE ; [.2DB3.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU GO> -0E81 ; [.2DB4.0020.0002] # LAO LETTER KO -0EC0 0E81 ; [.2DB4.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KO> -0EC1 0E81 ; [.2DB4.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KO> -0EC2 0E81 ; [.2DB4.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KO> -0EC3 0E81 ; [.2DB4.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KO> -0EC4 0E81 ; [.2DB4.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KO> -0E82 ; [.2DB5.0020.0002] # LAO LETTER KHO SUNG -0EC0 0E82 ; [.2DB5.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG> -0EC1 0E82 ; [.2DB5.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG> -0EC2 0E82 ; [.2DB5.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG> -0EC3 0E82 ; [.2DB5.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG> -0EC4 0E82 ; [.2DB5.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG> -0E84 ; [.2DB6.0020.0002] # LAO LETTER KHO TAM -0EC0 0E84 ; [.2DB6.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM> -0EC1 0E84 ; [.2DB6.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM> -0EC2 0E84 ; [.2DB6.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM> -0EC3 0E84 ; [.2DB6.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM> -0EC4 0E84 ; [.2DB6.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM> -0E87 ; [.2DB7.0020.0002] # LAO LETTER NGO -0EC0 0E87 ; [.2DB7.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NGO> -0EC1 0E87 ; [.2DB7.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NGO> -0EC2 0E87 ; [.2DB7.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NGO> -0EC3 0E87 ; [.2DB7.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NGO> -0EC4 0E87 ; [.2DB7.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NGO> -0E88 ; [.2DB8.0020.0002] # LAO LETTER CO -0EC0 0E88 ; [.2DB8.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER CO> -0EC1 0E88 ; [.2DB8.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER CO> -0EC2 0E88 ; [.2DB8.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER CO> -0EC3 0E88 ; [.2DB8.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER CO> -0EC4 0E88 ; [.2DB8.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER CO> -0EAA ; [.2DB9.0020.0002] # LAO LETTER SO SUNG -0EC0 0EAA ; [.2DB9.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG> -0EC1 0EAA ; [.2DB9.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG> -0EC2 0EAA ; [.2DB9.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG> -0EC3 0EAA ; [.2DB9.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG> -0EC4 0EAA ; [.2DB9.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG> -0E8A ; [.2DBA.0020.0002] # LAO LETTER SO TAM -0EC0 0E8A ; [.2DBA.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO TAM> -0EC1 0E8A ; [.2DBA.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM> -0EC2 0E8A ; [.2DBA.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO TAM> -0EC3 0E8A ; [.2DBA.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM> -0EC4 0E8A ; [.2DBA.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM> -0EDF ; [.2DBB.0020.0002] # LAO LETTER KHMU NYO -0EC0 0EDF ; [.2DBB.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU NYO> -0EC1 0EDF ; [.2DBB.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU NYO> -0EC2 0EDF ; [.2DBB.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU NYO> -0EC3 0EDF ; [.2DBB.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU NYO> -0EC4 0EDF ; [.2DBB.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU NYO> -0E8D ; [.2DBC.0020.0002] # LAO LETTER NYO -0EC0 0E8D ; [.2DBC.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NYO> -0EC1 0E8D ; [.2DBC.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NYO> -0EC2 0E8D ; [.2DBC.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NYO> -0EC3 0E8D ; [.2DBC.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NYO> -0EC4 0E8D ; [.2DBC.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NYO> -0E94 ; [.2DBD.0020.0002] # LAO LETTER DO -0EC0 0E94 ; [.2DBD.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER DO> -0EC1 0E94 ; [.2DBD.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER DO> -0EC2 0E94 ; [.2DBD.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER DO> -0EC3 0E94 ; [.2DBD.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER DO> -0EC4 0E94 ; [.2DBD.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER DO> -0E95 ; [.2DBE.0020.0002] # LAO LETTER TO -0EC0 0E95 ; [.2DBE.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER TO> -0EC1 0E95 ; [.2DBE.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER TO> -0EC2 0E95 ; [.2DBE.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER TO> -0EC3 0E95 ; [.2DBE.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER TO> -0EC4 0E95 ; [.2DBE.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER TO> -0E96 ; [.2DBF.0020.0002] # LAO LETTER THO SUNG -0EC0 0E96 ; [.2DBF.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG> -0EC1 0E96 ; [.2DBF.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG> -0EC2 0E96 ; [.2DBF.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG> -0EC3 0E96 ; [.2DBF.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG> -0EC4 0E96 ; [.2DBF.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG> -0E97 ; [.2DC0.0020.0002] # LAO LETTER THO TAM -0EC0 0E97 ; [.2DC0.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO TAM> -0EC1 0E97 ; [.2DC0.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM> -0EC2 0E97 ; [.2DC0.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO TAM> -0EC3 0E97 ; [.2DC0.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM> -0EC4 0E97 ; [.2DC0.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM> -0E99 ; [.2DC1.0020.0002] # LAO LETTER NO -0EC0 0E99 ; [.2DC1.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NO> -0EC1 0E99 ; [.2DC1.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NO> -0EC2 0E99 ; [.2DC1.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NO> -0EC3 0E99 ; [.2DC1.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NO> -0EC4 0E99 ; [.2DC1.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NO> -0E9A ; [.2DC2.0020.0002] # LAO LETTER BO -0EC0 0E9A ; [.2DC2.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER BO> -0EC1 0E9A ; [.2DC2.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER BO> -0EC2 0E9A ; [.2DC2.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER BO> -0EC3 0E9A ; [.2DC2.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER BO> -0EC4 0E9A ; [.2DC2.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER BO> -0E9B ; [.2DC3.0020.0002] # LAO LETTER PO -0EC0 0E9B ; [.2DC3.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PO> -0EC1 0E9B ; [.2DC3.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PO> -0EC2 0E9B ; [.2DC3.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PO> -0EC3 0E9B ; [.2DC3.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PO> -0EC4 0E9B ; [.2DC3.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PO> -0E9C ; [.2DC4.0020.0002] # LAO LETTER PHO SUNG -0EC0 0E9C ; [.2DC4.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG> -0EC1 0E9C ; [.2DC4.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG> -0EC2 0E9C ; [.2DC4.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG> -0EC3 0E9C ; [.2DC4.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG> -0EC4 0E9C ; [.2DC4.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG> -0E9D ; [.2DC5.0020.0002] # LAO LETTER FO TAM -0EC0 0E9D ; [.2DC5.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO TAM> -0EC1 0E9D ; [.2DC5.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM> -0EC2 0E9D ; [.2DC5.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO TAM> -0EC3 0E9D ; [.2DC5.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM> -0EC4 0E9D ; [.2DC5.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM> -0E9E ; [.2DC6.0020.0002] # LAO LETTER PHO TAM -0EC0 0E9E ; [.2DC6.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM> -0EC1 0E9E ; [.2DC6.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM> -0EC2 0E9E ; [.2DC6.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM> -0EC3 0E9E ; [.2DC6.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM> -0EC4 0E9E ; [.2DC6.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM> -0E9F ; [.2DC7.0020.0002] # LAO LETTER FO SUNG -0EC0 0E9F ; [.2DC7.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG> -0EC1 0E9F ; [.2DC7.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG> -0EC2 0E9F ; [.2DC7.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG> -0EC3 0E9F ; [.2DC7.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG> -0EC4 0E9F ; [.2DC7.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG> -0EA1 ; [.2DC8.0020.0002] # LAO LETTER MO -0EC0 0EA1 ; [.2DC8.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER MO> -0EC1 0EA1 ; [.2DC8.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER MO> -0EC2 0EA1 ; [.2DC8.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER MO> -0EC3 0EA1 ; [.2DC8.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER MO> -0EC4 0EA1 ; [.2DC8.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER MO> -0EA2 ; [.2DC9.0020.0002] # LAO LETTER YO -0EC0 0EA2 ; [.2DC9.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER YO> -0EC1 0EA2 ; [.2DC9.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER YO> -0EC2 0EA2 ; [.2DC9.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER YO> -0EC3 0EA2 ; [.2DC9.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER YO> -0EC4 0EA2 ; [.2DC9.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER YO> -0EA3 ; [.2DCA.0020.0002] # LAO LETTER LO LING -0EC0 0EA3 ; [.2DCA.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LING> -0EC1 0EA3 ; [.2DCA.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LING> -0EC2 0EA3 ; [.2DCA.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LING> -0EC3 0EA3 ; [.2DCA.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LING> -0EC4 0EA3 ; [.2DCA.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LING> -0EA5 ; [.2DCB.0020.0002] # LAO LETTER LO LOOT -0EC0 0EA5 ; [.2DCB.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT> -0EC1 0EA5 ; [.2DCB.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT> -0EC2 0EA5 ; [.2DCB.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT> -0EC3 0EA5 ; [.2DCB.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT> -0EC4 0EA5 ; [.2DCB.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT> -0EA7 ; [.2DCC.0020.0002] # LAO LETTER WO -0EC0 0EA7 ; [.2DCC.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER WO> -0EC1 0EA7 ; [.2DCC.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER WO> -0EC2 0EA7 ; [.2DCC.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER WO> -0EC3 0EA7 ; [.2DCC.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER WO> -0EC4 0EA7 ; [.2DCC.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER WO> -0EAB ; [.2DCD.0020.0002] # LAO LETTER HO SUNG -0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004] # LAO HO NO -0EC0 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO HO NO> -0EC1 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO HO NO> -0EC2 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO HO NO> -0EC3 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO HO NO> -0EC4 0EDC ; [.2DCD.0020.0004][.2DC1.0020.0004][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO HO NO> -0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004] # LAO HO MO -0EC0 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO HO MO> -0EC1 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO HO MO> -0EC2 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO HO MO> -0EC3 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO HO MO> -0EC4 0EDD ; [.2DCD.0020.0004][.2DC8.0020.0004][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO HO MO> -0EC0 0EAB ; [.2DCD.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG> -0EC1 0EAB ; [.2DCD.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG> -0EC2 0EAB ; [.2DCD.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG> -0EC3 0EAB ; [.2DCD.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG> -0EC4 0EAB ; [.2DCD.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG> -0EAD ; [.2DCE.0020.0002] # LAO LETTER O -0EC0 0EAD ; [.2DCE.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER O> -0EC1 0EAD ; [.2DCE.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER O> -0EC2 0EAD ; [.2DCE.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER O> -0EC3 0EAD ; [.2DCE.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER O> -0EC4 0EAD ; [.2DCE.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER O> -0EAE ; [.2DCF.0020.0002] # LAO LETTER HO TAM -0EC0 0EAE ; [.2DCF.0020.0002][.2DDE.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO TAM> -0EC1 0EAE ; [.2DCF.0020.0002][.2DDF.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM> -0EC2 0EAE ; [.2DCF.0020.0002][.2DE0.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO TAM> -0EC3 0EAE ; [.2DCF.0020.0002][.2DE1.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM> -0EC4 0EAE ; [.2DCF.0020.0002][.2DE2.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM> -0EAF ; [.2DD0.0020.0002] # LAO ELLIPSIS -0EB0 ; [.2DD1.0020.0002] # LAO VOWEL SIGN A -0EB1 ; [.2DD2.0020.0002] # LAO VOWEL SIGN MAI KAN -0EB2 ; [.2DD3.0020.0002] # LAO VOWEL SIGN AA -0EB3 ; [.2DD4.0020.0002] # LAO VOWEL SIGN AM -0ECD 0EB2 ; [.2DD4.0020.0002] # LAO VOWEL SIGN AM -0EB4 ; [.2DD5.0020.0002] # LAO VOWEL SIGN I -0EB5 ; [.2DD6.0020.0002] # LAO VOWEL SIGN II -0EB6 ; [.2DD7.0020.0002] # LAO VOWEL SIGN Y -0EB7 ; [.2DD8.0020.0002] # LAO VOWEL SIGN YY -0EB8 ; [.2DD9.0020.0002] # LAO VOWEL SIGN U -0EB9 ; [.2DDA.0020.0002] # LAO VOWEL SIGN UU -0EBB ; [.2DDB.0020.0002] # LAO VOWEL SIGN MAI KON -0EBC ; [.2DDC.0020.0002] # LAO SEMIVOWEL SIGN LO -0EBD ; [.2DDD.0020.0002] # LAO SEMIVOWEL SIGN NYO -0EC0 ; [.2DDE.0020.0002] # LAO VOWEL SIGN E -0EC1 ; [.2DDF.0020.0002] # LAO VOWEL SIGN EI -0EC2 ; [.2DE0.0020.0002] # LAO VOWEL SIGN O -0EC3 ; [.2DE1.0020.0002] # LAO VOWEL SIGN AY -0EC4 ; [.2DE2.0020.0002] # LAO VOWEL SIGN AI -AA80 ; [.2DE3.0020.0002] # TAI VIET LETTER LOW KO -AAB5 AA80 ; [.2DE3.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KO> -AAB6 AA80 ; [.2DE3.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KO> -AAB9 AA80 ; [.2DE3.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KO> -AABB AA80 ; [.2DE3.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KO> -AABC AA80 ; [.2DE3.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KO> -AA81 ; [.2DE4.0020.0002] # TAI VIET LETTER HIGH KO -AAB5 AA81 ; [.2DE4.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KO> -AAB6 AA81 ; [.2DE4.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KO> -AAB9 AA81 ; [.2DE4.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KO> -AABB AA81 ; [.2DE4.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KO> -AABC AA81 ; [.2DE4.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KO> -AA82 ; [.2DE5.0020.0002] # TAI VIET LETTER LOW KHO -AAB5 AA82 ; [.2DE5.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHO> -AAB6 AA82 ; [.2DE5.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHO> -AAB9 AA82 ; [.2DE5.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHO> -AABB AA82 ; [.2DE5.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHO> -AABC AA82 ; [.2DE5.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHO> -AA83 ; [.2DE6.0020.0002] # TAI VIET LETTER HIGH KHO -AAB5 AA83 ; [.2DE6.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHO> -AAB6 AA83 ; [.2DE6.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHO> -AAB9 AA83 ; [.2DE6.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHO> -AABB AA83 ; [.2DE6.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHO> -AABC AA83 ; [.2DE6.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHO> -AA84 ; [.2DE7.0020.0002] # TAI VIET LETTER LOW KHHO -AAB5 AA84 ; [.2DE7.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHHO> -AAB6 AA84 ; [.2DE7.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHHO> -AAB9 AA84 ; [.2DE7.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHHO> -AABB AA84 ; [.2DE7.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHHO> -AABC AA84 ; [.2DE7.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHHO> -AA85 ; [.2DE8.0020.0002] # TAI VIET LETTER HIGH KHHO -AAB5 AA85 ; [.2DE8.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHHO> -AAB6 AA85 ; [.2DE8.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHHO> -AAB9 AA85 ; [.2DE8.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHHO> -AABB AA85 ; [.2DE8.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHHO> -AABC AA85 ; [.2DE8.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHHO> -AA86 ; [.2DE9.0020.0002] # TAI VIET LETTER LOW GO -AAB5 AA86 ; [.2DE9.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW GO> -AAB6 AA86 ; [.2DE9.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW GO> -AAB9 AA86 ; [.2DE9.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW GO> -AABB AA86 ; [.2DE9.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW GO> -AABC AA86 ; [.2DE9.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW GO> -AA87 ; [.2DEA.0020.0002] # TAI VIET LETTER HIGH GO -AAB5 AA87 ; [.2DEA.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH GO> -AAB6 AA87 ; [.2DEA.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH GO> -AAB9 AA87 ; [.2DEA.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH GO> -AABB AA87 ; [.2DEA.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH GO> -AABC AA87 ; [.2DEA.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH GO> -AA88 ; [.2DEB.0020.0002] # TAI VIET LETTER LOW NGO -AAB5 AA88 ; [.2DEB.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NGO> -AAB6 AA88 ; [.2DEB.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NGO> -AAB9 AA88 ; [.2DEB.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NGO> -AABB AA88 ; [.2DEB.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NGO> -AABC AA88 ; [.2DEB.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NGO> -AA89 ; [.2DEC.0020.0002] # TAI VIET LETTER HIGH NGO -AAB5 AA89 ; [.2DEC.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NGO> -AAB6 AA89 ; [.2DEC.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NGO> -AAB9 AA89 ; [.2DEC.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NGO> -AABB AA89 ; [.2DEC.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NGO> -AABC AA89 ; [.2DEC.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NGO> -AA8A ; [.2DED.0020.0002] # TAI VIET LETTER LOW CO -AAB5 AA8A ; [.2DED.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CO> -AAB6 AA8A ; [.2DED.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CO> -AAB9 AA8A ; [.2DED.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CO> -AABB AA8A ; [.2DED.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CO> -AABC AA8A ; [.2DED.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CO> -AA8B ; [.2DEE.0020.0002] # TAI VIET LETTER HIGH CO -AAB5 AA8B ; [.2DEE.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CO> -AAB6 AA8B ; [.2DEE.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CO> -AAB9 AA8B ; [.2DEE.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CO> -AABB AA8B ; [.2DEE.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CO> -AABC AA8B ; [.2DEE.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CO> -AA8C ; [.2DEF.0020.0002] # TAI VIET LETTER LOW CHO -AAB5 AA8C ; [.2DEF.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CHO> -AAB6 AA8C ; [.2DEF.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CHO> -AAB9 AA8C ; [.2DEF.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CHO> -AABB AA8C ; [.2DEF.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CHO> -AABC AA8C ; [.2DEF.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CHO> -AA8D ; [.2DF0.0020.0002] # TAI VIET LETTER HIGH CHO -AAB5 AA8D ; [.2DF0.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CHO> -AAB6 AA8D ; [.2DF0.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CHO> -AAB9 AA8D ; [.2DF0.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CHO> -AABB AA8D ; [.2DF0.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CHO> -AABC AA8D ; [.2DF0.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CHO> -AA8E ; [.2DF1.0020.0002] # TAI VIET LETTER LOW SO -AAB5 AA8E ; [.2DF1.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW SO> -AAB6 AA8E ; [.2DF1.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW SO> -AAB9 AA8E ; [.2DF1.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW SO> -AABB AA8E ; [.2DF1.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW SO> -AABC AA8E ; [.2DF1.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW SO> -AA8F ; [.2DF2.0020.0002] # TAI VIET LETTER HIGH SO -AAB5 AA8F ; [.2DF2.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH SO> -AAB6 AA8F ; [.2DF2.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH SO> -AAB9 AA8F ; [.2DF2.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH SO> -AABB AA8F ; [.2DF2.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH SO> -AABC AA8F ; [.2DF2.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH SO> -AA90 ; [.2DF3.0020.0002] # TAI VIET LETTER LOW NYO -AAB5 AA90 ; [.2DF3.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NYO> -AAB6 AA90 ; [.2DF3.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NYO> -AAB9 AA90 ; [.2DF3.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NYO> -AABB AA90 ; [.2DF3.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NYO> -AABC AA90 ; [.2DF3.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NYO> -AA91 ; [.2DF4.0020.0002] # TAI VIET LETTER HIGH NYO -AAB5 AA91 ; [.2DF4.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NYO> -AAB6 AA91 ; [.2DF4.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NYO> -AAB9 AA91 ; [.2DF4.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NYO> -AABB AA91 ; [.2DF4.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NYO> -AABC AA91 ; [.2DF4.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NYO> -AA92 ; [.2DF5.0020.0002] # TAI VIET LETTER LOW DO -AAB5 AA92 ; [.2DF5.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW DO> -AAB6 AA92 ; [.2DF5.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW DO> -AAB9 AA92 ; [.2DF5.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW DO> -AABB AA92 ; [.2DF5.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW DO> -AABC AA92 ; [.2DF5.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW DO> -AA93 ; [.2DF6.0020.0002] # TAI VIET LETTER HIGH DO -AAB5 AA93 ; [.2DF6.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH DO> -AAB6 AA93 ; [.2DF6.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH DO> -AAB9 AA93 ; [.2DF6.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH DO> -AABB AA93 ; [.2DF6.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH DO> -AABC AA93 ; [.2DF6.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH DO> -AA94 ; [.2DF7.0020.0002] # TAI VIET LETTER LOW TO -AAB5 AA94 ; [.2DF7.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW TO> -AAB6 AA94 ; [.2DF7.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW TO> -AAB9 AA94 ; [.2DF7.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW TO> -AABB AA94 ; [.2DF7.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW TO> -AABC AA94 ; [.2DF7.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW TO> -AA95 ; [.2DF8.0020.0002] # TAI VIET LETTER HIGH TO -AAB5 AA95 ; [.2DF8.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH TO> -AAB6 AA95 ; [.2DF8.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH TO> -AAB9 AA95 ; [.2DF8.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH TO> -AABB AA95 ; [.2DF8.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH TO> -AABC AA95 ; [.2DF8.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH TO> -AA96 ; [.2DF9.0020.0002] # TAI VIET LETTER LOW THO -AAB5 AA96 ; [.2DF9.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW THO> -AAB6 AA96 ; [.2DF9.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW THO> -AAB9 AA96 ; [.2DF9.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW THO> -AABB AA96 ; [.2DF9.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW THO> -AABC AA96 ; [.2DF9.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW THO> -AA97 ; [.2DFA.0020.0002] # TAI VIET LETTER HIGH THO -AAB5 AA97 ; [.2DFA.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH THO> -AAB6 AA97 ; [.2DFA.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH THO> -AAB9 AA97 ; [.2DFA.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH THO> -AABB AA97 ; [.2DFA.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH THO> -AABC AA97 ; [.2DFA.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH THO> -AA98 ; [.2DFB.0020.0002] # TAI VIET LETTER LOW NO -AAB5 AA98 ; [.2DFB.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NO> -AAB6 AA98 ; [.2DFB.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NO> -AAB9 AA98 ; [.2DFB.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NO> -AABB AA98 ; [.2DFB.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NO> -AABC AA98 ; [.2DFB.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NO> -AA99 ; [.2DFC.0020.0002] # TAI VIET LETTER HIGH NO -AAB5 AA99 ; [.2DFC.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NO> -AAB6 AA99 ; [.2DFC.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NO> -AAB9 AA99 ; [.2DFC.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NO> -AABB AA99 ; [.2DFC.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NO> -AABC AA99 ; [.2DFC.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NO> -AA9A ; [.2DFD.0020.0002] # TAI VIET LETTER LOW BO -AAB5 AA9A ; [.2DFD.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW BO> -AAB6 AA9A ; [.2DFD.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW BO> -AAB9 AA9A ; [.2DFD.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW BO> -AABB AA9A ; [.2DFD.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW BO> -AABC AA9A ; [.2DFD.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW BO> -AA9B ; [.2DFE.0020.0002] # TAI VIET LETTER HIGH BO -AAB5 AA9B ; [.2DFE.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH BO> -AAB6 AA9B ; [.2DFE.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH BO> -AAB9 AA9B ; [.2DFE.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH BO> -AABB AA9B ; [.2DFE.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH BO> -AABC AA9B ; [.2DFE.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH BO> -AA9C ; [.2DFF.0020.0002] # TAI VIET LETTER LOW PO -AAB5 AA9C ; [.2DFF.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PO> -AAB6 AA9C ; [.2DFF.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PO> -AAB9 AA9C ; [.2DFF.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PO> -AABB AA9C ; [.2DFF.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PO> -AABC AA9C ; [.2DFF.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PO> -AA9D ; [.2E00.0020.0002] # TAI VIET LETTER HIGH PO -AAB5 AA9D ; [.2E00.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PO> -AAB6 AA9D ; [.2E00.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PO> -AAB9 AA9D ; [.2E00.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PO> -AABB AA9D ; [.2E00.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PO> -AABC AA9D ; [.2E00.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PO> -AA9E ; [.2E01.0020.0002] # TAI VIET LETTER LOW PHO -AAB5 AA9E ; [.2E01.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PHO> -AAB6 AA9E ; [.2E01.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PHO> -AAB9 AA9E ; [.2E01.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PHO> -AABB AA9E ; [.2E01.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PHO> -AABC AA9E ; [.2E01.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PHO> -AA9F ; [.2E02.0020.0002] # TAI VIET LETTER HIGH PHO -AAB5 AA9F ; [.2E02.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PHO> -AAB6 AA9F ; [.2E02.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PHO> -AAB9 AA9F ; [.2E02.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PHO> -AABB AA9F ; [.2E02.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PHO> -AABC AA9F ; [.2E02.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PHO> -AAA0 ; [.2E03.0020.0002] # TAI VIET LETTER LOW FO -AAB5 AAA0 ; [.2E03.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW FO> -AAB6 AAA0 ; [.2E03.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW FO> -AAB9 AAA0 ; [.2E03.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW FO> -AABB AAA0 ; [.2E03.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW FO> -AABC AAA0 ; [.2E03.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW FO> -AAA1 ; [.2E04.0020.0002] # TAI VIET LETTER HIGH FO -AAB5 AAA1 ; [.2E04.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH FO> -AAB6 AAA1 ; [.2E04.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH FO> -AAB9 AAA1 ; [.2E04.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH FO> -AABB AAA1 ; [.2E04.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH FO> -AABC AAA1 ; [.2E04.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH FO> -AAA2 ; [.2E05.0020.0002] # TAI VIET LETTER LOW MO -AAB5 AAA2 ; [.2E05.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW MO> -AAB6 AAA2 ; [.2E05.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW MO> -AAB9 AAA2 ; [.2E05.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW MO> -AABB AAA2 ; [.2E05.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW MO> -AABC AAA2 ; [.2E05.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW MO> -AAA3 ; [.2E06.0020.0002] # TAI VIET LETTER HIGH MO -AAB5 AAA3 ; [.2E06.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH MO> -AAB6 AAA3 ; [.2E06.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH MO> -AAB9 AAA3 ; [.2E06.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH MO> -AABB AAA3 ; [.2E06.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH MO> -AABC AAA3 ; [.2E06.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH MO> -AAA4 ; [.2E07.0020.0002] # TAI VIET LETTER LOW YO -AAB5 AAA4 ; [.2E07.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW YO> -AAB6 AAA4 ; [.2E07.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW YO> -AAB9 AAA4 ; [.2E07.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW YO> -AABB AAA4 ; [.2E07.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW YO> -AABC AAA4 ; [.2E07.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW YO> -AAA5 ; [.2E08.0020.0002] # TAI VIET LETTER HIGH YO -AAB5 AAA5 ; [.2E08.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH YO> -AAB6 AAA5 ; [.2E08.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH YO> -AAB9 AAA5 ; [.2E08.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH YO> -AABB AAA5 ; [.2E08.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH YO> -AABC AAA5 ; [.2E08.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH YO> -AAA6 ; [.2E09.0020.0002] # TAI VIET LETTER LOW RO -AAB5 AAA6 ; [.2E09.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW RO> -AAB6 AAA6 ; [.2E09.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW RO> -AAB9 AAA6 ; [.2E09.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW RO> -AABB AAA6 ; [.2E09.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW RO> -AABC AAA6 ; [.2E09.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW RO> -AAA7 ; [.2E0A.0020.0002] # TAI VIET LETTER HIGH RO -AAB5 AAA7 ; [.2E0A.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH RO> -AAB6 AAA7 ; [.2E0A.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH RO> -AAB9 AAA7 ; [.2E0A.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH RO> -AABB AAA7 ; [.2E0A.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH RO> -AABC AAA7 ; [.2E0A.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH RO> -AAA8 ; [.2E0B.0020.0002] # TAI VIET LETTER LOW LO -AAB5 AAA8 ; [.2E0B.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW LO> -AAB6 AAA8 ; [.2E0B.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW LO> -AAB9 AAA8 ; [.2E0B.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW LO> -AABB AAA8 ; [.2E0B.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW LO> -AABC AAA8 ; [.2E0B.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW LO> -AAA9 ; [.2E0C.0020.0002] # TAI VIET LETTER HIGH LO -AAB5 AAA9 ; [.2E0C.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH LO> -AAB6 AAA9 ; [.2E0C.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH LO> -AAB9 AAA9 ; [.2E0C.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH LO> -AABB AAA9 ; [.2E0C.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH LO> -AABC AAA9 ; [.2E0C.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH LO> -AAAA ; [.2E0D.0020.0002] # TAI VIET LETTER LOW VO -AAB5 AAAA ; [.2E0D.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW VO> -AAB6 AAAA ; [.2E0D.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW VO> -AAB9 AAAA ; [.2E0D.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW VO> -AABB AAAA ; [.2E0D.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW VO> -AABC AAAA ; [.2E0D.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW VO> -AAAB ; [.2E0E.0020.0002] # TAI VIET LETTER HIGH VO -AAB5 AAAB ; [.2E0E.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH VO> -AAB6 AAAB ; [.2E0E.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH VO> -AAB9 AAAB ; [.2E0E.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH VO> -AABB AAAB ; [.2E0E.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH VO> -AABC AAAB ; [.2E0E.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH VO> -AAAC ; [.2E0F.0020.0002] # TAI VIET LETTER LOW HO -AAB5 AAAC ; [.2E0F.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW HO> -AAB6 AAAC ; [.2E0F.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW HO> -AAB9 AAAC ; [.2E0F.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW HO> -AABB AAAC ; [.2E0F.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW HO> -AABC AAAC ; [.2E0F.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW HO> -AAAD ; [.2E10.0020.0002] # TAI VIET LETTER HIGH HO -AAB5 AAAD ; [.2E10.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH HO> -AAB6 AAAD ; [.2E10.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH HO> -AAB9 AAAD ; [.2E10.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH HO> -AABB AAAD ; [.2E10.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH HO> -AABC AAAD ; [.2E10.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH HO> -AAAE ; [.2E11.0020.0002] # TAI VIET LETTER LOW O -AAB5 AAAE ; [.2E11.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW O> -AAB6 AAAE ; [.2E11.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW O> -AAB9 AAAE ; [.2E11.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW O> -AABB AAAE ; [.2E11.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW O> -AABC AAAE ; [.2E11.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW O> -AAAF ; [.2E12.0020.0002] # TAI VIET LETTER HIGH O -AAB5 AAAF ; [.2E12.0020.0002][.2E18.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH O> -AAB6 AAAF ; [.2E12.0020.0002][.2E19.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH O> -AAB9 AAAF ; [.2E12.0020.0002][.2E1C.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH O> -AABB AAAF ; [.2E12.0020.0002][.2E1E.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH O> -AABC AAAF ; [.2E12.0020.0002][.2E1F.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH O> -AAB0 ; [.2E13.0020.0002] # TAI VIET MAI KANG -AAB1 ; [.2E14.0020.0002] # TAI VIET VOWEL AA -AAB2 ; [.2E15.0020.0002] # TAI VIET VOWEL I -AAB3 ; [.2E16.0020.0002] # TAI VIET VOWEL UE -AAB4 ; [.2E17.0020.0002] # TAI VIET VOWEL U -AAB5 ; [.2E18.0020.0002] # TAI VIET VOWEL E -AAB6 ; [.2E19.0020.0002] # TAI VIET VOWEL O -AAB7 ; [.2E1A.0020.0002] # TAI VIET MAI KHIT -AAB8 ; [.2E1B.0020.0002] # TAI VIET VOWEL IA -AAB9 ; [.2E1C.0020.0002] # TAI VIET VOWEL UEA -AABA ; [.2E1D.0020.0002] # TAI VIET VOWEL UA -AABB ; [.2E1E.0020.0002] # TAI VIET VOWEL AUE -AABC ; [.2E1F.0020.0002] # TAI VIET VOWEL AY -AABD ; [.2E20.0020.0002] # TAI VIET VOWEL AN -AABE ; [.2E21.0020.0002] # TAI VIET VOWEL AM -AAC0 ; [.2E22.0020.0002] # TAI VIET TONE MAI NUENG -AAC2 ; [.2E23.0020.0002] # TAI VIET TONE MAI SONG -AADB ; [.2E24.0020.0002] # TAI VIET SYMBOL KON -AADC ; [.2E25.0020.0002] # TAI VIET SYMBOL NUENG -0F40 ; [.2E26.0020.0002] # TIBETAN LETTER KA -0F69 ; [.2E26.0020.0002][.2E67.0020.0002] # TIBETAN LETTER KSSA -0F90 ; [.2E27.0020.0002] # TIBETAN SUBJOINED LETTER KA -0FB9 ; [.2E27.0020.0002][.2E67.0020.0002] # TIBETAN SUBJOINED LETTER KSSA -0F6B ; [.2E28.0020.0002] # TIBETAN LETTER KKA -0F41 ; [.2E29.0020.0002] # TIBETAN LETTER KHA -0F91 ; [.2E2A.0020.0002] # TIBETAN SUBJOINED LETTER KHA -0F42 ; [.2E2B.0020.0002] # TIBETAN LETTER GA -0F43 ; [.2E2B.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER GHA -0F92 ; [.2E2C.0020.0002] # TIBETAN SUBJOINED LETTER GA -0F93 ; [.2E2C.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER GHA -0F44 ; [.2E2D.0020.0002] # TIBETAN LETTER NGA -0F94 ; [.2E2E.0020.0002] # TIBETAN SUBJOINED LETTER NGA -0F45 ; [.2E2F.0020.0002] # TIBETAN LETTER CA -0F95 ; [.2E30.0020.0002] # TIBETAN SUBJOINED LETTER CA -0F46 ; [.2E31.0020.0002] # TIBETAN LETTER CHA -0F96 ; [.2E32.0020.0002] # TIBETAN SUBJOINED LETTER CHA -0F47 ; [.2E33.0020.0002] # TIBETAN LETTER JA -0F97 ; [.2E34.0020.0002] # TIBETAN SUBJOINED LETTER JA -0F49 ; [.2E35.0020.0002] # TIBETAN LETTER NYA -0F99 ; [.2E36.0020.0002] # TIBETAN SUBJOINED LETTER NYA -0F4A ; [.2E37.0020.0002] # TIBETAN LETTER TTA -0F9A ; [.2E38.0020.0002] # TIBETAN SUBJOINED LETTER TTA -0F4B ; [.2E39.0020.0002] # TIBETAN LETTER TTHA -0F9B ; [.2E3A.0020.0002] # TIBETAN SUBJOINED LETTER TTHA -0F4C ; [.2E3B.0020.0002] # TIBETAN LETTER DDA -0F4D ; [.2E3B.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER DDHA -0F9C ; [.2E3C.0020.0002] # TIBETAN SUBJOINED LETTER DDA -0F9D ; [.2E3C.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER DDHA -0F4E ; [.2E3D.0020.0002] # TIBETAN LETTER NNA -0F9E ; [.2E3E.0020.0002] # TIBETAN SUBJOINED LETTER NNA -0F4F ; [.2E3F.0020.0002] # TIBETAN LETTER TA -0F9F ; [.2E40.0020.0002] # TIBETAN SUBJOINED LETTER TA -0F50 ; [.2E41.0020.0002] # TIBETAN LETTER THA -0FA0 ; [.2E42.0020.0002] # TIBETAN SUBJOINED LETTER THA -0F51 ; [.2E43.0020.0002] # TIBETAN LETTER DA -0F52 ; [.2E43.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER DHA -0FA1 ; [.2E44.0020.0002] # TIBETAN SUBJOINED LETTER DA -0FA2 ; [.2E44.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER DHA -0F53 ; [.2E45.0020.0002] # TIBETAN LETTER NA -0FA3 ; [.2E46.0020.0002] # TIBETAN SUBJOINED LETTER NA -0F54 ; [.2E47.0020.0002] # TIBETAN LETTER PA -0FA4 ; [.2E48.0020.0002] # TIBETAN SUBJOINED LETTER PA -0F55 ; [.2E49.0020.0002] # TIBETAN LETTER PHA -0FA5 ; [.2E4A.0020.0002] # TIBETAN SUBJOINED LETTER PHA -0F56 ; [.2E4B.0020.0002] # TIBETAN LETTER BA -0F57 ; [.2E4B.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER BHA -0FA6 ; [.2E4C.0020.0002] # TIBETAN SUBJOINED LETTER BA -0FA7 ; [.2E4C.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER BHA -0F58 ; [.2E4D.0020.0002] # TIBETAN LETTER MA -0FA8 ; [.2E4E.0020.0002] # TIBETAN SUBJOINED LETTER MA -0F59 ; [.2E4F.0020.0002] # TIBETAN LETTER TSA -0FA9 ; [.2E50.0020.0002] # TIBETAN SUBJOINED LETTER TSA -0F5A ; [.2E51.0020.0002] # TIBETAN LETTER TSHA -0FAA ; [.2E52.0020.0002] # TIBETAN SUBJOINED LETTER TSHA -0F5B ; [.2E53.0020.0002] # TIBETAN LETTER DZA -0F5C ; [.2E53.0020.0002][.2E6B.0020.0002] # TIBETAN LETTER DZHA -0FAB ; [.2E54.0020.0002] # TIBETAN SUBJOINED LETTER DZA -0FAC ; [.2E54.0020.0002][.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER DZHA -0F5D ; [.2E55.0020.0002] # TIBETAN LETTER WA -0FAD ; [.2E56.0020.0002] # TIBETAN SUBJOINED LETTER WA -0FBA ; [.2E56.0020.0004][.0000.0111.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM WA -0F5E ; [.2E57.0020.0002] # TIBETAN LETTER ZHA -0FAE ; [.2E58.0020.0002] # TIBETAN SUBJOINED LETTER ZHA -0F5F ; [.2E59.0020.0002] # TIBETAN LETTER ZA -0FAF ; [.2E5A.0020.0002] # TIBETAN SUBJOINED LETTER ZA -0F60 ; [.2E5B.0020.0002] # TIBETAN LETTER -A -0FB0 ; [.2E5C.0020.0002] # TIBETAN SUBJOINED LETTER -A -0F61 ; [.2E5D.0020.0002] # TIBETAN LETTER YA -0FB1 ; [.2E5E.0020.0002] # TIBETAN SUBJOINED LETTER YA -0FBB ; [.2E5E.0020.0004][.0000.0111.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM YA -0F62 ; [.2E5F.0020.0002] # TIBETAN LETTER RA -0F6A ; [.2E5F.0020.0004][.0000.0111.0004] # TIBETAN LETTER FIXED-FORM RA -0FB2 ; [.2E60.0020.0002] # TIBETAN SUBJOINED LETTER RA -0FBC ; [.2E60.0020.0004][.0000.0111.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM RA -0F6C ; [.2E61.0020.0002] # TIBETAN LETTER RRA -0F63 ; [.2E62.0020.0002] # TIBETAN LETTER LA -0FB3 ; [.2E63.0020.0002] # TIBETAN SUBJOINED LETTER LA -0F64 ; [.2E64.0020.0002] # TIBETAN LETTER SHA -0FB4 ; [.2E65.0020.0002] # TIBETAN SUBJOINED LETTER SHA -0F65 ; [.2E66.0020.0002] # TIBETAN LETTER SSA -0FB5 ; [.2E67.0020.0002] # TIBETAN SUBJOINED LETTER SSA -0F66 ; [.2E68.0020.0002] # TIBETAN LETTER SA -0FB6 ; [.2E69.0020.0002] # TIBETAN SUBJOINED LETTER SA -0F67 ; [.2E6A.0020.0002] # TIBETAN LETTER HA -0FB7 ; [.2E6B.0020.0002] # TIBETAN SUBJOINED LETTER HA -0F68 ; [.2E6C.0020.0002] # TIBETAN LETTER A -0F00 ; [.2E6C.0020.0004][.2E83.0020.0004][.0000.00C4.0004] # TIBETAN SYLLABLE OM -0FB8 ; [.2E6D.0020.0002] # TIBETAN SUBJOINED LETTER A -0F88 ; [.2E6E.0020.0002] # TIBETAN SIGN LCE TSA CAN -0F8D ; [.2E6F.0020.0002] # TIBETAN SUBJOINED SIGN LCE TSA CAN -0F89 ; [.2E70.0020.0002] # TIBETAN SIGN MCHU CAN -0F8E ; [.2E71.0020.0002] # TIBETAN SUBJOINED SIGN MCHU CAN -0F8C ; [.2E72.0020.0002] # TIBETAN SIGN INVERTED MCHU CAN -0F8F ; [.2E73.0020.0002] # TIBETAN SUBJOINED SIGN INVERTED MCHU CAN -0F8A ; [.2E74.0020.0002] # TIBETAN SIGN GRU CAN RGYINGS -0F8B ; [.2E75.0020.0002] # TIBETAN SIGN GRU MED RGYINGS -0F71 ; [.2E76.0020.0002] # TIBETAN VOWEL SIGN AA -0F72 ; [.2E77.0020.0002] # TIBETAN VOWEL SIGN I -0F73 ; [.2E78.0020.0002] # TIBETAN VOWEL SIGN II -0F71 0F72 ; [.2E78.0020.0002] # TIBETAN VOWEL SIGN II -0F80 ; [.2E79.0020.0002] # TIBETAN VOWEL SIGN REVERSED I -0F81 ; [.2E7A.0020.0002] # TIBETAN VOWEL SIGN REVERSED II -0F71 0F80 ; [.2E7A.0020.0002] # TIBETAN VOWEL SIGN REVERSED II -0F74 ; [.2E7B.0020.0002] # TIBETAN VOWEL SIGN U -0F75 ; [.2E7C.0020.0002] # TIBETAN VOWEL SIGN UU -0F71 0F74 ; [.2E7C.0020.0002] # TIBETAN VOWEL SIGN UU -0F76 ; [.2E7D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R -0FB2 0F80 ; [.2E7D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R -0F77 ; [.2E7E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR -0FB2 0F71 0F80 ; [.2E7E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR -0FB2 0F81 ; [.2E7E.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR -0F78 ; [.2E7F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L -0FB3 0F80 ; [.2E7F.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L -0F79 ; [.2E80.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL -0FB3 0F71 0F80 ; [.2E80.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL -0FB3 0F81 ; [.2E80.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL -0F7A ; [.2E81.0020.0002] # TIBETAN VOWEL SIGN E -0F7B ; [.2E82.0020.0002] # TIBETAN VOWEL SIGN EE -0F7C ; [.2E83.0020.0002] # TIBETAN VOWEL SIGN O -0F7D ; [.2E84.0020.0002] # TIBETAN VOWEL SIGN OO -0F84 ; [.2E85.0020.0002] # TIBETAN MARK HALANTA -11C72 ; [.2E86.0020.0002] # MARCHEN LETTER KA -11C92 ; [.2E87.0020.0002] # MARCHEN SUBJOINED LETTER KA -11C73 ; [.2E88.0020.0002] # MARCHEN LETTER KHA -11C93 ; [.2E89.0020.0002] # MARCHEN SUBJOINED LETTER KHA -11C74 ; [.2E8A.0020.0002] # MARCHEN LETTER GA -11C94 ; [.2E8B.0020.0002] # MARCHEN SUBJOINED LETTER GA -11C75 ; [.2E8C.0020.0002] # MARCHEN LETTER NGA -11C95 ; [.2E8D.0020.0002] # MARCHEN SUBJOINED LETTER NGA -11C76 ; [.2E8E.0020.0002] # MARCHEN LETTER CA -11C96 ; [.2E8F.0020.0002] # MARCHEN SUBJOINED LETTER CA -11C77 ; [.2E90.0020.0002] # MARCHEN LETTER CHA -11C97 ; [.2E91.0020.0002] # MARCHEN SUBJOINED LETTER CHA -11C78 ; [.2E92.0020.0002] # MARCHEN LETTER JA -11C98 ; [.2E93.0020.0002] # MARCHEN SUBJOINED LETTER JA -11C79 ; [.2E94.0020.0002] # MARCHEN LETTER NYA -11C99 ; [.2E95.0020.0002] # MARCHEN SUBJOINED LETTER NYA -11C7A ; [.2E96.0020.0002] # MARCHEN LETTER TA -11C9A ; [.2E97.0020.0002] # MARCHEN SUBJOINED LETTER TA -11C7B ; [.2E98.0020.0002] # MARCHEN LETTER THA -11C9B ; [.2E99.0020.0002] # MARCHEN SUBJOINED LETTER THA -11C7C ; [.2E9A.0020.0002] # MARCHEN LETTER DA -11C9C ; [.2E9B.0020.0002] # MARCHEN SUBJOINED LETTER DA -11C7D ; [.2E9C.0020.0002] # MARCHEN LETTER NA -11C9D ; [.2E9D.0020.0002] # MARCHEN SUBJOINED LETTER NA -11C7E ; [.2E9E.0020.0002] # MARCHEN LETTER PA -11C9E ; [.2E9F.0020.0002] # MARCHEN SUBJOINED LETTER PA -11C7F ; [.2EA0.0020.0002] # MARCHEN LETTER PHA -11C9F ; [.2EA1.0020.0002] # MARCHEN SUBJOINED LETTER PHA -11C80 ; [.2EA2.0020.0002] # MARCHEN LETTER BA -11CA0 ; [.2EA3.0020.0002] # MARCHEN SUBJOINED LETTER BA -11C81 ; [.2EA4.0020.0002] # MARCHEN LETTER MA -11CA1 ; [.2EA5.0020.0002] # MARCHEN SUBJOINED LETTER MA -11C82 ; [.2EA6.0020.0002] # MARCHEN LETTER TSA -11CA2 ; [.2EA7.0020.0002] # MARCHEN SUBJOINED LETTER TSA -11C83 ; [.2EA8.0020.0002] # MARCHEN LETTER TSHA -11CA3 ; [.2EA9.0020.0002] # MARCHEN SUBJOINED LETTER TSHA -11C84 ; [.2EAA.0020.0002] # MARCHEN LETTER DZA -11CA4 ; [.2EAB.0020.0002] # MARCHEN SUBJOINED LETTER DZA -11C85 ; [.2EAC.0020.0002] # MARCHEN LETTER WA -11CA5 ; [.2EAD.0020.0002] # MARCHEN SUBJOINED LETTER WA -11C86 ; [.2EAE.0020.0002] # MARCHEN LETTER ZHA -11CA6 ; [.2EAF.0020.0002] # MARCHEN SUBJOINED LETTER ZHA -11C87 ; [.2EB0.0020.0002] # MARCHEN LETTER ZA -11CA7 ; [.2EB1.0020.0002] # MARCHEN SUBJOINED LETTER ZA -11C88 ; [.2EB2.0020.0002] # MARCHEN LETTER -A -11C89 ; [.2EB3.0020.0002] # MARCHEN LETTER YA -11CA9 ; [.2EB4.0020.0002] # MARCHEN SUBJOINED LETTER YA -11C8A ; [.2EB5.0020.0002] # MARCHEN LETTER RA -11CAA ; [.2EB6.0020.0002] # MARCHEN SUBJOINED LETTER RA -11C8B ; [.2EB7.0020.0002] # MARCHEN LETTER LA -11CAB ; [.2EB8.0020.0002] # MARCHEN SUBJOINED LETTER LA -11C8C ; [.2EB9.0020.0002] # MARCHEN LETTER SHA -11CAC ; [.2EBA.0020.0002] # MARCHEN SUBJOINED LETTER SHA -11C8D ; [.2EBB.0020.0002] # MARCHEN LETTER SA -11CAD ; [.2EBC.0020.0002] # MARCHEN SUBJOINED LETTER SA -11C8E ; [.2EBD.0020.0002] # MARCHEN LETTER HA -11CAE ; [.2EBE.0020.0002] # MARCHEN SUBJOINED LETTER HA -11C8F ; [.2EBF.0020.0002] # MARCHEN LETTER A -11CAF ; [.2EC0.0020.0002] # MARCHEN SUBJOINED LETTER A -11CB0 ; [.2EC1.0020.0002] # MARCHEN VOWEL SIGN AA -11CB1 ; [.2EC2.0020.0002] # MARCHEN VOWEL SIGN I -11CB2 ; [.2EC3.0020.0002] # MARCHEN VOWEL SIGN U -11CB3 ; [.2EC4.0020.0002] # MARCHEN VOWEL SIGN E -11CB4 ; [.2EC5.0020.0002] # MARCHEN VOWEL SIGN O -1C00 ; [.2EC6.0020.0002] # LEPCHA LETTER KA -1C01 ; [.2EC7.0020.0002] # LEPCHA LETTER KLA -1C02 ; [.2EC8.0020.0002] # LEPCHA LETTER KHA -1C03 ; [.2EC9.0020.0002] # LEPCHA LETTER GA -1C04 ; [.2ECA.0020.0002] # LEPCHA LETTER GLA -1C05 ; [.2ECB.0020.0002] # LEPCHA LETTER NGA -1C06 ; [.2ECC.0020.0002] # LEPCHA LETTER CA -1C07 ; [.2ECD.0020.0002] # LEPCHA LETTER CHA -1C08 ; [.2ECE.0020.0002] # LEPCHA LETTER JA -1C09 ; [.2ECF.0020.0002] # LEPCHA LETTER NYA -1C4D ; [.2ED0.0020.0002] # LEPCHA LETTER TTA -1C4E ; [.2ED1.0020.0002] # LEPCHA LETTER TTHA -1C4F ; [.2ED2.0020.0002] # LEPCHA LETTER DDA -1C0A ; [.2ED3.0020.0002] # LEPCHA LETTER TA -1C0B ; [.2ED4.0020.0002] # LEPCHA LETTER THA -1C0C ; [.2ED5.0020.0002] # LEPCHA LETTER DA -1C0D ; [.2ED6.0020.0002] # LEPCHA LETTER NA -1C0E ; [.2ED7.0020.0002] # LEPCHA LETTER PA -1C0F ; [.2ED8.0020.0002] # LEPCHA LETTER PLA -1C10 ; [.2ED9.0020.0002] # LEPCHA LETTER PHA -1C11 ; [.2EDA.0020.0002] # LEPCHA LETTER FA -1C12 ; [.2EDB.0020.0002] # LEPCHA LETTER FLA -1C13 ; [.2EDC.0020.0002] # LEPCHA LETTER BA -1C14 ; [.2EDD.0020.0002] # LEPCHA LETTER BLA -1C15 ; [.2EDE.0020.0002] # LEPCHA LETTER MA -1C16 ; [.2EDF.0020.0002] # LEPCHA LETTER MLA -1C17 ; [.2EE0.0020.0002] # LEPCHA LETTER TSA -1C18 ; [.2EE1.0020.0002] # LEPCHA LETTER TSHA -1C19 ; [.2EE2.0020.0002] # LEPCHA LETTER DZA -1C1A ; [.2EE3.0020.0002] # LEPCHA LETTER YA -1C24 ; [.2EE4.0020.0002] # LEPCHA SUBJOINED LETTER YA -1C1B ; [.2EE5.0020.0002] # LEPCHA LETTER RA -1C25 ; [.2EE6.0020.0002] # LEPCHA SUBJOINED LETTER RA -1C1C ; [.2EE7.0020.0002] # LEPCHA LETTER LA -1C1D ; [.2EE8.0020.0002] # LEPCHA LETTER HA -1C1E ; [.2EE9.0020.0002] # LEPCHA LETTER HLA -1C1F ; [.2EEA.0020.0002] # LEPCHA LETTER VA -1C20 ; [.2EEB.0020.0002] # LEPCHA LETTER SA -1C21 ; [.2EEC.0020.0002] # LEPCHA LETTER SHA -1C22 ; [.2EED.0020.0002] # LEPCHA LETTER WA -1C23 ; [.2EEE.0020.0002] # LEPCHA LETTER A -1C36 ; [.2EEF.0020.0002] # LEPCHA SIGN RAN -1C26 ; [.2EF0.0020.0002] # LEPCHA VOWEL SIGN AA -1C27 ; [.2EF1.0020.0002] # LEPCHA VOWEL SIGN I -1C28 ; [.2EF2.0020.0002] # LEPCHA VOWEL SIGN O -1C29 ; [.2EF3.0020.0002] # LEPCHA VOWEL SIGN OO -1C2A ; [.2EF4.0020.0002] # LEPCHA VOWEL SIGN U -1C2B ; [.2EF5.0020.0002] # LEPCHA VOWEL SIGN UU -1C2C ; [.2EF6.0020.0002] # LEPCHA VOWEL SIGN E -1C2D ; [.2EF7.0020.0002] # LEPCHA CONSONANT SIGN K -1C2E ; [.2EF8.0020.0002] # LEPCHA CONSONANT SIGN M -1C2F ; [.2EF9.0020.0002] # LEPCHA CONSONANT SIGN L -1C30 ; [.2EFA.0020.0002] # LEPCHA CONSONANT SIGN N -1C31 ; [.2EFB.0020.0002] # LEPCHA CONSONANT SIGN P -1C32 ; [.2EFC.0020.0002] # LEPCHA CONSONANT SIGN R -1C33 ; [.2EFD.0020.0002] # LEPCHA CONSONANT SIGN T -1C34 ; [.2EFE.0020.0002] # LEPCHA CONSONANT SIGN NYIN-DO -1C35 ; [.2EFF.0020.0002] # LEPCHA CONSONANT SIGN KANG -A840 ; [.2F00.0020.0002] # PHAGS-PA LETTER KA -A841 ; [.2F01.0020.0002] # PHAGS-PA LETTER KHA -A842 ; [.2F02.0020.0002] # PHAGS-PA LETTER GA -A843 ; [.2F03.0020.0002] # PHAGS-PA LETTER NGA -A844 ; [.2F04.0020.0002] # PHAGS-PA LETTER CA -A845 ; [.2F05.0020.0002] # PHAGS-PA LETTER CHA -A846 ; [.2F06.0020.0002] # PHAGS-PA LETTER JA -A847 ; [.2F07.0020.0002] # PHAGS-PA LETTER NYA -A869 ; [.2F08.0020.0002] # PHAGS-PA LETTER TTA -A86A ; [.2F09.0020.0002] # PHAGS-PA LETTER TTHA -A86B ; [.2F0A.0020.0002] # PHAGS-PA LETTER DDA -A86C ; [.2F0B.0020.0002] # PHAGS-PA LETTER NNA -A848 ; [.2F0C.0020.0002] # PHAGS-PA LETTER TA -A849 ; [.2F0D.0020.0002] # PHAGS-PA LETTER THA -A84A ; [.2F0E.0020.0002] # PHAGS-PA LETTER DA -A84B ; [.2F0F.0020.0002] # PHAGS-PA LETTER NA -A84C ; [.2F10.0020.0002] # PHAGS-PA LETTER PA -A84D ; [.2F11.0020.0002] # PHAGS-PA LETTER PHA -A84E ; [.2F12.0020.0002] # PHAGS-PA LETTER BA -A84F ; [.2F13.0020.0002] # PHAGS-PA LETTER MA -A850 ; [.2F14.0020.0002] # PHAGS-PA LETTER TSA -A851 ; [.2F15.0020.0002] # PHAGS-PA LETTER TSHA -A852 ; [.2F16.0020.0002] # PHAGS-PA LETTER DZA -A853 ; [.2F17.0020.0002] # PHAGS-PA LETTER WA -A867 ; [.2F18.0020.0002] # PHAGS-PA SUBJOINED LETTER WA -A854 ; [.2F19.0020.0002] # PHAGS-PA LETTER ZHA -A855 ; [.2F1A.0020.0002] # PHAGS-PA LETTER ZA -A856 ; [.2F1B.0020.0002] # PHAGS-PA LETTER SMALL A -A857 ; [.2F1C.0020.0002] # PHAGS-PA LETTER YA -A868 ; [.2F1D.0020.0002] # PHAGS-PA SUBJOINED LETTER YA -A86D ; [.2F1E.0020.0002] # PHAGS-PA LETTER ALTERNATE YA -A858 ; [.2F1F.0020.0002] # PHAGS-PA LETTER RA -A871 ; [.2F20.0020.0002] # PHAGS-PA SUBJOINED LETTER RA -A872 ; [.2F21.0020.0002] # PHAGS-PA SUPERFIXED LETTER RA -A859 ; [.2F22.0020.0002] # PHAGS-PA LETTER LA -A85A ; [.2F23.0020.0002] # PHAGS-PA LETTER SHA -A86E ; [.2F24.0020.0002] # PHAGS-PA LETTER VOICELESS SHA -A85B ; [.2F25.0020.0002] # PHAGS-PA LETTER SA -A85C ; [.2F26.0020.0002] # PHAGS-PA LETTER HA -A86F ; [.2F27.0020.0002] # PHAGS-PA LETTER VOICED HA -A870 ; [.2F28.0020.0002] # PHAGS-PA LETTER ASPIRATED FA -A85D ; [.2F29.0020.0002] # PHAGS-PA LETTER A -A862 ; [.2F2A.0020.0002] # PHAGS-PA LETTER QA -A863 ; [.2F2B.0020.0002] # PHAGS-PA LETTER XA -A864 ; [.2F2C.0020.0002] # PHAGS-PA LETTER FA -A865 ; [.2F2D.0020.0002] # PHAGS-PA LETTER GGA -A85E ; [.2F2E.0020.0002] # PHAGS-PA LETTER I -A85F ; [.2F2F.0020.0002] # PHAGS-PA LETTER U -A860 ; [.2F30.0020.0002] # PHAGS-PA LETTER E -A861 ; [.2F31.0020.0002] # PHAGS-PA LETTER O -A866 ; [.2F32.0020.0002] # PHAGS-PA LETTER EE -A873 ; [.2F33.0020.0002] # PHAGS-PA LETTER CANDRABINDU -1900 ; [.2F34.0020.0002] # LIMBU VOWEL-CARRIER LETTER -1901 ; [.2F35.0020.0002] # LIMBU LETTER KA -1902 ; [.2F36.0020.0002] # LIMBU LETTER KHA -1903 ; [.2F37.0020.0002] # LIMBU LETTER GA -1904 ; [.2F38.0020.0002] # LIMBU LETTER GHA -1905 ; [.2F39.0020.0002] # LIMBU LETTER NGA -1906 ; [.2F3A.0020.0002] # LIMBU LETTER CA -1907 ; [.2F3B.0020.0002] # LIMBU LETTER CHA -1908 ; [.2F3C.0020.0002] # LIMBU LETTER JA -191D ; [.2F3C.0020.0004][.2F5A.0020.0004] # LIMBU LETTER GYAN -1909 ; [.2F3D.0020.0002] # LIMBU LETTER JHA -190A ; [.2F3E.0020.0002] # LIMBU LETTER YAN -190B ; [.2F3F.0020.0002] # LIMBU LETTER TA -191E ; [.2F3F.0020.0004][.2F5B.0020.0004] # LIMBU LETTER TRA -190C ; [.2F40.0020.0002] # LIMBU LETTER THA -190D ; [.2F41.0020.0002] # LIMBU LETTER DA -190E ; [.2F42.0020.0002] # LIMBU LETTER DHA -190F ; [.2F43.0020.0002] # LIMBU LETTER NA -1910 ; [.2F44.0020.0002] # LIMBU LETTER PA -1911 ; [.2F45.0020.0002] # LIMBU LETTER PHA -1912 ; [.2F46.0020.0002] # LIMBU LETTER BA -1913 ; [.2F47.0020.0002] # LIMBU LETTER BHA -1914 ; [.2F48.0020.0002] # LIMBU LETTER MA -1915 ; [.2F49.0020.0002] # LIMBU LETTER YA -1916 ; [.2F4A.0020.0002] # LIMBU LETTER RA -1917 ; [.2F4B.0020.0002] # LIMBU LETTER LA -1918 ; [.2F4C.0020.0002] # LIMBU LETTER WA -1919 ; [.2F4D.0020.0002] # LIMBU LETTER SHA -191A ; [.2F4E.0020.0002] # LIMBU LETTER SSA -191B ; [.2F4F.0020.0002] # LIMBU LETTER SA -191C ; [.2F50.0020.0002] # LIMBU LETTER HA -1920 ; [.2F51.0020.0002] # LIMBU VOWEL SIGN A -1921 ; [.2F52.0020.0002] # LIMBU VOWEL SIGN I -1922 ; [.2F53.0020.0002] # LIMBU VOWEL SIGN U -1923 ; [.2F54.0020.0002] # LIMBU VOWEL SIGN EE -1924 ; [.2F55.0020.0002] # LIMBU VOWEL SIGN AI -1925 ; [.2F56.0020.0002] # LIMBU VOWEL SIGN OO -1926 ; [.2F57.0020.0002] # LIMBU VOWEL SIGN AU -1927 ; [.2F58.0020.0002] # LIMBU VOWEL SIGN E -1928 ; [.2F59.0020.0002] # LIMBU VOWEL SIGN O -1929 ; [.2F5A.0020.0002] # LIMBU SUBJOINED LETTER YA -192A ; [.2F5B.0020.0002] # LIMBU SUBJOINED LETTER RA -192B ; [.2F5C.0020.0002] # LIMBU SUBJOINED LETTER WA -1930 ; [.2F5D.0020.0002] # LIMBU SMALL LETTER KA -1931 ; [.2F5E.0020.0002] # LIMBU SMALL LETTER NGA -1932 ; [.2F5F.0020.0002] # LIMBU SMALL LETTER ANUSVARA -1933 ; [.2F60.0020.0002] # LIMBU SMALL LETTER TA -1934 ; [.2F61.0020.0002] # LIMBU SMALL LETTER NA -1935 ; [.2F62.0020.0002] # LIMBU SMALL LETTER PA -1936 ; [.2F63.0020.0002] # LIMBU SMALL LETTER MA -1937 ; [.2F64.0020.0002] # LIMBU SMALL LETTER RA -1938 ; [.2F65.0020.0002] # LIMBU SMALL LETTER LA -1700 ; [.2F66.0020.0002] # TAGALOG LETTER A -1701 ; [.2F67.0020.0002] # TAGALOG LETTER I -1702 ; [.2F68.0020.0002] # TAGALOG LETTER U -1703 ; [.2F69.0020.0002] # TAGALOG LETTER KA -1704 ; [.2F6A.0020.0002] # TAGALOG LETTER GA -1705 ; [.2F6B.0020.0002] # TAGALOG LETTER NGA -1706 ; [.2F6C.0020.0002] # TAGALOG LETTER TA -1707 ; [.2F6D.0020.0002] # TAGALOG LETTER DA -1708 ; [.2F6E.0020.0002] # TAGALOG LETTER NA -1709 ; [.2F6F.0020.0002] # TAGALOG LETTER PA -170A ; [.2F70.0020.0002] # TAGALOG LETTER BA -170B ; [.2F71.0020.0002] # TAGALOG LETTER MA -170C ; [.2F72.0020.0002] # TAGALOG LETTER YA -170E ; [.2F73.0020.0002] # TAGALOG LETTER LA -170F ; [.2F74.0020.0002] # TAGALOG LETTER WA -1710 ; [.2F75.0020.0002] # TAGALOG LETTER SA -1711 ; [.2F76.0020.0002] # TAGALOG LETTER HA -1712 ; [.2F77.0020.0002] # TAGALOG VOWEL SIGN I -1713 ; [.2F78.0020.0002] # TAGALOG VOWEL SIGN U -1714 ; [.2F79.0020.0002] # TAGALOG SIGN VIRAMA -1720 ; [.2F7A.0020.0002] # HANUNOO LETTER A -1721 ; [.2F7B.0020.0002] # HANUNOO LETTER I -1722 ; [.2F7C.0020.0002] # HANUNOO LETTER U -1723 ; [.2F7D.0020.0002] # HANUNOO LETTER KA -1724 ; [.2F7E.0020.0002] # HANUNOO LETTER GA -1725 ; [.2F7F.0020.0002] # HANUNOO LETTER NGA -1726 ; [.2F80.0020.0002] # HANUNOO LETTER TA -1727 ; [.2F81.0020.0002] # HANUNOO LETTER DA -1728 ; [.2F82.0020.0002] # HANUNOO LETTER NA -1729 ; [.2F83.0020.0002] # HANUNOO LETTER PA -172A ; [.2F84.0020.0002] # HANUNOO LETTER BA -172B ; [.2F85.0020.0002] # HANUNOO LETTER MA -172C ; [.2F86.0020.0002] # HANUNOO LETTER YA -172D ; [.2F87.0020.0002] # HANUNOO LETTER RA -172E ; [.2F88.0020.0002] # HANUNOO LETTER LA -172F ; [.2F89.0020.0002] # HANUNOO LETTER WA -1730 ; [.2F8A.0020.0002] # HANUNOO LETTER SA -1731 ; [.2F8B.0020.0002] # HANUNOO LETTER HA -1732 ; [.2F8C.0020.0002] # HANUNOO VOWEL SIGN I -1733 ; [.2F8D.0020.0002] # HANUNOO VOWEL SIGN U -1734 ; [.2F8E.0020.0002] # HANUNOO SIGN PAMUDPOD -1740 ; [.2F8F.0020.0002] # BUHID LETTER A -1741 ; [.2F90.0020.0002] # BUHID LETTER I -1742 ; [.2F91.0020.0002] # BUHID LETTER U -1743 ; [.2F92.0020.0002] # BUHID LETTER KA -1744 ; [.2F93.0020.0002] # BUHID LETTER GA -1745 ; [.2F94.0020.0002] # BUHID LETTER NGA -1746 ; [.2F95.0020.0002] # BUHID LETTER TA -1747 ; [.2F96.0020.0002] # BUHID LETTER DA -1748 ; [.2F97.0020.0002] # BUHID LETTER NA -1749 ; [.2F98.0020.0002] # BUHID LETTER PA -174A ; [.2F99.0020.0002] # BUHID LETTER BA -174B ; [.2F9A.0020.0002] # BUHID LETTER MA -174C ; [.2F9B.0020.0002] # BUHID LETTER YA -174D ; [.2F9C.0020.0002] # BUHID LETTER RA -174E ; [.2F9D.0020.0002] # BUHID LETTER LA -174F ; [.2F9E.0020.0002] # BUHID LETTER WA -1750 ; [.2F9F.0020.0002] # BUHID LETTER SA -1751 ; [.2FA0.0020.0002] # BUHID LETTER HA -1752 ; [.2FA1.0020.0002] # BUHID VOWEL SIGN I -1753 ; [.2FA2.0020.0002] # BUHID VOWEL SIGN U -1760 ; [.2FA3.0020.0002] # TAGBANWA LETTER A -1761 ; [.2FA4.0020.0002] # TAGBANWA LETTER I -1762 ; [.2FA5.0020.0002] # TAGBANWA LETTER U -1763 ; [.2FA6.0020.0002] # TAGBANWA LETTER KA -1764 ; [.2FA7.0020.0002] # TAGBANWA LETTER GA -1765 ; [.2FA8.0020.0002] # TAGBANWA LETTER NGA -1766 ; [.2FA9.0020.0002] # TAGBANWA LETTER TA -1767 ; [.2FAA.0020.0002] # TAGBANWA LETTER DA -1768 ; [.2FAB.0020.0002] # TAGBANWA LETTER NA -1769 ; [.2FAC.0020.0002] # TAGBANWA LETTER PA -176A ; [.2FAD.0020.0002] # TAGBANWA LETTER BA -176B ; [.2FAE.0020.0002] # TAGBANWA LETTER MA -176C ; [.2FAF.0020.0002] # TAGBANWA LETTER YA -176E ; [.2FB0.0020.0002] # TAGBANWA LETTER LA -176F ; [.2FB1.0020.0002] # TAGBANWA LETTER WA -1770 ; [.2FB2.0020.0002] # TAGBANWA LETTER SA -1772 ; [.2FB3.0020.0002] # TAGBANWA VOWEL SIGN I -1773 ; [.2FB4.0020.0002] # TAGBANWA VOWEL SIGN U -1A00 ; [.2FB5.0020.0002] # BUGINESE LETTER KA -1A01 ; [.2FB6.0020.0002] # BUGINESE LETTER GA -1A02 ; [.2FB7.0020.0002] # BUGINESE LETTER NGA -1A03 ; [.2FB8.0020.0002] # BUGINESE LETTER NGKA -1A04 ; [.2FB9.0020.0002] # BUGINESE LETTER PA -1A05 ; [.2FBA.0020.0002] # BUGINESE LETTER BA -1A06 ; [.2FBB.0020.0002] # BUGINESE LETTER MA -1A07 ; [.2FBC.0020.0002] # BUGINESE LETTER MPA -1A08 ; [.2FBD.0020.0002] # BUGINESE LETTER TA -1A09 ; [.2FBE.0020.0002] # BUGINESE LETTER DA -1A0A ; [.2FBF.0020.0002] # BUGINESE LETTER NA -1A0B ; [.2FC0.0020.0002] # BUGINESE LETTER NRA -1A0C ; [.2FC1.0020.0002] # BUGINESE LETTER CA -1A0D ; [.2FC2.0020.0002] # BUGINESE LETTER JA -1A0E ; [.2FC3.0020.0002] # BUGINESE LETTER NYA -1A0F ; [.2FC4.0020.0002] # BUGINESE LETTER NYCA -1A10 ; [.2FC5.0020.0002] # BUGINESE LETTER YA -1A11 ; [.2FC6.0020.0002] # BUGINESE LETTER RA -1A12 ; [.2FC7.0020.0002] # BUGINESE LETTER LA -1A13 ; [.2FC8.0020.0002] # BUGINESE LETTER VA -1A14 ; [.2FC9.0020.0002] # BUGINESE LETTER SA -1A15 ; [.2FCA.0020.0002] # BUGINESE LETTER A -1A16 ; [.2FCB.0020.0002] # BUGINESE LETTER HA -1A17 ; [.2FCC.0020.0002] # BUGINESE VOWEL SIGN I -1A18 ; [.2FCD.0020.0002] # BUGINESE VOWEL SIGN U -1A19 ; [.2FCE.0020.0002] # BUGINESE VOWEL SIGN E -1A1A ; [.2FCF.0020.0002] # BUGINESE VOWEL SIGN O -1A1B ; [.2FD0.0020.0002] # BUGINESE VOWEL SIGN AE -1BC0 ; [.2FD1.0020.0002] # BATAK LETTER A -1BC1 ; [.2FD1.0020.0004] # BATAK LETTER SIMALUNGUN A -1BC2 ; [.2FD2.0020.0002] # BATAK LETTER HA -1BC3 ; [.2FD2.0020.0004] # BATAK LETTER SIMALUNGUN HA -1BC4 ; [.2FD2.0020.0004] # BATAK LETTER MANDAILING HA -1BC5 ; [.2FD3.0020.0002] # BATAK LETTER BA -1BC6 ; [.2FD3.0020.0004] # BATAK LETTER KARO BA -1BC7 ; [.2FD4.0020.0002] # BATAK LETTER PA -1BC8 ; [.2FD4.0020.0004] # BATAK LETTER SIMALUNGUN PA -1BC9 ; [.2FD5.0020.0002] # BATAK LETTER NA -1BCA ; [.2FD5.0020.0004] # BATAK LETTER MANDAILING NA -1BCB ; [.2FD6.0020.0002] # BATAK LETTER WA -1BCC ; [.2FD6.0020.0004] # BATAK LETTER SIMALUNGUN WA -1BCD ; [.2FD6.0020.0004] # BATAK LETTER PAKPAK WA -1BCE ; [.2FD7.0020.0002] # BATAK LETTER GA -1BCF ; [.2FD7.0020.0004] # BATAK LETTER SIMALUNGUN GA -1BD0 ; [.2FD8.0020.0002] # BATAK LETTER JA -1BD1 ; [.2FD9.0020.0002] # BATAK LETTER DA -1BD2 ; [.2FDA.0020.0002] # BATAK LETTER RA -1BD3 ; [.2FDA.0020.0004] # BATAK LETTER SIMALUNGUN RA -1BD4 ; [.2FDB.0020.0002] # BATAK LETTER MA -1BD5 ; [.2FDB.0020.0004] # BATAK LETTER SIMALUNGUN MA -1BD6 ; [.2FDC.0020.0002] # BATAK LETTER SOUTHERN TA -1BD7 ; [.2FDC.0020.0004] # BATAK LETTER NORTHERN TA -1BD8 ; [.2FDD.0020.0002] # BATAK LETTER SA -1BD9 ; [.2FDD.0020.0004] # BATAK LETTER SIMALUNGUN SA -1BDA ; [.2FDD.0020.0004] # BATAK LETTER MANDAILING SA -1BDB ; [.2FDE.0020.0002] # BATAK LETTER YA -1BDC ; [.2FDE.0020.0004] # BATAK LETTER SIMALUNGUN YA -1BDD ; [.2FDF.0020.0002] # BATAK LETTER NGA -1BDE ; [.2FE0.0020.0002] # BATAK LETTER LA -1BDF ; [.2FE0.0020.0004] # BATAK LETTER SIMALUNGUN LA -1BE0 ; [.2FE1.0020.0002] # BATAK LETTER NYA -1BE1 ; [.2FE2.0020.0002] # BATAK LETTER CA -1BE2 ; [.2FE3.0020.0002] # BATAK LETTER NDA -1BE3 ; [.2FE4.0020.0002] # BATAK LETTER MBA -1BE4 ; [.2FE5.0020.0002] # BATAK LETTER I -1BE5 ; [.2FE6.0020.0002] # BATAK LETTER U -1BE7 ; [.2FE7.0020.0002] # BATAK VOWEL SIGN E -1BE8 ; [.2FE7.0020.0004] # BATAK VOWEL SIGN PAKPAK E -1BE9 ; [.2FE8.0020.0002] # BATAK VOWEL SIGN EE -1BEA ; [.2FE9.0020.0002] # BATAK VOWEL SIGN I -1BEB ; [.2FE9.0020.0004] # BATAK VOWEL SIGN KARO I -1BEC ; [.2FEA.0020.0002] # BATAK VOWEL SIGN O -1BED ; [.2FEA.0020.0004] # BATAK VOWEL SIGN KARO O -1BEE ; [.2FEB.0020.0002] # BATAK VOWEL SIGN U -1BEF ; [.2FEB.0020.0004] # BATAK VOWEL SIGN U FOR SIMALUNGUN SA -1BF0 ; [.2FEC.0020.0002] # BATAK CONSONANT SIGN NG -1BF1 ; [.2FED.0020.0002] # BATAK CONSONANT SIGN H -1BF2 ; [.2FEE.0020.0002] # BATAK PANGOLAT -1BF3 ; [.2FEF.0020.0002] # BATAK PANONGONAN -A930 ; [.2FF0.0020.0002] # REJANG LETTER KA -A931 ; [.2FF1.0020.0002] # REJANG LETTER GA -A932 ; [.2FF2.0020.0002] # REJANG LETTER NGA -A933 ; [.2FF3.0020.0002] # REJANG LETTER TA -A934 ; [.2FF4.0020.0002] # REJANG LETTER DA -A935 ; [.2FF5.0020.0002] # REJANG LETTER NA -A936 ; [.2FF6.0020.0002] # REJANG LETTER PA -A937 ; [.2FF7.0020.0002] # REJANG LETTER BA -A938 ; [.2FF8.0020.0002] # REJANG LETTER MA -A939 ; [.2FF9.0020.0002] # REJANG LETTER CA -A93A ; [.2FFA.0020.0002] # REJANG LETTER JA -A93B ; [.2FFB.0020.0002] # REJANG LETTER NYA -A93C ; [.2FFC.0020.0002] # REJANG LETTER SA -A93D ; [.2FFD.0020.0002] # REJANG LETTER RA -A93E ; [.2FFE.0020.0002] # REJANG LETTER LA -A93F ; [.2FFF.0020.0002] # REJANG LETTER YA -A940 ; [.3000.0020.0002] # REJANG LETTER WA -A941 ; [.3001.0020.0002] # REJANG LETTER HA -A942 ; [.3002.0020.0002] # REJANG LETTER MBA -A943 ; [.3003.0020.0002] # REJANG LETTER NGGA -A944 ; [.3004.0020.0002] # REJANG LETTER NDA -A945 ; [.3005.0020.0002] # REJANG LETTER NYJA -A946 ; [.3006.0020.0002] # REJANG LETTER A -A947 ; [.3007.0020.0002] # REJANG VOWEL SIGN I -A948 ; [.3008.0020.0002] # REJANG VOWEL SIGN U -A949 ; [.3009.0020.0002] # REJANG VOWEL SIGN E -A94A ; [.300A.0020.0002] # REJANG VOWEL SIGN AI -A94B ; [.300B.0020.0002] # REJANG VOWEL SIGN O -A94C ; [.300C.0020.0002] # REJANG VOWEL SIGN AU -A94D ; [.300D.0020.0002] # REJANG VOWEL SIGN EU -A94E ; [.300E.0020.0002] # REJANG VOWEL SIGN EA -A94F ; [.300F.0020.0002] # REJANG CONSONANT SIGN NG -A950 ; [.3010.0020.0002] # REJANG CONSONANT SIGN N -A951 ; [.3011.0020.0002] # REJANG CONSONANT SIGN R -A952 ; [.3012.0020.0002] # REJANG CONSONANT SIGN H -A953 ; [.3013.0020.0002] # REJANG VIRAMA -A90A ; [.3014.0020.0002] # KAYAH LI LETTER KA -A90B ; [.3015.0020.0002] # KAYAH LI LETTER KHA -A90C ; [.3016.0020.0002] # KAYAH LI LETTER GA -A90D ; [.3017.0020.0002] # KAYAH LI LETTER NGA -A90E ; [.3018.0020.0002] # KAYAH LI LETTER SA -A90F ; [.3019.0020.0002] # KAYAH LI LETTER SHA -A910 ; [.301A.0020.0002] # KAYAH LI LETTER ZA -A911 ; [.301B.0020.0002] # KAYAH LI LETTER NYA -A912 ; [.301C.0020.0002] # KAYAH LI LETTER TA -A913 ; [.301D.0020.0002] # KAYAH LI LETTER HTA -A914 ; [.301E.0020.0002] # KAYAH LI LETTER NA -A915 ; [.301F.0020.0002] # KAYAH LI LETTER PA -A916 ; [.3020.0020.0002] # KAYAH LI LETTER PHA -A917 ; [.3021.0020.0002] # KAYAH LI LETTER MA -A918 ; [.3022.0020.0002] # KAYAH LI LETTER DA -A919 ; [.3023.0020.0002] # KAYAH LI LETTER BA -A91A ; [.3024.0020.0002] # KAYAH LI LETTER RA -A91B ; [.3025.0020.0002] # KAYAH LI LETTER YA -A91C ; [.3026.0020.0002] # KAYAH LI LETTER LA -A91D ; [.3027.0020.0002] # KAYAH LI LETTER WA -A91E ; [.3028.0020.0002] # KAYAH LI LETTER THA -A91F ; [.3029.0020.0002] # KAYAH LI LETTER HA -A920 ; [.302A.0020.0002] # KAYAH LI LETTER VA -A921 ; [.302B.0020.0002] # KAYAH LI LETTER CA -A922 ; [.302C.0020.0002] # KAYAH LI LETTER A -A923 ; [.302D.0020.0002] # KAYAH LI LETTER OE -A924 ; [.302E.0020.0002] # KAYAH LI LETTER I -A925 ; [.302F.0020.0002] # KAYAH LI LETTER OO -A926 ; [.3030.0020.0002] # KAYAH LI VOWEL UE -A927 ; [.3031.0020.0002] # KAYAH LI VOWEL E -A928 ; [.3032.0020.0002] # KAYAH LI VOWEL U -A929 ; [.3033.0020.0002] # KAYAH LI VOWEL EE -A92A ; [.3034.0020.0002] # KAYAH LI VOWEL O -1000 ; [.3035.0020.0002] # MYANMAR LETTER KA -1075 ; [.3036.0020.0002] # MYANMAR LETTER SHAN KA -1001 ; [.3037.0020.0002] # MYANMAR LETTER KHA -1076 ; [.3038.0020.0002] # MYANMAR LETTER SHAN KHA -1002 ; [.3039.0020.0002] # MYANMAR LETTER GA -1077 ; [.303A.0020.0002] # MYANMAR LETTER SHAN GA -AA60 ; [.303B.0020.0002] # MYANMAR LETTER KHAMTI GA -A9E9 ; [.303C.0020.0002] # MYANMAR LETTER TAI LAING GA -1003 ; [.303D.0020.0002] # MYANMAR LETTER GHA -A9E0 ; [.303E.0020.0002] # MYANMAR LETTER SHAN GHA -A9EA ; [.303F.0020.0002] # MYANMAR LETTER TAI LAING GHA -1004 ; [.3040.0020.0002] # MYANMAR LETTER NGA -105A ; [.3041.0020.0002] # MYANMAR LETTER MON NGA -1005 ; [.3042.0020.0002] # MYANMAR LETTER CA -1078 ; [.3043.0020.0002] # MYANMAR LETTER SHAN CA -AA61 ; [.3044.0020.0002] # MYANMAR LETTER KHAMTI CA -1006 ; [.3045.0020.0002] # MYANMAR LETTER CHA -A9E1 ; [.3046.0020.0002] # MYANMAR LETTER SHAN CHA -AA62 ; [.3047.0020.0002] # MYANMAR LETTER KHAMTI CHA -AA7E ; [.3048.0020.0002] # MYANMAR LETTER SHWE PALAUNG CHA -1007 ; [.3049.0020.0002] # MYANMAR LETTER JA -AA63 ; [.304A.0020.0002] # MYANMAR LETTER KHAMTI JA -A9EB ; [.304B.0020.0002] # MYANMAR LETTER TAI LAING JA -1079 ; [.304C.0020.0002] # MYANMAR LETTER SHAN ZA -AA72 ; [.304D.0020.0002] # MYANMAR LETTER KHAMTI ZA -1008 ; [.304E.0020.0002] # MYANMAR LETTER JHA -105B ; [.304F.0020.0002] # MYANMAR LETTER MON JHA -A9E2 ; [.3050.0020.0002] # MYANMAR LETTER SHAN JHA -AA64 ; [.3051.0020.0002] # MYANMAR LETTER KHAMTI JHA -A9EC ; [.3052.0020.0002] # MYANMAR LETTER TAI LAING JHA -1061 ; [.3053.0020.0002] # MYANMAR LETTER SGAW KAREN SHA -AA7F ; [.3054.0020.0002] # MYANMAR LETTER SHWE PALAUNG SHA -1009 ; [.3055.0020.0002] # MYANMAR LETTER NYA -107A ; [.3056.0020.0002] # MYANMAR LETTER SHAN NYA -AA65 ; [.3057.0020.0002] # MYANMAR LETTER KHAMTI NYA -A9E7 ; [.3058.0020.0002] # MYANMAR LETTER TAI LAING NYA -100A ; [.3059.0020.0002] # MYANMAR LETTER NNYA -100B ; [.305A.0020.0002] # MYANMAR LETTER TTA -AA66 ; [.305B.0020.0002] # MYANMAR LETTER KHAMTI TTA -100C ; [.305C.0020.0002] # MYANMAR LETTER TTHA -AA67 ; [.305D.0020.0002] # MYANMAR LETTER KHAMTI TTHA -100D ; [.305E.0020.0002] # MYANMAR LETTER DDA -AA68 ; [.305F.0020.0002] # MYANMAR LETTER KHAMTI DDA -A9ED ; [.3060.0020.0002] # MYANMAR LETTER TAI LAING DDA -100E ; [.3061.0020.0002] # MYANMAR LETTER DDHA -AA69 ; [.3062.0020.0002] # MYANMAR LETTER KHAMTI DDHA -A9EE ; [.3063.0020.0002] # MYANMAR LETTER TAI LAING DDHA -100F ; [.3064.0020.0002] # MYANMAR LETTER NNA -106E ; [.3065.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN NNA -A9E3 ; [.3066.0020.0002] # MYANMAR LETTER SHAN NNA -A9EF ; [.3067.0020.0002] # MYANMAR LETTER TAI LAING NNA -1010 ; [.3068.0020.0002] # MYANMAR LETTER TA -1011 ; [.3069.0020.0002] # MYANMAR LETTER THA -1012 ; [.306A.0020.0002] # MYANMAR LETTER DA -107B ; [.306B.0020.0002] # MYANMAR LETTER SHAN DA -A9FB ; [.306C.0020.0002] # MYANMAR LETTER TAI LAING DA -1013 ; [.306D.0020.0002] # MYANMAR LETTER DHA -AA6A ; [.306E.0020.0002] # MYANMAR LETTER KHAMTI DHA -A9FC ; [.306F.0020.0002] # MYANMAR LETTER TAI LAING DHA -1014 ; [.3070.0020.0002] # MYANMAR LETTER NA -107C ; [.3071.0020.0002] # MYANMAR LETTER SHAN NA -AA6B ; [.3072.0020.0002] # MYANMAR LETTER KHAMTI NA -105E ; [.3073.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL NA -1015 ; [.3074.0020.0002] # MYANMAR LETTER PA -1016 ; [.3075.0020.0002] # MYANMAR LETTER PHA -107D ; [.3076.0020.0002] # MYANMAR LETTER SHAN PHA -107E ; [.3077.0020.0002] # MYANMAR LETTER SHAN FA -AA6F ; [.3078.0020.0002] # MYANMAR LETTER KHAMTI FA -108E ; [.3079.0020.0002] # MYANMAR LETTER RUMAI PALAUNG FA -A9E8 ; [.307A.0020.0002] # MYANMAR LETTER TAI LAING FA -1017 ; [.307B.0020.0002] # MYANMAR LETTER BA -107F ; [.307C.0020.0002] # MYANMAR LETTER SHAN BA -A9FD ; [.307D.0020.0002] # MYANMAR LETTER TAI LAING BA -1018 ; [.307E.0020.0002] # MYANMAR LETTER BHA -A9E4 ; [.307F.0020.0002] # MYANMAR LETTER SHAN BHA -A9FE ; [.3080.0020.0002] # MYANMAR LETTER TAI LAING BHA -1019 ; [.3081.0020.0002] # MYANMAR LETTER MA -105F ; [.3082.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL MA -101A ; [.3083.0020.0002] # MYANMAR LETTER YA -103B ; [.3084.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL YA -101B ; [.3085.0020.0002] # MYANMAR LETTER RA -AA73 ; [.3086.0020.0002] # MYANMAR LETTER KHAMTI RA -AA7A ; [.3087.0020.0002] # MYANMAR LETTER AITON RA -103C ; [.3088.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL RA -101C ; [.3089.0020.0002] # MYANMAR LETTER LA -1060 ; [.308A.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL LA -101D ; [.308B.0020.0002] # MYANMAR LETTER WA -103D ; [.308C.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL WA -1082 ; [.308D.0020.0002] # MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1080 ; [.308E.0020.0002] # MYANMAR LETTER SHAN THA -1050 ; [.308F.0020.0002] # MYANMAR LETTER SHA -1051 ; [.3090.0020.0002] # MYANMAR LETTER SSA -1065 ; [.3091.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN THA -101E ; [.3092.0020.0002] # MYANMAR LETTER SA -103F ; [.3092.0020.0004][.30CB.0020.0004][.3092.0020.0004] # MYANMAR LETTER GREAT SA -AA6C ; [.3093.0020.0002] # MYANMAR LETTER KHAMTI SA -101F ; [.3094.0020.0002] # MYANMAR LETTER HA -1081 ; [.3095.0020.0002] # MYANMAR LETTER SHAN HA -AA6D ; [.3096.0020.0002] # MYANMAR LETTER KHAMTI HA -103E ; [.3097.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL HA -AA6E ; [.3098.0020.0002] # MYANMAR LETTER KHAMTI HHA -AA71 ; [.3099.0020.0002] # MYANMAR LETTER KHAMTI XA -1020 ; [.309A.0020.0002] # MYANMAR LETTER LLA -A9FA ; [.309B.0020.0002] # MYANMAR LETTER TAI LAING LLA -105C ; [.309C.0020.0002] # MYANMAR LETTER MON BBA -105D ; [.309D.0020.0002] # MYANMAR LETTER MON BBE -106F ; [.309E.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN YWA -1070 ; [.309F.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN GHWA -1066 ; [.30A0.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN PWA -1021 ; [.30A1.0020.0002] # MYANMAR LETTER A -1022 ; [.30A2.0020.0002] # MYANMAR LETTER SHAN A -1023 ; [.30A3.0020.0002] # MYANMAR LETTER I -1024 ; [.30A4.0020.0002] # MYANMAR LETTER II -1025 ; [.30A5.0020.0002] # MYANMAR LETTER U -1026 ; [.30A6.0020.0002] # MYANMAR LETTER UU -1025 102E ; [.30A6.0020.0002] # MYANMAR LETTER UU -1052 ; [.30A7.0020.0002] # MYANMAR LETTER VOCALIC R -1053 ; [.30A8.0020.0002] # MYANMAR LETTER VOCALIC RR -1054 ; [.30A9.0020.0002] # MYANMAR LETTER VOCALIC L -1055 ; [.30AA.0020.0002] # MYANMAR LETTER VOCALIC LL -1027 ; [.30AB.0020.0002] # MYANMAR LETTER E -1028 ; [.30AC.0020.0002] # MYANMAR LETTER MON E -1029 ; [.30AD.0020.0002] # MYANMAR LETTER O -102A ; [.30AE.0020.0002] # MYANMAR LETTER AU -102C ; [.30AF.0020.0002] # MYANMAR VOWEL SIGN AA -102B ; [.30AF.0020.0004] # MYANMAR VOWEL SIGN TALL AA -1083 ; [.30B0.0020.0002] # MYANMAR VOWEL SIGN SHAN AA -1072 ; [.30B1.0020.0002] # MYANMAR VOWEL SIGN KAYAH OE -109C ; [.30B2.0020.0002] # MYANMAR VOWEL SIGN AITON A -102D ; [.30B3.0020.0002] # MYANMAR VOWEL SIGN I -1071 ; [.30B4.0020.0002] # MYANMAR VOWEL SIGN GEBA KAREN I -102E ; [.30B5.0020.0002] # MYANMAR VOWEL SIGN II -1033 ; [.30B6.0020.0002] # MYANMAR VOWEL SIGN MON II -102F ; [.30B7.0020.0002] # MYANMAR VOWEL SIGN U -1073 ; [.30B8.0020.0002] # MYANMAR VOWEL SIGN KAYAH U -1074 ; [.30B9.0020.0002] # MYANMAR VOWEL SIGN KAYAH EE -1030 ; [.30BA.0020.0002] # MYANMAR VOWEL SIGN UU -1056 ; [.30BB.0020.0002] # MYANMAR VOWEL SIGN VOCALIC R -1057 ; [.30BC.0020.0002] # MYANMAR VOWEL SIGN VOCALIC RR -1058 ; [.30BD.0020.0002] # MYANMAR VOWEL SIGN VOCALIC L -1059 ; [.30BE.0020.0002] # MYANMAR VOWEL SIGN VOCALIC LL -1031 ; [.30BF.0020.0002] # MYANMAR VOWEL SIGN E -1084 ; [.30C0.0020.0002] # MYANMAR VOWEL SIGN SHAN E -1035 ; [.30C1.0020.0002] # MYANMAR VOWEL SIGN E ABOVE -1085 ; [.30C2.0020.0002] # MYANMAR VOWEL SIGN SHAN E ABOVE -1032 ; [.30C3.0020.0002] # MYANMAR VOWEL SIGN AI -109D ; [.30C4.0020.0002] # MYANMAR VOWEL SIGN AITON AI -1034 ; [.30C5.0020.0002] # MYANMAR VOWEL SIGN MON O -1062 ; [.30C6.0020.0002] # MYANMAR VOWEL SIGN SGAW KAREN EU -1067 ; [.30C7.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU -1068 ; [.30C8.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE -A9E5 ; [.30C9.0020.0002] # MYANMAR SIGN SHAN SAW -1086 ; [.30CA.0020.0002] # MYANMAR VOWEL SIGN SHAN FINAL Y -1039 ; [.30CB.0020.0002] # MYANMAR SIGN VIRAMA -103A ; [.30CC.0020.0002] # MYANMAR SIGN ASAT -1063 ; [.30CD.0020.0002] # MYANMAR TONE MARK SGAW KAREN HATHI -1064 ; [.30CE.0020.0002] # MYANMAR TONE MARK SGAW KAREN KE PHO -1069 ; [.30CF.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-1 -106A ; [.30D0.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-2 -106B ; [.30D1.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-3 -106C ; [.30D2.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-4 -106D ; [.30D3.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-5 -1087 ; [.30D4.0020.0002] # MYANMAR SIGN SHAN TONE-2 -108B ; [.30D5.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-2 -1088 ; [.30D6.0020.0002] # MYANMAR SIGN SHAN TONE-3 -108C ; [.30D7.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-3 -108D ; [.30D8.0020.0002] # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -1089 ; [.30D9.0020.0002] # MYANMAR SIGN SHAN TONE-5 -108A ; [.30DA.0020.0002] # MYANMAR SIGN SHAN TONE-6 -108F ; [.30DB.0020.0002] # MYANMAR SIGN RUMAI PALAUNG TONE-5 -109A ; [.30DC.0020.0002] # MYANMAR SIGN KHAMTI TONE-1 -109B ; [.30DD.0020.0002] # MYANMAR SIGN KHAMTI TONE-3 -AA7B ; [.30DE.0020.0002] # MYANMAR SIGN PAO KAREN TONE -AA7C ; [.30DF.0020.0002] # MYANMAR SIGN TAI LAING TONE-2 -AA7D ; [.30E0.0020.0002] # MYANMAR SIGN TAI LAING TONE-5 -AA74 ; [.30E1.0020.0002] # MYANMAR LOGOGRAM KHAMTI OAY -AA75 ; [.30E2.0020.0002] # MYANMAR LOGOGRAM KHAMTI QN -AA76 ; [.30E3.0020.0002] # MYANMAR LOGOGRAM KHAMTI HM -11103 ; [.30E4.0020.0002] # CHAKMA LETTER AA -11104 ; [.30E5.0020.0002] # CHAKMA LETTER I -11105 ; [.30E6.0020.0002] # CHAKMA LETTER U -11106 ; [.30E7.0020.0002] # CHAKMA LETTER E -11107 ; [.30E8.0020.0002] # CHAKMA LETTER KAA -11108 ; [.30E9.0020.0002] # CHAKMA LETTER KHAA -11109 ; [.30EA.0020.0002] # CHAKMA LETTER GAA -1110A ; [.30EB.0020.0002] # CHAKMA LETTER GHAA -1110B ; [.30EC.0020.0002] # CHAKMA LETTER NGAA -1110C ; [.30ED.0020.0002] # CHAKMA LETTER CAA -1110D ; [.30EE.0020.0002] # CHAKMA LETTER CHAA -1110E ; [.30EF.0020.0002] # CHAKMA LETTER JAA -1110F ; [.30F0.0020.0002] # CHAKMA LETTER JHAA -11110 ; [.30F1.0020.0002] # CHAKMA LETTER NYAA -11111 ; [.30F2.0020.0002] # CHAKMA LETTER TTAA -11112 ; [.30F3.0020.0002] # CHAKMA LETTER TTHAA -11113 ; [.30F4.0020.0002] # CHAKMA LETTER DDAA -11114 ; [.30F5.0020.0002] # CHAKMA LETTER DDHAA -11115 ; [.30F6.0020.0002] # CHAKMA LETTER NNAA -11116 ; [.30F7.0020.0002] # CHAKMA LETTER TAA -11117 ; [.30F8.0020.0002] # CHAKMA LETTER THAA -11118 ; [.30F9.0020.0002] # CHAKMA LETTER DAA -11119 ; [.30FA.0020.0002] # CHAKMA LETTER DHAA -1111A ; [.30FB.0020.0002] # CHAKMA LETTER NAA -1111B ; [.30FC.0020.0002] # CHAKMA LETTER PAA -1111C ; [.30FD.0020.0002] # CHAKMA LETTER PHAA -1111D ; [.30FE.0020.0002] # CHAKMA LETTER BAA -1111E ; [.30FF.0020.0002] # CHAKMA LETTER BHAA -1111F ; [.3100.0020.0002] # CHAKMA LETTER MAA -11120 ; [.3101.0020.0002] # CHAKMA LETTER YYAA -11121 ; [.3102.0020.0002] # CHAKMA LETTER YAA -11122 ; [.3103.0020.0002] # CHAKMA LETTER RAA -11123 ; [.3104.0020.0002] # CHAKMA LETTER LAA -11124 ; [.3105.0020.0002] # CHAKMA LETTER WAA -11125 ; [.3106.0020.0002] # CHAKMA LETTER SAA -11126 ; [.3107.0020.0002] # CHAKMA LETTER HAA -11127 ; [.3108.0020.0002] # CHAKMA VOWEL SIGN A -11128 ; [.3109.0020.0002] # CHAKMA VOWEL SIGN I -11129 ; [.310A.0020.0002] # CHAKMA VOWEL SIGN II -1112A ; [.310B.0020.0002] # CHAKMA VOWEL SIGN U -1112B ; [.310C.0020.0002] # CHAKMA VOWEL SIGN UU -1112C ; [.310D.0020.0002] # CHAKMA VOWEL SIGN E -1112D ; [.310E.0020.0002] # CHAKMA VOWEL SIGN AI -1112E ; [.310F.0020.0002] # CHAKMA VOWEL SIGN O -11131 11127 ; [.310F.0020.0002] # CHAKMA VOWEL SIGN O -1112F ; [.3110.0020.0002] # CHAKMA VOWEL SIGN AU -11132 11127 ; [.3110.0020.0002] # CHAKMA VOWEL SIGN AU -11130 ; [.3111.0020.0002] # CHAKMA VOWEL SIGN OI -11131 ; [.3112.0020.0002] # CHAKMA O MARK -11132 ; [.3113.0020.0002] # CHAKMA AU MARK -11133 ; [.3114.0020.0002] # CHAKMA VIRAMA -11134 ; [.3115.0020.0002] # CHAKMA MAAYYAA -1780 ; [.3116.0020.0002] # KHMER LETTER KA -1781 ; [.3117.0020.0002] # KHMER LETTER KHA -1782 ; [.3118.0020.0002] # KHMER LETTER KO -1783 ; [.3119.0020.0002] # KHMER LETTER KHO -1784 ; [.311A.0020.0002] # KHMER LETTER NGO -1785 ; [.311B.0020.0002] # KHMER LETTER CA -1786 ; [.311C.0020.0002] # KHMER LETTER CHA -1787 ; [.311D.0020.0002] # KHMER LETTER CO -1788 ; [.311E.0020.0002] # KHMER LETTER CHO -1789 ; [.311F.0020.0002] # KHMER LETTER NYO -178A ; [.3120.0020.0002] # KHMER LETTER DA -178B ; [.3121.0020.0002] # KHMER LETTER TTHA -178C ; [.3122.0020.0002] # KHMER LETTER DO -178D ; [.3123.0020.0002] # KHMER LETTER TTHO -178E ; [.3124.0020.0002] # KHMER LETTER NNO -178F ; [.3125.0020.0002] # KHMER LETTER TA -1790 ; [.3126.0020.0002] # KHMER LETTER THA -1791 ; [.3127.0020.0002] # KHMER LETTER TO -1792 ; [.3128.0020.0002] # KHMER LETTER THO -1793 ; [.3129.0020.0002] # KHMER LETTER NO -1794 ; [.312A.0020.0002] # KHMER LETTER BA -1795 ; [.312B.0020.0002] # KHMER LETTER PHA -1796 ; [.312C.0020.0002] # KHMER LETTER PO -1797 ; [.312D.0020.0002] # KHMER LETTER PHO -1798 ; [.312E.0020.0002] # KHMER LETTER MO -1799 ; [.312F.0020.0002] # KHMER LETTER YO -179A ; [.3130.0020.0002] # KHMER LETTER RO -179B ; [.3131.0020.0002] # KHMER LETTER LO -179C ; [.3132.0020.0002] # KHMER LETTER VO -179D ; [.3133.0020.0002] # KHMER LETTER SHA -179E ; [.3134.0020.0002] # KHMER LETTER SSO -179F ; [.3135.0020.0002] # KHMER LETTER SA -17A0 ; [.3136.0020.0002] # KHMER LETTER HA -17A1 ; [.3137.0020.0002] # KHMER LETTER LA -17A2 ; [.3138.0020.0002] # KHMER LETTER QA -17DC ; [.3139.0020.0002] # KHMER SIGN AVAKRAHASANYA -17A3 ; [.313A.0020.0002] # KHMER INDEPENDENT VOWEL QAQ -17A4 ; [.313B.0020.0002] # KHMER INDEPENDENT VOWEL QAA -17A5 ; [.313C.0020.0002] # KHMER INDEPENDENT VOWEL QI -17A6 ; [.313D.0020.0002] # KHMER INDEPENDENT VOWEL QII -17A7 ; [.313E.0020.0002] # KHMER INDEPENDENT VOWEL QU -17A8 ; [.313F.0020.0002] # KHMER INDEPENDENT VOWEL QUK -17A9 ; [.3140.0020.0002] # KHMER INDEPENDENT VOWEL QUU -17AA ; [.3141.0020.0002] # KHMER INDEPENDENT VOWEL QUUV -17AB ; [.3142.0020.0002] # KHMER INDEPENDENT VOWEL RY -17AC ; [.3143.0020.0002] # KHMER INDEPENDENT VOWEL RYY -17AD ; [.3144.0020.0002] # KHMER INDEPENDENT VOWEL LY -17AE ; [.3145.0020.0002] # KHMER INDEPENDENT VOWEL LYY -17AF ; [.3146.0020.0002] # KHMER INDEPENDENT VOWEL QE -17B0 ; [.3147.0020.0002] # KHMER INDEPENDENT VOWEL QAI -17B1 ; [.3148.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE ONE -17B2 ; [.3149.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE TWO -17B3 ; [.314A.0020.0002] # KHMER INDEPENDENT VOWEL QAU -17B6 ; [.314B.0020.0002] # KHMER VOWEL SIGN AA -17B7 ; [.314C.0020.0002] # KHMER VOWEL SIGN I -17B8 ; [.314D.0020.0002] # KHMER VOWEL SIGN II -17B9 ; [.314E.0020.0002] # KHMER VOWEL SIGN Y -17BA ; [.314F.0020.0002] # KHMER VOWEL SIGN YY -17BB ; [.3150.0020.0002] # KHMER VOWEL SIGN U -17BC ; [.3151.0020.0002] # KHMER VOWEL SIGN UU -17BD ; [.3152.0020.0002] # KHMER VOWEL SIGN UA -17BE ; [.3153.0020.0002] # KHMER VOWEL SIGN OE -17BF ; [.3154.0020.0002] # KHMER VOWEL SIGN YA -17C0 ; [.3155.0020.0002] # KHMER VOWEL SIGN IE -17C1 ; [.3156.0020.0002] # KHMER VOWEL SIGN E -17C2 ; [.3157.0020.0002] # KHMER VOWEL SIGN AE -17C3 ; [.3158.0020.0002] # KHMER VOWEL SIGN AI -17C4 ; [.3159.0020.0002] # KHMER VOWEL SIGN OO -17C5 ; [.315A.0020.0002] # KHMER VOWEL SIGN AU -17D2 ; [.315B.0020.0002] # KHMER SIGN COENG -1950 ; [.315C.0020.0002] # TAI LE LETTER KA -1951 ; [.315D.0020.0002] # TAI LE LETTER XA -1952 ; [.315E.0020.0002] # TAI LE LETTER NGA -1953 ; [.315F.0020.0002] # TAI LE LETTER TSA -1954 ; [.3160.0020.0002] # TAI LE LETTER SA -1955 ; [.3161.0020.0002] # TAI LE LETTER YA -1956 ; [.3162.0020.0002] # TAI LE LETTER TA -1957 ; [.3163.0020.0002] # TAI LE LETTER THA -1958 ; [.3164.0020.0002] # TAI LE LETTER LA -1959 ; [.3165.0020.0002] # TAI LE LETTER PA -195A ; [.3166.0020.0002] # TAI LE LETTER PHA -195B ; [.3167.0020.0002] # TAI LE LETTER MA -195C ; [.3168.0020.0002] # TAI LE LETTER FA -195D ; [.3169.0020.0002] # TAI LE LETTER VA -195E ; [.316A.0020.0002] # TAI LE LETTER HA -195F ; [.316B.0020.0002] # TAI LE LETTER QA -1960 ; [.316C.0020.0002] # TAI LE LETTER KHA -1961 ; [.316D.0020.0002] # TAI LE LETTER TSHA -1962 ; [.316E.0020.0002] # TAI LE LETTER NA -1963 ; [.316F.0020.0002] # TAI LE LETTER A -1964 ; [.3170.0020.0002] # TAI LE LETTER I -1965 ; [.3171.0020.0002] # TAI LE LETTER EE -1966 ; [.3172.0020.0002] # TAI LE LETTER EH -1967 ; [.3173.0020.0002] # TAI LE LETTER U -1968 ; [.3174.0020.0002] # TAI LE LETTER OO -1969 ; [.3175.0020.0002] # TAI LE LETTER O -196A ; [.3176.0020.0002] # TAI LE LETTER UE -196B ; [.3177.0020.0002] # TAI LE LETTER E -196C ; [.3178.0020.0002] # TAI LE LETTER AUE -196D ; [.3179.0020.0002] # TAI LE LETTER AI -1970 ; [.317A.0020.0002] # TAI LE LETTER TONE-2 -1971 ; [.317B.0020.0002] # TAI LE LETTER TONE-3 -1972 ; [.317C.0020.0002] # TAI LE LETTER TONE-4 -1973 ; [.317D.0020.0002] # TAI LE LETTER TONE-5 -1974 ; [.317E.0020.0002] # TAI LE LETTER TONE-6 -1980 ; [.317F.0020.0002] # NEW TAI LUE LETTER HIGH QA -19B5 1980 ; [.317F.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH QA> -19B6 1980 ; [.317F.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH QA> -19B7 1980 ; [.317F.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH QA> -19BA 1980 ; [.317F.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH QA> -1981 ; [.3180.0020.0002] # NEW TAI LUE LETTER LOW QA -19B5 1981 ; [.3180.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW QA> -19B6 1981 ; [.3180.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW QA> -19B7 1981 ; [.3180.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW QA> -19BA 1981 ; [.3180.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW QA> -1982 ; [.3181.0020.0002] # NEW TAI LUE LETTER HIGH KA -19B5 1982 ; [.3181.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KA> -19B6 1982 ; [.3181.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KA> -19B7 1982 ; [.3181.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KA> -19BA 1982 ; [.3181.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KA> -1983 ; [.3182.0020.0002] # NEW TAI LUE LETTER HIGH XA -19B5 1983 ; [.3182.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XA> -19B6 1983 ; [.3182.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XA> -19B7 1983 ; [.3182.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XA> -19BA 1983 ; [.3182.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XA> -1984 ; [.3183.0020.0002] # NEW TAI LUE LETTER HIGH NGA -19B5 1984 ; [.3183.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NGA> -19B6 1984 ; [.3183.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NGA> -19B7 1984 ; [.3183.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NGA> -19BA 1984 ; [.3183.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NGA> -1985 ; [.3184.0020.0002] # NEW TAI LUE LETTER LOW KA -19B5 1985 ; [.3184.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KA> -19B6 1985 ; [.3184.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KA> -19B7 1985 ; [.3184.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KA> -19BA 1985 ; [.3184.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KA> -1986 ; [.3185.0020.0002] # NEW TAI LUE LETTER LOW XA -19B5 1986 ; [.3185.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XA> -19B6 1986 ; [.3185.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XA> -19B7 1986 ; [.3185.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XA> -19BA 1986 ; [.3185.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XA> -1987 ; [.3186.0020.0002] # NEW TAI LUE LETTER LOW NGA -19B5 1987 ; [.3186.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NGA> -19B6 1987 ; [.3186.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NGA> -19B7 1987 ; [.3186.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NGA> -19BA 1987 ; [.3186.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NGA> -1988 ; [.3187.0020.0002] # NEW TAI LUE LETTER HIGH TSA -19B5 1988 ; [.3187.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TSA> -19B6 1988 ; [.3187.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TSA> -19B7 1988 ; [.3187.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TSA> -19BA 1988 ; [.3187.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TSA> -1989 ; [.3188.0020.0002] # NEW TAI LUE LETTER HIGH SA -19B5 1989 ; [.3188.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SA> -19B6 1989 ; [.3188.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SA> -19B7 1989 ; [.3188.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SA> -19BA 1989 ; [.3188.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SA> -198A ; [.3189.0020.0002] # NEW TAI LUE LETTER HIGH YA -19B5 198A ; [.3189.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH YA> -19B6 198A ; [.3189.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH YA> -19B7 198A ; [.3189.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH YA> -19BA 198A ; [.3189.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH YA> -198B ; [.318A.0020.0002] # NEW TAI LUE LETTER LOW TSA -19B5 198B ; [.318A.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TSA> -19B6 198B ; [.318A.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TSA> -19B7 198B ; [.318A.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TSA> -19BA 198B ; [.318A.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TSA> -198C ; [.318B.0020.0002] # NEW TAI LUE LETTER LOW SA -19B5 198C ; [.318B.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SA> -19B6 198C ; [.318B.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SA> -19B7 198C ; [.318B.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SA> -19BA 198C ; [.318B.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SA> -198D ; [.318C.0020.0002] # NEW TAI LUE LETTER LOW YA -19B5 198D ; [.318C.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW YA> -19B6 198D ; [.318C.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW YA> -19B7 198D ; [.318C.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW YA> -19BA 198D ; [.318C.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW YA> -198E ; [.318D.0020.0002] # NEW TAI LUE LETTER HIGH TA -19B5 198E ; [.318D.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TA> -19B6 198E ; [.318D.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TA> -19B7 198E ; [.318D.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TA> -19BA 198E ; [.318D.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TA> -198F ; [.318E.0020.0002] # NEW TAI LUE LETTER HIGH THA -19B5 198F ; [.318E.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH THA> -19B6 198F ; [.318E.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH THA> -19B7 198F ; [.318E.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH THA> -19BA 198F ; [.318E.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH THA> -1990 ; [.318F.0020.0002] # NEW TAI LUE LETTER HIGH NA -19B5 1990 ; [.318F.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NA> -19B6 1990 ; [.318F.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NA> -19B7 1990 ; [.318F.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NA> -19BA 1990 ; [.318F.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NA> -1991 ; [.3190.0020.0002] # NEW TAI LUE LETTER LOW TA -19B5 1991 ; [.3190.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TA> -19B6 1991 ; [.3190.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TA> -19B7 1991 ; [.3190.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TA> -19BA 1991 ; [.3190.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TA> -1992 ; [.3191.0020.0002] # NEW TAI LUE LETTER LOW THA -19B5 1992 ; [.3191.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW THA> -19B6 1992 ; [.3191.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW THA> -19B7 1992 ; [.3191.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW THA> -19BA 1992 ; [.3191.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW THA> -1993 ; [.3192.0020.0002] # NEW TAI LUE LETTER LOW NA -19B5 1993 ; [.3192.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NA> -19B6 1993 ; [.3192.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NA> -19B7 1993 ; [.3192.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NA> -19BA 1993 ; [.3192.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NA> -1994 ; [.3193.0020.0002] # NEW TAI LUE LETTER HIGH PA -19B5 1994 ; [.3193.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PA> -19B6 1994 ; [.3193.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PA> -19B7 1994 ; [.3193.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PA> -19BA 1994 ; [.3193.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PA> -1995 ; [.3194.0020.0002] # NEW TAI LUE LETTER HIGH PHA -19B5 1995 ; [.3194.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PHA> -19B6 1995 ; [.3194.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PHA> -19B7 1995 ; [.3194.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PHA> -19BA 1995 ; [.3194.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PHA> -1996 ; [.3195.0020.0002] # NEW TAI LUE LETTER HIGH MA -19B5 1996 ; [.3195.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH MA> -19B6 1996 ; [.3195.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH MA> -19B7 1996 ; [.3195.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH MA> -19BA 1996 ; [.3195.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH MA> -1997 ; [.3196.0020.0002] # NEW TAI LUE LETTER LOW PA -19B5 1997 ; [.3196.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PA> -19B6 1997 ; [.3196.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PA> -19B7 1997 ; [.3196.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PA> -19BA 1997 ; [.3196.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PA> -1998 ; [.3197.0020.0002] # NEW TAI LUE LETTER LOW PHA -19B5 1998 ; [.3197.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PHA> -19B6 1998 ; [.3197.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PHA> -19B7 1998 ; [.3197.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PHA> -19BA 1998 ; [.3197.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PHA> -1999 ; [.3198.0020.0002] # NEW TAI LUE LETTER LOW MA -19B5 1999 ; [.3198.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW MA> -19B6 1999 ; [.3198.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW MA> -19B7 1999 ; [.3198.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW MA> -19BA 1999 ; [.3198.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW MA> -199A ; [.3199.0020.0002] # NEW TAI LUE LETTER HIGH FA -19B5 199A ; [.3199.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH FA> -19B6 199A ; [.3199.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH FA> -19B7 199A ; [.3199.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH FA> -19BA 199A ; [.3199.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH FA> -199B ; [.319A.0020.0002] # NEW TAI LUE LETTER HIGH VA -19B5 199B ; [.319A.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH VA> -19B6 199B ; [.319A.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH VA> -19B7 199B ; [.319A.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH VA> -19BA 199B ; [.319A.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH VA> -199C ; [.319B.0020.0002] # NEW TAI LUE LETTER HIGH LA -19B5 199C ; [.319B.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH LA> -19B6 199C ; [.319B.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH LA> -19DE ; [.319B.0020.0004][.31B1.0020.0004] # NEW TAI LUE SIGN LAE -19DF ; [.319B.0020.0004][.31B1.0020.0004][.31BC.0020.0004] # NEW TAI LUE SIGN LAEV -19B7 199C ; [.319B.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH LA> -19BA 199C ; [.319B.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH LA> -199D ; [.319C.0020.0002] # NEW TAI LUE LETTER LOW FA -19B5 199D ; [.319C.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW FA> -19B6 199D ; [.319C.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW FA> -19B7 199D ; [.319C.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW FA> -19BA 199D ; [.319C.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW FA> -199E ; [.319D.0020.0002] # NEW TAI LUE LETTER LOW VA -19B5 199E ; [.319D.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW VA> -19B6 199E ; [.319D.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW VA> -19B7 199E ; [.319D.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW VA> -19BA 199E ; [.319D.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW VA> -199F ; [.319E.0020.0002] # NEW TAI LUE LETTER LOW LA -19B5 199F ; [.319E.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW LA> -19B6 199F ; [.319E.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW LA> -19B7 199F ; [.319E.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW LA> -19BA 199F ; [.319E.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW LA> -19A0 ; [.319F.0020.0002] # NEW TAI LUE LETTER HIGH HA -19B5 19A0 ; [.319F.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH HA> -19B6 19A0 ; [.319F.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH HA> -19B7 19A0 ; [.319F.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH HA> -19BA 19A0 ; [.319F.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH HA> -19A1 ; [.31A0.0020.0002] # NEW TAI LUE LETTER HIGH DA -19B5 19A1 ; [.31A0.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH DA> -19B6 19A1 ; [.31A0.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH DA> -19B7 19A1 ; [.31A0.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH DA> -19BA 19A1 ; [.31A0.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH DA> -19A2 ; [.31A1.0020.0002] # NEW TAI LUE LETTER HIGH BA -19B5 19A2 ; [.31A1.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH BA> -19B6 19A2 ; [.31A1.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH BA> -19B7 19A2 ; [.31A1.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH BA> -19BA 19A2 ; [.31A1.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH BA> -19A3 ; [.31A2.0020.0002] # NEW TAI LUE LETTER LOW HA -19B5 19A3 ; [.31A2.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW HA> -19B6 19A3 ; [.31A2.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW HA> -19B7 19A3 ; [.31A2.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW HA> -19BA 19A3 ; [.31A2.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW HA> -19A4 ; [.31A3.0020.0002] # NEW TAI LUE LETTER LOW DA -19B5 19A4 ; [.31A3.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW DA> -19B6 19A4 ; [.31A3.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW DA> -19B7 19A4 ; [.31A3.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW DA> -19BA 19A4 ; [.31A3.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW DA> -19A5 ; [.31A4.0020.0002] # NEW TAI LUE LETTER LOW BA -19B5 19A5 ; [.31A4.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW BA> -19B6 19A5 ; [.31A4.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW BA> -19B7 19A5 ; [.31A4.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW BA> -19BA 19A5 ; [.31A4.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW BA> -19A6 ; [.31A5.0020.0002] # NEW TAI LUE LETTER HIGH KVA -19B5 19A6 ; [.31A5.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KVA> -19B6 19A6 ; [.31A5.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KVA> -19B7 19A6 ; [.31A5.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KVA> -19BA 19A6 ; [.31A5.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KVA> -19A7 ; [.31A6.0020.0002] # NEW TAI LUE LETTER HIGH XVA -19B5 19A7 ; [.31A6.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XVA> -19B6 19A7 ; [.31A6.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XVA> -19B7 19A7 ; [.31A6.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XVA> -19BA 19A7 ; [.31A6.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XVA> -19A8 ; [.31A7.0020.0002] # NEW TAI LUE LETTER LOW KVA -19B5 19A8 ; [.31A7.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KVA> -19B6 19A8 ; [.31A7.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KVA> -19B7 19A8 ; [.31A7.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KVA> -19BA 19A8 ; [.31A7.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KVA> -19A9 ; [.31A8.0020.0002] # NEW TAI LUE LETTER LOW XVA -19B5 19A9 ; [.31A8.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XVA> -19B6 19A9 ; [.31A8.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XVA> -19B7 19A9 ; [.31A8.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XVA> -19BA 19A9 ; [.31A8.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XVA> -19AA ; [.31A9.0020.0002] # NEW TAI LUE LETTER HIGH SUA -19B5 19AA ; [.31A9.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SUA> -19B6 19AA ; [.31A9.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SUA> -19B7 19AA ; [.31A9.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SUA> -19BA 19AA ; [.31A9.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SUA> -19AB ; [.31AA.0020.0002] # NEW TAI LUE LETTER LOW SUA -19B5 19AB ; [.31AA.0020.0002][.31B0.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SUA> -19B6 19AB ; [.31AA.0020.0002][.31B1.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SUA> -19B7 19AB ; [.31AA.0020.0002][.31B2.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SUA> -19BA 19AB ; [.31AA.0020.0002][.31B5.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SUA> -19B0 ; [.31AB.0020.0002] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER -19B1 ; [.31AC.0020.0002] # NEW TAI LUE VOWEL SIGN AA -19B2 ; [.31AD.0020.0002] # NEW TAI LUE VOWEL SIGN II -19B3 ; [.31AE.0020.0002] # NEW TAI LUE VOWEL SIGN U -19B4 ; [.31AF.0020.0002] # NEW TAI LUE VOWEL SIGN UU -19B5 ; [.31B0.0020.0002] # NEW TAI LUE VOWEL SIGN E -19B6 ; [.31B1.0020.0002] # NEW TAI LUE VOWEL SIGN AE -19B7 ; [.31B2.0020.0002] # NEW TAI LUE VOWEL SIGN O -19B8 ; [.31B3.0020.0002] # NEW TAI LUE VOWEL SIGN OA -19B9 ; [.31B4.0020.0002] # NEW TAI LUE VOWEL SIGN UE -19BA ; [.31B5.0020.0002] # NEW TAI LUE VOWEL SIGN AY -19BB ; [.31B6.0020.0002] # NEW TAI LUE VOWEL SIGN AAY -19BC ; [.31B7.0020.0002] # NEW TAI LUE VOWEL SIGN UY -19BD ; [.31B8.0020.0002] # NEW TAI LUE VOWEL SIGN OY -19BE ; [.31B9.0020.0002] # NEW TAI LUE VOWEL SIGN OAY -19BF ; [.31BA.0020.0002] # NEW TAI LUE VOWEL SIGN UEY -19C0 ; [.31BB.0020.0002] # NEW TAI LUE VOWEL SIGN IY -19C1 ; [.31BC.0020.0002] # NEW TAI LUE LETTER FINAL V -19C2 ; [.31BD.0020.0002] # NEW TAI LUE LETTER FINAL NG -19C3 ; [.31BE.0020.0002] # NEW TAI LUE LETTER FINAL N -19C4 ; [.31BF.0020.0002] # NEW TAI LUE LETTER FINAL M -19C5 ; [.31C0.0020.0002] # NEW TAI LUE LETTER FINAL K -19C6 ; [.31C1.0020.0002] # NEW TAI LUE LETTER FINAL D -19C7 ; [.31C2.0020.0002] # NEW TAI LUE LETTER FINAL B -19C8 ; [.31C3.0020.0002] # NEW TAI LUE TONE MARK-1 -19C9 ; [.31C4.0020.0002] # NEW TAI LUE TONE MARK-2 -1A20 ; [.31C5.0020.0002] # TAI THAM LETTER HIGH KA -1A21 ; [.31C6.0020.0002] # TAI THAM LETTER HIGH KHA -1A22 ; [.31C7.0020.0002] # TAI THAM LETTER HIGH KXA -1A23 ; [.31C8.0020.0002] # TAI THAM LETTER LOW KA -1A24 ; [.31C9.0020.0002] # TAI THAM LETTER LOW KXA -1A25 ; [.31CA.0020.0002] # TAI THAM LETTER LOW KHA -1A26 ; [.31CB.0020.0002] # TAI THAM LETTER NGA -1A58 ; [.31CB.0020.0004] # TAI THAM SIGN MAI KANG LAI -1A59 ; [.31CB.0020.0004] # TAI THAM CONSONANT SIGN FINAL NGA -1A27 ; [.31CC.0020.0002] # TAI THAM LETTER HIGH CA -1A28 ; [.31CD.0020.0002] # TAI THAM LETTER HIGH CHA -1A29 ; [.31CE.0020.0002] # TAI THAM LETTER LOW CA -1A2A ; [.31CF.0020.0002] # TAI THAM LETTER LOW SA -1A2B ; [.31D0.0020.0002] # TAI THAM LETTER LOW CHA -1A2C ; [.31D1.0020.0002] # TAI THAM LETTER NYA -1A2D ; [.31D2.0020.0002] # TAI THAM LETTER RATA -1A2E ; [.31D3.0020.0002] # TAI THAM LETTER HIGH RATHA -1A2F ; [.31D4.0020.0002] # TAI THAM LETTER DA -1A30 ; [.31D5.0020.0002] # TAI THAM LETTER LOW RATHA -1A31 ; [.31D6.0020.0002] # TAI THAM LETTER RANA -1A32 ; [.31D7.0020.0002] # TAI THAM LETTER HIGH TA -1A33 ; [.31D8.0020.0002] # TAI THAM LETTER HIGH THA -1A34 ; [.31D9.0020.0002] # TAI THAM LETTER LOW TA -1A35 ; [.31DA.0020.0002] # TAI THAM LETTER LOW THA -1A36 ; [.31DB.0020.0002] # TAI THAM LETTER NA -1A37 ; [.31DC.0020.0002] # TAI THAM LETTER BA -1A38 ; [.31DD.0020.0002] # TAI THAM LETTER HIGH PA -1A39 ; [.31DE.0020.0002] # TAI THAM LETTER HIGH PHA -1A3A ; [.31DF.0020.0002] # TAI THAM LETTER HIGH FA -1A3B ; [.31E0.0020.0002] # TAI THAM LETTER LOW PA -1A5A ; [.31E0.0020.0004] # TAI THAM CONSONANT SIGN LOW PA -1A5B ; [.31E0.0020.0004] # TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA -1A3C ; [.31E1.0020.0002] # TAI THAM LETTER LOW FA -1A3D ; [.31E2.0020.0002] # TAI THAM LETTER LOW PHA -1A3E ; [.31E3.0020.0002] # TAI THAM LETTER MA -1A3F ; [.31E4.0020.0002] # TAI THAM LETTER LOW YA -1A40 ; [.31E5.0020.0002] # TAI THAM LETTER HIGH YA -1A41 ; [.31E6.0020.0002] # TAI THAM LETTER RA -1A42 ; [.31E7.0020.0002] # TAI THAM LETTER RUE -1A43 ; [.31E8.0020.0002] # TAI THAM LETTER LA -1A44 ; [.31E9.0020.0002] # TAI THAM LETTER LUE -1A45 ; [.31EA.0020.0002] # TAI THAM LETTER WA -1A46 ; [.31EB.0020.0002] # TAI THAM LETTER HIGH SHA -1A54 ; [.31EB.0020.0004][.3211.0020.0004][.31EB.0020.0004] # TAI THAM LETTER GREAT SA -1A47 ; [.31EC.0020.0002] # TAI THAM LETTER HIGH SSA -1A48 ; [.31ED.0020.0002] # TAI THAM LETTER HIGH SA -1A49 ; [.31EE.0020.0002] # TAI THAM LETTER HIGH HA -1A4A ; [.31EF.0020.0002] # TAI THAM LETTER LLA -1A4B ; [.31F0.0020.0002] # TAI THAM LETTER A -1A4C ; [.31F1.0020.0002] # TAI THAM LETTER LOW HA -1A53 ; [.31F2.0020.0002] # TAI THAM LETTER LAE -1A6B ; [.31F3.0020.0002] # TAI THAM VOWEL SIGN O -1A55 ; [.31F4.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL RA -1A56 ; [.31F5.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL LA -1A57 ; [.31F6.0020.0002] # TAI THAM CONSONANT SIGN LA TANG LAI -1A5C ; [.31F7.0020.0002] # TAI THAM CONSONANT SIGN MA -1A5D ; [.31F8.0020.0002] # TAI THAM CONSONANT SIGN BA -1A5E ; [.31F9.0020.0002] # TAI THAM CONSONANT SIGN SA -1A4D ; [.31FA.0020.0002] # TAI THAM LETTER I -1A4E ; [.31FB.0020.0002] # TAI THAM LETTER II -1A4F ; [.31FC.0020.0002] # TAI THAM LETTER U -1A50 ; [.31FD.0020.0002] # TAI THAM LETTER UU -1A51 ; [.31FE.0020.0002] # TAI THAM LETTER EE -1A52 ; [.31FF.0020.0002] # TAI THAM LETTER OO -1A61 ; [.3200.0020.0002] # TAI THAM VOWEL SIGN A -1A6C ; [.3201.0020.0002] # TAI THAM VOWEL SIGN OA BELOW -1A62 ; [.3202.0020.0002] # TAI THAM VOWEL SIGN MAI SAT -1A63 ; [.3203.0020.0002] # TAI THAM VOWEL SIGN AA -1A64 ; [.3203.0020.0004] # TAI THAM VOWEL SIGN TALL AA -1A65 ; [.3204.0020.0002] # TAI THAM VOWEL SIGN I -1A66 ; [.3205.0020.0002] # TAI THAM VOWEL SIGN II -1A67 ; [.3206.0020.0002] # TAI THAM VOWEL SIGN UE -1A68 ; [.3207.0020.0002] # TAI THAM VOWEL SIGN UUE -1A69 ; [.3208.0020.0002] # TAI THAM VOWEL SIGN U -1A6A ; [.3209.0020.0002] # TAI THAM VOWEL SIGN UU -1A6E ; [.320A.0020.0002] # TAI THAM VOWEL SIGN E -1A6F ; [.320B.0020.0002] # TAI THAM VOWEL SIGN AE -1A73 ; [.320C.0020.0002] # TAI THAM VOWEL SIGN OA ABOVE -1A70 ; [.320D.0020.0002] # TAI THAM VOWEL SIGN OO -1A71 ; [.320E.0020.0002] # TAI THAM VOWEL SIGN AI -1A72 ; [.320F.0020.0002] # TAI THAM VOWEL SIGN THAM AI -1A6D ; [.3210.0020.0002] # TAI THAM VOWEL SIGN OY -1A60 ; [.3211.0020.0002] # TAI THAM SIGN SAKOT -AA00 ; [.3212.0020.0002] # CHAM LETTER A -AA01 ; [.3213.0020.0002] # CHAM LETTER I -AA02 ; [.3214.0020.0002] # CHAM LETTER U -AA03 ; [.3215.0020.0002] # CHAM LETTER E -AA04 ; [.3216.0020.0002] # CHAM LETTER AI -AA05 ; [.3217.0020.0002] # CHAM LETTER O -AA06 ; [.3218.0020.0002] # CHAM LETTER KA -AA07 ; [.3219.0020.0002] # CHAM LETTER KHA -AA08 ; [.321A.0020.0002] # CHAM LETTER GA -AA09 ; [.321B.0020.0002] # CHAM LETTER GHA -AA0A ; [.321C.0020.0002] # CHAM LETTER NGUE -AA0B ; [.321D.0020.0002] # CHAM LETTER NGA -AA0C ; [.321E.0020.0002] # CHAM LETTER CHA -AA0D ; [.321F.0020.0002] # CHAM LETTER CHHA -AA0E ; [.3220.0020.0002] # CHAM LETTER JA -AA0F ; [.3221.0020.0002] # CHAM LETTER JHA -AA10 ; [.3222.0020.0002] # CHAM LETTER NHUE -AA11 ; [.3223.0020.0002] # CHAM LETTER NHA -AA12 ; [.3224.0020.0002] # CHAM LETTER NHJA -AA13 ; [.3225.0020.0002] # CHAM LETTER TA -AA14 ; [.3226.0020.0002] # CHAM LETTER THA -AA15 ; [.3227.0020.0002] # CHAM LETTER DA -AA16 ; [.3228.0020.0002] # CHAM LETTER DHA -AA17 ; [.3229.0020.0002] # CHAM LETTER NUE -AA18 ; [.322A.0020.0002] # CHAM LETTER NA -AA19 ; [.322B.0020.0002] # CHAM LETTER DDA -AA1A ; [.322C.0020.0002] # CHAM LETTER PA -AA1B ; [.322D.0020.0002] # CHAM LETTER PPA -AA1C ; [.322E.0020.0002] # CHAM LETTER PHA -AA1D ; [.322F.0020.0002] # CHAM LETTER BA -AA1E ; [.3230.0020.0002] # CHAM LETTER BHA -AA1F ; [.3231.0020.0002] # CHAM LETTER MUE -AA20 ; [.3232.0020.0002] # CHAM LETTER MA -AA21 ; [.3233.0020.0002] # CHAM LETTER BBA -AA22 ; [.3234.0020.0002] # CHAM LETTER YA -AA23 ; [.3235.0020.0002] # CHAM LETTER RA -AA24 ; [.3236.0020.0002] # CHAM LETTER LA -AA25 ; [.3237.0020.0002] # CHAM LETTER VA -AA26 ; [.3238.0020.0002] # CHAM LETTER SSA -AA27 ; [.3239.0020.0002] # CHAM LETTER SA -AA28 ; [.323A.0020.0002] # CHAM LETTER HA -AA33 ; [.323B.0020.0002] # CHAM CONSONANT SIGN YA -AA34 ; [.323C.0020.0002] # CHAM CONSONANT SIGN RA -AA35 ; [.323D.0020.0002] # CHAM CONSONANT SIGN LA -AA36 ; [.323E.0020.0002] # CHAM CONSONANT SIGN WA -AA29 ; [.323F.0020.0002] # CHAM VOWEL SIGN AA -AA2A ; [.3240.0020.0002] # CHAM VOWEL SIGN I -AA2B ; [.3241.0020.0002] # CHAM VOWEL SIGN II -AA2C ; [.3242.0020.0002] # CHAM VOWEL SIGN EI -AA2D ; [.3243.0020.0002] # CHAM VOWEL SIGN U -AA2E ; [.3244.0020.0002] # CHAM VOWEL SIGN OE -AA2F ; [.3245.0020.0002] # CHAM VOWEL SIGN O -AA30 ; [.3246.0020.0002] # CHAM VOWEL SIGN AI -AA31 ; [.3247.0020.0002] # CHAM VOWEL SIGN AU -AA32 ; [.3248.0020.0002] # CHAM VOWEL SIGN UE -AA40 ; [.3249.0020.0002] # CHAM LETTER FINAL K -AA41 ; [.324A.0020.0002] # CHAM LETTER FINAL G -AA42 ; [.324B.0020.0002] # CHAM LETTER FINAL NG -AA43 ; [.324C.0020.0002] # CHAM CONSONANT SIGN FINAL NG -AA44 ; [.324D.0020.0002] # CHAM LETTER FINAL CH -AA45 ; [.324E.0020.0002] # CHAM LETTER FINAL T -AA46 ; [.324F.0020.0002] # CHAM LETTER FINAL N -AA47 ; [.3250.0020.0002] # CHAM LETTER FINAL P -AA48 ; [.3251.0020.0002] # CHAM LETTER FINAL Y -AA49 ; [.3252.0020.0002] # CHAM LETTER FINAL R -AA4A ; [.3253.0020.0002] # CHAM LETTER FINAL L -AA4B ; [.3254.0020.0002] # CHAM LETTER FINAL SS -AA4C ; [.3255.0020.0002] # CHAM CONSONANT SIGN FINAL M -AA4D ; [.3256.0020.0002] # CHAM CONSONANT SIGN FINAL H -1B05 ; [.3257.0020.0002] # BALINESE LETTER AKARA -1B06 ; [.3258.0020.0002] # BALINESE LETTER AKARA TEDUNG -1B05 1B35 ; [.3258.0020.0002] # BALINESE LETTER AKARA TEDUNG -1B07 ; [.3259.0020.0002] # BALINESE LETTER IKARA -1B08 ; [.325A.0020.0002] # BALINESE LETTER IKARA TEDUNG -1B07 1B35 ; [.325A.0020.0002] # BALINESE LETTER IKARA TEDUNG -1B09 ; [.325B.0020.0002] # BALINESE LETTER UKARA -1B0A ; [.325C.0020.0002] # BALINESE LETTER UKARA TEDUNG -1B09 1B35 ; [.325C.0020.0002] # BALINESE LETTER UKARA TEDUNG -1B0B ; [.325D.0020.0002] # BALINESE LETTER RA REPA -1B0C ; [.325E.0020.0002] # BALINESE LETTER RA REPA TEDUNG -1B0B 1B35 ; [.325E.0020.0002] # BALINESE LETTER RA REPA TEDUNG -1B0D ; [.325F.0020.0002] # BALINESE LETTER LA LENGA -1B0E ; [.3260.0020.0002] # BALINESE LETTER LA LENGA TEDUNG -1B0D 1B35 ; [.3260.0020.0002] # BALINESE LETTER LA LENGA TEDUNG -1B0F ; [.3261.0020.0002] # BALINESE LETTER EKARA -1B10 ; [.3262.0020.0002] # BALINESE LETTER AIKARA -1B11 ; [.3263.0020.0002] # BALINESE LETTER OKARA -1B12 ; [.3264.0020.0002] # BALINESE LETTER OKARA TEDUNG -1B11 1B35 ; [.3264.0020.0002] # BALINESE LETTER OKARA TEDUNG -1B13 ; [.3265.0020.0002] # BALINESE LETTER KA -1B45 ; [.3266.0020.0002] # BALINESE LETTER KAF SASAK -1B46 ; [.3267.0020.0002] # BALINESE LETTER KHOT SASAK -1B14 ; [.3268.0020.0002] # BALINESE LETTER KA MAHAPRANA -1B15 ; [.3269.0020.0002] # BALINESE LETTER GA -1B16 ; [.326A.0020.0002] # BALINESE LETTER GA GORA -1B17 ; [.326B.0020.0002] # BALINESE LETTER NGA -1B18 ; [.326C.0020.0002] # BALINESE LETTER CA -1B19 ; [.326D.0020.0002] # BALINESE LETTER CA LACA -1B1A ; [.326E.0020.0002] # BALINESE LETTER JA -1B1B ; [.326F.0020.0002] # BALINESE LETTER JA JERA -1B1C ; [.3270.0020.0002] # BALINESE LETTER NYA -1B1D ; [.3271.0020.0002] # BALINESE LETTER TA LATIK -1B1E ; [.3272.0020.0002] # BALINESE LETTER TA MURDA MAHAPRANA -1B1F ; [.3273.0020.0002] # BALINESE LETTER DA MURDA ALPAPRANA -1B20 ; [.3274.0020.0002] # BALINESE LETTER DA MURDA MAHAPRANA -1B21 ; [.3275.0020.0002] # BALINESE LETTER NA RAMBAT -1B22 ; [.3276.0020.0002] # BALINESE LETTER TA -1B47 ; [.3277.0020.0002] # BALINESE LETTER TZIR SASAK -1B23 ; [.3278.0020.0002] # BALINESE LETTER TA TAWA -1B24 ; [.3279.0020.0002] # BALINESE LETTER DA -1B25 ; [.327A.0020.0002] # BALINESE LETTER DA MADU -1B26 ; [.327B.0020.0002] # BALINESE LETTER NA -1B27 ; [.327C.0020.0002] # BALINESE LETTER PA -1B48 ; [.327D.0020.0002] # BALINESE LETTER EF SASAK -1B28 ; [.327E.0020.0002] # BALINESE LETTER PA KAPAL -1B29 ; [.327F.0020.0002] # BALINESE LETTER BA -1B2A ; [.3280.0020.0002] # BALINESE LETTER BA KEMBANG -1B2B ; [.3281.0020.0002] # BALINESE LETTER MA -1B2C ; [.3282.0020.0002] # BALINESE LETTER YA -1B2D ; [.3283.0020.0002] # BALINESE LETTER RA -1B2E ; [.3284.0020.0002] # BALINESE LETTER LA -1B2F ; [.3285.0020.0002] # BALINESE LETTER WA -1B49 ; [.3286.0020.0002] # BALINESE LETTER VE SASAK -1B30 ; [.3287.0020.0002] # BALINESE LETTER SA SAGA -1B31 ; [.3288.0020.0002] # BALINESE LETTER SA SAPA -1B32 ; [.3289.0020.0002] # BALINESE LETTER SA -1B4A ; [.328A.0020.0002] # BALINESE LETTER ZAL SASAK -1B4B ; [.328B.0020.0002] # BALINESE LETTER ASYURA SASAK -1B33 ; [.328C.0020.0002] # BALINESE LETTER HA -1B35 ; [.328D.0020.0002] # BALINESE VOWEL SIGN TEDUNG -1B36 ; [.328E.0020.0002] # BALINESE VOWEL SIGN ULU -1B37 ; [.328F.0020.0002] # BALINESE VOWEL SIGN ULU SARI -1B38 ; [.3290.0020.0002] # BALINESE VOWEL SIGN SUKU -1B39 ; [.3291.0020.0002] # BALINESE VOWEL SIGN SUKU ILUT -1B3A ; [.3292.0020.0002] # BALINESE VOWEL SIGN RA REPA -1B3B ; [.3293.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG -1B3A 1B35 ; [.3293.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG -1B3C ; [.3294.0020.0002] # BALINESE VOWEL SIGN LA LENGA -1B3D ; [.3295.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG -1B3C 1B35 ; [.3295.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG -1B3E ; [.3296.0020.0002] # BALINESE VOWEL SIGN TALING -1B3F ; [.3297.0020.0002] # BALINESE VOWEL SIGN TALING REPA -1B40 ; [.3298.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG -1B3E 1B35 ; [.3298.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG -1B41 ; [.3299.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG -1B3F 1B35 ; [.3299.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG -1B42 ; [.329A.0020.0002] # BALINESE VOWEL SIGN PEPET -1B43 ; [.329B.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG -1B42 1B35 ; [.329B.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG -1B44 ; [.329C.0020.0002] # BALINESE ADEG ADEG -A984 ; [.329D.0020.0002] # JAVANESE LETTER A -A985 ; [.329E.0020.0002] # JAVANESE LETTER I KAWI -A986 ; [.329F.0020.0002] # JAVANESE LETTER I -A987 ; [.32A0.0020.0002] # JAVANESE LETTER II -A988 ; [.32A1.0020.0002] # JAVANESE LETTER U -A989 ; [.32A2.0020.0002] # JAVANESE LETTER PA CEREK -A98A ; [.32A3.0020.0002] # JAVANESE LETTER NGA LELET -A98B ; [.32A4.0020.0002] # JAVANESE LETTER NGA LELET RASWADI -A98C ; [.32A5.0020.0002] # JAVANESE LETTER E -A98D ; [.32A6.0020.0002] # JAVANESE LETTER AI -A98E ; [.32A7.0020.0002] # JAVANESE LETTER O -A98F ; [.32A8.0020.0002] # JAVANESE LETTER KA -A990 ; [.32A9.0020.0002] # JAVANESE LETTER KA SASAK -A991 ; [.32AA.0020.0002] # JAVANESE LETTER KA MURDA -A992 ; [.32AB.0020.0002] # JAVANESE LETTER GA -A993 ; [.32AC.0020.0002] # JAVANESE LETTER GA MURDA -A994 ; [.32AD.0020.0002] # JAVANESE LETTER NGA -A995 ; [.32AE.0020.0002] # JAVANESE LETTER CA -A996 ; [.32AF.0020.0002] # JAVANESE LETTER CA MURDA -A997 ; [.32B0.0020.0002] # JAVANESE LETTER JA -A998 ; [.32B1.0020.0002] # JAVANESE LETTER NYA MURDA -A999 ; [.32B2.0020.0002] # JAVANESE LETTER JA MAHAPRANA -A99A ; [.32B3.0020.0002] # JAVANESE LETTER NYA -A99B ; [.32B4.0020.0002] # JAVANESE LETTER TTA -A99C ; [.32B5.0020.0002] # JAVANESE LETTER TTA MAHAPRANA -A99D ; [.32B6.0020.0002] # JAVANESE LETTER DDA -A99E ; [.32B7.0020.0002] # JAVANESE LETTER DDA MAHAPRANA -A99F ; [.32B8.0020.0002] # JAVANESE LETTER NA MURDA -A9A0 ; [.32B9.0020.0002] # JAVANESE LETTER TA -A9A1 ; [.32BA.0020.0002] # JAVANESE LETTER TA MURDA -A9A2 ; [.32BB.0020.0002] # JAVANESE LETTER DA -A9A3 ; [.32BC.0020.0002] # JAVANESE LETTER DA MAHAPRANA -A9A4 ; [.32BD.0020.0002] # JAVANESE LETTER NA -A9A5 ; [.32BE.0020.0002] # JAVANESE LETTER PA -A9A6 ; [.32BF.0020.0002] # JAVANESE LETTER PA MURDA -A9A7 ; [.32C0.0020.0002] # JAVANESE LETTER BA -A9A8 ; [.32C1.0020.0002] # JAVANESE LETTER BA MURDA -A9A9 ; [.32C2.0020.0002] # JAVANESE LETTER MA -A9AA ; [.32C3.0020.0002] # JAVANESE LETTER YA -A9BE ; [.32C4.0020.0002] # JAVANESE CONSONANT SIGN PENGKAL -A9AB ; [.32C5.0020.0002] # JAVANESE LETTER RA -A9AC ; [.32C5.0020.0004] # JAVANESE LETTER RA AGUNG -A9BF ; [.32C6.0020.0002] # JAVANESE CONSONANT SIGN CAKRA -A9AD ; [.32C7.0020.0002] # JAVANESE LETTER LA -A9AE ; [.32C8.0020.0002] # JAVANESE LETTER WA -A9AF ; [.32C9.0020.0002] # JAVANESE LETTER SA MURDA -A9B0 ; [.32CA.0020.0002] # JAVANESE LETTER SA MAHAPRANA -A9B1 ; [.32CB.0020.0002] # JAVANESE LETTER SA -A9B2 ; [.32CC.0020.0002] # JAVANESE LETTER HA -A9B4 ; [.32CD.0020.0002] # JAVANESE VOWEL SIGN TARUNG -A9BC ; [.32CE.0020.0002] # JAVANESE VOWEL SIGN PEPET -A9B6 ; [.32CF.0020.0002] # JAVANESE VOWEL SIGN WULU -A9B7 ; [.32D0.0020.0002] # JAVANESE VOWEL SIGN WULU MELIK -A9B8 ; [.32D1.0020.0002] # JAVANESE VOWEL SIGN SUKU -A9B9 ; [.32D2.0020.0002] # JAVANESE VOWEL SIGN SUKU MENDUT -A9BD ; [.32D3.0020.0002] # JAVANESE CONSONANT SIGN KERET -A9BA ; [.32D4.0020.0002] # JAVANESE VOWEL SIGN TALING -A9BB ; [.32D5.0020.0002] # JAVANESE VOWEL SIGN DIRGA MURE -A9B5 ; [.32D6.0020.0002] # JAVANESE VOWEL SIGN TOLONG -A9C0 ; [.32D7.0020.0002] # JAVANESE PANGKON -1880 ; [.32D8.0020.0002] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE -1881 ; [.32D9.0020.0002] # MONGOLIAN LETTER ALI GALI VISARGA ONE -1882 ; [.32DA.0020.0002] # MONGOLIAN LETTER ALI GALI DAMARU -1883 ; [.32DB.0020.0002] # MONGOLIAN LETTER ALI GALI UBADAMA -1884 ; [.32DC.0020.0002] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA -1885 ; [.32DD.0020.0002] # MONGOLIAN LETTER ALI GALI BALUDA -1886 ; [.32DE.0020.0002] # MONGOLIAN LETTER ALI GALI THREE BALUDA -1843 ; [.32DF.0020.0002] # MONGOLIAN LETTER TODO LONG VOWEL SIGN -1820 ; [.32E0.0020.0002] # MONGOLIAN LETTER A -1887 ; [.32E1.0020.0002] # MONGOLIAN LETTER ALI GALI A -1821 ; [.32E2.0020.0002] # MONGOLIAN LETTER E -1844 ; [.32E3.0020.0002] # MONGOLIAN LETTER TODO E -185D ; [.32E4.0020.0002] # MONGOLIAN LETTER SIBE E -1822 ; [.32E5.0020.0002] # MONGOLIAN LETTER I -1845 ; [.32E6.0020.0002] # MONGOLIAN LETTER TODO I -185E ; [.32E7.0020.0002] # MONGOLIAN LETTER SIBE I -1873 ; [.32E8.0020.0002] # MONGOLIAN LETTER MANCHU I -1888 ; [.32E9.0020.0002] # MONGOLIAN LETTER ALI GALI I -185F ; [.32EA.0020.0002] # MONGOLIAN LETTER SIBE IY -1823 ; [.32EB.0020.0002] # MONGOLIAN LETTER O -1846 ; [.32EC.0020.0002] # MONGOLIAN LETTER TODO O -1824 ; [.32ED.0020.0002] # MONGOLIAN LETTER U -1847 ; [.32EE.0020.0002] # MONGOLIAN LETTER TODO U -1861 ; [.32EF.0020.0002] # MONGOLIAN LETTER SIBE U -1825 ; [.32F0.0020.0002] # MONGOLIAN LETTER OE -1848 ; [.32F1.0020.0002] # MONGOLIAN LETTER TODO OE -1826 ; [.32F2.0020.0002] # MONGOLIAN LETTER UE -1849 ; [.32F3.0020.0002] # MONGOLIAN LETTER TODO UE -1860 ; [.32F4.0020.0002] # MONGOLIAN LETTER SIBE UE -1827 ; [.32F5.0020.0002] # MONGOLIAN LETTER EE -1828 ; [.32F6.0020.0002] # MONGOLIAN LETTER NA -1829 ; [.32F7.0020.0002] # MONGOLIAN LETTER ANG -184A ; [.32F8.0020.0002] # MONGOLIAN LETTER TODO ANG -1862 ; [.32F9.0020.0002] # MONGOLIAN LETTER SIBE ANG -188A ; [.32FA.0020.0002] # MONGOLIAN LETTER ALI GALI NGA -189B ; [.32FB.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI NGA -182A ; [.32FC.0020.0002] # MONGOLIAN LETTER BA -184B ; [.32FD.0020.0002] # MONGOLIAN LETTER TODO BA -182B ; [.32FE.0020.0002] # MONGOLIAN LETTER PA -184C ; [.32FF.0020.0002] # MONGOLIAN LETTER TODO PA -1866 ; [.3300.0020.0002] # MONGOLIAN LETTER SIBE PA -182C ; [.3301.0020.0002] # MONGOLIAN LETTER QA -184D ; [.3302.0020.0002] # MONGOLIAN LETTER TODO QA -182D ; [.3303.0020.0002] # MONGOLIAN LETTER GA -184E ; [.3304.0020.0002] # MONGOLIAN LETTER TODO GA -1864 ; [.3305.0020.0002] # MONGOLIAN LETTER SIBE GA -189A ; [.3306.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI GHA -1865 ; [.3307.0020.0002] # MONGOLIAN LETTER SIBE HA -182E ; [.3308.0020.0002] # MONGOLIAN LETTER MA -184F ; [.3309.0020.0002] # MONGOLIAN LETTER TODO MA -182F ; [.330A.0020.0002] # MONGOLIAN LETTER LA -1830 ; [.330B.0020.0002] # MONGOLIAN LETTER SA -1831 ; [.330C.0020.0002] # MONGOLIAN LETTER SHA -1867 ; [.330D.0020.0002] # MONGOLIAN LETTER SIBE SHA -189C ; [.330E.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CA -189D ; [.330F.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI JHA -18A2 ; [.3310.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI SSA -18A4 ; [.3311.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZHA -18A5 ; [.3312.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZA -1832 ; [.3313.0020.0002] # MONGOLIAN LETTER TA -1850 ; [.3314.0020.0002] # MONGOLIAN LETTER TODO TA -1868 ; [.3315.0020.0002] # MONGOLIAN LETTER SIBE TA -1833 ; [.3316.0020.0002] # MONGOLIAN LETTER DA -1851 ; [.3317.0020.0002] # MONGOLIAN LETTER TODO DA -1869 ; [.3318.0020.0002] # MONGOLIAN LETTER SIBE DA -1834 ; [.3319.0020.0002] # MONGOLIAN LETTER CHA -1852 ; [.331A.0020.0002] # MONGOLIAN LETTER TODO CHA -1871 ; [.331B.0020.0002] # MONGOLIAN LETTER SIBE CHA -185C ; [.331C.0020.0002] # MONGOLIAN LETTER TODO DZA -188B ; [.331D.0020.0002] # MONGOLIAN LETTER ALI GALI CA -1835 ; [.331E.0020.0002] # MONGOLIAN LETTER JA -1853 ; [.331F.0020.0002] # MONGOLIAN LETTER TODO JA -186A ; [.3320.0020.0002] # MONGOLIAN LETTER SIBE JA -1877 ; [.3321.0020.0002] # MONGOLIAN LETTER MANCHU ZHA -1836 ; [.3322.0020.0002] # MONGOLIAN LETTER YA -1855 ; [.3323.0020.0002] # MONGOLIAN LETTER TODO YA -1872 ; [.3324.0020.0002] # MONGOLIAN LETTER SIBE ZHA -1837 ; [.3325.0020.0002] # MONGOLIAN LETTER RA -1875 ; [.3326.0020.0002] # MONGOLIAN LETTER MANCHU RA -1838 ; [.3327.0020.0002] # MONGOLIAN LETTER WA -1856 ; [.3328.0020.0002] # MONGOLIAN LETTER TODO WA -1839 ; [.3329.0020.0002] # MONGOLIAN LETTER FA -186B ; [.332A.0020.0002] # MONGOLIAN LETTER SIBE FA -1876 ; [.332B.0020.0002] # MONGOLIAN LETTER MANCHU FA -183A ; [.332C.0020.0002] # MONGOLIAN LETTER KA -1857 ; [.332D.0020.0002] # MONGOLIAN LETTER TODO KA -1863 ; [.332E.0020.0002] # MONGOLIAN LETTER SIBE KA -1874 ; [.332F.0020.0002] # MONGOLIAN LETTER MANCHU KA -1889 ; [.3330.0020.0002] # MONGOLIAN LETTER ALI GALI KA -183B ; [.3331.0020.0002] # MONGOLIAN LETTER KHA -183C ; [.3332.0020.0002] # MONGOLIAN LETTER TSA -1854 ; [.3333.0020.0002] # MONGOLIAN LETTER TODO TSA -186E ; [.3334.0020.0002] # MONGOLIAN LETTER SIBE TSA -183D ; [.3335.0020.0002] # MONGOLIAN LETTER ZA -186F ; [.3336.0020.0002] # MONGOLIAN LETTER SIBE ZA -1858 ; [.3337.0020.0002] # MONGOLIAN LETTER TODO GAA -186C ; [.3338.0020.0002] # MONGOLIAN LETTER SIBE GAA -183E ; [.3339.0020.0002] # MONGOLIAN LETTER HAA -1859 ; [.333A.0020.0002] # MONGOLIAN LETTER TODO HAA -186D ; [.333B.0020.0002] # MONGOLIAN LETTER SIBE HAA -183F ; [.333C.0020.0002] # MONGOLIAN LETTER ZRA -1840 ; [.333D.0020.0002] # MONGOLIAN LETTER LHA -1841 ; [.333E.0020.0002] # MONGOLIAN LETTER ZHI -1842 ; [.333F.0020.0002] # MONGOLIAN LETTER CHI -185A ; [.3340.0020.0002] # MONGOLIAN LETTER TODO JIA -185B ; [.3341.0020.0002] # MONGOLIAN LETTER TODO NIA -1870 ; [.3342.0020.0002] # MONGOLIAN LETTER SIBE RAA -188C ; [.3343.0020.0002] # MONGOLIAN LETTER ALI GALI TTA -189E ; [.3344.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TTA -188D ; [.3345.0020.0002] # MONGOLIAN LETTER ALI GALI TTHA -188E ; [.3346.0020.0002] # MONGOLIAN LETTER ALI GALI DDA -189F ; [.3347.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DDHA -188F ; [.3348.0020.0002] # MONGOLIAN LETTER ALI GALI NNA -1890 ; [.3349.0020.0002] # MONGOLIAN LETTER ALI GALI TA -1898 ; [.334A.0020.0002] # MONGOLIAN LETTER TODO ALI GALI TA -18A0 ; [.334B.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TA -1891 ; [.334C.0020.0002] # MONGOLIAN LETTER ALI GALI DA -18A1 ; [.334D.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DHA -1892 ; [.334E.0020.0002] # MONGOLIAN LETTER ALI GALI PA -1893 ; [.334F.0020.0002] # MONGOLIAN LETTER ALI GALI PHA -18A8 ; [.3350.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI BHA -1894 ; [.3351.0020.0002] # MONGOLIAN LETTER ALI GALI SSA -18A3 ; [.3352.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CYA -1895 ; [.3353.0020.0002] # MONGOLIAN LETTER ALI GALI ZHA -1899 ; [.3354.0020.0002] # MONGOLIAN LETTER TODO ALI GALI ZHA -1896 ; [.3355.0020.0002] # MONGOLIAN LETTER ALI GALI ZA -1897 ; [.3356.0020.0002] # MONGOLIAN LETTER ALI GALI AH -18A6 ; [.3357.0020.0002] # MONGOLIAN LETTER ALI GALI HALF U -18A7 ; [.3358.0020.0002] # MONGOLIAN LETTER ALI GALI HALF YA -18AA ; [.3359.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI LHA -18A9 ; [.335A.0020.0002] # MONGOLIAN LETTER ALI GALI DAGALGA -1C5A ; [.335B.0020.0002] # OL CHIKI LETTER LA -1C5B ; [.335C.0020.0002] # OL CHIKI LETTER AT -1C5C ; [.335D.0020.0002] # OL CHIKI LETTER AG -1C5D ; [.335E.0020.0002] # OL CHIKI LETTER ANG -1C5E ; [.335F.0020.0002] # OL CHIKI LETTER AL -1C5F ; [.3360.0020.0002] # OL CHIKI LETTER LAA -1C60 ; [.3361.0020.0002] # OL CHIKI LETTER AAK -1C61 ; [.3362.0020.0002] # OL CHIKI LETTER AAJ -1C62 ; [.3363.0020.0002] # OL CHIKI LETTER AAM -1C63 ; [.3364.0020.0002] # OL CHIKI LETTER AAW -1C64 ; [.3365.0020.0002] # OL CHIKI LETTER LI -1C65 ; [.3366.0020.0002] # OL CHIKI LETTER IS -1C66 ; [.3367.0020.0002] # OL CHIKI LETTER IH -1C67 ; [.3368.0020.0002] # OL CHIKI LETTER INY -1C68 ; [.3369.0020.0002] # OL CHIKI LETTER IR -1C69 ; [.336A.0020.0002] # OL CHIKI LETTER LU -1C6A ; [.336B.0020.0002] # OL CHIKI LETTER UC -1C6B ; [.336C.0020.0002] # OL CHIKI LETTER UD -1C6C ; [.336D.0020.0002] # OL CHIKI LETTER UNN -1C6D ; [.336E.0020.0002] # OL CHIKI LETTER UY -1C6E ; [.336F.0020.0002] # OL CHIKI LETTER LE -1C6F ; [.3370.0020.0002] # OL CHIKI LETTER EP -1C70 ; [.3371.0020.0002] # OL CHIKI LETTER EDD -1C71 ; [.3372.0020.0002] # OL CHIKI LETTER EN -1C72 ; [.3373.0020.0002] # OL CHIKI LETTER ERR -1C73 ; [.3374.0020.0002] # OL CHIKI LETTER LO -1C74 ; [.3375.0020.0002] # OL CHIKI LETTER OTT -1C75 ; [.3376.0020.0002] # OL CHIKI LETTER OB -1C76 ; [.3377.0020.0002] # OL CHIKI LETTER OV -1C77 ; [.3378.0020.0002] # OL CHIKI LETTER OH -1C78 ; [.3379.0020.0002] # OL CHIKI MU TTUDDAG -1C79 ; [.337A.0020.0002] # OL CHIKI GAAHLAA TTUDDAAG -1C7A ; [.337B.0020.0002] # OL CHIKI MU-GAAHLAA TTUDDAAG -1C7B ; [.337C.0020.0002] # OL CHIKI RELAA -1C7C ; [.337D.0020.0002] # OL CHIKI PHAARKAA -1C7D ; [.337E.0020.0002] # OL CHIKI AHAD -AB70 ; [.337F.0020.0002] # CHEROKEE SMALL LETTER A -13A0 ; [.337F.0020.0008] # CHEROKEE LETTER A -AB71 ; [.3380.0020.0002] # CHEROKEE SMALL LETTER E -13A1 ; [.3380.0020.0008] # CHEROKEE LETTER E -AB72 ; [.3381.0020.0002] # CHEROKEE SMALL LETTER I -13A2 ; [.3381.0020.0008] # CHEROKEE LETTER I -AB73 ; [.3382.0020.0002] # CHEROKEE SMALL LETTER O -13A3 ; [.3382.0020.0008] # CHEROKEE LETTER O -AB74 ; [.3383.0020.0002] # CHEROKEE SMALL LETTER U -13A4 ; [.3383.0020.0008] # CHEROKEE LETTER U -AB75 ; [.3384.0020.0002] # CHEROKEE SMALL LETTER V -13A5 ; [.3384.0020.0008] # CHEROKEE LETTER V -AB76 ; [.3385.0020.0002] # CHEROKEE SMALL LETTER GA -13A6 ; [.3385.0020.0008] # CHEROKEE LETTER GA -AB77 ; [.3386.0020.0002] # CHEROKEE SMALL LETTER KA -13A7 ; [.3386.0020.0008] # CHEROKEE LETTER KA -AB78 ; [.3387.0020.0002] # CHEROKEE SMALL LETTER GE -13A8 ; [.3387.0020.0008] # CHEROKEE LETTER GE -AB79 ; [.3388.0020.0002] # CHEROKEE SMALL LETTER GI -13A9 ; [.3388.0020.0008] # CHEROKEE LETTER GI -AB7A ; [.3389.0020.0002] # CHEROKEE SMALL LETTER GO -13AA ; [.3389.0020.0008] # CHEROKEE LETTER GO -AB7B ; [.338A.0020.0002] # CHEROKEE SMALL LETTER GU -13AB ; [.338A.0020.0008] # CHEROKEE LETTER GU -AB7C ; [.338B.0020.0002] # CHEROKEE SMALL LETTER GV -13AC ; [.338B.0020.0008] # CHEROKEE LETTER GV -AB7D ; [.338C.0020.0002] # CHEROKEE SMALL LETTER HA -13AD ; [.338C.0020.0008] # CHEROKEE LETTER HA -AB7E ; [.338D.0020.0002] # CHEROKEE SMALL LETTER HE -13AE ; [.338D.0020.0008] # CHEROKEE LETTER HE -AB7F ; [.338E.0020.0002] # CHEROKEE SMALL LETTER HI -13AF ; [.338E.0020.0008] # CHEROKEE LETTER HI -AB80 ; [.338F.0020.0002] # CHEROKEE SMALL LETTER HO -13B0 ; [.338F.0020.0008] # CHEROKEE LETTER HO -AB81 ; [.3390.0020.0002] # CHEROKEE SMALL LETTER HU -13B1 ; [.3390.0020.0008] # CHEROKEE LETTER HU -AB82 ; [.3391.0020.0002] # CHEROKEE SMALL LETTER HV -13B2 ; [.3391.0020.0008] # CHEROKEE LETTER HV -AB83 ; [.3392.0020.0002] # CHEROKEE SMALL LETTER LA -13B3 ; [.3392.0020.0008] # CHEROKEE LETTER LA -AB84 ; [.3393.0020.0002] # CHEROKEE SMALL LETTER LE -13B4 ; [.3393.0020.0008] # CHEROKEE LETTER LE -AB85 ; [.3394.0020.0002] # CHEROKEE SMALL LETTER LI -13B5 ; [.3394.0020.0008] # CHEROKEE LETTER LI -AB86 ; [.3395.0020.0002] # CHEROKEE SMALL LETTER LO -13B6 ; [.3395.0020.0008] # CHEROKEE LETTER LO -AB87 ; [.3396.0020.0002] # CHEROKEE SMALL LETTER LU -13B7 ; [.3396.0020.0008] # CHEROKEE LETTER LU -AB88 ; [.3397.0020.0002] # CHEROKEE SMALL LETTER LV -13B8 ; [.3397.0020.0008] # CHEROKEE LETTER LV -AB89 ; [.3398.0020.0002] # CHEROKEE SMALL LETTER MA -13B9 ; [.3398.0020.0008] # CHEROKEE LETTER MA -AB8A ; [.3399.0020.0002] # CHEROKEE SMALL LETTER ME -13BA ; [.3399.0020.0008] # CHEROKEE LETTER ME -AB8B ; [.339A.0020.0002] # CHEROKEE SMALL LETTER MI -13BB ; [.339A.0020.0008] # CHEROKEE LETTER MI -AB8C ; [.339B.0020.0002] # CHEROKEE SMALL LETTER MO -13BC ; [.339B.0020.0008] # CHEROKEE LETTER MO -AB8D ; [.339C.0020.0002] # CHEROKEE SMALL LETTER MU -13BD ; [.339C.0020.0008] # CHEROKEE LETTER MU -AB8E ; [.339D.0020.0002] # CHEROKEE SMALL LETTER NA -13BE ; [.339D.0020.0008] # CHEROKEE LETTER NA -AB8F ; [.339E.0020.0002] # CHEROKEE SMALL LETTER HNA -13BF ; [.339E.0020.0008] # CHEROKEE LETTER HNA -AB90 ; [.339F.0020.0002] # CHEROKEE SMALL LETTER NAH -13C0 ; [.339F.0020.0008] # CHEROKEE LETTER NAH -AB91 ; [.33A0.0020.0002] # CHEROKEE SMALL LETTER NE -13C1 ; [.33A0.0020.0008] # CHEROKEE LETTER NE -AB92 ; [.33A1.0020.0002] # CHEROKEE SMALL LETTER NI -13C2 ; [.33A1.0020.0008] # CHEROKEE LETTER NI -AB93 ; [.33A2.0020.0002] # CHEROKEE SMALL LETTER NO -13C3 ; [.33A2.0020.0008] # CHEROKEE LETTER NO -AB94 ; [.33A3.0020.0002] # CHEROKEE SMALL LETTER NU -13C4 ; [.33A3.0020.0008] # CHEROKEE LETTER NU -AB95 ; [.33A4.0020.0002] # CHEROKEE SMALL LETTER NV -13C5 ; [.33A4.0020.0008] # CHEROKEE LETTER NV -AB96 ; [.33A5.0020.0002] # CHEROKEE SMALL LETTER QUA -13C6 ; [.33A5.0020.0008] # CHEROKEE LETTER QUA -AB97 ; [.33A6.0020.0002] # CHEROKEE SMALL LETTER QUE -13C7 ; [.33A6.0020.0008] # CHEROKEE LETTER QUE -AB98 ; [.33A7.0020.0002] # CHEROKEE SMALL LETTER QUI -13C8 ; [.33A7.0020.0008] # CHEROKEE LETTER QUI -AB99 ; [.33A8.0020.0002] # CHEROKEE SMALL LETTER QUO -13C9 ; [.33A8.0020.0008] # CHEROKEE LETTER QUO -AB9A ; [.33A9.0020.0002] # CHEROKEE SMALL LETTER QUU -13CA ; [.33A9.0020.0008] # CHEROKEE LETTER QUU -AB9B ; [.33AA.0020.0002] # CHEROKEE SMALL LETTER QUV -13CB ; [.33AA.0020.0008] # CHEROKEE LETTER QUV -AB9C ; [.33AB.0020.0002] # CHEROKEE SMALL LETTER SA -13CC ; [.33AB.0020.0008] # CHEROKEE LETTER SA -AB9D ; [.33AC.0020.0002] # CHEROKEE SMALL LETTER S -13CD ; [.33AC.0020.0008] # CHEROKEE LETTER S -AB9E ; [.33AD.0020.0002] # CHEROKEE SMALL LETTER SE -13CE ; [.33AD.0020.0008] # CHEROKEE LETTER SE -AB9F ; [.33AE.0020.0002] # CHEROKEE SMALL LETTER SI -13CF ; [.33AE.0020.0008] # CHEROKEE LETTER SI -ABA0 ; [.33AF.0020.0002] # CHEROKEE SMALL LETTER SO -13D0 ; [.33AF.0020.0008] # CHEROKEE LETTER SO -ABA1 ; [.33B0.0020.0002] # CHEROKEE SMALL LETTER SU -13D1 ; [.33B0.0020.0008] # CHEROKEE LETTER SU -ABA2 ; [.33B1.0020.0002] # CHEROKEE SMALL LETTER SV -13D2 ; [.33B1.0020.0008] # CHEROKEE LETTER SV -ABA3 ; [.33B2.0020.0002] # CHEROKEE SMALL LETTER DA -13D3 ; [.33B2.0020.0008] # CHEROKEE LETTER DA -ABA4 ; [.33B3.0020.0002] # CHEROKEE SMALL LETTER TA -13D4 ; [.33B3.0020.0008] # CHEROKEE LETTER TA -ABA5 ; [.33B4.0020.0002] # CHEROKEE SMALL LETTER DE -13D5 ; [.33B4.0020.0008] # CHEROKEE LETTER DE -ABA6 ; [.33B5.0020.0002] # CHEROKEE SMALL LETTER TE -13D6 ; [.33B5.0020.0008] # CHEROKEE LETTER TE -ABA7 ; [.33B6.0020.0002] # CHEROKEE SMALL LETTER DI -13D7 ; [.33B6.0020.0008] # CHEROKEE LETTER DI -ABA8 ; [.33B7.0020.0002] # CHEROKEE SMALL LETTER TI -13D8 ; [.33B7.0020.0008] # CHEROKEE LETTER TI -ABA9 ; [.33B8.0020.0002] # CHEROKEE SMALL LETTER DO -13D9 ; [.33B8.0020.0008] # CHEROKEE LETTER DO -ABAA ; [.33B9.0020.0002] # CHEROKEE SMALL LETTER DU -13DA ; [.33B9.0020.0008] # CHEROKEE LETTER DU -ABAB ; [.33BA.0020.0002] # CHEROKEE SMALL LETTER DV -13DB ; [.33BA.0020.0008] # CHEROKEE LETTER DV -ABAC ; [.33BB.0020.0002] # CHEROKEE SMALL LETTER DLA -13DC ; [.33BB.0020.0008] # CHEROKEE LETTER DLA -ABAD ; [.33BC.0020.0002] # CHEROKEE SMALL LETTER TLA -13DD ; [.33BC.0020.0008] # CHEROKEE LETTER TLA -ABAE ; [.33BD.0020.0002] # CHEROKEE SMALL LETTER TLE -13DE ; [.33BD.0020.0008] # CHEROKEE LETTER TLE -ABAF ; [.33BE.0020.0002] # CHEROKEE SMALL LETTER TLI -13DF ; [.33BE.0020.0008] # CHEROKEE LETTER TLI -ABB0 ; [.33BF.0020.0002] # CHEROKEE SMALL LETTER TLO -13E0 ; [.33BF.0020.0008] # CHEROKEE LETTER TLO -ABB1 ; [.33C0.0020.0002] # CHEROKEE SMALL LETTER TLU -13E1 ; [.33C0.0020.0008] # CHEROKEE LETTER TLU -ABB2 ; [.33C1.0020.0002] # CHEROKEE SMALL LETTER TLV -13E2 ; [.33C1.0020.0008] # CHEROKEE LETTER TLV -ABB3 ; [.33C2.0020.0002] # CHEROKEE SMALL LETTER TSA -13E3 ; [.33C2.0020.0008] # CHEROKEE LETTER TSA -ABB4 ; [.33C3.0020.0002] # CHEROKEE SMALL LETTER TSE -13E4 ; [.33C3.0020.0008] # CHEROKEE LETTER TSE -ABB5 ; [.33C4.0020.0002] # CHEROKEE SMALL LETTER TSI -13E5 ; [.33C4.0020.0008] # CHEROKEE LETTER TSI -ABB6 ; [.33C5.0020.0002] # CHEROKEE SMALL LETTER TSO -13E6 ; [.33C5.0020.0008] # CHEROKEE LETTER TSO -ABB7 ; [.33C6.0020.0002] # CHEROKEE SMALL LETTER TSU -13E7 ; [.33C6.0020.0008] # CHEROKEE LETTER TSU -ABB8 ; [.33C7.0020.0002] # CHEROKEE SMALL LETTER TSV -13E8 ; [.33C7.0020.0008] # CHEROKEE LETTER TSV -ABB9 ; [.33C8.0020.0002] # CHEROKEE SMALL LETTER WA -13E9 ; [.33C8.0020.0008] # CHEROKEE LETTER WA -ABBA ; [.33C9.0020.0002] # CHEROKEE SMALL LETTER WE -13EA ; [.33C9.0020.0008] # CHEROKEE LETTER WE -ABBB ; [.33CA.0020.0002] # CHEROKEE SMALL LETTER WI -13EB ; [.33CA.0020.0008] # CHEROKEE LETTER WI -ABBC ; [.33CB.0020.0002] # CHEROKEE SMALL LETTER WO -13EC ; [.33CB.0020.0008] # CHEROKEE LETTER WO -ABBD ; [.33CC.0020.0002] # CHEROKEE SMALL LETTER WU -13ED ; [.33CC.0020.0008] # CHEROKEE LETTER WU -ABBE ; [.33CD.0020.0002] # CHEROKEE SMALL LETTER WV -13EE ; [.33CD.0020.0008] # CHEROKEE LETTER WV -ABBF ; [.33CE.0020.0002] # CHEROKEE SMALL LETTER YA -13EF ; [.33CE.0020.0008] # CHEROKEE LETTER YA -13F8 ; [.33CF.0020.0002] # CHEROKEE SMALL LETTER YE -13F0 ; [.33CF.0020.0008] # CHEROKEE LETTER YE -13F9 ; [.33D0.0020.0002] # CHEROKEE SMALL LETTER YI -13F1 ; [.33D0.0020.0008] # CHEROKEE LETTER YI -13FA ; [.33D1.0020.0002] # CHEROKEE SMALL LETTER YO -13F2 ; [.33D1.0020.0008] # CHEROKEE LETTER YO -13FB ; [.33D2.0020.0002] # CHEROKEE SMALL LETTER YU -13F3 ; [.33D2.0020.0008] # CHEROKEE LETTER YU -13FC ; [.33D3.0020.0002] # CHEROKEE SMALL LETTER YV -13F4 ; [.33D3.0020.0008] # CHEROKEE LETTER YV -13FD ; [.33D4.0020.0002] # CHEROKEE SMALL LETTER MV -13F5 ; [.33D4.0020.0008] # CHEROKEE LETTER MV -104D8 ; [.33D5.0020.0002] # OSAGE SMALL LETTER A -104B0 ; [.33D5.0020.0008] # OSAGE CAPITAL LETTER A -104D9 ; [.33D6.0020.0002] # OSAGE SMALL LETTER AI -104B1 ; [.33D6.0020.0008] # OSAGE CAPITAL LETTER AI -104DA ; [.33D7.0020.0002] # OSAGE SMALL LETTER AIN -104B2 ; [.33D7.0020.0008] # OSAGE CAPITAL LETTER AIN -104DB ; [.33D8.0020.0002] # OSAGE SMALL LETTER AH -104B3 ; [.33D8.0020.0008] # OSAGE CAPITAL LETTER AH -104DC ; [.33D9.0020.0002] # OSAGE SMALL LETTER BRA -104B4 ; [.33D9.0020.0008] # OSAGE CAPITAL LETTER BRA -104DD ; [.33DA.0020.0002] # OSAGE SMALL LETTER CHA -104B5 ; [.33DA.0020.0008] # OSAGE CAPITAL LETTER CHA -104DE ; [.33DB.0020.0002] # OSAGE SMALL LETTER EHCHA -104B6 ; [.33DB.0020.0008] # OSAGE CAPITAL LETTER EHCHA -104DF ; [.33DC.0020.0002] # OSAGE SMALL LETTER E -104B7 ; [.33DC.0020.0008] # OSAGE CAPITAL LETTER E -104E0 ; [.33DD.0020.0002] # OSAGE SMALL LETTER EIN -104B8 ; [.33DD.0020.0008] # OSAGE CAPITAL LETTER EIN -104E1 ; [.33DE.0020.0002] # OSAGE SMALL LETTER HA -104B9 ; [.33DE.0020.0008] # OSAGE CAPITAL LETTER HA -104E2 ; [.33DF.0020.0002] # OSAGE SMALL LETTER HYA -104BA ; [.33DF.0020.0008] # OSAGE CAPITAL LETTER HYA -104E3 ; [.33E0.0020.0002] # OSAGE SMALL LETTER I -104BB ; [.33E0.0020.0008] # OSAGE CAPITAL LETTER I -104E4 ; [.33E1.0020.0002] # OSAGE SMALL LETTER KA -104BC ; [.33E1.0020.0008] # OSAGE CAPITAL LETTER KA -104E5 ; [.33E2.0020.0002] # OSAGE SMALL LETTER EHKA -104BD ; [.33E2.0020.0008] # OSAGE CAPITAL LETTER EHKA -104E6 ; [.33E3.0020.0002] # OSAGE SMALL LETTER KYA -104BE ; [.33E3.0020.0008] # OSAGE CAPITAL LETTER KYA -104E7 ; [.33E4.0020.0002] # OSAGE SMALL LETTER LA -104BF ; [.33E4.0020.0008] # OSAGE CAPITAL LETTER LA -104E8 ; [.33E5.0020.0002] # OSAGE SMALL LETTER MA -104C0 ; [.33E5.0020.0008] # OSAGE CAPITAL LETTER MA -104E9 ; [.33E6.0020.0002] # OSAGE SMALL LETTER NA -104C1 ; [.33E6.0020.0008] # OSAGE CAPITAL LETTER NA -104EA ; [.33E7.0020.0002] # OSAGE SMALL LETTER O -104C2 ; [.33E7.0020.0008] # OSAGE CAPITAL LETTER O -104EB ; [.33E8.0020.0002] # OSAGE SMALL LETTER OIN -104C3 ; [.33E8.0020.0008] # OSAGE CAPITAL LETTER OIN -104EC ; [.33E9.0020.0002] # OSAGE SMALL LETTER PA -104C4 ; [.33E9.0020.0008] # OSAGE CAPITAL LETTER PA -104ED ; [.33EA.0020.0002] # OSAGE SMALL LETTER EHPA -104C5 ; [.33EA.0020.0008] # OSAGE CAPITAL LETTER EHPA -104EE ; [.33EB.0020.0002] # OSAGE SMALL LETTER SA -104C6 ; [.33EB.0020.0008] # OSAGE CAPITAL LETTER SA -104EF ; [.33EC.0020.0002] # OSAGE SMALL LETTER SHA -104C7 ; [.33EC.0020.0008] # OSAGE CAPITAL LETTER SHA -104F0 ; [.33ED.0020.0002] # OSAGE SMALL LETTER TA -104C8 ; [.33ED.0020.0008] # OSAGE CAPITAL LETTER TA -104F1 ; [.33EE.0020.0002] # OSAGE SMALL LETTER EHTA -104C9 ; [.33EE.0020.0008] # OSAGE CAPITAL LETTER EHTA -104F2 ; [.33EF.0020.0002] # OSAGE SMALL LETTER TSA -104CA ; [.33EF.0020.0008] # OSAGE CAPITAL LETTER TSA -104F3 ; [.33F0.0020.0002] # OSAGE SMALL LETTER EHTSA -104CB ; [.33F0.0020.0008] # OSAGE CAPITAL LETTER EHTSA -104F4 ; [.33F1.0020.0002] # OSAGE SMALL LETTER TSHA -104CC ; [.33F1.0020.0008] # OSAGE CAPITAL LETTER TSHA -104F5 ; [.33F2.0020.0002] # OSAGE SMALL LETTER DHA -104CD ; [.33F2.0020.0008] # OSAGE CAPITAL LETTER DHA -104F6 ; [.33F3.0020.0002] # OSAGE SMALL LETTER U -104CE ; [.33F3.0020.0008] # OSAGE CAPITAL LETTER U -104F7 ; [.33F4.0020.0002] # OSAGE SMALL LETTER WA -104CF ; [.33F4.0020.0008] # OSAGE CAPITAL LETTER WA -104F8 ; [.33F5.0020.0002] # OSAGE SMALL LETTER KHA -104D0 ; [.33F5.0020.0008] # OSAGE CAPITAL LETTER KHA -104F9 ; [.33F6.0020.0002] # OSAGE SMALL LETTER GHA -104D1 ; [.33F6.0020.0008] # OSAGE CAPITAL LETTER GHA -104FA ; [.33F7.0020.0002] # OSAGE SMALL LETTER ZA -104D2 ; [.33F7.0020.0008] # OSAGE CAPITAL LETTER ZA -104FB ; [.33F8.0020.0002] # OSAGE SMALL LETTER ZHA -104D3 ; [.33F8.0020.0008] # OSAGE CAPITAL LETTER ZHA -1401 ; [.33F9.0020.0002] # CANADIAN SYLLABICS E -1402 ; [.33FA.0020.0002] # CANADIAN SYLLABICS AAI -1403 ; [.33FB.0020.0002] # CANADIAN SYLLABICS I -1404 ; [.33FC.0020.0002] # CANADIAN SYLLABICS II -1405 ; [.33FD.0020.0002] # CANADIAN SYLLABICS O -1406 ; [.33FE.0020.0002] # CANADIAN SYLLABICS OO -1407 ; [.33FF.0020.0002] # CANADIAN SYLLABICS Y-CREE OO -1408 ; [.3400.0020.0002] # CANADIAN SYLLABICS CARRIER EE -1409 ; [.3401.0020.0002] # CANADIAN SYLLABICS CARRIER I -140A ; [.3402.0020.0002] # CANADIAN SYLLABICS A -140B ; [.3403.0020.0002] # CANADIAN SYLLABICS AA -140C ; [.3404.0020.0002] # CANADIAN SYLLABICS WE -140D ; [.3405.0020.0002] # CANADIAN SYLLABICS WEST-CREE WE -140E ; [.3406.0020.0002] # CANADIAN SYLLABICS WI -140F ; [.3407.0020.0002] # CANADIAN SYLLABICS WEST-CREE WI -1410 ; [.3408.0020.0002] # CANADIAN SYLLABICS WII -1411 ; [.3409.0020.0002] # CANADIAN SYLLABICS WEST-CREE WII -1412 ; [.340A.0020.0002] # CANADIAN SYLLABICS WO -1413 ; [.340B.0020.0002] # CANADIAN SYLLABICS WEST-CREE WO -1414 ; [.340C.0020.0002] # CANADIAN SYLLABICS WOO -1415 ; [.340D.0020.0002] # CANADIAN SYLLABICS WEST-CREE WOO -1416 ; [.340E.0020.0002] # CANADIAN SYLLABICS NASKAPI WOO -1417 ; [.340F.0020.0002] # CANADIAN SYLLABICS WA -1418 ; [.3410.0020.0002] # CANADIAN SYLLABICS WEST-CREE WA -1419 ; [.3411.0020.0002] # CANADIAN SYLLABICS WAA -141A ; [.3412.0020.0002] # CANADIAN SYLLABICS WEST-CREE WAA -141B ; [.3413.0020.0002] # CANADIAN SYLLABICS NASKAPI WAA -141C ; [.3414.0020.0002] # CANADIAN SYLLABICS AI -141D ; [.3415.0020.0002] # CANADIAN SYLLABICS Y-CREE W -141E ; [.3416.0020.0002] # CANADIAN SYLLABICS GLOTTAL STOP -141F ; [.3417.0020.0002] # CANADIAN SYLLABICS FINAL ACUTE -1420 ; [.3418.0020.0002] # CANADIAN SYLLABICS FINAL GRAVE -1421 ; [.3419.0020.0002] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING -1422 ; [.341A.0020.0002] # CANADIAN SYLLABICS FINAL TOP HALF RING -1423 ; [.341B.0020.0002] # CANADIAN SYLLABICS FINAL RIGHT HALF RING -1424 ; [.341C.0020.0002] # CANADIAN SYLLABICS FINAL RING -1425 ; [.341D.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE -1426 ; [.341E.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES -1427 ; [.341F.0020.0002] # CANADIAN SYLLABICS FINAL MIDDLE DOT -1428 ; [.3420.0020.0002] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE -1429 ; [.3421.0020.0002] # CANADIAN SYLLABICS FINAL PLUS -142A ; [.3422.0020.0002] # CANADIAN SYLLABICS FINAL DOWN TACK -142B ; [.3423.0020.0002] # CANADIAN SYLLABICS EN -142C ; [.3424.0020.0002] # CANADIAN SYLLABICS IN -142D ; [.3425.0020.0002] # CANADIAN SYLLABICS ON -142E ; [.3426.0020.0002] # CANADIAN SYLLABICS AN -142F ; [.3427.0020.0002] # CANADIAN SYLLABICS PE -1430 ; [.3428.0020.0002] # CANADIAN SYLLABICS PAAI -1431 ; [.3429.0020.0002] # CANADIAN SYLLABICS PI -1432 ; [.342A.0020.0002] # CANADIAN SYLLABICS PII -1433 ; [.342B.0020.0002] # CANADIAN SYLLABICS PO -1434 ; [.342C.0020.0002] # CANADIAN SYLLABICS POO -1435 ; [.342D.0020.0002] # CANADIAN SYLLABICS Y-CREE POO -1436 ; [.342E.0020.0002] # CANADIAN SYLLABICS CARRIER HEE -1437 ; [.342F.0020.0002] # CANADIAN SYLLABICS CARRIER HI -1438 ; [.3430.0020.0002] # CANADIAN SYLLABICS PA -1439 ; [.3431.0020.0002] # CANADIAN SYLLABICS PAA -143A ; [.3432.0020.0002] # CANADIAN SYLLABICS PWE -143B ; [.3433.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWE -143C ; [.3434.0020.0002] # CANADIAN SYLLABICS PWI -143D ; [.3435.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWI -143E ; [.3436.0020.0002] # CANADIAN SYLLABICS PWII -143F ; [.3437.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWII -1440 ; [.3438.0020.0002] # CANADIAN SYLLABICS PWO -1441 ; [.3439.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWO -1442 ; [.343A.0020.0002] # CANADIAN SYLLABICS PWOO -1443 ; [.343B.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWOO -1444 ; [.343C.0020.0002] # CANADIAN SYLLABICS PWA -1445 ; [.343D.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWA -1446 ; [.343E.0020.0002] # CANADIAN SYLLABICS PWAA -1447 ; [.343F.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWAA -1448 ; [.3440.0020.0002] # CANADIAN SYLLABICS Y-CREE PWAA -1449 ; [.3441.0020.0002] # CANADIAN SYLLABICS P -144A ; [.3442.0020.0002] # CANADIAN SYLLABICS WEST-CREE P -144B ; [.3443.0020.0002] # CANADIAN SYLLABICS CARRIER H -144C ; [.3444.0020.0002] # CANADIAN SYLLABICS TE -144D ; [.3445.0020.0002] # CANADIAN SYLLABICS TAAI -144E ; [.3446.0020.0002] # CANADIAN SYLLABICS TI -144F ; [.3447.0020.0002] # CANADIAN SYLLABICS TII -1450 ; [.3448.0020.0002] # CANADIAN SYLLABICS TO -1451 ; [.3449.0020.0002] # CANADIAN SYLLABICS TOO -1452 ; [.344A.0020.0002] # CANADIAN SYLLABICS Y-CREE TOO -1453 ; [.344B.0020.0002] # CANADIAN SYLLABICS CARRIER DEE -1454 ; [.344C.0020.0002] # CANADIAN SYLLABICS CARRIER DI -1455 ; [.344D.0020.0002] # CANADIAN SYLLABICS TA -1456 ; [.344E.0020.0002] # CANADIAN SYLLABICS TAA -1457 ; [.344F.0020.0002] # CANADIAN SYLLABICS TWE -1458 ; [.3450.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWE -1459 ; [.3451.0020.0002] # CANADIAN SYLLABICS TWI -145A ; [.3452.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWI -145B ; [.3453.0020.0002] # CANADIAN SYLLABICS TWII -145C ; [.3454.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWII -145D ; [.3455.0020.0002] # CANADIAN SYLLABICS TWO -145E ; [.3456.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWO -145F ; [.3457.0020.0002] # CANADIAN SYLLABICS TWOO -1460 ; [.3458.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWOO -1461 ; [.3459.0020.0002] # CANADIAN SYLLABICS TWA -1462 ; [.345A.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWA -1463 ; [.345B.0020.0002] # CANADIAN SYLLABICS TWAA -1464 ; [.345C.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWAA -1465 ; [.345D.0020.0002] # CANADIAN SYLLABICS NASKAPI TWAA -1466 ; [.345E.0020.0002] # CANADIAN SYLLABICS T -1467 ; [.345F.0020.0002] # CANADIAN SYLLABICS TTE -1468 ; [.3460.0020.0002] # CANADIAN SYLLABICS TTI -1469 ; [.3461.0020.0002] # CANADIAN SYLLABICS TTO -146A ; [.3462.0020.0002] # CANADIAN SYLLABICS TTA -146B ; [.3463.0020.0002] # CANADIAN SYLLABICS KE -146C ; [.3464.0020.0002] # CANADIAN SYLLABICS KAAI -146D ; [.3465.0020.0002] # CANADIAN SYLLABICS KI -146E ; [.3466.0020.0002] # CANADIAN SYLLABICS KII -146F ; [.3467.0020.0002] # CANADIAN SYLLABICS KO -1470 ; [.3468.0020.0002] # CANADIAN SYLLABICS KOO -1471 ; [.3469.0020.0002] # CANADIAN SYLLABICS Y-CREE KOO -1472 ; [.346A.0020.0002] # CANADIAN SYLLABICS KA -1473 ; [.346B.0020.0002] # CANADIAN SYLLABICS KAA -1474 ; [.346C.0020.0002] # CANADIAN SYLLABICS KWE -1475 ; [.346D.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWE -1476 ; [.346E.0020.0002] # CANADIAN SYLLABICS KWI -1477 ; [.346F.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWI -1478 ; [.3470.0020.0002] # CANADIAN SYLLABICS KWII -1479 ; [.3471.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWII -147A ; [.3472.0020.0002] # CANADIAN SYLLABICS KWO -147B ; [.3473.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWO -147C ; [.3474.0020.0002] # CANADIAN SYLLABICS KWOO -147D ; [.3475.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWOO -147E ; [.3476.0020.0002] # CANADIAN SYLLABICS KWA -147F ; [.3477.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWA -1480 ; [.3478.0020.0002] # CANADIAN SYLLABICS KWAA -1481 ; [.3479.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWAA -1482 ; [.347A.0020.0002] # CANADIAN SYLLABICS NASKAPI KWAA -1483 ; [.347B.0020.0002] # CANADIAN SYLLABICS K -1484 ; [.347C.0020.0002] # CANADIAN SYLLABICS KW -1485 ; [.347D.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH -1486 ; [.347E.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH -1487 ; [.347F.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH -1488 ; [.3480.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH -1489 ; [.3481.0020.0002] # CANADIAN SYLLABICS CE -148A ; [.3482.0020.0002] # CANADIAN SYLLABICS CAAI -148B ; [.3483.0020.0002] # CANADIAN SYLLABICS CI -148C ; [.3484.0020.0002] # CANADIAN SYLLABICS CII -148D ; [.3485.0020.0002] # CANADIAN SYLLABICS CO -148E ; [.3486.0020.0002] # CANADIAN SYLLABICS COO -148F ; [.3487.0020.0002] # CANADIAN SYLLABICS Y-CREE COO -1490 ; [.3488.0020.0002] # CANADIAN SYLLABICS CA -1491 ; [.3489.0020.0002] # CANADIAN SYLLABICS CAA -1492 ; [.348A.0020.0002] # CANADIAN SYLLABICS CWE -1493 ; [.348B.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWE -1494 ; [.348C.0020.0002] # CANADIAN SYLLABICS CWI -1495 ; [.348D.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWI -1496 ; [.348E.0020.0002] # CANADIAN SYLLABICS CWII -1497 ; [.348F.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWII -1498 ; [.3490.0020.0002] # CANADIAN SYLLABICS CWO -1499 ; [.3491.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWO -149A ; [.3492.0020.0002] # CANADIAN SYLLABICS CWOO -149B ; [.3493.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWOO -149C ; [.3494.0020.0002] # CANADIAN SYLLABICS CWA -149D ; [.3495.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWA -149E ; [.3496.0020.0002] # CANADIAN SYLLABICS CWAA -149F ; [.3497.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWAA -14A0 ; [.3498.0020.0002] # CANADIAN SYLLABICS NASKAPI CWAA -14A1 ; [.3499.0020.0002] # CANADIAN SYLLABICS C -14A2 ; [.349A.0020.0002] # CANADIAN SYLLABICS SAYISI TH -14A3 ; [.349B.0020.0002] # CANADIAN SYLLABICS ME -14A4 ; [.349C.0020.0002] # CANADIAN SYLLABICS MAAI -14A5 ; [.349D.0020.0002] # CANADIAN SYLLABICS MI -14A6 ; [.349E.0020.0002] # CANADIAN SYLLABICS MII -14A7 ; [.349F.0020.0002] # CANADIAN SYLLABICS MO -14A8 ; [.34A0.0020.0002] # CANADIAN SYLLABICS MOO -14A9 ; [.34A1.0020.0002] # CANADIAN SYLLABICS Y-CREE MOO -14AA ; [.34A2.0020.0002] # CANADIAN SYLLABICS MA -14AB ; [.34A3.0020.0002] # CANADIAN SYLLABICS MAA -14AC ; [.34A4.0020.0002] # CANADIAN SYLLABICS MWE -14AD ; [.34A5.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWE -14AE ; [.34A6.0020.0002] # CANADIAN SYLLABICS MWI -14AF ; [.34A7.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWI -14B0 ; [.34A8.0020.0002] # CANADIAN SYLLABICS MWII -14B1 ; [.34A9.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWII -14B2 ; [.34AA.0020.0002] # CANADIAN SYLLABICS MWO -14B3 ; [.34AB.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWO -14B4 ; [.34AC.0020.0002] # CANADIAN SYLLABICS MWOO -14B5 ; [.34AD.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWOO -14B6 ; [.34AE.0020.0002] # CANADIAN SYLLABICS MWA -14B7 ; [.34AF.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWA -14B8 ; [.34B0.0020.0002] # CANADIAN SYLLABICS MWAA -14B9 ; [.34B1.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWAA -14BA ; [.34B2.0020.0002] # CANADIAN SYLLABICS NASKAPI MWAA -14BB ; [.34B3.0020.0002] # CANADIAN SYLLABICS M -14BC ; [.34B4.0020.0002] # CANADIAN SYLLABICS WEST-CREE M -14BD ; [.34B5.0020.0002] # CANADIAN SYLLABICS MH -14BE ; [.34B6.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN M -14BF ; [.34B7.0020.0002] # CANADIAN SYLLABICS SAYISI M -14C0 ; [.34B8.0020.0002] # CANADIAN SYLLABICS NE -14C1 ; [.34B9.0020.0002] # CANADIAN SYLLABICS NAAI -14C2 ; [.34BA.0020.0002] # CANADIAN SYLLABICS NI -14C3 ; [.34BB.0020.0002] # CANADIAN SYLLABICS NII -14C4 ; [.34BC.0020.0002] # CANADIAN SYLLABICS NO -14C5 ; [.34BD.0020.0002] # CANADIAN SYLLABICS NOO -14C6 ; [.34BE.0020.0002] # CANADIAN SYLLABICS Y-CREE NOO -14C7 ; [.34BF.0020.0002] # CANADIAN SYLLABICS NA -14C8 ; [.34C0.0020.0002] # CANADIAN SYLLABICS NAA -14C9 ; [.34C1.0020.0002] # CANADIAN SYLLABICS NWE -14CA ; [.34C2.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWE -14CB ; [.34C3.0020.0002] # CANADIAN SYLLABICS NWA -14CC ; [.34C4.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWA -14CD ; [.34C5.0020.0002] # CANADIAN SYLLABICS NWAA -14CE ; [.34C6.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWAA -14CF ; [.34C7.0020.0002] # CANADIAN SYLLABICS NASKAPI NWAA -14D0 ; [.34C8.0020.0002] # CANADIAN SYLLABICS N -14D1 ; [.34C9.0020.0002] # CANADIAN SYLLABICS CARRIER NG -14D2 ; [.34CA.0020.0002] # CANADIAN SYLLABICS NH -14D3 ; [.34CB.0020.0002] # CANADIAN SYLLABICS LE -14D4 ; [.34CC.0020.0002] # CANADIAN SYLLABICS LAAI -14D5 ; [.34CD.0020.0002] # CANADIAN SYLLABICS LI -14D6 ; [.34CE.0020.0002] # CANADIAN SYLLABICS LII -14D7 ; [.34CF.0020.0002] # CANADIAN SYLLABICS LO -14D8 ; [.34D0.0020.0002] # CANADIAN SYLLABICS LOO -14D9 ; [.34D1.0020.0002] # CANADIAN SYLLABICS Y-CREE LOO -14DA ; [.34D2.0020.0002] # CANADIAN SYLLABICS LA -14DB ; [.34D3.0020.0002] # CANADIAN SYLLABICS LAA -14DC ; [.34D4.0020.0002] # CANADIAN SYLLABICS LWE -14DD ; [.34D5.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWE -14DE ; [.34D6.0020.0002] # CANADIAN SYLLABICS LWI -14DF ; [.34D7.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWI -14E0 ; [.34D8.0020.0002] # CANADIAN SYLLABICS LWII -14E1 ; [.34D9.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWII -14E2 ; [.34DA.0020.0002] # CANADIAN SYLLABICS LWO -14E3 ; [.34DB.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWO -14E4 ; [.34DC.0020.0002] # CANADIAN SYLLABICS LWOO -14E5 ; [.34DD.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWOO -14E6 ; [.34DE.0020.0002] # CANADIAN SYLLABICS LWA -14E7 ; [.34DF.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWA -14E8 ; [.34E0.0020.0002] # CANADIAN SYLLABICS LWAA -14E9 ; [.34E1.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWAA -14EA ; [.34E2.0020.0002] # CANADIAN SYLLABICS L -14EB ; [.34E3.0020.0002] # CANADIAN SYLLABICS WEST-CREE L -14EC ; [.34E4.0020.0002] # CANADIAN SYLLABICS MEDIAL L -14ED ; [.34E5.0020.0002] # CANADIAN SYLLABICS SE -14EE ; [.34E6.0020.0002] # CANADIAN SYLLABICS SAAI -14EF ; [.34E7.0020.0002] # CANADIAN SYLLABICS SI -14F0 ; [.34E8.0020.0002] # CANADIAN SYLLABICS SII -14F1 ; [.34E9.0020.0002] # CANADIAN SYLLABICS SO -14F2 ; [.34EA.0020.0002] # CANADIAN SYLLABICS SOO -14F3 ; [.34EB.0020.0002] # CANADIAN SYLLABICS Y-CREE SOO -14F4 ; [.34EC.0020.0002] # CANADIAN SYLLABICS SA -14F5 ; [.34ED.0020.0002] # CANADIAN SYLLABICS SAA -14F6 ; [.34EE.0020.0002] # CANADIAN SYLLABICS SWE -14F7 ; [.34EF.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWE -14F8 ; [.34F0.0020.0002] # CANADIAN SYLLABICS SWI -14F9 ; [.34F1.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWI -14FA ; [.34F2.0020.0002] # CANADIAN SYLLABICS SWII -14FB ; [.34F3.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWII -14FC ; [.34F4.0020.0002] # CANADIAN SYLLABICS SWO -14FD ; [.34F5.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWO -14FE ; [.34F6.0020.0002] # CANADIAN SYLLABICS SWOO -14FF ; [.34F7.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWOO -1500 ; [.34F8.0020.0002] # CANADIAN SYLLABICS SWA -1501 ; [.34F9.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWA -1502 ; [.34FA.0020.0002] # CANADIAN SYLLABICS SWAA -1503 ; [.34FB.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWAA -1504 ; [.34FC.0020.0002] # CANADIAN SYLLABICS NASKAPI SWAA -1505 ; [.34FD.0020.0002] # CANADIAN SYLLABICS S -1506 ; [.34FE.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN S -1507 ; [.34FF.0020.0002] # CANADIAN SYLLABICS SW -1508 ; [.3500.0020.0002] # CANADIAN SYLLABICS BLACKFOOT S -1509 ; [.3501.0020.0002] # CANADIAN SYLLABICS MOOSE-CREE SK -150A ; [.3502.0020.0002] # CANADIAN SYLLABICS NASKAPI SKW -150B ; [.3503.0020.0002] # CANADIAN SYLLABICS NASKAPI S-W -150C ; [.3504.0020.0002] # CANADIAN SYLLABICS NASKAPI SPWA -150D ; [.3505.0020.0002] # CANADIAN SYLLABICS NASKAPI STWA -150E ; [.3506.0020.0002] # CANADIAN SYLLABICS NASKAPI SKWA -150F ; [.3507.0020.0002] # CANADIAN SYLLABICS NASKAPI SCWA -1510 ; [.3508.0020.0002] # CANADIAN SYLLABICS SHE -1511 ; [.3509.0020.0002] # CANADIAN SYLLABICS SHI -1512 ; [.350A.0020.0002] # CANADIAN SYLLABICS SHII -1513 ; [.350B.0020.0002] # CANADIAN SYLLABICS SHO -1514 ; [.350C.0020.0002] # CANADIAN SYLLABICS SHOO -1515 ; [.350D.0020.0002] # CANADIAN SYLLABICS SHA -1516 ; [.350E.0020.0002] # CANADIAN SYLLABICS SHAA -1517 ; [.350F.0020.0002] # CANADIAN SYLLABICS SHWE -1518 ; [.3510.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWE -1519 ; [.3511.0020.0002] # CANADIAN SYLLABICS SHWI -151A ; [.3512.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWI -151B ; [.3513.0020.0002] # CANADIAN SYLLABICS SHWII -151C ; [.3514.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWII -151D ; [.3515.0020.0002] # CANADIAN SYLLABICS SHWO -151E ; [.3516.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWO -151F ; [.3517.0020.0002] # CANADIAN SYLLABICS SHWOO -1520 ; [.3518.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWOO -1521 ; [.3519.0020.0002] # CANADIAN SYLLABICS SHWA -1522 ; [.351A.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWA -1523 ; [.351B.0020.0002] # CANADIAN SYLLABICS SHWAA -1524 ; [.351C.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWAA -1525 ; [.351D.0020.0002] # CANADIAN SYLLABICS SH -1526 ; [.351E.0020.0002] # CANADIAN SYLLABICS YE -1527 ; [.351F.0020.0002] # CANADIAN SYLLABICS YAAI -1528 ; [.3520.0020.0002] # CANADIAN SYLLABICS YI -1529 ; [.3521.0020.0002] # CANADIAN SYLLABICS YII -152A ; [.3522.0020.0002] # CANADIAN SYLLABICS YO -152B ; [.3523.0020.0002] # CANADIAN SYLLABICS YOO -152C ; [.3524.0020.0002] # CANADIAN SYLLABICS Y-CREE YOO -152D ; [.3525.0020.0002] # CANADIAN SYLLABICS YA -152E ; [.3526.0020.0002] # CANADIAN SYLLABICS YAA -152F ; [.3527.0020.0002] # CANADIAN SYLLABICS YWE -1530 ; [.3528.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWE -1531 ; [.3529.0020.0002] # CANADIAN SYLLABICS YWI -1532 ; [.352A.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWI -1533 ; [.352B.0020.0002] # CANADIAN SYLLABICS YWII -1534 ; [.352C.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWII -1535 ; [.352D.0020.0002] # CANADIAN SYLLABICS YWO -1536 ; [.352E.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWO -1537 ; [.352F.0020.0002] # CANADIAN SYLLABICS YWOO -1538 ; [.3530.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWOO -1539 ; [.3531.0020.0002] # CANADIAN SYLLABICS YWA -153A ; [.3532.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWA -153B ; [.3533.0020.0002] # CANADIAN SYLLABICS YWAA -153C ; [.3534.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWAA -153D ; [.3535.0020.0002] # CANADIAN SYLLABICS NASKAPI YWAA -153E ; [.3536.0020.0002] # CANADIAN SYLLABICS Y -153F ; [.3537.0020.0002] # CANADIAN SYLLABICS BIBLE-CREE Y -1540 ; [.3538.0020.0002] # CANADIAN SYLLABICS WEST-CREE Y -1541 ; [.3539.0020.0002] # CANADIAN SYLLABICS SAYISI YI -1542 ; [.353A.0020.0002] # CANADIAN SYLLABICS RE -1543 ; [.353B.0020.0002] # CANADIAN SYLLABICS R-CREE RE -1544 ; [.353C.0020.0002] # CANADIAN SYLLABICS WEST-CREE LE -1545 ; [.353D.0020.0002] # CANADIAN SYLLABICS RAAI -1546 ; [.353E.0020.0002] # CANADIAN SYLLABICS RI -1547 ; [.353F.0020.0002] # CANADIAN SYLLABICS RII -1548 ; [.3540.0020.0002] # CANADIAN SYLLABICS RO -1549 ; [.3541.0020.0002] # CANADIAN SYLLABICS ROO -154A ; [.3542.0020.0002] # CANADIAN SYLLABICS WEST-CREE LO -154B ; [.3543.0020.0002] # CANADIAN SYLLABICS RA -154C ; [.3544.0020.0002] # CANADIAN SYLLABICS RAA -154D ; [.3545.0020.0002] # CANADIAN SYLLABICS WEST-CREE LA -154E ; [.3546.0020.0002] # CANADIAN SYLLABICS RWAA -154F ; [.3547.0020.0002] # CANADIAN SYLLABICS WEST-CREE RWAA -1550 ; [.3548.0020.0002] # CANADIAN SYLLABICS R -1551 ; [.3549.0020.0002] # CANADIAN SYLLABICS WEST-CREE R -1552 ; [.354A.0020.0002] # CANADIAN SYLLABICS MEDIAL R -1553 ; [.354B.0020.0002] # CANADIAN SYLLABICS FE -1554 ; [.354C.0020.0002] # CANADIAN SYLLABICS FAAI -1555 ; [.354D.0020.0002] # CANADIAN SYLLABICS FI -1556 ; [.354E.0020.0002] # CANADIAN SYLLABICS FII -1557 ; [.354F.0020.0002] # CANADIAN SYLLABICS FO -1558 ; [.3550.0020.0002] # CANADIAN SYLLABICS FOO -1559 ; [.3551.0020.0002] # CANADIAN SYLLABICS FA -155A ; [.3552.0020.0002] # CANADIAN SYLLABICS FAA -155B ; [.3553.0020.0002] # CANADIAN SYLLABICS FWAA -155C ; [.3554.0020.0002] # CANADIAN SYLLABICS WEST-CREE FWAA -155D ; [.3555.0020.0002] # CANADIAN SYLLABICS F -155E ; [.3556.0020.0002] # CANADIAN SYLLABICS THE -155F ; [.3557.0020.0002] # CANADIAN SYLLABICS N-CREE THE -1560 ; [.3558.0020.0002] # CANADIAN SYLLABICS THI -1561 ; [.3559.0020.0002] # CANADIAN SYLLABICS N-CREE THI -1562 ; [.355A.0020.0002] # CANADIAN SYLLABICS THII -1563 ; [.355B.0020.0002] # CANADIAN SYLLABICS N-CREE THII -1564 ; [.355C.0020.0002] # CANADIAN SYLLABICS THO -1565 ; [.355D.0020.0002] # CANADIAN SYLLABICS THOO -1566 ; [.355E.0020.0002] # CANADIAN SYLLABICS THA -1567 ; [.355F.0020.0002] # CANADIAN SYLLABICS THAA -1568 ; [.3560.0020.0002] # CANADIAN SYLLABICS THWAA -1569 ; [.3561.0020.0002] # CANADIAN SYLLABICS WEST-CREE THWAA -156A ; [.3562.0020.0002] # CANADIAN SYLLABICS TH -156B ; [.3563.0020.0002] # CANADIAN SYLLABICS TTHE -156C ; [.3564.0020.0002] # CANADIAN SYLLABICS TTHI -156D ; [.3565.0020.0002] # CANADIAN SYLLABICS TTHO -156E ; [.3566.0020.0002] # CANADIAN SYLLABICS TTHA -156F ; [.3567.0020.0002] # CANADIAN SYLLABICS TTH -1570 ; [.3568.0020.0002] # CANADIAN SYLLABICS TYE -1571 ; [.3569.0020.0002] # CANADIAN SYLLABICS TYI -1572 ; [.356A.0020.0002] # CANADIAN SYLLABICS TYO -1573 ; [.356B.0020.0002] # CANADIAN SYLLABICS TYA -1574 ; [.356C.0020.0002] # CANADIAN SYLLABICS NUNAVIK HE -1575 ; [.356D.0020.0002] # CANADIAN SYLLABICS NUNAVIK HI -1576 ; [.356E.0020.0002] # CANADIAN SYLLABICS NUNAVIK HII -1577 ; [.356F.0020.0002] # CANADIAN SYLLABICS NUNAVIK HO -1578 ; [.3570.0020.0002] # CANADIAN SYLLABICS NUNAVIK HOO -1579 ; [.3571.0020.0002] # CANADIAN SYLLABICS NUNAVIK HA -157A ; [.3572.0020.0002] # CANADIAN SYLLABICS NUNAVIK HAA -157B ; [.3573.0020.0002] # CANADIAN SYLLABICS NUNAVIK H -157D ; [.3574.0020.0002] # CANADIAN SYLLABICS HK -166F ; [.3575.0020.0002] # CANADIAN SYLLABICS QAI -157E ; [.3576.0020.0002] # CANADIAN SYLLABICS QAAI -157F ; [.3577.0020.0002] # CANADIAN SYLLABICS QI -1580 ; [.3578.0020.0002] # CANADIAN SYLLABICS QII -1581 ; [.3579.0020.0002] # CANADIAN SYLLABICS QO -1582 ; [.357A.0020.0002] # CANADIAN SYLLABICS QOO -1583 ; [.357B.0020.0002] # CANADIAN SYLLABICS QA -1584 ; [.357C.0020.0002] # CANADIAN SYLLABICS QAA -1585 ; [.357D.0020.0002] # CANADIAN SYLLABICS Q -1586 ; [.357E.0020.0002] # CANADIAN SYLLABICS TLHE -1587 ; [.357F.0020.0002] # CANADIAN SYLLABICS TLHI -1588 ; [.3580.0020.0002] # CANADIAN SYLLABICS TLHO -1589 ; [.3581.0020.0002] # CANADIAN SYLLABICS TLHA -158A ; [.3582.0020.0002] # CANADIAN SYLLABICS WEST-CREE RE -158B ; [.3583.0020.0002] # CANADIAN SYLLABICS WEST-CREE RI -158C ; [.3584.0020.0002] # CANADIAN SYLLABICS WEST-CREE RO -158D ; [.3585.0020.0002] # CANADIAN SYLLABICS WEST-CREE RA -1670 ; [.3586.0020.0002] # CANADIAN SYLLABICS NGAI -158E ; [.3587.0020.0002] # CANADIAN SYLLABICS NGAAI -158F ; [.3588.0020.0002] # CANADIAN SYLLABICS NGI -1590 ; [.3589.0020.0002] # CANADIAN SYLLABICS NGII -1591 ; [.358A.0020.0002] # CANADIAN SYLLABICS NGO -1592 ; [.358B.0020.0002] # CANADIAN SYLLABICS NGOO -1593 ; [.358C.0020.0002] # CANADIAN SYLLABICS NGA -1594 ; [.358D.0020.0002] # CANADIAN SYLLABICS NGAA -1595 ; [.358E.0020.0002] # CANADIAN SYLLABICS NG -1671 ; [.358F.0020.0002] # CANADIAN SYLLABICS NNGI -1672 ; [.3590.0020.0002] # CANADIAN SYLLABICS NNGII -1673 ; [.3591.0020.0002] # CANADIAN SYLLABICS NNGO -1674 ; [.3592.0020.0002] # CANADIAN SYLLABICS NNGOO -1675 ; [.3593.0020.0002] # CANADIAN SYLLABICS NNGA -1676 ; [.3594.0020.0002] # CANADIAN SYLLABICS NNGAA -1596 ; [.3595.0020.0002] # CANADIAN SYLLABICS NNG -1597 ; [.3596.0020.0002] # CANADIAN SYLLABICS SAYISI SHE -1598 ; [.3597.0020.0002] # CANADIAN SYLLABICS SAYISI SHI -1599 ; [.3598.0020.0002] # CANADIAN SYLLABICS SAYISI SHO -159A ; [.3599.0020.0002] # CANADIAN SYLLABICS SAYISI SHA -159B ; [.359A.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THE -159C ; [.359B.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THI -159D ; [.359C.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THO -159E ; [.359D.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THA -159F ; [.359E.0020.0002] # CANADIAN SYLLABICS WOODS-CREE TH -15A0 ; [.359F.0020.0002] # CANADIAN SYLLABICS LHI -15A1 ; [.35A0.0020.0002] # CANADIAN SYLLABICS LHII -15A2 ; [.35A1.0020.0002] # CANADIAN SYLLABICS LHO -15A3 ; [.35A2.0020.0002] # CANADIAN SYLLABICS LHOO -15A4 ; [.35A3.0020.0002] # CANADIAN SYLLABICS LHA -15A5 ; [.35A4.0020.0002] # CANADIAN SYLLABICS LHAA -15A6 ; [.35A5.0020.0002] # CANADIAN SYLLABICS LH -157C ; [.35A6.0020.0002] # CANADIAN SYLLABICS NUNAVUT H -15A7 ; [.35A7.0020.0002] # CANADIAN SYLLABICS TH-CREE THE -15A8 ; [.35A8.0020.0002] # CANADIAN SYLLABICS TH-CREE THI -15A9 ; [.35A9.0020.0002] # CANADIAN SYLLABICS TH-CREE THII -15AA ; [.35AA.0020.0002] # CANADIAN SYLLABICS TH-CREE THO -15AB ; [.35AB.0020.0002] # CANADIAN SYLLABICS TH-CREE THOO -15AC ; [.35AC.0020.0002] # CANADIAN SYLLABICS TH-CREE THA -15AD ; [.35AD.0020.0002] # CANADIAN SYLLABICS TH-CREE THAA -15AE ; [.35AE.0020.0002] # CANADIAN SYLLABICS TH-CREE TH -15AF ; [.35AF.0020.0002] # CANADIAN SYLLABICS AIVILIK B -15B0 ; [.35B0.0020.0002] # CANADIAN SYLLABICS BLACKFOOT E -15B1 ; [.35B1.0020.0002] # CANADIAN SYLLABICS BLACKFOOT I -15B2 ; [.35B2.0020.0002] # CANADIAN SYLLABICS BLACKFOOT O -15B3 ; [.35B3.0020.0002] # CANADIAN SYLLABICS BLACKFOOT A -15B4 ; [.35B4.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WE -15B5 ; [.35B5.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WI -15B6 ; [.35B6.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WO -15B7 ; [.35B7.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WA -15B8 ; [.35B8.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NE -15B9 ; [.35B9.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NI -15BA ; [.35BA.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NO -15BB ; [.35BB.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NA -15BC ; [.35BC.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KE -15BD ; [.35BD.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KI -15BE ; [.35BE.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KO -15BF ; [.35BF.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KA -15C0 ; [.35C0.0020.0002] # CANADIAN SYLLABICS SAYISI HE -15C1 ; [.35C1.0020.0002] # CANADIAN SYLLABICS SAYISI HI -15C2 ; [.35C2.0020.0002] # CANADIAN SYLLABICS SAYISI HO -15C3 ; [.35C3.0020.0002] # CANADIAN SYLLABICS SAYISI HA -15C4 ; [.35C4.0020.0002] # CANADIAN SYLLABICS CARRIER GHU -15C5 ; [.35C5.0020.0002] # CANADIAN SYLLABICS CARRIER GHO -15C6 ; [.35C6.0020.0002] # CANADIAN SYLLABICS CARRIER GHE -15C7 ; [.35C7.0020.0002] # CANADIAN SYLLABICS CARRIER GHEE -15C8 ; [.35C8.0020.0002] # CANADIAN SYLLABICS CARRIER GHI -15C9 ; [.35C9.0020.0002] # CANADIAN SYLLABICS CARRIER GHA -15CA ; [.35CA.0020.0002] # CANADIAN SYLLABICS CARRIER RU -15CB ; [.35CB.0020.0002] # CANADIAN SYLLABICS CARRIER RO -15CC ; [.35CC.0020.0002] # CANADIAN SYLLABICS CARRIER RE -15CD ; [.35CD.0020.0002] # CANADIAN SYLLABICS CARRIER REE -15CE ; [.35CE.0020.0002] # CANADIAN SYLLABICS CARRIER RI -15CF ; [.35CF.0020.0002] # CANADIAN SYLLABICS CARRIER RA -15D0 ; [.35D0.0020.0002] # CANADIAN SYLLABICS CARRIER WU -15D1 ; [.35D1.0020.0002] # CANADIAN SYLLABICS CARRIER WO -15D2 ; [.35D2.0020.0002] # CANADIAN SYLLABICS CARRIER WE -15D3 ; [.35D3.0020.0002] # CANADIAN SYLLABICS CARRIER WEE -15D4 ; [.35D4.0020.0002] # CANADIAN SYLLABICS CARRIER WI -15D5 ; [.35D5.0020.0002] # CANADIAN SYLLABICS CARRIER WA -15D6 ; [.35D6.0020.0002] # CANADIAN SYLLABICS CARRIER HWU -15D7 ; [.35D7.0020.0002] # CANADIAN SYLLABICS CARRIER HWO -15D8 ; [.35D8.0020.0002] # CANADIAN SYLLABICS CARRIER HWE -15D9 ; [.35D9.0020.0002] # CANADIAN SYLLABICS CARRIER HWEE -15DA ; [.35DA.0020.0002] # CANADIAN SYLLABICS CARRIER HWI -15DB ; [.35DB.0020.0002] # CANADIAN SYLLABICS CARRIER HWA -15DC ; [.35DC.0020.0002] # CANADIAN SYLLABICS CARRIER THU -15DD ; [.35DD.0020.0002] # CANADIAN SYLLABICS CARRIER THO -15DE ; [.35DE.0020.0002] # CANADIAN SYLLABICS CARRIER THE -15DF ; [.35DF.0020.0002] # CANADIAN SYLLABICS CARRIER THEE -15E0 ; [.35E0.0020.0002] # CANADIAN SYLLABICS CARRIER THI -15E1 ; [.35E1.0020.0002] # CANADIAN SYLLABICS CARRIER THA -15E2 ; [.35E2.0020.0002] # CANADIAN SYLLABICS CARRIER TTU -15E3 ; [.35E3.0020.0002] # CANADIAN SYLLABICS CARRIER TTO -15E4 ; [.35E4.0020.0002] # CANADIAN SYLLABICS CARRIER TTE -15E5 ; [.35E5.0020.0002] # CANADIAN SYLLABICS CARRIER TTEE -15E6 ; [.35E6.0020.0002] # CANADIAN SYLLABICS CARRIER TTI -15E7 ; [.35E7.0020.0002] # CANADIAN SYLLABICS CARRIER TTA -15E8 ; [.35E8.0020.0002] # CANADIAN SYLLABICS CARRIER PU -15E9 ; [.35E9.0020.0002] # CANADIAN SYLLABICS CARRIER PO -15EA ; [.35EA.0020.0002] # CANADIAN SYLLABICS CARRIER PE -15EB ; [.35EB.0020.0002] # CANADIAN SYLLABICS CARRIER PEE -15EC ; [.35EC.0020.0002] # CANADIAN SYLLABICS CARRIER PI -15ED ; [.35ED.0020.0002] # CANADIAN SYLLABICS CARRIER PA -15EE ; [.35EE.0020.0002] # CANADIAN SYLLABICS CARRIER P -15EF ; [.35EF.0020.0002] # CANADIAN SYLLABICS CARRIER GU -15F0 ; [.35F0.0020.0002] # CANADIAN SYLLABICS CARRIER GO -15F1 ; [.35F1.0020.0002] # CANADIAN SYLLABICS CARRIER GE -15F2 ; [.35F2.0020.0002] # CANADIAN SYLLABICS CARRIER GEE -15F3 ; [.35F3.0020.0002] # CANADIAN SYLLABICS CARRIER GI -15F4 ; [.35F4.0020.0002] # CANADIAN SYLLABICS CARRIER GA -15F5 ; [.35F5.0020.0002] # CANADIAN SYLLABICS CARRIER KHU -15F6 ; [.35F6.0020.0002] # CANADIAN SYLLABICS CARRIER KHO -15F7 ; [.35F7.0020.0002] # CANADIAN SYLLABICS CARRIER KHE -15F8 ; [.35F8.0020.0002] # CANADIAN SYLLABICS CARRIER KHEE -15F9 ; [.35F9.0020.0002] # CANADIAN SYLLABICS CARRIER KHI -15FA ; [.35FA.0020.0002] # CANADIAN SYLLABICS CARRIER KHA -15FB ; [.35FB.0020.0002] # CANADIAN SYLLABICS CARRIER KKU -15FC ; [.35FC.0020.0002] # CANADIAN SYLLABICS CARRIER KKO -15FD ; [.35FD.0020.0002] # CANADIAN SYLLABICS CARRIER KKE -15FE ; [.35FE.0020.0002] # CANADIAN SYLLABICS CARRIER KKEE -15FF ; [.35FF.0020.0002] # CANADIAN SYLLABICS CARRIER KKI -1600 ; [.3600.0020.0002] # CANADIAN SYLLABICS CARRIER KKA -1601 ; [.3601.0020.0002] # CANADIAN SYLLABICS CARRIER KK -1602 ; [.3602.0020.0002] # CANADIAN SYLLABICS CARRIER NU -1603 ; [.3603.0020.0002] # CANADIAN SYLLABICS CARRIER NO -1604 ; [.3604.0020.0002] # CANADIAN SYLLABICS CARRIER NE -1605 ; [.3605.0020.0002] # CANADIAN SYLLABICS CARRIER NEE -1606 ; [.3606.0020.0002] # CANADIAN SYLLABICS CARRIER NI -1607 ; [.3607.0020.0002] # CANADIAN SYLLABICS CARRIER NA -1608 ; [.3608.0020.0002] # CANADIAN SYLLABICS CARRIER MU -1609 ; [.3609.0020.0002] # CANADIAN SYLLABICS CARRIER MO -160A ; [.360A.0020.0002] # CANADIAN SYLLABICS CARRIER ME -160B ; [.360B.0020.0002] # CANADIAN SYLLABICS CARRIER MEE -160C ; [.360C.0020.0002] # CANADIAN SYLLABICS CARRIER MI -160D ; [.360D.0020.0002] # CANADIAN SYLLABICS CARRIER MA -160E ; [.360E.0020.0002] # CANADIAN SYLLABICS CARRIER YU -160F ; [.360F.0020.0002] # CANADIAN SYLLABICS CARRIER YO -1610 ; [.3610.0020.0002] # CANADIAN SYLLABICS CARRIER YE -1611 ; [.3611.0020.0002] # CANADIAN SYLLABICS CARRIER YEE -1612 ; [.3612.0020.0002] # CANADIAN SYLLABICS CARRIER YI -1613 ; [.3613.0020.0002] # CANADIAN SYLLABICS CARRIER YA -1614 ; [.3614.0020.0002] # CANADIAN SYLLABICS CARRIER JU -1615 ; [.3615.0020.0002] # CANADIAN SYLLABICS SAYISI JU -1616 ; [.3616.0020.0002] # CANADIAN SYLLABICS CARRIER JO -1617 ; [.3617.0020.0002] # CANADIAN SYLLABICS CARRIER JE -1618 ; [.3618.0020.0002] # CANADIAN SYLLABICS CARRIER JEE -1619 ; [.3619.0020.0002] # CANADIAN SYLLABICS CARRIER JI -161A ; [.361A.0020.0002] # CANADIAN SYLLABICS SAYISI JI -161B ; [.361B.0020.0002] # CANADIAN SYLLABICS CARRIER JA -161C ; [.361C.0020.0002] # CANADIAN SYLLABICS CARRIER JJU -161D ; [.361D.0020.0002] # CANADIAN SYLLABICS CARRIER JJO -161E ; [.361E.0020.0002] # CANADIAN SYLLABICS CARRIER JJE -161F ; [.361F.0020.0002] # CANADIAN SYLLABICS CARRIER JJEE -1620 ; [.3620.0020.0002] # CANADIAN SYLLABICS CARRIER JJI -1621 ; [.3621.0020.0002] # CANADIAN SYLLABICS CARRIER JJA -1622 ; [.3622.0020.0002] # CANADIAN SYLLABICS CARRIER LU -1623 ; [.3623.0020.0002] # CANADIAN SYLLABICS CARRIER LO -1624 ; [.3624.0020.0002] # CANADIAN SYLLABICS CARRIER LE -1625 ; [.3625.0020.0002] # CANADIAN SYLLABICS CARRIER LEE -1626 ; [.3626.0020.0002] # CANADIAN SYLLABICS CARRIER LI -1627 ; [.3627.0020.0002] # CANADIAN SYLLABICS CARRIER LA -1628 ; [.3628.0020.0002] # CANADIAN SYLLABICS CARRIER DLU -1629 ; [.3629.0020.0002] # CANADIAN SYLLABICS CARRIER DLO -162A ; [.362A.0020.0002] # CANADIAN SYLLABICS CARRIER DLE -162B ; [.362B.0020.0002] # CANADIAN SYLLABICS CARRIER DLEE -162C ; [.362C.0020.0002] # CANADIAN SYLLABICS CARRIER DLI -162D ; [.362D.0020.0002] # CANADIAN SYLLABICS CARRIER DLA -162E ; [.362E.0020.0002] # CANADIAN SYLLABICS CARRIER LHU -162F ; [.362F.0020.0002] # CANADIAN SYLLABICS CARRIER LHO -1630 ; [.3630.0020.0002] # CANADIAN SYLLABICS CARRIER LHE -1631 ; [.3631.0020.0002] # CANADIAN SYLLABICS CARRIER LHEE -1632 ; [.3632.0020.0002] # CANADIAN SYLLABICS CARRIER LHI -1633 ; [.3633.0020.0002] # CANADIAN SYLLABICS CARRIER LHA -1634 ; [.3634.0020.0002] # CANADIAN SYLLABICS CARRIER TLHU -1635 ; [.3635.0020.0002] # CANADIAN SYLLABICS CARRIER TLHO -1636 ; [.3636.0020.0002] # CANADIAN SYLLABICS CARRIER TLHE -1637 ; [.3637.0020.0002] # CANADIAN SYLLABICS CARRIER TLHEE -1638 ; [.3638.0020.0002] # CANADIAN SYLLABICS CARRIER TLHI -1639 ; [.3639.0020.0002] # CANADIAN SYLLABICS CARRIER TLHA -163A ; [.363A.0020.0002] # CANADIAN SYLLABICS CARRIER TLU -163B ; [.363B.0020.0002] # CANADIAN SYLLABICS CARRIER TLO -163C ; [.363C.0020.0002] # CANADIAN SYLLABICS CARRIER TLE -163D ; [.363D.0020.0002] # CANADIAN SYLLABICS CARRIER TLEE -163E ; [.363E.0020.0002] # CANADIAN SYLLABICS CARRIER TLI -163F ; [.363F.0020.0002] # CANADIAN SYLLABICS CARRIER TLA -1640 ; [.3640.0020.0002] # CANADIAN SYLLABICS CARRIER ZU -1641 ; [.3641.0020.0002] # CANADIAN SYLLABICS CARRIER ZO -1642 ; [.3642.0020.0002] # CANADIAN SYLLABICS CARRIER ZE -1643 ; [.3643.0020.0002] # CANADIAN SYLLABICS CARRIER ZEE -1644 ; [.3644.0020.0002] # CANADIAN SYLLABICS CARRIER ZI -1645 ; [.3645.0020.0002] # CANADIAN SYLLABICS CARRIER ZA -1646 ; [.3646.0020.0002] # CANADIAN SYLLABICS CARRIER Z -1647 ; [.3647.0020.0002] # CANADIAN SYLLABICS CARRIER INITIAL Z -1648 ; [.3648.0020.0002] # CANADIAN SYLLABICS CARRIER DZU -1649 ; [.3649.0020.0002] # CANADIAN SYLLABICS CARRIER DZO -164A ; [.364A.0020.0002] # CANADIAN SYLLABICS CARRIER DZE -164B ; [.364B.0020.0002] # CANADIAN SYLLABICS CARRIER DZEE -164C ; [.364C.0020.0002] # CANADIAN SYLLABICS CARRIER DZI -164D ; [.364D.0020.0002] # CANADIAN SYLLABICS CARRIER DZA -164E ; [.364E.0020.0002] # CANADIAN SYLLABICS CARRIER SU -164F ; [.364F.0020.0002] # CANADIAN SYLLABICS CARRIER SO -1650 ; [.3650.0020.0002] # CANADIAN SYLLABICS CARRIER SE -1651 ; [.3651.0020.0002] # CANADIAN SYLLABICS CARRIER SEE -1652 ; [.3652.0020.0002] # CANADIAN SYLLABICS CARRIER SI -1653 ; [.3653.0020.0002] # CANADIAN SYLLABICS CARRIER SA -1654 ; [.3654.0020.0002] # CANADIAN SYLLABICS CARRIER SHU -1655 ; [.3655.0020.0002] # CANADIAN SYLLABICS CARRIER SHO -1656 ; [.3656.0020.0002] # CANADIAN SYLLABICS CARRIER SHE -1657 ; [.3657.0020.0002] # CANADIAN SYLLABICS CARRIER SHEE -1658 ; [.3658.0020.0002] # CANADIAN SYLLABICS CARRIER SHI -1659 ; [.3659.0020.0002] # CANADIAN SYLLABICS CARRIER SHA -165A ; [.365A.0020.0002] # CANADIAN SYLLABICS CARRIER SH -165B ; [.365B.0020.0002] # CANADIAN SYLLABICS CARRIER TSU -165C ; [.365C.0020.0002] # CANADIAN SYLLABICS CARRIER TSO -165D ; [.365D.0020.0002] # CANADIAN SYLLABICS CARRIER TSE -165E ; [.365E.0020.0002] # CANADIAN SYLLABICS CARRIER TSEE -165F ; [.365F.0020.0002] # CANADIAN SYLLABICS CARRIER TSI -1660 ; [.3660.0020.0002] # CANADIAN SYLLABICS CARRIER TSA -1661 ; [.3661.0020.0002] # CANADIAN SYLLABICS CARRIER CHU -1662 ; [.3662.0020.0002] # CANADIAN SYLLABICS CARRIER CHO -1663 ; [.3663.0020.0002] # CANADIAN SYLLABICS CARRIER CHE -1664 ; [.3664.0020.0002] # CANADIAN SYLLABICS CARRIER CHEE -1665 ; [.3665.0020.0002] # CANADIAN SYLLABICS CARRIER CHI -1666 ; [.3666.0020.0002] # CANADIAN SYLLABICS CARRIER CHA -1667 ; [.3667.0020.0002] # CANADIAN SYLLABICS CARRIER TTSU -1668 ; [.3668.0020.0002] # CANADIAN SYLLABICS CARRIER TTSO -1669 ; [.3669.0020.0002] # CANADIAN SYLLABICS CARRIER TTSE -166A ; [.366A.0020.0002] # CANADIAN SYLLABICS CARRIER TTSEE -166B ; [.366B.0020.0002] # CANADIAN SYLLABICS CARRIER TTSI -166C ; [.366C.0020.0002] # CANADIAN SYLLABICS CARRIER TTSA -1677 ; [.366D.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWEE -1678 ; [.366E.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWI -1679 ; [.366F.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWII -167A ; [.3670.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWO -167B ; [.3671.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWOO -167C ; [.3672.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWA -167D ; [.3673.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWAA -167E ; [.3674.0020.0002] # CANADIAN SYLLABICS WOODS-CREE FINAL TH -167F ; [.3675.0020.0002] # CANADIAN SYLLABICS BLACKFOOT W -18B0 ; [.3676.0020.0002] # CANADIAN SYLLABICS OY -18B1 ; [.3677.0020.0002] # CANADIAN SYLLABICS AY -18B2 ; [.3678.0020.0002] # CANADIAN SYLLABICS AAY -18B3 ; [.3679.0020.0002] # CANADIAN SYLLABICS WAY -18B4 ; [.367A.0020.0002] # CANADIAN SYLLABICS POY -18B5 ; [.367B.0020.0002] # CANADIAN SYLLABICS PAY -18B6 ; [.367C.0020.0002] # CANADIAN SYLLABICS PWOY -18B7 ; [.367D.0020.0002] # CANADIAN SYLLABICS TAY -18B8 ; [.367E.0020.0002] # CANADIAN SYLLABICS KAY -18B9 ; [.367F.0020.0002] # CANADIAN SYLLABICS KWAY -18BA ; [.3680.0020.0002] # CANADIAN SYLLABICS MAY -18BB ; [.3681.0020.0002] # CANADIAN SYLLABICS NOY -18BC ; [.3682.0020.0002] # CANADIAN SYLLABICS NAY -18BD ; [.3683.0020.0002] # CANADIAN SYLLABICS LAY -18BE ; [.3684.0020.0002] # CANADIAN SYLLABICS SOY -18BF ; [.3685.0020.0002] # CANADIAN SYLLABICS SAY -18C0 ; [.3686.0020.0002] # CANADIAN SYLLABICS SHOY -18C1 ; [.3687.0020.0002] # CANADIAN SYLLABICS SHAY -18C2 ; [.3688.0020.0002] # CANADIAN SYLLABICS SHWOY -18C3 ; [.3689.0020.0002] # CANADIAN SYLLABICS YOY -18C4 ; [.368A.0020.0002] # CANADIAN SYLLABICS YAY -18C5 ; [.368B.0020.0002] # CANADIAN SYLLABICS RAY -18C6 ; [.368C.0020.0002] # CANADIAN SYLLABICS NWI -18C7 ; [.368D.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWI -18C8 ; [.368E.0020.0002] # CANADIAN SYLLABICS NWII -18C9 ; [.368F.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWII -18CA ; [.3690.0020.0002] # CANADIAN SYLLABICS NWO -18CB ; [.3691.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWO -18CC ; [.3692.0020.0002] # CANADIAN SYLLABICS NWOO -18CD ; [.3693.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWOO -18CE ; [.3694.0020.0002] # CANADIAN SYLLABICS RWEE -18CF ; [.3695.0020.0002] # CANADIAN SYLLABICS RWI -18D0 ; [.3696.0020.0002] # CANADIAN SYLLABICS RWII -18D1 ; [.3697.0020.0002] # CANADIAN SYLLABICS RWO -18D2 ; [.3698.0020.0002] # CANADIAN SYLLABICS RWOO -18D3 ; [.3699.0020.0002] # CANADIAN SYLLABICS RWA -18D4 ; [.369A.0020.0002] # CANADIAN SYLLABICS OJIBWAY P -18D5 ; [.369B.0020.0002] # CANADIAN SYLLABICS OJIBWAY T -18D6 ; [.369C.0020.0002] # CANADIAN SYLLABICS OJIBWAY K -18D7 ; [.369D.0020.0002] # CANADIAN SYLLABICS OJIBWAY C -18D8 ; [.369E.0020.0002] # CANADIAN SYLLABICS OJIBWAY M -18D9 ; [.369F.0020.0002] # CANADIAN SYLLABICS OJIBWAY N -18DA ; [.36A0.0020.0002] # CANADIAN SYLLABICS OJIBWAY S -18DB ; [.36A1.0020.0002] # CANADIAN SYLLABICS OJIBWAY SH -18DC ; [.36A2.0020.0002] # CANADIAN SYLLABICS EASTERN W -18DD ; [.36A3.0020.0002] # CANADIAN SYLLABICS WESTERN W -18DE ; [.36A4.0020.0002] # CANADIAN SYLLABICS FINAL SMALL RING -18DF ; [.36A5.0020.0002] # CANADIAN SYLLABICS FINAL RAISED DOT -18E0 ; [.36A6.0020.0002] # CANADIAN SYLLABICS R-CREE RWE -18E1 ; [.36A7.0020.0002] # CANADIAN SYLLABICS WEST-CREE LOO -18E2 ; [.36A8.0020.0002] # CANADIAN SYLLABICS WEST-CREE LAA -18E3 ; [.36A9.0020.0002] # CANADIAN SYLLABICS THWE -18E4 ; [.36AA.0020.0002] # CANADIAN SYLLABICS THWA -18E5 ; [.36AB.0020.0002] # CANADIAN SYLLABICS TTHWE -18E6 ; [.36AC.0020.0002] # CANADIAN SYLLABICS TTHOO -18E7 ; [.36AD.0020.0002] # CANADIAN SYLLABICS TTHAA -18E8 ; [.36AE.0020.0002] # CANADIAN SYLLABICS TLHWE -18E9 ; [.36AF.0020.0002] # CANADIAN SYLLABICS TLHOO -18EA ; [.36B0.0020.0002] # CANADIAN SYLLABICS SAYISI SHWE -18EB ; [.36B1.0020.0002] # CANADIAN SYLLABICS SAYISI SHOO -18EC ; [.36B2.0020.0002] # CANADIAN SYLLABICS SAYISI HOO -18ED ; [.36B3.0020.0002] # CANADIAN SYLLABICS CARRIER GWU -18EE ; [.36B4.0020.0002] # CANADIAN SYLLABICS CARRIER DENE GEE -18EF ; [.36B5.0020.0002] # CANADIAN SYLLABICS CARRIER GAA -18F0 ; [.36B6.0020.0002] # CANADIAN SYLLABICS CARRIER GWA -18F1 ; [.36B7.0020.0002] # CANADIAN SYLLABICS SAYISI JUU -18F2 ; [.36B8.0020.0002] # CANADIAN SYLLABICS CARRIER JWA -18F3 ; [.36B9.0020.0002] # CANADIAN SYLLABICS BEAVER DENE L -18F4 ; [.36BA.0020.0002] # CANADIAN SYLLABICS BEAVER DENE R -18F5 ; [.36BB.0020.0002] # CANADIAN SYLLABICS CARRIER DENTAL S -1681 ; [.36BC.0020.0002] # OGHAM LETTER BEITH -1682 ; [.36BD.0020.0002] # OGHAM LETTER LUIS -1683 ; [.36BE.0020.0002] # OGHAM LETTER FEARN -1684 ; [.36BF.0020.0002] # OGHAM LETTER SAIL -1685 ; [.36C0.0020.0002] # OGHAM LETTER NION -1686 ; [.36C1.0020.0002] # OGHAM LETTER UATH -1687 ; [.36C2.0020.0002] # OGHAM LETTER DAIR -1688 ; [.36C3.0020.0002] # OGHAM LETTER TINNE -1689 ; [.36C4.0020.0002] # OGHAM LETTER COLL -168A ; [.36C5.0020.0002] # OGHAM LETTER CEIRT -168B ; [.36C6.0020.0002] # OGHAM LETTER MUIN -168C ; [.36C7.0020.0002] # OGHAM LETTER GORT -168D ; [.36C8.0020.0002] # OGHAM LETTER NGEADAL -168E ; [.36C9.0020.0002] # OGHAM LETTER STRAIF -168F ; [.36CA.0020.0002] # OGHAM LETTER RUIS -1690 ; [.36CB.0020.0002] # OGHAM LETTER AILM -1691 ; [.36CC.0020.0002] # OGHAM LETTER ONN -1692 ; [.36CD.0020.0002] # OGHAM LETTER UR -1693 ; [.36CE.0020.0002] # OGHAM LETTER EADHADH -1694 ; [.36CF.0020.0002] # OGHAM LETTER IODHADH -1695 ; [.36D0.0020.0002] # OGHAM LETTER EABHADH -1696 ; [.36D1.0020.0002] # OGHAM LETTER OR -1697 ; [.36D2.0020.0002] # OGHAM LETTER UILLEANN -1698 ; [.36D3.0020.0002] # OGHAM LETTER IFIN -1699 ; [.36D4.0020.0002] # OGHAM LETTER EAMHANCHOLL -169A ; [.36D5.0020.0002] # OGHAM LETTER PEITH -16A0 ; [.36D6.0020.0002] # RUNIC LETTER FEHU FEOH FE F -16A1 ; [.36D6.0020.0004][.0000.0110.0004] # RUNIC LETTER V -16A2 ; [.36D7.0020.0002] # RUNIC LETTER URUZ UR U -16A4 ; [.36D7.0020.0004][.0000.0110.0004] # RUNIC LETTER Y -16A5 ; [.36D7.0020.0004][.0000.0111.0004] # RUNIC LETTER W -16A6 ; [.36D8.0020.0002] # RUNIC LETTER THURISAZ THURS THORN -16A7 ; [.36D8.0020.0004][.0000.0110.0004] # RUNIC LETTER ETH -16F0 ; [.36D8.0020.0004][.36D8.0020.0004] # RUNIC BELGTHOR SYMBOL -16A8 ; [.36D9.0020.0002] # RUNIC LETTER ANSUZ A -16A9 ; [.36D9.0020.0004][.0000.0110.0004] # RUNIC LETTER OS O -16AC ; [.36D9.0020.0004][.0000.0111.0004] # RUNIC LETTER LONG-BRANCH-OSS O -16AD ; [.36D9.0020.0004][.0000.0112.0004] # RUNIC LETTER SHORT-TWIG-OSS O -16AE ; [.36D9.0020.0004][.0000.0113.0004] # RUNIC LETTER O -16F4 ; [.36DA.0020.0002] # RUNIC LETTER FRANKS CASKET OS -16AF ; [.36DB.0020.0002] # RUNIC LETTER OE -16B0 ; [.36DC.0020.0002] # RUNIC LETTER ON -16B1 ; [.36DD.0020.0002] # RUNIC LETTER RAIDO RAD REID R -16B2 ; [.36DE.0020.0002] # RUNIC LETTER KAUNA -16B3 ; [.36DE.0020.0004][.0000.0110.0004] # RUNIC LETTER CEN -16B4 ; [.36DE.0020.0004][.0000.0111.0004] # RUNIC LETTER KAUN K -16B5 ; [.36DE.0020.0004][.0000.0112.0004] # RUNIC LETTER G -16B6 ; [.36DE.0020.0004][.0000.0113.0004] # RUNIC LETTER ENG -16F1 ; [.36DF.0020.0002] # RUNIC LETTER K -16B7 ; [.36E0.0020.0002] # RUNIC LETTER GEBO GYFU G -16B9 ; [.36E1.0020.0002] # RUNIC LETTER WUNJO WYNN W -16E9 ; [.36E1.0020.0004][.0000.0110.0004] # RUNIC LETTER Q -16BA ; [.36E2.0020.0002] # RUNIC LETTER HAGLAZ H -16BB ; [.36E2.0020.0004][.0000.0110.0004] # RUNIC LETTER HAEGL H -16BC ; [.36E2.0020.0004][.0000.0111.0004] # RUNIC LETTER LONG-BRANCH-HAGALL H -16BD ; [.36E2.0020.0004][.0000.0112.0004] # RUNIC LETTER SHORT-TWIG-HAGALL H -16BE ; [.36E3.0020.0002] # RUNIC LETTER NAUDIZ NYD NAUD N -16BF ; [.36E3.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-NAUD N -16C0 ; [.36E3.0020.0004][.0000.0111.0004] # RUNIC LETTER DOTTED-N -16C1 ; [.36E4.0020.0002] # RUNIC LETTER ISAZ IS ISS I -16C2 ; [.36E4.0020.0004][.0000.0110.0004] # RUNIC LETTER E -16F5 ; [.36E5.0020.0002] # RUNIC LETTER FRANKS CASKET IS -16C3 ; [.36E6.0020.0002] # RUNIC LETTER JERAN J -16C4 ; [.36E6.0020.0004][.0000.0110.0004] # RUNIC LETTER GER -16C5 ; [.36E7.0020.0002] # RUNIC LETTER LONG-BRANCH-AR AE -16C6 ; [.36E7.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-AR A -16EE ; [.36E7.0020.0004][.36F2.0020.0004] # RUNIC ARLAUG SYMBOL -16C7 ; [.36E8.0020.0002] # RUNIC LETTER IWAZ EOH -16C8 ; [.36E9.0020.0002] # RUNIC LETTER PERTHO PEORTH P -16D5 ; [.36E9.0020.0004][.0000.0110.0004] # RUNIC LETTER OPEN-P -16C9 ; [.36EA.0020.0002] # RUNIC LETTER ALGIZ EOLHX -16CA ; [.36EB.0020.0002] # RUNIC LETTER SOWILO S -16CB ; [.36EB.0020.0004][.0000.0110.0004] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S -16EA ; [.36EB.0020.0004][.0000.0111.0004] # RUNIC LETTER X -16CC ; [.36EB.0020.0004][.0000.0112.0004] # RUNIC LETTER SHORT-TWIG-SOL S -16CD ; [.36EB.0020.0004][.0000.0113.0004] # RUNIC LETTER C -16CE ; [.36EB.0020.0004][.0000.0114.0004] # RUNIC LETTER Z -16F2 ; [.36EC.0020.0002] # RUNIC LETTER SH -16CF ; [.36ED.0020.0002] # RUNIC LETTER TIWAZ TIR TYR T -16D0 ; [.36ED.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-TYR T -16D1 ; [.36ED.0020.0004][.0000.0111.0004] # RUNIC LETTER D -16D2 ; [.36EE.0020.0002] # RUNIC LETTER BERKANAN BEORC BJARKAN B -16D3 ; [.36EE.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-BJARKAN B -16D4 ; [.36EE.0020.0004][.0000.0111.0004] # RUNIC LETTER DOTTED-P -16D6 ; [.36EF.0020.0002] # RUNIC LETTER EHWAZ EH E -16F6 ; [.36F0.0020.0002] # RUNIC LETTER FRANKS CASKET EH -16D7 ; [.36F1.0020.0002] # RUNIC LETTER MANNAZ MAN M -16D8 ; [.36F1.0020.0004][.0000.0110.0004] # RUNIC LETTER LONG-BRANCH-MADR M -16D9 ; [.36F1.0020.0004][.0000.0111.0004] # RUNIC LETTER SHORT-TWIG-MADR M -16EF ; [.36F1.0020.0004][.0000.0110.0004][.36F1.0020.0004][.0000.0110.0004] # RUNIC TVIMADUR SYMBOL -16DA ; [.36F2.0020.0002] # RUNIC LETTER LAUKAZ LAGU LOGR L -16DB ; [.36F2.0020.0004][.0000.0110.0004] # RUNIC LETTER DOTTED-L -16DC ; [.36F3.0020.0002] # RUNIC LETTER INGWAZ -16DD ; [.36F3.0020.0004][.0000.0110.0004] # RUNIC LETTER ING -16DE ; [.36F4.0020.0002] # RUNIC LETTER DAGAZ DAEG D -16DF ; [.36F5.0020.0002] # RUNIC LETTER OTHALAN ETHEL O -16F3 ; [.36F6.0020.0002] # RUNIC LETTER OO -16AA ; [.36F7.0020.0002] # RUNIC LETTER AC A -16F7 ; [.36F8.0020.0002] # RUNIC LETTER FRANKS CASKET AC -16AB ; [.36F9.0020.0002] # RUNIC LETTER AESC -16F8 ; [.36FA.0020.0002] # RUNIC LETTER FRANKS CASKET AESC -16A3 ; [.36FB.0020.0002] # RUNIC LETTER YR -16E0 ; [.36FC.0020.0002] # RUNIC LETTER EAR -16E3 ; [.36FD.0020.0002] # RUNIC LETTER CALC -16B8 ; [.36FE.0020.0002] # RUNIC LETTER GAR -16E4 ; [.36FF.0020.0002] # RUNIC LETTER CEALC -16E1 ; [.3700.0020.0002] # RUNIC LETTER IOR -16E2 ; [.3701.0020.0002] # RUNIC LETTER CWEORTH -16E5 ; [.3702.0020.0002] # RUNIC LETTER STAN -16E6 ; [.3703.0020.0002] # RUNIC LETTER LONG-BRANCH-YR -16E7 ; [.3703.0020.0004][.0000.0110.0004] # RUNIC LETTER SHORT-TWIG-YR -16E8 ; [.3703.0020.0004][.0000.0111.0004] # RUNIC LETTER ICELANDIC-YR -10CC0 ; [.3704.0020.0002] # OLD HUNGARIAN SMALL LETTER A -10C80 ; [.3704.0020.0008] # OLD HUNGARIAN CAPITAL LETTER A -10CC1 ; [.3704.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER AA -10C81 ; [.3704.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER AA -10CC2 ; [.3705.0020.0002] # OLD HUNGARIAN SMALL LETTER EB -10C82 ; [.3705.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EB -10CC3 ; [.3706.0020.0002] # OLD HUNGARIAN SMALL LETTER AMB -10C83 ; [.3706.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AMB -10CC4 ; [.3707.0020.0002] # OLD HUNGARIAN SMALL LETTER EC -10C84 ; [.3707.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EC -10CC5 ; [.3708.0020.0002] # OLD HUNGARIAN SMALL LETTER ENC -10C85 ; [.3708.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENC -10CC6 ; [.3709.0020.0002] # OLD HUNGARIAN SMALL LETTER ECS -10C86 ; [.3709.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECS -10CC7 ; [.370A.0020.0002] # OLD HUNGARIAN SMALL LETTER ED -10C87 ; [.370A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ED -10CC8 ; [.370B.0020.0002] # OLD HUNGARIAN SMALL LETTER AND -10C88 ; [.370B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AND -10CC9 ; [.370C.0020.0002] # OLD HUNGARIAN SMALL LETTER E -10C89 ; [.370C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER E -10CCA ; [.370C.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER CLOSE E -10C8A ; [.370C.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER CLOSE E -10CCB ; [.370C.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER EE -10C8B ; [.370C.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER EE -10CCC ; [.370D.0020.0002] # OLD HUNGARIAN SMALL LETTER EF -10C8C ; [.370D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EF -10CCD ; [.370E.0020.0002] # OLD HUNGARIAN SMALL LETTER EG -10C8D ; [.370E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EG -10CCE ; [.370F.0020.0002] # OLD HUNGARIAN SMALL LETTER EGY -10C8E ; [.370F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EGY -10CCF ; [.3710.0020.0002] # OLD HUNGARIAN SMALL LETTER EH -10C8F ; [.3710.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EH -10CD0 ; [.3711.0020.0002] # OLD HUNGARIAN SMALL LETTER I -10C90 ; [.3711.0020.0008] # OLD HUNGARIAN CAPITAL LETTER I -10CD1 ; [.3711.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER II -10C91 ; [.3711.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER II -10CD2 ; [.3712.0020.0002] # OLD HUNGARIAN SMALL LETTER EJ -10C92 ; [.3712.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EJ -10CD3 ; [.3713.0020.0002] # OLD HUNGARIAN SMALL LETTER EK -10C93 ; [.3713.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EK -10CD4 ; [.3714.0020.0002] # OLD HUNGARIAN SMALL LETTER AK -10C94 ; [.3714.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AK -10CD5 ; [.3715.0020.0002] # OLD HUNGARIAN SMALL LETTER UNK -10C95 ; [.3715.0020.0008] # OLD HUNGARIAN CAPITAL LETTER UNK -10CD6 ; [.3716.0020.0002] # OLD HUNGARIAN SMALL LETTER EL -10C96 ; [.3716.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EL -10CD7 ; [.3717.0020.0002] # OLD HUNGARIAN SMALL LETTER ELY -10C97 ; [.3717.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ELY -10CD8 ; [.3718.0020.0002] # OLD HUNGARIAN SMALL LETTER EM -10C98 ; [.3718.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EM -10CD9 ; [.3719.0020.0002] # OLD HUNGARIAN SMALL LETTER EN -10C99 ; [.3719.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EN -10CDA ; [.371A.0020.0002] # OLD HUNGARIAN SMALL LETTER ENY -10C9A ; [.371A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENY -10CDB ; [.371B.0020.0002] # OLD HUNGARIAN SMALL LETTER O -10C9B ; [.371B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER O -10CDC ; [.371B.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER OO -10C9C ; [.371B.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER OO -10CDD ; [.371C.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE -10C9D ; [.371C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE -10CDE ; [.371C.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA OE -10C9E ; [.371C.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE -10CDF ; [.371C.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER OEE -10C9F ; [.371C.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER OEE -10CE0 ; [.371D.0020.0002] # OLD HUNGARIAN SMALL LETTER EP -10CA0 ; [.371D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EP -10CE1 ; [.371E.0020.0002] # OLD HUNGARIAN SMALL LETTER EMP -10CA1 ; [.371E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EMP -10CE2 ; [.371F.0020.0002] # OLD HUNGARIAN SMALL LETTER ER -10CA2 ; [.371F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ER -10CE3 ; [.371F.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER SHORT ER -10CA3 ; [.371F.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER SHORT ER -10CE4 ; [.3720.0020.0002] # OLD HUNGARIAN SMALL LETTER ES -10CA4 ; [.3720.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ES -10CE5 ; [.3721.0020.0002] # OLD HUNGARIAN SMALL LETTER ESZ -10CA5 ; [.3721.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ESZ -10CE6 ; [.3722.0020.0002] # OLD HUNGARIAN SMALL LETTER ET -10CA6 ; [.3722.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ET -10CE7 ; [.3723.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT -10CA7 ; [.3723.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT -10CE8 ; [.3724.0020.0002] # OLD HUNGARIAN SMALL LETTER ETY -10CA8 ; [.3724.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ETY -10CE9 ; [.3725.0020.0002] # OLD HUNGARIAN SMALL LETTER ECH -10CA9 ; [.3725.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECH -10CEA ; [.3726.0020.0002] # OLD HUNGARIAN SMALL LETTER U -10CAA ; [.3726.0020.0008] # OLD HUNGARIAN CAPITAL LETTER U -10CEB ; [.3726.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER UU -10CAB ; [.3726.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER UU -10CEC ; [.3727.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE -10CAC ; [.3727.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE -10CED ; [.3727.0020.0004][.0000.0110.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA UE -10CAD ; [.3727.0020.000A][.0000.0110.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE -10CEE ; [.3728.0020.0002] # OLD HUNGARIAN SMALL LETTER EV -10CAE ; [.3728.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EV -10CEF ; [.3729.0020.0002] # OLD HUNGARIAN SMALL LETTER EZ -10CAF ; [.3729.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZ -10CF0 ; [.372A.0020.0002] # OLD HUNGARIAN SMALL LETTER EZS -10CB0 ; [.372A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZS -10CF1 ; [.372B.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN -10CB1 ; [.372B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN -10CF2 ; [.372C.0020.0002] # OLD HUNGARIAN SMALL LETTER US -10CB2 ; [.372C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER US -10C00 ; [.372D.0020.0002] # OLD TURKIC LETTER ORKHON A -10C01 ; [.372D.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI A -10C02 ; [.372E.0020.0002] # OLD TURKIC LETTER YENISEI AE -10C03 ; [.372F.0020.0002] # OLD TURKIC LETTER ORKHON I -10C04 ; [.372F.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI I -10C05 ; [.3730.0020.0002] # OLD TURKIC LETTER YENISEI E -10C06 ; [.3731.0020.0002] # OLD TURKIC LETTER ORKHON O -10C07 ; [.3732.0020.0002] # OLD TURKIC LETTER ORKHON OE -10C08 ; [.3732.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI OE -10C09 ; [.3733.0020.0002] # OLD TURKIC LETTER ORKHON AB -10C0A ; [.3733.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AB -10C0B ; [.3734.0020.0002] # OLD TURKIC LETTER ORKHON AEB -10C0C ; [.3734.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEB -10C0D ; [.3735.0020.0002] # OLD TURKIC LETTER ORKHON AG -10C0E ; [.3735.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AG -10C0F ; [.3736.0020.0002] # OLD TURKIC LETTER ORKHON AEG -10C10 ; [.3736.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEG -10C11 ; [.3737.0020.0002] # OLD TURKIC LETTER ORKHON AD -10C12 ; [.3737.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AD -10C13 ; [.3738.0020.0002] # OLD TURKIC LETTER ORKHON AED -10C14 ; [.3739.0020.0002] # OLD TURKIC LETTER ORKHON EZ -10C15 ; [.3739.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI EZ -10C16 ; [.373A.0020.0002] # OLD TURKIC LETTER ORKHON AY -10C17 ; [.373A.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AY -10C18 ; [.373B.0020.0002] # OLD TURKIC LETTER ORKHON AEY -10C19 ; [.373B.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEY -10C1A ; [.373C.0020.0002] # OLD TURKIC LETTER ORKHON AEK -10C1B ; [.373C.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEK -10C1C ; [.373D.0020.0002] # OLD TURKIC LETTER ORKHON OEK -10C1D ; [.373D.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI OEK -10C1E ; [.373E.0020.0002] # OLD TURKIC LETTER ORKHON AL -10C1F ; [.373E.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AL -10C20 ; [.373F.0020.0002] # OLD TURKIC LETTER ORKHON AEL -10C21 ; [.3740.0020.0002] # OLD TURKIC LETTER ORKHON ELT -10C22 ; [.3741.0020.0002] # OLD TURKIC LETTER ORKHON EM -10C23 ; [.3742.0020.0002] # OLD TURKIC LETTER ORKHON AN -10C24 ; [.3743.0020.0002] # OLD TURKIC LETTER ORKHON AEN -10C25 ; [.3743.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AEN -10C26 ; [.3744.0020.0002] # OLD TURKIC LETTER ORKHON ENT -10C27 ; [.3744.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ENT -10C28 ; [.3745.0020.0002] # OLD TURKIC LETTER ORKHON ENC -10C29 ; [.3745.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ENC -10C2A ; [.3746.0020.0002] # OLD TURKIC LETTER ORKHON ENY -10C2B ; [.3746.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ENY -10C2C ; [.3747.0020.0002] # OLD TURKIC LETTER YENISEI ANG -10C2D ; [.3748.0020.0002] # OLD TURKIC LETTER ORKHON ENG -10C2E ; [.3748.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AENG -10C2F ; [.3749.0020.0002] # OLD TURKIC LETTER ORKHON EP -10C30 ; [.374A.0020.0002] # OLD TURKIC LETTER ORKHON OP -10C31 ; [.374B.0020.0002] # OLD TURKIC LETTER ORKHON IC -10C32 ; [.374C.0020.0002] # OLD TURKIC LETTER ORKHON EC -10C33 ; [.374C.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI EC -10C34 ; [.374D.0020.0002] # OLD TURKIC LETTER ORKHON AQ -10C35 ; [.374D.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AQ -10C36 ; [.374E.0020.0002] # OLD TURKIC LETTER ORKHON IQ -10C37 ; [.374E.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI IQ -10C38 ; [.374F.0020.0002] # OLD TURKIC LETTER ORKHON OQ -10C39 ; [.374F.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI OQ -10C3A ; [.3750.0020.0002] # OLD TURKIC LETTER ORKHON AR -10C3B ; [.3750.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AR -10C3C ; [.3751.0020.0002] # OLD TURKIC LETTER ORKHON AER -10C3D ; [.3752.0020.0002] # OLD TURKIC LETTER ORKHON AS -10C3E ; [.3753.0020.0002] # OLD TURKIC LETTER ORKHON AES -10C3F ; [.3754.0020.0002] # OLD TURKIC LETTER ORKHON ASH -10C40 ; [.3754.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ASH -10C41 ; [.3755.0020.0002] # OLD TURKIC LETTER ORKHON ESH -10C42 ; [.3755.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI ESH -10C43 ; [.3756.0020.0002] # OLD TURKIC LETTER ORKHON AT -10C44 ; [.3756.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AT -10C45 ; [.3757.0020.0002] # OLD TURKIC LETTER ORKHON AET -10C46 ; [.3757.0020.0004][.0000.0110.0004] # OLD TURKIC LETTER YENISEI AET -10C47 ; [.3758.0020.0002] # OLD TURKIC LETTER ORKHON OT -10C48 ; [.3759.0020.0002] # OLD TURKIC LETTER ORKHON BASH -A500 ; [.375A.0020.0002] # VAI SYLLABLE EE -A501 ; [.375B.0020.0002] # VAI SYLLABLE EEN -A502 ; [.375C.0020.0002] # VAI SYLLABLE HEE -A503 ; [.375D.0020.0002] # VAI SYLLABLE WEE -A504 ; [.375E.0020.0002] # VAI SYLLABLE WEEN -A505 ; [.375F.0020.0002] # VAI SYLLABLE PEE -A506 ; [.3760.0020.0002] # VAI SYLLABLE BHEE -A507 ; [.3761.0020.0002] # VAI SYLLABLE BEE -A508 ; [.3762.0020.0002] # VAI SYLLABLE MBEE -A509 ; [.3763.0020.0002] # VAI SYLLABLE KPEE -A50A ; [.3764.0020.0002] # VAI SYLLABLE MGBEE -A50B ; [.3765.0020.0002] # VAI SYLLABLE GBEE -A50C ; [.3766.0020.0002] # VAI SYLLABLE FEE -A613 ; [.3766.0020.0004][.3865.0020.0004] # VAI SYMBOL FEENG -A50D ; [.3767.0020.0002] # VAI SYLLABLE VEE -A50E ; [.3768.0020.0002] # VAI SYLLABLE TEE -A50F ; [.3769.0020.0002] # VAI SYLLABLE THEE -A510 ; [.376A.0020.0002] # VAI SYLLABLE DHEE -A511 ; [.376B.0020.0002] # VAI SYLLABLE DHHEE -A512 ; [.376C.0020.0002] # VAI SYLLABLE LEE -A513 ; [.376D.0020.0002] # VAI SYLLABLE REE -A514 ; [.376E.0020.0002] # VAI SYLLABLE DEE -A515 ; [.376F.0020.0002] # VAI SYLLABLE NDEE -A516 ; [.3770.0020.0002] # VAI SYLLABLE SEE -A517 ; [.3771.0020.0002] # VAI SYLLABLE SHEE -A518 ; [.3772.0020.0002] # VAI SYLLABLE ZEE -A519 ; [.3773.0020.0002] # VAI SYLLABLE ZHEE -A51A ; [.3774.0020.0002] # VAI SYLLABLE CEE -A51B ; [.3775.0020.0002] # VAI SYLLABLE JEE -A51C ; [.3776.0020.0002] # VAI SYLLABLE NJEE -A51D ; [.3777.0020.0002] # VAI SYLLABLE YEE -A51E ; [.3778.0020.0002] # VAI SYLLABLE KEE -A614 ; [.3778.0020.0004][.3865.0020.0004] # VAI SYMBOL KEENG -A51F ; [.3779.0020.0002] # VAI SYLLABLE NGGEE -A520 ; [.377A.0020.0002] # VAI SYLLABLE GEE -A521 ; [.377B.0020.0002] # VAI SYLLABLE MEE -A522 ; [.377C.0020.0002] # VAI SYLLABLE NEE -A523 ; [.377D.0020.0002] # VAI SYLLABLE NYEE -A524 ; [.377E.0020.0002] # VAI SYLLABLE I -A525 ; [.377F.0020.0002] # VAI SYLLABLE IN -A526 ; [.3780.0020.0002] # VAI SYLLABLE HI -A527 ; [.3781.0020.0002] # VAI SYLLABLE HIN -A528 ; [.3782.0020.0002] # VAI SYLLABLE WI -A529 ; [.3783.0020.0002] # VAI SYLLABLE WIN -A52A ; [.3784.0020.0002] # VAI SYLLABLE PI -A52B ; [.3785.0020.0002] # VAI SYLLABLE BHI -A52C ; [.3786.0020.0002] # VAI SYLLABLE BI -A52D ; [.3787.0020.0002] # VAI SYLLABLE MBI -A52E ; [.3788.0020.0002] # VAI SYLLABLE KPI -A52F ; [.3789.0020.0002] # VAI SYLLABLE MGBI -A530 ; [.378A.0020.0002] # VAI SYLLABLE GBI -A531 ; [.378B.0020.0002] # VAI SYLLABLE FI -A532 ; [.378C.0020.0002] # VAI SYLLABLE VI -A533 ; [.378D.0020.0002] # VAI SYLLABLE TI -A615 ; [.378D.0020.0004][.3865.0020.0004] # VAI SYMBOL TING -A534 ; [.378E.0020.0002] # VAI SYLLABLE THI -A535 ; [.378F.0020.0002] # VAI SYLLABLE DHI -A536 ; [.3790.0020.0002] # VAI SYLLABLE DHHI -A537 ; [.3791.0020.0002] # VAI SYLLABLE LI -A538 ; [.3792.0020.0002] # VAI SYLLABLE RI -A539 ; [.3793.0020.0002] # VAI SYLLABLE DI -A53A ; [.3794.0020.0002] # VAI SYLLABLE NDI -A53B ; [.3795.0020.0002] # VAI SYLLABLE SI -A53C ; [.3796.0020.0002] # VAI SYLLABLE SHI -A53D ; [.3797.0020.0002] # VAI SYLLABLE ZI -A53E ; [.3798.0020.0002] # VAI SYLLABLE ZHI -A53F ; [.3799.0020.0002] # VAI SYLLABLE CI -A540 ; [.379A.0020.0002] # VAI SYLLABLE JI -A541 ; [.379B.0020.0002] # VAI SYLLABLE NJI -A542 ; [.379C.0020.0002] # VAI SYLLABLE YI -A543 ; [.379D.0020.0002] # VAI SYLLABLE KI -A544 ; [.379E.0020.0002] # VAI SYLLABLE NGGI -A545 ; [.379F.0020.0002] # VAI SYLLABLE GI -A546 ; [.37A0.0020.0002] # VAI SYLLABLE MI -A547 ; [.37A1.0020.0002] # VAI SYLLABLE NI -A616 ; [.37A1.0020.0004][.3866.0020.0004] # VAI SYMBOL NII -A548 ; [.37A2.0020.0002] # VAI SYLLABLE NYI -A549 ; [.37A3.0020.0002] # VAI SYLLABLE A -A54A ; [.37A4.0020.0002] # VAI SYLLABLE AN -A54B ; [.37A5.0020.0002] # VAI SYLLABLE NGAN -A54C ; [.37A6.0020.0002] # VAI SYLLABLE HA -A54D ; [.37A7.0020.0002] # VAI SYLLABLE HAN -A54E ; [.37A8.0020.0002] # VAI SYLLABLE WA -A54F ; [.37A9.0020.0002] # VAI SYLLABLE WAN -A550 ; [.37AA.0020.0002] # VAI SYLLABLE PA -A551 ; [.37AB.0020.0002] # VAI SYLLABLE BHA -A552 ; [.37AC.0020.0002] # VAI SYLLABLE BA -A617 ; [.37AC.0020.0004][.3865.0020.0004] # VAI SYMBOL BANG -A553 ; [.37AD.0020.0002] # VAI SYLLABLE MBA -A554 ; [.37AE.0020.0002] # VAI SYLLABLE KPA -A555 ; [.37AF.0020.0002] # VAI SYLLABLE KPAN -A556 ; [.37B0.0020.0002] # VAI SYLLABLE MGBA -A557 ; [.37B1.0020.0002] # VAI SYLLABLE GBA -A558 ; [.37B2.0020.0002] # VAI SYLLABLE FA -A610 ; [.37B2.0020.0004] # VAI SYLLABLE NDOLE FA -A618 ; [.37B2.0020.0004][.3866.0020.0004] # VAI SYMBOL FAA -A559 ; [.37B3.0020.0002] # VAI SYLLABLE VA -A55A ; [.37B4.0020.0002] # VAI SYLLABLE TA -A619 ; [.37B4.0020.0004][.3866.0020.0004] # VAI SYMBOL TAA -A55B ; [.37B5.0020.0002] # VAI SYLLABLE THA -A55C ; [.37B6.0020.0002] # VAI SYLLABLE DHA -A55D ; [.37B7.0020.0002] # VAI SYLLABLE DHHA -A55E ; [.37B8.0020.0002] # VAI SYLLABLE LA -A55F ; [.37B9.0020.0002] # VAI SYLLABLE RA -A560 ; [.37BA.0020.0002] # VAI SYLLABLE DA -A61A ; [.37BA.0020.0004][.3865.0020.0004] # VAI SYMBOL DANG -A561 ; [.37BB.0020.0002] # VAI SYLLABLE NDA -A562 ; [.37BC.0020.0002] # VAI SYLLABLE SA -A563 ; [.37BD.0020.0002] # VAI SYLLABLE SHA -A564 ; [.37BE.0020.0002] # VAI SYLLABLE ZA -A565 ; [.37BF.0020.0002] # VAI SYLLABLE ZHA -A566 ; [.37C0.0020.0002] # VAI SYLLABLE CA -A567 ; [.37C1.0020.0002] # VAI SYLLABLE JA -A568 ; [.37C2.0020.0002] # VAI SYLLABLE NJA -A569 ; [.37C3.0020.0002] # VAI SYLLABLE YA -A56A ; [.37C4.0020.0002] # VAI SYLLABLE KA -A611 ; [.37C4.0020.0004] # VAI SYLLABLE NDOLE KA -A56B ; [.37C5.0020.0002] # VAI SYLLABLE KAN -A56C ; [.37C6.0020.0002] # VAI SYLLABLE NGGA -A56D ; [.37C7.0020.0002] # VAI SYLLABLE GA -A56E ; [.37C8.0020.0002] # VAI SYLLABLE MA -A62A ; [.37C8.0020.0004] # VAI SYLLABLE NDOLE MA -A56F ; [.37C9.0020.0002] # VAI SYLLABLE NA -A570 ; [.37CA.0020.0002] # VAI SYLLABLE NYA -A571 ; [.37CB.0020.0002] # VAI SYLLABLE OO -A572 ; [.37CC.0020.0002] # VAI SYLLABLE OON -A573 ; [.37CD.0020.0002] # VAI SYLLABLE HOO -A574 ; [.37CE.0020.0002] # VAI SYLLABLE WOO -A575 ; [.37CF.0020.0002] # VAI SYLLABLE WOON -A576 ; [.37D0.0020.0002] # VAI SYLLABLE POO -A577 ; [.37D1.0020.0002] # VAI SYLLABLE BHOO -A578 ; [.37D2.0020.0002] # VAI SYLLABLE BOO -A579 ; [.37D3.0020.0002] # VAI SYLLABLE MBOO -A57A ; [.37D4.0020.0002] # VAI SYLLABLE KPOO -A57B ; [.37D5.0020.0002] # VAI SYLLABLE MGBOO -A57C ; [.37D6.0020.0002] # VAI SYLLABLE GBOO -A57D ; [.37D7.0020.0002] # VAI SYLLABLE FOO -A57E ; [.37D8.0020.0002] # VAI SYLLABLE VOO -A57F ; [.37D9.0020.0002] # VAI SYLLABLE TOO -A580 ; [.37DA.0020.0002] # VAI SYLLABLE THOO -A581 ; [.37DB.0020.0002] # VAI SYLLABLE DHOO -A582 ; [.37DC.0020.0002] # VAI SYLLABLE DHHOO -A583 ; [.37DD.0020.0002] # VAI SYLLABLE LOO -A584 ; [.37DE.0020.0002] # VAI SYLLABLE ROO -A585 ; [.37DF.0020.0002] # VAI SYLLABLE DOO -A61B ; [.37DF.0020.0004][.3865.0020.0004] # VAI SYMBOL DOONG -A586 ; [.37E0.0020.0002] # VAI SYLLABLE NDOO -A587 ; [.37E1.0020.0002] # VAI SYLLABLE SOO -A612 ; [.37E1.0020.0004] # VAI SYLLABLE NDOLE SOO -A588 ; [.37E2.0020.0002] # VAI SYLLABLE SHOO -A589 ; [.37E3.0020.0002] # VAI SYLLABLE ZOO -A58A ; [.37E4.0020.0002] # VAI SYLLABLE ZHOO -A58B ; [.37E5.0020.0002] # VAI SYLLABLE COO -A58C ; [.37E6.0020.0002] # VAI SYLLABLE JOO -A58D ; [.37E7.0020.0002] # VAI SYLLABLE NJOO -A58E ; [.37E8.0020.0002] # VAI SYLLABLE YOO -A58F ; [.37E9.0020.0002] # VAI SYLLABLE KOO -A590 ; [.37EA.0020.0002] # VAI SYLLABLE NGGOO -A591 ; [.37EB.0020.0002] # VAI SYLLABLE GOO -A592 ; [.37EC.0020.0002] # VAI SYLLABLE MOO -A593 ; [.37ED.0020.0002] # VAI SYLLABLE NOO -A594 ; [.37EE.0020.0002] # VAI SYLLABLE NYOO -A595 ; [.37EF.0020.0002] # VAI SYLLABLE U -A596 ; [.37F0.0020.0002] # VAI SYLLABLE UN -A597 ; [.37F1.0020.0002] # VAI SYLLABLE HU -A598 ; [.37F2.0020.0002] # VAI SYLLABLE HUN -A599 ; [.37F3.0020.0002] # VAI SYLLABLE WU -A59A ; [.37F4.0020.0002] # VAI SYLLABLE WUN -A59B ; [.37F5.0020.0002] # VAI SYLLABLE PU -A59C ; [.37F6.0020.0002] # VAI SYLLABLE BHU -A59D ; [.37F7.0020.0002] # VAI SYLLABLE BU -A59E ; [.37F8.0020.0002] # VAI SYLLABLE MBU -A59F ; [.37F9.0020.0002] # VAI SYLLABLE KPU -A5A0 ; [.37FA.0020.0002] # VAI SYLLABLE MGBU -A5A1 ; [.37FB.0020.0002] # VAI SYLLABLE GBU -A5A2 ; [.37FC.0020.0002] # VAI SYLLABLE FU -A5A3 ; [.37FD.0020.0002] # VAI SYLLABLE VU -A5A4 ; [.37FE.0020.0002] # VAI SYLLABLE TU -A5A5 ; [.37FF.0020.0002] # VAI SYLLABLE THU -A5A6 ; [.3800.0020.0002] # VAI SYLLABLE DHU -A5A7 ; [.3801.0020.0002] # VAI SYLLABLE DHHU -A5A8 ; [.3802.0020.0002] # VAI SYLLABLE LU -A5A9 ; [.3803.0020.0002] # VAI SYLLABLE RU -A5AA ; [.3804.0020.0002] # VAI SYLLABLE DU -A5AB ; [.3805.0020.0002] # VAI SYLLABLE NDU -A5AC ; [.3806.0020.0002] # VAI SYLLABLE SU -A5AD ; [.3807.0020.0002] # VAI SYLLABLE SHU -A5AE ; [.3808.0020.0002] # VAI SYLLABLE ZU -A5AF ; [.3809.0020.0002] # VAI SYLLABLE ZHU -A5B0 ; [.380A.0020.0002] # VAI SYLLABLE CU -A5B1 ; [.380B.0020.0002] # VAI SYLLABLE JU -A5B2 ; [.380C.0020.0002] # VAI SYLLABLE NJU -A5B3 ; [.380D.0020.0002] # VAI SYLLABLE YU -A5B4 ; [.380E.0020.0002] # VAI SYLLABLE KU -A61C ; [.380E.0020.0004][.3865.0020.0004] # VAI SYMBOL KUNG -A5B5 ; [.380F.0020.0002] # VAI SYLLABLE NGGU -A5B6 ; [.3810.0020.0002] # VAI SYLLABLE GU -A5B7 ; [.3811.0020.0002] # VAI SYLLABLE MU -A5B8 ; [.3812.0020.0002] # VAI SYLLABLE NU -A5B9 ; [.3813.0020.0002] # VAI SYLLABLE NYU -A5BA ; [.3814.0020.0002] # VAI SYLLABLE O -A5BB ; [.3815.0020.0002] # VAI SYLLABLE ON -A5BC ; [.3816.0020.0002] # VAI SYLLABLE NGON -A5BD ; [.3817.0020.0002] # VAI SYLLABLE HO -A5BE ; [.3818.0020.0002] # VAI SYLLABLE HON -A5BF ; [.3819.0020.0002] # VAI SYLLABLE WO -A5C0 ; [.381A.0020.0002] # VAI SYLLABLE WON -A5C1 ; [.381B.0020.0002] # VAI SYLLABLE PO -A5C2 ; [.381C.0020.0002] # VAI SYLLABLE BHO -A5C3 ; [.381D.0020.0002] # VAI SYLLABLE BO -A5C4 ; [.381E.0020.0002] # VAI SYLLABLE MBO -A5C5 ; [.381F.0020.0002] # VAI SYLLABLE KPO -A5C6 ; [.3820.0020.0002] # VAI SYLLABLE MGBO -A5C7 ; [.3821.0020.0002] # VAI SYLLABLE GBO -A5C8 ; [.3822.0020.0002] # VAI SYLLABLE GBON -A5C9 ; [.3823.0020.0002] # VAI SYLLABLE FO -A5CA ; [.3824.0020.0002] # VAI SYLLABLE VO -A5CB ; [.3825.0020.0002] # VAI SYLLABLE TO -A61D ; [.3825.0020.0004][.3865.0020.0004] # VAI SYMBOL TONG -A5CC ; [.3826.0020.0002] # VAI SYLLABLE THO -A5CD ; [.3827.0020.0002] # VAI SYLLABLE DHO -A5CE ; [.3828.0020.0002] # VAI SYLLABLE DHHO -A5CF ; [.3829.0020.0002] # VAI SYLLABLE LO -A5D0 ; [.382A.0020.0002] # VAI SYLLABLE RO -A5D1 ; [.382B.0020.0002] # VAI SYLLABLE DO -A62B ; [.382B.0020.0004] # VAI SYLLABLE NDOLE DO -A61E ; [.382B.0020.0004][.3866.0020.0004] # VAI SYMBOL DO-O -A5D2 ; [.382C.0020.0002] # VAI SYLLABLE NDO -A5D3 ; [.382D.0020.0002] # VAI SYLLABLE SO -A5D4 ; [.382E.0020.0002] # VAI SYLLABLE SHO -A5D5 ; [.382F.0020.0002] # VAI SYLLABLE ZO -A5D6 ; [.3830.0020.0002] # VAI SYLLABLE ZHO -A5D7 ; [.3831.0020.0002] # VAI SYLLABLE CO -A5D8 ; [.3832.0020.0002] # VAI SYLLABLE JO -A61F ; [.3832.0020.0004][.3865.0020.0004] # VAI SYMBOL JONG -A5D9 ; [.3833.0020.0002] # VAI SYLLABLE NJO -A5DA ; [.3834.0020.0002] # VAI SYLLABLE YO -A5DB ; [.3835.0020.0002] # VAI SYLLABLE KO -A5DC ; [.3836.0020.0002] # VAI SYLLABLE NGGO -A5DD ; [.3837.0020.0002] # VAI SYLLABLE GO -A5DE ; [.3838.0020.0002] # VAI SYLLABLE MO -A5DF ; [.3839.0020.0002] # VAI SYLLABLE NO -A5E0 ; [.383A.0020.0002] # VAI SYLLABLE NYO -A5E1 ; [.383B.0020.0002] # VAI SYLLABLE E -A5E2 ; [.383C.0020.0002] # VAI SYLLABLE EN -A5E3 ; [.383D.0020.0002] # VAI SYLLABLE NGEN -A5E4 ; [.383E.0020.0002] # VAI SYLLABLE HE -A5E5 ; [.383F.0020.0002] # VAI SYLLABLE HEN -A5E6 ; [.3840.0020.0002] # VAI SYLLABLE WE -A5E7 ; [.3841.0020.0002] # VAI SYLLABLE WEN -A5E8 ; [.3842.0020.0002] # VAI SYLLABLE PE -A5E9 ; [.3843.0020.0002] # VAI SYLLABLE BHE -A5EA ; [.3844.0020.0002] # VAI SYLLABLE BE -A5EB ; [.3845.0020.0002] # VAI SYLLABLE MBE -A5EC ; [.3846.0020.0002] # VAI SYLLABLE KPE -A5ED ; [.3847.0020.0002] # VAI SYLLABLE KPEN -A5EE ; [.3848.0020.0002] # VAI SYLLABLE MGBE -A5EF ; [.3849.0020.0002] # VAI SYLLABLE GBE -A5F0 ; [.384A.0020.0002] # VAI SYLLABLE GBEN -A5F1 ; [.384B.0020.0002] # VAI SYLLABLE FE -A5F2 ; [.384C.0020.0002] # VAI SYLLABLE VE -A5F3 ; [.384D.0020.0002] # VAI SYLLABLE TE -A5F4 ; [.384E.0020.0002] # VAI SYLLABLE THE -A5F5 ; [.384F.0020.0002] # VAI SYLLABLE DHE -A5F6 ; [.3850.0020.0002] # VAI SYLLABLE DHHE -A5F7 ; [.3851.0020.0002] # VAI SYLLABLE LE -A5F8 ; [.3852.0020.0002] # VAI SYLLABLE RE -A5F9 ; [.3853.0020.0002] # VAI SYLLABLE DE -A5FA ; [.3854.0020.0002] # VAI SYLLABLE NDE -A5FB ; [.3855.0020.0002] # VAI SYLLABLE SE -A5FC ; [.3856.0020.0002] # VAI SYLLABLE SHE -A5FD ; [.3857.0020.0002] # VAI SYLLABLE ZE -A5FE ; [.3858.0020.0002] # VAI SYLLABLE ZHE -A5FF ; [.3859.0020.0002] # VAI SYLLABLE CE -A600 ; [.385A.0020.0002] # VAI SYLLABLE JE -A601 ; [.385B.0020.0002] # VAI SYLLABLE NJE -A602 ; [.385C.0020.0002] # VAI SYLLABLE YE -A603 ; [.385D.0020.0002] # VAI SYLLABLE KE -A604 ; [.385E.0020.0002] # VAI SYLLABLE NGGE -A605 ; [.385F.0020.0002] # VAI SYLLABLE NGGEN -A606 ; [.3860.0020.0002] # VAI SYLLABLE GE -A607 ; [.3861.0020.0002] # VAI SYLLABLE GEN -A608 ; [.3862.0020.0002] # VAI SYLLABLE ME -A609 ; [.3863.0020.0002] # VAI SYLLABLE NE -A60A ; [.3864.0020.0002] # VAI SYLLABLE NYE -A60B ; [.3865.0020.0002] # VAI SYLLABLE NG -A60C ; [.3866.0020.0002] # VAI SYLLABLE LENGTHENER -A6A0 ; [.3867.0020.0002] # BAMUM LETTER A -A6A1 ; [.3868.0020.0002] # BAMUM LETTER KA -A6A2 ; [.3869.0020.0002] # BAMUM LETTER U -A6A3 ; [.386A.0020.0002] # BAMUM LETTER KU -A6A4 ; [.386B.0020.0002] # BAMUM LETTER EE -A6A5 ; [.386C.0020.0002] # BAMUM LETTER REE -A6A6 ; [.386D.0020.0002] # BAMUM LETTER TAE -A6A7 ; [.386E.0020.0002] # BAMUM LETTER O -A6A8 ; [.386F.0020.0002] # BAMUM LETTER NYI -A6A9 ; [.3870.0020.0002] # BAMUM LETTER I -A6AA ; [.3871.0020.0002] # BAMUM LETTER LA -A6AB ; [.3872.0020.0002] # BAMUM LETTER PA -A6AC ; [.3873.0020.0002] # BAMUM LETTER RII -A6AD ; [.3874.0020.0002] # BAMUM LETTER RIEE -A6AE ; [.3875.0020.0002] # BAMUM LETTER LEEEE -A6AF ; [.3876.0020.0002] # BAMUM LETTER MEEEE -A6B0 ; [.3877.0020.0002] # BAMUM LETTER TAA -A6B1 ; [.3878.0020.0002] # BAMUM LETTER NDAA -A6B2 ; [.3879.0020.0002] # BAMUM LETTER NJAEM -A6B3 ; [.387A.0020.0002] # BAMUM LETTER M -A6B4 ; [.387B.0020.0002] # BAMUM LETTER SUU -A6B5 ; [.387C.0020.0002] # BAMUM LETTER MU -A6B6 ; [.387D.0020.0002] # BAMUM LETTER SHII -A6B7 ; [.387E.0020.0002] # BAMUM LETTER SI -A6B8 ; [.387F.0020.0002] # BAMUM LETTER SHEUX -A6B9 ; [.3880.0020.0002] # BAMUM LETTER SEUX -A6BA ; [.3881.0020.0002] # BAMUM LETTER KYEE -A6BB ; [.3882.0020.0002] # BAMUM LETTER KET -A6BC ; [.3883.0020.0002] # BAMUM LETTER NUAE -A6BD ; [.3884.0020.0002] # BAMUM LETTER NU -A6BE ; [.3885.0020.0002] # BAMUM LETTER NJUAE -A6BF ; [.3886.0020.0002] # BAMUM LETTER YOQ -A6C0 ; [.3887.0020.0002] # BAMUM LETTER SHU -A6C1 ; [.3888.0020.0002] # BAMUM LETTER YUQ -A6C2 ; [.3889.0020.0002] # BAMUM LETTER YA -A6C3 ; [.388A.0020.0002] # BAMUM LETTER NSHA -A6C4 ; [.388B.0020.0002] # BAMUM LETTER KEUX -A6C5 ; [.388C.0020.0002] # BAMUM LETTER PEUX -A6C6 ; [.388D.0020.0002] # BAMUM LETTER NJEE -A6C7 ; [.388E.0020.0002] # BAMUM LETTER NTEE -A6C8 ; [.388F.0020.0002] # BAMUM LETTER PUE -A6C9 ; [.3890.0020.0002] # BAMUM LETTER WUE -A6CA ; [.3891.0020.0002] # BAMUM LETTER PEE -A6CB ; [.3892.0020.0002] # BAMUM LETTER FEE -A6CC ; [.3893.0020.0002] # BAMUM LETTER RU -A6CD ; [.3894.0020.0002] # BAMUM LETTER LU -A6CE ; [.3895.0020.0002] # BAMUM LETTER MI -A6CF ; [.3896.0020.0002] # BAMUM LETTER NI -A6D0 ; [.3897.0020.0002] # BAMUM LETTER REUX -A6D1 ; [.3898.0020.0002] # BAMUM LETTER RAE -A6D2 ; [.3899.0020.0002] # BAMUM LETTER KEN -A6D3 ; [.389A.0020.0002] # BAMUM LETTER NGKWAEN -A6D4 ; [.389B.0020.0002] # BAMUM LETTER NGGA -A6D5 ; [.389C.0020.0002] # BAMUM LETTER NGA -A6D6 ; [.389D.0020.0002] # BAMUM LETTER SHO -A6D7 ; [.389E.0020.0002] # BAMUM LETTER PUAE -A6D8 ; [.389F.0020.0002] # BAMUM LETTER FU -A6D9 ; [.38A0.0020.0002] # BAMUM LETTER FOM -A6DA ; [.38A1.0020.0002] # BAMUM LETTER WA -A6DB ; [.38A2.0020.0002] # BAMUM LETTER NA -A6DC ; [.38A3.0020.0002] # BAMUM LETTER LI -A6DD ; [.38A4.0020.0002] # BAMUM LETTER PI -A6DE ; [.38A5.0020.0002] # BAMUM LETTER LOQ -A6DF ; [.38A6.0020.0002] # BAMUM LETTER KO -A6E0 ; [.38A7.0020.0002] # BAMUM LETTER MBEN -A6E1 ; [.38A8.0020.0002] # BAMUM LETTER REN -A6E2 ; [.38A9.0020.0002] # BAMUM LETTER MEN -A6E3 ; [.38AA.0020.0002] # BAMUM LETTER MA -A6E4 ; [.38AB.0020.0002] # BAMUM LETTER TI -A6E5 ; [.38AC.0020.0002] # BAMUM LETTER KI -A6E6 ; [.38AD.0020.0002] # BAMUM LETTER MO -A6E7 ; [.38AE.0020.0002] # BAMUM LETTER MBAA -A6E8 ; [.38AF.0020.0002] # BAMUM LETTER TET -A6E9 ; [.38B0.0020.0002] # BAMUM LETTER KPA -A6EA ; [.38B1.0020.0002] # BAMUM LETTER TEN -A6EB ; [.38B2.0020.0002] # BAMUM LETTER NTUU -A6EC ; [.38B3.0020.0002] # BAMUM LETTER SAMBA -A6ED ; [.38B4.0020.0002] # BAMUM LETTER FAAMAE -A6EE ; [.38B5.0020.0002] # BAMUM LETTER KOVUU -A6EF ; [.38B6.0020.0002] # BAMUM LETTER KOGHOM -16800 ; [.38B7.0020.0002] # BAMUM LETTER PHASE-A NGKUE MFON -16801 ; [.38B8.0020.0002] # BAMUM LETTER PHASE-A GBIEE FON -16802 ; [.38B9.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE -16803 ; [.38BA.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMBA -16804 ; [.38BB.0020.0002] # BAMUM LETTER PHASE-A NAA MFON -16805 ; [.38BC.0020.0002] # BAMUM LETTER PHASE-A SHUENSHUET -16806 ; [.38BD.0020.0002] # BAMUM LETTER PHASE-A TITA MFON -16807 ; [.38BE.0020.0002] # BAMUM LETTER PHASE-A NZA MFON -16808 ; [.38BF.0020.0002] # BAMUM LETTER PHASE-A SHINDA PA NJI -16809 ; [.38C0.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE -1680A ; [.38C1.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA -1680B ; [.38C2.0020.0002] # BAMUM LETTER PHASE-A MAEMBGBIEE -1680C ; [.38C3.0020.0002] # BAMUM LETTER PHASE-A TU MAEMBA -1680D ; [.38C4.0020.0002] # BAMUM LETTER PHASE-A NGANGU -1680E ; [.38C5.0020.0002] # BAMUM LETTER PHASE-A MAEMVEUX -1680F ; [.38C6.0020.0002] # BAMUM LETTER PHASE-A MANSUAE -16810 ; [.38C7.0020.0002] # BAMUM LETTER PHASE-A MVEUAENGAM -16811 ; [.38C8.0020.0002] # BAMUM LETTER PHASE-A SEUNYAM -16812 ; [.38C9.0020.0002] # BAMUM LETTER PHASE-A NTOQPEN -16813 ; [.38CA.0020.0002] # BAMUM LETTER PHASE-A KEUKEUTNDA -16814 ; [.38CB.0020.0002] # BAMUM LETTER PHASE-A NKINDI -16815 ; [.38CC.0020.0002] # BAMUM LETTER PHASE-A SUU -16816 ; [.38CD.0020.0002] # BAMUM LETTER PHASE-A NGKUENZEUM -16817 ; [.38CE.0020.0002] # BAMUM LETTER PHASE-A LAPAQ -16818 ; [.38CF.0020.0002] # BAMUM LETTER PHASE-A LET KUT -16819 ; [.38D0.0020.0002] # BAMUM LETTER PHASE-A NTAP MFAA -1681A ; [.38D1.0020.0002] # BAMUM LETTER PHASE-A MAEKEUP -1681B ; [.38D2.0020.0002] # BAMUM LETTER PHASE-A PASHAE -1681C ; [.38D3.0020.0002] # BAMUM LETTER PHASE-A GHEUAERAE -1681D ; [.38D4.0020.0002] # BAMUM LETTER PHASE-A PAMSHAE -1681E ; [.38D5.0020.0002] # BAMUM LETTER PHASE-A MON NGGEUAET -1681F ; [.38D6.0020.0002] # BAMUM LETTER PHASE-A NZUN MEUT -16820 ; [.38D7.0020.0002] # BAMUM LETTER PHASE-A U YUQ NAE -16821 ; [.38D8.0020.0002] # BAMUM LETTER PHASE-A GHEUAEGHEUAE -16822 ; [.38D9.0020.0002] # BAMUM LETTER PHASE-A NTAP NTAA -16823 ; [.38DA.0020.0002] # BAMUM LETTER PHASE-A SISA -16824 ; [.38DB.0020.0002] # BAMUM LETTER PHASE-A MGBASA -16825 ; [.38DC.0020.0002] # BAMUM LETTER PHASE-A MEUNJOMNDEUQ -16826 ; [.38DD.0020.0002] # BAMUM LETTER PHASE-A MOOMPUQ -16827 ; [.38DE.0020.0002] # BAMUM LETTER PHASE-A KAFA -16828 ; [.38DF.0020.0002] # BAMUM LETTER PHASE-A PA LEERAEWA -16829 ; [.38E0.0020.0002] # BAMUM LETTER PHASE-A NDA LEERAEWA -1682A ; [.38E1.0020.0002] # BAMUM LETTER PHASE-A PET -1682B ; [.38E2.0020.0002] # BAMUM LETTER PHASE-A MAEMKPEN -1682C ; [.38E3.0020.0002] # BAMUM LETTER PHASE-A NIKA -1682D ; [.38E4.0020.0002] # BAMUM LETTER PHASE-A PUP -1682E ; [.38E5.0020.0002] # BAMUM LETTER PHASE-A TUAEP -1682F ; [.38E6.0020.0002] # BAMUM LETTER PHASE-A LUAEP -16830 ; [.38E7.0020.0002] # BAMUM LETTER PHASE-A SONJAM -16831 ; [.38E8.0020.0002] # BAMUM LETTER PHASE-A TEUTEUWEN -16832 ; [.38E9.0020.0002] # BAMUM LETTER PHASE-A MAENYI -16833 ; [.38EA.0020.0002] # BAMUM LETTER PHASE-A KET -16834 ; [.38EB.0020.0002] # BAMUM LETTER PHASE-A NDAANGGEUAET -16835 ; [.38EC.0020.0002] # BAMUM LETTER PHASE-A KUOQ -16836 ; [.38ED.0020.0002] # BAMUM LETTER PHASE-A MOOMEUT -16837 ; [.38EE.0020.0002] # BAMUM LETTER PHASE-A SHUM -16838 ; [.38EF.0020.0002] # BAMUM LETTER PHASE-A LOMMAE -16839 ; [.38F0.0020.0002] # BAMUM LETTER PHASE-A FIRI -1683A ; [.38F1.0020.0002] # BAMUM LETTER PHASE-A ROM -1683B ; [.38F2.0020.0002] # BAMUM LETTER PHASE-A KPOQ -1683C ; [.38F3.0020.0002] # BAMUM LETTER PHASE-A SOQ -1683D ; [.38F4.0020.0002] # BAMUM LETTER PHASE-A MAP PIEET -1683E ; [.38F5.0020.0002] # BAMUM LETTER PHASE-A SHIRAE -1683F ; [.38F6.0020.0002] # BAMUM LETTER PHASE-A NTAP -16840 ; [.38F7.0020.0002] # BAMUM LETTER PHASE-A SHOQ NSHUT YUM -16841 ; [.38F8.0020.0002] # BAMUM LETTER PHASE-A NYIT MONGKEUAEQ -16842 ; [.38F9.0020.0002] # BAMUM LETTER PHASE-A PAARAE -16843 ; [.38FA.0020.0002] # BAMUM LETTER PHASE-A NKAARAE -16844 ; [.38FB.0020.0002] # BAMUM LETTER PHASE-A UNKNOWN -16845 ; [.38FC.0020.0002] # BAMUM LETTER PHASE-A NGGEN -16846 ; [.38FD.0020.0002] # BAMUM LETTER PHASE-A MAESI -16847 ; [.38FE.0020.0002] # BAMUM LETTER PHASE-A NJAM -16848 ; [.38FF.0020.0002] # BAMUM LETTER PHASE-A MBANYI -16849 ; [.3900.0020.0002] # BAMUM LETTER PHASE-A NYET -1684A ; [.3901.0020.0002] # BAMUM LETTER PHASE-A TEUAEN -1684B ; [.3902.0020.0002] # BAMUM LETTER PHASE-A SOT -1684C ; [.3903.0020.0002] # BAMUM LETTER PHASE-A PAAM -1684D ; [.3904.0020.0002] # BAMUM LETTER PHASE-A NSHIEE -1684E ; [.3905.0020.0002] # BAMUM LETTER PHASE-A MAEM -1684F ; [.3906.0020.0002] # BAMUM LETTER PHASE-A NYI -16850 ; [.3907.0020.0002] # BAMUM LETTER PHASE-A KAQ -16851 ; [.3908.0020.0002] # BAMUM LETTER PHASE-A NSHA -16852 ; [.3909.0020.0002] # BAMUM LETTER PHASE-A VEE -16853 ; [.390A.0020.0002] # BAMUM LETTER PHASE-A LU -16854 ; [.390B.0020.0002] # BAMUM LETTER PHASE-A NEN -16855 ; [.390C.0020.0002] # BAMUM LETTER PHASE-A NAQ -16856 ; [.390D.0020.0002] # BAMUM LETTER PHASE-A MBAQ -16857 ; [.390E.0020.0002] # BAMUM LETTER PHASE-B NSHUET -16858 ; [.390F.0020.0002] # BAMUM LETTER PHASE-B TU MAEMGBIEE -16859 ; [.3910.0020.0002] # BAMUM LETTER PHASE-B SIEE -1685A ; [.3911.0020.0002] # BAMUM LETTER PHASE-B SET TU -1685B ; [.3912.0020.0002] # BAMUM LETTER PHASE-B LOM NTEUM -1685C ; [.3913.0020.0002] # BAMUM LETTER PHASE-B MBA MAELEE -1685D ; [.3914.0020.0002] # BAMUM LETTER PHASE-B KIEEM -1685E ; [.3915.0020.0002] # BAMUM LETTER PHASE-B YEURAE -1685F ; [.3916.0020.0002] # BAMUM LETTER PHASE-B MBAARAE -16860 ; [.3917.0020.0002] # BAMUM LETTER PHASE-B KAM -16861 ; [.3918.0020.0002] # BAMUM LETTER PHASE-B PEESHI -16862 ; [.3919.0020.0002] # BAMUM LETTER PHASE-B YAFU LEERAEWA -16863 ; [.391A.0020.0002] # BAMUM LETTER PHASE-B LAM NSHUT NYAM -16864 ; [.391B.0020.0002] # BAMUM LETTER PHASE-B NTIEE SHEUOQ -16865 ; [.391C.0020.0002] # BAMUM LETTER PHASE-B NDU NJAA -16866 ; [.391D.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEUAEM -16867 ; [.391E.0020.0002] # BAMUM LETTER PHASE-B PIT -16868 ; [.391F.0020.0002] # BAMUM LETTER PHASE-B TU NSIEE -16869 ; [.3920.0020.0002] # BAMUM LETTER PHASE-B SHET NJAQ -1686A ; [.3921.0020.0002] # BAMUM LETTER PHASE-B SHEUAEQTU -1686B ; [.3922.0020.0002] # BAMUM LETTER PHASE-B MFON TEUAEQ -1686C ; [.3923.0020.0002] # BAMUM LETTER PHASE-B MBIT MBAAKET -1686D ; [.3924.0020.0002] # BAMUM LETTER PHASE-B NYI NTEUM -1686E ; [.3925.0020.0002] # BAMUM LETTER PHASE-B KEUPUQ -1686F ; [.3926.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEN -16870 ; [.3927.0020.0002] # BAMUM LETTER PHASE-B KEUYEUX -16871 ; [.3928.0020.0002] # BAMUM LETTER PHASE-B LAANAE -16872 ; [.3929.0020.0002] # BAMUM LETTER PHASE-B PARUM -16873 ; [.392A.0020.0002] # BAMUM LETTER PHASE-B VEUM -16874 ; [.392B.0020.0002] # BAMUM LETTER PHASE-B NGKINDI MVOP -16875 ; [.392C.0020.0002] # BAMUM LETTER PHASE-B NGGEU MBU -16876 ; [.392D.0020.0002] # BAMUM LETTER PHASE-B WUAET -16877 ; [.392E.0020.0002] # BAMUM LETTER PHASE-B SAKEUAE -16878 ; [.392F.0020.0002] # BAMUM LETTER PHASE-B TAAM -16879 ; [.3930.0020.0002] # BAMUM LETTER PHASE-B MEUQ -1687A ; [.3931.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ -1687B ; [.3932.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ LARGE -1687C ; [.3933.0020.0002] # BAMUM LETTER PHASE-B MFIYAQ -1687D ; [.3934.0020.0002] # BAMUM LETTER PHASE-B SUE -1687E ; [.3935.0020.0002] # BAMUM LETTER PHASE-B MBEURI -1687F ; [.3936.0020.0002] # BAMUM LETTER PHASE-B MONTIEEN -16880 ; [.3937.0020.0002] # BAMUM LETTER PHASE-B NYAEMAE -16881 ; [.3938.0020.0002] # BAMUM LETTER PHASE-B PUNGAAM -16882 ; [.3939.0020.0002] # BAMUM LETTER PHASE-B MEUT NGGEET -16883 ; [.393A.0020.0002] # BAMUM LETTER PHASE-B FEUX -16884 ; [.393B.0020.0002] # BAMUM LETTER PHASE-B MBUOQ -16885 ; [.393C.0020.0002] # BAMUM LETTER PHASE-B FEE -16886 ; [.393D.0020.0002] # BAMUM LETTER PHASE-B KEUAEM -16887 ; [.393E.0020.0002] # BAMUM LETTER PHASE-B MA NJEUAENA -16888 ; [.393F.0020.0002] # BAMUM LETTER PHASE-B MA NJUQA -16889 ; [.3940.0020.0002] # BAMUM LETTER PHASE-B LET -1688A ; [.3941.0020.0002] # BAMUM LETTER PHASE-B NGGAAM -1688B ; [.3942.0020.0002] # BAMUM LETTER PHASE-B NSEN -1688C ; [.3943.0020.0002] # BAMUM LETTER PHASE-B MA -1688D ; [.3944.0020.0002] # BAMUM LETTER PHASE-B KIQ -1688E ; [.3945.0020.0002] # BAMUM LETTER PHASE-B NGOM -1688F ; [.3946.0020.0002] # BAMUM LETTER PHASE-C NGKUE MAEMBA -16890 ; [.3947.0020.0002] # BAMUM LETTER PHASE-C NZA -16891 ; [.3948.0020.0002] # BAMUM LETTER PHASE-C YUM -16892 ; [.3949.0020.0002] # BAMUM LETTER PHASE-C WANGKUOQ -16893 ; [.394A.0020.0002] # BAMUM LETTER PHASE-C NGGEN -16894 ; [.394B.0020.0002] # BAMUM LETTER PHASE-C NDEUAEREE -16895 ; [.394C.0020.0002] # BAMUM LETTER PHASE-C NGKAQ -16896 ; [.394D.0020.0002] # BAMUM LETTER PHASE-C GHARAE -16897 ; [.394E.0020.0002] # BAMUM LETTER PHASE-C MBEEKEET -16898 ; [.394F.0020.0002] # BAMUM LETTER PHASE-C GBAYI -16899 ; [.3950.0020.0002] # BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN -1689A ; [.3951.0020.0002] # BAMUM LETTER PHASE-C NTU MBIT -1689B ; [.3952.0020.0002] # BAMUM LETTER PHASE-C MBEUM -1689C ; [.3953.0020.0002] # BAMUM LETTER PHASE-C PIRIEEN -1689D ; [.3954.0020.0002] # BAMUM LETTER PHASE-C NDOMBU -1689E ; [.3955.0020.0002] # BAMUM LETTER PHASE-C MBAA CABBAGE-TREE -1689F ; [.3956.0020.0002] # BAMUM LETTER PHASE-C KEUSHEUAEP -168A0 ; [.3957.0020.0002] # BAMUM LETTER PHASE-C GHAP -168A1 ; [.3958.0020.0002] # BAMUM LETTER PHASE-C KEUKAQ -168A2 ; [.3959.0020.0002] # BAMUM LETTER PHASE-C YU MUOMAE -168A3 ; [.395A.0020.0002] # BAMUM LETTER PHASE-C NZEUM -168A4 ; [.395B.0020.0002] # BAMUM LETTER PHASE-C MBUE -168A5 ; [.395C.0020.0002] # BAMUM LETTER PHASE-C NSEUAEN -168A6 ; [.395D.0020.0002] # BAMUM LETTER PHASE-C MBIT -168A7 ; [.395E.0020.0002] # BAMUM LETTER PHASE-C YEUQ -168A8 ; [.395F.0020.0002] # BAMUM LETTER PHASE-C KPARAQ -168A9 ; [.3960.0020.0002] # BAMUM LETTER PHASE-C KAA -168AA ; [.3961.0020.0002] # BAMUM LETTER PHASE-C SEUX -168AB ; [.3962.0020.0002] # BAMUM LETTER PHASE-C NDIDA -168AC ; [.3963.0020.0002] # BAMUM LETTER PHASE-C TAASHAE -168AD ; [.3964.0020.0002] # BAMUM LETTER PHASE-C NJUEQ -168AE ; [.3965.0020.0002] # BAMUM LETTER PHASE-C TITA YUE -168AF ; [.3966.0020.0002] # BAMUM LETTER PHASE-C SUAET -168B0 ; [.3967.0020.0002] # BAMUM LETTER PHASE-C NGGUAEN NYAM -168B1 ; [.3968.0020.0002] # BAMUM LETTER PHASE-C VEUX -168B2 ; [.3969.0020.0002] # BAMUM LETTER PHASE-C NANSANAQ -168B3 ; [.396A.0020.0002] # BAMUM LETTER PHASE-C MA KEUAERI -168B4 ; [.396B.0020.0002] # BAMUM LETTER PHASE-C NTAA -168B5 ; [.396C.0020.0002] # BAMUM LETTER PHASE-C NGGUON -168B6 ; [.396D.0020.0002] # BAMUM LETTER PHASE-C LAP -168B7 ; [.396E.0020.0002] # BAMUM LETTER PHASE-C MBIRIEEN -168B8 ; [.396F.0020.0002] # BAMUM LETTER PHASE-C MGBASAQ -168B9 ; [.3970.0020.0002] # BAMUM LETTER PHASE-C NTEUNGBA -168BA ; [.3971.0020.0002] # BAMUM LETTER PHASE-C TEUTEUX -168BB ; [.3972.0020.0002] # BAMUM LETTER PHASE-C NGGUM -168BC ; [.3973.0020.0002] # BAMUM LETTER PHASE-C FUE -168BD ; [.3974.0020.0002] # BAMUM LETTER PHASE-C NDEUT -168BE ; [.3975.0020.0002] # BAMUM LETTER PHASE-C NSA -168BF ; [.3976.0020.0002] # BAMUM LETTER PHASE-C NSHAQ -168C0 ; [.3977.0020.0002] # BAMUM LETTER PHASE-C BUNG -168C1 ; [.3978.0020.0002] # BAMUM LETTER PHASE-C VEUAEPEN -168C2 ; [.3979.0020.0002] # BAMUM LETTER PHASE-C MBERAE -168C3 ; [.397A.0020.0002] # BAMUM LETTER PHASE-C RU -168C4 ; [.397B.0020.0002] # BAMUM LETTER PHASE-C NJAEM -168C5 ; [.397C.0020.0002] # BAMUM LETTER PHASE-C LAM -168C6 ; [.397D.0020.0002] # BAMUM LETTER PHASE-C TITUAEP -168C7 ; [.397E.0020.0002] # BAMUM LETTER PHASE-C NSUOT NGOM -168C8 ; [.397F.0020.0002] # BAMUM LETTER PHASE-C NJEEEE -168C9 ; [.3980.0020.0002] # BAMUM LETTER PHASE-C KET -168CA ; [.3981.0020.0002] # BAMUM LETTER PHASE-C NGGU -168CB ; [.3982.0020.0002] # BAMUM LETTER PHASE-C MAESI -168CC ; [.3983.0020.0002] # BAMUM LETTER PHASE-C MBUAEM -168CD ; [.3984.0020.0002] # BAMUM LETTER PHASE-C LU -168CE ; [.3985.0020.0002] # BAMUM LETTER PHASE-C KUT -168CF ; [.3986.0020.0002] # BAMUM LETTER PHASE-C NJAM -168D0 ; [.3987.0020.0002] # BAMUM LETTER PHASE-C NGOM -168D1 ; [.3988.0020.0002] # BAMUM LETTER PHASE-C WUP -168D2 ; [.3989.0020.0002] # BAMUM LETTER PHASE-C NGGUEET -168D3 ; [.398A.0020.0002] # BAMUM LETTER PHASE-C NSOM -168D4 ; [.398B.0020.0002] # BAMUM LETTER PHASE-C NTEN -168D5 ; [.398C.0020.0002] # BAMUM LETTER PHASE-C KUOP NKAARAE -168D6 ; [.398D.0020.0002] # BAMUM LETTER PHASE-C NSUN -168D7 ; [.398E.0020.0002] # BAMUM LETTER PHASE-C NDAM -168D8 ; [.398F.0020.0002] # BAMUM LETTER PHASE-C MA NSIEE -168D9 ; [.3990.0020.0002] # BAMUM LETTER PHASE-C YAA -168DA ; [.3991.0020.0002] # BAMUM LETTER PHASE-C NDAP -168DB ; [.3992.0020.0002] # BAMUM LETTER PHASE-C SHUEQ -168DC ; [.3993.0020.0002] # BAMUM LETTER PHASE-C SETFON -168DD ; [.3994.0020.0002] # BAMUM LETTER PHASE-C MBI -168DE ; [.3995.0020.0002] # BAMUM LETTER PHASE-C MAEMBA -168DF ; [.3996.0020.0002] # BAMUM LETTER PHASE-C MBANYI -168E0 ; [.3997.0020.0002] # BAMUM LETTER PHASE-C KEUSEUX -168E1 ; [.3998.0020.0002] # BAMUM LETTER PHASE-C MBEUX -168E2 ; [.3999.0020.0002] # BAMUM LETTER PHASE-C KEUM -168E3 ; [.399A.0020.0002] # BAMUM LETTER PHASE-C MBAA PICKET -168E4 ; [.399B.0020.0002] # BAMUM LETTER PHASE-C YUWOQ -168E5 ; [.399C.0020.0002] # BAMUM LETTER PHASE-C NJEUX -168E6 ; [.399D.0020.0002] # BAMUM LETTER PHASE-C MIEE -168E7 ; [.399E.0020.0002] # BAMUM LETTER PHASE-C MUAE -168E8 ; [.399F.0020.0002] # BAMUM LETTER PHASE-C SHIQ -168E9 ; [.39A0.0020.0002] # BAMUM LETTER PHASE-C KEN LAW -168EA ; [.39A1.0020.0002] # BAMUM LETTER PHASE-C KEN FATIGUE -168EB ; [.39A2.0020.0002] # BAMUM LETTER PHASE-C NGAQ -168EC ; [.39A3.0020.0002] # BAMUM LETTER PHASE-C NAQ -168ED ; [.39A4.0020.0002] # BAMUM LETTER PHASE-C LIQ -168EE ; [.39A5.0020.0002] # BAMUM LETTER PHASE-C PIN -168EF ; [.39A6.0020.0002] # BAMUM LETTER PHASE-C PEN -168F0 ; [.39A7.0020.0002] # BAMUM LETTER PHASE-C TET -168F1 ; [.39A8.0020.0002] # BAMUM LETTER PHASE-D MBUO -168F2 ; [.39A9.0020.0002] # BAMUM LETTER PHASE-D WAP -168F3 ; [.39AA.0020.0002] # BAMUM LETTER PHASE-D NJI -168F4 ; [.39AB.0020.0002] # BAMUM LETTER PHASE-D MFON -168F5 ; [.39AC.0020.0002] # BAMUM LETTER PHASE-D NJIEE -168F6 ; [.39AD.0020.0002] # BAMUM LETTER PHASE-D LIEE -168F7 ; [.39AE.0020.0002] # BAMUM LETTER PHASE-D NJEUT -168F8 ; [.39AF.0020.0002] # BAMUM LETTER PHASE-D NSHEE -168F9 ; [.39B0.0020.0002] # BAMUM LETTER PHASE-D NGGAAMAE -168FA ; [.39B1.0020.0002] # BAMUM LETTER PHASE-D NYAM -168FB ; [.39B2.0020.0002] # BAMUM LETTER PHASE-D WUAEN -168FC ; [.39B3.0020.0002] # BAMUM LETTER PHASE-D NGKUN -168FD ; [.39B4.0020.0002] # BAMUM LETTER PHASE-D SHEE -168FE ; [.39B5.0020.0002] # BAMUM LETTER PHASE-D NGKAP -168FF ; [.39B6.0020.0002] # BAMUM LETTER PHASE-D KEUAETMEUN -16900 ; [.39B7.0020.0002] # BAMUM LETTER PHASE-D TEUT -16901 ; [.39B8.0020.0002] # BAMUM LETTER PHASE-D SHEUAE -16902 ; [.39B9.0020.0002] # BAMUM LETTER PHASE-D NJAP -16903 ; [.39BA.0020.0002] # BAMUM LETTER PHASE-D SUE -16904 ; [.39BB.0020.0002] # BAMUM LETTER PHASE-D KET -16905 ; [.39BC.0020.0002] # BAMUM LETTER PHASE-D YAEMMAE -16906 ; [.39BD.0020.0002] # BAMUM LETTER PHASE-D KUOM -16907 ; [.39BE.0020.0002] # BAMUM LETTER PHASE-D SAP -16908 ; [.39BF.0020.0002] # BAMUM LETTER PHASE-D MFEUT -16909 ; [.39C0.0020.0002] # BAMUM LETTER PHASE-D NDEUX -1690A ; [.39C1.0020.0002] # BAMUM LETTER PHASE-D MALEERI -1690B ; [.39C2.0020.0002] # BAMUM LETTER PHASE-D MEUT -1690C ; [.39C3.0020.0002] # BAMUM LETTER PHASE-D SEUAEQ -1690D ; [.39C4.0020.0002] # BAMUM LETTER PHASE-D YEN -1690E ; [.39C5.0020.0002] # BAMUM LETTER PHASE-D NJEUAEM -1690F ; [.39C6.0020.0002] # BAMUM LETTER PHASE-D KEUOT MBUAE -16910 ; [.39C7.0020.0002] # BAMUM LETTER PHASE-D NGKEURI -16911 ; [.39C8.0020.0002] # BAMUM LETTER PHASE-D TU -16912 ; [.39C9.0020.0002] # BAMUM LETTER PHASE-D GHAA -16913 ; [.39CA.0020.0002] # BAMUM LETTER PHASE-D NGKYEE -16914 ; [.39CB.0020.0002] # BAMUM LETTER PHASE-D FEUFEUAET -16915 ; [.39CC.0020.0002] # BAMUM LETTER PHASE-D NDEE -16916 ; [.39CD.0020.0002] # BAMUM LETTER PHASE-D MGBOFUM -16917 ; [.39CE.0020.0002] # BAMUM LETTER PHASE-D LEUAEP -16918 ; [.39CF.0020.0002] # BAMUM LETTER PHASE-D NDON -16919 ; [.39D0.0020.0002] # BAMUM LETTER PHASE-D MONI -1691A ; [.39D1.0020.0002] # BAMUM LETTER PHASE-D MGBEUN -1691B ; [.39D2.0020.0002] # BAMUM LETTER PHASE-D PUUT -1691C ; [.39D3.0020.0002] # BAMUM LETTER PHASE-D MGBIEE -1691D ; [.39D4.0020.0002] # BAMUM LETTER PHASE-D MFO -1691E ; [.39D5.0020.0002] # BAMUM LETTER PHASE-D LUM -1691F ; [.39D6.0020.0002] # BAMUM LETTER PHASE-D NSIEEP -16920 ; [.39D7.0020.0002] # BAMUM LETTER PHASE-D MBAA -16921 ; [.39D8.0020.0002] # BAMUM LETTER PHASE-D KWAET -16922 ; [.39D9.0020.0002] # BAMUM LETTER PHASE-D NYET -16923 ; [.39DA.0020.0002] # BAMUM LETTER PHASE-D TEUAEN -16924 ; [.39DB.0020.0002] # BAMUM LETTER PHASE-D SOT -16925 ; [.39DC.0020.0002] # BAMUM LETTER PHASE-D YUWOQ -16926 ; [.39DD.0020.0002] # BAMUM LETTER PHASE-D KEUM -16927 ; [.39DE.0020.0002] # BAMUM LETTER PHASE-D RAEM -16928 ; [.39DF.0020.0002] # BAMUM LETTER PHASE-D TEEEE -16929 ; [.39E0.0020.0002] # BAMUM LETTER PHASE-D NGKEUAEQ -1692A ; [.39E1.0020.0002] # BAMUM LETTER PHASE-D MFEUAE -1692B ; [.39E2.0020.0002] # BAMUM LETTER PHASE-D NSIEET -1692C ; [.39E3.0020.0002] # BAMUM LETTER PHASE-D KEUP -1692D ; [.39E4.0020.0002] # BAMUM LETTER PHASE-D PIP -1692E ; [.39E5.0020.0002] # BAMUM LETTER PHASE-D PEUTAE -1692F ; [.39E6.0020.0002] # BAMUM LETTER PHASE-D NYUE -16930 ; [.39E7.0020.0002] # BAMUM LETTER PHASE-D LET -16931 ; [.39E8.0020.0002] # BAMUM LETTER PHASE-D NGGAAM -16932 ; [.39E9.0020.0002] # BAMUM LETTER PHASE-D MFIEE -16933 ; [.39EA.0020.0002] # BAMUM LETTER PHASE-D NGGWAEN -16934 ; [.39EB.0020.0002] # BAMUM LETTER PHASE-D YUOM -16935 ; [.39EC.0020.0002] # BAMUM LETTER PHASE-D PAP -16936 ; [.39ED.0020.0002] # BAMUM LETTER PHASE-D YUOP -16937 ; [.39EE.0020.0002] # BAMUM LETTER PHASE-D NDAM -16938 ; [.39EF.0020.0002] # BAMUM LETTER PHASE-D NTEUM -16939 ; [.39F0.0020.0002] # BAMUM LETTER PHASE-D SUAE -1693A ; [.39F1.0020.0002] # BAMUM LETTER PHASE-D KUN -1693B ; [.39F2.0020.0002] # BAMUM LETTER PHASE-D NGGEUX -1693C ; [.39F3.0020.0002] # BAMUM LETTER PHASE-D NGKIEE -1693D ; [.39F4.0020.0002] # BAMUM LETTER PHASE-D TUOT -1693E ; [.39F5.0020.0002] # BAMUM LETTER PHASE-D MEUN -1693F ; [.39F6.0020.0002] # BAMUM LETTER PHASE-D KUQ -16940 ; [.39F7.0020.0002] # BAMUM LETTER PHASE-D NSUM -16941 ; [.39F8.0020.0002] # BAMUM LETTER PHASE-D TEUN -16942 ; [.39F9.0020.0002] # BAMUM LETTER PHASE-D MAENJET -16943 ; [.39FA.0020.0002] # BAMUM LETTER PHASE-D NGGAP -16944 ; [.39FB.0020.0002] # BAMUM LETTER PHASE-D LEUM -16945 ; [.39FC.0020.0002] # BAMUM LETTER PHASE-D NGGUOM -16946 ; [.39FD.0020.0002] # BAMUM LETTER PHASE-D NSHUT -16947 ; [.39FE.0020.0002] # BAMUM LETTER PHASE-D NJUEQ -16948 ; [.39FF.0020.0002] # BAMUM LETTER PHASE-D GHEUAE -16949 ; [.3A00.0020.0002] # BAMUM LETTER PHASE-D KU -1694A ; [.3A01.0020.0002] # BAMUM LETTER PHASE-D REN OLD -1694B ; [.3A02.0020.0002] # BAMUM LETTER PHASE-D TAE -1694C ; [.3A03.0020.0002] # BAMUM LETTER PHASE-D TOQ -1694D ; [.3A04.0020.0002] # BAMUM LETTER PHASE-D NYI -1694E ; [.3A05.0020.0002] # BAMUM LETTER PHASE-D RII -1694F ; [.3A06.0020.0002] # BAMUM LETTER PHASE-D LEEEE -16950 ; [.3A07.0020.0002] # BAMUM LETTER PHASE-D MEEEE -16951 ; [.3A08.0020.0002] # BAMUM LETTER PHASE-D M -16952 ; [.3A09.0020.0002] # BAMUM LETTER PHASE-D SUU -16953 ; [.3A0A.0020.0002] # BAMUM LETTER PHASE-D MU -16954 ; [.3A0B.0020.0002] # BAMUM LETTER PHASE-D SHII -16955 ; [.3A0C.0020.0002] # BAMUM LETTER PHASE-D SHEUX -16956 ; [.3A0D.0020.0002] # BAMUM LETTER PHASE-D KYEE -16957 ; [.3A0E.0020.0002] # BAMUM LETTER PHASE-D NU -16958 ; [.3A0F.0020.0002] # BAMUM LETTER PHASE-D SHU -16959 ; [.3A10.0020.0002] # BAMUM LETTER PHASE-D NTEE -1695A ; [.3A11.0020.0002] # BAMUM LETTER PHASE-D PEE -1695B ; [.3A12.0020.0002] # BAMUM LETTER PHASE-D NI -1695C ; [.3A13.0020.0002] # BAMUM LETTER PHASE-D SHOQ -1695D ; [.3A14.0020.0002] # BAMUM LETTER PHASE-D PUQ -1695E ; [.3A15.0020.0002] # BAMUM LETTER PHASE-D MVOP -1695F ; [.3A16.0020.0002] # BAMUM LETTER PHASE-D LOQ -16960 ; [.3A17.0020.0002] # BAMUM LETTER PHASE-D REN MUCH -16961 ; [.3A18.0020.0002] # BAMUM LETTER PHASE-D TI -16962 ; [.3A19.0020.0002] # BAMUM LETTER PHASE-D NTUU -16963 ; [.3A1A.0020.0002] # BAMUM LETTER PHASE-D MBAA SEVEN -16964 ; [.3A1B.0020.0002] # BAMUM LETTER PHASE-D SAQ -16965 ; [.3A1C.0020.0002] # BAMUM LETTER PHASE-D FAA -16966 ; [.3A1D.0020.0002] # BAMUM LETTER PHASE-E NDAP -16967 ; [.3A1E.0020.0002] # BAMUM LETTER PHASE-E TOON -16968 ; [.3A1F.0020.0002] # BAMUM LETTER PHASE-E MBEUM -16969 ; [.3A20.0020.0002] # BAMUM LETTER PHASE-E LAP -1696A ; [.3A21.0020.0002] # BAMUM LETTER PHASE-E VOM -1696B ; [.3A22.0020.0002] # BAMUM LETTER PHASE-E LOON -1696C ; [.3A23.0020.0002] # BAMUM LETTER PHASE-E PAA -1696D ; [.3A24.0020.0002] # BAMUM LETTER PHASE-E SOM -1696E ; [.3A25.0020.0002] # BAMUM LETTER PHASE-E RAQ -1696F ; [.3A26.0020.0002] # BAMUM LETTER PHASE-E NSHUOP -16970 ; [.3A27.0020.0002] # BAMUM LETTER PHASE-E NDUN -16971 ; [.3A28.0020.0002] # BAMUM LETTER PHASE-E PUAE -16972 ; [.3A29.0020.0002] # BAMUM LETTER PHASE-E TAM -16973 ; [.3A2A.0020.0002] # BAMUM LETTER PHASE-E NGKA -16974 ; [.3A2B.0020.0002] # BAMUM LETTER PHASE-E KPEUX -16975 ; [.3A2C.0020.0002] # BAMUM LETTER PHASE-E WUO -16976 ; [.3A2D.0020.0002] # BAMUM LETTER PHASE-E SEE -16977 ; [.3A2E.0020.0002] # BAMUM LETTER PHASE-E NGGEUAET -16978 ; [.3A2F.0020.0002] # BAMUM LETTER PHASE-E PAAM -16979 ; [.3A30.0020.0002] # BAMUM LETTER PHASE-E TOO -1697A ; [.3A31.0020.0002] # BAMUM LETTER PHASE-E KUOP -1697B ; [.3A32.0020.0002] # BAMUM LETTER PHASE-E LOM -1697C ; [.3A33.0020.0002] # BAMUM LETTER PHASE-E NSHIEE -1697D ; [.3A34.0020.0002] # BAMUM LETTER PHASE-E NGOP -1697E ; [.3A35.0020.0002] # BAMUM LETTER PHASE-E MAEM -1697F ; [.3A36.0020.0002] # BAMUM LETTER PHASE-E NGKEUX -16980 ; [.3A37.0020.0002] # BAMUM LETTER PHASE-E NGOQ -16981 ; [.3A38.0020.0002] # BAMUM LETTER PHASE-E NSHUE -16982 ; [.3A39.0020.0002] # BAMUM LETTER PHASE-E RIMGBA -16983 ; [.3A3A.0020.0002] # BAMUM LETTER PHASE-E NJEUX -16984 ; [.3A3B.0020.0002] # BAMUM LETTER PHASE-E PEEM -16985 ; [.3A3C.0020.0002] # BAMUM LETTER PHASE-E SAA -16986 ; [.3A3D.0020.0002] # BAMUM LETTER PHASE-E NGGURAE -16987 ; [.3A3E.0020.0002] # BAMUM LETTER PHASE-E MGBA -16988 ; [.3A3F.0020.0002] # BAMUM LETTER PHASE-E GHEUX -16989 ; [.3A40.0020.0002] # BAMUM LETTER PHASE-E NGKEUAEM -1698A ; [.3A41.0020.0002] # BAMUM LETTER PHASE-E NJAEMLI -1698B ; [.3A42.0020.0002] # BAMUM LETTER PHASE-E MAP -1698C ; [.3A43.0020.0002] # BAMUM LETTER PHASE-E LOOT -1698D ; [.3A44.0020.0002] # BAMUM LETTER PHASE-E NGGEEEE -1698E ; [.3A45.0020.0002] # BAMUM LETTER PHASE-E NDIQ -1698F ; [.3A46.0020.0002] # BAMUM LETTER PHASE-E TAEN NTEUM -16990 ; [.3A47.0020.0002] # BAMUM LETTER PHASE-E SET -16991 ; [.3A48.0020.0002] # BAMUM LETTER PHASE-E PUM -16992 ; [.3A49.0020.0002] # BAMUM LETTER PHASE-E NDAA SOFTNESS -16993 ; [.3A4A.0020.0002] # BAMUM LETTER PHASE-E NGGUAESHAE NYAM -16994 ; [.3A4B.0020.0002] # BAMUM LETTER PHASE-E YIEE -16995 ; [.3A4C.0020.0002] # BAMUM LETTER PHASE-E GHEUN -16996 ; [.3A4D.0020.0002] # BAMUM LETTER PHASE-E TUAE -16997 ; [.3A4E.0020.0002] # BAMUM LETTER PHASE-E YEUAE -16998 ; [.3A4F.0020.0002] # BAMUM LETTER PHASE-E PO -16999 ; [.3A50.0020.0002] # BAMUM LETTER PHASE-E TUMAE -1699A ; [.3A51.0020.0002] # BAMUM LETTER PHASE-E KEUAE -1699B ; [.3A52.0020.0002] # BAMUM LETTER PHASE-E SUAEN -1699C ; [.3A53.0020.0002] # BAMUM LETTER PHASE-E TEUAEQ -1699D ; [.3A54.0020.0002] # BAMUM LETTER PHASE-E VEUAE -1699E ; [.3A55.0020.0002] # BAMUM LETTER PHASE-E WEUX -1699F ; [.3A56.0020.0002] # BAMUM LETTER PHASE-E LAAM -169A0 ; [.3A57.0020.0002] # BAMUM LETTER PHASE-E PU -169A1 ; [.3A58.0020.0002] # BAMUM LETTER PHASE-E TAAQ -169A2 ; [.3A59.0020.0002] # BAMUM LETTER PHASE-E GHAAMAE -169A3 ; [.3A5A.0020.0002] # BAMUM LETTER PHASE-E NGEUREUT -169A4 ; [.3A5B.0020.0002] # BAMUM LETTER PHASE-E SHEUAEQ -169A5 ; [.3A5C.0020.0002] # BAMUM LETTER PHASE-E MGBEN -169A6 ; [.3A5D.0020.0002] # BAMUM LETTER PHASE-E MBEE -169A7 ; [.3A5E.0020.0002] # BAMUM LETTER PHASE-E NZAQ -169A8 ; [.3A5F.0020.0002] # BAMUM LETTER PHASE-E NKOM -169A9 ; [.3A60.0020.0002] # BAMUM LETTER PHASE-E GBET -169AA ; [.3A61.0020.0002] # BAMUM LETTER PHASE-E TUM -169AB ; [.3A62.0020.0002] # BAMUM LETTER PHASE-E KUET -169AC ; [.3A63.0020.0002] # BAMUM LETTER PHASE-E YAP -169AD ; [.3A64.0020.0002] # BAMUM LETTER PHASE-E NYI CLEAVER -169AE ; [.3A65.0020.0002] # BAMUM LETTER PHASE-E YIT -169AF ; [.3A66.0020.0002] # BAMUM LETTER PHASE-E MFEUQ -169B0 ; [.3A67.0020.0002] # BAMUM LETTER PHASE-E NDIAQ -169B1 ; [.3A68.0020.0002] # BAMUM LETTER PHASE-E PIEEQ -169B2 ; [.3A69.0020.0002] # BAMUM LETTER PHASE-E YUEQ -169B3 ; [.3A6A.0020.0002] # BAMUM LETTER PHASE-E LEUAEM -169B4 ; [.3A6B.0020.0002] # BAMUM LETTER PHASE-E FUE -169B5 ; [.3A6C.0020.0002] # BAMUM LETTER PHASE-E GBEUX -169B6 ; [.3A6D.0020.0002] # BAMUM LETTER PHASE-E NGKUP -169B7 ; [.3A6E.0020.0002] # BAMUM LETTER PHASE-E KET -169B8 ; [.3A6F.0020.0002] # BAMUM LETTER PHASE-E MAE -169B9 ; [.3A70.0020.0002] # BAMUM LETTER PHASE-E NGKAAMI -169BA ; [.3A71.0020.0002] # BAMUM LETTER PHASE-E GHET -169BB ; [.3A72.0020.0002] # BAMUM LETTER PHASE-E FA -169BC ; [.3A73.0020.0002] # BAMUM LETTER PHASE-E NTUM -169BD ; [.3A74.0020.0002] # BAMUM LETTER PHASE-E PEUT -169BE ; [.3A75.0020.0002] # BAMUM LETTER PHASE-E YEUM -169BF ; [.3A76.0020.0002] # BAMUM LETTER PHASE-E NGGEUAE -169C0 ; [.3A77.0020.0002] # BAMUM LETTER PHASE-E NYI BETWEEN -169C1 ; [.3A78.0020.0002] # BAMUM LETTER PHASE-E NZUQ -169C2 ; [.3A79.0020.0002] # BAMUM LETTER PHASE-E POON -169C3 ; [.3A7A.0020.0002] # BAMUM LETTER PHASE-E MIEE -169C4 ; [.3A7B.0020.0002] # BAMUM LETTER PHASE-E FUET -169C5 ; [.3A7C.0020.0002] # BAMUM LETTER PHASE-E NAE -169C6 ; [.3A7D.0020.0002] # BAMUM LETTER PHASE-E MUAE -169C7 ; [.3A7E.0020.0002] # BAMUM LETTER PHASE-E GHEUAE -169C8 ; [.3A7F.0020.0002] # BAMUM LETTER PHASE-E FU I -169C9 ; [.3A80.0020.0002] # BAMUM LETTER PHASE-E MVI -169CA ; [.3A81.0020.0002] # BAMUM LETTER PHASE-E PUAQ -169CB ; [.3A82.0020.0002] # BAMUM LETTER PHASE-E NGKUM -169CC ; [.3A83.0020.0002] # BAMUM LETTER PHASE-E KUT -169CD ; [.3A84.0020.0002] # BAMUM LETTER PHASE-E PIET -169CE ; [.3A85.0020.0002] # BAMUM LETTER PHASE-E NTAP -169CF ; [.3A86.0020.0002] # BAMUM LETTER PHASE-E YEUAET -169D0 ; [.3A87.0020.0002] # BAMUM LETTER PHASE-E NGGUP -169D1 ; [.3A88.0020.0002] # BAMUM LETTER PHASE-E PA PEOPLE -169D2 ; [.3A89.0020.0002] # BAMUM LETTER PHASE-E FU CALL -169D3 ; [.3A8A.0020.0002] # BAMUM LETTER PHASE-E FOM -169D4 ; [.3A8B.0020.0002] # BAMUM LETTER PHASE-E NJEE -169D5 ; [.3A8C.0020.0002] # BAMUM LETTER PHASE-E A -169D6 ; [.3A8D.0020.0002] # BAMUM LETTER PHASE-E TOQ -169D7 ; [.3A8E.0020.0002] # BAMUM LETTER PHASE-E O -169D8 ; [.3A8F.0020.0002] # BAMUM LETTER PHASE-E I -169D9 ; [.3A90.0020.0002] # BAMUM LETTER PHASE-E LAQ -169DA ; [.3A91.0020.0002] # BAMUM LETTER PHASE-E PA PLURAL -169DB ; [.3A92.0020.0002] # BAMUM LETTER PHASE-E TAA -169DC ; [.3A93.0020.0002] # BAMUM LETTER PHASE-E TAQ -169DD ; [.3A94.0020.0002] # BAMUM LETTER PHASE-E NDAA MY HOUSE -169DE ; [.3A95.0020.0002] # BAMUM LETTER PHASE-E SHIQ -169DF ; [.3A96.0020.0002] # BAMUM LETTER PHASE-E YEUX -169E0 ; [.3A97.0020.0002] # BAMUM LETTER PHASE-E NGUAE -169E1 ; [.3A98.0020.0002] # BAMUM LETTER PHASE-E YUAEN -169E2 ; [.3A99.0020.0002] # BAMUM LETTER PHASE-E YOQ SWIMMING -169E3 ; [.3A9A.0020.0002] # BAMUM LETTER PHASE-E YOQ COVER -169E4 ; [.3A9B.0020.0002] # BAMUM LETTER PHASE-E YUQ -169E5 ; [.3A9C.0020.0002] # BAMUM LETTER PHASE-E YUN -169E6 ; [.3A9D.0020.0002] # BAMUM LETTER PHASE-E KEUX -169E7 ; [.3A9E.0020.0002] # BAMUM LETTER PHASE-E PEUX -169E8 ; [.3A9F.0020.0002] # BAMUM LETTER PHASE-E NJEE EPOCH -169E9 ; [.3AA0.0020.0002] # BAMUM LETTER PHASE-E PUE -169EA ; [.3AA1.0020.0002] # BAMUM LETTER PHASE-E WUE -169EB ; [.3AA2.0020.0002] # BAMUM LETTER PHASE-E FEE -169EC ; [.3AA3.0020.0002] # BAMUM LETTER PHASE-E VEE -169ED ; [.3AA4.0020.0002] # BAMUM LETTER PHASE-E LU -169EE ; [.3AA5.0020.0002] # BAMUM LETTER PHASE-E MI -169EF ; [.3AA6.0020.0002] # BAMUM LETTER PHASE-E REUX -169F0 ; [.3AA7.0020.0002] # BAMUM LETTER PHASE-E RAE -169F1 ; [.3AA8.0020.0002] # BAMUM LETTER PHASE-E NGUAET -169F2 ; [.3AA9.0020.0002] # BAMUM LETTER PHASE-E NGA -169F3 ; [.3AAA.0020.0002] # BAMUM LETTER PHASE-E SHO -169F4 ; [.3AAB.0020.0002] # BAMUM LETTER PHASE-E SHOQ -169F5 ; [.3AAC.0020.0002] # BAMUM LETTER PHASE-E FU REMEDY -169F6 ; [.3AAD.0020.0002] # BAMUM LETTER PHASE-E NA -169F7 ; [.3AAE.0020.0002] # BAMUM LETTER PHASE-E PI -169F8 ; [.3AAF.0020.0002] # BAMUM LETTER PHASE-E LOQ -169F9 ; [.3AB0.0020.0002] # BAMUM LETTER PHASE-E KO -169FA ; [.3AB1.0020.0002] # BAMUM LETTER PHASE-E MEN -169FB ; [.3AB2.0020.0002] # BAMUM LETTER PHASE-E MA -169FC ; [.3AB3.0020.0002] # BAMUM LETTER PHASE-E MAQ -169FD ; [.3AB4.0020.0002] # BAMUM LETTER PHASE-E TEU -169FE ; [.3AB5.0020.0002] # BAMUM LETTER PHASE-E KI -169FF ; [.3AB6.0020.0002] # BAMUM LETTER PHASE-E MON -16A00 ; [.3AB7.0020.0002] # BAMUM LETTER PHASE-E TEN -16A01 ; [.3AB8.0020.0002] # BAMUM LETTER PHASE-E FAQ -16A02 ; [.3AB9.0020.0002] # BAMUM LETTER PHASE-E GHOM -16A03 ; [.3ABA.0020.0002] # BAMUM LETTER PHASE-F KA -16A04 ; [.3ABB.0020.0002] # BAMUM LETTER PHASE-F U -16A05 ; [.3ABC.0020.0002] # BAMUM LETTER PHASE-F KU -16A06 ; [.3ABD.0020.0002] # BAMUM LETTER PHASE-F EE -16A07 ; [.3ABE.0020.0002] # BAMUM LETTER PHASE-F REE -16A08 ; [.3ABF.0020.0002] # BAMUM LETTER PHASE-F TAE -16A09 ; [.3AC0.0020.0002] # BAMUM LETTER PHASE-F NYI -16A0A ; [.3AC1.0020.0002] # BAMUM LETTER PHASE-F LA -16A0B ; [.3AC2.0020.0002] # BAMUM LETTER PHASE-F RII -16A0C ; [.3AC3.0020.0002] # BAMUM LETTER PHASE-F RIEE -16A0D ; [.3AC4.0020.0002] # BAMUM LETTER PHASE-F MEEEE -16A0E ; [.3AC5.0020.0002] # BAMUM LETTER PHASE-F TAA -16A0F ; [.3AC6.0020.0002] # BAMUM LETTER PHASE-F NDAA -16A10 ; [.3AC7.0020.0002] # BAMUM LETTER PHASE-F NJAEM -16A11 ; [.3AC8.0020.0002] # BAMUM LETTER PHASE-F M -16A12 ; [.3AC9.0020.0002] # BAMUM LETTER PHASE-F SUU -16A13 ; [.3ACA.0020.0002] # BAMUM LETTER PHASE-F SHII -16A14 ; [.3ACB.0020.0002] # BAMUM LETTER PHASE-F SI -16A15 ; [.3ACC.0020.0002] # BAMUM LETTER PHASE-F SEUX -16A16 ; [.3ACD.0020.0002] # BAMUM LETTER PHASE-F KYEE -16A17 ; [.3ACE.0020.0002] # BAMUM LETTER PHASE-F KET -16A18 ; [.3ACF.0020.0002] # BAMUM LETTER PHASE-F NUAE -16A19 ; [.3AD0.0020.0002] # BAMUM LETTER PHASE-F NU -16A1A ; [.3AD1.0020.0002] # BAMUM LETTER PHASE-F NJUAE -16A1B ; [.3AD2.0020.0002] # BAMUM LETTER PHASE-F YOQ -16A1C ; [.3AD3.0020.0002] # BAMUM LETTER PHASE-F SHU -16A1D ; [.3AD4.0020.0002] # BAMUM LETTER PHASE-F YA -16A1E ; [.3AD5.0020.0002] # BAMUM LETTER PHASE-F NSHA -16A1F ; [.3AD6.0020.0002] # BAMUM LETTER PHASE-F PEUX -16A20 ; [.3AD7.0020.0002] # BAMUM LETTER PHASE-F NTEE -16A21 ; [.3AD8.0020.0002] # BAMUM LETTER PHASE-F WUE -16A22 ; [.3AD9.0020.0002] # BAMUM LETTER PHASE-F PEE -16A23 ; [.3ADA.0020.0002] # BAMUM LETTER PHASE-F RU -16A24 ; [.3ADB.0020.0002] # BAMUM LETTER PHASE-F NI -16A25 ; [.3ADC.0020.0002] # BAMUM LETTER PHASE-F REUX -16A26 ; [.3ADD.0020.0002] # BAMUM LETTER PHASE-F KEN -16A27 ; [.3ADE.0020.0002] # BAMUM LETTER PHASE-F NGKWAEN -16A28 ; [.3ADF.0020.0002] # BAMUM LETTER PHASE-F NGGA -16A29 ; [.3AE0.0020.0002] # BAMUM LETTER PHASE-F SHO -16A2A ; [.3AE1.0020.0002] # BAMUM LETTER PHASE-F PUAE -16A2B ; [.3AE2.0020.0002] # BAMUM LETTER PHASE-F FOM -16A2C ; [.3AE3.0020.0002] # BAMUM LETTER PHASE-F WA -16A2D ; [.3AE4.0020.0002] # BAMUM LETTER PHASE-F LI -16A2E ; [.3AE5.0020.0002] # BAMUM LETTER PHASE-F LOQ -16A2F ; [.3AE6.0020.0002] # BAMUM LETTER PHASE-F KO -16A30 ; [.3AE7.0020.0002] # BAMUM LETTER PHASE-F MBEN -16A31 ; [.3AE8.0020.0002] # BAMUM LETTER PHASE-F REN -16A32 ; [.3AE9.0020.0002] # BAMUM LETTER PHASE-F MA -16A33 ; [.3AEA.0020.0002] # BAMUM LETTER PHASE-F MO -16A34 ; [.3AEB.0020.0002] # BAMUM LETTER PHASE-F MBAA -16A35 ; [.3AEC.0020.0002] # BAMUM LETTER PHASE-F TET -16A36 ; [.3AED.0020.0002] # BAMUM LETTER PHASE-F KPA -16A37 ; [.3AEE.0020.0002] # BAMUM LETTER PHASE-F SAMBA -16A38 ; [.3AEF.0020.0002] # BAMUM LETTER PHASE-F VUEQ -16AD0 ; [.3AF0.0020.0002] # BASSA VAH LETTER ENNI -16AD1 ; [.3AF1.0020.0002] # BASSA VAH LETTER KA -16AD2 ; [.3AF2.0020.0002] # BASSA VAH LETTER SE -16AD3 ; [.3AF3.0020.0002] # BASSA VAH LETTER FA -16AD4 ; [.3AF4.0020.0002] # BASSA VAH LETTER MBE -16AD5 ; [.3AF5.0020.0002] # BASSA VAH LETTER YIE -16AD6 ; [.3AF6.0020.0002] # BASSA VAH LETTER GAH -16AD7 ; [.3AF7.0020.0002] # BASSA VAH LETTER DHII -16AD8 ; [.3AF8.0020.0002] # BASSA VAH LETTER KPAH -16AD9 ; [.3AF9.0020.0002] # BASSA VAH LETTER JO -16ADA ; [.3AFA.0020.0002] # BASSA VAH LETTER HWAH -16ADB ; [.3AFB.0020.0002] # BASSA VAH LETTER WA -16ADC ; [.3AFC.0020.0002] # BASSA VAH LETTER ZO -16ADD ; [.3AFD.0020.0002] # BASSA VAH LETTER GBU -16ADE ; [.3AFE.0020.0002] # BASSA VAH LETTER DO -16ADF ; [.3AFF.0020.0002] # BASSA VAH LETTER CE -16AE0 ; [.3B00.0020.0002] # BASSA VAH LETTER UWU -16AE1 ; [.3B01.0020.0002] # BASSA VAH LETTER TO -16AE2 ; [.3B02.0020.0002] # BASSA VAH LETTER BA -16AE3 ; [.3B03.0020.0002] # BASSA VAH LETTER VU -16AE4 ; [.3B04.0020.0002] # BASSA VAH LETTER YEIN -16AE5 ; [.3B05.0020.0002] # BASSA VAH LETTER PA -16AE6 ; [.3B06.0020.0002] # BASSA VAH LETTER WADDA -16AE7 ; [.3B07.0020.0002] # BASSA VAH LETTER A -16AE8 ; [.3B08.0020.0002] # BASSA VAH LETTER O -16AE9 ; [.3B09.0020.0002] # BASSA VAH LETTER OO -16AEA ; [.3B0A.0020.0002] # BASSA VAH LETTER U -16AEB ; [.3B0B.0020.0002] # BASSA VAH LETTER EE -16AEC ; [.3B0C.0020.0002] # BASSA VAH LETTER E -16AED ; [.3B0D.0020.0002] # BASSA VAH LETTER I -1E800 ; [.3B0E.0020.0002] # MENDE KIKAKUI SYLLABLE M001 KI -1E801 ; [.3B0F.0020.0002] # MENDE KIKAKUI SYLLABLE M002 KA -1E802 ; [.3B10.0020.0002] # MENDE KIKAKUI SYLLABLE M003 KU -1E803 ; [.3B11.0020.0002] # MENDE KIKAKUI SYLLABLE M065 KEE -1E804 ; [.3B12.0020.0002] # MENDE KIKAKUI SYLLABLE M095 KE -1E805 ; [.3B13.0020.0002] # MENDE KIKAKUI SYLLABLE M076 KOO -1E806 ; [.3B14.0020.0002] # MENDE KIKAKUI SYLLABLE M048 KO -1E807 ; [.3B15.0020.0002] # MENDE KIKAKUI SYLLABLE M179 KUA -1E808 ; [.3B16.0020.0002] # MENDE KIKAKUI SYLLABLE M004 WI -1E809 ; [.3B17.0020.0002] # MENDE KIKAKUI SYLLABLE M005 WA -1E80A ; [.3B18.0020.0002] # MENDE KIKAKUI SYLLABLE M006 WU -1E80B ; [.3B19.0020.0002] # MENDE KIKAKUI SYLLABLE M126 WEE -1E80C ; [.3B1A.0020.0002] # MENDE KIKAKUI SYLLABLE M118 WE -1E80D ; [.3B1B.0020.0002] # MENDE KIKAKUI SYLLABLE M114 WOO -1E80E ; [.3B1C.0020.0002] # MENDE KIKAKUI SYLLABLE M045 WO -1E80F ; [.3B1D.0020.0002] # MENDE KIKAKUI SYLLABLE M194 WUI -1E810 ; [.3B1E.0020.0002] # MENDE KIKAKUI SYLLABLE M143 WEI -1E811 ; [.3B1F.0020.0002] # MENDE KIKAKUI SYLLABLE M061 WVI -1E812 ; [.3B20.0020.0002] # MENDE KIKAKUI SYLLABLE M049 WVA -1E813 ; [.3B21.0020.0002] # MENDE KIKAKUI SYLLABLE M139 WVE -1E814 ; [.3B22.0020.0002] # MENDE KIKAKUI SYLLABLE M007 MIN -1E815 ; [.3B23.0020.0002] # MENDE KIKAKUI SYLLABLE M008 MAN -1E816 ; [.3B24.0020.0002] # MENDE KIKAKUI SYLLABLE M009 MUN -1E817 ; [.3B25.0020.0002] # MENDE KIKAKUI SYLLABLE M059 MEN -1E818 ; [.3B26.0020.0002] # MENDE KIKAKUI SYLLABLE M094 MON -1E819 ; [.3B27.0020.0002] # MENDE KIKAKUI SYLLABLE M154 MUAN -1E81A ; [.3B28.0020.0002] # MENDE KIKAKUI SYLLABLE M189 MUEN -1E81B ; [.3B29.0020.0002] # MENDE KIKAKUI SYLLABLE M010 BI -1E81C ; [.3B2A.0020.0002] # MENDE KIKAKUI SYLLABLE M011 BA -1E81D ; [.3B2B.0020.0002] # MENDE KIKAKUI SYLLABLE M012 BU -1E81E ; [.3B2C.0020.0002] # MENDE KIKAKUI SYLLABLE M150 BEE -1E81F ; [.3B2D.0020.0002] # MENDE KIKAKUI SYLLABLE M097 BE -1E820 ; [.3B2E.0020.0002] # MENDE KIKAKUI SYLLABLE M103 BOO -1E821 ; [.3B2F.0020.0002] # MENDE KIKAKUI SYLLABLE M138 BO -1E822 ; [.3B30.0020.0002] # MENDE KIKAKUI SYLLABLE M013 I -1E823 ; [.3B31.0020.0002] # MENDE KIKAKUI SYLLABLE M014 A -1E824 ; [.3B32.0020.0002] # MENDE KIKAKUI SYLLABLE M015 U -1E825 ; [.3B33.0020.0002] # MENDE KIKAKUI SYLLABLE M163 EE -1E826 ; [.3B34.0020.0002] # MENDE KIKAKUI SYLLABLE M100 E -1E827 ; [.3B35.0020.0002] # MENDE KIKAKUI SYLLABLE M165 OO -1E828 ; [.3B36.0020.0002] # MENDE KIKAKUI SYLLABLE M147 O -1E829 ; [.3B37.0020.0002] # MENDE KIKAKUI SYLLABLE M137 EI -1E82A ; [.3B38.0020.0002] # MENDE KIKAKUI SYLLABLE M131 IN -1E82B ; [.3B39.0020.0002] # MENDE KIKAKUI SYLLABLE M135 IN -1E82C ; [.3B3A.0020.0002] # MENDE KIKAKUI SYLLABLE M195 AN -1E82D ; [.3B3B.0020.0002] # MENDE KIKAKUI SYLLABLE M178 EN -1E82E ; [.3B3C.0020.0002] # MENDE KIKAKUI SYLLABLE M019 SI -1E82F ; [.3B3D.0020.0002] # MENDE KIKAKUI SYLLABLE M020 SA -1E830 ; [.3B3E.0020.0002] # MENDE KIKAKUI SYLLABLE M021 SU -1E831 ; [.3B3F.0020.0002] # MENDE KIKAKUI SYLLABLE M162 SEE -1E832 ; [.3B40.0020.0002] # MENDE KIKAKUI SYLLABLE M116 SE -1E833 ; [.3B41.0020.0002] # MENDE KIKAKUI SYLLABLE M136 SOO -1E834 ; [.3B42.0020.0002] # MENDE KIKAKUI SYLLABLE M079 SO -1E835 ; [.3B43.0020.0002] # MENDE KIKAKUI SYLLABLE M196 SIA -1E836 ; [.3B44.0020.0002] # MENDE KIKAKUI SYLLABLE M025 LI -1E837 ; [.3B45.0020.0002] # MENDE KIKAKUI SYLLABLE M026 LA -1E838 ; [.3B46.0020.0002] # MENDE KIKAKUI SYLLABLE M027 LU -1E839 ; [.3B47.0020.0002] # MENDE KIKAKUI SYLLABLE M084 LEE -1E83A ; [.3B48.0020.0002] # MENDE KIKAKUI SYLLABLE M073 LE -1E83B ; [.3B49.0020.0002] # MENDE KIKAKUI SYLLABLE M054 LOO -1E83C ; [.3B4A.0020.0002] # MENDE KIKAKUI SYLLABLE M153 LO -1E83D ; [.3B4B.0020.0002] # MENDE KIKAKUI SYLLABLE M110 LONG LE -1E83E ; [.3B4C.0020.0002] # MENDE KIKAKUI SYLLABLE M016 DI -1E83F ; [.3B4D.0020.0002] # MENDE KIKAKUI SYLLABLE M017 DA -1E840 ; [.3B4E.0020.0002] # MENDE KIKAKUI SYLLABLE M018 DU -1E841 ; [.3B4F.0020.0002] # MENDE KIKAKUI SYLLABLE M089 DEE -1E842 ; [.3B50.0020.0002] # MENDE KIKAKUI SYLLABLE M180 DOO -1E843 ; [.3B51.0020.0002] # MENDE KIKAKUI SYLLABLE M181 DO -1E844 ; [.3B52.0020.0002] # MENDE KIKAKUI SYLLABLE M022 TI -1E845 ; [.3B53.0020.0002] # MENDE KIKAKUI SYLLABLE M023 TA -1E846 ; [.3B54.0020.0002] # MENDE KIKAKUI SYLLABLE M024 TU -1E847 ; [.3B55.0020.0002] # MENDE KIKAKUI SYLLABLE M091 TEE -1E848 ; [.3B56.0020.0002] # MENDE KIKAKUI SYLLABLE M055 TE -1E849 ; [.3B57.0020.0002] # MENDE KIKAKUI SYLLABLE M104 TOO -1E84A ; [.3B58.0020.0002] # MENDE KIKAKUI SYLLABLE M069 TO -1E84B ; [.3B59.0020.0002] # MENDE KIKAKUI SYLLABLE M028 JI -1E84C ; [.3B5A.0020.0002] # MENDE KIKAKUI SYLLABLE M029 JA -1E84D ; [.3B5B.0020.0002] # MENDE KIKAKUI SYLLABLE M030 JU -1E84E ; [.3B5C.0020.0002] # MENDE KIKAKUI SYLLABLE M157 JEE -1E84F ; [.3B5D.0020.0002] # MENDE KIKAKUI SYLLABLE M113 JE -1E850 ; [.3B5E.0020.0002] # MENDE KIKAKUI SYLLABLE M160 JOO -1E851 ; [.3B5F.0020.0002] # MENDE KIKAKUI SYLLABLE M063 JO -1E852 ; [.3B60.0020.0002] # MENDE KIKAKUI SYLLABLE M175 LONG JO -1E853 ; [.3B61.0020.0002] # MENDE KIKAKUI SYLLABLE M031 YI -1E854 ; [.3B62.0020.0002] # MENDE KIKAKUI SYLLABLE M032 YA -1E855 ; [.3B63.0020.0002] # MENDE KIKAKUI SYLLABLE M033 YU -1E856 ; [.3B64.0020.0002] # MENDE KIKAKUI SYLLABLE M109 YEE -1E857 ; [.3B65.0020.0002] # MENDE KIKAKUI SYLLABLE M080 YE -1E858 ; [.3B66.0020.0002] # MENDE KIKAKUI SYLLABLE M141 YOO -1E859 ; [.3B67.0020.0002] # MENDE KIKAKUI SYLLABLE M121 YO -1E85A ; [.3B68.0020.0002] # MENDE KIKAKUI SYLLABLE M034 FI -1E85B ; [.3B69.0020.0002] # MENDE KIKAKUI SYLLABLE M035 FA -1E85C ; [.3B6A.0020.0002] # MENDE KIKAKUI SYLLABLE M036 FU -1E85D ; [.3B6B.0020.0002] # MENDE KIKAKUI SYLLABLE M078 FEE -1E85E ; [.3B6C.0020.0002] # MENDE KIKAKUI SYLLABLE M075 FE -1E85F ; [.3B6D.0020.0002] # MENDE KIKAKUI SYLLABLE M133 FOO -1E860 ; [.3B6E.0020.0002] # MENDE KIKAKUI SYLLABLE M088 FO -1E861 ; [.3B6F.0020.0002] # MENDE KIKAKUI SYLLABLE M197 FUA -1E862 ; [.3B70.0020.0002] # MENDE KIKAKUI SYLLABLE M101 FAN -1E863 ; [.3B71.0020.0002] # MENDE KIKAKUI SYLLABLE M037 NIN -1E864 ; [.3B72.0020.0002] # MENDE KIKAKUI SYLLABLE M038 NAN -1E865 ; [.3B73.0020.0002] # MENDE KIKAKUI SYLLABLE M039 NUN -1E866 ; [.3B74.0020.0002] # MENDE KIKAKUI SYLLABLE M117 NEN -1E867 ; [.3B75.0020.0002] # MENDE KIKAKUI SYLLABLE M169 NON -1E868 ; [.3B76.0020.0002] # MENDE KIKAKUI SYLLABLE M176 HI -1E869 ; [.3B77.0020.0002] # MENDE KIKAKUI SYLLABLE M041 HA -1E86A ; [.3B78.0020.0002] # MENDE KIKAKUI SYLLABLE M186 HU -1E86B ; [.3B79.0020.0002] # MENDE KIKAKUI SYLLABLE M040 HEE -1E86C ; [.3B7A.0020.0002] # MENDE KIKAKUI SYLLABLE M096 HE -1E86D ; [.3B7B.0020.0002] # MENDE KIKAKUI SYLLABLE M042 HOO -1E86E ; [.3B7C.0020.0002] # MENDE KIKAKUI SYLLABLE M140 HO -1E86F ; [.3B7D.0020.0002] # MENDE KIKAKUI SYLLABLE M083 HEEI -1E870 ; [.3B7E.0020.0002] # MENDE KIKAKUI SYLLABLE M128 HOOU -1E871 ; [.3B7F.0020.0002] # MENDE KIKAKUI SYLLABLE M053 HIN -1E872 ; [.3B80.0020.0002] # MENDE KIKAKUI SYLLABLE M130 HAN -1E873 ; [.3B81.0020.0002] # MENDE KIKAKUI SYLLABLE M087 HUN -1E874 ; [.3B82.0020.0002] # MENDE KIKAKUI SYLLABLE M052 HEN -1E875 ; [.3B83.0020.0002] # MENDE KIKAKUI SYLLABLE M193 HON -1E876 ; [.3B84.0020.0002] # MENDE KIKAKUI SYLLABLE M046 HUAN -1E877 ; [.3B85.0020.0002] # MENDE KIKAKUI SYLLABLE M090 NGGI -1E878 ; [.3B86.0020.0002] # MENDE KIKAKUI SYLLABLE M043 NGGA -1E879 ; [.3B87.0020.0002] # MENDE KIKAKUI SYLLABLE M082 NGGU -1E87A ; [.3B88.0020.0002] # MENDE KIKAKUI SYLLABLE M115 NGGEE -1E87B ; [.3B89.0020.0002] # MENDE KIKAKUI SYLLABLE M146 NGGE -1E87C ; [.3B8A.0020.0002] # MENDE KIKAKUI SYLLABLE M156 NGGOO -1E87D ; [.3B8B.0020.0002] # MENDE KIKAKUI SYLLABLE M120 NGGO -1E87E ; [.3B8C.0020.0002] # MENDE KIKAKUI SYLLABLE M159 NGGAA -1E87F ; [.3B8D.0020.0002] # MENDE KIKAKUI SYLLABLE M127 NGGUA -1E880 ; [.3B8E.0020.0002] # MENDE KIKAKUI SYLLABLE M086 LONG NGGE -1E881 ; [.3B8F.0020.0002] # MENDE KIKAKUI SYLLABLE M106 LONG NGGOO -1E882 ; [.3B90.0020.0002] # MENDE KIKAKUI SYLLABLE M183 LONG NGGO -1E883 ; [.3B91.0020.0002] # MENDE KIKAKUI SYLLABLE M155 GI -1E884 ; [.3B92.0020.0002] # MENDE KIKAKUI SYLLABLE M111 GA -1E885 ; [.3B93.0020.0002] # MENDE KIKAKUI SYLLABLE M168 GU -1E886 ; [.3B94.0020.0002] # MENDE KIKAKUI SYLLABLE M190 GEE -1E887 ; [.3B95.0020.0002] # MENDE KIKAKUI SYLLABLE M166 GUEI -1E888 ; [.3B96.0020.0002] # MENDE KIKAKUI SYLLABLE M167 GUAN -1E889 ; [.3B97.0020.0002] # MENDE KIKAKUI SYLLABLE M184 NGEN -1E88A ; [.3B98.0020.0002] # MENDE KIKAKUI SYLLABLE M057 NGON -1E88B ; [.3B99.0020.0002] # MENDE KIKAKUI SYLLABLE M177 NGUAN -1E88C ; [.3B9A.0020.0002] # MENDE KIKAKUI SYLLABLE M068 PI -1E88D ; [.3B9B.0020.0002] # MENDE KIKAKUI SYLLABLE M099 PA -1E88E ; [.3B9C.0020.0002] # MENDE KIKAKUI SYLLABLE M050 PU -1E88F ; [.3B9D.0020.0002] # MENDE KIKAKUI SYLLABLE M081 PEE -1E890 ; [.3B9E.0020.0002] # MENDE KIKAKUI SYLLABLE M051 PE -1E891 ; [.3B9F.0020.0002] # MENDE KIKAKUI SYLLABLE M102 POO -1E892 ; [.3BA0.0020.0002] # MENDE KIKAKUI SYLLABLE M066 PO -1E893 ; [.3BA1.0020.0002] # MENDE KIKAKUI SYLLABLE M145 MBI -1E894 ; [.3BA2.0020.0002] # MENDE KIKAKUI SYLLABLE M062 MBA -1E895 ; [.3BA3.0020.0002] # MENDE KIKAKUI SYLLABLE M122 MBU -1E896 ; [.3BA4.0020.0002] # MENDE KIKAKUI SYLLABLE M047 MBEE -1E897 ; [.3BA5.0020.0002] # MENDE KIKAKUI SYLLABLE M188 MBEE -1E898 ; [.3BA6.0020.0002] # MENDE KIKAKUI SYLLABLE M072 MBE -1E899 ; [.3BA7.0020.0002] # MENDE KIKAKUI SYLLABLE M172 MBOO -1E89A ; [.3BA8.0020.0002] # MENDE KIKAKUI SYLLABLE M174 MBO -1E89B ; [.3BA9.0020.0002] # MENDE KIKAKUI SYLLABLE M187 MBUU -1E89C ; [.3BAA.0020.0002] # MENDE KIKAKUI SYLLABLE M161 LONG MBE -1E89D ; [.3BAB.0020.0002] # MENDE KIKAKUI SYLLABLE M105 LONG MBOO -1E89E ; [.3BAC.0020.0002] # MENDE KIKAKUI SYLLABLE M142 LONG MBO -1E89F ; [.3BAD.0020.0002] # MENDE KIKAKUI SYLLABLE M132 KPI -1E8A0 ; [.3BAE.0020.0002] # MENDE KIKAKUI SYLLABLE M092 KPA -1E8A1 ; [.3BAF.0020.0002] # MENDE KIKAKUI SYLLABLE M074 KPU -1E8A2 ; [.3BB0.0020.0002] # MENDE KIKAKUI SYLLABLE M044 KPEE -1E8A3 ; [.3BB1.0020.0002] # MENDE KIKAKUI SYLLABLE M108 KPE -1E8A4 ; [.3BB2.0020.0002] # MENDE KIKAKUI SYLLABLE M112 KPOO -1E8A5 ; [.3BB3.0020.0002] # MENDE KIKAKUI SYLLABLE M158 KPO -1E8A6 ; [.3BB4.0020.0002] # MENDE KIKAKUI SYLLABLE M124 GBI -1E8A7 ; [.3BB5.0020.0002] # MENDE KIKAKUI SYLLABLE M056 GBA -1E8A8 ; [.3BB6.0020.0002] # MENDE KIKAKUI SYLLABLE M148 GBU -1E8A9 ; [.3BB7.0020.0002] # MENDE KIKAKUI SYLLABLE M093 GBEE -1E8AA ; [.3BB8.0020.0002] # MENDE KIKAKUI SYLLABLE M107 GBE -1E8AB ; [.3BB9.0020.0002] # MENDE KIKAKUI SYLLABLE M071 GBOO -1E8AC ; [.3BBA.0020.0002] # MENDE KIKAKUI SYLLABLE M070 GBO -1E8AD ; [.3BBB.0020.0002] # MENDE KIKAKUI SYLLABLE M171 RA -1E8AE ; [.3BBC.0020.0002] # MENDE KIKAKUI SYLLABLE M123 NDI -1E8AF ; [.3BBD.0020.0002] # MENDE KIKAKUI SYLLABLE M129 NDA -1E8B0 ; [.3BBE.0020.0002] # MENDE KIKAKUI SYLLABLE M125 NDU -1E8B1 ; [.3BBF.0020.0002] # MENDE KIKAKUI SYLLABLE M191 NDEE -1E8B2 ; [.3BC0.0020.0002] # MENDE KIKAKUI SYLLABLE M119 NDE -1E8B3 ; [.3BC1.0020.0002] # MENDE KIKAKUI SYLLABLE M067 NDOO -1E8B4 ; [.3BC2.0020.0002] # MENDE KIKAKUI SYLLABLE M064 NDO -1E8B5 ; [.3BC3.0020.0002] # MENDE KIKAKUI SYLLABLE M152 NJA -1E8B6 ; [.3BC4.0020.0002] # MENDE KIKAKUI SYLLABLE M192 NJU -1E8B7 ; [.3BC5.0020.0002] # MENDE KIKAKUI SYLLABLE M149 NJEE -1E8B8 ; [.3BC6.0020.0002] # MENDE KIKAKUI SYLLABLE M134 NJOO -1E8B9 ; [.3BC7.0020.0002] # MENDE KIKAKUI SYLLABLE M182 VI -1E8BA ; [.3BC8.0020.0002] # MENDE KIKAKUI SYLLABLE M185 VA -1E8BB ; [.3BC9.0020.0002] # MENDE KIKAKUI SYLLABLE M151 VU -1E8BC ; [.3BCA.0020.0002] # MENDE KIKAKUI SYLLABLE M173 VEE -1E8BD ; [.3BCB.0020.0002] # MENDE KIKAKUI SYLLABLE M085 VE -1E8BE ; [.3BCC.0020.0002] # MENDE KIKAKUI SYLLABLE M144 VOO -1E8BF ; [.3BCD.0020.0002] # MENDE KIKAKUI SYLLABLE M077 VO -1E8C0 ; [.3BCE.0020.0002] # MENDE KIKAKUI SYLLABLE M164 NYIN -1E8C1 ; [.3BCF.0020.0002] # MENDE KIKAKUI SYLLABLE M058 NYAN -1E8C2 ; [.3BD0.0020.0002] # MENDE KIKAKUI SYLLABLE M170 NYUN -1E8C3 ; [.3BD1.0020.0002] # MENDE KIKAKUI SYLLABLE M098 NYEN -1E8C4 ; [.3BD2.0020.0002] # MENDE KIKAKUI SYLLABLE M060 NYON -1E922 ; [.3BD3.0020.0002] # ADLAM SMALL LETTER ALIF -1E900 ; [.3BD3.0020.0008] # ADLAM CAPITAL LETTER ALIF -1E923 ; [.3BD4.0020.0002] # ADLAM SMALL LETTER DAALI -1E901 ; [.3BD4.0020.0008] # ADLAM CAPITAL LETTER DAALI -1E924 ; [.3BD5.0020.0002] # ADLAM SMALL LETTER LAAM -1E902 ; [.3BD5.0020.0008] # ADLAM CAPITAL LETTER LAAM -1E925 ; [.3BD6.0020.0002] # ADLAM SMALL LETTER MIIM -1E903 ; [.3BD6.0020.0008] # ADLAM CAPITAL LETTER MIIM -1E926 ; [.3BD7.0020.0002] # ADLAM SMALL LETTER BA -1E904 ; [.3BD7.0020.0008] # ADLAM CAPITAL LETTER BA -1E927 ; [.3BD8.0020.0002] # ADLAM SMALL LETTER SINNYIIYHE -1E905 ; [.3BD8.0020.0008] # ADLAM CAPITAL LETTER SINNYIIYHE -1E928 ; [.3BD9.0020.0002] # ADLAM SMALL LETTER PE -1E906 ; [.3BD9.0020.0008] # ADLAM CAPITAL LETTER PE -1E929 ; [.3BDA.0020.0002] # ADLAM SMALL LETTER BHE -1E907 ; [.3BDA.0020.0008] # ADLAM CAPITAL LETTER BHE -1E92A ; [.3BDB.0020.0002] # ADLAM SMALL LETTER RA -1E908 ; [.3BDB.0020.0008] # ADLAM CAPITAL LETTER RA -1E92B ; [.3BDC.0020.0002] # ADLAM SMALL LETTER E -1E909 ; [.3BDC.0020.0008] # ADLAM CAPITAL LETTER E -1E92C ; [.3BDD.0020.0002] # ADLAM SMALL LETTER FA -1E90A ; [.3BDD.0020.0008] # ADLAM CAPITAL LETTER FA -1E92D ; [.3BDE.0020.0002] # ADLAM SMALL LETTER I -1E90B ; [.3BDE.0020.0008] # ADLAM CAPITAL LETTER I -1E92E ; [.3BDF.0020.0002] # ADLAM SMALL LETTER O -1E90C ; [.3BDF.0020.0008] # ADLAM CAPITAL LETTER O -1E92F ; [.3BE0.0020.0002] # ADLAM SMALL LETTER DHA -1E90D ; [.3BE0.0020.0008] # ADLAM CAPITAL LETTER DHA -1E930 ; [.3BE1.0020.0002] # ADLAM SMALL LETTER YHE -1E90E ; [.3BE1.0020.0008] # ADLAM CAPITAL LETTER YHE -1E931 ; [.3BE2.0020.0002] # ADLAM SMALL LETTER WAW -1E90F ; [.3BE2.0020.0008] # ADLAM CAPITAL LETTER WAW -1E932 ; [.3BE3.0020.0002] # ADLAM SMALL LETTER NUN -1E910 ; [.3BE3.0020.0008] # ADLAM CAPITAL LETTER NUN -1E933 ; [.3BE4.0020.0002] # ADLAM SMALL LETTER KAF -1E911 ; [.3BE4.0020.0008] # ADLAM CAPITAL LETTER KAF -1E934 ; [.3BE5.0020.0002] # ADLAM SMALL LETTER YA -1E912 ; [.3BE5.0020.0008] # ADLAM CAPITAL LETTER YA -1E935 ; [.3BE6.0020.0002] # ADLAM SMALL LETTER U -1E913 ; [.3BE6.0020.0008] # ADLAM CAPITAL LETTER U -1E936 ; [.3BE7.0020.0002] # ADLAM SMALL LETTER JIIM -1E914 ; [.3BE7.0020.0008] # ADLAM CAPITAL LETTER JIIM -1E937 ; [.3BE8.0020.0002] # ADLAM SMALL LETTER CHI -1E915 ; [.3BE8.0020.0008] # ADLAM CAPITAL LETTER CHI -1E938 ; [.3BE9.0020.0002] # ADLAM SMALL LETTER HA -1E916 ; [.3BE9.0020.0008] # ADLAM CAPITAL LETTER HA -1E939 ; [.3BEA.0020.0002] # ADLAM SMALL LETTER QAAF -1E917 ; [.3BEA.0020.0008] # ADLAM CAPITAL LETTER QAAF -1E93A ; [.3BEB.0020.0002] # ADLAM SMALL LETTER GA -1E918 ; [.3BEB.0020.0008] # ADLAM CAPITAL LETTER GA -1E93B ; [.3BEC.0020.0002] # ADLAM SMALL LETTER NYA -1E919 ; [.3BEC.0020.0008] # ADLAM CAPITAL LETTER NYA -1E93C ; [.3BED.0020.0002] # ADLAM SMALL LETTER TU -1E91A ; [.3BED.0020.0008] # ADLAM CAPITAL LETTER TU -1E93D ; [.3BEE.0020.0002] # ADLAM SMALL LETTER NHA -1E91B ; [.3BEE.0020.0008] # ADLAM CAPITAL LETTER NHA -1E93E ; [.3BEF.0020.0002] # ADLAM SMALL LETTER VA -1E91C ; [.3BEF.0020.0008] # ADLAM CAPITAL LETTER VA -1E93F ; [.3BF0.0020.0002] # ADLAM SMALL LETTER KHA -1E91D ; [.3BF0.0020.0008] # ADLAM CAPITAL LETTER KHA -1E940 ; [.3BF1.0020.0002] # ADLAM SMALL LETTER GBE -1E91E ; [.3BF1.0020.0008] # ADLAM CAPITAL LETTER GBE -1E941 ; [.3BF2.0020.0002] # ADLAM SMALL LETTER ZAL -1E91F ; [.3BF2.0020.0008] # ADLAM CAPITAL LETTER ZAL -1E942 ; [.3BF3.0020.0002] # ADLAM SMALL LETTER KPO -1E920 ; [.3BF3.0020.0008] # ADLAM CAPITAL LETTER KPO -1E943 ; [.3BF4.0020.0002] # ADLAM SMALL LETTER SHA -1E921 ; [.3BF4.0020.0008] # ADLAM CAPITAL LETTER SHA -1100 ; [.3BF5.0020.0002] # HANGUL CHOSEONG KIYEOK -3131 ; [.3BF5.0020.0004] # HANGUL LETTER KIYEOK -3200 ; [*0317.0020.0004][.3BF5.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL KIYEOK -3260 ; [.3BF5.0020.0006] # CIRCLED HANGUL KIYEOK -FFA1 ; [.3BF5.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK -320E ; [*0317.0020.0004][.3BF5.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL KIYEOK A -326E ; [.3BF5.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL KIYEOK A -1101 ; [.3BF6.0020.0002] # HANGUL CHOSEONG SSANGKIYEOK -3132 ; [.3BF6.0020.0004] # HANGUL LETTER SSANGKIYEOK -FFA2 ; [.3BF6.0020.0012] # HALFWIDTH HANGUL LETTER SSANGKIYEOK -1102 ; [.3BF7.0020.0002] # HANGUL CHOSEONG NIEUN -3134 ; [.3BF7.0020.0004] # HANGUL LETTER NIEUN -3201 ; [*0317.0020.0004][.3BF7.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL NIEUN -3261 ; [.3BF7.0020.0006] # CIRCLED HANGUL NIEUN -FFA4 ; [.3BF7.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN -320F ; [*0317.0020.0004][.3BF7.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL NIEUN A -326F ; [.3BF7.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL NIEUN A -1103 ; [.3BF8.0020.0002] # HANGUL CHOSEONG TIKEUT -3137 ; [.3BF8.0020.0004] # HANGUL LETTER TIKEUT -3202 ; [*0317.0020.0004][.3BF8.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL TIKEUT -3262 ; [.3BF8.0020.0006] # CIRCLED HANGUL TIKEUT -FFA7 ; [.3BF8.0020.0012] # HALFWIDTH HANGUL LETTER TIKEUT -3210 ; [*0317.0020.0004][.3BF8.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL TIKEUT A -3270 ; [.3BF8.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL TIKEUT A -1104 ; [.3BF9.0020.0002] # HANGUL CHOSEONG SSANGTIKEUT -3138 ; [.3BF9.0020.0004] # HANGUL LETTER SSANGTIKEUT -FFA8 ; [.3BF9.0020.0012] # HALFWIDTH HANGUL LETTER SSANGTIKEUT -1105 ; [.3BFA.0020.0002] # HANGUL CHOSEONG RIEUL -3139 ; [.3BFA.0020.0004] # HANGUL LETTER RIEUL -3203 ; [*0317.0020.0004][.3BFA.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL RIEUL -3263 ; [.3BFA.0020.0006] # CIRCLED HANGUL RIEUL -FFA9 ; [.3BFA.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL -3211 ; [*0317.0020.0004][.3BFA.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL RIEUL A -3271 ; [.3BFA.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL RIEUL A -1106 ; [.3BFB.0020.0002] # HANGUL CHOSEONG MIEUM -3141 ; [.3BFB.0020.0004] # HANGUL LETTER MIEUM -3204 ; [*0317.0020.0004][.3BFB.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL MIEUM -3264 ; [.3BFB.0020.0006] # CIRCLED HANGUL MIEUM -FFB1 ; [.3BFB.0020.0012] # HALFWIDTH HANGUL LETTER MIEUM -3212 ; [*0317.0020.0004][.3BFB.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL MIEUM A -3272 ; [.3BFB.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL MIEUM A -1107 ; [.3BFC.0020.0002] # HANGUL CHOSEONG PIEUP -3142 ; [.3BFC.0020.0004] # HANGUL LETTER PIEUP -3205 ; [*0317.0020.0004][.3BFC.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL PIEUP -3265 ; [.3BFC.0020.0006] # CIRCLED HANGUL PIEUP -FFB2 ; [.3BFC.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP -3213 ; [*0317.0020.0004][.3BFC.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL PIEUP A -3273 ; [.3BFC.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL PIEUP A -1108 ; [.3BFD.0020.0002] # HANGUL CHOSEONG SSANGPIEUP -3143 ; [.3BFD.0020.0004] # HANGUL LETTER SSANGPIEUP -FFB3 ; [.3BFD.0020.0012] # HALFWIDTH HANGUL LETTER SSANGPIEUP -1109 ; [.3BFE.0020.0002] # HANGUL CHOSEONG SIOS -3145 ; [.3BFE.0020.0004] # HANGUL LETTER SIOS -3206 ; [*0317.0020.0004][.3BFE.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL SIOS -3266 ; [.3BFE.0020.0006] # CIRCLED HANGUL SIOS -FFB5 ; [.3BFE.0020.0012] # HALFWIDTH HANGUL LETTER SIOS -3214 ; [*0317.0020.0004][.3BFE.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL SIOS A -3274 ; [.3BFE.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL SIOS A -110A ; [.3BFF.0020.0002] # HANGUL CHOSEONG SSANGSIOS -3146 ; [.3BFF.0020.0004] # HANGUL LETTER SSANGSIOS -FFB6 ; [.3BFF.0020.0012] # HALFWIDTH HANGUL LETTER SSANGSIOS -110B ; [.3C00.0020.0002] # HANGUL CHOSEONG IEUNG -3147 ; [.3C00.0020.0004] # HANGUL LETTER IEUNG -3207 ; [*0317.0020.0004][.3C00.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL IEUNG -3267 ; [.3C00.0020.0006] # CIRCLED HANGUL IEUNG -FFB7 ; [.3C00.0020.0012] # HALFWIDTH HANGUL LETTER IEUNG -3215 ; [*0317.0020.0004][.3C00.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL IEUNG A -3275 ; [.3C00.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL IEUNG A -321D ; [*0317.0020.0004][.3C00.0020.0004][.3C7B.0020.0004][.3C01.0020.0004][.3C77.0020.0004][.3CD4.0020.0004][*0318.0020.0004] # PARENTHESIZED KOREAN CHARACTER OJEON -321E ; [*0317.0020.0004][.3C00.0020.0004][.3C7B.0020.0004][.3C07.0020.0004][.3C80.0020.0004][*0318.0020.0004] # PARENTHESIZED KOREAN CHARACTER O HU -327E ; [.3C00.0020.0006][.3C80.0020.0006] # CIRCLED HANGUL IEUNG U -110C ; [.3C01.0020.0002] # HANGUL CHOSEONG CIEUC -3148 ; [.3C01.0020.0004] # HANGUL LETTER CIEUC -3208 ; [*0317.0020.0004][.3C01.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CIEUC -3268 ; [.3C01.0020.0006] # CIRCLED HANGUL CIEUC -FFB8 ; [.3C01.0020.0012] # HALFWIDTH HANGUL LETTER CIEUC -3216 ; [*0317.0020.0004][.3C01.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CIEUC A -3276 ; [.3C01.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL CIEUC A -321C ; [*0317.0020.0004][.3C01.0020.0004][.3C80.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CIEUC U -327D ; [.3C01.0020.0006][.3C80.0020.0006][.3C00.0020.0006][.3C86.0020.0006] # CIRCLED KOREAN CHARACTER JUEUI -110D ; [.3C02.0020.0002] # HANGUL CHOSEONG SSANGCIEUC -3149 ; [.3C02.0020.0004] # HANGUL LETTER SSANGCIEUC -FFB9 ; [.3C02.0020.0012] # HALFWIDTH HANGUL LETTER SSANGCIEUC -110E ; [.3C03.0020.0002] # HANGUL CHOSEONG CHIEUCH -314A ; [.3C03.0020.0004] # HANGUL LETTER CHIEUCH -3209 ; [*0317.0020.0004][.3C03.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CHIEUCH -3269 ; [.3C03.0020.0006] # CIRCLED HANGUL CHIEUCH -FFBA ; [.3C03.0020.0012] # HALFWIDTH HANGUL LETTER CHIEUCH -3217 ; [*0317.0020.0004][.3C03.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL CHIEUCH A -3277 ; [.3C03.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL CHIEUCH A -327C ; [.3C03.0020.0006][.3C73.0020.0006][.3CE0.0020.0006][.3BF5.0020.0006][.3C7B.0020.0006] # CIRCLED KOREAN CHARACTER CHAMKO -110F ; [.3C04.0020.0002] # HANGUL CHOSEONG KHIEUKH -314B ; [.3C04.0020.0004] # HANGUL LETTER KHIEUKH -320A ; [*0317.0020.0004][.3C04.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL KHIEUKH -326A ; [.3C04.0020.0006] # CIRCLED HANGUL KHIEUKH -FFBB ; [.3C04.0020.0012] # HALFWIDTH HANGUL LETTER KHIEUKH -3218 ; [*0317.0020.0004][.3C04.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL KHIEUKH A -3278 ; [.3C04.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL KHIEUKH A -1110 ; [.3C05.0020.0002] # HANGUL CHOSEONG THIEUTH -314C ; [.3C05.0020.0004] # HANGUL LETTER THIEUTH -320B ; [*0317.0020.0004][.3C05.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL THIEUTH -326B ; [.3C05.0020.0006] # CIRCLED HANGUL THIEUTH -FFBC ; [.3C05.0020.0012] # HALFWIDTH HANGUL LETTER THIEUTH -3219 ; [*0317.0020.0004][.3C05.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL THIEUTH A -3279 ; [.3C05.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL THIEUTH A -1111 ; [.3C06.0020.0002] # HANGUL CHOSEONG PHIEUPH -314D ; [.3C06.0020.0004] # HANGUL LETTER PHIEUPH -320C ; [*0317.0020.0004][.3C06.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL PHIEUPH -326C ; [.3C06.0020.0006] # CIRCLED HANGUL PHIEUPH -FFBD ; [.3C06.0020.0012] # HALFWIDTH HANGUL LETTER PHIEUPH -321A ; [*0317.0020.0004][.3C06.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL PHIEUPH A -327A ; [.3C06.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL PHIEUPH A -1112 ; [.3C07.0020.0002] # HANGUL CHOSEONG HIEUH -314E ; [.3C07.0020.0004] # HANGUL LETTER HIEUH -320D ; [*0317.0020.0004][.3C07.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL HIEUH -326D ; [.3C07.0020.0006] # CIRCLED HANGUL HIEUH -FFBE ; [.3C07.0020.0012] # HALFWIDTH HANGUL LETTER HIEUH -321B ; [*0317.0020.0004][.3C07.0020.0004][.3C73.0020.0004][*0318.0020.0004] # PARENTHESIZED HANGUL HIEUH A -327B ; [.3C07.0020.0006][.3C73.0020.0006] # CIRCLED HANGUL HIEUH A -1113 ; [.3C08.0020.0002] # HANGUL CHOSEONG NIEUN-KIYEOK -1114 ; [.3C09.0020.0002] # HANGUL CHOSEONG SSANGNIEUN -3165 ; [.3C09.0020.0004] # HANGUL LETTER SSANGNIEUN -1115 ; [.3C0A.0020.0002] # HANGUL CHOSEONG NIEUN-TIKEUT -3166 ; [.3C0A.0020.0004] # HANGUL LETTER NIEUN-TIKEUT -1116 ; [.3C0B.0020.0002] # HANGUL CHOSEONG NIEUN-PIEUP -1117 ; [.3C0C.0020.0002] # HANGUL CHOSEONG TIKEUT-KIYEOK -1118 ; [.3C0D.0020.0002] # HANGUL CHOSEONG RIEUL-NIEUN -1119 ; [.3C0E.0020.0002] # HANGUL CHOSEONG SSANGRIEUL -111A ; [.3C0F.0020.0002] # HANGUL CHOSEONG RIEUL-HIEUH -3140 ; [.3C0F.0020.0004] # HANGUL LETTER RIEUL-HIEUH -FFB0 ; [.3C0F.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH -111B ; [.3C10.0020.0002] # HANGUL CHOSEONG KAPYEOUNRIEUL -111C ; [.3C11.0020.0002] # HANGUL CHOSEONG MIEUM-PIEUP -316E ; [.3C11.0020.0004] # HANGUL LETTER MIEUM-PIEUP -111D ; [.3C12.0020.0002] # HANGUL CHOSEONG KAPYEOUNMIEUM -3171 ; [.3C12.0020.0004] # HANGUL LETTER KAPYEOUNMIEUM -111E ; [.3C13.0020.0002] # HANGUL CHOSEONG PIEUP-KIYEOK -3172 ; [.3C13.0020.0004] # HANGUL LETTER PIEUP-KIYEOK -111F ; [.3C14.0020.0002] # HANGUL CHOSEONG PIEUP-NIEUN -1120 ; [.3C15.0020.0002] # HANGUL CHOSEONG PIEUP-TIKEUT -3173 ; [.3C15.0020.0004] # HANGUL LETTER PIEUP-TIKEUT -1121 ; [.3C16.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS -3144 ; [.3C16.0020.0004] # HANGUL LETTER PIEUP-SIOS -FFB4 ; [.3C16.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP-SIOS -1122 ; [.3C17.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK -3174 ; [.3C17.0020.0004] # HANGUL LETTER PIEUP-SIOS-KIYEOK -1123 ; [.3C18.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT -3175 ; [.3C18.0020.0004] # HANGUL LETTER PIEUP-SIOS-TIKEUT -1124 ; [.3C19.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP -1125 ; [.3C1A.0020.0002] # HANGUL CHOSEONG PIEUP-SSANGSIOS -1126 ; [.3C1B.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC -1127 ; [.3C1C.0020.0002] # HANGUL CHOSEONG PIEUP-CIEUC -3176 ; [.3C1C.0020.0004] # HANGUL LETTER PIEUP-CIEUC -1128 ; [.3C1D.0020.0002] # HANGUL CHOSEONG PIEUP-CHIEUCH -1129 ; [.3C1E.0020.0002] # HANGUL CHOSEONG PIEUP-THIEUTH -3177 ; [.3C1E.0020.0004] # HANGUL LETTER PIEUP-THIEUTH -112A ; [.3C1F.0020.0002] # HANGUL CHOSEONG PIEUP-PHIEUPH -112B ; [.3C20.0020.0002] # HANGUL CHOSEONG KAPYEOUNPIEUP -3178 ; [.3C20.0020.0004] # HANGUL LETTER KAPYEOUNPIEUP -112C ; [.3C21.0020.0002] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP -3179 ; [.3C21.0020.0004] # HANGUL LETTER KAPYEOUNSSANGPIEUP -112D ; [.3C22.0020.0002] # HANGUL CHOSEONG SIOS-KIYEOK -317A ; [.3C22.0020.0004] # HANGUL LETTER SIOS-KIYEOK -112E ; [.3C23.0020.0002] # HANGUL CHOSEONG SIOS-NIEUN -317B ; [.3C23.0020.0004] # HANGUL LETTER SIOS-NIEUN -112F ; [.3C24.0020.0002] # HANGUL CHOSEONG SIOS-TIKEUT -317C ; [.3C24.0020.0004] # HANGUL LETTER SIOS-TIKEUT -1130 ; [.3C25.0020.0002] # HANGUL CHOSEONG SIOS-RIEUL -1131 ; [.3C26.0020.0002] # HANGUL CHOSEONG SIOS-MIEUM -1132 ; [.3C27.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP -317D ; [.3C27.0020.0004] # HANGUL LETTER SIOS-PIEUP -1133 ; [.3C28.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK -1134 ; [.3C29.0020.0002] # HANGUL CHOSEONG SIOS-SSANGSIOS -1135 ; [.3C2A.0020.0002] # HANGUL CHOSEONG SIOS-IEUNG -1136 ; [.3C2B.0020.0002] # HANGUL CHOSEONG SIOS-CIEUC -317E ; [.3C2B.0020.0004] # HANGUL LETTER SIOS-CIEUC -1137 ; [.3C2C.0020.0002] # HANGUL CHOSEONG SIOS-CHIEUCH -1138 ; [.3C2D.0020.0002] # HANGUL CHOSEONG SIOS-KHIEUKH -1139 ; [.3C2E.0020.0002] # HANGUL CHOSEONG SIOS-THIEUTH -113A ; [.3C2F.0020.0002] # HANGUL CHOSEONG SIOS-PHIEUPH -113B ; [.3C30.0020.0002] # HANGUL CHOSEONG SIOS-HIEUH -113C ; [.3C31.0020.0002] # HANGUL CHOSEONG CHITUEUMSIOS -113D ; [.3C32.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGSIOS -113E ; [.3C33.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSIOS -113F ; [.3C34.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS -1140 ; [.3C35.0020.0002] # HANGUL CHOSEONG PANSIOS -317F ; [.3C35.0020.0004] # HANGUL LETTER PANSIOS -1141 ; [.3C36.0020.0002] # HANGUL CHOSEONG IEUNG-KIYEOK -1142 ; [.3C37.0020.0002] # HANGUL CHOSEONG IEUNG-TIKEUT -1143 ; [.3C38.0020.0002] # HANGUL CHOSEONG IEUNG-MIEUM -1144 ; [.3C39.0020.0002] # HANGUL CHOSEONG IEUNG-PIEUP -1145 ; [.3C3A.0020.0002] # HANGUL CHOSEONG IEUNG-SIOS -1146 ; [.3C3B.0020.0002] # HANGUL CHOSEONG IEUNG-PANSIOS -1147 ; [.3C3C.0020.0002] # HANGUL CHOSEONG SSANGIEUNG -3180 ; [.3C3C.0020.0004] # HANGUL LETTER SSANGIEUNG -1148 ; [.3C3D.0020.0002] # HANGUL CHOSEONG IEUNG-CIEUC -1149 ; [.3C3E.0020.0002] # HANGUL CHOSEONG IEUNG-CHIEUCH -114A ; [.3C3F.0020.0002] # HANGUL CHOSEONG IEUNG-THIEUTH -114B ; [.3C40.0020.0002] # HANGUL CHOSEONG IEUNG-PHIEUPH -114C ; [.3C41.0020.0002] # HANGUL CHOSEONG YESIEUNG -3181 ; [.3C41.0020.0004] # HANGUL LETTER YESIEUNG -114D ; [.3C42.0020.0002] # HANGUL CHOSEONG CIEUC-IEUNG -114E ; [.3C43.0020.0002] # HANGUL CHOSEONG CHITUEUMCIEUC -114F ; [.3C44.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC -1150 ; [.3C45.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCIEUC -1151 ; [.3C46.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC -1152 ; [.3C47.0020.0002] # HANGUL CHOSEONG CHIEUCH-KHIEUKH -1153 ; [.3C48.0020.0002] # HANGUL CHOSEONG CHIEUCH-HIEUH -1154 ; [.3C49.0020.0002] # HANGUL CHOSEONG CHITUEUMCHIEUCH -1155 ; [.3C4A.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH -1156 ; [.3C4B.0020.0002] # HANGUL CHOSEONG PHIEUPH-PIEUP -1157 ; [.3C4C.0020.0002] # HANGUL CHOSEONG KAPYEOUNPHIEUPH -3184 ; [.3C4C.0020.0004] # HANGUL LETTER KAPYEOUNPHIEUPH -1158 ; [.3C4D.0020.0002] # HANGUL CHOSEONG SSANGHIEUH -3185 ; [.3C4D.0020.0004] # HANGUL LETTER SSANGHIEUH -1159 ; [.3C4E.0020.0002] # HANGUL CHOSEONG YEORINHIEUH -3186 ; [.3C4E.0020.0004] # HANGUL LETTER YEORINHIEUH -115A ; [.3C4F.0020.0002] # HANGUL CHOSEONG KIYEOK-TIKEUT -115B ; [.3C50.0020.0002] # HANGUL CHOSEONG NIEUN-SIOS -115C ; [.3C51.0020.0002] # HANGUL CHOSEONG NIEUN-CIEUC -115D ; [.3C52.0020.0002] # HANGUL CHOSEONG NIEUN-HIEUH -115E ; [.3C53.0020.0002] # HANGUL CHOSEONG TIKEUT-RIEUL -A960 ; [.3C54.0020.0002] # HANGUL CHOSEONG TIKEUT-MIEUM -A961 ; [.3C55.0020.0002] # HANGUL CHOSEONG TIKEUT-PIEUP -A962 ; [.3C56.0020.0002] # HANGUL CHOSEONG TIKEUT-SIOS -A963 ; [.3C57.0020.0002] # HANGUL CHOSEONG TIKEUT-CIEUC -A964 ; [.3C58.0020.0002] # HANGUL CHOSEONG RIEUL-KIYEOK -A965 ; [.3C59.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGKIYEOK -A966 ; [.3C5A.0020.0002] # HANGUL CHOSEONG RIEUL-TIKEUT -A967 ; [.3C5B.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGTIKEUT -A968 ; [.3C5C.0020.0002] # HANGUL CHOSEONG RIEUL-MIEUM -A969 ; [.3C5D.0020.0002] # HANGUL CHOSEONG RIEUL-PIEUP -A96A ; [.3C5E.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGPIEUP -A96B ; [.3C5F.0020.0002] # HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP -A96C ; [.3C60.0020.0002] # HANGUL CHOSEONG RIEUL-SIOS -A96D ; [.3C61.0020.0002] # HANGUL CHOSEONG RIEUL-CIEUC -A96E ; [.3C62.0020.0002] # HANGUL CHOSEONG RIEUL-KHIEUKH -A96F ; [.3C63.0020.0002] # HANGUL CHOSEONG MIEUM-KIYEOK -A970 ; [.3C64.0020.0002] # HANGUL CHOSEONG MIEUM-TIKEUT -A971 ; [.3C65.0020.0002] # HANGUL CHOSEONG MIEUM-SIOS -A972 ; [.3C66.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-THIEUTH -A973 ; [.3C67.0020.0002] # HANGUL CHOSEONG PIEUP-KHIEUKH -A974 ; [.3C68.0020.0002] # HANGUL CHOSEONG PIEUP-HIEUH -A975 ; [.3C69.0020.0002] # HANGUL CHOSEONG SSANGSIOS-PIEUP -A976 ; [.3C6A.0020.0002] # HANGUL CHOSEONG IEUNG-RIEUL -A977 ; [.3C6B.0020.0002] # HANGUL CHOSEONG IEUNG-HIEUH -A978 ; [.3C6C.0020.0002] # HANGUL CHOSEONG SSANGCIEUC-HIEUH -A979 ; [.3C6D.0020.0002] # HANGUL CHOSEONG SSANGTHIEUTH -A97A ; [.3C6E.0020.0002] # HANGUL CHOSEONG PHIEUPH-HIEUH -A97B ; [.3C6F.0020.0002] # HANGUL CHOSEONG HIEUH-SIOS -A97C ; [.3C70.0020.0002] # HANGUL CHOSEONG SSANGYEORINHIEUH -115F ; [.3C71.0020.0002] # HANGUL CHOSEONG FILLER -1160 ; [.3C72.0020.0002] # HANGUL JUNGSEONG FILLER -3164 ; [.3C72.0020.0004] # HANGUL FILLER -FFA0 ; [.3C72.0020.0012] # HALFWIDTH HANGUL FILLER -1161 ; [.3C73.0020.0002] # HANGUL JUNGSEONG A -314F ; [.3C73.0020.0004] # HANGUL LETTER A -FFC2 ; [.3C73.0020.0012] # HALFWIDTH HANGUL LETTER A -1162 ; [.3C74.0020.0002] # HANGUL JUNGSEONG AE -3150 ; [.3C74.0020.0004] # HANGUL LETTER AE -FFC3 ; [.3C74.0020.0012] # HALFWIDTH HANGUL LETTER AE -1163 ; [.3C75.0020.0002] # HANGUL JUNGSEONG YA -3151 ; [.3C75.0020.0004] # HANGUL LETTER YA -FFC4 ; [.3C75.0020.0012] # HALFWIDTH HANGUL LETTER YA -1164 ; [.3C76.0020.0002] # HANGUL JUNGSEONG YAE -3152 ; [.3C76.0020.0004] # HANGUL LETTER YAE -FFC5 ; [.3C76.0020.0012] # HALFWIDTH HANGUL LETTER YAE -1165 ; [.3C77.0020.0002] # HANGUL JUNGSEONG EO -3153 ; [.3C77.0020.0004] # HANGUL LETTER EO -FFC6 ; [.3C77.0020.0012] # HALFWIDTH HANGUL LETTER EO -1166 ; [.3C78.0020.0002] # HANGUL JUNGSEONG E -3154 ; [.3C78.0020.0004] # HANGUL LETTER E -FFC7 ; [.3C78.0020.0012] # HALFWIDTH HANGUL LETTER E -1167 ; [.3C79.0020.0002] # HANGUL JUNGSEONG YEO -3155 ; [.3C79.0020.0004] # HANGUL LETTER YEO -FFCA ; [.3C79.0020.0012] # HALFWIDTH HANGUL LETTER YEO -1168 ; [.3C7A.0020.0002] # HANGUL JUNGSEONG YE -3156 ; [.3C7A.0020.0004] # HANGUL LETTER YE -FFCB ; [.3C7A.0020.0012] # HALFWIDTH HANGUL LETTER YE -1169 ; [.3C7B.0020.0002] # HANGUL JUNGSEONG O -3157 ; [.3C7B.0020.0004] # HANGUL LETTER O -FFCC ; [.3C7B.0020.0012] # HALFWIDTH HANGUL LETTER O -116A ; [.3C7C.0020.0002] # HANGUL JUNGSEONG WA -3158 ; [.3C7C.0020.0004] # HANGUL LETTER WA -FFCD ; [.3C7C.0020.0012] # HALFWIDTH HANGUL LETTER WA -116B ; [.3C7D.0020.0002] # HANGUL JUNGSEONG WAE -3159 ; [.3C7D.0020.0004] # HANGUL LETTER WAE -FFCE ; [.3C7D.0020.0012] # HALFWIDTH HANGUL LETTER WAE -116C ; [.3C7E.0020.0002] # HANGUL JUNGSEONG OE -315A ; [.3C7E.0020.0004] # HANGUL LETTER OE -FFCF ; [.3C7E.0020.0012] # HALFWIDTH HANGUL LETTER OE -116D ; [.3C7F.0020.0002] # HANGUL JUNGSEONG YO -315B ; [.3C7F.0020.0004] # HANGUL LETTER YO -FFD2 ; [.3C7F.0020.0012] # HALFWIDTH HANGUL LETTER YO -116E ; [.3C80.0020.0002] # HANGUL JUNGSEONG U -315C ; [.3C80.0020.0004] # HANGUL LETTER U -FFD3 ; [.3C80.0020.0012] # HALFWIDTH HANGUL LETTER U -116F ; [.3C81.0020.0002] # HANGUL JUNGSEONG WEO -315D ; [.3C81.0020.0004] # HANGUL LETTER WEO -FFD4 ; [.3C81.0020.0012] # HALFWIDTH HANGUL LETTER WEO -1170 ; [.3C82.0020.0002] # HANGUL JUNGSEONG WE -315E ; [.3C82.0020.0004] # HANGUL LETTER WE -FFD5 ; [.3C82.0020.0012] # HALFWIDTH HANGUL LETTER WE -1171 ; [.3C83.0020.0002] # HANGUL JUNGSEONG WI -315F ; [.3C83.0020.0004] # HANGUL LETTER WI -FFD6 ; [.3C83.0020.0012] # HALFWIDTH HANGUL LETTER WI -1172 ; [.3C84.0020.0002] # HANGUL JUNGSEONG YU -3160 ; [.3C84.0020.0004] # HANGUL LETTER YU -FFD7 ; [.3C84.0020.0012] # HALFWIDTH HANGUL LETTER YU -1173 ; [.3C85.0020.0002] # HANGUL JUNGSEONG EU -3161 ; [.3C85.0020.0004] # HANGUL LETTER EU -FFDA ; [.3C85.0020.0012] # HALFWIDTH HANGUL LETTER EU -1174 ; [.3C86.0020.0002] # HANGUL JUNGSEONG YI -3162 ; [.3C86.0020.0004] # HANGUL LETTER YI -FFDB ; [.3C86.0020.0012] # HALFWIDTH HANGUL LETTER YI -1175 ; [.3C87.0020.0002] # HANGUL JUNGSEONG I -3163 ; [.3C87.0020.0004] # HANGUL LETTER I -FFDC ; [.3C87.0020.0012] # HALFWIDTH HANGUL LETTER I -1176 ; [.3C88.0020.0002] # HANGUL JUNGSEONG A-O -1177 ; [.3C89.0020.0002] # HANGUL JUNGSEONG A-U -1178 ; [.3C8A.0020.0002] # HANGUL JUNGSEONG YA-O -1179 ; [.3C8B.0020.0002] # HANGUL JUNGSEONG YA-YO -117A ; [.3C8C.0020.0002] # HANGUL JUNGSEONG EO-O -117B ; [.3C8D.0020.0002] # HANGUL JUNGSEONG EO-U -117C ; [.3C8E.0020.0002] # HANGUL JUNGSEONG EO-EU -117D ; [.3C8F.0020.0002] # HANGUL JUNGSEONG YEO-O -117E ; [.3C90.0020.0002] # HANGUL JUNGSEONG YEO-U -117F ; [.3C91.0020.0002] # HANGUL JUNGSEONG O-EO -1180 ; [.3C92.0020.0002] # HANGUL JUNGSEONG O-E -1181 ; [.3C93.0020.0002] # HANGUL JUNGSEONG O-YE -1182 ; [.3C94.0020.0002] # HANGUL JUNGSEONG O-O -1183 ; [.3C95.0020.0002] # HANGUL JUNGSEONG O-U -1184 ; [.3C96.0020.0002] # HANGUL JUNGSEONG YO-YA -3187 ; [.3C96.0020.0004] # HANGUL LETTER YO-YA -1185 ; [.3C97.0020.0002] # HANGUL JUNGSEONG YO-YAE -3188 ; [.3C97.0020.0004] # HANGUL LETTER YO-YAE -1186 ; [.3C98.0020.0002] # HANGUL JUNGSEONG YO-YEO -1187 ; [.3C99.0020.0002] # HANGUL JUNGSEONG YO-O -1188 ; [.3C9A.0020.0002] # HANGUL JUNGSEONG YO-I -3189 ; [.3C9A.0020.0004] # HANGUL LETTER YO-I -1189 ; [.3C9B.0020.0002] # HANGUL JUNGSEONG U-A -118A ; [.3C9C.0020.0002] # HANGUL JUNGSEONG U-AE -118B ; [.3C9D.0020.0002] # HANGUL JUNGSEONG U-EO-EU -118C ; [.3C9E.0020.0002] # HANGUL JUNGSEONG U-YE -118D ; [.3C9F.0020.0002] # HANGUL JUNGSEONG U-U -118E ; [.3CA0.0020.0002] # HANGUL JUNGSEONG YU-A -118F ; [.3CA1.0020.0002] # HANGUL JUNGSEONG YU-EO -1190 ; [.3CA2.0020.0002] # HANGUL JUNGSEONG YU-E -1191 ; [.3CA3.0020.0002] # HANGUL JUNGSEONG YU-YEO -318A ; [.3CA3.0020.0004] # HANGUL LETTER YU-YEO -1192 ; [.3CA4.0020.0002] # HANGUL JUNGSEONG YU-YE -318B ; [.3CA4.0020.0004] # HANGUL LETTER YU-YE -1193 ; [.3CA5.0020.0002] # HANGUL JUNGSEONG YU-U -1194 ; [.3CA6.0020.0002] # HANGUL JUNGSEONG YU-I -318C ; [.3CA6.0020.0004] # HANGUL LETTER YU-I -1195 ; [.3CA7.0020.0002] # HANGUL JUNGSEONG EU-U -1196 ; [.3CA8.0020.0002] # HANGUL JUNGSEONG EU-EU -1197 ; [.3CA9.0020.0002] # HANGUL JUNGSEONG YI-U -1198 ; [.3CAA.0020.0002] # HANGUL JUNGSEONG I-A -1199 ; [.3CAB.0020.0002] # HANGUL JUNGSEONG I-YA -119A ; [.3CAC.0020.0002] # HANGUL JUNGSEONG I-O -119B ; [.3CAD.0020.0002] # HANGUL JUNGSEONG I-U -119C ; [.3CAE.0020.0002] # HANGUL JUNGSEONG I-EU -119D ; [.3CAF.0020.0002] # HANGUL JUNGSEONG I-ARAEA -119E ; [.3CB0.0020.0002] # HANGUL JUNGSEONG ARAEA -318D ; [.3CB0.0020.0004] # HANGUL LETTER ARAEA -119F ; [.3CB1.0020.0002] # HANGUL JUNGSEONG ARAEA-EO -11A0 ; [.3CB2.0020.0002] # HANGUL JUNGSEONG ARAEA-U -11A1 ; [.3CB3.0020.0002] # HANGUL JUNGSEONG ARAEA-I -318E ; [.3CB3.0020.0004] # HANGUL LETTER ARAEAE -11A2 ; [.3CB4.0020.0002] # HANGUL JUNGSEONG SSANGARAEA -11A3 ; [.3CB5.0020.0002] # HANGUL JUNGSEONG A-EU -11A4 ; [.3CB6.0020.0002] # HANGUL JUNGSEONG YA-U -11A5 ; [.3CB7.0020.0002] # HANGUL JUNGSEONG YEO-YA -11A6 ; [.3CB8.0020.0002] # HANGUL JUNGSEONG O-YA -11A7 ; [.3CB9.0020.0002] # HANGUL JUNGSEONG O-YAE -D7B0 ; [.3CBA.0020.0002] # HANGUL JUNGSEONG O-YEO -D7B1 ; [.3CBB.0020.0002] # HANGUL JUNGSEONG O-O-I -D7B2 ; [.3CBC.0020.0002] # HANGUL JUNGSEONG YO-A -D7B3 ; [.3CBD.0020.0002] # HANGUL JUNGSEONG YO-AE -D7B4 ; [.3CBE.0020.0002] # HANGUL JUNGSEONG YO-EO -D7B5 ; [.3CBF.0020.0002] # HANGUL JUNGSEONG U-YEO -D7B6 ; [.3CC0.0020.0002] # HANGUL JUNGSEONG U-I-I -D7B7 ; [.3CC1.0020.0002] # HANGUL JUNGSEONG YU-AE -D7B8 ; [.3CC2.0020.0002] # HANGUL JUNGSEONG YU-O -D7B9 ; [.3CC3.0020.0002] # HANGUL JUNGSEONG EU-A -D7BA ; [.3CC4.0020.0002] # HANGUL JUNGSEONG EU-EO -D7BB ; [.3CC5.0020.0002] # HANGUL JUNGSEONG EU-E -D7BC ; [.3CC6.0020.0002] # HANGUL JUNGSEONG EU-O -D7BD ; [.3CC7.0020.0002] # HANGUL JUNGSEONG I-YA-O -D7BE ; [.3CC8.0020.0002] # HANGUL JUNGSEONG I-YAE -D7BF ; [.3CC9.0020.0002] # HANGUL JUNGSEONG I-YEO -D7C0 ; [.3CCA.0020.0002] # HANGUL JUNGSEONG I-YE -D7C1 ; [.3CCB.0020.0002] # HANGUL JUNGSEONG I-O-I -D7C2 ; [.3CCC.0020.0002] # HANGUL JUNGSEONG I-YO -D7C3 ; [.3CCD.0020.0002] # HANGUL JUNGSEONG I-YU -D7C4 ; [.3CCE.0020.0002] # HANGUL JUNGSEONG I-I -D7C5 ; [.3CCF.0020.0002] # HANGUL JUNGSEONG ARAEA-A -D7C6 ; [.3CD0.0020.0002] # HANGUL JUNGSEONG ARAEA-E -11A8 ; [.3CD1.0020.0002] # HANGUL JONGSEONG KIYEOK -11A9 ; [.3CD2.0020.0002] # HANGUL JONGSEONG SSANGKIYEOK -11AA ; [.3CD3.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS -3133 ; [.3CD3.0020.0004] # HANGUL LETTER KIYEOK-SIOS -FFA3 ; [.3CD3.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS -11AB ; [.3CD4.0020.0002] # HANGUL JONGSEONG NIEUN -11AC ; [.3CD5.0020.0002] # HANGUL JONGSEONG NIEUN-CIEUC -3135 ; [.3CD5.0020.0004] # HANGUL LETTER NIEUN-CIEUC -FFA5 ; [.3CD5.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC -11AD ; [.3CD6.0020.0002] # HANGUL JONGSEONG NIEUN-HIEUH -3136 ; [.3CD6.0020.0004] # HANGUL LETTER NIEUN-HIEUH -FFA6 ; [.3CD6.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH -11AE ; [.3CD7.0020.0002] # HANGUL JONGSEONG TIKEUT -11AF ; [.3CD8.0020.0002] # HANGUL JONGSEONG RIEUL -11B0 ; [.3CD9.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK -313A ; [.3CD9.0020.0004] # HANGUL LETTER RIEUL-KIYEOK -FFAA ; [.3CD9.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK -11B1 ; [.3CDA.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM -313B ; [.3CDA.0020.0004] # HANGUL LETTER RIEUL-MIEUM -FFAB ; [.3CDA.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM -11B2 ; [.3CDB.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP -313C ; [.3CDB.0020.0004] # HANGUL LETTER RIEUL-PIEUP -FFAC ; [.3CDB.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP -11B3 ; [.3CDC.0020.0002] # HANGUL JONGSEONG RIEUL-SIOS -313D ; [.3CDC.0020.0004] # HANGUL LETTER RIEUL-SIOS -FFAD ; [.3CDC.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-SIOS -11B4 ; [.3CDD.0020.0002] # HANGUL JONGSEONG RIEUL-THIEUTH -313E ; [.3CDD.0020.0004] # HANGUL LETTER RIEUL-THIEUTH -FFAE ; [.3CDD.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH -11B5 ; [.3CDE.0020.0002] # HANGUL JONGSEONG RIEUL-PHIEUPH -313F ; [.3CDE.0020.0004] # HANGUL LETTER RIEUL-PHIEUPH -FFAF ; [.3CDE.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH -11B6 ; [.3CDF.0020.0002] # HANGUL JONGSEONG RIEUL-HIEUH -11B7 ; [.3CE0.0020.0002] # HANGUL JONGSEONG MIEUM -11B8 ; [.3CE1.0020.0002] # HANGUL JONGSEONG PIEUP -11B9 ; [.3CE2.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS -11BA ; [.3CE3.0020.0002] # HANGUL JONGSEONG SIOS -11BB ; [.3CE4.0020.0002] # HANGUL JONGSEONG SSANGSIOS -11BC ; [.3CE5.0020.0002] # HANGUL JONGSEONG IEUNG -11BD ; [.3CE6.0020.0002] # HANGUL JONGSEONG CIEUC -11BE ; [.3CE7.0020.0002] # HANGUL JONGSEONG CHIEUCH -11BF ; [.3CE8.0020.0002] # HANGUL JONGSEONG KHIEUKH -11C0 ; [.3CE9.0020.0002] # HANGUL JONGSEONG THIEUTH -11C1 ; [.3CEA.0020.0002] # HANGUL JONGSEONG PHIEUPH -11C2 ; [.3CEB.0020.0002] # HANGUL JONGSEONG HIEUH -11C3 ; [.3CEC.0020.0002] # HANGUL JONGSEONG KIYEOK-RIEUL -11C4 ; [.3CED.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK -11C5 ; [.3CEE.0020.0002] # HANGUL JONGSEONG NIEUN-KIYEOK -11C6 ; [.3CEF.0020.0002] # HANGUL JONGSEONG NIEUN-TIKEUT -11C7 ; [.3CF0.0020.0002] # HANGUL JONGSEONG NIEUN-SIOS -3167 ; [.3CF0.0020.0004] # HANGUL LETTER NIEUN-SIOS -11C8 ; [.3CF1.0020.0002] # HANGUL JONGSEONG NIEUN-PANSIOS -3168 ; [.3CF1.0020.0004] # HANGUL LETTER NIEUN-PANSIOS -11C9 ; [.3CF2.0020.0002] # HANGUL JONGSEONG NIEUN-THIEUTH -11CA ; [.3CF3.0020.0002] # HANGUL JONGSEONG TIKEUT-KIYEOK -11CB ; [.3CF4.0020.0002] # HANGUL JONGSEONG TIKEUT-RIEUL -11CC ; [.3CF5.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS -3169 ; [.3CF5.0020.0004] # HANGUL LETTER RIEUL-KIYEOK-SIOS -11CD ; [.3CF6.0020.0002] # HANGUL JONGSEONG RIEUL-NIEUN -11CE ; [.3CF7.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT -316A ; [.3CF7.0020.0004] # HANGUL LETTER RIEUL-TIKEUT -11CF ; [.3CF8.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH -11D0 ; [.3CF9.0020.0002] # HANGUL JONGSEONG SSANGRIEUL -11D1 ; [.3CFA.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK -11D2 ; [.3CFB.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS -11D3 ; [.3CFC.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS -316B ; [.3CFC.0020.0004] # HANGUL LETTER RIEUL-PIEUP-SIOS -11D4 ; [.3CFD.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH -11D5 ; [.3CFE.0020.0002] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP -11D6 ; [.3CFF.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGSIOS -11D7 ; [.3D00.0020.0002] # HANGUL JONGSEONG RIEUL-PANSIOS -316C ; [.3D00.0020.0004] # HANGUL LETTER RIEUL-PANSIOS -11D8 ; [.3D01.0020.0002] # HANGUL JONGSEONG RIEUL-KHIEUKH -11D9 ; [.3D02.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH -316D ; [.3D02.0020.0004] # HANGUL LETTER RIEUL-YEORINHIEUH -11DA ; [.3D03.0020.0002] # HANGUL JONGSEONG MIEUM-KIYEOK -11DB ; [.3D04.0020.0002] # HANGUL JONGSEONG MIEUM-RIEUL -11DC ; [.3D05.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP -11DD ; [.3D06.0020.0002] # HANGUL JONGSEONG MIEUM-SIOS -316F ; [.3D06.0020.0004] # HANGUL LETTER MIEUM-SIOS -11DE ; [.3D07.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGSIOS -11DF ; [.3D08.0020.0002] # HANGUL JONGSEONG MIEUM-PANSIOS -3170 ; [.3D08.0020.0004] # HANGUL LETTER MIEUM-PANSIOS -11E0 ; [.3D09.0020.0002] # HANGUL JONGSEONG MIEUM-CHIEUCH -11E1 ; [.3D0A.0020.0002] # HANGUL JONGSEONG MIEUM-HIEUH -11E2 ; [.3D0B.0020.0002] # HANGUL JONGSEONG KAPYEOUNMIEUM -11E3 ; [.3D0C.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL -11E4 ; [.3D0D.0020.0002] # HANGUL JONGSEONG PIEUP-PHIEUPH -11E5 ; [.3D0E.0020.0002] # HANGUL JONGSEONG PIEUP-HIEUH -11E6 ; [.3D0F.0020.0002] # HANGUL JONGSEONG KAPYEOUNPIEUP -11E7 ; [.3D10.0020.0002] # HANGUL JONGSEONG SIOS-KIYEOK -11E8 ; [.3D11.0020.0002] # HANGUL JONGSEONG SIOS-TIKEUT -11E9 ; [.3D12.0020.0002] # HANGUL JONGSEONG SIOS-RIEUL -11EA ; [.3D13.0020.0002] # HANGUL JONGSEONG SIOS-PIEUP -11EB ; [.3D14.0020.0002] # HANGUL JONGSEONG PANSIOS -11EC ; [.3D15.0020.0002] # HANGUL JONGSEONG IEUNG-KIYEOK -11ED ; [.3D16.0020.0002] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK -11EE ; [.3D17.0020.0002] # HANGUL JONGSEONG SSANGIEUNG -11EF ; [.3D18.0020.0002] # HANGUL JONGSEONG IEUNG-KHIEUKH -11F0 ; [.3D19.0020.0002] # HANGUL JONGSEONG YESIEUNG -11F1 ; [.3D1A.0020.0002] # HANGUL JONGSEONG YESIEUNG-SIOS -3182 ; [.3D1A.0020.0004] # HANGUL LETTER YESIEUNG-SIOS -11F2 ; [.3D1B.0020.0002] # HANGUL JONGSEONG YESIEUNG-PANSIOS -3183 ; [.3D1B.0020.0004] # HANGUL LETTER YESIEUNG-PANSIOS -11F3 ; [.3D1C.0020.0002] # HANGUL JONGSEONG PHIEUPH-PIEUP -11F4 ; [.3D1D.0020.0002] # HANGUL JONGSEONG KAPYEOUNPHIEUPH -11F5 ; [.3D1E.0020.0002] # HANGUL JONGSEONG HIEUH-NIEUN -11F6 ; [.3D1F.0020.0002] # HANGUL JONGSEONG HIEUH-RIEUL -11F7 ; [.3D20.0020.0002] # HANGUL JONGSEONG HIEUH-MIEUM -11F8 ; [.3D21.0020.0002] # HANGUL JONGSEONG HIEUH-PIEUP -11F9 ; [.3D22.0020.0002] # HANGUL JONGSEONG YEORINHIEUH -11FA ; [.3D23.0020.0002] # HANGUL JONGSEONG KIYEOK-NIEUN -11FB ; [.3D24.0020.0002] # HANGUL JONGSEONG KIYEOK-PIEUP -11FC ; [.3D25.0020.0002] # HANGUL JONGSEONG KIYEOK-CHIEUCH -11FD ; [.3D26.0020.0002] # HANGUL JONGSEONG KIYEOK-KHIEUKH -11FE ; [.3D27.0020.0002] # HANGUL JONGSEONG KIYEOK-HIEUH -11FF ; [.3D28.0020.0002] # HANGUL JONGSEONG SSANGNIEUN -D7CB ; [.3D29.0020.0002] # HANGUL JONGSEONG NIEUN-RIEUL -D7CC ; [.3D2A.0020.0002] # HANGUL JONGSEONG NIEUN-CHIEUCH -D7CD ; [.3D2B.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT -D7CE ; [.3D2C.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT-PIEUP -D7CF ; [.3D2D.0020.0002] # HANGUL JONGSEONG TIKEUT-PIEUP -D7D0 ; [.3D2E.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS -D7D1 ; [.3D2F.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK -D7D2 ; [.3D30.0020.0002] # HANGUL JONGSEONG TIKEUT-CIEUC -D7D3 ; [.3D31.0020.0002] # HANGUL JONGSEONG TIKEUT-CHIEUCH -D7D4 ; [.3D32.0020.0002] # HANGUL JONGSEONG TIKEUT-THIEUTH -D7D5 ; [.3D33.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGKIYEOK -D7D6 ; [.3D34.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH -D7D7 ; [.3D35.0020.0002] # HANGUL JONGSEONG SSANGRIEUL-KHIEUKH -D7D8 ; [.3D36.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-HIEUH -D7D9 ; [.3D37.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT -D7DA ; [.3D38.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH -D7DB ; [.3D39.0020.0002] # HANGUL JONGSEONG RIEUL-YESIEUNG -D7DC ; [.3D3A.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH -D7DD ; [.3D3B.0020.0002] # HANGUL JONGSEONG KAPYEOUNRIEUL -D7DE ; [.3D3C.0020.0002] # HANGUL JONGSEONG MIEUM-NIEUN -D7DF ; [.3D3D.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGNIEUN -D7E0 ; [.3D3E.0020.0002] # HANGUL JONGSEONG SSANGMIEUM -D7E1 ; [.3D3F.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP-SIOS -D7E2 ; [.3D40.0020.0002] # HANGUL JONGSEONG MIEUM-CIEUC -D7E3 ; [.3D41.0020.0002] # HANGUL JONGSEONG PIEUP-TIKEUT -D7E4 ; [.3D42.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH -D7E5 ; [.3D43.0020.0002] # HANGUL JONGSEONG PIEUP-MIEUM -D7E6 ; [.3D44.0020.0002] # HANGUL JONGSEONG SSANGPIEUP -D7E7 ; [.3D45.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS-TIKEUT -D7E8 ; [.3D46.0020.0002] # HANGUL JONGSEONG PIEUP-CIEUC -D7E9 ; [.3D47.0020.0002] # HANGUL JONGSEONG PIEUP-CHIEUCH -D7EA ; [.3D48.0020.0002] # HANGUL JONGSEONG SIOS-MIEUM -D7EB ; [.3D49.0020.0002] # HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP -D7EC ; [.3D4A.0020.0002] # HANGUL JONGSEONG SSANGSIOS-KIYEOK -D7ED ; [.3D4B.0020.0002] # HANGUL JONGSEONG SSANGSIOS-TIKEUT -D7EE ; [.3D4C.0020.0002] # HANGUL JONGSEONG SIOS-PANSIOS -D7EF ; [.3D4D.0020.0002] # HANGUL JONGSEONG SIOS-CIEUC -D7F0 ; [.3D4E.0020.0002] # HANGUL JONGSEONG SIOS-CHIEUCH -D7F1 ; [.3D4F.0020.0002] # HANGUL JONGSEONG SIOS-THIEUTH -D7F2 ; [.3D50.0020.0002] # HANGUL JONGSEONG SIOS-HIEUH -D7F3 ; [.3D51.0020.0002] # HANGUL JONGSEONG PANSIOS-PIEUP -D7F4 ; [.3D52.0020.0002] # HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP -D7F5 ; [.3D53.0020.0002] # HANGUL JONGSEONG YESIEUNG-MIEUM -D7F6 ; [.3D54.0020.0002] # HANGUL JONGSEONG YESIEUNG-HIEUH -D7F7 ; [.3D55.0020.0002] # HANGUL JONGSEONG CIEUC-PIEUP -D7F8 ; [.3D56.0020.0002] # HANGUL JONGSEONG CIEUC-SSANGPIEUP -D7F9 ; [.3D57.0020.0002] # HANGUL JONGSEONG SSANGCIEUC -D7FA ; [.3D58.0020.0002] # HANGUL JONGSEONG PHIEUPH-SIOS -D7FB ; [.3D59.0020.0002] # HANGUL JONGSEONG PHIEUPH-THIEUTH -3041 ; [.3D5A.0020.000D] # HIRAGANA LETTER SMALL A -3042 ; [.3D5A.0020.000E] # HIRAGANA LETTER A -30A1 ; [.3D5A.0020.000F] # KATAKANA LETTER SMALL A -FF67 ; [.3D5A.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL A -30A2 ; [.3D5A.0020.0011] # KATAKANA LETTER A -FF71 ; [.3D5A.0020.0012] # HALFWIDTH KATAKANA LETTER A -32D0 ; [.3D5A.0020.0013] # CIRCLED KATAKANA A -3303 ; [.3D5A.0020.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE AARU -3300 ; [.3D5A.0020.001C][.3D74.0020.001C][.0000.0038.001C][.1C0E.0020.001C][.3D6E.0020.001C] # SQUARE APAATO -3301 ; [.3D5A.0020.001C][.3D84.0020.001C][.3D76.0020.001C][.3D5A.0020.001C] # SQUARE ARUHUA -3302 ; [.3D5A.0020.001C][.3D8B.0020.001C][.3D77.0020.001C][.0000.0038.001C][.3D5A.0020.001C] # SQUARE ANPEA -3043 ; [.3D5B.0020.000D] # HIRAGANA LETTER SMALL I -3044 ; [.3D5B.0020.000E] # HIRAGANA LETTER I -30A3 ; [.3D5B.0020.000F] # KATAKANA LETTER SMALL I -FF68 ; [.3D5B.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL I -30A4 ; [.3D5B.0020.0011] # KATAKANA LETTER I -FF72 ; [.3D5B.0020.0012] # HALFWIDTH KATAKANA LETTER I -32D1 ; [.3D5B.0020.0013] # CIRCLED KATAKANA I -3304 ; [.3D5B.0020.001C][.3D70.0020.001C][.3D8B.0020.001C][.3D62.0020.001C][.0000.0037.001C] # SQUARE ININGU -3305 ; [.3D5B.0020.001C][.3D8B.0020.001C][.3D6B.0020.001C] # SQUARE INTI -3045 ; [.3D5C.0020.000D] # HIRAGANA LETTER SMALL U -3046 ; [.3D5C.0020.000E] # HIRAGANA LETTER U -30A5 ; [.3D5C.0020.000F] # KATAKANA LETTER SMALL U -FF69 ; [.3D5C.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL U -30A6 ; [.3D5C.0020.0011] # KATAKANA LETTER U -FF73 ; [.3D5C.0020.0012] # HALFWIDTH KATAKANA LETTER U -32D2 ; [.3D5C.0020.0013] # CIRCLED KATAKANA U -3094 ; [.3D5C.0020.000E][.0000.0037.0002] # HIRAGANA LETTER VU -30F4 ; [.3D5C.0020.0011][.0000.0037.0002] # KATAKANA LETTER VU -3306 ; [.3D5C.0020.001C][.3D5F.0020.001C][.3D8B.0020.001C] # SQUARE UON -1B000 ; [.3D5D.0020.0011] # KATAKANA LETTER ARCHAIC E -3047 ; [.3D5E.0020.000D] # HIRAGANA LETTER SMALL E -3048 ; [.3D5E.0020.000E] # HIRAGANA LETTER E -30A7 ; [.3D5E.0020.000F] # KATAKANA LETTER SMALL E -FF6A ; [.3D5E.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL E -30A8 ; [.3D5E.0020.0011] # KATAKANA LETTER E -FF74 ; [.3D5E.0020.0012] # HALFWIDTH KATAKANA LETTER E -32D3 ; [.3D5E.0020.0013] # CIRCLED KATAKANA E -3308 ; [.3D5E.0020.001C][.1C0E.0020.001C][.3D60.0020.001C][.1C0E.0020.001C] # SQUARE EEKAA -3307 ; [.3D5E.0020.001C][.3D67.0020.001C][.3D62.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C][.0000.0037.001C] # SQUARE ESUKUUDO -3049 ; [.3D5F.0020.000D] # HIRAGANA LETTER SMALL O -304A ; [.3D5F.0020.000E] # HIRAGANA LETTER O -30A9 ; [.3D5F.0020.000F] # KATAKANA LETTER SMALL O -FF6B ; [.3D5F.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL O -30AA ; [.3D5F.0020.0011] # KATAKANA LETTER O -FF75 ; [.3D5F.0020.0012] # HALFWIDTH KATAKANA LETTER O -32D4 ; [.3D5F.0020.0013] # CIRCLED KATAKANA O -330A ; [.3D5F.0020.001C][.1C0E.0020.001C][.3D7B.0020.001C] # SQUARE OOMU -3309 ; [.3D5F.0020.001C][.3D8B.0020.001C][.3D67.0020.001C] # SQUARE ONSU -3095 ; [.3D60.0020.000D] # HIRAGANA LETTER SMALL KA -304B ; [.3D60.0020.000E] # HIRAGANA LETTER KA -30F5 ; [.3D60.0020.000F] # KATAKANA LETTER SMALL KA -30AB ; [.3D60.0020.0011] # KATAKANA LETTER KA -FF76 ; [.3D60.0020.0012] # HALFWIDTH KATAKANA LETTER KA -32D5 ; [.3D60.0020.0013] # CIRCLED KATAKANA KA -304C ; [.3D60.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GA -30AC ; [.3D60.0020.0011][.0000.0037.0002] # KATAKANA LETTER GA -330B ; [.3D60.0020.001C][.3D5B.0020.001C][.3D83.0020.001C] # SQUARE KAIRI -330C ; [.3D60.0020.001C][.3D82.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C] # SQUARE KARATTO -330D ; [.3D60.0020.001C][.3D86.0020.001C][.3D83.0020.001C][.1C0E.0020.001C] # SQUARE KARORII -330E ; [.3D60.0020.001C][.0000.0037.001C][.3D86.0020.001C][.3D8B.0020.001C] # SQUARE GARON -330F ; [.3D60.0020.001C][.0000.0037.001C][.3D8B.0020.001C][.3D79.0020.001C] # SQUARE GANMA -304D ; [.3D61.0020.000E] # HIRAGANA LETTER KI -30AD ; [.3D61.0020.0011] # KATAKANA LETTER KI -FF77 ; [.3D61.0020.0012] # HALFWIDTH KATAKANA LETTER KI -32D6 ; [.3D61.0020.0013] # CIRCLED KATAKANA KI -304E ; [.3D61.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GI -30AE ; [.3D61.0020.0011][.0000.0037.0002] # KATAKANA LETTER GI -3310 ; [.3D61.0020.001C][.0000.0037.001C][.3D60.0020.001C][.0000.0037.001C] # SQUARE GIGA -3311 ; [.3D61.0020.001C][.0000.0037.001C][.3D70.0020.001C][.1C0E.0020.001C] # SQUARE GINII -3312 ; [.3D61.0020.001C][.3D7F.0020.001C][.3D83.0020.001C][.1C0E.0020.001C] # SQUARE KYURII -3313 ; [.3D61.0020.001C][.0000.0037.001C][.3D84.0020.001C][.3D6A.0020.001C][.0000.0037.001C][.1C0E.0020.001C] # SQUARE GIRUDAA -3314 ; [.3D61.0020.001C][.3D86.0020.001C] # SQUARE KIRO -3315 ; [.3D61.0020.001C][.3D86.0020.001C][.3D62.0020.001C][.0000.0037.001C][.3D82.0020.001C][.3D7B.0020.001C] # SQUARE KIROGURAMU -3316 ; [.3D61.0020.001C][.3D86.0020.001C][.3D7C.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C][.3D84.0020.001C] # SQUARE KIROMEETORU -3317 ; [.3D61.0020.001C][.3D86.0020.001C][.3D87.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C] # SQUARE KIROWATTO -304F ; [.3D62.0020.000E] # HIRAGANA LETTER KU -31F0 ; [.3D62.0020.000F] # KATAKANA LETTER SMALL KU -30AF ; [.3D62.0020.0011] # KATAKANA LETTER KU -FF78 ; [.3D62.0020.0012] # HALFWIDTH KATAKANA LETTER KU -32D7 ; [.3D62.0020.0013] # CIRCLED KATAKANA KU -3050 ; [.3D62.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GU -30B0 ; [.3D62.0020.0011][.0000.0037.0002] # KATAKANA LETTER GU -3318 ; [.3D62.0020.001C][.0000.0037.001C][.3D82.0020.001C][.3D7B.0020.001C] # SQUARE GURAMU -3319 ; [.3D62.0020.001C][.0000.0037.001C][.3D82.0020.001C][.3D7B.0020.001C][.3D6E.0020.001C][.3D8B.0020.001C] # SQUARE GURAMUTON -331A ; [.3D62.0020.001C][.3D84.0020.001C][.3D68.0020.001C][.0000.0037.001C][.3D5B.0020.001C][.3D86.0020.001C] # SQUARE KURUZEIRO -331B ; [.3D62.0020.001C][.3D86.0020.001C][.1C0E.0020.001C][.3D72.0020.001C] # SQUARE KUROONE -3096 ; [.3D63.0020.000D] # HIRAGANA LETTER SMALL KE -3051 ; [.3D63.0020.000E] # HIRAGANA LETTER KE -30F6 ; [.3D63.0020.000F] # KATAKANA LETTER SMALL KE -30B1 ; [.3D63.0020.0011] # KATAKANA LETTER KE -FF79 ; [.3D63.0020.0012] # HALFWIDTH KATAKANA LETTER KE -32D8 ; [.3D63.0020.0013] # CIRCLED KATAKANA KE -3052 ; [.3D63.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GE -30B2 ; [.3D63.0020.0011][.0000.0037.0002] # KATAKANA LETTER GE -331C ; [.3D63.0020.001C][.1C0E.0020.001C][.3D67.0020.001C] # SQUARE KEESU -3053 ; [.3D64.0020.000E] # HIRAGANA LETTER KO -30B3 ; [.3D64.0020.0011] # KATAKANA LETTER KO -FF7A ; [.3D64.0020.0012] # HALFWIDTH KATAKANA LETTER KO -32D9 ; [.3D64.0020.0013] # CIRCLED KATAKANA KO -3054 ; [.3D64.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GO -30B4 ; [.3D64.0020.0011][.0000.0037.0002] # KATAKANA LETTER GO -331E ; [.3D64.0020.001C][.1C0E.0020.001C][.3D78.0020.001C][.0000.0038.001C] # SQUARE KOOPO -1F201 ; [.3D64.0020.001C][.3D64.0020.001C] # SQUARED KATAKANA KOKO -30FF ; [.3D64.0020.0016][.3D6E.0020.0016] # KATAKANA DIGRAPH KOTO -331D ; [.3D64.0020.001C][.3D84.0020.001C][.3D6F.0020.001C] # SQUARE KORUNA -3055 ; [.3D65.0020.000E] # HIRAGANA LETTER SA -30B5 ; [.3D65.0020.0011] # KATAKANA LETTER SA -FF7B ; [.3D65.0020.0012] # HALFWIDTH KATAKANA LETTER SA -32DA ; [.3D65.0020.0013] # CIRCLED KATAKANA SA -1F202 ; [.3D65.0020.001C] # SQUARED KATAKANA SA -3056 ; [.3D65.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZA -30B6 ; [.3D65.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZA -331F ; [.3D65.0020.001C][.3D5B.0020.001C][.3D62.0020.001C][.3D84.0020.001C] # SQUARE SAIKURU -3320 ; [.3D65.0020.001C][.3D8B.0020.001C][.3D6B.0020.001C][.1C0E.0020.001C][.3D7B.0020.001C] # SQUARE SANTIIMU -3057 ; [.3D66.0020.000E] # HIRAGANA LETTER SI -31F1 ; [.3D66.0020.000F] # KATAKANA LETTER SMALL SI -30B7 ; [.3D66.0020.0011] # KATAKANA LETTER SI -FF7C ; [.3D66.0020.0012] # HALFWIDTH KATAKANA LETTER SI -32DB ; [.3D66.0020.0013] # CIRCLED KATAKANA SI -3058 ; [.3D66.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZI -30B8 ; [.3D66.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZI -3006 ; [.3D66.0020.0004][.3D7C.0020.0004] # IDEOGRAPHIC CLOSING MARK -3321 ; [.3D66.0020.001C][.3D83.0020.001C][.3D8B.0020.001C][.3D62.0020.001C][.0000.0037.001C] # SQUARE SIRINGU -3059 ; [.3D67.0020.000E] # HIRAGANA LETTER SU -31F2 ; [.3D67.0020.000F] # KATAKANA LETTER SMALL SU -30B9 ; [.3D67.0020.0011] # KATAKANA LETTER SU -FF7D ; [.3D67.0020.0012] # HALFWIDTH KATAKANA LETTER SU -32DC ; [.3D67.0020.0013] # CIRCLED KATAKANA SU -305A ; [.3D67.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZU -30BA ; [.3D67.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZU -305B ; [.3D68.0020.000E] # HIRAGANA LETTER SE -30BB ; [.3D68.0020.0011] # KATAKANA LETTER SE -FF7E ; [.3D68.0020.0012] # HALFWIDTH KATAKANA LETTER SE -32DD ; [.3D68.0020.0013] # CIRCLED KATAKANA SE -305C ; [.3D68.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZE -30BC ; [.3D68.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZE -3322 ; [.3D68.0020.001C][.3D8B.0020.001C][.3D6B.0020.001C] # SQUARE SENTI -3323 ; [.3D68.0020.001C][.3D8B.0020.001C][.3D6E.0020.001C] # SQUARE SENTO -305D ; [.3D69.0020.000E] # HIRAGANA LETTER SO -30BD ; [.3D69.0020.0011] # KATAKANA LETTER SO -FF7F ; [.3D69.0020.0012] # HALFWIDTH KATAKANA LETTER SO -32DE ; [.3D69.0020.0013] # CIRCLED KATAKANA SO -305E ; [.3D69.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZO -30BE ; [.3D69.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZO -305F ; [.3D6A.0020.000E] # HIRAGANA LETTER TA -30BF ; [.3D6A.0020.0011] # KATAKANA LETTER TA -FF80 ; [.3D6A.0020.0012] # HALFWIDTH KATAKANA LETTER TA -32DF ; [.3D6A.0020.0013] # CIRCLED KATAKANA TA -3060 ; [.3D6A.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DA -30C0 ; [.3D6A.0020.0011][.0000.0037.0002] # KATAKANA LETTER DA -3324 ; [.3D6A.0020.001C][.0000.0037.001C][.1C0E.0020.001C][.3D67.0020.001C] # SQUARE DAASU -3061 ; [.3D6B.0020.000E] # HIRAGANA LETTER TI -30C1 ; [.3D6B.0020.0011] # KATAKANA LETTER TI -FF81 ; [.3D6B.0020.0012] # HALFWIDTH KATAKANA LETTER TI -32E0 ; [.3D6B.0020.0013] # CIRCLED KATAKANA TI -3062 ; [.3D6B.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DI -30C2 ; [.3D6B.0020.0011][.0000.0037.0002] # KATAKANA LETTER DI -3063 ; [.3D6C.0020.000D] # HIRAGANA LETTER SMALL TU -3064 ; [.3D6C.0020.000E] # HIRAGANA LETTER TU -30C3 ; [.3D6C.0020.000F] # KATAKANA LETTER SMALL TU -FF6F ; [.3D6C.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL TU -30C4 ; [.3D6C.0020.0011] # KATAKANA LETTER TU -FF82 ; [.3D6C.0020.0012] # HALFWIDTH KATAKANA LETTER TU -32E1 ; [.3D6C.0020.0013] # CIRCLED KATAKANA TU -3065 ; [.3D6C.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DU -30C5 ; [.3D6C.0020.0011][.0000.0037.0002] # KATAKANA LETTER DU -3066 ; [.3D6D.0020.000E] # HIRAGANA LETTER TE -30C6 ; [.3D6D.0020.0011] # KATAKANA LETTER TE -FF83 ; [.3D6D.0020.0012] # HALFWIDTH KATAKANA LETTER TE -32E2 ; [.3D6D.0020.0013] # CIRCLED KATAKANA TE -3067 ; [.3D6D.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DE -30C7 ; [.3D6D.0020.0011][.0000.0037.0002] # KATAKANA LETTER DE -1F213 ; [.3D6D.0020.001C][.0000.0037.001C] # SQUARED KATAKANA DE -3325 ; [.3D6D.0020.001C][.0000.0037.001C][.3D66.0020.001C] # SQUARE DESI -3068 ; [.3D6E.0020.000E] # HIRAGANA LETTER TO -31F3 ; [.3D6E.0020.000F] # KATAKANA LETTER SMALL TO -30C8 ; [.3D6E.0020.0011] # KATAKANA LETTER TO -FF84 ; [.3D6E.0020.0012] # HALFWIDTH KATAKANA LETTER TO -32E3 ; [.3D6E.0020.0013] # CIRCLED KATAKANA TO -3069 ; [.3D6E.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DO -30C9 ; [.3D6E.0020.0011][.0000.0037.0002] # KATAKANA LETTER DO -3326 ; [.3D6E.0020.001C][.0000.0037.001C][.3D84.0020.001C] # SQUARE DORU -3327 ; [.3D6E.0020.001C][.3D8B.0020.001C] # SQUARE TON -306A ; [.3D6F.0020.000E] # HIRAGANA LETTER NA -30CA ; [.3D6F.0020.0011] # KATAKANA LETTER NA -FF85 ; [.3D6F.0020.0012] # HALFWIDTH KATAKANA LETTER NA -32E4 ; [.3D6F.0020.0013] # CIRCLED KATAKANA NA -3328 ; [.3D6F.0020.001C][.3D73.0020.001C] # SQUARE NANO -306B ; [.3D70.0020.000E] # HIRAGANA LETTER NI -30CB ; [.3D70.0020.0011] # KATAKANA LETTER NI -FF86 ; [.3D70.0020.0012] # HALFWIDTH KATAKANA LETTER NI -32E5 ; [.3D70.0020.0013] # CIRCLED KATAKANA NI -306C ; [.3D71.0020.000E] # HIRAGANA LETTER NU -31F4 ; [.3D71.0020.000F] # KATAKANA LETTER SMALL NU -30CC ; [.3D71.0020.0011] # KATAKANA LETTER NU -FF87 ; [.3D71.0020.0012] # HALFWIDTH KATAKANA LETTER NU -32E6 ; [.3D71.0020.0013] # CIRCLED KATAKANA NU -306D ; [.3D72.0020.000E] # HIRAGANA LETTER NE -30CD ; [.3D72.0020.0011] # KATAKANA LETTER NE -FF88 ; [.3D72.0020.0012] # HALFWIDTH KATAKANA LETTER NE -32E7 ; [.3D72.0020.0013] # CIRCLED KATAKANA NE -306E ; [.3D73.0020.000E] # HIRAGANA LETTER NO -30CE ; [.3D73.0020.0011] # KATAKANA LETTER NO -FF89 ; [.3D73.0020.0012] # HALFWIDTH KATAKANA LETTER NO -32E8 ; [.3D73.0020.0013] # CIRCLED KATAKANA NO -3329 ; [.3D73.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C] # SQUARE NOTTO -306F ; [.3D74.0020.000E] # HIRAGANA LETTER HA -31F5 ; [.3D74.0020.000F] # KATAKANA LETTER SMALL HA -30CF ; [.3D74.0020.0011] # KATAKANA LETTER HA -FF8A ; [.3D74.0020.0012] # HALFWIDTH KATAKANA LETTER HA -32E9 ; [.3D74.0020.0013] # CIRCLED KATAKANA HA -3070 ; [.3D74.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BA -30D0 ; [.3D74.0020.0011][.0000.0037.0002] # KATAKANA LETTER BA -3071 ; [.3D74.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PA -30D1 ; [.3D74.0020.0011][.0000.0038.0002] # KATAKANA LETTER PA -332B ; [.3D74.0020.001C][.0000.0038.001C][.1C0E.0020.001C][.3D68.0020.001C][.3D8B.0020.001C][.3D6E.0020.001C] # SQUARE PAASENTO -332C ; [.3D74.0020.001C][.0000.0038.001C][.1C0E.0020.001C][.3D6C.0020.001C] # SQUARE PAATU -332D ; [.3D74.0020.001C][.0000.0037.001C][.1C0E.0020.001C][.3D85.0020.001C][.3D84.0020.001C] # SQUARE BAARERU -332A ; [.3D74.0020.001C][.3D5B.0020.001C][.3D6C.0020.001C] # SQUARE HAITU -3072 ; [.3D75.0020.000E] # HIRAGANA LETTER HI -31F6 ; [.3D75.0020.000F] # KATAKANA LETTER SMALL HI -30D2 ; [.3D75.0020.0011] # KATAKANA LETTER HI -FF8B ; [.3D75.0020.0012] # HALFWIDTH KATAKANA LETTER HI -32EA ; [.3D75.0020.0013] # CIRCLED KATAKANA HI -3073 ; [.3D75.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BI -30D3 ; [.3D75.0020.0011][.0000.0037.0002] # KATAKANA LETTER BI -3074 ; [.3D75.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PI -30D4 ; [.3D75.0020.0011][.0000.0038.0002] # KATAKANA LETTER PI -332E ; [.3D75.0020.001C][.0000.0038.001C][.3D5A.0020.001C][.3D67.0020.001C][.3D6E.0020.001C][.3D84.0020.001C] # SQUARE PIASUTORU -332F ; [.3D75.0020.001C][.0000.0038.001C][.3D62.0020.001C][.3D84.0020.001C] # SQUARE PIKURU -3330 ; [.3D75.0020.001C][.0000.0038.001C][.3D64.0020.001C] # SQUARE PIKO -3331 ; [.3D75.0020.001C][.0000.0037.001C][.3D84.0020.001C] # SQUARE BIRU -3075 ; [.3D76.0020.000E] # HIRAGANA LETTER HU -31F7 ; [.3D76.0020.000F] # KATAKANA LETTER SMALL HU -30D5 ; [.3D76.0020.0011] # KATAKANA LETTER HU -FF8C ; [.3D76.0020.0012] # HALFWIDTH KATAKANA LETTER HU -32EB ; [.3D76.0020.0013] # CIRCLED KATAKANA HU -3076 ; [.3D76.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BU -30D6 ; [.3D76.0020.0011][.0000.0037.0002] # KATAKANA LETTER BU -3077 ; [.3D76.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PU -30D7 ; [.3D76.0020.0011][.0000.0038.0002] # KATAKANA LETTER PU -3332 ; [.3D76.0020.001C][.3D5A.0020.001C][.3D82.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C][.0000.0037.001C] # SQUARE HUARADDO -3333 ; [.3D76.0020.001C][.3D5B.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C] # SQUARE HUIITO -3334 ; [.3D76.0020.001C][.0000.0037.001C][.3D6C.0020.001C][.3D66.0020.001C][.3D5E.0020.001C][.3D84.0020.001C] # SQUARE BUSSYERU -3335 ; [.3D76.0020.001C][.3D82.0020.001C][.3D8B.0020.001C] # SQUARE HURAN -3078 ; [.3D77.0020.000E] # HIRAGANA LETTER HE -31F8 ; [.3D77.0020.000F] # KATAKANA LETTER SMALL HE -30D8 ; [.3D77.0020.0011] # KATAKANA LETTER HE -FF8D ; [.3D77.0020.0012] # HALFWIDTH KATAKANA LETTER HE -32EC ; [.3D77.0020.0013] # CIRCLED KATAKANA HE -3079 ; [.3D77.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BE -30D9 ; [.3D77.0020.0011][.0000.0037.0002] # KATAKANA LETTER BE -307A ; [.3D77.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PE -30DA ; [.3D77.0020.0011][.0000.0038.0002] # KATAKANA LETTER PE -333B ; [.3D77.0020.001C][.0000.0038.001C][.1C0E.0020.001C][.3D66.0020.001C][.0000.0037.001C] # SQUARE PEEZI -333C ; [.3D77.0020.001C][.0000.0037.001C][.1C0E.0020.001C][.3D6A.0020.001C] # SQUARE BEETA -3336 ; [.3D77.0020.001C][.3D62.0020.001C][.3D6A.0020.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE HEKUTAARU -3337 ; [.3D77.0020.001C][.0000.0038.001C][.3D69.0020.001C] # SQUARE PESO -3338 ; [.3D77.0020.001C][.0000.0038.001C][.3D70.0020.001C][.3D75.0020.001C] # SQUARE PENIHI -3339 ; [.3D77.0020.001C][.3D84.0020.001C][.3D6C.0020.001C] # SQUARE HERUTU -333A ; [.3D77.0020.001C][.0000.0038.001C][.3D8B.0020.001C][.3D67.0020.001C] # SQUARE PENSU -307B ; [.3D78.0020.000E] # HIRAGANA LETTER HO -31F9 ; [.3D78.0020.000F] # KATAKANA LETTER SMALL HO -30DB ; [.3D78.0020.0011] # KATAKANA LETTER HO -FF8E ; [.3D78.0020.0012] # HALFWIDTH KATAKANA LETTER HO -32ED ; [.3D78.0020.0013] # CIRCLED KATAKANA HO -307C ; [.3D78.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BO -30DC ; [.3D78.0020.0011][.0000.0037.0002] # KATAKANA LETTER BO -307D ; [.3D78.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PO -30DD ; [.3D78.0020.0011][.0000.0038.0002] # KATAKANA LETTER PO -3341 ; [.3D78.0020.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE HOORU -3342 ; [.3D78.0020.001C][.1C0E.0020.001C][.3D8B.0020.001C] # SQUARE HOON -333D ; [.3D78.0020.001C][.0000.0038.001C][.3D5B.0020.001C][.3D8B.0020.001C][.3D6E.0020.001C] # SQUARE POINTO -1F200 ; [.3D78.0020.001C][.3D60.0020.001C] # SQUARE HIRAGANA HOKA -333E ; [.3D78.0020.001C][.0000.0037.001C][.3D84.0020.001C][.3D6E.0020.001C] # SQUARE BORUTO -333F ; [.3D78.0020.001C][.3D8B.0020.001C] # SQUARE HON -3340 ; [.3D78.0020.001C][.0000.0038.001C][.3D8B.0020.001C][.3D6E.0020.001C][.0000.0037.001C] # SQUARE PONDO -307E ; [.3D79.0020.000E] # HIRAGANA LETTER MA -30DE ; [.3D79.0020.0011] # KATAKANA LETTER MA -FF8F ; [.3D79.0020.0012] # HALFWIDTH KATAKANA LETTER MA -32EE ; [.3D79.0020.0013] # CIRCLED KATAKANA MA -3343 ; [.3D79.0020.001C][.3D5B.0020.001C][.3D62.0020.001C][.3D86.0020.001C] # SQUARE MAIKURO -3344 ; [.3D79.0020.001C][.3D5B.0020.001C][.3D84.0020.001C] # SQUARE MAIRU -303C ; [.3D79.0020.0004][.3D67.0020.0004] # MASU MARK -3345 ; [.3D79.0020.001C][.3D6C.0020.001C][.3D74.0020.001C] # SQUARE MAHHA -3346 ; [.3D79.0020.001C][.3D84.0020.001C][.3D62.0020.001C] # SQUARE MARUKU -3347 ; [.3D79.0020.001C][.3D8B.0020.001C][.3D66.0020.001C][.3D81.0020.001C][.3D8B.0020.001C] # SQUARE MANSYON -307F ; [.3D7A.0020.000E] # HIRAGANA LETTER MI -30DF ; [.3D7A.0020.0011] # KATAKANA LETTER MI -FF90 ; [.3D7A.0020.0012] # HALFWIDTH KATAKANA LETTER MI -32EF ; [.3D7A.0020.0013] # CIRCLED KATAKANA MI -3348 ; [.3D7A.0020.001C][.3D62.0020.001C][.3D86.0020.001C][.3D8B.0020.001C] # SQUARE MIKURON -3349 ; [.3D7A.0020.001C][.3D83.0020.001C] # SQUARE MIRI -334A ; [.3D7A.0020.001C][.3D83.0020.001C][.3D74.0020.001C][.0000.0037.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE MIRIBAARU -3080 ; [.3D7B.0020.000E] # HIRAGANA LETTER MU -31FA ; [.3D7B.0020.000F] # KATAKANA LETTER SMALL MU -30E0 ; [.3D7B.0020.0011] # KATAKANA LETTER MU -FF91 ; [.3D7B.0020.0012] # HALFWIDTH KATAKANA LETTER MU -32F0 ; [.3D7B.0020.0013] # CIRCLED KATAKANA MU -3081 ; [.3D7C.0020.000E] # HIRAGANA LETTER ME -30E1 ; [.3D7C.0020.0011] # KATAKANA LETTER ME -FF92 ; [.3D7C.0020.0012] # HALFWIDTH KATAKANA LETTER ME -32F1 ; [.3D7C.0020.0013] # CIRCLED KATAKANA ME -334D ; [.3D7C.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C][.3D84.0020.001C] # SQUARE MEETORU -334B ; [.3D7C.0020.001C][.3D60.0020.001C][.0000.0037.001C] # SQUARE MEGA -334C ; [.3D7C.0020.001C][.3D60.0020.001C][.0000.0037.001C][.3D6E.0020.001C][.3D8B.0020.001C] # SQUARE MEGATON -3082 ; [.3D7D.0020.000E] # HIRAGANA LETTER MO -30E2 ; [.3D7D.0020.0011] # KATAKANA LETTER MO -FF93 ; [.3D7D.0020.0012] # HALFWIDTH KATAKANA LETTER MO -32F2 ; [.3D7D.0020.0013] # CIRCLED KATAKANA MO -3083 ; [.3D7E.0020.000D] # HIRAGANA LETTER SMALL YA -3084 ; [.3D7E.0020.000E] # HIRAGANA LETTER YA -30E3 ; [.3D7E.0020.000F] # KATAKANA LETTER SMALL YA -FF6C ; [.3D7E.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YA -30E4 ; [.3D7E.0020.0011] # KATAKANA LETTER YA -FF94 ; [.3D7E.0020.0012] # HALFWIDTH KATAKANA LETTER YA -32F3 ; [.3D7E.0020.0013] # CIRCLED KATAKANA YA -334E ; [.3D7E.0020.001C][.1C0E.0020.001C][.3D6E.0020.001C][.0000.0037.001C] # SQUARE YAADO -334F ; [.3D7E.0020.001C][.1C0E.0020.001C][.3D84.0020.001C] # SQUARE YAARU -3085 ; [.3D7F.0020.000D] # HIRAGANA LETTER SMALL YU -3086 ; [.3D7F.0020.000E] # HIRAGANA LETTER YU -30E5 ; [.3D7F.0020.000F] # KATAKANA LETTER SMALL YU -FF6D ; [.3D7F.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YU -30E6 ; [.3D7F.0020.0011] # KATAKANA LETTER YU -FF95 ; [.3D7F.0020.0012] # HALFWIDTH KATAKANA LETTER YU -32F4 ; [.3D7F.0020.0013] # CIRCLED KATAKANA YU -3350 ; [.3D7F.0020.001C][.3D5A.0020.001C][.3D8B.0020.001C] # SQUARE YUAN -1B001 ; [.3D80.0020.000E] # HIRAGANA LETTER ARCHAIC YE -3087 ; [.3D81.0020.000D] # HIRAGANA LETTER SMALL YO -3088 ; [.3D81.0020.000E] # HIRAGANA LETTER YO -30E7 ; [.3D81.0020.000F] # KATAKANA LETTER SMALL YO -FF6E ; [.3D81.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YO -30E8 ; [.3D81.0020.0011] # KATAKANA LETTER YO -FF96 ; [.3D81.0020.0012] # HALFWIDTH KATAKANA LETTER YO -32F5 ; [.3D81.0020.0013] # CIRCLED KATAKANA YO -309F ; [.3D81.0020.0016][.3D83.0020.0016] # HIRAGANA DIGRAPH YORI -3089 ; [.3D82.0020.000E] # HIRAGANA LETTER RA -31FB ; [.3D82.0020.000F] # KATAKANA LETTER SMALL RA -30E9 ; [.3D82.0020.0011] # KATAKANA LETTER RA -FF97 ; [.3D82.0020.0012] # HALFWIDTH KATAKANA LETTER RA -32F6 ; [.3D82.0020.0013] # CIRCLED KATAKANA RA -308A ; [.3D83.0020.000E] # HIRAGANA LETTER RI -31FC ; [.3D83.0020.000F] # KATAKANA LETTER SMALL RI -30EA ; [.3D83.0020.0011] # KATAKANA LETTER RI -FF98 ; [.3D83.0020.0012] # HALFWIDTH KATAKANA LETTER RI -32F7 ; [.3D83.0020.0013] # CIRCLED KATAKANA RI -3351 ; [.3D83.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C][.3D84.0020.001C] # SQUARE RITTORU -3352 ; [.3D83.0020.001C][.3D82.0020.001C] # SQUARE RIRA -308B ; [.3D84.0020.000E] # HIRAGANA LETTER RU -31FD ; [.3D84.0020.000F] # KATAKANA LETTER SMALL RU -30EB ; [.3D84.0020.0011] # KATAKANA LETTER RU -FF99 ; [.3D84.0020.0012] # HALFWIDTH KATAKANA LETTER RU -32F8 ; [.3D84.0020.0013] # CIRCLED KATAKANA RU -3354 ; [.3D84.0020.001C][.1C0E.0020.001C][.3D76.0020.001C][.0000.0037.001C][.3D84.0020.001C] # SQUARE RUUBURU -3353 ; [.3D84.0020.001C][.3D75.0020.001C][.0000.0038.001C][.1C0E.0020.001C] # SQUARE RUPII -308C ; [.3D85.0020.000E] # HIRAGANA LETTER RE -31FE ; [.3D85.0020.000F] # KATAKANA LETTER SMALL RE -30EC ; [.3D85.0020.0011] # KATAKANA LETTER RE -FF9A ; [.3D85.0020.0012] # HALFWIDTH KATAKANA LETTER RE -32F9 ; [.3D85.0020.0013] # CIRCLED KATAKANA RE -3355 ; [.3D85.0020.001C][.3D7B.0020.001C] # SQUARE REMU -3356 ; [.3D85.0020.001C][.3D8B.0020.001C][.3D6E.0020.001C][.3D63.0020.001C][.0000.0037.001C][.3D8B.0020.001C] # SQUARE RENTOGEN -308D ; [.3D86.0020.000E] # HIRAGANA LETTER RO -31FF ; [.3D86.0020.000F] # KATAKANA LETTER SMALL RO -30ED ; [.3D86.0020.0011] # KATAKANA LETTER RO -FF9B ; [.3D86.0020.0012] # HALFWIDTH KATAKANA LETTER RO -32FA ; [.3D86.0020.0013] # CIRCLED KATAKANA RO -308E ; [.3D87.0020.000D] # HIRAGANA LETTER SMALL WA -308F ; [.3D87.0020.000E] # HIRAGANA LETTER WA -30EE ; [.3D87.0020.000F] # KATAKANA LETTER SMALL WA -30EF ; [.3D87.0020.0011] # KATAKANA LETTER WA -FF9C ; [.3D87.0020.0012] # HALFWIDTH KATAKANA LETTER WA -32FB ; [.3D87.0020.0013] # CIRCLED KATAKANA WA -30F7 ; [.3D87.0020.0011][.0000.0037.0002] # KATAKANA LETTER VA -3357 ; [.3D87.0020.001C][.3D6C.0020.001C][.3D6E.0020.001C] # SQUARE WATTO -3090 ; [.3D88.0020.000E] # HIRAGANA LETTER WI -30F0 ; [.3D88.0020.0011] # KATAKANA LETTER WI -32FC ; [.3D88.0020.0013] # CIRCLED KATAKANA WI -30F8 ; [.3D88.0020.0011][.0000.0037.0002] # KATAKANA LETTER VI -3091 ; [.3D89.0020.000E] # HIRAGANA LETTER WE -30F1 ; [.3D89.0020.0011] # KATAKANA LETTER WE -32FD ; [.3D89.0020.0013] # CIRCLED KATAKANA WE -30F9 ; [.3D89.0020.0011][.0000.0037.0002] # KATAKANA LETTER VE -3092 ; [.3D8A.0020.000E] # HIRAGANA LETTER WO -30F2 ; [.3D8A.0020.0011] # KATAKANA LETTER WO -FF66 ; [.3D8A.0020.0012] # HALFWIDTH KATAKANA LETTER WO -32FE ; [.3D8A.0020.0013] # CIRCLED KATAKANA WO -30FA ; [.3D8A.0020.0011][.0000.0037.0002] # KATAKANA LETTER VO -3093 ; [.3D8B.0020.000E] # HIRAGANA LETTER N -30F3 ; [.3D8B.0020.0011] # KATAKANA LETTER N -FF9D ; [.3D8B.0020.0012] # HALFWIDTH KATAKANA LETTER N -3105 ; [.3D8C.0020.0002] # BOPOMOFO LETTER B -31A0 ; [.3D8C.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER BU -3106 ; [.3D8D.0020.0002] # BOPOMOFO LETTER P -31B4 ; [.3D8D.0020.0019] # BOPOMOFO FINAL LETTER P -3107 ; [.3D8E.0020.0002] # BOPOMOFO LETTER M -3108 ; [.3D8F.0020.0002] # BOPOMOFO LETTER F -312A ; [.3D90.0020.0002] # BOPOMOFO LETTER V -3109 ; [.3D91.0020.0002] # BOPOMOFO LETTER D -310A ; [.3D92.0020.0002] # BOPOMOFO LETTER T -31B5 ; [.3D92.0020.0019] # BOPOMOFO FINAL LETTER T -310B ; [.3D93.0020.0002] # BOPOMOFO LETTER N -310C ; [.3D94.0020.0002] # BOPOMOFO LETTER L -310D ; [.3D95.0020.0002] # BOPOMOFO LETTER G -31A3 ; [.3D95.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER GU -310E ; [.3D96.0020.0002] # BOPOMOFO LETTER K -31B6 ; [.3D96.0020.0019] # BOPOMOFO FINAL LETTER K -312B ; [.3D97.0020.0002] # BOPOMOFO LETTER NG -31AD ; [.3D98.0020.0002] # BOPOMOFO LETTER NGG -310F ; [.3D99.0020.0002] # BOPOMOFO LETTER H -31B7 ; [.3D99.0020.0019] # BOPOMOFO FINAL LETTER H -3110 ; [.3D9A.0020.0002] # BOPOMOFO LETTER J -31A2 ; [.3D9A.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER JI -3111 ; [.3D9B.0020.0002] # BOPOMOFO LETTER Q -3112 ; [.3D9C.0020.0002] # BOPOMOFO LETTER X -312C ; [.3D9D.0020.0002] # BOPOMOFO LETTER GN -3113 ; [.3D9E.0020.0002] # BOPOMOFO LETTER ZH -3114 ; [.3D9F.0020.0002] # BOPOMOFO LETTER CH -3115 ; [.3DA0.0020.0002] # BOPOMOFO LETTER SH -3116 ; [.3DA1.0020.0002] # BOPOMOFO LETTER R -3117 ; [.3DA2.0020.0002] # BOPOMOFO LETTER Z -31A1 ; [.3DA2.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER ZI -3118 ; [.3DA3.0020.0002] # BOPOMOFO LETTER C -3119 ; [.3DA4.0020.0002] # BOPOMOFO LETTER S -31B8 ; [.3DA5.0020.0002] # BOPOMOFO LETTER GH -31B9 ; [.3DA6.0020.0002] # BOPOMOFO LETTER LH -31BA ; [.3DA7.0020.0002] # BOPOMOFO LETTER ZY -311A ; [.3DA8.0020.0002] # BOPOMOFO LETTER A -31A9 ; [.3DA8.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER ANN -311B ; [.3DA9.0020.0002] # BOPOMOFO LETTER O -31A7 ; [.3DA9.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER ONN -31A6 ; [.3DAA.0020.0002] # BOPOMOFO LETTER OO -311C ; [.3DAB.0020.0002] # BOPOMOFO LETTER E -311D ; [.3DAC.0020.0002] # BOPOMOFO LETTER EH -31A4 ; [.3DAD.0020.0002] # BOPOMOFO LETTER EE -31A5 ; [.3DAD.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER ENN -311E ; [.3DAE.0020.0002] # BOPOMOFO LETTER AI -31AE ; [.3DAE.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER AINN -311F ; [.3DAF.0020.0002] # BOPOMOFO LETTER EI -3120 ; [.3DB0.0020.0002] # BOPOMOFO LETTER AU -31AF ; [.3DB0.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER AUNN -3121 ; [.3DB1.0020.0002] # BOPOMOFO LETTER OU -3122 ; [.3DB2.0020.0002] # BOPOMOFO LETTER AN -3123 ; [.3DB3.0020.0002] # BOPOMOFO LETTER EN -3124 ; [.3DB4.0020.0002] # BOPOMOFO LETTER ANG -31B2 ; [.3DB5.0020.0002] # BOPOMOFO LETTER ONG -3125 ; [.3DB6.0020.0002] # BOPOMOFO LETTER ENG -31B0 ; [.3DB7.0020.0002] # BOPOMOFO LETTER AM -31B1 ; [.3DB8.0020.0002] # BOPOMOFO LETTER OM -31AC ; [.3DB9.0020.0002] # BOPOMOFO LETTER IM -3126 ; [.3DBA.0020.0002] # BOPOMOFO LETTER ER -3127 ; [.3DBB.0020.0002] # BOPOMOFO LETTER I -31AA ; [.3DBB.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER INN -31B3 ; [.3DBB.0020.0016][.0000.0111.0016] # BOPOMOFO LETTER INNN -3128 ; [.3DBC.0020.0002] # BOPOMOFO LETTER U -31AB ; [.3DBC.0020.0004][.0000.0111.0004] # BOPOMOFO LETTER UNN -31A8 ; [.3DBC.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER IR -3129 ; [.3DBD.0020.0002] # BOPOMOFO LETTER IU -312D ; [.3DBE.0020.0002] # BOPOMOFO LETTER IH -A000 ; [.3DBF.0020.0002] # YI SYLLABLE IT -A001 ; [.3DC0.0020.0002] # YI SYLLABLE IX -A002 ; [.3DC1.0020.0002] # YI SYLLABLE I -A003 ; [.3DC2.0020.0002] # YI SYLLABLE IP -A004 ; [.3DC3.0020.0002] # YI SYLLABLE IET -A005 ; [.3DC4.0020.0002] # YI SYLLABLE IEX -A006 ; [.3DC5.0020.0002] # YI SYLLABLE IE -A007 ; [.3DC6.0020.0002] # YI SYLLABLE IEP -A008 ; [.3DC7.0020.0002] # YI SYLLABLE AT -A009 ; [.3DC8.0020.0002] # YI SYLLABLE AX -A00A ; [.3DC9.0020.0002] # YI SYLLABLE A -A00B ; [.3DCA.0020.0002] # YI SYLLABLE AP -A00C ; [.3DCB.0020.0002] # YI SYLLABLE UOX -A00D ; [.3DCC.0020.0002] # YI SYLLABLE UO -A00E ; [.3DCD.0020.0002] # YI SYLLABLE UOP -A00F ; [.3DCE.0020.0002] # YI SYLLABLE OT -A010 ; [.3DCF.0020.0002] # YI SYLLABLE OX -A011 ; [.3DD0.0020.0002] # YI SYLLABLE O -A012 ; [.3DD1.0020.0002] # YI SYLLABLE OP -A013 ; [.3DD2.0020.0002] # YI SYLLABLE EX -A014 ; [.3DD3.0020.0002] # YI SYLLABLE E -A015 ; [.3DD4.0020.0002] # YI SYLLABLE WU -A016 ; [.3DD5.0020.0002] # YI SYLLABLE BIT -A017 ; [.3DD6.0020.0002] # YI SYLLABLE BIX -A018 ; [.3DD7.0020.0002] # YI SYLLABLE BI -A019 ; [.3DD8.0020.0002] # YI SYLLABLE BIP -A01A ; [.3DD9.0020.0002] # YI SYLLABLE BIET -A01B ; [.3DDA.0020.0002] # YI SYLLABLE BIEX -A01C ; [.3DDB.0020.0002] # YI SYLLABLE BIE -A01D ; [.3DDC.0020.0002] # YI SYLLABLE BIEP -A01E ; [.3DDD.0020.0002] # YI SYLLABLE BAT -A01F ; [.3DDE.0020.0002] # YI SYLLABLE BAX -A020 ; [.3DDF.0020.0002] # YI SYLLABLE BA -A021 ; [.3DE0.0020.0002] # YI SYLLABLE BAP -A022 ; [.3DE1.0020.0002] # YI SYLLABLE BUOX -A023 ; [.3DE2.0020.0002] # YI SYLLABLE BUO -A024 ; [.3DE3.0020.0002] # YI SYLLABLE BUOP -A025 ; [.3DE4.0020.0002] # YI SYLLABLE BOT -A026 ; [.3DE5.0020.0002] # YI SYLLABLE BOX -A027 ; [.3DE6.0020.0002] # YI SYLLABLE BO -A028 ; [.3DE7.0020.0002] # YI SYLLABLE BOP -A029 ; [.3DE8.0020.0002] # YI SYLLABLE BEX -A02A ; [.3DE9.0020.0002] # YI SYLLABLE BE -A02B ; [.3DEA.0020.0002] # YI SYLLABLE BEP -A02C ; [.3DEB.0020.0002] # YI SYLLABLE BUT -A02D ; [.3DEC.0020.0002] # YI SYLLABLE BUX -A02E ; [.3DED.0020.0002] # YI SYLLABLE BU -A02F ; [.3DEE.0020.0002] # YI SYLLABLE BUP -A030 ; [.3DEF.0020.0002] # YI SYLLABLE BURX -A031 ; [.3DF0.0020.0002] # YI SYLLABLE BUR -A032 ; [.3DF1.0020.0002] # YI SYLLABLE BYT -A033 ; [.3DF2.0020.0002] # YI SYLLABLE BYX -A034 ; [.3DF3.0020.0002] # YI SYLLABLE BY -A035 ; [.3DF4.0020.0002] # YI SYLLABLE BYP -A036 ; [.3DF5.0020.0002] # YI SYLLABLE BYRX -A037 ; [.3DF6.0020.0002] # YI SYLLABLE BYR -A038 ; [.3DF7.0020.0002] # YI SYLLABLE PIT -A039 ; [.3DF8.0020.0002] # YI SYLLABLE PIX -A03A ; [.3DF9.0020.0002] # YI SYLLABLE PI -A03B ; [.3DFA.0020.0002] # YI SYLLABLE PIP -A03C ; [.3DFB.0020.0002] # YI SYLLABLE PIEX -A03D ; [.3DFC.0020.0002] # YI SYLLABLE PIE -A03E ; [.3DFD.0020.0002] # YI SYLLABLE PIEP -A03F ; [.3DFE.0020.0002] # YI SYLLABLE PAT -A040 ; [.3DFF.0020.0002] # YI SYLLABLE PAX -A041 ; [.3E00.0020.0002] # YI SYLLABLE PA -A042 ; [.3E01.0020.0002] # YI SYLLABLE PAP -A043 ; [.3E02.0020.0002] # YI SYLLABLE PUOX -A044 ; [.3E03.0020.0002] # YI SYLLABLE PUO -A045 ; [.3E04.0020.0002] # YI SYLLABLE PUOP -A046 ; [.3E05.0020.0002] # YI SYLLABLE POT -A047 ; [.3E06.0020.0002] # YI SYLLABLE POX -A048 ; [.3E07.0020.0002] # YI SYLLABLE PO -A049 ; [.3E08.0020.0002] # YI SYLLABLE POP -A04A ; [.3E09.0020.0002] # YI SYLLABLE PUT -A04B ; [.3E0A.0020.0002] # YI SYLLABLE PUX -A04C ; [.3E0B.0020.0002] # YI SYLLABLE PU -A04D ; [.3E0C.0020.0002] # YI SYLLABLE PUP -A04E ; [.3E0D.0020.0002] # YI SYLLABLE PURX -A04F ; [.3E0E.0020.0002] # YI SYLLABLE PUR -A050 ; [.3E0F.0020.0002] # YI SYLLABLE PYT -A051 ; [.3E10.0020.0002] # YI SYLLABLE PYX -A052 ; [.3E11.0020.0002] # YI SYLLABLE PY -A053 ; [.3E12.0020.0002] # YI SYLLABLE PYP -A054 ; [.3E13.0020.0002] # YI SYLLABLE PYRX -A055 ; [.3E14.0020.0002] # YI SYLLABLE PYR -A056 ; [.3E15.0020.0002] # YI SYLLABLE BBIT -A057 ; [.3E16.0020.0002] # YI SYLLABLE BBIX -A058 ; [.3E17.0020.0002] # YI SYLLABLE BBI -A059 ; [.3E18.0020.0002] # YI SYLLABLE BBIP -A05A ; [.3E19.0020.0002] # YI SYLLABLE BBIET -A05B ; [.3E1A.0020.0002] # YI SYLLABLE BBIEX -A05C ; [.3E1B.0020.0002] # YI SYLLABLE BBIE -A05D ; [.3E1C.0020.0002] # YI SYLLABLE BBIEP -A05E ; [.3E1D.0020.0002] # YI SYLLABLE BBAT -A05F ; [.3E1E.0020.0002] # YI SYLLABLE BBAX -A060 ; [.3E1F.0020.0002] # YI SYLLABLE BBA -A061 ; [.3E20.0020.0002] # YI SYLLABLE BBAP -A062 ; [.3E21.0020.0002] # YI SYLLABLE BBUOX -A063 ; [.3E22.0020.0002] # YI SYLLABLE BBUO -A064 ; [.3E23.0020.0002] # YI SYLLABLE BBUOP -A065 ; [.3E24.0020.0002] # YI SYLLABLE BBOT -A066 ; [.3E25.0020.0002] # YI SYLLABLE BBOX -A067 ; [.3E26.0020.0002] # YI SYLLABLE BBO -A068 ; [.3E27.0020.0002] # YI SYLLABLE BBOP -A069 ; [.3E28.0020.0002] # YI SYLLABLE BBEX -A06A ; [.3E29.0020.0002] # YI SYLLABLE BBE -A06B ; [.3E2A.0020.0002] # YI SYLLABLE BBEP -A06C ; [.3E2B.0020.0002] # YI SYLLABLE BBUT -A06D ; [.3E2C.0020.0002] # YI SYLLABLE BBUX -A06E ; [.3E2D.0020.0002] # YI SYLLABLE BBU -A06F ; [.3E2E.0020.0002] # YI SYLLABLE BBUP -A070 ; [.3E2F.0020.0002] # YI SYLLABLE BBURX -A071 ; [.3E30.0020.0002] # YI SYLLABLE BBUR -A072 ; [.3E31.0020.0002] # YI SYLLABLE BBYT -A073 ; [.3E32.0020.0002] # YI SYLLABLE BBYX -A074 ; [.3E33.0020.0002] # YI SYLLABLE BBY -A075 ; [.3E34.0020.0002] # YI SYLLABLE BBYP -A076 ; [.3E35.0020.0002] # YI SYLLABLE NBIT -A077 ; [.3E36.0020.0002] # YI SYLLABLE NBIX -A078 ; [.3E37.0020.0002] # YI SYLLABLE NBI -A079 ; [.3E38.0020.0002] # YI SYLLABLE NBIP -A07A ; [.3E39.0020.0002] # YI SYLLABLE NBIEX -A07B ; [.3E3A.0020.0002] # YI SYLLABLE NBIE -A07C ; [.3E3B.0020.0002] # YI SYLLABLE NBIEP -A07D ; [.3E3C.0020.0002] # YI SYLLABLE NBAT -A07E ; [.3E3D.0020.0002] # YI SYLLABLE NBAX -A07F ; [.3E3E.0020.0002] # YI SYLLABLE NBA -A080 ; [.3E3F.0020.0002] # YI SYLLABLE NBAP -A081 ; [.3E40.0020.0002] # YI SYLLABLE NBOT -A082 ; [.3E41.0020.0002] # YI SYLLABLE NBOX -A083 ; [.3E42.0020.0002] # YI SYLLABLE NBO -A084 ; [.3E43.0020.0002] # YI SYLLABLE NBOP -A085 ; [.3E44.0020.0002] # YI SYLLABLE NBUT -A086 ; [.3E45.0020.0002] # YI SYLLABLE NBUX -A087 ; [.3E46.0020.0002] # YI SYLLABLE NBU -A088 ; [.3E47.0020.0002] # YI SYLLABLE NBUP -A089 ; [.3E48.0020.0002] # YI SYLLABLE NBURX -A08A ; [.3E49.0020.0002] # YI SYLLABLE NBUR -A08B ; [.3E4A.0020.0002] # YI SYLLABLE NBYT -A08C ; [.3E4B.0020.0002] # YI SYLLABLE NBYX -A08D ; [.3E4C.0020.0002] # YI SYLLABLE NBY -A08E ; [.3E4D.0020.0002] # YI SYLLABLE NBYP -A08F ; [.3E4E.0020.0002] # YI SYLLABLE NBYRX -A090 ; [.3E4F.0020.0002] # YI SYLLABLE NBYR -A091 ; [.3E50.0020.0002] # YI SYLLABLE HMIT -A092 ; [.3E51.0020.0002] # YI SYLLABLE HMIX -A093 ; [.3E52.0020.0002] # YI SYLLABLE HMI -A094 ; [.3E53.0020.0002] # YI SYLLABLE HMIP -A095 ; [.3E54.0020.0002] # YI SYLLABLE HMIEX -A096 ; [.3E55.0020.0002] # YI SYLLABLE HMIE -A097 ; [.3E56.0020.0002] # YI SYLLABLE HMIEP -A098 ; [.3E57.0020.0002] # YI SYLLABLE HMAT -A099 ; [.3E58.0020.0002] # YI SYLLABLE HMAX -A09A ; [.3E59.0020.0002] # YI SYLLABLE HMA -A09B ; [.3E5A.0020.0002] # YI SYLLABLE HMAP -A09C ; [.3E5B.0020.0002] # YI SYLLABLE HMUOX -A09D ; [.3E5C.0020.0002] # YI SYLLABLE HMUO -A09E ; [.3E5D.0020.0002] # YI SYLLABLE HMUOP -A09F ; [.3E5E.0020.0002] # YI SYLLABLE HMOT -A0A0 ; [.3E5F.0020.0002] # YI SYLLABLE HMOX -A0A1 ; [.3E60.0020.0002] # YI SYLLABLE HMO -A0A2 ; [.3E61.0020.0002] # YI SYLLABLE HMOP -A0A3 ; [.3E62.0020.0002] # YI SYLLABLE HMUT -A0A4 ; [.3E63.0020.0002] # YI SYLLABLE HMUX -A0A5 ; [.3E64.0020.0002] # YI SYLLABLE HMU -A0A6 ; [.3E65.0020.0002] # YI SYLLABLE HMUP -A0A7 ; [.3E66.0020.0002] # YI SYLLABLE HMURX -A0A8 ; [.3E67.0020.0002] # YI SYLLABLE HMUR -A0A9 ; [.3E68.0020.0002] # YI SYLLABLE HMYX -A0AA ; [.3E69.0020.0002] # YI SYLLABLE HMY -A0AB ; [.3E6A.0020.0002] # YI SYLLABLE HMYP -A0AC ; [.3E6B.0020.0002] # YI SYLLABLE HMYRX -A0AD ; [.3E6C.0020.0002] # YI SYLLABLE HMYR -A0AE ; [.3E6D.0020.0002] # YI SYLLABLE MIT -A0AF ; [.3E6E.0020.0002] # YI SYLLABLE MIX -A0B0 ; [.3E6F.0020.0002] # YI SYLLABLE MI -A0B1 ; [.3E70.0020.0002] # YI SYLLABLE MIP -A0B2 ; [.3E71.0020.0002] # YI SYLLABLE MIEX -A0B3 ; [.3E72.0020.0002] # YI SYLLABLE MIE -A0B4 ; [.3E73.0020.0002] # YI SYLLABLE MIEP -A0B5 ; [.3E74.0020.0002] # YI SYLLABLE MAT -A0B6 ; [.3E75.0020.0002] # YI SYLLABLE MAX -A0B7 ; [.3E76.0020.0002] # YI SYLLABLE MA -A0B8 ; [.3E77.0020.0002] # YI SYLLABLE MAP -A0B9 ; [.3E78.0020.0002] # YI SYLLABLE MUOT -A0BA ; [.3E79.0020.0002] # YI SYLLABLE MUOX -A0BB ; [.3E7A.0020.0002] # YI SYLLABLE MUO -A0BC ; [.3E7B.0020.0002] # YI SYLLABLE MUOP -A0BD ; [.3E7C.0020.0002] # YI SYLLABLE MOT -A0BE ; [.3E7D.0020.0002] # YI SYLLABLE MOX -A0BF ; [.3E7E.0020.0002] # YI SYLLABLE MO -A0C0 ; [.3E7F.0020.0002] # YI SYLLABLE MOP -A0C1 ; [.3E80.0020.0002] # YI SYLLABLE MEX -A0C2 ; [.3E81.0020.0002] # YI SYLLABLE ME -A0C3 ; [.3E82.0020.0002] # YI SYLLABLE MUT -A0C4 ; [.3E83.0020.0002] # YI SYLLABLE MUX -A0C5 ; [.3E84.0020.0002] # YI SYLLABLE MU -A0C6 ; [.3E85.0020.0002] # YI SYLLABLE MUP -A0C7 ; [.3E86.0020.0002] # YI SYLLABLE MURX -A0C8 ; [.3E87.0020.0002] # YI SYLLABLE MUR -A0C9 ; [.3E88.0020.0002] # YI SYLLABLE MYT -A0CA ; [.3E89.0020.0002] # YI SYLLABLE MYX -A0CB ; [.3E8A.0020.0002] # YI SYLLABLE MY -A0CC ; [.3E8B.0020.0002] # YI SYLLABLE MYP -A0CD ; [.3E8C.0020.0002] # YI SYLLABLE FIT -A0CE ; [.3E8D.0020.0002] # YI SYLLABLE FIX -A0CF ; [.3E8E.0020.0002] # YI SYLLABLE FI -A0D0 ; [.3E8F.0020.0002] # YI SYLLABLE FIP -A0D1 ; [.3E90.0020.0002] # YI SYLLABLE FAT -A0D2 ; [.3E91.0020.0002] # YI SYLLABLE FAX -A0D3 ; [.3E92.0020.0002] # YI SYLLABLE FA -A0D4 ; [.3E93.0020.0002] # YI SYLLABLE FAP -A0D5 ; [.3E94.0020.0002] # YI SYLLABLE FOX -A0D6 ; [.3E95.0020.0002] # YI SYLLABLE FO -A0D7 ; [.3E96.0020.0002] # YI SYLLABLE FOP -A0D8 ; [.3E97.0020.0002] # YI SYLLABLE FUT -A0D9 ; [.3E98.0020.0002] # YI SYLLABLE FUX -A0DA ; [.3E99.0020.0002] # YI SYLLABLE FU -A0DB ; [.3E9A.0020.0002] # YI SYLLABLE FUP -A0DC ; [.3E9B.0020.0002] # YI SYLLABLE FURX -A0DD ; [.3E9C.0020.0002] # YI SYLLABLE FUR -A0DE ; [.3E9D.0020.0002] # YI SYLLABLE FYT -A0DF ; [.3E9E.0020.0002] # YI SYLLABLE FYX -A0E0 ; [.3E9F.0020.0002] # YI SYLLABLE FY -A0E1 ; [.3EA0.0020.0002] # YI SYLLABLE FYP -A0E2 ; [.3EA1.0020.0002] # YI SYLLABLE VIT -A0E3 ; [.3EA2.0020.0002] # YI SYLLABLE VIX -A0E4 ; [.3EA3.0020.0002] # YI SYLLABLE VI -A0E5 ; [.3EA4.0020.0002] # YI SYLLABLE VIP -A0E6 ; [.3EA5.0020.0002] # YI SYLLABLE VIET -A0E7 ; [.3EA6.0020.0002] # YI SYLLABLE VIEX -A0E8 ; [.3EA7.0020.0002] # YI SYLLABLE VIE -A0E9 ; [.3EA8.0020.0002] # YI SYLLABLE VIEP -A0EA ; [.3EA9.0020.0002] # YI SYLLABLE VAT -A0EB ; [.3EAA.0020.0002] # YI SYLLABLE VAX -A0EC ; [.3EAB.0020.0002] # YI SYLLABLE VA -A0ED ; [.3EAC.0020.0002] # YI SYLLABLE VAP -A0EE ; [.3EAD.0020.0002] # YI SYLLABLE VOT -A0EF ; [.3EAE.0020.0002] # YI SYLLABLE VOX -A0F0 ; [.3EAF.0020.0002] # YI SYLLABLE VO -A0F1 ; [.3EB0.0020.0002] # YI SYLLABLE VOP -A0F2 ; [.3EB1.0020.0002] # YI SYLLABLE VEX -A0F3 ; [.3EB2.0020.0002] # YI SYLLABLE VEP -A0F4 ; [.3EB3.0020.0002] # YI SYLLABLE VUT -A0F5 ; [.3EB4.0020.0002] # YI SYLLABLE VUX -A0F6 ; [.3EB5.0020.0002] # YI SYLLABLE VU -A0F7 ; [.3EB6.0020.0002] # YI SYLLABLE VUP -A0F8 ; [.3EB7.0020.0002] # YI SYLLABLE VURX -A0F9 ; [.3EB8.0020.0002] # YI SYLLABLE VUR -A0FA ; [.3EB9.0020.0002] # YI SYLLABLE VYT -A0FB ; [.3EBA.0020.0002] # YI SYLLABLE VYX -A0FC ; [.3EBB.0020.0002] # YI SYLLABLE VY -A0FD ; [.3EBC.0020.0002] # YI SYLLABLE VYP -A0FE ; [.3EBD.0020.0002] # YI SYLLABLE VYRX -A0FF ; [.3EBE.0020.0002] # YI SYLLABLE VYR -A100 ; [.3EBF.0020.0002] # YI SYLLABLE DIT -A101 ; [.3EC0.0020.0002] # YI SYLLABLE DIX -A102 ; [.3EC1.0020.0002] # YI SYLLABLE DI -A103 ; [.3EC2.0020.0002] # YI SYLLABLE DIP -A104 ; [.3EC3.0020.0002] # YI SYLLABLE DIEX -A105 ; [.3EC4.0020.0002] # YI SYLLABLE DIE -A106 ; [.3EC5.0020.0002] # YI SYLLABLE DIEP -A107 ; [.3EC6.0020.0002] # YI SYLLABLE DAT -A108 ; [.3EC7.0020.0002] # YI SYLLABLE DAX -A109 ; [.3EC8.0020.0002] # YI SYLLABLE DA -A10A ; [.3EC9.0020.0002] # YI SYLLABLE DAP -A10B ; [.3ECA.0020.0002] # YI SYLLABLE DUOX -A10C ; [.3ECB.0020.0002] # YI SYLLABLE DUO -A10D ; [.3ECC.0020.0002] # YI SYLLABLE DOT -A10E ; [.3ECD.0020.0002] # YI SYLLABLE DOX -A10F ; [.3ECE.0020.0002] # YI SYLLABLE DO -A110 ; [.3ECF.0020.0002] # YI SYLLABLE DOP -A111 ; [.3ED0.0020.0002] # YI SYLLABLE DEX -A112 ; [.3ED1.0020.0002] # YI SYLLABLE DE -A113 ; [.3ED2.0020.0002] # YI SYLLABLE DEP -A114 ; [.3ED3.0020.0002] # YI SYLLABLE DUT -A115 ; [.3ED4.0020.0002] # YI SYLLABLE DUX -A116 ; [.3ED5.0020.0002] # YI SYLLABLE DU -A117 ; [.3ED6.0020.0002] # YI SYLLABLE DUP -A118 ; [.3ED7.0020.0002] # YI SYLLABLE DURX -A119 ; [.3ED8.0020.0002] # YI SYLLABLE DUR -A11A ; [.3ED9.0020.0002] # YI SYLLABLE TIT -A11B ; [.3EDA.0020.0002] # YI SYLLABLE TIX -A11C ; [.3EDB.0020.0002] # YI SYLLABLE TI -A11D ; [.3EDC.0020.0002] # YI SYLLABLE TIP -A11E ; [.3EDD.0020.0002] # YI SYLLABLE TIEX -A11F ; [.3EDE.0020.0002] # YI SYLLABLE TIE -A120 ; [.3EDF.0020.0002] # YI SYLLABLE TIEP -A121 ; [.3EE0.0020.0002] # YI SYLLABLE TAT -A122 ; [.3EE1.0020.0002] # YI SYLLABLE TAX -A123 ; [.3EE2.0020.0002] # YI SYLLABLE TA -A124 ; [.3EE3.0020.0002] # YI SYLLABLE TAP -A125 ; [.3EE4.0020.0002] # YI SYLLABLE TUOT -A126 ; [.3EE5.0020.0002] # YI SYLLABLE TUOX -A127 ; [.3EE6.0020.0002] # YI SYLLABLE TUO -A128 ; [.3EE7.0020.0002] # YI SYLLABLE TUOP -A129 ; [.3EE8.0020.0002] # YI SYLLABLE TOT -A12A ; [.3EE9.0020.0002] # YI SYLLABLE TOX -A12B ; [.3EEA.0020.0002] # YI SYLLABLE TO -A12C ; [.3EEB.0020.0002] # YI SYLLABLE TOP -A12D ; [.3EEC.0020.0002] # YI SYLLABLE TEX -A12E ; [.3EED.0020.0002] # YI SYLLABLE TE -A12F ; [.3EEE.0020.0002] # YI SYLLABLE TEP -A130 ; [.3EEF.0020.0002] # YI SYLLABLE TUT -A131 ; [.3EF0.0020.0002] # YI SYLLABLE TUX -A132 ; [.3EF1.0020.0002] # YI SYLLABLE TU -A133 ; [.3EF2.0020.0002] # YI SYLLABLE TUP -A134 ; [.3EF3.0020.0002] # YI SYLLABLE TURX -A135 ; [.3EF4.0020.0002] # YI SYLLABLE TUR -A136 ; [.3EF5.0020.0002] # YI SYLLABLE DDIT -A137 ; [.3EF6.0020.0002] # YI SYLLABLE DDIX -A138 ; [.3EF7.0020.0002] # YI SYLLABLE DDI -A139 ; [.3EF8.0020.0002] # YI SYLLABLE DDIP -A13A ; [.3EF9.0020.0002] # YI SYLLABLE DDIEX -A13B ; [.3EFA.0020.0002] # YI SYLLABLE DDIE -A13C ; [.3EFB.0020.0002] # YI SYLLABLE DDIEP -A13D ; [.3EFC.0020.0002] # YI SYLLABLE DDAT -A13E ; [.3EFD.0020.0002] # YI SYLLABLE DDAX -A13F ; [.3EFE.0020.0002] # YI SYLLABLE DDA -A140 ; [.3EFF.0020.0002] # YI SYLLABLE DDAP -A141 ; [.3F00.0020.0002] # YI SYLLABLE DDUOX -A142 ; [.3F01.0020.0002] # YI SYLLABLE DDUO -A143 ; [.3F02.0020.0002] # YI SYLLABLE DDUOP -A144 ; [.3F03.0020.0002] # YI SYLLABLE DDOT -A145 ; [.3F04.0020.0002] # YI SYLLABLE DDOX -A146 ; [.3F05.0020.0002] # YI SYLLABLE DDO -A147 ; [.3F06.0020.0002] # YI SYLLABLE DDOP -A148 ; [.3F07.0020.0002] # YI SYLLABLE DDEX -A149 ; [.3F08.0020.0002] # YI SYLLABLE DDE -A14A ; [.3F09.0020.0002] # YI SYLLABLE DDEP -A14B ; [.3F0A.0020.0002] # YI SYLLABLE DDUT -A14C ; [.3F0B.0020.0002] # YI SYLLABLE DDUX -A14D ; [.3F0C.0020.0002] # YI SYLLABLE DDU -A14E ; [.3F0D.0020.0002] # YI SYLLABLE DDUP -A14F ; [.3F0E.0020.0002] # YI SYLLABLE DDURX -A150 ; [.3F0F.0020.0002] # YI SYLLABLE DDUR -A151 ; [.3F10.0020.0002] # YI SYLLABLE NDIT -A152 ; [.3F11.0020.0002] # YI SYLLABLE NDIX -A153 ; [.3F12.0020.0002] # YI SYLLABLE NDI -A154 ; [.3F13.0020.0002] # YI SYLLABLE NDIP -A155 ; [.3F14.0020.0002] # YI SYLLABLE NDIEX -A156 ; [.3F15.0020.0002] # YI SYLLABLE NDIE -A157 ; [.3F16.0020.0002] # YI SYLLABLE NDAT -A158 ; [.3F17.0020.0002] # YI SYLLABLE NDAX -A159 ; [.3F18.0020.0002] # YI SYLLABLE NDA -A15A ; [.3F19.0020.0002] # YI SYLLABLE NDAP -A15B ; [.3F1A.0020.0002] # YI SYLLABLE NDOT -A15C ; [.3F1B.0020.0002] # YI SYLLABLE NDOX -A15D ; [.3F1C.0020.0002] # YI SYLLABLE NDO -A15E ; [.3F1D.0020.0002] # YI SYLLABLE NDOP -A15F ; [.3F1E.0020.0002] # YI SYLLABLE NDEX -A160 ; [.3F1F.0020.0002] # YI SYLLABLE NDE -A161 ; [.3F20.0020.0002] # YI SYLLABLE NDEP -A162 ; [.3F21.0020.0002] # YI SYLLABLE NDUT -A163 ; [.3F22.0020.0002] # YI SYLLABLE NDUX -A164 ; [.3F23.0020.0002] # YI SYLLABLE NDU -A165 ; [.3F24.0020.0002] # YI SYLLABLE NDUP -A166 ; [.3F25.0020.0002] # YI SYLLABLE NDURX -A167 ; [.3F26.0020.0002] # YI SYLLABLE NDUR -A168 ; [.3F27.0020.0002] # YI SYLLABLE HNIT -A169 ; [.3F28.0020.0002] # YI SYLLABLE HNIX -A16A ; [.3F29.0020.0002] # YI SYLLABLE HNI -A16B ; [.3F2A.0020.0002] # YI SYLLABLE HNIP -A16C ; [.3F2B.0020.0002] # YI SYLLABLE HNIET -A16D ; [.3F2C.0020.0002] # YI SYLLABLE HNIEX -A16E ; [.3F2D.0020.0002] # YI SYLLABLE HNIE -A16F ; [.3F2E.0020.0002] # YI SYLLABLE HNIEP -A170 ; [.3F2F.0020.0002] # YI SYLLABLE HNAT -A171 ; [.3F30.0020.0002] # YI SYLLABLE HNAX -A172 ; [.3F31.0020.0002] # YI SYLLABLE HNA -A173 ; [.3F32.0020.0002] # YI SYLLABLE HNAP -A174 ; [.3F33.0020.0002] # YI SYLLABLE HNUOX -A175 ; [.3F34.0020.0002] # YI SYLLABLE HNUO -A176 ; [.3F35.0020.0002] # YI SYLLABLE HNOT -A177 ; [.3F36.0020.0002] # YI SYLLABLE HNOX -A178 ; [.3F37.0020.0002] # YI SYLLABLE HNOP -A179 ; [.3F38.0020.0002] # YI SYLLABLE HNEX -A17A ; [.3F39.0020.0002] # YI SYLLABLE HNE -A17B ; [.3F3A.0020.0002] # YI SYLLABLE HNEP -A17C ; [.3F3B.0020.0002] # YI SYLLABLE HNUT -A17D ; [.3F3C.0020.0002] # YI SYLLABLE NIT -A17E ; [.3F3D.0020.0002] # YI SYLLABLE NIX -A17F ; [.3F3E.0020.0002] # YI SYLLABLE NI -A180 ; [.3F3F.0020.0002] # YI SYLLABLE NIP -A181 ; [.3F40.0020.0002] # YI SYLLABLE NIEX -A182 ; [.3F41.0020.0002] # YI SYLLABLE NIE -A183 ; [.3F42.0020.0002] # YI SYLLABLE NIEP -A184 ; [.3F43.0020.0002] # YI SYLLABLE NAX -A185 ; [.3F44.0020.0002] # YI SYLLABLE NA -A186 ; [.3F45.0020.0002] # YI SYLLABLE NAP -A187 ; [.3F46.0020.0002] # YI SYLLABLE NUOX -A188 ; [.3F47.0020.0002] # YI SYLLABLE NUO -A189 ; [.3F48.0020.0002] # YI SYLLABLE NUOP -A18A ; [.3F49.0020.0002] # YI SYLLABLE NOT -A18B ; [.3F4A.0020.0002] # YI SYLLABLE NOX -A18C ; [.3F4B.0020.0002] # YI SYLLABLE NO -A18D ; [.3F4C.0020.0002] # YI SYLLABLE NOP -A18E ; [.3F4D.0020.0002] # YI SYLLABLE NEX -A18F ; [.3F4E.0020.0002] # YI SYLLABLE NE -A190 ; [.3F4F.0020.0002] # YI SYLLABLE NEP -A191 ; [.3F50.0020.0002] # YI SYLLABLE NUT -A192 ; [.3F51.0020.0002] # YI SYLLABLE NUX -A193 ; [.3F52.0020.0002] # YI SYLLABLE NU -A194 ; [.3F53.0020.0002] # YI SYLLABLE NUP -A195 ; [.3F54.0020.0002] # YI SYLLABLE NURX -A196 ; [.3F55.0020.0002] # YI SYLLABLE NUR -A197 ; [.3F56.0020.0002] # YI SYLLABLE HLIT -A198 ; [.3F57.0020.0002] # YI SYLLABLE HLIX -A199 ; [.3F58.0020.0002] # YI SYLLABLE HLI -A19A ; [.3F59.0020.0002] # YI SYLLABLE HLIP -A19B ; [.3F5A.0020.0002] # YI SYLLABLE HLIEX -A19C ; [.3F5B.0020.0002] # YI SYLLABLE HLIE -A19D ; [.3F5C.0020.0002] # YI SYLLABLE HLIEP -A19E ; [.3F5D.0020.0002] # YI SYLLABLE HLAT -A19F ; [.3F5E.0020.0002] # YI SYLLABLE HLAX -A1A0 ; [.3F5F.0020.0002] # YI SYLLABLE HLA -A1A1 ; [.3F60.0020.0002] # YI SYLLABLE HLAP -A1A2 ; [.3F61.0020.0002] # YI SYLLABLE HLUOX -A1A3 ; [.3F62.0020.0002] # YI SYLLABLE HLUO -A1A4 ; [.3F63.0020.0002] # YI SYLLABLE HLUOP -A1A5 ; [.3F64.0020.0002] # YI SYLLABLE HLOX -A1A6 ; [.3F65.0020.0002] # YI SYLLABLE HLO -A1A7 ; [.3F66.0020.0002] # YI SYLLABLE HLOP -A1A8 ; [.3F67.0020.0002] # YI SYLLABLE HLEX -A1A9 ; [.3F68.0020.0002] # YI SYLLABLE HLE -A1AA ; [.3F69.0020.0002] # YI SYLLABLE HLEP -A1AB ; [.3F6A.0020.0002] # YI SYLLABLE HLUT -A1AC ; [.3F6B.0020.0002] # YI SYLLABLE HLUX -A1AD ; [.3F6C.0020.0002] # YI SYLLABLE HLU -A1AE ; [.3F6D.0020.0002] # YI SYLLABLE HLUP -A1AF ; [.3F6E.0020.0002] # YI SYLLABLE HLURX -A1B0 ; [.3F6F.0020.0002] # YI SYLLABLE HLUR -A1B1 ; [.3F70.0020.0002] # YI SYLLABLE HLYT -A1B2 ; [.3F71.0020.0002] # YI SYLLABLE HLYX -A1B3 ; [.3F72.0020.0002] # YI SYLLABLE HLY -A1B4 ; [.3F73.0020.0002] # YI SYLLABLE HLYP -A1B5 ; [.3F74.0020.0002] # YI SYLLABLE HLYRX -A1B6 ; [.3F75.0020.0002] # YI SYLLABLE HLYR -A1B7 ; [.3F76.0020.0002] # YI SYLLABLE LIT -A1B8 ; [.3F77.0020.0002] # YI SYLLABLE LIX -A1B9 ; [.3F78.0020.0002] # YI SYLLABLE LI -A1BA ; [.3F79.0020.0002] # YI SYLLABLE LIP -A1BB ; [.3F7A.0020.0002] # YI SYLLABLE LIET -A1BC ; [.3F7B.0020.0002] # YI SYLLABLE LIEX -A1BD ; [.3F7C.0020.0002] # YI SYLLABLE LIE -A1BE ; [.3F7D.0020.0002] # YI SYLLABLE LIEP -A1BF ; [.3F7E.0020.0002] # YI SYLLABLE LAT -A1C0 ; [.3F7F.0020.0002] # YI SYLLABLE LAX -A1C1 ; [.3F80.0020.0002] # YI SYLLABLE LA -A1C2 ; [.3F81.0020.0002] # YI SYLLABLE LAP -A1C3 ; [.3F82.0020.0002] # YI SYLLABLE LUOT -A1C4 ; [.3F83.0020.0002] # YI SYLLABLE LUOX -A1C5 ; [.3F84.0020.0002] # YI SYLLABLE LUO -A1C6 ; [.3F85.0020.0002] # YI SYLLABLE LUOP -A1C7 ; [.3F86.0020.0002] # YI SYLLABLE LOT -A1C8 ; [.3F87.0020.0002] # YI SYLLABLE LOX -A1C9 ; [.3F88.0020.0002] # YI SYLLABLE LO -A1CA ; [.3F89.0020.0002] # YI SYLLABLE LOP -A1CB ; [.3F8A.0020.0002] # YI SYLLABLE LEX -A1CC ; [.3F8B.0020.0002] # YI SYLLABLE LE -A1CD ; [.3F8C.0020.0002] # YI SYLLABLE LEP -A1CE ; [.3F8D.0020.0002] # YI SYLLABLE LUT -A1CF ; [.3F8E.0020.0002] # YI SYLLABLE LUX -A1D0 ; [.3F8F.0020.0002] # YI SYLLABLE LU -A1D1 ; [.3F90.0020.0002] # YI SYLLABLE LUP -A1D2 ; [.3F91.0020.0002] # YI SYLLABLE LURX -A1D3 ; [.3F92.0020.0002] # YI SYLLABLE LUR -A1D4 ; [.3F93.0020.0002] # YI SYLLABLE LYT -A1D5 ; [.3F94.0020.0002] # YI SYLLABLE LYX -A1D6 ; [.3F95.0020.0002] # YI SYLLABLE LY -A1D7 ; [.3F96.0020.0002] # YI SYLLABLE LYP -A1D8 ; [.3F97.0020.0002] # YI SYLLABLE LYRX -A1D9 ; [.3F98.0020.0002] # YI SYLLABLE LYR -A1DA ; [.3F99.0020.0002] # YI SYLLABLE GIT -A1DB ; [.3F9A.0020.0002] # YI SYLLABLE GIX -A1DC ; [.3F9B.0020.0002] # YI SYLLABLE GI -A1DD ; [.3F9C.0020.0002] # YI SYLLABLE GIP -A1DE ; [.3F9D.0020.0002] # YI SYLLABLE GIET -A1DF ; [.3F9E.0020.0002] # YI SYLLABLE GIEX -A1E0 ; [.3F9F.0020.0002] # YI SYLLABLE GIE -A1E1 ; [.3FA0.0020.0002] # YI SYLLABLE GIEP -A1E2 ; [.3FA1.0020.0002] # YI SYLLABLE GAT -A1E3 ; [.3FA2.0020.0002] # YI SYLLABLE GAX -A1E4 ; [.3FA3.0020.0002] # YI SYLLABLE GA -A1E5 ; [.3FA4.0020.0002] # YI SYLLABLE GAP -A1E6 ; [.3FA5.0020.0002] # YI SYLLABLE GUOT -A1E7 ; [.3FA6.0020.0002] # YI SYLLABLE GUOX -A1E8 ; [.3FA7.0020.0002] # YI SYLLABLE GUO -A1E9 ; [.3FA8.0020.0002] # YI SYLLABLE GUOP -A1EA ; [.3FA9.0020.0002] # YI SYLLABLE GOT -A1EB ; [.3FAA.0020.0002] # YI SYLLABLE GOX -A1EC ; [.3FAB.0020.0002] # YI SYLLABLE GO -A1ED ; [.3FAC.0020.0002] # YI SYLLABLE GOP -A1EE ; [.3FAD.0020.0002] # YI SYLLABLE GET -A1EF ; [.3FAE.0020.0002] # YI SYLLABLE GEX -A1F0 ; [.3FAF.0020.0002] # YI SYLLABLE GE -A1F1 ; [.3FB0.0020.0002] # YI SYLLABLE GEP -A1F2 ; [.3FB1.0020.0002] # YI SYLLABLE GUT -A1F3 ; [.3FB2.0020.0002] # YI SYLLABLE GUX -A1F4 ; [.3FB3.0020.0002] # YI SYLLABLE GU -A1F5 ; [.3FB4.0020.0002] # YI SYLLABLE GUP -A1F6 ; [.3FB5.0020.0002] # YI SYLLABLE GURX -A1F7 ; [.3FB6.0020.0002] # YI SYLLABLE GUR -A1F8 ; [.3FB7.0020.0002] # YI SYLLABLE KIT -A1F9 ; [.3FB8.0020.0002] # YI SYLLABLE KIX -A1FA ; [.3FB9.0020.0002] # YI SYLLABLE KI -A1FB ; [.3FBA.0020.0002] # YI SYLLABLE KIP -A1FC ; [.3FBB.0020.0002] # YI SYLLABLE KIEX -A1FD ; [.3FBC.0020.0002] # YI SYLLABLE KIE -A1FE ; [.3FBD.0020.0002] # YI SYLLABLE KIEP -A1FF ; [.3FBE.0020.0002] # YI SYLLABLE KAT -A200 ; [.3FBF.0020.0002] # YI SYLLABLE KAX -A201 ; [.3FC0.0020.0002] # YI SYLLABLE KA -A202 ; [.3FC1.0020.0002] # YI SYLLABLE KAP -A203 ; [.3FC2.0020.0002] # YI SYLLABLE KUOX -A204 ; [.3FC3.0020.0002] # YI SYLLABLE KUO -A205 ; [.3FC4.0020.0002] # YI SYLLABLE KUOP -A206 ; [.3FC5.0020.0002] # YI SYLLABLE KOT -A207 ; [.3FC6.0020.0002] # YI SYLLABLE KOX -A208 ; [.3FC7.0020.0002] # YI SYLLABLE KO -A209 ; [.3FC8.0020.0002] # YI SYLLABLE KOP -A20A ; [.3FC9.0020.0002] # YI SYLLABLE KET -A20B ; [.3FCA.0020.0002] # YI SYLLABLE KEX -A20C ; [.3FCB.0020.0002] # YI SYLLABLE KE -A20D ; [.3FCC.0020.0002] # YI SYLLABLE KEP -A20E ; [.3FCD.0020.0002] # YI SYLLABLE KUT -A20F ; [.3FCE.0020.0002] # YI SYLLABLE KUX -A210 ; [.3FCF.0020.0002] # YI SYLLABLE KU -A211 ; [.3FD0.0020.0002] # YI SYLLABLE KUP -A212 ; [.3FD1.0020.0002] # YI SYLLABLE KURX -A213 ; [.3FD2.0020.0002] # YI SYLLABLE KUR -A214 ; [.3FD3.0020.0002] # YI SYLLABLE GGIT -A215 ; [.3FD4.0020.0002] # YI SYLLABLE GGIX -A216 ; [.3FD5.0020.0002] # YI SYLLABLE GGI -A217 ; [.3FD6.0020.0002] # YI SYLLABLE GGIEX -A218 ; [.3FD7.0020.0002] # YI SYLLABLE GGIE -A219 ; [.3FD8.0020.0002] # YI SYLLABLE GGIEP -A21A ; [.3FD9.0020.0002] # YI SYLLABLE GGAT -A21B ; [.3FDA.0020.0002] # YI SYLLABLE GGAX -A21C ; [.3FDB.0020.0002] # YI SYLLABLE GGA -A21D ; [.3FDC.0020.0002] # YI SYLLABLE GGAP -A21E ; [.3FDD.0020.0002] # YI SYLLABLE GGUOT -A21F ; [.3FDE.0020.0002] # YI SYLLABLE GGUOX -A220 ; [.3FDF.0020.0002] # YI SYLLABLE GGUO -A221 ; [.3FE0.0020.0002] # YI SYLLABLE GGUOP -A222 ; [.3FE1.0020.0002] # YI SYLLABLE GGOT -A223 ; [.3FE2.0020.0002] # YI SYLLABLE GGOX -A224 ; [.3FE3.0020.0002] # YI SYLLABLE GGO -A225 ; [.3FE4.0020.0002] # YI SYLLABLE GGOP -A226 ; [.3FE5.0020.0002] # YI SYLLABLE GGET -A227 ; [.3FE6.0020.0002] # YI SYLLABLE GGEX -A228 ; [.3FE7.0020.0002] # YI SYLLABLE GGE -A229 ; [.3FE8.0020.0002] # YI SYLLABLE GGEP -A22A ; [.3FE9.0020.0002] # YI SYLLABLE GGUT -A22B ; [.3FEA.0020.0002] # YI SYLLABLE GGUX -A22C ; [.3FEB.0020.0002] # YI SYLLABLE GGU -A22D ; [.3FEC.0020.0002] # YI SYLLABLE GGUP -A22E ; [.3FED.0020.0002] # YI SYLLABLE GGURX -A22F ; [.3FEE.0020.0002] # YI SYLLABLE GGUR -A230 ; [.3FEF.0020.0002] # YI SYLLABLE MGIEX -A231 ; [.3FF0.0020.0002] # YI SYLLABLE MGIE -A232 ; [.3FF1.0020.0002] # YI SYLLABLE MGAT -A233 ; [.3FF2.0020.0002] # YI SYLLABLE MGAX -A234 ; [.3FF3.0020.0002] # YI SYLLABLE MGA -A235 ; [.3FF4.0020.0002] # YI SYLLABLE MGAP -A236 ; [.3FF5.0020.0002] # YI SYLLABLE MGUOX -A237 ; [.3FF6.0020.0002] # YI SYLLABLE MGUO -A238 ; [.3FF7.0020.0002] # YI SYLLABLE MGUOP -A239 ; [.3FF8.0020.0002] # YI SYLLABLE MGOT -A23A ; [.3FF9.0020.0002] # YI SYLLABLE MGOX -A23B ; [.3FFA.0020.0002] # YI SYLLABLE MGO -A23C ; [.3FFB.0020.0002] # YI SYLLABLE MGOP -A23D ; [.3FFC.0020.0002] # YI SYLLABLE MGEX -A23E ; [.3FFD.0020.0002] # YI SYLLABLE MGE -A23F ; [.3FFE.0020.0002] # YI SYLLABLE MGEP -A240 ; [.3FFF.0020.0002] # YI SYLLABLE MGUT -A241 ; [.4000.0020.0002] # YI SYLLABLE MGUX -A242 ; [.4001.0020.0002] # YI SYLLABLE MGU -A243 ; [.4002.0020.0002] # YI SYLLABLE MGUP -A244 ; [.4003.0020.0002] # YI SYLLABLE MGURX -A245 ; [.4004.0020.0002] # YI SYLLABLE MGUR -A246 ; [.4005.0020.0002] # YI SYLLABLE HXIT -A247 ; [.4006.0020.0002] # YI SYLLABLE HXIX -A248 ; [.4007.0020.0002] # YI SYLLABLE HXI -A249 ; [.4008.0020.0002] # YI SYLLABLE HXIP -A24A ; [.4009.0020.0002] # YI SYLLABLE HXIET -A24B ; [.400A.0020.0002] # YI SYLLABLE HXIEX -A24C ; [.400B.0020.0002] # YI SYLLABLE HXIE -A24D ; [.400C.0020.0002] # YI SYLLABLE HXIEP -A24E ; [.400D.0020.0002] # YI SYLLABLE HXAT -A24F ; [.400E.0020.0002] # YI SYLLABLE HXAX -A250 ; [.400F.0020.0002] # YI SYLLABLE HXA -A251 ; [.4010.0020.0002] # YI SYLLABLE HXAP -A252 ; [.4011.0020.0002] # YI SYLLABLE HXUOT -A253 ; [.4012.0020.0002] # YI SYLLABLE HXUOX -A254 ; [.4013.0020.0002] # YI SYLLABLE HXUO -A255 ; [.4014.0020.0002] # YI SYLLABLE HXUOP -A256 ; [.4015.0020.0002] # YI SYLLABLE HXOT -A257 ; [.4016.0020.0002] # YI SYLLABLE HXOX -A258 ; [.4017.0020.0002] # YI SYLLABLE HXO -A259 ; [.4018.0020.0002] # YI SYLLABLE HXOP -A25A ; [.4019.0020.0002] # YI SYLLABLE HXEX -A25B ; [.401A.0020.0002] # YI SYLLABLE HXE -A25C ; [.401B.0020.0002] # YI SYLLABLE HXEP -A25D ; [.401C.0020.0002] # YI SYLLABLE NGIEX -A25E ; [.401D.0020.0002] # YI SYLLABLE NGIE -A25F ; [.401E.0020.0002] # YI SYLLABLE NGIEP -A260 ; [.401F.0020.0002] # YI SYLLABLE NGAT -A261 ; [.4020.0020.0002] # YI SYLLABLE NGAX -A262 ; [.4021.0020.0002] # YI SYLLABLE NGA -A263 ; [.4022.0020.0002] # YI SYLLABLE NGAP -A264 ; [.4023.0020.0002] # YI SYLLABLE NGUOT -A265 ; [.4024.0020.0002] # YI SYLLABLE NGUOX -A266 ; [.4025.0020.0002] # YI SYLLABLE NGUO -A267 ; [.4026.0020.0002] # YI SYLLABLE NGOT -A268 ; [.4027.0020.0002] # YI SYLLABLE NGOX -A269 ; [.4028.0020.0002] # YI SYLLABLE NGO -A26A ; [.4029.0020.0002] # YI SYLLABLE NGOP -A26B ; [.402A.0020.0002] # YI SYLLABLE NGEX -A26C ; [.402B.0020.0002] # YI SYLLABLE NGE -A26D ; [.402C.0020.0002] # YI SYLLABLE NGEP -A26E ; [.402D.0020.0002] # YI SYLLABLE HIT -A26F ; [.402E.0020.0002] # YI SYLLABLE HIEX -A270 ; [.402F.0020.0002] # YI SYLLABLE HIE -A271 ; [.4030.0020.0002] # YI SYLLABLE HAT -A272 ; [.4031.0020.0002] # YI SYLLABLE HAX -A273 ; [.4032.0020.0002] # YI SYLLABLE HA -A274 ; [.4033.0020.0002] # YI SYLLABLE HAP -A275 ; [.4034.0020.0002] # YI SYLLABLE HUOT -A276 ; [.4035.0020.0002] # YI SYLLABLE HUOX -A277 ; [.4036.0020.0002] # YI SYLLABLE HUO -A278 ; [.4037.0020.0002] # YI SYLLABLE HUOP -A279 ; [.4038.0020.0002] # YI SYLLABLE HOT -A27A ; [.4039.0020.0002] # YI SYLLABLE HOX -A27B ; [.403A.0020.0002] # YI SYLLABLE HO -A27C ; [.403B.0020.0002] # YI SYLLABLE HOP -A27D ; [.403C.0020.0002] # YI SYLLABLE HEX -A27E ; [.403D.0020.0002] # YI SYLLABLE HE -A27F ; [.403E.0020.0002] # YI SYLLABLE HEP -A280 ; [.403F.0020.0002] # YI SYLLABLE WAT -A281 ; [.4040.0020.0002] # YI SYLLABLE WAX -A282 ; [.4041.0020.0002] # YI SYLLABLE WA -A283 ; [.4042.0020.0002] # YI SYLLABLE WAP -A284 ; [.4043.0020.0002] # YI SYLLABLE WUOX -A285 ; [.4044.0020.0002] # YI SYLLABLE WUO -A286 ; [.4045.0020.0002] # YI SYLLABLE WUOP -A287 ; [.4046.0020.0002] # YI SYLLABLE WOX -A288 ; [.4047.0020.0002] # YI SYLLABLE WO -A289 ; [.4048.0020.0002] # YI SYLLABLE WOP -A28A ; [.4049.0020.0002] # YI SYLLABLE WEX -A28B ; [.404A.0020.0002] # YI SYLLABLE WE -A28C ; [.404B.0020.0002] # YI SYLLABLE WEP -A28D ; [.404C.0020.0002] # YI SYLLABLE ZIT -A28E ; [.404D.0020.0002] # YI SYLLABLE ZIX -A28F ; [.404E.0020.0002] # YI SYLLABLE ZI -A290 ; [.404F.0020.0002] # YI SYLLABLE ZIP -A291 ; [.4050.0020.0002] # YI SYLLABLE ZIEX -A292 ; [.4051.0020.0002] # YI SYLLABLE ZIE -A293 ; [.4052.0020.0002] # YI SYLLABLE ZIEP -A294 ; [.4053.0020.0002] # YI SYLLABLE ZAT -A295 ; [.4054.0020.0002] # YI SYLLABLE ZAX -A296 ; [.4055.0020.0002] # YI SYLLABLE ZA -A297 ; [.4056.0020.0002] # YI SYLLABLE ZAP -A298 ; [.4057.0020.0002] # YI SYLLABLE ZUOX -A299 ; [.4058.0020.0002] # YI SYLLABLE ZUO -A29A ; [.4059.0020.0002] # YI SYLLABLE ZUOP -A29B ; [.405A.0020.0002] # YI SYLLABLE ZOT -A29C ; [.405B.0020.0002] # YI SYLLABLE ZOX -A29D ; [.405C.0020.0002] # YI SYLLABLE ZO -A29E ; [.405D.0020.0002] # YI SYLLABLE ZOP -A29F ; [.405E.0020.0002] # YI SYLLABLE ZEX -A2A0 ; [.405F.0020.0002] # YI SYLLABLE ZE -A2A1 ; [.4060.0020.0002] # YI SYLLABLE ZEP -A2A2 ; [.4061.0020.0002] # YI SYLLABLE ZUT -A2A3 ; [.4062.0020.0002] # YI SYLLABLE ZUX -A2A4 ; [.4063.0020.0002] # YI SYLLABLE ZU -A2A5 ; [.4064.0020.0002] # YI SYLLABLE ZUP -A2A6 ; [.4065.0020.0002] # YI SYLLABLE ZURX -A2A7 ; [.4066.0020.0002] # YI SYLLABLE ZUR -A2A8 ; [.4067.0020.0002] # YI SYLLABLE ZYT -A2A9 ; [.4068.0020.0002] # YI SYLLABLE ZYX -A2AA ; [.4069.0020.0002] # YI SYLLABLE ZY -A2AB ; [.406A.0020.0002] # YI SYLLABLE ZYP -A2AC ; [.406B.0020.0002] # YI SYLLABLE ZYRX -A2AD ; [.406C.0020.0002] # YI SYLLABLE ZYR -A2AE ; [.406D.0020.0002] # YI SYLLABLE CIT -A2AF ; [.406E.0020.0002] # YI SYLLABLE CIX -A2B0 ; [.406F.0020.0002] # YI SYLLABLE CI -A2B1 ; [.4070.0020.0002] # YI SYLLABLE CIP -A2B2 ; [.4071.0020.0002] # YI SYLLABLE CIET -A2B3 ; [.4072.0020.0002] # YI SYLLABLE CIEX -A2B4 ; [.4073.0020.0002] # YI SYLLABLE CIE -A2B5 ; [.4074.0020.0002] # YI SYLLABLE CIEP -A2B6 ; [.4075.0020.0002] # YI SYLLABLE CAT -A2B7 ; [.4076.0020.0002] # YI SYLLABLE CAX -A2B8 ; [.4077.0020.0002] # YI SYLLABLE CA -A2B9 ; [.4078.0020.0002] # YI SYLLABLE CAP -A2BA ; [.4079.0020.0002] # YI SYLLABLE CUOX -A2BB ; [.407A.0020.0002] # YI SYLLABLE CUO -A2BC ; [.407B.0020.0002] # YI SYLLABLE CUOP -A2BD ; [.407C.0020.0002] # YI SYLLABLE COT -A2BE ; [.407D.0020.0002] # YI SYLLABLE COX -A2BF ; [.407E.0020.0002] # YI SYLLABLE CO -A2C0 ; [.407F.0020.0002] # YI SYLLABLE COP -A2C1 ; [.4080.0020.0002] # YI SYLLABLE CEX -A2C2 ; [.4081.0020.0002] # YI SYLLABLE CE -A2C3 ; [.4082.0020.0002] # YI SYLLABLE CEP -A2C4 ; [.4083.0020.0002] # YI SYLLABLE CUT -A2C5 ; [.4084.0020.0002] # YI SYLLABLE CUX -A2C6 ; [.4085.0020.0002] # YI SYLLABLE CU -A2C7 ; [.4086.0020.0002] # YI SYLLABLE CUP -A2C8 ; [.4087.0020.0002] # YI SYLLABLE CURX -A2C9 ; [.4088.0020.0002] # YI SYLLABLE CUR -A2CA ; [.4089.0020.0002] # YI SYLLABLE CYT -A2CB ; [.408A.0020.0002] # YI SYLLABLE CYX -A2CC ; [.408B.0020.0002] # YI SYLLABLE CY -A2CD ; [.408C.0020.0002] # YI SYLLABLE CYP -A2CE ; [.408D.0020.0002] # YI SYLLABLE CYRX -A2CF ; [.408E.0020.0002] # YI SYLLABLE CYR -A2D0 ; [.408F.0020.0002] # YI SYLLABLE ZZIT -A2D1 ; [.4090.0020.0002] # YI SYLLABLE ZZIX -A2D2 ; [.4091.0020.0002] # YI SYLLABLE ZZI -A2D3 ; [.4092.0020.0002] # YI SYLLABLE ZZIP -A2D4 ; [.4093.0020.0002] # YI SYLLABLE ZZIET -A2D5 ; [.4094.0020.0002] # YI SYLLABLE ZZIEX -A2D6 ; [.4095.0020.0002] # YI SYLLABLE ZZIE -A2D7 ; [.4096.0020.0002] # YI SYLLABLE ZZIEP -A2D8 ; [.4097.0020.0002] # YI SYLLABLE ZZAT -A2D9 ; [.4098.0020.0002] # YI SYLLABLE ZZAX -A2DA ; [.4099.0020.0002] # YI SYLLABLE ZZA -A2DB ; [.409A.0020.0002] # YI SYLLABLE ZZAP -A2DC ; [.409B.0020.0002] # YI SYLLABLE ZZOX -A2DD ; [.409C.0020.0002] # YI SYLLABLE ZZO -A2DE ; [.409D.0020.0002] # YI SYLLABLE ZZOP -A2DF ; [.409E.0020.0002] # YI SYLLABLE ZZEX -A2E0 ; [.409F.0020.0002] # YI SYLLABLE ZZE -A2E1 ; [.40A0.0020.0002] # YI SYLLABLE ZZEP -A2E2 ; [.40A1.0020.0002] # YI SYLLABLE ZZUX -A2E3 ; [.40A2.0020.0002] # YI SYLLABLE ZZU -A2E4 ; [.40A3.0020.0002] # YI SYLLABLE ZZUP -A2E5 ; [.40A4.0020.0002] # YI SYLLABLE ZZURX -A2E6 ; [.40A5.0020.0002] # YI SYLLABLE ZZUR -A2E7 ; [.40A6.0020.0002] # YI SYLLABLE ZZYT -A2E8 ; [.40A7.0020.0002] # YI SYLLABLE ZZYX -A2E9 ; [.40A8.0020.0002] # YI SYLLABLE ZZY -A2EA ; [.40A9.0020.0002] # YI SYLLABLE ZZYP -A2EB ; [.40AA.0020.0002] # YI SYLLABLE ZZYRX -A2EC ; [.40AB.0020.0002] # YI SYLLABLE ZZYR -A2ED ; [.40AC.0020.0002] # YI SYLLABLE NZIT -A2EE ; [.40AD.0020.0002] # YI SYLLABLE NZIX -A2EF ; [.40AE.0020.0002] # YI SYLLABLE NZI -A2F0 ; [.40AF.0020.0002] # YI SYLLABLE NZIP -A2F1 ; [.40B0.0020.0002] # YI SYLLABLE NZIEX -A2F2 ; [.40B1.0020.0002] # YI SYLLABLE NZIE -A2F3 ; [.40B2.0020.0002] # YI SYLLABLE NZIEP -A2F4 ; [.40B3.0020.0002] # YI SYLLABLE NZAT -A2F5 ; [.40B4.0020.0002] # YI SYLLABLE NZAX -A2F6 ; [.40B5.0020.0002] # YI SYLLABLE NZA -A2F7 ; [.40B6.0020.0002] # YI SYLLABLE NZAP -A2F8 ; [.40B7.0020.0002] # YI SYLLABLE NZUOX -A2F9 ; [.40B8.0020.0002] # YI SYLLABLE NZUO -A2FA ; [.40B9.0020.0002] # YI SYLLABLE NZOX -A2FB ; [.40BA.0020.0002] # YI SYLLABLE NZOP -A2FC ; [.40BB.0020.0002] # YI SYLLABLE NZEX -A2FD ; [.40BC.0020.0002] # YI SYLLABLE NZE -A2FE ; [.40BD.0020.0002] # YI SYLLABLE NZUX -A2FF ; [.40BE.0020.0002] # YI SYLLABLE NZU -A300 ; [.40BF.0020.0002] # YI SYLLABLE NZUP -A301 ; [.40C0.0020.0002] # YI SYLLABLE NZURX -A302 ; [.40C1.0020.0002] # YI SYLLABLE NZUR -A303 ; [.40C2.0020.0002] # YI SYLLABLE NZYT -A304 ; [.40C3.0020.0002] # YI SYLLABLE NZYX -A305 ; [.40C4.0020.0002] # YI SYLLABLE NZY -A306 ; [.40C5.0020.0002] # YI SYLLABLE NZYP -A307 ; [.40C6.0020.0002] # YI SYLLABLE NZYRX -A308 ; [.40C7.0020.0002] # YI SYLLABLE NZYR -A309 ; [.40C8.0020.0002] # YI SYLLABLE SIT -A30A ; [.40C9.0020.0002] # YI SYLLABLE SIX -A30B ; [.40CA.0020.0002] # YI SYLLABLE SI -A30C ; [.40CB.0020.0002] # YI SYLLABLE SIP -A30D ; [.40CC.0020.0002] # YI SYLLABLE SIEX -A30E ; [.40CD.0020.0002] # YI SYLLABLE SIE -A30F ; [.40CE.0020.0002] # YI SYLLABLE SIEP -A310 ; [.40CF.0020.0002] # YI SYLLABLE SAT -A311 ; [.40D0.0020.0002] # YI SYLLABLE SAX -A312 ; [.40D1.0020.0002] # YI SYLLABLE SA -A313 ; [.40D2.0020.0002] # YI SYLLABLE SAP -A314 ; [.40D3.0020.0002] # YI SYLLABLE SUOX -A315 ; [.40D4.0020.0002] # YI SYLLABLE SUO -A316 ; [.40D5.0020.0002] # YI SYLLABLE SUOP -A317 ; [.40D6.0020.0002] # YI SYLLABLE SOT -A318 ; [.40D7.0020.0002] # YI SYLLABLE SOX -A319 ; [.40D8.0020.0002] # YI SYLLABLE SO -A31A ; [.40D9.0020.0002] # YI SYLLABLE SOP -A31B ; [.40DA.0020.0002] # YI SYLLABLE SEX -A31C ; [.40DB.0020.0002] # YI SYLLABLE SE -A31D ; [.40DC.0020.0002] # YI SYLLABLE SEP -A31E ; [.40DD.0020.0002] # YI SYLLABLE SUT -A31F ; [.40DE.0020.0002] # YI SYLLABLE SUX -A320 ; [.40DF.0020.0002] # YI SYLLABLE SU -A321 ; [.40E0.0020.0002] # YI SYLLABLE SUP -A322 ; [.40E1.0020.0002] # YI SYLLABLE SURX -A323 ; [.40E2.0020.0002] # YI SYLLABLE SUR -A324 ; [.40E3.0020.0002] # YI SYLLABLE SYT -A325 ; [.40E4.0020.0002] # YI SYLLABLE SYX -A326 ; [.40E5.0020.0002] # YI SYLLABLE SY -A327 ; [.40E6.0020.0002] # YI SYLLABLE SYP -A328 ; [.40E7.0020.0002] # YI SYLLABLE SYRX -A329 ; [.40E8.0020.0002] # YI SYLLABLE SYR -A32A ; [.40E9.0020.0002] # YI SYLLABLE SSIT -A32B ; [.40EA.0020.0002] # YI SYLLABLE SSIX -A32C ; [.40EB.0020.0002] # YI SYLLABLE SSI -A32D ; [.40EC.0020.0002] # YI SYLLABLE SSIP -A32E ; [.40ED.0020.0002] # YI SYLLABLE SSIEX -A32F ; [.40EE.0020.0002] # YI SYLLABLE SSIE -A330 ; [.40EF.0020.0002] # YI SYLLABLE SSIEP -A331 ; [.40F0.0020.0002] # YI SYLLABLE SSAT -A332 ; [.40F1.0020.0002] # YI SYLLABLE SSAX -A333 ; [.40F2.0020.0002] # YI SYLLABLE SSA -A334 ; [.40F3.0020.0002] # YI SYLLABLE SSAP -A335 ; [.40F4.0020.0002] # YI SYLLABLE SSOT -A336 ; [.40F5.0020.0002] # YI SYLLABLE SSOX -A337 ; [.40F6.0020.0002] # YI SYLLABLE SSO -A338 ; [.40F7.0020.0002] # YI SYLLABLE SSOP -A339 ; [.40F8.0020.0002] # YI SYLLABLE SSEX -A33A ; [.40F9.0020.0002] # YI SYLLABLE SSE -A33B ; [.40FA.0020.0002] # YI SYLLABLE SSEP -A33C ; [.40FB.0020.0002] # YI SYLLABLE SSUT -A33D ; [.40FC.0020.0002] # YI SYLLABLE SSUX -A33E ; [.40FD.0020.0002] # YI SYLLABLE SSU -A33F ; [.40FE.0020.0002] # YI SYLLABLE SSUP -A340 ; [.40FF.0020.0002] # YI SYLLABLE SSYT -A341 ; [.4100.0020.0002] # YI SYLLABLE SSYX -A342 ; [.4101.0020.0002] # YI SYLLABLE SSY -A343 ; [.4102.0020.0002] # YI SYLLABLE SSYP -A344 ; [.4103.0020.0002] # YI SYLLABLE SSYRX -A345 ; [.4104.0020.0002] # YI SYLLABLE SSYR -A346 ; [.4105.0020.0002] # YI SYLLABLE ZHAT -A347 ; [.4106.0020.0002] # YI SYLLABLE ZHAX -A348 ; [.4107.0020.0002] # YI SYLLABLE ZHA -A349 ; [.4108.0020.0002] # YI SYLLABLE ZHAP -A34A ; [.4109.0020.0002] # YI SYLLABLE ZHUOX -A34B ; [.410A.0020.0002] # YI SYLLABLE ZHUO -A34C ; [.410B.0020.0002] # YI SYLLABLE ZHUOP -A34D ; [.410C.0020.0002] # YI SYLLABLE ZHOT -A34E ; [.410D.0020.0002] # YI SYLLABLE ZHOX -A34F ; [.410E.0020.0002] # YI SYLLABLE ZHO -A350 ; [.410F.0020.0002] # YI SYLLABLE ZHOP -A351 ; [.4110.0020.0002] # YI SYLLABLE ZHET -A352 ; [.4111.0020.0002] # YI SYLLABLE ZHEX -A353 ; [.4112.0020.0002] # YI SYLLABLE ZHE -A354 ; [.4113.0020.0002] # YI SYLLABLE ZHEP -A355 ; [.4114.0020.0002] # YI SYLLABLE ZHUT -A356 ; [.4115.0020.0002] # YI SYLLABLE ZHUX -A357 ; [.4116.0020.0002] # YI SYLLABLE ZHU -A358 ; [.4117.0020.0002] # YI SYLLABLE ZHUP -A359 ; [.4118.0020.0002] # YI SYLLABLE ZHURX -A35A ; [.4119.0020.0002] # YI SYLLABLE ZHUR -A35B ; [.411A.0020.0002] # YI SYLLABLE ZHYT -A35C ; [.411B.0020.0002] # YI SYLLABLE ZHYX -A35D ; [.411C.0020.0002] # YI SYLLABLE ZHY -A35E ; [.411D.0020.0002] # YI SYLLABLE ZHYP -A35F ; [.411E.0020.0002] # YI SYLLABLE ZHYRX -A360 ; [.411F.0020.0002] # YI SYLLABLE ZHYR -A361 ; [.4120.0020.0002] # YI SYLLABLE CHAT -A362 ; [.4121.0020.0002] # YI SYLLABLE CHAX -A363 ; [.4122.0020.0002] # YI SYLLABLE CHA -A364 ; [.4123.0020.0002] # YI SYLLABLE CHAP -A365 ; [.4124.0020.0002] # YI SYLLABLE CHUOT -A366 ; [.4125.0020.0002] # YI SYLLABLE CHUOX -A367 ; [.4126.0020.0002] # YI SYLLABLE CHUO -A368 ; [.4127.0020.0002] # YI SYLLABLE CHUOP -A369 ; [.4128.0020.0002] # YI SYLLABLE CHOT -A36A ; [.4129.0020.0002] # YI SYLLABLE CHOX -A36B ; [.412A.0020.0002] # YI SYLLABLE CHO -A36C ; [.412B.0020.0002] # YI SYLLABLE CHOP -A36D ; [.412C.0020.0002] # YI SYLLABLE CHET -A36E ; [.412D.0020.0002] # YI SYLLABLE CHEX -A36F ; [.412E.0020.0002] # YI SYLLABLE CHE -A370 ; [.412F.0020.0002] # YI SYLLABLE CHEP -A371 ; [.4130.0020.0002] # YI SYLLABLE CHUX -A372 ; [.4131.0020.0002] # YI SYLLABLE CHU -A373 ; [.4132.0020.0002] # YI SYLLABLE CHUP -A374 ; [.4133.0020.0002] # YI SYLLABLE CHURX -A375 ; [.4134.0020.0002] # YI SYLLABLE CHUR -A376 ; [.4135.0020.0002] # YI SYLLABLE CHYT -A377 ; [.4136.0020.0002] # YI SYLLABLE CHYX -A378 ; [.4137.0020.0002] # YI SYLLABLE CHY -A379 ; [.4138.0020.0002] # YI SYLLABLE CHYP -A37A ; [.4139.0020.0002] # YI SYLLABLE CHYRX -A37B ; [.413A.0020.0002] # YI SYLLABLE CHYR -A37C ; [.413B.0020.0002] # YI SYLLABLE RRAX -A37D ; [.413C.0020.0002] # YI SYLLABLE RRA -A37E ; [.413D.0020.0002] # YI SYLLABLE RRUOX -A37F ; [.413E.0020.0002] # YI SYLLABLE RRUO -A380 ; [.413F.0020.0002] # YI SYLLABLE RROT -A381 ; [.4140.0020.0002] # YI SYLLABLE RROX -A382 ; [.4141.0020.0002] # YI SYLLABLE RRO -A383 ; [.4142.0020.0002] # YI SYLLABLE RROP -A384 ; [.4143.0020.0002] # YI SYLLABLE RRET -A385 ; [.4144.0020.0002] # YI SYLLABLE RREX -A386 ; [.4145.0020.0002] # YI SYLLABLE RRE -A387 ; [.4146.0020.0002] # YI SYLLABLE RREP -A388 ; [.4147.0020.0002] # YI SYLLABLE RRUT -A389 ; [.4148.0020.0002] # YI SYLLABLE RRUX -A38A ; [.4149.0020.0002] # YI SYLLABLE RRU -A38B ; [.414A.0020.0002] # YI SYLLABLE RRUP -A38C ; [.414B.0020.0002] # YI SYLLABLE RRURX -A38D ; [.414C.0020.0002] # YI SYLLABLE RRUR -A38E ; [.414D.0020.0002] # YI SYLLABLE RRYT -A38F ; [.414E.0020.0002] # YI SYLLABLE RRYX -A390 ; [.414F.0020.0002] # YI SYLLABLE RRY -A391 ; [.4150.0020.0002] # YI SYLLABLE RRYP -A392 ; [.4151.0020.0002] # YI SYLLABLE RRYRX -A393 ; [.4152.0020.0002] # YI SYLLABLE RRYR -A394 ; [.4153.0020.0002] # YI SYLLABLE NRAT -A395 ; [.4154.0020.0002] # YI SYLLABLE NRAX -A396 ; [.4155.0020.0002] # YI SYLLABLE NRA -A397 ; [.4156.0020.0002] # YI SYLLABLE NRAP -A398 ; [.4157.0020.0002] # YI SYLLABLE NROX -A399 ; [.4158.0020.0002] # YI SYLLABLE NRO -A39A ; [.4159.0020.0002] # YI SYLLABLE NROP -A39B ; [.415A.0020.0002] # YI SYLLABLE NRET -A39C ; [.415B.0020.0002] # YI SYLLABLE NREX -A39D ; [.415C.0020.0002] # YI SYLLABLE NRE -A39E ; [.415D.0020.0002] # YI SYLLABLE NREP -A39F ; [.415E.0020.0002] # YI SYLLABLE NRUT -A3A0 ; [.415F.0020.0002] # YI SYLLABLE NRUX -A3A1 ; [.4160.0020.0002] # YI SYLLABLE NRU -A3A2 ; [.4161.0020.0002] # YI SYLLABLE NRUP -A3A3 ; [.4162.0020.0002] # YI SYLLABLE NRURX -A3A4 ; [.4163.0020.0002] # YI SYLLABLE NRUR -A3A5 ; [.4164.0020.0002] # YI SYLLABLE NRYT -A3A6 ; [.4165.0020.0002] # YI SYLLABLE NRYX -A3A7 ; [.4166.0020.0002] # YI SYLLABLE NRY -A3A8 ; [.4167.0020.0002] # YI SYLLABLE NRYP -A3A9 ; [.4168.0020.0002] # YI SYLLABLE NRYRX -A3AA ; [.4169.0020.0002] # YI SYLLABLE NRYR -A3AB ; [.416A.0020.0002] # YI SYLLABLE SHAT -A3AC ; [.416B.0020.0002] # YI SYLLABLE SHAX -A3AD ; [.416C.0020.0002] # YI SYLLABLE SHA -A3AE ; [.416D.0020.0002] # YI SYLLABLE SHAP -A3AF ; [.416E.0020.0002] # YI SYLLABLE SHUOX -A3B0 ; [.416F.0020.0002] # YI SYLLABLE SHUO -A3B1 ; [.4170.0020.0002] # YI SYLLABLE SHUOP -A3B2 ; [.4171.0020.0002] # YI SYLLABLE SHOT -A3B3 ; [.4172.0020.0002] # YI SYLLABLE SHOX -A3B4 ; [.4173.0020.0002] # YI SYLLABLE SHO -A3B5 ; [.4174.0020.0002] # YI SYLLABLE SHOP -A3B6 ; [.4175.0020.0002] # YI SYLLABLE SHET -A3B7 ; [.4176.0020.0002] # YI SYLLABLE SHEX -A3B8 ; [.4177.0020.0002] # YI SYLLABLE SHE -A3B9 ; [.4178.0020.0002] # YI SYLLABLE SHEP -A3BA ; [.4179.0020.0002] # YI SYLLABLE SHUT -A3BB ; [.417A.0020.0002] # YI SYLLABLE SHUX -A3BC ; [.417B.0020.0002] # YI SYLLABLE SHU -A3BD ; [.417C.0020.0002] # YI SYLLABLE SHUP -A3BE ; [.417D.0020.0002] # YI SYLLABLE SHURX -A3BF ; [.417E.0020.0002] # YI SYLLABLE SHUR -A3C0 ; [.417F.0020.0002] # YI SYLLABLE SHYT -A3C1 ; [.4180.0020.0002] # YI SYLLABLE SHYX -A3C2 ; [.4181.0020.0002] # YI SYLLABLE SHY -A3C3 ; [.4182.0020.0002] # YI SYLLABLE SHYP -A3C4 ; [.4183.0020.0002] # YI SYLLABLE SHYRX -A3C5 ; [.4184.0020.0002] # YI SYLLABLE SHYR -A3C6 ; [.4185.0020.0002] # YI SYLLABLE RAT -A3C7 ; [.4186.0020.0002] # YI SYLLABLE RAX -A3C8 ; [.4187.0020.0002] # YI SYLLABLE RA -A3C9 ; [.4188.0020.0002] # YI SYLLABLE RAP -A3CA ; [.4189.0020.0002] # YI SYLLABLE RUOX -A3CB ; [.418A.0020.0002] # YI SYLLABLE RUO -A3CC ; [.418B.0020.0002] # YI SYLLABLE RUOP -A3CD ; [.418C.0020.0002] # YI SYLLABLE ROT -A3CE ; [.418D.0020.0002] # YI SYLLABLE ROX -A3CF ; [.418E.0020.0002] # YI SYLLABLE RO -A3D0 ; [.418F.0020.0002] # YI SYLLABLE ROP -A3D1 ; [.4190.0020.0002] # YI SYLLABLE REX -A3D2 ; [.4191.0020.0002] # YI SYLLABLE RE -A3D3 ; [.4192.0020.0002] # YI SYLLABLE REP -A3D4 ; [.4193.0020.0002] # YI SYLLABLE RUT -A3D5 ; [.4194.0020.0002] # YI SYLLABLE RUX -A3D6 ; [.4195.0020.0002] # YI SYLLABLE RU -A3D7 ; [.4196.0020.0002] # YI SYLLABLE RUP -A3D8 ; [.4197.0020.0002] # YI SYLLABLE RURX -A3D9 ; [.4198.0020.0002] # YI SYLLABLE RUR -A3DA ; [.4199.0020.0002] # YI SYLLABLE RYT -A3DB ; [.419A.0020.0002] # YI SYLLABLE RYX -A3DC ; [.419B.0020.0002] # YI SYLLABLE RY -A3DD ; [.419C.0020.0002] # YI SYLLABLE RYP -A3DE ; [.419D.0020.0002] # YI SYLLABLE RYRX -A3DF ; [.419E.0020.0002] # YI SYLLABLE RYR -A3E0 ; [.419F.0020.0002] # YI SYLLABLE JIT -A3E1 ; [.41A0.0020.0002] # YI SYLLABLE JIX -A3E2 ; [.41A1.0020.0002] # YI SYLLABLE JI -A3E3 ; [.41A2.0020.0002] # YI SYLLABLE JIP -A3E4 ; [.41A3.0020.0002] # YI SYLLABLE JIET -A3E5 ; [.41A4.0020.0002] # YI SYLLABLE JIEX -A3E6 ; [.41A5.0020.0002] # YI SYLLABLE JIE -A3E7 ; [.41A6.0020.0002] # YI SYLLABLE JIEP -A3E8 ; [.41A7.0020.0002] # YI SYLLABLE JUOT -A3E9 ; [.41A8.0020.0002] # YI SYLLABLE JUOX -A3EA ; [.41A9.0020.0002] # YI SYLLABLE JUO -A3EB ; [.41AA.0020.0002] # YI SYLLABLE JUOP -A3EC ; [.41AB.0020.0002] # YI SYLLABLE JOT -A3ED ; [.41AC.0020.0002] # YI SYLLABLE JOX -A3EE ; [.41AD.0020.0002] # YI SYLLABLE JO -A3EF ; [.41AE.0020.0002] # YI SYLLABLE JOP -A3F0 ; [.41AF.0020.0002] # YI SYLLABLE JUT -A3F1 ; [.41B0.0020.0002] # YI SYLLABLE JUX -A3F2 ; [.41B1.0020.0002] # YI SYLLABLE JU -A3F3 ; [.41B2.0020.0002] # YI SYLLABLE JUP -A3F4 ; [.41B3.0020.0002] # YI SYLLABLE JURX -A3F5 ; [.41B4.0020.0002] # YI SYLLABLE JUR -A3F6 ; [.41B5.0020.0002] # YI SYLLABLE JYT -A3F7 ; [.41B6.0020.0002] # YI SYLLABLE JYX -A3F8 ; [.41B7.0020.0002] # YI SYLLABLE JY -A3F9 ; [.41B8.0020.0002] # YI SYLLABLE JYP -A3FA ; [.41B9.0020.0002] # YI SYLLABLE JYRX -A3FB ; [.41BA.0020.0002] # YI SYLLABLE JYR -A3FC ; [.41BB.0020.0002] # YI SYLLABLE QIT -A3FD ; [.41BC.0020.0002] # YI SYLLABLE QIX -A3FE ; [.41BD.0020.0002] # YI SYLLABLE QI -A3FF ; [.41BE.0020.0002] # YI SYLLABLE QIP -A400 ; [.41BF.0020.0002] # YI SYLLABLE QIET -A401 ; [.41C0.0020.0002] # YI SYLLABLE QIEX -A402 ; [.41C1.0020.0002] # YI SYLLABLE QIE -A403 ; [.41C2.0020.0002] # YI SYLLABLE QIEP -A404 ; [.41C3.0020.0002] # YI SYLLABLE QUOT -A405 ; [.41C4.0020.0002] # YI SYLLABLE QUOX -A406 ; [.41C5.0020.0002] # YI SYLLABLE QUO -A407 ; [.41C6.0020.0002] # YI SYLLABLE QUOP -A408 ; [.41C7.0020.0002] # YI SYLLABLE QOT -A409 ; [.41C8.0020.0002] # YI SYLLABLE QOX -A40A ; [.41C9.0020.0002] # YI SYLLABLE QO -A40B ; [.41CA.0020.0002] # YI SYLLABLE QOP -A40C ; [.41CB.0020.0002] # YI SYLLABLE QUT -A40D ; [.41CC.0020.0002] # YI SYLLABLE QUX -A40E ; [.41CD.0020.0002] # YI SYLLABLE QU -A40F ; [.41CE.0020.0002] # YI SYLLABLE QUP -A410 ; [.41CF.0020.0002] # YI SYLLABLE QURX -A411 ; [.41D0.0020.0002] # YI SYLLABLE QUR -A412 ; [.41D1.0020.0002] # YI SYLLABLE QYT -A413 ; [.41D2.0020.0002] # YI SYLLABLE QYX -A414 ; [.41D3.0020.0002] # YI SYLLABLE QY -A415 ; [.41D4.0020.0002] # YI SYLLABLE QYP -A416 ; [.41D5.0020.0002] # YI SYLLABLE QYRX -A417 ; [.41D6.0020.0002] # YI SYLLABLE QYR -A418 ; [.41D7.0020.0002] # YI SYLLABLE JJIT -A419 ; [.41D8.0020.0002] # YI SYLLABLE JJIX -A41A ; [.41D9.0020.0002] # YI SYLLABLE JJI -A41B ; [.41DA.0020.0002] # YI SYLLABLE JJIP -A41C ; [.41DB.0020.0002] # YI SYLLABLE JJIET -A41D ; [.41DC.0020.0002] # YI SYLLABLE JJIEX -A41E ; [.41DD.0020.0002] # YI SYLLABLE JJIE -A41F ; [.41DE.0020.0002] # YI SYLLABLE JJIEP -A420 ; [.41DF.0020.0002] # YI SYLLABLE JJUOX -A421 ; [.41E0.0020.0002] # YI SYLLABLE JJUO -A422 ; [.41E1.0020.0002] # YI SYLLABLE JJUOP -A423 ; [.41E2.0020.0002] # YI SYLLABLE JJOT -A424 ; [.41E3.0020.0002] # YI SYLLABLE JJOX -A425 ; [.41E4.0020.0002] # YI SYLLABLE JJO -A426 ; [.41E5.0020.0002] # YI SYLLABLE JJOP -A427 ; [.41E6.0020.0002] # YI SYLLABLE JJUT -A428 ; [.41E7.0020.0002] # YI SYLLABLE JJUX -A429 ; [.41E8.0020.0002] # YI SYLLABLE JJU -A42A ; [.41E9.0020.0002] # YI SYLLABLE JJUP -A42B ; [.41EA.0020.0002] # YI SYLLABLE JJURX -A42C ; [.41EB.0020.0002] # YI SYLLABLE JJUR -A42D ; [.41EC.0020.0002] # YI SYLLABLE JJYT -A42E ; [.41ED.0020.0002] # YI SYLLABLE JJYX -A42F ; [.41EE.0020.0002] # YI SYLLABLE JJY -A430 ; [.41EF.0020.0002] # YI SYLLABLE JJYP -A431 ; [.41F0.0020.0002] # YI SYLLABLE NJIT -A432 ; [.41F1.0020.0002] # YI SYLLABLE NJIX -A433 ; [.41F2.0020.0002] # YI SYLLABLE NJI -A434 ; [.41F3.0020.0002] # YI SYLLABLE NJIP -A435 ; [.41F4.0020.0002] # YI SYLLABLE NJIET -A436 ; [.41F5.0020.0002] # YI SYLLABLE NJIEX -A437 ; [.41F6.0020.0002] # YI SYLLABLE NJIE -A438 ; [.41F7.0020.0002] # YI SYLLABLE NJIEP -A439 ; [.41F8.0020.0002] # YI SYLLABLE NJUOX -A43A ; [.41F9.0020.0002] # YI SYLLABLE NJUO -A43B ; [.41FA.0020.0002] # YI SYLLABLE NJOT -A43C ; [.41FB.0020.0002] # YI SYLLABLE NJOX -A43D ; [.41FC.0020.0002] # YI SYLLABLE NJO -A43E ; [.41FD.0020.0002] # YI SYLLABLE NJOP -A43F ; [.41FE.0020.0002] # YI SYLLABLE NJUX -A440 ; [.41FF.0020.0002] # YI SYLLABLE NJU -A441 ; [.4200.0020.0002] # YI SYLLABLE NJUP -A442 ; [.4201.0020.0002] # YI SYLLABLE NJURX -A443 ; [.4202.0020.0002] # YI SYLLABLE NJUR -A444 ; [.4203.0020.0002] # YI SYLLABLE NJYT -A445 ; [.4204.0020.0002] # YI SYLLABLE NJYX -A446 ; [.4205.0020.0002] # YI SYLLABLE NJY -A447 ; [.4206.0020.0002] # YI SYLLABLE NJYP -A448 ; [.4207.0020.0002] # YI SYLLABLE NJYRX -A449 ; [.4208.0020.0002] # YI SYLLABLE NJYR -A44A ; [.4209.0020.0002] # YI SYLLABLE NYIT -A44B ; [.420A.0020.0002] # YI SYLLABLE NYIX -A44C ; [.420B.0020.0002] # YI SYLLABLE NYI -A44D ; [.420C.0020.0002] # YI SYLLABLE NYIP -A44E ; [.420D.0020.0002] # YI SYLLABLE NYIET -A44F ; [.420E.0020.0002] # YI SYLLABLE NYIEX -A450 ; [.420F.0020.0002] # YI SYLLABLE NYIE -A451 ; [.4210.0020.0002] # YI SYLLABLE NYIEP -A452 ; [.4211.0020.0002] # YI SYLLABLE NYUOX -A453 ; [.4212.0020.0002] # YI SYLLABLE NYUO -A454 ; [.4213.0020.0002] # YI SYLLABLE NYUOP -A455 ; [.4214.0020.0002] # YI SYLLABLE NYOT -A456 ; [.4215.0020.0002] # YI SYLLABLE NYOX -A457 ; [.4216.0020.0002] # YI SYLLABLE NYO -A458 ; [.4217.0020.0002] # YI SYLLABLE NYOP -A459 ; [.4218.0020.0002] # YI SYLLABLE NYUT -A45A ; [.4219.0020.0002] # YI SYLLABLE NYUX -A45B ; [.421A.0020.0002] # YI SYLLABLE NYU -A45C ; [.421B.0020.0002] # YI SYLLABLE NYUP -A45D ; [.421C.0020.0002] # YI SYLLABLE XIT -A45E ; [.421D.0020.0002] # YI SYLLABLE XIX -A45F ; [.421E.0020.0002] # YI SYLLABLE XI -A460 ; [.421F.0020.0002] # YI SYLLABLE XIP -A461 ; [.4220.0020.0002] # YI SYLLABLE XIET -A462 ; [.4221.0020.0002] # YI SYLLABLE XIEX -A463 ; [.4222.0020.0002] # YI SYLLABLE XIE -A464 ; [.4223.0020.0002] # YI SYLLABLE XIEP -A465 ; [.4224.0020.0002] # YI SYLLABLE XUOX -A466 ; [.4225.0020.0002] # YI SYLLABLE XUO -A467 ; [.4226.0020.0002] # YI SYLLABLE XOT -A468 ; [.4227.0020.0002] # YI SYLLABLE XOX -A469 ; [.4228.0020.0002] # YI SYLLABLE XO -A46A ; [.4229.0020.0002] # YI SYLLABLE XOP -A46B ; [.422A.0020.0002] # YI SYLLABLE XYT -A46C ; [.422B.0020.0002] # YI SYLLABLE XYX -A46D ; [.422C.0020.0002] # YI SYLLABLE XY -A46E ; [.422D.0020.0002] # YI SYLLABLE XYP -A46F ; [.422E.0020.0002] # YI SYLLABLE XYRX -A470 ; [.422F.0020.0002] # YI SYLLABLE XYR -A471 ; [.4230.0020.0002] # YI SYLLABLE YIT -A472 ; [.4231.0020.0002] # YI SYLLABLE YIX -A473 ; [.4232.0020.0002] # YI SYLLABLE YI -A474 ; [.4233.0020.0002] # YI SYLLABLE YIP -A475 ; [.4234.0020.0002] # YI SYLLABLE YIET -A476 ; [.4235.0020.0002] # YI SYLLABLE YIEX -A477 ; [.4236.0020.0002] # YI SYLLABLE YIE -A478 ; [.4237.0020.0002] # YI SYLLABLE YIEP -A479 ; [.4238.0020.0002] # YI SYLLABLE YUOT -A47A ; [.4239.0020.0002] # YI SYLLABLE YUOX -A47B ; [.423A.0020.0002] # YI SYLLABLE YUO -A47C ; [.423B.0020.0002] # YI SYLLABLE YUOP -A47D ; [.423C.0020.0002] # YI SYLLABLE YOT -A47E ; [.423D.0020.0002] # YI SYLLABLE YOX -A47F ; [.423E.0020.0002] # YI SYLLABLE YO -A480 ; [.423F.0020.0002] # YI SYLLABLE YOP -A481 ; [.4240.0020.0002] # YI SYLLABLE YUT -A482 ; [.4241.0020.0002] # YI SYLLABLE YUX -A483 ; [.4242.0020.0002] # YI SYLLABLE YU -A484 ; [.4243.0020.0002] # YI SYLLABLE YUP -A485 ; [.4244.0020.0002] # YI SYLLABLE YURX -A486 ; [.4245.0020.0002] # YI SYLLABLE YUR -A487 ; [.4246.0020.0002] # YI SYLLABLE YYT -A488 ; [.4247.0020.0002] # YI SYLLABLE YYX -A489 ; [.4248.0020.0002] # YI SYLLABLE YY -A48A ; [.4249.0020.0002] # YI SYLLABLE YYP -A48B ; [.424A.0020.0002] # YI SYLLABLE YYRX -A48C ; [.424B.0020.0002] # YI SYLLABLE YYR -A4F8 ; [.424C.0020.0002] # LISU LETTER TONE MYA TI -A4F9 ; [.424D.0020.0002] # LISU LETTER TONE NA PO -A4FA ; [.424E.0020.0002] # LISU LETTER TONE MYA CYA -A4FB ; [.424F.0020.0002] # LISU LETTER TONE MYA BO -A4FD ; [.4250.0020.0002] # LISU LETTER TONE MYA JEU -A4FC ; [.4251.0020.0002] # LISU LETTER TONE MYA NA -A4D0 ; [.4252.0020.0002] # LISU LETTER BA -A4D1 ; [.4253.0020.0002] # LISU LETTER PA -A4D2 ; [.4254.0020.0002] # LISU LETTER PHA -A4D3 ; [.4255.0020.0002] # LISU LETTER DA -A4D4 ; [.4256.0020.0002] # LISU LETTER TA -A4D5 ; [.4257.0020.0002] # LISU LETTER THA -A4D6 ; [.4258.0020.0002] # LISU LETTER GA -A4D7 ; [.4259.0020.0002] # LISU LETTER KA -A4D8 ; [.425A.0020.0002] # LISU LETTER KHA -A4D9 ; [.425B.0020.0002] # LISU LETTER JA -A4DA ; [.425C.0020.0002] # LISU LETTER CA -A4DB ; [.425D.0020.0002] # LISU LETTER CHA -A4DC ; [.425E.0020.0002] # LISU LETTER DZA -A4DD ; [.425F.0020.0002] # LISU LETTER TSA -A4DE ; [.4260.0020.0002] # LISU LETTER TSHA -A4DF ; [.4261.0020.0002] # LISU LETTER MA -A4E0 ; [.4262.0020.0002] # LISU LETTER NA -A4E1 ; [.4263.0020.0002] # LISU LETTER LA -A4E2 ; [.4264.0020.0002] # LISU LETTER SA -A4E3 ; [.4265.0020.0002] # LISU LETTER ZHA -A4E4 ; [.4266.0020.0002] # LISU LETTER ZA -A4E5 ; [.4267.0020.0002] # LISU LETTER NGA -A4E6 ; [.4268.0020.0002] # LISU LETTER HA -A4E7 ; [.4269.0020.0002] # LISU LETTER XA -A4E8 ; [.426A.0020.0002] # LISU LETTER HHA -A4E9 ; [.426B.0020.0002] # LISU LETTER FA -A4EB ; [.426C.0020.0002] # LISU LETTER SHA -A4ED ; [.426D.0020.0002] # LISU LETTER GHA -A4EA ; [.426E.0020.0002] # LISU LETTER WA -A4EC ; [.426F.0020.0002] # LISU LETTER YA -A4EE ; [.4270.0020.0002] # LISU LETTER A -A4EF ; [.4271.0020.0002] # LISU LETTER AE -A4F0 ; [.4272.0020.0002] # LISU LETTER E -A4F1 ; [.4273.0020.0002] # LISU LETTER EU -A4F2 ; [.4274.0020.0002] # LISU LETTER I -A4F3 ; [.4275.0020.0002] # LISU LETTER O -A4F4 ; [.4276.0020.0002] # LISU LETTER U -A4F5 ; [.4277.0020.0002] # LISU LETTER UE -A4F6 ; [.4278.0020.0002] # LISU LETTER UH -A4F7 ; [.4279.0020.0002] # LISU LETTER OE -16F00 ; [.427A.0020.0002] # MIAO LETTER PA -16F01 ; [.427B.0020.0002] # MIAO LETTER BA -16F02 ; [.427C.0020.0002] # MIAO LETTER YI PA -16F03 ; [.427D.0020.0002] # MIAO LETTER PLA -16F04 ; [.427E.0020.0002] # MIAO LETTER MA -16F06 ; [.427E.0020.0004] # MIAO LETTER ARCHAIC MA -16F05 ; [.427F.0020.0002] # MIAO LETTER MHA -16F07 ; [.4280.0020.0002] # MIAO LETTER FA -16F08 ; [.4281.0020.0002] # MIAO LETTER VA -16F09 ; [.4282.0020.0002] # MIAO LETTER VFA -16F0A ; [.4283.0020.0002] # MIAO LETTER TA -16F0B ; [.4284.0020.0002] # MIAO LETTER DA -16F0C ; [.4285.0020.0002] # MIAO LETTER YI TTA -16F0D ; [.4286.0020.0002] # MIAO LETTER YI TA -16F0E ; [.4287.0020.0002] # MIAO LETTER TTA -16F0F ; [.4288.0020.0002] # MIAO LETTER DDA -16F10 ; [.4289.0020.0002] # MIAO LETTER NA -16F13 ; [.4289.0020.0004] # MIAO LETTER ARCHAIC NA -16F11 ; [.428A.0020.0002] # MIAO LETTER NHA -16F12 ; [.428B.0020.0002] # MIAO LETTER YI NNA -16F14 ; [.428C.0020.0002] # MIAO LETTER NNA -16F15 ; [.428D.0020.0002] # MIAO LETTER NNHA -16F16 ; [.428E.0020.0002] # MIAO LETTER LA -16F17 ; [.428F.0020.0002] # MIAO LETTER LYA -16F18 ; [.4290.0020.0002] # MIAO LETTER LHA -16F19 ; [.4291.0020.0002] # MIAO LETTER LHYA -16F1A ; [.4292.0020.0002] # MIAO LETTER TLHA -16F1B ; [.4293.0020.0002] # MIAO LETTER DLHA -16F1C ; [.4294.0020.0002] # MIAO LETTER TLHYA -16F1D ; [.4295.0020.0002] # MIAO LETTER DLHYA -16F1E ; [.4296.0020.0002] # MIAO LETTER KA -16F1F ; [.4297.0020.0002] # MIAO LETTER GA -16F20 ; [.4298.0020.0002] # MIAO LETTER YI KA -16F21 ; [.4299.0020.0002] # MIAO LETTER QA -16F22 ; [.429A.0020.0002] # MIAO LETTER QGA -16F23 ; [.429B.0020.0002] # MIAO LETTER NGA -16F25 ; [.429B.0020.0004] # MIAO LETTER ARCHAIC NGA -16F24 ; [.429C.0020.0002] # MIAO LETTER NGHA -16F26 ; [.429D.0020.0002] # MIAO LETTER HA -16F27 ; [.429E.0020.0002] # MIAO LETTER XA -16F28 ; [.429F.0020.0002] # MIAO LETTER GHA -16F29 ; [.42A0.0020.0002] # MIAO LETTER GHHA -16F2A ; [.42A1.0020.0002] # MIAO LETTER TSSA -16F2B ; [.42A2.0020.0002] # MIAO LETTER DZZA -16F2C ; [.42A3.0020.0002] # MIAO LETTER NYA -16F2D ; [.42A4.0020.0002] # MIAO LETTER NYHA -16F2E ; [.42A5.0020.0002] # MIAO LETTER TSHA -16F2F ; [.42A6.0020.0002] # MIAO LETTER DZHA -16F30 ; [.42A7.0020.0002] # MIAO LETTER YI TSHA -16F31 ; [.42A8.0020.0002] # MIAO LETTER YI DZHA -16F32 ; [.42A9.0020.0002] # MIAO LETTER REFORMED TSHA -16F33 ; [.42AA.0020.0002] # MIAO LETTER SHA -16F34 ; [.42AB.0020.0002] # MIAO LETTER SSA -16F35 ; [.42AC.0020.0002] # MIAO LETTER ZHA -16F36 ; [.42AD.0020.0002] # MIAO LETTER ZSHA -16F37 ; [.42AE.0020.0002] # MIAO LETTER TSA -16F38 ; [.42AF.0020.0002] # MIAO LETTER DZA -16F39 ; [.42B0.0020.0002] # MIAO LETTER YI TSA -16F3A ; [.42B1.0020.0002] # MIAO LETTER SA -16F3B ; [.42B2.0020.0002] # MIAO LETTER ZA -16F3C ; [.42B3.0020.0002] # MIAO LETTER ZSA -16F3D ; [.42B4.0020.0002] # MIAO LETTER ZZA -16F3F ; [.42B4.0020.0004] # MIAO LETTER ARCHAIC ZZA -16F3E ; [.42B5.0020.0002] # MIAO LETTER ZZSA -16F40 ; [.42B6.0020.0002] # MIAO LETTER ZZYA -16F41 ; [.42B7.0020.0002] # MIAO LETTER ZZSYA -16F42 ; [.42B8.0020.0002] # MIAO LETTER WA -16F43 ; [.42B9.0020.0002] # MIAO LETTER AH -16F44 ; [.42BA.0020.0002] # MIAO LETTER HHA -16F50 ; [.42BB.0020.0002] # MIAO LETTER NASALIZATION -16F51 ; [.42BC.0020.0002] # MIAO SIGN ASPIRATION -16F52 ; [.42BD.0020.0002] # MIAO SIGN REFORMED VOICING -16F53 ; [.42BE.0020.0002] # MIAO SIGN REFORMED ASPIRATION -16F54 ; [.42BF.0020.0002] # MIAO VOWEL SIGN A -16F55 ; [.42C0.0020.0002] # MIAO VOWEL SIGN AA -16F56 ; [.42C1.0020.0002] # MIAO VOWEL SIGN AHH -16F57 ; [.42C2.0020.0002] # MIAO VOWEL SIGN AN -16F58 ; [.42C3.0020.0002] # MIAO VOWEL SIGN ANG -16F59 ; [.42C4.0020.0002] # MIAO VOWEL SIGN O -16F5A ; [.42C5.0020.0002] # MIAO VOWEL SIGN OO -16F5B ; [.42C6.0020.0002] # MIAO VOWEL SIGN WO -16F5C ; [.42C7.0020.0002] # MIAO VOWEL SIGN W -16F5D ; [.42C8.0020.0002] # MIAO VOWEL SIGN E -16F5E ; [.42C9.0020.0002] # MIAO VOWEL SIGN EN -16F5F ; [.42CA.0020.0002] # MIAO VOWEL SIGN ENG -16F60 ; [.42CB.0020.0002] # MIAO VOWEL SIGN OEY -16F61 ; [.42CC.0020.0002] # MIAO VOWEL SIGN I -16F62 ; [.42CD.0020.0002] # MIAO VOWEL SIGN IA -16F63 ; [.42CE.0020.0002] # MIAO VOWEL SIGN IAN -16F64 ; [.42CF.0020.0002] # MIAO VOWEL SIGN IANG -16F65 ; [.42D0.0020.0002] # MIAO VOWEL SIGN IO -16F66 ; [.42D1.0020.0002] # MIAO VOWEL SIGN IE -16F67 ; [.42D2.0020.0002] # MIAO VOWEL SIGN II -16F68 ; [.42D3.0020.0002] # MIAO VOWEL SIGN IU -16F69 ; [.42D4.0020.0002] # MIAO VOWEL SIGN ING -16F6A ; [.42D5.0020.0002] # MIAO VOWEL SIGN U -16F6B ; [.42D6.0020.0002] # MIAO VOWEL SIGN UA -16F6C ; [.42D7.0020.0002] # MIAO VOWEL SIGN UAN -16F6D ; [.42D8.0020.0002] # MIAO VOWEL SIGN UANG -16F6E ; [.42D9.0020.0002] # MIAO VOWEL SIGN UU -16F6F ; [.42DA.0020.0002] # MIAO VOWEL SIGN UEI -16F70 ; [.42DB.0020.0002] # MIAO VOWEL SIGN UNG -16F71 ; [.42DC.0020.0002] # MIAO VOWEL SIGN Y -16F72 ; [.42DD.0020.0002] # MIAO VOWEL SIGN YI -16F73 ; [.42DE.0020.0002] # MIAO VOWEL SIGN AE -16F74 ; [.42DF.0020.0002] # MIAO VOWEL SIGN AEE -16F75 ; [.42E0.0020.0002] # MIAO VOWEL SIGN ERR -16F76 ; [.42E1.0020.0002] # MIAO VOWEL SIGN ROUNDED ERR -16F77 ; [.42E2.0020.0002] # MIAO VOWEL SIGN ER -16F78 ; [.42E3.0020.0002] # MIAO VOWEL SIGN ROUNDED ER -16F79 ; [.42E4.0020.0002] # MIAO VOWEL SIGN AI -16F7A ; [.42E5.0020.0002] # MIAO VOWEL SIGN EI -16F7B ; [.42E6.0020.0002] # MIAO VOWEL SIGN AU -16F7C ; [.42E7.0020.0002] # MIAO VOWEL SIGN OU -16F7D ; [.42E8.0020.0002] # MIAO VOWEL SIGN N -16F7E ; [.42E9.0020.0002] # MIAO VOWEL SIGN NG -16F8F ; [.42EA.0020.0002] # MIAO TONE RIGHT -16F90 ; [.42EB.0020.0002] # MIAO TONE TOP RIGHT -16F91 ; [.42EC.0020.0002] # MIAO TONE ABOVE -16F92 ; [.42ED.0020.0002] # MIAO TONE BELOW -16F93 ; [.42EE.0020.0002] # MIAO LETTER TONE-2 -16F94 ; [.42EF.0020.0002] # MIAO LETTER TONE-3 -16F95 ; [.42F0.0020.0002] # MIAO LETTER TONE-4 -16F96 ; [.42F1.0020.0002] # MIAO LETTER TONE-5 -16F97 ; [.42F2.0020.0002] # MIAO LETTER TONE-6 -16F98 ; [.42F3.0020.0002] # MIAO LETTER TONE-7 -16F99 ; [.42F4.0020.0002] # MIAO LETTER TONE-8 -16F9A ; [.42F5.0020.0002] # MIAO LETTER REFORMED TONE-1 -16F9B ; [.42F6.0020.0002] # MIAO LETTER REFORMED TONE-2 -16F9C ; [.42F7.0020.0002] # MIAO LETTER REFORMED TONE-4 -16F9D ; [.42F8.0020.0002] # MIAO LETTER REFORMED TONE-5 -16F9E ; [.42F9.0020.0002] # MIAO LETTER REFORMED TONE-6 -16F9F ; [.42FA.0020.0002] # MIAO LETTER REFORMED TONE-8 -118FF ; [.42FB.0020.0002] # WARANG CITI OM -118C0 ; [.42FC.0020.0002] # WARANG CITI SMALL LETTER NGAA -118A0 ; [.42FC.0020.0008] # WARANG CITI CAPITAL LETTER NGAA -118C1 ; [.42FD.0020.0002] # WARANG CITI SMALL LETTER A -118A1 ; [.42FD.0020.0008] # WARANG CITI CAPITAL LETTER A -118C2 ; [.42FE.0020.0002] # WARANG CITI SMALL LETTER WI -118A2 ; [.42FE.0020.0008] # WARANG CITI CAPITAL LETTER WI -118C3 ; [.42FF.0020.0002] # WARANG CITI SMALL LETTER YU -118A3 ; [.42FF.0020.0008] # WARANG CITI CAPITAL LETTER YU -118C4 ; [.4300.0020.0002] # WARANG CITI SMALL LETTER YA -118A4 ; [.4300.0020.0008] # WARANG CITI CAPITAL LETTER YA -118C5 ; [.4301.0020.0002] # WARANG CITI SMALL LETTER YO -118A5 ; [.4301.0020.0008] # WARANG CITI CAPITAL LETTER YO -118C6 ; [.4302.0020.0002] # WARANG CITI SMALL LETTER II -118A6 ; [.4302.0020.0008] # WARANG CITI CAPITAL LETTER II -118C7 ; [.4303.0020.0002] # WARANG CITI SMALL LETTER UU -118A7 ; [.4303.0020.0008] # WARANG CITI CAPITAL LETTER UU -118C8 ; [.4304.0020.0002] # WARANG CITI SMALL LETTER E -118A8 ; [.4304.0020.0008] # WARANG CITI CAPITAL LETTER E -118C9 ; [.4305.0020.0002] # WARANG CITI SMALL LETTER O -118A9 ; [.4305.0020.0008] # WARANG CITI CAPITAL LETTER O -118CA ; [.4306.0020.0002] # WARANG CITI SMALL LETTER ANG -118AA ; [.4306.0020.0008] # WARANG CITI CAPITAL LETTER ANG -118CB ; [.4307.0020.0002] # WARANG CITI SMALL LETTER GA -118AB ; [.4307.0020.0008] # WARANG CITI CAPITAL LETTER GA -118CC ; [.4308.0020.0002] # WARANG CITI SMALL LETTER KO -118AC ; [.4308.0020.0008] # WARANG CITI CAPITAL LETTER KO -118CD ; [.4309.0020.0002] # WARANG CITI SMALL LETTER ENY -118AD ; [.4309.0020.0008] # WARANG CITI CAPITAL LETTER ENY -118CE ; [.430A.0020.0002] # WARANG CITI SMALL LETTER YUJ -118AE ; [.430A.0020.0008] # WARANG CITI CAPITAL LETTER YUJ -118CF ; [.430B.0020.0002] # WARANG CITI SMALL LETTER UC -118AF ; [.430B.0020.0008] # WARANG CITI CAPITAL LETTER UC -118D0 ; [.430C.0020.0002] # WARANG CITI SMALL LETTER ENN -118B0 ; [.430C.0020.0008] # WARANG CITI CAPITAL LETTER ENN -118D1 ; [.430D.0020.0002] # WARANG CITI SMALL LETTER ODD -118B1 ; [.430D.0020.0008] # WARANG CITI CAPITAL LETTER ODD -118D2 ; [.430E.0020.0002] # WARANG CITI SMALL LETTER TTE -118B2 ; [.430E.0020.0008] # WARANG CITI CAPITAL LETTER TTE -118D3 ; [.430F.0020.0002] # WARANG CITI SMALL LETTER NUNG -118B3 ; [.430F.0020.0008] # WARANG CITI CAPITAL LETTER NUNG -118D4 ; [.4310.0020.0002] # WARANG CITI SMALL LETTER DA -118B4 ; [.4310.0020.0008] # WARANG CITI CAPITAL LETTER DA -118D5 ; [.4311.0020.0002] # WARANG CITI SMALL LETTER AT -118B5 ; [.4311.0020.0008] # WARANG CITI CAPITAL LETTER AT -118D6 ; [.4312.0020.0002] # WARANG CITI SMALL LETTER AM -118B6 ; [.4312.0020.0008] # WARANG CITI CAPITAL LETTER AM -118D7 ; [.4313.0020.0002] # WARANG CITI SMALL LETTER BU -118B7 ; [.4313.0020.0008] # WARANG CITI CAPITAL LETTER BU -118D8 ; [.4314.0020.0002] # WARANG CITI SMALL LETTER PU -118B8 ; [.4314.0020.0008] # WARANG CITI CAPITAL LETTER PU -118D9 ; [.4315.0020.0002] # WARANG CITI SMALL LETTER HIYO -118B9 ; [.4315.0020.0008] # WARANG CITI CAPITAL LETTER HIYO -118DA ; [.4316.0020.0002] # WARANG CITI SMALL LETTER HOLO -118BA ; [.4316.0020.0008] # WARANG CITI CAPITAL LETTER HOLO -118DB ; [.4317.0020.0002] # WARANG CITI SMALL LETTER HORR -118BB ; [.4317.0020.0008] # WARANG CITI CAPITAL LETTER HORR -118DC ; [.4318.0020.0002] # WARANG CITI SMALL LETTER HAR -118BC ; [.4318.0020.0008] # WARANG CITI CAPITAL LETTER HAR -118DD ; [.4319.0020.0002] # WARANG CITI SMALL LETTER SSUU -118BD ; [.4319.0020.0008] # WARANG CITI CAPITAL LETTER SSUU -118DE ; [.431A.0020.0002] # WARANG CITI SMALL LETTER SII -118BE ; [.431A.0020.0008] # WARANG CITI CAPITAL LETTER SII -118DF ; [.431B.0020.0002] # WARANG CITI SMALL LETTER VIYO -118BF ; [.431B.0020.0008] # WARANG CITI CAPITAL LETTER VIYO -11AD5 ; [.431C.0020.0002] # PAU CIN HAU LETTER A -11AD6 ; [.431D.0020.0002] # PAU CIN HAU LETTER E -11AD7 ; [.431E.0020.0002] # PAU CIN HAU LETTER I -11AD8 ; [.431F.0020.0002] # PAU CIN HAU LETTER O -11AD9 ; [.4320.0020.0002] # PAU CIN HAU LETTER U -11ADA ; [.4321.0020.0002] # PAU CIN HAU LETTER UA -11ADB ; [.4322.0020.0002] # PAU CIN HAU LETTER IA -11AC0 ; [.4323.0020.0002] # PAU CIN HAU LETTER PA -11AC1 ; [.4324.0020.0002] # PAU CIN HAU LETTER KA -11AC2 ; [.4325.0020.0002] # PAU CIN HAU LETTER LA -11AC3 ; [.4326.0020.0002] # PAU CIN HAU LETTER MA -11AC4 ; [.4327.0020.0002] # PAU CIN HAU LETTER DA -11AC5 ; [.4328.0020.0002] # PAU CIN HAU LETTER ZA -11AC6 ; [.4329.0020.0002] # PAU CIN HAU LETTER VA -11AC7 ; [.432A.0020.0002] # PAU CIN HAU LETTER NGA -11AC8 ; [.432B.0020.0002] # PAU CIN HAU LETTER HA -11AC9 ; [.432C.0020.0002] # PAU CIN HAU LETTER GA -11ACA ; [.432D.0020.0002] # PAU CIN HAU LETTER KHA -11ACB ; [.432E.0020.0002] # PAU CIN HAU LETTER SA -11ACC ; [.432F.0020.0002] # PAU CIN HAU LETTER BA -11ACD ; [.4330.0020.0002] # PAU CIN HAU LETTER CA -11ACE ; [.4331.0020.0002] # PAU CIN HAU LETTER TA -11ACF ; [.4332.0020.0002] # PAU CIN HAU LETTER THA -11AD0 ; [.4333.0020.0002] # PAU CIN HAU LETTER NA -11AD1 ; [.4334.0020.0002] # PAU CIN HAU LETTER PHA -11AD2 ; [.4335.0020.0002] # PAU CIN HAU LETTER RA -11AD3 ; [.4336.0020.0002] # PAU CIN HAU LETTER FA -11AD4 ; [.4337.0020.0002] # PAU CIN HAU LETTER CHA -11ADC ; [.4338.0020.0002] # PAU CIN HAU LETTER FINAL P -11ADD ; [.4339.0020.0002] # PAU CIN HAU LETTER FINAL K -11ADF ; [.433A.0020.0002] # PAU CIN HAU LETTER FINAL M -11AE0 ; [.433B.0020.0002] # PAU CIN HAU LETTER FINAL N -11AE1 ; [.433C.0020.0002] # PAU CIN HAU LETTER FINAL L -11AE2 ; [.433D.0020.0002] # PAU CIN HAU LETTER FINAL W -11AE3 ; [.433E.0020.0002] # PAU CIN HAU LETTER FINAL NG -11ADE ; [.433F.0020.0002] # PAU CIN HAU LETTER FINAL T -11AE4 ; [.4340.0020.0002] # PAU CIN HAU LETTER FINAL Y -11AEF ; [.4341.0020.0002] # PAU CIN HAU MID-LEVEL TONE -11AF2 ; [.4342.0020.0002] # PAU CIN HAU MID-LEVEL TONE FINAL -11AF1 ; [.4343.0020.0002] # PAU CIN HAU MID-LEVEL TONE LONG FINAL -11AE6 ; [.4344.0020.0002] # PAU CIN HAU RISING TONE -11AE9 ; [.4345.0020.0002] # PAU CIN HAU RISING TONE FINAL -11AE5 ; [.4346.0020.0002] # PAU CIN HAU RISING TONE LONG -11AE8 ; [.4347.0020.0002] # PAU CIN HAU RISING TONE LONG FINAL -11AF4 ; [.4348.0020.0002] # PAU CIN HAU LOW-FALLING TONE -11AF7 ; [.4349.0020.0002] # PAU CIN HAU LOW-FALLING TONE FINAL -11AF3 ; [.434A.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG -11AF6 ; [.434B.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG FINAL -11AEC ; [.434C.0020.0002] # PAU CIN HAU SANDHI TONE -11AEE ; [.434D.0020.0002] # PAU CIN HAU SANDHI TONE FINAL -11AEB ; [.434E.0020.0002] # PAU CIN HAU SANDHI TONE LONG -11AED ; [.434F.0020.0002] # PAU CIN HAU SANDHI TONE LONG FINAL -11AF5 ; [.4350.0020.0002] # PAU CIN HAU GLOTTAL STOP -11AF8 ; [.4351.0020.0002] # PAU CIN HAU GLOTTAL STOP FINAL -11AE7 ; [.4352.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP -11AEA ; [.4353.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP FINAL -11AF0 ; [.4354.0020.0002] # PAU CIN HAU GLOTTAL STOP VARIANT -16B00 ; [.4355.0020.0002] # PAHAWH HMONG VOWEL KEEB -16B01 ; [.4356.0020.0002] # PAHAWH HMONG VOWEL KEEV -16B02 ; [.4357.0020.0002] # PAHAWH HMONG VOWEL KIB -16B03 ; [.4358.0020.0002] # PAHAWH HMONG VOWEL KIV -16B04 ; [.4359.0020.0002] # PAHAWH HMONG VOWEL KAUB -16B05 ; [.435A.0020.0002] # PAHAWH HMONG VOWEL KAUV -16B06 ; [.435B.0020.0002] # PAHAWH HMONG VOWEL KUB -16B07 ; [.435C.0020.0002] # PAHAWH HMONG VOWEL KUV -16B08 ; [.435D.0020.0002] # PAHAWH HMONG VOWEL KEB -16B09 ; [.435E.0020.0002] # PAHAWH HMONG VOWEL KEV -16B0A ; [.435F.0020.0002] # PAHAWH HMONG VOWEL KAIB -16B0B ; [.4360.0020.0002] # PAHAWH HMONG VOWEL KAIV -16B0C ; [.4361.0020.0002] # PAHAWH HMONG VOWEL KOOB -16B0D ; [.4362.0020.0002] # PAHAWH HMONG VOWEL KOOV -16B0E ; [.4363.0020.0002] # PAHAWH HMONG VOWEL KAWB -16B0F ; [.4364.0020.0002] # PAHAWH HMONG VOWEL KAWV -16B10 ; [.4365.0020.0002] # PAHAWH HMONG VOWEL KUAB -16B11 ; [.4366.0020.0002] # PAHAWH HMONG VOWEL KUAV -16B12 ; [.4367.0020.0002] # PAHAWH HMONG VOWEL KOB -16B13 ; [.4368.0020.0002] # PAHAWH HMONG VOWEL KOV -16B14 ; [.4369.0020.0002] # PAHAWH HMONG VOWEL KIAB -16B15 ; [.436A.0020.0002] # PAHAWH HMONG VOWEL KIAV -16B16 ; [.436B.0020.0002] # PAHAWH HMONG VOWEL KAB -16B17 ; [.436C.0020.0002] # PAHAWH HMONG VOWEL KAV -16B18 ; [.436D.0020.0002] # PAHAWH HMONG VOWEL KWB -16B19 ; [.436E.0020.0002] # PAHAWH HMONG VOWEL KWV -16B1A ; [.436F.0020.0002] # PAHAWH HMONG VOWEL KAAB -16B1B ; [.4370.0020.0002] # PAHAWH HMONG VOWEL KAAV -16B1C ; [.4371.0020.0002] # PAHAWH HMONG CONSONANT VAU -16B1D ; [.4372.0020.0002] # PAHAWH HMONG CONSONANT NTSAU -16B1E ; [.4373.0020.0002] # PAHAWH HMONG CONSONANT LAU -16B1F ; [.4374.0020.0002] # PAHAWH HMONG CONSONANT HAU -16B20 ; [.4375.0020.0002] # PAHAWH HMONG CONSONANT NLAU -16B21 ; [.4376.0020.0002] # PAHAWH HMONG CONSONANT RAU -16B22 ; [.4377.0020.0002] # PAHAWH HMONG CONSONANT NKAU -16B23 ; [.4378.0020.0002] # PAHAWH HMONG CONSONANT QHAU -16B24 ; [.4379.0020.0002] # PAHAWH HMONG CONSONANT YAU -16B25 ; [.437A.0020.0002] # PAHAWH HMONG CONSONANT HLAU -16B26 ; [.437B.0020.0002] # PAHAWH HMONG CONSONANT MAU -16B27 ; [.437C.0020.0002] # PAHAWH HMONG CONSONANT CHAU -16B28 ; [.437D.0020.0002] # PAHAWH HMONG CONSONANT NCHAU -16B29 ; [.437E.0020.0002] # PAHAWH HMONG CONSONANT HNAU -16B2A ; [.437F.0020.0002] # PAHAWH HMONG CONSONANT PLHAU -16B2B ; [.4380.0020.0002] # PAHAWH HMONG CONSONANT NTHAU -16B2C ; [.4381.0020.0002] # PAHAWH HMONG CONSONANT NAU -16B2D ; [.4382.0020.0002] # PAHAWH HMONG CONSONANT AU -16B2E ; [.4383.0020.0002] # PAHAWH HMONG CONSONANT XAU -16B2F ; [.4384.0020.0002] # PAHAWH HMONG CONSONANT CAU -16B40 ; [.4385.0020.0002] # PAHAWH HMONG SIGN VOS SEEV -16B41 ; [.4386.0020.0002] # PAHAWH HMONG SIGN MEEJ SUAB -16B63 ; [.4387.0020.0002] # PAHAWH HMONG SIGN VOS LUB -16B64 ; [.4388.0020.0002] # PAHAWH HMONG SIGN XYOO -16B65 ; [.4389.0020.0002] # PAHAWH HMONG SIGN HLI -16B66 ; [.438A.0020.0002] # PAHAWH HMONG SIGN THIRD-STAGE HLI -16B67 ; [.438B.0020.0002] # PAHAWH HMONG SIGN ZWJ THAJ -16B68 ; [.438C.0020.0002] # PAHAWH HMONG SIGN HNUB -16B69 ; [.438D.0020.0002] # PAHAWH HMONG SIGN NQIG -16B6A ; [.438E.0020.0002] # PAHAWH HMONG SIGN XIAB -16B6B ; [.438F.0020.0002] # PAHAWH HMONG SIGN NTUJ -16B6C ; [.4390.0020.0002] # PAHAWH HMONG SIGN AV -16B6D ; [.4391.0020.0002] # PAHAWH HMONG SIGN TXHEEJ CEEV -16B6E ; [.4392.0020.0002] # PAHAWH HMONG SIGN MEEJ TSEEB -16B6F ; [.4393.0020.0002] # PAHAWH HMONG SIGN TAU -16B70 ; [.4394.0020.0002] # PAHAWH HMONG SIGN LOS -16B71 ; [.4395.0020.0002] # PAHAWH HMONG SIGN MUS -16B72 ; [.4396.0020.0002] # PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG -16B73 ; [.4397.0020.0002] # PAHAWH HMONG SIGN CIM CUAM TSHOOJ -16B74 ; [.4398.0020.0002] # PAHAWH HMONG SIGN CIM TXWV -16B75 ; [.4399.0020.0002] # PAHAWH HMONG SIGN CIM TXWV CHWV -16B76 ; [.439A.0020.0002] # PAHAWH HMONG SIGN CIM PUB DAWB -16B77 ; [.439B.0020.0002] # PAHAWH HMONG SIGN CIM NRES TOS -16B7D ; [.439C.0020.0002] # PAHAWH HMONG CLAN SIGN TSHEEJ -16B7E ; [.439D.0020.0002] # PAHAWH HMONG CLAN SIGN YEEG -16B7F ; [.439E.0020.0002] # PAHAWH HMONG CLAN SIGN LIS -16B80 ; [.439F.0020.0002] # PAHAWH HMONG CLAN SIGN LAUJ -16B81 ; [.43A0.0020.0002] # PAHAWH HMONG CLAN SIGN XYOOJ -16B82 ; [.43A1.0020.0002] # PAHAWH HMONG CLAN SIGN KOO -16B83 ; [.43A2.0020.0002] # PAHAWH HMONG CLAN SIGN HAWJ -16B84 ; [.43A3.0020.0002] # PAHAWH HMONG CLAN SIGN MUAS -16B85 ; [.43A4.0020.0002] # PAHAWH HMONG CLAN SIGN THOJ -16B86 ; [.43A5.0020.0002] # PAHAWH HMONG CLAN SIGN TSAB -16B87 ; [.43A6.0020.0002] # PAHAWH HMONG CLAN SIGN PHAB -16B88 ; [.43A7.0020.0002] # PAHAWH HMONG CLAN SIGN KHAB -16B89 ; [.43A8.0020.0002] # PAHAWH HMONG CLAN SIGN HAM -16B8A ; [.43A9.0020.0002] # PAHAWH HMONG CLAN SIGN VAJ -16B8B ; [.43AA.0020.0002] # PAHAWH HMONG CLAN SIGN FAJ -16B8C ; [.43AB.0020.0002] # PAHAWH HMONG CLAN SIGN YAJ -16B8D ; [.43AC.0020.0002] # PAHAWH HMONG CLAN SIGN TSWB -16B8E ; [.43AD.0020.0002] # PAHAWH HMONG CLAN SIGN KWM -16B8F ; [.43AE.0020.0002] # PAHAWH HMONG CLAN SIGN VWJ -10280 ; [.43AF.0020.0002] # LYCIAN LETTER A -10281 ; [.43B0.0020.0002] # LYCIAN LETTER E -10282 ; [.43B1.0020.0002] # LYCIAN LETTER B -10283 ; [.43B2.0020.0002] # LYCIAN LETTER BH -10284 ; [.43B3.0020.0002] # LYCIAN LETTER G -10285 ; [.43B4.0020.0002] # LYCIAN LETTER D -10286 ; [.43B5.0020.0002] # LYCIAN LETTER I -10287 ; [.43B6.0020.0002] # LYCIAN LETTER W -10288 ; [.43B7.0020.0002] # LYCIAN LETTER Z -10289 ; [.43B8.0020.0002] # LYCIAN LETTER TH -1028A ; [.43B9.0020.0002] # LYCIAN LETTER J -1028B ; [.43BA.0020.0002] # LYCIAN LETTER K -1028C ; [.43BB.0020.0002] # LYCIAN LETTER Q -1028D ; [.43BC.0020.0002] # LYCIAN LETTER L -1028E ; [.43BD.0020.0002] # LYCIAN LETTER M -1028F ; [.43BE.0020.0002] # LYCIAN LETTER N -10290 ; [.43BF.0020.0002] # LYCIAN LETTER MM -10291 ; [.43C0.0020.0002] # LYCIAN LETTER NN -10292 ; [.43C1.0020.0002] # LYCIAN LETTER U -10293 ; [.43C2.0020.0002] # LYCIAN LETTER P -10294 ; [.43C3.0020.0002] # LYCIAN LETTER KK -10295 ; [.43C4.0020.0002] # LYCIAN LETTER R -10296 ; [.43C5.0020.0002] # LYCIAN LETTER S -10297 ; [.43C6.0020.0002] # LYCIAN LETTER T -10298 ; [.43C7.0020.0002] # LYCIAN LETTER TT -10299 ; [.43C8.0020.0002] # LYCIAN LETTER AN -1029A ; [.43C9.0020.0002] # LYCIAN LETTER EN -1029B ; [.43CA.0020.0002] # LYCIAN LETTER H -1029C ; [.43CB.0020.0002] # LYCIAN LETTER X -102A0 ; [.43CC.0020.0002] # CARIAN LETTER A -102A1 ; [.43CD.0020.0002] # CARIAN LETTER P2 -102A2 ; [.43CE.0020.0002] # CARIAN LETTER D -102A3 ; [.43CF.0020.0002] # CARIAN LETTER L -102A4 ; [.43D0.0020.0002] # CARIAN LETTER UUU -102A5 ; [.43D1.0020.0002] # CARIAN LETTER R -102A6 ; [.43D2.0020.0002] # CARIAN LETTER LD -102A7 ; [.43D3.0020.0002] # CARIAN LETTER A2 -102A8 ; [.43D4.0020.0002] # CARIAN LETTER Q -102A9 ; [.43D5.0020.0002] # CARIAN LETTER B -102AA ; [.43D6.0020.0002] # CARIAN LETTER M -102AB ; [.43D7.0020.0002] # CARIAN LETTER O -102AC ; [.43D8.0020.0002] # CARIAN LETTER D2 -102AD ; [.43D9.0020.0002] # CARIAN LETTER T -102AE ; [.43DA.0020.0002] # CARIAN LETTER SH -102AF ; [.43DB.0020.0002] # CARIAN LETTER SH2 -102B0 ; [.43DC.0020.0002] # CARIAN LETTER S -102B1 ; [.43DD.0020.0002] # CARIAN LETTER C-18 -102B2 ; [.43DE.0020.0002] # CARIAN LETTER U -102B3 ; [.43DF.0020.0002] # CARIAN LETTER NN -102B4 ; [.43E0.0020.0002] # CARIAN LETTER X -102B5 ; [.43E1.0020.0002] # CARIAN LETTER N -102B6 ; [.43E2.0020.0002] # CARIAN LETTER TT2 -102B7 ; [.43E3.0020.0002] # CARIAN LETTER P -102B8 ; [.43E4.0020.0002] # CARIAN LETTER SS -102B9 ; [.43E5.0020.0002] # CARIAN LETTER I -102BA ; [.43E6.0020.0002] # CARIAN LETTER E -102BB ; [.43E7.0020.0002] # CARIAN LETTER UUUU -102BC ; [.43E8.0020.0002] # CARIAN LETTER K -102BD ; [.43E9.0020.0002] # CARIAN LETTER K2 -102BE ; [.43EA.0020.0002] # CARIAN LETTER ND -102BF ; [.43EB.0020.0002] # CARIAN LETTER UU -102C0 ; [.43EC.0020.0002] # CARIAN LETTER G -102C1 ; [.43ED.0020.0002] # CARIAN LETTER G2 -102C2 ; [.43EE.0020.0002] # CARIAN LETTER ST -102C3 ; [.43EF.0020.0002] # CARIAN LETTER ST2 -102C4 ; [.43F0.0020.0002] # CARIAN LETTER NG -102C5 ; [.43F1.0020.0002] # CARIAN LETTER II -102C6 ; [.43F2.0020.0002] # CARIAN LETTER C-39 -102C7 ; [.43F3.0020.0002] # CARIAN LETTER TT -102C8 ; [.43F4.0020.0002] # CARIAN LETTER UUU2 -102C9 ; [.43F5.0020.0002] # CARIAN LETTER RR -102CA ; [.43F6.0020.0002] # CARIAN LETTER MB -102CB ; [.43F7.0020.0002] # CARIAN LETTER MB2 -102CC ; [.43F8.0020.0002] # CARIAN LETTER MB3 -102CD ; [.43F9.0020.0002] # CARIAN LETTER MB4 -102CE ; [.43FA.0020.0002] # CARIAN LETTER LD2 -102CF ; [.43FB.0020.0002] # CARIAN LETTER E2 -102D0 ; [.43FC.0020.0002] # CARIAN LETTER UUU3 -10920 ; [.43FD.0020.0002] # LYDIAN LETTER A -10921 ; [.43FE.0020.0002] # LYDIAN LETTER B -10922 ; [.43FF.0020.0002] # LYDIAN LETTER G -10923 ; [.4400.0020.0002] # LYDIAN LETTER D -10924 ; [.4401.0020.0002] # LYDIAN LETTER E -10925 ; [.4402.0020.0002] # LYDIAN LETTER V -10926 ; [.4403.0020.0002] # LYDIAN LETTER I -10927 ; [.4404.0020.0002] # LYDIAN LETTER Y -10928 ; [.4405.0020.0002] # LYDIAN LETTER K -10929 ; [.4406.0020.0002] # LYDIAN LETTER L -1092A ; [.4407.0020.0002] # LYDIAN LETTER M -1092B ; [.4408.0020.0002] # LYDIAN LETTER N -1092C ; [.4409.0020.0002] # LYDIAN LETTER O -1092D ; [.440A.0020.0002] # LYDIAN LETTER R -1092E ; [.440B.0020.0002] # LYDIAN LETTER SS -1092F ; [.440C.0020.0002] # LYDIAN LETTER T -10930 ; [.440D.0020.0002] # LYDIAN LETTER U -10931 ; [.440E.0020.0002] # LYDIAN LETTER F -10932 ; [.440F.0020.0002] # LYDIAN LETTER Q -10933 ; [.4410.0020.0002] # LYDIAN LETTER S -10934 ; [.4411.0020.0002] # LYDIAN LETTER TT -10935 ; [.4412.0020.0002] # LYDIAN LETTER AN -10936 ; [.4413.0020.0002] # LYDIAN LETTER EN -10937 ; [.4414.0020.0002] # LYDIAN LETTER LY -10938 ; [.4415.0020.0002] # LYDIAN LETTER NN -10939 ; [.4416.0020.0002] # LYDIAN LETTER C -10300 ; [.4417.0020.0002] # OLD ITALIC LETTER A -10301 ; [.4418.0020.0002] # OLD ITALIC LETTER BE -10302 ; [.4419.0020.0002] # OLD ITALIC LETTER KE -10303 ; [.441A.0020.0002] # OLD ITALIC LETTER DE -10304 ; [.441B.0020.0002] # OLD ITALIC LETTER E -10305 ; [.441C.0020.0002] # OLD ITALIC LETTER VE -10306 ; [.441D.0020.0002] # OLD ITALIC LETTER ZE -10307 ; [.441E.0020.0002] # OLD ITALIC LETTER HE -10308 ; [.441F.0020.0002] # OLD ITALIC LETTER THE -10309 ; [.4420.0020.0002] # OLD ITALIC LETTER I -1030A ; [.4421.0020.0002] # OLD ITALIC LETTER KA -1030B ; [.4422.0020.0002] # OLD ITALIC LETTER EL -1030C ; [.4423.0020.0002] # OLD ITALIC LETTER EM -1030D ; [.4424.0020.0002] # OLD ITALIC LETTER EN -1030E ; [.4425.0020.0002] # OLD ITALIC LETTER ESH -1031F ; [.4426.0020.0002] # OLD ITALIC LETTER ESS -1030F ; [.4427.0020.0002] # OLD ITALIC LETTER O -10310 ; [.4428.0020.0002] # OLD ITALIC LETTER PE -10311 ; [.4429.0020.0002] # OLD ITALIC LETTER SHE -10312 ; [.442A.0020.0002] # OLD ITALIC LETTER KU -10313 ; [.442B.0020.0002] # OLD ITALIC LETTER ER -10314 ; [.442C.0020.0002] # OLD ITALIC LETTER ES -10315 ; [.442D.0020.0002] # OLD ITALIC LETTER TE -10316 ; [.442E.0020.0002] # OLD ITALIC LETTER U -10317 ; [.442F.0020.0002] # OLD ITALIC LETTER EKS -10318 ; [.4430.0020.0002] # OLD ITALIC LETTER PHE -10319 ; [.4431.0020.0002] # OLD ITALIC LETTER KHE -1031A ; [.4432.0020.0002] # OLD ITALIC LETTER EF -1031B ; [.4433.0020.0002] # OLD ITALIC LETTER ERS -1031C ; [.4434.0020.0002] # OLD ITALIC LETTER CHE -1031D ; [.4435.0020.0002] # OLD ITALIC LETTER II -1031E ; [.4436.0020.0002] # OLD ITALIC LETTER UU -10330 ; [.4437.0020.0002] # GOTHIC LETTER AHSA -10331 ; [.4438.0020.0002] # GOTHIC LETTER BAIRKAN -10332 ; [.4439.0020.0002] # GOTHIC LETTER GIBA -10333 ; [.443A.0020.0002] # GOTHIC LETTER DAGS -10334 ; [.443B.0020.0002] # GOTHIC LETTER AIHVUS -10335 ; [.443C.0020.0002] # GOTHIC LETTER QAIRTHRA -10336 ; [.443D.0020.0002] # GOTHIC LETTER IUJA -10337 ; [.443E.0020.0002] # GOTHIC LETTER HAGL -10338 ; [.443F.0020.0002] # GOTHIC LETTER THIUTH -10339 ; [.4440.0020.0002] # GOTHIC LETTER EIS -1033A ; [.4441.0020.0002] # GOTHIC LETTER KUSMA -1033B ; [.4442.0020.0002] # GOTHIC LETTER LAGUS -1033C ; [.4443.0020.0002] # GOTHIC LETTER MANNA -1033D ; [.4444.0020.0002] # GOTHIC LETTER NAUTHS -1033E ; [.4445.0020.0002] # GOTHIC LETTER JER -1033F ; [.4446.0020.0002] # GOTHIC LETTER URUS -10340 ; [.4447.0020.0002] # GOTHIC LETTER PAIRTHRA -10341 ; [.4448.0020.0002] # GOTHIC LETTER NINETY -10342 ; [.4449.0020.0002] # GOTHIC LETTER RAIDA -10343 ; [.444A.0020.0002] # GOTHIC LETTER SAUIL -10344 ; [.444B.0020.0002] # GOTHIC LETTER TEIWS -10345 ; [.444C.0020.0002] # GOTHIC LETTER WINJA -10346 ; [.444D.0020.0002] # GOTHIC LETTER FAIHU -10347 ; [.444E.0020.0002] # GOTHIC LETTER IGGWS -10348 ; [.444F.0020.0002] # GOTHIC LETTER HWAIR -10349 ; [.4450.0020.0002] # GOTHIC LETTER OTHAL -1034A ; [.4451.0020.0002] # GOTHIC LETTER NINE HUNDRED -10428 ; [.4452.0020.0002] # DESERET SMALL LETTER LONG I -10400 ; [.4452.0020.0008] # DESERET CAPITAL LETTER LONG I -10429 ; [.4453.0020.0002] # DESERET SMALL LETTER LONG E -10401 ; [.4453.0020.0008] # DESERET CAPITAL LETTER LONG E -1042A ; [.4454.0020.0002] # DESERET SMALL LETTER LONG A -10402 ; [.4454.0020.0008] # DESERET CAPITAL LETTER LONG A -1042B ; [.4455.0020.0002] # DESERET SMALL LETTER LONG AH -10403 ; [.4455.0020.0008] # DESERET CAPITAL LETTER LONG AH -1042C ; [.4456.0020.0002] # DESERET SMALL LETTER LONG O -10404 ; [.4456.0020.0008] # DESERET CAPITAL LETTER LONG O -1042D ; [.4457.0020.0002] # DESERET SMALL LETTER LONG OO -10405 ; [.4457.0020.0008] # DESERET CAPITAL LETTER LONG OO -1042E ; [.4458.0020.0002] # DESERET SMALL LETTER SHORT I -10406 ; [.4458.0020.0008] # DESERET CAPITAL LETTER SHORT I -1042F ; [.4459.0020.0002] # DESERET SMALL LETTER SHORT E -10407 ; [.4459.0020.0008] # DESERET CAPITAL LETTER SHORT E -10430 ; [.445A.0020.0002] # DESERET SMALL LETTER SHORT A -10408 ; [.445A.0020.0008] # DESERET CAPITAL LETTER SHORT A -10431 ; [.445B.0020.0002] # DESERET SMALL LETTER SHORT AH -10409 ; [.445B.0020.0008] # DESERET CAPITAL LETTER SHORT AH -10432 ; [.445C.0020.0002] # DESERET SMALL LETTER SHORT O -1040A ; [.445C.0020.0008] # DESERET CAPITAL LETTER SHORT O -10433 ; [.445D.0020.0002] # DESERET SMALL LETTER SHORT OO -1040B ; [.445D.0020.0008] # DESERET CAPITAL LETTER SHORT OO -10434 ; [.445E.0020.0002] # DESERET SMALL LETTER AY -1040C ; [.445E.0020.0008] # DESERET CAPITAL LETTER AY -10435 ; [.445F.0020.0002] # DESERET SMALL LETTER OW -1040D ; [.445F.0020.0008] # DESERET CAPITAL LETTER OW -10436 ; [.4460.0020.0002] # DESERET SMALL LETTER WU -1040E ; [.4460.0020.0008] # DESERET CAPITAL LETTER WU -10437 ; [.4461.0020.0002] # DESERET SMALL LETTER YEE -1040F ; [.4461.0020.0008] # DESERET CAPITAL LETTER YEE -10438 ; [.4462.0020.0002] # DESERET SMALL LETTER H -10410 ; [.4462.0020.0008] # DESERET CAPITAL LETTER H -10439 ; [.4463.0020.0002] # DESERET SMALL LETTER PEE -10411 ; [.4463.0020.0008] # DESERET CAPITAL LETTER PEE -1043A ; [.4464.0020.0002] # DESERET SMALL LETTER BEE -10412 ; [.4464.0020.0008] # DESERET CAPITAL LETTER BEE -1043B ; [.4465.0020.0002] # DESERET SMALL LETTER TEE -10413 ; [.4465.0020.0008] # DESERET CAPITAL LETTER TEE -1043C ; [.4466.0020.0002] # DESERET SMALL LETTER DEE -10414 ; [.4466.0020.0008] # DESERET CAPITAL LETTER DEE -1043D ; [.4467.0020.0002] # DESERET SMALL LETTER CHEE -10415 ; [.4467.0020.0008] # DESERET CAPITAL LETTER CHEE -1043E ; [.4468.0020.0002] # DESERET SMALL LETTER JEE -10416 ; [.4468.0020.0008] # DESERET CAPITAL LETTER JEE -1043F ; [.4469.0020.0002] # DESERET SMALL LETTER KAY -10417 ; [.4469.0020.0008] # DESERET CAPITAL LETTER KAY -10440 ; [.446A.0020.0002] # DESERET SMALL LETTER GAY -10418 ; [.446A.0020.0008] # DESERET CAPITAL LETTER GAY -10441 ; [.446B.0020.0002] # DESERET SMALL LETTER EF -10419 ; [.446B.0020.0008] # DESERET CAPITAL LETTER EF -10442 ; [.446C.0020.0002] # DESERET SMALL LETTER VEE -1041A ; [.446C.0020.0008] # DESERET CAPITAL LETTER VEE -10443 ; [.446D.0020.0002] # DESERET SMALL LETTER ETH -1041B ; [.446D.0020.0008] # DESERET CAPITAL LETTER ETH -10444 ; [.446E.0020.0002] # DESERET SMALL LETTER THEE -1041C ; [.446E.0020.0008] # DESERET CAPITAL LETTER THEE -10445 ; [.446F.0020.0002] # DESERET SMALL LETTER ES -1041D ; [.446F.0020.0008] # DESERET CAPITAL LETTER ES -10446 ; [.4470.0020.0002] # DESERET SMALL LETTER ZEE -1041E ; [.4470.0020.0008] # DESERET CAPITAL LETTER ZEE -10447 ; [.4471.0020.0002] # DESERET SMALL LETTER ESH -1041F ; [.4471.0020.0008] # DESERET CAPITAL LETTER ESH -10448 ; [.4472.0020.0002] # DESERET SMALL LETTER ZHEE -10420 ; [.4472.0020.0008] # DESERET CAPITAL LETTER ZHEE -10449 ; [.4473.0020.0002] # DESERET SMALL LETTER ER -10421 ; [.4473.0020.0008] # DESERET CAPITAL LETTER ER -1044A ; [.4474.0020.0002] # DESERET SMALL LETTER EL -10422 ; [.4474.0020.0008] # DESERET CAPITAL LETTER EL -1044B ; [.4475.0020.0002] # DESERET SMALL LETTER EM -10423 ; [.4475.0020.0008] # DESERET CAPITAL LETTER EM -1044C ; [.4476.0020.0002] # DESERET SMALL LETTER EN -10424 ; [.4476.0020.0008] # DESERET CAPITAL LETTER EN -1044D ; [.4477.0020.0002] # DESERET SMALL LETTER ENG -10425 ; [.4477.0020.0008] # DESERET CAPITAL LETTER ENG -1044E ; [.4478.0020.0002] # DESERET SMALL LETTER OI -10426 ; [.4478.0020.0008] # DESERET CAPITAL LETTER OI -1044F ; [.4479.0020.0002] # DESERET SMALL LETTER EW -10427 ; [.4479.0020.0008] # DESERET CAPITAL LETTER EW -10450 ; [.447A.0020.0002] # SHAVIAN LETTER PEEP -10451 ; [.447B.0020.0002] # SHAVIAN LETTER TOT -10452 ; [.447C.0020.0002] # SHAVIAN LETTER KICK -10453 ; [.447D.0020.0002] # SHAVIAN LETTER FEE -10454 ; [.447E.0020.0002] # SHAVIAN LETTER THIGH -10455 ; [.447F.0020.0002] # SHAVIAN LETTER SO -10456 ; [.4480.0020.0002] # SHAVIAN LETTER SURE -10457 ; [.4481.0020.0002] # SHAVIAN LETTER CHURCH -10458 ; [.4482.0020.0002] # SHAVIAN LETTER YEA -10459 ; [.4483.0020.0002] # SHAVIAN LETTER HUNG -1045A ; [.4484.0020.0002] # SHAVIAN LETTER BIB -1045B ; [.4485.0020.0002] # SHAVIAN LETTER DEAD -1045C ; [.4486.0020.0002] # SHAVIAN LETTER GAG -1045D ; [.4487.0020.0002] # SHAVIAN LETTER VOW -1045E ; [.4488.0020.0002] # SHAVIAN LETTER THEY -1045F ; [.4489.0020.0002] # SHAVIAN LETTER ZOO -10460 ; [.448A.0020.0002] # SHAVIAN LETTER MEASURE -10461 ; [.448B.0020.0002] # SHAVIAN LETTER JUDGE -10462 ; [.448C.0020.0002] # SHAVIAN LETTER WOE -10463 ; [.448D.0020.0002] # SHAVIAN LETTER HA-HA -10464 ; [.448E.0020.0002] # SHAVIAN LETTER LOLL -10465 ; [.448F.0020.0002] # SHAVIAN LETTER MIME -10466 ; [.4490.0020.0002] # SHAVIAN LETTER IF -10467 ; [.4491.0020.0002] # SHAVIAN LETTER EGG -10468 ; [.4492.0020.0002] # SHAVIAN LETTER ASH -10469 ; [.4493.0020.0002] # SHAVIAN LETTER ADO -1046A ; [.4494.0020.0002] # SHAVIAN LETTER ON -1046B ; [.4495.0020.0002] # SHAVIAN LETTER WOOL -1046C ; [.4496.0020.0002] # SHAVIAN LETTER OUT -1046D ; [.4497.0020.0002] # SHAVIAN LETTER AH -1046E ; [.4498.0020.0002] # SHAVIAN LETTER ROAR -1046F ; [.4499.0020.0002] # SHAVIAN LETTER NUN -10470 ; [.449A.0020.0002] # SHAVIAN LETTER EAT -10471 ; [.449B.0020.0002] # SHAVIAN LETTER AGE -10472 ; [.449C.0020.0002] # SHAVIAN LETTER ICE -10473 ; [.449D.0020.0002] # SHAVIAN LETTER UP -10474 ; [.449E.0020.0002] # SHAVIAN LETTER OAK -10475 ; [.449F.0020.0002] # SHAVIAN LETTER OOZE -10476 ; [.44A0.0020.0002] # SHAVIAN LETTER OIL -10477 ; [.44A1.0020.0002] # SHAVIAN LETTER AWE -10478 ; [.44A2.0020.0002] # SHAVIAN LETTER ARE -10479 ; [.44A3.0020.0002] # SHAVIAN LETTER OR -1047A ; [.44A4.0020.0002] # SHAVIAN LETTER AIR -1047B ; [.44A5.0020.0002] # SHAVIAN LETTER ERR -1047C ; [.44A6.0020.0002] # SHAVIAN LETTER ARRAY -1047D ; [.44A7.0020.0002] # SHAVIAN LETTER EAR -1047E ; [.44A8.0020.0002] # SHAVIAN LETTER IAN -1047F ; [.44A9.0020.0002] # SHAVIAN LETTER YEW -1BC00 ; [.44AA.0020.0002] # DUPLOYAN LETTER H -1BC01 ; [.44AB.0020.0002] # DUPLOYAN LETTER X -1BC02 ; [.44AC.0020.0002] # DUPLOYAN LETTER P -1BC03 ; [.44AD.0020.0002] # DUPLOYAN LETTER T -1BC04 ; [.44AE.0020.0002] # DUPLOYAN LETTER F -1BC05 ; [.44AF.0020.0002] # DUPLOYAN LETTER K -1BC06 ; [.44B0.0020.0002] # DUPLOYAN LETTER L -1BC07 ; [.44B1.0020.0002] # DUPLOYAN LETTER B -1BC08 ; [.44B2.0020.0002] # DUPLOYAN LETTER D -1BC09 ; [.44B3.0020.0002] # DUPLOYAN LETTER V -1BC0A ; [.44B4.0020.0002] # DUPLOYAN LETTER G -1BC0B ; [.44B5.0020.0002] # DUPLOYAN LETTER R -1BC0C ; [.44B6.0020.0002] # DUPLOYAN LETTER P N -1BC0D ; [.44B7.0020.0002] # DUPLOYAN LETTER D S -1BC0E ; [.44B8.0020.0002] # DUPLOYAN LETTER F N -1BC0F ; [.44B9.0020.0002] # DUPLOYAN LETTER K M -1BC10 ; [.44BA.0020.0002] # DUPLOYAN LETTER R S -1BC11 ; [.44BB.0020.0002] # DUPLOYAN LETTER TH -1BC12 ; [.44BC.0020.0002] # DUPLOYAN LETTER SLOAN DH -1BC13 ; [.44BD.0020.0002] # DUPLOYAN LETTER DH -1BC14 ; [.44BE.0020.0002] # DUPLOYAN LETTER KK -1BC15 ; [.44BF.0020.0002] # DUPLOYAN LETTER SLOAN J -1BC16 ; [.44C0.0020.0002] # DUPLOYAN LETTER HL -1BC17 ; [.44C1.0020.0002] # DUPLOYAN LETTER LH -1BC18 ; [.44C2.0020.0002] # DUPLOYAN LETTER RH -1BC19 ; [.44C3.0020.0002] # DUPLOYAN LETTER M -1BC1A ; [.44C4.0020.0002] # DUPLOYAN LETTER N -1BC1B ; [.44C5.0020.0002] # DUPLOYAN LETTER J -1BC1C ; [.44C6.0020.0002] # DUPLOYAN LETTER S -1BC1D ; [.44C7.0020.0002] # DUPLOYAN LETTER M N -1BC1E ; [.44C8.0020.0002] # DUPLOYAN LETTER N M -1BC1F ; [.44C9.0020.0002] # DUPLOYAN LETTER J M -1BC20 ; [.44CA.0020.0002] # DUPLOYAN LETTER S J -1BC21 ; [.44CB.0020.0002] # DUPLOYAN LETTER M WITH DOT -1BC22 ; [.44CC.0020.0002] # DUPLOYAN LETTER N WITH DOT -1BC23 ; [.44CD.0020.0002] # DUPLOYAN LETTER J WITH DOT -1BC24 ; [.44CE.0020.0002] # DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE -1BC25 ; [.44CF.0020.0002] # DUPLOYAN LETTER S WITH DOT -1BC26 ; [.44D0.0020.0002] # DUPLOYAN LETTER S WITH DOT BELOW -1BC27 ; [.44D1.0020.0002] # DUPLOYAN LETTER M S -1BC28 ; [.44D2.0020.0002] # DUPLOYAN LETTER N S -1BC29 ; [.44D3.0020.0002] # DUPLOYAN LETTER J S -1BC2A ; [.44D4.0020.0002] # DUPLOYAN LETTER S S -1BC2B ; [.44D5.0020.0002] # DUPLOYAN LETTER M N S -1BC2C ; [.44D6.0020.0002] # DUPLOYAN LETTER N M S -1BC2D ; [.44D7.0020.0002] # DUPLOYAN LETTER J M S -1BC2E ; [.44D8.0020.0002] # DUPLOYAN LETTER S J S -1BC2F ; [.44D9.0020.0002] # DUPLOYAN LETTER J S WITH DOT -1BC30 ; [.44DA.0020.0002] # DUPLOYAN LETTER J N -1BC31 ; [.44DB.0020.0002] # DUPLOYAN LETTER J N S -1BC32 ; [.44DC.0020.0002] # DUPLOYAN LETTER S T -1BC33 ; [.44DD.0020.0002] # DUPLOYAN LETTER S T R -1BC34 ; [.44DE.0020.0002] # DUPLOYAN LETTER S P -1BC35 ; [.44DF.0020.0002] # DUPLOYAN LETTER S P R -1BC36 ; [.44E0.0020.0002] # DUPLOYAN LETTER T S -1BC37 ; [.44E1.0020.0002] # DUPLOYAN LETTER T R S -1BC38 ; [.44E2.0020.0002] # DUPLOYAN LETTER W -1BC39 ; [.44E3.0020.0002] # DUPLOYAN LETTER WH -1BC3A ; [.44E4.0020.0002] # DUPLOYAN LETTER W R -1BC3B ; [.44E5.0020.0002] # DUPLOYAN LETTER S N -1BC3C ; [.44E6.0020.0002] # DUPLOYAN LETTER S M -1BC3D ; [.44E7.0020.0002] # DUPLOYAN LETTER K R S -1BC3E ; [.44E8.0020.0002] # DUPLOYAN LETTER G R S -1BC3F ; [.44E9.0020.0002] # DUPLOYAN LETTER S K -1BC40 ; [.44EA.0020.0002] # DUPLOYAN LETTER S K R -1BC41 ; [.44EB.0020.0002] # DUPLOYAN LETTER A -1BC42 ; [.44EC.0020.0002] # DUPLOYAN LETTER SLOAN OW -1BC43 ; [.44ED.0020.0002] # DUPLOYAN LETTER OA -1BC44 ; [.44EE.0020.0002] # DUPLOYAN LETTER O -1BC45 ; [.44EF.0020.0002] # DUPLOYAN LETTER AOU -1BC46 ; [.44F0.0020.0002] # DUPLOYAN LETTER I -1BC47 ; [.44F1.0020.0002] # DUPLOYAN LETTER E -1BC48 ; [.44F2.0020.0002] # DUPLOYAN LETTER IE -1BC49 ; [.44F3.0020.0002] # DUPLOYAN LETTER SHORT I -1BC4A ; [.44F4.0020.0002] # DUPLOYAN LETTER UI -1BC4B ; [.44F5.0020.0002] # DUPLOYAN LETTER EE -1BC4C ; [.44F6.0020.0002] # DUPLOYAN LETTER SLOAN EH -1BC4D ; [.44F7.0020.0002] # DUPLOYAN LETTER ROMANIAN I -1BC4E ; [.44F8.0020.0002] # DUPLOYAN LETTER SLOAN EE -1BC4F ; [.44F9.0020.0002] # DUPLOYAN LETTER LONG I -1BC50 ; [.44FA.0020.0002] # DUPLOYAN LETTER YE -1BC51 ; [.44FB.0020.0002] # DUPLOYAN LETTER U -1BC52 ; [.44FC.0020.0002] # DUPLOYAN LETTER EU -1BC53 ; [.44FD.0020.0002] # DUPLOYAN LETTER XW -1BC54 ; [.44FE.0020.0002] # DUPLOYAN LETTER U N -1BC55 ; [.44FF.0020.0002] # DUPLOYAN LETTER LONG U -1BC56 ; [.4500.0020.0002] # DUPLOYAN LETTER ROMANIAN U -1BC57 ; [.4501.0020.0002] # DUPLOYAN LETTER UH -1BC58 ; [.4502.0020.0002] # DUPLOYAN LETTER SLOAN U -1BC59 ; [.4503.0020.0002] # DUPLOYAN LETTER OOH -1BC5A ; [.4504.0020.0002] # DUPLOYAN LETTER OW -1BC5B ; [.4505.0020.0002] # DUPLOYAN LETTER OU -1BC5C ; [.4506.0020.0002] # DUPLOYAN LETTER WA -1BC5D ; [.4507.0020.0002] # DUPLOYAN LETTER WO -1BC5E ; [.4508.0020.0002] # DUPLOYAN LETTER WI -1BC5F ; [.4509.0020.0002] # DUPLOYAN LETTER WEI -1BC60 ; [.450A.0020.0002] # DUPLOYAN LETTER WOW -1BC61 ; [.450B.0020.0002] # DUPLOYAN LETTER NASAL U -1BC62 ; [.450C.0020.0002] # DUPLOYAN LETTER NASAL O -1BC63 ; [.450D.0020.0002] # DUPLOYAN LETTER NASAL I -1BC64 ; [.450E.0020.0002] # DUPLOYAN LETTER NASAL A -1BC65 ; [.450F.0020.0002] # DUPLOYAN LETTER PERNIN AN -1BC66 ; [.4510.0020.0002] # DUPLOYAN LETTER PERNIN AM -1BC67 ; [.4511.0020.0002] # DUPLOYAN LETTER SLOAN EN -1BC68 ; [.4512.0020.0002] # DUPLOYAN LETTER SLOAN AN -1BC69 ; [.4513.0020.0002] # DUPLOYAN LETTER SLOAN ON -1BC6A ; [.4514.0020.0002] # DUPLOYAN LETTER VOCALIC M -1BC70 ; [.4515.0020.0002] # DUPLOYAN AFFIX LEFT HORIZONTAL SECANT -1BC71 ; [.4516.0020.0002] # DUPLOYAN AFFIX MID HORIZONTAL SECANT -1BC72 ; [.4517.0020.0002] # DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT -1BC73 ; [.4518.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL SECANT -1BC74 ; [.4519.0020.0002] # DUPLOYAN AFFIX MID VERTICAL SECANT -1BC75 ; [.451A.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL SECANT -1BC76 ; [.451B.0020.0002] # DUPLOYAN AFFIX ATTACHED SECANT -1BC77 ; [.451C.0020.0002] # DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT -1BC78 ; [.451D.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT -1BC79 ; [.451E.0020.0002] # DUPLOYAN AFFIX ATTACHED TAIL -1BC7A ; [.451F.0020.0002] # DUPLOYAN AFFIX ATTACHED E HOOK -1BC7B ; [.4520.0020.0002] # DUPLOYAN AFFIX ATTACHED I HOOK -1BC7C ; [.4521.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT HOOK -1BC80 ; [.4522.0020.0002] # DUPLOYAN AFFIX HIGH ACUTE -1BC81 ; [.4523.0020.0002] # DUPLOYAN AFFIX HIGH TIGHT ACUTE -1BC82 ; [.4524.0020.0002] # DUPLOYAN AFFIX HIGH GRAVE -1BC83 ; [.4525.0020.0002] # DUPLOYAN AFFIX HIGH LONG GRAVE -1BC84 ; [.4526.0020.0002] # DUPLOYAN AFFIX HIGH DOT -1BC85 ; [.4527.0020.0002] # DUPLOYAN AFFIX HIGH CIRCLE -1BC86 ; [.4528.0020.0002] # DUPLOYAN AFFIX HIGH LINE -1BC87 ; [.4529.0020.0002] # DUPLOYAN AFFIX HIGH WAVE -1BC88 ; [.452A.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL -1BC90 ; [.452B.0020.0002] # DUPLOYAN AFFIX LOW ACUTE -1BC91 ; [.452C.0020.0002] # DUPLOYAN AFFIX LOW TIGHT ACUTE -1BC92 ; [.452D.0020.0002] # DUPLOYAN AFFIX LOW GRAVE -1BC93 ; [.452E.0020.0002] # DUPLOYAN AFFIX LOW LONG GRAVE -1BC94 ; [.452F.0020.0002] # DUPLOYAN AFFIX LOW DOT -1BC95 ; [.4530.0020.0002] # DUPLOYAN AFFIX LOW CIRCLE -1BC96 ; [.4531.0020.0002] # DUPLOYAN AFFIX LOW LINE -1BC97 ; [.4532.0020.0002] # DUPLOYAN AFFIX LOW WAVE -1BC98 ; [.4533.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL -1BC99 ; [.4534.0020.0002] # DUPLOYAN AFFIX LOW ARROW -10480 ; [.4535.0020.0002] # OSMANYA LETTER ALEF -10481 ; [.4536.0020.0002] # OSMANYA LETTER BA -10482 ; [.4537.0020.0002] # OSMANYA LETTER TA -10483 ; [.4538.0020.0002] # OSMANYA LETTER JA -10484 ; [.4539.0020.0002] # OSMANYA LETTER XA -10485 ; [.453A.0020.0002] # OSMANYA LETTER KHA -10486 ; [.453B.0020.0002] # OSMANYA LETTER DEEL -10487 ; [.453C.0020.0002] # OSMANYA LETTER RA -10488 ; [.453D.0020.0002] # OSMANYA LETTER SA -10489 ; [.453E.0020.0002] # OSMANYA LETTER SHIIN -1048A ; [.453F.0020.0002] # OSMANYA LETTER DHA -1048B ; [.4540.0020.0002] # OSMANYA LETTER CAYN -1048C ; [.4541.0020.0002] # OSMANYA LETTER GA -1048D ; [.4542.0020.0002] # OSMANYA LETTER FA -1048E ; [.4543.0020.0002] # OSMANYA LETTER QAAF -1048F ; [.4544.0020.0002] # OSMANYA LETTER KAAF -10490 ; [.4545.0020.0002] # OSMANYA LETTER LAAN -10491 ; [.4546.0020.0002] # OSMANYA LETTER MIIN -10492 ; [.4547.0020.0002] # OSMANYA LETTER NUUN -10493 ; [.4548.0020.0002] # OSMANYA LETTER WAW -10494 ; [.4549.0020.0002] # OSMANYA LETTER HA -10495 ; [.454A.0020.0002] # OSMANYA LETTER YA -10496 ; [.454B.0020.0002] # OSMANYA LETTER A -10497 ; [.454C.0020.0002] # OSMANYA LETTER E -10498 ; [.454D.0020.0002] # OSMANYA LETTER I -10499 ; [.454E.0020.0002] # OSMANYA LETTER O -1049A ; [.454F.0020.0002] # OSMANYA LETTER U -1049B ; [.4550.0020.0002] # OSMANYA LETTER AA -1049C ; [.4551.0020.0002] # OSMANYA LETTER EE -1049D ; [.4552.0020.0002] # OSMANYA LETTER OO -10500 ; [.4553.0020.0002] # ELBASAN LETTER A -10501 ; [.4554.0020.0002] # ELBASAN LETTER BE -10502 ; [.4555.0020.0002] # ELBASAN LETTER CE -10503 ; [.4556.0020.0002] # ELBASAN LETTER CHE -10504 ; [.4557.0020.0002] # ELBASAN LETTER DE -10505 ; [.4558.0020.0002] # ELBASAN LETTER NDE -10506 ; [.4559.0020.0002] # ELBASAN LETTER DHE -10507 ; [.455A.0020.0002] # ELBASAN LETTER EI -10508 ; [.455B.0020.0002] # ELBASAN LETTER E -10509 ; [.455C.0020.0002] # ELBASAN LETTER FE -1050A ; [.455D.0020.0002] # ELBASAN LETTER GE -1050B ; [.455E.0020.0002] # ELBASAN LETTER GJE -1050C ; [.455F.0020.0002] # ELBASAN LETTER HE -1050D ; [.4560.0020.0002] # ELBASAN LETTER I -1050E ; [.4561.0020.0002] # ELBASAN LETTER JE -1050F ; [.4562.0020.0002] # ELBASAN LETTER KE -10510 ; [.4563.0020.0002] # ELBASAN LETTER LE -10511 ; [.4564.0020.0002] # ELBASAN LETTER LLE -10512 ; [.4565.0020.0002] # ELBASAN LETTER ME -10513 ; [.4566.0020.0002] # ELBASAN LETTER NE -10514 ; [.4567.0020.0002] # ELBASAN LETTER NA -10515 ; [.4568.0020.0002] # ELBASAN LETTER NJE -10516 ; [.4569.0020.0002] # ELBASAN LETTER O -10517 ; [.456A.0020.0002] # ELBASAN LETTER PE -10518 ; [.456B.0020.0002] # ELBASAN LETTER QE -10519 ; [.456C.0020.0002] # ELBASAN LETTER RE -1051A ; [.456D.0020.0002] # ELBASAN LETTER RRE -1051B ; [.456E.0020.0002] # ELBASAN LETTER SE -1051C ; [.456F.0020.0002] # ELBASAN LETTER SHE -1051D ; [.4570.0020.0002] # ELBASAN LETTER TE -1051E ; [.4571.0020.0002] # ELBASAN LETTER THE -1051F ; [.4572.0020.0002] # ELBASAN LETTER U -10520 ; [.4573.0020.0002] # ELBASAN LETTER VE -10521 ; [.4574.0020.0002] # ELBASAN LETTER XE -10522 ; [.4575.0020.0002] # ELBASAN LETTER Y -10523 ; [.4576.0020.0002] # ELBASAN LETTER ZE -10524 ; [.4577.0020.0002] # ELBASAN LETTER ZHE -10525 ; [.4578.0020.0002] # ELBASAN LETTER GHE -10526 ; [.4579.0020.0002] # ELBASAN LETTER GHAMMA -10527 ; [.457A.0020.0002] # ELBASAN LETTER KHE -10530 ; [.457B.0020.0002] # CAUCASIAN ALBANIAN LETTER ALT -10531 ; [.457C.0020.0002] # CAUCASIAN ALBANIAN LETTER BET -10532 ; [.457D.0020.0002] # CAUCASIAN ALBANIAN LETTER GIM -10533 ; [.457E.0020.0002] # CAUCASIAN ALBANIAN LETTER DAT -10534 ; [.457F.0020.0002] # CAUCASIAN ALBANIAN LETTER EB -10535 ; [.4580.0020.0002] # CAUCASIAN ALBANIAN LETTER ZARL -10536 ; [.4581.0020.0002] # CAUCASIAN ALBANIAN LETTER EYN -10537 ; [.4582.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHIL -10538 ; [.4583.0020.0002] # CAUCASIAN ALBANIAN LETTER TAS -10539 ; [.4584.0020.0002] # CAUCASIAN ALBANIAN LETTER CHA -1053A ; [.4585.0020.0002] # CAUCASIAN ALBANIAN LETTER YOWD -1053B ; [.4586.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHA -1053C ; [.4587.0020.0002] # CAUCASIAN ALBANIAN LETTER IRB -1053D ; [.4588.0020.0002] # CAUCASIAN ALBANIAN LETTER SHA -1053E ; [.4589.0020.0002] # CAUCASIAN ALBANIAN LETTER LAN -1053F ; [.458A.0020.0002] # CAUCASIAN ALBANIAN LETTER INYA -10540 ; [.458B.0020.0002] # CAUCASIAN ALBANIAN LETTER XEYN -10541 ; [.458C.0020.0002] # CAUCASIAN ALBANIAN LETTER DYAN -10542 ; [.458D.0020.0002] # CAUCASIAN ALBANIAN LETTER CAR -10543 ; [.458E.0020.0002] # CAUCASIAN ALBANIAN LETTER JHOX -10544 ; [.458F.0020.0002] # CAUCASIAN ALBANIAN LETTER KAR -10545 ; [.4590.0020.0002] # CAUCASIAN ALBANIAN LETTER LYIT -10546 ; [.4591.0020.0002] # CAUCASIAN ALBANIAN LETTER HEYT -10547 ; [.4592.0020.0002] # CAUCASIAN ALBANIAN LETTER QAY -10548 ; [.4593.0020.0002] # CAUCASIAN ALBANIAN LETTER AOR -10549 ; [.4594.0020.0002] # CAUCASIAN ALBANIAN LETTER CHOY -1054A ; [.4595.0020.0002] # CAUCASIAN ALBANIAN LETTER CHI -1054B ; [.4596.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAY -1054C ; [.4597.0020.0002] # CAUCASIAN ALBANIAN LETTER MAQ -1054D ; [.4598.0020.0002] # CAUCASIAN ALBANIAN LETTER QAR -1054E ; [.4599.0020.0002] # CAUCASIAN ALBANIAN LETTER NOWC -1054F ; [.459A.0020.0002] # CAUCASIAN ALBANIAN LETTER DZYAY -10550 ; [.459B.0020.0002] # CAUCASIAN ALBANIAN LETTER SHAK -10551 ; [.459C.0020.0002] # CAUCASIAN ALBANIAN LETTER JAYN -10552 ; [.459D.0020.0002] # CAUCASIAN ALBANIAN LETTER ON -10553 ; [.459E.0020.0002] # CAUCASIAN ALBANIAN LETTER TYAY -10554 ; [.459F.0020.0002] # CAUCASIAN ALBANIAN LETTER FAM -10555 ; [.45A0.0020.0002] # CAUCASIAN ALBANIAN LETTER DZAY -10556 ; [.45A1.0020.0002] # CAUCASIAN ALBANIAN LETTER CHAT -10557 ; [.45A2.0020.0002] # CAUCASIAN ALBANIAN LETTER PEN -10558 ; [.45A3.0020.0002] # CAUCASIAN ALBANIAN LETTER GHEYS -10559 ; [.45A4.0020.0002] # CAUCASIAN ALBANIAN LETTER RAT -1055A ; [.45A5.0020.0002] # CAUCASIAN ALBANIAN LETTER SEYK -1055B ; [.45A6.0020.0002] # CAUCASIAN ALBANIAN LETTER VEYZ -1055C ; [.45A7.0020.0002] # CAUCASIAN ALBANIAN LETTER TIWR -1055D ; [.45A8.0020.0002] # CAUCASIAN ALBANIAN LETTER SHOY -1055E ; [.45A9.0020.0002] # CAUCASIAN ALBANIAN LETTER IWN -1055F ; [.45AA.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAW -10560 ; [.45AB.0020.0002] # CAUCASIAN ALBANIAN LETTER CAYN -10561 ; [.45AC.0020.0002] # CAUCASIAN ALBANIAN LETTER YAYD -10562 ; [.45AD.0020.0002] # CAUCASIAN ALBANIAN LETTER PIWR -10563 ; [.45AE.0020.0002] # CAUCASIAN ALBANIAN LETTER KIW -110D0 ; [.45AF.0020.0002] # SORA SOMPENG LETTER SAH -110D1 ; [.45B0.0020.0002] # SORA SOMPENG LETTER TAH -110D2 ; [.45B1.0020.0002] # SORA SOMPENG LETTER BAH -110D3 ; [.45B2.0020.0002] # SORA SOMPENG LETTER CAH -110D4 ; [.45B3.0020.0002] # SORA SOMPENG LETTER DAH -110D5 ; [.45B4.0020.0002] # SORA SOMPENG LETTER GAH -110D6 ; [.45B5.0020.0002] # SORA SOMPENG LETTER MAH -110D7 ; [.45B6.0020.0002] # SORA SOMPENG LETTER NGAH -110D8 ; [.45B7.0020.0002] # SORA SOMPENG LETTER LAH -110D9 ; [.45B8.0020.0002] # SORA SOMPENG LETTER NAH -110DA ; [.45B9.0020.0002] # SORA SOMPENG LETTER VAH -110DB ; [.45BA.0020.0002] # SORA SOMPENG LETTER PAH -110DC ; [.45BB.0020.0002] # SORA SOMPENG LETTER YAH -110DD ; [.45BC.0020.0002] # SORA SOMPENG LETTER RAH -110DE ; [.45BD.0020.0002] # SORA SOMPENG LETTER HAH -110DF ; [.45BE.0020.0002] # SORA SOMPENG LETTER KAH -110E0 ; [.45BF.0020.0002] # SORA SOMPENG LETTER JAH -110E1 ; [.45C0.0020.0002] # SORA SOMPENG LETTER NYAH -110E2 ; [.45C1.0020.0002] # SORA SOMPENG LETTER AH -110E3 ; [.45C2.0020.0002] # SORA SOMPENG LETTER EEH -110E4 ; [.45C3.0020.0002] # SORA SOMPENG LETTER IH -110E5 ; [.45C4.0020.0002] # SORA SOMPENG LETTER UH -110E6 ; [.45C5.0020.0002] # SORA SOMPENG LETTER OH -110E7 ; [.45C6.0020.0002] # SORA SOMPENG LETTER EH -110E8 ; [.45C7.0020.0002] # SORA SOMPENG LETTER MAE -16A40 ; [.45C8.0020.0002] # MRO LETTER TA -16A41 ; [.45C9.0020.0002] # MRO LETTER NGI -16A42 ; [.45CA.0020.0002] # MRO LETTER YO -16A43 ; [.45CB.0020.0002] # MRO LETTER MIM -16A44 ; [.45CC.0020.0002] # MRO LETTER BA -16A45 ; [.45CD.0020.0002] # MRO LETTER DA -16A46 ; [.45CE.0020.0002] # MRO LETTER A -16A47 ; [.45CF.0020.0002] # MRO LETTER PHI -16A48 ; [.45D0.0020.0002] # MRO LETTER KHAI -16A49 ; [.45D1.0020.0002] # MRO LETTER HAO -16A4A ; [.45D2.0020.0002] # MRO LETTER DAI -16A4B ; [.45D3.0020.0002] # MRO LETTER CHU -16A4C ; [.45D4.0020.0002] # MRO LETTER KEAAE -16A4D ; [.45D5.0020.0002] # MRO LETTER OL -16A4E ; [.45D6.0020.0002] # MRO LETTER MAEM -16A4F ; [.45D7.0020.0002] # MRO LETTER NIN -16A50 ; [.45D8.0020.0002] # MRO LETTER PA -16A51 ; [.45D9.0020.0002] # MRO LETTER OO -16A52 ; [.45DA.0020.0002] # MRO LETTER O -16A53 ; [.45DB.0020.0002] # MRO LETTER RO -16A54 ; [.45DC.0020.0002] # MRO LETTER SHI -16A55 ; [.45DD.0020.0002] # MRO LETTER THEA -16A56 ; [.45DE.0020.0002] # MRO LETTER EA -16A57 ; [.45DF.0020.0002] # MRO LETTER WA -16A58 ; [.45E0.0020.0002] # MRO LETTER E -16A59 ; [.45E1.0020.0002] # MRO LETTER KO -16A5A ; [.45E2.0020.0002] # MRO LETTER LAN -16A5B ; [.45E3.0020.0002] # MRO LETTER LA -16A5C ; [.45E4.0020.0002] # MRO LETTER HAI -16A5D ; [.45E5.0020.0002] # MRO LETTER RI -16A5E ; [.45E6.0020.0002] # MRO LETTER TEK -10000 ; [.45E7.0020.0002] # LINEAR B SYLLABLE B008 A -10001 ; [.45E8.0020.0002] # LINEAR B SYLLABLE B038 E -10002 ; [.45E9.0020.0002] # LINEAR B SYLLABLE B028 I -10003 ; [.45EA.0020.0002] # LINEAR B SYLLABLE B061 O -10004 ; [.45EB.0020.0002] # LINEAR B SYLLABLE B010 U -10005 ; [.45EC.0020.0002] # LINEAR B SYLLABLE B001 DA -10006 ; [.45ED.0020.0002] # LINEAR B SYLLABLE B045 DE -10007 ; [.45EE.0020.0002] # LINEAR B SYLLABLE B007 DI -10008 ; [.45EF.0020.0002] # LINEAR B SYLLABLE B014 DO -10009 ; [.45F0.0020.0002] # LINEAR B SYLLABLE B051 DU -1000A ; [.45F1.0020.0002] # LINEAR B SYLLABLE B057 JA -1000B ; [.45F2.0020.0002] # LINEAR B SYLLABLE B046 JE -1000D ; [.45F3.0020.0002] # LINEAR B SYLLABLE B036 JO -1000E ; [.45F4.0020.0002] # LINEAR B SYLLABLE B065 JU -1000F ; [.45F5.0020.0002] # LINEAR B SYLLABLE B077 KA -10010 ; [.45F6.0020.0002] # LINEAR B SYLLABLE B044 KE -10011 ; [.45F7.0020.0002] # LINEAR B SYLLABLE B067 KI -10012 ; [.45F8.0020.0002] # LINEAR B SYLLABLE B070 KO -10013 ; [.45F9.0020.0002] # LINEAR B SYLLABLE B081 KU -10014 ; [.45FA.0020.0002] # LINEAR B SYLLABLE B080 MA -10015 ; [.45FB.0020.0002] # LINEAR B SYLLABLE B013 ME -10016 ; [.45FC.0020.0002] # LINEAR B SYLLABLE B073 MI -10017 ; [.45FD.0020.0002] # LINEAR B SYLLABLE B015 MO -10018 ; [.45FE.0020.0002] # LINEAR B SYLLABLE B023 MU -10019 ; [.45FF.0020.0002] # LINEAR B SYLLABLE B006 NA -1001A ; [.4600.0020.0002] # LINEAR B SYLLABLE B024 NE -1001B ; [.4601.0020.0002] # LINEAR B SYLLABLE B030 NI -1001C ; [.4602.0020.0002] # LINEAR B SYLLABLE B052 NO -1001D ; [.4603.0020.0002] # LINEAR B SYLLABLE B055 NU -1001E ; [.4604.0020.0002] # LINEAR B SYLLABLE B003 PA -1001F ; [.4605.0020.0002] # LINEAR B SYLLABLE B072 PE -10020 ; [.4606.0020.0002] # LINEAR B SYLLABLE B039 PI -10021 ; [.4607.0020.0002] # LINEAR B SYLLABLE B011 PO -10022 ; [.4608.0020.0002] # LINEAR B SYLLABLE B050 PU -10023 ; [.4609.0020.0002] # LINEAR B SYLLABLE B016 QA -10024 ; [.460A.0020.0002] # LINEAR B SYLLABLE B078 QE -10025 ; [.460B.0020.0002] # LINEAR B SYLLABLE B021 QI -10026 ; [.460C.0020.0002] # LINEAR B SYLLABLE B032 QO -10028 ; [.460D.0020.0002] # LINEAR B SYLLABLE B060 RA -10029 ; [.460E.0020.0002] # LINEAR B SYLLABLE B027 RE -1002A ; [.460F.0020.0002] # LINEAR B SYLLABLE B053 RI -1002B ; [.4610.0020.0002] # LINEAR B SYLLABLE B002 RO -1002C ; [.4611.0020.0002] # LINEAR B SYLLABLE B026 RU -1002D ; [.4612.0020.0002] # LINEAR B SYLLABLE B031 SA -1002E ; [.4613.0020.0002] # LINEAR B SYLLABLE B009 SE -1002F ; [.4614.0020.0002] # LINEAR B SYLLABLE B041 SI -10030 ; [.4615.0020.0002] # LINEAR B SYLLABLE B012 SO -10031 ; [.4616.0020.0002] # LINEAR B SYLLABLE B058 SU -10032 ; [.4617.0020.0002] # LINEAR B SYLLABLE B059 TA -10033 ; [.4618.0020.0002] # LINEAR B SYLLABLE B004 TE -10034 ; [.4619.0020.0002] # LINEAR B SYLLABLE B037 TI -10035 ; [.461A.0020.0002] # LINEAR B SYLLABLE B005 TO -10036 ; [.461B.0020.0002] # LINEAR B SYLLABLE B069 TU -10037 ; [.461C.0020.0002] # LINEAR B SYLLABLE B054 WA -10038 ; [.461D.0020.0002] # LINEAR B SYLLABLE B075 WE -10039 ; [.461E.0020.0002] # LINEAR B SYLLABLE B040 WI -1003A ; [.461F.0020.0002] # LINEAR B SYLLABLE B042 WO -1003C ; [.4620.0020.0002] # LINEAR B SYLLABLE B017 ZA -1003D ; [.4621.0020.0002] # LINEAR B SYLLABLE B074 ZE -1003F ; [.4622.0020.0002] # LINEAR B SYLLABLE B020 ZO -10040 ; [.4623.0020.0002] # LINEAR B SYLLABLE B025 A2 -10041 ; [.4624.0020.0002] # LINEAR B SYLLABLE B043 A3 -10042 ; [.4625.0020.0002] # LINEAR B SYLLABLE B085 AU -10043 ; [.4626.0020.0002] # LINEAR B SYLLABLE B071 DWE -10044 ; [.4627.0020.0002] # LINEAR B SYLLABLE B090 DWO -10045 ; [.4628.0020.0002] # LINEAR B SYLLABLE B048 NWA -10046 ; [.4629.0020.0002] # LINEAR B SYLLABLE B029 PU2 -10047 ; [.462A.0020.0002] # LINEAR B SYLLABLE B062 PTE -10048 ; [.462B.0020.0002] # LINEAR B SYLLABLE B076 RA2 -10049 ; [.462C.0020.0002] # LINEAR B SYLLABLE B033 RA3 -1004A ; [.462D.0020.0002] # LINEAR B SYLLABLE B068 RO2 -1004B ; [.462E.0020.0002] # LINEAR B SYLLABLE B066 TA2 -1004C ; [.462F.0020.0002] # LINEAR B SYLLABLE B087 TWE -1004D ; [.4630.0020.0002] # LINEAR B SYLLABLE B091 TWO -10050 ; [.4631.0020.0002] # LINEAR B SYMBOL B018 -10051 ; [.4632.0020.0002] # LINEAR B SYMBOL B019 -10052 ; [.4633.0020.0002] # LINEAR B SYMBOL B022 -10053 ; [.4634.0020.0002] # LINEAR B SYMBOL B034 -10054 ; [.4635.0020.0002] # LINEAR B SYMBOL B047 -10055 ; [.4636.0020.0002] # LINEAR B SYMBOL B049 -10056 ; [.4637.0020.0002] # LINEAR B SYMBOL B056 -10057 ; [.4638.0020.0002] # LINEAR B SYMBOL B063 -10058 ; [.4639.0020.0002] # LINEAR B SYMBOL B064 -10059 ; [.463A.0020.0002] # LINEAR B SYMBOL B079 -1005A ; [.463B.0020.0002] # LINEAR B SYMBOL B082 -1005B ; [.463C.0020.0002] # LINEAR B SYMBOL B083 -1005C ; [.463D.0020.0002] # LINEAR B SYMBOL B086 -1005D ; [.463E.0020.0002] # LINEAR B SYMBOL B089 -10080 ; [.463F.0020.0002] # LINEAR B IDEOGRAM B100 MAN -10081 ; [.4640.0020.0002] # LINEAR B IDEOGRAM B102 WOMAN -10082 ; [.4641.0020.0002] # LINEAR B IDEOGRAM B104 DEER -10083 ; [.4642.0020.0002] # LINEAR B IDEOGRAM B105 EQUID -10084 ; [.4643.0020.0002] # LINEAR B IDEOGRAM B105F MARE -10085 ; [.4644.0020.0002] # LINEAR B IDEOGRAM B105M STALLION -10086 ; [.4645.0020.0002] # LINEAR B IDEOGRAM B106F EWE -10087 ; [.4646.0020.0002] # LINEAR B IDEOGRAM B106M RAM -10088 ; [.4647.0020.0002] # LINEAR B IDEOGRAM B107F SHE-GOAT -10089 ; [.4648.0020.0002] # LINEAR B IDEOGRAM B107M HE-GOAT -1008A ; [.4649.0020.0002] # LINEAR B IDEOGRAM B108F SOW -1008B ; [.464A.0020.0002] # LINEAR B IDEOGRAM B108M BOAR -1008C ; [.464B.0020.0002] # LINEAR B IDEOGRAM B109F COW -1008D ; [.464C.0020.0002] # LINEAR B IDEOGRAM B109M BULL -1008E ; [.464D.0020.0002] # LINEAR B IDEOGRAM B120 WHEAT -1008F ; [.464E.0020.0002] # LINEAR B IDEOGRAM B121 BARLEY -10090 ; [.464F.0020.0002] # LINEAR B IDEOGRAM B122 OLIVE -10091 ; [.4650.0020.0002] # LINEAR B IDEOGRAM B123 SPICE -10092 ; [.4651.0020.0002] # LINEAR B IDEOGRAM B125 CYPERUS -10093 ; [.4652.0020.0002] # LINEAR B MONOGRAM B127 KAPO -10094 ; [.4653.0020.0002] # LINEAR B MONOGRAM B128 KANAKO -10095 ; [.4654.0020.0002] # LINEAR B IDEOGRAM B130 OIL -10096 ; [.4655.0020.0002] # LINEAR B IDEOGRAM B131 WINE -10097 ; [.4656.0020.0002] # LINEAR B IDEOGRAM B132 -10098 ; [.4657.0020.0002] # LINEAR B MONOGRAM B133 AREPA -10099 ; [.4658.0020.0002] # LINEAR B MONOGRAM B135 MERI -1009A ; [.4659.0020.0002] # LINEAR B IDEOGRAM B140 BRONZE -1009B ; [.465A.0020.0002] # LINEAR B IDEOGRAM B141 GOLD -1009C ; [.465B.0020.0002] # LINEAR B IDEOGRAM B142 -1009D ; [.465C.0020.0002] # LINEAR B IDEOGRAM B145 WOOL -1009E ; [.465D.0020.0002] # LINEAR B IDEOGRAM B146 -1009F ; [.465E.0020.0002] # LINEAR B IDEOGRAM B150 -100A0 ; [.465F.0020.0002] # LINEAR B IDEOGRAM B151 HORN -100A1 ; [.4660.0020.0002] # LINEAR B IDEOGRAM B152 -100A2 ; [.4661.0020.0002] # LINEAR B IDEOGRAM B153 -100A3 ; [.4662.0020.0002] # LINEAR B IDEOGRAM B154 -100A4 ; [.4663.0020.0002] # LINEAR B MONOGRAM B156 TURO2 -100A5 ; [.4664.0020.0002] # LINEAR B IDEOGRAM B157 -100A6 ; [.4665.0020.0002] # LINEAR B IDEOGRAM B158 -100A7 ; [.4666.0020.0002] # LINEAR B IDEOGRAM B159 CLOTH -100A8 ; [.4667.0020.0002] # LINEAR B IDEOGRAM B160 -100A9 ; [.4668.0020.0002] # LINEAR B IDEOGRAM B161 -100AA ; [.4669.0020.0002] # LINEAR B IDEOGRAM B162 GARMENT -100AB ; [.466A.0020.0002] # LINEAR B IDEOGRAM B163 ARMOUR -100AC ; [.466B.0020.0002] # LINEAR B IDEOGRAM B164 -100AD ; [.466C.0020.0002] # LINEAR B IDEOGRAM B165 -100AE ; [.466D.0020.0002] # LINEAR B IDEOGRAM B166 -100AF ; [.466E.0020.0002] # LINEAR B IDEOGRAM B167 -100B0 ; [.466F.0020.0002] # LINEAR B IDEOGRAM B168 -100B1 ; [.4670.0020.0002] # LINEAR B IDEOGRAM B169 -100B2 ; [.4671.0020.0002] # LINEAR B IDEOGRAM B170 -100B3 ; [.4672.0020.0002] # LINEAR B IDEOGRAM B171 -100B4 ; [.4673.0020.0002] # LINEAR B IDEOGRAM B172 -100B5 ; [.4674.0020.0002] # LINEAR B IDEOGRAM B173 MONTH -100B6 ; [.4675.0020.0002] # LINEAR B IDEOGRAM B174 -100B7 ; [.4676.0020.0002] # LINEAR B IDEOGRAM B176 TREE -100B8 ; [.4677.0020.0002] # LINEAR B IDEOGRAM B177 -100B9 ; [.4678.0020.0002] # LINEAR B IDEOGRAM B178 -100BA ; [.4679.0020.0002] # LINEAR B IDEOGRAM B179 -100BB ; [.467A.0020.0002] # LINEAR B IDEOGRAM B180 -100BC ; [.467B.0020.0002] # LINEAR B IDEOGRAM B181 -100BD ; [.467C.0020.0002] # LINEAR B IDEOGRAM B182 -100BE ; [.467D.0020.0002] # LINEAR B IDEOGRAM B183 -100BF ; [.467E.0020.0002] # LINEAR B IDEOGRAM B184 -100C0 ; [.467F.0020.0002] # LINEAR B IDEOGRAM B185 -100C1 ; [.4680.0020.0002] # LINEAR B IDEOGRAM B189 -100C2 ; [.4681.0020.0002] # LINEAR B IDEOGRAM B190 -100C3 ; [.4682.0020.0002] # LINEAR B IDEOGRAM B191 HELMET -100C4 ; [.4683.0020.0002] # LINEAR B IDEOGRAM B220 FOOTSTOOL -100C5 ; [.4684.0020.0002] # LINEAR B IDEOGRAM B225 BATHTUB -100C6 ; [.4685.0020.0002] # LINEAR B IDEOGRAM B230 SPEAR -100C7 ; [.4686.0020.0002] # LINEAR B IDEOGRAM B231 ARROW -100C8 ; [.4687.0020.0002] # LINEAR B IDEOGRAM B232 -100C9 ; [.4688.0020.0002] # LINEAR B IDEOGRAM B233 SWORD -100CA ; [.4689.0020.0002] # LINEAR B IDEOGRAM B234 -100CB ; [.468A.0020.0002] # LINEAR B IDEOGRAM B236 -100CC ; [.468B.0020.0002] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT -100CD ; [.468C.0020.0002] # LINEAR B IDEOGRAM B241 CHARIOT -100CE ; [.468D.0020.0002] # LINEAR B IDEOGRAM B242 CHARIOT FRAME -100CF ; [.468E.0020.0002] # LINEAR B IDEOGRAM B243 WHEEL -100D0 ; [.468F.0020.0002] # LINEAR B IDEOGRAM B245 -100D1 ; [.4690.0020.0002] # LINEAR B IDEOGRAM B246 -100D2 ; [.4691.0020.0002] # LINEAR B MONOGRAM B247 DIPTE -100D3 ; [.4692.0020.0002] # LINEAR B IDEOGRAM B248 -100D4 ; [.4693.0020.0002] # LINEAR B IDEOGRAM B249 -100D5 ; [.4694.0020.0002] # LINEAR B IDEOGRAM B251 -100D6 ; [.4695.0020.0002] # LINEAR B IDEOGRAM B252 -100D7 ; [.4696.0020.0002] # LINEAR B IDEOGRAM B253 -100D8 ; [.4697.0020.0002] # LINEAR B IDEOGRAM B254 DART -100D9 ; [.4698.0020.0002] # LINEAR B IDEOGRAM B255 -100DA ; [.4699.0020.0002] # LINEAR B IDEOGRAM B256 -100DB ; [.469A.0020.0002] # LINEAR B IDEOGRAM B257 -100DC ; [.469B.0020.0002] # LINEAR B IDEOGRAM B258 -100DD ; [.469C.0020.0002] # LINEAR B IDEOGRAM B259 -100DE ; [.469D.0020.0002] # LINEAR B IDEOGRAM VESSEL B155 -100DF ; [.469E.0020.0002] # LINEAR B IDEOGRAM VESSEL B200 -100E0 ; [.469F.0020.0002] # LINEAR B IDEOGRAM VESSEL B201 -100E1 ; [.46A0.0020.0002] # LINEAR B IDEOGRAM VESSEL B202 -100E2 ; [.46A1.0020.0002] # LINEAR B IDEOGRAM VESSEL B203 -100E3 ; [.46A2.0020.0002] # LINEAR B IDEOGRAM VESSEL B204 -100E4 ; [.46A3.0020.0002] # LINEAR B IDEOGRAM VESSEL B205 -100E5 ; [.46A4.0020.0002] # LINEAR B IDEOGRAM VESSEL B206 -100E6 ; [.46A5.0020.0002] # LINEAR B IDEOGRAM VESSEL B207 -100E7 ; [.46A6.0020.0002] # LINEAR B IDEOGRAM VESSEL B208 -100E8 ; [.46A7.0020.0002] # LINEAR B IDEOGRAM VESSEL B209 -100E9 ; [.46A8.0020.0002] # LINEAR B IDEOGRAM VESSEL B210 -100EA ; [.46A9.0020.0002] # LINEAR B IDEOGRAM VESSEL B211 -100EB ; [.46AA.0020.0002] # LINEAR B IDEOGRAM VESSEL B212 -100EC ; [.46AB.0020.0002] # LINEAR B IDEOGRAM VESSEL B213 -100ED ; [.46AC.0020.0002] # LINEAR B IDEOGRAM VESSEL B214 -100EE ; [.46AD.0020.0002] # LINEAR B IDEOGRAM VESSEL B215 -100EF ; [.46AE.0020.0002] # LINEAR B IDEOGRAM VESSEL B216 -100F0 ; [.46AF.0020.0002] # LINEAR B IDEOGRAM VESSEL B217 -100F1 ; [.46B0.0020.0002] # LINEAR B IDEOGRAM VESSEL B218 -100F2 ; [.46B1.0020.0002] # LINEAR B IDEOGRAM VESSEL B219 -100F3 ; [.46B2.0020.0002] # LINEAR B IDEOGRAM VESSEL B221 -100F4 ; [.46B3.0020.0002] # LINEAR B IDEOGRAM VESSEL B222 -100F5 ; [.46B4.0020.0002] # LINEAR B IDEOGRAM VESSEL B226 -100F6 ; [.46B5.0020.0002] # LINEAR B IDEOGRAM VESSEL B227 -100F7 ; [.46B6.0020.0002] # LINEAR B IDEOGRAM VESSEL B228 -100F8 ; [.46B7.0020.0002] # LINEAR B IDEOGRAM VESSEL B229 -100F9 ; [.46B8.0020.0002] # LINEAR B IDEOGRAM VESSEL B250 -100FA ; [.46B9.0020.0002] # LINEAR B IDEOGRAM VESSEL B305 -10600 ; [.46BA.0020.0002] # LINEAR A SIGN AB001 -10601 ; [.46BB.0020.0002] # LINEAR A SIGN AB002 -10602 ; [.46BC.0020.0002] # LINEAR A SIGN AB003 -10603 ; [.46BD.0020.0002] # LINEAR A SIGN AB004 -10604 ; [.46BE.0020.0002] # LINEAR A SIGN AB005 -10605 ; [.46BF.0020.0002] # LINEAR A SIGN AB006 -10606 ; [.46C0.0020.0002] # LINEAR A SIGN AB007 -10607 ; [.46C1.0020.0002] # LINEAR A SIGN AB008 -10608 ; [.46C2.0020.0002] # LINEAR A SIGN AB009 -10609 ; [.46C3.0020.0002] # LINEAR A SIGN AB010 -1060A ; [.46C4.0020.0002] # LINEAR A SIGN AB011 -1060B ; [.46C5.0020.0002] # LINEAR A SIGN AB013 -1060C ; [.46C6.0020.0002] # LINEAR A SIGN AB016 -1060D ; [.46C7.0020.0002] # LINEAR A SIGN AB017 -1060E ; [.46C8.0020.0002] # LINEAR A SIGN AB020 -1060F ; [.46C9.0020.0002] # LINEAR A SIGN AB021 -10610 ; [.46CA.0020.0002] # LINEAR A SIGN AB021F -10611 ; [.46CB.0020.0002] # LINEAR A SIGN AB021M -10612 ; [.46CC.0020.0002] # LINEAR A SIGN AB022 -10613 ; [.46CD.0020.0002] # LINEAR A SIGN AB022F -10614 ; [.46CE.0020.0002] # LINEAR A SIGN AB022M -10615 ; [.46CF.0020.0002] # LINEAR A SIGN AB023 -10616 ; [.46D0.0020.0002] # LINEAR A SIGN AB023M -10617 ; [.46D1.0020.0002] # LINEAR A SIGN AB024 -10618 ; [.46D2.0020.0002] # LINEAR A SIGN AB026 -10619 ; [.46D3.0020.0002] # LINEAR A SIGN AB027 -1061A ; [.46D4.0020.0002] # LINEAR A SIGN AB028 -1061B ; [.46D5.0020.0002] # LINEAR A SIGN A028B -1061C ; [.46D6.0020.0002] # LINEAR A SIGN AB029 -1061D ; [.46D7.0020.0002] # LINEAR A SIGN AB030 -1061E ; [.46D8.0020.0002] # LINEAR A SIGN AB031 -1061F ; [.46D9.0020.0002] # LINEAR A SIGN AB034 -10620 ; [.46DA.0020.0002] # LINEAR A SIGN AB037 -10621 ; [.46DB.0020.0002] # LINEAR A SIGN AB038 -10622 ; [.46DC.0020.0002] # LINEAR A SIGN AB039 -10623 ; [.46DD.0020.0002] # LINEAR A SIGN AB040 -10624 ; [.46DE.0020.0002] # LINEAR A SIGN AB041 -10625 ; [.46DF.0020.0002] # LINEAR A SIGN AB044 -10626 ; [.46E0.0020.0002] # LINEAR A SIGN AB045 -10627 ; [.46E1.0020.0002] # LINEAR A SIGN AB046 -10628 ; [.46E2.0020.0002] # LINEAR A SIGN AB047 -10629 ; [.46E3.0020.0002] # LINEAR A SIGN AB048 -1062A ; [.46E4.0020.0002] # LINEAR A SIGN AB049 -1062B ; [.46E5.0020.0002] # LINEAR A SIGN AB050 -1062C ; [.46E6.0020.0002] # LINEAR A SIGN AB051 -1062D ; [.46E7.0020.0002] # LINEAR A SIGN AB053 -1062E ; [.46E8.0020.0002] # LINEAR A SIGN AB054 -1062F ; [.46E9.0020.0002] # LINEAR A SIGN AB055 -10630 ; [.46EA.0020.0002] # LINEAR A SIGN AB056 -10631 ; [.46EB.0020.0002] # LINEAR A SIGN AB057 -10632 ; [.46EC.0020.0002] # LINEAR A SIGN AB058 -10633 ; [.46ED.0020.0002] # LINEAR A SIGN AB059 -10634 ; [.46EE.0020.0002] # LINEAR A SIGN AB060 -10635 ; [.46EF.0020.0002] # LINEAR A SIGN AB061 -10636 ; [.46F0.0020.0002] # LINEAR A SIGN AB065 -10637 ; [.46F1.0020.0002] # LINEAR A SIGN AB066 -10638 ; [.46F2.0020.0002] # LINEAR A SIGN AB067 -10639 ; [.46F3.0020.0002] # LINEAR A SIGN AB069 -1063A ; [.46F4.0020.0002] # LINEAR A SIGN AB070 -1063B ; [.46F5.0020.0002] # LINEAR A SIGN AB073 -1063C ; [.46F6.0020.0002] # LINEAR A SIGN AB074 -1063D ; [.46F7.0020.0002] # LINEAR A SIGN AB076 -1063E ; [.46F8.0020.0002] # LINEAR A SIGN AB077 -1063F ; [.46F9.0020.0002] # LINEAR A SIGN AB078 -10640 ; [.46FA.0020.0002] # LINEAR A SIGN AB079 -10641 ; [.46FB.0020.0002] # LINEAR A SIGN AB080 -10642 ; [.46FC.0020.0002] # LINEAR A SIGN AB081 -10643 ; [.46FD.0020.0002] # LINEAR A SIGN AB082 -10644 ; [.46FE.0020.0002] # LINEAR A SIGN AB085 -10645 ; [.46FF.0020.0002] # LINEAR A SIGN AB086 -10646 ; [.4700.0020.0002] # LINEAR A SIGN AB087 -10647 ; [.4701.0020.0002] # LINEAR A SIGN A100-102 -10648 ; [.4702.0020.0002] # LINEAR A SIGN AB118 -10649 ; [.4703.0020.0002] # LINEAR A SIGN AB120 -1064A ; [.4704.0020.0002] # LINEAR A SIGN A120B -1064B ; [.4705.0020.0002] # LINEAR A SIGN AB122 -1064C ; [.4706.0020.0002] # LINEAR A SIGN AB123 -1064D ; [.4707.0020.0002] # LINEAR A SIGN AB131A -1064E ; [.4708.0020.0002] # LINEAR A SIGN AB131B -1064F ; [.4709.0020.0002] # LINEAR A SIGN A131C -10650 ; [.470A.0020.0002] # LINEAR A SIGN AB164 -10651 ; [.470B.0020.0002] # LINEAR A SIGN AB171 -10652 ; [.470C.0020.0002] # LINEAR A SIGN AB180 -10653 ; [.470D.0020.0002] # LINEAR A SIGN AB188 -10654 ; [.470E.0020.0002] # LINEAR A SIGN AB191 -10655 ; [.470F.0020.0002] # LINEAR A SIGN A301 -10656 ; [.4710.0020.0002] # LINEAR A SIGN A302 -10657 ; [.4711.0020.0002] # LINEAR A SIGN A303 -10658 ; [.4712.0020.0002] # LINEAR A SIGN A304 -10659 ; [.4713.0020.0002] # LINEAR A SIGN A305 -1065A ; [.4714.0020.0002] # LINEAR A SIGN A306 -1065B ; [.4715.0020.0002] # LINEAR A SIGN A307 -1065C ; [.4716.0020.0002] # LINEAR A SIGN A308 -1065D ; [.4717.0020.0002] # LINEAR A SIGN A309A -1065E ; [.4718.0020.0002] # LINEAR A SIGN A309B -1065F ; [.4719.0020.0002] # LINEAR A SIGN A309C -10660 ; [.471A.0020.0002] # LINEAR A SIGN A310 -10661 ; [.471B.0020.0002] # LINEAR A SIGN A311 -10662 ; [.471C.0020.0002] # LINEAR A SIGN A312 -10663 ; [.471D.0020.0002] # LINEAR A SIGN A313A -10664 ; [.471E.0020.0002] # LINEAR A SIGN A313B -10665 ; [.471F.0020.0002] # LINEAR A SIGN A313C -10666 ; [.4720.0020.0002] # LINEAR A SIGN A314 -10667 ; [.4721.0020.0002] # LINEAR A SIGN A315 -10668 ; [.4722.0020.0002] # LINEAR A SIGN A316 -10669 ; [.4723.0020.0002] # LINEAR A SIGN A317 -1066A ; [.4724.0020.0002] # LINEAR A SIGN A318 -1066B ; [.4725.0020.0002] # LINEAR A SIGN A319 -1066C ; [.4726.0020.0002] # LINEAR A SIGN A320 -1066D ; [.4727.0020.0002] # LINEAR A SIGN A321 -1066E ; [.4728.0020.0002] # LINEAR A SIGN A322 -1066F ; [.4729.0020.0002] # LINEAR A SIGN A323 -10670 ; [.472A.0020.0002] # LINEAR A SIGN A324 -10671 ; [.472B.0020.0002] # LINEAR A SIGN A325 -10672 ; [.472C.0020.0002] # LINEAR A SIGN A326 -10673 ; [.472D.0020.0002] # LINEAR A SIGN A327 -10674 ; [.472E.0020.0002] # LINEAR A SIGN A328 -10675 ; [.472F.0020.0002] # LINEAR A SIGN A329 -10676 ; [.4730.0020.0002] # LINEAR A SIGN A330 -10677 ; [.4731.0020.0002] # LINEAR A SIGN A331 -10678 ; [.4732.0020.0002] # LINEAR A SIGN A332 -10679 ; [.4733.0020.0002] # LINEAR A SIGN A333 -1067A ; [.4734.0020.0002] # LINEAR A SIGN A334 -1067B ; [.4735.0020.0002] # LINEAR A SIGN A335 -1067C ; [.4736.0020.0002] # LINEAR A SIGN A336 -1067D ; [.4737.0020.0002] # LINEAR A SIGN A337 -1067E ; [.4738.0020.0002] # LINEAR A SIGN A338 -1067F ; [.4739.0020.0002] # LINEAR A SIGN A339 -10680 ; [.473A.0020.0002] # LINEAR A SIGN A340 -10681 ; [.473B.0020.0002] # LINEAR A SIGN A341 -10682 ; [.473C.0020.0002] # LINEAR A SIGN A342 -10683 ; [.473D.0020.0002] # LINEAR A SIGN A343 -10684 ; [.473E.0020.0002] # LINEAR A SIGN A344 -10685 ; [.473F.0020.0002] # LINEAR A SIGN A345 -10686 ; [.4740.0020.0002] # LINEAR A SIGN A346 -10687 ; [.4741.0020.0002] # LINEAR A SIGN A347 -10688 ; [.4742.0020.0002] # LINEAR A SIGN A348 -10689 ; [.4743.0020.0002] # LINEAR A SIGN A349 -1068A ; [.4744.0020.0002] # LINEAR A SIGN A350 -1068B ; [.4745.0020.0002] # LINEAR A SIGN A351 -1068C ; [.4746.0020.0002] # LINEAR A SIGN A352 -1068D ; [.4747.0020.0002] # LINEAR A SIGN A353 -1068E ; [.4748.0020.0002] # LINEAR A SIGN A354 -1068F ; [.4749.0020.0002] # LINEAR A SIGN A355 -10690 ; [.474A.0020.0002] # LINEAR A SIGN A356 -10691 ; [.474B.0020.0002] # LINEAR A SIGN A357 -10692 ; [.474C.0020.0002] # LINEAR A SIGN A358 -10693 ; [.474D.0020.0002] # LINEAR A SIGN A359 -10694 ; [.474E.0020.0002] # LINEAR A SIGN A360 -10695 ; [.474F.0020.0002] # LINEAR A SIGN A361 -10696 ; [.4750.0020.0002] # LINEAR A SIGN A362 -10697 ; [.4751.0020.0002] # LINEAR A SIGN A363 -10698 ; [.4752.0020.0002] # LINEAR A SIGN A364 -10699 ; [.4753.0020.0002] # LINEAR A SIGN A365 -1069A ; [.4754.0020.0002] # LINEAR A SIGN A366 -1069B ; [.4755.0020.0002] # LINEAR A SIGN A367 -1069C ; [.4756.0020.0002] # LINEAR A SIGN A368 -1069D ; [.4757.0020.0002] # LINEAR A SIGN A369 -1069E ; [.4758.0020.0002] # LINEAR A SIGN A370 -1069F ; [.4759.0020.0002] # LINEAR A SIGN A371 -106A0 ; [.475A.0020.0002] # LINEAR A SIGN A400-VAS -106A1 ; [.475B.0020.0002] # LINEAR A SIGN A401-VAS -106A2 ; [.475C.0020.0002] # LINEAR A SIGN A402-VAS -106A3 ; [.475D.0020.0002] # LINEAR A SIGN A403-VAS -106A4 ; [.475E.0020.0002] # LINEAR A SIGN A404-VAS -106A5 ; [.475F.0020.0002] # LINEAR A SIGN A405-VAS -106A6 ; [.4760.0020.0002] # LINEAR A SIGN A406-VAS -106A7 ; [.4761.0020.0002] # LINEAR A SIGN A407-VAS -106A8 ; [.4762.0020.0002] # LINEAR A SIGN A408-VAS -106A9 ; [.4763.0020.0002] # LINEAR A SIGN A409-VAS -106AA ; [.4764.0020.0002] # LINEAR A SIGN A410-VAS -106AB ; [.4765.0020.0002] # LINEAR A SIGN A411-VAS -106AC ; [.4766.0020.0002] # LINEAR A SIGN A412-VAS -106AD ; [.4767.0020.0002] # LINEAR A SIGN A413-VAS -106AE ; [.4768.0020.0002] # LINEAR A SIGN A414-VAS -106AF ; [.4769.0020.0002] # LINEAR A SIGN A415-VAS -106B0 ; [.476A.0020.0002] # LINEAR A SIGN A416-VAS -106B1 ; [.476B.0020.0002] # LINEAR A SIGN A417-VAS -106B2 ; [.476C.0020.0002] # LINEAR A SIGN A418-VAS -106B3 ; [.476D.0020.0002] # LINEAR A SIGN A501 -106B4 ; [.476E.0020.0002] # LINEAR A SIGN A502 -106B5 ; [.476F.0020.0002] # LINEAR A SIGN A503 -106B6 ; [.4770.0020.0002] # LINEAR A SIGN A504 -106B7 ; [.4771.0020.0002] # LINEAR A SIGN A505 -106B8 ; [.4772.0020.0002] # LINEAR A SIGN A506 -106B9 ; [.4773.0020.0002] # LINEAR A SIGN A508 -106BA ; [.4774.0020.0002] # LINEAR A SIGN A509 -106BB ; [.4775.0020.0002] # LINEAR A SIGN A510 -106BC ; [.4776.0020.0002] # LINEAR A SIGN A511 -106BD ; [.4777.0020.0002] # LINEAR A SIGN A512 -106BE ; [.4778.0020.0002] # LINEAR A SIGN A513 -106BF ; [.4779.0020.0002] # LINEAR A SIGN A515 -106C0 ; [.477A.0020.0002] # LINEAR A SIGN A516 -106C1 ; [.477B.0020.0002] # LINEAR A SIGN A520 -106C2 ; [.477C.0020.0002] # LINEAR A SIGN A521 -106C3 ; [.477D.0020.0002] # LINEAR A SIGN A523 -106C4 ; [.477E.0020.0002] # LINEAR A SIGN A524 -106C5 ; [.477F.0020.0002] # LINEAR A SIGN A525 -106C6 ; [.4780.0020.0002] # LINEAR A SIGN A526 -106C7 ; [.4781.0020.0002] # LINEAR A SIGN A527 -106C8 ; [.4782.0020.0002] # LINEAR A SIGN A528 -106C9 ; [.4783.0020.0002] # LINEAR A SIGN A529 -106CA ; [.4784.0020.0002] # LINEAR A SIGN A530 -106CB ; [.4785.0020.0002] # LINEAR A SIGN A531 -106CC ; [.4786.0020.0002] # LINEAR A SIGN A532 -106CD ; [.4787.0020.0002] # LINEAR A SIGN A534 -106CE ; [.4788.0020.0002] # LINEAR A SIGN A535 -106CF ; [.4789.0020.0002] # LINEAR A SIGN A536 -106D0 ; [.478A.0020.0002] # LINEAR A SIGN A537 -106D1 ; [.478B.0020.0002] # LINEAR A SIGN A538 -106D2 ; [.478C.0020.0002] # LINEAR A SIGN A539 -106D3 ; [.478D.0020.0002] # LINEAR A SIGN A540 -106D4 ; [.478E.0020.0002] # LINEAR A SIGN A541 -106D5 ; [.478F.0020.0002] # LINEAR A SIGN A542 -106D6 ; [.4790.0020.0002] # LINEAR A SIGN A545 -106D7 ; [.4791.0020.0002] # LINEAR A SIGN A547 -106D8 ; [.4792.0020.0002] # LINEAR A SIGN A548 -106D9 ; [.4793.0020.0002] # LINEAR A SIGN A549 -106DA ; [.4794.0020.0002] # LINEAR A SIGN A550 -106DB ; [.4795.0020.0002] # LINEAR A SIGN A551 -106DC ; [.4796.0020.0002] # LINEAR A SIGN A552 -106DD ; [.4797.0020.0002] # LINEAR A SIGN A553 -106DE ; [.4798.0020.0002] # LINEAR A SIGN A554 -106DF ; [.4799.0020.0002] # LINEAR A SIGN A555 -106E0 ; [.479A.0020.0002] # LINEAR A SIGN A556 -106E1 ; [.479B.0020.0002] # LINEAR A SIGN A557 -106E2 ; [.479C.0020.0002] # LINEAR A SIGN A559 -106E3 ; [.479D.0020.0002] # LINEAR A SIGN A563 -106E4 ; [.479E.0020.0002] # LINEAR A SIGN A564 -106E5 ; [.479F.0020.0002] # LINEAR A SIGN A565 -106E6 ; [.47A0.0020.0002] # LINEAR A SIGN A566 -106E7 ; [.47A1.0020.0002] # LINEAR A SIGN A568 -106E8 ; [.47A2.0020.0002] # LINEAR A SIGN A569 -106E9 ; [.47A3.0020.0002] # LINEAR A SIGN A570 -106EA ; [.47A4.0020.0002] # LINEAR A SIGN A571 -106EB ; [.47A5.0020.0002] # LINEAR A SIGN A572 -106EC ; [.47A6.0020.0002] # LINEAR A SIGN A573 -106ED ; [.47A7.0020.0002] # LINEAR A SIGN A574 -106EE ; [.47A8.0020.0002] # LINEAR A SIGN A575 -106EF ; [.47A9.0020.0002] # LINEAR A SIGN A576 -106F0 ; [.47AA.0020.0002] # LINEAR A SIGN A577 -106F1 ; [.47AB.0020.0002] # LINEAR A SIGN A578 -106F2 ; [.47AC.0020.0002] # LINEAR A SIGN A579 -106F3 ; [.47AD.0020.0002] # LINEAR A SIGN A580 -106F4 ; [.47AE.0020.0002] # LINEAR A SIGN A581 -106F5 ; [.47AF.0020.0002] # LINEAR A SIGN A582 -106F6 ; [.47B0.0020.0002] # LINEAR A SIGN A583 -106F7 ; [.47B1.0020.0002] # LINEAR A SIGN A584 -106F8 ; [.47B2.0020.0002] # LINEAR A SIGN A585 -106F9 ; [.47B3.0020.0002] # LINEAR A SIGN A586 -106FA ; [.47B4.0020.0002] # LINEAR A SIGN A587 -106FB ; [.47B5.0020.0002] # LINEAR A SIGN A588 -106FC ; [.47B6.0020.0002] # LINEAR A SIGN A589 -106FD ; [.47B7.0020.0002] # LINEAR A SIGN A591 -106FE ; [.47B8.0020.0002] # LINEAR A SIGN A592 -106FF ; [.47B9.0020.0002] # LINEAR A SIGN A594 -10700 ; [.47BA.0020.0002] # LINEAR A SIGN A595 -10701 ; [.47BB.0020.0002] # LINEAR A SIGN A596 -10702 ; [.47BC.0020.0002] # LINEAR A SIGN A598 -10703 ; [.47BD.0020.0002] # LINEAR A SIGN A600 -10704 ; [.47BE.0020.0002] # LINEAR A SIGN A601 -10705 ; [.47BF.0020.0002] # LINEAR A SIGN A602 -10706 ; [.47C0.0020.0002] # LINEAR A SIGN A603 -10707 ; [.47C1.0020.0002] # LINEAR A SIGN A604 -10708 ; [.47C2.0020.0002] # LINEAR A SIGN A606 -10709 ; [.47C3.0020.0002] # LINEAR A SIGN A608 -1070A ; [.47C4.0020.0002] # LINEAR A SIGN A609 -1070B ; [.47C5.0020.0002] # LINEAR A SIGN A610 -1070C ; [.47C6.0020.0002] # LINEAR A SIGN A611 -1070D ; [.47C7.0020.0002] # LINEAR A SIGN A612 -1070E ; [.47C8.0020.0002] # LINEAR A SIGN A613 -1070F ; [.47C9.0020.0002] # LINEAR A SIGN A614 -10710 ; [.47CA.0020.0002] # LINEAR A SIGN A615 -10711 ; [.47CB.0020.0002] # LINEAR A SIGN A616 -10712 ; [.47CC.0020.0002] # LINEAR A SIGN A617 -10713 ; [.47CD.0020.0002] # LINEAR A SIGN A618 -10714 ; [.47CE.0020.0002] # LINEAR A SIGN A619 -10715 ; [.47CF.0020.0002] # LINEAR A SIGN A620 -10716 ; [.47D0.0020.0002] # LINEAR A SIGN A621 -10717 ; [.47D1.0020.0002] # LINEAR A SIGN A622 -10718 ; [.47D2.0020.0002] # LINEAR A SIGN A623 -10719 ; [.47D3.0020.0002] # LINEAR A SIGN A624 -1071A ; [.47D4.0020.0002] # LINEAR A SIGN A626 -1071B ; [.47D5.0020.0002] # LINEAR A SIGN A627 -1071C ; [.47D6.0020.0002] # LINEAR A SIGN A628 -1071D ; [.47D7.0020.0002] # LINEAR A SIGN A629 -1071E ; [.47D8.0020.0002] # LINEAR A SIGN A634 -1071F ; [.47D9.0020.0002] # LINEAR A SIGN A637 -10720 ; [.47DA.0020.0002] # LINEAR A SIGN A638 -10721 ; [.47DB.0020.0002] # LINEAR A SIGN A640 -10722 ; [.47DC.0020.0002] # LINEAR A SIGN A642 -10723 ; [.47DD.0020.0002] # LINEAR A SIGN A643 -10724 ; [.47DE.0020.0002] # LINEAR A SIGN A644 -10725 ; [.47DF.0020.0002] # LINEAR A SIGN A645 -10726 ; [.47E0.0020.0002] # LINEAR A SIGN A646 -10727 ; [.47E1.0020.0002] # LINEAR A SIGN A648 -10728 ; [.47E2.0020.0002] # LINEAR A SIGN A649 -10729 ; [.47E3.0020.0002] # LINEAR A SIGN A651 -1072A ; [.47E4.0020.0002] # LINEAR A SIGN A652 -1072B ; [.47E5.0020.0002] # LINEAR A SIGN A653 -1072C ; [.47E6.0020.0002] # LINEAR A SIGN A654 -1072D ; [.47E7.0020.0002] # LINEAR A SIGN A655 -1072E ; [.47E8.0020.0002] # LINEAR A SIGN A656 -1072F ; [.47E9.0020.0002] # LINEAR A SIGN A657 -10730 ; [.47EA.0020.0002] # LINEAR A SIGN A658 -10731 ; [.47EB.0020.0002] # LINEAR A SIGN A659 -10732 ; [.47EC.0020.0002] # LINEAR A SIGN A660 -10733 ; [.47ED.0020.0002] # LINEAR A SIGN A661 -10734 ; [.47EE.0020.0002] # LINEAR A SIGN A662 -10735 ; [.47EF.0020.0002] # LINEAR A SIGN A663 -10736 ; [.47F0.0020.0002] # LINEAR A SIGN A664 -10740 ; [.47F1.0020.0002] # LINEAR A SIGN A701 A -10741 ; [.47F2.0020.0002] # LINEAR A SIGN A702 B -10742 ; [.47F3.0020.0002] # LINEAR A SIGN A703 D -10743 ; [.47F4.0020.0002] # LINEAR A SIGN A704 E -10744 ; [.47F5.0020.0002] # LINEAR A SIGN A705 F -10745 ; [.47F6.0020.0002] # LINEAR A SIGN A706 H -10746 ; [.47F7.0020.0002] # LINEAR A SIGN A707 J -10747 ; [.47F8.0020.0002] # LINEAR A SIGN A708 K -10748 ; [.47F9.0020.0002] # LINEAR A SIGN A709 L -10749 ; [.47FA.0020.0002] # LINEAR A SIGN A709-2 L2 -1074A ; [.47FB.0020.0002] # LINEAR A SIGN A709-3 L3 -1074B ; [.47FC.0020.0002] # LINEAR A SIGN A709-4 L4 -1074C ; [.47FD.0020.0002] # LINEAR A SIGN A709-6 L6 -1074D ; [.47FE.0020.0002] # LINEAR A SIGN A710 W -1074E ; [.47FF.0020.0002] # LINEAR A SIGN A711 X -1074F ; [.4800.0020.0002] # LINEAR A SIGN A712 Y -10750 ; [.4801.0020.0002] # LINEAR A SIGN A713 OMEGA -10751 ; [.4802.0020.0002] # LINEAR A SIGN A714 ABB -10752 ; [.4803.0020.0002] # LINEAR A SIGN A715 BB -10753 ; [.4804.0020.0002] # LINEAR A SIGN A717 DD -10754 ; [.4805.0020.0002] # LINEAR A SIGN A726 EYYY -10755 ; [.4806.0020.0002] # LINEAR A SIGN A732 JE -10760 ; [.4807.0020.0002] # LINEAR A SIGN A800 -10761 ; [.4808.0020.0002] # LINEAR A SIGN A801 -10762 ; [.4809.0020.0002] # LINEAR A SIGN A802 -10763 ; [.480A.0020.0002] # LINEAR A SIGN A803 -10764 ; [.480B.0020.0002] # LINEAR A SIGN A804 -10765 ; [.480C.0020.0002] # LINEAR A SIGN A805 -10766 ; [.480D.0020.0002] # LINEAR A SIGN A806 -10767 ; [.480E.0020.0002] # LINEAR A SIGN A807 -10800 ; [.480F.0020.0002] # CYPRIOT SYLLABLE A -10801 ; [.4810.0020.0002] # CYPRIOT SYLLABLE E -10802 ; [.4811.0020.0002] # CYPRIOT SYLLABLE I -10803 ; [.4812.0020.0002] # CYPRIOT SYLLABLE O -10804 ; [.4813.0020.0002] # CYPRIOT SYLLABLE U -10805 ; [.4814.0020.0002] # CYPRIOT SYLLABLE JA -10808 ; [.4815.0020.0002] # CYPRIOT SYLLABLE JO -1080A ; [.4816.0020.0002] # CYPRIOT SYLLABLE KA -1080B ; [.4817.0020.0002] # CYPRIOT SYLLABLE KE -1080C ; [.4818.0020.0002] # CYPRIOT SYLLABLE KI -1080D ; [.4819.0020.0002] # CYPRIOT SYLLABLE KO -1080E ; [.481A.0020.0002] # CYPRIOT SYLLABLE KU -1080F ; [.481B.0020.0002] # CYPRIOT SYLLABLE LA -10810 ; [.481C.0020.0002] # CYPRIOT SYLLABLE LE -10811 ; [.481D.0020.0002] # CYPRIOT SYLLABLE LI -10812 ; [.481E.0020.0002] # CYPRIOT SYLLABLE LO -10813 ; [.481F.0020.0002] # CYPRIOT SYLLABLE LU -10814 ; [.4820.0020.0002] # CYPRIOT SYLLABLE MA -10815 ; [.4821.0020.0002] # CYPRIOT SYLLABLE ME -10816 ; [.4822.0020.0002] # CYPRIOT SYLLABLE MI -10817 ; [.4823.0020.0002] # CYPRIOT SYLLABLE MO -10818 ; [.4824.0020.0002] # CYPRIOT SYLLABLE MU -10819 ; [.4825.0020.0002] # CYPRIOT SYLLABLE NA -1081A ; [.4826.0020.0002] # CYPRIOT SYLLABLE NE -1081B ; [.4827.0020.0002] # CYPRIOT SYLLABLE NI -1081C ; [.4828.0020.0002] # CYPRIOT SYLLABLE NO -1081D ; [.4829.0020.0002] # CYPRIOT SYLLABLE NU -1081E ; [.482A.0020.0002] # CYPRIOT SYLLABLE PA -1081F ; [.482B.0020.0002] # CYPRIOT SYLLABLE PE -10820 ; [.482C.0020.0002] # CYPRIOT SYLLABLE PI -10821 ; [.482D.0020.0002] # CYPRIOT SYLLABLE PO -10822 ; [.482E.0020.0002] # CYPRIOT SYLLABLE PU -10823 ; [.482F.0020.0002] # CYPRIOT SYLLABLE RA -10824 ; [.4830.0020.0002] # CYPRIOT SYLLABLE RE -10825 ; [.4831.0020.0002] # CYPRIOT SYLLABLE RI -10826 ; [.4832.0020.0002] # CYPRIOT SYLLABLE RO -10827 ; [.4833.0020.0002] # CYPRIOT SYLLABLE RU -10828 ; [.4834.0020.0002] # CYPRIOT SYLLABLE SA -10829 ; [.4835.0020.0002] # CYPRIOT SYLLABLE SE -1082A ; [.4836.0020.0002] # CYPRIOT SYLLABLE SI -1082B ; [.4837.0020.0002] # CYPRIOT SYLLABLE SO -1082C ; [.4838.0020.0002] # CYPRIOT SYLLABLE SU -1082D ; [.4839.0020.0002] # CYPRIOT SYLLABLE TA -1082E ; [.483A.0020.0002] # CYPRIOT SYLLABLE TE -1082F ; [.483B.0020.0002] # CYPRIOT SYLLABLE TI -10830 ; [.483C.0020.0002] # CYPRIOT SYLLABLE TO -10831 ; [.483D.0020.0002] # CYPRIOT SYLLABLE TU -10832 ; [.483E.0020.0002] # CYPRIOT SYLLABLE WA -10833 ; [.483F.0020.0002] # CYPRIOT SYLLABLE WE -10834 ; [.4840.0020.0002] # CYPRIOT SYLLABLE WI -10835 ; [.4841.0020.0002] # CYPRIOT SYLLABLE WO -10837 ; [.4842.0020.0002] # CYPRIOT SYLLABLE XA -10838 ; [.4843.0020.0002] # CYPRIOT SYLLABLE XE -1083C ; [.4844.0020.0002] # CYPRIOT SYLLABLE ZA -1083F ; [.4845.0020.0002] # CYPRIOT SYLLABLE ZO -10A60 ; [.4846.0020.0002] # OLD SOUTH ARABIAN LETTER HE -10A61 ; [.4847.0020.0002] # OLD SOUTH ARABIAN LETTER LAMEDH -10A62 ; [.4848.0020.0002] # OLD SOUTH ARABIAN LETTER HETH -10A63 ; [.4849.0020.0002] # OLD SOUTH ARABIAN LETTER MEM -10A64 ; [.484A.0020.0002] # OLD SOUTH ARABIAN LETTER QOPH -10A65 ; [.484B.0020.0002] # OLD SOUTH ARABIAN LETTER WAW -10A66 ; [.484C.0020.0002] # OLD SOUTH ARABIAN LETTER SHIN -10A67 ; [.484D.0020.0002] # OLD SOUTH ARABIAN LETTER RESH -10A68 ; [.484E.0020.0002] # OLD SOUTH ARABIAN LETTER BETH -10A69 ; [.484F.0020.0002] # OLD SOUTH ARABIAN LETTER TAW -10A6A ; [.4850.0020.0002] # OLD SOUTH ARABIAN LETTER SAT -10A6B ; [.4851.0020.0002] # OLD SOUTH ARABIAN LETTER KAPH -10A6C ; [.4852.0020.0002] # OLD SOUTH ARABIAN LETTER NUN -10A6D ; [.4853.0020.0002] # OLD SOUTH ARABIAN LETTER KHETH -10A6E ; [.4854.0020.0002] # OLD SOUTH ARABIAN LETTER SADHE -10A6F ; [.4855.0020.0002] # OLD SOUTH ARABIAN LETTER SAMEKH -10A70 ; [.4856.0020.0002] # OLD SOUTH ARABIAN LETTER FE -10A71 ; [.4857.0020.0002] # OLD SOUTH ARABIAN LETTER ALEF -10A72 ; [.4858.0020.0002] # OLD SOUTH ARABIAN LETTER AYN -10A73 ; [.4859.0020.0002] # OLD SOUTH ARABIAN LETTER DHADHE -10A74 ; [.485A.0020.0002] # OLD SOUTH ARABIAN LETTER GIMEL -10A75 ; [.485B.0020.0002] # OLD SOUTH ARABIAN LETTER DALETH -10A76 ; [.485C.0020.0002] # OLD SOUTH ARABIAN LETTER GHAYN -10A77 ; [.485D.0020.0002] # OLD SOUTH ARABIAN LETTER TETH -10A78 ; [.485E.0020.0002] # OLD SOUTH ARABIAN LETTER ZAYN -10A79 ; [.485F.0020.0002] # OLD SOUTH ARABIAN LETTER DHALETH -10A7A ; [.4860.0020.0002] # OLD SOUTH ARABIAN LETTER YODH -10A7B ; [.4861.0020.0002] # OLD SOUTH ARABIAN LETTER THAW -10A7C ; [.4862.0020.0002] # OLD SOUTH ARABIAN LETTER THETH -10A80 ; [.4863.0020.0002] # OLD NORTH ARABIAN LETTER HEH -10A81 ; [.4864.0020.0002] # OLD NORTH ARABIAN LETTER LAM -10A82 ; [.4865.0020.0002] # OLD NORTH ARABIAN LETTER HAH -10A83 ; [.4866.0020.0002] # OLD NORTH ARABIAN LETTER MEEM -10A84 ; [.4867.0020.0002] # OLD NORTH ARABIAN LETTER QAF -10A85 ; [.4868.0020.0002] # OLD NORTH ARABIAN LETTER WAW -10A86 ; [.4869.0020.0002] # OLD NORTH ARABIAN LETTER ES-2 -10A87 ; [.486A.0020.0002] # OLD NORTH ARABIAN LETTER REH -10A88 ; [.486B.0020.0002] # OLD NORTH ARABIAN LETTER BEH -10A89 ; [.486C.0020.0002] # OLD NORTH ARABIAN LETTER TEH -10A8A ; [.486D.0020.0002] # OLD NORTH ARABIAN LETTER ES-1 -10A8B ; [.486E.0020.0002] # OLD NORTH ARABIAN LETTER KAF -10A8C ; [.486F.0020.0002] # OLD NORTH ARABIAN LETTER NOON -10A8D ; [.4870.0020.0002] # OLD NORTH ARABIAN LETTER KHAH -10A8E ; [.4871.0020.0002] # OLD NORTH ARABIAN LETTER SAD -10A8F ; [.4872.0020.0002] # OLD NORTH ARABIAN LETTER ES-3 -10A90 ; [.4873.0020.0002] # OLD NORTH ARABIAN LETTER FEH -10A91 ; [.4874.0020.0002] # OLD NORTH ARABIAN LETTER ALEF -10A92 ; [.4875.0020.0002] # OLD NORTH ARABIAN LETTER AIN -10A93 ; [.4876.0020.0002] # OLD NORTH ARABIAN LETTER DAD -10A94 ; [.4877.0020.0002] # OLD NORTH ARABIAN LETTER GEEM -10A95 ; [.4878.0020.0002] # OLD NORTH ARABIAN LETTER DAL -10A96 ; [.4879.0020.0002] # OLD NORTH ARABIAN LETTER GHAIN -10A97 ; [.487A.0020.0002] # OLD NORTH ARABIAN LETTER TAH -10A98 ; [.487B.0020.0002] # OLD NORTH ARABIAN LETTER ZAIN -10A99 ; [.487C.0020.0002] # OLD NORTH ARABIAN LETTER THAL -10A9A ; [.487D.0020.0002] # OLD NORTH ARABIAN LETTER YEH -10A9B ; [.487E.0020.0002] # OLD NORTH ARABIAN LETTER THEH -10A9C ; [.487F.0020.0002] # OLD NORTH ARABIAN LETTER ZAH -10B00 ; [.4880.0020.0002] # AVESTAN LETTER A -10B01 ; [.4881.0020.0002] # AVESTAN LETTER AA -10B02 ; [.4882.0020.0002] # AVESTAN LETTER AO -10B03 ; [.4883.0020.0002] # AVESTAN LETTER AAO -10B04 ; [.4884.0020.0002] # AVESTAN LETTER AN -10B05 ; [.4885.0020.0002] # AVESTAN LETTER AAN -10B06 ; [.4886.0020.0002] # AVESTAN LETTER AE -10B07 ; [.4887.0020.0002] # AVESTAN LETTER AEE -10B08 ; [.4888.0020.0002] # AVESTAN LETTER E -10B09 ; [.4889.0020.0002] # AVESTAN LETTER EE -10B0A ; [.488A.0020.0002] # AVESTAN LETTER O -10B0B ; [.488B.0020.0002] # AVESTAN LETTER OO -10B0C ; [.488C.0020.0002] # AVESTAN LETTER I -10B0D ; [.488D.0020.0002] # AVESTAN LETTER II -10B0E ; [.488E.0020.0002] # AVESTAN LETTER U -10B0F ; [.488F.0020.0002] # AVESTAN LETTER UU -10B10 ; [.4890.0020.0002] # AVESTAN LETTER KE -10B11 ; [.4891.0020.0002] # AVESTAN LETTER XE -10B12 ; [.4892.0020.0002] # AVESTAN LETTER XYE -10B13 ; [.4893.0020.0002] # AVESTAN LETTER XVE -10B14 ; [.4894.0020.0002] # AVESTAN LETTER GE -10B15 ; [.4895.0020.0002] # AVESTAN LETTER GGE -10B16 ; [.4896.0020.0002] # AVESTAN LETTER GHE -10B17 ; [.4897.0020.0002] # AVESTAN LETTER CE -10B18 ; [.4898.0020.0002] # AVESTAN LETTER JE -10B19 ; [.4899.0020.0002] # AVESTAN LETTER TE -10B1A ; [.489A.0020.0002] # AVESTAN LETTER THE -10B1B ; [.489B.0020.0002] # AVESTAN LETTER DE -10B1C ; [.489C.0020.0002] # AVESTAN LETTER DHE -10B1D ; [.489D.0020.0002] # AVESTAN LETTER TTE -10B1E ; [.489E.0020.0002] # AVESTAN LETTER PE -10B1F ; [.489F.0020.0002] # AVESTAN LETTER FE -10B20 ; [.48A0.0020.0002] # AVESTAN LETTER BE -10B21 ; [.48A1.0020.0002] # AVESTAN LETTER BHE -10B22 ; [.48A2.0020.0002] # AVESTAN LETTER NGE -10B23 ; [.48A3.0020.0002] # AVESTAN LETTER NGYE -10B24 ; [.48A4.0020.0002] # AVESTAN LETTER NGVE -10B25 ; [.48A5.0020.0002] # AVESTAN LETTER NE -10B26 ; [.48A6.0020.0002] # AVESTAN LETTER NYE -10B27 ; [.48A7.0020.0002] # AVESTAN LETTER NNE -10B28 ; [.48A8.0020.0002] # AVESTAN LETTER ME -10B29 ; [.48A9.0020.0002] # AVESTAN LETTER HME -10B2A ; [.48AA.0020.0002] # AVESTAN LETTER YYE -10B2B ; [.48AB.0020.0002] # AVESTAN LETTER YE -10B2C ; [.48AC.0020.0002] # AVESTAN LETTER VE -10B2D ; [.48AD.0020.0002] # AVESTAN LETTER RE -10B2E ; [.48AD.0020.0004][.0000.0110.0004] # AVESTAN LETTER LE -10B2F ; [.48AE.0020.0002] # AVESTAN LETTER SE -10B30 ; [.48AF.0020.0002] # AVESTAN LETTER ZE -10B31 ; [.48B0.0020.0002] # AVESTAN LETTER SHE -10B32 ; [.48B1.0020.0002] # AVESTAN LETTER ZHE -10B33 ; [.48B2.0020.0002] # AVESTAN LETTER SHYE -10B34 ; [.48B3.0020.0002] # AVESTAN LETTER SSHE -10B35 ; [.48B4.0020.0002] # AVESTAN LETTER HE -10860 ; [.48B5.0020.0002] # PALMYRENE LETTER ALEPH -10861 ; [.48B6.0020.0002] # PALMYRENE LETTER BETH -10862 ; [.48B7.0020.0002] # PALMYRENE LETTER GIMEL -10863 ; [.48B8.0020.0002] # PALMYRENE LETTER DALETH -10864 ; [.48B9.0020.0002] # PALMYRENE LETTER HE -10865 ; [.48BA.0020.0002] # PALMYRENE LETTER WAW -10866 ; [.48BB.0020.0002] # PALMYRENE LETTER ZAYIN -10867 ; [.48BC.0020.0002] # PALMYRENE LETTER HETH -10868 ; [.48BD.0020.0002] # PALMYRENE LETTER TETH -10869 ; [.48BE.0020.0002] # PALMYRENE LETTER YODH -1086A ; [.48BF.0020.0002] # PALMYRENE LETTER KAPH -1086B ; [.48C0.0020.0002] # PALMYRENE LETTER LAMEDH -1086C ; [.48C1.0020.0002] # PALMYRENE LETTER MEM -1086E ; [.48C2.0020.0002] # PALMYRENE LETTER NUN -1086D ; [.48C2.0020.0019] # PALMYRENE LETTER FINAL NUN -1086F ; [.48C3.0020.0002] # PALMYRENE LETTER SAMEKH -10870 ; [.48C4.0020.0002] # PALMYRENE LETTER AYIN -10871 ; [.48C5.0020.0002] # PALMYRENE LETTER PE -10872 ; [.48C6.0020.0002] # PALMYRENE LETTER SADHE -10873 ; [.48C7.0020.0002] # PALMYRENE LETTER QOPH -10874 ; [.48C8.0020.0002] # PALMYRENE LETTER RESH -10875 ; [.48C9.0020.0002] # PALMYRENE LETTER SHIN -10876 ; [.48CA.0020.0002] # PALMYRENE LETTER TAW -10881 ; [.48CB.0020.0002] # NABATAEAN LETTER ALEPH -10880 ; [.48CB.0020.0019] # NABATAEAN LETTER FINAL ALEPH -10883 ; [.48CC.0020.0002] # NABATAEAN LETTER BETH -10882 ; [.48CC.0020.0019] # NABATAEAN LETTER FINAL BETH -10884 ; [.48CD.0020.0002] # NABATAEAN LETTER GIMEL -10885 ; [.48CE.0020.0002] # NABATAEAN LETTER DALETH -10887 ; [.48CF.0020.0002] # NABATAEAN LETTER HE -10886 ; [.48CF.0020.0019] # NABATAEAN LETTER FINAL HE -10888 ; [.48D0.0020.0002] # NABATAEAN LETTER WAW -10889 ; [.48D1.0020.0002] # NABATAEAN LETTER ZAYIN -1088A ; [.48D2.0020.0002] # NABATAEAN LETTER HETH -1088B ; [.48D3.0020.0002] # NABATAEAN LETTER TETH -1088D ; [.48D4.0020.0002] # NABATAEAN LETTER YODH -1088C ; [.48D4.0020.0019] # NABATAEAN LETTER FINAL YODH -1088F ; [.48D5.0020.0002] # NABATAEAN LETTER KAPH -1088E ; [.48D5.0020.0019] # NABATAEAN LETTER FINAL KAPH -10891 ; [.48D6.0020.0002] # NABATAEAN LETTER LAMEDH -10890 ; [.48D6.0020.0019] # NABATAEAN LETTER FINAL LAMEDH -10893 ; [.48D7.0020.0002] # NABATAEAN LETTER MEM -10892 ; [.48D7.0020.0019] # NABATAEAN LETTER FINAL MEM -10895 ; [.48D8.0020.0002] # NABATAEAN LETTER NUN -10894 ; [.48D8.0020.0019] # NABATAEAN LETTER FINAL NUN -10896 ; [.48D9.0020.0002] # NABATAEAN LETTER SAMEKH -10897 ; [.48DA.0020.0002] # NABATAEAN LETTER AYIN -10898 ; [.48DB.0020.0002] # NABATAEAN LETTER PE -10899 ; [.48DC.0020.0002] # NABATAEAN LETTER SADHE -1089A ; [.48DD.0020.0002] # NABATAEAN LETTER QOPH -1089B ; [.48DE.0020.0002] # NABATAEAN LETTER RESH -1089D ; [.48DF.0020.0002] # NABATAEAN LETTER SHIN -1089C ; [.48DF.0020.0019] # NABATAEAN LETTER FINAL SHIN -1089E ; [.48E0.0020.0002] # NABATAEAN LETTER TAW -108E0 ; [.48E1.0020.0002] # HATRAN LETTER ALEPH -108E1 ; [.48E2.0020.0002] # HATRAN LETTER BETH -108E2 ; [.48E3.0020.0002] # HATRAN LETTER GIMEL -108E3 ; [.48E4.0020.0002] # HATRAN LETTER DALETH-RESH -108E4 ; [.48E5.0020.0002] # HATRAN LETTER HE -108E5 ; [.48E6.0020.0002] # HATRAN LETTER WAW -108E6 ; [.48E7.0020.0002] # HATRAN LETTER ZAYN -108E7 ; [.48E8.0020.0002] # HATRAN LETTER HETH -108E8 ; [.48E9.0020.0002] # HATRAN LETTER TETH -108E9 ; [.48EA.0020.0002] # HATRAN LETTER YODH -108EA ; [.48EB.0020.0002] # HATRAN LETTER KAPH -108EB ; [.48EC.0020.0002] # HATRAN LETTER LAMEDH -108EC ; [.48ED.0020.0002] # HATRAN LETTER MEM -108ED ; [.48EE.0020.0002] # HATRAN LETTER NUN -108EE ; [.48EF.0020.0002] # HATRAN LETTER SAMEKH -108EF ; [.48F0.0020.0002] # HATRAN LETTER AYN -108F0 ; [.48F1.0020.0002] # HATRAN LETTER PE -108F1 ; [.48F2.0020.0002] # HATRAN LETTER SADHE -108F2 ; [.48F3.0020.0002] # HATRAN LETTER QOPH -108F4 ; [.48F4.0020.0002] # HATRAN LETTER SHIN -108F5 ; [.48F5.0020.0002] # HATRAN LETTER TAW -10840 ; [.48F6.0020.0002] # IMPERIAL ARAMAIC LETTER ALEPH -10841 ; [.48F7.0020.0002] # IMPERIAL ARAMAIC LETTER BETH -10842 ; [.48F8.0020.0002] # IMPERIAL ARAMAIC LETTER GIMEL -10843 ; [.48F9.0020.0002] # IMPERIAL ARAMAIC LETTER DALETH -10844 ; [.48FA.0020.0002] # IMPERIAL ARAMAIC LETTER HE -10845 ; [.48FB.0020.0002] # IMPERIAL ARAMAIC LETTER WAW -10846 ; [.48FC.0020.0002] # IMPERIAL ARAMAIC LETTER ZAYIN -10847 ; [.48FD.0020.0002] # IMPERIAL ARAMAIC LETTER HETH -10848 ; [.48FE.0020.0002] # IMPERIAL ARAMAIC LETTER TETH -10849 ; [.48FF.0020.0002] # IMPERIAL ARAMAIC LETTER YODH -1084A ; [.4900.0020.0002] # IMPERIAL ARAMAIC LETTER KAPH -1084B ; [.4901.0020.0002] # IMPERIAL ARAMAIC LETTER LAMEDH -1084C ; [.4902.0020.0002] # IMPERIAL ARAMAIC LETTER MEM -1084D ; [.4903.0020.0002] # IMPERIAL ARAMAIC LETTER NUN -1084E ; [.4904.0020.0002] # IMPERIAL ARAMAIC LETTER SAMEKH -1084F ; [.4905.0020.0002] # IMPERIAL ARAMAIC LETTER AYIN -10850 ; [.4906.0020.0002] # IMPERIAL ARAMAIC LETTER PE -10851 ; [.4907.0020.0002] # IMPERIAL ARAMAIC LETTER SADHE -10852 ; [.4908.0020.0002] # IMPERIAL ARAMAIC LETTER QOPH -10853 ; [.4909.0020.0002] # IMPERIAL ARAMAIC LETTER RESH -10854 ; [.490A.0020.0002] # IMPERIAL ARAMAIC LETTER SHIN -10855 ; [.490B.0020.0002] # IMPERIAL ARAMAIC LETTER TAW -10B40 ; [.490C.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ALEPH -10B41 ; [.490D.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER BETH -10B42 ; [.490E.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER GIMEL -10B43 ; [.490F.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER DALETH -10B44 ; [.4910.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HE -10B45 ; [.4911.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER WAW -10B46 ; [.4912.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ZAYIN -10B47 ; [.4913.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HETH -10B48 ; [.4914.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TETH -10B49 ; [.4915.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER YODH -10B4A ; [.4916.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER KAPH -10B4B ; [.4917.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER LAMEDH -10B4C ; [.4918.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER MEM -10B4D ; [.4919.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER NUN -10B4E ; [.491A.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SAMEKH -10B4F ; [.491B.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER AYIN -10B50 ; [.491C.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER PE -10B51 ; [.491D.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SADHE -10B52 ; [.491E.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER QOPH -10B53 ; [.491F.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER RESH -10B54 ; [.4920.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SHIN -10B55 ; [.4921.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TAW -10B60 ; [.4922.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ALEPH -10B61 ; [.4923.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER BETH -10B62 ; [.4924.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER GIMEL -10B63 ; [.4925.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER DALETH -10B64 ; [.4926.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HE -10B65 ; [.4927.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH -10B66 ; [.4928.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ZAYIN -10B67 ; [.4929.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HETH -10B68 ; [.492A.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TETH -10B69 ; [.492B.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER YODH -10B6A ; [.492C.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER KAPH -10B6B ; [.492D.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER LAMEDH -10B6C ; [.492E.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH -10B6D ; [.492F.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER NUN -10B6E ; [.4930.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SAMEKH -10B6F ; [.4931.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER PE -10B70 ; [.4932.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SADHE -10B71 ; [.4933.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SHIN -10B72 ; [.4934.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TAW -10B80 ; [.4935.0020.0002] # PSALTER PAHLAVI LETTER ALEPH -10B81 ; [.4936.0020.0002] # PSALTER PAHLAVI LETTER BETH -10B82 ; [.4937.0020.0002] # PSALTER PAHLAVI LETTER GIMEL -10B83 ; [.4938.0020.0002] # PSALTER PAHLAVI LETTER DALETH -10B84 ; [.4939.0020.0002] # PSALTER PAHLAVI LETTER HE -10B85 ; [.493A.0020.0002] # PSALTER PAHLAVI LETTER WAW-AYIN-RESH -10B86 ; [.493B.0020.0002] # PSALTER PAHLAVI LETTER ZAYIN -10B87 ; [.493C.0020.0002] # PSALTER PAHLAVI LETTER HETH -10B88 ; [.493D.0020.0002] # PSALTER PAHLAVI LETTER YODH -10B89 ; [.493E.0020.0002] # PSALTER PAHLAVI LETTER KAPH -10B8A ; [.493F.0020.0002] # PSALTER PAHLAVI LETTER LAMEDH -10B8B ; [.4940.0020.0002] # PSALTER PAHLAVI LETTER MEM-QOPH -10B8C ; [.4941.0020.0002] # PSALTER PAHLAVI LETTER NUN -10B8D ; [.4942.0020.0002] # PSALTER PAHLAVI LETTER SAMEKH -10B8E ; [.4943.0020.0002] # PSALTER PAHLAVI LETTER PE -10B8F ; [.4944.0020.0002] # PSALTER PAHLAVI LETTER SADHE -10B90 ; [.4945.0020.0002] # PSALTER PAHLAVI LETTER SHIN -10B91 ; [.4946.0020.0002] # PSALTER PAHLAVI LETTER TAW -10AC0 ; [.4947.0020.0002] # MANICHAEAN LETTER ALEPH -10AC1 ; [.4948.0020.0002] # MANICHAEAN LETTER BETH -10AC2 ; [.4949.0020.0002] # MANICHAEAN LETTER BHETH -10AC3 ; [.494A.0020.0002] # MANICHAEAN LETTER GIMEL -10AC4 ; [.494B.0020.0002] # MANICHAEAN LETTER GHIMEL -10AC5 ; [.494C.0020.0002] # MANICHAEAN LETTER DALETH -10AC6 ; [.494D.0020.0002] # MANICHAEAN LETTER HE -10AC7 ; [.494E.0020.0002] # MANICHAEAN LETTER WAW -10AC8 ; [.494E.0020.0004][.0000.0111.0004] # MANICHAEAN SIGN UD -10AC9 ; [.494F.0020.0002] # MANICHAEAN LETTER ZAYIN -10ACA ; [.4950.0020.0002] # MANICHAEAN LETTER ZHAYIN -10ACB ; [.4951.0020.0002] # MANICHAEAN LETTER JAYIN -10ACC ; [.4952.0020.0002] # MANICHAEAN LETTER JHAYIN -10ACD ; [.4953.0020.0002] # MANICHAEAN LETTER HETH -10ACE ; [.4954.0020.0002] # MANICHAEAN LETTER TETH -10ACF ; [.4955.0020.0002] # MANICHAEAN LETTER YODH -10AD0 ; [.4956.0020.0002] # MANICHAEAN LETTER KAPH -10AD1 ; [.4957.0020.0002] # MANICHAEAN LETTER XAPH -10AD2 ; [.4958.0020.0002] # MANICHAEAN LETTER KHAPH -10AD3 ; [.4959.0020.0002] # MANICHAEAN LETTER LAMEDH -10AD4 ; [.495A.0020.0002] # MANICHAEAN LETTER DHAMEDH -10AD5 ; [.495B.0020.0002] # MANICHAEAN LETTER THAMEDH -10AD6 ; [.495C.0020.0002] # MANICHAEAN LETTER MEM -10AD7 ; [.495D.0020.0002] # MANICHAEAN LETTER NUN -10AD8 ; [.495E.0020.0002] # MANICHAEAN LETTER SAMEKH -10AD9 ; [.495F.0020.0002] # MANICHAEAN LETTER AYIN -10ADA ; [.4960.0020.0002] # MANICHAEAN LETTER AAYIN -10ADB ; [.4961.0020.0002] # MANICHAEAN LETTER PE -10ADC ; [.4962.0020.0002] # MANICHAEAN LETTER FE -10ADD ; [.4963.0020.0002] # MANICHAEAN LETTER SADHE -10ADE ; [.4964.0020.0002] # MANICHAEAN LETTER QOPH -10ADF ; [.4965.0020.0002] # MANICHAEAN LETTER XOPH -10AE0 ; [.4966.0020.0002] # MANICHAEAN LETTER QHOPH -10AE1 ; [.4967.0020.0002] # MANICHAEAN LETTER RESH -10AE2 ; [.4968.0020.0002] # MANICHAEAN LETTER SHIN -10AE3 ; [.4969.0020.0002] # MANICHAEAN LETTER SSHIN -10AE4 ; [.496A.0020.0002] # MANICHAEAN LETTER TAW -10380 ; [.496B.0020.0002] # UGARITIC LETTER ALPA -10381 ; [.496C.0020.0002] # UGARITIC LETTER BETA -10382 ; [.496D.0020.0002] # UGARITIC LETTER GAMLA -10383 ; [.496E.0020.0002] # UGARITIC LETTER KHA -10384 ; [.496F.0020.0002] # UGARITIC LETTER DELTA -10385 ; [.4970.0020.0002] # UGARITIC LETTER HO -10386 ; [.4971.0020.0002] # UGARITIC LETTER WO -10387 ; [.4972.0020.0002] # UGARITIC LETTER ZETA -10388 ; [.4973.0020.0002] # UGARITIC LETTER HOTA -10389 ; [.4974.0020.0002] # UGARITIC LETTER TET -1038A ; [.4975.0020.0002] # UGARITIC LETTER YOD -1038B ; [.4976.0020.0002] # UGARITIC LETTER KAF -1038C ; [.4977.0020.0002] # UGARITIC LETTER SHIN -1038D ; [.4978.0020.0002] # UGARITIC LETTER LAMDA -1038E ; [.4979.0020.0002] # UGARITIC LETTER MEM -1038F ; [.497A.0020.0002] # UGARITIC LETTER DHAL -10390 ; [.497B.0020.0002] # UGARITIC LETTER NUN -10391 ; [.497C.0020.0002] # UGARITIC LETTER ZU -10392 ; [.497D.0020.0002] # UGARITIC LETTER SAMKA -10393 ; [.497E.0020.0002] # UGARITIC LETTER AIN -10394 ; [.497F.0020.0002] # UGARITIC LETTER PU -10395 ; [.4980.0020.0002] # UGARITIC LETTER SADE -10396 ; [.4981.0020.0002] # UGARITIC LETTER QOPA -10397 ; [.4982.0020.0002] # UGARITIC LETTER RASHA -10398 ; [.4983.0020.0002] # UGARITIC LETTER THANNA -10399 ; [.4984.0020.0002] # UGARITIC LETTER GHAIN -1039A ; [.4985.0020.0002] # UGARITIC LETTER TO -1039B ; [.4986.0020.0002] # UGARITIC LETTER I -1039C ; [.4987.0020.0002] # UGARITIC LETTER U -1039D ; [.4988.0020.0002] # UGARITIC LETTER SSU -103A0 ; [.4989.0020.0002] # OLD PERSIAN SIGN A -103A1 ; [.498A.0020.0002] # OLD PERSIAN SIGN I -103A2 ; [.498B.0020.0002] # OLD PERSIAN SIGN U -103A3 ; [.498C.0020.0002] # OLD PERSIAN SIGN KA -103A4 ; [.498D.0020.0002] # OLD PERSIAN SIGN KU -103A5 ; [.498E.0020.0002] # OLD PERSIAN SIGN GA -103A6 ; [.498F.0020.0002] # OLD PERSIAN SIGN GU -103A7 ; [.4990.0020.0002] # OLD PERSIAN SIGN XA -103A8 ; [.4991.0020.0002] # OLD PERSIAN SIGN CA -103A9 ; [.4992.0020.0002] # OLD PERSIAN SIGN JA -103AA ; [.4993.0020.0002] # OLD PERSIAN SIGN JI -103AB ; [.4994.0020.0002] # OLD PERSIAN SIGN TA -103AC ; [.4995.0020.0002] # OLD PERSIAN SIGN TU -103AD ; [.4996.0020.0002] # OLD PERSIAN SIGN DA -103AE ; [.4997.0020.0002] # OLD PERSIAN SIGN DI -103AF ; [.4998.0020.0002] # OLD PERSIAN SIGN DU -103B0 ; [.4999.0020.0002] # OLD PERSIAN SIGN THA -103B1 ; [.499A.0020.0002] # OLD PERSIAN SIGN PA -103B2 ; [.499B.0020.0002] # OLD PERSIAN SIGN BA -103B3 ; [.499C.0020.0002] # OLD PERSIAN SIGN FA -103B4 ; [.499D.0020.0002] # OLD PERSIAN SIGN NA -103B5 ; [.499E.0020.0002] # OLD PERSIAN SIGN NU -103B6 ; [.499F.0020.0002] # OLD PERSIAN SIGN MA -103B7 ; [.49A0.0020.0002] # OLD PERSIAN SIGN MI -103B8 ; [.49A1.0020.0002] # OLD PERSIAN SIGN MU -103B9 ; [.49A2.0020.0002] # OLD PERSIAN SIGN YA -103BA ; [.49A3.0020.0002] # OLD PERSIAN SIGN VA -103BB ; [.49A4.0020.0002] # OLD PERSIAN SIGN VI -103BC ; [.49A5.0020.0002] # OLD PERSIAN SIGN RA -103BD ; [.49A6.0020.0002] # OLD PERSIAN SIGN RU -103BE ; [.49A7.0020.0002] # OLD PERSIAN SIGN LA -103BF ; [.49A8.0020.0002] # OLD PERSIAN SIGN SA -103C0 ; [.49A9.0020.0002] # OLD PERSIAN SIGN ZA -103C1 ; [.49AA.0020.0002] # OLD PERSIAN SIGN SHA -103C2 ; [.49AB.0020.0002] # OLD PERSIAN SIGN SSA -103C3 ; [.49AC.0020.0002] # OLD PERSIAN SIGN HA -103C8 ; [.49AD.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA -103C9 ; [.49AE.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA-2 -103CA ; [.49AF.0020.0002] # OLD PERSIAN SIGN AURAMAZDAAHA -103CB ; [.49B0.0020.0002] # OLD PERSIAN SIGN XSHAAYATHIYA -103CC ; [.49B1.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH -103CD ; [.49B2.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH-2 -103CE ; [.49B3.0020.0002] # OLD PERSIAN SIGN BAGA -103CF ; [.49B4.0020.0002] # OLD PERSIAN SIGN BUUMISH -12000 ; [.49B5.0020.0002] # CUNEIFORM SIGN A -12001 ; [.49B6.0020.0002] # CUNEIFORM SIGN A TIMES A -12002 ; [.49B7.0020.0002] # CUNEIFORM SIGN A TIMES BAD -12003 ; [.49B8.0020.0002] # CUNEIFORM SIGN A TIMES GAN2 TENU -12004 ; [.49B9.0020.0002] # CUNEIFORM SIGN A TIMES HA -12005 ; [.49BA.0020.0002] # CUNEIFORM SIGN A TIMES IGI -12006 ; [.49BB.0020.0002] # CUNEIFORM SIGN A TIMES LAGAR GUNU -12007 ; [.49BC.0020.0002] # CUNEIFORM SIGN A TIMES MUSH -12008 ; [.49BD.0020.0002] # CUNEIFORM SIGN A TIMES SAG -12009 ; [.49BE.0020.0002] # CUNEIFORM SIGN A2 -1200A ; [.49BF.0020.0002] # CUNEIFORM SIGN AB -1200B ; [.49C0.0020.0002] # CUNEIFORM SIGN AB TIMES ASH2 -1200C ; [.49C1.0020.0002] # CUNEIFORM SIGN AB TIMES DUN3 GUNU -1200D ; [.49C2.0020.0002] # CUNEIFORM SIGN AB TIMES GAL -1200E ; [.49C3.0020.0002] # CUNEIFORM SIGN AB TIMES GAN2 TENU -1200F ; [.49C4.0020.0002] # CUNEIFORM SIGN AB TIMES HA -12010 ; [.49C5.0020.0002] # CUNEIFORM SIGN AB TIMES IGI GUNU -12011 ; [.49C6.0020.0002] # CUNEIFORM SIGN AB TIMES IMIN -12012 ; [.49C7.0020.0002] # CUNEIFORM SIGN AB TIMES LAGAB -12013 ; [.49C8.0020.0002] # CUNEIFORM SIGN AB TIMES SHESH -12014 ; [.49C9.0020.0002] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U -12015 ; [.49CA.0020.0002] # CUNEIFORM SIGN AB GUNU -12016 ; [.49CB.0020.0002] # CUNEIFORM SIGN AB2 -12017 ; [.49CC.0020.0002] # CUNEIFORM SIGN AB2 TIMES BALAG -12018 ; [.49CD.0020.0002] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU -12019 ; [.49CE.0020.0002] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN -1201A ; [.49CF.0020.0002] # CUNEIFORM SIGN AB2 TIMES SHA3 -1201B ; [.49D0.0020.0002] # CUNEIFORM SIGN AB2 TIMES TAK4 -1201C ; [.49D1.0020.0002] # CUNEIFORM SIGN AD -1201D ; [.49D2.0020.0002] # CUNEIFORM SIGN AK -1201E ; [.49D3.0020.0002] # CUNEIFORM SIGN AK TIMES ERIN2 -1201F ; [.49D4.0020.0002] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH -12020 ; [.49D5.0020.0002] # CUNEIFORM SIGN AL -12021 ; [.49D6.0020.0002] # CUNEIFORM SIGN AL TIMES AL -12022 ; [.49D7.0020.0002] # CUNEIFORM SIGN AL TIMES DIM2 -12023 ; [.49D8.0020.0002] # CUNEIFORM SIGN AL TIMES GISH -12024 ; [.49D9.0020.0002] # CUNEIFORM SIGN AL TIMES HA -12025 ; [.49DA.0020.0002] # CUNEIFORM SIGN AL TIMES KAD3 -12026 ; [.49DB.0020.0002] # CUNEIFORM SIGN AL TIMES KI -12027 ; [.49DC.0020.0002] # CUNEIFORM SIGN AL TIMES SHE -12028 ; [.49DD.0020.0002] # CUNEIFORM SIGN AL TIMES USH -12029 ; [.49DE.0020.0002] # CUNEIFORM SIGN ALAN -1202A ; [.49DF.0020.0002] # CUNEIFORM SIGN ALEPH -1202B ; [.49E0.0020.0002] # CUNEIFORM SIGN AMAR -1202C ; [.49E1.0020.0002] # CUNEIFORM SIGN AMAR TIMES SHE -1202D ; [.49E2.0020.0002] # CUNEIFORM SIGN AN -1202E ; [.49E3.0020.0002] # CUNEIFORM SIGN AN OVER AN -1202F ; [.49E4.0020.0002] # CUNEIFORM SIGN AN THREE TIMES -12030 ; [.49E5.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA -12031 ; [.49E6.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA SQUARED -12032 ; [.49E7.0020.0002] # CUNEIFORM SIGN ANSHE -12033 ; [.49E8.0020.0002] # CUNEIFORM SIGN APIN -12034 ; [.49E9.0020.0002] # CUNEIFORM SIGN ARAD -12035 ; [.49EA.0020.0002] # CUNEIFORM SIGN ARAD TIMES KUR -12036 ; [.49EB.0020.0002] # CUNEIFORM SIGN ARKAB -12037 ; [.49EC.0020.0002] # CUNEIFORM SIGN ASAL2 -12038 ; [.49ED.0020.0002] # CUNEIFORM SIGN ASH -12039 ; [.49EE.0020.0002] # CUNEIFORM SIGN ASH ZIDA TENU -1203A ; [.49EF.0020.0002] # CUNEIFORM SIGN ASH KABA TENU -1203B ; [.49F0.0020.0002] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP -1203C ; [.49F1.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH -1203D ; [.49F2.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH -1203E ; [.49F3.0020.0002] # CUNEIFORM SIGN ASH2 -1203F ; [.49F4.0020.0002] # CUNEIFORM SIGN ASHGAB -12040 ; [.49F5.0020.0002] # CUNEIFORM SIGN BA -12041 ; [.49F6.0020.0002] # CUNEIFORM SIGN BAD -12042 ; [.49F7.0020.0002] # CUNEIFORM SIGN BAG3 -12043 ; [.49F8.0020.0002] # CUNEIFORM SIGN BAHAR2 -12044 ; [.49F9.0020.0002] # CUNEIFORM SIGN BAL -12045 ; [.49FA.0020.0002] # CUNEIFORM SIGN BAL OVER BAL -12046 ; [.49FB.0020.0002] # CUNEIFORM SIGN BALAG -12047 ; [.49FC.0020.0002] # CUNEIFORM SIGN BAR -12048 ; [.49FD.0020.0002] # CUNEIFORM SIGN BARA2 -12049 ; [.49FE.0020.0002] # CUNEIFORM SIGN BI -1204A ; [.49FF.0020.0002] # CUNEIFORM SIGN BI TIMES A -1204B ; [.4A00.0020.0002] # CUNEIFORM SIGN BI TIMES GAR -1204C ; [.4A01.0020.0002] # CUNEIFORM SIGN BI TIMES IGI GUNU -1204D ; [.4A02.0020.0002] # CUNEIFORM SIGN BU -1204E ; [.4A03.0020.0002] # CUNEIFORM SIGN BU OVER BU AB -1204F ; [.4A04.0020.0002] # CUNEIFORM SIGN BU OVER BU UN -12050 ; [.4A05.0020.0002] # CUNEIFORM SIGN BU CROSSING BU -12051 ; [.4A06.0020.0002] # CUNEIFORM SIGN BULUG -12052 ; [.4A07.0020.0002] # CUNEIFORM SIGN BULUG OVER BULUG -12053 ; [.4A08.0020.0002] # CUNEIFORM SIGN BUR -12054 ; [.4A09.0020.0002] # CUNEIFORM SIGN BUR2 -12055 ; [.4A0A.0020.0002] # CUNEIFORM SIGN DA -12056 ; [.4A0B.0020.0002] # CUNEIFORM SIGN DAG -12057 ; [.4A0C.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH -12058 ; [.4A0D.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR -12059 ; [.4A0E.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG -1205A ; [.4A0F.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BI -1205B ; [.4A10.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA -1205C ; [.4A11.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH -1205D ; [.4A12.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GI -1205E ; [.4A13.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2 -1205F ; [.4A14.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD -12060 ; [.4A15.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES HA -12061 ; [.4A16.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR -12062 ; [.4A17.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU -12063 ; [.4A18.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK -12064 ; [.4A19.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LA -12065 ; [.4A1A.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU -12066 ; [.4A1B.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2 -12067 ; [.4A1C.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM -12068 ; [.4A1D.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES NE -12069 ; [.4A1E.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP -1206A ; [.4A1F.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES SI -1206B ; [.4A20.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4 -1206C ; [.4A21.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2 -1206D ; [.4A22.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES USH -1206E ; [.4A23.0020.0002] # CUNEIFORM SIGN DAM -1206F ; [.4A24.0020.0002] # CUNEIFORM SIGN DAR -12070 ; [.4A25.0020.0002] # CUNEIFORM SIGN DARA3 -12071 ; [.4A26.0020.0002] # CUNEIFORM SIGN DARA4 -12072 ; [.4A27.0020.0002] # CUNEIFORM SIGN DI -12073 ; [.4A28.0020.0002] # CUNEIFORM SIGN DIB -12074 ; [.4A29.0020.0002] # CUNEIFORM SIGN DIM -12075 ; [.4A2A.0020.0002] # CUNEIFORM SIGN DIM TIMES SHE -12076 ; [.4A2B.0020.0002] # CUNEIFORM SIGN DIM2 -12077 ; [.4A2C.0020.0002] # CUNEIFORM SIGN DIN -12078 ; [.4A2D.0020.0002] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH -12079 ; [.4A2E.0020.0002] # CUNEIFORM SIGN DISH -1207A ; [.4A2F.0020.0002] # CUNEIFORM SIGN DU -1207B ; [.4A30.0020.0002] # CUNEIFORM SIGN DU OVER DU -1207C ; [.4A31.0020.0002] # CUNEIFORM SIGN DU GUNU -1207D ; [.4A32.0020.0002] # CUNEIFORM SIGN DU SHESHIG -1207E ; [.4A33.0020.0002] # CUNEIFORM SIGN DUB -1207F ; [.4A34.0020.0002] # CUNEIFORM SIGN DUB TIMES ESH2 -12080 ; [.4A35.0020.0002] # CUNEIFORM SIGN DUB2 -12081 ; [.4A36.0020.0002] # CUNEIFORM SIGN DUG -12082 ; [.4A37.0020.0002] # CUNEIFORM SIGN DUGUD -12083 ; [.4A38.0020.0002] # CUNEIFORM SIGN DUH -12084 ; [.4A39.0020.0002] # CUNEIFORM SIGN DUN -12085 ; [.4A3A.0020.0002] # CUNEIFORM SIGN DUN3 -12086 ; [.4A3B.0020.0002] # CUNEIFORM SIGN DUN3 GUNU -12087 ; [.4A3C.0020.0002] # CUNEIFORM SIGN DUN3 GUNU GUNU -12088 ; [.4A3D.0020.0002] # CUNEIFORM SIGN DUN4 -12089 ; [.4A3E.0020.0002] # CUNEIFORM SIGN DUR2 -1208A ; [.4A3F.0020.0002] # CUNEIFORM SIGN E -1208B ; [.4A40.0020.0002] # CUNEIFORM SIGN E TIMES PAP -1208C ; [.4A41.0020.0002] # CUNEIFORM SIGN E OVER E NUN OVER NUN -1208D ; [.4A42.0020.0002] # CUNEIFORM SIGN E2 -1208E ; [.4A43.0020.0002] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA -1208F ; [.4A44.0020.0002] # CUNEIFORM SIGN E2 TIMES GAR -12090 ; [.4A45.0020.0002] # CUNEIFORM SIGN E2 TIMES MI -12091 ; [.4A46.0020.0002] # CUNEIFORM SIGN E2 TIMES SAL -12092 ; [.4A47.0020.0002] # CUNEIFORM SIGN E2 TIMES SHE -12093 ; [.4A48.0020.0002] # CUNEIFORM SIGN E2 TIMES U -12094 ; [.4A49.0020.0002] # CUNEIFORM SIGN EDIN -12095 ; [.4A4A.0020.0002] # CUNEIFORM SIGN EGIR -12096 ; [.4A4B.0020.0002] # CUNEIFORM SIGN EL -12097 ; [.4A4C.0020.0002] # CUNEIFORM SIGN EN -12098 ; [.4A4D.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 -12099 ; [.4A4E.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 TENU -1209A ; [.4A4F.0020.0002] # CUNEIFORM SIGN EN TIMES ME -1209B ; [.4A50.0020.0002] # CUNEIFORM SIGN EN CROSSING EN -1209C ; [.4A51.0020.0002] # CUNEIFORM SIGN EN OPPOSING EN -1209D ; [.4A52.0020.0002] # CUNEIFORM SIGN EN SQUARED -1209E ; [.4A53.0020.0002] # CUNEIFORM SIGN EREN -1209F ; [.4A54.0020.0002] # CUNEIFORM SIGN ERIN2 -120A0 ; [.4A55.0020.0002] # CUNEIFORM SIGN ESH2 -120A1 ; [.4A56.0020.0002] # CUNEIFORM SIGN EZEN -120A2 ; [.4A57.0020.0002] # CUNEIFORM SIGN EZEN TIMES A -120A3 ; [.4A58.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL -120A4 ; [.4A59.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL -120A5 ; [.4A5A.0020.0002] # CUNEIFORM SIGN EZEN TIMES AN -120A6 ; [.4A5B.0020.0002] # CUNEIFORM SIGN EZEN TIMES BAD -120A7 ; [.4A5C.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU -120A8 ; [.4A5D.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU -120A9 ; [.4A5E.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA -120AA ; [.4A5F.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA GUNU -120AB ; [.4A60.0020.0002] # CUNEIFORM SIGN EZEN TIMES IGI GUNU -120AC ; [.4A61.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL -120AD ; [.4A62.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED -120AE ; [.4A63.0020.0002] # CUNEIFORM SIGN EZEN TIMES KU3 -120AF ; [.4A64.0020.0002] # CUNEIFORM SIGN EZEN TIMES LA -120B0 ; [.4A65.0020.0002] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL -120B1 ; [.4A66.0020.0002] # CUNEIFORM SIGN EZEN TIMES LI -120B2 ; [.4A67.0020.0002] # CUNEIFORM SIGN EZEN TIMES LU -120B3 ; [.4A68.0020.0002] # CUNEIFORM SIGN EZEN TIMES U2 -120B4 ; [.4A69.0020.0002] # CUNEIFORM SIGN EZEN TIMES UD -120B5 ; [.4A6A.0020.0002] # CUNEIFORM SIGN GA -120B6 ; [.4A6B.0020.0002] # CUNEIFORM SIGN GA GUNU -120B7 ; [.4A6C.0020.0002] # CUNEIFORM SIGN GA2 -120B8 ; [.4A6D.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA -120B9 ; [.4A6E.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS HA -120BA ; [.4A6F.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI -120BB ; [.4A70.0020.0002] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB -120BC ; [.4A71.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN -120BD ; [.4A72.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH -120BE ; [.4A73.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL -120BF ; [.4A74.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAD -120C0 ; [.4A75.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA -120C1 ; [.4A76.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR -120C2 ; [.4A77.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA -120C3 ; [.4A78.0020.0002] # CUNEIFORM SIGN GA2 TIMES DA -120C4 ; [.4A79.0020.0002] # CUNEIFORM SIGN GA2 TIMES DI -120C5 ; [.4A7A.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE -120C6 ; [.4A7B.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUB -120C7 ; [.4A7C.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL -120C8 ; [.4A7D.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA -120C9 ; [.4A7E.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN -120CA ; [.4A7F.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU -120CB ; [.4A80.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU -120CC ; [.4A81.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR -120CD ; [.4A82.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI -120CE ; [.4A83.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 -120CF ; [.4A84.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A -120D0 ; [.4A85.0020.0002] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU -120D1 ; [.4A86.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2 -120D2 ; [.4A87.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL -120D3 ; [.4A88.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA -120D4 ; [.4A89.0020.0002] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI -120D5 ; [.4A8A.0020.0002] # CUNEIFORM SIGN GA2 TIMES HUB2 -120D6 ; [.4A8B.0020.0002] # CUNEIFORM SIGN GA2 TIMES IGI GUNU -120D7 ; [.4A8C.0020.0002] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH -120D8 ; [.4A8D.0020.0002] # CUNEIFORM SIGN GA2 TIMES KAK -120D9 ; [.4A8E.0020.0002] # CUNEIFORM SIGN GA2 TIMES KASKAL -120DA ; [.4A8F.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID -120DB ; [.4A90.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL -120DC ; [.4A91.0020.0002] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN -120DD ; [.4A92.0020.0002] # CUNEIFORM SIGN GA2 TIMES LA -120DE ; [.4A93.0020.0002] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN -120DF ; [.4A94.0020.0002] # CUNEIFORM SIGN GA2 TIMES MI -120E0 ; [.4A95.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN -120E1 ; [.4A96.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN -120E2 ; [.4A97.0020.0002] # CUNEIFORM SIGN GA2 TIMES PA -120E3 ; [.4A98.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAL -120E4 ; [.4A99.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAR -120E5 ; [.4A9A.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE -120E6 ; [.4A9B.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR -120E7 ; [.4A9C.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHID -120E8 ; [.4A9D.0020.0002] # CUNEIFORM SIGN GA2 TIMES SUM -120E9 ; [.4A9E.0020.0002] # CUNEIFORM SIGN GA2 TIMES TAK4 -120EA ; [.4A9F.0020.0002] # CUNEIFORM SIGN GA2 TIMES U -120EB ; [.4AA0.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD -120EC ; [.4AA1.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU -120ED ; [.4AA2.0020.0002] # CUNEIFORM SIGN GA2 OVER GA2 -120EE ; [.4AA3.0020.0002] # CUNEIFORM SIGN GABA -120EF ; [.4AA4.0020.0002] # CUNEIFORM SIGN GABA CROSSING GABA -120F0 ; [.4AA5.0020.0002] # CUNEIFORM SIGN GAD -120F1 ; [.4AA6.0020.0002] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR -120F2 ; [.4AA7.0020.0002] # CUNEIFORM SIGN GAL -120F3 ; [.4AA8.0020.0002] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR -120F4 ; [.4AA9.0020.0002] # CUNEIFORM SIGN GALAM -120F5 ; [.4AAA.0020.0002] # CUNEIFORM SIGN GAM -120F6 ; [.4AAB.0020.0002] # CUNEIFORM SIGN GAN -120F7 ; [.4AAC.0020.0002] # CUNEIFORM SIGN GAN2 -120F8 ; [.4AAD.0020.0002] # CUNEIFORM SIGN GAN2 TENU -120F9 ; [.4AAE.0020.0002] # CUNEIFORM SIGN GAN2 OVER GAN2 -120FA ; [.4AAF.0020.0002] # CUNEIFORM SIGN GAN2 CROSSING GAN2 -120FB ; [.4AB0.0020.0002] # CUNEIFORM SIGN GAR -120FC ; [.4AB1.0020.0002] # CUNEIFORM SIGN GAR3 -120FD ; [.4AB2.0020.0002] # CUNEIFORM SIGN GASHAN -120FE ; [.4AB3.0020.0002] # CUNEIFORM SIGN GESHTIN -120FF ; [.4AB4.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES KUR -12100 ; [.4AB5.0020.0002] # CUNEIFORM SIGN GI -12101 ; [.4AB6.0020.0002] # CUNEIFORM SIGN GI TIMES E -12102 ; [.4AB7.0020.0002] # CUNEIFORM SIGN GI TIMES U -12103 ; [.4AB8.0020.0002] # CUNEIFORM SIGN GI CROSSING GI -12104 ; [.4AB9.0020.0002] # CUNEIFORM SIGN GI4 -12105 ; [.4ABA.0020.0002] # CUNEIFORM SIGN GI4 OVER GI4 -12106 ; [.4ABB.0020.0002] # CUNEIFORM SIGN GI4 CROSSING GI4 -12107 ; [.4ABC.0020.0002] # CUNEIFORM SIGN GIDIM -12108 ; [.4ABD.0020.0002] # CUNEIFORM SIGN GIR2 -12109 ; [.4ABE.0020.0002] # CUNEIFORM SIGN GIR2 GUNU -1210A ; [.4ABF.0020.0002] # CUNEIFORM SIGN GIR3 -1210B ; [.4AC0.0020.0002] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI -1210C ; [.4AC1.0020.0002] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU -1210D ; [.4AC2.0020.0002] # CUNEIFORM SIGN GIR3 TIMES IGI -1210E ; [.4AC3.0020.0002] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI -1210F ; [.4AC4.0020.0002] # CUNEIFORM SIGN GIR3 TIMES PA -12110 ; [.4AC5.0020.0002] # CUNEIFORM SIGN GISAL -12111 ; [.4AC6.0020.0002] # CUNEIFORM SIGN GISH -12112 ; [.4AC7.0020.0002] # CUNEIFORM SIGN GISH CROSSING GISH -12113 ; [.4AC8.0020.0002] # CUNEIFORM SIGN GISH TIMES BAD -12114 ; [.4AC9.0020.0002] # CUNEIFORM SIGN GISH TIMES TAK4 -12115 ; [.4ACA.0020.0002] # CUNEIFORM SIGN GISH TENU -12116 ; [.4ACB.0020.0002] # CUNEIFORM SIGN GU -12117 ; [.4ACC.0020.0002] # CUNEIFORM SIGN GU CROSSING GU -12118 ; [.4ACD.0020.0002] # CUNEIFORM SIGN GU2 -12119 ; [.4ACE.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK -1211A ; [.4ACF.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU -1211B ; [.4AD0.0020.0002] # CUNEIFORM SIGN GU2 TIMES NUN -1211C ; [.4AD1.0020.0002] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2 -1211D ; [.4AD2.0020.0002] # CUNEIFORM SIGN GU2 GUNU -1211E ; [.4AD3.0020.0002] # CUNEIFORM SIGN GUD -1211F ; [.4AD4.0020.0002] # CUNEIFORM SIGN GUD TIMES A PLUS KUR -12120 ; [.4AD5.0020.0002] # CUNEIFORM SIGN GUD TIMES KUR -12121 ; [.4AD6.0020.0002] # CUNEIFORM SIGN GUD OVER GUD LUGAL -12122 ; [.4AD7.0020.0002] # CUNEIFORM SIGN GUL -12123 ; [.4AD8.0020.0002] # CUNEIFORM SIGN GUM -12124 ; [.4AD9.0020.0002] # CUNEIFORM SIGN GUM TIMES SHE -12125 ; [.4ADA.0020.0002] # CUNEIFORM SIGN GUR -12126 ; [.4ADB.0020.0002] # CUNEIFORM SIGN GUR7 -12127 ; [.4ADC.0020.0002] # CUNEIFORM SIGN GURUN -12128 ; [.4ADD.0020.0002] # CUNEIFORM SIGN GURUSH -12129 ; [.4ADE.0020.0002] # CUNEIFORM SIGN HA -1212A ; [.4ADF.0020.0002] # CUNEIFORM SIGN HA TENU -1212B ; [.4AE0.0020.0002] # CUNEIFORM SIGN HA GUNU -1212C ; [.4AE1.0020.0002] # CUNEIFORM SIGN HAL -1212D ; [.4AE2.0020.0002] # CUNEIFORM SIGN HI -1212E ; [.4AE3.0020.0002] # CUNEIFORM SIGN HI TIMES ASH -1212F ; [.4AE4.0020.0002] # CUNEIFORM SIGN HI TIMES ASH2 -12130 ; [.4AE5.0020.0002] # CUNEIFORM SIGN HI TIMES BAD -12131 ; [.4AE6.0020.0002] # CUNEIFORM SIGN HI TIMES DISH -12132 ; [.4AE7.0020.0002] # CUNEIFORM SIGN HI TIMES GAD -12133 ; [.4AE8.0020.0002] # CUNEIFORM SIGN HI TIMES KIN -12134 ; [.4AE9.0020.0002] # CUNEIFORM SIGN HI TIMES NUN -12135 ; [.4AEA.0020.0002] # CUNEIFORM SIGN HI TIMES SHE -12136 ; [.4AEB.0020.0002] # CUNEIFORM SIGN HI TIMES U -12137 ; [.4AEC.0020.0002] # CUNEIFORM SIGN HU -12138 ; [.4AED.0020.0002] # CUNEIFORM SIGN HUB2 -12139 ; [.4AEE.0020.0002] # CUNEIFORM SIGN HUB2 TIMES AN -1213A ; [.4AEF.0020.0002] # CUNEIFORM SIGN HUB2 TIMES HAL -1213B ; [.4AF0.0020.0002] # CUNEIFORM SIGN HUB2 TIMES KASKAL -1213C ; [.4AF1.0020.0002] # CUNEIFORM SIGN HUB2 TIMES LISH -1213D ; [.4AF2.0020.0002] # CUNEIFORM SIGN HUB2 TIMES UD -1213E ; [.4AF3.0020.0002] # CUNEIFORM SIGN HUL2 -1213F ; [.4AF4.0020.0002] # CUNEIFORM SIGN I -12140 ; [.4AF5.0020.0002] # CUNEIFORM SIGN I A -12141 ; [.4AF6.0020.0002] # CUNEIFORM SIGN IB -12142 ; [.4AF7.0020.0002] # CUNEIFORM SIGN IDIM -12143 ; [.4AF8.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM BUR -12144 ; [.4AF9.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED -12145 ; [.4AFA.0020.0002] # CUNEIFORM SIGN IG -12146 ; [.4AFB.0020.0002] # CUNEIFORM SIGN IGI -12147 ; [.4AFC.0020.0002] # CUNEIFORM SIGN IGI DIB -12148 ; [.4AFD.0020.0002] # CUNEIFORM SIGN IGI RI -12149 ; [.4AFE.0020.0002] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD -1214A ; [.4AFF.0020.0002] # CUNEIFORM SIGN IGI GUNU -1214B ; [.4B00.0020.0002] # CUNEIFORM SIGN IL -1214C ; [.4B01.0020.0002] # CUNEIFORM SIGN IL TIMES GAN2 TENU -1214D ; [.4B02.0020.0002] # CUNEIFORM SIGN IL2 -1214E ; [.4B03.0020.0002] # CUNEIFORM SIGN IM -1214F ; [.4B04.0020.0002] # CUNEIFORM SIGN IM TIMES TAK4 -12150 ; [.4B05.0020.0002] # CUNEIFORM SIGN IM CROSSING IM -12151 ; [.4B06.0020.0002] # CUNEIFORM SIGN IM OPPOSING IM -12152 ; [.4B07.0020.0002] # CUNEIFORM SIGN IM SQUARED -12153 ; [.4B08.0020.0002] # CUNEIFORM SIGN IMIN -12154 ; [.4B09.0020.0002] # CUNEIFORM SIGN IN -12155 ; [.4B0A.0020.0002] # CUNEIFORM SIGN IR -12156 ; [.4B0B.0020.0002] # CUNEIFORM SIGN ISH -12157 ; [.4B0C.0020.0002] # CUNEIFORM SIGN KA -12158 ; [.4B0D.0020.0002] # CUNEIFORM SIGN KA TIMES A -12159 ; [.4B0E.0020.0002] # CUNEIFORM SIGN KA TIMES AD -1215A ; [.4B0F.0020.0002] # CUNEIFORM SIGN KA TIMES AD PLUS KU3 -1215B ; [.4B10.0020.0002] # CUNEIFORM SIGN KA TIMES ASH2 -1215C ; [.4B11.0020.0002] # CUNEIFORM SIGN KA TIMES BAD -1215D ; [.4B12.0020.0002] # CUNEIFORM SIGN KA TIMES BALAG -1215E ; [.4B13.0020.0002] # CUNEIFORM SIGN KA TIMES BAR -1215F ; [.4B14.0020.0002] # CUNEIFORM SIGN KA TIMES BI -12160 ; [.4B15.0020.0002] # CUNEIFORM SIGN KA TIMES ERIN2 -12161 ; [.4B16.0020.0002] # CUNEIFORM SIGN KA TIMES ESH2 -12162 ; [.4B17.0020.0002] # CUNEIFORM SIGN KA TIMES GA -12163 ; [.4B18.0020.0002] # CUNEIFORM SIGN KA TIMES GAL -12164 ; [.4B19.0020.0002] # CUNEIFORM SIGN KA TIMES GAN2 TENU -12165 ; [.4B1A.0020.0002] # CUNEIFORM SIGN KA TIMES GAR -12166 ; [.4B1B.0020.0002] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A -12167 ; [.4B1C.0020.0002] # CUNEIFORM SIGN KA TIMES GI -12168 ; [.4B1D.0020.0002] # CUNEIFORM SIGN KA TIMES GIR2 -12169 ; [.4B1E.0020.0002] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR -1216A ; [.4B1F.0020.0002] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH -1216B ; [.4B20.0020.0002] # CUNEIFORM SIGN KA TIMES GU -1216C ; [.4B21.0020.0002] # CUNEIFORM SIGN KA TIMES GUR7 -1216D ; [.4B22.0020.0002] # CUNEIFORM SIGN KA TIMES IGI -1216E ; [.4B23.0020.0002] # CUNEIFORM SIGN KA TIMES IM -1216F ; [.4B24.0020.0002] # CUNEIFORM SIGN KA TIMES KAK -12170 ; [.4B25.0020.0002] # CUNEIFORM SIGN KA TIMES KI -12171 ; [.4B26.0020.0002] # CUNEIFORM SIGN KA TIMES KID -12172 ; [.4B27.0020.0002] # CUNEIFORM SIGN KA TIMES LI -12173 ; [.4B28.0020.0002] # CUNEIFORM SIGN KA TIMES LU -12174 ; [.4B29.0020.0002] # CUNEIFORM SIGN KA TIMES ME -12175 ; [.4B2A.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS DU -12176 ; [.4B2B.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS GI -12177 ; [.4B2C.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS TE -12178 ; [.4B2D.0020.0002] # CUNEIFORM SIGN KA TIMES MI -12179 ; [.4B2E.0020.0002] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ -1217A ; [.4B2F.0020.0002] # CUNEIFORM SIGN KA TIMES NE -1217B ; [.4B30.0020.0002] # CUNEIFORM SIGN KA TIMES NUN -1217C ; [.4B31.0020.0002] # CUNEIFORM SIGN KA TIMES PI -1217D ; [.4B32.0020.0002] # CUNEIFORM SIGN KA TIMES RU -1217E ; [.4B33.0020.0002] # CUNEIFORM SIGN KA TIMES SA -1217F ; [.4B34.0020.0002] # CUNEIFORM SIGN KA TIMES SAR -12180 ; [.4B35.0020.0002] # CUNEIFORM SIGN KA TIMES SHA -12181 ; [.4B36.0020.0002] # CUNEIFORM SIGN KA TIMES SHE -12182 ; [.4B37.0020.0002] # CUNEIFORM SIGN KA TIMES SHID -12183 ; [.4B38.0020.0002] # CUNEIFORM SIGN KA TIMES SHU -12184 ; [.4B39.0020.0002] # CUNEIFORM SIGN KA TIMES SIG -12185 ; [.4B3A.0020.0002] # CUNEIFORM SIGN KA TIMES SUHUR -12186 ; [.4B3B.0020.0002] # CUNEIFORM SIGN KA TIMES TAR -12187 ; [.4B3C.0020.0002] # CUNEIFORM SIGN KA TIMES U -12188 ; [.4B3D.0020.0002] # CUNEIFORM SIGN KA TIMES U2 -12189 ; [.4B3E.0020.0002] # CUNEIFORM SIGN KA TIMES UD -1218A ; [.4B3F.0020.0002] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA -1218B ; [.4B40.0020.0002] # CUNEIFORM SIGN KA TIMES USH -1218C ; [.4B41.0020.0002] # CUNEIFORM SIGN KA TIMES ZI -1218D ; [.4B42.0020.0002] # CUNEIFORM SIGN KA2 -1218E ; [.4B43.0020.0002] # CUNEIFORM SIGN KA2 CROSSING KA2 -1218F ; [.4B44.0020.0002] # CUNEIFORM SIGN KAB -12190 ; [.4B45.0020.0002] # CUNEIFORM SIGN KAD2 -12191 ; [.4B46.0020.0002] # CUNEIFORM SIGN KAD3 -12192 ; [.4B47.0020.0002] # CUNEIFORM SIGN KAD4 -12193 ; [.4B48.0020.0002] # CUNEIFORM SIGN KAD5 -12194 ; [.4B49.0020.0002] # CUNEIFORM SIGN KAD5 OVER KAD5 -12195 ; [.4B4A.0020.0002] # CUNEIFORM SIGN KAK -12196 ; [.4B4B.0020.0002] # CUNEIFORM SIGN KAK TIMES IGI GUNU -12197 ; [.4B4C.0020.0002] # CUNEIFORM SIGN KAL -12198 ; [.4B4D.0020.0002] # CUNEIFORM SIGN KAL TIMES BAD -12199 ; [.4B4E.0020.0002] # CUNEIFORM SIGN KAL CROSSING KAL -1219A ; [.4B4F.0020.0002] # CUNEIFORM SIGN KAM2 -1219B ; [.4B50.0020.0002] # CUNEIFORM SIGN KAM4 -1219C ; [.4B51.0020.0002] # CUNEIFORM SIGN KASKAL -1219D ; [.4B52.0020.0002] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U -1219E ; [.4B53.0020.0002] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U -1219F ; [.4B54.0020.0002] # CUNEIFORM SIGN KESH2 -121A0 ; [.4B55.0020.0002] # CUNEIFORM SIGN KI -121A1 ; [.4B56.0020.0002] # CUNEIFORM SIGN KI TIMES BAD -121A2 ; [.4B57.0020.0002] # CUNEIFORM SIGN KI TIMES U -121A3 ; [.4B58.0020.0002] # CUNEIFORM SIGN KI TIMES UD -121A4 ; [.4B59.0020.0002] # CUNEIFORM SIGN KID -121A5 ; [.4B5A.0020.0002] # CUNEIFORM SIGN KIN -121A6 ; [.4B5B.0020.0002] # CUNEIFORM SIGN KISAL -121A7 ; [.4B5C.0020.0002] # CUNEIFORM SIGN KISH -121A8 ; [.4B5D.0020.0002] # CUNEIFORM SIGN KISIM5 -121A9 ; [.4B5E.0020.0002] # CUNEIFORM SIGN KISIM5 OVER KISIM5 -121AA ; [.4B5F.0020.0002] # CUNEIFORM SIGN KU -121AB ; [.4B60.0020.0002] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2 -121AC ; [.4B61.0020.0002] # CUNEIFORM SIGN KU3 -121AD ; [.4B62.0020.0002] # CUNEIFORM SIGN KU4 -121AE ; [.4B63.0020.0002] # CUNEIFORM SIGN KU4 VARIANT FORM -121AF ; [.4B64.0020.0002] # CUNEIFORM SIGN KU7 -121B0 ; [.4B65.0020.0002] # CUNEIFORM SIGN KUL -121B1 ; [.4B66.0020.0002] # CUNEIFORM SIGN KUL GUNU -121B2 ; [.4B67.0020.0002] # CUNEIFORM SIGN KUN -121B3 ; [.4B68.0020.0002] # CUNEIFORM SIGN KUR -121B4 ; [.4B69.0020.0002] # CUNEIFORM SIGN KUR OPPOSING KUR -121B5 ; [.4B6A.0020.0002] # CUNEIFORM SIGN KUSHU2 -121B6 ; [.4B6B.0020.0002] # CUNEIFORM SIGN KWU318 -121B7 ; [.4B6C.0020.0002] # CUNEIFORM SIGN LA -121B8 ; [.4B6D.0020.0002] # CUNEIFORM SIGN LAGAB -121B9 ; [.4B6E.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A -121BA ; [.4B6F.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA -121BB ; [.4B70.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR -121BC ; [.4B71.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL -121BD ; [.4B72.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AL -121BE ; [.4B73.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AN -121BF ; [.4B74.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU -121C0 ; [.4B75.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BAD -121C1 ; [.4B76.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BI -121C2 ; [.4B77.0020.0002] # CUNEIFORM SIGN LAGAB TIMES DAR -121C3 ; [.4B78.0020.0002] # CUNEIFORM SIGN LAGAB TIMES EN -121C4 ; [.4B79.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GA -121C5 ; [.4B7A.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GAR -121C6 ; [.4B7B.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD -121C7 ; [.4B7C.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD -121C8 ; [.4B7D.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HA -121C9 ; [.4B7E.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HAL -121CA ; [.4B7F.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN -121CB ; [.4B80.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU -121CC ; [.4B81.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM -121CD ; [.4B82.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA -121CE ; [.4B83.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU -121CF ; [.4B84.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KI -121D0 ; [.4B85.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KIN -121D1 ; [.4B86.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KU3 -121D2 ; [.4B87.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL -121D3 ; [.4B88.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A -121D4 ; [.4B89.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LAGAB -121D5 ; [.4B8A.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LISH -121D6 ; [.4B8B.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LU -121D7 ; [.4B8C.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LUL -121D8 ; [.4B8D.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME -121D9 ; [.4B8E.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN -121DA ; [.4B8F.0020.0002] # CUNEIFORM SIGN LAGAB TIMES MUSH -121DB ; [.4B90.0020.0002] # CUNEIFORM SIGN LAGAB TIMES NE -121DC ; [.4B91.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM -121DD ; [.4B92.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2 -121DE ; [.4B93.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU -121DF ; [.4B94.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 -121E0 ; [.4B95.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2 -121E1 ; [.4B96.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SUM -121E2 ; [.4B97.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAG -121E3 ; [.4B98.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAK4 -121E4 ; [.4B99.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA -121E5 ; [.4B9A.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U -121E6 ; [.4B9B.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS A -121E7 ; [.4B9C.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U -121E8 ; [.4B9D.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH -121E9 ; [.4B9E.0020.0002] # CUNEIFORM SIGN LAGAB TIMES UD -121EA ; [.4B9F.0020.0002] # CUNEIFORM SIGN LAGAB TIMES USH -121EB ; [.4BA0.0020.0002] # CUNEIFORM SIGN LAGAB SQUARED -121EC ; [.4BA1.0020.0002] # CUNEIFORM SIGN LAGAR -121ED ; [.4BA2.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE -121EE ; [.4BA3.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM -121EF ; [.4BA4.0020.0002] # CUNEIFORM SIGN LAGAR GUNU -121F0 ; [.4BA5.0020.0002] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE -121F1 ; [.4BA6.0020.0002] # CUNEIFORM SIGN LAHSHU -121F2 ; [.4BA7.0020.0002] # CUNEIFORM SIGN LAL -121F3 ; [.4BA8.0020.0002] # CUNEIFORM SIGN LAL TIMES LAL -121F4 ; [.4BA9.0020.0002] # CUNEIFORM SIGN LAM -121F5 ; [.4BAA.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR -121F6 ; [.4BAB.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU -121F7 ; [.4BAC.0020.0002] # CUNEIFORM SIGN LI -121F8 ; [.4BAD.0020.0002] # CUNEIFORM SIGN LIL -121F9 ; [.4BAE.0020.0002] # CUNEIFORM SIGN LIMMU2 -121FA ; [.4BAF.0020.0002] # CUNEIFORM SIGN LISH -121FB ; [.4BB0.0020.0002] # CUNEIFORM SIGN LU -121FC ; [.4BB1.0020.0002] # CUNEIFORM SIGN LU TIMES BAD -121FD ; [.4BB2.0020.0002] # CUNEIFORM SIGN LU2 -121FE ; [.4BB3.0020.0002] # CUNEIFORM SIGN LU2 TIMES AL -121FF ; [.4BB4.0020.0002] # CUNEIFORM SIGN LU2 TIMES BAD -12200 ; [.4BB5.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 -12201 ; [.4BB6.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU -12202 ; [.4BB7.0020.0002] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU -12203 ; [.4BB8.0020.0002] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD -12204 ; [.4BB9.0020.0002] # CUNEIFORM SIGN LU2 TIMES IM -12205 ; [.4BBA.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD2 -12206 ; [.4BBB.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 -12207 ; [.4BBC.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH -12208 ; [.4BBD.0020.0002] # CUNEIFORM SIGN LU2 TIMES KI -12209 ; [.4BBE.0020.0002] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH -1220A ; [.4BBF.0020.0002] # CUNEIFORM SIGN LU2 TIMES LAGAB -1220B ; [.4BC0.0020.0002] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN -1220C ; [.4BC1.0020.0002] # CUNEIFORM SIGN LU2 TIMES NE -1220D ; [.4BC2.0020.0002] # CUNEIFORM SIGN LU2 TIMES NU -1220E ; [.4BC3.0020.0002] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH -1220F ; [.4BC4.0020.0002] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU -12210 ; [.4BC5.0020.0002] # CUNEIFORM SIGN LU2 TIMES TUG2 -12211 ; [.4BC6.0020.0002] # CUNEIFORM SIGN LU2 TENU -12212 ; [.4BC7.0020.0002] # CUNEIFORM SIGN LU2 CROSSING LU2 -12213 ; [.4BC8.0020.0002] # CUNEIFORM SIGN LU2 OPPOSING LU2 -12214 ; [.4BC9.0020.0002] # CUNEIFORM SIGN LU2 SQUARED -12215 ; [.4BCA.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG -12216 ; [.4BCB.0020.0002] # CUNEIFORM SIGN LU3 -12217 ; [.4BCC.0020.0002] # CUNEIFORM SIGN LUGAL -12218 ; [.4BCD.0020.0002] # CUNEIFORM SIGN LUGAL OVER LUGAL -12219 ; [.4BCE.0020.0002] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL -1221A ; [.4BCF.0020.0002] # CUNEIFORM SIGN LUGAL SHESHIG -1221B ; [.4BD0.0020.0002] # CUNEIFORM SIGN LUH -1221C ; [.4BD1.0020.0002] # CUNEIFORM SIGN LUL -1221D ; [.4BD2.0020.0002] # CUNEIFORM SIGN LUM -1221E ; [.4BD3.0020.0002] # CUNEIFORM SIGN LUM OVER LUM -1221F ; [.4BD4.0020.0002] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR -12220 ; [.4BD5.0020.0002] # CUNEIFORM SIGN MA -12221 ; [.4BD6.0020.0002] # CUNEIFORM SIGN MA TIMES TAK4 -12222 ; [.4BD7.0020.0002] # CUNEIFORM SIGN MA GUNU -12223 ; [.4BD8.0020.0002] # CUNEIFORM SIGN MA2 -12224 ; [.4BD9.0020.0002] # CUNEIFORM SIGN MAH -12225 ; [.4BDA.0020.0002] # CUNEIFORM SIGN MAR -12226 ; [.4BDB.0020.0002] # CUNEIFORM SIGN MASH -12227 ; [.4BDC.0020.0002] # CUNEIFORM SIGN MASH2 -12228 ; [.4BDD.0020.0002] # CUNEIFORM SIGN ME -12229 ; [.4BDE.0020.0002] # CUNEIFORM SIGN MES -1222A ; [.4BDF.0020.0002] # CUNEIFORM SIGN MI -1222B ; [.4BE0.0020.0002] # CUNEIFORM SIGN MIN -1222C ; [.4BE1.0020.0002] # CUNEIFORM SIGN MU -1222D ; [.4BE2.0020.0002] # CUNEIFORM SIGN MU OVER MU -1222E ; [.4BE3.0020.0002] # CUNEIFORM SIGN MUG -1222F ; [.4BE4.0020.0002] # CUNEIFORM SIGN MUG GUNU -12230 ; [.4BE5.0020.0002] # CUNEIFORM SIGN MUNSUB -12231 ; [.4BE6.0020.0002] # CUNEIFORM SIGN MURGU2 -12232 ; [.4BE7.0020.0002] # CUNEIFORM SIGN MUSH -12233 ; [.4BE8.0020.0002] # CUNEIFORM SIGN MUSH TIMES A -12234 ; [.4BE9.0020.0002] # CUNEIFORM SIGN MUSH TIMES KUR -12235 ; [.4BEA.0020.0002] # CUNEIFORM SIGN MUSH TIMES ZA -12236 ; [.4BEB.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH -12237 ; [.4BEC.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA -12238 ; [.4BED.0020.0002] # CUNEIFORM SIGN MUSH CROSSING MUSH -12239 ; [.4BEE.0020.0002] # CUNEIFORM SIGN MUSH3 -1223A ; [.4BEF.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A -1223B ; [.4BF0.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI -1223C ; [.4BF1.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES DI -1223D ; [.4BF2.0020.0002] # CUNEIFORM SIGN MUSH3 GUNU -1223E ; [.4BF3.0020.0002] # CUNEIFORM SIGN NA -1223F ; [.4BF4.0020.0002] # CUNEIFORM SIGN NA2 -12240 ; [.4BF5.0020.0002] # CUNEIFORM SIGN NAGA -12241 ; [.4BF6.0020.0002] # CUNEIFORM SIGN NAGA INVERTED -12242 ; [.4BF7.0020.0002] # CUNEIFORM SIGN NAGA TIMES SHU TENU -12243 ; [.4BF8.0020.0002] # CUNEIFORM SIGN NAGA OPPOSING NAGA -12244 ; [.4BF9.0020.0002] # CUNEIFORM SIGN NAGAR -12245 ; [.4BFA.0020.0002] # CUNEIFORM SIGN NAM NUTILLU -12246 ; [.4BFB.0020.0002] # CUNEIFORM SIGN NAM -12247 ; [.4BFC.0020.0002] # CUNEIFORM SIGN NAM2 -12248 ; [.4BFD.0020.0002] # CUNEIFORM SIGN NE -12249 ; [.4BFE.0020.0002] # CUNEIFORM SIGN NE TIMES A -1224A ; [.4BFF.0020.0002] # CUNEIFORM SIGN NE TIMES UD -1224B ; [.4C00.0020.0002] # CUNEIFORM SIGN NE SHESHIG -1224C ; [.4C01.0020.0002] # CUNEIFORM SIGN NI -1224D ; [.4C02.0020.0002] # CUNEIFORM SIGN NI TIMES E -1224E ; [.4C03.0020.0002] # CUNEIFORM SIGN NI2 -1224F ; [.4C04.0020.0002] # CUNEIFORM SIGN NIM -12250 ; [.4C05.0020.0002] # CUNEIFORM SIGN NIM TIMES GAN2 TENU -12251 ; [.4C06.0020.0002] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU -12252 ; [.4C07.0020.0002] # CUNEIFORM SIGN NINDA2 -12253 ; [.4C08.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES AN -12254 ; [.4C09.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH -12255 ; [.4C0A.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH -12256 ; [.4C0B.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUD -12257 ; [.4C0C.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU -12258 ; [.4C0D.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NE -12259 ; [.4C0E.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NUN -1225A ; [.4C0F.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE -1225B ; [.4C10.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN -1225C ; [.4C11.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH -1225D ; [.4C12.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH -1225E ; [.4C13.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH -1225F ; [.4C14.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES USH -12260 ; [.4C15.0020.0002] # CUNEIFORM SIGN NISAG -12261 ; [.4C16.0020.0002] # CUNEIFORM SIGN NU -12262 ; [.4C17.0020.0002] # CUNEIFORM SIGN NU11 -122D4 ; [.4C18.0020.0002] # CUNEIFORM SIGN SHIR TENU -122D5 ; [.4C19.0020.0002] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR -12263 ; [.4C1A.0020.0002] # CUNEIFORM SIGN NUN -12264 ; [.4C1B.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES GAR -12265 ; [.4C1C.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES MASH -12266 ; [.4C1D.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL -12267 ; [.4C1E.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL -12268 ; [.4C1F.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES USH -12269 ; [.4C20.0020.0002] # CUNEIFORM SIGN NUN TENU -1226A ; [.4C21.0020.0002] # CUNEIFORM SIGN NUN OVER NUN -1226B ; [.4C22.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN -1226C ; [.4C23.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR -1226D ; [.4C24.0020.0002] # CUNEIFORM SIGN NUNUZ -1226E ; [.4C25.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB -1226F ; [.4C26.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI -12270 ; [.4C27.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG -12271 ; [.4C28.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD -12272 ; [.4C29.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU -12273 ; [.4C2A.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3 -12274 ; [.4C2B.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA -12275 ; [.4C2C.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE -12276 ; [.4C2D.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3 -12277 ; [.4C2E.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2 -12278 ; [.4C2F.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI -12279 ; [.4C30.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U -1227A ; [.4C31.0020.0002] # CUNEIFORM SIGN PA -1227B ; [.4C32.0020.0002] # CUNEIFORM SIGN PAD -1227C ; [.4C33.0020.0002] # CUNEIFORM SIGN PAN -1227D ; [.4C34.0020.0002] # CUNEIFORM SIGN PAP -1227E ; [.4C35.0020.0002] # CUNEIFORM SIGN PESH2 -1227F ; [.4C36.0020.0002] # CUNEIFORM SIGN PI -12280 ; [.4C37.0020.0002] # CUNEIFORM SIGN PI TIMES A -12281 ; [.4C38.0020.0002] # CUNEIFORM SIGN PI TIMES AB -12282 ; [.4C39.0020.0002] # CUNEIFORM SIGN PI TIMES BI -12283 ; [.4C3A.0020.0002] # CUNEIFORM SIGN PI TIMES BU -12284 ; [.4C3B.0020.0002] # CUNEIFORM SIGN PI TIMES E -12285 ; [.4C3C.0020.0002] # CUNEIFORM SIGN PI TIMES I -12286 ; [.4C3D.0020.0002] # CUNEIFORM SIGN PI TIMES IB -12287 ; [.4C3E.0020.0002] # CUNEIFORM SIGN PI TIMES U -12288 ; [.4C3F.0020.0002] # CUNEIFORM SIGN PI TIMES U2 -12289 ; [.4C40.0020.0002] # CUNEIFORM SIGN PI CROSSING PI -1228A ; [.4C41.0020.0002] # CUNEIFORM SIGN PIRIG -1228B ; [.4C42.0020.0002] # CUNEIFORM SIGN PIRIG TIMES KAL -1228C ; [.4C43.0020.0002] # CUNEIFORM SIGN PIRIG TIMES UD -1228D ; [.4C44.0020.0002] # CUNEIFORM SIGN PIRIG TIMES ZA -1228E ; [.4C45.0020.0002] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG -1228F ; [.4C46.0020.0002] # CUNEIFORM SIGN RA -12290 ; [.4C47.0020.0002] # CUNEIFORM SIGN RAB -12291 ; [.4C48.0020.0002] # CUNEIFORM SIGN RI -12292 ; [.4C49.0020.0002] # CUNEIFORM SIGN RU -12293 ; [.4C4A.0020.0002] # CUNEIFORM SIGN SA -12294 ; [.4C4B.0020.0002] # CUNEIFORM SIGN SAG NUTILLU -12295 ; [.4C4C.0020.0002] # CUNEIFORM SIGN SAG -12296 ; [.4C4D.0020.0002] # CUNEIFORM SIGN SAG TIMES A -12297 ; [.4C4E.0020.0002] # CUNEIFORM SIGN SAG TIMES DU -12298 ; [.4C4F.0020.0002] # CUNEIFORM SIGN SAG TIMES DUB -12299 ; [.4C50.0020.0002] # CUNEIFORM SIGN SAG TIMES HA -1229A ; [.4C51.0020.0002] # CUNEIFORM SIGN SAG TIMES KAK -1229B ; [.4C52.0020.0002] # CUNEIFORM SIGN SAG TIMES KUR -1229C ; [.4C53.0020.0002] # CUNEIFORM SIGN SAG TIMES LUM -1229D ; [.4C54.0020.0002] # CUNEIFORM SIGN SAG TIMES MI -1229E ; [.4C55.0020.0002] # CUNEIFORM SIGN SAG TIMES NUN -1229F ; [.4C56.0020.0002] # CUNEIFORM SIGN SAG TIMES SAL -122A0 ; [.4C57.0020.0002] # CUNEIFORM SIGN SAG TIMES SHID -122A1 ; [.4C58.0020.0002] # CUNEIFORM SIGN SAG TIMES TAB -122A2 ; [.4C59.0020.0002] # CUNEIFORM SIGN SAG TIMES U2 -122A3 ; [.4C5A.0020.0002] # CUNEIFORM SIGN SAG TIMES UB -122A4 ; [.4C5B.0020.0002] # CUNEIFORM SIGN SAG TIMES UM -122A5 ; [.4C5C.0020.0002] # CUNEIFORM SIGN SAG TIMES UR -122A6 ; [.4C5D.0020.0002] # CUNEIFORM SIGN SAG TIMES USH -122A7 ; [.4C5E.0020.0002] # CUNEIFORM SIGN SAG OVER SAG -122A8 ; [.4C5F.0020.0002] # CUNEIFORM SIGN SAG GUNU -122A9 ; [.4C60.0020.0002] # CUNEIFORM SIGN SAL -122AA ; [.4C61.0020.0002] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2 -122AB ; [.4C62.0020.0002] # CUNEIFORM SIGN SANGA2 -122AC ; [.4C63.0020.0002] # CUNEIFORM SIGN SAR -122AD ; [.4C64.0020.0002] # CUNEIFORM SIGN SHA -122AE ; [.4C65.0020.0002] # CUNEIFORM SIGN SHA3 -122AF ; [.4C66.0020.0002] # CUNEIFORM SIGN SHA3 TIMES A -122B0 ; [.4C67.0020.0002] # CUNEIFORM SIGN SHA3 TIMES BAD -122B1 ; [.4C68.0020.0002] # CUNEIFORM SIGN SHA3 TIMES GISH -122B2 ; [.4C69.0020.0002] # CUNEIFORM SIGN SHA3 TIMES NE -122B3 ; [.4C6A.0020.0002] # CUNEIFORM SIGN SHA3 TIMES SHU2 -122B4 ; [.4C6B.0020.0002] # CUNEIFORM SIGN SHA3 TIMES TUR -122B5 ; [.4C6C.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U -122B6 ; [.4C6D.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U PLUS A -122B7 ; [.4C6E.0020.0002] # CUNEIFORM SIGN SHA6 -122B8 ; [.4C6F.0020.0002] # CUNEIFORM SIGN SHAB6 -122B9 ; [.4C70.0020.0002] # CUNEIFORM SIGN SHAR2 -122BA ; [.4C71.0020.0002] # CUNEIFORM SIGN SHE -122BB ; [.4C72.0020.0002] # CUNEIFORM SIGN SHE HU -122BC ; [.4C73.0020.0002] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR -122BD ; [.4C74.0020.0002] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR -122BE ; [.4C75.0020.0002] # CUNEIFORM SIGN SHEG9 -122BF ; [.4C76.0020.0002] # CUNEIFORM SIGN SHEN -122C0 ; [.4C77.0020.0002] # CUNEIFORM SIGN SHESH -122C1 ; [.4C78.0020.0002] # CUNEIFORM SIGN SHESH2 -122C2 ; [.4C79.0020.0002] # CUNEIFORM SIGN SHESHLAM -122C3 ; [.4C7A.0020.0002] # CUNEIFORM SIGN SHID -122C4 ; [.4C7B.0020.0002] # CUNEIFORM SIGN SHID TIMES A -122C5 ; [.4C7C.0020.0002] # CUNEIFORM SIGN SHID TIMES IM -122C6 ; [.4C7D.0020.0002] # CUNEIFORM SIGN SHIM -122C7 ; [.4C7E.0020.0002] # CUNEIFORM SIGN SHIM TIMES A -122C8 ; [.4C7F.0020.0002] # CUNEIFORM SIGN SHIM TIMES BAL -122C9 ; [.4C80.0020.0002] # CUNEIFORM SIGN SHIM TIMES BULUG -122CA ; [.4C81.0020.0002] # CUNEIFORM SIGN SHIM TIMES DIN -122CB ; [.4C82.0020.0002] # CUNEIFORM SIGN SHIM TIMES GAR -122CC ; [.4C83.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI -122CD ; [.4C84.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI GUNU -122CE ; [.4C85.0020.0002] # CUNEIFORM SIGN SHIM TIMES KUSHU2 -122CF ; [.4C86.0020.0002] # CUNEIFORM SIGN SHIM TIMES LUL -122D0 ; [.4C87.0020.0002] # CUNEIFORM SIGN SHIM TIMES MUG -122D1 ; [.4C88.0020.0002] # CUNEIFORM SIGN SHIM TIMES SAL -122D2 ; [.4C89.0020.0002] # CUNEIFORM SIGN SHINIG -122D3 ; [.4C8A.0020.0002] # CUNEIFORM SIGN SHIR -122D6 ; [.4C8B.0020.0002] # CUNEIFORM SIGN SHITA -122D7 ; [.4C8C.0020.0002] # CUNEIFORM SIGN SHU -122D8 ; [.4C8D.0020.0002] # CUNEIFORM SIGN SHU OVER INVERTED SHU -122D9 ; [.4C8E.0020.0002] # CUNEIFORM SIGN SHU2 -122DA ; [.4C8F.0020.0002] # CUNEIFORM SIGN SHUBUR -122DB ; [.4C90.0020.0002] # CUNEIFORM SIGN SI -122DC ; [.4C91.0020.0002] # CUNEIFORM SIGN SI GUNU -122DD ; [.4C92.0020.0002] # CUNEIFORM SIGN SIG -122DE ; [.4C93.0020.0002] # CUNEIFORM SIGN SIG4 -122DF ; [.4C94.0020.0002] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2 -122E0 ; [.4C95.0020.0002] # CUNEIFORM SIGN SIK2 -122E1 ; [.4C96.0020.0002] # CUNEIFORM SIGN SILA3 -122E2 ; [.4C97.0020.0002] # CUNEIFORM SIGN SU -122E3 ; [.4C98.0020.0002] # CUNEIFORM SIGN SU OVER SU -122E4 ; [.4C99.0020.0002] # CUNEIFORM SIGN SUD -122E5 ; [.4C9A.0020.0002] # CUNEIFORM SIGN SUD2 -122E6 ; [.4C9B.0020.0002] # CUNEIFORM SIGN SUHUR -122E7 ; [.4C9C.0020.0002] # CUNEIFORM SIGN SUM -122E8 ; [.4C9D.0020.0002] # CUNEIFORM SIGN SUMASH -122E9 ; [.4C9E.0020.0002] # CUNEIFORM SIGN SUR -122EA ; [.4C9F.0020.0002] # CUNEIFORM SIGN SUR9 -122EB ; [.4CA0.0020.0002] # CUNEIFORM SIGN TA -122EC ; [.4CA1.0020.0002] # CUNEIFORM SIGN TA ASTERISK -122ED ; [.4CA2.0020.0002] # CUNEIFORM SIGN TA TIMES HI -122EE ; [.4CA3.0020.0002] # CUNEIFORM SIGN TA TIMES MI -122EF ; [.4CA4.0020.0002] # CUNEIFORM SIGN TA GUNU -122F0 ; [.4CA5.0020.0002] # CUNEIFORM SIGN TAB -122F1 ; [.4CA6.0020.0002] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH -122F2 ; [.4CA7.0020.0002] # CUNEIFORM SIGN TAB SQUARED -122F3 ; [.4CA8.0020.0002] # CUNEIFORM SIGN TAG -122F4 ; [.4CA9.0020.0002] # CUNEIFORM SIGN TAG TIMES BI -122F5 ; [.4CAA.0020.0002] # CUNEIFORM SIGN TAG TIMES GUD -122F6 ; [.4CAB.0020.0002] # CUNEIFORM SIGN TAG TIMES SHE -122F7 ; [.4CAC.0020.0002] # CUNEIFORM SIGN TAG TIMES SHU -122F8 ; [.4CAD.0020.0002] # CUNEIFORM SIGN TAG TIMES TUG2 -122F9 ; [.4CAE.0020.0002] # CUNEIFORM SIGN TAG TIMES UD -122FA ; [.4CAF.0020.0002] # CUNEIFORM SIGN TAK4 -122FB ; [.4CB0.0020.0002] # CUNEIFORM SIGN TAR -122FC ; [.4CB1.0020.0002] # CUNEIFORM SIGN TE -122FD ; [.4CB2.0020.0002] # CUNEIFORM SIGN TE GUNU -122FE ; [.4CB3.0020.0002] # CUNEIFORM SIGN TI -122FF ; [.4CB4.0020.0002] # CUNEIFORM SIGN TI TENU -12300 ; [.4CB5.0020.0002] # CUNEIFORM SIGN TIL -12301 ; [.4CB6.0020.0002] # CUNEIFORM SIGN TIR -12302 ; [.4CB7.0020.0002] # CUNEIFORM SIGN TIR TIMES TAK4 -12303 ; [.4CB8.0020.0002] # CUNEIFORM SIGN TIR OVER TIR -12304 ; [.4CB9.0020.0002] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR -12305 ; [.4CBA.0020.0002] # CUNEIFORM SIGN TU -12306 ; [.4CBB.0020.0002] # CUNEIFORM SIGN TUG2 -12307 ; [.4CBC.0020.0002] # CUNEIFORM SIGN TUK -12308 ; [.4CBD.0020.0002] # CUNEIFORM SIGN TUM -12309 ; [.4CBE.0020.0002] # CUNEIFORM SIGN TUR -1230A ; [.4CBF.0020.0002] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA -1230B ; [.4CC0.0020.0002] # CUNEIFORM SIGN U -1230C ; [.4CC1.0020.0002] # CUNEIFORM SIGN U GUD -1230D ; [.4CC2.0020.0002] # CUNEIFORM SIGN U U U -1230E ; [.4CC3.0020.0002] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR -1230F ; [.4CC4.0020.0002] # CUNEIFORM SIGN U OVER U SUR OVER SUR -12310 ; [.4CC5.0020.0002] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED -12311 ; [.4CC6.0020.0002] # CUNEIFORM SIGN U2 -12312 ; [.4CC7.0020.0002] # CUNEIFORM SIGN UB -12313 ; [.4CC8.0020.0002] # CUNEIFORM SIGN UD -12314 ; [.4CC9.0020.0002] # CUNEIFORM SIGN UD KUSHU2 -12315 ; [.4CCA.0020.0002] # CUNEIFORM SIGN UD TIMES BAD -12316 ; [.4CCB.0020.0002] # CUNEIFORM SIGN UD TIMES MI -12317 ; [.4CCC.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U -12318 ; [.4CCD.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU -12319 ; [.4CCE.0020.0002] # CUNEIFORM SIGN UD GUNU -1231A ; [.4CCF.0020.0002] # CUNEIFORM SIGN UD SHESHIG -1231B ; [.4CD0.0020.0002] # CUNEIFORM SIGN UD SHESHIG TIMES BAD -1231C ; [.4CD1.0020.0002] # CUNEIFORM SIGN UDUG -1231D ; [.4CD2.0020.0002] # CUNEIFORM SIGN UM -1231E ; [.4CD3.0020.0002] # CUNEIFORM SIGN UM TIMES LAGAB -1231F ; [.4CD4.0020.0002] # CUNEIFORM SIGN UM TIMES ME PLUS DA -12320 ; [.4CD5.0020.0002] # CUNEIFORM SIGN UM TIMES SHA3 -12321 ; [.4CD6.0020.0002] # CUNEIFORM SIGN UM TIMES U -12322 ; [.4CD7.0020.0002] # CUNEIFORM SIGN UMBIN -12323 ; [.4CD8.0020.0002] # CUNEIFORM SIGN UMUM -12324 ; [.4CD9.0020.0002] # CUNEIFORM SIGN UMUM TIMES KASKAL -12325 ; [.4CDA.0020.0002] # CUNEIFORM SIGN UMUM TIMES PA -12326 ; [.4CDB.0020.0002] # CUNEIFORM SIGN UN -12327 ; [.4CDC.0020.0002] # CUNEIFORM SIGN UN GUNU -12328 ; [.4CDD.0020.0002] # CUNEIFORM SIGN UR -12329 ; [.4CDE.0020.0002] # CUNEIFORM SIGN UR CROSSING UR -1232A ; [.4CDF.0020.0002] # CUNEIFORM SIGN UR SHESHIG -1232B ; [.4CE0.0020.0002] # CUNEIFORM SIGN UR2 -1232C ; [.4CE1.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS HA -1232D ; [.4CE2.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS NA -1232E ; [.4CE3.0020.0002] # CUNEIFORM SIGN UR2 TIMES AL -1232F ; [.4CE4.0020.0002] # CUNEIFORM SIGN UR2 TIMES HA -12330 ; [.4CE5.0020.0002] # CUNEIFORM SIGN UR2 TIMES NUN -12331 ; [.4CE6.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 -12332 ; [.4CE7.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH -12333 ; [.4CE8.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI -12334 ; [.4CE9.0020.0002] # CUNEIFORM SIGN UR4 -12335 ; [.4CEA.0020.0002] # CUNEIFORM SIGN URI -12336 ; [.4CEB.0020.0002] # CUNEIFORM SIGN URI3 -12337 ; [.4CEC.0020.0002] # CUNEIFORM SIGN URU -12338 ; [.4CED.0020.0002] # CUNEIFORM SIGN URU TIMES A -12339 ; [.4CEE.0020.0002] # CUNEIFORM SIGN URU TIMES ASHGAB -1233A ; [.4CEF.0020.0002] # CUNEIFORM SIGN URU TIMES BAR -1233B ; [.4CF0.0020.0002] # CUNEIFORM SIGN URU TIMES DUN -1233C ; [.4CF1.0020.0002] # CUNEIFORM SIGN URU TIMES GA -1233D ; [.4CF2.0020.0002] # CUNEIFORM SIGN URU TIMES GAL -1233E ; [.4CF3.0020.0002] # CUNEIFORM SIGN URU TIMES GAN2 TENU -1233F ; [.4CF4.0020.0002] # CUNEIFORM SIGN URU TIMES GAR -12340 ; [.4CF5.0020.0002] # CUNEIFORM SIGN URU TIMES GU -12341 ; [.4CF6.0020.0002] # CUNEIFORM SIGN URU TIMES HA -12342 ; [.4CF7.0020.0002] # CUNEIFORM SIGN URU TIMES IGI -12343 ; [.4CF8.0020.0002] # CUNEIFORM SIGN URU TIMES IM -12344 ; [.4CF9.0020.0002] # CUNEIFORM SIGN URU TIMES ISH -12345 ; [.4CFA.0020.0002] # CUNEIFORM SIGN URU TIMES KI -12346 ; [.4CFB.0020.0002] # CUNEIFORM SIGN URU TIMES LUM -12347 ; [.4CFC.0020.0002] # CUNEIFORM SIGN URU TIMES MIN -12348 ; [.4CFD.0020.0002] # CUNEIFORM SIGN URU TIMES PA -12349 ; [.4CFE.0020.0002] # CUNEIFORM SIGN URU TIMES SHE -1234A ; [.4CFF.0020.0002] # CUNEIFORM SIGN URU TIMES SIG4 -1234B ; [.4D00.0020.0002] # CUNEIFORM SIGN URU TIMES TU -1234C ; [.4D01.0020.0002] # CUNEIFORM SIGN URU TIMES U PLUS GUD -1234D ; [.4D02.0020.0002] # CUNEIFORM SIGN URU TIMES UD -1234E ; [.4D03.0020.0002] # CUNEIFORM SIGN URU TIMES URUDA -1234F ; [.4D04.0020.0002] # CUNEIFORM SIGN URUDA -12350 ; [.4D05.0020.0002] # CUNEIFORM SIGN URUDA TIMES U -12351 ; [.4D06.0020.0002] # CUNEIFORM SIGN USH -12352 ; [.4D07.0020.0002] # CUNEIFORM SIGN USH TIMES A -12353 ; [.4D08.0020.0002] # CUNEIFORM SIGN USH TIMES KU -12354 ; [.4D09.0020.0002] # CUNEIFORM SIGN USH TIMES KUR -12355 ; [.4D0A.0020.0002] # CUNEIFORM SIGN USH TIMES TAK4 -12356 ; [.4D0B.0020.0002] # CUNEIFORM SIGN USHX -12357 ; [.4D0C.0020.0002] # CUNEIFORM SIGN USH2 -12358 ; [.4D0D.0020.0002] # CUNEIFORM SIGN USHUMX -12359 ; [.4D0E.0020.0002] # CUNEIFORM SIGN UTUKI -1235A ; [.4D0F.0020.0002] # CUNEIFORM SIGN UZ3 -1235B ; [.4D10.0020.0002] # CUNEIFORM SIGN UZ3 TIMES KASKAL -1235C ; [.4D11.0020.0002] # CUNEIFORM SIGN UZU -1235D ; [.4D12.0020.0002] # CUNEIFORM SIGN ZA -1235E ; [.4D13.0020.0002] # CUNEIFORM SIGN ZA TENU -1235F ; [.4D14.0020.0002] # CUNEIFORM SIGN ZA SQUARED TIMES KUR -12360 ; [.4D15.0020.0002] # CUNEIFORM SIGN ZAG -12361 ; [.4D16.0020.0002] # CUNEIFORM SIGN ZAMX -12362 ; [.4D17.0020.0002] # CUNEIFORM SIGN ZE2 -12363 ; [.4D18.0020.0002] # CUNEIFORM SIGN ZI -12364 ; [.4D19.0020.0002] # CUNEIFORM SIGN ZI OVER ZI -12365 ; [.4D1A.0020.0002] # CUNEIFORM SIGN ZI3 -12366 ; [.4D1B.0020.0002] # CUNEIFORM SIGN ZIB -12367 ; [.4D1C.0020.0002] # CUNEIFORM SIGN ZIB KABA TENU -12368 ; [.4D1D.0020.0002] # CUNEIFORM SIGN ZIG -12369 ; [.4D1E.0020.0002] # CUNEIFORM SIGN ZIZ2 -1236A ; [.4D1F.0020.0002] # CUNEIFORM SIGN ZU -1236B ; [.4D20.0020.0002] # CUNEIFORM SIGN ZU5 -1236C ; [.4D21.0020.0002] # CUNEIFORM SIGN ZU5 TIMES A -1236D ; [.4D22.0020.0002] # CUNEIFORM SIGN ZUBUR -1236E ; [.4D23.0020.0002] # CUNEIFORM SIGN ZUM -1236F ; [.4D24.0020.0002] # CUNEIFORM SIGN KAP ELAMITE -12370 ; [.4D25.0020.0002] # CUNEIFORM SIGN AB TIMES NUN -12371 ; [.4D26.0020.0002] # CUNEIFORM SIGN AB2 TIMES A -12372 ; [.4D27.0020.0002] # CUNEIFORM SIGN AMAR TIMES KUG -12373 ; [.4D28.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH -12374 ; [.4D29.0020.0002] # CUNEIFORM SIGN DAG3 -12375 ; [.4D2A.0020.0002] # CUNEIFORM SIGN DISH PLUS SHU -12376 ; [.4D2B.0020.0002] # CUNEIFORM SIGN DUB TIMES SHE -12377 ; [.4D2C.0020.0002] # CUNEIFORM SIGN EZEN TIMES GUD -12378 ; [.4D2D.0020.0002] # CUNEIFORM SIGN EZEN TIMES SHE -12379 ; [.4D2E.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A -1237A ; [.4D2F.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 -1237B ; [.4D30.0020.0002] # CUNEIFORM SIGN GE22 -1237C ; [.4D31.0020.0002] # CUNEIFORM SIGN GIG -1237D ; [.4D32.0020.0002] # CUNEIFORM SIGN HUSH -1237E ; [.4D33.0020.0002] # CUNEIFORM SIGN KA TIMES ANSHE -1237F ; [.4D34.0020.0002] # CUNEIFORM SIGN KA TIMES ASH3 -12380 ; [.4D35.0020.0002] # CUNEIFORM SIGN KA TIMES GISH -12381 ; [.4D36.0020.0002] # CUNEIFORM SIGN KA TIMES GUD -12382 ; [.4D37.0020.0002] # CUNEIFORM SIGN KA TIMES HI TIMES ASH2 -12383 ; [.4D38.0020.0002] # CUNEIFORM SIGN KA TIMES LUM -12384 ; [.4D39.0020.0002] # CUNEIFORM SIGN KA TIMES PA -12385 ; [.4D3A.0020.0002] # CUNEIFORM SIGN KA TIMES SHUL -12386 ; [.4D3B.0020.0002] # CUNEIFORM SIGN KA TIMES TU -12387 ; [.4D3C.0020.0002] # CUNEIFORM SIGN KA TIMES UR2 -12388 ; [.4D3D.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GI -12389 ; [.4D3E.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG TIMES BAD -1238A ; [.4D3F.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL -1238B ; [.4D40.0020.0002] # CUNEIFORM SIGN LU2 TIMES SHU -1238C ; [.4D41.0020.0002] # CUNEIFORM SIGN MESH -1238D ; [.4D42.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES ZA -1238E ; [.4D43.0020.0002] # CUNEIFORM SIGN NA4 -1238F ; [.4D44.0020.0002] # CUNEIFORM SIGN NIN -12390 ; [.4D45.0020.0002] # CUNEIFORM SIGN NIN9 -12391 ; [.4D46.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES BAL -12392 ; [.4D47.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GI -12393 ; [.4D48.0020.0002] # CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES -12394 ; [.4D49.0020.0002] # CUNEIFORM SIGN PESH2 ASTERISK -12395 ; [.4D4A.0020.0002] # CUNEIFORM SIGN PIR2 -12396 ; [.4D4B.0020.0002] # CUNEIFORM SIGN SAG TIMES IGI GUNU -12397 ; [.4D4C.0020.0002] # CUNEIFORM SIGN TI2 -12398 ; [.4D4D.0020.0002] # CUNEIFORM SIGN UM TIMES ME -12399 ; [.4D4E.0020.0002] # CUNEIFORM SIGN U U -12480 ; [.4D4F.0020.0002] # CUNEIFORM SIGN AB TIMES NUN TENU -12481 ; [.4D50.0020.0002] # CUNEIFORM SIGN AB TIMES SHU2 -12482 ; [.4D51.0020.0002] # CUNEIFORM SIGN AD TIMES ESH2 -12483 ; [.4D52.0020.0002] # CUNEIFORM SIGN BAD TIMES DISH TENU -12484 ; [.4D53.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES AB2 -12485 ; [.4D54.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES NI -12486 ; [.4D55.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES ZA -12487 ; [.4D56.0020.0002] # CUNEIFORM SIGN BU OVER BU TIMES NA2 -12488 ; [.4D57.0020.0002] # CUNEIFORM SIGN DA TIMES TAK4 -12489 ; [.4D58.0020.0002] # CUNEIFORM SIGN DAG TIMES KUR -1248A ; [.4D59.0020.0002] # CUNEIFORM SIGN DIM TIMES IGI -1248B ; [.4D5A.0020.0002] # CUNEIFORM SIGN DIM TIMES U U U -1248C ; [.4D5B.0020.0002] # CUNEIFORM SIGN DIM2 TIMES UD -1248D ; [.4D5C.0020.0002] # CUNEIFORM SIGN DUG TIMES ANSHE -1248E ; [.4D5D.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH -1248F ; [.4D5E.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH AT LEFT -12490 ; [.4D5F.0020.0002] # CUNEIFORM SIGN DUG TIMES DIN -12491 ; [.4D60.0020.0002] # CUNEIFORM SIGN DUG TIMES DUN -12492 ; [.4D61.0020.0002] # CUNEIFORM SIGN DUG TIMES ERIN2 -12493 ; [.4D62.0020.0002] # CUNEIFORM SIGN DUG TIMES GA -12494 ; [.4D63.0020.0002] # CUNEIFORM SIGN DUG TIMES GI -12495 ; [.4D64.0020.0002] # CUNEIFORM SIGN DUG TIMES GIR2 GUNU -12496 ; [.4D65.0020.0002] # CUNEIFORM SIGN DUG TIMES GISH -12497 ; [.4D66.0020.0002] # CUNEIFORM SIGN DUG TIMES HA -12498 ; [.4D67.0020.0002] # CUNEIFORM SIGN DUG TIMES HI -12499 ; [.4D68.0020.0002] # CUNEIFORM SIGN DUG TIMES IGI GUNU -1249A ; [.4D69.0020.0002] # CUNEIFORM SIGN DUG TIMES KASKAL -1249B ; [.4D6A.0020.0002] # CUNEIFORM SIGN DUG TIMES KUR -1249C ; [.4D6B.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 -1249D ; [.4D6C.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL -1249E ; [.4D6D.0020.0002] # CUNEIFORM SIGN DUG TIMES LAK-020 -1249F ; [.4D6E.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM -124A0 ; [.4D6F.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM TIMES KUR -124A1 ; [.4D70.0020.0002] # CUNEIFORM SIGN DUG TIMES LUH PLUS GISH -124A2 ; [.4D71.0020.0002] # CUNEIFORM SIGN DUG TIMES MASH -124A3 ; [.4D72.0020.0002] # CUNEIFORM SIGN DUG TIMES MES -124A4 ; [.4D73.0020.0002] # CUNEIFORM SIGN DUG TIMES MI -124A5 ; [.4D74.0020.0002] # CUNEIFORM SIGN DUG TIMES NI -124A6 ; [.4D75.0020.0002] # CUNEIFORM SIGN DUG TIMES PI -124A7 ; [.4D76.0020.0002] # CUNEIFORM SIGN DUG TIMES SHE -124A8 ; [.4D77.0020.0002] # CUNEIFORM SIGN DUG TIMES SI GUNU -124A9 ; [.4D78.0020.0002] # CUNEIFORM SIGN E2 TIMES KUR -124AA ; [.4D79.0020.0002] # CUNEIFORM SIGN E2 TIMES PAP -124AB ; [.4D7A.0020.0002] # CUNEIFORM SIGN ERIN2 X -124AC ; [.4D7B.0020.0002] # CUNEIFORM SIGN ESH2 CROSSING ESH2 -124AD ; [.4D7C.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ASH -124AE ; [.4D7D.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES HI -124AF ; [.4D7E.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU -124B0 ; [.4D7F.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LA -124B1 ; [.4D80.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LAL -124B2 ; [.4D81.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ME -124B3 ; [.4D82.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES MES -124B4 ; [.4D83.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES SU -124B5 ; [.4D84.0020.0002] # CUNEIFORM SIGN EZEN TIMES SU -124B6 ; [.4D85.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAHAR2 -124B7 ; [.4D86.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM GUNU -124B8 ; [.4D87.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU -124B9 ; [.4D88.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL -124BA ; [.4D89.0020.0002] # CUNEIFORM SIGN GA2 TIMES EREN -124BB ; [.4D8A.0020.0002] # CUNEIFORM SIGN GA2 TIMES GA -124BC ; [.4D8B.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS DI -124BD ; [.4D8C.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS NE -124BE ; [.4D8D.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS A -124BF ; [.4D8E.0020.0002] # CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL -124C0 ; [.4D8F.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM -124C1 ; [.4D90.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR -124C2 ; [.4D91.0020.0002] # CUNEIFORM SIGN GA2 TIMES LUH -124C3 ; [.4D92.0020.0002] # CUNEIFORM SIGN GA2 TIMES MUSH -124C4 ; [.4D93.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE -124C5 ; [.4D94.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS E2 -124C6 ; [.4D95.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS GI -124C7 ; [.4D96.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHIM -124C8 ; [.4D97.0020.0002] # CUNEIFORM SIGN GA2 TIMES ZIZ2 -124C9 ; [.4D98.0020.0002] # CUNEIFORM SIGN GABA ROTATED NINETY DEGREES -124CA ; [.4D99.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES U -124CB ; [.4D9A.0020.0002] # CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH -124CC ; [.4D9B.0020.0002] # CUNEIFORM SIGN GU2 TIMES IGI GUNU -124CD ; [.4D9C.0020.0002] # CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4 -124CE ; [.4D9D.0020.0002] # CUNEIFORM SIGN HA TENU GUNU -124CF ; [.4D9E.0020.0002] # CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH -124D0 ; [.4D9F.0020.0002] # CUNEIFORM SIGN KA TIMES BU -124D1 ; [.4DA0.0020.0002] # CUNEIFORM SIGN KA TIMES KA -124D2 ; [.4DA1.0020.0002] # CUNEIFORM SIGN KA TIMES U U U -124D3 ; [.4DA2.0020.0002] # CUNEIFORM SIGN KA TIMES UR -124D4 ; [.4DA3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU -124D5 ; [.4DA4.0020.0002] # CUNEIFORM SIGN LAK-003 -124D6 ; [.4DA5.0020.0002] # CUNEIFORM SIGN LAK-021 -124D7 ; [.4DA6.0020.0002] # CUNEIFORM SIGN LAK-025 -124D8 ; [.4DA7.0020.0002] # CUNEIFORM SIGN LAK-030 -124D9 ; [.4DA8.0020.0002] # CUNEIFORM SIGN LAK-050 -124DA ; [.4DA9.0020.0002] # CUNEIFORM SIGN LAK-051 -124DB ; [.4DAA.0020.0002] # CUNEIFORM SIGN LAK-062 -124DC ; [.4DAB.0020.0002] # CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU -124DD ; [.4DAC.0020.0002] # CUNEIFORM SIGN LAK-080 -124DE ; [.4DAD.0020.0002] # CUNEIFORM SIGN LAK-081 OVER LAK-081 -124DF ; [.4DAE.0020.0002] # CUNEIFORM SIGN LAK-092 -124E0 ; [.4DAF.0020.0002] # CUNEIFORM SIGN LAK-130 -124E1 ; [.4DB0.0020.0002] # CUNEIFORM SIGN LAK-142 -124E2 ; [.4DB1.0020.0002] # CUNEIFORM SIGN LAK-210 -124E3 ; [.4DB2.0020.0002] # CUNEIFORM SIGN LAK-219 -124E4 ; [.4DB3.0020.0002] # CUNEIFORM SIGN LAK-220 -124E5 ; [.4DB4.0020.0002] # CUNEIFORM SIGN LAK-225 -124E6 ; [.4DB5.0020.0002] # CUNEIFORM SIGN LAK-228 -124E7 ; [.4DB6.0020.0002] # CUNEIFORM SIGN LAK-238 -124E8 ; [.4DB7.0020.0002] # CUNEIFORM SIGN LAK-265 -124E9 ; [.4DB8.0020.0002] # CUNEIFORM SIGN LAK-266 -124EA ; [.4DB9.0020.0002] # CUNEIFORM SIGN LAK-343 -124EB ; [.4DBA.0020.0002] # CUNEIFORM SIGN LAK-347 -124EC ; [.4DBB.0020.0002] # CUNEIFORM SIGN LAK-348 -124ED ; [.4DBC.0020.0002] # CUNEIFORM SIGN LAK-383 -124EE ; [.4DBD.0020.0002] # CUNEIFORM SIGN LAK-384 -124EF ; [.4DBE.0020.0002] # CUNEIFORM SIGN LAK-390 -124F0 ; [.4DBF.0020.0002] # CUNEIFORM SIGN LAK-441 -124F1 ; [.4DC0.0020.0002] # CUNEIFORM SIGN LAK-449 -124F2 ; [.4DC1.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES GU -124F3 ; [.4DC2.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES IGI -124F4 ; [.4DC3.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3 -124F5 ; [.4DC4.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3 -124F6 ; [.4DC5.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA -124F7 ; [.4DC6.0020.0002] # CUNEIFORM SIGN LAK-450 -124F8 ; [.4DC7.0020.0002] # CUNEIFORM SIGN LAK-457 -124F9 ; [.4DC8.0020.0002] # CUNEIFORM SIGN LAK-470 -124FA ; [.4DC9.0020.0002] # CUNEIFORM SIGN LAK-483 -124FB ; [.4DCA.0020.0002] # CUNEIFORM SIGN LAK-490 -124FC ; [.4DCB.0020.0002] # CUNEIFORM SIGN LAK-492 -124FD ; [.4DCC.0020.0002] # CUNEIFORM SIGN LAK-493 -124FE ; [.4DCD.0020.0002] # CUNEIFORM SIGN LAK-495 -124FF ; [.4DCE.0020.0002] # CUNEIFORM SIGN LAK-550 -12500 ; [.4DCF.0020.0002] # CUNEIFORM SIGN LAK-608 -12501 ; [.4DD0.0020.0002] # CUNEIFORM SIGN LAK-617 -12502 ; [.4DD1.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES ASH -12503 ; [.4DD2.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES BAD -12504 ; [.4DD3.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU -12505 ; [.4DD4.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES KU3 -12506 ; [.4DD5.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES LA -12507 ; [.4DD6.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TAR -12508 ; [.4DD7.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TE -12509 ; [.4DD8.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES U2 -1250A ; [.4DD9.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES UD -1250B ; [.4DDA.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES URUDA -1250C ; [.4DDB.0020.0002] # CUNEIFORM SIGN LAK-636 -1250D ; [.4DDC.0020.0002] # CUNEIFORM SIGN LAK-648 -1250E ; [.4DDD.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES DUB -1250F ; [.4DDE.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES GA -12510 ; [.4DDF.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI -12511 ; [.4DE0.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI GUNU -12512 ; [.4DE1.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES NI -12513 ; [.4DE2.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3 -12514 ; [.4DE3.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI -12515 ; [.4DE4.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES UD -12516 ; [.4DE5.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES URUDA -12517 ; [.4DE6.0020.0002] # CUNEIFORM SIGN LAK-724 -12518 ; [.4DE7.0020.0002] # CUNEIFORM SIGN LAK-749 -12519 ; [.4DE8.0020.0002] # CUNEIFORM SIGN LU2 GUNU TIMES ASH -1251A ; [.4DE9.0020.0002] # CUNEIFORM SIGN LU2 TIMES DISH -1251B ; [.4DEA.0020.0002] # CUNEIFORM SIGN LU2 TIMES HAL -1251C ; [.4DEB.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP -1251D ; [.4DEC.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3 -1251E ; [.4DED.0020.0002] # CUNEIFORM SIGN LU2 TIMES TAK4 -1251F ; [.4DEE.0020.0002] # CUNEIFORM SIGN MI PLUS ZA7 -12520 ; [.4DEF.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES GA -12521 ; [.4DF0.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK -12522 ; [.4DF1.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES DIM GUNU -12523 ; [.4DF2.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GISH -12524 ; [.4DF3.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUL -12525 ; [.4DF4.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES HI -12526 ; [.4DF5.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES KESH2 -12527 ; [.4DF6.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES LAK-050 -12528 ; [.4DF7.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES MASH -12529 ; [.4DF8.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP -1252A ; [.4DF9.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U -1252B ; [.4DFA.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U PLUS U -1252C ; [.4DFB.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES URUDA -1252D ; [.4DFC.0020.0002] # CUNEIFORM SIGN SAG GUNU TIMES HA -1252E ; [.4DFD.0020.0002] # CUNEIFORM SIGN SAG TIMES EN -1252F ; [.4DFE.0020.0002] # CUNEIFORM SIGN SAG TIMES SHE AT LEFT -12530 ; [.4DFF.0020.0002] # CUNEIFORM SIGN SAG TIMES TAK4 -12531 ; [.4E00.0020.0002] # CUNEIFORM SIGN SHA6 TENU -12532 ; [.4E01.0020.0002] # CUNEIFORM SIGN SHE OVER SHE -12533 ; [.4E02.0020.0002] # CUNEIFORM SIGN SHE PLUS HUB2 -12534 ; [.4E03.0020.0002] # CUNEIFORM SIGN SHE PLUS NAM2 -12535 ; [.4E04.0020.0002] # CUNEIFORM SIGN SHE PLUS SAR -12536 ; [.4E05.0020.0002] # CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI -12537 ; [.4E06.0020.0002] # CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN -12538 ; [.4E07.0020.0002] # CUNEIFORM SIGN SI TIMES TAK4 -12539 ; [.4E08.0020.0002] # CUNEIFORM SIGN TAK4 PLUS SAG -1253A ; [.4E09.0020.0002] # CUNEIFORM SIGN TUM TIMES GAN2 TENU -1253B ; [.4E0A.0020.0002] # CUNEIFORM SIGN TUM TIMES THREE DISH -1253C ; [.4E0B.0020.0002] # CUNEIFORM SIGN UR2 INVERTED -1253D ; [.4E0C.0020.0002] # CUNEIFORM SIGN UR2 TIMES UD -1253E ; [.4E0D.0020.0002] # CUNEIFORM SIGN URU TIMES DARA3 -1253F ; [.4E0E.0020.0002] # CUNEIFORM SIGN URU TIMES LAK-668 -12540 ; [.4E0F.0020.0002] # CUNEIFORM SIGN URU TIMES LU3 -12541 ; [.4E10.0020.0002] # CUNEIFORM SIGN ZA7 -12542 ; [.4E11.0020.0002] # CUNEIFORM SIGN ZU OVER ZU PLUS SAR -12543 ; [.4E12.0020.0002] # CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU -13000 ; [.4E13.0020.0002] # EGYPTIAN HIEROGLYPH A001 -13001 ; [.4E14.0020.0002] # EGYPTIAN HIEROGLYPH A002 -13002 ; [.4E15.0020.0002] # EGYPTIAN HIEROGLYPH A003 -13003 ; [.4E16.0020.0002] # EGYPTIAN HIEROGLYPH A004 -13004 ; [.4E17.0020.0002] # EGYPTIAN HIEROGLYPH A005 -13005 ; [.4E18.0020.0002] # EGYPTIAN HIEROGLYPH A005A -13006 ; [.4E19.0020.0002] # EGYPTIAN HIEROGLYPH A006 -13007 ; [.4E1A.0020.0002] # EGYPTIAN HIEROGLYPH A006A -13008 ; [.4E1B.0020.0002] # EGYPTIAN HIEROGLYPH A006B -13009 ; [.4E1C.0020.0002] # EGYPTIAN HIEROGLYPH A007 -1300A ; [.4E1D.0020.0002] # EGYPTIAN HIEROGLYPH A008 -1300B ; [.4E1E.0020.0002] # EGYPTIAN HIEROGLYPH A009 -1300C ; [.4E1F.0020.0002] # EGYPTIAN HIEROGLYPH A010 -1300D ; [.4E20.0020.0002] # EGYPTIAN HIEROGLYPH A011 -1300E ; [.4E21.0020.0002] # EGYPTIAN HIEROGLYPH A012 -1300F ; [.4E22.0020.0002] # EGYPTIAN HIEROGLYPH A013 -13010 ; [.4E23.0020.0002] # EGYPTIAN HIEROGLYPH A014 -13011 ; [.4E24.0020.0002] # EGYPTIAN HIEROGLYPH A014A -13012 ; [.4E25.0020.0002] # EGYPTIAN HIEROGLYPH A015 -13013 ; [.4E26.0020.0002] # EGYPTIAN HIEROGLYPH A016 -13014 ; [.4E27.0020.0002] # EGYPTIAN HIEROGLYPH A017 -13015 ; [.4E28.0020.0002] # EGYPTIAN HIEROGLYPH A017A -13016 ; [.4E29.0020.0002] # EGYPTIAN HIEROGLYPH A018 -13017 ; [.4E2A.0020.0002] # EGYPTIAN HIEROGLYPH A019 -13018 ; [.4E2B.0020.0002] # EGYPTIAN HIEROGLYPH A020 -13019 ; [.4E2C.0020.0002] # EGYPTIAN HIEROGLYPH A021 -1301A ; [.4E2D.0020.0002] # EGYPTIAN HIEROGLYPH A022 -1301B ; [.4E2E.0020.0002] # EGYPTIAN HIEROGLYPH A023 -1301C ; [.4E2F.0020.0002] # EGYPTIAN HIEROGLYPH A024 -1301D ; [.4E30.0020.0002] # EGYPTIAN HIEROGLYPH A025 -1301E ; [.4E31.0020.0002] # EGYPTIAN HIEROGLYPH A026 -1301F ; [.4E32.0020.0002] # EGYPTIAN HIEROGLYPH A027 -13020 ; [.4E33.0020.0002] # EGYPTIAN HIEROGLYPH A028 -13021 ; [.4E34.0020.0002] # EGYPTIAN HIEROGLYPH A029 -13022 ; [.4E35.0020.0002] # EGYPTIAN HIEROGLYPH A030 -13023 ; [.4E36.0020.0002] # EGYPTIAN HIEROGLYPH A031 -13024 ; [.4E37.0020.0002] # EGYPTIAN HIEROGLYPH A032 -13025 ; [.4E38.0020.0002] # EGYPTIAN HIEROGLYPH A032A -13026 ; [.4E39.0020.0002] # EGYPTIAN HIEROGLYPH A033 -13027 ; [.4E3A.0020.0002] # EGYPTIAN HIEROGLYPH A034 -13028 ; [.4E3B.0020.0002] # EGYPTIAN HIEROGLYPH A035 -13029 ; [.4E3C.0020.0002] # EGYPTIAN HIEROGLYPH A036 -1302A ; [.4E3D.0020.0002] # EGYPTIAN HIEROGLYPH A037 -1302B ; [.4E3E.0020.0002] # EGYPTIAN HIEROGLYPH A038 -1302C ; [.4E3F.0020.0002] # EGYPTIAN HIEROGLYPH A039 -1302D ; [.4E40.0020.0002] # EGYPTIAN HIEROGLYPH A040 -1302E ; [.4E41.0020.0002] # EGYPTIAN HIEROGLYPH A040A -1302F ; [.4E42.0020.0002] # EGYPTIAN HIEROGLYPH A041 -13030 ; [.4E43.0020.0002] # EGYPTIAN HIEROGLYPH A042 -13031 ; [.4E44.0020.0002] # EGYPTIAN HIEROGLYPH A042A -13032 ; [.4E45.0020.0002] # EGYPTIAN HIEROGLYPH A043 -13033 ; [.4E46.0020.0002] # EGYPTIAN HIEROGLYPH A043A -13034 ; [.4E47.0020.0002] # EGYPTIAN HIEROGLYPH A044 -13035 ; [.4E48.0020.0002] # EGYPTIAN HIEROGLYPH A045 -13036 ; [.4E49.0020.0002] # EGYPTIAN HIEROGLYPH A045A -13037 ; [.4E4A.0020.0002] # EGYPTIAN HIEROGLYPH A046 -13038 ; [.4E4B.0020.0002] # EGYPTIAN HIEROGLYPH A047 -13039 ; [.4E4C.0020.0002] # EGYPTIAN HIEROGLYPH A048 -1303A ; [.4E4D.0020.0002] # EGYPTIAN HIEROGLYPH A049 -1303B ; [.4E4E.0020.0002] # EGYPTIAN HIEROGLYPH A050 -1303C ; [.4E4F.0020.0002] # EGYPTIAN HIEROGLYPH A051 -1303D ; [.4E50.0020.0002] # EGYPTIAN HIEROGLYPH A052 -1303E ; [.4E51.0020.0002] # EGYPTIAN HIEROGLYPH A053 -1303F ; [.4E52.0020.0002] # EGYPTIAN HIEROGLYPH A054 -13040 ; [.4E53.0020.0002] # EGYPTIAN HIEROGLYPH A055 -13041 ; [.4E54.0020.0002] # EGYPTIAN HIEROGLYPH A056 -13042 ; [.4E55.0020.0002] # EGYPTIAN HIEROGLYPH A057 -13043 ; [.4E56.0020.0002] # EGYPTIAN HIEROGLYPH A058 -13044 ; [.4E57.0020.0002] # EGYPTIAN HIEROGLYPH A059 -13045 ; [.4E58.0020.0002] # EGYPTIAN HIEROGLYPH A060 -13046 ; [.4E59.0020.0002] # EGYPTIAN HIEROGLYPH A061 -13047 ; [.4E5A.0020.0002] # EGYPTIAN HIEROGLYPH A062 -13048 ; [.4E5B.0020.0002] # EGYPTIAN HIEROGLYPH A063 -13049 ; [.4E5C.0020.0002] # EGYPTIAN HIEROGLYPH A064 -1304A ; [.4E5D.0020.0002] # EGYPTIAN HIEROGLYPH A065 -1304B ; [.4E5E.0020.0002] # EGYPTIAN HIEROGLYPH A066 -1304C ; [.4E5F.0020.0002] # EGYPTIAN HIEROGLYPH A067 -1304D ; [.4E60.0020.0002] # EGYPTIAN HIEROGLYPH A068 -1304E ; [.4E61.0020.0002] # EGYPTIAN HIEROGLYPH A069 -1304F ; [.4E62.0020.0002] # EGYPTIAN HIEROGLYPH A070 -13050 ; [.4E63.0020.0002] # EGYPTIAN HIEROGLYPH B001 -13051 ; [.4E64.0020.0002] # EGYPTIAN HIEROGLYPH B002 -13052 ; [.4E65.0020.0002] # EGYPTIAN HIEROGLYPH B003 -13053 ; [.4E66.0020.0002] # EGYPTIAN HIEROGLYPH B004 -13054 ; [.4E67.0020.0002] # EGYPTIAN HIEROGLYPH B005 -13055 ; [.4E68.0020.0002] # EGYPTIAN HIEROGLYPH B005A -13056 ; [.4E69.0020.0002] # EGYPTIAN HIEROGLYPH B006 -13057 ; [.4E6A.0020.0002] # EGYPTIAN HIEROGLYPH B007 -13058 ; [.4E6B.0020.0002] # EGYPTIAN HIEROGLYPH B008 -13059 ; [.4E6C.0020.0002] # EGYPTIAN HIEROGLYPH B009 -1305A ; [.4E6D.0020.0002] # EGYPTIAN HIEROGLYPH C001 -1305B ; [.4E6E.0020.0002] # EGYPTIAN HIEROGLYPH C002 -1305C ; [.4E6F.0020.0002] # EGYPTIAN HIEROGLYPH C002A -1305D ; [.4E70.0020.0002] # EGYPTIAN HIEROGLYPH C002B -1305E ; [.4E71.0020.0002] # EGYPTIAN HIEROGLYPH C002C -1305F ; [.4E72.0020.0002] # EGYPTIAN HIEROGLYPH C003 -13060 ; [.4E73.0020.0002] # EGYPTIAN HIEROGLYPH C004 -13061 ; [.4E74.0020.0002] # EGYPTIAN HIEROGLYPH C005 -13062 ; [.4E75.0020.0002] # EGYPTIAN HIEROGLYPH C006 -13063 ; [.4E76.0020.0002] # EGYPTIAN HIEROGLYPH C007 -13064 ; [.4E77.0020.0002] # EGYPTIAN HIEROGLYPH C008 -13065 ; [.4E78.0020.0002] # EGYPTIAN HIEROGLYPH C009 -13066 ; [.4E79.0020.0002] # EGYPTIAN HIEROGLYPH C010 -13067 ; [.4E7A.0020.0002] # EGYPTIAN HIEROGLYPH C010A -13068 ; [.4E7B.0020.0002] # EGYPTIAN HIEROGLYPH C011 -13069 ; [.4E7C.0020.0002] # EGYPTIAN HIEROGLYPH C012 -1306A ; [.4E7D.0020.0002] # EGYPTIAN HIEROGLYPH C013 -1306B ; [.4E7E.0020.0002] # EGYPTIAN HIEROGLYPH C014 -1306C ; [.4E7F.0020.0002] # EGYPTIAN HIEROGLYPH C015 -1306D ; [.4E80.0020.0002] # EGYPTIAN HIEROGLYPH C016 -1306E ; [.4E81.0020.0002] # EGYPTIAN HIEROGLYPH C017 -1306F ; [.4E82.0020.0002] # EGYPTIAN HIEROGLYPH C018 -13070 ; [.4E83.0020.0002] # EGYPTIAN HIEROGLYPH C019 -13071 ; [.4E84.0020.0002] # EGYPTIAN HIEROGLYPH C020 -13072 ; [.4E85.0020.0002] # EGYPTIAN HIEROGLYPH C021 -13073 ; [.4E86.0020.0002] # EGYPTIAN HIEROGLYPH C022 -13074 ; [.4E87.0020.0002] # EGYPTIAN HIEROGLYPH C023 -13075 ; [.4E88.0020.0002] # EGYPTIAN HIEROGLYPH C024 -13076 ; [.4E89.0020.0002] # EGYPTIAN HIEROGLYPH D001 -13077 ; [.4E8A.0020.0002] # EGYPTIAN HIEROGLYPH D002 -13078 ; [.4E8B.0020.0002] # EGYPTIAN HIEROGLYPH D003 -13079 ; [.4E8C.0020.0002] # EGYPTIAN HIEROGLYPH D004 -1307A ; [.4E8D.0020.0002] # EGYPTIAN HIEROGLYPH D005 -1307B ; [.4E8E.0020.0002] # EGYPTIAN HIEROGLYPH D006 -1307C ; [.4E8F.0020.0002] # EGYPTIAN HIEROGLYPH D007 -1307D ; [.4E90.0020.0002] # EGYPTIAN HIEROGLYPH D008 -1307E ; [.4E91.0020.0002] # EGYPTIAN HIEROGLYPH D008A -1307F ; [.4E92.0020.0002] # EGYPTIAN HIEROGLYPH D009 -13080 ; [.4E93.0020.0002] # EGYPTIAN HIEROGLYPH D010 -13081 ; [.4E94.0020.0002] # EGYPTIAN HIEROGLYPH D011 -13082 ; [.4E95.0020.0002] # EGYPTIAN HIEROGLYPH D012 -13083 ; [.4E96.0020.0002] # EGYPTIAN HIEROGLYPH D013 -13084 ; [.4E97.0020.0002] # EGYPTIAN HIEROGLYPH D014 -13085 ; [.4E98.0020.0002] # EGYPTIAN HIEROGLYPH D015 -13086 ; [.4E99.0020.0002] # EGYPTIAN HIEROGLYPH D016 -13087 ; [.4E9A.0020.0002] # EGYPTIAN HIEROGLYPH D017 -13088 ; [.4E9B.0020.0002] # EGYPTIAN HIEROGLYPH D018 -13089 ; [.4E9C.0020.0002] # EGYPTIAN HIEROGLYPH D019 -1308A ; [.4E9D.0020.0002] # EGYPTIAN HIEROGLYPH D020 -1308B ; [.4E9E.0020.0002] # EGYPTIAN HIEROGLYPH D021 -1308C ; [.4E9F.0020.0002] # EGYPTIAN HIEROGLYPH D022 -1308D ; [.4EA0.0020.0002] # EGYPTIAN HIEROGLYPH D023 -1308E ; [.4EA1.0020.0002] # EGYPTIAN HIEROGLYPH D024 -1308F ; [.4EA2.0020.0002] # EGYPTIAN HIEROGLYPH D025 -13090 ; [.4EA3.0020.0002] # EGYPTIAN HIEROGLYPH D026 -13091 ; [.4EA4.0020.0002] # EGYPTIAN HIEROGLYPH D027 -13092 ; [.4EA5.0020.0002] # EGYPTIAN HIEROGLYPH D027A -13093 ; [.4EA6.0020.0002] # EGYPTIAN HIEROGLYPH D028 -13094 ; [.4EA7.0020.0002] # EGYPTIAN HIEROGLYPH D029 -13095 ; [.4EA8.0020.0002] # EGYPTIAN HIEROGLYPH D030 -13096 ; [.4EA9.0020.0002] # EGYPTIAN HIEROGLYPH D031 -13097 ; [.4EAA.0020.0002] # EGYPTIAN HIEROGLYPH D031A -13098 ; [.4EAB.0020.0002] # EGYPTIAN HIEROGLYPH D032 -13099 ; [.4EAC.0020.0002] # EGYPTIAN HIEROGLYPH D033 -1309A ; [.4EAD.0020.0002] # EGYPTIAN HIEROGLYPH D034 -1309B ; [.4EAE.0020.0002] # EGYPTIAN HIEROGLYPH D034A -1309C ; [.4EAF.0020.0002] # EGYPTIAN HIEROGLYPH D035 -1309D ; [.4EB0.0020.0002] # EGYPTIAN HIEROGLYPH D036 -1309E ; [.4EB1.0020.0002] # EGYPTIAN HIEROGLYPH D037 -1309F ; [.4EB2.0020.0002] # EGYPTIAN HIEROGLYPH D038 -130A0 ; [.4EB3.0020.0002] # EGYPTIAN HIEROGLYPH D039 -130A1 ; [.4EB4.0020.0002] # EGYPTIAN HIEROGLYPH D040 -130A2 ; [.4EB5.0020.0002] # EGYPTIAN HIEROGLYPH D041 -130A3 ; [.4EB6.0020.0002] # EGYPTIAN HIEROGLYPH D042 -130A4 ; [.4EB7.0020.0002] # EGYPTIAN HIEROGLYPH D043 -130A5 ; [.4EB8.0020.0002] # EGYPTIAN HIEROGLYPH D044 -130A6 ; [.4EB9.0020.0002] # EGYPTIAN HIEROGLYPH D045 -130A7 ; [.4EBA.0020.0002] # EGYPTIAN HIEROGLYPH D046 -130A8 ; [.4EBB.0020.0002] # EGYPTIAN HIEROGLYPH D046A -130A9 ; [.4EBC.0020.0002] # EGYPTIAN HIEROGLYPH D047 -130AA ; [.4EBD.0020.0002] # EGYPTIAN HIEROGLYPH D048 -130AB ; [.4EBE.0020.0002] # EGYPTIAN HIEROGLYPH D048A -130AC ; [.4EBF.0020.0002] # EGYPTIAN HIEROGLYPH D049 -130AD ; [.4EC0.0020.0002] # EGYPTIAN HIEROGLYPH D050 -130AE ; [.4EC1.0020.0002] # EGYPTIAN HIEROGLYPH D050A -130AF ; [.4EC2.0020.0002] # EGYPTIAN HIEROGLYPH D050B -130B0 ; [.4EC3.0020.0002] # EGYPTIAN HIEROGLYPH D050C -130B1 ; [.4EC4.0020.0002] # EGYPTIAN HIEROGLYPH D050D -130B2 ; [.4EC5.0020.0002] # EGYPTIAN HIEROGLYPH D050E -130B3 ; [.4EC6.0020.0002] # EGYPTIAN HIEROGLYPH D050F -130B4 ; [.4EC7.0020.0002] # EGYPTIAN HIEROGLYPH D050G -130B5 ; [.4EC8.0020.0002] # EGYPTIAN HIEROGLYPH D050H -130B6 ; [.4EC9.0020.0002] # EGYPTIAN HIEROGLYPH D050I -130B7 ; [.4ECA.0020.0002] # EGYPTIAN HIEROGLYPH D051 -130B8 ; [.4ECB.0020.0002] # EGYPTIAN HIEROGLYPH D052 -130B9 ; [.4ECC.0020.0002] # EGYPTIAN HIEROGLYPH D052A -130BA ; [.4ECD.0020.0002] # EGYPTIAN HIEROGLYPH D053 -130BB ; [.4ECE.0020.0002] # EGYPTIAN HIEROGLYPH D054 -130BC ; [.4ECF.0020.0002] # EGYPTIAN HIEROGLYPH D054A -130BD ; [.4ED0.0020.0002] # EGYPTIAN HIEROGLYPH D055 -130BE ; [.4ED1.0020.0002] # EGYPTIAN HIEROGLYPH D056 -130BF ; [.4ED2.0020.0002] # EGYPTIAN HIEROGLYPH D057 -130C0 ; [.4ED3.0020.0002] # EGYPTIAN HIEROGLYPH D058 -130C1 ; [.4ED4.0020.0002] # EGYPTIAN HIEROGLYPH D059 -130C2 ; [.4ED5.0020.0002] # EGYPTIAN HIEROGLYPH D060 -130C3 ; [.4ED6.0020.0002] # EGYPTIAN HIEROGLYPH D061 -130C4 ; [.4ED7.0020.0002] # EGYPTIAN HIEROGLYPH D062 -130C5 ; [.4ED8.0020.0002] # EGYPTIAN HIEROGLYPH D063 -130C6 ; [.4ED9.0020.0002] # EGYPTIAN HIEROGLYPH D064 -130C7 ; [.4EDA.0020.0002] # EGYPTIAN HIEROGLYPH D065 -130C8 ; [.4EDB.0020.0002] # EGYPTIAN HIEROGLYPH D066 -130C9 ; [.4EDC.0020.0002] # EGYPTIAN HIEROGLYPH D067 -130CA ; [.4EDD.0020.0002] # EGYPTIAN HIEROGLYPH D067A -130CB ; [.4EDE.0020.0002] # EGYPTIAN HIEROGLYPH D067B -130CC ; [.4EDF.0020.0002] # EGYPTIAN HIEROGLYPH D067C -130CD ; [.4EE0.0020.0002] # EGYPTIAN HIEROGLYPH D067D -130CE ; [.4EE1.0020.0002] # EGYPTIAN HIEROGLYPH D067E -130CF ; [.4EE2.0020.0002] # EGYPTIAN HIEROGLYPH D067F -130D0 ; [.4EE3.0020.0002] # EGYPTIAN HIEROGLYPH D067G -130D1 ; [.4EE4.0020.0002] # EGYPTIAN HIEROGLYPH D067H -130D2 ; [.4EE5.0020.0002] # EGYPTIAN HIEROGLYPH E001 -130D3 ; [.4EE6.0020.0002] # EGYPTIAN HIEROGLYPH E002 -130D4 ; [.4EE7.0020.0002] # EGYPTIAN HIEROGLYPH E003 -130D5 ; [.4EE8.0020.0002] # EGYPTIAN HIEROGLYPH E004 -130D6 ; [.4EE9.0020.0002] # EGYPTIAN HIEROGLYPH E005 -130D7 ; [.4EEA.0020.0002] # EGYPTIAN HIEROGLYPH E006 -130D8 ; [.4EEB.0020.0002] # EGYPTIAN HIEROGLYPH E007 -130D9 ; [.4EEC.0020.0002] # EGYPTIAN HIEROGLYPH E008 -130DA ; [.4EED.0020.0002] # EGYPTIAN HIEROGLYPH E008A -130DB ; [.4EEE.0020.0002] # EGYPTIAN HIEROGLYPH E009 -130DC ; [.4EEF.0020.0002] # EGYPTIAN HIEROGLYPH E009A -130DD ; [.4EF0.0020.0002] # EGYPTIAN HIEROGLYPH E010 -130DE ; [.4EF1.0020.0002] # EGYPTIAN HIEROGLYPH E011 -130DF ; [.4EF2.0020.0002] # EGYPTIAN HIEROGLYPH E012 -130E0 ; [.4EF3.0020.0002] # EGYPTIAN HIEROGLYPH E013 -130E1 ; [.4EF4.0020.0002] # EGYPTIAN HIEROGLYPH E014 -130E2 ; [.4EF5.0020.0002] # EGYPTIAN HIEROGLYPH E015 -130E3 ; [.4EF6.0020.0002] # EGYPTIAN HIEROGLYPH E016 -130E4 ; [.4EF7.0020.0002] # EGYPTIAN HIEROGLYPH E016A -130E5 ; [.4EF8.0020.0002] # EGYPTIAN HIEROGLYPH E017 -130E6 ; [.4EF9.0020.0002] # EGYPTIAN HIEROGLYPH E017A -130E7 ; [.4EFA.0020.0002] # EGYPTIAN HIEROGLYPH E018 -130E8 ; [.4EFB.0020.0002] # EGYPTIAN HIEROGLYPH E019 -130E9 ; [.4EFC.0020.0002] # EGYPTIAN HIEROGLYPH E020 -130EA ; [.4EFD.0020.0002] # EGYPTIAN HIEROGLYPH E020A -130EB ; [.4EFE.0020.0002] # EGYPTIAN HIEROGLYPH E021 -130EC ; [.4EFF.0020.0002] # EGYPTIAN HIEROGLYPH E022 -130ED ; [.4F00.0020.0002] # EGYPTIAN HIEROGLYPH E023 -130EE ; [.4F01.0020.0002] # EGYPTIAN HIEROGLYPH E024 -130EF ; [.4F02.0020.0002] # EGYPTIAN HIEROGLYPH E025 -130F0 ; [.4F03.0020.0002] # EGYPTIAN HIEROGLYPH E026 -130F1 ; [.4F04.0020.0002] # EGYPTIAN HIEROGLYPH E027 -130F2 ; [.4F05.0020.0002] # EGYPTIAN HIEROGLYPH E028 -130F3 ; [.4F06.0020.0002] # EGYPTIAN HIEROGLYPH E028A -130F4 ; [.4F07.0020.0002] # EGYPTIAN HIEROGLYPH E029 -130F5 ; [.4F08.0020.0002] # EGYPTIAN HIEROGLYPH E030 -130F6 ; [.4F09.0020.0002] # EGYPTIAN HIEROGLYPH E031 -130F7 ; [.4F0A.0020.0002] # EGYPTIAN HIEROGLYPH E032 -130F8 ; [.4F0B.0020.0002] # EGYPTIAN HIEROGLYPH E033 -130F9 ; [.4F0C.0020.0002] # EGYPTIAN HIEROGLYPH E034 -130FA ; [.4F0D.0020.0002] # EGYPTIAN HIEROGLYPH E034A -130FB ; [.4F0E.0020.0002] # EGYPTIAN HIEROGLYPH E036 -130FC ; [.4F0F.0020.0002] # EGYPTIAN HIEROGLYPH E037 -130FD ; [.4F10.0020.0002] # EGYPTIAN HIEROGLYPH E038 -130FE ; [.4F11.0020.0002] # EGYPTIAN HIEROGLYPH F001 -130FF ; [.4F12.0020.0002] # EGYPTIAN HIEROGLYPH F001A -13100 ; [.4F13.0020.0002] # EGYPTIAN HIEROGLYPH F002 -13101 ; [.4F14.0020.0002] # EGYPTIAN HIEROGLYPH F003 -13102 ; [.4F15.0020.0002] # EGYPTIAN HIEROGLYPH F004 -13103 ; [.4F16.0020.0002] # EGYPTIAN HIEROGLYPH F005 -13104 ; [.4F17.0020.0002] # EGYPTIAN HIEROGLYPH F006 -13105 ; [.4F18.0020.0002] # EGYPTIAN HIEROGLYPH F007 -13106 ; [.4F19.0020.0002] # EGYPTIAN HIEROGLYPH F008 -13107 ; [.4F1A.0020.0002] # EGYPTIAN HIEROGLYPH F009 -13108 ; [.4F1B.0020.0002] # EGYPTIAN HIEROGLYPH F010 -13109 ; [.4F1C.0020.0002] # EGYPTIAN HIEROGLYPH F011 -1310A ; [.4F1D.0020.0002] # EGYPTIAN HIEROGLYPH F012 -1310B ; [.4F1E.0020.0002] # EGYPTIAN HIEROGLYPH F013 -1310C ; [.4F1F.0020.0002] # EGYPTIAN HIEROGLYPH F013A -1310D ; [.4F20.0020.0002] # EGYPTIAN HIEROGLYPH F014 -1310E ; [.4F21.0020.0002] # EGYPTIAN HIEROGLYPH F015 -1310F ; [.4F22.0020.0002] # EGYPTIAN HIEROGLYPH F016 -13110 ; [.4F23.0020.0002] # EGYPTIAN HIEROGLYPH F017 -13111 ; [.4F24.0020.0002] # EGYPTIAN HIEROGLYPH F018 -13112 ; [.4F25.0020.0002] # EGYPTIAN HIEROGLYPH F019 -13113 ; [.4F26.0020.0002] # EGYPTIAN HIEROGLYPH F020 -13114 ; [.4F27.0020.0002] # EGYPTIAN HIEROGLYPH F021 -13115 ; [.4F28.0020.0002] # EGYPTIAN HIEROGLYPH F021A -13116 ; [.4F29.0020.0002] # EGYPTIAN HIEROGLYPH F022 -13117 ; [.4F2A.0020.0002] # EGYPTIAN HIEROGLYPH F023 -13118 ; [.4F2B.0020.0002] # EGYPTIAN HIEROGLYPH F024 -13119 ; [.4F2C.0020.0002] # EGYPTIAN HIEROGLYPH F025 -1311A ; [.4F2D.0020.0002] # EGYPTIAN HIEROGLYPH F026 -1311B ; [.4F2E.0020.0002] # EGYPTIAN HIEROGLYPH F027 -1311C ; [.4F2F.0020.0002] # EGYPTIAN HIEROGLYPH F028 -1311D ; [.4F30.0020.0002] # EGYPTIAN HIEROGLYPH F029 -1311E ; [.4F31.0020.0002] # EGYPTIAN HIEROGLYPH F030 -1311F ; [.4F32.0020.0002] # EGYPTIAN HIEROGLYPH F031 -13120 ; [.4F33.0020.0002] # EGYPTIAN HIEROGLYPH F031A -13121 ; [.4F34.0020.0002] # EGYPTIAN HIEROGLYPH F032 -13122 ; [.4F35.0020.0002] # EGYPTIAN HIEROGLYPH F033 -13123 ; [.4F36.0020.0002] # EGYPTIAN HIEROGLYPH F034 -13124 ; [.4F37.0020.0002] # EGYPTIAN HIEROGLYPH F035 -13125 ; [.4F38.0020.0002] # EGYPTIAN HIEROGLYPH F036 -13126 ; [.4F39.0020.0002] # EGYPTIAN HIEROGLYPH F037 -13127 ; [.4F3A.0020.0002] # EGYPTIAN HIEROGLYPH F037A -13128 ; [.4F3B.0020.0002] # EGYPTIAN HIEROGLYPH F038 -13129 ; [.4F3C.0020.0002] # EGYPTIAN HIEROGLYPH F038A -1312A ; [.4F3D.0020.0002] # EGYPTIAN HIEROGLYPH F039 -1312B ; [.4F3E.0020.0002] # EGYPTIAN HIEROGLYPH F040 -1312C ; [.4F3F.0020.0002] # EGYPTIAN HIEROGLYPH F041 -1312D ; [.4F40.0020.0002] # EGYPTIAN HIEROGLYPH F042 -1312E ; [.4F41.0020.0002] # EGYPTIAN HIEROGLYPH F043 -1312F ; [.4F42.0020.0002] # EGYPTIAN HIEROGLYPH F044 -13130 ; [.4F43.0020.0002] # EGYPTIAN HIEROGLYPH F045 -13131 ; [.4F44.0020.0002] # EGYPTIAN HIEROGLYPH F045A -13132 ; [.4F45.0020.0002] # EGYPTIAN HIEROGLYPH F046 -13133 ; [.4F46.0020.0002] # EGYPTIAN HIEROGLYPH F046A -13134 ; [.4F47.0020.0002] # EGYPTIAN HIEROGLYPH F047 -13135 ; [.4F48.0020.0002] # EGYPTIAN HIEROGLYPH F047A -13136 ; [.4F49.0020.0002] # EGYPTIAN HIEROGLYPH F048 -13137 ; [.4F4A.0020.0002] # EGYPTIAN HIEROGLYPH F049 -13138 ; [.4F4B.0020.0002] # EGYPTIAN HIEROGLYPH F050 -13139 ; [.4F4C.0020.0002] # EGYPTIAN HIEROGLYPH F051 -1313A ; [.4F4D.0020.0002] # EGYPTIAN HIEROGLYPH F051A -1313B ; [.4F4E.0020.0002] # EGYPTIAN HIEROGLYPH F051B -1313C ; [.4F4F.0020.0002] # EGYPTIAN HIEROGLYPH F051C -1313D ; [.4F50.0020.0002] # EGYPTIAN HIEROGLYPH F052 -1313E ; [.4F51.0020.0002] # EGYPTIAN HIEROGLYPH F053 -1313F ; [.4F52.0020.0002] # EGYPTIAN HIEROGLYPH G001 -13140 ; [.4F53.0020.0002] # EGYPTIAN HIEROGLYPH G002 -13141 ; [.4F54.0020.0002] # EGYPTIAN HIEROGLYPH G003 -13142 ; [.4F55.0020.0002] # EGYPTIAN HIEROGLYPH G004 -13143 ; [.4F56.0020.0002] # EGYPTIAN HIEROGLYPH G005 -13144 ; [.4F57.0020.0002] # EGYPTIAN HIEROGLYPH G006 -13145 ; [.4F58.0020.0002] # EGYPTIAN HIEROGLYPH G006A -13146 ; [.4F59.0020.0002] # EGYPTIAN HIEROGLYPH G007 -13147 ; [.4F5A.0020.0002] # EGYPTIAN HIEROGLYPH G007A -13148 ; [.4F5B.0020.0002] # EGYPTIAN HIEROGLYPH G007B -13149 ; [.4F5C.0020.0002] # EGYPTIAN HIEROGLYPH G008 -1314A ; [.4F5D.0020.0002] # EGYPTIAN HIEROGLYPH G009 -1314B ; [.4F5E.0020.0002] # EGYPTIAN HIEROGLYPH G010 -1314C ; [.4F5F.0020.0002] # EGYPTIAN HIEROGLYPH G011 -1314D ; [.4F60.0020.0002] # EGYPTIAN HIEROGLYPH G011A -1314E ; [.4F61.0020.0002] # EGYPTIAN HIEROGLYPH G012 -1314F ; [.4F62.0020.0002] # EGYPTIAN HIEROGLYPH G013 -13150 ; [.4F63.0020.0002] # EGYPTIAN HIEROGLYPH G014 -13151 ; [.4F64.0020.0002] # EGYPTIAN HIEROGLYPH G015 -13152 ; [.4F65.0020.0002] # EGYPTIAN HIEROGLYPH G016 -13153 ; [.4F66.0020.0002] # EGYPTIAN HIEROGLYPH G017 -13154 ; [.4F67.0020.0002] # EGYPTIAN HIEROGLYPH G018 -13155 ; [.4F68.0020.0002] # EGYPTIAN HIEROGLYPH G019 -13156 ; [.4F69.0020.0002] # EGYPTIAN HIEROGLYPH G020 -13157 ; [.4F6A.0020.0002] # EGYPTIAN HIEROGLYPH G020A -13158 ; [.4F6B.0020.0002] # EGYPTIAN HIEROGLYPH G021 -13159 ; [.4F6C.0020.0002] # EGYPTIAN HIEROGLYPH G022 -1315A ; [.4F6D.0020.0002] # EGYPTIAN HIEROGLYPH G023 -1315B ; [.4F6E.0020.0002] # EGYPTIAN HIEROGLYPH G024 -1315C ; [.4F6F.0020.0002] # EGYPTIAN HIEROGLYPH G025 -1315D ; [.4F70.0020.0002] # EGYPTIAN HIEROGLYPH G026 -1315E ; [.4F71.0020.0002] # EGYPTIAN HIEROGLYPH G026A -1315F ; [.4F72.0020.0002] # EGYPTIAN HIEROGLYPH G027 -13160 ; [.4F73.0020.0002] # EGYPTIAN HIEROGLYPH G028 -13161 ; [.4F74.0020.0002] # EGYPTIAN HIEROGLYPH G029 -13162 ; [.4F75.0020.0002] # EGYPTIAN HIEROGLYPH G030 -13163 ; [.4F76.0020.0002] # EGYPTIAN HIEROGLYPH G031 -13164 ; [.4F77.0020.0002] # EGYPTIAN HIEROGLYPH G032 -13165 ; [.4F78.0020.0002] # EGYPTIAN HIEROGLYPH G033 -13166 ; [.4F79.0020.0002] # EGYPTIAN HIEROGLYPH G034 -13167 ; [.4F7A.0020.0002] # EGYPTIAN HIEROGLYPH G035 -13168 ; [.4F7B.0020.0002] # EGYPTIAN HIEROGLYPH G036 -13169 ; [.4F7C.0020.0002] # EGYPTIAN HIEROGLYPH G036A -1316A ; [.4F7D.0020.0002] # EGYPTIAN HIEROGLYPH G037 -1316B ; [.4F7E.0020.0002] # EGYPTIAN HIEROGLYPH G037A -1316C ; [.4F7F.0020.0002] # EGYPTIAN HIEROGLYPH G038 -1316D ; [.4F80.0020.0002] # EGYPTIAN HIEROGLYPH G039 -1316E ; [.4F81.0020.0002] # EGYPTIAN HIEROGLYPH G040 -1316F ; [.4F82.0020.0002] # EGYPTIAN HIEROGLYPH G041 -13170 ; [.4F83.0020.0002] # EGYPTIAN HIEROGLYPH G042 -13171 ; [.4F84.0020.0002] # EGYPTIAN HIEROGLYPH G043 -13172 ; [.4F85.0020.0002] # EGYPTIAN HIEROGLYPH G043A -13173 ; [.4F86.0020.0002] # EGYPTIAN HIEROGLYPH G044 -13174 ; [.4F87.0020.0002] # EGYPTIAN HIEROGLYPH G045 -13175 ; [.4F88.0020.0002] # EGYPTIAN HIEROGLYPH G045A -13176 ; [.4F89.0020.0002] # EGYPTIAN HIEROGLYPH G046 -13177 ; [.4F8A.0020.0002] # EGYPTIAN HIEROGLYPH G047 -13178 ; [.4F8B.0020.0002] # EGYPTIAN HIEROGLYPH G048 -13179 ; [.4F8C.0020.0002] # EGYPTIAN HIEROGLYPH G049 -1317A ; [.4F8D.0020.0002] # EGYPTIAN HIEROGLYPH G050 -1317B ; [.4F8E.0020.0002] # EGYPTIAN HIEROGLYPH G051 -1317C ; [.4F8F.0020.0002] # EGYPTIAN HIEROGLYPH G052 -1317D ; [.4F90.0020.0002] # EGYPTIAN HIEROGLYPH G053 -1317E ; [.4F91.0020.0002] # EGYPTIAN HIEROGLYPH G054 -1317F ; [.4F92.0020.0002] # EGYPTIAN HIEROGLYPH H001 -13180 ; [.4F93.0020.0002] # EGYPTIAN HIEROGLYPH H002 -13181 ; [.4F94.0020.0002] # EGYPTIAN HIEROGLYPH H003 -13182 ; [.4F95.0020.0002] # EGYPTIAN HIEROGLYPH H004 -13183 ; [.4F96.0020.0002] # EGYPTIAN HIEROGLYPH H005 -13184 ; [.4F97.0020.0002] # EGYPTIAN HIEROGLYPH H006 -13185 ; [.4F98.0020.0002] # EGYPTIAN HIEROGLYPH H006A -13186 ; [.4F99.0020.0002] # EGYPTIAN HIEROGLYPH H007 -13187 ; [.4F9A.0020.0002] # EGYPTIAN HIEROGLYPH H008 -13188 ; [.4F9B.0020.0002] # EGYPTIAN HIEROGLYPH I001 -13189 ; [.4F9C.0020.0002] # EGYPTIAN HIEROGLYPH I002 -1318A ; [.4F9D.0020.0002] # EGYPTIAN HIEROGLYPH I003 -1318B ; [.4F9E.0020.0002] # EGYPTIAN HIEROGLYPH I004 -1318C ; [.4F9F.0020.0002] # EGYPTIAN HIEROGLYPH I005 -1318D ; [.4FA0.0020.0002] # EGYPTIAN HIEROGLYPH I005A -1318E ; [.4FA1.0020.0002] # EGYPTIAN HIEROGLYPH I006 -1318F ; [.4FA2.0020.0002] # EGYPTIAN HIEROGLYPH I007 -13190 ; [.4FA3.0020.0002] # EGYPTIAN HIEROGLYPH I008 -13191 ; [.4FA4.0020.0002] # EGYPTIAN HIEROGLYPH I009 -13192 ; [.4FA5.0020.0002] # EGYPTIAN HIEROGLYPH I009A -13193 ; [.4FA6.0020.0002] # EGYPTIAN HIEROGLYPH I010 -13194 ; [.4FA7.0020.0002] # EGYPTIAN HIEROGLYPH I010A -13195 ; [.4FA8.0020.0002] # EGYPTIAN HIEROGLYPH I011 -13196 ; [.4FA9.0020.0002] # EGYPTIAN HIEROGLYPH I011A -13197 ; [.4FAA.0020.0002] # EGYPTIAN HIEROGLYPH I012 -13198 ; [.4FAB.0020.0002] # EGYPTIAN HIEROGLYPH I013 -13199 ; [.4FAC.0020.0002] # EGYPTIAN HIEROGLYPH I014 -1319A ; [.4FAD.0020.0002] # EGYPTIAN HIEROGLYPH I015 -1319B ; [.4FAE.0020.0002] # EGYPTIAN HIEROGLYPH K001 -1319C ; [.4FAF.0020.0002] # EGYPTIAN HIEROGLYPH K002 -1319D ; [.4FB0.0020.0002] # EGYPTIAN HIEROGLYPH K003 -1319E ; [.4FB1.0020.0002] # EGYPTIAN HIEROGLYPH K004 -1319F ; [.4FB2.0020.0002] # EGYPTIAN HIEROGLYPH K005 -131A0 ; [.4FB3.0020.0002] # EGYPTIAN HIEROGLYPH K006 -131A1 ; [.4FB4.0020.0002] # EGYPTIAN HIEROGLYPH K007 -131A2 ; [.4FB5.0020.0002] # EGYPTIAN HIEROGLYPH K008 -131A3 ; [.4FB6.0020.0002] # EGYPTIAN HIEROGLYPH L001 -131A4 ; [.4FB7.0020.0002] # EGYPTIAN HIEROGLYPH L002 -131A5 ; [.4FB8.0020.0002] # EGYPTIAN HIEROGLYPH L002A -131A6 ; [.4FB9.0020.0002] # EGYPTIAN HIEROGLYPH L003 -131A7 ; [.4FBA.0020.0002] # EGYPTIAN HIEROGLYPH L004 -131A8 ; [.4FBB.0020.0002] # EGYPTIAN HIEROGLYPH L005 -131A9 ; [.4FBC.0020.0002] # EGYPTIAN HIEROGLYPH L006 -131AA ; [.4FBD.0020.0002] # EGYPTIAN HIEROGLYPH L006A -131AB ; [.4FBE.0020.0002] # EGYPTIAN HIEROGLYPH L007 -131AC ; [.4FBF.0020.0002] # EGYPTIAN HIEROGLYPH L008 -131AD ; [.4FC0.0020.0002] # EGYPTIAN HIEROGLYPH M001 -131AE ; [.4FC1.0020.0002] # EGYPTIAN HIEROGLYPH M001A -131AF ; [.4FC2.0020.0002] # EGYPTIAN HIEROGLYPH M001B -131B0 ; [.4FC3.0020.0002] # EGYPTIAN HIEROGLYPH M002 -131B1 ; [.4FC4.0020.0002] # EGYPTIAN HIEROGLYPH M003 -131B2 ; [.4FC5.0020.0002] # EGYPTIAN HIEROGLYPH M003A -131B3 ; [.4FC6.0020.0002] # EGYPTIAN HIEROGLYPH M004 -131B4 ; [.4FC7.0020.0002] # EGYPTIAN HIEROGLYPH M005 -131B5 ; [.4FC8.0020.0002] # EGYPTIAN HIEROGLYPH M006 -131B6 ; [.4FC9.0020.0002] # EGYPTIAN HIEROGLYPH M007 -131B7 ; [.4FCA.0020.0002] # EGYPTIAN HIEROGLYPH M008 -131B8 ; [.4FCB.0020.0002] # EGYPTIAN HIEROGLYPH M009 -131B9 ; [.4FCC.0020.0002] # EGYPTIAN HIEROGLYPH M010 -131BA ; [.4FCD.0020.0002] # EGYPTIAN HIEROGLYPH M010A -131BB ; [.4FCE.0020.0002] # EGYPTIAN HIEROGLYPH M011 -131BC ; [.4FCF.0020.0002] # EGYPTIAN HIEROGLYPH M012 -131BD ; [.4FD0.0020.0002] # EGYPTIAN HIEROGLYPH M012A -131BE ; [.4FD1.0020.0002] # EGYPTIAN HIEROGLYPH M012B -131BF ; [.4FD2.0020.0002] # EGYPTIAN HIEROGLYPH M012C -131C0 ; [.4FD3.0020.0002] # EGYPTIAN HIEROGLYPH M012D -131C1 ; [.4FD4.0020.0002] # EGYPTIAN HIEROGLYPH M012E -131C2 ; [.4FD5.0020.0002] # EGYPTIAN HIEROGLYPH M012F -131C3 ; [.4FD6.0020.0002] # EGYPTIAN HIEROGLYPH M012G -131C4 ; [.4FD7.0020.0002] # EGYPTIAN HIEROGLYPH M012H -131C5 ; [.4FD8.0020.0002] # EGYPTIAN HIEROGLYPH M013 -131C6 ; [.4FD9.0020.0002] # EGYPTIAN HIEROGLYPH M014 -131C7 ; [.4FDA.0020.0002] # EGYPTIAN HIEROGLYPH M015 -131C8 ; [.4FDB.0020.0002] # EGYPTIAN HIEROGLYPH M015A -131C9 ; [.4FDC.0020.0002] # EGYPTIAN HIEROGLYPH M016 -131CA ; [.4FDD.0020.0002] # EGYPTIAN HIEROGLYPH M016A -131CB ; [.4FDE.0020.0002] # EGYPTIAN HIEROGLYPH M017 -131CC ; [.4FDF.0020.0002] # EGYPTIAN HIEROGLYPH M017A -131CD ; [.4FE0.0020.0002] # EGYPTIAN HIEROGLYPH M018 -131CE ; [.4FE1.0020.0002] # EGYPTIAN HIEROGLYPH M019 -131CF ; [.4FE2.0020.0002] # EGYPTIAN HIEROGLYPH M020 -131D0 ; [.4FE3.0020.0002] # EGYPTIAN HIEROGLYPH M021 -131D1 ; [.4FE4.0020.0002] # EGYPTIAN HIEROGLYPH M022 -131D2 ; [.4FE5.0020.0002] # EGYPTIAN HIEROGLYPH M022A -131D3 ; [.4FE6.0020.0002] # EGYPTIAN HIEROGLYPH M023 -131D4 ; [.4FE7.0020.0002] # EGYPTIAN HIEROGLYPH M024 -131D5 ; [.4FE8.0020.0002] # EGYPTIAN HIEROGLYPH M024A -131D6 ; [.4FE9.0020.0002] # EGYPTIAN HIEROGLYPH M025 -131D7 ; [.4FEA.0020.0002] # EGYPTIAN HIEROGLYPH M026 -131D8 ; [.4FEB.0020.0002] # EGYPTIAN HIEROGLYPH M027 -131D9 ; [.4FEC.0020.0002] # EGYPTIAN HIEROGLYPH M028 -131DA ; [.4FED.0020.0002] # EGYPTIAN HIEROGLYPH M028A -131DB ; [.4FEE.0020.0002] # EGYPTIAN HIEROGLYPH M029 -131DC ; [.4FEF.0020.0002] # EGYPTIAN HIEROGLYPH M030 -131DD ; [.4FF0.0020.0002] # EGYPTIAN HIEROGLYPH M031 -131DE ; [.4FF1.0020.0002] # EGYPTIAN HIEROGLYPH M031A -131DF ; [.4FF2.0020.0002] # EGYPTIAN HIEROGLYPH M032 -131E0 ; [.4FF3.0020.0002] # EGYPTIAN HIEROGLYPH M033 -131E1 ; [.4FF4.0020.0002] # EGYPTIAN HIEROGLYPH M033A -131E2 ; [.4FF5.0020.0002] # EGYPTIAN HIEROGLYPH M033B -131E3 ; [.4FF6.0020.0002] # EGYPTIAN HIEROGLYPH M034 -131E4 ; [.4FF7.0020.0002] # EGYPTIAN HIEROGLYPH M035 -131E5 ; [.4FF8.0020.0002] # EGYPTIAN HIEROGLYPH M036 -131E6 ; [.4FF9.0020.0002] # EGYPTIAN HIEROGLYPH M037 -131E7 ; [.4FFA.0020.0002] # EGYPTIAN HIEROGLYPH M038 -131E8 ; [.4FFB.0020.0002] # EGYPTIAN HIEROGLYPH M039 -131E9 ; [.4FFC.0020.0002] # EGYPTIAN HIEROGLYPH M040 -131EA ; [.4FFD.0020.0002] # EGYPTIAN HIEROGLYPH M040A -131EB ; [.4FFE.0020.0002] # EGYPTIAN HIEROGLYPH M041 -131EC ; [.4FFF.0020.0002] # EGYPTIAN HIEROGLYPH M042 -131ED ; [.5000.0020.0002] # EGYPTIAN HIEROGLYPH M043 -131EE ; [.5001.0020.0002] # EGYPTIAN HIEROGLYPH M044 -131EF ; [.5002.0020.0002] # EGYPTIAN HIEROGLYPH N001 -131F0 ; [.5003.0020.0002] # EGYPTIAN HIEROGLYPH N002 -131F1 ; [.5004.0020.0002] # EGYPTIAN HIEROGLYPH N003 -131F2 ; [.5005.0020.0002] # EGYPTIAN HIEROGLYPH N004 -131F3 ; [.5006.0020.0002] # EGYPTIAN HIEROGLYPH N005 -131F4 ; [.5007.0020.0002] # EGYPTIAN HIEROGLYPH N006 -131F5 ; [.5008.0020.0002] # EGYPTIAN HIEROGLYPH N007 -131F6 ; [.5009.0020.0002] # EGYPTIAN HIEROGLYPH N008 -131F7 ; [.500A.0020.0002] # EGYPTIAN HIEROGLYPH N009 -131F8 ; [.500B.0020.0002] # EGYPTIAN HIEROGLYPH N010 -131F9 ; [.500C.0020.0002] # EGYPTIAN HIEROGLYPH N011 -131FA ; [.500D.0020.0002] # EGYPTIAN HIEROGLYPH N012 -131FB ; [.500E.0020.0002] # EGYPTIAN HIEROGLYPH N013 -131FC ; [.500F.0020.0002] # EGYPTIAN HIEROGLYPH N014 -131FD ; [.5010.0020.0002] # EGYPTIAN HIEROGLYPH N015 -131FE ; [.5011.0020.0002] # EGYPTIAN HIEROGLYPH N016 -131FF ; [.5012.0020.0002] # EGYPTIAN HIEROGLYPH N017 -13200 ; [.5013.0020.0002] # EGYPTIAN HIEROGLYPH N018 -13201 ; [.5014.0020.0002] # EGYPTIAN HIEROGLYPH N018A -13202 ; [.5015.0020.0002] # EGYPTIAN HIEROGLYPH N018B -13203 ; [.5016.0020.0002] # EGYPTIAN HIEROGLYPH N019 -13204 ; [.5017.0020.0002] # EGYPTIAN HIEROGLYPH N020 -13205 ; [.5018.0020.0002] # EGYPTIAN HIEROGLYPH N021 -13206 ; [.5019.0020.0002] # EGYPTIAN HIEROGLYPH N022 -13207 ; [.501A.0020.0002] # EGYPTIAN HIEROGLYPH N023 -13208 ; [.501B.0020.0002] # EGYPTIAN HIEROGLYPH N024 -13209 ; [.501C.0020.0002] # EGYPTIAN HIEROGLYPH N025 -1320A ; [.501D.0020.0002] # EGYPTIAN HIEROGLYPH N025A -1320B ; [.501E.0020.0002] # EGYPTIAN HIEROGLYPH N026 -1320C ; [.501F.0020.0002] # EGYPTIAN HIEROGLYPH N027 -1320D ; [.5020.0020.0002] # EGYPTIAN HIEROGLYPH N028 -1320E ; [.5021.0020.0002] # EGYPTIAN HIEROGLYPH N029 -1320F ; [.5022.0020.0002] # EGYPTIAN HIEROGLYPH N030 -13210 ; [.5023.0020.0002] # EGYPTIAN HIEROGLYPH N031 -13211 ; [.5024.0020.0002] # EGYPTIAN HIEROGLYPH N032 -13212 ; [.5025.0020.0002] # EGYPTIAN HIEROGLYPH N033 -13213 ; [.5026.0020.0002] # EGYPTIAN HIEROGLYPH N033A -13214 ; [.5027.0020.0002] # EGYPTIAN HIEROGLYPH N034 -13215 ; [.5028.0020.0002] # EGYPTIAN HIEROGLYPH N034A -13216 ; [.5029.0020.0002] # EGYPTIAN HIEROGLYPH N035 -13217 ; [.502A.0020.0002] # EGYPTIAN HIEROGLYPH N035A -13218 ; [.502B.0020.0002] # EGYPTIAN HIEROGLYPH N036 -13219 ; [.502C.0020.0002] # EGYPTIAN HIEROGLYPH N037 -1321A ; [.502D.0020.0002] # EGYPTIAN HIEROGLYPH N037A -1321B ; [.502E.0020.0002] # EGYPTIAN HIEROGLYPH N038 -1321C ; [.502F.0020.0002] # EGYPTIAN HIEROGLYPH N039 -1321D ; [.5030.0020.0002] # EGYPTIAN HIEROGLYPH N040 -1321E ; [.5031.0020.0002] # EGYPTIAN HIEROGLYPH N041 -1321F ; [.5032.0020.0002] # EGYPTIAN HIEROGLYPH N042 -13220 ; [.5033.0020.0002] # EGYPTIAN HIEROGLYPH NL001 -13221 ; [.5034.0020.0002] # EGYPTIAN HIEROGLYPH NL002 -13222 ; [.5035.0020.0002] # EGYPTIAN HIEROGLYPH NL003 -13223 ; [.5036.0020.0002] # EGYPTIAN HIEROGLYPH NL004 -13224 ; [.5037.0020.0002] # EGYPTIAN HIEROGLYPH NL005 -13225 ; [.5038.0020.0002] # EGYPTIAN HIEROGLYPH NL005A -13226 ; [.5039.0020.0002] # EGYPTIAN HIEROGLYPH NL006 -13227 ; [.503A.0020.0002] # EGYPTIAN HIEROGLYPH NL007 -13228 ; [.503B.0020.0002] # EGYPTIAN HIEROGLYPH NL008 -13229 ; [.503C.0020.0002] # EGYPTIAN HIEROGLYPH NL009 -1322A ; [.503D.0020.0002] # EGYPTIAN HIEROGLYPH NL010 -1322B ; [.503E.0020.0002] # EGYPTIAN HIEROGLYPH NL011 -1322C ; [.503F.0020.0002] # EGYPTIAN HIEROGLYPH NL012 -1322D ; [.5040.0020.0002] # EGYPTIAN HIEROGLYPH NL013 -1322E ; [.5041.0020.0002] # EGYPTIAN HIEROGLYPH NL014 -1322F ; [.5042.0020.0002] # EGYPTIAN HIEROGLYPH NL015 -13230 ; [.5043.0020.0002] # EGYPTIAN HIEROGLYPH NL016 -13231 ; [.5044.0020.0002] # EGYPTIAN HIEROGLYPH NL017 -13232 ; [.5045.0020.0002] # EGYPTIAN HIEROGLYPH NL017A -13233 ; [.5046.0020.0002] # EGYPTIAN HIEROGLYPH NL018 -13234 ; [.5047.0020.0002] # EGYPTIAN HIEROGLYPH NL019 -13235 ; [.5048.0020.0002] # EGYPTIAN HIEROGLYPH NL020 -13236 ; [.5049.0020.0002] # EGYPTIAN HIEROGLYPH NU001 -13237 ; [.504A.0020.0002] # EGYPTIAN HIEROGLYPH NU002 -13238 ; [.504B.0020.0002] # EGYPTIAN HIEROGLYPH NU003 -13239 ; [.504C.0020.0002] # EGYPTIAN HIEROGLYPH NU004 -1323A ; [.504D.0020.0002] # EGYPTIAN HIEROGLYPH NU005 -1323B ; [.504E.0020.0002] # EGYPTIAN HIEROGLYPH NU006 -1323C ; [.504F.0020.0002] # EGYPTIAN HIEROGLYPH NU007 -1323D ; [.5050.0020.0002] # EGYPTIAN HIEROGLYPH NU008 -1323E ; [.5051.0020.0002] # EGYPTIAN HIEROGLYPH NU009 -1323F ; [.5052.0020.0002] # EGYPTIAN HIEROGLYPH NU010 -13240 ; [.5053.0020.0002] # EGYPTIAN HIEROGLYPH NU010A -13241 ; [.5054.0020.0002] # EGYPTIAN HIEROGLYPH NU011 -13242 ; [.5055.0020.0002] # EGYPTIAN HIEROGLYPH NU011A -13243 ; [.5056.0020.0002] # EGYPTIAN HIEROGLYPH NU012 -13244 ; [.5057.0020.0002] # EGYPTIAN HIEROGLYPH NU013 -13245 ; [.5058.0020.0002] # EGYPTIAN HIEROGLYPH NU014 -13246 ; [.5059.0020.0002] # EGYPTIAN HIEROGLYPH NU015 -13247 ; [.505A.0020.0002] # EGYPTIAN HIEROGLYPH NU016 -13248 ; [.505B.0020.0002] # EGYPTIAN HIEROGLYPH NU017 -13249 ; [.505C.0020.0002] # EGYPTIAN HIEROGLYPH NU018 -1324A ; [.505D.0020.0002] # EGYPTIAN HIEROGLYPH NU018A -1324B ; [.505E.0020.0002] # EGYPTIAN HIEROGLYPH NU019 -1324C ; [.505F.0020.0002] # EGYPTIAN HIEROGLYPH NU020 -1324D ; [.5060.0020.0002] # EGYPTIAN HIEROGLYPH NU021 -1324E ; [.5061.0020.0002] # EGYPTIAN HIEROGLYPH NU022 -1324F ; [.5062.0020.0002] # EGYPTIAN HIEROGLYPH NU022A -13250 ; [.5063.0020.0002] # EGYPTIAN HIEROGLYPH O001 -13251 ; [.5064.0020.0002] # EGYPTIAN HIEROGLYPH O001A -13252 ; [.5065.0020.0002] # EGYPTIAN HIEROGLYPH O002 -13253 ; [.5066.0020.0002] # EGYPTIAN HIEROGLYPH O003 -13254 ; [.5067.0020.0002] # EGYPTIAN HIEROGLYPH O004 -13255 ; [.5068.0020.0002] # EGYPTIAN HIEROGLYPH O005 -13256 ; [.5069.0020.0002] # EGYPTIAN HIEROGLYPH O005A -13257 ; [.506A.0020.0002] # EGYPTIAN HIEROGLYPH O006 -13258 ; [.506B.0020.0002] # EGYPTIAN HIEROGLYPH O006A -13259 ; [.506C.0020.0002] # EGYPTIAN HIEROGLYPH O006B -1325A ; [.506D.0020.0002] # EGYPTIAN HIEROGLYPH O006C -1325B ; [.506E.0020.0002] # EGYPTIAN HIEROGLYPH O006D -1325C ; [.506F.0020.0002] # EGYPTIAN HIEROGLYPH O006E -1325D ; [.5070.0020.0002] # EGYPTIAN HIEROGLYPH O006F -1325E ; [.5071.0020.0002] # EGYPTIAN HIEROGLYPH O007 -1325F ; [.5072.0020.0002] # EGYPTIAN HIEROGLYPH O008 -13260 ; [.5073.0020.0002] # EGYPTIAN HIEROGLYPH O009 -13261 ; [.5074.0020.0002] # EGYPTIAN HIEROGLYPH O010 -13262 ; [.5075.0020.0002] # EGYPTIAN HIEROGLYPH O010A -13263 ; [.5076.0020.0002] # EGYPTIAN HIEROGLYPH O010B -13264 ; [.5077.0020.0002] # EGYPTIAN HIEROGLYPH O010C -13265 ; [.5078.0020.0002] # EGYPTIAN HIEROGLYPH O011 -13266 ; [.5079.0020.0002] # EGYPTIAN HIEROGLYPH O012 -13267 ; [.507A.0020.0002] # EGYPTIAN HIEROGLYPH O013 -13268 ; [.507B.0020.0002] # EGYPTIAN HIEROGLYPH O014 -13269 ; [.507C.0020.0002] # EGYPTIAN HIEROGLYPH O015 -1326A ; [.507D.0020.0002] # EGYPTIAN HIEROGLYPH O016 -1326B ; [.507E.0020.0002] # EGYPTIAN HIEROGLYPH O017 -1326C ; [.507F.0020.0002] # EGYPTIAN HIEROGLYPH O018 -1326D ; [.5080.0020.0002] # EGYPTIAN HIEROGLYPH O019 -1326E ; [.5081.0020.0002] # EGYPTIAN HIEROGLYPH O019A -1326F ; [.5082.0020.0002] # EGYPTIAN HIEROGLYPH O020 -13270 ; [.5083.0020.0002] # EGYPTIAN HIEROGLYPH O020A -13271 ; [.5084.0020.0002] # EGYPTIAN HIEROGLYPH O021 -13272 ; [.5085.0020.0002] # EGYPTIAN HIEROGLYPH O022 -13273 ; [.5086.0020.0002] # EGYPTIAN HIEROGLYPH O023 -13274 ; [.5087.0020.0002] # EGYPTIAN HIEROGLYPH O024 -13275 ; [.5088.0020.0002] # EGYPTIAN HIEROGLYPH O024A -13276 ; [.5089.0020.0002] # EGYPTIAN HIEROGLYPH O025 -13277 ; [.508A.0020.0002] # EGYPTIAN HIEROGLYPH O025A -13278 ; [.508B.0020.0002] # EGYPTIAN HIEROGLYPH O026 -13279 ; [.508C.0020.0002] # EGYPTIAN HIEROGLYPH O027 -1327A ; [.508D.0020.0002] # EGYPTIAN HIEROGLYPH O028 -1327B ; [.508E.0020.0002] # EGYPTIAN HIEROGLYPH O029 -1327C ; [.508F.0020.0002] # EGYPTIAN HIEROGLYPH O029A -1327D ; [.5090.0020.0002] # EGYPTIAN HIEROGLYPH O030 -1327E ; [.5091.0020.0002] # EGYPTIAN HIEROGLYPH O030A -1327F ; [.5092.0020.0002] # EGYPTIAN HIEROGLYPH O031 -13280 ; [.5093.0020.0002] # EGYPTIAN HIEROGLYPH O032 -13281 ; [.5094.0020.0002] # EGYPTIAN HIEROGLYPH O033 -13282 ; [.5095.0020.0002] # EGYPTIAN HIEROGLYPH O033A -13283 ; [.5096.0020.0002] # EGYPTIAN HIEROGLYPH O034 -13284 ; [.5097.0020.0002] # EGYPTIAN HIEROGLYPH O035 -13285 ; [.5098.0020.0002] # EGYPTIAN HIEROGLYPH O036 -13286 ; [.5099.0020.0002] # EGYPTIAN HIEROGLYPH O036A -13287 ; [.509A.0020.0002] # EGYPTIAN HIEROGLYPH O036B -13288 ; [.509B.0020.0002] # EGYPTIAN HIEROGLYPH O036C -13289 ; [.509C.0020.0002] # EGYPTIAN HIEROGLYPH O036D -1328A ; [.509D.0020.0002] # EGYPTIAN HIEROGLYPH O037 -1328B ; [.509E.0020.0002] # EGYPTIAN HIEROGLYPH O038 -1328C ; [.509F.0020.0002] # EGYPTIAN HIEROGLYPH O039 -1328D ; [.50A0.0020.0002] # EGYPTIAN HIEROGLYPH O040 -1328E ; [.50A1.0020.0002] # EGYPTIAN HIEROGLYPH O041 -1328F ; [.50A2.0020.0002] # EGYPTIAN HIEROGLYPH O042 -13290 ; [.50A3.0020.0002] # EGYPTIAN HIEROGLYPH O043 -13291 ; [.50A4.0020.0002] # EGYPTIAN HIEROGLYPH O044 -13292 ; [.50A5.0020.0002] # EGYPTIAN HIEROGLYPH O045 -13293 ; [.50A6.0020.0002] # EGYPTIAN HIEROGLYPH O046 -13294 ; [.50A7.0020.0002] # EGYPTIAN HIEROGLYPH O047 -13295 ; [.50A8.0020.0002] # EGYPTIAN HIEROGLYPH O048 -13296 ; [.50A9.0020.0002] # EGYPTIAN HIEROGLYPH O049 -13297 ; [.50AA.0020.0002] # EGYPTIAN HIEROGLYPH O050 -13298 ; [.50AB.0020.0002] # EGYPTIAN HIEROGLYPH O050A -13299 ; [.50AC.0020.0002] # EGYPTIAN HIEROGLYPH O050B -1329A ; [.50AD.0020.0002] # EGYPTIAN HIEROGLYPH O051 -1329B ; [.50AE.0020.0002] # EGYPTIAN HIEROGLYPH P001 -1329C ; [.50AF.0020.0002] # EGYPTIAN HIEROGLYPH P001A -1329D ; [.50B0.0020.0002] # EGYPTIAN HIEROGLYPH P002 -1329E ; [.50B1.0020.0002] # EGYPTIAN HIEROGLYPH P003 -1329F ; [.50B2.0020.0002] # EGYPTIAN HIEROGLYPH P003A -132A0 ; [.50B3.0020.0002] # EGYPTIAN HIEROGLYPH P004 -132A1 ; [.50B4.0020.0002] # EGYPTIAN HIEROGLYPH P005 -132A2 ; [.50B5.0020.0002] # EGYPTIAN HIEROGLYPH P006 -132A3 ; [.50B6.0020.0002] # EGYPTIAN HIEROGLYPH P007 -132A4 ; [.50B7.0020.0002] # EGYPTIAN HIEROGLYPH P008 -132A5 ; [.50B8.0020.0002] # EGYPTIAN HIEROGLYPH P009 -132A6 ; [.50B9.0020.0002] # EGYPTIAN HIEROGLYPH P010 -132A7 ; [.50BA.0020.0002] # EGYPTIAN HIEROGLYPH P011 -132A8 ; [.50BB.0020.0002] # EGYPTIAN HIEROGLYPH Q001 -132A9 ; [.50BC.0020.0002] # EGYPTIAN HIEROGLYPH Q002 -132AA ; [.50BD.0020.0002] # EGYPTIAN HIEROGLYPH Q003 -132AB ; [.50BE.0020.0002] # EGYPTIAN HIEROGLYPH Q004 -132AC ; [.50BF.0020.0002] # EGYPTIAN HIEROGLYPH Q005 -132AD ; [.50C0.0020.0002] # EGYPTIAN HIEROGLYPH Q006 -132AE ; [.50C1.0020.0002] # EGYPTIAN HIEROGLYPH Q007 -132AF ; [.50C2.0020.0002] # EGYPTIAN HIEROGLYPH R001 -132B0 ; [.50C3.0020.0002] # EGYPTIAN HIEROGLYPH R002 -132B1 ; [.50C4.0020.0002] # EGYPTIAN HIEROGLYPH R002A -132B2 ; [.50C5.0020.0002] # EGYPTIAN HIEROGLYPH R003 -132B3 ; [.50C6.0020.0002] # EGYPTIAN HIEROGLYPH R003A -132B4 ; [.50C7.0020.0002] # EGYPTIAN HIEROGLYPH R003B -132B5 ; [.50C8.0020.0002] # EGYPTIAN HIEROGLYPH R004 -132B6 ; [.50C9.0020.0002] # EGYPTIAN HIEROGLYPH R005 -132B7 ; [.50CA.0020.0002] # EGYPTIAN HIEROGLYPH R006 -132B8 ; [.50CB.0020.0002] # EGYPTIAN HIEROGLYPH R007 -132B9 ; [.50CC.0020.0002] # EGYPTIAN HIEROGLYPH R008 -132BA ; [.50CD.0020.0002] # EGYPTIAN HIEROGLYPH R009 -132BB ; [.50CE.0020.0002] # EGYPTIAN HIEROGLYPH R010 -132BC ; [.50CF.0020.0002] # EGYPTIAN HIEROGLYPH R010A -132BD ; [.50D0.0020.0002] # EGYPTIAN HIEROGLYPH R011 -132BE ; [.50D1.0020.0002] # EGYPTIAN HIEROGLYPH R012 -132BF ; [.50D2.0020.0002] # EGYPTIAN HIEROGLYPH R013 -132C0 ; [.50D3.0020.0002] # EGYPTIAN HIEROGLYPH R014 -132C1 ; [.50D4.0020.0002] # EGYPTIAN HIEROGLYPH R015 -132C2 ; [.50D5.0020.0002] # EGYPTIAN HIEROGLYPH R016 -132C3 ; [.50D6.0020.0002] # EGYPTIAN HIEROGLYPH R016A -132C4 ; [.50D7.0020.0002] # EGYPTIAN HIEROGLYPH R017 -132C5 ; [.50D8.0020.0002] # EGYPTIAN HIEROGLYPH R018 -132C6 ; [.50D9.0020.0002] # EGYPTIAN HIEROGLYPH R019 -132C7 ; [.50DA.0020.0002] # EGYPTIAN HIEROGLYPH R020 -132C8 ; [.50DB.0020.0002] # EGYPTIAN HIEROGLYPH R021 -132C9 ; [.50DC.0020.0002] # EGYPTIAN HIEROGLYPH R022 -132CA ; [.50DD.0020.0002] # EGYPTIAN HIEROGLYPH R023 -132CB ; [.50DE.0020.0002] # EGYPTIAN HIEROGLYPH R024 -132CC ; [.50DF.0020.0002] # EGYPTIAN HIEROGLYPH R025 -132CD ; [.50E0.0020.0002] # EGYPTIAN HIEROGLYPH R026 -132CE ; [.50E1.0020.0002] # EGYPTIAN HIEROGLYPH R027 -132CF ; [.50E2.0020.0002] # EGYPTIAN HIEROGLYPH R028 -132D0 ; [.50E3.0020.0002] # EGYPTIAN HIEROGLYPH R029 -132D1 ; [.50E4.0020.0002] # EGYPTIAN HIEROGLYPH S001 -132D2 ; [.50E5.0020.0002] # EGYPTIAN HIEROGLYPH S002 -132D3 ; [.50E6.0020.0002] # EGYPTIAN HIEROGLYPH S002A -132D4 ; [.50E7.0020.0002] # EGYPTIAN HIEROGLYPH S003 -132D5 ; [.50E8.0020.0002] # EGYPTIAN HIEROGLYPH S004 -132D6 ; [.50E9.0020.0002] # EGYPTIAN HIEROGLYPH S005 -132D7 ; [.50EA.0020.0002] # EGYPTIAN HIEROGLYPH S006 -132D8 ; [.50EB.0020.0002] # EGYPTIAN HIEROGLYPH S006A -132D9 ; [.50EC.0020.0002] # EGYPTIAN HIEROGLYPH S007 -132DA ; [.50ED.0020.0002] # EGYPTIAN HIEROGLYPH S008 -132DB ; [.50EE.0020.0002] # EGYPTIAN HIEROGLYPH S009 -132DC ; [.50EF.0020.0002] # EGYPTIAN HIEROGLYPH S010 -132DD ; [.50F0.0020.0002] # EGYPTIAN HIEROGLYPH S011 -132DE ; [.50F1.0020.0002] # EGYPTIAN HIEROGLYPH S012 -132DF ; [.50F2.0020.0002] # EGYPTIAN HIEROGLYPH S013 -132E0 ; [.50F3.0020.0002] # EGYPTIAN HIEROGLYPH S014 -132E1 ; [.50F4.0020.0002] # EGYPTIAN HIEROGLYPH S014A -132E2 ; [.50F5.0020.0002] # EGYPTIAN HIEROGLYPH S014B -132E3 ; [.50F6.0020.0002] # EGYPTIAN HIEROGLYPH S015 -132E4 ; [.50F7.0020.0002] # EGYPTIAN HIEROGLYPH S016 -132E5 ; [.50F8.0020.0002] # EGYPTIAN HIEROGLYPH S017 -132E6 ; [.50F9.0020.0002] # EGYPTIAN HIEROGLYPH S017A -132E7 ; [.50FA.0020.0002] # EGYPTIAN HIEROGLYPH S018 -132E8 ; [.50FB.0020.0002] # EGYPTIAN HIEROGLYPH S019 -132E9 ; [.50FC.0020.0002] # EGYPTIAN HIEROGLYPH S020 -132EA ; [.50FD.0020.0002] # EGYPTIAN HIEROGLYPH S021 -132EB ; [.50FE.0020.0002] # EGYPTIAN HIEROGLYPH S022 -132EC ; [.50FF.0020.0002] # EGYPTIAN HIEROGLYPH S023 -132ED ; [.5100.0020.0002] # EGYPTIAN HIEROGLYPH S024 -132EE ; [.5101.0020.0002] # EGYPTIAN HIEROGLYPH S025 -132EF ; [.5102.0020.0002] # EGYPTIAN HIEROGLYPH S026 -132F0 ; [.5103.0020.0002] # EGYPTIAN HIEROGLYPH S026A -132F1 ; [.5104.0020.0002] # EGYPTIAN HIEROGLYPH S026B -132F2 ; [.5105.0020.0002] # EGYPTIAN HIEROGLYPH S027 -132F3 ; [.5106.0020.0002] # EGYPTIAN HIEROGLYPH S028 -132F4 ; [.5107.0020.0002] # EGYPTIAN HIEROGLYPH S029 -132F5 ; [.5108.0020.0002] # EGYPTIAN HIEROGLYPH S030 -132F6 ; [.5109.0020.0002] # EGYPTIAN HIEROGLYPH S031 -132F7 ; [.510A.0020.0002] # EGYPTIAN HIEROGLYPH S032 -132F8 ; [.510B.0020.0002] # EGYPTIAN HIEROGLYPH S033 -132F9 ; [.510C.0020.0002] # EGYPTIAN HIEROGLYPH S034 -132FA ; [.510D.0020.0002] # EGYPTIAN HIEROGLYPH S035 -132FB ; [.510E.0020.0002] # EGYPTIAN HIEROGLYPH S035A -132FC ; [.510F.0020.0002] # EGYPTIAN HIEROGLYPH S036 -132FD ; [.5110.0020.0002] # EGYPTIAN HIEROGLYPH S037 -132FE ; [.5111.0020.0002] # EGYPTIAN HIEROGLYPH S038 -132FF ; [.5112.0020.0002] # EGYPTIAN HIEROGLYPH S039 -13300 ; [.5113.0020.0002] # EGYPTIAN HIEROGLYPH S040 -13301 ; [.5114.0020.0002] # EGYPTIAN HIEROGLYPH S041 -13302 ; [.5115.0020.0002] # EGYPTIAN HIEROGLYPH S042 -13303 ; [.5116.0020.0002] # EGYPTIAN HIEROGLYPH S043 -13304 ; [.5117.0020.0002] # EGYPTIAN HIEROGLYPH S044 -13305 ; [.5118.0020.0002] # EGYPTIAN HIEROGLYPH S045 -13306 ; [.5119.0020.0002] # EGYPTIAN HIEROGLYPH S046 -13307 ; [.511A.0020.0002] # EGYPTIAN HIEROGLYPH T001 -13308 ; [.511B.0020.0002] # EGYPTIAN HIEROGLYPH T002 -13309 ; [.511C.0020.0002] # EGYPTIAN HIEROGLYPH T003 -1330A ; [.511D.0020.0002] # EGYPTIAN HIEROGLYPH T003A -1330B ; [.511E.0020.0002] # EGYPTIAN HIEROGLYPH T004 -1330C ; [.511F.0020.0002] # EGYPTIAN HIEROGLYPH T005 -1330D ; [.5120.0020.0002] # EGYPTIAN HIEROGLYPH T006 -1330E ; [.5121.0020.0002] # EGYPTIAN HIEROGLYPH T007 -1330F ; [.5122.0020.0002] # EGYPTIAN HIEROGLYPH T007A -13310 ; [.5123.0020.0002] # EGYPTIAN HIEROGLYPH T008 -13311 ; [.5124.0020.0002] # EGYPTIAN HIEROGLYPH T008A -13312 ; [.5125.0020.0002] # EGYPTIAN HIEROGLYPH T009 -13313 ; [.5126.0020.0002] # EGYPTIAN HIEROGLYPH T009A -13314 ; [.5127.0020.0002] # EGYPTIAN HIEROGLYPH T010 -13315 ; [.5128.0020.0002] # EGYPTIAN HIEROGLYPH T011 -13316 ; [.5129.0020.0002] # EGYPTIAN HIEROGLYPH T011A -13317 ; [.512A.0020.0002] # EGYPTIAN HIEROGLYPH T012 -13318 ; [.512B.0020.0002] # EGYPTIAN HIEROGLYPH T013 -13319 ; [.512C.0020.0002] # EGYPTIAN HIEROGLYPH T014 -1331A ; [.512D.0020.0002] # EGYPTIAN HIEROGLYPH T015 -1331B ; [.512E.0020.0002] # EGYPTIAN HIEROGLYPH T016 -1331C ; [.512F.0020.0002] # EGYPTIAN HIEROGLYPH T016A -1331D ; [.5130.0020.0002] # EGYPTIAN HIEROGLYPH T017 -1331E ; [.5131.0020.0002] # EGYPTIAN HIEROGLYPH T018 -1331F ; [.5132.0020.0002] # EGYPTIAN HIEROGLYPH T019 -13320 ; [.5133.0020.0002] # EGYPTIAN HIEROGLYPH T020 -13321 ; [.5134.0020.0002] # EGYPTIAN HIEROGLYPH T021 -13322 ; [.5135.0020.0002] # EGYPTIAN HIEROGLYPH T022 -13323 ; [.5136.0020.0002] # EGYPTIAN HIEROGLYPH T023 -13324 ; [.5137.0020.0002] # EGYPTIAN HIEROGLYPH T024 -13325 ; [.5138.0020.0002] # EGYPTIAN HIEROGLYPH T025 -13326 ; [.5139.0020.0002] # EGYPTIAN HIEROGLYPH T026 -13327 ; [.513A.0020.0002] # EGYPTIAN HIEROGLYPH T027 -13328 ; [.513B.0020.0002] # EGYPTIAN HIEROGLYPH T028 -13329 ; [.513C.0020.0002] # EGYPTIAN HIEROGLYPH T029 -1332A ; [.513D.0020.0002] # EGYPTIAN HIEROGLYPH T030 -1332B ; [.513E.0020.0002] # EGYPTIAN HIEROGLYPH T031 -1332C ; [.513F.0020.0002] # EGYPTIAN HIEROGLYPH T032 -1332D ; [.5140.0020.0002] # EGYPTIAN HIEROGLYPH T032A -1332E ; [.5141.0020.0002] # EGYPTIAN HIEROGLYPH T033 -1332F ; [.5142.0020.0002] # EGYPTIAN HIEROGLYPH T033A -13330 ; [.5143.0020.0002] # EGYPTIAN HIEROGLYPH T034 -13331 ; [.5144.0020.0002] # EGYPTIAN HIEROGLYPH T035 -13332 ; [.5145.0020.0002] # EGYPTIAN HIEROGLYPH T036 -13333 ; [.5146.0020.0002] # EGYPTIAN HIEROGLYPH U001 -13334 ; [.5147.0020.0002] # EGYPTIAN HIEROGLYPH U002 -13335 ; [.5148.0020.0002] # EGYPTIAN HIEROGLYPH U003 -13336 ; [.5149.0020.0002] # EGYPTIAN HIEROGLYPH U004 -13337 ; [.514A.0020.0002] # EGYPTIAN HIEROGLYPH U005 -13338 ; [.514B.0020.0002] # EGYPTIAN HIEROGLYPH U006 -13339 ; [.514C.0020.0002] # EGYPTIAN HIEROGLYPH U006A -1333A ; [.514D.0020.0002] # EGYPTIAN HIEROGLYPH U006B -1333B ; [.514E.0020.0002] # EGYPTIAN HIEROGLYPH U007 -1333C ; [.514F.0020.0002] # EGYPTIAN HIEROGLYPH U008 -1333D ; [.5150.0020.0002] # EGYPTIAN HIEROGLYPH U009 -1333E ; [.5151.0020.0002] # EGYPTIAN HIEROGLYPH U010 -1333F ; [.5152.0020.0002] # EGYPTIAN HIEROGLYPH U011 -13340 ; [.5153.0020.0002] # EGYPTIAN HIEROGLYPH U012 -13341 ; [.5154.0020.0002] # EGYPTIAN HIEROGLYPH U013 -13342 ; [.5155.0020.0002] # EGYPTIAN HIEROGLYPH U014 -13343 ; [.5156.0020.0002] # EGYPTIAN HIEROGLYPH U015 -13344 ; [.5157.0020.0002] # EGYPTIAN HIEROGLYPH U016 -13345 ; [.5158.0020.0002] # EGYPTIAN HIEROGLYPH U017 -13346 ; [.5159.0020.0002] # EGYPTIAN HIEROGLYPH U018 -13347 ; [.515A.0020.0002] # EGYPTIAN HIEROGLYPH U019 -13348 ; [.515B.0020.0002] # EGYPTIAN HIEROGLYPH U020 -13349 ; [.515C.0020.0002] # EGYPTIAN HIEROGLYPH U021 -1334A ; [.515D.0020.0002] # EGYPTIAN HIEROGLYPH U022 -1334B ; [.515E.0020.0002] # EGYPTIAN HIEROGLYPH U023 -1334C ; [.515F.0020.0002] # EGYPTIAN HIEROGLYPH U023A -1334D ; [.5160.0020.0002] # EGYPTIAN HIEROGLYPH U024 -1334E ; [.5161.0020.0002] # EGYPTIAN HIEROGLYPH U025 -1334F ; [.5162.0020.0002] # EGYPTIAN HIEROGLYPH U026 -13350 ; [.5163.0020.0002] # EGYPTIAN HIEROGLYPH U027 -13351 ; [.5164.0020.0002] # EGYPTIAN HIEROGLYPH U028 -13352 ; [.5165.0020.0002] # EGYPTIAN HIEROGLYPH U029 -13353 ; [.5166.0020.0002] # EGYPTIAN HIEROGLYPH U029A -13354 ; [.5167.0020.0002] # EGYPTIAN HIEROGLYPH U030 -13355 ; [.5168.0020.0002] # EGYPTIAN HIEROGLYPH U031 -13356 ; [.5169.0020.0002] # EGYPTIAN HIEROGLYPH U032 -13357 ; [.516A.0020.0002] # EGYPTIAN HIEROGLYPH U032A -13358 ; [.516B.0020.0002] # EGYPTIAN HIEROGLYPH U033 -13359 ; [.516C.0020.0002] # EGYPTIAN HIEROGLYPH U034 -1335A ; [.516D.0020.0002] # EGYPTIAN HIEROGLYPH U035 -1335B ; [.516E.0020.0002] # EGYPTIAN HIEROGLYPH U036 -1335C ; [.516F.0020.0002] # EGYPTIAN HIEROGLYPH U037 -1335D ; [.5170.0020.0002] # EGYPTIAN HIEROGLYPH U038 -1335E ; [.5171.0020.0002] # EGYPTIAN HIEROGLYPH U039 -1335F ; [.5172.0020.0002] # EGYPTIAN HIEROGLYPH U040 -13360 ; [.5173.0020.0002] # EGYPTIAN HIEROGLYPH U041 -13361 ; [.5174.0020.0002] # EGYPTIAN HIEROGLYPH U042 -13362 ; [.5175.0020.0002] # EGYPTIAN HIEROGLYPH V001 -13363 ; [.5176.0020.0002] # EGYPTIAN HIEROGLYPH V001A -13364 ; [.5177.0020.0002] # EGYPTIAN HIEROGLYPH V001B -13365 ; [.5178.0020.0002] # EGYPTIAN HIEROGLYPH V001C -13366 ; [.5179.0020.0002] # EGYPTIAN HIEROGLYPH V001D -13367 ; [.517A.0020.0002] # EGYPTIAN HIEROGLYPH V001E -13368 ; [.517B.0020.0002] # EGYPTIAN HIEROGLYPH V001F -13369 ; [.517C.0020.0002] # EGYPTIAN HIEROGLYPH V001G -1336A ; [.517D.0020.0002] # EGYPTIAN HIEROGLYPH V001H -1336B ; [.517E.0020.0002] # EGYPTIAN HIEROGLYPH V001I -1336C ; [.517F.0020.0002] # EGYPTIAN HIEROGLYPH V002 -1336D ; [.5180.0020.0002] # EGYPTIAN HIEROGLYPH V002A -1336E ; [.5181.0020.0002] # EGYPTIAN HIEROGLYPH V003 -1336F ; [.5182.0020.0002] # EGYPTIAN HIEROGLYPH V004 -13370 ; [.5183.0020.0002] # EGYPTIAN HIEROGLYPH V005 -13371 ; [.5184.0020.0002] # EGYPTIAN HIEROGLYPH V006 -13372 ; [.5185.0020.0002] # EGYPTIAN HIEROGLYPH V007 -13373 ; [.5186.0020.0002] # EGYPTIAN HIEROGLYPH V007A -13374 ; [.5187.0020.0002] # EGYPTIAN HIEROGLYPH V007B -13375 ; [.5188.0020.0002] # EGYPTIAN HIEROGLYPH V008 -13376 ; [.5189.0020.0002] # EGYPTIAN HIEROGLYPH V009 -13377 ; [.518A.0020.0002] # EGYPTIAN HIEROGLYPH V010 -13378 ; [.518B.0020.0002] # EGYPTIAN HIEROGLYPH V011 -13379 ; [.518C.0020.0002] # EGYPTIAN HIEROGLYPH V011A -1337A ; [.518D.0020.0002] # EGYPTIAN HIEROGLYPH V011B -1337B ; [.518E.0020.0002] # EGYPTIAN HIEROGLYPH V011C -1337C ; [.518F.0020.0002] # EGYPTIAN HIEROGLYPH V012 -1337D ; [.5190.0020.0002] # EGYPTIAN HIEROGLYPH V012A -1337E ; [.5191.0020.0002] # EGYPTIAN HIEROGLYPH V012B -1337F ; [.5192.0020.0002] # EGYPTIAN HIEROGLYPH V013 -13380 ; [.5193.0020.0002] # EGYPTIAN HIEROGLYPH V014 -13381 ; [.5194.0020.0002] # EGYPTIAN HIEROGLYPH V015 -13382 ; [.5195.0020.0002] # EGYPTIAN HIEROGLYPH V016 -13383 ; [.5196.0020.0002] # EGYPTIAN HIEROGLYPH V017 -13384 ; [.5197.0020.0002] # EGYPTIAN HIEROGLYPH V018 -13385 ; [.5198.0020.0002] # EGYPTIAN HIEROGLYPH V019 -13386 ; [.5199.0020.0002] # EGYPTIAN HIEROGLYPH V020 -13387 ; [.519A.0020.0002] # EGYPTIAN HIEROGLYPH V020A -13388 ; [.519B.0020.0002] # EGYPTIAN HIEROGLYPH V020B -13389 ; [.519C.0020.0002] # EGYPTIAN HIEROGLYPH V020C -1338A ; [.519D.0020.0002] # EGYPTIAN HIEROGLYPH V020D -1338B ; [.519E.0020.0002] # EGYPTIAN HIEROGLYPH V020E -1338C ; [.519F.0020.0002] # EGYPTIAN HIEROGLYPH V020F -1338D ; [.51A0.0020.0002] # EGYPTIAN HIEROGLYPH V020G -1338E ; [.51A1.0020.0002] # EGYPTIAN HIEROGLYPH V020H -1338F ; [.51A2.0020.0002] # EGYPTIAN HIEROGLYPH V020I -13390 ; [.51A3.0020.0002] # EGYPTIAN HIEROGLYPH V020J -13391 ; [.51A4.0020.0002] # EGYPTIAN HIEROGLYPH V020K -13392 ; [.51A5.0020.0002] # EGYPTIAN HIEROGLYPH V020L -13393 ; [.51A6.0020.0002] # EGYPTIAN HIEROGLYPH V021 -13394 ; [.51A7.0020.0002] # EGYPTIAN HIEROGLYPH V022 -13395 ; [.51A8.0020.0002] # EGYPTIAN HIEROGLYPH V023 -13396 ; [.51A9.0020.0002] # EGYPTIAN HIEROGLYPH V023A -13397 ; [.51AA.0020.0002] # EGYPTIAN HIEROGLYPH V024 -13398 ; [.51AB.0020.0002] # EGYPTIAN HIEROGLYPH V025 -13399 ; [.51AC.0020.0002] # EGYPTIAN HIEROGLYPH V026 -1339A ; [.51AD.0020.0002] # EGYPTIAN HIEROGLYPH V027 -1339B ; [.51AE.0020.0002] # EGYPTIAN HIEROGLYPH V028 -1339C ; [.51AF.0020.0002] # EGYPTIAN HIEROGLYPH V028A -1339D ; [.51B0.0020.0002] # EGYPTIAN HIEROGLYPH V029 -1339E ; [.51B1.0020.0002] # EGYPTIAN HIEROGLYPH V029A -1339F ; [.51B2.0020.0002] # EGYPTIAN HIEROGLYPH V030 -133A0 ; [.51B3.0020.0002] # EGYPTIAN HIEROGLYPH V030A -133A1 ; [.51B4.0020.0002] # EGYPTIAN HIEROGLYPH V031 -133A2 ; [.51B5.0020.0002] # EGYPTIAN HIEROGLYPH V031A -133A3 ; [.51B6.0020.0002] # EGYPTIAN HIEROGLYPH V032 -133A4 ; [.51B7.0020.0002] # EGYPTIAN HIEROGLYPH V033 -133A5 ; [.51B8.0020.0002] # EGYPTIAN HIEROGLYPH V033A -133A6 ; [.51B9.0020.0002] # EGYPTIAN HIEROGLYPH V034 -133A7 ; [.51BA.0020.0002] # EGYPTIAN HIEROGLYPH V035 -133A8 ; [.51BB.0020.0002] # EGYPTIAN HIEROGLYPH V036 -133A9 ; [.51BC.0020.0002] # EGYPTIAN HIEROGLYPH V037 -133AA ; [.51BD.0020.0002] # EGYPTIAN HIEROGLYPH V037A -133AB ; [.51BE.0020.0002] # EGYPTIAN HIEROGLYPH V038 -133AC ; [.51BF.0020.0002] # EGYPTIAN HIEROGLYPH V039 -133AD ; [.51C0.0020.0002] # EGYPTIAN HIEROGLYPH V040 -133AE ; [.51C1.0020.0002] # EGYPTIAN HIEROGLYPH V040A -133AF ; [.51C2.0020.0002] # EGYPTIAN HIEROGLYPH W001 -133B0 ; [.51C3.0020.0002] # EGYPTIAN HIEROGLYPH W002 -133B1 ; [.51C4.0020.0002] # EGYPTIAN HIEROGLYPH W003 -133B2 ; [.51C5.0020.0002] # EGYPTIAN HIEROGLYPH W003A -133B3 ; [.51C6.0020.0002] # EGYPTIAN HIEROGLYPH W004 -133B4 ; [.51C7.0020.0002] # EGYPTIAN HIEROGLYPH W005 -133B5 ; [.51C8.0020.0002] # EGYPTIAN HIEROGLYPH W006 -133B6 ; [.51C9.0020.0002] # EGYPTIAN HIEROGLYPH W007 -133B7 ; [.51CA.0020.0002] # EGYPTIAN HIEROGLYPH W008 -133B8 ; [.51CB.0020.0002] # EGYPTIAN HIEROGLYPH W009 -133B9 ; [.51CC.0020.0002] # EGYPTIAN HIEROGLYPH W009A -133BA ; [.51CD.0020.0002] # EGYPTIAN HIEROGLYPH W010 -133BB ; [.51CE.0020.0002] # EGYPTIAN HIEROGLYPH W010A -133BC ; [.51CF.0020.0002] # EGYPTIAN HIEROGLYPH W011 -133BD ; [.51D0.0020.0002] # EGYPTIAN HIEROGLYPH W012 -133BE ; [.51D1.0020.0002] # EGYPTIAN HIEROGLYPH W013 -133BF ; [.51D2.0020.0002] # EGYPTIAN HIEROGLYPH W014 -133C0 ; [.51D3.0020.0002] # EGYPTIAN HIEROGLYPH W014A -133C1 ; [.51D4.0020.0002] # EGYPTIAN HIEROGLYPH W015 -133C2 ; [.51D5.0020.0002] # EGYPTIAN HIEROGLYPH W016 -133C3 ; [.51D6.0020.0002] # EGYPTIAN HIEROGLYPH W017 -133C4 ; [.51D7.0020.0002] # EGYPTIAN HIEROGLYPH W017A -133C5 ; [.51D8.0020.0002] # EGYPTIAN HIEROGLYPH W018 -133C6 ; [.51D9.0020.0002] # EGYPTIAN HIEROGLYPH W018A -133C7 ; [.51DA.0020.0002] # EGYPTIAN HIEROGLYPH W019 -133C8 ; [.51DB.0020.0002] # EGYPTIAN HIEROGLYPH W020 -133C9 ; [.51DC.0020.0002] # EGYPTIAN HIEROGLYPH W021 -133CA ; [.51DD.0020.0002] # EGYPTIAN HIEROGLYPH W022 -133CB ; [.51DE.0020.0002] # EGYPTIAN HIEROGLYPH W023 -133CC ; [.51DF.0020.0002] # EGYPTIAN HIEROGLYPH W024 -133CD ; [.51E0.0020.0002] # EGYPTIAN HIEROGLYPH W024A -133CE ; [.51E1.0020.0002] # EGYPTIAN HIEROGLYPH W025 -133CF ; [.51E2.0020.0002] # EGYPTIAN HIEROGLYPH X001 -133D0 ; [.51E3.0020.0002] # EGYPTIAN HIEROGLYPH X002 -133D1 ; [.51E4.0020.0002] # EGYPTIAN HIEROGLYPH X003 -133D2 ; [.51E5.0020.0002] # EGYPTIAN HIEROGLYPH X004 -133D3 ; [.51E6.0020.0002] # EGYPTIAN HIEROGLYPH X004A -133D4 ; [.51E7.0020.0002] # EGYPTIAN HIEROGLYPH X004B -133D5 ; [.51E8.0020.0002] # EGYPTIAN HIEROGLYPH X005 -133D6 ; [.51E9.0020.0002] # EGYPTIAN HIEROGLYPH X006 -133D7 ; [.51EA.0020.0002] # EGYPTIAN HIEROGLYPH X006A -133D8 ; [.51EB.0020.0002] # EGYPTIAN HIEROGLYPH X007 -133D9 ; [.51EC.0020.0002] # EGYPTIAN HIEROGLYPH X008 -133DA ; [.51ED.0020.0002] # EGYPTIAN HIEROGLYPH X008A -133DB ; [.51EE.0020.0002] # EGYPTIAN HIEROGLYPH Y001 -133DC ; [.51EF.0020.0002] # EGYPTIAN HIEROGLYPH Y001A -133DD ; [.51F0.0020.0002] # EGYPTIAN HIEROGLYPH Y002 -133DE ; [.51F1.0020.0002] # EGYPTIAN HIEROGLYPH Y003 -133DF ; [.51F2.0020.0002] # EGYPTIAN HIEROGLYPH Y004 -133E0 ; [.51F3.0020.0002] # EGYPTIAN HIEROGLYPH Y005 -133E1 ; [.51F4.0020.0002] # EGYPTIAN HIEROGLYPH Y006 -133E2 ; [.51F5.0020.0002] # EGYPTIAN HIEROGLYPH Y007 -133E3 ; [.51F6.0020.0002] # EGYPTIAN HIEROGLYPH Y008 -133E4 ; [.51F7.0020.0002] # EGYPTIAN HIEROGLYPH Z001 -133E5 ; [.51F8.0020.0002] # EGYPTIAN HIEROGLYPH Z002 -133E6 ; [.51F9.0020.0002] # EGYPTIAN HIEROGLYPH Z002A -133E7 ; [.51FA.0020.0002] # EGYPTIAN HIEROGLYPH Z002B -133E8 ; [.51FB.0020.0002] # EGYPTIAN HIEROGLYPH Z002C -133E9 ; [.51FC.0020.0002] # EGYPTIAN HIEROGLYPH Z002D -133EA ; [.51FD.0020.0002] # EGYPTIAN HIEROGLYPH Z003 -133EB ; [.51FE.0020.0002] # EGYPTIAN HIEROGLYPH Z003A -133EC ; [.51FF.0020.0002] # EGYPTIAN HIEROGLYPH Z003B -133ED ; [.5200.0020.0002] # EGYPTIAN HIEROGLYPH Z004 -133EE ; [.5201.0020.0002] # EGYPTIAN HIEROGLYPH Z004A -133EF ; [.5202.0020.0002] # EGYPTIAN HIEROGLYPH Z005 -133F0 ; [.5203.0020.0002] # EGYPTIAN HIEROGLYPH Z005A -133F1 ; [.5204.0020.0002] # EGYPTIAN HIEROGLYPH Z006 -133F2 ; [.5205.0020.0002] # EGYPTIAN HIEROGLYPH Z007 -133F3 ; [.5206.0020.0002] # EGYPTIAN HIEROGLYPH Z008 -133F4 ; [.5207.0020.0002] # EGYPTIAN HIEROGLYPH Z009 -133F5 ; [.5208.0020.0002] # EGYPTIAN HIEROGLYPH Z010 -133F6 ; [.5209.0020.0002] # EGYPTIAN HIEROGLYPH Z011 -133F7 ; [.520A.0020.0002] # EGYPTIAN HIEROGLYPH Z012 -133F8 ; [.520B.0020.0002] # EGYPTIAN HIEROGLYPH Z013 -133F9 ; [.520C.0020.0002] # EGYPTIAN HIEROGLYPH Z014 -133FA ; [.520D.0020.0002] # EGYPTIAN HIEROGLYPH Z015 -133FB ; [.520E.0020.0002] # EGYPTIAN HIEROGLYPH Z015A -133FC ; [.520F.0020.0002] # EGYPTIAN HIEROGLYPH Z015B -133FD ; [.5210.0020.0002] # EGYPTIAN HIEROGLYPH Z015C -133FE ; [.5211.0020.0002] # EGYPTIAN HIEROGLYPH Z015D -133FF ; [.5212.0020.0002] # EGYPTIAN HIEROGLYPH Z015E -13400 ; [.5213.0020.0002] # EGYPTIAN HIEROGLYPH Z015F -13401 ; [.5214.0020.0002] # EGYPTIAN HIEROGLYPH Z015G -13402 ; [.5215.0020.0002] # EGYPTIAN HIEROGLYPH Z015H -13403 ; [.5216.0020.0002] # EGYPTIAN HIEROGLYPH Z015I -13404 ; [.5217.0020.0002] # EGYPTIAN HIEROGLYPH Z016 -13405 ; [.5218.0020.0002] # EGYPTIAN HIEROGLYPH Z016A -13406 ; [.5219.0020.0002] # EGYPTIAN HIEROGLYPH Z016B -13407 ; [.521A.0020.0002] # EGYPTIAN HIEROGLYPH Z016C -13408 ; [.521B.0020.0002] # EGYPTIAN HIEROGLYPH Z016D -13409 ; [.521C.0020.0002] # EGYPTIAN HIEROGLYPH Z016E -1340A ; [.521D.0020.0002] # EGYPTIAN HIEROGLYPH Z016F -1340B ; [.521E.0020.0002] # EGYPTIAN HIEROGLYPH Z016G -1340C ; [.521F.0020.0002] # EGYPTIAN HIEROGLYPH Z016H -1340D ; [.5220.0020.0002] # EGYPTIAN HIEROGLYPH AA001 -1340E ; [.5221.0020.0002] # EGYPTIAN HIEROGLYPH AA002 -1340F ; [.5222.0020.0002] # EGYPTIAN HIEROGLYPH AA003 -13410 ; [.5223.0020.0002] # EGYPTIAN HIEROGLYPH AA004 -13411 ; [.5224.0020.0002] # EGYPTIAN HIEROGLYPH AA005 -13412 ; [.5225.0020.0002] # EGYPTIAN HIEROGLYPH AA006 -13413 ; [.5226.0020.0002] # EGYPTIAN HIEROGLYPH AA007 -13414 ; [.5227.0020.0002] # EGYPTIAN HIEROGLYPH AA007A -13415 ; [.5228.0020.0002] # EGYPTIAN HIEROGLYPH AA007B -13416 ; [.5229.0020.0002] # EGYPTIAN HIEROGLYPH AA008 -13417 ; [.522A.0020.0002] # EGYPTIAN HIEROGLYPH AA009 -13418 ; [.522B.0020.0002] # EGYPTIAN HIEROGLYPH AA010 -13419 ; [.522C.0020.0002] # EGYPTIAN HIEROGLYPH AA011 -1341A ; [.522D.0020.0002] # EGYPTIAN HIEROGLYPH AA012 -1341B ; [.522E.0020.0002] # EGYPTIAN HIEROGLYPH AA013 -1341C ; [.522F.0020.0002] # EGYPTIAN HIEROGLYPH AA014 -1341D ; [.5230.0020.0002] # EGYPTIAN HIEROGLYPH AA015 -1341E ; [.5231.0020.0002] # EGYPTIAN HIEROGLYPH AA016 -1341F ; [.5232.0020.0002] # EGYPTIAN HIEROGLYPH AA017 -13420 ; [.5233.0020.0002] # EGYPTIAN HIEROGLYPH AA018 -13421 ; [.5234.0020.0002] # EGYPTIAN HIEROGLYPH AA019 -13422 ; [.5235.0020.0002] # EGYPTIAN HIEROGLYPH AA020 -13423 ; [.5236.0020.0002] # EGYPTIAN HIEROGLYPH AA021 -13424 ; [.5237.0020.0002] # EGYPTIAN HIEROGLYPH AA022 -13425 ; [.5238.0020.0002] # EGYPTIAN HIEROGLYPH AA023 -13426 ; [.5239.0020.0002] # EGYPTIAN HIEROGLYPH AA024 -13427 ; [.523A.0020.0002] # EGYPTIAN HIEROGLYPH AA025 -13428 ; [.523B.0020.0002] # EGYPTIAN HIEROGLYPH AA026 -13429 ; [.523C.0020.0002] # EGYPTIAN HIEROGLYPH AA027 -1342A ; [.523D.0020.0002] # EGYPTIAN HIEROGLYPH AA028 -1342B ; [.523E.0020.0002] # EGYPTIAN HIEROGLYPH AA029 -1342C ; [.523F.0020.0002] # EGYPTIAN HIEROGLYPH AA030 -1342D ; [.5240.0020.0002] # EGYPTIAN HIEROGLYPH AA031 -1342E ; [.5241.0020.0002] # EGYPTIAN HIEROGLYPH AA032 -109A0 ; [.5242.0020.0002] # MEROITIC CURSIVE LETTER A -10980 ; [.5242.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER A -109A1 ; [.5243.0020.0002] # MEROITIC CURSIVE LETTER E -10981 ; [.5243.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER E -109A2 ; [.5244.0020.0002] # MEROITIC CURSIVE LETTER I -10982 ; [.5244.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER I -109A3 ; [.5245.0020.0002] # MEROITIC CURSIVE LETTER O -10983 ; [.5245.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER O -109A4 ; [.5246.0020.0002] # MEROITIC CURSIVE LETTER YA -10984 ; [.5246.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER YA -109A5 ; [.5247.0020.0002] # MEROITIC CURSIVE LETTER WA -10985 ; [.5247.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER WA -109A6 ; [.5248.0020.0002] # MEROITIC CURSIVE LETTER BA -10986 ; [.5248.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER BA -10987 ; [.5248.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER BA-2 -109A7 ; [.5249.0020.0002] # MEROITIC CURSIVE LETTER PA -10988 ; [.5249.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER PA -109A8 ; [.524A.0020.0002] # MEROITIC CURSIVE LETTER MA -10989 ; [.524A.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER MA -109A9 ; [.524B.0020.0002] # MEROITIC CURSIVE LETTER NA -1098A ; [.524B.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER NA -1098B ; [.524B.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER NA-2 -109AA ; [.524C.0020.0002] # MEROITIC CURSIVE LETTER NE -1098C ; [.524C.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER NE -1098D ; [.524C.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER NE-2 -109AB ; [.524D.0020.0002] # MEROITIC CURSIVE LETTER RA -1098E ; [.524D.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER RA -1098F ; [.524D.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER RA-2 -109AC ; [.524E.0020.0002] # MEROITIC CURSIVE LETTER LA -10990 ; [.524E.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER LA -109AD ; [.524F.0020.0002] # MEROITIC CURSIVE LETTER KHA -10991 ; [.524F.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER KHA -109AE ; [.5250.0020.0002] # MEROITIC CURSIVE LETTER HHA -10992 ; [.5250.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER HHA -109AF ; [.5251.0020.0002] # MEROITIC CURSIVE LETTER SA -109B0 ; [.5251.0020.0004][.0000.0110.0004] # MEROITIC CURSIVE LETTER ARCHAIC SA -10993 ; [.5251.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER SA -10994 ; [.5251.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER SA-2 -109B1 ; [.5252.0020.0002] # MEROITIC CURSIVE LETTER SE -10995 ; [.5252.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER SE -109B2 ; [.5253.0020.0002] # MEROITIC CURSIVE LETTER KA -10996 ; [.5253.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER KA -109B3 ; [.5254.0020.0002] # MEROITIC CURSIVE LETTER QA -10997 ; [.5254.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER QA -109B4 ; [.5255.0020.0002] # MEROITIC CURSIVE LETTER TA -10998 ; [.5255.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER TA -10999 ; [.5255.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER TA-2 -109B5 ; [.5256.0020.0002] # MEROITIC CURSIVE LETTER TE -1099A ; [.5256.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER TE -1099B ; [.5256.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER TE-2 -109B6 ; [.5257.0020.0002] # MEROITIC CURSIVE LETTER TO -1099C ; [.5257.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER TO -109B7 ; [.5258.0020.0002] # MEROITIC CURSIVE LETTER DA -1099D ; [.5258.0020.0004][.0000.0110.0004] # MEROITIC HIEROGLYPHIC LETTER DA -109BE ; [.5259.0020.0002] # MEROITIC CURSIVE LOGOGRAM RMT -109BF ; [.525A.0020.0002] # MEROITIC CURSIVE LOGOGRAM IMN -1099E ; [.525B.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ -1099F ; [.525C.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 -14400 ; [.525D.0020.0002] # ANATOLIAN HIEROGLYPH A001 -14401 ; [.525E.0020.0002] # ANATOLIAN HIEROGLYPH A002 -14402 ; [.525F.0020.0002] # ANATOLIAN HIEROGLYPH A003 -14403 ; [.5260.0020.0002] # ANATOLIAN HIEROGLYPH A004 -14404 ; [.5261.0020.0002] # ANATOLIAN HIEROGLYPH A005 -14405 ; [.5262.0020.0002] # ANATOLIAN HIEROGLYPH A006 -14406 ; [.5263.0020.0002] # ANATOLIAN HIEROGLYPH A007 -14407 ; [.5264.0020.0002] # ANATOLIAN HIEROGLYPH A008 -14408 ; [.5265.0020.0002] # ANATOLIAN HIEROGLYPH A009 -14409 ; [.5266.0020.0002] # ANATOLIAN HIEROGLYPH A010 -1440A ; [.5267.0020.0002] # ANATOLIAN HIEROGLYPH A010A -1440B ; [.5268.0020.0002] # ANATOLIAN HIEROGLYPH A011 -1440C ; [.5269.0020.0002] # ANATOLIAN HIEROGLYPH A012 -1440D ; [.526A.0020.0002] # ANATOLIAN HIEROGLYPH A013 -1440E ; [.526B.0020.0002] # ANATOLIAN HIEROGLYPH A014 -1440F ; [.526C.0020.0002] # ANATOLIAN HIEROGLYPH A015 -14410 ; [.526D.0020.0002] # ANATOLIAN HIEROGLYPH A016 -14411 ; [.526E.0020.0002] # ANATOLIAN HIEROGLYPH A017 -14412 ; [.526F.0020.0002] # ANATOLIAN HIEROGLYPH A018 -14413 ; [.5270.0020.0002] # ANATOLIAN HIEROGLYPH A019 -14414 ; [.5271.0020.0002] # ANATOLIAN HIEROGLYPH A020 -14415 ; [.5272.0020.0002] # ANATOLIAN HIEROGLYPH A021 -14416 ; [.5273.0020.0002] # ANATOLIAN HIEROGLYPH A022 -14417 ; [.5274.0020.0002] # ANATOLIAN HIEROGLYPH A023 -14418 ; [.5275.0020.0002] # ANATOLIAN HIEROGLYPH A024 -14419 ; [.5276.0020.0002] # ANATOLIAN HIEROGLYPH A025 -1441A ; [.5277.0020.0002] # ANATOLIAN HIEROGLYPH A026 -1441B ; [.5278.0020.0002] # ANATOLIAN HIEROGLYPH A026A -1441C ; [.5279.0020.0002] # ANATOLIAN HIEROGLYPH A027 -1441D ; [.527A.0020.0002] # ANATOLIAN HIEROGLYPH A028 -1441E ; [.527B.0020.0002] # ANATOLIAN HIEROGLYPH A029 -1441F ; [.527C.0020.0002] # ANATOLIAN HIEROGLYPH A030 -14420 ; [.527D.0020.0002] # ANATOLIAN HIEROGLYPH A031 -14421 ; [.527E.0020.0002] # ANATOLIAN HIEROGLYPH A032 -14422 ; [.527F.0020.0002] # ANATOLIAN HIEROGLYPH A033 -14423 ; [.5280.0020.0002] # ANATOLIAN HIEROGLYPH A034 -14424 ; [.5281.0020.0002] # ANATOLIAN HIEROGLYPH A035 -14425 ; [.5282.0020.0002] # ANATOLIAN HIEROGLYPH A036 -14426 ; [.5283.0020.0002] # ANATOLIAN HIEROGLYPH A037 -14427 ; [.5284.0020.0002] # ANATOLIAN HIEROGLYPH A038 -14428 ; [.5285.0020.0002] # ANATOLIAN HIEROGLYPH A039 -14429 ; [.5286.0020.0002] # ANATOLIAN HIEROGLYPH A039A -1442A ; [.5287.0020.0002] # ANATOLIAN HIEROGLYPH A040 -1442B ; [.5288.0020.0002] # ANATOLIAN HIEROGLYPH A041 -1442C ; [.5289.0020.0002] # ANATOLIAN HIEROGLYPH A041A -1442D ; [.528A.0020.0002] # ANATOLIAN HIEROGLYPH A042 -1442E ; [.528B.0020.0002] # ANATOLIAN HIEROGLYPH A043 -1442F ; [.528C.0020.0002] # ANATOLIAN HIEROGLYPH A044 -14430 ; [.528D.0020.0002] # ANATOLIAN HIEROGLYPH A045 -14431 ; [.528E.0020.0002] # ANATOLIAN HIEROGLYPH A045A -14432 ; [.528F.0020.0002] # ANATOLIAN HIEROGLYPH A046 -14433 ; [.5290.0020.0002] # ANATOLIAN HIEROGLYPH A046A -14434 ; [.5291.0020.0002] # ANATOLIAN HIEROGLYPH A046B -14435 ; [.5292.0020.0002] # ANATOLIAN HIEROGLYPH A047 -14436 ; [.5293.0020.0002] # ANATOLIAN HIEROGLYPH A048 -14437 ; [.5294.0020.0002] # ANATOLIAN HIEROGLYPH A049 -14438 ; [.5295.0020.0002] # ANATOLIAN HIEROGLYPH A050 -14439 ; [.5296.0020.0002] # ANATOLIAN HIEROGLYPH A051 -1443A ; [.5297.0020.0002] # ANATOLIAN HIEROGLYPH A052 -1443B ; [.5298.0020.0002] # ANATOLIAN HIEROGLYPH A053 -1443C ; [.5299.0020.0002] # ANATOLIAN HIEROGLYPH A054 -1443D ; [.529A.0020.0002] # ANATOLIAN HIEROGLYPH A055 -1443E ; [.529B.0020.0002] # ANATOLIAN HIEROGLYPH A056 -1443F ; [.529C.0020.0002] # ANATOLIAN HIEROGLYPH A057 -14440 ; [.529D.0020.0002] # ANATOLIAN HIEROGLYPH A058 -14441 ; [.529E.0020.0002] # ANATOLIAN HIEROGLYPH A059 -14442 ; [.529F.0020.0002] # ANATOLIAN HIEROGLYPH A060 -14443 ; [.52A0.0020.0002] # ANATOLIAN HIEROGLYPH A061 -14444 ; [.52A1.0020.0002] # ANATOLIAN HIEROGLYPH A062 -14445 ; [.52A2.0020.0002] # ANATOLIAN HIEROGLYPH A063 -14446 ; [.52A3.0020.0002] # ANATOLIAN HIEROGLYPH A064 -14447 ; [.52A4.0020.0002] # ANATOLIAN HIEROGLYPH A065 -14448 ; [.52A5.0020.0002] # ANATOLIAN HIEROGLYPH A066 -14449 ; [.52A6.0020.0002] # ANATOLIAN HIEROGLYPH A066A -1444A ; [.52A7.0020.0002] # ANATOLIAN HIEROGLYPH A066B -1444B ; [.52A8.0020.0002] # ANATOLIAN HIEROGLYPH A066C -1444C ; [.52A9.0020.0002] # ANATOLIAN HIEROGLYPH A067 -1444D ; [.52AA.0020.0002] # ANATOLIAN HIEROGLYPH A068 -1444E ; [.52AB.0020.0002] # ANATOLIAN HIEROGLYPH A069 -1444F ; [.52AC.0020.0002] # ANATOLIAN HIEROGLYPH A070 -14450 ; [.52AD.0020.0002] # ANATOLIAN HIEROGLYPH A071 -14451 ; [.52AE.0020.0002] # ANATOLIAN HIEROGLYPH A072 -14452 ; [.52AF.0020.0002] # ANATOLIAN HIEROGLYPH A073 -14453 ; [.52B0.0020.0002] # ANATOLIAN HIEROGLYPH A074 -14454 ; [.52B1.0020.0002] # ANATOLIAN HIEROGLYPH A075 -14455 ; [.52B2.0020.0002] # ANATOLIAN HIEROGLYPH A076 -14456 ; [.52B3.0020.0002] # ANATOLIAN HIEROGLYPH A077 -14457 ; [.52B4.0020.0002] # ANATOLIAN HIEROGLYPH A078 -14458 ; [.52B5.0020.0002] # ANATOLIAN HIEROGLYPH A079 -14459 ; [.52B6.0020.0002] # ANATOLIAN HIEROGLYPH A080 -1445A ; [.52B7.0020.0002] # ANATOLIAN HIEROGLYPH A081 -1445B ; [.52B8.0020.0002] # ANATOLIAN HIEROGLYPH A082 -1445C ; [.52B9.0020.0002] # ANATOLIAN HIEROGLYPH A083 -1445D ; [.52BA.0020.0002] # ANATOLIAN HIEROGLYPH A084 -1445E ; [.52BB.0020.0002] # ANATOLIAN HIEROGLYPH A085 -1445F ; [.52BC.0020.0002] # ANATOLIAN HIEROGLYPH A086 -14460 ; [.52BD.0020.0002] # ANATOLIAN HIEROGLYPH A087 -14461 ; [.52BE.0020.0002] # ANATOLIAN HIEROGLYPH A088 -14462 ; [.52BF.0020.0002] # ANATOLIAN HIEROGLYPH A089 -14463 ; [.52C0.0020.0002] # ANATOLIAN HIEROGLYPH A090 -14464 ; [.52C1.0020.0002] # ANATOLIAN HIEROGLYPH A091 -14465 ; [.52C2.0020.0002] # ANATOLIAN HIEROGLYPH A092 -14466 ; [.52C3.0020.0002] # ANATOLIAN HIEROGLYPH A093 -14467 ; [.52C4.0020.0002] # ANATOLIAN HIEROGLYPH A094 -14468 ; [.52C5.0020.0002] # ANATOLIAN HIEROGLYPH A095 -14469 ; [.52C6.0020.0002] # ANATOLIAN HIEROGLYPH A096 -1446A ; [.52C7.0020.0002] # ANATOLIAN HIEROGLYPH A097 -1446B ; [.52C8.0020.0002] # ANATOLIAN HIEROGLYPH A097A -1446C ; [.52C9.0020.0002] # ANATOLIAN HIEROGLYPH A098 -1446D ; [.52CA.0020.0002] # ANATOLIAN HIEROGLYPH A098A -1446E ; [.52CB.0020.0002] # ANATOLIAN HIEROGLYPH A099 -1446F ; [.52CC.0020.0002] # ANATOLIAN HIEROGLYPH A100 -14470 ; [.52CD.0020.0002] # ANATOLIAN HIEROGLYPH A100A -14471 ; [.52CE.0020.0002] # ANATOLIAN HIEROGLYPH A101 -14472 ; [.52CF.0020.0002] # ANATOLIAN HIEROGLYPH A101A -14473 ; [.52D0.0020.0002] # ANATOLIAN HIEROGLYPH A102 -14474 ; [.52D1.0020.0002] # ANATOLIAN HIEROGLYPH A102A -14475 ; [.52D2.0020.0002] # ANATOLIAN HIEROGLYPH A103 -14476 ; [.52D3.0020.0002] # ANATOLIAN HIEROGLYPH A104 -14477 ; [.52D4.0020.0002] # ANATOLIAN HIEROGLYPH A104A -14478 ; [.52D5.0020.0002] # ANATOLIAN HIEROGLYPH A104B -14479 ; [.52D6.0020.0002] # ANATOLIAN HIEROGLYPH A104C -1447A ; [.52D7.0020.0002] # ANATOLIAN HIEROGLYPH A105 -1447B ; [.52D8.0020.0002] # ANATOLIAN HIEROGLYPH A105A -1447C ; [.52D9.0020.0002] # ANATOLIAN HIEROGLYPH A105B -1447D ; [.52DA.0020.0002] # ANATOLIAN HIEROGLYPH A106 -1447E ; [.52DB.0020.0002] # ANATOLIAN HIEROGLYPH A107 -1447F ; [.52DC.0020.0002] # ANATOLIAN HIEROGLYPH A107A -14480 ; [.52DD.0020.0002] # ANATOLIAN HIEROGLYPH A107B -14481 ; [.52DE.0020.0002] # ANATOLIAN HIEROGLYPH A107C -14482 ; [.52DF.0020.0002] # ANATOLIAN HIEROGLYPH A108 -14483 ; [.52E0.0020.0002] # ANATOLIAN HIEROGLYPH A109 -14484 ; [.52E1.0020.0002] # ANATOLIAN HIEROGLYPH A110 -14485 ; [.52E2.0020.0002] # ANATOLIAN HIEROGLYPH A110A -14486 ; [.52E3.0020.0002] # ANATOLIAN HIEROGLYPH A110B -14487 ; [.52E4.0020.0002] # ANATOLIAN HIEROGLYPH A111 -14488 ; [.52E5.0020.0002] # ANATOLIAN HIEROGLYPH A112 -14489 ; [.52E6.0020.0002] # ANATOLIAN HIEROGLYPH A113 -1448A ; [.52E7.0020.0002] # ANATOLIAN HIEROGLYPH A114 -1448B ; [.52E8.0020.0002] # ANATOLIAN HIEROGLYPH A115 -1448C ; [.52E9.0020.0002] # ANATOLIAN HIEROGLYPH A115A -1448D ; [.52EA.0020.0002] # ANATOLIAN HIEROGLYPH A116 -1448E ; [.52EB.0020.0002] # ANATOLIAN HIEROGLYPH A117 -1448F ; [.52EC.0020.0002] # ANATOLIAN HIEROGLYPH A118 -14490 ; [.52ED.0020.0002] # ANATOLIAN HIEROGLYPH A119 -14491 ; [.52EE.0020.0002] # ANATOLIAN HIEROGLYPH A120 -14492 ; [.52EF.0020.0002] # ANATOLIAN HIEROGLYPH A121 -14493 ; [.52F0.0020.0002] # ANATOLIAN HIEROGLYPH A122 -14494 ; [.52F1.0020.0002] # ANATOLIAN HIEROGLYPH A123 -14495 ; [.52F2.0020.0002] # ANATOLIAN HIEROGLYPH A124 -14496 ; [.52F3.0020.0002] # ANATOLIAN HIEROGLYPH A125 -14497 ; [.52F4.0020.0002] # ANATOLIAN HIEROGLYPH A125A -14498 ; [.52F5.0020.0002] # ANATOLIAN HIEROGLYPH A126 -14499 ; [.52F6.0020.0002] # ANATOLIAN HIEROGLYPH A127 -1449A ; [.52F7.0020.0002] # ANATOLIAN HIEROGLYPH A128 -1449B ; [.52F8.0020.0002] # ANATOLIAN HIEROGLYPH A129 -1449C ; [.52F9.0020.0002] # ANATOLIAN HIEROGLYPH A130 -1449D ; [.52FA.0020.0002] # ANATOLIAN HIEROGLYPH A131 -1449E ; [.52FB.0020.0002] # ANATOLIAN HIEROGLYPH A132 -1449F ; [.52FC.0020.0002] # ANATOLIAN HIEROGLYPH A133 -144A0 ; [.52FD.0020.0002] # ANATOLIAN HIEROGLYPH A134 -144A1 ; [.52FE.0020.0002] # ANATOLIAN HIEROGLYPH A135 -144A2 ; [.52FF.0020.0002] # ANATOLIAN HIEROGLYPH A135A -144A3 ; [.5300.0020.0002] # ANATOLIAN HIEROGLYPH A136 -144A4 ; [.5301.0020.0002] # ANATOLIAN HIEROGLYPH A137 -144A5 ; [.5302.0020.0002] # ANATOLIAN HIEROGLYPH A138 -144A6 ; [.5303.0020.0002] # ANATOLIAN HIEROGLYPH A139 -144A7 ; [.5304.0020.0002] # ANATOLIAN HIEROGLYPH A140 -144A8 ; [.5305.0020.0002] # ANATOLIAN HIEROGLYPH A141 -144A9 ; [.5306.0020.0002] # ANATOLIAN HIEROGLYPH A142 -144AA ; [.5307.0020.0002] # ANATOLIAN HIEROGLYPH A143 -144AB ; [.5308.0020.0002] # ANATOLIAN HIEROGLYPH A144 -144AC ; [.5309.0020.0002] # ANATOLIAN HIEROGLYPH A145 -144AD ; [.530A.0020.0002] # ANATOLIAN HIEROGLYPH A146 -144AE ; [.530B.0020.0002] # ANATOLIAN HIEROGLYPH A147 -144AF ; [.530C.0020.0002] # ANATOLIAN HIEROGLYPH A148 -144B0 ; [.530D.0020.0002] # ANATOLIAN HIEROGLYPH A149 -144B1 ; [.530E.0020.0002] # ANATOLIAN HIEROGLYPH A150 -144B2 ; [.530F.0020.0002] # ANATOLIAN HIEROGLYPH A151 -144B3 ; [.5310.0020.0002] # ANATOLIAN HIEROGLYPH A152 -144B4 ; [.5311.0020.0002] # ANATOLIAN HIEROGLYPH A153 -144B5 ; [.5312.0020.0002] # ANATOLIAN HIEROGLYPH A154 -144B6 ; [.5313.0020.0002] # ANATOLIAN HIEROGLYPH A155 -144B7 ; [.5314.0020.0002] # ANATOLIAN HIEROGLYPH A156 -144B8 ; [.5315.0020.0002] # ANATOLIAN HIEROGLYPH A157 -144B9 ; [.5316.0020.0002] # ANATOLIAN HIEROGLYPH A158 -144BA ; [.5317.0020.0002] # ANATOLIAN HIEROGLYPH A159 -144BB ; [.5318.0020.0002] # ANATOLIAN HIEROGLYPH A160 -144BC ; [.5319.0020.0002] # ANATOLIAN HIEROGLYPH A161 -144BD ; [.531A.0020.0002] # ANATOLIAN HIEROGLYPH A162 -144BE ; [.531B.0020.0002] # ANATOLIAN HIEROGLYPH A163 -144BF ; [.531C.0020.0002] # ANATOLIAN HIEROGLYPH A164 -144C0 ; [.531D.0020.0002] # ANATOLIAN HIEROGLYPH A165 -144C1 ; [.531E.0020.0002] # ANATOLIAN HIEROGLYPH A166 -144C2 ; [.531F.0020.0002] # ANATOLIAN HIEROGLYPH A167 -144C3 ; [.5320.0020.0002] # ANATOLIAN HIEROGLYPH A168 -144C4 ; [.5321.0020.0002] # ANATOLIAN HIEROGLYPH A169 -144C5 ; [.5322.0020.0002] # ANATOLIAN HIEROGLYPH A170 -144C6 ; [.5323.0020.0002] # ANATOLIAN HIEROGLYPH A171 -144C7 ; [.5324.0020.0002] # ANATOLIAN HIEROGLYPH A172 -144C8 ; [.5325.0020.0002] # ANATOLIAN HIEROGLYPH A173 -144C9 ; [.5326.0020.0002] # ANATOLIAN HIEROGLYPH A174 -144CA ; [.5327.0020.0002] # ANATOLIAN HIEROGLYPH A175 -144CB ; [.5328.0020.0002] # ANATOLIAN HIEROGLYPH A176 -144CC ; [.5329.0020.0002] # ANATOLIAN HIEROGLYPH A177 -144CD ; [.532A.0020.0002] # ANATOLIAN HIEROGLYPH A178 -144CE ; [.532B.0020.0002] # ANATOLIAN HIEROGLYPH A179 -144CF ; [.532C.0020.0002] # ANATOLIAN HIEROGLYPH A180 -144D0 ; [.532D.0020.0002] # ANATOLIAN HIEROGLYPH A181 -144D1 ; [.532E.0020.0002] # ANATOLIAN HIEROGLYPH A182 -144D2 ; [.532F.0020.0002] # ANATOLIAN HIEROGLYPH A183 -144D3 ; [.5330.0020.0002] # ANATOLIAN HIEROGLYPH A184 -144D4 ; [.5331.0020.0002] # ANATOLIAN HIEROGLYPH A185 -144D5 ; [.5332.0020.0002] # ANATOLIAN HIEROGLYPH A186 -144D6 ; [.5333.0020.0002] # ANATOLIAN HIEROGLYPH A187 -144D7 ; [.5334.0020.0002] # ANATOLIAN HIEROGLYPH A188 -144D8 ; [.5335.0020.0002] # ANATOLIAN HIEROGLYPH A189 -144D9 ; [.5336.0020.0002] # ANATOLIAN HIEROGLYPH A190 -144DA ; [.5337.0020.0002] # ANATOLIAN HIEROGLYPH A191 -144DB ; [.5338.0020.0002] # ANATOLIAN HIEROGLYPH A192 -144DC ; [.5339.0020.0002] # ANATOLIAN HIEROGLYPH A193 -144DD ; [.533A.0020.0002] # ANATOLIAN HIEROGLYPH A194 -144DE ; [.533B.0020.0002] # ANATOLIAN HIEROGLYPH A195 -144DF ; [.533C.0020.0002] # ANATOLIAN HIEROGLYPH A196 -144E0 ; [.533D.0020.0002] # ANATOLIAN HIEROGLYPH A197 -144E1 ; [.533E.0020.0002] # ANATOLIAN HIEROGLYPH A198 -144E2 ; [.533F.0020.0002] # ANATOLIAN HIEROGLYPH A199 -144E3 ; [.5340.0020.0002] # ANATOLIAN HIEROGLYPH A200 -144E4 ; [.5341.0020.0002] # ANATOLIAN HIEROGLYPH A201 -144E5 ; [.5342.0020.0002] # ANATOLIAN HIEROGLYPH A202 -144E6 ; [.5343.0020.0002] # ANATOLIAN HIEROGLYPH A202A -144E7 ; [.5344.0020.0002] # ANATOLIAN HIEROGLYPH A202B -144E8 ; [.5345.0020.0002] # ANATOLIAN HIEROGLYPH A203 -144E9 ; [.5346.0020.0002] # ANATOLIAN HIEROGLYPH A204 -144EA ; [.5347.0020.0002] # ANATOLIAN HIEROGLYPH A205 -144EB ; [.5348.0020.0002] # ANATOLIAN HIEROGLYPH A206 -144EC ; [.5349.0020.0002] # ANATOLIAN HIEROGLYPH A207 -144ED ; [.534A.0020.0002] # ANATOLIAN HIEROGLYPH A207A -144EE ; [.534B.0020.0002] # ANATOLIAN HIEROGLYPH A208 -144EF ; [.534C.0020.0002] # ANATOLIAN HIEROGLYPH A209 -144F0 ; [.534D.0020.0002] # ANATOLIAN HIEROGLYPH A209A -144F1 ; [.534E.0020.0002] # ANATOLIAN HIEROGLYPH A210 -144F2 ; [.534F.0020.0002] # ANATOLIAN HIEROGLYPH A211 -144F3 ; [.5350.0020.0002] # ANATOLIAN HIEROGLYPH A212 -144F4 ; [.5351.0020.0002] # ANATOLIAN HIEROGLYPH A213 -144F5 ; [.5352.0020.0002] # ANATOLIAN HIEROGLYPH A214 -144F6 ; [.5353.0020.0002] # ANATOLIAN HIEROGLYPH A215 -144F7 ; [.5354.0020.0002] # ANATOLIAN HIEROGLYPH A215A -144F8 ; [.5355.0020.0002] # ANATOLIAN HIEROGLYPH A216 -144F9 ; [.5356.0020.0002] # ANATOLIAN HIEROGLYPH A216A -144FA ; [.5357.0020.0002] # ANATOLIAN HIEROGLYPH A217 -144FB ; [.5358.0020.0002] # ANATOLIAN HIEROGLYPH A218 -144FC ; [.5359.0020.0002] # ANATOLIAN HIEROGLYPH A219 -144FD ; [.535A.0020.0002] # ANATOLIAN HIEROGLYPH A220 -144FE ; [.535B.0020.0002] # ANATOLIAN HIEROGLYPH A221 -144FF ; [.535C.0020.0002] # ANATOLIAN HIEROGLYPH A222 -14500 ; [.535D.0020.0002] # ANATOLIAN HIEROGLYPH A223 -14501 ; [.535E.0020.0002] # ANATOLIAN HIEROGLYPH A224 -14502 ; [.535F.0020.0002] # ANATOLIAN HIEROGLYPH A225 -14503 ; [.5360.0020.0002] # ANATOLIAN HIEROGLYPH A226 -14504 ; [.5361.0020.0002] # ANATOLIAN HIEROGLYPH A227 -14505 ; [.5362.0020.0002] # ANATOLIAN HIEROGLYPH A227A -14506 ; [.5363.0020.0002] # ANATOLIAN HIEROGLYPH A228 -14507 ; [.5364.0020.0002] # ANATOLIAN HIEROGLYPH A229 -14508 ; [.5365.0020.0002] # ANATOLIAN HIEROGLYPH A230 -14509 ; [.5366.0020.0002] # ANATOLIAN HIEROGLYPH A231 -1450A ; [.5367.0020.0002] # ANATOLIAN HIEROGLYPH A232 -1450B ; [.5368.0020.0002] # ANATOLIAN HIEROGLYPH A233 -1450C ; [.5369.0020.0002] # ANATOLIAN HIEROGLYPH A234 -1450D ; [.536A.0020.0002] # ANATOLIAN HIEROGLYPH A235 -1450E ; [.536B.0020.0002] # ANATOLIAN HIEROGLYPH A236 -1450F ; [.536C.0020.0002] # ANATOLIAN HIEROGLYPH A237 -14510 ; [.536D.0020.0002] # ANATOLIAN HIEROGLYPH A238 -14511 ; [.536E.0020.0002] # ANATOLIAN HIEROGLYPH A239 -14512 ; [.536F.0020.0002] # ANATOLIAN HIEROGLYPH A240 -14513 ; [.5370.0020.0002] # ANATOLIAN HIEROGLYPH A241 -14514 ; [.5371.0020.0002] # ANATOLIAN HIEROGLYPH A242 -14515 ; [.5372.0020.0002] # ANATOLIAN HIEROGLYPH A243 -14516 ; [.5373.0020.0002] # ANATOLIAN HIEROGLYPH A244 -14517 ; [.5374.0020.0002] # ANATOLIAN HIEROGLYPH A245 -14518 ; [.5375.0020.0002] # ANATOLIAN HIEROGLYPH A246 -14519 ; [.5376.0020.0002] # ANATOLIAN HIEROGLYPH A247 -1451A ; [.5377.0020.0002] # ANATOLIAN HIEROGLYPH A248 -1451B ; [.5378.0020.0002] # ANATOLIAN HIEROGLYPH A249 -1451C ; [.5379.0020.0002] # ANATOLIAN HIEROGLYPH A250 -1451D ; [.537A.0020.0002] # ANATOLIAN HIEROGLYPH A251 -1451E ; [.537B.0020.0002] # ANATOLIAN HIEROGLYPH A252 -1451F ; [.537C.0020.0002] # ANATOLIAN HIEROGLYPH A253 -14520 ; [.537D.0020.0002] # ANATOLIAN HIEROGLYPH A254 -14521 ; [.537E.0020.0002] # ANATOLIAN HIEROGLYPH A255 -14522 ; [.537F.0020.0002] # ANATOLIAN HIEROGLYPH A256 -14523 ; [.5380.0020.0002] # ANATOLIAN HIEROGLYPH A257 -14524 ; [.5381.0020.0002] # ANATOLIAN HIEROGLYPH A258 -14525 ; [.5382.0020.0002] # ANATOLIAN HIEROGLYPH A259 -14526 ; [.5383.0020.0002] # ANATOLIAN HIEROGLYPH A260 -14527 ; [.5384.0020.0002] # ANATOLIAN HIEROGLYPH A261 -14528 ; [.5385.0020.0002] # ANATOLIAN HIEROGLYPH A262 -14529 ; [.5386.0020.0002] # ANATOLIAN HIEROGLYPH A263 -1452A ; [.5387.0020.0002] # ANATOLIAN HIEROGLYPH A264 -1452B ; [.5388.0020.0002] # ANATOLIAN HIEROGLYPH A265 -1452C ; [.5389.0020.0002] # ANATOLIAN HIEROGLYPH A266 -1452D ; [.538A.0020.0002] # ANATOLIAN HIEROGLYPH A267 -1452E ; [.538B.0020.0002] # ANATOLIAN HIEROGLYPH A267A -1452F ; [.538C.0020.0002] # ANATOLIAN HIEROGLYPH A268 -14530 ; [.538D.0020.0002] # ANATOLIAN HIEROGLYPH A269 -14531 ; [.538E.0020.0002] # ANATOLIAN HIEROGLYPH A270 -14532 ; [.538F.0020.0002] # ANATOLIAN HIEROGLYPH A271 -14533 ; [.5390.0020.0002] # ANATOLIAN HIEROGLYPH A272 -14534 ; [.5391.0020.0002] # ANATOLIAN HIEROGLYPH A273 -14535 ; [.5392.0020.0002] # ANATOLIAN HIEROGLYPH A274 -14536 ; [.5393.0020.0002] # ANATOLIAN HIEROGLYPH A275 -14537 ; [.5394.0020.0002] # ANATOLIAN HIEROGLYPH A276 -14538 ; [.5395.0020.0002] # ANATOLIAN HIEROGLYPH A277 -14539 ; [.5396.0020.0002] # ANATOLIAN HIEROGLYPH A278 -1453A ; [.5397.0020.0002] # ANATOLIAN HIEROGLYPH A279 -1453B ; [.5398.0020.0002] # ANATOLIAN HIEROGLYPH A280 -1453C ; [.5399.0020.0002] # ANATOLIAN HIEROGLYPH A281 -1453D ; [.539A.0020.0002] # ANATOLIAN HIEROGLYPH A282 -1453E ; [.539B.0020.0002] # ANATOLIAN HIEROGLYPH A283 -1453F ; [.539C.0020.0002] # ANATOLIAN HIEROGLYPH A284 -14540 ; [.539D.0020.0002] # ANATOLIAN HIEROGLYPH A285 -14541 ; [.539E.0020.0002] # ANATOLIAN HIEROGLYPH A286 -14542 ; [.539F.0020.0002] # ANATOLIAN HIEROGLYPH A287 -14543 ; [.53A0.0020.0002] # ANATOLIAN HIEROGLYPH A288 -14544 ; [.53A1.0020.0002] # ANATOLIAN HIEROGLYPH A289 -14545 ; [.53A2.0020.0002] # ANATOLIAN HIEROGLYPH A289A -14546 ; [.53A3.0020.0002] # ANATOLIAN HIEROGLYPH A290 -14547 ; [.53A4.0020.0002] # ANATOLIAN HIEROGLYPH A291 -14548 ; [.53A5.0020.0002] # ANATOLIAN HIEROGLYPH A292 -14549 ; [.53A6.0020.0002] # ANATOLIAN HIEROGLYPH A293 -1454A ; [.53A7.0020.0002] # ANATOLIAN HIEROGLYPH A294 -1454B ; [.53A8.0020.0002] # ANATOLIAN HIEROGLYPH A294A -1454C ; [.53A9.0020.0002] # ANATOLIAN HIEROGLYPH A295 -1454D ; [.53AA.0020.0002] # ANATOLIAN HIEROGLYPH A296 -1454E ; [.53AB.0020.0002] # ANATOLIAN HIEROGLYPH A297 -1454F ; [.53AC.0020.0002] # ANATOLIAN HIEROGLYPH A298 -14550 ; [.53AD.0020.0002] # ANATOLIAN HIEROGLYPH A299 -14551 ; [.53AE.0020.0002] # ANATOLIAN HIEROGLYPH A299A -14552 ; [.53AF.0020.0002] # ANATOLIAN HIEROGLYPH A300 -14553 ; [.53B0.0020.0002] # ANATOLIAN HIEROGLYPH A301 -14554 ; [.53B1.0020.0002] # ANATOLIAN HIEROGLYPH A302 -14555 ; [.53B2.0020.0002] # ANATOLIAN HIEROGLYPH A303 -14556 ; [.53B3.0020.0002] # ANATOLIAN HIEROGLYPH A304 -14557 ; [.53B4.0020.0002] # ANATOLIAN HIEROGLYPH A305 -14558 ; [.53B5.0020.0002] # ANATOLIAN HIEROGLYPH A306 -14559 ; [.53B6.0020.0002] # ANATOLIAN HIEROGLYPH A307 -1455A ; [.53B7.0020.0002] # ANATOLIAN HIEROGLYPH A308 -1455B ; [.53B8.0020.0002] # ANATOLIAN HIEROGLYPH A309 -1455C ; [.53B9.0020.0002] # ANATOLIAN HIEROGLYPH A309A -1455D ; [.53BA.0020.0002] # ANATOLIAN HIEROGLYPH A310 -1455E ; [.53BB.0020.0002] # ANATOLIAN HIEROGLYPH A311 -1455F ; [.53BC.0020.0002] # ANATOLIAN HIEROGLYPH A312 -14560 ; [.53BD.0020.0002] # ANATOLIAN HIEROGLYPH A313 -14561 ; [.53BE.0020.0002] # ANATOLIAN HIEROGLYPH A314 -14562 ; [.53BF.0020.0002] # ANATOLIAN HIEROGLYPH A315 -14563 ; [.53C0.0020.0002] # ANATOLIAN HIEROGLYPH A316 -14564 ; [.53C1.0020.0002] # ANATOLIAN HIEROGLYPH A317 -14565 ; [.53C2.0020.0002] # ANATOLIAN HIEROGLYPH A318 -14566 ; [.53C3.0020.0002] # ANATOLIAN HIEROGLYPH A319 -14567 ; [.53C4.0020.0002] # ANATOLIAN HIEROGLYPH A320 -14568 ; [.53C5.0020.0002] # ANATOLIAN HIEROGLYPH A321 -14569 ; [.53C6.0020.0002] # ANATOLIAN HIEROGLYPH A322 -1456A ; [.53C7.0020.0002] # ANATOLIAN HIEROGLYPH A323 -1456B ; [.53C8.0020.0002] # ANATOLIAN HIEROGLYPH A324 -1456C ; [.53C9.0020.0002] # ANATOLIAN HIEROGLYPH A325 -1456D ; [.53CA.0020.0002] # ANATOLIAN HIEROGLYPH A326 -1456E ; [.53CB.0020.0002] # ANATOLIAN HIEROGLYPH A327 -1456F ; [.53CC.0020.0002] # ANATOLIAN HIEROGLYPH A328 -14570 ; [.53CD.0020.0002] # ANATOLIAN HIEROGLYPH A329 -14571 ; [.53CE.0020.0002] # ANATOLIAN HIEROGLYPH A329A -14572 ; [.53CF.0020.0002] # ANATOLIAN HIEROGLYPH A330 -14573 ; [.53D0.0020.0002] # ANATOLIAN HIEROGLYPH A331 -14574 ; [.53D1.0020.0002] # ANATOLIAN HIEROGLYPH A332A -14575 ; [.53D2.0020.0002] # ANATOLIAN HIEROGLYPH A332B -14576 ; [.53D3.0020.0002] # ANATOLIAN HIEROGLYPH A332C -14577 ; [.53D4.0020.0002] # ANATOLIAN HIEROGLYPH A333 -14578 ; [.53D5.0020.0002] # ANATOLIAN HIEROGLYPH A334 -14579 ; [.53D6.0020.0002] # ANATOLIAN HIEROGLYPH A335 -1457A ; [.53D7.0020.0002] # ANATOLIAN HIEROGLYPH A336 -1457B ; [.53D8.0020.0002] # ANATOLIAN HIEROGLYPH A336A -1457C ; [.53D9.0020.0002] # ANATOLIAN HIEROGLYPH A336B -1457D ; [.53DA.0020.0002] # ANATOLIAN HIEROGLYPH A336C -1457E ; [.53DB.0020.0002] # ANATOLIAN HIEROGLYPH A337 -1457F ; [.53DC.0020.0002] # ANATOLIAN HIEROGLYPH A338 -14580 ; [.53DD.0020.0002] # ANATOLIAN HIEROGLYPH A339 -14581 ; [.53DE.0020.0002] # ANATOLIAN HIEROGLYPH A340 -14582 ; [.53DF.0020.0002] # ANATOLIAN HIEROGLYPH A341 -14583 ; [.53E0.0020.0002] # ANATOLIAN HIEROGLYPH A342 -14584 ; [.53E1.0020.0002] # ANATOLIAN HIEROGLYPH A343 -14585 ; [.53E2.0020.0002] # ANATOLIAN HIEROGLYPH A344 -14586 ; [.53E3.0020.0002] # ANATOLIAN HIEROGLYPH A345 -14587 ; [.53E4.0020.0002] # ANATOLIAN HIEROGLYPH A346 -14588 ; [.53E5.0020.0002] # ANATOLIAN HIEROGLYPH A347 -14589 ; [.53E6.0020.0002] # ANATOLIAN HIEROGLYPH A348 -1458A ; [.53E7.0020.0002] # ANATOLIAN HIEROGLYPH A349 -1458B ; [.53E8.0020.0002] # ANATOLIAN HIEROGLYPH A350 -1458C ; [.53E9.0020.0002] # ANATOLIAN HIEROGLYPH A351 -1458D ; [.53EA.0020.0002] # ANATOLIAN HIEROGLYPH A352 -1458E ; [.53EB.0020.0002] # ANATOLIAN HIEROGLYPH A353 -1458F ; [.53EC.0020.0002] # ANATOLIAN HIEROGLYPH A354 -14590 ; [.53ED.0020.0002] # ANATOLIAN HIEROGLYPH A355 -14591 ; [.53EE.0020.0002] # ANATOLIAN HIEROGLYPH A356 -14592 ; [.53EF.0020.0002] # ANATOLIAN HIEROGLYPH A357 -14593 ; [.53F0.0020.0002] # ANATOLIAN HIEROGLYPH A358 -14594 ; [.53F1.0020.0002] # ANATOLIAN HIEROGLYPH A359 -14595 ; [.53F2.0020.0002] # ANATOLIAN HIEROGLYPH A359A -14596 ; [.53F3.0020.0002] # ANATOLIAN HIEROGLYPH A360 -14597 ; [.53F4.0020.0002] # ANATOLIAN HIEROGLYPH A361 -14598 ; [.53F5.0020.0002] # ANATOLIAN HIEROGLYPH A362 -14599 ; [.53F6.0020.0002] # ANATOLIAN HIEROGLYPH A363 -1459A ; [.53F7.0020.0002] # ANATOLIAN HIEROGLYPH A364 -1459B ; [.53F8.0020.0002] # ANATOLIAN HIEROGLYPH A364A -1459C ; [.53F9.0020.0002] # ANATOLIAN HIEROGLYPH A365 -1459D ; [.53FA.0020.0002] # ANATOLIAN HIEROGLYPH A366 -1459E ; [.53FB.0020.0002] # ANATOLIAN HIEROGLYPH A367 -1459F ; [.53FC.0020.0002] # ANATOLIAN HIEROGLYPH A368 -145A0 ; [.53FD.0020.0002] # ANATOLIAN HIEROGLYPH A368A -145A1 ; [.53FE.0020.0002] # ANATOLIAN HIEROGLYPH A369 -145A2 ; [.53FF.0020.0002] # ANATOLIAN HIEROGLYPH A370 -145A3 ; [.5400.0020.0002] # ANATOLIAN HIEROGLYPH A371 -145A4 ; [.5401.0020.0002] # ANATOLIAN HIEROGLYPH A371A -145A5 ; [.5402.0020.0002] # ANATOLIAN HIEROGLYPH A372 -145A6 ; [.5403.0020.0002] # ANATOLIAN HIEROGLYPH A373 -145A7 ; [.5404.0020.0002] # ANATOLIAN HIEROGLYPH A374 -145A8 ; [.5405.0020.0002] # ANATOLIAN HIEROGLYPH A375 -145A9 ; [.5406.0020.0002] # ANATOLIAN HIEROGLYPH A376 -145AA ; [.5407.0020.0002] # ANATOLIAN HIEROGLYPH A377 -145AB ; [.5408.0020.0002] # ANATOLIAN HIEROGLYPH A378 -145AC ; [.5409.0020.0002] # ANATOLIAN HIEROGLYPH A379 -145AD ; [.540A.0020.0002] # ANATOLIAN HIEROGLYPH A380 -145AE ; [.540B.0020.0002] # ANATOLIAN HIEROGLYPH A381 -145AF ; [.540C.0020.0002] # ANATOLIAN HIEROGLYPH A381A -145B0 ; [.540D.0020.0002] # ANATOLIAN HIEROGLYPH A382 -145B1 ; [.540E.0020.0002] # ANATOLIAN HIEROGLYPH A383 RA OR RI -145B2 ; [.540F.0020.0002] # ANATOLIAN HIEROGLYPH A383A -145B3 ; [.5410.0020.0002] # ANATOLIAN HIEROGLYPH A384 -145B4 ; [.5411.0020.0002] # ANATOLIAN HIEROGLYPH A385 -145B5 ; [.5412.0020.0002] # ANATOLIAN HIEROGLYPH A386 -145B6 ; [.5413.0020.0002] # ANATOLIAN HIEROGLYPH A386A -145B7 ; [.5414.0020.0002] # ANATOLIAN HIEROGLYPH A387 -145B8 ; [.5415.0020.0002] # ANATOLIAN HIEROGLYPH A388 -145B9 ; [.5416.0020.0002] # ANATOLIAN HIEROGLYPH A389 -145BA ; [.5417.0020.0002] # ANATOLIAN HIEROGLYPH A390 -145BB ; [.5418.0020.0002] # ANATOLIAN HIEROGLYPH A391 -145BC ; [.5419.0020.0002] # ANATOLIAN HIEROGLYPH A392 -145BD ; [.541A.0020.0002] # ANATOLIAN HIEROGLYPH A393 EIGHT -145BE ; [.541B.0020.0002] # ANATOLIAN HIEROGLYPH A394 -145BF ; [.541C.0020.0002] # ANATOLIAN HIEROGLYPH A395 -145C0 ; [.541D.0020.0002] # ANATOLIAN HIEROGLYPH A396 -145C1 ; [.541E.0020.0002] # ANATOLIAN HIEROGLYPH A397 -145C2 ; [.541F.0020.0002] # ANATOLIAN HIEROGLYPH A398 -145C3 ; [.5420.0020.0002] # ANATOLIAN HIEROGLYPH A399 -145C4 ; [.5421.0020.0002] # ANATOLIAN HIEROGLYPH A400 -145C5 ; [.5422.0020.0002] # ANATOLIAN HIEROGLYPH A401 -145C6 ; [.5423.0020.0002] # ANATOLIAN HIEROGLYPH A402 -145C7 ; [.5424.0020.0002] # ANATOLIAN HIEROGLYPH A403 -145C8 ; [.5425.0020.0002] # ANATOLIAN HIEROGLYPH A404 -145C9 ; [.5426.0020.0002] # ANATOLIAN HIEROGLYPH A405 -145CA ; [.5427.0020.0002] # ANATOLIAN HIEROGLYPH A406 -145CB ; [.5428.0020.0002] # ANATOLIAN HIEROGLYPH A407 -145CC ; [.5429.0020.0002] # ANATOLIAN HIEROGLYPH A408 -145CD ; [.542A.0020.0002] # ANATOLIAN HIEROGLYPH A409 -145CE ; [.542B.0020.0002] # ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK -145CF ; [.542C.0020.0002] # ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK -145D0 ; [.542D.0020.0002] # ANATOLIAN HIEROGLYPH A411 -145D1 ; [.542E.0020.0002] # ANATOLIAN HIEROGLYPH A412 -145D2 ; [.542F.0020.0002] # ANATOLIAN HIEROGLYPH A413 -145D3 ; [.5430.0020.0002] # ANATOLIAN HIEROGLYPH A414 -145D4 ; [.5431.0020.0002] # ANATOLIAN HIEROGLYPH A415 -145D5 ; [.5432.0020.0002] # ANATOLIAN HIEROGLYPH A416 -145D6 ; [.5433.0020.0002] # ANATOLIAN HIEROGLYPH A417 -145D7 ; [.5434.0020.0002] # ANATOLIAN HIEROGLYPH A418 -145D8 ; [.5435.0020.0002] # ANATOLIAN HIEROGLYPH A419 -145D9 ; [.5436.0020.0002] # ANATOLIAN HIEROGLYPH A420 -145DA ; [.5437.0020.0002] # ANATOLIAN HIEROGLYPH A421 -145DB ; [.5438.0020.0002] # ANATOLIAN HIEROGLYPH A422 -145DC ; [.5439.0020.0002] # ANATOLIAN HIEROGLYPH A423 -145DD ; [.543A.0020.0002] # ANATOLIAN HIEROGLYPH A424 -145DE ; [.543B.0020.0002] # ANATOLIAN HIEROGLYPH A425 -145DF ; [.543C.0020.0002] # ANATOLIAN HIEROGLYPH A426 -145E0 ; [.543D.0020.0002] # ANATOLIAN HIEROGLYPH A427 -145E1 ; [.543E.0020.0002] # ANATOLIAN HIEROGLYPH A428 -145E2 ; [.543F.0020.0002] # ANATOLIAN HIEROGLYPH A429 -145E3 ; [.5440.0020.0002] # ANATOLIAN HIEROGLYPH A430 -145E4 ; [.5441.0020.0002] # ANATOLIAN HIEROGLYPH A431 -145E5 ; [.5442.0020.0002] # ANATOLIAN HIEROGLYPH A432 -145E6 ; [.5443.0020.0002] # ANATOLIAN HIEROGLYPH A433 -145E7 ; [.5444.0020.0002] # ANATOLIAN HIEROGLYPH A434 -145E8 ; [.5445.0020.0002] # ANATOLIAN HIEROGLYPH A435 -145E9 ; [.5446.0020.0002] # ANATOLIAN HIEROGLYPH A436 -145EA ; [.5447.0020.0002] # ANATOLIAN HIEROGLYPH A437 -145EB ; [.5448.0020.0002] # ANATOLIAN HIEROGLYPH A438 -145EC ; [.5449.0020.0002] # ANATOLIAN HIEROGLYPH A439 -145ED ; [.544A.0020.0002] # ANATOLIAN HIEROGLYPH A440 -145EE ; [.544B.0020.0002] # ANATOLIAN HIEROGLYPH A441 -145EF ; [.544C.0020.0002] # ANATOLIAN HIEROGLYPH A442 -145F0 ; [.544D.0020.0002] # ANATOLIAN HIEROGLYPH A443 -145F1 ; [.544E.0020.0002] # ANATOLIAN HIEROGLYPH A444 -145F2 ; [.544F.0020.0002] # ANATOLIAN HIEROGLYPH A445 -145F3 ; [.5450.0020.0002] # ANATOLIAN HIEROGLYPH A446 -145F4 ; [.5451.0020.0002] # ANATOLIAN HIEROGLYPH A447 -145F5 ; [.5452.0020.0002] # ANATOLIAN HIEROGLYPH A448 -145F6 ; [.5453.0020.0002] # ANATOLIAN HIEROGLYPH A449 -145F7 ; [.5454.0020.0002] # ANATOLIAN HIEROGLYPH A450 -145F8 ; [.5455.0020.0002] # ANATOLIAN HIEROGLYPH A450A -145F9 ; [.5456.0020.0002] # ANATOLIAN HIEROGLYPH A451 -145FA ; [.5457.0020.0002] # ANATOLIAN HIEROGLYPH A452 -145FB ; [.5458.0020.0002] # ANATOLIAN HIEROGLYPH A453 -145FC ; [.5459.0020.0002] # ANATOLIAN HIEROGLYPH A454 -145FD ; [.545A.0020.0002] # ANATOLIAN HIEROGLYPH A455 -145FE ; [.545B.0020.0002] # ANATOLIAN HIEROGLYPH A456 -145FF ; [.545C.0020.0002] # ANATOLIAN HIEROGLYPH A457 -14600 ; [.545D.0020.0002] # ANATOLIAN HIEROGLYPH A457A -14601 ; [.545E.0020.0002] # ANATOLIAN HIEROGLYPH A458 -14602 ; [.545F.0020.0002] # ANATOLIAN HIEROGLYPH A459 -14603 ; [.5460.0020.0002] # ANATOLIAN HIEROGLYPH A460 -14604 ; [.5461.0020.0002] # ANATOLIAN HIEROGLYPH A461 -14605 ; [.5462.0020.0002] # ANATOLIAN HIEROGLYPH A462 -14606 ; [.5463.0020.0002] # ANATOLIAN HIEROGLYPH A463 -14607 ; [.5464.0020.0002] # ANATOLIAN HIEROGLYPH A464 -14608 ; [.5465.0020.0002] # ANATOLIAN HIEROGLYPH A465 -14609 ; [.5466.0020.0002] # ANATOLIAN HIEROGLYPH A466 -1460A ; [.5467.0020.0002] # ANATOLIAN HIEROGLYPH A467 -1460B ; [.5468.0020.0002] # ANATOLIAN HIEROGLYPH A468 -1460C ; [.5469.0020.0002] # ANATOLIAN HIEROGLYPH A469 -1460D ; [.546A.0020.0002] # ANATOLIAN HIEROGLYPH A470 -1460E ; [.546B.0020.0002] # ANATOLIAN HIEROGLYPH A471 -1460F ; [.546C.0020.0002] # ANATOLIAN HIEROGLYPH A472 -14610 ; [.546D.0020.0002] # ANATOLIAN HIEROGLYPH A473 -14611 ; [.546E.0020.0002] # ANATOLIAN HIEROGLYPH A474 -14612 ; [.546F.0020.0002] # ANATOLIAN HIEROGLYPH A475 -14613 ; [.5470.0020.0002] # ANATOLIAN HIEROGLYPH A476 -14614 ; [.5471.0020.0002] # ANATOLIAN HIEROGLYPH A477 -14615 ; [.5472.0020.0002] # ANATOLIAN HIEROGLYPH A478 -14616 ; [.5473.0020.0002] # ANATOLIAN HIEROGLYPH A479 -14617 ; [.5474.0020.0002] # ANATOLIAN HIEROGLYPH A480 -14618 ; [.5475.0020.0002] # ANATOLIAN HIEROGLYPH A481 -14619 ; [.5476.0020.0002] # ANATOLIAN HIEROGLYPH A482 -1461A ; [.5477.0020.0002] # ANATOLIAN HIEROGLYPH A483 -1461B ; [.5478.0020.0002] # ANATOLIAN HIEROGLYPH A484 -1461C ; [.5479.0020.0002] # ANATOLIAN HIEROGLYPH A485 -1461D ; [.547A.0020.0002] # ANATOLIAN HIEROGLYPH A486 -1461E ; [.547B.0020.0002] # ANATOLIAN HIEROGLYPH A487 -1461F ; [.547C.0020.0002] # ANATOLIAN HIEROGLYPH A488 -14620 ; [.547D.0020.0002] # ANATOLIAN HIEROGLYPH A489 -14621 ; [.547E.0020.0002] # ANATOLIAN HIEROGLYPH A490 -14622 ; [.547F.0020.0002] # ANATOLIAN HIEROGLYPH A491 -14623 ; [.5480.0020.0002] # ANATOLIAN HIEROGLYPH A492 -14624 ; [.5481.0020.0002] # ANATOLIAN HIEROGLYPH A493 -14625 ; [.5482.0020.0002] # ANATOLIAN HIEROGLYPH A494 -14626 ; [.5483.0020.0002] # ANATOLIAN HIEROGLYPH A495 -14627 ; [.5484.0020.0002] # ANATOLIAN HIEROGLYPH A496 -14628 ; [.5485.0020.0002] # ANATOLIAN HIEROGLYPH A497 -14629 ; [.5486.0020.0002] # ANATOLIAN HIEROGLYPH A501 -1462A ; [.5487.0020.0002] # ANATOLIAN HIEROGLYPH A502 -1462B ; [.5488.0020.0002] # ANATOLIAN HIEROGLYPH A503 -1462C ; [.5489.0020.0002] # ANATOLIAN HIEROGLYPH A504 -1462D ; [.548A.0020.0002] # ANATOLIAN HIEROGLYPH A505 -1462E ; [.548B.0020.0002] # ANATOLIAN HIEROGLYPH A506 -1462F ; [.548C.0020.0002] # ANATOLIAN HIEROGLYPH A507 -14630 ; [.548D.0020.0002] # ANATOLIAN HIEROGLYPH A508 -14631 ; [.548E.0020.0002] # ANATOLIAN HIEROGLYPH A509 -14632 ; [.548F.0020.0002] # ANATOLIAN HIEROGLYPH A510 -14633 ; [.5490.0020.0002] # ANATOLIAN HIEROGLYPH A511 -14634 ; [.5491.0020.0002] # ANATOLIAN HIEROGLYPH A512 -14635 ; [.5492.0020.0002] # ANATOLIAN HIEROGLYPH A513 -14636 ; [.5493.0020.0002] # ANATOLIAN HIEROGLYPH A514 -14637 ; [.5494.0020.0002] # ANATOLIAN HIEROGLYPH A515 -14638 ; [.5495.0020.0002] # ANATOLIAN HIEROGLYPH A516 -14639 ; [.5496.0020.0002] # ANATOLIAN HIEROGLYPH A517 -1463A ; [.5497.0020.0002] # ANATOLIAN HIEROGLYPH A518 -1463B ; [.5498.0020.0002] # ANATOLIAN HIEROGLYPH A519 -1463C ; [.5499.0020.0002] # ANATOLIAN HIEROGLYPH A520 -1463D ; [.549A.0020.0002] # ANATOLIAN HIEROGLYPH A521 -1463E ; [.549B.0020.0002] # ANATOLIAN HIEROGLYPH A522 -1463F ; [.549C.0020.0002] # ANATOLIAN HIEROGLYPH A523 -14640 ; [.549D.0020.0002] # ANATOLIAN HIEROGLYPH A524 -14641 ; [.549E.0020.0002] # ANATOLIAN HIEROGLYPH A525 -14642 ; [.549F.0020.0002] # ANATOLIAN HIEROGLYPH A526 -14643 ; [.54A0.0020.0002] # ANATOLIAN HIEROGLYPH A527 -14644 ; [.54A1.0020.0002] # ANATOLIAN HIEROGLYPH A528 -14645 ; [.54A2.0020.0002] # ANATOLIAN HIEROGLYPH A529 -14646 ; [.54A3.0020.0002] # ANATOLIAN HIEROGLYPH A530 +11A98 ; [.0000.00D1.0002] # SOYOMBO GEMINATION MARK +0E4E ; [.0000.00D2.0002] # THAI CHARACTER YAMAKKAN +0E47 ; [.0000.00D3.0002] # THAI CHARACTER MAITAIKHU +0E48 ; [.0000.00D4.0002] # THAI CHARACTER MAI EK +0E49 ; [.0000.00D5.0002] # THAI CHARACTER MAI THO +0E4A ; [.0000.00D6.0002] # THAI CHARACTER MAI TRI +0E4B ; [.0000.00D7.0002] # THAI CHARACTER MAI CHATTAWA +0E4C ; [.0000.00D8.0002] # THAI CHARACTER THANTHAKHAT +0E4D ; [.0000.00D9.0002] # THAI CHARACTER NIKHAHIT +0EC8 ; [.0000.00DA.0002] # LAO TONE MAI EK +0EC9 ; [.0000.00DB.0002] # LAO TONE MAI THO +0ECA ; [.0000.00DC.0002] # LAO TONE MAI TI +0ECB ; [.0000.00DD.0002] # LAO TONE MAI CATAWA +0ECC ; [.0000.00DE.0002] # LAO CANCELLATION MARK +0ECD ; [.0000.00DF.0002] # LAO NIGGAHITA +AABF ; [.0000.00E0.0002] # TAI VIET TONE MAI EK +AAC1 ; [.0000.00E1.0002] # TAI VIET TONE MAI THO +0F39 ; [.0000.00E2.0002] # TIBETAN MARK TSA -PHRU +A92B ; [.0000.00E3.0002] # KAYAH LI TONE PLOPHU +A92C ; [.0000.00E4.0002] # KAYAH LI TONE CALYA +A92D ; [.0000.00E5.0002] # KAYAH LI TONE CALYA PLOPHU +1037 ; [.0000.00E6.0002] # MYANMAR SIGN DOT BELOW +17C8 ; [.0000.00E7.0002] # KHMER SIGN YUUKALEAPINTU +17C9 ; [.0000.00E8.0002] # KHMER SIGN MUUSIKATOAN +17CA ; [.0000.00E9.0002] # KHMER SIGN TRIISAP +1A75 ; [.0000.00EA.0002] # TAI THAM SIGN TONE-1 +1A76 ; [.0000.00EB.0002] # TAI THAM SIGN TONE-2 +1A77 ; [.0000.00EC.0002] # TAI THAM SIGN KHUEN TONE-3 +1A78 ; [.0000.00ED.0002] # TAI THAM SIGN KHUEN TONE-4 +1A79 ; [.0000.00EE.0002] # TAI THAM SIGN KHUEN TONE-5 +1A7A ; [.0000.00EF.0002] # TAI THAM SIGN RA HAAM +1A7B ; [.0000.00F0.0002] # TAI THAM SIGN MAI SAM +1A7C ; [.0000.00F1.0002] # TAI THAM SIGN KHUEN-LUE KARAN +1939 ; [.0000.00F2.0002] # LIMBU SIGN MUKPHRENG +193A ; [.0000.00F3.0002] # LIMBU SIGN KEMPHRENG +193B ; [.0000.00F4.0002] # LIMBU SIGN SA-I +16B30 ; [.0000.00F5.0002] # PAHAWH HMONG MARK CIM TUB +16B31 ; [.0000.00F6.0002] # PAHAWH HMONG MARK CIM SO +16B32 ; [.0000.00F7.0002] # PAHAWH HMONG MARK CIM KES +16B33 ; [.0000.00F8.0002] # PAHAWH HMONG MARK CIM KHAV +16B34 ; [.0000.00F9.0002] # PAHAWH HMONG MARK CIM SUAM +16B35 ; [.0000.00FA.0002] # PAHAWH HMONG MARK CIM HOM +16B36 ; [.0000.00FB.0002] # PAHAWH HMONG MARK CIM TAUM +302A ; [.0000.00FC.0002] # IDEOGRAPHIC LEVEL TONE MARK +302B ; [.0000.00FD.0002] # IDEOGRAPHIC RISING TONE MARK +302C ; [.0000.00FE.0002] # IDEOGRAPHIC DEPARTING TONE MARK +302D ; [.0000.00FF.0002] # IDEOGRAPHIC ENTERING TONE MARK +302E ; [.0000.0100.0002] # HANGUL SINGLE DOT TONE MARK +302F ; [.0000.0101.0002] # HANGUL DOUBLE DOT TONE MARK +20D0 ; [.0000.0102.0002] # COMBINING LEFT HARPOON ABOVE +20D1 ; [.0000.0103.0002] # COMBINING RIGHT HARPOON ABOVE +20D2 ; [.0000.0104.0002] # COMBINING LONG VERTICAL LINE OVERLAY +20D3 ; [.0000.0104.0002] # COMBINING SHORT VERTICAL LINE OVERLAY +20D4 ; [.0000.0105.0002] # COMBINING ANTICLOCKWISE ARROW ABOVE +20D5 ; [.0000.0106.0002] # COMBINING CLOCKWISE ARROW ABOVE +20D6 ; [.0000.0107.0002] # COMBINING LEFT ARROW ABOVE +20D7 ; [.0000.0108.0002] # COMBINING RIGHT ARROW ABOVE +20DB ; [.0000.0109.0002] # COMBINING THREE DOTS ABOVE +20DC ; [.0000.010A.0002] # COMBINING FOUR DOTS ABOVE +20E1 ; [.0000.010B.0002] # COMBINING LEFT RIGHT ARROW ABOVE +20E6 ; [.0000.010C.0002] # COMBINING DOUBLE VERTICAL STROKE OVERLAY +20E7 ; [.0000.010D.0002] # COMBINING ANNUITY SYMBOL +20E8 ; [.0000.010E.0002] # COMBINING TRIPLE UNDERDOT +20E9 ; [.0000.010F.0002] # COMBINING WIDE BRIDGE ABOVE +101FD ; [.0000.0110.0002] # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +02D0 ; [.1C5C.0020.0002] # MODIFIER LETTER TRIANGULAR COLON +02D1 ; [.1C5D.0020.0002] # MODIFIER LETTER HALF TRIANGULAR COLON +0971 ; [.1C5E.0020.0002] # DEVANAGARI SIGN HIGH SPACING DOT +0E46 ; [.1C5F.0020.0002] # THAI CHARACTER MAIYAMOK +0EC6 ; [.1C60.0020.0002] # LAO KO LA +17D7 ; [.1C61.0020.0002] # KHMER SIGN LEK TOO +1AA7 ; [.1C62.0020.0002] # TAI THAM SIGN MAI YAMOK +A9CF ; [.1C63.0020.0002] # JAVANESE PANGRANGKEP +A9E6 ; [.1C64.0020.0002] # MYANMAR MODIFIER LETTER SHAN REDUPLICATION +AA70 ; [.1C65.0020.0002] # MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AADD ; [.1C66.0020.0002] # TAI VIET SYMBOL SAM +AAF3 ; [.1C67.0020.0002] # MEETEI MAYEK SYLLABLE REPETITION MARK +AAF4 ; [.1C68.0020.0002] # MEETEI MAYEK WORD REPETITION MARK +16B42 ; [.1C69.0020.0002] # PAHAWH HMONG SIGN VOS NRUA +16B43 ; [.1C6A.0020.0002] # PAHAWH HMONG SIGN IB YAM +3005 ; [.1C6B.0020.0002] # IDEOGRAPHIC ITERATION MARK +303B ; [.1C6C.0020.0002] # VERTICAL IDEOGRAPHIC ITERATION MARK +16FE0 ; [.1C6D.0020.0002] # TANGUT ITERATION MARK +16FE1 ; [.1C6E.0020.0002] # NUSHU ITERATION MARK +3031 ; [.1C6F.0020.0002] # VERTICAL KANA REPEAT MARK +3032 ; [.1C6F.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK +3033 ; [.1C70.0020.0002] # VERTICAL KANA REPEAT MARK UPPER HALF +3034 ; [.1C70.0020.0002][.0000.0037.0002] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +3035 ; [.1C71.0020.0002] # VERTICAL KANA REPEAT MARK LOWER HALF +309D ; [.1C72.0020.0002] # HIRAGANA ITERATION MARK +309E ; [.1C72.0020.0002][.0000.0037.0002] # HIRAGANA VOICED ITERATION MARK +30FC ; [.1C73.0020.0002] # KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF70 ; [.1C73.0020.0012] # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +30FD ; [.1C74.0020.0002] # KATAKANA ITERATION MARK +30FE ; [.1C74.0020.0002][.0000.0037.0002] # KATAKANA VOICED ITERATION MARK +00A4 ; [.1C75.0020.0002] # CURRENCY SIGN +00A2 ; [.1C76.0020.0002] # CENT SIGN +FFE0 ; [.1C76.0020.0003] # FULLWIDTH CENT SIGN +0024 ; [.1C77.0020.0002] # DOLLAR SIGN +FF04 ; [.1C77.0020.0003] # FULLWIDTH DOLLAR SIGN +FE69 ; [.1C77.0020.000F] # SMALL DOLLAR SIGN +00A3 ; [.1C78.0020.0002] # POUND SIGN +FFE1 ; [.1C78.0020.0003] # FULLWIDTH POUND SIGN +00A5 ; [.1C79.0020.0002] # YEN SIGN +FFE5 ; [.1C79.0020.0003] # FULLWIDTH YEN SIGN +058F ; [.1C7A.0020.0002] # ARMENIAN DRAM SIGN +060B ; [.1C7B.0020.0002] # AFGHANI SIGN +09F2 ; [.1C7C.0020.0002] # BENGALI RUPEE MARK +09F3 ; [.1C7D.0020.0002] # BENGALI RUPEE SIGN +09FB ; [.1C7E.0020.0002] # BENGALI GANDA MARK +0AF1 ; [.1C7F.0020.0002] # GUJARATI RUPEE SIGN +A838 ; [.1C80.0020.0002] # NORTH INDIC RUPEE MARK +0BF9 ; [.1C81.0020.0002] # TAMIL RUPEE SIGN +0E3F ; [.1C82.0020.0002] # THAI CURRENCY SYMBOL BAHT +17DB ; [.1C83.0020.0002] # KHMER CURRENCY SYMBOL RIEL +20A0 ; [.1C84.0020.0002] # EURO-CURRENCY SIGN +20A1 ; [.1C85.0020.0002] # COLON SIGN +20A2 ; [.1C86.0020.0002] # CRUZEIRO SIGN +20A3 ; [.1C87.0020.0002] # FRENCH FRANC SIGN +20A4 ; [.1C88.0020.0002] # LIRA SIGN +20A5 ; [.1C89.0020.0002] # MILL SIGN +20A6 ; [.1C8A.0020.0002] # NAIRA SIGN +20A7 ; [.1C8B.0020.0002] # PESETA SIGN +20A9 ; [.1C8C.0020.0002] # WON SIGN +FFE6 ; [.1C8C.0020.0003] # FULLWIDTH WON SIGN +20AA ; [.1C8D.0020.0002] # NEW SHEQEL SIGN +20AB ; [.1C8E.0020.0002] # DONG SIGN +20AC ; [.1C8F.0020.0002] # EURO SIGN +20AD ; [.1C90.0020.0002] # KIP SIGN +20AE ; [.1C91.0020.0002] # TUGRIK SIGN +20AF ; [.1C92.0020.0002] # DRACHMA SIGN +20B0 ; [.1C93.0020.0002] # GERMAN PENNY SIGN +20B1 ; [.1C94.0020.0002] # PESO SIGN +20B2 ; [.1C95.0020.0002] # GUARANI SIGN +20B3 ; [.1C96.0020.0002] # AUSTRAL SIGN +20B4 ; [.1C97.0020.0002] # HRYVNIA SIGN +20B5 ; [.1C98.0020.0002] # CEDI SIGN +20B6 ; [.1C99.0020.0002] # LIVRE TOURNOIS SIGN +20B7 ; [.1C9A.0020.0002] # SPESMILO SIGN +20B8 ; [.1C9B.0020.0002] # TENGE SIGN +20B9 ; [.1C9C.0020.0002] # INDIAN RUPEE SIGN +20BA ; [.1C9D.0020.0002] # TURKISH LIRA SIGN +20BB ; [.1C9E.0020.0002] # NORDIC MARK SIGN +20BC ; [.1C9F.0020.0002] # MANAT SIGN +20BD ; [.1CA0.0020.0002] # RUBLE SIGN +20BE ; [.1CA1.0020.0002] # LARI SIGN +20BF ; [.1CA2.0020.0002] # BITCOIN SIGN +0030 ; [.1CA3.0020.0002] # DIGIT ZERO +0660 ; [.1CA3.0020.0002] # ARABIC-INDIC DIGIT ZERO +06F0 ; [.1CA3.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ZERO +07C0 ; [.1CA3.0020.0002] # NKO DIGIT ZERO +0966 ; [.1CA3.0020.0002] # DEVANAGARI DIGIT ZERO +09E6 ; [.1CA3.0020.0002] # BENGALI DIGIT ZERO +0A66 ; [.1CA3.0020.0002] # GURMUKHI DIGIT ZERO +0AE6 ; [.1CA3.0020.0002] # GUJARATI DIGIT ZERO +0B66 ; [.1CA3.0020.0002] # ORIYA DIGIT ZERO +0BE6 ; [.1CA3.0020.0002] # TAMIL DIGIT ZERO +0C66 ; [.1CA3.0020.0002] # TELUGU DIGIT ZERO +0C78 ; [.1CA3.0020.0002] # TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR +0CE6 ; [.1CA3.0020.0002] # KANNADA DIGIT ZERO +0D66 ; [.1CA3.0020.0002] # MALAYALAM DIGIT ZERO +0DE6 ; [.1CA3.0020.0002] # SINHALA LITH DIGIT ZERO +0E50 ; [.1CA3.0020.0002] # THAI DIGIT ZERO +0ED0 ; [.1CA3.0020.0002] # LAO DIGIT ZERO +0F20 ; [.1CA3.0020.0002] # TIBETAN DIGIT ZERO +1040 ; [.1CA3.0020.0002] # MYANMAR DIGIT ZERO +1090 ; [.1CA3.0020.0002] # MYANMAR SHAN DIGIT ZERO +17E0 ; [.1CA3.0020.0002] # KHMER DIGIT ZERO +17F0 ; [.1CA3.0020.0002] # KHMER SYMBOL LEK ATTAK SON +1810 ; [.1CA3.0020.0002] # MONGOLIAN DIGIT ZERO +1946 ; [.1CA3.0020.0002] # LIMBU DIGIT ZERO +19D0 ; [.1CA3.0020.0002] # NEW TAI LUE DIGIT ZERO +1A80 ; [.1CA3.0020.0002] # TAI THAM HORA DIGIT ZERO +1A90 ; [.1CA3.0020.0002] # TAI THAM THAM DIGIT ZERO +1B50 ; [.1CA3.0020.0002] # BALINESE DIGIT ZERO +1BB0 ; [.1CA3.0020.0002] # SUNDANESE DIGIT ZERO +1C40 ; [.1CA3.0020.0002] # LEPCHA DIGIT ZERO +1C50 ; [.1CA3.0020.0002] # OL CHIKI DIGIT ZERO +3007 ; [.1CA3.0020.0002] # IDEOGRAPHIC NUMBER ZERO +A620 ; [.1CA3.0020.0002] # VAI DIGIT ZERO +A8D0 ; [.1CA3.0020.0002] # SAURASHTRA DIGIT ZERO +A900 ; [.1CA3.0020.0002] # KAYAH LI DIGIT ZERO +A9D0 ; [.1CA3.0020.0002] # JAVANESE DIGIT ZERO +A9F0 ; [.1CA3.0020.0002] # MYANMAR TAI LAING DIGIT ZERO +AA50 ; [.1CA3.0020.0002] # CHAM DIGIT ZERO +ABF0 ; [.1CA3.0020.0002] # MEETEI MAYEK DIGIT ZERO +1018A ; [.1CA3.0020.0002] # GREEK ZERO SIGN +104A0 ; [.1CA3.0020.0002] # OSMANYA DIGIT ZERO +11066 ; [.1CA3.0020.0002] # BRAHMI DIGIT ZERO +110F0 ; [.1CA3.0020.0002] # SORA SOMPENG DIGIT ZERO +11136 ; [.1CA3.0020.0002] # CHAKMA DIGIT ZERO +111D0 ; [.1CA3.0020.0002] # SHARADA DIGIT ZERO +112F0 ; [.1CA3.0020.0002] # KHUDAWADI DIGIT ZERO +11450 ; [.1CA3.0020.0002] # NEWA DIGIT ZERO +114D0 ; [.1CA3.0020.0002] # TIRHUTA DIGIT ZERO +11650 ; [.1CA3.0020.0002] # MODI DIGIT ZERO +116C0 ; [.1CA3.0020.0002] # TAKRI DIGIT ZERO +11730 ; [.1CA3.0020.0002] # AHOM DIGIT ZERO +118E0 ; [.1CA3.0020.0002] # WARANG CITI DIGIT ZERO +11C50 ; [.1CA3.0020.0002] # BHAIKSUKI DIGIT ZERO +11D50 ; [.1CA3.0020.0002] # MASARAM GONDI DIGIT ZERO +16A60 ; [.1CA3.0020.0002] # MRO DIGIT ZERO +16B50 ; [.1CA3.0020.0002] # PAHAWH HMONG DIGIT ZERO +1E950 ; [.1CA3.0020.0002] # ADLAM DIGIT ZERO +FF10 ; [.1CA3.0020.0003] # FULLWIDTH DIGIT ZERO +0F33 ; [.1CA3.0020.0004] # TIBETAN DIGIT HALF ZERO +1F100 ; [.1CA3.0020.0004][*0278.0020.0004] # DIGIT ZERO FULL STOP +1F101 ; [.1CA3.0020.0004][*0222.0020.0004] # DIGIT ZERO COMMA +1D7CE ; [.1CA3.0020.0005] # MATHEMATICAL BOLD DIGIT ZERO +1D7D8 ; [.1CA3.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7E2 ; [.1CA3.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7EC ; [.1CA3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7F6 ; [.1CA3.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ZERO +24EA ; [.1CA3.0020.0006] # CIRCLED DIGIT ZERO +24FF ; [.1CA3.0020.0006] # NEGATIVE CIRCLED DIGIT ZERO +1F10B ; [.1CA3.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ZERO +1F10C ; [.1CA3.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +2070 ; [.1CA3.0020.0014] # SUPERSCRIPT ZERO +2080 ; [.1CA3.0020.0015] # SUBSCRIPT ZERO +2189 ; [.1CA3.0020.001E][*063C.0020.001E][.1CA6.0020.001E] # VULGAR FRACTION ZERO THIRDS +3358 ; [.1CA3.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +0031 ; [.1CA4.0020.0002] # DIGIT ONE +0661 ; [.1CA4.0020.0002] # ARABIC-INDIC DIGIT ONE +06F1 ; [.1CA4.0020.0002] # EXTENDED ARABIC-INDIC DIGIT ONE +07C1 ; [.1CA4.0020.0002] # NKO DIGIT ONE +0967 ; [.1CA4.0020.0002] # DEVANAGARI DIGIT ONE +09E7 ; [.1CA4.0020.0002] # BENGALI DIGIT ONE +0A67 ; [.1CA4.0020.0002] # GURMUKHI DIGIT ONE +0AE7 ; [.1CA4.0020.0002] # GUJARATI DIGIT ONE +0B67 ; [.1CA4.0020.0002] # ORIYA DIGIT ONE +0BE7 ; [.1CA4.0020.0002] # TAMIL DIGIT ONE +0C67 ; [.1CA4.0020.0002] # TELUGU DIGIT ONE +0C79 ; [.1CA4.0020.0002] # TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR +0C7C ; [.1CA4.0020.0002] # TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR +0CE7 ; [.1CA4.0020.0002] # KANNADA DIGIT ONE +0D67 ; [.1CA4.0020.0002] # MALAYALAM DIGIT ONE +0DE7 ; [.1CA4.0020.0002] # SINHALA LITH DIGIT ONE +0E51 ; [.1CA4.0020.0002] # THAI DIGIT ONE +0ED1 ; [.1CA4.0020.0002] # LAO DIGIT ONE +0F21 ; [.1CA4.0020.0002] # TIBETAN DIGIT ONE +1041 ; [.1CA4.0020.0002] # MYANMAR DIGIT ONE +1091 ; [.1CA4.0020.0002] # MYANMAR SHAN DIGIT ONE +1369 ; [.1CA4.0020.0002] # ETHIOPIC DIGIT ONE +17E1 ; [.1CA4.0020.0002] # KHMER DIGIT ONE +17F1 ; [.1CA4.0020.0002] # KHMER SYMBOL LEK ATTAK MUOY +1811 ; [.1CA4.0020.0002] # MONGOLIAN DIGIT ONE +1947 ; [.1CA4.0020.0002] # LIMBU DIGIT ONE +19D1 ; [.1CA4.0020.0002] # NEW TAI LUE DIGIT ONE +19DA ; [.1CA4.0020.0002] # NEW TAI LUE THAM DIGIT ONE +1A81 ; [.1CA4.0020.0002] # TAI THAM HORA DIGIT ONE +1A91 ; [.1CA4.0020.0002] # TAI THAM THAM DIGIT ONE +1B51 ; [.1CA4.0020.0002] # BALINESE DIGIT ONE +1BB1 ; [.1CA4.0020.0002] # SUNDANESE DIGIT ONE +1C41 ; [.1CA4.0020.0002] # LEPCHA DIGIT ONE +1C51 ; [.1CA4.0020.0002] # OL CHIKI DIGIT ONE +3021 ; [.1CA4.0020.0002] # HANGZHOU NUMERAL ONE +A621 ; [.1CA4.0020.0002] # VAI DIGIT ONE +A8D1 ; [.1CA4.0020.0002] # SAURASHTRA DIGIT ONE +A901 ; [.1CA4.0020.0002] # KAYAH LI DIGIT ONE +A9D1 ; [.1CA4.0020.0002] # JAVANESE DIGIT ONE +A9F1 ; [.1CA4.0020.0002] # MYANMAR TAI LAING DIGIT ONE +AA51 ; [.1CA4.0020.0002] # CHAM DIGIT ONE +ABF1 ; [.1CA4.0020.0002] # MEETEI MAYEK DIGIT ONE +10107 ; [.1CA4.0020.0002] # AEGEAN NUMBER ONE +10142 ; [.1CA4.0020.0002] # GREEK ACROPHONIC ATTIC ONE DRACHMA +10158 ; [.1CA4.0020.0002] # GREEK ACROPHONIC HERAEUM ONE PLETHRON +10159 ; [.1CA4.0020.0002] # GREEK ACROPHONIC THESPIAN ONE +1015A ; [.1CA4.0020.0002] # GREEK ACROPHONIC HERMIONIAN ONE +102E1 ; [.1CA4.0020.0002] # COPTIC EPACT DIGIT ONE +10320 ; [.1CA4.0020.0002] # OLD ITALIC NUMERAL ONE +103D1 ; [.1CA4.0020.0002] # OLD PERSIAN NUMBER ONE +104A1 ; [.1CA4.0020.0002] # OSMANYA DIGIT ONE +10858 ; [.1CA4.0020.0002] # IMPERIAL ARAMAIC NUMBER ONE +10879 ; [.1CA4.0020.0002] # PALMYRENE NUMBER ONE +108A7 ; [.1CA4.0020.0002] # NABATAEAN NUMBER ONE +108FB ; [.1CA4.0020.0002] # HATRAN NUMBER ONE +10916 ; [.1CA4.0020.0002] # PHOENICIAN NUMBER ONE +109C0 ; [.1CA4.0020.0002] # MEROITIC CURSIVE NUMBER ONE +10A40 ; [.1CA4.0020.0002] # KHAROSHTHI DIGIT ONE +10A7D ; [.1CA4.0020.0002] # OLD SOUTH ARABIAN NUMBER ONE +10A9D ; [.1CA4.0020.0002] # OLD NORTH ARABIAN NUMBER ONE +10AEB ; [.1CA4.0020.0002] # MANICHAEAN NUMBER ONE +10B58 ; [.1CA4.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER ONE +10B78 ; [.1CA4.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER ONE +10BA9 ; [.1CA4.0020.0002] # PSALTER PAHLAVI NUMBER ONE +10CFA ; [.1CA4.0020.0002] # OLD HUNGARIAN NUMBER ONE +10E60 ; [.1CA4.0020.0002] # RUMI DIGIT ONE +11052 ; [.1CA4.0020.0002] # BRAHMI NUMBER ONE +11067 ; [.1CA4.0020.0002] # BRAHMI DIGIT ONE +110F1 ; [.1CA4.0020.0002] # SORA SOMPENG DIGIT ONE +11137 ; [.1CA4.0020.0002] # CHAKMA DIGIT ONE +111D1 ; [.1CA4.0020.0002] # SHARADA DIGIT ONE +111E1 ; [.1CA4.0020.0002] # SINHALA ARCHAIC DIGIT ONE +112F1 ; [.1CA4.0020.0002] # KHUDAWADI DIGIT ONE +11451 ; [.1CA4.0020.0002] # NEWA DIGIT ONE +114D1 ; [.1CA4.0020.0002] # TIRHUTA DIGIT ONE +11651 ; [.1CA4.0020.0002] # MODI DIGIT ONE +116C1 ; [.1CA4.0020.0002] # TAKRI DIGIT ONE +11731 ; [.1CA4.0020.0002] # AHOM DIGIT ONE +118E1 ; [.1CA4.0020.0002] # WARANG CITI DIGIT ONE +11C51 ; [.1CA4.0020.0002] # BHAIKSUKI DIGIT ONE +11C5A ; [.1CA4.0020.0002] # BHAIKSUKI NUMBER ONE +11D51 ; [.1CA4.0020.0002] # MASARAM GONDI DIGIT ONE +12415 ; [.1CA4.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESH2 +1241E ; [.1CA4.0020.0002] # CUNEIFORM NUMERIC SIGN ONE GESHU +1242C ; [.1CA4.0020.0002] # CUNEIFORM NUMERIC SIGN ONE SHARU +12434 ; [.1CA4.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BURU +1244F ; [.1CA4.0020.0002] # CUNEIFORM NUMERIC SIGN ONE BAN2 +12458 ; [.1CA4.0020.0002] # CUNEIFORM NUMERIC SIGN ONE ESHE3 +16A61 ; [.1CA4.0020.0002] # MRO DIGIT ONE +16B51 ; [.1CA4.0020.0002] # PAHAWH HMONG DIGIT ONE +1D360 ; [.1CA4.0020.0002] # COUNTING ROD UNIT DIGIT ONE +1E8C7 ; [.1CA4.0020.0002] # MENDE KIKAKUI DIGIT ONE +1E951 ; [.1CA4.0020.0002] # ADLAM DIGIT ONE +FF11 ; [.1CA4.0020.0003] # FULLWIDTH DIGIT ONE +0F2A ; [.1CA4.0020.0004] # TIBETAN DIGIT HALF ONE +2474 ; [*0318.0020.0004][.1CA4.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT ONE +2488 ; [.1CA4.0020.0004][*0278.0020.0004] # DIGIT ONE FULL STOP +1F102 ; [.1CA4.0020.0004][*0222.0020.0004] # DIGIT ONE COMMA +1D7CF ; [.1CA4.0020.0005] # MATHEMATICAL BOLD DIGIT ONE +1D7D9 ; [.1CA4.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7E3 ; [.1CA4.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ONE +1D7ED ; [.1CA4.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7F7 ; [.1CA4.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ONE +2460 ; [.1CA4.0020.0006] # CIRCLED DIGIT ONE +24F5 ; [.1CA4.0020.0006] # DOUBLE CIRCLED DIGIT ONE +2776 ; [.1CA4.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT ONE +2780 ; [.1CA4.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ONE +278A ; [.1CA4.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +00B9 ; [.1CA4.0020.0014] # SUPERSCRIPT ONE +2081 ; [.1CA4.0020.0015] # SUBSCRIPT ONE +215F ; [.1CA4.0020.001E][*063C.0020.001E] # FRACTION NUMERATOR ONE +247D ; [*0318.0020.0004][.1CA4.0020.0004][.1CA3.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER TEN +2491 ; [.1CA4.0020.0004][.1CA3.0020.0004][*0278.0020.0004] # NUMBER TEN FULL STOP +2469 ; [.1CA4.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER TEN +24FE ; [.1CA4.0020.0006][.1CA3.0020.0006] # DOUBLE CIRCLED NUMBER TEN +277F ; [.1CA4.0020.0006][.1CA3.0020.0006] # DINGBAT NEGATIVE CIRCLED NUMBER TEN +2789 ; [.1CA4.0020.0006][.1CA3.0020.0006] # DINGBAT CIRCLED SANS-SERIF NUMBER TEN +2793 ; [.1CA4.0020.0006][.1CA3.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +3248 ; [.1CA4.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER TEN ON BLACK SQUARE +33E9 ; [.1CA4.0020.0004][.1CA3.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +32C9 ; [.1CA4.0020.0004][.1CA3.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +3362 ; [.1CA4.0020.0004][.1CA3.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +247E ; [*0318.0020.0004][.1CA4.0020.0004][.1CA4.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER ELEVEN +2492 ; [.1CA4.0020.0004][.1CA4.0020.0004][*0278.0020.0004] # NUMBER ELEVEN FULL STOP +246A ; [.1CA4.0020.0006][.1CA4.0020.0006] # CIRCLED NUMBER ELEVEN +24EB ; [.1CA4.0020.0006][.1CA4.0020.0006] # NEGATIVE CIRCLED NUMBER ELEVEN +2152 ; [.1CA4.0020.001E][*063C.0020.001E][.1CA4.0020.001E][.1CA3.0020.001E] # VULGAR FRACTION ONE TENTH +33EA ; [.1CA4.0020.0004][.1CA4.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +32CA ; [.1CA4.0020.0004][.1CA4.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +3363 ; [.1CA4.0020.0004][.1CA4.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +247F ; [*0318.0020.0004][.1CA4.0020.0004][.1CA5.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER TWELVE +2493 ; [.1CA4.0020.0004][.1CA5.0020.0004][*0278.0020.0004] # NUMBER TWELVE FULL STOP +246B ; [.1CA4.0020.0006][.1CA5.0020.0006] # CIRCLED NUMBER TWELVE +24EC ; [.1CA4.0020.0006][.1CA5.0020.0006] # NEGATIVE CIRCLED NUMBER TWELVE +00BD ; [.1CA4.0020.001E][*063C.0020.001E][.1CA5.0020.001E] # VULGAR FRACTION ONE HALF +1F1A4 ; [.1CA4.0020.001C][.1CA5.0020.001C][.1CA3.0020.001C][.1E72.0020.001D] # SQUARED ONE HUNDRED TWENTY P +33EB ; [.1CA4.0020.0004][.1CA5.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +32CB ; [.1CA4.0020.0004][.1CA5.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +3364 ; [.1CA4.0020.0004][.1CA5.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +2480 ; [*0318.0020.0004][.1CA4.0020.0004][.1CA6.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER THIRTEEN +2494 ; [.1CA4.0020.0004][.1CA6.0020.0004][*0278.0020.0004] # NUMBER THIRTEEN FULL STOP +246C ; [.1CA4.0020.0006][.1CA6.0020.0006] # CIRCLED NUMBER THIRTEEN +24ED ; [.1CA4.0020.0006][.1CA6.0020.0006] # NEGATIVE CIRCLED NUMBER THIRTEEN +2153 ; [.1CA4.0020.001E][*063C.0020.001E][.1CA6.0020.001E] # VULGAR FRACTION ONE THIRD +33EC ; [.1CA4.0020.0004][.1CA6.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +3365 ; [.1CA4.0020.0004][.1CA6.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +2481 ; [*0318.0020.0004][.1CA4.0020.0004][.1CA7.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER FOURTEEN +2495 ; [.1CA4.0020.0004][.1CA7.0020.0004][*0278.0020.0004] # NUMBER FOURTEEN FULL STOP +246D ; [.1CA4.0020.0006][.1CA7.0020.0006] # CIRCLED NUMBER FOURTEEN +24EE ; [.1CA4.0020.0006][.1CA7.0020.0006] # NEGATIVE CIRCLED NUMBER FOURTEEN +00BC ; [.1CA4.0020.001E][*063C.0020.001E][.1CA7.0020.001E] # VULGAR FRACTION ONE QUARTER +33ED ; [.1CA4.0020.0004][.1CA7.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +3366 ; [.1CA4.0020.0004][.1CA7.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +2482 ; [*0318.0020.0004][.1CA4.0020.0004][.1CA8.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER FIFTEEN +2496 ; [.1CA4.0020.0004][.1CA8.0020.0004][*0278.0020.0004] # NUMBER FIFTEEN FULL STOP +246E ; [.1CA4.0020.0006][.1CA8.0020.0006] # CIRCLED NUMBER FIFTEEN +24EF ; [.1CA4.0020.0006][.1CA8.0020.0006] # NEGATIVE CIRCLED NUMBER FIFTEEN +2155 ; [.1CA4.0020.001E][*063C.0020.001E][.1CA8.0020.001E] # VULGAR FRACTION ONE FIFTH +33EE ; [.1CA4.0020.0004][.1CA8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +3367 ; [.1CA4.0020.0004][.1CA8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +2483 ; [*0318.0020.0004][.1CA4.0020.0004][.1CA9.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER SIXTEEN +2497 ; [.1CA4.0020.0004][.1CA9.0020.0004][*0278.0020.0004] # NUMBER SIXTEEN FULL STOP +246F ; [.1CA4.0020.0006][.1CA9.0020.0006] # CIRCLED NUMBER SIXTEEN +24F0 ; [.1CA4.0020.0006][.1CA9.0020.0006] # NEGATIVE CIRCLED NUMBER SIXTEEN +2159 ; [.1CA4.0020.001E][*063C.0020.001E][.1CA9.0020.001E] # VULGAR FRACTION ONE SIXTH +33EF ; [.1CA4.0020.0004][.1CA9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +3368 ; [.1CA4.0020.0004][.1CA9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +2484 ; [*0318.0020.0004][.1CA4.0020.0004][.1CAA.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER SEVENTEEN +2498 ; [.1CA4.0020.0004][.1CAA.0020.0004][*0278.0020.0004] # NUMBER SEVENTEEN FULL STOP +2470 ; [.1CA4.0020.0006][.1CAA.0020.0006] # CIRCLED NUMBER SEVENTEEN +24F1 ; [.1CA4.0020.0006][.1CAA.0020.0006] # NEGATIVE CIRCLED NUMBER SEVENTEEN +2150 ; [.1CA4.0020.001E][*063C.0020.001E][.1CAA.0020.001E] # VULGAR FRACTION ONE SEVENTH +33F0 ; [.1CA4.0020.0004][.1CAA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +3369 ; [.1CA4.0020.0004][.1CAA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +2485 ; [*0318.0020.0004][.1CA4.0020.0004][.1CAB.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER EIGHTEEN +2499 ; [.1CA4.0020.0004][.1CAB.0020.0004][*0278.0020.0004] # NUMBER EIGHTEEN FULL STOP +2471 ; [.1CA4.0020.0006][.1CAB.0020.0006] # CIRCLED NUMBER EIGHTEEN +24F2 ; [.1CA4.0020.0006][.1CAB.0020.0006] # NEGATIVE CIRCLED NUMBER EIGHTEEN +215B ; [.1CA4.0020.001E][*063C.0020.001E][.1CAB.0020.001E] # VULGAR FRACTION ONE EIGHTH +33F1 ; [.1CA4.0020.0004][.1CAB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +336A ; [.1CA4.0020.0004][.1CAB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +2486 ; [*0318.0020.0004][.1CA4.0020.0004][.1CAC.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER NINETEEN +249A ; [.1CA4.0020.0004][.1CAC.0020.0004][*0278.0020.0004] # NUMBER NINETEEN FULL STOP +2472 ; [.1CA4.0020.0006][.1CAC.0020.0006] # CIRCLED NUMBER NINETEEN +24F3 ; [.1CA4.0020.0006][.1CAC.0020.0006] # NEGATIVE CIRCLED NUMBER NINETEEN +2151 ; [.1CA4.0020.001E][*063C.0020.001E][.1CAC.0020.001E] # VULGAR FRACTION ONE NINTH +33F2 ; [.1CA4.0020.0004][.1CAC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +336B ; [.1CA4.0020.0004][.1CAC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +33E0 ; [.1CA4.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +32C0 ; [.1CA4.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +3359 ; [.1CA4.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +0032 ; [.1CA5.0020.0002] # DIGIT TWO +0662 ; [.1CA5.0020.0002] # ARABIC-INDIC DIGIT TWO +06F2 ; [.1CA5.0020.0002] # EXTENDED ARABIC-INDIC DIGIT TWO +07C2 ; [.1CA5.0020.0002] # NKO DIGIT TWO +0968 ; [.1CA5.0020.0002] # DEVANAGARI DIGIT TWO +09E8 ; [.1CA5.0020.0002] # BENGALI DIGIT TWO +0A68 ; [.1CA5.0020.0002] # GURMUKHI DIGIT TWO +0AE8 ; [.1CA5.0020.0002] # GUJARATI DIGIT TWO +0B68 ; [.1CA5.0020.0002] # ORIYA DIGIT TWO +0BE8 ; [.1CA5.0020.0002] # TAMIL DIGIT TWO +0C68 ; [.1CA5.0020.0002] # TELUGU DIGIT TWO +0C7A ; [.1CA5.0020.0002] # TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR +0C7D ; [.1CA5.0020.0002] # TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR +0CE8 ; [.1CA5.0020.0002] # KANNADA DIGIT TWO +0D68 ; [.1CA5.0020.0002] # MALAYALAM DIGIT TWO +0DE8 ; [.1CA5.0020.0002] # SINHALA LITH DIGIT TWO +0E52 ; [.1CA5.0020.0002] # THAI DIGIT TWO +0ED2 ; [.1CA5.0020.0002] # LAO DIGIT TWO +0F22 ; [.1CA5.0020.0002] # TIBETAN DIGIT TWO +1042 ; [.1CA5.0020.0002] # MYANMAR DIGIT TWO +1092 ; [.1CA5.0020.0002] # MYANMAR SHAN DIGIT TWO +136A ; [.1CA5.0020.0002] # ETHIOPIC DIGIT TWO +17E2 ; [.1CA5.0020.0002] # KHMER DIGIT TWO +17F2 ; [.1CA5.0020.0002] # KHMER SYMBOL LEK ATTAK PII +1812 ; [.1CA5.0020.0002] # MONGOLIAN DIGIT TWO +1948 ; [.1CA5.0020.0002] # LIMBU DIGIT TWO +19D2 ; [.1CA5.0020.0002] # NEW TAI LUE DIGIT TWO +1A82 ; [.1CA5.0020.0002] # TAI THAM HORA DIGIT TWO +1A92 ; [.1CA5.0020.0002] # TAI THAM THAM DIGIT TWO +1B52 ; [.1CA5.0020.0002] # BALINESE DIGIT TWO +1BB2 ; [.1CA5.0020.0002] # SUNDANESE DIGIT TWO +1C42 ; [.1CA5.0020.0002] # LEPCHA DIGIT TWO +1C52 ; [.1CA5.0020.0002] # OL CHIKI DIGIT TWO +3022 ; [.1CA5.0020.0002] # HANGZHOU NUMERAL TWO +A622 ; [.1CA5.0020.0002] # VAI DIGIT TWO +A8D2 ; [.1CA5.0020.0002] # SAURASHTRA DIGIT TWO +A902 ; [.1CA5.0020.0002] # KAYAH LI DIGIT TWO +A9D2 ; [.1CA5.0020.0002] # JAVANESE DIGIT TWO +A9F2 ; [.1CA5.0020.0002] # MYANMAR TAI LAING DIGIT TWO +AA52 ; [.1CA5.0020.0002] # CHAM DIGIT TWO +ABF2 ; [.1CA5.0020.0002] # MEETEI MAYEK DIGIT TWO +10108 ; [.1CA5.0020.0002] # AEGEAN NUMBER TWO +1015B ; [.1CA5.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO +1015C ; [.1CA5.0020.0002] # GREEK ACROPHONIC THESPIAN TWO +1015D ; [.1CA5.0020.0002] # GREEK ACROPHONIC CYRENAIC TWO DRACHMAS +1015E ; [.1CA5.0020.0002] # GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS +102E2 ; [.1CA5.0020.0002] # COPTIC EPACT DIGIT TWO +103D2 ; [.1CA5.0020.0002] # OLD PERSIAN NUMBER TWO +104A2 ; [.1CA5.0020.0002] # OSMANYA DIGIT TWO +10859 ; [.1CA5.0020.0002] # IMPERIAL ARAMAIC NUMBER TWO +1087A ; [.1CA5.0020.0002] # PALMYRENE NUMBER TWO +108A8 ; [.1CA5.0020.0002] # NABATAEAN NUMBER TWO +1091A ; [.1CA5.0020.0002] # PHOENICIAN NUMBER TWO +109C1 ; [.1CA5.0020.0002] # MEROITIC CURSIVE NUMBER TWO +10A41 ; [.1CA5.0020.0002] # KHAROSHTHI DIGIT TWO +10B59 ; [.1CA5.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER TWO +10B79 ; [.1CA5.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER TWO +10BAA ; [.1CA5.0020.0002] # PSALTER PAHLAVI NUMBER TWO +10E61 ; [.1CA5.0020.0002] # RUMI DIGIT TWO +11053 ; [.1CA5.0020.0002] # BRAHMI NUMBER TWO +11068 ; [.1CA5.0020.0002] # BRAHMI DIGIT TWO +110F2 ; [.1CA5.0020.0002] # SORA SOMPENG DIGIT TWO +11138 ; [.1CA5.0020.0002] # CHAKMA DIGIT TWO +111D2 ; [.1CA5.0020.0002] # SHARADA DIGIT TWO +111E2 ; [.1CA5.0020.0002] # SINHALA ARCHAIC DIGIT TWO +112F2 ; [.1CA5.0020.0002] # KHUDAWADI DIGIT TWO +11452 ; [.1CA5.0020.0002] # NEWA DIGIT TWO +114D2 ; [.1CA5.0020.0002] # TIRHUTA DIGIT TWO +11652 ; [.1CA5.0020.0002] # MODI DIGIT TWO +116C2 ; [.1CA5.0020.0002] # TAKRI DIGIT TWO +11732 ; [.1CA5.0020.0002] # AHOM DIGIT TWO +118E2 ; [.1CA5.0020.0002] # WARANG CITI DIGIT TWO +11C52 ; [.1CA5.0020.0002] # BHAIKSUKI DIGIT TWO +11C5B ; [.1CA5.0020.0002] # BHAIKSUKI NUMBER TWO +11D52 ; [.1CA5.0020.0002] # MASARAM GONDI DIGIT TWO +12400 ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH +12416 ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESH2 +1241F ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO GESHU +12423 ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHAR2 +1242D ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO SHARU +12435 ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BURU +1244A ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ASH TENU +12450 ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO BAN2 +12456 ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAMIN +12459 ; [.1CA5.0020.0002] # CUNEIFORM NUMERIC SIGN TWO ESHE3 +16A62 ; [.1CA5.0020.0002] # MRO DIGIT TWO +16B52 ; [.1CA5.0020.0002] # PAHAWH HMONG DIGIT TWO +1D361 ; [.1CA5.0020.0002] # COUNTING ROD UNIT DIGIT TWO +1E8C8 ; [.1CA5.0020.0002] # MENDE KIKAKUI DIGIT TWO +1E952 ; [.1CA5.0020.0002] # ADLAM DIGIT TWO +FF12 ; [.1CA5.0020.0003] # FULLWIDTH DIGIT TWO +0F2B ; [.1CA5.0020.0004] # TIBETAN DIGIT HALF TWO +2475 ; [*0318.0020.0004][.1CA5.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT TWO +2489 ; [.1CA5.0020.0004][*0278.0020.0004] # DIGIT TWO FULL STOP +1F103 ; [.1CA5.0020.0004][*0222.0020.0004] # DIGIT TWO COMMA +1D7D0 ; [.1CA5.0020.0005] # MATHEMATICAL BOLD DIGIT TWO +1D7DA ; [.1CA5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7E4 ; [.1CA5.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT TWO +1D7EE ; [.1CA5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7F8 ; [.1CA5.0020.0005] # MATHEMATICAL MONOSPACE DIGIT TWO +2461 ; [.1CA5.0020.0006] # CIRCLED DIGIT TWO +24F6 ; [.1CA5.0020.0006] # DOUBLE CIRCLED DIGIT TWO +2777 ; [.1CA5.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT TWO +2781 ; [.1CA5.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT TWO +278B ; [.1CA5.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +00B2 ; [.1CA5.0020.0014] # SUPERSCRIPT TWO +2082 ; [.1CA5.0020.0015] # SUBSCRIPT TWO +2487 ; [*0318.0020.0004][.1CA5.0020.0004][.1CA3.0020.0004][*0319.0020.0004] # PARENTHESIZED NUMBER TWENTY +249B ; [.1CA5.0020.0004][.1CA3.0020.0004][*0278.0020.0004] # NUMBER TWENTY FULL STOP +2473 ; [.1CA5.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER TWENTY +24F4 ; [.1CA5.0020.0006][.1CA3.0020.0006] # NEGATIVE CIRCLED NUMBER TWENTY +3249 ; [.1CA5.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER TWENTY ON BLACK SQUARE +33F3 ; [.1CA5.0020.0004][.1CA3.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +336C ; [.1CA5.0020.0004][.1CA3.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +3251 ; [.1CA5.0020.0006][.1CA4.0020.0006] # CIRCLED NUMBER TWENTY ONE +33F4 ; [.1CA5.0020.0004][.1CA4.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +336D ; [.1CA5.0020.0004][.1CA4.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +3252 ; [.1CA5.0020.0006][.1CA5.0020.0006] # CIRCLED NUMBER TWENTY TWO +1F1A2 ; [.1CA5.0020.001C][.1CA5.0020.001C][*0278.0020.001C][.1CA5.0020.001C] # SQUARED TWENTY-TWO POINT TWO +33F5 ; [.1CA5.0020.0004][.1CA5.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +336E ; [.1CA5.0020.0004][.1CA5.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +3253 ; [.1CA5.0020.0006][.1CA6.0020.0006] # CIRCLED NUMBER TWENTY THREE +2154 ; [.1CA5.0020.001E][*063C.0020.001E][.1CA6.0020.001E] # VULGAR FRACTION TWO THIRDS +33F6 ; [.1CA5.0020.0004][.1CA6.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +336F ; [.1CA5.0020.0004][.1CA6.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3254 ; [.1CA5.0020.0006][.1CA7.0020.0006] # CIRCLED NUMBER TWENTY FOUR +33F7 ; [.1CA5.0020.0004][.1CA7.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +3370 ; [.1CA5.0020.0004][.1CA7.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3255 ; [.1CA5.0020.0006][.1CA8.0020.0006] # CIRCLED NUMBER TWENTY FIVE +2156 ; [.1CA5.0020.001E][*063C.0020.001E][.1CA8.0020.001E] # VULGAR FRACTION TWO FIFTHS +33F8 ; [.1CA5.0020.0004][.1CA8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +3256 ; [.1CA5.0020.0006][.1CA9.0020.0006] # CIRCLED NUMBER TWENTY SIX +33F9 ; [.1CA5.0020.0004][.1CA9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +3257 ; [.1CA5.0020.0006][.1CAA.0020.0006] # CIRCLED NUMBER TWENTY SEVEN +33FA ; [.1CA5.0020.0004][.1CAA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +3258 ; [.1CA5.0020.0006][.1CAB.0020.0006] # CIRCLED NUMBER TWENTY EIGHT +33FB ; [.1CA5.0020.0004][.1CAB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +3259 ; [.1CA5.0020.0006][.1CAC.0020.0006] # CIRCLED NUMBER TWENTY NINE +33FC ; [.1CA5.0020.0004][.1CAC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +1F19D ; [.1CA5.0020.001C][.1DCB.0020.001D] # SQUARED TWO K +1F19C ; [.1CA5.0020.001C][.1E1F.0020.001C][.1CF5.0020.001C][*0209.0020.001C][.1ED7.0020.001D][.1CE0.0020.001C][.1E99.0020.001C] # SQUARED SECOND SCREEN +33E1 ; [.1CA5.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +32C1 ; [.1CA5.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +335A ; [.1CA5.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +0033 ; [.1CA6.0020.0002] # DIGIT THREE +0663 ; [.1CA6.0020.0002] # ARABIC-INDIC DIGIT THREE +06F3 ; [.1CA6.0020.0002] # EXTENDED ARABIC-INDIC DIGIT THREE +07C3 ; [.1CA6.0020.0002] # NKO DIGIT THREE +0969 ; [.1CA6.0020.0002] # DEVANAGARI DIGIT THREE +09E9 ; [.1CA6.0020.0002] # BENGALI DIGIT THREE +0A69 ; [.1CA6.0020.0002] # GURMUKHI DIGIT THREE +0AE9 ; [.1CA6.0020.0002] # GUJARATI DIGIT THREE +0B69 ; [.1CA6.0020.0002] # ORIYA DIGIT THREE +0BE9 ; [.1CA6.0020.0002] # TAMIL DIGIT THREE +0C69 ; [.1CA6.0020.0002] # TELUGU DIGIT THREE +0C7B ; [.1CA6.0020.0002] # TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR +0C7E ; [.1CA6.0020.0002] # TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0CE9 ; [.1CA6.0020.0002] # KANNADA DIGIT THREE +0D69 ; [.1CA6.0020.0002] # MALAYALAM DIGIT THREE +0DE9 ; [.1CA6.0020.0002] # SINHALA LITH DIGIT THREE +0E53 ; [.1CA6.0020.0002] # THAI DIGIT THREE +0ED3 ; [.1CA6.0020.0002] # LAO DIGIT THREE +0F23 ; [.1CA6.0020.0002] # TIBETAN DIGIT THREE +1043 ; [.1CA6.0020.0002] # MYANMAR DIGIT THREE +1093 ; [.1CA6.0020.0002] # MYANMAR SHAN DIGIT THREE +136B ; [.1CA6.0020.0002] # ETHIOPIC DIGIT THREE +17E3 ; [.1CA6.0020.0002] # KHMER DIGIT THREE +17F3 ; [.1CA6.0020.0002] # KHMER SYMBOL LEK ATTAK BEI +1813 ; [.1CA6.0020.0002] # MONGOLIAN DIGIT THREE +1949 ; [.1CA6.0020.0002] # LIMBU DIGIT THREE +19D3 ; [.1CA6.0020.0002] # NEW TAI LUE DIGIT THREE +1A83 ; [.1CA6.0020.0002] # TAI THAM HORA DIGIT THREE +1A93 ; [.1CA6.0020.0002] # TAI THAM THAM DIGIT THREE +1B53 ; [.1CA6.0020.0002] # BALINESE DIGIT THREE +1BB3 ; [.1CA6.0020.0002] # SUNDANESE DIGIT THREE +1C43 ; [.1CA6.0020.0002] # LEPCHA DIGIT THREE +1C53 ; [.1CA6.0020.0002] # OL CHIKI DIGIT THREE +3023 ; [.1CA6.0020.0002] # HANGZHOU NUMERAL THREE +A623 ; [.1CA6.0020.0002] # VAI DIGIT THREE +A8D3 ; [.1CA6.0020.0002] # SAURASHTRA DIGIT THREE +A903 ; [.1CA6.0020.0002] # KAYAH LI DIGIT THREE +A9D3 ; [.1CA6.0020.0002] # JAVANESE DIGIT THREE +A9F3 ; [.1CA6.0020.0002] # MYANMAR TAI LAING DIGIT THREE +AA53 ; [.1CA6.0020.0002] # CHAM DIGIT THREE +ABF3 ; [.1CA6.0020.0002] # MEETEI MAYEK DIGIT THREE +10109 ; [.1CA6.0020.0002] # AEGEAN NUMBER THREE +102E3 ; [.1CA6.0020.0002] # COPTIC EPACT DIGIT THREE +104A3 ; [.1CA6.0020.0002] # OSMANYA DIGIT THREE +1085A ; [.1CA6.0020.0002] # IMPERIAL ARAMAIC NUMBER THREE +1087B ; [.1CA6.0020.0002] # PALMYRENE NUMBER THREE +108A9 ; [.1CA6.0020.0002] # NABATAEAN NUMBER THREE +1091B ; [.1CA6.0020.0002] # PHOENICIAN NUMBER THREE +109C2 ; [.1CA6.0020.0002] # MEROITIC CURSIVE NUMBER THREE +10A42 ; [.1CA6.0020.0002] # KHAROSHTHI DIGIT THREE +10B5A ; [.1CA6.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER THREE +10B7A ; [.1CA6.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER THREE +10BAB ; [.1CA6.0020.0002] # PSALTER PAHLAVI NUMBER THREE +10E62 ; [.1CA6.0020.0002] # RUMI DIGIT THREE +11054 ; [.1CA6.0020.0002] # BRAHMI NUMBER THREE +11069 ; [.1CA6.0020.0002] # BRAHMI DIGIT THREE +110F3 ; [.1CA6.0020.0002] # SORA SOMPENG DIGIT THREE +11139 ; [.1CA6.0020.0002] # CHAKMA DIGIT THREE +111D3 ; [.1CA6.0020.0002] # SHARADA DIGIT THREE +111E3 ; [.1CA6.0020.0002] # SINHALA ARCHAIC DIGIT THREE +112F3 ; [.1CA6.0020.0002] # KHUDAWADI DIGIT THREE +11453 ; [.1CA6.0020.0002] # NEWA DIGIT THREE +114D3 ; [.1CA6.0020.0002] # TIRHUTA DIGIT THREE +11653 ; [.1CA6.0020.0002] # MODI DIGIT THREE +116C3 ; [.1CA6.0020.0002] # TAKRI DIGIT THREE +11733 ; [.1CA6.0020.0002] # AHOM DIGIT THREE +118E3 ; [.1CA6.0020.0002] # WARANG CITI DIGIT THREE +11C53 ; [.1CA6.0020.0002] # BHAIKSUKI DIGIT THREE +11C5C ; [.1CA6.0020.0002] # BHAIKSUKI NUMBER THREE +11D53 ; [.1CA6.0020.0002] # MASARAM GONDI DIGIT THREE +12401 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH +12408 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE DISH +12417 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESH2 +12420 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE GESHU +12424 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 +12425 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM +1242E ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU +1242F ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM +12436 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU +12437 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM +1243A ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16 +1243B ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21 +1244B ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE ASH TENU +12451 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN THREE BAN2 +12457 ; [.1CA6.0020.0002] # CUNEIFORM NUMERIC SIGN NIGIDAESH +16A63 ; [.1CA6.0020.0002] # MRO DIGIT THREE +16B53 ; [.1CA6.0020.0002] # PAHAWH HMONG DIGIT THREE +1D362 ; [.1CA6.0020.0002] # COUNTING ROD UNIT DIGIT THREE +1E8C9 ; [.1CA6.0020.0002] # MENDE KIKAKUI DIGIT THREE +1E953 ; [.1CA6.0020.0002] # ADLAM DIGIT THREE +FF13 ; [.1CA6.0020.0003] # FULLWIDTH DIGIT THREE +0F2C ; [.1CA6.0020.0004] # TIBETAN DIGIT HALF THREE +2476 ; [*0318.0020.0004][.1CA6.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT THREE +248A ; [.1CA6.0020.0004][*0278.0020.0004] # DIGIT THREE FULL STOP +1F104 ; [.1CA6.0020.0004][*0222.0020.0004] # DIGIT THREE COMMA +1D7D1 ; [.1CA6.0020.0005] # MATHEMATICAL BOLD DIGIT THREE +1D7DB ; [.1CA6.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7E5 ; [.1CA6.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT THREE +1D7EF ; [.1CA6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F9 ; [.1CA6.0020.0005] # MATHEMATICAL MONOSPACE DIGIT THREE +2462 ; [.1CA6.0020.0006] # CIRCLED DIGIT THREE +24F7 ; [.1CA6.0020.0006] # DOUBLE CIRCLED DIGIT THREE +2778 ; [.1CA6.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT THREE +2782 ; [.1CA6.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT THREE +278C ; [.1CA6.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +00B3 ; [.1CA6.0020.0014] # SUPERSCRIPT THREE +2083 ; [.1CA6.0020.0015] # SUBSCRIPT THREE +324A ; [.1CA6.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER THIRTY ON BLACK SQUARE +325A ; [.1CA6.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER THIRTY +33FD ; [.1CA6.0020.0004][.1CA3.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +325B ; [.1CA6.0020.0006][.1CA4.0020.0006] # CIRCLED NUMBER THIRTY ONE +33FE ; [.1CA6.0020.0004][.1CA4.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +325C ; [.1CA6.0020.0006][.1CA5.0020.0006] # CIRCLED NUMBER THIRTY TWO +325D ; [.1CA6.0020.0006][.1CA6.0020.0006] # CIRCLED NUMBER THIRTY THREE +325E ; [.1CA6.0020.0006][.1CA7.0020.0006] # CIRCLED NUMBER THIRTY FOUR +00BE ; [.1CA6.0020.001E][*063C.0020.001E][.1CA7.0020.001E] # VULGAR FRACTION THREE QUARTERS +325F ; [.1CA6.0020.0006][.1CA8.0020.0006] # CIRCLED NUMBER THIRTY FIVE +2157 ; [.1CA6.0020.001E][*063C.0020.001E][.1CA8.0020.001E] # VULGAR FRACTION THREE FIFTHS +32B1 ; [.1CA6.0020.0006][.1CA9.0020.0006] # CIRCLED NUMBER THIRTY SIX +32B2 ; [.1CA6.0020.0006][.1CAA.0020.0006] # CIRCLED NUMBER THIRTY SEVEN +32B3 ; [.1CA6.0020.0006][.1CAB.0020.0006] # CIRCLED NUMBER THIRTY EIGHT +215C ; [.1CA6.0020.001E][*063C.0020.001E][.1CAB.0020.001E] # VULGAR FRACTION THREE EIGHTHS +32B4 ; [.1CA6.0020.0006][.1CAC.0020.0006] # CIRCLED NUMBER THIRTY NINE +1F19B ; [.1CA6.0020.001C][.1CF5.0020.001D] # SQUARED THREE D +33E2 ; [.1CA6.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +32C2 ; [.1CA6.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +335B ; [.1CA6.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +0034 ; [.1CA7.0020.0002] # DIGIT FOUR +0664 ; [.1CA7.0020.0002] # ARABIC-INDIC DIGIT FOUR +06F4 ; [.1CA7.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FOUR +07C4 ; [.1CA7.0020.0002] # NKO DIGIT FOUR +096A ; [.1CA7.0020.0002] # DEVANAGARI DIGIT FOUR +09EA ; [.1CA7.0020.0002] # BENGALI DIGIT FOUR +0A6A ; [.1CA7.0020.0002] # GURMUKHI DIGIT FOUR +0AEA ; [.1CA7.0020.0002] # GUJARATI DIGIT FOUR +0B6A ; [.1CA7.0020.0002] # ORIYA DIGIT FOUR +0BEA ; [.1CA7.0020.0002] # TAMIL DIGIT FOUR +0C6A ; [.1CA7.0020.0002] # TELUGU DIGIT FOUR +0CEA ; [.1CA7.0020.0002] # KANNADA DIGIT FOUR +0D6A ; [.1CA7.0020.0002] # MALAYALAM DIGIT FOUR +0DEA ; [.1CA7.0020.0002] # SINHALA LITH DIGIT FOUR +0E54 ; [.1CA7.0020.0002] # THAI DIGIT FOUR +0ED4 ; [.1CA7.0020.0002] # LAO DIGIT FOUR +0F24 ; [.1CA7.0020.0002] # TIBETAN DIGIT FOUR +1044 ; [.1CA7.0020.0002] # MYANMAR DIGIT FOUR +1094 ; [.1CA7.0020.0002] # MYANMAR SHAN DIGIT FOUR +136C ; [.1CA7.0020.0002] # ETHIOPIC DIGIT FOUR +17E4 ; [.1CA7.0020.0002] # KHMER DIGIT FOUR +17F4 ; [.1CA7.0020.0002] # KHMER SYMBOL LEK ATTAK BUON +1814 ; [.1CA7.0020.0002] # MONGOLIAN DIGIT FOUR +194A ; [.1CA7.0020.0002] # LIMBU DIGIT FOUR +19D4 ; [.1CA7.0020.0002] # NEW TAI LUE DIGIT FOUR +1A84 ; [.1CA7.0020.0002] # TAI THAM HORA DIGIT FOUR +1A94 ; [.1CA7.0020.0002] # TAI THAM THAM DIGIT FOUR +1B54 ; [.1CA7.0020.0002] # BALINESE DIGIT FOUR +1BB4 ; [.1CA7.0020.0002] # SUNDANESE DIGIT FOUR +1C44 ; [.1CA7.0020.0002] # LEPCHA DIGIT FOUR +1C54 ; [.1CA7.0020.0002] # OL CHIKI DIGIT FOUR +3024 ; [.1CA7.0020.0002] # HANGZHOU NUMERAL FOUR +A624 ; [.1CA7.0020.0002] # VAI DIGIT FOUR +A8D4 ; [.1CA7.0020.0002] # SAURASHTRA DIGIT FOUR +A904 ; [.1CA7.0020.0002] # KAYAH LI DIGIT FOUR +A9D4 ; [.1CA7.0020.0002] # JAVANESE DIGIT FOUR +A9F4 ; [.1CA7.0020.0002] # MYANMAR TAI LAING DIGIT FOUR +AA54 ; [.1CA7.0020.0002] # CHAM DIGIT FOUR +ABF4 ; [.1CA7.0020.0002] # MEETEI MAYEK DIGIT FOUR +1010A ; [.1CA7.0020.0002] # AEGEAN NUMBER FOUR +102E4 ; [.1CA7.0020.0002] # COPTIC EPACT DIGIT FOUR +104A4 ; [.1CA7.0020.0002] # OSMANYA DIGIT FOUR +1087C ; [.1CA7.0020.0002] # PALMYRENE NUMBER FOUR +108AA ; [.1CA7.0020.0002] # NABATAEAN NUMBER FOUR +108AB ; [.1CA7.0020.0002] # NABATAEAN CRUCIFORM NUMBER FOUR +109C3 ; [.1CA7.0020.0002] # MEROITIC CURSIVE NUMBER FOUR +10A43 ; [.1CA7.0020.0002] # KHAROSHTHI DIGIT FOUR +10B5B ; [.1CA7.0020.0002] # INSCRIPTIONAL PARTHIAN NUMBER FOUR +10B7B ; [.1CA7.0020.0002] # INSCRIPTIONAL PAHLAVI NUMBER FOUR +10BAC ; [.1CA7.0020.0002] # PSALTER PAHLAVI NUMBER FOUR +10E63 ; [.1CA7.0020.0002] # RUMI DIGIT FOUR +11055 ; [.1CA7.0020.0002] # BRAHMI NUMBER FOUR +1106A ; [.1CA7.0020.0002] # BRAHMI DIGIT FOUR +110F4 ; [.1CA7.0020.0002] # SORA SOMPENG DIGIT FOUR +1113A ; [.1CA7.0020.0002] # CHAKMA DIGIT FOUR +111D4 ; [.1CA7.0020.0002] # SHARADA DIGIT FOUR +111E4 ; [.1CA7.0020.0002] # SINHALA ARCHAIC DIGIT FOUR +112F4 ; [.1CA7.0020.0002] # KHUDAWADI DIGIT FOUR +11454 ; [.1CA7.0020.0002] # NEWA DIGIT FOUR +114D4 ; [.1CA7.0020.0002] # TIRHUTA DIGIT FOUR +11654 ; [.1CA7.0020.0002] # MODI DIGIT FOUR +116C4 ; [.1CA7.0020.0002] # TAKRI DIGIT FOUR +11734 ; [.1CA7.0020.0002] # AHOM DIGIT FOUR +118E4 ; [.1CA7.0020.0002] # WARANG CITI DIGIT FOUR +11C54 ; [.1CA7.0020.0002] # BHAIKSUKI DIGIT FOUR +11C5D ; [.1CA7.0020.0002] # BHAIKSUKI NUMBER FOUR +11D54 ; [.1CA7.0020.0002] # MASARAM GONDI DIGIT FOUR +12402 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH +12409 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR DISH +1240F ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U +12418 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESH2 +12421 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR GESHU +12426 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHAR2 +12430 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR SHARU +12438 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BURU +1243C ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU +1243D ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4 +1243E ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A +1243F ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B +1244C ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR ASH TENU +12452 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 +12453 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM +12469 ; [.1CA7.0020.0002] # CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM +16A64 ; [.1CA7.0020.0002] # MRO DIGIT FOUR +16B54 ; [.1CA7.0020.0002] # PAHAWH HMONG DIGIT FOUR +1D363 ; [.1CA7.0020.0002] # COUNTING ROD UNIT DIGIT FOUR +1E8CA ; [.1CA7.0020.0002] # MENDE KIKAKUI DIGIT FOUR +1E954 ; [.1CA7.0020.0002] # ADLAM DIGIT FOUR +FF14 ; [.1CA7.0020.0003] # FULLWIDTH DIGIT FOUR +0F2D ; [.1CA7.0020.0004] # TIBETAN DIGIT HALF FOUR +2477 ; [*0318.0020.0004][.1CA7.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT FOUR +248B ; [.1CA7.0020.0004][*0278.0020.0004] # DIGIT FOUR FULL STOP +1F105 ; [.1CA7.0020.0004][*0222.0020.0004] # DIGIT FOUR COMMA +1D7D2 ; [.1CA7.0020.0005] # MATHEMATICAL BOLD DIGIT FOUR +1D7DC ; [.1CA7.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7E6 ; [.1CA7.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7F0 ; [.1CA7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7FA ; [.1CA7.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FOUR +2463 ; [.1CA7.0020.0006] # CIRCLED DIGIT FOUR +24F8 ; [.1CA7.0020.0006] # DOUBLE CIRCLED DIGIT FOUR +2779 ; [.1CA7.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FOUR +2783 ; [.1CA7.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +278D ; [.1CA7.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +2074 ; [.1CA7.0020.0014] # SUPERSCRIPT FOUR +2084 ; [.1CA7.0020.0015] # SUBSCRIPT FOUR +324B ; [.1CA7.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER FORTY ON BLACK SQUARE +32B5 ; [.1CA7.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER FORTY +32B6 ; [.1CA7.0020.0006][.1CA4.0020.0006] # CIRCLED NUMBER FORTY ONE +32B7 ; [.1CA7.0020.0006][.1CA5.0020.0006] # CIRCLED NUMBER FORTY TWO +32B8 ; [.1CA7.0020.0006][.1CA6.0020.0006] # CIRCLED NUMBER FORTY THREE +32B9 ; [.1CA7.0020.0006][.1CA7.0020.0006] # CIRCLED NUMBER FORTY FOUR +32BA ; [.1CA7.0020.0006][.1CA8.0020.0006] # CIRCLED NUMBER FORTY FIVE +2158 ; [.1CA7.0020.001E][*063C.0020.001E][.1CA8.0020.001E] # VULGAR FRACTION FOUR FIFTHS +32BB ; [.1CA7.0020.0006][.1CA9.0020.0006] # CIRCLED NUMBER FORTY SIX +32BC ; [.1CA7.0020.0006][.1CAA.0020.0006] # CIRCLED NUMBER FORTY SEVEN +32BD ; [.1CA7.0020.0006][.1CAB.0020.0006] # CIRCLED NUMBER FORTY EIGHT +32BE ; [.1CA7.0020.0006][.1CAC.0020.0006] # CIRCLED NUMBER FORTY NINE +1F19E ; [.1CA7.0020.001C][.1DCB.0020.001D] # SQUARED FOUR K +33E3 ; [.1CA7.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +32C3 ; [.1CA7.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +335C ; [.1CA7.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +0035 ; [.1CA8.0020.0002] # DIGIT FIVE +0665 ; [.1CA8.0020.0002] # ARABIC-INDIC DIGIT FIVE +06F5 ; [.1CA8.0020.0002] # EXTENDED ARABIC-INDIC DIGIT FIVE +07C5 ; [.1CA8.0020.0002] # NKO DIGIT FIVE +096B ; [.1CA8.0020.0002] # DEVANAGARI DIGIT FIVE +09EB ; [.1CA8.0020.0002] # BENGALI DIGIT FIVE +0A6B ; [.1CA8.0020.0002] # GURMUKHI DIGIT FIVE +0AEB ; [.1CA8.0020.0002] # GUJARATI DIGIT FIVE +0B6B ; [.1CA8.0020.0002] # ORIYA DIGIT FIVE +0BEB ; [.1CA8.0020.0002] # TAMIL DIGIT FIVE +0C6B ; [.1CA8.0020.0002] # TELUGU DIGIT FIVE +0CEB ; [.1CA8.0020.0002] # KANNADA DIGIT FIVE +0D6B ; [.1CA8.0020.0002] # MALAYALAM DIGIT FIVE +0DEB ; [.1CA8.0020.0002] # SINHALA LITH DIGIT FIVE +0E55 ; [.1CA8.0020.0002] # THAI DIGIT FIVE +0ED5 ; [.1CA8.0020.0002] # LAO DIGIT FIVE +0F25 ; [.1CA8.0020.0002] # TIBETAN DIGIT FIVE +1045 ; [.1CA8.0020.0002] # MYANMAR DIGIT FIVE +1095 ; [.1CA8.0020.0002] # MYANMAR SHAN DIGIT FIVE +136D ; [.1CA8.0020.0002] # ETHIOPIC DIGIT FIVE +17E5 ; [.1CA8.0020.0002] # KHMER DIGIT FIVE +17F5 ; [.1CA8.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM +1815 ; [.1CA8.0020.0002] # MONGOLIAN DIGIT FIVE +194B ; [.1CA8.0020.0002] # LIMBU DIGIT FIVE +19D5 ; [.1CA8.0020.0002] # NEW TAI LUE DIGIT FIVE +1A85 ; [.1CA8.0020.0002] # TAI THAM HORA DIGIT FIVE +1A95 ; [.1CA8.0020.0002] # TAI THAM THAM DIGIT FIVE +1B55 ; [.1CA8.0020.0002] # BALINESE DIGIT FIVE +1BB5 ; [.1CA8.0020.0002] # SUNDANESE DIGIT FIVE +1C45 ; [.1CA8.0020.0002] # LEPCHA DIGIT FIVE +1C55 ; [.1CA8.0020.0002] # OL CHIKI DIGIT FIVE +3025 ; [.1CA8.0020.0002] # HANGZHOU NUMERAL FIVE +A625 ; [.1CA8.0020.0002] # VAI DIGIT FIVE +A8D5 ; [.1CA8.0020.0002] # SAURASHTRA DIGIT FIVE +A905 ; [.1CA8.0020.0002] # KAYAH LI DIGIT FIVE +A9D5 ; [.1CA8.0020.0002] # JAVANESE DIGIT FIVE +A9F5 ; [.1CA8.0020.0002] # MYANMAR TAI LAING DIGIT FIVE +AA55 ; [.1CA8.0020.0002] # CHAM DIGIT FIVE +ABF5 ; [.1CA8.0020.0002] # MEETEI MAYEK DIGIT FIVE +1010B ; [.1CA8.0020.0002] # AEGEAN NUMBER FIVE +10143 ; [.1CA8.0020.0002] # GREEK ACROPHONIC ATTIC FIVE +10148 ; [.1CA8.0020.0002] # GREEK ACROPHONIC ATTIC FIVE TALENTS +1014F ; [.1CA8.0020.0002] # GREEK ACROPHONIC ATTIC FIVE STATERS +1015F ; [.1CA8.0020.0002] # GREEK ACROPHONIC TROEZENIAN FIVE +10173 ; [.1CA8.0020.0002] # GREEK ACROPHONIC DELPHIC FIVE MNAS +102E5 ; [.1CA8.0020.0002] # COPTIC EPACT DIGIT FIVE +10321 ; [.1CA8.0020.0002] # OLD ITALIC NUMERAL FIVE +104A5 ; [.1CA8.0020.0002] # OSMANYA DIGIT FIVE +1087D ; [.1CA8.0020.0002] # PALMYRENE NUMBER FIVE +108AC ; [.1CA8.0020.0002] # NABATAEAN NUMBER FIVE +108FC ; [.1CA8.0020.0002] # HATRAN NUMBER FIVE +109C4 ; [.1CA8.0020.0002] # MEROITIC CURSIVE NUMBER FIVE +10AEC ; [.1CA8.0020.0002] # MANICHAEAN NUMBER FIVE +10CFB ; [.1CA8.0020.0002] # OLD HUNGARIAN NUMBER FIVE +10E64 ; [.1CA8.0020.0002] # RUMI DIGIT FIVE +11056 ; [.1CA8.0020.0002] # BRAHMI NUMBER FIVE +1106B ; [.1CA8.0020.0002] # BRAHMI DIGIT FIVE +110F5 ; [.1CA8.0020.0002] # SORA SOMPENG DIGIT FIVE +1113B ; [.1CA8.0020.0002] # CHAKMA DIGIT FIVE +111D5 ; [.1CA8.0020.0002] # SHARADA DIGIT FIVE +111E5 ; [.1CA8.0020.0002] # SINHALA ARCHAIC DIGIT FIVE +112F5 ; [.1CA8.0020.0002] # KHUDAWADI DIGIT FIVE +11455 ; [.1CA8.0020.0002] # NEWA DIGIT FIVE +114D5 ; [.1CA8.0020.0002] # TIRHUTA DIGIT FIVE +11655 ; [.1CA8.0020.0002] # MODI DIGIT FIVE +116C5 ; [.1CA8.0020.0002] # TAKRI DIGIT FIVE +11735 ; [.1CA8.0020.0002] # AHOM DIGIT FIVE +118E5 ; [.1CA8.0020.0002] # WARANG CITI DIGIT FIVE +11C55 ; [.1CA8.0020.0002] # BHAIKSUKI DIGIT FIVE +11C5E ; [.1CA8.0020.0002] # BHAIKSUKI NUMBER FIVE +11D55 ; [.1CA8.0020.0002] # MASARAM GONDI DIGIT FIVE +12403 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH +1240A ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE DISH +12410 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U +12419 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESH2 +12422 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE GESHU +12427 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHAR2 +12431 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE SHARU +12439 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BURU +1244D ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE ASH TENU +12454 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 +12455 ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM +1246A ; [.1CA8.0020.0002] # CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM +16A65 ; [.1CA8.0020.0002] # MRO DIGIT FIVE +16B55 ; [.1CA8.0020.0002] # PAHAWH HMONG DIGIT FIVE +1D364 ; [.1CA8.0020.0002] # COUNTING ROD UNIT DIGIT FIVE +1E8CB ; [.1CA8.0020.0002] # MENDE KIKAKUI DIGIT FIVE +1E955 ; [.1CA8.0020.0002] # ADLAM DIGIT FIVE +FF15 ; [.1CA8.0020.0003] # FULLWIDTH DIGIT FIVE +0F2E ; [.1CA8.0020.0004] # TIBETAN DIGIT HALF FIVE +2478 ; [*0318.0020.0004][.1CA8.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT FIVE +248C ; [.1CA8.0020.0004][*0278.0020.0004] # DIGIT FIVE FULL STOP +1F106 ; [.1CA8.0020.0004][*0222.0020.0004] # DIGIT FIVE COMMA +1D7D3 ; [.1CA8.0020.0005] # MATHEMATICAL BOLD DIGIT FIVE +1D7DD ; [.1CA8.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7E7 ; [.1CA8.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7F1 ; [.1CA8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7FB ; [.1CA8.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FIVE +2464 ; [.1CA8.0020.0006] # CIRCLED DIGIT FIVE +24F9 ; [.1CA8.0020.0006] # DOUBLE CIRCLED DIGIT FIVE +277A ; [.1CA8.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT FIVE +2784 ; [.1CA8.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +278E ; [.1CA8.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +2075 ; [.1CA8.0020.0014] # SUPERSCRIPT FIVE +2085 ; [.1CA8.0020.0015] # SUBSCRIPT FIVE +324C ; [.1CA8.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER FIFTY ON BLACK SQUARE +32BF ; [.1CA8.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER FIFTY +1F1A0 ; [.1CA8.0020.001C][*0278.0020.001C][.1CA4.0020.001C] # SQUARED FIVE POINT ONE +215A ; [.1CA8.0020.001E][*063C.0020.001E][.1CA9.0020.001E] # VULGAR FRACTION FIVE SIXTHS +215D ; [.1CA8.0020.001E][*063C.0020.001E][.1CAB.0020.001E] # VULGAR FRACTION FIVE EIGHTHS +33E4 ; [.1CA8.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +32C4 ; [.1CA8.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +335D ; [.1CA8.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +0036 ; [.1CA9.0020.0002] # DIGIT SIX +0666 ; [.1CA9.0020.0002] # ARABIC-INDIC DIGIT SIX +06F6 ; [.1CA9.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SIX +07C6 ; [.1CA9.0020.0002] # NKO DIGIT SIX +096C ; [.1CA9.0020.0002] # DEVANAGARI DIGIT SIX +09EC ; [.1CA9.0020.0002] # BENGALI DIGIT SIX +0A6C ; [.1CA9.0020.0002] # GURMUKHI DIGIT SIX +0AEC ; [.1CA9.0020.0002] # GUJARATI DIGIT SIX +0B6C ; [.1CA9.0020.0002] # ORIYA DIGIT SIX +0BEC ; [.1CA9.0020.0002] # TAMIL DIGIT SIX +0C6C ; [.1CA9.0020.0002] # TELUGU DIGIT SIX +0CEC ; [.1CA9.0020.0002] # KANNADA DIGIT SIX +0D6C ; [.1CA9.0020.0002] # MALAYALAM DIGIT SIX +0DEC ; [.1CA9.0020.0002] # SINHALA LITH DIGIT SIX +0E56 ; [.1CA9.0020.0002] # THAI DIGIT SIX +0ED6 ; [.1CA9.0020.0002] # LAO DIGIT SIX +0F26 ; [.1CA9.0020.0002] # TIBETAN DIGIT SIX +1046 ; [.1CA9.0020.0002] # MYANMAR DIGIT SIX +1096 ; [.1CA9.0020.0002] # MYANMAR SHAN DIGIT SIX +136E ; [.1CA9.0020.0002] # ETHIOPIC DIGIT SIX +17E6 ; [.1CA9.0020.0002] # KHMER DIGIT SIX +17F6 ; [.1CA9.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-MUOY +1816 ; [.1CA9.0020.0002] # MONGOLIAN DIGIT SIX +194C ; [.1CA9.0020.0002] # LIMBU DIGIT SIX +19D6 ; [.1CA9.0020.0002] # NEW TAI LUE DIGIT SIX +1A86 ; [.1CA9.0020.0002] # TAI THAM HORA DIGIT SIX +1A96 ; [.1CA9.0020.0002] # TAI THAM THAM DIGIT SIX +1B56 ; [.1CA9.0020.0002] # BALINESE DIGIT SIX +1BB6 ; [.1CA9.0020.0002] # SUNDANESE DIGIT SIX +1C46 ; [.1CA9.0020.0002] # LEPCHA DIGIT SIX +1C56 ; [.1CA9.0020.0002] # OL CHIKI DIGIT SIX +2185 ; [.1CA9.0020.0002] # ROMAN NUMERAL SIX LATE FORM +3026 ; [.1CA9.0020.0002] # HANGZHOU NUMERAL SIX +A626 ; [.1CA9.0020.0002] # VAI DIGIT SIX +A8D6 ; [.1CA9.0020.0002] # SAURASHTRA DIGIT SIX +A906 ; [.1CA9.0020.0002] # KAYAH LI DIGIT SIX +A9D6 ; [.1CA9.0020.0002] # JAVANESE DIGIT SIX +A9F6 ; [.1CA9.0020.0002] # MYANMAR TAI LAING DIGIT SIX +AA56 ; [.1CA9.0020.0002] # CHAM DIGIT SIX +ABF6 ; [.1CA9.0020.0002] # MEETEI MAYEK DIGIT SIX +1010C ; [.1CA9.0020.0002] # AEGEAN NUMBER SIX +102E6 ; [.1CA9.0020.0002] # COPTIC EPACT DIGIT SIX +104A6 ; [.1CA9.0020.0002] # OSMANYA DIGIT SIX +109C5 ; [.1CA9.0020.0002] # MEROITIC CURSIVE NUMBER SIX +10E65 ; [.1CA9.0020.0002] # RUMI DIGIT SIX +11057 ; [.1CA9.0020.0002] # BRAHMI NUMBER SIX +1106C ; [.1CA9.0020.0002] # BRAHMI DIGIT SIX +110F6 ; [.1CA9.0020.0002] # SORA SOMPENG DIGIT SIX +1113C ; [.1CA9.0020.0002] # CHAKMA DIGIT SIX +111D6 ; [.1CA9.0020.0002] # SHARADA DIGIT SIX +111E6 ; [.1CA9.0020.0002] # SINHALA ARCHAIC DIGIT SIX +112F6 ; [.1CA9.0020.0002] # KHUDAWADI DIGIT SIX +11456 ; [.1CA9.0020.0002] # NEWA DIGIT SIX +114D6 ; [.1CA9.0020.0002] # TIRHUTA DIGIT SIX +11656 ; [.1CA9.0020.0002] # MODI DIGIT SIX +116C6 ; [.1CA9.0020.0002] # TAKRI DIGIT SIX +11736 ; [.1CA9.0020.0002] # AHOM DIGIT SIX +118E6 ; [.1CA9.0020.0002] # WARANG CITI DIGIT SIX +11C56 ; [.1CA9.0020.0002] # BHAIKSUKI DIGIT SIX +11C5F ; [.1CA9.0020.0002] # BHAIKSUKI NUMBER SIX +11D56 ; [.1CA9.0020.0002] # MASARAM GONDI DIGIT SIX +12404 ; [.1CA9.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH +1240B ; [.1CA9.0020.0002] # CUNEIFORM NUMERIC SIGN SIX DISH +12411 ; [.1CA9.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U +1241A ; [.1CA9.0020.0002] # CUNEIFORM NUMERIC SIGN SIX GESH2 +12428 ; [.1CA9.0020.0002] # CUNEIFORM NUMERIC SIGN SIX SHAR2 +12440 ; [.1CA9.0020.0002] # CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9 +1244E ; [.1CA9.0020.0002] # CUNEIFORM NUMERIC SIGN SIX ASH TENU +1246B ; [.1CA9.0020.0002] # CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM +16A66 ; [.1CA9.0020.0002] # MRO DIGIT SIX +16B56 ; [.1CA9.0020.0002] # PAHAWH HMONG DIGIT SIX +1D365 ; [.1CA9.0020.0002] # COUNTING ROD UNIT DIGIT SIX +1E8CC ; [.1CA9.0020.0002] # MENDE KIKAKUI DIGIT SIX +1E956 ; [.1CA9.0020.0002] # ADLAM DIGIT SIX +FF16 ; [.1CA9.0020.0003] # FULLWIDTH DIGIT SIX +0F2F ; [.1CA9.0020.0004] # TIBETAN DIGIT HALF SIX +2479 ; [*0318.0020.0004][.1CA9.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT SIX +248D ; [.1CA9.0020.0004][*0278.0020.0004] # DIGIT SIX FULL STOP +1F107 ; [.1CA9.0020.0004][*0222.0020.0004] # DIGIT SIX COMMA +1D7D4 ; [.1CA9.0020.0005] # MATHEMATICAL BOLD DIGIT SIX +1D7DE ; [.1CA9.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7E8 ; [.1CA9.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SIX +1D7F2 ; [.1CA9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7FC ; [.1CA9.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SIX +2465 ; [.1CA9.0020.0006] # CIRCLED DIGIT SIX +24FA ; [.1CA9.0020.0006] # DOUBLE CIRCLED DIGIT SIX +277B ; [.1CA9.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SIX +2785 ; [.1CA9.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SIX +278F ; [.1CA9.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +2076 ; [.1CA9.0020.0014] # SUPERSCRIPT SIX +2086 ; [.1CA9.0020.0015] # SUBSCRIPT SIX +324D ; [.1CA9.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER SIXTY ON BLACK SQUARE +1F1A3 ; [.1CA9.0020.001C][.1CA3.0020.001C][.1E72.0020.001D] # SQUARED SIXTY P +33E5 ; [.1CA9.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +32C5 ; [.1CA9.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +335E ; [.1CA9.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +0037 ; [.1CAA.0020.0002] # DIGIT SEVEN +0667 ; [.1CAA.0020.0002] # ARABIC-INDIC DIGIT SEVEN +06F7 ; [.1CAA.0020.0002] # EXTENDED ARABIC-INDIC DIGIT SEVEN +07C7 ; [.1CAA.0020.0002] # NKO DIGIT SEVEN +096D ; [.1CAA.0020.0002] # DEVANAGARI DIGIT SEVEN +09ED ; [.1CAA.0020.0002] # BENGALI DIGIT SEVEN +0A6D ; [.1CAA.0020.0002] # GURMUKHI DIGIT SEVEN +0AED ; [.1CAA.0020.0002] # GUJARATI DIGIT SEVEN +0B6D ; [.1CAA.0020.0002] # ORIYA DIGIT SEVEN +0BED ; [.1CAA.0020.0002] # TAMIL DIGIT SEVEN +0C6D ; [.1CAA.0020.0002] # TELUGU DIGIT SEVEN +0CED ; [.1CAA.0020.0002] # KANNADA DIGIT SEVEN +0D6D ; [.1CAA.0020.0002] # MALAYALAM DIGIT SEVEN +0DED ; [.1CAA.0020.0002] # SINHALA LITH DIGIT SEVEN +0E57 ; [.1CAA.0020.0002] # THAI DIGIT SEVEN +0ED7 ; [.1CAA.0020.0002] # LAO DIGIT SEVEN +0F27 ; [.1CAA.0020.0002] # TIBETAN DIGIT SEVEN +1047 ; [.1CAA.0020.0002] # MYANMAR DIGIT SEVEN +1097 ; [.1CAA.0020.0002] # MYANMAR SHAN DIGIT SEVEN +136F ; [.1CAA.0020.0002] # ETHIOPIC DIGIT SEVEN +17E7 ; [.1CAA.0020.0002] # KHMER DIGIT SEVEN +17F7 ; [.1CAA.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-PII +1817 ; [.1CAA.0020.0002] # MONGOLIAN DIGIT SEVEN +194D ; [.1CAA.0020.0002] # LIMBU DIGIT SEVEN +19D7 ; [.1CAA.0020.0002] # NEW TAI LUE DIGIT SEVEN +1A87 ; [.1CAA.0020.0002] # TAI THAM HORA DIGIT SEVEN +1A97 ; [.1CAA.0020.0002] # TAI THAM THAM DIGIT SEVEN +1B57 ; [.1CAA.0020.0002] # BALINESE DIGIT SEVEN +1BB7 ; [.1CAA.0020.0002] # SUNDANESE DIGIT SEVEN +1C47 ; [.1CAA.0020.0002] # LEPCHA DIGIT SEVEN +1C57 ; [.1CAA.0020.0002] # OL CHIKI DIGIT SEVEN +3027 ; [.1CAA.0020.0002] # HANGZHOU NUMERAL SEVEN +A627 ; [.1CAA.0020.0002] # VAI DIGIT SEVEN +A8D7 ; [.1CAA.0020.0002] # SAURASHTRA DIGIT SEVEN +A907 ; [.1CAA.0020.0002] # KAYAH LI DIGIT SEVEN +A9D7 ; [.1CAA.0020.0002] # JAVANESE DIGIT SEVEN +A9F7 ; [.1CAA.0020.0002] # MYANMAR TAI LAING DIGIT SEVEN +AA57 ; [.1CAA.0020.0002] # CHAM DIGIT SEVEN +ABF7 ; [.1CAA.0020.0002] # MEETEI MAYEK DIGIT SEVEN +1010D ; [.1CAA.0020.0002] # AEGEAN NUMBER SEVEN +102E7 ; [.1CAA.0020.0002] # COPTIC EPACT DIGIT SEVEN +104A7 ; [.1CAA.0020.0002] # OSMANYA DIGIT SEVEN +109C6 ; [.1CAA.0020.0002] # MEROITIC CURSIVE NUMBER SEVEN +10E66 ; [.1CAA.0020.0002] # RUMI DIGIT SEVEN +11058 ; [.1CAA.0020.0002] # BRAHMI NUMBER SEVEN +1106D ; [.1CAA.0020.0002] # BRAHMI DIGIT SEVEN +110F7 ; [.1CAA.0020.0002] # SORA SOMPENG DIGIT SEVEN +1113D ; [.1CAA.0020.0002] # CHAKMA DIGIT SEVEN +111D7 ; [.1CAA.0020.0002] # SHARADA DIGIT SEVEN +111E7 ; [.1CAA.0020.0002] # SINHALA ARCHAIC DIGIT SEVEN +112F7 ; [.1CAA.0020.0002] # KHUDAWADI DIGIT SEVEN +11457 ; [.1CAA.0020.0002] # NEWA DIGIT SEVEN +114D7 ; [.1CAA.0020.0002] # TIRHUTA DIGIT SEVEN +11657 ; [.1CAA.0020.0002] # MODI DIGIT SEVEN +116C7 ; [.1CAA.0020.0002] # TAKRI DIGIT SEVEN +11737 ; [.1CAA.0020.0002] # AHOM DIGIT SEVEN +118E7 ; [.1CAA.0020.0002] # WARANG CITI DIGIT SEVEN +11C57 ; [.1CAA.0020.0002] # BHAIKSUKI DIGIT SEVEN +11C60 ; [.1CAA.0020.0002] # BHAIKSUKI NUMBER SEVEN +11D57 ; [.1CAA.0020.0002] # MASARAM GONDI DIGIT SEVEN +12405 ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN ASH +1240C ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN DISH +12412 ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U +1241B ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN GESH2 +12429 ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN SHAR2 +12441 ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3 +12442 ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A +12443 ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B +1246C ; [.1CAA.0020.0002] # CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM +16A67 ; [.1CAA.0020.0002] # MRO DIGIT SEVEN +16B57 ; [.1CAA.0020.0002] # PAHAWH HMONG DIGIT SEVEN +1D366 ; [.1CAA.0020.0002] # COUNTING ROD UNIT DIGIT SEVEN +1E8CD ; [.1CAA.0020.0002] # MENDE KIKAKUI DIGIT SEVEN +1E957 ; [.1CAA.0020.0002] # ADLAM DIGIT SEVEN +FF17 ; [.1CAA.0020.0003] # FULLWIDTH DIGIT SEVEN +0F30 ; [.1CAA.0020.0004] # TIBETAN DIGIT HALF SEVEN +247A ; [*0318.0020.0004][.1CAA.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT SEVEN +248E ; [.1CAA.0020.0004][*0278.0020.0004] # DIGIT SEVEN FULL STOP +1F108 ; [.1CAA.0020.0004][*0222.0020.0004] # DIGIT SEVEN COMMA +1D7D5 ; [.1CAA.0020.0005] # MATHEMATICAL BOLD DIGIT SEVEN +1D7DF ; [.1CAA.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E9 ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7F3 ; [.1CAA.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7FD ; [.1CAA.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SEVEN +2466 ; [.1CAA.0020.0006] # CIRCLED DIGIT SEVEN +24FB ; [.1CAA.0020.0006] # DOUBLE CIRCLED DIGIT SEVEN +277C ; [.1CAA.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +2786 ; [.1CAA.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +2790 ; [.1CAA.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +2077 ; [.1CAA.0020.0014] # SUPERSCRIPT SEVEN +2087 ; [.1CAA.0020.0015] # SUBSCRIPT SEVEN +324E ; [.1CAA.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER SEVENTY ON BLACK SQUARE +1F1A1 ; [.1CAA.0020.001C][*0278.0020.001C][.1CA4.0020.001C] # SQUARED SEVEN POINT ONE +215E ; [.1CAA.0020.001E][*063C.0020.001E][.1CAB.0020.001E] # VULGAR FRACTION SEVEN EIGHTHS +33E6 ; [.1CAA.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +32C6 ; [.1CAA.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +335F ; [.1CAA.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +0038 ; [.1CAB.0020.0002] # DIGIT EIGHT +0668 ; [.1CAB.0020.0002] # ARABIC-INDIC DIGIT EIGHT +06F8 ; [.1CAB.0020.0002] # EXTENDED ARABIC-INDIC DIGIT EIGHT +07C8 ; [.1CAB.0020.0002] # NKO DIGIT EIGHT +096E ; [.1CAB.0020.0002] # DEVANAGARI DIGIT EIGHT +09EE ; [.1CAB.0020.0002] # BENGALI DIGIT EIGHT +0A6E ; [.1CAB.0020.0002] # GURMUKHI DIGIT EIGHT +0AEE ; [.1CAB.0020.0002] # GUJARATI DIGIT EIGHT +0B6E ; [.1CAB.0020.0002] # ORIYA DIGIT EIGHT +0BEE ; [.1CAB.0020.0002] # TAMIL DIGIT EIGHT +0C6E ; [.1CAB.0020.0002] # TELUGU DIGIT EIGHT +0CEE ; [.1CAB.0020.0002] # KANNADA DIGIT EIGHT +0D6E ; [.1CAB.0020.0002] # MALAYALAM DIGIT EIGHT +0DEE ; [.1CAB.0020.0002] # SINHALA LITH DIGIT EIGHT +0E58 ; [.1CAB.0020.0002] # THAI DIGIT EIGHT +0ED8 ; [.1CAB.0020.0002] # LAO DIGIT EIGHT +0F28 ; [.1CAB.0020.0002] # TIBETAN DIGIT EIGHT +1048 ; [.1CAB.0020.0002] # MYANMAR DIGIT EIGHT +1098 ; [.1CAB.0020.0002] # MYANMAR SHAN DIGIT EIGHT +1370 ; [.1CAB.0020.0002] # ETHIOPIC DIGIT EIGHT +17E8 ; [.1CAB.0020.0002] # KHMER DIGIT EIGHT +17F8 ; [.1CAB.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BEI +1818 ; [.1CAB.0020.0002] # MONGOLIAN DIGIT EIGHT +194E ; [.1CAB.0020.0002] # LIMBU DIGIT EIGHT +19D8 ; [.1CAB.0020.0002] # NEW TAI LUE DIGIT EIGHT +1A88 ; [.1CAB.0020.0002] # TAI THAM HORA DIGIT EIGHT +1A98 ; [.1CAB.0020.0002] # TAI THAM THAM DIGIT EIGHT +1B58 ; [.1CAB.0020.0002] # BALINESE DIGIT EIGHT +1BB8 ; [.1CAB.0020.0002] # SUNDANESE DIGIT EIGHT +1C48 ; [.1CAB.0020.0002] # LEPCHA DIGIT EIGHT +1C58 ; [.1CAB.0020.0002] # OL CHIKI DIGIT EIGHT +3028 ; [.1CAB.0020.0002] # HANGZHOU NUMERAL EIGHT +A628 ; [.1CAB.0020.0002] # VAI DIGIT EIGHT +A8D8 ; [.1CAB.0020.0002] # SAURASHTRA DIGIT EIGHT +A908 ; [.1CAB.0020.0002] # KAYAH LI DIGIT EIGHT +A9D8 ; [.1CAB.0020.0002] # JAVANESE DIGIT EIGHT +A9F8 ; [.1CAB.0020.0002] # MYANMAR TAI LAING DIGIT EIGHT +AA58 ; [.1CAB.0020.0002] # CHAM DIGIT EIGHT +ABF8 ; [.1CAB.0020.0002] # MEETEI MAYEK DIGIT EIGHT +1010E ; [.1CAB.0020.0002] # AEGEAN NUMBER EIGHT +102E8 ; [.1CAB.0020.0002] # COPTIC EPACT DIGIT EIGHT +104A8 ; [.1CAB.0020.0002] # OSMANYA DIGIT EIGHT +109C7 ; [.1CAB.0020.0002] # MEROITIC CURSIVE NUMBER EIGHT +10E67 ; [.1CAB.0020.0002] # RUMI DIGIT EIGHT +11059 ; [.1CAB.0020.0002] # BRAHMI NUMBER EIGHT +1106E ; [.1CAB.0020.0002] # BRAHMI DIGIT EIGHT +110F8 ; [.1CAB.0020.0002] # SORA SOMPENG DIGIT EIGHT +1113E ; [.1CAB.0020.0002] # CHAKMA DIGIT EIGHT +111D8 ; [.1CAB.0020.0002] # SHARADA DIGIT EIGHT +111E8 ; [.1CAB.0020.0002] # SINHALA ARCHAIC DIGIT EIGHT +112F8 ; [.1CAB.0020.0002] # KHUDAWADI DIGIT EIGHT +11458 ; [.1CAB.0020.0002] # NEWA DIGIT EIGHT +114D8 ; [.1CAB.0020.0002] # TIRHUTA DIGIT EIGHT +11658 ; [.1CAB.0020.0002] # MODI DIGIT EIGHT +116C8 ; [.1CAB.0020.0002] # TAKRI DIGIT EIGHT +11738 ; [.1CAB.0020.0002] # AHOM DIGIT EIGHT +118E8 ; [.1CAB.0020.0002] # WARANG CITI DIGIT EIGHT +11C58 ; [.1CAB.0020.0002] # BHAIKSUKI DIGIT EIGHT +11C61 ; [.1CAB.0020.0002] # BHAIKSUKI NUMBER EIGHT +11D58 ; [.1CAB.0020.0002] # MASARAM GONDI DIGIT EIGHT +12406 ; [.1CAB.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT ASH +1240D ; [.1CAB.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT DISH +12413 ; [.1CAB.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U +1241C ; [.1CAB.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT GESH2 +1242A ; [.1CAB.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT SHAR2 +12444 ; [.1CAB.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU +12445 ; [.1CAB.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3 +1246D ; [.1CAB.0020.0002] # CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM +16A68 ; [.1CAB.0020.0002] # MRO DIGIT EIGHT +16B58 ; [.1CAB.0020.0002] # PAHAWH HMONG DIGIT EIGHT +1D367 ; [.1CAB.0020.0002] # COUNTING ROD UNIT DIGIT EIGHT +1E8CE ; [.1CAB.0020.0002] # MENDE KIKAKUI DIGIT EIGHT +1E958 ; [.1CAB.0020.0002] # ADLAM DIGIT EIGHT +FF18 ; [.1CAB.0020.0003] # FULLWIDTH DIGIT EIGHT +0F31 ; [.1CAB.0020.0004] # TIBETAN DIGIT HALF EIGHT +247B ; [*0318.0020.0004][.1CAB.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT EIGHT +248F ; [.1CAB.0020.0004][*0278.0020.0004] # DIGIT EIGHT FULL STOP +1F109 ; [.1CAB.0020.0004][*0222.0020.0004] # DIGIT EIGHT COMMA +1D7D6 ; [.1CAB.0020.0005] # MATHEMATICAL BOLD DIGIT EIGHT +1D7E0 ; [.1CAB.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7EA ; [.1CAB.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7F4 ; [.1CAB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7FE ; [.1CAB.0020.0005] # MATHEMATICAL MONOSPACE DIGIT EIGHT +2467 ; [.1CAB.0020.0006] # CIRCLED DIGIT EIGHT +24FC ; [.1CAB.0020.0006] # DOUBLE CIRCLED DIGIT EIGHT +277D ; [.1CAB.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +2787 ; [.1CAB.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +2791 ; [.1CAB.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +2078 ; [.1CAB.0020.0014] # SUPERSCRIPT EIGHT +2088 ; [.1CAB.0020.0015] # SUBSCRIPT EIGHT +324F ; [.1CAB.0020.0006][.1CA3.0020.0006] # CIRCLED NUMBER EIGHTY ON BLACK SQUARE +1F19F ; [.1CAB.0020.001C][.1DCB.0020.001D] # SQUARED EIGHT K +33E7 ; [.1CAB.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +32C7 ; [.1CAB.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +3360 ; [.1CAB.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +0039 ; [.1CAC.0020.0002] # DIGIT NINE +0669 ; [.1CAC.0020.0002] # ARABIC-INDIC DIGIT NINE +06F9 ; [.1CAC.0020.0002] # EXTENDED ARABIC-INDIC DIGIT NINE +07C9 ; [.1CAC.0020.0002] # NKO DIGIT NINE +096F ; [.1CAC.0020.0002] # DEVANAGARI DIGIT NINE +09EF ; [.1CAC.0020.0002] # BENGALI DIGIT NINE +0A6F ; [.1CAC.0020.0002] # GURMUKHI DIGIT NINE +0AEF ; [.1CAC.0020.0002] # GUJARATI DIGIT NINE +0B6F ; [.1CAC.0020.0002] # ORIYA DIGIT NINE +0BEF ; [.1CAC.0020.0002] # TAMIL DIGIT NINE +0C6F ; [.1CAC.0020.0002] # TELUGU DIGIT NINE +0CEF ; [.1CAC.0020.0002] # KANNADA DIGIT NINE +0D6F ; [.1CAC.0020.0002] # MALAYALAM DIGIT NINE +0DEF ; [.1CAC.0020.0002] # SINHALA LITH DIGIT NINE +0E59 ; [.1CAC.0020.0002] # THAI DIGIT NINE +0ED9 ; [.1CAC.0020.0002] # LAO DIGIT NINE +0F29 ; [.1CAC.0020.0002] # TIBETAN DIGIT NINE +1049 ; [.1CAC.0020.0002] # MYANMAR DIGIT NINE +1099 ; [.1CAC.0020.0002] # MYANMAR SHAN DIGIT NINE +1371 ; [.1CAC.0020.0002] # ETHIOPIC DIGIT NINE +17E9 ; [.1CAC.0020.0002] # KHMER DIGIT NINE +17F9 ; [.1CAC.0020.0002] # KHMER SYMBOL LEK ATTAK PRAM-BUON +1819 ; [.1CAC.0020.0002] # MONGOLIAN DIGIT NINE +194F ; [.1CAC.0020.0002] # LIMBU DIGIT NINE +19D9 ; [.1CAC.0020.0002] # NEW TAI LUE DIGIT NINE +1A89 ; [.1CAC.0020.0002] # TAI THAM HORA DIGIT NINE +1A99 ; [.1CAC.0020.0002] # TAI THAM THAM DIGIT NINE +1B59 ; [.1CAC.0020.0002] # BALINESE DIGIT NINE +1BB9 ; [.1CAC.0020.0002] # SUNDANESE DIGIT NINE +1C49 ; [.1CAC.0020.0002] # LEPCHA DIGIT NINE +1C59 ; [.1CAC.0020.0002] # OL CHIKI DIGIT NINE +3029 ; [.1CAC.0020.0002] # HANGZHOU NUMERAL NINE +A629 ; [.1CAC.0020.0002] # VAI DIGIT NINE +A8D9 ; [.1CAC.0020.0002] # SAURASHTRA DIGIT NINE +A909 ; [.1CAC.0020.0002] # KAYAH LI DIGIT NINE +A9D9 ; [.1CAC.0020.0002] # JAVANESE DIGIT NINE +A9F9 ; [.1CAC.0020.0002] # MYANMAR TAI LAING DIGIT NINE +AA59 ; [.1CAC.0020.0002] # CHAM DIGIT NINE +ABF9 ; [.1CAC.0020.0002] # MEETEI MAYEK DIGIT NINE +1010F ; [.1CAC.0020.0002] # AEGEAN NUMBER NINE +102E9 ; [.1CAC.0020.0002] # COPTIC EPACT DIGIT NINE +104A9 ; [.1CAC.0020.0002] # OSMANYA DIGIT NINE +109C8 ; [.1CAC.0020.0002] # MEROITIC CURSIVE NUMBER NINE +10E68 ; [.1CAC.0020.0002] # RUMI DIGIT NINE +1105A ; [.1CAC.0020.0002] # BRAHMI NUMBER NINE +1106F ; [.1CAC.0020.0002] # BRAHMI DIGIT NINE +110F9 ; [.1CAC.0020.0002] # SORA SOMPENG DIGIT NINE +1113F ; [.1CAC.0020.0002] # CHAKMA DIGIT NINE +111D9 ; [.1CAC.0020.0002] # SHARADA DIGIT NINE +111E9 ; [.1CAC.0020.0002] # SINHALA ARCHAIC DIGIT NINE +112F9 ; [.1CAC.0020.0002] # KHUDAWADI DIGIT NINE +11459 ; [.1CAC.0020.0002] # NEWA DIGIT NINE +114D9 ; [.1CAC.0020.0002] # TIRHUTA DIGIT NINE +11659 ; [.1CAC.0020.0002] # MODI DIGIT NINE +116C9 ; [.1CAC.0020.0002] # TAKRI DIGIT NINE +11739 ; [.1CAC.0020.0002] # AHOM DIGIT NINE +118E9 ; [.1CAC.0020.0002] # WARANG CITI DIGIT NINE +11C59 ; [.1CAC.0020.0002] # BHAIKSUKI DIGIT NINE +11C62 ; [.1CAC.0020.0002] # BHAIKSUKI NUMBER NINE +11D59 ; [.1CAC.0020.0002] # MASARAM GONDI DIGIT NINE +12407 ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE ASH +1240E ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE DISH +12414 ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U +1241D ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE GESH2 +1242B ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE SHAR2 +12446 ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU +12447 ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3 +12448 ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4 +12449 ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A +1246E ; [.1CAC.0020.0002] # CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +16A69 ; [.1CAC.0020.0002] # MRO DIGIT NINE +16B59 ; [.1CAC.0020.0002] # PAHAWH HMONG DIGIT NINE +1D368 ; [.1CAC.0020.0002] # COUNTING ROD UNIT DIGIT NINE +1E8CF ; [.1CAC.0020.0002] # MENDE KIKAKUI DIGIT NINE +1E959 ; [.1CAC.0020.0002] # ADLAM DIGIT NINE +FF19 ; [.1CAC.0020.0003] # FULLWIDTH DIGIT NINE +0F32 ; [.1CAC.0020.0004] # TIBETAN DIGIT HALF NINE +247C ; [*0318.0020.0004][.1CAC.0020.0004][*0319.0020.0004] # PARENTHESIZED DIGIT NINE +2490 ; [.1CAC.0020.0004][*0278.0020.0004] # DIGIT NINE FULL STOP +1F10A ; [.1CAC.0020.0004][*0222.0020.0004] # DIGIT NINE COMMA +1D7D7 ; [.1CAC.0020.0005] # MATHEMATICAL BOLD DIGIT NINE +1D7E1 ; [.1CAC.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7EB ; [.1CAC.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT NINE +1D7F5 ; [.1CAC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7FF ; [.1CAC.0020.0005] # MATHEMATICAL MONOSPACE DIGIT NINE +2468 ; [.1CAC.0020.0006] # CIRCLED DIGIT NINE +24FD ; [.1CAC.0020.0006] # DOUBLE CIRCLED DIGIT NINE +277E ; [.1CAC.0020.0006] # DINGBAT NEGATIVE CIRCLED DIGIT NINE +2788 ; [.1CAC.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT NINE +2792 ; [.1CAC.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +2079 ; [.1CAC.0020.0014] # SUPERSCRIPT NINE +2089 ; [.1CAC.0020.0015] # SUBSCRIPT NINE +33E8 ; [.1CAC.0020.0004][.FB40.0020.0004][.E5E5.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +32C8 ; [.1CAC.0020.0004][.FB40.0020.0004][.E708.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +3361 ; [.1CAC.0020.0004][.FB40.0020.0004][.F0B9.0000.0000] # IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +0061 ; [.1CAD.0020.0002] # LATIN SMALL LETTER A +FF41 ; [.1CAD.0020.0003] # FULLWIDTH LATIN SMALL LETTER A +0363 ; [.1CAD.0020.0004] # COMBINING LATIN SMALL LETTER A +249C ; [*0318.0020.0004][.1CAD.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER A +1D41A ; [.1CAD.0020.0005] # MATHEMATICAL BOLD SMALL A +1D44E ; [.1CAD.0020.0005] # MATHEMATICAL ITALIC SMALL A +1D482 ; [.1CAD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL A +1D4B6 ; [.1CAD.0020.0005] # MATHEMATICAL SCRIPT SMALL A +1D4EA ; [.1CAD.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL A +1D51E ; [.1CAD.0020.0005] # MATHEMATICAL FRAKTUR SMALL A +1D552 ; [.1CAD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL A +1D586 ; [.1CAD.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL A +1D5BA ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF SMALL A +1D5EE ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL A +1D622 ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D656 ; [.1CAD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D68A ; [.1CAD.0020.0005] # MATHEMATICAL MONOSPACE SMALL A +24D0 ; [.1CAD.0020.0006] # CIRCLED LATIN SMALL LETTER A +0041 ; [.1CAD.0020.0008] # LATIN CAPITAL LETTER A +FF21 ; [.1CAD.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER A +1F110 ; [*0318.0020.0004][.1CAD.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER A +1D400 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD CAPITAL A +1D434 ; [.1CAD.0020.000B] # MATHEMATICAL ITALIC CAPITAL A +1D468 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL A +1D49C ; [.1CAD.0020.000B] # MATHEMATICAL SCRIPT CAPITAL A +1D4D0 ; [.1CAD.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL A +1D504 ; [.1CAD.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL A +1D538 ; [.1CAD.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D56C ; [.1CAD.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D5A0 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL A +1D5D4 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D608 ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D63C ; [.1CAD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D670 ; [.1CAD.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL A +24B6 ; [.1CAD.0020.000C] # CIRCLED LATIN CAPITAL LETTER A +1F150 ; [.1CAD.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER A +00AA ; [.1CAD.0020.0014] # FEMININE ORDINAL INDICATOR +1D43 ; [.1CAD.0020.0014] # MODIFIER LETTER SMALL A +2090 ; [.1CAD.0020.0015] # LATIN SUBSCRIPT SMALL LETTER A +1D2C ; [.1CAD.0020.001D] # MODIFIER LETTER CAPITAL A +1F130 ; [.1CAD.0020.001D] # SQUARED LATIN CAPITAL LETTER A +1F170 ; [.1CAD.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER A +00E1 ; [.1CAD.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH ACUTE +00C1 ; [.1CAD.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH ACUTE +00E0 ; [.1CAD.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH GRAVE +00C0 ; [.1CAD.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH GRAVE +0103 ; [.1CAD.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE +0102 ; [.1CAD.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE +1EAF ; [.1CAD.0020.0002][.0000.0026.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EAE ; [.1CAD.0020.0008][.0000.0026.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB1 ; [.1CAD.0020.0002][.0000.0026.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB0 ; [.1CAD.0020.0008][.0000.0026.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB5 ; [.1CAD.0020.0002][.0000.0026.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB4 ; [.1CAD.0020.0008][.0000.0026.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB3 ; [.1CAD.0020.0002][.0000.0026.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB2 ; [.1CAD.0020.0008][.0000.0026.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +00E2 ; [.1CAD.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX +00C2 ; [.1CAD.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +1EA5 ; [.1CAD.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA4 ; [.1CAD.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA7 ; [.1CAD.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA6 ; [.1CAD.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EAB ; [.1CAD.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAA ; [.1CAD.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EA9 ; [.1CAD.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA8 ; [.1CAD.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +01CE ; [.1CAD.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER A WITH CARON +01CD ; [.1CAD.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER A WITH CARON +00E5 ; [.1CAD.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER A WITH RING ABOVE +00C5 ; [.1CAD.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE +212B ; [.1CAD.0020.0008][.0000.0029.0002] # ANGSTROM SIGN +01FB ; [.1CAD.0020.0002][.0000.0029.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FA ; [.1CAD.0020.0008][.0000.0029.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +00E4 ; [.1CAD.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER A WITH DIAERESIS +1DF2 ; [.1CAD.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER A WITH DIAERESIS +A79B ; [.1CAD.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK AE +00C4 ; [.1CAD.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS +A79A ; [.1CAD.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK AE +01DF ; [.1CAD.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01DE ; [.1CAD.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +00E3 ; [.1CAD.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH TILDE +00C3 ; [.1CAD.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH TILDE +0227 ; [.1CAD.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER A WITH DOT ABOVE +0226 ; [.1CAD.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE +01E1 ; [.1CAD.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E0 ; [.1CAD.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +0105 ; [.1CAD.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER A WITH OGONEK +0104 ; [.1CAD.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER A WITH OGONEK +0101 ; [.1CAD.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH MACRON +0100 ; [.1CAD.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH MACRON +1EA3 ; [.1CAD.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH HOOK ABOVE +1EA2 ; [.1CAD.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH HOOK ABOVE +0201 ; [.1CAD.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER A WITH DOUBLE GRAVE +0200 ; [.1CAD.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0203 ; [.1CAD.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER A WITH INVERTED BREVE +0202 ; [.1CAD.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER A WITH INVERTED BREVE +1EA1 ; [.1CAD.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER A WITH DOT BELOW +1EA0 ; [.1CAD.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER A WITH DOT BELOW +1EB7 ; [.1CAD.0020.0002][.0000.0042.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB6 ; [.1CAD.0020.0008][.0000.0042.0002][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EAD ; [.1CAD.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAC ; [.1CAD.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1E01 ; [.1CAD.0020.0002][.0000.0044.0002] # LATIN SMALL LETTER A WITH RING BELOW +1E00 ; [.1CAD.0020.0008][.0000.0044.0002] # LATIN CAPITAL LETTER A WITH RING BELOW +1DD3 ; [.1CAD.0020.0004][.0000.0111.0004] # COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE +A733 ; [.1CAD.0020.0004][.1CAD.0020.0004] # LATIN SMALL LETTER AA +A732 ; [.1CAD.0020.000A][.1CAD.0020.000A] # LATIN CAPITAL LETTER AA +1F18E ; [.1CAD.0020.001D][.1CC6.0020.001D] # NEGATIVE SQUARED AB +2100 ; [.1CAD.0020.0004][*0395.0020.0004][.1CE0.0020.0004] # ACCOUNT OF +00E6 ; [.1CAD.0020.0004][.0000.0111.0004][.1D10.0020.0004] # LATIN SMALL LETTER AE +1DD4 ; [.1CAD.0020.0004][.0000.0111.0004][.1D10.0020.0004] # COMBINING LATIN SMALL LETTER AE +00C6 ; [.1CAD.0020.000A][.0000.0111.0004][.1D10.0020.000A] # LATIN CAPITAL LETTER AE +1D2D ; [.1CAD.0020.0014][.0000.0111.0014][.1D10.0020.0014] # MODIFIER LETTER CAPITAL AE +01FD ; [.1CAD.0020.0004][.0000.0111.0004][.1D10.0020.0004][.0000.0024.0002] # LATIN SMALL LETTER AE WITH ACUTE +01FC ; [.1CAD.0020.000A][.0000.0111.0004][.1D10.0020.000A][.0000.0024.0002] # LATIN CAPITAL LETTER AE WITH ACUTE +01E3 ; [.1CAD.0020.0004][.0000.0111.0004][.1D10.0020.0004][.0000.0032.0002] # LATIN SMALL LETTER AE WITH MACRON +01E2 ; [.1CAD.0020.000A][.0000.0111.0004][.1D10.0020.000A][.0000.0032.0002] # LATIN CAPITAL LETTER AE WITH MACRON +33C2 ; [.1CAD.0020.001C][*0278.0020.001C][.1E10.0020.001C][*0278.0020.001C] # SQUARE AM +33DF ; [.1CAD.0020.001D][*063B.0020.001C][.1E10.0020.001C] # SQUARE A OVER M +1DD5 ; [.1CAD.0020.0004][.1E43.0020.0004] # COMBINING LATIN SMALL LETTER AO +A735 ; [.1CAD.0020.0004][.1E43.0020.0004] # LATIN SMALL LETTER AO +A734 ; [.1CAD.0020.000A][.1E43.0020.000A] # LATIN CAPITAL LETTER AO +2101 ; [.1CAD.0020.0004][*0395.0020.0004][.1ED7.0020.0004] # ADDRESSED TO THE SUBJECT +214D ; [.1CAD.0020.000A][*0395.0020.0004][.1ED7.0020.000A] # AKTIESELSKAB +A737 ; [.1CAD.0020.0004][.1F1B.0020.0004] # LATIN SMALL LETTER AU +A736 ; [.1CAD.0020.000A][.1F1B.0020.000A] # LATIN CAPITAL LETTER AU +3373 ; [.1CAD.0020.001D][.1F1B.0020.001D] # SQUARE AU +1DD6 ; [.1CAD.0020.0004][.1F49.0020.0004] # COMBINING LATIN SMALL LETTER AV +A739 ; [.1CAD.0020.0004][.1F49.0020.0004] # LATIN SMALL LETTER AV +A738 ; [.1CAD.0020.000A][.1F49.0020.000A] # LATIN CAPITAL LETTER AV +A73B ; [.1CAD.0020.0004][.0000.0111.0004][.1F49.0020.0004] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR +A73A ; [.1CAD.0020.000A][.0000.0111.0004][.1F49.0020.000A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73D ; [.1CAD.0020.0004][.1F71.0020.0004] # LATIN SMALL LETTER AY +A73C ; [.1CAD.0020.000A][.1F71.0020.000A] # LATIN CAPITAL LETTER AY +1E9A ; [.1CAD.0020.0004][.1FE6.0020.0004] # LATIN SMALL LETTER A WITH RIGHT HALF RING +1D00 ; [.1CB1.0020.0002] # LATIN LETTER SMALL CAPITAL A +2C65 ; [.1CB2.0020.0002] # LATIN SMALL LETTER A WITH STROKE +023A ; [.1CB2.0020.0008] # LATIN CAPITAL LETTER A WITH STROKE +1D8F ; [.1CB3.0020.0002] # LATIN SMALL LETTER A WITH RETROFLEX HOOK +1D01 ; [.1CB4.0020.0002] # LATIN LETTER SMALL CAPITAL AE +1D02 ; [.1CB5.0020.0002] # LATIN SMALL LETTER TURNED AE +1D46 ; [.1CB5.0020.0014] # MODIFIER LETTER SMALL TURNED AE +AB31 ; [.1CB6.0020.0002] # LATIN SMALL LETTER A REVERSED-SCHWA +0250 ; [.1CB7.0020.0002] # LATIN SMALL LETTER TURNED A +2C6F ; [.1CB7.0020.0008] # LATIN CAPITAL LETTER TURNED A +1D44 ; [.1CB7.0020.0014] # MODIFIER LETTER SMALL TURNED A +0251 ; [.1CBB.0020.0002] # LATIN SMALL LETTER ALPHA +1DE7 ; [.1CBB.0020.0004] # COMBINING LATIN SMALL LETTER ALPHA +2C6D ; [.1CBB.0020.0008] # LATIN CAPITAL LETTER ALPHA +1D45 ; [.1CBB.0020.0014] # MODIFIER LETTER SMALL ALPHA +AB30 ; [.1CBF.0020.0002] # LATIN SMALL LETTER BARRED ALPHA +1D90 ; [.1CC0.0020.0002] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK +0252 ; [.1CC1.0020.0002] # LATIN SMALL LETTER TURNED ALPHA +2C70 ; [.1CC1.0020.0008] # LATIN CAPITAL LETTER TURNED ALPHA +1D9B ; [.1CC1.0020.0014] # MODIFIER LETTER SMALL TURNED ALPHA +AB64 ; [.1CC5.0020.0002] # LATIN SMALL LETTER INVERTED ALPHA +0062 ; [.1CC6.0020.0002] # LATIN SMALL LETTER B +FF42 ; [.1CC6.0020.0003] # FULLWIDTH LATIN SMALL LETTER B +1DE8 ; [.1CC6.0020.0004] # COMBINING LATIN SMALL LETTER B +249D ; [*0318.0020.0004][.1CC6.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER B +1D41B ; [.1CC6.0020.0005] # MATHEMATICAL BOLD SMALL B +1D44F ; [.1CC6.0020.0005] # MATHEMATICAL ITALIC SMALL B +1D483 ; [.1CC6.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL B +1D4B7 ; [.1CC6.0020.0005] # MATHEMATICAL SCRIPT SMALL B +1D4EB ; [.1CC6.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL B +1D51F ; [.1CC6.0020.0005] # MATHEMATICAL FRAKTUR SMALL B +1D553 ; [.1CC6.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL B +1D587 ; [.1CC6.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL B +1D5BB ; [.1CC6.0020.0005] # MATHEMATICAL SANS-SERIF SMALL B +1D5EF ; [.1CC6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL B +1D623 ; [.1CC6.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D657 ; [.1CC6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D68B ; [.1CC6.0020.0005] # MATHEMATICAL MONOSPACE SMALL B +24D1 ; [.1CC6.0020.0006] # CIRCLED LATIN SMALL LETTER B +0042 ; [.1CC6.0020.0008] # LATIN CAPITAL LETTER B +FF22 ; [.1CC6.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER B +1F111 ; [*0318.0020.0004][.1CC6.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER B +212C ; [.1CC6.0020.000B] # SCRIPT CAPITAL B +1D401 ; [.1CC6.0020.000B] # MATHEMATICAL BOLD CAPITAL B +1D435 ; [.1CC6.0020.000B] # MATHEMATICAL ITALIC CAPITAL B +1D469 ; [.1CC6.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL B +1D4D1 ; [.1CC6.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL B +1D505 ; [.1CC6.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL B +1D539 ; [.1CC6.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D56D ; [.1CC6.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D5A1 ; [.1CC6.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL B +1D5D5 ; [.1CC6.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D609 ; [.1CC6.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D63D ; [.1CC6.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D671 ; [.1CC6.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL B +24B7 ; [.1CC6.0020.000C] # CIRCLED LATIN CAPITAL LETTER B +1F151 ; [.1CC6.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER B +1D47 ; [.1CC6.0020.0014] # MODIFIER LETTER SMALL B +1D2E ; [.1CC6.0020.001D] # MODIFIER LETTER CAPITAL B +1F131 ; [.1CC6.0020.001D] # SQUARED LATIN CAPITAL LETTER B +1F171 ; [.1CC6.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER B +1E03 ; [.1CC6.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER B WITH DOT ABOVE +1E02 ; [.1CC6.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E05 ; [.1CC6.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER B WITH DOT BELOW +1E04 ; [.1CC6.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER B WITH DOT BELOW +1E07 ; [.1CC6.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER B WITH LINE BELOW +1E06 ; [.1CC6.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER B WITH LINE BELOW +3374 ; [.1CC6.0020.001C][.1CAD.0020.001C][.1E99.0020.001C] # SQUARE BAR +33C3 ; [.1CC6.0020.001D][.1E87.0020.001C] # SQUARE BQ +0299 ; [.1CCA.0020.0002] # LATIN LETTER SMALL CAPITAL B +0180 ; [.1CCE.0020.0002] # LATIN SMALL LETTER B WITH STROKE +0243 ; [.1CCE.0020.0008] # LATIN CAPITAL LETTER B WITH STROKE +1D2F ; [.1CD2.0020.0002] # MODIFIER LETTER CAPITAL BARRED B +1D03 ; [.1CD3.0020.0002] # LATIN LETTER SMALL CAPITAL BARRED B +1D6C ; [.1CD4.0020.0002] # LATIN SMALL LETTER B WITH MIDDLE TILDE +A797 ; [.1CD5.0020.0002] # LATIN SMALL LETTER B WITH FLOURISH +A796 ; [.1CD5.0020.0008] # LATIN CAPITAL LETTER B WITH FLOURISH +1D80 ; [.1CD6.0020.0002] # LATIN SMALL LETTER B WITH PALATAL HOOK +0253 ; [.1CD7.0020.0002] # LATIN SMALL LETTER B WITH HOOK +0181 ; [.1CD7.0020.0008] # LATIN CAPITAL LETTER B WITH HOOK +0183 ; [.1CDB.0020.0002] # LATIN SMALL LETTER B WITH TOPBAR +0182 ; [.1CDB.0020.0008] # LATIN CAPITAL LETTER B WITH TOPBAR +A7B5 ; [.1CDF.0020.0002] # LATIN SMALL LETTER BETA +1DE9 ; [.1CDF.0020.0004] # COMBINING LATIN SMALL LETTER BETA +A7B4 ; [.1CDF.0020.0008] # LATIN CAPITAL LETTER BETA +0063 ; [.1CE0.0020.0002] # LATIN SMALL LETTER C +FF43 ; [.1CE0.0020.0003] # FULLWIDTH LATIN SMALL LETTER C +0368 ; [.1CE0.0020.0004] # COMBINING LATIN SMALL LETTER C +217D ; [.1CE0.0020.0004] # SMALL ROMAN NUMERAL ONE HUNDRED +249E ; [*0318.0020.0004][.1CE0.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER C +1D41C ; [.1CE0.0020.0005] # MATHEMATICAL BOLD SMALL C +1D450 ; [.1CE0.0020.0005] # MATHEMATICAL ITALIC SMALL C +1D484 ; [.1CE0.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL C +1D4B8 ; [.1CE0.0020.0005] # MATHEMATICAL SCRIPT SMALL C +1D4EC ; [.1CE0.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL C +1D520 ; [.1CE0.0020.0005] # MATHEMATICAL FRAKTUR SMALL C +1D554 ; [.1CE0.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL C +1D588 ; [.1CE0.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL C +1D5BC ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF SMALL C +1D5F0 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL C +1D624 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D658 ; [.1CE0.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D68C ; [.1CE0.0020.0005] # MATHEMATICAL MONOSPACE SMALL C +24D2 ; [.1CE0.0020.0006] # CIRCLED LATIN SMALL LETTER C +0043 ; [.1CE0.0020.0008] # LATIN CAPITAL LETTER C +FF23 ; [.1CE0.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER C +2103 ; [*050C.0020.0004][.1CE0.0020.000A] # DEGREE CELSIUS +216D ; [.1CE0.0020.000A] # ROMAN NUMERAL ONE HUNDRED +1F112 ; [*0318.0020.0004][.1CE0.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER C +2102 ; [.1CE0.0020.000B] # DOUBLE-STRUCK CAPITAL C +212D ; [.1CE0.0020.000B] # BLACK-LETTER CAPITAL C +1D402 ; [.1CE0.0020.000B] # MATHEMATICAL BOLD CAPITAL C +1D436 ; [.1CE0.0020.000B] # MATHEMATICAL ITALIC CAPITAL C +1D46A ; [.1CE0.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL C +1D49E ; [.1CE0.0020.000B] # MATHEMATICAL SCRIPT CAPITAL C +1D4D2 ; [.1CE0.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL C +1D56E ; [.1CE0.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D5A2 ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL C +1D5D6 ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D60A ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D63E ; [.1CE0.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D672 ; [.1CE0.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL C +24B8 ; [.1CE0.0020.000C] # CIRCLED LATIN CAPITAL LETTER C +1F12B ; [.1CE0.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER C +1F152 ; [.1CE0.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER C +1D9C ; [.1CE0.0020.0014] # MODIFIER LETTER SMALL C +1F132 ; [.1CE0.0020.001D] # SQUARED LATIN CAPITAL LETTER C +1F172 ; [.1CE0.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER C +0107 ; [.1CE0.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH ACUTE +0106 ; [.1CE0.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH ACUTE +0109 ; [.1CE0.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER C WITH CIRCUMFLEX +0108 ; [.1CE0.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010D ; [.1CE0.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER C WITH CARON +010C ; [.1CE0.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER C WITH CARON +010B ; [.1CE0.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER C WITH DOT ABOVE +010A ; [.1CE0.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER C WITH DOT ABOVE +00E7 ; [.1CE0.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER C WITH CEDILLA +1DD7 ; [.1CE0.0020.0004][.0000.0030.0004] # COMBINING LATIN SMALL LETTER C CEDILLA +00C7 ; [.1CE0.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER C WITH CEDILLA +1E09 ; [.1CE0.0020.0002][.0000.0030.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E08 ; [.1CE0.0020.0008][.0000.0030.0002][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +3388 ; [.1CE0.0020.001C][.1CAD.0020.001C][.1DDD.0020.001C] # SQUARE CAL +33C4 ; [.1CE0.0020.001C][.1CE0.0020.001C] # SQUARE CC +1F12D ; [.1CE0.0020.000C][.1CF5.0020.000C] # CIRCLED CD +33C5 ; [.1CE0.0020.001C][.1CF5.0020.001C] # SQUARE CD +33C6 ; [.1CE0.0020.001D][*063B.0020.001C][.1DCB.0020.001C][.1D5A.0020.001C] # SQUARE C OVER KG +1F191 ; [.1CE0.0020.001D][.1DDD.0020.001D] # SQUARED CL +339D ; [.1CE0.0020.001C][.1E10.0020.001C] # SQUARE CM +33A0 ; [.1CE0.0020.001C][.1E10.0020.001C][.1CA5.0020.001C] # SQUARE CM SQUARED +33A4 ; [.1CE0.0020.001C][.1E10.0020.001C][.1CA6.0020.001C] # SQUARE CM CUBED +2105 ; [.1CE0.0020.0004][*0395.0020.0004][.1E43.0020.0004] # CARE OF +33C7 ; [.1CE0.0020.001D][.1E43.0020.001C][*0278.0020.001C] # SQUARE CO +1F192 ; [.1CE0.0020.001D][.1E43.0020.001D][.1E43.0020.001D][.1DDD.0020.001D] # SQUARED COOL +2106 ; [.1CE0.0020.0004][*0395.0020.0004][.1F1B.0020.0004] # CADA UNA +1D04 ; [.1CE4.0020.0002] # LATIN LETTER SMALL CAPITAL C +023C ; [.1CE5.0020.0002] # LATIN SMALL LETTER C WITH STROKE +023B ; [.1CE5.0020.0008] # LATIN CAPITAL LETTER C WITH STROKE +A793 ; [.1CE9.0020.0002] # LATIN SMALL LETTER C WITH BAR +A792 ; [.1CE9.0020.0008] # LATIN CAPITAL LETTER C WITH BAR +A794 ; [.1CEA.0020.0002] # LATIN SMALL LETTER C WITH PALATAL HOOK +0188 ; [.1CEB.0020.0002] # LATIN SMALL LETTER C WITH HOOK +0187 ; [.1CEB.0020.0008] # LATIN CAPITAL LETTER C WITH HOOK +0255 ; [.1CEF.0020.0002] # LATIN SMALL LETTER C WITH CURL +1D9D ; [.1CEF.0020.0014] # MODIFIER LETTER SMALL C WITH CURL +2184 ; [.1CF3.0020.0002] # LATIN SMALL LETTER REVERSED C +2183 ; [.1CF3.0020.0008] # ROMAN NUMERAL REVERSED ONE HUNDRED +A73F ; [.1CF4.0020.0002] # LATIN SMALL LETTER REVERSED C WITH DOT +A73E ; [.1CF4.0020.0008] # LATIN CAPITAL LETTER REVERSED C WITH DOT +0064 ; [.1CF5.0020.0002] # LATIN SMALL LETTER D +FF44 ; [.1CF5.0020.0003] # FULLWIDTH LATIN SMALL LETTER D +0369 ; [.1CF5.0020.0004] # COMBINING LATIN SMALL LETTER D +217E ; [.1CF5.0020.0004] # SMALL ROMAN NUMERAL FIVE HUNDRED +249F ; [*0318.0020.0004][.1CF5.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER D +2146 ; [.1CF5.0020.0005] # DOUBLE-STRUCK ITALIC SMALL D +1D41D ; [.1CF5.0020.0005] # MATHEMATICAL BOLD SMALL D +1D451 ; [.1CF5.0020.0005] # MATHEMATICAL ITALIC SMALL D +1D485 ; [.1CF5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL D +1D4B9 ; [.1CF5.0020.0005] # MATHEMATICAL SCRIPT SMALL D +1D4ED ; [.1CF5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL D +1D521 ; [.1CF5.0020.0005] # MATHEMATICAL FRAKTUR SMALL D +1D555 ; [.1CF5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL D +1D589 ; [.1CF5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL D +1D5BD ; [.1CF5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL D +1D5F1 ; [.1CF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL D +1D625 ; [.1CF5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D659 ; [.1CF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D68D ; [.1CF5.0020.0005] # MATHEMATICAL MONOSPACE SMALL D +24D3 ; [.1CF5.0020.0006] # CIRCLED LATIN SMALL LETTER D +0044 ; [.1CF5.0020.0008] # LATIN CAPITAL LETTER D +FF24 ; [.1CF5.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER D +216E ; [.1CF5.0020.000A] # ROMAN NUMERAL FIVE HUNDRED +1F113 ; [*0318.0020.0004][.1CF5.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER D +2145 ; [.1CF5.0020.000B] # DOUBLE-STRUCK ITALIC CAPITAL D +1D403 ; [.1CF5.0020.000B] # MATHEMATICAL BOLD CAPITAL D +1D437 ; [.1CF5.0020.000B] # MATHEMATICAL ITALIC CAPITAL D +1D46B ; [.1CF5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL D +1D49F ; [.1CF5.0020.000B] # MATHEMATICAL SCRIPT CAPITAL D +1D4D3 ; [.1CF5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL D +1D507 ; [.1CF5.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL D +1D53B ; [.1CF5.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D56F ; [.1CF5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D5A3 ; [.1CF5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL D +1D5D7 ; [.1CF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D60B ; [.1CF5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D63F ; [.1CF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D673 ; [.1CF5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL D +24B9 ; [.1CF5.0020.000C] # CIRCLED LATIN CAPITAL LETTER D +1F153 ; [.1CF5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER D +1D48 ; [.1CF5.0020.0014] # MODIFIER LETTER SMALL D +1F1A5 ; [.1CF5.0020.001C] # SQUARED LATIN SMALL LETTER D +1D30 ; [.1CF5.0020.001D] # MODIFIER LETTER CAPITAL D +1F133 ; [.1CF5.0020.001D] # SQUARED LATIN CAPITAL LETTER D +1F173 ; [.1CF5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER D +010F ; [.1CF5.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER D WITH CARON +010E ; [.1CF5.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER D WITH CARON +1E0B ; [.1CF5.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER D WITH DOT ABOVE +1E0A ; [.1CF5.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E11 ; [.1CF5.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER D WITH CEDILLA +1E10 ; [.1CF5.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER D WITH CEDILLA +0111 ; [.1CF5.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER D WITH STROKE +0110 ; [.1CF5.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER D WITH STROKE +1E0D ; [.1CF5.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER D WITH DOT BELOW +1E0C ; [.1CF5.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER D WITH DOT BELOW +1E13 ; [.1CF5.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E12 ; [.1CF5.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E0F ; [.1CF5.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER D WITH LINE BELOW +1E0E ; [.1CF5.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER D WITH LINE BELOW +00F0 ; [.1CF5.0020.0004][.0000.0111.0004] # LATIN SMALL LETTER ETH +1DD9 ; [.1CF5.0020.0004][.0000.0111.0004] # COMBINING LATIN SMALL LETTER ETH +00D0 ; [.1CF5.0020.000A][.0000.0111.0004] # LATIN CAPITAL LETTER ETH +1D9E ; [.1CF5.0020.0014][.0000.0111.0014] # MODIFIER LETTER SMALL ETH +1DD8 ; [.1CF5.0020.0004][.0000.0112.0004] # COMBINING LATIN SMALL LETTER INSULAR D +A77A ; [.1CF5.0020.0004][.0000.0112.0004] # LATIN SMALL LETTER INSULAR D +A779 ; [.1CF5.0020.000A][.0000.0112.0004] # LATIN CAPITAL LETTER INSULAR D +3372 ; [.1CF5.0020.001C][.1CAD.0020.001C] # SQUARE DA +0238 ; [.1CF5.0020.0004][.1CC6.0020.0004] # LATIN SMALL LETTER DB DIGRAPH +33C8 ; [.1CF5.0020.001C][.1CC6.0020.001D] # SQUARE DB +1F190 ; [.1CF5.0020.001D][.1DB2.0020.001D] # SQUARE DJ +3397 ; [.1CF5.0020.001C][.1DDD.0020.001C] # SQUARE DL +3377 ; [.1CF5.0020.001C][.1E10.0020.001C] # SQUARE DM +3378 ; [.1CF5.0020.001C][.1E10.0020.001C][.1CA5.0020.001C] # SQUARE DM SQUARED +3379 ; [.1CF5.0020.001C][.1E10.0020.001C][.1CA6.0020.001C] # SQUARE DM CUBED +01F3 ; [.1CF5.0020.0004][.1F87.0020.0004] # LATIN SMALL LETTER DZ +02A3 ; [.1CF5.0020.0004][.1F87.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH +01F2 ; [.1CF5.0020.000A][.1F87.0020.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F1 ; [.1CF5.0020.000A][.1F87.0020.000A] # LATIN CAPITAL LETTER DZ +01C6 ; [.1CF5.0020.0004][.1F87.0020.0004][.0000.0028.0004] # LATIN SMALL LETTER DZ WITH CARON +01C5 ; [.1CF5.0020.000A][.1F87.0020.0004][.0000.0028.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C4 ; [.1CF5.0020.000A][.1F87.0020.000A][.0000.0028.0004] # LATIN CAPITAL LETTER DZ WITH CARON +02A5 ; [.1CF5.0020.0004][.1F9A.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL +02A4 ; [.1CF5.0020.0004][.1FA4.0020.0004] # LATIN SMALL LETTER DEZH DIGRAPH +1D05 ; [.1CF9.0020.0002] # LATIN LETTER SMALL CAPITAL D +1D06 ; [.1CFA.0020.0002] # LATIN LETTER SMALL CAPITAL ETH +1D6D ; [.1CFB.0020.0002] # LATIN SMALL LETTER D WITH MIDDLE TILDE +1D81 ; [.1CFC.0020.0002] # LATIN SMALL LETTER D WITH PALATAL HOOK +0256 ; [.1CFD.0020.0002] # LATIN SMALL LETTER D WITH TAIL +0189 ; [.1CFD.0020.0008] # LATIN CAPITAL LETTER AFRICAN D +0257 ; [.1D01.0020.0002] # LATIN SMALL LETTER D WITH HOOK +018A ; [.1D01.0020.0008] # LATIN CAPITAL LETTER D WITH HOOK +1D91 ; [.1D05.0020.0002] # LATIN SMALL LETTER D WITH HOOK AND TAIL +018C ; [.1D06.0020.0002] # LATIN SMALL LETTER D WITH TOPBAR +018B ; [.1D06.0020.0008] # LATIN CAPITAL LETTER D WITH TOPBAR +0221 ; [.1D0A.0020.0002] # LATIN SMALL LETTER D WITH CURL +A771 ; [.1D0E.0020.0002] # LATIN SMALL LETTER DUM +1E9F ; [.1D0F.0020.0002] # LATIN SMALL LETTER DELTA +0065 ; [.1D10.0020.0002] # LATIN SMALL LETTER E +FF45 ; [.1D10.0020.0003] # FULLWIDTH LATIN SMALL LETTER E +0364 ; [.1D10.0020.0004] # COMBINING LATIN SMALL LETTER E +24A0 ; [*0318.0020.0004][.1D10.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER E +212F ; [.1D10.0020.0005] # SCRIPT SMALL E +2147 ; [.1D10.0020.0005] # DOUBLE-STRUCK ITALIC SMALL E +1D41E ; [.1D10.0020.0005] # MATHEMATICAL BOLD SMALL E +1D452 ; [.1D10.0020.0005] # MATHEMATICAL ITALIC SMALL E +1D486 ; [.1D10.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL E +1D4EE ; [.1D10.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL E +1D522 ; [.1D10.0020.0005] # MATHEMATICAL FRAKTUR SMALL E +1D556 ; [.1D10.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL E +1D58A ; [.1D10.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL E +1D5BE ; [.1D10.0020.0005] # MATHEMATICAL SANS-SERIF SMALL E +1D5F2 ; [.1D10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL E +1D626 ; [.1D10.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D65A ; [.1D10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D68E ; [.1D10.0020.0005] # MATHEMATICAL MONOSPACE SMALL E +24D4 ; [.1D10.0020.0006] # CIRCLED LATIN SMALL LETTER E +0045 ; [.1D10.0020.0008] # LATIN CAPITAL LETTER E +FF25 ; [.1D10.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER E +1F114 ; [*0318.0020.0004][.1D10.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER E +2130 ; [.1D10.0020.000B] # SCRIPT CAPITAL E +1D404 ; [.1D10.0020.000B] # MATHEMATICAL BOLD CAPITAL E +1D438 ; [.1D10.0020.000B] # MATHEMATICAL ITALIC CAPITAL E +1D46C ; [.1D10.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL E +1D4D4 ; [.1D10.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL E +1D508 ; [.1D10.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL E +1D53C ; [.1D10.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D570 ; [.1D10.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D5A4 ; [.1D10.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL E +1D5D8 ; [.1D10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D60C ; [.1D10.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D640 ; [.1D10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D674 ; [.1D10.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL E +24BA ; [.1D10.0020.000C] # CIRCLED LATIN CAPITAL LETTER E +1F154 ; [.1D10.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER E +1D49 ; [.1D10.0020.0014] # MODIFIER LETTER SMALL E +2091 ; [.1D10.0020.0015] # LATIN SUBSCRIPT SMALL LETTER E +1D31 ; [.1D10.0020.001D] # MODIFIER LETTER CAPITAL E +1F134 ; [.1D10.0020.001D] # SQUARED LATIN CAPITAL LETTER E +1F174 ; [.1D10.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER E +00E9 ; [.1D10.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH ACUTE +00C9 ; [.1D10.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH ACUTE +00E8 ; [.1D10.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH GRAVE +00C8 ; [.1D10.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH GRAVE +0115 ; [.1D10.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH BREVE +0114 ; [.1D10.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH BREVE +00EA ; [.1D10.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX +00CA ; [.1D10.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +1EBF ; [.1D10.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBE ; [.1D10.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC1 ; [.1D10.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC0 ; [.1D10.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC5 ; [.1D10.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC4 ; [.1D10.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC3 ; [.1D10.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC2 ; [.1D10.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +011B ; [.1D10.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER E WITH CARON +011A ; [.1D10.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER E WITH CARON +00EB ; [.1D10.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER E WITH DIAERESIS +00CB ; [.1D10.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER E WITH DIAERESIS +1EBD ; [.1D10.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH TILDE +1EBC ; [.1D10.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH TILDE +0117 ; [.1D10.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER E WITH DOT ABOVE +0116 ; [.1D10.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER E WITH DOT ABOVE +0229 ; [.1D10.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER E WITH CEDILLA +0228 ; [.1D10.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER E WITH CEDILLA +1E1D ; [.1D10.0020.0002][.0000.0030.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1C ; [.1D10.0020.0008][.0000.0030.0002][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +0119 ; [.1D10.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER E WITH OGONEK +0118 ; [.1D10.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER E WITH OGONEK +0113 ; [.1D10.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER E WITH MACRON +0112 ; [.1D10.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER E WITH MACRON +1E17 ; [.1D10.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E16 ; [.1D10.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E15 ; [.1D10.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E14 ; [.1D10.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1EBB ; [.1D10.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH HOOK ABOVE +1EBA ; [.1D10.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH HOOK ABOVE +0205 ; [.1D10.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER E WITH DOUBLE GRAVE +0204 ; [.1D10.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0207 ; [.1D10.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER E WITH INVERTED BREVE +0206 ; [.1D10.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER E WITH INVERTED BREVE +1EB9 ; [.1D10.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER E WITH DOT BELOW +1EB8 ; [.1D10.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER E WITH DOT BELOW +1EC7 ; [.1D10.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC6 ; [.1D10.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1E19 ; [.1D10.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E18 ; [.1D10.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1B ; [.1D10.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER E WITH TILDE BELOW +1E1A ; [.1D10.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER E WITH TILDE BELOW +32CD ; [.1D10.0020.001C][.1E99.0020.001C][.1D5A.0020.001C] # SQUARE ERG +32CE ; [.1D10.0020.001C][.1F49.0020.001D] # SQUARE EV +1D07 ; [.1D14.0020.0002] # LATIN LETTER SMALL CAPITAL E +AB32 ; [.1D15.0020.0002] # LATIN SMALL LETTER BLACKLETTER E +AB33 ; [.1D16.0020.0002] # LATIN SMALL LETTER BARRED E +0247 ; [.1D17.0020.0002] # LATIN SMALL LETTER E WITH STROKE +0246 ; [.1D17.0020.0008] # LATIN CAPITAL LETTER E WITH STROKE +1D92 ; [.1D1B.0020.0002] # LATIN SMALL LETTER E WITH RETROFLEX HOOK +AB34 ; [.1D1C.0020.0002] # LATIN SMALL LETTER E WITH FLOURISH +2C78 ; [.1D1D.0020.0002] # LATIN SMALL LETTER E WITH NOTCH +01DD ; [.1D1E.0020.0002] # LATIN SMALL LETTER TURNED E +018E ; [.1D1E.0020.0008] # LATIN CAPITAL LETTER REVERSED E +1D32 ; [.1D1E.0020.001D] # MODIFIER LETTER CAPITAL REVERSED E +2C7B ; [.1D22.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED E +0259 ; [.1D23.0020.0002] # LATIN SMALL LETTER SCHWA +1DEA ; [.1D23.0020.0004] # COMBINING LATIN SMALL LETTER SCHWA +018F ; [.1D23.0020.0008] # LATIN CAPITAL LETTER SCHWA +1D4A ; [.1D23.0020.0014] # MODIFIER LETTER SMALL SCHWA +2094 ; [.1D23.0020.0015] # LATIN SUBSCRIPT SMALL LETTER SCHWA +1D95 ; [.1D27.0020.0002] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK +025B ; [.1D28.0020.0002] # LATIN SMALL LETTER OPEN E +0190 ; [.1D28.0020.0008] # LATIN CAPITAL LETTER OPEN E +2107 ; [.1D28.0020.000A] # EULER CONSTANT +1D4B ; [.1D28.0020.0014] # MODIFIER LETTER SMALL OPEN E +1D93 ; [.1D2C.0020.0002] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK +0258 ; [.1D2D.0020.0002] # LATIN SMALL LETTER REVERSED E +025A ; [.1D31.0020.0002] # LATIN SMALL LETTER SCHWA WITH HOOK +025C ; [.1D35.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E +A7AB ; [.1D35.0020.0008] # LATIN CAPITAL LETTER REVERSED OPEN E +1D9F ; [.1D35.0020.0014] # MODIFIER LETTER SMALL REVERSED OPEN E +1D94 ; [.1D39.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK +1D08 ; [.1D3A.0020.0002] # LATIN SMALL LETTER TURNED OPEN E +1D4C ; [.1D3A.0020.0014] # MODIFIER LETTER SMALL TURNED OPEN E +025D ; [.1D3B.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK +025E ; [.1D3F.0020.0002] # LATIN SMALL LETTER CLOSED REVERSED OPEN E +029A ; [.1D43.0020.0002] # LATIN SMALL LETTER CLOSED OPEN E +0264 ; [.1D47.0020.0002] # LATIN SMALL LETTER RAMS HORN +0066 ; [.1D4B.0020.0002] # LATIN SMALL LETTER F +FF46 ; [.1D4B.0020.0003] # FULLWIDTH LATIN SMALL LETTER F +1DEB ; [.1D4B.0020.0004] # COMBINING LATIN SMALL LETTER F +24A1 ; [*0318.0020.0004][.1D4B.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER F +1D41F ; [.1D4B.0020.0005] # MATHEMATICAL BOLD SMALL F +1D453 ; [.1D4B.0020.0005] # MATHEMATICAL ITALIC SMALL F +1D487 ; [.1D4B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL F +1D4BB ; [.1D4B.0020.0005] # MATHEMATICAL SCRIPT SMALL F +1D4EF ; [.1D4B.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL F +1D523 ; [.1D4B.0020.0005] # MATHEMATICAL FRAKTUR SMALL F +1D557 ; [.1D4B.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL F +1D58B ; [.1D4B.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL F +1D5BF ; [.1D4B.0020.0005] # MATHEMATICAL SANS-SERIF SMALL F +1D5F3 ; [.1D4B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL F +1D627 ; [.1D4B.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D65B ; [.1D4B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D68F ; [.1D4B.0020.0005] # MATHEMATICAL MONOSPACE SMALL F +24D5 ; [.1D4B.0020.0006] # CIRCLED LATIN SMALL LETTER F +0046 ; [.1D4B.0020.0008] # LATIN CAPITAL LETTER F +FF26 ; [.1D4B.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER F +2109 ; [*050C.0020.0004][.1D4B.0020.000A] # DEGREE FAHRENHEIT +1F115 ; [*0318.0020.0004][.1D4B.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER F +2131 ; [.1D4B.0020.000B] # SCRIPT CAPITAL F +1D405 ; [.1D4B.0020.000B] # MATHEMATICAL BOLD CAPITAL F +1D439 ; [.1D4B.0020.000B] # MATHEMATICAL ITALIC CAPITAL F +1D46D ; [.1D4B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL F +1D4D5 ; [.1D4B.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL F +1D509 ; [.1D4B.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL F +1D53D ; [.1D4B.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D571 ; [.1D4B.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D5A5 ; [.1D4B.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL F +1D5D9 ; [.1D4B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D60D ; [.1D4B.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D641 ; [.1D4B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D675 ; [.1D4B.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL F +24BB ; [.1D4B.0020.000C] # CIRCLED LATIN CAPITAL LETTER F +1F155 ; [.1D4B.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER F +1DA0 ; [.1D4B.0020.0014] # MODIFIER LETTER SMALL F +1F135 ; [.1D4B.0020.001D] # SQUARED LATIN CAPITAL LETTER F +1F175 ; [.1D4B.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER F +1E1F ; [.1D4B.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER F WITH DOT ABOVE +1E1E ; [.1D4B.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER F WITH DOT ABOVE +A77C ; [.1D4B.0020.0004][.0000.0112.0004] # LATIN SMALL LETTER INSULAR F +A77B ; [.1D4B.0020.000A][.0000.0112.0004] # LATIN CAPITAL LETTER INSULAR F +213B ; [.1D4B.0020.000A][.1CAD.0020.000A][.1F65.0020.000A] # FACSIMILE SIGN +FB00 ; [.1D4B.0020.0004][.1D4B.0020.0004] # LATIN SMALL LIGATURE FF +FB03 ; [.1D4B.0020.0004][.1D4B.0020.0004][.1D98.0020.0004] # LATIN SMALL LIGATURE FFI +FB04 ; [.1D4B.0020.0004][.1D4B.0020.0004][.1DDD.0020.0004] # LATIN SMALL LIGATURE FFL +FB01 ; [.1D4B.0020.0004][.1D98.0020.0004] # LATIN SMALL LIGATURE FI +FB02 ; [.1D4B.0020.0004][.1DDD.0020.0004] # LATIN SMALL LIGATURE FL +3399 ; [.1D4B.0020.001C][.1E10.0020.001C] # SQUARE FM +02A9 ; [.1D4B.0020.0004][.1E3E.0020.0004] # LATIN SMALL LETTER FENG DIGRAPH +1F193 ; [.1D4B.0020.001D][.1E99.0020.001D][.1D10.0020.001D][.1D10.0020.001D] # SQUARED FREE +A730 ; [.1D4F.0020.0002] # LATIN LETTER SMALL CAPITAL F +AB35 ; [.1D50.0020.0002] # LATIN SMALL LETTER LENIS F +A799 ; [.1D51.0020.0002] # LATIN SMALL LETTER F WITH STROKE +A798 ; [.1D51.0020.0008] # LATIN CAPITAL LETTER F WITH STROKE +1D6E ; [.1D52.0020.0002] # LATIN SMALL LETTER F WITH MIDDLE TILDE +1D82 ; [.1D53.0020.0002] # LATIN SMALL LETTER F WITH PALATAL HOOK +0192 ; [.1D54.0020.0002] # LATIN SMALL LETTER F WITH HOOK +0191 ; [.1D54.0020.0008] # LATIN CAPITAL LETTER F WITH HOOK +214E ; [.1D58.0020.0002] # TURNED SMALL F +2132 ; [.1D58.0020.0008] # TURNED CAPITAL F +A7FB ; [.1D59.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED F +0067 ; [.1D5A.0020.0002] # LATIN SMALL LETTER G +FF47 ; [.1D5A.0020.0003] # FULLWIDTH LATIN SMALL LETTER G +1DDA ; [.1D5A.0020.0004] # COMBINING LATIN SMALL LETTER G +24A2 ; [*0318.0020.0004][.1D5A.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER G +210A ; [.1D5A.0020.0005] # SCRIPT SMALL G +1D420 ; [.1D5A.0020.0005] # MATHEMATICAL BOLD SMALL G +1D454 ; [.1D5A.0020.0005] # MATHEMATICAL ITALIC SMALL G +1D488 ; [.1D5A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL G +1D4F0 ; [.1D5A.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL G +1D524 ; [.1D5A.0020.0005] # MATHEMATICAL FRAKTUR SMALL G +1D558 ; [.1D5A.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL G +1D58C ; [.1D5A.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL G +1D5C0 ; [.1D5A.0020.0005] # MATHEMATICAL SANS-SERIF SMALL G +1D5F4 ; [.1D5A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL G +1D628 ; [.1D5A.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D65C ; [.1D5A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D690 ; [.1D5A.0020.0005] # MATHEMATICAL MONOSPACE SMALL G +24D6 ; [.1D5A.0020.0006] # CIRCLED LATIN SMALL LETTER G +0047 ; [.1D5A.0020.0008] # LATIN CAPITAL LETTER G +FF27 ; [.1D5A.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER G +1F116 ; [*0318.0020.0004][.1D5A.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER G +1D406 ; [.1D5A.0020.000B] # MATHEMATICAL BOLD CAPITAL G +1D43A ; [.1D5A.0020.000B] # MATHEMATICAL ITALIC CAPITAL G +1D46E ; [.1D5A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL G +1D4A2 ; [.1D5A.0020.000B] # MATHEMATICAL SCRIPT CAPITAL G +1D4D6 ; [.1D5A.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL G +1D50A ; [.1D5A.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL G +1D53E ; [.1D5A.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D572 ; [.1D5A.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D5A6 ; [.1D5A.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL G +1D5DA ; [.1D5A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D60E ; [.1D5A.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D642 ; [.1D5A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D676 ; [.1D5A.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL G +24BC ; [.1D5A.0020.000C] # CIRCLED LATIN CAPITAL LETTER G +1F156 ; [.1D5A.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER G +1D4D ; [.1D5A.0020.0014] # MODIFIER LETTER SMALL G +1D33 ; [.1D5A.0020.001D] # MODIFIER LETTER CAPITAL G +1F136 ; [.1D5A.0020.001D] # SQUARED LATIN CAPITAL LETTER G +1F176 ; [.1D5A.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER G +01F5 ; [.1D5A.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER G WITH ACUTE +01F4 ; [.1D5A.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER G WITH ACUTE +011F ; [.1D5A.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER G WITH BREVE +011E ; [.1D5A.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER G WITH BREVE +011D ; [.1D5A.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER G WITH CIRCUMFLEX +011C ; [.1D5A.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +01E7 ; [.1D5A.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER G WITH CARON +01E6 ; [.1D5A.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER G WITH CARON +0121 ; [.1D5A.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER G WITH DOT ABOVE +0120 ; [.1D5A.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER G WITH DOT ABOVE +0123 ; [.1D5A.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER G WITH CEDILLA +0122 ; [.1D5A.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER G WITH CEDILLA +1E21 ; [.1D5A.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER G WITH MACRON +1E20 ; [.1D5A.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER G WITH MACRON +A7A1 ; [.1D5A.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER G WITH OBLIQUE STROKE +A7A0 ; [.1D5A.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +1D79 ; [.1D5A.0020.0004][.0000.0112.0004] # LATIN SMALL LETTER INSULAR G +A77D ; [.1D5A.0020.000A][.0000.0112.0004] # LATIN CAPITAL LETTER INSULAR G +33FF ; [.1D5A.0020.001C][.1CAD.0020.001C][.1DDD.0020.001C] # SQUARE GAL +3387 ; [.1D5A.0020.001D][.1CC6.0020.001D] # SQUARE GB +3393 ; [.1D5A.0020.001D][.1D7E.0020.001D][.1F87.0020.001C] # SQUARE GHZ +33AC ; [.1D5A.0020.001D][.1E72.0020.001D][.1CAD.0020.001C] # SQUARE GPA +33C9 ; [.1D5A.0020.001D][.1F71.0020.001C] # SQUARE GY +0261 ; [.1D5E.0020.0002] # LATIN SMALL LETTER SCRIPT G +A7AC ; [.1D5E.0020.0008] # LATIN CAPITAL LETTER SCRIPT G +1DA2 ; [.1D5E.0020.0014] # MODIFIER LETTER SMALL SCRIPT G +AB36 ; [.1D62.0020.0002] # LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL +0262 ; [.1D63.0020.0002] # LATIN LETTER SMALL CAPITAL G +1DDB ; [.1D63.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL G +01E5 ; [.1D67.0020.0002] # LATIN SMALL LETTER G WITH STROKE +01E4 ; [.1D67.0020.0008] # LATIN CAPITAL LETTER G WITH STROKE +1D83 ; [.1D6B.0020.0002] # LATIN SMALL LETTER G WITH PALATAL HOOK +0260 ; [.1D6C.0020.0002] # LATIN SMALL LETTER G WITH HOOK +0193 ; [.1D6C.0020.0008] # LATIN CAPITAL LETTER G WITH HOOK +029B ; [.1D70.0020.0002] # LATIN LETTER SMALL CAPITAL G WITH HOOK +1D77 ; [.1D74.0020.0002] # LATIN SMALL LETTER TURNED G +A77F ; [.1D75.0020.0002] # LATIN SMALL LETTER TURNED INSULAR G +A77E ; [.1D75.0020.0008] # LATIN CAPITAL LETTER TURNED INSULAR G +0263 ; [.1D76.0020.0002] # LATIN SMALL LETTER GAMMA +0194 ; [.1D76.0020.0008] # LATIN CAPITAL LETTER GAMMA +02E0 ; [.1D76.0020.0014] # MODIFIER LETTER SMALL GAMMA +01A3 ; [.1D7A.0020.0002] # LATIN SMALL LETTER OI +01A2 ; [.1D7A.0020.0008] # LATIN CAPITAL LETTER OI +0068 ; [.1D7E.0020.0002] # LATIN SMALL LETTER H +FF48 ; [.1D7E.0020.0003] # FULLWIDTH LATIN SMALL LETTER H +036A ; [.1D7E.0020.0004] # COMBINING LATIN SMALL LETTER H +24A3 ; [*0318.0020.0004][.1D7E.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER H +210E ; [.1D7E.0020.0005] # PLANCK CONSTANT +1D421 ; [.1D7E.0020.0005] # MATHEMATICAL BOLD SMALL H +1D489 ; [.1D7E.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL H +1D4BD ; [.1D7E.0020.0005] # MATHEMATICAL SCRIPT SMALL H +1D4F1 ; [.1D7E.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL H +1D525 ; [.1D7E.0020.0005] # MATHEMATICAL FRAKTUR SMALL H +1D559 ; [.1D7E.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL H +1D58D ; [.1D7E.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL H +1D5C1 ; [.1D7E.0020.0005] # MATHEMATICAL SANS-SERIF SMALL H +1D5F5 ; [.1D7E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL H +1D629 ; [.1D7E.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D65D ; [.1D7E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D691 ; [.1D7E.0020.0005] # MATHEMATICAL MONOSPACE SMALL H +24D7 ; [.1D7E.0020.0006] # CIRCLED LATIN SMALL LETTER H +0048 ; [.1D7E.0020.0008] # LATIN CAPITAL LETTER H +FF28 ; [.1D7E.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER H +1F117 ; [*0318.0020.0004][.1D7E.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER H +210B ; [.1D7E.0020.000B] # SCRIPT CAPITAL H +210C ; [.1D7E.0020.000B] # BLACK-LETTER CAPITAL H +210D ; [.1D7E.0020.000B] # DOUBLE-STRUCK CAPITAL H +1D407 ; [.1D7E.0020.000B] # MATHEMATICAL BOLD CAPITAL H +1D43B ; [.1D7E.0020.000B] # MATHEMATICAL ITALIC CAPITAL H +1D46F ; [.1D7E.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL H +1D4D7 ; [.1D7E.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL H +1D573 ; [.1D7E.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D5A7 ; [.1D7E.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL H +1D5DB ; [.1D7E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D60F ; [.1D7E.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D643 ; [.1D7E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D677 ; [.1D7E.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL H +24BD ; [.1D7E.0020.000C] # CIRCLED LATIN CAPITAL LETTER H +1F157 ; [.1D7E.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H +02B0 ; [.1D7E.0020.0014] # MODIFIER LETTER SMALL H +2095 ; [.1D7E.0020.0015] # LATIN SUBSCRIPT SMALL LETTER H +1D34 ; [.1D7E.0020.001D] # MODIFIER LETTER CAPITAL H +1F137 ; [.1D7E.0020.001D] # SQUARED LATIN CAPITAL LETTER H +1F177 ; [.1D7E.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER H +0125 ; [.1D7E.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER H WITH CIRCUMFLEX +0124 ; [.1D7E.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +021F ; [.1D7E.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER H WITH CARON +021E ; [.1D7E.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER H WITH CARON +1E27 ; [.1D7E.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER H WITH DIAERESIS +1E26 ; [.1D7E.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER H WITH DIAERESIS +1E23 ; [.1D7E.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER H WITH DOT ABOVE +1E22 ; [.1D7E.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E29 ; [.1D7E.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER H WITH CEDILLA +1E28 ; [.1D7E.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER H WITH CEDILLA +0127 ; [.1D7E.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER H WITH STROKE +210F ; [.1D7E.0020.0002][.0000.0039.0002] # PLANCK CONSTANT OVER TWO PI +0126 ; [.1D7E.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER H WITH STROKE +A7F8 ; [.1D7E.0020.0014][.0000.0039.0014] # MODIFIER LETTER CAPITAL H WITH STROKE +1E25 ; [.1D7E.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER H WITH DOT BELOW +1E24 ; [.1D7E.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER H WITH DOT BELOW +1E2B ; [.1D7E.0020.0002][.0000.0047.0002] # LATIN SMALL LETTER H WITH BREVE BELOW +1E2A ; [.1D7E.0020.0008][.0000.0047.0002] # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E96 ; [.1D7E.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER H WITH LINE BELOW +33CA ; [.1D7E.0020.001C][.1CAD.0020.001C] # SQUARE HA +1F1A6 ; [.1D7E.0020.001D][.1CE0.0020.001C] # SQUARED HC +1F1A7 ; [.1D7E.0020.001D][.1CF5.0020.001C][.1E99.0020.001D] # SQUARED HDR +32CC ; [.1D7E.0020.001D][.1D5A.0020.001C] # SQUARE HG +1F1A8 ; [.1D7E.0020.001D][.1D98.0020.001C][*0209.0020.001C][.1E99.0020.001D][.1D10.0020.001C][.1ED7.0020.001C] # SQUARED HI-RES +33CB ; [.1D7E.0020.001D][.1E72.0020.001D] # SQUARE HP +3371 ; [.1D7E.0020.001C][.1E72.0020.001D][.1CAD.0020.001C] # SQUARE HPA +1F14A ; [.1D7E.0020.001D][.1F49.0020.001D] # SQUARED HV +3390 ; [.1D7E.0020.001D][.1F87.0020.001C] # SQUARE HZ +029C ; [.1D82.0020.0002] # LATIN LETTER SMALL CAPITAL H +0195 ; [.1D86.0020.0002] # LATIN SMALL LETTER HV +01F6 ; [.1D86.0020.0008] # LATIN CAPITAL LETTER HWAIR +A795 ; [.1D8A.0020.0002] # LATIN SMALL LETTER H WITH PALATAL HOOK +0266 ; [.1D8B.0020.0002] # LATIN SMALL LETTER H WITH HOOK +A7AA ; [.1D8B.0020.0008] # LATIN CAPITAL LETTER H WITH HOOK +02B1 ; [.1D8B.0020.0014] # MODIFIER LETTER SMALL H WITH HOOK +2C68 ; [.1D8F.0020.0002] # LATIN SMALL LETTER H WITH DESCENDER +2C67 ; [.1D8F.0020.0008] # LATIN CAPITAL LETTER H WITH DESCENDER +2C76 ; [.1D90.0020.0002] # LATIN SMALL LETTER HALF H +2C75 ; [.1D90.0020.0008] # LATIN CAPITAL LETTER HALF H +A727 ; [.1D91.0020.0002] # LATIN SMALL LETTER HENG +A726 ; [.1D91.0020.0008] # LATIN CAPITAL LETTER HENG +AB5C ; [.1D91.0020.0014] # MODIFIER LETTER SMALL HENG +0267 ; [.1D92.0020.0002] # LATIN SMALL LETTER HENG WITH HOOK +02BB ; [.1D96.0020.0002] # MODIFIER LETTER TURNED COMMA +02BD ; [.1D97.0020.0002] # MODIFIER LETTER REVERSED COMMA +0069 ; [.1D98.0020.0002] # LATIN SMALL LETTER I +FF49 ; [.1D98.0020.0003] # FULLWIDTH LATIN SMALL LETTER I +0365 ; [.1D98.0020.0004] # COMBINING LATIN SMALL LETTER I +2170 ; [.1D98.0020.0004] # SMALL ROMAN NUMERAL ONE +24A4 ; [*0318.0020.0004][.1D98.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER I +2139 ; [.1D98.0020.0005] # INFORMATION SOURCE +2148 ; [.1D98.0020.0005] # DOUBLE-STRUCK ITALIC SMALL I +1D422 ; [.1D98.0020.0005] # MATHEMATICAL BOLD SMALL I +1D456 ; [.1D98.0020.0005] # MATHEMATICAL ITALIC SMALL I +1D48A ; [.1D98.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL I +1D4BE ; [.1D98.0020.0005] # MATHEMATICAL SCRIPT SMALL I +1D4F2 ; [.1D98.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL I +1D526 ; [.1D98.0020.0005] # MATHEMATICAL FRAKTUR SMALL I +1D55A ; [.1D98.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL I +1D58E ; [.1D98.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL I +1D5C2 ; [.1D98.0020.0005] # MATHEMATICAL SANS-SERIF SMALL I +1D5F6 ; [.1D98.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL I +1D62A ; [.1D98.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D65E ; [.1D98.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D692 ; [.1D98.0020.0005] # MATHEMATICAL MONOSPACE SMALL I +24D8 ; [.1D98.0020.0006] # CIRCLED LATIN SMALL LETTER I +0049 ; [.1D98.0020.0008] # LATIN CAPITAL LETTER I +FF29 ; [.1D98.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER I +2160 ; [.1D98.0020.000A] # ROMAN NUMERAL ONE +1F118 ; [*0318.0020.0004][.1D98.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER I +2110 ; [.1D98.0020.000B] # SCRIPT CAPITAL I +2111 ; [.1D98.0020.000B] # BLACK-LETTER CAPITAL I +1D408 ; [.1D98.0020.000B] # MATHEMATICAL BOLD CAPITAL I +1D43C ; [.1D98.0020.000B] # MATHEMATICAL ITALIC CAPITAL I +1D470 ; [.1D98.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL I +1D4D8 ; [.1D98.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL I +1D540 ; [.1D98.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D574 ; [.1D98.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D5A8 ; [.1D98.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL I +1D5DC ; [.1D98.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D610 ; [.1D98.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D644 ; [.1D98.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D678 ; [.1D98.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL I +24BE ; [.1D98.0020.000C] # CIRCLED LATIN CAPITAL LETTER I +1F158 ; [.1D98.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER I +2071 ; [.1D98.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER I +1D62 ; [.1D98.0020.0015] # LATIN SUBSCRIPT SMALL LETTER I +1D35 ; [.1D98.0020.001D] # MODIFIER LETTER CAPITAL I +1F138 ; [.1D98.0020.001D] # SQUARED LATIN CAPITAL LETTER I +1F178 ; [.1D98.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER I +00ED ; [.1D98.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH ACUTE +00CD ; [.1D98.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH ACUTE +00EC ; [.1D98.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER I WITH GRAVE +00CC ; [.1D98.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER I WITH GRAVE +012D ; [.1D98.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER I WITH BREVE +012C ; [.1D98.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER I WITH BREVE +00EE ; [.1D98.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER I WITH CIRCUMFLEX +00CE ; [.1D98.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +01D0 ; [.1D98.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER I WITH CARON +01CF ; [.1D98.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER I WITH CARON +00EF ; [.1D98.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER I WITH DIAERESIS +00CF ; [.1D98.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS +1E2F ; [.1D98.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E2E ; [.1D98.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +0129 ; [.1D98.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER I WITH TILDE +0128 ; [.1D98.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER I WITH TILDE +0130 ; [.1D98.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER I WITH DOT ABOVE +012F ; [.1D98.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER I WITH OGONEK +012E ; [.1D98.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER I WITH OGONEK +012B ; [.1D98.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER I WITH MACRON +012A ; [.1D98.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER I WITH MACRON +1EC9 ; [.1D98.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER I WITH HOOK ABOVE +1EC8 ; [.1D98.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER I WITH HOOK ABOVE +0209 ; [.1D98.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER I WITH DOUBLE GRAVE +0208 ; [.1D98.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020B ; [.1D98.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER I WITH INVERTED BREVE +020A ; [.1D98.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER I WITH INVERTED BREVE +1ECB ; [.1D98.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER I WITH DOT BELOW +1ECA ; [.1D98.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER I WITH DOT BELOW +1E2D ; [.1D98.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER I WITH TILDE BELOW +1E2C ; [.1D98.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER I WITH TILDE BELOW +1F18B ; [.1D98.0020.001D][.1CE0.0020.001D] # NEGATIVE SQUARED IC +1F194 ; [.1D98.0020.001D][.1CF5.0020.001D] # SQUARED ID +2171 ; [.1D98.0020.0004][.1D98.0020.0004] # SMALL ROMAN NUMERAL TWO +2161 ; [.1D98.0020.000A][.1D98.0020.000A] # ROMAN NUMERAL TWO +2172 ; [.1D98.0020.0004][.1D98.0020.0004][.1D98.0020.0004] # SMALL ROMAN NUMERAL THREE +2162 ; [.1D98.0020.000A][.1D98.0020.000A][.1D98.0020.000A] # ROMAN NUMERAL THREE +0133 ; [.1D98.0020.0004][.1DB2.0020.0004] # LATIN SMALL LIGATURE IJ +0132 ; [.1D98.0020.000A][.1DB2.0020.000A] # LATIN CAPITAL LIGATURE IJ +33CC ; [.1D98.0020.001C][.1E1F.0020.001C] # SQUARE IN +337A ; [.1D98.0020.001D][.1F1B.0020.001D] # SQUARE IU +2173 ; [.1D98.0020.0004][.1F49.0020.0004] # SMALL ROMAN NUMERAL FOUR +2163 ; [.1D98.0020.000A][.1F49.0020.000A] # ROMAN NUMERAL FOUR +2178 ; [.1D98.0020.0004][.1F65.0020.0004] # SMALL ROMAN NUMERAL NINE +2168 ; [.1D98.0020.000A][.1F65.0020.000A] # ROMAN NUMERAL NINE +0131 ; [.1D9C.0020.0002] # LATIN SMALL LETTER DOTLESS I +1D6A4 ; [.1D9C.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS I +026A ; [.1DA0.0020.0002] # LATIN LETTER SMALL CAPITAL I +A7AE ; [.1DA0.0020.0008] # LATIN CAPITAL LETTER SMALL CAPITAL I +1DA6 ; [.1DA0.0020.0014] # MODIFIER LETTER SMALL CAPITAL I +A7FE ; [.1DA4.0020.0002] # LATIN EPIGRAPHIC LETTER I LONGA +A7F7 ; [.1DA5.0020.0002] # LATIN EPIGRAPHIC LETTER SIDEWAYS I +1D09 ; [.1DA6.0020.0002] # LATIN SMALL LETTER TURNED I +1D4E ; [.1DA6.0020.0014] # MODIFIER LETTER SMALL TURNED I +0268 ; [.1DA7.0020.0002] # LATIN SMALL LETTER I WITH STROKE +0197 ; [.1DA7.0020.0008] # LATIN CAPITAL LETTER I WITH STROKE +1DA4 ; [.1DA7.0020.0014] # MODIFIER LETTER SMALL I WITH STROKE +1D7B ; [.1DAB.0020.0002] # LATIN SMALL CAPITAL LETTER I WITH STROKE +1DA7 ; [.1DAB.0020.0014] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE +1D96 ; [.1DAC.0020.0002] # LATIN SMALL LETTER I WITH RETROFLEX HOOK +0269 ; [.1DAD.0020.0002] # LATIN SMALL LETTER IOTA +0196 ; [.1DAD.0020.0008] # LATIN CAPITAL LETTER IOTA +1DA5 ; [.1DAD.0020.0014] # MODIFIER LETTER SMALL IOTA +1D7C ; [.1DB1.0020.0002] # LATIN SMALL LETTER IOTA WITH STROKE +006A ; [.1DB2.0020.0002] # LATIN SMALL LETTER J +FF4A ; [.1DB2.0020.0003] # FULLWIDTH LATIN SMALL LETTER J +24A5 ; [*0318.0020.0004][.1DB2.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER J +2149 ; [.1DB2.0020.0005] # DOUBLE-STRUCK ITALIC SMALL J +1D423 ; [.1DB2.0020.0005] # MATHEMATICAL BOLD SMALL J +1D457 ; [.1DB2.0020.0005] # MATHEMATICAL ITALIC SMALL J +1D48B ; [.1DB2.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL J +1D4BF ; [.1DB2.0020.0005] # MATHEMATICAL SCRIPT SMALL J +1D4F3 ; [.1DB2.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL J +1D527 ; [.1DB2.0020.0005] # MATHEMATICAL FRAKTUR SMALL J +1D55B ; [.1DB2.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL J +1D58F ; [.1DB2.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL J +1D5C3 ; [.1DB2.0020.0005] # MATHEMATICAL SANS-SERIF SMALL J +1D5F7 ; [.1DB2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL J +1D62B ; [.1DB2.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D65F ; [.1DB2.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D693 ; [.1DB2.0020.0005] # MATHEMATICAL MONOSPACE SMALL J +24D9 ; [.1DB2.0020.0006] # CIRCLED LATIN SMALL LETTER J +004A ; [.1DB2.0020.0008] # LATIN CAPITAL LETTER J +FF2A ; [.1DB2.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER J +1F119 ; [*0318.0020.0004][.1DB2.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER J +1D409 ; [.1DB2.0020.000B] # MATHEMATICAL BOLD CAPITAL J +1D43D ; [.1DB2.0020.000B] # MATHEMATICAL ITALIC CAPITAL J +1D471 ; [.1DB2.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL J +1D4A5 ; [.1DB2.0020.000B] # MATHEMATICAL SCRIPT CAPITAL J +1D4D9 ; [.1DB2.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL J +1D50D ; [.1DB2.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL J +1D541 ; [.1DB2.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D575 ; [.1DB2.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D5A9 ; [.1DB2.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL J +1D5DD ; [.1DB2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D611 ; [.1DB2.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D645 ; [.1DB2.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D679 ; [.1DB2.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL J +24BF ; [.1DB2.0020.000C] # CIRCLED LATIN CAPITAL LETTER J +1F159 ; [.1DB2.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER J +02B2 ; [.1DB2.0020.0014] # MODIFIER LETTER SMALL J +2C7C ; [.1DB2.0020.0015] # LATIN SUBSCRIPT SMALL LETTER J +1D36 ; [.1DB2.0020.001D] # MODIFIER LETTER CAPITAL J +1F139 ; [.1DB2.0020.001D] # SQUARED LATIN CAPITAL LETTER J +1F179 ; [.1DB2.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER J +0135 ; [.1DB2.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER J WITH CIRCUMFLEX +0134 ; [.1DB2.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +01F0 ; [.1DB2.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER J WITH CARON +0237 ; [.1DB6.0020.0002] # LATIN SMALL LETTER DOTLESS J +1D6A5 ; [.1DB6.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS J +1D0A ; [.1DBA.0020.0002] # LATIN LETTER SMALL CAPITAL J +0249 ; [.1DBB.0020.0002] # LATIN SMALL LETTER J WITH STROKE +0248 ; [.1DBB.0020.0008] # LATIN CAPITAL LETTER J WITH STROKE +029D ; [.1DBF.0020.0002] # LATIN SMALL LETTER J WITH CROSSED-TAIL +A7B2 ; [.1DBF.0020.0008] # LATIN CAPITAL LETTER J WITH CROSSED-TAIL +1DA8 ; [.1DBF.0020.0014] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL +025F ; [.1DC3.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE +1DA1 ; [.1DC3.0020.0014] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE +0284 ; [.1DC7.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK +006B ; [.1DCB.0020.0002] # LATIN SMALL LETTER K +FF4B ; [.1DCB.0020.0003] # FULLWIDTH LATIN SMALL LETTER K +1DDC ; [.1DCB.0020.0004] # COMBINING LATIN SMALL LETTER K +24A6 ; [*0318.0020.0004][.1DCB.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER K +1D424 ; [.1DCB.0020.0005] # MATHEMATICAL BOLD SMALL K +1D458 ; [.1DCB.0020.0005] # MATHEMATICAL ITALIC SMALL K +1D48C ; [.1DCB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL K +1D4C0 ; [.1DCB.0020.0005] # MATHEMATICAL SCRIPT SMALL K +1D4F4 ; [.1DCB.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL K +1D528 ; [.1DCB.0020.0005] # MATHEMATICAL FRAKTUR SMALL K +1D55C ; [.1DCB.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL K +1D590 ; [.1DCB.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL K +1D5C4 ; [.1DCB.0020.0005] # MATHEMATICAL SANS-SERIF SMALL K +1D5F8 ; [.1DCB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL K +1D62C ; [.1DCB.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D660 ; [.1DCB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D694 ; [.1DCB.0020.0005] # MATHEMATICAL MONOSPACE SMALL K +24DA ; [.1DCB.0020.0006] # CIRCLED LATIN SMALL LETTER K +004B ; [.1DCB.0020.0008] # LATIN CAPITAL LETTER K +212A ; [.1DCB.0020.0008] # KELVIN SIGN +FF2B ; [.1DCB.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER K +1F11A ; [*0318.0020.0004][.1DCB.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER K +1D40A ; [.1DCB.0020.000B] # MATHEMATICAL BOLD CAPITAL K +1D43E ; [.1DCB.0020.000B] # MATHEMATICAL ITALIC CAPITAL K +1D472 ; [.1DCB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL K +1D4A6 ; [.1DCB.0020.000B] # MATHEMATICAL SCRIPT CAPITAL K +1D4DA ; [.1DCB.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL K +1D50E ; [.1DCB.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL K +1D542 ; [.1DCB.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D576 ; [.1DCB.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D5AA ; [.1DCB.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL K +1D5DE ; [.1DCB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D612 ; [.1DCB.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D646 ; [.1DCB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D67A ; [.1DCB.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL K +24C0 ; [.1DCB.0020.000C] # CIRCLED LATIN CAPITAL LETTER K +1F15A ; [.1DCB.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER K +1D4F ; [.1DCB.0020.0014] # MODIFIER LETTER SMALL K +2096 ; [.1DCB.0020.0015] # LATIN SUBSCRIPT SMALL LETTER K +1D37 ; [.1DCB.0020.001D] # MODIFIER LETTER CAPITAL K +1F13A ; [.1DCB.0020.001D] # SQUARED LATIN CAPITAL LETTER K +1F17A ; [.1DCB.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER K +1E31 ; [.1DCB.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER K WITH ACUTE +1E30 ; [.1DCB.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER K WITH ACUTE +01E9 ; [.1DCB.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER K WITH CARON +01E8 ; [.1DCB.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER K WITH CARON +0137 ; [.1DCB.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER K WITH CEDILLA +0136 ; [.1DCB.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER K WITH CEDILLA +A7A3 ; [.1DCB.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER K WITH OBLIQUE STROKE +A7A2 ; [.1DCB.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +1E33 ; [.1DCB.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER K WITH DOT BELOW +1E32 ; [.1DCB.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER K WITH DOT BELOW +1E35 ; [.1DCB.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER K WITH LINE BELOW +1E34 ; [.1DCB.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER K WITH LINE BELOW +3384 ; [.1DCB.0020.001C][.1CAD.0020.001D] # SQUARE KA +3385 ; [.1DCB.0020.001D][.1CC6.0020.001D] # SQUARE KB +3389 ; [.1DCB.0020.001C][.1CE0.0020.001C][.1CAD.0020.001C][.1DDD.0020.001C] # SQUARE KCAL +338F ; [.1DCB.0020.001C][.1D5A.0020.001C] # SQUARE KG +3391 ; [.1DCB.0020.001C][.1D7E.0020.001D][.1F87.0020.001C] # SQUARE KHZ +33CD ; [.1DCB.0020.001D][.1DCB.0020.001D] # SQUARE KK +3398 ; [.1DCB.0020.001C][.1DDD.0020.001C] # SQUARE KL +339E ; [.1DCB.0020.001C][.1E10.0020.001C] # SQUARE KM +33CE ; [.1DCB.0020.001D][.1E10.0020.001D] # SQUARE KM CAPITAL +33A2 ; [.1DCB.0020.001C][.1E10.0020.001C][.1CA5.0020.001C] # SQUARE KM SQUARED +33A6 ; [.1DCB.0020.001C][.1E10.0020.001C][.1CA6.0020.001C] # SQUARE KM CUBED +33AA ; [.1DCB.0020.001C][.1E72.0020.001D][.1CAD.0020.001C] # SQUARE KPA +33CF ; [.1DCB.0020.001C][.1EFB.0020.001C] # SQUARE KT +33B8 ; [.1DCB.0020.001C][.1F49.0020.001D] # SQUARE KV +33BE ; [.1DCB.0020.001C][.1F5B.0020.001D] # SQUARE KW +33C0 ; [.1DCB.0020.001C][.2047.0020.001D] # SQUARE K OHM +1D0B ; [.1DCF.0020.0002] # LATIN LETTER SMALL CAPITAL K +1D84 ; [.1DD0.0020.0002] # LATIN SMALL LETTER K WITH PALATAL HOOK +0199 ; [.1DD1.0020.0002] # LATIN SMALL LETTER K WITH HOOK +0198 ; [.1DD1.0020.0008] # LATIN CAPITAL LETTER K WITH HOOK +2C6A ; [.1DD5.0020.0002] # LATIN SMALL LETTER K WITH DESCENDER +2C69 ; [.1DD5.0020.0008] # LATIN CAPITAL LETTER K WITH DESCENDER +A741 ; [.1DD6.0020.0002] # LATIN SMALL LETTER K WITH STROKE +A740 ; [.1DD6.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE +A743 ; [.1DD7.0020.0002] # LATIN SMALL LETTER K WITH DIAGONAL STROKE +A742 ; [.1DD7.0020.0008] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A745 ; [.1DD8.0020.0002] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +A744 ; [.1DD8.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +029E ; [.1DD9.0020.0002] # LATIN SMALL LETTER TURNED K +A7B0 ; [.1DD9.0020.0008] # LATIN CAPITAL LETTER TURNED K +006C ; [.1DDD.0020.0002] # LATIN SMALL LETTER L +FF4C ; [.1DDD.0020.0003] # FULLWIDTH LATIN SMALL LETTER L +1DDD ; [.1DDD.0020.0004] # COMBINING LATIN SMALL LETTER L +217C ; [.1DDD.0020.0004] # SMALL ROMAN NUMERAL FIFTY +24A7 ; [*0318.0020.0004][.1DDD.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER L +2113 ; [.1DDD.0020.0005] # SCRIPT SMALL L +1D425 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD SMALL L +1D459 ; [.1DDD.0020.0005] # MATHEMATICAL ITALIC SMALL L +1D48D ; [.1DDD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL L +1D4C1 ; [.1DDD.0020.0005] # MATHEMATICAL SCRIPT SMALL L +1D4F5 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL L +1D529 ; [.1DDD.0020.0005] # MATHEMATICAL FRAKTUR SMALL L +1D55D ; [.1DDD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL L +1D591 ; [.1DDD.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL L +1D5C5 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF SMALL L +1D5F9 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL L +1D62D ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D661 ; [.1DDD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D695 ; [.1DDD.0020.0005] # MATHEMATICAL MONOSPACE SMALL L +24DB ; [.1DDD.0020.0006] # CIRCLED LATIN SMALL LETTER L +004C ; [.1DDD.0020.0008] # LATIN CAPITAL LETTER L +FF2C ; [.1DDD.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER L +216C ; [.1DDD.0020.000A] # ROMAN NUMERAL FIFTY +1F11B ; [*0318.0020.0004][.1DDD.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER L +2112 ; [.1DDD.0020.000B] # SCRIPT CAPITAL L +1D40B ; [.1DDD.0020.000B] # MATHEMATICAL BOLD CAPITAL L +1D43F ; [.1DDD.0020.000B] # MATHEMATICAL ITALIC CAPITAL L +1D473 ; [.1DDD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL L +1D4DB ; [.1DDD.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL L +1D50F ; [.1DDD.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL L +1D543 ; [.1DDD.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D577 ; [.1DDD.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D5AB ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL L +1D5DF ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D613 ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D647 ; [.1DDD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D67B ; [.1DDD.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL L +24C1 ; [.1DDD.0020.000C] # CIRCLED LATIN CAPITAL LETTER L +1F15B ; [.1DDD.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER L +02E1 ; [.1DDD.0020.0014] # MODIFIER LETTER SMALL L +2097 ; [.1DDD.0020.0015] # LATIN SUBSCRIPT SMALL LETTER L +1D38 ; [.1DDD.0020.001D] # MODIFIER LETTER CAPITAL L +1F13B ; [.1DDD.0020.001D] # SQUARED LATIN CAPITAL LETTER L +1F17B ; [.1DDD.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER L +013A ; [.1DDD.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER L WITH ACUTE +0139 ; [.1DDD.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER L WITH ACUTE +013E ; [.1DDD.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER L WITH CARON +013D ; [.1DDD.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER L WITH CARON +013C ; [.1DDD.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER L WITH CEDILLA +013B ; [.1DDD.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER L WITH CEDILLA +0142 ; [.1DDD.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER L WITH STROKE +0141 ; [.1DDD.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER L WITH STROKE +1E37 ; [.1DDD.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER L WITH DOT BELOW +1E36 ; [.1DDD.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW +1E39 ; [.1DDD.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E38 ; [.1DDD.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3D ; [.1DDD.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3C ; [.1DDD.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3B ; [.1DDD.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER L WITH LINE BELOW +1E3A ; [.1DDD.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER L WITH LINE BELOW +0140 ; [.1DDD.0020.0002][.0000.0111.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +006C 00B7 ; [.1DDD.0020.0002][.0000.0111.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +006C 0387 ; [.1DDD.0020.0002][.0000.0111.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT +013F ; [.1DDD.0020.0008][.0000.0111.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +004C 00B7 ; [.1DDD.0020.0008][.0000.0111.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +004C 0387 ; [.1DDD.0020.0008][.0000.0111.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT +01C9 ; [.1DDD.0020.0004][.1DB2.0020.0004] # LATIN SMALL LETTER LJ +01C8 ; [.1DDD.0020.000A][.1DB2.0020.0004] # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01C7 ; [.1DDD.0020.000A][.1DB2.0020.000A] # LATIN CAPITAL LETTER LJ +1EFB ; [.1DDD.0020.0004][.1DDD.0020.0004] # LATIN SMALL LETTER MIDDLE-WELSH LL +1EFA ; [.1DDD.0020.000A][.1DDD.0020.000A] # LATIN CAPITAL LETTER MIDDLE-WELSH LL +33D0 ; [.1DDD.0020.001C][.1E10.0020.001C] # SQUARE LM +33D1 ; [.1DDD.0020.001C][.1E1F.0020.001C] # SQUARE LN +33D2 ; [.1DDD.0020.001C][.1E43.0020.001C][.1D5A.0020.001C] # SQUARE LOG +1F1A9 ; [.1DDD.0020.001D][.1E43.0020.001C][.1ED7.0020.001C][.1ED7.0020.001C][.1DDD.0020.001C][.1D10.0020.001C][.1ED7.0020.001C][.1ED7.0020.001C] # SQUARED LOSSLESS +02AA ; [.1DDD.0020.0004][.1ED7.0020.0004] # LATIN SMALL LETTER LS DIGRAPH +32CF ; [.1DDD.0020.001D][.1EFB.0020.001D][.1CF5.0020.001D] # LIMITED LIABILITY SIGN +33D3 ; [.1DDD.0020.001C][.1F65.0020.001C] # SQUARE LX +02AB ; [.1DDD.0020.0004][.1F87.0020.0004] # LATIN SMALL LETTER LZ DIGRAPH +029F ; [.1DE1.0020.0002] # LATIN LETTER SMALL CAPITAL L +1DDE ; [.1DE1.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL L +1DAB ; [.1DE1.0020.0014] # MODIFIER LETTER SMALL CAPITAL L +A747 ; [.1DE5.0020.0002] # LATIN SMALL LETTER BROKEN L +A746 ; [.1DE5.0020.0008] # LATIN CAPITAL LETTER BROKEN L +1D0C ; [.1DE6.0020.0002] # LATIN LETTER SMALL CAPITAL L WITH STROKE +A749 ; [.1DE7.0020.0002] # LATIN SMALL LETTER L WITH HIGH STROKE +A748 ; [.1DE7.0020.0008] # LATIN CAPITAL LETTER L WITH HIGH STROKE +019A ; [.1DE8.0020.0002] # LATIN SMALL LETTER L WITH BAR +023D ; [.1DE8.0020.0008] # LATIN CAPITAL LETTER L WITH BAR +2C61 ; [.1DEC.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE BAR +2C60 ; [.1DEC.0020.0008] # LATIN CAPITAL LETTER L WITH DOUBLE BAR +026B ; [.1DED.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE TILDE +2C62 ; [.1DED.0020.0008] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE +AB5E ; [.1DED.0020.0014] # MODIFIER LETTER SMALL L WITH MIDDLE TILDE +AB38 ; [.1DF1.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE +1DEC ; [.1DF1.0020.0004] # COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE +AB39 ; [.1DF2.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE RING +026C ; [.1DF3.0020.0002] # LATIN SMALL LETTER L WITH BELT +A7AD ; [.1DF3.0020.0008] # LATIN CAPITAL LETTER L WITH BELT +AB37 ; [.1DF7.0020.0002] # LATIN SMALL LETTER L WITH INVERTED LAZY S +AB5D ; [.1DF7.0020.0014] # MODIFIER LETTER SMALL L WITH INVERTED LAZY S +1D85 ; [.1DF8.0020.0002] # LATIN SMALL LETTER L WITH PALATAL HOOK +1DAA ; [.1DF8.0020.0014] # MODIFIER LETTER SMALL L WITH PALATAL HOOK +026D ; [.1DF9.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK +1DA9 ; [.1DF9.0020.0014] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +A78E ; [.1DFD.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +0234 ; [.1DFE.0020.0002] # LATIN SMALL LETTER L WITH CURL +A772 ; [.1E02.0020.0002] # LATIN SMALL LETTER LUM +026E ; [.1E03.0020.0002] # LATIN SMALL LETTER LEZH +A781 ; [.1E07.0020.0002] # LATIN SMALL LETTER TURNED L +A780 ; [.1E07.0020.0008] # LATIN CAPITAL LETTER TURNED L +019B ; [.1E08.0020.0002] # LATIN SMALL LETTER LAMBDA WITH STROKE +028E ; [.1E0C.0020.0002] # LATIN SMALL LETTER TURNED Y +006D ; [.1E10.0020.0002] # LATIN SMALL LETTER M +FF4D ; [.1E10.0020.0003] # FULLWIDTH LATIN SMALL LETTER M +036B ; [.1E10.0020.0004] # COMBINING LATIN SMALL LETTER M +217F ; [.1E10.0020.0004] # SMALL ROMAN NUMERAL ONE THOUSAND +24A8 ; [*0318.0020.0004][.1E10.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER M +1D426 ; [.1E10.0020.0005] # MATHEMATICAL BOLD SMALL M +1D45A ; [.1E10.0020.0005] # MATHEMATICAL ITALIC SMALL M +1D48E ; [.1E10.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL M +1D4C2 ; [.1E10.0020.0005] # MATHEMATICAL SCRIPT SMALL M +1D4F6 ; [.1E10.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL M +1D52A ; [.1E10.0020.0005] # MATHEMATICAL FRAKTUR SMALL M +1D55E ; [.1E10.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL M +1D592 ; [.1E10.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL M +1D5C6 ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF SMALL M +1D5FA ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL M +1D62E ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D662 ; [.1E10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D696 ; [.1E10.0020.0005] # MATHEMATICAL MONOSPACE SMALL M +24DC ; [.1E10.0020.0006] # CIRCLED LATIN SMALL LETTER M +004D ; [.1E10.0020.0008] # LATIN CAPITAL LETTER M +FF2D ; [.1E10.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER M +216F ; [.1E10.0020.000A] # ROMAN NUMERAL ONE THOUSAND +1F11C ; [*0318.0020.0004][.1E10.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER M +2133 ; [.1E10.0020.000B] # SCRIPT CAPITAL M +1D40C ; [.1E10.0020.000B] # MATHEMATICAL BOLD CAPITAL M +1D440 ; [.1E10.0020.000B] # MATHEMATICAL ITALIC CAPITAL M +1D474 ; [.1E10.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL M +1D4DC ; [.1E10.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL M +1D510 ; [.1E10.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL M +1D544 ; [.1E10.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D578 ; [.1E10.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D5AC ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL M +1D5E0 ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D614 ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D648 ; [.1E10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D67C ; [.1E10.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL M +24C2 ; [.1E10.0020.000C] # CIRCLED LATIN CAPITAL LETTER M +1F15C ; [.1E10.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER M +1D50 ; [.1E10.0020.0014] # MODIFIER LETTER SMALL M +2098 ; [.1E10.0020.0015] # LATIN SUBSCRIPT SMALL LETTER M +1D39 ; [.1E10.0020.001D] # MODIFIER LETTER CAPITAL M +1F13C ; [.1E10.0020.001D] # SQUARED LATIN CAPITAL LETTER M +1F17C ; [.1E10.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER M +1E3F ; [.1E10.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER M WITH ACUTE +1E3E ; [.1E10.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER M WITH ACUTE +1E41 ; [.1E10.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER M WITH DOT ABOVE +1E40 ; [.1E10.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E43 ; [.1E10.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER M WITH DOT BELOW +1E42 ; [.1E10.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER M WITH DOT BELOW +33A1 ; [.1E10.0020.001C][.1CA5.0020.001C] # SQUARE M SQUARED +33A5 ; [.1E10.0020.001C][.1CA6.0020.001C] # SQUARE M CUBED +3383 ; [.1E10.0020.001C][.1CAD.0020.001D] # SQUARE MA +33D4 ; [.1E10.0020.001C][.1CC6.0020.001C] # SQUARE MB SMALL +3386 ; [.1E10.0020.001D][.1CC6.0020.001D] # SQUARE MB +1F16A ; [.1E10.0020.0014][.1CE0.0020.0014] # RAISED MC SIGN +1F16B ; [.1E10.0020.0014][.1CF5.0020.0014] # RAISED MD SIGN +338E ; [.1E10.0020.001C][.1D5A.0020.001C] # SQUARE MG +3392 ; [.1E10.0020.001D][.1D7E.0020.001D][.1F87.0020.001C] # SQUARE MHZ +33D5 ; [.1E10.0020.001C][.1D98.0020.001C][.1DDD.0020.001C] # SQUARE MIL +3396 ; [.1E10.0020.001C][.1DDD.0020.001C] # SQUARE ML +339C ; [.1E10.0020.001C][.1E10.0020.001C] # SQUARE MM +339F ; [.1E10.0020.001C][.1E10.0020.001C][.1CA5.0020.001C] # SQUARE MM SQUARED +33A3 ; [.1E10.0020.001C][.1E10.0020.001C][.1CA6.0020.001C] # SQUARE MM CUBED +33D6 ; [.1E10.0020.001C][.1E43.0020.001C][.1DDD.0020.001C] # SQUARE MOL +33AB ; [.1E10.0020.001D][.1E72.0020.001D][.1CAD.0020.001C] # SQUARE MPA +33A7 ; [.1E10.0020.001C][*063B.0020.001C][.1ED7.0020.001C] # SQUARE M OVER S +33B3 ; [.1E10.0020.001C][.1ED7.0020.001C] # SQUARE MS +33A8 ; [.1E10.0020.001C][*063B.0020.001C][.1ED7.0020.001C][.1CA5.0020.001C] # SQUARE M OVER S SQUARED +33B7 ; [.1E10.0020.001C][.1F49.0020.001D] # SQUARE MV +33B9 ; [.1E10.0020.001D][.1F49.0020.001D] # SQUARE MV MEGA +1F14B ; [.1E10.0020.001D][.1F49.0020.001D] # SQUARED MV +33BD ; [.1E10.0020.001C][.1F5B.0020.001D] # SQUARE MW +33BF ; [.1E10.0020.001D][.1F5B.0020.001D] # SQUARE MW MEGA +33C1 ; [.1E10.0020.001D][.2047.0020.001D] # SQUARE M OHM +1D0D ; [.1E14.0020.0002] # LATIN LETTER SMALL CAPITAL M +1DDF ; [.1E14.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL M +1D6F ; [.1E15.0020.0002] # LATIN SMALL LETTER M WITH MIDDLE TILDE +1D86 ; [.1E16.0020.0002] # LATIN SMALL LETTER M WITH PALATAL HOOK +0271 ; [.1E17.0020.0002] # LATIN SMALL LETTER M WITH HOOK +2C6E ; [.1E17.0020.0008] # LATIN CAPITAL LETTER M WITH HOOK +1DAC ; [.1E17.0020.0014] # MODIFIER LETTER SMALL M WITH HOOK +AB3A ; [.1E1B.0020.0002] # LATIN SMALL LETTER M WITH CROSSED-TAIL +A7FD ; [.1E1C.0020.0002] # LATIN EPIGRAPHIC LETTER INVERTED M +A7FF ; [.1E1D.0020.0002] # LATIN EPIGRAPHIC LETTER ARCHAIC M +A773 ; [.1E1E.0020.0002] # LATIN SMALL LETTER MUM +006E ; [.1E1F.0020.0002] # LATIN SMALL LETTER N +FF4E ; [.1E1F.0020.0003] # FULLWIDTH LATIN SMALL LETTER N +1DE0 ; [.1E1F.0020.0004] # COMBINING LATIN SMALL LETTER N +24A9 ; [*0318.0020.0004][.1E1F.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER N +1D427 ; [.1E1F.0020.0005] # MATHEMATICAL BOLD SMALL N +1D45B ; [.1E1F.0020.0005] # MATHEMATICAL ITALIC SMALL N +1D48F ; [.1E1F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL N +1D4C3 ; [.1E1F.0020.0005] # MATHEMATICAL SCRIPT SMALL N +1D4F7 ; [.1E1F.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL N +1D52B ; [.1E1F.0020.0005] # MATHEMATICAL FRAKTUR SMALL N +1D55F ; [.1E1F.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL N +1D593 ; [.1E1F.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL N +1D5C7 ; [.1E1F.0020.0005] # MATHEMATICAL SANS-SERIF SMALL N +1D5FB ; [.1E1F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL N +1D62F ; [.1E1F.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D663 ; [.1E1F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D697 ; [.1E1F.0020.0005] # MATHEMATICAL MONOSPACE SMALL N +24DD ; [.1E1F.0020.0006] # CIRCLED LATIN SMALL LETTER N +004E ; [.1E1F.0020.0008] # LATIN CAPITAL LETTER N +FF2E ; [.1E1F.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER N +1F11D ; [*0318.0020.0004][.1E1F.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER N +2115 ; [.1E1F.0020.000B] # DOUBLE-STRUCK CAPITAL N +1D40D ; [.1E1F.0020.000B] # MATHEMATICAL BOLD CAPITAL N +1D441 ; [.1E1F.0020.000B] # MATHEMATICAL ITALIC CAPITAL N +1D475 ; [.1E1F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL N +1D4A9 ; [.1E1F.0020.000B] # MATHEMATICAL SCRIPT CAPITAL N +1D4DD ; [.1E1F.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL N +1D511 ; [.1E1F.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL N +1D579 ; [.1E1F.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D5AD ; [.1E1F.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL N +1D5E1 ; [.1E1F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D615 ; [.1E1F.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D649 ; [.1E1F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D67D ; [.1E1F.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL N +24C3 ; [.1E1F.0020.000C] # CIRCLED LATIN CAPITAL LETTER N +1F15D ; [.1E1F.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER N +207F ; [.1E1F.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER N +2099 ; [.1E1F.0020.0015] # LATIN SUBSCRIPT SMALL LETTER N +1D3A ; [.1E1F.0020.001D] # MODIFIER LETTER CAPITAL N +1F13D ; [.1E1F.0020.001D] # SQUARED LATIN CAPITAL LETTER N +1F17D ; [.1E1F.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER N +0144 ; [.1E1F.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER N WITH ACUTE +0143 ; [.1E1F.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER N WITH ACUTE +01F9 ; [.1E1F.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER N WITH GRAVE +01F8 ; [.1E1F.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER N WITH GRAVE +0148 ; [.1E1F.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER N WITH CARON +0147 ; [.1E1F.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER N WITH CARON +00F1 ; [.1E1F.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER N WITH TILDE +00D1 ; [.1E1F.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER N WITH TILDE +1E45 ; [.1E1F.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER N WITH DOT ABOVE +1E44 ; [.1E1F.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER N WITH DOT ABOVE +0146 ; [.1E1F.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER N WITH CEDILLA +0145 ; [.1E1F.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER N WITH CEDILLA +A7A5 ; [.1E1F.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER N WITH OBLIQUE STROKE +A7A4 ; [.1E1F.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +1E47 ; [.1E1F.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER N WITH DOT BELOW +1E46 ; [.1E1F.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER N WITH DOT BELOW +1E4B ; [.1E1F.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4A ; [.1E1F.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E49 ; [.1E1F.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER N WITH LINE BELOW +1E48 ; [.1E1F.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER N WITH LINE BELOW +3381 ; [.1E1F.0020.001C][.1CAD.0020.001D] # SQUARE NA +1F195 ; [.1E1F.0020.001D][.1D10.0020.001D][.1F5B.0020.001D] # SQUARED NEW +338B ; [.1E1F.0020.001C][.1D4B.0020.001D] # SQUARE NF +1F196 ; [.1E1F.0020.001D][.1D5A.0020.001D] # SQUARED NG +01CC ; [.1E1F.0020.0004][.1DB2.0020.0004] # LATIN SMALL LETTER NJ +01CB ; [.1E1F.0020.000A][.1DB2.0020.0004] # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CA ; [.1E1F.0020.000A][.1DB2.0020.000A] # LATIN CAPITAL LETTER NJ +339A ; [.1E1F.0020.001C][.1E10.0020.001C] # SQUARE NM +2116 ; [.1E1F.0020.000A][.1E43.0020.0004] # NUMERO SIGN +33B1 ; [.1E1F.0020.001C][.1ED7.0020.001C] # SQUARE NS +33B5 ; [.1E1F.0020.001C][.1F49.0020.001D] # SQUARE NV +33BB ; [.1E1F.0020.001C][.1F5B.0020.001D] # SQUARE NW +0274 ; [.1E23.0020.0002] # LATIN LETTER SMALL CAPITAL N +1DE1 ; [.1E23.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL N +1DB0 ; [.1E23.0020.0014] # MODIFIER LETTER SMALL CAPITAL N +1D3B ; [.1E27.0020.0002] # MODIFIER LETTER CAPITAL REVERSED N +1D0E ; [.1E28.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED N +1D70 ; [.1E29.0020.0002] # LATIN SMALL LETTER N WITH MIDDLE TILDE +0272 ; [.1E2A.0020.0002] # LATIN SMALL LETTER N WITH LEFT HOOK +019D ; [.1E2A.0020.0008] # LATIN CAPITAL LETTER N WITH LEFT HOOK +1DAE ; [.1E2A.0020.0014] # MODIFIER LETTER SMALL N WITH LEFT HOOK +019E ; [.1E2E.0020.0002] # LATIN SMALL LETTER N WITH LONG RIGHT LEG +0220 ; [.1E2E.0020.0008] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +A791 ; [.1E32.0020.0002] # LATIN SMALL LETTER N WITH DESCENDER +A790 ; [.1E32.0020.0008] # LATIN CAPITAL LETTER N WITH DESCENDER +1D87 ; [.1E33.0020.0002] # LATIN SMALL LETTER N WITH PALATAL HOOK +0273 ; [.1E34.0020.0002] # LATIN SMALL LETTER N WITH RETROFLEX HOOK +1DAF ; [.1E34.0020.0014] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +0235 ; [.1E38.0020.0002] # LATIN SMALL LETTER N WITH CURL +AB3B ; [.1E3C.0020.0002] # LATIN SMALL LETTER N WITH CROSSED-TAIL +A774 ; [.1E3D.0020.0002] # LATIN SMALL LETTER NUM +014B ; [.1E3E.0020.0002] # LATIN SMALL LETTER ENG +014A ; [.1E3E.0020.0008] # LATIN CAPITAL LETTER ENG +1D51 ; [.1E3E.0020.0014] # MODIFIER LETTER SMALL ENG +AB3C ; [.1E42.0020.0002] # LATIN SMALL LETTER ENG WITH CROSSED-TAIL +006F ; [.1E43.0020.0002] # LATIN SMALL LETTER O +FF4F ; [.1E43.0020.0003] # FULLWIDTH LATIN SMALL LETTER O +0366 ; [.1E43.0020.0004] # COMBINING LATIN SMALL LETTER O +24AA ; [*0318.0020.0004][.1E43.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER O +2134 ; [.1E43.0020.0005] # SCRIPT SMALL O +1D428 ; [.1E43.0020.0005] # MATHEMATICAL BOLD SMALL O +1D45C ; [.1E43.0020.0005] # MATHEMATICAL ITALIC SMALL O +1D490 ; [.1E43.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL O +1D4F8 ; [.1E43.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL O +1D52C ; [.1E43.0020.0005] # MATHEMATICAL FRAKTUR SMALL O +1D560 ; [.1E43.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL O +1D594 ; [.1E43.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL O +1D5C8 ; [.1E43.0020.0005] # MATHEMATICAL SANS-SERIF SMALL O +1D5FC ; [.1E43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL O +1D630 ; [.1E43.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D664 ; [.1E43.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D698 ; [.1E43.0020.0005] # MATHEMATICAL MONOSPACE SMALL O +24DE ; [.1E43.0020.0006] # CIRCLED LATIN SMALL LETTER O +004F ; [.1E43.0020.0008] # LATIN CAPITAL LETTER O +FF2F ; [.1E43.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER O +1F11E ; [*0318.0020.0004][.1E43.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER O +1D40E ; [.1E43.0020.000B] # MATHEMATICAL BOLD CAPITAL O +1D442 ; [.1E43.0020.000B] # MATHEMATICAL ITALIC CAPITAL O +1D476 ; [.1E43.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL O +1D4AA ; [.1E43.0020.000B] # MATHEMATICAL SCRIPT CAPITAL O +1D4DE ; [.1E43.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL O +1D512 ; [.1E43.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL O +1D546 ; [.1E43.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D57A ; [.1E43.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D5AE ; [.1E43.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL O +1D5E2 ; [.1E43.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D616 ; [.1E43.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D64A ; [.1E43.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D67E ; [.1E43.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL O +24C4 ; [.1E43.0020.000C] # CIRCLED LATIN CAPITAL LETTER O +1F15E ; [.1E43.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER O +00BA ; [.1E43.0020.0014] # MASCULINE ORDINAL INDICATOR +1D52 ; [.1E43.0020.0014] # MODIFIER LETTER SMALL O +2092 ; [.1E43.0020.0015] # LATIN SUBSCRIPT SMALL LETTER O +1D3C ; [.1E43.0020.001D] # MODIFIER LETTER CAPITAL O +1F13E ; [.1E43.0020.001D] # SQUARED LATIN CAPITAL LETTER O +1F17E ; [.1E43.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER O +00F3 ; [.1E43.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH ACUTE +00D3 ; [.1E43.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH ACUTE +00F2 ; [.1E43.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH GRAVE +00D2 ; [.1E43.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH GRAVE +014F ; [.1E43.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER O WITH BREVE +014E ; [.1E43.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER O WITH BREVE +00F4 ; [.1E43.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX +00D4 ; [.1E43.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +1ED1 ; [.1E43.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED0 ; [.1E43.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED3 ; [.1E43.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED2 ; [.1E43.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED7 ; [.1E43.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED6 ; [.1E43.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED5 ; [.1E43.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED4 ; [.1E43.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +01D2 ; [.1E43.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER O WITH CARON +01D1 ; [.1E43.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER O WITH CARON +00F6 ; [.1E43.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH DIAERESIS +1DF3 ; [.1E43.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER O WITH DIAERESIS +A79D ; [.1E43.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK OE +00D6 ; [.1E43.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS +A79C ; [.1E43.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK OE +022B ; [.1E43.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022A ; [.1E43.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +0151 ; [.1E43.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0150 ; [.1E43.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +00F5 ; [.1E43.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH TILDE +00D5 ; [.1E43.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH TILDE +1E4D ; [.1E43.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4C ; [.1E43.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4F ; [.1E43.0020.0002][.0000.002D.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E4E ; [.1E43.0020.0008][.0000.002D.0002][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +022D ; [.1E43.0020.0002][.0000.002D.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH TILDE AND MACRON +022C ; [.1E43.0020.0008][.0000.002D.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022F ; [.1E43.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER O WITH DOT ABOVE +022E ; [.1E43.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE +0231 ; [.1E43.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0230 ; [.1E43.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +00F8 ; [.1E43.0020.0002][.0000.002F.0002] # LATIN SMALL LETTER O WITH STROKE +00D8 ; [.1E43.0020.0008][.0000.002F.0002] # LATIN CAPITAL LETTER O WITH STROKE +01FF ; [.1E43.0020.0002][.0000.002F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH STROKE AND ACUTE +01FE ; [.1E43.0020.0008][.0000.002F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01EB ; [.1E43.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER O WITH OGONEK +01EA ; [.1E43.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER O WITH OGONEK +01ED ; [.1E43.0020.0002][.0000.0031.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EC ; [.1E43.0020.0008][.0000.0031.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +014D ; [.1E43.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH MACRON +014C ; [.1E43.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH MACRON +1E53 ; [.1E43.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E52 ; [.1E43.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E51 ; [.1E43.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E50 ; [.1E43.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1DED ; [.1E43.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE +1ECF ; [.1E43.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HOOK ABOVE +1ECE ; [.1E43.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HOOK ABOVE +020D ; [.1E43.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER O WITH DOUBLE GRAVE +020C ; [.1E43.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020F ; [.1E43.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER O WITH INVERTED BREVE +020E ; [.1E43.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER O WITH INVERTED BREVE +01A1 ; [.1E43.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER O WITH HORN +01A0 ; [.1E43.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER O WITH HORN +1EDB ; [.1E43.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDA ; [.1E43.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDD ; [.1E43.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDC ; [.1E43.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EE1 ; [.1E43.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH HORN AND TILDE +1EE0 ; [.1E43.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EDF ; [.1E43.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EDE ; [.1E43.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE3 ; [.1E43.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE2 ; [.1E43.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1ECD ; [.1E43.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH DOT BELOW +1ECC ; [.1E43.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH DOT BELOW +1ED9 ; [.1E43.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED8 ; [.1E43.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +0153 ; [.1E43.0020.0004][.0000.0111.0004][.1D10.0020.0004] # LATIN SMALL LIGATURE OE +0152 ; [.1E43.0020.000A][.0000.0111.0004][.1D10.0020.000A] # LATIN CAPITAL LIGATURE OE +A7F9 ; [.1E43.0020.0014][.0000.0111.0014][.1D10.0020.0014] # MODIFIER LETTER SMALL LIGATURE OE +1F197 ; [.1E43.0020.001D][.1DCB.0020.001D] # SQUARED OK +A74F ; [.1E43.0020.0004][.1E43.0020.0004] # LATIN SMALL LETTER OO +A74E ; [.1E43.0020.000A][.1E43.0020.000A] # LATIN CAPITAL LETTER OO +3375 ; [.1E43.0020.001C][.1F49.0020.001D] # SQUARE OV +1D0F ; [.1E47.0020.0002] # LATIN LETTER SMALL CAPITAL O +1D11 ; [.1E48.0020.0002] # LATIN SMALL LETTER SIDEWAYS O +AB3D ; [.1E49.0020.0002] # LATIN SMALL LETTER BLACKLETTER O +0276 ; [.1E4A.0020.0002] # LATIN LETTER SMALL CAPITAL OE +1D14 ; [.1E4E.0020.0002] # LATIN SMALL LETTER TURNED OE +AB41 ; [.1E4F.0020.0002] # LATIN SMALL LETTER TURNED OE WITH STROKE +AB42 ; [.1E50.0020.0002] # LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE +AB40 ; [.1E51.0020.0002] # LATIN SMALL LETTER INVERTED OE +AB43 ; [.1E52.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O +AB44 ; [.1E53.0020.0002] # LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE +1D13 ; [.1E54.0020.0002] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE +AB3E ; [.1E55.0020.0002] # LATIN SMALL LETTER BLACKLETTER O WITH STROKE +0254 ; [.1E56.0020.0002] # LATIN SMALL LETTER OPEN O +0186 ; [.1E56.0020.0008] # LATIN CAPITAL LETTER OPEN O +1D53 ; [.1E56.0020.0014] # MODIFIER LETTER SMALL OPEN O +1D10 ; [.1E5A.0020.0002] # LATIN LETTER SMALL CAPITAL OPEN O +1D12 ; [.1E5B.0020.0002] # LATIN SMALL LETTER SIDEWAYS OPEN O +AB3F ; [.1E5C.0020.0002] # LATIN SMALL LETTER OPEN O WITH STROKE +1D97 ; [.1E5D.0020.0002] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK +AB62 ; [.1E5E.0020.0002] # LATIN SMALL LETTER OPEN OE +A74D ; [.1E5F.0020.0002] # LATIN SMALL LETTER O WITH LOOP +A74C ; [.1E5F.0020.0008] # LATIN CAPITAL LETTER O WITH LOOP +1D16 ; [.1E60.0020.0002] # LATIN SMALL LETTER TOP HALF O +1D54 ; [.1E60.0020.0014] # MODIFIER LETTER SMALL TOP HALF O +1D17 ; [.1E61.0020.0002] # LATIN SMALL LETTER BOTTOM HALF O +1D55 ; [.1E61.0020.0014] # MODIFIER LETTER SMALL BOTTOM HALF O +2C7A ; [.1E62.0020.0002] # LATIN SMALL LETTER O WITH LOW RING INSIDE +0275 ; [.1E63.0020.0002] # LATIN SMALL LETTER BARRED O +019F ; [.1E63.0020.0008] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +1DB1 ; [.1E63.0020.0014] # MODIFIER LETTER SMALL BARRED O +A74B ; [.1E67.0020.0002] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +A74A ; [.1E67.0020.0008] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +0277 ; [.1E68.0020.0002] # LATIN SMALL LETTER CLOSED OMEGA +A7B7 ; [.1E6C.0020.0002] # LATIN SMALL LETTER OMEGA +A7B6 ; [.1E6C.0020.0008] # LATIN CAPITAL LETTER OMEGA +0223 ; [.1E6D.0020.0002] # LATIN SMALL LETTER OU +0222 ; [.1E6D.0020.0008] # LATIN CAPITAL LETTER OU +1D3D ; [.1E6D.0020.001D] # MODIFIER LETTER CAPITAL OU +1D15 ; [.1E71.0020.0002] # LATIN LETTER SMALL CAPITAL OU +0070 ; [.1E72.0020.0002] # LATIN SMALL LETTER P +FF50 ; [.1E72.0020.0003] # FULLWIDTH LATIN SMALL LETTER P +1DEE ; [.1E72.0020.0004] # COMBINING LATIN SMALL LETTER P +24AB ; [*0318.0020.0004][.1E72.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER P +1D429 ; [.1E72.0020.0005] # MATHEMATICAL BOLD SMALL P +1D45D ; [.1E72.0020.0005] # MATHEMATICAL ITALIC SMALL P +1D491 ; [.1E72.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL P +1D4C5 ; [.1E72.0020.0005] # MATHEMATICAL SCRIPT SMALL P +1D4F9 ; [.1E72.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL P +1D52D ; [.1E72.0020.0005] # MATHEMATICAL FRAKTUR SMALL P +1D561 ; [.1E72.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL P +1D595 ; [.1E72.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL P +1D5C9 ; [.1E72.0020.0005] # MATHEMATICAL SANS-SERIF SMALL P +1D5FD ; [.1E72.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL P +1D631 ; [.1E72.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D665 ; [.1E72.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D699 ; [.1E72.0020.0005] # MATHEMATICAL MONOSPACE SMALL P +24DF ; [.1E72.0020.0006] # CIRCLED LATIN SMALL LETTER P +0050 ; [.1E72.0020.0008] # LATIN CAPITAL LETTER P +FF30 ; [.1E72.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER P +1F11F ; [*0318.0020.0004][.1E72.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER P +2119 ; [.1E72.0020.000B] # DOUBLE-STRUCK CAPITAL P +1D40F ; [.1E72.0020.000B] # MATHEMATICAL BOLD CAPITAL P +1D443 ; [.1E72.0020.000B] # MATHEMATICAL ITALIC CAPITAL P +1D477 ; [.1E72.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL P +1D4AB ; [.1E72.0020.000B] # MATHEMATICAL SCRIPT CAPITAL P +1D4DF ; [.1E72.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL P +1D513 ; [.1E72.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL P +1D57B ; [.1E72.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D5AF ; [.1E72.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL P +1D5E3 ; [.1E72.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D617 ; [.1E72.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D64B ; [.1E72.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D67F ; [.1E72.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL P +24C5 ; [.1E72.0020.000C] # CIRCLED LATIN CAPITAL LETTER P +1F15F ; [.1E72.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P +1D56 ; [.1E72.0020.0014] # MODIFIER LETTER SMALL P +209A ; [.1E72.0020.0015] # LATIN SUBSCRIPT SMALL LETTER P +1D3E ; [.1E72.0020.001D] # MODIFIER LETTER CAPITAL P +1F13F ; [.1E72.0020.001D] # SQUARED LATIN CAPITAL LETTER P +1F17F ; [.1E72.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER P +1F18A ; [.1E72.0020.001D] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P +1E55 ; [.1E72.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER P WITH ACUTE +1E54 ; [.1E72.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER P WITH ACUTE +1E57 ; [.1E72.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER P WITH DOT ABOVE +1E56 ; [.1E72.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER P WITH DOT ABOVE +3380 ; [.1E72.0020.001C][.1CAD.0020.001D] # SQUARE PA AMPS +33A9 ; [.1E72.0020.001D][.1CAD.0020.001C] # SQUARE PA +1F18C ; [.1E72.0020.001D][.1CAD.0020.001D] # NEGATIVE SQUARED PA +3376 ; [.1E72.0020.001C][.1CE0.0020.001C] # SQUARE PC +338A ; [.1E72.0020.001C][.1D4B.0020.001D] # SQUARE PF +33D7 ; [.1E72.0020.001D][.1D7E.0020.001D] # SQUARE PH +33D8 ; [.1E72.0020.001C][*0278.0020.001C][.1E10.0020.001C][*0278.0020.001C] # SQUARE PM +33D9 ; [.1E72.0020.001D][.1E72.0020.001D][.1E10.0020.001D] # SQUARE PPM +1F14E ; [.1E72.0020.001D][.1E72.0020.001D][.1F49.0020.001D] # SQUARED PPV +33DA ; [.1E72.0020.001D][.1E99.0020.001D] # SQUARE PR +33B0 ; [.1E72.0020.001C][.1ED7.0020.001C] # SQUARE PS +3250 ; [.1E72.0020.001D][.1EFB.0020.001D][.1D10.0020.001D] # PARTNERSHIP SIGN +33B4 ; [.1E72.0020.001C][.1F49.0020.001D] # SQUARE PV +33BA ; [.1E72.0020.001C][.1F5B.0020.001D] # SQUARE PW +1D18 ; [.1E76.0020.0002] # LATIN LETTER SMALL CAPITAL P +1D7D ; [.1E77.0020.0002] # LATIN SMALL LETTER P WITH STROKE +2C63 ; [.1E77.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE +A751 ; [.1E78.0020.0002] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +A750 ; [.1E78.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +1D71 ; [.1E79.0020.0002] # LATIN SMALL LETTER P WITH MIDDLE TILDE +1D88 ; [.1E7A.0020.0002] # LATIN SMALL LETTER P WITH PALATAL HOOK +01A5 ; [.1E7B.0020.0002] # LATIN SMALL LETTER P WITH HOOK +01A4 ; [.1E7B.0020.0008] # LATIN CAPITAL LETTER P WITH HOOK +A753 ; [.1E7F.0020.0002] # LATIN SMALL LETTER P WITH FLOURISH +A752 ; [.1E7F.0020.0008] # LATIN CAPITAL LETTER P WITH FLOURISH +A755 ; [.1E80.0020.0002] # LATIN SMALL LETTER P WITH SQUIRREL TAIL +A754 ; [.1E80.0020.0008] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A7FC ; [.1E81.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED P +0278 ; [.1E82.0020.0002] # LATIN SMALL LETTER PHI +1DB2 ; [.1E82.0020.0014] # MODIFIER LETTER SMALL PHI +2C77 ; [.1E86.0020.0002] # LATIN SMALL LETTER TAILLESS PHI +0071 ; [.1E87.0020.0002] # LATIN SMALL LETTER Q +FF51 ; [.1E87.0020.0003] # FULLWIDTH LATIN SMALL LETTER Q +24AC ; [*0318.0020.0004][.1E87.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Q +1D42A ; [.1E87.0020.0005] # MATHEMATICAL BOLD SMALL Q +1D45E ; [.1E87.0020.0005] # MATHEMATICAL ITALIC SMALL Q +1D492 ; [.1E87.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Q +1D4C6 ; [.1E87.0020.0005] # MATHEMATICAL SCRIPT SMALL Q +1D4FA ; [.1E87.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Q +1D52E ; [.1E87.0020.0005] # MATHEMATICAL FRAKTUR SMALL Q +1D562 ; [.1E87.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D596 ; [.1E87.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Q +1D5CA ; [.1E87.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Q +1D5FE ; [.1E87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D632 ; [.1E87.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D666 ; [.1E87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D69A ; [.1E87.0020.0005] # MATHEMATICAL MONOSPACE SMALL Q +24E0 ; [.1E87.0020.0006] # CIRCLED LATIN SMALL LETTER Q +0051 ; [.1E87.0020.0008] # LATIN CAPITAL LETTER Q +FF31 ; [.1E87.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Q +1F120 ; [*0318.0020.0004][.1E87.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Q +211A ; [.1E87.0020.000B] # DOUBLE-STRUCK CAPITAL Q +1D410 ; [.1E87.0020.000B] # MATHEMATICAL BOLD CAPITAL Q +1D444 ; [.1E87.0020.000B] # MATHEMATICAL ITALIC CAPITAL Q +1D478 ; [.1E87.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Q +1D4AC ; [.1E87.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Q +1D4E0 ; [.1E87.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D514 ; [.1E87.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Q +1D57C ; [.1E87.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D5B0 ; [.1E87.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Q +1D5E4 ; [.1E87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D618 ; [.1E87.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D64C ; [.1E87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D680 ; [.1E87.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Q +24C6 ; [.1E87.0020.000C] # CIRCLED LATIN CAPITAL LETTER Q +1F160 ; [.1E87.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Q +1F140 ; [.1E87.0020.001D] # SQUARED LATIN CAPITAL LETTER Q +1F180 ; [.1E87.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Q +0239 ; [.1E87.0020.0004][.1E72.0020.0004] # LATIN SMALL LETTER QP DIGRAPH +A757 ; [.1E8B.0020.0002] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +A756 ; [.1E8B.0020.0008] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A759 ; [.1E8C.0020.0002] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE +A758 ; [.1E8C.0020.0008] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +02A0 ; [.1E8D.0020.0002] # LATIN SMALL LETTER Q WITH HOOK +024B ; [.1E91.0020.0002] # LATIN SMALL LETTER Q WITH HOOK TAIL +024A ; [.1E91.0020.0008] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +0138 ; [.1E95.0020.0002] # LATIN SMALL LETTER KRA +0072 ; [.1E99.0020.0002] # LATIN SMALL LETTER R +FF52 ; [.1E99.0020.0003] # FULLWIDTH LATIN SMALL LETTER R +036C ; [.1E99.0020.0004] # COMBINING LATIN SMALL LETTER R +1DCA ; [.1E99.0020.0004] # COMBINING LATIN SMALL LETTER R BELOW +24AD ; [*0318.0020.0004][.1E99.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER R +1D42B ; [.1E99.0020.0005] # MATHEMATICAL BOLD SMALL R +1D45F ; [.1E99.0020.0005] # MATHEMATICAL ITALIC SMALL R +1D493 ; [.1E99.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL R +1D4C7 ; [.1E99.0020.0005] # MATHEMATICAL SCRIPT SMALL R +1D4FB ; [.1E99.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL R +1D52F ; [.1E99.0020.0005] # MATHEMATICAL FRAKTUR SMALL R +1D563 ; [.1E99.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL R +1D597 ; [.1E99.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL R +1D5CB ; [.1E99.0020.0005] # MATHEMATICAL SANS-SERIF SMALL R +1D5FF ; [.1E99.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL R +1D633 ; [.1E99.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D667 ; [.1E99.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D69B ; [.1E99.0020.0005] # MATHEMATICAL MONOSPACE SMALL R +24E1 ; [.1E99.0020.0006] # CIRCLED LATIN SMALL LETTER R +0052 ; [.1E99.0020.0008] # LATIN CAPITAL LETTER R +FF32 ; [.1E99.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER R +1F121 ; [*0318.0020.0004][.1E99.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER R +211B ; [.1E99.0020.000B] # SCRIPT CAPITAL R +211C ; [.1E99.0020.000B] # BLACK-LETTER CAPITAL R +211D ; [.1E99.0020.000B] # DOUBLE-STRUCK CAPITAL R +1D411 ; [.1E99.0020.000B] # MATHEMATICAL BOLD CAPITAL R +1D445 ; [.1E99.0020.000B] # MATHEMATICAL ITALIC CAPITAL R +1D479 ; [.1E99.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL R +1D4E1 ; [.1E99.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL R +1D57D ; [.1E99.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D5B1 ; [.1E99.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL R +1D5E5 ; [.1E99.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D619 ; [.1E99.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D64D ; [.1E99.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D681 ; [.1E99.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL R +24C7 ; [.1E99.0020.000C] # CIRCLED LATIN CAPITAL LETTER R +1F12C ; [.1E99.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER R +1F161 ; [.1E99.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER R +02B3 ; [.1E99.0020.0014] # MODIFIER LETTER SMALL R +1D63 ; [.1E99.0020.0015] # LATIN SUBSCRIPT SMALL LETTER R +1D3F ; [.1E99.0020.001D] # MODIFIER LETTER CAPITAL R +1F141 ; [.1E99.0020.001D] # SQUARED LATIN CAPITAL LETTER R +1F181 ; [.1E99.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER R +0155 ; [.1E99.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER R WITH ACUTE +0154 ; [.1E99.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER R WITH ACUTE +0159 ; [.1E99.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER R WITH CARON +0158 ; [.1E99.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER R WITH CARON +1E59 ; [.1E99.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER R WITH DOT ABOVE +1E58 ; [.1E99.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER R WITH DOT ABOVE +0157 ; [.1E99.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER R WITH CEDILLA +0156 ; [.1E99.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER R WITH CEDILLA +A7A7 ; [.1E99.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER R WITH OBLIQUE STROKE +A7A6 ; [.1E99.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +0211 ; [.1E99.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER R WITH DOUBLE GRAVE +0210 ; [.1E99.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0213 ; [.1E99.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER R WITH INVERTED BREVE +0212 ; [.1E99.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER R WITH INVERTED BREVE +1E5B ; [.1E99.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER R WITH DOT BELOW +1E5A ; [.1E99.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5D ; [.1E99.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5C ; [.1E99.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5F ; [.1E99.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER R WITH LINE BELOW +1E5E ; [.1E99.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER R WITH LINE BELOW +A783 ; [.1E99.0020.0004][.0000.0112.0004] # LATIN SMALL LETTER INSULAR R +A782 ; [.1E99.0020.000A][.0000.0112.0004] # LATIN CAPITAL LETTER INSULAR R +33AD ; [.1E99.0020.001C][.1CAD.0020.001C][.1CF5.0020.001C] # SQUARE RAD +33AE ; [.1E99.0020.001C][.1CAD.0020.001C][.1CF5.0020.001C][*063B.0020.001C][.1ED7.0020.001C] # SQUARE RAD OVER S +33AF ; [.1E99.0020.001C][.1CAD.0020.001C][.1CF5.0020.001C][*063B.0020.001C][.1ED7.0020.001C][.1CA5.0020.001C] # SQUARE RAD OVER S SQUARED +20A8 ; [.1E99.0020.000A][.1ED7.0020.0004] # RUPEE SIGN +AB45 ; [.1E9D.0020.0002] # LATIN SMALL LETTER STIRRUP R +0280 ; [.1E9E.0020.0002] # LATIN LETTER SMALL CAPITAL R +1DE2 ; [.1E9E.0020.0004] # COMBINING LATIN LETTER SMALL CAPITAL R +01A6 ; [.1E9E.0020.0008] # LATIN LETTER YR +AB46 ; [.1EA2.0020.0002] # LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG +A75B ; [.1EA3.0020.0002] # LATIN SMALL LETTER R ROTUNDA +1DE3 ; [.1EA3.0020.0004] # COMBINING LATIN SMALL LETTER R ROTUNDA +A75A ; [.1EA3.0020.0008] # LATIN CAPITAL LETTER R ROTUNDA +1D19 ; [.1EA4.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED R +024D ; [.1EA5.0020.0002] # LATIN SMALL LETTER R WITH STROKE +024C ; [.1EA5.0020.0008] # LATIN CAPITAL LETTER R WITH STROKE +1D72 ; [.1EA9.0020.0002] # LATIN SMALL LETTER R WITH MIDDLE TILDE +0279 ; [.1EAA.0020.0002] # LATIN SMALL LETTER TURNED R +02B4 ; [.1EAA.0020.0014] # MODIFIER LETTER SMALL TURNED R +1D1A ; [.1EAE.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED R +027A ; [.1EAF.0020.0002] # LATIN SMALL LETTER TURNED R WITH LONG LEG +1D89 ; [.1EB3.0020.0002] # LATIN SMALL LETTER R WITH PALATAL HOOK +027B ; [.1EB4.0020.0002] # LATIN SMALL LETTER TURNED R WITH HOOK +02B5 ; [.1EB4.0020.0014] # MODIFIER LETTER SMALL TURNED R WITH HOOK +2C79 ; [.1EB8.0020.0002] # LATIN SMALL LETTER TURNED R WITH TAIL +027C ; [.1EB9.0020.0002] # LATIN SMALL LETTER R WITH LONG LEG +027D ; [.1EBD.0020.0002] # LATIN SMALL LETTER R WITH TAIL +2C64 ; [.1EBD.0020.0008] # LATIN CAPITAL LETTER R WITH TAIL +AB49 ; [.1EC1.0020.0002] # LATIN SMALL LETTER R WITH CROSSED-TAIL +027E ; [.1EC2.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK +1D73 ; [.1EC6.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE +027F ; [.1EC7.0020.0002] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK +AB47 ; [.1ECB.0020.0002] # LATIN SMALL LETTER R WITHOUT HANDLE +AB48 ; [.1ECC.0020.0002] # LATIN SMALL LETTER DOUBLE R +AB4A ; [.1ECD.0020.0002] # LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL +AB4B ; [.1ECE.0020.0002] # LATIN SMALL LETTER SCRIPT R +AB4C ; [.1ECF.0020.0002] # LATIN SMALL LETTER SCRIPT R WITH RING +0281 ; [.1ED0.0020.0002] # LATIN LETTER SMALL CAPITAL INVERTED R +02B6 ; [.1ED0.0020.0014] # MODIFIER LETTER SMALL CAPITAL INVERTED R +A775 ; [.1ED4.0020.0002] # LATIN SMALL LETTER RUM +A776 ; [.1ED5.0020.0002] # LATIN LETTER SMALL CAPITAL RUM +A75D ; [.1ED6.0020.0002] # LATIN SMALL LETTER RUM ROTUNDA +A75C ; [.1ED6.0020.0008] # LATIN CAPITAL LETTER RUM ROTUNDA +0073 ; [.1ED7.0020.0002] # LATIN SMALL LETTER S +FF53 ; [.1ED7.0020.0003] # FULLWIDTH LATIN SMALL LETTER S +1DE4 ; [.1ED7.0020.0004] # COMBINING LATIN SMALL LETTER S +24AE ; [*0318.0020.0004][.1ED7.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER S +1D42C ; [.1ED7.0020.0005] # MATHEMATICAL BOLD SMALL S +1D460 ; [.1ED7.0020.0005] # MATHEMATICAL ITALIC SMALL S +1D494 ; [.1ED7.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL S +1D4C8 ; [.1ED7.0020.0005] # MATHEMATICAL SCRIPT SMALL S +1D4FC ; [.1ED7.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL S +1D530 ; [.1ED7.0020.0005] # MATHEMATICAL FRAKTUR SMALL S +1D564 ; [.1ED7.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL S +1D598 ; [.1ED7.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL S +1D5CC ; [.1ED7.0020.0005] # MATHEMATICAL SANS-SERIF SMALL S +1D600 ; [.1ED7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL S +1D634 ; [.1ED7.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D668 ; [.1ED7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D69C ; [.1ED7.0020.0005] # MATHEMATICAL MONOSPACE SMALL S +24E2 ; [.1ED7.0020.0006] # CIRCLED LATIN SMALL LETTER S +0053 ; [.1ED7.0020.0008] # LATIN CAPITAL LETTER S +FF33 ; [.1ED7.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER S +1F122 ; [*0318.0020.0004][.1ED7.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER S +1F12A ; [*037A.0020.0004][.1ED7.0020.000A][*037B.0020.0004] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S +1D412 ; [.1ED7.0020.000B] # MATHEMATICAL BOLD CAPITAL S +1D446 ; [.1ED7.0020.000B] # MATHEMATICAL ITALIC CAPITAL S +1D47A ; [.1ED7.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL S +1D4AE ; [.1ED7.0020.000B] # MATHEMATICAL SCRIPT CAPITAL S +1D4E2 ; [.1ED7.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL S +1D516 ; [.1ED7.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL S +1D54A ; [.1ED7.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D57E ; [.1ED7.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D5B2 ; [.1ED7.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL S +1D5E6 ; [.1ED7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D61A ; [.1ED7.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D64E ; [.1ED7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D682 ; [.1ED7.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL S +24C8 ; [.1ED7.0020.000C] # CIRCLED LATIN CAPITAL LETTER S +1F162 ; [.1ED7.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER S +02E2 ; [.1ED7.0020.0014] # MODIFIER LETTER SMALL S +209B ; [.1ED7.0020.0015] # LATIN SUBSCRIPT SMALL LETTER S +1F142 ; [.1ED7.0020.001D] # SQUARED LATIN CAPITAL LETTER S +1F182 ; [.1ED7.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER S +015B ; [.1ED7.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER S WITH ACUTE +015A ; [.1ED7.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER S WITH ACUTE +1E65 ; [.1ED7.0020.0002][.0000.0024.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E64 ; [.1ED7.0020.0008][.0000.0024.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +015D ; [.1ED7.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER S WITH CIRCUMFLEX +015C ; [.1ED7.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0161 ; [.1ED7.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER S WITH CARON +0160 ; [.1ED7.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER S WITH CARON +1E67 ; [.1ED7.0020.0002][.0000.0028.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E66 ; [.1ED7.0020.0008][.0000.0028.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E61 ; [.1ED7.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT ABOVE +1E60 ; [.1ED7.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT ABOVE +015F ; [.1ED7.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER S WITH CEDILLA +015E ; [.1ED7.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER S WITH CEDILLA +A7A9 ; [.1ED7.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER S WITH OBLIQUE STROKE +A7A8 ; [.1ED7.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +1E63 ; [.1ED7.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER S WITH DOT BELOW +1E62 ; [.1ED7.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW +1E69 ; [.1ED7.0020.0002][.0000.0042.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E68 ; [.1ED7.0020.0008][.0000.0042.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +0219 ; [.1ED7.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER S WITH COMMA BELOW +0218 ; [.1ED7.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER S WITH COMMA BELOW +017F ; [.1ED7.0020.0004][.0000.0112.0004] # LATIN SMALL LETTER LONG S +1DE5 ; [.1ED7.0020.0004][.0000.0112.0004] # COMBINING LATIN SMALL LETTER LONG S +A785 ; [.1ED7.0020.0004][.0000.0112.0004] # LATIN SMALL LETTER INSULAR S +A784 ; [.1ED7.0020.000A][.0000.0112.0004] # LATIN CAPITAL LETTER INSULAR S +1E9B ; [.1ED7.0020.0004][.0000.0112.0004][.0000.002E.0002] # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1F18D ; [.1ED7.0020.001D][.1CAD.0020.001D] # NEGATIVE SQUARED SA +1F14C ; [.1ED7.0020.001D][.1CF5.0020.001D] # SQUARED SD +1F1AA ; [.1ED7.0020.001D][.1D7E.0020.001D][.1F49.0020.001D] # SQUARED SHV +2120 ; [.1ED7.0020.0014][.1E10.0020.0014] # SERVICE MARK +1F198 ; [.1ED7.0020.001D][.1E43.0020.001D][.1ED7.0020.001D] # SQUARED SOS +33DB ; [.1ED7.0020.001C][.1E99.0020.001C] # SQUARE SR +1F14D ; [.1ED7.0020.001D][.1ED7.0020.001D] # SQUARED SS +00DF ; [.1ED7.0020.0004][.0000.0111.0004][.1ED7.0020.0004] # LATIN SMALL LETTER SHARP S +1E9E ; [.1ED7.0020.000A][.0000.0111.0004][.1ED7.0020.000A] # LATIN CAPITAL LETTER SHARP S +FB06 ; [.1ED7.0020.0004][.1EFB.0020.0004] # LATIN SMALL LIGATURE ST +FB05 ; [.1ED7.0020.0004][.0000.0112.0004][.1EFB.0020.0004] # LATIN SMALL LIGATURE LONG S T +33DC ; [.1ED7.0020.001D][.1F49.0020.001C] # SQUARE SV +A731 ; [.1EDB.0020.0002] # LATIN LETTER SMALL CAPITAL S +1D74 ; [.1EDC.0020.0002] # LATIN SMALL LETTER S WITH MIDDLE TILDE +1D8A ; [.1EDD.0020.0002] # LATIN SMALL LETTER S WITH PALATAL HOOK +0282 ; [.1EDE.0020.0002] # LATIN SMALL LETTER S WITH HOOK +1DB3 ; [.1EDE.0020.0014] # MODIFIER LETTER SMALL S WITH HOOK +023F ; [.1EE2.0020.0002] # LATIN SMALL LETTER S WITH SWASH TAIL +2C7E ; [.1EE2.0020.0008] # LATIN CAPITAL LETTER S WITH SWASH TAIL +1E9C ; [.1EE6.0020.0002] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE +1E9D ; [.1EE7.0020.0002] # LATIN SMALL LETTER LONG S WITH HIGH STROKE +0283 ; [.1EE8.0020.0002] # LATIN SMALL LETTER ESH +1DEF ; [.1EE8.0020.0004] # COMBINING LATIN SMALL LETTER ESH +01A9 ; [.1EE8.0020.0008] # LATIN CAPITAL LETTER ESH +1DB4 ; [.1EE8.0020.0014] # MODIFIER LETTER SMALL ESH +AB4D ; [.1EEC.0020.0002] # LATIN SMALL LETTER BASELINE ESH +1D8B ; [.1EED.0020.0002] # LATIN SMALL LETTER ESH WITH PALATAL HOOK +01AA ; [.1EEE.0020.0002] # LATIN LETTER REVERSED ESH LOOP +0285 ; [.1EF2.0020.0002] # LATIN SMALL LETTER SQUAT REVERSED ESH +1D98 ; [.1EF6.0020.0002] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK +0286 ; [.1EF7.0020.0002] # LATIN SMALL LETTER ESH WITH CURL +0074 ; [.1EFB.0020.0002] # LATIN SMALL LETTER T +FF54 ; [.1EFB.0020.0003] # FULLWIDTH LATIN SMALL LETTER T +036D ; [.1EFB.0020.0004] # COMBINING LATIN SMALL LETTER T +24AF ; [*0318.0020.0004][.1EFB.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER T +1D42D ; [.1EFB.0020.0005] # MATHEMATICAL BOLD SMALL T +1D461 ; [.1EFB.0020.0005] # MATHEMATICAL ITALIC SMALL T +1D495 ; [.1EFB.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL T +1D4C9 ; [.1EFB.0020.0005] # MATHEMATICAL SCRIPT SMALL T +1D4FD ; [.1EFB.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL T +1D531 ; [.1EFB.0020.0005] # MATHEMATICAL FRAKTUR SMALL T +1D565 ; [.1EFB.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL T +1D599 ; [.1EFB.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL T +1D5CD ; [.1EFB.0020.0005] # MATHEMATICAL SANS-SERIF SMALL T +1D601 ; [.1EFB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL T +1D635 ; [.1EFB.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D669 ; [.1EFB.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D69D ; [.1EFB.0020.0005] # MATHEMATICAL MONOSPACE SMALL T +24E3 ; [.1EFB.0020.0006] # CIRCLED LATIN SMALL LETTER T +0054 ; [.1EFB.0020.0008] # LATIN CAPITAL LETTER T +FF34 ; [.1EFB.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER T +1F123 ; [*0318.0020.0004][.1EFB.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER T +1D413 ; [.1EFB.0020.000B] # MATHEMATICAL BOLD CAPITAL T +1D447 ; [.1EFB.0020.000B] # MATHEMATICAL ITALIC CAPITAL T +1D47B ; [.1EFB.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL T +1D4AF ; [.1EFB.0020.000B] # MATHEMATICAL SCRIPT CAPITAL T +1D4E3 ; [.1EFB.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL T +1D517 ; [.1EFB.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL T +1D54B ; [.1EFB.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D57F ; [.1EFB.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D5B3 ; [.1EFB.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL T +1D5E7 ; [.1EFB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D61B ; [.1EFB.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D64F ; [.1EFB.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D683 ; [.1EFB.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL T +24C9 ; [.1EFB.0020.000C] # CIRCLED LATIN CAPITAL LETTER T +1F163 ; [.1EFB.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER T +1D57 ; [.1EFB.0020.0014] # MODIFIER LETTER SMALL T +209C ; [.1EFB.0020.0015] # LATIN SUBSCRIPT SMALL LETTER T +1D40 ; [.1EFB.0020.001D] # MODIFIER LETTER CAPITAL T +1F143 ; [.1EFB.0020.001D] # SQUARED LATIN CAPITAL LETTER T +1F183 ; [.1EFB.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER T +0165 ; [.1EFB.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER T WITH CARON +0164 ; [.1EFB.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER T WITH CARON +1E97 ; [.1EFB.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER T WITH DIAERESIS +1E6B ; [.1EFB.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER T WITH DOT ABOVE +1E6A ; [.1EFB.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER T WITH DOT ABOVE +0163 ; [.1EFB.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER T WITH CEDILLA +0162 ; [.1EFB.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER T WITH CEDILLA +1E6D ; [.1EFB.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER T WITH DOT BELOW +1E6C ; [.1EFB.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER T WITH DOT BELOW +021B ; [.1EFB.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER T WITH COMMA BELOW +021A ; [.1EFB.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER T WITH COMMA BELOW +1E71 ; [.1EFB.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E70 ; [.1EFB.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E6F ; [.1EFB.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER T WITH LINE BELOW +1E6E ; [.1EFB.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER T WITH LINE BELOW +A787 ; [.1EFB.0020.0004][.0000.0112.0004] # LATIN SMALL LETTER INSULAR T +A786 ; [.1EFB.0020.000A][.0000.0112.0004] # LATIN CAPITAL LETTER INSULAR T +02A8 ; [.1EFB.0020.0004][.1CEF.0020.0004] # LATIN SMALL LETTER TC DIGRAPH WITH CURL +2121 ; [.1EFB.0020.000A][.1D10.0020.000A][.1DDD.0020.000A] # TELEPHONE SIGN +1D7A ; [.1EFB.0020.0004][.0000.0111.0004][.1D7E.0020.0004] # LATIN SMALL LETTER TH WITH STRIKETHROUGH +3394 ; [.1EFB.0020.001D][.1D7E.0020.001D][.1F87.0020.001C] # SQUARE THZ +2122 ; [.1EFB.0020.0014][.1E10.0020.0014] # TRADE MARK SIGN +01BE ; [.1EFB.0020.0004][.1ED7.0020.0004] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE +02A6 ; [.1EFB.0020.0004][.1ED7.0020.0004] # LATIN SMALL LETTER TS DIGRAPH +02A7 ; [.1EFB.0020.0004][.1EE8.0020.0004] # LATIN SMALL LETTER TESH DIGRAPH +A729 ; [.1EFB.0020.0004][.1F87.0020.0004] # LATIN SMALL LETTER TZ +A728 ; [.1EFB.0020.000A][.1F87.0020.0004] # LATIN CAPITAL LETTER TZ +1D1B ; [.1EFF.0020.0002] # LATIN LETTER SMALL CAPITAL T +0167 ; [.1F00.0020.0002] # LATIN SMALL LETTER T WITH STROKE +0166 ; [.1F00.0020.0008] # LATIN CAPITAL LETTER T WITH STROKE +2C66 ; [.1F04.0020.0002] # LATIN SMALL LETTER T WITH DIAGONAL STROKE +023E ; [.1F04.0020.0008] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +1D75 ; [.1F05.0020.0002] # LATIN SMALL LETTER T WITH MIDDLE TILDE +01AB ; [.1F06.0020.0002] # LATIN SMALL LETTER T WITH PALATAL HOOK +1DB5 ; [.1F06.0020.0014] # MODIFIER LETTER SMALL T WITH PALATAL HOOK +01AD ; [.1F0A.0020.0002] # LATIN SMALL LETTER T WITH HOOK +01AC ; [.1F0A.0020.0008] # LATIN CAPITAL LETTER T WITH HOOK +0288 ; [.1F0E.0020.0002] # LATIN SMALL LETTER T WITH RETROFLEX HOOK +01AE ; [.1F0E.0020.0008] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +0236 ; [.1F12.0020.0002] # LATIN SMALL LETTER T WITH CURL +A777 ; [.1F16.0020.0002] # LATIN SMALL LETTER TUM +0287 ; [.1F17.0020.0002] # LATIN SMALL LETTER TURNED T +A7B1 ; [.1F17.0020.0008] # LATIN CAPITAL LETTER TURNED T +0075 ; [.1F1B.0020.0002] # LATIN SMALL LETTER U +FF55 ; [.1F1B.0020.0003] # FULLWIDTH LATIN SMALL LETTER U +0367 ; [.1F1B.0020.0004] # COMBINING LATIN SMALL LETTER U +24B0 ; [*0318.0020.0004][.1F1B.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER U +1D42E ; [.1F1B.0020.0005] # MATHEMATICAL BOLD SMALL U +1D462 ; [.1F1B.0020.0005] # MATHEMATICAL ITALIC SMALL U +1D496 ; [.1F1B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL U +1D4CA ; [.1F1B.0020.0005] # MATHEMATICAL SCRIPT SMALL U +1D4FE ; [.1F1B.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL U +1D532 ; [.1F1B.0020.0005] # MATHEMATICAL FRAKTUR SMALL U +1D566 ; [.1F1B.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL U +1D59A ; [.1F1B.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL U +1D5CE ; [.1F1B.0020.0005] # MATHEMATICAL SANS-SERIF SMALL U +1D602 ; [.1F1B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL U +1D636 ; [.1F1B.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D66A ; [.1F1B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D69E ; [.1F1B.0020.0005] # MATHEMATICAL MONOSPACE SMALL U +24E4 ; [.1F1B.0020.0006] # CIRCLED LATIN SMALL LETTER U +0055 ; [.1F1B.0020.0008] # LATIN CAPITAL LETTER U +FF35 ; [.1F1B.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER U +1F124 ; [*0318.0020.0004][.1F1B.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER U +1D414 ; [.1F1B.0020.000B] # MATHEMATICAL BOLD CAPITAL U +1D448 ; [.1F1B.0020.000B] # MATHEMATICAL ITALIC CAPITAL U +1D47C ; [.1F1B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL U +1D4B0 ; [.1F1B.0020.000B] # MATHEMATICAL SCRIPT CAPITAL U +1D4E4 ; [.1F1B.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL U +1D518 ; [.1F1B.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL U +1D54C ; [.1F1B.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D580 ; [.1F1B.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D5B4 ; [.1F1B.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL U +1D5E8 ; [.1F1B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D61C ; [.1F1B.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D650 ; [.1F1B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D684 ; [.1F1B.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL U +24CA ; [.1F1B.0020.000C] # CIRCLED LATIN CAPITAL LETTER U +1F164 ; [.1F1B.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER U +1D58 ; [.1F1B.0020.0014] # MODIFIER LETTER SMALL U +1D64 ; [.1F1B.0020.0015] # LATIN SUBSCRIPT SMALL LETTER U +1D41 ; [.1F1B.0020.001D] # MODIFIER LETTER CAPITAL U +1F144 ; [.1F1B.0020.001D] # SQUARED LATIN CAPITAL LETTER U +1F184 ; [.1F1B.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER U +00FA ; [.1F1B.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH ACUTE +00DA ; [.1F1B.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH ACUTE +00F9 ; [.1F1B.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH GRAVE +00D9 ; [.1F1B.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH GRAVE +016D ; [.1F1B.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER U WITH BREVE +016C ; [.1F1B.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER U WITH BREVE +00FB ; [.1F1B.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX +00DB ; [.1F1B.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +01D4 ; [.1F1B.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH CARON +01D3 ; [.1F1B.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH CARON +016F ; [.1F1B.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER U WITH RING ABOVE +016E ; [.1F1B.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER U WITH RING ABOVE +00FC ; [.1F1B.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH DIAERESIS +1DF4 ; [.1F1B.0020.0004][.0000.002B.0004] # COMBINING LATIN SMALL LETTER U WITH DIAERESIS +A79F ; [.1F1B.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK UE +00DC ; [.1F1B.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS +A79E ; [.1F1B.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK UE +01D8 ; [.1F1B.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D7 ; [.1F1B.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01DC ; [.1F1B.0020.0002][.0000.002B.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DB ; [.1F1B.0020.0008][.0000.002B.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DA ; [.1F1B.0020.0002][.0000.002B.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01D9 ; [.1F1B.0020.0008][.0000.002B.0002][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01D6 ; [.1F1B.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D5 ; [.1F1B.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +0171 ; [.1F1B.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0170 ; [.1F1B.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0169 ; [.1F1B.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH TILDE +0168 ; [.1F1B.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH TILDE +1E79 ; [.1F1B.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E78 ; [.1F1B.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +0173 ; [.1F1B.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER U WITH OGONEK +0172 ; [.1F1B.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER U WITH OGONEK +016B ; [.1F1B.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH MACRON +016A ; [.1F1B.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH MACRON +1E7B ; [.1F1B.0020.0002][.0000.0032.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7A ; [.1F1B.0020.0008][.0000.0032.0002][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1DF0 ; [.1F1B.0020.0004][.0000.0034.0004] # COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE +1EE7 ; [.1F1B.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HOOK ABOVE +1EE6 ; [.1F1B.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HOOK ABOVE +0215 ; [.1F1B.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER U WITH DOUBLE GRAVE +0214 ; [.1F1B.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0217 ; [.1F1B.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER U WITH INVERTED BREVE +0216 ; [.1F1B.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER U WITH INVERTED BREVE +01B0 ; [.1F1B.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER U WITH HORN +01AF ; [.1F1B.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER U WITH HORN +1EE9 ; [.1F1B.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH HORN AND ACUTE +1EE8 ; [.1F1B.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEB ; [.1F1B.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEA ; [.1F1B.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEF ; [.1F1B.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH HORN AND TILDE +1EEE ; [.1F1B.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EED ; [.1F1B.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEC ; [.1F1B.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EF1 ; [.1F1B.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF0 ; [.1F1B.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EE5 ; [.1F1B.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH DOT BELOW +1EE4 ; [.1F1B.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH DOT BELOW +1E73 ; [.1F1B.0020.0002][.0000.0043.0002] # LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E72 ; [.1F1B.0020.0008][.0000.0043.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E77 ; [.1F1B.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E76 ; [.1F1B.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E75 ; [.1F1B.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER U WITH TILDE BELOW +1E74 ; [.1F1B.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER U WITH TILDE BELOW +1F1AB ; [.1F1B.0020.001D][.1D7E.0020.001D][.1CF5.0020.001D] # SQUARED UHD +1F199 ; [.1F1B.0020.001D][.1E72.0020.001D][*0261.0020.001C] # SQUARED UP WITH EXCLAMATION MARK +1D1C ; [.1F1F.0020.0002] # LATIN LETTER SMALL CAPITAL U +1DB8 ; [.1F1F.0020.0014] # MODIFIER LETTER SMALL CAPITAL U +AB4E ; [.1F20.0020.0002] # LATIN SMALL LETTER U WITH SHORT RIGHT LEG +1D1D ; [.1F21.0020.0002] # LATIN SMALL LETTER SIDEWAYS U +1D59 ; [.1F21.0020.0014] # MODIFIER LETTER SMALL SIDEWAYS U +1D1E ; [.1F22.0020.0002] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U +1D6B ; [.1F23.0020.0002] # LATIN SMALL LETTER UE +AB50 ; [.1F24.0020.0002] # LATIN SMALL LETTER UI +AB51 ; [.1F25.0020.0002] # LATIN SMALL LETTER TURNED UI +0289 ; [.1F26.0020.0002] # LATIN SMALL LETTER U BAR +0244 ; [.1F26.0020.0008] # LATIN CAPITAL LETTER U BAR +1DB6 ; [.1F26.0020.0014] # MODIFIER LETTER SMALL U BAR +AB4F ; [.1F2A.0020.0002] # LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG +1D7E ; [.1F2B.0020.0002] # LATIN SMALL CAPITAL LETTER U WITH STROKE +1D99 ; [.1F2C.0020.0002] # LATIN SMALL LETTER U WITH RETROFLEX HOOK +AB52 ; [.1F2D.0020.0002] # LATIN SMALL LETTER U WITH LEFT HOOK +AB5F ; [.1F2D.0020.0014] # MODIFIER LETTER SMALL U WITH LEFT HOOK +0265 ; [.1F2E.0020.0002] # LATIN SMALL LETTER TURNED H +A78D ; [.1F2E.0020.0008] # LATIN CAPITAL LETTER TURNED H +1DA3 ; [.1F2E.0020.0014] # MODIFIER LETTER SMALL TURNED H +02AE ; [.1F32.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK +02AF ; [.1F36.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +026F ; [.1F3A.0020.0002] # LATIN SMALL LETTER TURNED M +019C ; [.1F3A.0020.0008] # LATIN CAPITAL LETTER TURNED M +1D5A ; [.1F3A.0020.0014] # MODIFIER LETTER SMALL TURNED M +A7FA ; [.1F3E.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED M +1D1F ; [.1F3F.0020.0002] # LATIN SMALL LETTER SIDEWAYS TURNED M +0270 ; [.1F40.0020.0002] # LATIN SMALL LETTER TURNED M WITH LONG LEG +1DAD ; [.1F40.0020.0014] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG +028A ; [.1F44.0020.0002] # LATIN SMALL LETTER UPSILON +01B1 ; [.1F44.0020.0008] # LATIN CAPITAL LETTER UPSILON +1DB7 ; [.1F44.0020.0014] # MODIFIER LETTER SMALL UPSILON +1D7F ; [.1F48.0020.0002] # LATIN SMALL LETTER UPSILON WITH STROKE +0076 ; [.1F49.0020.0002] # LATIN SMALL LETTER V +FF56 ; [.1F49.0020.0003] # FULLWIDTH LATIN SMALL LETTER V +036E ; [.1F49.0020.0004] # COMBINING LATIN SMALL LETTER V +2174 ; [.1F49.0020.0004] # SMALL ROMAN NUMERAL FIVE +24B1 ; [*0318.0020.0004][.1F49.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER V +1D42F ; [.1F49.0020.0005] # MATHEMATICAL BOLD SMALL V +1D463 ; [.1F49.0020.0005] # MATHEMATICAL ITALIC SMALL V +1D497 ; [.1F49.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL V +1D4CB ; [.1F49.0020.0005] # MATHEMATICAL SCRIPT SMALL V +1D4FF ; [.1F49.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL V +1D533 ; [.1F49.0020.0005] # MATHEMATICAL FRAKTUR SMALL V +1D567 ; [.1F49.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL V +1D59B ; [.1F49.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL V +1D5CF ; [.1F49.0020.0005] # MATHEMATICAL SANS-SERIF SMALL V +1D603 ; [.1F49.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL V +1D637 ; [.1F49.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D66B ; [.1F49.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D69F ; [.1F49.0020.0005] # MATHEMATICAL MONOSPACE SMALL V +24E5 ; [.1F49.0020.0006] # CIRCLED LATIN SMALL LETTER V +0056 ; [.1F49.0020.0008] # LATIN CAPITAL LETTER V +FF36 ; [.1F49.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER V +2164 ; [.1F49.0020.000A] # ROMAN NUMERAL FIVE +1F125 ; [*0318.0020.0004][.1F49.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER V +1D415 ; [.1F49.0020.000B] # MATHEMATICAL BOLD CAPITAL V +1D449 ; [.1F49.0020.000B] # MATHEMATICAL ITALIC CAPITAL V +1D47D ; [.1F49.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL V +1D4B1 ; [.1F49.0020.000B] # MATHEMATICAL SCRIPT CAPITAL V +1D4E5 ; [.1F49.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL V +1D519 ; [.1F49.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL V +1D54D ; [.1F49.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D581 ; [.1F49.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D5B5 ; [.1F49.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL V +1D5E9 ; [.1F49.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D61D ; [.1F49.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D651 ; [.1F49.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D685 ; [.1F49.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL V +24CB ; [.1F49.0020.000C] # CIRCLED LATIN CAPITAL LETTER V +1F165 ; [.1F49.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER V +1D5B ; [.1F49.0020.0014] # MODIFIER LETTER SMALL V +1D65 ; [.1F49.0020.0015] # LATIN SUBSCRIPT SMALL LETTER V +2C7D ; [.1F49.0020.001D] # MODIFIER LETTER CAPITAL V +1F145 ; [.1F49.0020.001D] # SQUARED LATIN CAPITAL LETTER V +1F185 ; [.1F49.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER V +1E7D ; [.1F49.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER V WITH TILDE +1E7C ; [.1F49.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER V WITH TILDE +1E7F ; [.1F49.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER V WITH DOT BELOW +1E7E ; [.1F49.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER V WITH DOT BELOW +2175 ; [.1F49.0020.0004][.1D98.0020.0004] # SMALL ROMAN NUMERAL SIX +2165 ; [.1F49.0020.000A][.1D98.0020.000A] # ROMAN NUMERAL SIX +2176 ; [.1F49.0020.0004][.1D98.0020.0004][.1D98.0020.0004] # SMALL ROMAN NUMERAL SEVEN +2166 ; [.1F49.0020.000A][.1D98.0020.000A][.1D98.0020.000A] # ROMAN NUMERAL SEVEN +2177 ; [.1F49.0020.0004][.1D98.0020.0004][.1D98.0020.0004][.1D98.0020.0004] # SMALL ROMAN NUMERAL EIGHT +2167 ; [.1F49.0020.000A][.1D98.0020.000A][.1D98.0020.000A][.1D98.0020.000A] # ROMAN NUMERAL EIGHT +33DE ; [.1F49.0020.001D][*063B.0020.001C][.1E10.0020.001C] # SQUARE V OVER M +1F1AC ; [.1F49.0020.001D][.1E43.0020.001D][.1CF5.0020.001D] # SQUARED VOD +1F19A ; [.1F49.0020.001D][.1ED7.0020.001D] # SQUARED VS +A761 ; [.1F49.0020.0004][.1F71.0020.0004] # LATIN SMALL LETTER VY +A760 ; [.1F49.0020.000A][.1F71.0020.000A] # LATIN CAPITAL LETTER VY +1D20 ; [.1F4D.0020.0002] # LATIN LETTER SMALL CAPITAL V +A75F ; [.1F4E.0020.0002] # LATIN SMALL LETTER V WITH DIAGONAL STROKE +A75E ; [.1F4E.0020.0008] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +1D8C ; [.1F4F.0020.0002] # LATIN SMALL LETTER V WITH PALATAL HOOK +028B ; [.1F50.0020.0002] # LATIN SMALL LETTER V WITH HOOK +01B2 ; [.1F50.0020.0008] # LATIN CAPITAL LETTER V WITH HOOK +1DB9 ; [.1F50.0020.0014] # MODIFIER LETTER SMALL V WITH HOOK +2C71 ; [.1F54.0020.0002] # LATIN SMALL LETTER V WITH RIGHT HOOK +2C74 ; [.1F55.0020.0002] # LATIN SMALL LETTER V WITH CURL +1EFD ; [.1F56.0020.0002] # LATIN SMALL LETTER MIDDLE-WELSH V +1EFC ; [.1F56.0020.0008] # LATIN CAPITAL LETTER MIDDLE-WELSH V +028C ; [.1F57.0020.0002] # LATIN SMALL LETTER TURNED V +0245 ; [.1F57.0020.0008] # LATIN CAPITAL LETTER TURNED V +1DBA ; [.1F57.0020.0014] # MODIFIER LETTER SMALL TURNED V +0077 ; [.1F5B.0020.0002] # LATIN SMALL LETTER W +FF57 ; [.1F5B.0020.0003] # FULLWIDTH LATIN SMALL LETTER W +1DF1 ; [.1F5B.0020.0004] # COMBINING LATIN SMALL LETTER W +24B2 ; [*0318.0020.0004][.1F5B.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER W +1D430 ; [.1F5B.0020.0005] # MATHEMATICAL BOLD SMALL W +1D464 ; [.1F5B.0020.0005] # MATHEMATICAL ITALIC SMALL W +1D498 ; [.1F5B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL W +1D4CC ; [.1F5B.0020.0005] # MATHEMATICAL SCRIPT SMALL W +1D500 ; [.1F5B.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL W +1D534 ; [.1F5B.0020.0005] # MATHEMATICAL FRAKTUR SMALL W +1D568 ; [.1F5B.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL W +1D59C ; [.1F5B.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL W +1D5D0 ; [.1F5B.0020.0005] # MATHEMATICAL SANS-SERIF SMALL W +1D604 ; [.1F5B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL W +1D638 ; [.1F5B.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D66C ; [.1F5B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D6A0 ; [.1F5B.0020.0005] # MATHEMATICAL MONOSPACE SMALL W +24E6 ; [.1F5B.0020.0006] # CIRCLED LATIN SMALL LETTER W +0057 ; [.1F5B.0020.0008] # LATIN CAPITAL LETTER W +FF37 ; [.1F5B.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER W +1F126 ; [*0318.0020.0004][.1F5B.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER W +1D416 ; [.1F5B.0020.000B] # MATHEMATICAL BOLD CAPITAL W +1D44A ; [.1F5B.0020.000B] # MATHEMATICAL ITALIC CAPITAL W +1D47E ; [.1F5B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL W +1D4B2 ; [.1F5B.0020.000B] # MATHEMATICAL SCRIPT CAPITAL W +1D4E6 ; [.1F5B.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL W +1D51A ; [.1F5B.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL W +1D54E ; [.1F5B.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D582 ; [.1F5B.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D5B6 ; [.1F5B.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL W +1D5EA ; [.1F5B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D61E ; [.1F5B.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D652 ; [.1F5B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D686 ; [.1F5B.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL W +24CC ; [.1F5B.0020.000C] # CIRCLED LATIN CAPITAL LETTER W +1F166 ; [.1F5B.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER W +02B7 ; [.1F5B.0020.0014] # MODIFIER LETTER SMALL W +1D42 ; [.1F5B.0020.001D] # MODIFIER LETTER CAPITAL W +1F146 ; [.1F5B.0020.001D] # SQUARED LATIN CAPITAL LETTER W +1F186 ; [.1F5B.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER W +1E83 ; [.1F5B.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER W WITH ACUTE +1E82 ; [.1F5B.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER W WITH ACUTE +1E81 ; [.1F5B.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER W WITH GRAVE +1E80 ; [.1F5B.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER W WITH GRAVE +0175 ; [.1F5B.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER W WITH CIRCUMFLEX +0174 ; [.1F5B.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +1E98 ; [.1F5B.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER W WITH RING ABOVE +1E85 ; [.1F5B.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER W WITH DIAERESIS +1E84 ; [.1F5B.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER W WITH DIAERESIS +1E87 ; [.1F5B.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER W WITH DOT ABOVE +1E86 ; [.1F5B.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E89 ; [.1F5B.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER W WITH DOT BELOW +1E88 ; [.1F5B.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER W WITH DOT BELOW +33DD ; [.1F5B.0020.001D][.1CC6.0020.001C] # SQUARE WB +1F14F ; [.1F5B.0020.001D][.1CE0.0020.001D] # SQUARED WC +1F18F ; [.1F5B.0020.001D][.1CE0.0020.001D] # NEGATIVE SQUARED WC +1F12E ; [.1F5B.0020.000C][.1F87.0020.000C] # CIRCLED WZ +1D21 ; [.1F5F.0020.0002] # LATIN LETTER SMALL CAPITAL W +2C73 ; [.1F60.0020.0002] # LATIN SMALL LETTER W WITH HOOK +2C72 ; [.1F60.0020.0008] # LATIN CAPITAL LETTER W WITH HOOK +028D ; [.1F61.0020.0002] # LATIN SMALL LETTER TURNED W +0078 ; [.1F65.0020.0002] # LATIN SMALL LETTER X +FF58 ; [.1F65.0020.0003] # FULLWIDTH LATIN SMALL LETTER X +036F ; [.1F65.0020.0004] # COMBINING LATIN SMALL LETTER X +2179 ; [.1F65.0020.0004] # SMALL ROMAN NUMERAL TEN +24B3 ; [*0318.0020.0004][.1F65.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER X +1D431 ; [.1F65.0020.0005] # MATHEMATICAL BOLD SMALL X +1D465 ; [.1F65.0020.0005] # MATHEMATICAL ITALIC SMALL X +1D499 ; [.1F65.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL X +1D4CD ; [.1F65.0020.0005] # MATHEMATICAL SCRIPT SMALL X +1D501 ; [.1F65.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL X +1D535 ; [.1F65.0020.0005] # MATHEMATICAL FRAKTUR SMALL X +1D569 ; [.1F65.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL X +1D59D ; [.1F65.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL X +1D5D1 ; [.1F65.0020.0005] # MATHEMATICAL SANS-SERIF SMALL X +1D605 ; [.1F65.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL X +1D639 ; [.1F65.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D66D ; [.1F65.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D6A1 ; [.1F65.0020.0005] # MATHEMATICAL MONOSPACE SMALL X +24E7 ; [.1F65.0020.0006] # CIRCLED LATIN SMALL LETTER X +0058 ; [.1F65.0020.0008] # LATIN CAPITAL LETTER X +FF38 ; [.1F65.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER X +2169 ; [.1F65.0020.000A] # ROMAN NUMERAL TEN +1F127 ; [*0318.0020.0004][.1F65.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER X +1D417 ; [.1F65.0020.000B] # MATHEMATICAL BOLD CAPITAL X +1D44B ; [.1F65.0020.000B] # MATHEMATICAL ITALIC CAPITAL X +1D47F ; [.1F65.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL X +1D4B3 ; [.1F65.0020.000B] # MATHEMATICAL SCRIPT CAPITAL X +1D4E7 ; [.1F65.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL X +1D51B ; [.1F65.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL X +1D54F ; [.1F65.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D583 ; [.1F65.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D5B7 ; [.1F65.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL X +1D5EB ; [.1F65.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D61F ; [.1F65.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D653 ; [.1F65.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D687 ; [.1F65.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL X +24CD ; [.1F65.0020.000C] # CIRCLED LATIN CAPITAL LETTER X +1F167 ; [.1F65.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER X +02E3 ; [.1F65.0020.0014] # MODIFIER LETTER SMALL X +2093 ; [.1F65.0020.0015] # LATIN SUBSCRIPT SMALL LETTER X +1F147 ; [.1F65.0020.001D] # SQUARED LATIN CAPITAL LETTER X +1F187 ; [.1F65.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER X +1E8D ; [.1F65.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER X WITH DIAERESIS +1E8C ; [.1F65.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8B ; [.1F65.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER X WITH DOT ABOVE +1E8A ; [.1F65.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER X WITH DOT ABOVE +217A ; [.1F65.0020.0004][.1D98.0020.0004] # SMALL ROMAN NUMERAL ELEVEN +216A ; [.1F65.0020.000A][.1D98.0020.000A] # ROMAN NUMERAL ELEVEN +217B ; [.1F65.0020.0004][.1D98.0020.0004][.1D98.0020.0004] # SMALL ROMAN NUMERAL TWELVE +216B ; [.1F65.0020.000A][.1D98.0020.000A][.1D98.0020.000A] # ROMAN NUMERAL TWELVE +1D8D ; [.1F69.0020.0002] # LATIN SMALL LETTER X WITH PALATAL HOOK +AB56 ; [.1F6A.0020.0002] # LATIN SMALL LETTER X WITH LOW RIGHT RING +AB57 ; [.1F6B.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG +AB58 ; [.1F6C.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING +AB59 ; [.1F6D.0020.0002] # LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF +AB53 ; [.1F6E.0020.0002] # LATIN SMALL LETTER CHI +A7B3 ; [.1F6E.0020.0008] # LATIN CAPITAL LETTER CHI +AB54 ; [.1F6F.0020.0002] # LATIN SMALL LETTER CHI WITH LOW RIGHT RING +AB55 ; [.1F70.0020.0002] # LATIN SMALL LETTER CHI WITH LOW LEFT SERIF +0079 ; [.1F71.0020.0002] # LATIN SMALL LETTER Y +FF59 ; [.1F71.0020.0003] # FULLWIDTH LATIN SMALL LETTER Y +24B4 ; [*0318.0020.0004][.1F71.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Y +1D432 ; [.1F71.0020.0005] # MATHEMATICAL BOLD SMALL Y +1D466 ; [.1F71.0020.0005] # MATHEMATICAL ITALIC SMALL Y +1D49A ; [.1F71.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Y +1D4CE ; [.1F71.0020.0005] # MATHEMATICAL SCRIPT SMALL Y +1D502 ; [.1F71.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Y +1D536 ; [.1F71.0020.0005] # MATHEMATICAL FRAKTUR SMALL Y +1D56A ; [.1F71.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D59E ; [.1F71.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Y +1D5D2 ; [.1F71.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Y +1D606 ; [.1F71.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D63A ; [.1F71.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D66E ; [.1F71.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D6A2 ; [.1F71.0020.0005] # MATHEMATICAL MONOSPACE SMALL Y +24E8 ; [.1F71.0020.0006] # CIRCLED LATIN SMALL LETTER Y +0059 ; [.1F71.0020.0008] # LATIN CAPITAL LETTER Y +FF39 ; [.1F71.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Y +1F128 ; [*0318.0020.0004][.1F71.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Y +1D418 ; [.1F71.0020.000B] # MATHEMATICAL BOLD CAPITAL Y +1D44C ; [.1F71.0020.000B] # MATHEMATICAL ITALIC CAPITAL Y +1D480 ; [.1F71.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Y +1D4B4 ; [.1F71.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Y +1D4E8 ; [.1F71.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D51C ; [.1F71.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Y +1D550 ; [.1F71.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D584 ; [.1F71.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D5B8 ; [.1F71.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Y +1D5EC ; [.1F71.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D620 ; [.1F71.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D654 ; [.1F71.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D688 ; [.1F71.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Y +24CE ; [.1F71.0020.000C] # CIRCLED LATIN CAPITAL LETTER Y +1F168 ; [.1F71.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Y +02B8 ; [.1F71.0020.0014] # MODIFIER LETTER SMALL Y +1F148 ; [.1F71.0020.001D] # SQUARED LATIN CAPITAL LETTER Y +1F188 ; [.1F71.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Y +00FD ; [.1F71.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Y WITH ACUTE +00DD ; [.1F71.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Y WITH ACUTE +1EF3 ; [.1F71.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER Y WITH GRAVE +1EF2 ; [.1F71.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER Y WITH GRAVE +0177 ; [.1F71.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0176 ; [.1F71.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +1E99 ; [.1F71.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER Y WITH RING ABOVE +00FF ; [.1F71.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER Y WITH DIAERESIS +0178 ; [.1F71.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER Y WITH DIAERESIS +1EF9 ; [.1F71.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER Y WITH TILDE +1EF8 ; [.1F71.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER Y WITH TILDE +1E8F ; [.1F71.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Y WITH DOT ABOVE +1E8E ; [.1F71.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Y WITH DOT ABOVE +0233 ; [.1F71.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER Y WITH MACRON +0232 ; [.1F71.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER Y WITH MACRON +1EF7 ; [.1F71.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF6 ; [.1F71.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF5 ; [.1F71.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Y WITH DOT BELOW +1EF4 ; [.1F71.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Y WITH DOT BELOW +028F ; [.1F75.0020.0002] # LATIN LETTER SMALL CAPITAL Y +024F ; [.1F79.0020.0002] # LATIN SMALL LETTER Y WITH STROKE +024E ; [.1F79.0020.0008] # LATIN CAPITAL LETTER Y WITH STROKE +01B4 ; [.1F7D.0020.0002] # LATIN SMALL LETTER Y WITH HOOK +01B3 ; [.1F7D.0020.0008] # LATIN CAPITAL LETTER Y WITH HOOK +1EFF ; [.1F81.0020.0002] # LATIN SMALL LETTER Y WITH LOOP +1EFE ; [.1F81.0020.0008] # LATIN CAPITAL LETTER Y WITH LOOP +AB5A ; [.1F82.0020.0002] # LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +021D ; [.1F83.0020.0002] # LATIN SMALL LETTER YOGH +021C ; [.1F83.0020.0008] # LATIN CAPITAL LETTER YOGH +007A ; [.1F87.0020.0002] # LATIN SMALL LETTER Z +FF5A ; [.1F87.0020.0003] # FULLWIDTH LATIN SMALL LETTER Z +1DE6 ; [.1F87.0020.0004] # COMBINING LATIN SMALL LETTER Z +24B5 ; [*0318.0020.0004][.1F87.0020.0004][*0319.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Z +1D433 ; [.1F87.0020.0005] # MATHEMATICAL BOLD SMALL Z +1D467 ; [.1F87.0020.0005] # MATHEMATICAL ITALIC SMALL Z +1D49B ; [.1F87.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Z +1D4CF ; [.1F87.0020.0005] # MATHEMATICAL SCRIPT SMALL Z +1D503 ; [.1F87.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Z +1D537 ; [.1F87.0020.0005] # MATHEMATICAL FRAKTUR SMALL Z +1D56B ; [.1F87.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D59F ; [.1F87.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5D3 ; [.1F87.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Z +1D607 ; [.1F87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D63B ; [.1F87.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D66F ; [.1F87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D6A3 ; [.1F87.0020.0005] # MATHEMATICAL MONOSPACE SMALL Z +24E9 ; [.1F87.0020.0006] # CIRCLED LATIN SMALL LETTER Z +005A ; [.1F87.0020.0008] # LATIN CAPITAL LETTER Z +FF3A ; [.1F87.0020.0009] # FULLWIDTH LATIN CAPITAL LETTER Z +1F129 ; [*0318.0020.0004][.1F87.0020.000A][*0319.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Z +2124 ; [.1F87.0020.000B] # DOUBLE-STRUCK CAPITAL Z +2128 ; [.1F87.0020.000B] # BLACK-LETTER CAPITAL Z +1D419 ; [.1F87.0020.000B] # MATHEMATICAL BOLD CAPITAL Z +1D44D ; [.1F87.0020.000B] # MATHEMATICAL ITALIC CAPITAL Z +1D481 ; [.1F87.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Z +1D4B5 ; [.1F87.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Z +1D4E9 ; [.1F87.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D585 ; [.1F87.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D5B9 ; [.1F87.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Z +1D5ED ; [.1F87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D621 ; [.1F87.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D655 ; [.1F87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D689 ; [.1F87.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Z +24CF ; [.1F87.0020.000C] # CIRCLED LATIN CAPITAL LETTER Z +1F169 ; [.1F87.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1DBB ; [.1F87.0020.0014] # MODIFIER LETTER SMALL Z +1F149 ; [.1F87.0020.001D] # SQUARED LATIN CAPITAL LETTER Z +1F189 ; [.1F87.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Z +017A ; [.1F87.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Z WITH ACUTE +0179 ; [.1F87.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Z WITH ACUTE +1E91 ; [.1F87.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E90 ; [.1F87.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +017E ; [.1F87.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER Z WITH CARON +017D ; [.1F87.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER Z WITH CARON +017C ; [.1F87.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Z WITH DOT ABOVE +017B ; [.1F87.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Z WITH DOT ABOVE +1E93 ; [.1F87.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Z WITH DOT BELOW +1E92 ; [.1F87.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E95 ; [.1F87.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER Z WITH LINE BELOW +1E94 ; [.1F87.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER Z WITH LINE BELOW +018D ; [.1F87.0020.0004][.1F5B.0020.0004] # LATIN SMALL LETTER TURNED DELTA +1D22 ; [.1F8B.0020.0002] # LATIN LETTER SMALL CAPITAL Z +01B6 ; [.1F8C.0020.0002] # LATIN SMALL LETTER Z WITH STROKE +01B5 ; [.1F8C.0020.0008] # LATIN CAPITAL LETTER Z WITH STROKE +1D76 ; [.1F90.0020.0002] # LATIN SMALL LETTER Z WITH MIDDLE TILDE +1D8E ; [.1F91.0020.0002] # LATIN SMALL LETTER Z WITH PALATAL HOOK +0225 ; [.1F92.0020.0002] # LATIN SMALL LETTER Z WITH HOOK +0224 ; [.1F92.0020.0008] # LATIN CAPITAL LETTER Z WITH HOOK +0290 ; [.1F96.0020.0002] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK +1DBC ; [.1F96.0020.0014] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +0291 ; [.1F9A.0020.0002] # LATIN SMALL LETTER Z WITH CURL +1DBD ; [.1F9A.0020.0014] # MODIFIER LETTER SMALL Z WITH CURL +0240 ; [.1F9E.0020.0002] # LATIN SMALL LETTER Z WITH SWASH TAIL +2C7F ; [.1F9E.0020.0008] # LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C6C ; [.1FA2.0020.0002] # LATIN SMALL LETTER Z WITH DESCENDER +2C6B ; [.1FA2.0020.0008] # LATIN CAPITAL LETTER Z WITH DESCENDER +A763 ; [.1FA3.0020.0002] # LATIN SMALL LETTER VISIGOTHIC Z +A762 ; [.1FA3.0020.0008] # LATIN CAPITAL LETTER VISIGOTHIC Z +0292 ; [.1FA4.0020.0002] # LATIN SMALL LETTER EZH +01B7 ; [.1FA4.0020.0008] # LATIN CAPITAL LETTER EZH +1DBE ; [.1FA4.0020.0014] # MODIFIER LETTER SMALL EZH +01EF ; [.1FA4.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER EZH WITH CARON +01EE ; [.1FA4.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER EZH WITH CARON +1D23 ; [.1FA8.0020.0002] # LATIN LETTER SMALL CAPITAL EZH +01B9 ; [.1FA9.0020.0002] # LATIN SMALL LETTER EZH REVERSED +01B8 ; [.1FA9.0020.0008] # LATIN CAPITAL LETTER EZH REVERSED +1D9A ; [.1FAD.0020.0002] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +01BA ; [.1FAE.0020.0002] # LATIN SMALL LETTER EZH WITH TAIL +0293 ; [.1FB2.0020.0002] # LATIN SMALL LETTER EZH WITH CURL +00FE ; [.1FB6.0020.0002] # LATIN SMALL LETTER THORN +00DE ; [.1FB6.0020.0008] # LATIN CAPITAL LETTER THORN +A765 ; [.1FBA.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE +A764 ; [.1FBA.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE +A767 ; [.1FBB.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +A766 ; [.1FBB.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +01BF ; [.1FBC.0020.0002] # LATIN LETTER WYNN +01F7 ; [.1FBC.0020.0008] # LATIN CAPITAL LETTER WYNN +A769 ; [.1FC0.0020.0002] # LATIN SMALL LETTER VEND +A768 ; [.1FC0.0020.0008] # LATIN CAPITAL LETTER VEND +AB60 ; [.1FC1.0020.0002] # LATIN SMALL LETTER SAKHA YAT +AB61 ; [.1FC2.0020.0002] # LATIN SMALL LETTER IOTIFIED E +AB63 ; [.1FC3.0020.0002] # LATIN SMALL LETTER UO +A76B ; [.1FC4.0020.0002] # LATIN SMALL LETTER ET +A76A ; [.1FC4.0020.0008] # LATIN CAPITAL LETTER ET +A76D ; [.1FC5.0020.0002] # LATIN SMALL LETTER IS +A76C ; [.1FC5.0020.0008] # LATIN CAPITAL LETTER IS +A76F ; [.1FC6.0020.0002] # LATIN SMALL LETTER CON +1DD2 ; [.1FC6.0020.0004] # COMBINING US ABOVE +A76E ; [.1FC6.0020.0008] # LATIN CAPITAL LETTER CON +A770 ; [.1FC6.0020.0014] # MODIFIER LETTER US +A778 ; [.1FC7.0020.0002] # LATIN SMALL LETTER UM +01BB ; [.1FC8.0020.0002] # LATIN LETTER TWO WITH STROKE +A72B ; [.1FCC.0020.0002] # LATIN SMALL LETTER TRESILLO +A72A ; [.1FCC.0020.0008] # LATIN CAPITAL LETTER TRESILLO +A72D ; [.1FCD.0020.0002] # LATIN SMALL LETTER CUATRILLO +A72C ; [.1FCD.0020.0008] # LATIN CAPITAL LETTER CUATRILLO +A72F ; [.1FCE.0020.0002] # LATIN SMALL LETTER CUATRILLO WITH COMMA +A72E ; [.1FCE.0020.0008] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +01A8 ; [.1FCF.0020.0002] # LATIN SMALL LETTER TONE TWO +01A7 ; [.1FCF.0020.0008] # LATIN CAPITAL LETTER TONE TWO +01BD ; [.1FD3.0020.0002] # LATIN SMALL LETTER TONE FIVE +01BC ; [.1FD3.0020.0008] # LATIN CAPITAL LETTER TONE FIVE +0185 ; [.1FD7.0020.0002] # LATIN SMALL LETTER TONE SIX +0184 ; [.1FD7.0020.0008] # LATIN CAPITAL LETTER TONE SIX +0294 ; [.1FDB.0020.0002] # LATIN LETTER GLOTTAL STOP +0242 ; [.1FDF.0020.0002] # LATIN SMALL LETTER GLOTTAL STOP +0241 ; [.1FDF.0020.0008] # LATIN CAPITAL LETTER GLOTTAL STOP +02C0 ; [.1FE3.0020.0002] # MODIFIER LETTER GLOTTAL STOP +02BC ; [.1FE4.0020.0002] # MODIFIER LETTER APOSTROPHE +0149 ; [.1FE4.0020.0004][.1E1F.0020.0004] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +02EE ; [.1FE5.0020.0002] # MODIFIER LETTER DOUBLE APOSTROPHE +02BE ; [.1FE6.0020.0002] # MODIFIER LETTER RIGHT HALF RING +A723 ; [.1FE7.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF +A722 ; [.1FE7.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A78C ; [.1FE8.0020.0002] # LATIN SMALL LETTER SALTILLO +A78B ; [.1FE8.0020.0008] # LATIN CAPITAL LETTER SALTILLO +A78F ; [.1FE9.0020.0002] # LATIN LETTER SINOLOGICAL DOT +0295 ; [.1FEA.0020.0002] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE +02E4 ; [.1FEA.0020.0014] # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02BF ; [.1FEE.0020.0002] # MODIFIER LETTER LEFT HALF RING +02C1 ; [.1FEF.0020.0002] # MODIFIER LETTER REVERSED GLOTTAL STOP +1D24 ; [.1FF0.0020.0002] # LATIN LETTER VOICED LARYNGEAL SPIRANT +1D25 ; [.1FF1.0020.0002] # LATIN LETTER AIN +1D5C ; [.1FF1.0020.0014] # MODIFIER LETTER SMALL AIN +A725 ; [.1FF2.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL AIN +A724 ; [.1FF2.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +02A1 ; [.1FF3.0020.0002] # LATIN LETTER GLOTTAL STOP WITH STROKE +02A2 ; [.1FF7.0020.0002] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE +0296 ; [.1FFB.0020.0002] # LATIN LETTER INVERTED GLOTTAL STOP +01C0 ; [.1FFF.0020.0002] # LATIN LETTER DENTAL CLICK +01C1 ; [.2003.0020.0002] # LATIN LETTER LATERAL CLICK +01C2 ; [.2007.0020.0002] # LATIN LETTER ALVEOLAR CLICK +01C3 ; [.200B.0020.0002] # LATIN LETTER RETROFLEX CLICK +0297 ; [.200F.0020.0002] # LATIN LETTER STRETCHED C +0298 ; [.2013.0020.0002] # LATIN LETTER BILABIAL CLICK +02AC ; [.2017.0020.0002] # LATIN LETTER BILABIAL PERCUSSIVE +02AD ; [.201B.0020.0002] # LATIN LETTER BIDENTAL PERCUSSIVE +03B1 ; [.201F.0020.0002] # GREEK SMALL LETTER ALPHA +1D6C2 ; [.201F.0020.0005] # MATHEMATICAL BOLD SMALL ALPHA +1D6FC ; [.201F.0020.0005] # MATHEMATICAL ITALIC SMALL ALPHA +1D736 ; [.201F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D770 ; [.201F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D7AA ; [.201F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +0391 ; [.201F.0020.0008] # GREEK CAPITAL LETTER ALPHA +1D6A8 ; [.201F.0020.000B] # MATHEMATICAL BOLD CAPITAL ALPHA +1D6E2 ; [.201F.0020.000B] # MATHEMATICAL ITALIC CAPITAL ALPHA +1D71C ; [.201F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D756 ; [.201F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D790 ; [.201F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1F00 ; [.201F.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ALPHA WITH PSILI +1F08 ; [.201F.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F04 ; [.201F.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +1F0C ; [.201F.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F84 ; [.201F.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F8C ; [.201F.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F02 ; [.201F.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +1F0A ; [.201F.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F82 ; [.201F.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F8A ; [.201F.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F06 ; [.201F.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0E ; [.201F.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F86 ; [.201F.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F8E ; [.201F.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F80 ; [.201F.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F88 ; [.201F.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F01 ; [.201F.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ALPHA WITH DASIA +1F09 ; [.201F.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F05 ; [.201F.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +1F0D ; [.201F.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F85 ; [.201F.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F8D ; [.201F.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F03 ; [.201F.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +1F0B ; [.201F.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F83 ; [.201F.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F8B ; [.201F.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F07 ; [.201F.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F0F ; [.201F.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F87 ; [.201F.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F8F ; [.201F.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F81 ; [.201F.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F89 ; [.201F.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +03AC ; [.201F.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH TONOS +1F71 ; [.201F.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ALPHA WITH OXIA +0386 ; [.201F.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH TONOS +1FBB ; [.201F.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FB4 ; [.201F.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1F70 ; [.201F.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ALPHA WITH VARIA +1FBA ; [.201F.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FB2 ; [.201F.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB0 ; [.201F.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER ALPHA WITH VRACHY +1FB8 ; [.201F.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB6 ; [.201F.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7 ; [.201F.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB1 ; [.201F.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER ALPHA WITH MACRON +1FB9 ; [.201F.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FB3 ; [.201F.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FBC ; [.201F.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +03B2 ; [.2020.0020.0002] # GREEK SMALL LETTER BETA +03D0 ; [.2020.0020.0004] # GREEK BETA SYMBOL +1D6C3 ; [.2020.0020.0005] # MATHEMATICAL BOLD SMALL BETA +1D6FD ; [.2020.0020.0005] # MATHEMATICAL ITALIC SMALL BETA +1D737 ; [.2020.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL BETA +1D771 ; [.2020.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D7AB ; [.2020.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +0392 ; [.2020.0020.0008] # GREEK CAPITAL LETTER BETA +1D6A9 ; [.2020.0020.000B] # MATHEMATICAL BOLD CAPITAL BETA +1D6E3 ; [.2020.0020.000B] # MATHEMATICAL ITALIC CAPITAL BETA +1D71D ; [.2020.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D757 ; [.2020.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D791 ; [.2020.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D5D ; [.2020.0020.0014] # MODIFIER LETTER SMALL BETA +1D66 ; [.2020.0020.0015] # GREEK SUBSCRIPT SMALL LETTER BETA +03B3 ; [.2021.0020.0002] # GREEK SMALL LETTER GAMMA +213D ; [.2021.0020.0005] # DOUBLE-STRUCK SMALL GAMMA +1D6C4 ; [.2021.0020.0005] # MATHEMATICAL BOLD SMALL GAMMA +1D6FE ; [.2021.0020.0005] # MATHEMATICAL ITALIC SMALL GAMMA +1D738 ; [.2021.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D772 ; [.2021.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D7AC ; [.2021.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +0393 ; [.2021.0020.0008] # GREEK CAPITAL LETTER GAMMA +213E ; [.2021.0020.000B] # DOUBLE-STRUCK CAPITAL GAMMA +1D6AA ; [.2021.0020.000B] # MATHEMATICAL BOLD CAPITAL GAMMA +1D6E4 ; [.2021.0020.000B] # MATHEMATICAL ITALIC CAPITAL GAMMA +1D71E ; [.2021.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D758 ; [.2021.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D792 ; [.2021.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D5E ; [.2021.0020.0014] # MODIFIER LETTER SMALL GREEK GAMMA +1D67 ; [.2021.0020.0015] # GREEK SUBSCRIPT SMALL LETTER GAMMA +1D26 ; [.2022.0020.0002] # GREEK LETTER SMALL CAPITAL GAMMA +03B4 ; [.2023.0020.0002] # GREEK SMALL LETTER DELTA +1D6C5 ; [.2023.0020.0005] # MATHEMATICAL BOLD SMALL DELTA +1D6FF ; [.2023.0020.0005] # MATHEMATICAL ITALIC SMALL DELTA +1D739 ; [.2023.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL DELTA +1D773 ; [.2023.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D7AD ; [.2023.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +0394 ; [.2023.0020.0008] # GREEK CAPITAL LETTER DELTA +1D6AB ; [.2023.0020.000B] # MATHEMATICAL BOLD CAPITAL DELTA +1D6E5 ; [.2023.0020.000B] # MATHEMATICAL ITALIC CAPITAL DELTA +1D71F ; [.2023.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D759 ; [.2023.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D793 ; [.2023.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D5F ; [.2023.0020.0014] # MODIFIER LETTER SMALL DELTA +03B5 ; [.2024.0020.0002] # GREEK SMALL LETTER EPSILON +03F5 ; [.2024.0020.0004] # GREEK LUNATE EPSILON SYMBOL +1D6C6 ; [.2024.0020.0005] # MATHEMATICAL BOLD SMALL EPSILON +1D6DC ; [.2024.0020.0005] # MATHEMATICAL BOLD EPSILON SYMBOL +1D700 ; [.2024.0020.0005] # MATHEMATICAL ITALIC SMALL EPSILON +1D716 ; [.2024.0020.0005] # MATHEMATICAL ITALIC EPSILON SYMBOL +1D73A ; [.2024.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D750 ; [.2024.0020.0005] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D774 ; [.2024.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D78A ; [.2024.0020.0005] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D7AE ; [.2024.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7C4 ; [.2024.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +0395 ; [.2024.0020.0008] # GREEK CAPITAL LETTER EPSILON +1D6AC ; [.2024.0020.000B] # MATHEMATICAL BOLD CAPITAL EPSILON +1D6E6 ; [.2024.0020.000B] # MATHEMATICAL ITALIC CAPITAL EPSILON +1D720 ; [.2024.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D75A ; [.2024.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D794 ; [.2024.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1F10 ; [.2024.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER EPSILON WITH PSILI +1F18 ; [.2024.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F14 ; [.2024.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +1F1C ; [.2024.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F12 ; [.2024.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +1F1A ; [.2024.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F11 ; [.2024.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER EPSILON WITH DASIA +1F19 ; [.2024.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F15 ; [.2024.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F1D ; [.2024.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F13 ; [.2024.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +1F1B ; [.2024.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +03AD ; [.2024.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH TONOS +1F73 ; [.2024.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER EPSILON WITH OXIA +0388 ; [.2024.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH TONOS +1FC9 ; [.2024.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER EPSILON WITH OXIA +1F72 ; [.2024.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER EPSILON WITH VARIA +1FC8 ; [.2024.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER EPSILON WITH VARIA +03DD ; [.2025.0020.0002] # GREEK SMALL LETTER DIGAMMA +1D7CB ; [.2025.0020.0005] # MATHEMATICAL BOLD SMALL DIGAMMA +03DC ; [.2025.0020.0008] # GREEK LETTER DIGAMMA +1D7CA ; [.2025.0020.000B] # MATHEMATICAL BOLD CAPITAL DIGAMMA +0377 ; [.2026.0020.0002] # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +0376 ; [.2026.0020.0008] # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +03DB ; [.2027.0020.0002] # GREEK SMALL LETTER STIGMA +03DA ; [.2027.0020.0008] # GREEK LETTER STIGMA +03B6 ; [.2028.0020.0002] # GREEK SMALL LETTER ZETA +1D6C7 ; [.2028.0020.0005] # MATHEMATICAL BOLD SMALL ZETA +1D701 ; [.2028.0020.0005] # MATHEMATICAL ITALIC SMALL ZETA +1D73B ; [.2028.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ZETA +1D775 ; [.2028.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D7AF ; [.2028.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +0396 ; [.2028.0020.0008] # GREEK CAPITAL LETTER ZETA +1D6AD ; [.2028.0020.000B] # MATHEMATICAL BOLD CAPITAL ZETA +1D6E7 ; [.2028.0020.000B] # MATHEMATICAL ITALIC CAPITAL ZETA +1D721 ; [.2028.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D75B ; [.2028.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D795 ; [.2028.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +0371 ; [.2029.0020.0002] # GREEK SMALL LETTER HETA +0370 ; [.2029.0020.0008] # GREEK CAPITAL LETTER HETA +03B7 ; [.202A.0020.0002] # GREEK SMALL LETTER ETA +1D6C8 ; [.202A.0020.0005] # MATHEMATICAL BOLD SMALL ETA +1D702 ; [.202A.0020.0005] # MATHEMATICAL ITALIC SMALL ETA +1D73C ; [.202A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ETA +1D776 ; [.202A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D7B0 ; [.202A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +0397 ; [.202A.0020.0008] # GREEK CAPITAL LETTER ETA +1D6AE ; [.202A.0020.000B] # MATHEMATICAL BOLD CAPITAL ETA +1D6E8 ; [.202A.0020.000B] # MATHEMATICAL ITALIC CAPITAL ETA +1D722 ; [.202A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D75C ; [.202A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D796 ; [.202A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1F20 ; [.202A.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER ETA WITH PSILI +1F28 ; [.202A.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER ETA WITH PSILI +1F24 ; [.202A.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA +1F2C ; [.202A.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F94 ; [.202A.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F9C ; [.202A.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F22 ; [.202A.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA +1F2A ; [.202A.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F92 ; [.202A.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F9A ; [.202A.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F26 ; [.202A.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +1F2E ; [.202A.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F96 ; [.202A.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F9E ; [.202A.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F90 ; [.202A.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F98 ; [.202A.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F21 ; [.202A.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER ETA WITH DASIA +1F29 ; [.202A.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER ETA WITH DASIA +1F25 ; [.202A.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA +1F2D ; [.202A.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F95 ; [.202A.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F9D ; [.202A.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F23 ; [.202A.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA +1F2B ; [.202A.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F93 ; [.202A.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F9B ; [.202A.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F27 ; [.202A.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F2F ; [.202A.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F97 ; [.202A.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F9F ; [.202A.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F91 ; [.202A.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F99 ; [.202A.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +03AE ; [.202A.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH TONOS +1F75 ; [.202A.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER ETA WITH OXIA +0389 ; [.202A.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH TONOS +1FCB ; [.202A.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER ETA WITH OXIA +1FC4 ; [.202A.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1F74 ; [.202A.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER ETA WITH VARIA +1FCA ; [.202A.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER ETA WITH VARIA +1FC2 ; [.202A.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC6 ; [.202A.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7 ; [.202A.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC3 ; [.202A.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FCC ; [.202A.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +03B8 ; [.202B.0020.0002] # GREEK SMALL LETTER THETA +03D1 ; [.202B.0020.0004] # GREEK THETA SYMBOL +1D6C9 ; [.202B.0020.0005] # MATHEMATICAL BOLD SMALL THETA +1D6DD ; [.202B.0020.0005] # MATHEMATICAL BOLD THETA SYMBOL +1D703 ; [.202B.0020.0005] # MATHEMATICAL ITALIC SMALL THETA +1D717 ; [.202B.0020.0005] # MATHEMATICAL ITALIC THETA SYMBOL +1D73D ; [.202B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL THETA +1D751 ; [.202B.0020.0005] # MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D777 ; [.202B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D78B ; [.202B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D7B1 ; [.202B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7C5 ; [.202B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +0398 ; [.202B.0020.0008] # GREEK CAPITAL LETTER THETA +03F4 ; [.202B.0020.000A] # GREEK CAPITAL THETA SYMBOL +1D6AF ; [.202B.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA +1D6B9 ; [.202B.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6E9 ; [.202B.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA +1D6F3 ; [.202B.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D723 ; [.202B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D72D ; [.202B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D75D ; [.202B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D767 ; [.202B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D797 ; [.202B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D7A1 ; [.202B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1DBF ; [.202B.0020.0014] # MODIFIER LETTER SMALL THETA +03B9 ; [.202C.0020.0002] # GREEK SMALL LETTER IOTA +1FBE ; [.202C.0020.0002] # GREEK PROSGEGRAMMENI +037A ; [.202C.0020.0004] # GREEK YPOGEGRAMMENI +1D6CA ; [.202C.0020.0005] # MATHEMATICAL BOLD SMALL IOTA +1D704 ; [.202C.0020.0005] # MATHEMATICAL ITALIC SMALL IOTA +1D73E ; [.202C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL IOTA +1D778 ; [.202C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D7B2 ; [.202C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +0399 ; [.202C.0020.0008] # GREEK CAPITAL LETTER IOTA +1D6B0 ; [.202C.0020.000B] # MATHEMATICAL BOLD CAPITAL IOTA +1D6EA ; [.202C.0020.000B] # MATHEMATICAL ITALIC CAPITAL IOTA +1D724 ; [.202C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D75E ; [.202C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D798 ; [.202C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1F30 ; [.202C.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER IOTA WITH PSILI +1F38 ; [.202C.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI +1F34 ; [.202C.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +1F3C ; [.202C.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F32 ; [.202C.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +1F3A ; [.202C.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F36 ; [.202C.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3E ; [.202C.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F31 ; [.202C.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER IOTA WITH DASIA +1F39 ; [.202C.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA +1F35 ; [.202C.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +1F3D ; [.202C.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F33 ; [.202C.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +1F3B ; [.202C.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F37 ; [.202C.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F3F ; [.202C.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +03AF ; [.202C.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH TONOS +1F77 ; [.202C.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH OXIA +038A ; [.202C.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH TONOS +1FDB ; [.202C.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER IOTA WITH OXIA +1F76 ; [.202C.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH VARIA +1FDA ; [.202C.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER IOTA WITH VARIA +1FD0 ; [.202C.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER IOTA WITH VRACHY +1FD8 ; [.202C.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD6 ; [.202C.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH PERISPOMENI +03CA ; [.202C.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA +03AA ; [.202C.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0390 ; [.202C.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +1FD3 ; [.202C.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD2 ; [.202C.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD7 ; [.202C.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD1 ; [.202C.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER IOTA WITH MACRON +1FD9 ; [.202C.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER IOTA WITH MACRON +03F3 ; [.202D.0020.0002] # GREEK LETTER YOT +037F ; [.202D.0020.0008] # GREEK CAPITAL LETTER YOT +03BA ; [.202E.0020.0002] # GREEK SMALL LETTER KAPPA +03F0 ; [.202E.0020.0004] # GREEK KAPPA SYMBOL +1D6CB ; [.202E.0020.0005] # MATHEMATICAL BOLD SMALL KAPPA +1D6DE ; [.202E.0020.0005] # MATHEMATICAL BOLD KAPPA SYMBOL +1D705 ; [.202E.0020.0005] # MATHEMATICAL ITALIC SMALL KAPPA +1D718 ; [.202E.0020.0005] # MATHEMATICAL ITALIC KAPPA SYMBOL +1D73F ; [.202E.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D752 ; [.202E.0020.0005] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D779 ; [.202E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D78C ; [.202E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D7B3 ; [.202E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7C6 ; [.202E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +039A ; [.202E.0020.0008] # GREEK CAPITAL LETTER KAPPA +1D6B1 ; [.202E.0020.000B] # MATHEMATICAL BOLD CAPITAL KAPPA +1D6EB ; [.202E.0020.000B] # MATHEMATICAL ITALIC CAPITAL KAPPA +1D725 ; [.202E.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D75F ; [.202E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D799 ; [.202E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +03D7 ; [.202E.0020.0004][.201F.0020.0004][.202C.0020.0004] # GREEK KAI SYMBOL +03CF ; [.202E.0020.000A][.201F.0020.0004][.202C.0020.0004] # GREEK CAPITAL KAI SYMBOL +03BB ; [.202F.0020.0002] # GREEK SMALL LETTER LAMDA +1D6CC ; [.202F.0020.0005] # MATHEMATICAL BOLD SMALL LAMDA +1D706 ; [.202F.0020.0005] # MATHEMATICAL ITALIC SMALL LAMDA +1D740 ; [.202F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D77A ; [.202F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D7B4 ; [.202F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +039B ; [.202F.0020.0008] # GREEK CAPITAL LETTER LAMDA +1D6B2 ; [.202F.0020.000B] # MATHEMATICAL BOLD CAPITAL LAMDA +1D6EC ; [.202F.0020.000B] # MATHEMATICAL ITALIC CAPITAL LAMDA +1D726 ; [.202F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D760 ; [.202F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D79A ; [.202F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D27 ; [.2030.0020.0002] # GREEK LETTER SMALL CAPITAL LAMDA +03BC ; [.2031.0020.0002] # GREEK SMALL LETTER MU +00B5 ; [.2031.0020.0004] # MICRO SIGN +1D6CD ; [.2031.0020.0005] # MATHEMATICAL BOLD SMALL MU +1D707 ; [.2031.0020.0005] # MATHEMATICAL ITALIC SMALL MU +1D741 ; [.2031.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL MU +1D77B ; [.2031.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D7B5 ; [.2031.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +039C ; [.2031.0020.0008] # GREEK CAPITAL LETTER MU +1D6B3 ; [.2031.0020.000B] # MATHEMATICAL BOLD CAPITAL MU +1D6ED ; [.2031.0020.000B] # MATHEMATICAL ITALIC CAPITAL MU +1D727 ; [.2031.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL MU +1D761 ; [.2031.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D79B ; [.2031.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +3382 ; [.2031.0020.001C][.1CAD.0020.001D] # SQUARE MU A +338C ; [.2031.0020.001C][.1D4B.0020.001D] # SQUARE MU F +338D ; [.2031.0020.001C][.1D5A.0020.001C] # SQUARE MU G +3395 ; [.2031.0020.001C][.1DDD.0020.001C] # SQUARE MU L +339B ; [.2031.0020.001C][.1E10.0020.001C] # SQUARE MU M +33B2 ; [.2031.0020.001C][.1ED7.0020.001C] # SQUARE MU S +33B6 ; [.2031.0020.001C][.1F49.0020.001D] # SQUARE MU V +33BC ; [.2031.0020.001C][.1F5B.0020.001D] # SQUARE MU W +03BD ; [.2032.0020.0002] # GREEK SMALL LETTER NU +1D6CE ; [.2032.0020.0005] # MATHEMATICAL BOLD SMALL NU +1D708 ; [.2032.0020.0005] # MATHEMATICAL ITALIC SMALL NU +1D742 ; [.2032.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL NU +1D77C ; [.2032.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D7B6 ; [.2032.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +039D ; [.2032.0020.0008] # GREEK CAPITAL LETTER NU +1D6B4 ; [.2032.0020.000B] # MATHEMATICAL BOLD CAPITAL NU +1D6EE ; [.2032.0020.000B] # MATHEMATICAL ITALIC CAPITAL NU +1D728 ; [.2032.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL NU +1D762 ; [.2032.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D79C ; [.2032.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +03BE ; [.2033.0020.0002] # GREEK SMALL LETTER XI +1D6CF ; [.2033.0020.0005] # MATHEMATICAL BOLD SMALL XI +1D709 ; [.2033.0020.0005] # MATHEMATICAL ITALIC SMALL XI +1D743 ; [.2033.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL XI +1D77D ; [.2033.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D7B7 ; [.2033.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +039E ; [.2033.0020.0008] # GREEK CAPITAL LETTER XI +1D6B5 ; [.2033.0020.000B] # MATHEMATICAL BOLD CAPITAL XI +1D6EF ; [.2033.0020.000B] # MATHEMATICAL ITALIC CAPITAL XI +1D729 ; [.2033.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL XI +1D763 ; [.2033.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D79D ; [.2033.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +03BF ; [.2034.0020.0002] # GREEK SMALL LETTER OMICRON +1D6D0 ; [.2034.0020.0005] # MATHEMATICAL BOLD SMALL OMICRON +1D70A ; [.2034.0020.0005] # MATHEMATICAL ITALIC SMALL OMICRON +1D744 ; [.2034.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D77E ; [.2034.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D7B8 ; [.2034.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +039F ; [.2034.0020.0008] # GREEK CAPITAL LETTER OMICRON +1D6B6 ; [.2034.0020.000B] # MATHEMATICAL BOLD CAPITAL OMICRON +1D6F0 ; [.2034.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMICRON +1D72A ; [.2034.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D764 ; [.2034.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D79E ; [.2034.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1F40 ; [.2034.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMICRON WITH PSILI +1F48 ; [.2034.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F44 ; [.2034.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +1F4C ; [.2034.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F42 ; [.2034.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +1F4A ; [.2034.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F41 ; [.2034.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMICRON WITH DASIA +1F49 ; [.2034.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F45 ; [.2034.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F4D ; [.2034.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F43 ; [.2034.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +1F4B ; [.2034.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +03CC ; [.2034.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH TONOS +1F79 ; [.2034.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMICRON WITH OXIA +038C ; [.2034.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH TONOS +1FF9 ; [.2034.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMICRON WITH OXIA +1F78 ; [.2034.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMICRON WITH VARIA +1FF8 ; [.2034.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMICRON WITH VARIA +03C0 ; [.2035.0020.0002] # GREEK SMALL LETTER PI +03D6 ; [.2035.0020.0004] # GREEK PI SYMBOL +213C ; [.2035.0020.0005] # DOUBLE-STRUCK SMALL PI +1D6D1 ; [.2035.0020.0005] # MATHEMATICAL BOLD SMALL PI +1D6E1 ; [.2035.0020.0005] # MATHEMATICAL BOLD PI SYMBOL +1D70B ; [.2035.0020.0005] # MATHEMATICAL ITALIC SMALL PI +1D71B ; [.2035.0020.0005] # MATHEMATICAL ITALIC PI SYMBOL +1D745 ; [.2035.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PI +1D755 ; [.2035.0020.0005] # MATHEMATICAL BOLD ITALIC PI SYMBOL +1D77F ; [.2035.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D78F ; [.2035.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D7B9 ; [.2035.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7C9 ; [.2035.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +03A0 ; [.2035.0020.0008] # GREEK CAPITAL LETTER PI +213F ; [.2035.0020.000B] # DOUBLE-STRUCK CAPITAL PI +1D6B7 ; [.2035.0020.000B] # MATHEMATICAL BOLD CAPITAL PI +1D6F1 ; [.2035.0020.000B] # MATHEMATICAL ITALIC CAPITAL PI +1D72B ; [.2035.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PI +1D765 ; [.2035.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D79F ; [.2035.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D28 ; [.2036.0020.0002] # GREEK LETTER SMALL CAPITAL PI +03FB ; [.2037.0020.0002] # GREEK SMALL LETTER SAN +03FA ; [.2037.0020.0008] # GREEK CAPITAL LETTER SAN +03DF ; [.2038.0020.0002] # GREEK SMALL LETTER KOPPA +03DE ; [.2038.0020.0008] # GREEK LETTER KOPPA +03D9 ; [.2039.0020.0002] # GREEK SMALL LETTER ARCHAIC KOPPA +03D8 ; [.2039.0020.0008] # GREEK LETTER ARCHAIC KOPPA +03C1 ; [.203A.0020.0002] # GREEK SMALL LETTER RHO +03F1 ; [.203A.0020.0004] # GREEK RHO SYMBOL +1D6D2 ; [.203A.0020.0005] # MATHEMATICAL BOLD SMALL RHO +1D6E0 ; [.203A.0020.0005] # MATHEMATICAL BOLD RHO SYMBOL +1D70C ; [.203A.0020.0005] # MATHEMATICAL ITALIC SMALL RHO +1D71A ; [.203A.0020.0005] # MATHEMATICAL ITALIC RHO SYMBOL +1D746 ; [.203A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL RHO +1D754 ; [.203A.0020.0005] # MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D780 ; [.203A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D78E ; [.203A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D7BA ; [.203A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7C8 ; [.203A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +03A1 ; [.203A.0020.0008] # GREEK CAPITAL LETTER RHO +1D6B8 ; [.203A.0020.000B] # MATHEMATICAL BOLD CAPITAL RHO +1D6F2 ; [.203A.0020.000B] # MATHEMATICAL ITALIC CAPITAL RHO +1D72C ; [.203A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D766 ; [.203A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D7A0 ; [.203A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D68 ; [.203A.0020.0015] # GREEK SUBSCRIPT SMALL LETTER RHO +1FE4 ; [.203A.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER RHO WITH PSILI +1FE5 ; [.203A.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER RHO WITH DASIA +1FEC ; [.203A.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER RHO WITH DASIA +1D29 ; [.203B.0020.0002] # GREEK LETTER SMALL CAPITAL RHO +03FC ; [.203C.0020.0002] # GREEK RHO WITH STROKE SYMBOL +03C3 ; [.203D.0020.0002] # GREEK SMALL LETTER SIGMA +03F2 ; [.203D.0020.0004] # GREEK LUNATE SIGMA SYMBOL +1D6D3 ; [.203D.0020.0005] # MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4 ; [.203D.0020.0005] # MATHEMATICAL BOLD SMALL SIGMA +1D70D ; [.203D.0020.0005] # MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E ; [.203D.0020.0005] # MATHEMATICAL ITALIC SMALL SIGMA +1D747 ; [.203D.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748 ; [.203D.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D781 ; [.203D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782 ; [.203D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D7BB ; [.203D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC ; [.203D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +03A3 ; [.203D.0020.0008] # GREEK CAPITAL LETTER SIGMA +03F9 ; [.203D.0020.000A] # GREEK CAPITAL LUNATE SIGMA SYMBOL +1D6BA ; [.203D.0020.000B] # MATHEMATICAL BOLD CAPITAL SIGMA +1D6F4 ; [.203D.0020.000B] # MATHEMATICAL ITALIC CAPITAL SIGMA +1D72E ; [.203D.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D768 ; [.203D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D7A2 ; [.203D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +03C2 ; [.203D.0020.0019] # GREEK SMALL LETTER FINAL SIGMA +037C ; [.203E.0020.0002] # GREEK SMALL DOTTED LUNATE SIGMA SYMBOL +03FE ; [.203E.0020.0008] # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +037B ; [.203F.0020.0002] # GREEK SMALL REVERSED LUNATE SIGMA SYMBOL +03FD ; [.203F.0020.0008] # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +037D ; [.2040.0020.0002] # GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +03FF ; [.2040.0020.0008] # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +03C4 ; [.2041.0020.0002] # GREEK SMALL LETTER TAU +1D6D5 ; [.2041.0020.0005] # MATHEMATICAL BOLD SMALL TAU +1D70F ; [.2041.0020.0005] # MATHEMATICAL ITALIC SMALL TAU +1D749 ; [.2041.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL TAU +1D783 ; [.2041.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D7BD ; [.2041.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +03A4 ; [.2041.0020.0008] # GREEK CAPITAL LETTER TAU +1D6BB ; [.2041.0020.000B] # MATHEMATICAL BOLD CAPITAL TAU +1D6F5 ; [.2041.0020.000B] # MATHEMATICAL ITALIC CAPITAL TAU +1D72F ; [.2041.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D769 ; [.2041.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D7A3 ; [.2041.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +03C5 ; [.2042.0020.0002] # GREEK SMALL LETTER UPSILON +1D6D6 ; [.2042.0020.0005] # MATHEMATICAL BOLD SMALL UPSILON +1D710 ; [.2042.0020.0005] # MATHEMATICAL ITALIC SMALL UPSILON +1D74A ; [.2042.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D784 ; [.2042.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D7BE ; [.2042.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +03A5 ; [.2042.0020.0008] # GREEK CAPITAL LETTER UPSILON +03D2 ; [.2042.0020.000A] # GREEK UPSILON WITH HOOK SYMBOL +1D6BC ; [.2042.0020.000B] # MATHEMATICAL BOLD CAPITAL UPSILON +1D6F6 ; [.2042.0020.000B] # MATHEMATICAL ITALIC CAPITAL UPSILON +1D730 ; [.2042.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D76A ; [.2042.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D7A4 ; [.2042.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1F50 ; [.2042.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER UPSILON WITH PSILI +1F54 ; [.2042.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F52 ; [.2042.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F56 ; [.2042.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F51 ; [.2042.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER UPSILON WITH DASIA +1F59 ; [.2042.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F55 ; [.2042.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +1F5D ; [.2042.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F53 ; [.2042.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +1F5B ; [.2042.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F57 ; [.2042.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F5F ; [.2042.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +03CD ; [.2042.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH TONOS +1F7B ; [.2042.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH OXIA +038E ; [.2042.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH TONOS +1FEB ; [.2042.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER UPSILON WITH OXIA +03D3 ; [.2042.0020.000A][.0000.0024.0002] # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +1F7A ; [.2042.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH VARIA +1FEA ; [.2042.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FE0 ; [.2042.0020.0002][.0000.0026.0002] # GREEK SMALL LETTER UPSILON WITH VRACHY +1FE8 ; [.2042.0020.0008][.0000.0026.0002] # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE6 ; [.2042.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +03CB ; [.2042.0020.0002][.0000.002B.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03AB ; [.2042.0020.0008][.0000.002B.0002] # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03D4 ; [.2042.0020.000A][.0000.002B.0002] # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03B0 ; [.2042.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +1FE3 ; [.2042.0020.0002][.0000.002B.0002][.0000.0024.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE2 ; [.2042.0020.0002][.0000.002B.0002][.0000.0025.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE7 ; [.2042.0020.0002][.0000.002B.0002][.0000.002A.0002] # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE1 ; [.2042.0020.0002][.0000.0032.0002] # GREEK SMALL LETTER UPSILON WITH MACRON +1FE9 ; [.2042.0020.0008][.0000.0032.0002] # GREEK CAPITAL LETTER UPSILON WITH MACRON +03C6 ; [.2043.0020.0002] # GREEK SMALL LETTER PHI +03D5 ; [.2043.0020.0004] # GREEK PHI SYMBOL +1D6D7 ; [.2043.0020.0005] # MATHEMATICAL BOLD SMALL PHI +1D6DF ; [.2043.0020.0005] # MATHEMATICAL BOLD PHI SYMBOL +1D711 ; [.2043.0020.0005] # MATHEMATICAL ITALIC SMALL PHI +1D719 ; [.2043.0020.0005] # MATHEMATICAL ITALIC PHI SYMBOL +1D74B ; [.2043.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PHI +1D753 ; [.2043.0020.0005] # MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D785 ; [.2043.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D78D ; [.2043.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D7BF ; [.2043.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C7 ; [.2043.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +03A6 ; [.2043.0020.0008] # GREEK CAPITAL LETTER PHI +1D6BD ; [.2043.0020.000B] # MATHEMATICAL BOLD CAPITAL PHI +1D6F7 ; [.2043.0020.000B] # MATHEMATICAL ITALIC CAPITAL PHI +1D731 ; [.2043.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D76B ; [.2043.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D7A5 ; [.2043.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D60 ; [.2043.0020.0014] # MODIFIER LETTER SMALL GREEK PHI +1D69 ; [.2043.0020.0015] # GREEK SUBSCRIPT SMALL LETTER PHI +03C7 ; [.2044.0020.0002] # GREEK SMALL LETTER CHI +1D6D8 ; [.2044.0020.0005] # MATHEMATICAL BOLD SMALL CHI +1D712 ; [.2044.0020.0005] # MATHEMATICAL ITALIC SMALL CHI +1D74C ; [.2044.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL CHI +1D786 ; [.2044.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D7C0 ; [.2044.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +03A7 ; [.2044.0020.0008] # GREEK CAPITAL LETTER CHI +1D6BE ; [.2044.0020.000B] # MATHEMATICAL BOLD CAPITAL CHI +1D6F8 ; [.2044.0020.000B] # MATHEMATICAL ITALIC CAPITAL CHI +1D732 ; [.2044.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D76C ; [.2044.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D7A6 ; [.2044.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D61 ; [.2044.0020.0014] # MODIFIER LETTER SMALL CHI +1D6A ; [.2044.0020.0015] # GREEK SUBSCRIPT SMALL LETTER CHI +03C8 ; [.2045.0020.0002] # GREEK SMALL LETTER PSI +1D6D9 ; [.2045.0020.0005] # MATHEMATICAL BOLD SMALL PSI +1D713 ; [.2045.0020.0005] # MATHEMATICAL ITALIC SMALL PSI +1D74D ; [.2045.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PSI +1D787 ; [.2045.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D7C1 ; [.2045.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +03A8 ; [.2045.0020.0008] # GREEK CAPITAL LETTER PSI +1D6BF ; [.2045.0020.000B] # MATHEMATICAL BOLD CAPITAL PSI +1D6F9 ; [.2045.0020.000B] # MATHEMATICAL ITALIC CAPITAL PSI +1D733 ; [.2045.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D76D ; [.2045.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D7A7 ; [.2045.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D2A ; [.2046.0020.0002] # GREEK LETTER SMALL CAPITAL PSI +03C9 ; [.2047.0020.0002] # GREEK SMALL LETTER OMEGA +1D6DA ; [.2047.0020.0005] # MATHEMATICAL BOLD SMALL OMEGA +1D714 ; [.2047.0020.0005] # MATHEMATICAL ITALIC SMALL OMEGA +1D74E ; [.2047.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D788 ; [.2047.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D7C2 ; [.2047.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +03A9 ; [.2047.0020.0008] # GREEK CAPITAL LETTER OMEGA +2126 ; [.2047.0020.0008] # OHM SIGN +1D6C0 ; [.2047.0020.000B] # MATHEMATICAL BOLD CAPITAL OMEGA +1D6FA ; [.2047.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMEGA +1D734 ; [.2047.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D76E ; [.2047.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D7A8 ; [.2047.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1F60 ; [.2047.0020.0002][.0000.0022.0002] # GREEK SMALL LETTER OMEGA WITH PSILI +1F68 ; [.2047.0020.0008][.0000.0022.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F64 ; [.2047.0020.0002][.0000.0022.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +1F6C ; [.2047.0020.0008][.0000.0022.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1FA4 ; [.2047.0020.0002][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FAC ; [.2047.0020.0008][.0000.0022.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F62 ; [.2047.0020.0002][.0000.0022.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +1F6A ; [.2047.0020.0008][.0000.0022.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1FA2 ; [.2047.0020.0002][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FAA ; [.2047.0020.0008][.0000.0022.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F66 ; [.2047.0020.0002][.0000.0022.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6E ; [.2047.0020.0008][.0000.0022.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1FA6 ; [.2047.0020.0002][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FAE ; [.2047.0020.0008][.0000.0022.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FA0 ; [.2047.0020.0002][.0000.0022.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA8 ; [.2047.0020.0008][.0000.0022.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1F61 ; [.2047.0020.0002][.0000.0023.0002] # GREEK SMALL LETTER OMEGA WITH DASIA +1F69 ; [.2047.0020.0008][.0000.0023.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F65 ; [.2047.0020.0002][.0000.0023.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +1F6D ; [.2047.0020.0008][.0000.0023.0002][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1FA5 ; [.2047.0020.0002][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FAD ; [.2047.0020.0008][.0000.0023.0002][.0000.0024.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F63 ; [.2047.0020.0002][.0000.0023.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +1F6B ; [.2047.0020.0008][.0000.0023.0002][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1FA3 ; [.2047.0020.0002][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FAB ; [.2047.0020.0008][.0000.0023.0002][.0000.0025.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F67 ; [.2047.0020.0002][.0000.0023.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F6F ; [.2047.0020.0008][.0000.0023.0002][.0000.002A.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1FA7 ; [.2047.0020.0002][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FAF ; [.2047.0020.0008][.0000.0023.0002][.0000.002A.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA1 ; [.2047.0020.0002][.0000.0023.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA9 ; [.2047.0020.0008][.0000.0023.0002][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +03CE ; [.2047.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH TONOS +1F7D ; [.2047.0020.0002][.0000.0024.0002] # GREEK SMALL LETTER OMEGA WITH OXIA +038F ; [.2047.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH TONOS +1FFB ; [.2047.0020.0008][.0000.0024.0002] # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FF4 ; [.2047.0020.0002][.0000.0024.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1F7C ; [.2047.0020.0002][.0000.0025.0002] # GREEK SMALL LETTER OMEGA WITH VARIA +1FFA ; [.2047.0020.0008][.0000.0025.0002] # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FF2 ; [.2047.0020.0002][.0000.0025.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF6 ; [.2047.0020.0002][.0000.002A.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7 ; [.2047.0020.0002][.0000.002A.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF3 ; [.2047.0020.0002][.0000.004C.0002] # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FFC ; [.2047.0020.0008][.0000.004C.0002] # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +AB65 ; [.2048.0020.0002] # GREEK LETTER SMALL CAPITAL OMEGA +03E1 ; [.2049.0020.0002] # GREEK SMALL LETTER SAMPI +03E0 ; [.2049.0020.0008] # GREEK LETTER SAMPI +0373 ; [.204A.0020.0002] # GREEK SMALL LETTER ARCHAIC SAMPI +0372 ; [.204A.0020.0008] # GREEK CAPITAL LETTER ARCHAIC SAMPI +03F8 ; [.204B.0020.0002] # GREEK SMALL LETTER SHO +03F7 ; [.204B.0020.0008] # GREEK CAPITAL LETTER SHO +2C81 ; [.204C.0020.0002] # COPTIC SMALL LETTER ALFA +2C80 ; [.204C.0020.0008] # COPTIC CAPITAL LETTER ALFA +2C83 ; [.204D.0020.0002] # COPTIC SMALL LETTER VIDA +2C82 ; [.204D.0020.0008] # COPTIC CAPITAL LETTER VIDA +2C85 ; [.204E.0020.0002] # COPTIC SMALL LETTER GAMMA +2C84 ; [.204E.0020.0008] # COPTIC CAPITAL LETTER GAMMA +2C87 ; [.204F.0020.0002] # COPTIC SMALL LETTER DALDA +2C86 ; [.204F.0020.0008] # COPTIC CAPITAL LETTER DALDA +2C89 ; [.2050.0020.0002] # COPTIC SMALL LETTER EIE +2C88 ; [.2050.0020.0008] # COPTIC CAPITAL LETTER EIE +2CB7 ; [.2051.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +2CB6 ; [.2051.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2C8B ; [.2052.0020.0002] # COPTIC SMALL LETTER SOU +2C8A ; [.2052.0020.0008] # COPTIC CAPITAL LETTER SOU +2C8D ; [.2053.0020.0002] # COPTIC SMALL LETTER ZATA +2C8C ; [.2053.0020.0008] # COPTIC CAPITAL LETTER ZATA +2C8F ; [.2054.0020.0002] # COPTIC SMALL LETTER HATE +2C8E ; [.2054.0020.0008] # COPTIC CAPITAL LETTER HATE +2C91 ; [.2055.0020.0002] # COPTIC SMALL LETTER THETHE +2C90 ; [.2055.0020.0008] # COPTIC CAPITAL LETTER THETHE +2C93 ; [.2056.0020.0002] # COPTIC SMALL LETTER IAUDA +2C92 ; [.2056.0020.0008] # COPTIC CAPITAL LETTER IAUDA +2C95 ; [.2057.0020.0002] # COPTIC SMALL LETTER KAPA +2C94 ; [.2057.0020.0008] # COPTIC CAPITAL LETTER KAPA +2CE4 ; [.2057.0020.0004][.204C.0020.0004][.2056.0020.0004] # COPTIC SYMBOL KAI +2CB9 ; [.2058.0020.0002] # COPTIC SMALL LETTER DIALECT-P KAPA +2CB8 ; [.2058.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P KAPA +2C97 ; [.2059.0020.0002] # COPTIC SMALL LETTER LAULA +2C96 ; [.2059.0020.0008] # COPTIC CAPITAL LETTER LAULA +2C99 ; [.205A.0020.0002] # COPTIC SMALL LETTER MI +2C98 ; [.205A.0020.0008] # COPTIC CAPITAL LETTER MI +2C9B ; [.205B.0020.0002] # COPTIC SMALL LETTER NI +2C9A ; [.205B.0020.0008] # COPTIC CAPITAL LETTER NI +2CBB ; [.205C.0020.0002] # COPTIC SMALL LETTER DIALECT-P NI +2CBA ; [.205C.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P NI +2CBD ; [.205D.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC NI +2CBC ; [.205D.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2C9D ; [.205E.0020.0002] # COPTIC SMALL LETTER KSI +2C9C ; [.205E.0020.0008] # COPTIC CAPITAL LETTER KSI +2C9F ; [.205F.0020.0002] # COPTIC SMALL LETTER O +2C9E ; [.205F.0020.0008] # COPTIC CAPITAL LETTER O +2CA1 ; [.2060.0020.0002] # COPTIC SMALL LETTER PI +2CA0 ; [.2060.0020.0008] # COPTIC CAPITAL LETTER PI +2CA3 ; [.2061.0020.0002] # COPTIC SMALL LETTER RO +2CA2 ; [.2061.0020.0008] # COPTIC CAPITAL LETTER RO +2CA5 ; [.2062.0020.0002] # COPTIC SMALL LETTER SIMA +2CA4 ; [.2062.0020.0008] # COPTIC CAPITAL LETTER SIMA +2CA7 ; [.2063.0020.0002] # COPTIC SMALL LETTER TAU +2CA6 ; [.2063.0020.0008] # COPTIC CAPITAL LETTER TAU +2CA9 ; [.2064.0020.0002] # COPTIC SMALL LETTER UA +2CA8 ; [.2064.0020.0008] # COPTIC CAPITAL LETTER UA +2CAB ; [.2065.0020.0002] # COPTIC SMALL LETTER FI +2CAA ; [.2065.0020.0008] # COPTIC CAPITAL LETTER FI +2CAD ; [.2066.0020.0002] # COPTIC SMALL LETTER KHI +2CAC ; [.2066.0020.0008] # COPTIC CAPITAL LETTER KHI +2CAF ; [.2067.0020.0002] # COPTIC SMALL LETTER PSI +2CAE ; [.2067.0020.0008] # COPTIC CAPITAL LETTER PSI +2CB1 ; [.2068.0020.0002] # COPTIC SMALL LETTER OOU +2CB0 ; [.2068.0020.0008] # COPTIC CAPITAL LETTER OOU +2CBF ; [.2069.0020.0002] # COPTIC SMALL LETTER OLD COPTIC OOU +2CBE ; [.2069.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC1 ; [.206A.0020.0002] # COPTIC SMALL LETTER SAMPI +2CC0 ; [.206A.0020.0008] # COPTIC CAPITAL LETTER SAMPI +03E3 ; [.206B.0020.0002] # COPTIC SMALL LETTER SHEI +03E2 ; [.206B.0020.0008] # COPTIC CAPITAL LETTER SHEI +2CEC ; [.206C.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +2CEB ; [.206C.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CC3 ; [.206D.0020.0002] # COPTIC SMALL LETTER CROSSED SHEI +2CC2 ; [.206D.0020.0008] # COPTIC CAPITAL LETTER CROSSED SHEI +2CC5 ; [.206E.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHEI +2CC4 ; [.206E.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC7 ; [.206F.0020.0002] # COPTIC SMALL LETTER OLD COPTIC ESH +2CC6 ; [.206F.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC ESH +03E5 ; [.2070.0020.0002] # COPTIC SMALL LETTER FEI +03E4 ; [.2070.0020.0008] # COPTIC CAPITAL LETTER FEI +03E7 ; [.2071.0020.0002] # COPTIC SMALL LETTER KHEI +03E6 ; [.2071.0020.0008] # COPTIC CAPITAL LETTER KHEI +2CF3 ; [.2072.0020.0002] # COPTIC SMALL LETTER BOHAIRIC KHEI +2CF2 ; [.2072.0020.0008] # COPTIC CAPITAL LETTER BOHAIRIC KHEI +2CC9 ; [.2073.0020.0002] # COPTIC SMALL LETTER AKHMIMIC KHEI +2CC8 ; [.2073.0020.0008] # COPTIC CAPITAL LETTER AKHMIMIC KHEI +03E9 ; [.2074.0020.0002] # COPTIC SMALL LETTER HORI +03E8 ; [.2074.0020.0008] # COPTIC CAPITAL LETTER HORI +2CCB ; [.2075.0020.0002] # COPTIC SMALL LETTER DIALECT-P HORI +2CCA ; [.2075.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCD ; [.2076.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HORI +2CCC ; [.2076.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCF ; [.2077.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HA +2CCE ; [.2077.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HA +2CD1 ; [.2078.0020.0002] # COPTIC SMALL LETTER L-SHAPED HA +2CD0 ; [.2078.0020.0008] # COPTIC CAPITAL LETTER L-SHAPED HA +2CD3 ; [.2079.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HEI +2CD2 ; [.2079.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD5 ; [.207A.0020.0002] # COPTIC SMALL LETTER OLD COPTIC HAT +2CD4 ; [.207A.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC HAT +03EB ; [.207B.0020.0002] # COPTIC SMALL LETTER GANGIA +03EA ; [.207B.0020.0008] # COPTIC CAPITAL LETTER GANGIA +2CEE ; [.207C.0020.0002] # COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CED ; [.207C.0020.0008] # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CD7 ; [.207D.0020.0002] # COPTIC SMALL LETTER OLD COPTIC GANGIA +2CD6 ; [.207D.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +03ED ; [.207E.0020.0002] # COPTIC SMALL LETTER SHIMA +03EC ; [.207E.0020.0008] # COPTIC CAPITAL LETTER SHIMA +2CD9 ; [.207F.0020.0002] # COPTIC SMALL LETTER OLD COPTIC DJA +2CD8 ; [.207F.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDB ; [.2080.0020.0002] # COPTIC SMALL LETTER OLD COPTIC SHIMA +2CDA ; [.2080.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDD ; [.2081.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN SHIMA +2CDC ; [.2081.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +03EF ; [.2082.0020.0002] # COPTIC SMALL LETTER DEI +03EE ; [.2082.0020.0008] # COPTIC CAPITAL LETTER DEI +2CB3 ; [.2083.0020.0002] # COPTIC SMALL LETTER DIALECT-P ALEF +2CB2 ; [.2083.0020.0008] # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB5 ; [.2084.0020.0002] # COPTIC SMALL LETTER OLD COPTIC AIN +2CB4 ; [.2084.0020.0008] # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CDF ; [.2085.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NGI +2CDE ; [.2085.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE1 ; [.2086.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN NYI +2CE0 ; [.2086.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE3 ; [.2087.0020.0002] # COPTIC SMALL LETTER OLD NUBIAN WAU +2CE2 ; [.2087.0020.0008] # COPTIC CAPITAL LETTER OLD NUBIAN WAU +0430 ; [.2088.0020.0002] # CYRILLIC SMALL LETTER A +2DF6 ; [.2088.0020.0004] # COMBINING CYRILLIC LETTER A +0410 ; [.2088.0020.0008] # CYRILLIC CAPITAL LETTER A +04D1 ; [.2088.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER A WITH BREVE +04D0 ; [.2088.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER A WITH BREVE +04D3 ; [.2088.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER A WITH DIAERESIS +04D2 ; [.2088.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D9 ; [.208C.0020.0002] # CYRILLIC SMALL LETTER SCHWA +04D8 ; [.208C.0020.0008] # CYRILLIC CAPITAL LETTER SCHWA +04DB ; [.208C.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DA ; [.208C.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04D5 ; [.2090.0020.0002] # CYRILLIC SMALL LIGATURE A IE +04D4 ; [.2090.0020.0008] # CYRILLIC CAPITAL LIGATURE A IE +0431 ; [.2094.0020.0002] # CYRILLIC SMALL LETTER BE +2DE0 ; [.2094.0020.0004] # COMBINING CYRILLIC LETTER BE +0411 ; [.2094.0020.0008] # CYRILLIC CAPITAL LETTER BE +0432 ; [.2098.0020.0002] # CYRILLIC SMALL LETTER VE +1C80 ; [.2098.0020.0004] # CYRILLIC SMALL LETTER ROUNDED VE +2DE1 ; [.2098.0020.0004] # COMBINING CYRILLIC LETTER VE +0412 ; [.2098.0020.0008] # CYRILLIC CAPITAL LETTER VE +0433 ; [.209C.0020.0002] # CYRILLIC SMALL LETTER GHE +2DE2 ; [.209C.0020.0004] # COMBINING CYRILLIC LETTER GHE +0413 ; [.209C.0020.0008] # CYRILLIC CAPITAL LETTER GHE +0453 ; [.209C.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER GJE +0403 ; [.209C.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER GJE +0491 ; [.209C.0020.0004][.0000.0112.0004] # CYRILLIC SMALL LETTER GHE WITH UPTURN +0490 ; [.209C.0020.000A][.0000.0112.0004] # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0493 ; [.20A0.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE +0492 ; [.20A0.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE +04FB ; [.20A4.0020.0002] # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +04FA ; [.20A4.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +0495 ; [.20A8.0020.0002] # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +0494 ; [.20A8.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +04F7 ; [.20AC.0020.0002] # CYRILLIC SMALL LETTER GHE WITH DESCENDER +04F6 ; [.20AC.0020.0008] # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +0434 ; [.20B0.0020.0002] # CYRILLIC SMALL LETTER DE +1C81 ; [.20B0.0020.0004] # CYRILLIC SMALL LETTER LONG-LEGGED DE +2DE3 ; [.20B0.0020.0004] # COMBINING CYRILLIC LETTER DE +0414 ; [.20B0.0020.0008] # CYRILLIC CAPITAL LETTER DE +0501 ; [.20B4.0020.0002] # CYRILLIC SMALL LETTER KOMI DE +0500 ; [.20B4.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DE +A681 ; [.20B5.0020.0002] # CYRILLIC SMALL LETTER DWE +A680 ; [.20B5.0020.0008] # CYRILLIC CAPITAL LETTER DWE +0452 ; [.20B6.0020.0002] # CYRILLIC SMALL LETTER DJE +0402 ; [.20B6.0020.0008] # CYRILLIC CAPITAL LETTER DJE +A663 ; [.20BA.0020.0002] # CYRILLIC SMALL LETTER SOFT DE +A662 ; [.20BA.0020.0008] # CYRILLIC CAPITAL LETTER SOFT DE +0503 ; [.20BB.0020.0002] # CYRILLIC SMALL LETTER KOMI DJE +0502 ; [.20BB.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DJE +0499 ; [.20BC.0020.0002] # CYRILLIC SMALL LETTER ZE WITH DESCENDER +0498 ; [.20BC.0020.0008] # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0435 ; [.20C0.0020.0002] # CYRILLIC SMALL LETTER IE +2DF7 ; [.20C0.0020.0004] # COMBINING CYRILLIC LETTER IE +0415 ; [.20C0.0020.0008] # CYRILLIC CAPITAL LETTER IE +0450 ; [.20C0.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER IE WITH GRAVE +0400 ; [.20C0.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER IE WITH GRAVE +04D7 ; [.20C0.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER IE WITH BREVE +04D6 ; [.20C0.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER IE WITH BREVE +0451 ; [.20C0.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER IO +0401 ; [.20C0.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER IO +0454 ; [.20C4.0020.0002] # CYRILLIC SMALL LETTER UKRAINIAN IE +A674 ; [.20C4.0020.0004] # COMBINING CYRILLIC LETTER UKRAINIAN IE +0404 ; [.20C4.0020.0008] # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0436 ; [.20C8.0020.0002] # CYRILLIC SMALL LETTER ZHE +2DE4 ; [.20C8.0020.0004] # COMBINING CYRILLIC LETTER ZHE +0416 ; [.20C8.0020.0008] # CYRILLIC CAPITAL LETTER ZHE +04C2 ; [.20C8.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER ZHE WITH BREVE +04C1 ; [.20C8.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04DD ; [.20C8.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DC ; [.20C8.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +052B ; [.20CC.0020.0002] # CYRILLIC SMALL LETTER DZZHE +052A ; [.20CC.0020.0008] # CYRILLIC CAPITAL LETTER DZZHE +A685 ; [.20CD.0020.0002] # CYRILLIC SMALL LETTER ZHWE +A684 ; [.20CD.0020.0008] # CYRILLIC CAPITAL LETTER ZHWE +0497 ; [.20CE.0020.0002] # CYRILLIC SMALL LETTER ZHE WITH DESCENDER +0496 ; [.20CE.0020.0008] # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0437 ; [.20D2.0020.0002] # CYRILLIC SMALL LETTER ZE +2DE5 ; [.20D2.0020.0004] # COMBINING CYRILLIC LETTER ZE +0417 ; [.20D2.0020.0008] # CYRILLIC CAPITAL LETTER ZE +04DF ; [.20D2.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04DE ; [.20D2.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +A641 ; [.20D6.0020.0002] # CYRILLIC SMALL LETTER ZEMLYA +A640 ; [.20D6.0020.0008] # CYRILLIC CAPITAL LETTER ZEMLYA +0505 ; [.20D7.0020.0002] # CYRILLIC SMALL LETTER KOMI ZJE +0504 ; [.20D7.0020.0008] # CYRILLIC CAPITAL LETTER KOMI ZJE +0511 ; [.20D8.0020.0002] # CYRILLIC SMALL LETTER REVERSED ZE +0510 ; [.20D8.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED ZE +A643 ; [.20D9.0020.0002] # CYRILLIC SMALL LETTER DZELO +A642 ; [.20D9.0020.0008] # CYRILLIC CAPITAL LETTER DZELO +0455 ; [.20DA.0020.0002] # CYRILLIC SMALL LETTER DZE +0405 ; [.20DA.0020.0008] # CYRILLIC CAPITAL LETTER DZE +A645 ; [.20DE.0020.0002] # CYRILLIC SMALL LETTER REVERSED DZE +A644 ; [.20DE.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED DZE +04E1 ; [.20DF.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN DZE +04E0 ; [.20DF.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +A689 ; [.20E3.0020.0002] # CYRILLIC SMALL LETTER DZZE +A688 ; [.20E3.0020.0008] # CYRILLIC CAPITAL LETTER DZZE +0507 ; [.20E4.0020.0002] # CYRILLIC SMALL LETTER KOMI DZJE +0506 ; [.20E4.0020.0008] # CYRILLIC CAPITAL LETTER KOMI DZJE +A683 ; [.20E5.0020.0002] # CYRILLIC SMALL LETTER DZWE +A682 ; [.20E5.0020.0008] # CYRILLIC CAPITAL LETTER DZWE +0438 ; [.20E6.0020.0002] # CYRILLIC SMALL LETTER I +A675 ; [.20E6.0020.0004] # COMBINING CYRILLIC LETTER I +0418 ; [.20E6.0020.0008] # CYRILLIC CAPITAL LETTER I +045D ; [.20E6.0020.0002][.0000.0025.0002] # CYRILLIC SMALL LETTER I WITH GRAVE +040D ; [.20E6.0020.0008][.0000.0025.0002] # CYRILLIC CAPITAL LETTER I WITH GRAVE +04E5 ; [.20E6.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER I WITH DIAERESIS +04E4 ; [.20E6.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E3 ; [.20E6.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER I WITH MACRON +04E2 ; [.20E6.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER I WITH MACRON +048B ; [.20EA.0020.0002] # CYRILLIC SMALL LETTER SHORT I WITH TAIL +048A ; [.20EA.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +0456 ; [.20EE.0020.0002] # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0406 ; [.20EE.0020.0008] # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0457 ; [.20EE.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YI +A676 ; [.20EE.0020.0004][.0000.002B.0004] # COMBINING CYRILLIC LETTER YI +0407 ; [.20EE.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YI +A647 ; [.20F2.0020.0002] # CYRILLIC SMALL LETTER IOTA +A646 ; [.20F2.0020.0008] # CYRILLIC CAPITAL LETTER IOTA +0439 ; [.20F3.0020.0002] # CYRILLIC SMALL LETTER SHORT I +0438 0306 ; [.20F3.0020.0002] # CYRILLIC SMALL LETTER SHORT I +0419 ; [.20F3.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I +0418 0306 ; [.20F3.0020.0008] # CYRILLIC CAPITAL LETTER SHORT I +0458 ; [.20F7.0020.0002] # CYRILLIC SMALL LETTER JE +0408 ; [.20F7.0020.0008] # CYRILLIC CAPITAL LETTER JE +A649 ; [.20FB.0020.0002] # CYRILLIC SMALL LETTER DJERV +2DF8 ; [.20FB.0020.0004] # COMBINING CYRILLIC LETTER DJERV +A648 ; [.20FB.0020.0008] # CYRILLIC CAPITAL LETTER DJERV +043A ; [.20FC.0020.0002] # CYRILLIC SMALL LETTER KA +2DE6 ; [.20FC.0020.0004] # COMBINING CYRILLIC LETTER KA +041A ; [.20FC.0020.0008] # CYRILLIC CAPITAL LETTER KA +045C ; [.20FC.0020.0002][.0000.0024.0002] # CYRILLIC SMALL LETTER KJE +040C ; [.20FC.0020.0008][.0000.0024.0002] # CYRILLIC CAPITAL LETTER KJE +049B ; [.2100.0020.0002] # CYRILLIC SMALL LETTER KA WITH DESCENDER +049A ; [.2100.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +04C4 ; [.2104.0020.0002] # CYRILLIC SMALL LETTER KA WITH HOOK +04C3 ; [.2104.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH HOOK +04A1 ; [.2108.0020.0002] # CYRILLIC SMALL LETTER BASHKIR KA +04A0 ; [.2108.0020.0008] # CYRILLIC CAPITAL LETTER BASHKIR KA +049F ; [.210C.0020.0002] # CYRILLIC SMALL LETTER KA WITH STROKE +049E ; [.210C.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH STROKE +049D ; [.2110.0020.0002] # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +049C ; [.2110.0020.0008] # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +051F ; [.2114.0020.0002] # CYRILLIC SMALL LETTER ALEUT KA +051E ; [.2114.0020.0008] # CYRILLIC CAPITAL LETTER ALEUT KA +051B ; [.2115.0020.0002] # CYRILLIC SMALL LETTER QA +051A ; [.2115.0020.0008] # CYRILLIC CAPITAL LETTER QA +043B ; [.2116.0020.0002] # CYRILLIC SMALL LETTER EL +2DE7 ; [.2116.0020.0004] # COMBINING CYRILLIC LETTER EL +041B ; [.2116.0020.0008] # CYRILLIC CAPITAL LETTER EL +1D2B ; [.211A.0020.0002] # CYRILLIC LETTER SMALL CAPITAL EL +04C6 ; [.211B.0020.0002] # CYRILLIC SMALL LETTER EL WITH TAIL +04C5 ; [.211B.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH TAIL +052F ; [.211F.0020.0002] # CYRILLIC SMALL LETTER EL WITH DESCENDER +052E ; [.211F.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0513 ; [.2120.0020.0002] # CYRILLIC SMALL LETTER EL WITH HOOK +0512 ; [.2120.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH HOOK +0521 ; [.2121.0020.0002] # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +0520 ; [.2121.0020.0008] # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0459 ; [.2122.0020.0002] # CYRILLIC SMALL LETTER LJE +0409 ; [.2122.0020.0008] # CYRILLIC CAPITAL LETTER LJE +A665 ; [.2126.0020.0002] # CYRILLIC SMALL LETTER SOFT EL +A664 ; [.2126.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EL +0509 ; [.2127.0020.0002] # CYRILLIC SMALL LETTER KOMI LJE +0508 ; [.2127.0020.0008] # CYRILLIC CAPITAL LETTER KOMI LJE +0515 ; [.2128.0020.0002] # CYRILLIC SMALL LETTER LHA +0514 ; [.2128.0020.0008] # CYRILLIC CAPITAL LETTER LHA +043C ; [.2129.0020.0002] # CYRILLIC SMALL LETTER EM +2DE8 ; [.2129.0020.0004] # COMBINING CYRILLIC LETTER EM +041C ; [.2129.0020.0008] # CYRILLIC CAPITAL LETTER EM +04CE ; [.212D.0020.0002] # CYRILLIC SMALL LETTER EM WITH TAIL +04CD ; [.212D.0020.0008] # CYRILLIC CAPITAL LETTER EM WITH TAIL +A667 ; [.2131.0020.0002] # CYRILLIC SMALL LETTER SOFT EM +A666 ; [.2131.0020.0008] # CYRILLIC CAPITAL LETTER SOFT EM +043D ; [.2132.0020.0002] # CYRILLIC SMALL LETTER EN +2DE9 ; [.2132.0020.0004] # COMBINING CYRILLIC LETTER EN +041D ; [.2132.0020.0008] # CYRILLIC CAPITAL LETTER EN +1D78 ; [.2132.0020.0014] # MODIFIER LETTER CYRILLIC EN +0529 ; [.2136.0020.0002] # CYRILLIC SMALL LETTER EN WITH LEFT HOOK +0528 ; [.2136.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +04CA ; [.2137.0020.0002] # CYRILLIC SMALL LETTER EN WITH TAIL +04C9 ; [.2137.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH TAIL +04A3 ; [.213B.0020.0002] # CYRILLIC SMALL LETTER EN WITH DESCENDER +04A2 ; [.213B.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04C8 ; [.213F.0020.0002] # CYRILLIC SMALL LETTER EN WITH HOOK +04C7 ; [.213F.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH HOOK +0523 ; [.2143.0020.0002] # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +0522 ; [.2143.0020.0008] # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +04A5 ; [.2144.0020.0002] # CYRILLIC SMALL LIGATURE EN GHE +04A4 ; [.2144.0020.0008] # CYRILLIC CAPITAL LIGATURE EN GHE +045A ; [.2148.0020.0002] # CYRILLIC SMALL LETTER NJE +040A ; [.2148.0020.0008] # CYRILLIC CAPITAL LETTER NJE +050B ; [.214C.0020.0002] # CYRILLIC SMALL LETTER KOMI NJE +050A ; [.214C.0020.0008] # CYRILLIC CAPITAL LETTER KOMI NJE +043E ; [.214D.0020.0002] # CYRILLIC SMALL LETTER O +1C82 ; [.214D.0020.0004] # CYRILLIC SMALL LETTER NARROW O +2DEA ; [.214D.0020.0004] # COMBINING CYRILLIC LETTER O +A669 ; [.214D.0020.0004] # CYRILLIC SMALL LETTER MONOCULAR O +A66B ; [.214D.0020.0004] # CYRILLIC SMALL LETTER BINOCULAR O +A66D ; [.214D.0020.0004] # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; [.214D.0020.0004] # CYRILLIC LETTER MULTIOCULAR O +A699 ; [.214D.0020.0004] # CYRILLIC SMALL LETTER DOUBLE O +A69B ; [.214D.0020.0004] # CYRILLIC SMALL LETTER CROSSED O +041E ; [.214D.0020.0008] # CYRILLIC CAPITAL LETTER O +A668 ; [.214D.0020.000A] # CYRILLIC CAPITAL LETTER MONOCULAR O +A66A ; [.214D.0020.000A] # CYRILLIC CAPITAL LETTER BINOCULAR O +A66C ; [.214D.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A698 ; [.214D.0020.000A] # CYRILLIC CAPITAL LETTER DOUBLE O +A69A ; [.214D.0020.000A] # CYRILLIC CAPITAL LETTER CROSSED O +04E7 ; [.214D.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER O WITH DIAERESIS +04E6 ; [.214D.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E9 ; [.2151.0020.0002] # CYRILLIC SMALL LETTER BARRED O +04E8 ; [.2151.0020.0008] # CYRILLIC CAPITAL LETTER BARRED O +04EB ; [.2151.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EA ; [.2151.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +043F ; [.2155.0020.0002] # CYRILLIC SMALL LETTER PE +2DEB ; [.2155.0020.0004] # COMBINING CYRILLIC LETTER PE +041F ; [.2155.0020.0008] # CYRILLIC CAPITAL LETTER PE +0525 ; [.2159.0020.0002] # CYRILLIC SMALL LETTER PE WITH DESCENDER +0524 ; [.2159.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +04A7 ; [.215A.0020.0002] # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +04A6 ; [.215A.0020.0008] # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +0481 ; [.215E.0020.0002] # CYRILLIC SMALL LETTER KOPPA +0480 ; [.215E.0020.0008] # CYRILLIC CAPITAL LETTER KOPPA +0440 ; [.2162.0020.0002] # CYRILLIC SMALL LETTER ER +2DEC ; [.2162.0020.0004] # COMBINING CYRILLIC LETTER ER +0420 ; [.2162.0020.0008] # CYRILLIC CAPITAL LETTER ER +048F ; [.2166.0020.0002] # CYRILLIC SMALL LETTER ER WITH TICK +048E ; [.2166.0020.0008] # CYRILLIC CAPITAL LETTER ER WITH TICK +0517 ; [.216A.0020.0002] # CYRILLIC SMALL LETTER RHA +0516 ; [.216A.0020.0008] # CYRILLIC CAPITAL LETTER RHA +0441 ; [.216B.0020.0002] # CYRILLIC SMALL LETTER ES +1C83 ; [.216B.0020.0004] # CYRILLIC SMALL LETTER WIDE ES +2DED ; [.216B.0020.0004] # COMBINING CYRILLIC LETTER ES +0421 ; [.216B.0020.0008] # CYRILLIC CAPITAL LETTER ES +2DF5 ; [.216B.0020.0004][.2174.0020.0004] # COMBINING CYRILLIC LETTER ES-TE +050D ; [.216F.0020.0002] # CYRILLIC SMALL LETTER KOMI SJE +050C ; [.216F.0020.0008] # CYRILLIC CAPITAL LETTER KOMI SJE +04AB ; [.2170.0020.0002] # CYRILLIC SMALL LETTER ES WITH DESCENDER +04AA ; [.2170.0020.0008] # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +0442 ; [.2174.0020.0002] # CYRILLIC SMALL LETTER TE +1C84 ; [.2174.0020.0004] # CYRILLIC SMALL LETTER TALL TE +1C85 ; [.2174.0020.0004] # CYRILLIC SMALL LETTER THREE-LEGGED TE +2DEE ; [.2174.0020.0004] # COMBINING CYRILLIC LETTER TE +0422 ; [.2174.0020.0008] # CYRILLIC CAPITAL LETTER TE +A68D ; [.2178.0020.0002] # CYRILLIC SMALL LETTER TWE +A68C ; [.2178.0020.0008] # CYRILLIC CAPITAL LETTER TWE +050F ; [.2179.0020.0002] # CYRILLIC SMALL LETTER KOMI TJE +050E ; [.2179.0020.0008] # CYRILLIC CAPITAL LETTER KOMI TJE +04AD ; [.217A.0020.0002] # CYRILLIC SMALL LETTER TE WITH DESCENDER +04AC ; [.217A.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +A68B ; [.217E.0020.0002] # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +A68A ; [.217E.0020.0008] # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +045B ; [.217F.0020.0002] # CYRILLIC SMALL LETTER TSHE +040B ; [.217F.0020.0008] # CYRILLIC CAPITAL LETTER TSHE +0443 ; [.2183.0020.0002] # CYRILLIC SMALL LETTER U +A677 ; [.2183.0020.0004] # COMBINING CYRILLIC LETTER U +0423 ; [.2183.0020.0008] # CYRILLIC CAPITAL LETTER U +045E ; [.2183.0020.0002][.0000.0026.0002] # CYRILLIC SMALL LETTER SHORT U +040E ; [.2183.0020.0008][.0000.0026.0002] # CYRILLIC CAPITAL LETTER SHORT U +04F1 ; [.2183.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER U WITH DIAERESIS +04F0 ; [.2183.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F3 ; [.2183.0020.0002][.0000.002C.0002] # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F2 ; [.2183.0020.0008][.0000.002C.0002] # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04EF ; [.2183.0020.0002][.0000.0032.0002] # CYRILLIC SMALL LETTER U WITH MACRON +04EE ; [.2183.0020.0008][.0000.0032.0002] # CYRILLIC CAPITAL LETTER U WITH MACRON +04AF ; [.2187.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U +04AE ; [.2187.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U +04B1 ; [.218B.0020.0002] # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +04B0 ; [.218B.0020.0008] # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +A64B ; [.218F.0020.0002] # CYRILLIC SMALL LETTER MONOGRAPH UK +1C88 ; [.218F.0020.0004] # CYRILLIC SMALL LETTER UNBLENDED UK +2DF9 ; [.218F.0020.0004] # COMBINING CYRILLIC LETTER MONOGRAPH UK +A64A ; [.218F.0020.0008] # CYRILLIC CAPITAL LETTER MONOGRAPH UK +0479 ; [.2190.0020.0002] # CYRILLIC SMALL LETTER UK +0478 ; [.2190.0020.0008] # CYRILLIC CAPITAL LETTER UK +0444 ; [.2194.0020.0002] # CYRILLIC SMALL LETTER EF +A69E ; [.2194.0020.0004] # COMBINING CYRILLIC LETTER EF +0424 ; [.2194.0020.0008] # CYRILLIC CAPITAL LETTER EF +0445 ; [.2198.0020.0002] # CYRILLIC SMALL LETTER HA +2DEF ; [.2198.0020.0004] # COMBINING CYRILLIC LETTER HA +0425 ; [.2198.0020.0008] # CYRILLIC CAPITAL LETTER HA +04FD ; [.219C.0020.0002] # CYRILLIC SMALL LETTER HA WITH HOOK +04FC ; [.219C.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH HOOK +04FF ; [.21A0.0020.0002] # CYRILLIC SMALL LETTER HA WITH STROKE +04FE ; [.21A0.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH STROKE +04B3 ; [.21A4.0020.0002] # CYRILLIC SMALL LETTER HA WITH DESCENDER +04B2 ; [.21A4.0020.0008] # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04BB ; [.21A8.0020.0002] # CYRILLIC SMALL LETTER SHHA +04BA ; [.21A8.0020.0008] # CYRILLIC CAPITAL LETTER SHHA +0527 ; [.21AC.0020.0002] # CYRILLIC SMALL LETTER SHHA WITH DESCENDER +0526 ; [.21AC.0020.0008] # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +A695 ; [.21AD.0020.0002] # CYRILLIC SMALL LETTER HWE +A694 ; [.21AD.0020.0008] # CYRILLIC CAPITAL LETTER HWE +0461 ; [.21AE.0020.0002] # CYRILLIC SMALL LETTER OMEGA +A67B ; [.21AE.0020.0004] # COMBINING CYRILLIC LETTER OMEGA +0460 ; [.21AE.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA +047F ; [.21B2.0020.0002] # CYRILLIC SMALL LETTER OT +047E ; [.21B2.0020.0008] # CYRILLIC CAPITAL LETTER OT +A64D ; [.21B6.0020.0002] # CYRILLIC SMALL LETTER BROAD OMEGA +A64C ; [.21B6.0020.0008] # CYRILLIC CAPITAL LETTER BROAD OMEGA +047D ; [.21B7.0020.0002] # CYRILLIC SMALL LETTER OMEGA WITH TITLO +047C ; [.21B7.0020.0008] # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047B ; [.21BB.0020.0002] # CYRILLIC SMALL LETTER ROUND OMEGA +047A ; [.21BB.0020.0008] # CYRILLIC CAPITAL LETTER ROUND OMEGA +0446 ; [.21BF.0020.0002] # CYRILLIC SMALL LETTER TSE +2DF0 ; [.21BF.0020.0004] # COMBINING CYRILLIC LETTER TSE +0426 ; [.21BF.0020.0008] # CYRILLIC CAPITAL LETTER TSE +A661 ; [.21C3.0020.0002] # CYRILLIC SMALL LETTER REVERSED TSE +A660 ; [.21C3.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED TSE +A68F ; [.21C4.0020.0002] # CYRILLIC SMALL LETTER TSWE +A68E ; [.21C4.0020.0008] # CYRILLIC CAPITAL LETTER TSWE +04B5 ; [.21C5.0020.0002] # CYRILLIC SMALL LIGATURE TE TSE +04B4 ; [.21C5.0020.0008] # CYRILLIC CAPITAL LIGATURE TE TSE +A691 ; [.21C9.0020.0002] # CYRILLIC SMALL LETTER TSSE +A690 ; [.21C9.0020.0008] # CYRILLIC CAPITAL LETTER TSSE +0447 ; [.21CA.0020.0002] # CYRILLIC SMALL LETTER CHE +2DF1 ; [.21CA.0020.0004] # COMBINING CYRILLIC LETTER CHE +0427 ; [.21CA.0020.0008] # CYRILLIC CAPITAL LETTER CHE +04F5 ; [.21CA.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F4 ; [.21CA.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +052D ; [.21CE.0020.0002] # CYRILLIC SMALL LETTER DCHE +052C ; [.21CE.0020.0008] # CYRILLIC CAPITAL LETTER DCHE +A693 ; [.21CF.0020.0002] # CYRILLIC SMALL LETTER TCHE +A692 ; [.21CF.0020.0008] # CYRILLIC CAPITAL LETTER TCHE +04B7 ; [.21D0.0020.0002] # CYRILLIC SMALL LETTER CHE WITH DESCENDER +04B6 ; [.21D0.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04CC ; [.21D4.0020.0002] # CYRILLIC SMALL LETTER KHAKASSIAN CHE +04CB ; [.21D4.0020.0008] # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04B9 ; [.21D8.0020.0002] # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +04B8 ; [.21D8.0020.0008] # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +A687 ; [.21DC.0020.0002] # CYRILLIC SMALL LETTER CCHE +A686 ; [.21DC.0020.0008] # CYRILLIC CAPITAL LETTER CCHE +04BD ; [.21DD.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE +04BC ; [.21DD.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BF ; [.21E1.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +04BE ; [.21E1.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +045F ; [.21E5.0020.0002] # CYRILLIC SMALL LETTER DZHE +040F ; [.21E5.0020.0008] # CYRILLIC CAPITAL LETTER DZHE +0448 ; [.21E9.0020.0002] # CYRILLIC SMALL LETTER SHA +2DF2 ; [.21E9.0020.0004] # COMBINING CYRILLIC LETTER SHA +0428 ; [.21E9.0020.0008] # CYRILLIC CAPITAL LETTER SHA +A697 ; [.21ED.0020.0002] # CYRILLIC SMALL LETTER SHWE +A696 ; [.21ED.0020.0008] # CYRILLIC CAPITAL LETTER SHWE +0449 ; [.21EE.0020.0002] # CYRILLIC SMALL LETTER SHCHA +2DF3 ; [.21EE.0020.0004] # COMBINING CYRILLIC LETTER SHCHA +0429 ; [.21EE.0020.0008] # CYRILLIC CAPITAL LETTER SHCHA +A64F ; [.21F2.0020.0002] # CYRILLIC SMALL LETTER NEUTRAL YER +A64E ; [.21F2.0020.0008] # CYRILLIC CAPITAL LETTER NEUTRAL YER +2E2F ; [.21F3.0020.0002] # VERTICAL TILDE +A67F ; [.21F4.0020.0002] # CYRILLIC PAYEROK +044A ; [.21F5.0020.0002] # CYRILLIC SMALL LETTER HARD SIGN +1C86 ; [.21F5.0020.0004] # CYRILLIC SMALL LETTER TALL HARD SIGN +A678 ; [.21F5.0020.0004] # COMBINING CYRILLIC LETTER HARD SIGN +042A ; [.21F5.0020.0008] # CYRILLIC CAPITAL LETTER HARD SIGN +A69C ; [.21F5.0020.0014] # MODIFIER LETTER CYRILLIC HARD SIGN +A651 ; [.21F9.0020.0002] # CYRILLIC SMALL LETTER YERU WITH BACK YER +A650 ; [.21F9.0020.0008] # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +044B ; [.21FA.0020.0002] # CYRILLIC SMALL LETTER YERU +A679 ; [.21FA.0020.0004] # COMBINING CYRILLIC LETTER YERU +042B ; [.21FA.0020.0008] # CYRILLIC CAPITAL LETTER YERU +04F9 ; [.21FA.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER YERU WITH DIAERESIS +04F8 ; [.21FA.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +044C ; [.21FE.0020.0002] # CYRILLIC SMALL LETTER SOFT SIGN +A67A ; [.21FE.0020.0004] # COMBINING CYRILLIC LETTER SOFT SIGN +042C ; [.21FE.0020.0008] # CYRILLIC CAPITAL LETTER SOFT SIGN +A69D ; [.21FE.0020.0014] # MODIFIER LETTER CYRILLIC SOFT SIGN +048D ; [.2202.0020.0002] # CYRILLIC SMALL LETTER SEMISOFT SIGN +048C ; [.2202.0020.0008] # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +0463 ; [.2206.0020.0002] # CYRILLIC SMALL LETTER YAT +1C87 ; [.2206.0020.0004] # CYRILLIC SMALL LETTER TALL YAT +2DFA ; [.2206.0020.0004] # COMBINING CYRILLIC LETTER YAT +0462 ; [.2206.0020.0008] # CYRILLIC CAPITAL LETTER YAT +A653 ; [.220A.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED YAT +A652 ; [.220A.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED YAT +044D ; [.220B.0020.0002] # CYRILLIC SMALL LETTER E +042D ; [.220B.0020.0008] # CYRILLIC CAPITAL LETTER E +04ED ; [.220B.0020.0002][.0000.002B.0002] # CYRILLIC SMALL LETTER E WITH DIAERESIS +04EC ; [.220B.0020.0008][.0000.002B.0002] # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +044E ; [.220F.0020.0002] # CYRILLIC SMALL LETTER YU +2DFB ; [.220F.0020.0004] # COMBINING CYRILLIC LETTER YU +042E ; [.220F.0020.0008] # CYRILLIC CAPITAL LETTER YU +A655 ; [.2213.0020.0002] # CYRILLIC SMALL LETTER REVERSED YU +A654 ; [.2213.0020.0008] # CYRILLIC CAPITAL LETTER REVERSED YU +A657 ; [.2214.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED A +2DFC ; [.2214.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED A +A656 ; [.2214.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED A +044F ; [.2215.0020.0002] # CYRILLIC SMALL LETTER YA +042F ; [.2215.0020.0008] # CYRILLIC CAPITAL LETTER YA +0519 ; [.2219.0020.0002] # CYRILLIC SMALL LETTER YAE +0518 ; [.2219.0020.0008] # CYRILLIC CAPITAL LETTER YAE +0465 ; [.221A.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED E +A69F ; [.221A.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED E +0464 ; [.221A.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED E +0467 ; [.221E.0020.0002] # CYRILLIC SMALL LETTER LITTLE YUS +2DFD ; [.221E.0020.0004] # COMBINING CYRILLIC LETTER LITTLE YUS +0466 ; [.221E.0020.0008] # CYRILLIC CAPITAL LETTER LITTLE YUS +A659 ; [.2222.0020.0002] # CYRILLIC SMALL LETTER CLOSED LITTLE YUS +A658 ; [.2222.0020.0008] # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +046B ; [.2223.0020.0002] # CYRILLIC SMALL LETTER BIG YUS +2DFE ; [.2223.0020.0004] # COMBINING CYRILLIC LETTER BIG YUS +046A ; [.2223.0020.0008] # CYRILLIC CAPITAL LETTER BIG YUS +A65B ; [.2227.0020.0002] # CYRILLIC SMALL LETTER BLENDED YUS +A65A ; [.2227.0020.0008] # CYRILLIC CAPITAL LETTER BLENDED YUS +0469 ; [.2228.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +0468 ; [.2228.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +A65D ; [.222C.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +A65C ; [.222C.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +046D ; [.222D.0020.0002] # CYRILLIC SMALL LETTER IOTIFIED BIG YUS +2DFF ; [.222D.0020.0004] # COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +046C ; [.222D.0020.0008] # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046F ; [.2231.0020.0002] # CYRILLIC SMALL LETTER KSI +046E ; [.2231.0020.0008] # CYRILLIC CAPITAL LETTER KSI +0471 ; [.2235.0020.0002] # CYRILLIC SMALL LETTER PSI +0470 ; [.2235.0020.0008] # CYRILLIC CAPITAL LETTER PSI +0473 ; [.2239.0020.0002] # CYRILLIC SMALL LETTER FITA +2DF4 ; [.2239.0020.0004] # COMBINING CYRILLIC LETTER FITA +0472 ; [.2239.0020.0008] # CYRILLIC CAPITAL LETTER FITA +0475 ; [.223D.0020.0002] # CYRILLIC SMALL LETTER IZHITSA +0474 ; [.223D.0020.0008] # CYRILLIC CAPITAL LETTER IZHITSA +0477 ; [.223D.0020.0002][.0000.003C.0002] # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0476 ; [.223D.0020.0008][.0000.003C.0002] # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +A65F ; [.2241.0020.0002] # CYRILLIC SMALL LETTER YN +A65E ; [.2241.0020.0008] # CYRILLIC CAPITAL LETTER YN +04A9 ; [.2242.0020.0002] # CYRILLIC SMALL LETTER ABKHASIAN HA +04A8 ; [.2242.0020.0008] # CYRILLIC CAPITAL LETTER ABKHASIAN HA +051D ; [.2246.0020.0002] # CYRILLIC SMALL LETTER WE +051C ; [.2246.0020.0008] # CYRILLIC CAPITAL LETTER WE +04CF ; [.2247.0020.0002] # CYRILLIC SMALL LETTER PALOCHKA +04C0 ; [.2247.0020.0008] # CYRILLIC LETTER PALOCHKA +2C30 ; [.224B.0020.0002] # GLAGOLITIC SMALL LETTER AZU +1E000 ; [.224B.0020.0004] # COMBINING GLAGOLITIC LETTER AZU +2C00 ; [.224B.0020.0008] # GLAGOLITIC CAPITAL LETTER AZU +2C31 ; [.224C.0020.0002] # GLAGOLITIC SMALL LETTER BUKY +1E001 ; [.224C.0020.0004] # COMBINING GLAGOLITIC LETTER BUKY +2C01 ; [.224C.0020.0008] # GLAGOLITIC CAPITAL LETTER BUKY +2C32 ; [.224D.0020.0002] # GLAGOLITIC SMALL LETTER VEDE +1E002 ; [.224D.0020.0004] # COMBINING GLAGOLITIC LETTER VEDE +2C02 ; [.224D.0020.0008] # GLAGOLITIC CAPITAL LETTER VEDE +2C33 ; [.224E.0020.0002] # GLAGOLITIC SMALL LETTER GLAGOLI +1E003 ; [.224E.0020.0004] # COMBINING GLAGOLITIC LETTER GLAGOLI +2C03 ; [.224E.0020.0008] # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C34 ; [.224F.0020.0002] # GLAGOLITIC SMALL LETTER DOBRO +1E004 ; [.224F.0020.0004] # COMBINING GLAGOLITIC LETTER DOBRO +2C04 ; [.224F.0020.0008] # GLAGOLITIC CAPITAL LETTER DOBRO +2C35 ; [.2250.0020.0002] # GLAGOLITIC SMALL LETTER YESTU +1E005 ; [.2250.0020.0004] # COMBINING GLAGOLITIC LETTER YESTU +2C05 ; [.2250.0020.0008] # GLAGOLITIC CAPITAL LETTER YESTU +2C36 ; [.2251.0020.0002] # GLAGOLITIC SMALL LETTER ZHIVETE +1E006 ; [.2251.0020.0004] # COMBINING GLAGOLITIC LETTER ZHIVETE +2C06 ; [.2251.0020.0008] # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C37 ; [.2252.0020.0002] # GLAGOLITIC SMALL LETTER DZELO +2C07 ; [.2252.0020.0008] # GLAGOLITIC CAPITAL LETTER DZELO +2C38 ; [.2253.0020.0002] # GLAGOLITIC SMALL LETTER ZEMLJA +1E008 ; [.2253.0020.0004] # COMBINING GLAGOLITIC LETTER ZEMLJA +2C08 ; [.2253.0020.0008] # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C39 ; [.2254.0020.0002] # GLAGOLITIC SMALL LETTER IZHE +1E009 ; [.2254.0020.0004] # COMBINING GLAGOLITIC LETTER IZHE +2C09 ; [.2254.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHE +2C3A ; [.2255.0020.0002] # GLAGOLITIC SMALL LETTER INITIAL IZHE +1E00A ; [.2255.0020.0004] # COMBINING GLAGOLITIC LETTER INITIAL IZHE +2C0A ; [.2255.0020.0008] # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C3B ; [.2256.0020.0002] # GLAGOLITIC SMALL LETTER I +1E00B ; [.2256.0020.0004] # COMBINING GLAGOLITIC LETTER I +2C0B ; [.2256.0020.0008] # GLAGOLITIC CAPITAL LETTER I +2C3C ; [.2257.0020.0002] # GLAGOLITIC SMALL LETTER DJERVI +1E00C ; [.2257.0020.0004] # COMBINING GLAGOLITIC LETTER DJERVI +2C0C ; [.2257.0020.0008] # GLAGOLITIC CAPITAL LETTER DJERVI +2C3D ; [.2258.0020.0002] # GLAGOLITIC SMALL LETTER KAKO +1E00D ; [.2258.0020.0004] # COMBINING GLAGOLITIC LETTER KAKO +2C0D ; [.2258.0020.0008] # GLAGOLITIC CAPITAL LETTER KAKO +2C3E ; [.2259.0020.0002] # GLAGOLITIC SMALL LETTER LJUDIJE +1E00E ; [.2259.0020.0004] # COMBINING GLAGOLITIC LETTER LJUDIJE +2C0E ; [.2259.0020.0008] # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C3F ; [.225A.0020.0002] # GLAGOLITIC SMALL LETTER MYSLITE +1E00F ; [.225A.0020.0004] # COMBINING GLAGOLITIC LETTER MYSLITE +2C0F ; [.225A.0020.0008] # GLAGOLITIC CAPITAL LETTER MYSLITE +2C40 ; [.225B.0020.0002] # GLAGOLITIC SMALL LETTER NASHI +1E010 ; [.225B.0020.0004] # COMBINING GLAGOLITIC LETTER NASHI +2C10 ; [.225B.0020.0008] # GLAGOLITIC CAPITAL LETTER NASHI +2C41 ; [.225C.0020.0002] # GLAGOLITIC SMALL LETTER ONU +1E011 ; [.225C.0020.0004] # COMBINING GLAGOLITIC LETTER ONU +2C11 ; [.225C.0020.0008] # GLAGOLITIC CAPITAL LETTER ONU +2C42 ; [.225D.0020.0002] # GLAGOLITIC SMALL LETTER POKOJI +1E012 ; [.225D.0020.0004] # COMBINING GLAGOLITIC LETTER POKOJI +2C12 ; [.225D.0020.0008] # GLAGOLITIC CAPITAL LETTER POKOJI +2C43 ; [.225E.0020.0002] # GLAGOLITIC SMALL LETTER RITSI +1E013 ; [.225E.0020.0004] # COMBINING GLAGOLITIC LETTER RITSI +2C13 ; [.225E.0020.0008] # GLAGOLITIC CAPITAL LETTER RITSI +2C44 ; [.225F.0020.0002] # GLAGOLITIC SMALL LETTER SLOVO +1E014 ; [.225F.0020.0004] # COMBINING GLAGOLITIC LETTER SLOVO +2C14 ; [.225F.0020.0008] # GLAGOLITIC CAPITAL LETTER SLOVO +2C45 ; [.2260.0020.0002] # GLAGOLITIC SMALL LETTER TVRIDO +1E015 ; [.2260.0020.0004] # COMBINING GLAGOLITIC LETTER TVRIDO +2C15 ; [.2260.0020.0008] # GLAGOLITIC CAPITAL LETTER TVRIDO +2C46 ; [.2261.0020.0002] # GLAGOLITIC SMALL LETTER UKU +1E016 ; [.2261.0020.0004] # COMBINING GLAGOLITIC LETTER UKU +2C16 ; [.2261.0020.0008] # GLAGOLITIC CAPITAL LETTER UKU +2C47 ; [.2262.0020.0002] # GLAGOLITIC SMALL LETTER FRITU +1E017 ; [.2262.0020.0004] # COMBINING GLAGOLITIC LETTER FRITU +2C17 ; [.2262.0020.0008] # GLAGOLITIC CAPITAL LETTER FRITU +2C48 ; [.2263.0020.0002] # GLAGOLITIC SMALL LETTER HERU +1E018 ; [.2263.0020.0004] # COMBINING GLAGOLITIC LETTER HERU +2C18 ; [.2263.0020.0008] # GLAGOLITIC CAPITAL LETTER HERU +2C49 ; [.2264.0020.0002] # GLAGOLITIC SMALL LETTER OTU +2C19 ; [.2264.0020.0008] # GLAGOLITIC CAPITAL LETTER OTU +2C4A ; [.2265.0020.0002] # GLAGOLITIC SMALL LETTER PE +2C1A ; [.2265.0020.0008] # GLAGOLITIC CAPITAL LETTER PE +2C4B ; [.2266.0020.0002] # GLAGOLITIC SMALL LETTER SHTA +1E01B ; [.2266.0020.0004] # COMBINING GLAGOLITIC LETTER SHTA +2C1B ; [.2266.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTA +2C4C ; [.2267.0020.0002] # GLAGOLITIC SMALL LETTER TSI +1E01C ; [.2267.0020.0004] # COMBINING GLAGOLITIC LETTER TSI +2C1C ; [.2267.0020.0008] # GLAGOLITIC CAPITAL LETTER TSI +2C4D ; [.2268.0020.0002] # GLAGOLITIC SMALL LETTER CHRIVI +1E01D ; [.2268.0020.0004] # COMBINING GLAGOLITIC LETTER CHRIVI +2C1D ; [.2268.0020.0008] # GLAGOLITIC CAPITAL LETTER CHRIVI +2C4E ; [.2269.0020.0002] # GLAGOLITIC SMALL LETTER SHA +1E01E ; [.2269.0020.0004] # COMBINING GLAGOLITIC LETTER SHA +2C1E ; [.2269.0020.0008] # GLAGOLITIC CAPITAL LETTER SHA +2C4F ; [.226A.0020.0002] # GLAGOLITIC SMALL LETTER YERU +1E01F ; [.226A.0020.0004] # COMBINING GLAGOLITIC LETTER YERU +2C1F ; [.226A.0020.0008] # GLAGOLITIC CAPITAL LETTER YERU +2C50 ; [.226B.0020.0002] # GLAGOLITIC SMALL LETTER YERI +1E020 ; [.226B.0020.0004] # COMBINING GLAGOLITIC LETTER YERI +2C20 ; [.226B.0020.0008] # GLAGOLITIC CAPITAL LETTER YERI +2C51 ; [.226C.0020.0002] # GLAGOLITIC SMALL LETTER YATI +1E021 ; [.226C.0020.0004] # COMBINING GLAGOLITIC LETTER YATI +2C21 ; [.226C.0020.0008] # GLAGOLITIC CAPITAL LETTER YATI +2C52 ; [.226D.0020.0002] # GLAGOLITIC SMALL LETTER SPIDERY HA +2C22 ; [.226D.0020.0008] # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C53 ; [.226E.0020.0002] # GLAGOLITIC SMALL LETTER YU +1E023 ; [.226E.0020.0004] # COMBINING GLAGOLITIC LETTER YU +2C23 ; [.226E.0020.0008] # GLAGOLITIC CAPITAL LETTER YU +2C54 ; [.226F.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS +1E024 ; [.226F.0020.0004] # COMBINING GLAGOLITIC LETTER SMALL YUS +2C24 ; [.226F.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C55 ; [.2270.0020.0002] # GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +2C25 ; [.2270.0020.0008] # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C56 ; [.2271.0020.0002] # GLAGOLITIC SMALL LETTER YO +1E026 ; [.2271.0020.0004] # COMBINING GLAGOLITIC LETTER YO +2C26 ; [.2271.0020.0008] # GLAGOLITIC CAPITAL LETTER YO +2C57 ; [.2272.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +1E027 ; [.2272.0020.0004] # COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS +2C27 ; [.2272.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C58 ; [.2273.0020.0002] # GLAGOLITIC SMALL LETTER BIG YUS +1E028 ; [.2273.0020.0004] # COMBINING GLAGOLITIC LETTER BIG YUS +2C28 ; [.2273.0020.0008] # GLAGOLITIC CAPITAL LETTER BIG YUS +2C59 ; [.2274.0020.0002] # GLAGOLITIC SMALL LETTER IOTATED BIG YUS +1E029 ; [.2274.0020.0004] # COMBINING GLAGOLITIC LETTER IOTATED BIG YUS +2C29 ; [.2274.0020.0008] # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C5A ; [.2275.0020.0002] # GLAGOLITIC SMALL LETTER FITA +1E02A ; [.2275.0020.0004] # COMBINING GLAGOLITIC LETTER FITA +2C2A ; [.2275.0020.0008] # GLAGOLITIC CAPITAL LETTER FITA +2C5B ; [.2276.0020.0002] # GLAGOLITIC SMALL LETTER IZHITSA +2C2B ; [.2276.0020.0008] # GLAGOLITIC CAPITAL LETTER IZHITSA +2C5C ; [.2277.0020.0002] # GLAGOLITIC SMALL LETTER SHTAPIC +2C2C ; [.2277.0020.0008] # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C5D ; [.2278.0020.0002] # GLAGOLITIC SMALL LETTER TROKUTASTI A +2C2D ; [.2278.0020.0008] # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C5E ; [.2279.0020.0002] # GLAGOLITIC SMALL LETTER LATINATE MYSLITE +2C2E ; [.2279.0020.0008] # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +10350 ; [.227A.0020.0002] # OLD PERMIC LETTER AN +10376 ; [.227A.0020.0004] # COMBINING OLD PERMIC LETTER AN +10351 ; [.227B.0020.0002] # OLD PERMIC LETTER BUR +10352 ; [.227C.0020.0002] # OLD PERMIC LETTER GAI +10353 ; [.227D.0020.0002] # OLD PERMIC LETTER DOI +10377 ; [.227D.0020.0004] # COMBINING OLD PERMIC LETTER DOI +10354 ; [.227E.0020.0002] # OLD PERMIC LETTER E +10355 ; [.227F.0020.0002] # OLD PERMIC LETTER ZHOI +10356 ; [.2280.0020.0002] # OLD PERMIC LETTER DZHOI +10357 ; [.2281.0020.0002] # OLD PERMIC LETTER ZATA +10378 ; [.2281.0020.0004] # COMBINING OLD PERMIC LETTER ZATA +10358 ; [.2282.0020.0002] # OLD PERMIC LETTER DZITA +10359 ; [.2283.0020.0002] # OLD PERMIC LETTER I +1035A ; [.2284.0020.0002] # OLD PERMIC LETTER KOKE +1035B ; [.2285.0020.0002] # OLD PERMIC LETTER LEI +1035C ; [.2286.0020.0002] # OLD PERMIC LETTER MENOE +1035D ; [.2287.0020.0002] # OLD PERMIC LETTER NENOE +10379 ; [.2287.0020.0004] # COMBINING OLD PERMIC LETTER NENOE +1035E ; [.2288.0020.0002] # OLD PERMIC LETTER VOOI +1035F ; [.2289.0020.0002] # OLD PERMIC LETTER PEEI +10360 ; [.228A.0020.0002] # OLD PERMIC LETTER REI +10361 ; [.228B.0020.0002] # OLD PERMIC LETTER SII +1037A ; [.228B.0020.0004] # COMBINING OLD PERMIC LETTER SII +10362 ; [.228C.0020.0002] # OLD PERMIC LETTER TAI +10363 ; [.228D.0020.0002] # OLD PERMIC LETTER U +10364 ; [.228E.0020.0002] # OLD PERMIC LETTER CHERY +10365 ; [.228F.0020.0002] # OLD PERMIC LETTER SHOOI +10366 ; [.2290.0020.0002] # OLD PERMIC LETTER SHCHOOI +10367 ; [.2291.0020.0002] # OLD PERMIC LETTER YRY +10368 ; [.2292.0020.0002] # OLD PERMIC LETTER YERU +10369 ; [.2293.0020.0002] # OLD PERMIC LETTER O +1036A ; [.2294.0020.0002] # OLD PERMIC LETTER OO +1036B ; [.2295.0020.0002] # OLD PERMIC LETTER EF +1036C ; [.2296.0020.0002] # OLD PERMIC LETTER HA +1036D ; [.2297.0020.0002] # OLD PERMIC LETTER TSIU +1036E ; [.2298.0020.0002] # OLD PERMIC LETTER VER +1036F ; [.2299.0020.0002] # OLD PERMIC LETTER YER +10370 ; [.229A.0020.0002] # OLD PERMIC LETTER YERI +10371 ; [.229B.0020.0002] # OLD PERMIC LETTER YAT +10372 ; [.229C.0020.0002] # OLD PERMIC LETTER IE +10373 ; [.229D.0020.0002] # OLD PERMIC LETTER YU +10374 ; [.229E.0020.0002] # OLD PERMIC LETTER YA +10375 ; [.229F.0020.0002] # OLD PERMIC LETTER IA +10D0 ; [.22A0.0020.0002] # GEORGIAN LETTER AN +2D00 ; [.22A1.0020.0002] # GEORGIAN SMALL LETTER AN +10A0 ; [.22A1.0020.0008] # GEORGIAN CAPITAL LETTER AN +10D1 ; [.22A2.0020.0002] # GEORGIAN LETTER BAN +2D01 ; [.22A3.0020.0002] # GEORGIAN SMALL LETTER BAN +10A1 ; [.22A3.0020.0008] # GEORGIAN CAPITAL LETTER BAN +10D2 ; [.22A4.0020.0002] # GEORGIAN LETTER GAN +2D02 ; [.22A5.0020.0002] # GEORGIAN SMALL LETTER GAN +10A2 ; [.22A5.0020.0008] # GEORGIAN CAPITAL LETTER GAN +10D3 ; [.22A6.0020.0002] # GEORGIAN LETTER DON +2D03 ; [.22A7.0020.0002] # GEORGIAN SMALL LETTER DON +10A3 ; [.22A7.0020.0008] # GEORGIAN CAPITAL LETTER DON +10D4 ; [.22A8.0020.0002] # GEORGIAN LETTER EN +2D04 ; [.22A9.0020.0002] # GEORGIAN SMALL LETTER EN +10A4 ; [.22A9.0020.0008] # GEORGIAN CAPITAL LETTER EN +10D5 ; [.22AA.0020.0002] # GEORGIAN LETTER VIN +2D05 ; [.22AB.0020.0002] # GEORGIAN SMALL LETTER VIN +10A5 ; [.22AB.0020.0008] # GEORGIAN CAPITAL LETTER VIN +10D6 ; [.22AC.0020.0002] # GEORGIAN LETTER ZEN +2D06 ; [.22AD.0020.0002] # GEORGIAN SMALL LETTER ZEN +10A6 ; [.22AD.0020.0008] # GEORGIAN CAPITAL LETTER ZEN +10F1 ; [.22AE.0020.0002] # GEORGIAN LETTER HE +2D21 ; [.22AF.0020.0002] # GEORGIAN SMALL LETTER HE +10C1 ; [.22AF.0020.0008] # GEORGIAN CAPITAL LETTER HE +10D7 ; [.22B0.0020.0002] # GEORGIAN LETTER TAN +2D07 ; [.22B1.0020.0002] # GEORGIAN SMALL LETTER TAN +10A7 ; [.22B1.0020.0008] # GEORGIAN CAPITAL LETTER TAN +10D8 ; [.22B2.0020.0002] # GEORGIAN LETTER IN +2D08 ; [.22B3.0020.0002] # GEORGIAN SMALL LETTER IN +10A8 ; [.22B3.0020.0008] # GEORGIAN CAPITAL LETTER IN +10D9 ; [.22B4.0020.0002] # GEORGIAN LETTER KAN +2D09 ; [.22B5.0020.0002] # GEORGIAN SMALL LETTER KAN +10A9 ; [.22B5.0020.0008] # GEORGIAN CAPITAL LETTER KAN +10DA ; [.22B6.0020.0002] # GEORGIAN LETTER LAS +2D0A ; [.22B7.0020.0002] # GEORGIAN SMALL LETTER LAS +10AA ; [.22B7.0020.0008] # GEORGIAN CAPITAL LETTER LAS +10DB ; [.22B8.0020.0002] # GEORGIAN LETTER MAN +2D0B ; [.22B9.0020.0002] # GEORGIAN SMALL LETTER MAN +10AB ; [.22B9.0020.0008] # GEORGIAN CAPITAL LETTER MAN +10DC ; [.22BA.0020.0002] # GEORGIAN LETTER NAR +10FC ; [.22BA.0020.0014] # MODIFIER LETTER GEORGIAN NAR +2D0C ; [.22BB.0020.0002] # GEORGIAN SMALL LETTER NAR +10AC ; [.22BB.0020.0008] # GEORGIAN CAPITAL LETTER NAR +10F2 ; [.22BC.0020.0002] # GEORGIAN LETTER HIE +2D22 ; [.22BD.0020.0002] # GEORGIAN SMALL LETTER HIE +10C2 ; [.22BD.0020.0008] # GEORGIAN CAPITAL LETTER HIE +10DD ; [.22BE.0020.0002] # GEORGIAN LETTER ON +2D0D ; [.22BF.0020.0002] # GEORGIAN SMALL LETTER ON +10AD ; [.22BF.0020.0008] # GEORGIAN CAPITAL LETTER ON +10DE ; [.22C0.0020.0002] # GEORGIAN LETTER PAR +2D0E ; [.22C1.0020.0002] # GEORGIAN SMALL LETTER PAR +10AE ; [.22C1.0020.0008] # GEORGIAN CAPITAL LETTER PAR +10DF ; [.22C2.0020.0002] # GEORGIAN LETTER ZHAR +2D0F ; [.22C3.0020.0002] # GEORGIAN SMALL LETTER ZHAR +10AF ; [.22C3.0020.0008] # GEORGIAN CAPITAL LETTER ZHAR +10E0 ; [.22C4.0020.0002] # GEORGIAN LETTER RAE +2D10 ; [.22C5.0020.0002] # GEORGIAN SMALL LETTER RAE +10B0 ; [.22C5.0020.0008] # GEORGIAN CAPITAL LETTER RAE +10E1 ; [.22C6.0020.0002] # GEORGIAN LETTER SAN +2D11 ; [.22C7.0020.0002] # GEORGIAN SMALL LETTER SAN +10B1 ; [.22C7.0020.0008] # GEORGIAN CAPITAL LETTER SAN +10E2 ; [.22C8.0020.0002] # GEORGIAN LETTER TAR +2D12 ; [.22C9.0020.0002] # GEORGIAN SMALL LETTER TAR +10B2 ; [.22C9.0020.0008] # GEORGIAN CAPITAL LETTER TAR +10F3 ; [.22CA.0020.0002] # GEORGIAN LETTER WE +2D23 ; [.22CB.0020.0002] # GEORGIAN SMALL LETTER WE +10C3 ; [.22CB.0020.0008] # GEORGIAN CAPITAL LETTER WE +10E3 ; [.22CC.0020.0002] # GEORGIAN LETTER UN +2D13 ; [.22CD.0020.0002] # GEORGIAN SMALL LETTER UN +10B3 ; [.22CD.0020.0008] # GEORGIAN CAPITAL LETTER UN +10E4 ; [.22CE.0020.0002] # GEORGIAN LETTER PHAR +2D14 ; [.22CF.0020.0002] # GEORGIAN SMALL LETTER PHAR +10B4 ; [.22CF.0020.0008] # GEORGIAN CAPITAL LETTER PHAR +10E5 ; [.22D0.0020.0002] # GEORGIAN LETTER KHAR +2D15 ; [.22D1.0020.0002] # GEORGIAN SMALL LETTER KHAR +10B5 ; [.22D1.0020.0008] # GEORGIAN CAPITAL LETTER KHAR +10E6 ; [.22D2.0020.0002] # GEORGIAN LETTER GHAN +2D16 ; [.22D3.0020.0002] # GEORGIAN SMALL LETTER GHAN +10B6 ; [.22D3.0020.0008] # GEORGIAN CAPITAL LETTER GHAN +10E7 ; [.22D4.0020.0002] # GEORGIAN LETTER QAR +2D17 ; [.22D5.0020.0002] # GEORGIAN SMALL LETTER QAR +10B7 ; [.22D5.0020.0008] # GEORGIAN CAPITAL LETTER QAR +10E8 ; [.22D6.0020.0002] # GEORGIAN LETTER SHIN +2D18 ; [.22D7.0020.0002] # GEORGIAN SMALL LETTER SHIN +10B8 ; [.22D7.0020.0008] # GEORGIAN CAPITAL LETTER SHIN +10E9 ; [.22D8.0020.0002] # GEORGIAN LETTER CHIN +2D19 ; [.22D9.0020.0002] # GEORGIAN SMALL LETTER CHIN +10B9 ; [.22D9.0020.0008] # GEORGIAN CAPITAL LETTER CHIN +10EA ; [.22DA.0020.0002] # GEORGIAN LETTER CAN +2D1A ; [.22DB.0020.0002] # GEORGIAN SMALL LETTER CAN +10BA ; [.22DB.0020.0008] # GEORGIAN CAPITAL LETTER CAN +10EB ; [.22DC.0020.0002] # GEORGIAN LETTER JIL +2D1B ; [.22DD.0020.0002] # GEORGIAN SMALL LETTER JIL +10BB ; [.22DD.0020.0008] # GEORGIAN CAPITAL LETTER JIL +10EC ; [.22DE.0020.0002] # GEORGIAN LETTER CIL +2D1C ; [.22DF.0020.0002] # GEORGIAN SMALL LETTER CIL +10BC ; [.22DF.0020.0008] # GEORGIAN CAPITAL LETTER CIL +10ED ; [.22E0.0020.0002] # GEORGIAN LETTER CHAR +2D1D ; [.22E1.0020.0002] # GEORGIAN SMALL LETTER CHAR +10BD ; [.22E1.0020.0008] # GEORGIAN CAPITAL LETTER CHAR +10EE ; [.22E2.0020.0002] # GEORGIAN LETTER XAN +2D1E ; [.22E3.0020.0002] # GEORGIAN SMALL LETTER XAN +10BE ; [.22E3.0020.0008] # GEORGIAN CAPITAL LETTER XAN +10F4 ; [.22E4.0020.0002] # GEORGIAN LETTER HAR +2D24 ; [.22E5.0020.0002] # GEORGIAN SMALL LETTER HAR +10C4 ; [.22E5.0020.0008] # GEORGIAN CAPITAL LETTER HAR +10EF ; [.22E6.0020.0002] # GEORGIAN LETTER JHAN +2D1F ; [.22E7.0020.0002] # GEORGIAN SMALL LETTER JHAN +10BF ; [.22E7.0020.0008] # GEORGIAN CAPITAL LETTER JHAN +10F0 ; [.22E8.0020.0002] # GEORGIAN LETTER HAE +2D20 ; [.22E9.0020.0002] # GEORGIAN SMALL LETTER HAE +10C0 ; [.22E9.0020.0008] # GEORGIAN CAPITAL LETTER HAE +10F5 ; [.22EA.0020.0002] # GEORGIAN LETTER HOE +2D25 ; [.22EB.0020.0002] # GEORGIAN SMALL LETTER HOE +10C5 ; [.22EB.0020.0008] # GEORGIAN CAPITAL LETTER HOE +10F6 ; [.22EC.0020.0002] # GEORGIAN LETTER FI +10F7 ; [.22ED.0020.0002] # GEORGIAN LETTER YN +2D27 ; [.22EE.0020.0002] # GEORGIAN SMALL LETTER YN +10C7 ; [.22EE.0020.0008] # GEORGIAN CAPITAL LETTER YN +10F8 ; [.22EF.0020.0002] # GEORGIAN LETTER ELIFI +10F9 ; [.22F0.0020.0002] # GEORGIAN LETTER TURNED GAN +10FA ; [.22F1.0020.0002] # GEORGIAN LETTER AIN +10FD ; [.22F2.0020.0002] # GEORGIAN LETTER AEN +2D2D ; [.22F3.0020.0002] # GEORGIAN SMALL LETTER AEN +10CD ; [.22F3.0020.0008] # GEORGIAN CAPITAL LETTER AEN +10FE ; [.22F4.0020.0002] # GEORGIAN LETTER HARD SIGN +10FF ; [.22F5.0020.0002] # GEORGIAN LETTER LABIAL SIGN +0561 ; [.22F6.0020.0002] # ARMENIAN SMALL LETTER AYB +0531 ; [.22F6.0020.0008] # ARMENIAN CAPITAL LETTER AYB +0562 ; [.22F7.0020.0002] # ARMENIAN SMALL LETTER BEN +0532 ; [.22F7.0020.0008] # ARMENIAN CAPITAL LETTER BEN +0563 ; [.22F8.0020.0002] # ARMENIAN SMALL LETTER GIM +0533 ; [.22F8.0020.0008] # ARMENIAN CAPITAL LETTER GIM +0564 ; [.22F9.0020.0002] # ARMENIAN SMALL LETTER DA +0534 ; [.22F9.0020.0008] # ARMENIAN CAPITAL LETTER DA +0565 ; [.22FA.0020.0002] # ARMENIAN SMALL LETTER ECH +0535 ; [.22FA.0020.0008] # ARMENIAN CAPITAL LETTER ECH +0587 ; [.22FA.0020.0004][.2317.0020.0004] # ARMENIAN SMALL LIGATURE ECH YIWN +0566 ; [.22FB.0020.0002] # ARMENIAN SMALL LETTER ZA +0536 ; [.22FB.0020.0008] # ARMENIAN CAPITAL LETTER ZA +0567 ; [.22FC.0020.0002] # ARMENIAN SMALL LETTER EH +0537 ; [.22FC.0020.0008] # ARMENIAN CAPITAL LETTER EH +0568 ; [.22FD.0020.0002] # ARMENIAN SMALL LETTER ET +0538 ; [.22FD.0020.0008] # ARMENIAN CAPITAL LETTER ET +0569 ; [.22FE.0020.0002] # ARMENIAN SMALL LETTER TO +0539 ; [.22FE.0020.0008] # ARMENIAN CAPITAL LETTER TO +056A ; [.22FF.0020.0002] # ARMENIAN SMALL LETTER ZHE +053A ; [.22FF.0020.0008] # ARMENIAN CAPITAL LETTER ZHE +056B ; [.2300.0020.0002] # ARMENIAN SMALL LETTER INI +053B ; [.2300.0020.0008] # ARMENIAN CAPITAL LETTER INI +056C ; [.2301.0020.0002] # ARMENIAN SMALL LETTER LIWN +053C ; [.2301.0020.0008] # ARMENIAN CAPITAL LETTER LIWN +056D ; [.2302.0020.0002] # ARMENIAN SMALL LETTER XEH +053D ; [.2302.0020.0008] # ARMENIAN CAPITAL LETTER XEH +056E ; [.2303.0020.0002] # ARMENIAN SMALL LETTER CA +053E ; [.2303.0020.0008] # ARMENIAN CAPITAL LETTER CA +056F ; [.2304.0020.0002] # ARMENIAN SMALL LETTER KEN +053F ; [.2304.0020.0008] # ARMENIAN CAPITAL LETTER KEN +0570 ; [.2305.0020.0002] # ARMENIAN SMALL LETTER HO +0540 ; [.2305.0020.0008] # ARMENIAN CAPITAL LETTER HO +0571 ; [.2306.0020.0002] # ARMENIAN SMALL LETTER JA +0541 ; [.2306.0020.0008] # ARMENIAN CAPITAL LETTER JA +0572 ; [.2307.0020.0002] # ARMENIAN SMALL LETTER GHAD +0542 ; [.2307.0020.0008] # ARMENIAN CAPITAL LETTER GHAD +0573 ; [.2308.0020.0002] # ARMENIAN SMALL LETTER CHEH +0543 ; [.2308.0020.0008] # ARMENIAN CAPITAL LETTER CHEH +0574 ; [.2309.0020.0002] # ARMENIAN SMALL LETTER MEN +0544 ; [.2309.0020.0008] # ARMENIAN CAPITAL LETTER MEN +FB14 ; [.2309.0020.0004][.22FA.0020.0004] # ARMENIAN SMALL LIGATURE MEN ECH +FB15 ; [.2309.0020.0004][.2300.0020.0004] # ARMENIAN SMALL LIGATURE MEN INI +FB17 ; [.2309.0020.0004][.2302.0020.0004] # ARMENIAN SMALL LIGATURE MEN XEH +FB13 ; [.2309.0020.0004][.230B.0020.0004] # ARMENIAN SMALL LIGATURE MEN NOW +0575 ; [.230A.0020.0002] # ARMENIAN SMALL LETTER YI +0545 ; [.230A.0020.0008] # ARMENIAN CAPITAL LETTER YI +0576 ; [.230B.0020.0002] # ARMENIAN SMALL LETTER NOW +0546 ; [.230B.0020.0008] # ARMENIAN CAPITAL LETTER NOW +0577 ; [.230C.0020.0002] # ARMENIAN SMALL LETTER SHA +0547 ; [.230C.0020.0008] # ARMENIAN CAPITAL LETTER SHA +0578 ; [.230D.0020.0002] # ARMENIAN SMALL LETTER VO +0548 ; [.230D.0020.0008] # ARMENIAN CAPITAL LETTER VO +0579 ; [.230E.0020.0002] # ARMENIAN SMALL LETTER CHA +0549 ; [.230E.0020.0008] # ARMENIAN CAPITAL LETTER CHA +057A ; [.230F.0020.0002] # ARMENIAN SMALL LETTER PEH +054A ; [.230F.0020.0008] # ARMENIAN CAPITAL LETTER PEH +057B ; [.2310.0020.0002] # ARMENIAN SMALL LETTER JHEH +054B ; [.2310.0020.0008] # ARMENIAN CAPITAL LETTER JHEH +057C ; [.2311.0020.0002] # ARMENIAN SMALL LETTER RA +054C ; [.2311.0020.0008] # ARMENIAN CAPITAL LETTER RA +057D ; [.2312.0020.0002] # ARMENIAN SMALL LETTER SEH +054D ; [.2312.0020.0008] # ARMENIAN CAPITAL LETTER SEH +057E ; [.2313.0020.0002] # ARMENIAN SMALL LETTER VEW +054E ; [.2313.0020.0008] # ARMENIAN CAPITAL LETTER VEW +FB16 ; [.2313.0020.0004][.230B.0020.0004] # ARMENIAN SMALL LIGATURE VEW NOW +057F ; [.2314.0020.0002] # ARMENIAN SMALL LETTER TIWN +054F ; [.2314.0020.0008] # ARMENIAN CAPITAL LETTER TIWN +0580 ; [.2315.0020.0002] # ARMENIAN SMALL LETTER REH +0550 ; [.2315.0020.0008] # ARMENIAN CAPITAL LETTER REH +0581 ; [.2316.0020.0002] # ARMENIAN SMALL LETTER CO +0551 ; [.2316.0020.0008] # ARMENIAN CAPITAL LETTER CO +0582 ; [.2317.0020.0002] # ARMENIAN SMALL LETTER YIWN +0552 ; [.2317.0020.0008] # ARMENIAN CAPITAL LETTER YIWN +0583 ; [.2318.0020.0002] # ARMENIAN SMALL LETTER PIWR +0553 ; [.2318.0020.0008] # ARMENIAN CAPITAL LETTER PIWR +0584 ; [.2319.0020.0002] # ARMENIAN SMALL LETTER KEH +0554 ; [.2319.0020.0008] # ARMENIAN CAPITAL LETTER KEH +0585 ; [.231A.0020.0002] # ARMENIAN SMALL LETTER OH +0555 ; [.231A.0020.0008] # ARMENIAN CAPITAL LETTER OH +0586 ; [.231B.0020.0002] # ARMENIAN SMALL LETTER FEH +0556 ; [.231B.0020.0008] # ARMENIAN CAPITAL LETTER FEH +0559 ; [.231C.0020.0002] # ARMENIAN MODIFIER LETTER LEFT HALF RING +05D0 ; [.231D.0020.0002] # HEBREW LETTER ALEF +2135 ; [.231D.0020.0004] # ALEF SYMBOL +FB21 ; [.231D.0020.0005] # HEBREW LETTER WIDE ALEF +FB2E ; [.231D.0020.0002][.0000.0059.0002] # HEBREW LETTER ALEF WITH PATAH +FB2F ; [.231D.0020.0002][.0000.005A.0002] # HEBREW LETTER ALEF WITH QAMATS +FB30 ; [.231D.0020.0002][.0000.005F.0002] # HEBREW LETTER ALEF WITH MAPIQ +FB4F ; [.231D.0020.0004][.2328.0020.0004] # HEBREW LIGATURE ALEF LAMED +05D1 ; [.231E.0020.0002] # HEBREW LETTER BET +2136 ; [.231E.0020.0004] # BET SYMBOL +FB31 ; [.231E.0020.0002][.0000.005F.0002] # HEBREW LETTER BET WITH DAGESH +FB4C ; [.231E.0020.0002][.0000.0060.0002] # HEBREW LETTER BET WITH RAFE +05D2 ; [.231F.0020.0002] # HEBREW LETTER GIMEL +2137 ; [.231F.0020.0004] # GIMEL SYMBOL +FB32 ; [.231F.0020.0002][.0000.005F.0002] # HEBREW LETTER GIMEL WITH DAGESH +05D3 ; [.2320.0020.0002] # HEBREW LETTER DALET +2138 ; [.2320.0020.0004] # DALET SYMBOL +FB22 ; [.2320.0020.0005] # HEBREW LETTER WIDE DALET +FB33 ; [.2320.0020.0002][.0000.005F.0002] # HEBREW LETTER DALET WITH DAGESH +05D4 ; [.2321.0020.0002] # HEBREW LETTER HE +FB23 ; [.2321.0020.0005] # HEBREW LETTER WIDE HE +FB34 ; [.2321.0020.0002][.0000.005F.0002] # HEBREW LETTER HE WITH MAPIQ +05D5 ; [.2322.0020.0002] # HEBREW LETTER VAV +FB4B ; [.2322.0020.0002][.0000.005B.0002] # HEBREW LETTER VAV WITH HOLAM +FB35 ; [.2322.0020.0002][.0000.005F.0002] # HEBREW LETTER VAV WITH DAGESH +05F0 ; [.2322.0020.0004][.2322.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE VAV +05F1 ; [.2322.0020.0004][.2326.0020.0004] # HEBREW LIGATURE YIDDISH VAV YOD +05D6 ; [.2323.0020.0002] # HEBREW LETTER ZAYIN +FB36 ; [.2323.0020.0002][.0000.005F.0002] # HEBREW LETTER ZAYIN WITH DAGESH +05D7 ; [.2324.0020.0002] # HEBREW LETTER HET +05D8 ; [.2325.0020.0002] # HEBREW LETTER TET +FB38 ; [.2325.0020.0002][.0000.005F.0002] # HEBREW LETTER TET WITH DAGESH +05D9 ; [.2326.0020.0002] # HEBREW LETTER YOD +FB1D ; [.2326.0020.0002][.0000.0056.0002] # HEBREW LETTER YOD WITH HIRIQ +FB39 ; [.2326.0020.0002][.0000.005F.0002] # HEBREW LETTER YOD WITH DAGESH +05F2 ; [.2326.0020.0004][.2326.0020.0004] # HEBREW LIGATURE YIDDISH DOUBLE YOD +FB1F ; [.2326.0020.0004][.2326.0020.0004][.0000.0059.0002] # HEBREW LIGATURE YIDDISH YOD YOD PATAH +05DB ; [.2327.0020.0002] # HEBREW LETTER KAF +FB24 ; [.2327.0020.0005] # HEBREW LETTER WIDE KAF +05DA ; [.2327.0020.0019] # HEBREW LETTER FINAL KAF +FB3B ; [.2327.0020.0002][.0000.005F.0002] # HEBREW LETTER KAF WITH DAGESH +FB3A ; [.2327.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL KAF WITH DAGESH +FB4D ; [.2327.0020.0002][.0000.0060.0002] # HEBREW LETTER KAF WITH RAFE +05DC ; [.2328.0020.0002] # HEBREW LETTER LAMED +FB25 ; [.2328.0020.0005] # HEBREW LETTER WIDE LAMED +FB3C ; [.2328.0020.0002][.0000.005F.0002] # HEBREW LETTER LAMED WITH DAGESH +05DE ; [.2329.0020.0002] # HEBREW LETTER MEM +FB26 ; [.2329.0020.0005] # HEBREW LETTER WIDE FINAL MEM +05DD ; [.2329.0020.0019] # HEBREW LETTER FINAL MEM +FB3E ; [.2329.0020.0002][.0000.005F.0002] # HEBREW LETTER MEM WITH DAGESH +05E0 ; [.232A.0020.0002] # HEBREW LETTER NUN +05DF ; [.232A.0020.0019] # HEBREW LETTER FINAL NUN +FB40 ; [.232A.0020.0002][.0000.005F.0002] # HEBREW LETTER NUN WITH DAGESH +05E1 ; [.232B.0020.0002] # HEBREW LETTER SAMEKH +FB41 ; [.232B.0020.0002][.0000.005F.0002] # HEBREW LETTER SAMEKH WITH DAGESH +05E2 ; [.232C.0020.0002] # HEBREW LETTER AYIN +FB20 ; [.232C.0020.0005] # HEBREW LETTER ALTERNATIVE AYIN +05E4 ; [.232D.0020.0002] # HEBREW LETTER PE +05E3 ; [.232D.0020.0019] # HEBREW LETTER FINAL PE +FB44 ; [.232D.0020.0002][.0000.005F.0002] # HEBREW LETTER PE WITH DAGESH +FB43 ; [.232D.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL PE WITH DAGESH +FB4E ; [.232D.0020.0002][.0000.0060.0002] # HEBREW LETTER PE WITH RAFE +05E6 ; [.232E.0020.0002] # HEBREW LETTER TSADI +05E5 ; [.232E.0020.0019] # HEBREW LETTER FINAL TSADI +FB46 ; [.232E.0020.0002][.0000.005F.0002] # HEBREW LETTER TSADI WITH DAGESH +05E7 ; [.232F.0020.0002] # HEBREW LETTER QOF +FB47 ; [.232F.0020.0002][.0000.005F.0002] # HEBREW LETTER QOF WITH DAGESH +05E8 ; [.2330.0020.0002] # HEBREW LETTER RESH +FB27 ; [.2330.0020.0005] # HEBREW LETTER WIDE RESH +FB48 ; [.2330.0020.0002][.0000.005F.0002] # HEBREW LETTER RESH WITH DAGESH +05E9 ; [.2331.0020.0002] # HEBREW LETTER SHIN +FB2B ; [.2331.0020.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH SIN DOT +FB2A ; [.2331.0020.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH SHIN DOT +FB49 ; [.2331.0020.0002][.0000.005F.0002] # HEBREW LETTER SHIN WITH DAGESH +FB2D ; [.2331.0020.0002][.0000.005F.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2C ; [.2331.0020.0002][.0000.005F.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +05EA ; [.2332.0020.0002] # HEBREW LETTER TAV +FB28 ; [.2332.0020.0005] # HEBREW LETTER WIDE TAV +FB4A ; [.2332.0020.0002][.0000.005F.0002] # HEBREW LETTER TAV WITH DAGESH +10900 ; [.2333.0020.0002] # PHOENICIAN LETTER ALF +10901 ; [.2334.0020.0002] # PHOENICIAN LETTER BET +10902 ; [.2335.0020.0002] # PHOENICIAN LETTER GAML +10903 ; [.2336.0020.0002] # PHOENICIAN LETTER DELT +10904 ; [.2337.0020.0002] # PHOENICIAN LETTER HE +10905 ; [.2338.0020.0002] # PHOENICIAN LETTER WAU +10906 ; [.2339.0020.0002] # PHOENICIAN LETTER ZAI +10907 ; [.233A.0020.0002] # PHOENICIAN LETTER HET +10908 ; [.233B.0020.0002] # PHOENICIAN LETTER TET +10909 ; [.233C.0020.0002] # PHOENICIAN LETTER YOD +1090A ; [.233D.0020.0002] # PHOENICIAN LETTER KAF +1090B ; [.233E.0020.0002] # PHOENICIAN LETTER LAMD +1090C ; [.233F.0020.0002] # PHOENICIAN LETTER MEM +1090D ; [.2340.0020.0002] # PHOENICIAN LETTER NUN +1090E ; [.2341.0020.0002] # PHOENICIAN LETTER SEMK +1090F ; [.2342.0020.0002] # PHOENICIAN LETTER AIN +10910 ; [.2343.0020.0002] # PHOENICIAN LETTER PE +10911 ; [.2344.0020.0002] # PHOENICIAN LETTER SADE +10912 ; [.2345.0020.0002] # PHOENICIAN LETTER QOF +10913 ; [.2346.0020.0002] # PHOENICIAN LETTER ROSH +10914 ; [.2347.0020.0002] # PHOENICIAN LETTER SHIN +10915 ; [.2348.0020.0002] # PHOENICIAN LETTER TAU +0800 ; [.2349.0020.0002] # SAMARITAN LETTER ALAF +0801 ; [.234A.0020.0002] # SAMARITAN LETTER BIT +0802 ; [.234B.0020.0002] # SAMARITAN LETTER GAMAN +0803 ; [.234C.0020.0002] # SAMARITAN LETTER DALAT +0804 ; [.234D.0020.0002] # SAMARITAN LETTER IY +0805 ; [.234E.0020.0002] # SAMARITAN LETTER BAA +0806 ; [.234F.0020.0002] # SAMARITAN LETTER ZEN +0807 ; [.2350.0020.0002] # SAMARITAN LETTER IT +0808 ; [.2351.0020.0002] # SAMARITAN LETTER TIT +0809 ; [.2352.0020.0002] # SAMARITAN LETTER YUT +080A ; [.2353.0020.0002] # SAMARITAN LETTER KAAF +080B ; [.2354.0020.0002] # SAMARITAN LETTER LABAT +080C ; [.2355.0020.0002] # SAMARITAN LETTER MIM +080D ; [.2356.0020.0002] # SAMARITAN LETTER NUN +080E ; [.2357.0020.0002] # SAMARITAN LETTER SINGAAT +080F ; [.2358.0020.0002] # SAMARITAN LETTER IN +0810 ; [.2359.0020.0002] # SAMARITAN LETTER FI +0811 ; [.235A.0020.0002] # SAMARITAN LETTER TSAADIY +0812 ; [.235B.0020.0002] # SAMARITAN LETTER QUF +0813 ; [.235C.0020.0002] # SAMARITAN LETTER RISH +0814 ; [.235D.0020.0002] # SAMARITAN LETTER SHAN +0815 ; [.235E.0020.0002] # SAMARITAN LETTER TAAF +0816 ; [.235F.0020.0002] # SAMARITAN MARK IN +0817 ; [.2360.0020.0002] # SAMARITAN MARK IN-ALAF +081A ; [.2361.0020.0002] # SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B ; [.2362.0020.0002] # SAMARITAN MARK EPENTHETIC YUT +0621 ; [.2363.0020.0002] # ARABIC LETTER HAMZA +0674 ; [.2363.0020.0004] # ARABIC LETTER HIGH HAMZA +FE80 ; [.2363.0020.001A] # ARABIC LETTER HAMZA ISOLATED FORM +06FD ; [.2363.0020.0004][.0000.0112.0004] # ARABIC SIGN SINDHI AMPERSAND +0622 ; [.2364.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE +0627 0653 ; [.2364.0020.0002] # ARABIC LETTER ALEF WITH MADDA ABOVE +FE82 ; [.2364.0020.0019] # ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE81 ; [.2364.0020.001A] # ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +0623 ; [.2365.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE +0627 0654 ; [.2365.0020.0002] # ARABIC LETTER ALEF WITH HAMZA ABOVE +FE84 ; [.2365.0020.0019] # ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE83 ; [.2365.0020.001A] # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +0672 ; [.2366.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE +0671 ; [.2367.0020.0002] # ARABIC LETTER ALEF WASLA +FB51 ; [.2367.0020.0019] # ARABIC LETTER ALEF WASLA FINAL FORM +FB50 ; [.2367.0020.001A] # ARABIC LETTER ALEF WASLA ISOLATED FORM +0624 ; [.2368.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE +0648 0654 ; [.2368.0020.0002] # ARABIC LETTER WAW WITH HAMZA ABOVE +FE86 ; [.2368.0020.0019] # ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE85 ; [.2368.0020.001A] # ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +0625 ; [.2369.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW +0627 0655 ; [.2369.0020.0002] # ARABIC LETTER ALEF WITH HAMZA BELOW +FE88 ; [.2369.0020.0019] # ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE87 ; [.2369.0020.001A] # ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +0673 ; [.236A.0020.0002] # ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0773 ; [.236B.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0774 ; [.236C.0020.0002] # ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0626 ; [.236D.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE +064A 0654 ; [.236D.0020.0002] # ARABIC LETTER YEH WITH HAMZA ABOVE +FE8B ; [.236D.0020.0017] # ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE8C ; [.236D.0020.0018] # ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8A ; [.236D.0020.0019] # ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE89 ; [.236D.0020.001A] # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FBEB ; [.236D.0020.0019][.2371.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEA ; [.236D.0020.001A][.2371.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FC97 ; [.236D.0020.0017][.238B.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC00 ; [.236D.0020.001A][.238B.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC98 ; [.236D.0020.0017][.2392.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC01 ; [.236D.0020.001A][.2392.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC99 ; [.236D.0020.0017][.2393.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC64 ; [.236D.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65 ; [.236D.0020.0019][.23AD.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC9A ; [.236D.0020.0017][.2409.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FCDF ; [.236D.0020.0018][.2409.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FC66 ; [.236D.0020.0019][.2409.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC02 ; [.236D.0020.001A][.2409.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC67 ; [.236D.0020.0019][.240D.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC9B ; [.236D.0020.0017][.2417.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FCE0 ; [.236D.0020.0018][.2417.0020.0018] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FBED ; [.236D.0020.0019][.241C.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEC ; [.236D.0020.001A][.241C.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBEF ; [.236D.0020.0019][.241D.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBEE ; [.236D.0020.001A][.241D.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBF3 ; [.236D.0020.0019][.2420.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF2 ; [.236D.0020.001A][.2420.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF1 ; [.236D.0020.0019][.2421.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF0 ; [.236D.0020.001A][.2421.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF5 ; [.236D.0020.0019][.2422.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF4 ; [.236D.0020.001A][.2422.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBFB ; [.236D.0020.0017][.242B.0020.0017] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFA ; [.236D.0020.0019][.242B.0020.0019] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC68 ; [.236D.0020.0019][.242B.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBF9 ; [.236D.0020.001A][.242B.0020.001A] # ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC03 ; [.236D.0020.001A][.242B.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC69 ; [.236D.0020.0019][.242C.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC04 ; [.236D.0020.001A][.242C.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FBF8 ; [.236D.0020.0017][.2430.0020.0017] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF7 ; [.236D.0020.0019][.2430.0020.0019] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBF6 ; [.236D.0020.001A][.2430.0020.001A] # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +08A8 ; [.236E.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE +08A9 ; [.236F.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE +08AC ; [.2370.0020.0002] # ARABIC LETTER ROHINGYA YEH +0627 ; [.2371.0020.0002] # ARABIC LETTER ALEF +08AD ; [.2371.0020.0004] # ARABIC LETTER LOW ALEF +1EE00 ; [.2371.0020.0005] # ARABIC MATHEMATICAL ALEF +1EE80 ; [.2371.0020.0005] # ARABIC MATHEMATICAL LOOPED ALEF +FE8E ; [.2371.0020.0019] # ARABIC LETTER ALEF FINAL FORM +FE8D ; [.2371.0020.001A] # ARABIC LETTER ALEF ISOLATED FORM +FD3C ; [.2371.0020.0019][.0000.006D.0019] # ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD3D ; [.2371.0020.001A][.0000.006D.001A] # ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +0675 ; [.2371.0020.0004][.2363.0020.0004] # ARABIC LETTER HIGH HAMZA ALEF +FDF3 ; [.2371.0020.001A][.23ED.0020.001A][.2373.0020.001A][.23AC.0020.001A] # ARABIC LIGATURE AKBAR ISOLATED FORM +FDF2 ; [.2371.0020.001A][.2402.0020.001A][.2402.0020.001A][.2417.0020.001A] # ARABIC LIGATURE ALLAH ISOLATED FORM +066E ; [.2372.0020.0002] # ARABIC LETTER DOTLESS BEH +1EE1C ; [.2372.0020.0005] # ARABIC MATHEMATICAL DOTLESS BEH +1EE7C ; [.2372.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +0628 ; [.2373.0020.0002] # ARABIC LETTER BEH +1EE01 ; [.2373.0020.0005] # ARABIC MATHEMATICAL BEH +1EE21 ; [.2373.0020.0005] # ARABIC MATHEMATICAL INITIAL BEH +1EE61 ; [.2373.0020.0005] # ARABIC MATHEMATICAL STRETCHED BEH +1EE81 ; [.2373.0020.0005] # ARABIC MATHEMATICAL LOOPED BEH +1EEA1 ; [.2373.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK BEH +FE91 ; [.2373.0020.0017] # ARABIC LETTER BEH INITIAL FORM +FE92 ; [.2373.0020.0018] # ARABIC LETTER BEH MEDIAL FORM +FE90 ; [.2373.0020.0019] # ARABIC LETTER BEH FINAL FORM +FE8F ; [.2373.0020.001A] # ARABIC LETTER BEH ISOLATED FORM +FC9C ; [.2373.0020.0017][.238B.0020.0017] # ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC05 ; [.2373.0020.001A][.238B.0020.001A] # ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC9D ; [.2373.0020.0017][.2392.0020.0017] # ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC06 ; [.2373.0020.001A][.2392.0020.001A] # ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FDC2 ; [.2373.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FC9E ; [.2373.0020.0017][.2393.0020.0017] # ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC07 ; [.2373.0020.001A][.2393.0020.001A] # ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FD9E ; [.2373.0020.0019][.2393.0020.0019][.242C.0020.0019] # ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FC6A ; [.2373.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B ; [.2373.0020.0019][.23AD.0020.0019] # ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC9F ; [.2373.0020.0017][.2409.0020.0017] # ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCE1 ; [.2373.0020.0018][.2409.0020.0018] # ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FC6C ; [.2373.0020.0019][.2409.0020.0019] # ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC08 ; [.2373.0020.001A][.2409.0020.001A] # ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC6D ; [.2373.0020.0019][.240D.0020.0019] # ARABIC LIGATURE BEH WITH NOON FINAL FORM +FCA0 ; [.2373.0020.0017][.2417.0020.0017] # ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCE2 ; [.2373.0020.0018][.2417.0020.0018] # ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FC6E ; [.2373.0020.0019][.242B.0020.0019] # ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC09 ; [.2373.0020.001A][.242B.0020.001A] # ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC6F ; [.2373.0020.0019][.242C.0020.0019] # ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC0A ; [.2373.0020.001A][.242C.0020.001A] # ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +067B ; [.2374.0020.0002] # ARABIC LETTER BEEH +FB54 ; [.2374.0020.0017] # ARABIC LETTER BEEH INITIAL FORM +FB55 ; [.2374.0020.0018] # ARABIC LETTER BEEH MEDIAL FORM +FB53 ; [.2374.0020.0019] # ARABIC LETTER BEEH FINAL FORM +FB52 ; [.2374.0020.001A] # ARABIC LETTER BEEH ISOLATED FORM +067E ; [.2375.0020.0002] # ARABIC LETTER PEH +FB58 ; [.2375.0020.0017] # ARABIC LETTER PEH INITIAL FORM +FB59 ; [.2375.0020.0018] # ARABIC LETTER PEH MEDIAL FORM +FB57 ; [.2375.0020.0019] # ARABIC LETTER PEH FINAL FORM +FB56 ; [.2375.0020.001A] # ARABIC LETTER PEH ISOLATED FORM +0680 ; [.2376.0020.0002] # ARABIC LETTER BEHEH +FB5C ; [.2376.0020.0017] # ARABIC LETTER BEHEH INITIAL FORM +FB5D ; [.2376.0020.0018] # ARABIC LETTER BEHEH MEDIAL FORM +FB5B ; [.2376.0020.0019] # ARABIC LETTER BEHEH FINAL FORM +FB5A ; [.2376.0020.001A] # ARABIC LETTER BEHEH ISOLATED FORM +0750 ; [.2377.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW +0751 ; [.2378.0020.0002] # ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE +0752 ; [.2379.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW +0753 ; [.237A.0020.0002] # ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE +0754 ; [.237B.0020.0002] # ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE +0755 ; [.237C.0020.0002] # ARABIC LETTER BEH WITH INVERTED SMALL V BELOW +08A0 ; [.237D.0020.0002] # ARABIC LETTER BEH WITH SMALL V BELOW +0756 ; [.237E.0020.0002] # ARABIC LETTER BEH WITH SMALL V +08A1 ; [.237F.0020.0002] # ARABIC LETTER BEH WITH HAMZA ABOVE +08B6 ; [.2380.0020.0002] # ARABIC LETTER BEH WITH SMALL MEEM ABOVE +08B7 ; [.2381.0020.0002] # ARABIC LETTER PEH WITH SMALL MEEM ABOVE +0629 ; [.2382.0020.0002] # ARABIC LETTER TEH MARBUTA +FE94 ; [.2382.0020.0019] # ARABIC LETTER TEH MARBUTA FINAL FORM +FE93 ; [.2382.0020.001A] # ARABIC LETTER TEH MARBUTA ISOLATED FORM +062A ; [.2383.0020.0002] # ARABIC LETTER TEH +1EE15 ; [.2383.0020.0005] # ARABIC MATHEMATICAL TEH +1EE35 ; [.2383.0020.0005] # ARABIC MATHEMATICAL INITIAL TEH +1EE75 ; [.2383.0020.0005] # ARABIC MATHEMATICAL STRETCHED TEH +1EE95 ; [.2383.0020.0005] # ARABIC MATHEMATICAL LOOPED TEH +1EEB5 ; [.2383.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TEH +FE97 ; [.2383.0020.0017] # ARABIC LETTER TEH INITIAL FORM +FE98 ; [.2383.0020.0018] # ARABIC LETTER TEH MEDIAL FORM +FE96 ; [.2383.0020.0019] # ARABIC LETTER TEH FINAL FORM +FE95 ; [.2383.0020.001A] # ARABIC LETTER TEH ISOLATED FORM +FCA1 ; [.2383.0020.0017][.238B.0020.0017] # ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FC0B ; [.2383.0020.001A][.238B.0020.001A] # ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FD50 ; [.2383.0020.0017][.238B.0020.0017][.2409.0020.0017] # ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FDA0 ; [.2383.0020.0019][.238B.0020.0019][.242B.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9F ; [.2383.0020.0019][.238B.0020.0019][.242C.0020.0019] # ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FCA2 ; [.2383.0020.0017][.2392.0020.0017] # ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FC0C ; [.2383.0020.001A][.2392.0020.001A] # ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FD52 ; [.2383.0020.0017][.2392.0020.0017][.238B.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD51 ; [.2383.0020.0019][.2392.0020.0019][.238B.0020.0019] # ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD53 ; [.2383.0020.0017][.2392.0020.0017][.2409.0020.0017] # ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FCA3 ; [.2383.0020.0017][.2393.0020.0017] # ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FC0D ; [.2383.0020.001A][.2393.0020.001A] # ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FD54 ; [.2383.0020.0017][.2393.0020.0017][.2409.0020.0017] # ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FDA2 ; [.2383.0020.0019][.2393.0020.0019][.242B.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA1 ; [.2383.0020.0019][.2393.0020.0019][.242C.0020.0019] # ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FC70 ; [.2383.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71 ; [.2383.0020.0019][.23AD.0020.0019] # ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FCA4 ; [.2383.0020.0017][.2409.0020.0017] # ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCE3 ; [.2383.0020.0018][.2409.0020.0018] # ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FC72 ; [.2383.0020.0019][.2409.0020.0019] # ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC0E ; [.2383.0020.001A][.2409.0020.001A] # ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FD55 ; [.2383.0020.0017][.2409.0020.0017][.238B.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56 ; [.2383.0020.0017][.2409.0020.0017][.2392.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57 ; [.2383.0020.0017][.2409.0020.0017][.2393.0020.0017] # ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FDA4 ; [.2383.0020.0019][.2409.0020.0019][.242B.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA3 ; [.2383.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FC73 ; [.2383.0020.0019][.240D.0020.0019] # ARABIC LIGATURE TEH WITH NOON FINAL FORM +FCA5 ; [.2383.0020.0017][.2417.0020.0017] # ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCE4 ; [.2383.0020.0018][.2417.0020.0018] # ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FC74 ; [.2383.0020.0019][.242B.0020.0019] # ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC0F ; [.2383.0020.001A][.242B.0020.001A] # ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC75 ; [.2383.0020.0019][.242C.0020.0019] # ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC10 ; [.2383.0020.001A][.242C.0020.001A] # ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +062B ; [.2384.0020.0002] # ARABIC LETTER THEH +1EE16 ; [.2384.0020.0005] # ARABIC MATHEMATICAL THEH +1EE36 ; [.2384.0020.0005] # ARABIC MATHEMATICAL INITIAL THEH +1EE76 ; [.2384.0020.0005] # ARABIC MATHEMATICAL STRETCHED THEH +1EE96 ; [.2384.0020.0005] # ARABIC MATHEMATICAL LOOPED THEH +1EEB6 ; [.2384.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THEH +FE9B ; [.2384.0020.0017] # ARABIC LETTER THEH INITIAL FORM +FE9C ; [.2384.0020.0018] # ARABIC LETTER THEH MEDIAL FORM +FE9A ; [.2384.0020.0019] # ARABIC LETTER THEH FINAL FORM +FE99 ; [.2384.0020.001A] # ARABIC LETTER THEH ISOLATED FORM +FC11 ; [.2384.0020.001A][.238B.0020.001A] # ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC76 ; [.2384.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77 ; [.2384.0020.0019][.23AD.0020.0019] # ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FCA6 ; [.2384.0020.0017][.2409.0020.0017] # ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCE5 ; [.2384.0020.0018][.2409.0020.0018] # ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FC78 ; [.2384.0020.0019][.2409.0020.0019] # ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC12 ; [.2384.0020.001A][.2409.0020.001A] # ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC79 ; [.2384.0020.0019][.240D.0020.0019] # ARABIC LIGATURE THEH WITH NOON FINAL FORM +FCE6 ; [.2384.0020.0018][.2417.0020.0018] # ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FC7A ; [.2384.0020.0019][.242B.0020.0019] # ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC13 ; [.2384.0020.001A][.242B.0020.001A] # ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC7B ; [.2384.0020.0019][.242C.0020.0019] # ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC14 ; [.2384.0020.001A][.242C.0020.001A] # ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +0679 ; [.2385.0020.0002] # ARABIC LETTER TTEH +FB68 ; [.2385.0020.0017] # ARABIC LETTER TTEH INITIAL FORM +FB69 ; [.2385.0020.0018] # ARABIC LETTER TTEH MEDIAL FORM +FB67 ; [.2385.0020.0019] # ARABIC LETTER TTEH FINAL FORM +FB66 ; [.2385.0020.001A] # ARABIC LETTER TTEH ISOLATED FORM +067A ; [.2386.0020.0002] # ARABIC LETTER TTEHEH +FB60 ; [.2386.0020.0017] # ARABIC LETTER TTEHEH INITIAL FORM +FB61 ; [.2386.0020.0018] # ARABIC LETTER TTEHEH MEDIAL FORM +FB5F ; [.2386.0020.0019] # ARABIC LETTER TTEHEH FINAL FORM +FB5E ; [.2386.0020.001A] # ARABIC LETTER TTEHEH ISOLATED FORM +067C ; [.2387.0020.0002] # ARABIC LETTER TEH WITH RING +067D ; [.2388.0020.0002] # ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS +067F ; [.2389.0020.0002] # ARABIC LETTER TEHEH +FB64 ; [.2389.0020.0017] # ARABIC LETTER TEHEH INITIAL FORM +FB65 ; [.2389.0020.0018] # ARABIC LETTER TEHEH MEDIAL FORM +FB63 ; [.2389.0020.0019] # ARABIC LETTER TEHEH FINAL FORM +FB62 ; [.2389.0020.001A] # ARABIC LETTER TEHEH ISOLATED FORM +08B8 ; [.238A.0020.0002] # ARABIC LETTER TEH WITH SMALL TEH ABOVE +062C ; [.238B.0020.0002] # ARABIC LETTER JEEM +1EE02 ; [.238B.0020.0005] # ARABIC MATHEMATICAL JEEM +1EE22 ; [.238B.0020.0005] # ARABIC MATHEMATICAL INITIAL JEEM +1EE42 ; [.238B.0020.0005] # ARABIC MATHEMATICAL TAILED JEEM +1EE62 ; [.238B.0020.0005] # ARABIC MATHEMATICAL STRETCHED JEEM +1EE82 ; [.238B.0020.0005] # ARABIC MATHEMATICAL LOOPED JEEM +1EEA2 ; [.238B.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM +FE9F ; [.238B.0020.0017] # ARABIC LETTER JEEM INITIAL FORM +FEA0 ; [.238B.0020.0018] # ARABIC LETTER JEEM MEDIAL FORM +FE9E ; [.238B.0020.0019] # ARABIC LETTER JEEM FINAL FORM +FE9D ; [.238B.0020.001A] # ARABIC LETTER JEEM ISOLATED FORM +FCA7 ; [.238B.0020.0017][.2392.0020.0017] # ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FC15 ; [.238B.0020.001A][.2392.0020.001A] # ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FDA6 ; [.238B.0020.0019][.2392.0020.0019][.242B.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDBE ; [.238B.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDFB ; [.238B.0020.001A][.2402.0020.001A][*0209.0020.001A][.238B.0020.001A][.2402.0020.001A][.2371.0020.001A][.2402.0020.001A][.2417.0020.001A] # ARABIC LIGATURE JALLAJALALOUHOU +FCA8 ; [.238B.0020.0017][.2409.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FC16 ; [.238B.0020.001A][.2409.0020.001A] # ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FD59 ; [.238B.0020.0017][.2409.0020.0017][.2392.0020.0017] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD58 ; [.238B.0020.0019][.2409.0020.0019][.2392.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FDA7 ; [.238B.0020.0019][.2409.0020.0019][.242B.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5 ; [.238B.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FD1D ; [.238B.0020.0019][.242B.0020.0019] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD01 ; [.238B.0020.001A][.242B.0020.001A] # ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD1E ; [.238B.0020.0019][.242C.0020.0019] # ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD02 ; [.238B.0020.001A][.242C.0020.001A] # ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +0683 ; [.238C.0020.0002] # ARABIC LETTER NYEH +FB78 ; [.238C.0020.0017] # ARABIC LETTER NYEH INITIAL FORM +FB79 ; [.238C.0020.0018] # ARABIC LETTER NYEH MEDIAL FORM +FB77 ; [.238C.0020.0019] # ARABIC LETTER NYEH FINAL FORM +FB76 ; [.238C.0020.001A] # ARABIC LETTER NYEH ISOLATED FORM +0684 ; [.238D.0020.0002] # ARABIC LETTER DYEH +FB74 ; [.238D.0020.0017] # ARABIC LETTER DYEH INITIAL FORM +FB75 ; [.238D.0020.0018] # ARABIC LETTER DYEH MEDIAL FORM +FB73 ; [.238D.0020.0019] # ARABIC LETTER DYEH FINAL FORM +FB72 ; [.238D.0020.001A] # ARABIC LETTER DYEH ISOLATED FORM +0686 ; [.238E.0020.0002] # ARABIC LETTER TCHEH +FB7C ; [.238E.0020.0017] # ARABIC LETTER TCHEH INITIAL FORM +FB7D ; [.238E.0020.0018] # ARABIC LETTER TCHEH MEDIAL FORM +FB7B ; [.238E.0020.0019] # ARABIC LETTER TCHEH FINAL FORM +FB7A ; [.238E.0020.001A] # ARABIC LETTER TCHEH ISOLATED FORM +06BF ; [.238F.0020.0002] # ARABIC LETTER TCHEH WITH DOT ABOVE +0687 ; [.2390.0020.0002] # ARABIC LETTER TCHEHEH +FB80 ; [.2390.0020.0017] # ARABIC LETTER TCHEHEH INITIAL FORM +FB81 ; [.2390.0020.0018] # ARABIC LETTER TCHEHEH MEDIAL FORM +FB7F ; [.2390.0020.0019] # ARABIC LETTER TCHEHEH FINAL FORM +FB7E ; [.2390.0020.001A] # ARABIC LETTER TCHEHEH ISOLATED FORM +08A2 ; [.2391.0020.0002] # ARABIC LETTER JEEM WITH TWO DOTS ABOVE +062D ; [.2392.0020.0002] # ARABIC LETTER HAH +1EE07 ; [.2392.0020.0005] # ARABIC MATHEMATICAL HAH +1EE27 ; [.2392.0020.0005] # ARABIC MATHEMATICAL INITIAL HAH +1EE47 ; [.2392.0020.0005] # ARABIC MATHEMATICAL TAILED HAH +1EE67 ; [.2392.0020.0005] # ARABIC MATHEMATICAL STRETCHED HAH +1EE87 ; [.2392.0020.0005] # ARABIC MATHEMATICAL LOOPED HAH +1EEA7 ; [.2392.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK HAH +FEA3 ; [.2392.0020.0017] # ARABIC LETTER HAH INITIAL FORM +FEA4 ; [.2392.0020.0018] # ARABIC LETTER HAH MEDIAL FORM +FEA2 ; [.2392.0020.0019] # ARABIC LETTER HAH FINAL FORM +FEA1 ; [.2392.0020.001A] # ARABIC LETTER HAH ISOLATED FORM +FCA9 ; [.2392.0020.0017][.238B.0020.0017] # ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FC17 ; [.2392.0020.001A][.238B.0020.001A] # ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FDBF ; [.2392.0020.0019][.238B.0020.0019][.242C.0020.0019] # ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FCAA ; [.2392.0020.0017][.2409.0020.0017] # ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FC18 ; [.2392.0020.001A][.2409.0020.001A] # ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FD5B ; [.2392.0020.0019][.2409.0020.0019][.242B.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5A ; [.2392.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD1B ; [.2392.0020.0019][.242B.0020.0019] # ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FCFF ; [.2392.0020.001A][.242B.0020.001A] # ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD1C ; [.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD00 ; [.2392.0020.001A][.242C.0020.001A] # ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +062E ; [.2393.0020.0002] # ARABIC LETTER KHAH +1EE17 ; [.2393.0020.0005] # ARABIC MATHEMATICAL KHAH +1EE37 ; [.2393.0020.0005] # ARABIC MATHEMATICAL INITIAL KHAH +1EE57 ; [.2393.0020.0005] # ARABIC MATHEMATICAL TAILED KHAH +1EE77 ; [.2393.0020.0005] # ARABIC MATHEMATICAL STRETCHED KHAH +1EE97 ; [.2393.0020.0005] # ARABIC MATHEMATICAL LOOPED KHAH +1EEB7 ; [.2393.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH +FEA7 ; [.2393.0020.0017] # ARABIC LETTER KHAH INITIAL FORM +FEA8 ; [.2393.0020.0018] # ARABIC LETTER KHAH MEDIAL FORM +FEA6 ; [.2393.0020.0019] # ARABIC LETTER KHAH FINAL FORM +FEA5 ; [.2393.0020.001A] # ARABIC LETTER KHAH ISOLATED FORM +FCAB ; [.2393.0020.0017][.238B.0020.0017] # ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FC19 ; [.2393.0020.001A][.238B.0020.001A] # ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A ; [.2393.0020.001A][.2392.0020.001A] # ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FCAC ; [.2393.0020.0017][.2409.0020.0017] # ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FC1B ; [.2393.0020.001A][.2409.0020.001A] # ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FD1F ; [.2393.0020.0019][.242B.0020.0019] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD03 ; [.2393.0020.001A][.242B.0020.001A] # ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD20 ; [.2393.0020.0019][.242C.0020.0019] # ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD04 ; [.2393.0020.001A][.242C.0020.001A] # ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +0681 ; [.2394.0020.0002] # ARABIC LETTER HAH WITH HAMZA ABOVE +0682 ; [.2395.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE +0685 ; [.2396.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS ABOVE +0757 ; [.2397.0020.0002] # ARABIC LETTER HAH WITH TWO DOTS ABOVE +0758 ; [.2398.0020.0002] # ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW +076E ; [.2399.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW +076F ; [.239A.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS +0772 ; [.239B.0020.0002] # ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE +077C ; [.239C.0020.0002] # ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW +062F ; [.239D.0020.0002] # ARABIC LETTER DAL +1EE03 ; [.239D.0020.0005] # ARABIC MATHEMATICAL DAL +1EE83 ; [.239D.0020.0005] # ARABIC MATHEMATICAL LOOPED DAL +1EEA3 ; [.239D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +FEAA ; [.239D.0020.0019] # ARABIC LETTER DAL FINAL FORM +FEA9 ; [.239D.0020.001A] # ARABIC LETTER DAL ISOLATED FORM +0630 ; [.239E.0020.0002] # ARABIC LETTER THAL +1EE18 ; [.239E.0020.0005] # ARABIC MATHEMATICAL THAL +1EE98 ; [.239E.0020.0005] # ARABIC MATHEMATICAL LOOPED THAL +1EEB8 ; [.239E.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK THAL +FEAC ; [.239E.0020.0019] # ARABIC LETTER THAL FINAL FORM +FEAB ; [.239E.0020.001A] # ARABIC LETTER THAL ISOLATED FORM +FC5B ; [.239E.0020.001A][.0000.0098.001A] # ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +0688 ; [.239F.0020.0002] # ARABIC LETTER DDAL +FB89 ; [.239F.0020.0019] # ARABIC LETTER DDAL FINAL FORM +FB88 ; [.239F.0020.001A] # ARABIC LETTER DDAL ISOLATED FORM +0689 ; [.23A0.0020.0002] # ARABIC LETTER DAL WITH RING +068A ; [.23A1.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW +068B ; [.23A2.0020.0002] # ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH +068C ; [.23A3.0020.0002] # ARABIC LETTER DAHAL +FB85 ; [.23A3.0020.0019] # ARABIC LETTER DAHAL FINAL FORM +FB84 ; [.23A3.0020.001A] # ARABIC LETTER DAHAL ISOLATED FORM +068D ; [.23A4.0020.0002] # ARABIC LETTER DDAHAL +FB83 ; [.23A4.0020.0019] # ARABIC LETTER DDAHAL FINAL FORM +FB82 ; [.23A4.0020.001A] # ARABIC LETTER DDAHAL ISOLATED FORM +08AE ; [.23A5.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS BELOW +068E ; [.23A6.0020.0002] # ARABIC LETTER DUL +FB87 ; [.23A6.0020.0019] # ARABIC LETTER DUL FINAL FORM +FB86 ; [.23A6.0020.001A] # ARABIC LETTER DUL ISOLATED FORM +068F ; [.23A7.0020.0002] # ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS +0690 ; [.23A8.0020.0002] # ARABIC LETTER DAL WITH FOUR DOTS ABOVE +06EE ; [.23A9.0020.0002] # ARABIC LETTER DAL WITH INVERTED V +0759 ; [.23AA.0020.0002] # ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH +075A ; [.23AB.0020.0002] # ARABIC LETTER DAL WITH INVERTED SMALL V BELOW +0631 ; [.23AC.0020.0002] # ARABIC LETTER REH +1EE13 ; [.23AC.0020.0005] # ARABIC MATHEMATICAL REH +1EE93 ; [.23AC.0020.0005] # ARABIC MATHEMATICAL LOOPED REH +1EEB3 ; [.23AC.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK REH +FEAE ; [.23AC.0020.0019] # ARABIC LETTER REH FINAL FORM +FEAD ; [.23AC.0020.001A] # ARABIC LETTER REH ISOLATED FORM +FC5C ; [.23AC.0020.001A][.0000.0098.001A] # ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FDF6 ; [.23AC.0020.001A][.23BF.0020.001A][.241D.0020.001A][.2402.0020.001A] # ARABIC LIGATURE RASOUL ISOLATED FORM +FDFC ; [.23AC.0020.001A][.242D.0020.001A][.2371.0020.001A][.2402.0020.001A] # RIAL SIGN +0632 ; [.23AD.0020.0002] # ARABIC LETTER ZAIN +1EE06 ; [.23AD.0020.0005] # ARABIC MATHEMATICAL ZAIN +1EE86 ; [.23AD.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAIN +1EEA6 ; [.23AD.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN +FEB0 ; [.23AD.0020.0019] # ARABIC LETTER ZAIN FINAL FORM +FEAF ; [.23AD.0020.001A] # ARABIC LETTER ZAIN ISOLATED FORM +0691 ; [.23AE.0020.0002] # ARABIC LETTER RREH +FB8D ; [.23AE.0020.0019] # ARABIC LETTER RREH FINAL FORM +FB8C ; [.23AE.0020.001A] # ARABIC LETTER RREH ISOLATED FORM +0692 ; [.23AF.0020.0002] # ARABIC LETTER REH WITH SMALL V +0693 ; [.23B0.0020.0002] # ARABIC LETTER REH WITH RING +0694 ; [.23B1.0020.0002] # ARABIC LETTER REH WITH DOT BELOW +0695 ; [.23B2.0020.0002] # ARABIC LETTER REH WITH SMALL V BELOW +0696 ; [.23B3.0020.0002] # ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE +0697 ; [.23B4.0020.0002] # ARABIC LETTER REH WITH TWO DOTS ABOVE +0698 ; [.23B5.0020.0002] # ARABIC LETTER JEH +FB8B ; [.23B5.0020.0019] # ARABIC LETTER JEH FINAL FORM +FB8A ; [.23B5.0020.001A] # ARABIC LETTER JEH ISOLATED FORM +0699 ; [.23B6.0020.0002] # ARABIC LETTER REH WITH FOUR DOTS ABOVE +06EF ; [.23B7.0020.0002] # ARABIC LETTER REH WITH INVERTED V +075B ; [.23B8.0020.0002] # ARABIC LETTER REH WITH STROKE +076B ; [.23B9.0020.0002] # ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE +076C ; [.23BA.0020.0002] # ARABIC LETTER REH WITH HAMZA ABOVE +0771 ; [.23BB.0020.0002] # ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS +08AA ; [.23BC.0020.0002] # ARABIC LETTER REH WITH LOOP +08B2 ; [.23BD.0020.0002] # ARABIC LETTER ZAIN WITH INVERTED V ABOVE +08B9 ; [.23BE.0020.0002] # ARABIC LETTER REH WITH SMALL NOON ABOVE +0633 ; [.23BF.0020.0002] # ARABIC LETTER SEEN +1EE0E ; [.23BF.0020.0005] # ARABIC MATHEMATICAL SEEN +1EE2E ; [.23BF.0020.0005] # ARABIC MATHEMATICAL INITIAL SEEN +1EE4E ; [.23BF.0020.0005] # ARABIC MATHEMATICAL TAILED SEEN +1EE6E ; [.23BF.0020.0005] # ARABIC MATHEMATICAL STRETCHED SEEN +1EE8E ; [.23BF.0020.0005] # ARABIC MATHEMATICAL LOOPED SEEN +1EEAE ; [.23BF.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN +FEB3 ; [.23BF.0020.0017] # ARABIC LETTER SEEN INITIAL FORM +FEB4 ; [.23BF.0020.0018] # ARABIC LETTER SEEN MEDIAL FORM +FEB2 ; [.23BF.0020.0019] # ARABIC LETTER SEEN FINAL FORM +FEB1 ; [.23BF.0020.001A] # ARABIC LETTER SEEN ISOLATED FORM +FCAD ; [.23BF.0020.0017][.238B.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FD34 ; [.23BF.0020.0018][.238B.0020.0018] # ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FC1C ; [.23BF.0020.001A][.238B.0020.001A] # ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FD5D ; [.23BF.0020.0017][.238B.0020.0017][.2392.0020.0017] # ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E ; [.23BF.0020.0019][.238B.0020.0019][.242B.0020.0019] # ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FCAE ; [.23BF.0020.0017][.2392.0020.0017] # ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FD35 ; [.23BF.0020.0018][.2392.0020.0018] # ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FC1D ; [.23BF.0020.001A][.2392.0020.001A] # ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FD5C ; [.23BF.0020.0017][.2392.0020.0017][.238B.0020.0017] # ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FCAF ; [.23BF.0020.0017][.2393.0020.0017] # ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FD36 ; [.23BF.0020.0018][.2393.0020.0018] # ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FC1E ; [.23BF.0020.001A][.2393.0020.001A] # ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FDA8 ; [.23BF.0020.0019][.2393.0020.0019][.242B.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDC6 ; [.23BF.0020.0019][.2393.0020.0019][.242C.0020.0019] # ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FD2A ; [.23BF.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD0E ; [.23BF.0020.001A][.23AC.0020.001A] # ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FCB0 ; [.23BF.0020.0017][.2409.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCE7 ; [.23BF.0020.0018][.2409.0020.0018] # ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FC1F ; [.23BF.0020.001A][.2409.0020.001A] # ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FD61 ; [.23BF.0020.0017][.2409.0020.0017][.238B.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD60 ; [.23BF.0020.0017][.2409.0020.0017][.2392.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD5F ; [.23BF.0020.0019][.2409.0020.0019][.2392.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD63 ; [.23BF.0020.0017][.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD62 ; [.23BF.0020.0019][.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD31 ; [.23BF.0020.0017][.2417.0020.0017] # ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FCE8 ; [.23BF.0020.0018][.2417.0020.0018] # ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FD17 ; [.23BF.0020.0019][.242B.0020.0019] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FCFB ; [.23BF.0020.001A][.242B.0020.001A] # ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FD18 ; [.23BF.0020.0019][.242C.0020.0019] # ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FCFC ; [.23BF.0020.001A][.242C.0020.001A] # ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +0634 ; [.23C0.0020.0002] # ARABIC LETTER SHEEN +1EE14 ; [.23C0.0020.0005] # ARABIC MATHEMATICAL SHEEN +1EE34 ; [.23C0.0020.0005] # ARABIC MATHEMATICAL INITIAL SHEEN +1EE54 ; [.23C0.0020.0005] # ARABIC MATHEMATICAL TAILED SHEEN +1EE74 ; [.23C0.0020.0005] # ARABIC MATHEMATICAL STRETCHED SHEEN +1EE94 ; [.23C0.0020.0005] # ARABIC MATHEMATICAL LOOPED SHEEN +1EEB4 ; [.23C0.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN +FEB7 ; [.23C0.0020.0017] # ARABIC LETTER SHEEN INITIAL FORM +FEB8 ; [.23C0.0020.0018] # ARABIC LETTER SHEEN MEDIAL FORM +FEB6 ; [.23C0.0020.0019] # ARABIC LETTER SHEEN FINAL FORM +FEB5 ; [.23C0.0020.001A] # ARABIC LETTER SHEEN ISOLATED FORM +FD2D ; [.23C0.0020.0017][.238B.0020.0017] # ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD37 ; [.23C0.0020.0018][.238B.0020.0018] # ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD25 ; [.23C0.0020.0019][.238B.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD09 ; [.23C0.0020.001A][.238B.0020.001A] # ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD69 ; [.23C0.0020.0019][.238B.0020.0019][.242C.0020.0019] # ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD2E ; [.23C0.0020.0017][.2392.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD38 ; [.23C0.0020.0018][.2392.0020.0018] # ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD26 ; [.23C0.0020.0019][.2392.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD0A ; [.23C0.0020.001A][.2392.0020.001A] # ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD68 ; [.23C0.0020.0017][.2392.0020.0017][.2409.0020.0017] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD67 ; [.23C0.0020.0019][.2392.0020.0019][.2409.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FDAA ; [.23C0.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FD2F ; [.23C0.0020.0017][.2393.0020.0017] # ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD39 ; [.23C0.0020.0018][.2393.0020.0018] # ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD27 ; [.23C0.0020.0019][.2393.0020.0019] # ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD0B ; [.23C0.0020.001A][.2393.0020.001A] # ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD29 ; [.23C0.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD0D ; [.23C0.0020.001A][.23AC.0020.001A] # ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD30 ; [.23C0.0020.0017][.2409.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FCE9 ; [.23C0.0020.0018][.2409.0020.0018] # ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FD28 ; [.23C0.0020.0019][.2409.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD0C ; [.23C0.0020.001A][.2409.0020.001A] # ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD6B ; [.23C0.0020.0017][.2409.0020.0017][.2393.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6A ; [.23C0.0020.0019][.2409.0020.0019][.2393.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6D ; [.23C0.0020.0017][.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6C ; [.23C0.0020.0019][.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD32 ; [.23C0.0020.0017][.2417.0020.0017] # ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FCEA ; [.23C0.0020.0018][.2417.0020.0018] # ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FD19 ; [.23C0.0020.0019][.242B.0020.0019] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FCFD ; [.23C0.0020.001A][.242B.0020.001A] # ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FD1A ; [.23C0.0020.0019][.242C.0020.0019] # ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FCFE ; [.23C0.0020.001A][.242C.0020.001A] # ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +069A ; [.23C1.0020.0002] # ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE +069B ; [.23C2.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW +069C ; [.23C3.0020.0002] # ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE +06FA ; [.23C4.0020.0002] # ARABIC LETTER SHEEN WITH DOT BELOW +075C ; [.23C5.0020.0002] # ARABIC LETTER SEEN WITH FOUR DOTS ABOVE +076D ; [.23C6.0020.0002] # ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +0770 ; [.23C7.0020.0002] # ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS +077D ; [.23C8.0020.0002] # ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE +077E ; [.23C9.0020.0002] # ARABIC LETTER SEEN WITH INVERTED V +0635 ; [.23CA.0020.0002] # ARABIC LETTER SAD +1EE11 ; [.23CA.0020.0005] # ARABIC MATHEMATICAL SAD +1EE31 ; [.23CA.0020.0005] # ARABIC MATHEMATICAL INITIAL SAD +1EE51 ; [.23CA.0020.0005] # ARABIC MATHEMATICAL TAILED SAD +1EE71 ; [.23CA.0020.0005] # ARABIC MATHEMATICAL STRETCHED SAD +1EE91 ; [.23CA.0020.0005] # ARABIC MATHEMATICAL LOOPED SAD +1EEB1 ; [.23CA.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK SAD +FEBB ; [.23CA.0020.0017] # ARABIC LETTER SAD INITIAL FORM +FEBC ; [.23CA.0020.0018] # ARABIC LETTER SAD MEDIAL FORM +FEBA ; [.23CA.0020.0019] # ARABIC LETTER SAD FINAL FORM +FEB9 ; [.23CA.0020.001A] # ARABIC LETTER SAD ISOLATED FORM +FCB1 ; [.23CA.0020.0017][.2392.0020.0017] # ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FC20 ; [.23CA.0020.001A][.2392.0020.001A] # ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FD65 ; [.23CA.0020.0017][.2392.0020.0017][.2392.0020.0017] # ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD64 ; [.23CA.0020.0019][.2392.0020.0019][.2392.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FDA9 ; [.23CA.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FCB2 ; [.23CA.0020.0017][.2393.0020.0017] # ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FD2B ; [.23CA.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE SAD WITH REH FINAL FORM +FD0F ; [.23CA.0020.001A][.23AC.0020.001A] # ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FDF5 ; [.23CA.0020.001A][.2402.0020.001A][.23D4.0020.001A][.2409.0020.001A] # ARABIC LIGATURE SALAM ISOLATED FORM +FDF9 ; [.23CA.0020.001A][.2402.0020.001A][.242B.0020.001A] # ARABIC LIGATURE SALLA ISOLATED FORM +FDFA ; [.23CA.0020.001A][.2402.0020.001A][.242B.0020.001A][*0209.0020.001A][.2371.0020.001A][.2402.0020.001A][.2402.0020.001A][.2417.0020.001A][*0209.0020.001A][.23D4.0020.001A][.2402.0020.001A][.242C.0020.001A][.2417.0020.001A][*0209.0020.001A][.241D.0020.001A][.23BF.0020.001A][.2402.0020.001A][.2409.0020.001A] # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDF0 ; [.23CA.0020.001A][.2402.0020.001A][.243A.0020.001A] # ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FCB3 ; [.23CA.0020.0017][.2409.0020.0017] # ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FC21 ; [.23CA.0020.001A][.2409.0020.001A] # ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FDC5 ; [.23CA.0020.0017][.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FD66 ; [.23CA.0020.0019][.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD21 ; [.23CA.0020.0019][.242B.0020.0019] # ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD05 ; [.23CA.0020.001A][.242B.0020.001A] # ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD22 ; [.23CA.0020.0019][.242C.0020.0019] # ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD06 ; [.23CA.0020.001A][.242C.0020.001A] # ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +0636 ; [.23CB.0020.0002] # ARABIC LETTER DAD +1EE19 ; [.23CB.0020.0005] # ARABIC MATHEMATICAL DAD +1EE39 ; [.23CB.0020.0005] # ARABIC MATHEMATICAL INITIAL DAD +1EE59 ; [.23CB.0020.0005] # ARABIC MATHEMATICAL TAILED DAD +1EE79 ; [.23CB.0020.0005] # ARABIC MATHEMATICAL STRETCHED DAD +1EE99 ; [.23CB.0020.0005] # ARABIC MATHEMATICAL LOOPED DAD +1EEB9 ; [.23CB.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK DAD +FEBF ; [.23CB.0020.0017] # ARABIC LETTER DAD INITIAL FORM +FEC0 ; [.23CB.0020.0018] # ARABIC LETTER DAD MEDIAL FORM +FEBE ; [.23CB.0020.0019] # ARABIC LETTER DAD FINAL FORM +FEBD ; [.23CB.0020.001A] # ARABIC LETTER DAD ISOLATED FORM +FCB4 ; [.23CB.0020.0017][.238B.0020.0017] # ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FC22 ; [.23CB.0020.001A][.238B.0020.001A] # ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FCB5 ; [.23CB.0020.0017][.2392.0020.0017] # ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FC23 ; [.23CB.0020.001A][.2392.0020.001A] # ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FD6E ; [.23CB.0020.0019][.2392.0020.0019][.242B.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FDAB ; [.23CB.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FCB6 ; [.23CB.0020.0017][.2393.0020.0017] # ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FC24 ; [.23CB.0020.001A][.2393.0020.001A] # ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FD70 ; [.23CB.0020.0017][.2393.0020.0017][.2409.0020.0017] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD6F ; [.23CB.0020.0019][.2393.0020.0019][.2409.0020.0019] # ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD2C ; [.23CB.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE DAD WITH REH FINAL FORM +FD10 ; [.23CB.0020.001A][.23AC.0020.001A] # ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FCB7 ; [.23CB.0020.0017][.2409.0020.0017] # ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FC25 ; [.23CB.0020.001A][.2409.0020.001A] # ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FD23 ; [.23CB.0020.0019][.242B.0020.0019] # ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD07 ; [.23CB.0020.001A][.242B.0020.001A] # ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD24 ; [.23CB.0020.0019][.242C.0020.0019] # ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD08 ; [.23CB.0020.001A][.242C.0020.001A] # ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +069D ; [.23CC.0020.0002] # ARABIC LETTER SAD WITH TWO DOTS BELOW +08AF ; [.23CD.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS BELOW +069E ; [.23CE.0020.0002] # ARABIC LETTER SAD WITH THREE DOTS ABOVE +06FB ; [.23CF.0020.0002] # ARABIC LETTER DAD WITH DOT BELOW +0637 ; [.23D0.0020.0002] # ARABIC LETTER TAH +1EE08 ; [.23D0.0020.0005] # ARABIC MATHEMATICAL TAH +1EE68 ; [.23D0.0020.0005] # ARABIC MATHEMATICAL STRETCHED TAH +1EE88 ; [.23D0.0020.0005] # ARABIC MATHEMATICAL LOOPED TAH +1EEA8 ; [.23D0.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK TAH +FEC3 ; [.23D0.0020.0017] # ARABIC LETTER TAH INITIAL FORM +FEC4 ; [.23D0.0020.0018] # ARABIC LETTER TAH MEDIAL FORM +FEC2 ; [.23D0.0020.0019] # ARABIC LETTER TAH FINAL FORM +FEC1 ; [.23D0.0020.001A] # ARABIC LETTER TAH ISOLATED FORM +FCB8 ; [.23D0.0020.0017][.2392.0020.0017] # ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FC26 ; [.23D0.0020.001A][.2392.0020.001A] # ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FD33 ; [.23D0.0020.0017][.2409.0020.0017] # ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD3A ; [.23D0.0020.0018][.2409.0020.0018] # ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FC27 ; [.23D0.0020.001A][.2409.0020.001A] # ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FD72 ; [.23D0.0020.0017][.2409.0020.0017][.2392.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD71 ; [.23D0.0020.0019][.2409.0020.0019][.2392.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD73 ; [.23D0.0020.0017][.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74 ; [.23D0.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD11 ; [.23D0.0020.0019][.242B.0020.0019] # ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FCF5 ; [.23D0.0020.001A][.242B.0020.001A] # ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FD12 ; [.23D0.0020.0019][.242C.0020.0019] # ARABIC LIGATURE TAH WITH YEH FINAL FORM +FCF6 ; [.23D0.0020.001A][.242C.0020.001A] # ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +0638 ; [.23D1.0020.0002] # ARABIC LETTER ZAH +1EE1A ; [.23D1.0020.0005] # ARABIC MATHEMATICAL ZAH +1EE7A ; [.23D1.0020.0005] # ARABIC MATHEMATICAL STRETCHED ZAH +1EE9A ; [.23D1.0020.0005] # ARABIC MATHEMATICAL LOOPED ZAH +1EEBA ; [.23D1.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH +FEC7 ; [.23D1.0020.0017] # ARABIC LETTER ZAH INITIAL FORM +FEC8 ; [.23D1.0020.0018] # ARABIC LETTER ZAH MEDIAL FORM +FEC6 ; [.23D1.0020.0019] # ARABIC LETTER ZAH FINAL FORM +FEC5 ; [.23D1.0020.001A] # ARABIC LETTER ZAH ISOLATED FORM +FCB9 ; [.23D1.0020.0017][.2409.0020.0017] # ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FD3B ; [.23D1.0020.0018][.2409.0020.0018] # ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FC28 ; [.23D1.0020.001A][.2409.0020.001A] # ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +069F ; [.23D2.0020.0002] # ARABIC LETTER TAH WITH THREE DOTS ABOVE +08A3 ; [.23D3.0020.0002] # ARABIC LETTER TAH WITH TWO DOTS ABOVE +0639 ; [.23D4.0020.0002] # ARABIC LETTER AIN +1EE0F ; [.23D4.0020.0005] # ARABIC MATHEMATICAL AIN +1EE2F ; [.23D4.0020.0005] # ARABIC MATHEMATICAL INITIAL AIN +1EE4F ; [.23D4.0020.0005] # ARABIC MATHEMATICAL TAILED AIN +1EE6F ; [.23D4.0020.0005] # ARABIC MATHEMATICAL STRETCHED AIN +1EE8F ; [.23D4.0020.0005] # ARABIC MATHEMATICAL LOOPED AIN +1EEAF ; [.23D4.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK AIN +FECB ; [.23D4.0020.0017] # ARABIC LETTER AIN INITIAL FORM +FECC ; [.23D4.0020.0018] # ARABIC LETTER AIN MEDIAL FORM +FECA ; [.23D4.0020.0019] # ARABIC LETTER AIN FINAL FORM +FEC9 ; [.23D4.0020.001A] # ARABIC LETTER AIN ISOLATED FORM +FCBA ; [.23D4.0020.0017][.238B.0020.0017] # ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FC29 ; [.23D4.0020.001A][.238B.0020.001A] # ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FDC4 ; [.23D4.0020.0017][.238B.0020.0017][.2409.0020.0017] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FD75 ; [.23D4.0020.0019][.238B.0020.0019][.2409.0020.0019] # ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FDF7 ; [.23D4.0020.001A][.2402.0020.001A][.242C.0020.001A][.2417.0020.001A] # ARABIC LIGATURE ALAYHE ISOLATED FORM +FCBB ; [.23D4.0020.0017][.2409.0020.0017] # ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FC2A ; [.23D4.0020.001A][.2409.0020.001A] # ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FD77 ; [.23D4.0020.0017][.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD76 ; [.23D4.0020.0019][.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD78 ; [.23D4.0020.0019][.2409.0020.0019][.242B.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDB6 ; [.23D4.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FD13 ; [.23D4.0020.0019][.242B.0020.0019] # ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FCF7 ; [.23D4.0020.001A][.242B.0020.001A] # ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FD14 ; [.23D4.0020.0019][.242C.0020.0019] # ARABIC LIGATURE AIN WITH YEH FINAL FORM +FCF8 ; [.23D4.0020.001A][.242C.0020.001A] # ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +063A ; [.23D5.0020.0002] # ARABIC LETTER GHAIN +1EE1B ; [.23D5.0020.0005] # ARABIC MATHEMATICAL GHAIN +1EE3B ; [.23D5.0020.0005] # ARABIC MATHEMATICAL INITIAL GHAIN +1EE5B ; [.23D5.0020.0005] # ARABIC MATHEMATICAL TAILED GHAIN +1EE7B ; [.23D5.0020.0005] # ARABIC MATHEMATICAL STRETCHED GHAIN +1EE9B ; [.23D5.0020.0005] # ARABIC MATHEMATICAL LOOPED GHAIN +1EEBB ; [.23D5.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +FECF ; [.23D5.0020.0017] # ARABIC LETTER GHAIN INITIAL FORM +FED0 ; [.23D5.0020.0018] # ARABIC LETTER GHAIN MEDIAL FORM +FECE ; [.23D5.0020.0019] # ARABIC LETTER GHAIN FINAL FORM +FECD ; [.23D5.0020.001A] # ARABIC LETTER GHAIN ISOLATED FORM +FCBC ; [.23D5.0020.0017][.238B.0020.0017] # ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FC2B ; [.23D5.0020.001A][.238B.0020.001A] # ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FCBD ; [.23D5.0020.0017][.2409.0020.0017] # ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FC2C ; [.23D5.0020.001A][.2409.0020.001A] # ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FD79 ; [.23D5.0020.0019][.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7B ; [.23D5.0020.0019][.2409.0020.0019][.242B.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7A ; [.23D5.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD15 ; [.23D5.0020.0019][.242B.0020.0019] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FCF9 ; [.23D5.0020.001A][.242B.0020.001A] # ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FD16 ; [.23D5.0020.0019][.242C.0020.0019] # ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FCFA ; [.23D5.0020.001A][.242C.0020.001A] # ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +06A0 ; [.23D6.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS ABOVE +06FC ; [.23D7.0020.0002] # ARABIC LETTER GHAIN WITH DOT BELOW +075D ; [.23D8.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS ABOVE +075E ; [.23D9.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE +075F ; [.23DA.0020.0002] # ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE +08B3 ; [.23DB.0020.0002] # ARABIC LETTER AIN WITH THREE DOTS BELOW +0641 ; [.23DC.0020.0002] # ARABIC LETTER FEH +1EE10 ; [.23DC.0020.0005] # ARABIC MATHEMATICAL FEH +1EE30 ; [.23DC.0020.0005] # ARABIC MATHEMATICAL INITIAL FEH +1EE70 ; [.23DC.0020.0005] # ARABIC MATHEMATICAL STRETCHED FEH +1EE90 ; [.23DC.0020.0005] # ARABIC MATHEMATICAL LOOPED FEH +1EEB0 ; [.23DC.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK FEH +FED3 ; [.23DC.0020.0017] # ARABIC LETTER FEH INITIAL FORM +FED4 ; [.23DC.0020.0018] # ARABIC LETTER FEH MEDIAL FORM +FED2 ; [.23DC.0020.0019] # ARABIC LETTER FEH FINAL FORM +FED1 ; [.23DC.0020.001A] # ARABIC LETTER FEH ISOLATED FORM +FCBE ; [.23DC.0020.0017][.238B.0020.0017] # ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FC2D ; [.23DC.0020.001A][.238B.0020.001A] # ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FCBF ; [.23DC.0020.0017][.2392.0020.0017] # ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FC2E ; [.23DC.0020.001A][.2392.0020.001A] # ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FCC0 ; [.23DC.0020.0017][.2393.0020.0017] # ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FC2F ; [.23DC.0020.001A][.2393.0020.001A] # ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FD7D ; [.23DC.0020.0017][.2393.0020.0017][.2409.0020.0017] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7C ; [.23DC.0020.0019][.2393.0020.0019][.2409.0020.0019] # ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FCC1 ; [.23DC.0020.0017][.2409.0020.0017] # ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FC30 ; [.23DC.0020.001A][.2409.0020.001A] # ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FDC1 ; [.23DC.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FC7C ; [.23DC.0020.0019][.242B.0020.0019] # ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC31 ; [.23DC.0020.001A][.242B.0020.001A] # ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC7D ; [.23DC.0020.0019][.242C.0020.0019] # ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC32 ; [.23DC.0020.001A][.242C.0020.001A] # ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +06A1 ; [.23DD.0020.0002] # ARABIC LETTER DOTLESS FEH +1EE1E ; [.23DD.0020.0005] # ARABIC MATHEMATICAL DOTLESS FEH +1EE7E ; [.23DD.0020.0005] # ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +06A2 ; [.23DE.0020.0002] # ARABIC LETTER FEH WITH DOT MOVED BELOW +08BB ; [.23DF.0020.0002] # ARABIC LETTER AFRICAN FEH +06A3 ; [.23E0.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW +06A4 ; [.23E1.0020.0002] # ARABIC LETTER VEH +FB6C ; [.23E1.0020.0017] # ARABIC LETTER VEH INITIAL FORM +FB6D ; [.23E1.0020.0018] # ARABIC LETTER VEH MEDIAL FORM +FB6B ; [.23E1.0020.0019] # ARABIC LETTER VEH FINAL FORM +FB6A ; [.23E1.0020.001A] # ARABIC LETTER VEH ISOLATED FORM +08A4 ; [.23E2.0020.0002] # ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE +06A5 ; [.23E3.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS BELOW +06A6 ; [.23E4.0020.0002] # ARABIC LETTER PEHEH +FB70 ; [.23E4.0020.0017] # ARABIC LETTER PEHEH INITIAL FORM +FB71 ; [.23E4.0020.0018] # ARABIC LETTER PEHEH MEDIAL FORM +FB6F ; [.23E4.0020.0019] # ARABIC LETTER PEHEH FINAL FORM +FB6E ; [.23E4.0020.001A] # ARABIC LETTER PEHEH ISOLATED FORM +0760 ; [.23E5.0020.0002] # ARABIC LETTER FEH WITH TWO DOTS BELOW +0761 ; [.23E6.0020.0002] # ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW +066F ; [.23E7.0020.0002] # ARABIC LETTER DOTLESS QAF +1EE1F ; [.23E7.0020.0005] # ARABIC MATHEMATICAL DOTLESS QAF +1EE5F ; [.23E7.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS QAF +0642 ; [.23E8.0020.0002] # ARABIC LETTER QAF +1EE12 ; [.23E8.0020.0005] # ARABIC MATHEMATICAL QAF +1EE32 ; [.23E8.0020.0005] # ARABIC MATHEMATICAL INITIAL QAF +1EE52 ; [.23E8.0020.0005] # ARABIC MATHEMATICAL TAILED QAF +1EE72 ; [.23E8.0020.0005] # ARABIC MATHEMATICAL STRETCHED QAF +1EE92 ; [.23E8.0020.0005] # ARABIC MATHEMATICAL LOOPED QAF +1EEB2 ; [.23E8.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK QAF +FED7 ; [.23E8.0020.0017] # ARABIC LETTER QAF INITIAL FORM +FED8 ; [.23E8.0020.0018] # ARABIC LETTER QAF MEDIAL FORM +FED6 ; [.23E8.0020.0019] # ARABIC LETTER QAF FINAL FORM +FED5 ; [.23E8.0020.001A] # ARABIC LETTER QAF ISOLATED FORM +FCC2 ; [.23E8.0020.0017][.2392.0020.0017] # ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FC33 ; [.23E8.0020.001A][.2392.0020.001A] # ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FDF1 ; [.23E8.0020.001A][.2402.0020.001A][.243A.0020.001A] # ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FCC3 ; [.23E8.0020.0017][.2409.0020.0017] # ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FC34 ; [.23E8.0020.001A][.2409.0020.001A] # ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FDB4 ; [.23E8.0020.0017][.2409.0020.0017][.2392.0020.0017] # ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FD7E ; [.23E8.0020.0019][.2409.0020.0019][.2392.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F ; [.23E8.0020.0019][.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FDB2 ; [.23E8.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FC7E ; [.23E8.0020.0019][.242B.0020.0019] # ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC35 ; [.23E8.0020.001A][.242B.0020.001A] # ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC7F ; [.23E8.0020.0019][.242C.0020.0019] # ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC36 ; [.23E8.0020.001A][.242C.0020.001A] # ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +06A7 ; [.23E9.0020.0002] # ARABIC LETTER QAF WITH DOT ABOVE +08BC ; [.23EA.0020.0002] # ARABIC LETTER AFRICAN QAF +06A8 ; [.23EB.0020.0002] # ARABIC LETTER QAF WITH THREE DOTS ABOVE +08A5 ; [.23EC.0020.0002] # ARABIC LETTER QAF WITH DOT BELOW +0643 ; [.23ED.0020.0002] # ARABIC LETTER KAF +1EE0A ; [.23ED.0020.0005] # ARABIC MATHEMATICAL KAF +1EE2A ; [.23ED.0020.0005] # ARABIC MATHEMATICAL INITIAL KAF +1EE6A ; [.23ED.0020.0005] # ARABIC MATHEMATICAL STRETCHED KAF +FEDB ; [.23ED.0020.0017] # ARABIC LETTER KAF INITIAL FORM +FEDC ; [.23ED.0020.0018] # ARABIC LETTER KAF MEDIAL FORM +FEDA ; [.23ED.0020.0019] # ARABIC LETTER KAF FINAL FORM +FED9 ; [.23ED.0020.001A] # ARABIC LETTER KAF ISOLATED FORM +FC80 ; [.23ED.0020.0019][.2371.0020.0019] # ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC37 ; [.23ED.0020.001A][.2371.0020.001A] # ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FCC4 ; [.23ED.0020.0017][.238B.0020.0017] # ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FC38 ; [.23ED.0020.001A][.238B.0020.001A] # ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FCC5 ; [.23ED.0020.0017][.2392.0020.0017] # ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FC39 ; [.23ED.0020.001A][.2392.0020.001A] # ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FCC6 ; [.23ED.0020.0017][.2393.0020.0017] # ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FC3A ; [.23ED.0020.001A][.2393.0020.001A] # ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FCC7 ; [.23ED.0020.0017][.2402.0020.0017] # ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCEB ; [.23ED.0020.0018][.2402.0020.0018] # ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FC81 ; [.23ED.0020.0019][.2402.0020.0019] # ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC3B ; [.23ED.0020.001A][.2402.0020.001A] # ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FCC8 ; [.23ED.0020.0017][.2409.0020.0017] # ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCEC ; [.23ED.0020.0018][.2409.0020.0018] # ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FC82 ; [.23ED.0020.0019][.2409.0020.0019] # ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC3C ; [.23ED.0020.001A][.2409.0020.001A] # ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FDC3 ; [.23ED.0020.0017][.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDBB ; [.23ED.0020.0019][.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDB7 ; [.23ED.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FC83 ; [.23ED.0020.0019][.242B.0020.0019] # ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC3D ; [.23ED.0020.001A][.242B.0020.001A] # ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC84 ; [.23ED.0020.0019][.242C.0020.0019] # ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC3E ; [.23ED.0020.001A][.242C.0020.001A] # ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +06A9 ; [.23EE.0020.0002] # ARABIC LETTER KEHEH +FB90 ; [.23EE.0020.0017] # ARABIC LETTER KEHEH INITIAL FORM +FB91 ; [.23EE.0020.0018] # ARABIC LETTER KEHEH MEDIAL FORM +FB8F ; [.23EE.0020.0019] # ARABIC LETTER KEHEH FINAL FORM +FB8E ; [.23EE.0020.001A] # ARABIC LETTER KEHEH ISOLATED FORM +06AA ; [.23EF.0020.0002] # ARABIC LETTER SWASH KAF +06AB ; [.23F0.0020.0002] # ARABIC LETTER KAF WITH RING +06AC ; [.23F1.0020.0002] # ARABIC LETTER KAF WITH DOT ABOVE +077F ; [.23F2.0020.0002] # ARABIC LETTER KAF WITH TWO DOTS ABOVE +06AD ; [.23F3.0020.0002] # ARABIC LETTER NG +FBD5 ; [.23F3.0020.0017] # ARABIC LETTER NG INITIAL FORM +FBD6 ; [.23F3.0020.0018] # ARABIC LETTER NG MEDIAL FORM +FBD4 ; [.23F3.0020.0019] # ARABIC LETTER NG FINAL FORM +FBD3 ; [.23F3.0020.001A] # ARABIC LETTER NG ISOLATED FORM +06AE ; [.23F4.0020.0002] # ARABIC LETTER KAF WITH THREE DOTS BELOW +08B4 ; [.23F5.0020.0002] # ARABIC LETTER KAF WITH DOT BELOW +06AF ; [.23F6.0020.0002] # ARABIC LETTER GAF +FB94 ; [.23F6.0020.0017] # ARABIC LETTER GAF INITIAL FORM +FB95 ; [.23F6.0020.0018] # ARABIC LETTER GAF MEDIAL FORM +FB93 ; [.23F6.0020.0019] # ARABIC LETTER GAF FINAL FORM +FB92 ; [.23F6.0020.001A] # ARABIC LETTER GAF ISOLATED FORM +08B0 ; [.23F7.0020.0002] # ARABIC LETTER GAF WITH INVERTED STROKE +06B0 ; [.23F8.0020.0002] # ARABIC LETTER GAF WITH RING +06B1 ; [.23F9.0020.0002] # ARABIC LETTER NGOEH +FB9C ; [.23F9.0020.0017] # ARABIC LETTER NGOEH INITIAL FORM +FB9D ; [.23F9.0020.0018] # ARABIC LETTER NGOEH MEDIAL FORM +FB9B ; [.23F9.0020.0019] # ARABIC LETTER NGOEH FINAL FORM +FB9A ; [.23F9.0020.001A] # ARABIC LETTER NGOEH ISOLATED FORM +06B2 ; [.23FA.0020.0002] # ARABIC LETTER GAF WITH TWO DOTS BELOW +06B3 ; [.23FB.0020.0002] # ARABIC LETTER GUEH +FB98 ; [.23FB.0020.0017] # ARABIC LETTER GUEH INITIAL FORM +FB99 ; [.23FB.0020.0018] # ARABIC LETTER GUEH MEDIAL FORM +FB97 ; [.23FB.0020.0019] # ARABIC LETTER GUEH FINAL FORM +FB96 ; [.23FB.0020.001A] # ARABIC LETTER GUEH ISOLATED FORM +06B4 ; [.23FC.0020.0002] # ARABIC LETTER GAF WITH THREE DOTS ABOVE +0762 ; [.23FD.0020.0002] # ARABIC LETTER KEHEH WITH DOT ABOVE +063B ; [.23FE.0020.0002] # ARABIC LETTER KEHEH WITH TWO DOTS ABOVE +063C ; [.23FF.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS BELOW +0763 ; [.2400.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS ABOVE +0764 ; [.2401.0020.0002] # ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW +0644 ; [.2402.0020.0002] # ARABIC LETTER LAM +1EE0B ; [.2402.0020.0005] # ARABIC MATHEMATICAL LAM +1EE2B ; [.2402.0020.0005] # ARABIC MATHEMATICAL INITIAL LAM +1EE4B ; [.2402.0020.0005] # ARABIC MATHEMATICAL TAILED LAM +1EE8B ; [.2402.0020.0005] # ARABIC MATHEMATICAL LOOPED LAM +1EEAB ; [.2402.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK LAM +FEDF ; [.2402.0020.0017] # ARABIC LETTER LAM INITIAL FORM +FEE0 ; [.2402.0020.0018] # ARABIC LETTER LAM MEDIAL FORM +FEDE ; [.2402.0020.0019] # ARABIC LETTER LAM FINAL FORM +FEDD ; [.2402.0020.001A] # ARABIC LETTER LAM ISOLATED FORM +FEF6 ; [.2402.0020.0019][.2364.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF5 ; [.2402.0020.001A][.2364.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF8 ; [.2402.0020.0019][.2365.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF7 ; [.2402.0020.001A][.2365.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEFA ; [.2402.0020.0019][.2369.0020.0019] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEF9 ; [.2402.0020.001A][.2369.0020.001A] # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFC ; [.2402.0020.0019][.2371.0020.0019] # ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFB ; [.2402.0020.001A][.2371.0020.001A] # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +FCC9 ; [.2402.0020.0017][.238B.0020.0017] # ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FC3F ; [.2402.0020.001A][.238B.0020.001A] # ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FD83 ; [.2402.0020.0017][.238B.0020.0017][.238B.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD84 ; [.2402.0020.0019][.238B.0020.0019][.238B.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FDBA ; [.2402.0020.0017][.238B.0020.0017][.2409.0020.0017] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBC ; [.2402.0020.0019][.238B.0020.0019][.2409.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDAC ; [.2402.0020.0019][.238B.0020.0019][.242C.0020.0019] # ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FCCA ; [.2402.0020.0017][.2392.0020.0017] # ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FC40 ; [.2402.0020.001A][.2392.0020.001A] # ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FDB5 ; [.2402.0020.0017][.2392.0020.0017][.2409.0020.0017] # ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FD80 ; [.2402.0020.0019][.2392.0020.0019][.2409.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD82 ; [.2402.0020.0019][.2392.0020.0019][.242B.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD81 ; [.2402.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FCCB ; [.2402.0020.0017][.2393.0020.0017] # ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FC41 ; [.2402.0020.001A][.2393.0020.001A] # ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FD86 ; [.2402.0020.0017][.2393.0020.0017][.2409.0020.0017] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD85 ; [.2402.0020.0019][.2393.0020.0019][.2409.0020.0019] # ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FCCC ; [.2402.0020.0017][.2409.0020.0017] # ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCED ; [.2402.0020.0018][.2409.0020.0018] # ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FC85 ; [.2402.0020.0019][.2409.0020.0019] # ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC42 ; [.2402.0020.001A][.2409.0020.001A] # ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FD88 ; [.2402.0020.0017][.2409.0020.0017][.2392.0020.0017] # ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD87 ; [.2402.0020.0019][.2409.0020.0019][.2392.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FDAD ; [.2402.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FCCD ; [.2402.0020.0017][.2417.0020.0017] # ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FC86 ; [.2402.0020.0019][.242B.0020.0019] # ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC43 ; [.2402.0020.001A][.242B.0020.001A] # ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC87 ; [.2402.0020.0019][.242C.0020.0019] # ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC44 ; [.2402.0020.001A][.242C.0020.001A] # ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +06B5 ; [.2403.0020.0002] # ARABIC LETTER LAM WITH SMALL V +06B6 ; [.2404.0020.0002] # ARABIC LETTER LAM WITH DOT ABOVE +06B7 ; [.2405.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS ABOVE +06B8 ; [.2406.0020.0002] # ARABIC LETTER LAM WITH THREE DOTS BELOW +076A ; [.2407.0020.0002] # ARABIC LETTER LAM WITH BAR +08A6 ; [.2408.0020.0002] # ARABIC LETTER LAM WITH DOUBLE BAR +0645 ; [.2409.0020.0002] # ARABIC LETTER MEEM +1EE0C ; [.2409.0020.0005] # ARABIC MATHEMATICAL MEEM +1EE2C ; [.2409.0020.0005] # ARABIC MATHEMATICAL INITIAL MEEM +1EE6C ; [.2409.0020.0005] # ARABIC MATHEMATICAL STRETCHED MEEM +1EE8C ; [.2409.0020.0005] # ARABIC MATHEMATICAL LOOPED MEEM +1EEAC ; [.2409.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM +FEE3 ; [.2409.0020.0017] # ARABIC LETTER MEEM INITIAL FORM +FEE4 ; [.2409.0020.0018] # ARABIC LETTER MEEM MEDIAL FORM +FEE2 ; [.2409.0020.0019] # ARABIC LETTER MEEM FINAL FORM +FEE1 ; [.2409.0020.001A] # ARABIC LETTER MEEM ISOLATED FORM +06FE ; [.2409.0020.0004][.0000.0112.0004] # ARABIC SIGN SINDHI POSTPOSITION MEN +FC88 ; [.2409.0020.0019][.2371.0020.0019] # ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FCCE ; [.2409.0020.0017][.238B.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FC45 ; [.2409.0020.001A][.238B.0020.001A] # ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FD8C ; [.2409.0020.0017][.238B.0020.0017][.2392.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD92 ; [.2409.0020.0017][.238B.0020.0017][.2393.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD8D ; [.2409.0020.0017][.238B.0020.0017][.2409.0020.0017] # ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FDC0 ; [.2409.0020.0019][.238B.0020.0019][.242C.0020.0019] # ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FCCF ; [.2409.0020.0017][.2392.0020.0017] # ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FC46 ; [.2409.0020.001A][.2392.0020.001A] # ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FD89 ; [.2409.0020.0017][.2392.0020.0017][.238B.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A ; [.2409.0020.0017][.2392.0020.0017][.2409.0020.0017] # ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FDF4 ; [.2409.0020.001A][.2392.0020.001A][.2409.0020.001A][.239D.0020.001A] # ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FD8B ; [.2409.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FCD0 ; [.2409.0020.0017][.2393.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FC47 ; [.2409.0020.001A][.2393.0020.001A] # ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FD8E ; [.2409.0020.0017][.2393.0020.0017][.238B.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F ; [.2409.0020.0017][.2393.0020.0017][.2409.0020.0017] # ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FDB9 ; [.2409.0020.0019][.2393.0020.0019][.242C.0020.0019] # ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FCD1 ; [.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FC89 ; [.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC48 ; [.2409.0020.001A][.2409.0020.001A] # ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FDB1 ; [.2409.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FC49 ; [.2409.0020.001A][.242B.0020.001A] # ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A ; [.2409.0020.001A][.242C.0020.001A] # ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +0765 ; [.240A.0020.0002] # ARABIC LETTER MEEM WITH DOT ABOVE +0766 ; [.240B.0020.0002] # ARABIC LETTER MEEM WITH DOT BELOW +08A7 ; [.240C.0020.0002] # ARABIC LETTER MEEM WITH THREE DOTS ABOVE +0646 ; [.240D.0020.0002] # ARABIC LETTER NOON +1EE0D ; [.240D.0020.0005] # ARABIC MATHEMATICAL NOON +1EE2D ; [.240D.0020.0005] # ARABIC MATHEMATICAL INITIAL NOON +1EE4D ; [.240D.0020.0005] # ARABIC MATHEMATICAL TAILED NOON +1EE6D ; [.240D.0020.0005] # ARABIC MATHEMATICAL STRETCHED NOON +1EE8D ; [.240D.0020.0005] # ARABIC MATHEMATICAL LOOPED NOON +1EEAD ; [.240D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK NOON +FEE7 ; [.240D.0020.0017] # ARABIC LETTER NOON INITIAL FORM +FEE8 ; [.240D.0020.0018] # ARABIC LETTER NOON MEDIAL FORM +FEE6 ; [.240D.0020.0019] # ARABIC LETTER NOON FINAL FORM +FEE5 ; [.240D.0020.001A] # ARABIC LETTER NOON ISOLATED FORM +FCD2 ; [.240D.0020.0017][.238B.0020.0017] # ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FC4B ; [.240D.0020.001A][.238B.0020.001A] # ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FDB8 ; [.240D.0020.0017][.238B.0020.0017][.2392.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDBD ; [.240D.0020.0019][.238B.0020.0019][.2392.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FD98 ; [.240D.0020.0017][.238B.0020.0017][.2409.0020.0017] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD97 ; [.240D.0020.0019][.238B.0020.0019][.2409.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD99 ; [.240D.0020.0019][.238B.0020.0019][.242B.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDC7 ; [.240D.0020.0019][.238B.0020.0019][.242C.0020.0019] # ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FCD3 ; [.240D.0020.0017][.2392.0020.0017] # ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FC4C ; [.240D.0020.001A][.2392.0020.001A] # ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FD95 ; [.240D.0020.0017][.2392.0020.0017][.2409.0020.0017] # ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96 ; [.240D.0020.0019][.2392.0020.0019][.242B.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FDB3 ; [.240D.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FCD4 ; [.240D.0020.0017][.2393.0020.0017] # ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FC4D ; [.240D.0020.001A][.2393.0020.001A] # ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC8A ; [.240D.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B ; [.240D.0020.0019][.23AD.0020.0019] # ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FCD5 ; [.240D.0020.0017][.2409.0020.0017] # ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCEE ; [.240D.0020.0018][.2409.0020.0018] # ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FC8C ; [.240D.0020.0019][.2409.0020.0019] # ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC4E ; [.240D.0020.001A][.2409.0020.001A] # ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FD9B ; [.240D.0020.0019][.2409.0020.0019][.242B.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9A ; [.240D.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FC8D ; [.240D.0020.0019][.240D.0020.0019] # ARABIC LIGATURE NOON WITH NOON FINAL FORM +FCD6 ; [.240D.0020.0017][.2417.0020.0017] # ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCEF ; [.240D.0020.0018][.2417.0020.0018] # ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FC8E ; [.240D.0020.0019][.242B.0020.0019] # ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC4F ; [.240D.0020.001A][.242B.0020.001A] # ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC8F ; [.240D.0020.0019][.242C.0020.0019] # ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC50 ; [.240D.0020.001A][.242C.0020.001A] # ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +06BA ; [.240E.0020.0002] # ARABIC LETTER NOON GHUNNA +1EE1D ; [.240E.0020.0005] # ARABIC MATHEMATICAL DOTLESS NOON +1EE5D ; [.240E.0020.0005] # ARABIC MATHEMATICAL TAILED DOTLESS NOON +FB9F ; [.240E.0020.0019] # ARABIC LETTER NOON GHUNNA FINAL FORM +FB9E ; [.240E.0020.001A] # ARABIC LETTER NOON GHUNNA ISOLATED FORM +08BD ; [.240F.0020.0002] # ARABIC LETTER AFRICAN NOON +06BB ; [.2410.0020.0002] # ARABIC LETTER RNOON +FBA2 ; [.2410.0020.0017] # ARABIC LETTER RNOON INITIAL FORM +FBA3 ; [.2410.0020.0018] # ARABIC LETTER RNOON MEDIAL FORM +FBA1 ; [.2410.0020.0019] # ARABIC LETTER RNOON FINAL FORM +FBA0 ; [.2410.0020.001A] # ARABIC LETTER RNOON ISOLATED FORM +06BC ; [.2411.0020.0002] # ARABIC LETTER NOON WITH RING +06BD ; [.2412.0020.0002] # ARABIC LETTER NOON WITH THREE DOTS ABOVE +06B9 ; [.2413.0020.0002] # ARABIC LETTER NOON WITH DOT BELOW +0767 ; [.2414.0020.0002] # ARABIC LETTER NOON WITH TWO DOTS BELOW +0768 ; [.2415.0020.0002] # ARABIC LETTER NOON WITH SMALL TAH +0769 ; [.2416.0020.0002] # ARABIC LETTER NOON WITH SMALL V +0647 ; [.2417.0020.0002] # ARABIC LETTER HEH +1EE24 ; [.2417.0020.0005] # ARABIC MATHEMATICAL INITIAL HEH +1EE64 ; [.2417.0020.0005] # ARABIC MATHEMATICAL STRETCHED HEH +1EE84 ; [.2417.0020.0005] # ARABIC MATHEMATICAL LOOPED HEH +FEEB ; [.2417.0020.0017] # ARABIC LETTER HEH INITIAL FORM +FEEC ; [.2417.0020.0018] # ARABIC LETTER HEH MEDIAL FORM +FEEA ; [.2417.0020.0019] # ARABIC LETTER HEH FINAL FORM +FEE9 ; [.2417.0020.001A] # ARABIC LETTER HEH ISOLATED FORM +FCD9 ; [.2417.0020.0017][.0000.0098.0017] # ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCD7 ; [.2417.0020.0017][.238B.0020.0017] # ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FC51 ; [.2417.0020.001A][.238B.0020.001A] # ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FCD8 ; [.2417.0020.0017][.2409.0020.0017] # ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FC52 ; [.2417.0020.001A][.2409.0020.001A] # ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FD93 ; [.2417.0020.0017][.2409.0020.0017][.238B.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94 ; [.2417.0020.0017][.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FC53 ; [.2417.0020.001A][.242B.0020.001A] # ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54 ; [.2417.0020.001A][.242C.0020.001A] # ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +06BE ; [.2418.0020.0002] # ARABIC LETTER HEH DOACHASHMEE +FBAC ; [.2418.0020.0017] # ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBAD ; [.2418.0020.0018] # ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAB ; [.2418.0020.0019] # ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAA ; [.2418.0020.001A] # ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +06C1 ; [.2419.0020.0002] # ARABIC LETTER HEH GOAL +FBA8 ; [.2419.0020.0017] # ARABIC LETTER HEH GOAL INITIAL FORM +FBA9 ; [.2419.0020.0018] # ARABIC LETTER HEH GOAL MEDIAL FORM +FBA7 ; [.2419.0020.0019] # ARABIC LETTER HEH GOAL FINAL FORM +FBA6 ; [.2419.0020.001A] # ARABIC LETTER HEH GOAL ISOLATED FORM +06C2 ; [.2419.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06C3 ; [.241A.0020.0002] # ARABIC LETTER TEH MARBUTA GOAL +06FF ; [.241B.0020.0002] # ARABIC LETTER HEH WITH INVERTED V +06D5 ; [.241C.0020.0002] # ARABIC LETTER AE +06C0 ; [.241C.0020.0002][.0000.0083.0002] # ARABIC LETTER HEH WITH YEH ABOVE +FBA5 ; [.241C.0020.0019][.0000.0083.0019] # ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA4 ; [.241C.0020.001A][.0000.0083.001A] # ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +0648 ; [.241D.0020.0002] # ARABIC LETTER WAW +06E5 ; [.241D.0020.0004] # ARABIC SMALL WAW +1EE05 ; [.241D.0020.0005] # ARABIC MATHEMATICAL WAW +1EE85 ; [.241D.0020.0005] # ARABIC MATHEMATICAL LOOPED WAW +1EEA5 ; [.241D.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK WAW +FEEE ; [.241D.0020.0019] # ARABIC LETTER WAW FINAL FORM +FEED ; [.241D.0020.001A] # ARABIC LETTER WAW ISOLATED FORM +0676 ; [.241D.0020.0004][.2363.0020.0004] # ARABIC LETTER HIGH HAMZA WAW +FDF8 ; [.241D.0020.001A][.23BF.0020.001A][.2402.0020.001A][.2409.0020.001A] # ARABIC LIGATURE WASALLAM ISOLATED FORM +06C4 ; [.241E.0020.0002] # ARABIC LETTER WAW WITH RING +06C5 ; [.241F.0020.0002] # ARABIC LETTER KIRGHIZ OE +FBE1 ; [.241F.0020.0019] # ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE0 ; [.241F.0020.001A] # ARABIC LETTER KIRGHIZ OE ISOLATED FORM +06C6 ; [.2420.0020.0002] # ARABIC LETTER OE +FBDA ; [.2420.0020.0019] # ARABIC LETTER OE FINAL FORM +FBD9 ; [.2420.0020.001A] # ARABIC LETTER OE ISOLATED FORM +06C7 ; [.2421.0020.0002] # ARABIC LETTER U +FBD8 ; [.2421.0020.0019] # ARABIC LETTER U FINAL FORM +FBD7 ; [.2421.0020.001A] # ARABIC LETTER U ISOLATED FORM +0677 ; [.2421.0020.0004][.2363.0020.0004] # ARABIC LETTER U WITH HAMZA ABOVE +FBDD ; [.2421.0020.001A][.2363.0020.001A] # ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +06C8 ; [.2422.0020.0002] # ARABIC LETTER YU +FBDC ; [.2422.0020.0019] # ARABIC LETTER YU FINAL FORM +FBDB ; [.2422.0020.001A] # ARABIC LETTER YU ISOLATED FORM +06C9 ; [.2423.0020.0002] # ARABIC LETTER KIRGHIZ YU +FBE3 ; [.2423.0020.0019] # ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE2 ; [.2423.0020.001A] # ARABIC LETTER KIRGHIZ YU ISOLATED FORM +06CA ; [.2424.0020.0002] # ARABIC LETTER WAW WITH TWO DOTS ABOVE +06CB ; [.2425.0020.0002] # ARABIC LETTER VE +FBDF ; [.2425.0020.0019] # ARABIC LETTER VE FINAL FORM +FBDE ; [.2425.0020.001A] # ARABIC LETTER VE ISOLATED FORM +08B1 ; [.2426.0020.0002] # ARABIC LETTER STRAIGHT WAW +06CF ; [.2427.0020.0002] # ARABIC LETTER WAW WITH DOT ABOVE +0778 ; [.2428.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0779 ; [.2429.0020.0002] # ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +08AB ; [.242A.0020.0002] # ARABIC LETTER WAW WITH DOT WITHIN +0649 ; [.242B.0020.0002] # ARABIC LETTER ALEF MAKSURA +FBE8 ; [.242B.0020.0017] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBE9 ; [.242B.0020.0018] # ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FEF0 ; [.242B.0020.0019] # ARABIC LETTER ALEF MAKSURA FINAL FORM +FEEF ; [.242B.0020.001A] # ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FC90 ; [.242B.0020.0019][.0000.0098.0019] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC5D ; [.242B.0020.001A][.0000.0098.001A] # ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +064A ; [.242C.0020.0002] # ARABIC LETTER YEH +06E6 ; [.242C.0020.0004] # ARABIC SMALL YEH +1EE09 ; [.242C.0020.0005] # ARABIC MATHEMATICAL YEH +1EE29 ; [.242C.0020.0005] # ARABIC MATHEMATICAL INITIAL YEH +1EE49 ; [.242C.0020.0005] # ARABIC MATHEMATICAL TAILED YEH +1EE69 ; [.242C.0020.0005] # ARABIC MATHEMATICAL STRETCHED YEH +1EE89 ; [.242C.0020.0005] # ARABIC MATHEMATICAL LOOPED YEH +1EEA9 ; [.242C.0020.0005] # ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +FEF3 ; [.242C.0020.0017] # ARABIC LETTER YEH INITIAL FORM +FEF4 ; [.242C.0020.0018] # ARABIC LETTER YEH MEDIAL FORM +FEF2 ; [.242C.0020.0019] # ARABIC LETTER YEH FINAL FORM +FEF1 ; [.242C.0020.001A] # ARABIC LETTER YEH ISOLATED FORM +0678 ; [.242C.0020.0004][.2363.0020.0004] # ARABIC LETTER HIGH HAMZA YEH +FCDA ; [.242C.0020.0017][.238B.0020.0017] # ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FC55 ; [.242C.0020.001A][.238B.0020.001A] # ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FDAF ; [.242C.0020.0019][.238B.0020.0019][.242C.0020.0019] # ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FCDB ; [.242C.0020.0017][.2392.0020.0017] # ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FC56 ; [.242C.0020.001A][.2392.0020.001A] # ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FDAE ; [.242C.0020.0019][.2392.0020.0019][.242C.0020.0019] # ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FCDC ; [.242C.0020.0017][.2393.0020.0017] # ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FC57 ; [.242C.0020.001A][.2393.0020.001A] # ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC91 ; [.242C.0020.0019][.23AC.0020.0019] # ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92 ; [.242C.0020.0019][.23AD.0020.0019] # ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FCDD ; [.242C.0020.0017][.2409.0020.0017] # ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCF0 ; [.242C.0020.0018][.2409.0020.0018] # ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FC93 ; [.242C.0020.0019][.2409.0020.0019] # ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC58 ; [.242C.0020.001A][.2409.0020.001A] # ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FD9D ; [.242C.0020.0017][.2409.0020.0017][.2409.0020.0017] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9C ; [.242C.0020.0019][.2409.0020.0019][.2409.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FDB0 ; [.242C.0020.0019][.2409.0020.0019][.242C.0020.0019] # ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FC94 ; [.242C.0020.0019][.240D.0020.0019] # ARABIC LIGATURE YEH WITH NOON FINAL FORM +FCDE ; [.242C.0020.0017][.2417.0020.0017] # ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCF1 ; [.242C.0020.0018][.2417.0020.0018] # ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FC95 ; [.242C.0020.0019][.242B.0020.0019] # ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC59 ; [.242C.0020.001A][.242B.0020.001A] # ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC96 ; [.242C.0020.0019][.242C.0020.0019] # ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC5A ; [.242C.0020.001A][.242C.0020.001A] # ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +06CC ; [.242D.0020.0002] # ARABIC LETTER FARSI YEH +FBFE ; [.242D.0020.0017] # ARABIC LETTER FARSI YEH INITIAL FORM +FBFF ; [.242D.0020.0018] # ARABIC LETTER FARSI YEH MEDIAL FORM +FBFD ; [.242D.0020.0019] # ARABIC LETTER FARSI YEH FINAL FORM +FBFC ; [.242D.0020.001A] # ARABIC LETTER FARSI YEH ISOLATED FORM +06CD ; [.242E.0020.0002] # ARABIC LETTER YEH WITH TAIL +06CE ; [.242F.0020.0002] # ARABIC LETTER YEH WITH SMALL V +06D0 ; [.2430.0020.0002] # ARABIC LETTER E +FBE6 ; [.2430.0020.0017] # ARABIC LETTER E INITIAL FORM +FBE7 ; [.2430.0020.0018] # ARABIC LETTER E MEDIAL FORM +FBE5 ; [.2430.0020.0019] # ARABIC LETTER E FINAL FORM +FBE4 ; [.2430.0020.001A] # ARABIC LETTER E ISOLATED FORM +06D1 ; [.2431.0020.0002] # ARABIC LETTER YEH WITH THREE DOTS BELOW +063D ; [.2432.0020.0002] # ARABIC LETTER FARSI YEH WITH INVERTED V +063E ; [.2433.0020.0002] # ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE +063F ; [.2434.0020.0002] # ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0620 ; [.2435.0020.0002] # ARABIC LETTER KASHMIRI YEH +0775 ; [.2436.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0776 ; [.2437.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0777 ; [.2438.0020.0002] # ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW +08BA ; [.2439.0020.0002] # ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE +06D2 ; [.243A.0020.0002] # ARABIC LETTER YEH BARREE +FBAF ; [.243A.0020.0019] # ARABIC LETTER YEH BARREE FINAL FORM +FBAE ; [.243A.0020.001A] # ARABIC LETTER YEH BARREE ISOLATED FORM +06D3 ; [.243A.0020.0002][.0000.0083.0002] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +FBB1 ; [.243A.0020.0019][.0000.0083.0019] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB0 ; [.243A.0020.001A][.0000.0083.001A] # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +077A ; [.243B.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +077B ; [.243C.0020.0002] # ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0710 ; [.243D.0020.0002] # SYRIAC LETTER ALAPH +0712 ; [.243E.0020.0002] # SYRIAC LETTER BETH +072D ; [.243E.0020.0004][.0000.0113.0004] # SYRIAC LETTER PERSIAN BHETH +0713 ; [.243F.0020.0002] # SYRIAC LETTER GAMAL +0714 ; [.243F.0020.0004][.0000.0112.0004] # SYRIAC LETTER GAMAL GARSHUNI +072E ; [.243F.0020.0004][.0000.0113.0004] # SYRIAC LETTER PERSIAN GHAMAL +0716 ; [.2440.0020.0002] # SYRIAC LETTER DOTLESS DALATH RISH +0715 ; [.2441.0020.0002] # SYRIAC LETTER DALATH +072F ; [.2441.0020.0004][.0000.0113.0004] # SYRIAC LETTER PERSIAN DHALATH +0717 ; [.2442.0020.0002] # SYRIAC LETTER HE +0718 ; [.2443.0020.0002] # SYRIAC LETTER WAW +0719 ; [.2444.0020.0002] # SYRIAC LETTER ZAIN +074D ; [.2445.0020.0002] # SYRIAC LETTER SOGDIAN ZHAIN +071A ; [.2446.0020.0002] # SYRIAC LETTER HETH +071B ; [.2447.0020.0002] # SYRIAC LETTER TETH +071C ; [.2447.0020.0004][.0000.0112.0004] # SYRIAC LETTER TETH GARSHUNI +071D ; [.2448.0020.0002] # SYRIAC LETTER YUDH +071E ; [.2449.0020.0002] # SYRIAC LETTER YUDH HE +071F ; [.244A.0020.0002] # SYRIAC LETTER KAPH +074E ; [.244B.0020.0002] # SYRIAC LETTER SOGDIAN KHAPH +0720 ; [.244C.0020.0002] # SYRIAC LETTER LAMADH +0721 ; [.244D.0020.0002] # SYRIAC LETTER MIM +0722 ; [.244E.0020.0002] # SYRIAC LETTER NUN +0723 ; [.244F.0020.0002] # SYRIAC LETTER SEMKATH +0724 ; [.244F.0020.0019] # SYRIAC LETTER FINAL SEMKATH +0725 ; [.2450.0020.0002] # SYRIAC LETTER E +0726 ; [.2451.0020.0002] # SYRIAC LETTER PE +0727 ; [.2451.0020.0004][.0000.0112.0004] # SYRIAC LETTER REVERSED PE +074F ; [.2452.0020.0002] # SYRIAC LETTER SOGDIAN FE +0728 ; [.2453.0020.0002] # SYRIAC LETTER SADHE +0729 ; [.2454.0020.0002] # SYRIAC LETTER QAPH +072A ; [.2455.0020.0002] # SYRIAC LETTER RISH +072B ; [.2456.0020.0002] # SYRIAC LETTER SHIN +072C ; [.2457.0020.0002] # SYRIAC LETTER TAW +0860 ; [.2458.0020.0002] # SYRIAC LETTER MALAYALAM NGA +0861 ; [.2459.0020.0002] # SYRIAC LETTER MALAYALAM JA +0862 ; [.245A.0020.0002] # SYRIAC LETTER MALAYALAM NYA +0863 ; [.245B.0020.0002] # SYRIAC LETTER MALAYALAM TTA +0864 ; [.245C.0020.0002] # SYRIAC LETTER MALAYALAM NNA +0865 ; [.245D.0020.0002] # SYRIAC LETTER MALAYALAM NNNA +0866 ; [.245E.0020.0002] # SYRIAC LETTER MALAYALAM BHA +0867 ; [.245F.0020.0002] # SYRIAC LETTER MALAYALAM RA +0868 ; [.2460.0020.0002] # SYRIAC LETTER MALAYALAM LLA +0869 ; [.2461.0020.0002] # SYRIAC LETTER MALAYALAM LLLA +086A ; [.2462.0020.0002] # SYRIAC LETTER MALAYALAM SSA +0840 ; [.2463.0020.0002] # MANDAIC LETTER HALQA +0841 ; [.2464.0020.0002] # MANDAIC LETTER AB +0842 ; [.2465.0020.0002] # MANDAIC LETTER AG +0843 ; [.2466.0020.0002] # MANDAIC LETTER AD +0844 ; [.2467.0020.0002] # MANDAIC LETTER AH +0845 ; [.2468.0020.0002] # MANDAIC LETTER USHENNA +0846 ; [.2469.0020.0002] # MANDAIC LETTER AZ +0847 ; [.246A.0020.0002] # MANDAIC LETTER IT +0848 ; [.246B.0020.0002] # MANDAIC LETTER ATT +0849 ; [.246C.0020.0002] # MANDAIC LETTER AKSA +084A ; [.246D.0020.0002] # MANDAIC LETTER AK +084B ; [.246E.0020.0002] # MANDAIC LETTER AL +084C ; [.246F.0020.0002] # MANDAIC LETTER AM +084D ; [.2470.0020.0002] # MANDAIC LETTER AN +084E ; [.2471.0020.0002] # MANDAIC LETTER AS +084F ; [.2472.0020.0002] # MANDAIC LETTER IN +0850 ; [.2473.0020.0002] # MANDAIC LETTER AP +0851 ; [.2474.0020.0002] # MANDAIC LETTER ASZ +0852 ; [.2475.0020.0002] # MANDAIC LETTER AQ +0853 ; [.2476.0020.0002] # MANDAIC LETTER AR +0854 ; [.2477.0020.0002] # MANDAIC LETTER ASH +0855 ; [.2478.0020.0002] # MANDAIC LETTER AT +0856 ; [.2479.0020.0002] # MANDAIC LETTER DUSHENNA +0857 ; [.247A.0020.0002] # MANDAIC LETTER KAD +0858 ; [.247B.0020.0002] # MANDAIC LETTER AIN +0780 ; [.247C.0020.0002] # THAANA LETTER HAA +0799 ; [.247D.0020.0002] # THAANA LETTER HHAA +079A ; [.247E.0020.0002] # THAANA LETTER KHAA +0781 ; [.247F.0020.0002] # THAANA LETTER SHAVIYANI +0782 ; [.2480.0020.0002] # THAANA LETTER NOONU +0783 ; [.2481.0020.0002] # THAANA LETTER RAA +079C ; [.2482.0020.0002] # THAANA LETTER ZAA +0784 ; [.2483.0020.0002] # THAANA LETTER BAA +0785 ; [.2484.0020.0002] # THAANA LETTER LHAVIYANI +0786 ; [.2485.0020.0002] # THAANA LETTER KAAFU +0787 ; [.2486.0020.0002] # THAANA LETTER ALIFU +07A2 ; [.2487.0020.0002] # THAANA LETTER AINU +07A3 ; [.2488.0020.0002] # THAANA LETTER GHAINU +0788 ; [.2489.0020.0002] # THAANA LETTER VAAVU +07A5 ; [.248A.0020.0002] # THAANA LETTER WAAVU +0789 ; [.248B.0020.0002] # THAANA LETTER MEEMU +078A ; [.248C.0020.0002] # THAANA LETTER FAAFU +078B ; [.248D.0020.0002] # THAANA LETTER DHAALU +079B ; [.248E.0020.0002] # THAANA LETTER THAALU +078C ; [.248F.0020.0002] # THAANA LETTER THAA +0798 ; [.2490.0020.0002] # THAANA LETTER TTAA +07A0 ; [.2491.0020.0002] # THAANA LETTER TO +07A1 ; [.2492.0020.0002] # THAANA LETTER ZO +078D ; [.2493.0020.0002] # THAANA LETTER LAAMU +078E ; [.2494.0020.0002] # THAANA LETTER GAAFU +07A4 ; [.2495.0020.0002] # THAANA LETTER QAAFU +078F ; [.2496.0020.0002] # THAANA LETTER GNAVIYANI +0790 ; [.2497.0020.0002] # THAANA LETTER SEENU +079D ; [.2498.0020.0002] # THAANA LETTER SHEENU +079E ; [.2499.0020.0002] # THAANA LETTER SAADHU +079F ; [.249A.0020.0002] # THAANA LETTER DAADHU +0791 ; [.249B.0020.0002] # THAANA LETTER DAVIYANI +0792 ; [.249C.0020.0002] # THAANA LETTER ZAVIYANI +0793 ; [.249D.0020.0002] # THAANA LETTER TAVIYANI +0794 ; [.249E.0020.0002] # THAANA LETTER YAA +0795 ; [.249F.0020.0002] # THAANA LETTER PAVIYANI +0796 ; [.24A0.0020.0002] # THAANA LETTER JAVIYANI +0797 ; [.24A1.0020.0002] # THAANA LETTER CHAVIYANI +07B1 ; [.24A2.0020.0002] # THAANA LETTER NAA +07A6 ; [.24A3.0020.0002] # THAANA ABAFILI +07A7 ; [.24A4.0020.0002] # THAANA AABAAFILI +07A8 ; [.24A5.0020.0002] # THAANA IBIFILI +07A9 ; [.24A6.0020.0002] # THAANA EEBEEFILI +07AA ; [.24A7.0020.0002] # THAANA UBUFILI +07AB ; [.24A8.0020.0002] # THAANA OOBOOFILI +07AC ; [.24A9.0020.0002] # THAANA EBEFILI +07AD ; [.24AA.0020.0002] # THAANA EYBEYFILI +07AE ; [.24AB.0020.0002] # THAANA OBOFILI +07AF ; [.24AC.0020.0002] # THAANA OABOAFILI +07B0 ; [.24AD.0020.0002] # THAANA SUKUN +07CA ; [.24AE.0020.0002] # NKO LETTER A +07CB ; [.24AF.0020.0002] # NKO LETTER EE +07CC ; [.24B0.0020.0002] # NKO LETTER I +07CD ; [.24B1.0020.0002] # NKO LETTER E +07CE ; [.24B2.0020.0002] # NKO LETTER U +07CF ; [.24B3.0020.0002] # NKO LETTER OO +07D0 ; [.24B4.0020.0002] # NKO LETTER O +07D1 ; [.24B5.0020.0002] # NKO LETTER DAGBASINNA +07D2 ; [.24B6.0020.0002] # NKO LETTER N +07D3 ; [.24B7.0020.0002] # NKO LETTER BA +07D4 ; [.24B8.0020.0002] # NKO LETTER PA +07D5 ; [.24B9.0020.0002] # NKO LETTER TA +07D6 ; [.24BA.0020.0002] # NKO LETTER JA +07E8 ; [.24BA.0020.0004][.0000.0111.0004] # NKO LETTER JONA JA +07D7 ; [.24BB.0020.0002] # NKO LETTER CHA +07E9 ; [.24BB.0020.0004][.0000.0111.0004] # NKO LETTER JONA CHA +07D8 ; [.24BC.0020.0002] # NKO LETTER DA +07D9 ; [.24BD.0020.0002] # NKO LETTER RA +07EA ; [.24BD.0020.0004][.0000.0111.0004] # NKO LETTER JONA RA +07DA ; [.24BE.0020.0002] # NKO LETTER RRA +07DB ; [.24BF.0020.0002] # NKO LETTER SA +07DC ; [.24C0.0020.0002] # NKO LETTER GBA +07DD ; [.24C1.0020.0002] # NKO LETTER FA +07DE ; [.24C2.0020.0002] # NKO LETTER KA +07DF ; [.24C3.0020.0002] # NKO LETTER LA +07E0 ; [.24C4.0020.0002] # NKO LETTER NA WOLOSO +07E1 ; [.24C5.0020.0002] # NKO LETTER MA +07E2 ; [.24C6.0020.0002] # NKO LETTER NYA +07E3 ; [.24C7.0020.0002] # NKO LETTER NA +07E4 ; [.24C8.0020.0002] # NKO LETTER HA +07E5 ; [.24C9.0020.0002] # NKO LETTER WA +07E6 ; [.24CA.0020.0002] # NKO LETTER YA +07E7 ; [.24CB.0020.0002] # NKO LETTER NYA WOLOSO +07F4 ; [.24CC.0020.0002] # NKO HIGH TONE APOSTROPHE +07F5 ; [.24CD.0020.0002] # NKO LOW TONE APOSTROPHE +2D30 ; [.24CE.0020.0002] # TIFINAGH LETTER YA +2D31 ; [.24CF.0020.0002] # TIFINAGH LETTER YAB +2D32 ; [.24D0.0020.0002] # TIFINAGH LETTER YABH +2D33 ; [.24D1.0020.0002] # TIFINAGH LETTER YAG +2D34 ; [.24D2.0020.0002] # TIFINAGH LETTER YAGHH +2D35 ; [.24D3.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAJ +2D36 ; [.24D4.0020.0002] # TIFINAGH LETTER YAJ +2D37 ; [.24D5.0020.0002] # TIFINAGH LETTER YAD +2D38 ; [.24D6.0020.0002] # TIFINAGH LETTER YADH +2D39 ; [.24D7.0020.0002] # TIFINAGH LETTER YADD +2D3A ; [.24D8.0020.0002] # TIFINAGH LETTER YADDH +2D3B ; [.24D9.0020.0002] # TIFINAGH LETTER YEY +2D66 ; [.24DA.0020.0002] # TIFINAGH LETTER YE +2D3C ; [.24DB.0020.0002] # TIFINAGH LETTER YAF +2D3D ; [.24DC.0020.0002] # TIFINAGH LETTER YAK +2D3E ; [.24DD.0020.0002] # TIFINAGH LETTER TUAREG YAK +2D3F ; [.24DE.0020.0002] # TIFINAGH LETTER YAKHH +2D40 ; [.24DF.0020.0002] # TIFINAGH LETTER YAH +2D41 ; [.24E0.0020.0002] # TIFINAGH LETTER BERBER ACADEMY YAH +2D42 ; [.24E1.0020.0002] # TIFINAGH LETTER TUAREG YAH +2D43 ; [.24E2.0020.0002] # TIFINAGH LETTER YAHH +2D44 ; [.24E3.0020.0002] # TIFINAGH LETTER YAA +2D45 ; [.24E4.0020.0002] # TIFINAGH LETTER YAKH +2D46 ; [.24E5.0020.0002] # TIFINAGH LETTER TUAREG YAKH +2D47 ; [.24E6.0020.0002] # TIFINAGH LETTER YAQ +2D48 ; [.24E7.0020.0002] # TIFINAGH LETTER TUAREG YAQ +2D49 ; [.24E8.0020.0002] # TIFINAGH LETTER YI +2D4A ; [.24E9.0020.0002] # TIFINAGH LETTER YAZH +2D4B ; [.24EA.0020.0002] # TIFINAGH LETTER AHAGGAR YAZH +2D4C ; [.24EB.0020.0002] # TIFINAGH LETTER TUAREG YAZH +2D4D ; [.24EC.0020.0002] # TIFINAGH LETTER YAL +2D4E ; [.24ED.0020.0002] # TIFINAGH LETTER YAM +2D4F ; [.24EE.0020.0002] # TIFINAGH LETTER YAN +2D50 ; [.24EF.0020.0002] # TIFINAGH LETTER TUAREG YAGN +2D51 ; [.24F0.0020.0002] # TIFINAGH LETTER TUAREG YANG +2D52 ; [.24F1.0020.0002] # TIFINAGH LETTER YAP +2D53 ; [.24F2.0020.0002] # TIFINAGH LETTER YU +2D67 ; [.24F3.0020.0002] # TIFINAGH LETTER YO +2D54 ; [.24F4.0020.0002] # TIFINAGH LETTER YAR +2D55 ; [.24F5.0020.0002] # TIFINAGH LETTER YARR +2D56 ; [.24F6.0020.0002] # TIFINAGH LETTER YAGH +2D57 ; [.24F7.0020.0002] # TIFINAGH LETTER TUAREG YAGH +2D58 ; [.24F8.0020.0002] # TIFINAGH LETTER AYER YAGH +2D59 ; [.24F9.0020.0002] # TIFINAGH LETTER YAS +2D5A ; [.24FA.0020.0002] # TIFINAGH LETTER YASS +2D5B ; [.24FB.0020.0002] # TIFINAGH LETTER YASH +2D5C ; [.24FC.0020.0002] # TIFINAGH LETTER YAT +2D5D ; [.24FD.0020.0002] # TIFINAGH LETTER YATH +2D5E ; [.24FE.0020.0002] # TIFINAGH LETTER YACH +2D5F ; [.24FF.0020.0002] # TIFINAGH LETTER YATT +2D60 ; [.2500.0020.0002] # TIFINAGH LETTER YAV +2D61 ; [.2501.0020.0002] # TIFINAGH LETTER YAW +2D62 ; [.2502.0020.0002] # TIFINAGH LETTER YAY +2D63 ; [.2503.0020.0002] # TIFINAGH LETTER YAZ +2D64 ; [.2504.0020.0002] # TIFINAGH LETTER TAWELLEMET YAZ +2D65 ; [.2505.0020.0002] # TIFINAGH LETTER YAZZ +2D6F ; [.2506.0020.0002] # TIFINAGH MODIFIER LETTER LABIALIZATION MARK +1200 ; [.2507.0020.0002] # ETHIOPIC SYLLABLE HA +1201 ; [.2508.0020.0002] # ETHIOPIC SYLLABLE HU +1202 ; [.2509.0020.0002] # ETHIOPIC SYLLABLE HI +1203 ; [.250A.0020.0002] # ETHIOPIC SYLLABLE HAA +1204 ; [.250B.0020.0002] # ETHIOPIC SYLLABLE HEE +1205 ; [.250C.0020.0002] # ETHIOPIC SYLLABLE HE +1206 ; [.250D.0020.0002] # ETHIOPIC SYLLABLE HO +1207 ; [.250E.0020.0002] # ETHIOPIC SYLLABLE HOA +1208 ; [.250F.0020.0002] # ETHIOPIC SYLLABLE LA +1209 ; [.2510.0020.0002] # ETHIOPIC SYLLABLE LU +120A ; [.2511.0020.0002] # ETHIOPIC SYLLABLE LI +120B ; [.2512.0020.0002] # ETHIOPIC SYLLABLE LAA +120C ; [.2513.0020.0002] # ETHIOPIC SYLLABLE LEE +120D ; [.2514.0020.0002] # ETHIOPIC SYLLABLE LE +120E ; [.2515.0020.0002] # ETHIOPIC SYLLABLE LO +120F ; [.2516.0020.0002] # ETHIOPIC SYLLABLE LWA +2D80 ; [.2517.0020.0002] # ETHIOPIC SYLLABLE LOA +1210 ; [.2518.0020.0002] # ETHIOPIC SYLLABLE HHA +1211 ; [.2519.0020.0002] # ETHIOPIC SYLLABLE HHU +1212 ; [.251A.0020.0002] # ETHIOPIC SYLLABLE HHI +1213 ; [.251B.0020.0002] # ETHIOPIC SYLLABLE HHAA +1214 ; [.251C.0020.0002] # ETHIOPIC SYLLABLE HHEE +1215 ; [.251D.0020.0002] # ETHIOPIC SYLLABLE HHE +1216 ; [.251E.0020.0002] # ETHIOPIC SYLLABLE HHO +1217 ; [.251F.0020.0002] # ETHIOPIC SYLLABLE HHWA +1218 ; [.2520.0020.0002] # ETHIOPIC SYLLABLE MA +1219 ; [.2521.0020.0002] # ETHIOPIC SYLLABLE MU +121A ; [.2522.0020.0002] # ETHIOPIC SYLLABLE MI +121B ; [.2523.0020.0002] # ETHIOPIC SYLLABLE MAA +121C ; [.2524.0020.0002] # ETHIOPIC SYLLABLE MEE +121D ; [.2525.0020.0002] # ETHIOPIC SYLLABLE ME +121E ; [.2526.0020.0002] # ETHIOPIC SYLLABLE MO +121F ; [.2527.0020.0002] # ETHIOPIC SYLLABLE MWA +1380 ; [.2528.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT MWA +1381 ; [.2529.0020.0002] # ETHIOPIC SYLLABLE MWI +1382 ; [.252A.0020.0002] # ETHIOPIC SYLLABLE MWEE +1383 ; [.252B.0020.0002] # ETHIOPIC SYLLABLE MWE +2D81 ; [.252C.0020.0002] # ETHIOPIC SYLLABLE MOA +1220 ; [.252D.0020.0002] # ETHIOPIC SYLLABLE SZA +1221 ; [.252E.0020.0002] # ETHIOPIC SYLLABLE SZU +1222 ; [.252F.0020.0002] # ETHIOPIC SYLLABLE SZI +1223 ; [.2530.0020.0002] # ETHIOPIC SYLLABLE SZAA +1224 ; [.2531.0020.0002] # ETHIOPIC SYLLABLE SZEE +1225 ; [.2532.0020.0002] # ETHIOPIC SYLLABLE SZE +1226 ; [.2533.0020.0002] # ETHIOPIC SYLLABLE SZO +1227 ; [.2534.0020.0002] # ETHIOPIC SYLLABLE SZWA +1228 ; [.2535.0020.0002] # ETHIOPIC SYLLABLE RA +1229 ; [.2536.0020.0002] # ETHIOPIC SYLLABLE RU +122A ; [.2537.0020.0002] # ETHIOPIC SYLLABLE RI +122B ; [.2538.0020.0002] # ETHIOPIC SYLLABLE RAA +122C ; [.2539.0020.0002] # ETHIOPIC SYLLABLE REE +122D ; [.253A.0020.0002] # ETHIOPIC SYLLABLE RE +122E ; [.253B.0020.0002] # ETHIOPIC SYLLABLE RO +122F ; [.253C.0020.0002] # ETHIOPIC SYLLABLE RWA +2D82 ; [.253D.0020.0002] # ETHIOPIC SYLLABLE ROA +1230 ; [.253E.0020.0002] # ETHIOPIC SYLLABLE SA +1231 ; [.253F.0020.0002] # ETHIOPIC SYLLABLE SU +1232 ; [.2540.0020.0002] # ETHIOPIC SYLLABLE SI +1233 ; [.2541.0020.0002] # ETHIOPIC SYLLABLE SAA +1234 ; [.2542.0020.0002] # ETHIOPIC SYLLABLE SEE +1235 ; [.2543.0020.0002] # ETHIOPIC SYLLABLE SE +1236 ; [.2544.0020.0002] # ETHIOPIC SYLLABLE SO +1237 ; [.2545.0020.0002] # ETHIOPIC SYLLABLE SWA +2D83 ; [.2546.0020.0002] # ETHIOPIC SYLLABLE SOA +AB01 ; [.2547.0020.0002] # ETHIOPIC SYLLABLE TTHU +AB02 ; [.2548.0020.0002] # ETHIOPIC SYLLABLE TTHI +AB03 ; [.2549.0020.0002] # ETHIOPIC SYLLABLE TTHAA +AB04 ; [.254A.0020.0002] # ETHIOPIC SYLLABLE TTHEE +AB05 ; [.254B.0020.0002] # ETHIOPIC SYLLABLE TTHE +AB06 ; [.254C.0020.0002] # ETHIOPIC SYLLABLE TTHO +1238 ; [.254D.0020.0002] # ETHIOPIC SYLLABLE SHA +1239 ; [.254E.0020.0002] # ETHIOPIC SYLLABLE SHU +123A ; [.254F.0020.0002] # ETHIOPIC SYLLABLE SHI +123B ; [.2550.0020.0002] # ETHIOPIC SYLLABLE SHAA +123C ; [.2551.0020.0002] # ETHIOPIC SYLLABLE SHEE +123D ; [.2552.0020.0002] # ETHIOPIC SYLLABLE SHE +123E ; [.2553.0020.0002] # ETHIOPIC SYLLABLE SHO +123F ; [.2554.0020.0002] # ETHIOPIC SYLLABLE SHWA +2D84 ; [.2555.0020.0002] # ETHIOPIC SYLLABLE SHOA +1240 ; [.2556.0020.0002] # ETHIOPIC SYLLABLE QA +1241 ; [.2557.0020.0002] # ETHIOPIC SYLLABLE QU +1242 ; [.2558.0020.0002] # ETHIOPIC SYLLABLE QI +1243 ; [.2559.0020.0002] # ETHIOPIC SYLLABLE QAA +1244 ; [.255A.0020.0002] # ETHIOPIC SYLLABLE QEE +1245 ; [.255B.0020.0002] # ETHIOPIC SYLLABLE QE +1246 ; [.255C.0020.0002] # ETHIOPIC SYLLABLE QO +1247 ; [.255D.0020.0002] # ETHIOPIC SYLLABLE QOA +1248 ; [.255E.0020.0002] # ETHIOPIC SYLLABLE QWA +124A ; [.255F.0020.0002] # ETHIOPIC SYLLABLE QWI +124B ; [.2560.0020.0002] # ETHIOPIC SYLLABLE QWAA +124C ; [.2561.0020.0002] # ETHIOPIC SYLLABLE QWEE +124D ; [.2562.0020.0002] # ETHIOPIC SYLLABLE QWE +1250 ; [.2563.0020.0002] # ETHIOPIC SYLLABLE QHA +1251 ; [.2564.0020.0002] # ETHIOPIC SYLLABLE QHU +1252 ; [.2565.0020.0002] # ETHIOPIC SYLLABLE QHI +1253 ; [.2566.0020.0002] # ETHIOPIC SYLLABLE QHAA +1254 ; [.2567.0020.0002] # ETHIOPIC SYLLABLE QHEE +1255 ; [.2568.0020.0002] # ETHIOPIC SYLLABLE QHE +1256 ; [.2569.0020.0002] # ETHIOPIC SYLLABLE QHO +1258 ; [.256A.0020.0002] # ETHIOPIC SYLLABLE QHWA +125A ; [.256B.0020.0002] # ETHIOPIC SYLLABLE QHWI +125B ; [.256C.0020.0002] # ETHIOPIC SYLLABLE QHWAA +125C ; [.256D.0020.0002] # ETHIOPIC SYLLABLE QHWEE +125D ; [.256E.0020.0002] # ETHIOPIC SYLLABLE QHWE +1260 ; [.256F.0020.0002] # ETHIOPIC SYLLABLE BA +1261 ; [.2570.0020.0002] # ETHIOPIC SYLLABLE BU +1262 ; [.2571.0020.0002] # ETHIOPIC SYLLABLE BI +1263 ; [.2572.0020.0002] # ETHIOPIC SYLLABLE BAA +1264 ; [.2573.0020.0002] # ETHIOPIC SYLLABLE BEE +1265 ; [.2574.0020.0002] # ETHIOPIC SYLLABLE BE +1266 ; [.2575.0020.0002] # ETHIOPIC SYLLABLE BO +1267 ; [.2576.0020.0002] # ETHIOPIC SYLLABLE BWA +1384 ; [.2577.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT BWA +1385 ; [.2578.0020.0002] # ETHIOPIC SYLLABLE BWI +1386 ; [.2579.0020.0002] # ETHIOPIC SYLLABLE BWEE +1387 ; [.257A.0020.0002] # ETHIOPIC SYLLABLE BWE +2D85 ; [.257B.0020.0002] # ETHIOPIC SYLLABLE BOA +1268 ; [.257C.0020.0002] # ETHIOPIC SYLLABLE VA +1269 ; [.257D.0020.0002] # ETHIOPIC SYLLABLE VU +126A ; [.257E.0020.0002] # ETHIOPIC SYLLABLE VI +126B ; [.257F.0020.0002] # ETHIOPIC SYLLABLE VAA +126C ; [.2580.0020.0002] # ETHIOPIC SYLLABLE VEE +126D ; [.2581.0020.0002] # ETHIOPIC SYLLABLE VE +126E ; [.2582.0020.0002] # ETHIOPIC SYLLABLE VO +126F ; [.2583.0020.0002] # ETHIOPIC SYLLABLE VWA +1270 ; [.2584.0020.0002] # ETHIOPIC SYLLABLE TA +1271 ; [.2585.0020.0002] # ETHIOPIC SYLLABLE TU +1272 ; [.2586.0020.0002] # ETHIOPIC SYLLABLE TI +1273 ; [.2587.0020.0002] # ETHIOPIC SYLLABLE TAA +1274 ; [.2588.0020.0002] # ETHIOPIC SYLLABLE TEE +1275 ; [.2589.0020.0002] # ETHIOPIC SYLLABLE TE +1276 ; [.258A.0020.0002] # ETHIOPIC SYLLABLE TO +1277 ; [.258B.0020.0002] # ETHIOPIC SYLLABLE TWA +2D86 ; [.258C.0020.0002] # ETHIOPIC SYLLABLE TOA +1278 ; [.258D.0020.0002] # ETHIOPIC SYLLABLE CA +1279 ; [.258E.0020.0002] # ETHIOPIC SYLLABLE CU +127A ; [.258F.0020.0002] # ETHIOPIC SYLLABLE CI +127B ; [.2590.0020.0002] # ETHIOPIC SYLLABLE CAA +127C ; [.2591.0020.0002] # ETHIOPIC SYLLABLE CEE +127D ; [.2592.0020.0002] # ETHIOPIC SYLLABLE CE +127E ; [.2593.0020.0002] # ETHIOPIC SYLLABLE CO +127F ; [.2594.0020.0002] # ETHIOPIC SYLLABLE CWA +2D87 ; [.2595.0020.0002] # ETHIOPIC SYLLABLE COA +1280 ; [.2596.0020.0002] # ETHIOPIC SYLLABLE XA +1281 ; [.2597.0020.0002] # ETHIOPIC SYLLABLE XU +1282 ; [.2598.0020.0002] # ETHIOPIC SYLLABLE XI +1283 ; [.2599.0020.0002] # ETHIOPIC SYLLABLE XAA +1284 ; [.259A.0020.0002] # ETHIOPIC SYLLABLE XEE +1285 ; [.259B.0020.0002] # ETHIOPIC SYLLABLE XE +1286 ; [.259C.0020.0002] # ETHIOPIC SYLLABLE XO +1287 ; [.259D.0020.0002] # ETHIOPIC SYLLABLE XOA +1288 ; [.259E.0020.0002] # ETHIOPIC SYLLABLE XWA +128A ; [.259F.0020.0002] # ETHIOPIC SYLLABLE XWI +128B ; [.25A0.0020.0002] # ETHIOPIC SYLLABLE XWAA +128C ; [.25A1.0020.0002] # ETHIOPIC SYLLABLE XWEE +128D ; [.25A2.0020.0002] # ETHIOPIC SYLLABLE XWE +1290 ; [.25A3.0020.0002] # ETHIOPIC SYLLABLE NA +1291 ; [.25A4.0020.0002] # ETHIOPIC SYLLABLE NU +1292 ; [.25A5.0020.0002] # ETHIOPIC SYLLABLE NI +1293 ; [.25A6.0020.0002] # ETHIOPIC SYLLABLE NAA +1294 ; [.25A7.0020.0002] # ETHIOPIC SYLLABLE NEE +1295 ; [.25A8.0020.0002] # ETHIOPIC SYLLABLE NE +1296 ; [.25A9.0020.0002] # ETHIOPIC SYLLABLE NO +1297 ; [.25AA.0020.0002] # ETHIOPIC SYLLABLE NWA +2D88 ; [.25AB.0020.0002] # ETHIOPIC SYLLABLE NOA +1298 ; [.25AC.0020.0002] # ETHIOPIC SYLLABLE NYA +1299 ; [.25AD.0020.0002] # ETHIOPIC SYLLABLE NYU +129A ; [.25AE.0020.0002] # ETHIOPIC SYLLABLE NYI +129B ; [.25AF.0020.0002] # ETHIOPIC SYLLABLE NYAA +129C ; [.25B0.0020.0002] # ETHIOPIC SYLLABLE NYEE +129D ; [.25B1.0020.0002] # ETHIOPIC SYLLABLE NYE +129E ; [.25B2.0020.0002] # ETHIOPIC SYLLABLE NYO +129F ; [.25B3.0020.0002] # ETHIOPIC SYLLABLE NYWA +2D89 ; [.25B4.0020.0002] # ETHIOPIC SYLLABLE NYOA +12A0 ; [.25B5.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL A +12A1 ; [.25B6.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL U +12A2 ; [.25B7.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL I +12A3 ; [.25B8.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL AA +12A4 ; [.25B9.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL EE +12A5 ; [.25BA.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL E +12A6 ; [.25BB.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL O +12A7 ; [.25BC.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL WA +2D8A ; [.25BD.0020.0002] # ETHIOPIC SYLLABLE GLOTTAL OA +12A8 ; [.25BE.0020.0002] # ETHIOPIC SYLLABLE KA +12A9 ; [.25BF.0020.0002] # ETHIOPIC SYLLABLE KU +12AA ; [.25C0.0020.0002] # ETHIOPIC SYLLABLE KI +12AB ; [.25C1.0020.0002] # ETHIOPIC SYLLABLE KAA +12AC ; [.25C2.0020.0002] # ETHIOPIC SYLLABLE KEE +12AD ; [.25C3.0020.0002] # ETHIOPIC SYLLABLE KE +12AE ; [.25C4.0020.0002] # ETHIOPIC SYLLABLE KO +12AF ; [.25C5.0020.0002] # ETHIOPIC SYLLABLE KOA +12B0 ; [.25C6.0020.0002] # ETHIOPIC SYLLABLE KWA +12B2 ; [.25C7.0020.0002] # ETHIOPIC SYLLABLE KWI +12B3 ; [.25C8.0020.0002] # ETHIOPIC SYLLABLE KWAA +12B4 ; [.25C9.0020.0002] # ETHIOPIC SYLLABLE KWEE +12B5 ; [.25CA.0020.0002] # ETHIOPIC SYLLABLE KWE +12B8 ; [.25CB.0020.0002] # ETHIOPIC SYLLABLE KXA +12B9 ; [.25CC.0020.0002] # ETHIOPIC SYLLABLE KXU +12BA ; [.25CD.0020.0002] # ETHIOPIC SYLLABLE KXI +12BB ; [.25CE.0020.0002] # ETHIOPIC SYLLABLE KXAA +12BC ; [.25CF.0020.0002] # ETHIOPIC SYLLABLE KXEE +12BD ; [.25D0.0020.0002] # ETHIOPIC SYLLABLE KXE +12BE ; [.25D1.0020.0002] # ETHIOPIC SYLLABLE KXO +12C0 ; [.25D2.0020.0002] # ETHIOPIC SYLLABLE KXWA +12C2 ; [.25D3.0020.0002] # ETHIOPIC SYLLABLE KXWI +12C3 ; [.25D4.0020.0002] # ETHIOPIC SYLLABLE KXWAA +12C4 ; [.25D5.0020.0002] # ETHIOPIC SYLLABLE KXWEE +12C5 ; [.25D6.0020.0002] # ETHIOPIC SYLLABLE KXWE +12C8 ; [.25D7.0020.0002] # ETHIOPIC SYLLABLE WA +12C9 ; [.25D8.0020.0002] # ETHIOPIC SYLLABLE WU +12CA ; [.25D9.0020.0002] # ETHIOPIC SYLLABLE WI +12CB ; [.25DA.0020.0002] # ETHIOPIC SYLLABLE WAA +12CC ; [.25DB.0020.0002] # ETHIOPIC SYLLABLE WEE +12CD ; [.25DC.0020.0002] # ETHIOPIC SYLLABLE WE +12CE ; [.25DD.0020.0002] # ETHIOPIC SYLLABLE WO +12CF ; [.25DE.0020.0002] # ETHIOPIC SYLLABLE WOA +12D0 ; [.25DF.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL A +12D1 ; [.25E0.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL U +12D2 ; [.25E1.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL I +12D3 ; [.25E2.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL AA +12D4 ; [.25E3.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL EE +12D5 ; [.25E4.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL E +12D6 ; [.25E5.0020.0002] # ETHIOPIC SYLLABLE PHARYNGEAL O +12D8 ; [.25E6.0020.0002] # ETHIOPIC SYLLABLE ZA +12D9 ; [.25E7.0020.0002] # ETHIOPIC SYLLABLE ZU +12DA ; [.25E8.0020.0002] # ETHIOPIC SYLLABLE ZI +12DB ; [.25E9.0020.0002] # ETHIOPIC SYLLABLE ZAA +12DC ; [.25EA.0020.0002] # ETHIOPIC SYLLABLE ZEE +12DD ; [.25EB.0020.0002] # ETHIOPIC SYLLABLE ZE +12DE ; [.25EC.0020.0002] # ETHIOPIC SYLLABLE ZO +12DF ; [.25ED.0020.0002] # ETHIOPIC SYLLABLE ZWA +2D8B ; [.25EE.0020.0002] # ETHIOPIC SYLLABLE ZOA +AB11 ; [.25EF.0020.0002] # ETHIOPIC SYLLABLE DZU +AB12 ; [.25F0.0020.0002] # ETHIOPIC SYLLABLE DZI +AB13 ; [.25F1.0020.0002] # ETHIOPIC SYLLABLE DZAA +AB14 ; [.25F2.0020.0002] # ETHIOPIC SYLLABLE DZEE +AB15 ; [.25F3.0020.0002] # ETHIOPIC SYLLABLE DZE +AB16 ; [.25F4.0020.0002] # ETHIOPIC SYLLABLE DZO +12E0 ; [.25F5.0020.0002] # ETHIOPIC SYLLABLE ZHA +12E1 ; [.25F6.0020.0002] # ETHIOPIC SYLLABLE ZHU +12E2 ; [.25F7.0020.0002] # ETHIOPIC SYLLABLE ZHI +12E3 ; [.25F8.0020.0002] # ETHIOPIC SYLLABLE ZHAA +12E4 ; [.25F9.0020.0002] # ETHIOPIC SYLLABLE ZHEE +12E5 ; [.25FA.0020.0002] # ETHIOPIC SYLLABLE ZHE +12E6 ; [.25FB.0020.0002] # ETHIOPIC SYLLABLE ZHO +12E7 ; [.25FC.0020.0002] # ETHIOPIC SYLLABLE ZHWA +12E8 ; [.25FD.0020.0002] # ETHIOPIC SYLLABLE YA +12E9 ; [.25FE.0020.0002] # ETHIOPIC SYLLABLE YU +12EA ; [.25FF.0020.0002] # ETHIOPIC SYLLABLE YI +12EB ; [.2600.0020.0002] # ETHIOPIC SYLLABLE YAA +12EC ; [.2601.0020.0002] # ETHIOPIC SYLLABLE YEE +12ED ; [.2602.0020.0002] # ETHIOPIC SYLLABLE YE +12EE ; [.2603.0020.0002] # ETHIOPIC SYLLABLE YO +12EF ; [.2604.0020.0002] # ETHIOPIC SYLLABLE YOA +12F0 ; [.2605.0020.0002] # ETHIOPIC SYLLABLE DA +12F1 ; [.2606.0020.0002] # ETHIOPIC SYLLABLE DU +12F2 ; [.2607.0020.0002] # ETHIOPIC SYLLABLE DI +12F3 ; [.2608.0020.0002] # ETHIOPIC SYLLABLE DAA +12F4 ; [.2609.0020.0002] # ETHIOPIC SYLLABLE DEE +12F5 ; [.260A.0020.0002] # ETHIOPIC SYLLABLE DE +12F6 ; [.260B.0020.0002] # ETHIOPIC SYLLABLE DO +12F7 ; [.260C.0020.0002] # ETHIOPIC SYLLABLE DWA +2D8C ; [.260D.0020.0002] # ETHIOPIC SYLLABLE DOA +AB09 ; [.260E.0020.0002] # ETHIOPIC SYLLABLE DDHU +AB0A ; [.260F.0020.0002] # ETHIOPIC SYLLABLE DDHI +AB0B ; [.2610.0020.0002] # ETHIOPIC SYLLABLE DDHAA +AB0C ; [.2611.0020.0002] # ETHIOPIC SYLLABLE DDHEE +AB0D ; [.2612.0020.0002] # ETHIOPIC SYLLABLE DDHE +AB0E ; [.2613.0020.0002] # ETHIOPIC SYLLABLE DDHO +12F8 ; [.2614.0020.0002] # ETHIOPIC SYLLABLE DDA +12F9 ; [.2615.0020.0002] # ETHIOPIC SYLLABLE DDU +12FA ; [.2616.0020.0002] # ETHIOPIC SYLLABLE DDI +12FB ; [.2617.0020.0002] # ETHIOPIC SYLLABLE DDAA +12FC ; [.2618.0020.0002] # ETHIOPIC SYLLABLE DDEE +12FD ; [.2619.0020.0002] # ETHIOPIC SYLLABLE DDE +12FE ; [.261A.0020.0002] # ETHIOPIC SYLLABLE DDO +12FF ; [.261B.0020.0002] # ETHIOPIC SYLLABLE DDWA +2D8D ; [.261C.0020.0002] # ETHIOPIC SYLLABLE DDOA +1300 ; [.261D.0020.0002] # ETHIOPIC SYLLABLE JA +1301 ; [.261E.0020.0002] # ETHIOPIC SYLLABLE JU +1302 ; [.261F.0020.0002] # ETHIOPIC SYLLABLE JI +1303 ; [.2620.0020.0002] # ETHIOPIC SYLLABLE JAA +1304 ; [.2621.0020.0002] # ETHIOPIC SYLLABLE JEE +1305 ; [.2622.0020.0002] # ETHIOPIC SYLLABLE JE +1306 ; [.2623.0020.0002] # ETHIOPIC SYLLABLE JO +1307 ; [.2624.0020.0002] # ETHIOPIC SYLLABLE JWA +2D8E ; [.2625.0020.0002] # ETHIOPIC SYLLABLE JOA +1308 ; [.2626.0020.0002] # ETHIOPIC SYLLABLE GA +1309 ; [.2627.0020.0002] # ETHIOPIC SYLLABLE GU +130A ; [.2628.0020.0002] # ETHIOPIC SYLLABLE GI +130B ; [.2629.0020.0002] # ETHIOPIC SYLLABLE GAA +130C ; [.262A.0020.0002] # ETHIOPIC SYLLABLE GEE +130D ; [.262B.0020.0002] # ETHIOPIC SYLLABLE GE +130E ; [.262C.0020.0002] # ETHIOPIC SYLLABLE GO +130F ; [.262D.0020.0002] # ETHIOPIC SYLLABLE GOA +1310 ; [.262E.0020.0002] # ETHIOPIC SYLLABLE GWA +1312 ; [.262F.0020.0002] # ETHIOPIC SYLLABLE GWI +1313 ; [.2630.0020.0002] # ETHIOPIC SYLLABLE GWAA +1314 ; [.2631.0020.0002] # ETHIOPIC SYLLABLE GWEE +1315 ; [.2632.0020.0002] # ETHIOPIC SYLLABLE GWE +1318 ; [.2633.0020.0002] # ETHIOPIC SYLLABLE GGA +1319 ; [.2634.0020.0002] # ETHIOPIC SYLLABLE GGU +131A ; [.2635.0020.0002] # ETHIOPIC SYLLABLE GGI +131B ; [.2636.0020.0002] # ETHIOPIC SYLLABLE GGAA +131C ; [.2637.0020.0002] # ETHIOPIC SYLLABLE GGEE +131D ; [.2638.0020.0002] # ETHIOPIC SYLLABLE GGE +131E ; [.2639.0020.0002] # ETHIOPIC SYLLABLE GGO +131F ; [.263A.0020.0002] # ETHIOPIC SYLLABLE GGWAA +2D93 ; [.263B.0020.0002] # ETHIOPIC SYLLABLE GGWA +2D94 ; [.263C.0020.0002] # ETHIOPIC SYLLABLE GGWI +2D95 ; [.263D.0020.0002] # ETHIOPIC SYLLABLE GGWEE +2D96 ; [.263E.0020.0002] # ETHIOPIC SYLLABLE GGWE +1320 ; [.263F.0020.0002] # ETHIOPIC SYLLABLE THA +1321 ; [.2640.0020.0002] # ETHIOPIC SYLLABLE THU +1322 ; [.2641.0020.0002] # ETHIOPIC SYLLABLE THI +1323 ; [.2642.0020.0002] # ETHIOPIC SYLLABLE THAA +1324 ; [.2643.0020.0002] # ETHIOPIC SYLLABLE THEE +1325 ; [.2644.0020.0002] # ETHIOPIC SYLLABLE THE +1326 ; [.2645.0020.0002] # ETHIOPIC SYLLABLE THO +1327 ; [.2646.0020.0002] # ETHIOPIC SYLLABLE THWA +2D8F ; [.2647.0020.0002] # ETHIOPIC SYLLABLE THOA +1328 ; [.2648.0020.0002] # ETHIOPIC SYLLABLE CHA +1329 ; [.2649.0020.0002] # ETHIOPIC SYLLABLE CHU +132A ; [.264A.0020.0002] # ETHIOPIC SYLLABLE CHI +132B ; [.264B.0020.0002] # ETHIOPIC SYLLABLE CHAA +132C ; [.264C.0020.0002] # ETHIOPIC SYLLABLE CHEE +132D ; [.264D.0020.0002] # ETHIOPIC SYLLABLE CHE +132E ; [.264E.0020.0002] # ETHIOPIC SYLLABLE CHO +132F ; [.264F.0020.0002] # ETHIOPIC SYLLABLE CHWA +2D90 ; [.2650.0020.0002] # ETHIOPIC SYLLABLE CHOA +AB20 ; [.2651.0020.0002] # ETHIOPIC SYLLABLE CCHHA +AB21 ; [.2652.0020.0002] # ETHIOPIC SYLLABLE CCHHU +AB22 ; [.2653.0020.0002] # ETHIOPIC SYLLABLE CCHHI +AB23 ; [.2654.0020.0002] # ETHIOPIC SYLLABLE CCHHAA +AB24 ; [.2655.0020.0002] # ETHIOPIC SYLLABLE CCHHEE +AB25 ; [.2656.0020.0002] # ETHIOPIC SYLLABLE CCHHE +AB26 ; [.2657.0020.0002] # ETHIOPIC SYLLABLE CCHHO +1330 ; [.2658.0020.0002] # ETHIOPIC SYLLABLE PHA +1331 ; [.2659.0020.0002] # ETHIOPIC SYLLABLE PHU +1332 ; [.265A.0020.0002] # ETHIOPIC SYLLABLE PHI +1333 ; [.265B.0020.0002] # ETHIOPIC SYLLABLE PHAA +1334 ; [.265C.0020.0002] # ETHIOPIC SYLLABLE PHEE +1335 ; [.265D.0020.0002] # ETHIOPIC SYLLABLE PHE +1336 ; [.265E.0020.0002] # ETHIOPIC SYLLABLE PHO +1337 ; [.265F.0020.0002] # ETHIOPIC SYLLABLE PHWA +2D91 ; [.2660.0020.0002] # ETHIOPIC SYLLABLE PHOA +1338 ; [.2661.0020.0002] # ETHIOPIC SYLLABLE TSA +1339 ; [.2662.0020.0002] # ETHIOPIC SYLLABLE TSU +133A ; [.2663.0020.0002] # ETHIOPIC SYLLABLE TSI +133B ; [.2664.0020.0002] # ETHIOPIC SYLLABLE TSAA +133C ; [.2665.0020.0002] # ETHIOPIC SYLLABLE TSEE +133D ; [.2666.0020.0002] # ETHIOPIC SYLLABLE TSE +133E ; [.2667.0020.0002] # ETHIOPIC SYLLABLE TSO +133F ; [.2668.0020.0002] # ETHIOPIC SYLLABLE TSWA +AB28 ; [.2669.0020.0002] # ETHIOPIC SYLLABLE BBA +AB29 ; [.266A.0020.0002] # ETHIOPIC SYLLABLE BBU +AB2A ; [.266B.0020.0002] # ETHIOPIC SYLLABLE BBI +AB2B ; [.266C.0020.0002] # ETHIOPIC SYLLABLE BBAA +AB2C ; [.266D.0020.0002] # ETHIOPIC SYLLABLE BBEE +AB2D ; [.266E.0020.0002] # ETHIOPIC SYLLABLE BBE +AB2E ; [.266F.0020.0002] # ETHIOPIC SYLLABLE BBO +1340 ; [.2670.0020.0002] # ETHIOPIC SYLLABLE TZA +1341 ; [.2671.0020.0002] # ETHIOPIC SYLLABLE TZU +1342 ; [.2672.0020.0002] # ETHIOPIC SYLLABLE TZI +1343 ; [.2673.0020.0002] # ETHIOPIC SYLLABLE TZAA +1344 ; [.2674.0020.0002] # ETHIOPIC SYLLABLE TZEE +1345 ; [.2675.0020.0002] # ETHIOPIC SYLLABLE TZE +1346 ; [.2676.0020.0002] # ETHIOPIC SYLLABLE TZO +1347 ; [.2677.0020.0002] # ETHIOPIC SYLLABLE TZOA +1348 ; [.2678.0020.0002] # ETHIOPIC SYLLABLE FA +1349 ; [.2679.0020.0002] # ETHIOPIC SYLLABLE FU +134A ; [.267A.0020.0002] # ETHIOPIC SYLLABLE FI +134B ; [.267B.0020.0002] # ETHIOPIC SYLLABLE FAA +134C ; [.267C.0020.0002] # ETHIOPIC SYLLABLE FEE +134D ; [.267D.0020.0002] # ETHIOPIC SYLLABLE FE +134E ; [.267E.0020.0002] # ETHIOPIC SYLLABLE FO +134F ; [.267F.0020.0002] # ETHIOPIC SYLLABLE FWA +1388 ; [.2680.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT FWA +1389 ; [.2681.0020.0002] # ETHIOPIC SYLLABLE FWI +138A ; [.2682.0020.0002] # ETHIOPIC SYLLABLE FWEE +138B ; [.2683.0020.0002] # ETHIOPIC SYLLABLE FWE +1350 ; [.2684.0020.0002] # ETHIOPIC SYLLABLE PA +1351 ; [.2685.0020.0002] # ETHIOPIC SYLLABLE PU +1352 ; [.2686.0020.0002] # ETHIOPIC SYLLABLE PI +1353 ; [.2687.0020.0002] # ETHIOPIC SYLLABLE PAA +1354 ; [.2688.0020.0002] # ETHIOPIC SYLLABLE PEE +1355 ; [.2689.0020.0002] # ETHIOPIC SYLLABLE PE +1356 ; [.268A.0020.0002] # ETHIOPIC SYLLABLE PO +1357 ; [.268B.0020.0002] # ETHIOPIC SYLLABLE PWA +138C ; [.268C.0020.0002] # ETHIOPIC SYLLABLE SEBATBEIT PWA +138D ; [.268D.0020.0002] # ETHIOPIC SYLLABLE PWI +138E ; [.268E.0020.0002] # ETHIOPIC SYLLABLE PWEE +138F ; [.268F.0020.0002] # ETHIOPIC SYLLABLE PWE +2D92 ; [.2690.0020.0002] # ETHIOPIC SYLLABLE POA +1358 ; [.2691.0020.0002] # ETHIOPIC SYLLABLE RYA +1359 ; [.2692.0020.0002] # ETHIOPIC SYLLABLE MYA +135A ; [.2693.0020.0002] # ETHIOPIC SYLLABLE FYA +2DA0 ; [.2694.0020.0002] # ETHIOPIC SYLLABLE SSA +2DA1 ; [.2695.0020.0002] # ETHIOPIC SYLLABLE SSU +2DA2 ; [.2696.0020.0002] # ETHIOPIC SYLLABLE SSI +2DA3 ; [.2697.0020.0002] # ETHIOPIC SYLLABLE SSAA +2DA4 ; [.2698.0020.0002] # ETHIOPIC SYLLABLE SSEE +2DA5 ; [.2699.0020.0002] # ETHIOPIC SYLLABLE SSE +2DA6 ; [.269A.0020.0002] # ETHIOPIC SYLLABLE SSO +2DA8 ; [.269B.0020.0002] # ETHIOPIC SYLLABLE CCA +2DA9 ; [.269C.0020.0002] # ETHIOPIC SYLLABLE CCU +2DAA ; [.269D.0020.0002] # ETHIOPIC SYLLABLE CCI +2DAB ; [.269E.0020.0002] # ETHIOPIC SYLLABLE CCAA +2DAC ; [.269F.0020.0002] # ETHIOPIC SYLLABLE CCEE +2DAD ; [.26A0.0020.0002] # ETHIOPIC SYLLABLE CCE +2DAE ; [.26A1.0020.0002] # ETHIOPIC SYLLABLE CCO +2DB0 ; [.26A2.0020.0002] # ETHIOPIC SYLLABLE ZZA +2DB1 ; [.26A3.0020.0002] # ETHIOPIC SYLLABLE ZZU +2DB2 ; [.26A4.0020.0002] # ETHIOPIC SYLLABLE ZZI +2DB3 ; [.26A5.0020.0002] # ETHIOPIC SYLLABLE ZZAA +2DB4 ; [.26A6.0020.0002] # ETHIOPIC SYLLABLE ZZEE +2DB5 ; [.26A7.0020.0002] # ETHIOPIC SYLLABLE ZZE +2DB6 ; [.26A8.0020.0002] # ETHIOPIC SYLLABLE ZZO +2DB8 ; [.26A9.0020.0002] # ETHIOPIC SYLLABLE CCHA +2DB9 ; [.26AA.0020.0002] # ETHIOPIC SYLLABLE CCHU +2DBA ; [.26AB.0020.0002] # ETHIOPIC SYLLABLE CCHI +2DBB ; [.26AC.0020.0002] # ETHIOPIC SYLLABLE CCHAA +2DBC ; [.26AD.0020.0002] # ETHIOPIC SYLLABLE CCHEE +2DBD ; [.26AE.0020.0002] # ETHIOPIC SYLLABLE CCHE +2DBE ; [.26AF.0020.0002] # ETHIOPIC SYLLABLE CCHO +2DC0 ; [.26B0.0020.0002] # ETHIOPIC SYLLABLE QYA +2DC1 ; [.26B1.0020.0002] # ETHIOPIC SYLLABLE QYU +2DC2 ; [.26B2.0020.0002] # ETHIOPIC SYLLABLE QYI +2DC3 ; [.26B3.0020.0002] # ETHIOPIC SYLLABLE QYAA +2DC4 ; [.26B4.0020.0002] # ETHIOPIC SYLLABLE QYEE +2DC5 ; [.26B5.0020.0002] # ETHIOPIC SYLLABLE QYE +2DC6 ; [.26B6.0020.0002] # ETHIOPIC SYLLABLE QYO +2DC8 ; [.26B7.0020.0002] # ETHIOPIC SYLLABLE KYA +2DC9 ; [.26B8.0020.0002] # ETHIOPIC SYLLABLE KYU +2DCA ; [.26B9.0020.0002] # ETHIOPIC SYLLABLE KYI +2DCB ; [.26BA.0020.0002] # ETHIOPIC SYLLABLE KYAA +2DCC ; [.26BB.0020.0002] # ETHIOPIC SYLLABLE KYEE +2DCD ; [.26BC.0020.0002] # ETHIOPIC SYLLABLE KYE +2DCE ; [.26BD.0020.0002] # ETHIOPIC SYLLABLE KYO +2DD0 ; [.26BE.0020.0002] # ETHIOPIC SYLLABLE XYA +2DD1 ; [.26BF.0020.0002] # ETHIOPIC SYLLABLE XYU +2DD2 ; [.26C0.0020.0002] # ETHIOPIC SYLLABLE XYI +2DD3 ; [.26C1.0020.0002] # ETHIOPIC SYLLABLE XYAA +2DD4 ; [.26C2.0020.0002] # ETHIOPIC SYLLABLE XYEE +2DD5 ; [.26C3.0020.0002] # ETHIOPIC SYLLABLE XYE +2DD6 ; [.26C4.0020.0002] # ETHIOPIC SYLLABLE XYO +2DD8 ; [.26C5.0020.0002] # ETHIOPIC SYLLABLE GYA +2DD9 ; [.26C6.0020.0002] # ETHIOPIC SYLLABLE GYU +2DDA ; [.26C7.0020.0002] # ETHIOPIC SYLLABLE GYI +2DDB ; [.26C8.0020.0002] # ETHIOPIC SYLLABLE GYAA +2DDC ; [.26C9.0020.0002] # ETHIOPIC SYLLABLE GYEE +2DDD ; [.26CA.0020.0002] # ETHIOPIC SYLLABLE GYE +2DDE ; [.26CB.0020.0002] # ETHIOPIC SYLLABLE GYO +0950 ; [.26CC.0020.0002] # DEVANAGARI OM +A8FD ; [.26CD.0020.0002] # DEVANAGARI JAIN OM +0972 ; [.26CE.0020.0002] # DEVANAGARI LETTER CANDRA A +0904 ; [.26CF.0020.0002] # DEVANAGARI LETTER SHORT A +0905 ; [.26D0.0020.0002] # DEVANAGARI LETTER A +0906 ; [.26D1.0020.0002] # DEVANAGARI LETTER AA +0973 ; [.26D2.0020.0002] # DEVANAGARI LETTER OE +0974 ; [.26D3.0020.0002] # DEVANAGARI LETTER OOE +0975 ; [.26D4.0020.0002] # DEVANAGARI LETTER AW +0976 ; [.26D5.0020.0002] # DEVANAGARI LETTER UE +0977 ; [.26D6.0020.0002] # DEVANAGARI LETTER UUE +0907 ; [.26D7.0020.0002] # DEVANAGARI LETTER I +0908 ; [.26D8.0020.0002] # DEVANAGARI LETTER II +0909 ; [.26D9.0020.0002] # DEVANAGARI LETTER U +090A ; [.26DA.0020.0002] # DEVANAGARI LETTER UU +090B ; [.26DB.0020.0002] # DEVANAGARI LETTER VOCALIC R +0960 ; [.26DC.0020.0002] # DEVANAGARI LETTER VOCALIC RR +090C ; [.26DD.0020.0002] # DEVANAGARI LETTER VOCALIC L +0961 ; [.26DE.0020.0002] # DEVANAGARI LETTER VOCALIC LL +090D ; [.26DF.0020.0002] # DEVANAGARI LETTER CANDRA E +090E ; [.26E0.0020.0002] # DEVANAGARI LETTER SHORT E +090F ; [.26E1.0020.0002] # DEVANAGARI LETTER E +0910 ; [.26E2.0020.0002] # DEVANAGARI LETTER AI +0911 ; [.26E3.0020.0002] # DEVANAGARI LETTER CANDRA O +0912 ; [.26E4.0020.0002] # DEVANAGARI LETTER SHORT O +0913 ; [.26E5.0020.0002] # DEVANAGARI LETTER O +0914 ; [.26E6.0020.0002] # DEVANAGARI LETTER AU +0915 ; [.26E7.0020.0002] # DEVANAGARI LETTER KA +0958 ; [.26E7.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER QA +0916 ; [.26E8.0020.0002] # DEVANAGARI LETTER KHA +0959 ; [.26E8.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER KHHA +0917 ; [.26E9.0020.0002] # DEVANAGARI LETTER GA +095A ; [.26E9.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER GHHA +097B ; [.26EA.0020.0002] # DEVANAGARI LETTER GGA +0918 ; [.26EB.0020.0002] # DEVANAGARI LETTER GHA +0919 ; [.26EC.0020.0002] # DEVANAGARI LETTER NGA +091A ; [.26ED.0020.0002] # DEVANAGARI LETTER CA +091B ; [.26EE.0020.0002] # DEVANAGARI LETTER CHA +091C ; [.26EF.0020.0002] # DEVANAGARI LETTER JA +095B ; [.26EF.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER ZA +0979 ; [.26F0.0020.0002] # DEVANAGARI LETTER ZHA +097C ; [.26F1.0020.0002] # DEVANAGARI LETTER JJA +091D ; [.26F2.0020.0002] # DEVANAGARI LETTER JHA +091E ; [.26F3.0020.0002] # DEVANAGARI LETTER NYA +091F ; [.26F4.0020.0002] # DEVANAGARI LETTER TTA +0920 ; [.26F5.0020.0002] # DEVANAGARI LETTER TTHA +0978 ; [.26F6.0020.0002] # DEVANAGARI LETTER MARWARI DDA +0921 ; [.26F7.0020.0002] # DEVANAGARI LETTER DDA +095C ; [.26F7.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER DDDHA +097E ; [.26F8.0020.0002] # DEVANAGARI LETTER DDDA +0922 ; [.26F9.0020.0002] # DEVANAGARI LETTER DDHA +095D ; [.26F9.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER RHA +0923 ; [.26FA.0020.0002] # DEVANAGARI LETTER NNA +0924 ; [.26FB.0020.0002] # DEVANAGARI LETTER TA +0925 ; [.26FC.0020.0002] # DEVANAGARI LETTER THA +0926 ; [.26FD.0020.0002] # DEVANAGARI LETTER DA +0927 ; [.26FE.0020.0002] # DEVANAGARI LETTER DHA +0928 ; [.26FF.0020.0002] # DEVANAGARI LETTER NA +0929 ; [.26FF.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER NNNA +092A ; [.2700.0020.0002] # DEVANAGARI LETTER PA +092B ; [.2701.0020.0002] # DEVANAGARI LETTER PHA +095E ; [.2701.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER FA +092C ; [.2702.0020.0002] # DEVANAGARI LETTER BA +097F ; [.2703.0020.0002] # DEVANAGARI LETTER BBA +092D ; [.2704.0020.0002] # DEVANAGARI LETTER BHA +092E ; [.2705.0020.0002] # DEVANAGARI LETTER MA +092F ; [.2706.0020.0002] # DEVANAGARI LETTER YA +095F ; [.2706.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER YYA +097A ; [.2707.0020.0002] # DEVANAGARI LETTER HEAVY YA +0930 ; [.2708.0020.0002] # DEVANAGARI LETTER RA +0931 ; [.2708.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER RRA +0932 ; [.2709.0020.0002] # DEVANAGARI LETTER LA +0933 ; [.270A.0020.0002] # DEVANAGARI LETTER LLA +0934 ; [.270A.0020.0002][.0000.00C2.0002] # DEVANAGARI LETTER LLLA +0935 ; [.270B.0020.0002] # DEVANAGARI LETTER VA +0936 ; [.270C.0020.0002] # DEVANAGARI LETTER SHA +0937 ; [.270D.0020.0002] # DEVANAGARI LETTER SSA +0938 ; [.270E.0020.0002] # DEVANAGARI LETTER SA +0939 ; [.270F.0020.0002] # DEVANAGARI LETTER HA +093D ; [.2710.0020.0002] # DEVANAGARI SIGN AVAGRAHA +097D ; [.2711.0020.0002] # DEVANAGARI LETTER GLOTTAL STOP +1CE9 ; [.2712.0020.0002] # VEDIC SIGN ANUSVARA ANTARGOMUKHA +1CEA ; [.2712.0020.0004] # VEDIC SIGN ANUSVARA BAHIRGOMUKHA +1CEB ; [.2712.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA +1CEC ; [.2712.0020.0004] # VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE ; [.2712.0020.0004] # VEDIC SIGN HEXIFORM LONG ANUSVARA +1CEF ; [.2712.0020.0004] # VEDIC SIGN LONG ANUSVARA +1CF0 ; [.2712.0020.0004] # VEDIC SIGN RTHANG LONG ANUSVARA +1CF1 ; [.2712.0020.0004] # VEDIC SIGN ANUSVARA UBHAYATO MUKHA +1CF5 ; [.2713.0020.0002] # VEDIC SIGN JIHVAMULIYA +1CF6 ; [.2714.0020.0002] # VEDIC SIGN UPADHMANIYA +A8F2 ; [.2715.0020.0002] # DEVANAGARI SIGN SPACING CANDRABINDU +A8F3 ; [.2715.0020.0004] # DEVANAGARI SIGN CANDRABINDU VIRAMA +A8F4 ; [.2715.0020.0004] # DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA +A8F5 ; [.2715.0020.0004] # DEVANAGARI SIGN CANDRABINDU TWO +A8F6 ; [.2715.0020.0004] # DEVANAGARI SIGN CANDRABINDU THREE +A8F7 ; [.2715.0020.0004] # DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8FB ; [.2716.0020.0002] # DEVANAGARI HEADSTROKE +093E ; [.2717.0020.0002] # DEVANAGARI VOWEL SIGN AA +093A ; [.2718.0020.0002] # DEVANAGARI VOWEL SIGN OE +093B ; [.2719.0020.0002] # DEVANAGARI VOWEL SIGN OOE +094F ; [.271A.0020.0002] # DEVANAGARI VOWEL SIGN AW +0956 ; [.271B.0020.0002] # DEVANAGARI VOWEL SIGN UE +0957 ; [.271C.0020.0002] # DEVANAGARI VOWEL SIGN UUE +093F ; [.271D.0020.0002] # DEVANAGARI VOWEL SIGN I +0940 ; [.271E.0020.0002] # DEVANAGARI VOWEL SIGN II +0941 ; [.271F.0020.0002] # DEVANAGARI VOWEL SIGN U +0942 ; [.2720.0020.0002] # DEVANAGARI VOWEL SIGN UU +0943 ; [.2721.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC R +0944 ; [.2722.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC RR +0962 ; [.2723.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC L +0963 ; [.2724.0020.0002] # DEVANAGARI VOWEL SIGN VOCALIC LL +0945 ; [.2725.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA E +0955 ; [.2726.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA LONG E +0946 ; [.2727.0020.0002] # DEVANAGARI VOWEL SIGN SHORT E +0947 ; [.2728.0020.0002] # DEVANAGARI VOWEL SIGN E +094E ; [.2729.0020.0002] # DEVANAGARI VOWEL SIGN PRISHTHAMATRA E +0948 ; [.272A.0020.0002] # DEVANAGARI VOWEL SIGN AI +0949 ; [.272B.0020.0002] # DEVANAGARI VOWEL SIGN CANDRA O +094A ; [.272C.0020.0002] # DEVANAGARI VOWEL SIGN SHORT O +094B ; [.272D.0020.0002] # DEVANAGARI VOWEL SIGN O +094C ; [.272E.0020.0002] # DEVANAGARI VOWEL SIGN AU +094D ; [.272F.0020.0002] # DEVANAGARI SIGN VIRAMA +0980 ; [.2730.0020.0002] # BENGALI ANJI +0985 ; [.2731.0020.0002] # BENGALI LETTER A +0986 ; [.2732.0020.0002] # BENGALI LETTER AA +0987 ; [.2733.0020.0002] # BENGALI LETTER I +0988 ; [.2734.0020.0002] # BENGALI LETTER II +0989 ; [.2735.0020.0002] # BENGALI LETTER U +098A ; [.2736.0020.0002] # BENGALI LETTER UU +098B ; [.2737.0020.0002] # BENGALI LETTER VOCALIC R +09E0 ; [.2738.0020.0002] # BENGALI LETTER VOCALIC RR +098C ; [.2739.0020.0002] # BENGALI LETTER VOCALIC L +09E1 ; [.273A.0020.0002] # BENGALI LETTER VOCALIC LL +098F ; [.273B.0020.0002] # BENGALI LETTER E +0990 ; [.273C.0020.0002] # BENGALI LETTER AI +0993 ; [.273D.0020.0002] # BENGALI LETTER O +0994 ; [.273E.0020.0002] # BENGALI LETTER AU +0995 ; [.273F.0020.0002] # BENGALI LETTER KA +0996 ; [.2740.0020.0002] # BENGALI LETTER KHA +0997 ; [.2741.0020.0002] # BENGALI LETTER GA +0998 ; [.2742.0020.0002] # BENGALI LETTER GHA +0999 ; [.2743.0020.0002] # BENGALI LETTER NGA +099A ; [.2744.0020.0002] # BENGALI LETTER CA +099B ; [.2745.0020.0002] # BENGALI LETTER CHA +099C ; [.2746.0020.0002] # BENGALI LETTER JA +099D ; [.2747.0020.0002] # BENGALI LETTER JHA +099E ; [.2748.0020.0002] # BENGALI LETTER NYA +099F ; [.2749.0020.0002] # BENGALI LETTER TTA +09A0 ; [.274A.0020.0002] # BENGALI LETTER TTHA +09A1 ; [.274B.0020.0002] # BENGALI LETTER DDA +09DC ; [.274B.0020.0002][.0000.00C2.0002] # BENGALI LETTER RRA +09A2 ; [.274C.0020.0002] # BENGALI LETTER DDHA +09DD ; [.274C.0020.0002][.0000.00C2.0002] # BENGALI LETTER RHA +09A3 ; [.274D.0020.0002] # BENGALI LETTER NNA +09A4 ; [.274E.0020.0002] # BENGALI LETTER TA +09CE ; [.274E.0020.0004][.276F.0020.0004] # BENGALI LETTER KHANDA TA +09A5 ; [.274F.0020.0002] # BENGALI LETTER THA +09A6 ; [.2750.0020.0002] # BENGALI LETTER DA +09A7 ; [.2751.0020.0002] # BENGALI LETTER DHA +09A8 ; [.2752.0020.0002] # BENGALI LETTER NA +09AA ; [.2753.0020.0002] # BENGALI LETTER PA +09AB ; [.2754.0020.0002] # BENGALI LETTER PHA +09AC ; [.2755.0020.0002] # BENGALI LETTER BA +09AD ; [.2756.0020.0002] # BENGALI LETTER BHA +09AE ; [.2757.0020.0002] # BENGALI LETTER MA +09AF ; [.2758.0020.0002] # BENGALI LETTER YA +09DF ; [.2758.0020.0002][.0000.00C2.0002] # BENGALI LETTER YYA +09B0 ; [.2759.0020.0002] # BENGALI LETTER RA +09F0 ; [.275A.0020.0002] # BENGALI LETTER RA WITH MIDDLE DIAGONAL +09B2 ; [.275B.0020.0002] # BENGALI LETTER LA +09F1 ; [.275C.0020.0002] # BENGALI LETTER RA WITH LOWER DIAGONAL +09B6 ; [.275D.0020.0002] # BENGALI LETTER SHA +09B7 ; [.275E.0020.0002] # BENGALI LETTER SSA +09B8 ; [.275F.0020.0002] # BENGALI LETTER SA +09B9 ; [.2760.0020.0002] # BENGALI LETTER HA +09BD ; [.2761.0020.0002] # BENGALI SIGN AVAGRAHA +09BE ; [.2762.0020.0002] # BENGALI VOWEL SIGN AA +09BF ; [.2763.0020.0002] # BENGALI VOWEL SIGN I +09C0 ; [.2764.0020.0002] # BENGALI VOWEL SIGN II +09C1 ; [.2765.0020.0002] # BENGALI VOWEL SIGN U +09C2 ; [.2766.0020.0002] # BENGALI VOWEL SIGN UU +09C3 ; [.2767.0020.0002] # BENGALI VOWEL SIGN VOCALIC R +09C4 ; [.2768.0020.0002] # BENGALI VOWEL SIGN VOCALIC RR +09E2 ; [.2769.0020.0002] # BENGALI VOWEL SIGN VOCALIC L +09E3 ; [.276A.0020.0002] # BENGALI VOWEL SIGN VOCALIC LL +09C7 ; [.276B.0020.0002] # BENGALI VOWEL SIGN E +09C8 ; [.276C.0020.0002] # BENGALI VOWEL SIGN AI +09CB ; [.276D.0020.0002] # BENGALI VOWEL SIGN O +09C7 09BE ; [.276D.0020.0002] # BENGALI VOWEL SIGN O +09CC ; [.276E.0020.0002] # BENGALI VOWEL SIGN AU +09C7 09D7 ; [.276E.0020.0002] # BENGALI VOWEL SIGN AU +09CD ; [.276F.0020.0002] # BENGALI SIGN VIRAMA +09D7 ; [.2770.0020.0002] # BENGALI AU LENGTH MARK +09FC ; [.2771.0020.0002] # BENGALI LETTER VEDIC ANUSVARA +0A74 ; [.2772.0020.0002] # GURMUKHI EK ONKAR +0A73 ; [.2773.0020.0002] # GURMUKHI URA +0A09 ; [.2774.0020.0002] # GURMUKHI LETTER U +0A0A ; [.2775.0020.0002] # GURMUKHI LETTER UU +0A13 ; [.2776.0020.0002] # GURMUKHI LETTER OO +0A05 ; [.2777.0020.0002] # GURMUKHI LETTER A +0A06 ; [.2778.0020.0002] # GURMUKHI LETTER AA +0A10 ; [.2779.0020.0002] # GURMUKHI LETTER AI +0A14 ; [.277A.0020.0002] # GURMUKHI LETTER AU +0A72 ; [.277B.0020.0002] # GURMUKHI IRI +0A07 ; [.277C.0020.0002] # GURMUKHI LETTER I +0A08 ; [.277D.0020.0002] # GURMUKHI LETTER II +0A0F ; [.277E.0020.0002] # GURMUKHI LETTER EE +0A38 ; [.277F.0020.0002] # GURMUKHI LETTER SA +0A36 ; [.277F.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER SHA +0A39 ; [.2780.0020.0002] # GURMUKHI LETTER HA +0A51 ; [.2781.0020.0002] # GURMUKHI SIGN UDAAT +0A15 ; [.2782.0020.0002] # GURMUKHI LETTER KA +0A16 ; [.2783.0020.0002] # GURMUKHI LETTER KHA +0A59 ; [.2783.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER KHHA +0A17 ; [.2784.0020.0002] # GURMUKHI LETTER GA +0A5A ; [.2784.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER GHHA +0A18 ; [.2785.0020.0002] # GURMUKHI LETTER GHA +0A19 ; [.2786.0020.0002] # GURMUKHI LETTER NGA +0A1A ; [.2787.0020.0002] # GURMUKHI LETTER CA +0A1B ; [.2788.0020.0002] # GURMUKHI LETTER CHA +0A1C ; [.2789.0020.0002] # GURMUKHI LETTER JA +0A5B ; [.2789.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER ZA +0A1D ; [.278A.0020.0002] # GURMUKHI LETTER JHA +0A1E ; [.278B.0020.0002] # GURMUKHI LETTER NYA +0A1F ; [.278C.0020.0002] # GURMUKHI LETTER TTA +0A20 ; [.278D.0020.0002] # GURMUKHI LETTER TTHA +0A21 ; [.278E.0020.0002] # GURMUKHI LETTER DDA +0A22 ; [.278F.0020.0002] # GURMUKHI LETTER DDHA +0A23 ; [.2790.0020.0002] # GURMUKHI LETTER NNA +0A24 ; [.2791.0020.0002] # GURMUKHI LETTER TA +0A25 ; [.2792.0020.0002] # GURMUKHI LETTER THA +0A26 ; [.2793.0020.0002] # GURMUKHI LETTER DA +0A27 ; [.2794.0020.0002] # GURMUKHI LETTER DHA +0A28 ; [.2795.0020.0002] # GURMUKHI LETTER NA +0A2A ; [.2796.0020.0002] # GURMUKHI LETTER PA +0A2B ; [.2797.0020.0002] # GURMUKHI LETTER PHA +0A5E ; [.2797.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER FA +0A2C ; [.2798.0020.0002] # GURMUKHI LETTER BA +0A2D ; [.2799.0020.0002] # GURMUKHI LETTER BHA +0A2E ; [.279A.0020.0002] # GURMUKHI LETTER MA +0A2F ; [.279B.0020.0002] # GURMUKHI LETTER YA +0A75 ; [.279C.0020.0002] # GURMUKHI SIGN YAKASH +0A30 ; [.279D.0020.0002] # GURMUKHI LETTER RA +0A32 ; [.279E.0020.0002] # GURMUKHI LETTER LA +0A33 ; [.279E.0020.0002][.0000.00C2.0002] # GURMUKHI LETTER LLA +0A35 ; [.279F.0020.0002] # GURMUKHI LETTER VA +0A5C ; [.27A0.0020.0002] # GURMUKHI LETTER RRA +0A3E ; [.27A1.0020.0002] # GURMUKHI VOWEL SIGN AA +0A3F ; [.27A2.0020.0002] # GURMUKHI VOWEL SIGN I +0A40 ; [.27A3.0020.0002] # GURMUKHI VOWEL SIGN II +0A41 ; [.27A4.0020.0002] # GURMUKHI VOWEL SIGN U +0A42 ; [.27A5.0020.0002] # GURMUKHI VOWEL SIGN UU +0A47 ; [.27A6.0020.0002] # GURMUKHI VOWEL SIGN EE +0A48 ; [.27A7.0020.0002] # GURMUKHI VOWEL SIGN AI +0A4B ; [.27A8.0020.0002] # GURMUKHI VOWEL SIGN OO +0A4C ; [.27A9.0020.0002] # GURMUKHI VOWEL SIGN AU +0A4D ; [.27AA.0020.0002] # GURMUKHI SIGN VIRAMA +0AD0 ; [.27AB.0020.0002] # GUJARATI OM +0A85 ; [.27AC.0020.0002] # GUJARATI LETTER A +0A86 ; [.27AD.0020.0002] # GUJARATI LETTER AA +0A87 ; [.27AE.0020.0002] # GUJARATI LETTER I +0A88 ; [.27AF.0020.0002] # GUJARATI LETTER II +0A89 ; [.27B0.0020.0002] # GUJARATI LETTER U +0A8A ; [.27B1.0020.0002] # GUJARATI LETTER UU +0A8B ; [.27B2.0020.0002] # GUJARATI LETTER VOCALIC R +0AE0 ; [.27B3.0020.0002] # GUJARATI LETTER VOCALIC RR +0A8C ; [.27B4.0020.0002] # GUJARATI LETTER VOCALIC L +0AE1 ; [.27B5.0020.0002] # GUJARATI LETTER VOCALIC LL +0A8D ; [.27B6.0020.0002] # GUJARATI VOWEL CANDRA E +0A8F ; [.27B7.0020.0002] # GUJARATI LETTER E +0A90 ; [.27B8.0020.0002] # GUJARATI LETTER AI +0A91 ; [.27B9.0020.0002] # GUJARATI VOWEL CANDRA O +0A93 ; [.27BA.0020.0002] # GUJARATI LETTER O +0A94 ; [.27BB.0020.0002] # GUJARATI LETTER AU +0A95 ; [.27BC.0020.0002] # GUJARATI LETTER KA +0A96 ; [.27BD.0020.0002] # GUJARATI LETTER KHA +0A97 ; [.27BE.0020.0002] # GUJARATI LETTER GA +0A98 ; [.27BF.0020.0002] # GUJARATI LETTER GHA +0A99 ; [.27C0.0020.0002] # GUJARATI LETTER NGA +0A9A ; [.27C1.0020.0002] # GUJARATI LETTER CA +0A9B ; [.27C2.0020.0002] # GUJARATI LETTER CHA +0A9C ; [.27C3.0020.0002] # GUJARATI LETTER JA +0AF9 ; [.27C4.0020.0002] # GUJARATI LETTER ZHA +0A9D ; [.27C5.0020.0002] # GUJARATI LETTER JHA +0A9E ; [.27C6.0020.0002] # GUJARATI LETTER NYA +0A9F ; [.27C7.0020.0002] # GUJARATI LETTER TTA +0AA0 ; [.27C8.0020.0002] # GUJARATI LETTER TTHA +0AA1 ; [.27C9.0020.0002] # GUJARATI LETTER DDA +0AA2 ; [.27CA.0020.0002] # GUJARATI LETTER DDHA +0AA3 ; [.27CB.0020.0002] # GUJARATI LETTER NNA +0AA4 ; [.27CC.0020.0002] # GUJARATI LETTER TA +0AA5 ; [.27CD.0020.0002] # GUJARATI LETTER THA +0AA6 ; [.27CE.0020.0002] # GUJARATI LETTER DA +0AA7 ; [.27CF.0020.0002] # GUJARATI LETTER DHA +0AA8 ; [.27D0.0020.0002] # GUJARATI LETTER NA +0AAA ; [.27D1.0020.0002] # GUJARATI LETTER PA +0AAB ; [.27D2.0020.0002] # GUJARATI LETTER PHA +0AAC ; [.27D3.0020.0002] # GUJARATI LETTER BA +0AAD ; [.27D4.0020.0002] # GUJARATI LETTER BHA +0AAE ; [.27D5.0020.0002] # GUJARATI LETTER MA +0AAF ; [.27D6.0020.0002] # GUJARATI LETTER YA +0AB0 ; [.27D7.0020.0002] # GUJARATI LETTER RA +0AB2 ; [.27D8.0020.0002] # GUJARATI LETTER LA +0AB5 ; [.27D9.0020.0002] # GUJARATI LETTER VA +0AB6 ; [.27DA.0020.0002] # GUJARATI LETTER SHA +0AB7 ; [.27DB.0020.0002] # GUJARATI LETTER SSA +0AB8 ; [.27DC.0020.0002] # GUJARATI LETTER SA +0AB9 ; [.27DD.0020.0002] # GUJARATI LETTER HA +0AB3 ; [.27DE.0020.0002] # GUJARATI LETTER LLA +0ABD ; [.27DF.0020.0002] # GUJARATI SIGN AVAGRAHA +0ABE ; [.27E0.0020.0002] # GUJARATI VOWEL SIGN AA +0ABF ; [.27E1.0020.0002] # GUJARATI VOWEL SIGN I +0AC0 ; [.27E2.0020.0002] # GUJARATI VOWEL SIGN II +0AC1 ; [.27E3.0020.0002] # GUJARATI VOWEL SIGN U +0AC2 ; [.27E4.0020.0002] # GUJARATI VOWEL SIGN UU +0AC3 ; [.27E5.0020.0002] # GUJARATI VOWEL SIGN VOCALIC R +0AC4 ; [.27E6.0020.0002] # GUJARATI VOWEL SIGN VOCALIC RR +0AE2 ; [.27E7.0020.0002] # GUJARATI VOWEL SIGN VOCALIC L +0AE3 ; [.27E8.0020.0002] # GUJARATI VOWEL SIGN VOCALIC LL +0AC5 ; [.27E9.0020.0002] # GUJARATI VOWEL SIGN CANDRA E +0AC7 ; [.27EA.0020.0002] # GUJARATI VOWEL SIGN E +0AC8 ; [.27EB.0020.0002] # GUJARATI VOWEL SIGN AI +0AC9 ; [.27EC.0020.0002] # GUJARATI VOWEL SIGN CANDRA O +0ACB ; [.27ED.0020.0002] # GUJARATI VOWEL SIGN O +0ACC ; [.27EE.0020.0002] # GUJARATI VOWEL SIGN AU +0ACD ; [.27EF.0020.0002] # GUJARATI SIGN VIRAMA +0B05 ; [.27F0.0020.0002] # ORIYA LETTER A +0B06 ; [.27F1.0020.0002] # ORIYA LETTER AA +0B07 ; [.27F2.0020.0002] # ORIYA LETTER I +0B08 ; [.27F3.0020.0002] # ORIYA LETTER II +0B09 ; [.27F4.0020.0002] # ORIYA LETTER U +0B0A ; [.27F5.0020.0002] # ORIYA LETTER UU +0B0B ; [.27F6.0020.0002] # ORIYA LETTER VOCALIC R +0B60 ; [.27F7.0020.0002] # ORIYA LETTER VOCALIC RR +0B0C ; [.27F8.0020.0002] # ORIYA LETTER VOCALIC L +0B61 ; [.27F9.0020.0002] # ORIYA LETTER VOCALIC LL +0B0F ; [.27FA.0020.0002] # ORIYA LETTER E +0B10 ; [.27FB.0020.0002] # ORIYA LETTER AI +0B13 ; [.27FC.0020.0002] # ORIYA LETTER O +0B14 ; [.27FD.0020.0002] # ORIYA LETTER AU +0B15 ; [.27FE.0020.0002] # ORIYA LETTER KA +0B16 ; [.27FF.0020.0002] # ORIYA LETTER KHA +0B17 ; [.2800.0020.0002] # ORIYA LETTER GA +0B18 ; [.2801.0020.0002] # ORIYA LETTER GHA +0B19 ; [.2802.0020.0002] # ORIYA LETTER NGA +0B1A ; [.2803.0020.0002] # ORIYA LETTER CA +0B1B ; [.2804.0020.0002] # ORIYA LETTER CHA +0B1C ; [.2805.0020.0002] # ORIYA LETTER JA +0B1D ; [.2806.0020.0002] # ORIYA LETTER JHA +0B1E ; [.2807.0020.0002] # ORIYA LETTER NYA +0B1F ; [.2808.0020.0002] # ORIYA LETTER TTA +0B20 ; [.2809.0020.0002] # ORIYA LETTER TTHA +0B21 ; [.280A.0020.0002] # ORIYA LETTER DDA +0B5C ; [.280A.0020.0002][.0000.00C2.0002] # ORIYA LETTER RRA +0B22 ; [.280B.0020.0002] # ORIYA LETTER DDHA +0B5D ; [.280B.0020.0002][.0000.00C2.0002] # ORIYA LETTER RHA +0B23 ; [.280C.0020.0002] # ORIYA LETTER NNA +0B24 ; [.280D.0020.0002] # ORIYA LETTER TA +0B25 ; [.280E.0020.0002] # ORIYA LETTER THA +0B26 ; [.280F.0020.0002] # ORIYA LETTER DA +0B27 ; [.2810.0020.0002] # ORIYA LETTER DHA +0B28 ; [.2811.0020.0002] # ORIYA LETTER NA +0B2A ; [.2812.0020.0002] # ORIYA LETTER PA +0B2B ; [.2813.0020.0002] # ORIYA LETTER PHA +0B2C ; [.2814.0020.0002] # ORIYA LETTER BA +0B2D ; [.2815.0020.0002] # ORIYA LETTER BHA +0B2E ; [.2816.0020.0002] # ORIYA LETTER MA +0B2F ; [.2817.0020.0002] # ORIYA LETTER YA +0B5F ; [.2818.0020.0002] # ORIYA LETTER YYA +0B30 ; [.2819.0020.0002] # ORIYA LETTER RA +0B32 ; [.281A.0020.0002] # ORIYA LETTER LA +0B33 ; [.281B.0020.0002] # ORIYA LETTER LLA +0B35 ; [.281C.0020.0002] # ORIYA LETTER VA +0B71 ; [.281D.0020.0002] # ORIYA LETTER WA +0B36 ; [.281E.0020.0002] # ORIYA LETTER SHA +0B37 ; [.281F.0020.0002] # ORIYA LETTER SSA +0B38 ; [.2820.0020.0002] # ORIYA LETTER SA +0B39 ; [.2821.0020.0002] # ORIYA LETTER HA +0B3D ; [.2822.0020.0002] # ORIYA SIGN AVAGRAHA +0B3E ; [.2823.0020.0002] # ORIYA VOWEL SIGN AA +0B3F ; [.2824.0020.0002] # ORIYA VOWEL SIGN I +0B40 ; [.2825.0020.0002] # ORIYA VOWEL SIGN II +0B41 ; [.2826.0020.0002] # ORIYA VOWEL SIGN U +0B42 ; [.2827.0020.0002] # ORIYA VOWEL SIGN UU +0B43 ; [.2828.0020.0002] # ORIYA VOWEL SIGN VOCALIC R +0B44 ; [.2829.0020.0002] # ORIYA VOWEL SIGN VOCALIC RR +0B62 ; [.282A.0020.0002] # ORIYA VOWEL SIGN VOCALIC L +0B63 ; [.282B.0020.0002] # ORIYA VOWEL SIGN VOCALIC LL +0B47 ; [.282C.0020.0002] # ORIYA VOWEL SIGN E +0B48 ; [.282D.0020.0002] # ORIYA VOWEL SIGN AI +0B47 0B56 ; [.282D.0020.0002] # ORIYA VOWEL SIGN AI +0B4B ; [.282E.0020.0002] # ORIYA VOWEL SIGN O +0B47 0B3E ; [.282E.0020.0002] # ORIYA VOWEL SIGN O +0B4C ; [.282F.0020.0002] # ORIYA VOWEL SIGN AU +0B47 0B57 ; [.282F.0020.0002] # ORIYA VOWEL SIGN AU +0B4D ; [.2830.0020.0002] # ORIYA SIGN VIRAMA +0B56 ; [.2831.0020.0002] # ORIYA AI LENGTH MARK +0B57 ; [.2832.0020.0002] # ORIYA AU LENGTH MARK +0BD0 ; [.2833.0020.0002] # TAMIL OM +0B85 ; [.2834.0020.0002] # TAMIL LETTER A +0B86 ; [.2835.0020.0002] # TAMIL LETTER AA +0B87 ; [.2836.0020.0002] # TAMIL LETTER I +0B88 ; [.2837.0020.0002] # TAMIL LETTER II +0B89 ; [.2838.0020.0002] # TAMIL LETTER U +0B8A ; [.2839.0020.0002] # TAMIL LETTER UU +0B8E ; [.283A.0020.0002] # TAMIL LETTER E +0B8F ; [.283B.0020.0002] # TAMIL LETTER EE +0B90 ; [.283C.0020.0002] # TAMIL LETTER AI +0B92 ; [.283D.0020.0002] # TAMIL LETTER O +0B93 ; [.283E.0020.0002] # TAMIL LETTER OO +0B94 ; [.283F.0020.0002] # TAMIL LETTER AU +0B92 0BD7 ; [.283F.0020.0002] # TAMIL LETTER AU +0B83 ; [.2840.0020.0002] # TAMIL SIGN VISARGA +0B95 ; [.2841.0020.0002] # TAMIL LETTER KA +0B99 ; [.2842.0020.0002] # TAMIL LETTER NGA +0B9A ; [.2843.0020.0002] # TAMIL LETTER CA +0B9E ; [.2844.0020.0002] # TAMIL LETTER NYA +0B9F ; [.2845.0020.0002] # TAMIL LETTER TTA +0BA3 ; [.2846.0020.0002] # TAMIL LETTER NNA +0BA4 ; [.2847.0020.0002] # TAMIL LETTER TA +0BA8 ; [.2848.0020.0002] # TAMIL LETTER NA +0BAA ; [.2849.0020.0002] # TAMIL LETTER PA +0BAE ; [.284A.0020.0002] # TAMIL LETTER MA +0BAF ; [.284B.0020.0002] # TAMIL LETTER YA +0BB0 ; [.284C.0020.0002] # TAMIL LETTER RA +0BB2 ; [.284D.0020.0002] # TAMIL LETTER LA +0BB5 ; [.284E.0020.0002] # TAMIL LETTER VA +0BB4 ; [.284F.0020.0002] # TAMIL LETTER LLLA +0BB3 ; [.2850.0020.0002] # TAMIL LETTER LLA +0BB1 ; [.2851.0020.0002] # TAMIL LETTER RRA +0BA9 ; [.2852.0020.0002] # TAMIL LETTER NNNA +0B9C ; [.2853.0020.0002] # TAMIL LETTER JA +0BB6 ; [.2854.0020.0002] # TAMIL LETTER SHA +0BB7 ; [.2855.0020.0002] # TAMIL LETTER SSA +0BB8 ; [.2856.0020.0002] # TAMIL LETTER SA +0BB9 ; [.2857.0020.0002] # TAMIL LETTER HA +0BBE ; [.2858.0020.0002] # TAMIL VOWEL SIGN AA +0BBF ; [.2859.0020.0002] # TAMIL VOWEL SIGN I +0BC0 ; [.285A.0020.0002] # TAMIL VOWEL SIGN II +0BC1 ; [.285B.0020.0002] # TAMIL VOWEL SIGN U +0BC2 ; [.285C.0020.0002] # TAMIL VOWEL SIGN UU +0BC6 ; [.285D.0020.0002] # TAMIL VOWEL SIGN E +0BC7 ; [.285E.0020.0002] # TAMIL VOWEL SIGN EE +0BC8 ; [.285F.0020.0002] # TAMIL VOWEL SIGN AI +0BCA ; [.2860.0020.0002] # TAMIL VOWEL SIGN O +0BC6 0BBE ; [.2860.0020.0002] # TAMIL VOWEL SIGN O +0BCB ; [.2861.0020.0002] # TAMIL VOWEL SIGN OO +0BC7 0BBE ; [.2861.0020.0002] # TAMIL VOWEL SIGN OO +0BCC ; [.2862.0020.0002] # TAMIL VOWEL SIGN AU +0BC6 0BD7 ; [.2862.0020.0002] # TAMIL VOWEL SIGN AU +0BCD ; [.2863.0020.0002] # TAMIL SIGN VIRAMA +0BD7 ; [.2864.0020.0002] # TAMIL AU LENGTH MARK +0C05 ; [.2865.0020.0002] # TELUGU LETTER A +0C06 ; [.2866.0020.0002] # TELUGU LETTER AA +0C07 ; [.2867.0020.0002] # TELUGU LETTER I +0C08 ; [.2868.0020.0002] # TELUGU LETTER II +0C09 ; [.2869.0020.0002] # TELUGU LETTER U +0C0A ; [.286A.0020.0002] # TELUGU LETTER UU +0C0B ; [.286B.0020.0002] # TELUGU LETTER VOCALIC R +0C60 ; [.286C.0020.0002] # TELUGU LETTER VOCALIC RR +0C0C ; [.286D.0020.0002] # TELUGU LETTER VOCALIC L +0C61 ; [.286E.0020.0002] # TELUGU LETTER VOCALIC LL +0C0E ; [.286F.0020.0002] # TELUGU LETTER E +0C0F ; [.2870.0020.0002] # TELUGU LETTER EE +0C10 ; [.2871.0020.0002] # TELUGU LETTER AI +0C12 ; [.2872.0020.0002] # TELUGU LETTER O +0C13 ; [.2873.0020.0002] # TELUGU LETTER OO +0C14 ; [.2874.0020.0002] # TELUGU LETTER AU +0C15 ; [.2875.0020.0002] # TELUGU LETTER KA +0C16 ; [.2876.0020.0002] # TELUGU LETTER KHA +0C17 ; [.2877.0020.0002] # TELUGU LETTER GA +0C18 ; [.2878.0020.0002] # TELUGU LETTER GHA +0C19 ; [.2879.0020.0002] # TELUGU LETTER NGA +0C1A ; [.287A.0020.0002] # TELUGU LETTER CA +0C58 ; [.287B.0020.0002] # TELUGU LETTER TSA +0C1B ; [.287C.0020.0002] # TELUGU LETTER CHA +0C1C ; [.287D.0020.0002] # TELUGU LETTER JA +0C59 ; [.287E.0020.0002] # TELUGU LETTER DZA +0C1D ; [.287F.0020.0002] # TELUGU LETTER JHA +0C1E ; [.2880.0020.0002] # TELUGU LETTER NYA +0C1F ; [.2881.0020.0002] # TELUGU LETTER TTA +0C20 ; [.2882.0020.0002] # TELUGU LETTER TTHA +0C21 ; [.2883.0020.0002] # TELUGU LETTER DDA +0C22 ; [.2884.0020.0002] # TELUGU LETTER DDHA +0C23 ; [.2885.0020.0002] # TELUGU LETTER NNA +0C24 ; [.2886.0020.0002] # TELUGU LETTER TA +0C25 ; [.2887.0020.0002] # TELUGU LETTER THA +0C26 ; [.2888.0020.0002] # TELUGU LETTER DA +0C27 ; [.2889.0020.0002] # TELUGU LETTER DHA +0C28 ; [.288A.0020.0002] # TELUGU LETTER NA +0C2A ; [.288B.0020.0002] # TELUGU LETTER PA +0C2B ; [.288C.0020.0002] # TELUGU LETTER PHA +0C2C ; [.288D.0020.0002] # TELUGU LETTER BA +0C2D ; [.288E.0020.0002] # TELUGU LETTER BHA +0C2E ; [.288F.0020.0002] # TELUGU LETTER MA +0C2F ; [.2890.0020.0002] # TELUGU LETTER YA +0C30 ; [.2891.0020.0002] # TELUGU LETTER RA +0C31 ; [.2892.0020.0002] # TELUGU LETTER RRA +0C32 ; [.2893.0020.0002] # TELUGU LETTER LA +0C35 ; [.2894.0020.0002] # TELUGU LETTER VA +0C36 ; [.2895.0020.0002] # TELUGU LETTER SHA +0C37 ; [.2896.0020.0002] # TELUGU LETTER SSA +0C38 ; [.2897.0020.0002] # TELUGU LETTER SA +0C39 ; [.2898.0020.0002] # TELUGU LETTER HA +0C33 ; [.2899.0020.0002] # TELUGU LETTER LLA +0C34 ; [.289A.0020.0002] # TELUGU LETTER LLLA +0C5A ; [.289B.0020.0002] # TELUGU LETTER RRRA +0C3D ; [.289C.0020.0002] # TELUGU SIGN AVAGRAHA +0C3E ; [.289D.0020.0002] # TELUGU VOWEL SIGN AA +0C3F ; [.289E.0020.0002] # TELUGU VOWEL SIGN I +0C40 ; [.289F.0020.0002] # TELUGU VOWEL SIGN II +0C41 ; [.28A0.0020.0002] # TELUGU VOWEL SIGN U +0C42 ; [.28A1.0020.0002] # TELUGU VOWEL SIGN UU +0C43 ; [.28A2.0020.0002] # TELUGU VOWEL SIGN VOCALIC R +0C44 ; [.28A3.0020.0002] # TELUGU VOWEL SIGN VOCALIC RR +0C62 ; [.28A4.0020.0002] # TELUGU VOWEL SIGN VOCALIC L +0C63 ; [.28A5.0020.0002] # TELUGU VOWEL SIGN VOCALIC LL +0C46 ; [.28A6.0020.0002] # TELUGU VOWEL SIGN E +0C47 ; [.28A7.0020.0002] # TELUGU VOWEL SIGN EE +0C48 ; [.28A8.0020.0002] # TELUGU VOWEL SIGN AI +0C46 0C56 ; [.28A8.0020.0002] # TELUGU VOWEL SIGN AI +0C4A ; [.28A9.0020.0002] # TELUGU VOWEL SIGN O +0C4B ; [.28AA.0020.0002] # TELUGU VOWEL SIGN OO +0C4C ; [.28AB.0020.0002] # TELUGU VOWEL SIGN AU +0C4D ; [.28AC.0020.0002] # TELUGU SIGN VIRAMA +0C55 ; [.28AD.0020.0002] # TELUGU LENGTH MARK +0C56 ; [.28AE.0020.0002] # TELUGU AI LENGTH MARK +0C85 ; [.28AF.0020.0002] # KANNADA LETTER A +0C86 ; [.28B0.0020.0002] # KANNADA LETTER AA +0C87 ; [.28B1.0020.0002] # KANNADA LETTER I +0C88 ; [.28B2.0020.0002] # KANNADA LETTER II +0C89 ; [.28B3.0020.0002] # KANNADA LETTER U +0C8A ; [.28B4.0020.0002] # KANNADA LETTER UU +0C8B ; [.28B5.0020.0002] # KANNADA LETTER VOCALIC R +0CE0 ; [.28B6.0020.0002] # KANNADA LETTER VOCALIC RR +0C8C ; [.28B7.0020.0002] # KANNADA LETTER VOCALIC L +0CE1 ; [.28B8.0020.0002] # KANNADA LETTER VOCALIC LL +0C8E ; [.28B9.0020.0002] # KANNADA LETTER E +0C8F ; [.28BA.0020.0002] # KANNADA LETTER EE +0C90 ; [.28BB.0020.0002] # KANNADA LETTER AI +0C92 ; [.28BC.0020.0002] # KANNADA LETTER O +0C93 ; [.28BD.0020.0002] # KANNADA LETTER OO +0C94 ; [.28BE.0020.0002] # KANNADA LETTER AU +0C95 ; [.28BF.0020.0002] # KANNADA LETTER KA +0C96 ; [.28C0.0020.0002] # KANNADA LETTER KHA +0C97 ; [.28C1.0020.0002] # KANNADA LETTER GA +0C98 ; [.28C2.0020.0002] # KANNADA LETTER GHA +0C99 ; [.28C3.0020.0002] # KANNADA LETTER NGA +0C9A ; [.28C4.0020.0002] # KANNADA LETTER CA +0C9B ; [.28C5.0020.0002] # KANNADA LETTER CHA +0C9C ; [.28C6.0020.0002] # KANNADA LETTER JA +0C9D ; [.28C7.0020.0002] # KANNADA LETTER JHA +0C9E ; [.28C8.0020.0002] # KANNADA LETTER NYA +0C9F ; [.28C9.0020.0002] # KANNADA LETTER TTA +0CA0 ; [.28CA.0020.0002] # KANNADA LETTER TTHA +0CA1 ; [.28CB.0020.0002] # KANNADA LETTER DDA +0CA2 ; [.28CC.0020.0002] # KANNADA LETTER DDHA +0CA3 ; [.28CD.0020.0002] # KANNADA LETTER NNA +0CA4 ; [.28CE.0020.0002] # KANNADA LETTER TA +0CA5 ; [.28CF.0020.0002] # KANNADA LETTER THA +0CA6 ; [.28D0.0020.0002] # KANNADA LETTER DA +0CA7 ; [.28D1.0020.0002] # KANNADA LETTER DHA +0CA8 ; [.28D2.0020.0002] # KANNADA LETTER NA +0CAA ; [.28D3.0020.0002] # KANNADA LETTER PA +0CAB ; [.28D4.0020.0002] # KANNADA LETTER PHA +0CAC ; [.28D5.0020.0002] # KANNADA LETTER BA +0CAD ; [.28D6.0020.0002] # KANNADA LETTER BHA +0CAE ; [.28D7.0020.0002] # KANNADA LETTER MA +0CAF ; [.28D8.0020.0002] # KANNADA LETTER YA +0CB0 ; [.28D9.0020.0002] # KANNADA LETTER RA +0CB1 ; [.28DA.0020.0002] # KANNADA LETTER RRA +0CB2 ; [.28DB.0020.0002] # KANNADA LETTER LA +0CB5 ; [.28DC.0020.0002] # KANNADA LETTER VA +0CB6 ; [.28DD.0020.0002] # KANNADA LETTER SHA +0CB7 ; [.28DE.0020.0002] # KANNADA LETTER SSA +0CB8 ; [.28DF.0020.0002] # KANNADA LETTER SA +0CB9 ; [.28E0.0020.0002] # KANNADA LETTER HA +0CB3 ; [.28E1.0020.0002] # KANNADA LETTER LLA +0CDE ; [.28E2.0020.0002] # KANNADA LETTER FA +0CBD ; [.28E3.0020.0002] # KANNADA SIGN AVAGRAHA +0CF1 ; [.28E4.0020.0002] # KANNADA SIGN JIHVAMULIYA +0CF2 ; [.28E5.0020.0002] # KANNADA SIGN UPADHMANIYA +0C80 ; [.28E6.0020.0002] # KANNADA SIGN SPACING CANDRABINDU +0CBE ; [.28E7.0020.0002] # KANNADA VOWEL SIGN AA +0CBF ; [.28E8.0020.0002] # KANNADA VOWEL SIGN I +0CC0 ; [.28E9.0020.0002] # KANNADA VOWEL SIGN II +0CBF 0CD5 ; [.28E9.0020.0002] # KANNADA VOWEL SIGN II +0CC1 ; [.28EA.0020.0002] # KANNADA VOWEL SIGN U +0CC2 ; [.28EB.0020.0002] # KANNADA VOWEL SIGN UU +0CC3 ; [.28EC.0020.0002] # KANNADA VOWEL SIGN VOCALIC R +0CC4 ; [.28ED.0020.0002] # KANNADA VOWEL SIGN VOCALIC RR +0CE2 ; [.28EE.0020.0002] # KANNADA VOWEL SIGN VOCALIC L +0CE3 ; [.28EF.0020.0002] # KANNADA VOWEL SIGN VOCALIC LL +0CC6 ; [.28F0.0020.0002] # KANNADA VOWEL SIGN E +0CC7 ; [.28F1.0020.0002] # KANNADA VOWEL SIGN EE +0CC6 0CD5 ; [.28F1.0020.0002] # KANNADA VOWEL SIGN EE +0CC8 ; [.28F2.0020.0002] # KANNADA VOWEL SIGN AI +0CC6 0CD6 ; [.28F2.0020.0002] # KANNADA VOWEL SIGN AI +0CCA ; [.28F3.0020.0002] # KANNADA VOWEL SIGN O +0CC6 0CC2 ; [.28F3.0020.0002] # KANNADA VOWEL SIGN O +0CCB ; [.28F4.0020.0002] # KANNADA VOWEL SIGN OO +0CC6 0CC2 0CD5 ; [.28F4.0020.0002] # KANNADA VOWEL SIGN OO +0CCA 0CD5 ; [.28F4.0020.0002] # KANNADA VOWEL SIGN OO +0CCC ; [.28F5.0020.0002] # KANNADA VOWEL SIGN AU +0CCD ; [.28F6.0020.0002] # KANNADA SIGN VIRAMA +0CD5 ; [.28F7.0020.0002] # KANNADA LENGTH MARK +0CD6 ; [.28F8.0020.0002] # KANNADA AI LENGTH MARK +0D05 ; [.28F9.0020.0002] # MALAYALAM LETTER A +0D06 ; [.28FA.0020.0002] # MALAYALAM LETTER AA +0D07 ; [.28FB.0020.0002] # MALAYALAM LETTER I +0D08 ; [.28FC.0020.0002] # MALAYALAM LETTER II +0D5F ; [.28FD.0020.0002] # MALAYALAM LETTER ARCHAIC II +0D09 ; [.28FE.0020.0002] # MALAYALAM LETTER U +0D0A ; [.28FF.0020.0002] # MALAYALAM LETTER UU +0D0B ; [.2900.0020.0002] # MALAYALAM LETTER VOCALIC R +0D60 ; [.2901.0020.0002] # MALAYALAM LETTER VOCALIC RR +0D0C ; [.2902.0020.0002] # MALAYALAM LETTER VOCALIC L +0D61 ; [.2903.0020.0002] # MALAYALAM LETTER VOCALIC LL +0D0E ; [.2904.0020.0002] # MALAYALAM LETTER E +0D0F ; [.2905.0020.0002] # MALAYALAM LETTER EE +0D10 ; [.2906.0020.0002] # MALAYALAM LETTER AI +0D12 ; [.2907.0020.0002] # MALAYALAM LETTER O +0D13 ; [.2908.0020.0002] # MALAYALAM LETTER OO +0D14 ; [.2909.0020.0002] # MALAYALAM LETTER AU +0D15 ; [.290A.0020.0002] # MALAYALAM LETTER KA +0D7F ; [.290A.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU K +0D16 ; [.290B.0020.0002] # MALAYALAM LETTER KHA +0D17 ; [.290C.0020.0002] # MALAYALAM LETTER GA +0D18 ; [.290D.0020.0002] # MALAYALAM LETTER GHA +0D19 ; [.290E.0020.0002] # MALAYALAM LETTER NGA +0D1A ; [.290F.0020.0002] # MALAYALAM LETTER CA +0D1B ; [.2910.0020.0002] # MALAYALAM LETTER CHA +0D1C ; [.2911.0020.0002] # MALAYALAM LETTER JA +0D1D ; [.2912.0020.0002] # MALAYALAM LETTER JHA +0D1E ; [.2913.0020.0002] # MALAYALAM LETTER NYA +0D1F ; [.2914.0020.0002] # MALAYALAM LETTER TTA +0D20 ; [.2915.0020.0002] # MALAYALAM LETTER TTHA +0D21 ; [.2916.0020.0002] # MALAYALAM LETTER DDA +0D22 ; [.2917.0020.0002] # MALAYALAM LETTER DDHA +0D23 ; [.2918.0020.0002] # MALAYALAM LETTER NNA +0D7A ; [.2918.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU NN +0D24 ; [.2919.0020.0002] # MALAYALAM LETTER TA +0D25 ; [.291A.0020.0002] # MALAYALAM LETTER THA +0D26 ; [.291B.0020.0002] # MALAYALAM LETTER DA +0D27 ; [.291C.0020.0002] # MALAYALAM LETTER DHA +0D28 ; [.291D.0020.0002] # MALAYALAM LETTER NA +0D7B ; [.291D.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU N +0D29 ; [.291E.0020.0002] # MALAYALAM LETTER NNNA +0D2A ; [.291F.0020.0002] # MALAYALAM LETTER PA +0D2B ; [.2920.0020.0002] # MALAYALAM LETTER PHA +0D2C ; [.2921.0020.0002] # MALAYALAM LETTER BA +0D2D ; [.2922.0020.0002] # MALAYALAM LETTER BHA +0D2E ; [.2923.0020.0002] # MALAYALAM LETTER MA +0D54 ; [.2923.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU M +0D2F ; [.2924.0020.0002] # MALAYALAM LETTER YA +0D55 ; [.2924.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU Y +0D30 ; [.2925.0020.0002] # MALAYALAM LETTER RA +0D4E ; [.2925.0020.0004][.2941.0020.0004] # MALAYALAM LETTER DOT REPH +0D7C ; [.2925.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU RR +0D32 ; [.2926.0020.0002] # MALAYALAM LETTER LA +0D7D ; [.2926.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU L +0D35 ; [.2927.0020.0002] # MALAYALAM LETTER VA +0D36 ; [.2928.0020.0002] # MALAYALAM LETTER SHA +0D37 ; [.2929.0020.0002] # MALAYALAM LETTER SSA +0D38 ; [.292A.0020.0002] # MALAYALAM LETTER SA +0D39 ; [.292B.0020.0002] # MALAYALAM LETTER HA +0D33 ; [.292C.0020.0002] # MALAYALAM LETTER LLA +0D7E ; [.292C.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU LL +0D34 ; [.292D.0020.0002] # MALAYALAM LETTER LLLA +0D56 ; [.292D.0020.0004][.2941.0020.0004] # MALAYALAM LETTER CHILLU LLL +0D31 ; [.292E.0020.0002] # MALAYALAM LETTER RRA +0D3A ; [.292F.0020.0002] # MALAYALAM LETTER TTTA +0D3D ; [.2930.0020.0002] # MALAYALAM SIGN AVAGRAHA +0D3E ; [.2931.0020.0002] # MALAYALAM VOWEL SIGN AA +0D3F ; [.2932.0020.0002] # MALAYALAM VOWEL SIGN I +0D40 ; [.2933.0020.0002] # MALAYALAM VOWEL SIGN II +0D41 ; [.2934.0020.0002] # MALAYALAM VOWEL SIGN U +0D42 ; [.2935.0020.0002] # MALAYALAM VOWEL SIGN UU +0D43 ; [.2936.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC R +0D44 ; [.2937.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC RR +0D62 ; [.2938.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC L +0D63 ; [.2939.0020.0002] # MALAYALAM VOWEL SIGN VOCALIC LL +0D46 ; [.293A.0020.0002] # MALAYALAM VOWEL SIGN E +0D47 ; [.293B.0020.0002] # MALAYALAM VOWEL SIGN EE +0D48 ; [.293C.0020.0002] # MALAYALAM VOWEL SIGN AI +0D4A ; [.293D.0020.0002] # MALAYALAM VOWEL SIGN O +0D46 0D3E ; [.293D.0020.0002] # MALAYALAM VOWEL SIGN O +0D4B ; [.293E.0020.0002] # MALAYALAM VOWEL SIGN OO +0D47 0D3E ; [.293E.0020.0002] # MALAYALAM VOWEL SIGN OO +0D4C ; [.293F.0020.0002] # MALAYALAM VOWEL SIGN AU +0D46 0D57 ; [.293F.0020.0002] # MALAYALAM VOWEL SIGN AU +0D57 ; [.2940.0020.0002] # MALAYALAM AU LENGTH MARK +0D4D ; [.2941.0020.0002] # MALAYALAM SIGN VIRAMA +0D3B ; [.2941.0020.0004] # MALAYALAM SIGN VERTICAL BAR VIRAMA +0D3C ; [.2941.0020.0004] # MALAYALAM SIGN CIRCULAR VIRAMA +0D85 ; [.2942.0020.0002] # SINHALA LETTER AYANNA +0D86 ; [.2943.0020.0002] # SINHALA LETTER AAYANNA +0D87 ; [.2944.0020.0002] # SINHALA LETTER AEYANNA +0D88 ; [.2945.0020.0002] # SINHALA LETTER AEEYANNA +0D89 ; [.2946.0020.0002] # SINHALA LETTER IYANNA +0D8A ; [.2947.0020.0002] # SINHALA LETTER IIYANNA +0D8B ; [.2948.0020.0002] # SINHALA LETTER UYANNA +0D8C ; [.2949.0020.0002] # SINHALA LETTER UUYANNA +0D8D ; [.294A.0020.0002] # SINHALA LETTER IRUYANNA +0D8E ; [.294B.0020.0002] # SINHALA LETTER IRUUYANNA +0D8F ; [.294C.0020.0002] # SINHALA LETTER ILUYANNA +0D90 ; [.294D.0020.0002] # SINHALA LETTER ILUUYANNA +0D91 ; [.294E.0020.0002] # SINHALA LETTER EYANNA +0D92 ; [.294F.0020.0002] # SINHALA LETTER EEYANNA +0D93 ; [.2950.0020.0002] # SINHALA LETTER AIYANNA +0D94 ; [.2951.0020.0002] # SINHALA LETTER OYANNA +0D95 ; [.2952.0020.0002] # SINHALA LETTER OOYANNA +0D96 ; [.2953.0020.0002] # SINHALA LETTER AUYANNA +0D9A ; [.2954.0020.0002] # SINHALA LETTER ALPAPRAANA KAYANNA +0D9B ; [.2955.0020.0002] # SINHALA LETTER MAHAAPRAANA KAYANNA +0D9C ; [.2956.0020.0002] # SINHALA LETTER ALPAPRAANA GAYANNA +0D9D ; [.2957.0020.0002] # SINHALA LETTER MAHAAPRAANA GAYANNA +0D9E ; [.2958.0020.0002] # SINHALA LETTER KANTAJA NAASIKYAYA +0D9F ; [.2959.0020.0002] # SINHALA LETTER SANYAKA GAYANNA +0DA0 ; [.295A.0020.0002] # SINHALA LETTER ALPAPRAANA CAYANNA +0DA1 ; [.295B.0020.0002] # SINHALA LETTER MAHAAPRAANA CAYANNA +0DA2 ; [.295C.0020.0002] # SINHALA LETTER ALPAPRAANA JAYANNA +0DA3 ; [.295D.0020.0002] # SINHALA LETTER MAHAAPRAANA JAYANNA +0DA4 ; [.295E.0020.0002] # SINHALA LETTER TAALUJA NAASIKYAYA +0DA5 ; [.295F.0020.0002] # SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA +0DA6 ; [.2960.0020.0002] # SINHALA LETTER SANYAKA JAYANNA +0DA7 ; [.2961.0020.0002] # SINHALA LETTER ALPAPRAANA TTAYANNA +0DA8 ; [.2962.0020.0002] # SINHALA LETTER MAHAAPRAANA TTAYANNA +0DA9 ; [.2963.0020.0002] # SINHALA LETTER ALPAPRAANA DDAYANNA +0DAA ; [.2964.0020.0002] # SINHALA LETTER MAHAAPRAANA DDAYANNA +0DAB ; [.2965.0020.0002] # SINHALA LETTER MUURDHAJA NAYANNA +0DAC ; [.2966.0020.0002] # SINHALA LETTER SANYAKA DDAYANNA +0DAD ; [.2967.0020.0002] # SINHALA LETTER ALPAPRAANA TAYANNA +0DAE ; [.2968.0020.0002] # SINHALA LETTER MAHAAPRAANA TAYANNA +0DAF ; [.2969.0020.0002] # SINHALA LETTER ALPAPRAANA DAYANNA +0DB0 ; [.296A.0020.0002] # SINHALA LETTER MAHAAPRAANA DAYANNA +0DB1 ; [.296B.0020.0002] # SINHALA LETTER DANTAJA NAYANNA +0DB3 ; [.296C.0020.0002] # SINHALA LETTER SANYAKA DAYANNA +0DB4 ; [.296D.0020.0002] # SINHALA LETTER ALPAPRAANA PAYANNA +0DB5 ; [.296E.0020.0002] # SINHALA LETTER MAHAAPRAANA PAYANNA +0DB6 ; [.296F.0020.0002] # SINHALA LETTER ALPAPRAANA BAYANNA +0DB7 ; [.2970.0020.0002] # SINHALA LETTER MAHAAPRAANA BAYANNA +0DB8 ; [.2971.0020.0002] # SINHALA LETTER MAYANNA +0DB9 ; [.2972.0020.0002] # SINHALA LETTER AMBA BAYANNA +0DBA ; [.2973.0020.0002] # SINHALA LETTER YAYANNA +0DBB ; [.2974.0020.0002] # SINHALA LETTER RAYANNA +0DBD ; [.2975.0020.0002] # SINHALA LETTER DANTAJA LAYANNA +0DC0 ; [.2976.0020.0002] # SINHALA LETTER VAYANNA +0DC1 ; [.2977.0020.0002] # SINHALA LETTER TAALUJA SAYANNA +0DC2 ; [.2978.0020.0002] # SINHALA LETTER MUURDHAJA SAYANNA +0DC3 ; [.2979.0020.0002] # SINHALA LETTER DANTAJA SAYANNA +0DC4 ; [.297A.0020.0002] # SINHALA LETTER HAYANNA +0DC5 ; [.297B.0020.0002] # SINHALA LETTER MUURDHAJA LAYANNA +0DC6 ; [.297C.0020.0002] # SINHALA LETTER FAYANNA +0DCF ; [.297D.0020.0002] # SINHALA VOWEL SIGN AELA-PILLA +0DD0 ; [.297E.0020.0002] # SINHALA VOWEL SIGN KETTI AEDA-PILLA +0DD1 ; [.297F.0020.0002] # SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2 ; [.2980.0020.0002] # SINHALA VOWEL SIGN KETTI IS-PILLA +0DD3 ; [.2981.0020.0002] # SINHALA VOWEL SIGN DIGA IS-PILLA +0DD4 ; [.2982.0020.0002] # SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; [.2983.0020.0002] # SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8 ; [.2984.0020.0002] # SINHALA VOWEL SIGN GAETTA-PILLA +0DF2 ; [.2985.0020.0002] # SINHALA VOWEL SIGN DIGA GAETTA-PILLA +0DDF ; [.2986.0020.0002] # SINHALA VOWEL SIGN GAYANUKITTA +0DF3 ; [.2987.0020.0002] # SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DD9 ; [.2988.0020.0002] # SINHALA VOWEL SIGN KOMBUVA +0DDA ; [.2989.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA +0DD9 0DCA ; [.2989.0020.0002] # SINHALA VOWEL SIGN DIGA KOMBUVA +0DDB ; [.298A.0020.0002] # SINHALA VOWEL SIGN KOMBU DEKA +0DDC ; [.298B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DD9 0DCF ; [.298B.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DDD ; [.298C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DD9 0DCF 0DCA ; [.298C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDC 0DCA ; [.298C.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDE ; [.298D.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DD9 0DDF ; [.298D.0020.0002] # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0DCA ; [.298E.0020.0002] # SINHALA SIGN AL-LAKUNA +AAF2 ; [.298F.0020.0002] # MEETEI MAYEK ANJI +ABC0 ; [.2990.0020.0002] # MEETEI MAYEK LETTER KOK +ABC1 ; [.2991.0020.0002] # MEETEI MAYEK LETTER SAM +ABC2 ; [.2992.0020.0002] # MEETEI MAYEK LETTER LAI +ABC3 ; [.2993.0020.0002] # MEETEI MAYEK LETTER MIT +ABC4 ; [.2994.0020.0002] # MEETEI MAYEK LETTER PA +ABC5 ; [.2995.0020.0002] # MEETEI MAYEK LETTER NA +ABC6 ; [.2996.0020.0002] # MEETEI MAYEK LETTER CHIL +ABC7 ; [.2997.0020.0002] # MEETEI MAYEK LETTER TIL +ABC8 ; [.2998.0020.0002] # MEETEI MAYEK LETTER KHOU +ABC9 ; [.2999.0020.0002] # MEETEI MAYEK LETTER NGOU +ABCA ; [.299A.0020.0002] # MEETEI MAYEK LETTER THOU +ABCB ; [.299B.0020.0002] # MEETEI MAYEK LETTER WAI +ABCC ; [.299C.0020.0002] # MEETEI MAYEK LETTER YANG +ABCD ; [.299D.0020.0002] # MEETEI MAYEK LETTER HUK +ABCE ; [.299E.0020.0002] # MEETEI MAYEK LETTER UN +ABCF ; [.299F.0020.0002] # MEETEI MAYEK LETTER I +ABD0 ; [.29A0.0020.0002] # MEETEI MAYEK LETTER PHAM +ABD1 ; [.29A1.0020.0002] # MEETEI MAYEK LETTER ATIYA +ABD2 ; [.29A2.0020.0002] # MEETEI MAYEK LETTER GOK +ABD3 ; [.29A3.0020.0002] # MEETEI MAYEK LETTER JHAM +ABD4 ; [.29A4.0020.0002] # MEETEI MAYEK LETTER RAI +ABD5 ; [.29A5.0020.0002] # MEETEI MAYEK LETTER BA +ABD6 ; [.29A6.0020.0002] # MEETEI MAYEK LETTER JIL +ABD7 ; [.29A7.0020.0002] # MEETEI MAYEK LETTER DIL +ABD8 ; [.29A8.0020.0002] # MEETEI MAYEK LETTER GHOU +ABD9 ; [.29A9.0020.0002] # MEETEI MAYEK LETTER DHOU +ABDA ; [.29AA.0020.0002] # MEETEI MAYEK LETTER BHAM +AAE0 ; [.29AB.0020.0002] # MEETEI MAYEK LETTER E +AAE1 ; [.29AC.0020.0002] # MEETEI MAYEK LETTER O +AAE2 ; [.29AD.0020.0002] # MEETEI MAYEK LETTER CHA +AAE3 ; [.29AE.0020.0002] # MEETEI MAYEK LETTER NYA +AAE4 ; [.29AF.0020.0002] # MEETEI MAYEK LETTER TTA +AAE5 ; [.29B0.0020.0002] # MEETEI MAYEK LETTER TTHA +AAE6 ; [.29B1.0020.0002] # MEETEI MAYEK LETTER DDA +AAE7 ; [.29B2.0020.0002] # MEETEI MAYEK LETTER DDHA +AAE8 ; [.29B3.0020.0002] # MEETEI MAYEK LETTER NNA +AAE9 ; [.29B4.0020.0002] # MEETEI MAYEK LETTER SHA +AAEA ; [.29B5.0020.0002] # MEETEI MAYEK LETTER SSA +ABE3 ; [.29B6.0020.0002] # MEETEI MAYEK VOWEL SIGN ONAP +ABE4 ; [.29B7.0020.0002] # MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; [.29B8.0020.0002] # MEETEI MAYEK VOWEL SIGN ANAP +ABE6 ; [.29B9.0020.0002] # MEETEI MAYEK VOWEL SIGN YENAP +ABE7 ; [.29BA.0020.0002] # MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; [.29BB.0020.0002] # MEETEI MAYEK VOWEL SIGN UNAP +ABE9 ; [.29BC.0020.0002] # MEETEI MAYEK VOWEL SIGN CHEINAP +ABEA ; [.29BD.0020.0002] # MEETEI MAYEK VOWEL SIGN NUNG +AAEB ; [.29BE.0020.0002] # MEETEI MAYEK VOWEL SIGN II +AAEC ; [.29BF.0020.0002] # MEETEI MAYEK VOWEL SIGN UU +AAED ; [.29C0.0020.0002] # MEETEI MAYEK VOWEL SIGN AAI +AAEE ; [.29C1.0020.0002] # MEETEI MAYEK VOWEL SIGN AU +AAEF ; [.29C2.0020.0002] # MEETEI MAYEK VOWEL SIGN AAU +AAF5 ; [.29C3.0020.0002] # MEETEI MAYEK VOWEL SIGN VISARGA +ABDB ; [.29C4.0020.0002] # MEETEI MAYEK LETTER KOK LONSUM +ABDC ; [.29C5.0020.0002] # MEETEI MAYEK LETTER LAI LONSUM +ABDD ; [.29C6.0020.0002] # MEETEI MAYEK LETTER MIT LONSUM +ABDE ; [.29C7.0020.0002] # MEETEI MAYEK LETTER PA LONSUM +ABDF ; [.29C8.0020.0002] # MEETEI MAYEK LETTER NA LONSUM +ABE0 ; [.29C9.0020.0002] # MEETEI MAYEK LETTER TIL LONSUM +ABE1 ; [.29CA.0020.0002] # MEETEI MAYEK LETTER NGOU LONSUM +ABE2 ; [.29CB.0020.0002] # MEETEI MAYEK LETTER I LONSUM +ABED ; [.29CC.0020.0002] # MEETEI MAYEK APUN IYEK +AAF6 ; [.29CD.0020.0002] # MEETEI MAYEK VIRAMA +A800 ; [.29CE.0020.0002] # SYLOTI NAGRI LETTER A +A801 ; [.29CF.0020.0002] # SYLOTI NAGRI LETTER I +A802 ; [.29D0.0020.0002] # SYLOTI NAGRI SIGN DVISVARA +A803 ; [.29D1.0020.0002] # SYLOTI NAGRI LETTER U +A804 ; [.29D2.0020.0002] # SYLOTI NAGRI LETTER E +A805 ; [.29D3.0020.0002] # SYLOTI NAGRI LETTER O +A806 ; [.29D4.0020.0002] # SYLOTI NAGRI SIGN HASANTA +A807 ; [.29D5.0020.0002] # SYLOTI NAGRI LETTER KO +A808 ; [.29D6.0020.0002] # SYLOTI NAGRI LETTER KHO +A809 ; [.29D7.0020.0002] # SYLOTI NAGRI LETTER GO +A80A ; [.29D8.0020.0002] # SYLOTI NAGRI LETTER GHO +A80C ; [.29D9.0020.0002] # SYLOTI NAGRI LETTER CO +A80D ; [.29DA.0020.0002] # SYLOTI NAGRI LETTER CHO +A80E ; [.29DB.0020.0002] # SYLOTI NAGRI LETTER JO +A80F ; [.29DC.0020.0002] # SYLOTI NAGRI LETTER JHO +A810 ; [.29DD.0020.0002] # SYLOTI NAGRI LETTER TTO +A811 ; [.29DE.0020.0002] # SYLOTI NAGRI LETTER TTHO +A812 ; [.29DF.0020.0002] # SYLOTI NAGRI LETTER DDO +A813 ; [.29E0.0020.0002] # SYLOTI NAGRI LETTER DDHO +A814 ; [.29E1.0020.0002] # SYLOTI NAGRI LETTER TO +A815 ; [.29E2.0020.0002] # SYLOTI NAGRI LETTER THO +A816 ; [.29E3.0020.0002] # SYLOTI NAGRI LETTER DO +A817 ; [.29E4.0020.0002] # SYLOTI NAGRI LETTER DHO +A818 ; [.29E5.0020.0002] # SYLOTI NAGRI LETTER NO +A819 ; [.29E6.0020.0002] # SYLOTI NAGRI LETTER PO +A81A ; [.29E7.0020.0002] # SYLOTI NAGRI LETTER PHO +A81B ; [.29E8.0020.0002] # SYLOTI NAGRI LETTER BO +A81C ; [.29E9.0020.0002] # SYLOTI NAGRI LETTER BHO +A81D ; [.29EA.0020.0002] # SYLOTI NAGRI LETTER MO +A81E ; [.29EB.0020.0002] # SYLOTI NAGRI LETTER RO +A81F ; [.29EC.0020.0002] # SYLOTI NAGRI LETTER LO +A820 ; [.29ED.0020.0002] # SYLOTI NAGRI LETTER RRO +A821 ; [.29EE.0020.0002] # SYLOTI NAGRI LETTER SO +A822 ; [.29EF.0020.0002] # SYLOTI NAGRI LETTER HO +A823 ; [.29F0.0020.0002] # SYLOTI NAGRI VOWEL SIGN A +A824 ; [.29F1.0020.0002] # SYLOTI NAGRI VOWEL SIGN I +A825 ; [.29F2.0020.0002] # SYLOTI NAGRI VOWEL SIGN U +A826 ; [.29F3.0020.0002] # SYLOTI NAGRI VOWEL SIGN E +A827 ; [.29F4.0020.0002] # SYLOTI NAGRI VOWEL SIGN OO +A882 ; [.29F5.0020.0002] # SAURASHTRA LETTER A +A883 ; [.29F6.0020.0002] # SAURASHTRA LETTER AA +A884 ; [.29F7.0020.0002] # SAURASHTRA LETTER I +A885 ; [.29F8.0020.0002] # SAURASHTRA LETTER II +A886 ; [.29F9.0020.0002] # SAURASHTRA LETTER U +A887 ; [.29FA.0020.0002] # SAURASHTRA LETTER UU +A888 ; [.29FB.0020.0002] # SAURASHTRA LETTER VOCALIC R +A889 ; [.29FC.0020.0002] # SAURASHTRA LETTER VOCALIC RR +A88A ; [.29FD.0020.0002] # SAURASHTRA LETTER VOCALIC L +A88B ; [.29FE.0020.0002] # SAURASHTRA LETTER VOCALIC LL +A88C ; [.29FF.0020.0002] # SAURASHTRA LETTER E +A88D ; [.2A00.0020.0002] # SAURASHTRA LETTER EE +A88E ; [.2A01.0020.0002] # SAURASHTRA LETTER AI +A88F ; [.2A02.0020.0002] # SAURASHTRA LETTER O +A890 ; [.2A03.0020.0002] # SAURASHTRA LETTER OO +A891 ; [.2A04.0020.0002] # SAURASHTRA LETTER AU +A892 ; [.2A05.0020.0002] # SAURASHTRA LETTER KA +A893 ; [.2A06.0020.0002] # SAURASHTRA LETTER KHA +A894 ; [.2A07.0020.0002] # SAURASHTRA LETTER GA +A895 ; [.2A08.0020.0002] # SAURASHTRA LETTER GHA +A896 ; [.2A09.0020.0002] # SAURASHTRA LETTER NGA +A897 ; [.2A0A.0020.0002] # SAURASHTRA LETTER CA +A898 ; [.2A0B.0020.0002] # SAURASHTRA LETTER CHA +A899 ; [.2A0C.0020.0002] # SAURASHTRA LETTER JA +A89A ; [.2A0D.0020.0002] # SAURASHTRA LETTER JHA +A89B ; [.2A0E.0020.0002] # SAURASHTRA LETTER NYA +A89C ; [.2A0F.0020.0002] # SAURASHTRA LETTER TTA +A89D ; [.2A10.0020.0002] # SAURASHTRA LETTER TTHA +A89E ; [.2A11.0020.0002] # SAURASHTRA LETTER DDA +A89F ; [.2A12.0020.0002] # SAURASHTRA LETTER DDHA +A8A0 ; [.2A13.0020.0002] # SAURASHTRA LETTER NNA +A8A1 ; [.2A14.0020.0002] # SAURASHTRA LETTER TA +A8A2 ; [.2A15.0020.0002] # SAURASHTRA LETTER THA +A8A3 ; [.2A16.0020.0002] # SAURASHTRA LETTER DA +A8A4 ; [.2A17.0020.0002] # SAURASHTRA LETTER DHA +A8A5 ; [.2A18.0020.0002] # SAURASHTRA LETTER NA +A8A6 ; [.2A19.0020.0002] # SAURASHTRA LETTER PA +A8A7 ; [.2A1A.0020.0002] # SAURASHTRA LETTER PHA +A8A8 ; [.2A1B.0020.0002] # SAURASHTRA LETTER BA +A8A9 ; [.2A1C.0020.0002] # SAURASHTRA LETTER BHA +A8AA ; [.2A1D.0020.0002] # SAURASHTRA LETTER MA +A8AB ; [.2A1E.0020.0002] # SAURASHTRA LETTER YA +A8AC ; [.2A1F.0020.0002] # SAURASHTRA LETTER RA +A8AD ; [.2A20.0020.0002] # SAURASHTRA LETTER LA +A8AE ; [.2A21.0020.0002] # SAURASHTRA LETTER VA +A8AF ; [.2A22.0020.0002] # SAURASHTRA LETTER SHA +A8B0 ; [.2A23.0020.0002] # SAURASHTRA LETTER SSA +A8B1 ; [.2A24.0020.0002] # SAURASHTRA LETTER SA +A8B2 ; [.2A25.0020.0002] # SAURASHTRA LETTER HA +A8B3 ; [.2A26.0020.0002] # SAURASHTRA LETTER LLA +A8B4 ; [.2A27.0020.0002] # SAURASHTRA CONSONANT SIGN HAARU +A8B5 ; [.2A28.0020.0002] # SAURASHTRA VOWEL SIGN AA +A8B6 ; [.2A29.0020.0002] # SAURASHTRA VOWEL SIGN I +A8B7 ; [.2A2A.0020.0002] # SAURASHTRA VOWEL SIGN II +A8B8 ; [.2A2B.0020.0002] # SAURASHTRA VOWEL SIGN U +A8B9 ; [.2A2C.0020.0002] # SAURASHTRA VOWEL SIGN UU +A8BA ; [.2A2D.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC R +A8BB ; [.2A2E.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC RR +A8BC ; [.2A2F.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC L +A8BD ; [.2A30.0020.0002] # SAURASHTRA VOWEL SIGN VOCALIC LL +A8BE ; [.2A31.0020.0002] # SAURASHTRA VOWEL SIGN E +A8BF ; [.2A32.0020.0002] # SAURASHTRA VOWEL SIGN EE +A8C0 ; [.2A33.0020.0002] # SAURASHTRA VOWEL SIGN AI +A8C1 ; [.2A34.0020.0002] # SAURASHTRA VOWEL SIGN O +A8C2 ; [.2A35.0020.0002] # SAURASHTRA VOWEL SIGN OO +A8C3 ; [.2A36.0020.0002] # SAURASHTRA VOWEL SIGN AU +A8C4 ; [.2A37.0020.0002] # SAURASHTRA SIGN VIRAMA +11083 ; [.2A38.0020.0002] # KAITHI LETTER A +11084 ; [.2A39.0020.0002] # KAITHI LETTER AA +11085 ; [.2A3A.0020.0002] # KAITHI LETTER I +11086 ; [.2A3B.0020.0002] # KAITHI LETTER II +11087 ; [.2A3C.0020.0002] # KAITHI LETTER U +11088 ; [.2A3D.0020.0002] # KAITHI LETTER UU +11089 ; [.2A3E.0020.0002] # KAITHI LETTER E +1108A ; [.2A3F.0020.0002] # KAITHI LETTER AI +1108B ; [.2A40.0020.0002] # KAITHI LETTER O +1108C ; [.2A41.0020.0002] # KAITHI LETTER AU +1108D ; [.2A42.0020.0002] # KAITHI LETTER KA +1108E ; [.2A43.0020.0002] # KAITHI LETTER KHA +1108F ; [.2A44.0020.0002] # KAITHI LETTER GA +11090 ; [.2A45.0020.0002] # KAITHI LETTER GHA +11091 ; [.2A46.0020.0002] # KAITHI LETTER NGA +11092 ; [.2A47.0020.0002] # KAITHI LETTER CA +11093 ; [.2A48.0020.0002] # KAITHI LETTER CHA +11094 ; [.2A49.0020.0002] # KAITHI LETTER JA +11095 ; [.2A4A.0020.0002] # KAITHI LETTER JHA +11096 ; [.2A4B.0020.0002] # KAITHI LETTER NYA +11097 ; [.2A4C.0020.0002] # KAITHI LETTER TTA +11098 ; [.2A4D.0020.0002] # KAITHI LETTER TTHA +11099 ; [.2A4E.0020.0002] # KAITHI LETTER DDA +1109A ; [.2A4E.0020.0002][.0000.00C2.0002] # KAITHI LETTER DDDHA +1109B ; [.2A4F.0020.0002] # KAITHI LETTER DDHA +1109C ; [.2A4F.0020.0002][.0000.00C2.0002] # KAITHI LETTER RHA +1109D ; [.2A50.0020.0002] # KAITHI LETTER NNA +1109E ; [.2A51.0020.0002] # KAITHI LETTER TA +1109F ; [.2A52.0020.0002] # KAITHI LETTER THA +110A0 ; [.2A53.0020.0002] # KAITHI LETTER DA +110A1 ; [.2A54.0020.0002] # KAITHI LETTER DHA +110A2 ; [.2A55.0020.0002] # KAITHI LETTER NA +110A3 ; [.2A56.0020.0002] # KAITHI LETTER PA +110A4 ; [.2A57.0020.0002] # KAITHI LETTER PHA +110A5 ; [.2A58.0020.0002] # KAITHI LETTER BA +110AB ; [.2A58.0020.0002][.0000.00C2.0002] # KAITHI LETTER VA +110A6 ; [.2A59.0020.0002] # KAITHI LETTER BHA +110A7 ; [.2A5A.0020.0002] # KAITHI LETTER MA +110A8 ; [.2A5B.0020.0002] # KAITHI LETTER YA +110A9 ; [.2A5C.0020.0002] # KAITHI LETTER RA +110AA ; [.2A5D.0020.0002] # KAITHI LETTER LA +110AC ; [.2A5E.0020.0002] # KAITHI LETTER SHA +110AD ; [.2A5F.0020.0002] # KAITHI LETTER SSA +110AE ; [.2A60.0020.0002] # KAITHI LETTER SA +110AF ; [.2A61.0020.0002] # KAITHI LETTER HA +110B0 ; [.2A62.0020.0002] # KAITHI VOWEL SIGN AA +110B1 ; [.2A63.0020.0002] # KAITHI VOWEL SIGN I +110B2 ; [.2A64.0020.0002] # KAITHI VOWEL SIGN II +110B3 ; [.2A65.0020.0002] # KAITHI VOWEL SIGN U +110B4 ; [.2A66.0020.0002] # KAITHI VOWEL SIGN UU +110B5 ; [.2A67.0020.0002] # KAITHI VOWEL SIGN E +110B6 ; [.2A68.0020.0002] # KAITHI VOWEL SIGN AI +110B7 ; [.2A69.0020.0002] # KAITHI VOWEL SIGN O +110B8 ; [.2A6A.0020.0002] # KAITHI VOWEL SIGN AU +110B9 ; [.2A6B.0020.0002] # KAITHI SIGN VIRAMA +11150 ; [.2A6C.0020.0002] # MAHAJANI LETTER A +11151 ; [.2A6D.0020.0002] # MAHAJANI LETTER I +11152 ; [.2A6E.0020.0002] # MAHAJANI LETTER U +11153 ; [.2A6F.0020.0002] # MAHAJANI LETTER E +11154 ; [.2A70.0020.0002] # MAHAJANI LETTER O +11155 ; [.2A71.0020.0002] # MAHAJANI LETTER KA +11156 ; [.2A72.0020.0002] # MAHAJANI LETTER KHA +11157 ; [.2A73.0020.0002] # MAHAJANI LETTER GA +11158 ; [.2A74.0020.0002] # MAHAJANI LETTER GHA +11159 ; [.2A75.0020.0002] # MAHAJANI LETTER CA +1115A ; [.2A76.0020.0002] # MAHAJANI LETTER CHA +1115B ; [.2A77.0020.0002] # MAHAJANI LETTER JA +1115C ; [.2A78.0020.0002] # MAHAJANI LETTER JHA +1115D ; [.2A79.0020.0002] # MAHAJANI LETTER NYA +1115E ; [.2A7A.0020.0002] # MAHAJANI LETTER TTA +1115F ; [.2A7B.0020.0002] # MAHAJANI LETTER TTHA +11160 ; [.2A7C.0020.0002] # MAHAJANI LETTER DDA +11161 ; [.2A7D.0020.0002] # MAHAJANI LETTER DDHA +11162 ; [.2A7E.0020.0002] # MAHAJANI LETTER NNA +11163 ; [.2A7F.0020.0002] # MAHAJANI LETTER TA +11164 ; [.2A80.0020.0002] # MAHAJANI LETTER THA +11165 ; [.2A81.0020.0002] # MAHAJANI LETTER DA +11166 ; [.2A82.0020.0002] # MAHAJANI LETTER DHA +11167 ; [.2A83.0020.0002] # MAHAJANI LETTER NA +11168 ; [.2A84.0020.0002] # MAHAJANI LETTER PA +11169 ; [.2A85.0020.0002] # MAHAJANI LETTER PHA +1116A ; [.2A86.0020.0002] # MAHAJANI LETTER BA +1116B ; [.2A87.0020.0002] # MAHAJANI LETTER BHA +1116C ; [.2A88.0020.0002] # MAHAJANI LETTER MA +1116D ; [.2A89.0020.0002] # MAHAJANI LETTER RA +1116E ; [.2A8A.0020.0002] # MAHAJANI LETTER LA +1116F ; [.2A8B.0020.0002] # MAHAJANI LETTER VA +11176 ; [.2A8C.0020.0002] # MAHAJANI LIGATURE SHRI +11170 ; [.2A8D.0020.0002] # MAHAJANI LETTER SA +11171 ; [.2A8E.0020.0002] # MAHAJANI LETTER HA +11172 ; [.2A8F.0020.0002] # MAHAJANI LETTER RRA +111C4 ; [.2A90.0020.0002] # SHARADA OM +111DA ; [.2A91.0020.0002] # SHARADA EKAM +11183 ; [.2A92.0020.0002] # SHARADA LETTER A +11184 ; [.2A93.0020.0002] # SHARADA LETTER AA +11185 ; [.2A94.0020.0002] # SHARADA LETTER I +11186 ; [.2A95.0020.0002] # SHARADA LETTER II +11187 ; [.2A96.0020.0002] # SHARADA LETTER U +11188 ; [.2A97.0020.0002] # SHARADA LETTER UU +11189 ; [.2A98.0020.0002] # SHARADA LETTER VOCALIC R +1118A ; [.2A99.0020.0002] # SHARADA LETTER VOCALIC RR +1118B ; [.2A9A.0020.0002] # SHARADA LETTER VOCALIC L +1118C ; [.2A9B.0020.0002] # SHARADA LETTER VOCALIC LL +1118D ; [.2A9C.0020.0002] # SHARADA LETTER E +1118E ; [.2A9D.0020.0002] # SHARADA LETTER AI +1118F ; [.2A9E.0020.0002] # SHARADA LETTER O +11190 ; [.2A9F.0020.0002] # SHARADA LETTER AU +11191 ; [.2AA0.0020.0002] # SHARADA LETTER KA +11192 ; [.2AA1.0020.0002] # SHARADA LETTER KHA +11193 ; [.2AA2.0020.0002] # SHARADA LETTER GA +11194 ; [.2AA3.0020.0002] # SHARADA LETTER GHA +11195 ; [.2AA4.0020.0002] # SHARADA LETTER NGA +11196 ; [.2AA5.0020.0002] # SHARADA LETTER CA +11197 ; [.2AA6.0020.0002] # SHARADA LETTER CHA +11198 ; [.2AA7.0020.0002] # SHARADA LETTER JA +11199 ; [.2AA8.0020.0002] # SHARADA LETTER JHA +1119A ; [.2AA9.0020.0002] # SHARADA LETTER NYA +1119B ; [.2AAA.0020.0002] # SHARADA LETTER TTA +1119C ; [.2AAB.0020.0002] # SHARADA LETTER TTHA +1119D ; [.2AAC.0020.0002] # SHARADA LETTER DDA +1119E ; [.2AAD.0020.0002] # SHARADA LETTER DDHA +1119F ; [.2AAE.0020.0002] # SHARADA LETTER NNA +111A0 ; [.2AAF.0020.0002] # SHARADA LETTER TA +111A1 ; [.2AB0.0020.0002] # SHARADA LETTER THA +111A2 ; [.2AB1.0020.0002] # SHARADA LETTER DA +111A3 ; [.2AB2.0020.0002] # SHARADA LETTER DHA +111A4 ; [.2AB3.0020.0002] # SHARADA LETTER NA +111A5 ; [.2AB4.0020.0002] # SHARADA LETTER PA +111A6 ; [.2AB5.0020.0002] # SHARADA LETTER PHA +111A7 ; [.2AB6.0020.0002] # SHARADA LETTER BA +111A8 ; [.2AB7.0020.0002] # SHARADA LETTER BHA +111A9 ; [.2AB8.0020.0002] # SHARADA LETTER MA +111AA ; [.2AB9.0020.0002] # SHARADA LETTER YA +111AB ; [.2ABA.0020.0002] # SHARADA LETTER RA +111AC ; [.2ABB.0020.0002] # SHARADA LETTER LA +111AD ; [.2ABC.0020.0002] # SHARADA LETTER LLA +111AE ; [.2ABD.0020.0002] # SHARADA LETTER VA +111AF ; [.2ABE.0020.0002] # SHARADA LETTER SHA +111B0 ; [.2ABF.0020.0002] # SHARADA LETTER SSA +111B1 ; [.2AC0.0020.0002] # SHARADA LETTER SA +111B2 ; [.2AC1.0020.0002] # SHARADA LETTER HA +111C1 ; [.2AC2.0020.0002] # SHARADA SIGN AVAGRAHA +111C2 ; [.2AC3.0020.0002] # SHARADA SIGN JIHVAMULIYA +111C3 ; [.2AC4.0020.0002] # SHARADA SIGN UPADHMANIYA +111DC ; [.2AC5.0020.0002] # SHARADA HEADSTROKE +111B3 ; [.2AC6.0020.0002] # SHARADA VOWEL SIGN AA +111B4 ; [.2AC7.0020.0002] # SHARADA VOWEL SIGN I +111B5 ; [.2AC8.0020.0002] # SHARADA VOWEL SIGN II +111B6 ; [.2AC9.0020.0002] # SHARADA VOWEL SIGN U +111B7 ; [.2ACA.0020.0002] # SHARADA VOWEL SIGN UU +111B8 ; [.2ACB.0020.0002] # SHARADA VOWEL SIGN VOCALIC R +111B9 ; [.2ACC.0020.0002] # SHARADA VOWEL SIGN VOCALIC RR +111BA ; [.2ACD.0020.0002] # SHARADA VOWEL SIGN VOCALIC L +111BB ; [.2ACE.0020.0002] # SHARADA VOWEL SIGN VOCALIC LL +111BC ; [.2ACF.0020.0002] # SHARADA VOWEL SIGN E +111BD ; [.2AD0.0020.0002] # SHARADA VOWEL SIGN AI +111BE ; [.2AD1.0020.0002] # SHARADA VOWEL SIGN O +111BF ; [.2AD2.0020.0002] # SHARADA VOWEL SIGN AU +111C0 ; [.2AD3.0020.0002] # SHARADA SIGN VIRAMA +11200 ; [.2AD4.0020.0002] # KHOJKI LETTER A +11201 ; [.2AD5.0020.0002] # KHOJKI LETTER AA +11202 ; [.2AD6.0020.0002] # KHOJKI LETTER I +11203 ; [.2AD7.0020.0002] # KHOJKI LETTER U +11204 ; [.2AD8.0020.0002] # KHOJKI LETTER E +11205 ; [.2AD9.0020.0002] # KHOJKI LETTER AI +11206 ; [.2ADA.0020.0002] # KHOJKI LETTER O +11207 ; [.2ADB.0020.0002] # KHOJKI LETTER AU +11208 ; [.2ADC.0020.0002] # KHOJKI LETTER KA +11209 ; [.2ADD.0020.0002] # KHOJKI LETTER KHA +1120A ; [.2ADE.0020.0002] # KHOJKI LETTER GA +1120B ; [.2ADF.0020.0002] # KHOJKI LETTER GGA +1120C ; [.2AE0.0020.0002] # KHOJKI LETTER GHA +1120D ; [.2AE1.0020.0002] # KHOJKI LETTER NGA +1120E ; [.2AE2.0020.0002] # KHOJKI LETTER CA +1120F ; [.2AE3.0020.0002] # KHOJKI LETTER CHA +11210 ; [.2AE4.0020.0002] # KHOJKI LETTER JA +11211 ; [.2AE5.0020.0002] # KHOJKI LETTER JJA +11213 ; [.2AE6.0020.0002] # KHOJKI LETTER NYA +11214 ; [.2AE7.0020.0002] # KHOJKI LETTER TTA +11215 ; [.2AE8.0020.0002] # KHOJKI LETTER TTHA +11216 ; [.2AE9.0020.0002] # KHOJKI LETTER DDA +11217 ; [.2AEA.0020.0002] # KHOJKI LETTER DDHA +11218 ; [.2AEB.0020.0002] # KHOJKI LETTER NNA +11219 ; [.2AEC.0020.0002] # KHOJKI LETTER TA +1121A ; [.2AED.0020.0002] # KHOJKI LETTER THA +1121B ; [.2AEE.0020.0002] # KHOJKI LETTER DA +1121C ; [.2AEF.0020.0002] # KHOJKI LETTER DDDA +1121D ; [.2AF0.0020.0002] # KHOJKI LETTER DHA +1121E ; [.2AF1.0020.0002] # KHOJKI LETTER NA +1121F ; [.2AF2.0020.0002] # KHOJKI LETTER PA +11220 ; [.2AF3.0020.0002] # KHOJKI LETTER PHA +11221 ; [.2AF4.0020.0002] # KHOJKI LETTER BA +11222 ; [.2AF5.0020.0002] # KHOJKI LETTER BBA +11223 ; [.2AF6.0020.0002] # KHOJKI LETTER BHA +11224 ; [.2AF7.0020.0002] # KHOJKI LETTER MA +11225 ; [.2AF8.0020.0002] # KHOJKI LETTER YA +11226 ; [.2AF9.0020.0002] # KHOJKI LETTER RA +11227 ; [.2AFA.0020.0002] # KHOJKI LETTER LA +11228 ; [.2AFB.0020.0002] # KHOJKI LETTER VA +11229 ; [.2AFC.0020.0002] # KHOJKI LETTER SA +1122A ; [.2AFD.0020.0002] # KHOJKI LETTER HA +1122B ; [.2AFE.0020.0002] # KHOJKI LETTER LLA +1122C ; [.2AFF.0020.0002] # KHOJKI VOWEL SIGN AA +1122D ; [.2B00.0020.0002] # KHOJKI VOWEL SIGN I +1122E ; [.2B01.0020.0002] # KHOJKI VOWEL SIGN II +1122F ; [.2B02.0020.0002] # KHOJKI VOWEL SIGN U +11230 ; [.2B03.0020.0002] # KHOJKI VOWEL SIGN E +11231 ; [.2B04.0020.0002] # KHOJKI VOWEL SIGN AI +11232 ; [.2B05.0020.0002] # KHOJKI VOWEL SIGN O +11233 ; [.2B06.0020.0002] # KHOJKI VOWEL SIGN AU +11235 ; [.2B07.0020.0002] # KHOJKI SIGN VIRAMA +112B0 ; [.2B08.0020.0002] # KHUDAWADI LETTER A +112B1 ; [.2B09.0020.0002] # KHUDAWADI LETTER AA +112B2 ; [.2B0A.0020.0002] # KHUDAWADI LETTER I +112B3 ; [.2B0B.0020.0002] # KHUDAWADI LETTER II +112B4 ; [.2B0C.0020.0002] # KHUDAWADI LETTER U +112B5 ; [.2B0D.0020.0002] # KHUDAWADI LETTER UU +112B6 ; [.2B0E.0020.0002] # KHUDAWADI LETTER E +112B7 ; [.2B0F.0020.0002] # KHUDAWADI LETTER AI +112B8 ; [.2B10.0020.0002] # KHUDAWADI LETTER O +112B9 ; [.2B11.0020.0002] # KHUDAWADI LETTER AU +112BA ; [.2B12.0020.0002] # KHUDAWADI LETTER KA +112BB ; [.2B13.0020.0002] # KHUDAWADI LETTER KHA +112BC ; [.2B14.0020.0002] # KHUDAWADI LETTER GA +112BD ; [.2B15.0020.0002] # KHUDAWADI LETTER GGA +112BE ; [.2B16.0020.0002] # KHUDAWADI LETTER GHA +112BF ; [.2B17.0020.0002] # KHUDAWADI LETTER NGA +112C0 ; [.2B18.0020.0002] # KHUDAWADI LETTER CA +112C1 ; [.2B19.0020.0002] # KHUDAWADI LETTER CHA +112C2 ; [.2B1A.0020.0002] # KHUDAWADI LETTER JA +112C3 ; [.2B1B.0020.0002] # KHUDAWADI LETTER JJA +112C4 ; [.2B1C.0020.0002] # KHUDAWADI LETTER JHA +112C5 ; [.2B1D.0020.0002] # KHUDAWADI LETTER NYA +112C6 ; [.2B1E.0020.0002] # KHUDAWADI LETTER TTA +112C7 ; [.2B1F.0020.0002] # KHUDAWADI LETTER TTHA +112C8 ; [.2B20.0020.0002] # KHUDAWADI LETTER DDA +112C9 ; [.2B21.0020.0002] # KHUDAWADI LETTER DDDA +112CA ; [.2B22.0020.0002] # KHUDAWADI LETTER RRA +112CB ; [.2B23.0020.0002] # KHUDAWADI LETTER DDHA +112CC ; [.2B24.0020.0002] # KHUDAWADI LETTER NNA +112CD ; [.2B25.0020.0002] # KHUDAWADI LETTER TA +112CE ; [.2B26.0020.0002] # KHUDAWADI LETTER THA +112CF ; [.2B27.0020.0002] # KHUDAWADI LETTER DA +112D0 ; [.2B28.0020.0002] # KHUDAWADI LETTER DHA +112D1 ; [.2B29.0020.0002] # KHUDAWADI LETTER NA +112D2 ; [.2B2A.0020.0002] # KHUDAWADI LETTER PA +112D3 ; [.2B2B.0020.0002] # KHUDAWADI LETTER PHA +112D4 ; [.2B2C.0020.0002] # KHUDAWADI LETTER BA +112D5 ; [.2B2D.0020.0002] # KHUDAWADI LETTER BBA +112D6 ; [.2B2E.0020.0002] # KHUDAWADI LETTER BHA +112D7 ; [.2B2F.0020.0002] # KHUDAWADI LETTER MA +112D8 ; [.2B30.0020.0002] # KHUDAWADI LETTER YA +112D9 ; [.2B31.0020.0002] # KHUDAWADI LETTER RA +112DA ; [.2B32.0020.0002] # KHUDAWADI LETTER LA +112DB ; [.2B33.0020.0002] # KHUDAWADI LETTER VA +112DC ; [.2B34.0020.0002] # KHUDAWADI LETTER SHA +112DD ; [.2B35.0020.0002] # KHUDAWADI LETTER SA +112DE ; [.2B36.0020.0002] # KHUDAWADI LETTER HA +112E0 ; [.2B37.0020.0002] # KHUDAWADI VOWEL SIGN AA +112E1 ; [.2B38.0020.0002] # KHUDAWADI VOWEL SIGN I +112E2 ; [.2B39.0020.0002] # KHUDAWADI VOWEL SIGN II +112E3 ; [.2B3A.0020.0002] # KHUDAWADI VOWEL SIGN U +112E4 ; [.2B3B.0020.0002] # KHUDAWADI VOWEL SIGN UU +112E5 ; [.2B3C.0020.0002] # KHUDAWADI VOWEL SIGN E +112E6 ; [.2B3D.0020.0002] # KHUDAWADI VOWEL SIGN AI +112E7 ; [.2B3E.0020.0002] # KHUDAWADI VOWEL SIGN O +112E8 ; [.2B3F.0020.0002] # KHUDAWADI VOWEL SIGN AU +112EA ; [.2B40.0020.0002] # KHUDAWADI SIGN VIRAMA +11280 ; [.2B41.0020.0002] # MULTANI LETTER A +11281 ; [.2B42.0020.0002] # MULTANI LETTER I +11282 ; [.2B43.0020.0002] # MULTANI LETTER U +11283 ; [.2B44.0020.0002] # MULTANI LETTER E +112A5 ; [.2B45.0020.0002] # MULTANI LETTER SA +112A6 ; [.2B46.0020.0002] # MULTANI LETTER HA +11284 ; [.2B47.0020.0002] # MULTANI LETTER KA +11285 ; [.2B48.0020.0002] # MULTANI LETTER KHA +11286 ; [.2B49.0020.0002] # MULTANI LETTER GA +11288 ; [.2B4A.0020.0002] # MULTANI LETTER GHA +1128A ; [.2B4B.0020.0002] # MULTANI LETTER CA +1128B ; [.2B4C.0020.0002] # MULTANI LETTER CHA +1128C ; [.2B4D.0020.0002] # MULTANI LETTER JA +1128D ; [.2B4E.0020.0002] # MULTANI LETTER JJA +1128F ; [.2B4F.0020.0002] # MULTANI LETTER NYA +11290 ; [.2B50.0020.0002] # MULTANI LETTER TTA +11291 ; [.2B51.0020.0002] # MULTANI LETTER TTHA +11292 ; [.2B52.0020.0002] # MULTANI LETTER DDA +11293 ; [.2B53.0020.0002] # MULTANI LETTER DDDA +11294 ; [.2B54.0020.0002] # MULTANI LETTER DDHA +11295 ; [.2B55.0020.0002] # MULTANI LETTER NNA +11296 ; [.2B56.0020.0002] # MULTANI LETTER TA +11297 ; [.2B57.0020.0002] # MULTANI LETTER THA +11298 ; [.2B58.0020.0002] # MULTANI LETTER DA +11299 ; [.2B59.0020.0002] # MULTANI LETTER DHA +1129A ; [.2B5A.0020.0002] # MULTANI LETTER NA +1129B ; [.2B5B.0020.0002] # MULTANI LETTER PA +1129C ; [.2B5C.0020.0002] # MULTANI LETTER PHA +1129D ; [.2B5D.0020.0002] # MULTANI LETTER BA +1129F ; [.2B5E.0020.0002] # MULTANI LETTER BHA +112A0 ; [.2B5F.0020.0002] # MULTANI LETTER MA +112A1 ; [.2B60.0020.0002] # MULTANI LETTER YA +112A2 ; [.2B61.0020.0002] # MULTANI LETTER RA +112A3 ; [.2B62.0020.0002] # MULTANI LETTER LA +112A4 ; [.2B63.0020.0002] # MULTANI LETTER VA +112A7 ; [.2B64.0020.0002] # MULTANI LETTER RRA +112A8 ; [.2B65.0020.0002] # MULTANI LETTER RHA +11350 ; [.2B66.0020.0002] # GRANTHA OM +11305 ; [.2B67.0020.0002] # GRANTHA LETTER A +11306 ; [.2B68.0020.0002] # GRANTHA LETTER AA +11307 ; [.2B69.0020.0002] # GRANTHA LETTER I +11308 ; [.2B6A.0020.0002] # GRANTHA LETTER II +11309 ; [.2B6B.0020.0002] # GRANTHA LETTER U +1130A ; [.2B6C.0020.0002] # GRANTHA LETTER UU +1130B ; [.2B6D.0020.0002] # GRANTHA LETTER VOCALIC R +11360 ; [.2B6E.0020.0002] # GRANTHA LETTER VOCALIC RR +1130C ; [.2B6F.0020.0002] # GRANTHA LETTER VOCALIC L +11361 ; [.2B70.0020.0002] # GRANTHA LETTER VOCALIC LL +1130F ; [.2B71.0020.0002] # GRANTHA LETTER EE +11310 ; [.2B72.0020.0002] # GRANTHA LETTER AI +11313 ; [.2B73.0020.0002] # GRANTHA LETTER OO +11314 ; [.2B74.0020.0002] # GRANTHA LETTER AU +11315 ; [.2B75.0020.0002] # GRANTHA LETTER KA +11316 ; [.2B76.0020.0002] # GRANTHA LETTER KHA +11317 ; [.2B77.0020.0002] # GRANTHA LETTER GA +11318 ; [.2B78.0020.0002] # GRANTHA LETTER GHA +11319 ; [.2B79.0020.0002] # GRANTHA LETTER NGA +1131A ; [.2B7A.0020.0002] # GRANTHA LETTER CA +1131B ; [.2B7B.0020.0002] # GRANTHA LETTER CHA +1131C ; [.2B7C.0020.0002] # GRANTHA LETTER JA +1131D ; [.2B7D.0020.0002] # GRANTHA LETTER JHA +1131E ; [.2B7E.0020.0002] # GRANTHA LETTER NYA +1131F ; [.2B7F.0020.0002] # GRANTHA LETTER TTA +11320 ; [.2B80.0020.0002] # GRANTHA LETTER TTHA +11321 ; [.2B81.0020.0002] # GRANTHA LETTER DDA +11322 ; [.2B82.0020.0002] # GRANTHA LETTER DDHA +11323 ; [.2B83.0020.0002] # GRANTHA LETTER NNA +11324 ; [.2B84.0020.0002] # GRANTHA LETTER TA +11325 ; [.2B85.0020.0002] # GRANTHA LETTER THA +11326 ; [.2B86.0020.0002] # GRANTHA LETTER DA +11327 ; [.2B87.0020.0002] # GRANTHA LETTER DHA +11328 ; [.2B88.0020.0002] # GRANTHA LETTER NA +1132A ; [.2B89.0020.0002] # GRANTHA LETTER PA +1132B ; [.2B8A.0020.0002] # GRANTHA LETTER PHA +1132C ; [.2B8B.0020.0002] # GRANTHA LETTER BA +1132D ; [.2B8C.0020.0002] # GRANTHA LETTER BHA +1132E ; [.2B8D.0020.0002] # GRANTHA LETTER MA +1132F ; [.2B8E.0020.0002] # GRANTHA LETTER YA +11330 ; [.2B8F.0020.0002] # GRANTHA LETTER RA +11332 ; [.2B90.0020.0002] # GRANTHA LETTER LA +11333 ; [.2B91.0020.0002] # GRANTHA LETTER LLA +11335 ; [.2B92.0020.0002] # GRANTHA LETTER VA +11336 ; [.2B93.0020.0002] # GRANTHA LETTER SHA +11337 ; [.2B94.0020.0002] # GRANTHA LETTER SSA +11338 ; [.2B95.0020.0002] # GRANTHA LETTER SA +11339 ; [.2B96.0020.0002] # GRANTHA LETTER HA +1133D ; [.2B97.0020.0002] # GRANTHA SIGN AVAGRAHA +1135E ; [.2B98.0020.0002] # GRANTHA LETTER VEDIC ANUSVARA +1135F ; [.2B99.0020.0002] # GRANTHA LETTER VEDIC DOUBLE ANUSVARA +1133E ; [.2B9A.0020.0002] # GRANTHA VOWEL SIGN AA +1133F ; [.2B9B.0020.0002] # GRANTHA VOWEL SIGN I +11340 ; [.2B9C.0020.0002] # GRANTHA VOWEL SIGN II +11341 ; [.2B9D.0020.0002] # GRANTHA VOWEL SIGN U +11342 ; [.2B9E.0020.0002] # GRANTHA VOWEL SIGN UU +11343 ; [.2B9F.0020.0002] # GRANTHA VOWEL SIGN VOCALIC R +11344 ; [.2BA0.0020.0002] # GRANTHA VOWEL SIGN VOCALIC RR +11362 ; [.2BA1.0020.0002] # GRANTHA VOWEL SIGN VOCALIC L +11363 ; [.2BA2.0020.0002] # GRANTHA VOWEL SIGN VOCALIC LL +11347 ; [.2BA3.0020.0002] # GRANTHA VOWEL SIGN EE +11348 ; [.2BA4.0020.0002] # GRANTHA VOWEL SIGN AI +1134B ; [.2BA5.0020.0002] # GRANTHA VOWEL SIGN OO +11347 1133E ; [.2BA5.0020.0002] # GRANTHA VOWEL SIGN OO +1134C ; [.2BA6.0020.0002] # GRANTHA VOWEL SIGN AU +11347 11357 ; [.2BA6.0020.0002] # GRANTHA VOWEL SIGN AU +1134D ; [.2BA7.0020.0002] # GRANTHA SIGN VIRAMA +11357 ; [.2BA8.0020.0002] # GRANTHA AU LENGTH MARK +1135D ; [.2BA9.0020.0002] # GRANTHA SIGN PLUTA +11449 ; [.2BAA.0020.0002] # NEWA OM +1144A ; [.2BAB.0020.0002] # NEWA SIDDHI +11400 ; [.2BAC.0020.0002] # NEWA LETTER A +11401 ; [.2BAD.0020.0002] # NEWA LETTER AA +11402 ; [.2BAE.0020.0002] # NEWA LETTER I +11403 ; [.2BAF.0020.0002] # NEWA LETTER II +11404 ; [.2BB0.0020.0002] # NEWA LETTER U +11405 ; [.2BB1.0020.0002] # NEWA LETTER UU +11406 ; [.2BB2.0020.0002] # NEWA LETTER VOCALIC R +11407 ; [.2BB3.0020.0002] # NEWA LETTER VOCALIC RR +11408 ; [.2BB4.0020.0002] # NEWA LETTER VOCALIC L +11409 ; [.2BB5.0020.0002] # NEWA LETTER VOCALIC LL +1140A ; [.2BB6.0020.0002] # NEWA LETTER E +1140B ; [.2BB7.0020.0002] # NEWA LETTER AI +1140C ; [.2BB8.0020.0002] # NEWA LETTER O +1140D ; [.2BB9.0020.0002] # NEWA LETTER AU +1140E ; [.2BBA.0020.0002] # NEWA LETTER KA +1140F ; [.2BBB.0020.0002] # NEWA LETTER KHA +11410 ; [.2BBC.0020.0002] # NEWA LETTER GA +11411 ; [.2BBD.0020.0002] # NEWA LETTER GHA +11412 ; [.2BBE.0020.0002] # NEWA LETTER NGA +11413 ; [.2BBF.0020.0002] # NEWA LETTER NGHA +11414 ; [.2BC0.0020.0002] # NEWA LETTER CA +11415 ; [.2BC1.0020.0002] # NEWA LETTER CHA +11416 ; [.2BC2.0020.0002] # NEWA LETTER JA +11417 ; [.2BC3.0020.0002] # NEWA LETTER JHA +11418 ; [.2BC4.0020.0002] # NEWA LETTER NYA +11419 ; [.2BC5.0020.0002] # NEWA LETTER NYHA +1141A ; [.2BC6.0020.0002] # NEWA LETTER TTA +1141B ; [.2BC7.0020.0002] # NEWA LETTER TTHA +1141C ; [.2BC8.0020.0002] # NEWA LETTER DDA +1141D ; [.2BC9.0020.0002] # NEWA LETTER DDHA +1141E ; [.2BCA.0020.0002] # NEWA LETTER NNA +1141F ; [.2BCB.0020.0002] # NEWA LETTER TA +11420 ; [.2BCC.0020.0002] # NEWA LETTER THA +11421 ; [.2BCD.0020.0002] # NEWA LETTER DA +11422 ; [.2BCE.0020.0002] # NEWA LETTER DHA +11423 ; [.2BCF.0020.0002] # NEWA LETTER NA +11424 ; [.2BD0.0020.0002] # NEWA LETTER NHA +11425 ; [.2BD1.0020.0002] # NEWA LETTER PA +11426 ; [.2BD2.0020.0002] # NEWA LETTER PHA +11427 ; [.2BD3.0020.0002] # NEWA LETTER BA +11428 ; [.2BD4.0020.0002] # NEWA LETTER BHA +11429 ; [.2BD5.0020.0002] # NEWA LETTER MA +1142A ; [.2BD6.0020.0002] # NEWA LETTER MHA +1142B ; [.2BD7.0020.0002] # NEWA LETTER YA +1142C ; [.2BD8.0020.0002] # NEWA LETTER RA +1142D ; [.2BD9.0020.0002] # NEWA LETTER RHA +1142E ; [.2BDA.0020.0002] # NEWA LETTER LA +1142F ; [.2BDB.0020.0002] # NEWA LETTER LHA +11430 ; [.2BDC.0020.0002] # NEWA LETTER WA +11431 ; [.2BDD.0020.0002] # NEWA LETTER SHA +11432 ; [.2BDE.0020.0002] # NEWA LETTER SSA +11433 ; [.2BDF.0020.0002] # NEWA LETTER SA +11434 ; [.2BE0.0020.0002] # NEWA LETTER HA +11447 ; [.2BE1.0020.0002] # NEWA SIGN AVAGRAHA +11448 ; [.2BE2.0020.0002] # NEWA SIGN FINAL ANUSVARA +11435 ; [.2BE3.0020.0002] # NEWA VOWEL SIGN AA +11436 ; [.2BE4.0020.0002] # NEWA VOWEL SIGN I +11437 ; [.2BE5.0020.0002] # NEWA VOWEL SIGN II +11438 ; [.2BE6.0020.0002] # NEWA VOWEL SIGN U +11439 ; [.2BE7.0020.0002] # NEWA VOWEL SIGN UU +1143A ; [.2BE8.0020.0002] # NEWA VOWEL SIGN VOCALIC R +1143B ; [.2BE9.0020.0002] # NEWA VOWEL SIGN VOCALIC RR +1143C ; [.2BEA.0020.0002] # NEWA VOWEL SIGN VOCALIC L +1143D ; [.2BEB.0020.0002] # NEWA VOWEL SIGN VOCALIC LL +1143E ; [.2BEC.0020.0002] # NEWA VOWEL SIGN E +1143F ; [.2BED.0020.0002] # NEWA VOWEL SIGN AI +11440 ; [.2BEE.0020.0002] # NEWA VOWEL SIGN O +11441 ; [.2BEF.0020.0002] # NEWA VOWEL SIGN AU +11442 ; [.2BF0.0020.0002] # NEWA SIGN VIRAMA +114C7 ; [.2BF1.0020.0002] # TIRHUTA OM +11480 ; [.2BF2.0020.0002] # TIRHUTA ANJI +11481 ; [.2BF3.0020.0002] # TIRHUTA LETTER A +11482 ; [.2BF4.0020.0002] # TIRHUTA LETTER AA +11483 ; [.2BF5.0020.0002] # TIRHUTA LETTER I +11484 ; [.2BF6.0020.0002] # TIRHUTA LETTER II +11485 ; [.2BF7.0020.0002] # TIRHUTA LETTER U +11486 ; [.2BF8.0020.0002] # TIRHUTA LETTER UU +11487 ; [.2BF9.0020.0002] # TIRHUTA LETTER VOCALIC R +11488 ; [.2BFA.0020.0002] # TIRHUTA LETTER VOCALIC RR +11489 ; [.2BFB.0020.0002] # TIRHUTA LETTER VOCALIC L +1148A ; [.2BFC.0020.0002] # TIRHUTA LETTER VOCALIC LL +1148B ; [.2BFD.0020.0002] # TIRHUTA LETTER E +1148C ; [.2BFE.0020.0002] # TIRHUTA LETTER AI +1148D ; [.2BFF.0020.0002] # TIRHUTA LETTER O +1148E ; [.2C00.0020.0002] # TIRHUTA LETTER AU +1148F ; [.2C01.0020.0002] # TIRHUTA LETTER KA +11490 ; [.2C02.0020.0002] # TIRHUTA LETTER KHA +11491 ; [.2C03.0020.0002] # TIRHUTA LETTER GA +11492 ; [.2C04.0020.0002] # TIRHUTA LETTER GHA +11493 ; [.2C05.0020.0002] # TIRHUTA LETTER NGA +11494 ; [.2C06.0020.0002] # TIRHUTA LETTER CA +11495 ; [.2C07.0020.0002] # TIRHUTA LETTER CHA +11496 ; [.2C08.0020.0002] # TIRHUTA LETTER JA +11497 ; [.2C09.0020.0002] # TIRHUTA LETTER JHA +11498 ; [.2C0A.0020.0002] # TIRHUTA LETTER NYA +11499 ; [.2C0B.0020.0002] # TIRHUTA LETTER TTA +1149A ; [.2C0C.0020.0002] # TIRHUTA LETTER TTHA +1149B ; [.2C0D.0020.0002] # TIRHUTA LETTER DDA +1149C ; [.2C0E.0020.0002] # TIRHUTA LETTER DDHA +1149D ; [.2C0F.0020.0002] # TIRHUTA LETTER NNA +1149E ; [.2C10.0020.0002] # TIRHUTA LETTER TA +1149F ; [.2C11.0020.0002] # TIRHUTA LETTER THA +114A0 ; [.2C12.0020.0002] # TIRHUTA LETTER DA +114A1 ; [.2C13.0020.0002] # TIRHUTA LETTER DHA +114A2 ; [.2C14.0020.0002] # TIRHUTA LETTER NA +114A3 ; [.2C15.0020.0002] # TIRHUTA LETTER PA +114A4 ; [.2C16.0020.0002] # TIRHUTA LETTER PHA +114A5 ; [.2C17.0020.0002] # TIRHUTA LETTER BA +114A6 ; [.2C18.0020.0002] # TIRHUTA LETTER BHA +114A7 ; [.2C19.0020.0002] # TIRHUTA LETTER MA +114A8 ; [.2C1A.0020.0002] # TIRHUTA LETTER YA +114A9 ; [.2C1B.0020.0002] # TIRHUTA LETTER RA +114AA ; [.2C1C.0020.0002] # TIRHUTA LETTER LA +114AB ; [.2C1D.0020.0002] # TIRHUTA LETTER VA +114AC ; [.2C1E.0020.0002] # TIRHUTA LETTER SHA +114AD ; [.2C1F.0020.0002] # TIRHUTA LETTER SSA +114AE ; [.2C20.0020.0002] # TIRHUTA LETTER SA +114AF ; [.2C21.0020.0002] # TIRHUTA LETTER HA +114C4 ; [.2C22.0020.0002] # TIRHUTA SIGN AVAGRAHA +114C5 ; [.2C23.0020.0002] # TIRHUTA GVANG +114B0 ; [.2C24.0020.0002] # TIRHUTA VOWEL SIGN AA +114B1 ; [.2C25.0020.0002] # TIRHUTA VOWEL SIGN I +114B2 ; [.2C26.0020.0002] # TIRHUTA VOWEL SIGN II +114B3 ; [.2C27.0020.0002] # TIRHUTA VOWEL SIGN U +114B4 ; [.2C28.0020.0002] # TIRHUTA VOWEL SIGN UU +114B5 ; [.2C29.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC R +114B6 ; [.2C2A.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC RR +114B7 ; [.2C2B.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC L +114B8 ; [.2C2C.0020.0002] # TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; [.2C2D.0020.0002] # TIRHUTA VOWEL SIGN E +114BA ; [.2C2E.0020.0002] # TIRHUTA VOWEL SIGN SHORT E +114BB ; [.2C2F.0020.0002] # TIRHUTA VOWEL SIGN AI +114B9 114BA ; [.2C2F.0020.0002] # TIRHUTA VOWEL SIGN AI +114BC ; [.2C30.0020.0002] # TIRHUTA VOWEL SIGN O +114B9 114B0 ; [.2C30.0020.0002] # TIRHUTA VOWEL SIGN O +114BD ; [.2C31.0020.0002] # TIRHUTA VOWEL SIGN SHORT O +114BE ; [.2C32.0020.0002] # TIRHUTA VOWEL SIGN AU +114B9 114BD ; [.2C32.0020.0002] # TIRHUTA VOWEL SIGN AU +114C2 ; [.2C33.0020.0002] # TIRHUTA SIGN VIRAMA +11580 ; [.2C34.0020.0002] # SIDDHAM LETTER A +11581 ; [.2C35.0020.0002] # SIDDHAM LETTER AA +11582 ; [.2C36.0020.0002] # SIDDHAM LETTER I +115D8 ; [.2C36.0020.0004][.0000.0111.0004] # SIDDHAM LETTER THREE-CIRCLE ALTERNATE I +115D9 ; [.2C36.0020.0004][.0000.0112.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE I +11583 ; [.2C37.0020.0002] # SIDDHAM LETTER II +115DA ; [.2C37.0020.0004][.0000.0111.0004] # SIDDHAM LETTER TWO-CIRCLE ALTERNATE II +11584 ; [.2C38.0020.0002] # SIDDHAM LETTER U +115DB ; [.2C38.0020.0004][.0000.0111.0004] # SIDDHAM LETTER ALTERNATE U +11585 ; [.2C39.0020.0002] # SIDDHAM LETTER UU +11586 ; [.2C3A.0020.0002] # SIDDHAM LETTER VOCALIC R +11587 ; [.2C3B.0020.0002] # SIDDHAM LETTER VOCALIC RR +11588 ; [.2C3C.0020.0002] # SIDDHAM LETTER VOCALIC L +11589 ; [.2C3D.0020.0002] # SIDDHAM LETTER VOCALIC LL +1158A ; [.2C3E.0020.0002] # SIDDHAM LETTER E +1158B ; [.2C3F.0020.0002] # SIDDHAM LETTER AI +1158C ; [.2C40.0020.0002] # SIDDHAM LETTER O +1158D ; [.2C41.0020.0002] # SIDDHAM LETTER AU +1158E ; [.2C42.0020.0002] # SIDDHAM LETTER KA +1158F ; [.2C43.0020.0002] # SIDDHAM LETTER KHA +11590 ; [.2C44.0020.0002] # SIDDHAM LETTER GA +11591 ; [.2C45.0020.0002] # SIDDHAM LETTER GHA +11592 ; [.2C46.0020.0002] # SIDDHAM LETTER NGA +11593 ; [.2C47.0020.0002] # SIDDHAM LETTER CA +11594 ; [.2C48.0020.0002] # SIDDHAM LETTER CHA +11595 ; [.2C49.0020.0002] # SIDDHAM LETTER JA +11596 ; [.2C4A.0020.0002] # SIDDHAM LETTER JHA +11597 ; [.2C4B.0020.0002] # SIDDHAM LETTER NYA +11598 ; [.2C4C.0020.0002] # SIDDHAM LETTER TTA +11599 ; [.2C4D.0020.0002] # SIDDHAM LETTER TTHA +1159A ; [.2C4E.0020.0002] # SIDDHAM LETTER DDA +1159B ; [.2C4F.0020.0002] # SIDDHAM LETTER DDHA +1159C ; [.2C50.0020.0002] # SIDDHAM LETTER NNA +1159D ; [.2C51.0020.0002] # SIDDHAM LETTER TA +1159E ; [.2C52.0020.0002] # SIDDHAM LETTER THA +1159F ; [.2C53.0020.0002] # SIDDHAM LETTER DA +115A0 ; [.2C54.0020.0002] # SIDDHAM LETTER DHA +115A1 ; [.2C55.0020.0002] # SIDDHAM LETTER NA +115A2 ; [.2C56.0020.0002] # SIDDHAM LETTER PA +115A3 ; [.2C57.0020.0002] # SIDDHAM LETTER PHA +115A4 ; [.2C58.0020.0002] # SIDDHAM LETTER BA +115A5 ; [.2C59.0020.0002] # SIDDHAM LETTER BHA +115A6 ; [.2C5A.0020.0002] # SIDDHAM LETTER MA +115A7 ; [.2C5B.0020.0002] # SIDDHAM LETTER YA +115A8 ; [.2C5C.0020.0002] # SIDDHAM LETTER RA +115A9 ; [.2C5D.0020.0002] # SIDDHAM LETTER LA +115AA ; [.2C5E.0020.0002] # SIDDHAM LETTER VA +115AB ; [.2C5F.0020.0002] # SIDDHAM LETTER SHA +115AC ; [.2C60.0020.0002] # SIDDHAM LETTER SSA +115AD ; [.2C61.0020.0002] # SIDDHAM LETTER SA +115AE ; [.2C62.0020.0002] # SIDDHAM LETTER HA +115AF ; [.2C63.0020.0002] # SIDDHAM VOWEL SIGN AA +115B0 ; [.2C64.0020.0002] # SIDDHAM VOWEL SIGN I +115B1 ; [.2C65.0020.0002] # SIDDHAM VOWEL SIGN II +115B2 ; [.2C66.0020.0002] # SIDDHAM VOWEL SIGN U +115DC ; [.2C66.0020.0004][.0000.0111.0004] # SIDDHAM VOWEL SIGN ALTERNATE U +115B3 ; [.2C67.0020.0002] # SIDDHAM VOWEL SIGN UU +115DD ; [.2C67.0020.0004][.0000.0111.0004] # SIDDHAM VOWEL SIGN ALTERNATE UU +115B4 ; [.2C68.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC R +115B5 ; [.2C69.0020.0002] # SIDDHAM VOWEL SIGN VOCALIC RR +115B8 ; [.2C6A.0020.0002] # SIDDHAM VOWEL SIGN E +115B9 ; [.2C6B.0020.0002] # SIDDHAM VOWEL SIGN AI +115BA ; [.2C6C.0020.0002] # SIDDHAM VOWEL SIGN O +115B8 115AF ; [.2C6C.0020.0002] # SIDDHAM VOWEL SIGN O +115BB ; [.2C6D.0020.0002] # SIDDHAM VOWEL SIGN AU +115B9 115AF ; [.2C6D.0020.0002] # SIDDHAM VOWEL SIGN AU +115BF ; [.2C6E.0020.0002] # SIDDHAM SIGN VIRAMA +11600 ; [.2C6F.0020.0002] # MODI LETTER A +11601 ; [.2C70.0020.0002] # MODI LETTER AA +11602 ; [.2C71.0020.0002] # MODI LETTER I +11603 ; [.2C72.0020.0002] # MODI LETTER II +11604 ; [.2C73.0020.0002] # MODI LETTER U +11605 ; [.2C74.0020.0002] # MODI LETTER UU +11606 ; [.2C75.0020.0002] # MODI LETTER VOCALIC R +11607 ; [.2C76.0020.0002] # MODI LETTER VOCALIC RR +11608 ; [.2C77.0020.0002] # MODI LETTER VOCALIC L +11609 ; [.2C78.0020.0002] # MODI LETTER VOCALIC LL +1160A ; [.2C79.0020.0002] # MODI LETTER E +1160B ; [.2C7A.0020.0002] # MODI LETTER AI +1160C ; [.2C7B.0020.0002] # MODI LETTER O +1160D ; [.2C7C.0020.0002] # MODI LETTER AU +1160E ; [.2C7D.0020.0002] # MODI LETTER KA +1160F ; [.2C7E.0020.0002] # MODI LETTER KHA +11610 ; [.2C7F.0020.0002] # MODI LETTER GA +11611 ; [.2C80.0020.0002] # MODI LETTER GHA +11612 ; [.2C81.0020.0002] # MODI LETTER NGA +11613 ; [.2C82.0020.0002] # MODI LETTER CA +11614 ; [.2C83.0020.0002] # MODI LETTER CHA +11615 ; [.2C84.0020.0002] # MODI LETTER JA +11616 ; [.2C85.0020.0002] # MODI LETTER JHA +11617 ; [.2C86.0020.0002] # MODI LETTER NYA +11618 ; [.2C87.0020.0002] # MODI LETTER TTA +11619 ; [.2C88.0020.0002] # MODI LETTER TTHA +1161A ; [.2C89.0020.0002] # MODI LETTER DDA +1161B ; [.2C8A.0020.0002] # MODI LETTER DDHA +1161C ; [.2C8B.0020.0002] # MODI LETTER NNA +1161D ; [.2C8C.0020.0002] # MODI LETTER TA +1161E ; [.2C8D.0020.0002] # MODI LETTER THA +1161F ; [.2C8E.0020.0002] # MODI LETTER DA +11620 ; [.2C8F.0020.0002] # MODI LETTER DHA +11621 ; [.2C90.0020.0002] # MODI LETTER NA +11622 ; [.2C91.0020.0002] # MODI LETTER PA +11623 ; [.2C92.0020.0002] # MODI LETTER PHA +11624 ; [.2C93.0020.0002] # MODI LETTER BA +11625 ; [.2C94.0020.0002] # MODI LETTER BHA +11626 ; [.2C95.0020.0002] # MODI LETTER MA +11627 ; [.2C96.0020.0002] # MODI LETTER YA +11628 ; [.2C97.0020.0002] # MODI LETTER RA +11629 ; [.2C98.0020.0002] # MODI LETTER LA +1162A ; [.2C99.0020.0002] # MODI LETTER VA +1162B ; [.2C9A.0020.0002] # MODI LETTER SHA +1162C ; [.2C9B.0020.0002] # MODI LETTER SSA +1162D ; [.2C9C.0020.0002] # MODI LETTER SA +1162E ; [.2C9D.0020.0002] # MODI LETTER HA +1162F ; [.2C9E.0020.0002] # MODI LETTER LLA +11630 ; [.2C9F.0020.0002] # MODI VOWEL SIGN AA +11631 ; [.2CA0.0020.0002] # MODI VOWEL SIGN I +11632 ; [.2CA1.0020.0002] # MODI VOWEL SIGN II +11633 ; [.2CA2.0020.0002] # MODI VOWEL SIGN U +11634 ; [.2CA3.0020.0002] # MODI VOWEL SIGN UU +11635 ; [.2CA4.0020.0002] # MODI VOWEL SIGN VOCALIC R +11636 ; [.2CA5.0020.0002] # MODI VOWEL SIGN VOCALIC RR +11637 ; [.2CA6.0020.0002] # MODI VOWEL SIGN VOCALIC L +11638 ; [.2CA7.0020.0002] # MODI VOWEL SIGN VOCALIC LL +11639 ; [.2CA8.0020.0002] # MODI VOWEL SIGN E +1163A ; [.2CA9.0020.0002] # MODI VOWEL SIGN AI +1163B ; [.2CAA.0020.0002] # MODI VOWEL SIGN O +1163C ; [.2CAB.0020.0002] # MODI VOWEL SIGN AU +1163F ; [.2CAC.0020.0002] # MODI SIGN VIRAMA +11644 ; [.2CAD.0020.0002] # MODI SIGN HUVA +11680 ; [.2CAE.0020.0002] # TAKRI LETTER A +11681 ; [.2CAF.0020.0002] # TAKRI LETTER AA +11682 ; [.2CB0.0020.0002] # TAKRI LETTER I +11683 ; [.2CB1.0020.0002] # TAKRI LETTER II +11684 ; [.2CB2.0020.0002] # TAKRI LETTER U +11685 ; [.2CB3.0020.0002] # TAKRI LETTER UU +11686 ; [.2CB4.0020.0002] # TAKRI LETTER E +11687 ; [.2CB5.0020.0002] # TAKRI LETTER AI +11688 ; [.2CB6.0020.0002] # TAKRI LETTER O +11689 ; [.2CB7.0020.0002] # TAKRI LETTER AU +116A8 ; [.2CB8.0020.0002] # TAKRI LETTER SA +116A7 ; [.2CB9.0020.0002] # TAKRI LETTER SHA +116A9 ; [.2CBA.0020.0002] # TAKRI LETTER HA +1168A ; [.2CBB.0020.0002] # TAKRI LETTER KA +1168B ; [.2CBC.0020.0002] # TAKRI LETTER KHA +1168C ; [.2CBD.0020.0002] # TAKRI LETTER GA +1168D ; [.2CBE.0020.0002] # TAKRI LETTER GHA +1168E ; [.2CBF.0020.0002] # TAKRI LETTER NGA +1168F ; [.2CC0.0020.0002] # TAKRI LETTER CA +11690 ; [.2CC1.0020.0002] # TAKRI LETTER CHA +11691 ; [.2CC2.0020.0002] # TAKRI LETTER JA +11692 ; [.2CC3.0020.0002] # TAKRI LETTER JHA +11693 ; [.2CC4.0020.0002] # TAKRI LETTER NYA +11694 ; [.2CC5.0020.0002] # TAKRI LETTER TTA +11695 ; [.2CC6.0020.0002] # TAKRI LETTER TTHA +11696 ; [.2CC7.0020.0002] # TAKRI LETTER DDA +11697 ; [.2CC8.0020.0002] # TAKRI LETTER DDHA +11698 ; [.2CC9.0020.0002] # TAKRI LETTER NNA +11699 ; [.2CCA.0020.0002] # TAKRI LETTER TA +1169A ; [.2CCB.0020.0002] # TAKRI LETTER THA +1169B ; [.2CCC.0020.0002] # TAKRI LETTER DA +1169C ; [.2CCD.0020.0002] # TAKRI LETTER DHA +1169D ; [.2CCE.0020.0002] # TAKRI LETTER NA +1169E ; [.2CCF.0020.0002] # TAKRI LETTER PA +1169F ; [.2CD0.0020.0002] # TAKRI LETTER PHA +116A0 ; [.2CD1.0020.0002] # TAKRI LETTER BA +116A1 ; [.2CD2.0020.0002] # TAKRI LETTER BHA +116A2 ; [.2CD3.0020.0002] # TAKRI LETTER MA +116A3 ; [.2CD4.0020.0002] # TAKRI LETTER YA +116A4 ; [.2CD5.0020.0002] # TAKRI LETTER RA +116A5 ; [.2CD6.0020.0002] # TAKRI LETTER LA +116A6 ; [.2CD7.0020.0002] # TAKRI LETTER VA +116AA ; [.2CD8.0020.0002] # TAKRI LETTER RRA +116AD ; [.2CD9.0020.0002] # TAKRI VOWEL SIGN AA +116AE ; [.2CDA.0020.0002] # TAKRI VOWEL SIGN I +116AF ; [.2CDB.0020.0002] # TAKRI VOWEL SIGN II +116B0 ; [.2CDC.0020.0002] # TAKRI VOWEL SIGN U +116B1 ; [.2CDD.0020.0002] # TAKRI VOWEL SIGN UU +116B2 ; [.2CDE.0020.0002] # TAKRI VOWEL SIGN E +116B3 ; [.2CDF.0020.0002] # TAKRI VOWEL SIGN AI +116B4 ; [.2CE0.0020.0002] # TAKRI VOWEL SIGN O +116B5 ; [.2CE1.0020.0002] # TAKRI VOWEL SIGN AU +116B6 ; [.2CE2.0020.0002] # TAKRI SIGN VIRAMA +11700 ; [.2CE3.0020.0002] # AHOM LETTER KA +11701 ; [.2CE4.0020.0002] # AHOM LETTER KHA +11702 ; [.2CE5.0020.0002] # AHOM LETTER NGA +11703 ; [.2CE6.0020.0002] # AHOM LETTER NA +11704 ; [.2CE7.0020.0002] # AHOM LETTER TA +11705 ; [.2CE7.0020.0004][.0000.0111.0004] # AHOM LETTER ALTERNATE TA +11706 ; [.2CE8.0020.0002] # AHOM LETTER PA +11707 ; [.2CE9.0020.0002] # AHOM LETTER PHA +11708 ; [.2CEA.0020.0002] # AHOM LETTER BA +11709 ; [.2CEB.0020.0002] # AHOM LETTER MA +1170A ; [.2CEC.0020.0002] # AHOM LETTER JA +1170B ; [.2CED.0020.0002] # AHOM LETTER CHA +1170C ; [.2CEE.0020.0002] # AHOM LETTER THA +1170D ; [.2CEF.0020.0002] # AHOM LETTER RA +1170E ; [.2CF0.0020.0002] # AHOM LETTER LA +1170F ; [.2CF1.0020.0002] # AHOM LETTER SA +11710 ; [.2CF2.0020.0002] # AHOM LETTER NYA +11711 ; [.2CF3.0020.0002] # AHOM LETTER HA +11712 ; [.2CF4.0020.0002] # AHOM LETTER A +11713 ; [.2CF5.0020.0002] # AHOM LETTER DA +11714 ; [.2CF6.0020.0002] # AHOM LETTER DHA +11715 ; [.2CF7.0020.0002] # AHOM LETTER GA +11716 ; [.2CF7.0020.0004][.0000.0111.0004] # AHOM LETTER ALTERNATE GA +11717 ; [.2CF8.0020.0002] # AHOM LETTER GHA +11718 ; [.2CF9.0020.0002] # AHOM LETTER BHA +11719 ; [.2CFA.0020.0002] # AHOM LETTER JHA +11720 ; [.2CFB.0020.0002] # AHOM VOWEL SIGN A +11721 ; [.2CFC.0020.0002] # AHOM VOWEL SIGN AA +11722 ; [.2CFD.0020.0002] # AHOM VOWEL SIGN I +11723 ; [.2CFE.0020.0002] # AHOM VOWEL SIGN II +11724 ; [.2CFF.0020.0002] # AHOM VOWEL SIGN U +11725 ; [.2D00.0020.0002] # AHOM VOWEL SIGN UU +11726 ; [.2D01.0020.0002] # AHOM VOWEL SIGN E +11727 ; [.2D02.0020.0002] # AHOM VOWEL SIGN AW +11728 ; [.2D03.0020.0002] # AHOM VOWEL SIGN O +11729 ; [.2D04.0020.0002] # AHOM VOWEL SIGN AI +1172A ; [.2D05.0020.0002] # AHOM VOWEL SIGN AM +1172B ; [.2D06.0020.0002] # AHOM SIGN KILLER +1171D ; [.2D07.0020.0002] # AHOM CONSONANT SIGN MEDIAL LA +1171E ; [.2D08.0020.0002] # AHOM CONSONANT SIGN MEDIAL RA +1171F ; [.2D09.0020.0002] # AHOM CONSONANT SIGN MEDIAL LIGATING RA +11D00 ; [.2D0A.0020.0002] # MASARAM GONDI LETTER A +11D01 ; [.2D0B.0020.0002] # MASARAM GONDI LETTER AA +11D02 ; [.2D0C.0020.0002] # MASARAM GONDI LETTER I +11D03 ; [.2D0D.0020.0002] # MASARAM GONDI LETTER II +11D04 ; [.2D0E.0020.0002] # MASARAM GONDI LETTER U +11D05 ; [.2D0F.0020.0002] # MASARAM GONDI LETTER UU +11D06 ; [.2D10.0020.0002] # MASARAM GONDI LETTER E +11D08 ; [.2D11.0020.0002] # MASARAM GONDI LETTER AI +11D09 ; [.2D12.0020.0002] # MASARAM GONDI LETTER O +11D0B ; [.2D13.0020.0002] # MASARAM GONDI LETTER AU +11D0C ; [.2D14.0020.0002] # MASARAM GONDI LETTER KA +11D0D ; [.2D15.0020.0002] # MASARAM GONDI LETTER KHA +11D0E ; [.2D16.0020.0002] # MASARAM GONDI LETTER GA +11D0F ; [.2D17.0020.0002] # MASARAM GONDI LETTER GHA +11D10 ; [.2D18.0020.0002] # MASARAM GONDI LETTER NGA +11D11 ; [.2D19.0020.0002] # MASARAM GONDI LETTER CA +11D12 ; [.2D1A.0020.0002] # MASARAM GONDI LETTER CHA +11D13 ; [.2D1B.0020.0002] # MASARAM GONDI LETTER JA +11D14 ; [.2D1C.0020.0002] # MASARAM GONDI LETTER JHA +11D15 ; [.2D1D.0020.0002] # MASARAM GONDI LETTER NYA +11D16 ; [.2D1E.0020.0002] # MASARAM GONDI LETTER TTA +11D17 ; [.2D1F.0020.0002] # MASARAM GONDI LETTER TTHA +11D18 ; [.2D20.0020.0002] # MASARAM GONDI LETTER DDA +11D19 ; [.2D21.0020.0002] # MASARAM GONDI LETTER DDHA +11D1A ; [.2D22.0020.0002] # MASARAM GONDI LETTER NNA +11D1B ; [.2D23.0020.0002] # MASARAM GONDI LETTER TA +11D1C ; [.2D24.0020.0002] # MASARAM GONDI LETTER THA +11D1D ; [.2D25.0020.0002] # MASARAM GONDI LETTER DA +11D1E ; [.2D26.0020.0002] # MASARAM GONDI LETTER DHA +11D1F ; [.2D27.0020.0002] # MASARAM GONDI LETTER NA +11D20 ; [.2D28.0020.0002] # MASARAM GONDI LETTER PA +11D21 ; [.2D29.0020.0002] # MASARAM GONDI LETTER PHA +11D22 ; [.2D2A.0020.0002] # MASARAM GONDI LETTER BA +11D23 ; [.2D2B.0020.0002] # MASARAM GONDI LETTER BHA +11D24 ; [.2D2C.0020.0002] # MASARAM GONDI LETTER MA +11D25 ; [.2D2D.0020.0002] # MASARAM GONDI LETTER YA +11D26 ; [.2D2E.0020.0002] # MASARAM GONDI LETTER RA +11D46 ; [.2D2E.0020.0017] # MASARAM GONDI REPHA +11D47 ; [.2D2E.0020.0019] # MASARAM GONDI RA-KARA +11D27 ; [.2D2F.0020.0002] # MASARAM GONDI LETTER LA +11D28 ; [.2D30.0020.0002] # MASARAM GONDI LETTER VA +11D29 ; [.2D31.0020.0002] # MASARAM GONDI LETTER SHA +11D2A ; [.2D32.0020.0002] # MASARAM GONDI LETTER SSA +11D2B ; [.2D33.0020.0002] # MASARAM GONDI LETTER SA +11D2C ; [.2D34.0020.0002] # MASARAM GONDI LETTER HA +11D2D ; [.2D35.0020.0002] # MASARAM GONDI LETTER LLA +11D2E ; [.2D36.0020.0002] # MASARAM GONDI LETTER KSSA +11D2F ; [.2D37.0020.0002] # MASARAM GONDI LETTER JNYA +11D30 ; [.2D38.0020.0002] # MASARAM GONDI LETTER TRA +11D31 ; [.2D39.0020.0002] # MASARAM GONDI VOWEL SIGN AA +11D32 ; [.2D3A.0020.0002] # MASARAM GONDI VOWEL SIGN I +11D33 ; [.2D3B.0020.0002] # MASARAM GONDI VOWEL SIGN II +11D34 ; [.2D3C.0020.0002] # MASARAM GONDI VOWEL SIGN U +11D35 ; [.2D3D.0020.0002] # MASARAM GONDI VOWEL SIGN UU +11D36 ; [.2D3E.0020.0002] # MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; [.2D3F.0020.0002] # MASARAM GONDI VOWEL SIGN E +11D3C ; [.2D40.0020.0002] # MASARAM GONDI VOWEL SIGN AI +11D3D ; [.2D41.0020.0002] # MASARAM GONDI VOWEL SIGN O +11D3F ; [.2D42.0020.0002] # MASARAM GONDI VOWEL SIGN AU +11D44 ; [.2D43.0020.0002] # MASARAM GONDI SIGN HALANTA +11D45 ; [.2D44.0020.0002] # MASARAM GONDI VIRAMA +1B83 ; [.2D45.0020.0002] # SUNDANESE LETTER A +1BBA ; [.2D45.0020.0004] # SUNDANESE AVAGRAHA +1B84 ; [.2D46.0020.0002] # SUNDANESE LETTER I +1B85 ; [.2D47.0020.0002] # SUNDANESE LETTER U +1B86 ; [.2D48.0020.0002] # SUNDANESE LETTER AE +1B87 ; [.2D49.0020.0002] # SUNDANESE LETTER O +1B88 ; [.2D4A.0020.0002] # SUNDANESE LETTER E +1B89 ; [.2D4B.0020.0002] # SUNDANESE LETTER EU +1B8A ; [.2D4C.0020.0002] # SUNDANESE LETTER KA +1BBE ; [.2D4C.0020.0019] # SUNDANESE LETTER FINAL K +1BAE ; [.2D4D.0020.0002] # SUNDANESE LETTER KHA +1B8B ; [.2D4E.0020.0002] # SUNDANESE LETTER QA +1B8C ; [.2D4F.0020.0002] # SUNDANESE LETTER GA +1B8D ; [.2D50.0020.0002] # SUNDANESE LETTER NGA +1B8E ; [.2D51.0020.0002] # SUNDANESE LETTER CA +1B8F ; [.2D52.0020.0002] # SUNDANESE LETTER JA +1B90 ; [.2D53.0020.0002] # SUNDANESE LETTER ZA +1B91 ; [.2D54.0020.0002] # SUNDANESE LETTER NYA +1B92 ; [.2D55.0020.0002] # SUNDANESE LETTER TA +1B93 ; [.2D56.0020.0002] # SUNDANESE LETTER DA +1B94 ; [.2D57.0020.0002] # SUNDANESE LETTER NA +1B95 ; [.2D58.0020.0002] # SUNDANESE LETTER PA +1B96 ; [.2D59.0020.0002] # SUNDANESE LETTER FA +1B97 ; [.2D5A.0020.0002] # SUNDANESE LETTER VA +1B98 ; [.2D5B.0020.0002] # SUNDANESE LETTER BA +1BBD ; [.2D5C.0020.0002] # SUNDANESE LETTER BHA +1B99 ; [.2D5D.0020.0002] # SUNDANESE LETTER MA +1BBF ; [.2D5D.0020.0019] # SUNDANESE LETTER FINAL M +1BAC ; [.2D5E.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN MA +1B9A ; [.2D5F.0020.0002] # SUNDANESE LETTER YA +1BA1 ; [.2D60.0020.0002] # SUNDANESE CONSONANT SIGN PAMINGKAL +1B9B ; [.2D61.0020.0002] # SUNDANESE LETTER RA +1BA2 ; [.2D62.0020.0002] # SUNDANESE CONSONANT SIGN PANYAKRA +1BBB ; [.2D63.0020.0002] # SUNDANESE LETTER REU +1B9C ; [.2D64.0020.0002] # SUNDANESE LETTER LA +1BA3 ; [.2D65.0020.0002] # SUNDANESE CONSONANT SIGN PANYIKU +1BBC ; [.2D66.0020.0002] # SUNDANESE LETTER LEU +1B9D ; [.2D67.0020.0002] # SUNDANESE LETTER WA +1BAD ; [.2D68.0020.0002] # SUNDANESE CONSONANT SIGN PASANGAN WA +1B9E ; [.2D69.0020.0002] # SUNDANESE LETTER SA +1B9F ; [.2D6A.0020.0002] # SUNDANESE LETTER XA +1BAF ; [.2D6B.0020.0002] # SUNDANESE LETTER SYA +1BA0 ; [.2D6C.0020.0002] # SUNDANESE LETTER HA +1BA4 ; [.2D6D.0020.0002] # SUNDANESE VOWEL SIGN PANGHULU +1BA5 ; [.2D6E.0020.0002] # SUNDANESE VOWEL SIGN PANYUKU +1BA6 ; [.2D6F.0020.0002] # SUNDANESE VOWEL SIGN PANAELAENG +1BA7 ; [.2D70.0020.0002] # SUNDANESE VOWEL SIGN PANOLONG +1BA8 ; [.2D71.0020.0002] # SUNDANESE VOWEL SIGN PAMEPET +1BA9 ; [.2D72.0020.0002] # SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; [.2D73.0020.0002] # SUNDANESE SIGN PAMAAEH +1BAB ; [.2D74.0020.0002] # SUNDANESE SIGN VIRAMA +11005 ; [.2D75.0020.0002] # BRAHMI LETTER A +11006 ; [.2D76.0020.0002] # BRAHMI LETTER AA +11007 ; [.2D77.0020.0002] # BRAHMI LETTER I +11008 ; [.2D78.0020.0002] # BRAHMI LETTER II +11009 ; [.2D79.0020.0002] # BRAHMI LETTER U +1100A ; [.2D7A.0020.0002] # BRAHMI LETTER UU +1100B ; [.2D7B.0020.0002] # BRAHMI LETTER VOCALIC R +1100C ; [.2D7C.0020.0002] # BRAHMI LETTER VOCALIC RR +1100D ; [.2D7D.0020.0002] # BRAHMI LETTER VOCALIC L +1100E ; [.2D7E.0020.0002] # BRAHMI LETTER VOCALIC LL +1100F ; [.2D7F.0020.0002] # BRAHMI LETTER E +11010 ; [.2D80.0020.0002] # BRAHMI LETTER AI +11011 ; [.2D81.0020.0002] # BRAHMI LETTER O +11012 ; [.2D82.0020.0002] # BRAHMI LETTER AU +11013 ; [.2D83.0020.0002] # BRAHMI LETTER KA +11014 ; [.2D84.0020.0002] # BRAHMI LETTER KHA +11015 ; [.2D85.0020.0002] # BRAHMI LETTER GA +11016 ; [.2D86.0020.0002] # BRAHMI LETTER GHA +11017 ; [.2D87.0020.0002] # BRAHMI LETTER NGA +11018 ; [.2D88.0020.0002] # BRAHMI LETTER CA +11019 ; [.2D89.0020.0002] # BRAHMI LETTER CHA +1101A ; [.2D8A.0020.0002] # BRAHMI LETTER JA +1101B ; [.2D8B.0020.0002] # BRAHMI LETTER JHA +1101C ; [.2D8C.0020.0002] # BRAHMI LETTER NYA +1101D ; [.2D8D.0020.0002] # BRAHMI LETTER TTA +1101E ; [.2D8E.0020.0002] # BRAHMI LETTER TTHA +1101F ; [.2D8F.0020.0002] # BRAHMI LETTER DDA +11020 ; [.2D90.0020.0002] # BRAHMI LETTER DDHA +11021 ; [.2D91.0020.0002] # BRAHMI LETTER NNA +11022 ; [.2D92.0020.0002] # BRAHMI LETTER TA +11023 ; [.2D93.0020.0002] # BRAHMI LETTER THA +11024 ; [.2D94.0020.0002] # BRAHMI LETTER DA +11025 ; [.2D95.0020.0002] # BRAHMI LETTER DHA +11026 ; [.2D96.0020.0002] # BRAHMI LETTER NA +11027 ; [.2D97.0020.0002] # BRAHMI LETTER PA +11028 ; [.2D98.0020.0002] # BRAHMI LETTER PHA +11029 ; [.2D99.0020.0002] # BRAHMI LETTER BA +1102A ; [.2D9A.0020.0002] # BRAHMI LETTER BHA +1102B ; [.2D9B.0020.0002] # BRAHMI LETTER MA +1102C ; [.2D9C.0020.0002] # BRAHMI LETTER YA +1102D ; [.2D9D.0020.0002] # BRAHMI LETTER RA +1102E ; [.2D9E.0020.0002] # BRAHMI LETTER LA +1102F ; [.2D9F.0020.0002] # BRAHMI LETTER VA +11030 ; [.2DA0.0020.0002] # BRAHMI LETTER SHA +11031 ; [.2DA1.0020.0002] # BRAHMI LETTER SSA +11032 ; [.2DA2.0020.0002] # BRAHMI LETTER SA +11033 ; [.2DA3.0020.0002] # BRAHMI LETTER HA +11003 ; [.2DA4.0020.0002] # BRAHMI SIGN JIHVAMULIYA +11004 ; [.2DA5.0020.0002] # BRAHMI SIGN UPADHMANIYA +11034 ; [.2DA6.0020.0002] # BRAHMI LETTER LLA +11035 ; [.2DA7.0020.0002] # BRAHMI LETTER OLD TAMIL LLLA +11036 ; [.2DA8.0020.0002] # BRAHMI LETTER OLD TAMIL RRA +11037 ; [.2DA9.0020.0002] # BRAHMI LETTER OLD TAMIL NNNA +11038 ; [.2DAA.0020.0002] # BRAHMI VOWEL SIGN AA +11039 ; [.2DAB.0020.0002] # BRAHMI VOWEL SIGN BHATTIPROLU AA +1103A ; [.2DAC.0020.0002] # BRAHMI VOWEL SIGN I +1103B ; [.2DAD.0020.0002] # BRAHMI VOWEL SIGN II +1103C ; [.2DAE.0020.0002] # BRAHMI VOWEL SIGN U +1103D ; [.2DAF.0020.0002] # BRAHMI VOWEL SIGN UU +1103E ; [.2DB0.0020.0002] # BRAHMI VOWEL SIGN VOCALIC R +1103F ; [.2DB1.0020.0002] # BRAHMI VOWEL SIGN VOCALIC RR +11040 ; [.2DB2.0020.0002] # BRAHMI VOWEL SIGN VOCALIC L +11041 ; [.2DB3.0020.0002] # BRAHMI VOWEL SIGN VOCALIC LL +11042 ; [.2DB4.0020.0002] # BRAHMI VOWEL SIGN E +11043 ; [.2DB5.0020.0002] # BRAHMI VOWEL SIGN AI +11044 ; [.2DB6.0020.0002] # BRAHMI VOWEL SIGN O +11045 ; [.2DB7.0020.0002] # BRAHMI VOWEL SIGN AU +11046 ; [.2DB8.0020.0002] # BRAHMI VIRAMA +1107F ; [.2DB9.0020.0002] # BRAHMI NUMBER JOINER +10A00 ; [.2DBA.0020.0002] # KHAROSHTHI LETTER A +10A01 ; [.2DBB.0020.0002] # KHAROSHTHI VOWEL SIGN I +10A02 ; [.2DBC.0020.0002] # KHAROSHTHI VOWEL SIGN U +10A03 ; [.2DBD.0020.0002] # KHAROSHTHI VOWEL SIGN VOCALIC R +10A05 ; [.2DBE.0020.0002] # KHAROSHTHI VOWEL SIGN E +10A06 ; [.2DBF.0020.0002] # KHAROSHTHI VOWEL SIGN O +10A0C ; [.2DC0.0020.0002] # KHAROSHTHI VOWEL LENGTH MARK +10A10 ; [.2DC1.0020.0002] # KHAROSHTHI LETTER KA +10A11 ; [.2DC2.0020.0002] # KHAROSHTHI LETTER KHA +10A12 ; [.2DC3.0020.0002] # KHAROSHTHI LETTER GA +10A13 ; [.2DC4.0020.0002] # KHAROSHTHI LETTER GHA +10A15 ; [.2DC5.0020.0002] # KHAROSHTHI LETTER CA +10A16 ; [.2DC6.0020.0002] # KHAROSHTHI LETTER CHA +10A17 ; [.2DC7.0020.0002] # KHAROSHTHI LETTER JA +10A19 ; [.2DC8.0020.0002] # KHAROSHTHI LETTER NYA +10A1A ; [.2DC9.0020.0002] # KHAROSHTHI LETTER TTA +10A1B ; [.2DCA.0020.0002] # KHAROSHTHI LETTER TTHA +10A1C ; [.2DCB.0020.0002] # KHAROSHTHI LETTER DDA +10A1D ; [.2DCC.0020.0002] # KHAROSHTHI LETTER DDHA +10A1E ; [.2DCD.0020.0002] # KHAROSHTHI LETTER NNA +10A1F ; [.2DCE.0020.0002] # KHAROSHTHI LETTER TA +10A20 ; [.2DCF.0020.0002] # KHAROSHTHI LETTER THA +10A21 ; [.2DD0.0020.0002] # KHAROSHTHI LETTER DA +10A22 ; [.2DD1.0020.0002] # KHAROSHTHI LETTER DHA +10A23 ; [.2DD2.0020.0002] # KHAROSHTHI LETTER NA +10A24 ; [.2DD3.0020.0002] # KHAROSHTHI LETTER PA +10A25 ; [.2DD4.0020.0002] # KHAROSHTHI LETTER PHA +10A26 ; [.2DD5.0020.0002] # KHAROSHTHI LETTER BA +10A27 ; [.2DD6.0020.0002] # KHAROSHTHI LETTER BHA +10A28 ; [.2DD7.0020.0002] # KHAROSHTHI LETTER MA +10A29 ; [.2DD8.0020.0002] # KHAROSHTHI LETTER YA +10A2A ; [.2DD9.0020.0002] # KHAROSHTHI LETTER RA +10A2B ; [.2DDA.0020.0002] # KHAROSHTHI LETTER LA +10A2C ; [.2DDB.0020.0002] # KHAROSHTHI LETTER VA +10A2D ; [.2DDC.0020.0002] # KHAROSHTHI LETTER SHA +10A2E ; [.2DDD.0020.0002] # KHAROSHTHI LETTER SSA +10A2F ; [.2DDE.0020.0002] # KHAROSHTHI LETTER SA +10A30 ; [.2DDF.0020.0002] # KHAROSHTHI LETTER ZA +10A31 ; [.2DE0.0020.0002] # KHAROSHTHI LETTER HA +10A32 ; [.2DE1.0020.0002] # KHAROSHTHI LETTER KKA +10A33 ; [.2DE2.0020.0002] # KHAROSHTHI LETTER TTTHA +10A3F ; [.2DE3.0020.0002] # KHAROSHTHI VIRAMA +11C00 ; [.2DE4.0020.0002] # BHAIKSUKI LETTER A +11C01 ; [.2DE5.0020.0002] # BHAIKSUKI LETTER AA +11C02 ; [.2DE6.0020.0002] # BHAIKSUKI LETTER I +11C03 ; [.2DE7.0020.0002] # BHAIKSUKI LETTER II +11C04 ; [.2DE8.0020.0002] # BHAIKSUKI LETTER U +11C05 ; [.2DE9.0020.0002] # BHAIKSUKI LETTER UU +11C06 ; [.2DEA.0020.0002] # BHAIKSUKI LETTER VOCALIC R +11C07 ; [.2DEB.0020.0002] # BHAIKSUKI LETTER VOCALIC RR +11C08 ; [.2DEC.0020.0002] # BHAIKSUKI LETTER VOCALIC L +11C0A ; [.2DED.0020.0002] # BHAIKSUKI LETTER E +11C0B ; [.2DEE.0020.0002] # BHAIKSUKI LETTER AI +11C0C ; [.2DEF.0020.0002] # BHAIKSUKI LETTER O +11C0D ; [.2DF0.0020.0002] # BHAIKSUKI LETTER AU +11C0E ; [.2DF1.0020.0002] # BHAIKSUKI LETTER KA +11C0F ; [.2DF2.0020.0002] # BHAIKSUKI LETTER KHA +11C10 ; [.2DF3.0020.0002] # BHAIKSUKI LETTER GA +11C11 ; [.2DF4.0020.0002] # BHAIKSUKI LETTER GHA +11C12 ; [.2DF5.0020.0002] # BHAIKSUKI LETTER NGA +11C13 ; [.2DF6.0020.0002] # BHAIKSUKI LETTER CA +11C14 ; [.2DF7.0020.0002] # BHAIKSUKI LETTER CHA +11C15 ; [.2DF8.0020.0002] # BHAIKSUKI LETTER JA +11C16 ; [.2DF9.0020.0002] # BHAIKSUKI LETTER JHA +11C17 ; [.2DFA.0020.0002] # BHAIKSUKI LETTER NYA +11C18 ; [.2DFB.0020.0002] # BHAIKSUKI LETTER TTA +11C19 ; [.2DFC.0020.0002] # BHAIKSUKI LETTER TTHA +11C1A ; [.2DFD.0020.0002] # BHAIKSUKI LETTER DDA +11C1B ; [.2DFE.0020.0002] # BHAIKSUKI LETTER DDHA +11C1C ; [.2DFF.0020.0002] # BHAIKSUKI LETTER NNA +11C1D ; [.2E00.0020.0002] # BHAIKSUKI LETTER TA +11C1E ; [.2E01.0020.0002] # BHAIKSUKI LETTER THA +11C1F ; [.2E02.0020.0002] # BHAIKSUKI LETTER DA +11C20 ; [.2E03.0020.0002] # BHAIKSUKI LETTER DHA +11C21 ; [.2E04.0020.0002] # BHAIKSUKI LETTER NA +11C22 ; [.2E05.0020.0002] # BHAIKSUKI LETTER PA +11C23 ; [.2E06.0020.0002] # BHAIKSUKI LETTER PHA +11C24 ; [.2E07.0020.0002] # BHAIKSUKI LETTER BA +11C25 ; [.2E08.0020.0002] # BHAIKSUKI LETTER BHA +11C26 ; [.2E09.0020.0002] # BHAIKSUKI LETTER MA +11C27 ; [.2E0A.0020.0002] # BHAIKSUKI LETTER YA +11C28 ; [.2E0B.0020.0002] # BHAIKSUKI LETTER RA +11C29 ; [.2E0C.0020.0002] # BHAIKSUKI LETTER LA +11C2A ; [.2E0D.0020.0002] # BHAIKSUKI LETTER VA +11C2B ; [.2E0E.0020.0002] # BHAIKSUKI LETTER SHA +11C2C ; [.2E0F.0020.0002] # BHAIKSUKI LETTER SSA +11C2D ; [.2E10.0020.0002] # BHAIKSUKI LETTER SA +11C2E ; [.2E11.0020.0002] # BHAIKSUKI LETTER HA +11C40 ; [.2E12.0020.0002] # BHAIKSUKI SIGN AVAGRAHA +11C2F ; [.2E13.0020.0002] # BHAIKSUKI VOWEL SIGN AA +11C30 ; [.2E14.0020.0002] # BHAIKSUKI VOWEL SIGN I +11C31 ; [.2E15.0020.0002] # BHAIKSUKI VOWEL SIGN II +11C32 ; [.2E16.0020.0002] # BHAIKSUKI VOWEL SIGN U +11C33 ; [.2E17.0020.0002] # BHAIKSUKI VOWEL SIGN UU +11C34 ; [.2E18.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC R +11C35 ; [.2E19.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC RR +11C36 ; [.2E1A.0020.0002] # BHAIKSUKI VOWEL SIGN VOCALIC L +11C38 ; [.2E1B.0020.0002] # BHAIKSUKI VOWEL SIGN E +11C39 ; [.2E1C.0020.0002] # BHAIKSUKI VOWEL SIGN AI +11C3A ; [.2E1D.0020.0002] # BHAIKSUKI VOWEL SIGN O +11C3B ; [.2E1E.0020.0002] # BHAIKSUKI VOWEL SIGN AU +11C3F ; [.2E1F.0020.0002] # BHAIKSUKI SIGN VIRAMA +0E01 ; [.2E20.0020.0002] # THAI CHARACTER KO KAI +0E40 0E01 ; [.2E20.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KO KAI> +0E41 0E01 ; [.2E20.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KO KAI> +0E42 0E01 ; [.2E20.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KO KAI> +0E43 0E01 ; [.2E20.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KO KAI> +0E44 0E01 ; [.2E20.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KO KAI> +0E02 ; [.2E21.0020.0002] # THAI CHARACTER KHO KHAI +0E40 0E02 ; [.2E21.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHAI> +0E41 0E02 ; [.2E21.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHAI> +0E42 0E02 ; [.2E21.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHAI> +0E43 0E02 ; [.2E21.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHAI> +0E44 0E02 ; [.2E21.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHAI> +0E03 ; [.2E22.0020.0002] # THAI CHARACTER KHO KHUAT +0E40 0E03 ; [.2E22.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHUAT> +0E41 0E03 ; [.2E22.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHUAT> +0E42 0E03 ; [.2E22.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHUAT> +0E43 0E03 ; [.2E22.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHUAT> +0E44 0E03 ; [.2E22.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHUAT> +0E04 ; [.2E23.0020.0002] # THAI CHARACTER KHO KHWAI +0E40 0E04 ; [.2E23.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHWAI> +0E41 0E04 ; [.2E23.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHWAI> +0E42 0E04 ; [.2E23.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHWAI> +0E43 0E04 ; [.2E23.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHWAI> +0E44 0E04 ; [.2E23.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHWAI> +0E05 ; [.2E24.0020.0002] # THAI CHARACTER KHO KHON +0E40 0E05 ; [.2E24.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO KHON> +0E41 0E05 ; [.2E24.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO KHON> +0E42 0E05 ; [.2E24.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO KHON> +0E43 0E05 ; [.2E24.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO KHON> +0E44 0E05 ; [.2E24.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO KHON> +0E06 ; [.2E25.0020.0002] # THAI CHARACTER KHO RAKHANG +0E40 0E06 ; [.2E25.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER KHO RAKHANG> +0E41 0E06 ; [.2E25.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER KHO RAKHANG> +0E42 0E06 ; [.2E25.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER KHO RAKHANG> +0E43 0E06 ; [.2E25.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER KHO RAKHANG> +0E44 0E06 ; [.2E25.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER KHO RAKHANG> +0E07 ; [.2E26.0020.0002] # THAI CHARACTER NGO NGU +0E40 0E07 ; [.2E26.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NGO NGU> +0E41 0E07 ; [.2E26.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NGO NGU> +0E42 0E07 ; [.2E26.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NGO NGU> +0E43 0E07 ; [.2E26.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NGO NGU> +0E44 0E07 ; [.2E26.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NGO NGU> +0E08 ; [.2E27.0020.0002] # THAI CHARACTER CHO CHAN +0E40 0E08 ; [.2E27.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHAN> +0E41 0E08 ; [.2E27.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHAN> +0E42 0E08 ; [.2E27.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHAN> +0E43 0E08 ; [.2E27.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHAN> +0E44 0E08 ; [.2E27.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHAN> +0E09 ; [.2E28.0020.0002] # THAI CHARACTER CHO CHING +0E40 0E09 ; [.2E28.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHING> +0E41 0E09 ; [.2E28.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHING> +0E42 0E09 ; [.2E28.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHING> +0E43 0E09 ; [.2E28.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHING> +0E44 0E09 ; [.2E28.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHING> +0E0A ; [.2E29.0020.0002] # THAI CHARACTER CHO CHANG +0E40 0E0A ; [.2E29.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHANG> +0E41 0E0A ; [.2E29.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHANG> +0E42 0E0A ; [.2E29.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHANG> +0E43 0E0A ; [.2E29.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHANG> +0E44 0E0A ; [.2E29.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHANG> +0E0B ; [.2E2A.0020.0002] # THAI CHARACTER SO SO +0E40 0E0B ; [.2E2A.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SO> +0E41 0E0B ; [.2E2A.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SO> +0E42 0E0B ; [.2E2A.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SO> +0E43 0E0B ; [.2E2A.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SO> +0E44 0E0B ; [.2E2A.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SO> +0E0C ; [.2E2B.0020.0002] # THAI CHARACTER CHO CHOE +0E40 0E0C ; [.2E2B.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER CHO CHOE> +0E41 0E0C ; [.2E2B.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER CHO CHOE> +0E42 0E0C ; [.2E2B.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER CHO CHOE> +0E43 0E0C ; [.2E2B.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER CHO CHOE> +0E44 0E0C ; [.2E2B.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER CHO CHOE> +0E0D ; [.2E2C.0020.0002] # THAI CHARACTER YO YING +0E40 0E0D ; [.2E2C.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YING> +0E41 0E0D ; [.2E2C.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YING> +0E42 0E0D ; [.2E2C.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YING> +0E43 0E0D ; [.2E2C.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YING> +0E44 0E0D ; [.2E2C.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YING> +0E0E ; [.2E2D.0020.0002] # THAI CHARACTER DO CHADA +0E40 0E0E ; [.2E2D.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO CHADA> +0E41 0E0E ; [.2E2D.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO CHADA> +0E42 0E0E ; [.2E2D.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO CHADA> +0E43 0E0E ; [.2E2D.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO CHADA> +0E44 0E0E ; [.2E2D.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO CHADA> +0E0F ; [.2E2E.0020.0002] # THAI CHARACTER TO PATAK +0E40 0E0F ; [.2E2E.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO PATAK> +0E41 0E0F ; [.2E2E.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO PATAK> +0E42 0E0F ; [.2E2E.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO PATAK> +0E43 0E0F ; [.2E2E.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO PATAK> +0E44 0E0F ; [.2E2E.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO PATAK> +0E10 ; [.2E2F.0020.0002] # THAI CHARACTER THO THAN +0E40 0E10 ; [.2E2F.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAN> +0E41 0E10 ; [.2E2F.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAN> +0E42 0E10 ; [.2E2F.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAN> +0E43 0E10 ; [.2E2F.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAN> +0E44 0E10 ; [.2E2F.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAN> +0E11 ; [.2E30.0020.0002] # THAI CHARACTER THO NANGMONTHO +0E40 0E11 ; [.2E30.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO NANGMONTHO> +0E41 0E11 ; [.2E30.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO NANGMONTHO> +0E42 0E11 ; [.2E30.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO NANGMONTHO> +0E43 0E11 ; [.2E30.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO NANGMONTHO> +0E44 0E11 ; [.2E30.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO NANGMONTHO> +0E12 ; [.2E31.0020.0002] # THAI CHARACTER THO PHUTHAO +0E40 0E12 ; [.2E31.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO PHUTHAO> +0E41 0E12 ; [.2E31.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO PHUTHAO> +0E42 0E12 ; [.2E31.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO PHUTHAO> +0E43 0E12 ; [.2E31.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO PHUTHAO> +0E44 0E12 ; [.2E31.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO PHUTHAO> +0E13 ; [.2E32.0020.0002] # THAI CHARACTER NO NEN +0E40 0E13 ; [.2E32.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NEN> +0E41 0E13 ; [.2E32.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NEN> +0E42 0E13 ; [.2E32.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NEN> +0E43 0E13 ; [.2E32.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NEN> +0E44 0E13 ; [.2E32.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NEN> +0E14 ; [.2E33.0020.0002] # THAI CHARACTER DO DEK +0E40 0E14 ; [.2E33.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER DO DEK> +0E41 0E14 ; [.2E33.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER DO DEK> +0E42 0E14 ; [.2E33.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER DO DEK> +0E43 0E14 ; [.2E33.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER DO DEK> +0E44 0E14 ; [.2E33.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER DO DEK> +0E15 ; [.2E34.0020.0002] # THAI CHARACTER TO TAO +0E40 0E15 ; [.2E34.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER TO TAO> +0E41 0E15 ; [.2E34.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER TO TAO> +0E42 0E15 ; [.2E34.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER TO TAO> +0E43 0E15 ; [.2E34.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER TO TAO> +0E44 0E15 ; [.2E34.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER TO TAO> +0E16 ; [.2E35.0020.0002] # THAI CHARACTER THO THUNG +0E40 0E16 ; [.2E35.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THUNG> +0E41 0E16 ; [.2E35.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THUNG> +0E42 0E16 ; [.2E35.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THUNG> +0E43 0E16 ; [.2E35.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THUNG> +0E44 0E16 ; [.2E35.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THUNG> +0E17 ; [.2E36.0020.0002] # THAI CHARACTER THO THAHAN +0E40 0E17 ; [.2E36.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THAHAN> +0E41 0E17 ; [.2E36.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THAHAN> +0E42 0E17 ; [.2E36.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THAHAN> +0E43 0E17 ; [.2E36.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THAHAN> +0E44 0E17 ; [.2E36.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THAHAN> +0E18 ; [.2E37.0020.0002] # THAI CHARACTER THO THONG +0E40 0E18 ; [.2E37.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER THO THONG> +0E41 0E18 ; [.2E37.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER THO THONG> +0E42 0E18 ; [.2E37.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER THO THONG> +0E43 0E18 ; [.2E37.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER THO THONG> +0E44 0E18 ; [.2E37.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER THO THONG> +0E19 ; [.2E38.0020.0002] # THAI CHARACTER NO NU +0E40 0E19 ; [.2E38.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER NO NU> +0E41 0E19 ; [.2E38.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER NO NU> +0E42 0E19 ; [.2E38.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER NO NU> +0E43 0E19 ; [.2E38.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER NO NU> +0E44 0E19 ; [.2E38.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER NO NU> +0E1A ; [.2E39.0020.0002] # THAI CHARACTER BO BAIMAI +0E40 0E1A ; [.2E39.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER BO BAIMAI> +0E41 0E1A ; [.2E39.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER BO BAIMAI> +0E42 0E1A ; [.2E39.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER BO BAIMAI> +0E43 0E1A ; [.2E39.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER BO BAIMAI> +0E44 0E1A ; [.2E39.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER BO BAIMAI> +0E1B ; [.2E3A.0020.0002] # THAI CHARACTER PO PLA +0E40 0E1B ; [.2E3A.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PO PLA> +0E41 0E1B ; [.2E3A.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PO PLA> +0E42 0E1B ; [.2E3A.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PO PLA> +0E43 0E1B ; [.2E3A.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PO PLA> +0E44 0E1B ; [.2E3A.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PO PLA> +0E1C ; [.2E3B.0020.0002] # THAI CHARACTER PHO PHUNG +0E40 0E1C ; [.2E3B.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHUNG> +0E41 0E1C ; [.2E3B.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHUNG> +0E42 0E1C ; [.2E3B.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHUNG> +0E43 0E1C ; [.2E3B.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHUNG> +0E44 0E1C ; [.2E3B.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHUNG> +0E1D ; [.2E3C.0020.0002] # THAI CHARACTER FO FA +0E40 0E1D ; [.2E3C.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FA> +0E41 0E1D ; [.2E3C.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FA> +0E42 0E1D ; [.2E3C.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FA> +0E43 0E1D ; [.2E3C.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FA> +0E44 0E1D ; [.2E3C.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FA> +0E1E ; [.2E3D.0020.0002] # THAI CHARACTER PHO PHAN +0E40 0E1E ; [.2E3D.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO PHAN> +0E41 0E1E ; [.2E3D.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO PHAN> +0E42 0E1E ; [.2E3D.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO PHAN> +0E43 0E1E ; [.2E3D.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO PHAN> +0E44 0E1E ; [.2E3D.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO PHAN> +0E1F ; [.2E3E.0020.0002] # THAI CHARACTER FO FAN +0E40 0E1F ; [.2E3E.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER FO FAN> +0E41 0E1F ; [.2E3E.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER FO FAN> +0E42 0E1F ; [.2E3E.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER FO FAN> +0E43 0E1F ; [.2E3E.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER FO FAN> +0E44 0E1F ; [.2E3E.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER FO FAN> +0E20 ; [.2E3F.0020.0002] # THAI CHARACTER PHO SAMPHAO +0E40 0E20 ; [.2E3F.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER PHO SAMPHAO> +0E41 0E20 ; [.2E3F.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER PHO SAMPHAO> +0E42 0E20 ; [.2E3F.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER PHO SAMPHAO> +0E43 0E20 ; [.2E3F.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER PHO SAMPHAO> +0E44 0E20 ; [.2E3F.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER PHO SAMPHAO> +0E21 ; [.2E40.0020.0002] # THAI CHARACTER MO MA +0E40 0E21 ; [.2E40.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER MO MA> +0E41 0E21 ; [.2E40.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER MO MA> +0E42 0E21 ; [.2E40.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER MO MA> +0E43 0E21 ; [.2E40.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER MO MA> +0E44 0E21 ; [.2E40.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER MO MA> +0E22 ; [.2E41.0020.0002] # THAI CHARACTER YO YAK +0E40 0E22 ; [.2E41.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER YO YAK> +0E41 0E22 ; [.2E41.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER YO YAK> +0E42 0E22 ; [.2E41.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER YO YAK> +0E43 0E22 ; [.2E41.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER YO YAK> +0E44 0E22 ; [.2E41.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER YO YAK> +0E23 ; [.2E42.0020.0002] # THAI CHARACTER RO RUA +0E40 0E23 ; [.2E42.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RO RUA> +0E41 0E23 ; [.2E42.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RO RUA> +0E42 0E23 ; [.2E42.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RO RUA> +0E43 0E23 ; [.2E42.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RO RUA> +0E44 0E23 ; [.2E42.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RO RUA> +0E24 ; [.2E43.0020.0002] # THAI CHARACTER RU +0E40 0E24 ; [.2E43.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER RU> +0E41 0E24 ; [.2E43.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER RU> +0E42 0E24 ; [.2E43.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER RU> +0E43 0E24 ; [.2E43.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER RU> +0E44 0E24 ; [.2E43.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER RU> +0E25 ; [.2E44.0020.0002] # THAI CHARACTER LO LING +0E40 0E25 ; [.2E44.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO LING> +0E41 0E25 ; [.2E44.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO LING> +0E42 0E25 ; [.2E44.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO LING> +0E43 0E25 ; [.2E44.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO LING> +0E44 0E25 ; [.2E44.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO LING> +0E26 ; [.2E45.0020.0002] # THAI CHARACTER LU +0E40 0E26 ; [.2E45.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LU> +0E41 0E26 ; [.2E45.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LU> +0E42 0E26 ; [.2E45.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LU> +0E43 0E26 ; [.2E45.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LU> +0E44 0E26 ; [.2E45.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LU> +0E27 ; [.2E46.0020.0002] # THAI CHARACTER WO WAEN +0E40 0E27 ; [.2E46.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER WO WAEN> +0E41 0E27 ; [.2E46.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER WO WAEN> +0E42 0E27 ; [.2E46.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER WO WAEN> +0E43 0E27 ; [.2E46.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER WO WAEN> +0E44 0E27 ; [.2E46.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER WO WAEN> +0E28 ; [.2E47.0020.0002] # THAI CHARACTER SO SALA +0E40 0E28 ; [.2E47.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SALA> +0E41 0E28 ; [.2E47.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SALA> +0E42 0E28 ; [.2E47.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SALA> +0E43 0E28 ; [.2E47.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SALA> +0E44 0E28 ; [.2E47.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SALA> +0E29 ; [.2E48.0020.0002] # THAI CHARACTER SO RUSI +0E40 0E29 ; [.2E48.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO RUSI> +0E41 0E29 ; [.2E48.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO RUSI> +0E42 0E29 ; [.2E48.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO RUSI> +0E43 0E29 ; [.2E48.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO RUSI> +0E44 0E29 ; [.2E48.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO RUSI> +0E2A ; [.2E49.0020.0002] # THAI CHARACTER SO SUA +0E40 0E2A ; [.2E49.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER SO SUA> +0E41 0E2A ; [.2E49.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER SO SUA> +0E42 0E2A ; [.2E49.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER SO SUA> +0E43 0E2A ; [.2E49.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER SO SUA> +0E44 0E2A ; [.2E49.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER SO SUA> +0E2B ; [.2E4A.0020.0002] # THAI CHARACTER HO HIP +0E40 0E2B ; [.2E4A.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO HIP> +0E41 0E2B ; [.2E4A.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO HIP> +0E42 0E2B ; [.2E4A.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO HIP> +0E43 0E2B ; [.2E4A.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO HIP> +0E44 0E2B ; [.2E4A.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO HIP> +0E2C ; [.2E4B.0020.0002] # THAI CHARACTER LO CHULA +0E40 0E2C ; [.2E4B.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER LO CHULA> +0E41 0E2C ; [.2E4B.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER LO CHULA> +0E42 0E2C ; [.2E4B.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER LO CHULA> +0E43 0E2C ; [.2E4B.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER LO CHULA> +0E44 0E2C ; [.2E4B.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER LO CHULA> +0E2D ; [.2E4C.0020.0002] # THAI CHARACTER O ANG +0E40 0E2D ; [.2E4C.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER O ANG> +0E41 0E2D ; [.2E4C.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER O ANG> +0E42 0E2D ; [.2E4C.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER O ANG> +0E43 0E2D ; [.2E4C.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER O ANG> +0E44 0E2D ; [.2E4C.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER O ANG> +0E2E ; [.2E4D.0020.0002] # THAI CHARACTER HO NOKHUK +0E40 0E2E ; [.2E4D.0020.0002][.2E5A.0020.0002] # <THAI CHARACTER SARA E, THAI CHARACTER HO NOKHUK> +0E41 0E2E ; [.2E4D.0020.0002][.2E5B.0020.0002] # <THAI CHARACTER SARA AE, THAI CHARACTER HO NOKHUK> +0E42 0E2E ; [.2E4D.0020.0002][.2E5C.0020.0002] # <THAI CHARACTER SARA O, THAI CHARACTER HO NOKHUK> +0E43 0E2E ; [.2E4D.0020.0002][.2E5D.0020.0002] # <THAI CHARACTER SARA AI MAIMUAN, THAI CHARACTER HO NOKHUK> +0E44 0E2E ; [.2E4D.0020.0002][.2E5E.0020.0002] # <THAI CHARACTER SARA AI MAIMALAI, THAI CHARACTER HO NOKHUK> +0E2F ; [.2E4E.0020.0002] # THAI CHARACTER PAIYANNOI +0E30 ; [.2E4F.0020.0002] # THAI CHARACTER SARA A +0E31 ; [.2E50.0020.0002] # THAI CHARACTER MAI HAN-AKAT +0E32 ; [.2E51.0020.0002] # THAI CHARACTER SARA AA +0E33 ; [.2E52.0020.0002] # THAI CHARACTER SARA AM +0E4D 0E32 ; [.2E52.0020.0002] # THAI CHARACTER SARA AM +0E34 ; [.2E53.0020.0002] # THAI CHARACTER SARA I +0E35 ; [.2E54.0020.0002] # THAI CHARACTER SARA II +0E36 ; [.2E55.0020.0002] # THAI CHARACTER SARA UE +0E37 ; [.2E56.0020.0002] # THAI CHARACTER SARA UEE +0E38 ; [.2E57.0020.0002] # THAI CHARACTER SARA U +0E39 ; [.2E58.0020.0002] # THAI CHARACTER SARA UU +0E3A ; [.2E59.0020.0002] # THAI CHARACTER PHINTHU +0E40 ; [.2E5A.0020.0002] # THAI CHARACTER SARA E +0E41 ; [.2E5B.0020.0002] # THAI CHARACTER SARA AE +0E42 ; [.2E5C.0020.0002] # THAI CHARACTER SARA O +0E43 ; [.2E5D.0020.0002] # THAI CHARACTER SARA AI MAIMUAN +0E44 ; [.2E5E.0020.0002] # THAI CHARACTER SARA AI MAIMALAI +0E45 ; [.2E5F.0020.0002] # THAI CHARACTER LAKKHANGYAO +0EDE ; [.2E60.0020.0002] # LAO LETTER KHMU GO +0EC0 0EDE ; [.2E60.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU GO> +0EC1 0EDE ; [.2E60.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU GO> +0EC2 0EDE ; [.2E60.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU GO> +0EC3 0EDE ; [.2E60.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU GO> +0EC4 0EDE ; [.2E60.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU GO> +0E81 ; [.2E61.0020.0002] # LAO LETTER KO +0EC0 0E81 ; [.2E61.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KO> +0EC1 0E81 ; [.2E61.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KO> +0EC2 0E81 ; [.2E61.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KO> +0EC3 0E81 ; [.2E61.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KO> +0EC4 0E81 ; [.2E61.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KO> +0E82 ; [.2E62.0020.0002] # LAO LETTER KHO SUNG +0EC0 0E82 ; [.2E62.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO SUNG> +0EC1 0E82 ; [.2E62.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO SUNG> +0EC2 0E82 ; [.2E62.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO SUNG> +0EC3 0E82 ; [.2E62.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO SUNG> +0EC4 0E82 ; [.2E62.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO SUNG> +0E84 ; [.2E63.0020.0002] # LAO LETTER KHO TAM +0EC0 0E84 ; [.2E63.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHO TAM> +0EC1 0E84 ; [.2E63.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHO TAM> +0EC2 0E84 ; [.2E63.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHO TAM> +0EC3 0E84 ; [.2E63.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHO TAM> +0EC4 0E84 ; [.2E63.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHO TAM> +0E87 ; [.2E64.0020.0002] # LAO LETTER NGO +0EC0 0E87 ; [.2E64.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NGO> +0EC1 0E87 ; [.2E64.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NGO> +0EC2 0E87 ; [.2E64.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NGO> +0EC3 0E87 ; [.2E64.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NGO> +0EC4 0E87 ; [.2E64.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NGO> +0E88 ; [.2E65.0020.0002] # LAO LETTER CO +0EC0 0E88 ; [.2E65.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER CO> +0EC1 0E88 ; [.2E65.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER CO> +0EC2 0E88 ; [.2E65.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER CO> +0EC3 0E88 ; [.2E65.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER CO> +0EC4 0E88 ; [.2E65.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER CO> +0EAA ; [.2E66.0020.0002] # LAO LETTER SO SUNG +0EC0 0EAA ; [.2E66.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO SUNG> +0EC1 0EAA ; [.2E66.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO SUNG> +0EC2 0EAA ; [.2E66.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO SUNG> +0EC3 0EAA ; [.2E66.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO SUNG> +0EC4 0EAA ; [.2E66.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO SUNG> +0E8A ; [.2E67.0020.0002] # LAO LETTER SO TAM +0EC0 0E8A ; [.2E67.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER SO TAM> +0EC1 0E8A ; [.2E67.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER SO TAM> +0EC2 0E8A ; [.2E67.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER SO TAM> +0EC3 0E8A ; [.2E67.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER SO TAM> +0EC4 0E8A ; [.2E67.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER SO TAM> +0EDF ; [.2E68.0020.0002] # LAO LETTER KHMU NYO +0EC0 0EDF ; [.2E68.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER KHMU NYO> +0EC1 0EDF ; [.2E68.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER KHMU NYO> +0EC2 0EDF ; [.2E68.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER KHMU NYO> +0EC3 0EDF ; [.2E68.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER KHMU NYO> +0EC4 0EDF ; [.2E68.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER KHMU NYO> +0E8D ; [.2E69.0020.0002] # LAO LETTER NYO +0EC0 0E8D ; [.2E69.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NYO> +0EC1 0E8D ; [.2E69.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NYO> +0EC2 0E8D ; [.2E69.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NYO> +0EC3 0E8D ; [.2E69.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NYO> +0EC4 0E8D ; [.2E69.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NYO> +0E94 ; [.2E6A.0020.0002] # LAO LETTER DO +0EC0 0E94 ; [.2E6A.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER DO> +0EC1 0E94 ; [.2E6A.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER DO> +0EC2 0E94 ; [.2E6A.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER DO> +0EC3 0E94 ; [.2E6A.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER DO> +0EC4 0E94 ; [.2E6A.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER DO> +0E95 ; [.2E6B.0020.0002] # LAO LETTER TO +0EC0 0E95 ; [.2E6B.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER TO> +0EC1 0E95 ; [.2E6B.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER TO> +0EC2 0E95 ; [.2E6B.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER TO> +0EC3 0E95 ; [.2E6B.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER TO> +0EC4 0E95 ; [.2E6B.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER TO> +0E96 ; [.2E6C.0020.0002] # LAO LETTER THO SUNG +0EC0 0E96 ; [.2E6C.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO SUNG> +0EC1 0E96 ; [.2E6C.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO SUNG> +0EC2 0E96 ; [.2E6C.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO SUNG> +0EC3 0E96 ; [.2E6C.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO SUNG> +0EC4 0E96 ; [.2E6C.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO SUNG> +0E97 ; [.2E6D.0020.0002] # LAO LETTER THO TAM +0EC0 0E97 ; [.2E6D.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER THO TAM> +0EC1 0E97 ; [.2E6D.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER THO TAM> +0EC2 0E97 ; [.2E6D.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER THO TAM> +0EC3 0E97 ; [.2E6D.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER THO TAM> +0EC4 0E97 ; [.2E6D.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER THO TAM> +0E99 ; [.2E6E.0020.0002] # LAO LETTER NO +0EC0 0E99 ; [.2E6E.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER NO> +0EC1 0E99 ; [.2E6E.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER NO> +0EC2 0E99 ; [.2E6E.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER NO> +0EC3 0E99 ; [.2E6E.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER NO> +0EC4 0E99 ; [.2E6E.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER NO> +0E9A ; [.2E6F.0020.0002] # LAO LETTER BO +0EC0 0E9A ; [.2E6F.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER BO> +0EC1 0E9A ; [.2E6F.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER BO> +0EC2 0E9A ; [.2E6F.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER BO> +0EC3 0E9A ; [.2E6F.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER BO> +0EC4 0E9A ; [.2E6F.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER BO> +0E9B ; [.2E70.0020.0002] # LAO LETTER PO +0EC0 0E9B ; [.2E70.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PO> +0EC1 0E9B ; [.2E70.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PO> +0EC2 0E9B ; [.2E70.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PO> +0EC3 0E9B ; [.2E70.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PO> +0EC4 0E9B ; [.2E70.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PO> +0E9C ; [.2E71.0020.0002] # LAO LETTER PHO SUNG +0EC0 0E9C ; [.2E71.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO SUNG> +0EC1 0E9C ; [.2E71.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO SUNG> +0EC2 0E9C ; [.2E71.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO SUNG> +0EC3 0E9C ; [.2E71.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO SUNG> +0EC4 0E9C ; [.2E71.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO SUNG> +0E9D ; [.2E72.0020.0002] # LAO LETTER FO TAM +0EC0 0E9D ; [.2E72.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO TAM> +0EC1 0E9D ; [.2E72.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO TAM> +0EC2 0E9D ; [.2E72.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO TAM> +0EC3 0E9D ; [.2E72.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO TAM> +0EC4 0E9D ; [.2E72.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO TAM> +0E9E ; [.2E73.0020.0002] # LAO LETTER PHO TAM +0EC0 0E9E ; [.2E73.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER PHO TAM> +0EC1 0E9E ; [.2E73.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER PHO TAM> +0EC2 0E9E ; [.2E73.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER PHO TAM> +0EC3 0E9E ; [.2E73.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER PHO TAM> +0EC4 0E9E ; [.2E73.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER PHO TAM> +0E9F ; [.2E74.0020.0002] # LAO LETTER FO SUNG +0EC0 0E9F ; [.2E74.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER FO SUNG> +0EC1 0E9F ; [.2E74.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER FO SUNG> +0EC2 0E9F ; [.2E74.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER FO SUNG> +0EC3 0E9F ; [.2E74.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER FO SUNG> +0EC4 0E9F ; [.2E74.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER FO SUNG> +0EA1 ; [.2E75.0020.0002] # LAO LETTER MO +0EC0 0EA1 ; [.2E75.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER MO> +0EC1 0EA1 ; [.2E75.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER MO> +0EC2 0EA1 ; [.2E75.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER MO> +0EC3 0EA1 ; [.2E75.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER MO> +0EC4 0EA1 ; [.2E75.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER MO> +0EA2 ; [.2E76.0020.0002] # LAO LETTER YO +0EC0 0EA2 ; [.2E76.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER YO> +0EC1 0EA2 ; [.2E76.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER YO> +0EC2 0EA2 ; [.2E76.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER YO> +0EC3 0EA2 ; [.2E76.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER YO> +0EC4 0EA2 ; [.2E76.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER YO> +0EA3 ; [.2E77.0020.0002] # LAO LETTER LO LING +0EC0 0EA3 ; [.2E77.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LING> +0EC1 0EA3 ; [.2E77.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LING> +0EC2 0EA3 ; [.2E77.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LING> +0EC3 0EA3 ; [.2E77.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LING> +0EC4 0EA3 ; [.2E77.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LING> +0EA5 ; [.2E78.0020.0002] # LAO LETTER LO LOOT +0EC0 0EA5 ; [.2E78.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER LO LOOT> +0EC1 0EA5 ; [.2E78.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER LO LOOT> +0EC2 0EA5 ; [.2E78.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER LO LOOT> +0EC3 0EA5 ; [.2E78.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER LO LOOT> +0EC4 0EA5 ; [.2E78.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER LO LOOT> +0EA7 ; [.2E79.0020.0002] # LAO LETTER WO +0EC0 0EA7 ; [.2E79.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER WO> +0EC1 0EA7 ; [.2E79.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER WO> +0EC2 0EA7 ; [.2E79.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER WO> +0EC3 0EA7 ; [.2E79.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER WO> +0EC4 0EA7 ; [.2E79.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER WO> +0EAB ; [.2E7A.0020.0002] # LAO LETTER HO SUNG +0EDC ; [.2E7A.0020.0004][.2E6E.0020.0004] # LAO HO NO +0EC0 0EDC ; [.2E7A.0020.0004][.2E6E.0020.0004][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO HO NO> +0EC1 0EDC ; [.2E7A.0020.0004][.2E6E.0020.0004][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO HO NO> +0EC2 0EDC ; [.2E7A.0020.0004][.2E6E.0020.0004][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO HO NO> +0EC3 0EDC ; [.2E7A.0020.0004][.2E6E.0020.0004][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO HO NO> +0EC4 0EDC ; [.2E7A.0020.0004][.2E6E.0020.0004][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO HO NO> +0EDD ; [.2E7A.0020.0004][.2E75.0020.0004] # LAO HO MO +0EC0 0EDD ; [.2E7A.0020.0004][.2E75.0020.0004][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO HO MO> +0EC1 0EDD ; [.2E7A.0020.0004][.2E75.0020.0004][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO HO MO> +0EC2 0EDD ; [.2E7A.0020.0004][.2E75.0020.0004][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO HO MO> +0EC3 0EDD ; [.2E7A.0020.0004][.2E75.0020.0004][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO HO MO> +0EC4 0EDD ; [.2E7A.0020.0004][.2E75.0020.0004][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO HO MO> +0EC0 0EAB ; [.2E7A.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO SUNG> +0EC1 0EAB ; [.2E7A.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO SUNG> +0EC2 0EAB ; [.2E7A.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO SUNG> +0EC3 0EAB ; [.2E7A.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO SUNG> +0EC4 0EAB ; [.2E7A.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO SUNG> +0EAD ; [.2E7B.0020.0002] # LAO LETTER O +0EC0 0EAD ; [.2E7B.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER O> +0EC1 0EAD ; [.2E7B.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER O> +0EC2 0EAD ; [.2E7B.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER O> +0EC3 0EAD ; [.2E7B.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER O> +0EC4 0EAD ; [.2E7B.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER O> +0EAE ; [.2E7C.0020.0002] # LAO LETTER HO TAM +0EC0 0EAE ; [.2E7C.0020.0002][.2E8B.0020.0002] # <LAO VOWEL SIGN E, LAO LETTER HO TAM> +0EC1 0EAE ; [.2E7C.0020.0002][.2E8C.0020.0002] # <LAO VOWEL SIGN EI, LAO LETTER HO TAM> +0EC2 0EAE ; [.2E7C.0020.0002][.2E8D.0020.0002] # <LAO VOWEL SIGN O, LAO LETTER HO TAM> +0EC3 0EAE ; [.2E7C.0020.0002][.2E8E.0020.0002] # <LAO VOWEL SIGN AY, LAO LETTER HO TAM> +0EC4 0EAE ; [.2E7C.0020.0002][.2E8F.0020.0002] # <LAO VOWEL SIGN AI, LAO LETTER HO TAM> +0EAF ; [.2E7D.0020.0002] # LAO ELLIPSIS +0EB0 ; [.2E7E.0020.0002] # LAO VOWEL SIGN A +0EB1 ; [.2E7F.0020.0002] # LAO VOWEL SIGN MAI KAN +0EB2 ; [.2E80.0020.0002] # LAO VOWEL SIGN AA +0EB3 ; [.2E81.0020.0002] # LAO VOWEL SIGN AM +0ECD 0EB2 ; [.2E81.0020.0002] # LAO VOWEL SIGN AM +0EB4 ; [.2E82.0020.0002] # LAO VOWEL SIGN I +0EB5 ; [.2E83.0020.0002] # LAO VOWEL SIGN II +0EB6 ; [.2E84.0020.0002] # LAO VOWEL SIGN Y +0EB7 ; [.2E85.0020.0002] # LAO VOWEL SIGN YY +0EB8 ; [.2E86.0020.0002] # LAO VOWEL SIGN U +0EB9 ; [.2E87.0020.0002] # LAO VOWEL SIGN UU +0EBB ; [.2E88.0020.0002] # LAO VOWEL SIGN MAI KON +0EBC ; [.2E89.0020.0002] # LAO SEMIVOWEL SIGN LO +0EBD ; [.2E8A.0020.0002] # LAO SEMIVOWEL SIGN NYO +0EC0 ; [.2E8B.0020.0002] # LAO VOWEL SIGN E +0EC1 ; [.2E8C.0020.0002] # LAO VOWEL SIGN EI +0EC2 ; [.2E8D.0020.0002] # LAO VOWEL SIGN O +0EC3 ; [.2E8E.0020.0002] # LAO VOWEL SIGN AY +0EC4 ; [.2E8F.0020.0002] # LAO VOWEL SIGN AI +AA80 ; [.2E90.0020.0002] # TAI VIET LETTER LOW KO +AAB5 AA80 ; [.2E90.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KO> +AAB6 AA80 ; [.2E90.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KO> +AAB9 AA80 ; [.2E90.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KO> +AABB AA80 ; [.2E90.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KO> +AABC AA80 ; [.2E90.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KO> +AA81 ; [.2E91.0020.0002] # TAI VIET LETTER HIGH KO +AAB5 AA81 ; [.2E91.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KO> +AAB6 AA81 ; [.2E91.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KO> +AAB9 AA81 ; [.2E91.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KO> +AABB AA81 ; [.2E91.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KO> +AABC AA81 ; [.2E91.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KO> +AA82 ; [.2E92.0020.0002] # TAI VIET LETTER LOW KHO +AAB5 AA82 ; [.2E92.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHO> +AAB6 AA82 ; [.2E92.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHO> +AAB9 AA82 ; [.2E92.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHO> +AABB AA82 ; [.2E92.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHO> +AABC AA82 ; [.2E92.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHO> +AA83 ; [.2E93.0020.0002] # TAI VIET LETTER HIGH KHO +AAB5 AA83 ; [.2E93.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHO> +AAB6 AA83 ; [.2E93.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHO> +AAB9 AA83 ; [.2E93.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHO> +AABB AA83 ; [.2E93.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHO> +AABC AA83 ; [.2E93.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHO> +AA84 ; [.2E94.0020.0002] # TAI VIET LETTER LOW KHHO +AAB5 AA84 ; [.2E94.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW KHHO> +AAB6 AA84 ; [.2E94.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW KHHO> +AAB9 AA84 ; [.2E94.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW KHHO> +AABB AA84 ; [.2E94.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW KHHO> +AABC AA84 ; [.2E94.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW KHHO> +AA85 ; [.2E95.0020.0002] # TAI VIET LETTER HIGH KHHO +AAB5 AA85 ; [.2E95.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH KHHO> +AAB6 AA85 ; [.2E95.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH KHHO> +AAB9 AA85 ; [.2E95.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH KHHO> +AABB AA85 ; [.2E95.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH KHHO> +AABC AA85 ; [.2E95.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH KHHO> +AA86 ; [.2E96.0020.0002] # TAI VIET LETTER LOW GO +AAB5 AA86 ; [.2E96.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW GO> +AAB6 AA86 ; [.2E96.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW GO> +AAB9 AA86 ; [.2E96.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW GO> +AABB AA86 ; [.2E96.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW GO> +AABC AA86 ; [.2E96.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW GO> +AA87 ; [.2E97.0020.0002] # TAI VIET LETTER HIGH GO +AAB5 AA87 ; [.2E97.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH GO> +AAB6 AA87 ; [.2E97.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH GO> +AAB9 AA87 ; [.2E97.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH GO> +AABB AA87 ; [.2E97.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH GO> +AABC AA87 ; [.2E97.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH GO> +AA88 ; [.2E98.0020.0002] # TAI VIET LETTER LOW NGO +AAB5 AA88 ; [.2E98.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NGO> +AAB6 AA88 ; [.2E98.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NGO> +AAB9 AA88 ; [.2E98.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NGO> +AABB AA88 ; [.2E98.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NGO> +AABC AA88 ; [.2E98.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NGO> +AA89 ; [.2E99.0020.0002] # TAI VIET LETTER HIGH NGO +AAB5 AA89 ; [.2E99.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NGO> +AAB6 AA89 ; [.2E99.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NGO> +AAB9 AA89 ; [.2E99.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NGO> +AABB AA89 ; [.2E99.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NGO> +AABC AA89 ; [.2E99.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NGO> +AA8A ; [.2E9A.0020.0002] # TAI VIET LETTER LOW CO +AAB5 AA8A ; [.2E9A.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CO> +AAB6 AA8A ; [.2E9A.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CO> +AAB9 AA8A ; [.2E9A.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CO> +AABB AA8A ; [.2E9A.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CO> +AABC AA8A ; [.2E9A.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CO> +AA8B ; [.2E9B.0020.0002] # TAI VIET LETTER HIGH CO +AAB5 AA8B ; [.2E9B.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CO> +AAB6 AA8B ; [.2E9B.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CO> +AAB9 AA8B ; [.2E9B.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CO> +AABB AA8B ; [.2E9B.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CO> +AABC AA8B ; [.2E9B.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CO> +AA8C ; [.2E9C.0020.0002] # TAI VIET LETTER LOW CHO +AAB5 AA8C ; [.2E9C.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW CHO> +AAB6 AA8C ; [.2E9C.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW CHO> +AAB9 AA8C ; [.2E9C.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW CHO> +AABB AA8C ; [.2E9C.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW CHO> +AABC AA8C ; [.2E9C.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW CHO> +AA8D ; [.2E9D.0020.0002] # TAI VIET LETTER HIGH CHO +AAB5 AA8D ; [.2E9D.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH CHO> +AAB6 AA8D ; [.2E9D.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH CHO> +AAB9 AA8D ; [.2E9D.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH CHO> +AABB AA8D ; [.2E9D.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH CHO> +AABC AA8D ; [.2E9D.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH CHO> +AA8E ; [.2E9E.0020.0002] # TAI VIET LETTER LOW SO +AAB5 AA8E ; [.2E9E.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW SO> +AAB6 AA8E ; [.2E9E.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW SO> +AAB9 AA8E ; [.2E9E.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW SO> +AABB AA8E ; [.2E9E.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW SO> +AABC AA8E ; [.2E9E.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW SO> +AA8F ; [.2E9F.0020.0002] # TAI VIET LETTER HIGH SO +AAB5 AA8F ; [.2E9F.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH SO> +AAB6 AA8F ; [.2E9F.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH SO> +AAB9 AA8F ; [.2E9F.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH SO> +AABB AA8F ; [.2E9F.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH SO> +AABC AA8F ; [.2E9F.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH SO> +AA90 ; [.2EA0.0020.0002] # TAI VIET LETTER LOW NYO +AAB5 AA90 ; [.2EA0.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NYO> +AAB6 AA90 ; [.2EA0.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NYO> +AAB9 AA90 ; [.2EA0.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NYO> +AABB AA90 ; [.2EA0.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NYO> +AABC AA90 ; [.2EA0.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NYO> +AA91 ; [.2EA1.0020.0002] # TAI VIET LETTER HIGH NYO +AAB5 AA91 ; [.2EA1.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NYO> +AAB6 AA91 ; [.2EA1.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NYO> +AAB9 AA91 ; [.2EA1.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NYO> +AABB AA91 ; [.2EA1.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NYO> +AABC AA91 ; [.2EA1.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NYO> +AA92 ; [.2EA2.0020.0002] # TAI VIET LETTER LOW DO +AAB5 AA92 ; [.2EA2.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW DO> +AAB6 AA92 ; [.2EA2.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW DO> +AAB9 AA92 ; [.2EA2.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW DO> +AABB AA92 ; [.2EA2.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW DO> +AABC AA92 ; [.2EA2.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW DO> +AA93 ; [.2EA3.0020.0002] # TAI VIET LETTER HIGH DO +AAB5 AA93 ; [.2EA3.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH DO> +AAB6 AA93 ; [.2EA3.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH DO> +AAB9 AA93 ; [.2EA3.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH DO> +AABB AA93 ; [.2EA3.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH DO> +AABC AA93 ; [.2EA3.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH DO> +AA94 ; [.2EA4.0020.0002] # TAI VIET LETTER LOW TO +AAB5 AA94 ; [.2EA4.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW TO> +AAB6 AA94 ; [.2EA4.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW TO> +AAB9 AA94 ; [.2EA4.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW TO> +AABB AA94 ; [.2EA4.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW TO> +AABC AA94 ; [.2EA4.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW TO> +AA95 ; [.2EA5.0020.0002] # TAI VIET LETTER HIGH TO +AAB5 AA95 ; [.2EA5.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH TO> +AAB6 AA95 ; [.2EA5.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH TO> +AAB9 AA95 ; [.2EA5.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH TO> +AABB AA95 ; [.2EA5.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH TO> +AABC AA95 ; [.2EA5.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH TO> +AA96 ; [.2EA6.0020.0002] # TAI VIET LETTER LOW THO +AAB5 AA96 ; [.2EA6.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW THO> +AAB6 AA96 ; [.2EA6.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW THO> +AAB9 AA96 ; [.2EA6.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW THO> +AABB AA96 ; [.2EA6.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW THO> +AABC AA96 ; [.2EA6.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW THO> +AA97 ; [.2EA7.0020.0002] # TAI VIET LETTER HIGH THO +AAB5 AA97 ; [.2EA7.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH THO> +AAB6 AA97 ; [.2EA7.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH THO> +AAB9 AA97 ; [.2EA7.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH THO> +AABB AA97 ; [.2EA7.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH THO> +AABC AA97 ; [.2EA7.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH THO> +AA98 ; [.2EA8.0020.0002] # TAI VIET LETTER LOW NO +AAB5 AA98 ; [.2EA8.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW NO> +AAB6 AA98 ; [.2EA8.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW NO> +AAB9 AA98 ; [.2EA8.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW NO> +AABB AA98 ; [.2EA8.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW NO> +AABC AA98 ; [.2EA8.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW NO> +AA99 ; [.2EA9.0020.0002] # TAI VIET LETTER HIGH NO +AAB5 AA99 ; [.2EA9.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH NO> +AAB6 AA99 ; [.2EA9.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH NO> +AAB9 AA99 ; [.2EA9.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH NO> +AABB AA99 ; [.2EA9.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH NO> +AABC AA99 ; [.2EA9.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH NO> +AA9A ; [.2EAA.0020.0002] # TAI VIET LETTER LOW BO +AAB5 AA9A ; [.2EAA.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW BO> +AAB6 AA9A ; [.2EAA.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW BO> +AAB9 AA9A ; [.2EAA.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW BO> +AABB AA9A ; [.2EAA.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW BO> +AABC AA9A ; [.2EAA.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW BO> +AA9B ; [.2EAB.0020.0002] # TAI VIET LETTER HIGH BO +AAB5 AA9B ; [.2EAB.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH BO> +AAB6 AA9B ; [.2EAB.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH BO> +AAB9 AA9B ; [.2EAB.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH BO> +AABB AA9B ; [.2EAB.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH BO> +AABC AA9B ; [.2EAB.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH BO> +AA9C ; [.2EAC.0020.0002] # TAI VIET LETTER LOW PO +AAB5 AA9C ; [.2EAC.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PO> +AAB6 AA9C ; [.2EAC.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PO> +AAB9 AA9C ; [.2EAC.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PO> +AABB AA9C ; [.2EAC.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PO> +AABC AA9C ; [.2EAC.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PO> +AA9D ; [.2EAD.0020.0002] # TAI VIET LETTER HIGH PO +AAB5 AA9D ; [.2EAD.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PO> +AAB6 AA9D ; [.2EAD.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PO> +AAB9 AA9D ; [.2EAD.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PO> +AABB AA9D ; [.2EAD.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PO> +AABC AA9D ; [.2EAD.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PO> +AA9E ; [.2EAE.0020.0002] # TAI VIET LETTER LOW PHO +AAB5 AA9E ; [.2EAE.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW PHO> +AAB6 AA9E ; [.2EAE.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW PHO> +AAB9 AA9E ; [.2EAE.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW PHO> +AABB AA9E ; [.2EAE.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW PHO> +AABC AA9E ; [.2EAE.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW PHO> +AA9F ; [.2EAF.0020.0002] # TAI VIET LETTER HIGH PHO +AAB5 AA9F ; [.2EAF.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH PHO> +AAB6 AA9F ; [.2EAF.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH PHO> +AAB9 AA9F ; [.2EAF.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH PHO> +AABB AA9F ; [.2EAF.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH PHO> +AABC AA9F ; [.2EAF.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH PHO> +AAA0 ; [.2EB0.0020.0002] # TAI VIET LETTER LOW FO +AAB5 AAA0 ; [.2EB0.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW FO> +AAB6 AAA0 ; [.2EB0.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW FO> +AAB9 AAA0 ; [.2EB0.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW FO> +AABB AAA0 ; [.2EB0.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW FO> +AABC AAA0 ; [.2EB0.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW FO> +AAA1 ; [.2EB1.0020.0002] # TAI VIET LETTER HIGH FO +AAB5 AAA1 ; [.2EB1.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH FO> +AAB6 AAA1 ; [.2EB1.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH FO> +AAB9 AAA1 ; [.2EB1.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH FO> +AABB AAA1 ; [.2EB1.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH FO> +AABC AAA1 ; [.2EB1.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH FO> +AAA2 ; [.2EB2.0020.0002] # TAI VIET LETTER LOW MO +AAB5 AAA2 ; [.2EB2.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW MO> +AAB6 AAA2 ; [.2EB2.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW MO> +AAB9 AAA2 ; [.2EB2.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW MO> +AABB AAA2 ; [.2EB2.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW MO> +AABC AAA2 ; [.2EB2.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW MO> +AAA3 ; [.2EB3.0020.0002] # TAI VIET LETTER HIGH MO +AAB5 AAA3 ; [.2EB3.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH MO> +AAB6 AAA3 ; [.2EB3.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH MO> +AAB9 AAA3 ; [.2EB3.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH MO> +AABB AAA3 ; [.2EB3.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH MO> +AABC AAA3 ; [.2EB3.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH MO> +AAA4 ; [.2EB4.0020.0002] # TAI VIET LETTER LOW YO +AAB5 AAA4 ; [.2EB4.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW YO> +AAB6 AAA4 ; [.2EB4.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW YO> +AAB9 AAA4 ; [.2EB4.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW YO> +AABB AAA4 ; [.2EB4.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW YO> +AABC AAA4 ; [.2EB4.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW YO> +AAA5 ; [.2EB5.0020.0002] # TAI VIET LETTER HIGH YO +AAB5 AAA5 ; [.2EB5.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH YO> +AAB6 AAA5 ; [.2EB5.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH YO> +AAB9 AAA5 ; [.2EB5.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH YO> +AABB AAA5 ; [.2EB5.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH YO> +AABC AAA5 ; [.2EB5.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH YO> +AAA6 ; [.2EB6.0020.0002] # TAI VIET LETTER LOW RO +AAB5 AAA6 ; [.2EB6.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW RO> +AAB6 AAA6 ; [.2EB6.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW RO> +AAB9 AAA6 ; [.2EB6.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW RO> +AABB AAA6 ; [.2EB6.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW RO> +AABC AAA6 ; [.2EB6.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW RO> +AAA7 ; [.2EB7.0020.0002] # TAI VIET LETTER HIGH RO +AAB5 AAA7 ; [.2EB7.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH RO> +AAB6 AAA7 ; [.2EB7.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH RO> +AAB9 AAA7 ; [.2EB7.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH RO> +AABB AAA7 ; [.2EB7.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH RO> +AABC AAA7 ; [.2EB7.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH RO> +AAA8 ; [.2EB8.0020.0002] # TAI VIET LETTER LOW LO +AAB5 AAA8 ; [.2EB8.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW LO> +AAB6 AAA8 ; [.2EB8.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW LO> +AAB9 AAA8 ; [.2EB8.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW LO> +AABB AAA8 ; [.2EB8.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW LO> +AABC AAA8 ; [.2EB8.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW LO> +AAA9 ; [.2EB9.0020.0002] # TAI VIET LETTER HIGH LO +AAB5 AAA9 ; [.2EB9.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH LO> +AAB6 AAA9 ; [.2EB9.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH LO> +AAB9 AAA9 ; [.2EB9.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH LO> +AABB AAA9 ; [.2EB9.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH LO> +AABC AAA9 ; [.2EB9.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH LO> +AAAA ; [.2EBA.0020.0002] # TAI VIET LETTER LOW VO +AAB5 AAAA ; [.2EBA.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW VO> +AAB6 AAAA ; [.2EBA.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW VO> +AAB9 AAAA ; [.2EBA.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW VO> +AABB AAAA ; [.2EBA.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW VO> +AABC AAAA ; [.2EBA.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW VO> +AAAB ; [.2EBB.0020.0002] # TAI VIET LETTER HIGH VO +AAB5 AAAB ; [.2EBB.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH VO> +AAB6 AAAB ; [.2EBB.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH VO> +AAB9 AAAB ; [.2EBB.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH VO> +AABB AAAB ; [.2EBB.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH VO> +AABC AAAB ; [.2EBB.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH VO> +AAAC ; [.2EBC.0020.0002] # TAI VIET LETTER LOW HO +AAB5 AAAC ; [.2EBC.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW HO> +AAB6 AAAC ; [.2EBC.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW HO> +AAB9 AAAC ; [.2EBC.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW HO> +AABB AAAC ; [.2EBC.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW HO> +AABC AAAC ; [.2EBC.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW HO> +AAAD ; [.2EBD.0020.0002] # TAI VIET LETTER HIGH HO +AAB5 AAAD ; [.2EBD.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH HO> +AAB6 AAAD ; [.2EBD.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH HO> +AAB9 AAAD ; [.2EBD.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH HO> +AABB AAAD ; [.2EBD.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH HO> +AABC AAAD ; [.2EBD.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH HO> +AAAE ; [.2EBE.0020.0002] # TAI VIET LETTER LOW O +AAB5 AAAE ; [.2EBE.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER LOW O> +AAB6 AAAE ; [.2EBE.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER LOW O> +AAB9 AAAE ; [.2EBE.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER LOW O> +AABB AAAE ; [.2EBE.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER LOW O> +AABC AAAE ; [.2EBE.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER LOW O> +AAAF ; [.2EBF.0020.0002] # TAI VIET LETTER HIGH O +AAB5 AAAF ; [.2EBF.0020.0002][.2EC5.0020.0002] # <TAI VIET VOWEL E, TAI VIET LETTER HIGH O> +AAB6 AAAF ; [.2EBF.0020.0002][.2EC6.0020.0002] # <TAI VIET VOWEL O, TAI VIET LETTER HIGH O> +AAB9 AAAF ; [.2EBF.0020.0002][.2EC9.0020.0002] # <TAI VIET VOWEL UEA, TAI VIET LETTER HIGH O> +AABB AAAF ; [.2EBF.0020.0002][.2ECB.0020.0002] # <TAI VIET VOWEL AUE, TAI VIET LETTER HIGH O> +AABC AAAF ; [.2EBF.0020.0002][.2ECC.0020.0002] # <TAI VIET VOWEL AY, TAI VIET LETTER HIGH O> +AAB0 ; [.2EC0.0020.0002] # TAI VIET MAI KANG +AAB1 ; [.2EC1.0020.0002] # TAI VIET VOWEL AA +AAB2 ; [.2EC2.0020.0002] # TAI VIET VOWEL I +AAB3 ; [.2EC3.0020.0002] # TAI VIET VOWEL UE +AAB4 ; [.2EC4.0020.0002] # TAI VIET VOWEL U +AAB5 ; [.2EC5.0020.0002] # TAI VIET VOWEL E +AAB6 ; [.2EC6.0020.0002] # TAI VIET VOWEL O +AAB7 ; [.2EC7.0020.0002] # TAI VIET MAI KHIT +AAB8 ; [.2EC8.0020.0002] # TAI VIET VOWEL IA +AAB9 ; [.2EC9.0020.0002] # TAI VIET VOWEL UEA +AABA ; [.2ECA.0020.0002] # TAI VIET VOWEL UA +AABB ; [.2ECB.0020.0002] # TAI VIET VOWEL AUE +AABC ; [.2ECC.0020.0002] # TAI VIET VOWEL AY +AABD ; [.2ECD.0020.0002] # TAI VIET VOWEL AN +AABE ; [.2ECE.0020.0002] # TAI VIET VOWEL AM +AAC0 ; [.2ECF.0020.0002] # TAI VIET TONE MAI NUENG +AAC2 ; [.2ED0.0020.0002] # TAI VIET TONE MAI SONG +AADB ; [.2ED1.0020.0002] # TAI VIET SYMBOL KON +AADC ; [.2ED2.0020.0002] # TAI VIET SYMBOL NUENG +0F40 ; [.2ED3.0020.0002] # TIBETAN LETTER KA +0F69 ; [.2ED3.0020.0002][.2F14.0020.0002] # TIBETAN LETTER KSSA +0F90 ; [.2ED4.0020.0002] # TIBETAN SUBJOINED LETTER KA +0FB9 ; [.2ED4.0020.0002][.2F14.0020.0002] # TIBETAN SUBJOINED LETTER KSSA +0F6B ; [.2ED5.0020.0002] # TIBETAN LETTER KKA +0F41 ; [.2ED6.0020.0002] # TIBETAN LETTER KHA +0F91 ; [.2ED7.0020.0002] # TIBETAN SUBJOINED LETTER KHA +0F42 ; [.2ED8.0020.0002] # TIBETAN LETTER GA +0F43 ; [.2ED8.0020.0002][.2F18.0020.0002] # TIBETAN LETTER GHA +0F92 ; [.2ED9.0020.0002] # TIBETAN SUBJOINED LETTER GA +0F93 ; [.2ED9.0020.0002][.2F18.0020.0002] # TIBETAN SUBJOINED LETTER GHA +0F44 ; [.2EDA.0020.0002] # TIBETAN LETTER NGA +0F94 ; [.2EDB.0020.0002] # TIBETAN SUBJOINED LETTER NGA +0F45 ; [.2EDC.0020.0002] # TIBETAN LETTER CA +0F95 ; [.2EDD.0020.0002] # TIBETAN SUBJOINED LETTER CA +0F46 ; [.2EDE.0020.0002] # TIBETAN LETTER CHA +0F96 ; [.2EDF.0020.0002] # TIBETAN SUBJOINED LETTER CHA +0F47 ; [.2EE0.0020.0002] # TIBETAN LETTER JA +0F97 ; [.2EE1.0020.0002] # TIBETAN SUBJOINED LETTER JA +0F49 ; [.2EE2.0020.0002] # TIBETAN LETTER NYA +0F99 ; [.2EE3.0020.0002] # TIBETAN SUBJOINED LETTER NYA +0F4A ; [.2EE4.0020.0002] # TIBETAN LETTER TTA +0F9A ; [.2EE5.0020.0002] # TIBETAN SUBJOINED LETTER TTA +0F4B ; [.2EE6.0020.0002] # TIBETAN LETTER TTHA +0F9B ; [.2EE7.0020.0002] # TIBETAN SUBJOINED LETTER TTHA +0F4C ; [.2EE8.0020.0002] # TIBETAN LETTER DDA +0F4D ; [.2EE8.0020.0002][.2F18.0020.0002] # TIBETAN LETTER DDHA +0F9C ; [.2EE9.0020.0002] # TIBETAN SUBJOINED LETTER DDA +0F9D ; [.2EE9.0020.0002][.2F18.0020.0002] # TIBETAN SUBJOINED LETTER DDHA +0F4E ; [.2EEA.0020.0002] # TIBETAN LETTER NNA +0F9E ; [.2EEB.0020.0002] # TIBETAN SUBJOINED LETTER NNA +0F4F ; [.2EEC.0020.0002] # TIBETAN LETTER TA +0F9F ; [.2EED.0020.0002] # TIBETAN SUBJOINED LETTER TA +0F50 ; [.2EEE.0020.0002] # TIBETAN LETTER THA +0FA0 ; [.2EEF.0020.0002] # TIBETAN SUBJOINED LETTER THA +0F51 ; [.2EF0.0020.0002] # TIBETAN LETTER DA +0F52 ; [.2EF0.0020.0002][.2F18.0020.0002] # TIBETAN LETTER DHA +0FA1 ; [.2EF1.0020.0002] # TIBETAN SUBJOINED LETTER DA +0FA2 ; [.2EF1.0020.0002][.2F18.0020.0002] # TIBETAN SUBJOINED LETTER DHA +0F53 ; [.2EF2.0020.0002] # TIBETAN LETTER NA +0FA3 ; [.2EF3.0020.0002] # TIBETAN SUBJOINED LETTER NA +0F54 ; [.2EF4.0020.0002] # TIBETAN LETTER PA +0FA4 ; [.2EF5.0020.0002] # TIBETAN SUBJOINED LETTER PA +0F55 ; [.2EF6.0020.0002] # TIBETAN LETTER PHA +0FA5 ; [.2EF7.0020.0002] # TIBETAN SUBJOINED LETTER PHA +0F56 ; [.2EF8.0020.0002] # TIBETAN LETTER BA +0F57 ; [.2EF8.0020.0002][.2F18.0020.0002] # TIBETAN LETTER BHA +0FA6 ; [.2EF9.0020.0002] # TIBETAN SUBJOINED LETTER BA +0FA7 ; [.2EF9.0020.0002][.2F18.0020.0002] # TIBETAN SUBJOINED LETTER BHA +0F58 ; [.2EFA.0020.0002] # TIBETAN LETTER MA +0FA8 ; [.2EFB.0020.0002] # TIBETAN SUBJOINED LETTER MA +0F59 ; [.2EFC.0020.0002] # TIBETAN LETTER TSA +0FA9 ; [.2EFD.0020.0002] # TIBETAN SUBJOINED LETTER TSA +0F5A ; [.2EFE.0020.0002] # TIBETAN LETTER TSHA +0FAA ; [.2EFF.0020.0002] # TIBETAN SUBJOINED LETTER TSHA +0F5B ; [.2F00.0020.0002] # TIBETAN LETTER DZA +0F5C ; [.2F00.0020.0002][.2F18.0020.0002] # TIBETAN LETTER DZHA +0FAB ; [.2F01.0020.0002] # TIBETAN SUBJOINED LETTER DZA +0FAC ; [.2F01.0020.0002][.2F18.0020.0002] # TIBETAN SUBJOINED LETTER DZHA +0F5D ; [.2F02.0020.0002] # TIBETAN LETTER WA +0FAD ; [.2F03.0020.0002] # TIBETAN SUBJOINED LETTER WA +0FBA ; [.2F03.0020.0004][.0000.0112.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM WA +0F5E ; [.2F04.0020.0002] # TIBETAN LETTER ZHA +0FAE ; [.2F05.0020.0002] # TIBETAN SUBJOINED LETTER ZHA +0F5F ; [.2F06.0020.0002] # TIBETAN LETTER ZA +0FAF ; [.2F07.0020.0002] # TIBETAN SUBJOINED LETTER ZA +0F60 ; [.2F08.0020.0002] # TIBETAN LETTER -A +0FB0 ; [.2F09.0020.0002] # TIBETAN SUBJOINED LETTER -A +0F61 ; [.2F0A.0020.0002] # TIBETAN LETTER YA +0FB1 ; [.2F0B.0020.0002] # TIBETAN SUBJOINED LETTER YA +0FBB ; [.2F0B.0020.0004][.0000.0112.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM YA +0F62 ; [.2F0C.0020.0002] # TIBETAN LETTER RA +0F6A ; [.2F0C.0020.0004][.0000.0112.0004] # TIBETAN LETTER FIXED-FORM RA +0FB2 ; [.2F0D.0020.0002] # TIBETAN SUBJOINED LETTER RA +0FBC ; [.2F0D.0020.0004][.0000.0112.0004] # TIBETAN SUBJOINED LETTER FIXED-FORM RA +0F6C ; [.2F0E.0020.0002] # TIBETAN LETTER RRA +0F63 ; [.2F0F.0020.0002] # TIBETAN LETTER LA +0FB3 ; [.2F10.0020.0002] # TIBETAN SUBJOINED LETTER LA +0F64 ; [.2F11.0020.0002] # TIBETAN LETTER SHA +0FB4 ; [.2F12.0020.0002] # TIBETAN SUBJOINED LETTER SHA +0F65 ; [.2F13.0020.0002] # TIBETAN LETTER SSA +0FB5 ; [.2F14.0020.0002] # TIBETAN SUBJOINED LETTER SSA +0F66 ; [.2F15.0020.0002] # TIBETAN LETTER SA +0FB6 ; [.2F16.0020.0002] # TIBETAN SUBJOINED LETTER SA +0F67 ; [.2F17.0020.0002] # TIBETAN LETTER HA +0FB7 ; [.2F18.0020.0002] # TIBETAN SUBJOINED LETTER HA +0F68 ; [.2F19.0020.0002] # TIBETAN LETTER A +0F00 ; [.2F19.0020.0004][.2F30.0020.0004][.0000.00C4.0004] # TIBETAN SYLLABLE OM +0FB8 ; [.2F1A.0020.0002] # TIBETAN SUBJOINED LETTER A +0F88 ; [.2F1B.0020.0002] # TIBETAN SIGN LCE TSA CAN +0F8D ; [.2F1C.0020.0002] # TIBETAN SUBJOINED SIGN LCE TSA CAN +0F89 ; [.2F1D.0020.0002] # TIBETAN SIGN MCHU CAN +0F8E ; [.2F1E.0020.0002] # TIBETAN SUBJOINED SIGN MCHU CAN +0F8C ; [.2F1F.0020.0002] # TIBETAN SIGN INVERTED MCHU CAN +0F8F ; [.2F20.0020.0002] # TIBETAN SUBJOINED SIGN INVERTED MCHU CAN +0F8A ; [.2F21.0020.0002] # TIBETAN SIGN GRU CAN RGYINGS +0F8B ; [.2F22.0020.0002] # TIBETAN SIGN GRU MED RGYINGS +0F71 ; [.2F23.0020.0002] # TIBETAN VOWEL SIGN AA +0F72 ; [.2F24.0020.0002] # TIBETAN VOWEL SIGN I +0F73 ; [.2F25.0020.0002] # TIBETAN VOWEL SIGN II +0F71 0F72 ; [.2F25.0020.0002] # TIBETAN VOWEL SIGN II +0F80 ; [.2F26.0020.0002] # TIBETAN VOWEL SIGN REVERSED I +0F81 ; [.2F27.0020.0002] # TIBETAN VOWEL SIGN REVERSED II +0F71 0F80 ; [.2F27.0020.0002] # TIBETAN VOWEL SIGN REVERSED II +0F74 ; [.2F28.0020.0002] # TIBETAN VOWEL SIGN U +0F75 ; [.2F29.0020.0002] # TIBETAN VOWEL SIGN UU +0F71 0F74 ; [.2F29.0020.0002] # TIBETAN VOWEL SIGN UU +0F76 ; [.2F2A.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R +0FB2 0F80 ; [.2F2A.0020.0002] # TIBETAN VOWEL SIGN VOCALIC R +0F77 ; [.2F2B.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0FB2 0F71 0F80 ; [.2F2B.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0FB2 0F81 ; [.2F2B.0020.0002] # TIBETAN VOWEL SIGN VOCALIC RR +0F78 ; [.2F2C.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L +0FB3 0F80 ; [.2F2C.0020.0002] # TIBETAN VOWEL SIGN VOCALIC L +0F79 ; [.2F2D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0FB3 0F71 0F80 ; [.2F2D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0FB3 0F81 ; [.2F2D.0020.0002] # TIBETAN VOWEL SIGN VOCALIC LL +0F7A ; [.2F2E.0020.0002] # TIBETAN VOWEL SIGN E +0F7B ; [.2F2F.0020.0002] # TIBETAN VOWEL SIGN EE +0F7C ; [.2F30.0020.0002] # TIBETAN VOWEL SIGN O +0F7D ; [.2F31.0020.0002] # TIBETAN VOWEL SIGN OO +0F84 ; [.2F32.0020.0002] # TIBETAN MARK HALANTA +11A0B ; [.2F33.0020.0002] # ZANABAZAR SQUARE LETTER KA +11A32 ; [.2F34.0020.0002] # ZANABAZAR SQUARE LETTER KSSA +11A0C ; [.2F35.0020.0002] # ZANABAZAR SQUARE LETTER KHA +11A0D ; [.2F36.0020.0002] # ZANABAZAR SQUARE LETTER GA +11A0E ; [.2F37.0020.0002] # ZANABAZAR SQUARE LETTER GHA +11A0F ; [.2F38.0020.0002] # ZANABAZAR SQUARE LETTER NGA +11A10 ; [.2F39.0020.0002] # ZANABAZAR SQUARE LETTER CA +11A11 ; [.2F3A.0020.0002] # ZANABAZAR SQUARE LETTER CHA +11A12 ; [.2F3B.0020.0002] # ZANABAZAR SQUARE LETTER JA +11A13 ; [.2F3C.0020.0002] # ZANABAZAR SQUARE LETTER NYA +11A14 ; [.2F3D.0020.0002] # ZANABAZAR SQUARE LETTER TTA +11A15 ; [.2F3E.0020.0002] # ZANABAZAR SQUARE LETTER TTHA +11A16 ; [.2F3F.0020.0002] # ZANABAZAR SQUARE LETTER DDA +11A17 ; [.2F40.0020.0002] # ZANABAZAR SQUARE LETTER DDHA +11A18 ; [.2F41.0020.0002] # ZANABAZAR SQUARE LETTER NNA +11A19 ; [.2F42.0020.0002] # ZANABAZAR SQUARE LETTER TA +11A1A ; [.2F43.0020.0002] # ZANABAZAR SQUARE LETTER THA +11A1B ; [.2F44.0020.0002] # ZANABAZAR SQUARE LETTER DA +11A1C ; [.2F45.0020.0002] # ZANABAZAR SQUARE LETTER DHA +11A1D ; [.2F46.0020.0002] # ZANABAZAR SQUARE LETTER NA +11A1E ; [.2F47.0020.0002] # ZANABAZAR SQUARE LETTER PA +11A1F ; [.2F48.0020.0002] # ZANABAZAR SQUARE LETTER PHA +11A20 ; [.2F49.0020.0002] # ZANABAZAR SQUARE LETTER BA +11A21 ; [.2F4A.0020.0002] # ZANABAZAR SQUARE LETTER BHA +11A22 ; [.2F4B.0020.0002] # ZANABAZAR SQUARE LETTER MA +11A23 ; [.2F4C.0020.0002] # ZANABAZAR SQUARE LETTER TSA +11A24 ; [.2F4D.0020.0002] # ZANABAZAR SQUARE LETTER TSHA +11A25 ; [.2F4E.0020.0002] # ZANABAZAR SQUARE LETTER DZA +11A26 ; [.2F4F.0020.0002] # ZANABAZAR SQUARE LETTER DZHA +11A27 ; [.2F50.0020.0002] # ZANABAZAR SQUARE LETTER ZHA +11A28 ; [.2F51.0020.0002] # ZANABAZAR SQUARE LETTER ZA +11A29 ; [.2F52.0020.0002] # ZANABAZAR SQUARE LETTER -A +11A2A ; [.2F53.0020.0002] # ZANABAZAR SQUARE LETTER YA +11A3B ; [.2F53.0020.0019] # ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA +11A2B ; [.2F54.0020.0002] # ZANABAZAR SQUARE LETTER RA +11A3A ; [.2F54.0020.0017] # ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3C ; [.2F54.0020.0019] # ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA +11A2C ; [.2F55.0020.0002] # ZANABAZAR SQUARE LETTER LA +11A3D ; [.2F55.0020.0019] # ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA +11A2D ; [.2F56.0020.0002] # ZANABAZAR SQUARE LETTER VA +11A3E ; [.2F56.0020.0019] # ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A2E ; [.2F57.0020.0002] # ZANABAZAR SQUARE LETTER SHA +11A2F ; [.2F58.0020.0002] # ZANABAZAR SQUARE LETTER SSA +11A30 ; [.2F59.0020.0002] # ZANABAZAR SQUARE LETTER SA +11A31 ; [.2F5A.0020.0002] # ZANABAZAR SQUARE LETTER HA +11A00 ; [.2F5B.0020.0002] # ZANABAZAR SQUARE LETTER A +11A01 ; [.2F5C.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN I +11A02 ; [.2F5D.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN UE +11A03 ; [.2F5E.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN U +11A04 ; [.2F5F.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN E +11A05 ; [.2F60.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN OE +11A06 ; [.2F61.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN O +11A07 ; [.2F62.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN AI +11A08 ; [.2F63.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN AU +11A09 ; [.2F64.0020.0002] # ZANABAZAR SQUARE VOWEL SIGN REVERSED I +11A0A ; [.2F65.0020.0002] # ZANABAZAR SQUARE VOWEL LENGTH MARK +11A34 ; [.2F66.0020.0002] # ZANABAZAR SQUARE SIGN VIRAMA +11A47 ; [.2F67.0020.0002] # ZANABAZAR SQUARE SUBJOINER +11A50 ; [.2F68.0020.0002] # SOYOMBO LETTER A +11A51 ; [.2F69.0020.0002] # SOYOMBO VOWEL SIGN I +11A52 ; [.2F6A.0020.0002] # SOYOMBO VOWEL SIGN UE +11A53 ; [.2F6B.0020.0002] # SOYOMBO VOWEL SIGN U +11A59 ; [.2F6C.0020.0002] # SOYOMBO VOWEL SIGN VOCALIC R +11A5A ; [.2F6D.0020.0002] # SOYOMBO VOWEL SIGN VOCALIC L +11A54 ; [.2F6E.0020.0002] # SOYOMBO VOWEL SIGN E +11A56 ; [.2F6F.0020.0002] # SOYOMBO VOWEL SIGN OE +11A55 ; [.2F70.0020.0002] # SOYOMBO VOWEL SIGN O +11A57 ; [.2F71.0020.0002] # SOYOMBO VOWEL SIGN AI +11A58 ; [.2F72.0020.0002] # SOYOMBO VOWEL SIGN AU +11A5B ; [.2F73.0020.0002] # SOYOMBO VOWEL LENGTH MARK +11A5C ; [.2F74.0020.0002] # SOYOMBO LETTER KA +11A8A ; [.2F74.0020.0019] # SOYOMBO FINAL CONSONANT SIGN G +11A83 ; [.2F75.0020.0002] # SOYOMBO LETTER KSSA +11A5D ; [.2F76.0020.0002] # SOYOMBO LETTER KHA +11A8B ; [.2F76.0020.0019] # SOYOMBO FINAL CONSONANT SIGN K +11A5E ; [.2F77.0020.0002] # SOYOMBO LETTER GA +11A5F ; [.2F78.0020.0002] # SOYOMBO LETTER GHA +11A60 ; [.2F79.0020.0002] # SOYOMBO LETTER NGA +11A8C ; [.2F79.0020.0019] # SOYOMBO FINAL CONSONANT SIGN NG +11A61 ; [.2F7A.0020.0002] # SOYOMBO LETTER CA +11A62 ; [.2F7B.0020.0002] # SOYOMBO LETTER CHA +11A63 ; [.2F7C.0020.0002] # SOYOMBO LETTER JA +11A64 ; [.2F7D.0020.0002] # SOYOMBO LETTER JHA +11A65 ; [.2F7E.0020.0002] # SOYOMBO LETTER NYA +11A66 ; [.2F7F.0020.0002] # SOYOMBO LETTER TTA +11A67 ; [.2F80.0020.0002] # SOYOMBO LETTER TTHA +11A68 ; [.2F81.0020.0002] # SOYOMBO LETTER DDA +11A69 ; [.2F82.0020.0002] # SOYOMBO LETTER DDHA +11A6A ; [.2F83.0020.0002] # SOYOMBO LETTER NNA +11A6B ; [.2F84.0020.0002] # SOYOMBO LETTER TA +11A8D ; [.2F84.0020.0019] # SOYOMBO FINAL CONSONANT SIGN D +11A6C ; [.2F85.0020.0002] # SOYOMBO LETTER THA +11A6D ; [.2F86.0020.0002] # SOYOMBO LETTER DA +11A6E ; [.2F87.0020.0002] # SOYOMBO LETTER DHA +11A6F ; [.2F88.0020.0002] # SOYOMBO LETTER NA +11A8E ; [.2F88.0020.0019] # SOYOMBO FINAL CONSONANT SIGN N +11A70 ; [.2F89.0020.0002] # SOYOMBO LETTER PA +11A8F ; [.2F89.0020.0019] # SOYOMBO FINAL CONSONANT SIGN B +11A71 ; [.2F8A.0020.0002] # SOYOMBO LETTER PHA +11A72 ; [.2F8B.0020.0002] # SOYOMBO LETTER BA +11A73 ; [.2F8C.0020.0002] # SOYOMBO LETTER BHA +11A74 ; [.2F8D.0020.0002] # SOYOMBO LETTER MA +11A90 ; [.2F8D.0020.0019] # SOYOMBO FINAL CONSONANT SIGN M +11A75 ; [.2F8E.0020.0002] # SOYOMBO LETTER TSA +11A76 ; [.2F8F.0020.0002] # SOYOMBO LETTER TSHA +11A77 ; [.2F90.0020.0002] # SOYOMBO LETTER DZA +11A78 ; [.2F91.0020.0002] # SOYOMBO LETTER ZHA +11A79 ; [.2F92.0020.0002] # SOYOMBO LETTER ZA +11A7A ; [.2F93.0020.0002] # SOYOMBO LETTER -A +11A95 ; [.2F93.0020.0019] # SOYOMBO FINAL CONSONANT SIGN -A +11A7B ; [.2F94.0020.0002] # SOYOMBO LETTER YA +11A7C ; [.2F95.0020.0002] # SOYOMBO LETTER RA +11A86 ; [.2F95.0020.0017] # SOYOMBO CLUSTER-INITIAL LETTER RA +11A91 ; [.2F95.0020.0019] # SOYOMBO FINAL CONSONANT SIGN R +11A7D ; [.2F96.0020.0002] # SOYOMBO LETTER LA +11A87 ; [.2F96.0020.0017] # SOYOMBO CLUSTER-INITIAL LETTER LA +11A92 ; [.2F96.0020.0019] # SOYOMBO FINAL CONSONANT SIGN L +11A7E ; [.2F97.0020.0002] # SOYOMBO LETTER VA +11A7F ; [.2F98.0020.0002] # SOYOMBO LETTER SHA +11A88 ; [.2F98.0020.0017] # SOYOMBO CLUSTER-INITIAL LETTER SHA +11A93 ; [.2F98.0020.0019] # SOYOMBO FINAL CONSONANT SIGN SH +11A80 ; [.2F99.0020.0002] # SOYOMBO LETTER SSA +11A81 ; [.2F9A.0020.0002] # SOYOMBO LETTER SA +11A89 ; [.2F9A.0020.0017] # SOYOMBO CLUSTER-INITIAL LETTER SA +11A94 ; [.2F9A.0020.0019] # SOYOMBO FINAL CONSONANT SIGN S +11A82 ; [.2F9B.0020.0002] # SOYOMBO LETTER HA +11A99 ; [.2F9C.0020.0002] # SOYOMBO SUBJOINER +11C72 ; [.2F9D.0020.0002] # MARCHEN LETTER KA +11C92 ; [.2F9E.0020.0002] # MARCHEN SUBJOINED LETTER KA +11C73 ; [.2F9F.0020.0002] # MARCHEN LETTER KHA +11C93 ; [.2FA0.0020.0002] # MARCHEN SUBJOINED LETTER KHA +11C74 ; [.2FA1.0020.0002] # MARCHEN LETTER GA +11C94 ; [.2FA2.0020.0002] # MARCHEN SUBJOINED LETTER GA +11C75 ; [.2FA3.0020.0002] # MARCHEN LETTER NGA +11C95 ; [.2FA4.0020.0002] # MARCHEN SUBJOINED LETTER NGA +11C76 ; [.2FA5.0020.0002] # MARCHEN LETTER CA +11C96 ; [.2FA6.0020.0002] # MARCHEN SUBJOINED LETTER CA +11C77 ; [.2FA7.0020.0002] # MARCHEN LETTER CHA +11C97 ; [.2FA8.0020.0002] # MARCHEN SUBJOINED LETTER CHA +11C78 ; [.2FA9.0020.0002] # MARCHEN LETTER JA +11C98 ; [.2FAA.0020.0002] # MARCHEN SUBJOINED LETTER JA +11C79 ; [.2FAB.0020.0002] # MARCHEN LETTER NYA +11C99 ; [.2FAC.0020.0002] # MARCHEN SUBJOINED LETTER NYA +11C7A ; [.2FAD.0020.0002] # MARCHEN LETTER TA +11C9A ; [.2FAE.0020.0002] # MARCHEN SUBJOINED LETTER TA +11C7B ; [.2FAF.0020.0002] # MARCHEN LETTER THA +11C9B ; [.2FB0.0020.0002] # MARCHEN SUBJOINED LETTER THA +11C7C ; [.2FB1.0020.0002] # MARCHEN LETTER DA +11C9C ; [.2FB2.0020.0002] # MARCHEN SUBJOINED LETTER DA +11C7D ; [.2FB3.0020.0002] # MARCHEN LETTER NA +11C9D ; [.2FB4.0020.0002] # MARCHEN SUBJOINED LETTER NA +11C7E ; [.2FB5.0020.0002] # MARCHEN LETTER PA +11C9E ; [.2FB6.0020.0002] # MARCHEN SUBJOINED LETTER PA +11C7F ; [.2FB7.0020.0002] # MARCHEN LETTER PHA +11C9F ; [.2FB8.0020.0002] # MARCHEN SUBJOINED LETTER PHA +11C80 ; [.2FB9.0020.0002] # MARCHEN LETTER BA +11CA0 ; [.2FBA.0020.0002] # MARCHEN SUBJOINED LETTER BA +11C81 ; [.2FBB.0020.0002] # MARCHEN LETTER MA +11CA1 ; [.2FBC.0020.0002] # MARCHEN SUBJOINED LETTER MA +11C82 ; [.2FBD.0020.0002] # MARCHEN LETTER TSA +11CA2 ; [.2FBE.0020.0002] # MARCHEN SUBJOINED LETTER TSA +11C83 ; [.2FBF.0020.0002] # MARCHEN LETTER TSHA +11CA3 ; [.2FC0.0020.0002] # MARCHEN SUBJOINED LETTER TSHA +11C84 ; [.2FC1.0020.0002] # MARCHEN LETTER DZA +11CA4 ; [.2FC2.0020.0002] # MARCHEN SUBJOINED LETTER DZA +11C85 ; [.2FC3.0020.0002] # MARCHEN LETTER WA +11CA5 ; [.2FC4.0020.0002] # MARCHEN SUBJOINED LETTER WA +11C86 ; [.2FC5.0020.0002] # MARCHEN LETTER ZHA +11CA6 ; [.2FC6.0020.0002] # MARCHEN SUBJOINED LETTER ZHA +11C87 ; [.2FC7.0020.0002] # MARCHEN LETTER ZA +11CA7 ; [.2FC8.0020.0002] # MARCHEN SUBJOINED LETTER ZA +11C88 ; [.2FC9.0020.0002] # MARCHEN LETTER -A +11C89 ; [.2FCA.0020.0002] # MARCHEN LETTER YA +11CA9 ; [.2FCB.0020.0002] # MARCHEN SUBJOINED LETTER YA +11C8A ; [.2FCC.0020.0002] # MARCHEN LETTER RA +11CAA ; [.2FCD.0020.0002] # MARCHEN SUBJOINED LETTER RA +11C8B ; [.2FCE.0020.0002] # MARCHEN LETTER LA +11CAB ; [.2FCF.0020.0002] # MARCHEN SUBJOINED LETTER LA +11C8C ; [.2FD0.0020.0002] # MARCHEN LETTER SHA +11CAC ; [.2FD1.0020.0002] # MARCHEN SUBJOINED LETTER SHA +11C8D ; [.2FD2.0020.0002] # MARCHEN LETTER SA +11CAD ; [.2FD3.0020.0002] # MARCHEN SUBJOINED LETTER SA +11C8E ; [.2FD4.0020.0002] # MARCHEN LETTER HA +11CAE ; [.2FD5.0020.0002] # MARCHEN SUBJOINED LETTER HA +11C8F ; [.2FD6.0020.0002] # MARCHEN LETTER A +11CAF ; [.2FD7.0020.0002] # MARCHEN SUBJOINED LETTER A +11CB0 ; [.2FD8.0020.0002] # MARCHEN VOWEL SIGN AA +11CB1 ; [.2FD9.0020.0002] # MARCHEN VOWEL SIGN I +11CB2 ; [.2FDA.0020.0002] # MARCHEN VOWEL SIGN U +11CB3 ; [.2FDB.0020.0002] # MARCHEN VOWEL SIGN E +11CB4 ; [.2FDC.0020.0002] # MARCHEN VOWEL SIGN O +1C00 ; [.2FDD.0020.0002] # LEPCHA LETTER KA +1C01 ; [.2FDE.0020.0002] # LEPCHA LETTER KLA +1C02 ; [.2FDF.0020.0002] # LEPCHA LETTER KHA +1C03 ; [.2FE0.0020.0002] # LEPCHA LETTER GA +1C04 ; [.2FE1.0020.0002] # LEPCHA LETTER GLA +1C05 ; [.2FE2.0020.0002] # LEPCHA LETTER NGA +1C06 ; [.2FE3.0020.0002] # LEPCHA LETTER CA +1C07 ; [.2FE4.0020.0002] # LEPCHA LETTER CHA +1C08 ; [.2FE5.0020.0002] # LEPCHA LETTER JA +1C09 ; [.2FE6.0020.0002] # LEPCHA LETTER NYA +1C4D ; [.2FE7.0020.0002] # LEPCHA LETTER TTA +1C4E ; [.2FE8.0020.0002] # LEPCHA LETTER TTHA +1C4F ; [.2FE9.0020.0002] # LEPCHA LETTER DDA +1C0A ; [.2FEA.0020.0002] # LEPCHA LETTER TA +1C0B ; [.2FEB.0020.0002] # LEPCHA LETTER THA +1C0C ; [.2FEC.0020.0002] # LEPCHA LETTER DA +1C0D ; [.2FED.0020.0002] # LEPCHA LETTER NA +1C0E ; [.2FEE.0020.0002] # LEPCHA LETTER PA +1C0F ; [.2FEF.0020.0002] # LEPCHA LETTER PLA +1C10 ; [.2FF0.0020.0002] # LEPCHA LETTER PHA +1C11 ; [.2FF1.0020.0002] # LEPCHA LETTER FA +1C12 ; [.2FF2.0020.0002] # LEPCHA LETTER FLA +1C13 ; [.2FF3.0020.0002] # LEPCHA LETTER BA +1C14 ; [.2FF4.0020.0002] # LEPCHA LETTER BLA +1C15 ; [.2FF5.0020.0002] # LEPCHA LETTER MA +1C16 ; [.2FF6.0020.0002] # LEPCHA LETTER MLA +1C17 ; [.2FF7.0020.0002] # LEPCHA LETTER TSA +1C18 ; [.2FF8.0020.0002] # LEPCHA LETTER TSHA +1C19 ; [.2FF9.0020.0002] # LEPCHA LETTER DZA +1C1A ; [.2FFA.0020.0002] # LEPCHA LETTER YA +1C24 ; [.2FFB.0020.0002] # LEPCHA SUBJOINED LETTER YA +1C1B ; [.2FFC.0020.0002] # LEPCHA LETTER RA +1C25 ; [.2FFD.0020.0002] # LEPCHA SUBJOINED LETTER RA +1C1C ; [.2FFE.0020.0002] # LEPCHA LETTER LA +1C1D ; [.2FFF.0020.0002] # LEPCHA LETTER HA +1C1E ; [.3000.0020.0002] # LEPCHA LETTER HLA +1C1F ; [.3001.0020.0002] # LEPCHA LETTER VA +1C20 ; [.3002.0020.0002] # LEPCHA LETTER SA +1C21 ; [.3003.0020.0002] # LEPCHA LETTER SHA +1C22 ; [.3004.0020.0002] # LEPCHA LETTER WA +1C23 ; [.3005.0020.0002] # LEPCHA LETTER A +1C36 ; [.3006.0020.0002] # LEPCHA SIGN RAN +1C26 ; [.3007.0020.0002] # LEPCHA VOWEL SIGN AA +1C27 ; [.3008.0020.0002] # LEPCHA VOWEL SIGN I +1C28 ; [.3009.0020.0002] # LEPCHA VOWEL SIGN O +1C29 ; [.300A.0020.0002] # LEPCHA VOWEL SIGN OO +1C2A ; [.300B.0020.0002] # LEPCHA VOWEL SIGN U +1C2B ; [.300C.0020.0002] # LEPCHA VOWEL SIGN UU +1C2C ; [.300D.0020.0002] # LEPCHA VOWEL SIGN E +1C2D ; [.300E.0020.0002] # LEPCHA CONSONANT SIGN K +1C2E ; [.300F.0020.0002] # LEPCHA CONSONANT SIGN M +1C2F ; [.3010.0020.0002] # LEPCHA CONSONANT SIGN L +1C30 ; [.3011.0020.0002] # LEPCHA CONSONANT SIGN N +1C31 ; [.3012.0020.0002] # LEPCHA CONSONANT SIGN P +1C32 ; [.3013.0020.0002] # LEPCHA CONSONANT SIGN R +1C33 ; [.3014.0020.0002] # LEPCHA CONSONANT SIGN T +1C34 ; [.3015.0020.0002] # LEPCHA CONSONANT SIGN NYIN-DO +1C35 ; [.3016.0020.0002] # LEPCHA CONSONANT SIGN KANG +A840 ; [.3017.0020.0002] # PHAGS-PA LETTER KA +A841 ; [.3018.0020.0002] # PHAGS-PA LETTER KHA +A842 ; [.3019.0020.0002] # PHAGS-PA LETTER GA +A843 ; [.301A.0020.0002] # PHAGS-PA LETTER NGA +A844 ; [.301B.0020.0002] # PHAGS-PA LETTER CA +A845 ; [.301C.0020.0002] # PHAGS-PA LETTER CHA +A846 ; [.301D.0020.0002] # PHAGS-PA LETTER JA +A847 ; [.301E.0020.0002] # PHAGS-PA LETTER NYA +A869 ; [.301F.0020.0002] # PHAGS-PA LETTER TTA +A86A ; [.3020.0020.0002] # PHAGS-PA LETTER TTHA +A86B ; [.3021.0020.0002] # PHAGS-PA LETTER DDA +A86C ; [.3022.0020.0002] # PHAGS-PA LETTER NNA +A848 ; [.3023.0020.0002] # PHAGS-PA LETTER TA +A849 ; [.3024.0020.0002] # PHAGS-PA LETTER THA +A84A ; [.3025.0020.0002] # PHAGS-PA LETTER DA +A84B ; [.3026.0020.0002] # PHAGS-PA LETTER NA +A84C ; [.3027.0020.0002] # PHAGS-PA LETTER PA +A84D ; [.3028.0020.0002] # PHAGS-PA LETTER PHA +A84E ; [.3029.0020.0002] # PHAGS-PA LETTER BA +A84F ; [.302A.0020.0002] # PHAGS-PA LETTER MA +A850 ; [.302B.0020.0002] # PHAGS-PA LETTER TSA +A851 ; [.302C.0020.0002] # PHAGS-PA LETTER TSHA +A852 ; [.302D.0020.0002] # PHAGS-PA LETTER DZA +A853 ; [.302E.0020.0002] # PHAGS-PA LETTER WA +A867 ; [.302F.0020.0002] # PHAGS-PA SUBJOINED LETTER WA +A854 ; [.3030.0020.0002] # PHAGS-PA LETTER ZHA +A855 ; [.3031.0020.0002] # PHAGS-PA LETTER ZA +A856 ; [.3032.0020.0002] # PHAGS-PA LETTER SMALL A +A857 ; [.3033.0020.0002] # PHAGS-PA LETTER YA +A868 ; [.3034.0020.0002] # PHAGS-PA SUBJOINED LETTER YA +A86D ; [.3035.0020.0002] # PHAGS-PA LETTER ALTERNATE YA +A858 ; [.3036.0020.0002] # PHAGS-PA LETTER RA +A871 ; [.3037.0020.0002] # PHAGS-PA SUBJOINED LETTER RA +A872 ; [.3038.0020.0002] # PHAGS-PA SUPERFIXED LETTER RA +A859 ; [.3039.0020.0002] # PHAGS-PA LETTER LA +A85A ; [.303A.0020.0002] # PHAGS-PA LETTER SHA +A86E ; [.303B.0020.0002] # PHAGS-PA LETTER VOICELESS SHA +A85B ; [.303C.0020.0002] # PHAGS-PA LETTER SA +A85C ; [.303D.0020.0002] # PHAGS-PA LETTER HA +A86F ; [.303E.0020.0002] # PHAGS-PA LETTER VOICED HA +A870 ; [.303F.0020.0002] # PHAGS-PA LETTER ASPIRATED FA +A85D ; [.3040.0020.0002] # PHAGS-PA LETTER A +A862 ; [.3041.0020.0002] # PHAGS-PA LETTER QA +A863 ; [.3042.0020.0002] # PHAGS-PA LETTER XA +A864 ; [.3043.0020.0002] # PHAGS-PA LETTER FA +A865 ; [.3044.0020.0002] # PHAGS-PA LETTER GGA +A85E ; [.3045.0020.0002] # PHAGS-PA LETTER I +A85F ; [.3046.0020.0002] # PHAGS-PA LETTER U +A860 ; [.3047.0020.0002] # PHAGS-PA LETTER E +A861 ; [.3048.0020.0002] # PHAGS-PA LETTER O +A866 ; [.3049.0020.0002] # PHAGS-PA LETTER EE +A873 ; [.304A.0020.0002] # PHAGS-PA LETTER CANDRABINDU +1900 ; [.304B.0020.0002] # LIMBU VOWEL-CARRIER LETTER +1901 ; [.304C.0020.0002] # LIMBU LETTER KA +1902 ; [.304D.0020.0002] # LIMBU LETTER KHA +1903 ; [.304E.0020.0002] # LIMBU LETTER GA +1904 ; [.304F.0020.0002] # LIMBU LETTER GHA +1905 ; [.3050.0020.0002] # LIMBU LETTER NGA +1906 ; [.3051.0020.0002] # LIMBU LETTER CA +1907 ; [.3052.0020.0002] # LIMBU LETTER CHA +1908 ; [.3053.0020.0002] # LIMBU LETTER JA +191D ; [.3053.0020.0004][.3071.0020.0004] # LIMBU LETTER GYAN +1909 ; [.3054.0020.0002] # LIMBU LETTER JHA +190A ; [.3055.0020.0002] # LIMBU LETTER YAN +190B ; [.3056.0020.0002] # LIMBU LETTER TA +191E ; [.3056.0020.0004][.3072.0020.0004] # LIMBU LETTER TRA +190C ; [.3057.0020.0002] # LIMBU LETTER THA +190D ; [.3058.0020.0002] # LIMBU LETTER DA +190E ; [.3059.0020.0002] # LIMBU LETTER DHA +190F ; [.305A.0020.0002] # LIMBU LETTER NA +1910 ; [.305B.0020.0002] # LIMBU LETTER PA +1911 ; [.305C.0020.0002] # LIMBU LETTER PHA +1912 ; [.305D.0020.0002] # LIMBU LETTER BA +1913 ; [.305E.0020.0002] # LIMBU LETTER BHA +1914 ; [.305F.0020.0002] # LIMBU LETTER MA +1915 ; [.3060.0020.0002] # LIMBU LETTER YA +1916 ; [.3061.0020.0002] # LIMBU LETTER RA +1917 ; [.3062.0020.0002] # LIMBU LETTER LA +1918 ; [.3063.0020.0002] # LIMBU LETTER WA +1919 ; [.3064.0020.0002] # LIMBU LETTER SHA +191A ; [.3065.0020.0002] # LIMBU LETTER SSA +191B ; [.3066.0020.0002] # LIMBU LETTER SA +191C ; [.3067.0020.0002] # LIMBU LETTER HA +1920 ; [.3068.0020.0002] # LIMBU VOWEL SIGN A +1921 ; [.3069.0020.0002] # LIMBU VOWEL SIGN I +1922 ; [.306A.0020.0002] # LIMBU VOWEL SIGN U +1923 ; [.306B.0020.0002] # LIMBU VOWEL SIGN EE +1924 ; [.306C.0020.0002] # LIMBU VOWEL SIGN AI +1925 ; [.306D.0020.0002] # LIMBU VOWEL SIGN OO +1926 ; [.306E.0020.0002] # LIMBU VOWEL SIGN AU +1927 ; [.306F.0020.0002] # LIMBU VOWEL SIGN E +1928 ; [.3070.0020.0002] # LIMBU VOWEL SIGN O +1929 ; [.3071.0020.0002] # LIMBU SUBJOINED LETTER YA +192A ; [.3072.0020.0002] # LIMBU SUBJOINED LETTER RA +192B ; [.3073.0020.0002] # LIMBU SUBJOINED LETTER WA +1930 ; [.3074.0020.0002] # LIMBU SMALL LETTER KA +1931 ; [.3075.0020.0002] # LIMBU SMALL LETTER NGA +1932 ; [.3076.0020.0002] # LIMBU SMALL LETTER ANUSVARA +1933 ; [.3077.0020.0002] # LIMBU SMALL LETTER TA +1934 ; [.3078.0020.0002] # LIMBU SMALL LETTER NA +1935 ; [.3079.0020.0002] # LIMBU SMALL LETTER PA +1936 ; [.307A.0020.0002] # LIMBU SMALL LETTER MA +1937 ; [.307B.0020.0002] # LIMBU SMALL LETTER RA +1938 ; [.307C.0020.0002] # LIMBU SMALL LETTER LA +1700 ; [.307D.0020.0002] # TAGALOG LETTER A +1701 ; [.307E.0020.0002] # TAGALOG LETTER I +1702 ; [.307F.0020.0002] # TAGALOG LETTER U +1703 ; [.3080.0020.0002] # TAGALOG LETTER KA +1704 ; [.3081.0020.0002] # TAGALOG LETTER GA +1705 ; [.3082.0020.0002] # TAGALOG LETTER NGA +1706 ; [.3083.0020.0002] # TAGALOG LETTER TA +1707 ; [.3084.0020.0002] # TAGALOG LETTER DA +1708 ; [.3085.0020.0002] # TAGALOG LETTER NA +1709 ; [.3086.0020.0002] # TAGALOG LETTER PA +170A ; [.3087.0020.0002] # TAGALOG LETTER BA +170B ; [.3088.0020.0002] # TAGALOG LETTER MA +170C ; [.3089.0020.0002] # TAGALOG LETTER YA +170E ; [.308A.0020.0002] # TAGALOG LETTER LA +170F ; [.308B.0020.0002] # TAGALOG LETTER WA +1710 ; [.308C.0020.0002] # TAGALOG LETTER SA +1711 ; [.308D.0020.0002] # TAGALOG LETTER HA +1712 ; [.308E.0020.0002] # TAGALOG VOWEL SIGN I +1713 ; [.308F.0020.0002] # TAGALOG VOWEL SIGN U +1714 ; [.3090.0020.0002] # TAGALOG SIGN VIRAMA +1720 ; [.3091.0020.0002] # HANUNOO LETTER A +1721 ; [.3092.0020.0002] # HANUNOO LETTER I +1722 ; [.3093.0020.0002] # HANUNOO LETTER U +1723 ; [.3094.0020.0002] # HANUNOO LETTER KA +1724 ; [.3095.0020.0002] # HANUNOO LETTER GA +1725 ; [.3096.0020.0002] # HANUNOO LETTER NGA +1726 ; [.3097.0020.0002] # HANUNOO LETTER TA +1727 ; [.3098.0020.0002] # HANUNOO LETTER DA +1728 ; [.3099.0020.0002] # HANUNOO LETTER NA +1729 ; [.309A.0020.0002] # HANUNOO LETTER PA +172A ; [.309B.0020.0002] # HANUNOO LETTER BA +172B ; [.309C.0020.0002] # HANUNOO LETTER MA +172C ; [.309D.0020.0002] # HANUNOO LETTER YA +172D ; [.309E.0020.0002] # HANUNOO LETTER RA +172E ; [.309F.0020.0002] # HANUNOO LETTER LA +172F ; [.30A0.0020.0002] # HANUNOO LETTER WA +1730 ; [.30A1.0020.0002] # HANUNOO LETTER SA +1731 ; [.30A2.0020.0002] # HANUNOO LETTER HA +1732 ; [.30A3.0020.0002] # HANUNOO VOWEL SIGN I +1733 ; [.30A4.0020.0002] # HANUNOO VOWEL SIGN U +1734 ; [.30A5.0020.0002] # HANUNOO SIGN PAMUDPOD +1740 ; [.30A6.0020.0002] # BUHID LETTER A +1741 ; [.30A7.0020.0002] # BUHID LETTER I +1742 ; [.30A8.0020.0002] # BUHID LETTER U +1743 ; [.30A9.0020.0002] # BUHID LETTER KA +1744 ; [.30AA.0020.0002] # BUHID LETTER GA +1745 ; [.30AB.0020.0002] # BUHID LETTER NGA +1746 ; [.30AC.0020.0002] # BUHID LETTER TA +1747 ; [.30AD.0020.0002] # BUHID LETTER DA +1748 ; [.30AE.0020.0002] # BUHID LETTER NA +1749 ; [.30AF.0020.0002] # BUHID LETTER PA +174A ; [.30B0.0020.0002] # BUHID LETTER BA +174B ; [.30B1.0020.0002] # BUHID LETTER MA +174C ; [.30B2.0020.0002] # BUHID LETTER YA +174D ; [.30B3.0020.0002] # BUHID LETTER RA +174E ; [.30B4.0020.0002] # BUHID LETTER LA +174F ; [.30B5.0020.0002] # BUHID LETTER WA +1750 ; [.30B6.0020.0002] # BUHID LETTER SA +1751 ; [.30B7.0020.0002] # BUHID LETTER HA +1752 ; [.30B8.0020.0002] # BUHID VOWEL SIGN I +1753 ; [.30B9.0020.0002] # BUHID VOWEL SIGN U +1760 ; [.30BA.0020.0002] # TAGBANWA LETTER A +1761 ; [.30BB.0020.0002] # TAGBANWA LETTER I +1762 ; [.30BC.0020.0002] # TAGBANWA LETTER U +1763 ; [.30BD.0020.0002] # TAGBANWA LETTER KA +1764 ; [.30BE.0020.0002] # TAGBANWA LETTER GA +1765 ; [.30BF.0020.0002] # TAGBANWA LETTER NGA +1766 ; [.30C0.0020.0002] # TAGBANWA LETTER TA +1767 ; [.30C1.0020.0002] # TAGBANWA LETTER DA +1768 ; [.30C2.0020.0002] # TAGBANWA LETTER NA +1769 ; [.30C3.0020.0002] # TAGBANWA LETTER PA +176A ; [.30C4.0020.0002] # TAGBANWA LETTER BA +176B ; [.30C5.0020.0002] # TAGBANWA LETTER MA +176C ; [.30C6.0020.0002] # TAGBANWA LETTER YA +176E ; [.30C7.0020.0002] # TAGBANWA LETTER LA +176F ; [.30C8.0020.0002] # TAGBANWA LETTER WA +1770 ; [.30C9.0020.0002] # TAGBANWA LETTER SA +1772 ; [.30CA.0020.0002] # TAGBANWA VOWEL SIGN I +1773 ; [.30CB.0020.0002] # TAGBANWA VOWEL SIGN U +1A00 ; [.30CC.0020.0002] # BUGINESE LETTER KA +1A01 ; [.30CD.0020.0002] # BUGINESE LETTER GA +1A02 ; [.30CE.0020.0002] # BUGINESE LETTER NGA +1A03 ; [.30CF.0020.0002] # BUGINESE LETTER NGKA +1A04 ; [.30D0.0020.0002] # BUGINESE LETTER PA +1A05 ; [.30D1.0020.0002] # BUGINESE LETTER BA +1A06 ; [.30D2.0020.0002] # BUGINESE LETTER MA +1A07 ; [.30D3.0020.0002] # BUGINESE LETTER MPA +1A08 ; [.30D4.0020.0002] # BUGINESE LETTER TA +1A09 ; [.30D5.0020.0002] # BUGINESE LETTER DA +1A0A ; [.30D6.0020.0002] # BUGINESE LETTER NA +1A0B ; [.30D7.0020.0002] # BUGINESE LETTER NRA +1A0C ; [.30D8.0020.0002] # BUGINESE LETTER CA +1A0D ; [.30D9.0020.0002] # BUGINESE LETTER JA +1A0E ; [.30DA.0020.0002] # BUGINESE LETTER NYA +1A0F ; [.30DB.0020.0002] # BUGINESE LETTER NYCA +1A10 ; [.30DC.0020.0002] # BUGINESE LETTER YA +1A11 ; [.30DD.0020.0002] # BUGINESE LETTER RA +1A12 ; [.30DE.0020.0002] # BUGINESE LETTER LA +1A13 ; [.30DF.0020.0002] # BUGINESE LETTER VA +1A14 ; [.30E0.0020.0002] # BUGINESE LETTER SA +1A15 ; [.30E1.0020.0002] # BUGINESE LETTER A +1A16 ; [.30E2.0020.0002] # BUGINESE LETTER HA +1A17 ; [.30E3.0020.0002] # BUGINESE VOWEL SIGN I +1A18 ; [.30E4.0020.0002] # BUGINESE VOWEL SIGN U +1A19 ; [.30E5.0020.0002] # BUGINESE VOWEL SIGN E +1A1A ; [.30E6.0020.0002] # BUGINESE VOWEL SIGN O +1A1B ; [.30E7.0020.0002] # BUGINESE VOWEL SIGN AE +1BC0 ; [.30E8.0020.0002] # BATAK LETTER A +1BC1 ; [.30E8.0020.0004] # BATAK LETTER SIMALUNGUN A +1BC2 ; [.30E9.0020.0002] # BATAK LETTER HA +1BC3 ; [.30E9.0020.0004] # BATAK LETTER SIMALUNGUN HA +1BC4 ; [.30E9.0020.0004] # BATAK LETTER MANDAILING HA +1BC5 ; [.30EA.0020.0002] # BATAK LETTER BA +1BC6 ; [.30EA.0020.0004] # BATAK LETTER KARO BA +1BC7 ; [.30EB.0020.0002] # BATAK LETTER PA +1BC8 ; [.30EB.0020.0004] # BATAK LETTER SIMALUNGUN PA +1BC9 ; [.30EC.0020.0002] # BATAK LETTER NA +1BCA ; [.30EC.0020.0004] # BATAK LETTER MANDAILING NA +1BCB ; [.30ED.0020.0002] # BATAK LETTER WA +1BCC ; [.30ED.0020.0004] # BATAK LETTER SIMALUNGUN WA +1BCD ; [.30ED.0020.0004] # BATAK LETTER PAKPAK WA +1BCE ; [.30EE.0020.0002] # BATAK LETTER GA +1BCF ; [.30EE.0020.0004] # BATAK LETTER SIMALUNGUN GA +1BD0 ; [.30EF.0020.0002] # BATAK LETTER JA +1BD1 ; [.30F0.0020.0002] # BATAK LETTER DA +1BD2 ; [.30F1.0020.0002] # BATAK LETTER RA +1BD3 ; [.30F1.0020.0004] # BATAK LETTER SIMALUNGUN RA +1BD4 ; [.30F2.0020.0002] # BATAK LETTER MA +1BD5 ; [.30F2.0020.0004] # BATAK LETTER SIMALUNGUN MA +1BD6 ; [.30F3.0020.0002] # BATAK LETTER SOUTHERN TA +1BD7 ; [.30F3.0020.0004] # BATAK LETTER NORTHERN TA +1BD8 ; [.30F4.0020.0002] # BATAK LETTER SA +1BD9 ; [.30F4.0020.0004] # BATAK LETTER SIMALUNGUN SA +1BDA ; [.30F4.0020.0004] # BATAK LETTER MANDAILING SA +1BDB ; [.30F5.0020.0002] # BATAK LETTER YA +1BDC ; [.30F5.0020.0004] # BATAK LETTER SIMALUNGUN YA +1BDD ; [.30F6.0020.0002] # BATAK LETTER NGA +1BDE ; [.30F7.0020.0002] # BATAK LETTER LA +1BDF ; [.30F7.0020.0004] # BATAK LETTER SIMALUNGUN LA +1BE0 ; [.30F8.0020.0002] # BATAK LETTER NYA +1BE1 ; [.30F9.0020.0002] # BATAK LETTER CA +1BE2 ; [.30FA.0020.0002] # BATAK LETTER NDA +1BE3 ; [.30FB.0020.0002] # BATAK LETTER MBA +1BE4 ; [.30FC.0020.0002] # BATAK LETTER I +1BE5 ; [.30FD.0020.0002] # BATAK LETTER U +1BE7 ; [.30FE.0020.0002] # BATAK VOWEL SIGN E +1BE8 ; [.30FE.0020.0004] # BATAK VOWEL SIGN PAKPAK E +1BE9 ; [.30FF.0020.0002] # BATAK VOWEL SIGN EE +1BEA ; [.3100.0020.0002] # BATAK VOWEL SIGN I +1BEB ; [.3100.0020.0004] # BATAK VOWEL SIGN KARO I +1BEC ; [.3101.0020.0002] # BATAK VOWEL SIGN O +1BED ; [.3101.0020.0004] # BATAK VOWEL SIGN KARO O +1BEE ; [.3102.0020.0002] # BATAK VOWEL SIGN U +1BEF ; [.3102.0020.0004] # BATAK VOWEL SIGN U FOR SIMALUNGUN SA +1BF0 ; [.3103.0020.0002] # BATAK CONSONANT SIGN NG +1BF1 ; [.3104.0020.0002] # BATAK CONSONANT SIGN H +1BF2 ; [.3105.0020.0002] # BATAK PANGOLAT +1BF3 ; [.3106.0020.0002] # BATAK PANONGONAN +A930 ; [.3107.0020.0002] # REJANG LETTER KA +A931 ; [.3108.0020.0002] # REJANG LETTER GA +A932 ; [.3109.0020.0002] # REJANG LETTER NGA +A933 ; [.310A.0020.0002] # REJANG LETTER TA +A934 ; [.310B.0020.0002] # REJANG LETTER DA +A935 ; [.310C.0020.0002] # REJANG LETTER NA +A936 ; [.310D.0020.0002] # REJANG LETTER PA +A937 ; [.310E.0020.0002] # REJANG LETTER BA +A938 ; [.310F.0020.0002] # REJANG LETTER MA +A939 ; [.3110.0020.0002] # REJANG LETTER CA +A93A ; [.3111.0020.0002] # REJANG LETTER JA +A93B ; [.3112.0020.0002] # REJANG LETTER NYA +A93C ; [.3113.0020.0002] # REJANG LETTER SA +A93D ; [.3114.0020.0002] # REJANG LETTER RA +A93E ; [.3115.0020.0002] # REJANG LETTER LA +A93F ; [.3116.0020.0002] # REJANG LETTER YA +A940 ; [.3117.0020.0002] # REJANG LETTER WA +A941 ; [.3118.0020.0002] # REJANG LETTER HA +A942 ; [.3119.0020.0002] # REJANG LETTER MBA +A943 ; [.311A.0020.0002] # REJANG LETTER NGGA +A944 ; [.311B.0020.0002] # REJANG LETTER NDA +A945 ; [.311C.0020.0002] # REJANG LETTER NYJA +A946 ; [.311D.0020.0002] # REJANG LETTER A +A947 ; [.311E.0020.0002] # REJANG VOWEL SIGN I +A948 ; [.311F.0020.0002] # REJANG VOWEL SIGN U +A949 ; [.3120.0020.0002] # REJANG VOWEL SIGN E +A94A ; [.3121.0020.0002] # REJANG VOWEL SIGN AI +A94B ; [.3122.0020.0002] # REJANG VOWEL SIGN O +A94C ; [.3123.0020.0002] # REJANG VOWEL SIGN AU +A94D ; [.3124.0020.0002] # REJANG VOWEL SIGN EU +A94E ; [.3125.0020.0002] # REJANG VOWEL SIGN EA +A94F ; [.3126.0020.0002] # REJANG CONSONANT SIGN NG +A950 ; [.3127.0020.0002] # REJANG CONSONANT SIGN N +A951 ; [.3128.0020.0002] # REJANG CONSONANT SIGN R +A952 ; [.3129.0020.0002] # REJANG CONSONANT SIGN H +A953 ; [.312A.0020.0002] # REJANG VIRAMA +A90A ; [.312B.0020.0002] # KAYAH LI LETTER KA +A90B ; [.312C.0020.0002] # KAYAH LI LETTER KHA +A90C ; [.312D.0020.0002] # KAYAH LI LETTER GA +A90D ; [.312E.0020.0002] # KAYAH LI LETTER NGA +A90E ; [.312F.0020.0002] # KAYAH LI LETTER SA +A90F ; [.3130.0020.0002] # KAYAH LI LETTER SHA +A910 ; [.3131.0020.0002] # KAYAH LI LETTER ZA +A911 ; [.3132.0020.0002] # KAYAH LI LETTER NYA +A912 ; [.3133.0020.0002] # KAYAH LI LETTER TA +A913 ; [.3134.0020.0002] # KAYAH LI LETTER HTA +A914 ; [.3135.0020.0002] # KAYAH LI LETTER NA +A915 ; [.3136.0020.0002] # KAYAH LI LETTER PA +A916 ; [.3137.0020.0002] # KAYAH LI LETTER PHA +A917 ; [.3138.0020.0002] # KAYAH LI LETTER MA +A918 ; [.3139.0020.0002] # KAYAH LI LETTER DA +A919 ; [.313A.0020.0002] # KAYAH LI LETTER BA +A91A ; [.313B.0020.0002] # KAYAH LI LETTER RA +A91B ; [.313C.0020.0002] # KAYAH LI LETTER YA +A91C ; [.313D.0020.0002] # KAYAH LI LETTER LA +A91D ; [.313E.0020.0002] # KAYAH LI LETTER WA +A91E ; [.313F.0020.0002] # KAYAH LI LETTER THA +A91F ; [.3140.0020.0002] # KAYAH LI LETTER HA +A920 ; [.3141.0020.0002] # KAYAH LI LETTER VA +A921 ; [.3142.0020.0002] # KAYAH LI LETTER CA +A922 ; [.3143.0020.0002] # KAYAH LI LETTER A +A923 ; [.3144.0020.0002] # KAYAH LI LETTER OE +A924 ; [.3145.0020.0002] # KAYAH LI LETTER I +A925 ; [.3146.0020.0002] # KAYAH LI LETTER OO +A926 ; [.3147.0020.0002] # KAYAH LI VOWEL UE +A927 ; [.3148.0020.0002] # KAYAH LI VOWEL E +A928 ; [.3149.0020.0002] # KAYAH LI VOWEL U +A929 ; [.314A.0020.0002] # KAYAH LI VOWEL EE +A92A ; [.314B.0020.0002] # KAYAH LI VOWEL O +1000 ; [.314C.0020.0002] # MYANMAR LETTER KA +1075 ; [.314D.0020.0002] # MYANMAR LETTER SHAN KA +1001 ; [.314E.0020.0002] # MYANMAR LETTER KHA +1076 ; [.314F.0020.0002] # MYANMAR LETTER SHAN KHA +1002 ; [.3150.0020.0002] # MYANMAR LETTER GA +1077 ; [.3151.0020.0002] # MYANMAR LETTER SHAN GA +AA60 ; [.3152.0020.0002] # MYANMAR LETTER KHAMTI GA +A9E9 ; [.3153.0020.0002] # MYANMAR LETTER TAI LAING GA +1003 ; [.3154.0020.0002] # MYANMAR LETTER GHA +A9E0 ; [.3155.0020.0002] # MYANMAR LETTER SHAN GHA +A9EA ; [.3156.0020.0002] # MYANMAR LETTER TAI LAING GHA +1004 ; [.3157.0020.0002] # MYANMAR LETTER NGA +105A ; [.3158.0020.0002] # MYANMAR LETTER MON NGA +1005 ; [.3159.0020.0002] # MYANMAR LETTER CA +1078 ; [.315A.0020.0002] # MYANMAR LETTER SHAN CA +AA61 ; [.315B.0020.0002] # MYANMAR LETTER KHAMTI CA +1006 ; [.315C.0020.0002] # MYANMAR LETTER CHA +A9E1 ; [.315D.0020.0002] # MYANMAR LETTER SHAN CHA +AA62 ; [.315E.0020.0002] # MYANMAR LETTER KHAMTI CHA +AA7E ; [.315F.0020.0002] # MYANMAR LETTER SHWE PALAUNG CHA +1007 ; [.3160.0020.0002] # MYANMAR LETTER JA +AA63 ; [.3161.0020.0002] # MYANMAR LETTER KHAMTI JA +A9EB ; [.3162.0020.0002] # MYANMAR LETTER TAI LAING JA +1079 ; [.3163.0020.0002] # MYANMAR LETTER SHAN ZA +AA72 ; [.3164.0020.0002] # MYANMAR LETTER KHAMTI ZA +1008 ; [.3165.0020.0002] # MYANMAR LETTER JHA +105B ; [.3166.0020.0002] # MYANMAR LETTER MON JHA +A9E2 ; [.3167.0020.0002] # MYANMAR LETTER SHAN JHA +AA64 ; [.3168.0020.0002] # MYANMAR LETTER KHAMTI JHA +A9EC ; [.3169.0020.0002] # MYANMAR LETTER TAI LAING JHA +1061 ; [.316A.0020.0002] # MYANMAR LETTER SGAW KAREN SHA +AA7F ; [.316B.0020.0002] # MYANMAR LETTER SHWE PALAUNG SHA +1009 ; [.316C.0020.0002] # MYANMAR LETTER NYA +107A ; [.316D.0020.0002] # MYANMAR LETTER SHAN NYA +AA65 ; [.316E.0020.0002] # MYANMAR LETTER KHAMTI NYA +A9E7 ; [.316F.0020.0002] # MYANMAR LETTER TAI LAING NYA +100A ; [.3170.0020.0002] # MYANMAR LETTER NNYA +100B ; [.3171.0020.0002] # MYANMAR LETTER TTA +AA66 ; [.3172.0020.0002] # MYANMAR LETTER KHAMTI TTA +100C ; [.3173.0020.0002] # MYANMAR LETTER TTHA +AA67 ; [.3174.0020.0002] # MYANMAR LETTER KHAMTI TTHA +100D ; [.3175.0020.0002] # MYANMAR LETTER DDA +AA68 ; [.3176.0020.0002] # MYANMAR LETTER KHAMTI DDA +A9ED ; [.3177.0020.0002] # MYANMAR LETTER TAI LAING DDA +100E ; [.3178.0020.0002] # MYANMAR LETTER DDHA +AA69 ; [.3179.0020.0002] # MYANMAR LETTER KHAMTI DDHA +A9EE ; [.317A.0020.0002] # MYANMAR LETTER TAI LAING DDHA +100F ; [.317B.0020.0002] # MYANMAR LETTER NNA +106E ; [.317C.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN NNA +A9E3 ; [.317D.0020.0002] # MYANMAR LETTER SHAN NNA +A9EF ; [.317E.0020.0002] # MYANMAR LETTER TAI LAING NNA +1010 ; [.317F.0020.0002] # MYANMAR LETTER TA +1011 ; [.3180.0020.0002] # MYANMAR LETTER THA +1012 ; [.3181.0020.0002] # MYANMAR LETTER DA +107B ; [.3182.0020.0002] # MYANMAR LETTER SHAN DA +A9FB ; [.3183.0020.0002] # MYANMAR LETTER TAI LAING DA +1013 ; [.3184.0020.0002] # MYANMAR LETTER DHA +AA6A ; [.3185.0020.0002] # MYANMAR LETTER KHAMTI DHA +A9FC ; [.3186.0020.0002] # MYANMAR LETTER TAI LAING DHA +1014 ; [.3187.0020.0002] # MYANMAR LETTER NA +107C ; [.3188.0020.0002] # MYANMAR LETTER SHAN NA +AA6B ; [.3189.0020.0002] # MYANMAR LETTER KHAMTI NA +105E ; [.318A.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL NA +1015 ; [.318B.0020.0002] # MYANMAR LETTER PA +1016 ; [.318C.0020.0002] # MYANMAR LETTER PHA +107D ; [.318D.0020.0002] # MYANMAR LETTER SHAN PHA +107E ; [.318E.0020.0002] # MYANMAR LETTER SHAN FA +AA6F ; [.318F.0020.0002] # MYANMAR LETTER KHAMTI FA +108E ; [.3190.0020.0002] # MYANMAR LETTER RUMAI PALAUNG FA +A9E8 ; [.3191.0020.0002] # MYANMAR LETTER TAI LAING FA +1017 ; [.3192.0020.0002] # MYANMAR LETTER BA +107F ; [.3193.0020.0002] # MYANMAR LETTER SHAN BA +A9FD ; [.3194.0020.0002] # MYANMAR LETTER TAI LAING BA +1018 ; [.3195.0020.0002] # MYANMAR LETTER BHA +A9E4 ; [.3196.0020.0002] # MYANMAR LETTER SHAN BHA +A9FE ; [.3197.0020.0002] # MYANMAR LETTER TAI LAING BHA +1019 ; [.3198.0020.0002] # MYANMAR LETTER MA +105F ; [.3199.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL MA +101A ; [.319A.0020.0002] # MYANMAR LETTER YA +103B ; [.319B.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL YA +101B ; [.319C.0020.0002] # MYANMAR LETTER RA +AA73 ; [.319D.0020.0002] # MYANMAR LETTER KHAMTI RA +AA7A ; [.319E.0020.0002] # MYANMAR LETTER AITON RA +103C ; [.319F.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL RA +101C ; [.31A0.0020.0002] # MYANMAR LETTER LA +1060 ; [.31A1.0020.0002] # MYANMAR CONSONANT SIGN MON MEDIAL LA +101D ; [.31A2.0020.0002] # MYANMAR LETTER WA +103D ; [.31A3.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL WA +1082 ; [.31A4.0020.0002] # MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1080 ; [.31A5.0020.0002] # MYANMAR LETTER SHAN THA +1050 ; [.31A6.0020.0002] # MYANMAR LETTER SHA +1051 ; [.31A7.0020.0002] # MYANMAR LETTER SSA +1065 ; [.31A8.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN THA +101E ; [.31A9.0020.0002] # MYANMAR LETTER SA +103F ; [.31A9.0020.0004][.31E2.0020.0004][.31A9.0020.0004] # MYANMAR LETTER GREAT SA +AA6C ; [.31AA.0020.0002] # MYANMAR LETTER KHAMTI SA +101F ; [.31AB.0020.0002] # MYANMAR LETTER HA +1081 ; [.31AC.0020.0002] # MYANMAR LETTER SHAN HA +AA6D ; [.31AD.0020.0002] # MYANMAR LETTER KHAMTI HA +103E ; [.31AE.0020.0002] # MYANMAR CONSONANT SIGN MEDIAL HA +AA6E ; [.31AF.0020.0002] # MYANMAR LETTER KHAMTI HHA +AA71 ; [.31B0.0020.0002] # MYANMAR LETTER KHAMTI XA +1020 ; [.31B1.0020.0002] # MYANMAR LETTER LLA +A9FA ; [.31B2.0020.0002] # MYANMAR LETTER TAI LAING LLA +105C ; [.31B3.0020.0002] # MYANMAR LETTER MON BBA +105D ; [.31B4.0020.0002] # MYANMAR LETTER MON BBE +106F ; [.31B5.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN YWA +1070 ; [.31B6.0020.0002] # MYANMAR LETTER EASTERN PWO KAREN GHWA +1066 ; [.31B7.0020.0002] # MYANMAR LETTER WESTERN PWO KAREN PWA +1021 ; [.31B8.0020.0002] # MYANMAR LETTER A +1022 ; [.31B9.0020.0002] # MYANMAR LETTER SHAN A +1023 ; [.31BA.0020.0002] # MYANMAR LETTER I +1024 ; [.31BB.0020.0002] # MYANMAR LETTER II +1025 ; [.31BC.0020.0002] # MYANMAR LETTER U +1026 ; [.31BD.0020.0002] # MYANMAR LETTER UU +1025 102E ; [.31BD.0020.0002] # MYANMAR LETTER UU +1052 ; [.31BE.0020.0002] # MYANMAR LETTER VOCALIC R +1053 ; [.31BF.0020.0002] # MYANMAR LETTER VOCALIC RR +1054 ; [.31C0.0020.0002] # MYANMAR LETTER VOCALIC L +1055 ; [.31C1.0020.0002] # MYANMAR LETTER VOCALIC LL +1027 ; [.31C2.0020.0002] # MYANMAR LETTER E +1028 ; [.31C3.0020.0002] # MYANMAR LETTER MON E +1029 ; [.31C4.0020.0002] # MYANMAR LETTER O +102A ; [.31C5.0020.0002] # MYANMAR LETTER AU +102C ; [.31C6.0020.0002] # MYANMAR VOWEL SIGN AA +102B ; [.31C6.0020.0004] # MYANMAR VOWEL SIGN TALL AA +1083 ; [.31C7.0020.0002] # MYANMAR VOWEL SIGN SHAN AA +1072 ; [.31C8.0020.0002] # MYANMAR VOWEL SIGN KAYAH OE +109C ; [.31C9.0020.0002] # MYANMAR VOWEL SIGN AITON A +102D ; [.31CA.0020.0002] # MYANMAR VOWEL SIGN I +1071 ; [.31CB.0020.0002] # MYANMAR VOWEL SIGN GEBA KAREN I +102E ; [.31CC.0020.0002] # MYANMAR VOWEL SIGN II +1033 ; [.31CD.0020.0002] # MYANMAR VOWEL SIGN MON II +102F ; [.31CE.0020.0002] # MYANMAR VOWEL SIGN U +1073 ; [.31CF.0020.0002] # MYANMAR VOWEL SIGN KAYAH U +1074 ; [.31D0.0020.0002] # MYANMAR VOWEL SIGN KAYAH EE +1030 ; [.31D1.0020.0002] # MYANMAR VOWEL SIGN UU +1056 ; [.31D2.0020.0002] # MYANMAR VOWEL SIGN VOCALIC R +1057 ; [.31D3.0020.0002] # MYANMAR VOWEL SIGN VOCALIC RR +1058 ; [.31D4.0020.0002] # MYANMAR VOWEL SIGN VOCALIC L +1059 ; [.31D5.0020.0002] # MYANMAR VOWEL SIGN VOCALIC LL +1031 ; [.31D6.0020.0002] # MYANMAR VOWEL SIGN E +1084 ; [.31D7.0020.0002] # MYANMAR VOWEL SIGN SHAN E +1035 ; [.31D8.0020.0002] # MYANMAR VOWEL SIGN E ABOVE +1085 ; [.31D9.0020.0002] # MYANMAR VOWEL SIGN SHAN E ABOVE +1032 ; [.31DA.0020.0002] # MYANMAR VOWEL SIGN AI +109D ; [.31DB.0020.0002] # MYANMAR VOWEL SIGN AITON AI +1034 ; [.31DC.0020.0002] # MYANMAR VOWEL SIGN MON O +1062 ; [.31DD.0020.0002] # MYANMAR VOWEL SIGN SGAW KAREN EU +1067 ; [.31DE.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN EU +1068 ; [.31DF.0020.0002] # MYANMAR VOWEL SIGN WESTERN PWO KAREN UE +A9E5 ; [.31E0.0020.0002] # MYANMAR SIGN SHAN SAW +1086 ; [.31E1.0020.0002] # MYANMAR VOWEL SIGN SHAN FINAL Y +1039 ; [.31E2.0020.0002] # MYANMAR SIGN VIRAMA +103A ; [.31E3.0020.0002] # MYANMAR SIGN ASAT +1063 ; [.31E4.0020.0002] # MYANMAR TONE MARK SGAW KAREN HATHI +1064 ; [.31E5.0020.0002] # MYANMAR TONE MARK SGAW KAREN KE PHO +1069 ; [.31E6.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-1 +106A ; [.31E7.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-2 +106B ; [.31E8.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-3 +106C ; [.31E9.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-4 +106D ; [.31EA.0020.0002] # MYANMAR SIGN WESTERN PWO KAREN TONE-5 +1087 ; [.31EB.0020.0002] # MYANMAR SIGN SHAN TONE-2 +108B ; [.31EC.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-2 +1088 ; [.31ED.0020.0002] # MYANMAR SIGN SHAN TONE-3 +108C ; [.31EE.0020.0002] # MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; [.31EF.0020.0002] # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +1089 ; [.31F0.0020.0002] # MYANMAR SIGN SHAN TONE-5 +108A ; [.31F1.0020.0002] # MYANMAR SIGN SHAN TONE-6 +108F ; [.31F2.0020.0002] # MYANMAR SIGN RUMAI PALAUNG TONE-5 +109A ; [.31F3.0020.0002] # MYANMAR SIGN KHAMTI TONE-1 +109B ; [.31F4.0020.0002] # MYANMAR SIGN KHAMTI TONE-3 +AA7B ; [.31F5.0020.0002] # MYANMAR SIGN PAO KAREN TONE +AA7C ; [.31F6.0020.0002] # MYANMAR SIGN TAI LAING TONE-2 +AA7D ; [.31F7.0020.0002] # MYANMAR SIGN TAI LAING TONE-5 +AA74 ; [.31F8.0020.0002] # MYANMAR LOGOGRAM KHAMTI OAY +AA75 ; [.31F9.0020.0002] # MYANMAR LOGOGRAM KHAMTI QN +AA76 ; [.31FA.0020.0002] # MYANMAR LOGOGRAM KHAMTI HM +11103 ; [.31FB.0020.0002] # CHAKMA LETTER AA +11104 ; [.31FC.0020.0002] # CHAKMA LETTER I +11105 ; [.31FD.0020.0002] # CHAKMA LETTER U +11106 ; [.31FE.0020.0002] # CHAKMA LETTER E +11107 ; [.31FF.0020.0002] # CHAKMA LETTER KAA +11108 ; [.3200.0020.0002] # CHAKMA LETTER KHAA +11109 ; [.3201.0020.0002] # CHAKMA LETTER GAA +1110A ; [.3202.0020.0002] # CHAKMA LETTER GHAA +1110B ; [.3203.0020.0002] # CHAKMA LETTER NGAA +1110C ; [.3204.0020.0002] # CHAKMA LETTER CAA +1110D ; [.3205.0020.0002] # CHAKMA LETTER CHAA +1110E ; [.3206.0020.0002] # CHAKMA LETTER JAA +1110F ; [.3207.0020.0002] # CHAKMA LETTER JHAA +11110 ; [.3208.0020.0002] # CHAKMA LETTER NYAA +11111 ; [.3209.0020.0002] # CHAKMA LETTER TTAA +11112 ; [.320A.0020.0002] # CHAKMA LETTER TTHAA +11113 ; [.320B.0020.0002] # CHAKMA LETTER DDAA +11114 ; [.320C.0020.0002] # CHAKMA LETTER DDHAA +11115 ; [.320D.0020.0002] # CHAKMA LETTER NNAA +11116 ; [.320E.0020.0002] # CHAKMA LETTER TAA +11117 ; [.320F.0020.0002] # CHAKMA LETTER THAA +11118 ; [.3210.0020.0002] # CHAKMA LETTER DAA +11119 ; [.3211.0020.0002] # CHAKMA LETTER DHAA +1111A ; [.3212.0020.0002] # CHAKMA LETTER NAA +1111B ; [.3213.0020.0002] # CHAKMA LETTER PAA +1111C ; [.3214.0020.0002] # CHAKMA LETTER PHAA +1111D ; [.3215.0020.0002] # CHAKMA LETTER BAA +1111E ; [.3216.0020.0002] # CHAKMA LETTER BHAA +1111F ; [.3217.0020.0002] # CHAKMA LETTER MAA +11120 ; [.3218.0020.0002] # CHAKMA LETTER YYAA +11121 ; [.3219.0020.0002] # CHAKMA LETTER YAA +11122 ; [.321A.0020.0002] # CHAKMA LETTER RAA +11123 ; [.321B.0020.0002] # CHAKMA LETTER LAA +11124 ; [.321C.0020.0002] # CHAKMA LETTER WAA +11125 ; [.321D.0020.0002] # CHAKMA LETTER SAA +11126 ; [.321E.0020.0002] # CHAKMA LETTER HAA +11127 ; [.321F.0020.0002] # CHAKMA VOWEL SIGN A +11128 ; [.3220.0020.0002] # CHAKMA VOWEL SIGN I +11129 ; [.3221.0020.0002] # CHAKMA VOWEL SIGN II +1112A ; [.3222.0020.0002] # CHAKMA VOWEL SIGN U +1112B ; [.3223.0020.0002] # CHAKMA VOWEL SIGN UU +1112C ; [.3224.0020.0002] # CHAKMA VOWEL SIGN E +1112D ; [.3225.0020.0002] # CHAKMA VOWEL SIGN AI +1112E ; [.3226.0020.0002] # CHAKMA VOWEL SIGN O +11131 11127 ; [.3226.0020.0002] # CHAKMA VOWEL SIGN O +1112F ; [.3227.0020.0002] # CHAKMA VOWEL SIGN AU +11132 11127 ; [.3227.0020.0002] # CHAKMA VOWEL SIGN AU +11130 ; [.3228.0020.0002] # CHAKMA VOWEL SIGN OI +11131 ; [.3229.0020.0002] # CHAKMA O MARK +11132 ; [.322A.0020.0002] # CHAKMA AU MARK +11133 ; [.322B.0020.0002] # CHAKMA VIRAMA +11134 ; [.322C.0020.0002] # CHAKMA MAAYYAA +1780 ; [.322D.0020.0002] # KHMER LETTER KA +1781 ; [.322E.0020.0002] # KHMER LETTER KHA +1782 ; [.322F.0020.0002] # KHMER LETTER KO +1783 ; [.3230.0020.0002] # KHMER LETTER KHO +1784 ; [.3231.0020.0002] # KHMER LETTER NGO +1785 ; [.3232.0020.0002] # KHMER LETTER CA +1786 ; [.3233.0020.0002] # KHMER LETTER CHA +1787 ; [.3234.0020.0002] # KHMER LETTER CO +1788 ; [.3235.0020.0002] # KHMER LETTER CHO +1789 ; [.3236.0020.0002] # KHMER LETTER NYO +178A ; [.3237.0020.0002] # KHMER LETTER DA +178B ; [.3238.0020.0002] # KHMER LETTER TTHA +178C ; [.3239.0020.0002] # KHMER LETTER DO +178D ; [.323A.0020.0002] # KHMER LETTER TTHO +178E ; [.323B.0020.0002] # KHMER LETTER NNO +178F ; [.323C.0020.0002] # KHMER LETTER TA +1790 ; [.323D.0020.0002] # KHMER LETTER THA +1791 ; [.323E.0020.0002] # KHMER LETTER TO +1792 ; [.323F.0020.0002] # KHMER LETTER THO +1793 ; [.3240.0020.0002] # KHMER LETTER NO +1794 ; [.3241.0020.0002] # KHMER LETTER BA +1795 ; [.3242.0020.0002] # KHMER LETTER PHA +1796 ; [.3243.0020.0002] # KHMER LETTER PO +1797 ; [.3244.0020.0002] # KHMER LETTER PHO +1798 ; [.3245.0020.0002] # KHMER LETTER MO +1799 ; [.3246.0020.0002] # KHMER LETTER YO +179A ; [.3247.0020.0002] # KHMER LETTER RO +179B ; [.3248.0020.0002] # KHMER LETTER LO +179C ; [.3249.0020.0002] # KHMER LETTER VO +179D ; [.324A.0020.0002] # KHMER LETTER SHA +179E ; [.324B.0020.0002] # KHMER LETTER SSO +179F ; [.324C.0020.0002] # KHMER LETTER SA +17A0 ; [.324D.0020.0002] # KHMER LETTER HA +17A1 ; [.324E.0020.0002] # KHMER LETTER LA +17A2 ; [.324F.0020.0002] # KHMER LETTER QA +17DC ; [.3250.0020.0002] # KHMER SIGN AVAKRAHASANYA +17A3 ; [.3251.0020.0002] # KHMER INDEPENDENT VOWEL QAQ +17A4 ; [.3252.0020.0002] # KHMER INDEPENDENT VOWEL QAA +17A5 ; [.3253.0020.0002] # KHMER INDEPENDENT VOWEL QI +17A6 ; [.3254.0020.0002] # KHMER INDEPENDENT VOWEL QII +17A7 ; [.3255.0020.0002] # KHMER INDEPENDENT VOWEL QU +17A8 ; [.3256.0020.0002] # KHMER INDEPENDENT VOWEL QUK +17A9 ; [.3257.0020.0002] # KHMER INDEPENDENT VOWEL QUU +17AA ; [.3258.0020.0002] # KHMER INDEPENDENT VOWEL QUUV +17AB ; [.3259.0020.0002] # KHMER INDEPENDENT VOWEL RY +17AC ; [.325A.0020.0002] # KHMER INDEPENDENT VOWEL RYY +17AD ; [.325B.0020.0002] # KHMER INDEPENDENT VOWEL LY +17AE ; [.325C.0020.0002] # KHMER INDEPENDENT VOWEL LYY +17AF ; [.325D.0020.0002] # KHMER INDEPENDENT VOWEL QE +17B0 ; [.325E.0020.0002] # KHMER INDEPENDENT VOWEL QAI +17B1 ; [.325F.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE ONE +17B2 ; [.3260.0020.0002] # KHMER INDEPENDENT VOWEL QOO TYPE TWO +17B3 ; [.3261.0020.0002] # KHMER INDEPENDENT VOWEL QAU +17B6 ; [.3262.0020.0002] # KHMER VOWEL SIGN AA +17B7 ; [.3263.0020.0002] # KHMER VOWEL SIGN I +17B8 ; [.3264.0020.0002] # KHMER VOWEL SIGN II +17B9 ; [.3265.0020.0002] # KHMER VOWEL SIGN Y +17BA ; [.3266.0020.0002] # KHMER VOWEL SIGN YY +17BB ; [.3267.0020.0002] # KHMER VOWEL SIGN U +17BC ; [.3268.0020.0002] # KHMER VOWEL SIGN UU +17BD ; [.3269.0020.0002] # KHMER VOWEL SIGN UA +17BE ; [.326A.0020.0002] # KHMER VOWEL SIGN OE +17BF ; [.326B.0020.0002] # KHMER VOWEL SIGN YA +17C0 ; [.326C.0020.0002] # KHMER VOWEL SIGN IE +17C1 ; [.326D.0020.0002] # KHMER VOWEL SIGN E +17C2 ; [.326E.0020.0002] # KHMER VOWEL SIGN AE +17C3 ; [.326F.0020.0002] # KHMER VOWEL SIGN AI +17C4 ; [.3270.0020.0002] # KHMER VOWEL SIGN OO +17C5 ; [.3271.0020.0002] # KHMER VOWEL SIGN AU +17D2 ; [.3272.0020.0002] # KHMER SIGN COENG +1950 ; [.3273.0020.0002] # TAI LE LETTER KA +1951 ; [.3274.0020.0002] # TAI LE LETTER XA +1952 ; [.3275.0020.0002] # TAI LE LETTER NGA +1953 ; [.3276.0020.0002] # TAI LE LETTER TSA +1954 ; [.3277.0020.0002] # TAI LE LETTER SA +1955 ; [.3278.0020.0002] # TAI LE LETTER YA +1956 ; [.3279.0020.0002] # TAI LE LETTER TA +1957 ; [.327A.0020.0002] # TAI LE LETTER THA +1958 ; [.327B.0020.0002] # TAI LE LETTER LA +1959 ; [.327C.0020.0002] # TAI LE LETTER PA +195A ; [.327D.0020.0002] # TAI LE LETTER PHA +195B ; [.327E.0020.0002] # TAI LE LETTER MA +195C ; [.327F.0020.0002] # TAI LE LETTER FA +195D ; [.3280.0020.0002] # TAI LE LETTER VA +195E ; [.3281.0020.0002] # TAI LE LETTER HA +195F ; [.3282.0020.0002] # TAI LE LETTER QA +1960 ; [.3283.0020.0002] # TAI LE LETTER KHA +1961 ; [.3284.0020.0002] # TAI LE LETTER TSHA +1962 ; [.3285.0020.0002] # TAI LE LETTER NA +1963 ; [.3286.0020.0002] # TAI LE LETTER A +1964 ; [.3287.0020.0002] # TAI LE LETTER I +1965 ; [.3288.0020.0002] # TAI LE LETTER EE +1966 ; [.3289.0020.0002] # TAI LE LETTER EH +1967 ; [.328A.0020.0002] # TAI LE LETTER U +1968 ; [.328B.0020.0002] # TAI LE LETTER OO +1969 ; [.328C.0020.0002] # TAI LE LETTER O +196A ; [.328D.0020.0002] # TAI LE LETTER UE +196B ; [.328E.0020.0002] # TAI LE LETTER E +196C ; [.328F.0020.0002] # TAI LE LETTER AUE +196D ; [.3290.0020.0002] # TAI LE LETTER AI +1970 ; [.3291.0020.0002] # TAI LE LETTER TONE-2 +1971 ; [.3292.0020.0002] # TAI LE LETTER TONE-3 +1972 ; [.3293.0020.0002] # TAI LE LETTER TONE-4 +1973 ; [.3294.0020.0002] # TAI LE LETTER TONE-5 +1974 ; [.3295.0020.0002] # TAI LE LETTER TONE-6 +1980 ; [.3296.0020.0002] # NEW TAI LUE LETTER HIGH QA +19B5 1980 ; [.3296.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH QA> +19B6 1980 ; [.3296.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH QA> +19B7 1980 ; [.3296.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH QA> +19BA 1980 ; [.3296.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH QA> +1981 ; [.3297.0020.0002] # NEW TAI LUE LETTER LOW QA +19B5 1981 ; [.3297.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW QA> +19B6 1981 ; [.3297.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW QA> +19B7 1981 ; [.3297.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW QA> +19BA 1981 ; [.3297.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW QA> +1982 ; [.3298.0020.0002] # NEW TAI LUE LETTER HIGH KA +19B5 1982 ; [.3298.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KA> +19B6 1982 ; [.3298.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KA> +19B7 1982 ; [.3298.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KA> +19BA 1982 ; [.3298.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KA> +1983 ; [.3299.0020.0002] # NEW TAI LUE LETTER HIGH XA +19B5 1983 ; [.3299.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XA> +19B6 1983 ; [.3299.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XA> +19B7 1983 ; [.3299.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XA> +19BA 1983 ; [.3299.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XA> +1984 ; [.329A.0020.0002] # NEW TAI LUE LETTER HIGH NGA +19B5 1984 ; [.329A.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NGA> +19B6 1984 ; [.329A.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NGA> +19B7 1984 ; [.329A.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NGA> +19BA 1984 ; [.329A.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NGA> +1985 ; [.329B.0020.0002] # NEW TAI LUE LETTER LOW KA +19B5 1985 ; [.329B.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KA> +19B6 1985 ; [.329B.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KA> +19B7 1985 ; [.329B.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KA> +19BA 1985 ; [.329B.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KA> +1986 ; [.329C.0020.0002] # NEW TAI LUE LETTER LOW XA +19B5 1986 ; [.329C.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XA> +19B6 1986 ; [.329C.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XA> +19B7 1986 ; [.329C.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XA> +19BA 1986 ; [.329C.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XA> +1987 ; [.329D.0020.0002] # NEW TAI LUE LETTER LOW NGA +19B5 1987 ; [.329D.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NGA> +19B6 1987 ; [.329D.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NGA> +19B7 1987 ; [.329D.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NGA> +19BA 1987 ; [.329D.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NGA> +1988 ; [.329E.0020.0002] # NEW TAI LUE LETTER HIGH TSA +19B5 1988 ; [.329E.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TSA> +19B6 1988 ; [.329E.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TSA> +19B7 1988 ; [.329E.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TSA> +19BA 1988 ; [.329E.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TSA> +1989 ; [.329F.0020.0002] # NEW TAI LUE LETTER HIGH SA +19B5 1989 ; [.329F.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SA> +19B6 1989 ; [.329F.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SA> +19B7 1989 ; [.329F.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SA> +19BA 1989 ; [.329F.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SA> +198A ; [.32A0.0020.0002] # NEW TAI LUE LETTER HIGH YA +19B5 198A ; [.32A0.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH YA> +19B6 198A ; [.32A0.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH YA> +19B7 198A ; [.32A0.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH YA> +19BA 198A ; [.32A0.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH YA> +198B ; [.32A1.0020.0002] # NEW TAI LUE LETTER LOW TSA +19B5 198B ; [.32A1.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TSA> +19B6 198B ; [.32A1.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TSA> +19B7 198B ; [.32A1.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TSA> +19BA 198B ; [.32A1.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TSA> +198C ; [.32A2.0020.0002] # NEW TAI LUE LETTER LOW SA +19B5 198C ; [.32A2.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SA> +19B6 198C ; [.32A2.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SA> +19B7 198C ; [.32A2.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SA> +19BA 198C ; [.32A2.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SA> +198D ; [.32A3.0020.0002] # NEW TAI LUE LETTER LOW YA +19B5 198D ; [.32A3.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW YA> +19B6 198D ; [.32A3.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW YA> +19B7 198D ; [.32A3.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW YA> +19BA 198D ; [.32A3.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW YA> +198E ; [.32A4.0020.0002] # NEW TAI LUE LETTER HIGH TA +19B5 198E ; [.32A4.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH TA> +19B6 198E ; [.32A4.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH TA> +19B7 198E ; [.32A4.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH TA> +19BA 198E ; [.32A4.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH TA> +198F ; [.32A5.0020.0002] # NEW TAI LUE LETTER HIGH THA +19B5 198F ; [.32A5.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH THA> +19B6 198F ; [.32A5.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH THA> +19B7 198F ; [.32A5.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH THA> +19BA 198F ; [.32A5.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH THA> +1990 ; [.32A6.0020.0002] # NEW TAI LUE LETTER HIGH NA +19B5 1990 ; [.32A6.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH NA> +19B6 1990 ; [.32A6.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH NA> +19B7 1990 ; [.32A6.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH NA> +19BA 1990 ; [.32A6.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH NA> +1991 ; [.32A7.0020.0002] # NEW TAI LUE LETTER LOW TA +19B5 1991 ; [.32A7.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW TA> +19B6 1991 ; [.32A7.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW TA> +19B7 1991 ; [.32A7.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW TA> +19BA 1991 ; [.32A7.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW TA> +1992 ; [.32A8.0020.0002] # NEW TAI LUE LETTER LOW THA +19B5 1992 ; [.32A8.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW THA> +19B6 1992 ; [.32A8.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW THA> +19B7 1992 ; [.32A8.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW THA> +19BA 1992 ; [.32A8.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW THA> +1993 ; [.32A9.0020.0002] # NEW TAI LUE LETTER LOW NA +19B5 1993 ; [.32A9.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW NA> +19B6 1993 ; [.32A9.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW NA> +19B7 1993 ; [.32A9.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW NA> +19BA 1993 ; [.32A9.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW NA> +1994 ; [.32AA.0020.0002] # NEW TAI LUE LETTER HIGH PA +19B5 1994 ; [.32AA.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PA> +19B6 1994 ; [.32AA.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PA> +19B7 1994 ; [.32AA.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PA> +19BA 1994 ; [.32AA.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PA> +1995 ; [.32AB.0020.0002] # NEW TAI LUE LETTER HIGH PHA +19B5 1995 ; [.32AB.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH PHA> +19B6 1995 ; [.32AB.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH PHA> +19B7 1995 ; [.32AB.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH PHA> +19BA 1995 ; [.32AB.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH PHA> +1996 ; [.32AC.0020.0002] # NEW TAI LUE LETTER HIGH MA +19B5 1996 ; [.32AC.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH MA> +19B6 1996 ; [.32AC.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH MA> +19B7 1996 ; [.32AC.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH MA> +19BA 1996 ; [.32AC.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH MA> +1997 ; [.32AD.0020.0002] # NEW TAI LUE LETTER LOW PA +19B5 1997 ; [.32AD.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PA> +19B6 1997 ; [.32AD.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PA> +19B7 1997 ; [.32AD.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PA> +19BA 1997 ; [.32AD.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PA> +1998 ; [.32AE.0020.0002] # NEW TAI LUE LETTER LOW PHA +19B5 1998 ; [.32AE.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW PHA> +19B6 1998 ; [.32AE.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW PHA> +19B7 1998 ; [.32AE.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW PHA> +19BA 1998 ; [.32AE.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW PHA> +1999 ; [.32AF.0020.0002] # NEW TAI LUE LETTER LOW MA +19B5 1999 ; [.32AF.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW MA> +19B6 1999 ; [.32AF.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW MA> +19B7 1999 ; [.32AF.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW MA> +19BA 1999 ; [.32AF.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW MA> +199A ; [.32B0.0020.0002] # NEW TAI LUE LETTER HIGH FA +19B5 199A ; [.32B0.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH FA> +19B6 199A ; [.32B0.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH FA> +19B7 199A ; [.32B0.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH FA> +19BA 199A ; [.32B0.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH FA> +199B ; [.32B1.0020.0002] # NEW TAI LUE LETTER HIGH VA +19B5 199B ; [.32B1.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH VA> +19B6 199B ; [.32B1.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH VA> +19B7 199B ; [.32B1.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH VA> +19BA 199B ; [.32B1.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH VA> +199C ; [.32B2.0020.0002] # NEW TAI LUE LETTER HIGH LA +19B5 199C ; [.32B2.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH LA> +19B6 199C ; [.32B2.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH LA> +19DE ; [.32B2.0020.0004][.32C8.0020.0004] # NEW TAI LUE SIGN LAE +19DF ; [.32B2.0020.0004][.32C8.0020.0004][.32D3.0020.0004] # NEW TAI LUE SIGN LAEV +19B7 199C ; [.32B2.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH LA> +19BA 199C ; [.32B2.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH LA> +199D ; [.32B3.0020.0002] # NEW TAI LUE LETTER LOW FA +19B5 199D ; [.32B3.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW FA> +19B6 199D ; [.32B3.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW FA> +19B7 199D ; [.32B3.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW FA> +19BA 199D ; [.32B3.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW FA> +199E ; [.32B4.0020.0002] # NEW TAI LUE LETTER LOW VA +19B5 199E ; [.32B4.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW VA> +19B6 199E ; [.32B4.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW VA> +19B7 199E ; [.32B4.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW VA> +19BA 199E ; [.32B4.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW VA> +199F ; [.32B5.0020.0002] # NEW TAI LUE LETTER LOW LA +19B5 199F ; [.32B5.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW LA> +19B6 199F ; [.32B5.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW LA> +19B7 199F ; [.32B5.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW LA> +19BA 199F ; [.32B5.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW LA> +19A0 ; [.32B6.0020.0002] # NEW TAI LUE LETTER HIGH HA +19B5 19A0 ; [.32B6.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH HA> +19B6 19A0 ; [.32B6.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH HA> +19B7 19A0 ; [.32B6.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH HA> +19BA 19A0 ; [.32B6.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH HA> +19A1 ; [.32B7.0020.0002] # NEW TAI LUE LETTER HIGH DA +19B5 19A1 ; [.32B7.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH DA> +19B6 19A1 ; [.32B7.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH DA> +19B7 19A1 ; [.32B7.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH DA> +19BA 19A1 ; [.32B7.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH DA> +19A2 ; [.32B8.0020.0002] # NEW TAI LUE LETTER HIGH BA +19B5 19A2 ; [.32B8.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH BA> +19B6 19A2 ; [.32B8.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH BA> +19B7 19A2 ; [.32B8.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH BA> +19BA 19A2 ; [.32B8.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH BA> +19A3 ; [.32B9.0020.0002] # NEW TAI LUE LETTER LOW HA +19B5 19A3 ; [.32B9.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW HA> +19B6 19A3 ; [.32B9.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW HA> +19B7 19A3 ; [.32B9.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW HA> +19BA 19A3 ; [.32B9.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW HA> +19A4 ; [.32BA.0020.0002] # NEW TAI LUE LETTER LOW DA +19B5 19A4 ; [.32BA.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW DA> +19B6 19A4 ; [.32BA.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW DA> +19B7 19A4 ; [.32BA.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW DA> +19BA 19A4 ; [.32BA.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW DA> +19A5 ; [.32BB.0020.0002] # NEW TAI LUE LETTER LOW BA +19B5 19A5 ; [.32BB.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW BA> +19B6 19A5 ; [.32BB.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW BA> +19B7 19A5 ; [.32BB.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW BA> +19BA 19A5 ; [.32BB.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW BA> +19A6 ; [.32BC.0020.0002] # NEW TAI LUE LETTER HIGH KVA +19B5 19A6 ; [.32BC.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH KVA> +19B6 19A6 ; [.32BC.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH KVA> +19B7 19A6 ; [.32BC.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH KVA> +19BA 19A6 ; [.32BC.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH KVA> +19A7 ; [.32BD.0020.0002] # NEW TAI LUE LETTER HIGH XVA +19B5 19A7 ; [.32BD.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH XVA> +19B6 19A7 ; [.32BD.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH XVA> +19B7 19A7 ; [.32BD.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH XVA> +19BA 19A7 ; [.32BD.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH XVA> +19A8 ; [.32BE.0020.0002] # NEW TAI LUE LETTER LOW KVA +19B5 19A8 ; [.32BE.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW KVA> +19B6 19A8 ; [.32BE.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW KVA> +19B7 19A8 ; [.32BE.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW KVA> +19BA 19A8 ; [.32BE.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW KVA> +19A9 ; [.32BF.0020.0002] # NEW TAI LUE LETTER LOW XVA +19B5 19A9 ; [.32BF.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW XVA> +19B6 19A9 ; [.32BF.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW XVA> +19B7 19A9 ; [.32BF.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW XVA> +19BA 19A9 ; [.32BF.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW XVA> +19AA ; [.32C0.0020.0002] # NEW TAI LUE LETTER HIGH SUA +19B5 19AA ; [.32C0.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER HIGH SUA> +19B6 19AA ; [.32C0.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER HIGH SUA> +19B7 19AA ; [.32C0.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER HIGH SUA> +19BA 19AA ; [.32C0.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER HIGH SUA> +19AB ; [.32C1.0020.0002] # NEW TAI LUE LETTER LOW SUA +19B5 19AB ; [.32C1.0020.0002][.32C7.0020.0002] # <NEW TAI LUE VOWEL SIGN E, NEW TAI LUE LETTER LOW SUA> +19B6 19AB ; [.32C1.0020.0002][.32C8.0020.0002] # <NEW TAI LUE VOWEL SIGN AE, NEW TAI LUE LETTER LOW SUA> +19B7 19AB ; [.32C1.0020.0002][.32C9.0020.0002] # <NEW TAI LUE VOWEL SIGN O, NEW TAI LUE LETTER LOW SUA> +19BA 19AB ; [.32C1.0020.0002][.32CC.0020.0002] # <NEW TAI LUE VOWEL SIGN AY, NEW TAI LUE LETTER LOW SUA> +19B0 ; [.32C2.0020.0002] # NEW TAI LUE VOWEL SIGN VOWEL SHORTENER +19B1 ; [.32C3.0020.0002] # NEW TAI LUE VOWEL SIGN AA +19B2 ; [.32C4.0020.0002] # NEW TAI LUE VOWEL SIGN II +19B3 ; [.32C5.0020.0002] # NEW TAI LUE VOWEL SIGN U +19B4 ; [.32C6.0020.0002] # NEW TAI LUE VOWEL SIGN UU +19B5 ; [.32C7.0020.0002] # NEW TAI LUE VOWEL SIGN E +19B6 ; [.32C8.0020.0002] # NEW TAI LUE VOWEL SIGN AE +19B7 ; [.32C9.0020.0002] # NEW TAI LUE VOWEL SIGN O +19B8 ; [.32CA.0020.0002] # NEW TAI LUE VOWEL SIGN OA +19B9 ; [.32CB.0020.0002] # NEW TAI LUE VOWEL SIGN UE +19BA ; [.32CC.0020.0002] # NEW TAI LUE VOWEL SIGN AY +19BB ; [.32CD.0020.0002] # NEW TAI LUE VOWEL SIGN AAY +19BC ; [.32CE.0020.0002] # NEW TAI LUE VOWEL SIGN UY +19BD ; [.32CF.0020.0002] # NEW TAI LUE VOWEL SIGN OY +19BE ; [.32D0.0020.0002] # NEW TAI LUE VOWEL SIGN OAY +19BF ; [.32D1.0020.0002] # NEW TAI LUE VOWEL SIGN UEY +19C0 ; [.32D2.0020.0002] # NEW TAI LUE VOWEL SIGN IY +19C1 ; [.32D3.0020.0002] # NEW TAI LUE LETTER FINAL V +19C2 ; [.32D4.0020.0002] # NEW TAI LUE LETTER FINAL NG +19C3 ; [.32D5.0020.0002] # NEW TAI LUE LETTER FINAL N +19C4 ; [.32D6.0020.0002] # NEW TAI LUE LETTER FINAL M +19C5 ; [.32D7.0020.0002] # NEW TAI LUE LETTER FINAL K +19C6 ; [.32D8.0020.0002] # NEW TAI LUE LETTER FINAL D +19C7 ; [.32D9.0020.0002] # NEW TAI LUE LETTER FINAL B +19C8 ; [.32DA.0020.0002] # NEW TAI LUE TONE MARK-1 +19C9 ; [.32DB.0020.0002] # NEW TAI LUE TONE MARK-2 +1A20 ; [.32DC.0020.0002] # TAI THAM LETTER HIGH KA +1A21 ; [.32DD.0020.0002] # TAI THAM LETTER HIGH KHA +1A22 ; [.32DE.0020.0002] # TAI THAM LETTER HIGH KXA +1A23 ; [.32DF.0020.0002] # TAI THAM LETTER LOW KA +1A24 ; [.32E0.0020.0002] # TAI THAM LETTER LOW KXA +1A25 ; [.32E1.0020.0002] # TAI THAM LETTER LOW KHA +1A26 ; [.32E2.0020.0002] # TAI THAM LETTER NGA +1A58 ; [.32E2.0020.0004] # TAI THAM SIGN MAI KANG LAI +1A59 ; [.32E2.0020.0004] # TAI THAM CONSONANT SIGN FINAL NGA +1A27 ; [.32E3.0020.0002] # TAI THAM LETTER HIGH CA +1A28 ; [.32E4.0020.0002] # TAI THAM LETTER HIGH CHA +1A29 ; [.32E5.0020.0002] # TAI THAM LETTER LOW CA +1A2A ; [.32E6.0020.0002] # TAI THAM LETTER LOW SA +1A2B ; [.32E7.0020.0002] # TAI THAM LETTER LOW CHA +1A2C ; [.32E8.0020.0002] # TAI THAM LETTER NYA +1A2D ; [.32E9.0020.0002] # TAI THAM LETTER RATA +1A2E ; [.32EA.0020.0002] # TAI THAM LETTER HIGH RATHA +1A2F ; [.32EB.0020.0002] # TAI THAM LETTER DA +1A30 ; [.32EC.0020.0002] # TAI THAM LETTER LOW RATHA +1A31 ; [.32ED.0020.0002] # TAI THAM LETTER RANA +1A32 ; [.32EE.0020.0002] # TAI THAM LETTER HIGH TA +1A33 ; [.32EF.0020.0002] # TAI THAM LETTER HIGH THA +1A34 ; [.32F0.0020.0002] # TAI THAM LETTER LOW TA +1A35 ; [.32F1.0020.0002] # TAI THAM LETTER LOW THA +1A36 ; [.32F2.0020.0002] # TAI THAM LETTER NA +1A37 ; [.32F3.0020.0002] # TAI THAM LETTER BA +1A38 ; [.32F4.0020.0002] # TAI THAM LETTER HIGH PA +1A39 ; [.32F5.0020.0002] # TAI THAM LETTER HIGH PHA +1A3A ; [.32F6.0020.0002] # TAI THAM LETTER HIGH FA +1A3B ; [.32F7.0020.0002] # TAI THAM LETTER LOW PA +1A5A ; [.32F7.0020.0004] # TAI THAM CONSONANT SIGN LOW PA +1A5B ; [.32F7.0020.0004] # TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA +1A3C ; [.32F8.0020.0002] # TAI THAM LETTER LOW FA +1A3D ; [.32F9.0020.0002] # TAI THAM LETTER LOW PHA +1A3E ; [.32FA.0020.0002] # TAI THAM LETTER MA +1A3F ; [.32FB.0020.0002] # TAI THAM LETTER LOW YA +1A40 ; [.32FC.0020.0002] # TAI THAM LETTER HIGH YA +1A41 ; [.32FD.0020.0002] # TAI THAM LETTER RA +1A42 ; [.32FE.0020.0002] # TAI THAM LETTER RUE +1A43 ; [.32FF.0020.0002] # TAI THAM LETTER LA +1A44 ; [.3300.0020.0002] # TAI THAM LETTER LUE +1A45 ; [.3301.0020.0002] # TAI THAM LETTER WA +1A46 ; [.3302.0020.0002] # TAI THAM LETTER HIGH SHA +1A54 ; [.3302.0020.0004][.3328.0020.0004][.3302.0020.0004] # TAI THAM LETTER GREAT SA +1A47 ; [.3303.0020.0002] # TAI THAM LETTER HIGH SSA +1A48 ; [.3304.0020.0002] # TAI THAM LETTER HIGH SA +1A49 ; [.3305.0020.0002] # TAI THAM LETTER HIGH HA +1A4A ; [.3306.0020.0002] # TAI THAM LETTER LLA +1A4B ; [.3307.0020.0002] # TAI THAM LETTER A +1A4C ; [.3308.0020.0002] # TAI THAM LETTER LOW HA +1A53 ; [.3309.0020.0002] # TAI THAM LETTER LAE +1A6B ; [.330A.0020.0002] # TAI THAM VOWEL SIGN O +1A55 ; [.330B.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; [.330C.0020.0002] # TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; [.330D.0020.0002] # TAI THAM CONSONANT SIGN LA TANG LAI +1A5C ; [.330E.0020.0002] # TAI THAM CONSONANT SIGN MA +1A5D ; [.330F.0020.0002] # TAI THAM CONSONANT SIGN BA +1A5E ; [.3310.0020.0002] # TAI THAM CONSONANT SIGN SA +1A4D ; [.3311.0020.0002] # TAI THAM LETTER I +1A4E ; [.3312.0020.0002] # TAI THAM LETTER II +1A4F ; [.3313.0020.0002] # TAI THAM LETTER U +1A50 ; [.3314.0020.0002] # TAI THAM LETTER UU +1A51 ; [.3315.0020.0002] # TAI THAM LETTER EE +1A52 ; [.3316.0020.0002] # TAI THAM LETTER OO +1A61 ; [.3317.0020.0002] # TAI THAM VOWEL SIGN A +1A6C ; [.3318.0020.0002] # TAI THAM VOWEL SIGN OA BELOW +1A62 ; [.3319.0020.0002] # TAI THAM VOWEL SIGN MAI SAT +1A63 ; [.331A.0020.0002] # TAI THAM VOWEL SIGN AA +1A64 ; [.331A.0020.0004] # TAI THAM VOWEL SIGN TALL AA +1A65 ; [.331B.0020.0002] # TAI THAM VOWEL SIGN I +1A66 ; [.331C.0020.0002] # TAI THAM VOWEL SIGN II +1A67 ; [.331D.0020.0002] # TAI THAM VOWEL SIGN UE +1A68 ; [.331E.0020.0002] # TAI THAM VOWEL SIGN UUE +1A69 ; [.331F.0020.0002] # TAI THAM VOWEL SIGN U +1A6A ; [.3320.0020.0002] # TAI THAM VOWEL SIGN UU +1A6E ; [.3321.0020.0002] # TAI THAM VOWEL SIGN E +1A6F ; [.3322.0020.0002] # TAI THAM VOWEL SIGN AE +1A73 ; [.3323.0020.0002] # TAI THAM VOWEL SIGN OA ABOVE +1A70 ; [.3324.0020.0002] # TAI THAM VOWEL SIGN OO +1A71 ; [.3325.0020.0002] # TAI THAM VOWEL SIGN AI +1A72 ; [.3326.0020.0002] # TAI THAM VOWEL SIGN THAM AI +1A6D ; [.3327.0020.0002] # TAI THAM VOWEL SIGN OY +1A60 ; [.3328.0020.0002] # TAI THAM SIGN SAKOT +AA00 ; [.3329.0020.0002] # CHAM LETTER A +AA01 ; [.332A.0020.0002] # CHAM LETTER I +AA02 ; [.332B.0020.0002] # CHAM LETTER U +AA03 ; [.332C.0020.0002] # CHAM LETTER E +AA04 ; [.332D.0020.0002] # CHAM LETTER AI +AA05 ; [.332E.0020.0002] # CHAM LETTER O +AA06 ; [.332F.0020.0002] # CHAM LETTER KA +AA07 ; [.3330.0020.0002] # CHAM LETTER KHA +AA08 ; [.3331.0020.0002] # CHAM LETTER GA +AA09 ; [.3332.0020.0002] # CHAM LETTER GHA +AA0A ; [.3333.0020.0002] # CHAM LETTER NGUE +AA0B ; [.3334.0020.0002] # CHAM LETTER NGA +AA0C ; [.3335.0020.0002] # CHAM LETTER CHA +AA0D ; [.3336.0020.0002] # CHAM LETTER CHHA +AA0E ; [.3337.0020.0002] # CHAM LETTER JA +AA0F ; [.3338.0020.0002] # CHAM LETTER JHA +AA10 ; [.3339.0020.0002] # CHAM LETTER NHUE +AA11 ; [.333A.0020.0002] # CHAM LETTER NHA +AA12 ; [.333B.0020.0002] # CHAM LETTER NHJA +AA13 ; [.333C.0020.0002] # CHAM LETTER TA +AA14 ; [.333D.0020.0002] # CHAM LETTER THA +AA15 ; [.333E.0020.0002] # CHAM LETTER DA +AA16 ; [.333F.0020.0002] # CHAM LETTER DHA +AA17 ; [.3340.0020.0002] # CHAM LETTER NUE +AA18 ; [.3341.0020.0002] # CHAM LETTER NA +AA19 ; [.3342.0020.0002] # CHAM LETTER DDA +AA1A ; [.3343.0020.0002] # CHAM LETTER PA +AA1B ; [.3344.0020.0002] # CHAM LETTER PPA +AA1C ; [.3345.0020.0002] # CHAM LETTER PHA +AA1D ; [.3346.0020.0002] # CHAM LETTER BA +AA1E ; [.3347.0020.0002] # CHAM LETTER BHA +AA1F ; [.3348.0020.0002] # CHAM LETTER MUE +AA20 ; [.3349.0020.0002] # CHAM LETTER MA +AA21 ; [.334A.0020.0002] # CHAM LETTER BBA +AA22 ; [.334B.0020.0002] # CHAM LETTER YA +AA23 ; [.334C.0020.0002] # CHAM LETTER RA +AA24 ; [.334D.0020.0002] # CHAM LETTER LA +AA25 ; [.334E.0020.0002] # CHAM LETTER VA +AA26 ; [.334F.0020.0002] # CHAM LETTER SSA +AA27 ; [.3350.0020.0002] # CHAM LETTER SA +AA28 ; [.3351.0020.0002] # CHAM LETTER HA +AA33 ; [.3352.0020.0002] # CHAM CONSONANT SIGN YA +AA34 ; [.3353.0020.0002] # CHAM CONSONANT SIGN RA +AA35 ; [.3354.0020.0002] # CHAM CONSONANT SIGN LA +AA36 ; [.3355.0020.0002] # CHAM CONSONANT SIGN WA +AA29 ; [.3356.0020.0002] # CHAM VOWEL SIGN AA +AA2A ; [.3357.0020.0002] # CHAM VOWEL SIGN I +AA2B ; [.3358.0020.0002] # CHAM VOWEL SIGN II +AA2C ; [.3359.0020.0002] # CHAM VOWEL SIGN EI +AA2D ; [.335A.0020.0002] # CHAM VOWEL SIGN U +AA2E ; [.335B.0020.0002] # CHAM VOWEL SIGN OE +AA2F ; [.335C.0020.0002] # CHAM VOWEL SIGN O +AA30 ; [.335D.0020.0002] # CHAM VOWEL SIGN AI +AA31 ; [.335E.0020.0002] # CHAM VOWEL SIGN AU +AA32 ; [.335F.0020.0002] # CHAM VOWEL SIGN UE +AA40 ; [.3360.0020.0002] # CHAM LETTER FINAL K +AA41 ; [.3361.0020.0002] # CHAM LETTER FINAL G +AA42 ; [.3362.0020.0002] # CHAM LETTER FINAL NG +AA43 ; [.3363.0020.0002] # CHAM CONSONANT SIGN FINAL NG +AA44 ; [.3364.0020.0002] # CHAM LETTER FINAL CH +AA45 ; [.3365.0020.0002] # CHAM LETTER FINAL T +AA46 ; [.3366.0020.0002] # CHAM LETTER FINAL N +AA47 ; [.3367.0020.0002] # CHAM LETTER FINAL P +AA48 ; [.3368.0020.0002] # CHAM LETTER FINAL Y +AA49 ; [.3369.0020.0002] # CHAM LETTER FINAL R +AA4A ; [.336A.0020.0002] # CHAM LETTER FINAL L +AA4B ; [.336B.0020.0002] # CHAM LETTER FINAL SS +AA4C ; [.336C.0020.0002] # CHAM CONSONANT SIGN FINAL M +AA4D ; [.336D.0020.0002] # CHAM CONSONANT SIGN FINAL H +1B05 ; [.336E.0020.0002] # BALINESE LETTER AKARA +1B06 ; [.336F.0020.0002] # BALINESE LETTER AKARA TEDUNG +1B05 1B35 ; [.336F.0020.0002] # BALINESE LETTER AKARA TEDUNG +1B07 ; [.3370.0020.0002] # BALINESE LETTER IKARA +1B08 ; [.3371.0020.0002] # BALINESE LETTER IKARA TEDUNG +1B07 1B35 ; [.3371.0020.0002] # BALINESE LETTER IKARA TEDUNG +1B09 ; [.3372.0020.0002] # BALINESE LETTER UKARA +1B0A ; [.3373.0020.0002] # BALINESE LETTER UKARA TEDUNG +1B09 1B35 ; [.3373.0020.0002] # BALINESE LETTER UKARA TEDUNG +1B0B ; [.3374.0020.0002] # BALINESE LETTER RA REPA +1B0C ; [.3375.0020.0002] # BALINESE LETTER RA REPA TEDUNG +1B0B 1B35 ; [.3375.0020.0002] # BALINESE LETTER RA REPA TEDUNG +1B0D ; [.3376.0020.0002] # BALINESE LETTER LA LENGA +1B0E ; [.3377.0020.0002] # BALINESE LETTER LA LENGA TEDUNG +1B0D 1B35 ; [.3377.0020.0002] # BALINESE LETTER LA LENGA TEDUNG +1B0F ; [.3378.0020.0002] # BALINESE LETTER EKARA +1B10 ; [.3379.0020.0002] # BALINESE LETTER AIKARA +1B11 ; [.337A.0020.0002] # BALINESE LETTER OKARA +1B12 ; [.337B.0020.0002] # BALINESE LETTER OKARA TEDUNG +1B11 1B35 ; [.337B.0020.0002] # BALINESE LETTER OKARA TEDUNG +1B13 ; [.337C.0020.0002] # BALINESE LETTER KA +1B45 ; [.337D.0020.0002] # BALINESE LETTER KAF SASAK +1B46 ; [.337E.0020.0002] # BALINESE LETTER KHOT SASAK +1B14 ; [.337F.0020.0002] # BALINESE LETTER KA MAHAPRANA +1B15 ; [.3380.0020.0002] # BALINESE LETTER GA +1B16 ; [.3381.0020.0002] # BALINESE LETTER GA GORA +1B17 ; [.3382.0020.0002] # BALINESE LETTER NGA +1B18 ; [.3383.0020.0002] # BALINESE LETTER CA +1B19 ; [.3384.0020.0002] # BALINESE LETTER CA LACA +1B1A ; [.3385.0020.0002] # BALINESE LETTER JA +1B1B ; [.3386.0020.0002] # BALINESE LETTER JA JERA +1B1C ; [.3387.0020.0002] # BALINESE LETTER NYA +1B1D ; [.3388.0020.0002] # BALINESE LETTER TA LATIK +1B1E ; [.3389.0020.0002] # BALINESE LETTER TA MURDA MAHAPRANA +1B1F ; [.338A.0020.0002] # BALINESE LETTER DA MURDA ALPAPRANA +1B20 ; [.338B.0020.0002] # BALINESE LETTER DA MURDA MAHAPRANA +1B21 ; [.338C.0020.0002] # BALINESE LETTER NA RAMBAT +1B22 ; [.338D.0020.0002] # BALINESE LETTER TA +1B47 ; [.338E.0020.0002] # BALINESE LETTER TZIR SASAK +1B23 ; [.338F.0020.0002] # BALINESE LETTER TA TAWA +1B24 ; [.3390.0020.0002] # BALINESE LETTER DA +1B25 ; [.3391.0020.0002] # BALINESE LETTER DA MADU +1B26 ; [.3392.0020.0002] # BALINESE LETTER NA +1B27 ; [.3393.0020.0002] # BALINESE LETTER PA +1B48 ; [.3394.0020.0002] # BALINESE LETTER EF SASAK +1B28 ; [.3395.0020.0002] # BALINESE LETTER PA KAPAL +1B29 ; [.3396.0020.0002] # BALINESE LETTER BA +1B2A ; [.3397.0020.0002] # BALINESE LETTER BA KEMBANG +1B2B ; [.3398.0020.0002] # BALINESE LETTER MA +1B2C ; [.3399.0020.0002] # BALINESE LETTER YA +1B2D ; [.339A.0020.0002] # BALINESE LETTER RA +1B2E ; [.339B.0020.0002] # BALINESE LETTER LA +1B2F ; [.339C.0020.0002] # BALINESE LETTER WA +1B49 ; [.339D.0020.0002] # BALINESE LETTER VE SASAK +1B30 ; [.339E.0020.0002] # BALINESE LETTER SA SAGA +1B31 ; [.339F.0020.0002] # BALINESE LETTER SA SAPA +1B32 ; [.33A0.0020.0002] # BALINESE LETTER SA +1B4A ; [.33A1.0020.0002] # BALINESE LETTER ZAL SASAK +1B4B ; [.33A2.0020.0002] # BALINESE LETTER ASYURA SASAK +1B33 ; [.33A3.0020.0002] # BALINESE LETTER HA +1B35 ; [.33A4.0020.0002] # BALINESE VOWEL SIGN TEDUNG +1B36 ; [.33A5.0020.0002] # BALINESE VOWEL SIGN ULU +1B37 ; [.33A6.0020.0002] # BALINESE VOWEL SIGN ULU SARI +1B38 ; [.33A7.0020.0002] # BALINESE VOWEL SIGN SUKU +1B39 ; [.33A8.0020.0002] # BALINESE VOWEL SIGN SUKU ILUT +1B3A ; [.33A9.0020.0002] # BALINESE VOWEL SIGN RA REPA +1B3B ; [.33AA.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG +1B3A 1B35 ; [.33AA.0020.0002] # BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; [.33AB.0020.0002] # BALINESE VOWEL SIGN LA LENGA +1B3D ; [.33AC.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG +1B3C 1B35 ; [.33AC.0020.0002] # BALINESE VOWEL SIGN LA LENGA TEDUNG +1B3E ; [.33AD.0020.0002] # BALINESE VOWEL SIGN TALING +1B3F ; [.33AE.0020.0002] # BALINESE VOWEL SIGN TALING REPA +1B40 ; [.33AF.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG +1B3E 1B35 ; [.33AF.0020.0002] # BALINESE VOWEL SIGN TALING TEDUNG +1B41 ; [.33B0.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG +1B3F 1B35 ; [.33B0.0020.0002] # BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; [.33B1.0020.0002] # BALINESE VOWEL SIGN PEPET +1B43 ; [.33B2.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG +1B42 1B35 ; [.33B2.0020.0002] # BALINESE VOWEL SIGN PEPET TEDUNG +1B44 ; [.33B3.0020.0002] # BALINESE ADEG ADEG +A984 ; [.33B4.0020.0002] # JAVANESE LETTER A +A985 ; [.33B5.0020.0002] # JAVANESE LETTER I KAWI +A986 ; [.33B6.0020.0002] # JAVANESE LETTER I +A987 ; [.33B7.0020.0002] # JAVANESE LETTER II +A988 ; [.33B8.0020.0002] # JAVANESE LETTER U +A989 ; [.33B9.0020.0002] # JAVANESE LETTER PA CEREK +A98A ; [.33BA.0020.0002] # JAVANESE LETTER NGA LELET +A98B ; [.33BB.0020.0002] # JAVANESE LETTER NGA LELET RASWADI +A98C ; [.33BC.0020.0002] # JAVANESE LETTER E +A98D ; [.33BD.0020.0002] # JAVANESE LETTER AI +A98E ; [.33BE.0020.0002] # JAVANESE LETTER O +A98F ; [.33BF.0020.0002] # JAVANESE LETTER KA +A990 ; [.33C0.0020.0002] # JAVANESE LETTER KA SASAK +A991 ; [.33C1.0020.0002] # JAVANESE LETTER KA MURDA +A992 ; [.33C2.0020.0002] # JAVANESE LETTER GA +A993 ; [.33C3.0020.0002] # JAVANESE LETTER GA MURDA +A994 ; [.33C4.0020.0002] # JAVANESE LETTER NGA +A995 ; [.33C5.0020.0002] # JAVANESE LETTER CA +A996 ; [.33C6.0020.0002] # JAVANESE LETTER CA MURDA +A997 ; [.33C7.0020.0002] # JAVANESE LETTER JA +A998 ; [.33C8.0020.0002] # JAVANESE LETTER NYA MURDA +A999 ; [.33C9.0020.0002] # JAVANESE LETTER JA MAHAPRANA +A99A ; [.33CA.0020.0002] # JAVANESE LETTER NYA +A99B ; [.33CB.0020.0002] # JAVANESE LETTER TTA +A99C ; [.33CC.0020.0002] # JAVANESE LETTER TTA MAHAPRANA +A99D ; [.33CD.0020.0002] # JAVANESE LETTER DDA +A99E ; [.33CE.0020.0002] # JAVANESE LETTER DDA MAHAPRANA +A99F ; [.33CF.0020.0002] # JAVANESE LETTER NA MURDA +A9A0 ; [.33D0.0020.0002] # JAVANESE LETTER TA +A9A1 ; [.33D1.0020.0002] # JAVANESE LETTER TA MURDA +A9A2 ; [.33D2.0020.0002] # JAVANESE LETTER DA +A9A3 ; [.33D3.0020.0002] # JAVANESE LETTER DA MAHAPRANA +A9A4 ; [.33D4.0020.0002] # JAVANESE LETTER NA +A9A5 ; [.33D5.0020.0002] # JAVANESE LETTER PA +A9A6 ; [.33D6.0020.0002] # JAVANESE LETTER PA MURDA +A9A7 ; [.33D7.0020.0002] # JAVANESE LETTER BA +A9A8 ; [.33D8.0020.0002] # JAVANESE LETTER BA MURDA +A9A9 ; [.33D9.0020.0002] # JAVANESE LETTER MA +A9AA ; [.33DA.0020.0002] # JAVANESE LETTER YA +A9BE ; [.33DB.0020.0002] # JAVANESE CONSONANT SIGN PENGKAL +A9AB ; [.33DC.0020.0002] # JAVANESE LETTER RA +A9AC ; [.33DC.0020.0004] # JAVANESE LETTER RA AGUNG +A9BF ; [.33DD.0020.0002] # JAVANESE CONSONANT SIGN CAKRA +A9AD ; [.33DE.0020.0002] # JAVANESE LETTER LA +A9AE ; [.33DF.0020.0002] # JAVANESE LETTER WA +A9AF ; [.33E0.0020.0002] # JAVANESE LETTER SA MURDA +A9B0 ; [.33E1.0020.0002] # JAVANESE LETTER SA MAHAPRANA +A9B1 ; [.33E2.0020.0002] # JAVANESE LETTER SA +A9B2 ; [.33E3.0020.0002] # JAVANESE LETTER HA +A9B4 ; [.33E4.0020.0002] # JAVANESE VOWEL SIGN TARUNG +A9BC ; [.33E5.0020.0002] # JAVANESE VOWEL SIGN PEPET +A9B6 ; [.33E6.0020.0002] # JAVANESE VOWEL SIGN WULU +A9B7 ; [.33E7.0020.0002] # JAVANESE VOWEL SIGN WULU MELIK +A9B8 ; [.33E8.0020.0002] # JAVANESE VOWEL SIGN SUKU +A9B9 ; [.33E9.0020.0002] # JAVANESE VOWEL SIGN SUKU MENDUT +A9BD ; [.33EA.0020.0002] # JAVANESE CONSONANT SIGN KERET +A9BA ; [.33EB.0020.0002] # JAVANESE VOWEL SIGN TALING +A9BB ; [.33EC.0020.0002] # JAVANESE VOWEL SIGN DIRGA MURE +A9B5 ; [.33ED.0020.0002] # JAVANESE VOWEL SIGN TOLONG +A9C0 ; [.33EE.0020.0002] # JAVANESE PANGKON +1880 ; [.33EF.0020.0002] # MONGOLIAN LETTER ALI GALI ANUSVARA ONE +1881 ; [.33F0.0020.0002] # MONGOLIAN LETTER ALI GALI VISARGA ONE +1882 ; [.33F1.0020.0002] # MONGOLIAN LETTER ALI GALI DAMARU +1883 ; [.33F2.0020.0002] # MONGOLIAN LETTER ALI GALI UBADAMA +1884 ; [.33F3.0020.0002] # MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885 ; [.33F4.0020.0002] # MONGOLIAN LETTER ALI GALI BALUDA +1886 ; [.33F5.0020.0002] # MONGOLIAN LETTER ALI GALI THREE BALUDA +1843 ; [.33F6.0020.0002] # MONGOLIAN LETTER TODO LONG VOWEL SIGN +1820 ; [.33F7.0020.0002] # MONGOLIAN LETTER A +1887 ; [.33F8.0020.0002] # MONGOLIAN LETTER ALI GALI A +1821 ; [.33F9.0020.0002] # MONGOLIAN LETTER E +1844 ; [.33FA.0020.0002] # MONGOLIAN LETTER TODO E +185D ; [.33FB.0020.0002] # MONGOLIAN LETTER SIBE E +1822 ; [.33FC.0020.0002] # MONGOLIAN LETTER I +1845 ; [.33FD.0020.0002] # MONGOLIAN LETTER TODO I +185E ; [.33FE.0020.0002] # MONGOLIAN LETTER SIBE I +1873 ; [.33FF.0020.0002] # MONGOLIAN LETTER MANCHU I +1888 ; [.3400.0020.0002] # MONGOLIAN LETTER ALI GALI I +185F ; [.3401.0020.0002] # MONGOLIAN LETTER SIBE IY +1823 ; [.3402.0020.0002] # MONGOLIAN LETTER O +1846 ; [.3403.0020.0002] # MONGOLIAN LETTER TODO O +1824 ; [.3404.0020.0002] # MONGOLIAN LETTER U +1847 ; [.3405.0020.0002] # MONGOLIAN LETTER TODO U +1861 ; [.3406.0020.0002] # MONGOLIAN LETTER SIBE U +1825 ; [.3407.0020.0002] # MONGOLIAN LETTER OE +1848 ; [.3408.0020.0002] # MONGOLIAN LETTER TODO OE +1826 ; [.3409.0020.0002] # MONGOLIAN LETTER UE +1849 ; [.340A.0020.0002] # MONGOLIAN LETTER TODO UE +1860 ; [.340B.0020.0002] # MONGOLIAN LETTER SIBE UE +1827 ; [.340C.0020.0002] # MONGOLIAN LETTER EE +1828 ; [.340D.0020.0002] # MONGOLIAN LETTER NA +1829 ; [.340E.0020.0002] # MONGOLIAN LETTER ANG +184A ; [.340F.0020.0002] # MONGOLIAN LETTER TODO ANG +1862 ; [.3410.0020.0002] # MONGOLIAN LETTER SIBE ANG +188A ; [.3411.0020.0002] # MONGOLIAN LETTER ALI GALI NGA +189B ; [.3412.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI NGA +182A ; [.3413.0020.0002] # MONGOLIAN LETTER BA +184B ; [.3414.0020.0002] # MONGOLIAN LETTER TODO BA +182B ; [.3415.0020.0002] # MONGOLIAN LETTER PA +184C ; [.3416.0020.0002] # MONGOLIAN LETTER TODO PA +1866 ; [.3417.0020.0002] # MONGOLIAN LETTER SIBE PA +182C ; [.3418.0020.0002] # MONGOLIAN LETTER QA +184D ; [.3419.0020.0002] # MONGOLIAN LETTER TODO QA +182D ; [.341A.0020.0002] # MONGOLIAN LETTER GA +184E ; [.341B.0020.0002] # MONGOLIAN LETTER TODO GA +1864 ; [.341C.0020.0002] # MONGOLIAN LETTER SIBE GA +189A ; [.341D.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI GHA +1865 ; [.341E.0020.0002] # MONGOLIAN LETTER SIBE HA +182E ; [.341F.0020.0002] # MONGOLIAN LETTER MA +184F ; [.3420.0020.0002] # MONGOLIAN LETTER TODO MA +182F ; [.3421.0020.0002] # MONGOLIAN LETTER LA +1830 ; [.3422.0020.0002] # MONGOLIAN LETTER SA +1831 ; [.3423.0020.0002] # MONGOLIAN LETTER SHA +1867 ; [.3424.0020.0002] # MONGOLIAN LETTER SIBE SHA +189C ; [.3425.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CA +189D ; [.3426.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI JHA +18A2 ; [.3427.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI SSA +18A4 ; [.3428.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZHA +18A5 ; [.3429.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI ZA +1832 ; [.342A.0020.0002] # MONGOLIAN LETTER TA +1850 ; [.342B.0020.0002] # MONGOLIAN LETTER TODO TA +1868 ; [.342C.0020.0002] # MONGOLIAN LETTER SIBE TA +1833 ; [.342D.0020.0002] # MONGOLIAN LETTER DA +1851 ; [.342E.0020.0002] # MONGOLIAN LETTER TODO DA +1869 ; [.342F.0020.0002] # MONGOLIAN LETTER SIBE DA +1834 ; [.3430.0020.0002] # MONGOLIAN LETTER CHA +1852 ; [.3431.0020.0002] # MONGOLIAN LETTER TODO CHA +1871 ; [.3432.0020.0002] # MONGOLIAN LETTER SIBE CHA +185C ; [.3433.0020.0002] # MONGOLIAN LETTER TODO DZA +188B ; [.3434.0020.0002] # MONGOLIAN LETTER ALI GALI CA +1835 ; [.3435.0020.0002] # MONGOLIAN LETTER JA +1853 ; [.3436.0020.0002] # MONGOLIAN LETTER TODO JA +186A ; [.3437.0020.0002] # MONGOLIAN LETTER SIBE JA +1877 ; [.3438.0020.0002] # MONGOLIAN LETTER MANCHU ZHA +1836 ; [.3439.0020.0002] # MONGOLIAN LETTER YA +1855 ; [.343A.0020.0002] # MONGOLIAN LETTER TODO YA +1872 ; [.343B.0020.0002] # MONGOLIAN LETTER SIBE ZHA +1837 ; [.343C.0020.0002] # MONGOLIAN LETTER RA +1875 ; [.343D.0020.0002] # MONGOLIAN LETTER MANCHU RA +1838 ; [.343E.0020.0002] # MONGOLIAN LETTER WA +1856 ; [.343F.0020.0002] # MONGOLIAN LETTER TODO WA +1839 ; [.3440.0020.0002] # MONGOLIAN LETTER FA +186B ; [.3441.0020.0002] # MONGOLIAN LETTER SIBE FA +1876 ; [.3442.0020.0002] # MONGOLIAN LETTER MANCHU FA +183A ; [.3443.0020.0002] # MONGOLIAN LETTER KA +1857 ; [.3444.0020.0002] # MONGOLIAN LETTER TODO KA +1863 ; [.3445.0020.0002] # MONGOLIAN LETTER SIBE KA +1874 ; [.3446.0020.0002] # MONGOLIAN LETTER MANCHU KA +1889 ; [.3447.0020.0002] # MONGOLIAN LETTER ALI GALI KA +183B ; [.3448.0020.0002] # MONGOLIAN LETTER KHA +183C ; [.3449.0020.0002] # MONGOLIAN LETTER TSA +1854 ; [.344A.0020.0002] # MONGOLIAN LETTER TODO TSA +186E ; [.344B.0020.0002] # MONGOLIAN LETTER SIBE TSA +183D ; [.344C.0020.0002] # MONGOLIAN LETTER ZA +186F ; [.344D.0020.0002] # MONGOLIAN LETTER SIBE ZA +1858 ; [.344E.0020.0002] # MONGOLIAN LETTER TODO GAA +186C ; [.344F.0020.0002] # MONGOLIAN LETTER SIBE GAA +183E ; [.3450.0020.0002] # MONGOLIAN LETTER HAA +1859 ; [.3451.0020.0002] # MONGOLIAN LETTER TODO HAA +186D ; [.3452.0020.0002] # MONGOLIAN LETTER SIBE HAA +183F ; [.3453.0020.0002] # MONGOLIAN LETTER ZRA +1840 ; [.3454.0020.0002] # MONGOLIAN LETTER LHA +1841 ; [.3455.0020.0002] # MONGOLIAN LETTER ZHI +1842 ; [.3456.0020.0002] # MONGOLIAN LETTER CHI +185A ; [.3457.0020.0002] # MONGOLIAN LETTER TODO JIA +185B ; [.3458.0020.0002] # MONGOLIAN LETTER TODO NIA +1870 ; [.3459.0020.0002] # MONGOLIAN LETTER SIBE RAA +188C ; [.345A.0020.0002] # MONGOLIAN LETTER ALI GALI TTA +189E ; [.345B.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TTA +188D ; [.345C.0020.0002] # MONGOLIAN LETTER ALI GALI TTHA +188E ; [.345D.0020.0002] # MONGOLIAN LETTER ALI GALI DDA +189F ; [.345E.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DDHA +188F ; [.345F.0020.0002] # MONGOLIAN LETTER ALI GALI NNA +1890 ; [.3460.0020.0002] # MONGOLIAN LETTER ALI GALI TA +1898 ; [.3461.0020.0002] # MONGOLIAN LETTER TODO ALI GALI TA +18A0 ; [.3462.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI TA +1891 ; [.3463.0020.0002] # MONGOLIAN LETTER ALI GALI DA +18A1 ; [.3464.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI DHA +1892 ; [.3465.0020.0002] # MONGOLIAN LETTER ALI GALI PA +1893 ; [.3466.0020.0002] # MONGOLIAN LETTER ALI GALI PHA +18A8 ; [.3467.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI BHA +1894 ; [.3468.0020.0002] # MONGOLIAN LETTER ALI GALI SSA +18A3 ; [.3469.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI CYA +1895 ; [.346A.0020.0002] # MONGOLIAN LETTER ALI GALI ZHA +1899 ; [.346B.0020.0002] # MONGOLIAN LETTER TODO ALI GALI ZHA +1896 ; [.346C.0020.0002] # MONGOLIAN LETTER ALI GALI ZA +1897 ; [.346D.0020.0002] # MONGOLIAN LETTER ALI GALI AH +18A6 ; [.346E.0020.0002] # MONGOLIAN LETTER ALI GALI HALF U +18A7 ; [.346F.0020.0002] # MONGOLIAN LETTER ALI GALI HALF YA +18AA ; [.3470.0020.0002] # MONGOLIAN LETTER MANCHU ALI GALI LHA +18A9 ; [.3471.0020.0002] # MONGOLIAN LETTER ALI GALI DAGALGA +1C5A ; [.3472.0020.0002] # OL CHIKI LETTER LA +1C5B ; [.3473.0020.0002] # OL CHIKI LETTER AT +1C5C ; [.3474.0020.0002] # OL CHIKI LETTER AG +1C5D ; [.3475.0020.0002] # OL CHIKI LETTER ANG +1C5E ; [.3476.0020.0002] # OL CHIKI LETTER AL +1C5F ; [.3477.0020.0002] # OL CHIKI LETTER LAA +1C60 ; [.3478.0020.0002] # OL CHIKI LETTER AAK +1C61 ; [.3479.0020.0002] # OL CHIKI LETTER AAJ +1C62 ; [.347A.0020.0002] # OL CHIKI LETTER AAM +1C63 ; [.347B.0020.0002] # OL CHIKI LETTER AAW +1C64 ; [.347C.0020.0002] # OL CHIKI LETTER LI +1C65 ; [.347D.0020.0002] # OL CHIKI LETTER IS +1C66 ; [.347E.0020.0002] # OL CHIKI LETTER IH +1C67 ; [.347F.0020.0002] # OL CHIKI LETTER INY +1C68 ; [.3480.0020.0002] # OL CHIKI LETTER IR +1C69 ; [.3481.0020.0002] # OL CHIKI LETTER LU +1C6A ; [.3482.0020.0002] # OL CHIKI LETTER UC +1C6B ; [.3483.0020.0002] # OL CHIKI LETTER UD +1C6C ; [.3484.0020.0002] # OL CHIKI LETTER UNN +1C6D ; [.3485.0020.0002] # OL CHIKI LETTER UY +1C6E ; [.3486.0020.0002] # OL CHIKI LETTER LE +1C6F ; [.3487.0020.0002] # OL CHIKI LETTER EP +1C70 ; [.3488.0020.0002] # OL CHIKI LETTER EDD +1C71 ; [.3489.0020.0002] # OL CHIKI LETTER EN +1C72 ; [.348A.0020.0002] # OL CHIKI LETTER ERR +1C73 ; [.348B.0020.0002] # OL CHIKI LETTER LO +1C74 ; [.348C.0020.0002] # OL CHIKI LETTER OTT +1C75 ; [.348D.0020.0002] # OL CHIKI LETTER OB +1C76 ; [.348E.0020.0002] # OL CHIKI LETTER OV +1C77 ; [.348F.0020.0002] # OL CHIKI LETTER OH +1C78 ; [.3490.0020.0002] # OL CHIKI MU TTUDDAG +1C79 ; [.3491.0020.0002] # OL CHIKI GAAHLAA TTUDDAAG +1C7A ; [.3492.0020.0002] # OL CHIKI MU-GAAHLAA TTUDDAAG +1C7B ; [.3493.0020.0002] # OL CHIKI RELAA +1C7C ; [.3494.0020.0002] # OL CHIKI PHAARKAA +1C7D ; [.3495.0020.0002] # OL CHIKI AHAD +AB70 ; [.3496.0020.0002] # CHEROKEE SMALL LETTER A +13A0 ; [.3496.0020.0008] # CHEROKEE LETTER A +AB71 ; [.3497.0020.0002] # CHEROKEE SMALL LETTER E +13A1 ; [.3497.0020.0008] # CHEROKEE LETTER E +AB72 ; [.3498.0020.0002] # CHEROKEE SMALL LETTER I +13A2 ; [.3498.0020.0008] # CHEROKEE LETTER I +AB73 ; [.3499.0020.0002] # CHEROKEE SMALL LETTER O +13A3 ; [.3499.0020.0008] # CHEROKEE LETTER O +AB74 ; [.349A.0020.0002] # CHEROKEE SMALL LETTER U +13A4 ; [.349A.0020.0008] # CHEROKEE LETTER U +AB75 ; [.349B.0020.0002] # CHEROKEE SMALL LETTER V +13A5 ; [.349B.0020.0008] # CHEROKEE LETTER V +AB76 ; [.349C.0020.0002] # CHEROKEE SMALL LETTER GA +13A6 ; [.349C.0020.0008] # CHEROKEE LETTER GA +AB77 ; [.349D.0020.0002] # CHEROKEE SMALL LETTER KA +13A7 ; [.349D.0020.0008] # CHEROKEE LETTER KA +AB78 ; [.349E.0020.0002] # CHEROKEE SMALL LETTER GE +13A8 ; [.349E.0020.0008] # CHEROKEE LETTER GE +AB79 ; [.349F.0020.0002] # CHEROKEE SMALL LETTER GI +13A9 ; [.349F.0020.0008] # CHEROKEE LETTER GI +AB7A ; [.34A0.0020.0002] # CHEROKEE SMALL LETTER GO +13AA ; [.34A0.0020.0008] # CHEROKEE LETTER GO +AB7B ; [.34A1.0020.0002] # CHEROKEE SMALL LETTER GU +13AB ; [.34A1.0020.0008] # CHEROKEE LETTER GU +AB7C ; [.34A2.0020.0002] # CHEROKEE SMALL LETTER GV +13AC ; [.34A2.0020.0008] # CHEROKEE LETTER GV +AB7D ; [.34A3.0020.0002] # CHEROKEE SMALL LETTER HA +13AD ; [.34A3.0020.0008] # CHEROKEE LETTER HA +AB7E ; [.34A4.0020.0002] # CHEROKEE SMALL LETTER HE +13AE ; [.34A4.0020.0008] # CHEROKEE LETTER HE +AB7F ; [.34A5.0020.0002] # CHEROKEE SMALL LETTER HI +13AF ; [.34A5.0020.0008] # CHEROKEE LETTER HI +AB80 ; [.34A6.0020.0002] # CHEROKEE SMALL LETTER HO +13B0 ; [.34A6.0020.0008] # CHEROKEE LETTER HO +AB81 ; [.34A7.0020.0002] # CHEROKEE SMALL LETTER HU +13B1 ; [.34A7.0020.0008] # CHEROKEE LETTER HU +AB82 ; [.34A8.0020.0002] # CHEROKEE SMALL LETTER HV +13B2 ; [.34A8.0020.0008] # CHEROKEE LETTER HV +AB83 ; [.34A9.0020.0002] # CHEROKEE SMALL LETTER LA +13B3 ; [.34A9.0020.0008] # CHEROKEE LETTER LA +AB84 ; [.34AA.0020.0002] # CHEROKEE SMALL LETTER LE +13B4 ; [.34AA.0020.0008] # CHEROKEE LETTER LE +AB85 ; [.34AB.0020.0002] # CHEROKEE SMALL LETTER LI +13B5 ; [.34AB.0020.0008] # CHEROKEE LETTER LI +AB86 ; [.34AC.0020.0002] # CHEROKEE SMALL LETTER LO +13B6 ; [.34AC.0020.0008] # CHEROKEE LETTER LO +AB87 ; [.34AD.0020.0002] # CHEROKEE SMALL LETTER LU +13B7 ; [.34AD.0020.0008] # CHEROKEE LETTER LU +AB88 ; [.34AE.0020.0002] # CHEROKEE SMALL LETTER LV +13B8 ; [.34AE.0020.0008] # CHEROKEE LETTER LV +AB89 ; [.34AF.0020.0002] # CHEROKEE SMALL LETTER MA +13B9 ; [.34AF.0020.0008] # CHEROKEE LETTER MA +AB8A ; [.34B0.0020.0002] # CHEROKEE SMALL LETTER ME +13BA ; [.34B0.0020.0008] # CHEROKEE LETTER ME +AB8B ; [.34B1.0020.0002] # CHEROKEE SMALL LETTER MI +13BB ; [.34B1.0020.0008] # CHEROKEE LETTER MI +AB8C ; [.34B2.0020.0002] # CHEROKEE SMALL LETTER MO +13BC ; [.34B2.0020.0008] # CHEROKEE LETTER MO +AB8D ; [.34B3.0020.0002] # CHEROKEE SMALL LETTER MU +13BD ; [.34B3.0020.0008] # CHEROKEE LETTER MU +AB8E ; [.34B4.0020.0002] # CHEROKEE SMALL LETTER NA +13BE ; [.34B4.0020.0008] # CHEROKEE LETTER NA +AB8F ; [.34B5.0020.0002] # CHEROKEE SMALL LETTER HNA +13BF ; [.34B5.0020.0008] # CHEROKEE LETTER HNA +AB90 ; [.34B6.0020.0002] # CHEROKEE SMALL LETTER NAH +13C0 ; [.34B6.0020.0008] # CHEROKEE LETTER NAH +AB91 ; [.34B7.0020.0002] # CHEROKEE SMALL LETTER NE +13C1 ; [.34B7.0020.0008] # CHEROKEE LETTER NE +AB92 ; [.34B8.0020.0002] # CHEROKEE SMALL LETTER NI +13C2 ; [.34B8.0020.0008] # CHEROKEE LETTER NI +AB93 ; [.34B9.0020.0002] # CHEROKEE SMALL LETTER NO +13C3 ; [.34B9.0020.0008] # CHEROKEE LETTER NO +AB94 ; [.34BA.0020.0002] # CHEROKEE SMALL LETTER NU +13C4 ; [.34BA.0020.0008] # CHEROKEE LETTER NU +AB95 ; [.34BB.0020.0002] # CHEROKEE SMALL LETTER NV +13C5 ; [.34BB.0020.0008] # CHEROKEE LETTER NV +AB96 ; [.34BC.0020.0002] # CHEROKEE SMALL LETTER QUA +13C6 ; [.34BC.0020.0008] # CHEROKEE LETTER QUA +AB97 ; [.34BD.0020.0002] # CHEROKEE SMALL LETTER QUE +13C7 ; [.34BD.0020.0008] # CHEROKEE LETTER QUE +AB98 ; [.34BE.0020.0002] # CHEROKEE SMALL LETTER QUI +13C8 ; [.34BE.0020.0008] # CHEROKEE LETTER QUI +AB99 ; [.34BF.0020.0002] # CHEROKEE SMALL LETTER QUO +13C9 ; [.34BF.0020.0008] # CHEROKEE LETTER QUO +AB9A ; [.34C0.0020.0002] # CHEROKEE SMALL LETTER QUU +13CA ; [.34C0.0020.0008] # CHEROKEE LETTER QUU +AB9B ; [.34C1.0020.0002] # CHEROKEE SMALL LETTER QUV +13CB ; [.34C1.0020.0008] # CHEROKEE LETTER QUV +AB9C ; [.34C2.0020.0002] # CHEROKEE SMALL LETTER SA +13CC ; [.34C2.0020.0008] # CHEROKEE LETTER SA +AB9D ; [.34C3.0020.0002] # CHEROKEE SMALL LETTER S +13CD ; [.34C3.0020.0008] # CHEROKEE LETTER S +AB9E ; [.34C4.0020.0002] # CHEROKEE SMALL LETTER SE +13CE ; [.34C4.0020.0008] # CHEROKEE LETTER SE +AB9F ; [.34C5.0020.0002] # CHEROKEE SMALL LETTER SI +13CF ; [.34C5.0020.0008] # CHEROKEE LETTER SI +ABA0 ; [.34C6.0020.0002] # CHEROKEE SMALL LETTER SO +13D0 ; [.34C6.0020.0008] # CHEROKEE LETTER SO +ABA1 ; [.34C7.0020.0002] # CHEROKEE SMALL LETTER SU +13D1 ; [.34C7.0020.0008] # CHEROKEE LETTER SU +ABA2 ; [.34C8.0020.0002] # CHEROKEE SMALL LETTER SV +13D2 ; [.34C8.0020.0008] # CHEROKEE LETTER SV +ABA3 ; [.34C9.0020.0002] # CHEROKEE SMALL LETTER DA +13D3 ; [.34C9.0020.0008] # CHEROKEE LETTER DA +ABA4 ; [.34CA.0020.0002] # CHEROKEE SMALL LETTER TA +13D4 ; [.34CA.0020.0008] # CHEROKEE LETTER TA +ABA5 ; [.34CB.0020.0002] # CHEROKEE SMALL LETTER DE +13D5 ; [.34CB.0020.0008] # CHEROKEE LETTER DE +ABA6 ; [.34CC.0020.0002] # CHEROKEE SMALL LETTER TE +13D6 ; [.34CC.0020.0008] # CHEROKEE LETTER TE +ABA7 ; [.34CD.0020.0002] # CHEROKEE SMALL LETTER DI +13D7 ; [.34CD.0020.0008] # CHEROKEE LETTER DI +ABA8 ; [.34CE.0020.0002] # CHEROKEE SMALL LETTER TI +13D8 ; [.34CE.0020.0008] # CHEROKEE LETTER TI +ABA9 ; [.34CF.0020.0002] # CHEROKEE SMALL LETTER DO +13D9 ; [.34CF.0020.0008] # CHEROKEE LETTER DO +ABAA ; [.34D0.0020.0002] # CHEROKEE SMALL LETTER DU +13DA ; [.34D0.0020.0008] # CHEROKEE LETTER DU +ABAB ; [.34D1.0020.0002] # CHEROKEE SMALL LETTER DV +13DB ; [.34D1.0020.0008] # CHEROKEE LETTER DV +ABAC ; [.34D2.0020.0002] # CHEROKEE SMALL LETTER DLA +13DC ; [.34D2.0020.0008] # CHEROKEE LETTER DLA +ABAD ; [.34D3.0020.0002] # CHEROKEE SMALL LETTER TLA +13DD ; [.34D3.0020.0008] # CHEROKEE LETTER TLA +ABAE ; [.34D4.0020.0002] # CHEROKEE SMALL LETTER TLE +13DE ; [.34D4.0020.0008] # CHEROKEE LETTER TLE +ABAF ; [.34D5.0020.0002] # CHEROKEE SMALL LETTER TLI +13DF ; [.34D5.0020.0008] # CHEROKEE LETTER TLI +ABB0 ; [.34D6.0020.0002] # CHEROKEE SMALL LETTER TLO +13E0 ; [.34D6.0020.0008] # CHEROKEE LETTER TLO +ABB1 ; [.34D7.0020.0002] # CHEROKEE SMALL LETTER TLU +13E1 ; [.34D7.0020.0008] # CHEROKEE LETTER TLU +ABB2 ; [.34D8.0020.0002] # CHEROKEE SMALL LETTER TLV +13E2 ; [.34D8.0020.0008] # CHEROKEE LETTER TLV +ABB3 ; [.34D9.0020.0002] # CHEROKEE SMALL LETTER TSA +13E3 ; [.34D9.0020.0008] # CHEROKEE LETTER TSA +ABB4 ; [.34DA.0020.0002] # CHEROKEE SMALL LETTER TSE +13E4 ; [.34DA.0020.0008] # CHEROKEE LETTER TSE +ABB5 ; [.34DB.0020.0002] # CHEROKEE SMALL LETTER TSI +13E5 ; [.34DB.0020.0008] # CHEROKEE LETTER TSI +ABB6 ; [.34DC.0020.0002] # CHEROKEE SMALL LETTER TSO +13E6 ; [.34DC.0020.0008] # CHEROKEE LETTER TSO +ABB7 ; [.34DD.0020.0002] # CHEROKEE SMALL LETTER TSU +13E7 ; [.34DD.0020.0008] # CHEROKEE LETTER TSU +ABB8 ; [.34DE.0020.0002] # CHEROKEE SMALL LETTER TSV +13E8 ; [.34DE.0020.0008] # CHEROKEE LETTER TSV +ABB9 ; [.34DF.0020.0002] # CHEROKEE SMALL LETTER WA +13E9 ; [.34DF.0020.0008] # CHEROKEE LETTER WA +ABBA ; [.34E0.0020.0002] # CHEROKEE SMALL LETTER WE +13EA ; [.34E0.0020.0008] # CHEROKEE LETTER WE +ABBB ; [.34E1.0020.0002] # CHEROKEE SMALL LETTER WI +13EB ; [.34E1.0020.0008] # CHEROKEE LETTER WI +ABBC ; [.34E2.0020.0002] # CHEROKEE SMALL LETTER WO +13EC ; [.34E2.0020.0008] # CHEROKEE LETTER WO +ABBD ; [.34E3.0020.0002] # CHEROKEE SMALL LETTER WU +13ED ; [.34E3.0020.0008] # CHEROKEE LETTER WU +ABBE ; [.34E4.0020.0002] # CHEROKEE SMALL LETTER WV +13EE ; [.34E4.0020.0008] # CHEROKEE LETTER WV +ABBF ; [.34E5.0020.0002] # CHEROKEE SMALL LETTER YA +13EF ; [.34E5.0020.0008] # CHEROKEE LETTER YA +13F8 ; [.34E6.0020.0002] # CHEROKEE SMALL LETTER YE +13F0 ; [.34E6.0020.0008] # CHEROKEE LETTER YE +13F9 ; [.34E7.0020.0002] # CHEROKEE SMALL LETTER YI +13F1 ; [.34E7.0020.0008] # CHEROKEE LETTER YI +13FA ; [.34E8.0020.0002] # CHEROKEE SMALL LETTER YO +13F2 ; [.34E8.0020.0008] # CHEROKEE LETTER YO +13FB ; [.34E9.0020.0002] # CHEROKEE SMALL LETTER YU +13F3 ; [.34E9.0020.0008] # CHEROKEE LETTER YU +13FC ; [.34EA.0020.0002] # CHEROKEE SMALL LETTER YV +13F4 ; [.34EA.0020.0008] # CHEROKEE LETTER YV +13FD ; [.34EB.0020.0002] # CHEROKEE SMALL LETTER MV +13F5 ; [.34EB.0020.0008] # CHEROKEE LETTER MV +104D8 ; [.34EC.0020.0002] # OSAGE SMALL LETTER A +104B0 ; [.34EC.0020.0008] # OSAGE CAPITAL LETTER A +104D9 ; [.34ED.0020.0002] # OSAGE SMALL LETTER AI +104B1 ; [.34ED.0020.0008] # OSAGE CAPITAL LETTER AI +104DA ; [.34EE.0020.0002] # OSAGE SMALL LETTER AIN +104B2 ; [.34EE.0020.0008] # OSAGE CAPITAL LETTER AIN +104DB ; [.34EF.0020.0002] # OSAGE SMALL LETTER AH +104B3 ; [.34EF.0020.0008] # OSAGE CAPITAL LETTER AH +104DC ; [.34F0.0020.0002] # OSAGE SMALL LETTER BRA +104B4 ; [.34F0.0020.0008] # OSAGE CAPITAL LETTER BRA +104DD ; [.34F1.0020.0002] # OSAGE SMALL LETTER CHA +104B5 ; [.34F1.0020.0008] # OSAGE CAPITAL LETTER CHA +104DE ; [.34F2.0020.0002] # OSAGE SMALL LETTER EHCHA +104B6 ; [.34F2.0020.0008] # OSAGE CAPITAL LETTER EHCHA +104DF ; [.34F3.0020.0002] # OSAGE SMALL LETTER E +104B7 ; [.34F3.0020.0008] # OSAGE CAPITAL LETTER E +104E0 ; [.34F4.0020.0002] # OSAGE SMALL LETTER EIN +104B8 ; [.34F4.0020.0008] # OSAGE CAPITAL LETTER EIN +104E1 ; [.34F5.0020.0002] # OSAGE SMALL LETTER HA +104B9 ; [.34F5.0020.0008] # OSAGE CAPITAL LETTER HA +104E2 ; [.34F6.0020.0002] # OSAGE SMALL LETTER HYA +104BA ; [.34F6.0020.0008] # OSAGE CAPITAL LETTER HYA +104E3 ; [.34F7.0020.0002] # OSAGE SMALL LETTER I +104BB ; [.34F7.0020.0008] # OSAGE CAPITAL LETTER I +104E4 ; [.34F8.0020.0002] # OSAGE SMALL LETTER KA +104BC ; [.34F8.0020.0008] # OSAGE CAPITAL LETTER KA +104E5 ; [.34F9.0020.0002] # OSAGE SMALL LETTER EHKA +104BD ; [.34F9.0020.0008] # OSAGE CAPITAL LETTER EHKA +104E6 ; [.34FA.0020.0002] # OSAGE SMALL LETTER KYA +104BE ; [.34FA.0020.0008] # OSAGE CAPITAL LETTER KYA +104E7 ; [.34FB.0020.0002] # OSAGE SMALL LETTER LA +104BF ; [.34FB.0020.0008] # OSAGE CAPITAL LETTER LA +104E8 ; [.34FC.0020.0002] # OSAGE SMALL LETTER MA +104C0 ; [.34FC.0020.0008] # OSAGE CAPITAL LETTER MA +104E9 ; [.34FD.0020.0002] # OSAGE SMALL LETTER NA +104C1 ; [.34FD.0020.0008] # OSAGE CAPITAL LETTER NA +104EA ; [.34FE.0020.0002] # OSAGE SMALL LETTER O +104C2 ; [.34FE.0020.0008] # OSAGE CAPITAL LETTER O +104EB ; [.34FF.0020.0002] # OSAGE SMALL LETTER OIN +104C3 ; [.34FF.0020.0008] # OSAGE CAPITAL LETTER OIN +104EC ; [.3500.0020.0002] # OSAGE SMALL LETTER PA +104C4 ; [.3500.0020.0008] # OSAGE CAPITAL LETTER PA +104ED ; [.3501.0020.0002] # OSAGE SMALL LETTER EHPA +104C5 ; [.3501.0020.0008] # OSAGE CAPITAL LETTER EHPA +104EE ; [.3502.0020.0002] # OSAGE SMALL LETTER SA +104C6 ; [.3502.0020.0008] # OSAGE CAPITAL LETTER SA +104EF ; [.3503.0020.0002] # OSAGE SMALL LETTER SHA +104C7 ; [.3503.0020.0008] # OSAGE CAPITAL LETTER SHA +104F0 ; [.3504.0020.0002] # OSAGE SMALL LETTER TA +104C8 ; [.3504.0020.0008] # OSAGE CAPITAL LETTER TA +104F1 ; [.3505.0020.0002] # OSAGE SMALL LETTER EHTA +104C9 ; [.3505.0020.0008] # OSAGE CAPITAL LETTER EHTA +104F2 ; [.3506.0020.0002] # OSAGE SMALL LETTER TSA +104CA ; [.3506.0020.0008] # OSAGE CAPITAL LETTER TSA +104F3 ; [.3507.0020.0002] # OSAGE SMALL LETTER EHTSA +104CB ; [.3507.0020.0008] # OSAGE CAPITAL LETTER EHTSA +104F4 ; [.3508.0020.0002] # OSAGE SMALL LETTER TSHA +104CC ; [.3508.0020.0008] # OSAGE CAPITAL LETTER TSHA +104F5 ; [.3509.0020.0002] # OSAGE SMALL LETTER DHA +104CD ; [.3509.0020.0008] # OSAGE CAPITAL LETTER DHA +104F6 ; [.350A.0020.0002] # OSAGE SMALL LETTER U +104CE ; [.350A.0020.0008] # OSAGE CAPITAL LETTER U +104F7 ; [.350B.0020.0002] # OSAGE SMALL LETTER WA +104CF ; [.350B.0020.0008] # OSAGE CAPITAL LETTER WA +104F8 ; [.350C.0020.0002] # OSAGE SMALL LETTER KHA +104D0 ; [.350C.0020.0008] # OSAGE CAPITAL LETTER KHA +104F9 ; [.350D.0020.0002] # OSAGE SMALL LETTER GHA +104D1 ; [.350D.0020.0008] # OSAGE CAPITAL LETTER GHA +104FA ; [.350E.0020.0002] # OSAGE SMALL LETTER ZA +104D2 ; [.350E.0020.0008] # OSAGE CAPITAL LETTER ZA +104FB ; [.350F.0020.0002] # OSAGE SMALL LETTER ZHA +104D3 ; [.350F.0020.0008] # OSAGE CAPITAL LETTER ZHA +1401 ; [.3510.0020.0002] # CANADIAN SYLLABICS E +1402 ; [.3511.0020.0002] # CANADIAN SYLLABICS AAI +1403 ; [.3512.0020.0002] # CANADIAN SYLLABICS I +1404 ; [.3513.0020.0002] # CANADIAN SYLLABICS II +1405 ; [.3514.0020.0002] # CANADIAN SYLLABICS O +1406 ; [.3515.0020.0002] # CANADIAN SYLLABICS OO +1407 ; [.3516.0020.0002] # CANADIAN SYLLABICS Y-CREE OO +1408 ; [.3517.0020.0002] # CANADIAN SYLLABICS CARRIER EE +1409 ; [.3518.0020.0002] # CANADIAN SYLLABICS CARRIER I +140A ; [.3519.0020.0002] # CANADIAN SYLLABICS A +140B ; [.351A.0020.0002] # CANADIAN SYLLABICS AA +140C ; [.351B.0020.0002] # CANADIAN SYLLABICS WE +140D ; [.351C.0020.0002] # CANADIAN SYLLABICS WEST-CREE WE +140E ; [.351D.0020.0002] # CANADIAN SYLLABICS WI +140F ; [.351E.0020.0002] # CANADIAN SYLLABICS WEST-CREE WI +1410 ; [.351F.0020.0002] # CANADIAN SYLLABICS WII +1411 ; [.3520.0020.0002] # CANADIAN SYLLABICS WEST-CREE WII +1412 ; [.3521.0020.0002] # CANADIAN SYLLABICS WO +1413 ; [.3522.0020.0002] # CANADIAN SYLLABICS WEST-CREE WO +1414 ; [.3523.0020.0002] # CANADIAN SYLLABICS WOO +1415 ; [.3524.0020.0002] # CANADIAN SYLLABICS WEST-CREE WOO +1416 ; [.3525.0020.0002] # CANADIAN SYLLABICS NASKAPI WOO +1417 ; [.3526.0020.0002] # CANADIAN SYLLABICS WA +1418 ; [.3527.0020.0002] # CANADIAN SYLLABICS WEST-CREE WA +1419 ; [.3528.0020.0002] # CANADIAN SYLLABICS WAA +141A ; [.3529.0020.0002] # CANADIAN SYLLABICS WEST-CREE WAA +141B ; [.352A.0020.0002] # CANADIAN SYLLABICS NASKAPI WAA +141C ; [.352B.0020.0002] # CANADIAN SYLLABICS AI +141D ; [.352C.0020.0002] # CANADIAN SYLLABICS Y-CREE W +141E ; [.352D.0020.0002] # CANADIAN SYLLABICS GLOTTAL STOP +141F ; [.352E.0020.0002] # CANADIAN SYLLABICS FINAL ACUTE +1420 ; [.352F.0020.0002] # CANADIAN SYLLABICS FINAL GRAVE +1421 ; [.3530.0020.0002] # CANADIAN SYLLABICS FINAL BOTTOM HALF RING +1422 ; [.3531.0020.0002] # CANADIAN SYLLABICS FINAL TOP HALF RING +1423 ; [.3532.0020.0002] # CANADIAN SYLLABICS FINAL RIGHT HALF RING +1424 ; [.3533.0020.0002] # CANADIAN SYLLABICS FINAL RING +1425 ; [.3534.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE ACUTE +1426 ; [.3535.0020.0002] # CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES +1427 ; [.3536.0020.0002] # CANADIAN SYLLABICS FINAL MIDDLE DOT +1428 ; [.3537.0020.0002] # CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE +1429 ; [.3538.0020.0002] # CANADIAN SYLLABICS FINAL PLUS +142A ; [.3539.0020.0002] # CANADIAN SYLLABICS FINAL DOWN TACK +142B ; [.353A.0020.0002] # CANADIAN SYLLABICS EN +142C ; [.353B.0020.0002] # CANADIAN SYLLABICS IN +142D ; [.353C.0020.0002] # CANADIAN SYLLABICS ON +142E ; [.353D.0020.0002] # CANADIAN SYLLABICS AN +142F ; [.353E.0020.0002] # CANADIAN SYLLABICS PE +1430 ; [.353F.0020.0002] # CANADIAN SYLLABICS PAAI +1431 ; [.3540.0020.0002] # CANADIAN SYLLABICS PI +1432 ; [.3541.0020.0002] # CANADIAN SYLLABICS PII +1433 ; [.3542.0020.0002] # CANADIAN SYLLABICS PO +1434 ; [.3543.0020.0002] # CANADIAN SYLLABICS POO +1435 ; [.3544.0020.0002] # CANADIAN SYLLABICS Y-CREE POO +1436 ; [.3545.0020.0002] # CANADIAN SYLLABICS CARRIER HEE +1437 ; [.3546.0020.0002] # CANADIAN SYLLABICS CARRIER HI +1438 ; [.3547.0020.0002] # CANADIAN SYLLABICS PA +1439 ; [.3548.0020.0002] # CANADIAN SYLLABICS PAA +143A ; [.3549.0020.0002] # CANADIAN SYLLABICS PWE +143B ; [.354A.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWE +143C ; [.354B.0020.0002] # CANADIAN SYLLABICS PWI +143D ; [.354C.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWI +143E ; [.354D.0020.0002] # CANADIAN SYLLABICS PWII +143F ; [.354E.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWII +1440 ; [.354F.0020.0002] # CANADIAN SYLLABICS PWO +1441 ; [.3550.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWO +1442 ; [.3551.0020.0002] # CANADIAN SYLLABICS PWOO +1443 ; [.3552.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWOO +1444 ; [.3553.0020.0002] # CANADIAN SYLLABICS PWA +1445 ; [.3554.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWA +1446 ; [.3555.0020.0002] # CANADIAN SYLLABICS PWAA +1447 ; [.3556.0020.0002] # CANADIAN SYLLABICS WEST-CREE PWAA +1448 ; [.3557.0020.0002] # CANADIAN SYLLABICS Y-CREE PWAA +1449 ; [.3558.0020.0002] # CANADIAN SYLLABICS P +144A ; [.3559.0020.0002] # CANADIAN SYLLABICS WEST-CREE P +144B ; [.355A.0020.0002] # CANADIAN SYLLABICS CARRIER H +144C ; [.355B.0020.0002] # CANADIAN SYLLABICS TE +144D ; [.355C.0020.0002] # CANADIAN SYLLABICS TAAI +144E ; [.355D.0020.0002] # CANADIAN SYLLABICS TI +144F ; [.355E.0020.0002] # CANADIAN SYLLABICS TII +1450 ; [.355F.0020.0002] # CANADIAN SYLLABICS TO +1451 ; [.3560.0020.0002] # CANADIAN SYLLABICS TOO +1452 ; [.3561.0020.0002] # CANADIAN SYLLABICS Y-CREE TOO +1453 ; [.3562.0020.0002] # CANADIAN SYLLABICS CARRIER DEE +1454 ; [.3563.0020.0002] # CANADIAN SYLLABICS CARRIER DI +1455 ; [.3564.0020.0002] # CANADIAN SYLLABICS TA +1456 ; [.3565.0020.0002] # CANADIAN SYLLABICS TAA +1457 ; [.3566.0020.0002] # CANADIAN SYLLABICS TWE +1458 ; [.3567.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWE +1459 ; [.3568.0020.0002] # CANADIAN SYLLABICS TWI +145A ; [.3569.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWI +145B ; [.356A.0020.0002] # CANADIAN SYLLABICS TWII +145C ; [.356B.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWII +145D ; [.356C.0020.0002] # CANADIAN SYLLABICS TWO +145E ; [.356D.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWO +145F ; [.356E.0020.0002] # CANADIAN SYLLABICS TWOO +1460 ; [.356F.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWOO +1461 ; [.3570.0020.0002] # CANADIAN SYLLABICS TWA +1462 ; [.3571.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWA +1463 ; [.3572.0020.0002] # CANADIAN SYLLABICS TWAA +1464 ; [.3573.0020.0002] # CANADIAN SYLLABICS WEST-CREE TWAA +1465 ; [.3574.0020.0002] # CANADIAN SYLLABICS NASKAPI TWAA +1466 ; [.3575.0020.0002] # CANADIAN SYLLABICS T +1467 ; [.3576.0020.0002] # CANADIAN SYLLABICS TTE +1468 ; [.3577.0020.0002] # CANADIAN SYLLABICS TTI +1469 ; [.3578.0020.0002] # CANADIAN SYLLABICS TTO +146A ; [.3579.0020.0002] # CANADIAN SYLLABICS TTA +146B ; [.357A.0020.0002] # CANADIAN SYLLABICS KE +146C ; [.357B.0020.0002] # CANADIAN SYLLABICS KAAI +146D ; [.357C.0020.0002] # CANADIAN SYLLABICS KI +146E ; [.357D.0020.0002] # CANADIAN SYLLABICS KII +146F ; [.357E.0020.0002] # CANADIAN SYLLABICS KO +1470 ; [.357F.0020.0002] # CANADIAN SYLLABICS KOO +1471 ; [.3580.0020.0002] # CANADIAN SYLLABICS Y-CREE KOO +1472 ; [.3581.0020.0002] # CANADIAN SYLLABICS KA +1473 ; [.3582.0020.0002] # CANADIAN SYLLABICS KAA +1474 ; [.3583.0020.0002] # CANADIAN SYLLABICS KWE +1475 ; [.3584.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWE +1476 ; [.3585.0020.0002] # CANADIAN SYLLABICS KWI +1477 ; [.3586.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWI +1478 ; [.3587.0020.0002] # CANADIAN SYLLABICS KWII +1479 ; [.3588.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWII +147A ; [.3589.0020.0002] # CANADIAN SYLLABICS KWO +147B ; [.358A.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWO +147C ; [.358B.0020.0002] # CANADIAN SYLLABICS KWOO +147D ; [.358C.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWOO +147E ; [.358D.0020.0002] # CANADIAN SYLLABICS KWA +147F ; [.358E.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWA +1480 ; [.358F.0020.0002] # CANADIAN SYLLABICS KWAA +1481 ; [.3590.0020.0002] # CANADIAN SYLLABICS WEST-CREE KWAA +1482 ; [.3591.0020.0002] # CANADIAN SYLLABICS NASKAPI KWAA +1483 ; [.3592.0020.0002] # CANADIAN SYLLABICS K +1484 ; [.3593.0020.0002] # CANADIAN SYLLABICS KW +1485 ; [.3594.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KEH +1486 ; [.3595.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KIH +1487 ; [.3596.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KOH +1488 ; [.3597.0020.0002] # CANADIAN SYLLABICS SOUTH-SLAVEY KAH +1489 ; [.3598.0020.0002] # CANADIAN SYLLABICS CE +148A ; [.3599.0020.0002] # CANADIAN SYLLABICS CAAI +148B ; [.359A.0020.0002] # CANADIAN SYLLABICS CI +148C ; [.359B.0020.0002] # CANADIAN SYLLABICS CII +148D ; [.359C.0020.0002] # CANADIAN SYLLABICS CO +148E ; [.359D.0020.0002] # CANADIAN SYLLABICS COO +148F ; [.359E.0020.0002] # CANADIAN SYLLABICS Y-CREE COO +1490 ; [.359F.0020.0002] # CANADIAN SYLLABICS CA +1491 ; [.35A0.0020.0002] # CANADIAN SYLLABICS CAA +1492 ; [.35A1.0020.0002] # CANADIAN SYLLABICS CWE +1493 ; [.35A2.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWE +1494 ; [.35A3.0020.0002] # CANADIAN SYLLABICS CWI +1495 ; [.35A4.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWI +1496 ; [.35A5.0020.0002] # CANADIAN SYLLABICS CWII +1497 ; [.35A6.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWII +1498 ; [.35A7.0020.0002] # CANADIAN SYLLABICS CWO +1499 ; [.35A8.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWO +149A ; [.35A9.0020.0002] # CANADIAN SYLLABICS CWOO +149B ; [.35AA.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWOO +149C ; [.35AB.0020.0002] # CANADIAN SYLLABICS CWA +149D ; [.35AC.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWA +149E ; [.35AD.0020.0002] # CANADIAN SYLLABICS CWAA +149F ; [.35AE.0020.0002] # CANADIAN SYLLABICS WEST-CREE CWAA +14A0 ; [.35AF.0020.0002] # CANADIAN SYLLABICS NASKAPI CWAA +14A1 ; [.35B0.0020.0002] # CANADIAN SYLLABICS C +14A2 ; [.35B1.0020.0002] # CANADIAN SYLLABICS SAYISI TH +14A3 ; [.35B2.0020.0002] # CANADIAN SYLLABICS ME +14A4 ; [.35B3.0020.0002] # CANADIAN SYLLABICS MAAI +14A5 ; [.35B4.0020.0002] # CANADIAN SYLLABICS MI +14A6 ; [.35B5.0020.0002] # CANADIAN SYLLABICS MII +14A7 ; [.35B6.0020.0002] # CANADIAN SYLLABICS MO +14A8 ; [.35B7.0020.0002] # CANADIAN SYLLABICS MOO +14A9 ; [.35B8.0020.0002] # CANADIAN SYLLABICS Y-CREE MOO +14AA ; [.35B9.0020.0002] # CANADIAN SYLLABICS MA +14AB ; [.35BA.0020.0002] # CANADIAN SYLLABICS MAA +14AC ; [.35BB.0020.0002] # CANADIAN SYLLABICS MWE +14AD ; [.35BC.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWE +14AE ; [.35BD.0020.0002] # CANADIAN SYLLABICS MWI +14AF ; [.35BE.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWI +14B0 ; [.35BF.0020.0002] # CANADIAN SYLLABICS MWII +14B1 ; [.35C0.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWII +14B2 ; [.35C1.0020.0002] # CANADIAN SYLLABICS MWO +14B3 ; [.35C2.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWO +14B4 ; [.35C3.0020.0002] # CANADIAN SYLLABICS MWOO +14B5 ; [.35C4.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWOO +14B6 ; [.35C5.0020.0002] # CANADIAN SYLLABICS MWA +14B7 ; [.35C6.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWA +14B8 ; [.35C7.0020.0002] # CANADIAN SYLLABICS MWAA +14B9 ; [.35C8.0020.0002] # CANADIAN SYLLABICS WEST-CREE MWAA +14BA ; [.35C9.0020.0002] # CANADIAN SYLLABICS NASKAPI MWAA +14BB ; [.35CA.0020.0002] # CANADIAN SYLLABICS M +14BC ; [.35CB.0020.0002] # CANADIAN SYLLABICS WEST-CREE M +14BD ; [.35CC.0020.0002] # CANADIAN SYLLABICS MH +14BE ; [.35CD.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN M +14BF ; [.35CE.0020.0002] # CANADIAN SYLLABICS SAYISI M +14C0 ; [.35CF.0020.0002] # CANADIAN SYLLABICS NE +14C1 ; [.35D0.0020.0002] # CANADIAN SYLLABICS NAAI +14C2 ; [.35D1.0020.0002] # CANADIAN SYLLABICS NI +14C3 ; [.35D2.0020.0002] # CANADIAN SYLLABICS NII +14C4 ; [.35D3.0020.0002] # CANADIAN SYLLABICS NO +14C5 ; [.35D4.0020.0002] # CANADIAN SYLLABICS NOO +14C6 ; [.35D5.0020.0002] # CANADIAN SYLLABICS Y-CREE NOO +14C7 ; [.35D6.0020.0002] # CANADIAN SYLLABICS NA +14C8 ; [.35D7.0020.0002] # CANADIAN SYLLABICS NAA +14C9 ; [.35D8.0020.0002] # CANADIAN SYLLABICS NWE +14CA ; [.35D9.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWE +14CB ; [.35DA.0020.0002] # CANADIAN SYLLABICS NWA +14CC ; [.35DB.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWA +14CD ; [.35DC.0020.0002] # CANADIAN SYLLABICS NWAA +14CE ; [.35DD.0020.0002] # CANADIAN SYLLABICS WEST-CREE NWAA +14CF ; [.35DE.0020.0002] # CANADIAN SYLLABICS NASKAPI NWAA +14D0 ; [.35DF.0020.0002] # CANADIAN SYLLABICS N +14D1 ; [.35E0.0020.0002] # CANADIAN SYLLABICS CARRIER NG +14D2 ; [.35E1.0020.0002] # CANADIAN SYLLABICS NH +14D3 ; [.35E2.0020.0002] # CANADIAN SYLLABICS LE +14D4 ; [.35E3.0020.0002] # CANADIAN SYLLABICS LAAI +14D5 ; [.35E4.0020.0002] # CANADIAN SYLLABICS LI +14D6 ; [.35E5.0020.0002] # CANADIAN SYLLABICS LII +14D7 ; [.35E6.0020.0002] # CANADIAN SYLLABICS LO +14D8 ; [.35E7.0020.0002] # CANADIAN SYLLABICS LOO +14D9 ; [.35E8.0020.0002] # CANADIAN SYLLABICS Y-CREE LOO +14DA ; [.35E9.0020.0002] # CANADIAN SYLLABICS LA +14DB ; [.35EA.0020.0002] # CANADIAN SYLLABICS LAA +14DC ; [.35EB.0020.0002] # CANADIAN SYLLABICS LWE +14DD ; [.35EC.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWE +14DE ; [.35ED.0020.0002] # CANADIAN SYLLABICS LWI +14DF ; [.35EE.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWI +14E0 ; [.35EF.0020.0002] # CANADIAN SYLLABICS LWII +14E1 ; [.35F0.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWII +14E2 ; [.35F1.0020.0002] # CANADIAN SYLLABICS LWO +14E3 ; [.35F2.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWO +14E4 ; [.35F3.0020.0002] # CANADIAN SYLLABICS LWOO +14E5 ; [.35F4.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWOO +14E6 ; [.35F5.0020.0002] # CANADIAN SYLLABICS LWA +14E7 ; [.35F6.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWA +14E8 ; [.35F7.0020.0002] # CANADIAN SYLLABICS LWAA +14E9 ; [.35F8.0020.0002] # CANADIAN SYLLABICS WEST-CREE LWAA +14EA ; [.35F9.0020.0002] # CANADIAN SYLLABICS L +14EB ; [.35FA.0020.0002] # CANADIAN SYLLABICS WEST-CREE L +14EC ; [.35FB.0020.0002] # CANADIAN SYLLABICS MEDIAL L +14ED ; [.35FC.0020.0002] # CANADIAN SYLLABICS SE +14EE ; [.35FD.0020.0002] # CANADIAN SYLLABICS SAAI +14EF ; [.35FE.0020.0002] # CANADIAN SYLLABICS SI +14F0 ; [.35FF.0020.0002] # CANADIAN SYLLABICS SII +14F1 ; [.3600.0020.0002] # CANADIAN SYLLABICS SO +14F2 ; [.3601.0020.0002] # CANADIAN SYLLABICS SOO +14F3 ; [.3602.0020.0002] # CANADIAN SYLLABICS Y-CREE SOO +14F4 ; [.3603.0020.0002] # CANADIAN SYLLABICS SA +14F5 ; [.3604.0020.0002] # CANADIAN SYLLABICS SAA +14F6 ; [.3605.0020.0002] # CANADIAN SYLLABICS SWE +14F7 ; [.3606.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWE +14F8 ; [.3607.0020.0002] # CANADIAN SYLLABICS SWI +14F9 ; [.3608.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWI +14FA ; [.3609.0020.0002] # CANADIAN SYLLABICS SWII +14FB ; [.360A.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWII +14FC ; [.360B.0020.0002] # CANADIAN SYLLABICS SWO +14FD ; [.360C.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWO +14FE ; [.360D.0020.0002] # CANADIAN SYLLABICS SWOO +14FF ; [.360E.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWOO +1500 ; [.360F.0020.0002] # CANADIAN SYLLABICS SWA +1501 ; [.3610.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWA +1502 ; [.3611.0020.0002] # CANADIAN SYLLABICS SWAA +1503 ; [.3612.0020.0002] # CANADIAN SYLLABICS WEST-CREE SWAA +1504 ; [.3613.0020.0002] # CANADIAN SYLLABICS NASKAPI SWAA +1505 ; [.3614.0020.0002] # CANADIAN SYLLABICS S +1506 ; [.3615.0020.0002] # CANADIAN SYLLABICS ATHAPASCAN S +1507 ; [.3616.0020.0002] # CANADIAN SYLLABICS SW +1508 ; [.3617.0020.0002] # CANADIAN SYLLABICS BLACKFOOT S +1509 ; [.3618.0020.0002] # CANADIAN SYLLABICS MOOSE-CREE SK +150A ; [.3619.0020.0002] # CANADIAN SYLLABICS NASKAPI SKW +150B ; [.361A.0020.0002] # CANADIAN SYLLABICS NASKAPI S-W +150C ; [.361B.0020.0002] # CANADIAN SYLLABICS NASKAPI SPWA +150D ; [.361C.0020.0002] # CANADIAN SYLLABICS NASKAPI STWA +150E ; [.361D.0020.0002] # CANADIAN SYLLABICS NASKAPI SKWA +150F ; [.361E.0020.0002] # CANADIAN SYLLABICS NASKAPI SCWA +1510 ; [.361F.0020.0002] # CANADIAN SYLLABICS SHE +1511 ; [.3620.0020.0002] # CANADIAN SYLLABICS SHI +1512 ; [.3621.0020.0002] # CANADIAN SYLLABICS SHII +1513 ; [.3622.0020.0002] # CANADIAN SYLLABICS SHO +1514 ; [.3623.0020.0002] # CANADIAN SYLLABICS SHOO +1515 ; [.3624.0020.0002] # CANADIAN SYLLABICS SHA +1516 ; [.3625.0020.0002] # CANADIAN SYLLABICS SHAA +1517 ; [.3626.0020.0002] # CANADIAN SYLLABICS SHWE +1518 ; [.3627.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWE +1519 ; [.3628.0020.0002] # CANADIAN SYLLABICS SHWI +151A ; [.3629.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWI +151B ; [.362A.0020.0002] # CANADIAN SYLLABICS SHWII +151C ; [.362B.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWII +151D ; [.362C.0020.0002] # CANADIAN SYLLABICS SHWO +151E ; [.362D.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWO +151F ; [.362E.0020.0002] # CANADIAN SYLLABICS SHWOO +1520 ; [.362F.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWOO +1521 ; [.3630.0020.0002] # CANADIAN SYLLABICS SHWA +1522 ; [.3631.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWA +1523 ; [.3632.0020.0002] # CANADIAN SYLLABICS SHWAA +1524 ; [.3633.0020.0002] # CANADIAN SYLLABICS WEST-CREE SHWAA +1525 ; [.3634.0020.0002] # CANADIAN SYLLABICS SH +1526 ; [.3635.0020.0002] # CANADIAN SYLLABICS YE +1527 ; [.3636.0020.0002] # CANADIAN SYLLABICS YAAI +1528 ; [.3637.0020.0002] # CANADIAN SYLLABICS YI +1529 ; [.3638.0020.0002] # CANADIAN SYLLABICS YII +152A ; [.3639.0020.0002] # CANADIAN SYLLABICS YO +152B ; [.363A.0020.0002] # CANADIAN SYLLABICS YOO +152C ; [.363B.0020.0002] # CANADIAN SYLLABICS Y-CREE YOO +152D ; [.363C.0020.0002] # CANADIAN SYLLABICS YA +152E ; [.363D.0020.0002] # CANADIAN SYLLABICS YAA +152F ; [.363E.0020.0002] # CANADIAN SYLLABICS YWE +1530 ; [.363F.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWE +1531 ; [.3640.0020.0002] # CANADIAN SYLLABICS YWI +1532 ; [.3641.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWI +1533 ; [.3642.0020.0002] # CANADIAN SYLLABICS YWII +1534 ; [.3643.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWII +1535 ; [.3644.0020.0002] # CANADIAN SYLLABICS YWO +1536 ; [.3645.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWO +1537 ; [.3646.0020.0002] # CANADIAN SYLLABICS YWOO +1538 ; [.3647.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWOO +1539 ; [.3648.0020.0002] # CANADIAN SYLLABICS YWA +153A ; [.3649.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWA +153B ; [.364A.0020.0002] # CANADIAN SYLLABICS YWAA +153C ; [.364B.0020.0002] # CANADIAN SYLLABICS WEST-CREE YWAA +153D ; [.364C.0020.0002] # CANADIAN SYLLABICS NASKAPI YWAA +153E ; [.364D.0020.0002] # CANADIAN SYLLABICS Y +153F ; [.364E.0020.0002] # CANADIAN SYLLABICS BIBLE-CREE Y +1540 ; [.364F.0020.0002] # CANADIAN SYLLABICS WEST-CREE Y +1541 ; [.3650.0020.0002] # CANADIAN SYLLABICS SAYISI YI +1542 ; [.3651.0020.0002] # CANADIAN SYLLABICS RE +1543 ; [.3652.0020.0002] # CANADIAN SYLLABICS R-CREE RE +1544 ; [.3653.0020.0002] # CANADIAN SYLLABICS WEST-CREE LE +1545 ; [.3654.0020.0002] # CANADIAN SYLLABICS RAAI +1546 ; [.3655.0020.0002] # CANADIAN SYLLABICS RI +1547 ; [.3656.0020.0002] # CANADIAN SYLLABICS RII +1548 ; [.3657.0020.0002] # CANADIAN SYLLABICS RO +1549 ; [.3658.0020.0002] # CANADIAN SYLLABICS ROO +154A ; [.3659.0020.0002] # CANADIAN SYLLABICS WEST-CREE LO +154B ; [.365A.0020.0002] # CANADIAN SYLLABICS RA +154C ; [.365B.0020.0002] # CANADIAN SYLLABICS RAA +154D ; [.365C.0020.0002] # CANADIAN SYLLABICS WEST-CREE LA +154E ; [.365D.0020.0002] # CANADIAN SYLLABICS RWAA +154F ; [.365E.0020.0002] # CANADIAN SYLLABICS WEST-CREE RWAA +1550 ; [.365F.0020.0002] # CANADIAN SYLLABICS R +1551 ; [.3660.0020.0002] # CANADIAN SYLLABICS WEST-CREE R +1552 ; [.3661.0020.0002] # CANADIAN SYLLABICS MEDIAL R +1553 ; [.3662.0020.0002] # CANADIAN SYLLABICS FE +1554 ; [.3663.0020.0002] # CANADIAN SYLLABICS FAAI +1555 ; [.3664.0020.0002] # CANADIAN SYLLABICS FI +1556 ; [.3665.0020.0002] # CANADIAN SYLLABICS FII +1557 ; [.3666.0020.0002] # CANADIAN SYLLABICS FO +1558 ; [.3667.0020.0002] # CANADIAN SYLLABICS FOO +1559 ; [.3668.0020.0002] # CANADIAN SYLLABICS FA +155A ; [.3669.0020.0002] # CANADIAN SYLLABICS FAA +155B ; [.366A.0020.0002] # CANADIAN SYLLABICS FWAA +155C ; [.366B.0020.0002] # CANADIAN SYLLABICS WEST-CREE FWAA +155D ; [.366C.0020.0002] # CANADIAN SYLLABICS F +155E ; [.366D.0020.0002] # CANADIAN SYLLABICS THE +155F ; [.366E.0020.0002] # CANADIAN SYLLABICS N-CREE THE +1560 ; [.366F.0020.0002] # CANADIAN SYLLABICS THI +1561 ; [.3670.0020.0002] # CANADIAN SYLLABICS N-CREE THI +1562 ; [.3671.0020.0002] # CANADIAN SYLLABICS THII +1563 ; [.3672.0020.0002] # CANADIAN SYLLABICS N-CREE THII +1564 ; [.3673.0020.0002] # CANADIAN SYLLABICS THO +1565 ; [.3674.0020.0002] # CANADIAN SYLLABICS THOO +1566 ; [.3675.0020.0002] # CANADIAN SYLLABICS THA +1567 ; [.3676.0020.0002] # CANADIAN SYLLABICS THAA +1568 ; [.3677.0020.0002] # CANADIAN SYLLABICS THWAA +1569 ; [.3678.0020.0002] # CANADIAN SYLLABICS WEST-CREE THWAA +156A ; [.3679.0020.0002] # CANADIAN SYLLABICS TH +156B ; [.367A.0020.0002] # CANADIAN SYLLABICS TTHE +156C ; [.367B.0020.0002] # CANADIAN SYLLABICS TTHI +156D ; [.367C.0020.0002] # CANADIAN SYLLABICS TTHO +156E ; [.367D.0020.0002] # CANADIAN SYLLABICS TTHA +156F ; [.367E.0020.0002] # CANADIAN SYLLABICS TTH +1570 ; [.367F.0020.0002] # CANADIAN SYLLABICS TYE +1571 ; [.3680.0020.0002] # CANADIAN SYLLABICS TYI +1572 ; [.3681.0020.0002] # CANADIAN SYLLABICS TYO +1573 ; [.3682.0020.0002] # CANADIAN SYLLABICS TYA +1574 ; [.3683.0020.0002] # CANADIAN SYLLABICS NUNAVIK HE +1575 ; [.3684.0020.0002] # CANADIAN SYLLABICS NUNAVIK HI +1576 ; [.3685.0020.0002] # CANADIAN SYLLABICS NUNAVIK HII +1577 ; [.3686.0020.0002] # CANADIAN SYLLABICS NUNAVIK HO +1578 ; [.3687.0020.0002] # CANADIAN SYLLABICS NUNAVIK HOO +1579 ; [.3688.0020.0002] # CANADIAN SYLLABICS NUNAVIK HA +157A ; [.3689.0020.0002] # CANADIAN SYLLABICS NUNAVIK HAA +157B ; [.368A.0020.0002] # CANADIAN SYLLABICS NUNAVIK H +157D ; [.368B.0020.0002] # CANADIAN SYLLABICS HK +166F ; [.368C.0020.0002] # CANADIAN SYLLABICS QAI +157E ; [.368D.0020.0002] # CANADIAN SYLLABICS QAAI +157F ; [.368E.0020.0002] # CANADIAN SYLLABICS QI +1580 ; [.368F.0020.0002] # CANADIAN SYLLABICS QII +1581 ; [.3690.0020.0002] # CANADIAN SYLLABICS QO +1582 ; [.3691.0020.0002] # CANADIAN SYLLABICS QOO +1583 ; [.3692.0020.0002] # CANADIAN SYLLABICS QA +1584 ; [.3693.0020.0002] # CANADIAN SYLLABICS QAA +1585 ; [.3694.0020.0002] # CANADIAN SYLLABICS Q +1586 ; [.3695.0020.0002] # CANADIAN SYLLABICS TLHE +1587 ; [.3696.0020.0002] # CANADIAN SYLLABICS TLHI +1588 ; [.3697.0020.0002] # CANADIAN SYLLABICS TLHO +1589 ; [.3698.0020.0002] # CANADIAN SYLLABICS TLHA +158A ; [.3699.0020.0002] # CANADIAN SYLLABICS WEST-CREE RE +158B ; [.369A.0020.0002] # CANADIAN SYLLABICS WEST-CREE RI +158C ; [.369B.0020.0002] # CANADIAN SYLLABICS WEST-CREE RO +158D ; [.369C.0020.0002] # CANADIAN SYLLABICS WEST-CREE RA +1670 ; [.369D.0020.0002] # CANADIAN SYLLABICS NGAI +158E ; [.369E.0020.0002] # CANADIAN SYLLABICS NGAAI +158F ; [.369F.0020.0002] # CANADIAN SYLLABICS NGI +1590 ; [.36A0.0020.0002] # CANADIAN SYLLABICS NGII +1591 ; [.36A1.0020.0002] # CANADIAN SYLLABICS NGO +1592 ; [.36A2.0020.0002] # CANADIAN SYLLABICS NGOO +1593 ; [.36A3.0020.0002] # CANADIAN SYLLABICS NGA +1594 ; [.36A4.0020.0002] # CANADIAN SYLLABICS NGAA +1595 ; [.36A5.0020.0002] # CANADIAN SYLLABICS NG +1671 ; [.36A6.0020.0002] # CANADIAN SYLLABICS NNGI +1672 ; [.36A7.0020.0002] # CANADIAN SYLLABICS NNGII +1673 ; [.36A8.0020.0002] # CANADIAN SYLLABICS NNGO +1674 ; [.36A9.0020.0002] # CANADIAN SYLLABICS NNGOO +1675 ; [.36AA.0020.0002] # CANADIAN SYLLABICS NNGA +1676 ; [.36AB.0020.0002] # CANADIAN SYLLABICS NNGAA +1596 ; [.36AC.0020.0002] # CANADIAN SYLLABICS NNG +1597 ; [.36AD.0020.0002] # CANADIAN SYLLABICS SAYISI SHE +1598 ; [.36AE.0020.0002] # CANADIAN SYLLABICS SAYISI SHI +1599 ; [.36AF.0020.0002] # CANADIAN SYLLABICS SAYISI SHO +159A ; [.36B0.0020.0002] # CANADIAN SYLLABICS SAYISI SHA +159B ; [.36B1.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THE +159C ; [.36B2.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THI +159D ; [.36B3.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THO +159E ; [.36B4.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THA +159F ; [.36B5.0020.0002] # CANADIAN SYLLABICS WOODS-CREE TH +15A0 ; [.36B6.0020.0002] # CANADIAN SYLLABICS LHI +15A1 ; [.36B7.0020.0002] # CANADIAN SYLLABICS LHII +15A2 ; [.36B8.0020.0002] # CANADIAN SYLLABICS LHO +15A3 ; [.36B9.0020.0002] # CANADIAN SYLLABICS LHOO +15A4 ; [.36BA.0020.0002] # CANADIAN SYLLABICS LHA +15A5 ; [.36BB.0020.0002] # CANADIAN SYLLABICS LHAA +15A6 ; [.36BC.0020.0002] # CANADIAN SYLLABICS LH +157C ; [.36BD.0020.0002] # CANADIAN SYLLABICS NUNAVUT H +15A7 ; [.36BE.0020.0002] # CANADIAN SYLLABICS TH-CREE THE +15A8 ; [.36BF.0020.0002] # CANADIAN SYLLABICS TH-CREE THI +15A9 ; [.36C0.0020.0002] # CANADIAN SYLLABICS TH-CREE THII +15AA ; [.36C1.0020.0002] # CANADIAN SYLLABICS TH-CREE THO +15AB ; [.36C2.0020.0002] # CANADIAN SYLLABICS TH-CREE THOO +15AC ; [.36C3.0020.0002] # CANADIAN SYLLABICS TH-CREE THA +15AD ; [.36C4.0020.0002] # CANADIAN SYLLABICS TH-CREE THAA +15AE ; [.36C5.0020.0002] # CANADIAN SYLLABICS TH-CREE TH +15AF ; [.36C6.0020.0002] # CANADIAN SYLLABICS AIVILIK B +15B0 ; [.36C7.0020.0002] # CANADIAN SYLLABICS BLACKFOOT E +15B1 ; [.36C8.0020.0002] # CANADIAN SYLLABICS BLACKFOOT I +15B2 ; [.36C9.0020.0002] # CANADIAN SYLLABICS BLACKFOOT O +15B3 ; [.36CA.0020.0002] # CANADIAN SYLLABICS BLACKFOOT A +15B4 ; [.36CB.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WE +15B5 ; [.36CC.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WI +15B6 ; [.36CD.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WO +15B7 ; [.36CE.0020.0002] # CANADIAN SYLLABICS BLACKFOOT WA +15B8 ; [.36CF.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NE +15B9 ; [.36D0.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NI +15BA ; [.36D1.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NO +15BB ; [.36D2.0020.0002] # CANADIAN SYLLABICS BLACKFOOT NA +15BC ; [.36D3.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KE +15BD ; [.36D4.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KI +15BE ; [.36D5.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KO +15BF ; [.36D6.0020.0002] # CANADIAN SYLLABICS BLACKFOOT KA +15C0 ; [.36D7.0020.0002] # CANADIAN SYLLABICS SAYISI HE +15C1 ; [.36D8.0020.0002] # CANADIAN SYLLABICS SAYISI HI +15C2 ; [.36D9.0020.0002] # CANADIAN SYLLABICS SAYISI HO +15C3 ; [.36DA.0020.0002] # CANADIAN SYLLABICS SAYISI HA +15C4 ; [.36DB.0020.0002] # CANADIAN SYLLABICS CARRIER GHU +15C5 ; [.36DC.0020.0002] # CANADIAN SYLLABICS CARRIER GHO +15C6 ; [.36DD.0020.0002] # CANADIAN SYLLABICS CARRIER GHE +15C7 ; [.36DE.0020.0002] # CANADIAN SYLLABICS CARRIER GHEE +15C8 ; [.36DF.0020.0002] # CANADIAN SYLLABICS CARRIER GHI +15C9 ; [.36E0.0020.0002] # CANADIAN SYLLABICS CARRIER GHA +15CA ; [.36E1.0020.0002] # CANADIAN SYLLABICS CARRIER RU +15CB ; [.36E2.0020.0002] # CANADIAN SYLLABICS CARRIER RO +15CC ; [.36E3.0020.0002] # CANADIAN SYLLABICS CARRIER RE +15CD ; [.36E4.0020.0002] # CANADIAN SYLLABICS CARRIER REE +15CE ; [.36E5.0020.0002] # CANADIAN SYLLABICS CARRIER RI +15CF ; [.36E6.0020.0002] # CANADIAN SYLLABICS CARRIER RA +15D0 ; [.36E7.0020.0002] # CANADIAN SYLLABICS CARRIER WU +15D1 ; [.36E8.0020.0002] # CANADIAN SYLLABICS CARRIER WO +15D2 ; [.36E9.0020.0002] # CANADIAN SYLLABICS CARRIER WE +15D3 ; [.36EA.0020.0002] # CANADIAN SYLLABICS CARRIER WEE +15D4 ; [.36EB.0020.0002] # CANADIAN SYLLABICS CARRIER WI +15D5 ; [.36EC.0020.0002] # CANADIAN SYLLABICS CARRIER WA +15D6 ; [.36ED.0020.0002] # CANADIAN SYLLABICS CARRIER HWU +15D7 ; [.36EE.0020.0002] # CANADIAN SYLLABICS CARRIER HWO +15D8 ; [.36EF.0020.0002] # CANADIAN SYLLABICS CARRIER HWE +15D9 ; [.36F0.0020.0002] # CANADIAN SYLLABICS CARRIER HWEE +15DA ; [.36F1.0020.0002] # CANADIAN SYLLABICS CARRIER HWI +15DB ; [.36F2.0020.0002] # CANADIAN SYLLABICS CARRIER HWA +15DC ; [.36F3.0020.0002] # CANADIAN SYLLABICS CARRIER THU +15DD ; [.36F4.0020.0002] # CANADIAN SYLLABICS CARRIER THO +15DE ; [.36F5.0020.0002] # CANADIAN SYLLABICS CARRIER THE +15DF ; [.36F6.0020.0002] # CANADIAN SYLLABICS CARRIER THEE +15E0 ; [.36F7.0020.0002] # CANADIAN SYLLABICS CARRIER THI +15E1 ; [.36F8.0020.0002] # CANADIAN SYLLABICS CARRIER THA +15E2 ; [.36F9.0020.0002] # CANADIAN SYLLABICS CARRIER TTU +15E3 ; [.36FA.0020.0002] # CANADIAN SYLLABICS CARRIER TTO +15E4 ; [.36FB.0020.0002] # CANADIAN SYLLABICS CARRIER TTE +15E5 ; [.36FC.0020.0002] # CANADIAN SYLLABICS CARRIER TTEE +15E6 ; [.36FD.0020.0002] # CANADIAN SYLLABICS CARRIER TTI +15E7 ; [.36FE.0020.0002] # CANADIAN SYLLABICS CARRIER TTA +15E8 ; [.36FF.0020.0002] # CANADIAN SYLLABICS CARRIER PU +15E9 ; [.3700.0020.0002] # CANADIAN SYLLABICS CARRIER PO +15EA ; [.3701.0020.0002] # CANADIAN SYLLABICS CARRIER PE +15EB ; [.3702.0020.0002] # CANADIAN SYLLABICS CARRIER PEE +15EC ; [.3703.0020.0002] # CANADIAN SYLLABICS CARRIER PI +15ED ; [.3704.0020.0002] # CANADIAN SYLLABICS CARRIER PA +15EE ; [.3705.0020.0002] # CANADIAN SYLLABICS CARRIER P +15EF ; [.3706.0020.0002] # CANADIAN SYLLABICS CARRIER GU +15F0 ; [.3707.0020.0002] # CANADIAN SYLLABICS CARRIER GO +15F1 ; [.3708.0020.0002] # CANADIAN SYLLABICS CARRIER GE +15F2 ; [.3709.0020.0002] # CANADIAN SYLLABICS CARRIER GEE +15F3 ; [.370A.0020.0002] # CANADIAN SYLLABICS CARRIER GI +15F4 ; [.370B.0020.0002] # CANADIAN SYLLABICS CARRIER GA +15F5 ; [.370C.0020.0002] # CANADIAN SYLLABICS CARRIER KHU +15F6 ; [.370D.0020.0002] # CANADIAN SYLLABICS CARRIER KHO +15F7 ; [.370E.0020.0002] # CANADIAN SYLLABICS CARRIER KHE +15F8 ; [.370F.0020.0002] # CANADIAN SYLLABICS CARRIER KHEE +15F9 ; [.3710.0020.0002] # CANADIAN SYLLABICS CARRIER KHI +15FA ; [.3711.0020.0002] # CANADIAN SYLLABICS CARRIER KHA +15FB ; [.3712.0020.0002] # CANADIAN SYLLABICS CARRIER KKU +15FC ; [.3713.0020.0002] # CANADIAN SYLLABICS CARRIER KKO +15FD ; [.3714.0020.0002] # CANADIAN SYLLABICS CARRIER KKE +15FE ; [.3715.0020.0002] # CANADIAN SYLLABICS CARRIER KKEE +15FF ; [.3716.0020.0002] # CANADIAN SYLLABICS CARRIER KKI +1600 ; [.3717.0020.0002] # CANADIAN SYLLABICS CARRIER KKA +1601 ; [.3718.0020.0002] # CANADIAN SYLLABICS CARRIER KK +1602 ; [.3719.0020.0002] # CANADIAN SYLLABICS CARRIER NU +1603 ; [.371A.0020.0002] # CANADIAN SYLLABICS CARRIER NO +1604 ; [.371B.0020.0002] # CANADIAN SYLLABICS CARRIER NE +1605 ; [.371C.0020.0002] # CANADIAN SYLLABICS CARRIER NEE +1606 ; [.371D.0020.0002] # CANADIAN SYLLABICS CARRIER NI +1607 ; [.371E.0020.0002] # CANADIAN SYLLABICS CARRIER NA +1608 ; [.371F.0020.0002] # CANADIAN SYLLABICS CARRIER MU +1609 ; [.3720.0020.0002] # CANADIAN SYLLABICS CARRIER MO +160A ; [.3721.0020.0002] # CANADIAN SYLLABICS CARRIER ME +160B ; [.3722.0020.0002] # CANADIAN SYLLABICS CARRIER MEE +160C ; [.3723.0020.0002] # CANADIAN SYLLABICS CARRIER MI +160D ; [.3724.0020.0002] # CANADIAN SYLLABICS CARRIER MA +160E ; [.3725.0020.0002] # CANADIAN SYLLABICS CARRIER YU +160F ; [.3726.0020.0002] # CANADIAN SYLLABICS CARRIER YO +1610 ; [.3727.0020.0002] # CANADIAN SYLLABICS CARRIER YE +1611 ; [.3728.0020.0002] # CANADIAN SYLLABICS CARRIER YEE +1612 ; [.3729.0020.0002] # CANADIAN SYLLABICS CARRIER YI +1613 ; [.372A.0020.0002] # CANADIAN SYLLABICS CARRIER YA +1614 ; [.372B.0020.0002] # CANADIAN SYLLABICS CARRIER JU +1615 ; [.372C.0020.0002] # CANADIAN SYLLABICS SAYISI JU +1616 ; [.372D.0020.0002] # CANADIAN SYLLABICS CARRIER JO +1617 ; [.372E.0020.0002] # CANADIAN SYLLABICS CARRIER JE +1618 ; [.372F.0020.0002] # CANADIAN SYLLABICS CARRIER JEE +1619 ; [.3730.0020.0002] # CANADIAN SYLLABICS CARRIER JI +161A ; [.3731.0020.0002] # CANADIAN SYLLABICS SAYISI JI +161B ; [.3732.0020.0002] # CANADIAN SYLLABICS CARRIER JA +161C ; [.3733.0020.0002] # CANADIAN SYLLABICS CARRIER JJU +161D ; [.3734.0020.0002] # CANADIAN SYLLABICS CARRIER JJO +161E ; [.3735.0020.0002] # CANADIAN SYLLABICS CARRIER JJE +161F ; [.3736.0020.0002] # CANADIAN SYLLABICS CARRIER JJEE +1620 ; [.3737.0020.0002] # CANADIAN SYLLABICS CARRIER JJI +1621 ; [.3738.0020.0002] # CANADIAN SYLLABICS CARRIER JJA +1622 ; [.3739.0020.0002] # CANADIAN SYLLABICS CARRIER LU +1623 ; [.373A.0020.0002] # CANADIAN SYLLABICS CARRIER LO +1624 ; [.373B.0020.0002] # CANADIAN SYLLABICS CARRIER LE +1625 ; [.373C.0020.0002] # CANADIAN SYLLABICS CARRIER LEE +1626 ; [.373D.0020.0002] # CANADIAN SYLLABICS CARRIER LI +1627 ; [.373E.0020.0002] # CANADIAN SYLLABICS CARRIER LA +1628 ; [.373F.0020.0002] # CANADIAN SYLLABICS CARRIER DLU +1629 ; [.3740.0020.0002] # CANADIAN SYLLABICS CARRIER DLO +162A ; [.3741.0020.0002] # CANADIAN SYLLABICS CARRIER DLE +162B ; [.3742.0020.0002] # CANADIAN SYLLABICS CARRIER DLEE +162C ; [.3743.0020.0002] # CANADIAN SYLLABICS CARRIER DLI +162D ; [.3744.0020.0002] # CANADIAN SYLLABICS CARRIER DLA +162E ; [.3745.0020.0002] # CANADIAN SYLLABICS CARRIER LHU +162F ; [.3746.0020.0002] # CANADIAN SYLLABICS CARRIER LHO +1630 ; [.3747.0020.0002] # CANADIAN SYLLABICS CARRIER LHE +1631 ; [.3748.0020.0002] # CANADIAN SYLLABICS CARRIER LHEE +1632 ; [.3749.0020.0002] # CANADIAN SYLLABICS CARRIER LHI +1633 ; [.374A.0020.0002] # CANADIAN SYLLABICS CARRIER LHA +1634 ; [.374B.0020.0002] # CANADIAN SYLLABICS CARRIER TLHU +1635 ; [.374C.0020.0002] # CANADIAN SYLLABICS CARRIER TLHO +1636 ; [.374D.0020.0002] # CANADIAN SYLLABICS CARRIER TLHE +1637 ; [.374E.0020.0002] # CANADIAN SYLLABICS CARRIER TLHEE +1638 ; [.374F.0020.0002] # CANADIAN SYLLABICS CARRIER TLHI +1639 ; [.3750.0020.0002] # CANADIAN SYLLABICS CARRIER TLHA +163A ; [.3751.0020.0002] # CANADIAN SYLLABICS CARRIER TLU +163B ; [.3752.0020.0002] # CANADIAN SYLLABICS CARRIER TLO +163C ; [.3753.0020.0002] # CANADIAN SYLLABICS CARRIER TLE +163D ; [.3754.0020.0002] # CANADIAN SYLLABICS CARRIER TLEE +163E ; [.3755.0020.0002] # CANADIAN SYLLABICS CARRIER TLI +163F ; [.3756.0020.0002] # CANADIAN SYLLABICS CARRIER TLA +1640 ; [.3757.0020.0002] # CANADIAN SYLLABICS CARRIER ZU +1641 ; [.3758.0020.0002] # CANADIAN SYLLABICS CARRIER ZO +1642 ; [.3759.0020.0002] # CANADIAN SYLLABICS CARRIER ZE +1643 ; [.375A.0020.0002] # CANADIAN SYLLABICS CARRIER ZEE +1644 ; [.375B.0020.0002] # CANADIAN SYLLABICS CARRIER ZI +1645 ; [.375C.0020.0002] # CANADIAN SYLLABICS CARRIER ZA +1646 ; [.375D.0020.0002] # CANADIAN SYLLABICS CARRIER Z +1647 ; [.375E.0020.0002] # CANADIAN SYLLABICS CARRIER INITIAL Z +1648 ; [.375F.0020.0002] # CANADIAN SYLLABICS CARRIER DZU +1649 ; [.3760.0020.0002] # CANADIAN SYLLABICS CARRIER DZO +164A ; [.3761.0020.0002] # CANADIAN SYLLABICS CARRIER DZE +164B ; [.3762.0020.0002] # CANADIAN SYLLABICS CARRIER DZEE +164C ; [.3763.0020.0002] # CANADIAN SYLLABICS CARRIER DZI +164D ; [.3764.0020.0002] # CANADIAN SYLLABICS CARRIER DZA +164E ; [.3765.0020.0002] # CANADIAN SYLLABICS CARRIER SU +164F ; [.3766.0020.0002] # CANADIAN SYLLABICS CARRIER SO +1650 ; [.3767.0020.0002] # CANADIAN SYLLABICS CARRIER SE +1651 ; [.3768.0020.0002] # CANADIAN SYLLABICS CARRIER SEE +1652 ; [.3769.0020.0002] # CANADIAN SYLLABICS CARRIER SI +1653 ; [.376A.0020.0002] # CANADIAN SYLLABICS CARRIER SA +1654 ; [.376B.0020.0002] # CANADIAN SYLLABICS CARRIER SHU +1655 ; [.376C.0020.0002] # CANADIAN SYLLABICS CARRIER SHO +1656 ; [.376D.0020.0002] # CANADIAN SYLLABICS CARRIER SHE +1657 ; [.376E.0020.0002] # CANADIAN SYLLABICS CARRIER SHEE +1658 ; [.376F.0020.0002] # CANADIAN SYLLABICS CARRIER SHI +1659 ; [.3770.0020.0002] # CANADIAN SYLLABICS CARRIER SHA +165A ; [.3771.0020.0002] # CANADIAN SYLLABICS CARRIER SH +165B ; [.3772.0020.0002] # CANADIAN SYLLABICS CARRIER TSU +165C ; [.3773.0020.0002] # CANADIAN SYLLABICS CARRIER TSO +165D ; [.3774.0020.0002] # CANADIAN SYLLABICS CARRIER TSE +165E ; [.3775.0020.0002] # CANADIAN SYLLABICS CARRIER TSEE +165F ; [.3776.0020.0002] # CANADIAN SYLLABICS CARRIER TSI +1660 ; [.3777.0020.0002] # CANADIAN SYLLABICS CARRIER TSA +1661 ; [.3778.0020.0002] # CANADIAN SYLLABICS CARRIER CHU +1662 ; [.3779.0020.0002] # CANADIAN SYLLABICS CARRIER CHO +1663 ; [.377A.0020.0002] # CANADIAN SYLLABICS CARRIER CHE +1664 ; [.377B.0020.0002] # CANADIAN SYLLABICS CARRIER CHEE +1665 ; [.377C.0020.0002] # CANADIAN SYLLABICS CARRIER CHI +1666 ; [.377D.0020.0002] # CANADIAN SYLLABICS CARRIER CHA +1667 ; [.377E.0020.0002] # CANADIAN SYLLABICS CARRIER TTSU +1668 ; [.377F.0020.0002] # CANADIAN SYLLABICS CARRIER TTSO +1669 ; [.3780.0020.0002] # CANADIAN SYLLABICS CARRIER TTSE +166A ; [.3781.0020.0002] # CANADIAN SYLLABICS CARRIER TTSEE +166B ; [.3782.0020.0002] # CANADIAN SYLLABICS CARRIER TTSI +166C ; [.3783.0020.0002] # CANADIAN SYLLABICS CARRIER TTSA +1677 ; [.3784.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWEE +1678 ; [.3785.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWI +1679 ; [.3786.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWII +167A ; [.3787.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWO +167B ; [.3788.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWOO +167C ; [.3789.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWA +167D ; [.378A.0020.0002] # CANADIAN SYLLABICS WOODS-CREE THWAA +167E ; [.378B.0020.0002] # CANADIAN SYLLABICS WOODS-CREE FINAL TH +167F ; [.378C.0020.0002] # CANADIAN SYLLABICS BLACKFOOT W +18B0 ; [.378D.0020.0002] # CANADIAN SYLLABICS OY +18B1 ; [.378E.0020.0002] # CANADIAN SYLLABICS AY +18B2 ; [.378F.0020.0002] # CANADIAN SYLLABICS AAY +18B3 ; [.3790.0020.0002] # CANADIAN SYLLABICS WAY +18B4 ; [.3791.0020.0002] # CANADIAN SYLLABICS POY +18B5 ; [.3792.0020.0002] # CANADIAN SYLLABICS PAY +18B6 ; [.3793.0020.0002] # CANADIAN SYLLABICS PWOY +18B7 ; [.3794.0020.0002] # CANADIAN SYLLABICS TAY +18B8 ; [.3795.0020.0002] # CANADIAN SYLLABICS KAY +18B9 ; [.3796.0020.0002] # CANADIAN SYLLABICS KWAY +18BA ; [.3797.0020.0002] # CANADIAN SYLLABICS MAY +18BB ; [.3798.0020.0002] # CANADIAN SYLLABICS NOY +18BC ; [.3799.0020.0002] # CANADIAN SYLLABICS NAY +18BD ; [.379A.0020.0002] # CANADIAN SYLLABICS LAY +18BE ; [.379B.0020.0002] # CANADIAN SYLLABICS SOY +18BF ; [.379C.0020.0002] # CANADIAN SYLLABICS SAY +18C0 ; [.379D.0020.0002] # CANADIAN SYLLABICS SHOY +18C1 ; [.379E.0020.0002] # CANADIAN SYLLABICS SHAY +18C2 ; [.379F.0020.0002] # CANADIAN SYLLABICS SHWOY +18C3 ; [.37A0.0020.0002] # CANADIAN SYLLABICS YOY +18C4 ; [.37A1.0020.0002] # CANADIAN SYLLABICS YAY +18C5 ; [.37A2.0020.0002] # CANADIAN SYLLABICS RAY +18C6 ; [.37A3.0020.0002] # CANADIAN SYLLABICS NWI +18C7 ; [.37A4.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWI +18C8 ; [.37A5.0020.0002] # CANADIAN SYLLABICS NWII +18C9 ; [.37A6.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWII +18CA ; [.37A7.0020.0002] # CANADIAN SYLLABICS NWO +18CB ; [.37A8.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWO +18CC ; [.37A9.0020.0002] # CANADIAN SYLLABICS NWOO +18CD ; [.37AA.0020.0002] # CANADIAN SYLLABICS OJIBWAY NWOO +18CE ; [.37AB.0020.0002] # CANADIAN SYLLABICS RWEE +18CF ; [.37AC.0020.0002] # CANADIAN SYLLABICS RWI +18D0 ; [.37AD.0020.0002] # CANADIAN SYLLABICS RWII +18D1 ; [.37AE.0020.0002] # CANADIAN SYLLABICS RWO +18D2 ; [.37AF.0020.0002] # CANADIAN SYLLABICS RWOO +18D3 ; [.37B0.0020.0002] # CANADIAN SYLLABICS RWA +18D4 ; [.37B1.0020.0002] # CANADIAN SYLLABICS OJIBWAY P +18D5 ; [.37B2.0020.0002] # CANADIAN SYLLABICS OJIBWAY T +18D6 ; [.37B3.0020.0002] # CANADIAN SYLLABICS OJIBWAY K +18D7 ; [.37B4.0020.0002] # CANADIAN SYLLABICS OJIBWAY C +18D8 ; [.37B5.0020.0002] # CANADIAN SYLLABICS OJIBWAY M +18D9 ; [.37B6.0020.0002] # CANADIAN SYLLABICS OJIBWAY N +18DA ; [.37B7.0020.0002] # CANADIAN SYLLABICS OJIBWAY S +18DB ; [.37B8.0020.0002] # CANADIAN SYLLABICS OJIBWAY SH +18DC ; [.37B9.0020.0002] # CANADIAN SYLLABICS EASTERN W +18DD ; [.37BA.0020.0002] # CANADIAN SYLLABICS WESTERN W +18DE ; [.37BB.0020.0002] # CANADIAN SYLLABICS FINAL SMALL RING +18DF ; [.37BC.0020.0002] # CANADIAN SYLLABICS FINAL RAISED DOT +18E0 ; [.37BD.0020.0002] # CANADIAN SYLLABICS R-CREE RWE +18E1 ; [.37BE.0020.0002] # CANADIAN SYLLABICS WEST-CREE LOO +18E2 ; [.37BF.0020.0002] # CANADIAN SYLLABICS WEST-CREE LAA +18E3 ; [.37C0.0020.0002] # CANADIAN SYLLABICS THWE +18E4 ; [.37C1.0020.0002] # CANADIAN SYLLABICS THWA +18E5 ; [.37C2.0020.0002] # CANADIAN SYLLABICS TTHWE +18E6 ; [.37C3.0020.0002] # CANADIAN SYLLABICS TTHOO +18E7 ; [.37C4.0020.0002] # CANADIAN SYLLABICS TTHAA +18E8 ; [.37C5.0020.0002] # CANADIAN SYLLABICS TLHWE +18E9 ; [.37C6.0020.0002] # CANADIAN SYLLABICS TLHOO +18EA ; [.37C7.0020.0002] # CANADIAN SYLLABICS SAYISI SHWE +18EB ; [.37C8.0020.0002] # CANADIAN SYLLABICS SAYISI SHOO +18EC ; [.37C9.0020.0002] # CANADIAN SYLLABICS SAYISI HOO +18ED ; [.37CA.0020.0002] # CANADIAN SYLLABICS CARRIER GWU +18EE ; [.37CB.0020.0002] # CANADIAN SYLLABICS CARRIER DENE GEE +18EF ; [.37CC.0020.0002] # CANADIAN SYLLABICS CARRIER GAA +18F0 ; [.37CD.0020.0002] # CANADIAN SYLLABICS CARRIER GWA +18F1 ; [.37CE.0020.0002] # CANADIAN SYLLABICS SAYISI JUU +18F2 ; [.37CF.0020.0002] # CANADIAN SYLLABICS CARRIER JWA +18F3 ; [.37D0.0020.0002] # CANADIAN SYLLABICS BEAVER DENE L +18F4 ; [.37D1.0020.0002] # CANADIAN SYLLABICS BEAVER DENE R +18F5 ; [.37D2.0020.0002] # CANADIAN SYLLABICS CARRIER DENTAL S +1681 ; [.37D3.0020.0002] # OGHAM LETTER BEITH +1682 ; [.37D4.0020.0002] # OGHAM LETTER LUIS +1683 ; [.37D5.0020.0002] # OGHAM LETTER FEARN +1684 ; [.37D6.0020.0002] # OGHAM LETTER SAIL +1685 ; [.37D7.0020.0002] # OGHAM LETTER NION +1686 ; [.37D8.0020.0002] # OGHAM LETTER UATH +1687 ; [.37D9.0020.0002] # OGHAM LETTER DAIR +1688 ; [.37DA.0020.0002] # OGHAM LETTER TINNE +1689 ; [.37DB.0020.0002] # OGHAM LETTER COLL +168A ; [.37DC.0020.0002] # OGHAM LETTER CEIRT +168B ; [.37DD.0020.0002] # OGHAM LETTER MUIN +168C ; [.37DE.0020.0002] # OGHAM LETTER GORT +168D ; [.37DF.0020.0002] # OGHAM LETTER NGEADAL +168E ; [.37E0.0020.0002] # OGHAM LETTER STRAIF +168F ; [.37E1.0020.0002] # OGHAM LETTER RUIS +1690 ; [.37E2.0020.0002] # OGHAM LETTER AILM +1691 ; [.37E3.0020.0002] # OGHAM LETTER ONN +1692 ; [.37E4.0020.0002] # OGHAM LETTER UR +1693 ; [.37E5.0020.0002] # OGHAM LETTER EADHADH +1694 ; [.37E6.0020.0002] # OGHAM LETTER IODHADH +1695 ; [.37E7.0020.0002] # OGHAM LETTER EABHADH +1696 ; [.37E8.0020.0002] # OGHAM LETTER OR +1697 ; [.37E9.0020.0002] # OGHAM LETTER UILLEANN +1698 ; [.37EA.0020.0002] # OGHAM LETTER IFIN +1699 ; [.37EB.0020.0002] # OGHAM LETTER EAMHANCHOLL +169A ; [.37EC.0020.0002] # OGHAM LETTER PEITH +16A0 ; [.37ED.0020.0002] # RUNIC LETTER FEHU FEOH FE F +16A1 ; [.37ED.0020.0004][.0000.0111.0004] # RUNIC LETTER V +16A2 ; [.37EE.0020.0002] # RUNIC LETTER URUZ UR U +16A4 ; [.37EE.0020.0004][.0000.0111.0004] # RUNIC LETTER Y +16A5 ; [.37EE.0020.0004][.0000.0112.0004] # RUNIC LETTER W +16A6 ; [.37EF.0020.0002] # RUNIC LETTER THURISAZ THURS THORN +16A7 ; [.37EF.0020.0004][.0000.0111.0004] # RUNIC LETTER ETH +16F0 ; [.37EF.0020.0004][.37EF.0020.0004] # RUNIC BELGTHOR SYMBOL +16A8 ; [.37F0.0020.0002] # RUNIC LETTER ANSUZ A +16A9 ; [.37F0.0020.0004][.0000.0111.0004] # RUNIC LETTER OS O +16AC ; [.37F0.0020.0004][.0000.0112.0004] # RUNIC LETTER LONG-BRANCH-OSS O +16AD ; [.37F0.0020.0004][.0000.0113.0004] # RUNIC LETTER SHORT-TWIG-OSS O +16AE ; [.37F0.0020.0004][.0000.0114.0004] # RUNIC LETTER O +16F4 ; [.37F1.0020.0002] # RUNIC LETTER FRANKS CASKET OS +16AF ; [.37F2.0020.0002] # RUNIC LETTER OE +16B0 ; [.37F3.0020.0002] # RUNIC LETTER ON +16B1 ; [.37F4.0020.0002] # RUNIC LETTER RAIDO RAD REID R +16B2 ; [.37F5.0020.0002] # RUNIC LETTER KAUNA +16B3 ; [.37F5.0020.0004][.0000.0111.0004] # RUNIC LETTER CEN +16B4 ; [.37F5.0020.0004][.0000.0112.0004] # RUNIC LETTER KAUN K +16B5 ; [.37F5.0020.0004][.0000.0113.0004] # RUNIC LETTER G +16B6 ; [.37F5.0020.0004][.0000.0114.0004] # RUNIC LETTER ENG +16F1 ; [.37F6.0020.0002] # RUNIC LETTER K +16B7 ; [.37F7.0020.0002] # RUNIC LETTER GEBO GYFU G +16B9 ; [.37F8.0020.0002] # RUNIC LETTER WUNJO WYNN W +16E9 ; [.37F8.0020.0004][.0000.0111.0004] # RUNIC LETTER Q +16BA ; [.37F9.0020.0002] # RUNIC LETTER HAGLAZ H +16BB ; [.37F9.0020.0004][.0000.0111.0004] # RUNIC LETTER HAEGL H +16BC ; [.37F9.0020.0004][.0000.0112.0004] # RUNIC LETTER LONG-BRANCH-HAGALL H +16BD ; [.37F9.0020.0004][.0000.0113.0004] # RUNIC LETTER SHORT-TWIG-HAGALL H +16BE ; [.37FA.0020.0002] # RUNIC LETTER NAUDIZ NYD NAUD N +16BF ; [.37FA.0020.0004][.0000.0111.0004] # RUNIC LETTER SHORT-TWIG-NAUD N +16C0 ; [.37FA.0020.0004][.0000.0112.0004] # RUNIC LETTER DOTTED-N +16C1 ; [.37FB.0020.0002] # RUNIC LETTER ISAZ IS ISS I +16C2 ; [.37FB.0020.0004][.0000.0111.0004] # RUNIC LETTER E +16F5 ; [.37FC.0020.0002] # RUNIC LETTER FRANKS CASKET IS +16C3 ; [.37FD.0020.0002] # RUNIC LETTER JERAN J +16C4 ; [.37FD.0020.0004][.0000.0111.0004] # RUNIC LETTER GER +16C5 ; [.37FE.0020.0002] # RUNIC LETTER LONG-BRANCH-AR AE +16C6 ; [.37FE.0020.0004][.0000.0111.0004] # RUNIC LETTER SHORT-TWIG-AR A +16EE ; [.37FE.0020.0004][.3809.0020.0004] # RUNIC ARLAUG SYMBOL +16C7 ; [.37FF.0020.0002] # RUNIC LETTER IWAZ EOH +16C8 ; [.3800.0020.0002] # RUNIC LETTER PERTHO PEORTH P +16D5 ; [.3800.0020.0004][.0000.0111.0004] # RUNIC LETTER OPEN-P +16C9 ; [.3801.0020.0002] # RUNIC LETTER ALGIZ EOLHX +16CA ; [.3802.0020.0002] # RUNIC LETTER SOWILO S +16CB ; [.3802.0020.0004][.0000.0111.0004] # RUNIC LETTER SIGEL LONG-BRANCH-SOL S +16EA ; [.3802.0020.0004][.0000.0112.0004] # RUNIC LETTER X +16CC ; [.3802.0020.0004][.0000.0113.0004] # RUNIC LETTER SHORT-TWIG-SOL S +16CD ; [.3802.0020.0004][.0000.0114.0004] # RUNIC LETTER C +16CE ; [.3802.0020.0004][.0000.0115.0004] # RUNIC LETTER Z +16F2 ; [.3803.0020.0002] # RUNIC LETTER SH +16CF ; [.3804.0020.0002] # RUNIC LETTER TIWAZ TIR TYR T +16D0 ; [.3804.0020.0004][.0000.0111.0004] # RUNIC LETTER SHORT-TWIG-TYR T +16D1 ; [.3804.0020.0004][.0000.0112.0004] # RUNIC LETTER D +16D2 ; [.3805.0020.0002] # RUNIC LETTER BERKANAN BEORC BJARKAN B +16D3 ; [.3805.0020.0004][.0000.0111.0004] # RUNIC LETTER SHORT-TWIG-BJARKAN B +16D4 ; [.3805.0020.0004][.0000.0112.0004] # RUNIC LETTER DOTTED-P +16D6 ; [.3806.0020.0002] # RUNIC LETTER EHWAZ EH E +16F6 ; [.3807.0020.0002] # RUNIC LETTER FRANKS CASKET EH +16D7 ; [.3808.0020.0002] # RUNIC LETTER MANNAZ MAN M +16D8 ; [.3808.0020.0004][.0000.0111.0004] # RUNIC LETTER LONG-BRANCH-MADR M +16D9 ; [.3808.0020.0004][.0000.0112.0004] # RUNIC LETTER SHORT-TWIG-MADR M +16EF ; [.3808.0020.0004][.0000.0111.0004][.3808.0020.0004][.0000.0111.0004] # RUNIC TVIMADUR SYMBOL +16DA ; [.3809.0020.0002] # RUNIC LETTER LAUKAZ LAGU LOGR L +16DB ; [.3809.0020.0004][.0000.0111.0004] # RUNIC LETTER DOTTED-L +16DC ; [.380A.0020.0002] # RUNIC LETTER INGWAZ +16DD ; [.380A.0020.0004][.0000.0111.0004] # RUNIC LETTER ING +16DE ; [.380B.0020.0002] # RUNIC LETTER DAGAZ DAEG D +16DF ; [.380C.0020.0002] # RUNIC LETTER OTHALAN ETHEL O +16F3 ; [.380D.0020.0002] # RUNIC LETTER OO +16AA ; [.380E.0020.0002] # RUNIC LETTER AC A +16F7 ; [.380F.0020.0002] # RUNIC LETTER FRANKS CASKET AC +16AB ; [.3810.0020.0002] # RUNIC LETTER AESC +16F8 ; [.3811.0020.0002] # RUNIC LETTER FRANKS CASKET AESC +16A3 ; [.3812.0020.0002] # RUNIC LETTER YR +16E0 ; [.3813.0020.0002] # RUNIC LETTER EAR +16E3 ; [.3814.0020.0002] # RUNIC LETTER CALC +16B8 ; [.3815.0020.0002] # RUNIC LETTER GAR +16E4 ; [.3816.0020.0002] # RUNIC LETTER CEALC +16E1 ; [.3817.0020.0002] # RUNIC LETTER IOR +16E2 ; [.3818.0020.0002] # RUNIC LETTER CWEORTH +16E5 ; [.3819.0020.0002] # RUNIC LETTER STAN +16E6 ; [.381A.0020.0002] # RUNIC LETTER LONG-BRANCH-YR +16E7 ; [.381A.0020.0004][.0000.0111.0004] # RUNIC LETTER SHORT-TWIG-YR +16E8 ; [.381A.0020.0004][.0000.0112.0004] # RUNIC LETTER ICELANDIC-YR +10CC0 ; [.381B.0020.0002] # OLD HUNGARIAN SMALL LETTER A +10C80 ; [.381B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER A +10CC1 ; [.381B.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER AA +10C81 ; [.381B.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER AA +10CC2 ; [.381C.0020.0002] # OLD HUNGARIAN SMALL LETTER EB +10C82 ; [.381C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EB +10CC3 ; [.381D.0020.0002] # OLD HUNGARIAN SMALL LETTER AMB +10C83 ; [.381D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AMB +10CC4 ; [.381E.0020.0002] # OLD HUNGARIAN SMALL LETTER EC +10C84 ; [.381E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EC +10CC5 ; [.381F.0020.0002] # OLD HUNGARIAN SMALL LETTER ENC +10C85 ; [.381F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENC +10CC6 ; [.3820.0020.0002] # OLD HUNGARIAN SMALL LETTER ECS +10C86 ; [.3820.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECS +10CC7 ; [.3821.0020.0002] # OLD HUNGARIAN SMALL LETTER ED +10C87 ; [.3821.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ED +10CC8 ; [.3822.0020.0002] # OLD HUNGARIAN SMALL LETTER AND +10C88 ; [.3822.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AND +10CC9 ; [.3823.0020.0002] # OLD HUNGARIAN SMALL LETTER E +10C89 ; [.3823.0020.0008] # OLD HUNGARIAN CAPITAL LETTER E +10CCA ; [.3823.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER CLOSE E +10C8A ; [.3823.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER CLOSE E +10CCB ; [.3823.0020.0004][.0000.0112.0004] # OLD HUNGARIAN SMALL LETTER EE +10C8B ; [.3823.0020.000A][.0000.0112.0004] # OLD HUNGARIAN CAPITAL LETTER EE +10CCC ; [.3824.0020.0002] # OLD HUNGARIAN SMALL LETTER EF +10C8C ; [.3824.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EF +10CCD ; [.3825.0020.0002] # OLD HUNGARIAN SMALL LETTER EG +10C8D ; [.3825.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EG +10CCE ; [.3826.0020.0002] # OLD HUNGARIAN SMALL LETTER EGY +10C8E ; [.3826.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EGY +10CCF ; [.3827.0020.0002] # OLD HUNGARIAN SMALL LETTER EH +10C8F ; [.3827.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EH +10CD0 ; [.3828.0020.0002] # OLD HUNGARIAN SMALL LETTER I +10C90 ; [.3828.0020.0008] # OLD HUNGARIAN CAPITAL LETTER I +10CD1 ; [.3828.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER II +10C91 ; [.3828.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER II +10CD2 ; [.3829.0020.0002] # OLD HUNGARIAN SMALL LETTER EJ +10C92 ; [.3829.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EJ +10CD3 ; [.382A.0020.0002] # OLD HUNGARIAN SMALL LETTER EK +10C93 ; [.382A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EK +10CD4 ; [.382B.0020.0002] # OLD HUNGARIAN SMALL LETTER AK +10C94 ; [.382B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER AK +10CD5 ; [.382C.0020.0002] # OLD HUNGARIAN SMALL LETTER UNK +10C95 ; [.382C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER UNK +10CD6 ; [.382D.0020.0002] # OLD HUNGARIAN SMALL LETTER EL +10C96 ; [.382D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EL +10CD7 ; [.382E.0020.0002] # OLD HUNGARIAN SMALL LETTER ELY +10C97 ; [.382E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ELY +10CD8 ; [.382F.0020.0002] # OLD HUNGARIAN SMALL LETTER EM +10C98 ; [.382F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EM +10CD9 ; [.3830.0020.0002] # OLD HUNGARIAN SMALL LETTER EN +10C99 ; [.3830.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EN +10CDA ; [.3831.0020.0002] # OLD HUNGARIAN SMALL LETTER ENY +10C9A ; [.3831.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENY +10CDB ; [.3832.0020.0002] # OLD HUNGARIAN SMALL LETTER O +10C9B ; [.3832.0020.0008] # OLD HUNGARIAN CAPITAL LETTER O +10CDC ; [.3832.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER OO +10C9C ; [.3832.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER OO +10CDD ; [.3833.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE +10C9D ; [.3833.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +10CDE ; [.3833.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA OE +10C9E ; [.3833.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +10CDF ; [.3833.0020.0004][.0000.0112.0004] # OLD HUNGARIAN SMALL LETTER OEE +10C9F ; [.3833.0020.000A][.0000.0112.0004] # OLD HUNGARIAN CAPITAL LETTER OEE +10CE0 ; [.3834.0020.0002] # OLD HUNGARIAN SMALL LETTER EP +10CA0 ; [.3834.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EP +10CE1 ; [.3835.0020.0002] # OLD HUNGARIAN SMALL LETTER EMP +10CA1 ; [.3835.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EMP +10CE2 ; [.3836.0020.0002] # OLD HUNGARIAN SMALL LETTER ER +10CA2 ; [.3836.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ER +10CE3 ; [.3836.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER SHORT ER +10CA3 ; [.3836.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER SHORT ER +10CE4 ; [.3837.0020.0002] # OLD HUNGARIAN SMALL LETTER ES +10CA4 ; [.3837.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ES +10CE5 ; [.3838.0020.0002] # OLD HUNGARIAN SMALL LETTER ESZ +10CA5 ; [.3838.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ESZ +10CE6 ; [.3839.0020.0002] # OLD HUNGARIAN SMALL LETTER ET +10CA6 ; [.3839.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ET +10CE7 ; [.383A.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT +10CA7 ; [.383A.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT +10CE8 ; [.383B.0020.0002] # OLD HUNGARIAN SMALL LETTER ETY +10CA8 ; [.383B.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ETY +10CE9 ; [.383C.0020.0002] # OLD HUNGARIAN SMALL LETTER ECH +10CA9 ; [.383C.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ECH +10CEA ; [.383D.0020.0002] # OLD HUNGARIAN SMALL LETTER U +10CAA ; [.383D.0020.0008] # OLD HUNGARIAN CAPITAL LETTER U +10CEB ; [.383D.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER UU +10CAB ; [.383D.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER UU +10CEC ; [.383E.0020.0002] # OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE +10CAC ; [.383E.0020.0008] # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +10CED ; [.383E.0020.0004][.0000.0111.0004] # OLD HUNGARIAN SMALL LETTER RUDIMENTA UE +10CAD ; [.383E.0020.000A][.0000.0111.0004] # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +10CEE ; [.383F.0020.0002] # OLD HUNGARIAN SMALL LETTER EV +10CAE ; [.383F.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EV +10CEF ; [.3840.0020.0002] # OLD HUNGARIAN SMALL LETTER EZ +10CAF ; [.3840.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZ +10CF0 ; [.3841.0020.0002] # OLD HUNGARIAN SMALL LETTER EZS +10CB0 ; [.3841.0020.0008] # OLD HUNGARIAN CAPITAL LETTER EZS +10CF1 ; [.3842.0020.0002] # OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN +10CB1 ; [.3842.0020.0008] # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +10CF2 ; [.3843.0020.0002] # OLD HUNGARIAN SMALL LETTER US +10CB2 ; [.3843.0020.0008] # OLD HUNGARIAN CAPITAL LETTER US +10C00 ; [.3844.0020.0002] # OLD TURKIC LETTER ORKHON A +10C01 ; [.3844.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI A +10C02 ; [.3845.0020.0002] # OLD TURKIC LETTER YENISEI AE +10C03 ; [.3846.0020.0002] # OLD TURKIC LETTER ORKHON I +10C04 ; [.3846.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI I +10C05 ; [.3847.0020.0002] # OLD TURKIC LETTER YENISEI E +10C06 ; [.3848.0020.0002] # OLD TURKIC LETTER ORKHON O +10C07 ; [.3849.0020.0002] # OLD TURKIC LETTER ORKHON OE +10C08 ; [.3849.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI OE +10C09 ; [.384A.0020.0002] # OLD TURKIC LETTER ORKHON AB +10C0A ; [.384A.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AB +10C0B ; [.384B.0020.0002] # OLD TURKIC LETTER ORKHON AEB +10C0C ; [.384B.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AEB +10C0D ; [.384C.0020.0002] # OLD TURKIC LETTER ORKHON AG +10C0E ; [.384C.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AG +10C0F ; [.384D.0020.0002] # OLD TURKIC LETTER ORKHON AEG +10C10 ; [.384D.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AEG +10C11 ; [.384E.0020.0002] # OLD TURKIC LETTER ORKHON AD +10C12 ; [.384E.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AD +10C13 ; [.384F.0020.0002] # OLD TURKIC LETTER ORKHON AED +10C14 ; [.3850.0020.0002] # OLD TURKIC LETTER ORKHON EZ +10C15 ; [.3850.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI EZ +10C16 ; [.3851.0020.0002] # OLD TURKIC LETTER ORKHON AY +10C17 ; [.3851.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AY +10C18 ; [.3852.0020.0002] # OLD TURKIC LETTER ORKHON AEY +10C19 ; [.3852.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AEY +10C1A ; [.3853.0020.0002] # OLD TURKIC LETTER ORKHON AEK +10C1B ; [.3853.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AEK +10C1C ; [.3854.0020.0002] # OLD TURKIC LETTER ORKHON OEK +10C1D ; [.3854.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI OEK +10C1E ; [.3855.0020.0002] # OLD TURKIC LETTER ORKHON AL +10C1F ; [.3855.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AL +10C20 ; [.3856.0020.0002] # OLD TURKIC LETTER ORKHON AEL +10C21 ; [.3857.0020.0002] # OLD TURKIC LETTER ORKHON ELT +10C22 ; [.3858.0020.0002] # OLD TURKIC LETTER ORKHON EM +10C23 ; [.3859.0020.0002] # OLD TURKIC LETTER ORKHON AN +10C24 ; [.385A.0020.0002] # OLD TURKIC LETTER ORKHON AEN +10C25 ; [.385A.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AEN +10C26 ; [.385B.0020.0002] # OLD TURKIC LETTER ORKHON ENT +10C27 ; [.385B.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI ENT +10C28 ; [.385C.0020.0002] # OLD TURKIC LETTER ORKHON ENC +10C29 ; [.385C.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI ENC +10C2A ; [.385D.0020.0002] # OLD TURKIC LETTER ORKHON ENY +10C2B ; [.385D.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI ENY +10C2C ; [.385E.0020.0002] # OLD TURKIC LETTER YENISEI ANG +10C2D ; [.385F.0020.0002] # OLD TURKIC LETTER ORKHON ENG +10C2E ; [.385F.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AENG +10C2F ; [.3860.0020.0002] # OLD TURKIC LETTER ORKHON EP +10C30 ; [.3861.0020.0002] # OLD TURKIC LETTER ORKHON OP +10C31 ; [.3862.0020.0002] # OLD TURKIC LETTER ORKHON IC +10C32 ; [.3863.0020.0002] # OLD TURKIC LETTER ORKHON EC +10C33 ; [.3863.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI EC +10C34 ; [.3864.0020.0002] # OLD TURKIC LETTER ORKHON AQ +10C35 ; [.3864.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AQ +10C36 ; [.3865.0020.0002] # OLD TURKIC LETTER ORKHON IQ +10C37 ; [.3865.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI IQ +10C38 ; [.3866.0020.0002] # OLD TURKIC LETTER ORKHON OQ +10C39 ; [.3866.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI OQ +10C3A ; [.3867.0020.0002] # OLD TURKIC LETTER ORKHON AR +10C3B ; [.3867.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AR +10C3C ; [.3868.0020.0002] # OLD TURKIC LETTER ORKHON AER +10C3D ; [.3869.0020.0002] # OLD TURKIC LETTER ORKHON AS +10C3E ; [.386A.0020.0002] # OLD TURKIC LETTER ORKHON AES +10C3F ; [.386B.0020.0002] # OLD TURKIC LETTER ORKHON ASH +10C40 ; [.386B.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI ASH +10C41 ; [.386C.0020.0002] # OLD TURKIC LETTER ORKHON ESH +10C42 ; [.386C.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI ESH +10C43 ; [.386D.0020.0002] # OLD TURKIC LETTER ORKHON AT +10C44 ; [.386D.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AT +10C45 ; [.386E.0020.0002] # OLD TURKIC LETTER ORKHON AET +10C46 ; [.386E.0020.0004][.0000.0111.0004] # OLD TURKIC LETTER YENISEI AET +10C47 ; [.386F.0020.0002] # OLD TURKIC LETTER ORKHON OT +10C48 ; [.3870.0020.0002] # OLD TURKIC LETTER ORKHON BASH +A500 ; [.3871.0020.0002] # VAI SYLLABLE EE +A501 ; [.3872.0020.0002] # VAI SYLLABLE EEN +A502 ; [.3873.0020.0002] # VAI SYLLABLE HEE +A503 ; [.3874.0020.0002] # VAI SYLLABLE WEE +A504 ; [.3875.0020.0002] # VAI SYLLABLE WEEN +A505 ; [.3876.0020.0002] # VAI SYLLABLE PEE +A506 ; [.3877.0020.0002] # VAI SYLLABLE BHEE +A507 ; [.3878.0020.0002] # VAI SYLLABLE BEE +A508 ; [.3879.0020.0002] # VAI SYLLABLE MBEE +A509 ; [.387A.0020.0002] # VAI SYLLABLE KPEE +A50A ; [.387B.0020.0002] # VAI SYLLABLE MGBEE +A50B ; [.387C.0020.0002] # VAI SYLLABLE GBEE +A50C ; [.387D.0020.0002] # VAI SYLLABLE FEE +A613 ; [.387D.0020.0004][.397C.0020.0004] # VAI SYMBOL FEENG +A50D ; [.387E.0020.0002] # VAI SYLLABLE VEE +A50E ; [.387F.0020.0002] # VAI SYLLABLE TEE +A50F ; [.3880.0020.0002] # VAI SYLLABLE THEE +A510 ; [.3881.0020.0002] # VAI SYLLABLE DHEE +A511 ; [.3882.0020.0002] # VAI SYLLABLE DHHEE +A512 ; [.3883.0020.0002] # VAI SYLLABLE LEE +A513 ; [.3884.0020.0002] # VAI SYLLABLE REE +A514 ; [.3885.0020.0002] # VAI SYLLABLE DEE +A515 ; [.3886.0020.0002] # VAI SYLLABLE NDEE +A516 ; [.3887.0020.0002] # VAI SYLLABLE SEE +A517 ; [.3888.0020.0002] # VAI SYLLABLE SHEE +A518 ; [.3889.0020.0002] # VAI SYLLABLE ZEE +A519 ; [.388A.0020.0002] # VAI SYLLABLE ZHEE +A51A ; [.388B.0020.0002] # VAI SYLLABLE CEE +A51B ; [.388C.0020.0002] # VAI SYLLABLE JEE +A51C ; [.388D.0020.0002] # VAI SYLLABLE NJEE +A51D ; [.388E.0020.0002] # VAI SYLLABLE YEE +A51E ; [.388F.0020.0002] # VAI SYLLABLE KEE +A614 ; [.388F.0020.0004][.397C.0020.0004] # VAI SYMBOL KEENG +A51F ; [.3890.0020.0002] # VAI SYLLABLE NGGEE +A520 ; [.3891.0020.0002] # VAI SYLLABLE GEE +A521 ; [.3892.0020.0002] # VAI SYLLABLE MEE +A522 ; [.3893.0020.0002] # VAI SYLLABLE NEE +A523 ; [.3894.0020.0002] # VAI SYLLABLE NYEE +A524 ; [.3895.0020.0002] # VAI SYLLABLE I +A525 ; [.3896.0020.0002] # VAI SYLLABLE IN +A526 ; [.3897.0020.0002] # VAI SYLLABLE HI +A527 ; [.3898.0020.0002] # VAI SYLLABLE HIN +A528 ; [.3899.0020.0002] # VAI SYLLABLE WI +A529 ; [.389A.0020.0002] # VAI SYLLABLE WIN +A52A ; [.389B.0020.0002] # VAI SYLLABLE PI +A52B ; [.389C.0020.0002] # VAI SYLLABLE BHI +A52C ; [.389D.0020.0002] # VAI SYLLABLE BI +A52D ; [.389E.0020.0002] # VAI SYLLABLE MBI +A52E ; [.389F.0020.0002] # VAI SYLLABLE KPI +A52F ; [.38A0.0020.0002] # VAI SYLLABLE MGBI +A530 ; [.38A1.0020.0002] # VAI SYLLABLE GBI +A531 ; [.38A2.0020.0002] # VAI SYLLABLE FI +A532 ; [.38A3.0020.0002] # VAI SYLLABLE VI +A533 ; [.38A4.0020.0002] # VAI SYLLABLE TI +A615 ; [.38A4.0020.0004][.397C.0020.0004] # VAI SYMBOL TING +A534 ; [.38A5.0020.0002] # VAI SYLLABLE THI +A535 ; [.38A6.0020.0002] # VAI SYLLABLE DHI +A536 ; [.38A7.0020.0002] # VAI SYLLABLE DHHI +A537 ; [.38A8.0020.0002] # VAI SYLLABLE LI +A538 ; [.38A9.0020.0002] # VAI SYLLABLE RI +A539 ; [.38AA.0020.0002] # VAI SYLLABLE DI +A53A ; [.38AB.0020.0002] # VAI SYLLABLE NDI +A53B ; [.38AC.0020.0002] # VAI SYLLABLE SI +A53C ; [.38AD.0020.0002] # VAI SYLLABLE SHI +A53D ; [.38AE.0020.0002] # VAI SYLLABLE ZI +A53E ; [.38AF.0020.0002] # VAI SYLLABLE ZHI +A53F ; [.38B0.0020.0002] # VAI SYLLABLE CI +A540 ; [.38B1.0020.0002] # VAI SYLLABLE JI +A541 ; [.38B2.0020.0002] # VAI SYLLABLE NJI +A542 ; [.38B3.0020.0002] # VAI SYLLABLE YI +A543 ; [.38B4.0020.0002] # VAI SYLLABLE KI +A544 ; [.38B5.0020.0002] # VAI SYLLABLE NGGI +A545 ; [.38B6.0020.0002] # VAI SYLLABLE GI +A546 ; [.38B7.0020.0002] # VAI SYLLABLE MI +A547 ; [.38B8.0020.0002] # VAI SYLLABLE NI +A616 ; [.38B8.0020.0004][.397D.0020.0004] # VAI SYMBOL NII +A548 ; [.38B9.0020.0002] # VAI SYLLABLE NYI +A549 ; [.38BA.0020.0002] # VAI SYLLABLE A +A54A ; [.38BB.0020.0002] # VAI SYLLABLE AN +A54B ; [.38BC.0020.0002] # VAI SYLLABLE NGAN +A54C ; [.38BD.0020.0002] # VAI SYLLABLE HA +A54D ; [.38BE.0020.0002] # VAI SYLLABLE HAN +A54E ; [.38BF.0020.0002] # VAI SYLLABLE WA +A54F ; [.38C0.0020.0002] # VAI SYLLABLE WAN +A550 ; [.38C1.0020.0002] # VAI SYLLABLE PA +A551 ; [.38C2.0020.0002] # VAI SYLLABLE BHA +A552 ; [.38C3.0020.0002] # VAI SYLLABLE BA +A617 ; [.38C3.0020.0004][.397C.0020.0004] # VAI SYMBOL BANG +A553 ; [.38C4.0020.0002] # VAI SYLLABLE MBA +A554 ; [.38C5.0020.0002] # VAI SYLLABLE KPA +A555 ; [.38C6.0020.0002] # VAI SYLLABLE KPAN +A556 ; [.38C7.0020.0002] # VAI SYLLABLE MGBA +A557 ; [.38C8.0020.0002] # VAI SYLLABLE GBA +A558 ; [.38C9.0020.0002] # VAI SYLLABLE FA +A610 ; [.38C9.0020.0004] # VAI SYLLABLE NDOLE FA +A618 ; [.38C9.0020.0004][.397D.0020.0004] # VAI SYMBOL FAA +A559 ; [.38CA.0020.0002] # VAI SYLLABLE VA +A55A ; [.38CB.0020.0002] # VAI SYLLABLE TA +A619 ; [.38CB.0020.0004][.397D.0020.0004] # VAI SYMBOL TAA +A55B ; [.38CC.0020.0002] # VAI SYLLABLE THA +A55C ; [.38CD.0020.0002] # VAI SYLLABLE DHA +A55D ; [.38CE.0020.0002] # VAI SYLLABLE DHHA +A55E ; [.38CF.0020.0002] # VAI SYLLABLE LA +A55F ; [.38D0.0020.0002] # VAI SYLLABLE RA +A560 ; [.38D1.0020.0002] # VAI SYLLABLE DA +A61A ; [.38D1.0020.0004][.397C.0020.0004] # VAI SYMBOL DANG +A561 ; [.38D2.0020.0002] # VAI SYLLABLE NDA +A562 ; [.38D3.0020.0002] # VAI SYLLABLE SA +A563 ; [.38D4.0020.0002] # VAI SYLLABLE SHA +A564 ; [.38D5.0020.0002] # VAI SYLLABLE ZA +A565 ; [.38D6.0020.0002] # VAI SYLLABLE ZHA +A566 ; [.38D7.0020.0002] # VAI SYLLABLE CA +A567 ; [.38D8.0020.0002] # VAI SYLLABLE JA +A568 ; [.38D9.0020.0002] # VAI SYLLABLE NJA +A569 ; [.38DA.0020.0002] # VAI SYLLABLE YA +A56A ; [.38DB.0020.0002] # VAI SYLLABLE KA +A611 ; [.38DB.0020.0004] # VAI SYLLABLE NDOLE KA +A56B ; [.38DC.0020.0002] # VAI SYLLABLE KAN +A56C ; [.38DD.0020.0002] # VAI SYLLABLE NGGA +A56D ; [.38DE.0020.0002] # VAI SYLLABLE GA +A56E ; [.38DF.0020.0002] # VAI SYLLABLE MA +A62A ; [.38DF.0020.0004] # VAI SYLLABLE NDOLE MA +A56F ; [.38E0.0020.0002] # VAI SYLLABLE NA +A570 ; [.38E1.0020.0002] # VAI SYLLABLE NYA +A571 ; [.38E2.0020.0002] # VAI SYLLABLE OO +A572 ; [.38E3.0020.0002] # VAI SYLLABLE OON +A573 ; [.38E4.0020.0002] # VAI SYLLABLE HOO +A574 ; [.38E5.0020.0002] # VAI SYLLABLE WOO +A575 ; [.38E6.0020.0002] # VAI SYLLABLE WOON +A576 ; [.38E7.0020.0002] # VAI SYLLABLE POO +A577 ; [.38E8.0020.0002] # VAI SYLLABLE BHOO +A578 ; [.38E9.0020.0002] # VAI SYLLABLE BOO +A579 ; [.38EA.0020.0002] # VAI SYLLABLE MBOO +A57A ; [.38EB.0020.0002] # VAI SYLLABLE KPOO +A57B ; [.38EC.0020.0002] # VAI SYLLABLE MGBOO +A57C ; [.38ED.0020.0002] # VAI SYLLABLE GBOO +A57D ; [.38EE.0020.0002] # VAI SYLLABLE FOO +A57E ; [.38EF.0020.0002] # VAI SYLLABLE VOO +A57F ; [.38F0.0020.0002] # VAI SYLLABLE TOO +A580 ; [.38F1.0020.0002] # VAI SYLLABLE THOO +A581 ; [.38F2.0020.0002] # VAI SYLLABLE DHOO +A582 ; [.38F3.0020.0002] # VAI SYLLABLE DHHOO +A583 ; [.38F4.0020.0002] # VAI SYLLABLE LOO +A584 ; [.38F5.0020.0002] # VAI SYLLABLE ROO +A585 ; [.38F6.0020.0002] # VAI SYLLABLE DOO +A61B ; [.38F6.0020.0004][.397C.0020.0004] # VAI SYMBOL DOONG +A586 ; [.38F7.0020.0002] # VAI SYLLABLE NDOO +A587 ; [.38F8.0020.0002] # VAI SYLLABLE SOO +A612 ; [.38F8.0020.0004] # VAI SYLLABLE NDOLE SOO +A588 ; [.38F9.0020.0002] # VAI SYLLABLE SHOO +A589 ; [.38FA.0020.0002] # VAI SYLLABLE ZOO +A58A ; [.38FB.0020.0002] # VAI SYLLABLE ZHOO +A58B ; [.38FC.0020.0002] # VAI SYLLABLE COO +A58C ; [.38FD.0020.0002] # VAI SYLLABLE JOO +A58D ; [.38FE.0020.0002] # VAI SYLLABLE NJOO +A58E ; [.38FF.0020.0002] # VAI SYLLABLE YOO +A58F ; [.3900.0020.0002] # VAI SYLLABLE KOO +A590 ; [.3901.0020.0002] # VAI SYLLABLE NGGOO +A591 ; [.3902.0020.0002] # VAI SYLLABLE GOO +A592 ; [.3903.0020.0002] # VAI SYLLABLE MOO +A593 ; [.3904.0020.0002] # VAI SYLLABLE NOO +A594 ; [.3905.0020.0002] # VAI SYLLABLE NYOO +A595 ; [.3906.0020.0002] # VAI SYLLABLE U +A596 ; [.3907.0020.0002] # VAI SYLLABLE UN +A597 ; [.3908.0020.0002] # VAI SYLLABLE HU +A598 ; [.3909.0020.0002] # VAI SYLLABLE HUN +A599 ; [.390A.0020.0002] # VAI SYLLABLE WU +A59A ; [.390B.0020.0002] # VAI SYLLABLE WUN +A59B ; [.390C.0020.0002] # VAI SYLLABLE PU +A59C ; [.390D.0020.0002] # VAI SYLLABLE BHU +A59D ; [.390E.0020.0002] # VAI SYLLABLE BU +A59E ; [.390F.0020.0002] # VAI SYLLABLE MBU +A59F ; [.3910.0020.0002] # VAI SYLLABLE KPU +A5A0 ; [.3911.0020.0002] # VAI SYLLABLE MGBU +A5A1 ; [.3912.0020.0002] # VAI SYLLABLE GBU +A5A2 ; [.3913.0020.0002] # VAI SYLLABLE FU +A5A3 ; [.3914.0020.0002] # VAI SYLLABLE VU +A5A4 ; [.3915.0020.0002] # VAI SYLLABLE TU +A5A5 ; [.3916.0020.0002] # VAI SYLLABLE THU +A5A6 ; [.3917.0020.0002] # VAI SYLLABLE DHU +A5A7 ; [.3918.0020.0002] # VAI SYLLABLE DHHU +A5A8 ; [.3919.0020.0002] # VAI SYLLABLE LU +A5A9 ; [.391A.0020.0002] # VAI SYLLABLE RU +A5AA ; [.391B.0020.0002] # VAI SYLLABLE DU +A5AB ; [.391C.0020.0002] # VAI SYLLABLE NDU +A5AC ; [.391D.0020.0002] # VAI SYLLABLE SU +A5AD ; [.391E.0020.0002] # VAI SYLLABLE SHU +A5AE ; [.391F.0020.0002] # VAI SYLLABLE ZU +A5AF ; [.3920.0020.0002] # VAI SYLLABLE ZHU +A5B0 ; [.3921.0020.0002] # VAI SYLLABLE CU +A5B1 ; [.3922.0020.0002] # VAI SYLLABLE JU +A5B2 ; [.3923.0020.0002] # VAI SYLLABLE NJU +A5B3 ; [.3924.0020.0002] # VAI SYLLABLE YU +A5B4 ; [.3925.0020.0002] # VAI SYLLABLE KU +A61C ; [.3925.0020.0004][.397C.0020.0004] # VAI SYMBOL KUNG +A5B5 ; [.3926.0020.0002] # VAI SYLLABLE NGGU +A5B6 ; [.3927.0020.0002] # VAI SYLLABLE GU +A5B7 ; [.3928.0020.0002] # VAI SYLLABLE MU +A5B8 ; [.3929.0020.0002] # VAI SYLLABLE NU +A5B9 ; [.392A.0020.0002] # VAI SYLLABLE NYU +A5BA ; [.392B.0020.0002] # VAI SYLLABLE O +A5BB ; [.392C.0020.0002] # VAI SYLLABLE ON +A5BC ; [.392D.0020.0002] # VAI SYLLABLE NGON +A5BD ; [.392E.0020.0002] # VAI SYLLABLE HO +A5BE ; [.392F.0020.0002] # VAI SYLLABLE HON +A5BF ; [.3930.0020.0002] # VAI SYLLABLE WO +A5C0 ; [.3931.0020.0002] # VAI SYLLABLE WON +A5C1 ; [.3932.0020.0002] # VAI SYLLABLE PO +A5C2 ; [.3933.0020.0002] # VAI SYLLABLE BHO +A5C3 ; [.3934.0020.0002] # VAI SYLLABLE BO +A5C4 ; [.3935.0020.0002] # VAI SYLLABLE MBO +A5C5 ; [.3936.0020.0002] # VAI SYLLABLE KPO +A5C6 ; [.3937.0020.0002] # VAI SYLLABLE MGBO +A5C7 ; [.3938.0020.0002] # VAI SYLLABLE GBO +A5C8 ; [.3939.0020.0002] # VAI SYLLABLE GBON +A5C9 ; [.393A.0020.0002] # VAI SYLLABLE FO +A5CA ; [.393B.0020.0002] # VAI SYLLABLE VO +A5CB ; [.393C.0020.0002] # VAI SYLLABLE TO +A61D ; [.393C.0020.0004][.397C.0020.0004] # VAI SYMBOL TONG +A5CC ; [.393D.0020.0002] # VAI SYLLABLE THO +A5CD ; [.393E.0020.0002] # VAI SYLLABLE DHO +A5CE ; [.393F.0020.0002] # VAI SYLLABLE DHHO +A5CF ; [.3940.0020.0002] # VAI SYLLABLE LO +A5D0 ; [.3941.0020.0002] # VAI SYLLABLE RO +A5D1 ; [.3942.0020.0002] # VAI SYLLABLE DO +A62B ; [.3942.0020.0004] # VAI SYLLABLE NDOLE DO +A61E ; [.3942.0020.0004][.397D.0020.0004] # VAI SYMBOL DO-O +A5D2 ; [.3943.0020.0002] # VAI SYLLABLE NDO +A5D3 ; [.3944.0020.0002] # VAI SYLLABLE SO +A5D4 ; [.3945.0020.0002] # VAI SYLLABLE SHO +A5D5 ; [.3946.0020.0002] # VAI SYLLABLE ZO +A5D6 ; [.3947.0020.0002] # VAI SYLLABLE ZHO +A5D7 ; [.3948.0020.0002] # VAI SYLLABLE CO +A5D8 ; [.3949.0020.0002] # VAI SYLLABLE JO +A61F ; [.3949.0020.0004][.397C.0020.0004] # VAI SYMBOL JONG +A5D9 ; [.394A.0020.0002] # VAI SYLLABLE NJO +A5DA ; [.394B.0020.0002] # VAI SYLLABLE YO +A5DB ; [.394C.0020.0002] # VAI SYLLABLE KO +A5DC ; [.394D.0020.0002] # VAI SYLLABLE NGGO +A5DD ; [.394E.0020.0002] # VAI SYLLABLE GO +A5DE ; [.394F.0020.0002] # VAI SYLLABLE MO +A5DF ; [.3950.0020.0002] # VAI SYLLABLE NO +A5E0 ; [.3951.0020.0002] # VAI SYLLABLE NYO +A5E1 ; [.3952.0020.0002] # VAI SYLLABLE E +A5E2 ; [.3953.0020.0002] # VAI SYLLABLE EN +A5E3 ; [.3954.0020.0002] # VAI SYLLABLE NGEN +A5E4 ; [.3955.0020.0002] # VAI SYLLABLE HE +A5E5 ; [.3956.0020.0002] # VAI SYLLABLE HEN +A5E6 ; [.3957.0020.0002] # VAI SYLLABLE WE +A5E7 ; [.3958.0020.0002] # VAI SYLLABLE WEN +A5E8 ; [.3959.0020.0002] # VAI SYLLABLE PE +A5E9 ; [.395A.0020.0002] # VAI SYLLABLE BHE +A5EA ; [.395B.0020.0002] # VAI SYLLABLE BE +A5EB ; [.395C.0020.0002] # VAI SYLLABLE MBE +A5EC ; [.395D.0020.0002] # VAI SYLLABLE KPE +A5ED ; [.395E.0020.0002] # VAI SYLLABLE KPEN +A5EE ; [.395F.0020.0002] # VAI SYLLABLE MGBE +A5EF ; [.3960.0020.0002] # VAI SYLLABLE GBE +A5F0 ; [.3961.0020.0002] # VAI SYLLABLE GBEN +A5F1 ; [.3962.0020.0002] # VAI SYLLABLE FE +A5F2 ; [.3963.0020.0002] # VAI SYLLABLE VE +A5F3 ; [.3964.0020.0002] # VAI SYLLABLE TE +A5F4 ; [.3965.0020.0002] # VAI SYLLABLE THE +A5F5 ; [.3966.0020.0002] # VAI SYLLABLE DHE +A5F6 ; [.3967.0020.0002] # VAI SYLLABLE DHHE +A5F7 ; [.3968.0020.0002] # VAI SYLLABLE LE +A5F8 ; [.3969.0020.0002] # VAI SYLLABLE RE +A5F9 ; [.396A.0020.0002] # VAI SYLLABLE DE +A5FA ; [.396B.0020.0002] # VAI SYLLABLE NDE +A5FB ; [.396C.0020.0002] # VAI SYLLABLE SE +A5FC ; [.396D.0020.0002] # VAI SYLLABLE SHE +A5FD ; [.396E.0020.0002] # VAI SYLLABLE ZE +A5FE ; [.396F.0020.0002] # VAI SYLLABLE ZHE +A5FF ; [.3970.0020.0002] # VAI SYLLABLE CE +A600 ; [.3971.0020.0002] # VAI SYLLABLE JE +A601 ; [.3972.0020.0002] # VAI SYLLABLE NJE +A602 ; [.3973.0020.0002] # VAI SYLLABLE YE +A603 ; [.3974.0020.0002] # VAI SYLLABLE KE +A604 ; [.3975.0020.0002] # VAI SYLLABLE NGGE +A605 ; [.3976.0020.0002] # VAI SYLLABLE NGGEN +A606 ; [.3977.0020.0002] # VAI SYLLABLE GE +A607 ; [.3978.0020.0002] # VAI SYLLABLE GEN +A608 ; [.3979.0020.0002] # VAI SYLLABLE ME +A609 ; [.397A.0020.0002] # VAI SYLLABLE NE +A60A ; [.397B.0020.0002] # VAI SYLLABLE NYE +A60B ; [.397C.0020.0002] # VAI SYLLABLE NG +A60C ; [.397D.0020.0002] # VAI SYLLABLE LENGTHENER +A6A0 ; [.397E.0020.0002] # BAMUM LETTER A +A6A1 ; [.397F.0020.0002] # BAMUM LETTER KA +A6A2 ; [.3980.0020.0002] # BAMUM LETTER U +A6A3 ; [.3981.0020.0002] # BAMUM LETTER KU +A6A4 ; [.3982.0020.0002] # BAMUM LETTER EE +A6A5 ; [.3983.0020.0002] # BAMUM LETTER REE +A6A6 ; [.3984.0020.0002] # BAMUM LETTER TAE +A6A7 ; [.3985.0020.0002] # BAMUM LETTER O +A6A8 ; [.3986.0020.0002] # BAMUM LETTER NYI +A6A9 ; [.3987.0020.0002] # BAMUM LETTER I +A6AA ; [.3988.0020.0002] # BAMUM LETTER LA +A6AB ; [.3989.0020.0002] # BAMUM LETTER PA +A6AC ; [.398A.0020.0002] # BAMUM LETTER RII +A6AD ; [.398B.0020.0002] # BAMUM LETTER RIEE +A6AE ; [.398C.0020.0002] # BAMUM LETTER LEEEE +A6AF ; [.398D.0020.0002] # BAMUM LETTER MEEEE +A6B0 ; [.398E.0020.0002] # BAMUM LETTER TAA +A6B1 ; [.398F.0020.0002] # BAMUM LETTER NDAA +A6B2 ; [.3990.0020.0002] # BAMUM LETTER NJAEM +A6B3 ; [.3991.0020.0002] # BAMUM LETTER M +A6B4 ; [.3992.0020.0002] # BAMUM LETTER SUU +A6B5 ; [.3993.0020.0002] # BAMUM LETTER MU +A6B6 ; [.3994.0020.0002] # BAMUM LETTER SHII +A6B7 ; [.3995.0020.0002] # BAMUM LETTER SI +A6B8 ; [.3996.0020.0002] # BAMUM LETTER SHEUX +A6B9 ; [.3997.0020.0002] # BAMUM LETTER SEUX +A6BA ; [.3998.0020.0002] # BAMUM LETTER KYEE +A6BB ; [.3999.0020.0002] # BAMUM LETTER KET +A6BC ; [.399A.0020.0002] # BAMUM LETTER NUAE +A6BD ; [.399B.0020.0002] # BAMUM LETTER NU +A6BE ; [.399C.0020.0002] # BAMUM LETTER NJUAE +A6BF ; [.399D.0020.0002] # BAMUM LETTER YOQ +A6C0 ; [.399E.0020.0002] # BAMUM LETTER SHU +A6C1 ; [.399F.0020.0002] # BAMUM LETTER YUQ +A6C2 ; [.39A0.0020.0002] # BAMUM LETTER YA +A6C3 ; [.39A1.0020.0002] # BAMUM LETTER NSHA +A6C4 ; [.39A2.0020.0002] # BAMUM LETTER KEUX +A6C5 ; [.39A3.0020.0002] # BAMUM LETTER PEUX +A6C6 ; [.39A4.0020.0002] # BAMUM LETTER NJEE +A6C7 ; [.39A5.0020.0002] # BAMUM LETTER NTEE +A6C8 ; [.39A6.0020.0002] # BAMUM LETTER PUE +A6C9 ; [.39A7.0020.0002] # BAMUM LETTER WUE +A6CA ; [.39A8.0020.0002] # BAMUM LETTER PEE +A6CB ; [.39A9.0020.0002] # BAMUM LETTER FEE +A6CC ; [.39AA.0020.0002] # BAMUM LETTER RU +A6CD ; [.39AB.0020.0002] # BAMUM LETTER LU +A6CE ; [.39AC.0020.0002] # BAMUM LETTER MI +A6CF ; [.39AD.0020.0002] # BAMUM LETTER NI +A6D0 ; [.39AE.0020.0002] # BAMUM LETTER REUX +A6D1 ; [.39AF.0020.0002] # BAMUM LETTER RAE +A6D2 ; [.39B0.0020.0002] # BAMUM LETTER KEN +A6D3 ; [.39B1.0020.0002] # BAMUM LETTER NGKWAEN +A6D4 ; [.39B2.0020.0002] # BAMUM LETTER NGGA +A6D5 ; [.39B3.0020.0002] # BAMUM LETTER NGA +A6D6 ; [.39B4.0020.0002] # BAMUM LETTER SHO +A6D7 ; [.39B5.0020.0002] # BAMUM LETTER PUAE +A6D8 ; [.39B6.0020.0002] # BAMUM LETTER FU +A6D9 ; [.39B7.0020.0002] # BAMUM LETTER FOM +A6DA ; [.39B8.0020.0002] # BAMUM LETTER WA +A6DB ; [.39B9.0020.0002] # BAMUM LETTER NA +A6DC ; [.39BA.0020.0002] # BAMUM LETTER LI +A6DD ; [.39BB.0020.0002] # BAMUM LETTER PI +A6DE ; [.39BC.0020.0002] # BAMUM LETTER LOQ +A6DF ; [.39BD.0020.0002] # BAMUM LETTER KO +A6E0 ; [.39BE.0020.0002] # BAMUM LETTER MBEN +A6E1 ; [.39BF.0020.0002] # BAMUM LETTER REN +A6E2 ; [.39C0.0020.0002] # BAMUM LETTER MEN +A6E3 ; [.39C1.0020.0002] # BAMUM LETTER MA +A6E4 ; [.39C2.0020.0002] # BAMUM LETTER TI +A6E5 ; [.39C3.0020.0002] # BAMUM LETTER KI +A6E6 ; [.39C4.0020.0002] # BAMUM LETTER MO +A6E7 ; [.39C5.0020.0002] # BAMUM LETTER MBAA +A6E8 ; [.39C6.0020.0002] # BAMUM LETTER TET +A6E9 ; [.39C7.0020.0002] # BAMUM LETTER KPA +A6EA ; [.39C8.0020.0002] # BAMUM LETTER TEN +A6EB ; [.39C9.0020.0002] # BAMUM LETTER NTUU +A6EC ; [.39CA.0020.0002] # BAMUM LETTER SAMBA +A6ED ; [.39CB.0020.0002] # BAMUM LETTER FAAMAE +A6EE ; [.39CC.0020.0002] # BAMUM LETTER KOVUU +A6EF ; [.39CD.0020.0002] # BAMUM LETTER KOGHOM +16800 ; [.39CE.0020.0002] # BAMUM LETTER PHASE-A NGKUE MFON +16801 ; [.39CF.0020.0002] # BAMUM LETTER PHASE-A GBIEE FON +16802 ; [.39D0.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE +16803 ; [.39D1.0020.0002] # BAMUM LETTER PHASE-A PON MFON PIPAEMBA +16804 ; [.39D2.0020.0002] # BAMUM LETTER PHASE-A NAA MFON +16805 ; [.39D3.0020.0002] # BAMUM LETTER PHASE-A SHUENSHUET +16806 ; [.39D4.0020.0002] # BAMUM LETTER PHASE-A TITA MFON +16807 ; [.39D5.0020.0002] # BAMUM LETTER PHASE-A NZA MFON +16808 ; [.39D6.0020.0002] # BAMUM LETTER PHASE-A SHINDA PA NJI +16809 ; [.39D7.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE +1680A ; [.39D8.0020.0002] # BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA +1680B ; [.39D9.0020.0002] # BAMUM LETTER PHASE-A MAEMBGBIEE +1680C ; [.39DA.0020.0002] # BAMUM LETTER PHASE-A TU MAEMBA +1680D ; [.39DB.0020.0002] # BAMUM LETTER PHASE-A NGANGU +1680E ; [.39DC.0020.0002] # BAMUM LETTER PHASE-A MAEMVEUX +1680F ; [.39DD.0020.0002] # BAMUM LETTER PHASE-A MANSUAE +16810 ; [.39DE.0020.0002] # BAMUM LETTER PHASE-A MVEUAENGAM +16811 ; [.39DF.0020.0002] # BAMUM LETTER PHASE-A SEUNYAM +16812 ; [.39E0.0020.0002] # BAMUM LETTER PHASE-A NTOQPEN +16813 ; [.39E1.0020.0002] # BAMUM LETTER PHASE-A KEUKEUTNDA +16814 ; [.39E2.0020.0002] # BAMUM LETTER PHASE-A NKINDI +16815 ; [.39E3.0020.0002] # BAMUM LETTER PHASE-A SUU +16816 ; [.39E4.0020.0002] # BAMUM LETTER PHASE-A NGKUENZEUM +16817 ; [.39E5.0020.0002] # BAMUM LETTER PHASE-A LAPAQ +16818 ; [.39E6.0020.0002] # BAMUM LETTER PHASE-A LET KUT +16819 ; [.39E7.0020.0002] # BAMUM LETTER PHASE-A NTAP MFAA +1681A ; [.39E8.0020.0002] # BAMUM LETTER PHASE-A MAEKEUP +1681B ; [.39E9.0020.0002] # BAMUM LETTER PHASE-A PASHAE +1681C ; [.39EA.0020.0002] # BAMUM LETTER PHASE-A GHEUAERAE +1681D ; [.39EB.0020.0002] # BAMUM LETTER PHASE-A PAMSHAE +1681E ; [.39EC.0020.0002] # BAMUM LETTER PHASE-A MON NGGEUAET +1681F ; [.39ED.0020.0002] # BAMUM LETTER PHASE-A NZUN MEUT +16820 ; [.39EE.0020.0002] # BAMUM LETTER PHASE-A U YUQ NAE +16821 ; [.39EF.0020.0002] # BAMUM LETTER PHASE-A GHEUAEGHEUAE +16822 ; [.39F0.0020.0002] # BAMUM LETTER PHASE-A NTAP NTAA +16823 ; [.39F1.0020.0002] # BAMUM LETTER PHASE-A SISA +16824 ; [.39F2.0020.0002] # BAMUM LETTER PHASE-A MGBASA +16825 ; [.39F3.0020.0002] # BAMUM LETTER PHASE-A MEUNJOMNDEUQ +16826 ; [.39F4.0020.0002] # BAMUM LETTER PHASE-A MOOMPUQ +16827 ; [.39F5.0020.0002] # BAMUM LETTER PHASE-A KAFA +16828 ; [.39F6.0020.0002] # BAMUM LETTER PHASE-A PA LEERAEWA +16829 ; [.39F7.0020.0002] # BAMUM LETTER PHASE-A NDA LEERAEWA +1682A ; [.39F8.0020.0002] # BAMUM LETTER PHASE-A PET +1682B ; [.39F9.0020.0002] # BAMUM LETTER PHASE-A MAEMKPEN +1682C ; [.39FA.0020.0002] # BAMUM LETTER PHASE-A NIKA +1682D ; [.39FB.0020.0002] # BAMUM LETTER PHASE-A PUP +1682E ; [.39FC.0020.0002] # BAMUM LETTER PHASE-A TUAEP +1682F ; [.39FD.0020.0002] # BAMUM LETTER PHASE-A LUAEP +16830 ; [.39FE.0020.0002] # BAMUM LETTER PHASE-A SONJAM +16831 ; [.39FF.0020.0002] # BAMUM LETTER PHASE-A TEUTEUWEN +16832 ; [.3A00.0020.0002] # BAMUM LETTER PHASE-A MAENYI +16833 ; [.3A01.0020.0002] # BAMUM LETTER PHASE-A KET +16834 ; [.3A02.0020.0002] # BAMUM LETTER PHASE-A NDAANGGEUAET +16835 ; [.3A03.0020.0002] # BAMUM LETTER PHASE-A KUOQ +16836 ; [.3A04.0020.0002] # BAMUM LETTER PHASE-A MOOMEUT +16837 ; [.3A05.0020.0002] # BAMUM LETTER PHASE-A SHUM +16838 ; [.3A06.0020.0002] # BAMUM LETTER PHASE-A LOMMAE +16839 ; [.3A07.0020.0002] # BAMUM LETTER PHASE-A FIRI +1683A ; [.3A08.0020.0002] # BAMUM LETTER PHASE-A ROM +1683B ; [.3A09.0020.0002] # BAMUM LETTER PHASE-A KPOQ +1683C ; [.3A0A.0020.0002] # BAMUM LETTER PHASE-A SOQ +1683D ; [.3A0B.0020.0002] # BAMUM LETTER PHASE-A MAP PIEET +1683E ; [.3A0C.0020.0002] # BAMUM LETTER PHASE-A SHIRAE +1683F ; [.3A0D.0020.0002] # BAMUM LETTER PHASE-A NTAP +16840 ; [.3A0E.0020.0002] # BAMUM LETTER PHASE-A SHOQ NSHUT YUM +16841 ; [.3A0F.0020.0002] # BAMUM LETTER PHASE-A NYIT MONGKEUAEQ +16842 ; [.3A10.0020.0002] # BAMUM LETTER PHASE-A PAARAE +16843 ; [.3A11.0020.0002] # BAMUM LETTER PHASE-A NKAARAE +16844 ; [.3A12.0020.0002] # BAMUM LETTER PHASE-A UNKNOWN +16845 ; [.3A13.0020.0002] # BAMUM LETTER PHASE-A NGGEN +16846 ; [.3A14.0020.0002] # BAMUM LETTER PHASE-A MAESI +16847 ; [.3A15.0020.0002] # BAMUM LETTER PHASE-A NJAM +16848 ; [.3A16.0020.0002] # BAMUM LETTER PHASE-A MBANYI +16849 ; [.3A17.0020.0002] # BAMUM LETTER PHASE-A NYET +1684A ; [.3A18.0020.0002] # BAMUM LETTER PHASE-A TEUAEN +1684B ; [.3A19.0020.0002] # BAMUM LETTER PHASE-A SOT +1684C ; [.3A1A.0020.0002] # BAMUM LETTER PHASE-A PAAM +1684D ; [.3A1B.0020.0002] # BAMUM LETTER PHASE-A NSHIEE +1684E ; [.3A1C.0020.0002] # BAMUM LETTER PHASE-A MAEM +1684F ; [.3A1D.0020.0002] # BAMUM LETTER PHASE-A NYI +16850 ; [.3A1E.0020.0002] # BAMUM LETTER PHASE-A KAQ +16851 ; [.3A1F.0020.0002] # BAMUM LETTER PHASE-A NSHA +16852 ; [.3A20.0020.0002] # BAMUM LETTER PHASE-A VEE +16853 ; [.3A21.0020.0002] # BAMUM LETTER PHASE-A LU +16854 ; [.3A22.0020.0002] # BAMUM LETTER PHASE-A NEN +16855 ; [.3A23.0020.0002] # BAMUM LETTER PHASE-A NAQ +16856 ; [.3A24.0020.0002] # BAMUM LETTER PHASE-A MBAQ +16857 ; [.3A25.0020.0002] # BAMUM LETTER PHASE-B NSHUET +16858 ; [.3A26.0020.0002] # BAMUM LETTER PHASE-B TU MAEMGBIEE +16859 ; [.3A27.0020.0002] # BAMUM LETTER PHASE-B SIEE +1685A ; [.3A28.0020.0002] # BAMUM LETTER PHASE-B SET TU +1685B ; [.3A29.0020.0002] # BAMUM LETTER PHASE-B LOM NTEUM +1685C ; [.3A2A.0020.0002] # BAMUM LETTER PHASE-B MBA MAELEE +1685D ; [.3A2B.0020.0002] # BAMUM LETTER PHASE-B KIEEM +1685E ; [.3A2C.0020.0002] # BAMUM LETTER PHASE-B YEURAE +1685F ; [.3A2D.0020.0002] # BAMUM LETTER PHASE-B MBAARAE +16860 ; [.3A2E.0020.0002] # BAMUM LETTER PHASE-B KAM +16861 ; [.3A2F.0020.0002] # BAMUM LETTER PHASE-B PEESHI +16862 ; [.3A30.0020.0002] # BAMUM LETTER PHASE-B YAFU LEERAEWA +16863 ; [.3A31.0020.0002] # BAMUM LETTER PHASE-B LAM NSHUT NYAM +16864 ; [.3A32.0020.0002] # BAMUM LETTER PHASE-B NTIEE SHEUOQ +16865 ; [.3A33.0020.0002] # BAMUM LETTER PHASE-B NDU NJAA +16866 ; [.3A34.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEUAEM +16867 ; [.3A35.0020.0002] # BAMUM LETTER PHASE-B PIT +16868 ; [.3A36.0020.0002] # BAMUM LETTER PHASE-B TU NSIEE +16869 ; [.3A37.0020.0002] # BAMUM LETTER PHASE-B SHET NJAQ +1686A ; [.3A38.0020.0002] # BAMUM LETTER PHASE-B SHEUAEQTU +1686B ; [.3A39.0020.0002] # BAMUM LETTER PHASE-B MFON TEUAEQ +1686C ; [.3A3A.0020.0002] # BAMUM LETTER PHASE-B MBIT MBAAKET +1686D ; [.3A3B.0020.0002] # BAMUM LETTER PHASE-B NYI NTEUM +1686E ; [.3A3C.0020.0002] # BAMUM LETTER PHASE-B KEUPUQ +1686F ; [.3A3D.0020.0002] # BAMUM LETTER PHASE-B GHEUGHEN +16870 ; [.3A3E.0020.0002] # BAMUM LETTER PHASE-B KEUYEUX +16871 ; [.3A3F.0020.0002] # BAMUM LETTER PHASE-B LAANAE +16872 ; [.3A40.0020.0002] # BAMUM LETTER PHASE-B PARUM +16873 ; [.3A41.0020.0002] # BAMUM LETTER PHASE-B VEUM +16874 ; [.3A42.0020.0002] # BAMUM LETTER PHASE-B NGKINDI MVOP +16875 ; [.3A43.0020.0002] # BAMUM LETTER PHASE-B NGGEU MBU +16876 ; [.3A44.0020.0002] # BAMUM LETTER PHASE-B WUAET +16877 ; [.3A45.0020.0002] # BAMUM LETTER PHASE-B SAKEUAE +16878 ; [.3A46.0020.0002] # BAMUM LETTER PHASE-B TAAM +16879 ; [.3A47.0020.0002] # BAMUM LETTER PHASE-B MEUQ +1687A ; [.3A48.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ +1687B ; [.3A49.0020.0002] # BAMUM LETTER PHASE-B NGGUOQ LARGE +1687C ; [.3A4A.0020.0002] # BAMUM LETTER PHASE-B MFIYAQ +1687D ; [.3A4B.0020.0002] # BAMUM LETTER PHASE-B SUE +1687E ; [.3A4C.0020.0002] # BAMUM LETTER PHASE-B MBEURI +1687F ; [.3A4D.0020.0002] # BAMUM LETTER PHASE-B MONTIEEN +16880 ; [.3A4E.0020.0002] # BAMUM LETTER PHASE-B NYAEMAE +16881 ; [.3A4F.0020.0002] # BAMUM LETTER PHASE-B PUNGAAM +16882 ; [.3A50.0020.0002] # BAMUM LETTER PHASE-B MEUT NGGEET +16883 ; [.3A51.0020.0002] # BAMUM LETTER PHASE-B FEUX +16884 ; [.3A52.0020.0002] # BAMUM LETTER PHASE-B MBUOQ +16885 ; [.3A53.0020.0002] # BAMUM LETTER PHASE-B FEE +16886 ; [.3A54.0020.0002] # BAMUM LETTER PHASE-B KEUAEM +16887 ; [.3A55.0020.0002] # BAMUM LETTER PHASE-B MA NJEUAENA +16888 ; [.3A56.0020.0002] # BAMUM LETTER PHASE-B MA NJUQA +16889 ; [.3A57.0020.0002] # BAMUM LETTER PHASE-B LET +1688A ; [.3A58.0020.0002] # BAMUM LETTER PHASE-B NGGAAM +1688B ; [.3A59.0020.0002] # BAMUM LETTER PHASE-B NSEN +1688C ; [.3A5A.0020.0002] # BAMUM LETTER PHASE-B MA +1688D ; [.3A5B.0020.0002] # BAMUM LETTER PHASE-B KIQ +1688E ; [.3A5C.0020.0002] # BAMUM LETTER PHASE-B NGOM +1688F ; [.3A5D.0020.0002] # BAMUM LETTER PHASE-C NGKUE MAEMBA +16890 ; [.3A5E.0020.0002] # BAMUM LETTER PHASE-C NZA +16891 ; [.3A5F.0020.0002] # BAMUM LETTER PHASE-C YUM +16892 ; [.3A60.0020.0002] # BAMUM LETTER PHASE-C WANGKUOQ +16893 ; [.3A61.0020.0002] # BAMUM LETTER PHASE-C NGGEN +16894 ; [.3A62.0020.0002] # BAMUM LETTER PHASE-C NDEUAEREE +16895 ; [.3A63.0020.0002] # BAMUM LETTER PHASE-C NGKAQ +16896 ; [.3A64.0020.0002] # BAMUM LETTER PHASE-C GHARAE +16897 ; [.3A65.0020.0002] # BAMUM LETTER PHASE-C MBEEKEET +16898 ; [.3A66.0020.0002] # BAMUM LETTER PHASE-C GBAYI +16899 ; [.3A67.0020.0002] # BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN +1689A ; [.3A68.0020.0002] # BAMUM LETTER PHASE-C NTU MBIT +1689B ; [.3A69.0020.0002] # BAMUM LETTER PHASE-C MBEUM +1689C ; [.3A6A.0020.0002] # BAMUM LETTER PHASE-C PIRIEEN +1689D ; [.3A6B.0020.0002] # BAMUM LETTER PHASE-C NDOMBU +1689E ; [.3A6C.0020.0002] # BAMUM LETTER PHASE-C MBAA CABBAGE-TREE +1689F ; [.3A6D.0020.0002] # BAMUM LETTER PHASE-C KEUSHEUAEP +168A0 ; [.3A6E.0020.0002] # BAMUM LETTER PHASE-C GHAP +168A1 ; [.3A6F.0020.0002] # BAMUM LETTER PHASE-C KEUKAQ +168A2 ; [.3A70.0020.0002] # BAMUM LETTER PHASE-C YU MUOMAE +168A3 ; [.3A71.0020.0002] # BAMUM LETTER PHASE-C NZEUM +168A4 ; [.3A72.0020.0002] # BAMUM LETTER PHASE-C MBUE +168A5 ; [.3A73.0020.0002] # BAMUM LETTER PHASE-C NSEUAEN +168A6 ; [.3A74.0020.0002] # BAMUM LETTER PHASE-C MBIT +168A7 ; [.3A75.0020.0002] # BAMUM LETTER PHASE-C YEUQ +168A8 ; [.3A76.0020.0002] # BAMUM LETTER PHASE-C KPARAQ +168A9 ; [.3A77.0020.0002] # BAMUM LETTER PHASE-C KAA +168AA ; [.3A78.0020.0002] # BAMUM LETTER PHASE-C SEUX +168AB ; [.3A79.0020.0002] # BAMUM LETTER PHASE-C NDIDA +168AC ; [.3A7A.0020.0002] # BAMUM LETTER PHASE-C TAASHAE +168AD ; [.3A7B.0020.0002] # BAMUM LETTER PHASE-C NJUEQ +168AE ; [.3A7C.0020.0002] # BAMUM LETTER PHASE-C TITA YUE +168AF ; [.3A7D.0020.0002] # BAMUM LETTER PHASE-C SUAET +168B0 ; [.3A7E.0020.0002] # BAMUM LETTER PHASE-C NGGUAEN NYAM +168B1 ; [.3A7F.0020.0002] # BAMUM LETTER PHASE-C VEUX +168B2 ; [.3A80.0020.0002] # BAMUM LETTER PHASE-C NANSANAQ +168B3 ; [.3A81.0020.0002] # BAMUM LETTER PHASE-C MA KEUAERI +168B4 ; [.3A82.0020.0002] # BAMUM LETTER PHASE-C NTAA +168B5 ; [.3A83.0020.0002] # BAMUM LETTER PHASE-C NGGUON +168B6 ; [.3A84.0020.0002] # BAMUM LETTER PHASE-C LAP +168B7 ; [.3A85.0020.0002] # BAMUM LETTER PHASE-C MBIRIEEN +168B8 ; [.3A86.0020.0002] # BAMUM LETTER PHASE-C MGBASAQ +168B9 ; [.3A87.0020.0002] # BAMUM LETTER PHASE-C NTEUNGBA +168BA ; [.3A88.0020.0002] # BAMUM LETTER PHASE-C TEUTEUX +168BB ; [.3A89.0020.0002] # BAMUM LETTER PHASE-C NGGUM +168BC ; [.3A8A.0020.0002] # BAMUM LETTER PHASE-C FUE +168BD ; [.3A8B.0020.0002] # BAMUM LETTER PHASE-C NDEUT +168BE ; [.3A8C.0020.0002] # BAMUM LETTER PHASE-C NSA +168BF ; [.3A8D.0020.0002] # BAMUM LETTER PHASE-C NSHAQ +168C0 ; [.3A8E.0020.0002] # BAMUM LETTER PHASE-C BUNG +168C1 ; [.3A8F.0020.0002] # BAMUM LETTER PHASE-C VEUAEPEN +168C2 ; [.3A90.0020.0002] # BAMUM LETTER PHASE-C MBERAE +168C3 ; [.3A91.0020.0002] # BAMUM LETTER PHASE-C RU +168C4 ; [.3A92.0020.0002] # BAMUM LETTER PHASE-C NJAEM +168C5 ; [.3A93.0020.0002] # BAMUM LETTER PHASE-C LAM +168C6 ; [.3A94.0020.0002] # BAMUM LETTER PHASE-C TITUAEP +168C7 ; [.3A95.0020.0002] # BAMUM LETTER PHASE-C NSUOT NGOM +168C8 ; [.3A96.0020.0002] # BAMUM LETTER PHASE-C NJEEEE +168C9 ; [.3A97.0020.0002] # BAMUM LETTER PHASE-C KET +168CA ; [.3A98.0020.0002] # BAMUM LETTER PHASE-C NGGU +168CB ; [.3A99.0020.0002] # BAMUM LETTER PHASE-C MAESI +168CC ; [.3A9A.0020.0002] # BAMUM LETTER PHASE-C MBUAEM +168CD ; [.3A9B.0020.0002] # BAMUM LETTER PHASE-C LU +168CE ; [.3A9C.0020.0002] # BAMUM LETTER PHASE-C KUT +168CF ; [.3A9D.0020.0002] # BAMUM LETTER PHASE-C NJAM +168D0 ; [.3A9E.0020.0002] # BAMUM LETTER PHASE-C NGOM +168D1 ; [.3A9F.0020.0002] # BAMUM LETTER PHASE-C WUP +168D2 ; [.3AA0.0020.0002] # BAMUM LETTER PHASE-C NGGUEET +168D3 ; [.3AA1.0020.0002] # BAMUM LETTER PHASE-C NSOM +168D4 ; [.3AA2.0020.0002] # BAMUM LETTER PHASE-C NTEN +168D5 ; [.3AA3.0020.0002] # BAMUM LETTER PHASE-C KUOP NKAARAE +168D6 ; [.3AA4.0020.0002] # BAMUM LETTER PHASE-C NSUN +168D7 ; [.3AA5.0020.0002] # BAMUM LETTER PHASE-C NDAM +168D8 ; [.3AA6.0020.0002] # BAMUM LETTER PHASE-C MA NSIEE +168D9 ; [.3AA7.0020.0002] # BAMUM LETTER PHASE-C YAA +168DA ; [.3AA8.0020.0002] # BAMUM LETTER PHASE-C NDAP +168DB ; [.3AA9.0020.0002] # BAMUM LETTER PHASE-C SHUEQ +168DC ; [.3AAA.0020.0002] # BAMUM LETTER PHASE-C SETFON +168DD ; [.3AAB.0020.0002] # BAMUM LETTER PHASE-C MBI +168DE ; [.3AAC.0020.0002] # BAMUM LETTER PHASE-C MAEMBA +168DF ; [.3AAD.0020.0002] # BAMUM LETTER PHASE-C MBANYI +168E0 ; [.3AAE.0020.0002] # BAMUM LETTER PHASE-C KEUSEUX +168E1 ; [.3AAF.0020.0002] # BAMUM LETTER PHASE-C MBEUX +168E2 ; [.3AB0.0020.0002] # BAMUM LETTER PHASE-C KEUM +168E3 ; [.3AB1.0020.0002] # BAMUM LETTER PHASE-C MBAA PICKET +168E4 ; [.3AB2.0020.0002] # BAMUM LETTER PHASE-C YUWOQ +168E5 ; [.3AB3.0020.0002] # BAMUM LETTER PHASE-C NJEUX +168E6 ; [.3AB4.0020.0002] # BAMUM LETTER PHASE-C MIEE +168E7 ; [.3AB5.0020.0002] # BAMUM LETTER PHASE-C MUAE +168E8 ; [.3AB6.0020.0002] # BAMUM LETTER PHASE-C SHIQ +168E9 ; [.3AB7.0020.0002] # BAMUM LETTER PHASE-C KEN LAW +168EA ; [.3AB8.0020.0002] # BAMUM LETTER PHASE-C KEN FATIGUE +168EB ; [.3AB9.0020.0002] # BAMUM LETTER PHASE-C NGAQ +168EC ; [.3ABA.0020.0002] # BAMUM LETTER PHASE-C NAQ +168ED ; [.3ABB.0020.0002] # BAMUM LETTER PHASE-C LIQ +168EE ; [.3ABC.0020.0002] # BAMUM LETTER PHASE-C PIN +168EF ; [.3ABD.0020.0002] # BAMUM LETTER PHASE-C PEN +168F0 ; [.3ABE.0020.0002] # BAMUM LETTER PHASE-C TET +168F1 ; [.3ABF.0020.0002] # BAMUM LETTER PHASE-D MBUO +168F2 ; [.3AC0.0020.0002] # BAMUM LETTER PHASE-D WAP +168F3 ; [.3AC1.0020.0002] # BAMUM LETTER PHASE-D NJI +168F4 ; [.3AC2.0020.0002] # BAMUM LETTER PHASE-D MFON +168F5 ; [.3AC3.0020.0002] # BAMUM LETTER PHASE-D NJIEE +168F6 ; [.3AC4.0020.0002] # BAMUM LETTER PHASE-D LIEE +168F7 ; [.3AC5.0020.0002] # BAMUM LETTER PHASE-D NJEUT +168F8 ; [.3AC6.0020.0002] # BAMUM LETTER PHASE-D NSHEE +168F9 ; [.3AC7.0020.0002] # BAMUM LETTER PHASE-D NGGAAMAE +168FA ; [.3AC8.0020.0002] # BAMUM LETTER PHASE-D NYAM +168FB ; [.3AC9.0020.0002] # BAMUM LETTER PHASE-D WUAEN +168FC ; [.3ACA.0020.0002] # BAMUM LETTER PHASE-D NGKUN +168FD ; [.3ACB.0020.0002] # BAMUM LETTER PHASE-D SHEE +168FE ; [.3ACC.0020.0002] # BAMUM LETTER PHASE-D NGKAP +168FF ; [.3ACD.0020.0002] # BAMUM LETTER PHASE-D KEUAETMEUN +16900 ; [.3ACE.0020.0002] # BAMUM LETTER PHASE-D TEUT +16901 ; [.3ACF.0020.0002] # BAMUM LETTER PHASE-D SHEUAE +16902 ; [.3AD0.0020.0002] # BAMUM LETTER PHASE-D NJAP +16903 ; [.3AD1.0020.0002] # BAMUM LETTER PHASE-D SUE +16904 ; [.3AD2.0020.0002] # BAMUM LETTER PHASE-D KET +16905 ; [.3AD3.0020.0002] # BAMUM LETTER PHASE-D YAEMMAE +16906 ; [.3AD4.0020.0002] # BAMUM LETTER PHASE-D KUOM +16907 ; [.3AD5.0020.0002] # BAMUM LETTER PHASE-D SAP +16908 ; [.3AD6.0020.0002] # BAMUM LETTER PHASE-D MFEUT +16909 ; [.3AD7.0020.0002] # BAMUM LETTER PHASE-D NDEUX +1690A ; [.3AD8.0020.0002] # BAMUM LETTER PHASE-D MALEERI +1690B ; [.3AD9.0020.0002] # BAMUM LETTER PHASE-D MEUT +1690C ; [.3ADA.0020.0002] # BAMUM LETTER PHASE-D SEUAEQ +1690D ; [.3ADB.0020.0002] # BAMUM LETTER PHASE-D YEN +1690E ; [.3ADC.0020.0002] # BAMUM LETTER PHASE-D NJEUAEM +1690F ; [.3ADD.0020.0002] # BAMUM LETTER PHASE-D KEUOT MBUAE +16910 ; [.3ADE.0020.0002] # BAMUM LETTER PHASE-D NGKEURI +16911 ; [.3ADF.0020.0002] # BAMUM LETTER PHASE-D TU +16912 ; [.3AE0.0020.0002] # BAMUM LETTER PHASE-D GHAA +16913 ; [.3AE1.0020.0002] # BAMUM LETTER PHASE-D NGKYEE +16914 ; [.3AE2.0020.0002] # BAMUM LETTER PHASE-D FEUFEUAET +16915 ; [.3AE3.0020.0002] # BAMUM LETTER PHASE-D NDEE +16916 ; [.3AE4.0020.0002] # BAMUM LETTER PHASE-D MGBOFUM +16917 ; [.3AE5.0020.0002] # BAMUM LETTER PHASE-D LEUAEP +16918 ; [.3AE6.0020.0002] # BAMUM LETTER PHASE-D NDON +16919 ; [.3AE7.0020.0002] # BAMUM LETTER PHASE-D MONI +1691A ; [.3AE8.0020.0002] # BAMUM LETTER PHASE-D MGBEUN +1691B ; [.3AE9.0020.0002] # BAMUM LETTER PHASE-D PUUT +1691C ; [.3AEA.0020.0002] # BAMUM LETTER PHASE-D MGBIEE +1691D ; [.3AEB.0020.0002] # BAMUM LETTER PHASE-D MFO +1691E ; [.3AEC.0020.0002] # BAMUM LETTER PHASE-D LUM +1691F ; [.3AED.0020.0002] # BAMUM LETTER PHASE-D NSIEEP +16920 ; [.3AEE.0020.0002] # BAMUM LETTER PHASE-D MBAA +16921 ; [.3AEF.0020.0002] # BAMUM LETTER PHASE-D KWAET +16922 ; [.3AF0.0020.0002] # BAMUM LETTER PHASE-D NYET +16923 ; [.3AF1.0020.0002] # BAMUM LETTER PHASE-D TEUAEN +16924 ; [.3AF2.0020.0002] # BAMUM LETTER PHASE-D SOT +16925 ; [.3AF3.0020.0002] # BAMUM LETTER PHASE-D YUWOQ +16926 ; [.3AF4.0020.0002] # BAMUM LETTER PHASE-D KEUM +16927 ; [.3AF5.0020.0002] # BAMUM LETTER PHASE-D RAEM +16928 ; [.3AF6.0020.0002] # BAMUM LETTER PHASE-D TEEEE +16929 ; [.3AF7.0020.0002] # BAMUM LETTER PHASE-D NGKEUAEQ +1692A ; [.3AF8.0020.0002] # BAMUM LETTER PHASE-D MFEUAE +1692B ; [.3AF9.0020.0002] # BAMUM LETTER PHASE-D NSIEET +1692C ; [.3AFA.0020.0002] # BAMUM LETTER PHASE-D KEUP +1692D ; [.3AFB.0020.0002] # BAMUM LETTER PHASE-D PIP +1692E ; [.3AFC.0020.0002] # BAMUM LETTER PHASE-D PEUTAE +1692F ; [.3AFD.0020.0002] # BAMUM LETTER PHASE-D NYUE +16930 ; [.3AFE.0020.0002] # BAMUM LETTER PHASE-D LET +16931 ; [.3AFF.0020.0002] # BAMUM LETTER PHASE-D NGGAAM +16932 ; [.3B00.0020.0002] # BAMUM LETTER PHASE-D MFIEE +16933 ; [.3B01.0020.0002] # BAMUM LETTER PHASE-D NGGWAEN +16934 ; [.3B02.0020.0002] # BAMUM LETTER PHASE-D YUOM +16935 ; [.3B03.0020.0002] # BAMUM LETTER PHASE-D PAP +16936 ; [.3B04.0020.0002] # BAMUM LETTER PHASE-D YUOP +16937 ; [.3B05.0020.0002] # BAMUM LETTER PHASE-D NDAM +16938 ; [.3B06.0020.0002] # BAMUM LETTER PHASE-D NTEUM +16939 ; [.3B07.0020.0002] # BAMUM LETTER PHASE-D SUAE +1693A ; [.3B08.0020.0002] # BAMUM LETTER PHASE-D KUN +1693B ; [.3B09.0020.0002] # BAMUM LETTER PHASE-D NGGEUX +1693C ; [.3B0A.0020.0002] # BAMUM LETTER PHASE-D NGKIEE +1693D ; [.3B0B.0020.0002] # BAMUM LETTER PHASE-D TUOT +1693E ; [.3B0C.0020.0002] # BAMUM LETTER PHASE-D MEUN +1693F ; [.3B0D.0020.0002] # BAMUM LETTER PHASE-D KUQ +16940 ; [.3B0E.0020.0002] # BAMUM LETTER PHASE-D NSUM +16941 ; [.3B0F.0020.0002] # BAMUM LETTER PHASE-D TEUN +16942 ; [.3B10.0020.0002] # BAMUM LETTER PHASE-D MAENJET +16943 ; [.3B11.0020.0002] # BAMUM LETTER PHASE-D NGGAP +16944 ; [.3B12.0020.0002] # BAMUM LETTER PHASE-D LEUM +16945 ; [.3B13.0020.0002] # BAMUM LETTER PHASE-D NGGUOM +16946 ; [.3B14.0020.0002] # BAMUM LETTER PHASE-D NSHUT +16947 ; [.3B15.0020.0002] # BAMUM LETTER PHASE-D NJUEQ +16948 ; [.3B16.0020.0002] # BAMUM LETTER PHASE-D GHEUAE +16949 ; [.3B17.0020.0002] # BAMUM LETTER PHASE-D KU +1694A ; [.3B18.0020.0002] # BAMUM LETTER PHASE-D REN OLD +1694B ; [.3B19.0020.0002] # BAMUM LETTER PHASE-D TAE +1694C ; [.3B1A.0020.0002] # BAMUM LETTER PHASE-D TOQ +1694D ; [.3B1B.0020.0002] # BAMUM LETTER PHASE-D NYI +1694E ; [.3B1C.0020.0002] # BAMUM LETTER PHASE-D RII +1694F ; [.3B1D.0020.0002] # BAMUM LETTER PHASE-D LEEEE +16950 ; [.3B1E.0020.0002] # BAMUM LETTER PHASE-D MEEEE +16951 ; [.3B1F.0020.0002] # BAMUM LETTER PHASE-D M +16952 ; [.3B20.0020.0002] # BAMUM LETTER PHASE-D SUU +16953 ; [.3B21.0020.0002] # BAMUM LETTER PHASE-D MU +16954 ; [.3B22.0020.0002] # BAMUM LETTER PHASE-D SHII +16955 ; [.3B23.0020.0002] # BAMUM LETTER PHASE-D SHEUX +16956 ; [.3B24.0020.0002] # BAMUM LETTER PHASE-D KYEE +16957 ; [.3B25.0020.0002] # BAMUM LETTER PHASE-D NU +16958 ; [.3B26.0020.0002] # BAMUM LETTER PHASE-D SHU +16959 ; [.3B27.0020.0002] # BAMUM LETTER PHASE-D NTEE +1695A ; [.3B28.0020.0002] # BAMUM LETTER PHASE-D PEE +1695B ; [.3B29.0020.0002] # BAMUM LETTER PHASE-D NI +1695C ; [.3B2A.0020.0002] # BAMUM LETTER PHASE-D SHOQ +1695D ; [.3B2B.0020.0002] # BAMUM LETTER PHASE-D PUQ +1695E ; [.3B2C.0020.0002] # BAMUM LETTER PHASE-D MVOP +1695F ; [.3B2D.0020.0002] # BAMUM LETTER PHASE-D LOQ +16960 ; [.3B2E.0020.0002] # BAMUM LETTER PHASE-D REN MUCH +16961 ; [.3B2F.0020.0002] # BAMUM LETTER PHASE-D TI +16962 ; [.3B30.0020.0002] # BAMUM LETTER PHASE-D NTUU +16963 ; [.3B31.0020.0002] # BAMUM LETTER PHASE-D MBAA SEVEN +16964 ; [.3B32.0020.0002] # BAMUM LETTER PHASE-D SAQ +16965 ; [.3B33.0020.0002] # BAMUM LETTER PHASE-D FAA +16966 ; [.3B34.0020.0002] # BAMUM LETTER PHASE-E NDAP +16967 ; [.3B35.0020.0002] # BAMUM LETTER PHASE-E TOON +16968 ; [.3B36.0020.0002] # BAMUM LETTER PHASE-E MBEUM +16969 ; [.3B37.0020.0002] # BAMUM LETTER PHASE-E LAP +1696A ; [.3B38.0020.0002] # BAMUM LETTER PHASE-E VOM +1696B ; [.3B39.0020.0002] # BAMUM LETTER PHASE-E LOON +1696C ; [.3B3A.0020.0002] # BAMUM LETTER PHASE-E PAA +1696D ; [.3B3B.0020.0002] # BAMUM LETTER PHASE-E SOM +1696E ; [.3B3C.0020.0002] # BAMUM LETTER PHASE-E RAQ +1696F ; [.3B3D.0020.0002] # BAMUM LETTER PHASE-E NSHUOP +16970 ; [.3B3E.0020.0002] # BAMUM LETTER PHASE-E NDUN +16971 ; [.3B3F.0020.0002] # BAMUM LETTER PHASE-E PUAE +16972 ; [.3B40.0020.0002] # BAMUM LETTER PHASE-E TAM +16973 ; [.3B41.0020.0002] # BAMUM LETTER PHASE-E NGKA +16974 ; [.3B42.0020.0002] # BAMUM LETTER PHASE-E KPEUX +16975 ; [.3B43.0020.0002] # BAMUM LETTER PHASE-E WUO +16976 ; [.3B44.0020.0002] # BAMUM LETTER PHASE-E SEE +16977 ; [.3B45.0020.0002] # BAMUM LETTER PHASE-E NGGEUAET +16978 ; [.3B46.0020.0002] # BAMUM LETTER PHASE-E PAAM +16979 ; [.3B47.0020.0002] # BAMUM LETTER PHASE-E TOO +1697A ; [.3B48.0020.0002] # BAMUM LETTER PHASE-E KUOP +1697B ; [.3B49.0020.0002] # BAMUM LETTER PHASE-E LOM +1697C ; [.3B4A.0020.0002] # BAMUM LETTER PHASE-E NSHIEE +1697D ; [.3B4B.0020.0002] # BAMUM LETTER PHASE-E NGOP +1697E ; [.3B4C.0020.0002] # BAMUM LETTER PHASE-E MAEM +1697F ; [.3B4D.0020.0002] # BAMUM LETTER PHASE-E NGKEUX +16980 ; [.3B4E.0020.0002] # BAMUM LETTER PHASE-E NGOQ +16981 ; [.3B4F.0020.0002] # BAMUM LETTER PHASE-E NSHUE +16982 ; [.3B50.0020.0002] # BAMUM LETTER PHASE-E RIMGBA +16983 ; [.3B51.0020.0002] # BAMUM LETTER PHASE-E NJEUX +16984 ; [.3B52.0020.0002] # BAMUM LETTER PHASE-E PEEM +16985 ; [.3B53.0020.0002] # BAMUM LETTER PHASE-E SAA +16986 ; [.3B54.0020.0002] # BAMUM LETTER PHASE-E NGGURAE +16987 ; [.3B55.0020.0002] # BAMUM LETTER PHASE-E MGBA +16988 ; [.3B56.0020.0002] # BAMUM LETTER PHASE-E GHEUX +16989 ; [.3B57.0020.0002] # BAMUM LETTER PHASE-E NGKEUAEM +1698A ; [.3B58.0020.0002] # BAMUM LETTER PHASE-E NJAEMLI +1698B ; [.3B59.0020.0002] # BAMUM LETTER PHASE-E MAP +1698C ; [.3B5A.0020.0002] # BAMUM LETTER PHASE-E LOOT +1698D ; [.3B5B.0020.0002] # BAMUM LETTER PHASE-E NGGEEEE +1698E ; [.3B5C.0020.0002] # BAMUM LETTER PHASE-E NDIQ +1698F ; [.3B5D.0020.0002] # BAMUM LETTER PHASE-E TAEN NTEUM +16990 ; [.3B5E.0020.0002] # BAMUM LETTER PHASE-E SET +16991 ; [.3B5F.0020.0002] # BAMUM LETTER PHASE-E PUM +16992 ; [.3B60.0020.0002] # BAMUM LETTER PHASE-E NDAA SOFTNESS +16993 ; [.3B61.0020.0002] # BAMUM LETTER PHASE-E NGGUAESHAE NYAM +16994 ; [.3B62.0020.0002] # BAMUM LETTER PHASE-E YIEE +16995 ; [.3B63.0020.0002] # BAMUM LETTER PHASE-E GHEUN +16996 ; [.3B64.0020.0002] # BAMUM LETTER PHASE-E TUAE +16997 ; [.3B65.0020.0002] # BAMUM LETTER PHASE-E YEUAE +16998 ; [.3B66.0020.0002] # BAMUM LETTER PHASE-E PO +16999 ; [.3B67.0020.0002] # BAMUM LETTER PHASE-E TUMAE +1699A ; [.3B68.0020.0002] # BAMUM LETTER PHASE-E KEUAE +1699B ; [.3B69.0020.0002] # BAMUM LETTER PHASE-E SUAEN +1699C ; [.3B6A.0020.0002] # BAMUM LETTER PHASE-E TEUAEQ +1699D ; [.3B6B.0020.0002] # BAMUM LETTER PHASE-E VEUAE +1699E ; [.3B6C.0020.0002] # BAMUM LETTER PHASE-E WEUX +1699F ; [.3B6D.0020.0002] # BAMUM LETTER PHASE-E LAAM +169A0 ; [.3B6E.0020.0002] # BAMUM LETTER PHASE-E PU +169A1 ; [.3B6F.0020.0002] # BAMUM LETTER PHASE-E TAAQ +169A2 ; [.3B70.0020.0002] # BAMUM LETTER PHASE-E GHAAMAE +169A3 ; [.3B71.0020.0002] # BAMUM LETTER PHASE-E NGEUREUT +169A4 ; [.3B72.0020.0002] # BAMUM LETTER PHASE-E SHEUAEQ +169A5 ; [.3B73.0020.0002] # BAMUM LETTER PHASE-E MGBEN +169A6 ; [.3B74.0020.0002] # BAMUM LETTER PHASE-E MBEE +169A7 ; [.3B75.0020.0002] # BAMUM LETTER PHASE-E NZAQ +169A8 ; [.3B76.0020.0002] # BAMUM LETTER PHASE-E NKOM +169A9 ; [.3B77.0020.0002] # BAMUM LETTER PHASE-E GBET +169AA ; [.3B78.0020.0002] # BAMUM LETTER PHASE-E TUM +169AB ; [.3B79.0020.0002] # BAMUM LETTER PHASE-E KUET +169AC ; [.3B7A.0020.0002] # BAMUM LETTER PHASE-E YAP +169AD ; [.3B7B.0020.0002] # BAMUM LETTER PHASE-E NYI CLEAVER +169AE ; [.3B7C.0020.0002] # BAMUM LETTER PHASE-E YIT +169AF ; [.3B7D.0020.0002] # BAMUM LETTER PHASE-E MFEUQ +169B0 ; [.3B7E.0020.0002] # BAMUM LETTER PHASE-E NDIAQ +169B1 ; [.3B7F.0020.0002] # BAMUM LETTER PHASE-E PIEEQ +169B2 ; [.3B80.0020.0002] # BAMUM LETTER PHASE-E YUEQ +169B3 ; [.3B81.0020.0002] # BAMUM LETTER PHASE-E LEUAEM +169B4 ; [.3B82.0020.0002] # BAMUM LETTER PHASE-E FUE +169B5 ; [.3B83.0020.0002] # BAMUM LETTER PHASE-E GBEUX +169B6 ; [.3B84.0020.0002] # BAMUM LETTER PHASE-E NGKUP +169B7 ; [.3B85.0020.0002] # BAMUM LETTER PHASE-E KET +169B8 ; [.3B86.0020.0002] # BAMUM LETTER PHASE-E MAE +169B9 ; [.3B87.0020.0002] # BAMUM LETTER PHASE-E NGKAAMI +169BA ; [.3B88.0020.0002] # BAMUM LETTER PHASE-E GHET +169BB ; [.3B89.0020.0002] # BAMUM LETTER PHASE-E FA +169BC ; [.3B8A.0020.0002] # BAMUM LETTER PHASE-E NTUM +169BD ; [.3B8B.0020.0002] # BAMUM LETTER PHASE-E PEUT +169BE ; [.3B8C.0020.0002] # BAMUM LETTER PHASE-E YEUM +169BF ; [.3B8D.0020.0002] # BAMUM LETTER PHASE-E NGGEUAE +169C0 ; [.3B8E.0020.0002] # BAMUM LETTER PHASE-E NYI BETWEEN +169C1 ; [.3B8F.0020.0002] # BAMUM LETTER PHASE-E NZUQ +169C2 ; [.3B90.0020.0002] # BAMUM LETTER PHASE-E POON +169C3 ; [.3B91.0020.0002] # BAMUM LETTER PHASE-E MIEE +169C4 ; [.3B92.0020.0002] # BAMUM LETTER PHASE-E FUET +169C5 ; [.3B93.0020.0002] # BAMUM LETTER PHASE-E NAE +169C6 ; [.3B94.0020.0002] # BAMUM LETTER PHASE-E MUAE +169C7 ; [.3B95.0020.0002] # BAMUM LETTER PHASE-E GHEUAE +169C8 ; [.3B96.0020.0002] # BAMUM LETTER PHASE-E FU I +169C9 ; [.3B97.0020.0002] # BAMUM LETTER PHASE-E MVI +169CA ; [.3B98.0020.0002] # BAMUM LETTER PHASE-E PUAQ +169CB ; [.3B99.0020.0002] # BAMUM LETTER PHASE-E NGKUM +169CC ; [.3B9A.0020.0002] # BAMUM LETTER PHASE-E KUT +169CD ; [.3B9B.0020.0002] # BAMUM LETTER PHASE-E PIET +169CE ; [.3B9C.0020.0002] # BAMUM LETTER PHASE-E NTAP +169CF ; [.3B9D.0020.0002] # BAMUM LETTER PHASE-E YEUAET +169D0 ; [.3B9E.0020.0002] # BAMUM LETTER PHASE-E NGGUP +169D1 ; [.3B9F.0020.0002] # BAMUM LETTER PHASE-E PA PEOPLE +169D2 ; [.3BA0.0020.0002] # BAMUM LETTER PHASE-E FU CALL +169D3 ; [.3BA1.0020.0002] # BAMUM LETTER PHASE-E FOM +169D4 ; [.3BA2.0020.0002] # BAMUM LETTER PHASE-E NJEE +169D5 ; [.3BA3.0020.0002] # BAMUM LETTER PHASE-E A +169D6 ; [.3BA4.0020.0002] # BAMUM LETTER PHASE-E TOQ +169D7 ; [.3BA5.0020.0002] # BAMUM LETTER PHASE-E O +169D8 ; [.3BA6.0020.0002] # BAMUM LETTER PHASE-E I +169D9 ; [.3BA7.0020.0002] # BAMUM LETTER PHASE-E LAQ +169DA ; [.3BA8.0020.0002] # BAMUM LETTER PHASE-E PA PLURAL +169DB ; [.3BA9.0020.0002] # BAMUM LETTER PHASE-E TAA +169DC ; [.3BAA.0020.0002] # BAMUM LETTER PHASE-E TAQ +169DD ; [.3BAB.0020.0002] # BAMUM LETTER PHASE-E NDAA MY HOUSE +169DE ; [.3BAC.0020.0002] # BAMUM LETTER PHASE-E SHIQ +169DF ; [.3BAD.0020.0002] # BAMUM LETTER PHASE-E YEUX +169E0 ; [.3BAE.0020.0002] # BAMUM LETTER PHASE-E NGUAE +169E1 ; [.3BAF.0020.0002] # BAMUM LETTER PHASE-E YUAEN +169E2 ; [.3BB0.0020.0002] # BAMUM LETTER PHASE-E YOQ SWIMMING +169E3 ; [.3BB1.0020.0002] # BAMUM LETTER PHASE-E YOQ COVER +169E4 ; [.3BB2.0020.0002] # BAMUM LETTER PHASE-E YUQ +169E5 ; [.3BB3.0020.0002] # BAMUM LETTER PHASE-E YUN +169E6 ; [.3BB4.0020.0002] # BAMUM LETTER PHASE-E KEUX +169E7 ; [.3BB5.0020.0002] # BAMUM LETTER PHASE-E PEUX +169E8 ; [.3BB6.0020.0002] # BAMUM LETTER PHASE-E NJEE EPOCH +169E9 ; [.3BB7.0020.0002] # BAMUM LETTER PHASE-E PUE +169EA ; [.3BB8.0020.0002] # BAMUM LETTER PHASE-E WUE +169EB ; [.3BB9.0020.0002] # BAMUM LETTER PHASE-E FEE +169EC ; [.3BBA.0020.0002] # BAMUM LETTER PHASE-E VEE +169ED ; [.3BBB.0020.0002] # BAMUM LETTER PHASE-E LU +169EE ; [.3BBC.0020.0002] # BAMUM LETTER PHASE-E MI +169EF ; [.3BBD.0020.0002] # BAMUM LETTER PHASE-E REUX +169F0 ; [.3BBE.0020.0002] # BAMUM LETTER PHASE-E RAE +169F1 ; [.3BBF.0020.0002] # BAMUM LETTER PHASE-E NGUAET +169F2 ; [.3BC0.0020.0002] # BAMUM LETTER PHASE-E NGA +169F3 ; [.3BC1.0020.0002] # BAMUM LETTER PHASE-E SHO +169F4 ; [.3BC2.0020.0002] # BAMUM LETTER PHASE-E SHOQ +169F5 ; [.3BC3.0020.0002] # BAMUM LETTER PHASE-E FU REMEDY +169F6 ; [.3BC4.0020.0002] # BAMUM LETTER PHASE-E NA +169F7 ; [.3BC5.0020.0002] # BAMUM LETTER PHASE-E PI +169F8 ; [.3BC6.0020.0002] # BAMUM LETTER PHASE-E LOQ +169F9 ; [.3BC7.0020.0002] # BAMUM LETTER PHASE-E KO +169FA ; [.3BC8.0020.0002] # BAMUM LETTER PHASE-E MEN +169FB ; [.3BC9.0020.0002] # BAMUM LETTER PHASE-E MA +169FC ; [.3BCA.0020.0002] # BAMUM LETTER PHASE-E MAQ +169FD ; [.3BCB.0020.0002] # BAMUM LETTER PHASE-E TEU +169FE ; [.3BCC.0020.0002] # BAMUM LETTER PHASE-E KI +169FF ; [.3BCD.0020.0002] # BAMUM LETTER PHASE-E MON +16A00 ; [.3BCE.0020.0002] # BAMUM LETTER PHASE-E TEN +16A01 ; [.3BCF.0020.0002] # BAMUM LETTER PHASE-E FAQ +16A02 ; [.3BD0.0020.0002] # BAMUM LETTER PHASE-E GHOM +16A03 ; [.3BD1.0020.0002] # BAMUM LETTER PHASE-F KA +16A04 ; [.3BD2.0020.0002] # BAMUM LETTER PHASE-F U +16A05 ; [.3BD3.0020.0002] # BAMUM LETTER PHASE-F KU +16A06 ; [.3BD4.0020.0002] # BAMUM LETTER PHASE-F EE +16A07 ; [.3BD5.0020.0002] # BAMUM LETTER PHASE-F REE +16A08 ; [.3BD6.0020.0002] # BAMUM LETTER PHASE-F TAE +16A09 ; [.3BD7.0020.0002] # BAMUM LETTER PHASE-F NYI +16A0A ; [.3BD8.0020.0002] # BAMUM LETTER PHASE-F LA +16A0B ; [.3BD9.0020.0002] # BAMUM LETTER PHASE-F RII +16A0C ; [.3BDA.0020.0002] # BAMUM LETTER PHASE-F RIEE +16A0D ; [.3BDB.0020.0002] # BAMUM LETTER PHASE-F MEEEE +16A0E ; [.3BDC.0020.0002] # BAMUM LETTER PHASE-F TAA +16A0F ; [.3BDD.0020.0002] # BAMUM LETTER PHASE-F NDAA +16A10 ; [.3BDE.0020.0002] # BAMUM LETTER PHASE-F NJAEM +16A11 ; [.3BDF.0020.0002] # BAMUM LETTER PHASE-F M +16A12 ; [.3BE0.0020.0002] # BAMUM LETTER PHASE-F SUU +16A13 ; [.3BE1.0020.0002] # BAMUM LETTER PHASE-F SHII +16A14 ; [.3BE2.0020.0002] # BAMUM LETTER PHASE-F SI +16A15 ; [.3BE3.0020.0002] # BAMUM LETTER PHASE-F SEUX +16A16 ; [.3BE4.0020.0002] # BAMUM LETTER PHASE-F KYEE +16A17 ; [.3BE5.0020.0002] # BAMUM LETTER PHASE-F KET +16A18 ; [.3BE6.0020.0002] # BAMUM LETTER PHASE-F NUAE +16A19 ; [.3BE7.0020.0002] # BAMUM LETTER PHASE-F NU +16A1A ; [.3BE8.0020.0002] # BAMUM LETTER PHASE-F NJUAE +16A1B ; [.3BE9.0020.0002] # BAMUM LETTER PHASE-F YOQ +16A1C ; [.3BEA.0020.0002] # BAMUM LETTER PHASE-F SHU +16A1D ; [.3BEB.0020.0002] # BAMUM LETTER PHASE-F YA +16A1E ; [.3BEC.0020.0002] # BAMUM LETTER PHASE-F NSHA +16A1F ; [.3BED.0020.0002] # BAMUM LETTER PHASE-F PEUX +16A20 ; [.3BEE.0020.0002] # BAMUM LETTER PHASE-F NTEE +16A21 ; [.3BEF.0020.0002] # BAMUM LETTER PHASE-F WUE +16A22 ; [.3BF0.0020.0002] # BAMUM LETTER PHASE-F PEE +16A23 ; [.3BF1.0020.0002] # BAMUM LETTER PHASE-F RU +16A24 ; [.3BF2.0020.0002] # BAMUM LETTER PHASE-F NI +16A25 ; [.3BF3.0020.0002] # BAMUM LETTER PHASE-F REUX +16A26 ; [.3BF4.0020.0002] # BAMUM LETTER PHASE-F KEN +16A27 ; [.3BF5.0020.0002] # BAMUM LETTER PHASE-F NGKWAEN +16A28 ; [.3BF6.0020.0002] # BAMUM LETTER PHASE-F NGGA +16A29 ; [.3BF7.0020.0002] # BAMUM LETTER PHASE-F SHO +16A2A ; [.3BF8.0020.0002] # BAMUM LETTER PHASE-F PUAE +16A2B ; [.3BF9.0020.0002] # BAMUM LETTER PHASE-F FOM +16A2C ; [.3BFA.0020.0002] # BAMUM LETTER PHASE-F WA +16A2D ; [.3BFB.0020.0002] # BAMUM LETTER PHASE-F LI +16A2E ; [.3BFC.0020.0002] # BAMUM LETTER PHASE-F LOQ +16A2F ; [.3BFD.0020.0002] # BAMUM LETTER PHASE-F KO +16A30 ; [.3BFE.0020.0002] # BAMUM LETTER PHASE-F MBEN +16A31 ; [.3BFF.0020.0002] # BAMUM LETTER PHASE-F REN +16A32 ; [.3C00.0020.0002] # BAMUM LETTER PHASE-F MA +16A33 ; [.3C01.0020.0002] # BAMUM LETTER PHASE-F MO +16A34 ; [.3C02.0020.0002] # BAMUM LETTER PHASE-F MBAA +16A35 ; [.3C03.0020.0002] # BAMUM LETTER PHASE-F TET +16A36 ; [.3C04.0020.0002] # BAMUM LETTER PHASE-F KPA +16A37 ; [.3C05.0020.0002] # BAMUM LETTER PHASE-F SAMBA +16A38 ; [.3C06.0020.0002] # BAMUM LETTER PHASE-F VUEQ +16AD0 ; [.3C07.0020.0002] # BASSA VAH LETTER ENNI +16AD1 ; [.3C08.0020.0002] # BASSA VAH LETTER KA +16AD2 ; [.3C09.0020.0002] # BASSA VAH LETTER SE +16AD3 ; [.3C0A.0020.0002] # BASSA VAH LETTER FA +16AD4 ; [.3C0B.0020.0002] # BASSA VAH LETTER MBE +16AD5 ; [.3C0C.0020.0002] # BASSA VAH LETTER YIE +16AD6 ; [.3C0D.0020.0002] # BASSA VAH LETTER GAH +16AD7 ; [.3C0E.0020.0002] # BASSA VAH LETTER DHII +16AD8 ; [.3C0F.0020.0002] # BASSA VAH LETTER KPAH +16AD9 ; [.3C10.0020.0002] # BASSA VAH LETTER JO +16ADA ; [.3C11.0020.0002] # BASSA VAH LETTER HWAH +16ADB ; [.3C12.0020.0002] # BASSA VAH LETTER WA +16ADC ; [.3C13.0020.0002] # BASSA VAH LETTER ZO +16ADD ; [.3C14.0020.0002] # BASSA VAH LETTER GBU +16ADE ; [.3C15.0020.0002] # BASSA VAH LETTER DO +16ADF ; [.3C16.0020.0002] # BASSA VAH LETTER CE +16AE0 ; [.3C17.0020.0002] # BASSA VAH LETTER UWU +16AE1 ; [.3C18.0020.0002] # BASSA VAH LETTER TO +16AE2 ; [.3C19.0020.0002] # BASSA VAH LETTER BA +16AE3 ; [.3C1A.0020.0002] # BASSA VAH LETTER VU +16AE4 ; [.3C1B.0020.0002] # BASSA VAH LETTER YEIN +16AE5 ; [.3C1C.0020.0002] # BASSA VAH LETTER PA +16AE6 ; [.3C1D.0020.0002] # BASSA VAH LETTER WADDA +16AE7 ; [.3C1E.0020.0002] # BASSA VAH LETTER A +16AE8 ; [.3C1F.0020.0002] # BASSA VAH LETTER O +16AE9 ; [.3C20.0020.0002] # BASSA VAH LETTER OO +16AEA ; [.3C21.0020.0002] # BASSA VAH LETTER U +16AEB ; [.3C22.0020.0002] # BASSA VAH LETTER EE +16AEC ; [.3C23.0020.0002] # BASSA VAH LETTER E +16AED ; [.3C24.0020.0002] # BASSA VAH LETTER I +1E800 ; [.3C25.0020.0002] # MENDE KIKAKUI SYLLABLE M001 KI +1E801 ; [.3C26.0020.0002] # MENDE KIKAKUI SYLLABLE M002 KA +1E802 ; [.3C27.0020.0002] # MENDE KIKAKUI SYLLABLE M003 KU +1E803 ; [.3C28.0020.0002] # MENDE KIKAKUI SYLLABLE M065 KEE +1E804 ; [.3C29.0020.0002] # MENDE KIKAKUI SYLLABLE M095 KE +1E805 ; [.3C2A.0020.0002] # MENDE KIKAKUI SYLLABLE M076 KOO +1E806 ; [.3C2B.0020.0002] # MENDE KIKAKUI SYLLABLE M048 KO +1E807 ; [.3C2C.0020.0002] # MENDE KIKAKUI SYLLABLE M179 KUA +1E808 ; [.3C2D.0020.0002] # MENDE KIKAKUI SYLLABLE M004 WI +1E809 ; [.3C2E.0020.0002] # MENDE KIKAKUI SYLLABLE M005 WA +1E80A ; [.3C2F.0020.0002] # MENDE KIKAKUI SYLLABLE M006 WU +1E80B ; [.3C30.0020.0002] # MENDE KIKAKUI SYLLABLE M126 WEE +1E80C ; [.3C31.0020.0002] # MENDE KIKAKUI SYLLABLE M118 WE +1E80D ; [.3C32.0020.0002] # MENDE KIKAKUI SYLLABLE M114 WOO +1E80E ; [.3C33.0020.0002] # MENDE KIKAKUI SYLLABLE M045 WO +1E80F ; [.3C34.0020.0002] # MENDE KIKAKUI SYLLABLE M194 WUI +1E810 ; [.3C35.0020.0002] # MENDE KIKAKUI SYLLABLE M143 WEI +1E811 ; [.3C36.0020.0002] # MENDE KIKAKUI SYLLABLE M061 WVI +1E812 ; [.3C37.0020.0002] # MENDE KIKAKUI SYLLABLE M049 WVA +1E813 ; [.3C38.0020.0002] # MENDE KIKAKUI SYLLABLE M139 WVE +1E814 ; [.3C39.0020.0002] # MENDE KIKAKUI SYLLABLE M007 MIN +1E815 ; [.3C3A.0020.0002] # MENDE KIKAKUI SYLLABLE M008 MAN +1E816 ; [.3C3B.0020.0002] # MENDE KIKAKUI SYLLABLE M009 MUN +1E817 ; [.3C3C.0020.0002] # MENDE KIKAKUI SYLLABLE M059 MEN +1E818 ; [.3C3D.0020.0002] # MENDE KIKAKUI SYLLABLE M094 MON +1E819 ; [.3C3E.0020.0002] # MENDE KIKAKUI SYLLABLE M154 MUAN +1E81A ; [.3C3F.0020.0002] # MENDE KIKAKUI SYLLABLE M189 MUEN +1E81B ; [.3C40.0020.0002] # MENDE KIKAKUI SYLLABLE M010 BI +1E81C ; [.3C41.0020.0002] # MENDE KIKAKUI SYLLABLE M011 BA +1E81D ; [.3C42.0020.0002] # MENDE KIKAKUI SYLLABLE M012 BU +1E81E ; [.3C43.0020.0002] # MENDE KIKAKUI SYLLABLE M150 BEE +1E81F ; [.3C44.0020.0002] # MENDE KIKAKUI SYLLABLE M097 BE +1E820 ; [.3C45.0020.0002] # MENDE KIKAKUI SYLLABLE M103 BOO +1E821 ; [.3C46.0020.0002] # MENDE KIKAKUI SYLLABLE M138 BO +1E822 ; [.3C47.0020.0002] # MENDE KIKAKUI SYLLABLE M013 I +1E823 ; [.3C48.0020.0002] # MENDE KIKAKUI SYLLABLE M014 A +1E824 ; [.3C49.0020.0002] # MENDE KIKAKUI SYLLABLE M015 U +1E825 ; [.3C4A.0020.0002] # MENDE KIKAKUI SYLLABLE M163 EE +1E826 ; [.3C4B.0020.0002] # MENDE KIKAKUI SYLLABLE M100 E +1E827 ; [.3C4C.0020.0002] # MENDE KIKAKUI SYLLABLE M165 OO +1E828 ; [.3C4D.0020.0002] # MENDE KIKAKUI SYLLABLE M147 O +1E829 ; [.3C4E.0020.0002] # MENDE KIKAKUI SYLLABLE M137 EI +1E82A ; [.3C4F.0020.0002] # MENDE KIKAKUI SYLLABLE M131 IN +1E82B ; [.3C50.0020.0002] # MENDE KIKAKUI SYLLABLE M135 IN +1E82C ; [.3C51.0020.0002] # MENDE KIKAKUI SYLLABLE M195 AN +1E82D ; [.3C52.0020.0002] # MENDE KIKAKUI SYLLABLE M178 EN +1E82E ; [.3C53.0020.0002] # MENDE KIKAKUI SYLLABLE M019 SI +1E82F ; [.3C54.0020.0002] # MENDE KIKAKUI SYLLABLE M020 SA +1E830 ; [.3C55.0020.0002] # MENDE KIKAKUI SYLLABLE M021 SU +1E831 ; [.3C56.0020.0002] # MENDE KIKAKUI SYLLABLE M162 SEE +1E832 ; [.3C57.0020.0002] # MENDE KIKAKUI SYLLABLE M116 SE +1E833 ; [.3C58.0020.0002] # MENDE KIKAKUI SYLLABLE M136 SOO +1E834 ; [.3C59.0020.0002] # MENDE KIKAKUI SYLLABLE M079 SO +1E835 ; [.3C5A.0020.0002] # MENDE KIKAKUI SYLLABLE M196 SIA +1E836 ; [.3C5B.0020.0002] # MENDE KIKAKUI SYLLABLE M025 LI +1E837 ; [.3C5C.0020.0002] # MENDE KIKAKUI SYLLABLE M026 LA +1E838 ; [.3C5D.0020.0002] # MENDE KIKAKUI SYLLABLE M027 LU +1E839 ; [.3C5E.0020.0002] # MENDE KIKAKUI SYLLABLE M084 LEE +1E83A ; [.3C5F.0020.0002] # MENDE KIKAKUI SYLLABLE M073 LE +1E83B ; [.3C60.0020.0002] # MENDE KIKAKUI SYLLABLE M054 LOO +1E83C ; [.3C61.0020.0002] # MENDE KIKAKUI SYLLABLE M153 LO +1E83D ; [.3C62.0020.0002] # MENDE KIKAKUI SYLLABLE M110 LONG LE +1E83E ; [.3C63.0020.0002] # MENDE KIKAKUI SYLLABLE M016 DI +1E83F ; [.3C64.0020.0002] # MENDE KIKAKUI SYLLABLE M017 DA +1E840 ; [.3C65.0020.0002] # MENDE KIKAKUI SYLLABLE M018 DU +1E841 ; [.3C66.0020.0002] # MENDE KIKAKUI SYLLABLE M089 DEE +1E842 ; [.3C67.0020.0002] # MENDE KIKAKUI SYLLABLE M180 DOO +1E843 ; [.3C68.0020.0002] # MENDE KIKAKUI SYLLABLE M181 DO +1E844 ; [.3C69.0020.0002] # MENDE KIKAKUI SYLLABLE M022 TI +1E845 ; [.3C6A.0020.0002] # MENDE KIKAKUI SYLLABLE M023 TA +1E846 ; [.3C6B.0020.0002] # MENDE KIKAKUI SYLLABLE M024 TU +1E847 ; [.3C6C.0020.0002] # MENDE KIKAKUI SYLLABLE M091 TEE +1E848 ; [.3C6D.0020.0002] # MENDE KIKAKUI SYLLABLE M055 TE +1E849 ; [.3C6E.0020.0002] # MENDE KIKAKUI SYLLABLE M104 TOO +1E84A ; [.3C6F.0020.0002] # MENDE KIKAKUI SYLLABLE M069 TO +1E84B ; [.3C70.0020.0002] # MENDE KIKAKUI SYLLABLE M028 JI +1E84C ; [.3C71.0020.0002] # MENDE KIKAKUI SYLLABLE M029 JA +1E84D ; [.3C72.0020.0002] # MENDE KIKAKUI SYLLABLE M030 JU +1E84E ; [.3C73.0020.0002] # MENDE KIKAKUI SYLLABLE M157 JEE +1E84F ; [.3C74.0020.0002] # MENDE KIKAKUI SYLLABLE M113 JE +1E850 ; [.3C75.0020.0002] # MENDE KIKAKUI SYLLABLE M160 JOO +1E851 ; [.3C76.0020.0002] # MENDE KIKAKUI SYLLABLE M063 JO +1E852 ; [.3C77.0020.0002] # MENDE KIKAKUI SYLLABLE M175 LONG JO +1E853 ; [.3C78.0020.0002] # MENDE KIKAKUI SYLLABLE M031 YI +1E854 ; [.3C79.0020.0002] # MENDE KIKAKUI SYLLABLE M032 YA +1E855 ; [.3C7A.0020.0002] # MENDE KIKAKUI SYLLABLE M033 YU +1E856 ; [.3C7B.0020.0002] # MENDE KIKAKUI SYLLABLE M109 YEE +1E857 ; [.3C7C.0020.0002] # MENDE KIKAKUI SYLLABLE M080 YE +1E858 ; [.3C7D.0020.0002] # MENDE KIKAKUI SYLLABLE M141 YOO +1E859 ; [.3C7E.0020.0002] # MENDE KIKAKUI SYLLABLE M121 YO +1E85A ; [.3C7F.0020.0002] # MENDE KIKAKUI SYLLABLE M034 FI +1E85B ; [.3C80.0020.0002] # MENDE KIKAKUI SYLLABLE M035 FA +1E85C ; [.3C81.0020.0002] # MENDE KIKAKUI SYLLABLE M036 FU +1E85D ; [.3C82.0020.0002] # MENDE KIKAKUI SYLLABLE M078 FEE +1E85E ; [.3C83.0020.0002] # MENDE KIKAKUI SYLLABLE M075 FE +1E85F ; [.3C84.0020.0002] # MENDE KIKAKUI SYLLABLE M133 FOO +1E860 ; [.3C85.0020.0002] # MENDE KIKAKUI SYLLABLE M088 FO +1E861 ; [.3C86.0020.0002] # MENDE KIKAKUI SYLLABLE M197 FUA +1E862 ; [.3C87.0020.0002] # MENDE KIKAKUI SYLLABLE M101 FAN +1E863 ; [.3C88.0020.0002] # MENDE KIKAKUI SYLLABLE M037 NIN +1E864 ; [.3C89.0020.0002] # MENDE KIKAKUI SYLLABLE M038 NAN +1E865 ; [.3C8A.0020.0002] # MENDE KIKAKUI SYLLABLE M039 NUN +1E866 ; [.3C8B.0020.0002] # MENDE KIKAKUI SYLLABLE M117 NEN +1E867 ; [.3C8C.0020.0002] # MENDE KIKAKUI SYLLABLE M169 NON +1E868 ; [.3C8D.0020.0002] # MENDE KIKAKUI SYLLABLE M176 HI +1E869 ; [.3C8E.0020.0002] # MENDE KIKAKUI SYLLABLE M041 HA +1E86A ; [.3C8F.0020.0002] # MENDE KIKAKUI SYLLABLE M186 HU +1E86B ; [.3C90.0020.0002] # MENDE KIKAKUI SYLLABLE M040 HEE +1E86C ; [.3C91.0020.0002] # MENDE KIKAKUI SYLLABLE M096 HE +1E86D ; [.3C92.0020.0002] # MENDE KIKAKUI SYLLABLE M042 HOO +1E86E ; [.3C93.0020.0002] # MENDE KIKAKUI SYLLABLE M140 HO +1E86F ; [.3C94.0020.0002] # MENDE KIKAKUI SYLLABLE M083 HEEI +1E870 ; [.3C95.0020.0002] # MENDE KIKAKUI SYLLABLE M128 HOOU +1E871 ; [.3C96.0020.0002] # MENDE KIKAKUI SYLLABLE M053 HIN +1E872 ; [.3C97.0020.0002] # MENDE KIKAKUI SYLLABLE M130 HAN +1E873 ; [.3C98.0020.0002] # MENDE KIKAKUI SYLLABLE M087 HUN +1E874 ; [.3C99.0020.0002] # MENDE KIKAKUI SYLLABLE M052 HEN +1E875 ; [.3C9A.0020.0002] # MENDE KIKAKUI SYLLABLE M193 HON +1E876 ; [.3C9B.0020.0002] # MENDE KIKAKUI SYLLABLE M046 HUAN +1E877 ; [.3C9C.0020.0002] # MENDE KIKAKUI SYLLABLE M090 NGGI +1E878 ; [.3C9D.0020.0002] # MENDE KIKAKUI SYLLABLE M043 NGGA +1E879 ; [.3C9E.0020.0002] # MENDE KIKAKUI SYLLABLE M082 NGGU +1E87A ; [.3C9F.0020.0002] # MENDE KIKAKUI SYLLABLE M115 NGGEE +1E87B ; [.3CA0.0020.0002] # MENDE KIKAKUI SYLLABLE M146 NGGE +1E87C ; [.3CA1.0020.0002] # MENDE KIKAKUI SYLLABLE M156 NGGOO +1E87D ; [.3CA2.0020.0002] # MENDE KIKAKUI SYLLABLE M120 NGGO +1E87E ; [.3CA3.0020.0002] # MENDE KIKAKUI SYLLABLE M159 NGGAA +1E87F ; [.3CA4.0020.0002] # MENDE KIKAKUI SYLLABLE M127 NGGUA +1E880 ; [.3CA5.0020.0002] # MENDE KIKAKUI SYLLABLE M086 LONG NGGE +1E881 ; [.3CA6.0020.0002] # MENDE KIKAKUI SYLLABLE M106 LONG NGGOO +1E882 ; [.3CA7.0020.0002] # MENDE KIKAKUI SYLLABLE M183 LONG NGGO +1E883 ; [.3CA8.0020.0002] # MENDE KIKAKUI SYLLABLE M155 GI +1E884 ; [.3CA9.0020.0002] # MENDE KIKAKUI SYLLABLE M111 GA +1E885 ; [.3CAA.0020.0002] # MENDE KIKAKUI SYLLABLE M168 GU +1E886 ; [.3CAB.0020.0002] # MENDE KIKAKUI SYLLABLE M190 GEE +1E887 ; [.3CAC.0020.0002] # MENDE KIKAKUI SYLLABLE M166 GUEI +1E888 ; [.3CAD.0020.0002] # MENDE KIKAKUI SYLLABLE M167 GUAN +1E889 ; [.3CAE.0020.0002] # MENDE KIKAKUI SYLLABLE M184 NGEN +1E88A ; [.3CAF.0020.0002] # MENDE KIKAKUI SYLLABLE M057 NGON +1E88B ; [.3CB0.0020.0002] # MENDE KIKAKUI SYLLABLE M177 NGUAN +1E88C ; [.3CB1.0020.0002] # MENDE KIKAKUI SYLLABLE M068 PI +1E88D ; [.3CB2.0020.0002] # MENDE KIKAKUI SYLLABLE M099 PA +1E88E ; [.3CB3.0020.0002] # MENDE KIKAKUI SYLLABLE M050 PU +1E88F ; [.3CB4.0020.0002] # MENDE KIKAKUI SYLLABLE M081 PEE +1E890 ; [.3CB5.0020.0002] # MENDE KIKAKUI SYLLABLE M051 PE +1E891 ; [.3CB6.0020.0002] # MENDE KIKAKUI SYLLABLE M102 POO +1E892 ; [.3CB7.0020.0002] # MENDE KIKAKUI SYLLABLE M066 PO +1E893 ; [.3CB8.0020.0002] # MENDE KIKAKUI SYLLABLE M145 MBI +1E894 ; [.3CB9.0020.0002] # MENDE KIKAKUI SYLLABLE M062 MBA +1E895 ; [.3CBA.0020.0002] # MENDE KIKAKUI SYLLABLE M122 MBU +1E896 ; [.3CBB.0020.0002] # MENDE KIKAKUI SYLLABLE M047 MBEE +1E897 ; [.3CBC.0020.0002] # MENDE KIKAKUI SYLLABLE M188 MBEE +1E898 ; [.3CBD.0020.0002] # MENDE KIKAKUI SYLLABLE M072 MBE +1E899 ; [.3CBE.0020.0002] # MENDE KIKAKUI SYLLABLE M172 MBOO +1E89A ; [.3CBF.0020.0002] # MENDE KIKAKUI SYLLABLE M174 MBO +1E89B ; [.3CC0.0020.0002] # MENDE KIKAKUI SYLLABLE M187 MBUU +1E89C ; [.3CC1.0020.0002] # MENDE KIKAKUI SYLLABLE M161 LONG MBE +1E89D ; [.3CC2.0020.0002] # MENDE KIKAKUI SYLLABLE M105 LONG MBOO +1E89E ; [.3CC3.0020.0002] # MENDE KIKAKUI SYLLABLE M142 LONG MBO +1E89F ; [.3CC4.0020.0002] # MENDE KIKAKUI SYLLABLE M132 KPI +1E8A0 ; [.3CC5.0020.0002] # MENDE KIKAKUI SYLLABLE M092 KPA +1E8A1 ; [.3CC6.0020.0002] # MENDE KIKAKUI SYLLABLE M074 KPU +1E8A2 ; [.3CC7.0020.0002] # MENDE KIKAKUI SYLLABLE M044 KPEE +1E8A3 ; [.3CC8.0020.0002] # MENDE KIKAKUI SYLLABLE M108 KPE +1E8A4 ; [.3CC9.0020.0002] # MENDE KIKAKUI SYLLABLE M112 KPOO +1E8A5 ; [.3CCA.0020.0002] # MENDE KIKAKUI SYLLABLE M158 KPO +1E8A6 ; [.3CCB.0020.0002] # MENDE KIKAKUI SYLLABLE M124 GBI +1E8A7 ; [.3CCC.0020.0002] # MENDE KIKAKUI SYLLABLE M056 GBA +1E8A8 ; [.3CCD.0020.0002] # MENDE KIKAKUI SYLLABLE M148 GBU +1E8A9 ; [.3CCE.0020.0002] # MENDE KIKAKUI SYLLABLE M093 GBEE +1E8AA ; [.3CCF.0020.0002] # MENDE KIKAKUI SYLLABLE M107 GBE +1E8AB ; [.3CD0.0020.0002] # MENDE KIKAKUI SYLLABLE M071 GBOO +1E8AC ; [.3CD1.0020.0002] # MENDE KIKAKUI SYLLABLE M070 GBO +1E8AD ; [.3CD2.0020.0002] # MENDE KIKAKUI SYLLABLE M171 RA +1E8AE ; [.3CD3.0020.0002] # MENDE KIKAKUI SYLLABLE M123 NDI +1E8AF ; [.3CD4.0020.0002] # MENDE KIKAKUI SYLLABLE M129 NDA +1E8B0 ; [.3CD5.0020.0002] # MENDE KIKAKUI SYLLABLE M125 NDU +1E8B1 ; [.3CD6.0020.0002] # MENDE KIKAKUI SYLLABLE M191 NDEE +1E8B2 ; [.3CD7.0020.0002] # MENDE KIKAKUI SYLLABLE M119 NDE +1E8B3 ; [.3CD8.0020.0002] # MENDE KIKAKUI SYLLABLE M067 NDOO +1E8B4 ; [.3CD9.0020.0002] # MENDE KIKAKUI SYLLABLE M064 NDO +1E8B5 ; [.3CDA.0020.0002] # MENDE KIKAKUI SYLLABLE M152 NJA +1E8B6 ; [.3CDB.0020.0002] # MENDE KIKAKUI SYLLABLE M192 NJU +1E8B7 ; [.3CDC.0020.0002] # MENDE KIKAKUI SYLLABLE M149 NJEE +1E8B8 ; [.3CDD.0020.0002] # MENDE KIKAKUI SYLLABLE M134 NJOO +1E8B9 ; [.3CDE.0020.0002] # MENDE KIKAKUI SYLLABLE M182 VI +1E8BA ; [.3CDF.0020.0002] # MENDE KIKAKUI SYLLABLE M185 VA +1E8BB ; [.3CE0.0020.0002] # MENDE KIKAKUI SYLLABLE M151 VU +1E8BC ; [.3CE1.0020.0002] # MENDE KIKAKUI SYLLABLE M173 VEE +1E8BD ; [.3CE2.0020.0002] # MENDE KIKAKUI SYLLABLE M085 VE +1E8BE ; [.3CE3.0020.0002] # MENDE KIKAKUI SYLLABLE M144 VOO +1E8BF ; [.3CE4.0020.0002] # MENDE KIKAKUI SYLLABLE M077 VO +1E8C0 ; [.3CE5.0020.0002] # MENDE KIKAKUI SYLLABLE M164 NYIN +1E8C1 ; [.3CE6.0020.0002] # MENDE KIKAKUI SYLLABLE M058 NYAN +1E8C2 ; [.3CE7.0020.0002] # MENDE KIKAKUI SYLLABLE M170 NYUN +1E8C3 ; [.3CE8.0020.0002] # MENDE KIKAKUI SYLLABLE M098 NYEN +1E8C4 ; [.3CE9.0020.0002] # MENDE KIKAKUI SYLLABLE M060 NYON +1E922 ; [.3CEA.0020.0002] # ADLAM SMALL LETTER ALIF +1E900 ; [.3CEA.0020.0008] # ADLAM CAPITAL LETTER ALIF +1E923 ; [.3CEB.0020.0002] # ADLAM SMALL LETTER DAALI +1E901 ; [.3CEB.0020.0008] # ADLAM CAPITAL LETTER DAALI +1E924 ; [.3CEC.0020.0002] # ADLAM SMALL LETTER LAAM +1E902 ; [.3CEC.0020.0008] # ADLAM CAPITAL LETTER LAAM +1E925 ; [.3CED.0020.0002] # ADLAM SMALL LETTER MIIM +1E903 ; [.3CED.0020.0008] # ADLAM CAPITAL LETTER MIIM +1E926 ; [.3CEE.0020.0002] # ADLAM SMALL LETTER BA +1E904 ; [.3CEE.0020.0008] # ADLAM CAPITAL LETTER BA +1E927 ; [.3CEF.0020.0002] # ADLAM SMALL LETTER SINNYIIYHE +1E905 ; [.3CEF.0020.0008] # ADLAM CAPITAL LETTER SINNYIIYHE +1E928 ; [.3CF0.0020.0002] # ADLAM SMALL LETTER PE +1E906 ; [.3CF0.0020.0008] # ADLAM CAPITAL LETTER PE +1E929 ; [.3CF1.0020.0002] # ADLAM SMALL LETTER BHE +1E907 ; [.3CF1.0020.0008] # ADLAM CAPITAL LETTER BHE +1E92A ; [.3CF2.0020.0002] # ADLAM SMALL LETTER RA +1E908 ; [.3CF2.0020.0008] # ADLAM CAPITAL LETTER RA +1E92B ; [.3CF3.0020.0002] # ADLAM SMALL LETTER E +1E909 ; [.3CF3.0020.0008] # ADLAM CAPITAL LETTER E +1E92C ; [.3CF4.0020.0002] # ADLAM SMALL LETTER FA +1E90A ; [.3CF4.0020.0008] # ADLAM CAPITAL LETTER FA +1E92D ; [.3CF5.0020.0002] # ADLAM SMALL LETTER I +1E90B ; [.3CF5.0020.0008] # ADLAM CAPITAL LETTER I +1E92E ; [.3CF6.0020.0002] # ADLAM SMALL LETTER O +1E90C ; [.3CF6.0020.0008] # ADLAM CAPITAL LETTER O +1E92F ; [.3CF7.0020.0002] # ADLAM SMALL LETTER DHA +1E90D ; [.3CF7.0020.0008] # ADLAM CAPITAL LETTER DHA +1E930 ; [.3CF8.0020.0002] # ADLAM SMALL LETTER YHE +1E90E ; [.3CF8.0020.0008] # ADLAM CAPITAL LETTER YHE +1E931 ; [.3CF9.0020.0002] # ADLAM SMALL LETTER WAW +1E90F ; [.3CF9.0020.0008] # ADLAM CAPITAL LETTER WAW +1E932 ; [.3CFA.0020.0002] # ADLAM SMALL LETTER NUN +1E910 ; [.3CFA.0020.0008] # ADLAM CAPITAL LETTER NUN +1E933 ; [.3CFB.0020.0002] # ADLAM SMALL LETTER KAF +1E911 ; [.3CFB.0020.0008] # ADLAM CAPITAL LETTER KAF +1E934 ; [.3CFC.0020.0002] # ADLAM SMALL LETTER YA +1E912 ; [.3CFC.0020.0008] # ADLAM CAPITAL LETTER YA +1E935 ; [.3CFD.0020.0002] # ADLAM SMALL LETTER U +1E913 ; [.3CFD.0020.0008] # ADLAM CAPITAL LETTER U +1E936 ; [.3CFE.0020.0002] # ADLAM SMALL LETTER JIIM +1E914 ; [.3CFE.0020.0008] # ADLAM CAPITAL LETTER JIIM +1E937 ; [.3CFF.0020.0002] # ADLAM SMALL LETTER CHI +1E915 ; [.3CFF.0020.0008] # ADLAM CAPITAL LETTER CHI +1E938 ; [.3D00.0020.0002] # ADLAM SMALL LETTER HA +1E916 ; [.3D00.0020.0008] # ADLAM CAPITAL LETTER HA +1E939 ; [.3D01.0020.0002] # ADLAM SMALL LETTER QAAF +1E917 ; [.3D01.0020.0008] # ADLAM CAPITAL LETTER QAAF +1E93A ; [.3D02.0020.0002] # ADLAM SMALL LETTER GA +1E918 ; [.3D02.0020.0008] # ADLAM CAPITAL LETTER GA +1E93B ; [.3D03.0020.0002] # ADLAM SMALL LETTER NYA +1E919 ; [.3D03.0020.0008] # ADLAM CAPITAL LETTER NYA +1E93C ; [.3D04.0020.0002] # ADLAM SMALL LETTER TU +1E91A ; [.3D04.0020.0008] # ADLAM CAPITAL LETTER TU +1E93D ; [.3D05.0020.0002] # ADLAM SMALL LETTER NHA +1E91B ; [.3D05.0020.0008] # ADLAM CAPITAL LETTER NHA +1E93E ; [.3D06.0020.0002] # ADLAM SMALL LETTER VA +1E91C ; [.3D06.0020.0008] # ADLAM CAPITAL LETTER VA +1E93F ; [.3D07.0020.0002] # ADLAM SMALL LETTER KHA +1E91D ; [.3D07.0020.0008] # ADLAM CAPITAL LETTER KHA +1E940 ; [.3D08.0020.0002] # ADLAM SMALL LETTER GBE +1E91E ; [.3D08.0020.0008] # ADLAM CAPITAL LETTER GBE +1E941 ; [.3D09.0020.0002] # ADLAM SMALL LETTER ZAL +1E91F ; [.3D09.0020.0008] # ADLAM CAPITAL LETTER ZAL +1E942 ; [.3D0A.0020.0002] # ADLAM SMALL LETTER KPO +1E920 ; [.3D0A.0020.0008] # ADLAM CAPITAL LETTER KPO +1E943 ; [.3D0B.0020.0002] # ADLAM SMALL LETTER SHA +1E921 ; [.3D0B.0020.0008] # ADLAM CAPITAL LETTER SHA +1100 ; [.3D0C.0020.0002] # HANGUL CHOSEONG KIYEOK +3131 ; [.3D0C.0020.0004] # HANGUL LETTER KIYEOK +3200 ; [*0318.0020.0004][.3D0C.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL KIYEOK +3260 ; [.3D0C.0020.0006] # CIRCLED HANGUL KIYEOK +FFA1 ; [.3D0C.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK +320E ; [*0318.0020.0004][.3D0C.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL KIYEOK A +326E ; [.3D0C.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL KIYEOK A +1101 ; [.3D0D.0020.0002] # HANGUL CHOSEONG SSANGKIYEOK +3132 ; [.3D0D.0020.0004] # HANGUL LETTER SSANGKIYEOK +FFA2 ; [.3D0D.0020.0012] # HALFWIDTH HANGUL LETTER SSANGKIYEOK +1102 ; [.3D0E.0020.0002] # HANGUL CHOSEONG NIEUN +3134 ; [.3D0E.0020.0004] # HANGUL LETTER NIEUN +3201 ; [*0318.0020.0004][.3D0E.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL NIEUN +3261 ; [.3D0E.0020.0006] # CIRCLED HANGUL NIEUN +FFA4 ; [.3D0E.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN +320F ; [*0318.0020.0004][.3D0E.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL NIEUN A +326F ; [.3D0E.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL NIEUN A +1103 ; [.3D0F.0020.0002] # HANGUL CHOSEONG TIKEUT +3137 ; [.3D0F.0020.0004] # HANGUL LETTER TIKEUT +3202 ; [*0318.0020.0004][.3D0F.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL TIKEUT +3262 ; [.3D0F.0020.0006] # CIRCLED HANGUL TIKEUT +FFA7 ; [.3D0F.0020.0012] # HALFWIDTH HANGUL LETTER TIKEUT +3210 ; [*0318.0020.0004][.3D0F.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL TIKEUT A +3270 ; [.3D0F.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL TIKEUT A +1104 ; [.3D10.0020.0002] # HANGUL CHOSEONG SSANGTIKEUT +3138 ; [.3D10.0020.0004] # HANGUL LETTER SSANGTIKEUT +FFA8 ; [.3D10.0020.0012] # HALFWIDTH HANGUL LETTER SSANGTIKEUT +1105 ; [.3D11.0020.0002] # HANGUL CHOSEONG RIEUL +3139 ; [.3D11.0020.0004] # HANGUL LETTER RIEUL +3203 ; [*0318.0020.0004][.3D11.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL RIEUL +3263 ; [.3D11.0020.0006] # CIRCLED HANGUL RIEUL +FFA9 ; [.3D11.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL +3211 ; [*0318.0020.0004][.3D11.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL RIEUL A +3271 ; [.3D11.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL RIEUL A +1106 ; [.3D12.0020.0002] # HANGUL CHOSEONG MIEUM +3141 ; [.3D12.0020.0004] # HANGUL LETTER MIEUM +3204 ; [*0318.0020.0004][.3D12.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL MIEUM +3264 ; [.3D12.0020.0006] # CIRCLED HANGUL MIEUM +FFB1 ; [.3D12.0020.0012] # HALFWIDTH HANGUL LETTER MIEUM +3212 ; [*0318.0020.0004][.3D12.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL MIEUM A +3272 ; [.3D12.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL MIEUM A +1107 ; [.3D13.0020.0002] # HANGUL CHOSEONG PIEUP +3142 ; [.3D13.0020.0004] # HANGUL LETTER PIEUP +3205 ; [*0318.0020.0004][.3D13.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL PIEUP +3265 ; [.3D13.0020.0006] # CIRCLED HANGUL PIEUP +FFB2 ; [.3D13.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP +3213 ; [*0318.0020.0004][.3D13.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL PIEUP A +3273 ; [.3D13.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL PIEUP A +1108 ; [.3D14.0020.0002] # HANGUL CHOSEONG SSANGPIEUP +3143 ; [.3D14.0020.0004] # HANGUL LETTER SSANGPIEUP +FFB3 ; [.3D14.0020.0012] # HALFWIDTH HANGUL LETTER SSANGPIEUP +1109 ; [.3D15.0020.0002] # HANGUL CHOSEONG SIOS +3145 ; [.3D15.0020.0004] # HANGUL LETTER SIOS +3206 ; [*0318.0020.0004][.3D15.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL SIOS +3266 ; [.3D15.0020.0006] # CIRCLED HANGUL SIOS +FFB5 ; [.3D15.0020.0012] # HALFWIDTH HANGUL LETTER SIOS +3214 ; [*0318.0020.0004][.3D15.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL SIOS A +3274 ; [.3D15.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL SIOS A +110A ; [.3D16.0020.0002] # HANGUL CHOSEONG SSANGSIOS +3146 ; [.3D16.0020.0004] # HANGUL LETTER SSANGSIOS +FFB6 ; [.3D16.0020.0012] # HALFWIDTH HANGUL LETTER SSANGSIOS +110B ; [.3D17.0020.0002] # HANGUL CHOSEONG IEUNG +3147 ; [.3D17.0020.0004] # HANGUL LETTER IEUNG +3207 ; [*0318.0020.0004][.3D17.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL IEUNG +3267 ; [.3D17.0020.0006] # CIRCLED HANGUL IEUNG +FFB7 ; [.3D17.0020.0012] # HALFWIDTH HANGUL LETTER IEUNG +3215 ; [*0318.0020.0004][.3D17.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL IEUNG A +3275 ; [.3D17.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL IEUNG A +321D ; [*0318.0020.0004][.3D17.0020.0004][.3D92.0020.0004][.3D18.0020.0004][.3D8E.0020.0004][.3DEB.0020.0004][*0319.0020.0004] # PARENTHESIZED KOREAN CHARACTER OJEON +321E ; [*0318.0020.0004][.3D17.0020.0004][.3D92.0020.0004][.3D1E.0020.0004][.3D97.0020.0004][*0319.0020.0004] # PARENTHESIZED KOREAN CHARACTER O HU +327E ; [.3D17.0020.0006][.3D97.0020.0006] # CIRCLED HANGUL IEUNG U +110C ; [.3D18.0020.0002] # HANGUL CHOSEONG CIEUC +3148 ; [.3D18.0020.0004] # HANGUL LETTER CIEUC +3208 ; [*0318.0020.0004][.3D18.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL CIEUC +3268 ; [.3D18.0020.0006] # CIRCLED HANGUL CIEUC +FFB8 ; [.3D18.0020.0012] # HALFWIDTH HANGUL LETTER CIEUC +3216 ; [*0318.0020.0004][.3D18.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL CIEUC A +3276 ; [.3D18.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL CIEUC A +321C ; [*0318.0020.0004][.3D18.0020.0004][.3D97.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL CIEUC U +327D ; [.3D18.0020.0006][.3D97.0020.0006][.3D17.0020.0006][.3D9D.0020.0006] # CIRCLED KOREAN CHARACTER JUEUI +110D ; [.3D19.0020.0002] # HANGUL CHOSEONG SSANGCIEUC +3149 ; [.3D19.0020.0004] # HANGUL LETTER SSANGCIEUC +FFB9 ; [.3D19.0020.0012] # HALFWIDTH HANGUL LETTER SSANGCIEUC +110E ; [.3D1A.0020.0002] # HANGUL CHOSEONG CHIEUCH +314A ; [.3D1A.0020.0004] # HANGUL LETTER CHIEUCH +3209 ; [*0318.0020.0004][.3D1A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL CHIEUCH +3269 ; [.3D1A.0020.0006] # CIRCLED HANGUL CHIEUCH +FFBA ; [.3D1A.0020.0012] # HALFWIDTH HANGUL LETTER CHIEUCH +3217 ; [*0318.0020.0004][.3D1A.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL CHIEUCH A +3277 ; [.3D1A.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL CHIEUCH A +327C ; [.3D1A.0020.0006][.3D8A.0020.0006][.3DF7.0020.0006][.3D0C.0020.0006][.3D92.0020.0006] # CIRCLED KOREAN CHARACTER CHAMKO +110F ; [.3D1B.0020.0002] # HANGUL CHOSEONG KHIEUKH +314B ; [.3D1B.0020.0004] # HANGUL LETTER KHIEUKH +320A ; [*0318.0020.0004][.3D1B.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL KHIEUKH +326A ; [.3D1B.0020.0006] # CIRCLED HANGUL KHIEUKH +FFBB ; [.3D1B.0020.0012] # HALFWIDTH HANGUL LETTER KHIEUKH +3218 ; [*0318.0020.0004][.3D1B.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL KHIEUKH A +3278 ; [.3D1B.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL KHIEUKH A +1110 ; [.3D1C.0020.0002] # HANGUL CHOSEONG THIEUTH +314C ; [.3D1C.0020.0004] # HANGUL LETTER THIEUTH +320B ; [*0318.0020.0004][.3D1C.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL THIEUTH +326B ; [.3D1C.0020.0006] # CIRCLED HANGUL THIEUTH +FFBC ; [.3D1C.0020.0012] # HALFWIDTH HANGUL LETTER THIEUTH +3219 ; [*0318.0020.0004][.3D1C.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL THIEUTH A +3279 ; [.3D1C.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL THIEUTH A +1111 ; [.3D1D.0020.0002] # HANGUL CHOSEONG PHIEUPH +314D ; [.3D1D.0020.0004] # HANGUL LETTER PHIEUPH +320C ; [*0318.0020.0004][.3D1D.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL PHIEUPH +326C ; [.3D1D.0020.0006] # CIRCLED HANGUL PHIEUPH +FFBD ; [.3D1D.0020.0012] # HALFWIDTH HANGUL LETTER PHIEUPH +321A ; [*0318.0020.0004][.3D1D.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL PHIEUPH A +327A ; [.3D1D.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL PHIEUPH A +1112 ; [.3D1E.0020.0002] # HANGUL CHOSEONG HIEUH +314E ; [.3D1E.0020.0004] # HANGUL LETTER HIEUH +320D ; [*0318.0020.0004][.3D1E.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL HIEUH +326D ; [.3D1E.0020.0006] # CIRCLED HANGUL HIEUH +FFBE ; [.3D1E.0020.0012] # HALFWIDTH HANGUL LETTER HIEUH +321B ; [*0318.0020.0004][.3D1E.0020.0004][.3D8A.0020.0004][*0319.0020.0004] # PARENTHESIZED HANGUL HIEUH A +327B ; [.3D1E.0020.0006][.3D8A.0020.0006] # CIRCLED HANGUL HIEUH A +1113 ; [.3D1F.0020.0002] # HANGUL CHOSEONG NIEUN-KIYEOK +1114 ; [.3D20.0020.0002] # HANGUL CHOSEONG SSANGNIEUN +3165 ; [.3D20.0020.0004] # HANGUL LETTER SSANGNIEUN +1115 ; [.3D21.0020.0002] # HANGUL CHOSEONG NIEUN-TIKEUT +3166 ; [.3D21.0020.0004] # HANGUL LETTER NIEUN-TIKEUT +1116 ; [.3D22.0020.0002] # HANGUL CHOSEONG NIEUN-PIEUP +1117 ; [.3D23.0020.0002] # HANGUL CHOSEONG TIKEUT-KIYEOK +1118 ; [.3D24.0020.0002] # HANGUL CHOSEONG RIEUL-NIEUN +1119 ; [.3D25.0020.0002] # HANGUL CHOSEONG SSANGRIEUL +111A ; [.3D26.0020.0002] # HANGUL CHOSEONG RIEUL-HIEUH +3140 ; [.3D26.0020.0004] # HANGUL LETTER RIEUL-HIEUH +FFB0 ; [.3D26.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-HIEUH +111B ; [.3D27.0020.0002] # HANGUL CHOSEONG KAPYEOUNRIEUL +111C ; [.3D28.0020.0002] # HANGUL CHOSEONG MIEUM-PIEUP +316E ; [.3D28.0020.0004] # HANGUL LETTER MIEUM-PIEUP +111D ; [.3D29.0020.0002] # HANGUL CHOSEONG KAPYEOUNMIEUM +3171 ; [.3D29.0020.0004] # HANGUL LETTER KAPYEOUNMIEUM +111E ; [.3D2A.0020.0002] # HANGUL CHOSEONG PIEUP-KIYEOK +3172 ; [.3D2A.0020.0004] # HANGUL LETTER PIEUP-KIYEOK +111F ; [.3D2B.0020.0002] # HANGUL CHOSEONG PIEUP-NIEUN +1120 ; [.3D2C.0020.0002] # HANGUL CHOSEONG PIEUP-TIKEUT +3173 ; [.3D2C.0020.0004] # HANGUL LETTER PIEUP-TIKEUT +1121 ; [.3D2D.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS +3144 ; [.3D2D.0020.0004] # HANGUL LETTER PIEUP-SIOS +FFB4 ; [.3D2D.0020.0012] # HALFWIDTH HANGUL LETTER PIEUP-SIOS +1122 ; [.3D2E.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +3174 ; [.3D2E.0020.0004] # HANGUL LETTER PIEUP-SIOS-KIYEOK +1123 ; [.3D2F.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +3175 ; [.3D2F.0020.0004] # HANGUL LETTER PIEUP-SIOS-TIKEUT +1124 ; [.3D30.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP +1125 ; [.3D31.0020.0002] # HANGUL CHOSEONG PIEUP-SSANGSIOS +1126 ; [.3D32.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC +1127 ; [.3D33.0020.0002] # HANGUL CHOSEONG PIEUP-CIEUC +3176 ; [.3D33.0020.0004] # HANGUL LETTER PIEUP-CIEUC +1128 ; [.3D34.0020.0002] # HANGUL CHOSEONG PIEUP-CHIEUCH +1129 ; [.3D35.0020.0002] # HANGUL CHOSEONG PIEUP-THIEUTH +3177 ; [.3D35.0020.0004] # HANGUL LETTER PIEUP-THIEUTH +112A ; [.3D36.0020.0002] # HANGUL CHOSEONG PIEUP-PHIEUPH +112B ; [.3D37.0020.0002] # HANGUL CHOSEONG KAPYEOUNPIEUP +3178 ; [.3D37.0020.0004] # HANGUL LETTER KAPYEOUNPIEUP +112C ; [.3D38.0020.0002] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +3179 ; [.3D38.0020.0004] # HANGUL LETTER KAPYEOUNSSANGPIEUP +112D ; [.3D39.0020.0002] # HANGUL CHOSEONG SIOS-KIYEOK +317A ; [.3D39.0020.0004] # HANGUL LETTER SIOS-KIYEOK +112E ; [.3D3A.0020.0002] # HANGUL CHOSEONG SIOS-NIEUN +317B ; [.3D3A.0020.0004] # HANGUL LETTER SIOS-NIEUN +112F ; [.3D3B.0020.0002] # HANGUL CHOSEONG SIOS-TIKEUT +317C ; [.3D3B.0020.0004] # HANGUL LETTER SIOS-TIKEUT +1130 ; [.3D3C.0020.0002] # HANGUL CHOSEONG SIOS-RIEUL +1131 ; [.3D3D.0020.0002] # HANGUL CHOSEONG SIOS-MIEUM +1132 ; [.3D3E.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP +317D ; [.3D3E.0020.0004] # HANGUL LETTER SIOS-PIEUP +1133 ; [.3D3F.0020.0002] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +1134 ; [.3D40.0020.0002] # HANGUL CHOSEONG SIOS-SSANGSIOS +1135 ; [.3D41.0020.0002] # HANGUL CHOSEONG SIOS-IEUNG +1136 ; [.3D42.0020.0002] # HANGUL CHOSEONG SIOS-CIEUC +317E ; [.3D42.0020.0004] # HANGUL LETTER SIOS-CIEUC +1137 ; [.3D43.0020.0002] # HANGUL CHOSEONG SIOS-CHIEUCH +1138 ; [.3D44.0020.0002] # HANGUL CHOSEONG SIOS-KHIEUKH +1139 ; [.3D45.0020.0002] # HANGUL CHOSEONG SIOS-THIEUTH +113A ; [.3D46.0020.0002] # HANGUL CHOSEONG SIOS-PHIEUPH +113B ; [.3D47.0020.0002] # HANGUL CHOSEONG SIOS-HIEUH +113C ; [.3D48.0020.0002] # HANGUL CHOSEONG CHITUEUMSIOS +113D ; [.3D49.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGSIOS +113E ; [.3D4A.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSIOS +113F ; [.3D4B.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +1140 ; [.3D4C.0020.0002] # HANGUL CHOSEONG PANSIOS +317F ; [.3D4C.0020.0004] # HANGUL LETTER PANSIOS +1141 ; [.3D4D.0020.0002] # HANGUL CHOSEONG IEUNG-KIYEOK +1142 ; [.3D4E.0020.0002] # HANGUL CHOSEONG IEUNG-TIKEUT +1143 ; [.3D4F.0020.0002] # HANGUL CHOSEONG IEUNG-MIEUM +1144 ; [.3D50.0020.0002] # HANGUL CHOSEONG IEUNG-PIEUP +1145 ; [.3D51.0020.0002] # HANGUL CHOSEONG IEUNG-SIOS +1146 ; [.3D52.0020.0002] # HANGUL CHOSEONG IEUNG-PANSIOS +1147 ; [.3D53.0020.0002] # HANGUL CHOSEONG SSANGIEUNG +3180 ; [.3D53.0020.0004] # HANGUL LETTER SSANGIEUNG +1148 ; [.3D54.0020.0002] # HANGUL CHOSEONG IEUNG-CIEUC +1149 ; [.3D55.0020.0002] # HANGUL CHOSEONG IEUNG-CHIEUCH +114A ; [.3D56.0020.0002] # HANGUL CHOSEONG IEUNG-THIEUTH +114B ; [.3D57.0020.0002] # HANGUL CHOSEONG IEUNG-PHIEUPH +114C ; [.3D58.0020.0002] # HANGUL CHOSEONG YESIEUNG +3181 ; [.3D58.0020.0004] # HANGUL LETTER YESIEUNG +114D ; [.3D59.0020.0002] # HANGUL CHOSEONG CIEUC-IEUNG +114E ; [.3D5A.0020.0002] # HANGUL CHOSEONG CHITUEUMCIEUC +114F ; [.3D5B.0020.0002] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC +1150 ; [.3D5C.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCIEUC +1151 ; [.3D5D.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +1152 ; [.3D5E.0020.0002] # HANGUL CHOSEONG CHIEUCH-KHIEUKH +1153 ; [.3D5F.0020.0002] # HANGUL CHOSEONG CHIEUCH-HIEUH +1154 ; [.3D60.0020.0002] # HANGUL CHOSEONG CHITUEUMCHIEUCH +1155 ; [.3D61.0020.0002] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +1156 ; [.3D62.0020.0002] # HANGUL CHOSEONG PHIEUPH-PIEUP +1157 ; [.3D63.0020.0002] # HANGUL CHOSEONG KAPYEOUNPHIEUPH +3184 ; [.3D63.0020.0004] # HANGUL LETTER KAPYEOUNPHIEUPH +1158 ; [.3D64.0020.0002] # HANGUL CHOSEONG SSANGHIEUH +3185 ; [.3D64.0020.0004] # HANGUL LETTER SSANGHIEUH +1159 ; [.3D65.0020.0002] # HANGUL CHOSEONG YEORINHIEUH +3186 ; [.3D65.0020.0004] # HANGUL LETTER YEORINHIEUH +115A ; [.3D66.0020.0002] # HANGUL CHOSEONG KIYEOK-TIKEUT +115B ; [.3D67.0020.0002] # HANGUL CHOSEONG NIEUN-SIOS +115C ; [.3D68.0020.0002] # HANGUL CHOSEONG NIEUN-CIEUC +115D ; [.3D69.0020.0002] # HANGUL CHOSEONG NIEUN-HIEUH +115E ; [.3D6A.0020.0002] # HANGUL CHOSEONG TIKEUT-RIEUL +A960 ; [.3D6B.0020.0002] # HANGUL CHOSEONG TIKEUT-MIEUM +A961 ; [.3D6C.0020.0002] # HANGUL CHOSEONG TIKEUT-PIEUP +A962 ; [.3D6D.0020.0002] # HANGUL CHOSEONG TIKEUT-SIOS +A963 ; [.3D6E.0020.0002] # HANGUL CHOSEONG TIKEUT-CIEUC +A964 ; [.3D6F.0020.0002] # HANGUL CHOSEONG RIEUL-KIYEOK +A965 ; [.3D70.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGKIYEOK +A966 ; [.3D71.0020.0002] # HANGUL CHOSEONG RIEUL-TIKEUT +A967 ; [.3D72.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGTIKEUT +A968 ; [.3D73.0020.0002] # HANGUL CHOSEONG RIEUL-MIEUM +A969 ; [.3D74.0020.0002] # HANGUL CHOSEONG RIEUL-PIEUP +A96A ; [.3D75.0020.0002] # HANGUL CHOSEONG RIEUL-SSANGPIEUP +A96B ; [.3D76.0020.0002] # HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP +A96C ; [.3D77.0020.0002] # HANGUL CHOSEONG RIEUL-SIOS +A96D ; [.3D78.0020.0002] # HANGUL CHOSEONG RIEUL-CIEUC +A96E ; [.3D79.0020.0002] # HANGUL CHOSEONG RIEUL-KHIEUKH +A96F ; [.3D7A.0020.0002] # HANGUL CHOSEONG MIEUM-KIYEOK +A970 ; [.3D7B.0020.0002] # HANGUL CHOSEONG MIEUM-TIKEUT +A971 ; [.3D7C.0020.0002] # HANGUL CHOSEONG MIEUM-SIOS +A972 ; [.3D7D.0020.0002] # HANGUL CHOSEONG PIEUP-SIOS-THIEUTH +A973 ; [.3D7E.0020.0002] # HANGUL CHOSEONG PIEUP-KHIEUKH +A974 ; [.3D7F.0020.0002] # HANGUL CHOSEONG PIEUP-HIEUH +A975 ; [.3D80.0020.0002] # HANGUL CHOSEONG SSANGSIOS-PIEUP +A976 ; [.3D81.0020.0002] # HANGUL CHOSEONG IEUNG-RIEUL +A977 ; [.3D82.0020.0002] # HANGUL CHOSEONG IEUNG-HIEUH +A978 ; [.3D83.0020.0002] # HANGUL CHOSEONG SSANGCIEUC-HIEUH +A979 ; [.3D84.0020.0002] # HANGUL CHOSEONG SSANGTHIEUTH +A97A ; [.3D85.0020.0002] # HANGUL CHOSEONG PHIEUPH-HIEUH +A97B ; [.3D86.0020.0002] # HANGUL CHOSEONG HIEUH-SIOS +A97C ; [.3D87.0020.0002] # HANGUL CHOSEONG SSANGYEORINHIEUH +115F ; [.3D88.0020.0002] # HANGUL CHOSEONG FILLER +1160 ; [.3D89.0020.0002] # HANGUL JUNGSEONG FILLER +3164 ; [.3D89.0020.0004] # HANGUL FILLER +FFA0 ; [.3D89.0020.0012] # HALFWIDTH HANGUL FILLER +1161 ; [.3D8A.0020.0002] # HANGUL JUNGSEONG A +314F ; [.3D8A.0020.0004] # HANGUL LETTER A +FFC2 ; [.3D8A.0020.0012] # HALFWIDTH HANGUL LETTER A +1162 ; [.3D8B.0020.0002] # HANGUL JUNGSEONG AE +3150 ; [.3D8B.0020.0004] # HANGUL LETTER AE +FFC3 ; [.3D8B.0020.0012] # HALFWIDTH HANGUL LETTER AE +1163 ; [.3D8C.0020.0002] # HANGUL JUNGSEONG YA +3151 ; [.3D8C.0020.0004] # HANGUL LETTER YA +FFC4 ; [.3D8C.0020.0012] # HALFWIDTH HANGUL LETTER YA +1164 ; [.3D8D.0020.0002] # HANGUL JUNGSEONG YAE +3152 ; [.3D8D.0020.0004] # HANGUL LETTER YAE +FFC5 ; [.3D8D.0020.0012] # HALFWIDTH HANGUL LETTER YAE +1165 ; [.3D8E.0020.0002] # HANGUL JUNGSEONG EO +3153 ; [.3D8E.0020.0004] # HANGUL LETTER EO +FFC6 ; [.3D8E.0020.0012] # HALFWIDTH HANGUL LETTER EO +1166 ; [.3D8F.0020.0002] # HANGUL JUNGSEONG E +3154 ; [.3D8F.0020.0004] # HANGUL LETTER E +FFC7 ; [.3D8F.0020.0012] # HALFWIDTH HANGUL LETTER E +1167 ; [.3D90.0020.0002] # HANGUL JUNGSEONG YEO +3155 ; [.3D90.0020.0004] # HANGUL LETTER YEO +FFCA ; [.3D90.0020.0012] # HALFWIDTH HANGUL LETTER YEO +1168 ; [.3D91.0020.0002] # HANGUL JUNGSEONG YE +3156 ; [.3D91.0020.0004] # HANGUL LETTER YE +FFCB ; [.3D91.0020.0012] # HALFWIDTH HANGUL LETTER YE +1169 ; [.3D92.0020.0002] # HANGUL JUNGSEONG O +3157 ; [.3D92.0020.0004] # HANGUL LETTER O +FFCC ; [.3D92.0020.0012] # HALFWIDTH HANGUL LETTER O +116A ; [.3D93.0020.0002] # HANGUL JUNGSEONG WA +3158 ; [.3D93.0020.0004] # HANGUL LETTER WA +FFCD ; [.3D93.0020.0012] # HALFWIDTH HANGUL LETTER WA +116B ; [.3D94.0020.0002] # HANGUL JUNGSEONG WAE +3159 ; [.3D94.0020.0004] # HANGUL LETTER WAE +FFCE ; [.3D94.0020.0012] # HALFWIDTH HANGUL LETTER WAE +116C ; [.3D95.0020.0002] # HANGUL JUNGSEONG OE +315A ; [.3D95.0020.0004] # HANGUL LETTER OE +FFCF ; [.3D95.0020.0012] # HALFWIDTH HANGUL LETTER OE +116D ; [.3D96.0020.0002] # HANGUL JUNGSEONG YO +315B ; [.3D96.0020.0004] # HANGUL LETTER YO +FFD2 ; [.3D96.0020.0012] # HALFWIDTH HANGUL LETTER YO +116E ; [.3D97.0020.0002] # HANGUL JUNGSEONG U +315C ; [.3D97.0020.0004] # HANGUL LETTER U +FFD3 ; [.3D97.0020.0012] # HALFWIDTH HANGUL LETTER U +116F ; [.3D98.0020.0002] # HANGUL JUNGSEONG WEO +315D ; [.3D98.0020.0004] # HANGUL LETTER WEO +FFD4 ; [.3D98.0020.0012] # HALFWIDTH HANGUL LETTER WEO +1170 ; [.3D99.0020.0002] # HANGUL JUNGSEONG WE +315E ; [.3D99.0020.0004] # HANGUL LETTER WE +FFD5 ; [.3D99.0020.0012] # HALFWIDTH HANGUL LETTER WE +1171 ; [.3D9A.0020.0002] # HANGUL JUNGSEONG WI +315F ; [.3D9A.0020.0004] # HANGUL LETTER WI +FFD6 ; [.3D9A.0020.0012] # HALFWIDTH HANGUL LETTER WI +1172 ; [.3D9B.0020.0002] # HANGUL JUNGSEONG YU +3160 ; [.3D9B.0020.0004] # HANGUL LETTER YU +FFD7 ; [.3D9B.0020.0012] # HALFWIDTH HANGUL LETTER YU +1173 ; [.3D9C.0020.0002] # HANGUL JUNGSEONG EU +3161 ; [.3D9C.0020.0004] # HANGUL LETTER EU +FFDA ; [.3D9C.0020.0012] # HALFWIDTH HANGUL LETTER EU +1174 ; [.3D9D.0020.0002] # HANGUL JUNGSEONG YI +3162 ; [.3D9D.0020.0004] # HANGUL LETTER YI +FFDB ; [.3D9D.0020.0012] # HALFWIDTH HANGUL LETTER YI +1175 ; [.3D9E.0020.0002] # HANGUL JUNGSEONG I +3163 ; [.3D9E.0020.0004] # HANGUL LETTER I +FFDC ; [.3D9E.0020.0012] # HALFWIDTH HANGUL LETTER I +1176 ; [.3D9F.0020.0002] # HANGUL JUNGSEONG A-O +1177 ; [.3DA0.0020.0002] # HANGUL JUNGSEONG A-U +1178 ; [.3DA1.0020.0002] # HANGUL JUNGSEONG YA-O +1179 ; [.3DA2.0020.0002] # HANGUL JUNGSEONG YA-YO +117A ; [.3DA3.0020.0002] # HANGUL JUNGSEONG EO-O +117B ; [.3DA4.0020.0002] # HANGUL JUNGSEONG EO-U +117C ; [.3DA5.0020.0002] # HANGUL JUNGSEONG EO-EU +117D ; [.3DA6.0020.0002] # HANGUL JUNGSEONG YEO-O +117E ; [.3DA7.0020.0002] # HANGUL JUNGSEONG YEO-U +117F ; [.3DA8.0020.0002] # HANGUL JUNGSEONG O-EO +1180 ; [.3DA9.0020.0002] # HANGUL JUNGSEONG O-E +1181 ; [.3DAA.0020.0002] # HANGUL JUNGSEONG O-YE +1182 ; [.3DAB.0020.0002] # HANGUL JUNGSEONG O-O +1183 ; [.3DAC.0020.0002] # HANGUL JUNGSEONG O-U +1184 ; [.3DAD.0020.0002] # HANGUL JUNGSEONG YO-YA +3187 ; [.3DAD.0020.0004] # HANGUL LETTER YO-YA +1185 ; [.3DAE.0020.0002] # HANGUL JUNGSEONG YO-YAE +3188 ; [.3DAE.0020.0004] # HANGUL LETTER YO-YAE +1186 ; [.3DAF.0020.0002] # HANGUL JUNGSEONG YO-YEO +1187 ; [.3DB0.0020.0002] # HANGUL JUNGSEONG YO-O +1188 ; [.3DB1.0020.0002] # HANGUL JUNGSEONG YO-I +3189 ; [.3DB1.0020.0004] # HANGUL LETTER YO-I +1189 ; [.3DB2.0020.0002] # HANGUL JUNGSEONG U-A +118A ; [.3DB3.0020.0002] # HANGUL JUNGSEONG U-AE +118B ; [.3DB4.0020.0002] # HANGUL JUNGSEONG U-EO-EU +118C ; [.3DB5.0020.0002] # HANGUL JUNGSEONG U-YE +118D ; [.3DB6.0020.0002] # HANGUL JUNGSEONG U-U +118E ; [.3DB7.0020.0002] # HANGUL JUNGSEONG YU-A +118F ; [.3DB8.0020.0002] # HANGUL JUNGSEONG YU-EO +1190 ; [.3DB9.0020.0002] # HANGUL JUNGSEONG YU-E +1191 ; [.3DBA.0020.0002] # HANGUL JUNGSEONG YU-YEO +318A ; [.3DBA.0020.0004] # HANGUL LETTER YU-YEO +1192 ; [.3DBB.0020.0002] # HANGUL JUNGSEONG YU-YE +318B ; [.3DBB.0020.0004] # HANGUL LETTER YU-YE +1193 ; [.3DBC.0020.0002] # HANGUL JUNGSEONG YU-U +1194 ; [.3DBD.0020.0002] # HANGUL JUNGSEONG YU-I +318C ; [.3DBD.0020.0004] # HANGUL LETTER YU-I +1195 ; [.3DBE.0020.0002] # HANGUL JUNGSEONG EU-U +1196 ; [.3DBF.0020.0002] # HANGUL JUNGSEONG EU-EU +1197 ; [.3DC0.0020.0002] # HANGUL JUNGSEONG YI-U +1198 ; [.3DC1.0020.0002] # HANGUL JUNGSEONG I-A +1199 ; [.3DC2.0020.0002] # HANGUL JUNGSEONG I-YA +119A ; [.3DC3.0020.0002] # HANGUL JUNGSEONG I-O +119B ; [.3DC4.0020.0002] # HANGUL JUNGSEONG I-U +119C ; [.3DC5.0020.0002] # HANGUL JUNGSEONG I-EU +119D ; [.3DC6.0020.0002] # HANGUL JUNGSEONG I-ARAEA +119E ; [.3DC7.0020.0002] # HANGUL JUNGSEONG ARAEA +318D ; [.3DC7.0020.0004] # HANGUL LETTER ARAEA +119F ; [.3DC8.0020.0002] # HANGUL JUNGSEONG ARAEA-EO +11A0 ; [.3DC9.0020.0002] # HANGUL JUNGSEONG ARAEA-U +11A1 ; [.3DCA.0020.0002] # HANGUL JUNGSEONG ARAEA-I +318E ; [.3DCA.0020.0004] # HANGUL LETTER ARAEAE +11A2 ; [.3DCB.0020.0002] # HANGUL JUNGSEONG SSANGARAEA +11A3 ; [.3DCC.0020.0002] # HANGUL JUNGSEONG A-EU +11A4 ; [.3DCD.0020.0002] # HANGUL JUNGSEONG YA-U +11A5 ; [.3DCE.0020.0002] # HANGUL JUNGSEONG YEO-YA +11A6 ; [.3DCF.0020.0002] # HANGUL JUNGSEONG O-YA +11A7 ; [.3DD0.0020.0002] # HANGUL JUNGSEONG O-YAE +D7B0 ; [.3DD1.0020.0002] # HANGUL JUNGSEONG O-YEO +D7B1 ; [.3DD2.0020.0002] # HANGUL JUNGSEONG O-O-I +D7B2 ; [.3DD3.0020.0002] # HANGUL JUNGSEONG YO-A +D7B3 ; [.3DD4.0020.0002] # HANGUL JUNGSEONG YO-AE +D7B4 ; [.3DD5.0020.0002] # HANGUL JUNGSEONG YO-EO +D7B5 ; [.3DD6.0020.0002] # HANGUL JUNGSEONG U-YEO +D7B6 ; [.3DD7.0020.0002] # HANGUL JUNGSEONG U-I-I +D7B7 ; [.3DD8.0020.0002] # HANGUL JUNGSEONG YU-AE +D7B8 ; [.3DD9.0020.0002] # HANGUL JUNGSEONG YU-O +D7B9 ; [.3DDA.0020.0002] # HANGUL JUNGSEONG EU-A +D7BA ; [.3DDB.0020.0002] # HANGUL JUNGSEONG EU-EO +D7BB ; [.3DDC.0020.0002] # HANGUL JUNGSEONG EU-E +D7BC ; [.3DDD.0020.0002] # HANGUL JUNGSEONG EU-O +D7BD ; [.3DDE.0020.0002] # HANGUL JUNGSEONG I-YA-O +D7BE ; [.3DDF.0020.0002] # HANGUL JUNGSEONG I-YAE +D7BF ; [.3DE0.0020.0002] # HANGUL JUNGSEONG I-YEO +D7C0 ; [.3DE1.0020.0002] # HANGUL JUNGSEONG I-YE +D7C1 ; [.3DE2.0020.0002] # HANGUL JUNGSEONG I-O-I +D7C2 ; [.3DE3.0020.0002] # HANGUL JUNGSEONG I-YO +D7C3 ; [.3DE4.0020.0002] # HANGUL JUNGSEONG I-YU +D7C4 ; [.3DE5.0020.0002] # HANGUL JUNGSEONG I-I +D7C5 ; [.3DE6.0020.0002] # HANGUL JUNGSEONG ARAEA-A +D7C6 ; [.3DE7.0020.0002] # HANGUL JUNGSEONG ARAEA-E +11A8 ; [.3DE8.0020.0002] # HANGUL JONGSEONG KIYEOK +11A9 ; [.3DE9.0020.0002] # HANGUL JONGSEONG SSANGKIYEOK +11AA ; [.3DEA.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS +3133 ; [.3DEA.0020.0004] # HANGUL LETTER KIYEOK-SIOS +FFA3 ; [.3DEA.0020.0012] # HALFWIDTH HANGUL LETTER KIYEOK-SIOS +11AB ; [.3DEB.0020.0002] # HANGUL JONGSEONG NIEUN +11AC ; [.3DEC.0020.0002] # HANGUL JONGSEONG NIEUN-CIEUC +3135 ; [.3DEC.0020.0004] # HANGUL LETTER NIEUN-CIEUC +FFA5 ; [.3DEC.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-CIEUC +11AD ; [.3DED.0020.0002] # HANGUL JONGSEONG NIEUN-HIEUH +3136 ; [.3DED.0020.0004] # HANGUL LETTER NIEUN-HIEUH +FFA6 ; [.3DED.0020.0012] # HALFWIDTH HANGUL LETTER NIEUN-HIEUH +11AE ; [.3DEE.0020.0002] # HANGUL JONGSEONG TIKEUT +11AF ; [.3DEF.0020.0002] # HANGUL JONGSEONG RIEUL +11B0 ; [.3DF0.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK +313A ; [.3DF0.0020.0004] # HANGUL LETTER RIEUL-KIYEOK +FFAA ; [.3DF0.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +11B1 ; [.3DF1.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM +313B ; [.3DF1.0020.0004] # HANGUL LETTER RIEUL-MIEUM +FFAB ; [.3DF1.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-MIEUM +11B2 ; [.3DF2.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP +313C ; [.3DF2.0020.0004] # HANGUL LETTER RIEUL-PIEUP +FFAC ; [.3DF2.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PIEUP +11B3 ; [.3DF3.0020.0002] # HANGUL JONGSEONG RIEUL-SIOS +313D ; [.3DF3.0020.0004] # HANGUL LETTER RIEUL-SIOS +FFAD ; [.3DF3.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-SIOS +11B4 ; [.3DF4.0020.0002] # HANGUL JONGSEONG RIEUL-THIEUTH +313E ; [.3DF4.0020.0004] # HANGUL LETTER RIEUL-THIEUTH +FFAE ; [.3DF4.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +11B5 ; [.3DF5.0020.0002] # HANGUL JONGSEONG RIEUL-PHIEUPH +313F ; [.3DF5.0020.0004] # HANGUL LETTER RIEUL-PHIEUPH +FFAF ; [.3DF5.0020.0012] # HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +11B6 ; [.3DF6.0020.0002] # HANGUL JONGSEONG RIEUL-HIEUH +11B7 ; [.3DF7.0020.0002] # HANGUL JONGSEONG MIEUM +11B8 ; [.3DF8.0020.0002] # HANGUL JONGSEONG PIEUP +11B9 ; [.3DF9.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS +11BA ; [.3DFA.0020.0002] # HANGUL JONGSEONG SIOS +11BB ; [.3DFB.0020.0002] # HANGUL JONGSEONG SSANGSIOS +11BC ; [.3DFC.0020.0002] # HANGUL JONGSEONG IEUNG +11BD ; [.3DFD.0020.0002] # HANGUL JONGSEONG CIEUC +11BE ; [.3DFE.0020.0002] # HANGUL JONGSEONG CHIEUCH +11BF ; [.3DFF.0020.0002] # HANGUL JONGSEONG KHIEUKH +11C0 ; [.3E00.0020.0002] # HANGUL JONGSEONG THIEUTH +11C1 ; [.3E01.0020.0002] # HANGUL JONGSEONG PHIEUPH +11C2 ; [.3E02.0020.0002] # HANGUL JONGSEONG HIEUH +11C3 ; [.3E03.0020.0002] # HANGUL JONGSEONG KIYEOK-RIEUL +11C4 ; [.3E04.0020.0002] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +11C5 ; [.3E05.0020.0002] # HANGUL JONGSEONG NIEUN-KIYEOK +11C6 ; [.3E06.0020.0002] # HANGUL JONGSEONG NIEUN-TIKEUT +11C7 ; [.3E07.0020.0002] # HANGUL JONGSEONG NIEUN-SIOS +3167 ; [.3E07.0020.0004] # HANGUL LETTER NIEUN-SIOS +11C8 ; [.3E08.0020.0002] # HANGUL JONGSEONG NIEUN-PANSIOS +3168 ; [.3E08.0020.0004] # HANGUL LETTER NIEUN-PANSIOS +11C9 ; [.3E09.0020.0002] # HANGUL JONGSEONG NIEUN-THIEUTH +11CA ; [.3E0A.0020.0002] # HANGUL JONGSEONG TIKEUT-KIYEOK +11CB ; [.3E0B.0020.0002] # HANGUL JONGSEONG TIKEUT-RIEUL +11CC ; [.3E0C.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +3169 ; [.3E0C.0020.0004] # HANGUL LETTER RIEUL-KIYEOK-SIOS +11CD ; [.3E0D.0020.0002] # HANGUL JONGSEONG RIEUL-NIEUN +11CE ; [.3E0E.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT +316A ; [.3E0E.0020.0004] # HANGUL LETTER RIEUL-TIKEUT +11CF ; [.3E0F.0020.0002] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +11D0 ; [.3E10.0020.0002] # HANGUL JONGSEONG SSANGRIEUL +11D1 ; [.3E11.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +11D2 ; [.3E12.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS +11D3 ; [.3E13.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS +316B ; [.3E13.0020.0004] # HANGUL LETTER RIEUL-PIEUP-SIOS +11D4 ; [.3E14.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +11D5 ; [.3E15.0020.0002] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +11D6 ; [.3E16.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGSIOS +11D7 ; [.3E17.0020.0002] # HANGUL JONGSEONG RIEUL-PANSIOS +316C ; [.3E17.0020.0004] # HANGUL LETTER RIEUL-PANSIOS +11D8 ; [.3E18.0020.0002] # HANGUL JONGSEONG RIEUL-KHIEUKH +11D9 ; [.3E19.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH +316D ; [.3E19.0020.0004] # HANGUL LETTER RIEUL-YEORINHIEUH +11DA ; [.3E1A.0020.0002] # HANGUL JONGSEONG MIEUM-KIYEOK +11DB ; [.3E1B.0020.0002] # HANGUL JONGSEONG MIEUM-RIEUL +11DC ; [.3E1C.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP +11DD ; [.3E1D.0020.0002] # HANGUL JONGSEONG MIEUM-SIOS +316F ; [.3E1D.0020.0004] # HANGUL LETTER MIEUM-SIOS +11DE ; [.3E1E.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGSIOS +11DF ; [.3E1F.0020.0002] # HANGUL JONGSEONG MIEUM-PANSIOS +3170 ; [.3E1F.0020.0004] # HANGUL LETTER MIEUM-PANSIOS +11E0 ; [.3E20.0020.0002] # HANGUL JONGSEONG MIEUM-CHIEUCH +11E1 ; [.3E21.0020.0002] # HANGUL JONGSEONG MIEUM-HIEUH +11E2 ; [.3E22.0020.0002] # HANGUL JONGSEONG KAPYEOUNMIEUM +11E3 ; [.3E23.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL +11E4 ; [.3E24.0020.0002] # HANGUL JONGSEONG PIEUP-PHIEUPH +11E5 ; [.3E25.0020.0002] # HANGUL JONGSEONG PIEUP-HIEUH +11E6 ; [.3E26.0020.0002] # HANGUL JONGSEONG KAPYEOUNPIEUP +11E7 ; [.3E27.0020.0002] # HANGUL JONGSEONG SIOS-KIYEOK +11E8 ; [.3E28.0020.0002] # HANGUL JONGSEONG SIOS-TIKEUT +11E9 ; [.3E29.0020.0002] # HANGUL JONGSEONG SIOS-RIEUL +11EA ; [.3E2A.0020.0002] # HANGUL JONGSEONG SIOS-PIEUP +11EB ; [.3E2B.0020.0002] # HANGUL JONGSEONG PANSIOS +11EC ; [.3E2C.0020.0002] # HANGUL JONGSEONG IEUNG-KIYEOK +11ED ; [.3E2D.0020.0002] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK +11EE ; [.3E2E.0020.0002] # HANGUL JONGSEONG SSANGIEUNG +11EF ; [.3E2F.0020.0002] # HANGUL JONGSEONG IEUNG-KHIEUKH +11F0 ; [.3E30.0020.0002] # HANGUL JONGSEONG YESIEUNG +11F1 ; [.3E31.0020.0002] # HANGUL JONGSEONG YESIEUNG-SIOS +3182 ; [.3E31.0020.0004] # HANGUL LETTER YESIEUNG-SIOS +11F2 ; [.3E32.0020.0002] # HANGUL JONGSEONG YESIEUNG-PANSIOS +3183 ; [.3E32.0020.0004] # HANGUL LETTER YESIEUNG-PANSIOS +11F3 ; [.3E33.0020.0002] # HANGUL JONGSEONG PHIEUPH-PIEUP +11F4 ; [.3E34.0020.0002] # HANGUL JONGSEONG KAPYEOUNPHIEUPH +11F5 ; [.3E35.0020.0002] # HANGUL JONGSEONG HIEUH-NIEUN +11F6 ; [.3E36.0020.0002] # HANGUL JONGSEONG HIEUH-RIEUL +11F7 ; [.3E37.0020.0002] # HANGUL JONGSEONG HIEUH-MIEUM +11F8 ; [.3E38.0020.0002] # HANGUL JONGSEONG HIEUH-PIEUP +11F9 ; [.3E39.0020.0002] # HANGUL JONGSEONG YEORINHIEUH +11FA ; [.3E3A.0020.0002] # HANGUL JONGSEONG KIYEOK-NIEUN +11FB ; [.3E3B.0020.0002] # HANGUL JONGSEONG KIYEOK-PIEUP +11FC ; [.3E3C.0020.0002] # HANGUL JONGSEONG KIYEOK-CHIEUCH +11FD ; [.3E3D.0020.0002] # HANGUL JONGSEONG KIYEOK-KHIEUKH +11FE ; [.3E3E.0020.0002] # HANGUL JONGSEONG KIYEOK-HIEUH +11FF ; [.3E3F.0020.0002] # HANGUL JONGSEONG SSANGNIEUN +D7CB ; [.3E40.0020.0002] # HANGUL JONGSEONG NIEUN-RIEUL +D7CC ; [.3E41.0020.0002] # HANGUL JONGSEONG NIEUN-CHIEUCH +D7CD ; [.3E42.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT +D7CE ; [.3E43.0020.0002] # HANGUL JONGSEONG SSANGTIKEUT-PIEUP +D7CF ; [.3E44.0020.0002] # HANGUL JONGSEONG TIKEUT-PIEUP +D7D0 ; [.3E45.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS +D7D1 ; [.3E46.0020.0002] # HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK +D7D2 ; [.3E47.0020.0002] # HANGUL JONGSEONG TIKEUT-CIEUC +D7D3 ; [.3E48.0020.0002] # HANGUL JONGSEONG TIKEUT-CHIEUCH +D7D4 ; [.3E49.0020.0002] # HANGUL JONGSEONG TIKEUT-THIEUTH +D7D5 ; [.3E4A.0020.0002] # HANGUL JONGSEONG RIEUL-SSANGKIYEOK +D7D6 ; [.3E4B.0020.0002] # HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH +D7D7 ; [.3E4C.0020.0002] # HANGUL JONGSEONG SSANGRIEUL-KHIEUKH +D7D8 ; [.3E4D.0020.0002] # HANGUL JONGSEONG RIEUL-MIEUM-HIEUH +D7D9 ; [.3E4E.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT +D7DA ; [.3E4F.0020.0002] # HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH +D7DB ; [.3E50.0020.0002] # HANGUL JONGSEONG RIEUL-YESIEUNG +D7DC ; [.3E51.0020.0002] # HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH +D7DD ; [.3E52.0020.0002] # HANGUL JONGSEONG KAPYEOUNRIEUL +D7DE ; [.3E53.0020.0002] # HANGUL JONGSEONG MIEUM-NIEUN +D7DF ; [.3E54.0020.0002] # HANGUL JONGSEONG MIEUM-SSANGNIEUN +D7E0 ; [.3E55.0020.0002] # HANGUL JONGSEONG SSANGMIEUM +D7E1 ; [.3E56.0020.0002] # HANGUL JONGSEONG MIEUM-PIEUP-SIOS +D7E2 ; [.3E57.0020.0002] # HANGUL JONGSEONG MIEUM-CIEUC +D7E3 ; [.3E58.0020.0002] # HANGUL JONGSEONG PIEUP-TIKEUT +D7E4 ; [.3E59.0020.0002] # HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH +D7E5 ; [.3E5A.0020.0002] # HANGUL JONGSEONG PIEUP-MIEUM +D7E6 ; [.3E5B.0020.0002] # HANGUL JONGSEONG SSANGPIEUP +D7E7 ; [.3E5C.0020.0002] # HANGUL JONGSEONG PIEUP-SIOS-TIKEUT +D7E8 ; [.3E5D.0020.0002] # HANGUL JONGSEONG PIEUP-CIEUC +D7E9 ; [.3E5E.0020.0002] # HANGUL JONGSEONG PIEUP-CHIEUCH +D7EA ; [.3E5F.0020.0002] # HANGUL JONGSEONG SIOS-MIEUM +D7EB ; [.3E60.0020.0002] # HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP +D7EC ; [.3E61.0020.0002] # HANGUL JONGSEONG SSANGSIOS-KIYEOK +D7ED ; [.3E62.0020.0002] # HANGUL JONGSEONG SSANGSIOS-TIKEUT +D7EE ; [.3E63.0020.0002] # HANGUL JONGSEONG SIOS-PANSIOS +D7EF ; [.3E64.0020.0002] # HANGUL JONGSEONG SIOS-CIEUC +D7F0 ; [.3E65.0020.0002] # HANGUL JONGSEONG SIOS-CHIEUCH +D7F1 ; [.3E66.0020.0002] # HANGUL JONGSEONG SIOS-THIEUTH +D7F2 ; [.3E67.0020.0002] # HANGUL JONGSEONG SIOS-HIEUH +D7F3 ; [.3E68.0020.0002] # HANGUL JONGSEONG PANSIOS-PIEUP +D7F4 ; [.3E69.0020.0002] # HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP +D7F5 ; [.3E6A.0020.0002] # HANGUL JONGSEONG YESIEUNG-MIEUM +D7F6 ; [.3E6B.0020.0002] # HANGUL JONGSEONG YESIEUNG-HIEUH +D7F7 ; [.3E6C.0020.0002] # HANGUL JONGSEONG CIEUC-PIEUP +D7F8 ; [.3E6D.0020.0002] # HANGUL JONGSEONG CIEUC-SSANGPIEUP +D7F9 ; [.3E6E.0020.0002] # HANGUL JONGSEONG SSANGCIEUC +D7FA ; [.3E6F.0020.0002] # HANGUL JONGSEONG PHIEUPH-SIOS +D7FB ; [.3E70.0020.0002] # HANGUL JONGSEONG PHIEUPH-THIEUTH +3041 ; [.3E71.0020.000D] # HIRAGANA LETTER SMALL A +3042 ; [.3E71.0020.000E] # HIRAGANA LETTER A +30A1 ; [.3E71.0020.000F] # KATAKANA LETTER SMALL A +FF67 ; [.3E71.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL A +30A2 ; [.3E71.0020.0011] # KATAKANA LETTER A +FF71 ; [.3E71.0020.0012] # HALFWIDTH KATAKANA LETTER A +32D0 ; [.3E71.0020.0013] # CIRCLED KATAKANA A +3303 ; [.3E71.0020.001C][.1C73.0020.001C][.3E9A.0020.001C] # SQUARE AARU +3300 ; [.3E71.0020.001C][.3E8B.0020.001C][.0000.0038.001C][.1C73.0020.001C][.3E85.0020.001C] # SQUARE APAATO +3301 ; [.3E71.0020.001C][.3E9A.0020.001C][.3E8D.0020.001C][.3E71.0020.001C] # SQUARE ARUHUA +3302 ; [.3E71.0020.001C][.3EA1.0020.001C][.3E8E.0020.001C][.0000.0038.001C][.3E71.0020.001C] # SQUARE ANPEA +3043 ; [.3E72.0020.000D] # HIRAGANA LETTER SMALL I +3044 ; [.3E72.0020.000E] # HIRAGANA LETTER I +30A3 ; [.3E72.0020.000F] # KATAKANA LETTER SMALL I +FF68 ; [.3E72.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL I +30A4 ; [.3E72.0020.0011] # KATAKANA LETTER I +FF72 ; [.3E72.0020.0012] # HALFWIDTH KATAKANA LETTER I +32D1 ; [.3E72.0020.0013] # CIRCLED KATAKANA I +3304 ; [.3E72.0020.001C][.3E87.0020.001C][.3EA1.0020.001C][.3E79.0020.001C][.0000.0037.001C] # SQUARE ININGU +3305 ; [.3E72.0020.001C][.3EA1.0020.001C][.3E82.0020.001C] # SQUARE INTI +3045 ; [.3E73.0020.000D] # HIRAGANA LETTER SMALL U +3046 ; [.3E73.0020.000E] # HIRAGANA LETTER U +30A5 ; [.3E73.0020.000F] # KATAKANA LETTER SMALL U +FF69 ; [.3E73.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL U +30A6 ; [.3E73.0020.0011] # KATAKANA LETTER U +FF73 ; [.3E73.0020.0012] # HALFWIDTH KATAKANA LETTER U +32D2 ; [.3E73.0020.0013] # CIRCLED KATAKANA U +3094 ; [.3E73.0020.000E][.0000.0037.0002] # HIRAGANA LETTER VU +30F4 ; [.3E73.0020.0011][.0000.0037.0002] # KATAKANA LETTER VU +3306 ; [.3E73.0020.001C][.3E76.0020.001C][.3EA1.0020.001C] # SQUARE UON +1B000 ; [.3E74.0020.0011] # KATAKANA LETTER ARCHAIC E +3047 ; [.3E75.0020.000D] # HIRAGANA LETTER SMALL E +3048 ; [.3E75.0020.000E] # HIRAGANA LETTER E +30A7 ; [.3E75.0020.000F] # KATAKANA LETTER SMALL E +FF6A ; [.3E75.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL E +30A8 ; [.3E75.0020.0011] # KATAKANA LETTER E +FF74 ; [.3E75.0020.0012] # HALFWIDTH KATAKANA LETTER E +32D3 ; [.3E75.0020.0013] # CIRCLED KATAKANA E +3308 ; [.3E75.0020.001C][.1C73.0020.001C][.3E77.0020.001C][.1C73.0020.001C] # SQUARE EEKAA +3307 ; [.3E75.0020.001C][.3E7E.0020.001C][.3E79.0020.001C][.1C73.0020.001C][.3E85.0020.001C][.0000.0037.001C] # SQUARE ESUKUUDO +3049 ; [.3E76.0020.000D] # HIRAGANA LETTER SMALL O +304A ; [.3E76.0020.000E] # HIRAGANA LETTER O +30A9 ; [.3E76.0020.000F] # KATAKANA LETTER SMALL O +FF6B ; [.3E76.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL O +30AA ; [.3E76.0020.0011] # KATAKANA LETTER O +FF75 ; [.3E76.0020.0012] # HALFWIDTH KATAKANA LETTER O +32D4 ; [.3E76.0020.0013] # CIRCLED KATAKANA O +330A ; [.3E76.0020.001C][.1C73.0020.001C][.3E92.0020.001C] # SQUARE OOMU +3309 ; [.3E76.0020.001C][.3EA1.0020.001C][.3E7E.0020.001C] # SQUARE ONSU +3095 ; [.3E77.0020.000D] # HIRAGANA LETTER SMALL KA +304B ; [.3E77.0020.000E] # HIRAGANA LETTER KA +30F5 ; [.3E77.0020.000F] # KATAKANA LETTER SMALL KA +30AB ; [.3E77.0020.0011] # KATAKANA LETTER KA +FF76 ; [.3E77.0020.0012] # HALFWIDTH KATAKANA LETTER KA +32D5 ; [.3E77.0020.0013] # CIRCLED KATAKANA KA +304C ; [.3E77.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GA +30AC ; [.3E77.0020.0011][.0000.0037.0002] # KATAKANA LETTER GA +330B ; [.3E77.0020.001C][.3E72.0020.001C][.3E99.0020.001C] # SQUARE KAIRI +330C ; [.3E77.0020.001C][.3E98.0020.001C][.3E83.0020.001C][.3E85.0020.001C] # SQUARE KARATTO +330D ; [.3E77.0020.001C][.3E9C.0020.001C][.3E99.0020.001C][.1C73.0020.001C] # SQUARE KARORII +330E ; [.3E77.0020.001C][.0000.0037.001C][.3E9C.0020.001C][.3EA1.0020.001C] # SQUARE GARON +330F ; [.3E77.0020.001C][.0000.0037.001C][.3EA1.0020.001C][.3E90.0020.001C] # SQUARE GANMA +304D ; [.3E78.0020.000E] # HIRAGANA LETTER KI +30AD ; [.3E78.0020.0011] # KATAKANA LETTER KI +FF77 ; [.3E78.0020.0012] # HALFWIDTH KATAKANA LETTER KI +32D6 ; [.3E78.0020.0013] # CIRCLED KATAKANA KI +304E ; [.3E78.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GI +30AE ; [.3E78.0020.0011][.0000.0037.0002] # KATAKANA LETTER GI +3310 ; [.3E78.0020.001C][.0000.0037.001C][.3E77.0020.001C][.0000.0037.001C] # SQUARE GIGA +3311 ; [.3E78.0020.001C][.0000.0037.001C][.3E87.0020.001C][.1C73.0020.001C] # SQUARE GINII +3312 ; [.3E78.0020.001C][.3E96.0020.001C][.3E99.0020.001C][.1C73.0020.001C] # SQUARE KYURII +3313 ; [.3E78.0020.001C][.0000.0037.001C][.3E9A.0020.001C][.3E81.0020.001C][.0000.0037.001C][.1C73.0020.001C] # SQUARE GIRUDAA +3314 ; [.3E78.0020.001C][.3E9C.0020.001C] # SQUARE KIRO +3315 ; [.3E78.0020.001C][.3E9C.0020.001C][.3E79.0020.001C][.0000.0037.001C][.3E98.0020.001C][.3E92.0020.001C] # SQUARE KIROGURAMU +3316 ; [.3E78.0020.001C][.3E9C.0020.001C][.3E93.0020.001C][.1C73.0020.001C][.3E85.0020.001C][.3E9A.0020.001C] # SQUARE KIROMEETORU +3317 ; [.3E78.0020.001C][.3E9C.0020.001C][.3E9D.0020.001C][.3E83.0020.001C][.3E85.0020.001C] # SQUARE KIROWATTO +304F ; [.3E79.0020.000E] # HIRAGANA LETTER KU +31F0 ; [.3E79.0020.000F] # KATAKANA LETTER SMALL KU +30AF ; [.3E79.0020.0011] # KATAKANA LETTER KU +FF78 ; [.3E79.0020.0012] # HALFWIDTH KATAKANA LETTER KU +32D7 ; [.3E79.0020.0013] # CIRCLED KATAKANA KU +3050 ; [.3E79.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GU +30B0 ; [.3E79.0020.0011][.0000.0037.0002] # KATAKANA LETTER GU +3318 ; [.3E79.0020.001C][.0000.0037.001C][.3E98.0020.001C][.3E92.0020.001C] # SQUARE GURAMU +3319 ; [.3E79.0020.001C][.0000.0037.001C][.3E98.0020.001C][.3E92.0020.001C][.3E85.0020.001C][.3EA1.0020.001C] # SQUARE GURAMUTON +331A ; [.3E79.0020.001C][.3E9A.0020.001C][.3E7F.0020.001C][.0000.0037.001C][.3E72.0020.001C][.3E9C.0020.001C] # SQUARE KURUZEIRO +331B ; [.3E79.0020.001C][.3E9C.0020.001C][.1C73.0020.001C][.3E89.0020.001C] # SQUARE KUROONE +3096 ; [.3E7A.0020.000D] # HIRAGANA LETTER SMALL KE +3051 ; [.3E7A.0020.000E] # HIRAGANA LETTER KE +30F6 ; [.3E7A.0020.000F] # KATAKANA LETTER SMALL KE +30B1 ; [.3E7A.0020.0011] # KATAKANA LETTER KE +FF79 ; [.3E7A.0020.0012] # HALFWIDTH KATAKANA LETTER KE +32D8 ; [.3E7A.0020.0013] # CIRCLED KATAKANA KE +3052 ; [.3E7A.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GE +30B2 ; [.3E7A.0020.0011][.0000.0037.0002] # KATAKANA LETTER GE +331C ; [.3E7A.0020.001C][.1C73.0020.001C][.3E7E.0020.001C] # SQUARE KEESU +3053 ; [.3E7B.0020.000E] # HIRAGANA LETTER KO +30B3 ; [.3E7B.0020.0011] # KATAKANA LETTER KO +FF7A ; [.3E7B.0020.0012] # HALFWIDTH KATAKANA LETTER KO +32D9 ; [.3E7B.0020.0013] # CIRCLED KATAKANA KO +3054 ; [.3E7B.0020.000E][.0000.0037.0002] # HIRAGANA LETTER GO +30B4 ; [.3E7B.0020.0011][.0000.0037.0002] # KATAKANA LETTER GO +331E ; [.3E7B.0020.001C][.1C73.0020.001C][.3E8F.0020.001C][.0000.0038.001C] # SQUARE KOOPO +1F201 ; [.3E7B.0020.001C][.3E7B.0020.001C] # SQUARED KATAKANA KOKO +30FF ; [.3E7B.0020.0016][.3E85.0020.0016] # KATAKANA DIGRAPH KOTO +331D ; [.3E7B.0020.001C][.3E9A.0020.001C][.3E86.0020.001C] # SQUARE KORUNA +3055 ; [.3E7C.0020.000E] # HIRAGANA LETTER SA +30B5 ; [.3E7C.0020.0011] # KATAKANA LETTER SA +FF7B ; [.3E7C.0020.0012] # HALFWIDTH KATAKANA LETTER SA +32DA ; [.3E7C.0020.0013] # CIRCLED KATAKANA SA +1F202 ; [.3E7C.0020.001C] # SQUARED KATAKANA SA +3056 ; [.3E7C.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZA +30B6 ; [.3E7C.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZA +331F ; [.3E7C.0020.001C][.3E72.0020.001C][.3E79.0020.001C][.3E9A.0020.001C] # SQUARE SAIKURU +3320 ; [.3E7C.0020.001C][.3EA1.0020.001C][.3E82.0020.001C][.1C73.0020.001C][.3E92.0020.001C] # SQUARE SANTIIMU +3057 ; [.3E7D.0020.000E] # HIRAGANA LETTER SI +31F1 ; [.3E7D.0020.000F] # KATAKANA LETTER SMALL SI +30B7 ; [.3E7D.0020.0011] # KATAKANA LETTER SI +FF7C ; [.3E7D.0020.0012] # HALFWIDTH KATAKANA LETTER SI +32DB ; [.3E7D.0020.0013] # CIRCLED KATAKANA SI +3058 ; [.3E7D.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZI +30B8 ; [.3E7D.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZI +3006 ; [.3E7D.0020.0004][.3E93.0020.0004] # IDEOGRAPHIC CLOSING MARK +3321 ; [.3E7D.0020.001C][.3E99.0020.001C][.3EA1.0020.001C][.3E79.0020.001C][.0000.0037.001C] # SQUARE SIRINGU +3059 ; [.3E7E.0020.000E] # HIRAGANA LETTER SU +31F2 ; [.3E7E.0020.000F] # KATAKANA LETTER SMALL SU +30B9 ; [.3E7E.0020.0011] # KATAKANA LETTER SU +FF7D ; [.3E7E.0020.0012] # HALFWIDTH KATAKANA LETTER SU +32DC ; [.3E7E.0020.0013] # CIRCLED KATAKANA SU +305A ; [.3E7E.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZU +30BA ; [.3E7E.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZU +305B ; [.3E7F.0020.000E] # HIRAGANA LETTER SE +30BB ; [.3E7F.0020.0011] # KATAKANA LETTER SE +FF7E ; [.3E7F.0020.0012] # HALFWIDTH KATAKANA LETTER SE +32DD ; [.3E7F.0020.0013] # CIRCLED KATAKANA SE +305C ; [.3E7F.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZE +30BC ; [.3E7F.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZE +3322 ; [.3E7F.0020.001C][.3EA1.0020.001C][.3E82.0020.001C] # SQUARE SENTI +3323 ; [.3E7F.0020.001C][.3EA1.0020.001C][.3E85.0020.001C] # SQUARE SENTO +305D ; [.3E80.0020.000E] # HIRAGANA LETTER SO +30BD ; [.3E80.0020.0011] # KATAKANA LETTER SO +FF7F ; [.3E80.0020.0012] # HALFWIDTH KATAKANA LETTER SO +32DE ; [.3E80.0020.0013] # CIRCLED KATAKANA SO +305E ; [.3E80.0020.000E][.0000.0037.0002] # HIRAGANA LETTER ZO +30BE ; [.3E80.0020.0011][.0000.0037.0002] # KATAKANA LETTER ZO +305F ; [.3E81.0020.000E] # HIRAGANA LETTER TA +30BF ; [.3E81.0020.0011] # KATAKANA LETTER TA +FF80 ; [.3E81.0020.0012] # HALFWIDTH KATAKANA LETTER TA +32DF ; [.3E81.0020.0013] # CIRCLED KATAKANA TA +3060 ; [.3E81.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DA +30C0 ; [.3E81.0020.0011][.0000.0037.0002] # KATAKANA LETTER DA +3324 ; [.3E81.0020.001C][.0000.0037.001C][.1C73.0020.001C][.3E7E.0020.001C] # SQUARE DAASU +3061 ; [.3E82.0020.000E] # HIRAGANA LETTER TI +30C1 ; [.3E82.0020.0011] # KATAKANA LETTER TI +FF81 ; [.3E82.0020.0012] # HALFWIDTH KATAKANA LETTER TI +32E0 ; [.3E82.0020.0013] # CIRCLED KATAKANA TI +3062 ; [.3E82.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DI +30C2 ; [.3E82.0020.0011][.0000.0037.0002] # KATAKANA LETTER DI +3063 ; [.3E83.0020.000D] # HIRAGANA LETTER SMALL TU +3064 ; [.3E83.0020.000E] # HIRAGANA LETTER TU +30C3 ; [.3E83.0020.000F] # KATAKANA LETTER SMALL TU +FF6F ; [.3E83.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL TU +30C4 ; [.3E83.0020.0011] # KATAKANA LETTER TU +FF82 ; [.3E83.0020.0012] # HALFWIDTH KATAKANA LETTER TU +32E1 ; [.3E83.0020.0013] # CIRCLED KATAKANA TU +3065 ; [.3E83.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DU +30C5 ; [.3E83.0020.0011][.0000.0037.0002] # KATAKANA LETTER DU +3066 ; [.3E84.0020.000E] # HIRAGANA LETTER TE +30C6 ; [.3E84.0020.0011] # KATAKANA LETTER TE +FF83 ; [.3E84.0020.0012] # HALFWIDTH KATAKANA LETTER TE +32E2 ; [.3E84.0020.0013] # CIRCLED KATAKANA TE +3067 ; [.3E84.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DE +30C7 ; [.3E84.0020.0011][.0000.0037.0002] # KATAKANA LETTER DE +1F213 ; [.3E84.0020.001C][.0000.0037.001C] # SQUARED KATAKANA DE +3325 ; [.3E84.0020.001C][.0000.0037.001C][.3E7D.0020.001C] # SQUARE DESI +3068 ; [.3E85.0020.000E] # HIRAGANA LETTER TO +31F3 ; [.3E85.0020.000F] # KATAKANA LETTER SMALL TO +30C8 ; [.3E85.0020.0011] # KATAKANA LETTER TO +FF84 ; [.3E85.0020.0012] # HALFWIDTH KATAKANA LETTER TO +32E3 ; [.3E85.0020.0013] # CIRCLED KATAKANA TO +3069 ; [.3E85.0020.000E][.0000.0037.0002] # HIRAGANA LETTER DO +30C9 ; [.3E85.0020.0011][.0000.0037.0002] # KATAKANA LETTER DO +3326 ; [.3E85.0020.001C][.0000.0037.001C][.3E9A.0020.001C] # SQUARE DORU +3327 ; [.3E85.0020.001C][.3EA1.0020.001C] # SQUARE TON +306A ; [.3E86.0020.000E] # HIRAGANA LETTER NA +30CA ; [.3E86.0020.0011] # KATAKANA LETTER NA +FF85 ; [.3E86.0020.0012] # HALFWIDTH KATAKANA LETTER NA +32E4 ; [.3E86.0020.0013] # CIRCLED KATAKANA NA +3328 ; [.3E86.0020.001C][.3E8A.0020.001C] # SQUARE NANO +306B ; [.3E87.0020.000E] # HIRAGANA LETTER NI +30CB ; [.3E87.0020.0011] # KATAKANA LETTER NI +FF86 ; [.3E87.0020.0012] # HALFWIDTH KATAKANA LETTER NI +32E5 ; [.3E87.0020.0013] # CIRCLED KATAKANA NI +306C ; [.3E88.0020.000E] # HIRAGANA LETTER NU +31F4 ; [.3E88.0020.000F] # KATAKANA LETTER SMALL NU +30CC ; [.3E88.0020.0011] # KATAKANA LETTER NU +FF87 ; [.3E88.0020.0012] # HALFWIDTH KATAKANA LETTER NU +32E6 ; [.3E88.0020.0013] # CIRCLED KATAKANA NU +306D ; [.3E89.0020.000E] # HIRAGANA LETTER NE +30CD ; [.3E89.0020.0011] # KATAKANA LETTER NE +FF88 ; [.3E89.0020.0012] # HALFWIDTH KATAKANA LETTER NE +32E7 ; [.3E89.0020.0013] # CIRCLED KATAKANA NE +306E ; [.3E8A.0020.000E] # HIRAGANA LETTER NO +30CE ; [.3E8A.0020.0011] # KATAKANA LETTER NO +FF89 ; [.3E8A.0020.0012] # HALFWIDTH KATAKANA LETTER NO +32E8 ; [.3E8A.0020.0013] # CIRCLED KATAKANA NO +3329 ; [.3E8A.0020.001C][.3E83.0020.001C][.3E85.0020.001C] # SQUARE NOTTO +306F ; [.3E8B.0020.000E] # HIRAGANA LETTER HA +31F5 ; [.3E8B.0020.000F] # KATAKANA LETTER SMALL HA +30CF ; [.3E8B.0020.0011] # KATAKANA LETTER HA +FF8A ; [.3E8B.0020.0012] # HALFWIDTH KATAKANA LETTER HA +32E9 ; [.3E8B.0020.0013] # CIRCLED KATAKANA HA +3070 ; [.3E8B.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BA +30D0 ; [.3E8B.0020.0011][.0000.0037.0002] # KATAKANA LETTER BA +3071 ; [.3E8B.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PA +30D1 ; [.3E8B.0020.0011][.0000.0038.0002] # KATAKANA LETTER PA +332B ; [.3E8B.0020.001C][.0000.0038.001C][.1C73.0020.001C][.3E7F.0020.001C][.3EA1.0020.001C][.3E85.0020.001C] # SQUARE PAASENTO +332C ; [.3E8B.0020.001C][.0000.0038.001C][.1C73.0020.001C][.3E83.0020.001C] # SQUARE PAATU +332D ; [.3E8B.0020.001C][.0000.0037.001C][.1C73.0020.001C][.3E9B.0020.001C][.3E9A.0020.001C] # SQUARE BAARERU +332A ; [.3E8B.0020.001C][.3E72.0020.001C][.3E83.0020.001C] # SQUARE HAITU +3072 ; [.3E8C.0020.000E] # HIRAGANA LETTER HI +31F6 ; [.3E8C.0020.000F] # KATAKANA LETTER SMALL HI +30D2 ; [.3E8C.0020.0011] # KATAKANA LETTER HI +FF8B ; [.3E8C.0020.0012] # HALFWIDTH KATAKANA LETTER HI +32EA ; [.3E8C.0020.0013] # CIRCLED KATAKANA HI +3073 ; [.3E8C.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BI +30D3 ; [.3E8C.0020.0011][.0000.0037.0002] # KATAKANA LETTER BI +3074 ; [.3E8C.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PI +30D4 ; [.3E8C.0020.0011][.0000.0038.0002] # KATAKANA LETTER PI +332E ; [.3E8C.0020.001C][.0000.0038.001C][.3E71.0020.001C][.3E7E.0020.001C][.3E85.0020.001C][.3E9A.0020.001C] # SQUARE PIASUTORU +332F ; [.3E8C.0020.001C][.0000.0038.001C][.3E79.0020.001C][.3E9A.0020.001C] # SQUARE PIKURU +3330 ; [.3E8C.0020.001C][.0000.0038.001C][.3E7B.0020.001C] # SQUARE PIKO +3331 ; [.3E8C.0020.001C][.0000.0037.001C][.3E9A.0020.001C] # SQUARE BIRU +3075 ; [.3E8D.0020.000E] # HIRAGANA LETTER HU +31F7 ; [.3E8D.0020.000F] # KATAKANA LETTER SMALL HU +30D5 ; [.3E8D.0020.0011] # KATAKANA LETTER HU +FF8C ; [.3E8D.0020.0012] # HALFWIDTH KATAKANA LETTER HU +32EB ; [.3E8D.0020.0013] # CIRCLED KATAKANA HU +3076 ; [.3E8D.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BU +30D6 ; [.3E8D.0020.0011][.0000.0037.0002] # KATAKANA LETTER BU +3077 ; [.3E8D.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PU +30D7 ; [.3E8D.0020.0011][.0000.0038.0002] # KATAKANA LETTER PU +3332 ; [.3E8D.0020.001C][.3E71.0020.001C][.3E98.0020.001C][.3E83.0020.001C][.3E85.0020.001C][.0000.0037.001C] # SQUARE HUARADDO +3333 ; [.3E8D.0020.001C][.3E72.0020.001C][.1C73.0020.001C][.3E85.0020.001C] # SQUARE HUIITO +3334 ; [.3E8D.0020.001C][.0000.0037.001C][.3E83.0020.001C][.3E7D.0020.001C][.3E75.0020.001C][.3E9A.0020.001C] # SQUARE BUSSYERU +3335 ; [.3E8D.0020.001C][.3E98.0020.001C][.3EA1.0020.001C] # SQUARE HURAN +3078 ; [.3E8E.0020.000E] # HIRAGANA LETTER HE +31F8 ; [.3E8E.0020.000F] # KATAKANA LETTER SMALL HE +30D8 ; [.3E8E.0020.0011] # KATAKANA LETTER HE +FF8D ; [.3E8E.0020.0012] # HALFWIDTH KATAKANA LETTER HE +32EC ; [.3E8E.0020.0013] # CIRCLED KATAKANA HE +3079 ; [.3E8E.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BE +30D9 ; [.3E8E.0020.0011][.0000.0037.0002] # KATAKANA LETTER BE +307A ; [.3E8E.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PE +30DA ; [.3E8E.0020.0011][.0000.0038.0002] # KATAKANA LETTER PE +333B ; [.3E8E.0020.001C][.0000.0038.001C][.1C73.0020.001C][.3E7D.0020.001C][.0000.0037.001C] # SQUARE PEEZI +333C ; [.3E8E.0020.001C][.0000.0037.001C][.1C73.0020.001C][.3E81.0020.001C] # SQUARE BEETA +3336 ; [.3E8E.0020.001C][.3E79.0020.001C][.3E81.0020.001C][.1C73.0020.001C][.3E9A.0020.001C] # SQUARE HEKUTAARU +3337 ; [.3E8E.0020.001C][.0000.0038.001C][.3E80.0020.001C] # SQUARE PESO +3338 ; [.3E8E.0020.001C][.0000.0038.001C][.3E87.0020.001C][.3E8C.0020.001C] # SQUARE PENIHI +3339 ; [.3E8E.0020.001C][.3E9A.0020.001C][.3E83.0020.001C] # SQUARE HERUTU +333A ; [.3E8E.0020.001C][.0000.0038.001C][.3EA1.0020.001C][.3E7E.0020.001C] # SQUARE PENSU +307B ; [.3E8F.0020.000E] # HIRAGANA LETTER HO +31F9 ; [.3E8F.0020.000F] # KATAKANA LETTER SMALL HO +30DB ; [.3E8F.0020.0011] # KATAKANA LETTER HO +FF8E ; [.3E8F.0020.0012] # HALFWIDTH KATAKANA LETTER HO +32ED ; [.3E8F.0020.0013] # CIRCLED KATAKANA HO +307C ; [.3E8F.0020.000E][.0000.0037.0002] # HIRAGANA LETTER BO +30DC ; [.3E8F.0020.0011][.0000.0037.0002] # KATAKANA LETTER BO +307D ; [.3E8F.0020.000E][.0000.0038.0002] # HIRAGANA LETTER PO +30DD ; [.3E8F.0020.0011][.0000.0038.0002] # KATAKANA LETTER PO +3341 ; [.3E8F.0020.001C][.1C73.0020.001C][.3E9A.0020.001C] # SQUARE HOORU +3342 ; [.3E8F.0020.001C][.1C73.0020.001C][.3EA1.0020.001C] # SQUARE HOON +333D ; [.3E8F.0020.001C][.0000.0038.001C][.3E72.0020.001C][.3EA1.0020.001C][.3E85.0020.001C] # SQUARE POINTO +1F200 ; [.3E8F.0020.001C][.3E77.0020.001C] # SQUARE HIRAGANA HOKA +333E ; [.3E8F.0020.001C][.0000.0037.001C][.3E9A.0020.001C][.3E85.0020.001C] # SQUARE BORUTO +333F ; [.3E8F.0020.001C][.3EA1.0020.001C] # SQUARE HON +3340 ; [.3E8F.0020.001C][.0000.0038.001C][.3EA1.0020.001C][.3E85.0020.001C][.0000.0037.001C] # SQUARE PONDO +307E ; [.3E90.0020.000E] # HIRAGANA LETTER MA +30DE ; [.3E90.0020.0011] # KATAKANA LETTER MA +FF8F ; [.3E90.0020.0012] # HALFWIDTH KATAKANA LETTER MA +32EE ; [.3E90.0020.0013] # CIRCLED KATAKANA MA +3343 ; [.3E90.0020.001C][.3E72.0020.001C][.3E79.0020.001C][.3E9C.0020.001C] # SQUARE MAIKURO +3344 ; [.3E90.0020.001C][.3E72.0020.001C][.3E9A.0020.001C] # SQUARE MAIRU +303C ; [.3E90.0020.0004][.3E7E.0020.0004] # MASU MARK +3345 ; [.3E90.0020.001C][.3E83.0020.001C][.3E8B.0020.001C] # SQUARE MAHHA +3346 ; [.3E90.0020.001C][.3E9A.0020.001C][.3E79.0020.001C] # SQUARE MARUKU +3347 ; [.3E90.0020.001C][.3EA1.0020.001C][.3E7D.0020.001C][.3E97.0020.001C][.3EA1.0020.001C] # SQUARE MANSYON +307F ; [.3E91.0020.000E] # HIRAGANA LETTER MI +30DF ; [.3E91.0020.0011] # KATAKANA LETTER MI +FF90 ; [.3E91.0020.0012] # HALFWIDTH KATAKANA LETTER MI +32EF ; [.3E91.0020.0013] # CIRCLED KATAKANA MI +3348 ; [.3E91.0020.001C][.3E79.0020.001C][.3E9C.0020.001C][.3EA1.0020.001C] # SQUARE MIKURON +3349 ; [.3E91.0020.001C][.3E99.0020.001C] # SQUARE MIRI +334A ; [.3E91.0020.001C][.3E99.0020.001C][.3E8B.0020.001C][.0000.0037.001C][.1C73.0020.001C][.3E9A.0020.001C] # SQUARE MIRIBAARU +3080 ; [.3E92.0020.000E] # HIRAGANA LETTER MU +31FA ; [.3E92.0020.000F] # KATAKANA LETTER SMALL MU +30E0 ; [.3E92.0020.0011] # KATAKANA LETTER MU +FF91 ; [.3E92.0020.0012] # HALFWIDTH KATAKANA LETTER MU +32F0 ; [.3E92.0020.0013] # CIRCLED KATAKANA MU +3081 ; [.3E93.0020.000E] # HIRAGANA LETTER ME +30E1 ; [.3E93.0020.0011] # KATAKANA LETTER ME +FF92 ; [.3E93.0020.0012] # HALFWIDTH KATAKANA LETTER ME +32F1 ; [.3E93.0020.0013] # CIRCLED KATAKANA ME +334D ; [.3E93.0020.001C][.1C73.0020.001C][.3E85.0020.001C][.3E9A.0020.001C] # SQUARE MEETORU +334B ; [.3E93.0020.001C][.3E77.0020.001C][.0000.0037.001C] # SQUARE MEGA +334C ; [.3E93.0020.001C][.3E77.0020.001C][.0000.0037.001C][.3E85.0020.001C][.3EA1.0020.001C] # SQUARE MEGATON +3082 ; [.3E94.0020.000E] # HIRAGANA LETTER MO +30E2 ; [.3E94.0020.0011] # KATAKANA LETTER MO +FF93 ; [.3E94.0020.0012] # HALFWIDTH KATAKANA LETTER MO +32F2 ; [.3E94.0020.0013] # CIRCLED KATAKANA MO +3083 ; [.3E95.0020.000D] # HIRAGANA LETTER SMALL YA +3084 ; [.3E95.0020.000E] # HIRAGANA LETTER YA +30E3 ; [.3E95.0020.000F] # KATAKANA LETTER SMALL YA +FF6C ; [.3E95.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YA +30E4 ; [.3E95.0020.0011] # KATAKANA LETTER YA +FF94 ; [.3E95.0020.0012] # HALFWIDTH KATAKANA LETTER YA +32F3 ; [.3E95.0020.0013] # CIRCLED KATAKANA YA +334E ; [.3E95.0020.001C][.1C73.0020.001C][.3E85.0020.001C][.0000.0037.001C] # SQUARE YAADO +334F ; [.3E95.0020.001C][.1C73.0020.001C][.3E9A.0020.001C] # SQUARE YAARU +3085 ; [.3E96.0020.000D] # HIRAGANA LETTER SMALL YU +3086 ; [.3E96.0020.000E] # HIRAGANA LETTER YU +30E5 ; [.3E96.0020.000F] # KATAKANA LETTER SMALL YU +FF6D ; [.3E96.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YU +30E6 ; [.3E96.0020.0011] # KATAKANA LETTER YU +FF95 ; [.3E96.0020.0012] # HALFWIDTH KATAKANA LETTER YU +32F4 ; [.3E96.0020.0013] # CIRCLED KATAKANA YU +3350 ; [.3E96.0020.001C][.3E71.0020.001C][.3EA1.0020.001C] # SQUARE YUAN +3087 ; [.3E97.0020.000D] # HIRAGANA LETTER SMALL YO +3088 ; [.3E97.0020.000E] # HIRAGANA LETTER YO +30E7 ; [.3E97.0020.000F] # KATAKANA LETTER SMALL YO +FF6E ; [.3E97.0020.0010] # HALFWIDTH KATAKANA LETTER SMALL YO +30E8 ; [.3E97.0020.0011] # KATAKANA LETTER YO +FF96 ; [.3E97.0020.0012] # HALFWIDTH KATAKANA LETTER YO +32F5 ; [.3E97.0020.0013] # CIRCLED KATAKANA YO +309F ; [.3E97.0020.0016][.3E99.0020.0016] # HIRAGANA DIGRAPH YORI +3089 ; [.3E98.0020.000E] # HIRAGANA LETTER RA +31FB ; [.3E98.0020.000F] # KATAKANA LETTER SMALL RA +30E9 ; [.3E98.0020.0011] # KATAKANA LETTER RA +FF97 ; [.3E98.0020.0012] # HALFWIDTH KATAKANA LETTER RA +32F6 ; [.3E98.0020.0013] # CIRCLED KATAKANA RA +308A ; [.3E99.0020.000E] # HIRAGANA LETTER RI +31FC ; [.3E99.0020.000F] # KATAKANA LETTER SMALL RI +30EA ; [.3E99.0020.0011] # KATAKANA LETTER RI +FF98 ; [.3E99.0020.0012] # HALFWIDTH KATAKANA LETTER RI +32F7 ; [.3E99.0020.0013] # CIRCLED KATAKANA RI +3351 ; [.3E99.0020.001C][.3E83.0020.001C][.3E85.0020.001C][.3E9A.0020.001C] # SQUARE RITTORU +3352 ; [.3E99.0020.001C][.3E98.0020.001C] # SQUARE RIRA +308B ; [.3E9A.0020.000E] # HIRAGANA LETTER RU +31FD ; [.3E9A.0020.000F] # KATAKANA LETTER SMALL RU +30EB ; [.3E9A.0020.0011] # KATAKANA LETTER RU +FF99 ; [.3E9A.0020.0012] # HALFWIDTH KATAKANA LETTER RU +32F8 ; [.3E9A.0020.0013] # CIRCLED KATAKANA RU +3354 ; [.3E9A.0020.001C][.1C73.0020.001C][.3E8D.0020.001C][.0000.0037.001C][.3E9A.0020.001C] # SQUARE RUUBURU +3353 ; [.3E9A.0020.001C][.3E8C.0020.001C][.0000.0038.001C][.1C73.0020.001C] # SQUARE RUPII +308C ; [.3E9B.0020.000E] # HIRAGANA LETTER RE +31FE ; [.3E9B.0020.000F] # KATAKANA LETTER SMALL RE +30EC ; [.3E9B.0020.0011] # KATAKANA LETTER RE +FF9A ; [.3E9B.0020.0012] # HALFWIDTH KATAKANA LETTER RE +32F9 ; [.3E9B.0020.0013] # CIRCLED KATAKANA RE +3355 ; [.3E9B.0020.001C][.3E92.0020.001C] # SQUARE REMU +3356 ; [.3E9B.0020.001C][.3EA1.0020.001C][.3E85.0020.001C][.3E7A.0020.001C][.0000.0037.001C][.3EA1.0020.001C] # SQUARE RENTOGEN +308D ; [.3E9C.0020.000E] # HIRAGANA LETTER RO +31FF ; [.3E9C.0020.000F] # KATAKANA LETTER SMALL RO +30ED ; [.3E9C.0020.0011] # KATAKANA LETTER RO +FF9B ; [.3E9C.0020.0012] # HALFWIDTH KATAKANA LETTER RO +32FA ; [.3E9C.0020.0013] # CIRCLED KATAKANA RO +308E ; [.3E9D.0020.000D] # HIRAGANA LETTER SMALL WA +308F ; [.3E9D.0020.000E] # HIRAGANA LETTER WA +30EE ; [.3E9D.0020.000F] # KATAKANA LETTER SMALL WA +30EF ; [.3E9D.0020.0011] # KATAKANA LETTER WA +FF9C ; [.3E9D.0020.0012] # HALFWIDTH KATAKANA LETTER WA +32FB ; [.3E9D.0020.0013] # CIRCLED KATAKANA WA +30F7 ; [.3E9D.0020.0011][.0000.0037.0002] # KATAKANA LETTER VA +3357 ; [.3E9D.0020.001C][.3E83.0020.001C][.3E85.0020.001C] # SQUARE WATTO +3090 ; [.3E9E.0020.000E] # HIRAGANA LETTER WI +30F0 ; [.3E9E.0020.0011] # KATAKANA LETTER WI +32FC ; [.3E9E.0020.0013] # CIRCLED KATAKANA WI +30F8 ; [.3E9E.0020.0011][.0000.0037.0002] # KATAKANA LETTER VI +3091 ; [.3E9F.0020.000E] # HIRAGANA LETTER WE +30F1 ; [.3E9F.0020.0011] # KATAKANA LETTER WE +32FD ; [.3E9F.0020.0013] # CIRCLED KATAKANA WE +30F9 ; [.3E9F.0020.0011][.0000.0037.0002] # KATAKANA LETTER VE +3092 ; [.3EA0.0020.000E] # HIRAGANA LETTER WO +30F2 ; [.3EA0.0020.0011] # KATAKANA LETTER WO +FF66 ; [.3EA0.0020.0012] # HALFWIDTH KATAKANA LETTER WO +32FE ; [.3EA0.0020.0013] # CIRCLED KATAKANA WO +30FA ; [.3EA0.0020.0011][.0000.0037.0002] # KATAKANA LETTER VO +3093 ; [.3EA1.0020.000E] # HIRAGANA LETTER N +30F3 ; [.3EA1.0020.0011] # KATAKANA LETTER N +FF9D ; [.3EA1.0020.0012] # HALFWIDTH KATAKANA LETTER N +1B002 ; [.3EA2.0020.0002] # HENTAIGANA LETTER A-1 +1B003 ; [.3EA3.0020.0002] # HENTAIGANA LETTER A-2 +1B004 ; [.3EA4.0020.0002] # HENTAIGANA LETTER A-3 +1B005 ; [.3EA5.0020.0002] # HENTAIGANA LETTER A-WO +1B006 ; [.3EA6.0020.0002] # HENTAIGANA LETTER I-1 +1B007 ; [.3EA7.0020.0002] # HENTAIGANA LETTER I-2 +1B008 ; [.3EA8.0020.0002] # HENTAIGANA LETTER I-3 +1B009 ; [.3EA9.0020.0002] # HENTAIGANA LETTER I-4 +1B00A ; [.3EAA.0020.0002] # HENTAIGANA LETTER U-1 +1B00B ; [.3EAB.0020.0002] # HENTAIGANA LETTER U-2 +1B00C ; [.3EAC.0020.0002] # HENTAIGANA LETTER U-3 +1B00D ; [.3EAD.0020.0002] # HENTAIGANA LETTER U-4 +1B00E ; [.3EAE.0020.0002] # HENTAIGANA LETTER U-5 +1B001 ; [.3EAF.0020.0002] # HIRAGANA LETTER ARCHAIC YE +1B00F ; [.3EB0.0020.0002] # HENTAIGANA LETTER E-2 +1B010 ; [.3EB1.0020.0002] # HENTAIGANA LETTER E-3 +1B011 ; [.3EB2.0020.0002] # HENTAIGANA LETTER E-4 +1B012 ; [.3EB3.0020.0002] # HENTAIGANA LETTER E-5 +1B013 ; [.3EB4.0020.0002] # HENTAIGANA LETTER E-6 +1B014 ; [.3EB5.0020.0002] # HENTAIGANA LETTER O-1 +1B015 ; [.3EB6.0020.0002] # HENTAIGANA LETTER O-2 +1B016 ; [.3EB7.0020.0002] # HENTAIGANA LETTER O-3 +1B017 ; [.3EB8.0020.0002] # HENTAIGANA LETTER KA-1 +1B018 ; [.3EB9.0020.0002] # HENTAIGANA LETTER KA-2 +1B019 ; [.3EBA.0020.0002] # HENTAIGANA LETTER KA-3 +1B01A ; [.3EBB.0020.0002] # HENTAIGANA LETTER KA-4 +1B01B ; [.3EBC.0020.0002] # HENTAIGANA LETTER KA-5 +1B01C ; [.3EBD.0020.0002] # HENTAIGANA LETTER KA-6 +1B01D ; [.3EBE.0020.0002] # HENTAIGANA LETTER KA-7 +1B01E ; [.3EBF.0020.0002] # HENTAIGANA LETTER KA-8 +1B01F ; [.3EC0.0020.0002] # HENTAIGANA LETTER KA-9 +1B020 ; [.3EC1.0020.0002] # HENTAIGANA LETTER KA-10 +1B021 ; [.3EC2.0020.0002] # HENTAIGANA LETTER KA-11 +1B022 ; [.3EC3.0020.0002] # HENTAIGANA LETTER KA-KE +1B023 ; [.3EC4.0020.0002] # HENTAIGANA LETTER KI-1 +1B024 ; [.3EC5.0020.0002] # HENTAIGANA LETTER KI-2 +1B025 ; [.3EC6.0020.0002] # HENTAIGANA LETTER KI-3 +1B026 ; [.3EC7.0020.0002] # HENTAIGANA LETTER KI-4 +1B027 ; [.3EC8.0020.0002] # HENTAIGANA LETTER KI-5 +1B028 ; [.3EC9.0020.0002] # HENTAIGANA LETTER KI-6 +1B029 ; [.3ECA.0020.0002] # HENTAIGANA LETTER KI-7 +1B02A ; [.3ECB.0020.0002] # HENTAIGANA LETTER KI-8 +1B02B ; [.3ECC.0020.0002] # HENTAIGANA LETTER KU-1 +1B02C ; [.3ECD.0020.0002] # HENTAIGANA LETTER KU-2 +1B02D ; [.3ECE.0020.0002] # HENTAIGANA LETTER KU-3 +1B02E ; [.3ECF.0020.0002] # HENTAIGANA LETTER KU-4 +1B02F ; [.3ED0.0020.0002] # HENTAIGANA LETTER KU-5 +1B030 ; [.3ED1.0020.0002] # HENTAIGANA LETTER KU-6 +1B031 ; [.3ED2.0020.0002] # HENTAIGANA LETTER KU-7 +1B032 ; [.3ED3.0020.0002] # HENTAIGANA LETTER KE-1 +1B033 ; [.3ED4.0020.0002] # HENTAIGANA LETTER KE-2 +1B034 ; [.3ED5.0020.0002] # HENTAIGANA LETTER KE-3 +1B035 ; [.3ED6.0020.0002] # HENTAIGANA LETTER KE-4 +1B036 ; [.3ED7.0020.0002] # HENTAIGANA LETTER KE-5 +1B037 ; [.3ED8.0020.0002] # HENTAIGANA LETTER KE-6 +1B038 ; [.3ED9.0020.0002] # HENTAIGANA LETTER KO-1 +1B039 ; [.3EDA.0020.0002] # HENTAIGANA LETTER KO-2 +1B03A ; [.3EDB.0020.0002] # HENTAIGANA LETTER KO-3 +1B03B ; [.3EDC.0020.0002] # HENTAIGANA LETTER KO-KI +1B03C ; [.3EDD.0020.0002] # HENTAIGANA LETTER SA-1 +1B03D ; [.3EDE.0020.0002] # HENTAIGANA LETTER SA-2 +1B03E ; [.3EDF.0020.0002] # HENTAIGANA LETTER SA-3 +1B03F ; [.3EE0.0020.0002] # HENTAIGANA LETTER SA-4 +1B040 ; [.3EE1.0020.0002] # HENTAIGANA LETTER SA-5 +1B041 ; [.3EE2.0020.0002] # HENTAIGANA LETTER SA-6 +1B042 ; [.3EE3.0020.0002] # HENTAIGANA LETTER SA-7 +1B043 ; [.3EE4.0020.0002] # HENTAIGANA LETTER SA-8 +1B044 ; [.3EE5.0020.0002] # HENTAIGANA LETTER SI-1 +1B045 ; [.3EE6.0020.0002] # HENTAIGANA LETTER SI-2 +1B046 ; [.3EE7.0020.0002] # HENTAIGANA LETTER SI-3 +1B047 ; [.3EE8.0020.0002] # HENTAIGANA LETTER SI-4 +1B048 ; [.3EE9.0020.0002] # HENTAIGANA LETTER SI-5 +1B049 ; [.3EEA.0020.0002] # HENTAIGANA LETTER SI-6 +1B04A ; [.3EEB.0020.0002] # HENTAIGANA LETTER SU-1 +1B04B ; [.3EEC.0020.0002] # HENTAIGANA LETTER SU-2 +1B04C ; [.3EED.0020.0002] # HENTAIGANA LETTER SU-3 +1B04D ; [.3EEE.0020.0002] # HENTAIGANA LETTER SU-4 +1B04E ; [.3EEF.0020.0002] # HENTAIGANA LETTER SU-5 +1B04F ; [.3EF0.0020.0002] # HENTAIGANA LETTER SU-6 +1B050 ; [.3EF1.0020.0002] # HENTAIGANA LETTER SU-7 +1B051 ; [.3EF2.0020.0002] # HENTAIGANA LETTER SU-8 +1B052 ; [.3EF3.0020.0002] # HENTAIGANA LETTER SE-1 +1B053 ; [.3EF4.0020.0002] # HENTAIGANA LETTER SE-2 +1B054 ; [.3EF5.0020.0002] # HENTAIGANA LETTER SE-3 +1B055 ; [.3EF6.0020.0002] # HENTAIGANA LETTER SE-4 +1B056 ; [.3EF7.0020.0002] # HENTAIGANA LETTER SE-5 +1B057 ; [.3EF8.0020.0002] # HENTAIGANA LETTER SO-1 +1B058 ; [.3EF9.0020.0002] # HENTAIGANA LETTER SO-2 +1B059 ; [.3EFA.0020.0002] # HENTAIGANA LETTER SO-3 +1B05A ; [.3EFB.0020.0002] # HENTAIGANA LETTER SO-4 +1B05B ; [.3EFC.0020.0002] # HENTAIGANA LETTER SO-5 +1B05C ; [.3EFD.0020.0002] # HENTAIGANA LETTER SO-6 +1B05D ; [.3EFE.0020.0002] # HENTAIGANA LETTER SO-7 +1B05E ; [.3EFF.0020.0002] # HENTAIGANA LETTER TA-1 +1B05F ; [.3F00.0020.0002] # HENTAIGANA LETTER TA-2 +1B060 ; [.3F01.0020.0002] # HENTAIGANA LETTER TA-3 +1B061 ; [.3F02.0020.0002] # HENTAIGANA LETTER TA-4 +1B062 ; [.3F03.0020.0002] # HENTAIGANA LETTER TI-1 +1B063 ; [.3F04.0020.0002] # HENTAIGANA LETTER TI-2 +1B064 ; [.3F05.0020.0002] # HENTAIGANA LETTER TI-3 +1B065 ; [.3F06.0020.0002] # HENTAIGANA LETTER TI-4 +1B066 ; [.3F07.0020.0002] # HENTAIGANA LETTER TI-5 +1B067 ; [.3F08.0020.0002] # HENTAIGANA LETTER TI-6 +1B068 ; [.3F09.0020.0002] # HENTAIGANA LETTER TI-7 +1B069 ; [.3F0A.0020.0002] # HENTAIGANA LETTER TU-1 +1B06A ; [.3F0B.0020.0002] # HENTAIGANA LETTER TU-2 +1B06B ; [.3F0C.0020.0002] # HENTAIGANA LETTER TU-3 +1B06C ; [.3F0D.0020.0002] # HENTAIGANA LETTER TU-4 +1B06D ; [.3F0E.0020.0002] # HENTAIGANA LETTER TU-TO +1B06E ; [.3F0F.0020.0002] # HENTAIGANA LETTER TE-1 +1B06F ; [.3F10.0020.0002] # HENTAIGANA LETTER TE-2 +1B070 ; [.3F11.0020.0002] # HENTAIGANA LETTER TE-3 +1B071 ; [.3F12.0020.0002] # HENTAIGANA LETTER TE-4 +1B072 ; [.3F13.0020.0002] # HENTAIGANA LETTER TE-5 +1B073 ; [.3F14.0020.0002] # HENTAIGANA LETTER TE-6 +1B074 ; [.3F15.0020.0002] # HENTAIGANA LETTER TE-7 +1B075 ; [.3F16.0020.0002] # HENTAIGANA LETTER TE-8 +1B076 ; [.3F17.0020.0002] # HENTAIGANA LETTER TE-9 +1B077 ; [.3F18.0020.0002] # HENTAIGANA LETTER TO-1 +1B078 ; [.3F19.0020.0002] # HENTAIGANA LETTER TO-2 +1B079 ; [.3F1A.0020.0002] # HENTAIGANA LETTER TO-3 +1B07A ; [.3F1B.0020.0002] # HENTAIGANA LETTER TO-4 +1B07B ; [.3F1C.0020.0002] # HENTAIGANA LETTER TO-5 +1B07C ; [.3F1D.0020.0002] # HENTAIGANA LETTER TO-6 +1B07D ; [.3F1E.0020.0002] # HENTAIGANA LETTER TO-RA +1B07E ; [.3F1F.0020.0002] # HENTAIGANA LETTER NA-1 +1B07F ; [.3F20.0020.0002] # HENTAIGANA LETTER NA-2 +1B080 ; [.3F21.0020.0002] # HENTAIGANA LETTER NA-3 +1B081 ; [.3F22.0020.0002] # HENTAIGANA LETTER NA-4 +1B082 ; [.3F23.0020.0002] # HENTAIGANA LETTER NA-5 +1B083 ; [.3F24.0020.0002] # HENTAIGANA LETTER NA-6 +1B084 ; [.3F25.0020.0002] # HENTAIGANA LETTER NA-7 +1B085 ; [.3F26.0020.0002] # HENTAIGANA LETTER NA-8 +1B086 ; [.3F27.0020.0002] # HENTAIGANA LETTER NA-9 +1B087 ; [.3F28.0020.0002] # HENTAIGANA LETTER NI-1 +1B088 ; [.3F29.0020.0002] # HENTAIGANA LETTER NI-2 +1B089 ; [.3F2A.0020.0002] # HENTAIGANA LETTER NI-3 +1B08A ; [.3F2B.0020.0002] # HENTAIGANA LETTER NI-4 +1B08B ; [.3F2C.0020.0002] # HENTAIGANA LETTER NI-5 +1B08C ; [.3F2D.0020.0002] # HENTAIGANA LETTER NI-6 +1B08D ; [.3F2E.0020.0002] # HENTAIGANA LETTER NI-7 +1B08E ; [.3F2F.0020.0002] # HENTAIGANA LETTER NI-TE +1B08F ; [.3F30.0020.0002] # HENTAIGANA LETTER NU-1 +1B090 ; [.3F31.0020.0002] # HENTAIGANA LETTER NU-2 +1B091 ; [.3F32.0020.0002] # HENTAIGANA LETTER NU-3 +1B092 ; [.3F33.0020.0002] # HENTAIGANA LETTER NE-1 +1B093 ; [.3F34.0020.0002] # HENTAIGANA LETTER NE-2 +1B094 ; [.3F35.0020.0002] # HENTAIGANA LETTER NE-3 +1B095 ; [.3F36.0020.0002] # HENTAIGANA LETTER NE-4 +1B096 ; [.3F37.0020.0002] # HENTAIGANA LETTER NE-5 +1B097 ; [.3F38.0020.0002] # HENTAIGANA LETTER NE-6 +1B098 ; [.3F39.0020.0002] # HENTAIGANA LETTER NE-KO +1B099 ; [.3F3A.0020.0002] # HENTAIGANA LETTER NO-1 +1B09A ; [.3F3B.0020.0002] # HENTAIGANA LETTER NO-2 +1B09B ; [.3F3C.0020.0002] # HENTAIGANA LETTER NO-3 +1B09C ; [.3F3D.0020.0002] # HENTAIGANA LETTER NO-4 +1B09D ; [.3F3E.0020.0002] # HENTAIGANA LETTER NO-5 +1B09E ; [.3F3F.0020.0002] # HENTAIGANA LETTER HA-1 +1B09F ; [.3F40.0020.0002] # HENTAIGANA LETTER HA-2 +1B0A0 ; [.3F41.0020.0002] # HENTAIGANA LETTER HA-3 +1B0A1 ; [.3F42.0020.0002] # HENTAIGANA LETTER HA-4 +1B0A2 ; [.3F43.0020.0002] # HENTAIGANA LETTER HA-5 +1B0A3 ; [.3F44.0020.0002] # HENTAIGANA LETTER HA-6 +1B0A4 ; [.3F45.0020.0002] # HENTAIGANA LETTER HA-7 +1B0A5 ; [.3F46.0020.0002] # HENTAIGANA LETTER HA-8 +1B0A6 ; [.3F47.0020.0002] # HENTAIGANA LETTER HA-9 +1B0A7 ; [.3F48.0020.0002] # HENTAIGANA LETTER HA-10 +1B0A8 ; [.3F49.0020.0002] # HENTAIGANA LETTER HA-11 +1B0A9 ; [.3F4A.0020.0002] # HENTAIGANA LETTER HI-1 +1B0AA ; [.3F4B.0020.0002] # HENTAIGANA LETTER HI-2 +1B0AB ; [.3F4C.0020.0002] # HENTAIGANA LETTER HI-3 +1B0AC ; [.3F4D.0020.0002] # HENTAIGANA LETTER HI-4 +1B0AD ; [.3F4E.0020.0002] # HENTAIGANA LETTER HI-5 +1B0AE ; [.3F4F.0020.0002] # HENTAIGANA LETTER HI-6 +1B0AF ; [.3F50.0020.0002] # HENTAIGANA LETTER HI-7 +1B0B0 ; [.3F51.0020.0002] # HENTAIGANA LETTER HU-1 +1B0B1 ; [.3F52.0020.0002] # HENTAIGANA LETTER HU-2 +1B0B2 ; [.3F53.0020.0002] # HENTAIGANA LETTER HU-3 +1B0B3 ; [.3F54.0020.0002] # HENTAIGANA LETTER HE-1 +1B0B4 ; [.3F55.0020.0002] # HENTAIGANA LETTER HE-2 +1B0B5 ; [.3F56.0020.0002] # HENTAIGANA LETTER HE-3 +1B0B6 ; [.3F57.0020.0002] # HENTAIGANA LETTER HE-4 +1B0B7 ; [.3F58.0020.0002] # HENTAIGANA LETTER HE-5 +1B0B8 ; [.3F59.0020.0002] # HENTAIGANA LETTER HE-6 +1B0B9 ; [.3F5A.0020.0002] # HENTAIGANA LETTER HE-7 +1B0BA ; [.3F5B.0020.0002] # HENTAIGANA LETTER HO-1 +1B0BB ; [.3F5C.0020.0002] # HENTAIGANA LETTER HO-2 +1B0BC ; [.3F5D.0020.0002] # HENTAIGANA LETTER HO-3 +1B0BD ; [.3F5E.0020.0002] # HENTAIGANA LETTER HO-4 +1B0BE ; [.3F5F.0020.0002] # HENTAIGANA LETTER HO-5 +1B0BF ; [.3F60.0020.0002] # HENTAIGANA LETTER HO-6 +1B0C0 ; [.3F61.0020.0002] # HENTAIGANA LETTER HO-7 +1B0C1 ; [.3F62.0020.0002] # HENTAIGANA LETTER HO-8 +1B0C2 ; [.3F63.0020.0002] # HENTAIGANA LETTER MA-1 +1B0C3 ; [.3F64.0020.0002] # HENTAIGANA LETTER MA-2 +1B0C4 ; [.3F65.0020.0002] # HENTAIGANA LETTER MA-3 +1B0C5 ; [.3F66.0020.0002] # HENTAIGANA LETTER MA-4 +1B0C6 ; [.3F67.0020.0002] # HENTAIGANA LETTER MA-5 +1B0C7 ; [.3F68.0020.0002] # HENTAIGANA LETTER MA-6 +1B0C8 ; [.3F69.0020.0002] # HENTAIGANA LETTER MA-7 +1B0C9 ; [.3F6A.0020.0002] # HENTAIGANA LETTER MI-1 +1B0CA ; [.3F6B.0020.0002] # HENTAIGANA LETTER MI-2 +1B0CB ; [.3F6C.0020.0002] # HENTAIGANA LETTER MI-3 +1B0CC ; [.3F6D.0020.0002] # HENTAIGANA LETTER MI-4 +1B0CD ; [.3F6E.0020.0002] # HENTAIGANA LETTER MI-5 +1B0CE ; [.3F6F.0020.0002] # HENTAIGANA LETTER MI-6 +1B0CF ; [.3F70.0020.0002] # HENTAIGANA LETTER MI-7 +1B0D0 ; [.3F71.0020.0002] # HENTAIGANA LETTER MU-1 +1B0D1 ; [.3F72.0020.0002] # HENTAIGANA LETTER MU-2 +1B0D2 ; [.3F73.0020.0002] # HENTAIGANA LETTER MU-3 +1B0D3 ; [.3F74.0020.0002] # HENTAIGANA LETTER MU-4 +1B0D4 ; [.3F75.0020.0002] # HENTAIGANA LETTER ME-1 +1B0D5 ; [.3F76.0020.0002] # HENTAIGANA LETTER ME-2 +1B0D6 ; [.3F77.0020.0002] # HENTAIGANA LETTER ME-MA +1B0D7 ; [.3F78.0020.0002] # HENTAIGANA LETTER MO-1 +1B0D8 ; [.3F79.0020.0002] # HENTAIGANA LETTER MO-2 +1B0D9 ; [.3F7A.0020.0002] # HENTAIGANA LETTER MO-3 +1B0DA ; [.3F7B.0020.0002] # HENTAIGANA LETTER MO-4 +1B0DB ; [.3F7C.0020.0002] # HENTAIGANA LETTER MO-5 +1B0DC ; [.3F7D.0020.0002] # HENTAIGANA LETTER MO-6 +1B0DD ; [.3F7E.0020.0002] # HENTAIGANA LETTER YA-1 +1B0DE ; [.3F7F.0020.0002] # HENTAIGANA LETTER YA-2 +1B0DF ; [.3F80.0020.0002] # HENTAIGANA LETTER YA-3 +1B0E0 ; [.3F81.0020.0002] # HENTAIGANA LETTER YA-4 +1B0E1 ; [.3F82.0020.0002] # HENTAIGANA LETTER YA-5 +1B0E2 ; [.3F83.0020.0002] # HENTAIGANA LETTER YA-YO +1B0E3 ; [.3F84.0020.0002] # HENTAIGANA LETTER YU-1 +1B0E4 ; [.3F85.0020.0002] # HENTAIGANA LETTER YU-2 +1B0E5 ; [.3F86.0020.0002] # HENTAIGANA LETTER YU-3 +1B0E6 ; [.3F87.0020.0002] # HENTAIGANA LETTER YU-4 +1B0E7 ; [.3F88.0020.0002] # HENTAIGANA LETTER YO-1 +1B0E8 ; [.3F89.0020.0002] # HENTAIGANA LETTER YO-2 +1B0E9 ; [.3F8A.0020.0002] # HENTAIGANA LETTER YO-3 +1B0EA ; [.3F8B.0020.0002] # HENTAIGANA LETTER YO-4 +1B0EB ; [.3F8C.0020.0002] # HENTAIGANA LETTER YO-5 +1B0EC ; [.3F8D.0020.0002] # HENTAIGANA LETTER YO-6 +1B0ED ; [.3F8E.0020.0002] # HENTAIGANA LETTER RA-1 +1B0EE ; [.3F8F.0020.0002] # HENTAIGANA LETTER RA-2 +1B0EF ; [.3F90.0020.0002] # HENTAIGANA LETTER RA-3 +1B0F0 ; [.3F91.0020.0002] # HENTAIGANA LETTER RA-4 +1B0F1 ; [.3F92.0020.0002] # HENTAIGANA LETTER RI-1 +1B0F2 ; [.3F93.0020.0002] # HENTAIGANA LETTER RI-2 +1B0F3 ; [.3F94.0020.0002] # HENTAIGANA LETTER RI-3 +1B0F4 ; [.3F95.0020.0002] # HENTAIGANA LETTER RI-4 +1B0F5 ; [.3F96.0020.0002] # HENTAIGANA LETTER RI-5 +1B0F6 ; [.3F97.0020.0002] # HENTAIGANA LETTER RI-6 +1B0F7 ; [.3F98.0020.0002] # HENTAIGANA LETTER RI-7 +1B0F8 ; [.3F99.0020.0002] # HENTAIGANA LETTER RU-1 +1B0F9 ; [.3F9A.0020.0002] # HENTAIGANA LETTER RU-2 +1B0FA ; [.3F9B.0020.0002] # HENTAIGANA LETTER RU-3 +1B0FB ; [.3F9C.0020.0002] # HENTAIGANA LETTER RU-4 +1B0FC ; [.3F9D.0020.0002] # HENTAIGANA LETTER RU-5 +1B0FD ; [.3F9E.0020.0002] # HENTAIGANA LETTER RU-6 +1B0FE ; [.3F9F.0020.0002] # HENTAIGANA LETTER RE-1 +1B0FF ; [.3FA0.0020.0002] # HENTAIGANA LETTER RE-2 +1B100 ; [.3FA1.0020.0002] # HENTAIGANA LETTER RE-3 +1B101 ; [.3FA2.0020.0002] # HENTAIGANA LETTER RE-4 +1B102 ; [.3FA3.0020.0002] # HENTAIGANA LETTER RO-1 +1B103 ; [.3FA4.0020.0002] # HENTAIGANA LETTER RO-2 +1B104 ; [.3FA5.0020.0002] # HENTAIGANA LETTER RO-3 +1B105 ; [.3FA6.0020.0002] # HENTAIGANA LETTER RO-4 +1B106 ; [.3FA7.0020.0002] # HENTAIGANA LETTER RO-5 +1B107 ; [.3FA8.0020.0002] # HENTAIGANA LETTER RO-6 +1B108 ; [.3FA9.0020.0002] # HENTAIGANA LETTER WA-1 +1B109 ; [.3FAA.0020.0002] # HENTAIGANA LETTER WA-2 +1B10A ; [.3FAB.0020.0002] # HENTAIGANA LETTER WA-3 +1B10B ; [.3FAC.0020.0002] # HENTAIGANA LETTER WA-4 +1B10C ; [.3FAD.0020.0002] # HENTAIGANA LETTER WA-5 +1B10D ; [.3FAE.0020.0002] # HENTAIGANA LETTER WI-1 +1B10E ; [.3FAF.0020.0002] # HENTAIGANA LETTER WI-2 +1B10F ; [.3FB0.0020.0002] # HENTAIGANA LETTER WI-3 +1B110 ; [.3FB1.0020.0002] # HENTAIGANA LETTER WI-4 +1B111 ; [.3FB2.0020.0002] # HENTAIGANA LETTER WI-5 +1B112 ; [.3FB3.0020.0002] # HENTAIGANA LETTER WE-1 +1B113 ; [.3FB4.0020.0002] # HENTAIGANA LETTER WE-2 +1B114 ; [.3FB5.0020.0002] # HENTAIGANA LETTER WE-3 +1B115 ; [.3FB6.0020.0002] # HENTAIGANA LETTER WE-4 +1B116 ; [.3FB7.0020.0002] # HENTAIGANA LETTER WO-1 +1B117 ; [.3FB8.0020.0002] # HENTAIGANA LETTER WO-2 +1B118 ; [.3FB9.0020.0002] # HENTAIGANA LETTER WO-3 +1B119 ; [.3FBA.0020.0002] # HENTAIGANA LETTER WO-4 +1B11A ; [.3FBB.0020.0002] # HENTAIGANA LETTER WO-5 +1B11B ; [.3FBC.0020.0002] # HENTAIGANA LETTER WO-6 +1B11C ; [.3FBD.0020.0002] # HENTAIGANA LETTER WO-7 +1B11D ; [.3FBE.0020.0002] # HENTAIGANA LETTER N-MU-MO-1 +1B11E ; [.3FBF.0020.0002] # HENTAIGANA LETTER N-MU-MO-2 +3105 ; [.3FC0.0020.0002] # BOPOMOFO LETTER B +31A0 ; [.3FC0.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER BU +3106 ; [.3FC1.0020.0002] # BOPOMOFO LETTER P +31B4 ; [.3FC1.0020.0019] # BOPOMOFO FINAL LETTER P +3107 ; [.3FC2.0020.0002] # BOPOMOFO LETTER M +3108 ; [.3FC3.0020.0002] # BOPOMOFO LETTER F +312A ; [.3FC4.0020.0002] # BOPOMOFO LETTER V +3109 ; [.3FC5.0020.0002] # BOPOMOFO LETTER D +310A ; [.3FC6.0020.0002] # BOPOMOFO LETTER T +31B5 ; [.3FC6.0020.0019] # BOPOMOFO FINAL LETTER T +310B ; [.3FC7.0020.0002] # BOPOMOFO LETTER N +310C ; [.3FC8.0020.0002] # BOPOMOFO LETTER L +310D ; [.3FC9.0020.0002] # BOPOMOFO LETTER G +31A3 ; [.3FC9.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER GU +310E ; [.3FCA.0020.0002] # BOPOMOFO LETTER K +31B6 ; [.3FCA.0020.0019] # BOPOMOFO FINAL LETTER K +312B ; [.3FCB.0020.0002] # BOPOMOFO LETTER NG +31AD ; [.3FCC.0020.0002] # BOPOMOFO LETTER NGG +310F ; [.3FCD.0020.0002] # BOPOMOFO LETTER H +31B7 ; [.3FCD.0020.0019] # BOPOMOFO FINAL LETTER H +3110 ; [.3FCE.0020.0002] # BOPOMOFO LETTER J +31A2 ; [.3FCE.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER JI +3111 ; [.3FCF.0020.0002] # BOPOMOFO LETTER Q +3112 ; [.3FD0.0020.0002] # BOPOMOFO LETTER X +312C ; [.3FD1.0020.0002] # BOPOMOFO LETTER GN +3113 ; [.3FD2.0020.0002] # BOPOMOFO LETTER ZH +3114 ; [.3FD3.0020.0002] # BOPOMOFO LETTER CH +3115 ; [.3FD4.0020.0002] # BOPOMOFO LETTER SH +3116 ; [.3FD5.0020.0002] # BOPOMOFO LETTER R +3117 ; [.3FD6.0020.0002] # BOPOMOFO LETTER Z +31A1 ; [.3FD6.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER ZI +3118 ; [.3FD7.0020.0002] # BOPOMOFO LETTER C +3119 ; [.3FD8.0020.0002] # BOPOMOFO LETTER S +31B8 ; [.3FD9.0020.0002] # BOPOMOFO LETTER GH +31B9 ; [.3FDA.0020.0002] # BOPOMOFO LETTER LH +31BA ; [.3FDB.0020.0002] # BOPOMOFO LETTER ZY +311A ; [.3FDC.0020.0002] # BOPOMOFO LETTER A +31A9 ; [.3FDC.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER ANN +311B ; [.3FDD.0020.0002] # BOPOMOFO LETTER O +31A7 ; [.3FDD.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER ONN +31A6 ; [.3FDE.0020.0002] # BOPOMOFO LETTER OO +311C ; [.3FDF.0020.0002] # BOPOMOFO LETTER E +312E ; [.3FDF.0020.0004] # BOPOMOFO LETTER O WITH DOT ABOVE +311D ; [.3FE0.0020.0002] # BOPOMOFO LETTER EH +31A4 ; [.3FE1.0020.0002] # BOPOMOFO LETTER EE +31A5 ; [.3FE1.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER ENN +311E ; [.3FE2.0020.0002] # BOPOMOFO LETTER AI +31AE ; [.3FE2.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER AINN +311F ; [.3FE3.0020.0002] # BOPOMOFO LETTER EI +3120 ; [.3FE4.0020.0002] # BOPOMOFO LETTER AU +31AF ; [.3FE4.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER AUNN +3121 ; [.3FE5.0020.0002] # BOPOMOFO LETTER OU +3122 ; [.3FE6.0020.0002] # BOPOMOFO LETTER AN +3123 ; [.3FE7.0020.0002] # BOPOMOFO LETTER EN +3124 ; [.3FE8.0020.0002] # BOPOMOFO LETTER ANG +31B2 ; [.3FE9.0020.0002] # BOPOMOFO LETTER ONG +3125 ; [.3FEA.0020.0002] # BOPOMOFO LETTER ENG +31B0 ; [.3FEB.0020.0002] # BOPOMOFO LETTER AM +31B1 ; [.3FEC.0020.0002] # BOPOMOFO LETTER OM +31AC ; [.3FED.0020.0002] # BOPOMOFO LETTER IM +3126 ; [.3FEE.0020.0002] # BOPOMOFO LETTER ER +3127 ; [.3FEF.0020.0002] # BOPOMOFO LETTER I +31AA ; [.3FEF.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER INN +31B3 ; [.3FEF.0020.0016][.0000.0112.0016] # BOPOMOFO LETTER INNN +3128 ; [.3FF0.0020.0002] # BOPOMOFO LETTER U +31AB ; [.3FF0.0020.0004][.0000.0112.0004] # BOPOMOFO LETTER UNN +31A8 ; [.3FF0.0020.0004][.0000.0113.0004] # BOPOMOFO LETTER IR +3129 ; [.3FF1.0020.0002] # BOPOMOFO LETTER IU +312D ; [.3FF2.0020.0002] # BOPOMOFO LETTER IH +A000 ; [.3FF3.0020.0002] # YI SYLLABLE IT +A001 ; [.3FF4.0020.0002] # YI SYLLABLE IX +A002 ; [.3FF5.0020.0002] # YI SYLLABLE I +A003 ; [.3FF6.0020.0002] # YI SYLLABLE IP +A004 ; [.3FF7.0020.0002] # YI SYLLABLE IET +A005 ; [.3FF8.0020.0002] # YI SYLLABLE IEX +A006 ; [.3FF9.0020.0002] # YI SYLLABLE IE +A007 ; [.3FFA.0020.0002] # YI SYLLABLE IEP +A008 ; [.3FFB.0020.0002] # YI SYLLABLE AT +A009 ; [.3FFC.0020.0002] # YI SYLLABLE AX +A00A ; [.3FFD.0020.0002] # YI SYLLABLE A +A00B ; [.3FFE.0020.0002] # YI SYLLABLE AP +A00C ; [.3FFF.0020.0002] # YI SYLLABLE UOX +A00D ; [.4000.0020.0002] # YI SYLLABLE UO +A00E ; [.4001.0020.0002] # YI SYLLABLE UOP +A00F ; [.4002.0020.0002] # YI SYLLABLE OT +A010 ; [.4003.0020.0002] # YI SYLLABLE OX +A011 ; [.4004.0020.0002] # YI SYLLABLE O +A012 ; [.4005.0020.0002] # YI SYLLABLE OP +A013 ; [.4006.0020.0002] # YI SYLLABLE EX +A014 ; [.4007.0020.0002] # YI SYLLABLE E +A015 ; [.4008.0020.0002] # YI SYLLABLE WU +A016 ; [.4009.0020.0002] # YI SYLLABLE BIT +A017 ; [.400A.0020.0002] # YI SYLLABLE BIX +A018 ; [.400B.0020.0002] # YI SYLLABLE BI +A019 ; [.400C.0020.0002] # YI SYLLABLE BIP +A01A ; [.400D.0020.0002] # YI SYLLABLE BIET +A01B ; [.400E.0020.0002] # YI SYLLABLE BIEX +A01C ; [.400F.0020.0002] # YI SYLLABLE BIE +A01D ; [.4010.0020.0002] # YI SYLLABLE BIEP +A01E ; [.4011.0020.0002] # YI SYLLABLE BAT +A01F ; [.4012.0020.0002] # YI SYLLABLE BAX +A020 ; [.4013.0020.0002] # YI SYLLABLE BA +A021 ; [.4014.0020.0002] # YI SYLLABLE BAP +A022 ; [.4015.0020.0002] # YI SYLLABLE BUOX +A023 ; [.4016.0020.0002] # YI SYLLABLE BUO +A024 ; [.4017.0020.0002] # YI SYLLABLE BUOP +A025 ; [.4018.0020.0002] # YI SYLLABLE BOT +A026 ; [.4019.0020.0002] # YI SYLLABLE BOX +A027 ; [.401A.0020.0002] # YI SYLLABLE BO +A028 ; [.401B.0020.0002] # YI SYLLABLE BOP +A029 ; [.401C.0020.0002] # YI SYLLABLE BEX +A02A ; [.401D.0020.0002] # YI SYLLABLE BE +A02B ; [.401E.0020.0002] # YI SYLLABLE BEP +A02C ; [.401F.0020.0002] # YI SYLLABLE BUT +A02D ; [.4020.0020.0002] # YI SYLLABLE BUX +A02E ; [.4021.0020.0002] # YI SYLLABLE BU +A02F ; [.4022.0020.0002] # YI SYLLABLE BUP +A030 ; [.4023.0020.0002] # YI SYLLABLE BURX +A031 ; [.4024.0020.0002] # YI SYLLABLE BUR +A032 ; [.4025.0020.0002] # YI SYLLABLE BYT +A033 ; [.4026.0020.0002] # YI SYLLABLE BYX +A034 ; [.4027.0020.0002] # YI SYLLABLE BY +A035 ; [.4028.0020.0002] # YI SYLLABLE BYP +A036 ; [.4029.0020.0002] # YI SYLLABLE BYRX +A037 ; [.402A.0020.0002] # YI SYLLABLE BYR +A038 ; [.402B.0020.0002] # YI SYLLABLE PIT +A039 ; [.402C.0020.0002] # YI SYLLABLE PIX +A03A ; [.402D.0020.0002] # YI SYLLABLE PI +A03B ; [.402E.0020.0002] # YI SYLLABLE PIP +A03C ; [.402F.0020.0002] # YI SYLLABLE PIEX +A03D ; [.4030.0020.0002] # YI SYLLABLE PIE +A03E ; [.4031.0020.0002] # YI SYLLABLE PIEP +A03F ; [.4032.0020.0002] # YI SYLLABLE PAT +A040 ; [.4033.0020.0002] # YI SYLLABLE PAX +A041 ; [.4034.0020.0002] # YI SYLLABLE PA +A042 ; [.4035.0020.0002] # YI SYLLABLE PAP +A043 ; [.4036.0020.0002] # YI SYLLABLE PUOX +A044 ; [.4037.0020.0002] # YI SYLLABLE PUO +A045 ; [.4038.0020.0002] # YI SYLLABLE PUOP +A046 ; [.4039.0020.0002] # YI SYLLABLE POT +A047 ; [.403A.0020.0002] # YI SYLLABLE POX +A048 ; [.403B.0020.0002] # YI SYLLABLE PO +A049 ; [.403C.0020.0002] # YI SYLLABLE POP +A04A ; [.403D.0020.0002] # YI SYLLABLE PUT +A04B ; [.403E.0020.0002] # YI SYLLABLE PUX +A04C ; [.403F.0020.0002] # YI SYLLABLE PU +A04D ; [.4040.0020.0002] # YI SYLLABLE PUP +A04E ; [.4041.0020.0002] # YI SYLLABLE PURX +A04F ; [.4042.0020.0002] # YI SYLLABLE PUR +A050 ; [.4043.0020.0002] # YI SYLLABLE PYT +A051 ; [.4044.0020.0002] # YI SYLLABLE PYX +A052 ; [.4045.0020.0002] # YI SYLLABLE PY +A053 ; [.4046.0020.0002] # YI SYLLABLE PYP +A054 ; [.4047.0020.0002] # YI SYLLABLE PYRX +A055 ; [.4048.0020.0002] # YI SYLLABLE PYR +A056 ; [.4049.0020.0002] # YI SYLLABLE BBIT +A057 ; [.404A.0020.0002] # YI SYLLABLE BBIX +A058 ; [.404B.0020.0002] # YI SYLLABLE BBI +A059 ; [.404C.0020.0002] # YI SYLLABLE BBIP +A05A ; [.404D.0020.0002] # YI SYLLABLE BBIET +A05B ; [.404E.0020.0002] # YI SYLLABLE BBIEX +A05C ; [.404F.0020.0002] # YI SYLLABLE BBIE +A05D ; [.4050.0020.0002] # YI SYLLABLE BBIEP +A05E ; [.4051.0020.0002] # YI SYLLABLE BBAT +A05F ; [.4052.0020.0002] # YI SYLLABLE BBAX +A060 ; [.4053.0020.0002] # YI SYLLABLE BBA +A061 ; [.4054.0020.0002] # YI SYLLABLE BBAP +A062 ; [.4055.0020.0002] # YI SYLLABLE BBUOX +A063 ; [.4056.0020.0002] # YI SYLLABLE BBUO +A064 ; [.4057.0020.0002] # YI SYLLABLE BBUOP +A065 ; [.4058.0020.0002] # YI SYLLABLE BBOT +A066 ; [.4059.0020.0002] # YI SYLLABLE BBOX +A067 ; [.405A.0020.0002] # YI SYLLABLE BBO +A068 ; [.405B.0020.0002] # YI SYLLABLE BBOP +A069 ; [.405C.0020.0002] # YI SYLLABLE BBEX +A06A ; [.405D.0020.0002] # YI SYLLABLE BBE +A06B ; [.405E.0020.0002] # YI SYLLABLE BBEP +A06C ; [.405F.0020.0002] # YI SYLLABLE BBUT +A06D ; [.4060.0020.0002] # YI SYLLABLE BBUX +A06E ; [.4061.0020.0002] # YI SYLLABLE BBU +A06F ; [.4062.0020.0002] # YI SYLLABLE BBUP +A070 ; [.4063.0020.0002] # YI SYLLABLE BBURX +A071 ; [.4064.0020.0002] # YI SYLLABLE BBUR +A072 ; [.4065.0020.0002] # YI SYLLABLE BBYT +A073 ; [.4066.0020.0002] # YI SYLLABLE BBYX +A074 ; [.4067.0020.0002] # YI SYLLABLE BBY +A075 ; [.4068.0020.0002] # YI SYLLABLE BBYP +A076 ; [.4069.0020.0002] # YI SYLLABLE NBIT +A077 ; [.406A.0020.0002] # YI SYLLABLE NBIX +A078 ; [.406B.0020.0002] # YI SYLLABLE NBI +A079 ; [.406C.0020.0002] # YI SYLLABLE NBIP +A07A ; [.406D.0020.0002] # YI SYLLABLE NBIEX +A07B ; [.406E.0020.0002] # YI SYLLABLE NBIE +A07C ; [.406F.0020.0002] # YI SYLLABLE NBIEP +A07D ; [.4070.0020.0002] # YI SYLLABLE NBAT +A07E ; [.4071.0020.0002] # YI SYLLABLE NBAX +A07F ; [.4072.0020.0002] # YI SYLLABLE NBA +A080 ; [.4073.0020.0002] # YI SYLLABLE NBAP +A081 ; [.4074.0020.0002] # YI SYLLABLE NBOT +A082 ; [.4075.0020.0002] # YI SYLLABLE NBOX +A083 ; [.4076.0020.0002] # YI SYLLABLE NBO +A084 ; [.4077.0020.0002] # YI SYLLABLE NBOP +A085 ; [.4078.0020.0002] # YI SYLLABLE NBUT +A086 ; [.4079.0020.0002] # YI SYLLABLE NBUX +A087 ; [.407A.0020.0002] # YI SYLLABLE NBU +A088 ; [.407B.0020.0002] # YI SYLLABLE NBUP +A089 ; [.407C.0020.0002] # YI SYLLABLE NBURX +A08A ; [.407D.0020.0002] # YI SYLLABLE NBUR +A08B ; [.407E.0020.0002] # YI SYLLABLE NBYT +A08C ; [.407F.0020.0002] # YI SYLLABLE NBYX +A08D ; [.4080.0020.0002] # YI SYLLABLE NBY +A08E ; [.4081.0020.0002] # YI SYLLABLE NBYP +A08F ; [.4082.0020.0002] # YI SYLLABLE NBYRX +A090 ; [.4083.0020.0002] # YI SYLLABLE NBYR +A091 ; [.4084.0020.0002] # YI SYLLABLE HMIT +A092 ; [.4085.0020.0002] # YI SYLLABLE HMIX +A093 ; [.4086.0020.0002] # YI SYLLABLE HMI +A094 ; [.4087.0020.0002] # YI SYLLABLE HMIP +A095 ; [.4088.0020.0002] # YI SYLLABLE HMIEX +A096 ; [.4089.0020.0002] # YI SYLLABLE HMIE +A097 ; [.408A.0020.0002] # YI SYLLABLE HMIEP +A098 ; [.408B.0020.0002] # YI SYLLABLE HMAT +A099 ; [.408C.0020.0002] # YI SYLLABLE HMAX +A09A ; [.408D.0020.0002] # YI SYLLABLE HMA +A09B ; [.408E.0020.0002] # YI SYLLABLE HMAP +A09C ; [.408F.0020.0002] # YI SYLLABLE HMUOX +A09D ; [.4090.0020.0002] # YI SYLLABLE HMUO +A09E ; [.4091.0020.0002] # YI SYLLABLE HMUOP +A09F ; [.4092.0020.0002] # YI SYLLABLE HMOT +A0A0 ; [.4093.0020.0002] # YI SYLLABLE HMOX +A0A1 ; [.4094.0020.0002] # YI SYLLABLE HMO +A0A2 ; [.4095.0020.0002] # YI SYLLABLE HMOP +A0A3 ; [.4096.0020.0002] # YI SYLLABLE HMUT +A0A4 ; [.4097.0020.0002] # YI SYLLABLE HMUX +A0A5 ; [.4098.0020.0002] # YI SYLLABLE HMU +A0A6 ; [.4099.0020.0002] # YI SYLLABLE HMUP +A0A7 ; [.409A.0020.0002] # YI SYLLABLE HMURX +A0A8 ; [.409B.0020.0002] # YI SYLLABLE HMUR +A0A9 ; [.409C.0020.0002] # YI SYLLABLE HMYX +A0AA ; [.409D.0020.0002] # YI SYLLABLE HMY +A0AB ; [.409E.0020.0002] # YI SYLLABLE HMYP +A0AC ; [.409F.0020.0002] # YI SYLLABLE HMYRX +A0AD ; [.40A0.0020.0002] # YI SYLLABLE HMYR +A0AE ; [.40A1.0020.0002] # YI SYLLABLE MIT +A0AF ; [.40A2.0020.0002] # YI SYLLABLE MIX +A0B0 ; [.40A3.0020.0002] # YI SYLLABLE MI +A0B1 ; [.40A4.0020.0002] # YI SYLLABLE MIP +A0B2 ; [.40A5.0020.0002] # YI SYLLABLE MIEX +A0B3 ; [.40A6.0020.0002] # YI SYLLABLE MIE +A0B4 ; [.40A7.0020.0002] # YI SYLLABLE MIEP +A0B5 ; [.40A8.0020.0002] # YI SYLLABLE MAT +A0B6 ; [.40A9.0020.0002] # YI SYLLABLE MAX +A0B7 ; [.40AA.0020.0002] # YI SYLLABLE MA +A0B8 ; [.40AB.0020.0002] # YI SYLLABLE MAP +A0B9 ; [.40AC.0020.0002] # YI SYLLABLE MUOT +A0BA ; [.40AD.0020.0002] # YI SYLLABLE MUOX +A0BB ; [.40AE.0020.0002] # YI SYLLABLE MUO +A0BC ; [.40AF.0020.0002] # YI SYLLABLE MUOP +A0BD ; [.40B0.0020.0002] # YI SYLLABLE MOT +A0BE ; [.40B1.0020.0002] # YI SYLLABLE MOX +A0BF ; [.40B2.0020.0002] # YI SYLLABLE MO +A0C0 ; [.40B3.0020.0002] # YI SYLLABLE MOP +A0C1 ; [.40B4.0020.0002] # YI SYLLABLE MEX +A0C2 ; [.40B5.0020.0002] # YI SYLLABLE ME +A0C3 ; [.40B6.0020.0002] # YI SYLLABLE MUT +A0C4 ; [.40B7.0020.0002] # YI SYLLABLE MUX +A0C5 ; [.40B8.0020.0002] # YI SYLLABLE MU +A0C6 ; [.40B9.0020.0002] # YI SYLLABLE MUP +A0C7 ; [.40BA.0020.0002] # YI SYLLABLE MURX +A0C8 ; [.40BB.0020.0002] # YI SYLLABLE MUR +A0C9 ; [.40BC.0020.0002] # YI SYLLABLE MYT +A0CA ; [.40BD.0020.0002] # YI SYLLABLE MYX +A0CB ; [.40BE.0020.0002] # YI SYLLABLE MY +A0CC ; [.40BF.0020.0002] # YI SYLLABLE MYP +A0CD ; [.40C0.0020.0002] # YI SYLLABLE FIT +A0CE ; [.40C1.0020.0002] # YI SYLLABLE FIX +A0CF ; [.40C2.0020.0002] # YI SYLLABLE FI +A0D0 ; [.40C3.0020.0002] # YI SYLLABLE FIP +A0D1 ; [.40C4.0020.0002] # YI SYLLABLE FAT +A0D2 ; [.40C5.0020.0002] # YI SYLLABLE FAX +A0D3 ; [.40C6.0020.0002] # YI SYLLABLE FA +A0D4 ; [.40C7.0020.0002] # YI SYLLABLE FAP +A0D5 ; [.40C8.0020.0002] # YI SYLLABLE FOX +A0D6 ; [.40C9.0020.0002] # YI SYLLABLE FO +A0D7 ; [.40CA.0020.0002] # YI SYLLABLE FOP +A0D8 ; [.40CB.0020.0002] # YI SYLLABLE FUT +A0D9 ; [.40CC.0020.0002] # YI SYLLABLE FUX +A0DA ; [.40CD.0020.0002] # YI SYLLABLE FU +A0DB ; [.40CE.0020.0002] # YI SYLLABLE FUP +A0DC ; [.40CF.0020.0002] # YI SYLLABLE FURX +A0DD ; [.40D0.0020.0002] # YI SYLLABLE FUR +A0DE ; [.40D1.0020.0002] # YI SYLLABLE FYT +A0DF ; [.40D2.0020.0002] # YI SYLLABLE FYX +A0E0 ; [.40D3.0020.0002] # YI SYLLABLE FY +A0E1 ; [.40D4.0020.0002] # YI SYLLABLE FYP +A0E2 ; [.40D5.0020.0002] # YI SYLLABLE VIT +A0E3 ; [.40D6.0020.0002] # YI SYLLABLE VIX +A0E4 ; [.40D7.0020.0002] # YI SYLLABLE VI +A0E5 ; [.40D8.0020.0002] # YI SYLLABLE VIP +A0E6 ; [.40D9.0020.0002] # YI SYLLABLE VIET +A0E7 ; [.40DA.0020.0002] # YI SYLLABLE VIEX +A0E8 ; [.40DB.0020.0002] # YI SYLLABLE VIE +A0E9 ; [.40DC.0020.0002] # YI SYLLABLE VIEP +A0EA ; [.40DD.0020.0002] # YI SYLLABLE VAT +A0EB ; [.40DE.0020.0002] # YI SYLLABLE VAX +A0EC ; [.40DF.0020.0002] # YI SYLLABLE VA +A0ED ; [.40E0.0020.0002] # YI SYLLABLE VAP +A0EE ; [.40E1.0020.0002] # YI SYLLABLE VOT +A0EF ; [.40E2.0020.0002] # YI SYLLABLE VOX +A0F0 ; [.40E3.0020.0002] # YI SYLLABLE VO +A0F1 ; [.40E4.0020.0002] # YI SYLLABLE VOP +A0F2 ; [.40E5.0020.0002] # YI SYLLABLE VEX +A0F3 ; [.40E6.0020.0002] # YI SYLLABLE VEP +A0F4 ; [.40E7.0020.0002] # YI SYLLABLE VUT +A0F5 ; [.40E8.0020.0002] # YI SYLLABLE VUX +A0F6 ; [.40E9.0020.0002] # YI SYLLABLE VU +A0F7 ; [.40EA.0020.0002] # YI SYLLABLE VUP +A0F8 ; [.40EB.0020.0002] # YI SYLLABLE VURX +A0F9 ; [.40EC.0020.0002] # YI SYLLABLE VUR +A0FA ; [.40ED.0020.0002] # YI SYLLABLE VYT +A0FB ; [.40EE.0020.0002] # YI SYLLABLE VYX +A0FC ; [.40EF.0020.0002] # YI SYLLABLE VY +A0FD ; [.40F0.0020.0002] # YI SYLLABLE VYP +A0FE ; [.40F1.0020.0002] # YI SYLLABLE VYRX +A0FF ; [.40F2.0020.0002] # YI SYLLABLE VYR +A100 ; [.40F3.0020.0002] # YI SYLLABLE DIT +A101 ; [.40F4.0020.0002] # YI SYLLABLE DIX +A102 ; [.40F5.0020.0002] # YI SYLLABLE DI +A103 ; [.40F6.0020.0002] # YI SYLLABLE DIP +A104 ; [.40F7.0020.0002] # YI SYLLABLE DIEX +A105 ; [.40F8.0020.0002] # YI SYLLABLE DIE +A106 ; [.40F9.0020.0002] # YI SYLLABLE DIEP +A107 ; [.40FA.0020.0002] # YI SYLLABLE DAT +A108 ; [.40FB.0020.0002] # YI SYLLABLE DAX +A109 ; [.40FC.0020.0002] # YI SYLLABLE DA +A10A ; [.40FD.0020.0002] # YI SYLLABLE DAP +A10B ; [.40FE.0020.0002] # YI SYLLABLE DUOX +A10C ; [.40FF.0020.0002] # YI SYLLABLE DUO +A10D ; [.4100.0020.0002] # YI SYLLABLE DOT +A10E ; [.4101.0020.0002] # YI SYLLABLE DOX +A10F ; [.4102.0020.0002] # YI SYLLABLE DO +A110 ; [.4103.0020.0002] # YI SYLLABLE DOP +A111 ; [.4104.0020.0002] # YI SYLLABLE DEX +A112 ; [.4105.0020.0002] # YI SYLLABLE DE +A113 ; [.4106.0020.0002] # YI SYLLABLE DEP +A114 ; [.4107.0020.0002] # YI SYLLABLE DUT +A115 ; [.4108.0020.0002] # YI SYLLABLE DUX +A116 ; [.4109.0020.0002] # YI SYLLABLE DU +A117 ; [.410A.0020.0002] # YI SYLLABLE DUP +A118 ; [.410B.0020.0002] # YI SYLLABLE DURX +A119 ; [.410C.0020.0002] # YI SYLLABLE DUR +A11A ; [.410D.0020.0002] # YI SYLLABLE TIT +A11B ; [.410E.0020.0002] # YI SYLLABLE TIX +A11C ; [.410F.0020.0002] # YI SYLLABLE TI +A11D ; [.4110.0020.0002] # YI SYLLABLE TIP +A11E ; [.4111.0020.0002] # YI SYLLABLE TIEX +A11F ; [.4112.0020.0002] # YI SYLLABLE TIE +A120 ; [.4113.0020.0002] # YI SYLLABLE TIEP +A121 ; [.4114.0020.0002] # YI SYLLABLE TAT +A122 ; [.4115.0020.0002] # YI SYLLABLE TAX +A123 ; [.4116.0020.0002] # YI SYLLABLE TA +A124 ; [.4117.0020.0002] # YI SYLLABLE TAP +A125 ; [.4118.0020.0002] # YI SYLLABLE TUOT +A126 ; [.4119.0020.0002] # YI SYLLABLE TUOX +A127 ; [.411A.0020.0002] # YI SYLLABLE TUO +A128 ; [.411B.0020.0002] # YI SYLLABLE TUOP +A129 ; [.411C.0020.0002] # YI SYLLABLE TOT +A12A ; [.411D.0020.0002] # YI SYLLABLE TOX +A12B ; [.411E.0020.0002] # YI SYLLABLE TO +A12C ; [.411F.0020.0002] # YI SYLLABLE TOP +A12D ; [.4120.0020.0002] # YI SYLLABLE TEX +A12E ; [.4121.0020.0002] # YI SYLLABLE TE +A12F ; [.4122.0020.0002] # YI SYLLABLE TEP +A130 ; [.4123.0020.0002] # YI SYLLABLE TUT +A131 ; [.4124.0020.0002] # YI SYLLABLE TUX +A132 ; [.4125.0020.0002] # YI SYLLABLE TU +A133 ; [.4126.0020.0002] # YI SYLLABLE TUP +A134 ; [.4127.0020.0002] # YI SYLLABLE TURX +A135 ; [.4128.0020.0002] # YI SYLLABLE TUR +A136 ; [.4129.0020.0002] # YI SYLLABLE DDIT +A137 ; [.412A.0020.0002] # YI SYLLABLE DDIX +A138 ; [.412B.0020.0002] # YI SYLLABLE DDI +A139 ; [.412C.0020.0002] # YI SYLLABLE DDIP +A13A ; [.412D.0020.0002] # YI SYLLABLE DDIEX +A13B ; [.412E.0020.0002] # YI SYLLABLE DDIE +A13C ; [.412F.0020.0002] # YI SYLLABLE DDIEP +A13D ; [.4130.0020.0002] # YI SYLLABLE DDAT +A13E ; [.4131.0020.0002] # YI SYLLABLE DDAX +A13F ; [.4132.0020.0002] # YI SYLLABLE DDA +A140 ; [.4133.0020.0002] # YI SYLLABLE DDAP +A141 ; [.4134.0020.0002] # YI SYLLABLE DDUOX +A142 ; [.4135.0020.0002] # YI SYLLABLE DDUO +A143 ; [.4136.0020.0002] # YI SYLLABLE DDUOP +A144 ; [.4137.0020.0002] # YI SYLLABLE DDOT +A145 ; [.4138.0020.0002] # YI SYLLABLE DDOX +A146 ; [.4139.0020.0002] # YI SYLLABLE DDO +A147 ; [.413A.0020.0002] # YI SYLLABLE DDOP +A148 ; [.413B.0020.0002] # YI SYLLABLE DDEX +A149 ; [.413C.0020.0002] # YI SYLLABLE DDE +A14A ; [.413D.0020.0002] # YI SYLLABLE DDEP +A14B ; [.413E.0020.0002] # YI SYLLABLE DDUT +A14C ; [.413F.0020.0002] # YI SYLLABLE DDUX +A14D ; [.4140.0020.0002] # YI SYLLABLE DDU +A14E ; [.4141.0020.0002] # YI SYLLABLE DDUP +A14F ; [.4142.0020.0002] # YI SYLLABLE DDURX +A150 ; [.4143.0020.0002] # YI SYLLABLE DDUR +A151 ; [.4144.0020.0002] # YI SYLLABLE NDIT +A152 ; [.4145.0020.0002] # YI SYLLABLE NDIX +A153 ; [.4146.0020.0002] # YI SYLLABLE NDI +A154 ; [.4147.0020.0002] # YI SYLLABLE NDIP +A155 ; [.4148.0020.0002] # YI SYLLABLE NDIEX +A156 ; [.4149.0020.0002] # YI SYLLABLE NDIE +A157 ; [.414A.0020.0002] # YI SYLLABLE NDAT +A158 ; [.414B.0020.0002] # YI SYLLABLE NDAX +A159 ; [.414C.0020.0002] # YI SYLLABLE NDA +A15A ; [.414D.0020.0002] # YI SYLLABLE NDAP +A15B ; [.414E.0020.0002] # YI SYLLABLE NDOT +A15C ; [.414F.0020.0002] # YI SYLLABLE NDOX +A15D ; [.4150.0020.0002] # YI SYLLABLE NDO +A15E ; [.4151.0020.0002] # YI SYLLABLE NDOP +A15F ; [.4152.0020.0002] # YI SYLLABLE NDEX +A160 ; [.4153.0020.0002] # YI SYLLABLE NDE +A161 ; [.4154.0020.0002] # YI SYLLABLE NDEP +A162 ; [.4155.0020.0002] # YI SYLLABLE NDUT +A163 ; [.4156.0020.0002] # YI SYLLABLE NDUX +A164 ; [.4157.0020.0002] # YI SYLLABLE NDU +A165 ; [.4158.0020.0002] # YI SYLLABLE NDUP +A166 ; [.4159.0020.0002] # YI SYLLABLE NDURX +A167 ; [.415A.0020.0002] # YI SYLLABLE NDUR +A168 ; [.415B.0020.0002] # YI SYLLABLE HNIT +A169 ; [.415C.0020.0002] # YI SYLLABLE HNIX +A16A ; [.415D.0020.0002] # YI SYLLABLE HNI +A16B ; [.415E.0020.0002] # YI SYLLABLE HNIP +A16C ; [.415F.0020.0002] # YI SYLLABLE HNIET +A16D ; [.4160.0020.0002] # YI SYLLABLE HNIEX +A16E ; [.4161.0020.0002] # YI SYLLABLE HNIE +A16F ; [.4162.0020.0002] # YI SYLLABLE HNIEP +A170 ; [.4163.0020.0002] # YI SYLLABLE HNAT +A171 ; [.4164.0020.0002] # YI SYLLABLE HNAX +A172 ; [.4165.0020.0002] # YI SYLLABLE HNA +A173 ; [.4166.0020.0002] # YI SYLLABLE HNAP +A174 ; [.4167.0020.0002] # YI SYLLABLE HNUOX +A175 ; [.4168.0020.0002] # YI SYLLABLE HNUO +A176 ; [.4169.0020.0002] # YI SYLLABLE HNOT +A177 ; [.416A.0020.0002] # YI SYLLABLE HNOX +A178 ; [.416B.0020.0002] # YI SYLLABLE HNOP +A179 ; [.416C.0020.0002] # YI SYLLABLE HNEX +A17A ; [.416D.0020.0002] # YI SYLLABLE HNE +A17B ; [.416E.0020.0002] # YI SYLLABLE HNEP +A17C ; [.416F.0020.0002] # YI SYLLABLE HNUT +A17D ; [.4170.0020.0002] # YI SYLLABLE NIT +A17E ; [.4171.0020.0002] # YI SYLLABLE NIX +A17F ; [.4172.0020.0002] # YI SYLLABLE NI +A180 ; [.4173.0020.0002] # YI SYLLABLE NIP +A181 ; [.4174.0020.0002] # YI SYLLABLE NIEX +A182 ; [.4175.0020.0002] # YI SYLLABLE NIE +A183 ; [.4176.0020.0002] # YI SYLLABLE NIEP +A184 ; [.4177.0020.0002] # YI SYLLABLE NAX +A185 ; [.4178.0020.0002] # YI SYLLABLE NA +A186 ; [.4179.0020.0002] # YI SYLLABLE NAP +A187 ; [.417A.0020.0002] # YI SYLLABLE NUOX +A188 ; [.417B.0020.0002] # YI SYLLABLE NUO +A189 ; [.417C.0020.0002] # YI SYLLABLE NUOP +A18A ; [.417D.0020.0002] # YI SYLLABLE NOT +A18B ; [.417E.0020.0002] # YI SYLLABLE NOX +A18C ; [.417F.0020.0002] # YI SYLLABLE NO +A18D ; [.4180.0020.0002] # YI SYLLABLE NOP +A18E ; [.4181.0020.0002] # YI SYLLABLE NEX +A18F ; [.4182.0020.0002] # YI SYLLABLE NE +A190 ; [.4183.0020.0002] # YI SYLLABLE NEP +A191 ; [.4184.0020.0002] # YI SYLLABLE NUT +A192 ; [.4185.0020.0002] # YI SYLLABLE NUX +A193 ; [.4186.0020.0002] # YI SYLLABLE NU +A194 ; [.4187.0020.0002] # YI SYLLABLE NUP +A195 ; [.4188.0020.0002] # YI SYLLABLE NURX +A196 ; [.4189.0020.0002] # YI SYLLABLE NUR +A197 ; [.418A.0020.0002] # YI SYLLABLE HLIT +A198 ; [.418B.0020.0002] # YI SYLLABLE HLIX +A199 ; [.418C.0020.0002] # YI SYLLABLE HLI +A19A ; [.418D.0020.0002] # YI SYLLABLE HLIP +A19B ; [.418E.0020.0002] # YI SYLLABLE HLIEX +A19C ; [.418F.0020.0002] # YI SYLLABLE HLIE +A19D ; [.4190.0020.0002] # YI SYLLABLE HLIEP +A19E ; [.4191.0020.0002] # YI SYLLABLE HLAT +A19F ; [.4192.0020.0002] # YI SYLLABLE HLAX +A1A0 ; [.4193.0020.0002] # YI SYLLABLE HLA +A1A1 ; [.4194.0020.0002] # YI SYLLABLE HLAP +A1A2 ; [.4195.0020.0002] # YI SYLLABLE HLUOX +A1A3 ; [.4196.0020.0002] # YI SYLLABLE HLUO +A1A4 ; [.4197.0020.0002] # YI SYLLABLE HLUOP +A1A5 ; [.4198.0020.0002] # YI SYLLABLE HLOX +A1A6 ; [.4199.0020.0002] # YI SYLLABLE HLO +A1A7 ; [.419A.0020.0002] # YI SYLLABLE HLOP +A1A8 ; [.419B.0020.0002] # YI SYLLABLE HLEX +A1A9 ; [.419C.0020.0002] # YI SYLLABLE HLE +A1AA ; [.419D.0020.0002] # YI SYLLABLE HLEP +A1AB ; [.419E.0020.0002] # YI SYLLABLE HLUT +A1AC ; [.419F.0020.0002] # YI SYLLABLE HLUX +A1AD ; [.41A0.0020.0002] # YI SYLLABLE HLU +A1AE ; [.41A1.0020.0002] # YI SYLLABLE HLUP +A1AF ; [.41A2.0020.0002] # YI SYLLABLE HLURX +A1B0 ; [.41A3.0020.0002] # YI SYLLABLE HLUR +A1B1 ; [.41A4.0020.0002] # YI SYLLABLE HLYT +A1B2 ; [.41A5.0020.0002] # YI SYLLABLE HLYX +A1B3 ; [.41A6.0020.0002] # YI SYLLABLE HLY +A1B4 ; [.41A7.0020.0002] # YI SYLLABLE HLYP +A1B5 ; [.41A8.0020.0002] # YI SYLLABLE HLYRX +A1B6 ; [.41A9.0020.0002] # YI SYLLABLE HLYR +A1B7 ; [.41AA.0020.0002] # YI SYLLABLE LIT +A1B8 ; [.41AB.0020.0002] # YI SYLLABLE LIX +A1B9 ; [.41AC.0020.0002] # YI SYLLABLE LI +A1BA ; [.41AD.0020.0002] # YI SYLLABLE LIP +A1BB ; [.41AE.0020.0002] # YI SYLLABLE LIET +A1BC ; [.41AF.0020.0002] # YI SYLLABLE LIEX +A1BD ; [.41B0.0020.0002] # YI SYLLABLE LIE +A1BE ; [.41B1.0020.0002] # YI SYLLABLE LIEP +A1BF ; [.41B2.0020.0002] # YI SYLLABLE LAT +A1C0 ; [.41B3.0020.0002] # YI SYLLABLE LAX +A1C1 ; [.41B4.0020.0002] # YI SYLLABLE LA +A1C2 ; [.41B5.0020.0002] # YI SYLLABLE LAP +A1C3 ; [.41B6.0020.0002] # YI SYLLABLE LUOT +A1C4 ; [.41B7.0020.0002] # YI SYLLABLE LUOX +A1C5 ; [.41B8.0020.0002] # YI SYLLABLE LUO +A1C6 ; [.41B9.0020.0002] # YI SYLLABLE LUOP +A1C7 ; [.41BA.0020.0002] # YI SYLLABLE LOT +A1C8 ; [.41BB.0020.0002] # YI SYLLABLE LOX +A1C9 ; [.41BC.0020.0002] # YI SYLLABLE LO +A1CA ; [.41BD.0020.0002] # YI SYLLABLE LOP +A1CB ; [.41BE.0020.0002] # YI SYLLABLE LEX +A1CC ; [.41BF.0020.0002] # YI SYLLABLE LE +A1CD ; [.41C0.0020.0002] # YI SYLLABLE LEP +A1CE ; [.41C1.0020.0002] # YI SYLLABLE LUT +A1CF ; [.41C2.0020.0002] # YI SYLLABLE LUX +A1D0 ; [.41C3.0020.0002] # YI SYLLABLE LU +A1D1 ; [.41C4.0020.0002] # YI SYLLABLE LUP +A1D2 ; [.41C5.0020.0002] # YI SYLLABLE LURX +A1D3 ; [.41C6.0020.0002] # YI SYLLABLE LUR +A1D4 ; [.41C7.0020.0002] # YI SYLLABLE LYT +A1D5 ; [.41C8.0020.0002] # YI SYLLABLE LYX +A1D6 ; [.41C9.0020.0002] # YI SYLLABLE LY +A1D7 ; [.41CA.0020.0002] # YI SYLLABLE LYP +A1D8 ; [.41CB.0020.0002] # YI SYLLABLE LYRX +A1D9 ; [.41CC.0020.0002] # YI SYLLABLE LYR +A1DA ; [.41CD.0020.0002] # YI SYLLABLE GIT +A1DB ; [.41CE.0020.0002] # YI SYLLABLE GIX +A1DC ; [.41CF.0020.0002] # YI SYLLABLE GI +A1DD ; [.41D0.0020.0002] # YI SYLLABLE GIP +A1DE ; [.41D1.0020.0002] # YI SYLLABLE GIET +A1DF ; [.41D2.0020.0002] # YI SYLLABLE GIEX +A1E0 ; [.41D3.0020.0002] # YI SYLLABLE GIE +A1E1 ; [.41D4.0020.0002] # YI SYLLABLE GIEP +A1E2 ; [.41D5.0020.0002] # YI SYLLABLE GAT +A1E3 ; [.41D6.0020.0002] # YI SYLLABLE GAX +A1E4 ; [.41D7.0020.0002] # YI SYLLABLE GA +A1E5 ; [.41D8.0020.0002] # YI SYLLABLE GAP +A1E6 ; [.41D9.0020.0002] # YI SYLLABLE GUOT +A1E7 ; [.41DA.0020.0002] # YI SYLLABLE GUOX +A1E8 ; [.41DB.0020.0002] # YI SYLLABLE GUO +A1E9 ; [.41DC.0020.0002] # YI SYLLABLE GUOP +A1EA ; [.41DD.0020.0002] # YI SYLLABLE GOT +A1EB ; [.41DE.0020.0002] # YI SYLLABLE GOX +A1EC ; [.41DF.0020.0002] # YI SYLLABLE GO +A1ED ; [.41E0.0020.0002] # YI SYLLABLE GOP +A1EE ; [.41E1.0020.0002] # YI SYLLABLE GET +A1EF ; [.41E2.0020.0002] # YI SYLLABLE GEX +A1F0 ; [.41E3.0020.0002] # YI SYLLABLE GE +A1F1 ; [.41E4.0020.0002] # YI SYLLABLE GEP +A1F2 ; [.41E5.0020.0002] # YI SYLLABLE GUT +A1F3 ; [.41E6.0020.0002] # YI SYLLABLE GUX +A1F4 ; [.41E7.0020.0002] # YI SYLLABLE GU +A1F5 ; [.41E8.0020.0002] # YI SYLLABLE GUP +A1F6 ; [.41E9.0020.0002] # YI SYLLABLE GURX +A1F7 ; [.41EA.0020.0002] # YI SYLLABLE GUR +A1F8 ; [.41EB.0020.0002] # YI SYLLABLE KIT +A1F9 ; [.41EC.0020.0002] # YI SYLLABLE KIX +A1FA ; [.41ED.0020.0002] # YI SYLLABLE KI +A1FB ; [.41EE.0020.0002] # YI SYLLABLE KIP +A1FC ; [.41EF.0020.0002] # YI SYLLABLE KIEX +A1FD ; [.41F0.0020.0002] # YI SYLLABLE KIE +A1FE ; [.41F1.0020.0002] # YI SYLLABLE KIEP +A1FF ; [.41F2.0020.0002] # YI SYLLABLE KAT +A200 ; [.41F3.0020.0002] # YI SYLLABLE KAX +A201 ; [.41F4.0020.0002] # YI SYLLABLE KA +A202 ; [.41F5.0020.0002] # YI SYLLABLE KAP +A203 ; [.41F6.0020.0002] # YI SYLLABLE KUOX +A204 ; [.41F7.0020.0002] # YI SYLLABLE KUO +A205 ; [.41F8.0020.0002] # YI SYLLABLE KUOP +A206 ; [.41F9.0020.0002] # YI SYLLABLE KOT +A207 ; [.41FA.0020.0002] # YI SYLLABLE KOX +A208 ; [.41FB.0020.0002] # YI SYLLABLE KO +A209 ; [.41FC.0020.0002] # YI SYLLABLE KOP +A20A ; [.41FD.0020.0002] # YI SYLLABLE KET +A20B ; [.41FE.0020.0002] # YI SYLLABLE KEX +A20C ; [.41FF.0020.0002] # YI SYLLABLE KE +A20D ; [.4200.0020.0002] # YI SYLLABLE KEP +A20E ; [.4201.0020.0002] # YI SYLLABLE KUT +A20F ; [.4202.0020.0002] # YI SYLLABLE KUX +A210 ; [.4203.0020.0002] # YI SYLLABLE KU +A211 ; [.4204.0020.0002] # YI SYLLABLE KUP +A212 ; [.4205.0020.0002] # YI SYLLABLE KURX +A213 ; [.4206.0020.0002] # YI SYLLABLE KUR +A214 ; [.4207.0020.0002] # YI SYLLABLE GGIT +A215 ; [.4208.0020.0002] # YI SYLLABLE GGIX +A216 ; [.4209.0020.0002] # YI SYLLABLE GGI +A217 ; [.420A.0020.0002] # YI SYLLABLE GGIEX +A218 ; [.420B.0020.0002] # YI SYLLABLE GGIE +A219 ; [.420C.0020.0002] # YI SYLLABLE GGIEP +A21A ; [.420D.0020.0002] # YI SYLLABLE GGAT +A21B ; [.420E.0020.0002] # YI SYLLABLE GGAX +A21C ; [.420F.0020.0002] # YI SYLLABLE GGA +A21D ; [.4210.0020.0002] # YI SYLLABLE GGAP +A21E ; [.4211.0020.0002] # YI SYLLABLE GGUOT +A21F ; [.4212.0020.0002] # YI SYLLABLE GGUOX +A220 ; [.4213.0020.0002] # YI SYLLABLE GGUO +A221 ; [.4214.0020.0002] # YI SYLLABLE GGUOP +A222 ; [.4215.0020.0002] # YI SYLLABLE GGOT +A223 ; [.4216.0020.0002] # YI SYLLABLE GGOX +A224 ; [.4217.0020.0002] # YI SYLLABLE GGO +A225 ; [.4218.0020.0002] # YI SYLLABLE GGOP +A226 ; [.4219.0020.0002] # YI SYLLABLE GGET +A227 ; [.421A.0020.0002] # YI SYLLABLE GGEX +A228 ; [.421B.0020.0002] # YI SYLLABLE GGE +A229 ; [.421C.0020.0002] # YI SYLLABLE GGEP +A22A ; [.421D.0020.0002] # YI SYLLABLE GGUT +A22B ; [.421E.0020.0002] # YI SYLLABLE GGUX +A22C ; [.421F.0020.0002] # YI SYLLABLE GGU +A22D ; [.4220.0020.0002] # YI SYLLABLE GGUP +A22E ; [.4221.0020.0002] # YI SYLLABLE GGURX +A22F ; [.4222.0020.0002] # YI SYLLABLE GGUR +A230 ; [.4223.0020.0002] # YI SYLLABLE MGIEX +A231 ; [.4224.0020.0002] # YI SYLLABLE MGIE +A232 ; [.4225.0020.0002] # YI SYLLABLE MGAT +A233 ; [.4226.0020.0002] # YI SYLLABLE MGAX +A234 ; [.4227.0020.0002] # YI SYLLABLE MGA +A235 ; [.4228.0020.0002] # YI SYLLABLE MGAP +A236 ; [.4229.0020.0002] # YI SYLLABLE MGUOX +A237 ; [.422A.0020.0002] # YI SYLLABLE MGUO +A238 ; [.422B.0020.0002] # YI SYLLABLE MGUOP +A239 ; [.422C.0020.0002] # YI SYLLABLE MGOT +A23A ; [.422D.0020.0002] # YI SYLLABLE MGOX +A23B ; [.422E.0020.0002] # YI SYLLABLE MGO +A23C ; [.422F.0020.0002] # YI SYLLABLE MGOP +A23D ; [.4230.0020.0002] # YI SYLLABLE MGEX +A23E ; [.4231.0020.0002] # YI SYLLABLE MGE +A23F ; [.4232.0020.0002] # YI SYLLABLE MGEP +A240 ; [.4233.0020.0002] # YI SYLLABLE MGUT +A241 ; [.4234.0020.0002] # YI SYLLABLE MGUX +A242 ; [.4235.0020.0002] # YI SYLLABLE MGU +A243 ; [.4236.0020.0002] # YI SYLLABLE MGUP +A244 ; [.4237.0020.0002] # YI SYLLABLE MGURX +A245 ; [.4238.0020.0002] # YI SYLLABLE MGUR +A246 ; [.4239.0020.0002] # YI SYLLABLE HXIT +A247 ; [.423A.0020.0002] # YI SYLLABLE HXIX +A248 ; [.423B.0020.0002] # YI SYLLABLE HXI +A249 ; [.423C.0020.0002] # YI SYLLABLE HXIP +A24A ; [.423D.0020.0002] # YI SYLLABLE HXIET +A24B ; [.423E.0020.0002] # YI SYLLABLE HXIEX +A24C ; [.423F.0020.0002] # YI SYLLABLE HXIE +A24D ; [.4240.0020.0002] # YI SYLLABLE HXIEP +A24E ; [.4241.0020.0002] # YI SYLLABLE HXAT +A24F ; [.4242.0020.0002] # YI SYLLABLE HXAX +A250 ; [.4243.0020.0002] # YI SYLLABLE HXA +A251 ; [.4244.0020.0002] # YI SYLLABLE HXAP +A252 ; [.4245.0020.0002] # YI SYLLABLE HXUOT +A253 ; [.4246.0020.0002] # YI SYLLABLE HXUOX +A254 ; [.4247.0020.0002] # YI SYLLABLE HXUO +A255 ; [.4248.0020.0002] # YI SYLLABLE HXUOP +A256 ; [.4249.0020.0002] # YI SYLLABLE HXOT +A257 ; [.424A.0020.0002] # YI SYLLABLE HXOX +A258 ; [.424B.0020.0002] # YI SYLLABLE HXO +A259 ; [.424C.0020.0002] # YI SYLLABLE HXOP +A25A ; [.424D.0020.0002] # YI SYLLABLE HXEX +A25B ; [.424E.0020.0002] # YI SYLLABLE HXE +A25C ; [.424F.0020.0002] # YI SYLLABLE HXEP +A25D ; [.4250.0020.0002] # YI SYLLABLE NGIEX +A25E ; [.4251.0020.0002] # YI SYLLABLE NGIE +A25F ; [.4252.0020.0002] # YI SYLLABLE NGIEP +A260 ; [.4253.0020.0002] # YI SYLLABLE NGAT +A261 ; [.4254.0020.0002] # YI SYLLABLE NGAX +A262 ; [.4255.0020.0002] # YI SYLLABLE NGA +A263 ; [.4256.0020.0002] # YI SYLLABLE NGAP +A264 ; [.4257.0020.0002] # YI SYLLABLE NGUOT +A265 ; [.4258.0020.0002] # YI SYLLABLE NGUOX +A266 ; [.4259.0020.0002] # YI SYLLABLE NGUO +A267 ; [.425A.0020.0002] # YI SYLLABLE NGOT +A268 ; [.425B.0020.0002] # YI SYLLABLE NGOX +A269 ; [.425C.0020.0002] # YI SYLLABLE NGO +A26A ; [.425D.0020.0002] # YI SYLLABLE NGOP +A26B ; [.425E.0020.0002] # YI SYLLABLE NGEX +A26C ; [.425F.0020.0002] # YI SYLLABLE NGE +A26D ; [.4260.0020.0002] # YI SYLLABLE NGEP +A26E ; [.4261.0020.0002] # YI SYLLABLE HIT +A26F ; [.4262.0020.0002] # YI SYLLABLE HIEX +A270 ; [.4263.0020.0002] # YI SYLLABLE HIE +A271 ; [.4264.0020.0002] # YI SYLLABLE HAT +A272 ; [.4265.0020.0002] # YI SYLLABLE HAX +A273 ; [.4266.0020.0002] # YI SYLLABLE HA +A274 ; [.4267.0020.0002] # YI SYLLABLE HAP +A275 ; [.4268.0020.0002] # YI SYLLABLE HUOT +A276 ; [.4269.0020.0002] # YI SYLLABLE HUOX +A277 ; [.426A.0020.0002] # YI SYLLABLE HUO +A278 ; [.426B.0020.0002] # YI SYLLABLE HUOP +A279 ; [.426C.0020.0002] # YI SYLLABLE HOT +A27A ; [.426D.0020.0002] # YI SYLLABLE HOX +A27B ; [.426E.0020.0002] # YI SYLLABLE HO +A27C ; [.426F.0020.0002] # YI SYLLABLE HOP +A27D ; [.4270.0020.0002] # YI SYLLABLE HEX +A27E ; [.4271.0020.0002] # YI SYLLABLE HE +A27F ; [.4272.0020.0002] # YI SYLLABLE HEP +A280 ; [.4273.0020.0002] # YI SYLLABLE WAT +A281 ; [.4274.0020.0002] # YI SYLLABLE WAX +A282 ; [.4275.0020.0002] # YI SYLLABLE WA +A283 ; [.4276.0020.0002] # YI SYLLABLE WAP +A284 ; [.4277.0020.0002] # YI SYLLABLE WUOX +A285 ; [.4278.0020.0002] # YI SYLLABLE WUO +A286 ; [.4279.0020.0002] # YI SYLLABLE WUOP +A287 ; [.427A.0020.0002] # YI SYLLABLE WOX +A288 ; [.427B.0020.0002] # YI SYLLABLE WO +A289 ; [.427C.0020.0002] # YI SYLLABLE WOP +A28A ; [.427D.0020.0002] # YI SYLLABLE WEX +A28B ; [.427E.0020.0002] # YI SYLLABLE WE +A28C ; [.427F.0020.0002] # YI SYLLABLE WEP +A28D ; [.4280.0020.0002] # YI SYLLABLE ZIT +A28E ; [.4281.0020.0002] # YI SYLLABLE ZIX +A28F ; [.4282.0020.0002] # YI SYLLABLE ZI +A290 ; [.4283.0020.0002] # YI SYLLABLE ZIP +A291 ; [.4284.0020.0002] # YI SYLLABLE ZIEX +A292 ; [.4285.0020.0002] # YI SYLLABLE ZIE +A293 ; [.4286.0020.0002] # YI SYLLABLE ZIEP +A294 ; [.4287.0020.0002] # YI SYLLABLE ZAT +A295 ; [.4288.0020.0002] # YI SYLLABLE ZAX +A296 ; [.4289.0020.0002] # YI SYLLABLE ZA +A297 ; [.428A.0020.0002] # YI SYLLABLE ZAP +A298 ; [.428B.0020.0002] # YI SYLLABLE ZUOX +A299 ; [.428C.0020.0002] # YI SYLLABLE ZUO +A29A ; [.428D.0020.0002] # YI SYLLABLE ZUOP +A29B ; [.428E.0020.0002] # YI SYLLABLE ZOT +A29C ; [.428F.0020.0002] # YI SYLLABLE ZOX +A29D ; [.4290.0020.0002] # YI SYLLABLE ZO +A29E ; [.4291.0020.0002] # YI SYLLABLE ZOP +A29F ; [.4292.0020.0002] # YI SYLLABLE ZEX +A2A0 ; [.4293.0020.0002] # YI SYLLABLE ZE +A2A1 ; [.4294.0020.0002] # YI SYLLABLE ZEP +A2A2 ; [.4295.0020.0002] # YI SYLLABLE ZUT +A2A3 ; [.4296.0020.0002] # YI SYLLABLE ZUX +A2A4 ; [.4297.0020.0002] # YI SYLLABLE ZU +A2A5 ; [.4298.0020.0002] # YI SYLLABLE ZUP +A2A6 ; [.4299.0020.0002] # YI SYLLABLE ZURX +A2A7 ; [.429A.0020.0002] # YI SYLLABLE ZUR +A2A8 ; [.429B.0020.0002] # YI SYLLABLE ZYT +A2A9 ; [.429C.0020.0002] # YI SYLLABLE ZYX +A2AA ; [.429D.0020.0002] # YI SYLLABLE ZY +A2AB ; [.429E.0020.0002] # YI SYLLABLE ZYP +A2AC ; [.429F.0020.0002] # YI SYLLABLE ZYRX +A2AD ; [.42A0.0020.0002] # YI SYLLABLE ZYR +A2AE ; [.42A1.0020.0002] # YI SYLLABLE CIT +A2AF ; [.42A2.0020.0002] # YI SYLLABLE CIX +A2B0 ; [.42A3.0020.0002] # YI SYLLABLE CI +A2B1 ; [.42A4.0020.0002] # YI SYLLABLE CIP +A2B2 ; [.42A5.0020.0002] # YI SYLLABLE CIET +A2B3 ; [.42A6.0020.0002] # YI SYLLABLE CIEX +A2B4 ; [.42A7.0020.0002] # YI SYLLABLE CIE +A2B5 ; [.42A8.0020.0002] # YI SYLLABLE CIEP +A2B6 ; [.42A9.0020.0002] # YI SYLLABLE CAT +A2B7 ; [.42AA.0020.0002] # YI SYLLABLE CAX +A2B8 ; [.42AB.0020.0002] # YI SYLLABLE CA +A2B9 ; [.42AC.0020.0002] # YI SYLLABLE CAP +A2BA ; [.42AD.0020.0002] # YI SYLLABLE CUOX +A2BB ; [.42AE.0020.0002] # YI SYLLABLE CUO +A2BC ; [.42AF.0020.0002] # YI SYLLABLE CUOP +A2BD ; [.42B0.0020.0002] # YI SYLLABLE COT +A2BE ; [.42B1.0020.0002] # YI SYLLABLE COX +A2BF ; [.42B2.0020.0002] # YI SYLLABLE CO +A2C0 ; [.42B3.0020.0002] # YI SYLLABLE COP +A2C1 ; [.42B4.0020.0002] # YI SYLLABLE CEX +A2C2 ; [.42B5.0020.0002] # YI SYLLABLE CE +A2C3 ; [.42B6.0020.0002] # YI SYLLABLE CEP +A2C4 ; [.42B7.0020.0002] # YI SYLLABLE CUT +A2C5 ; [.42B8.0020.0002] # YI SYLLABLE CUX +A2C6 ; [.42B9.0020.0002] # YI SYLLABLE CU +A2C7 ; [.42BA.0020.0002] # YI SYLLABLE CUP +A2C8 ; [.42BB.0020.0002] # YI SYLLABLE CURX +A2C9 ; [.42BC.0020.0002] # YI SYLLABLE CUR +A2CA ; [.42BD.0020.0002] # YI SYLLABLE CYT +A2CB ; [.42BE.0020.0002] # YI SYLLABLE CYX +A2CC ; [.42BF.0020.0002] # YI SYLLABLE CY +A2CD ; [.42C0.0020.0002] # YI SYLLABLE CYP +A2CE ; [.42C1.0020.0002] # YI SYLLABLE CYRX +A2CF ; [.42C2.0020.0002] # YI SYLLABLE CYR +A2D0 ; [.42C3.0020.0002] # YI SYLLABLE ZZIT +A2D1 ; [.42C4.0020.0002] # YI SYLLABLE ZZIX +A2D2 ; [.42C5.0020.0002] # YI SYLLABLE ZZI +A2D3 ; [.42C6.0020.0002] # YI SYLLABLE ZZIP +A2D4 ; [.42C7.0020.0002] # YI SYLLABLE ZZIET +A2D5 ; [.42C8.0020.0002] # YI SYLLABLE ZZIEX +A2D6 ; [.42C9.0020.0002] # YI SYLLABLE ZZIE +A2D7 ; [.42CA.0020.0002] # YI SYLLABLE ZZIEP +A2D8 ; [.42CB.0020.0002] # YI SYLLABLE ZZAT +A2D9 ; [.42CC.0020.0002] # YI SYLLABLE ZZAX +A2DA ; [.42CD.0020.0002] # YI SYLLABLE ZZA +A2DB ; [.42CE.0020.0002] # YI SYLLABLE ZZAP +A2DC ; [.42CF.0020.0002] # YI SYLLABLE ZZOX +A2DD ; [.42D0.0020.0002] # YI SYLLABLE ZZO +A2DE ; [.42D1.0020.0002] # YI SYLLABLE ZZOP +A2DF ; [.42D2.0020.0002] # YI SYLLABLE ZZEX +A2E0 ; [.42D3.0020.0002] # YI SYLLABLE ZZE +A2E1 ; [.42D4.0020.0002] # YI SYLLABLE ZZEP +A2E2 ; [.42D5.0020.0002] # YI SYLLABLE ZZUX +A2E3 ; [.42D6.0020.0002] # YI SYLLABLE ZZU +A2E4 ; [.42D7.0020.0002] # YI SYLLABLE ZZUP +A2E5 ; [.42D8.0020.0002] # YI SYLLABLE ZZURX +A2E6 ; [.42D9.0020.0002] # YI SYLLABLE ZZUR +A2E7 ; [.42DA.0020.0002] # YI SYLLABLE ZZYT +A2E8 ; [.42DB.0020.0002] # YI SYLLABLE ZZYX +A2E9 ; [.42DC.0020.0002] # YI SYLLABLE ZZY +A2EA ; [.42DD.0020.0002] # YI SYLLABLE ZZYP +A2EB ; [.42DE.0020.0002] # YI SYLLABLE ZZYRX +A2EC ; [.42DF.0020.0002] # YI SYLLABLE ZZYR +A2ED ; [.42E0.0020.0002] # YI SYLLABLE NZIT +A2EE ; [.42E1.0020.0002] # YI SYLLABLE NZIX +A2EF ; [.42E2.0020.0002] # YI SYLLABLE NZI +A2F0 ; [.42E3.0020.0002] # YI SYLLABLE NZIP +A2F1 ; [.42E4.0020.0002] # YI SYLLABLE NZIEX +A2F2 ; [.42E5.0020.0002] # YI SYLLABLE NZIE +A2F3 ; [.42E6.0020.0002] # YI SYLLABLE NZIEP +A2F4 ; [.42E7.0020.0002] # YI SYLLABLE NZAT +A2F5 ; [.42E8.0020.0002] # YI SYLLABLE NZAX +A2F6 ; [.42E9.0020.0002] # YI SYLLABLE NZA +A2F7 ; [.42EA.0020.0002] # YI SYLLABLE NZAP +A2F8 ; [.42EB.0020.0002] # YI SYLLABLE NZUOX +A2F9 ; [.42EC.0020.0002] # YI SYLLABLE NZUO +A2FA ; [.42ED.0020.0002] # YI SYLLABLE NZOX +A2FB ; [.42EE.0020.0002] # YI SYLLABLE NZOP +A2FC ; [.42EF.0020.0002] # YI SYLLABLE NZEX +A2FD ; [.42F0.0020.0002] # YI SYLLABLE NZE +A2FE ; [.42F1.0020.0002] # YI SYLLABLE NZUX +A2FF ; [.42F2.0020.0002] # YI SYLLABLE NZU +A300 ; [.42F3.0020.0002] # YI SYLLABLE NZUP +A301 ; [.42F4.0020.0002] # YI SYLLABLE NZURX +A302 ; [.42F5.0020.0002] # YI SYLLABLE NZUR +A303 ; [.42F6.0020.0002] # YI SYLLABLE NZYT +A304 ; [.42F7.0020.0002] # YI SYLLABLE NZYX +A305 ; [.42F8.0020.0002] # YI SYLLABLE NZY +A306 ; [.42F9.0020.0002] # YI SYLLABLE NZYP +A307 ; [.42FA.0020.0002] # YI SYLLABLE NZYRX +A308 ; [.42FB.0020.0002] # YI SYLLABLE NZYR +A309 ; [.42FC.0020.0002] # YI SYLLABLE SIT +A30A ; [.42FD.0020.0002] # YI SYLLABLE SIX +A30B ; [.42FE.0020.0002] # YI SYLLABLE SI +A30C ; [.42FF.0020.0002] # YI SYLLABLE SIP +A30D ; [.4300.0020.0002] # YI SYLLABLE SIEX +A30E ; [.4301.0020.0002] # YI SYLLABLE SIE +A30F ; [.4302.0020.0002] # YI SYLLABLE SIEP +A310 ; [.4303.0020.0002] # YI SYLLABLE SAT +A311 ; [.4304.0020.0002] # YI SYLLABLE SAX +A312 ; [.4305.0020.0002] # YI SYLLABLE SA +A313 ; [.4306.0020.0002] # YI SYLLABLE SAP +A314 ; [.4307.0020.0002] # YI SYLLABLE SUOX +A315 ; [.4308.0020.0002] # YI SYLLABLE SUO +A316 ; [.4309.0020.0002] # YI SYLLABLE SUOP +A317 ; [.430A.0020.0002] # YI SYLLABLE SOT +A318 ; [.430B.0020.0002] # YI SYLLABLE SOX +A319 ; [.430C.0020.0002] # YI SYLLABLE SO +A31A ; [.430D.0020.0002] # YI SYLLABLE SOP +A31B ; [.430E.0020.0002] # YI SYLLABLE SEX +A31C ; [.430F.0020.0002] # YI SYLLABLE SE +A31D ; [.4310.0020.0002] # YI SYLLABLE SEP +A31E ; [.4311.0020.0002] # YI SYLLABLE SUT +A31F ; [.4312.0020.0002] # YI SYLLABLE SUX +A320 ; [.4313.0020.0002] # YI SYLLABLE SU +A321 ; [.4314.0020.0002] # YI SYLLABLE SUP +A322 ; [.4315.0020.0002] # YI SYLLABLE SURX +A323 ; [.4316.0020.0002] # YI SYLLABLE SUR +A324 ; [.4317.0020.0002] # YI SYLLABLE SYT +A325 ; [.4318.0020.0002] # YI SYLLABLE SYX +A326 ; [.4319.0020.0002] # YI SYLLABLE SY +A327 ; [.431A.0020.0002] # YI SYLLABLE SYP +A328 ; [.431B.0020.0002] # YI SYLLABLE SYRX +A329 ; [.431C.0020.0002] # YI SYLLABLE SYR +A32A ; [.431D.0020.0002] # YI SYLLABLE SSIT +A32B ; [.431E.0020.0002] # YI SYLLABLE SSIX +A32C ; [.431F.0020.0002] # YI SYLLABLE SSI +A32D ; [.4320.0020.0002] # YI SYLLABLE SSIP +A32E ; [.4321.0020.0002] # YI SYLLABLE SSIEX +A32F ; [.4322.0020.0002] # YI SYLLABLE SSIE +A330 ; [.4323.0020.0002] # YI SYLLABLE SSIEP +A331 ; [.4324.0020.0002] # YI SYLLABLE SSAT +A332 ; [.4325.0020.0002] # YI SYLLABLE SSAX +A333 ; [.4326.0020.0002] # YI SYLLABLE SSA +A334 ; [.4327.0020.0002] # YI SYLLABLE SSAP +A335 ; [.4328.0020.0002] # YI SYLLABLE SSOT +A336 ; [.4329.0020.0002] # YI SYLLABLE SSOX +A337 ; [.432A.0020.0002] # YI SYLLABLE SSO +A338 ; [.432B.0020.0002] # YI SYLLABLE SSOP +A339 ; [.432C.0020.0002] # YI SYLLABLE SSEX +A33A ; [.432D.0020.0002] # YI SYLLABLE SSE +A33B ; [.432E.0020.0002] # YI SYLLABLE SSEP +A33C ; [.432F.0020.0002] # YI SYLLABLE SSUT +A33D ; [.4330.0020.0002] # YI SYLLABLE SSUX +A33E ; [.4331.0020.0002] # YI SYLLABLE SSU +A33F ; [.4332.0020.0002] # YI SYLLABLE SSUP +A340 ; [.4333.0020.0002] # YI SYLLABLE SSYT +A341 ; [.4334.0020.0002] # YI SYLLABLE SSYX +A342 ; [.4335.0020.0002] # YI SYLLABLE SSY +A343 ; [.4336.0020.0002] # YI SYLLABLE SSYP +A344 ; [.4337.0020.0002] # YI SYLLABLE SSYRX +A345 ; [.4338.0020.0002] # YI SYLLABLE SSYR +A346 ; [.4339.0020.0002] # YI SYLLABLE ZHAT +A347 ; [.433A.0020.0002] # YI SYLLABLE ZHAX +A348 ; [.433B.0020.0002] # YI SYLLABLE ZHA +A349 ; [.433C.0020.0002] # YI SYLLABLE ZHAP +A34A ; [.433D.0020.0002] # YI SYLLABLE ZHUOX +A34B ; [.433E.0020.0002] # YI SYLLABLE ZHUO +A34C ; [.433F.0020.0002] # YI SYLLABLE ZHUOP +A34D ; [.4340.0020.0002] # YI SYLLABLE ZHOT +A34E ; [.4341.0020.0002] # YI SYLLABLE ZHOX +A34F ; [.4342.0020.0002] # YI SYLLABLE ZHO +A350 ; [.4343.0020.0002] # YI SYLLABLE ZHOP +A351 ; [.4344.0020.0002] # YI SYLLABLE ZHET +A352 ; [.4345.0020.0002] # YI SYLLABLE ZHEX +A353 ; [.4346.0020.0002] # YI SYLLABLE ZHE +A354 ; [.4347.0020.0002] # YI SYLLABLE ZHEP +A355 ; [.4348.0020.0002] # YI SYLLABLE ZHUT +A356 ; [.4349.0020.0002] # YI SYLLABLE ZHUX +A357 ; [.434A.0020.0002] # YI SYLLABLE ZHU +A358 ; [.434B.0020.0002] # YI SYLLABLE ZHUP +A359 ; [.434C.0020.0002] # YI SYLLABLE ZHURX +A35A ; [.434D.0020.0002] # YI SYLLABLE ZHUR +A35B ; [.434E.0020.0002] # YI SYLLABLE ZHYT +A35C ; [.434F.0020.0002] # YI SYLLABLE ZHYX +A35D ; [.4350.0020.0002] # YI SYLLABLE ZHY +A35E ; [.4351.0020.0002] # YI SYLLABLE ZHYP +A35F ; [.4352.0020.0002] # YI SYLLABLE ZHYRX +A360 ; [.4353.0020.0002] # YI SYLLABLE ZHYR +A361 ; [.4354.0020.0002] # YI SYLLABLE CHAT +A362 ; [.4355.0020.0002] # YI SYLLABLE CHAX +A363 ; [.4356.0020.0002] # YI SYLLABLE CHA +A364 ; [.4357.0020.0002] # YI SYLLABLE CHAP +A365 ; [.4358.0020.0002] # YI SYLLABLE CHUOT +A366 ; [.4359.0020.0002] # YI SYLLABLE CHUOX +A367 ; [.435A.0020.0002] # YI SYLLABLE CHUO +A368 ; [.435B.0020.0002] # YI SYLLABLE CHUOP +A369 ; [.435C.0020.0002] # YI SYLLABLE CHOT +A36A ; [.435D.0020.0002] # YI SYLLABLE CHOX +A36B ; [.435E.0020.0002] # YI SYLLABLE CHO +A36C ; [.435F.0020.0002] # YI SYLLABLE CHOP +A36D ; [.4360.0020.0002] # YI SYLLABLE CHET +A36E ; [.4361.0020.0002] # YI SYLLABLE CHEX +A36F ; [.4362.0020.0002] # YI SYLLABLE CHE +A370 ; [.4363.0020.0002] # YI SYLLABLE CHEP +A371 ; [.4364.0020.0002] # YI SYLLABLE CHUX +A372 ; [.4365.0020.0002] # YI SYLLABLE CHU +A373 ; [.4366.0020.0002] # YI SYLLABLE CHUP +A374 ; [.4367.0020.0002] # YI SYLLABLE CHURX +A375 ; [.4368.0020.0002] # YI SYLLABLE CHUR +A376 ; [.4369.0020.0002] # YI SYLLABLE CHYT +A377 ; [.436A.0020.0002] # YI SYLLABLE CHYX +A378 ; [.436B.0020.0002] # YI SYLLABLE CHY +A379 ; [.436C.0020.0002] # YI SYLLABLE CHYP +A37A ; [.436D.0020.0002] # YI SYLLABLE CHYRX +A37B ; [.436E.0020.0002] # YI SYLLABLE CHYR +A37C ; [.436F.0020.0002] # YI SYLLABLE RRAX +A37D ; [.4370.0020.0002] # YI SYLLABLE RRA +A37E ; [.4371.0020.0002] # YI SYLLABLE RRUOX +A37F ; [.4372.0020.0002] # YI SYLLABLE RRUO +A380 ; [.4373.0020.0002] # YI SYLLABLE RROT +A381 ; [.4374.0020.0002] # YI SYLLABLE RROX +A382 ; [.4375.0020.0002] # YI SYLLABLE RRO +A383 ; [.4376.0020.0002] # YI SYLLABLE RROP +A384 ; [.4377.0020.0002] # YI SYLLABLE RRET +A385 ; [.4378.0020.0002] # YI SYLLABLE RREX +A386 ; [.4379.0020.0002] # YI SYLLABLE RRE +A387 ; [.437A.0020.0002] # YI SYLLABLE RREP +A388 ; [.437B.0020.0002] # YI SYLLABLE RRUT +A389 ; [.437C.0020.0002] # YI SYLLABLE RRUX +A38A ; [.437D.0020.0002] # YI SYLLABLE RRU +A38B ; [.437E.0020.0002] # YI SYLLABLE RRUP +A38C ; [.437F.0020.0002] # YI SYLLABLE RRURX +A38D ; [.4380.0020.0002] # YI SYLLABLE RRUR +A38E ; [.4381.0020.0002] # YI SYLLABLE RRYT +A38F ; [.4382.0020.0002] # YI SYLLABLE RRYX +A390 ; [.4383.0020.0002] # YI SYLLABLE RRY +A391 ; [.4384.0020.0002] # YI SYLLABLE RRYP +A392 ; [.4385.0020.0002] # YI SYLLABLE RRYRX +A393 ; [.4386.0020.0002] # YI SYLLABLE RRYR +A394 ; [.4387.0020.0002] # YI SYLLABLE NRAT +A395 ; [.4388.0020.0002] # YI SYLLABLE NRAX +A396 ; [.4389.0020.0002] # YI SYLLABLE NRA +A397 ; [.438A.0020.0002] # YI SYLLABLE NRAP +A398 ; [.438B.0020.0002] # YI SYLLABLE NROX +A399 ; [.438C.0020.0002] # YI SYLLABLE NRO +A39A ; [.438D.0020.0002] # YI SYLLABLE NROP +A39B ; [.438E.0020.0002] # YI SYLLABLE NRET +A39C ; [.438F.0020.0002] # YI SYLLABLE NREX +A39D ; [.4390.0020.0002] # YI SYLLABLE NRE +A39E ; [.4391.0020.0002] # YI SYLLABLE NREP +A39F ; [.4392.0020.0002] # YI SYLLABLE NRUT +A3A0 ; [.4393.0020.0002] # YI SYLLABLE NRUX +A3A1 ; [.4394.0020.0002] # YI SYLLABLE NRU +A3A2 ; [.4395.0020.0002] # YI SYLLABLE NRUP +A3A3 ; [.4396.0020.0002] # YI SYLLABLE NRURX +A3A4 ; [.4397.0020.0002] # YI SYLLABLE NRUR +A3A5 ; [.4398.0020.0002] # YI SYLLABLE NRYT +A3A6 ; [.4399.0020.0002] # YI SYLLABLE NRYX +A3A7 ; [.439A.0020.0002] # YI SYLLABLE NRY +A3A8 ; [.439B.0020.0002] # YI SYLLABLE NRYP +A3A9 ; [.439C.0020.0002] # YI SYLLABLE NRYRX +A3AA ; [.439D.0020.0002] # YI SYLLABLE NRYR +A3AB ; [.439E.0020.0002] # YI SYLLABLE SHAT +A3AC ; [.439F.0020.0002] # YI SYLLABLE SHAX +A3AD ; [.43A0.0020.0002] # YI SYLLABLE SHA +A3AE ; [.43A1.0020.0002] # YI SYLLABLE SHAP +A3AF ; [.43A2.0020.0002] # YI SYLLABLE SHUOX +A3B0 ; [.43A3.0020.0002] # YI SYLLABLE SHUO +A3B1 ; [.43A4.0020.0002] # YI SYLLABLE SHUOP +A3B2 ; [.43A5.0020.0002] # YI SYLLABLE SHOT +A3B3 ; [.43A6.0020.0002] # YI SYLLABLE SHOX +A3B4 ; [.43A7.0020.0002] # YI SYLLABLE SHO +A3B5 ; [.43A8.0020.0002] # YI SYLLABLE SHOP +A3B6 ; [.43A9.0020.0002] # YI SYLLABLE SHET +A3B7 ; [.43AA.0020.0002] # YI SYLLABLE SHEX +A3B8 ; [.43AB.0020.0002] # YI SYLLABLE SHE +A3B9 ; [.43AC.0020.0002] # YI SYLLABLE SHEP +A3BA ; [.43AD.0020.0002] # YI SYLLABLE SHUT +A3BB ; [.43AE.0020.0002] # YI SYLLABLE SHUX +A3BC ; [.43AF.0020.0002] # YI SYLLABLE SHU +A3BD ; [.43B0.0020.0002] # YI SYLLABLE SHUP +A3BE ; [.43B1.0020.0002] # YI SYLLABLE SHURX +A3BF ; [.43B2.0020.0002] # YI SYLLABLE SHUR +A3C0 ; [.43B3.0020.0002] # YI SYLLABLE SHYT +A3C1 ; [.43B4.0020.0002] # YI SYLLABLE SHYX +A3C2 ; [.43B5.0020.0002] # YI SYLLABLE SHY +A3C3 ; [.43B6.0020.0002] # YI SYLLABLE SHYP +A3C4 ; [.43B7.0020.0002] # YI SYLLABLE SHYRX +A3C5 ; [.43B8.0020.0002] # YI SYLLABLE SHYR +A3C6 ; [.43B9.0020.0002] # YI SYLLABLE RAT +A3C7 ; [.43BA.0020.0002] # YI SYLLABLE RAX +A3C8 ; [.43BB.0020.0002] # YI SYLLABLE RA +A3C9 ; [.43BC.0020.0002] # YI SYLLABLE RAP +A3CA ; [.43BD.0020.0002] # YI SYLLABLE RUOX +A3CB ; [.43BE.0020.0002] # YI SYLLABLE RUO +A3CC ; [.43BF.0020.0002] # YI SYLLABLE RUOP +A3CD ; [.43C0.0020.0002] # YI SYLLABLE ROT +A3CE ; [.43C1.0020.0002] # YI SYLLABLE ROX +A3CF ; [.43C2.0020.0002] # YI SYLLABLE RO +A3D0 ; [.43C3.0020.0002] # YI SYLLABLE ROP +A3D1 ; [.43C4.0020.0002] # YI SYLLABLE REX +A3D2 ; [.43C5.0020.0002] # YI SYLLABLE RE +A3D3 ; [.43C6.0020.0002] # YI SYLLABLE REP +A3D4 ; [.43C7.0020.0002] # YI SYLLABLE RUT +A3D5 ; [.43C8.0020.0002] # YI SYLLABLE RUX +A3D6 ; [.43C9.0020.0002] # YI SYLLABLE RU +A3D7 ; [.43CA.0020.0002] # YI SYLLABLE RUP +A3D8 ; [.43CB.0020.0002] # YI SYLLABLE RURX +A3D9 ; [.43CC.0020.0002] # YI SYLLABLE RUR +A3DA ; [.43CD.0020.0002] # YI SYLLABLE RYT +A3DB ; [.43CE.0020.0002] # YI SYLLABLE RYX +A3DC ; [.43CF.0020.0002] # YI SYLLABLE RY +A3DD ; [.43D0.0020.0002] # YI SYLLABLE RYP +A3DE ; [.43D1.0020.0002] # YI SYLLABLE RYRX +A3DF ; [.43D2.0020.0002] # YI SYLLABLE RYR +A3E0 ; [.43D3.0020.0002] # YI SYLLABLE JIT +A3E1 ; [.43D4.0020.0002] # YI SYLLABLE JIX +A3E2 ; [.43D5.0020.0002] # YI SYLLABLE JI +A3E3 ; [.43D6.0020.0002] # YI SYLLABLE JIP +A3E4 ; [.43D7.0020.0002] # YI SYLLABLE JIET +A3E5 ; [.43D8.0020.0002] # YI SYLLABLE JIEX +A3E6 ; [.43D9.0020.0002] # YI SYLLABLE JIE +A3E7 ; [.43DA.0020.0002] # YI SYLLABLE JIEP +A3E8 ; [.43DB.0020.0002] # YI SYLLABLE JUOT +A3E9 ; [.43DC.0020.0002] # YI SYLLABLE JUOX +A3EA ; [.43DD.0020.0002] # YI SYLLABLE JUO +A3EB ; [.43DE.0020.0002] # YI SYLLABLE JUOP +A3EC ; [.43DF.0020.0002] # YI SYLLABLE JOT +A3ED ; [.43E0.0020.0002] # YI SYLLABLE JOX +A3EE ; [.43E1.0020.0002] # YI SYLLABLE JO +A3EF ; [.43E2.0020.0002] # YI SYLLABLE JOP +A3F0 ; [.43E3.0020.0002] # YI SYLLABLE JUT +A3F1 ; [.43E4.0020.0002] # YI SYLLABLE JUX +A3F2 ; [.43E5.0020.0002] # YI SYLLABLE JU +A3F3 ; [.43E6.0020.0002] # YI SYLLABLE JUP +A3F4 ; [.43E7.0020.0002] # YI SYLLABLE JURX +A3F5 ; [.43E8.0020.0002] # YI SYLLABLE JUR +A3F6 ; [.43E9.0020.0002] # YI SYLLABLE JYT +A3F7 ; [.43EA.0020.0002] # YI SYLLABLE JYX +A3F8 ; [.43EB.0020.0002] # YI SYLLABLE JY +A3F9 ; [.43EC.0020.0002] # YI SYLLABLE JYP +A3FA ; [.43ED.0020.0002] # YI SYLLABLE JYRX +A3FB ; [.43EE.0020.0002] # YI SYLLABLE JYR +A3FC ; [.43EF.0020.0002] # YI SYLLABLE QIT +A3FD ; [.43F0.0020.0002] # YI SYLLABLE QIX +A3FE ; [.43F1.0020.0002] # YI SYLLABLE QI +A3FF ; [.43F2.0020.0002] # YI SYLLABLE QIP +A400 ; [.43F3.0020.0002] # YI SYLLABLE QIET +A401 ; [.43F4.0020.0002] # YI SYLLABLE QIEX +A402 ; [.43F5.0020.0002] # YI SYLLABLE QIE +A403 ; [.43F6.0020.0002] # YI SYLLABLE QIEP +A404 ; [.43F7.0020.0002] # YI SYLLABLE QUOT +A405 ; [.43F8.0020.0002] # YI SYLLABLE QUOX +A406 ; [.43F9.0020.0002] # YI SYLLABLE QUO +A407 ; [.43FA.0020.0002] # YI SYLLABLE QUOP +A408 ; [.43FB.0020.0002] # YI SYLLABLE QOT +A409 ; [.43FC.0020.0002] # YI SYLLABLE QOX +A40A ; [.43FD.0020.0002] # YI SYLLABLE QO +A40B ; [.43FE.0020.0002] # YI SYLLABLE QOP +A40C ; [.43FF.0020.0002] # YI SYLLABLE QUT +A40D ; [.4400.0020.0002] # YI SYLLABLE QUX +A40E ; [.4401.0020.0002] # YI SYLLABLE QU +A40F ; [.4402.0020.0002] # YI SYLLABLE QUP +A410 ; [.4403.0020.0002] # YI SYLLABLE QURX +A411 ; [.4404.0020.0002] # YI SYLLABLE QUR +A412 ; [.4405.0020.0002] # YI SYLLABLE QYT +A413 ; [.4406.0020.0002] # YI SYLLABLE QYX +A414 ; [.4407.0020.0002] # YI SYLLABLE QY +A415 ; [.4408.0020.0002] # YI SYLLABLE QYP +A416 ; [.4409.0020.0002] # YI SYLLABLE QYRX +A417 ; [.440A.0020.0002] # YI SYLLABLE QYR +A418 ; [.440B.0020.0002] # YI SYLLABLE JJIT +A419 ; [.440C.0020.0002] # YI SYLLABLE JJIX +A41A ; [.440D.0020.0002] # YI SYLLABLE JJI +A41B ; [.440E.0020.0002] # YI SYLLABLE JJIP +A41C ; [.440F.0020.0002] # YI SYLLABLE JJIET +A41D ; [.4410.0020.0002] # YI SYLLABLE JJIEX +A41E ; [.4411.0020.0002] # YI SYLLABLE JJIE +A41F ; [.4412.0020.0002] # YI SYLLABLE JJIEP +A420 ; [.4413.0020.0002] # YI SYLLABLE JJUOX +A421 ; [.4414.0020.0002] # YI SYLLABLE JJUO +A422 ; [.4415.0020.0002] # YI SYLLABLE JJUOP +A423 ; [.4416.0020.0002] # YI SYLLABLE JJOT +A424 ; [.4417.0020.0002] # YI SYLLABLE JJOX +A425 ; [.4418.0020.0002] # YI SYLLABLE JJO +A426 ; [.4419.0020.0002] # YI SYLLABLE JJOP +A427 ; [.441A.0020.0002] # YI SYLLABLE JJUT +A428 ; [.441B.0020.0002] # YI SYLLABLE JJUX +A429 ; [.441C.0020.0002] # YI SYLLABLE JJU +A42A ; [.441D.0020.0002] # YI SYLLABLE JJUP +A42B ; [.441E.0020.0002] # YI SYLLABLE JJURX +A42C ; [.441F.0020.0002] # YI SYLLABLE JJUR +A42D ; [.4420.0020.0002] # YI SYLLABLE JJYT +A42E ; [.4421.0020.0002] # YI SYLLABLE JJYX +A42F ; [.4422.0020.0002] # YI SYLLABLE JJY +A430 ; [.4423.0020.0002] # YI SYLLABLE JJYP +A431 ; [.4424.0020.0002] # YI SYLLABLE NJIT +A432 ; [.4425.0020.0002] # YI SYLLABLE NJIX +A433 ; [.4426.0020.0002] # YI SYLLABLE NJI +A434 ; [.4427.0020.0002] # YI SYLLABLE NJIP +A435 ; [.4428.0020.0002] # YI SYLLABLE NJIET +A436 ; [.4429.0020.0002] # YI SYLLABLE NJIEX +A437 ; [.442A.0020.0002] # YI SYLLABLE NJIE +A438 ; [.442B.0020.0002] # YI SYLLABLE NJIEP +A439 ; [.442C.0020.0002] # YI SYLLABLE NJUOX +A43A ; [.442D.0020.0002] # YI SYLLABLE NJUO +A43B ; [.442E.0020.0002] # YI SYLLABLE NJOT +A43C ; [.442F.0020.0002] # YI SYLLABLE NJOX +A43D ; [.4430.0020.0002] # YI SYLLABLE NJO +A43E ; [.4431.0020.0002] # YI SYLLABLE NJOP +A43F ; [.4432.0020.0002] # YI SYLLABLE NJUX +A440 ; [.4433.0020.0002] # YI SYLLABLE NJU +A441 ; [.4434.0020.0002] # YI SYLLABLE NJUP +A442 ; [.4435.0020.0002] # YI SYLLABLE NJURX +A443 ; [.4436.0020.0002] # YI SYLLABLE NJUR +A444 ; [.4437.0020.0002] # YI SYLLABLE NJYT +A445 ; [.4438.0020.0002] # YI SYLLABLE NJYX +A446 ; [.4439.0020.0002] # YI SYLLABLE NJY +A447 ; [.443A.0020.0002] # YI SYLLABLE NJYP +A448 ; [.443B.0020.0002] # YI SYLLABLE NJYRX +A449 ; [.443C.0020.0002] # YI SYLLABLE NJYR +A44A ; [.443D.0020.0002] # YI SYLLABLE NYIT +A44B ; [.443E.0020.0002] # YI SYLLABLE NYIX +A44C ; [.443F.0020.0002] # YI SYLLABLE NYI +A44D ; [.4440.0020.0002] # YI SYLLABLE NYIP +A44E ; [.4441.0020.0002] # YI SYLLABLE NYIET +A44F ; [.4442.0020.0002] # YI SYLLABLE NYIEX +A450 ; [.4443.0020.0002] # YI SYLLABLE NYIE +A451 ; [.4444.0020.0002] # YI SYLLABLE NYIEP +A452 ; [.4445.0020.0002] # YI SYLLABLE NYUOX +A453 ; [.4446.0020.0002] # YI SYLLABLE NYUO +A454 ; [.4447.0020.0002] # YI SYLLABLE NYUOP +A455 ; [.4448.0020.0002] # YI SYLLABLE NYOT +A456 ; [.4449.0020.0002] # YI SYLLABLE NYOX +A457 ; [.444A.0020.0002] # YI SYLLABLE NYO +A458 ; [.444B.0020.0002] # YI SYLLABLE NYOP +A459 ; [.444C.0020.0002] # YI SYLLABLE NYUT +A45A ; [.444D.0020.0002] # YI SYLLABLE NYUX +A45B ; [.444E.0020.0002] # YI SYLLABLE NYU +A45C ; [.444F.0020.0002] # YI SYLLABLE NYUP +A45D ; [.4450.0020.0002] # YI SYLLABLE XIT +A45E ; [.4451.0020.0002] # YI SYLLABLE XIX +A45F ; [.4452.0020.0002] # YI SYLLABLE XI +A460 ; [.4453.0020.0002] # YI SYLLABLE XIP +A461 ; [.4454.0020.0002] # YI SYLLABLE XIET +A462 ; [.4455.0020.0002] # YI SYLLABLE XIEX +A463 ; [.4456.0020.0002] # YI SYLLABLE XIE +A464 ; [.4457.0020.0002] # YI SYLLABLE XIEP +A465 ; [.4458.0020.0002] # YI SYLLABLE XUOX +A466 ; [.4459.0020.0002] # YI SYLLABLE XUO +A467 ; [.445A.0020.0002] # YI SYLLABLE XOT +A468 ; [.445B.0020.0002] # YI SYLLABLE XOX +A469 ; [.445C.0020.0002] # YI SYLLABLE XO +A46A ; [.445D.0020.0002] # YI SYLLABLE XOP +A46B ; [.445E.0020.0002] # YI SYLLABLE XYT +A46C ; [.445F.0020.0002] # YI SYLLABLE XYX +A46D ; [.4460.0020.0002] # YI SYLLABLE XY +A46E ; [.4461.0020.0002] # YI SYLLABLE XYP +A46F ; [.4462.0020.0002] # YI SYLLABLE XYRX +A470 ; [.4463.0020.0002] # YI SYLLABLE XYR +A471 ; [.4464.0020.0002] # YI SYLLABLE YIT +A472 ; [.4465.0020.0002] # YI SYLLABLE YIX +A473 ; [.4466.0020.0002] # YI SYLLABLE YI +A474 ; [.4467.0020.0002] # YI SYLLABLE YIP +A475 ; [.4468.0020.0002] # YI SYLLABLE YIET +A476 ; [.4469.0020.0002] # YI SYLLABLE YIEX +A477 ; [.446A.0020.0002] # YI SYLLABLE YIE +A478 ; [.446B.0020.0002] # YI SYLLABLE YIEP +A479 ; [.446C.0020.0002] # YI SYLLABLE YUOT +A47A ; [.446D.0020.0002] # YI SYLLABLE YUOX +A47B ; [.446E.0020.0002] # YI SYLLABLE YUO +A47C ; [.446F.0020.0002] # YI SYLLABLE YUOP +A47D ; [.4470.0020.0002] # YI SYLLABLE YOT +A47E ; [.4471.0020.0002] # YI SYLLABLE YOX +A47F ; [.4472.0020.0002] # YI SYLLABLE YO +A480 ; [.4473.0020.0002] # YI SYLLABLE YOP +A481 ; [.4474.0020.0002] # YI SYLLABLE YUT +A482 ; [.4475.0020.0002] # YI SYLLABLE YUX +A483 ; [.4476.0020.0002] # YI SYLLABLE YU +A484 ; [.4477.0020.0002] # YI SYLLABLE YUP +A485 ; [.4478.0020.0002] # YI SYLLABLE YURX +A486 ; [.4479.0020.0002] # YI SYLLABLE YUR +A487 ; [.447A.0020.0002] # YI SYLLABLE YYT +A488 ; [.447B.0020.0002] # YI SYLLABLE YYX +A489 ; [.447C.0020.0002] # YI SYLLABLE YY +A48A ; [.447D.0020.0002] # YI SYLLABLE YYP +A48B ; [.447E.0020.0002] # YI SYLLABLE YYRX +A48C ; [.447F.0020.0002] # YI SYLLABLE YYR +A4F8 ; [.4480.0020.0002] # LISU LETTER TONE MYA TI +A4F9 ; [.4481.0020.0002] # LISU LETTER TONE NA PO +A4FA ; [.4482.0020.0002] # LISU LETTER TONE MYA CYA +A4FB ; [.4483.0020.0002] # LISU LETTER TONE MYA BO +A4FD ; [.4484.0020.0002] # LISU LETTER TONE MYA JEU +A4FC ; [.4485.0020.0002] # LISU LETTER TONE MYA NA +A4D0 ; [.4486.0020.0002] # LISU LETTER BA +A4D1 ; [.4487.0020.0002] # LISU LETTER PA +A4D2 ; [.4488.0020.0002] # LISU LETTER PHA +A4D3 ; [.4489.0020.0002] # LISU LETTER DA +A4D4 ; [.448A.0020.0002] # LISU LETTER TA +A4D5 ; [.448B.0020.0002] # LISU LETTER THA +A4D6 ; [.448C.0020.0002] # LISU LETTER GA +A4D7 ; [.448D.0020.0002] # LISU LETTER KA +A4D8 ; [.448E.0020.0002] # LISU LETTER KHA +A4D9 ; [.448F.0020.0002] # LISU LETTER JA +A4DA ; [.4490.0020.0002] # LISU LETTER CA +A4DB ; [.4491.0020.0002] # LISU LETTER CHA +A4DC ; [.4492.0020.0002] # LISU LETTER DZA +A4DD ; [.4493.0020.0002] # LISU LETTER TSA +A4DE ; [.4494.0020.0002] # LISU LETTER TSHA +A4DF ; [.4495.0020.0002] # LISU LETTER MA +A4E0 ; [.4496.0020.0002] # LISU LETTER NA +A4E1 ; [.4497.0020.0002] # LISU LETTER LA +A4E2 ; [.4498.0020.0002] # LISU LETTER SA +A4E3 ; [.4499.0020.0002] # LISU LETTER ZHA +A4E4 ; [.449A.0020.0002] # LISU LETTER ZA +A4E5 ; [.449B.0020.0002] # LISU LETTER NGA +A4E6 ; [.449C.0020.0002] # LISU LETTER HA +A4E7 ; [.449D.0020.0002] # LISU LETTER XA +A4E8 ; [.449E.0020.0002] # LISU LETTER HHA +A4E9 ; [.449F.0020.0002] # LISU LETTER FA +A4EB ; [.44A0.0020.0002] # LISU LETTER SHA +A4ED ; [.44A1.0020.0002] # LISU LETTER GHA +A4EA ; [.44A2.0020.0002] # LISU LETTER WA +A4EC ; [.44A3.0020.0002] # LISU LETTER YA +A4EE ; [.44A4.0020.0002] # LISU LETTER A +A4EF ; [.44A5.0020.0002] # LISU LETTER AE +A4F0 ; [.44A6.0020.0002] # LISU LETTER E +A4F1 ; [.44A7.0020.0002] # LISU LETTER EU +A4F2 ; [.44A8.0020.0002] # LISU LETTER I +A4F3 ; [.44A9.0020.0002] # LISU LETTER O +A4F4 ; [.44AA.0020.0002] # LISU LETTER U +A4F5 ; [.44AB.0020.0002] # LISU LETTER UE +A4F6 ; [.44AC.0020.0002] # LISU LETTER UH +A4F7 ; [.44AD.0020.0002] # LISU LETTER OE +16F00 ; [.44AE.0020.0002] # MIAO LETTER PA +16F01 ; [.44AF.0020.0002] # MIAO LETTER BA +16F02 ; [.44B0.0020.0002] # MIAO LETTER YI PA +16F03 ; [.44B1.0020.0002] # MIAO LETTER PLA +16F04 ; [.44B2.0020.0002] # MIAO LETTER MA +16F06 ; [.44B2.0020.0004] # MIAO LETTER ARCHAIC MA +16F05 ; [.44B3.0020.0002] # MIAO LETTER MHA +16F07 ; [.44B4.0020.0002] # MIAO LETTER FA +16F08 ; [.44B5.0020.0002] # MIAO LETTER VA +16F09 ; [.44B6.0020.0002] # MIAO LETTER VFA +16F0A ; [.44B7.0020.0002] # MIAO LETTER TA +16F0B ; [.44B8.0020.0002] # MIAO LETTER DA +16F0C ; [.44B9.0020.0002] # MIAO LETTER YI TTA +16F0D ; [.44BA.0020.0002] # MIAO LETTER YI TA +16F0E ; [.44BB.0020.0002] # MIAO LETTER TTA +16F0F ; [.44BC.0020.0002] # MIAO LETTER DDA +16F10 ; [.44BD.0020.0002] # MIAO LETTER NA +16F13 ; [.44BD.0020.0004] # MIAO LETTER ARCHAIC NA +16F11 ; [.44BE.0020.0002] # MIAO LETTER NHA +16F12 ; [.44BF.0020.0002] # MIAO LETTER YI NNA +16F14 ; [.44C0.0020.0002] # MIAO LETTER NNA +16F15 ; [.44C1.0020.0002] # MIAO LETTER NNHA +16F16 ; [.44C2.0020.0002] # MIAO LETTER LA +16F17 ; [.44C3.0020.0002] # MIAO LETTER LYA +16F18 ; [.44C4.0020.0002] # MIAO LETTER LHA +16F19 ; [.44C5.0020.0002] # MIAO LETTER LHYA +16F1A ; [.44C6.0020.0002] # MIAO LETTER TLHA +16F1B ; [.44C7.0020.0002] # MIAO LETTER DLHA +16F1C ; [.44C8.0020.0002] # MIAO LETTER TLHYA +16F1D ; [.44C9.0020.0002] # MIAO LETTER DLHYA +16F1E ; [.44CA.0020.0002] # MIAO LETTER KA +16F1F ; [.44CB.0020.0002] # MIAO LETTER GA +16F20 ; [.44CC.0020.0002] # MIAO LETTER YI KA +16F21 ; [.44CD.0020.0002] # MIAO LETTER QA +16F22 ; [.44CE.0020.0002] # MIAO LETTER QGA +16F23 ; [.44CF.0020.0002] # MIAO LETTER NGA +16F25 ; [.44CF.0020.0004] # MIAO LETTER ARCHAIC NGA +16F24 ; [.44D0.0020.0002] # MIAO LETTER NGHA +16F26 ; [.44D1.0020.0002] # MIAO LETTER HA +16F27 ; [.44D2.0020.0002] # MIAO LETTER XA +16F28 ; [.44D3.0020.0002] # MIAO LETTER GHA +16F29 ; [.44D4.0020.0002] # MIAO LETTER GHHA +16F2A ; [.44D5.0020.0002] # MIAO LETTER TSSA +16F2B ; [.44D6.0020.0002] # MIAO LETTER DZZA +16F2C ; [.44D7.0020.0002] # MIAO LETTER NYA +16F2D ; [.44D8.0020.0002] # MIAO LETTER NYHA +16F2E ; [.44D9.0020.0002] # MIAO LETTER TSHA +16F2F ; [.44DA.0020.0002] # MIAO LETTER DZHA +16F30 ; [.44DB.0020.0002] # MIAO LETTER YI TSHA +16F31 ; [.44DC.0020.0002] # MIAO LETTER YI DZHA +16F32 ; [.44DD.0020.0002] # MIAO LETTER REFORMED TSHA +16F33 ; [.44DE.0020.0002] # MIAO LETTER SHA +16F34 ; [.44DF.0020.0002] # MIAO LETTER SSA +16F35 ; [.44E0.0020.0002] # MIAO LETTER ZHA +16F36 ; [.44E1.0020.0002] # MIAO LETTER ZSHA +16F37 ; [.44E2.0020.0002] # MIAO LETTER TSA +16F38 ; [.44E3.0020.0002] # MIAO LETTER DZA +16F39 ; [.44E4.0020.0002] # MIAO LETTER YI TSA +16F3A ; [.44E5.0020.0002] # MIAO LETTER SA +16F3B ; [.44E6.0020.0002] # MIAO LETTER ZA +16F3C ; [.44E7.0020.0002] # MIAO LETTER ZSA +16F3D ; [.44E8.0020.0002] # MIAO LETTER ZZA +16F3F ; [.44E8.0020.0004] # MIAO LETTER ARCHAIC ZZA +16F3E ; [.44E9.0020.0002] # MIAO LETTER ZZSA +16F40 ; [.44EA.0020.0002] # MIAO LETTER ZZYA +16F41 ; [.44EB.0020.0002] # MIAO LETTER ZZSYA +16F42 ; [.44EC.0020.0002] # MIAO LETTER WA +16F43 ; [.44ED.0020.0002] # MIAO LETTER AH +16F44 ; [.44EE.0020.0002] # MIAO LETTER HHA +16F50 ; [.44EF.0020.0002] # MIAO LETTER NASALIZATION +16F51 ; [.44F0.0020.0002] # MIAO SIGN ASPIRATION +16F52 ; [.44F1.0020.0002] # MIAO SIGN REFORMED VOICING +16F53 ; [.44F2.0020.0002] # MIAO SIGN REFORMED ASPIRATION +16F54 ; [.44F3.0020.0002] # MIAO VOWEL SIGN A +16F55 ; [.44F4.0020.0002] # MIAO VOWEL SIGN AA +16F56 ; [.44F5.0020.0002] # MIAO VOWEL SIGN AHH +16F57 ; [.44F6.0020.0002] # MIAO VOWEL SIGN AN +16F58 ; [.44F7.0020.0002] # MIAO VOWEL SIGN ANG +16F59 ; [.44F8.0020.0002] # MIAO VOWEL SIGN O +16F5A ; [.44F9.0020.0002] # MIAO VOWEL SIGN OO +16F5B ; [.44FA.0020.0002] # MIAO VOWEL SIGN WO +16F5C ; [.44FB.0020.0002] # MIAO VOWEL SIGN W +16F5D ; [.44FC.0020.0002] # MIAO VOWEL SIGN E +16F5E ; [.44FD.0020.0002] # MIAO VOWEL SIGN EN +16F5F ; [.44FE.0020.0002] # MIAO VOWEL SIGN ENG +16F60 ; [.44FF.0020.0002] # MIAO VOWEL SIGN OEY +16F61 ; [.4500.0020.0002] # MIAO VOWEL SIGN I +16F62 ; [.4501.0020.0002] # MIAO VOWEL SIGN IA +16F63 ; [.4502.0020.0002] # MIAO VOWEL SIGN IAN +16F64 ; [.4503.0020.0002] # MIAO VOWEL SIGN IANG +16F65 ; [.4504.0020.0002] # MIAO VOWEL SIGN IO +16F66 ; [.4505.0020.0002] # MIAO VOWEL SIGN IE +16F67 ; [.4506.0020.0002] # MIAO VOWEL SIGN II +16F68 ; [.4507.0020.0002] # MIAO VOWEL SIGN IU +16F69 ; [.4508.0020.0002] # MIAO VOWEL SIGN ING +16F6A ; [.4509.0020.0002] # MIAO VOWEL SIGN U +16F6B ; [.450A.0020.0002] # MIAO VOWEL SIGN UA +16F6C ; [.450B.0020.0002] # MIAO VOWEL SIGN UAN +16F6D ; [.450C.0020.0002] # MIAO VOWEL SIGN UANG +16F6E ; [.450D.0020.0002] # MIAO VOWEL SIGN UU +16F6F ; [.450E.0020.0002] # MIAO VOWEL SIGN UEI +16F70 ; [.450F.0020.0002] # MIAO VOWEL SIGN UNG +16F71 ; [.4510.0020.0002] # MIAO VOWEL SIGN Y +16F72 ; [.4511.0020.0002] # MIAO VOWEL SIGN YI +16F73 ; [.4512.0020.0002] # MIAO VOWEL SIGN AE +16F74 ; [.4513.0020.0002] # MIAO VOWEL SIGN AEE +16F75 ; [.4514.0020.0002] # MIAO VOWEL SIGN ERR +16F76 ; [.4515.0020.0002] # MIAO VOWEL SIGN ROUNDED ERR +16F77 ; [.4516.0020.0002] # MIAO VOWEL SIGN ER +16F78 ; [.4517.0020.0002] # MIAO VOWEL SIGN ROUNDED ER +16F79 ; [.4518.0020.0002] # MIAO VOWEL SIGN AI +16F7A ; [.4519.0020.0002] # MIAO VOWEL SIGN EI +16F7B ; [.451A.0020.0002] # MIAO VOWEL SIGN AU +16F7C ; [.451B.0020.0002] # MIAO VOWEL SIGN OU +16F7D ; [.451C.0020.0002] # MIAO VOWEL SIGN N +16F7E ; [.451D.0020.0002] # MIAO VOWEL SIGN NG +16F8F ; [.451E.0020.0002] # MIAO TONE RIGHT +16F90 ; [.451F.0020.0002] # MIAO TONE TOP RIGHT +16F91 ; [.4520.0020.0002] # MIAO TONE ABOVE +16F92 ; [.4521.0020.0002] # MIAO TONE BELOW +16F93 ; [.4522.0020.0002] # MIAO LETTER TONE-2 +16F94 ; [.4523.0020.0002] # MIAO LETTER TONE-3 +16F95 ; [.4524.0020.0002] # MIAO LETTER TONE-4 +16F96 ; [.4525.0020.0002] # MIAO LETTER TONE-5 +16F97 ; [.4526.0020.0002] # MIAO LETTER TONE-6 +16F98 ; [.4527.0020.0002] # MIAO LETTER TONE-7 +16F99 ; [.4528.0020.0002] # MIAO LETTER TONE-8 +16F9A ; [.4529.0020.0002] # MIAO LETTER REFORMED TONE-1 +16F9B ; [.452A.0020.0002] # MIAO LETTER REFORMED TONE-2 +16F9C ; [.452B.0020.0002] # MIAO LETTER REFORMED TONE-4 +16F9D ; [.452C.0020.0002] # MIAO LETTER REFORMED TONE-5 +16F9E ; [.452D.0020.0002] # MIAO LETTER REFORMED TONE-6 +16F9F ; [.452E.0020.0002] # MIAO LETTER REFORMED TONE-8 +118FF ; [.452F.0020.0002] # WARANG CITI OM +118C0 ; [.4530.0020.0002] # WARANG CITI SMALL LETTER NGAA +118A0 ; [.4530.0020.0008] # WARANG CITI CAPITAL LETTER NGAA +118C1 ; [.4531.0020.0002] # WARANG CITI SMALL LETTER A +118A1 ; [.4531.0020.0008] # WARANG CITI CAPITAL LETTER A +118C2 ; [.4532.0020.0002] # WARANG CITI SMALL LETTER WI +118A2 ; [.4532.0020.0008] # WARANG CITI CAPITAL LETTER WI +118C3 ; [.4533.0020.0002] # WARANG CITI SMALL LETTER YU +118A3 ; [.4533.0020.0008] # WARANG CITI CAPITAL LETTER YU +118C4 ; [.4534.0020.0002] # WARANG CITI SMALL LETTER YA +118A4 ; [.4534.0020.0008] # WARANG CITI CAPITAL LETTER YA +118C5 ; [.4535.0020.0002] # WARANG CITI SMALL LETTER YO +118A5 ; [.4535.0020.0008] # WARANG CITI CAPITAL LETTER YO +118C6 ; [.4536.0020.0002] # WARANG CITI SMALL LETTER II +118A6 ; [.4536.0020.0008] # WARANG CITI CAPITAL LETTER II +118C7 ; [.4537.0020.0002] # WARANG CITI SMALL LETTER UU +118A7 ; [.4537.0020.0008] # WARANG CITI CAPITAL LETTER UU +118C8 ; [.4538.0020.0002] # WARANG CITI SMALL LETTER E +118A8 ; [.4538.0020.0008] # WARANG CITI CAPITAL LETTER E +118C9 ; [.4539.0020.0002] # WARANG CITI SMALL LETTER O +118A9 ; [.4539.0020.0008] # WARANG CITI CAPITAL LETTER O +118CA ; [.453A.0020.0002] # WARANG CITI SMALL LETTER ANG +118AA ; [.453A.0020.0008] # WARANG CITI CAPITAL LETTER ANG +118CB ; [.453B.0020.0002] # WARANG CITI SMALL LETTER GA +118AB ; [.453B.0020.0008] # WARANG CITI CAPITAL LETTER GA +118CC ; [.453C.0020.0002] # WARANG CITI SMALL LETTER KO +118AC ; [.453C.0020.0008] # WARANG CITI CAPITAL LETTER KO +118CD ; [.453D.0020.0002] # WARANG CITI SMALL LETTER ENY +118AD ; [.453D.0020.0008] # WARANG CITI CAPITAL LETTER ENY +118CE ; [.453E.0020.0002] # WARANG CITI SMALL LETTER YUJ +118AE ; [.453E.0020.0008] # WARANG CITI CAPITAL LETTER YUJ +118CF ; [.453F.0020.0002] # WARANG CITI SMALL LETTER UC +118AF ; [.453F.0020.0008] # WARANG CITI CAPITAL LETTER UC +118D0 ; [.4540.0020.0002] # WARANG CITI SMALL LETTER ENN +118B0 ; [.4540.0020.0008] # WARANG CITI CAPITAL LETTER ENN +118D1 ; [.4541.0020.0002] # WARANG CITI SMALL LETTER ODD +118B1 ; [.4541.0020.0008] # WARANG CITI CAPITAL LETTER ODD +118D2 ; [.4542.0020.0002] # WARANG CITI SMALL LETTER TTE +118B2 ; [.4542.0020.0008] # WARANG CITI CAPITAL LETTER TTE +118D3 ; [.4543.0020.0002] # WARANG CITI SMALL LETTER NUNG +118B3 ; [.4543.0020.0008] # WARANG CITI CAPITAL LETTER NUNG +118D4 ; [.4544.0020.0002] # WARANG CITI SMALL LETTER DA +118B4 ; [.4544.0020.0008] # WARANG CITI CAPITAL LETTER DA +118D5 ; [.4545.0020.0002] # WARANG CITI SMALL LETTER AT +118B5 ; [.4545.0020.0008] # WARANG CITI CAPITAL LETTER AT +118D6 ; [.4546.0020.0002] # WARANG CITI SMALL LETTER AM +118B6 ; [.4546.0020.0008] # WARANG CITI CAPITAL LETTER AM +118D7 ; [.4547.0020.0002] # WARANG CITI SMALL LETTER BU +118B7 ; [.4547.0020.0008] # WARANG CITI CAPITAL LETTER BU +118D8 ; [.4548.0020.0002] # WARANG CITI SMALL LETTER PU +118B8 ; [.4548.0020.0008] # WARANG CITI CAPITAL LETTER PU +118D9 ; [.4549.0020.0002] # WARANG CITI SMALL LETTER HIYO +118B9 ; [.4549.0020.0008] # WARANG CITI CAPITAL LETTER HIYO +118DA ; [.454A.0020.0002] # WARANG CITI SMALL LETTER HOLO +118BA ; [.454A.0020.0008] # WARANG CITI CAPITAL LETTER HOLO +118DB ; [.454B.0020.0002] # WARANG CITI SMALL LETTER HORR +118BB ; [.454B.0020.0008] # WARANG CITI CAPITAL LETTER HORR +118DC ; [.454C.0020.0002] # WARANG CITI SMALL LETTER HAR +118BC ; [.454C.0020.0008] # WARANG CITI CAPITAL LETTER HAR +118DD ; [.454D.0020.0002] # WARANG CITI SMALL LETTER SSUU +118BD ; [.454D.0020.0008] # WARANG CITI CAPITAL LETTER SSUU +118DE ; [.454E.0020.0002] # WARANG CITI SMALL LETTER SII +118BE ; [.454E.0020.0008] # WARANG CITI CAPITAL LETTER SII +118DF ; [.454F.0020.0002] # WARANG CITI SMALL LETTER VIYO +118BF ; [.454F.0020.0008] # WARANG CITI CAPITAL LETTER VIYO +11AD5 ; [.4550.0020.0002] # PAU CIN HAU LETTER A +11AD6 ; [.4551.0020.0002] # PAU CIN HAU LETTER E +11AD7 ; [.4552.0020.0002] # PAU CIN HAU LETTER I +11AD8 ; [.4553.0020.0002] # PAU CIN HAU LETTER O +11AD9 ; [.4554.0020.0002] # PAU CIN HAU LETTER U +11ADA ; [.4555.0020.0002] # PAU CIN HAU LETTER UA +11ADB ; [.4556.0020.0002] # PAU CIN HAU LETTER IA +11AC0 ; [.4557.0020.0002] # PAU CIN HAU LETTER PA +11AC1 ; [.4558.0020.0002] # PAU CIN HAU LETTER KA +11AC2 ; [.4559.0020.0002] # PAU CIN HAU LETTER LA +11AC3 ; [.455A.0020.0002] # PAU CIN HAU LETTER MA +11AC4 ; [.455B.0020.0002] # PAU CIN HAU LETTER DA +11AC5 ; [.455C.0020.0002] # PAU CIN HAU LETTER ZA +11AC6 ; [.455D.0020.0002] # PAU CIN HAU LETTER VA +11AC7 ; [.455E.0020.0002] # PAU CIN HAU LETTER NGA +11AC8 ; [.455F.0020.0002] # PAU CIN HAU LETTER HA +11AC9 ; [.4560.0020.0002] # PAU CIN HAU LETTER GA +11ACA ; [.4561.0020.0002] # PAU CIN HAU LETTER KHA +11ACB ; [.4562.0020.0002] # PAU CIN HAU LETTER SA +11ACC ; [.4563.0020.0002] # PAU CIN HAU LETTER BA +11ACD ; [.4564.0020.0002] # PAU CIN HAU LETTER CA +11ACE ; [.4565.0020.0002] # PAU CIN HAU LETTER TA +11ACF ; [.4566.0020.0002] # PAU CIN HAU LETTER THA +11AD0 ; [.4567.0020.0002] # PAU CIN HAU LETTER NA +11AD1 ; [.4568.0020.0002] # PAU CIN HAU LETTER PHA +11AD2 ; [.4569.0020.0002] # PAU CIN HAU LETTER RA +11AD3 ; [.456A.0020.0002] # PAU CIN HAU LETTER FA +11AD4 ; [.456B.0020.0002] # PAU CIN HAU LETTER CHA +11ADC ; [.456C.0020.0002] # PAU CIN HAU LETTER FINAL P +11ADD ; [.456D.0020.0002] # PAU CIN HAU LETTER FINAL K +11ADF ; [.456E.0020.0002] # PAU CIN HAU LETTER FINAL M +11AE0 ; [.456F.0020.0002] # PAU CIN HAU LETTER FINAL N +11AE1 ; [.4570.0020.0002] # PAU CIN HAU LETTER FINAL L +11AE2 ; [.4571.0020.0002] # PAU CIN HAU LETTER FINAL W +11AE3 ; [.4572.0020.0002] # PAU CIN HAU LETTER FINAL NG +11ADE ; [.4573.0020.0002] # PAU CIN HAU LETTER FINAL T +11AE4 ; [.4574.0020.0002] # PAU CIN HAU LETTER FINAL Y +11AEF ; [.4575.0020.0002] # PAU CIN HAU MID-LEVEL TONE +11AF2 ; [.4576.0020.0002] # PAU CIN HAU MID-LEVEL TONE FINAL +11AF1 ; [.4577.0020.0002] # PAU CIN HAU MID-LEVEL TONE LONG FINAL +11AE6 ; [.4578.0020.0002] # PAU CIN HAU RISING TONE +11AE9 ; [.4579.0020.0002] # PAU CIN HAU RISING TONE FINAL +11AE5 ; [.457A.0020.0002] # PAU CIN HAU RISING TONE LONG +11AE8 ; [.457B.0020.0002] # PAU CIN HAU RISING TONE LONG FINAL +11AF4 ; [.457C.0020.0002] # PAU CIN HAU LOW-FALLING TONE +11AF7 ; [.457D.0020.0002] # PAU CIN HAU LOW-FALLING TONE FINAL +11AF3 ; [.457E.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG +11AF6 ; [.457F.0020.0002] # PAU CIN HAU LOW-FALLING TONE LONG FINAL +11AEC ; [.4580.0020.0002] # PAU CIN HAU SANDHI TONE +11AEE ; [.4581.0020.0002] # PAU CIN HAU SANDHI TONE FINAL +11AEB ; [.4582.0020.0002] # PAU CIN HAU SANDHI TONE LONG +11AED ; [.4583.0020.0002] # PAU CIN HAU SANDHI TONE LONG FINAL +11AF5 ; [.4584.0020.0002] # PAU CIN HAU GLOTTAL STOP +11AF8 ; [.4585.0020.0002] # PAU CIN HAU GLOTTAL STOP FINAL +11AE7 ; [.4586.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP +11AEA ; [.4587.0020.0002] # PAU CIN HAU SANDHI GLOTTAL STOP FINAL +11AF0 ; [.4588.0020.0002] # PAU CIN HAU GLOTTAL STOP VARIANT +16B00 ; [.4589.0020.0002] # PAHAWH HMONG VOWEL KEEB +16B01 ; [.458A.0020.0002] # PAHAWH HMONG VOWEL KEEV +16B02 ; [.458B.0020.0002] # PAHAWH HMONG VOWEL KIB +16B03 ; [.458C.0020.0002] # PAHAWH HMONG VOWEL KIV +16B04 ; [.458D.0020.0002] # PAHAWH HMONG VOWEL KAUB +16B05 ; [.458E.0020.0002] # PAHAWH HMONG VOWEL KAUV +16B06 ; [.458F.0020.0002] # PAHAWH HMONG VOWEL KUB +16B07 ; [.4590.0020.0002] # PAHAWH HMONG VOWEL KUV +16B08 ; [.4591.0020.0002] # PAHAWH HMONG VOWEL KEB +16B09 ; [.4592.0020.0002] # PAHAWH HMONG VOWEL KEV +16B0A ; [.4593.0020.0002] # PAHAWH HMONG VOWEL KAIB +16B0B ; [.4594.0020.0002] # PAHAWH HMONG VOWEL KAIV +16B0C ; [.4595.0020.0002] # PAHAWH HMONG VOWEL KOOB +16B0D ; [.4596.0020.0002] # PAHAWH HMONG VOWEL KOOV +16B0E ; [.4597.0020.0002] # PAHAWH HMONG VOWEL KAWB +16B0F ; [.4598.0020.0002] # PAHAWH HMONG VOWEL KAWV +16B10 ; [.4599.0020.0002] # PAHAWH HMONG VOWEL KUAB +16B11 ; [.459A.0020.0002] # PAHAWH HMONG VOWEL KUAV +16B12 ; [.459B.0020.0002] # PAHAWH HMONG VOWEL KOB +16B13 ; [.459C.0020.0002] # PAHAWH HMONG VOWEL KOV +16B14 ; [.459D.0020.0002] # PAHAWH HMONG VOWEL KIAB +16B15 ; [.459E.0020.0002] # PAHAWH HMONG VOWEL KIAV +16B16 ; [.459F.0020.0002] # PAHAWH HMONG VOWEL KAB +16B17 ; [.45A0.0020.0002] # PAHAWH HMONG VOWEL KAV +16B18 ; [.45A1.0020.0002] # PAHAWH HMONG VOWEL KWB +16B19 ; [.45A2.0020.0002] # PAHAWH HMONG VOWEL KWV +16B1A ; [.45A3.0020.0002] # PAHAWH HMONG VOWEL KAAB +16B1B ; [.45A4.0020.0002] # PAHAWH HMONG VOWEL KAAV +16B1C ; [.45A5.0020.0002] # PAHAWH HMONG CONSONANT VAU +16B1D ; [.45A6.0020.0002] # PAHAWH HMONG CONSONANT NTSAU +16B1E ; [.45A7.0020.0002] # PAHAWH HMONG CONSONANT LAU +16B1F ; [.45A8.0020.0002] # PAHAWH HMONG CONSONANT HAU +16B20 ; [.45A9.0020.0002] # PAHAWH HMONG CONSONANT NLAU +16B21 ; [.45AA.0020.0002] # PAHAWH HMONG CONSONANT RAU +16B22 ; [.45AB.0020.0002] # PAHAWH HMONG CONSONANT NKAU +16B23 ; [.45AC.0020.0002] # PAHAWH HMONG CONSONANT QHAU +16B24 ; [.45AD.0020.0002] # PAHAWH HMONG CONSONANT YAU +16B25 ; [.45AE.0020.0002] # PAHAWH HMONG CONSONANT HLAU +16B26 ; [.45AF.0020.0002] # PAHAWH HMONG CONSONANT MAU +16B27 ; [.45B0.0020.0002] # PAHAWH HMONG CONSONANT CHAU +16B28 ; [.45B1.0020.0002] # PAHAWH HMONG CONSONANT NCHAU +16B29 ; [.45B2.0020.0002] # PAHAWH HMONG CONSONANT HNAU +16B2A ; [.45B3.0020.0002] # PAHAWH HMONG CONSONANT PLHAU +16B2B ; [.45B4.0020.0002] # PAHAWH HMONG CONSONANT NTHAU +16B2C ; [.45B5.0020.0002] # PAHAWH HMONG CONSONANT NAU +16B2D ; [.45B6.0020.0002] # PAHAWH HMONG CONSONANT AU +16B2E ; [.45B7.0020.0002] # PAHAWH HMONG CONSONANT XAU +16B2F ; [.45B8.0020.0002] # PAHAWH HMONG CONSONANT CAU +16B40 ; [.45B9.0020.0002] # PAHAWH HMONG SIGN VOS SEEV +16B41 ; [.45BA.0020.0002] # PAHAWH HMONG SIGN MEEJ SUAB +16B63 ; [.45BB.0020.0002] # PAHAWH HMONG SIGN VOS LUB +16B64 ; [.45BC.0020.0002] # PAHAWH HMONG SIGN XYOO +16B65 ; [.45BD.0020.0002] # PAHAWH HMONG SIGN HLI +16B66 ; [.45BE.0020.0002] # PAHAWH HMONG SIGN THIRD-STAGE HLI +16B67 ; [.45BF.0020.0002] # PAHAWH HMONG SIGN ZWJ THAJ +16B68 ; [.45C0.0020.0002] # PAHAWH HMONG SIGN HNUB +16B69 ; [.45C1.0020.0002] # PAHAWH HMONG SIGN NQIG +16B6A ; [.45C2.0020.0002] # PAHAWH HMONG SIGN XIAB +16B6B ; [.45C3.0020.0002] # PAHAWH HMONG SIGN NTUJ +16B6C ; [.45C4.0020.0002] # PAHAWH HMONG SIGN AV +16B6D ; [.45C5.0020.0002] # PAHAWH HMONG SIGN TXHEEJ CEEV +16B6E ; [.45C6.0020.0002] # PAHAWH HMONG SIGN MEEJ TSEEB +16B6F ; [.45C7.0020.0002] # PAHAWH HMONG SIGN TAU +16B70 ; [.45C8.0020.0002] # PAHAWH HMONG SIGN LOS +16B71 ; [.45C9.0020.0002] # PAHAWH HMONG SIGN MUS +16B72 ; [.45CA.0020.0002] # PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG +16B73 ; [.45CB.0020.0002] # PAHAWH HMONG SIGN CIM CUAM TSHOOJ +16B74 ; [.45CC.0020.0002] # PAHAWH HMONG SIGN CIM TXWV +16B75 ; [.45CD.0020.0002] # PAHAWH HMONG SIGN CIM TXWV CHWV +16B76 ; [.45CE.0020.0002] # PAHAWH HMONG SIGN CIM PUB DAWB +16B77 ; [.45CF.0020.0002] # PAHAWH HMONG SIGN CIM NRES TOS +16B7D ; [.45D0.0020.0002] # PAHAWH HMONG CLAN SIGN TSHEEJ +16B7E ; [.45D1.0020.0002] # PAHAWH HMONG CLAN SIGN YEEG +16B7F ; [.45D2.0020.0002] # PAHAWH HMONG CLAN SIGN LIS +16B80 ; [.45D3.0020.0002] # PAHAWH HMONG CLAN SIGN LAUJ +16B81 ; [.45D4.0020.0002] # PAHAWH HMONG CLAN SIGN XYOOJ +16B82 ; [.45D5.0020.0002] # PAHAWH HMONG CLAN SIGN KOO +16B83 ; [.45D6.0020.0002] # PAHAWH HMONG CLAN SIGN HAWJ +16B84 ; [.45D7.0020.0002] # PAHAWH HMONG CLAN SIGN MUAS +16B85 ; [.45D8.0020.0002] # PAHAWH HMONG CLAN SIGN THOJ +16B86 ; [.45D9.0020.0002] # PAHAWH HMONG CLAN SIGN TSAB +16B87 ; [.45DA.0020.0002] # PAHAWH HMONG CLAN SIGN PHAB +16B88 ; [.45DB.0020.0002] # PAHAWH HMONG CLAN SIGN KHAB +16B89 ; [.45DC.0020.0002] # PAHAWH HMONG CLAN SIGN HAM +16B8A ; [.45DD.0020.0002] # PAHAWH HMONG CLAN SIGN VAJ +16B8B ; [.45DE.0020.0002] # PAHAWH HMONG CLAN SIGN FAJ +16B8C ; [.45DF.0020.0002] # PAHAWH HMONG CLAN SIGN YAJ +16B8D ; [.45E0.0020.0002] # PAHAWH HMONG CLAN SIGN TSWB +16B8E ; [.45E1.0020.0002] # PAHAWH HMONG CLAN SIGN KWM +16B8F ; [.45E2.0020.0002] # PAHAWH HMONG CLAN SIGN VWJ +10280 ; [.45E3.0020.0002] # LYCIAN LETTER A +10281 ; [.45E4.0020.0002] # LYCIAN LETTER E +10282 ; [.45E5.0020.0002] # LYCIAN LETTER B +10283 ; [.45E6.0020.0002] # LYCIAN LETTER BH +10284 ; [.45E7.0020.0002] # LYCIAN LETTER G +10285 ; [.45E8.0020.0002] # LYCIAN LETTER D +10286 ; [.45E9.0020.0002] # LYCIAN LETTER I +10287 ; [.45EA.0020.0002] # LYCIAN LETTER W +10288 ; [.45EB.0020.0002] # LYCIAN LETTER Z +10289 ; [.45EC.0020.0002] # LYCIAN LETTER TH +1028A ; [.45ED.0020.0002] # LYCIAN LETTER J +1028B ; [.45EE.0020.0002] # LYCIAN LETTER K +1028C ; [.45EF.0020.0002] # LYCIAN LETTER Q +1028D ; [.45F0.0020.0002] # LYCIAN LETTER L +1028E ; [.45F1.0020.0002] # LYCIAN LETTER M +1028F ; [.45F2.0020.0002] # LYCIAN LETTER N +10290 ; [.45F3.0020.0002] # LYCIAN LETTER MM +10291 ; [.45F4.0020.0002] # LYCIAN LETTER NN +10292 ; [.45F5.0020.0002] # LYCIAN LETTER U +10293 ; [.45F6.0020.0002] # LYCIAN LETTER P +10294 ; [.45F7.0020.0002] # LYCIAN LETTER KK +10295 ; [.45F8.0020.0002] # LYCIAN LETTER R +10296 ; [.45F9.0020.0002] # LYCIAN LETTER S +10297 ; [.45FA.0020.0002] # LYCIAN LETTER T +10298 ; [.45FB.0020.0002] # LYCIAN LETTER TT +10299 ; [.45FC.0020.0002] # LYCIAN LETTER AN +1029A ; [.45FD.0020.0002] # LYCIAN LETTER EN +1029B ; [.45FE.0020.0002] # LYCIAN LETTER H +1029C ; [.45FF.0020.0002] # LYCIAN LETTER X +102A0 ; [.4600.0020.0002] # CARIAN LETTER A +102A1 ; [.4601.0020.0002] # CARIAN LETTER P2 +102A2 ; [.4602.0020.0002] # CARIAN LETTER D +102A3 ; [.4603.0020.0002] # CARIAN LETTER L +102A4 ; [.4604.0020.0002] # CARIAN LETTER UUU +102A5 ; [.4605.0020.0002] # CARIAN LETTER R +102A6 ; [.4606.0020.0002] # CARIAN LETTER LD +102A7 ; [.4607.0020.0002] # CARIAN LETTER A2 +102A8 ; [.4608.0020.0002] # CARIAN LETTER Q +102A9 ; [.4609.0020.0002] # CARIAN LETTER B +102AA ; [.460A.0020.0002] # CARIAN LETTER M +102AB ; [.460B.0020.0002] # CARIAN LETTER O +102AC ; [.460C.0020.0002] # CARIAN LETTER D2 +102AD ; [.460D.0020.0002] # CARIAN LETTER T +102AE ; [.460E.0020.0002] # CARIAN LETTER SH +102AF ; [.460F.0020.0002] # CARIAN LETTER SH2 +102B0 ; [.4610.0020.0002] # CARIAN LETTER S +102B1 ; [.4611.0020.0002] # CARIAN LETTER C-18 +102B2 ; [.4612.0020.0002] # CARIAN LETTER U +102B3 ; [.4613.0020.0002] # CARIAN LETTER NN +102B4 ; [.4614.0020.0002] # CARIAN LETTER X +102B5 ; [.4615.0020.0002] # CARIAN LETTER N +102B6 ; [.4616.0020.0002] # CARIAN LETTER TT2 +102B7 ; [.4617.0020.0002] # CARIAN LETTER P +102B8 ; [.4618.0020.0002] # CARIAN LETTER SS +102B9 ; [.4619.0020.0002] # CARIAN LETTER I +102BA ; [.461A.0020.0002] # CARIAN LETTER E +102BB ; [.461B.0020.0002] # CARIAN LETTER UUUU +102BC ; [.461C.0020.0002] # CARIAN LETTER K +102BD ; [.461D.0020.0002] # CARIAN LETTER K2 +102BE ; [.461E.0020.0002] # CARIAN LETTER ND +102BF ; [.461F.0020.0002] # CARIAN LETTER UU +102C0 ; [.4620.0020.0002] # CARIAN LETTER G +102C1 ; [.4621.0020.0002] # CARIAN LETTER G2 +102C2 ; [.4622.0020.0002] # CARIAN LETTER ST +102C3 ; [.4623.0020.0002] # CARIAN LETTER ST2 +102C4 ; [.4624.0020.0002] # CARIAN LETTER NG +102C5 ; [.4625.0020.0002] # CARIAN LETTER II +102C6 ; [.4626.0020.0002] # CARIAN LETTER C-39 +102C7 ; [.4627.0020.0002] # CARIAN LETTER TT +102C8 ; [.4628.0020.0002] # CARIAN LETTER UUU2 +102C9 ; [.4629.0020.0002] # CARIAN LETTER RR +102CA ; [.462A.0020.0002] # CARIAN LETTER MB +102CB ; [.462B.0020.0002] # CARIAN LETTER MB2 +102CC ; [.462C.0020.0002] # CARIAN LETTER MB3 +102CD ; [.462D.0020.0002] # CARIAN LETTER MB4 +102CE ; [.462E.0020.0002] # CARIAN LETTER LD2 +102CF ; [.462F.0020.0002] # CARIAN LETTER E2 +102D0 ; [.4630.0020.0002] # CARIAN LETTER UUU3 +10920 ; [.4631.0020.0002] # LYDIAN LETTER A +10921 ; [.4632.0020.0002] # LYDIAN LETTER B +10922 ; [.4633.0020.0002] # LYDIAN LETTER G +10923 ; [.4634.0020.0002] # LYDIAN LETTER D +10924 ; [.4635.0020.0002] # LYDIAN LETTER E +10925 ; [.4636.0020.0002] # LYDIAN LETTER V +10926 ; [.4637.0020.0002] # LYDIAN LETTER I +10927 ; [.4638.0020.0002] # LYDIAN LETTER Y +10928 ; [.4639.0020.0002] # LYDIAN LETTER K +10929 ; [.463A.0020.0002] # LYDIAN LETTER L +1092A ; [.463B.0020.0002] # LYDIAN LETTER M +1092B ; [.463C.0020.0002] # LYDIAN LETTER N +1092C ; [.463D.0020.0002] # LYDIAN LETTER O +1092D ; [.463E.0020.0002] # LYDIAN LETTER R +1092E ; [.463F.0020.0002] # LYDIAN LETTER SS +1092F ; [.4640.0020.0002] # LYDIAN LETTER T +10930 ; [.4641.0020.0002] # LYDIAN LETTER U +10931 ; [.4642.0020.0002] # LYDIAN LETTER F +10932 ; [.4643.0020.0002] # LYDIAN LETTER Q +10933 ; [.4644.0020.0002] # LYDIAN LETTER S +10934 ; [.4645.0020.0002] # LYDIAN LETTER TT +10935 ; [.4646.0020.0002] # LYDIAN LETTER AN +10936 ; [.4647.0020.0002] # LYDIAN LETTER EN +10937 ; [.4648.0020.0002] # LYDIAN LETTER LY +10938 ; [.4649.0020.0002] # LYDIAN LETTER NN +10939 ; [.464A.0020.0002] # LYDIAN LETTER C +10300 ; [.464B.0020.0002] # OLD ITALIC LETTER A +10301 ; [.464C.0020.0002] # OLD ITALIC LETTER BE +10302 ; [.464D.0020.0002] # OLD ITALIC LETTER KE +10303 ; [.464E.0020.0002] # OLD ITALIC LETTER DE +10304 ; [.464F.0020.0002] # OLD ITALIC LETTER E +10305 ; [.4650.0020.0002] # OLD ITALIC LETTER VE +10306 ; [.4651.0020.0002] # OLD ITALIC LETTER ZE +10307 ; [.4652.0020.0002] # OLD ITALIC LETTER HE +10308 ; [.4653.0020.0002] # OLD ITALIC LETTER THE +10309 ; [.4654.0020.0002] # OLD ITALIC LETTER I +1030A ; [.4655.0020.0002] # OLD ITALIC LETTER KA +1030B ; [.4656.0020.0002] # OLD ITALIC LETTER EL +1030C ; [.4657.0020.0002] # OLD ITALIC LETTER EM +1030D ; [.4658.0020.0002] # OLD ITALIC LETTER EN +1030E ; [.4659.0020.0002] # OLD ITALIC LETTER ESH +1031F ; [.465A.0020.0002] # OLD ITALIC LETTER ESS +1030F ; [.465B.0020.0002] # OLD ITALIC LETTER O +10310 ; [.465C.0020.0002] # OLD ITALIC LETTER PE +10311 ; [.465D.0020.0002] # OLD ITALIC LETTER SHE +10312 ; [.465E.0020.0002] # OLD ITALIC LETTER KU +10313 ; [.465F.0020.0002] # OLD ITALIC LETTER ER +10314 ; [.4660.0020.0002] # OLD ITALIC LETTER ES +10315 ; [.4661.0020.0002] # OLD ITALIC LETTER TE +10316 ; [.4662.0020.0002] # OLD ITALIC LETTER U +10317 ; [.4663.0020.0002] # OLD ITALIC LETTER EKS +10318 ; [.4664.0020.0002] # OLD ITALIC LETTER PHE +10319 ; [.4665.0020.0002] # OLD ITALIC LETTER KHE +1031A ; [.4666.0020.0002] # OLD ITALIC LETTER EF +1031B ; [.4667.0020.0002] # OLD ITALIC LETTER ERS +1031C ; [.4668.0020.0002] # OLD ITALIC LETTER CHE +1031D ; [.4669.0020.0002] # OLD ITALIC LETTER II +1031E ; [.466A.0020.0002] # OLD ITALIC LETTER UU +1032D ; [.466B.0020.0002] # OLD ITALIC LETTER YE +1032E ; [.466C.0020.0002] # OLD ITALIC LETTER NORTHERN TSE +1032F ; [.466D.0020.0002] # OLD ITALIC LETTER SOUTHERN TSE +10330 ; [.466E.0020.0002] # GOTHIC LETTER AHSA +10331 ; [.466F.0020.0002] # GOTHIC LETTER BAIRKAN +10332 ; [.4670.0020.0002] # GOTHIC LETTER GIBA +10333 ; [.4671.0020.0002] # GOTHIC LETTER DAGS +10334 ; [.4672.0020.0002] # GOTHIC LETTER AIHVUS +10335 ; [.4673.0020.0002] # GOTHIC LETTER QAIRTHRA +10336 ; [.4674.0020.0002] # GOTHIC LETTER IUJA +10337 ; [.4675.0020.0002] # GOTHIC LETTER HAGL +10338 ; [.4676.0020.0002] # GOTHIC LETTER THIUTH +10339 ; [.4677.0020.0002] # GOTHIC LETTER EIS +1033A ; [.4678.0020.0002] # GOTHIC LETTER KUSMA +1033B ; [.4679.0020.0002] # GOTHIC LETTER LAGUS +1033C ; [.467A.0020.0002] # GOTHIC LETTER MANNA +1033D ; [.467B.0020.0002] # GOTHIC LETTER NAUTHS +1033E ; [.467C.0020.0002] # GOTHIC LETTER JER +1033F ; [.467D.0020.0002] # GOTHIC LETTER URUS +10340 ; [.467E.0020.0002] # GOTHIC LETTER PAIRTHRA +10341 ; [.467F.0020.0002] # GOTHIC LETTER NINETY +10342 ; [.4680.0020.0002] # GOTHIC LETTER RAIDA +10343 ; [.4681.0020.0002] # GOTHIC LETTER SAUIL +10344 ; [.4682.0020.0002] # GOTHIC LETTER TEIWS +10345 ; [.4683.0020.0002] # GOTHIC LETTER WINJA +10346 ; [.4684.0020.0002] # GOTHIC LETTER FAIHU +10347 ; [.4685.0020.0002] # GOTHIC LETTER IGGWS +10348 ; [.4686.0020.0002] # GOTHIC LETTER HWAIR +10349 ; [.4687.0020.0002] # GOTHIC LETTER OTHAL +1034A ; [.4688.0020.0002] # GOTHIC LETTER NINE HUNDRED +10428 ; [.4689.0020.0002] # DESERET SMALL LETTER LONG I +10400 ; [.4689.0020.0008] # DESERET CAPITAL LETTER LONG I +10429 ; [.468A.0020.0002] # DESERET SMALL LETTER LONG E +10401 ; [.468A.0020.0008] # DESERET CAPITAL LETTER LONG E +1042A ; [.468B.0020.0002] # DESERET SMALL LETTER LONG A +10402 ; [.468B.0020.0008] # DESERET CAPITAL LETTER LONG A +1042B ; [.468C.0020.0002] # DESERET SMALL LETTER LONG AH +10403 ; [.468C.0020.0008] # DESERET CAPITAL LETTER LONG AH +1042C ; [.468D.0020.0002] # DESERET SMALL LETTER LONG O +10404 ; [.468D.0020.0008] # DESERET CAPITAL LETTER LONG O +1042D ; [.468E.0020.0002] # DESERET SMALL LETTER LONG OO +10405 ; [.468E.0020.0008] # DESERET CAPITAL LETTER LONG OO +1042E ; [.468F.0020.0002] # DESERET SMALL LETTER SHORT I +10406 ; [.468F.0020.0008] # DESERET CAPITAL LETTER SHORT I +1042F ; [.4690.0020.0002] # DESERET SMALL LETTER SHORT E +10407 ; [.4690.0020.0008] # DESERET CAPITAL LETTER SHORT E +10430 ; [.4691.0020.0002] # DESERET SMALL LETTER SHORT A +10408 ; [.4691.0020.0008] # DESERET CAPITAL LETTER SHORT A +10431 ; [.4692.0020.0002] # DESERET SMALL LETTER SHORT AH +10409 ; [.4692.0020.0008] # DESERET CAPITAL LETTER SHORT AH +10432 ; [.4693.0020.0002] # DESERET SMALL LETTER SHORT O +1040A ; [.4693.0020.0008] # DESERET CAPITAL LETTER SHORT O +10433 ; [.4694.0020.0002] # DESERET SMALL LETTER SHORT OO +1040B ; [.4694.0020.0008] # DESERET CAPITAL LETTER SHORT OO +10434 ; [.4695.0020.0002] # DESERET SMALL LETTER AY +1040C ; [.4695.0020.0008] # DESERET CAPITAL LETTER AY +10435 ; [.4696.0020.0002] # DESERET SMALL LETTER OW +1040D ; [.4696.0020.0008] # DESERET CAPITAL LETTER OW +10436 ; [.4697.0020.0002] # DESERET SMALL LETTER WU +1040E ; [.4697.0020.0008] # DESERET CAPITAL LETTER WU +10437 ; [.4698.0020.0002] # DESERET SMALL LETTER YEE +1040F ; [.4698.0020.0008] # DESERET CAPITAL LETTER YEE +10438 ; [.4699.0020.0002] # DESERET SMALL LETTER H +10410 ; [.4699.0020.0008] # DESERET CAPITAL LETTER H +10439 ; [.469A.0020.0002] # DESERET SMALL LETTER PEE +10411 ; [.469A.0020.0008] # DESERET CAPITAL LETTER PEE +1043A ; [.469B.0020.0002] # DESERET SMALL LETTER BEE +10412 ; [.469B.0020.0008] # DESERET CAPITAL LETTER BEE +1043B ; [.469C.0020.0002] # DESERET SMALL LETTER TEE +10413 ; [.469C.0020.0008] # DESERET CAPITAL LETTER TEE +1043C ; [.469D.0020.0002] # DESERET SMALL LETTER DEE +10414 ; [.469D.0020.0008] # DESERET CAPITAL LETTER DEE +1043D ; [.469E.0020.0002] # DESERET SMALL LETTER CHEE +10415 ; [.469E.0020.0008] # DESERET CAPITAL LETTER CHEE +1043E ; [.469F.0020.0002] # DESERET SMALL LETTER JEE +10416 ; [.469F.0020.0008] # DESERET CAPITAL LETTER JEE +1043F ; [.46A0.0020.0002] # DESERET SMALL LETTER KAY +10417 ; [.46A0.0020.0008] # DESERET CAPITAL LETTER KAY +10440 ; [.46A1.0020.0002] # DESERET SMALL LETTER GAY +10418 ; [.46A1.0020.0008] # DESERET CAPITAL LETTER GAY +10441 ; [.46A2.0020.0002] # DESERET SMALL LETTER EF +10419 ; [.46A2.0020.0008] # DESERET CAPITAL LETTER EF +10442 ; [.46A3.0020.0002] # DESERET SMALL LETTER VEE +1041A ; [.46A3.0020.0008] # DESERET CAPITAL LETTER VEE +10443 ; [.46A4.0020.0002] # DESERET SMALL LETTER ETH +1041B ; [.46A4.0020.0008] # DESERET CAPITAL LETTER ETH +10444 ; [.46A5.0020.0002] # DESERET SMALL LETTER THEE +1041C ; [.46A5.0020.0008] # DESERET CAPITAL LETTER THEE +10445 ; [.46A6.0020.0002] # DESERET SMALL LETTER ES +1041D ; [.46A6.0020.0008] # DESERET CAPITAL LETTER ES +10446 ; [.46A7.0020.0002] # DESERET SMALL LETTER ZEE +1041E ; [.46A7.0020.0008] # DESERET CAPITAL LETTER ZEE +10447 ; [.46A8.0020.0002] # DESERET SMALL LETTER ESH +1041F ; [.46A8.0020.0008] # DESERET CAPITAL LETTER ESH +10448 ; [.46A9.0020.0002] # DESERET SMALL LETTER ZHEE +10420 ; [.46A9.0020.0008] # DESERET CAPITAL LETTER ZHEE +10449 ; [.46AA.0020.0002] # DESERET SMALL LETTER ER +10421 ; [.46AA.0020.0008] # DESERET CAPITAL LETTER ER +1044A ; [.46AB.0020.0002] # DESERET SMALL LETTER EL +10422 ; [.46AB.0020.0008] # DESERET CAPITAL LETTER EL +1044B ; [.46AC.0020.0002] # DESERET SMALL LETTER EM +10423 ; [.46AC.0020.0008] # DESERET CAPITAL LETTER EM +1044C ; [.46AD.0020.0002] # DESERET SMALL LETTER EN +10424 ; [.46AD.0020.0008] # DESERET CAPITAL LETTER EN +1044D ; [.46AE.0020.0002] # DESERET SMALL LETTER ENG +10425 ; [.46AE.0020.0008] # DESERET CAPITAL LETTER ENG +1044E ; [.46AF.0020.0002] # DESERET SMALL LETTER OI +10426 ; [.46AF.0020.0008] # DESERET CAPITAL LETTER OI +1044F ; [.46B0.0020.0002] # DESERET SMALL LETTER EW +10427 ; [.46B0.0020.0008] # DESERET CAPITAL LETTER EW +10450 ; [.46B1.0020.0002] # SHAVIAN LETTER PEEP +10451 ; [.46B2.0020.0002] # SHAVIAN LETTER TOT +10452 ; [.46B3.0020.0002] # SHAVIAN LETTER KICK +10453 ; [.46B4.0020.0002] # SHAVIAN LETTER FEE +10454 ; [.46B5.0020.0002] # SHAVIAN LETTER THIGH +10455 ; [.46B6.0020.0002] # SHAVIAN LETTER SO +10456 ; [.46B7.0020.0002] # SHAVIAN LETTER SURE +10457 ; [.46B8.0020.0002] # SHAVIAN LETTER CHURCH +10458 ; [.46B9.0020.0002] # SHAVIAN LETTER YEA +10459 ; [.46BA.0020.0002] # SHAVIAN LETTER HUNG +1045A ; [.46BB.0020.0002] # SHAVIAN LETTER BIB +1045B ; [.46BC.0020.0002] # SHAVIAN LETTER DEAD +1045C ; [.46BD.0020.0002] # SHAVIAN LETTER GAG +1045D ; [.46BE.0020.0002] # SHAVIAN LETTER VOW +1045E ; [.46BF.0020.0002] # SHAVIAN LETTER THEY +1045F ; [.46C0.0020.0002] # SHAVIAN LETTER ZOO +10460 ; [.46C1.0020.0002] # SHAVIAN LETTER MEASURE +10461 ; [.46C2.0020.0002] # SHAVIAN LETTER JUDGE +10462 ; [.46C3.0020.0002] # SHAVIAN LETTER WOE +10463 ; [.46C4.0020.0002] # SHAVIAN LETTER HA-HA +10464 ; [.46C5.0020.0002] # SHAVIAN LETTER LOLL +10465 ; [.46C6.0020.0002] # SHAVIAN LETTER MIME +10466 ; [.46C7.0020.0002] # SHAVIAN LETTER IF +10467 ; [.46C8.0020.0002] # SHAVIAN LETTER EGG +10468 ; [.46C9.0020.0002] # SHAVIAN LETTER ASH +10469 ; [.46CA.0020.0002] # SHAVIAN LETTER ADO +1046A ; [.46CB.0020.0002] # SHAVIAN LETTER ON +1046B ; [.46CC.0020.0002] # SHAVIAN LETTER WOOL +1046C ; [.46CD.0020.0002] # SHAVIAN LETTER OUT +1046D ; [.46CE.0020.0002] # SHAVIAN LETTER AH +1046E ; [.46CF.0020.0002] # SHAVIAN LETTER ROAR +1046F ; [.46D0.0020.0002] # SHAVIAN LETTER NUN +10470 ; [.46D1.0020.0002] # SHAVIAN LETTER EAT +10471 ; [.46D2.0020.0002] # SHAVIAN LETTER AGE +10472 ; [.46D3.0020.0002] # SHAVIAN LETTER ICE +10473 ; [.46D4.0020.0002] # SHAVIAN LETTER UP +10474 ; [.46D5.0020.0002] # SHAVIAN LETTER OAK +10475 ; [.46D6.0020.0002] # SHAVIAN LETTER OOZE +10476 ; [.46D7.0020.0002] # SHAVIAN LETTER OIL +10477 ; [.46D8.0020.0002] # SHAVIAN LETTER AWE +10478 ; [.46D9.0020.0002] # SHAVIAN LETTER ARE +10479 ; [.46DA.0020.0002] # SHAVIAN LETTER OR +1047A ; [.46DB.0020.0002] # SHAVIAN LETTER AIR +1047B ; [.46DC.0020.0002] # SHAVIAN LETTER ERR +1047C ; [.46DD.0020.0002] # SHAVIAN LETTER ARRAY +1047D ; [.46DE.0020.0002] # SHAVIAN LETTER EAR +1047E ; [.46DF.0020.0002] # SHAVIAN LETTER IAN +1047F ; [.46E0.0020.0002] # SHAVIAN LETTER YEW +1BC00 ; [.46E1.0020.0002] # DUPLOYAN LETTER H +1BC01 ; [.46E2.0020.0002] # DUPLOYAN LETTER X +1BC02 ; [.46E3.0020.0002] # DUPLOYAN LETTER P +1BC03 ; [.46E4.0020.0002] # DUPLOYAN LETTER T +1BC04 ; [.46E5.0020.0002] # DUPLOYAN LETTER F +1BC05 ; [.46E6.0020.0002] # DUPLOYAN LETTER K +1BC06 ; [.46E7.0020.0002] # DUPLOYAN LETTER L +1BC07 ; [.46E8.0020.0002] # DUPLOYAN LETTER B +1BC08 ; [.46E9.0020.0002] # DUPLOYAN LETTER D +1BC09 ; [.46EA.0020.0002] # DUPLOYAN LETTER V +1BC0A ; [.46EB.0020.0002] # DUPLOYAN LETTER G +1BC0B ; [.46EC.0020.0002] # DUPLOYAN LETTER R +1BC0C ; [.46ED.0020.0002] # DUPLOYAN LETTER P N +1BC0D ; [.46EE.0020.0002] # DUPLOYAN LETTER D S +1BC0E ; [.46EF.0020.0002] # DUPLOYAN LETTER F N +1BC0F ; [.46F0.0020.0002] # DUPLOYAN LETTER K M +1BC10 ; [.46F1.0020.0002] # DUPLOYAN LETTER R S +1BC11 ; [.46F2.0020.0002] # DUPLOYAN LETTER TH +1BC12 ; [.46F3.0020.0002] # DUPLOYAN LETTER SLOAN DH +1BC13 ; [.46F4.0020.0002] # DUPLOYAN LETTER DH +1BC14 ; [.46F5.0020.0002] # DUPLOYAN LETTER KK +1BC15 ; [.46F6.0020.0002] # DUPLOYAN LETTER SLOAN J +1BC16 ; [.46F7.0020.0002] # DUPLOYAN LETTER HL +1BC17 ; [.46F8.0020.0002] # DUPLOYAN LETTER LH +1BC18 ; [.46F9.0020.0002] # DUPLOYAN LETTER RH +1BC19 ; [.46FA.0020.0002] # DUPLOYAN LETTER M +1BC1A ; [.46FB.0020.0002] # DUPLOYAN LETTER N +1BC1B ; [.46FC.0020.0002] # DUPLOYAN LETTER J +1BC1C ; [.46FD.0020.0002] # DUPLOYAN LETTER S +1BC1D ; [.46FE.0020.0002] # DUPLOYAN LETTER M N +1BC1E ; [.46FF.0020.0002] # DUPLOYAN LETTER N M +1BC1F ; [.4700.0020.0002] # DUPLOYAN LETTER J M +1BC20 ; [.4701.0020.0002] # DUPLOYAN LETTER S J +1BC21 ; [.4702.0020.0002] # DUPLOYAN LETTER M WITH DOT +1BC22 ; [.4703.0020.0002] # DUPLOYAN LETTER N WITH DOT +1BC23 ; [.4704.0020.0002] # DUPLOYAN LETTER J WITH DOT +1BC24 ; [.4705.0020.0002] # DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE +1BC25 ; [.4706.0020.0002] # DUPLOYAN LETTER S WITH DOT +1BC26 ; [.4707.0020.0002] # DUPLOYAN LETTER S WITH DOT BELOW +1BC27 ; [.4708.0020.0002] # DUPLOYAN LETTER M S +1BC28 ; [.4709.0020.0002] # DUPLOYAN LETTER N S +1BC29 ; [.470A.0020.0002] # DUPLOYAN LETTER J S +1BC2A ; [.470B.0020.0002] # DUPLOYAN LETTER S S +1BC2B ; [.470C.0020.0002] # DUPLOYAN LETTER M N S +1BC2C ; [.470D.0020.0002] # DUPLOYAN LETTER N M S +1BC2D ; [.470E.0020.0002] # DUPLOYAN LETTER J M S +1BC2E ; [.470F.0020.0002] # DUPLOYAN LETTER S J S +1BC2F ; [.4710.0020.0002] # DUPLOYAN LETTER J S WITH DOT +1BC30 ; [.4711.0020.0002] # DUPLOYAN LETTER J N +1BC31 ; [.4712.0020.0002] # DUPLOYAN LETTER J N S +1BC32 ; [.4713.0020.0002] # DUPLOYAN LETTER S T +1BC33 ; [.4714.0020.0002] # DUPLOYAN LETTER S T R +1BC34 ; [.4715.0020.0002] # DUPLOYAN LETTER S P +1BC35 ; [.4716.0020.0002] # DUPLOYAN LETTER S P R +1BC36 ; [.4717.0020.0002] # DUPLOYAN LETTER T S +1BC37 ; [.4718.0020.0002] # DUPLOYAN LETTER T R S +1BC38 ; [.4719.0020.0002] # DUPLOYAN LETTER W +1BC39 ; [.471A.0020.0002] # DUPLOYAN LETTER WH +1BC3A ; [.471B.0020.0002] # DUPLOYAN LETTER W R +1BC3B ; [.471C.0020.0002] # DUPLOYAN LETTER S N +1BC3C ; [.471D.0020.0002] # DUPLOYAN LETTER S M +1BC3D ; [.471E.0020.0002] # DUPLOYAN LETTER K R S +1BC3E ; [.471F.0020.0002] # DUPLOYAN LETTER G R S +1BC3F ; [.4720.0020.0002] # DUPLOYAN LETTER S K +1BC40 ; [.4721.0020.0002] # DUPLOYAN LETTER S K R +1BC41 ; [.4722.0020.0002] # DUPLOYAN LETTER A +1BC42 ; [.4723.0020.0002] # DUPLOYAN LETTER SLOAN OW +1BC43 ; [.4724.0020.0002] # DUPLOYAN LETTER OA +1BC44 ; [.4725.0020.0002] # DUPLOYAN LETTER O +1BC45 ; [.4726.0020.0002] # DUPLOYAN LETTER AOU +1BC46 ; [.4727.0020.0002] # DUPLOYAN LETTER I +1BC47 ; [.4728.0020.0002] # DUPLOYAN LETTER E +1BC48 ; [.4729.0020.0002] # DUPLOYAN LETTER IE +1BC49 ; [.472A.0020.0002] # DUPLOYAN LETTER SHORT I +1BC4A ; [.472B.0020.0002] # DUPLOYAN LETTER UI +1BC4B ; [.472C.0020.0002] # DUPLOYAN LETTER EE +1BC4C ; [.472D.0020.0002] # DUPLOYAN LETTER SLOAN EH +1BC4D ; [.472E.0020.0002] # DUPLOYAN LETTER ROMANIAN I +1BC4E ; [.472F.0020.0002] # DUPLOYAN LETTER SLOAN EE +1BC4F ; [.4730.0020.0002] # DUPLOYAN LETTER LONG I +1BC50 ; [.4731.0020.0002] # DUPLOYAN LETTER YE +1BC51 ; [.4732.0020.0002] # DUPLOYAN LETTER U +1BC52 ; [.4733.0020.0002] # DUPLOYAN LETTER EU +1BC53 ; [.4734.0020.0002] # DUPLOYAN LETTER XW +1BC54 ; [.4735.0020.0002] # DUPLOYAN LETTER U N +1BC55 ; [.4736.0020.0002] # DUPLOYAN LETTER LONG U +1BC56 ; [.4737.0020.0002] # DUPLOYAN LETTER ROMANIAN U +1BC57 ; [.4738.0020.0002] # DUPLOYAN LETTER UH +1BC58 ; [.4739.0020.0002] # DUPLOYAN LETTER SLOAN U +1BC59 ; [.473A.0020.0002] # DUPLOYAN LETTER OOH +1BC5A ; [.473B.0020.0002] # DUPLOYAN LETTER OW +1BC5B ; [.473C.0020.0002] # DUPLOYAN LETTER OU +1BC5C ; [.473D.0020.0002] # DUPLOYAN LETTER WA +1BC5D ; [.473E.0020.0002] # DUPLOYAN LETTER WO +1BC5E ; [.473F.0020.0002] # DUPLOYAN LETTER WI +1BC5F ; [.4740.0020.0002] # DUPLOYAN LETTER WEI +1BC60 ; [.4741.0020.0002] # DUPLOYAN LETTER WOW +1BC61 ; [.4742.0020.0002] # DUPLOYAN LETTER NASAL U +1BC62 ; [.4743.0020.0002] # DUPLOYAN LETTER NASAL O +1BC63 ; [.4744.0020.0002] # DUPLOYAN LETTER NASAL I +1BC64 ; [.4745.0020.0002] # DUPLOYAN LETTER NASAL A +1BC65 ; [.4746.0020.0002] # DUPLOYAN LETTER PERNIN AN +1BC66 ; [.4747.0020.0002] # DUPLOYAN LETTER PERNIN AM +1BC67 ; [.4748.0020.0002] # DUPLOYAN LETTER SLOAN EN +1BC68 ; [.4749.0020.0002] # DUPLOYAN LETTER SLOAN AN +1BC69 ; [.474A.0020.0002] # DUPLOYAN LETTER SLOAN ON +1BC6A ; [.474B.0020.0002] # DUPLOYAN LETTER VOCALIC M +1BC70 ; [.474C.0020.0002] # DUPLOYAN AFFIX LEFT HORIZONTAL SECANT +1BC71 ; [.474D.0020.0002] # DUPLOYAN AFFIX MID HORIZONTAL SECANT +1BC72 ; [.474E.0020.0002] # DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT +1BC73 ; [.474F.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL SECANT +1BC74 ; [.4750.0020.0002] # DUPLOYAN AFFIX MID VERTICAL SECANT +1BC75 ; [.4751.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL SECANT +1BC76 ; [.4752.0020.0002] # DUPLOYAN AFFIX ATTACHED SECANT +1BC77 ; [.4753.0020.0002] # DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT +1BC78 ; [.4754.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT +1BC79 ; [.4755.0020.0002] # DUPLOYAN AFFIX ATTACHED TAIL +1BC7A ; [.4756.0020.0002] # DUPLOYAN AFFIX ATTACHED E HOOK +1BC7B ; [.4757.0020.0002] # DUPLOYAN AFFIX ATTACHED I HOOK +1BC7C ; [.4758.0020.0002] # DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80 ; [.4759.0020.0002] # DUPLOYAN AFFIX HIGH ACUTE +1BC81 ; [.475A.0020.0002] # DUPLOYAN AFFIX HIGH TIGHT ACUTE +1BC82 ; [.475B.0020.0002] # DUPLOYAN AFFIX HIGH GRAVE +1BC83 ; [.475C.0020.0002] # DUPLOYAN AFFIX HIGH LONG GRAVE +1BC84 ; [.475D.0020.0002] # DUPLOYAN AFFIX HIGH DOT +1BC85 ; [.475E.0020.0002] # DUPLOYAN AFFIX HIGH CIRCLE +1BC86 ; [.475F.0020.0002] # DUPLOYAN AFFIX HIGH LINE +1BC87 ; [.4760.0020.0002] # DUPLOYAN AFFIX HIGH WAVE +1BC88 ; [.4761.0020.0002] # DUPLOYAN AFFIX HIGH VERTICAL +1BC90 ; [.4762.0020.0002] # DUPLOYAN AFFIX LOW ACUTE +1BC91 ; [.4763.0020.0002] # DUPLOYAN AFFIX LOW TIGHT ACUTE +1BC92 ; [.4764.0020.0002] # DUPLOYAN AFFIX LOW GRAVE +1BC93 ; [.4765.0020.0002] # DUPLOYAN AFFIX LOW LONG GRAVE +1BC94 ; [.4766.0020.0002] # DUPLOYAN AFFIX LOW DOT +1BC95 ; [.4767.0020.0002] # DUPLOYAN AFFIX LOW CIRCLE +1BC96 ; [.4768.0020.0002] # DUPLOYAN AFFIX LOW LINE +1BC97 ; [.4769.0020.0002] # DUPLOYAN AFFIX LOW WAVE +1BC98 ; [.476A.0020.0002] # DUPLOYAN AFFIX LOW VERTICAL +1BC99 ; [.476B.0020.0002] # DUPLOYAN AFFIX LOW ARROW +10480 ; [.476C.0020.0002] # OSMANYA LETTER ALEF +10481 ; [.476D.0020.0002] # OSMANYA LETTER BA +10482 ; [.476E.0020.0002] # OSMANYA LETTER TA +10483 ; [.476F.0020.0002] # OSMANYA LETTER JA +10484 ; [.4770.0020.0002] # OSMANYA LETTER XA +10485 ; [.4771.0020.0002] # OSMANYA LETTER KHA +10486 ; [.4772.0020.0002] # OSMANYA LETTER DEEL +10487 ; [.4773.0020.0002] # OSMANYA LETTER RA +10488 ; [.4774.0020.0002] # OSMANYA LETTER SA +10489 ; [.4775.0020.0002] # OSMANYA LETTER SHIIN +1048A ; [.4776.0020.0002] # OSMANYA LETTER DHA +1048B ; [.4777.0020.0002] # OSMANYA LETTER CAYN +1048C ; [.4778.0020.0002] # OSMANYA LETTER GA +1048D ; [.4779.0020.0002] # OSMANYA LETTER FA +1048E ; [.477A.0020.0002] # OSMANYA LETTER QAAF +1048F ; [.477B.0020.0002] # OSMANYA LETTER KAAF +10490 ; [.477C.0020.0002] # OSMANYA LETTER LAAN +10491 ; [.477D.0020.0002] # OSMANYA LETTER MIIN +10492 ; [.477E.0020.0002] # OSMANYA LETTER NUUN +10493 ; [.477F.0020.0002] # OSMANYA LETTER WAW +10494 ; [.4780.0020.0002] # OSMANYA LETTER HA +10495 ; [.4781.0020.0002] # OSMANYA LETTER YA +10496 ; [.4782.0020.0002] # OSMANYA LETTER A +10497 ; [.4783.0020.0002] # OSMANYA LETTER E +10498 ; [.4784.0020.0002] # OSMANYA LETTER I +10499 ; [.4785.0020.0002] # OSMANYA LETTER O +1049A ; [.4786.0020.0002] # OSMANYA LETTER U +1049B ; [.4787.0020.0002] # OSMANYA LETTER AA +1049C ; [.4788.0020.0002] # OSMANYA LETTER EE +1049D ; [.4789.0020.0002] # OSMANYA LETTER OO +10500 ; [.478A.0020.0002] # ELBASAN LETTER A +10501 ; [.478B.0020.0002] # ELBASAN LETTER BE +10502 ; [.478C.0020.0002] # ELBASAN LETTER CE +10503 ; [.478D.0020.0002] # ELBASAN LETTER CHE +10504 ; [.478E.0020.0002] # ELBASAN LETTER DE +10505 ; [.478F.0020.0002] # ELBASAN LETTER NDE +10506 ; [.4790.0020.0002] # ELBASAN LETTER DHE +10507 ; [.4791.0020.0002] # ELBASAN LETTER EI +10508 ; [.4792.0020.0002] # ELBASAN LETTER E +10509 ; [.4793.0020.0002] # ELBASAN LETTER FE +1050A ; [.4794.0020.0002] # ELBASAN LETTER GE +1050B ; [.4795.0020.0002] # ELBASAN LETTER GJE +1050C ; [.4796.0020.0002] # ELBASAN LETTER HE +1050D ; [.4797.0020.0002] # ELBASAN LETTER I +1050E ; [.4798.0020.0002] # ELBASAN LETTER JE +1050F ; [.4799.0020.0002] # ELBASAN LETTER KE +10510 ; [.479A.0020.0002] # ELBASAN LETTER LE +10511 ; [.479B.0020.0002] # ELBASAN LETTER LLE +10512 ; [.479C.0020.0002] # ELBASAN LETTER ME +10513 ; [.479D.0020.0002] # ELBASAN LETTER NE +10514 ; [.479E.0020.0002] # ELBASAN LETTER NA +10515 ; [.479F.0020.0002] # ELBASAN LETTER NJE +10516 ; [.47A0.0020.0002] # ELBASAN LETTER O +10517 ; [.47A1.0020.0002] # ELBASAN LETTER PE +10518 ; [.47A2.0020.0002] # ELBASAN LETTER QE +10519 ; [.47A3.0020.0002] # ELBASAN LETTER RE +1051A ; [.47A4.0020.0002] # ELBASAN LETTER RRE +1051B ; [.47A5.0020.0002] # ELBASAN LETTER SE +1051C ; [.47A6.0020.0002] # ELBASAN LETTER SHE +1051D ; [.47A7.0020.0002] # ELBASAN LETTER TE +1051E ; [.47A8.0020.0002] # ELBASAN LETTER THE +1051F ; [.47A9.0020.0002] # ELBASAN LETTER U +10520 ; [.47AA.0020.0002] # ELBASAN LETTER VE +10521 ; [.47AB.0020.0002] # ELBASAN LETTER XE +10522 ; [.47AC.0020.0002] # ELBASAN LETTER Y +10523 ; [.47AD.0020.0002] # ELBASAN LETTER ZE +10524 ; [.47AE.0020.0002] # ELBASAN LETTER ZHE +10525 ; [.47AF.0020.0002] # ELBASAN LETTER GHE +10526 ; [.47B0.0020.0002] # ELBASAN LETTER GHAMMA +10527 ; [.47B1.0020.0002] # ELBASAN LETTER KHE +10530 ; [.47B2.0020.0002] # CAUCASIAN ALBANIAN LETTER ALT +10531 ; [.47B3.0020.0002] # CAUCASIAN ALBANIAN LETTER BET +10532 ; [.47B4.0020.0002] # CAUCASIAN ALBANIAN LETTER GIM +10533 ; [.47B5.0020.0002] # CAUCASIAN ALBANIAN LETTER DAT +10534 ; [.47B6.0020.0002] # CAUCASIAN ALBANIAN LETTER EB +10535 ; [.47B7.0020.0002] # CAUCASIAN ALBANIAN LETTER ZARL +10536 ; [.47B8.0020.0002] # CAUCASIAN ALBANIAN LETTER EYN +10537 ; [.47B9.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHIL +10538 ; [.47BA.0020.0002] # CAUCASIAN ALBANIAN LETTER TAS +10539 ; [.47BB.0020.0002] # CAUCASIAN ALBANIAN LETTER CHA +1053A ; [.47BC.0020.0002] # CAUCASIAN ALBANIAN LETTER YOWD +1053B ; [.47BD.0020.0002] # CAUCASIAN ALBANIAN LETTER ZHA +1053C ; [.47BE.0020.0002] # CAUCASIAN ALBANIAN LETTER IRB +1053D ; [.47BF.0020.0002] # CAUCASIAN ALBANIAN LETTER SHA +1053E ; [.47C0.0020.0002] # CAUCASIAN ALBANIAN LETTER LAN +1053F ; [.47C1.0020.0002] # CAUCASIAN ALBANIAN LETTER INYA +10540 ; [.47C2.0020.0002] # CAUCASIAN ALBANIAN LETTER XEYN +10541 ; [.47C3.0020.0002] # CAUCASIAN ALBANIAN LETTER DYAN +10542 ; [.47C4.0020.0002] # CAUCASIAN ALBANIAN LETTER CAR +10543 ; [.47C5.0020.0002] # CAUCASIAN ALBANIAN LETTER JHOX +10544 ; [.47C6.0020.0002] # CAUCASIAN ALBANIAN LETTER KAR +10545 ; [.47C7.0020.0002] # CAUCASIAN ALBANIAN LETTER LYIT +10546 ; [.47C8.0020.0002] # CAUCASIAN ALBANIAN LETTER HEYT +10547 ; [.47C9.0020.0002] # CAUCASIAN ALBANIAN LETTER QAY +10548 ; [.47CA.0020.0002] # CAUCASIAN ALBANIAN LETTER AOR +10549 ; [.47CB.0020.0002] # CAUCASIAN ALBANIAN LETTER CHOY +1054A ; [.47CC.0020.0002] # CAUCASIAN ALBANIAN LETTER CHI +1054B ; [.47CD.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAY +1054C ; [.47CE.0020.0002] # CAUCASIAN ALBANIAN LETTER MAQ +1054D ; [.47CF.0020.0002] # CAUCASIAN ALBANIAN LETTER QAR +1054E ; [.47D0.0020.0002] # CAUCASIAN ALBANIAN LETTER NOWC +1054F ; [.47D1.0020.0002] # CAUCASIAN ALBANIAN LETTER DZYAY +10550 ; [.47D2.0020.0002] # CAUCASIAN ALBANIAN LETTER SHAK +10551 ; [.47D3.0020.0002] # CAUCASIAN ALBANIAN LETTER JAYN +10552 ; [.47D4.0020.0002] # CAUCASIAN ALBANIAN LETTER ON +10553 ; [.47D5.0020.0002] # CAUCASIAN ALBANIAN LETTER TYAY +10554 ; [.47D6.0020.0002] # CAUCASIAN ALBANIAN LETTER FAM +10555 ; [.47D7.0020.0002] # CAUCASIAN ALBANIAN LETTER DZAY +10556 ; [.47D8.0020.0002] # CAUCASIAN ALBANIAN LETTER CHAT +10557 ; [.47D9.0020.0002] # CAUCASIAN ALBANIAN LETTER PEN +10558 ; [.47DA.0020.0002] # CAUCASIAN ALBANIAN LETTER GHEYS +10559 ; [.47DB.0020.0002] # CAUCASIAN ALBANIAN LETTER RAT +1055A ; [.47DC.0020.0002] # CAUCASIAN ALBANIAN LETTER SEYK +1055B ; [.47DD.0020.0002] # CAUCASIAN ALBANIAN LETTER VEYZ +1055C ; [.47DE.0020.0002] # CAUCASIAN ALBANIAN LETTER TIWR +1055D ; [.47DF.0020.0002] # CAUCASIAN ALBANIAN LETTER SHOY +1055E ; [.47E0.0020.0002] # CAUCASIAN ALBANIAN LETTER IWN +1055F ; [.47E1.0020.0002] # CAUCASIAN ALBANIAN LETTER CYAW +10560 ; [.47E2.0020.0002] # CAUCASIAN ALBANIAN LETTER CAYN +10561 ; [.47E3.0020.0002] # CAUCASIAN ALBANIAN LETTER YAYD +10562 ; [.47E4.0020.0002] # CAUCASIAN ALBANIAN LETTER PIWR +10563 ; [.47E5.0020.0002] # CAUCASIAN ALBANIAN LETTER KIW +110D0 ; [.47E6.0020.0002] # SORA SOMPENG LETTER SAH +110D1 ; [.47E7.0020.0002] # SORA SOMPENG LETTER TAH +110D2 ; [.47E8.0020.0002] # SORA SOMPENG LETTER BAH +110D3 ; [.47E9.0020.0002] # SORA SOMPENG LETTER CAH +110D4 ; [.47EA.0020.0002] # SORA SOMPENG LETTER DAH +110D5 ; [.47EB.0020.0002] # SORA SOMPENG LETTER GAH +110D6 ; [.47EC.0020.0002] # SORA SOMPENG LETTER MAH +110D7 ; [.47ED.0020.0002] # SORA SOMPENG LETTER NGAH +110D8 ; [.47EE.0020.0002] # SORA SOMPENG LETTER LAH +110D9 ; [.47EF.0020.0002] # SORA SOMPENG LETTER NAH +110DA ; [.47F0.0020.0002] # SORA SOMPENG LETTER VAH +110DB ; [.47F1.0020.0002] # SORA SOMPENG LETTER PAH +110DC ; [.47F2.0020.0002] # SORA SOMPENG LETTER YAH +110DD ; [.47F3.0020.0002] # SORA SOMPENG LETTER RAH +110DE ; [.47F4.0020.0002] # SORA SOMPENG LETTER HAH +110DF ; [.47F5.0020.0002] # SORA SOMPENG LETTER KAH +110E0 ; [.47F6.0020.0002] # SORA SOMPENG LETTER JAH +110E1 ; [.47F7.0020.0002] # SORA SOMPENG LETTER NYAH +110E2 ; [.47F8.0020.0002] # SORA SOMPENG LETTER AH +110E3 ; [.47F9.0020.0002] # SORA SOMPENG LETTER EEH +110E4 ; [.47FA.0020.0002] # SORA SOMPENG LETTER IH +110E5 ; [.47FB.0020.0002] # SORA SOMPENG LETTER UH +110E6 ; [.47FC.0020.0002] # SORA SOMPENG LETTER OH +110E7 ; [.47FD.0020.0002] # SORA SOMPENG LETTER EH +110E8 ; [.47FE.0020.0002] # SORA SOMPENG LETTER MAE +16A40 ; [.47FF.0020.0002] # MRO LETTER TA +16A41 ; [.4800.0020.0002] # MRO LETTER NGI +16A42 ; [.4801.0020.0002] # MRO LETTER YO +16A43 ; [.4802.0020.0002] # MRO LETTER MIM +16A44 ; [.4803.0020.0002] # MRO LETTER BA +16A45 ; [.4804.0020.0002] # MRO LETTER DA +16A46 ; [.4805.0020.0002] # MRO LETTER A +16A47 ; [.4806.0020.0002] # MRO LETTER PHI +16A48 ; [.4807.0020.0002] # MRO LETTER KHAI +16A49 ; [.4808.0020.0002] # MRO LETTER HAO +16A4A ; [.4809.0020.0002] # MRO LETTER DAI +16A4B ; [.480A.0020.0002] # MRO LETTER CHU +16A4C ; [.480B.0020.0002] # MRO LETTER KEAAE +16A4D ; [.480C.0020.0002] # MRO LETTER OL +16A4E ; [.480D.0020.0002] # MRO LETTER MAEM +16A4F ; [.480E.0020.0002] # MRO LETTER NIN +16A50 ; [.480F.0020.0002] # MRO LETTER PA +16A51 ; [.4810.0020.0002] # MRO LETTER OO +16A52 ; [.4811.0020.0002] # MRO LETTER O +16A53 ; [.4812.0020.0002] # MRO LETTER RO +16A54 ; [.4813.0020.0002] # MRO LETTER SHI +16A55 ; [.4814.0020.0002] # MRO LETTER THEA +16A56 ; [.4815.0020.0002] # MRO LETTER EA +16A57 ; [.4816.0020.0002] # MRO LETTER WA +16A58 ; [.4817.0020.0002] # MRO LETTER E +16A59 ; [.4818.0020.0002] # MRO LETTER KO +16A5A ; [.4819.0020.0002] # MRO LETTER LAN +16A5B ; [.481A.0020.0002] # MRO LETTER LA +16A5C ; [.481B.0020.0002] # MRO LETTER HAI +16A5D ; [.481C.0020.0002] # MRO LETTER RI +16A5E ; [.481D.0020.0002] # MRO LETTER TEK +10000 ; [.481E.0020.0002] # LINEAR B SYLLABLE B008 A +10001 ; [.481F.0020.0002] # LINEAR B SYLLABLE B038 E +10002 ; [.4820.0020.0002] # LINEAR B SYLLABLE B028 I +10003 ; [.4821.0020.0002] # LINEAR B SYLLABLE B061 O +10004 ; [.4822.0020.0002] # LINEAR B SYLLABLE B010 U +10005 ; [.4823.0020.0002] # LINEAR B SYLLABLE B001 DA +10006 ; [.4824.0020.0002] # LINEAR B SYLLABLE B045 DE +10007 ; [.4825.0020.0002] # LINEAR B SYLLABLE B007 DI +10008 ; [.4826.0020.0002] # LINEAR B SYLLABLE B014 DO +10009 ; [.4827.0020.0002] # LINEAR B SYLLABLE B051 DU +1000A ; [.4828.0020.0002] # LINEAR B SYLLABLE B057 JA +1000B ; [.4829.0020.0002] # LINEAR B SYLLABLE B046 JE +1000D ; [.482A.0020.0002] # LINEAR B SYLLABLE B036 JO +1000E ; [.482B.0020.0002] # LINEAR B SYLLABLE B065 JU +1000F ; [.482C.0020.0002] # LINEAR B SYLLABLE B077 KA +10010 ; [.482D.0020.0002] # LINEAR B SYLLABLE B044 KE +10011 ; [.482E.0020.0002] # LINEAR B SYLLABLE B067 KI +10012 ; [.482F.0020.0002] # LINEAR B SYLLABLE B070 KO +10013 ; [.4830.0020.0002] # LINEAR B SYLLABLE B081 KU +10014 ; [.4831.0020.0002] # LINEAR B SYLLABLE B080 MA +10015 ; [.4832.0020.0002] # LINEAR B SYLLABLE B013 ME +10016 ; [.4833.0020.0002] # LINEAR B SYLLABLE B073 MI +10017 ; [.4834.0020.0002] # LINEAR B SYLLABLE B015 MO +10018 ; [.4835.0020.0002] # LINEAR B SYLLABLE B023 MU +10019 ; [.4836.0020.0002] # LINEAR B SYLLABLE B006 NA +1001A ; [.4837.0020.0002] # LINEAR B SYLLABLE B024 NE +1001B ; [.4838.0020.0002] # LINEAR B SYLLABLE B030 NI +1001C ; [.4839.0020.0002] # LINEAR B SYLLABLE B052 NO +1001D ; [.483A.0020.0002] # LINEAR B SYLLABLE B055 NU +1001E ; [.483B.0020.0002] # LINEAR B SYLLABLE B003 PA +1001F ; [.483C.0020.0002] # LINEAR B SYLLABLE B072 PE +10020 ; [.483D.0020.0002] # LINEAR B SYLLABLE B039 PI +10021 ; [.483E.0020.0002] # LINEAR B SYLLABLE B011 PO +10022 ; [.483F.0020.0002] # LINEAR B SYLLABLE B050 PU +10023 ; [.4840.0020.0002] # LINEAR B SYLLABLE B016 QA +10024 ; [.4841.0020.0002] # LINEAR B SYLLABLE B078 QE +10025 ; [.4842.0020.0002] # LINEAR B SYLLABLE B021 QI +10026 ; [.4843.0020.0002] # LINEAR B SYLLABLE B032 QO +10028 ; [.4844.0020.0002] # LINEAR B SYLLABLE B060 RA +10029 ; [.4845.0020.0002] # LINEAR B SYLLABLE B027 RE +1002A ; [.4846.0020.0002] # LINEAR B SYLLABLE B053 RI +1002B ; [.4847.0020.0002] # LINEAR B SYLLABLE B002 RO +1002C ; [.4848.0020.0002] # LINEAR B SYLLABLE B026 RU +1002D ; [.4849.0020.0002] # LINEAR B SYLLABLE B031 SA +1002E ; [.484A.0020.0002] # LINEAR B SYLLABLE B009 SE +1002F ; [.484B.0020.0002] # LINEAR B SYLLABLE B041 SI +10030 ; [.484C.0020.0002] # LINEAR B SYLLABLE B012 SO +10031 ; [.484D.0020.0002] # LINEAR B SYLLABLE B058 SU +10032 ; [.484E.0020.0002] # LINEAR B SYLLABLE B059 TA +10033 ; [.484F.0020.0002] # LINEAR B SYLLABLE B004 TE +10034 ; [.4850.0020.0002] # LINEAR B SYLLABLE B037 TI +10035 ; [.4851.0020.0002] # LINEAR B SYLLABLE B005 TO +10036 ; [.4852.0020.0002] # LINEAR B SYLLABLE B069 TU +10037 ; [.4853.0020.0002] # LINEAR B SYLLABLE B054 WA +10038 ; [.4854.0020.0002] # LINEAR B SYLLABLE B075 WE +10039 ; [.4855.0020.0002] # LINEAR B SYLLABLE B040 WI +1003A ; [.4856.0020.0002] # LINEAR B SYLLABLE B042 WO +1003C ; [.4857.0020.0002] # LINEAR B SYLLABLE B017 ZA +1003D ; [.4858.0020.0002] # LINEAR B SYLLABLE B074 ZE +1003F ; [.4859.0020.0002] # LINEAR B SYLLABLE B020 ZO +10040 ; [.485A.0020.0002] # LINEAR B SYLLABLE B025 A2 +10041 ; [.485B.0020.0002] # LINEAR B SYLLABLE B043 A3 +10042 ; [.485C.0020.0002] # LINEAR B SYLLABLE B085 AU +10043 ; [.485D.0020.0002] # LINEAR B SYLLABLE B071 DWE +10044 ; [.485E.0020.0002] # LINEAR B SYLLABLE B090 DWO +10045 ; [.485F.0020.0002] # LINEAR B SYLLABLE B048 NWA +10046 ; [.4860.0020.0002] # LINEAR B SYLLABLE B029 PU2 +10047 ; [.4861.0020.0002] # LINEAR B SYLLABLE B062 PTE +10048 ; [.4862.0020.0002] # LINEAR B SYLLABLE B076 RA2 +10049 ; [.4863.0020.0002] # LINEAR B SYLLABLE B033 RA3 +1004A ; [.4864.0020.0002] # LINEAR B SYLLABLE B068 RO2 +1004B ; [.4865.0020.0002] # LINEAR B SYLLABLE B066 TA2 +1004C ; [.4866.0020.0002] # LINEAR B SYLLABLE B087 TWE +1004D ; [.4867.0020.0002] # LINEAR B SYLLABLE B091 TWO +10050 ; [.4868.0020.0002] # LINEAR B SYMBOL B018 +10051 ; [.4869.0020.0002] # LINEAR B SYMBOL B019 +10052 ; [.486A.0020.0002] # LINEAR B SYMBOL B022 +10053 ; [.486B.0020.0002] # LINEAR B SYMBOL B034 +10054 ; [.486C.0020.0002] # LINEAR B SYMBOL B047 +10055 ; [.486D.0020.0002] # LINEAR B SYMBOL B049 +10056 ; [.486E.0020.0002] # LINEAR B SYMBOL B056 +10057 ; [.486F.0020.0002] # LINEAR B SYMBOL B063 +10058 ; [.4870.0020.0002] # LINEAR B SYMBOL B064 +10059 ; [.4871.0020.0002] # LINEAR B SYMBOL B079 +1005A ; [.4872.0020.0002] # LINEAR B SYMBOL B082 +1005B ; [.4873.0020.0002] # LINEAR B SYMBOL B083 +1005C ; [.4874.0020.0002] # LINEAR B SYMBOL B086 +1005D ; [.4875.0020.0002] # LINEAR B SYMBOL B089 +10080 ; [.4876.0020.0002] # LINEAR B IDEOGRAM B100 MAN +10081 ; [.4877.0020.0002] # LINEAR B IDEOGRAM B102 WOMAN +10082 ; [.4878.0020.0002] # LINEAR B IDEOGRAM B104 DEER +10083 ; [.4879.0020.0002] # LINEAR B IDEOGRAM B105 EQUID +10084 ; [.487A.0020.0002] # LINEAR B IDEOGRAM B105F MARE +10085 ; [.487B.0020.0002] # LINEAR B IDEOGRAM B105M STALLION +10086 ; [.487C.0020.0002] # LINEAR B IDEOGRAM B106F EWE +10087 ; [.487D.0020.0002] # LINEAR B IDEOGRAM B106M RAM +10088 ; [.487E.0020.0002] # LINEAR B IDEOGRAM B107F SHE-GOAT +10089 ; [.487F.0020.0002] # LINEAR B IDEOGRAM B107M HE-GOAT +1008A ; [.4880.0020.0002] # LINEAR B IDEOGRAM B108F SOW +1008B ; [.4881.0020.0002] # LINEAR B IDEOGRAM B108M BOAR +1008C ; [.4882.0020.0002] # LINEAR B IDEOGRAM B109F COW +1008D ; [.4883.0020.0002] # LINEAR B IDEOGRAM B109M BULL +1008E ; [.4884.0020.0002] # LINEAR B IDEOGRAM B120 WHEAT +1008F ; [.4885.0020.0002] # LINEAR B IDEOGRAM B121 BARLEY +10090 ; [.4886.0020.0002] # LINEAR B IDEOGRAM B122 OLIVE +10091 ; [.4887.0020.0002] # LINEAR B IDEOGRAM B123 SPICE +10092 ; [.4888.0020.0002] # LINEAR B IDEOGRAM B125 CYPERUS +10093 ; [.4889.0020.0002] # LINEAR B MONOGRAM B127 KAPO +10094 ; [.488A.0020.0002] # LINEAR B MONOGRAM B128 KANAKO +10095 ; [.488B.0020.0002] # LINEAR B IDEOGRAM B130 OIL +10096 ; [.488C.0020.0002] # LINEAR B IDEOGRAM B131 WINE +10097 ; [.488D.0020.0002] # LINEAR B IDEOGRAM B132 +10098 ; [.488E.0020.0002] # LINEAR B MONOGRAM B133 AREPA +10099 ; [.488F.0020.0002] # LINEAR B MONOGRAM B135 MERI +1009A ; [.4890.0020.0002] # LINEAR B IDEOGRAM B140 BRONZE +1009B ; [.4891.0020.0002] # LINEAR B IDEOGRAM B141 GOLD +1009C ; [.4892.0020.0002] # LINEAR B IDEOGRAM B142 +1009D ; [.4893.0020.0002] # LINEAR B IDEOGRAM B145 WOOL +1009E ; [.4894.0020.0002] # LINEAR B IDEOGRAM B146 +1009F ; [.4895.0020.0002] # LINEAR B IDEOGRAM B150 +100A0 ; [.4896.0020.0002] # LINEAR B IDEOGRAM B151 HORN +100A1 ; [.4897.0020.0002] # LINEAR B IDEOGRAM B152 +100A2 ; [.4898.0020.0002] # LINEAR B IDEOGRAM B153 +100A3 ; [.4899.0020.0002] # LINEAR B IDEOGRAM B154 +100A4 ; [.489A.0020.0002] # LINEAR B MONOGRAM B156 TURO2 +100A5 ; [.489B.0020.0002] # LINEAR B IDEOGRAM B157 +100A6 ; [.489C.0020.0002] # LINEAR B IDEOGRAM B158 +100A7 ; [.489D.0020.0002] # LINEAR B IDEOGRAM B159 CLOTH +100A8 ; [.489E.0020.0002] # LINEAR B IDEOGRAM B160 +100A9 ; [.489F.0020.0002] # LINEAR B IDEOGRAM B161 +100AA ; [.48A0.0020.0002] # LINEAR B IDEOGRAM B162 GARMENT +100AB ; [.48A1.0020.0002] # LINEAR B IDEOGRAM B163 ARMOUR +100AC ; [.48A2.0020.0002] # LINEAR B IDEOGRAM B164 +100AD ; [.48A3.0020.0002] # LINEAR B IDEOGRAM B165 +100AE ; [.48A4.0020.0002] # LINEAR B IDEOGRAM B166 +100AF ; [.48A5.0020.0002] # LINEAR B IDEOGRAM B167 +100B0 ; [.48A6.0020.0002] # LINEAR B IDEOGRAM B168 +100B1 ; [.48A7.0020.0002] # LINEAR B IDEOGRAM B169 +100B2 ; [.48A8.0020.0002] # LINEAR B IDEOGRAM B170 +100B3 ; [.48A9.0020.0002] # LINEAR B IDEOGRAM B171 +100B4 ; [.48AA.0020.0002] # LINEAR B IDEOGRAM B172 +100B5 ; [.48AB.0020.0002] # LINEAR B IDEOGRAM B173 MONTH +100B6 ; [.48AC.0020.0002] # LINEAR B IDEOGRAM B174 +100B7 ; [.48AD.0020.0002] # LINEAR B IDEOGRAM B176 TREE +100B8 ; [.48AE.0020.0002] # LINEAR B IDEOGRAM B177 +100B9 ; [.48AF.0020.0002] # LINEAR B IDEOGRAM B178 +100BA ; [.48B0.0020.0002] # LINEAR B IDEOGRAM B179 +100BB ; [.48B1.0020.0002] # LINEAR B IDEOGRAM B180 +100BC ; [.48B2.0020.0002] # LINEAR B IDEOGRAM B181 +100BD ; [.48B3.0020.0002] # LINEAR B IDEOGRAM B182 +100BE ; [.48B4.0020.0002] # LINEAR B IDEOGRAM B183 +100BF ; [.48B5.0020.0002] # LINEAR B IDEOGRAM B184 +100C0 ; [.48B6.0020.0002] # LINEAR B IDEOGRAM B185 +100C1 ; [.48B7.0020.0002] # LINEAR B IDEOGRAM B189 +100C2 ; [.48B8.0020.0002] # LINEAR B IDEOGRAM B190 +100C3 ; [.48B9.0020.0002] # LINEAR B IDEOGRAM B191 HELMET +100C4 ; [.48BA.0020.0002] # LINEAR B IDEOGRAM B220 FOOTSTOOL +100C5 ; [.48BB.0020.0002] # LINEAR B IDEOGRAM B225 BATHTUB +100C6 ; [.48BC.0020.0002] # LINEAR B IDEOGRAM B230 SPEAR +100C7 ; [.48BD.0020.0002] # LINEAR B IDEOGRAM B231 ARROW +100C8 ; [.48BE.0020.0002] # LINEAR B IDEOGRAM B232 +100C9 ; [.48BF.0020.0002] # LINEAR B IDEOGRAM B233 SWORD +100CA ; [.48C0.0020.0002] # LINEAR B IDEOGRAM B234 +100CB ; [.48C1.0020.0002] # LINEAR B IDEOGRAM B236 +100CC ; [.48C2.0020.0002] # LINEAR B IDEOGRAM B240 WHEELED CHARIOT +100CD ; [.48C3.0020.0002] # LINEAR B IDEOGRAM B241 CHARIOT +100CE ; [.48C4.0020.0002] # LINEAR B IDEOGRAM B242 CHARIOT FRAME +100CF ; [.48C5.0020.0002] # LINEAR B IDEOGRAM B243 WHEEL +100D0 ; [.48C6.0020.0002] # LINEAR B IDEOGRAM B245 +100D1 ; [.48C7.0020.0002] # LINEAR B IDEOGRAM B246 +100D2 ; [.48C8.0020.0002] # LINEAR B MONOGRAM B247 DIPTE +100D3 ; [.48C9.0020.0002] # LINEAR B IDEOGRAM B248 +100D4 ; [.48CA.0020.0002] # LINEAR B IDEOGRAM B249 +100D5 ; [.48CB.0020.0002] # LINEAR B IDEOGRAM B251 +100D6 ; [.48CC.0020.0002] # LINEAR B IDEOGRAM B252 +100D7 ; [.48CD.0020.0002] # LINEAR B IDEOGRAM B253 +100D8 ; [.48CE.0020.0002] # LINEAR B IDEOGRAM B254 DART +100D9 ; [.48CF.0020.0002] # LINEAR B IDEOGRAM B255 +100DA ; [.48D0.0020.0002] # LINEAR B IDEOGRAM B256 +100DB ; [.48D1.0020.0002] # LINEAR B IDEOGRAM B257 +100DC ; [.48D2.0020.0002] # LINEAR B IDEOGRAM B258 +100DD ; [.48D3.0020.0002] # LINEAR B IDEOGRAM B259 +100DE ; [.48D4.0020.0002] # LINEAR B IDEOGRAM VESSEL B155 +100DF ; [.48D5.0020.0002] # LINEAR B IDEOGRAM VESSEL B200 +100E0 ; [.48D6.0020.0002] # LINEAR B IDEOGRAM VESSEL B201 +100E1 ; [.48D7.0020.0002] # LINEAR B IDEOGRAM VESSEL B202 +100E2 ; [.48D8.0020.0002] # LINEAR B IDEOGRAM VESSEL B203 +100E3 ; [.48D9.0020.0002] # LINEAR B IDEOGRAM VESSEL B204 +100E4 ; [.48DA.0020.0002] # LINEAR B IDEOGRAM VESSEL B205 +100E5 ; [.48DB.0020.0002] # LINEAR B IDEOGRAM VESSEL B206 +100E6 ; [.48DC.0020.0002] # LINEAR B IDEOGRAM VESSEL B207 +100E7 ; [.48DD.0020.0002] # LINEAR B IDEOGRAM VESSEL B208 +100E8 ; [.48DE.0020.0002] # LINEAR B IDEOGRAM VESSEL B209 +100E9 ; [.48DF.0020.0002] # LINEAR B IDEOGRAM VESSEL B210 +100EA ; [.48E0.0020.0002] # LINEAR B IDEOGRAM VESSEL B211 +100EB ; [.48E1.0020.0002] # LINEAR B IDEOGRAM VESSEL B212 +100EC ; [.48E2.0020.0002] # LINEAR B IDEOGRAM VESSEL B213 +100ED ; [.48E3.0020.0002] # LINEAR B IDEOGRAM VESSEL B214 +100EE ; [.48E4.0020.0002] # LINEAR B IDEOGRAM VESSEL B215 +100EF ; [.48E5.0020.0002] # LINEAR B IDEOGRAM VESSEL B216 +100F0 ; [.48E6.0020.0002] # LINEAR B IDEOGRAM VESSEL B217 +100F1 ; [.48E7.0020.0002] # LINEAR B IDEOGRAM VESSEL B218 +100F2 ; [.48E8.0020.0002] # LINEAR B IDEOGRAM VESSEL B219 +100F3 ; [.48E9.0020.0002] # LINEAR B IDEOGRAM VESSEL B221 +100F4 ; [.48EA.0020.0002] # LINEAR B IDEOGRAM VESSEL B222 +100F5 ; [.48EB.0020.0002] # LINEAR B IDEOGRAM VESSEL B226 +100F6 ; [.48EC.0020.0002] # LINEAR B IDEOGRAM VESSEL B227 +100F7 ; [.48ED.0020.0002] # LINEAR B IDEOGRAM VESSEL B228 +100F8 ; [.48EE.0020.0002] # LINEAR B IDEOGRAM VESSEL B229 +100F9 ; [.48EF.0020.0002] # LINEAR B IDEOGRAM VESSEL B250 +100FA ; [.48F0.0020.0002] # LINEAR B IDEOGRAM VESSEL B305 +10600 ; [.48F1.0020.0002] # LINEAR A SIGN AB001 +10601 ; [.48F2.0020.0002] # LINEAR A SIGN AB002 +10602 ; [.48F3.0020.0002] # LINEAR A SIGN AB003 +10603 ; [.48F4.0020.0002] # LINEAR A SIGN AB004 +10604 ; [.48F5.0020.0002] # LINEAR A SIGN AB005 +10605 ; [.48F6.0020.0002] # LINEAR A SIGN AB006 +10606 ; [.48F7.0020.0002] # LINEAR A SIGN AB007 +10607 ; [.48F8.0020.0002] # LINEAR A SIGN AB008 +10608 ; [.48F9.0020.0002] # LINEAR A SIGN AB009 +10609 ; [.48FA.0020.0002] # LINEAR A SIGN AB010 +1060A ; [.48FB.0020.0002] # LINEAR A SIGN AB011 +1060B ; [.48FC.0020.0002] # LINEAR A SIGN AB013 +1060C ; [.48FD.0020.0002] # LINEAR A SIGN AB016 +1060D ; [.48FE.0020.0002] # LINEAR A SIGN AB017 +1060E ; [.48FF.0020.0002] # LINEAR A SIGN AB020 +1060F ; [.4900.0020.0002] # LINEAR A SIGN AB021 +10610 ; [.4901.0020.0002] # LINEAR A SIGN AB021F +10611 ; [.4902.0020.0002] # LINEAR A SIGN AB021M +10612 ; [.4903.0020.0002] # LINEAR A SIGN AB022 +10613 ; [.4904.0020.0002] # LINEAR A SIGN AB022F +10614 ; [.4905.0020.0002] # LINEAR A SIGN AB022M +10615 ; [.4906.0020.0002] # LINEAR A SIGN AB023 +10616 ; [.4907.0020.0002] # LINEAR A SIGN AB023M +10617 ; [.4908.0020.0002] # LINEAR A SIGN AB024 +10618 ; [.4909.0020.0002] # LINEAR A SIGN AB026 +10619 ; [.490A.0020.0002] # LINEAR A SIGN AB027 +1061A ; [.490B.0020.0002] # LINEAR A SIGN AB028 +1061B ; [.490C.0020.0002] # LINEAR A SIGN A028B +1061C ; [.490D.0020.0002] # LINEAR A SIGN AB029 +1061D ; [.490E.0020.0002] # LINEAR A SIGN AB030 +1061E ; [.490F.0020.0002] # LINEAR A SIGN AB031 +1061F ; [.4910.0020.0002] # LINEAR A SIGN AB034 +10620 ; [.4911.0020.0002] # LINEAR A SIGN AB037 +10621 ; [.4912.0020.0002] # LINEAR A SIGN AB038 +10622 ; [.4913.0020.0002] # LINEAR A SIGN AB039 +10623 ; [.4914.0020.0002] # LINEAR A SIGN AB040 +10624 ; [.4915.0020.0002] # LINEAR A SIGN AB041 +10625 ; [.4916.0020.0002] # LINEAR A SIGN AB044 +10626 ; [.4917.0020.0002] # LINEAR A SIGN AB045 +10627 ; [.4918.0020.0002] # LINEAR A SIGN AB046 +10628 ; [.4919.0020.0002] # LINEAR A SIGN AB047 +10629 ; [.491A.0020.0002] # LINEAR A SIGN AB048 +1062A ; [.491B.0020.0002] # LINEAR A SIGN AB049 +1062B ; [.491C.0020.0002] # LINEAR A SIGN AB050 +1062C ; [.491D.0020.0002] # LINEAR A SIGN AB051 +1062D ; [.491E.0020.0002] # LINEAR A SIGN AB053 +1062E ; [.491F.0020.0002] # LINEAR A SIGN AB054 +1062F ; [.4920.0020.0002] # LINEAR A SIGN AB055 +10630 ; [.4921.0020.0002] # LINEAR A SIGN AB056 +10631 ; [.4922.0020.0002] # LINEAR A SIGN AB057 +10632 ; [.4923.0020.0002] # LINEAR A SIGN AB058 +10633 ; [.4924.0020.0002] # LINEAR A SIGN AB059 +10634 ; [.4925.0020.0002] # LINEAR A SIGN AB060 +10635 ; [.4926.0020.0002] # LINEAR A SIGN AB061 +10636 ; [.4927.0020.0002] # LINEAR A SIGN AB065 +10637 ; [.4928.0020.0002] # LINEAR A SIGN AB066 +10638 ; [.4929.0020.0002] # LINEAR A SIGN AB067 +10639 ; [.492A.0020.0002] # LINEAR A SIGN AB069 +1063A ; [.492B.0020.0002] # LINEAR A SIGN AB070 +1063B ; [.492C.0020.0002] # LINEAR A SIGN AB073 +1063C ; [.492D.0020.0002] # LINEAR A SIGN AB074 +1063D ; [.492E.0020.0002] # LINEAR A SIGN AB076 +1063E ; [.492F.0020.0002] # LINEAR A SIGN AB077 +1063F ; [.4930.0020.0002] # LINEAR A SIGN AB078 +10640 ; [.4931.0020.0002] # LINEAR A SIGN AB079 +10641 ; [.4932.0020.0002] # LINEAR A SIGN AB080 +10642 ; [.4933.0020.0002] # LINEAR A SIGN AB081 +10643 ; [.4934.0020.0002] # LINEAR A SIGN AB082 +10644 ; [.4935.0020.0002] # LINEAR A SIGN AB085 +10645 ; [.4936.0020.0002] # LINEAR A SIGN AB086 +10646 ; [.4937.0020.0002] # LINEAR A SIGN AB087 +10647 ; [.4938.0020.0002] # LINEAR A SIGN A100-102 +10648 ; [.4939.0020.0002] # LINEAR A SIGN AB118 +10649 ; [.493A.0020.0002] # LINEAR A SIGN AB120 +1064A ; [.493B.0020.0002] # LINEAR A SIGN A120B +1064B ; [.493C.0020.0002] # LINEAR A SIGN AB122 +1064C ; [.493D.0020.0002] # LINEAR A SIGN AB123 +1064D ; [.493E.0020.0002] # LINEAR A SIGN AB131A +1064E ; [.493F.0020.0002] # LINEAR A SIGN AB131B +1064F ; [.4940.0020.0002] # LINEAR A SIGN A131C +10650 ; [.4941.0020.0002] # LINEAR A SIGN AB164 +10651 ; [.4942.0020.0002] # LINEAR A SIGN AB171 +10652 ; [.4943.0020.0002] # LINEAR A SIGN AB180 +10653 ; [.4944.0020.0002] # LINEAR A SIGN AB188 +10654 ; [.4945.0020.0002] # LINEAR A SIGN AB191 +10655 ; [.4946.0020.0002] # LINEAR A SIGN A301 +10656 ; [.4947.0020.0002] # LINEAR A SIGN A302 +10657 ; [.4948.0020.0002] # LINEAR A SIGN A303 +10658 ; [.4949.0020.0002] # LINEAR A SIGN A304 +10659 ; [.494A.0020.0002] # LINEAR A SIGN A305 +1065A ; [.494B.0020.0002] # LINEAR A SIGN A306 +1065B ; [.494C.0020.0002] # LINEAR A SIGN A307 +1065C ; [.494D.0020.0002] # LINEAR A SIGN A308 +1065D ; [.494E.0020.0002] # LINEAR A SIGN A309A +1065E ; [.494F.0020.0002] # LINEAR A SIGN A309B +1065F ; [.4950.0020.0002] # LINEAR A SIGN A309C +10660 ; [.4951.0020.0002] # LINEAR A SIGN A310 +10661 ; [.4952.0020.0002] # LINEAR A SIGN A311 +10662 ; [.4953.0020.0002] # LINEAR A SIGN A312 +10663 ; [.4954.0020.0002] # LINEAR A SIGN A313A +10664 ; [.4955.0020.0002] # LINEAR A SIGN A313B +10665 ; [.4956.0020.0002] # LINEAR A SIGN A313C +10666 ; [.4957.0020.0002] # LINEAR A SIGN A314 +10667 ; [.4958.0020.0002] # LINEAR A SIGN A315 +10668 ; [.4959.0020.0002] # LINEAR A SIGN A316 +10669 ; [.495A.0020.0002] # LINEAR A SIGN A317 +1066A ; [.495B.0020.0002] # LINEAR A SIGN A318 +1066B ; [.495C.0020.0002] # LINEAR A SIGN A319 +1066C ; [.495D.0020.0002] # LINEAR A SIGN A320 +1066D ; [.495E.0020.0002] # LINEAR A SIGN A321 +1066E ; [.495F.0020.0002] # LINEAR A SIGN A322 +1066F ; [.4960.0020.0002] # LINEAR A SIGN A323 +10670 ; [.4961.0020.0002] # LINEAR A SIGN A324 +10671 ; [.4962.0020.0002] # LINEAR A SIGN A325 +10672 ; [.4963.0020.0002] # LINEAR A SIGN A326 +10673 ; [.4964.0020.0002] # LINEAR A SIGN A327 +10674 ; [.4965.0020.0002] # LINEAR A SIGN A328 +10675 ; [.4966.0020.0002] # LINEAR A SIGN A329 +10676 ; [.4967.0020.0002] # LINEAR A SIGN A330 +10677 ; [.4968.0020.0002] # LINEAR A SIGN A331 +10678 ; [.4969.0020.0002] # LINEAR A SIGN A332 +10679 ; [.496A.0020.0002] # LINEAR A SIGN A333 +1067A ; [.496B.0020.0002] # LINEAR A SIGN A334 +1067B ; [.496C.0020.0002] # LINEAR A SIGN A335 +1067C ; [.496D.0020.0002] # LINEAR A SIGN A336 +1067D ; [.496E.0020.0002] # LINEAR A SIGN A337 +1067E ; [.496F.0020.0002] # LINEAR A SIGN A338 +1067F ; [.4970.0020.0002] # LINEAR A SIGN A339 +10680 ; [.4971.0020.0002] # LINEAR A SIGN A340 +10681 ; [.4972.0020.0002] # LINEAR A SIGN A341 +10682 ; [.4973.0020.0002] # LINEAR A SIGN A342 +10683 ; [.4974.0020.0002] # LINEAR A SIGN A343 +10684 ; [.4975.0020.0002] # LINEAR A SIGN A344 +10685 ; [.4976.0020.0002] # LINEAR A SIGN A345 +10686 ; [.4977.0020.0002] # LINEAR A SIGN A346 +10687 ; [.4978.0020.0002] # LINEAR A SIGN A347 +10688 ; [.4979.0020.0002] # LINEAR A SIGN A348 +10689 ; [.497A.0020.0002] # LINEAR A SIGN A349 +1068A ; [.497B.0020.0002] # LINEAR A SIGN A350 +1068B ; [.497C.0020.0002] # LINEAR A SIGN A351 +1068C ; [.497D.0020.0002] # LINEAR A SIGN A352 +1068D ; [.497E.0020.0002] # LINEAR A SIGN A353 +1068E ; [.497F.0020.0002] # LINEAR A SIGN A354 +1068F ; [.4980.0020.0002] # LINEAR A SIGN A355 +10690 ; [.4981.0020.0002] # LINEAR A SIGN A356 +10691 ; [.4982.0020.0002] # LINEAR A SIGN A357 +10692 ; [.4983.0020.0002] # LINEAR A SIGN A358 +10693 ; [.4984.0020.0002] # LINEAR A SIGN A359 +10694 ; [.4985.0020.0002] # LINEAR A SIGN A360 +10695 ; [.4986.0020.0002] # LINEAR A SIGN A361 +10696 ; [.4987.0020.0002] # LINEAR A SIGN A362 +10697 ; [.4988.0020.0002] # LINEAR A SIGN A363 +10698 ; [.4989.0020.0002] # LINEAR A SIGN A364 +10699 ; [.498A.0020.0002] # LINEAR A SIGN A365 +1069A ; [.498B.0020.0002] # LINEAR A SIGN A366 +1069B ; [.498C.0020.0002] # LINEAR A SIGN A367 +1069C ; [.498D.0020.0002] # LINEAR A SIGN A368 +1069D ; [.498E.0020.0002] # LINEAR A SIGN A369 +1069E ; [.498F.0020.0002] # LINEAR A SIGN A370 +1069F ; [.4990.0020.0002] # LINEAR A SIGN A371 +106A0 ; [.4991.0020.0002] # LINEAR A SIGN A400-VAS +106A1 ; [.4992.0020.0002] # LINEAR A SIGN A401-VAS +106A2 ; [.4993.0020.0002] # LINEAR A SIGN A402-VAS +106A3 ; [.4994.0020.0002] # LINEAR A SIGN A403-VAS +106A4 ; [.4995.0020.0002] # LINEAR A SIGN A404-VAS +106A5 ; [.4996.0020.0002] # LINEAR A SIGN A405-VAS +106A6 ; [.4997.0020.0002] # LINEAR A SIGN A406-VAS +106A7 ; [.4998.0020.0002] # LINEAR A SIGN A407-VAS +106A8 ; [.4999.0020.0002] # LINEAR A SIGN A408-VAS +106A9 ; [.499A.0020.0002] # LINEAR A SIGN A409-VAS +106AA ; [.499B.0020.0002] # LINEAR A SIGN A410-VAS +106AB ; [.499C.0020.0002] # LINEAR A SIGN A411-VAS +106AC ; [.499D.0020.0002] # LINEAR A SIGN A412-VAS +106AD ; [.499E.0020.0002] # LINEAR A SIGN A413-VAS +106AE ; [.499F.0020.0002] # LINEAR A SIGN A414-VAS +106AF ; [.49A0.0020.0002] # LINEAR A SIGN A415-VAS +106B0 ; [.49A1.0020.0002] # LINEAR A SIGN A416-VAS +106B1 ; [.49A2.0020.0002] # LINEAR A SIGN A417-VAS +106B2 ; [.49A3.0020.0002] # LINEAR A SIGN A418-VAS +106B3 ; [.49A4.0020.0002] # LINEAR A SIGN A501 +106B4 ; [.49A5.0020.0002] # LINEAR A SIGN A502 +106B5 ; [.49A6.0020.0002] # LINEAR A SIGN A503 +106B6 ; [.49A7.0020.0002] # LINEAR A SIGN A504 +106B7 ; [.49A8.0020.0002] # LINEAR A SIGN A505 +106B8 ; [.49A9.0020.0002] # LINEAR A SIGN A506 +106B9 ; [.49AA.0020.0002] # LINEAR A SIGN A508 +106BA ; [.49AB.0020.0002] # LINEAR A SIGN A509 +106BB ; [.49AC.0020.0002] # LINEAR A SIGN A510 +106BC ; [.49AD.0020.0002] # LINEAR A SIGN A511 +106BD ; [.49AE.0020.0002] # LINEAR A SIGN A512 +106BE ; [.49AF.0020.0002] # LINEAR A SIGN A513 +106BF ; [.49B0.0020.0002] # LINEAR A SIGN A515 +106C0 ; [.49B1.0020.0002] # LINEAR A SIGN A516 +106C1 ; [.49B2.0020.0002] # LINEAR A SIGN A520 +106C2 ; [.49B3.0020.0002] # LINEAR A SIGN A521 +106C3 ; [.49B4.0020.0002] # LINEAR A SIGN A523 +106C4 ; [.49B5.0020.0002] # LINEAR A SIGN A524 +106C5 ; [.49B6.0020.0002] # LINEAR A SIGN A525 +106C6 ; [.49B7.0020.0002] # LINEAR A SIGN A526 +106C7 ; [.49B8.0020.0002] # LINEAR A SIGN A527 +106C8 ; [.49B9.0020.0002] # LINEAR A SIGN A528 +106C9 ; [.49BA.0020.0002] # LINEAR A SIGN A529 +106CA ; [.49BB.0020.0002] # LINEAR A SIGN A530 +106CB ; [.49BC.0020.0002] # LINEAR A SIGN A531 +106CC ; [.49BD.0020.0002] # LINEAR A SIGN A532 +106CD ; [.49BE.0020.0002] # LINEAR A SIGN A534 +106CE ; [.49BF.0020.0002] # LINEAR A SIGN A535 +106CF ; [.49C0.0020.0002] # LINEAR A SIGN A536 +106D0 ; [.49C1.0020.0002] # LINEAR A SIGN A537 +106D1 ; [.49C2.0020.0002] # LINEAR A SIGN A538 +106D2 ; [.49C3.0020.0002] # LINEAR A SIGN A539 +106D3 ; [.49C4.0020.0002] # LINEAR A SIGN A540 +106D4 ; [.49C5.0020.0002] # LINEAR A SIGN A541 +106D5 ; [.49C6.0020.0002] # LINEAR A SIGN A542 +106D6 ; [.49C7.0020.0002] # LINEAR A SIGN A545 +106D7 ; [.49C8.0020.0002] # LINEAR A SIGN A547 +106D8 ; [.49C9.0020.0002] # LINEAR A SIGN A548 +106D9 ; [.49CA.0020.0002] # LINEAR A SIGN A549 +106DA ; [.49CB.0020.0002] # LINEAR A SIGN A550 +106DB ; [.49CC.0020.0002] # LINEAR A SIGN A551 +106DC ; [.49CD.0020.0002] # LINEAR A SIGN A552 +106DD ; [.49CE.0020.0002] # LINEAR A SIGN A553 +106DE ; [.49CF.0020.0002] # LINEAR A SIGN A554 +106DF ; [.49D0.0020.0002] # LINEAR A SIGN A555 +106E0 ; [.49D1.0020.0002] # LINEAR A SIGN A556 +106E1 ; [.49D2.0020.0002] # LINEAR A SIGN A557 +106E2 ; [.49D3.0020.0002] # LINEAR A SIGN A559 +106E3 ; [.49D4.0020.0002] # LINEAR A SIGN A563 +106E4 ; [.49D5.0020.0002] # LINEAR A SIGN A564 +106E5 ; [.49D6.0020.0002] # LINEAR A SIGN A565 +106E6 ; [.49D7.0020.0002] # LINEAR A SIGN A566 +106E7 ; [.49D8.0020.0002] # LINEAR A SIGN A568 +106E8 ; [.49D9.0020.0002] # LINEAR A SIGN A569 +106E9 ; [.49DA.0020.0002] # LINEAR A SIGN A570 +106EA ; [.49DB.0020.0002] # LINEAR A SIGN A571 +106EB ; [.49DC.0020.0002] # LINEAR A SIGN A572 +106EC ; [.49DD.0020.0002] # LINEAR A SIGN A573 +106ED ; [.49DE.0020.0002] # LINEAR A SIGN A574 +106EE ; [.49DF.0020.0002] # LINEAR A SIGN A575 +106EF ; [.49E0.0020.0002] # LINEAR A SIGN A576 +106F0 ; [.49E1.0020.0002] # LINEAR A SIGN A577 +106F1 ; [.49E2.0020.0002] # LINEAR A SIGN A578 +106F2 ; [.49E3.0020.0002] # LINEAR A SIGN A579 +106F3 ; [.49E4.0020.0002] # LINEAR A SIGN A580 +106F4 ; [.49E5.0020.0002] # LINEAR A SIGN A581 +106F5 ; [.49E6.0020.0002] # LINEAR A SIGN A582 +106F6 ; [.49E7.0020.0002] # LINEAR A SIGN A583 +106F7 ; [.49E8.0020.0002] # LINEAR A SIGN A584 +106F8 ; [.49E9.0020.0002] # LINEAR A SIGN A585 +106F9 ; [.49EA.0020.0002] # LINEAR A SIGN A586 +106FA ; [.49EB.0020.0002] # LINEAR A SIGN A587 +106FB ; [.49EC.0020.0002] # LINEAR A SIGN A588 +106FC ; [.49ED.0020.0002] # LINEAR A SIGN A589 +106FD ; [.49EE.0020.0002] # LINEAR A SIGN A591 +106FE ; [.49EF.0020.0002] # LINEAR A SIGN A592 +106FF ; [.49F0.0020.0002] # LINEAR A SIGN A594 +10700 ; [.49F1.0020.0002] # LINEAR A SIGN A595 +10701 ; [.49F2.0020.0002] # LINEAR A SIGN A596 +10702 ; [.49F3.0020.0002] # LINEAR A SIGN A598 +10703 ; [.49F4.0020.0002] # LINEAR A SIGN A600 +10704 ; [.49F5.0020.0002] # LINEAR A SIGN A601 +10705 ; [.49F6.0020.0002] # LINEAR A SIGN A602 +10706 ; [.49F7.0020.0002] # LINEAR A SIGN A603 +10707 ; [.49F8.0020.0002] # LINEAR A SIGN A604 +10708 ; [.49F9.0020.0002] # LINEAR A SIGN A606 +10709 ; [.49FA.0020.0002] # LINEAR A SIGN A608 +1070A ; [.49FB.0020.0002] # LINEAR A SIGN A609 +1070B ; [.49FC.0020.0002] # LINEAR A SIGN A610 +1070C ; [.49FD.0020.0002] # LINEAR A SIGN A611 +1070D ; [.49FE.0020.0002] # LINEAR A SIGN A612 +1070E ; [.49FF.0020.0002] # LINEAR A SIGN A613 +1070F ; [.4A00.0020.0002] # LINEAR A SIGN A614 +10710 ; [.4A01.0020.0002] # LINEAR A SIGN A615 +10711 ; [.4A02.0020.0002] # LINEAR A SIGN A616 +10712 ; [.4A03.0020.0002] # LINEAR A SIGN A617 +10713 ; [.4A04.0020.0002] # LINEAR A SIGN A618 +10714 ; [.4A05.0020.0002] # LINEAR A SIGN A619 +10715 ; [.4A06.0020.0002] # LINEAR A SIGN A620 +10716 ; [.4A07.0020.0002] # LINEAR A SIGN A621 +10717 ; [.4A08.0020.0002] # LINEAR A SIGN A622 +10718 ; [.4A09.0020.0002] # LINEAR A SIGN A623 +10719 ; [.4A0A.0020.0002] # LINEAR A SIGN A624 +1071A ; [.4A0B.0020.0002] # LINEAR A SIGN A626 +1071B ; [.4A0C.0020.0002] # LINEAR A SIGN A627 +1071C ; [.4A0D.0020.0002] # LINEAR A SIGN A628 +1071D ; [.4A0E.0020.0002] # LINEAR A SIGN A629 +1071E ; [.4A0F.0020.0002] # LINEAR A SIGN A634 +1071F ; [.4A10.0020.0002] # LINEAR A SIGN A637 +10720 ; [.4A11.0020.0002] # LINEAR A SIGN A638 +10721 ; [.4A12.0020.0002] # LINEAR A SIGN A640 +10722 ; [.4A13.0020.0002] # LINEAR A SIGN A642 +10723 ; [.4A14.0020.0002] # LINEAR A SIGN A643 +10724 ; [.4A15.0020.0002] # LINEAR A SIGN A644 +10725 ; [.4A16.0020.0002] # LINEAR A SIGN A645 +10726 ; [.4A17.0020.0002] # LINEAR A SIGN A646 +10727 ; [.4A18.0020.0002] # LINEAR A SIGN A648 +10728 ; [.4A19.0020.0002] # LINEAR A SIGN A649 +10729 ; [.4A1A.0020.0002] # LINEAR A SIGN A651 +1072A ; [.4A1B.0020.0002] # LINEAR A SIGN A652 +1072B ; [.4A1C.0020.0002] # LINEAR A SIGN A653 +1072C ; [.4A1D.0020.0002] # LINEAR A SIGN A654 +1072D ; [.4A1E.0020.0002] # LINEAR A SIGN A655 +1072E ; [.4A1F.0020.0002] # LINEAR A SIGN A656 +1072F ; [.4A20.0020.0002] # LINEAR A SIGN A657 +10730 ; [.4A21.0020.0002] # LINEAR A SIGN A658 +10731 ; [.4A22.0020.0002] # LINEAR A SIGN A659 +10732 ; [.4A23.0020.0002] # LINEAR A SIGN A660 +10733 ; [.4A24.0020.0002] # LINEAR A SIGN A661 +10734 ; [.4A25.0020.0002] # LINEAR A SIGN A662 +10735 ; [.4A26.0020.0002] # LINEAR A SIGN A663 +10736 ; [.4A27.0020.0002] # LINEAR A SIGN A664 +10740 ; [.4A28.0020.0002] # LINEAR A SIGN A701 A +10741 ; [.4A29.0020.0002] # LINEAR A SIGN A702 B +10742 ; [.4A2A.0020.0002] # LINEAR A SIGN A703 D +10743 ; [.4A2B.0020.0002] # LINEAR A SIGN A704 E +10744 ; [.4A2C.0020.0002] # LINEAR A SIGN A705 F +10745 ; [.4A2D.0020.0002] # LINEAR A SIGN A706 H +10746 ; [.4A2E.0020.0002] # LINEAR A SIGN A707 J +10747 ; [.4A2F.0020.0002] # LINEAR A SIGN A708 K +10748 ; [.4A30.0020.0002] # LINEAR A SIGN A709 L +10749 ; [.4A31.0020.0002] # LINEAR A SIGN A709-2 L2 +1074A ; [.4A32.0020.0002] # LINEAR A SIGN A709-3 L3 +1074B ; [.4A33.0020.0002] # LINEAR A SIGN A709-4 L4 +1074C ; [.4A34.0020.0002] # LINEAR A SIGN A709-6 L6 +1074D ; [.4A35.0020.0002] # LINEAR A SIGN A710 W +1074E ; [.4A36.0020.0002] # LINEAR A SIGN A711 X +1074F ; [.4A37.0020.0002] # LINEAR A SIGN A712 Y +10750 ; [.4A38.0020.0002] # LINEAR A SIGN A713 OMEGA +10751 ; [.4A39.0020.0002] # LINEAR A SIGN A714 ABB +10752 ; [.4A3A.0020.0002] # LINEAR A SIGN A715 BB +10753 ; [.4A3B.0020.0002] # LINEAR A SIGN A717 DD +10754 ; [.4A3C.0020.0002] # LINEAR A SIGN A726 EYYY +10755 ; [.4A3D.0020.0002] # LINEAR A SIGN A732 JE +10760 ; [.4A3E.0020.0002] # LINEAR A SIGN A800 +10761 ; [.4A3F.0020.0002] # LINEAR A SIGN A801 +10762 ; [.4A40.0020.0002] # LINEAR A SIGN A802 +10763 ; [.4A41.0020.0002] # LINEAR A SIGN A803 +10764 ; [.4A42.0020.0002] # LINEAR A SIGN A804 +10765 ; [.4A43.0020.0002] # LINEAR A SIGN A805 +10766 ; [.4A44.0020.0002] # LINEAR A SIGN A806 +10767 ; [.4A45.0020.0002] # LINEAR A SIGN A807 +10800 ; [.4A46.0020.0002] # CYPRIOT SYLLABLE A +10801 ; [.4A47.0020.0002] # CYPRIOT SYLLABLE E +10802 ; [.4A48.0020.0002] # CYPRIOT SYLLABLE I +10803 ; [.4A49.0020.0002] # CYPRIOT SYLLABLE O +10804 ; [.4A4A.0020.0002] # CYPRIOT SYLLABLE U +10805 ; [.4A4B.0020.0002] # CYPRIOT SYLLABLE JA +10808 ; [.4A4C.0020.0002] # CYPRIOT SYLLABLE JO +1080A ; [.4A4D.0020.0002] # CYPRIOT SYLLABLE KA +1080B ; [.4A4E.0020.0002] # CYPRIOT SYLLABLE KE +1080C ; [.4A4F.0020.0002] # CYPRIOT SYLLABLE KI +1080D ; [.4A50.0020.0002] # CYPRIOT SYLLABLE KO +1080E ; [.4A51.0020.0002] # CYPRIOT SYLLABLE KU +1080F ; [.4A52.0020.0002] # CYPRIOT SYLLABLE LA +10810 ; [.4A53.0020.0002] # CYPRIOT SYLLABLE LE +10811 ; [.4A54.0020.0002] # CYPRIOT SYLLABLE LI +10812 ; [.4A55.0020.0002] # CYPRIOT SYLLABLE LO +10813 ; [.4A56.0020.0002] # CYPRIOT SYLLABLE LU +10814 ; [.4A57.0020.0002] # CYPRIOT SYLLABLE MA +10815 ; [.4A58.0020.0002] # CYPRIOT SYLLABLE ME +10816 ; [.4A59.0020.0002] # CYPRIOT SYLLABLE MI +10817 ; [.4A5A.0020.0002] # CYPRIOT SYLLABLE MO +10818 ; [.4A5B.0020.0002] # CYPRIOT SYLLABLE MU +10819 ; [.4A5C.0020.0002] # CYPRIOT SYLLABLE NA +1081A ; [.4A5D.0020.0002] # CYPRIOT SYLLABLE NE +1081B ; [.4A5E.0020.0002] # CYPRIOT SYLLABLE NI +1081C ; [.4A5F.0020.0002] # CYPRIOT SYLLABLE NO +1081D ; [.4A60.0020.0002] # CYPRIOT SYLLABLE NU +1081E ; [.4A61.0020.0002] # CYPRIOT SYLLABLE PA +1081F ; [.4A62.0020.0002] # CYPRIOT SYLLABLE PE +10820 ; [.4A63.0020.0002] # CYPRIOT SYLLABLE PI +10821 ; [.4A64.0020.0002] # CYPRIOT SYLLABLE PO +10822 ; [.4A65.0020.0002] # CYPRIOT SYLLABLE PU +10823 ; [.4A66.0020.0002] # CYPRIOT SYLLABLE RA +10824 ; [.4A67.0020.0002] # CYPRIOT SYLLABLE RE +10825 ; [.4A68.0020.0002] # CYPRIOT SYLLABLE RI +10826 ; [.4A69.0020.0002] # CYPRIOT SYLLABLE RO +10827 ; [.4A6A.0020.0002] # CYPRIOT SYLLABLE RU +10828 ; [.4A6B.0020.0002] # CYPRIOT SYLLABLE SA +10829 ; [.4A6C.0020.0002] # CYPRIOT SYLLABLE SE +1082A ; [.4A6D.0020.0002] # CYPRIOT SYLLABLE SI +1082B ; [.4A6E.0020.0002] # CYPRIOT SYLLABLE SO +1082C ; [.4A6F.0020.0002] # CYPRIOT SYLLABLE SU +1082D ; [.4A70.0020.0002] # CYPRIOT SYLLABLE TA +1082E ; [.4A71.0020.0002] # CYPRIOT SYLLABLE TE +1082F ; [.4A72.0020.0002] # CYPRIOT SYLLABLE TI +10830 ; [.4A73.0020.0002] # CYPRIOT SYLLABLE TO +10831 ; [.4A74.0020.0002] # CYPRIOT SYLLABLE TU +10832 ; [.4A75.0020.0002] # CYPRIOT SYLLABLE WA +10833 ; [.4A76.0020.0002] # CYPRIOT SYLLABLE WE +10834 ; [.4A77.0020.0002] # CYPRIOT SYLLABLE WI +10835 ; [.4A78.0020.0002] # CYPRIOT SYLLABLE WO +10837 ; [.4A79.0020.0002] # CYPRIOT SYLLABLE XA +10838 ; [.4A7A.0020.0002] # CYPRIOT SYLLABLE XE +1083C ; [.4A7B.0020.0002] # CYPRIOT SYLLABLE ZA +1083F ; [.4A7C.0020.0002] # CYPRIOT SYLLABLE ZO +10A60 ; [.4A7D.0020.0002] # OLD SOUTH ARABIAN LETTER HE +10A61 ; [.4A7E.0020.0002] # OLD SOUTH ARABIAN LETTER LAMEDH +10A62 ; [.4A7F.0020.0002] # OLD SOUTH ARABIAN LETTER HETH +10A63 ; [.4A80.0020.0002] # OLD SOUTH ARABIAN LETTER MEM +10A64 ; [.4A81.0020.0002] # OLD SOUTH ARABIAN LETTER QOPH +10A65 ; [.4A82.0020.0002] # OLD SOUTH ARABIAN LETTER WAW +10A66 ; [.4A83.0020.0002] # OLD SOUTH ARABIAN LETTER SHIN +10A67 ; [.4A84.0020.0002] # OLD SOUTH ARABIAN LETTER RESH +10A68 ; [.4A85.0020.0002] # OLD SOUTH ARABIAN LETTER BETH +10A69 ; [.4A86.0020.0002] # OLD SOUTH ARABIAN LETTER TAW +10A6A ; [.4A87.0020.0002] # OLD SOUTH ARABIAN LETTER SAT +10A6B ; [.4A88.0020.0002] # OLD SOUTH ARABIAN LETTER KAPH +10A6C ; [.4A89.0020.0002] # OLD SOUTH ARABIAN LETTER NUN +10A6D ; [.4A8A.0020.0002] # OLD SOUTH ARABIAN LETTER KHETH +10A6E ; [.4A8B.0020.0002] # OLD SOUTH ARABIAN LETTER SADHE +10A6F ; [.4A8C.0020.0002] # OLD SOUTH ARABIAN LETTER SAMEKH +10A70 ; [.4A8D.0020.0002] # OLD SOUTH ARABIAN LETTER FE +10A71 ; [.4A8E.0020.0002] # OLD SOUTH ARABIAN LETTER ALEF +10A72 ; [.4A8F.0020.0002] # OLD SOUTH ARABIAN LETTER AYN +10A73 ; [.4A90.0020.0002] # OLD SOUTH ARABIAN LETTER DHADHE +10A74 ; [.4A91.0020.0002] # OLD SOUTH ARABIAN LETTER GIMEL +10A75 ; [.4A92.0020.0002] # OLD SOUTH ARABIAN LETTER DALETH +10A76 ; [.4A93.0020.0002] # OLD SOUTH ARABIAN LETTER GHAYN +10A77 ; [.4A94.0020.0002] # OLD SOUTH ARABIAN LETTER TETH +10A78 ; [.4A95.0020.0002] # OLD SOUTH ARABIAN LETTER ZAYN +10A79 ; [.4A96.0020.0002] # OLD SOUTH ARABIAN LETTER DHALETH +10A7A ; [.4A97.0020.0002] # OLD SOUTH ARABIAN LETTER YODH +10A7B ; [.4A98.0020.0002] # OLD SOUTH ARABIAN LETTER THAW +10A7C ; [.4A99.0020.0002] # OLD SOUTH ARABIAN LETTER THETH +10A80 ; [.4A9A.0020.0002] # OLD NORTH ARABIAN LETTER HEH +10A81 ; [.4A9B.0020.0002] # OLD NORTH ARABIAN LETTER LAM +10A82 ; [.4A9C.0020.0002] # OLD NORTH ARABIAN LETTER HAH +10A83 ; [.4A9D.0020.0002] # OLD NORTH ARABIAN LETTER MEEM +10A84 ; [.4A9E.0020.0002] # OLD NORTH ARABIAN LETTER QAF +10A85 ; [.4A9F.0020.0002] # OLD NORTH ARABIAN LETTER WAW +10A86 ; [.4AA0.0020.0002] # OLD NORTH ARABIAN LETTER ES-2 +10A87 ; [.4AA1.0020.0002] # OLD NORTH ARABIAN LETTER REH +10A88 ; [.4AA2.0020.0002] # OLD NORTH ARABIAN LETTER BEH +10A89 ; [.4AA3.0020.0002] # OLD NORTH ARABIAN LETTER TEH +10A8A ; [.4AA4.0020.0002] # OLD NORTH ARABIAN LETTER ES-1 +10A8B ; [.4AA5.0020.0002] # OLD NORTH ARABIAN LETTER KAF +10A8C ; [.4AA6.0020.0002] # OLD NORTH ARABIAN LETTER NOON +10A8D ; [.4AA7.0020.0002] # OLD NORTH ARABIAN LETTER KHAH +10A8E ; [.4AA8.0020.0002] # OLD NORTH ARABIAN LETTER SAD +10A8F ; [.4AA9.0020.0002] # OLD NORTH ARABIAN LETTER ES-3 +10A90 ; [.4AAA.0020.0002] # OLD NORTH ARABIAN LETTER FEH +10A91 ; [.4AAB.0020.0002] # OLD NORTH ARABIAN LETTER ALEF +10A92 ; [.4AAC.0020.0002] # OLD NORTH ARABIAN LETTER AIN +10A93 ; [.4AAD.0020.0002] # OLD NORTH ARABIAN LETTER DAD +10A94 ; [.4AAE.0020.0002] # OLD NORTH ARABIAN LETTER GEEM +10A95 ; [.4AAF.0020.0002] # OLD NORTH ARABIAN LETTER DAL +10A96 ; [.4AB0.0020.0002] # OLD NORTH ARABIAN LETTER GHAIN +10A97 ; [.4AB1.0020.0002] # OLD NORTH ARABIAN LETTER TAH +10A98 ; [.4AB2.0020.0002] # OLD NORTH ARABIAN LETTER ZAIN +10A99 ; [.4AB3.0020.0002] # OLD NORTH ARABIAN LETTER THAL +10A9A ; [.4AB4.0020.0002] # OLD NORTH ARABIAN LETTER YEH +10A9B ; [.4AB5.0020.0002] # OLD NORTH ARABIAN LETTER THEH +10A9C ; [.4AB6.0020.0002] # OLD NORTH ARABIAN LETTER ZAH +10B00 ; [.4AB7.0020.0002] # AVESTAN LETTER A +10B01 ; [.4AB8.0020.0002] # AVESTAN LETTER AA +10B02 ; [.4AB9.0020.0002] # AVESTAN LETTER AO +10B03 ; [.4ABA.0020.0002] # AVESTAN LETTER AAO +10B04 ; [.4ABB.0020.0002] # AVESTAN LETTER AN +10B05 ; [.4ABC.0020.0002] # AVESTAN LETTER AAN +10B06 ; [.4ABD.0020.0002] # AVESTAN LETTER AE +10B07 ; [.4ABE.0020.0002] # AVESTAN LETTER AEE +10B08 ; [.4ABF.0020.0002] # AVESTAN LETTER E +10B09 ; [.4AC0.0020.0002] # AVESTAN LETTER EE +10B0A ; [.4AC1.0020.0002] # AVESTAN LETTER O +10B0B ; [.4AC2.0020.0002] # AVESTAN LETTER OO +10B0C ; [.4AC3.0020.0002] # AVESTAN LETTER I +10B0D ; [.4AC4.0020.0002] # AVESTAN LETTER II +10B0E ; [.4AC5.0020.0002] # AVESTAN LETTER U +10B0F ; [.4AC6.0020.0002] # AVESTAN LETTER UU +10B10 ; [.4AC7.0020.0002] # AVESTAN LETTER KE +10B11 ; [.4AC8.0020.0002] # AVESTAN LETTER XE +10B12 ; [.4AC9.0020.0002] # AVESTAN LETTER XYE +10B13 ; [.4ACA.0020.0002] # AVESTAN LETTER XVE +10B14 ; [.4ACB.0020.0002] # AVESTAN LETTER GE +10B15 ; [.4ACC.0020.0002] # AVESTAN LETTER GGE +10B16 ; [.4ACD.0020.0002] # AVESTAN LETTER GHE +10B17 ; [.4ACE.0020.0002] # AVESTAN LETTER CE +10B18 ; [.4ACF.0020.0002] # AVESTAN LETTER JE +10B19 ; [.4AD0.0020.0002] # AVESTAN LETTER TE +10B1A ; [.4AD1.0020.0002] # AVESTAN LETTER THE +10B1B ; [.4AD2.0020.0002] # AVESTAN LETTER DE +10B1C ; [.4AD3.0020.0002] # AVESTAN LETTER DHE +10B1D ; [.4AD4.0020.0002] # AVESTAN LETTER TTE +10B1E ; [.4AD5.0020.0002] # AVESTAN LETTER PE +10B1F ; [.4AD6.0020.0002] # AVESTAN LETTER FE +10B20 ; [.4AD7.0020.0002] # AVESTAN LETTER BE +10B21 ; [.4AD8.0020.0002] # AVESTAN LETTER BHE +10B22 ; [.4AD9.0020.0002] # AVESTAN LETTER NGE +10B23 ; [.4ADA.0020.0002] # AVESTAN LETTER NGYE +10B24 ; [.4ADB.0020.0002] # AVESTAN LETTER NGVE +10B25 ; [.4ADC.0020.0002] # AVESTAN LETTER NE +10B26 ; [.4ADD.0020.0002] # AVESTAN LETTER NYE +10B27 ; [.4ADE.0020.0002] # AVESTAN LETTER NNE +10B28 ; [.4ADF.0020.0002] # AVESTAN LETTER ME +10B29 ; [.4AE0.0020.0002] # AVESTAN LETTER HME +10B2A ; [.4AE1.0020.0002] # AVESTAN LETTER YYE +10B2B ; [.4AE2.0020.0002] # AVESTAN LETTER YE +10B2C ; [.4AE3.0020.0002] # AVESTAN LETTER VE +10B2D ; [.4AE4.0020.0002] # AVESTAN LETTER RE +10B2E ; [.4AE4.0020.0004][.0000.0111.0004] # AVESTAN LETTER LE +10B2F ; [.4AE5.0020.0002] # AVESTAN LETTER SE +10B30 ; [.4AE6.0020.0002] # AVESTAN LETTER ZE +10B31 ; [.4AE7.0020.0002] # AVESTAN LETTER SHE +10B32 ; [.4AE8.0020.0002] # AVESTAN LETTER ZHE +10B33 ; [.4AE9.0020.0002] # AVESTAN LETTER SHYE +10B34 ; [.4AEA.0020.0002] # AVESTAN LETTER SSHE +10B35 ; [.4AEB.0020.0002] # AVESTAN LETTER HE +10860 ; [.4AEC.0020.0002] # PALMYRENE LETTER ALEPH +10861 ; [.4AED.0020.0002] # PALMYRENE LETTER BETH +10862 ; [.4AEE.0020.0002] # PALMYRENE LETTER GIMEL +10863 ; [.4AEF.0020.0002] # PALMYRENE LETTER DALETH +10864 ; [.4AF0.0020.0002] # PALMYRENE LETTER HE +10865 ; [.4AF1.0020.0002] # PALMYRENE LETTER WAW +10866 ; [.4AF2.0020.0002] # PALMYRENE LETTER ZAYIN +10867 ; [.4AF3.0020.0002] # PALMYRENE LETTER HETH +10868 ; [.4AF4.0020.0002] # PALMYRENE LETTER TETH +10869 ; [.4AF5.0020.0002] # PALMYRENE LETTER YODH +1086A ; [.4AF6.0020.0002] # PALMYRENE LETTER KAPH +1086B ; [.4AF7.0020.0002] # PALMYRENE LETTER LAMEDH +1086C ; [.4AF8.0020.0002] # PALMYRENE LETTER MEM +1086E ; [.4AF9.0020.0002] # PALMYRENE LETTER NUN +1086D ; [.4AF9.0020.0019] # PALMYRENE LETTER FINAL NUN +1086F ; [.4AFA.0020.0002] # PALMYRENE LETTER SAMEKH +10870 ; [.4AFB.0020.0002] # PALMYRENE LETTER AYIN +10871 ; [.4AFC.0020.0002] # PALMYRENE LETTER PE +10872 ; [.4AFD.0020.0002] # PALMYRENE LETTER SADHE +10873 ; [.4AFE.0020.0002] # PALMYRENE LETTER QOPH +10874 ; [.4AFF.0020.0002] # PALMYRENE LETTER RESH +10875 ; [.4B00.0020.0002] # PALMYRENE LETTER SHIN +10876 ; [.4B01.0020.0002] # PALMYRENE LETTER TAW +10881 ; [.4B02.0020.0002] # NABATAEAN LETTER ALEPH +10880 ; [.4B02.0020.0019] # NABATAEAN LETTER FINAL ALEPH +10883 ; [.4B03.0020.0002] # NABATAEAN LETTER BETH +10882 ; [.4B03.0020.0019] # NABATAEAN LETTER FINAL BETH +10884 ; [.4B04.0020.0002] # NABATAEAN LETTER GIMEL +10885 ; [.4B05.0020.0002] # NABATAEAN LETTER DALETH +10887 ; [.4B06.0020.0002] # NABATAEAN LETTER HE +10886 ; [.4B06.0020.0019] # NABATAEAN LETTER FINAL HE +10888 ; [.4B07.0020.0002] # NABATAEAN LETTER WAW +10889 ; [.4B08.0020.0002] # NABATAEAN LETTER ZAYIN +1088A ; [.4B09.0020.0002] # NABATAEAN LETTER HETH +1088B ; [.4B0A.0020.0002] # NABATAEAN LETTER TETH +1088D ; [.4B0B.0020.0002] # NABATAEAN LETTER YODH +1088C ; [.4B0B.0020.0019] # NABATAEAN LETTER FINAL YODH +1088F ; [.4B0C.0020.0002] # NABATAEAN LETTER KAPH +1088E ; [.4B0C.0020.0019] # NABATAEAN LETTER FINAL KAPH +10891 ; [.4B0D.0020.0002] # NABATAEAN LETTER LAMEDH +10890 ; [.4B0D.0020.0019] # NABATAEAN LETTER FINAL LAMEDH +10893 ; [.4B0E.0020.0002] # NABATAEAN LETTER MEM +10892 ; [.4B0E.0020.0019] # NABATAEAN LETTER FINAL MEM +10895 ; [.4B0F.0020.0002] # NABATAEAN LETTER NUN +10894 ; [.4B0F.0020.0019] # NABATAEAN LETTER FINAL NUN +10896 ; [.4B10.0020.0002] # NABATAEAN LETTER SAMEKH +10897 ; [.4B11.0020.0002] # NABATAEAN LETTER AYIN +10898 ; [.4B12.0020.0002] # NABATAEAN LETTER PE +10899 ; [.4B13.0020.0002] # NABATAEAN LETTER SADHE +1089A ; [.4B14.0020.0002] # NABATAEAN LETTER QOPH +1089B ; [.4B15.0020.0002] # NABATAEAN LETTER RESH +1089D ; [.4B16.0020.0002] # NABATAEAN LETTER SHIN +1089C ; [.4B16.0020.0019] # NABATAEAN LETTER FINAL SHIN +1089E ; [.4B17.0020.0002] # NABATAEAN LETTER TAW +108E0 ; [.4B18.0020.0002] # HATRAN LETTER ALEPH +108E1 ; [.4B19.0020.0002] # HATRAN LETTER BETH +108E2 ; [.4B1A.0020.0002] # HATRAN LETTER GIMEL +108E3 ; [.4B1B.0020.0002] # HATRAN LETTER DALETH-RESH +108E4 ; [.4B1C.0020.0002] # HATRAN LETTER HE +108E5 ; [.4B1D.0020.0002] # HATRAN LETTER WAW +108E6 ; [.4B1E.0020.0002] # HATRAN LETTER ZAYN +108E7 ; [.4B1F.0020.0002] # HATRAN LETTER HETH +108E8 ; [.4B20.0020.0002] # HATRAN LETTER TETH +108E9 ; [.4B21.0020.0002] # HATRAN LETTER YODH +108EA ; [.4B22.0020.0002] # HATRAN LETTER KAPH +108EB ; [.4B23.0020.0002] # HATRAN LETTER LAMEDH +108EC ; [.4B24.0020.0002] # HATRAN LETTER MEM +108ED ; [.4B25.0020.0002] # HATRAN LETTER NUN +108EE ; [.4B26.0020.0002] # HATRAN LETTER SAMEKH +108EF ; [.4B27.0020.0002] # HATRAN LETTER AYN +108F0 ; [.4B28.0020.0002] # HATRAN LETTER PE +108F1 ; [.4B29.0020.0002] # HATRAN LETTER SADHE +108F2 ; [.4B2A.0020.0002] # HATRAN LETTER QOPH +108F4 ; [.4B2B.0020.0002] # HATRAN LETTER SHIN +108F5 ; [.4B2C.0020.0002] # HATRAN LETTER TAW +10840 ; [.4B2D.0020.0002] # IMPERIAL ARAMAIC LETTER ALEPH +10841 ; [.4B2E.0020.0002] # IMPERIAL ARAMAIC LETTER BETH +10842 ; [.4B2F.0020.0002] # IMPERIAL ARAMAIC LETTER GIMEL +10843 ; [.4B30.0020.0002] # IMPERIAL ARAMAIC LETTER DALETH +10844 ; [.4B31.0020.0002] # IMPERIAL ARAMAIC LETTER HE +10845 ; [.4B32.0020.0002] # IMPERIAL ARAMAIC LETTER WAW +10846 ; [.4B33.0020.0002] # IMPERIAL ARAMAIC LETTER ZAYIN +10847 ; [.4B34.0020.0002] # IMPERIAL ARAMAIC LETTER HETH +10848 ; [.4B35.0020.0002] # IMPERIAL ARAMAIC LETTER TETH +10849 ; [.4B36.0020.0002] # IMPERIAL ARAMAIC LETTER YODH +1084A ; [.4B37.0020.0002] # IMPERIAL ARAMAIC LETTER KAPH +1084B ; [.4B38.0020.0002] # IMPERIAL ARAMAIC LETTER LAMEDH +1084C ; [.4B39.0020.0002] # IMPERIAL ARAMAIC LETTER MEM +1084D ; [.4B3A.0020.0002] # IMPERIAL ARAMAIC LETTER NUN +1084E ; [.4B3B.0020.0002] # IMPERIAL ARAMAIC LETTER SAMEKH +1084F ; [.4B3C.0020.0002] # IMPERIAL ARAMAIC LETTER AYIN +10850 ; [.4B3D.0020.0002] # IMPERIAL ARAMAIC LETTER PE +10851 ; [.4B3E.0020.0002] # IMPERIAL ARAMAIC LETTER SADHE +10852 ; [.4B3F.0020.0002] # IMPERIAL ARAMAIC LETTER QOPH +10853 ; [.4B40.0020.0002] # IMPERIAL ARAMAIC LETTER RESH +10854 ; [.4B41.0020.0002] # IMPERIAL ARAMAIC LETTER SHIN +10855 ; [.4B42.0020.0002] # IMPERIAL ARAMAIC LETTER TAW +10B40 ; [.4B43.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ALEPH +10B41 ; [.4B44.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER BETH +10B42 ; [.4B45.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER GIMEL +10B43 ; [.4B46.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER DALETH +10B44 ; [.4B47.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HE +10B45 ; [.4B48.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER WAW +10B46 ; [.4B49.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER ZAYIN +10B47 ; [.4B4A.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER HETH +10B48 ; [.4B4B.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TETH +10B49 ; [.4B4C.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER YODH +10B4A ; [.4B4D.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER KAPH +10B4B ; [.4B4E.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER LAMEDH +10B4C ; [.4B4F.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER MEM +10B4D ; [.4B50.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER NUN +10B4E ; [.4B51.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SAMEKH +10B4F ; [.4B52.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER AYIN +10B50 ; [.4B53.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER PE +10B51 ; [.4B54.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SADHE +10B52 ; [.4B55.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER QOPH +10B53 ; [.4B56.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER RESH +10B54 ; [.4B57.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER SHIN +10B55 ; [.4B58.0020.0002] # INSCRIPTIONAL PARTHIAN LETTER TAW +10B60 ; [.4B59.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ALEPH +10B61 ; [.4B5A.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER BETH +10B62 ; [.4B5B.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER GIMEL +10B63 ; [.4B5C.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER DALETH +10B64 ; [.4B5D.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HE +10B65 ; [.4B5E.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH +10B66 ; [.4B5F.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER ZAYIN +10B67 ; [.4B60.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER HETH +10B68 ; [.4B61.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TETH +10B69 ; [.4B62.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER YODH +10B6A ; [.4B63.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER KAPH +10B6B ; [.4B64.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER LAMEDH +10B6C ; [.4B65.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH +10B6D ; [.4B66.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER NUN +10B6E ; [.4B67.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SAMEKH +10B6F ; [.4B68.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER PE +10B70 ; [.4B69.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SADHE +10B71 ; [.4B6A.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER SHIN +10B72 ; [.4B6B.0020.0002] # INSCRIPTIONAL PAHLAVI LETTER TAW +10B80 ; [.4B6C.0020.0002] # PSALTER PAHLAVI LETTER ALEPH +10B81 ; [.4B6D.0020.0002] # PSALTER PAHLAVI LETTER BETH +10B82 ; [.4B6E.0020.0002] # PSALTER PAHLAVI LETTER GIMEL +10B83 ; [.4B6F.0020.0002] # PSALTER PAHLAVI LETTER DALETH +10B84 ; [.4B70.0020.0002] # PSALTER PAHLAVI LETTER HE +10B85 ; [.4B71.0020.0002] # PSALTER PAHLAVI LETTER WAW-AYIN-RESH +10B86 ; [.4B72.0020.0002] # PSALTER PAHLAVI LETTER ZAYIN +10B87 ; [.4B73.0020.0002] # PSALTER PAHLAVI LETTER HETH +10B88 ; [.4B74.0020.0002] # PSALTER PAHLAVI LETTER YODH +10B89 ; [.4B75.0020.0002] # PSALTER PAHLAVI LETTER KAPH +10B8A ; [.4B76.0020.0002] # PSALTER PAHLAVI LETTER LAMEDH +10B8B ; [.4B77.0020.0002] # PSALTER PAHLAVI LETTER MEM-QOPH +10B8C ; [.4B78.0020.0002] # PSALTER PAHLAVI LETTER NUN +10B8D ; [.4B79.0020.0002] # PSALTER PAHLAVI LETTER SAMEKH +10B8E ; [.4B7A.0020.0002] # PSALTER PAHLAVI LETTER PE +10B8F ; [.4B7B.0020.0002] # PSALTER PAHLAVI LETTER SADHE +10B90 ; [.4B7C.0020.0002] # PSALTER PAHLAVI LETTER SHIN +10B91 ; [.4B7D.0020.0002] # PSALTER PAHLAVI LETTER TAW +10AC0 ; [.4B7E.0020.0002] # MANICHAEAN LETTER ALEPH +10AC1 ; [.4B7F.0020.0002] # MANICHAEAN LETTER BETH +10AC2 ; [.4B80.0020.0002] # MANICHAEAN LETTER BHETH +10AC3 ; [.4B81.0020.0002] # MANICHAEAN LETTER GIMEL +10AC4 ; [.4B82.0020.0002] # MANICHAEAN LETTER GHIMEL +10AC5 ; [.4B83.0020.0002] # MANICHAEAN LETTER DALETH +10AC6 ; [.4B84.0020.0002] # MANICHAEAN LETTER HE +10AC7 ; [.4B85.0020.0002] # MANICHAEAN LETTER WAW +10AC8 ; [.4B85.0020.0004][.0000.0112.0004] # MANICHAEAN SIGN UD +10AC9 ; [.4B86.0020.0002] # MANICHAEAN LETTER ZAYIN +10ACA ; [.4B87.0020.0002] # MANICHAEAN LETTER ZHAYIN +10ACB ; [.4B88.0020.0002] # MANICHAEAN LETTER JAYIN +10ACC ; [.4B89.0020.0002] # MANICHAEAN LETTER JHAYIN +10ACD ; [.4B8A.0020.0002] # MANICHAEAN LETTER HETH +10ACE ; [.4B8B.0020.0002] # MANICHAEAN LETTER TETH +10ACF ; [.4B8C.0020.0002] # MANICHAEAN LETTER YODH +10AD0 ; [.4B8D.0020.0002] # MANICHAEAN LETTER KAPH +10AD1 ; [.4B8E.0020.0002] # MANICHAEAN LETTER XAPH +10AD2 ; [.4B8F.0020.0002] # MANICHAEAN LETTER KHAPH +10AD3 ; [.4B90.0020.0002] # MANICHAEAN LETTER LAMEDH +10AD4 ; [.4B91.0020.0002] # MANICHAEAN LETTER DHAMEDH +10AD5 ; [.4B92.0020.0002] # MANICHAEAN LETTER THAMEDH +10AD6 ; [.4B93.0020.0002] # MANICHAEAN LETTER MEM +10AD7 ; [.4B94.0020.0002] # MANICHAEAN LETTER NUN +10AD8 ; [.4B95.0020.0002] # MANICHAEAN LETTER SAMEKH +10AD9 ; [.4B96.0020.0002] # MANICHAEAN LETTER AYIN +10ADA ; [.4B97.0020.0002] # MANICHAEAN LETTER AAYIN +10ADB ; [.4B98.0020.0002] # MANICHAEAN LETTER PE +10ADC ; [.4B99.0020.0002] # MANICHAEAN LETTER FE +10ADD ; [.4B9A.0020.0002] # MANICHAEAN LETTER SADHE +10ADE ; [.4B9B.0020.0002] # MANICHAEAN LETTER QOPH +10ADF ; [.4B9C.0020.0002] # MANICHAEAN LETTER XOPH +10AE0 ; [.4B9D.0020.0002] # MANICHAEAN LETTER QHOPH +10AE1 ; [.4B9E.0020.0002] # MANICHAEAN LETTER RESH +10AE2 ; [.4B9F.0020.0002] # MANICHAEAN LETTER SHIN +10AE3 ; [.4BA0.0020.0002] # MANICHAEAN LETTER SSHIN +10AE4 ; [.4BA1.0020.0002] # MANICHAEAN LETTER TAW +10380 ; [.4BA2.0020.0002] # UGARITIC LETTER ALPA +10381 ; [.4BA3.0020.0002] # UGARITIC LETTER BETA +10382 ; [.4BA4.0020.0002] # UGARITIC LETTER GAMLA +10383 ; [.4BA5.0020.0002] # UGARITIC LETTER KHA +10384 ; [.4BA6.0020.0002] # UGARITIC LETTER DELTA +10385 ; [.4BA7.0020.0002] # UGARITIC LETTER HO +10386 ; [.4BA8.0020.0002] # UGARITIC LETTER WO +10387 ; [.4BA9.0020.0002] # UGARITIC LETTER ZETA +10388 ; [.4BAA.0020.0002] # UGARITIC LETTER HOTA +10389 ; [.4BAB.0020.0002] # UGARITIC LETTER TET +1038A ; [.4BAC.0020.0002] # UGARITIC LETTER YOD +1038B ; [.4BAD.0020.0002] # UGARITIC LETTER KAF +1038C ; [.4BAE.0020.0002] # UGARITIC LETTER SHIN +1038D ; [.4BAF.0020.0002] # UGARITIC LETTER LAMDA +1038E ; [.4BB0.0020.0002] # UGARITIC LETTER MEM +1038F ; [.4BB1.0020.0002] # UGARITIC LETTER DHAL +10390 ; [.4BB2.0020.0002] # UGARITIC LETTER NUN +10391 ; [.4BB3.0020.0002] # UGARITIC LETTER ZU +10392 ; [.4BB4.0020.0002] # UGARITIC LETTER SAMKA +10393 ; [.4BB5.0020.0002] # UGARITIC LETTER AIN +10394 ; [.4BB6.0020.0002] # UGARITIC LETTER PU +10395 ; [.4BB7.0020.0002] # UGARITIC LETTER SADE +10396 ; [.4BB8.0020.0002] # UGARITIC LETTER QOPA +10397 ; [.4BB9.0020.0002] # UGARITIC LETTER RASHA +10398 ; [.4BBA.0020.0002] # UGARITIC LETTER THANNA +10399 ; [.4BBB.0020.0002] # UGARITIC LETTER GHAIN +1039A ; [.4BBC.0020.0002] # UGARITIC LETTER TO +1039B ; [.4BBD.0020.0002] # UGARITIC LETTER I +1039C ; [.4BBE.0020.0002] # UGARITIC LETTER U +1039D ; [.4BBF.0020.0002] # UGARITIC LETTER SSU +103A0 ; [.4BC0.0020.0002] # OLD PERSIAN SIGN A +103A1 ; [.4BC1.0020.0002] # OLD PERSIAN SIGN I +103A2 ; [.4BC2.0020.0002] # OLD PERSIAN SIGN U +103A3 ; [.4BC3.0020.0002] # OLD PERSIAN SIGN KA +103A4 ; [.4BC4.0020.0002] # OLD PERSIAN SIGN KU +103A5 ; [.4BC5.0020.0002] # OLD PERSIAN SIGN GA +103A6 ; [.4BC6.0020.0002] # OLD PERSIAN SIGN GU +103A7 ; [.4BC7.0020.0002] # OLD PERSIAN SIGN XA +103A8 ; [.4BC8.0020.0002] # OLD PERSIAN SIGN CA +103A9 ; [.4BC9.0020.0002] # OLD PERSIAN SIGN JA +103AA ; [.4BCA.0020.0002] # OLD PERSIAN SIGN JI +103AB ; [.4BCB.0020.0002] # OLD PERSIAN SIGN TA +103AC ; [.4BCC.0020.0002] # OLD PERSIAN SIGN TU +103AD ; [.4BCD.0020.0002] # OLD PERSIAN SIGN DA +103AE ; [.4BCE.0020.0002] # OLD PERSIAN SIGN DI +103AF ; [.4BCF.0020.0002] # OLD PERSIAN SIGN DU +103B0 ; [.4BD0.0020.0002] # OLD PERSIAN SIGN THA +103B1 ; [.4BD1.0020.0002] # OLD PERSIAN SIGN PA +103B2 ; [.4BD2.0020.0002] # OLD PERSIAN SIGN BA +103B3 ; [.4BD3.0020.0002] # OLD PERSIAN SIGN FA +103B4 ; [.4BD4.0020.0002] # OLD PERSIAN SIGN NA +103B5 ; [.4BD5.0020.0002] # OLD PERSIAN SIGN NU +103B6 ; [.4BD6.0020.0002] # OLD PERSIAN SIGN MA +103B7 ; [.4BD7.0020.0002] # OLD PERSIAN SIGN MI +103B8 ; [.4BD8.0020.0002] # OLD PERSIAN SIGN MU +103B9 ; [.4BD9.0020.0002] # OLD PERSIAN SIGN YA +103BA ; [.4BDA.0020.0002] # OLD PERSIAN SIGN VA +103BB ; [.4BDB.0020.0002] # OLD PERSIAN SIGN VI +103BC ; [.4BDC.0020.0002] # OLD PERSIAN SIGN RA +103BD ; [.4BDD.0020.0002] # OLD PERSIAN SIGN RU +103BE ; [.4BDE.0020.0002] # OLD PERSIAN SIGN LA +103BF ; [.4BDF.0020.0002] # OLD PERSIAN SIGN SA +103C0 ; [.4BE0.0020.0002] # OLD PERSIAN SIGN ZA +103C1 ; [.4BE1.0020.0002] # OLD PERSIAN SIGN SHA +103C2 ; [.4BE2.0020.0002] # OLD PERSIAN SIGN SSA +103C3 ; [.4BE3.0020.0002] # OLD PERSIAN SIGN HA +103C8 ; [.4BE4.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA +103C9 ; [.4BE5.0020.0002] # OLD PERSIAN SIGN AURAMAZDAA-2 +103CA ; [.4BE6.0020.0002] # OLD PERSIAN SIGN AURAMAZDAAHA +103CB ; [.4BE7.0020.0002] # OLD PERSIAN SIGN XSHAAYATHIYA +103CC ; [.4BE8.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH +103CD ; [.4BE9.0020.0002] # OLD PERSIAN SIGN DAHYAAUSH-2 +103CE ; [.4BEA.0020.0002] # OLD PERSIAN SIGN BAGA +103CF ; [.4BEB.0020.0002] # OLD PERSIAN SIGN BUUMISH +12000 ; [.4BEC.0020.0002] # CUNEIFORM SIGN A +12001 ; [.4BED.0020.0002] # CUNEIFORM SIGN A TIMES A +12002 ; [.4BEE.0020.0002] # CUNEIFORM SIGN A TIMES BAD +12003 ; [.4BEF.0020.0002] # CUNEIFORM SIGN A TIMES GAN2 TENU +12004 ; [.4BF0.0020.0002] # CUNEIFORM SIGN A TIMES HA +12005 ; [.4BF1.0020.0002] # CUNEIFORM SIGN A TIMES IGI +12006 ; [.4BF2.0020.0002] # CUNEIFORM SIGN A TIMES LAGAR GUNU +12007 ; [.4BF3.0020.0002] # CUNEIFORM SIGN A TIMES MUSH +12008 ; [.4BF4.0020.0002] # CUNEIFORM SIGN A TIMES SAG +12009 ; [.4BF5.0020.0002] # CUNEIFORM SIGN A2 +1200A ; [.4BF6.0020.0002] # CUNEIFORM SIGN AB +1200B ; [.4BF7.0020.0002] # CUNEIFORM SIGN AB TIMES ASH2 +1200C ; [.4BF8.0020.0002] # CUNEIFORM SIGN AB TIMES DUN3 GUNU +1200D ; [.4BF9.0020.0002] # CUNEIFORM SIGN AB TIMES GAL +1200E ; [.4BFA.0020.0002] # CUNEIFORM SIGN AB TIMES GAN2 TENU +1200F ; [.4BFB.0020.0002] # CUNEIFORM SIGN AB TIMES HA +12010 ; [.4BFC.0020.0002] # CUNEIFORM SIGN AB TIMES IGI GUNU +12011 ; [.4BFD.0020.0002] # CUNEIFORM SIGN AB TIMES IMIN +12012 ; [.4BFE.0020.0002] # CUNEIFORM SIGN AB TIMES LAGAB +12013 ; [.4BFF.0020.0002] # CUNEIFORM SIGN AB TIMES SHESH +12014 ; [.4C00.0020.0002] # CUNEIFORM SIGN AB TIMES U PLUS U PLUS U +12015 ; [.4C01.0020.0002] # CUNEIFORM SIGN AB GUNU +12016 ; [.4C02.0020.0002] # CUNEIFORM SIGN AB2 +12017 ; [.4C03.0020.0002] # CUNEIFORM SIGN AB2 TIMES BALAG +12018 ; [.4C04.0020.0002] # CUNEIFORM SIGN AB2 TIMES GAN2 TENU +12019 ; [.4C05.0020.0002] # CUNEIFORM SIGN AB2 TIMES ME PLUS EN +1201A ; [.4C06.0020.0002] # CUNEIFORM SIGN AB2 TIMES SHA3 +1201B ; [.4C07.0020.0002] # CUNEIFORM SIGN AB2 TIMES TAK4 +1201C ; [.4C08.0020.0002] # CUNEIFORM SIGN AD +1201D ; [.4C09.0020.0002] # CUNEIFORM SIGN AK +1201E ; [.4C0A.0020.0002] # CUNEIFORM SIGN AK TIMES ERIN2 +1201F ; [.4C0B.0020.0002] # CUNEIFORM SIGN AK TIMES SHITA PLUS GISH +12020 ; [.4C0C.0020.0002] # CUNEIFORM SIGN AL +12021 ; [.4C0D.0020.0002] # CUNEIFORM SIGN AL TIMES AL +12022 ; [.4C0E.0020.0002] # CUNEIFORM SIGN AL TIMES DIM2 +12023 ; [.4C0F.0020.0002] # CUNEIFORM SIGN AL TIMES GISH +12024 ; [.4C10.0020.0002] # CUNEIFORM SIGN AL TIMES HA +12025 ; [.4C11.0020.0002] # CUNEIFORM SIGN AL TIMES KAD3 +12026 ; [.4C12.0020.0002] # CUNEIFORM SIGN AL TIMES KI +12027 ; [.4C13.0020.0002] # CUNEIFORM SIGN AL TIMES SHE +12028 ; [.4C14.0020.0002] # CUNEIFORM SIGN AL TIMES USH +12029 ; [.4C15.0020.0002] # CUNEIFORM SIGN ALAN +1202A ; [.4C16.0020.0002] # CUNEIFORM SIGN ALEPH +1202B ; [.4C17.0020.0002] # CUNEIFORM SIGN AMAR +1202C ; [.4C18.0020.0002] # CUNEIFORM SIGN AMAR TIMES SHE +1202D ; [.4C19.0020.0002] # CUNEIFORM SIGN AN +1202E ; [.4C1A.0020.0002] # CUNEIFORM SIGN AN OVER AN +1202F ; [.4C1B.0020.0002] # CUNEIFORM SIGN AN THREE TIMES +12030 ; [.4C1C.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA +12031 ; [.4C1D.0020.0002] # CUNEIFORM SIGN AN PLUS NAGA SQUARED +12032 ; [.4C1E.0020.0002] # CUNEIFORM SIGN ANSHE +12033 ; [.4C1F.0020.0002] # CUNEIFORM SIGN APIN +12034 ; [.4C20.0020.0002] # CUNEIFORM SIGN ARAD +12035 ; [.4C21.0020.0002] # CUNEIFORM SIGN ARAD TIMES KUR +12036 ; [.4C22.0020.0002] # CUNEIFORM SIGN ARKAB +12037 ; [.4C23.0020.0002] # CUNEIFORM SIGN ASAL2 +12038 ; [.4C24.0020.0002] # CUNEIFORM SIGN ASH +12039 ; [.4C25.0020.0002] # CUNEIFORM SIGN ASH ZIDA TENU +1203A ; [.4C26.0020.0002] # CUNEIFORM SIGN ASH KABA TENU +1203B ; [.4C27.0020.0002] # CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP +1203C ; [.4C28.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH +1203D ; [.4C29.0020.0002] # CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH +1203E ; [.4C2A.0020.0002] # CUNEIFORM SIGN ASH2 +1203F ; [.4C2B.0020.0002] # CUNEIFORM SIGN ASHGAB +12040 ; [.4C2C.0020.0002] # CUNEIFORM SIGN BA +12041 ; [.4C2D.0020.0002] # CUNEIFORM SIGN BAD +12042 ; [.4C2E.0020.0002] # CUNEIFORM SIGN BAG3 +12043 ; [.4C2F.0020.0002] # CUNEIFORM SIGN BAHAR2 +12044 ; [.4C30.0020.0002] # CUNEIFORM SIGN BAL +12045 ; [.4C31.0020.0002] # CUNEIFORM SIGN BAL OVER BAL +12046 ; [.4C32.0020.0002] # CUNEIFORM SIGN BALAG +12047 ; [.4C33.0020.0002] # CUNEIFORM SIGN BAR +12048 ; [.4C34.0020.0002] # CUNEIFORM SIGN BARA2 +12049 ; [.4C35.0020.0002] # CUNEIFORM SIGN BI +1204A ; [.4C36.0020.0002] # CUNEIFORM SIGN BI TIMES A +1204B ; [.4C37.0020.0002] # CUNEIFORM SIGN BI TIMES GAR +1204C ; [.4C38.0020.0002] # CUNEIFORM SIGN BI TIMES IGI GUNU +1204D ; [.4C39.0020.0002] # CUNEIFORM SIGN BU +1204E ; [.4C3A.0020.0002] # CUNEIFORM SIGN BU OVER BU AB +1204F ; [.4C3B.0020.0002] # CUNEIFORM SIGN BU OVER BU UN +12050 ; [.4C3C.0020.0002] # CUNEIFORM SIGN BU CROSSING BU +12051 ; [.4C3D.0020.0002] # CUNEIFORM SIGN BULUG +12052 ; [.4C3E.0020.0002] # CUNEIFORM SIGN BULUG OVER BULUG +12053 ; [.4C3F.0020.0002] # CUNEIFORM SIGN BUR +12054 ; [.4C40.0020.0002] # CUNEIFORM SIGN BUR2 +12055 ; [.4C41.0020.0002] # CUNEIFORM SIGN DA +12056 ; [.4C42.0020.0002] # CUNEIFORM SIGN DAG +12057 ; [.4C43.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH +12058 ; [.4C44.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES AMAR +12059 ; [.4C45.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BALAG +1205A ; [.4C46.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES BI +1205B ; [.4C47.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA +1205C ; [.4C48.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH +1205D ; [.4C49.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GI +1205E ; [.4C4A.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GIR2 +1205F ; [.4C4B.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES GUD +12060 ; [.4C4C.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES HA +12061 ; [.4C4D.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR +12062 ; [.4C4E.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU +12063 ; [.4C4F.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES KAK +12064 ; [.4C50.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LA +12065 ; [.4C51.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU +12066 ; [.4C52.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2 +12067 ; [.4C53.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES LUM +12068 ; [.4C54.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES NE +12069 ; [.4C55.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP +1206A ; [.4C56.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES SI +1206B ; [.4C57.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES TAK4 +1206C ; [.4C58.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2 +1206D ; [.4C59.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES USH +1206E ; [.4C5A.0020.0002] # CUNEIFORM SIGN DAM +1206F ; [.4C5B.0020.0002] # CUNEIFORM SIGN DAR +12070 ; [.4C5C.0020.0002] # CUNEIFORM SIGN DARA3 +12071 ; [.4C5D.0020.0002] # CUNEIFORM SIGN DARA4 +12072 ; [.4C5E.0020.0002] # CUNEIFORM SIGN DI +12073 ; [.4C5F.0020.0002] # CUNEIFORM SIGN DIB +12074 ; [.4C60.0020.0002] # CUNEIFORM SIGN DIM +12075 ; [.4C61.0020.0002] # CUNEIFORM SIGN DIM TIMES SHE +12076 ; [.4C62.0020.0002] # CUNEIFORM SIGN DIM2 +12077 ; [.4C63.0020.0002] # CUNEIFORM SIGN DIN +12078 ; [.4C64.0020.0002] # CUNEIFORM SIGN DIN KASKAL U GUNU DISH +12079 ; [.4C65.0020.0002] # CUNEIFORM SIGN DISH +1207A ; [.4C66.0020.0002] # CUNEIFORM SIGN DU +1207B ; [.4C67.0020.0002] # CUNEIFORM SIGN DU OVER DU +1207C ; [.4C68.0020.0002] # CUNEIFORM SIGN DU GUNU +1207D ; [.4C69.0020.0002] # CUNEIFORM SIGN DU SHESHIG +1207E ; [.4C6A.0020.0002] # CUNEIFORM SIGN DUB +1207F ; [.4C6B.0020.0002] # CUNEIFORM SIGN DUB TIMES ESH2 +12080 ; [.4C6C.0020.0002] # CUNEIFORM SIGN DUB2 +12081 ; [.4C6D.0020.0002] # CUNEIFORM SIGN DUG +12082 ; [.4C6E.0020.0002] # CUNEIFORM SIGN DUGUD +12083 ; [.4C6F.0020.0002] # CUNEIFORM SIGN DUH +12084 ; [.4C70.0020.0002] # CUNEIFORM SIGN DUN +12085 ; [.4C71.0020.0002] # CUNEIFORM SIGN DUN3 +12086 ; [.4C72.0020.0002] # CUNEIFORM SIGN DUN3 GUNU +12087 ; [.4C73.0020.0002] # CUNEIFORM SIGN DUN3 GUNU GUNU +12088 ; [.4C74.0020.0002] # CUNEIFORM SIGN DUN4 +12089 ; [.4C75.0020.0002] # CUNEIFORM SIGN DUR2 +1208A ; [.4C76.0020.0002] # CUNEIFORM SIGN E +1208B ; [.4C77.0020.0002] # CUNEIFORM SIGN E TIMES PAP +1208C ; [.4C78.0020.0002] # CUNEIFORM SIGN E OVER E NUN OVER NUN +1208D ; [.4C79.0020.0002] # CUNEIFORM SIGN E2 +1208E ; [.4C7A.0020.0002] # CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA +1208F ; [.4C7B.0020.0002] # CUNEIFORM SIGN E2 TIMES GAR +12090 ; [.4C7C.0020.0002] # CUNEIFORM SIGN E2 TIMES MI +12091 ; [.4C7D.0020.0002] # CUNEIFORM SIGN E2 TIMES SAL +12092 ; [.4C7E.0020.0002] # CUNEIFORM SIGN E2 TIMES SHE +12093 ; [.4C7F.0020.0002] # CUNEIFORM SIGN E2 TIMES U +12094 ; [.4C80.0020.0002] # CUNEIFORM SIGN EDIN +12095 ; [.4C81.0020.0002] # CUNEIFORM SIGN EGIR +12096 ; [.4C82.0020.0002] # CUNEIFORM SIGN EL +12097 ; [.4C83.0020.0002] # CUNEIFORM SIGN EN +12098 ; [.4C84.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 +12099 ; [.4C85.0020.0002] # CUNEIFORM SIGN EN TIMES GAN2 TENU +1209A ; [.4C86.0020.0002] # CUNEIFORM SIGN EN TIMES ME +1209B ; [.4C87.0020.0002] # CUNEIFORM SIGN EN CROSSING EN +1209C ; [.4C88.0020.0002] # CUNEIFORM SIGN EN OPPOSING EN +1209D ; [.4C89.0020.0002] # CUNEIFORM SIGN EN SQUARED +1209E ; [.4C8A.0020.0002] # CUNEIFORM SIGN EREN +1209F ; [.4C8B.0020.0002] # CUNEIFORM SIGN ERIN2 +120A0 ; [.4C8C.0020.0002] # CUNEIFORM SIGN ESH2 +120A1 ; [.4C8D.0020.0002] # CUNEIFORM SIGN EZEN +120A2 ; [.4C8E.0020.0002] # CUNEIFORM SIGN EZEN TIMES A +120A3 ; [.4C8F.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL +120A4 ; [.4C90.0020.0002] # CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL +120A5 ; [.4C91.0020.0002] # CUNEIFORM SIGN EZEN TIMES AN +120A6 ; [.4C92.0020.0002] # CUNEIFORM SIGN EZEN TIMES BAD +120A7 ; [.4C93.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU +120A8 ; [.4C94.0020.0002] # CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU +120A9 ; [.4C95.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA +120AA ; [.4C96.0020.0002] # CUNEIFORM SIGN EZEN TIMES HA GUNU +120AB ; [.4C97.0020.0002] # CUNEIFORM SIGN EZEN TIMES IGI GUNU +120AC ; [.4C98.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL +120AD ; [.4C99.0020.0002] # CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED +120AE ; [.4C9A.0020.0002] # CUNEIFORM SIGN EZEN TIMES KU3 +120AF ; [.4C9B.0020.0002] # CUNEIFORM SIGN EZEN TIMES LA +120B0 ; [.4C9C.0020.0002] # CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL +120B1 ; [.4C9D.0020.0002] # CUNEIFORM SIGN EZEN TIMES LI +120B2 ; [.4C9E.0020.0002] # CUNEIFORM SIGN EZEN TIMES LU +120B3 ; [.4C9F.0020.0002] # CUNEIFORM SIGN EZEN TIMES U2 +120B4 ; [.4CA0.0020.0002] # CUNEIFORM SIGN EZEN TIMES UD +120B5 ; [.4CA1.0020.0002] # CUNEIFORM SIGN GA +120B6 ; [.4CA2.0020.0002] # CUNEIFORM SIGN GA GUNU +120B7 ; [.4CA3.0020.0002] # CUNEIFORM SIGN GA2 +120B8 ; [.4CA4.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA +120B9 ; [.4CA5.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS HA +120BA ; [.4CA6.0020.0002] # CUNEIFORM SIGN GA2 TIMES A PLUS IGI +120BB ; [.4CA7.0020.0002] # CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB +120BC ; [.4CA8.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN +120BD ; [.4CA9.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH +120BE ; [.4CAA.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL +120BF ; [.4CAB.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAD +120C0 ; [.4CAC.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAR PLUS RA +120C1 ; [.4CAD.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR +120C2 ; [.4CAE.0020.0002] # CUNEIFORM SIGN GA2 TIMES BUR PLUS RA +120C3 ; [.4CAF.0020.0002] # CUNEIFORM SIGN GA2 TIMES DA +120C4 ; [.4CB0.0020.0002] # CUNEIFORM SIGN GA2 TIMES DI +120C5 ; [.4CB1.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE +120C6 ; [.4CB2.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUB +120C7 ; [.4CB3.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL +120C8 ; [.4CB4.0020.0002] # CUNEIFORM SIGN GA2 TIMES EL PLUS LA +120C9 ; [.4CB5.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN +120CA ; [.4CB6.0020.0002] # CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU +120CB ; [.4CB7.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAN2 TENU +120CC ; [.4CB8.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR +120CD ; [.4CB9.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI +120CE ; [.4CBA.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 +120CF ; [.4CBB.0020.0002] # CUNEIFORM SIGN GA2 TIMES GI4 PLUS A +120D0 ; [.4CBC.0020.0002] # CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU +120D1 ; [.4CBD.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2 +120D2 ; [.4CBE.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL +120D3 ; [.4CBF.0020.0002] # CUNEIFORM SIGN GA2 TIMES HAL PLUS LA +120D4 ; [.4CC0.0020.0002] # CUNEIFORM SIGN GA2 TIMES HI PLUS LI +120D5 ; [.4CC1.0020.0002] # CUNEIFORM SIGN GA2 TIMES HUB2 +120D6 ; [.4CC2.0020.0002] # CUNEIFORM SIGN GA2 TIMES IGI GUNU +120D7 ; [.4CC3.0020.0002] # CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH +120D8 ; [.4CC4.0020.0002] # CUNEIFORM SIGN GA2 TIMES KAK +120D9 ; [.4CC5.0020.0002] # CUNEIFORM SIGN GA2 TIMES KASKAL +120DA ; [.4CC6.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID +120DB ; [.4CC7.0020.0002] # CUNEIFORM SIGN GA2 TIMES KID PLUS LAL +120DC ; [.4CC8.0020.0002] # CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN +120DD ; [.4CC9.0020.0002] # CUNEIFORM SIGN GA2 TIMES LA +120DE ; [.4CCA.0020.0002] # CUNEIFORM SIGN GA2 TIMES ME PLUS EN +120DF ; [.4CCB.0020.0002] # CUNEIFORM SIGN GA2 TIMES MI +120E0 ; [.4CCC.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN +120E1 ; [.4CCD.0020.0002] # CUNEIFORM SIGN GA2 TIMES NUN OVER NUN +120E2 ; [.4CCE.0020.0002] # CUNEIFORM SIGN GA2 TIMES PA +120E3 ; [.4CCF.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAL +120E4 ; [.4CD0.0020.0002] # CUNEIFORM SIGN GA2 TIMES SAR +120E5 ; [.4CD1.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE +120E6 ; [.4CD2.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR +120E7 ; [.4CD3.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHID +120E8 ; [.4CD4.0020.0002] # CUNEIFORM SIGN GA2 TIMES SUM +120E9 ; [.4CD5.0020.0002] # CUNEIFORM SIGN GA2 TIMES TAK4 +120EA ; [.4CD6.0020.0002] # CUNEIFORM SIGN GA2 TIMES U +120EB ; [.4CD7.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD +120EC ; [.4CD8.0020.0002] # CUNEIFORM SIGN GA2 TIMES UD PLUS DU +120ED ; [.4CD9.0020.0002] # CUNEIFORM SIGN GA2 OVER GA2 +120EE ; [.4CDA.0020.0002] # CUNEIFORM SIGN GABA +120EF ; [.4CDB.0020.0002] # CUNEIFORM SIGN GABA CROSSING GABA +120F0 ; [.4CDC.0020.0002] # CUNEIFORM SIGN GAD +120F1 ; [.4CDD.0020.0002] # CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR +120F2 ; [.4CDE.0020.0002] # CUNEIFORM SIGN GAL +120F3 ; [.4CDF.0020.0002] # CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR +120F4 ; [.4CE0.0020.0002] # CUNEIFORM SIGN GALAM +120F5 ; [.4CE1.0020.0002] # CUNEIFORM SIGN GAM +120F6 ; [.4CE2.0020.0002] # CUNEIFORM SIGN GAN +120F7 ; [.4CE3.0020.0002] # CUNEIFORM SIGN GAN2 +120F8 ; [.4CE4.0020.0002] # CUNEIFORM SIGN GAN2 TENU +120F9 ; [.4CE5.0020.0002] # CUNEIFORM SIGN GAN2 OVER GAN2 +120FA ; [.4CE6.0020.0002] # CUNEIFORM SIGN GAN2 CROSSING GAN2 +120FB ; [.4CE7.0020.0002] # CUNEIFORM SIGN GAR +120FC ; [.4CE8.0020.0002] # CUNEIFORM SIGN GAR3 +120FD ; [.4CE9.0020.0002] # CUNEIFORM SIGN GASHAN +120FE ; [.4CEA.0020.0002] # CUNEIFORM SIGN GESHTIN +120FF ; [.4CEB.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES KUR +12100 ; [.4CEC.0020.0002] # CUNEIFORM SIGN GI +12101 ; [.4CED.0020.0002] # CUNEIFORM SIGN GI TIMES E +12102 ; [.4CEE.0020.0002] # CUNEIFORM SIGN GI TIMES U +12103 ; [.4CEF.0020.0002] # CUNEIFORM SIGN GI CROSSING GI +12104 ; [.4CF0.0020.0002] # CUNEIFORM SIGN GI4 +12105 ; [.4CF1.0020.0002] # CUNEIFORM SIGN GI4 OVER GI4 +12106 ; [.4CF2.0020.0002] # CUNEIFORM SIGN GI4 CROSSING GI4 +12107 ; [.4CF3.0020.0002] # CUNEIFORM SIGN GIDIM +12108 ; [.4CF4.0020.0002] # CUNEIFORM SIGN GIR2 +12109 ; [.4CF5.0020.0002] # CUNEIFORM SIGN GIR2 GUNU +1210A ; [.4CF6.0020.0002] # CUNEIFORM SIGN GIR3 +1210B ; [.4CF7.0020.0002] # CUNEIFORM SIGN GIR3 TIMES A PLUS IGI +1210C ; [.4CF8.0020.0002] # CUNEIFORM SIGN GIR3 TIMES GAN2 TENU +1210D ; [.4CF9.0020.0002] # CUNEIFORM SIGN GIR3 TIMES IGI +1210E ; [.4CFA.0020.0002] # CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI +1210F ; [.4CFB.0020.0002] # CUNEIFORM SIGN GIR3 TIMES PA +12110 ; [.4CFC.0020.0002] # CUNEIFORM SIGN GISAL +12111 ; [.4CFD.0020.0002] # CUNEIFORM SIGN GISH +12112 ; [.4CFE.0020.0002] # CUNEIFORM SIGN GISH CROSSING GISH +12113 ; [.4CFF.0020.0002] # CUNEIFORM SIGN GISH TIMES BAD +12114 ; [.4D00.0020.0002] # CUNEIFORM SIGN GISH TIMES TAK4 +12115 ; [.4D01.0020.0002] # CUNEIFORM SIGN GISH TENU +12116 ; [.4D02.0020.0002] # CUNEIFORM SIGN GU +12117 ; [.4D03.0020.0002] # CUNEIFORM SIGN GU CROSSING GU +12118 ; [.4D04.0020.0002] # CUNEIFORM SIGN GU2 +12119 ; [.4D05.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK +1211A ; [.4D06.0020.0002] # CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU +1211B ; [.4D07.0020.0002] # CUNEIFORM SIGN GU2 TIMES NUN +1211C ; [.4D08.0020.0002] # CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2 +1211D ; [.4D09.0020.0002] # CUNEIFORM SIGN GU2 GUNU +1211E ; [.4D0A.0020.0002] # CUNEIFORM SIGN GUD +1211F ; [.4D0B.0020.0002] # CUNEIFORM SIGN GUD TIMES A PLUS KUR +12120 ; [.4D0C.0020.0002] # CUNEIFORM SIGN GUD TIMES KUR +12121 ; [.4D0D.0020.0002] # CUNEIFORM SIGN GUD OVER GUD LUGAL +12122 ; [.4D0E.0020.0002] # CUNEIFORM SIGN GUL +12123 ; [.4D0F.0020.0002] # CUNEIFORM SIGN GUM +12124 ; [.4D10.0020.0002] # CUNEIFORM SIGN GUM TIMES SHE +12125 ; [.4D11.0020.0002] # CUNEIFORM SIGN GUR +12126 ; [.4D12.0020.0002] # CUNEIFORM SIGN GUR7 +12127 ; [.4D13.0020.0002] # CUNEIFORM SIGN GURUN +12128 ; [.4D14.0020.0002] # CUNEIFORM SIGN GURUSH +12129 ; [.4D15.0020.0002] # CUNEIFORM SIGN HA +1212A ; [.4D16.0020.0002] # CUNEIFORM SIGN HA TENU +1212B ; [.4D17.0020.0002] # CUNEIFORM SIGN HA GUNU +1212C ; [.4D18.0020.0002] # CUNEIFORM SIGN HAL +1212D ; [.4D19.0020.0002] # CUNEIFORM SIGN HI +1212E ; [.4D1A.0020.0002] # CUNEIFORM SIGN HI TIMES ASH +1212F ; [.4D1B.0020.0002] # CUNEIFORM SIGN HI TIMES ASH2 +12130 ; [.4D1C.0020.0002] # CUNEIFORM SIGN HI TIMES BAD +12131 ; [.4D1D.0020.0002] # CUNEIFORM SIGN HI TIMES DISH +12132 ; [.4D1E.0020.0002] # CUNEIFORM SIGN HI TIMES GAD +12133 ; [.4D1F.0020.0002] # CUNEIFORM SIGN HI TIMES KIN +12134 ; [.4D20.0020.0002] # CUNEIFORM SIGN HI TIMES NUN +12135 ; [.4D21.0020.0002] # CUNEIFORM SIGN HI TIMES SHE +12136 ; [.4D22.0020.0002] # CUNEIFORM SIGN HI TIMES U +12137 ; [.4D23.0020.0002] # CUNEIFORM SIGN HU +12138 ; [.4D24.0020.0002] # CUNEIFORM SIGN HUB2 +12139 ; [.4D25.0020.0002] # CUNEIFORM SIGN HUB2 TIMES AN +1213A ; [.4D26.0020.0002] # CUNEIFORM SIGN HUB2 TIMES HAL +1213B ; [.4D27.0020.0002] # CUNEIFORM SIGN HUB2 TIMES KASKAL +1213C ; [.4D28.0020.0002] # CUNEIFORM SIGN HUB2 TIMES LISH +1213D ; [.4D29.0020.0002] # CUNEIFORM SIGN HUB2 TIMES UD +1213E ; [.4D2A.0020.0002] # CUNEIFORM SIGN HUL2 +1213F ; [.4D2B.0020.0002] # CUNEIFORM SIGN I +12140 ; [.4D2C.0020.0002] # CUNEIFORM SIGN I A +12141 ; [.4D2D.0020.0002] # CUNEIFORM SIGN IB +12142 ; [.4D2E.0020.0002] # CUNEIFORM SIGN IDIM +12143 ; [.4D2F.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM BUR +12144 ; [.4D30.0020.0002] # CUNEIFORM SIGN IDIM OVER IDIM SQUARED +12145 ; [.4D31.0020.0002] # CUNEIFORM SIGN IG +12146 ; [.4D32.0020.0002] # CUNEIFORM SIGN IGI +12147 ; [.4D33.0020.0002] # CUNEIFORM SIGN IGI DIB +12148 ; [.4D34.0020.0002] # CUNEIFORM SIGN IGI RI +12149 ; [.4D35.0020.0002] # CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD +1214A ; [.4D36.0020.0002] # CUNEIFORM SIGN IGI GUNU +1214B ; [.4D37.0020.0002] # CUNEIFORM SIGN IL +1214C ; [.4D38.0020.0002] # CUNEIFORM SIGN IL TIMES GAN2 TENU +1214D ; [.4D39.0020.0002] # CUNEIFORM SIGN IL2 +1214E ; [.4D3A.0020.0002] # CUNEIFORM SIGN IM +1214F ; [.4D3B.0020.0002] # CUNEIFORM SIGN IM TIMES TAK4 +12150 ; [.4D3C.0020.0002] # CUNEIFORM SIGN IM CROSSING IM +12151 ; [.4D3D.0020.0002] # CUNEIFORM SIGN IM OPPOSING IM +12152 ; [.4D3E.0020.0002] # CUNEIFORM SIGN IM SQUARED +12153 ; [.4D3F.0020.0002] # CUNEIFORM SIGN IMIN +12154 ; [.4D40.0020.0002] # CUNEIFORM SIGN IN +12155 ; [.4D41.0020.0002] # CUNEIFORM SIGN IR +12156 ; [.4D42.0020.0002] # CUNEIFORM SIGN ISH +12157 ; [.4D43.0020.0002] # CUNEIFORM SIGN KA +12158 ; [.4D44.0020.0002] # CUNEIFORM SIGN KA TIMES A +12159 ; [.4D45.0020.0002] # CUNEIFORM SIGN KA TIMES AD +1215A ; [.4D46.0020.0002] # CUNEIFORM SIGN KA TIMES AD PLUS KU3 +1215B ; [.4D47.0020.0002] # CUNEIFORM SIGN KA TIMES ASH2 +1215C ; [.4D48.0020.0002] # CUNEIFORM SIGN KA TIMES BAD +1215D ; [.4D49.0020.0002] # CUNEIFORM SIGN KA TIMES BALAG +1215E ; [.4D4A.0020.0002] # CUNEIFORM SIGN KA TIMES BAR +1215F ; [.4D4B.0020.0002] # CUNEIFORM SIGN KA TIMES BI +12160 ; [.4D4C.0020.0002] # CUNEIFORM SIGN KA TIMES ERIN2 +12161 ; [.4D4D.0020.0002] # CUNEIFORM SIGN KA TIMES ESH2 +12162 ; [.4D4E.0020.0002] # CUNEIFORM SIGN KA TIMES GA +12163 ; [.4D4F.0020.0002] # CUNEIFORM SIGN KA TIMES GAL +12164 ; [.4D50.0020.0002] # CUNEIFORM SIGN KA TIMES GAN2 TENU +12165 ; [.4D51.0020.0002] # CUNEIFORM SIGN KA TIMES GAR +12166 ; [.4D52.0020.0002] # CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A +12167 ; [.4D53.0020.0002] # CUNEIFORM SIGN KA TIMES GI +12168 ; [.4D54.0020.0002] # CUNEIFORM SIGN KA TIMES GIR2 +12169 ; [.4D55.0020.0002] # CUNEIFORM SIGN KA TIMES GISH PLUS SAR +1216A ; [.4D56.0020.0002] # CUNEIFORM SIGN KA TIMES GISH CROSSING GISH +1216B ; [.4D57.0020.0002] # CUNEIFORM SIGN KA TIMES GU +1216C ; [.4D58.0020.0002] # CUNEIFORM SIGN KA TIMES GUR7 +1216D ; [.4D59.0020.0002] # CUNEIFORM SIGN KA TIMES IGI +1216E ; [.4D5A.0020.0002] # CUNEIFORM SIGN KA TIMES IM +1216F ; [.4D5B.0020.0002] # CUNEIFORM SIGN KA TIMES KAK +12170 ; [.4D5C.0020.0002] # CUNEIFORM SIGN KA TIMES KI +12171 ; [.4D5D.0020.0002] # CUNEIFORM SIGN KA TIMES KID +12172 ; [.4D5E.0020.0002] # CUNEIFORM SIGN KA TIMES LI +12173 ; [.4D5F.0020.0002] # CUNEIFORM SIGN KA TIMES LU +12174 ; [.4D60.0020.0002] # CUNEIFORM SIGN KA TIMES ME +12175 ; [.4D61.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS DU +12176 ; [.4D62.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS GI +12177 ; [.4D63.0020.0002] # CUNEIFORM SIGN KA TIMES ME PLUS TE +12178 ; [.4D64.0020.0002] # CUNEIFORM SIGN KA TIMES MI +12179 ; [.4D65.0020.0002] # CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ +1217A ; [.4D66.0020.0002] # CUNEIFORM SIGN KA TIMES NE +1217B ; [.4D67.0020.0002] # CUNEIFORM SIGN KA TIMES NUN +1217C ; [.4D68.0020.0002] # CUNEIFORM SIGN KA TIMES PI +1217D ; [.4D69.0020.0002] # CUNEIFORM SIGN KA TIMES RU +1217E ; [.4D6A.0020.0002] # CUNEIFORM SIGN KA TIMES SA +1217F ; [.4D6B.0020.0002] # CUNEIFORM SIGN KA TIMES SAR +12180 ; [.4D6C.0020.0002] # CUNEIFORM SIGN KA TIMES SHA +12181 ; [.4D6D.0020.0002] # CUNEIFORM SIGN KA TIMES SHE +12182 ; [.4D6E.0020.0002] # CUNEIFORM SIGN KA TIMES SHID +12183 ; [.4D6F.0020.0002] # CUNEIFORM SIGN KA TIMES SHU +12184 ; [.4D70.0020.0002] # CUNEIFORM SIGN KA TIMES SIG +12185 ; [.4D71.0020.0002] # CUNEIFORM SIGN KA TIMES SUHUR +12186 ; [.4D72.0020.0002] # CUNEIFORM SIGN KA TIMES TAR +12187 ; [.4D73.0020.0002] # CUNEIFORM SIGN KA TIMES U +12188 ; [.4D74.0020.0002] # CUNEIFORM SIGN KA TIMES U2 +12189 ; [.4D75.0020.0002] # CUNEIFORM SIGN KA TIMES UD +1218A ; [.4D76.0020.0002] # CUNEIFORM SIGN KA TIMES UMUM TIMES PA +1218B ; [.4D77.0020.0002] # CUNEIFORM SIGN KA TIMES USH +1218C ; [.4D78.0020.0002] # CUNEIFORM SIGN KA TIMES ZI +1218D ; [.4D79.0020.0002] # CUNEIFORM SIGN KA2 +1218E ; [.4D7A.0020.0002] # CUNEIFORM SIGN KA2 CROSSING KA2 +1218F ; [.4D7B.0020.0002] # CUNEIFORM SIGN KAB +12190 ; [.4D7C.0020.0002] # CUNEIFORM SIGN KAD2 +12191 ; [.4D7D.0020.0002] # CUNEIFORM SIGN KAD3 +12192 ; [.4D7E.0020.0002] # CUNEIFORM SIGN KAD4 +12193 ; [.4D7F.0020.0002] # CUNEIFORM SIGN KAD5 +12194 ; [.4D80.0020.0002] # CUNEIFORM SIGN KAD5 OVER KAD5 +12195 ; [.4D81.0020.0002] # CUNEIFORM SIGN KAK +12196 ; [.4D82.0020.0002] # CUNEIFORM SIGN KAK TIMES IGI GUNU +12197 ; [.4D83.0020.0002] # CUNEIFORM SIGN KAL +12198 ; [.4D84.0020.0002] # CUNEIFORM SIGN KAL TIMES BAD +12199 ; [.4D85.0020.0002] # CUNEIFORM SIGN KAL CROSSING KAL +1219A ; [.4D86.0020.0002] # CUNEIFORM SIGN KAM2 +1219B ; [.4D87.0020.0002] # CUNEIFORM SIGN KAM4 +1219C ; [.4D88.0020.0002] # CUNEIFORM SIGN KASKAL +1219D ; [.4D89.0020.0002] # CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U +1219E ; [.4D8A.0020.0002] # CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U +1219F ; [.4D8B.0020.0002] # CUNEIFORM SIGN KESH2 +121A0 ; [.4D8C.0020.0002] # CUNEIFORM SIGN KI +121A1 ; [.4D8D.0020.0002] # CUNEIFORM SIGN KI TIMES BAD +121A2 ; [.4D8E.0020.0002] # CUNEIFORM SIGN KI TIMES U +121A3 ; [.4D8F.0020.0002] # CUNEIFORM SIGN KI TIMES UD +121A4 ; [.4D90.0020.0002] # CUNEIFORM SIGN KID +121A5 ; [.4D91.0020.0002] # CUNEIFORM SIGN KIN +121A6 ; [.4D92.0020.0002] # CUNEIFORM SIGN KISAL +121A7 ; [.4D93.0020.0002] # CUNEIFORM SIGN KISH +121A8 ; [.4D94.0020.0002] # CUNEIFORM SIGN KISIM5 +121A9 ; [.4D95.0020.0002] # CUNEIFORM SIGN KISIM5 OVER KISIM5 +121AA ; [.4D96.0020.0002] # CUNEIFORM SIGN KU +121AB ; [.4D97.0020.0002] # CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2 +121AC ; [.4D98.0020.0002] # CUNEIFORM SIGN KU3 +121AD ; [.4D99.0020.0002] # CUNEIFORM SIGN KU4 +121AE ; [.4D9A.0020.0002] # CUNEIFORM SIGN KU4 VARIANT FORM +121AF ; [.4D9B.0020.0002] # CUNEIFORM SIGN KU7 +121B0 ; [.4D9C.0020.0002] # CUNEIFORM SIGN KUL +121B1 ; [.4D9D.0020.0002] # CUNEIFORM SIGN KUL GUNU +121B2 ; [.4D9E.0020.0002] # CUNEIFORM SIGN KUN +121B3 ; [.4D9F.0020.0002] # CUNEIFORM SIGN KUR +121B4 ; [.4DA0.0020.0002] # CUNEIFORM SIGN KUR OPPOSING KUR +121B5 ; [.4DA1.0020.0002] # CUNEIFORM SIGN KUSHU2 +121B6 ; [.4DA2.0020.0002] # CUNEIFORM SIGN KWU318 +121B7 ; [.4DA3.0020.0002] # CUNEIFORM SIGN LA +121B8 ; [.4DA4.0020.0002] # CUNEIFORM SIGN LAGAB +121B9 ; [.4DA5.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A +121BA ; [.4DA6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA +121BB ; [.4DA7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS GAR +121BC ; [.4DA8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES A PLUS LAL +121BD ; [.4DA9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AL +121BE ; [.4DAA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES AN +121BF ; [.4DAB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU +121C0 ; [.4DAC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BAD +121C1 ; [.4DAD.0020.0002] # CUNEIFORM SIGN LAGAB TIMES BI +121C2 ; [.4DAE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES DAR +121C3 ; [.4DAF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES EN +121C4 ; [.4DB0.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GA +121C5 ; [.4DB1.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GAR +121C6 ; [.4DB2.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD +121C7 ; [.4DB3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD +121C8 ; [.4DB4.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HA +121C9 ; [.4DB5.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HAL +121CA ; [.4DB6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN +121CB ; [.4DB7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IGI GUNU +121CC ; [.4DB8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM +121CD ; [.4DB9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS HA +121CE ; [.4DBA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES IM PLUS LU +121CF ; [.4DBB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KI +121D0 ; [.4DBC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KIN +121D1 ; [.4DBD.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KU3 +121D2 ; [.4DBE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL +121D3 ; [.4DBF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A +121D4 ; [.4DC0.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LAGAB +121D5 ; [.4DC1.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LISH +121D6 ; [.4DC2.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LU +121D7 ; [.4DC3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES LUL +121D8 ; [.4DC4.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME +121D9 ; [.4DC5.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ME PLUS EN +121DA ; [.4DC6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES MUSH +121DB ; [.4DC7.0020.0002] # CUNEIFORM SIGN LAGAB TIMES NE +121DC ; [.4DC8.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM +121DD ; [.4DC9.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2 +121DE ; [.4DCA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU +121DF ; [.4DCB.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 +121E0 ; [.4DCC.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2 +121E1 ; [.4DCD.0020.0002] # CUNEIFORM SIGN LAGAB TIMES SUM +121E2 ; [.4DCE.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAG +121E3 ; [.4DCF.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TAK4 +121E4 ; [.4DD0.0020.0002] # CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA +121E5 ; [.4DD1.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U +121E6 ; [.4DD2.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS A +121E7 ; [.4DD3.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U +121E8 ; [.4DD4.0020.0002] # CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH +121E9 ; [.4DD5.0020.0002] # CUNEIFORM SIGN LAGAB TIMES UD +121EA ; [.4DD6.0020.0002] # CUNEIFORM SIGN LAGAB TIMES USH +121EB ; [.4DD7.0020.0002] # CUNEIFORM SIGN LAGAB SQUARED +121EC ; [.4DD8.0020.0002] # CUNEIFORM SIGN LAGAR +121ED ; [.4DD9.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE +121EE ; [.4DDA.0020.0002] # CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM +121EF ; [.4DDB.0020.0002] # CUNEIFORM SIGN LAGAR GUNU +121F0 ; [.4DDC.0020.0002] # CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE +121F1 ; [.4DDD.0020.0002] # CUNEIFORM SIGN LAHSHU +121F2 ; [.4DDE.0020.0002] # CUNEIFORM SIGN LAL +121F3 ; [.4DDF.0020.0002] # CUNEIFORM SIGN LAL TIMES LAL +121F4 ; [.4DE0.0020.0002] # CUNEIFORM SIGN LAM +121F5 ; [.4DE1.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR +121F6 ; [.4DE2.0020.0002] # CUNEIFORM SIGN LAM TIMES KUR PLUS RU +121F7 ; [.4DE3.0020.0002] # CUNEIFORM SIGN LI +121F8 ; [.4DE4.0020.0002] # CUNEIFORM SIGN LIL +121F9 ; [.4DE5.0020.0002] # CUNEIFORM SIGN LIMMU2 +121FA ; [.4DE6.0020.0002] # CUNEIFORM SIGN LISH +121FB ; [.4DE7.0020.0002] # CUNEIFORM SIGN LU +121FC ; [.4DE8.0020.0002] # CUNEIFORM SIGN LU TIMES BAD +121FD ; [.4DE9.0020.0002] # CUNEIFORM SIGN LU2 +121FE ; [.4DEA.0020.0002] # CUNEIFORM SIGN LU2 TIMES AL +121FF ; [.4DEB.0020.0002] # CUNEIFORM SIGN LU2 TIMES BAD +12200 ; [.4DEC.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 +12201 ; [.4DED.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 TENU +12202 ; [.4DEE.0020.0002] # CUNEIFORM SIGN LU2 TIMES GAN2 TENU +12203 ; [.4DEF.0020.0002] # CUNEIFORM SIGN LU2 TIMES HI TIMES BAD +12204 ; [.4DF0.0020.0002] # CUNEIFORM SIGN LU2 TIMES IM +12205 ; [.4DF1.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD2 +12206 ; [.4DF2.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 +12207 ; [.4DF3.0020.0002] # CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH +12208 ; [.4DF4.0020.0002] # CUNEIFORM SIGN LU2 TIMES KI +12209 ; [.4DF5.0020.0002] # CUNEIFORM SIGN LU2 TIMES LA PLUS ASH +1220A ; [.4DF6.0020.0002] # CUNEIFORM SIGN LU2 TIMES LAGAB +1220B ; [.4DF7.0020.0002] # CUNEIFORM SIGN LU2 TIMES ME PLUS EN +1220C ; [.4DF8.0020.0002] # CUNEIFORM SIGN LU2 TIMES NE +1220D ; [.4DF9.0020.0002] # CUNEIFORM SIGN LU2 TIMES NU +1220E ; [.4DFA.0020.0002] # CUNEIFORM SIGN LU2 TIMES SI PLUS ASH +1220F ; [.4DFB.0020.0002] # CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU +12210 ; [.4DFC.0020.0002] # CUNEIFORM SIGN LU2 TIMES TUG2 +12211 ; [.4DFD.0020.0002] # CUNEIFORM SIGN LU2 TENU +12212 ; [.4DFE.0020.0002] # CUNEIFORM SIGN LU2 CROSSING LU2 +12213 ; [.4DFF.0020.0002] # CUNEIFORM SIGN LU2 OPPOSING LU2 +12214 ; [.4E00.0020.0002] # CUNEIFORM SIGN LU2 SQUARED +12215 ; [.4E01.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG +12216 ; [.4E02.0020.0002] # CUNEIFORM SIGN LU3 +12217 ; [.4E03.0020.0002] # CUNEIFORM SIGN LUGAL +12218 ; [.4E04.0020.0002] # CUNEIFORM SIGN LUGAL OVER LUGAL +12219 ; [.4E05.0020.0002] # CUNEIFORM SIGN LUGAL OPPOSING LUGAL +1221A ; [.4E06.0020.0002] # CUNEIFORM SIGN LUGAL SHESHIG +1221B ; [.4E07.0020.0002] # CUNEIFORM SIGN LUH +1221C ; [.4E08.0020.0002] # CUNEIFORM SIGN LUL +1221D ; [.4E09.0020.0002] # CUNEIFORM SIGN LUM +1221E ; [.4E0A.0020.0002] # CUNEIFORM SIGN LUM OVER LUM +1221F ; [.4E0B.0020.0002] # CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR +12220 ; [.4E0C.0020.0002] # CUNEIFORM SIGN MA +12221 ; [.4E0D.0020.0002] # CUNEIFORM SIGN MA TIMES TAK4 +12222 ; [.4E0E.0020.0002] # CUNEIFORM SIGN MA GUNU +12223 ; [.4E0F.0020.0002] # CUNEIFORM SIGN MA2 +12224 ; [.4E10.0020.0002] # CUNEIFORM SIGN MAH +12225 ; [.4E11.0020.0002] # CUNEIFORM SIGN MAR +12226 ; [.4E12.0020.0002] # CUNEIFORM SIGN MASH +12227 ; [.4E13.0020.0002] # CUNEIFORM SIGN MASH2 +12228 ; [.4E14.0020.0002] # CUNEIFORM SIGN ME +12229 ; [.4E15.0020.0002] # CUNEIFORM SIGN MES +1222A ; [.4E16.0020.0002] # CUNEIFORM SIGN MI +1222B ; [.4E17.0020.0002] # CUNEIFORM SIGN MIN +1222C ; [.4E18.0020.0002] # CUNEIFORM SIGN MU +1222D ; [.4E19.0020.0002] # CUNEIFORM SIGN MU OVER MU +1222E ; [.4E1A.0020.0002] # CUNEIFORM SIGN MUG +1222F ; [.4E1B.0020.0002] # CUNEIFORM SIGN MUG GUNU +12230 ; [.4E1C.0020.0002] # CUNEIFORM SIGN MUNSUB +12231 ; [.4E1D.0020.0002] # CUNEIFORM SIGN MURGU2 +12232 ; [.4E1E.0020.0002] # CUNEIFORM SIGN MUSH +12233 ; [.4E1F.0020.0002] # CUNEIFORM SIGN MUSH TIMES A +12234 ; [.4E20.0020.0002] # CUNEIFORM SIGN MUSH TIMES KUR +12235 ; [.4E21.0020.0002] # CUNEIFORM SIGN MUSH TIMES ZA +12236 ; [.4E22.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH +12237 ; [.4E23.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA +12238 ; [.4E24.0020.0002] # CUNEIFORM SIGN MUSH CROSSING MUSH +12239 ; [.4E25.0020.0002] # CUNEIFORM SIGN MUSH3 +1223A ; [.4E26.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A +1223B ; [.4E27.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES A PLUS DI +1223C ; [.4E28.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES DI +1223D ; [.4E29.0020.0002] # CUNEIFORM SIGN MUSH3 GUNU +1223E ; [.4E2A.0020.0002] # CUNEIFORM SIGN NA +1223F ; [.4E2B.0020.0002] # CUNEIFORM SIGN NA2 +12240 ; [.4E2C.0020.0002] # CUNEIFORM SIGN NAGA +12241 ; [.4E2D.0020.0002] # CUNEIFORM SIGN NAGA INVERTED +12242 ; [.4E2E.0020.0002] # CUNEIFORM SIGN NAGA TIMES SHU TENU +12243 ; [.4E2F.0020.0002] # CUNEIFORM SIGN NAGA OPPOSING NAGA +12244 ; [.4E30.0020.0002] # CUNEIFORM SIGN NAGAR +12245 ; [.4E31.0020.0002] # CUNEIFORM SIGN NAM NUTILLU +12246 ; [.4E32.0020.0002] # CUNEIFORM SIGN NAM +12247 ; [.4E33.0020.0002] # CUNEIFORM SIGN NAM2 +12248 ; [.4E34.0020.0002] # CUNEIFORM SIGN NE +12249 ; [.4E35.0020.0002] # CUNEIFORM SIGN NE TIMES A +1224A ; [.4E36.0020.0002] # CUNEIFORM SIGN NE TIMES UD +1224B ; [.4E37.0020.0002] # CUNEIFORM SIGN NE SHESHIG +1224C ; [.4E38.0020.0002] # CUNEIFORM SIGN NI +1224D ; [.4E39.0020.0002] # CUNEIFORM SIGN NI TIMES E +1224E ; [.4E3A.0020.0002] # CUNEIFORM SIGN NI2 +1224F ; [.4E3B.0020.0002] # CUNEIFORM SIGN NIM +12250 ; [.4E3C.0020.0002] # CUNEIFORM SIGN NIM TIMES GAN2 TENU +12251 ; [.4E3D.0020.0002] # CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU +12252 ; [.4E3E.0020.0002] # CUNEIFORM SIGN NINDA2 +12253 ; [.4E3F.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES AN +12254 ; [.4E40.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH +12255 ; [.4E41.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH +12256 ; [.4E42.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUD +12257 ; [.4E43.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU +12258 ; [.4E44.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NE +12259 ; [.4E45.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES NUN +1225A ; [.4E46.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE +1225B ; [.4E47.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN +1225C ; [.4E48.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH +1225D ; [.4E49.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH +1225E ; [.4E4A.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH +1225F ; [.4E4B.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES USH +12260 ; [.4E4C.0020.0002] # CUNEIFORM SIGN NISAG +12261 ; [.4E4D.0020.0002] # CUNEIFORM SIGN NU +12262 ; [.4E4E.0020.0002] # CUNEIFORM SIGN NU11 +122D4 ; [.4E4F.0020.0002] # CUNEIFORM SIGN SHIR TENU +122D5 ; [.4E50.0020.0002] # CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR +12263 ; [.4E51.0020.0002] # CUNEIFORM SIGN NUN +12264 ; [.4E52.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES GAR +12265 ; [.4E53.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES MASH +12266 ; [.4E54.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL +12267 ; [.4E55.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL +12268 ; [.4E56.0020.0002] # CUNEIFORM SIGN NUN LAGAR TIMES USH +12269 ; [.4E57.0020.0002] # CUNEIFORM SIGN NUN TENU +1226A ; [.4E58.0020.0002] # CUNEIFORM SIGN NUN OVER NUN +1226B ; [.4E59.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN +1226C ; [.4E5A.0020.0002] # CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR +1226D ; [.4E5B.0020.0002] # CUNEIFORM SIGN NUNUZ +1226E ; [.4E5C.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB +1226F ; [.4E5D.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES BI +12270 ; [.4E5E.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES DUG +12271 ; [.4E5F.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES GUD +12272 ; [.4E60.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU +12273 ; [.4E61.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3 +12274 ; [.4E62.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES LA +12275 ; [.4E63.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES NE +12276 ; [.4E64.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3 +12277 ; [.4E65.0020.0002] # CUNEIFORM SIGN NUNUZ AB2 TIMES U2 +12278 ; [.4E66.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI +12279 ; [.4E67.0020.0002] # CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U +1227A ; [.4E68.0020.0002] # CUNEIFORM SIGN PA +1227B ; [.4E69.0020.0002] # CUNEIFORM SIGN PAD +1227C ; [.4E6A.0020.0002] # CUNEIFORM SIGN PAN +1227D ; [.4E6B.0020.0002] # CUNEIFORM SIGN PAP +1227E ; [.4E6C.0020.0002] # CUNEIFORM SIGN PESH2 +1227F ; [.4E6D.0020.0002] # CUNEIFORM SIGN PI +12280 ; [.4E6E.0020.0002] # CUNEIFORM SIGN PI TIMES A +12281 ; [.4E6F.0020.0002] # CUNEIFORM SIGN PI TIMES AB +12282 ; [.4E70.0020.0002] # CUNEIFORM SIGN PI TIMES BI +12283 ; [.4E71.0020.0002] # CUNEIFORM SIGN PI TIMES BU +12284 ; [.4E72.0020.0002] # CUNEIFORM SIGN PI TIMES E +12285 ; [.4E73.0020.0002] # CUNEIFORM SIGN PI TIMES I +12286 ; [.4E74.0020.0002] # CUNEIFORM SIGN PI TIMES IB +12287 ; [.4E75.0020.0002] # CUNEIFORM SIGN PI TIMES U +12288 ; [.4E76.0020.0002] # CUNEIFORM SIGN PI TIMES U2 +12289 ; [.4E77.0020.0002] # CUNEIFORM SIGN PI CROSSING PI +1228A ; [.4E78.0020.0002] # CUNEIFORM SIGN PIRIG +1228B ; [.4E79.0020.0002] # CUNEIFORM SIGN PIRIG TIMES KAL +1228C ; [.4E7A.0020.0002] # CUNEIFORM SIGN PIRIG TIMES UD +1228D ; [.4E7B.0020.0002] # CUNEIFORM SIGN PIRIG TIMES ZA +1228E ; [.4E7C.0020.0002] # CUNEIFORM SIGN PIRIG OPPOSING PIRIG +1228F ; [.4E7D.0020.0002] # CUNEIFORM SIGN RA +12290 ; [.4E7E.0020.0002] # CUNEIFORM SIGN RAB +12291 ; [.4E7F.0020.0002] # CUNEIFORM SIGN RI +12292 ; [.4E80.0020.0002] # CUNEIFORM SIGN RU +12293 ; [.4E81.0020.0002] # CUNEIFORM SIGN SA +12294 ; [.4E82.0020.0002] # CUNEIFORM SIGN SAG NUTILLU +12295 ; [.4E83.0020.0002] # CUNEIFORM SIGN SAG +12296 ; [.4E84.0020.0002] # CUNEIFORM SIGN SAG TIMES A +12297 ; [.4E85.0020.0002] # CUNEIFORM SIGN SAG TIMES DU +12298 ; [.4E86.0020.0002] # CUNEIFORM SIGN SAG TIMES DUB +12299 ; [.4E87.0020.0002] # CUNEIFORM SIGN SAG TIMES HA +1229A ; [.4E88.0020.0002] # CUNEIFORM SIGN SAG TIMES KAK +1229B ; [.4E89.0020.0002] # CUNEIFORM SIGN SAG TIMES KUR +1229C ; [.4E8A.0020.0002] # CUNEIFORM SIGN SAG TIMES LUM +1229D ; [.4E8B.0020.0002] # CUNEIFORM SIGN SAG TIMES MI +1229E ; [.4E8C.0020.0002] # CUNEIFORM SIGN SAG TIMES NUN +1229F ; [.4E8D.0020.0002] # CUNEIFORM SIGN SAG TIMES SAL +122A0 ; [.4E8E.0020.0002] # CUNEIFORM SIGN SAG TIMES SHID +122A1 ; [.4E8F.0020.0002] # CUNEIFORM SIGN SAG TIMES TAB +122A2 ; [.4E90.0020.0002] # CUNEIFORM SIGN SAG TIMES U2 +122A3 ; [.4E91.0020.0002] # CUNEIFORM SIGN SAG TIMES UB +122A4 ; [.4E92.0020.0002] # CUNEIFORM SIGN SAG TIMES UM +122A5 ; [.4E93.0020.0002] # CUNEIFORM SIGN SAG TIMES UR +122A6 ; [.4E94.0020.0002] # CUNEIFORM SIGN SAG TIMES USH +122A7 ; [.4E95.0020.0002] # CUNEIFORM SIGN SAG OVER SAG +122A8 ; [.4E96.0020.0002] # CUNEIFORM SIGN SAG GUNU +122A9 ; [.4E97.0020.0002] # CUNEIFORM SIGN SAL +122AA ; [.4E98.0020.0002] # CUNEIFORM SIGN SAL LAGAB TIMES ASH2 +122AB ; [.4E99.0020.0002] # CUNEIFORM SIGN SANGA2 +122AC ; [.4E9A.0020.0002] # CUNEIFORM SIGN SAR +122AD ; [.4E9B.0020.0002] # CUNEIFORM SIGN SHA +122AE ; [.4E9C.0020.0002] # CUNEIFORM SIGN SHA3 +122AF ; [.4E9D.0020.0002] # CUNEIFORM SIGN SHA3 TIMES A +122B0 ; [.4E9E.0020.0002] # CUNEIFORM SIGN SHA3 TIMES BAD +122B1 ; [.4E9F.0020.0002] # CUNEIFORM SIGN SHA3 TIMES GISH +122B2 ; [.4EA0.0020.0002] # CUNEIFORM SIGN SHA3 TIMES NE +122B3 ; [.4EA1.0020.0002] # CUNEIFORM SIGN SHA3 TIMES SHU2 +122B4 ; [.4EA2.0020.0002] # CUNEIFORM SIGN SHA3 TIMES TUR +122B5 ; [.4EA3.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U +122B6 ; [.4EA4.0020.0002] # CUNEIFORM SIGN SHA3 TIMES U PLUS A +122B7 ; [.4EA5.0020.0002] # CUNEIFORM SIGN SHA6 +122B8 ; [.4EA6.0020.0002] # CUNEIFORM SIGN SHAB6 +122B9 ; [.4EA7.0020.0002] # CUNEIFORM SIGN SHAR2 +122BA ; [.4EA8.0020.0002] # CUNEIFORM SIGN SHE +122BB ; [.4EA9.0020.0002] # CUNEIFORM SIGN SHE HU +122BC ; [.4EAA.0020.0002] # CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR +122BD ; [.4EAB.0020.0002] # CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR +122BE ; [.4EAC.0020.0002] # CUNEIFORM SIGN SHEG9 +122BF ; [.4EAD.0020.0002] # CUNEIFORM SIGN SHEN +122C0 ; [.4EAE.0020.0002] # CUNEIFORM SIGN SHESH +122C1 ; [.4EAF.0020.0002] # CUNEIFORM SIGN SHESH2 +122C2 ; [.4EB0.0020.0002] # CUNEIFORM SIGN SHESHLAM +122C3 ; [.4EB1.0020.0002] # CUNEIFORM SIGN SHID +122C4 ; [.4EB2.0020.0002] # CUNEIFORM SIGN SHID TIMES A +122C5 ; [.4EB3.0020.0002] # CUNEIFORM SIGN SHID TIMES IM +122C6 ; [.4EB4.0020.0002] # CUNEIFORM SIGN SHIM +122C7 ; [.4EB5.0020.0002] # CUNEIFORM SIGN SHIM TIMES A +122C8 ; [.4EB6.0020.0002] # CUNEIFORM SIGN SHIM TIMES BAL +122C9 ; [.4EB7.0020.0002] # CUNEIFORM SIGN SHIM TIMES BULUG +122CA ; [.4EB8.0020.0002] # CUNEIFORM SIGN SHIM TIMES DIN +122CB ; [.4EB9.0020.0002] # CUNEIFORM SIGN SHIM TIMES GAR +122CC ; [.4EBA.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI +122CD ; [.4EBB.0020.0002] # CUNEIFORM SIGN SHIM TIMES IGI GUNU +122CE ; [.4EBC.0020.0002] # CUNEIFORM SIGN SHIM TIMES KUSHU2 +122CF ; [.4EBD.0020.0002] # CUNEIFORM SIGN SHIM TIMES LUL +122D0 ; [.4EBE.0020.0002] # CUNEIFORM SIGN SHIM TIMES MUG +122D1 ; [.4EBF.0020.0002] # CUNEIFORM SIGN SHIM TIMES SAL +122D2 ; [.4EC0.0020.0002] # CUNEIFORM SIGN SHINIG +122D3 ; [.4EC1.0020.0002] # CUNEIFORM SIGN SHIR +122D6 ; [.4EC2.0020.0002] # CUNEIFORM SIGN SHITA +122D7 ; [.4EC3.0020.0002] # CUNEIFORM SIGN SHU +122D8 ; [.4EC4.0020.0002] # CUNEIFORM SIGN SHU OVER INVERTED SHU +122D9 ; [.4EC5.0020.0002] # CUNEIFORM SIGN SHU2 +122DA ; [.4EC6.0020.0002] # CUNEIFORM SIGN SHUBUR +122DB ; [.4EC7.0020.0002] # CUNEIFORM SIGN SI +122DC ; [.4EC8.0020.0002] # CUNEIFORM SIGN SI GUNU +122DD ; [.4EC9.0020.0002] # CUNEIFORM SIGN SIG +122DE ; [.4ECA.0020.0002] # CUNEIFORM SIGN SIG4 +122DF ; [.4ECB.0020.0002] # CUNEIFORM SIGN SIG4 OVER SIG4 SHU2 +122E0 ; [.4ECC.0020.0002] # CUNEIFORM SIGN SIK2 +122E1 ; [.4ECD.0020.0002] # CUNEIFORM SIGN SILA3 +122E2 ; [.4ECE.0020.0002] # CUNEIFORM SIGN SU +122E3 ; [.4ECF.0020.0002] # CUNEIFORM SIGN SU OVER SU +122E4 ; [.4ED0.0020.0002] # CUNEIFORM SIGN SUD +122E5 ; [.4ED1.0020.0002] # CUNEIFORM SIGN SUD2 +122E6 ; [.4ED2.0020.0002] # CUNEIFORM SIGN SUHUR +122E7 ; [.4ED3.0020.0002] # CUNEIFORM SIGN SUM +122E8 ; [.4ED4.0020.0002] # CUNEIFORM SIGN SUMASH +122E9 ; [.4ED5.0020.0002] # CUNEIFORM SIGN SUR +122EA ; [.4ED6.0020.0002] # CUNEIFORM SIGN SUR9 +122EB ; [.4ED7.0020.0002] # CUNEIFORM SIGN TA +122EC ; [.4ED8.0020.0002] # CUNEIFORM SIGN TA ASTERISK +122ED ; [.4ED9.0020.0002] # CUNEIFORM SIGN TA TIMES HI +122EE ; [.4EDA.0020.0002] # CUNEIFORM SIGN TA TIMES MI +122EF ; [.4EDB.0020.0002] # CUNEIFORM SIGN TA GUNU +122F0 ; [.4EDC.0020.0002] # CUNEIFORM SIGN TAB +122F1 ; [.4EDD.0020.0002] # CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH +122F2 ; [.4EDE.0020.0002] # CUNEIFORM SIGN TAB SQUARED +122F3 ; [.4EDF.0020.0002] # CUNEIFORM SIGN TAG +122F4 ; [.4EE0.0020.0002] # CUNEIFORM SIGN TAG TIMES BI +122F5 ; [.4EE1.0020.0002] # CUNEIFORM SIGN TAG TIMES GUD +122F6 ; [.4EE2.0020.0002] # CUNEIFORM SIGN TAG TIMES SHE +122F7 ; [.4EE3.0020.0002] # CUNEIFORM SIGN TAG TIMES SHU +122F8 ; [.4EE4.0020.0002] # CUNEIFORM SIGN TAG TIMES TUG2 +122F9 ; [.4EE5.0020.0002] # CUNEIFORM SIGN TAG TIMES UD +122FA ; [.4EE6.0020.0002] # CUNEIFORM SIGN TAK4 +122FB ; [.4EE7.0020.0002] # CUNEIFORM SIGN TAR +122FC ; [.4EE8.0020.0002] # CUNEIFORM SIGN TE +122FD ; [.4EE9.0020.0002] # CUNEIFORM SIGN TE GUNU +122FE ; [.4EEA.0020.0002] # CUNEIFORM SIGN TI +122FF ; [.4EEB.0020.0002] # CUNEIFORM SIGN TI TENU +12300 ; [.4EEC.0020.0002] # CUNEIFORM SIGN TIL +12301 ; [.4EED.0020.0002] # CUNEIFORM SIGN TIR +12302 ; [.4EEE.0020.0002] # CUNEIFORM SIGN TIR TIMES TAK4 +12303 ; [.4EEF.0020.0002] # CUNEIFORM SIGN TIR OVER TIR +12304 ; [.4EF0.0020.0002] # CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR +12305 ; [.4EF1.0020.0002] # CUNEIFORM SIGN TU +12306 ; [.4EF2.0020.0002] # CUNEIFORM SIGN TUG2 +12307 ; [.4EF3.0020.0002] # CUNEIFORM SIGN TUK +12308 ; [.4EF4.0020.0002] # CUNEIFORM SIGN TUM +12309 ; [.4EF5.0020.0002] # CUNEIFORM SIGN TUR +1230A ; [.4EF6.0020.0002] # CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA +1230B ; [.4EF7.0020.0002] # CUNEIFORM SIGN U +1230C ; [.4EF8.0020.0002] # CUNEIFORM SIGN U GUD +1230D ; [.4EF9.0020.0002] # CUNEIFORM SIGN U U U +1230E ; [.4EFA.0020.0002] # CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR +1230F ; [.4EFB.0020.0002] # CUNEIFORM SIGN U OVER U SUR OVER SUR +12310 ; [.4EFC.0020.0002] # CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED +12311 ; [.4EFD.0020.0002] # CUNEIFORM SIGN U2 +12312 ; [.4EFE.0020.0002] # CUNEIFORM SIGN UB +12313 ; [.4EFF.0020.0002] # CUNEIFORM SIGN UD +12314 ; [.4F00.0020.0002] # CUNEIFORM SIGN UD KUSHU2 +12315 ; [.4F01.0020.0002] # CUNEIFORM SIGN UD TIMES BAD +12316 ; [.4F02.0020.0002] # CUNEIFORM SIGN UD TIMES MI +12317 ; [.4F03.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U +12318 ; [.4F04.0020.0002] # CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU +12319 ; [.4F05.0020.0002] # CUNEIFORM SIGN UD GUNU +1231A ; [.4F06.0020.0002] # CUNEIFORM SIGN UD SHESHIG +1231B ; [.4F07.0020.0002] # CUNEIFORM SIGN UD SHESHIG TIMES BAD +1231C ; [.4F08.0020.0002] # CUNEIFORM SIGN UDUG +1231D ; [.4F09.0020.0002] # CUNEIFORM SIGN UM +1231E ; [.4F0A.0020.0002] # CUNEIFORM SIGN UM TIMES LAGAB +1231F ; [.4F0B.0020.0002] # CUNEIFORM SIGN UM TIMES ME PLUS DA +12320 ; [.4F0C.0020.0002] # CUNEIFORM SIGN UM TIMES SHA3 +12321 ; [.4F0D.0020.0002] # CUNEIFORM SIGN UM TIMES U +12322 ; [.4F0E.0020.0002] # CUNEIFORM SIGN UMBIN +12323 ; [.4F0F.0020.0002] # CUNEIFORM SIGN UMUM +12324 ; [.4F10.0020.0002] # CUNEIFORM SIGN UMUM TIMES KASKAL +12325 ; [.4F11.0020.0002] # CUNEIFORM SIGN UMUM TIMES PA +12326 ; [.4F12.0020.0002] # CUNEIFORM SIGN UN +12327 ; [.4F13.0020.0002] # CUNEIFORM SIGN UN GUNU +12328 ; [.4F14.0020.0002] # CUNEIFORM SIGN UR +12329 ; [.4F15.0020.0002] # CUNEIFORM SIGN UR CROSSING UR +1232A ; [.4F16.0020.0002] # CUNEIFORM SIGN UR SHESHIG +1232B ; [.4F17.0020.0002] # CUNEIFORM SIGN UR2 +1232C ; [.4F18.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS HA +1232D ; [.4F19.0020.0002] # CUNEIFORM SIGN UR2 TIMES A PLUS NA +1232E ; [.4F1A.0020.0002] # CUNEIFORM SIGN UR2 TIMES AL +1232F ; [.4F1B.0020.0002] # CUNEIFORM SIGN UR2 TIMES HA +12330 ; [.4F1C.0020.0002] # CUNEIFORM SIGN UR2 TIMES NUN +12331 ; [.4F1D.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 +12332 ; [.4F1E.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH +12333 ; [.4F1F.0020.0002] # CUNEIFORM SIGN UR2 TIMES U2 PLUS BI +12334 ; [.4F20.0020.0002] # CUNEIFORM SIGN UR4 +12335 ; [.4F21.0020.0002] # CUNEIFORM SIGN URI +12336 ; [.4F22.0020.0002] # CUNEIFORM SIGN URI3 +12337 ; [.4F23.0020.0002] # CUNEIFORM SIGN URU +12338 ; [.4F24.0020.0002] # CUNEIFORM SIGN URU TIMES A +12339 ; [.4F25.0020.0002] # CUNEIFORM SIGN URU TIMES ASHGAB +1233A ; [.4F26.0020.0002] # CUNEIFORM SIGN URU TIMES BAR +1233B ; [.4F27.0020.0002] # CUNEIFORM SIGN URU TIMES DUN +1233C ; [.4F28.0020.0002] # CUNEIFORM SIGN URU TIMES GA +1233D ; [.4F29.0020.0002] # CUNEIFORM SIGN URU TIMES GAL +1233E ; [.4F2A.0020.0002] # CUNEIFORM SIGN URU TIMES GAN2 TENU +1233F ; [.4F2B.0020.0002] # CUNEIFORM SIGN URU TIMES GAR +12340 ; [.4F2C.0020.0002] # CUNEIFORM SIGN URU TIMES GU +12341 ; [.4F2D.0020.0002] # CUNEIFORM SIGN URU TIMES HA +12342 ; [.4F2E.0020.0002] # CUNEIFORM SIGN URU TIMES IGI +12343 ; [.4F2F.0020.0002] # CUNEIFORM SIGN URU TIMES IM +12344 ; [.4F30.0020.0002] # CUNEIFORM SIGN URU TIMES ISH +12345 ; [.4F31.0020.0002] # CUNEIFORM SIGN URU TIMES KI +12346 ; [.4F32.0020.0002] # CUNEIFORM SIGN URU TIMES LUM +12347 ; [.4F33.0020.0002] # CUNEIFORM SIGN URU TIMES MIN +12348 ; [.4F34.0020.0002] # CUNEIFORM SIGN URU TIMES PA +12349 ; [.4F35.0020.0002] # CUNEIFORM SIGN URU TIMES SHE +1234A ; [.4F36.0020.0002] # CUNEIFORM SIGN URU TIMES SIG4 +1234B ; [.4F37.0020.0002] # CUNEIFORM SIGN URU TIMES TU +1234C ; [.4F38.0020.0002] # CUNEIFORM SIGN URU TIMES U PLUS GUD +1234D ; [.4F39.0020.0002] # CUNEIFORM SIGN URU TIMES UD +1234E ; [.4F3A.0020.0002] # CUNEIFORM SIGN URU TIMES URUDA +1234F ; [.4F3B.0020.0002] # CUNEIFORM SIGN URUDA +12350 ; [.4F3C.0020.0002] # CUNEIFORM SIGN URUDA TIMES U +12351 ; [.4F3D.0020.0002] # CUNEIFORM SIGN USH +12352 ; [.4F3E.0020.0002] # CUNEIFORM SIGN USH TIMES A +12353 ; [.4F3F.0020.0002] # CUNEIFORM SIGN USH TIMES KU +12354 ; [.4F40.0020.0002] # CUNEIFORM SIGN USH TIMES KUR +12355 ; [.4F41.0020.0002] # CUNEIFORM SIGN USH TIMES TAK4 +12356 ; [.4F42.0020.0002] # CUNEIFORM SIGN USHX +12357 ; [.4F43.0020.0002] # CUNEIFORM SIGN USH2 +12358 ; [.4F44.0020.0002] # CUNEIFORM SIGN USHUMX +12359 ; [.4F45.0020.0002] # CUNEIFORM SIGN UTUKI +1235A ; [.4F46.0020.0002] # CUNEIFORM SIGN UZ3 +1235B ; [.4F47.0020.0002] # CUNEIFORM SIGN UZ3 TIMES KASKAL +1235C ; [.4F48.0020.0002] # CUNEIFORM SIGN UZU +1235D ; [.4F49.0020.0002] # CUNEIFORM SIGN ZA +1235E ; [.4F4A.0020.0002] # CUNEIFORM SIGN ZA TENU +1235F ; [.4F4B.0020.0002] # CUNEIFORM SIGN ZA SQUARED TIMES KUR +12360 ; [.4F4C.0020.0002] # CUNEIFORM SIGN ZAG +12361 ; [.4F4D.0020.0002] # CUNEIFORM SIGN ZAMX +12362 ; [.4F4E.0020.0002] # CUNEIFORM SIGN ZE2 +12363 ; [.4F4F.0020.0002] # CUNEIFORM SIGN ZI +12364 ; [.4F50.0020.0002] # CUNEIFORM SIGN ZI OVER ZI +12365 ; [.4F51.0020.0002] # CUNEIFORM SIGN ZI3 +12366 ; [.4F52.0020.0002] # CUNEIFORM SIGN ZIB +12367 ; [.4F53.0020.0002] # CUNEIFORM SIGN ZIB KABA TENU +12368 ; [.4F54.0020.0002] # CUNEIFORM SIGN ZIG +12369 ; [.4F55.0020.0002] # CUNEIFORM SIGN ZIZ2 +1236A ; [.4F56.0020.0002] # CUNEIFORM SIGN ZU +1236B ; [.4F57.0020.0002] # CUNEIFORM SIGN ZU5 +1236C ; [.4F58.0020.0002] # CUNEIFORM SIGN ZU5 TIMES A +1236D ; [.4F59.0020.0002] # CUNEIFORM SIGN ZUBUR +1236E ; [.4F5A.0020.0002] # CUNEIFORM SIGN ZUM +1236F ; [.4F5B.0020.0002] # CUNEIFORM SIGN KAP ELAMITE +12370 ; [.4F5C.0020.0002] # CUNEIFORM SIGN AB TIMES NUN +12371 ; [.4F5D.0020.0002] # CUNEIFORM SIGN AB2 TIMES A +12372 ; [.4F5E.0020.0002] # CUNEIFORM SIGN AMAR TIMES KUG +12373 ; [.4F5F.0020.0002] # CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH +12374 ; [.4F60.0020.0002] # CUNEIFORM SIGN DAG3 +12375 ; [.4F61.0020.0002] # CUNEIFORM SIGN DISH PLUS SHU +12376 ; [.4F62.0020.0002] # CUNEIFORM SIGN DUB TIMES SHE +12377 ; [.4F63.0020.0002] # CUNEIFORM SIGN EZEN TIMES GUD +12378 ; [.4F64.0020.0002] # CUNEIFORM SIGN EZEN TIMES SHE +12379 ; [.4F65.0020.0002] # CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A +1237A ; [.4F66.0020.0002] # CUNEIFORM SIGN GA2 TIMES ASH2 +1237B ; [.4F67.0020.0002] # CUNEIFORM SIGN GE22 +1237C ; [.4F68.0020.0002] # CUNEIFORM SIGN GIG +1237D ; [.4F69.0020.0002] # CUNEIFORM SIGN HUSH +1237E ; [.4F6A.0020.0002] # CUNEIFORM SIGN KA TIMES ANSHE +1237F ; [.4F6B.0020.0002] # CUNEIFORM SIGN KA TIMES ASH3 +12380 ; [.4F6C.0020.0002] # CUNEIFORM SIGN KA TIMES GISH +12381 ; [.4F6D.0020.0002] # CUNEIFORM SIGN KA TIMES GUD +12382 ; [.4F6E.0020.0002] # CUNEIFORM SIGN KA TIMES HI TIMES ASH2 +12383 ; [.4F6F.0020.0002] # CUNEIFORM SIGN KA TIMES LUM +12384 ; [.4F70.0020.0002] # CUNEIFORM SIGN KA TIMES PA +12385 ; [.4F71.0020.0002] # CUNEIFORM SIGN KA TIMES SHUL +12386 ; [.4F72.0020.0002] # CUNEIFORM SIGN KA TIMES TU +12387 ; [.4F73.0020.0002] # CUNEIFORM SIGN KA TIMES UR2 +12388 ; [.4F74.0020.0002] # CUNEIFORM SIGN LAGAB TIMES GI +12389 ; [.4F75.0020.0002] # CUNEIFORM SIGN LU2 SHESHIG TIMES BAD +1238A ; [.4F76.0020.0002] # CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL +1238B ; [.4F77.0020.0002] # CUNEIFORM SIGN LU2 TIMES SHU +1238C ; [.4F78.0020.0002] # CUNEIFORM SIGN MESH +1238D ; [.4F79.0020.0002] # CUNEIFORM SIGN MUSH3 TIMES ZA +1238E ; [.4F7A.0020.0002] # CUNEIFORM SIGN NA4 +1238F ; [.4F7B.0020.0002] # CUNEIFORM SIGN NIN +12390 ; [.4F7C.0020.0002] # CUNEIFORM SIGN NIN9 +12391 ; [.4F7D.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES BAL +12392 ; [.4F7E.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GI +12393 ; [.4F7F.0020.0002] # CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES +12394 ; [.4F80.0020.0002] # CUNEIFORM SIGN PESH2 ASTERISK +12395 ; [.4F81.0020.0002] # CUNEIFORM SIGN PIR2 +12396 ; [.4F82.0020.0002] # CUNEIFORM SIGN SAG TIMES IGI GUNU +12397 ; [.4F83.0020.0002] # CUNEIFORM SIGN TI2 +12398 ; [.4F84.0020.0002] # CUNEIFORM SIGN UM TIMES ME +12399 ; [.4F85.0020.0002] # CUNEIFORM SIGN U U +12480 ; [.4F86.0020.0002] # CUNEIFORM SIGN AB TIMES NUN TENU +12481 ; [.4F87.0020.0002] # CUNEIFORM SIGN AB TIMES SHU2 +12482 ; [.4F88.0020.0002] # CUNEIFORM SIGN AD TIMES ESH2 +12483 ; [.4F89.0020.0002] # CUNEIFORM SIGN BAD TIMES DISH TENU +12484 ; [.4F8A.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES AB2 +12485 ; [.4F8B.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES NI +12486 ; [.4F8C.0020.0002] # CUNEIFORM SIGN BAHAR2 TIMES ZA +12487 ; [.4F8D.0020.0002] # CUNEIFORM SIGN BU OVER BU TIMES NA2 +12488 ; [.4F8E.0020.0002] # CUNEIFORM SIGN DA TIMES TAK4 +12489 ; [.4F8F.0020.0002] # CUNEIFORM SIGN DAG TIMES KUR +1248A ; [.4F90.0020.0002] # CUNEIFORM SIGN DIM TIMES IGI +1248B ; [.4F91.0020.0002] # CUNEIFORM SIGN DIM TIMES U U U +1248C ; [.4F92.0020.0002] # CUNEIFORM SIGN DIM2 TIMES UD +1248D ; [.4F93.0020.0002] # CUNEIFORM SIGN DUG TIMES ANSHE +1248E ; [.4F94.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH +1248F ; [.4F95.0020.0002] # CUNEIFORM SIGN DUG TIMES ASH AT LEFT +12490 ; [.4F96.0020.0002] # CUNEIFORM SIGN DUG TIMES DIN +12491 ; [.4F97.0020.0002] # CUNEIFORM SIGN DUG TIMES DUN +12492 ; [.4F98.0020.0002] # CUNEIFORM SIGN DUG TIMES ERIN2 +12493 ; [.4F99.0020.0002] # CUNEIFORM SIGN DUG TIMES GA +12494 ; [.4F9A.0020.0002] # CUNEIFORM SIGN DUG TIMES GI +12495 ; [.4F9B.0020.0002] # CUNEIFORM SIGN DUG TIMES GIR2 GUNU +12496 ; [.4F9C.0020.0002] # CUNEIFORM SIGN DUG TIMES GISH +12497 ; [.4F9D.0020.0002] # CUNEIFORM SIGN DUG TIMES HA +12498 ; [.4F9E.0020.0002] # CUNEIFORM SIGN DUG TIMES HI +12499 ; [.4F9F.0020.0002] # CUNEIFORM SIGN DUG TIMES IGI GUNU +1249A ; [.4FA0.0020.0002] # CUNEIFORM SIGN DUG TIMES KASKAL +1249B ; [.4FA1.0020.0002] # CUNEIFORM SIGN DUG TIMES KUR +1249C ; [.4FA2.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 +1249D ; [.4FA3.0020.0002] # CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL +1249E ; [.4FA4.0020.0002] # CUNEIFORM SIGN DUG TIMES LAK-020 +1249F ; [.4FA5.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM +124A0 ; [.4FA6.0020.0002] # CUNEIFORM SIGN DUG TIMES LAM TIMES KUR +124A1 ; [.4FA7.0020.0002] # CUNEIFORM SIGN DUG TIMES LUH PLUS GISH +124A2 ; [.4FA8.0020.0002] # CUNEIFORM SIGN DUG TIMES MASH +124A3 ; [.4FA9.0020.0002] # CUNEIFORM SIGN DUG TIMES MES +124A4 ; [.4FAA.0020.0002] # CUNEIFORM SIGN DUG TIMES MI +124A5 ; [.4FAB.0020.0002] # CUNEIFORM SIGN DUG TIMES NI +124A6 ; [.4FAC.0020.0002] # CUNEIFORM SIGN DUG TIMES PI +124A7 ; [.4FAD.0020.0002] # CUNEIFORM SIGN DUG TIMES SHE +124A8 ; [.4FAE.0020.0002] # CUNEIFORM SIGN DUG TIMES SI GUNU +124A9 ; [.4FAF.0020.0002] # CUNEIFORM SIGN E2 TIMES KUR +124AA ; [.4FB0.0020.0002] # CUNEIFORM SIGN E2 TIMES PAP +124AB ; [.4FB1.0020.0002] # CUNEIFORM SIGN ERIN2 X +124AC ; [.4FB2.0020.0002] # CUNEIFORM SIGN ESH2 CROSSING ESH2 +124AD ; [.4FB3.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ASH +124AE ; [.4FB4.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES HI +124AF ; [.4FB5.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU +124B0 ; [.4FB6.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LA +124B1 ; [.4FB7.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES LAL +124B2 ; [.4FB8.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES ME +124B3 ; [.4FB9.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES MES +124B4 ; [.4FBA.0020.0002] # CUNEIFORM SIGN EZEN SHESHIG TIMES SU +124B5 ; [.4FBB.0020.0002] # CUNEIFORM SIGN EZEN TIMES SU +124B6 ; [.4FBC.0020.0002] # CUNEIFORM SIGN GA2 TIMES BAHAR2 +124B7 ; [.4FBD.0020.0002] # CUNEIFORM SIGN GA2 TIMES DIM GUNU +124B8 ; [.4FBE.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU +124B9 ; [.4FBF.0020.0002] # CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL +124BA ; [.4FC0.0020.0002] # CUNEIFORM SIGN GA2 TIMES EREN +124BB ; [.4FC1.0020.0002] # CUNEIFORM SIGN GA2 TIMES GA +124BC ; [.4FC2.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS DI +124BD ; [.4FC3.0020.0002] # CUNEIFORM SIGN GA2 TIMES GAR PLUS NE +124BE ; [.4FC4.0020.0002] # CUNEIFORM SIGN GA2 TIMES HA PLUS A +124BF ; [.4FC5.0020.0002] # CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL +124C0 ; [.4FC6.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM +124C1 ; [.4FC7.0020.0002] # CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR +124C2 ; [.4FC8.0020.0002] # CUNEIFORM SIGN GA2 TIMES LUH +124C3 ; [.4FC9.0020.0002] # CUNEIFORM SIGN GA2 TIMES MUSH +124C4 ; [.4FCA.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE +124C5 ; [.4FCB.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS E2 +124C6 ; [.4FCC.0020.0002] # CUNEIFORM SIGN GA2 TIMES NE PLUS GI +124C7 ; [.4FCD.0020.0002] # CUNEIFORM SIGN GA2 TIMES SHIM +124C8 ; [.4FCE.0020.0002] # CUNEIFORM SIGN GA2 TIMES ZIZ2 +124C9 ; [.4FCF.0020.0002] # CUNEIFORM SIGN GABA ROTATED NINETY DEGREES +124CA ; [.4FD0.0020.0002] # CUNEIFORM SIGN GESHTIN TIMES U +124CB ; [.4FD1.0020.0002] # CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH +124CC ; [.4FD2.0020.0002] # CUNEIFORM SIGN GU2 TIMES IGI GUNU +124CD ; [.4FD3.0020.0002] # CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4 +124CE ; [.4FD4.0020.0002] # CUNEIFORM SIGN HA TENU GUNU +124CF ; [.4FD5.0020.0002] # CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH +124D0 ; [.4FD6.0020.0002] # CUNEIFORM SIGN KA TIMES BU +124D1 ; [.4FD7.0020.0002] # CUNEIFORM SIGN KA TIMES KA +124D2 ; [.4FD8.0020.0002] # CUNEIFORM SIGN KA TIMES U U U +124D3 ; [.4FD9.0020.0002] # CUNEIFORM SIGN KA TIMES UR +124D4 ; [.4FDA.0020.0002] # CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU +124D5 ; [.4FDB.0020.0002] # CUNEIFORM SIGN LAK-003 +124D6 ; [.4FDC.0020.0002] # CUNEIFORM SIGN LAK-021 +124D7 ; [.4FDD.0020.0002] # CUNEIFORM SIGN LAK-025 +124D8 ; [.4FDE.0020.0002] # CUNEIFORM SIGN LAK-030 +124D9 ; [.4FDF.0020.0002] # CUNEIFORM SIGN LAK-050 +124DA ; [.4FE0.0020.0002] # CUNEIFORM SIGN LAK-051 +124DB ; [.4FE1.0020.0002] # CUNEIFORM SIGN LAK-062 +124DC ; [.4FE2.0020.0002] # CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU +124DD ; [.4FE3.0020.0002] # CUNEIFORM SIGN LAK-080 +124DE ; [.4FE4.0020.0002] # CUNEIFORM SIGN LAK-081 OVER LAK-081 +124DF ; [.4FE5.0020.0002] # CUNEIFORM SIGN LAK-092 +124E0 ; [.4FE6.0020.0002] # CUNEIFORM SIGN LAK-130 +124E1 ; [.4FE7.0020.0002] # CUNEIFORM SIGN LAK-142 +124E2 ; [.4FE8.0020.0002] # CUNEIFORM SIGN LAK-210 +124E3 ; [.4FE9.0020.0002] # CUNEIFORM SIGN LAK-219 +124E4 ; [.4FEA.0020.0002] # CUNEIFORM SIGN LAK-220 +124E5 ; [.4FEB.0020.0002] # CUNEIFORM SIGN LAK-225 +124E6 ; [.4FEC.0020.0002] # CUNEIFORM SIGN LAK-228 +124E7 ; [.4FED.0020.0002] # CUNEIFORM SIGN LAK-238 +124E8 ; [.4FEE.0020.0002] # CUNEIFORM SIGN LAK-265 +124E9 ; [.4FEF.0020.0002] # CUNEIFORM SIGN LAK-266 +124EA ; [.4FF0.0020.0002] # CUNEIFORM SIGN LAK-343 +124EB ; [.4FF1.0020.0002] # CUNEIFORM SIGN LAK-347 +124EC ; [.4FF2.0020.0002] # CUNEIFORM SIGN LAK-348 +124ED ; [.4FF3.0020.0002] # CUNEIFORM SIGN LAK-383 +124EE ; [.4FF4.0020.0002] # CUNEIFORM SIGN LAK-384 +124EF ; [.4FF5.0020.0002] # CUNEIFORM SIGN LAK-390 +124F0 ; [.4FF6.0020.0002] # CUNEIFORM SIGN LAK-441 +124F1 ; [.4FF7.0020.0002] # CUNEIFORM SIGN LAK-449 +124F2 ; [.4FF8.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES GU +124F3 ; [.4FF9.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES IGI +124F4 ; [.4FFA.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3 +124F5 ; [.4FFB.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3 +124F6 ; [.4FFC.0020.0002] # CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA +124F7 ; [.4FFD.0020.0002] # CUNEIFORM SIGN LAK-450 +124F8 ; [.4FFE.0020.0002] # CUNEIFORM SIGN LAK-457 +124F9 ; [.4FFF.0020.0002] # CUNEIFORM SIGN LAK-470 +124FA ; [.5000.0020.0002] # CUNEIFORM SIGN LAK-483 +124FB ; [.5001.0020.0002] # CUNEIFORM SIGN LAK-490 +124FC ; [.5002.0020.0002] # CUNEIFORM SIGN LAK-492 +124FD ; [.5003.0020.0002] # CUNEIFORM SIGN LAK-493 +124FE ; [.5004.0020.0002] # CUNEIFORM SIGN LAK-495 +124FF ; [.5005.0020.0002] # CUNEIFORM SIGN LAK-550 +12500 ; [.5006.0020.0002] # CUNEIFORM SIGN LAK-608 +12501 ; [.5007.0020.0002] # CUNEIFORM SIGN LAK-617 +12502 ; [.5008.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES ASH +12503 ; [.5009.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES BAD +12504 ; [.500A.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU +12505 ; [.500B.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES KU3 +12506 ; [.500C.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES LA +12507 ; [.500D.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TAR +12508 ; [.500E.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES TE +12509 ; [.500F.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES U2 +1250A ; [.5010.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES UD +1250B ; [.5011.0020.0002] # CUNEIFORM SIGN LAK-617 TIMES URUDA +1250C ; [.5012.0020.0002] # CUNEIFORM SIGN LAK-636 +1250D ; [.5013.0020.0002] # CUNEIFORM SIGN LAK-648 +1250E ; [.5014.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES DUB +1250F ; [.5015.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES GA +12510 ; [.5016.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI +12511 ; [.5017.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES IGI GUNU +12512 ; [.5018.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES NI +12513 ; [.5019.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3 +12514 ; [.501A.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI +12515 ; [.501B.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES UD +12516 ; [.501C.0020.0002] # CUNEIFORM SIGN LAK-648 TIMES URUDA +12517 ; [.501D.0020.0002] # CUNEIFORM SIGN LAK-724 +12518 ; [.501E.0020.0002] # CUNEIFORM SIGN LAK-749 +12519 ; [.501F.0020.0002] # CUNEIFORM SIGN LU2 GUNU TIMES ASH +1251A ; [.5020.0020.0002] # CUNEIFORM SIGN LU2 TIMES DISH +1251B ; [.5021.0020.0002] # CUNEIFORM SIGN LU2 TIMES HAL +1251C ; [.5022.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP +1251D ; [.5023.0020.0002] # CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3 +1251E ; [.5024.0020.0002] # CUNEIFORM SIGN LU2 TIMES TAK4 +1251F ; [.5025.0020.0002] # CUNEIFORM SIGN MI PLUS ZA7 +12520 ; [.5026.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES GA +12521 ; [.5027.0020.0002] # CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK +12522 ; [.5028.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES DIM GUNU +12523 ; [.5029.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GISH +12524 ; [.502A.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES GUL +12525 ; [.502B.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES HI +12526 ; [.502C.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES KESH2 +12527 ; [.502D.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES LAK-050 +12528 ; [.502E.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES MASH +12529 ; [.502F.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP +1252A ; [.5030.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U +1252B ; [.5031.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES U PLUS U +1252C ; [.5032.0020.0002] # CUNEIFORM SIGN NINDA2 TIMES URUDA +1252D ; [.5033.0020.0002] # CUNEIFORM SIGN SAG GUNU TIMES HA +1252E ; [.5034.0020.0002] # CUNEIFORM SIGN SAG TIMES EN +1252F ; [.5035.0020.0002] # CUNEIFORM SIGN SAG TIMES SHE AT LEFT +12530 ; [.5036.0020.0002] # CUNEIFORM SIGN SAG TIMES TAK4 +12531 ; [.5037.0020.0002] # CUNEIFORM SIGN SHA6 TENU +12532 ; [.5038.0020.0002] # CUNEIFORM SIGN SHE OVER SHE +12533 ; [.5039.0020.0002] # CUNEIFORM SIGN SHE PLUS HUB2 +12534 ; [.503A.0020.0002] # CUNEIFORM SIGN SHE PLUS NAM2 +12535 ; [.503B.0020.0002] # CUNEIFORM SIGN SHE PLUS SAR +12536 ; [.503C.0020.0002] # CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI +12537 ; [.503D.0020.0002] # CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN +12538 ; [.503E.0020.0002] # CUNEIFORM SIGN SI TIMES TAK4 +12539 ; [.503F.0020.0002] # CUNEIFORM SIGN TAK4 PLUS SAG +1253A ; [.5040.0020.0002] # CUNEIFORM SIGN TUM TIMES GAN2 TENU +1253B ; [.5041.0020.0002] # CUNEIFORM SIGN TUM TIMES THREE DISH +1253C ; [.5042.0020.0002] # CUNEIFORM SIGN UR2 INVERTED +1253D ; [.5043.0020.0002] # CUNEIFORM SIGN UR2 TIMES UD +1253E ; [.5044.0020.0002] # CUNEIFORM SIGN URU TIMES DARA3 +1253F ; [.5045.0020.0002] # CUNEIFORM SIGN URU TIMES LAK-668 +12540 ; [.5046.0020.0002] # CUNEIFORM SIGN URU TIMES LU3 +12541 ; [.5047.0020.0002] # CUNEIFORM SIGN ZA7 +12542 ; [.5048.0020.0002] # CUNEIFORM SIGN ZU OVER ZU PLUS SAR +12543 ; [.5049.0020.0002] # CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000 ; [.504A.0020.0002] # EGYPTIAN HIEROGLYPH A001 +13001 ; [.504B.0020.0002] # EGYPTIAN HIEROGLYPH A002 +13002 ; [.504C.0020.0002] # EGYPTIAN HIEROGLYPH A003 +13003 ; [.504D.0020.0002] # EGYPTIAN HIEROGLYPH A004 +13004 ; [.504E.0020.0002] # EGYPTIAN HIEROGLYPH A005 +13005 ; [.504F.0020.0002] # EGYPTIAN HIEROGLYPH A005A +13006 ; [.5050.0020.0002] # EGYPTIAN HIEROGLYPH A006 +13007 ; [.5051.0020.0002] # EGYPTIAN HIEROGLYPH A006A +13008 ; [.5052.0020.0002] # EGYPTIAN HIEROGLYPH A006B +13009 ; [.5053.0020.0002] # EGYPTIAN HIEROGLYPH A007 +1300A ; [.5054.0020.0002] # EGYPTIAN HIEROGLYPH A008 +1300B ; [.5055.0020.0002] # EGYPTIAN HIEROGLYPH A009 +1300C ; [.5056.0020.0002] # EGYPTIAN HIEROGLYPH A010 +1300D ; [.5057.0020.0002] # EGYPTIAN HIEROGLYPH A011 +1300E ; [.5058.0020.0002] # EGYPTIAN HIEROGLYPH A012 +1300F ; [.5059.0020.0002] # EGYPTIAN HIEROGLYPH A013 +13010 ; [.505A.0020.0002] # EGYPTIAN HIEROGLYPH A014 +13011 ; [.505B.0020.0002] # EGYPTIAN HIEROGLYPH A014A +13012 ; [.505C.0020.0002] # EGYPTIAN HIEROGLYPH A015 +13013 ; [.505D.0020.0002] # EGYPTIAN HIEROGLYPH A016 +13014 ; [.505E.0020.0002] # EGYPTIAN HIEROGLYPH A017 +13015 ; [.505F.0020.0002] # EGYPTIAN HIEROGLYPH A017A +13016 ; [.5060.0020.0002] # EGYPTIAN HIEROGLYPH A018 +13017 ; [.5061.0020.0002] # EGYPTIAN HIEROGLYPH A019 +13018 ; [.5062.0020.0002] # EGYPTIAN HIEROGLYPH A020 +13019 ; [.5063.0020.0002] # EGYPTIAN HIEROGLYPH A021 +1301A ; [.5064.0020.0002] # EGYPTIAN HIEROGLYPH A022 +1301B ; [.5065.0020.0002] # EGYPTIAN HIEROGLYPH A023 +1301C ; [.5066.0020.0002] # EGYPTIAN HIEROGLYPH A024 +1301D ; [.5067.0020.0002] # EGYPTIAN HIEROGLYPH A025 +1301E ; [.5068.0020.0002] # EGYPTIAN HIEROGLYPH A026 +1301F ; [.5069.0020.0002] # EGYPTIAN HIEROGLYPH A027 +13020 ; [.506A.0020.0002] # EGYPTIAN HIEROGLYPH A028 +13021 ; [.506B.0020.0002] # EGYPTIAN HIEROGLYPH A029 +13022 ; [.506C.0020.0002] # EGYPTIAN HIEROGLYPH A030 +13023 ; [.506D.0020.0002] # EGYPTIAN HIEROGLYPH A031 +13024 ; [.506E.0020.0002] # EGYPTIAN HIEROGLYPH A032 +13025 ; [.506F.0020.0002] # EGYPTIAN HIEROGLYPH A032A +13026 ; [.5070.0020.0002] # EGYPTIAN HIEROGLYPH A033 +13027 ; [.5071.0020.0002] # EGYPTIAN HIEROGLYPH A034 +13028 ; [.5072.0020.0002] # EGYPTIAN HIEROGLYPH A035 +13029 ; [.5073.0020.0002] # EGYPTIAN HIEROGLYPH A036 +1302A ; [.5074.0020.0002] # EGYPTIAN HIEROGLYPH A037 +1302B ; [.5075.0020.0002] # EGYPTIAN HIEROGLYPH A038 +1302C ; [.5076.0020.0002] # EGYPTIAN HIEROGLYPH A039 +1302D ; [.5077.0020.0002] # EGYPTIAN HIEROGLYPH A040 +1302E ; [.5078.0020.0002] # EGYPTIAN HIEROGLYPH A040A +1302F ; [.5079.0020.0002] # EGYPTIAN HIEROGLYPH A041 +13030 ; [.507A.0020.0002] # EGYPTIAN HIEROGLYPH A042 +13031 ; [.507B.0020.0002] # EGYPTIAN HIEROGLYPH A042A +13032 ; [.507C.0020.0002] # EGYPTIAN HIEROGLYPH A043 +13033 ; [.507D.0020.0002] # EGYPTIAN HIEROGLYPH A043A +13034 ; [.507E.0020.0002] # EGYPTIAN HIEROGLYPH A044 +13035 ; [.507F.0020.0002] # EGYPTIAN HIEROGLYPH A045 +13036 ; [.5080.0020.0002] # EGYPTIAN HIEROGLYPH A045A +13037 ; [.5081.0020.0002] # EGYPTIAN HIEROGLYPH A046 +13038 ; [.5082.0020.0002] # EGYPTIAN HIEROGLYPH A047 +13039 ; [.5083.0020.0002] # EGYPTIAN HIEROGLYPH A048 +1303A ; [.5084.0020.0002] # EGYPTIAN HIEROGLYPH A049 +1303B ; [.5085.0020.0002] # EGYPTIAN HIEROGLYPH A050 +1303C ; [.5086.0020.0002] # EGYPTIAN HIEROGLYPH A051 +1303D ; [.5087.0020.0002] # EGYPTIAN HIEROGLYPH A052 +1303E ; [.5088.0020.0002] # EGYPTIAN HIEROGLYPH A053 +1303F ; [.5089.0020.0002] # EGYPTIAN HIEROGLYPH A054 +13040 ; [.508A.0020.0002] # EGYPTIAN HIEROGLYPH A055 +13041 ; [.508B.0020.0002] # EGYPTIAN HIEROGLYPH A056 +13042 ; [.508C.0020.0002] # EGYPTIAN HIEROGLYPH A057 +13043 ; [.508D.0020.0002] # EGYPTIAN HIEROGLYPH A058 +13044 ; [.508E.0020.0002] # EGYPTIAN HIEROGLYPH A059 +13045 ; [.508F.0020.0002] # EGYPTIAN HIEROGLYPH A060 +13046 ; [.5090.0020.0002] # EGYPTIAN HIEROGLYPH A061 +13047 ; [.5091.0020.0002] # EGYPTIAN HIEROGLYPH A062 +13048 ; [.5092.0020.0002] # EGYPTIAN HIEROGLYPH A063 +13049 ; [.5093.0020.0002] # EGYPTIAN HIEROGLYPH A064 +1304A ; [.5094.0020.0002] # EGYPTIAN HIEROGLYPH A065 +1304B ; [.5095.0020.0002] # EGYPTIAN HIEROGLYPH A066 +1304C ; [.5096.0020.0002] # EGYPTIAN HIEROGLYPH A067 +1304D ; [.5097.0020.0002] # EGYPTIAN HIEROGLYPH A068 +1304E ; [.5098.0020.0002] # EGYPTIAN HIEROGLYPH A069 +1304F ; [.5099.0020.0002] # EGYPTIAN HIEROGLYPH A070 +13050 ; [.509A.0020.0002] # EGYPTIAN HIEROGLYPH B001 +13051 ; [.509B.0020.0002] # EGYPTIAN HIEROGLYPH B002 +13052 ; [.509C.0020.0002] # EGYPTIAN HIEROGLYPH B003 +13053 ; [.509D.0020.0002] # EGYPTIAN HIEROGLYPH B004 +13054 ; [.509E.0020.0002] # EGYPTIAN HIEROGLYPH B005 +13055 ; [.509F.0020.0002] # EGYPTIAN HIEROGLYPH B005A +13056 ; [.50A0.0020.0002] # EGYPTIAN HIEROGLYPH B006 +13057 ; [.50A1.0020.0002] # EGYPTIAN HIEROGLYPH B007 +13058 ; [.50A2.0020.0002] # EGYPTIAN HIEROGLYPH B008 +13059 ; [.50A3.0020.0002] # EGYPTIAN HIEROGLYPH B009 +1305A ; [.50A4.0020.0002] # EGYPTIAN HIEROGLYPH C001 +1305B ; [.50A5.0020.0002] # EGYPTIAN HIEROGLYPH C002 +1305C ; [.50A6.0020.0002] # EGYPTIAN HIEROGLYPH C002A +1305D ; [.50A7.0020.0002] # EGYPTIAN HIEROGLYPH C002B +1305E ; [.50A8.0020.0002] # EGYPTIAN HIEROGLYPH C002C +1305F ; [.50A9.0020.0002] # EGYPTIAN HIEROGLYPH C003 +13060 ; [.50AA.0020.0002] # EGYPTIAN HIEROGLYPH C004 +13061 ; [.50AB.0020.0002] # EGYPTIAN HIEROGLYPH C005 +13062 ; [.50AC.0020.0002] # EGYPTIAN HIEROGLYPH C006 +13063 ; [.50AD.0020.0002] # EGYPTIAN HIEROGLYPH C007 +13064 ; [.50AE.0020.0002] # EGYPTIAN HIEROGLYPH C008 +13065 ; [.50AF.0020.0002] # EGYPTIAN HIEROGLYPH C009 +13066 ; [.50B0.0020.0002] # EGYPTIAN HIEROGLYPH C010 +13067 ; [.50B1.0020.0002] # EGYPTIAN HIEROGLYPH C010A +13068 ; [.50B2.0020.0002] # EGYPTIAN HIEROGLYPH C011 +13069 ; [.50B3.0020.0002] # EGYPTIAN HIEROGLYPH C012 +1306A ; [.50B4.0020.0002] # EGYPTIAN HIEROGLYPH C013 +1306B ; [.50B5.0020.0002] # EGYPTIAN HIEROGLYPH C014 +1306C ; [.50B6.0020.0002] # EGYPTIAN HIEROGLYPH C015 +1306D ; [.50B7.0020.0002] # EGYPTIAN HIEROGLYPH C016 +1306E ; [.50B8.0020.0002] # EGYPTIAN HIEROGLYPH C017 +1306F ; [.50B9.0020.0002] # EGYPTIAN HIEROGLYPH C018 +13070 ; [.50BA.0020.0002] # EGYPTIAN HIEROGLYPH C019 +13071 ; [.50BB.0020.0002] # EGYPTIAN HIEROGLYPH C020 +13072 ; [.50BC.0020.0002] # EGYPTIAN HIEROGLYPH C021 +13073 ; [.50BD.0020.0002] # EGYPTIAN HIEROGLYPH C022 +13074 ; [.50BE.0020.0002] # EGYPTIAN HIEROGLYPH C023 +13075 ; [.50BF.0020.0002] # EGYPTIAN HIEROGLYPH C024 +13076 ; [.50C0.0020.0002] # EGYPTIAN HIEROGLYPH D001 +13077 ; [.50C1.0020.0002] # EGYPTIAN HIEROGLYPH D002 +13078 ; [.50C2.0020.0002] # EGYPTIAN HIEROGLYPH D003 +13079 ; [.50C3.0020.0002] # EGYPTIAN HIEROGLYPH D004 +1307A ; [.50C4.0020.0002] # EGYPTIAN HIEROGLYPH D005 +1307B ; [.50C5.0020.0002] # EGYPTIAN HIEROGLYPH D006 +1307C ; [.50C6.0020.0002] # EGYPTIAN HIEROGLYPH D007 +1307D ; [.50C7.0020.0002] # EGYPTIAN HIEROGLYPH D008 +1307E ; [.50C8.0020.0002] # EGYPTIAN HIEROGLYPH D008A +1307F ; [.50C9.0020.0002] # EGYPTIAN HIEROGLYPH D009 +13080 ; [.50CA.0020.0002] # EGYPTIAN HIEROGLYPH D010 +13081 ; [.50CB.0020.0002] # EGYPTIAN HIEROGLYPH D011 +13082 ; [.50CC.0020.0002] # EGYPTIAN HIEROGLYPH D012 +13083 ; [.50CD.0020.0002] # EGYPTIAN HIEROGLYPH D013 +13084 ; [.50CE.0020.0002] # EGYPTIAN HIEROGLYPH D014 +13085 ; [.50CF.0020.0002] # EGYPTIAN HIEROGLYPH D015 +13086 ; [.50D0.0020.0002] # EGYPTIAN HIEROGLYPH D016 +13087 ; [.50D1.0020.0002] # EGYPTIAN HIEROGLYPH D017 +13088 ; [.50D2.0020.0002] # EGYPTIAN HIEROGLYPH D018 +13089 ; [.50D3.0020.0002] # EGYPTIAN HIEROGLYPH D019 +1308A ; [.50D4.0020.0002] # EGYPTIAN HIEROGLYPH D020 +1308B ; [.50D5.0020.0002] # EGYPTIAN HIEROGLYPH D021 +1308C ; [.50D6.0020.0002] # EGYPTIAN HIEROGLYPH D022 +1308D ; [.50D7.0020.0002] # EGYPTIAN HIEROGLYPH D023 +1308E ; [.50D8.0020.0002] # EGYPTIAN HIEROGLYPH D024 +1308F ; [.50D9.0020.0002] # EGYPTIAN HIEROGLYPH D025 +13090 ; [.50DA.0020.0002] # EGYPTIAN HIEROGLYPH D026 +13091 ; [.50DB.0020.0002] # EGYPTIAN HIEROGLYPH D027 +13092 ; [.50DC.0020.0002] # EGYPTIAN HIEROGLYPH D027A +13093 ; [.50DD.0020.0002] # EGYPTIAN HIEROGLYPH D028 +13094 ; [.50DE.0020.0002] # EGYPTIAN HIEROGLYPH D029 +13095 ; [.50DF.0020.0002] # EGYPTIAN HIEROGLYPH D030 +13096 ; [.50E0.0020.0002] # EGYPTIAN HIEROGLYPH D031 +13097 ; [.50E1.0020.0002] # EGYPTIAN HIEROGLYPH D031A +13098 ; [.50E2.0020.0002] # EGYPTIAN HIEROGLYPH D032 +13099 ; [.50E3.0020.0002] # EGYPTIAN HIEROGLYPH D033 +1309A ; [.50E4.0020.0002] # EGYPTIAN HIEROGLYPH D034 +1309B ; [.50E5.0020.0002] # EGYPTIAN HIEROGLYPH D034A +1309C ; [.50E6.0020.0002] # EGYPTIAN HIEROGLYPH D035 +1309D ; [.50E7.0020.0002] # EGYPTIAN HIEROGLYPH D036 +1309E ; [.50E8.0020.0002] # EGYPTIAN HIEROGLYPH D037 +1309F ; [.50E9.0020.0002] # EGYPTIAN HIEROGLYPH D038 +130A0 ; [.50EA.0020.0002] # EGYPTIAN HIEROGLYPH D039 +130A1 ; [.50EB.0020.0002] # EGYPTIAN HIEROGLYPH D040 +130A2 ; [.50EC.0020.0002] # EGYPTIAN HIEROGLYPH D041 +130A3 ; [.50ED.0020.0002] # EGYPTIAN HIEROGLYPH D042 +130A4 ; [.50EE.0020.0002] # EGYPTIAN HIEROGLYPH D043 +130A5 ; [.50EF.0020.0002] # EGYPTIAN HIEROGLYPH D044 +130A6 ; [.50F0.0020.0002] # EGYPTIAN HIEROGLYPH D045 +130A7 ; [.50F1.0020.0002] # EGYPTIAN HIEROGLYPH D046 +130A8 ; [.50F2.0020.0002] # EGYPTIAN HIEROGLYPH D046A +130A9 ; [.50F3.0020.0002] # EGYPTIAN HIEROGLYPH D047 +130AA ; [.50F4.0020.0002] # EGYPTIAN HIEROGLYPH D048 +130AB ; [.50F5.0020.0002] # EGYPTIAN HIEROGLYPH D048A +130AC ; [.50F6.0020.0002] # EGYPTIAN HIEROGLYPH D049 +130AD ; [.50F7.0020.0002] # EGYPTIAN HIEROGLYPH D050 +130AE ; [.50F8.0020.0002] # EGYPTIAN HIEROGLYPH D050A +130AF ; [.50F9.0020.0002] # EGYPTIAN HIEROGLYPH D050B +130B0 ; [.50FA.0020.0002] # EGYPTIAN HIEROGLYPH D050C +130B1 ; [.50FB.0020.0002] # EGYPTIAN HIEROGLYPH D050D +130B2 ; [.50FC.0020.0002] # EGYPTIAN HIEROGLYPH D050E +130B3 ; [.50FD.0020.0002] # EGYPTIAN HIEROGLYPH D050F +130B4 ; [.50FE.0020.0002] # EGYPTIAN HIEROGLYPH D050G +130B5 ; [.50FF.0020.0002] # EGYPTIAN HIEROGLYPH D050H +130B6 ; [.5100.0020.0002] # EGYPTIAN HIEROGLYPH D050I +130B7 ; [.5101.0020.0002] # EGYPTIAN HIEROGLYPH D051 +130B8 ; [.5102.0020.0002] # EGYPTIAN HIEROGLYPH D052 +130B9 ; [.5103.0020.0002] # EGYPTIAN HIEROGLYPH D052A +130BA ; [.5104.0020.0002] # EGYPTIAN HIEROGLYPH D053 +130BB ; [.5105.0020.0002] # EGYPTIAN HIEROGLYPH D054 +130BC ; [.5106.0020.0002] # EGYPTIAN HIEROGLYPH D054A +130BD ; [.5107.0020.0002] # EGYPTIAN HIEROGLYPH D055 +130BE ; [.5108.0020.0002] # EGYPTIAN HIEROGLYPH D056 +130BF ; [.5109.0020.0002] # EGYPTIAN HIEROGLYPH D057 +130C0 ; [.510A.0020.0002] # EGYPTIAN HIEROGLYPH D058 +130C1 ; [.510B.0020.0002] # EGYPTIAN HIEROGLYPH D059 +130C2 ; [.510C.0020.0002] # EGYPTIAN HIEROGLYPH D060 +130C3 ; [.510D.0020.0002] # EGYPTIAN HIEROGLYPH D061 +130C4 ; [.510E.0020.0002] # EGYPTIAN HIEROGLYPH D062 +130C5 ; [.510F.0020.0002] # EGYPTIAN HIEROGLYPH D063 +130C6 ; [.5110.0020.0002] # EGYPTIAN HIEROGLYPH D064 +130C7 ; [.5111.0020.0002] # EGYPTIAN HIEROGLYPH D065 +130C8 ; [.5112.0020.0002] # EGYPTIAN HIEROGLYPH D066 +130C9 ; [.5113.0020.0002] # EGYPTIAN HIEROGLYPH D067 +130CA ; [.5114.0020.0002] # EGYPTIAN HIEROGLYPH D067A +130CB ; [.5115.0020.0002] # EGYPTIAN HIEROGLYPH D067B +130CC ; [.5116.0020.0002] # EGYPTIAN HIEROGLYPH D067C +130CD ; [.5117.0020.0002] # EGYPTIAN HIEROGLYPH D067D +130CE ; [.5118.0020.0002] # EGYPTIAN HIEROGLYPH D067E +130CF ; [.5119.0020.0002] # EGYPTIAN HIEROGLYPH D067F +130D0 ; [.511A.0020.0002] # EGYPTIAN HIEROGLYPH D067G +130D1 ; [.511B.0020.0002] # EGYPTIAN HIEROGLYPH D067H +130D2 ; [.511C.0020.0002] # EGYPTIAN HIEROGLYPH E001 +130D3 ; [.511D.0020.0002] # EGYPTIAN HIEROGLYPH E002 +130D4 ; [.511E.0020.0002] # EGYPTIAN HIEROGLYPH E003 +130D5 ; [.511F.0020.0002] # EGYPTIAN HIEROGLYPH E004 +130D6 ; [.5120.0020.0002] # EGYPTIAN HIEROGLYPH E005 +130D7 ; [.5121.0020.0002] # EGYPTIAN HIEROGLYPH E006 +130D8 ; [.5122.0020.0002] # EGYPTIAN HIEROGLYPH E007 +130D9 ; [.5123.0020.0002] # EGYPTIAN HIEROGLYPH E008 +130DA ; [.5124.0020.0002] # EGYPTIAN HIEROGLYPH E008A +130DB ; [.5125.0020.0002] # EGYPTIAN HIEROGLYPH E009 +130DC ; [.5126.0020.0002] # EGYPTIAN HIEROGLYPH E009A +130DD ; [.5127.0020.0002] # EGYPTIAN HIEROGLYPH E010 +130DE ; [.5128.0020.0002] # EGYPTIAN HIEROGLYPH E011 +130DF ; [.5129.0020.0002] # EGYPTIAN HIEROGLYPH E012 +130E0 ; [.512A.0020.0002] # EGYPTIAN HIEROGLYPH E013 +130E1 ; [.512B.0020.0002] # EGYPTIAN HIEROGLYPH E014 +130E2 ; [.512C.0020.0002] # EGYPTIAN HIEROGLYPH E015 +130E3 ; [.512D.0020.0002] # EGYPTIAN HIEROGLYPH E016 +130E4 ; [.512E.0020.0002] # EGYPTIAN HIEROGLYPH E016A +130E5 ; [.512F.0020.0002] # EGYPTIAN HIEROGLYPH E017 +130E6 ; [.5130.0020.0002] # EGYPTIAN HIEROGLYPH E017A +130E7 ; [.5131.0020.0002] # EGYPTIAN HIEROGLYPH E018 +130E8 ; [.5132.0020.0002] # EGYPTIAN HIEROGLYPH E019 +130E9 ; [.5133.0020.0002] # EGYPTIAN HIEROGLYPH E020 +130EA ; [.5134.0020.0002] # EGYPTIAN HIEROGLYPH E020A +130EB ; [.5135.0020.0002] # EGYPTIAN HIEROGLYPH E021 +130EC ; [.5136.0020.0002] # EGYPTIAN HIEROGLYPH E022 +130ED ; [.5137.0020.0002] # EGYPTIAN HIEROGLYPH E023 +130EE ; [.5138.0020.0002] # EGYPTIAN HIEROGLYPH E024 +130EF ; [.5139.0020.0002] # EGYPTIAN HIEROGLYPH E025 +130F0 ; [.513A.0020.0002] # EGYPTIAN HIEROGLYPH E026 +130F1 ; [.513B.0020.0002] # EGYPTIAN HIEROGLYPH E027 +130F2 ; [.513C.0020.0002] # EGYPTIAN HIEROGLYPH E028 +130F3 ; [.513D.0020.0002] # EGYPTIAN HIEROGLYPH E028A +130F4 ; [.513E.0020.0002] # EGYPTIAN HIEROGLYPH E029 +130F5 ; [.513F.0020.0002] # EGYPTIAN HIEROGLYPH E030 +130F6 ; [.5140.0020.0002] # EGYPTIAN HIEROGLYPH E031 +130F7 ; [.5141.0020.0002] # EGYPTIAN HIEROGLYPH E032 +130F8 ; [.5142.0020.0002] # EGYPTIAN HIEROGLYPH E033 +130F9 ; [.5143.0020.0002] # EGYPTIAN HIEROGLYPH E034 +130FA ; [.5144.0020.0002] # EGYPTIAN HIEROGLYPH E034A +130FB ; [.5145.0020.0002] # EGYPTIAN HIEROGLYPH E036 +130FC ; [.5146.0020.0002] # EGYPTIAN HIEROGLYPH E037 +130FD ; [.5147.0020.0002] # EGYPTIAN HIEROGLYPH E038 +130FE ; [.5148.0020.0002] # EGYPTIAN HIEROGLYPH F001 +130FF ; [.5149.0020.0002] # EGYPTIAN HIEROGLYPH F001A +13100 ; [.514A.0020.0002] # EGYPTIAN HIEROGLYPH F002 +13101 ; [.514B.0020.0002] # EGYPTIAN HIEROGLYPH F003 +13102 ; [.514C.0020.0002] # EGYPTIAN HIEROGLYPH F004 +13103 ; [.514D.0020.0002] # EGYPTIAN HIEROGLYPH F005 +13104 ; [.514E.0020.0002] # EGYPTIAN HIEROGLYPH F006 +13105 ; [.514F.0020.0002] # EGYPTIAN HIEROGLYPH F007 +13106 ; [.5150.0020.0002] # EGYPTIAN HIEROGLYPH F008 +13107 ; [.5151.0020.0002] # EGYPTIAN HIEROGLYPH F009 +13108 ; [.5152.0020.0002] # EGYPTIAN HIEROGLYPH F010 +13109 ; [.5153.0020.0002] # EGYPTIAN HIEROGLYPH F011 +1310A ; [.5154.0020.0002] # EGYPTIAN HIEROGLYPH F012 +1310B ; [.5155.0020.0002] # EGYPTIAN HIEROGLYPH F013 +1310C ; [.5156.0020.0002] # EGYPTIAN HIEROGLYPH F013A +1310D ; [.5157.0020.0002] # EGYPTIAN HIEROGLYPH F014 +1310E ; [.5158.0020.0002] # EGYPTIAN HIEROGLYPH F015 +1310F ; [.5159.0020.0002] # EGYPTIAN HIEROGLYPH F016 +13110 ; [.515A.0020.0002] # EGYPTIAN HIEROGLYPH F017 +13111 ; [.515B.0020.0002] # EGYPTIAN HIEROGLYPH F018 +13112 ; [.515C.0020.0002] # EGYPTIAN HIEROGLYPH F019 +13113 ; [.515D.0020.0002] # EGYPTIAN HIEROGLYPH F020 +13114 ; [.515E.0020.0002] # EGYPTIAN HIEROGLYPH F021 +13115 ; [.515F.0020.0002] # EGYPTIAN HIEROGLYPH F021A +13116 ; [.5160.0020.0002] # EGYPTIAN HIEROGLYPH F022 +13117 ; [.5161.0020.0002] # EGYPTIAN HIEROGLYPH F023 +13118 ; [.5162.0020.0002] # EGYPTIAN HIEROGLYPH F024 +13119 ; [.5163.0020.0002] # EGYPTIAN HIEROGLYPH F025 +1311A ; [.5164.0020.0002] # EGYPTIAN HIEROGLYPH F026 +1311B ; [.5165.0020.0002] # EGYPTIAN HIEROGLYPH F027 +1311C ; [.5166.0020.0002] # EGYPTIAN HIEROGLYPH F028 +1311D ; [.5167.0020.0002] # EGYPTIAN HIEROGLYPH F029 +1311E ; [.5168.0020.0002] # EGYPTIAN HIEROGLYPH F030 +1311F ; [.5169.0020.0002] # EGYPTIAN HIEROGLYPH F031 +13120 ; [.516A.0020.0002] # EGYPTIAN HIEROGLYPH F031A +13121 ; [.516B.0020.0002] # EGYPTIAN HIEROGLYPH F032 +13122 ; [.516C.0020.0002] # EGYPTIAN HIEROGLYPH F033 +13123 ; [.516D.0020.0002] # EGYPTIAN HIEROGLYPH F034 +13124 ; [.516E.0020.0002] # EGYPTIAN HIEROGLYPH F035 +13125 ; [.516F.0020.0002] # EGYPTIAN HIEROGLYPH F036 +13126 ; [.5170.0020.0002] # EGYPTIAN HIEROGLYPH F037 +13127 ; [.5171.0020.0002] # EGYPTIAN HIEROGLYPH F037A +13128 ; [.5172.0020.0002] # EGYPTIAN HIEROGLYPH F038 +13129 ; [.5173.0020.0002] # EGYPTIAN HIEROGLYPH F038A +1312A ; [.5174.0020.0002] # EGYPTIAN HIEROGLYPH F039 +1312B ; [.5175.0020.0002] # EGYPTIAN HIEROGLYPH F040 +1312C ; [.5176.0020.0002] # EGYPTIAN HIEROGLYPH F041 +1312D ; [.5177.0020.0002] # EGYPTIAN HIEROGLYPH F042 +1312E ; [.5178.0020.0002] # EGYPTIAN HIEROGLYPH F043 +1312F ; [.5179.0020.0002] # EGYPTIAN HIEROGLYPH F044 +13130 ; [.517A.0020.0002] # EGYPTIAN HIEROGLYPH F045 +13131 ; [.517B.0020.0002] # EGYPTIAN HIEROGLYPH F045A +13132 ; [.517C.0020.0002] # EGYPTIAN HIEROGLYPH F046 +13133 ; [.517D.0020.0002] # EGYPTIAN HIEROGLYPH F046A +13134 ; [.517E.0020.0002] # EGYPTIAN HIEROGLYPH F047 +13135 ; [.517F.0020.0002] # EGYPTIAN HIEROGLYPH F047A +13136 ; [.5180.0020.0002] # EGYPTIAN HIEROGLYPH F048 +13137 ; [.5181.0020.0002] # EGYPTIAN HIEROGLYPH F049 +13138 ; [.5182.0020.0002] # EGYPTIAN HIEROGLYPH F050 +13139 ; [.5183.0020.0002] # EGYPTIAN HIEROGLYPH F051 +1313A ; [.5184.0020.0002] # EGYPTIAN HIEROGLYPH F051A +1313B ; [.5185.0020.0002] # EGYPTIAN HIEROGLYPH F051B +1313C ; [.5186.0020.0002] # EGYPTIAN HIEROGLYPH F051C +1313D ; [.5187.0020.0002] # EGYPTIAN HIEROGLYPH F052 +1313E ; [.5188.0020.0002] # EGYPTIAN HIEROGLYPH F053 +1313F ; [.5189.0020.0002] # EGYPTIAN HIEROGLYPH G001 +13140 ; [.518A.0020.0002] # EGYPTIAN HIEROGLYPH G002 +13141 ; [.518B.0020.0002] # EGYPTIAN HIEROGLYPH G003 +13142 ; [.518C.0020.0002] # EGYPTIAN HIEROGLYPH G004 +13143 ; [.518D.0020.0002] # EGYPTIAN HIEROGLYPH G005 +13144 ; [.518E.0020.0002] # EGYPTIAN HIEROGLYPH G006 +13145 ; [.518F.0020.0002] # EGYPTIAN HIEROGLYPH G006A +13146 ; [.5190.0020.0002] # EGYPTIAN HIEROGLYPH G007 +13147 ; [.5191.0020.0002] # EGYPTIAN HIEROGLYPH G007A +13148 ; [.5192.0020.0002] # EGYPTIAN HIEROGLYPH G007B +13149 ; [.5193.0020.0002] # EGYPTIAN HIEROGLYPH G008 +1314A ; [.5194.0020.0002] # EGYPTIAN HIEROGLYPH G009 +1314B ; [.5195.0020.0002] # EGYPTIAN HIEROGLYPH G010 +1314C ; [.5196.0020.0002] # EGYPTIAN HIEROGLYPH G011 +1314D ; [.5197.0020.0002] # EGYPTIAN HIEROGLYPH G011A +1314E ; [.5198.0020.0002] # EGYPTIAN HIEROGLYPH G012 +1314F ; [.5199.0020.0002] # EGYPTIAN HIEROGLYPH G013 +13150 ; [.519A.0020.0002] # EGYPTIAN HIEROGLYPH G014 +13151 ; [.519B.0020.0002] # EGYPTIAN HIEROGLYPH G015 +13152 ; [.519C.0020.0002] # EGYPTIAN HIEROGLYPH G016 +13153 ; [.519D.0020.0002] # EGYPTIAN HIEROGLYPH G017 +13154 ; [.519E.0020.0002] # EGYPTIAN HIEROGLYPH G018 +13155 ; [.519F.0020.0002] # EGYPTIAN HIEROGLYPH G019 +13156 ; [.51A0.0020.0002] # EGYPTIAN HIEROGLYPH G020 +13157 ; [.51A1.0020.0002] # EGYPTIAN HIEROGLYPH G020A +13158 ; [.51A2.0020.0002] # EGYPTIAN HIEROGLYPH G021 +13159 ; [.51A3.0020.0002] # EGYPTIAN HIEROGLYPH G022 +1315A ; [.51A4.0020.0002] # EGYPTIAN HIEROGLYPH G023 +1315B ; [.51A5.0020.0002] # EGYPTIAN HIEROGLYPH G024 +1315C ; [.51A6.0020.0002] # EGYPTIAN HIEROGLYPH G025 +1315D ; [.51A7.0020.0002] # EGYPTIAN HIEROGLYPH G026 +1315E ; [.51A8.0020.0002] # EGYPTIAN HIEROGLYPH G026A +1315F ; [.51A9.0020.0002] # EGYPTIAN HIEROGLYPH G027 +13160 ; [.51AA.0020.0002] # EGYPTIAN HIEROGLYPH G028 +13161 ; [.51AB.0020.0002] # EGYPTIAN HIEROGLYPH G029 +13162 ; [.51AC.0020.0002] # EGYPTIAN HIEROGLYPH G030 +13163 ; [.51AD.0020.0002] # EGYPTIAN HIEROGLYPH G031 +13164 ; [.51AE.0020.0002] # EGYPTIAN HIEROGLYPH G032 +13165 ; [.51AF.0020.0002] # EGYPTIAN HIEROGLYPH G033 +13166 ; [.51B0.0020.0002] # EGYPTIAN HIEROGLYPH G034 +13167 ; [.51B1.0020.0002] # EGYPTIAN HIEROGLYPH G035 +13168 ; [.51B2.0020.0002] # EGYPTIAN HIEROGLYPH G036 +13169 ; [.51B3.0020.0002] # EGYPTIAN HIEROGLYPH G036A +1316A ; [.51B4.0020.0002] # EGYPTIAN HIEROGLYPH G037 +1316B ; [.51B5.0020.0002] # EGYPTIAN HIEROGLYPH G037A +1316C ; [.51B6.0020.0002] # EGYPTIAN HIEROGLYPH G038 +1316D ; [.51B7.0020.0002] # EGYPTIAN HIEROGLYPH G039 +1316E ; [.51B8.0020.0002] # EGYPTIAN HIEROGLYPH G040 +1316F ; [.51B9.0020.0002] # EGYPTIAN HIEROGLYPH G041 +13170 ; [.51BA.0020.0002] # EGYPTIAN HIEROGLYPH G042 +13171 ; [.51BB.0020.0002] # EGYPTIAN HIEROGLYPH G043 +13172 ; [.51BC.0020.0002] # EGYPTIAN HIEROGLYPH G043A +13173 ; [.51BD.0020.0002] # EGYPTIAN HIEROGLYPH G044 +13174 ; [.51BE.0020.0002] # EGYPTIAN HIEROGLYPH G045 +13175 ; [.51BF.0020.0002] # EGYPTIAN HIEROGLYPH G045A +13176 ; [.51C0.0020.0002] # EGYPTIAN HIEROGLYPH G046 +13177 ; [.51C1.0020.0002] # EGYPTIAN HIEROGLYPH G047 +13178 ; [.51C2.0020.0002] # EGYPTIAN HIEROGLYPH G048 +13179 ; [.51C3.0020.0002] # EGYPTIAN HIEROGLYPH G049 +1317A ; [.51C4.0020.0002] # EGYPTIAN HIEROGLYPH G050 +1317B ; [.51C5.0020.0002] # EGYPTIAN HIEROGLYPH G051 +1317C ; [.51C6.0020.0002] # EGYPTIAN HIEROGLYPH G052 +1317D ; [.51C7.0020.0002] # EGYPTIAN HIEROGLYPH G053 +1317E ; [.51C8.0020.0002] # EGYPTIAN HIEROGLYPH G054 +1317F ; [.51C9.0020.0002] # EGYPTIAN HIEROGLYPH H001 +13180 ; [.51CA.0020.0002] # EGYPTIAN HIEROGLYPH H002 +13181 ; [.51CB.0020.0002] # EGYPTIAN HIEROGLYPH H003 +13182 ; [.51CC.0020.0002] # EGYPTIAN HIEROGLYPH H004 +13183 ; [.51CD.0020.0002] # EGYPTIAN HIEROGLYPH H005 +13184 ; [.51CE.0020.0002] # EGYPTIAN HIEROGLYPH H006 +13185 ; [.51CF.0020.0002] # EGYPTIAN HIEROGLYPH H006A +13186 ; [.51D0.0020.0002] # EGYPTIAN HIEROGLYPH H007 +13187 ; [.51D1.0020.0002] # EGYPTIAN HIEROGLYPH H008 +13188 ; [.51D2.0020.0002] # EGYPTIAN HIEROGLYPH I001 +13189 ; [.51D3.0020.0002] # EGYPTIAN HIEROGLYPH I002 +1318A ; [.51D4.0020.0002] # EGYPTIAN HIEROGLYPH I003 +1318B ; [.51D5.0020.0002] # EGYPTIAN HIEROGLYPH I004 +1318C ; [.51D6.0020.0002] # EGYPTIAN HIEROGLYPH I005 +1318D ; [.51D7.0020.0002] # EGYPTIAN HIEROGLYPH I005A +1318E ; [.51D8.0020.0002] # EGYPTIAN HIEROGLYPH I006 +1318F ; [.51D9.0020.0002] # EGYPTIAN HIEROGLYPH I007 +13190 ; [.51DA.0020.0002] # EGYPTIAN HIEROGLYPH I008 +13191 ; [.51DB.0020.0002] # EGYPTIAN HIEROGLYPH I009 +13192 ; [.51DC.0020.0002] # EGYPTIAN HIEROGLYPH I009A +13193 ; [.51DD.0020.0002] # EGYPTIAN HIEROGLYPH I010 +13194 ; [.51DE.0020.0002] # EGYPTIAN HIEROGLYPH I010A +13195 ; [.51DF.0020.0002] # EGYPTIAN HIEROGLYPH I011 +13196 ; [.51E0.0020.0002] # EGYPTIAN HIEROGLYPH I011A +13197 ; [.51E1.0020.0002] # EGYPTIAN HIEROGLYPH I012 +13198 ; [.51E2.0020.0002] # EGYPTIAN HIEROGLYPH I013 +13199 ; [.51E3.0020.0002] # EGYPTIAN HIEROGLYPH I014 +1319A ; [.51E4.0020.0002] # EGYPTIAN HIEROGLYPH I015 +1319B ; [.51E5.0020.0002] # EGYPTIAN HIEROGLYPH K001 +1319C ; [.51E6.0020.0002] # EGYPTIAN HIEROGLYPH K002 +1319D ; [.51E7.0020.0002] # EGYPTIAN HIEROGLYPH K003 +1319E ; [.51E8.0020.0002] # EGYPTIAN HIEROGLYPH K004 +1319F ; [.51E9.0020.0002] # EGYPTIAN HIEROGLYPH K005 +131A0 ; [.51EA.0020.0002] # EGYPTIAN HIEROGLYPH K006 +131A1 ; [.51EB.0020.0002] # EGYPTIAN HIEROGLYPH K007 +131A2 ; [.51EC.0020.0002] # EGYPTIAN HIEROGLYPH K008 +131A3 ; [.51ED.0020.0002] # EGYPTIAN HIEROGLYPH L001 +131A4 ; [.51EE.0020.0002] # EGYPTIAN HIEROGLYPH L002 +131A5 ; [.51EF.0020.0002] # EGYPTIAN HIEROGLYPH L002A +131A6 ; [.51F0.0020.0002] # EGYPTIAN HIEROGLYPH L003 +131A7 ; [.51F1.0020.0002] # EGYPTIAN HIEROGLYPH L004 +131A8 ; [.51F2.0020.0002] # EGYPTIAN HIEROGLYPH L005 +131A9 ; [.51F3.0020.0002] # EGYPTIAN HIEROGLYPH L006 +131AA ; [.51F4.0020.0002] # EGYPTIAN HIEROGLYPH L006A +131AB ; [.51F5.0020.0002] # EGYPTIAN HIEROGLYPH L007 +131AC ; [.51F6.0020.0002] # EGYPTIAN HIEROGLYPH L008 +131AD ; [.51F7.0020.0002] # EGYPTIAN HIEROGLYPH M001 +131AE ; [.51F8.0020.0002] # EGYPTIAN HIEROGLYPH M001A +131AF ; [.51F9.0020.0002] # EGYPTIAN HIEROGLYPH M001B +131B0 ; [.51FA.0020.0002] # EGYPTIAN HIEROGLYPH M002 +131B1 ; [.51FB.0020.0002] # EGYPTIAN HIEROGLYPH M003 +131B2 ; [.51FC.0020.0002] # EGYPTIAN HIEROGLYPH M003A +131B3 ; [.51FD.0020.0002] # EGYPTIAN HIEROGLYPH M004 +131B4 ; [.51FE.0020.0002] # EGYPTIAN HIEROGLYPH M005 +131B5 ; [.51FF.0020.0002] # EGYPTIAN HIEROGLYPH M006 +131B6 ; [.5200.0020.0002] # EGYPTIAN HIEROGLYPH M007 +131B7 ; [.5201.0020.0002] # EGYPTIAN HIEROGLYPH M008 +131B8 ; [.5202.0020.0002] # EGYPTIAN HIEROGLYPH M009 +131B9 ; [.5203.0020.0002] # EGYPTIAN HIEROGLYPH M010 +131BA ; [.5204.0020.0002] # EGYPTIAN HIEROGLYPH M010A +131BB ; [.5205.0020.0002] # EGYPTIAN HIEROGLYPH M011 +131BC ; [.5206.0020.0002] # EGYPTIAN HIEROGLYPH M012 +131BD ; [.5207.0020.0002] # EGYPTIAN HIEROGLYPH M012A +131BE ; [.5208.0020.0002] # EGYPTIAN HIEROGLYPH M012B +131BF ; [.5209.0020.0002] # EGYPTIAN HIEROGLYPH M012C +131C0 ; [.520A.0020.0002] # EGYPTIAN HIEROGLYPH M012D +131C1 ; [.520B.0020.0002] # EGYPTIAN HIEROGLYPH M012E +131C2 ; [.520C.0020.0002] # EGYPTIAN HIEROGLYPH M012F +131C3 ; [.520D.0020.0002] # EGYPTIAN HIEROGLYPH M012G +131C4 ; [.520E.0020.0002] # EGYPTIAN HIEROGLYPH M012H +131C5 ; [.520F.0020.0002] # EGYPTIAN HIEROGLYPH M013 +131C6 ; [.5210.0020.0002] # EGYPTIAN HIEROGLYPH M014 +131C7 ; [.5211.0020.0002] # EGYPTIAN HIEROGLYPH M015 +131C8 ; [.5212.0020.0002] # EGYPTIAN HIEROGLYPH M015A +131C9 ; [.5213.0020.0002] # EGYPTIAN HIEROGLYPH M016 +131CA ; [.5214.0020.0002] # EGYPTIAN HIEROGLYPH M016A +131CB ; [.5215.0020.0002] # EGYPTIAN HIEROGLYPH M017 +131CC ; [.5216.0020.0002] # EGYPTIAN HIEROGLYPH M017A +131CD ; [.5217.0020.0002] # EGYPTIAN HIEROGLYPH M018 +131CE ; [.5218.0020.0002] # EGYPTIAN HIEROGLYPH M019 +131CF ; [.5219.0020.0002] # EGYPTIAN HIEROGLYPH M020 +131D0 ; [.521A.0020.0002] # EGYPTIAN HIEROGLYPH M021 +131D1 ; [.521B.0020.0002] # EGYPTIAN HIEROGLYPH M022 +131D2 ; [.521C.0020.0002] # EGYPTIAN HIEROGLYPH M022A +131D3 ; [.521D.0020.0002] # EGYPTIAN HIEROGLYPH M023 +131D4 ; [.521E.0020.0002] # EGYPTIAN HIEROGLYPH M024 +131D5 ; [.521F.0020.0002] # EGYPTIAN HIEROGLYPH M024A +131D6 ; [.5220.0020.0002] # EGYPTIAN HIEROGLYPH M025 +131D7 ; [.5221.0020.0002] # EGYPTIAN HIEROGLYPH M026 +131D8 ; [.5222.0020.0002] # EGYPTIAN HIEROGLYPH M027 +131D9 ; [.5223.0020.0002] # EGYPTIAN HIEROGLYPH M028 +131DA ; [.5224.0020.0002] # EGYPTIAN HIEROGLYPH M028A +131DB ; [.5225.0020.0002] # EGYPTIAN HIEROGLYPH M029 +131DC ; [.5226.0020.0002] # EGYPTIAN HIEROGLYPH M030 +131DD ; [.5227.0020.0002] # EGYPTIAN HIEROGLYPH M031 +131DE ; [.5228.0020.0002] # EGYPTIAN HIEROGLYPH M031A +131DF ; [.5229.0020.0002] # EGYPTIAN HIEROGLYPH M032 +131E0 ; [.522A.0020.0002] # EGYPTIAN HIEROGLYPH M033 +131E1 ; [.522B.0020.0002] # EGYPTIAN HIEROGLYPH M033A +131E2 ; [.522C.0020.0002] # EGYPTIAN HIEROGLYPH M033B +131E3 ; [.522D.0020.0002] # EGYPTIAN HIEROGLYPH M034 +131E4 ; [.522E.0020.0002] # EGYPTIAN HIEROGLYPH M035 +131E5 ; [.522F.0020.0002] # EGYPTIAN HIEROGLYPH M036 +131E6 ; [.5230.0020.0002] # EGYPTIAN HIEROGLYPH M037 +131E7 ; [.5231.0020.0002] # EGYPTIAN HIEROGLYPH M038 +131E8 ; [.5232.0020.0002] # EGYPTIAN HIEROGLYPH M039 +131E9 ; [.5233.0020.0002] # EGYPTIAN HIEROGLYPH M040 +131EA ; [.5234.0020.0002] # EGYPTIAN HIEROGLYPH M040A +131EB ; [.5235.0020.0002] # EGYPTIAN HIEROGLYPH M041 +131EC ; [.5236.0020.0002] # EGYPTIAN HIEROGLYPH M042 +131ED ; [.5237.0020.0002] # EGYPTIAN HIEROGLYPH M043 +131EE ; [.5238.0020.0002] # EGYPTIAN HIEROGLYPH M044 +131EF ; [.5239.0020.0002] # EGYPTIAN HIEROGLYPH N001 +131F0 ; [.523A.0020.0002] # EGYPTIAN HIEROGLYPH N002 +131F1 ; [.523B.0020.0002] # EGYPTIAN HIEROGLYPH N003 +131F2 ; [.523C.0020.0002] # EGYPTIAN HIEROGLYPH N004 +131F3 ; [.523D.0020.0002] # EGYPTIAN HIEROGLYPH N005 +131F4 ; [.523E.0020.0002] # EGYPTIAN HIEROGLYPH N006 +131F5 ; [.523F.0020.0002] # EGYPTIAN HIEROGLYPH N007 +131F6 ; [.5240.0020.0002] # EGYPTIAN HIEROGLYPH N008 +131F7 ; [.5241.0020.0002] # EGYPTIAN HIEROGLYPH N009 +131F8 ; [.5242.0020.0002] # EGYPTIAN HIEROGLYPH N010 +131F9 ; [.5243.0020.0002] # EGYPTIAN HIEROGLYPH N011 +131FA ; [.5244.0020.0002] # EGYPTIAN HIEROGLYPH N012 +131FB ; [.5245.0020.0002] # EGYPTIAN HIEROGLYPH N013 +131FC ; [.5246.0020.0002] # EGYPTIAN HIEROGLYPH N014 +131FD ; [.5247.0020.0002] # EGYPTIAN HIEROGLYPH N015 +131FE ; [.5248.0020.0002] # EGYPTIAN HIEROGLYPH N016 +131FF ; [.5249.0020.0002] # EGYPTIAN HIEROGLYPH N017 +13200 ; [.524A.0020.0002] # EGYPTIAN HIEROGLYPH N018 +13201 ; [.524B.0020.0002] # EGYPTIAN HIEROGLYPH N018A +13202 ; [.524C.0020.0002] # EGYPTIAN HIEROGLYPH N018B +13203 ; [.524D.0020.0002] # EGYPTIAN HIEROGLYPH N019 +13204 ; [.524E.0020.0002] # EGYPTIAN HIEROGLYPH N020 +13205 ; [.524F.0020.0002] # EGYPTIAN HIEROGLYPH N021 +13206 ; [.5250.0020.0002] # EGYPTIAN HIEROGLYPH N022 +13207 ; [.5251.0020.0002] # EGYPTIAN HIEROGLYPH N023 +13208 ; [.5252.0020.0002] # EGYPTIAN HIEROGLYPH N024 +13209 ; [.5253.0020.0002] # EGYPTIAN HIEROGLYPH N025 +1320A ; [.5254.0020.0002] # EGYPTIAN HIEROGLYPH N025A +1320B ; [.5255.0020.0002] # EGYPTIAN HIEROGLYPH N026 +1320C ; [.5256.0020.0002] # EGYPTIAN HIEROGLYPH N027 +1320D ; [.5257.0020.0002] # EGYPTIAN HIEROGLYPH N028 +1320E ; [.5258.0020.0002] # EGYPTIAN HIEROGLYPH N029 +1320F ; [.5259.0020.0002] # EGYPTIAN HIEROGLYPH N030 +13210 ; [.525A.0020.0002] # EGYPTIAN HIEROGLYPH N031 +13211 ; [.525B.0020.0002] # EGYPTIAN HIEROGLYPH N032 +13212 ; [.525C.0020.0002] # EGYPTIAN HIEROGLYPH N033 +13213 ; [.525D.0020.0002] # EGYPTIAN HIEROGLYPH N033A +13214 ; [.525E.0020.0002] # EGYPTIAN HIEROGLYPH N034 +13215 ; [.525F.0020.0002] # EGYPTIAN HIEROGLYPH N034A +13216 ; [.5260.0020.0002] # EGYPTIAN HIEROGLYPH N035 +13217 ; [.5261.0020.0002] # EGYPTIAN HIEROGLYPH N035A +13218 ; [.5262.0020.0002] # EGYPTIAN HIEROGLYPH N036 +13219 ; [.5263.0020.0002] # EGYPTIAN HIEROGLYPH N037 +1321A ; [.5264.0020.0002] # EGYPTIAN HIEROGLYPH N037A +1321B ; [.5265.0020.0002] # EGYPTIAN HIEROGLYPH N038 +1321C ; [.5266.0020.0002] # EGYPTIAN HIEROGLYPH N039 +1321D ; [.5267.0020.0002] # EGYPTIAN HIEROGLYPH N040 +1321E ; [.5268.0020.0002] # EGYPTIAN HIEROGLYPH N041 +1321F ; [.5269.0020.0002] # EGYPTIAN HIEROGLYPH N042 +13220 ; [.526A.0020.0002] # EGYPTIAN HIEROGLYPH NL001 +13221 ; [.526B.0020.0002] # EGYPTIAN HIEROGLYPH NL002 +13222 ; [.526C.0020.0002] # EGYPTIAN HIEROGLYPH NL003 +13223 ; [.526D.0020.0002] # EGYPTIAN HIEROGLYPH NL004 +13224 ; [.526E.0020.0002] # EGYPTIAN HIEROGLYPH NL005 +13225 ; [.526F.0020.0002] # EGYPTIAN HIEROGLYPH NL005A +13226 ; [.5270.0020.0002] # EGYPTIAN HIEROGLYPH NL006 +13227 ; [.5271.0020.0002] # EGYPTIAN HIEROGLYPH NL007 +13228 ; [.5272.0020.0002] # EGYPTIAN HIEROGLYPH NL008 +13229 ; [.5273.0020.0002] # EGYPTIAN HIEROGLYPH NL009 +1322A ; [.5274.0020.0002] # EGYPTIAN HIEROGLYPH NL010 +1322B ; [.5275.0020.0002] # EGYPTIAN HIEROGLYPH NL011 +1322C ; [.5276.0020.0002] # EGYPTIAN HIEROGLYPH NL012 +1322D ; [.5277.0020.0002] # EGYPTIAN HIEROGLYPH NL013 +1322E ; [.5278.0020.0002] # EGYPTIAN HIEROGLYPH NL014 +1322F ; [.5279.0020.0002] # EGYPTIAN HIEROGLYPH NL015 +13230 ; [.527A.0020.0002] # EGYPTIAN HIEROGLYPH NL016 +13231 ; [.527B.0020.0002] # EGYPTIAN HIEROGLYPH NL017 +13232 ; [.527C.0020.0002] # EGYPTIAN HIEROGLYPH NL017A +13233 ; [.527D.0020.0002] # EGYPTIAN HIEROGLYPH NL018 +13234 ; [.527E.0020.0002] # EGYPTIAN HIEROGLYPH NL019 +13235 ; [.527F.0020.0002] # EGYPTIAN HIEROGLYPH NL020 +13236 ; [.5280.0020.0002] # EGYPTIAN HIEROGLYPH NU001 +13237 ; [.5281.0020.0002] # EGYPTIAN HIEROGLYPH NU002 +13238 ; [.5282.0020.0002] # EGYPTIAN HIEROGLYPH NU003 +13239 ; [.5283.0020.0002] # EGYPTIAN HIEROGLYPH NU004 +1323A ; [.5284.0020.0002] # EGYPTIAN HIEROGLYPH NU005 +1323B ; [.5285.0020.0002] # EGYPTIAN HIEROGLYPH NU006 +1323C ; [.5286.0020.0002] # EGYPTIAN HIEROGLYPH NU007 +1323D ; [.5287.0020.0002] # EGYPTIAN HIEROGLYPH NU008 +1323E ; [.5288.0020.0002] # EGYPTIAN HIEROGLYPH NU009 +1323F ; [.5289.0020.0002] # EGYPTIAN HIEROGLYPH NU010 +13240 ; [.528A.0020.0002] # EGYPTIAN HIEROGLYPH NU010A +13241 ; [.528B.0020.0002] # EGYPTIAN HIEROGLYPH NU011 +13242 ; [.528C.0020.0002] # EGYPTIAN HIEROGLYPH NU011A +13243 ; [.528D.0020.0002] # EGYPTIAN HIEROGLYPH NU012 +13244 ; [.528E.0020.0002] # EGYPTIAN HIEROGLYPH NU013 +13245 ; [.528F.0020.0002] # EGYPTIAN HIEROGLYPH NU014 +13246 ; [.5290.0020.0002] # EGYPTIAN HIEROGLYPH NU015 +13247 ; [.5291.0020.0002] # EGYPTIAN HIEROGLYPH NU016 +13248 ; [.5292.0020.0002] # EGYPTIAN HIEROGLYPH NU017 +13249 ; [.5293.0020.0002] # EGYPTIAN HIEROGLYPH NU018 +1324A ; [.5294.0020.0002] # EGYPTIAN HIEROGLYPH NU018A +1324B ; [.5295.0020.0002] # EGYPTIAN HIEROGLYPH NU019 +1324C ; [.5296.0020.0002] # EGYPTIAN HIEROGLYPH NU020 +1324D ; [.5297.0020.0002] # EGYPTIAN HIEROGLYPH NU021 +1324E ; [.5298.0020.0002] # EGYPTIAN HIEROGLYPH NU022 +1324F ; [.5299.0020.0002] # EGYPTIAN HIEROGLYPH NU022A +13250 ; [.529A.0020.0002] # EGYPTIAN HIEROGLYPH O001 +13251 ; [.529B.0020.0002] # EGYPTIAN HIEROGLYPH O001A +13252 ; [.529C.0020.0002] # EGYPTIAN HIEROGLYPH O002 +13253 ; [.529D.0020.0002] # EGYPTIAN HIEROGLYPH O003 +13254 ; [.529E.0020.0002] # EGYPTIAN HIEROGLYPH O004 +13255 ; [.529F.0020.0002] # EGYPTIAN HIEROGLYPH O005 +13256 ; [.52A0.0020.0002] # EGYPTIAN HIEROGLYPH O005A +13257 ; [.52A1.0020.0002] # EGYPTIAN HIEROGLYPH O006 +13258 ; [.52A2.0020.0002] # EGYPTIAN HIEROGLYPH O006A +13259 ; [.52A3.0020.0002] # EGYPTIAN HIEROGLYPH O006B +1325A ; [.52A4.0020.0002] # EGYPTIAN HIEROGLYPH O006C +1325B ; [.52A5.0020.0002] # EGYPTIAN HIEROGLYPH O006D +1325C ; [.52A6.0020.0002] # EGYPTIAN HIEROGLYPH O006E +1325D ; [.52A7.0020.0002] # EGYPTIAN HIEROGLYPH O006F +1325E ; [.52A8.0020.0002] # EGYPTIAN HIEROGLYPH O007 +1325F ; [.52A9.0020.0002] # EGYPTIAN HIEROGLYPH O008 +13260 ; [.52AA.0020.0002] # EGYPTIAN HIEROGLYPH O009 +13261 ; [.52AB.0020.0002] # EGYPTIAN HIEROGLYPH O010 +13262 ; [.52AC.0020.0002] # EGYPTIAN HIEROGLYPH O010A +13263 ; [.52AD.0020.0002] # EGYPTIAN HIEROGLYPH O010B +13264 ; [.52AE.0020.0002] # EGYPTIAN HIEROGLYPH O010C +13265 ; [.52AF.0020.0002] # EGYPTIAN HIEROGLYPH O011 +13266 ; [.52B0.0020.0002] # EGYPTIAN HIEROGLYPH O012 +13267 ; [.52B1.0020.0002] # EGYPTIAN HIEROGLYPH O013 +13268 ; [.52B2.0020.0002] # EGYPTIAN HIEROGLYPH O014 +13269 ; [.52B3.0020.0002] # EGYPTIAN HIEROGLYPH O015 +1326A ; [.52B4.0020.0002] # EGYPTIAN HIEROGLYPH O016 +1326B ; [.52B5.0020.0002] # EGYPTIAN HIEROGLYPH O017 +1326C ; [.52B6.0020.0002] # EGYPTIAN HIEROGLYPH O018 +1326D ; [.52B7.0020.0002] # EGYPTIAN HIEROGLYPH O019 +1326E ; [.52B8.0020.0002] # EGYPTIAN HIEROGLYPH O019A +1326F ; [.52B9.0020.0002] # EGYPTIAN HIEROGLYPH O020 +13270 ; [.52BA.0020.0002] # EGYPTIAN HIEROGLYPH O020A +13271 ; [.52BB.0020.0002] # EGYPTIAN HIEROGLYPH O021 +13272 ; [.52BC.0020.0002] # EGYPTIAN HIEROGLYPH O022 +13273 ; [.52BD.0020.0002] # EGYPTIAN HIEROGLYPH O023 +13274 ; [.52BE.0020.0002] # EGYPTIAN HIEROGLYPH O024 +13275 ; [.52BF.0020.0002] # EGYPTIAN HIEROGLYPH O024A +13276 ; [.52C0.0020.0002] # EGYPTIAN HIEROGLYPH O025 +13277 ; [.52C1.0020.0002] # EGYPTIAN HIEROGLYPH O025A +13278 ; [.52C2.0020.0002] # EGYPTIAN HIEROGLYPH O026 +13279 ; [.52C3.0020.0002] # EGYPTIAN HIEROGLYPH O027 +1327A ; [.52C4.0020.0002] # EGYPTIAN HIEROGLYPH O028 +1327B ; [.52C5.0020.0002] # EGYPTIAN HIEROGLYPH O029 +1327C ; [.52C6.0020.0002] # EGYPTIAN HIEROGLYPH O029A +1327D ; [.52C7.0020.0002] # EGYPTIAN HIEROGLYPH O030 +1327E ; [.52C8.0020.0002] # EGYPTIAN HIEROGLYPH O030A +1327F ; [.52C9.0020.0002] # EGYPTIAN HIEROGLYPH O031 +13280 ; [.52CA.0020.0002] # EGYPTIAN HIEROGLYPH O032 +13281 ; [.52CB.0020.0002] # EGYPTIAN HIEROGLYPH O033 +13282 ; [.52CC.0020.0002] # EGYPTIAN HIEROGLYPH O033A +13283 ; [.52CD.0020.0002] # EGYPTIAN HIEROGLYPH O034 +13284 ; [.52CE.0020.0002] # EGYPTIAN HIEROGLYPH O035 +13285 ; [.52CF.0020.0002] # EGYPTIAN HIEROGLYPH O036 +13286 ; [.52D0.0020.0002] # EGYPTIAN HIEROGLYPH O036A +13287 ; [.52D1.0020.0002] # EGYPTIAN HIEROGLYPH O036B +13288 ; [.52D2.0020.0002] # EGYPTIAN HIEROGLYPH O036C +13289 ; [.52D3.0020.0002] # EGYPTIAN HIEROGLYPH O036D +1328A ; [.52D4.0020.0002] # EGYPTIAN HIEROGLYPH O037 +1328B ; [.52D5.0020.0002] # EGYPTIAN HIEROGLYPH O038 +1328C ; [.52D6.0020.0002] # EGYPTIAN HIEROGLYPH O039 +1328D ; [.52D7.0020.0002] # EGYPTIAN HIEROGLYPH O040 +1328E ; [.52D8.0020.0002] # EGYPTIAN HIEROGLYPH O041 +1328F ; [.52D9.0020.0002] # EGYPTIAN HIEROGLYPH O042 +13290 ; [.52DA.0020.0002] # EGYPTIAN HIEROGLYPH O043 +13291 ; [.52DB.0020.0002] # EGYPTIAN HIEROGLYPH O044 +13292 ; [.52DC.0020.0002] # EGYPTIAN HIEROGLYPH O045 +13293 ; [.52DD.0020.0002] # EGYPTIAN HIEROGLYPH O046 +13294 ; [.52DE.0020.0002] # EGYPTIAN HIEROGLYPH O047 +13295 ; [.52DF.0020.0002] # EGYPTIAN HIEROGLYPH O048 +13296 ; [.52E0.0020.0002] # EGYPTIAN HIEROGLYPH O049 +13297 ; [.52E1.0020.0002] # EGYPTIAN HIEROGLYPH O050 +13298 ; [.52E2.0020.0002] # EGYPTIAN HIEROGLYPH O050A +13299 ; [.52E3.0020.0002] # EGYPTIAN HIEROGLYPH O050B +1329A ; [.52E4.0020.0002] # EGYPTIAN HIEROGLYPH O051 +1329B ; [.52E5.0020.0002] # EGYPTIAN HIEROGLYPH P001 +1329C ; [.52E6.0020.0002] # EGYPTIAN HIEROGLYPH P001A +1329D ; [.52E7.0020.0002] # EGYPTIAN HIEROGLYPH P002 +1329E ; [.52E8.0020.0002] # EGYPTIAN HIEROGLYPH P003 +1329F ; [.52E9.0020.0002] # EGYPTIAN HIEROGLYPH P003A +132A0 ; [.52EA.0020.0002] # EGYPTIAN HIEROGLYPH P004 +132A1 ; [.52EB.0020.0002] # EGYPTIAN HIEROGLYPH P005 +132A2 ; [.52EC.0020.0002] # EGYPTIAN HIEROGLYPH P006 +132A3 ; [.52ED.0020.0002] # EGYPTIAN HIEROGLYPH P007 +132A4 ; [.52EE.0020.0002] # EGYPTIAN HIEROGLYPH P008 +132A5 ; [.52EF.0020.0002] # EGYPTIAN HIEROGLYPH P009 +132A6 ; [.52F0.0020.0002] # EGYPTIAN HIEROGLYPH P010 +132A7 ; [.52F1.0020.0002] # EGYPTIAN HIEROGLYPH P011 +132A8 ; [.52F2.0020.0002] # EGYPTIAN HIEROGLYPH Q001 +132A9 ; [.52F3.0020.0002] # EGYPTIAN HIEROGLYPH Q002 +132AA ; [.52F4.0020.0002] # EGYPTIAN HIEROGLYPH Q003 +132AB ; [.52F5.0020.0002] # EGYPTIAN HIEROGLYPH Q004 +132AC ; [.52F6.0020.0002] # EGYPTIAN HIEROGLYPH Q005 +132AD ; [.52F7.0020.0002] # EGYPTIAN HIEROGLYPH Q006 +132AE ; [.52F8.0020.0002] # EGYPTIAN HIEROGLYPH Q007 +132AF ; [.52F9.0020.0002] # EGYPTIAN HIEROGLYPH R001 +132B0 ; [.52FA.0020.0002] # EGYPTIAN HIEROGLYPH R002 +132B1 ; [.52FB.0020.0002] # EGYPTIAN HIEROGLYPH R002A +132B2 ; [.52FC.0020.0002] # EGYPTIAN HIEROGLYPH R003 +132B3 ; [.52FD.0020.0002] # EGYPTIAN HIEROGLYPH R003A +132B4 ; [.52FE.0020.0002] # EGYPTIAN HIEROGLYPH R003B +132B5 ; [.52FF.0020.0002] # EGYPTIAN HIEROGLYPH R004 +132B6 ; [.5300.0020.0002] # EGYPTIAN HIEROGLYPH R005 +132B7 ; [.5301.0020.0002] # EGYPTIAN HIEROGLYPH R006 +132B8 ; [.5302.0020.0002] # EGYPTIAN HIEROGLYPH R007 +132B9 ; [.5303.0020.0002] # EGYPTIAN HIEROGLYPH R008 +132BA ; [.5304.0020.0002] # EGYPTIAN HIEROGLYPH R009 +132BB ; [.5305.0020.0002] # EGYPTIAN HIEROGLYPH R010 +132BC ; [.5306.0020.0002] # EGYPTIAN HIEROGLYPH R010A +132BD ; [.5307.0020.0002] # EGYPTIAN HIEROGLYPH R011 +132BE ; [.5308.0020.0002] # EGYPTIAN HIEROGLYPH R012 +132BF ; [.5309.0020.0002] # EGYPTIAN HIEROGLYPH R013 +132C0 ; [.530A.0020.0002] # EGYPTIAN HIEROGLYPH R014 +132C1 ; [.530B.0020.0002] # EGYPTIAN HIEROGLYPH R015 +132C2 ; [.530C.0020.0002] # EGYPTIAN HIEROGLYPH R016 +132C3 ; [.530D.0020.0002] # EGYPTIAN HIEROGLYPH R016A +132C4 ; [.530E.0020.0002] # EGYPTIAN HIEROGLYPH R017 +132C5 ; [.530F.0020.0002] # EGYPTIAN HIEROGLYPH R018 +132C6 ; [.5310.0020.0002] # EGYPTIAN HIEROGLYPH R019 +132C7 ; [.5311.0020.0002] # EGYPTIAN HIEROGLYPH R020 +132C8 ; [.5312.0020.0002] # EGYPTIAN HIEROGLYPH R021 +132C9 ; [.5313.0020.0002] # EGYPTIAN HIEROGLYPH R022 +132CA ; [.5314.0020.0002] # EGYPTIAN HIEROGLYPH R023 +132CB ; [.5315.0020.0002] # EGYPTIAN HIEROGLYPH R024 +132CC ; [.5316.0020.0002] # EGYPTIAN HIEROGLYPH R025 +132CD ; [.5317.0020.0002] # EGYPTIAN HIEROGLYPH R026 +132CE ; [.5318.0020.0002] # EGYPTIAN HIEROGLYPH R027 +132CF ; [.5319.0020.0002] # EGYPTIAN HIEROGLYPH R028 +132D0 ; [.531A.0020.0002] # EGYPTIAN HIEROGLYPH R029 +132D1 ; [.531B.0020.0002] # EGYPTIAN HIEROGLYPH S001 +132D2 ; [.531C.0020.0002] # EGYPTIAN HIEROGLYPH S002 +132D3 ; [.531D.0020.0002] # EGYPTIAN HIEROGLYPH S002A +132D4 ; [.531E.0020.0002] # EGYPTIAN HIEROGLYPH S003 +132D5 ; [.531F.0020.0002] # EGYPTIAN HIEROGLYPH S004 +132D6 ; [.5320.0020.0002] # EGYPTIAN HIEROGLYPH S005 +132D7 ; [.5321.0020.0002] # EGYPTIAN HIEROGLYPH S006 +132D8 ; [.5322.0020.0002] # EGYPTIAN HIEROGLYPH S006A +132D9 ; [.5323.0020.0002] # EGYPTIAN HIEROGLYPH S007 +132DA ; [.5324.0020.0002] # EGYPTIAN HIEROGLYPH S008 +132DB ; [.5325.0020.0002] # EGYPTIAN HIEROGLYPH S009 +132DC ; [.5326.0020.0002] # EGYPTIAN HIEROGLYPH S010 +132DD ; [.5327.0020.0002] # EGYPTIAN HIEROGLYPH S011 +132DE ; [.5328.0020.0002] # EGYPTIAN HIEROGLYPH S012 +132DF ; [.5329.0020.0002] # EGYPTIAN HIEROGLYPH S013 +132E0 ; [.532A.0020.0002] # EGYPTIAN HIEROGLYPH S014 +132E1 ; [.532B.0020.0002] # EGYPTIAN HIEROGLYPH S014A +132E2 ; [.532C.0020.0002] # EGYPTIAN HIEROGLYPH S014B +132E3 ; [.532D.0020.0002] # EGYPTIAN HIEROGLYPH S015 +132E4 ; [.532E.0020.0002] # EGYPTIAN HIEROGLYPH S016 +132E5 ; [.532F.0020.0002] # EGYPTIAN HIEROGLYPH S017 +132E6 ; [.5330.0020.0002] # EGYPTIAN HIEROGLYPH S017A +132E7 ; [.5331.0020.0002] # EGYPTIAN HIEROGLYPH S018 +132E8 ; [.5332.0020.0002] # EGYPTIAN HIEROGLYPH S019 +132E9 ; [.5333.0020.0002] # EGYPTIAN HIEROGLYPH S020 +132EA ; [.5334.0020.0002] # EGYPTIAN HIEROGLYPH S021 +132EB ; [.5335.0020.0002] # EGYPTIAN HIEROGLYPH S022 +132EC ; [.5336.0020.0002] # EGYPTIAN HIEROGLYPH S023 +132ED ; [.5337.0020.0002] # EGYPTIAN HIEROGLYPH S024 +132EE ; [.5338.0020.0002] # EGYPTIAN HIEROGLYPH S025 +132EF ; [.5339.0020.0002] # EGYPTIAN HIEROGLYPH S026 +132F0 ; [.533A.0020.0002] # EGYPTIAN HIEROGLYPH S026A +132F1 ; [.533B.0020.0002] # EGYPTIAN HIEROGLYPH S026B +132F2 ; [.533C.0020.0002] # EGYPTIAN HIEROGLYPH S027 +132F3 ; [.533D.0020.0002] # EGYPTIAN HIEROGLYPH S028 +132F4 ; [.533E.0020.0002] # EGYPTIAN HIEROGLYPH S029 +132F5 ; [.533F.0020.0002] # EGYPTIAN HIEROGLYPH S030 +132F6 ; [.5340.0020.0002] # EGYPTIAN HIEROGLYPH S031 +132F7 ; [.5341.0020.0002] # EGYPTIAN HIEROGLYPH S032 +132F8 ; [.5342.0020.0002] # EGYPTIAN HIEROGLYPH S033 +132F9 ; [.5343.0020.0002] # EGYPTIAN HIEROGLYPH S034 +132FA ; [.5344.0020.0002] # EGYPTIAN HIEROGLYPH S035 +132FB ; [.5345.0020.0002] # EGYPTIAN HIEROGLYPH S035A +132FC ; [.5346.0020.0002] # EGYPTIAN HIEROGLYPH S036 +132FD ; [.5347.0020.0002] # EGYPTIAN HIEROGLYPH S037 +132FE ; [.5348.0020.0002] # EGYPTIAN HIEROGLYPH S038 +132FF ; [.5349.0020.0002] # EGYPTIAN HIEROGLYPH S039 +13300 ; [.534A.0020.0002] # EGYPTIAN HIEROGLYPH S040 +13301 ; [.534B.0020.0002] # EGYPTIAN HIEROGLYPH S041 +13302 ; [.534C.0020.0002] # EGYPTIAN HIEROGLYPH S042 +13303 ; [.534D.0020.0002] # EGYPTIAN HIEROGLYPH S043 +13304 ; [.534E.0020.0002] # EGYPTIAN HIEROGLYPH S044 +13305 ; [.534F.0020.0002] # EGYPTIAN HIEROGLYPH S045 +13306 ; [.5350.0020.0002] # EGYPTIAN HIEROGLYPH S046 +13307 ; [.5351.0020.0002] # EGYPTIAN HIEROGLYPH T001 +13308 ; [.5352.0020.0002] # EGYPTIAN HIEROGLYPH T002 +13309 ; [.5353.0020.0002] # EGYPTIAN HIEROGLYPH T003 +1330A ; [.5354.0020.0002] # EGYPTIAN HIEROGLYPH T003A +1330B ; [.5355.0020.0002] # EGYPTIAN HIEROGLYPH T004 +1330C ; [.5356.0020.0002] # EGYPTIAN HIEROGLYPH T005 +1330D ; [.5357.0020.0002] # EGYPTIAN HIEROGLYPH T006 +1330E ; [.5358.0020.0002] # EGYPTIAN HIEROGLYPH T007 +1330F ; [.5359.0020.0002] # EGYPTIAN HIEROGLYPH T007A +13310 ; [.535A.0020.0002] # EGYPTIAN HIEROGLYPH T008 +13311 ; [.535B.0020.0002] # EGYPTIAN HIEROGLYPH T008A +13312 ; [.535C.0020.0002] # EGYPTIAN HIEROGLYPH T009 +13313 ; [.535D.0020.0002] # EGYPTIAN HIEROGLYPH T009A +13314 ; [.535E.0020.0002] # EGYPTIAN HIEROGLYPH T010 +13315 ; [.535F.0020.0002] # EGYPTIAN HIEROGLYPH T011 +13316 ; [.5360.0020.0002] # EGYPTIAN HIEROGLYPH T011A +13317 ; [.5361.0020.0002] # EGYPTIAN HIEROGLYPH T012 +13318 ; [.5362.0020.0002] # EGYPTIAN HIEROGLYPH T013 +13319 ; [.5363.0020.0002] # EGYPTIAN HIEROGLYPH T014 +1331A ; [.5364.0020.0002] # EGYPTIAN HIEROGLYPH T015 +1331B ; [.5365.0020.0002] # EGYPTIAN HIEROGLYPH T016 +1331C ; [.5366.0020.0002] # EGYPTIAN HIEROGLYPH T016A +1331D ; [.5367.0020.0002] # EGYPTIAN HIEROGLYPH T017 +1331E ; [.5368.0020.0002] # EGYPTIAN HIEROGLYPH T018 +1331F ; [.5369.0020.0002] # EGYPTIAN HIEROGLYPH T019 +13320 ; [.536A.0020.0002] # EGYPTIAN HIEROGLYPH T020 +13321 ; [.536B.0020.0002] # EGYPTIAN HIEROGLYPH T021 +13322 ; [.536C.0020.0002] # EGYPTIAN HIEROGLYPH T022 +13323 ; [.536D.0020.0002] # EGYPTIAN HIEROGLYPH T023 +13324 ; [.536E.0020.0002] # EGYPTIAN HIEROGLYPH T024 +13325 ; [.536F.0020.0002] # EGYPTIAN HIEROGLYPH T025 +13326 ; [.5370.0020.0002] # EGYPTIAN HIEROGLYPH T026 +13327 ; [.5371.0020.0002] # EGYPTIAN HIEROGLYPH T027 +13328 ; [.5372.0020.0002] # EGYPTIAN HIEROGLYPH T028 +13329 ; [.5373.0020.0002] # EGYPTIAN HIEROGLYPH T029 +1332A ; [.5374.0020.0002] # EGYPTIAN HIEROGLYPH T030 +1332B ; [.5375.0020.0002] # EGYPTIAN HIEROGLYPH T031 +1332C ; [.5376.0020.0002] # EGYPTIAN HIEROGLYPH T032 +1332D ; [.5377.0020.0002] # EGYPTIAN HIEROGLYPH T032A +1332E ; [.5378.0020.0002] # EGYPTIAN HIEROGLYPH T033 +1332F ; [.5379.0020.0002] # EGYPTIAN HIEROGLYPH T033A +13330 ; [.537A.0020.0002] # EGYPTIAN HIEROGLYPH T034 +13331 ; [.537B.0020.0002] # EGYPTIAN HIEROGLYPH T035 +13332 ; [.537C.0020.0002] # EGYPTIAN HIEROGLYPH T036 +13333 ; [.537D.0020.0002] # EGYPTIAN HIEROGLYPH U001 +13334 ; [.537E.0020.0002] # EGYPTIAN HIEROGLYPH U002 +13335 ; [.537F.0020.0002] # EGYPTIAN HIEROGLYPH U003 +13336 ; [.5380.0020.0002] # EGYPTIAN HIEROGLYPH U004 +13337 ; [.5381.0020.0002] # EGYPTIAN HIEROGLYPH U005 +13338 ; [.5382.0020.0002] # EGYPTIAN HIEROGLYPH U006 +13339 ; [.5383.0020.0002] # EGYPTIAN HIEROGLYPH U006A +1333A ; [.5384.0020.0002] # EGYPTIAN HIEROGLYPH U006B +1333B ; [.5385.0020.0002] # EGYPTIAN HIEROGLYPH U007 +1333C ; [.5386.0020.0002] # EGYPTIAN HIEROGLYPH U008 +1333D ; [.5387.0020.0002] # EGYPTIAN HIEROGLYPH U009 +1333E ; [.5388.0020.0002] # EGYPTIAN HIEROGLYPH U010 +1333F ; [.5389.0020.0002] # EGYPTIAN HIEROGLYPH U011 +13340 ; [.538A.0020.0002] # EGYPTIAN HIEROGLYPH U012 +13341 ; [.538B.0020.0002] # EGYPTIAN HIEROGLYPH U013 +13342 ; [.538C.0020.0002] # EGYPTIAN HIEROGLYPH U014 +13343 ; [.538D.0020.0002] # EGYPTIAN HIEROGLYPH U015 +13344 ; [.538E.0020.0002] # EGYPTIAN HIEROGLYPH U016 +13345 ; [.538F.0020.0002] # EGYPTIAN HIEROGLYPH U017 +13346 ; [.5390.0020.0002] # EGYPTIAN HIEROGLYPH U018 +13347 ; [.5391.0020.0002] # EGYPTIAN HIEROGLYPH U019 +13348 ; [.5392.0020.0002] # EGYPTIAN HIEROGLYPH U020 +13349 ; [.5393.0020.0002] # EGYPTIAN HIEROGLYPH U021 +1334A ; [.5394.0020.0002] # EGYPTIAN HIEROGLYPH U022 +1334B ; [.5395.0020.0002] # EGYPTIAN HIEROGLYPH U023 +1334C ; [.5396.0020.0002] # EGYPTIAN HIEROGLYPH U023A +1334D ; [.5397.0020.0002] # EGYPTIAN HIEROGLYPH U024 +1334E ; [.5398.0020.0002] # EGYPTIAN HIEROGLYPH U025 +1334F ; [.5399.0020.0002] # EGYPTIAN HIEROGLYPH U026 +13350 ; [.539A.0020.0002] # EGYPTIAN HIEROGLYPH U027 +13351 ; [.539B.0020.0002] # EGYPTIAN HIEROGLYPH U028 +13352 ; [.539C.0020.0002] # EGYPTIAN HIEROGLYPH U029 +13353 ; [.539D.0020.0002] # EGYPTIAN HIEROGLYPH U029A +13354 ; [.539E.0020.0002] # EGYPTIAN HIEROGLYPH U030 +13355 ; [.539F.0020.0002] # EGYPTIAN HIEROGLYPH U031 +13356 ; [.53A0.0020.0002] # EGYPTIAN HIEROGLYPH U032 +13357 ; [.53A1.0020.0002] # EGYPTIAN HIEROGLYPH U032A +13358 ; [.53A2.0020.0002] # EGYPTIAN HIEROGLYPH U033 +13359 ; [.53A3.0020.0002] # EGYPTIAN HIEROGLYPH U034 +1335A ; [.53A4.0020.0002] # EGYPTIAN HIEROGLYPH U035 +1335B ; [.53A5.0020.0002] # EGYPTIAN HIEROGLYPH U036 +1335C ; [.53A6.0020.0002] # EGYPTIAN HIEROGLYPH U037 +1335D ; [.53A7.0020.0002] # EGYPTIAN HIEROGLYPH U038 +1335E ; [.53A8.0020.0002] # EGYPTIAN HIEROGLYPH U039 +1335F ; [.53A9.0020.0002] # EGYPTIAN HIEROGLYPH U040 +13360 ; [.53AA.0020.0002] # EGYPTIAN HIEROGLYPH U041 +13361 ; [.53AB.0020.0002] # EGYPTIAN HIEROGLYPH U042 +13362 ; [.53AC.0020.0002] # EGYPTIAN HIEROGLYPH V001 +13363 ; [.53AD.0020.0002] # EGYPTIAN HIEROGLYPH V001A +13364 ; [.53AE.0020.0002] # EGYPTIAN HIEROGLYPH V001B +13365 ; [.53AF.0020.0002] # EGYPTIAN HIEROGLYPH V001C +13366 ; [.53B0.0020.0002] # EGYPTIAN HIEROGLYPH V001D +13367 ; [.53B1.0020.0002] # EGYPTIAN HIEROGLYPH V001E +13368 ; [.53B2.0020.0002] # EGYPTIAN HIEROGLYPH V001F +13369 ; [.53B3.0020.0002] # EGYPTIAN HIEROGLYPH V001G +1336A ; [.53B4.0020.0002] # EGYPTIAN HIEROGLYPH V001H +1336B ; [.53B5.0020.0002] # EGYPTIAN HIEROGLYPH V001I +1336C ; [.53B6.0020.0002] # EGYPTIAN HIEROGLYPH V002 +1336D ; [.53B7.0020.0002] # EGYPTIAN HIEROGLYPH V002A +1336E ; [.53B8.0020.0002] # EGYPTIAN HIEROGLYPH V003 +1336F ; [.53B9.0020.0002] # EGYPTIAN HIEROGLYPH V004 +13370 ; [.53BA.0020.0002] # EGYPTIAN HIEROGLYPH V005 +13371 ; [.53BB.0020.0002] # EGYPTIAN HIEROGLYPH V006 +13372 ; [.53BC.0020.0002] # EGYPTIAN HIEROGLYPH V007 +13373 ; [.53BD.0020.0002] # EGYPTIAN HIEROGLYPH V007A +13374 ; [.53BE.0020.0002] # EGYPTIAN HIEROGLYPH V007B +13375 ; [.53BF.0020.0002] # EGYPTIAN HIEROGLYPH V008 +13376 ; [.53C0.0020.0002] # EGYPTIAN HIEROGLYPH V009 +13377 ; [.53C1.0020.0002] # EGYPTIAN HIEROGLYPH V010 +13378 ; [.53C2.0020.0002] # EGYPTIAN HIEROGLYPH V011 +13379 ; [.53C3.0020.0002] # EGYPTIAN HIEROGLYPH V011A +1337A ; [.53C4.0020.0002] # EGYPTIAN HIEROGLYPH V011B +1337B ; [.53C5.0020.0002] # EGYPTIAN HIEROGLYPH V011C +1337C ; [.53C6.0020.0002] # EGYPTIAN HIEROGLYPH V012 +1337D ; [.53C7.0020.0002] # EGYPTIAN HIEROGLYPH V012A +1337E ; [.53C8.0020.0002] # EGYPTIAN HIEROGLYPH V012B +1337F ; [.53C9.0020.0002] # EGYPTIAN HIEROGLYPH V013 +13380 ; [.53CA.0020.0002] # EGYPTIAN HIEROGLYPH V014 +13381 ; [.53CB.0020.0002] # EGYPTIAN HIEROGLYPH V015 +13382 ; [.53CC.0020.0002] # EGYPTIAN HIEROGLYPH V016 +13383 ; [.53CD.0020.0002] # EGYPTIAN HIEROGLYPH V017 +13384 ; [.53CE.0020.0002] # EGYPTIAN HIEROGLYPH V018 +13385 ; [.53CF.0020.0002] # EGYPTIAN HIEROGLYPH V019 +13386 ; [.53D0.0020.0002] # EGYPTIAN HIEROGLYPH V020 +13387 ; [.53D1.0020.0002] # EGYPTIAN HIEROGLYPH V020A +13388 ; [.53D2.0020.0002] # EGYPTIAN HIEROGLYPH V020B +13389 ; [.53D3.0020.0002] # EGYPTIAN HIEROGLYPH V020C +1338A ; [.53D4.0020.0002] # EGYPTIAN HIEROGLYPH V020D +1338B ; [.53D5.0020.0002] # EGYPTIAN HIEROGLYPH V020E +1338C ; [.53D6.0020.0002] # EGYPTIAN HIEROGLYPH V020F +1338D ; [.53D7.0020.0002] # EGYPTIAN HIEROGLYPH V020G +1338E ; [.53D8.0020.0002] # EGYPTIAN HIEROGLYPH V020H +1338F ; [.53D9.0020.0002] # EGYPTIAN HIEROGLYPH V020I +13390 ; [.53DA.0020.0002] # EGYPTIAN HIEROGLYPH V020J +13391 ; [.53DB.0020.0002] # EGYPTIAN HIEROGLYPH V020K +13392 ; [.53DC.0020.0002] # EGYPTIAN HIEROGLYPH V020L +13393 ; [.53DD.0020.0002] # EGYPTIAN HIEROGLYPH V021 +13394 ; [.53DE.0020.0002] # EGYPTIAN HIEROGLYPH V022 +13395 ; [.53DF.0020.0002] # EGYPTIAN HIEROGLYPH V023 +13396 ; [.53E0.0020.0002] # EGYPTIAN HIEROGLYPH V023A +13397 ; [.53E1.0020.0002] # EGYPTIAN HIEROGLYPH V024 +13398 ; [.53E2.0020.0002] # EGYPTIAN HIEROGLYPH V025 +13399 ; [.53E3.0020.0002] # EGYPTIAN HIEROGLYPH V026 +1339A ; [.53E4.0020.0002] # EGYPTIAN HIEROGLYPH V027 +1339B ; [.53E5.0020.0002] # EGYPTIAN HIEROGLYPH V028 +1339C ; [.53E6.0020.0002] # EGYPTIAN HIEROGLYPH V028A +1339D ; [.53E7.0020.0002] # EGYPTIAN HIEROGLYPH V029 +1339E ; [.53E8.0020.0002] # EGYPTIAN HIEROGLYPH V029A +1339F ; [.53E9.0020.0002] # EGYPTIAN HIEROGLYPH V030 +133A0 ; [.53EA.0020.0002] # EGYPTIAN HIEROGLYPH V030A +133A1 ; [.53EB.0020.0002] # EGYPTIAN HIEROGLYPH V031 +133A2 ; [.53EC.0020.0002] # EGYPTIAN HIEROGLYPH V031A +133A3 ; [.53ED.0020.0002] # EGYPTIAN HIEROGLYPH V032 +133A4 ; [.53EE.0020.0002] # EGYPTIAN HIEROGLYPH V033 +133A5 ; [.53EF.0020.0002] # EGYPTIAN HIEROGLYPH V033A +133A6 ; [.53F0.0020.0002] # EGYPTIAN HIEROGLYPH V034 +133A7 ; [.53F1.0020.0002] # EGYPTIAN HIEROGLYPH V035 +133A8 ; [.53F2.0020.0002] # EGYPTIAN HIEROGLYPH V036 +133A9 ; [.53F3.0020.0002] # EGYPTIAN HIEROGLYPH V037 +133AA ; [.53F4.0020.0002] # EGYPTIAN HIEROGLYPH V037A +133AB ; [.53F5.0020.0002] # EGYPTIAN HIEROGLYPH V038 +133AC ; [.53F6.0020.0002] # EGYPTIAN HIEROGLYPH V039 +133AD ; [.53F7.0020.0002] # EGYPTIAN HIEROGLYPH V040 +133AE ; [.53F8.0020.0002] # EGYPTIAN HIEROGLYPH V040A +133AF ; [.53F9.0020.0002] # EGYPTIAN HIEROGLYPH W001 +133B0 ; [.53FA.0020.0002] # EGYPTIAN HIEROGLYPH W002 +133B1 ; [.53FB.0020.0002] # EGYPTIAN HIEROGLYPH W003 +133B2 ; [.53FC.0020.0002] # EGYPTIAN HIEROGLYPH W003A +133B3 ; [.53FD.0020.0002] # EGYPTIAN HIEROGLYPH W004 +133B4 ; [.53FE.0020.0002] # EGYPTIAN HIEROGLYPH W005 +133B5 ; [.53FF.0020.0002] # EGYPTIAN HIEROGLYPH W006 +133B6 ; [.5400.0020.0002] # EGYPTIAN HIEROGLYPH W007 +133B7 ; [.5401.0020.0002] # EGYPTIAN HIEROGLYPH W008 +133B8 ; [.5402.0020.0002] # EGYPTIAN HIEROGLYPH W009 +133B9 ; [.5403.0020.0002] # EGYPTIAN HIEROGLYPH W009A +133BA ; [.5404.0020.0002] # EGYPTIAN HIEROGLYPH W010 +133BB ; [.5405.0020.0002] # EGYPTIAN HIEROGLYPH W010A +133BC ; [.5406.0020.0002] # EGYPTIAN HIEROGLYPH W011 +133BD ; [.5407.0020.0002] # EGYPTIAN HIEROGLYPH W012 +133BE ; [.5408.0020.0002] # EGYPTIAN HIEROGLYPH W013 +133BF ; [.5409.0020.0002] # EGYPTIAN HIEROGLYPH W014 +133C0 ; [.540A.0020.0002] # EGYPTIAN HIEROGLYPH W014A +133C1 ; [.540B.0020.0002] # EGYPTIAN HIEROGLYPH W015 +133C2 ; [.540C.0020.0002] # EGYPTIAN HIEROGLYPH W016 +133C3 ; [.540D.0020.0002] # EGYPTIAN HIEROGLYPH W017 +133C4 ; [.540E.0020.0002] # EGYPTIAN HIEROGLYPH W017A +133C5 ; [.540F.0020.0002] # EGYPTIAN HIEROGLYPH W018 +133C6 ; [.5410.0020.0002] # EGYPTIAN HIEROGLYPH W018A +133C7 ; [.5411.0020.0002] # EGYPTIAN HIEROGLYPH W019 +133C8 ; [.5412.0020.0002] # EGYPTIAN HIEROGLYPH W020 +133C9 ; [.5413.0020.0002] # EGYPTIAN HIEROGLYPH W021 +133CA ; [.5414.0020.0002] # EGYPTIAN HIEROGLYPH W022 +133CB ; [.5415.0020.0002] # EGYPTIAN HIEROGLYPH W023 +133CC ; [.5416.0020.0002] # EGYPTIAN HIEROGLYPH W024 +133CD ; [.5417.0020.0002] # EGYPTIAN HIEROGLYPH W024A +133CE ; [.5418.0020.0002] # EGYPTIAN HIEROGLYPH W025 +133CF ; [.5419.0020.0002] # EGYPTIAN HIEROGLYPH X001 +133D0 ; [.541A.0020.0002] # EGYPTIAN HIEROGLYPH X002 +133D1 ; [.541B.0020.0002] # EGYPTIAN HIEROGLYPH X003 +133D2 ; [.541C.0020.0002] # EGYPTIAN HIEROGLYPH X004 +133D3 ; [.541D.0020.0002] # EGYPTIAN HIEROGLYPH X004A +133D4 ; [.541E.0020.0002] # EGYPTIAN HIEROGLYPH X004B +133D5 ; [.541F.0020.0002] # EGYPTIAN HIEROGLYPH X005 +133D6 ; [.5420.0020.0002] # EGYPTIAN HIEROGLYPH X006 +133D7 ; [.5421.0020.0002] # EGYPTIAN HIEROGLYPH X006A +133D8 ; [.5422.0020.0002] # EGYPTIAN HIEROGLYPH X007 +133D9 ; [.5423.0020.0002] # EGYPTIAN HIEROGLYPH X008 +133DA ; [.5424.0020.0002] # EGYPTIAN HIEROGLYPH X008A +133DB ; [.5425.0020.0002] # EGYPTIAN HIEROGLYPH Y001 +133DC ; [.5426.0020.0002] # EGYPTIAN HIEROGLYPH Y001A +133DD ; [.5427.0020.0002] # EGYPTIAN HIEROGLYPH Y002 +133DE ; [.5428.0020.0002] # EGYPTIAN HIEROGLYPH Y003 +133DF ; [.5429.0020.0002] # EGYPTIAN HIEROGLYPH Y004 +133E0 ; [.542A.0020.0002] # EGYPTIAN HIEROGLYPH Y005 +133E1 ; [.542B.0020.0002] # EGYPTIAN HIEROGLYPH Y006 +133E2 ; [.542C.0020.0002] # EGYPTIAN HIEROGLYPH Y007 +133E3 ; [.542D.0020.0002] # EGYPTIAN HIEROGLYPH Y008 +133E4 ; [.542E.0020.0002] # EGYPTIAN HIEROGLYPH Z001 +133E5 ; [.542F.0020.0002] # EGYPTIAN HIEROGLYPH Z002 +133E6 ; [.5430.0020.0002] # EGYPTIAN HIEROGLYPH Z002A +133E7 ; [.5431.0020.0002] # EGYPTIAN HIEROGLYPH Z002B +133E8 ; [.5432.0020.0002] # EGYPTIAN HIEROGLYPH Z002C +133E9 ; [.5433.0020.0002] # EGYPTIAN HIEROGLYPH Z002D +133EA ; [.5434.0020.0002] # EGYPTIAN HIEROGLYPH Z003 +133EB ; [.5435.0020.0002] # EGYPTIAN HIEROGLYPH Z003A +133EC ; [.5436.0020.0002] # EGYPTIAN HIEROGLYPH Z003B +133ED ; [.5437.0020.0002] # EGYPTIAN HIEROGLYPH Z004 +133EE ; [.5438.0020.0002] # EGYPTIAN HIEROGLYPH Z004A +133EF ; [.5439.0020.0002] # EGYPTIAN HIEROGLYPH Z005 +133F0 ; [.543A.0020.0002] # EGYPTIAN HIEROGLYPH Z005A +133F1 ; [.543B.0020.0002] # EGYPTIAN HIEROGLYPH Z006 +133F2 ; [.543C.0020.0002] # EGYPTIAN HIEROGLYPH Z007 +133F3 ; [.543D.0020.0002] # EGYPTIAN HIEROGLYPH Z008 +133F4 ; [.543E.0020.0002] # EGYPTIAN HIEROGLYPH Z009 +133F5 ; [.543F.0020.0002] # EGYPTIAN HIEROGLYPH Z010 +133F6 ; [.5440.0020.0002] # EGYPTIAN HIEROGLYPH Z011 +133F7 ; [.5441.0020.0002] # EGYPTIAN HIEROGLYPH Z012 +133F8 ; [.5442.0020.0002] # EGYPTIAN HIEROGLYPH Z013 +133F9 ; [.5443.0020.0002] # EGYPTIAN HIEROGLYPH Z014 +133FA ; [.5444.0020.0002] # EGYPTIAN HIEROGLYPH Z015 +133FB ; [.5445.0020.0002] # EGYPTIAN HIEROGLYPH Z015A +133FC ; [.5446.0020.0002] # EGYPTIAN HIEROGLYPH Z015B +133FD ; [.5447.0020.0002] # EGYPTIAN HIEROGLYPH Z015C +133FE ; [.5448.0020.0002] # EGYPTIAN HIEROGLYPH Z015D +133FF ; [.5449.0020.0002] # EGYPTIAN HIEROGLYPH Z015E +13400 ; [.544A.0020.0002] # EGYPTIAN HIEROGLYPH Z015F +13401 ; [.544B.0020.0002] # EGYPTIAN HIEROGLYPH Z015G +13402 ; [.544C.0020.0002] # EGYPTIAN HIEROGLYPH Z015H +13403 ; [.544D.0020.0002] # EGYPTIAN HIEROGLYPH Z015I +13404 ; [.544E.0020.0002] # EGYPTIAN HIEROGLYPH Z016 +13405 ; [.544F.0020.0002] # EGYPTIAN HIEROGLYPH Z016A +13406 ; [.5450.0020.0002] # EGYPTIAN HIEROGLYPH Z016B +13407 ; [.5451.0020.0002] # EGYPTIAN HIEROGLYPH Z016C +13408 ; [.5452.0020.0002] # EGYPTIAN HIEROGLYPH Z016D +13409 ; [.5453.0020.0002] # EGYPTIAN HIEROGLYPH Z016E +1340A ; [.5454.0020.0002] # EGYPTIAN HIEROGLYPH Z016F +1340B ; [.5455.0020.0002] # EGYPTIAN HIEROGLYPH Z016G +1340C ; [.5456.0020.0002] # EGYPTIAN HIEROGLYPH Z016H +1340D ; [.5457.0020.0002] # EGYPTIAN HIEROGLYPH AA001 +1340E ; [.5458.0020.0002] # EGYPTIAN HIEROGLYPH AA002 +1340F ; [.5459.0020.0002] # EGYPTIAN HIEROGLYPH AA003 +13410 ; [.545A.0020.0002] # EGYPTIAN HIEROGLYPH AA004 +13411 ; [.545B.0020.0002] # EGYPTIAN HIEROGLYPH AA005 +13412 ; [.545C.0020.0002] # EGYPTIAN HIEROGLYPH AA006 +13413 ; [.545D.0020.0002] # EGYPTIAN HIEROGLYPH AA007 +13414 ; [.545E.0020.0002] # EGYPTIAN HIEROGLYPH AA007A +13415 ; [.545F.0020.0002] # EGYPTIAN HIEROGLYPH AA007B +13416 ; [.5460.0020.0002] # EGYPTIAN HIEROGLYPH AA008 +13417 ; [.5461.0020.0002] # EGYPTIAN HIEROGLYPH AA009 +13418 ; [.5462.0020.0002] # EGYPTIAN HIEROGLYPH AA010 +13419 ; [.5463.0020.0002] # EGYPTIAN HIEROGLYPH AA011 +1341A ; [.5464.0020.0002] # EGYPTIAN HIEROGLYPH AA012 +1341B ; [.5465.0020.0002] # EGYPTIAN HIEROGLYPH AA013 +1341C ; [.5466.0020.0002] # EGYPTIAN HIEROGLYPH AA014 +1341D ; [.5467.0020.0002] # EGYPTIAN HIEROGLYPH AA015 +1341E ; [.5468.0020.0002] # EGYPTIAN HIEROGLYPH AA016 +1341F ; [.5469.0020.0002] # EGYPTIAN HIEROGLYPH AA017 +13420 ; [.546A.0020.0002] # EGYPTIAN HIEROGLYPH AA018 +13421 ; [.546B.0020.0002] # EGYPTIAN HIEROGLYPH AA019 +13422 ; [.546C.0020.0002] # EGYPTIAN HIEROGLYPH AA020 +13423 ; [.546D.0020.0002] # EGYPTIAN HIEROGLYPH AA021 +13424 ; [.546E.0020.0002] # EGYPTIAN HIEROGLYPH AA022 +13425 ; [.546F.0020.0002] # EGYPTIAN HIEROGLYPH AA023 +13426 ; [.5470.0020.0002] # EGYPTIAN HIEROGLYPH AA024 +13427 ; [.5471.0020.0002] # EGYPTIAN HIEROGLYPH AA025 +13428 ; [.5472.0020.0002] # EGYPTIAN HIEROGLYPH AA026 +13429 ; [.5473.0020.0002] # EGYPTIAN HIEROGLYPH AA027 +1342A ; [.5474.0020.0002] # EGYPTIAN HIEROGLYPH AA028 +1342B ; [.5475.0020.0002] # EGYPTIAN HIEROGLYPH AA029 +1342C ; [.5476.0020.0002] # EGYPTIAN HIEROGLYPH AA030 +1342D ; [.5477.0020.0002] # EGYPTIAN HIEROGLYPH AA031 +1342E ; [.5478.0020.0002] # EGYPTIAN HIEROGLYPH AA032 +109A0 ; [.5479.0020.0002] # MEROITIC CURSIVE LETTER A +10980 ; [.5479.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER A +109A1 ; [.547A.0020.0002] # MEROITIC CURSIVE LETTER E +10981 ; [.547A.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER E +109A2 ; [.547B.0020.0002] # MEROITIC CURSIVE LETTER I +10982 ; [.547B.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER I +109A3 ; [.547C.0020.0002] # MEROITIC CURSIVE LETTER O +10983 ; [.547C.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER O +109A4 ; [.547D.0020.0002] # MEROITIC CURSIVE LETTER YA +10984 ; [.547D.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER YA +109A5 ; [.547E.0020.0002] # MEROITIC CURSIVE LETTER WA +10985 ; [.547E.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER WA +109A6 ; [.547F.0020.0002] # MEROITIC CURSIVE LETTER BA +10986 ; [.547F.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER BA +10987 ; [.547F.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER BA-2 +109A7 ; [.5480.0020.0002] # MEROITIC CURSIVE LETTER PA +10988 ; [.5480.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER PA +109A8 ; [.5481.0020.0002] # MEROITIC CURSIVE LETTER MA +10989 ; [.5481.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER MA +109A9 ; [.5482.0020.0002] # MEROITIC CURSIVE LETTER NA +1098A ; [.5482.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER NA +1098B ; [.5482.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER NA-2 +109AA ; [.5483.0020.0002] # MEROITIC CURSIVE LETTER NE +1098C ; [.5483.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER NE +1098D ; [.5483.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER NE-2 +109AB ; [.5484.0020.0002] # MEROITIC CURSIVE LETTER RA +1098E ; [.5484.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER RA +1098F ; [.5484.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER RA-2 +109AC ; [.5485.0020.0002] # MEROITIC CURSIVE LETTER LA +10990 ; [.5485.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER LA +109AD ; [.5486.0020.0002] # MEROITIC CURSIVE LETTER KHA +10991 ; [.5486.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER KHA +109AE ; [.5487.0020.0002] # MEROITIC CURSIVE LETTER HHA +10992 ; [.5487.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER HHA +109AF ; [.5488.0020.0002] # MEROITIC CURSIVE LETTER SA +109B0 ; [.5488.0020.0004][.0000.0111.0004] # MEROITIC CURSIVE LETTER ARCHAIC SA +10993 ; [.5488.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER SA +10994 ; [.5488.0020.0004][.0000.0113.0004] # MEROITIC HIEROGLYPHIC LETTER SA-2 +109B1 ; [.5489.0020.0002] # MEROITIC CURSIVE LETTER SE +10995 ; [.5489.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER SE +109B2 ; [.548A.0020.0002] # MEROITIC CURSIVE LETTER KA +10996 ; [.548A.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER KA +109B3 ; [.548B.0020.0002] # MEROITIC CURSIVE LETTER QA +10997 ; [.548B.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER QA +109B4 ; [.548C.0020.0002] # MEROITIC CURSIVE LETTER TA +10998 ; [.548C.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER TA +10999 ; [.548C.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER TA-2 +109B5 ; [.548D.0020.0002] # MEROITIC CURSIVE LETTER TE +1099A ; [.548D.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER TE +1099B ; [.548D.0020.0004][.0000.0112.0004] # MEROITIC HIEROGLYPHIC LETTER TE-2 +109B6 ; [.548E.0020.0002] # MEROITIC CURSIVE LETTER TO +1099C ; [.548E.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER TO +109B7 ; [.548F.0020.0002] # MEROITIC CURSIVE LETTER DA +1099D ; [.548F.0020.0004][.0000.0111.0004] # MEROITIC HIEROGLYPHIC LETTER DA +109BE ; [.5490.0020.0002] # MEROITIC CURSIVE LOGOGRAM RMT +109BF ; [.5491.0020.0002] # MEROITIC CURSIVE LOGOGRAM IMN +1099E ; [.5492.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ +1099F ; [.5493.0020.0002] # MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +14400 ; [.5494.0020.0002] # ANATOLIAN HIEROGLYPH A001 +14401 ; [.5495.0020.0002] # ANATOLIAN HIEROGLYPH A002 +14402 ; [.5496.0020.0002] # ANATOLIAN HIEROGLYPH A003 +14403 ; [.5497.0020.0002] # ANATOLIAN HIEROGLYPH A004 +14404 ; [.5498.0020.0002] # ANATOLIAN HIEROGLYPH A005 +14405 ; [.5499.0020.0002] # ANATOLIAN HIEROGLYPH A006 +14406 ; [.549A.0020.0002] # ANATOLIAN HIEROGLYPH A007 +14407 ; [.549B.0020.0002] # ANATOLIAN HIEROGLYPH A008 +14408 ; [.549C.0020.0002] # ANATOLIAN HIEROGLYPH A009 +14409 ; [.549D.0020.0002] # ANATOLIAN HIEROGLYPH A010 +1440A ; [.549E.0020.0002] # ANATOLIAN HIEROGLYPH A010A +1440B ; [.549F.0020.0002] # ANATOLIAN HIEROGLYPH A011 +1440C ; [.54A0.0020.0002] # ANATOLIAN HIEROGLYPH A012 +1440D ; [.54A1.0020.0002] # ANATOLIAN HIEROGLYPH A013 +1440E ; [.54A2.0020.0002] # ANATOLIAN HIEROGLYPH A014 +1440F ; [.54A3.0020.0002] # ANATOLIAN HIEROGLYPH A015 +14410 ; [.54A4.0020.0002] # ANATOLIAN HIEROGLYPH A016 +14411 ; [.54A5.0020.0002] # ANATOLIAN HIEROGLYPH A017 +14412 ; [.54A6.0020.0002] # ANATOLIAN HIEROGLYPH A018 +14413 ; [.54A7.0020.0002] # ANATOLIAN HIEROGLYPH A019 +14414 ; [.54A8.0020.0002] # ANATOLIAN HIEROGLYPH A020 +14415 ; [.54A9.0020.0002] # ANATOLIAN HIEROGLYPH A021 +14416 ; [.54AA.0020.0002] # ANATOLIAN HIEROGLYPH A022 +14417 ; [.54AB.0020.0002] # ANATOLIAN HIEROGLYPH A023 +14418 ; [.54AC.0020.0002] # ANATOLIAN HIEROGLYPH A024 +14419 ; [.54AD.0020.0002] # ANATOLIAN HIEROGLYPH A025 +1441A ; [.54AE.0020.0002] # ANATOLIAN HIEROGLYPH A026 +1441B ; [.54AF.0020.0002] # ANATOLIAN HIEROGLYPH A026A +1441C ; [.54B0.0020.0002] # ANATOLIAN HIEROGLYPH A027 +1441D ; [.54B1.0020.0002] # ANATOLIAN HIEROGLYPH A028 +1441E ; [.54B2.0020.0002] # ANATOLIAN HIEROGLYPH A029 +1441F ; [.54B3.0020.0002] # ANATOLIAN HIEROGLYPH A030 +14420 ; [.54B4.0020.0002] # ANATOLIAN HIEROGLYPH A031 +14421 ; [.54B5.0020.0002] # ANATOLIAN HIEROGLYPH A032 +14422 ; [.54B6.0020.0002] # ANATOLIAN HIEROGLYPH A033 +14423 ; [.54B7.0020.0002] # ANATOLIAN HIEROGLYPH A034 +14424 ; [.54B8.0020.0002] # ANATOLIAN HIEROGLYPH A035 +14425 ; [.54B9.0020.0002] # ANATOLIAN HIEROGLYPH A036 +14426 ; [.54BA.0020.0002] # ANATOLIAN HIEROGLYPH A037 +14427 ; [.54BB.0020.0002] # ANATOLIAN HIEROGLYPH A038 +14428 ; [.54BC.0020.0002] # ANATOLIAN HIEROGLYPH A039 +14429 ; [.54BD.0020.0002] # ANATOLIAN HIEROGLYPH A039A +1442A ; [.54BE.0020.0002] # ANATOLIAN HIEROGLYPH A040 +1442B ; [.54BF.0020.0002] # ANATOLIAN HIEROGLYPH A041 +1442C ; [.54C0.0020.0002] # ANATOLIAN HIEROGLYPH A041A +1442D ; [.54C1.0020.0002] # ANATOLIAN HIEROGLYPH A042 +1442E ; [.54C2.0020.0002] # ANATOLIAN HIEROGLYPH A043 +1442F ; [.54C3.0020.0002] # ANATOLIAN HIEROGLYPH A044 +14430 ; [.54C4.0020.0002] # ANATOLIAN HIEROGLYPH A045 +14431 ; [.54C5.0020.0002] # ANATOLIAN HIEROGLYPH A045A +14432 ; [.54C6.0020.0002] # ANATOLIAN HIEROGLYPH A046 +14433 ; [.54C7.0020.0002] # ANATOLIAN HIEROGLYPH A046A +14434 ; [.54C8.0020.0002] # ANATOLIAN HIEROGLYPH A046B +14435 ; [.54C9.0020.0002] # ANATOLIAN HIEROGLYPH A047 +14436 ; [.54CA.0020.0002] # ANATOLIAN HIEROGLYPH A048 +14437 ; [.54CB.0020.0002] # ANATOLIAN HIEROGLYPH A049 +14438 ; [.54CC.0020.0002] # ANATOLIAN HIEROGLYPH A050 +14439 ; [.54CD.0020.0002] # ANATOLIAN HIEROGLYPH A051 +1443A ; [.54CE.0020.0002] # ANATOLIAN HIEROGLYPH A052 +1443B ; [.54CF.0020.0002] # ANATOLIAN HIEROGLYPH A053 +1443C ; [.54D0.0020.0002] # ANATOLIAN HIEROGLYPH A054 +1443D ; [.54D1.0020.0002] # ANATOLIAN HIEROGLYPH A055 +1443E ; [.54D2.0020.0002] # ANATOLIAN HIEROGLYPH A056 +1443F ; [.54D3.0020.0002] # ANATOLIAN HIEROGLYPH A057 +14440 ; [.54D4.0020.0002] # ANATOLIAN HIEROGLYPH A058 +14441 ; [.54D5.0020.0002] # ANATOLIAN HIEROGLYPH A059 +14442 ; [.54D6.0020.0002] # ANATOLIAN HIEROGLYPH A060 +14443 ; [.54D7.0020.0002] # ANATOLIAN HIEROGLYPH A061 +14444 ; [.54D8.0020.0002] # ANATOLIAN HIEROGLYPH A062 +14445 ; [.54D9.0020.0002] # ANATOLIAN HIEROGLYPH A063 +14446 ; [.54DA.0020.0002] # ANATOLIAN HIEROGLYPH A064 +14447 ; [.54DB.0020.0002] # ANATOLIAN HIEROGLYPH A065 +14448 ; [.54DC.0020.0002] # ANATOLIAN HIEROGLYPH A066 +14449 ; [.54DD.0020.0002] # ANATOLIAN HIEROGLYPH A066A +1444A ; [.54DE.0020.0002] # ANATOLIAN HIEROGLYPH A066B +1444B ; [.54DF.0020.0002] # ANATOLIAN HIEROGLYPH A066C +1444C ; [.54E0.0020.0002] # ANATOLIAN HIEROGLYPH A067 +1444D ; [.54E1.0020.0002] # ANATOLIAN HIEROGLYPH A068 +1444E ; [.54E2.0020.0002] # ANATOLIAN HIEROGLYPH A069 +1444F ; [.54E3.0020.0002] # ANATOLIAN HIEROGLYPH A070 +14450 ; [.54E4.0020.0002] # ANATOLIAN HIEROGLYPH A071 +14451 ; [.54E5.0020.0002] # ANATOLIAN HIEROGLYPH A072 +14452 ; [.54E6.0020.0002] # ANATOLIAN HIEROGLYPH A073 +14453 ; [.54E7.0020.0002] # ANATOLIAN HIEROGLYPH A074 +14454 ; [.54E8.0020.0002] # ANATOLIAN HIEROGLYPH A075 +14455 ; [.54E9.0020.0002] # ANATOLIAN HIEROGLYPH A076 +14456 ; [.54EA.0020.0002] # ANATOLIAN HIEROGLYPH A077 +14457 ; [.54EB.0020.0002] # ANATOLIAN HIEROGLYPH A078 +14458 ; [.54EC.0020.0002] # ANATOLIAN HIEROGLYPH A079 +14459 ; [.54ED.0020.0002] # ANATOLIAN HIEROGLYPH A080 +1445A ; [.54EE.0020.0002] # ANATOLIAN HIEROGLYPH A081 +1445B ; [.54EF.0020.0002] # ANATOLIAN HIEROGLYPH A082 +1445C ; [.54F0.0020.0002] # ANATOLIAN HIEROGLYPH A083 +1445D ; [.54F1.0020.0002] # ANATOLIAN HIEROGLYPH A084 +1445E ; [.54F2.0020.0002] # ANATOLIAN HIEROGLYPH A085 +1445F ; [.54F3.0020.0002] # ANATOLIAN HIEROGLYPH A086 +14460 ; [.54F4.0020.0002] # ANATOLIAN HIEROGLYPH A087 +14461 ; [.54F5.0020.0002] # ANATOLIAN HIEROGLYPH A088 +14462 ; [.54F6.0020.0002] # ANATOLIAN HIEROGLYPH A089 +14463 ; [.54F7.0020.0002] # ANATOLIAN HIEROGLYPH A090 +14464 ; [.54F8.0020.0002] # ANATOLIAN HIEROGLYPH A091 +14465 ; [.54F9.0020.0002] # ANATOLIAN HIEROGLYPH A092 +14466 ; [.54FA.0020.0002] # ANATOLIAN HIEROGLYPH A093 +14467 ; [.54FB.0020.0002] # ANATOLIAN HIEROGLYPH A094 +14468 ; [.54FC.0020.0002] # ANATOLIAN HIEROGLYPH A095 +14469 ; [.54FD.0020.0002] # ANATOLIAN HIEROGLYPH A096 +1446A ; [.54FE.0020.0002] # ANATOLIAN HIEROGLYPH A097 +1446B ; [.54FF.0020.0002] # ANATOLIAN HIEROGLYPH A097A +1446C ; [.5500.0020.0002] # ANATOLIAN HIEROGLYPH A098 +1446D ; [.5501.0020.0002] # ANATOLIAN HIEROGLYPH A098A +1446E ; [.5502.0020.0002] # ANATOLIAN HIEROGLYPH A099 +1446F ; [.5503.0020.0002] # ANATOLIAN HIEROGLYPH A100 +14470 ; [.5504.0020.0002] # ANATOLIAN HIEROGLYPH A100A +14471 ; [.5505.0020.0002] # ANATOLIAN HIEROGLYPH A101 +14472 ; [.5506.0020.0002] # ANATOLIAN HIEROGLYPH A101A +14473 ; [.5507.0020.0002] # ANATOLIAN HIEROGLYPH A102 +14474 ; [.5508.0020.0002] # ANATOLIAN HIEROGLYPH A102A +14475 ; [.5509.0020.0002] # ANATOLIAN HIEROGLYPH A103 +14476 ; [.550A.0020.0002] # ANATOLIAN HIEROGLYPH A104 +14477 ; [.550B.0020.0002] # ANATOLIAN HIEROGLYPH A104A +14478 ; [.550C.0020.0002] # ANATOLIAN HIEROGLYPH A104B +14479 ; [.550D.0020.0002] # ANATOLIAN HIEROGLYPH A104C +1447A ; [.550E.0020.0002] # ANATOLIAN HIEROGLYPH A105 +1447B ; [.550F.0020.0002] # ANATOLIAN HIEROGLYPH A105A +1447C ; [.5510.0020.0002] # ANATOLIAN HIEROGLYPH A105B +1447D ; [.5511.0020.0002] # ANATOLIAN HIEROGLYPH A106 +1447E ; [.5512.0020.0002] # ANATOLIAN HIEROGLYPH A107 +1447F ; [.5513.0020.0002] # ANATOLIAN HIEROGLYPH A107A +14480 ; [.5514.0020.0002] # ANATOLIAN HIEROGLYPH A107B +14481 ; [.5515.0020.0002] # ANATOLIAN HIEROGLYPH A107C +14482 ; [.5516.0020.0002] # ANATOLIAN HIEROGLYPH A108 +14483 ; [.5517.0020.0002] # ANATOLIAN HIEROGLYPH A109 +14484 ; [.5518.0020.0002] # ANATOLIAN HIEROGLYPH A110 +14485 ; [.5519.0020.0002] # ANATOLIAN HIEROGLYPH A110A +14486 ; [.551A.0020.0002] # ANATOLIAN HIEROGLYPH A110B +14487 ; [.551B.0020.0002] # ANATOLIAN HIEROGLYPH A111 +14488 ; [.551C.0020.0002] # ANATOLIAN HIEROGLYPH A112 +14489 ; [.551D.0020.0002] # ANATOLIAN HIEROGLYPH A113 +1448A ; [.551E.0020.0002] # ANATOLIAN HIEROGLYPH A114 +1448B ; [.551F.0020.0002] # ANATOLIAN HIEROGLYPH A115 +1448C ; [.5520.0020.0002] # ANATOLIAN HIEROGLYPH A115A +1448D ; [.5521.0020.0002] # ANATOLIAN HIEROGLYPH A116 +1448E ; [.5522.0020.0002] # ANATOLIAN HIEROGLYPH A117 +1448F ; [.5523.0020.0002] # ANATOLIAN HIEROGLYPH A118 +14490 ; [.5524.0020.0002] # ANATOLIAN HIEROGLYPH A119 +14491 ; [.5525.0020.0002] # ANATOLIAN HIEROGLYPH A120 +14492 ; [.5526.0020.0002] # ANATOLIAN HIEROGLYPH A121 +14493 ; [.5527.0020.0002] # ANATOLIAN HIEROGLYPH A122 +14494 ; [.5528.0020.0002] # ANATOLIAN HIEROGLYPH A123 +14495 ; [.5529.0020.0002] # ANATOLIAN HIEROGLYPH A124 +14496 ; [.552A.0020.0002] # ANATOLIAN HIEROGLYPH A125 +14497 ; [.552B.0020.0002] # ANATOLIAN HIEROGLYPH A125A +14498 ; [.552C.0020.0002] # ANATOLIAN HIEROGLYPH A126 +14499 ; [.552D.0020.0002] # ANATOLIAN HIEROGLYPH A127 +1449A ; [.552E.0020.0002] # ANATOLIAN HIEROGLYPH A128 +1449B ; [.552F.0020.0002] # ANATOLIAN HIEROGLYPH A129 +1449C ; [.5530.0020.0002] # ANATOLIAN HIEROGLYPH A130 +1449D ; [.5531.0020.0002] # ANATOLIAN HIEROGLYPH A131 +1449E ; [.5532.0020.0002] # ANATOLIAN HIEROGLYPH A132 +1449F ; [.5533.0020.0002] # ANATOLIAN HIEROGLYPH A133 +144A0 ; [.5534.0020.0002] # ANATOLIAN HIEROGLYPH A134 +144A1 ; [.5535.0020.0002] # ANATOLIAN HIEROGLYPH A135 +144A2 ; [.5536.0020.0002] # ANATOLIAN HIEROGLYPH A135A +144A3 ; [.5537.0020.0002] # ANATOLIAN HIEROGLYPH A136 +144A4 ; [.5538.0020.0002] # ANATOLIAN HIEROGLYPH A137 +144A5 ; [.5539.0020.0002] # ANATOLIAN HIEROGLYPH A138 +144A6 ; [.553A.0020.0002] # ANATOLIAN HIEROGLYPH A139 +144A7 ; [.553B.0020.0002] # ANATOLIAN HIEROGLYPH A140 +144A8 ; [.553C.0020.0002] # ANATOLIAN HIEROGLYPH A141 +144A9 ; [.553D.0020.0002] # ANATOLIAN HIEROGLYPH A142 +144AA ; [.553E.0020.0002] # ANATOLIAN HIEROGLYPH A143 +144AB ; [.553F.0020.0002] # ANATOLIAN HIEROGLYPH A144 +144AC ; [.5540.0020.0002] # ANATOLIAN HIEROGLYPH A145 +144AD ; [.5541.0020.0002] # ANATOLIAN HIEROGLYPH A146 +144AE ; [.5542.0020.0002] # ANATOLIAN HIEROGLYPH A147 +144AF ; [.5543.0020.0002] # ANATOLIAN HIEROGLYPH A148 +144B0 ; [.5544.0020.0002] # ANATOLIAN HIEROGLYPH A149 +144B1 ; [.5545.0020.0002] # ANATOLIAN HIEROGLYPH A150 +144B2 ; [.5546.0020.0002] # ANATOLIAN HIEROGLYPH A151 +144B3 ; [.5547.0020.0002] # ANATOLIAN HIEROGLYPH A152 +144B4 ; [.5548.0020.0002] # ANATOLIAN HIEROGLYPH A153 +144B5 ; [.5549.0020.0002] # ANATOLIAN HIEROGLYPH A154 +144B6 ; [.554A.0020.0002] # ANATOLIAN HIEROGLYPH A155 +144B7 ; [.554B.0020.0002] # ANATOLIAN HIEROGLYPH A156 +144B8 ; [.554C.0020.0002] # ANATOLIAN HIEROGLYPH A157 +144B9 ; [.554D.0020.0002] # ANATOLIAN HIEROGLYPH A158 +144BA ; [.554E.0020.0002] # ANATOLIAN HIEROGLYPH A159 +144BB ; [.554F.0020.0002] # ANATOLIAN HIEROGLYPH A160 +144BC ; [.5550.0020.0002] # ANATOLIAN HIEROGLYPH A161 +144BD ; [.5551.0020.0002] # ANATOLIAN HIEROGLYPH A162 +144BE ; [.5552.0020.0002] # ANATOLIAN HIEROGLYPH A163 +144BF ; [.5553.0020.0002] # ANATOLIAN HIEROGLYPH A164 +144C0 ; [.5554.0020.0002] # ANATOLIAN HIEROGLYPH A165 +144C1 ; [.5555.0020.0002] # ANATOLIAN HIEROGLYPH A166 +144C2 ; [.5556.0020.0002] # ANATOLIAN HIEROGLYPH A167 +144C3 ; [.5557.0020.0002] # ANATOLIAN HIEROGLYPH A168 +144C4 ; [.5558.0020.0002] # ANATOLIAN HIEROGLYPH A169 +144C5 ; [.5559.0020.0002] # ANATOLIAN HIEROGLYPH A170 +144C6 ; [.555A.0020.0002] # ANATOLIAN HIEROGLYPH A171 +144C7 ; [.555B.0020.0002] # ANATOLIAN HIEROGLYPH A172 +144C8 ; [.555C.0020.0002] # ANATOLIAN HIEROGLYPH A173 +144C9 ; [.555D.0020.0002] # ANATOLIAN HIEROGLYPH A174 +144CA ; [.555E.0020.0002] # ANATOLIAN HIEROGLYPH A175 +144CB ; [.555F.0020.0002] # ANATOLIAN HIEROGLYPH A176 +144CC ; [.5560.0020.0002] # ANATOLIAN HIEROGLYPH A177 +144CD ; [.5561.0020.0002] # ANATOLIAN HIEROGLYPH A178 +144CE ; [.5562.0020.0002] # ANATOLIAN HIEROGLYPH A179 +144CF ; [.5563.0020.0002] # ANATOLIAN HIEROGLYPH A180 +144D0 ; [.5564.0020.0002] # ANATOLIAN HIEROGLYPH A181 +144D1 ; [.5565.0020.0002] # ANATOLIAN HIEROGLYPH A182 +144D2 ; [.5566.0020.0002] # ANATOLIAN HIEROGLYPH A183 +144D3 ; [.5567.0020.0002] # ANATOLIAN HIEROGLYPH A184 +144D4 ; [.5568.0020.0002] # ANATOLIAN HIEROGLYPH A185 +144D5 ; [.5569.0020.0002] # ANATOLIAN HIEROGLYPH A186 +144D6 ; [.556A.0020.0002] # ANATOLIAN HIEROGLYPH A187 +144D7 ; [.556B.0020.0002] # ANATOLIAN HIEROGLYPH A188 +144D8 ; [.556C.0020.0002] # ANATOLIAN HIEROGLYPH A189 +144D9 ; [.556D.0020.0002] # ANATOLIAN HIEROGLYPH A190 +144DA ; [.556E.0020.0002] # ANATOLIAN HIEROGLYPH A191 +144DB ; [.556F.0020.0002] # ANATOLIAN HIEROGLYPH A192 +144DC ; [.5570.0020.0002] # ANATOLIAN HIEROGLYPH A193 +144DD ; [.5571.0020.0002] # ANATOLIAN HIEROGLYPH A194 +144DE ; [.5572.0020.0002] # ANATOLIAN HIEROGLYPH A195 +144DF ; [.5573.0020.0002] # ANATOLIAN HIEROGLYPH A196 +144E0 ; [.5574.0020.0002] # ANATOLIAN HIEROGLYPH A197 +144E1 ; [.5575.0020.0002] # ANATOLIAN HIEROGLYPH A198 +144E2 ; [.5576.0020.0002] # ANATOLIAN HIEROGLYPH A199 +144E3 ; [.5577.0020.0002] # ANATOLIAN HIEROGLYPH A200 +144E4 ; [.5578.0020.0002] # ANATOLIAN HIEROGLYPH A201 +144E5 ; [.5579.0020.0002] # ANATOLIAN HIEROGLYPH A202 +144E6 ; [.557A.0020.0002] # ANATOLIAN HIEROGLYPH A202A +144E7 ; [.557B.0020.0002] # ANATOLIAN HIEROGLYPH A202B +144E8 ; [.557C.0020.0002] # ANATOLIAN HIEROGLYPH A203 +144E9 ; [.557D.0020.0002] # ANATOLIAN HIEROGLYPH A204 +144EA ; [.557E.0020.0002] # ANATOLIAN HIEROGLYPH A205 +144EB ; [.557F.0020.0002] # ANATOLIAN HIEROGLYPH A206 +144EC ; [.5580.0020.0002] # ANATOLIAN HIEROGLYPH A207 +144ED ; [.5581.0020.0002] # ANATOLIAN HIEROGLYPH A207A +144EE ; [.5582.0020.0002] # ANATOLIAN HIEROGLYPH A208 +144EF ; [.5583.0020.0002] # ANATOLIAN HIEROGLYPH A209 +144F0 ; [.5584.0020.0002] # ANATOLIAN HIEROGLYPH A209A +144F1 ; [.5585.0020.0002] # ANATOLIAN HIEROGLYPH A210 +144F2 ; [.5586.0020.0002] # ANATOLIAN HIEROGLYPH A211 +144F3 ; [.5587.0020.0002] # ANATOLIAN HIEROGLYPH A212 +144F4 ; [.5588.0020.0002] # ANATOLIAN HIEROGLYPH A213 +144F5 ; [.5589.0020.0002] # ANATOLIAN HIEROGLYPH A214 +144F6 ; [.558A.0020.0002] # ANATOLIAN HIEROGLYPH A215 +144F7 ; [.558B.0020.0002] # ANATOLIAN HIEROGLYPH A215A +144F8 ; [.558C.0020.0002] # ANATOLIAN HIEROGLYPH A216 +144F9 ; [.558D.0020.0002] # ANATOLIAN HIEROGLYPH A216A +144FA ; [.558E.0020.0002] # ANATOLIAN HIEROGLYPH A217 +144FB ; [.558F.0020.0002] # ANATOLIAN HIEROGLYPH A218 +144FC ; [.5590.0020.0002] # ANATOLIAN HIEROGLYPH A219 +144FD ; [.5591.0020.0002] # ANATOLIAN HIEROGLYPH A220 +144FE ; [.5592.0020.0002] # ANATOLIAN HIEROGLYPH A221 +144FF ; [.5593.0020.0002] # ANATOLIAN HIEROGLYPH A222 +14500 ; [.5594.0020.0002] # ANATOLIAN HIEROGLYPH A223 +14501 ; [.5595.0020.0002] # ANATOLIAN HIEROGLYPH A224 +14502 ; [.5596.0020.0002] # ANATOLIAN HIEROGLYPH A225 +14503 ; [.5597.0020.0002] # ANATOLIAN HIEROGLYPH A226 +14504 ; [.5598.0020.0002] # ANATOLIAN HIEROGLYPH A227 +14505 ; [.5599.0020.0002] # ANATOLIAN HIEROGLYPH A227A +14506 ; [.559A.0020.0002] # ANATOLIAN HIEROGLYPH A228 +14507 ; [.559B.0020.0002] # ANATOLIAN HIEROGLYPH A229 +14508 ; [.559C.0020.0002] # ANATOLIAN HIEROGLYPH A230 +14509 ; [.559D.0020.0002] # ANATOLIAN HIEROGLYPH A231 +1450A ; [.559E.0020.0002] # ANATOLIAN HIEROGLYPH A232 +1450B ; [.559F.0020.0002] # ANATOLIAN HIEROGLYPH A233 +1450C ; [.55A0.0020.0002] # ANATOLIAN HIEROGLYPH A234 +1450D ; [.55A1.0020.0002] # ANATOLIAN HIEROGLYPH A235 +1450E ; [.55A2.0020.0002] # ANATOLIAN HIEROGLYPH A236 +1450F ; [.55A3.0020.0002] # ANATOLIAN HIEROGLYPH A237 +14510 ; [.55A4.0020.0002] # ANATOLIAN HIEROGLYPH A238 +14511 ; [.55A5.0020.0002] # ANATOLIAN HIEROGLYPH A239 +14512 ; [.55A6.0020.0002] # ANATOLIAN HIEROGLYPH A240 +14513 ; [.55A7.0020.0002] # ANATOLIAN HIEROGLYPH A241 +14514 ; [.55A8.0020.0002] # ANATOLIAN HIEROGLYPH A242 +14515 ; [.55A9.0020.0002] # ANATOLIAN HIEROGLYPH A243 +14516 ; [.55AA.0020.0002] # ANATOLIAN HIEROGLYPH A244 +14517 ; [.55AB.0020.0002] # ANATOLIAN HIEROGLYPH A245 +14518 ; [.55AC.0020.0002] # ANATOLIAN HIEROGLYPH A246 +14519 ; [.55AD.0020.0002] # ANATOLIAN HIEROGLYPH A247 +1451A ; [.55AE.0020.0002] # ANATOLIAN HIEROGLYPH A248 +1451B ; [.55AF.0020.0002] # ANATOLIAN HIEROGLYPH A249 +1451C ; [.55B0.0020.0002] # ANATOLIAN HIEROGLYPH A250 +1451D ; [.55B1.0020.0002] # ANATOLIAN HIEROGLYPH A251 +1451E ; [.55B2.0020.0002] # ANATOLIAN HIEROGLYPH A252 +1451F ; [.55B3.0020.0002] # ANATOLIAN HIEROGLYPH A253 +14520 ; [.55B4.0020.0002] # ANATOLIAN HIEROGLYPH A254 +14521 ; [.55B5.0020.0002] # ANATOLIAN HIEROGLYPH A255 +14522 ; [.55B6.0020.0002] # ANATOLIAN HIEROGLYPH A256 +14523 ; [.55B7.0020.0002] # ANATOLIAN HIEROGLYPH A257 +14524 ; [.55B8.0020.0002] # ANATOLIAN HIEROGLYPH A258 +14525 ; [.55B9.0020.0002] # ANATOLIAN HIEROGLYPH A259 +14526 ; [.55BA.0020.0002] # ANATOLIAN HIEROGLYPH A260 +14527 ; [.55BB.0020.0002] # ANATOLIAN HIEROGLYPH A261 +14528 ; [.55BC.0020.0002] # ANATOLIAN HIEROGLYPH A262 +14529 ; [.55BD.0020.0002] # ANATOLIAN HIEROGLYPH A263 +1452A ; [.55BE.0020.0002] # ANATOLIAN HIEROGLYPH A264 +1452B ; [.55BF.0020.0002] # ANATOLIAN HIEROGLYPH A265 +1452C ; [.55C0.0020.0002] # ANATOLIAN HIEROGLYPH A266 +1452D ; [.55C1.0020.0002] # ANATOLIAN HIEROGLYPH A267 +1452E ; [.55C2.0020.0002] # ANATOLIAN HIEROGLYPH A267A +1452F ; [.55C3.0020.0002] # ANATOLIAN HIEROGLYPH A268 +14530 ; [.55C4.0020.0002] # ANATOLIAN HIEROGLYPH A269 +14531 ; [.55C5.0020.0002] # ANATOLIAN HIEROGLYPH A270 +14532 ; [.55C6.0020.0002] # ANATOLIAN HIEROGLYPH A271 +14533 ; [.55C7.0020.0002] # ANATOLIAN HIEROGLYPH A272 +14534 ; [.55C8.0020.0002] # ANATOLIAN HIEROGLYPH A273 +14535 ; [.55C9.0020.0002] # ANATOLIAN HIEROGLYPH A274 +14536 ; [.55CA.0020.0002] # ANATOLIAN HIEROGLYPH A275 +14537 ; [.55CB.0020.0002] # ANATOLIAN HIEROGLYPH A276 +14538 ; [.55CC.0020.0002] # ANATOLIAN HIEROGLYPH A277 +14539 ; [.55CD.0020.0002] # ANATOLIAN HIEROGLYPH A278 +1453A ; [.55CE.0020.0002] # ANATOLIAN HIEROGLYPH A279 +1453B ; [.55CF.0020.0002] # ANATOLIAN HIEROGLYPH A280 +1453C ; [.55D0.0020.0002] # ANATOLIAN HIEROGLYPH A281 +1453D ; [.55D1.0020.0002] # ANATOLIAN HIEROGLYPH A282 +1453E ; [.55D2.0020.0002] # ANATOLIAN HIEROGLYPH A283 +1453F ; [.55D3.0020.0002] # ANATOLIAN HIEROGLYPH A284 +14540 ; [.55D4.0020.0002] # ANATOLIAN HIEROGLYPH A285 +14541 ; [.55D5.0020.0002] # ANATOLIAN HIEROGLYPH A286 +14542 ; [.55D6.0020.0002] # ANATOLIAN HIEROGLYPH A287 +14543 ; [.55D7.0020.0002] # ANATOLIAN HIEROGLYPH A288 +14544 ; [.55D8.0020.0002] # ANATOLIAN HIEROGLYPH A289 +14545 ; [.55D9.0020.0002] # ANATOLIAN HIEROGLYPH A289A +14546 ; [.55DA.0020.0002] # ANATOLIAN HIEROGLYPH A290 +14547 ; [.55DB.0020.0002] # ANATOLIAN HIEROGLYPH A291 +14548 ; [.55DC.0020.0002] # ANATOLIAN HIEROGLYPH A292 +14549 ; [.55DD.0020.0002] # ANATOLIAN HIEROGLYPH A293 +1454A ; [.55DE.0020.0002] # ANATOLIAN HIEROGLYPH A294 +1454B ; [.55DF.0020.0002] # ANATOLIAN HIEROGLYPH A294A +1454C ; [.55E0.0020.0002] # ANATOLIAN HIEROGLYPH A295 +1454D ; [.55E1.0020.0002] # ANATOLIAN HIEROGLYPH A296 +1454E ; [.55E2.0020.0002] # ANATOLIAN HIEROGLYPH A297 +1454F ; [.55E3.0020.0002] # ANATOLIAN HIEROGLYPH A298 +14550 ; [.55E4.0020.0002] # ANATOLIAN HIEROGLYPH A299 +14551 ; [.55E5.0020.0002] # ANATOLIAN HIEROGLYPH A299A +14552 ; [.55E6.0020.0002] # ANATOLIAN HIEROGLYPH A300 +14553 ; [.55E7.0020.0002] # ANATOLIAN HIEROGLYPH A301 +14554 ; [.55E8.0020.0002] # ANATOLIAN HIEROGLYPH A302 +14555 ; [.55E9.0020.0002] # ANATOLIAN HIEROGLYPH A303 +14556 ; [.55EA.0020.0002] # ANATOLIAN HIEROGLYPH A304 +14557 ; [.55EB.0020.0002] # ANATOLIAN HIEROGLYPH A305 +14558 ; [.55EC.0020.0002] # ANATOLIAN HIEROGLYPH A306 +14559 ; [.55ED.0020.0002] # ANATOLIAN HIEROGLYPH A307 +1455A ; [.55EE.0020.0002] # ANATOLIAN HIEROGLYPH A308 +1455B ; [.55EF.0020.0002] # ANATOLIAN HIEROGLYPH A309 +1455C ; [.55F0.0020.0002] # ANATOLIAN HIEROGLYPH A309A +1455D ; [.55F1.0020.0002] # ANATOLIAN HIEROGLYPH A310 +1455E ; [.55F2.0020.0002] # ANATOLIAN HIEROGLYPH A311 +1455F ; [.55F3.0020.0002] # ANATOLIAN HIEROGLYPH A312 +14560 ; [.55F4.0020.0002] # ANATOLIAN HIEROGLYPH A313 +14561 ; [.55F5.0020.0002] # ANATOLIAN HIEROGLYPH A314 +14562 ; [.55F6.0020.0002] # ANATOLIAN HIEROGLYPH A315 +14563 ; [.55F7.0020.0002] # ANATOLIAN HIEROGLYPH A316 +14564 ; [.55F8.0020.0002] # ANATOLIAN HIEROGLYPH A317 +14565 ; [.55F9.0020.0002] # ANATOLIAN HIEROGLYPH A318 +14566 ; [.55FA.0020.0002] # ANATOLIAN HIEROGLYPH A319 +14567 ; [.55FB.0020.0002] # ANATOLIAN HIEROGLYPH A320 +14568 ; [.55FC.0020.0002] # ANATOLIAN HIEROGLYPH A321 +14569 ; [.55FD.0020.0002] # ANATOLIAN HIEROGLYPH A322 +1456A ; [.55FE.0020.0002] # ANATOLIAN HIEROGLYPH A323 +1456B ; [.55FF.0020.0002] # ANATOLIAN HIEROGLYPH A324 +1456C ; [.5600.0020.0002] # ANATOLIAN HIEROGLYPH A325 +1456D ; [.5601.0020.0002] # ANATOLIAN HIEROGLYPH A326 +1456E ; [.5602.0020.0002] # ANATOLIAN HIEROGLYPH A327 +1456F ; [.5603.0020.0002] # ANATOLIAN HIEROGLYPH A328 +14570 ; [.5604.0020.0002] # ANATOLIAN HIEROGLYPH A329 +14571 ; [.5605.0020.0002] # ANATOLIAN HIEROGLYPH A329A +14572 ; [.5606.0020.0002] # ANATOLIAN HIEROGLYPH A330 +14573 ; [.5607.0020.0002] # ANATOLIAN HIEROGLYPH A331 +14574 ; [.5608.0020.0002] # ANATOLIAN HIEROGLYPH A332A +14575 ; [.5609.0020.0002] # ANATOLIAN HIEROGLYPH A332B +14576 ; [.560A.0020.0002] # ANATOLIAN HIEROGLYPH A332C +14577 ; [.560B.0020.0002] # ANATOLIAN HIEROGLYPH A333 +14578 ; [.560C.0020.0002] # ANATOLIAN HIEROGLYPH A334 +14579 ; [.560D.0020.0002] # ANATOLIAN HIEROGLYPH A335 +1457A ; [.560E.0020.0002] # ANATOLIAN HIEROGLYPH A336 +1457B ; [.560F.0020.0002] # ANATOLIAN HIEROGLYPH A336A +1457C ; [.5610.0020.0002] # ANATOLIAN HIEROGLYPH A336B +1457D ; [.5611.0020.0002] # ANATOLIAN HIEROGLYPH A336C +1457E ; [.5612.0020.0002] # ANATOLIAN HIEROGLYPH A337 +1457F ; [.5613.0020.0002] # ANATOLIAN HIEROGLYPH A338 +14580 ; [.5614.0020.0002] # ANATOLIAN HIEROGLYPH A339 +14581 ; [.5615.0020.0002] # ANATOLIAN HIEROGLYPH A340 +14582 ; [.5616.0020.0002] # ANATOLIAN HIEROGLYPH A341 +14583 ; [.5617.0020.0002] # ANATOLIAN HIEROGLYPH A342 +14584 ; [.5618.0020.0002] # ANATOLIAN HIEROGLYPH A343 +14585 ; [.5619.0020.0002] # ANATOLIAN HIEROGLYPH A344 +14586 ; [.561A.0020.0002] # ANATOLIAN HIEROGLYPH A345 +14587 ; [.561B.0020.0002] # ANATOLIAN HIEROGLYPH A346 +14588 ; [.561C.0020.0002] # ANATOLIAN HIEROGLYPH A347 +14589 ; [.561D.0020.0002] # ANATOLIAN HIEROGLYPH A348 +1458A ; [.561E.0020.0002] # ANATOLIAN HIEROGLYPH A349 +1458B ; [.561F.0020.0002] # ANATOLIAN HIEROGLYPH A350 +1458C ; [.5620.0020.0002] # ANATOLIAN HIEROGLYPH A351 +1458D ; [.5621.0020.0002] # ANATOLIAN HIEROGLYPH A352 +1458E ; [.5622.0020.0002] # ANATOLIAN HIEROGLYPH A353 +1458F ; [.5623.0020.0002] # ANATOLIAN HIEROGLYPH A354 +14590 ; [.5624.0020.0002] # ANATOLIAN HIEROGLYPH A355 +14591 ; [.5625.0020.0002] # ANATOLIAN HIEROGLYPH A356 +14592 ; [.5626.0020.0002] # ANATOLIAN HIEROGLYPH A357 +14593 ; [.5627.0020.0002] # ANATOLIAN HIEROGLYPH A358 +14594 ; [.5628.0020.0002] # ANATOLIAN HIEROGLYPH A359 +14595 ; [.5629.0020.0002] # ANATOLIAN HIEROGLYPH A359A +14596 ; [.562A.0020.0002] # ANATOLIAN HIEROGLYPH A360 +14597 ; [.562B.0020.0002] # ANATOLIAN HIEROGLYPH A361 +14598 ; [.562C.0020.0002] # ANATOLIAN HIEROGLYPH A362 +14599 ; [.562D.0020.0002] # ANATOLIAN HIEROGLYPH A363 +1459A ; [.562E.0020.0002] # ANATOLIAN HIEROGLYPH A364 +1459B ; [.562F.0020.0002] # ANATOLIAN HIEROGLYPH A364A +1459C ; [.5630.0020.0002] # ANATOLIAN HIEROGLYPH A365 +1459D ; [.5631.0020.0002] # ANATOLIAN HIEROGLYPH A366 +1459E ; [.5632.0020.0002] # ANATOLIAN HIEROGLYPH A367 +1459F ; [.5633.0020.0002] # ANATOLIAN HIEROGLYPH A368 +145A0 ; [.5634.0020.0002] # ANATOLIAN HIEROGLYPH A368A +145A1 ; [.5635.0020.0002] # ANATOLIAN HIEROGLYPH A369 +145A2 ; [.5636.0020.0002] # ANATOLIAN HIEROGLYPH A370 +145A3 ; [.5637.0020.0002] # ANATOLIAN HIEROGLYPH A371 +145A4 ; [.5638.0020.0002] # ANATOLIAN HIEROGLYPH A371A +145A5 ; [.5639.0020.0002] # ANATOLIAN HIEROGLYPH A372 +145A6 ; [.563A.0020.0002] # ANATOLIAN HIEROGLYPH A373 +145A7 ; [.563B.0020.0002] # ANATOLIAN HIEROGLYPH A374 +145A8 ; [.563C.0020.0002] # ANATOLIAN HIEROGLYPH A375 +145A9 ; [.563D.0020.0002] # ANATOLIAN HIEROGLYPH A376 +145AA ; [.563E.0020.0002] # ANATOLIAN HIEROGLYPH A377 +145AB ; [.563F.0020.0002] # ANATOLIAN HIEROGLYPH A378 +145AC ; [.5640.0020.0002] # ANATOLIAN HIEROGLYPH A379 +145AD ; [.5641.0020.0002] # ANATOLIAN HIEROGLYPH A380 +145AE ; [.5642.0020.0002] # ANATOLIAN HIEROGLYPH A381 +145AF ; [.5643.0020.0002] # ANATOLIAN HIEROGLYPH A381A +145B0 ; [.5644.0020.0002] # ANATOLIAN HIEROGLYPH A382 +145B1 ; [.5645.0020.0002] # ANATOLIAN HIEROGLYPH A383 RA OR RI +145B2 ; [.5646.0020.0002] # ANATOLIAN HIEROGLYPH A383A +145B3 ; [.5647.0020.0002] # ANATOLIAN HIEROGLYPH A384 +145B4 ; [.5648.0020.0002] # ANATOLIAN HIEROGLYPH A385 +145B5 ; [.5649.0020.0002] # ANATOLIAN HIEROGLYPH A386 +145B6 ; [.564A.0020.0002] # ANATOLIAN HIEROGLYPH A386A +145B7 ; [.564B.0020.0002] # ANATOLIAN HIEROGLYPH A387 +145B8 ; [.564C.0020.0002] # ANATOLIAN HIEROGLYPH A388 +145B9 ; [.564D.0020.0002] # ANATOLIAN HIEROGLYPH A389 +145BA ; [.564E.0020.0002] # ANATOLIAN HIEROGLYPH A390 +145BB ; [.564F.0020.0002] # ANATOLIAN HIEROGLYPH A391 +145BC ; [.5650.0020.0002] # ANATOLIAN HIEROGLYPH A392 +145BD ; [.5651.0020.0002] # ANATOLIAN HIEROGLYPH A393 EIGHT +145BE ; [.5652.0020.0002] # ANATOLIAN HIEROGLYPH A394 +145BF ; [.5653.0020.0002] # ANATOLIAN HIEROGLYPH A395 +145C0 ; [.5654.0020.0002] # ANATOLIAN HIEROGLYPH A396 +145C1 ; [.5655.0020.0002] # ANATOLIAN HIEROGLYPH A397 +145C2 ; [.5656.0020.0002] # ANATOLIAN HIEROGLYPH A398 +145C3 ; [.5657.0020.0002] # ANATOLIAN HIEROGLYPH A399 +145C4 ; [.5658.0020.0002] # ANATOLIAN HIEROGLYPH A400 +145C5 ; [.5659.0020.0002] # ANATOLIAN HIEROGLYPH A401 +145C6 ; [.565A.0020.0002] # ANATOLIAN HIEROGLYPH A402 +145C7 ; [.565B.0020.0002] # ANATOLIAN HIEROGLYPH A403 +145C8 ; [.565C.0020.0002] # ANATOLIAN HIEROGLYPH A404 +145C9 ; [.565D.0020.0002] # ANATOLIAN HIEROGLYPH A405 +145CA ; [.565E.0020.0002] # ANATOLIAN HIEROGLYPH A406 +145CB ; [.565F.0020.0002] # ANATOLIAN HIEROGLYPH A407 +145CC ; [.5660.0020.0002] # ANATOLIAN HIEROGLYPH A408 +145CD ; [.5661.0020.0002] # ANATOLIAN HIEROGLYPH A409 +145CE ; [.5662.0020.0002] # ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK +145CF ; [.5663.0020.0002] # ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK +145D0 ; [.5664.0020.0002] # ANATOLIAN HIEROGLYPH A411 +145D1 ; [.5665.0020.0002] # ANATOLIAN HIEROGLYPH A412 +145D2 ; [.5666.0020.0002] # ANATOLIAN HIEROGLYPH A413 +145D3 ; [.5667.0020.0002] # ANATOLIAN HIEROGLYPH A414 +145D4 ; [.5668.0020.0002] # ANATOLIAN HIEROGLYPH A415 +145D5 ; [.5669.0020.0002] # ANATOLIAN HIEROGLYPH A416 +145D6 ; [.566A.0020.0002] # ANATOLIAN HIEROGLYPH A417 +145D7 ; [.566B.0020.0002] # ANATOLIAN HIEROGLYPH A418 +145D8 ; [.566C.0020.0002] # ANATOLIAN HIEROGLYPH A419 +145D9 ; [.566D.0020.0002] # ANATOLIAN HIEROGLYPH A420 +145DA ; [.566E.0020.0002] # ANATOLIAN HIEROGLYPH A421 +145DB ; [.566F.0020.0002] # ANATOLIAN HIEROGLYPH A422 +145DC ; [.5670.0020.0002] # ANATOLIAN HIEROGLYPH A423 +145DD ; [.5671.0020.0002] # ANATOLIAN HIEROGLYPH A424 +145DE ; [.5672.0020.0002] # ANATOLIAN HIEROGLYPH A425 +145DF ; [.5673.0020.0002] # ANATOLIAN HIEROGLYPH A426 +145E0 ; [.5674.0020.0002] # ANATOLIAN HIEROGLYPH A427 +145E1 ; [.5675.0020.0002] # ANATOLIAN HIEROGLYPH A428 +145E2 ; [.5676.0020.0002] # ANATOLIAN HIEROGLYPH A429 +145E3 ; [.5677.0020.0002] # ANATOLIAN HIEROGLYPH A430 +145E4 ; [.5678.0020.0002] # ANATOLIAN HIEROGLYPH A431 +145E5 ; [.5679.0020.0002] # ANATOLIAN HIEROGLYPH A432 +145E6 ; [.567A.0020.0002] # ANATOLIAN HIEROGLYPH A433 +145E7 ; [.567B.0020.0002] # ANATOLIAN HIEROGLYPH A434 +145E8 ; [.567C.0020.0002] # ANATOLIAN HIEROGLYPH A435 +145E9 ; [.567D.0020.0002] # ANATOLIAN HIEROGLYPH A436 +145EA ; [.567E.0020.0002] # ANATOLIAN HIEROGLYPH A437 +145EB ; [.567F.0020.0002] # ANATOLIAN HIEROGLYPH A438 +145EC ; [.5680.0020.0002] # ANATOLIAN HIEROGLYPH A439 +145ED ; [.5681.0020.0002] # ANATOLIAN HIEROGLYPH A440 +145EE ; [.5682.0020.0002] # ANATOLIAN HIEROGLYPH A441 +145EF ; [.5683.0020.0002] # ANATOLIAN HIEROGLYPH A442 +145F0 ; [.5684.0020.0002] # ANATOLIAN HIEROGLYPH A443 +145F1 ; [.5685.0020.0002] # ANATOLIAN HIEROGLYPH A444 +145F2 ; [.5686.0020.0002] # ANATOLIAN HIEROGLYPH A445 +145F3 ; [.5687.0020.0002] # ANATOLIAN HIEROGLYPH A446 +145F4 ; [.5688.0020.0002] # ANATOLIAN HIEROGLYPH A447 +145F5 ; [.5689.0020.0002] # ANATOLIAN HIEROGLYPH A448 +145F6 ; [.568A.0020.0002] # ANATOLIAN HIEROGLYPH A449 +145F7 ; [.568B.0020.0002] # ANATOLIAN HIEROGLYPH A450 +145F8 ; [.568C.0020.0002] # ANATOLIAN HIEROGLYPH A450A +145F9 ; [.568D.0020.0002] # ANATOLIAN HIEROGLYPH A451 +145FA ; [.568E.0020.0002] # ANATOLIAN HIEROGLYPH A452 +145FB ; [.568F.0020.0002] # ANATOLIAN HIEROGLYPH A453 +145FC ; [.5690.0020.0002] # ANATOLIAN HIEROGLYPH A454 +145FD ; [.5691.0020.0002] # ANATOLIAN HIEROGLYPH A455 +145FE ; [.5692.0020.0002] # ANATOLIAN HIEROGLYPH A456 +145FF ; [.5693.0020.0002] # ANATOLIAN HIEROGLYPH A457 +14600 ; [.5694.0020.0002] # ANATOLIAN HIEROGLYPH A457A +14601 ; [.5695.0020.0002] # ANATOLIAN HIEROGLYPH A458 +14602 ; [.5696.0020.0002] # ANATOLIAN HIEROGLYPH A459 +14603 ; [.5697.0020.0002] # ANATOLIAN HIEROGLYPH A460 +14604 ; [.5698.0020.0002] # ANATOLIAN HIEROGLYPH A461 +14605 ; [.5699.0020.0002] # ANATOLIAN HIEROGLYPH A462 +14606 ; [.569A.0020.0002] # ANATOLIAN HIEROGLYPH A463 +14607 ; [.569B.0020.0002] # ANATOLIAN HIEROGLYPH A464 +14608 ; [.569C.0020.0002] # ANATOLIAN HIEROGLYPH A465 +14609 ; [.569D.0020.0002] # ANATOLIAN HIEROGLYPH A466 +1460A ; [.569E.0020.0002] # ANATOLIAN HIEROGLYPH A467 +1460B ; [.569F.0020.0002] # ANATOLIAN HIEROGLYPH A468 +1460C ; [.56A0.0020.0002] # ANATOLIAN HIEROGLYPH A469 +1460D ; [.56A1.0020.0002] # ANATOLIAN HIEROGLYPH A470 +1460E ; [.56A2.0020.0002] # ANATOLIAN HIEROGLYPH A471 +1460F ; [.56A3.0020.0002] # ANATOLIAN HIEROGLYPH A472 +14610 ; [.56A4.0020.0002] # ANATOLIAN HIEROGLYPH A473 +14611 ; [.56A5.0020.0002] # ANATOLIAN HIEROGLYPH A474 +14612 ; [.56A6.0020.0002] # ANATOLIAN HIEROGLYPH A475 +14613 ; [.56A7.0020.0002] # ANATOLIAN HIEROGLYPH A476 +14614 ; [.56A8.0020.0002] # ANATOLIAN HIEROGLYPH A477 +14615 ; [.56A9.0020.0002] # ANATOLIAN HIEROGLYPH A478 +14616 ; [.56AA.0020.0002] # ANATOLIAN HIEROGLYPH A479 +14617 ; [.56AB.0020.0002] # ANATOLIAN HIEROGLYPH A480 +14618 ; [.56AC.0020.0002] # ANATOLIAN HIEROGLYPH A481 +14619 ; [.56AD.0020.0002] # ANATOLIAN HIEROGLYPH A482 +1461A ; [.56AE.0020.0002] # ANATOLIAN HIEROGLYPH A483 +1461B ; [.56AF.0020.0002] # ANATOLIAN HIEROGLYPH A484 +1461C ; [.56B0.0020.0002] # ANATOLIAN HIEROGLYPH A485 +1461D ; [.56B1.0020.0002] # ANATOLIAN HIEROGLYPH A486 +1461E ; [.56B2.0020.0002] # ANATOLIAN HIEROGLYPH A487 +1461F ; [.56B3.0020.0002] # ANATOLIAN HIEROGLYPH A488 +14620 ; [.56B4.0020.0002] # ANATOLIAN HIEROGLYPH A489 +14621 ; [.56B5.0020.0002] # ANATOLIAN HIEROGLYPH A490 +14622 ; [.56B6.0020.0002] # ANATOLIAN HIEROGLYPH A491 +14623 ; [.56B7.0020.0002] # ANATOLIAN HIEROGLYPH A492 +14624 ; [.56B8.0020.0002] # ANATOLIAN HIEROGLYPH A493 +14625 ; [.56B9.0020.0002] # ANATOLIAN HIEROGLYPH A494 +14626 ; [.56BA.0020.0002] # ANATOLIAN HIEROGLYPH A495 +14627 ; [.56BB.0020.0002] # ANATOLIAN HIEROGLYPH A496 +14628 ; [.56BC.0020.0002] # ANATOLIAN HIEROGLYPH A497 +14629 ; [.56BD.0020.0002] # ANATOLIAN HIEROGLYPH A501 +1462A ; [.56BE.0020.0002] # ANATOLIAN HIEROGLYPH A502 +1462B ; [.56BF.0020.0002] # ANATOLIAN HIEROGLYPH A503 +1462C ; [.56C0.0020.0002] # ANATOLIAN HIEROGLYPH A504 +1462D ; [.56C1.0020.0002] # ANATOLIAN HIEROGLYPH A505 +1462E ; [.56C2.0020.0002] # ANATOLIAN HIEROGLYPH A506 +1462F ; [.56C3.0020.0002] # ANATOLIAN HIEROGLYPH A507 +14630 ; [.56C4.0020.0002] # ANATOLIAN HIEROGLYPH A508 +14631 ; [.56C5.0020.0002] # ANATOLIAN HIEROGLYPH A509 +14632 ; [.56C6.0020.0002] # ANATOLIAN HIEROGLYPH A510 +14633 ; [.56C7.0020.0002] # ANATOLIAN HIEROGLYPH A511 +14634 ; [.56C8.0020.0002] # ANATOLIAN HIEROGLYPH A512 +14635 ; [.56C9.0020.0002] # ANATOLIAN HIEROGLYPH A513 +14636 ; [.56CA.0020.0002] # ANATOLIAN HIEROGLYPH A514 +14637 ; [.56CB.0020.0002] # ANATOLIAN HIEROGLYPH A515 +14638 ; [.56CC.0020.0002] # ANATOLIAN HIEROGLYPH A516 +14639 ; [.56CD.0020.0002] # ANATOLIAN HIEROGLYPH A517 +1463A ; [.56CE.0020.0002] # ANATOLIAN HIEROGLYPH A518 +1463B ; [.56CF.0020.0002] # ANATOLIAN HIEROGLYPH A519 +1463C ; [.56D0.0020.0002] # ANATOLIAN HIEROGLYPH A520 +1463D ; [.56D1.0020.0002] # ANATOLIAN HIEROGLYPH A521 +1463E ; [.56D2.0020.0002] # ANATOLIAN HIEROGLYPH A522 +1463F ; [.56D3.0020.0002] # ANATOLIAN HIEROGLYPH A523 +14640 ; [.56D4.0020.0002] # ANATOLIAN HIEROGLYPH A524 +14641 ; [.56D5.0020.0002] # ANATOLIAN HIEROGLYPH A525 +14642 ; [.56D6.0020.0002] # ANATOLIAN HIEROGLYPH A526 +14643 ; [.56D7.0020.0002] # ANATOLIAN HIEROGLYPH A527 +14644 ; [.56D8.0020.0002] # ANATOLIAN HIEROGLYPH A528 +14645 ; [.56D9.0020.0002] # ANATOLIAN HIEROGLYPH A529 +14646 ; [.56DA.0020.0002] # ANATOLIAN HIEROGLYPH A530 2F00 ; [.FB40.0020.0004][.CE00.0000.0000] # KANGXI RADICAL ONE -3220 ; [*0317.0020.0004][.FB40.0020.0004][.CE00.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH ONE +3220 ; [*0318.0020.0004][.FB40.0020.0004][.CE00.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH ONE 3280 ; [.FB40.0020.0006][.CE00.0000.0000] # CIRCLED IDEOGRAPH ONE 3192 ; [.FB40.0020.0014][.CE00.0000.0000] # IDEOGRAPHIC ANNOTATION ONE MARK 1F229 ; [.FB40.0020.001C][.CE00.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E00 319C ; [.FB40.0020.0014][.CE01.0000.0000] # IDEOGRAPHIC ANNOTATION FOURTH MARK -3226 ; [*0317.0020.0004][.FB40.0020.0004][.CE03.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SEVEN +3226 ; [*0318.0020.0004][.FB40.0020.0004][.CE03.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH SEVEN 3286 ; [.FB40.0020.0006][.CE03.0000.0000] # CIRCLED IDEOGRAPH SEVEN -3222 ; [*0317.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH THREE -1F241 ; [*0379.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 +3222 ; [*0318.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH THREE +1F241 ; [*037A.0020.0004][.FB40.0020.0004][.CE09.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 3282 ; [.FB40.0020.0006][.CE09.0000.0000] # CIRCLED IDEOGRAPH THREE 3194 ; [.FB40.0020.0014][.CE09.0000.0000] # IDEOGRAPHIC ANNOTATION THREE MARK 1F22A ; [.FB40.0020.001C][.CE09.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E09 @@ -29213,7 +29843,7 @@ FA70 ; [.FB40.0020.0002][.CE26.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA70 1F22D ; [.FB40.0020.001C][.CE2D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E2D F905 ; [.FB40.0020.0002][.CE32.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F905 2F02 ; [.FB40.0020.0004][.CE36.0000.0000] # KANGXI RADICAL DOT -2E80 ; [.FB40.0020.0004][.CE36.0000.0000][.0000.0110.0004] # CJK RADICAL REPEAT +2E80 ; [.FB40.0020.0004][.CE36.0000.0000][.0000.0111.0004] # CJK RADICAL REPEAT 2F801 ; [.FB40.0020.0002][.CE38.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F801 F95E ; [.FB40.0020.0002][.CE39.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95E 2F800 ; [.FB40.0020.0002][.CE3D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F800 @@ -29221,21 +29851,21 @@ F95E ; [.FB40.0020.0002][.CE39.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F95E 2F802 ; [.FB40.0020.0002][.CE41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F802 2F04 ; [.FB40.0020.0004][.CE59.0000.0000] # KANGXI RADICAL SECOND 319A ; [.FB40.0020.0014][.CE59.0000.0000] # IDEOGRAPHIC ANNOTATION SECOND MARK -2E84 ; [.FB40.0020.0004][.CE59.0000.0000][.0000.0110.0004] # CJK RADICAL SECOND THREE +2E84 ; [.FB40.0020.0004][.CE59.0000.0000][.0000.0111.0004] # CJK RADICAL SECOND THREE 2E83 ; [.FB40.0020.0004][.CE5A.0000.0000] # CJK RADICAL SECOND TWO 2E82 ; [.FB40.0020.0004][.CE5B.0000.0000] # CJK RADICAL SECOND ONE -3228 ; [*0317.0020.0004][.FB40.0020.0004][.CE5D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH NINE +3228 ; [*0318.0020.0004][.FB40.0020.0004][.CE5D.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH NINE 3288 ; [.FB40.0020.0006][.CE5D.0000.0000] # CIRCLED IDEOGRAPH NINE F91B ; [.FB40.0020.0002][.CE82.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91B 2F05 ; [.FB40.0020.0004][.CE85.0000.0000] # KANGXI RADICAL HOOK F9BA ; [.FB40.0020.0002][.CE86.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BA 2F06 ; [.FB40.0020.0004][.CE8C.0000.0000] # KANGXI RADICAL TWO -3221 ; [*0317.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH TWO -1F242 ; [*0379.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C +3221 ; [*0318.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH TWO +1F242 ; [*037A.0020.0004][.FB40.0020.0004][.CE8C.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C 3281 ; [.FB40.0020.0006][.CE8C.0000.0000] # CIRCLED IDEOGRAPH TWO 3193 ; [.FB40.0020.0014][.CE8C.0000.0000] # IDEOGRAPHIC ANNOTATION TWO MARK 1F214 ; [.FB40.0020.001C][.CE8C.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4E8C -3224 ; [*0317.0020.0004][.FB40.0020.0004][.CE94.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FIVE +3224 ; [*0318.0020.0004][.FB40.0020.0004][.CE94.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH FIVE 3284 ; [.FB40.0020.0006][.CE94.0000.0000] # CIRCLED IDEOGRAPH FIVE 2F07 ; [.FB40.0020.0004][.CEA0.0000.0000] # KANGXI RADICAL LID 1F218 ; [.FB40.0020.001C][.CEA4.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-4EA4 @@ -29245,11 +29875,11 @@ F977 ; [.FB40.0020.0002][.CEAE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F977 2E85 ; [.FB40.0020.0004][.CEBB.0000.0000] # CJK RADICAL PERSON F9FD ; [.FB40.0020.0002][.CEC0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FD 2F819 ; [.FB40.0020.0002][.CECC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F819 -3239 ; [*0317.0020.0004][.FB40.0020.0004][.CEE3.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH REPRESENT +3239 ; [*0318.0020.0004][.FB40.0020.0004][.CEE3.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH REPRESENT F9A8 ; [.FB40.0020.0002][.CEE4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A8 -323D ; [*0317.0020.0004][.FB40.0020.0004][.CF01.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH ENTERPRISE +323D ; [*0318.0020.0004][.FB40.0020.0004][.CF01.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH ENTERPRISE 32AD ; [.FB40.0020.0006][.CF01.0000.0000] # CIRCLED IDEOGRAPH ENTERPRISE -3241 ; [*0317.0020.0004][.FB40.0020.0004][.CF11.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH REST +3241 ; [*0318.0020.0004][.FB40.0020.0004][.CF11.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH REST 32A1 ; [.FB40.0020.0006][.CF11.0000.0000] # CIRCLED IDEOGRAPH REST 2F804 ; [.FB40.0020.0002][.CF60.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F804 FA73 ; [.FB40.0020.0002][.CF80.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA73 @@ -29280,15 +29910,15 @@ FA32 ; [.FB40.0020.0002][.D14D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA32 FA72 ; [.FB40.0020.0002][.D168.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA72 F978 ; [.FB40.0020.0002][.D169.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F978 2F0B ; [.FB40.0020.0004][.D16B.0000.0000] # KANGXI RADICAL EIGHT -3227 ; [*0317.0020.0004][.FB40.0020.0004][.D16B.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH EIGHT +3227 ; [*0318.0020.0004][.FB40.0020.0004][.D16B.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH EIGHT 3287 ; [.FB40.0020.0006][.D16B.0000.0000] # CIRCLED IDEOGRAPH EIGHT F9D1 ; [.FB40.0020.0002][.D16D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D1 -3225 ; [*0317.0020.0004][.FB40.0020.0004][.D16D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SIX +3225 ; [*0318.0020.0004][.FB40.0020.0004][.D16D.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH SIX 3285 ; [.FB40.0020.0006][.D16D.0000.0000] # CIRCLED IDEOGRAPH SIX 2F811 ; [.FB40.0020.0002][.D177.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F811 FA75 ; [.FB40.0020.0002][.D180.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA75 2F0C ; [.FB40.0020.0004][.D182.0000.0000] # KANGXI RADICAL DOWN BOX -2E86 ; [.FB40.0020.0004][.D182.0000.0000][.0000.0110.0004] # CJK RADICAL BOX +2E86 ; [.FB40.0020.0004][.D182.0000.0000][.0000.0111.0004] # CJK RADICAL BOX 2F815 ; [.FB40.0020.0002][.D18D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F815 1F21E ; [.FB40.0020.001C][.D18D.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-518D 2F8D2 ; [.FB40.0020.0002][.D192.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D2 @@ -29307,11 +29937,11 @@ F955 ; [.FB40.0020.0002][.D1CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F955 F954 ; [.FB40.0020.0002][.D1DC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F954 FA15 ; [.FB40.0020.0002][.D1DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA15 2F0F ; [.FB40.0020.0004][.D1E0.0000.0000] # KANGXI RADICAL TABLE -2E87 ; [.FB40.0020.0004][.D1E0.0000.0000][.0000.0110.0004] # CJK RADICAL TABLE +2E87 ; [.FB40.0020.0004][.D1E0.0000.0000][.0000.0111.0004] # CJK RADICAL TABLE 2F81D ; [.FB40.0020.0002][.D1F5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81D 2F10 ; [.FB40.0020.0004][.D1F5.0000.0000] # KANGXI RADICAL OPEN BOX 2F11 ; [.FB40.0020.0004][.D200.0000.0000] # KANGXI RADICAL KNIFE -2E88 ; [.FB40.0020.0004][.D200.0000.0000][.0000.0110.0004] # CJK RADICAL KNIFE ONE +2E88 ; [.FB40.0020.0004][.D200.0000.0000][.0000.0111.0004] # CJK RADICAL KNIFE ONE 2E89 ; [.FB40.0020.0004][.D202.0000.0000] # CJK RADICAL KNIFE TWO 2F81E ; [.FB40.0020.0002][.D203.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F81E FA00 ; [.FB40.0020.0002][.D207.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA00 @@ -29331,14 +29961,14 @@ F98A ; [.FB40.0020.0002][.D29B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98A 2F12 ; [.FB40.0020.0004][.D29B.0000.0000] # KANGXI RADICAL POWER F99D ; [.FB40.0020.0002][.D2A3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99D 2F992 ; [.FB40.0020.0002][.D2B3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F992 -3238 ; [*0317.0020.0004][.FB40.0020.0004][.D2B4.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH LABOR +3238 ; [*0318.0020.0004][.FB40.0020.0004][.D2B4.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH LABOR 3298 ; [.FB40.0020.0006][.D2B4.0000.0000] # CIRCLED IDEOGRAPH LABOR FA76 ; [.FB40.0020.0002][.D2C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA76 2F825 ; [.FB40.0020.0002][.D2C7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F825 FA33 ; [.FB40.0020.0002][.D2C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA33 2F826 ; [.FB40.0020.0002][.D2C9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F826 F952 ; [.FB40.0020.0002][.D2D2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F952 -1F247 ; [*0379.0020.0004][.FB40.0020.0004][.D2DD.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD +1F247 ; [*037A.0020.0004][.FB40.0020.0004][.D2DD.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD F92F ; [.FB40.0020.0002][.D2DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92F FA34 ; [.FB40.0020.0002][.D2E4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA34 2F827 ; [.FB40.0020.0002][.D2E4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F827 @@ -29357,20 +29987,20 @@ F963 ; [.FB40.0020.0002][.D317.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F963 F9EB ; [.FB40.0020.0002][.D33F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EB 2F17 ; [.FB40.0020.0004][.D341.0000.0000] # KANGXI RADICAL TEN 3038 ; [.FB40.0020.0004][.D341.0000.0000] # HANGZHOU NUMERAL TEN -3229 ; [*0317.0020.0004][.FB40.0020.0004][.D341.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH TEN +3229 ; [*0318.0020.0004][.FB40.0020.0004][.D341.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH TEN 3289 ; [.FB40.0020.0006][.D341.0000.0000] # CIRCLED IDEOGRAPH TEN 3039 ; [.FB40.0020.0004][.D344.0000.0000] # HANGZHOU NUMERAL TWENTY 303A ; [.FB40.0020.0004][.D345.0000.0000] # HANGZHOU NUMERAL THIRTY 2F82C ; [.FB40.0020.0002][.D349.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82C FA35 ; [.FB40.0020.0002][.D351.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA35 2F82D ; [.FB40.0020.0002][.D351.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82D -323F ; [*0317.0020.0004][.FB40.0020.0004][.D354.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH ALLIANCE +323F ; [*0318.0020.0004][.FB40.0020.0004][.D354.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH ALLIANCE 32AF ; [.FB40.0020.0006][.D354.0000.0000] # CIRCLED IDEOGRAPH ALLIANCE 2F82E ; [.FB40.0020.0002][.D35A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82E 2F18 ; [.FB40.0020.0004][.D35C.0000.0000] # KANGXI RADICAL DIVINATION -2E8A ; [.FB40.0020.0004][.D35C.0000.0000][.0000.0110.0004] # CJK RADICAL DIVINATION +2E8A ; [.FB40.0020.0004][.D35C.0000.0000][.0000.0111.0004] # CJK RADICAL DIVINATION 2F19 ; [.FB40.0020.0004][.D369.0000.0000] # KANGXI RADICAL SEAL -2E8B ; [.FB40.0020.0004][.D369.0000.0000][.0000.0110.0004] # CJK RADICAL SEAL +2E8B ; [.FB40.0020.0004][.D369.0000.0000][.0000.0111.0004] # CJK RADICAL SEAL 329E ; [.FB40.0020.0006][.D370.0000.0000] # CIRCLED IDEOGRAPH PRINT 2F82F ; [.FB40.0020.0002][.D373.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F82F F91C ; [.FB40.0020.0002][.D375.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91C @@ -29379,7 +30009,7 @@ F91C ; [.FB40.0020.0002][.D375.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91C 2F832 ; [.FB40.0020.0002][.D37F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F832 2F833 ; [.FB40.0020.0002][.D37F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F833 2F1A ; [.FB40.0020.0004][.D382.0000.0000] # KANGXI RADICAL CLIFF -2E81 ; [.FB40.0020.0004][.D382.0000.0000][.0000.0110.0004] # CJK RADICAL CLIFF +2E81 ; [.FB40.0020.0004][.D382.0000.0000][.0000.0111.0004] # CJK RADICAL CLIFF 2F1B ; [.FB40.0020.0004][.D3B6.0000.0000] # KANGXI RADICAL PRIVATE F96B ; [.FB40.0020.0002][.D3C3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96B 2F1C ; [.FB40.0020.0004][.D3C8.0000.0000] # KANGXI RADICAL AGAIN @@ -29395,7 +30025,7 @@ F906 ; [.FB40.0020.0002][.D3E5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F906 1F22E ; [.FB40.0020.001C][.D3F3.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-53F3 2F83B ; [.FB40.0020.0002][.D406.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83B 1F234 ; [.FB40.0020.001C][.D408.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5408 -3234 ; [*0317.0020.0004][.FB40.0020.0004][.D40D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH NAME +3234 ; [*0318.0020.0004][.FB40.0020.0004][.D40D.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH NAME 3294 ; [.FB40.0020.0006][.D40D.0000.0000] # CIRCLED IDEOGRAPH NAME F9DE ; [.FB40.0020.0002][.D40F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DE F9ED ; [.FB40.0020.0002][.D41D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9ED @@ -29404,7 +30034,7 @@ F9ED ; [.FB40.0020.0002][.D41D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9ED F980 ; [.FB40.0020.0002][.D442.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F980 2F83E ; [.FB40.0020.0002][.D448.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83E 2F83F ; [.FB40.0020.0002][.D468.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83F -323A ; [*0317.0020.0004][.FB40.0020.0004][.D47C.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH CALL +323A ; [*0318.0020.0004][.FB40.0020.0004][.D47C.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH CALL 2F83C ; [.FB40.0020.0002][.D49E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F83C 2F840 ; [.FB40.0020.0002][.D4A2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F840 F99E ; [.FB40.0020.0002][.D4BD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99E @@ -29433,14 +30063,14 @@ FA37 ; [.FB40.0020.0002][.D606.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA37 FA38 ; [.FB40.0020.0002][.D668.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA38 2F84F ; [.FB40.0020.0002][.D674.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84F 2F1E ; [.FB40.0020.0004][.D6D7.0000.0000] # KANGXI RADICAL ENCLOSURE -3223 ; [*0317.0020.0004][.FB40.0020.0004][.D6DB.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FOUR +3223 ; [*0318.0020.0004][.FB40.0020.0004][.D6DB.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH FOUR 3283 ; [.FB40.0020.0006][.D6DB.0000.0000] # CIRCLED IDEOGRAPH FOUR 3195 ; [.FB40.0020.0014][.D6DB.0000.0000] # IDEOGRAPHIC ANNOTATION FOUR MARK F9A9 ; [.FB40.0020.0002][.D6F9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A9 2F84B ; [.FB40.0020.0002][.D716.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84B 2F84D ; [.FB40.0020.0002][.D717.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F84D 2F1F ; [.FB40.0020.0004][.D71F.0000.0000] # KANGXI RADICAL EARTH -322F ; [*0317.0020.0004][.FB40.0020.0004][.D71F.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH EARTH +322F ; [*0318.0020.0004][.FB40.0020.0004][.D71F.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH EARTH 328F ; [.FB40.0020.0006][.D71F.0000.0000] # CIRCLED IDEOGRAPH EARTH 319E ; [.FB40.0020.0014][.D730.0000.0000] # IDEOGRAPHIC ANNOTATION EARTH MARK 2F855 ; [.FB40.0020.0002][.D78B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F855 @@ -29496,11 +30126,11 @@ FA81 ; [.FB40.0020.0002][.DB28.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA81 2F86B ; [.FB40.0020.0002][.DB3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86B 2F26 ; [.FB40.0020.0004][.DB50.0000.0000] # KANGXI RADICAL CHILD 1F211 ; [.FB40.0020.001C][.DB57.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-5B57 -323B ; [*0317.0020.0004][.FB40.0020.0004][.DB66.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH STUDY +323B ; [*0318.0020.0004][.FB40.0020.0004][.DB66.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH STUDY 32AB ; [.FB40.0020.0006][.DB66.0000.0000] # CIRCLED IDEOGRAPH STUDY 2F27 ; [.FB40.0020.0004][.DB80.0000.0000] # KANGXI RADICAL ROOF FA04 ; [.FB40.0020.0002][.DB85.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA04 -1F243 ; [*0379.0020.0004][.FB40.0020.0004][.DB89.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 +1F243 ; [*037A.0020.0004][.FB40.0020.0004][.DB89.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 32AA ; [.FB40.0020.0006][.DB97.0000.0000] # CIRCLED IDEOGRAPH RELIGION 2F86D ; [.FB40.0020.0002][.DBC3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86D 2F86E ; [.FB40.0020.0002][.DBD8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F86E @@ -29513,14 +30143,14 @@ F9BC ; [.FB40.0020.0002][.DBEE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BC 2F872 ; [.FB40.0020.0002][.DBFF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F872 2F873 ; [.FB40.0020.0002][.DC06.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F873 2F29 ; [.FB40.0020.0004][.DC0F.0000.0000] # KANGXI RADICAL SMALL -2E8C ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.0110.0004] # CJK RADICAL SMALL ONE -2E8D ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.0111.0004] # CJK RADICAL SMALL TWO +2E8C ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.0111.0004] # CJK RADICAL SMALL ONE +2E8D ; [.FB40.0020.0004][.DC0F.0000.0000][.0000.0112.0004] # CJK RADICAL SMALL TWO 2F875 ; [.FB40.0020.0002][.DC22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F875 2E90 ; [.FB40.0020.0004][.DC22.0000.0000] # CJK RADICAL LAME THREE 2F2A ; [.FB40.0020.0004][.DC22.0000.0000] # KANGXI RADICAL LAME -2E8E ; [.FB40.0020.0004][.DC22.0000.0000][.0000.0110.0004] # CJK RADICAL LAME ONE +2E8E ; [.FB40.0020.0004][.DC22.0000.0000][.0000.0111.0004] # CJK RADICAL LAME ONE 2E8F ; [.FB40.0020.0004][.DC23.0000.0000] # CJK RADICAL LAME TWO -2E91 ; [.FB40.0020.0004][.DC23.0000.0000][.0000.0110.0004] # CJK RADICAL LAME FOUR +2E91 ; [.FB40.0020.0004][.DC23.0000.0000][.0000.0111.0004] # CJK RADICAL LAME FOUR 2F2B ; [.FB40.0020.0004][.DC38.0000.0000] # KANGXI RADICAL CORPSE F9BD ; [.FB40.0020.0002][.DC3F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9BD 2F877 ; [.FB40.0020.0002][.DC60.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F877 @@ -29581,7 +30211,7 @@ F943 ; [.FB40.0020.0002][.DF04.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F943 2F894 ; [.FB40.0020.0002][.DF22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F894 2F895 ; [.FB40.0020.0002][.DF22.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F895 2F39 ; [.FB40.0020.0004][.DF50.0000.0000] # KANGXI RADICAL SNOUT -2E95 ; [.FB40.0020.0004][.DF50.0000.0000][.0000.0110.0004] # CJK RADICAL SNOUT TWO +2E95 ; [.FB40.0020.0004][.DF50.0000.0000][.0000.0111.0004] # CJK RADICAL SNOUT TWO 2E94 ; [.FB40.0020.0004][.DF51.0000.0000] # CJK RADICAL SNOUT ONE 2F874 ; [.FB40.0020.0002][.DF53.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F874 2F3A ; [.FB40.0020.0004][.DF61.0000.0000] # KANGXI RADICAL BRISTLE @@ -29596,7 +30226,7 @@ F9D8 ; [.FB40.0020.0002][.DF8B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D8 F966 ; [.FB40.0020.0002][.DFA9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F966 FA85 ; [.FB40.0020.0002][.DFAD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA85 2F3C ; [.FB40.0020.0004][.DFC3.0000.0000] # KANGXI RADICAL HEART -2E97 ; [.FB40.0020.0004][.DFC3.0000.0000][.0000.0110.0004] # CJK RADICAL HEART TWO +2E97 ; [.FB40.0020.0004][.DFC3.0000.0000][.0000.0111.0004] # CJK RADICAL HEART TWO 2E96 ; [.FB40.0020.0004][.DFC4.0000.0000] # CJK RADICAL HEART ONE 2F89D ; [.FB40.0020.0002][.DFCD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89D 2F89E ; [.FB40.0020.0002][.DFD7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F89E @@ -29644,7 +30274,7 @@ FA8C ; [.FB40.0020.0002][.E234.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA8C 2F3F ; [.FB40.0020.0004][.E24B.0000.0000] # KANGXI RADICAL HAND 1F210 ; [.FB40.0020.001C][.E24B.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-624B 2E98 ; [.FB40.0020.0004][.E24C.0000.0000] # CJK RADICAL HAND -1F245 ; [*0379.0020.0004][.FB40.0020.0004][.E253.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 +1F245 ; [*037A.0020.0004][.FB40.0020.0004][.E253.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 1F231 ; [.FB40.0020.001C][.E253.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6253 2F8B4 ; [.FB40.0020.0002][.E25D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8B4 1F227 ; [.FB40.0020.001C][.E295.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6295 @@ -29682,7 +30312,7 @@ F930 ; [.FB40.0020.0002][.E4C4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F930 FA41 ; [.FB40.0020.0002][.E54F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA41 2F8C8 ; [.FB40.0020.0002][.E54F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C8 FA90 ; [.FB40.0020.0002][.E556.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA90 -1F248 ; [*0379.0020.0004][.FB40.0020.0004][.E557.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F248 ; [*037A.0020.0004][.FB40.0020.0004][.E557.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 2F8C9 ; [.FB40.0020.0002][.E56C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8C9 F969 ; [.FB40.0020.0002][.E578.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F969 2F42 ; [.FB40.0020.0004][.E587.0000.0000] # KANGXI RADICAL SCRIPT @@ -29699,9 +30329,9 @@ F983 ; [.FB40.0020.0002][.E5C5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F983 FA42 ; [.FB40.0020.0002][.E5E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA42 2F8CB ; [.FB40.0020.0002][.E5E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CB 2F47 ; [.FB40.0020.0004][.E5E5.0000.0000] # KANGXI RADICAL SUN -3230 ; [*0317.0020.0004][.FB40.0020.0004][.E5E5.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SUN +3230 ; [*0318.0020.0004][.FB40.0020.0004][.E5E5.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH SUN 3290 ; [.FB40.0020.0006][.E5E5.0000.0000] # CIRCLED IDEOGRAPH SUN -2E9C ; [.FB40.0020.0004][.E5E5.0000.0000][.0000.0110.0004] # CJK RADICAL SUN +2E9C ; [.FB40.0020.0004][.E5E5.0000.0000][.0000.0111.0004] # CJK RADICAL SUN 337E ; [.FB40.0020.001C][.E60E.0000.0000][.FB40.0020.001C][.ECBB.0000.0000] # SQUARE ERA NAME MEIZI F9E0 ; [.FB40.0020.0002][.E613.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E0 1F219 ; [.FB40.0020.001C][.E620.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6620 @@ -29720,11 +30350,11 @@ F901 ; [.FB40.0020.0002][.E6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F901 2F8CC ; [.FB40.0020.0002][.E6F8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8CC 2F8D4 ; [.FB40.0020.0002][.E700.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D4 2F49 ; [.FB40.0020.0004][.E708.0000.0000] # KANGXI RADICAL MOON -322A ; [*0317.0020.0004][.FB40.0020.0004][.E708.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH MOON +322A ; [*0318.0020.0004][.FB40.0020.0004][.E708.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH MOON 328A ; [.FB40.0020.0006][.E708.0000.0000] # CIRCLED IDEOGRAPH MOON 1F237 ; [.FB40.0020.001C][.E708.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6708 -2E9D ; [.FB40.0020.0004][.E708.0000.0000][.0000.0110.0004] # CJK RADICAL MOON -3232 ; [*0317.0020.0004][.FB40.0020.0004][.E709.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH HAVE +2E9D ; [.FB40.0020.0004][.E708.0000.0000][.0000.0111.0004] # CJK RADICAL MOON +3232 ; [*0318.0020.0004][.FB40.0020.0004][.E709.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH HAVE 3292 ; [.FB40.0020.0006][.E709.0000.0000] # CIRCLED IDEOGRAPH HAVE 1F236 ; [.FB40.0020.001C][.E709.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-6709 F929 ; [.FB40.0020.0002][.E717.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F929 @@ -29734,9 +30364,9 @@ FA93 ; [.FB40.0020.0002][.E71B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA93 2F8D9 ; [.FB40.0020.0002][.E71B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D9 2F8DA ; [.FB40.0020.0002][.E721.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DA 2F4A ; [.FB40.0020.0004][.E728.0000.0000] # KANGXI RADICAL TREE -322D ; [*0317.0020.0004][.FB40.0020.0004][.E728.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH WOOD +322D ; [*0318.0020.0004][.FB40.0020.0004][.E728.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH WOOD 328D ; [.FB40.0020.0006][.E728.0000.0000] # CIRCLED IDEOGRAPH WOOD -1F240 ; [*0379.0020.0004][.FB40.0020.0004][.E72C.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C +1F240 ; [*037A.0020.0004][.FB40.0020.0004][.E72C.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C F9E1 ; [.FB40.0020.0002][.E74E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E1 2F8DC ; [.FB40.0020.0002][.E753.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DC FA94 ; [.FB40.0020.0002][.E756.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA94 @@ -29748,7 +30378,7 @@ F9C9 ; [.FB40.0020.0002][.E7F3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C9 2F8DF ; [.FB40.0020.0002][.E7FA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8DF F9DA ; [.FB40.0020.0002][.E817.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DA 2F8E5 ; [.FB40.0020.0002][.E81F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E5 -3231 ; [*0317.0020.0004][.FB40.0020.0004][.E82A.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH STOCK +3231 ; [*0318.0020.0004][.FB40.0020.0004][.E82A.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH STOCK 3291 ; [.FB40.0020.0006][.E82A.0000.0000] # CIRCLED IDEOGRAPH STOCK 337F ; [.FB40.0020.001C][.E82A.0000.0000][.FB40.0020.001C][.DF0F.0000.0000][.FB40.0020.001C][.CF1A.0000.0000][.FB40.0020.001C][.F93E.0000.0000] # SQUARE CORPORATION 2F8E1 ; [.FB40.0020.0002][.E852.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8E1 @@ -29778,7 +30408,7 @@ F91D ; [.FB40.0020.0002][.EB04.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91D F98C ; [.FB40.0020.0002][.EB77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F98C FA95 ; [.FB40.0020.0002][.EB79.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA95 2F4D ; [.FB40.0020.0004][.EB79.0000.0000] # KANGXI RADICAL DEATH -2E9E ; [.FB40.0020.0004][.EB7A.0000.0000][.0000.0110.0004] # CJK RADICAL DEATH +2E9E ; [.FB40.0020.0004][.EB7A.0000.0000][.0000.0111.0004] # CJK RADICAL DEATH 2F8F4 ; [.FB40.0020.0002][.EB9F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8F4 F9A5 ; [.FB40.0020.0002][.EBAE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9A5 2F4E ; [.FB40.0020.0004][.EBB3.0000.0000] # KANGXI RADICAL WEAPON @@ -29794,7 +30424,7 @@ FA96 ; [.FB40.0020.0002][.EBBA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA96 2EA0 ; [.FB40.0020.0004][.EC11.0000.0000] # CJK RADICAL CIVILIAN 2F53 ; [.FB40.0020.0004][.EC14.0000.0000] # KANGXI RADICAL STEAM 2F54 ; [.FB40.0020.0004][.EC34.0000.0000] # KANGXI RADICAL WATER -322C ; [*0317.0020.0004][.FB40.0020.0004][.EC34.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH WATER +322C ; [*0318.0020.0004][.FB40.0020.0004][.EC34.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH WATER 328C ; [.FB40.0020.0006][.EC34.0000.0000] # CIRCLED IDEOGRAPH WATER 2EA1 ; [.FB40.0020.0004][.EC35.0000.0000] # CJK RADICAL WATER ONE 2EA2 ; [.FB40.0020.0004][.EC3A.0000.0000] # CJK RADICAL WATER TWO @@ -29850,7 +30480,7 @@ FA9B ; [.FB40.0020.0002][.F01E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9B 2F913 ; [.FB40.0020.0002][.F039.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F913 2F917 ; [.FB40.0020.0002][.F04A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F917 2F55 ; [.FB40.0020.0004][.F06B.0000.0000] # KANGXI RADICAL FIRE -322B ; [*0317.0020.0004][.FB40.0020.0004][.F06B.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FIRE +322B ; [*0318.0020.0004][.FB40.0020.0004][.F06B.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH FIRE 328B ; [.FB40.0020.0006][.F06B.0000.0000] # CIRCLED IDEOGRAPH FIRE 2EA3 ; [.FB40.0020.0004][.F06C.0000.0000] # CJK RADICAL FIRE 2F835 ; [.FB40.0020.0002][.F070.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F835 @@ -29858,7 +30488,7 @@ FA9B ; [.FB40.0020.0002][.F01E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9B 2F918 ; [.FB40.0020.0002][.F07D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F918 F9FB ; [.FB40.0020.0002][.F099.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9FB 2F91A ; [.FB40.0020.0002][.F0AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F91A -1F244 ; [*0379.0020.0004][.FB40.0020.0004][.F0B9.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 +1F244 ; [*037A.0020.0004][.FB40.0020.0004][.F0B9.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 F99F ; [.FB40.0020.0002][.F0C8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99F F916 ; [.FB40.0020.0002][.F0D9.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F916 1F21A ; [.FB40.0020.001C][.F121.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7121 @@ -29875,7 +30505,7 @@ F91E ; [.FB40.0020.0002][.F21B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91E 2F56 ; [.FB40.0020.0004][.F22A.0000.0000] # KANGXI RADICAL CLAW FA49 ; [.FB40.0020.0002][.F22B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA49 2EA4 ; [.FB40.0020.0004][.F22B.0000.0000] # CJK RADICAL PAW ONE -2EA5 ; [.FB40.0020.0004][.F22B.0000.0000][.0000.0110.0004] # CJK RADICAL PAW TWO +2EA5 ; [.FB40.0020.0004][.F22B.0000.0000][.0000.0111.0004] # CJK RADICAL PAW TWO FA9E ; [.FB40.0020.0002][.F235.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9E 2F921 ; [.FB40.0020.0002][.F235.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F921 2F57 ; [.FB40.0020.0004][.F236.0000.0000] # KANGXI RADICAL FATHER @@ -29885,9 +30515,9 @@ FA9E ; [.FB40.0020.0002][.F235.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA9E 2F922 ; [.FB40.0020.0002][.F250.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F922 2F5B ; [.FB40.0020.0004][.F259.0000.0000] # KANGXI RADICAL FANG 2F5C ; [.FB40.0020.0004][.F25B.0000.0000] # KANGXI RADICAL COW -2EA7 ; [.FB40.0020.0004][.F25B.0000.0000][.0000.0110.0004] # CJK RADICAL COW +2EA7 ; [.FB40.0020.0004][.F25B.0000.0000][.0000.0111.0004] # CJK RADICAL COW F946 ; [.FB40.0020.0002][.F262.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F946 -3235 ; [*0317.0020.0004][.FB40.0020.0004][.F279.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SPECIAL +3235 ; [*0318.0020.0004][.FB40.0020.0004][.F279.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH SPECIAL 3295 ; [.FB40.0020.0006][.F279.0000.0000] # CIRCLED IDEOGRAPH SPECIAL 2F924 ; [.FB40.0020.0002][.F280.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F924 2F925 ; [.FB40.0020.0002][.F295.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F925 @@ -29905,7 +30535,7 @@ F961 ; [.FB40.0020.0002][.F387.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F961 F9DB ; [.FB40.0020.0002][.F387.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9DB 2F5F ; [.FB40.0020.0004][.F389.0000.0000] # KANGXI RADICAL JADE 2F929 ; [.FB40.0020.0002][.F38B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F929 -2EA9 ; [.FB40.0020.0004][.F38B.0000.0000][.0000.0110.0004] # CJK RADICAL JADE +2EA9 ; [.FB40.0020.0004][.F38B.0000.0000][.0000.0111.0004] # CJK RADICAL JADE 2F92B ; [.FB40.0020.0002][.F3A5.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F92B F9AD ; [.FB40.0020.0002][.F3B2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AD F917 ; [.FB40.0020.0002][.F3DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F917 @@ -29940,7 +30570,7 @@ F976 ; [.FB40.0020.0002][.F565.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F976 F962 ; [.FB40.0020.0002][.F570.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F962 2F938 ; [.FB40.0020.0002][.F570.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F938 2F66 ; [.FB40.0020.0004][.F58B.0000.0000] # KANGXI RADICAL BOLT OF CLOTH -2EAA ; [.FB40.0020.0004][.F58B.0000.0000][.0000.0110.0004] # CJK RADICAL BOLT OF CLOTH +2EAA ; [.FB40.0020.0004][.F58B.0000.0000][.0000.0111.0004] # CJK RADICAL BOLT OF CLOTH 2F67 ; [.FB40.0020.0004][.F592.0000.0000] # KANGXI RADICAL SICKNESS F9E5 ; [.FB40.0020.0002][.F5E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E5 2F93A ; [.FB40.0020.0002][.F610.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F93A @@ -29954,13 +30584,13 @@ F90E ; [.FB40.0020.0002][.F669.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90E 2F6B ; [.FB40.0020.0004][.F6BF.0000.0000] # KANGXI RADICAL DISH FA17 ; [.FB40.0020.0002][.F6CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA17 FAA6 ; [.FB40.0020.0002][.F6CA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA6 -1F246 ; [*0379.0020.0004][.FB40.0020.0004][.F6D7.0000.0000][*037A.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 +1F246 ; [*037A.0020.0004][.FB40.0020.0004][.F6D7.0000.0000][*037B.0020.0004] # TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 FAA7 ; [.FB40.0020.0002][.F6DB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA7 -323C ; [*0317.0020.0004][.FB40.0020.0004][.F6E3.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SUPERVISE +323C ; [*0318.0020.0004][.FB40.0020.0004][.F6E3.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH SUPERVISE 32AC ; [.FB40.0020.0006][.F6E3.0000.0000] # CIRCLED IDEOGRAPH SUPERVISE F933 ; [.FB40.0020.0002][.F6E7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F933 2F6C ; [.FB40.0020.0004][.F6EE.0000.0000] # KANGXI RADICAL EYE -2EAB ; [.FB40.0020.0004][.F6EE.0000.0000][.0000.0110.0004] # CJK RADICAL EYE +2EAB ; [.FB40.0020.0004][.F6EE.0000.0000][.0000.0111.0004] # CJK RADICAL EYE FAA8 ; [.FB40.0020.0002][.F6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAA8 2F940 ; [.FB40.0020.0002][.F6F4.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F940 F96D ; [.FB40.0020.0002][.F701.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F96D @@ -29986,11 +30616,11 @@ FAAB ; [.FB40.0020.0002][.F8CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAAB F964 ; [.FB40.0020.0002][.F8FB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F964 F985 ; [.FB40.0020.0002][.F92A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F985 2F70 ; [.FB40.0020.0004][.F93A.0000.0000] # KANGXI RADICAL SPIRIT -2EAC ; [.FB40.0020.0004][.F93A.0000.0000][.0000.0110.0004] # CJK RADICAL SPIRIT ONE +2EAC ; [.FB40.0020.0004][.F93A.0000.0000][.0000.0111.0004] # CJK RADICAL SPIRIT ONE 2EAD ; [.FB40.0020.0004][.F93B.0000.0000] # CJK RADICAL SPIRIT TWO FA18 ; [.FB40.0020.0002][.F93C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA18 FA4C ; [.FB40.0020.0002][.F93E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4C -3233 ; [*0317.0020.0004][.FB40.0020.0004][.F93E.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SOCIETY +3233 ; [*0318.0020.0004][.FB40.0020.0004][.F93E.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH SOCIETY 3293 ; [.FB40.0020.0006][.F93E.0000.0000] # CIRCLED IDEOGRAPH SOCIETY FA4E ; [.FB40.0020.0002][.F948.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4E FA4D ; [.FB40.0020.0002][.F949.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4D @@ -29998,11 +30628,11 @@ FA4F ; [.FB40.0020.0002][.F950.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA4F FA50 ; [.FB40.0020.0002][.F956.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA50 2F953 ; [.FB40.0020.0002][.F956.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F953 FA51 ; [.FB40.0020.0002][.F95D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA51 -3237 ; [*0317.0020.0004][.FB40.0020.0004][.F95D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH CONGRATULATION +3237 ; [*0318.0020.0004][.FB40.0020.0004][.F95D.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH CONGRATULATION 3297 ; [.FB40.0020.0006][.F95D.0000.0000] # CIRCLED IDEOGRAPH CONGRATULATION FA19 ; [.FB40.0020.0002][.F95E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA19 FA1A ; [.FB40.0020.0002][.F965.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA1A -3240 ; [*0317.0020.0004][.FB40.0020.0004][.F96D.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FESTIVAL +3240 ; [*0318.0020.0004][.FB40.0020.0004][.F96D.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH FESTIVAL F93C ; [.FB40.0020.0002][.F97F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93C 1F232 ; [.FB40.0020.001C][.F981.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-7981 FA52 ; [.FB40.0020.0002][.F98D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA52 @@ -30028,7 +30658,7 @@ F9F7 ; [.FB40.0020.0002][.FACB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F7 2F74 ; [.FB40.0020.0004][.FACB.0000.0000] # KANGXI RADICAL STAND 2F95F ; [.FB40.0020.0002][.FAEE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F95F 2F75 ; [.FB40.0020.0004][.FAF9.0000.0000] # KANGXI RADICAL BAMBOO -2EAE ; [.FB40.0020.0004][.FAF9.0000.0000][.0000.0110.0004] # CJK RADICAL BAMBOO +2EAE ; [.FB40.0020.0004][.FAF9.0000.0000][.0000.0111.0004] # CJK RADICAL BAMBOO F9F8 ; [.FB40.0020.0002][.FB20.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F8 3247 ; [.FB40.0020.0006][.FB8F.0000.0000] # CIRCLED IDEOGRAPH KOTO FA56 ; [.FB40.0020.0002][.FBC0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA56 @@ -30071,17 +30701,17 @@ FA59 ; [.FB40.0020.0002][.FE41.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA59 FAB1 ; [.FB40.0020.0002][.FF3E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB1 2F79 ; [.FB40.0020.0004][.FF51.0000.0000] # KANGXI RADICAL NET 2EB2 ; [.FB40.0020.0004][.FF52.0000.0000] # CJK RADICAL NET TWO -2EB5 ; [.FB40.0020.0004][.FF52.0000.0000][.0000.0110.0004] # CJK RADICAL MESH +2EB5 ; [.FB40.0020.0004][.FF52.0000.0000][.0000.0111.0004] # CJK RADICAL MESH 2EB1 ; [.FB40.0020.0004][.FF53.0000.0000] # CJK RADICAL NET ONE -2EB3 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.0110.0004] # CJK RADICAL NET THREE -2EB4 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.0111.0004] # CJK RADICAL NET FOUR +2EB3 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.0111.0004] # CJK RADICAL NET THREE +2EB4 ; [.FB40.0020.0004][.FF53.0000.0000][.0000.0112.0004] # CJK RADICAL NET FOUR FA5A ; [.FB40.0020.0002][.FF72.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5A F9E6 ; [.FB40.0020.0002][.FF79.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E6 2F976 ; [.FB40.0020.0002][.FF7A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F976 F90F ; [.FB40.0020.0002][.FF85.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90F 2F7A ; [.FB40.0020.0004][.FF8A.0000.0000] # KANGXI RADICAL SHEEP -2EB6 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.0110.0004] # CJK RADICAL SHEEP -2EB7 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.0111.0004] # CJK RADICAL RAM +2EB6 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.0111.0004] # CJK RADICAL SHEEP +2EB7 ; [.FB40.0020.0004][.FF8A.0000.0000][.0000.0112.0004] # CJK RADICAL RAM 2EB8 ; [.FB40.0020.0004][.FF8B.0000.0000] # CJK RADICAL EWE 2F978 ; [.FB40.0020.0002][.FF95.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F978 F9AF ; [.FB40.0020.0002][.FF9A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9AF @@ -30103,10 +30733,10 @@ F997 ; [.FB41.0020.0002][.806F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F997 2F97F ; [.FB41.0020.0002][.8070.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F97F F945 ; [.FB41.0020.0002][.807E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F945 2F80 ; [.FB41.0020.0004][.807F.0000.0000] # KANGXI RADICAL BRUSH -2EBB ; [.FB41.0020.0004][.807F.0000.0000][.0000.0110.0004] # CJK RADICAL BRUSH TWO +2EBB ; [.FB41.0020.0004][.807F.0000.0000][.0000.0111.0004] # CJK RADICAL BRUSH TWO 2EBA ; [.FB41.0020.0004][.8080.0000.0000] # CJK RADICAL BRUSH ONE 2F81 ; [.FB41.0020.0004][.8089.0000.0000] # KANGXI RADICAL MEAT -2EBC ; [.FB41.0020.0004][.8089.0000.0000][.0000.0110.0004] # CJK RADICAL MEAT +2EBC ; [.FB41.0020.0004][.8089.0000.0000][.0000.0111.0004] # CJK RADICAL MEAT F953 ; [.FB41.0020.0002][.808B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F953 2F8D6 ; [.FB41.0020.0002][.80AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F8D6 2F982 ; [.FB41.0020.0002][.80B2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F982 @@ -30116,12 +30746,12 @@ F926 ; [.FB41.0020.0002][.81D8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F926 2F82 ; [.FB41.0020.0004][.81E3.0000.0000] # KANGXI RADICAL MINISTER F9F6 ; [.FB41.0020.0002][.81E8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9F6 2F83 ; [.FB41.0020.0004][.81EA.0000.0000] # KANGXI RADICAL SELF -3242 ; [*0317.0020.0004][.FB41.0020.0004][.81EA.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH SELF +3242 ; [*0318.0020.0004][.FB41.0020.0004][.81EA.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH SELF FA5C ; [.FB41.0020.0002][.81ED.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5C 2F84 ; [.FB41.0020.0004][.81F3.0000.0000] # KANGXI RADICAL ARRIVE -3243 ; [*0317.0020.0004][.FB41.0020.0004][.81F3.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH REACH +3243 ; [*0318.0020.0004][.FB41.0020.0004][.81F3.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH REACH 2F85 ; [.FB41.0020.0004][.81FC.0000.0000] # KANGXI RADICAL MORTAR -2EBD ; [.FB41.0020.0004][.81FC.0000.0000][.0000.0110.0004] # CJK RADICAL MORTAR +2EBD ; [.FB41.0020.0004][.81FC.0000.0000][.0000.0111.0004] # CJK RADICAL MORTAR 2F893 ; [.FB41.0020.0002][.8201.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F893 2F98B ; [.FB41.0020.0002][.8201.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98B 2F98C ; [.FB41.0020.0002][.8204.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98C @@ -30136,8 +30766,8 @@ F97C ; [.FB41.0020.0002][.826F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97C FA5D ; [.FB41.0020.0002][.8279.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5D FA5E ; [.FB41.0020.0002][.8279.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA5E 2EBE ; [.FB41.0020.0004][.8279.0000.0000] # CJK RADICAL GRASS ONE -2EBF ; [.FB41.0020.0004][.8279.0000.0000][.0000.0110.0004] # CJK RADICAL GRASS TWO -2EC0 ; [.FB41.0020.0004][.8279.0000.0000][.0000.0111.0004] # CJK RADICAL GRASS THREE +2EBF ; [.FB41.0020.0004][.8279.0000.0000][.0000.0111.0004] # CJK RADICAL GRASS TWO +2EC0 ; [.FB41.0020.0004][.8279.0000.0000][.0000.0112.0004] # CJK RADICAL GRASS THREE 2F990 ; [.FB41.0020.0002][.828B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F990 2F98F ; [.FB41.0020.0002][.8291.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F98F 2F991 ; [.FB41.0020.0002][.829D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F991 @@ -30227,7 +30857,7 @@ FAB8 ; [.FB41.0020.0002][.8996.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAB8 2EC5 ; [.FB41.0020.0004][.89C1.0000.0000] # CJK RADICAL C-SIMPLIFIED SEE 2EC6 ; [.FB41.0020.0004][.89D2.0000.0000] # CJK RADICAL SIMPLIFIED HORN 2F93 ; [.FB41.0020.0004][.89D2.0000.0000] # KANGXI RADICAL HORN -2EC7 ; [.FB41.0020.0004][.89D2.0000.0000][.0000.0110.0004] # CJK RADICAL HORN +2EC7 ; [.FB41.0020.0004][.89D2.0000.0000][.0000.0111.0004] # CJK RADICAL HORN 1F216 ; [.FB41.0020.001C][.89E3.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-89E3 2F94 ; [.FB41.0020.0004][.8A00.0000.0000] # KANGXI RADICAL SPEECH 2F9CF ; [.FB41.0020.0002][.8AA0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9CF @@ -30259,13 +30889,13 @@ F900 ; [.FB41.0020.0002][.8C48.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F900 2F97 ; [.FB41.0020.0004][.8C55.0000.0000] # KANGXI RADICAL PIG 2F98 ; [.FB41.0020.0004][.8C78.0000.0000] # KANGXI RADICAL BADGER 2F99 ; [.FB41.0020.0004][.8C9D.0000.0000] # KANGXI RADICAL SHELL -3236 ; [*0317.0020.0004][.FB41.0020.0004][.8CA1.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH FINANCIAL +3236 ; [*0318.0020.0004][.FB41.0020.0004][.8CA1.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH FINANCIAL 3296 ; [.FB41.0020.0006][.8CA1.0000.0000] # CIRCLED IDEOGRAPH FINANCIAL 1F223 ; [.FB41.0020.001C][.8CA9.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-8CA9 2F9D4 ; [.FB41.0020.0002][.8CAB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D4 2F9D5 ; [.FB41.0020.0002][.8CC1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D5 F948 ; [.FB41.0020.0002][.8CC2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F948 -323E ; [*0317.0020.0004][.FB41.0020.0004][.8CC7.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH RESOURCE +323E ; [*0318.0020.0004][.FB41.0020.0004][.8CC7.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH RESOURCE 32AE ; [.FB41.0020.0006][.8CC7.0000.0000] # CIRCLED IDEOGRAPH RESOURCE F903 ; [.FB41.0020.0002][.8CC8.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F903 FA64 ; [.FB41.0020.0002][.8CD3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA64 @@ -30278,7 +30908,7 @@ FAC1 ; [.FB41.0020.0002][.8D08.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC1 1F230 ; [.FB41.0020.001C][.8D70.0000.0000] # SQUARED CJK UNIFIED IDEOGRAPH-8D70 2F9D7 ; [.FB41.0020.0002][.8D77.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9D7 2F9C ; [.FB41.0020.0004][.8DB3.0000.0000] # KANGXI RADICAL FOOT -2ECA ; [.FB41.0020.0004][.8DB3.0000.0000][.0000.0110.0004] # CJK RADICAL FOOT +2ECA ; [.FB41.0020.0004][.8DB3.0000.0000][.0000.0111.0004] # CJK RADICAL FOOT 2F9DB ; [.FB41.0020.0002][.8DBC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DB 2F9DA ; [.FB41.0020.0002][.8DCB.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9DA F937 ; [.FB41.0020.0002][.8DEF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F937 @@ -30301,8 +30931,8 @@ F971 ; [.FB41.0020.0002][.8FB0.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F971 2FA1 ; [.FB41.0020.0004][.8FB5.0000.0000] # KANGXI RADICAL WALK FA66 ; [.FB41.0020.0002][.8FB6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA66 2ECC ; [.FB41.0020.0004][.8FB6.0000.0000] # CJK RADICAL SIMPLIFIED WALK -2ECD ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.0110.0004] # CJK RADICAL WALK ONE -2ECE ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.0111.0004] # CJK RADICAL WALK TWO +2ECD ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.0111.0004] # CJK RADICAL WALK ONE +2ECE ; [.FB41.0020.0004][.8FB6.0000.0000][.0000.0112.0004] # CJK RADICAL WALK TWO F99A ; [.FB41.0020.0002][.9023.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F99A FA25 ; [.FB41.0020.0002][.9038.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA25 FA67 ; [.FB41.0020.0002][.9038.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA67 @@ -30312,7 +30942,7 @@ FAC3 ; [.FB41.0020.0002][.9072.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC3 F9C3 ; [.FB41.0020.0002][.907C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C3 F913 ; [.FB41.0020.0002][.908F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F913 2FA2 ; [.FB41.0020.0004][.9091.0000.0000] # KANGXI RADICAL CITY -2ECF ; [.FB41.0020.0004][.9091.0000.0000][.0000.0110.0004] # CJK RADICAL CITY +2ECF ; [.FB41.0020.0004][.9091.0000.0000][.0000.0111.0004] # CJK RADICAL CITY 2F9E2 ; [.FB41.0020.0002][.9094.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E2 F92C ; [.FB41.0020.0002][.90CE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F92C FA2E ; [.FB41.0020.0002][.90DE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2E @@ -30331,7 +30961,7 @@ F9E9 ; [.FB41.0020.0002][.91CC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9E9 F97E ; [.FB41.0020.0002][.91CF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F97E F90A ; [.FB41.0020.0002][.91D1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F90A 2FA6 ; [.FB41.0020.0004][.91D1.0000.0000] # KANGXI RADICAL GOLD -322E ; [*0317.0020.0004][.FB41.0020.0004][.91D1.0000.0000][*0318.0020.0004] # PARENTHESIZED IDEOGRAPH METAL +322E ; [*0318.0020.0004][.FB41.0020.0004][.91D1.0000.0000][*0319.0020.0004] # PARENTHESIZED IDEOGRAPH METAL 328E ; [.FB41.0020.0006][.91D1.0000.0000] # CIRCLED IDEOGRAPH METAL F9B1 ; [.FB41.0020.0002][.9234.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B1 2F9E7 ; [.FB41.0020.0002][.9238.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9E7 @@ -30354,7 +30984,7 @@ F986 ; [.FB41.0020.0002][.95AD.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F986 2F9F0 ; [.FB41.0020.0002][.95B7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F0 2ED4 ; [.FB41.0020.0004][.95E8.0000.0000] # CJK RADICAL C-SIMPLIFIED GATE 2FA9 ; [.FB41.0020.0004][.961C.0000.0000] # KANGXI RADICAL MOUND -2ED5 ; [.FB41.0020.0004][.961C.0000.0000][.0000.0110.0004] # CJK RADICAL MOUND ONE +2ED5 ; [.FB41.0020.0004][.961C.0000.0000][.0000.0111.0004] # CJK RADICAL MOUND ONE 2ED6 ; [.FB41.0020.0004][.961D.0000.0000] # CJK RADICAL MOUND TWO F9C6 ; [.FB41.0020.0002][.962E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C6 F951 ; [.FB41.0020.0002][.964B.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F951 @@ -30373,7 +31003,7 @@ F9EA ; [.FB41.0020.0002][.96E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9EA FA68 ; [.FB41.0020.0002][.96E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA68 FAC7 ; [.FB41.0020.0002][.96E3.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAC7 2FAC ; [.FB41.0020.0004][.96E8.0000.0000] # KANGXI RADICAL RAIN -2ED7 ; [.FB41.0020.0004][.96E8.0000.0000][.0000.0110.0004] # CJK RADICAL RAIN +2ED7 ; [.FB41.0020.0004][.96E8.0000.0000][.0000.0111.0004] # CJK RADICAL RAIN F9B2 ; [.FB41.0020.0002][.96F6.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9B2 F949 ; [.FB41.0020.0002][.96F7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F949 2F9F5 ; [.FB41.0020.0002][.9723.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2F9F5 @@ -30412,7 +31042,7 @@ F9D0 ; [.FB41.0020.0002][.985E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9D0 2EDD ; [.FB41.0020.0004][.98DF.0000.0000] # CJK RADICAL EAT ONE 2FB7 ; [.FB41.0020.0004][.98DF.0000.0000] # KANGXI RADICAL EAT 2EDF ; [.FB41.0020.0004][.98E0.0000.0000] # CJK RADICAL EAT THREE -2EDE ; [.FB41.0020.0004][.98E0.0000.0000][.0000.0110.0004] # CJK RADICAL EAT TWO +2EDE ; [.FB41.0020.0004][.98E0.0000.0000][.0000.0111.0004] # CJK RADICAL EAT TWO 2FA02 ; [.FB41.0020.0002][.98E2.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA02 FA2A ; [.FB41.0020.0002][.98EF.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2A FA2B ; [.FB41.0020.0002][.98FC.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2B @@ -30420,7 +31050,7 @@ FA2C ; [.FB41.0020.0002][.9928.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA2C 2FA04 ; [.FB41.0020.0002][.9929.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA04 2EE0 ; [.FB41.0020.0004][.9963.0000.0000] # CJK RADICAL C-SIMPLIFIED EAT 2FB8 ; [.FB41.0020.0004][.9996.0000.0000] # KANGXI RADICAL HEAD -2EE1 ; [.FB41.0020.0004][.9996.0000.0000][.0000.0110.0004] # CJK RADICAL HEAD +2EE1 ; [.FB41.0020.0004][.9996.0000.0000][.0000.0111.0004] # CJK RADICAL HEAD 2FB9 ; [.FB41.0020.0004][.9999.0000.0000] # KANGXI RADICAL FRAGRANT 2FA05 ; [.FB41.0020.0002][.99A7.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA05 2FBA ; [.FB41.0020.0004][.99AC.0000.0000] # KANGXI RADICAL HORSE @@ -30430,7 +31060,7 @@ F91A ; [.FB41.0020.0002][.99F1.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F91A F987 ; [.FB41.0020.0002][.9A6A.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F987 2EE2 ; [.FB41.0020.0004][.9A6C.0000.0000] # CJK RADICAL C-SIMPLIFIED HORSE 2FBB ; [.FB41.0020.0004][.9AA8.0000.0000] # KANGXI RADICAL BONE -2EE3 ; [.FB41.0020.0004][.9AA8.0000.0000][.0000.0110.0004] # CJK RADICAL BONE +2EE3 ; [.FB41.0020.0004][.9AA8.0000.0000][.0000.0111.0004] # CJK RADICAL BONE 2FBC ; [.FB41.0020.0004][.9AD8.0000.0000] # KANGXI RADICAL TALL 2FBD ; [.FB41.0020.0004][.9ADF.0000.0000] # KANGXI RADICAL HAIR FACD ; [.FB41.0020.0002][.9B12.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACD @@ -30439,7 +31069,7 @@ FACD ; [.FB41.0020.0002][.9B12.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACD 2FBF ; [.FB41.0020.0004][.9B2F.0000.0000] # KANGXI RADICAL SACRIFICIAL WINE 2FC0 ; [.FB41.0020.0004][.9B32.0000.0000] # KANGXI RADICAL CAULDRON 2FC1 ; [.FB41.0020.0004][.9B3C.0000.0000] # KANGXI RADICAL GHOST -2EE4 ; [.FB41.0020.0004][.9B3C.0000.0000][.0000.0110.0004] # CJK RADICAL GHOST +2EE4 ; [.FB41.0020.0004][.9B3C.0000.0000][.0000.0111.0004] # CJK RADICAL GHOST 2FC2 ; [.FB41.0020.0004][.9B5A.0000.0000] # KANGXI RADICAL FISH F939 ; [.FB41.0020.0002][.9B6F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F939 2FA0B ; [.FB41.0020.0002][.9C40.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-2FA0B @@ -30453,7 +31083,7 @@ F93A ; [.FB41.0020.0002][.9DFA.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F93A F920 ; [.FB41.0020.0002][.9E1E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F920 2EE6 ; [.FB41.0020.0004][.9E1F.0000.0000] # CJK RADICAL C-SIMPLIFIED BIRD 2FC4 ; [.FB41.0020.0004][.9E75.0000.0000] # KANGXI RADICAL SALT -2EE7 ; [.FB41.0020.0004][.9E75.0000.0000][.0000.0110.0004] # CJK RADICAL C-SIMPLIFIED SALT +2EE7 ; [.FB41.0020.0004][.9E75.0000.0000][.0000.0111.0004] # CJK RADICAL C-SIMPLIFIED SALT F940 ; [.FB41.0020.0002][.9E7F.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F940 2FC5 ; [.FB41.0020.0004][.9E7F.0000.0000] # KANGXI RADICAL DEER F988 ; [.FB41.0020.0002][.9E97.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F988 @@ -30482,22 +31112,22 @@ F989 ; [.FB41.0020.0002][.9ECE.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F989 2FD0 ; [.FB41.0020.0004][.9F3B.0000.0000] # KANGXI RADICAL NOSE FAD8 ; [.FB41.0020.0002][.9F43.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD8 2FD1 ; [.FB41.0020.0004][.9F4A.0000.0000] # KANGXI RADICAL EVEN -2EEB ; [.FB41.0020.0004][.9F4A.0000.0000][.0000.0110.0004] # CJK RADICAL J-SIMPLIFIED EVEN +2EEB ; [.FB41.0020.0004][.9F4A.0000.0000][.0000.0111.0004] # CJK RADICAL J-SIMPLIFIED EVEN 2EEC ; [.FB41.0020.0004][.9F50.0000.0000] # CJK RADICAL C-SIMPLIFIED EVEN 2FD2 ; [.FB41.0020.0004][.9F52.0000.0000] # KANGXI RADICAL TOOTH -2EED ; [.FB41.0020.0004][.9F52.0000.0000][.0000.0110.0004] # CJK RADICAL J-SIMPLIFIED TOOTH +2EED ; [.FB41.0020.0004][.9F52.0000.0000][.0000.0111.0004] # CJK RADICAL J-SIMPLIFIED TOOTH 2EEE ; [.FB41.0020.0004][.9F7F.0000.0000] # CJK RADICAL C-SIMPLIFIED TOOTH F9C4 ; [.FB41.0020.0002][.9F8D.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F9C4 2FD3 ; [.FB41.0020.0004][.9F8D.0000.0000] # KANGXI RADICAL DRAGON -2EEF ; [.FB41.0020.0004][.9F8D.0000.0000][.0000.0110.0004] # CJK RADICAL J-SIMPLIFIED DRAGON +2EEF ; [.FB41.0020.0004][.9F8D.0000.0000][.0000.0111.0004] # CJK RADICAL J-SIMPLIFIED DRAGON FAD9 ; [.FB41.0020.0002][.9F8E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FAD9 2EF0 ; [.FB41.0020.0004][.9F99.0000.0000] # CJK RADICAL C-SIMPLIFIED DRAGON F907 ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F907 F908 ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-F908 FACE ; [.FB41.0020.0002][.9F9C.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FACE 2FD4 ; [.FB41.0020.0004][.9F9C.0000.0000] # KANGXI RADICAL TURTLE -2EF1 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.0110.0004] # CJK RADICAL TURTLE -2EF2 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.0111.0004] # CJK RADICAL J-SIMPLIFIED TURTLE +2EF1 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.0111.0004] # CJK RADICAL TURTLE +2EF2 ; [.FB41.0020.0004][.9F9C.0000.0000][.0000.0112.0004] # CJK RADICAL J-SIMPLIFIED TURTLE 2EF3 ; [.FB41.0020.0004][.9F9F.0000.0000] # CJK RADICAL C-SIMPLIFIED TURTLE 2FD5 ; [.FB41.0020.0004][.9FA0.0000.0000] # KANGXI RADICAL FLUTE FA0E ; [.FB41.0020.0002][.FA0E.0000.0000] # CJK COMPATIBILITY IDEOGRAPH-FA0E diff --git a/tools-for-build/more-ucd-consts.lisp-expr b/tools-for-build/more-ucd-consts.lisp-expr index 120b89268e..eb889eeac6 100644 --- a/tools-for-build/more-ucd-consts.lisp-expr +++ b/tools-for-build/more-ucd-consts.lisp-expr @@ -36,7 +36,8 @@ "Psalter_Pahlavi" "Grantha" "Mro" "Siddham" "Khojki" "Nabataean" "Tirhuta" "Khudawadi" "Old_North_Arabian" "Warang_Citi" "Linear_A" "Old_Permic" "Ahom" "Anatolian_Hieroglyphs" "Hatran" "Multani" "Old_Hungarian" - "SignWriting" "Adlam" "Bhaiksuki" "Marchen" "Newa" "Osage" "Tangut")) + "SignWriting" "Adlam" "Bhaiksuki" "Marchen" "Newa" "Osage" "Tangut" + "Masaram_Gondi" "Nushu" "Soyombo" "Zanabazar_Square")) (*line-break-classes* ("XX" "AI" "AL" "B2" "BA" "BB" "BK" "CB" "CJ" "CL" "CM" "CP" "CR" "EB" "EM" diff --git a/tools-for-build/ucd.lisp b/tools-for-build/ucd.lisp index 3606c1d1e0..f656b38a16 100644 --- a/tools-for-build/ucd.lisp +++ b/tools-for-build/ucd.lisp @@ -334,12 +334,12 @@ Length should be adjusted when the standard changes.") (when (ordered-ranges-member code-point vector) (gethash class *bidi-classes*)))) (cond - ((in - #(#x0600 #x07BF #x08A0 #x08FF #xFB50 #xFDCF #xFDF0 #xFDFF #xFE70 #xFEFF - #x1EE00 #x1EEFF) "AL")) - ((in - #(#x0590 #x05FF #x07C0 #x089F #xFB1D #xFB4F #x10800 #x10FFF #x1E800 #x1EDFF - #x1EF00 #x1EFFF) "R")) + ((in #(#x0600 #x07BF #x0860 #x086F #x08A0 #x08FF + #xFB50 #xFDCF #xFDF0 #xFDFF #xFE70 #xFEFF + #x1EE00 #x1EEFF) "AL")) + ((in #(#x0590 #x05FF #x07C0 #x085F #x0870 #x089F + #xFB1D #xFB4F #x10800 #x10FFF #x1E800 #x1EDFF + #x1EF00 #x1EFFF) "R")) ((in #(#x20A0 #x20CF) "ET")) ;; BN is non-characters and default-ignorable. ;; Default-ignorable will be dealt with elsewhere @@ -732,7 +732,8 @@ Length should be adjusted when the standard changes.") (parse-property s :variation-selector) (parse-property s :pattern-white-space) (parse-property s :pattern-syntax) - (parse-property s :prepended-concatenation-mark)) + (parse-property s :prepended-concatenation-mark) + (parse-property s :regional-indicator)) (with-input-utf8-file (s "DerivedNormalizationProps") (parse-property s) ;; Initial comments From 60741b944f980ae2c3ce97d83c43f8390e93760f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 12 Jul 2022 19:05:15 -0400 Subject: [PATCH 3676/4023] win32: prevent memory access exceptions if #+soft-card-marks Also: * correct boundary condition when comparing rip against space end * never use AVERLAX- there's no such thing as a "maybe" invariant This was tested only on 64-bit. It should be harmless on 32-bit, but I'll have to just wait and see if any problem reports come up. --- src/runtime/fullcgc.c | 2 ++ src/runtime/gencgc.c | 22 ++++++++++++++- src/runtime/os.h | 2 +- src/runtime/private-cons.inc | 10 ++++--- src/runtime/win32-os.c | 54 ++++++++++-------------------------- src/runtime/win32-os.h | 2 +- 6 files changed, 45 insertions(+), 47 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index e41c135086..4fec110594 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -96,6 +96,8 @@ static void* get_free_page(boolean prezero) { char* mem = page_address(free_page); #ifdef LISP_FEATURE_DARWIN_JIT prezero = 1; // Might need to alter MMU-based protection +#elif defined LISP_FEATURE_WIN32 + os_commit_memory(page_address(free_page), GENCGC_PAGE_BYTES); #endif if (prezero) zeroize_pages_if_needed(free_page, free_page, 0); return mem; diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 69090d43bd..2c7f3eafe6 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -701,7 +701,7 @@ report_heap_exhaustion(long available, long requested, struct thread *th) static void __attribute__((unused)) zero_range_with_mmap(os_vm_address_t addr, os_vm_size_t length) { #ifdef LISP_FEATURE_WIN32 - os_revalidate_bzero(addr, length); + os_decommit_mem(addr, length); #elif defined LISP_FEATURE_LINUX // We use MADV_DONTNEED only on Linux due to differing semantics from BSD. // Linux treats it as a demand that the memory be 0-filled, or refreshed @@ -1106,6 +1106,9 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re if (!page_words_used(page)) /* May need to be remapped from PAGE_TYPE_CODE */ zeroize_pages_if_needed(page, page, page_type); +#elif defined LISP_FEATURE_WIN32 + // don't incur access violations + os_commit_memory(page_address(page), GENCGC_PAGE_BYTES); #endif // TODO: move this out of the mutex scope if (page_type == PAGE_TYPE_CONS && !page_words_used(page)) @@ -1177,6 +1180,11 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re for(p=remap_from; p<=last_page; ++p) set_page_need_to_zero(p,0); } } +#elif defined LISP_FEATURE_WIN32 + // don't incur access violations + long commit_from = first_page + (page_words_used(first_page)?1:0); + long len = npage_bytes(1+last_page-commit_from); + os_commit_memory(page_address(commit_from), len); #endif if (unlock) { int __attribute__((unused)) ret = mutex_release(&free_pages_lock); @@ -1407,6 +1415,11 @@ void *gc_alloc_large(sword_t nbytes, int page_type) page_table[page].gen = gc_alloc_generation; } +#ifdef LISP_FEATURE_WIN32 + // don't incur access violations + os_commit_memory(page_address(first_page), npage_bytes(1+last_page-first_page)); +#endif + // Store a filler so that a linear heap walk does not try to examine // these pages cons-by-cons (or whatever they happen to look like). // A concurrent walk would probably crash anyway, and most certainly @@ -4728,6 +4741,12 @@ collect_garbage(generation_index_t last_gen) if (gen > small_generation_limit) { if (next_free_page > high_water_mark) high_water_mark = next_free_page; + // BUG? high_water_mark is the highest value of next_free_page, + // which means that page_table[high_water_mark] was actually NOT ever + // used, because next_free_page is an exclusive bound on the range + // of pages used. But remap_free_pages takes to 'to' as an *inclusive* + // bound. The only reason it's not an array overrun error is that + // the page_table has one more element than there are pages. remap_free_pages(0, high_water_mark); high_water_mark = 0; } @@ -5690,6 +5709,7 @@ void gc_load_corefile_ptes(int card_table_nbits, /* It is possible, though rare, for the saved page table * to contain free pages below alloc_ptr. */ if (type != FREE_PAGE_FLAG) { + gc_assert(pte.words_used); page_table[page].words_used_ = pte.words_used; set_page_scan_start_offset(page, pte.sso & ~0x07); page_table[page].gen = gen; diff --git a/src/runtime/os.h b/src/runtime/os.h index afae2d8256..49f9d9519d 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -111,7 +111,7 @@ extern os_vm_address_t os_validate(int movable, os_vm_size_t len, int execute, int jit); #ifdef LISP_FEATURE_WIN32 -void* os_commit_memory(os_vm_address_t addr, os_vm_size_t len); +void os_commit_memory(os_vm_address_t addr, os_vm_size_t len); os_vm_address_t os_validate_nocommit(int attributes, os_vm_address_t addr, os_vm_size_t len); #endif diff --git a/src/runtime/private-cons.inc b/src/runtime/private-cons.inc index 2d15bc22e0..7f86804903 100644 --- a/src/runtime/private-cons.inc +++ b/src/runtime/private-cons.inc @@ -91,6 +91,8 @@ static struct cons* private_cons_impl() // UNBOXED pages do not generally required zero-fill. // arm64+Darwin might perform zeroing to alter MMU-based protection. zeroize_pages_if_needed(page, page, PAGE_TYPE_UNBOXED); +#elif defined LISP_FEATURE_WIN32 + os_commit_memory(page_address(page), GENCGC_PAGE_BYTES); #endif page_index_t tail = private_cons_page_chain; page_header->car = 0; // unused @@ -105,12 +107,12 @@ static struct cons* private_cons_impl() static void release_pages_impl() { - struct cons* list; + struct cons *list, *next; if (private_cons_page_chain >= 0) { - for (list = (struct cons*)page_address(private_cons_page_chain) ; - list ; - list = (struct cons*)list->cdr) { + for (list = (struct cons*)page_address(private_cons_page_chain) ; + list ; list = next) { page_index_t index = find_page_index(list); + next = (struct cons*)list->cdr; // read prior to decommitting (if we do that) if (PRIVATE_CONS_DEBUG) fprintf(stderr, "Freeing GC-private page @ %p (index %ld)\n", list, (long)index); diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index d04c1b8f3e..287b75fc7d 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -92,11 +92,6 @@ typedef CHAR console_char; /* win_aver function: basic building block for miscellaneous * ..AVER.. macrology (below) */ -/* To do: These routines used to be "customizable" with dyndebug_init() - * and variables like dyndebug_survive_aver, dyndebug_skip_averlax based - * on environment variables. Those features got lost on the way, but - * ought to be reintroduced. */ - static inline intptr_t win_aver(intptr_t value, char* comment, char* file, int line, int justwarn) @@ -173,17 +168,6 @@ intptr_t sys_aver(long value, char* comment, char* file, int line, win_aver((intptr_t)(call), #call, __FILE__, __LINE__, 0); \ me;}) -/* AVERLAX(call): do the same check as AVER did, but be mild on - * failure: print an annoying unrequested message to stderr, and - * continue. With dyndebug_skip_averlax flag, AVERLAX stop even to - * check and complain. */ - -#define AVERLAX(call) \ - ({ __typeof__(call) __attribute__((unused)) me = \ - (__typeof__(call)) \ - win_aver((intptr_t)(call), #call, __FILE__, __LINE__, 1); \ - me;}) - /* Now, when failed AVER... prints both errno and GetLastError(), two * variants of "POSIX/lowio" style checks below are almost useless * (they build on sys_aver like the two above do on win_aver). */ @@ -194,12 +178,6 @@ intptr_t sys_aver(long value, char* comment, char* file, int line, sys_aver((call), #call, __FILE__, __LINE__, 0); \ me;}) -#define CRT_AVERLAX_NONNEGATIVE(call) \ - ({ __typeof__(call) __attribute__((unused)) me = \ - (__typeof__(call)) \ - sys_aver((call), #call, __FILE__, __LINE__, 1); \ - me;}) - /* to be removed */ #define CRT_AVER(booly) \ ({ __typeof__(booly) __attribute__((unused)) me = (booly); \ @@ -889,7 +867,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, if (!addr) { int protection = attributes & IS_GUARD_PAGE ? PAGE_NOACCESS : PAGE_EXECUTE_READWRITE; return - AVERLAX(VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, protection)); + AVER(VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, protection)); } os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); @@ -903,7 +881,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, return 0; } - return AVERLAX(VirtualAlloc(NULL, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE)); + return AVER(VirtualAlloc(NULL, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE)); } return actual; @@ -923,27 +901,26 @@ os_validate_nocommit(int attributes, os_vm_address_t addr, os_vm_size_t len) fflush(stderr); return 0; } - return AVERLAX(VirtualAlloc(NULL, len, MEM_RESERVE, PAGE_EXECUTE_READWRITE)); + return AVER(VirtualAlloc(NULL, len, MEM_RESERVE, PAGE_EXECUTE_READWRITE)); } return actual; } -void* os_commit_memory(os_vm_address_t addr, os_vm_size_t len) +void os_commit_memory(os_vm_address_t addr, os_vm_size_t len) { - return - AVERLAX(VirtualAlloc(addr, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE)); + if (len) gc_assert(VirtualAlloc(addr, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE)); } - -void os_revalidate_bzero(os_vm_address_t addr, os_vm_size_t len) { - AVERLAX(VirtualFree(addr, len, MEM_DECOMMIT)); +void os_decommit_mem(os_vm_address_t addr, os_vm_size_t len) { + gc_assert(gc_active_p); + gc_assert(VirtualFree(addr, len, MEM_DECOMMIT)); } void os_invalidate(os_vm_address_t addr, os_vm_size_t len) { - AVERLAX(VirtualFree(addr, 0, MEM_RELEASE)); + AVER(VirtualFree(addr, 0, MEM_RELEASE)); } /* @@ -1117,7 +1094,6 @@ handle_access_violation(os_context_t *ctx, #endif /* Safepoint pages */ -#ifdef LISP_FEATURE_SB_THREAD if (fault_address == (void *) GC_SAFEPOINT_TRAP_ADDR) { thread_in_lisp_raised(ctx); return 0; @@ -1127,15 +1103,13 @@ handle_access_violation(os_context_t *ctx, thread_in_safety_transition(ctx); return 0; } -#endif /* dynamic space */ page_index_t page = find_page_index(fault_address); - if (page != -1 -#ifndef LISP_FEATURE_SOFT_CARD_MARKS - && !PAGE_WRITEPROTECTED_P(page) +#ifdef LISP_FEATURE_SOFT_CARD_MARKS + if (page >= 0) lose("should not get access violation in dynamic space"); #endif - ) { + if (page != -1 && !PAGE_WRITEPROTECTED_P(page)) { os_commit_memory(PTR_ALIGN_DOWN(fault_address, os_vm_page_size), os_vm_page_size); return 0; @@ -1385,9 +1359,9 @@ veh(EXCEPTION_POINTERS *ep) DWORD code = ep->ExceptionRecord->ExceptionCode; BOOL from_lisp = (rip >= READ_ONLY_SPACE_START && - rip <= READ_ONLY_SPACE_END) || + rip < READ_ONLY_SPACE_END) || (rip >= DYNAMIC_SPACE_START && - rip <= DYNAMIC_SPACE_START+dynamic_space_size); + rip < DYNAMIC_SPACE_START+dynamic_space_size); if (code == EXCEPTION_ACCESS_VIOLATION || code == STATUS_HEAP_CORRUPTION || diff --git a/src/runtime/win32-os.h b/src/runtime/win32-os.h index 470ed6bb65..4e2bb1d81e 100644 --- a/src/runtime/win32-os.h +++ b/src/runtime/win32-os.h @@ -85,7 +85,7 @@ void wos_install_interrupt_handlers(struct lisp_exception_frame *handler); char *dirname(char *path); boolean win32_maybe_interrupt_io(void* thread); -void os_revalidate_bzero(os_vm_address_t addr, os_vm_size_t len); +void os_decommit_mem(os_vm_address_t addr, os_vm_size_t len); int sb_pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset); From 0d0fb00059a1f1cbd7efbeecb87b9c649e2ab5c2 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 13 Jul 2022 02:11:47 +0300 Subject: [PATCH 3677/4023] arm64: support immediate float constants. --- float-math.lisp-expr | 1 + src/compiler/arm64/float.lisp | 7 +++++- src/compiler/arm64/insts.lisp | 5 ++-- src/compiler/arm64/macros.lisp | 5 +--- src/compiler/arm64/target-insts.lisp | 36 +++++++++++++++++++++------- src/compiler/arm64/vm.lisp | 17 +++++++------ 6 files changed, 48 insertions(+), 23 deletions(-) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index f47da5616f..15e0a1fe0d 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -3178,6 +3178,7 @@ (>= (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#x4000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #x0) T) +(>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) T) diff --git a/src/compiler/arm64/float.lisp b/src/compiler/arm64/float.lisp index 28092d66df..b5d9872821 100644 --- a/src/compiler/arm64/float.lisp +++ b/src/compiler/arm64/float.lisp @@ -28,6 +28,12 @@ (define-move-fun (store-double 2) (vop x y) ((double-reg) (double-stack)) (storew x (current-nfp-tn vop) (tn-offset y))) + +(define-move-fun (load-fp-immediate 1) (vop x y) + ((single-immediate) (single-reg) + (double-immediate) (double-reg)) + (load-inline-constant y (tn-value x))) + ;;;; Move VOPs: @@ -189,7 +195,6 @@ (define-move-vop move-from-complex-double :move (complex-double-reg) (descriptor-reg)) - ;;; ;;; Move from a descriptor to a complex float register ;;; diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index ff75ea5443..433e3a5a57 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -2540,9 +2540,8 @@ (one-instruction-emitter (segment position) (emit-ldr-literal segment (sc-case dest - (32-bit-reg #b00) - (sb-vm::complex-double-reg - #b10) + ((32-bit-reg single-reg) #b00) + (complex-double-reg #b10) (t #b01)) (if (fp-register-p dest) 1 diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp index 365c2b1dbd..f24d3dd552 100644 --- a/src/compiler/arm64/macros.lisp +++ b/src/compiler/arm64/macros.lisp @@ -476,10 +476,7 @@ ,value (@ lip (- (* ,offset n-word-bytes) ,lowtag))))))))))))) (defun load-inline-constant (dst &rest constant-descriptor) - (destructuring-bind (size . label) (apply #'register-inline-constant constant-descriptor) - (ecase size - ((:qword :oword) - (inst load-from-label dst label))))) + (inst load-from-label dst (cdr (apply #'register-inline-constant constant-descriptor)))) ;;; diff --git a/src/compiler/arm64/target-insts.lisp b/src/compiler/arm64/target-insts.lisp index 699cae5112..4e9fc1b8fe 100644 --- a/src/compiler/arm64/target-insts.lisp +++ b/src/compiler/arm64/target-insts.lisp @@ -479,15 +479,35 @@ (declare (ignore stream)) (let* ((value (* 4 value)) (seg (dstate-segment dstate)) - (code (seg-code seg))) + (code (seg-code seg)) + (inst (current-instruction dstate)) + (v (ldb (byte 1 26) inst)) + (addr (+ (dstate-cur-addr dstate) value))) (when code - (or (note-code-constant (sb-disassem::segment-offs-to-code-offs - (+ (dstate-cur-offs dstate) value) seg) - dstate) - (let ((addr (+ (dstate-cur-addr dstate) value))) - (and (sb-disassem::points-to-code-constant-p addr code) - (maybe-note-assembler-routine (sap-ref-word (int-sap addr) 0) - nil dstate))))))) + (if (plusp v) + (when (sb-disassem::points-to-code-constant-p addr code) + (case (ldb (byte 2 30) inst) + (#b00 + (note (lambda (stream) + (format stream "~a" (sap-ref-single (int-sap addr) 0))) + dstate)) + (#b01 + (note + (lambda (stream) + (format stream "~a" (sap-ref-double (int-sap addr) 0))) + dstate)) + (#b10 + (note + (lambda (stream) + (format stream "~x ~x"(sap-ref-double (int-sap addr) 0) + (sap-ref-double (int-sap addr) 8))) + dstate)))) + (or (note-code-constant (sb-disassem::segment-offs-to-code-offs + (+ (dstate-cur-offs dstate) value) seg) + dstate) + (and (sb-disassem::points-to-code-constant-p addr code) + (maybe-note-assembler-routine (sap-ref-word (int-sap addr) 0) + nil dstate))))))) ;;;; special magic to support decoding internal-error and related traps ;;; See EMIT-ERROR-BREAK for the scheme diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp index 5e87d0e339..3e1105bd2f 100644 --- a/src/compiler/arm64/vm.lisp +++ b/src/compiler/arm64/vm.lisp @@ -115,7 +115,6 @@ ;; Anything else that can be an immediate. (immediate immediate-constant) - ;; **** The stacks. ;; The control stack. (Scanned by GC) @@ -189,17 +188,17 @@ ;; **** Things that can go in the floating point registers. - ;; Non-Descriptor single-floats. + (single-immediate immediate-constant) + (double-immediate immediate-constant) + (single-reg float-registers :locations #.(loop for i below 32 collect i) - :constant-scs () + :constant-scs (single-immediate) :save-p t :alternate-scs (single-stack)) - - ;; Non-Descriptor double-floats. (double-reg float-registers :locations #.(loop for i below 32 collect i) - :constant-scs () + :constant-scs (double-immediate) :save-p t :alternate-scs (double-stack)) @@ -258,7 +257,11 @@ nil)) ((eql $0.0) ;; Can be encoded in a single instruction - immediate-sc-number))) + immediate-sc-number) + (double-float + double-immediate-sc-number) + (single-float + single-immediate-sc-number))) (defun boxed-immediate-sc-p (sc) (eql sc immediate-sc-number)) From b5e48c33f4166af6f3e40eb07e6350a64e4ad0fc Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 13 Jul 2022 02:39:49 +0300 Subject: [PATCH 3678/4023] Add explicit-check to a number of number functions. Which use number-dispatch. --- src/code/float.lisp | 3 +++ src/compiler/fndb.lisp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/code/float.lisp b/src/code/float.lisp index 516409b76b..cecd8ef6aa 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -548,6 +548,7 @@ ;;; In the float case, we pick off small arguments so that compiler ;;; can use special-case operations. (defun %unary-truncate (number) + (declare (explicit-check number)) (macrolet ((fits-fixnum (type) `(<= ,(symbol-value (symbolicate 'most-negative-fixnum- type)) number @@ -566,6 +567,7 @@ ;;; Produce both values, unlike %unary-truncate (defun unary-truncate (number) + (declare (explicit-check number)) (macrolet ((fits-fixnum (type) `(<= ,(symbol-value (symbolicate 'most-negative-fixnum- type)) number @@ -689,6 +691,7 @@ ;;; so all single-floats larger than most-positive-fixnum can be precisely ;;; represented by an integer.] (defun %unary-round (number) + (declare (explicit-check)) (macrolet ((fits-fixnum (type) `(<= ,(symbol-value (symbolicate 'most-negative-fixnum- type)) number diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index ce53eb548f..7e5331ce16 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -345,7 +345,7 @@ (movable foldable flushable recursive)) (defknown unary-truncate (real) (values integer real) - (movable foldable flushable)) + (movable foldable flushable no-verify-arg-count)) (defknown unary-truncate-single-float-to-bignum (single-float) (values bignum (eql $0f0)) (foldable movable flushable fixed-args)) From 0c98ff8985d40137e185f7d3dd407f03c2c9457e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 12 Jul 2022 20:02:57 -0400 Subject: [PATCH 3679/4023] Fix style warnings --- src/runtime/win32-os.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 287b75fc7d..ca1b0fbadd 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -794,7 +794,7 @@ set_up_win64_seh_thunk(size_t page_size) volatile uint8_t *tramp = seh_data->handler_trampoline; tramp[0] = 0xFF; // jmp qword ptr [rip+2] tramp[1] = 0x25; - UNALIGNED_STORE32((tramp+2), 2); + UNALIGNED_STORE32((void*volatile)(tramp+2), 2); tramp[6] = 0x66; // 2-byte nop tramp[7] = 0x90; *(void **)(tramp+8) = handle_exception; @@ -1108,7 +1108,7 @@ handle_access_violation(os_context_t *ctx, page_index_t page = find_page_index(fault_address); #ifdef LISP_FEATURE_SOFT_CARD_MARKS if (page >= 0) lose("should not get access violation in dynamic space"); -#endif +#else if (page != -1 && !PAGE_WRITEPROTECTED_P(page)) { os_commit_memory(PTR_ALIGN_DOWN(fault_address, os_vm_page_size), os_vm_page_size); @@ -1117,6 +1117,7 @@ handle_access_violation(os_context_t *ctx, if (gencgc_handle_wp_violation(ctx, fault_address)) { return 0; } +#endif #ifdef LISP_FEATURE_IMMOBILE_SPACE extern int immobile_space_handle_wp_violation(void*); @@ -1185,7 +1186,7 @@ signal_internal_error_or_lose(os_context_t *ctx, (void*)(intptr_t)exception_record->ExceptionCode); fprintf(stderr, "Faulting IP: %p.\n", (void*)(intptr_t)exception_record->ExceptionAddress); - if (exception_record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { + if ((long int)exception_record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { MEMORY_BASIC_INFORMATION mem_info; if (VirtualQuery(fault_address, &mem_info, sizeof mem_info)) { @@ -1356,7 +1357,7 @@ veh(EXCEPTION_POINTERS *ep) } DWORD64 rip = ep->ContextRecord->Rip; - DWORD code = ep->ExceptionRecord->ExceptionCode; + long int code = ep->ExceptionRecord->ExceptionCode; BOOL from_lisp = (rip >= READ_ONLY_SPACE_START && rip < READ_ONLY_SPACE_END) || @@ -1466,8 +1467,8 @@ socket_input_available(HANDLE socket, long time, long utime) FD_ZERO(&readfds); FD_ZERO(&errfds); - FD_SET(socket, &readfds); - FD_SET(socket, &errfds); + FD_SET((uword_t)socket, &readfds); + FD_SET((uword_t)socket, &errfds); count = select(0, &readfds, NULL, &errfds, &timeout); SetLastError(wsaErrno); From 59987aeac51a90dc89f8c1a84e1dadd4b67a55f5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 13 Jul 2022 00:20:07 -0400 Subject: [PATCH 3680/4023] Remove a win32 kludge --- src/compiler/x86-64/parms.lisp | 2 +- src/runtime/win32-os.c | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/compiler/x86-64/parms.lisp b/src/compiler/x86-64/parms.lisp index 2c32359e8f..2618a9e24b 100644 --- a/src/compiler/x86-64/parms.lisp +++ b/src/compiler/x86-64/parms.lisp @@ -104,7 +104,7 @@ #-(or linux darwin) (!gencgc-space-setup #x20000000 - #-win32 :read-only-space-size #-win32 0 + :read-only-space-size 0 :dynamic-space-start #x1000000000 #+openbsd :dynamic-space-size #+openbsd #x1bcf0000) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index ca1b0fbadd..b9493b270d 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -1359,10 +1359,9 @@ veh(EXCEPTION_POINTERS *ep) DWORD64 rip = ep->ContextRecord->Rip; long int code = ep->ExceptionRecord->ExceptionCode; BOOL from_lisp = - (rip >= READ_ONLY_SPACE_START && - rip < READ_ONLY_SPACE_END) || - (rip >= DYNAMIC_SPACE_START && - rip < DYNAMIC_SPACE_START+dynamic_space_size); + (rip >= DYNAMIC_SPACE_START && rip < DYNAMIC_SPACE_START+dynamic_space_size) || + (rip >= READ_ONLY_SPACE_START && rip < READ_ONLY_SPACE_END) || + (rip >= STATIC_SPACE_START && rip < (uword_t)static_space_free_pointer); if (code == EXCEPTION_ACCESS_VIOLATION || code == STATUS_HEAP_CORRUPTION || From 4254a3d32925151ef471e7d14f75cb810e8c6d7e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 13 Jul 2022 01:08:23 -0400 Subject: [PATCH 3681/4023] Restrict overrides of memcpy() and memmove() to 32-bit 64-bit doesn't receive access violation exceptions now, or rather, doesn't receive ones that win32-os.c would respond to. --- src/runtime/win32-os.c | 24 ------------------------ src/runtime/x86-win32-os.c | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index b9493b270d..fa1c0d1a55 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -1409,30 +1409,6 @@ wos_install_interrupt_handlers #endif } -/* - * The stubs below are replacements for the windows versions, - * which can -fail- when used in our memory spaces because they - * validate the memory spaces they are passed in a way that - * denies our exception handler a chance to run. - */ - -void *memmove(void *dest, const void *src, size_t n) -{ - if (dest < src) { - size_t i; - for (i = 0; i < n; i++) *(((char *)dest)+i) = *(((char *)src)+i); - } else { - while (n--) *(((char *)dest)+n) = *(((char *)src)+n); - } - return dest; -} - -void *memcpy(void *dest, const void *src, size_t n) -{ - while (n--) *(((char *)dest)+n) = *(((char *)src)+n); - return dest; -} - char *dirname(char *path) { static char buf[PATH_MAX + 1]; diff --git a/src/runtime/x86-win32-os.c b/src/runtime/x86-win32-os.c index bbb8d2b02b..d4ed7f0bb9 100644 --- a/src/runtime/x86-win32-os.c +++ b/src/runtime/x86-win32-os.c @@ -157,3 +157,27 @@ void os_flush_icache(os_vm_address_t address, os_vm_size_t length) { } + +/* + * The stubs below are replacements for the windows versions, + * which can -fail- when used in our memory spaces because they + * validate the memory spaces they are passed in a way that + * denies our exception handler a chance to run. + */ + +void *memmove(void *dest, const void *src, size_t n) +{ + if (dest < src) { + size_t i; + for (i = 0; i < n; i++) *(((char *)dest)+i) = *(((char *)src)+i); + } else { + while (n--) *(((char *)dest)+n) = *(((char *)src)+n); + } + return dest; +} + +void *memcpy(void *dest, const void *src, size_t n) +{ + while (n--) *(((char *)dest)+n) = *(((char *)src)+n); + return dest; +} From 799d8a0930be253a5e28b024b2db4a70120684a7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 13 Jul 2022 09:19:45 -0400 Subject: [PATCH 3682/4023] Remove all special-snowflake replacements for gc_assert() --- src/runtime/win32-os.c | 142 +++++++---------------------------------- 1 file changed, 24 insertions(+), 118 deletions(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index fa1c0d1a55..2191e24061 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -86,104 +86,6 @@ typedef WCHAR console_char; typedef CHAR console_char; #endif -/* wrappers for winapi calls that must be successful (like SBCL's - * (aver ...) form). */ - -/* win_aver function: basic building block for miscellaneous - * ..AVER.. macrology (below) */ - -static inline -intptr_t win_aver(intptr_t value, char* comment, char* file, int line, - int justwarn) -{ - if (!value) { - LPSTR errorMessage = "<FormatMessage failed>"; - DWORD errorCode = GetLastError(), allocated=0; - int posixerrno = errno; - const char* posixstrerror = strerror(errno); - char* report_template = - "Expression unexpectedly false: %s:%d\n" - " ... %s\n" - " ===> returned #X%p, \n" - " (in thread %p)" - " ... Win32 thinks:\n" - " ===> code %u, message => %s\n" - " ... CRT thinks:\n" - " ===> code %u, message => %s\n"; - - allocated = - FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER| - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - errorCode, - MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), - (LPSTR)&errorMessage, - 1024u, - NULL); - - if (justwarn) { - fprintf(stderr, report_template, - file, line, - comment, value, - get_sb_vm_thread(), - (unsigned)errorCode, errorMessage, - posixerrno, posixstrerror); - } else { - lose(report_template, - file, line, - comment, value, - get_sb_vm_thread(), - (unsigned)errorCode, errorMessage, - posixerrno, posixstrerror); - } - if (allocated) - LocalFree(errorMessage); - } - return value; -} - -/* sys_aver function: really tiny adaptor of win_aver for - * "POSIX-parody" CRT results ("lowio" and similar stuff): - * negative number means something... negative. */ -static inline -intptr_t sys_aver(long value, char* comment, char* file, int line, - int justwarn) -{ - win_aver((intptr_t)(value>=0),comment,file,line,justwarn); - return value; -} - -/* Check for (call) result being boolean true. (call) may be arbitrary - * expression now; massive attack of gccisms ensures transparent type - * conversion back and forth, so the type of AVER(expression) is the - * type of expression. Value is the same _if_ it can be losslessly - * converted to (void*) and back. - * - * Failed AVER() is normally fatal. Well, unless dyndebug_survive_aver - * flag is set. */ - -#define AVER(call) \ - ({ __typeof__(call) __attribute__((unused)) me = \ - (__typeof__(call)) \ - win_aver((intptr_t)(call), #call, __FILE__, __LINE__, 0); \ - me;}) - -/* Now, when failed AVER... prints both errno and GetLastError(), two - * variants of "POSIX/lowio" style checks below are almost useless - * (they build on sys_aver like the two above do on win_aver). */ - -#define CRT_AVER_NONNEGATIVE(call) \ - ({ __typeof__(call) __attribute__((unused)) me = \ - (__typeof__(call)) \ - sys_aver((call), #call, __FILE__, __LINE__, 0); \ - me;}) - -/* to be removed */ -#define CRT_AVER(booly) \ - ({ __typeof__(booly) __attribute__((unused)) me = (booly); \ - sys_aver((booly)?0:-1, #booly, __FILE__, __LINE__, 0); \ - me;}) - /* The exception handling function looks like this: */ EXCEPTION_DISPOSITION handle_exception(EXCEPTION_RECORD *, struct lisp_exception_frame *, @@ -216,8 +118,8 @@ static void set_seh_frame(void *frame) void alloc_gc_page() { - AVER(VirtualAlloc(GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, - MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)); + gc_assert(VirtualAlloc(GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, + MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)); } /* Permit loads from GC_SAFEPOINT_PAGE_ADDR (NB page state change is @@ -244,15 +146,15 @@ void alloc_gc_page() void map_gc_page() { DWORD oldProt; - AVER(VirtualProtect((void*) GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, - PAGE_READWRITE, &oldProt)); + gc_assert(VirtualProtect((void*) GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, + PAGE_READWRITE, &oldProt)); } void unmap_gc_page() { DWORD oldProt; - AVER(VirtualProtect((void*) GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, - PAGE_NOACCESS, &oldProt)); + gc_assert(VirtualProtect((void*) GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, + PAGE_NOACCESS, &oldProt)); } #endif @@ -764,8 +666,8 @@ set_up_win64_seh_thunk(size_t page_size) if (page_size < sizeof(struct win64_seh_data)) lose("Not enough space to allocate struct win64_seh_data"); - AVER(VirtualAlloc(WIN64_SEH_DATA_ADDR, page_size, - MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE)); + gc_assert(VirtualAlloc(WIN64_SEH_DATA_ADDR, page_size, + MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE)); struct win64_seh_data *seh_data = (void *) WIN64_SEH_DATA_ADDR; DWORD64 base = (DWORD64) seh_data; @@ -814,7 +716,7 @@ set_up_win64_seh_thunk(size_t page_size) rt->EndAddress = 16; rt->UnwindData = (DWORD64) ui - base; - AVER(RtlAddFunctionTable(rt, 1, base)); + gc_assert(RtlAddFunctionTable(rt, 1, base)); } #endif @@ -866,8 +768,9 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, { if (!addr) { int protection = attributes & IS_GUARD_PAGE ? PAGE_NOACCESS : PAGE_EXECUTE_READWRITE; - return - AVER(VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, protection)); + os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, protection); + gc_assert(actual); + return actual; } os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); @@ -881,7 +784,8 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, return 0; } - return AVER(VirtualAlloc(NULL, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE)); + actual = VirtualAlloc(NULL, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); + gc_assert(actual); } return actual; @@ -901,7 +805,8 @@ os_validate_nocommit(int attributes, os_vm_address_t addr, os_vm_size_t len) fflush(stderr); return 0; } - return AVER(VirtualAlloc(NULL, len, MEM_RESERVE, PAGE_EXECUTE_READWRITE)); + actual = VirtualAlloc(NULL, len, MEM_RESERVE, PAGE_EXECUTE_READWRITE); + gc_assert(actual); } return actual; @@ -920,7 +825,7 @@ void os_decommit_mem(os_vm_address_t addr, os_vm_size_t len) { void os_invalidate(os_vm_address_t addr, os_vm_size_t len) { - AVER(VirtualFree(addr, 0, MEM_RELEASE)); + gc_assert(VirtualFree(addr, 0, MEM_RELEASE)); } /* @@ -939,10 +844,11 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm { os_commit_memory(addr, len); #ifdef LISP_FEATURE_64_BIT - CRT_AVER_NONNEGATIVE(_lseeki64(fd, offset, SEEK_SET)); + os_vm_offset_t res = _lseeki64(fd, offset, SEEK_SET); #else - CRT_AVER_NONNEGATIVE(lseek(fd, offset, SEEK_SET)); + os_vm_offset_t res = lseek(fd, offset, SEEK_SET); #endif + gc_assert(res == offset); size_t count; while (len) { @@ -950,7 +856,7 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm count = read(fd, addr, to_read); addr += count; len -= count; - CRT_AVER(count == to_read); + gc_assert(count == to_read); } return (void*)0; } @@ -971,9 +877,9 @@ os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot) DWORD old_prot; DWORD new_prot = os_protect_modes[prot]; - AVER(VirtualProtect(address, length, new_prot, &old_prot)|| - (VirtualAlloc(address, length, MEM_COMMIT, new_prot) && - VirtualProtect(address, length, new_prot, &old_prot))); + gc_assert(VirtualProtect(address, length, new_prot, &old_prot)|| + (VirtualAlloc(address, length, MEM_COMMIT, new_prot) && + VirtualProtect(address, length, new_prot, &old_prot))); odxprint(misc,"Protecting %p + %p vmaccess %d " "newprot %08x oldprot %08x", address,length,prot,new_prot,old_prot); From afe14821da670adbfa81b23320b4ed00107b722f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 13 Jul 2022 20:48:58 +0300 Subject: [PATCH 3683/4023] define-instruction-format: allow anonymous fields. Using integers as names. --- src/compiler/disassem.lisp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/compiler/disassem.lisp b/src/compiler/disassem.lisp index 237ab8afd8..175ac447a1 100644 --- a/src/compiler/disassem.lisp +++ b/src/compiler/disassem.lisp @@ -260,6 +260,8 @@ Each ARG-DEF defines one argument in the format, and is of the form (Arg-Name {Arg-Key Value}*) + If ARG-NAME is an integer it is the same as (#.(gensym) :value arg-name ...). + Possible ARG-KEYs (the values are evaluated unless otherwise specified): :FIELDS byte-spec-list @@ -342,16 +344,20 @@ (seen)) (dolist (arg-spec arg-specs) (let* ((arg-name (car arg-spec)) - (properties (cdr arg-spec)) - (cell (member arg-name args :key #'arg-name))) - (aver (not (memq arg-name seen))) - (push arg-name seen) - (cond ((not cell) - (setq args (nconc args (list (apply #'modify-arg (%make-arg arg-name) - length properties))))) - (properties - (rplaca cell (apply #'modify-arg (copy-structure (car cell)) - length properties)))))) + (properties (cdr arg-spec))) + (when (integerp arg-name) + (setf properties (list* :value arg-name + properties) + arg-name (gensym))) + (let ((cell (member arg-name args :key #'arg-name))) + (aver (not (memq arg-name seen))) + (push arg-name seen) + (cond ((not cell) + (setq args (nconc args (list (apply #'modify-arg (%make-arg arg-name) + length properties))))) + (properties + (rplaca cell (apply #'modify-arg (copy-structure (car cell)) + length properties))))))) (setf (get name 'inst-format) (make-inst-format name (bits-to-bytes length) printer args)))) From 3da62bc2f0b6a18d99a5c8b711c2ac3e52b3f413 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 13 Jul 2022 20:49:42 +0300 Subject: [PATCH 3684/4023] arm64: support fmov x, float-immediate. --- src/compiler/arm64/float.lisp | 9 +++- src/compiler/arm64/insts.lisp | 75 +++++++++++++++++++++++++++- src/compiler/arm64/target-insts.lisp | 38 +++++++++++++- src/compiler/arm64/vm.lisp | 3 -- 4 files changed, 118 insertions(+), 7 deletions(-) diff --git a/src/compiler/arm64/float.lisp b/src/compiler/arm64/float.lisp index b5d9872821..2b2a6bd49f 100644 --- a/src/compiler/arm64/float.lisp +++ b/src/compiler/arm64/float.lisp @@ -32,7 +32,14 @@ (define-move-fun (load-fp-immediate 1) (vop x y) ((single-immediate) (single-reg) (double-immediate) (double-reg)) - (load-inline-constant y (tn-value x))) + (let ((x (tn-value x))) + (cond ((or (eql x $0f0) + (eql x $0d0)) + (inst fmov y zr-tn)) + ((encode-fp-immediate x) + (inst fmov y x)) + (t + (load-inline-constant y x))))) ;;;; Move VOPs: diff --git a/src/compiler/arm64/insts.lisp b/src/compiler/arm64/insts.lisp index 433e3a5a57..6d03e90e5a 100644 --- a/src/compiler/arm64/insts.lisp +++ b/src/compiler/arm64/insts.lisp @@ -19,7 +19,7 @@ negative-add-sub-immediate-p encode-logical-immediate fixnum-encode-logical-immediate ldr-str-offset-encodable ldp-stp-offset-p - bic-mask extend lsl lsr asr ror @) "SB-VM") + bic-mask extend lsl lsr asr ror @ encode-fp-immediate) "SB-VM") ;; Imports from SB-VM into this package (import '(sb-vm::*register-names* sb-vm::add-sub-immediate @@ -116,6 +116,8 @@ (define-arg-type simd-modified-imm :printer #'print-simd-modified-imm) (define-arg-type simd-reg-cmode :printer #'print-simd-reg-cmode) + (define-arg-type fp-imm :printer #'print-fp-imm) + (define-arg-type sys-reg :printer #'print-sys-reg) (define-arg-type cond :printer #'print-cond) @@ -2473,12 +2475,81 @@ (def-fp-conversion fcvtzs #b11000) (def-fp-conversion fcvtzu #b11001) +(defun encode-fp-immediate (float) + (typecase float + (double-float + (let* ((bits (double-float-bits float)) + (sign (ldb (byte 1 63) bits)) + (exp (ldb (byte 11 52) bits)) + (frac (ldb (byte 52 0) bits))) + (when (and (zerop (ldb (byte 48 0) frac)) + (= + (ldb (byte 8 2) exp) + (if (zerop (ldb (byte 1 10) exp)) + (ldb (byte 8 0) -1) + 0))) + (logior (ash sign 7) + (ash (logandc1 (ldb (byte 1 10) exp) 1) 6) + (ash (ldb (byte 2 0) exp) 4) + (ldb (byte 4 48) frac))))) + (single-float + (let* ((bits (single-float-bits float)) + (sign (ldb (byte 1 31) bits)) + (exp (ldb (byte 8 23) bits)) + (frac (ldb (byte 23 0) bits))) + (when (and (zerop (ldb (byte 19 0) frac)) + (= (ldb (byte 5 2) exp) + (if (zerop (ldb (byte 1 7) exp)) + (ldb (byte 5 0) -1) + 0))) + (logior (ash sign 7) + (ash (logandc1 (ldb (byte 1 7) exp) 1) 6) + (ash (ldb (byte 2 0) exp) 4) + (ldb (byte 4 19) frac))))))) + +(def-emitter fp-immediate + (m 1 31) + (#b0 1 30) + (s 1 29) + (#b11110 5 24) + (type 2 22) + (#b1 1 21) + (imm8 8 13) + (#b100 3 10) + (imm5 5 5) + (rd 5 0)) + +(define-instruction-format (fp-immediate 32 + :default-printer '(:name :tab rd ", " imm)) + (#b0 :field (byte 1 31)) + (#b0 :field (byte 1 30)) + (#b0 :field (byte 1 29)) + (#b11110 :field (byte 5 24)) + (#b1 :field (byte 1 21)) + (imm :fields (list (byte 2 22) (byte 8 13)) :type 'fp-imm) + (#b100 :field (byte 3 10)) + (#b0 :field (byte 5 5)) + (rd :field (byte 5 0) :type 'float-reg)) + (define-instruction fmov (segment rd rn) (:printer fp-conversion ((op #b110) (rd nil :type 'reg))) (:printer fp-conversion ((op #b111) (rn nil :type 'reg))) (:printer fp-data-processing-1 ((op #b0))) + (:printer fp-immediate ()) (:emitter - (cond ((or (sc-is rd complex-double-reg complex-single-reg) + (cond ((double-float-p rn) + (aver (sc-is rd double-reg)) + (emit-fp-immediate segment 0 0 #b01 + (encode-fp-immediate rn) + 0 + (reg-offset rd))) + ((single-float-p rn) + (aver (sc-is rd single-reg)) + (emit-fp-immediate segment 0 0 #b00 + (encode-fp-immediate rn) + 0 + (reg-offset rd))) + ((or (sc-is rd complex-double-reg complex-single-reg) (sc-is rn complex-double-reg complex-single-reg)) (break "Implement")) ((and (fp-register-p rd) diff --git a/src/compiler/arm64/target-insts.lisp b/src/compiler/arm64/target-insts.lisp index 4e9fc1b8fe..72ac3bb9ba 100644 --- a/src/compiler/arm64/target-insts.lisp +++ b/src/compiler/arm64/target-insts.lisp @@ -311,7 +311,43 @@ (ash cmode 2))))) (princ (dpb abc (byte 3 5) defgh) stream) (when (plusp shift) - (format t ", LSL #~d" shift))))) + (format stream ", LSL #~d" shift))))) + +(defun decode-fp-immediate (imm type) + (case type + (double-float + (let* ((sign (ldb (byte 1 7) imm)) + (exp (ldb (byte 3 4) imm)) + (frac (ldb (byte 4 0) imm))) + (sb-kernel::double-from-bits + sign + (logior (ash (logandc1 (ldb (byte 1 2) exp) 1) 10) + (ash (if (zerop (ldb (byte 1 2) exp)) + 0 + (ldb (byte 8 0) -1)) + 3) + (ldb (byte 2 0) exp)) + (ash frac 48)))) + (single-float + (let* ((sign (ldb (byte 1 7) imm)) + (exp (ldb (byte 3 4) imm)) + (frac (ldb (byte 4 0) imm))) + (sb-kernel::single-from-bits + sign + (logior (ash (logandc1 (ldb (byte 1 2) exp) 1) 7) + (ash (if (zerop (ldb (byte 1 2) exp)) + 0 + (ldb (byte 5 0) -1)) + 3) + (ldb (byte 2 0) exp)) + (ash frac 19)))))) + +(defun print-fp-imm (value stream dstate) + (declare (ignore dstate)) + (destructuring-bind (type imm) value + (format stream "#~a" (decode-fp-immediate imm (if (= type 0) + 'single-float + 'double-float))))) (defun print-vbhs (value stream dstate) (declare (ignore dstate)) diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp index 3e1105bd2f..9254b3dbcd 100644 --- a/src/compiler/arm64/vm.lisp +++ b/src/compiler/arm64/vm.lisp @@ -255,9 +255,6 @@ (if (static-symbol-p value) immediate-sc-number nil)) - ((eql $0.0) - ;; Can be encoded in a single instruction - immediate-sc-number) (double-float double-immediate-sc-number) (single-float From 5bdfe2d29be57042dbc1fa5969a19330c20fe722 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 14 Jul 2022 14:38:04 +0300 Subject: [PATCH 3685/4023] arm64: load immediate floats using immediate integers. If they can be loaded using just one instruction. --- src/compiler/arm64/float.lisp | 5 +++++ src/compiler/arm64/move.lisp | 36 +++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/compiler/arm64/float.lisp b/src/compiler/arm64/float.lisp index 2b2a6bd49f..9b093b2dde 100644 --- a/src/compiler/arm64/float.lisp +++ b/src/compiler/arm64/float.lisp @@ -38,6 +38,11 @@ (inst fmov y zr-tn)) ((encode-fp-immediate x) (inst fmov y x)) + ((load-immediate-word tmp-tn (if (double-float-p x) + (double-float-bits x) + (single-float-bits x)) + t) + (inst fmov y tmp-tn)) (t (load-inline-constant y x))))) diff --git a/src/compiler/arm64/move.lisp b/src/compiler/arm64/move.lisp index 389b0d743c..a21f7995b0 100644 --- a/src/compiler/arm64/move.lisp +++ b/src/compiler/arm64/move.lisp @@ -11,7 +11,7 @@ (in-package "SB-VM") -(defun load-immediate-word (y val) +(defun load-immediate-word (y val &optional single-instruction) (let (single-mov) (flet ((single-mov () (setf single-mov @@ -25,15 +25,20 @@ count (plusp part)) 1))))) (cond ((typep val '(unsigned-byte 16)) - (inst movz y val)) + (inst movz y val) + y) ((typep val '(and (signed-byte 16) (integer * -1))) - (inst movn y (lognot val))) + (inst movn y (lognot val)) + y) ((typep (ldb (byte 64 0) (lognot val)) '(unsigned-byte 16)) - (inst movn y (ldb (byte 64 0) (lognot val)))) + (inst movn y (ldb (byte 64 0) (lognot val))) + y) ((encode-logical-immediate val) - (inst orr y zr-tn val)) + (inst orr y zr-tn val) + y) ((and (not (single-mov)) + (not single-instruction) (let ((descriptorp (memq (tn-offset y) descriptor-regs))) (flet ((try (i part fill) (let ((filled (dpb fill (byte 16 i) val))) @@ -49,8 +54,10 @@ (try i part 0) (try i part (ldb (byte 16 (mod (+ i 16) 64)) - val)))))))) + val))))))) + y) ((and (not single-mov) + (not single-instruction) (let ((a (ldb (byte 16 0) val)) (b (ldb (byte 16 16) val)) (c (ldb (byte 16 32) val)) @@ -77,8 +84,11 @@ ((= b d) (try b a 0 c 32)) ((= c d) - (try c a 0 b 16)))))))) - ((minusp val) + (try c a 0 b 16))))))) + y) + ((and (minusp val) + (or single-mov + (not single-instruction))) (loop with first = t for i below 64 by 16 for part = (ldb (byte 16 i) val) @@ -86,8 +96,10 @@ do (if (shiftf first nil) (inst movn y (ldb (byte 16 0) (lognot part)) i) - (inst movk y part i)))) - (t + (inst movk y part i))) + y) + ((or single-mov + (not single-instruction)) (loop with first = t for i below 64 by 16 for part = (ldb (byte 16 i) val) @@ -95,8 +107,8 @@ do (if (shiftf first nil) (inst movz y part i) - (inst movk y part i))))))) - y) + (inst movk y part i))) + y))))) (defun add-sub-immediate (x &optional (temp tmp-tn)) (cond ((not (integerp x)) From 750d04f23f0eb9bdc9584de035d9a30d2a92b4cb Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 14 Jul 2022 15:00:47 +0300 Subject: [PATCH 3686/4023] arm64: accept immediate indexes for (aref float-array) --- src/compiler/arm64/array.lisp | 164 +++++++++------------------------ src/compiler/arm64/macros.lisp | 6 +- 2 files changed, 45 insertions(+), 125 deletions(-) diff --git a/src/compiler/arm64/array.lisp b/src/compiler/arm64/array.lisp index 205194e5ca..4a614b9628 100644 --- a/src/compiler/arm64/array.lisp +++ b/src/compiler/arm64/array.lisp @@ -183,72 +183,52 @@ ;;; Variants built on top of word-index-ref, etc. I.e. those vectors whos ;;; elements are represented in integer registers and are built out of ;;; 8, 16, 32, or 64 bit elements. -(macrolet ((def-full-data-vector-frobs (type element-type &rest scs) - `(progn - (define-full-reffer ,(symbolicate "DATA-VECTOR-REF/" type) ,type - vector-data-offset other-pointer-lowtag - ,scs - ,element-type - data-vector-ref) - (define-full-setter ,(symbolicate "DATA-VECTOR-SET/" type) ,type - vector-data-offset other-pointer-lowtag ,scs ,element-type - data-vector-set))) - - (def-partial-data-vector-frobs (type element-type size signed &rest scs) - `(progn - (define-partial-reffer ,(symbolicate "DATA-VECTOR-REF/" type) ,type - ,size ,signed vector-data-offset other-pointer-lowtag ,scs - ,element-type data-vector-ref) - (define-partial-setter ,(symbolicate "DATA-VECTOR-SET/" type) ,type - ,size vector-data-offset other-pointer-lowtag ,scs - ,element-type data-vector-set)))) - - (def-full-data-vector-frobs simple-vector * - descriptor-reg any-reg) - - (def-partial-data-vector-frobs simple-base-string character - :byte nil character-reg) +(macrolet ((full (type element-type &rest scs) + `(progn + (define-full-reffer ,(symbolicate "DATA-VECTOR-REF/" type) ,type + vector-data-offset other-pointer-lowtag + ,scs + ,element-type + data-vector-ref) + (define-full-setter ,(symbolicate "DATA-VECTOR-SET/" type) ,type + vector-data-offset other-pointer-lowtag ,scs ,element-type + data-vector-set))) + + (partial (type element-type size signed &rest scs) + `(progn + (define-partial-reffer ,(symbolicate "DATA-VECTOR-REF/" type) ,type + ,size ,signed vector-data-offset other-pointer-lowtag ,scs + ,element-type data-vector-ref) + (define-partial-setter ,(symbolicate "DATA-VECTOR-SET/" type) ,type + ,size vector-data-offset other-pointer-lowtag ,scs + ,element-type data-vector-set)))) + + (full simple-vector * descriptor-reg any-reg) + (full simple-array-unsigned-byte-63 unsigned-num unsigned-reg) + (full simple-array-unsigned-byte-64 unsigned-num unsigned-reg) + (full simple-array-unsigned-fixnum positive-fixnum any-reg) + (full simple-array-fixnum tagged-num any-reg) + (full simple-array-signed-byte-64 signed-num signed-reg) + + (partial simple-base-string character :byte nil character-reg) #+sb-unicode - (def-partial-data-vector-frobs simple-character-string character - :word nil character-reg) + (partial simple-character-string character :word nil character-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-7 positive-fixnum - :byte nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-8 positive-fixnum - :byte nil unsigned-reg signed-reg) + (partial simple-array-unsigned-byte-7 positive-fixnum :byte nil unsigned-reg signed-reg) + (partial simple-array-unsigned-byte-8 positive-fixnum :byte nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-15 positive-fixnum - :short nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-16 positive-fixnum - :short nil unsigned-reg signed-reg) + (partial simple-array-unsigned-byte-15 positive-fixnum :short nil unsigned-reg signed-reg) + (partial simple-array-unsigned-byte-16 positive-fixnum :short nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-31 positive-fixnum - :word nil unsigned-reg signed-reg) - (def-partial-data-vector-frobs simple-array-unsigned-byte-32 positive-fixnum - :word nil unsigned-reg signed-reg) + (partial simple-array-unsigned-byte-31 positive-fixnum :word nil unsigned-reg signed-reg) + (partial simple-array-unsigned-byte-32 positive-fixnum :word nil unsigned-reg signed-reg) - (def-full-data-vector-frobs simple-array-unsigned-byte-63 unsigned-num - unsigned-reg) + (partial simple-array-signed-byte-8 tagged-num :byte t signed-reg) + (partial simple-array-signed-byte-16 tagged-num :short t signed-reg) + (partial simple-array-signed-byte-32 tagged-num :word t signed-reg) - (def-full-data-vector-frobs simple-array-unsigned-byte-64 unsigned-num - unsigned-reg) - - (def-partial-data-vector-frobs simple-array-signed-byte-8 tagged-num - :byte t signed-reg) - - (def-partial-data-vector-frobs simple-array-signed-byte-16 tagged-num - :short t signed-reg) - - (def-partial-data-vector-frobs simple-array-signed-byte-32 tagged-num - :word t signed-reg) - - (def-full-data-vector-frobs simple-array-unsigned-fixnum positive-fixnum - any-reg) - (def-full-data-vector-frobs simple-array-fixnum tagged-num - any-reg) - - (def-full-data-vector-frobs simple-array-signed-byte-64 signed-num - signed-reg)) + (partial simple-array-single-float single-float :single-float nil single-reg) + (full simple-array-double-float double-float double-reg)) ;;; Integer vectors whose elements are smaller than a byte. I.e. bit, 2-bit, ;;; and 4-bit vectors. @@ -416,68 +396,6 @@ (- (* vector-data-offset n-word-bytes) other-pointer-lowtag))))) (inst tst x (ash 1 bit))))) -;;; And the float variants. -(define-vop (data-vector-ref/simple-array-single-float) - (:note "inline array access") - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types simple-array-single-float positive-fixnum) - (:results (value :scs (single-reg))) - (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) - (:result-types single-float) - (:generator 5 - (inst lsl offset index (1- (- word-shift n-fixnum-tag-bits))) - (inst add offset offset (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag)) - (inst ldr value (@ object offset)))) - -(define-vop (data-vector-set/simple-array-single-float) - (:note "inline array store") - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (single-reg))) - (:arg-types simple-array-single-float positive-fixnum single-float) - (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) - (:generator 5 - (inst lsl offset index (1- (- word-shift n-fixnum-tag-bits))) - (inst add offset offset (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag)) - (inst str value (@ object offset)))) - -(define-vop (data-vector-ref/simple-array-double-float) - (:note "inline array access") - (:translate data-vector-ref) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg))) - (:arg-types simple-array-double-float positive-fixnum) - (:results (value :scs (double-reg))) - (:result-types double-float) - (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) - (:generator 7 - (inst lsl offset index (- word-shift n-fixnum-tag-bits)) - (inst add offset offset (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag)) - (inst ldr value (@ object offset)))) - -(define-vop (data-vector-set/simple-array-double-float) - (:note "inline array store") - (:translate data-vector-set) - (:policy :fast-safe) - (:args (object :scs (descriptor-reg)) - (index :scs (any-reg)) - (value :scs (double-reg))) - (:arg-types simple-array-double-float positive-fixnum double-float) - (:temporary (:scs (non-descriptor-reg) :from (:argument 1)) offset) - (:generator 20 - (inst lsl offset index (- word-shift n-fixnum-tag-bits)) - (inst add offset offset (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag)) - (inst str value (@ object offset)))) ;;; Complex float arrays. @@ -494,7 +412,7 @@ (:generator 5 (inst lsl offset index (- word-shift n-fixnum-tag-bits)) (inst add offset offset (- (* vector-data-offset n-word-bytes) - other-pointer-lowtag)) + other-pointer-lowtag)) (inst ldr value (@ object offset)))) (define-vop (data-vector-set/simple-array-complex-single-float) diff --git a/src/compiler/arm64/macros.lisp b/src/compiler/arm64/macros.lisp index f24d3dd552..5d2e90b144 100644 --- a/src/compiler/arm64/macros.lisp +++ b/src/compiler/arm64/macros.lisp @@ -399,7 +399,9 @@ (:short (values (if signed 'ldrsh 'ldrh) 1)) (:word - (values (if signed 'ldrsw 'ldr) 2))) + (values (if signed 'ldrsw 'ldr) 2)) + (:single-float + (values 'ldr 2))) (let ((value (if (and (eq size :word) (not signed)) '(32-bit-reg value) @@ -453,7 +455,7 @@ (values 'strb 0)) (:short (values 'strh 1)) - (:word + ((:word :single-float) (values 'str 2))) (let ((value (if (eq size :word) '(32-bit-reg value) From 884045314113e239cd86567d0d0eca30d3dcce3c Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 14 Jul 2022 17:56:54 +0300 Subject: [PATCH 3687/4023] Fix tension-if-if-1 after split-let. The node may end up in a different block after split-let. Fixes lp#1981607 --- src/compiler/ir1opt.lisp | 14 +++++++------- tests/compiler-2.pure.lisp | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 08abb972fb..1a980182cf 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -815,13 +815,13 @@ (when (and lvar (listp (lvar-uses lvar))) (do-uses (use lvar) - (let ((block (node-block use))) - (when (and (immediately-used-p lvar use) - (type= (single-value-type (node-derived-type use)) - (specifier-type 'null)) - (eq (block-last block) use) - (or good-lambda-shape - (setf good-lambda-shape (split-let var lambda)))) + (when (and (immediately-used-p lvar use) + (type= (single-value-type (node-derived-type use)) + (specifier-type 'null)) + (eq (block-last (node-block use)) use) + (or good-lambda-shape + (setf good-lambda-shape (split-let var lambda)))) + (let ((block (node-block use))) (change-block-successor block (car (block-succ block)) (if-alternative node)) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index aec8c87374..b0a9b2149e 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3689,3 +3689,23 @@ (declaim (type integer +foo+))) :load t) (assert (eq (funcall 'bar) 4))) + +(with-test (:name :if-split-let-blocks) + (checked-compile-and-assert + () + `(lambda (a e) + (labels ((f1 (b) + (map nil + (lambda (n) + (return-from f1 n)) + b) + nil) + (f (n) + (let ((x (eval e)) + (y (f1 n))) + (if y + y + x)))) + (f a))) + ((() 1) 1) + (('(2) 1) 2))) From dc44f0366fc3a912f30e1637c99d98a3d2451e76 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Jul 2022 17:12:14 -0400 Subject: [PATCH 3688/4023] Update math journal --- float-math.lisp-expr | 107 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 15e0a1fe0d..3847c5cf3e 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -285,7 +285,9 @@ (- (#.(MAKE-DOUBLE-FLOAT #x7FAFFFFF #xFFFFFFFE)) #.(MAKE-DOUBLE-FLOAT #x-500001 #xFFFFFFFE)) (- (#.(MAKE-DOUBLE-FLOAT #x7FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-100000 #x0)) (- (#.(MAKE-SINGLE-FLOAT #x-32000000) #x20000000) #.(MAKE-SINGLE-FLOAT #x-31800000)) +(- (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) #.(MAKE-SINGLE-FLOAT #x-31800000)) (- (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) #.(MAKE-SINGLE-FLOAT #x-31800000)) +(- (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) #.(MAKE-SINGLE-FLOAT #x-22000000)) (- (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) #.(MAKE-SINGLE-FLOAT #x-22000000)) (- (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) #.(MAKE-SINGLE-FLOAT #x-21000000)) (- (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) #.(MAKE-SINGLE-FLOAT #x-21000000)) @@ -293,9 +295,11 @@ (- (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) #.(MAKE-SINGLE-FLOAT #x-32000000)) (- (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) #.(MAKE-SINGLE-FLOAT #x-22800000)) (- (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) #.(MAKE-SINGLE-FLOAT #x-21800000)) +(- (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) #.(MAKE-SINGLE-FLOAT #x4E800000)) (- (#.(MAKE-SINGLE-FLOAT #x4E000000) #x-20000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) (- (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) #.(MAKE-SINGLE-FLOAT #x4E800000)) (- (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x4E000000)) +(- (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) #.(MAKE-SINGLE-FLOAT #x5E000000)) (- (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) #.(MAKE-SINGLE-FLOAT #x5E000000)) (- (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x5D800000)) (- (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) #.(MAKE-SINGLE-FLOAT #x5F000000)) @@ -309,6 +313,7 @@ (- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x408D6800 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD)) (- (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) (- (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) +(- (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) @@ -328,6 +333,8 @@ (- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) (- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) +(- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) +(- (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) @@ -532,6 +539,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x0)) T) +(< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-319194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) @@ -544,6 +552,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x0)) T) +(< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-21B6F025) #x0) T) @@ -552,6 +561,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x0)) T) +(< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #x0) T) @@ -572,10 +582,12 @@ (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) +(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x538637BD)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) +(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) @@ -585,6 +597,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F000000) #x0) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) NIL) @@ -612,6 +625,8 @@ (< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) +(< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) @@ -628,6 +643,8 @@ (< (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5903126F) #.(MAKE-SINGLE-FLOAT #x5903126F)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5CEE6B28) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) @@ -728,6 +745,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) T) @@ -744,6 +762,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) NIL) @@ -752,6 +771,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) NIL) @@ -836,6 +856,8 @@ (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) @@ -859,6 +881,8 @@ (< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) @@ -921,9 +945,11 @@ (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #xFFFFFFFFFFFFFFFF) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) @@ -1138,6 +1164,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x40490FDB)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) T) @@ -1145,6 +1172,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x540637BD)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5903126F)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) T) @@ -1193,6 +1221,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) @@ -1223,6 +1252,8 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5CEE6B28) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) @@ -1239,6 +1270,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) @@ -1325,6 +1357,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) @@ -1335,6 +1368,9 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) @@ -1360,6 +1396,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) @@ -1441,6 +1478,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) @@ -1449,6 +1487,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) T) @@ -1534,10 +1573,13 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x0) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) @@ -1575,6 +1617,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #x0) NIL) @@ -1583,6 +1626,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) @@ -1600,6 +1644,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) NIL) @@ -1865,6 +1910,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xE0000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFE627) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFF8) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) @@ -2005,8 +2051,10 @@ (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-129194D8)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) @@ -2036,6 +2084,7 @@ (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) @@ -2053,6 +2102,7 @@ (= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) @@ -2064,6 +2114,7 @@ (= (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) +(= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) @@ -2151,9 +2202,11 @@ (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) @@ -2193,9 +2246,12 @@ (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) @@ -2358,11 +2414,14 @@ (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x538637BD) #.(MAKE-SINGLE-FLOAT #x538637BD) #.(MAKE-SINGLE-FLOAT #x538637BD)) T) (= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) +(= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) +(= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) @@ -2388,6 +2447,7 @@ (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -2399,6 +2459,7 @@ (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -2450,11 +2511,14 @@ (= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x3FF33333 #x33333333) #.(MAKE-DOUBLE-FLOAT #x3FF33333 #x33333333) #.(MAKE-DOUBLE-FLOAT #x3FF33333 #x33333333)) T) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) +(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) (= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) +(= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) +(= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) @@ -2481,8 +2545,10 @@ (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0) #x0 #x0) NIL) @@ -2674,12 +2740,14 @@ (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x40490FDB)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x497423F0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x538637BD)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x540637BD)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5883126F)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5903126F)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) @@ -2734,7 +2802,9 @@ (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) +(> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) @@ -2751,7 +2821,9 @@ (> (#.(MAKE-SINGLE-FLOAT #x538637BD) #.(MAKE-SINGLE-FLOAT #x538637BD)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) +(> (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) @@ -2850,13 +2922,16 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) @@ -2883,6 +2958,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xE0000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) NIL) @@ -2947,6 +3023,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) NIL) @@ -2954,6 +3031,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFE627)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFF8)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) @@ -3030,8 +3108,11 @@ (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) @@ -3054,12 +3135,15 @@ (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) @@ -3271,9 +3355,11 @@ (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x41600000)) NIL) +(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x538637BD)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5883126F)) NIL) +(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) @@ -3292,6 +3378,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x3DCCCCCD) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F000000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x3F266666) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x3F59999A) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) @@ -3322,6 +3409,8 @@ (>= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) T) @@ -3334,12 +3423,16 @@ (>= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) @@ -3425,6 +3518,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) NIL) @@ -3443,6 +3537,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #x0) NIL) @@ -3516,8 +3611,10 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x40080000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x404A8000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) @@ -3608,6 +3705,8 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3E200000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) @@ -3615,7 +3714,9 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -3629,6 +3730,9 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3C300000 #x0)) T) @@ -3636,6 +3740,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) @@ -3803,9 +3908,11 @@ (COERCE (#.(MAKE-SINGLE-FLOAT #x-20B6F025) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x60000000)) (COERCE (#.(MAKE-SINGLE-FLOAT #x0) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x3F800000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) +(COERCE (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) (COERCE (#.(MAKE-SINGLE-FLOAT #x4E000000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x60000000)) +(COERCE (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xE0000000)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5D800000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5E490FDB) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xE0000000)) From bf3034200aa3d11742ccb05f1b719160add01eaf Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Jul 2022 17:13:53 -0400 Subject: [PATCH 3689/4023] Add more (store-source-form 0) decls --- src/code/defstruct.lisp | 2 ++ tests/bad-mlf-test.lisp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index b2ed579b46..240d026425 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -66,6 +66,7 @@ (let ((vars (make-gensym-list (length slot-specs)))) (values (compile nil `(lambda (,@vars) + (declare (optimize (sb-c:store-source-form 0))) (%make-structure-instance-macro ,dd ',slot-specs ,@vars)))))) (defun %make-funcallable-structure-instance-allocator (dd slot-specs) @@ -73,6 +74,7 @@ (bug "funcallable-structure-instance allocation with slots unimplemented")) (values (compile nil `(lambda () + (declare (optimize (sb-c:store-source-form 0))) (let ((object (%make-funcallable-instance ,(dd-length dd)))) (setf (%fun-wrapper object) ,(find-layout (dd-name dd))) object))))) diff --git a/tests/bad-mlf-test.lisp b/tests/bad-mlf-test.lisp index bc758c64f8..04b17721d7 100644 --- a/tests/bad-mlf-test.lisp +++ b/tests/bad-mlf-test.lisp @@ -1,5 +1,5 @@ (defun zook () - (declare (optimize sb-c::store-source-form)) + (declare (optimize sb-c:store-source-form)) (macrolet ((foo (x) (declare (ignore x)) ''hi)) From cb0f8a1234cdd42399e80acf80dc5c7629ff8c30 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Jul 2022 17:37:26 -0400 Subject: [PATCH 3690/4023] Recreate the pathname intern table on save Don't save a hash-table kv vector full of a zillion unbound markers. Some other tables might want the same treatment but I'm not sure which. --- src/code/save.lisp | 10 +++++++--- src/code/target-pathname.lisp | 4 +++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/code/save.lisp b/src/code/save.lisp index 0b5b33021f..e327e67912 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -339,9 +339,13 @@ sufficiently motivated to do lengthy fixes." (profile-deinit) (foreign-deinit) ;; To have any hope of making pathname interning actually work, - ;; this CLRHASH would need to be removed. But removing it causes excess - ;; garbage retention because weakness doesn't work. It's a catch-22. - (clrhash *pathnames*) + ;; this MAKE-PATHNAME-TABLE (formerly CLRHASH) would need to be removed. + ;; But removing this step causes excess garbage retention because the + ;; table's weakness isn't actually working (not sure why). + ;; And CLRHASH doesn't do as much as it should, because if the table + ;; is actually empty, but at some point held 20,000 pathnames, + ;; then we'd write out an enormous vector full of nothing. + (make-pathname-intern-table) ;; Clean up the simulated weak list of covered code components. (rplacd sb-c:*code-coverage-info* (delete-if-not #'weak-pointer-value (cdr sb-c:*code-coverage-info*))) diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index 26e34a2579..1d60823c77 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -298,7 +298,7 @@ ;;; *around* the get and put operations. It makes no sense to lock the table around ;;; individual operations, hence the unsynchronized table. -(define-load-time-global *pathnames* +(defun make-pathname-intern-table () (let ((h (%make-hash-table (logior (pack-ht-flags-weakness +ht-weak-value+) (pack-ht-flags-kind 3) hash-table-userfun-flag) @@ -310,6 +310,8 @@ $1.0))) (install-hash-table-lock h) h)) +(define-load-time-global *pathnames* (make-pathname-intern-table)) + ;;; A pathname is logical if the host component is a logical host. ;;; This constructor is used to make an instance of the correct type ;;; from parsed arguments. From 1ec9a7270aeb2f2b4d7d14919e323b44ee117be8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Jul 2022 18:12:39 -0400 Subject: [PATCH 3691/4023] Speedup genesis-2 for native-on-native build And other endian-and-word-size-compatible host/target combinations. About 7% faster on x86-64, and 9% faster on arm64 native. --- src/cold/shebang.lisp | 10 ++++++++ src/compiler/generic/genesis.lisp | 38 +++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/cold/shebang.lisp b/src/cold/shebang.lisp index b99360f9bf..4edafcbf8a 100644 --- a/src/cold/shebang.lisp +++ b/src/cold/shebang.lisp @@ -31,6 +31,16 @@ ((> (length arch) 1) (error "More than one architecture selected"))) (car arch))) +(defun compatible-vector-raw-bits () ; T if the host and target match on word size and endianness + (flet ((endianness (features) + (let ((result (intersection '(:little-endian :big-endian) features))) + (assert (and result (not (cdr result)))) + (car result))) + (wordsize (features) + (if (member :64-bit features) 64 32))) + (and (eq (endianness sb-xc:*features*) (endianness cl:*features*)) + (= (wordsize sb-xc:*features*) (wordsize cl:*features*))))) + ;;; Not necessarily the logical place to define BACKEND-ASM-PACKAGE-NAME, ;;; but a convenient one. (defun backend-assembler-target-name () diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 7256968c48..a92e945639 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -162,11 +162,41 @@ (setf (bvref-32 bv index) (ldb (byte 32 0) (the (signed-byte 32) newval))) newval) +#+host-quirks-sbcl +(progn + (declaim (inline native-bvref-word (setf native-bvref-word))) + (defun native-bvref-word (bigvec byte-index) + (multiple-value-bind (outer-index inner-index) (floor byte-index +smallvec-length+) + (host-sb-kernel:%vector-raw-bits + (the smallvec (svref (bigvec-outer-vector bigvec) outer-index)) + (ash inner-index (- sb-vm:word-shift))))) + (defun (setf native-bvref-word) (newval bigvec byte-index) + (multiple-value-bind (outer-index inner-index) (floor byte-index +smallvec-length+) + (setf (host-sb-kernel:%vector-raw-bits + (the smallvec (svref (bigvec-outer-vector bigvec) outer-index)) + (ash inner-index (- sb-vm:word-shift))) + newval)))) + ;; lispobj-sized word, whatever that may be ;; hopefully nobody ever wants a 128-bit SBCL... -(macrolet ((acc (bv index) `(#+64-bit bvref-64 #-64-bit bvref-32 ,bv ,index))) - (defun (setf bvref-word) (new-val bytes index) (setf (acc bytes index) new-val)) - (defun bvref-word (bytes index) (acc bytes index))) +(macrolet ((access (bv index &optional alignedp) + (cond ((and alignedp + (and (member :sbcl cl:*features*) + (sb-cold::compatible-vector-raw-bits))) + `(native-bvref-word ,bv ,index)) + (t + `(#+64-bit bvref-64 #-64-bit bvref-32 ,bv ,index))))) + (defun (setf bvref-word-unaligned) (new-val bytes index) + (declare (type sb-xc:fixnum index)) + (setf (access bytes index) new-val)) + (defun (setf bvref-word) (new-val bytes index) + (declare (type sb-xc:fixnum index)) + (aver (not (logtest index (ash sb-vm:lowtag-mask -1)))) + (setf (access bytes index t) new-val)) + (defun bvref-word (bytes index) + (declare (type sb-xc:fixnum index)) + (aver (not (logtest index (ash sb-vm:lowtag-mask -1)))) + (access bytes index t))) ;;;; representation of spaces in the core @@ -3639,7 +3669,7 @@ III. initially undefined function references (alphabetically): (:list (incf n-cons) #b101) (:mixed (incf n-mixed) #b011)) 0))) - (setf (bvref-word ptes pte-offset) (logior sso type-bits)) + (setf (bvref-word-unaligned ptes pte-offset) (logior sso type-bits)) (macrolet ((setter () ;; KLUDGE to avoid compiler note about one or the other ;; branch of this IF being unreachable. From 517810d1698e002d90edf5a8b39cf9620be0064c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Jul 2022 19:16:10 -0400 Subject: [PATCH 3692/4023] Eliminate a few redundant steps in gc_and_save Preparing dynamic space happens twice because large objects need to be moved on the second pass (so they have be made un-large). But immobile space doesn't need both "prepare" operations, not to mention that zeroing the thread TLS after zeroing it the first time is completely pointless. --- src/runtime/gencgc.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 2c7f3eafe6..7d3fdc15e1 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5466,12 +5466,10 @@ zero_all_free_ranges() /* called only by gc_and_save() */ * + Instances on unboxed pages need to have their layout pointer visited, * so all pages have to be turned to boxed. */ -static void -prepare_for_final_gc () +static void prepare_dynamic_space_for_final_gc() { page_index_t i; - prepare_immobile_space_for_final_gc (); for (i = 0; i < next_free_page; i++) { // Compaction requires that we permit large objects to be copied henceforth. // Object of size >= LARGE_OBJECT_SIZE get re-allocated to single-object pages. @@ -5488,17 +5486,6 @@ prepare_for_final_gc () generations[0].bytes_allocated += used; } } - -#ifdef LISP_FEATURE_SB_THREAD - // Avoid tenuring of otherwise-dead objects referenced by - // dynamic bindings which disappear on image restart. - struct thread *thread = get_sb_vm_thread(); - char *start = (char*)&thread->lisp_thread; - char *end = (char*)thread + dynamic_values_bytes; - memset(start, 0, end-start); -#endif - // After zeroing, make sure PINNED_OBJECTS is a list again. - write_TLS(PINNED_OBJECTS, NIL, thread); } /* Set this switch to 1 for coalescing of strings dumped to fasl, @@ -5573,10 +5560,19 @@ gc_and_save(char *filename, boolean prepend_runtime, */ conservative_stack = 0; gencgc_oldest_gen_to_gc = 0; + // Avoid tenuring of otherwise-dead objects referenced by + // dynamic bindings which disappear on image restart. + struct thread *thread = get_sb_vm_thread(); + char *start = (char*)&thread->lisp_thread; + char *end = (char*)thread + dynamic_values_bytes; + memset(start, 0, end-start); + // After zeroing, make sure PINNED_OBJECTS is a list again. + write_TLS(PINNED_OBJECTS, NIL, thread); // From here on until exit, there is no chance of continuing // in Lisp if something goes wrong during GC. pre_verify_gen_0 = 1; - prepare_for_final_gc(); + prepare_immobile_space_for_final_gc(); // once is enough + prepare_dynamic_space_for_final_gc(); unwind_binding_stack(); gencgc_alloc_start_page = next_free_page; collect_garbage(0); @@ -5599,7 +5595,7 @@ gc_and_save(char *filename, boolean prepend_runtime, /* FIXME: now that relocate_heap() works, can we just memmove() everything * down and perform a relocation instead of a collection? */ if (verbose) { printf("[performing final GC..."); fflush(stdout); } - prepare_for_final_gc(); + prepare_dynamic_space_for_final_gc(); gencgc_alloc_start_page = 0; collect_garbage(0); /* All global allocation regions should be empty */ From 18ba739a9e94ba520a6de3c21331eb09b7a2b481 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 14 Jul 2022 19:55:45 -0400 Subject: [PATCH 3693/4023] Specialize bsearch for uint32 and uint64 --- src/runtime/search.c | 58 +++++++++++++++++++++++++---------------- src/runtime/search.h | 4 +++ tests/bsearch.pure.lisp | 4 +-- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/runtime/search.c b/src/runtime/search.c index b5a359a197..bb19ece2e5 100644 --- a/src/runtime/search.c +++ b/src/runtime/search.c @@ -272,39 +272,51 @@ uword_t brothertree_find_greatereql(uword_t key, lispobj tree) return best; } +#define BSEARCH_ALGORITHM_IMPL \ + int low = 0; \ + int high = nelements - 1; \ + while (low <= high) { \ + /* Many authors point out that this is a bug if overflow occurs \ + * and it can be avoided by using low+(high-low)/2 or similar. \ + * But we will never have so many code blobs that overflow occurs. */ \ + int mid = (low + high) / 2; \ + uword_t probe = array[mid]; \ + if (probe < item) low = mid + 1; \ + else if (probe > item) high = mid - 1; \ + else return mid; \ + } \ + /* Binary search a sorted vector (of code base addresses). * This might be useful for generations other than 0, * because we only need to rebuild the vector in GC, which is * easily done; and it's much denser than a tree */ -int bsearch_lesseql(uword_t item, uword_t* array, int nelements) +int bsearch_lesseql_uword(uword_t item, uword_t* array, int nelements) { - int low = 0; - int high = nelements - 1; - while (low <= high) { - // Many authors point out that this is a bug if overflow occurs - // and it can be avoided by using low+(high-low)/2 or similar. - // But we will never have so many code blobs that overflow occurs. - int mid = (low + high) / 2; - uword_t probe = array[mid]; - if (probe < item) low = mid + 1; - else if (probe > item) high = mid - 1; - else return mid; - } + BSEARCH_ALGORITHM_IMPL if (high >= 0) return high; return -1; } -int bsearch_greatereql(uword_t item, uword_t* array, int nelements) +int bsearch_greatereql_uword(uword_t item, uword_t* array, int nelements) { - int low = 0; - int high = nelements - 1; - while (low <= high) { - int mid = (low + high) / 2; - uword_t probe = array[mid]; - if (probe < item) low = mid + 1; - else if (probe > item) high = mid - 1; - else return mid; - } + BSEARCH_ALGORITHM_IMPL + if (low < nelements) return low; + return -1; +} + +#ifdef LISP_FEATURE_64_BIT +/// As above, but using space-relative pointers which halve the storage requirement +int bsearch_lesseql_uint32(uint32_t item, uint32_t* array, int nelements) +{ + BSEARCH_ALGORITHM_IMPL + if (high >= 0) return high; + return -1; +} + +int bsearch_greatereql_uint32(uint32_t item, uint32_t* array, int nelements) +{ + BSEARCH_ALGORITHM_IMPL if (low < nelements) return low; return -1; } +#endif diff --git a/src/runtime/search.h b/src/runtime/search.h index 1ee4d57099..5405e17a3f 100644 --- a/src/runtime/search.h +++ b/src/runtime/search.h @@ -20,5 +20,9 @@ extern lispobj* search_for_symbol(char *name, lispobj start, lispobj end, boolea lispobj *search_all_gc_spaces(void *pointer); // 'search.c' provides lispobj *search_dynamic_space(void *pointer); // Provided by 'gencgc' or 'cheneygc' lispobj *search_immobile_space(void *pointer); +int bsearch_greatereql_uword(uword_t item, uword_t* array, int nelements); +int bsearch_lesseql_uword(uword_t item, uword_t* array, int nelements); +int bsearch_greatereql_uint32(uint32_t item, uint32_t* array, int nelements); +int bsearch_lesseql_uint32(uint32_t item, uint32_t* array, int nelements); #endif diff --git a/tests/bsearch.pure.lisp b/tests/bsearch.pure.lisp index 9d885bc466..f7906301b5 100644 --- a/tests/bsearch.pure.lisp +++ b/tests/bsearch.pure.lisp @@ -11,8 +11,8 @@ (sb-sys:vector-sap array) (length array)))) (unless (eql result -1) (values result (aref array result)))))))) - (define-c-wrapper c-bsearch<= "bsearch_lesseql") - (define-c-wrapper c-bsearch>= "bsearch_greatereql")) + (define-c-wrapper c-bsearch<= "bsearch_lesseql_uword") + (define-c-wrapper c-bsearch>= "bsearch_greatereql_uword")) (defun test-c-bsearch-sorted-vector () (dotimes (vector-len 51) ; test the edge case of an empty vector From 64cdf06d8f0ae7b7e770a1bc55c58cf8e168fa04 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 15 Jul 2022 14:24:21 +0300 Subject: [PATCH 3694/4023] arm64: fix decode-fp-immediate. --- src/compiler/arm64/target-insts.lisp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/compiler/arm64/target-insts.lisp b/src/compiler/arm64/target-insts.lisp index 72ac3bb9ba..ae16e54a73 100644 --- a/src/compiler/arm64/target-insts.lisp +++ b/src/compiler/arm64/target-insts.lisp @@ -314,31 +314,28 @@ (format stream ", LSL #~d" shift))))) (defun decode-fp-immediate (imm type) - (case type - (double-float - (let* ((sign (ldb (byte 1 7) imm)) - (exp (ldb (byte 3 4) imm)) - (frac (ldb (byte 4 0) imm))) + (let ((sign (ldb (byte 1 7) imm)) + (exp (ldb (byte 3 4) imm)) + (frac (ldb (byte 4 0) imm))) + (case type + (double-float (sb-kernel::double-from-bits sign (logior (ash (logandc1 (ldb (byte 1 2) exp) 1) 10) (ash (if (zerop (ldb (byte 1 2) exp)) 0 (ldb (byte 8 0) -1)) - 3) + 2) (ldb (byte 2 0) exp)) - (ash frac 48)))) - (single-float - (let* ((sign (ldb (byte 1 7) imm)) - (exp (ldb (byte 3 4) imm)) - (frac (ldb (byte 4 0) imm))) + (ash frac 48))) + (single-float (sb-kernel::single-from-bits sign (logior (ash (logandc1 (ldb (byte 1 2) exp) 1) 7) (ash (if (zerop (ldb (byte 1 2) exp)) 0 (ldb (byte 5 0) -1)) - 3) + 2) (ldb (byte 2 0) exp)) (ash frac 19)))))) From 9e3ac2eab4a5c999d099713730135c2b938356de Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 15 Jul 2022 18:30:20 +0300 Subject: [PATCH 3695/4023] Remove an AVER that is duplicating a type check. --- src/pcl/std-class.lisp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index 20c1cfaa85..e0b0693fd9 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -1619,9 +1619,7 @@ ((fixnump location) (clos-slots-ref oslots location)) ((not location) - (let ((location (slot-info-location (cdr cell)))) - (aver (integerp location)) - (clos-slots-ref oslots (slot-info-location (cdr cell))))) + (clos-slots-ref oslots (slot-info-location (cdr cell)))) (t (bug "non-FIXNUM non-NULL location in cell: ~S" cell))))) (unless (unbound-marker-p value) (let ((new (assq name layout))) From 93fbd5feca9947fd470641b210c246a93c440a62 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 15 Jul 2022 14:22:52 -0400 Subject: [PATCH 3696/4023] Place lisp assembly routines in static space So we're consistent in they can always point to dynamic space as on x86-64. I believe that #+(and win32 x86) was properly dealt with in rev 59987aeac51a but unfortunately #+darwin-jit is now the outlier. --- src/compiler/generic/parms.lisp | 4 +++- src/compiler/x86/parms.lisp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 5975ceaeb2..9a2392813f 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -66,7 +66,9 @@ ((:varyobj-space-start varyobj-space-start*)) ((:varyobj-space-size varyobj-space-size*) (* 104 1024 1024)) (small-space-size #x100000) - ((:read-only-space-size ro-space-size) small-space-size)) + ((:read-only-space-size ro-space-size) + #+darwin-jit small-size-size + #-darwin-jit 0)) (declare (ignorable dynamic-space-start*)) ; might be unused in make-host-2 (flet ((defconstantish (relocatable symbol value) (if (not relocatable) ; easy case diff --git a/src/compiler/x86/parms.lisp b/src/compiler/x86/parms.lisp index 5cc9cc2813..d5cfb28462 100644 --- a/src/compiler/x86/parms.lisp +++ b/src/compiler/x86/parms.lisp @@ -163,7 +163,7 @@ ;;; table: "In CMUCL: 0xB0000000->0xB1000000" (defmacro space-setup (arg &rest more) - `(!gencgc-space-setup ,arg #-win32 :read-only-space-size #-win32 0 ,@more)) + `(!gencgc-space-setup ,arg ,@more)) #+win32 (space-setup #x22000000) #+linux (space-setup #x01000000 :dynamic-space-start #x09000000) From 902154fe9a2281d829109565ff9f7bb418884566 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 16 Jul 2022 01:08:36 +0300 Subject: [PATCH 3697/4023] Typo. --- src/compiler/generic/parms.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 9a2392813f..9cc85ec905 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -67,7 +67,7 @@ ((:varyobj-space-size varyobj-space-size*) (* 104 1024 1024)) (small-space-size #x100000) ((:read-only-space-size ro-space-size) - #+darwin-jit small-size-size + #+darwin-jit small-space-size #-darwin-jit 0)) (declare (ignorable dynamic-space-start*)) ; might be unused in make-host-2 (flet ((defconstantish (relocatable symbol value) From 97d01a7136e3ffcbaf1d0b5bf676de2ce8957cca Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 15 Jul 2022 18:43:50 -0400 Subject: [PATCH 3698/4023] Test :darwin-jit under crossbuild-runner --- crossbuild-runner/backends/arm64/local-target-features | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crossbuild-runner/backends/arm64/local-target-features b/crossbuild-runner/backends/arm64/local-target-features index 13e051b152..93ce7690c1 100644 --- a/crossbuild-runner/backends/arm64/local-target-features +++ b/crossbuild-runner/backends/arm64/local-target-features @@ -1 +1 @@ -:little-endian :sb-thread +:little-endian :sb-thread :darwin-jit From 7882c92e6a5d6da86c2acd1242806aa05f0479f8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 15 Jul 2022 19:56:50 -0400 Subject: [PATCH 3699/4023] Replace sb-unix:unix-select with sb-unix:unix-simple-poll This fixes the problem that select() is typically limited to fewer file descriptors (1024) than the OS will in practice hand out. simple-poll has an emulation wrapper on select where poll() is absent, so there's really no need to pick which lisp function to use. --- src/code/run-program.lisp | 15 ++------------- src/code/unix.lisp | 2 +- tests/run-program.test.sh | 6 ++++++ 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/code/run-program.lisp b/src/code/run-program.lisp index 1ede70f930..19562c1b80 100644 --- a/src/code/run-program.lisp +++ b/src/code/run-program.lisp @@ -1041,19 +1041,8 @@ Users Manual for details about the PROCESS structure. (loop (unless handler (return)) - (multiple-value-bind - (result readable/errno) - (sb-unix:unix-select (1+ descriptor) - (ash 1 descriptor) - 0 0 0) - (cond ((null result) - (if (eql sb-unix:eintr readable/errno) - (return) - (error "~@<Couldn't select on sub-process: ~ - ~2I~_~A~:>" - (strerror readable/errno)))) - ((zerop result) - (return)))) + (unless (sb-unix:unix-simple-poll descriptor :input 0) + (return)) (multiple-value-bind (count errno) (with-pinned-objects (buf) (sb-unix:unix-read descriptor diff --git a/src/code/unix.lisp b/src/code/unix.lisp index 65cfeea959..b60f715414 100644 --- a/src/code/unix.lisp +++ b/src/code/unix.lisp @@ -745,7 +745,7 @@ avoiding atexit(3) hooks, etc. Otherwise exit(2) is called." nfds (frob rdfds rdf) (frob wrfds wrf) (frob xpfds xpf) (if to-secs (alien-sap (addr tv)) (int-sap 0))))))) -;;; Lisp-side implmentations of FD_FOO macros. +;;; Lisp-side implementations of FD_FOO macros. (declaim (inline fd-set fd-clr fd-isset fd-zero)) (defun fd-set (offset fd-set) (multiple-value-bind (word bit) (floor offset diff --git a/tests/run-program.test.sh b/tests/run-program.test.sh index 3a08741709..f22d40ee4a 100755 --- a/tests/run-program.test.sh +++ b/tests/run-program.test.sh @@ -44,6 +44,12 @@ run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF' (assert (equal string "FEEFIE=foefum "))) +(when (fboundp (find-symbol "UNIX-POLL" "SB-UNIX")) + (let ((f (open "/dev/null"))) + (with-alien ((dup (function int int) :extern)) + (dotimes (i 1025) (alien-funcall dup (sb-impl::fd-stream-fd f))) + (assert (> (alien-funcall dup (sb-impl::fd-stream-fd f)) 1024))))) + ;; Unicode strings (flet ((try (sb-impl::*default-external-format* x y) (let* ((process (run-program From 856a6ac26f2e7ac74d5f26cd4390bc1bd7e63c4e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 15 Jul 2022 20:31:05 -0400 Subject: [PATCH 3700/4023] Remove sb-unix:unix-select At the risk of upsetting some users- the function was not for public consumption. --- src/code/serve-event.lisp | 2 +- src/code/unix.lisp | 64 --------------------------------------- src/cold/exports.lisp | 2 +- 3 files changed, 2 insertions(+), 66 deletions(-) diff --git a/src/code/serve-event.lisp b/src/code/serve-event.lisp index cbfce39987..d5ad7f58dc 100644 --- a/src/code/serve-event.lisp +++ b/src/code/serve-event.lisp @@ -321,7 +321,7 @@ happens. Server returns T if something happened and NIL otherwise. Timeout (let ((count 0)) (declare (type index count)) - ;; Initialize the fd-sets for UNIX-SELECT and return the active + ;; Initialize the fd-sets for UNIX-FAST-SELECT and return the active ;; descriptor count. (map-descriptor-handlers (lambda (handler) diff --git a/src/code/unix.lisp b/src/code/unix.lisp index b60f715414..5cb21d01cf 100644 --- a/src/code/unix.lisp +++ b/src/code/unix.lisp @@ -656,8 +656,6 @@ avoiding atexit(3) hooks, etc. Otherwise exit(2) is called." (declare (type (integer 0 #.fd-setsize) ,n)) ,@body)) -;;;; FIXME: Why have both UNIX-SELECT and UNIX-FAST-SELECT? - ;;; Perform the UNIX select(2) system call. (declaim (inline unix-fast-select)) (defun unix-fast-select (num-descriptors @@ -683,68 +681,6 @@ avoiding atexit(3) hooks, etc. Otherwise exit(2) is called." (note-dangerous-wait "select(2)")) (select (int-sap 0))))))) -;;; UNIX-SELECT accepts sets of file descriptors and waits for an event -;;; to happen on one of them or to time out. -(declaim (inline num-to-fd-set fd-set-to-num)) -(defun num-to-fd-set (fdset num) - (typecase num - (fixnum - (setf (deref (slot fdset 'fds-bits) 0) num) - (loop for index from 1 below (/ fd-setsize - sb-vm:n-machine-word-bits) - do (setf (deref (slot fdset 'fds-bits) index) 0))) - (t - (loop for index from 0 below (/ fd-setsize - sb-vm:n-machine-word-bits) - do (setf (deref (slot fdset 'fds-bits) index) - (ldb (byte sb-vm:n-machine-word-bits - (* index sb-vm:n-machine-word-bits)) - num)))))) - -(defun fd-set-to-num (nfds fdset) - (if (<= nfds sb-vm:n-machine-word-bits) - (deref (slot fdset 'fds-bits) 0) - (loop for index below (/ fd-setsize - sb-vm:n-machine-word-bits) - sum (ash (deref (slot fdset 'fds-bits) index) - (* index sb-vm:n-machine-word-bits))))) - -;;; Examine the sets of descriptors passed as arguments to see whether -;;; they are ready for reading and writing. See the UNIX Programmer's -;;; Manual for more information. -(defun unix-select (nfds rdfds wrfds xpfds to-secs &optional (to-usecs 0)) - (declare (muffle-conditions compiler-note)) - (declare (type integer nfds) - (type unsigned-byte rdfds wrfds xpfds) - (type (or (unsigned-byte 31) null) to-secs) - (type (unsigned-byte 31) to-usecs) - (optimize (speed 3) (safety 0))) - (with-fd-setsize (nfds) - (with-alien ((tv (struct timeval)) - (rdf (struct fd-set)) - (wrf (struct fd-set)) - (xpf (struct fd-set))) - (cond (to-secs - (setf (slot tv 'tv-sec) to-secs - (slot tv 'tv-usec) to-usecs)) - ((not *interrupts-enabled*) - (note-dangerous-wait "select(2)"))) - (num-to-fd-set rdf rdfds) - (num-to-fd-set wrf wrfds) - (num-to-fd-set xpf xpfds) - (macrolet ((frob (lispvar alienvar) - `(if (zerop ,lispvar) - (int-sap 0) - (alien-sap (addr ,alienvar))))) - (syscall ("sb_select" int (* (struct fd-set)) (* (struct fd-set)) - (* (struct fd-set)) (* (struct timeval))) - (values result - (fd-set-to-num nfds rdf) - (fd-set-to-num nfds wrf) - (fd-set-to-num nfds xpf)) - nfds (frob rdfds rdf) (frob wrfds wrf) (frob xpfds xpf) - (if to-secs (alien-sap (addr tv)) (int-sap 0))))))) - ;;; Lisp-side implementations of FD_FOO macros. (declaim (inline fd-set fd-clr fd-isset fd-zero)) (defun fd-set (offset fd-set) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index a6c61c2c2b..865fc27e34 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -98,7 +98,7 @@ interface stability.") "UNIX-OPEN" "UNIX-OPENDIR" "UNIX-PATHNAME" "UNIX-PID" "UNIX-PIPE" "UNIX-POLL" "UNIX-SIMPLE-POLL" "UNIX-READ" "UNIX-READDIR" "UNIX-READLINK" "UNIX-REALPATH" - "UNIX-RENAME" "UNIX-SELECT" "UNIX-STAT" "UNIX-UID" + "UNIX-RENAME" "UNIX-STAT" "UNIX-UID" "UNIX-UNLINK" "UNIX-WRITE" "WCONTINUED" "WNOHANG" "WUNTRACED" "W_OK" "X_OK" From aa4daf895766adc73fc0493c9f3dd1c61e011b13 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 16 Jul 2022 14:07:45 +0300 Subject: [PATCH 3701/4023] cast-externally-checkable-p: skip fixed-args functions. As they don't check their arguments. --- src/compiler/checkgen.lisp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/compiler/checkgen.lisp b/src/compiler/checkgen.lisp index 45404e1525..dab02e49c0 100644 --- a/src/compiler/checkgen.lisp +++ b/src/compiler/checkgen.lisp @@ -312,6 +312,9 @@ (let* ((lvar (node-lvar cast)) (dest (and lvar (lvar-dest lvar)))) (and (combination-p dest) + (or (not (combination-fun-info dest)) + ;; fixed-args functions do not check their arguments. + (not (ir1-attributep (fun-info-attributes (combination-fun-info dest)) fixed-args))) ;; The theory is that the type assertion is from a declaration on the ;; callee, so the callee should be able to do the check. We want to ;; let the callee do the check, because it is possible that by the From 4086318030c40bd2dafc2026fa9d045d42e34837 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Sat, 16 Jul 2022 14:26:47 +0300 Subject: [PATCH 3702/4023] arm64, load-immediate-word: properly handle unsigned 64 bit integers. Don't special case negative numbers and handle everything as unsigned. --- src/compiler/arm64/move.lisp | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/compiler/arm64/move.lisp b/src/compiler/arm64/move.lisp index a21f7995b0..d7d514f307 100644 --- a/src/compiler/arm64/move.lisp +++ b/src/compiler/arm64/move.lisp @@ -12,24 +12,23 @@ (in-package "SB-VM") (defun load-immediate-word (y val &optional single-instruction) - (let (single-mov) + (let (single-mov + ffff-count + zero-count + (val (ldb (byte 64 0) val))) (flet ((single-mov () - (setf single-mov - (or (= (loop for i below 64 by 16 - for part = (ldb (byte 16 i) val) - unless (= part #xFFFF) - count t) - 1) - (= (loop for i below 64 by 16 - for part = (ldb (byte 16 i) val) - count (plusp part)) - 1))))) + (loop for i below 64 by 16 + for part = (ldb (byte 16 i) val) + count (/= part #xFFFF) into ffff + count (plusp part) into zero + finally + (setf ffff-count ffff + zero-count zero + single-mov (or (= ffff 1) + (= zero 1)))))) (cond ((typep val '(unsigned-byte 16)) (inst movz y val) y) - ((typep val '(and (signed-byte 16) (integer * -1))) - (inst movn y (lognot val)) - y) ((typep (ldb (byte 64 0) (lognot val)) '(unsigned-byte 16)) (inst movn y (ldb (byte 64 0) (lognot val))) y) @@ -86,7 +85,7 @@ ((= c d) (try c a 0 b 16))))))) y) - ((and (minusp val) + ((and (< ffff-count zero-count) (or single-mov (not single-instruction))) (loop with first = t From fc686aef1c38ac4cea1897f545a06c339f67eca9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 16 Jul 2022 10:56:56 -0400 Subject: [PATCH 3703/4023] Use a cheaper test than heap-allocated-p in logically-readonlyize Check only for dynamic space. Prevent dynamic-space-free-pointer from potentiallly consing a (signed-byte 64) and a SAP. (It probably wouldn't, but it contained allocation code for both) --- src/code/gc.lisp | 27 +++++++++++++++------------ src/code/string.lisp | 11 +++++++++-- src/code/symbol.lisp | 5 ++++- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 05528dd7bc..c650d6b87e 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -25,7 +25,14 @@ (declaim (inline dynamic-space-free-pointer)) (defun dynamic-space-free-pointer () (sap+ (int-sap (current-dynamic-space-start)) - (* (extern-alien "next_free_page" signed) sb-vm:gencgc-page-bytes)))) + ;; not sure why next_free_page is 'sword_t' instead of 'uword_t' ! + (truly-the (signed-byte 64) + (* (extern-alien "next_free_page" signed) sb-vm:gencgc-page-bytes))))) + +(defun dynamic-space-obj-p (x) ; X must not be an immediate object + (with-pinned-objects (x) + (let ((addr (get-lisp-obj-address x))) + (< (current-dynamic-space-start) addr (sap-int (dynamic-space-free-pointer)))))) (declaim (inline dynamic-usage)) (defun dynamic-usage () @@ -598,18 +605,14 @@ Experimental: interface subject to change." :static)))) ;;; Return true if X is in any non-stack GC-managed space. ;;; (Non-stack implies not TLS nor binding stack) -;;; This assumes a single contiguous dynamic space, which is of course a -;;; bad assumption, but nonetheless one that has been true for, say, ~20 years. -;;; Also note, we don't have to pin X - an object can not move between spaces, -;;; so a non-nil answer is the definite answer. As to whether the object could -;;; have moved, or worse, died - by say reusing the same register as held X for -;;; the value that is (get-lisp-obj-address X), with no surrounding pin or even -;;; reference to X - then that's your problem. -;;; If you wanted the object not to die or move, you should have held on tighter! +;;; There's a microscopic window of time in which next_free_page for dynamic space +;;; could _decrease_ after calculating the address of X, so we'll pin X +;;; to ensure that can't happen. (defun heap-allocated-p (x) - (let ((addr (get-lisp-obj-address x))) - (and (sb-vm:is-lisp-pointer addr) - (cases)))) + (with-pinned-objects (x) + (let ((addr (get-lisp-obj-address x))) + (and (sb-vm:is-lisp-pointer addr) + (cases))))) ;;; Internal use only. FIXME: I think this duplicates code that exists ;;; somewhere else which I could not find. diff --git a/src/code/string.lisp b/src/code/string.lisp index 2ce04b88ae..57ee736773 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -881,10 +881,17 @@ new string COUNT long filled with the fill character." (generic-string-trim char-bag string t t)) (defun logically-readonlyize (vector &optional (always-shareable t)) - ;; "Always" means that regardless of whether the user want + ;; "Always" means that regardless of whether the user wanted ;; coalescing of strings used as literals in code compiled to memory, ;; the string is shareable. - (when (eq (heap-allocated-p vector) :dynamic) + (when (sb-kernel::dynamic-space-obj-p vector) + ;; FIXME: did I get the condition backwards? I'm trying to remember what it meant. + ;; "Always" should mean that the language specifies the behavior, e.g. strings used + ;; as print names can not be modified. (edge case: if it ceases to be a print name, + ;; can it then be modified?) "Not always" means that we've done an + ;; implementation-specific thing to make more strings shareable than specified. + ;; "Always" isn't really the best terminology for the semantics, I guess. + ;; And are there any tests around this??? (logior-array-flags (the (simple-array * 1) vector) (if always-shareable sb-vm:+vector-shareable+ diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index 32339838b0..e9668b6ef9 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -359,7 +359,10 @@ distinct from the global value. Can also be SETF." (defun %make-symbol (kind name) (declare (ignorable kind) (type simple-string name)) - (logior-array-flags name sb-vm:+vector-shareable+) ; Set "logically read-only" bit + ;; Avoid writing to the string header if it's already flagged as readonly, or off-heap. + (when (and (not (logtest (ash sb-vm:+vector-shareable+ 8) (get-header-data name))) + (sb-kernel::dynamic-space-obj-p name)) + (logior-array-flags name sb-vm:+vector-shareable+)) ; Set "logically read-only" bit (let ((symbol (truly-the symbol #+immobile-symbols (sb-vm::make-immobile-symbol name) From 3fc0fa3df08fe1c3602efd7ff29ea8ec1bd061d8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 16 Jul 2022 11:41:46 -0400 Subject: [PATCH 3704/4023] Improve space relocation Allow up to 4 relocatable spaces. And revise some obsolete commentary. --- src/runtime/coreparse.c | 102 ++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 55 deletions(-) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index a6ea7be62f..6cc8389557 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -218,13 +218,12 @@ static void inflate_core_bytes(int fd, os_vm_offset_t offset, } #endif -#define DYNAMIC_SPACE_ADJ_INDEX 0 +#define MAX_SPACE_RELOCATION_RANGES 4 struct heap_adjust { - /* range[0] is dynamic space, ranges[1] and [2] are immobile spaces */ struct range { lispobj start, end; sword_t delta; - } range[3]; + } range[MAX_SPACE_RELOCATION_RANGES]; int n_ranges; int n_relocs_abs; // absolute int n_relocs_rel; // relative @@ -238,35 +237,46 @@ struct heap_adjust { static inline sword_t calc_adjustment(struct heap_adjust* adj, lispobj x) { - if (adj->range[0].start <= x && x < adj->range[0].end) - return adj->range[0].delta; -#ifdef LISP_FEATURE_IMMOBILE_SPACE - if (adj->range[1].start <= x && x < adj->range[1].end) - return adj->range[1].delta; - if (adj->range[2].start <= x && x < adj->range[2].end) - return adj->range[2].delta; -#endif + int j; + for (j = adj->n_ranges - 1 ; j >= 0 ; --j) + if (adj->range[j].start <= x && x < adj->range[j].end) return adj->range[j].delta; return 0; } -// Return the adjusted value of 'word' without testing whether it looks -// like a pointer. But do test whether it points to a relocatable space. -static inline lispobj adjust_word(struct heap_adjust* adj, lispobj word) { - return word + calc_adjustment(adj, word); -} - // Given a post-relocation object 'x', compute the address at which // it was originally expected to have been placed as per the core file. static inline lispobj inverse_adjust(struct heap_adjust* adj, lispobj x) { int j; - for (j=0; j<3; ++j) + for (j = adj->n_ranges - 1 ; j >= 0 ; --j) if (adj->range[j].start + adj->range[j].delta <= x && x < adj->range[j].end + adj->range[j].delta) return x - adj->range[j].delta; return x; } +// Return the adjusted value of 'word' without testing whether it looks +// like a pointer. But do test whether it points to a relocatable space. +static inline lispobj adjust_word(struct heap_adjust* adj, lispobj word) { + return word + calc_adjustment(adj, word); +} + +static void +set_adjustment(struct heap_adjust* adj, + uword_t actual_addr, + uword_t desired_addr, + uword_t len) +{ + sword_t delta = len ? actual_addr - desired_addr : 0; + if (!delta) return; + int j = adj->n_ranges; + gc_assert(j < MAX_SPACE_RELOCATION_RANGES); + adj->range[j].start = (lispobj)desired_addr; + adj->range[j].end = (lispobj)desired_addr + len; + adj->range[j].delta = delta; + adj->n_ranges = j+1; +} + #define SHOW_SPACE_RELOCATION 0 #if SHOW_SPACE_RELOCATION > 1 # define FIXUP(expr, addr) fprintf(stderr, "%p: (a) %lx", addr, *(long*)(addr)), \ @@ -415,7 +425,7 @@ static void relocate_space(uword_t start, lispobj* end, struct heap_adjust* adj) lispobj name = decode_symbol_name(s->name); lispobj adjusted_name = adjust_word(adj, name); // writeback the name if it changed - if (adjusted_name != name) set_symbol_name(s, adjusted_name); + if (adjusted_name != name) FIXUP(set_symbol_name(s, adjusted_name), &s->name); int indicated_nwords = (*where>>N_WIDETAG_BITS) & 0xFF; adjust_pointers(&s->fdefn, indicated_nwords - 4, adj); } @@ -431,6 +441,8 @@ static void relocate_space(uword_t start, lispobj* end, struct heap_adjust* adj) case CODE_HEADER_WIDETAG: if (filler_obj_p(where)) { // OMGWTF! Why does a filler code object merit adjustment? + // (Probably for when holes were chained through debug-info? + // But we don't save holes any more, because of defrag) if (where[2]) adjust_word_at(where+2, adj); continue; } @@ -606,20 +618,6 @@ static void relocate_heap(struct heap_adjust* adj) #endif } -static void -set_adjustment(struct heap_adjust* adj, - uword_t actual_addr, - uword_t desired_addr, - uword_t len) -{ - int j = adj->n_ranges; - gc_assert(j <= 2); - adj->range[j].start = (lispobj)desired_addr; - adj->range[j].end = (lispobj)desired_addr + len; - adj->range[j].delta = len ? actual_addr - desired_addr : 0; - adj->n_ranges = j+1; -} - #if defined(LISP_FEATURE_ELF) && defined(LISP_FEATURE_IMMOBILE_SPACE) extern int apply_pie_relocs(long,long,int); #else @@ -805,14 +803,10 @@ process_directory(int count, struct ndir_entry *entry, if (id < 1 || id > MAX_CORE_SPACE_ID) lose("unknown space ID %ld addr %p", id, (void*)addr); -#ifdef LISP_FEATURE_IMMOBILE_SPACE - // Enforce address of readonly, static, immobile varyobj - int enforce_address = id != DYNAMIC_CORE_SPACE_ID - && id != IMMOBILE_FIXEDOBJ_CORE_SPACE_ID - && id != IMMOBILE_VARYOBJ_CORE_SPACE_ID; +#ifdef LISP_FEATURE_DARWIN_JIT + int enforce_address = (id == STATIC_CORE_SPACE_ID) || (id == READ_ONLY_CORE_SPACE_ID); #else - // Enforce address of readonly and static spaces. - int enforce_address = id != DYNAMIC_CORE_SPACE_ID; + int enforce_address = id == STATIC_CORE_SPACE_ID; #endif // We'd like to enforce proper alignment of 'addr' but there's @@ -968,11 +962,16 @@ process_directory(int count, struct ndir_entry *entry, } calc_asm_routine_bounds(); -# ifdef LISP_FEATURE_GENCGC +#ifdef LISP_FEATURE_GENCGC set_adjustment(adj, DYNAMIC_SPACE_START, // actual spaces[DYNAMIC_CORE_SPACE_ID].base, // expected spaces[DYNAMIC_CORE_SPACE_ID].len); -# ifdef LISP_FEATURE_IMMOBILE_SPACE +#else + set_adjustment(adj, DYNAMIC_0_SPACE_START, // actual + spaces[DYNAMIC_CORE_SPACE_ID].base, // expected + spaces[DYNAMIC_CORE_SPACE_ID].len); +#endif // LISP_FEATURE_GENCGC +#ifdef LISP_FEATURE_IMMOBILE_SPACE set_adjustment(adj, FIXEDOBJ_SPACE_START, // actual spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].base, // expected spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].len); @@ -983,21 +982,14 @@ process_directory(int count, struct ndir_entry *entry, set_adjustment(adj, VARYOBJ_SPACE_START, // actual spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].base, // expected spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].len); -# endif -# else - set_adjustment(adj, DYNAMIC_0_SPACE_START, // actual - spaces[DYNAMIC_CORE_SPACE_ID].base, // expected - spaces[DYNAMIC_CORE_SPACE_ID].len); -# endif // LISP_FEATURE_GENCGC - if (adj->range[0].delta | adj->range[1].delta | adj->range[2].delta) { - relocate_heap(adj); - } +#endif + if (adj->n_ranges) relocate_heap(adj); #ifdef LISP_FEATURE_IMMOBILE_SPACE - /* Now determine page characteristics (such as object spacing) - * after relocation, because we need to know which objects are layouts - * based on knowing layout-of-layout. The test for that is dependent - * on what it's address should be, not what it was in the file */ + /* Now determine page characteristics such as object spacing + * (tbh it would be better to output the immobile-space page tables to the core file). + * This used to depend critically on space relocation already having been performed. + * It doesn't any more, but this is an OK time to do it */ immobile_space_coreparse(spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].len, spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].len); calc_immobile_space_bounds(); From 39f8efdff8f31678800b6cb43ae6c3c1d40867ad Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 16 Jul 2022 12:08:42 -0400 Subject: [PATCH 3705/4023] Move some gencgc things to headers So that contiguous_block tests can be used in other files. --- src/runtime/fullcgc.c | 1 - src/runtime/gc-internal.h | 3 ++ src/runtime/gc-private.h | 4 +++ src/runtime/gencgc-private.h | 54 ++++++++++++++++++++++++++++++++++ src/runtime/gencgc.c | 56 ++---------------------------------- 5 files changed, 64 insertions(+), 54 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 4fec110594..787e964018 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -210,7 +210,6 @@ static inline int pointer_survived_gc_yet(lispobj pointer) return (header & MARK_BIT) != 0; } -extern page_index_t contiguous_block_final_page(page_index_t); void dump_marked_objects() { fprintf(stderr, "Marked objects:\n"); page_index_t first = 0; diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index dcb764b759..624b3dd081 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -40,6 +40,9 @@ extern struct weak_pointer *weak_pointer_chain; /* in gc-common.c */ #include "align.h" +// Distinguish penultimate GC (iteration 1) from ultimate GC (iteration 2) in save-lisp +extern int save_lisp_gc_iteration; + // Offset from an fdefn raw address to the underlying simple-fun, // if and only if it points to a simple-fun. // For those of us who are too memory-impaired to know how to use the value: diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index 1ffd661fe1..341f7a656a 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -575,4 +575,8 @@ static inline boolean plausible_tag_p(lispobj addr) # define filler_total_nwords(header) ((header)>>N_WIDETAG_BITS) #endif +static inline boolean readonly_space_p(lispobj ptr) { + return ptr >= READ_ONLY_SPACE_START && (lispobj*)ptr < read_only_space_free_pointer; +} + #endif /* _GC_PRIVATE_H_ */ diff --git a/src/runtime/gencgc-private.h b/src/runtime/gencgc-private.h index 41e1e5297d..65c74924fd 100644 --- a/src/runtime/gencgc-private.h +++ b/src/runtime/gencgc-private.h @@ -100,4 +100,58 @@ static inline enum prot_mode protection_mode(page_index_t page) { } #endif +/* True if the page starts a contiguous block. */ +static inline boolean +page_starts_contiguous_block_p(page_index_t page_index) +{ + // Don't use the preprocessor macro: 0 means 0. + return page_table[page_index].scan_start_offset_ == 0; +} + +/* True if the page is the last page in a contiguous block. */ +static inline boolean +page_ends_contiguous_block_p(page_index_t page_index, + generation_index_t __attribute__((unused)) gen) +{ + /* Re. this next test: git rev c769dd53 said that there was a bug when we don't + * test page_bytes_used, but I fail to see how 'page_starts_contiguous_block_p' + * on the next page is not a STRONGER condition, i.e. it should imply that + * 'page_index' ends a block without regard for the number of bytes used. + * Apparently at some point I understood this and now I don't again. + * That's what comments are for, damnit. + * Anyway, I *think* the issue was, at some point, as follows: + * | page | page | + * pinned-obj + * <------------------- scan-start + * where the first of the two pages had a small object pinned. This used to + * adjust the bytes used to account _only_ for the pins. That was wrong - + * the page has to be counted as if it is completely full. + * So _maybe_ both these conditions do not need to be present now ? + */ + // There is *always* a next page in the page table. + boolean answer = page_words_used(page_index) < GENCGC_PAGE_WORDS + || page_starts_contiguous_block_p(page_index+1); +#ifdef DEBUG + boolean safe_answer = + (/* page doesn't fill block */ + (page_words_used(page_index) < GENCGC_PAGE_WORDS) + /* page is last allocated page */ + || ((page_index + 1) >= next_free_page) + /* next page contains no data */ + || !page_words_used(page_index + 1) + /* next page is in different generation */ + || (page_table[page_index + 1].gen != gen) + /* next page starts its own contiguous block */ + || (page_starts_contiguous_block_p(page_index + 1))); + gc_assert(answer == safe_answer); +#endif + return answer; +} + +static inline page_index_t contiguous_block_final_page(page_index_t first) { + page_index_t last = first; + while (!page_ends_contiguous_block_p(last, page_table[first].gen)) ++last; + return last; +} + #endif /* _GENCGC_PRIVATE_H_ */ diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 7d3fdc15e1..5ff8f45054 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -153,6 +153,7 @@ boolean gc_active_p = 0; /* should the GC be conservative on stack. If false (only right before * saving a core), don't scan the stack / mark pages pinned. */ static boolean conservative_stack = 1; +int save_lisp_gc_iteration; /* An array of page structures is allocated on gc initialization. * This helps to quickly map between an address and its page structure. @@ -207,59 +208,6 @@ page_scan_start(page_index_t page_index) return page_address(page_index)-page_scan_start_offset(page_index); } -/* True if the page starts a contiguous block. */ -static inline boolean -page_starts_contiguous_block_p(page_index_t page_index) -{ - // Don't use the preprocessor macro: 0 means 0. - return page_table[page_index].scan_start_offset_ == 0; -} - -/* True if the page is the last page in a contiguous block. */ -static inline boolean -page_ends_contiguous_block_p(page_index_t page_index, - generation_index_t __attribute__((unused)) gen) -{ - /* Re. this next test: git rev c769dd53 said that there was a bug when we don't - * test page_bytes_used, but I fail to see how 'page_starts_contiguous_block_p' - * on the next page is not a STRONGER condition, i.e. it should imply that - * 'page_index' ends a block without regard for the number of bytes used. - * Apparently at some point I understood this and now I don't again. - * That's what comments are for, damnit. - * Anyway, I *think* the issue was, at some point, as follows: - * | page | page | - * pinned-obj - * <------------------- scan-start - * where the first of the two pages had a small object pinned. This used to - * adjust the bytes used to account _only_ for the pins. That was wrong - - * the page has to be counted as if it is completely full. - * So _maybe_ both these conditions do not need to be present now ? - */ - // There is *always* a next page in the page table. - boolean answer = page_words_used(page_index) < GENCGC_PAGE_WORDS - || page_starts_contiguous_block_p(page_index+1); -#ifdef DEBUG - boolean safe_answer = - (/* page doesn't fill block */ - (page_words_used(page_index) < GENCGC_PAGE_WORDS) - /* page is last allocated page */ - || ((page_index + 1) >= next_free_page) - /* next page contains no data */ - || !page_words_used(page_index + 1) - /* next page is in different generation */ - || (page_table[page_index + 1].gen != gen) - /* next page starts its own contiguous block */ - || (page_starts_contiguous_block_p(page_index + 1))); - gc_assert(answer == safe_answer); -#endif - return answer; -} -page_index_t contiguous_block_final_page(page_index_t first) { - page_index_t last = first; - while (!page_ends_contiguous_block_p(last, page_table[first].gen)) ++last; - return last; -} - /* We maintain the invariant that pages with FREE_PAGE_FLAG have * scan_start of zero, to optimize page_ends_contiguous_block_p(). * Clear all the flags that don't pertain to a free page. @@ -5574,6 +5522,7 @@ gc_and_save(char *filename, boolean prepend_runtime, prepare_immobile_space_for_final_gc(); // once is enough prepare_dynamic_space_for_final_gc(); unwind_binding_stack(); + save_lisp_gc_iteration = 1; gencgc_alloc_start_page = next_free_page; collect_garbage(0); verify_heap(0, VERIFY_POST_GC); @@ -5596,6 +5545,7 @@ gc_and_save(char *filename, boolean prepend_runtime, * down and perform a relocation instead of a collection? */ if (verbose) { printf("[performing final GC..."); fflush(stdout); } prepare_dynamic_space_for_final_gc(); + save_lisp_gc_iteration = 2; gencgc_alloc_start_page = 0; collect_garbage(0); /* All global allocation regions should be empty */ From ceb2eb6f724bacff11eb8dac1dad22cdbaf81b61 Mon Sep 17 00:00:00 2001 From: Robert Schiele <rschiele@gmail.com> Date: Sat, 16 Jul 2022 15:07:49 -0400 Subject: [PATCH 3706/4023] increase potential soft ulimit on file descriptors for test A new test in tests/run-program.test.sh checks that more than 1024 file descriptors can be used. On systems with a lower ulimit set this test will fail despite the implementation working correctly. --- tests/run-program.test.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/run-program.test.sh b/tests/run-program.test.sh index f22d40ee4a..749cee3d52 100755 --- a/tests/run-program.test.sh +++ b/tests/run-program.test.sh @@ -22,6 +22,10 @@ export SOMETHING_IN_THE_ENVIRONMENT PATH=/some/path/that/does/not/exist:${PATH} export PATH +# Increase potential soft ulimit on file descriptors for file +# descriptor test case below. +test `ulimit -n` -ge 1050 || ulimit -S -n 1050 + # This should probably be broken up into separate pieces. run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF' ;; test that $PATH is searched From 7e7977abc6ef18d4b8a9dca277ba0b55e8013ced Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 16 Jul 2022 15:55:18 -0400 Subject: [PATCH 3707/4023] Fix newly introduced bug from 3fc0fa3df08f * Don't assume that index 2 in 'adj' is for varyobj space * Or that PIE ELF cores are ever going to work * Or that readonly space can be accessed past its free pointer --- src/runtime/coalesce.c | 4 +--- src/runtime/coreparse.c | 10 +++------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/runtime/coalesce.c b/src/runtime/coalesce.c index 02ada2142f..defc86f8d7 100644 --- a/src/runtime/coalesce.c +++ b/src/runtime/coalesce.c @@ -207,9 +207,7 @@ void coalesce_similar_objects() uword_t arg = (uword_t)&ht; hopscotch_create(&ht, HOPSCOTCH_VECTOR_HASH, 0, 1<<17, 0); - coalesce_range((lispobj*)READ_ONLY_SPACE_START, - (lispobj*)READ_ONLY_SPACE_END, - arg); + coalesce_range((lispobj*)READ_ONLY_SPACE_START, read_only_space_free_pointer, arg); lispobj* the_symbol_nil = (lispobj*)(NIL - LIST_POINTER_LOWTAG - N_WORD_BYTES); coalesce_range(the_symbol_nil, ALIGN_UP(SYMBOL_SIZE,2) + the_symbol_nil, arg); coalesce_range((lispobj*)(T - OTHER_POINTER_LOWTAG), static_space_free_pointer, arg); diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 6cc8389557..03f100309e 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -607,13 +607,6 @@ static void relocate_heap(struct heap_adjust* adj) adj); #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE - // Pointers within varyobj space to varyobj space do not need adjustment - // so remove any delta before performing the relocation pass on this space. - // FIXME: this was probably for PIE mode, which doesn't work. - if (lisp_code_in_elf() && adj->range[2].delta != 0) { - lose("code-in-elf + PIE not supported yet\n"); - adj->range[2].delta = 0; // FIXME: isn't this this already the case? - } relocate_space(VARYOBJ_SPACE_START, varyobj_free_pointer, adj); #endif } @@ -972,6 +965,9 @@ process_directory(int count, struct ndir_entry *entry, spaces[DYNAMIC_CORE_SPACE_ID].len); #endif // LISP_FEATURE_GENCGC #ifdef LISP_FEATURE_IMMOBILE_SPACE + if (lisp_code_in_elf() && VARYOBJ_SPACE_START != spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].base) { + lose("code-in-elf + PIE not supported"); + } set_adjustment(adj, FIXEDOBJ_SPACE_START, // actual spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].base, // expected spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].len); From bb245ef943cec427c3b432d2bc54119a1b6e413f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 17 Jul 2022 11:36:14 -0400 Subject: [PATCH 3708/4023] Discard source forms of autogenerated lambdas --- src/code/defstruct.lisp | 2 +- src/code/format.lisp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 240d026425..c2bb93808d 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -451,7 +451,7 @@ comparators) ;; use a string for the name since it's not a global function `(named-lambda ,(format nil "~A-EQUALP" (dd-name dd)) (a b) - (declare (optimize (safety 0)) (type ,(dd-name dd) a b) + (declare (optimize (sb-c:store-source-form 0) (safety 0)) (type ,(dd-name dd) a b) (ignorable a b)) ; if zero slots (and ,@(group1) ,@(group2) ,@(group3))))) diff --git a/src/code/format.lisp b/src/code/format.lisp index fbeae9f5b4..09b7793987 100644 --- a/src/code/format.lisp +++ b/src/code/format.lisp @@ -841,6 +841,7 @@ `(handler-bind ((format-error (lambda (condition) + (declare (optimize (sb-c:store-source-form 0))) (error 'format-error :complaint "~A~%while processing indirect format string:" @@ -1039,6 +1040,7 @@ `((handler-bind ((format-error (lambda (condition) + (declare (optimize (sb-c:store-source-form 0))) (format-error-at* ,string ,(1- end) "~A~%while processing indirect format string:" From 453db9bf8bea6ad0fe8b5d03a16663ae115e01ae Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 18 Jul 2022 03:22:37 +0300 Subject: [PATCH 3709/4023] arm64: fix logtest fixnum immediate encoding. If it doesn't fit. Reported by Eric Marsden. --- src/compiler/arm64/arith.lisp | 27 +++++++++++++++++++++------ tests/arith.pure.lisp | 8 ++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 94dc683f8c..b40b1c25ea 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -1067,12 +1067,27 @@ (:policy :fast-safe) (:conditional :ne) (:generator 2 - (let ((y (if (sc-is x any-reg) - (fixnumize y) - y))) - (if (encode-logical-immediate y) - (inst tst x y) - (inst tst x (load-immediate-word tmp-tn y)))))) + (block nil + (if (= y most-positive-word) + (inst cmp x 0) + (let ((y (if (sc-is x any-reg) + (cond ((fixnump y) + (fixnumize y)) + ((let ((y (ldb (byte 64 0) y))) + ;; Only a negative fixnum will match that bit, + ;; so if the next bit is also 1 it can be shifted left. + (when (and (= (ldb (byte 1 62) y) 1) + (encode-logical-immediate + (ldb (byte 64 0) (ash y 1)))) + (return (inst tst x (ldb (byte 64 0) (ash y 1))))))) + (t + (return + (inst tst (load-immediate-word tmp-tn y) + (asr x n-fixnum-tag-bits))))) + y))) + (if (encode-logical-immediate y) + (inst tst x y) + (inst tst x (load-immediate-word tmp-tn y)))))))) (define-source-transform lognand (x y) `(lognot (logand ,x ,y))) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index 426cc495d2..463b1a654f 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -1090,3 +1090,11 @@ (eval (values 1 2)))))) ((1 2) -2))) + +(with-test (:name :logtest-immediate) + (checked-compile-and-assert + () + `(lambda (x) + (logtest (- (expt 2 63) 3) (the fixnum x))) + ((1) t) + ((2) nil))) From 039cfeb470c2036e88afb445d09d4eea82992a0b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 17 Jul 2022 20:51:05 -0400 Subject: [PATCH 3710/4023] Run most shell tests for #+win32 --- tests/run-program.test.sh | 17 ++++++++++++++--- tests/run-tests.lisp | 23 +++++++++++++++++++++-- tests/save6.test.sh | 18 ++++++++++++------ tests/save9.test.sh | 4 +++- tests/test-funs.lisp | 3 ++- 5 files changed, 52 insertions(+), 13 deletions(-) diff --git a/tests/run-program.test.sh b/tests/run-program.test.sh index 749cee3d52..b05b6e2f73 100755 --- a/tests/run-program.test.sh +++ b/tests/run-program.test.sh @@ -28,19 +28,27 @@ test `ulimit -n` -ge 1050 || ulimit -S -n 1050 # This should probably be broken up into separate pieces. run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF' +(defmacro our-run-program (name &rest rest) + #+unix `(run-program ,name ,@rest) + #-unix `(run-program ,(subseq name (1+ (position #\/ name :from-end t))) + ,@rest :search t)) + ;; test that $PATH is searched (assert (zerop (sb-ext:process-exit-code (sb-ext:run-program "true" () :search t :wait t)))) (assert (not (zerop (sb-ext:process-exit-code (sb-ext:run-program "false" () :search t :wait t))))) (let ((string (with-output-to-string (stream) - (sb-ext:run-program "/bin/echo" + (our-run-program "/bin/echo" '("foo" "bar") :output stream)))) (assert (string= string "foo bar "))) + (format t ";;; Smoke tests: PASS~%") + ;; Unix environment strings are ordinarily passed with SBCL convention ;; (instead of CMU CL alist-of-keywords convention). + #+unix ; env works differently for msys2 apparently (let ((string (with-output-to-string (stream) (sb-ext:run-program "/usr/bin/env" () :output stream @@ -55,6 +63,7 @@ run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF' (assert (> (alien-funcall dup (sb-impl::fd-stream-fd f)) 1024))))) ;; Unicode strings + #+unix (flet ((try (sb-impl::*default-external-format* x y) (let* ((process (run-program "/bin/sh" (list "-c" (format nil "echo ~c, $SB_TEST_FOO." x)) @@ -74,6 +83,7 @@ run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF' ;; The default Unix environment for the subprocess is the same as ;; for the parent process. (I.e., we behave like perl and lots of ;; other programs, but not like CMU CL.) + #+unix (let* ((sb-impl::*default-external-format* :latin-1) (sb-alien::*default-c-string-external-format* :latin-1) (string (with-output-to-string (stream) @@ -93,7 +103,7 @@ run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF' ;; make sure that a stream input argument is basically reasonable. (let ((string (let ((i (make-string-input-stream "abcdef"))) (with-output-to-string (stream) - (sb-ext:run-program "/bin/cat" () + (our-run-program "/bin/cat" () :input i :output stream))))) (assert (= (length string) 6)) (assert (string= string "abcdef"))) @@ -104,12 +114,13 @@ run_sbcl --eval "(defvar *exit-ok* $EXIT_LISP_WIN)" <<'EOF' ;; note: this test will be inconclusive if the child's stderr is ;; fully buffered.) (let ((str (with-output-to-string (s) - (run-program "/bin/sh" + (our-run-program "/bin/sh" '("-c" "(echo Foo; sleep 2; echo Bar)>&2") :output s :search t :error :output :wait t)))) (assert (string= str (format nil "Foo~%Bar~%")))) ;; end of file in the middle of a UTF-8 character + ;; (FIXME: asserting failure without knowing why is almost as good as no test at all.) (typep (nth-value 1 (ignore-errors (let ((sb-impl::*default-external-format* :utf-8)) (with-output-to-string (s) diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index 2b19c5bf7c..b907370b07 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -59,7 +59,7 @@ (pure-runner (pure-cload-files) 'cload-test log) (impure-runner (impure-load-files) 'load-test log) (impure-runner (impure-cload-files) 'cload-test log) - #-win32 (impure-runner (sh-files) 'sh-test log) + (impure-runner (sh-files) 'sh-test log) (log-file-elapsed-time "GRAND TOTAL" start-time log)) (report) (sb-ext:exit :code (if (unexpected-failures) 1 104))) @@ -567,4 +567,23 @@ (filter-test-files "*.impure-cload.lisp")) (defun sh-files () - (filter-test-files "*.test.sh")) + (let ((result (filter-test-files "*.test.sh"))) + #+unix result + ;; Rather than hack up the shell scripts which don't pass on #-unix + ;; (which would require at least a few lines of shell script and lisp + ;; to invoke SBCL and exit with some other code), just confine the kludge + ;; to this file. + #-unix + (if *explicit-test-files* + result + (remove-if + (lambda (x) + (member (pathname-name x) + '("filesys.test" ; too many assertions about symlinks to care about just yet + ;; foreign-test-noop-dlclose-test.c:1:10: fatal error: dlfcn.h: No such file or directory + "foreign.test" + ;; No built SBCL here (.../tests/run-sbcl-test-5863): run 'sh make.sh' first! + "run-sbcl.test" + "side-effectful-pathnames.test") ; no idea + :test 'string=)) + result)))) diff --git a/tests/save6.test.sh b/tests/save6.test.sh index db9b3b5eb9..7182ef4857 100644 --- a/tests/save6.test.sh +++ b/tests/save6.test.sh @@ -7,7 +7,10 @@ fi use_test_subdirectory -tmpcore=$TEST_FILESTEM.core +tmpcore=${TEST_FILESTEM}_a.core +# unix can write a new file to same name as the one we're executing +# but not all OSes can +tmpcore2=${TEST_FILESTEM}_b.core # Regression test for https://bugs.launchpad.net/sbcl/+bug/411925 # saving runtime options _from_ executable cores @@ -16,15 +19,18 @@ run_sbcl <<EOF EOF chmod u+x "$tmpcore" ./"$tmpcore" --no-userinit --no-sysinit --noprint <<EOF - (save-lisp-and-die "$tmpcore" :executable t :save-runtime-options t) + (save-lisp-and-die "$tmpcore2" :executable t :save-runtime-options t) EOF -chmod u+x "$tmpcore" -./"$tmpcore" --no-userinit --no-sysinit --noprint --versions --eval '(exit)' <<EOF - (when (equal *posix-argv* '("./$tmpcore" "--versions" "--eval" "(exit)")) +chmod u+x "$tmpcore2" +./"$tmpcore2" --no-userinit --no-sysinit --noprint --versions --eval '(exit)' <<EOF + ;; tbh I have no idea how this asserts anything about saving options from executable + ;; cores with saved options + (when #+unix (equal *posix-argv* '("./$tmpcore2" "--versions" "--eval" "(exit)")) + #-unix (equal (cdr *posix-argv*) '("--versions" "--eval" "(exit)")) (exit :code 42)) EOF status=$? -rm "$tmpcore" +rm "$tmpcore" "$tmpcore2" if [ $status -ne 42 ]; then echo "saving runtime options from executable failed" exit 1 diff --git a/tests/save9.test.sh b/tests/save9.test.sh index 695eda9ada..b194e65487 100755 --- a/tests/save9.test.sh +++ b/tests/save9.test.sh @@ -11,7 +11,9 @@ use_test_subdirectory tmpcore=$TEST_FILESTEM.core run_sbcl <<EOF - (defvar *s* (open "$this_file")) + (defvar *s* (open #+unix "$this_file" + #-unix (format nil "~A/run-tests.lisp" + (posix-getenv "SBCL_PWD")))) (save-lisp-and-die "$tmpcore") EOF set -e diff --git a/tests/test-funs.lisp b/tests/test-funs.lisp index 699ced1126..4e802b6b46 100644 --- a/tests/test-funs.lisp +++ b/tests/test-funs.lisp @@ -83,7 +83,8 @@ (progn (test-util::setenv "TEST_SBCL_EVALUATOR_MODE" (string-downcase *test-evaluator-mode*)) - (let ((process (sb-ext:run-program (or #+sunos (posix-getenv "SHELL") + ;; Why would it ever be wrong to use (posix-getenv "SHELL") ??? + (let ((process (sb-ext:run-program (or #+(or sunos win32) (posix-getenv "SHELL") "/bin/sh") (list (native-namestring file)) :output *error-output*))) From 8f03405ab999acc4c91db01d348547bed43c2be5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 17 Jul 2022 23:46:48 -0400 Subject: [PATCH 3711/4023] Revise crusty old gencgc_apply_code_fixups() function The comments implied that we store a vector of fixups, but technically it has been a packed integer ever since rev f7c8fe8142. And years ago the logic was flaky (possibly harming the object being fixed), but that bug was resolved by rev f76d666a2c so remarks about corruption are misplaced. var-io can assert that its input is valid as a reasonable precaution. --- src/runtime/var-io.c | 2 ++ src/runtime/x86-arch.c | 68 +++++++++++++++++------------------------- 2 files changed, 29 insertions(+), 41 deletions(-) diff --git a/src/runtime/var-io.c b/src/runtime/var-io.c index f524aedf2c..b7ed9aace4 100644 --- a/src/runtime/var-io.c +++ b/src/runtime/var-io.c @@ -48,6 +48,8 @@ void varint_unpacker_init(struct varint_unpacker* unpacker, lispobj integer) unpacker->limit = N_WORD_BYTES; unpacker->data = (char*)&unpacker->word; } else { + gc_assert(lowtag_of(integer) == OTHER_POINTER_LOWTAG + && widetag_of(native_pointer(integer)) == BIGNUM_WIDETAG); struct bignum* bignum = (struct bignum*)(integer - OTHER_POINTER_LOWTAG); unpacker->word = 0; unpacker->limit = HeaderValue(bignum->header) * N_WORD_BYTES; diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 3e91b67ccb..01e5ee5ca1 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -326,56 +326,42 @@ arch_install_interrupt_handlers() void gencgc_apply_code_fixups(struct code *old_code, struct code *new_code) { - char* code_start_addr = code_text_start(new_code); - os_vm_size_t displacement = (char*)new_code - (char*)old_code; lispobj fixups = new_code->fixups; /* It will be a nonzero integer if valid, or 0 if there are no fixups */ - if (fixups == 0) - return; + if (!fixups) return; /* Could be pointing to a forwarding pointer. */ /* This is extremely unlikely, because the only referent of the fixups - is usually the code itself; so scavenging the vector won't occur + is usually the code itself; so scavenging a bignum of fixups won't occur until after the code object is known to be live. As we're just now enlivening the code, the fixups shouldn't have been forwarded. - Maybe the vector is on the special binding stack though ... */ - if (is_lisp_pointer(fixups) && - forwarding_pointer_p(native_pointer(fixups))) { - /* If so, then follow it. */ - /*SHOW("following pointer to a forwarding pointer");*/ + Maybe the bignum is otherwise referenced though ... */ + if (is_lisp_pointer(fixups) && forwarding_pointer_p(native_pointer(fixups))) fixups = forwarding_pointer_value(native_pointer(fixups)); - } - if (fixnump(fixups) || - (lowtag_of(fixups) == OTHER_POINTER_LOWTAG - && widetag_of(native_pointer(fixups)) == BIGNUM_WIDETAG)) { - /* Got the fixups for the code block. Now work through them - in order, first the absolute ones, then the relative. - Locations are sorted and delta-encoded for compactness. */ - struct varint_unpacker unpacker; - varint_unpacker_init(&unpacker, fixups); - int prev_offset = 0, offset; - // Absolute fixups all refer to this object itself (the code - // boxed constants). Add this object's displacement to the - // value that currently exists at the fixup location. - while (varint_unpack(&unpacker, &offset) && offset != 0) { - offset += prev_offset; - prev_offset = offset; - *(char**)(code_start_addr + offset) += displacement; - } - prev_offset = 0; - // Relative fixups: assembly and foreign routines. Subtract this - // object's displacement from the value that currently exists. - while (varint_unpack(&unpacker, &offset) && offset != 0) { - offset += prev_offset; - prev_offset = offset; - *(char**)(code_start_addr + offset) -= displacement; - } - } else { - /* This used to just print a note to stderr, but bogus fixups seem to - * indicate real heap corruption, so a hard failure is in order. */ - lose("fixup vector %x has a bad widetag: %#x", - fixups, widetag_of(native_pointer(fixups))); + char* code_start_addr = code_text_start(new_code); + os_vm_size_t displacement = (char*)new_code - (char*)old_code; + /* Got the fixups for the code block. Now work through them + in order, first the absolute ones, then the relative. + Locations are sorted and delta-encoded for compactness. */ + struct varint_unpacker unpacker; + varint_unpacker_init(&unpacker, fixups); + int prev_offset = 0, offset; + // Absolute fixups all refer to this object itself (the code + // boxed constants). Add this object's displacement to the + // value that currently exists at the fixup location. + while (varint_unpack(&unpacker, &offset) && offset != 0) { + offset += prev_offset; + prev_offset = offset; + *(char**)(code_start_addr + offset) += displacement; + } + prev_offset = 0; + // Relative fixups: assembly and foreign routines. Subtract this + // object's displacement from the value that currently exists. + while (varint_unpack(&unpacker, &offset) && offset != 0) { + offset += prev_offset; + prev_offset = offset; + *(char**)(code_start_addr + offset) -= displacement; } } From f6baf3fdcc94314ea3bc826745fea2116efc286e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Jul 2022 00:04:59 -0400 Subject: [PATCH 3712/4023] Remove C runtime's SHOW() macro --- src/runtime/bsd-os.c | 1 - src/runtime/gencgc.c | 5 ----- src/runtime/interrupt.c | 7 ++----- src/runtime/linux-os.c | 1 - src/runtime/runtime.h | 2 -- src/runtime/x86-64-arch.c | 4 ---- src/runtime/x86-arch.c | 3 --- 7 files changed, 2 insertions(+), 21 deletions(-) diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 7981ced278..7bdd07bc2a 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -290,7 +290,6 @@ mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, void os_install_interrupt_handlers(void) { - SHOW("os_install_interrupt_handlers()/bsd-os/defined(GENCGC)"); if (INSTALL_SIG_MEMORY_FAULT_HANDLER) { #if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) ll_install_handler(SIG_MEMORY_FAULT, mach_error_memory_fault_handler); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 5ff8f45054..ba387fd540 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3303,10 +3303,6 @@ scavenge_newspace(generation_index_t generation) /* New areas of objects allocated have been lost so need to do a * full scan to be sure! If this becomes a problem try * increasing NUM_NEW_AREAS. */ - if (gencgc_verbose) { - SHOW("new_areas overflow, doing full scavenge"); - } - newspace_full_scavenge(generation); } else { @@ -4725,7 +4721,6 @@ collect_garbage(generation_index_t last_gen) #endif log_generation_stats(gc_logfile, "=== GC End ==="); - SHOW("returning from collect_garbage"); // Increment the finalizer runflag. This acts as a count of the number // of GCs as well as a notification to wake the finalizer thread. if (finalizer_thread_runflag != 0) { diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 336560a6b3..1c2ce25674 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1029,13 +1029,11 @@ interrupt_internal_error(os_context_t *context, boolean continuable) } #endif - SHOW("in interrupt_internal_error"); -#if QSHOW == 2 /* Display some rudimentary debugging information about the * error, so that even if the Lisp error handler gets badly * confused, we have a chance to determine what's going on. */ - describe_internal_error(context); -#endif + // describe_internal_error(context); // uncomment me for debugging + funcall2(StaticSymbolFunction(INTERNAL_ERROR), context_sap, continuable ? T : NIL); @@ -2026,7 +2024,6 @@ interrupt_init(void) ll_install_handler(SIGINFO, sigdump_eventlog); #endif int __attribute__((unused)) i; - SHOW("entering interrupt_init()"); sigemptyset(&deferrable_sigset); sigemptyset(&blockable_sigset); sigemptyset(&gc_sigset); diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c index 3a5371be89..dd969c945b 100644 --- a/src/runtime/linux-os.c +++ b/src/runtime/linux-os.c @@ -197,7 +197,6 @@ futex_init() futex_private_supported_p = 1; } else { futex_private_supported_p = 0; - SHOW("No futex private suppport\n"); } } diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 39e006d77f..d7595cb73d 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -138,10 +138,8 @@ void dyndebug_init(void); #if QSHOW # define FSHOW(args) \ do if (dyndebug_config.dyndebug_fshow) fshow_fun args; while (0) -# define SHOW(string) FSHOW((stderr, "/%s\n", string)) #else # define FSHOW(args) -# define SHOW(string) #endif #ifdef _WIN64 diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 5e1e7c7936..84d2a188e9 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -495,8 +495,6 @@ sigfpe_handler(int signal, siginfo_t *siginfo, os_context_t *context) void arch_install_interrupt_handlers() { - SHOW("entering arch_install_interrupt_handlers()"); - /* Note: The old CMU CL code here used sigtrap_handler() to handle * SIGILL as well as SIGTRAP. I couldn't see any reason to do * things that way. So, I changed to separate handlers when @@ -515,8 +513,6 @@ arch_install_interrupt_handlers() #if defined(X86_64_SIGFPE_FIXUP) && !defined(LISP_FEATURE_WIN32) ll_install_handler(SIGFPE, sigfpe_handler); #endif - - SHOW("returning from arch_install_interrupt_handlers()"); } void diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 01e5ee5ca1..f1940f73f6 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -303,8 +303,6 @@ sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context) { void arch_install_interrupt_handlers() { - SHOW("entering arch_install_interrupt_handlers()"); - /* Note: The old CMU CL code here used sigtrap_handler() to handle * SIGILL as well as SIGTRAP. I couldn't see any reason to do * things that way. So, I changed to separate handlers when @@ -319,7 +317,6 @@ arch_install_interrupt_handlers() ll_install_handler(SIGILL , sigill_handler); ll_install_handler(SIGTRAP, sigtrap_handler); #endif - SHOW("returning from arch_install_interrupt_handlers()"); } From 6ca5232fe55772639f47ca80267feab07bdfa9b8 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Jul 2022 00:19:16 -0400 Subject: [PATCH 3713/4023] Remove strange loop --- src/runtime/save.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) mode change 100644 => 100755 src/runtime/save.c diff --git a/src/runtime/save.c b/src/runtime/save.c old mode 100644 new mode 100755 index 520b1e0f7b..f0fbea9477 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -170,11 +170,9 @@ static long write_bytes(FILE *file, char *addr, size_t bytes, ftell_type here, data; #ifdef LISP_FEATURE_WIN32 - size_t count; - /* touch every single page in the space to force it to be mapped. */ - for (count = 0; count < bytes; count += 0x1000) { - volatile int temp = addr[count]; - } + // I can't see how we'd ever attempt writing from uncommitted memory, + // but this is better than was was previously here (a "touch" loop over all pages) + os_commit_memory(addr, bytes); #endif fflush(file); From 840a4230f00c55157999c1ce4455cb49ed2d64da Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Jul 2022 00:34:48 -0400 Subject: [PATCH 3714/4023] Prevent use of FSHOW unless you try really hard Per https://man7.org/linux/man-pages/man7/signal-safety.7.html it is incorrect to use it in handle_trap() as we do, so just ... don't. --- src/runtime/print.c | 21 --------------------- src/runtime/runtime.h | 15 +++++---------- 2 files changed, 5 insertions(+), 31 deletions(-) diff --git a/src/runtime/print.c b/src/runtime/print.c index 3417f64356..93c8be0d3d 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -41,9 +41,6 @@ * If enabled at all, environment variables control whether calls of the * form odxprint(name, ...) are enabled at run-time, e.g. using * SBCL_DYNDEBUG="fshow safepoints". - * - * In the case of FSHOW, old-style code from runtime.h - * can also be used to enable or disable these more aggressively. */ struct dyndebug_config dyndebug_config = { @@ -187,24 +184,6 @@ vodxprint_fun(const char *fmt, va_list args) errno = original_errno; } -/* Translate the rather awkward syntax - * FSHOW((stderr, "xyz")) - * into the new and cleaner - * odxprint("xyz"). - * If we were willing to clean up all existing call sites, we could remove - * this wrapper function. (This is a function, because I don't know how to - * strip the extra parens in a macro.) */ -void -fshow_fun(void __attribute__((__unused__)) *ignored, - const char *fmt, - ...) -{ - va_list args; - va_start(args, fmt); - vodxprint_fun(fmt, args); - va_end(args); -} - #include "monitor.h" #include "vars.h" #include "os.h" diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index d7595cb73d..2690dddd57 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -106,7 +106,6 @@ void gc_state_unlock(); while (0) void odxprint_fun(const char *fmt, ...); -void fshow_fun(void *ignored, const char *fmt, ...); /* Flags defined in a structure to avoid code duplication between * declaration and definition. */ @@ -129,15 +128,11 @@ extern int gencgc_verbose; void dyndebug_init(void); -/* The following macros duplicate the expansion of odxprint, because the - * extra level of parentheses around `args' prevents us from - * implementing FSHOW in terms of odxprint directly. (They also differ - * in a newline.) - */ - -#if QSHOW -# define FSHOW(args) \ - do if (dyndebug_config.dyndebug_fshow) fshow_fun args; while (0) +#if 0 +/* To see output from FSHOW - which is almost certainly a bad idea because it's + * quite likely to hinder your progress by causing deadlock in stdio - then change + * the preceding line to "#if 1" */ +# define FSHOW(args) fprintf args #else # define FSHOW(args) #endif From 00c6b35f142f12fb0462e99ca5acbd12c8cdadb2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Jul 2022 00:57:37 -0400 Subject: [PATCH 3715/4023] Confine odxprint to safepoint.c Just another thing not to use when tracking down timing-related bugs. Get the test suite running to completion for linux+safepoint with tons of failures, but no hanging. --- src/runtime/print.c | 67 ----------------------------------- src/runtime/print.h | 8 +++++ src/runtime/runtime.h | 8 ----- src/runtime/safepoint.c | 50 ++++++++++++++++++++++++++ src/runtime/win32-os.c | 1 + tests/interface.pure.lisp | 2 +- tests/run-program.impure.lisp | 3 +- tests/run-tests.lisp | 1 + tests/signals.impure.lisp | 3 +- tests/threads.impure.lisp | 3 +- 10 files changed, 67 insertions(+), 79 deletions(-) diff --git a/src/runtime/print.c b/src/runtime/print.c index 93c8be0d3d..b8faa9d011 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -27,22 +27,12 @@ #include "gc-internal.h" #include "gc-private.h" #include "genesis/gc-tables.h" -#include <stdarg.h> #include "thread.h" /* genesis/primitive-objects.h needs this */ #include <errno.h> #include <stdlib.h> #include <inttypes.h> #include <setjmp.h> -/* FSHOW and odxprint provide debugging output for low-level information - * (signal handling, exceptions, safepoints) which is hard to debug by - * other means. - * - * If enabled at all, environment variables control whether calls of the - * form odxprint(name, ...) are enabled at run-time, e.g. using - * SBCL_DYNDEBUG="fshow safepoints". - */ - struct dyndebug_config dyndebug_config = { QSHOW == 2, }; @@ -127,63 +117,6 @@ dyndebug_init() #undef DYNDEBUG_NFLAGS } -/* Temporarily, odxprint merely performs the equivalent of a traditional - * FSHOW call, i.e. it merely formats to stderr. Ultimately, it should - * be restored to its full win32 branch functionality, where output to a - * file or to the debugger can be selected at runtime. */ - -void vodxprint_fun(const char *, va_list); - -void -odxprint_fun(const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - vodxprint_fun(fmt, args); - va_end(args); -} - -void -vodxprint_fun(const char *fmt, va_list args) -{ -#ifdef LISP_FEATURE_WIN32 - DWORD lastError = GetLastError(); -#endif - int original_errno = errno; - - char buf[1024]; - int n = 0; - -#ifdef LISP_FEATURE_SB_THREAD - snprintf(buf, sizeof(buf), "["THREAD_ID_LABEL"] ", THREAD_ID_VALUE); - n = strlen(buf); -#endif - - vsnprintf(buf + n, sizeof(buf) - n - 1, fmt, args); - /* buf is now zero-terminated (even in case of overflow). - * Our caller took care of the newline (if any) through `fmt'. */ - - /* A sufficiently POSIXy implementation of stdio will provide - * per-FILE locking, as defined in the spec for flockfile. At least - * glibc complies with this. Hence we do not need to perform - * locking ourselves here. (Should it turn out, of course, that - * other libraries opt for speed rather than safety, we need to - * revisit this decision.) */ - fputs(buf, stderr); - -#ifdef LISP_FEATURE_WIN32 - /* stdio's stderr is line-bufferred, i.e. \n ought to flush it. - * Unfortunately, MinGW does not behave the way I would expect it - * to. Let's be safe: */ - fflush(stderr); -#endif - -#ifdef LISP_FEATURE_WIN32 - SetLastError(lastError); -#endif - errno = original_errno; -} - #include "monitor.h" #include "vars.h" #include "os.h" diff --git a/src/runtime/print.h b/src/runtime/print.h index 9ac1ae9639..a5bc4365b3 100644 --- a/src/runtime/print.h +++ b/src/runtime/print.h @@ -23,4 +23,12 @@ extern void reset_printer(void); extern void safely_show_lstring(struct vector*, int, FILE*); extern void print_list_car_ptrs(lispobj, FILE*); +#define odxprint(topic, fmt, ...) \ + do \ + if (dyndebug_config.dyndebug_##topic) \ + odxprint_fun(fmt "\n", ##__VA_ARGS__); \ + while (0) + +void odxprint_fun(const char *fmt, ...); + #endif diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 2690dddd57..d34acc4a17 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -99,14 +99,6 @@ void gc_state_unlock(); * generally need customization. */ -#define odxprint(topic, fmt, ...) \ - do \ - if (dyndebug_config.dyndebug_##topic) \ - odxprint_fun(fmt "\n", ##__VA_ARGS__); \ - while (0) - -void odxprint_fun(const char *fmt, ...); - /* Flags defined in a structure to avoid code duplication between * declaration and definition. */ extern struct dyndebug_config { diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 600926f37c..1a556b9c8d 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -14,6 +14,7 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> +#include <stdarg.h> #ifndef LISP_FEATURE_WIN32 #include <sched.h> #endif @@ -39,6 +40,7 @@ #include "gc-internal.h" #include "interrupt.h" #include "lispregs.h" +#include "print.h" const char* gc_phase_names[GC_NPHASES] = { "GC_NONE", @@ -1075,4 +1077,52 @@ handle_safepoint_violation(os_context_t *ctx, os_vm_address_t fault_address) } #endif /* LISP_FEATURE_WIN32 */ +void +vodxprint_fun(const char *fmt, va_list args) +{ +#ifdef LISP_FEATURE_WIN32 + DWORD lastError = GetLastError(); +#endif + int original_errno = errno; + + char buf[1024]; + int n = 0; + + snprintf(buf, sizeof(buf), "["THREAD_ID_LABEL"] ", THREAD_ID_VALUE); + n = strlen(buf); + + vsnprintf(buf + n, sizeof(buf) - n - 1, fmt, args); + /* buf is now zero-terminated (even in case of overflow). + * Our caller took care of the newline (if any) through `fmt'. */ + + /* A sufficiently POSIXy implementation of stdio will provide + * per-FILE locking, as defined in the spec for flockfile. At least + * glibc complies with this. Hence we do not need to perform + * locking ourselves here. (Should it turn out, of course, that + * other libraries opt for speed rather than safety, we need to + * revisit this decision.) */ + fputs(buf, stderr); + +#ifdef LISP_FEATURE_WIN32 + /* stdio's stderr is line-bufferred, i.e. \n ought to flush it. + * Unfortunately, MinGW does not behave the way I would expect it + * to. Let's be safe: */ + fflush(stderr); +#endif + +#ifdef LISP_FEATURE_WIN32 + SetLastError(lastError); +#endif + errno = original_errno; +} + +void +odxprint_fun(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vodxprint_fun(fmt, args); + va_end(args); +} + #endif /* LISP_FEATURE_SB_SAFEPOINT -- entire file */ diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 2191e24061..8f44003c71 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -66,6 +66,7 @@ #include <wincrypt.h> #include <stdarg.h> #include <string.h> +#include "print.h" /* missing definitions for modern mingws */ #ifndef EH_UNWINDING diff --git a/tests/interface.pure.lisp b/tests/interface.pure.lisp index d141cdf3de..b04e36123d 100644 --- a/tests/interface.pure.lisp +++ b/tests/interface.pure.lisp @@ -116,7 +116,7 @@ ;;; SLEEP should work with large integers as well (with-test (:name (sleep :pretty-much-forever) - :skipped-on (:and :darwin :sb-safepoint)) ; hangs + :skipped-on (:and (:or :linux :darwin) :sb-safepoint)) ; hangs (assert (eq :timeout (handler-case (sb-ext:with-timeout 1 diff --git a/tests/run-program.impure.lisp b/tests/run-program.impure.lisp index a121f6212b..0eab8884ca 100644 --- a/tests/run-program.impure.lisp +++ b/tests/run-program.impure.lisp @@ -235,7 +235,8 @@ ;;; This used to crash on Darwin and trigger recursive lock errors on ;;; every platform. -(with-test (:name (run-program :stress)) +;;; ...and now it triggers recursive lock errors on safepoint + linux. +(with-test (:name (run-program :stress) :skipped-on (:and :sb-safepoint :linux)) ;; Do it a hundred times in batches of 10 so that with a low limit ;; of the number of processes the test can have a chance to pass. ;; diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index b907370b07..a9290e6a05 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -219,6 +219,7 @@ ,(maybe "SB-VM" "*STORE-BARRIERS-POTENTIALLY-EMITTED*") ,(maybe "SB-VM" "*STORE-BARRIERS-EMITTED*") ,(maybe "SB-INTERPRETER" "*LAST-TOPLEVEL-ENV*") + ,(maybe "SB-SYS" "*THRUPTION-PENDING*") sb-pcl::*dfun-constructors* #+win32 sb-impl::*waitable-timer-handle* #+win32 sb-impl::*timer-thread*))) diff --git a/tests/signals.impure.lisp b/tests/signals.impure.lisp index 81f6e296ff..04ac7cb729 100644 --- a/tests/signals.impure.lisp +++ b/tests/signals.impure.lisp @@ -14,7 +14,8 @@ (use-package :test-util) (sb-ext:finalize (list 1) (lambda ())) -(with-test (:name (:async-unwind :specials)) +(with-test (:name (:async-unwind :specials) + :skipped-on (:and :sb-safepoint :linux)) ; hangs (let ((*x0* nil) (*x1* nil) (*x2* nil) (*x3* nil) (*x4* nil)) (declare (special *x0* *x1* *x2* *x3* *x4*)) (loop repeat 10 do diff --git a/tests/threads.impure.lisp b/tests/threads.impure.lisp index 46729d40c7..63565f4509 100644 --- a/tests/threads.impure.lisp +++ b/tests/threads.impure.lisp @@ -389,7 +389,8 @@ `(handler-case (progn (progn ,@body) nil) (sb-ext:timeout () t))) -(with-test (:name (semaphore :wait-forever)) +(with-test (:name (semaphore :wait-forever) + :skipped-on (:and :sb-safepoint :linux)) ; hangs (let ((sem (make-semaphore :count 0))) (assert (raises-timeout-p (sb-ext:with-timeout 0.1 From a8140d24226acdb40141487e60111a0159a2d672 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 19 Jul 2022 03:29:33 +0300 Subject: [PATCH 3716/4023] Derive (logand negative negative) as negative. --- src/compiler/bitops-derive-type.lisp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/compiler/bitops-derive-type.lisp b/src/compiler/bitops-derive-type.lisp index 89677990f3..ad805b5254 100644 --- a/src/compiler/bitops-derive-type.lisp +++ b/src/compiler/bitops-derive-type.lisp @@ -146,9 +146,7 @@ (minus-one x y) (minus-one y x)) (multiple-value-bind (x-len x-pos x-neg) (integer-type-length x) - (declare (ignore x-pos)) (multiple-value-bind (y-len y-pos y-neg) (integer-type-length y) - (declare (ignore y-pos)) (if (not x-neg) ;; X must be positive. (if (not y-neg) @@ -177,9 +175,15 @@ ;; Either might be negative. (if (and x-len y-len) ;; The result is bounded. - (specifier-type `(signed-byte ,(1+ (max x-len y-len)))) - ;; We can't tell squat about the result. - (specifier-type 'integer))))))) + (if (and (not y-pos) + (not x-pos)) + (specifier-type `(and (signed-byte ,(1+ (max x-len y-len))) + (integer * -1))) + (specifier-type `(signed-byte ,(1+ (max x-len y-len))))) + (if (and (not y-pos) + (not x-pos)) + (specifier-type '(integer * -1)) + (specifier-type 'integer)))))))) (defun logior-derive-unsigned-bounds (x y) (let* ((a (numeric-type-low x)) From 609a19bb3cf526f01b072c0a132afb34e1b7cf24 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 18 Jul 2022 23:08:13 -0400 Subject: [PATCH 3717/4023] Do something like cheneygc's purify with gencgc Move immutable leaf objects from unboxed pages to readonly space upon save. In the pristine core, this accounts for nearly all unboxed pages. Unlike with purify.c which could only increase the amount of stuff in read-only space, this logic is more complete - when saving a core that has read-only objects, they are all first evacuated from R/O space back to dynamic space so the final GCs is thorough. And read-only space is now *actually* read-only, not merely named that. --- src/code/gc.lisp | 2 + src/compiler/generic/early-objdef.lisp | 1 + src/compiler/generic/parms.lisp | 7 +- src/runtime/GNUmakefile | 4 +- src/runtime/coreparse.c | 19 ++ src/runtime/gencgc.c | 15 +- src/runtime/globals.h | 3 + src/runtime/os-common.c | 34 +-- src/runtime/save.c | 0 src/runtime/stringspace.c | 282 +++++++++++++++++++++++++ src/runtime/traceroot.c | 3 +- src/runtime/validate.c | 3 + tests/hide-packages.test.sh | 2 + tools-for-build/editcore.lisp | 8 +- 14 files changed, 357 insertions(+), 26 deletions(-) mode change 100755 => 100644 src/runtime/save.c create mode 100644 src/runtime/stringspace.c diff --git a/src/code/gc.lisp b/src/code/gc.lisp index c650d6b87e..93cab8ad02 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -13,6 +13,8 @@ ;;;; DYNAMIC-USAGE and friends +#-darwin-jit +(define-alien-variable ("READ_ONLY_SPACE_START" sb-vm:read-only-space-start) os-vm-size-t) #+gencgc (define-alien-variable ("DYNAMIC_SPACE_START" sb-vm:dynamic-space-start) os-vm-size-t) (declaim (inline current-dynamic-space-start)) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 25eae20122..9031dc78ac 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -235,6 +235,7 @@ ;; IF YOU CHANGE THIS ORDER, THEN MANUALLY VERIFY CORRECTNESS OF: ;; - leaf_obj_widetag_p() + ;; - readonly_unboxed_obj_p() ;; - conservative_root_p() ;; - anything else I forgot to mention simple-vector-widetag ; 8A diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 9cc85ec905..03a0d5454c 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -98,10 +98,12 @@ (loop for (space size var-name) in spaces appending (let* ((relocatable + ;; READONLY is usually movable now. ;; TODO: linkage-table could move with code, if the CPU ;; prefers PC-relative jumps, and we emit better code ;; (which we don't- for x86 we jmp via RBX always) - (member space '(fixedobj varyobj))) + (member space '(fixedobj varyobj + #-darwin-jit read-only))) (start ptr) (end (+ ptr size))) (setf ptr end) @@ -134,6 +136,9 @@ (ecase n-word-bits (32 (expt 2 29)) (64 (expt 2 30))))) + ;; an arbitrary value to avoid kludging genesis + #+(and sb-xc-host (not darwin-jit)) + (defparameter read-only-space-end read-only-space-start) #-soft-card-marks (defconstant cards-per-page 1) (defconstant gencgc-card-bytes (/ gencgc-page-bytes cards-per-page)) (defconstant gencgc-card-shift diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index d895ef5e7b..a64b493a84 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -74,8 +74,8 @@ COMMON_SRC = alloc.c backtrace.c breakpoint.c coalesce.c coreparse.c \ dynbind.c funcall.c gc-common.c globals.c hopscotch.c \ interr.c interrupt.c largefile.c main.c \ monitor.c murmur_hash.c os-common.c parse.c print.c \ - purify.c regnames.c runtime.c \ - safepoint.c save.c sc-offset.c search.c thread.c time.c \ + purify.c regnames.c runtime.c safepoint.c save.c \ + sc-offset.c search.c stringspace.c thread.c time.c \ validate.c var-io.c vars.c wrap.c ifndef LISP_FEATURE_WIN32 diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 03f100309e..5f99370bcf 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -823,6 +823,14 @@ process_directory(int count, struct ndir_entry *entry, (unsigned long)len >> 10, (unsigned long)dynamic_space_size >> 10); } +#ifndef LISP_FEATURE_DARWIN_JIT + if (id == READ_ONLY_CORE_SPACE_ID) { + if (len) // There is no "nominal" size of readonly space, so give it a size + spaces[id].desired_size = len; + else // Assign some address, so free_pointer does enclose [0 .. addr+0] + READ_ONLY_SPACE_START = READ_ONLY_SPACE_END = addr; + } +#endif if (len != 0) { spaces[id].len = len; // Try to map at address requested by the core file. @@ -856,6 +864,12 @@ process_directory(int count, struct ndir_entry *entry, } } switch (id) { +#ifndef LISP_FEATURE_DARWIN_JIT + case READ_ONLY_CORE_SPACE_ID: + READ_ONLY_SPACE_START = addr; + READ_ONLY_SPACE_END = addr + len; + break; +#endif #ifdef LISP_FEATURE_IMMOBILE_SPACE case IMMOBILE_FIXEDOBJ_CORE_SPACE_ID: case IMMOBILE_VARYOBJ_CORE_SPACE_ID: @@ -955,6 +969,11 @@ process_directory(int count, struct ndir_entry *entry, } calc_asm_routine_bounds(); +#ifndef LISP_FEATURE_DARWIN_JIT + set_adjustment(adj, READ_ONLY_SPACE_START, // actual + spaces[READ_ONLY_CORE_SPACE_ID].base, // expected + spaces[READ_ONLY_CORE_SPACE_ID].len); +#endif #ifdef LISP_FEATURE_GENCGC set_adjustment(adj, DYNAMIC_SPACE_START, // actual spaces[DYNAMIC_CORE_SPACE_ID].base, // expected diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index ba387fd540..6bd0492061 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5436,6 +5436,8 @@ static void prepare_dynamic_space_for_final_gc() * plus literal strings in code compiled to memory. */ char gc_coalesce_string_literals = 0; +extern void move_rospace_to_dynamic(int), prepare_readonly_space(int); + /* Do a non-conservative GC, and then save a core with the initial * function being set to the value of 'lisp_init_function' */ void @@ -5513,6 +5515,10 @@ gc_and_save(char *filename, boolean prepend_runtime, write_TLS(PINNED_OBJECTS, NIL, thread); // From here on until exit, there is no chance of continuing // in Lisp if something goes wrong during GC. + // Flush regions to ensure heap scan in copy_rospace doesn't miss anything + gc_close_thread_regions(thread); + gc_close_collector_regions(0); + move_rospace_to_dynamic(0); pre_verify_gen_0 = 1; prepare_immobile_space_for_final_gc(); // once is enough prepare_dynamic_space_for_final_gc(); @@ -5530,14 +5536,15 @@ gc_and_save(char *filename, boolean prepend_runtime, printf("[coalescing similar vectors... "); fflush(stdout); } - /* FIXME: add comment explaining why coalescing is deferred until - * after the penultimate GC. Must it wait ? */ + // Now that we've GC'd to eliminate as much junk as possible... coalesce_similar_objects(); if (gc_coalesce_string_literals && verbose) printf("done]\n"); - /* FIXME: now that relocate_heap() works, can we just memmove() everything - * down and perform a relocation instead of a collection? */ + // Do a non-moving collection so that orphaned strings that result + // from coalescing STRING= symbol names do not consume read-only space. + collect_garbage(1+PSEUDO_STATIC_GENERATION); + prepare_readonly_space(0); if (verbose) { printf("[performing final GC..."); fflush(stdout); } prepare_dynamic_space_for_final_gc(); save_lisp_gc_iteration = 2; diff --git a/src/runtime/globals.h b/src/runtime/globals.h index e21cba3650..3811084ec9 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -45,6 +45,9 @@ extern int foreign_function_call_active; extern os_vm_size_t dynamic_space_size; extern os_vm_size_t thread_control_stack_size; +#ifndef LISP_FEATURE_DARWIN_JIT +extern uword_t READ_ONLY_SPACE_START, READ_ONLY_SPACE_END; +#endif #ifdef LISP_FEATURE_CHENEYGC extern uword_t DYNAMIC_0_SPACE_START, DYNAMIC_1_SPACE_START; #else diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 941f2b9afa..14aae90005 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -236,7 +236,7 @@ gc_managed_heap_space_p(lispobj addr) /* Remap a part of an already existing memory mapping from a file, * and/or create a new mapping as need be */ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) execute) + int is_readonly_space) { #if defined LISP_FEATURE_MIPS /* Of the few MIPS machines I have access to, one definitely exhibits a @@ -266,28 +266,34 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm #endif int fail = 0; os_vm_address_t actual; + int protection = 0, sharing = MAP_PRIVATE; + +#ifdef LISP_FEATURE_DARWIN_JIT + protection = OS_VM_PROT_READ | (is_readonly_space ? OS_VM_PROT_EXECUTE : OS_VM_PROT_WRITE); +#else + /* If mapping to an OS-chosen address, then the assumption is that we're not going to + * execute nor write at the mapped address. (Because why would we ? The spaces from + * the core have a chosen address at this point) However, the addr=0 case is for + * 'editcore' which unfortunately _does_ write the memory. I'd prefer that it not, + * but that's not the concern here. */ + protection = (addr ? (is_readonly_space ? OS_VM_PROT_READ : OS_VM_PROT_ALL) + : OS_VM_PROT_READ | OS_VM_PROT_WRITE); + if (is_readonly_space) sharing = MAP_SHARED; +#endif + #ifdef LISP_FEATURE_64_BIT - actual = sbcl_mmap(addr, len, + actual = sbcl_mmap( #else /* FIXME: why does using sbcl_mmap cause failure here? I would guess that it can't * pass 'offset' correctly if LARGEFILE is mandatory, which it isn't on 64-bit. * Deadlock should be impossible this early in core loading, I suppose, hence * on one hand I don't care; but on the other, it would be nice to not to see * any use of a potentially hooked mmap() API within this file. */ - actual = mmap(addr, len, -#endif - // If mapping to a random address, then the assumption is - // that we're not going to execute the core; nor should we write to it. - // However, the addr=0 case is for 'editcore' which unfortunately _does_ - // write the memory. I'd prefer that it not, - // but that's not the concern here. -#ifdef LISP_FEATURE_DARWIN_JIT - OS_VM_PROT_READ | (execute ? OS_VM_PROT_EXECUTE : OS_VM_PROT_WRITE), -#else - addr ? OS_VM_PROT_ALL : OS_VM_PROT_READ | OS_VM_PROT_WRITE, + actual = mmap( #endif + addr, len, protection, // Do not pass MAP_FIXED with addr of 0, because most OSes disallow that. - MAP_PRIVATE | (addr ? MAP_FIXED : 0), + sharing | (addr ? MAP_FIXED : 0), fd, (off_t) offset); if (actual == MAP_FAILED) { if (errno == ENOMEM) diff --git a/src/runtime/save.c b/src/runtime/save.c old mode 100755 new mode 100644 diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c new file mode 100644 index 0000000000..fffc1fff70 --- /dev/null +++ b/src/runtime/stringspace.c @@ -0,0 +1,282 @@ +/* + * This software is part of the SBCL system. See the README file for + * more information. + * + * This software is derived from the CMU CL system, which was + * written at Carnegie Mellon University and released into the + * public domain. The software is in the public domain and is + * provided with absolutely no warranty. See the COPYING and CREDITS + * files for more information. + */ + +#include <stdio.h> +#include "sbcl.h" +#include "globals.h" +#include "gc-internal.h" +#include "gc-private.h" +#include "gencgc-private.h" +#include "forwarding-ptr.h" + +#ifdef LISP_FEATURE_DARWIN_JIT + +void prepare_readonly_space(__attribute__((unused)) int print) {} +void move_rospace_to_dynamic(__attribute__((unused)) int print) {} + +#else + +/* This visitor is mostly like all the others, but only bothers with words that + * can possibly be adjusted to point to or from readonly space. + * So there's no dealing with fdefns at all, or closure-fun, funcallable-instance-fun, + * or a few other things. */ +static void visit_pointer_words(lispobj* object, lispobj (*func)(lispobj, uword_t), uword_t arg) +{ +#define FIX(what) { lispobj ptr = what; \ + if (is_lisp_pointer(ptr)) { lispobj new = func(ptr, arg); if (new != ptr) what = new; } } + + if (is_cons_half(*object)) { + FIX(object[0]); + FIX(object[1]); + return; + } + int widetag = widetag_of(object); + if (instanceoid_widetag_p(widetag)) { + lispobj layout = layout_of(object); + if (layout) { + struct bitmap bitmap = get_layout_bitmap(LAYOUT(layout)); + int nslots = instanceoid_length(*object), i; + for (i=0; i<nslots; ++i) if (bitmap_logbitp(i, bitmap)) FIX(object[i+1]); + } + } else if (widetag == SIMPLE_VECTOR_WIDETAG) { + struct vector* v = (void*)object; + sword_t len = vector_len(v), i; + int rehash = 0; + for (i=0; i<len; ++i) { + lispobj old = v->data[i]; + if (!is_lisp_pointer(old)) continue; + lispobj new = func(old, arg); + if (new != old) v->data[i] = new, rehash = 1; + } + // The 'rehash' bit on address-sensitive hashing vectors needs to be set if + // an address-sensitive key moved, because it won't move again in final GC. + if (vector_flagp(*object, VectorAddrHashing) && rehash) v->data[1] = make_fixnum(1); + } else if (widetag == SYMBOL_WIDETAG) { + struct symbol*s = (void*)object; + FIX(s->value); + FIX(s->info); + lispobj name = decode_symbol_name(s->name); + gc_assert(is_lisp_pointer(name)); + set_symbol_name(s, func(name, arg)); + } else if (widetag == CODE_HEADER_WIDETAG) { + int boxedlen = code_header_words((struct code*)object), i; + // first 4 slots are header, boxedlen, fixups, debuginfo + for (i=2; i<boxedlen; ++i) FIX(object[i]); + } else if (widetag == CLOSURE_WIDETAG || + widetag == RATIO_WIDETAG || widetag == COMPLEX_WIDETAG || + widetag == SIMPLE_ARRAY_WIDETAG || + (widetag >= COMPLEX_BASE_STRING_WIDETAG && widetag <= COMPLEX_ARRAY_WIDETAG) || + widetag == WEAK_POINTER_WIDETAG) { + int len = object_size(object), i; + for (i=1; i<len; ++i) FIX(object[i]); + } +#undef FIX +} + +static int readonly_unboxed_obj_p(lispobj* obj) +{ + if (is_cons_half(*obj)) return 0; + int widetag = widetag_of(obj); + switch (widetag) { + case BIGNUM_WIDETAG: case DOUBLE_FLOAT_WIDETAG: + case COMPLEX_SINGLE_FLOAT_WIDETAG: case COMPLEX_DOUBLE_FLOAT_WIDETAG: + case SAP_WIDETAG: case SIMPLE_ARRAY_NIL_WIDETAG: + return 1; + case RATIO_WIDETAG: case COMPLEX_WIDETAG: + return fixnump(obj[1]) && fixnump(obj[2]); +#ifdef LISP_FEATURE_SIMD_PACK + case SIMD_PACK_WIDETAG: +#endif + } + if ((widetag > SIMPLE_VECTOR_WIDETAG && widetag < COMPLEX_BASE_STRING_WIDETAG)) { + if (!vector_len((struct vector*)obj)) return 1; // length 0 vectors can't be stored into + // any vector marked shareable is a winner + if (*obj & (VECTOR_SHAREABLE|VECTOR_SHAREABLE_NONSTD)<<ARRAY_FLAGS_POSITION) return 1; + } + if (widetag == SIMPLE_VECTOR_WIDETAG) { + struct vector*v = (void*)obj; + sword_t length = vector_len(v); + if (!length) return 1; // length 0 vectors can't be stored into + if (*obj & (VECTOR_SHAREABLE|VECTOR_SHAREABLE_NONSTD)<<ARRAY_FLAGS_POSITION) { + // If every element is non-pointer, then it can go in readonly space + sword_t i; + for (i=0; i<length; ++i) + if (v->data[i] != NIL && is_lisp_pointer(v->data[i])) return 0; + return 1; + } + } + return 0; +} + +static sword_t careful_object_size(lispobj* obj) { + return object_size(forwarding_pointer_p(obj) + ? native_pointer(forwarding_pointer_value(obj)) + : obj); +} + +static void walk_range(lispobj* start, lispobj* end, void (*func)(lispobj*,uword_t), uword_t arg) +{ + lispobj* where = start; + for ( ; where < end ; where += careful_object_size(where) ) func(where, arg); +} + +static void walk_all_spaces(void (*fun)(lispobj*,uword_t), uword_t arg) +{ + walk_range((lispobj*)NIL_SYMBOL_SLOTS_START, (lispobj*)NIL_SYMBOL_SLOTS_END, fun, arg); + walk_range((lispobj*)STATIC_SPACE_OBJECTS_START, static_space_free_pointer, fun, arg); +#ifdef LISP_FEATURE_IMMOBILE_SPACE + walk_range((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, fun, arg); + walk_range((lispobj*)VARYOBJ_SPACE_START, varyobj_free_pointer, fun, arg); +#endif + page_index_t first, last; + for ( first = 0 ; first < next_free_page ; first = 1+last ) { + last = contiguous_block_final_page(first); + walk_range((lispobj*)page_address(first), + (lispobj*)page_address(last) + page_words_used(last), + fun, arg); + } +} + +static void ensure_forwarded(lispobj* obj) +{ + if (forwarding_pointer_p(obj)) return; + int nwords = object_size(obj); + lispobj* copy = read_only_space_free_pointer; + read_only_space_free_pointer += nwords; + gc_assert((uword_t)read_only_space_free_pointer <= READ_ONLY_SPACE_END); + memcpy(copy, obj, nwords << WORD_SHIFT); + set_forwarding_pointer(obj, make_lispobj(copy, OTHER_POINTER_LOWTAG)); +} + +static inline lispobj* symbol_name_native_ptr(struct symbol* symbol) { + return native_pointer(decode_symbol_name(symbol->name)); +} + +static lispobj follow_ro_fp(lispobj ptr, __attribute__((unused)) uword_t arg) { + return follow_fp(ptr); // just ignore arg +} +static void follow_rospace_ptrs(lispobj* obj, __attribute__((unused)) uword_t arg) { + if (*obj != FORWARDING_HEADER) visit_pointer_words(obj, follow_ro_fp, 0); +} +static void insert_filler(lispobj* obj, __attribute__((unused)) uword_t arg) { + if (*obj == FORWARDING_HEADER) { + sword_t nwords = object_size(native_pointer(forwarding_pointer_value(obj))); + // TODO: huge fillers aren't really used elsewhere. Can this exceed the + // bits allotted for the size field? Insert more than one filler if needed. + *obj = make_filler_header(nwords); + } +} + +void prepare_readonly_space(int print) +{ + gc_assert((uword_t)read_only_space_free_pointer == READ_ONLY_SPACE_START); + int sum_sizes = 0; + // 1. Sum of the sizes of immutable objects, which can only be in dynamic space + if (print) fprintf(stderr, "purify: calculating size ... "); + page_index_t first, last; + for ( first = 0; first < next_free_page; first = 1+last ) { + last = contiguous_block_final_page(first); + lispobj* where = (lispobj*)page_address(first); + lispobj* limit = (lispobj*)page_address(last) + page_words_used(last); + int nwords; + for ( ; where < limit ; where += nwords ) { + nwords = object_size(where); + if ( readonly_unboxed_obj_p(where) ) sum_sizes += nwords; + } + } + sum_sizes <<= WORD_SHIFT; + if (print) fprintf(stderr, "%d bytes\n", sum_sizes); + int string_space_size = ALIGN_UP(sum_sizes, BACKEND_PAGE_BYTES); + // Try to place readonly just below dynamic space, but it doesn't really matter where + READ_ONLY_SPACE_START = + (uword_t)os_validate(MOVABLE, (char*)DYNAMIC_SPACE_START - string_space_size, + string_space_size, 0, 0); + READ_ONLY_SPACE_END = READ_ONLY_SPACE_START + string_space_size; + read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; + + + // 2. Forward all symbol names so that they're placed contiguously + // Could be even more clever and sort lexicographically for determistic core + if (print) fprintf(stderr, "purify: forwarding symbol names\n"); + ensure_forwarded(symbol_name_native_ptr((void*)NIL_SYMBOL_SLOTS_START)); +#ifdef LISP_FEATURE_IMMOBILE_SPACE + { + lispobj* where = (lispobj*)FIXEDOBJ_SPACE_START; + lispobj* limit = fixedobj_free_pointer; + for ( ; where < limit ; where += object_size(where) ) + if (widetag_of(where) == SYMBOL_WIDETAG) + ensure_forwarded(symbol_name_native_ptr((struct symbol*)where)); + } +#endif + for ( first = 0; first < next_free_page; first = 1+last ) { + last = contiguous_block_final_page(first); + lispobj* where = (lispobj*)page_address(first); + lispobj* limit = (lispobj*)page_address(last) + page_words_used(last); + for ( ; where < limit ; where += careful_object_size(where) ) + if (widetag_of(where) == SYMBOL_WIDETAG) + ensure_forwarded(symbol_name_native_ptr((struct symbol*)where)); + } + + // 3. Forward everything else + if (print) fprintf(stderr, "purify: forwarding other data\n"); + for ( first = 0; first < next_free_page; first = 1+last ) { + last = contiguous_block_final_page(first); + lispobj* where = (lispobj*)page_address(first); + lispobj* limit = (lispobj*)page_address(last) + page_words_used(last); + for ( ; where < limit ; where += careful_object_size(where) ) + if (readonly_unboxed_obj_p(where)) ensure_forwarded(where); + } + + // 4. Update all objects in all spaces to point to r/o copy of anything that moved + if (print) fprintf(stderr, "purify: fixing all pointers\n"); + walk_all_spaces(follow_rospace_ptrs, 0); + walk_all_spaces(insert_filler, 0); +} + +/* Now for the opposite of 'purify' - moving back from R/O to dynamic */ + +static lispobj follow_shadow_fp(lispobj ptr, uword_t arg) { + if (!readonly_space_p(ptr)) return ptr; + lispobj* shadow_space = (lispobj*)arg; + lispobj* base = native_pointer(ptr); + int displacement = base - (lispobj*)READ_ONLY_SPACE_START; + return shadow_space[displacement]; +} + +static void undo_rospace_ptrs(lispobj* obj, uword_t arg) { + visit_pointer_words(obj, follow_shadow_fp, arg); +} + +void move_rospace_to_dynamic(__attribute__((unused)) int print) +{ + int space_usage = (uword_t)read_only_space_free_pointer - READ_ONLY_SPACE_START; + if (!space_usage) return; + lispobj* shadow_base = calloc(space_usage, 1); + gc_assert(shadow_base); + lispobj* shadow_cursor = shadow_base; + // Forward everything in R/O to dynamic space. Record FPs outside of the objects + // since the space is not writable and we're about to unmap. + lispobj *where = (lispobj*)READ_ONLY_SPACE_START; + int nwords; + for ( ; where < read_only_space_free_pointer ; where += nwords, shadow_cursor += nwords ) { + nwords = headerobj_size(where); + lispobj *new = gc_general_alloc(unboxed_region, nwords*N_WORD_BYTES, PAGE_TYPE_BOXED); + memcpy(new, where, nwords*N_WORD_BYTES); + *shadow_cursor = make_lispobj(new, OTHER_POINTER_LOWTAG); + } + ensure_region_closed(unboxed_region, PAGE_TYPE_BOXED); + os_invalidate((void*)READ_ONLY_SPACE_START, READ_ONLY_SPACE_END - READ_ONLY_SPACE_START); + walk_all_spaces(undo_rospace_ptrs, (uword_t)shadow_base); + // Set it empty + read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; +} + +#endif diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index e67ef203c8..745ffb8efd 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -688,7 +688,8 @@ static boolean record_ptr(lispobj* source, lispobj target, return 1; } -#define relevant_ptr_p(x) (find_page_index((void*)(x))>=0||immobile_space_p((lispobj)(x))) +#define relevant_ptr_p(x) \ + (find_page_index((void*)(x))>=0||immobile_space_p((lispobj)(x))||readonly_space_p(x)) #define COUNT_POINTER(x) { ++n_scanned_words; \ if (!is_lisp_pointer(x)) ++n_immediates; \ diff --git a/src/runtime/validate.c b/src/runtime/validate.c index b33fe54189..68bd04142a 100644 --- a/src/runtime/validate.c +++ b/src/runtime/validate.c @@ -29,6 +29,9 @@ uword_t DYNAMIC_0_SPACE_START, DYNAMIC_1_SPACE_START; #else uword_t DYNAMIC_SPACE_START; #endif +#ifndef LISP_FEATURE_DARWIN_JIT +uword_t READ_ONLY_SPACE_START, READ_ONLY_SPACE_END; +#endif uword_t asm_routines_start, asm_routines_end; diff --git a/tests/hide-packages.test.sh b/tests/hide-packages.test.sh index 5b98c237e9..c3c34feec8 100644 --- a/tests/hide-packages.test.sh +++ b/tests/hide-packages.test.sh @@ -7,6 +7,8 @@ set -e # +INTERNAL-FEATURES+ is a constant, so use a roundabout way of # clobbering it that avoids a compiler warning and a runtime error. CLOBBER_INTERNAL_FEATURES="(handler-bind ((simple-error #'continue)) + (sb-vm::close-thread-alloc-region) + (alien-funcall (extern-alien \"move_rospace_to_dynamic\" (function void int)) 1) (sb-kernel:set-symbol-global-value (eval ''sb-impl:+internal-features+) nil))" ### Test 1: assert that no package name string has a reference from any diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index f3169e4053..1d7573f82a 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1680,12 +1680,12 @@ (alien-funcall (extern-alien "load_core_bytes" (function system-area-pointer - int int unsigned unsigned)) + int int unsigned unsigned int)) (sb-sys:fd-stream-fd ,stream) - ;; Skip the core header - (+ ,start +backend-page-bytes+) + (+ ,start +backend-page-bytes+) ; Skip the core header 0 ; place it anywhere - (* ,npages +backend-page-bytes+))) + (* ,npages +backend-page-bytes+) ; len + 0)) ,@body) (when ,sap-var (alien-funcall From 673a6e47f1b16902853b27d060add088285c351a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 19 Jul 2022 12:54:37 -0400 Subject: [PATCH 3718/4023] Move {MAKE,RENAME,DELETE}-PACKAGE and APROPOS Fewer undefined forward refs --- src/code/defpackage.lisp | 274 ++++++++++++++++++++ src/code/target-package.lisp | 282 --------------------- src/cold/undefined-fun-allowlist.lisp-expr | 3 - 3 files changed, 274 insertions(+), 285 deletions(-) diff --git a/src/code/defpackage.lisp b/src/code/defpackage.lisp index 65ddadaec3..22972804cd 100644 --- a/src/code/defpackage.lisp +++ b/src/code/defpackage.lisp @@ -11,6 +11,230 @@ (in-package "SB-IMPL") +;;; ANSI specifies that: +;;; (1) MAKE-PACKAGE and DEFPACKAGE use the same default package-use-list +;;; (2) that it (as an implementation-defined value) should be documented, +;;; which we do in the doc string. +;;; For OAOO reasons we give a name to this value and then use #. readmacro +;;; to splice it in as a constant. Anyone who actually wants a random value +;;; is free to :USE (PACKAGE-USE-LIST :CL-USER) or whatever. +(defglobal *!default-package-use-list* nil) + +(defun make-package (name &key + (use '#.*!default-package-use-list*) + nicknames + (internal-symbols 10) + (external-symbols 10)) + #.(format nil + "Make a new package having the specified NAME, NICKNAMES, and USE +list. :INTERNAL-SYMBOLS and :EXTERNAL-SYMBOLS are estimates for the number of +internal and external symbols which will ultimately be present in the package. +The default value of USE is implementation-dependent, and in this +implementation it is ~S." *!default-package-use-list*) + (prog ((name (stringify-string-designator name)) + (nicks (stringify-string-designators nicknames)) + (package + (or (resolve-deferred-package name) + (resolve-rehoming-package name) + (%make-package (make-package-hashtable internal-symbols) + (make-package-hashtable external-symbols)))) + clobber) + :restart + (when (find-package name) + ;; ANSI specifies that this error is correctable. + (signal-package-cerror + name + "Clobber existing package." + "A package named ~S already exists" name) + (setf clobber t)) + (with-package-graph () + ;; Check for race, signal the error outside the lock. + (when (and (not clobber) (find-package name)) + (go :restart)) + (setf (package-%name package) name) + ;; Do a USE-PACKAGE for each thing in the USE list so that checking for + ;; conflicting exports among used packages is done. + (use-package use package) + ;; FIXME: ENTER-NEW-NICKNAMES can fail (ERROR) if nicknames are illegal, + ;; which would leave us with possibly-bad side effects from the earlier + ;; USE-PACKAGE (e.g. this package on the used-by lists of other packages, + ;; but not in *PACKAGE-NAMES*, and possibly import side effects too?). + ;; Perhaps this can be solved by just moving ENTER-NEW-NICKNAMES before + ;; USE-PACKAGE, but I need to check what kinds of errors can be caused by + ;; USE-PACKAGE, too. + (%enter-new-nicknames package nicks) + ;; The name table is actually multi-writer concurrent, but due to + ;; lazy removal of :DELETED entries we want to enforce a single-writer. + ;; We're inside WITH-PACKAGE-GRAPH so this is already synchronized with + ;; other MAKE-PACKAGE operations, but we need the additional lock + ;; so that it synchronizes with RENAME-PACKAGE. + (with-package-names (table) + (%register-package table name package)) + (atomic-incf *package-names-cookie*) + (when (boundp 'sb-c::*compilation*) + (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) + (return package)) + (bug "never"))) + +(flet ((remove-names (package name-table keep-primary-name) + ;; An INFO-HASHTABLE does not support REMHASH. We can simulate it + ;; by changing the value to :DELETED. + ;; (NIL would be preferable, but INFO-GETHASH does not return + ;; a secondary value indicating whether the NIL was by default + ;; or found, not does it take a different default to return). + ;; At some point the table might contain more deleted values than + ;; useful values. We call %REBUILD-PACKAGE-NAMES to rectify that. + (dx-let ((names (cons (package-name package) + (package-nicknames package))) + (i 0)) + (when keep-primary-name (pop names)) + (dolist (name names) + ;; Aver that the following SETF doesn't insert a new <k,v> pair. + (aver (info-gethash name name-table)) + (setf (info-gethash name name-table) :deleted) + (incf i)) + (incf (info-env-tombstones name-table) i)) + nil)) + +;;; Change the name if we can, blast any old nicknames and then +;;; add in any new ones. +;;; +;;; The spec says that NAME is a package designator (not just a string designator) +;;; which is weird, but potentially meaningful if assigning new global nicknames. +;;; If not called for that purpose, then it's largely pointless, because you can't +;;; rename to any package-designator other than itself without causing a conflict. +;;; A survey of some other implementations suggests that we're in the minority +;;; as to the legality of (RENAME-PACKAGE "A" (FIND-PACKAGE "A") '("A-NICK")). +;;; +;;; ABCL: +;;; The value #<PACKAGE A> is not of type (OR STRING SYMBOL CHARACTER). +;;; CCL: +;;; Error: The value #<Package "A"> is not of the expected type (OR STRING SYMBOL CHARACTER). +;;; CMUCL: +;;; #<The A package, 0/9 internal, 0/9 external> cannot be coerced to a string. +;;; ECL: +;;; In function STRING, the value of the first argument is #<"A" package> +;;; which is not of the expected type STRING +;;; +;;; CLISP agrees with us that this usage is permitted. If the new "name" is a +;;; different package, it is merely the same error as if any already-existing name +;;; was given. I see no reason to be more strict than the spec would have it be. +(defun rename-package (package-designator name &optional (nicknames ())) + "Changes the name and nicknames for a package." + (prog ((nicks (stringify-string-designators nicknames))) + :restart + (let ((package (find-undeleted-package-or-lose package-designator)) + ;; This is the "weirdness" alluded to. Do it in the loop in case + ;; the stringified value changes on restart when NAME is a package. + (name (stringify-package-designator name)) + (found (find-package name))) + (unless (or (not found) (eq found package)) + (signal-package-error name + "A package named ~S already exists." name)) + (with-single-package-locked-error () + (unless (and (string= name (package-name package)) + (null (set-difference nicks (package-nicknames package) + :test #'string=))) + (assert-package-unlocked + package "renaming as ~A~@[ with nickname~*~P ~1@*~{~A~^, ~}~]" + name nicks (length nicks))) + (with-package-names (table) + ;; Check for race conditions now that we have the lock. + (unless (eq package (find-package package-designator)) + (go :restart)) + ;; Do the renaming. + ;; As a special case, do not allow the package to transiently disappear + ;; if PACKAGE-NAME is unchanged. This avoids glitches with build systems + ;; which try to operate on subcomponents in parallel, where one of the + ;; built subcomponents needs to add nicknames to an existing package. + ;; We could be clever here as well by not removing nicknames that + ;; will ultimately be re-added, but that didn't seem as critical. + (let ((keep-primary-name (string= name (package-%name package)))) + (remove-names package table keep-primary-name) + (unless keep-primary-name + (%register-package table name package))) + (setf (package-%name package) name + (package-%nicknames package) ())) + ;; Adding each nickname acquires and releases the table lock, + ;; because it's potentially interactive (on failure) and therefore + ;; not ideal to hold the lock for the entire duration. + (%enter-new-nicknames package nicks)) + (atomic-incf *package-names-cookie*) + (when (boundp 'sb-c::*compilation*) + (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) + (return package)))) + +(defun delete-package (package-designator) + "Delete the package designated by PACKAGE-DESIGNATOR from the package + system data structures." + (tagbody :restart + (let ((package (find-package package-designator))) + (cond ((not package) + ;; This continuable error is required by ANSI. + (signal-package-cerror + package-designator + "Ignore." + "There is no package named ~S." package-designator) + (return-from delete-package nil)) + ((not (package-name package)) ; already deleted + (return-from delete-package nil)) + (t + (with-single-package-locked-error + (:package package "deleting package ~A" package) + (let ((use-list (package-used-by-list package))) + (when use-list + ;; This continuable error is specified by ANSI. + (signal-package-cerror + package + "Remove dependency in other packages." + "~@<Package ~S is used by package~P:~2I~_~S~@:>" + (package-name package) + (length use-list) + (mapcar #'package-name use-list)) + (dolist (p use-list) + (unuse-package package p)))) + (dolist (p (package-implements-list package)) + (remove-implementation-package package p)) + (with-package-graph () + ;; Check for races, restart if necessary. + (let ((package2 (find-package package-designator))) + (when (or (neq package package2) (package-used-by-list package2)) + (go :restart))) + (dolist (used (package-use-list package)) + (unuse-package used package)) + (setf (package-%local-nicknames package) nil) + (let ((rehoming-package (make-rehoming-package package))) + (flet ((nullify-home (symbols) + (dovector (x (package-hashtable-cells symbols)) + (when (and (symbolp x) + (eq (symbol-package x) package)) + (%set-symbol-package x rehoming-package))))) + (nullify-home (package-internal-symbols package)) + (nullify-home (package-external-symbols package)))) + (with-package-names (table) + (awhen (package-id package) + (setf (aref *id->package* it) nil (package-id package) nil)) + (remove-names package table nil) + (setf (package-%name package) nil + ;; Setting PACKAGE-%NAME to NIL is required in order to + ;; make PACKAGE-NAME return NIL for a deleted package as + ;; ANSI requires. Setting the other slots to NIL + ;; and blowing away the PACKAGE-HASHTABLES is just done + ;; for tidiness and to help the GC. + (package-%nicknames package) nil)) + (atomic-incf *package-names-cookie*) + (when (boundp 'sb-c::*compilation*) + (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) + (setf (package-%use-list package) nil + (package-tables package) #() + (package-%shadowing-symbols package) nil + (package-internal-symbols package) + (make-package-hashtable 0) + (package-external-symbols package) + (make-package-hashtable 0))) + (return-from delete-package t))))))) +) ; end FLET + (defmacro defpackage (package &rest options) #.(format nil "Defines a new package called PACKAGE. Each of OPTIONS should be one of the @@ -396,3 +620,53 @@ specifies to signal a warning if SWANK package is in variance, and an error othe :format-control "no symbol named ~S in ~S" :format-arguments (list name (package-name package)))) (intern name package))))) + +;;;; APROPOS and APROPOS-LIST + +(defun briefly-describe-symbol (symbol) + (fresh-line) + (prin1 symbol) + (when (boundp symbol) + (let ((value (symbol-value symbol))) + (if (typep value '(or fixnum symbol hash-table)) + (format t " = ~S" value) + (format t " (bound, ~S)" (type-of value))))) + (when (fboundp symbol) + (write-string " (fbound)"))) + +(defun apropos-list (string-designator + &optional + package-designator + external-only) + "Like APROPOS, except that it returns a list of the symbols found instead + of describing them." + (if package-designator + (let ((package (find-undeleted-package-or-lose package-designator)) + (string (stringify-string-designator string-designator)) + (result nil)) + (do-symbols (symbol package) + (when (and (or (not external-only) + (and (eq (symbol-package symbol) package) + (eq (nth-value 1 (find-symbol (symbol-name symbol) + package)) + :external))) + (search string (symbol-name symbol) :test #'char-equal)) + (pushnew symbol result))) + (sort result #'string-lessp)) + (delete-duplicates + (mapcan (lambda (package) + (apropos-list string-designator package external-only)) + (sort (list-all-packages) #'string-lessp :key #'package-name))))) + +(defun apropos (string-designator &optional package external-only) + "Briefly describe all symbols which contain the specified STRING. + If PACKAGE is supplied then only describe symbols present in + that package. If EXTERNAL-ONLY then only describe + external symbols in the specified package." + ;; Implementing this in terms of APROPOS-LIST keeps things simple at the cost + ;; of some unnecessary consing; and the unnecessary consing shouldn't be an + ;; issue, since this function is is only useful interactively anyway, and + ;; we can cons and GC a lot faster than the typical user can read.. + (dolist (symbol (apropos-list string-designator package external-only)) + (briefly-describe-symbol symbol)) + (values)) diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 51fe0d0734..1a2c668f69 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -989,238 +989,6 @@ Experimental: interface subject to change." "~S is already a nickname for ~S." nickname (package-%name found))))))) -;;; ANSI specifies that: -;;; (1) MAKE-PACKAGE and DEFPACKAGE use the same default package-use-list -;;; (2) that it (as an implementation-defined value) should be documented, -;;; which we do in the doc string. -;;; For OAOO reasons we give a name to this value and then use #. readmacro -;;; to splice it in as a constant. Anyone who actually wants a random value -;;; is free to :USE (PACKAGE-USE-LIST :CL-USER) or whatever. -;;; -;;; This must not use DEFGLOBAL, which calls SET-SYMBOL-GLOBAL-VALUE at -;;; compile-time. The xc stub for that is defined to error out on purpose, -;;; since there is no such thing as a global variable in portable CL. -;;; Anyway this is a trivial compile-time constant that disappears after -;;; self-build, so efficiency of reads (one of the concerns of DEFGLOBAL, -;;; the other being documentation of intent) doesn't matter in the least. -(eval-when (:compile-toplevel :load-toplevel :execute) - (defvar *!default-package-use-list* nil)) - -(defun make-package (name &key - (use '#.*!default-package-use-list*) - nicknames - (internal-symbols 10) - (external-symbols 10)) - #.(format nil - "Make a new package having the specified NAME, NICKNAMES, and USE -list. :INTERNAL-SYMBOLS and :EXTERNAL-SYMBOLS are estimates for the number of -internal and external symbols which will ultimately be present in the package. -The default value of USE is implementation-dependent, and in this -implementation it is ~S." *!default-package-use-list*) - (prog ((name (stringify-string-designator name)) - (nicks (stringify-string-designators nicknames)) - (package - (or (resolve-deferred-package name) - (resolve-rehoming-package name) - (%make-package (make-package-hashtable internal-symbols) - (make-package-hashtable external-symbols)))) - clobber) - :restart - (when (find-package name) - ;; ANSI specifies that this error is correctable. - (signal-package-cerror - name - "Clobber existing package." - "A package named ~S already exists" name) - (setf clobber t)) - (with-package-graph () - ;; Check for race, signal the error outside the lock. - (when (and (not clobber) (find-package name)) - (go :restart)) - (setf (package-%name package) name) - ;; Do a USE-PACKAGE for each thing in the USE list so that checking for - ;; conflicting exports among used packages is done. - (use-package use package) - ;; FIXME: ENTER-NEW-NICKNAMES can fail (ERROR) if nicknames are illegal, - ;; which would leave us with possibly-bad side effects from the earlier - ;; USE-PACKAGE (e.g. this package on the used-by lists of other packages, - ;; but not in *PACKAGE-NAMES*, and possibly import side effects too?). - ;; Perhaps this can be solved by just moving ENTER-NEW-NICKNAMES before - ;; USE-PACKAGE, but I need to check what kinds of errors can be caused by - ;; USE-PACKAGE, too. - (%enter-new-nicknames package nicks) - ;; The name table is actually multi-writer concurrent, but due to - ;; lazy removal of :DELETED entries we want to enforce a single-writer. - ;; We're inside WITH-PACKAGE-GRAPH so this is already synchronized with - ;; other MAKE-PACKAGE operations, but we need the additional lock - ;; so that it synchronizes with RENAME-PACKAGE. - (with-package-names (table) - (%register-package table name package)) - (atomic-incf *package-names-cookie*) - (when (boundp 'sb-c::*compilation*) - (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) - (return package)) - (bug "never"))) - -(flet ((remove-names (package name-table keep-primary-name) - ;; An INFO-HASHTABLE does not support REMHASH. We can simulate it - ;; by changing the value to :DELETED. - ;; (NIL would be preferable, but INFO-GETHASH does not return - ;; a secondary value indicating whether the NIL was by default - ;; or found, not does it take a different default to return). - ;; At some point the table might contain more deleted values than - ;; useful values. We call %REBUILD-PACKAGE-NAMES to rectify that. - (dx-let ((names (cons (package-name package) - (package-nicknames package))) - (i 0)) - (when keep-primary-name (pop names)) - (dolist (name names) - ;; Aver that the following SETF doesn't insert a new <k,v> pair. - (aver (info-gethash name name-table)) - (setf (info-gethash name name-table) :deleted) - (incf i)) - (incf (info-env-tombstones name-table) i)) - nil)) - -;;; Change the name if we can, blast any old nicknames and then -;;; add in any new ones. -;;; -;;; The spec says that NAME is a package designator (not just a string designator) -;;; which is weird, but potentially meaningful if assigning new global nicknames. -;;; If not called for that purpose, then it's largely pointless, because you can't -;;; rename to any package-designator other than itself without causing a conflict. -;;; A survey of some other implementations suggests that we're in the minority -;;; as to the legality of (RENAME-PACKAGE "A" (FIND-PACKAGE "A") '("A-NICK")). -;;; -;;; ABCL: -;;; The value #<PACKAGE A> is not of type (OR STRING SYMBOL CHARACTER). -;;; CCL: -;;; Error: The value #<Package "A"> is not of the expected type (OR STRING SYMBOL CHARACTER). -;;; CMUCL: -;;; #<The A package, 0/9 internal, 0/9 external> cannot be coerced to a string. -;;; ECL: -;;; In function STRING, the value of the first argument is #<"A" package> -;;; which is not of the expected type STRING -;;; -;;; CLISP agrees with us that this usage is permitted. If the new "name" is a -;;; different package, it is merely the same error as if any already-existing name -;;; was given. I see no reason to be more strict than the spec would have it be. -(defun rename-package (package-designator name &optional (nicknames ())) - "Changes the name and nicknames for a package." - (prog ((nicks (stringify-string-designators nicknames))) - :restart - (let ((package (find-undeleted-package-or-lose package-designator)) - ;; This is the "weirdness" alluded to. Do it in the loop in case - ;; the stringified value changes on restart when NAME is a package. - (name (stringify-package-designator name)) - (found (find-package name))) - (unless (or (not found) (eq found package)) - (signal-package-error name - "A package named ~S already exists." name)) - (with-single-package-locked-error () - (unless (and (string= name (package-name package)) - (null (set-difference nicks (package-nicknames package) - :test #'string=))) - (assert-package-unlocked - package "renaming as ~A~@[ with nickname~*~P ~1@*~{~A~^, ~}~]" - name nicks (length nicks))) - (with-package-names (table) - ;; Check for race conditions now that we have the lock. - (unless (eq package (find-package package-designator)) - (go :restart)) - ;; Do the renaming. - ;; As a special case, do not allow the package to transiently disappear - ;; if PACKAGE-NAME is unchanged. This avoids glitches with build systems - ;; which try to operate on subcomponents in parallel, where one of the - ;; built subcomponents needs to add nicknames to an existing package. - ;; We could be clever here as well by not removing nicknames that - ;; will ultimately be re-added, but that didn't seem as critical. - (let ((keep-primary-name (string= name (package-%name package)))) - (remove-names package table keep-primary-name) - (unless keep-primary-name - (%register-package table name package))) - (setf (package-%name package) name - (package-%nicknames package) ())) - ;; Adding each nickname acquires and releases the table lock, - ;; because it's potentially interactive (on failure) and therefore - ;; not ideal to hold the lock for the entire duration. - (%enter-new-nicknames package nicks)) - (atomic-incf *package-names-cookie*) - (when (boundp 'sb-c::*compilation*) - (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) - (return package)))) - -(defun delete-package (package-designator) - "Delete the package designated by PACKAGE-DESIGNATOR from the package - system data structures." - (tagbody :restart - (let ((package (find-package package-designator))) - (cond ((not package) - ;; This continuable error is required by ANSI. - (signal-package-cerror - package-designator - "Ignore." - "There is no package named ~S." package-designator) - (return-from delete-package nil)) - ((not (package-name package)) ; already deleted - (return-from delete-package nil)) - (t - (with-single-package-locked-error - (:package package "deleting package ~A" package) - (let ((use-list (package-used-by-list package))) - (when use-list - ;; This continuable error is specified by ANSI. - (signal-package-cerror - package - "Remove dependency in other packages." - "~@<Package ~S is used by package~P:~2I~_~S~@:>" - (package-name package) - (length use-list) - (mapcar #'package-name use-list)) - (dolist (p use-list) - (unuse-package package p)))) - (dolist (p (package-implements-list package)) - (remove-implementation-package package p)) - (with-package-graph () - ;; Check for races, restart if necessary. - (let ((package2 (find-package package-designator))) - (when (or (neq package package2) (package-used-by-list package2)) - (go :restart))) - (dolist (used (package-use-list package)) - (unuse-package used package)) - (setf (package-%local-nicknames package) nil) - (let ((rehoming-package (make-rehoming-package package))) - (flet ((nullify-home (symbols) - (dovector (x (package-hashtable-cells symbols)) - (when (and (symbolp x) - (eq (symbol-package x) package)) - (%set-symbol-package x rehoming-package))))) - (nullify-home (package-internal-symbols package)) - (nullify-home (package-external-symbols package)))) - (with-package-names (table) - (awhen (package-id package) - (setf (aref *id->package* it) nil (package-id package) nil)) - (remove-names package table nil) - (setf (package-%name package) nil - ;; Setting PACKAGE-%NAME to NIL is required in order to - ;; make PACKAGE-NAME return NIL for a deleted package as - ;; ANSI requires. Setting the other slots to NIL - ;; and blowing away the PACKAGE-HASHTABLES is just done - ;; for tidiness and to help the GC. - (package-%nicknames package) nil)) - (atomic-incf *package-names-cookie*) - (when (boundp 'sb-c::*compilation*) - (setf (sb-c::package-environment-changed sb-c::*compilation*) t)) - (setf (package-%use-list package) nil - (package-tables package) #() - (package-%shadowing-symbols package) nil - (package-internal-symbols package) - (make-package-hashtable 0) - (package-external-symbols package) - (make-package-hashtable 0))) - (return-from delete-package t))))))) -) ; end FLET - (defun list-all-packages () "Return a list of all existing packages." (let ((result ())) @@ -1826,56 +1594,6 @@ PACKAGE." (when found (pushnew symbol result)))) result)) -;;;; APROPOS and APROPOS-LIST - -(defun briefly-describe-symbol (symbol) - (fresh-line) - (prin1 symbol) - (when (boundp symbol) - (let ((value (symbol-value symbol))) - (if (typep value '(or fixnum symbol hash-table)) - (format t " = ~S" value) - (format t " (bound, ~S)" (type-of value))))) - (when (fboundp symbol) - (write-string " (fbound)"))) - -(defun apropos-list (string-designator - &optional - package-designator - external-only) - "Like APROPOS, except that it returns a list of the symbols found instead - of describing them." - (if package-designator - (let ((package (find-undeleted-package-or-lose package-designator)) - (string (stringify-string-designator string-designator)) - (result nil)) - (do-symbols (symbol package) - (when (and (or (not external-only) - (and (eq (sb-xc:symbol-package symbol) package) - (eq (nth-value 1 (find-symbol (symbol-name symbol) - package)) - :external))) - (search string (symbol-name symbol) :test #'char-equal)) - (pushnew symbol result))) - (sort result #'string-lessp)) - (delete-duplicates - (mapcan (lambda (package) - (apropos-list string-designator package external-only)) - (sort (list-all-packages) #'string-lessp :key #'package-name))))) - -(defun apropos (string-designator &optional package external-only) - "Briefly describe all symbols which contain the specified STRING. - If PACKAGE is supplied then only describe symbols present in - that package. If EXTERNAL-ONLY then only describe - external symbols in the specified package." - ;; Implementing this in terms of APROPOS-LIST keeps things simple at the cost - ;; of some unnecessary consing; and the unnecessary consing shouldn't be an - ;; issue, since this function is is only useful interactively anyway, and - ;; we can cons and GC a lot faster than the typical user can read.. - (dolist (symbol (apropos-list string-designator package external-only)) - (briefly-describe-symbol symbol)) - (values)) - ;;;; final initialization ;;;; Due to the relative difficulty - but not impossibility - of manipulating diff --git a/src/cold/undefined-fun-allowlist.lisp-expr b/src/cold/undefined-fun-allowlist.lisp-expr index eb5e70fff3..c5de1a2cca 100644 --- a/src/cold/undefined-fun-allowlist.lisp-expr +++ b/src/cold/undefined-fun-allowlist.lisp-expr @@ -167,9 +167,6 @@ sb-impl::get-processes-status-changes sb-impl::step-form sb-impl::step-values - sb-impl::stringify-package-designator - sb-impl::stringify-string-designator - sb-impl::stringify-string-designators sb-impl::unencapsulate-generic-function) ;; The following functions are in fact defined during make-host-2 ;; but they are non-toplevel so they appear to be undefined. From 22d6302977dd860a6b84b655b3868632e49b6043 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 19 Jul 2022 14:40:15 -0400 Subject: [PATCH 3719/4023] Speed up APROPOS-LIST Firstly the algorithm was horrible, and secondly there is a neat extra optimization except on #+darwin-jit. --- src/code/defpackage.lisp | 66 +++++++++++++++++++++++++++++++----- src/code/package.lisp | 1 + src/code/target-package.lisp | 3 ++ src/runtime/stringspace.c | 7 ++-- 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/code/defpackage.lisp b/src/code/defpackage.lisp index 22972804cd..ef9cfa312f 100644 --- a/src/code/defpackage.lisp +++ b/src/code/defpackage.lisp @@ -637,12 +637,20 @@ specifies to signal a warning if SWANK package is in variance, and an error othe (defun apropos-list (string-designator &optional package-designator - external-only) + external-only + &aux (string (the simple-string + (stringify-string-designator string-designator)))) "Like APROPOS, except that it returns a list of the symbols found instead of describing them." - (if package-designator + (if package-designator ; rare to supply this, I suspect + ;; This loop is extremely inefficient because both DO-SYMBOLS and FIND-SYMBOL + ;; check for inheritance, which we shouldn't if EXTERNAL-ONLY was given. + ;; Technically the external-p test could use FIND-EXTERNAL-SYMBOL but portable code + ;; can't care. Somebody did, and noticed that it wasn't working, so it got fixed + ;; in rev e92a2f8844d9 which is ironic because it came from CMUCL, which implemented + ;; APROPOS differently but then removed the nonstandard option in + ;; https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/9f652c0515f90b1fc8166d5099a0cee37e76e07c (let ((package (find-undeleted-package-or-lose package-designator)) - (string (stringify-string-designator string-designator)) (result nil)) (do-symbols (symbol package) (when (and (or (not external-only) @@ -652,11 +660,53 @@ specifies to signal a warning if SWANK package is in variance, and an error othe :external))) (search string (symbol-name symbol) :test #'char-equal)) (pushnew symbol result))) - (sort result #'string-lessp)) - (delete-duplicates - (mapcan (lambda (package) - (apropos-list string-designator package external-only)) - (sort (list-all-packages) #'string-lessp :key #'package-name))))) + (return-from apropos-list (sort result #'string-lessp)))) + ;; Since we're going to scan all packages, there are two admissible optimizations: + ;; * only scan directly present symbols, because each symbol returned has to + ;; be in some package. + ;; * if the table was not modified since core save, as is often the case, + ;; then compare by EQ to set of possibly matching strings. This has to be + ;; an improvement, because it compares STRING at most once to any symbol-name. + ;; + ;; Comparison of (TIME (APROPOS-LIST "str")) in a core with over 300,000 symbols: + ;; .840 seconds = baseline + ;; .140 seconds = inlining WITH-SYMBOL + ;; .104 seconds = MODIFIED check then R/O scan or else WITH-SYMBOL + (let (candidates) + (block done + (sb-vm:map-allocated-objects + (lambda (obj widetag size) + (declare (ignore size)) + (cond ((or (= widetag sb-vm:simple-base-string-widetag) + (= widetag sb-vm:simple-character-string-widetag)) + (when (search string obj :test #'char-equal) + (push (cons (compute-symbol-hash obj (length obj)) obj) candidates))) + (t + (return-from done)))) + :read-only)) + (let ((result (make-hash-table :test 'eq))) + (flet ((find-all-in-table (table) + (if (package-hashtable-modified table) + (dovector (entry (package-hashtable-cells table)) + ;; I would have guessed that GETHASH is faster than SEARCH, but if + ;; interposed between SYMBOLP and SEARCH, it slows down this loop. + ;; That's because almost always the symbol is NOT yet in the result, + ;; so an extra GETHASH is a strict increase in the number of + ;; instructions executed, for no net reduction in time. + (when (and (symbolp entry) + (search string (symbol-name entry) :test #'char-equal)) + (setf (gethash entry result) t))) + (dolist (candidate candidates) + (let* ((hash (the hash-code (car candidate))) + (string (the simple-string (cdr candidate))) + (length (length string))) + (with-symbol ((symbol) table string length hash) + (setf (gethash symbol result) t))))))) + (dolist (package (list-all-packages)) + (find-all-in-table (package-external-symbols package)) + (unless external-only + (find-all-in-table (package-internal-symbols package))))) + (sort (loop for k being each hash-key of result collect k) #'string-lessp)))) (defun apropos (string-designator &optional package external-only) "Briefly describe all symbols which contain the specified STRING. diff --git a/src/code/package.lisp b/src/code/package.lisp index 2df550c1d2..12e66c0908 100644 --- a/src/code/package.lisp +++ b/src/code/package.lisp @@ -58,6 +58,7 @@ (:copier nil)) ;; The general-vector of symbols (cells (missing-arg) :type simple-vector) + (modified nil :type boolean) ;; The total number of entries allowed before resizing. ;; ;; FIXME: CAPACITY would be a more descriptive name. (This is diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 1a2c668f69..ca0657bc20 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -805,6 +805,7 @@ Experimental: interface subject to change." ;;; Add a symbol to a package hashtable. The symbol MUST NOT be present. (defun add-symbol (table symbol) + (setf (package-hashtable-modified table) t) (when (zerop (package-hashtable-free table)) ;; The hashtable is full. Resize it to be able to hold twice the ;; amount of symbols than it currently contains. The actual new size @@ -894,6 +895,8 @@ Experimental: interface subject to change." (when (plusp (info-env-tombstones table)) (%rebuild-package-names table))) (flet ((tune-table-size (table) + ;; The APROPOS-LIST R/O scan optimization is inadmissible if no R/O space + #-darwin-jit (setf (package-hashtable-modified table) nil) (resize-package-hashtable table (round (* (/ +package-rehash-threshold+ diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index fffc1fff70..74b5e90b0a 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -178,7 +178,7 @@ static void insert_filler(lispobj* obj, __attribute__((unused)) uword_t arg) { void prepare_readonly_space(int print) { gc_assert((uword_t)read_only_space_free_pointer == READ_ONLY_SPACE_START); - int sum_sizes = 0; + int sum_sizes = 2; // 1. Sum of the sizes of immutable objects, which can only be in dynamic space if (print) fprintf(stderr, "purify: calculating size ... "); page_index_t first, last; @@ -202,7 +202,6 @@ void prepare_readonly_space(int print) READ_ONLY_SPACE_END = READ_ONLY_SPACE_START + string_space_size; read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; - // 2. Forward all symbol names so that they're placed contiguously // Could be even more clever and sort lexicographically for determistic core if (print) fprintf(stderr, "purify: forwarding symbol names\n"); @@ -224,6 +223,10 @@ void prepare_readonly_space(int print) if (widetag_of(where) == SYMBOL_WIDETAG) ensure_forwarded(symbol_name_native_ptr((struct symbol*)where)); } + // Add a random delimiter object between symbol-names and everything else. + // APROPOS-LIST uses this to detect the end of the strings. + *read_only_space_free_pointer = SIMPLE_VECTOR_WIDETAG; // length 0 + read_only_space_free_pointer += 2; // 3. Forward everything else if (print) fprintf(stderr, "purify: forwarding other data\n"); From 836bb091bf45a3e5dc8b3d8e6580b6440cbd0037 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 19 Jul 2022 17:54:13 -0400 Subject: [PATCH 3720/4023] Explain a new way to crash because of course I got bitten by this. --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 692020eceb..d78a4755ab 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,9 @@ changes relative to sbcl-2.2.6: everything except the DYNAMIC-EXTENT case, which used to emit a STYLE-WARNING, but these diagnostics got lost in a refactoring since sbcl-2.2.2) + * minor incompatible change: literal objects (strings, in particular) + in compiled code may at the discretion of the runtime be placed in + read-only memory. Violations of CLHS 3.7.1 could produce memory faults. * enhancement: Unicode support has been updated to support version 10.0.0 of the Unicode standard, including addition of characters and refinements to breaking and collation algorithms. From 58451118520ef7a7c164638274f939f1ffcff31e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 19 Jul 2022 20:59:05 -0400 Subject: [PATCH 3721/4023] Add debugging to a test --- tests/hide-packages.test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/hide-packages.test.sh b/tests/hide-packages.test.sh index c3c34feec8..0abf81d19e 100644 --- a/tests/hide-packages.test.sh +++ b/tests/hide-packages.test.sh @@ -48,8 +48,8 @@ run_sbcl <<EOF (sb-impl::%rebuild-package-names sb-kernel::*package-names*)) (gc :gen 7) -(setq *weak-ptrs* - (remove-if (lambda (x) (not (weak-pointer-value x))) *weak-ptrs*)) +(setq *weak-ptrs* (remove-if-not #'weak-pointer-value *weak-ptrs*)) +(when *weak-ptrs* (search-roots *weak-ptrs* :print :verbose :criterion :static)) (assert (null *weak-ptrs*)) (format t "Package hiding test 1: PASS~%") EOF From ca4baa8216bca2cd5e57f2f333f70a95989b22ca Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 20 Jul 2022 16:54:15 +0300 Subject: [PATCH 3722/4023] Fix -sb-unicode. --- src/code/defpackage.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/defpackage.lisp b/src/code/defpackage.lisp index ef9cfa312f..bed2d55acb 100644 --- a/src/code/defpackage.lisp +++ b/src/code/defpackage.lisp @@ -678,6 +678,7 @@ specifies to signal a warning if SWANK package is in variance, and an error othe (lambda (obj widetag size) (declare (ignore size)) (cond ((or (= widetag sb-vm:simple-base-string-widetag) + #+sb-unicode (= widetag sb-vm:simple-character-string-widetag)) (when (search string obj :test #'char-equal) (push (cons (compute-symbol-hash obj (length obj)) obj) candidates))) From 448c71a410f1e51255f8987a54a2355b0e2b963d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 20 Jul 2022 16:56:14 +0300 Subject: [PATCH 3723/4023] Add an #include --- src/runtime/stringspace.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index 74b5e90b0a..010f1761bc 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -10,6 +10,7 @@ */ #include <stdio.h> +#include <stdlib.h> #include "sbcl.h" #include "globals.h" #include "gc-internal.h" From 2ed69e474fa283c40cae89950f474c88803bff69 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 20 Jul 2022 10:21:46 -0400 Subject: [PATCH 3724/4023] Improve error message --- src/code/gc.lisp | 11 +++++++++++ src/code/target-error.lisp | 6 ------ src/runtime/gc-private.h | 4 ---- src/runtime/globals.h | 4 ++++ src/runtime/interrupt.c | 5 +++++ tests/gc.impure.lisp | 14 ++++++++++++++ 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 93cab8ad02..05e67115e7 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -620,3 +620,14 @@ Experimental: interface subject to change." ;;; somewhere else which I could not find. (defun lisp-space-p (sap &aux (addr (sap-int sap))) (cases)) ) ; end MACROLET + +(define-condition memory-fault-error (system-condition error) () + (:report + (lambda (condition stream) + (let* ((faultaddr (system-condition-address condition)) + (string (if (<= sb-vm:read-only-space-start + faultaddr + (sap-int (sap+ sb-vm:*read-only-space-free-pointer* -1))) + "Attempt to modify a read-only object at #x~X." + "Unhandled memory fault at #x~X."))) + (format stream string faultaddr))))) diff --git a/src/code/target-error.lisp b/src/code/target-error.lisp index 93ba86a826..d163b9b985 100644 --- a/src/code/target-error.lisp +++ b/src/code/target-error.lisp @@ -2373,12 +2373,6 @@ you did not expect to see this message, please report it." ((address :initarg :address :reader system-condition-address :initform nil) (context :initarg :context :reader system-condition-context :initform nil))) -(define-condition memory-fault-error (system-condition error) () - (:report - (lambda (condition stream) - (format stream "Unhandled memory fault at #x~X." - (system-condition-address condition))))) - (define-condition breakpoint-error (system-condition error) () (:report (lambda (condition stream) diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index 341f7a656a..1ffd661fe1 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -575,8 +575,4 @@ static inline boolean plausible_tag_p(lispobj addr) # define filler_total_nwords(header) ((header)>>N_WIDETAG_BITS) #endif -static inline boolean readonly_space_p(lispobj ptr) { - return ptr >= READ_ONLY_SPACE_START && (lispobj*)ptr < read_only_space_free_pointer; -} - #endif /* _GC_PRIVATE_H_ */ diff --git a/src/runtime/globals.h b/src/runtime/globals.h index 3811084ec9..15b90d8983 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -90,6 +90,10 @@ extern lispobj *current_binding_stack_pointer; extern lispobj *read_only_space_free_pointer; extern lispobj *static_space_free_pointer; +static inline boolean readonly_space_p(lispobj ptr) { + return ptr >= READ_ONLY_SPACE_START && (lispobj*)ptr < read_only_space_free_pointer; +} + #ifdef LISP_FEATURE_DARWIN_JIT lispobj *static_code_space_free_pointer; #endif diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 1c2ce25674..095575d66a 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -2063,6 +2063,10 @@ lisp_memory_fault_error(os_context_t *context, os_vm_address_t addr) /* If we lose on corruption, provide LDB with debugging information. */ fake_foreign_function_call(context); + /* If it's a store to read-only space, it's not "corruption", so don't say that. + * Lisp will change its wording of the memory-fault-error string */ + + if (!readonly_space_p((uword_t)addr)) { /* To allow debugging memory faults in signal handlers and such. */ #ifdef ARCH_HAS_STACK_POINTER char* pc = (char*)os_context_pc(context); @@ -2083,6 +2087,7 @@ lisp_memory_fault_error(os_context_t *context, os_vm_address_t addr) corruption_warning_and_maybe_lose("Memory fault at %p (pc=%p)", addr, (void*)os_context_pc(context)); #endif + } #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK /* Holy hell is this more obfuscated than necessary when using diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index 3edc26a74f..67af0c0eba 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -495,3 +495,17 @@ (loop for i from 10 to 24 do (assert (= (sb-sys:sap-ref-word sap (ash i sb-vm:word-shift))))))))) + +(with-test (:name :rospace-strings + :fails-on :darwin-jit) + ;; This is a subtle point, but even though NSTRING-UPCASE does not + ;; actually _need_ to change any character in the argument string, + ;; it tries to, and fails. You could make the feeble claim that the values being + ;; stored are not "new" as used in CLHS 3.7.1 + ;; "Storing a new value into some element of the array,". + ;; But what's the difference between storing a new value and a non-new value? + ;; Why is the word "new" even in that sentence? + (let ((err (handler-case (nstring-upcase (opaque-identity (symbol-name '*readtable*))) + (sb-sys:memory-fault-error (c) + (write-to-string c :escape nil))))) + (assert (search "modify a read-only object" err)))) From bc1df528d510361e19d564659b840e1f585889d9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 20 Jul 2022 10:47:01 -0400 Subject: [PATCH 3725/4023] Rename something. For the last time I hope. --- src/code/room.lisp | 2 +- src/compiler/generic/objdef.lisp | 9 +++++---- src/runtime/cheneygc.c | 2 +- src/runtime/coreparse.c | 2 +- src/runtime/fullcgc.c | 2 +- src/runtime/gc-common.c | 4 ++-- src/runtime/gc-internal.h | 2 +- src/runtime/immobile-space.c | 2 +- src/runtime/print.c | 2 +- src/runtime/traceroot.c | 6 +++--- src/runtime/verify.inc | 2 +- src/runtime/x86-64-arch.c | 2 +- 12 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/code/room.lisp b/src/code/room.lisp index 0cfc54d04f..6458f1033a 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -990,7 +990,7 @@ We could try a few things to mitigate this: ;; to enliven any object other than code. #+immobile-code `(%make-lisp-obj - (alien-funcall (extern-alien "fdefn_callee_lispobj" (function unsigned unsigned)) + (alien-funcall (extern-alien "decode_fdefn_rawfun" (function unsigned unsigned)) (logandc2 (get-lisp-obj-address ,obj) lowtag-mask)))) ,.(make-case* 'code-component `(loop for .i. from 2 below (code-header-words ,obj) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index eafe46494d..1d514450e0 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -218,11 +218,12 @@ during backtrace. ;; unless the function is non-simple, in which case ;; they store a descriptorized (fun-pointer lowtag) ;; pointer to the closure tramp - ;; - x86-64 with immobile-code feature stores a JMP instruction - ;; to the function entry address. Special considerations - ;; pertain to undefined functions, FINs, and closures. ;; - all others store a native pointer to the function entry address - ;; or closure tramp + ;; or closure tramp. x86-64 with immobile-code constrains this + ;; to holding the address of a SIMPLE-FUN or an object that + ;; has the simple-fun call convention- either a generic-function with + ;; a self-contained trampoline, or closure or funcallable-instance + ;; wrapped in a simplifying trampoline. (raw-addr :c-type "char *")) ;;; a simple function (as opposed to hairier things like closures diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index baa7395ddb..9f8153bc5d 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -562,7 +562,7 @@ verify_range(int purified, lispobj *base, lispobj *end) case FDEFN_WIDETAG: CHECK_PTR(where+1, where[1]); CHECK_PTR(where+2, where[2]); - CHECK_PTR(where+3, fdefn_callee_lispobj((struct fdefn*)where)); + CHECK_PTR(where+3, decode_fdefn_rawfun((struct fdefn*)where)); break; case CLOSURE_WIDETAG: case FUNCALLABLE_INSTANCE_WIDETAG: diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 5f99370bcf..d232f9abe9 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -1236,7 +1236,7 @@ static void graph_visit(lispobj __attribute__((unused)) referer, case FDEFN_WIDETAG: RECURSE(obj[1]); RECURSE(obj[2]); - RECURSE(fdefn_callee_lispobj((struct fdefn*)obj)); + RECURSE(decode_fdefn_rawfun((struct fdefn*)obj)); break; default: if (!leaf_obj_widetag_p(widetag_of(obj))) { diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 787e964018..3cadbf462c 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -421,7 +421,7 @@ static void trace_object(lispobj* where) return; #endif case FDEFN_WIDETAG: - gc_mark_obj(fdefn_callee_lispobj((struct fdefn*)where)); + gc_mark_obj(decode_fdefn_rawfun((struct fdefn*)where)); scan_to = 3; break; case WEAK_POINTER_WIDETAG: diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 526b5fb027..f596778d08 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1006,7 +1006,7 @@ static lispobj trans_bignum(lispobj object) } #ifndef LISP_FEATURE_X86_64 -lispobj fdefn_callee_lispobj(struct fdefn* fdefn) { +lispobj decode_fdefn_rawfun(struct fdefn* fdefn) { lispobj raw_addr = (lispobj)fdefn->raw_addr; if (!raw_addr || points_to_asm_code_p(raw_addr)) // technically this should return the address of the code object @@ -1021,7 +1021,7 @@ scav_fdefn(lispobj *where, lispobj __attribute__((unused)) object) { struct fdefn *fdefn = (struct fdefn *)where; scavenge(where + 1, 2); // 'name' and 'fun' - lispobj obj = fdefn_callee_lispobj(fdefn); + lispobj obj = decode_fdefn_rawfun(fdefn); lispobj new = obj; scavenge(&new, 1); if (new != obj) fdefn->raw_addr += (sword_t)(new - obj); diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index 624b3dd081..8e54b4db17 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -161,7 +161,7 @@ instance_scan(void (*proc)(lispobj*, sword_t, uword_t), extern int simple_fun_index(struct code*, struct simple_fun*); -extern lispobj fdefn_callee_lispobj(struct fdefn *fdefn); +extern lispobj decode_fdefn_rawfun(struct fdefn *fdefn); extern void gc_close_thread_regions(struct thread*); extern void gc_close_collector_regions(int); #endif /* _GC_INTERNAL_H_ */ diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 835465f94d..238700869a 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -747,7 +747,7 @@ fixedobj_points_to_younger_p(lispobj* obj, int n_words, switch (widetag_of(obj)) { case FDEFN_WIDETAG: - if (younger_p(fdefn_callee_lispobj((struct fdefn*)obj), gen, keep_gen, new_gen)) return 1; + if (younger_p(decode_fdefn_rawfun((struct fdefn*)obj), gen, keep_gen, new_gen)) return 1; break; // proceed to other slots as usual (harmlessly revisiting 'raw_addr') case CODE_HEADER_WIDETAG: // This is a simplifying trampoline around a closure or FIN. diff --git a/src/runtime/print.c b/src/runtime/print.c index b8faa9d011..893cf28129 100644 --- a/src/runtime/print.c +++ b/src/runtime/print.c @@ -724,7 +724,7 @@ static void print_fun_or_otherptr(lispobj obj) case FDEFN_WIDETAG: print_slots(fdefn_slots, 2, ptr); - print_obj("entry: ", fdefn_callee_lispobj((struct fdefn*)(ptr-1))); + print_obj("entry: ", decode_fdefn_rawfun((struct fdefn*)(ptr-1))); break; // Make some vectors printable from C, for when all hell breaks lose diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 745ffb8efd..b4a9ad44e5 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -184,7 +184,7 @@ static int find_ref(lispobj* source, lispobj target) scan_limit = code_header_words((struct code*)source); break; case FDEFN_WIDETAG: - check_ptr(3, fdefn_callee_lispobj((struct fdefn*)source)); + check_ptr(3, decode_fdefn_rawfun((struct fdefn*)source)); scan_limit = 3; break; } @@ -645,7 +645,7 @@ static lispobj trace1(lispobj object, case 3: if (lowtag_of(ptr) == OTHER_POINTER_LOWTAG && widetag_of(&FDEFN(ptr)->header) == FDEFN_WIDETAG) - target = fdefn_callee_lispobj((struct fdefn*)native_pointer(ptr)); + target = decode_fdefn_rawfun((struct fdefn*)native_pointer(ptr)); break; } target = canonical_obj(target); @@ -756,7 +756,7 @@ static uword_t build_refs(lispobj* where, lispobj* end, scan_limit = code_header_words((struct code*)where); break; case FDEFN_WIDETAG: - check_ptr(fdefn_callee_lispobj((struct fdefn*)where)); + check_ptr(decode_fdefn_rawfun((struct fdefn*)where)); scan_limit = 3; break; case SIMPLE_VECTOR_WIDETAG: diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index ad36fa43de..022ae01982 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -275,7 +275,7 @@ static int verify_headered_object(lispobj* object, sword_t nwords, struct fdefn* f = (void*)object; CHECK(f->name, &f->name); CHECK(f->fun, &f->fun); - CHECK(fdefn_callee_lispobj(f), (lispobj*)&f->raw_addr); + CHECK(decode_fdefn_rawfun(f), (lispobj*)&f->raw_addr); return 0; } for (i=1; i<nwords; ++i) CHECK(object[i], object+i); diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 84d2a188e9..74185bc4d8 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -592,7 +592,7 @@ arch_set_fp_modes(unsigned int mxcsr) /// (3) a code-component with no simple-fun within it, that makes /// closures and other funcallable-instances look like simple-funs. /// If the fdefn jumps to the UNDEFINED-FDEFN routine, then return 0. -lispobj fdefn_callee_lispobj(struct fdefn* fdefn) { +lispobj decode_fdefn_rawfun(struct fdefn* fdefn) { lispobj* raw_addr = (lispobj*)fdefn->raw_addr; if (!raw_addr || points_to_asm_code_p((lispobj)raw_addr)) // technically this should return the address of the code object From 8996722e7217685660794129c77612db1a6fcbf0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 20 Jul 2022 18:35:57 +0300 Subject: [PATCH 3726/4023] Fix a test. nstring-upcase doesn't actually modify the string. --- tests/gc.impure.lisp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index 67af0c0eba..d71bad4aeb 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -498,14 +498,7 @@ (with-test (:name :rospace-strings :fails-on :darwin-jit) - ;; This is a subtle point, but even though NSTRING-UPCASE does not - ;; actually _need_ to change any character in the argument string, - ;; it tries to, and fails. You could make the feeble claim that the values being - ;; stored are not "new" as used in CLHS 3.7.1 - ;; "Storing a new value into some element of the array,". - ;; But what's the difference between storing a new value and a non-new value? - ;; Why is the word "new" even in that sentence? - (let ((err (handler-case (nstring-upcase (opaque-identity (symbol-name '*readtable*))) - (sb-sys:memory-fault-error (c) - (write-to-string c :escape nil))))) + (let ((err (handler-case (setf (char (opaque-identity (symbol-name '*readtable*)) 0) #\*) + (sb-sys:memory-fault-error (c) + (write-to-string c :escape nil))))) (assert (search "modify a read-only object" err)))) From e4e9e70867e9003688f4c6c4156d16b3c3fe02aa Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 20 Jul 2022 19:20:17 +0300 Subject: [PATCH 3727/4023] Mark rospace-strings as failing on win32. It generates no memory fault. --- tests/gc.impure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index d71bad4aeb..9449994dde 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -497,7 +497,7 @@ (assert (= (sb-sys:sap-ref-word sap (ash i sb-vm:word-shift))))))))) (with-test (:name :rospace-strings - :fails-on :darwin-jit) + :fails-on (or :darwin-jit :win32)) (let ((err (handler-case (setf (char (opaque-identity (symbol-name '*readtable*)) 0) #\*) (sb-sys:memory-fault-error (c) (write-to-string c :escape nil))))) From 396af9eb903b58b0cccfc225ee3122748b6786f8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 20 Jul 2022 19:34:18 +0300 Subject: [PATCH 3728/4023] Fix nstring-case of latin-1 characters on -sb-unicode. base-char on -sb-unicode has more characters with cases than just a-z. --- src/code/string.lisp | 3 ++- tests/character.pure.lisp | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/code/string.lisp b/src/code/string.lisp index 57ee736773..dc25ac6278 100644 --- a/src/code/string.lisp +++ b/src/code/string.lisp @@ -657,7 +657,8 @@ new string COUNT long filled with the fill character." (t (with-one-string (string start end) (declare (optimize (sb-c:insert-array-bounds-checks 0))) - (cond ((simple-base-string-p string) + (cond #+sb-unicode + ((simple-base-string-p string) (do ((index start (1+ index))) ((>= index end)) (let ((char (char-code (schar string index)))) diff --git a/tests/character.pure.lisp b/tests/character.pure.lisp index 2827ca6c65..afc0b93885 100644 --- a/tests/character.pure.lisp +++ b/tests/character.pure.lisp @@ -178,3 +178,14 @@ (with-test (:name :name-char-short-string) (name-char "") (name-char "A")) + +(with-test (:name :char-case-latin-1-base-strings) + (let ((string (map-into (make-array 10 :element-type 'character :adjustable t) + #'code-char + '(192 193 194 195 196 197 198 199 200 201)))) + (assert (equal + (map 'list #'char-code (nstring-downcase string)) + '(224 225 226 227 228 229 230 231 232 233))) + (assert (equal + (map 'list #'char-code (string-upcase string)) + '(192 193 194 195 196 197 198 199 200 201))) )) From f25168a137f67e352caa82276859051877c84c18 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 20 Jul 2022 13:49:50 -0400 Subject: [PATCH 3729/4023] Repurpose the :PURIFY option Anticipating that some users may not want readonly strings --- NEWS | 2 ++ src/code/save.lisp | 19 +++++++------------ src/runtime/gencgc.c | 7 +++---- tests/save1.test.sh | 10 ++++++++++ 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/NEWS b/NEWS index d78a4755ab..a26ad2b41d 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,8 @@ changes relative to sbcl-2.2.6: * minor incompatible change: literal objects (strings, in particular) in compiled code may at the discretion of the runtime be placed in read-only memory. Violations of CLHS 3.7.1 could produce memory faults. + If ":PURIFY NIL" is given to SAVE-LISP-AND-DIE then no read-only memory + will be used. * enhancement: Unicode support has been updated to support version 10.0.0 of the Unicode standard, including addition of characters and refinements to breaking and collation algorithms. diff --git a/src/code/save.lisp b/src/code/save.lisp index e327e67912..bbe8069887 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -31,6 +31,7 @@ (define-alien-routine "gc_and_save" void (file c-string) (prepend-runtime int) + (purify int) (save-runtime-options int) (compressed int) (compression-level int) @@ -139,13 +140,10 @@ The following &KEY arguments are defined: :TOPLEVEL argument cannot be supplied. :PURIFY - If true (the default on cheneygc), do a purifying GC which moves all - dynamically allocated objects into static space. This takes - somewhat longer than the normal GC which is otherwise done, but - it's only done once, and subsequent GC's will be done less often - and will take less time in the resulting core file. See the PURIFY - function. This parameter has no effect on platforms using the - generational garbage collector. + If true (the default), then some objects in the restarted core will + be memory-mapped as read-only. Among those objects are numeric vectors + that were determined to be compile-time constants, and any immutable + values according to the language specification such as symbol names. :ROOT-STRUCTURES This should be a list of the main entry points in any newly loaded @@ -206,7 +204,7 @@ seem to be good quick fixes for either limitation and no one has been sufficiently motivated to do lengthy fixes." (declare (ignore environment-name)) #+gencgc - (declare (ignore purify) (ignorable root-structures)) + (declare (ignorable root-structures)) (when (and callable-exports toplevel-supplied) (error ":TOPLEVEL cannot be supplied when there are callable exports.")) ;; If the toplevel function is not defined, this will signal an @@ -234,10 +232,6 @@ sufficiently motivated to do lengthy fixes." :as-file t)) (startfun (start-lisp toplevel callable-exports))) (deinit) - ;; FIXME: Would it be possible to unmix the PURIFY logic from this - ;; function, and just do a GC :FULL T here? (Then if the user wanted - ;; a PURIFYed image, he'd just run PURIFY immediately before calling - ;; SAVE-LISP-AND-DIE.) #+gencgc (progn ;; Scan roots as close as possible to GC-AND-SAVE, in case anything @@ -260,6 +254,7 @@ sufficiently motivated to do lengthy fixes." ;; since the GC will invalidate the stack. (gc-and-save name (foreign-bool executable) + (foreign-bool purify) (foreign-bool save-runtime-options) (foreign-bool compression) (or compression 0) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 6bd0492061..04372ef1b8 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5399,8 +5399,7 @@ zero_all_free_ranges() /* called only by gc_and_save() */ #endif } -/* Things to do before doing a final GC before saving a core (without - * purify). +/* Things to do before doing a final GC before saving a core. * * + Single-object pages aren't moved by the GC, so we need to * unset that flag from all pages. @@ -5441,7 +5440,7 @@ extern void move_rospace_to_dynamic(int), prepare_readonly_space(int); /* Do a non-conservative GC, and then save a core with the initial * function being set to the value of 'lisp_init_function' */ void -gc_and_save(char *filename, boolean prepend_runtime, +gc_and_save(char *filename, boolean prepend_runtime, boolean purify, boolean save_runtime_options, boolean compressed, int compression_level, int application_type) { @@ -5544,7 +5543,7 @@ gc_and_save(char *filename, boolean prepend_runtime, // Do a non-moving collection so that orphaned strings that result // from coalescing STRING= symbol names do not consume read-only space. collect_garbage(1+PSEUDO_STATIC_GENERATION); - prepare_readonly_space(0); + if (purify) prepare_readonly_space(0); if (verbose) { printf("[performing final GC..."); fflush(stdout); } prepare_dynamic_space_for_final_gc(); save_lisp_gc_iteration = 2; diff --git a/tests/save1.test.sh b/tests/save1.test.sh index bcc1c012ed..892d4838a0 100644 --- a/tests/save1.test.sh +++ b/tests/save1.test.sh @@ -32,4 +32,14 @@ run_sbcl_with_core "$tmpcore" --noinform --no-userinit --no-sysinit --noprint \ EOF check_status_maybe_lose "Basic SAVE-LISP-AND-DIE" $? 21 "(saved core ran)" +run_sbcl <<EOF + (save-lisp-and-die "$tmpcore" :purify nil) +EOF +run_sbcl_with_core "$tmpcore" --noinform --no-userinit --no-sysinit --noprint <<EOF + #-darwin-jit + (unless (zerop (- (sb-sys:sap-int sb-vm:*read-only-space-free-pointer*) sb-vm:read-only-space-start)) + (exit :code 1)) +EOF +check_status_maybe_lose "SAVE-LISP-AND-DIE NOPURIFY" $? 0 "(unpurified core ran)" + exit $EXIT_TEST_WIN From b5482d0b973a2568917efae0bb43264e482d1b72 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 20 Jul 2022 15:06:26 -0400 Subject: [PATCH 3730/4023] Make one readonly page when :PURIFY is nil Should fix save1.test.sh but I didn't try it on win32 --- src/runtime/coreparse.c | 3 ++- src/runtime/gencgc.c | 4 ++-- src/runtime/stringspace.c | 17 +++++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index d232f9abe9..7a833db157 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -628,7 +628,8 @@ void calc_asm_routine_bounds() #elif defined LISP_FEATURE_IMMOBILE_CODE asm_routines_start = VARYOBJ_SPACE_START; #else - if (widetag_of((lispobj*)READ_ONLY_SPACE_START) == CODE_HEADER_WIDETAG) { + if ((uword_t)read_only_space_free_pointer > READ_ONLY_SPACE_START && + widetag_of((lispobj*)READ_ONLY_SPACE_START) == CODE_HEADER_WIDETAG) { asm_routines_start = READ_ONLY_SPACE_START; } else { lispobj *where = (lispobj*)STATIC_SPACE_OBJECTS_START; diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 04372ef1b8..823ca57d3b 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5435,7 +5435,7 @@ static void prepare_dynamic_space_for_final_gc() * plus literal strings in code compiled to memory. */ char gc_coalesce_string_literals = 0; -extern void move_rospace_to_dynamic(int), prepare_readonly_space(int); +extern void move_rospace_to_dynamic(int), prepare_readonly_space(int,int); /* Do a non-conservative GC, and then save a core with the initial * function being set to the value of 'lisp_init_function' */ @@ -5543,7 +5543,7 @@ gc_and_save(char *filename, boolean prepend_runtime, boolean purify, // Do a non-moving collection so that orphaned strings that result // from coalescing STRING= symbol names do not consume read-only space. collect_garbage(1+PSEUDO_STATIC_GENERATION); - if (purify) prepare_readonly_space(0); + prepare_readonly_space(purify, 0); if (verbose) { printf("[performing final GC..."); fflush(stdout); } prepare_dynamic_space_for_final_gc(); save_lisp_gc_iteration = 2; diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index 010f1761bc..762df3cd9c 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -20,7 +20,8 @@ #ifdef LISP_FEATURE_DARWIN_JIT -void prepare_readonly_space(__attribute__((unused)) int print) {} +void prepare_readonly_space(__attribute__((unused)) int purify, + __attribute__((unused)) int print) {} void move_rospace_to_dynamic(__attribute__((unused)) int print) {} #else @@ -176,9 +177,21 @@ static void insert_filler(lispobj* obj, __attribute__((unused)) uword_t arg) { } } -void prepare_readonly_space(int print) +void prepare_readonly_space(int purify, int print) { gc_assert((uword_t)read_only_space_free_pointer == READ_ONLY_SPACE_START); + if (!purify) { + // I guess some of the architectures need a readonly page now because reasons, + // even though we're somewhat more careful in coreparse to avoid reading memory + // at READ_ONLY_SPACE_START if the free_pointer isn't higher than the start. + int string_space_size = BACKEND_PAGE_BYTES; + READ_ONLY_SPACE_START = + (uword_t)os_validate(MOVABLE, (char*)DYNAMIC_SPACE_START - string_space_size, + string_space_size, 0, 0); + READ_ONLY_SPACE_END = READ_ONLY_SPACE_START + string_space_size; + read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; + return; + } int sum_sizes = 2; // 1. Sum of the sizes of immutable objects, which can only be in dynamic space if (print) fprintf(stderr, "purify: calculating size ... "); From 00a1bf00545cd523dd52c1388646def1e8c0867c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 20 Jul 2022 15:38:19 -0400 Subject: [PATCH 3731/4023] Show more in "interrupt already pending" --- src/runtime/backtrace.c | 2 +- src/runtime/interrupt.c | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 7359ab1f22..9a64e3c204 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -130,7 +130,7 @@ lispobj symbol_package(struct symbol* s) // End-users should never see this failure. if (!lisp_package_vector) { if (!warned) { - fprintf(stderr, "Warning: package vector has not been initialized yet\n"); + fprintf(stderr, "Warning: lisp package array is not initialized for C\n"); warned = 1; } return NIL; diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 095575d66a..805e85b797 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1324,6 +1324,25 @@ store_signal_data_for_later (struct interrupt_data *data, void *handler, sigaddset_deferrable(os_context_sigmask_addr(context)); } +/* What's going on ? + * + * 0: fp=0x7fa86423e7a0 pc=0x27608c Foreign function (null) + * 1: fp=0x7fa86423e7b0 pc=0x2767aa Foreign function (null) + * 2: fp=0x7fa86423e890 pc=0x2761af Foreign function (null) + * 3: fp=0x7fa86423e970 pc=0x27882f Foreign function (null) ; maybe_now_maybe_later + * 4: fp=0x7fa86423f5c0 pc=0x7fa8646bc750 Foreign function (null) ; WHICH SIGNAL ? + * 5: fp=0x7fa86423f630 pc=0x2713ce Foreign function (null) ; verify_range + * 6: fp=0x7fa86423f6c0 pc=0x2703d3 Foreign function (null) ; verify_heap + * 7: fp=0x7fa86423f780 pc=0x26e168 Foreign function collect_garbage + * 8: fp=0x7fa86423f7f0 pc=0x270298 Foreign function gc_and_save + * 9: fp=0x7fa86423f848 pc=0x52f93bf2 <??? type 45>::GC-AND-SAVE + * 10: fp=0x7fa86423f950 pc=0x52d32a7b <??? type 45>::SAVE-LISP-AND-DIE + * 11: fp=0x7fa86423fa00 pc=0x52a34179 <??? type 45>::SAVE-LISP-AND-DIE + * + * fatal error encountered in SBCL pid 9436 tid 9436: + * interrupt already pending + */ + static boolean can_handle_now(void *handler, struct interrupt_data *data, int signal, siginfo_t *info, os_context_t *context) @@ -1337,7 +1356,8 @@ can_handle_now(void *handler, struct interrupt_data *data, struct thread *thread = get_sb_vm_thread(); if (read_TLS(INTERRUPT_PENDING,thread) != NIL) - lose("interrupt already pending"); + lose("interrupt already pending when sig%d received, pc=%p", signal, + (void*)os_context_pc(context)); if (thread_interrupt_data(thread).pending_handler) lose("there is a pending handler already (PA)"); if (data->gc_blocked_deferrables) From 429f66fe000bc5a1d3647af54b1012a201738fd4 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 21 Jul 2022 19:25:25 +0300 Subject: [PATCH 3732/4023] arm64, dynbind: add :target for an arg. And reuse a register. --- src/compiler/arm64/cell.lisp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 465750d71b..6f9ca8a505 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -380,8 +380,8 @@ (symbol :scs (descriptor-reg) :load-if (not (and (sc-is symbol constant) (or (symbol-always-has-tls-value-p (tn-value symbol)) - (symbol-always-has-tls-index-p (tn-value symbol))))))) - (:temporary (:sc descriptor-reg) value-temp) + (symbol-always-has-tls-index-p (tn-value symbol))))) + :target alloc-tls-symbol)) (:temporary (:sc descriptor-reg :offset r8-offset :from (:argument 1)) alloc-tls-symbol) (:temporary (:sc non-descriptor-reg :offset nl0-offset) tls-index) (:temporary (:sc non-descriptor-reg :offset nl1-offset) free-tls-index) @@ -408,8 +408,8 @@ (load-inline-constant lr '(:fixup alloc-tls-index :assembly-routine)) (inst blr lr))) TLS-INDEX-VALID - (inst ldr value-temp (@ thread-tn tls-index)) - (inst stp value-temp tls-index-reg + (inst ldr alloc-tls-symbol (@ thread-tn tls-index)) + (inst stp alloc-tls-symbol tls-index-reg (@ bsp (* (- binding-value-slot binding-size) n-word-bytes))) (inst str value (@ thread-tn tls-index)))))) From d7660d1853dcfabd7d184dea7e6491a8f0269a97 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 21 Jul 2022 19:33:16 +0300 Subject: [PATCH 3733/4023] Replace darwin-jit in a test. As it's not available in *features* --- tests/save1.test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/save1.test.sh b/tests/save1.test.sh index 892d4838a0..59e6481919 100644 --- a/tests/save1.test.sh +++ b/tests/save1.test.sh @@ -36,7 +36,7 @@ run_sbcl <<EOF (save-lisp-and-die "$tmpcore" :purify nil) EOF run_sbcl_with_core "$tmpcore" --noinform --no-userinit --no-sysinit --noprint <<EOF - #-darwin-jit + #-(and darwin arm64) ;; darwin-jit (unless (zerop (- (sb-sys:sap-int sb-vm:*read-only-space-free-pointer*) sb-vm:read-only-space-start)) (exit :code 1)) EOF From f3ae6c0f2a0053afd8ade68e232b019563741809 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Thu, 21 Jul 2022 21:04:12 +0100 Subject: [PATCH 3734/4023] NEWS for sbcl-2.2.7 freeze --- NEWS | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/NEWS b/NEWS index a26ad2b41d..9f5ecf8dab 100644 --- a/NEWS +++ b/NEWS @@ -15,7 +15,17 @@ changes relative to sbcl-2.2.6: * enhancement: Unicode support has been updated to support version 10.0.0 of the Unicode standard, including addition of characters and refinements to breaking and collation algorithms. + * bug fix: AVX is no longer used for loading simd-pack-256 constants. + (lp#1928097) + * bug fix: fix building the manual when some contribs are blocked or + otherwise disabled. (lp#1979821, thanks to Robert Schiele) + * bug fix: fix type derivation of sequence functions with highly-specific + declared argument types. (lp#1980292, reported by James Kalenius) + * bug fix: internal error when optimizing chains of conditionals in local + functions. (lp#1981607, reported by Pasha K) * optimization: faster TRUNCATE with float arguments. + * optimization: SXHASH on large floating point values should generate less + garbage. changes in sbcl-2.2.6 relative to sbcl-2.2.5: * minor incompatible change: support for 32-bit x86 on macOS has been From dd81423f5adae721ea6fd9febd11a1aa6c311900 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 22 Jul 2022 15:50:35 +0300 Subject: [PATCH 3735/4023] Fix compiling grovel-headers when CFLAGS contains -I. Just override CFLAGS without appending to it. Fixes lp#1981799 --- tools-for-build/Makefile | 9 +++------ tools-for-build/grovel-features.sh | 2 -- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/tools-for-build/Makefile b/tools-for-build/Makefile index 4c4355b4b7..24fc860780 100644 --- a/tools-for-build/Makefile +++ b/tools-for-build/Makefile @@ -7,14 +7,11 @@ # provided with absolutely no warranty. See the COPYING and CREDITS # files for more information. -# it is illogical that this makefile pulls in Makefile.features, -# which is presumed not to exist, and which when it does exist causes -# confusion as to what flags should be added in for a generic C compile. -# Why do we do this??? --include genesis/Makefile.features +-include genesis/Makefile.features # for grovel-headers -include Config -CPPFLAGS+=-I../src/runtime +# Do not append to CFLAGS otherwise -I can override the -I below. +CFLAGS:=-I../src/runtime LDFLAGS:=$(LDFLAGS) LDLIBS:=$(OS_LIBS) diff --git a/tools-for-build/grovel-features.sh b/tools-for-build/grovel-features.sh index 07d4928160..73925d9ddd 100644 --- a/tools-for-build/grovel-features.sh +++ b/tools-for-build/grovel-features.sh @@ -28,8 +28,6 @@ if [ "$sbcl_os" = win32 ] ; then LOADLIBES=-lSynchronization featurep os-provides-wakebyaddr sb-futex fi -# KLUDGE: ppc/darwin dlopen is special cased in make-config.sh, as -# we fake it with a shim. featurep os-provides-dlopen featurep os-provides-dladdr From 2276431f7486b9fa8eab9abc3a9fd705845a6344 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 22 Jul 2022 16:24:44 +0300 Subject: [PATCH 3736/4023] Fix compiling grovel-headers on linux. Which needs -D_LARGEFILE_SOURCE in CFLAGS. --- tools-for-build/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools-for-build/Makefile b/tools-for-build/Makefile index 24fc860780..b5a123603f 100644 --- a/tools-for-build/Makefile +++ b/tools-for-build/Makefile @@ -11,7 +11,7 @@ -include Config # Do not append to CFLAGS otherwise -I can override the -I below. -CFLAGS:=-I../src/runtime +CFLAGS:=-I../src/runtime $(CFLAGS) LDFLAGS:=$(LDFLAGS) LDLIBS:=$(OS_LIBS) From 665e2b8f67ba40be5b00e998e22bfc6dd404bad0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 22 Jul 2022 09:47:30 -0400 Subject: [PATCH 3737/4023] Remove untested+untestable disabled logic We don't have a way to build with 2^N variations on CFLAGS and that's even supposing that ELF cores are tested at all. --- src/runtime/immobile-space.c | 91 ------------------------------------ 1 file changed, 91 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 238700869a..c8fb70b88a 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -68,7 +68,6 @@ // In case of problems while debugging, this is selectable. #define DEFRAGMENT_FIXEDOBJ_SUBSPACE 1 -#define WRITABLE_TEXT_SEGMENT 0 #undef DEBUG #undef VERIFY_PAGE_GENS @@ -1728,23 +1727,6 @@ static int calc_n_fixedobj_pages(int n_objects, int words_per_object) return (n_objects + objects_per_page - 1) / objects_per_page; } -#if WRITABLE_TEXT_SEGMENT -static int calc_n_varyobj_pages(int n_objects, int words_per_object) -{ - words_per_object = ALIGN_UP(words_per_object, 2); - int objects_per_page = WORDS_PER_PAGE / words_per_object; - // varyobj space can't have unused bytes, but filler objects - // require at least 4 words. So if there are only 2 words - // of trailing fluff, cut out one object. - // This could be improved by using 'filler' type object (not code) - // which stores the length in the header word, leaving one word - // available in which to store a pointer to the next filler object. - if (WORDS_PER_PAGE - (words_per_object * objects_per_page) == 2) - --objects_per_page; - return (n_objects + objects_per_page - 1) / objects_per_page; -} -#endif - /// Copy a fixed-size object somewhere. "somewhere" could be either a fixed- /// or variable-sized object page. The new copy never crosses page boundaries. /// The original object may reside in either varyobj or fixedobj space. @@ -1764,25 +1746,7 @@ static void place_fixedobj(lispobj* obj, int size_in_bytes, // compute space remaining, possibly negative, // if this object were placed on the page. int space_avail = (page_end - new) - size_in_bytes; -#if WRITABLE_TEXT_SEGMENT - // Padding consideration is different when moving onto a variable-sized - // object page. - if (widetag == FDEFN_WIDETAG || widetag == CODE_HEADER_WIDETAG - || widetag == FUNCALLABLE_INSTANCE_WIDETAG) { - // transporting into varyobj space. - // since filler objects occupy >= 4 words, consider the page - // to be overfull if exactly 2 words would remain. - if (space_avail < 0 || space_avail == 2*N_WORD_BYTES) { - make_filler(tempspace_addr(new), page_end - new); - new = page_end; - } - } else { - if (space_avail < 0) - new = page_end; - } -#else if (space_avail < 0) new = page_end; -#endif gc_assert(!*tempspace_addr(new)); // better not clobber some other object memcpy(tempspace_addr(new), obj, size_in_bytes); set_forwarding_pointer(obj, make_lispobj(new, LOWTAG_FOR_WIDETAG(widetag))); @@ -1844,12 +1808,6 @@ static void place_layout(lispobj* obj, layout_size_class_nwords(size_class_index) << WORD_SHIFT; } -static void __attribute__((unused)) add_filler_if_needed(char* from, char* to) -{ - if (to>from) - make_filler(tempspace_addr(from), to-from); -} - static boolean executable_object_p(lispobj* obj) { int widetag = widetag_of(obj); @@ -1859,9 +1817,7 @@ static boolean executable_object_p(lispobj* obj) * to the original closure or funcallable instance */ && lowtag_of(((struct code*)obj)->debug_info) == FUN_POINTER_LOWTAG) || widetag == FUNCALLABLE_INSTANCE_WIDETAG; -#if !WRITABLE_TEXT_SEGMENT gc_assert(!answer); -#endif return answer; } @@ -1952,10 +1908,6 @@ static void defrag_immobile_space(boolean verbose) symbol_alloc_ptrs[i+1] = symbol_alloc_ptrs[i] + calc_n_fixedobj_pages( sym_kind_histo[i].count, sym_kind_histo[i].size) * IMMOBILE_CARD_BYTES; -#if WRITABLE_TEXT_SEGMENT - fixedobj_tempspace.n_bytes = - symbol_alloc_ptrs[N_SYMBOL_KINDS] - (char*)FIXEDOBJ_SPACE_START; -#else int n_fdefn_pages = calc_n_fixedobj_pages(obj_type_histo[FDEFN_WIDETAG/4], FDEFN_SIZE); int n_tramp_pages = calc_n_fixedobj_pages(obj_type_histo[CODE_HEADER_WIDETAG/4], FUN_TRAMP_SIZE); int n_gf_pages = calc_n_fixedobj_pages(obj_type_histo[FUNCALLABLE_INSTANCE_WIDETAG/4], GF_SIZE); @@ -1964,7 +1916,6 @@ static void defrag_immobile_space(boolean verbose) char* gf_alloc_ptr = tramp_alloc_ptr + n_tramp_pages * IMMOBILE_CARD_BYTES; fixedobj_tempspace.n_bytes = gf_alloc_ptr + n_gf_pages * IMMOBILE_CARD_BYTES - (char*)FIXEDOBJ_SPACE_START; -#endif fixedobj_tempspace.start = calloc(fixedobj_tempspace.n_bytes, 1); // Copy pages below the defrag base into the temporary copy. @@ -2009,26 +1960,7 @@ static void defrag_immobile_space(boolean verbose) if (aligned_nbytes - n_code_bytes == 2 * N_WORD_BYTES) // waste another page because it can't be a 2-word filler aligned_nbytes += IMMOBILE_CARD_BYTES; -#if WRITABLE_TEXT_SEGMENT - char* fdefn_alloc_ptr = (char*)VARYOBJ_SPACE_START + aligned_nbytes; - - int n_fdefn_pages = - calc_n_varyobj_pages(obj_type_histo[FDEFN_WIDETAG/4], - FDEFN_SIZE); - int n_gf_pages = - calc_n_varyobj_pages(obj_type_histo[FUNCALLABLE_INSTANCE_WIDETAG/4], - GF_SIZE); - int n_tramp_pages = - calc_n_varyobj_pages(obj_type_histo[CODE_HEADER_WIDETAG/4], - FUN_TRAMP_SIZE); - - char* tramp_alloc_ptr = fdefn_alloc_ptr + n_fdefn_pages * IMMOBILE_CARD_BYTES; - char* gf_alloc_ptr = tramp_alloc_ptr + n_tramp_pages * IMMOBILE_CARD_BYTES; - varyobj_tempspace.n_bytes = - = gf_alloc_ptr + n_gf_pages * IMMOBILE_CARD_BYTES - (char*)VARYOBJ_SPACE_START; -#else varyobj_tempspace.n_bytes = aligned_nbytes; -#endif varyobj_tempspace.start = calloc(varyobj_tempspace.n_bytes, 1); if (verbose) @@ -2091,24 +2023,6 @@ static void defrag_immobile_space(boolean verbose) alloc_ptrs[CODE_HEADER_WIDETAG/4] = tramp_alloc_ptr; alloc_ptrs[FUNCALLABLE_INSTANCE_WIDETAG/4] = gf_alloc_ptr; -#if WRITABLE_TEXT_SEGMENT - // Copy fixed-sized objects that were already in code space - // to a possibly new address in code space. - obj = (lispobj*)VARYOBJ_SPACE_START; - while (obj < varyobj_free_pointer) { - // Use the forwarded object if forwarded, because the header was stomped on. - // This handles the code objects that were already forwarded. - lispobj* fwdobj = - forwarding_pointer_p(obj) ? - tempspace_addr(native_pointer(forwarding_pointer_value(obj))) : obj; - // Sizing a forwarded object is OK here - code size can't change when copied. - int size = headerobj_size(fwdobj); - // Supplying symbol_kind as 0 is fine - symbols can't exist in code space. - if (executable_object_p(fwdobj)) - place_fixedobj(obj, size << WORD_SHIFT, alloc_ptrs, 0); - obj += size; - } -#endif // Permute fixed-sized object pages and deposit forwarding pointers. for ( page_index = find_fixedobj_page_index(defrag_base) ; page_index <= max_used_fixedobj_page ; ++page_index) { @@ -2126,11 +2040,6 @@ static void defrag_immobile_space(boolean verbose) } } while (NEXT_FIXEDOBJ(obj, obj_spacing) <= limit); } -#if WRITABLE_TEXT_SEGMENT - // Might require filler between inter-object-type gaps - add_filler_if_needed(alloc_ptrs[FDEFN_WIDETAG/4], tramp_alloc_ptr); - add_filler_if_needed(alloc_ptrs[CODE_HEADER_WIDETAG/4], gf_alloc_ptr); -#endif #endif /* DEFRAGMENT_FIXEDOBJ_SUBSPACE */ if (immobile_space_reloc_index) { From 5a01b59ecf20d635614f17b86bf8a2a2e017ed6b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 22 Jul 2022 11:12:10 -0400 Subject: [PATCH 3738/4023] Add noise to avoid noise, I guess? when compiling standalone ldb --- src/runtime/monitor.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 12d9cf25d6..90588837eb 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -773,18 +773,24 @@ void gc_start_the_world() { } // do nothing struct lisp_startup_options lisp_startup_options; void unwind_binding_stack() { lose("Can't unwind binding stack"); } -FILE *prepare_to_save(char *filename, boolean prepend_runtime, void **runtime_bytes, - size_t *runtime_size) { +FILE *prepare_to_save(__attribute__((unused)) char *filename, + __attribute__((unused)) boolean prepend_runtime, + __attribute__((unused)) void **runtime_bytes, + __attribute__((unused)) size_t *runtime_size) { lose("Can't prepare_to_save"); } -boolean save_runtime_to_filehandle(FILE *output, void *runtime, size_t runtime_size, - int application_type) { +boolean save_runtime_to_filehandle(__attribute__((unused)) FILE *output, + __attribute__((unused)) void *runtime, + __attribute__((unused)) size_t runtime_size, + __attribute__((unused)) int application_type) { lose("Can't save_runtime_to_filehandle"); } -boolean save_to_filehandle(FILE *file, char *filename, lispobj init_function, - boolean make_executable, - boolean save_runtime_options, - int core_compression_level) { +boolean save_to_filehandle(__attribute__((unused)) FILE *file, + __attribute__((unused)) char *filename, + __attribute__((unused)) lispobj init_function, + __attribute__((unused)) boolean make_executable, + __attribute__((unused)) boolean save_runtime_options, + __attribute__((unused)) int core_compression_level) { lose("Can't save_to_filehandle"); } From 165aaeed4597d09b03a7acd1e57ea04bfb09cf70 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 22 Jul 2022 17:24:02 -0400 Subject: [PATCH 3739/4023] Fix allocation-information.6 failure I don't remember exactly why it got disabled in fc56dd0e82 but I found two potential problems: 32-bit could allocate large code to ordinary (non-large) pages, and code with 0 boxed words is considered page-filler. --- contrib/sb-introspect/test-driver.lisp | 45 +++++++++++++++----------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/contrib/sb-introspect/test-driver.lisp b/contrib/sb-introspect/test-driver.lisp index 5b8ef87978..e0fb8670ad 100644 --- a/contrib/sb-introspect/test-driver.lisp +++ b/contrib/sb-introspect/test-driver.lisp @@ -440,30 +440,39 @@ (= (getf props :page) page) (= (getf props :generation) gen) (eq (getf props :boxed :missing) boxedp)))) + +(defun alloc-large-code () + ;; large objets have to have to be at least 4 GC pages + (let ((bytes (* 4 sb-vm:gencgc-page-bytes))) + ;; For 32-bit in order to force allocation into a large-object page, the currently + ;; open code region has to be closed. Otherwise the allocation might fit in the region. + #-64-bit + (sb-alien:alien-funcall + (sb-alien:extern-alien "gc_close_region" + (function sb-alien:void sb-alien:unsigned sb-alien:unsigned)) + (+ (* 3 3 sb-vm:n-word-bytes) ; KLUDGE: a region is 3 words, and code_region + ; is the third in the array of regions + (sb-sys:find-dynamic-foreign-symbol-address "gc_alloc_region")) + 7) ; KLUDGE: PAGE_TYPE_CODE + ;; A legal code object needs >= 4 boxed words. Let's use 8 + (let ((object (sb-c:allocate-code-object nil 8 (- bytes (* 8 sb-vm:n-word-bytes))))) + (setq *large-obj* object) + ;; assert that it's large, otherwise the entire test is bogus + (let ((props (nth-value 1 (allocation-information object)))) + (assert (getf props :large))) + object))) +(compile 'alloc-large-code) + #+gencgc -(deftest* (allocation-information.6 :fails-on :sbcl) +(deftest* (allocation-information.6) ;; Remember, all tests run after all toplevel forms have executed, ;; so if this were (DEFGLOBAL *LARGE-CODE* ... ) or something, ;; the garbage collection explicitly requested for ALLOCATION-INFORMATION.5 ;; would have already happened, and thus affected this test as well. ;; So we need to make the objects within each test, ;; while avoiding use of lexical vars that would cause conservative pinning. - (multiple-value-bind (page gen) - (page-and-gen - (setq *large-obj* - ;; To get a large-object page, a code object has to exceed - ;; LARGE_OBJECT_SIZE and not fit within an open region. - ;; (This is a minor bug, because one should be able to - ;; create regions as large as desired without affecting - ;; determination of whether an object is large. - ;; Practically it means is that a small object region - ;; is limited to at most 3 pages) - ;; 32-bit machines use 64K for code allocation regions, - ;; but the large object size can be as small as 16K. - ;; 16K might fit in the free space of an open region, - ;; and by accident would not go on a large object page. - (sb-c:allocate-code-object nil 0 - (max (* 4 sb-vm:gencgc-page-bytes) #-64-bit 65536)))) + (multiple-value-bind (page gen) (page-and-gen (alloc-large-code)) + (declare (ignorable gen)) (declare (notinline format)) (format (make-string-output-stream) "~%") (loop for i from 1 to sb-vm:+highest-normal-generation+ @@ -479,7 +488,7 @@ (deftest allocation-information.7 (locally (declare (notinline format)) - ;; Create a bignum using 4 GC cards + ;; Create a bignum using 4 GC pages (setq *b* (ash 1 (* sb-vm:gencgc-page-bytes sb-vm:n-byte-bits 4))) (setq *negb* (- *b*)) (and (let ((props (get-small-bignum-allocation-information))) From d85fd01a170f0090bc9aa43f2d19fa6a60395ef7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 23 Jul 2022 21:12:24 -0400 Subject: [PATCH 3740/4023] Fix hide-packages test if configured with xref-for-internals --- src/code/cold-init.lisp | 2 +- src/code/share-vm.lisp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index 7bbbb12dd6..bf3d86d5e6 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -409,7 +409,7 @@ process to continue normally." (sb-debug::disable-debugger)) (call-hooks "initialization" *init-hooks*) #+sb-thread (finalizer-thread-start) - (sb-vm::setup-cpu-specific-routines)) + (sb-vm::!setup-cpu-specific-routines)) ;;;; some support for any hapless wretches who end up debugging cold ;;;; init code diff --git a/src/code/share-vm.lisp b/src/code/share-vm.lisp index 6dd9824a1e..4b1e225d22 100644 --- a/src/code/share-vm.lisp +++ b/src/code/share-vm.lisp @@ -169,12 +169,12 @@ (defvar *previous-cpu-routines* nil) -(defmacro setup-cpu-specific-routines () +(defmacro !setup-cpu-specific-routines () `(progn ,@(loop for (feature detect) on *cpu-features* by #'cddr collect `(when ,detect - (loop for (fdefn definition) on ,(package-symbolicate :sb-vm '+ feature '-routines+) + (loop for (fdefn definition) on ,(package-symbolicate "SB-VM" '+ feature '-routines+) by #'cddr do (push (cons fdefn (fdefn-fun fdefn)) From dd3d6ab140a80072c50102a94b02a5db0630b4cf Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 24 Jul 2022 16:36:12 -0400 Subject: [PATCH 3741/4023] Use CPPFLAGS in 'make' recipe for standalone ldb --- src/runtime/GNUmakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index a64b493a84..f53a211717 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -94,8 +94,8 @@ targets: $(TARGET) $(OBJTARGET) sbcl.mk LDB_OBJS = $(filter-out main.o runtime.o monitor.o save.o thread.o,$(OBJS)) ldb: $(LIBSBCL) - $(CC) -g $(CFLAGS) -DSTANDALONE_LDB -I. -c -o standalone-monitor.o monitor.c - $(CC) -g $(CFLAGS) -DSTANDALONE_LDB -I. -c -o standalone-thread.o thread.c + $(CC) -g $(CPPFLAGS) $(CFLAGS) -DSTANDALONE_LDB -c -o standalone-monitor.o monitor.c + $(CC) -g $(CPPFLAGS) $(CFLAGS) -DSTANDALONE_LDB -c -o standalone-thread.o thread.c $(CC) $(LINKFLAGS) -o ldb standalone-monitor.o standalone-thread.o $(LDB_OBJS) $(LIBS) $(TARGET): $(LIBSBCL) From 3932e6249b181c6fe54994e14afcead3a59955f6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 25 Jul 2022 23:17:43 +0300 Subject: [PATCH 3742/4023] Add a test for logand type derivation. --- tests/arith.pure.lisp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index 463b1a654f..67943f9573 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -1098,3 +1098,12 @@ (logtest (- (expt 2 63) 3) (the fixnum x))) ((1) t) ((2) nil))) + +(with-test (:name :logand-negative-derive) + (assert + (subtypep (second (third (sb-kernel:%simple-fun-type + (checked-compile + `(lambda (a b) + (declare ((not unsigned-byte) a b)) + (logand a b)))))) + '(integer * -1)))) From 67d810361ce0d32c052e5a693c7d20596e727e32 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 25 Jul 2022 20:11:04 -0400 Subject: [PATCH 3743/4023] Fix warning --- src/runtime/gencgc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 823ca57d3b..73dede7ad4 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -383,7 +383,7 @@ extern void fpu_restore(void *); #define PAGE_INDEX_FMT PRIdPTR -int count_immobile_objects(int gen, int res[5]) +int count_immobile_objects(__attribute__((unused)) int gen, int res[5]) { #ifdef LISP_FEATURE_IMMOBILE_SPACE lispobj* where = (lispobj*)FIXEDOBJ_SPACE_START; From 3572c413a2ef28c1dfe68dea9a22bdc71544df6c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 26 Jul 2022 22:44:57 -0400 Subject: [PATCH 3744/4023] Be consistent in use of AVER --- src/compiler/generic/genesis.lisp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a92e945639..12b6e7e877 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -373,7 +373,7 @@ ;;; at a lower address. #+metaspace (defun allocate-metaspace-layout (gspace nbytes) - (assert (= nbytes (* 8 sb-vm:n-word-bytes))) + (aver (= nbytes (* 8 sb-vm:n-word-bytes))) (let ((slab (gspace-current-slab gspace))) (flet ((init (slab) (let ((bytes-avail (- sb-vm:metaspace-slab-size @@ -455,7 +455,7 @@ for pte = (pte page-index) do (if (null (page-type pte)) (setf (page-type pte) page-type) - (assert (eq (page-type pte) page-type)))))) + (aver (eq (page-type pte) page-type)))))) (note-words-used (start-word-index) (let* ((start-page (page-index start-word-index)) (end-word-index (+ start-word-index n-words)) @@ -701,7 +701,7 @@ ;; In immobile space, all objects start life as pseudo-static as if by 'save'. (let* ((gen (or #+immobile-space (let ((gspace (descriptor-intuit-gspace des))) - (assert gspace) + (aver gspace) (when (or (eq gspace *immobile-fixedobj*) (eq gspace *immobile-varyobj*)) sb-vm:+pseudo-static-generation+)) @@ -904,7 +904,7 @@ core and return a descriptor to it." (write-wordindexed/raw handle 0 (logior (ash words 8) sb-vm:bignum-widetag)) handle))) (integer-bits-to-core n handle sb-vm:bignum-digits-offset words) - (assert (= (bignum-from-core handle) n)) + (aver (= (bignum-from-core handle) n)) handle)) (defun bignum-from-core (descriptor) @@ -1434,8 +1434,7 @@ core and return a descriptor to it." ;; Check that the number of specified INHERITS matches ;; the length of the layout's inherits in the cross-compiler. (let ((wrapper (info :type :compiler-layout name))) - (assert (eql (length (wrapper-inherits wrapper)) - (length inherits))) + (aver (eql (length (wrapper-inherits wrapper)) (length inherits))) (->wrapper (make-cold-layout name (wrapper-depthoid wrapper) @@ -2900,8 +2899,7 @@ Legal values for OFFSET are -4, -8, -12, ..." #+immobile-space ;; Must be a multiple of 32 because it makes the math a nicer ;; when computing word and bit index into the 'touched' bitmap. - (assert (zerop (rem sb-vm:fixedobj-space-size - (* 32 sb-vm:immobile-card-bytes)))) + (aver (zerop (rem sb-vm:fixedobj-space-size (* 32 sb-vm:immobile-card-bytes)))) #-gencgc (check sb-vm:dynamic-0-space-start sb-vm:dynamic-0-space-end :dynamic-0) (check sb-vm:linkage-table-space-start sb-vm:linkage-table-space-end :linkage-table)))) @@ -3881,7 +3879,7 @@ III. initially undefined function references (alphabetically): (let ((files (remove-if-not #'assembler-file-p object-file-names))) ;; There should be exactly 1 assembler file, and 1 code object in it. (when files ; But it's present only in 2nd genesis. - (assert (singleton-p files)) + (aver (singleton-p files)) (cold-load (car files) verbose))) (setf object-file-names (remove-if #'assembler-file-p object-file-names))) (mapc 'funcall *deferred-undefined-tramp-refs*) From ad868c183329c61eed8dc470ea6703d40ba40d77 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 26 Jul 2022 23:45:46 -0400 Subject: [PATCH 3745/4023] win32: Fix rospace-strings test --- src/runtime/win32-os.c | 8 +++++++- tests/gc.impure.lisp | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 8f44003c71..7c14d4d2ff 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -838,10 +838,12 @@ os_invalidate(os_vm_address_t addr, os_vm_size_t len) * a lazy read (demand page) setup, but that would mean keeping an * open file pointer for the core indefinately (and be one more * thing to maintain). + * FIXME: I would bet that we can use PAGE_EXECUTE_WRITECOPY for this, + * but I'll leave it to someone who actually cares. */ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) execute) + int is_readonly_space) { os_commit_memory(addr, len); #ifdef LISP_FEATURE_64_BIT @@ -852,6 +854,8 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm gc_assert(res == offset); size_t count; + os_vm_address_t original_addr = addr; + os_vm_size_t original_len = len; while (len) { unsigned to_read = len > INT_MAX ? INT_MAX : len; count = read(fd, addr, to_read); @@ -859,6 +863,8 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm len -= count; gc_assert(count == to_read); } + DWORD old; + if (is_readonly_space) VirtualProtect(original_addr, original_len, PAGE_READONLY, &old); return (void*)0; } static DWORD os_protect_modes[8] = { diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index 9449994dde..d71bad4aeb 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -497,7 +497,7 @@ (assert (= (sb-sys:sap-ref-word sap (ash i sb-vm:word-shift))))))))) (with-test (:name :rospace-strings - :fails-on (or :darwin-jit :win32)) + :fails-on :darwin-jit) (let ((err (handler-case (setf (char (opaque-identity (symbol-name '*readtable*)) 0) #\*) (sb-sys:memory-fault-error (c) (write-to-string c :escape nil))))) From d4ee04324c402eccf864631f4901ded2e8c3916d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 26 Jul 2022 23:55:18 -0400 Subject: [PATCH 3746/4023] Remove dead code from editcore after rev 665e2b8f67ba --- tools-for-build/editcore.lisp | 61 +---------------------------------- 1 file changed, 1 insertion(+), 60 deletions(-) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index 1d7573f82a..8f8614f108 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -960,9 +960,6 @@ (pp-state (cons (make-hash-table :test 'equal) nil)) (prev-namestring "") (n-linker-relocs 0) - (seen-fdefns nil) - (seen-trampolines nil) - (seen-gfs nil) (temp-output (make-string-output-stream :element-type 'base-char)) end-loc) (labels ((dumpwords (sap count stream &optional (exceptions #()) logical-addr) @@ -1122,66 +1119,10 @@ (dumpwords (int-sap code-physaddr) (code-header-words code) output header-exceptions code-addr) (write-string (get-output-stream-string temp-output) output)))) - ((functionp (%code-debug-info code)) - (unless seen-trampolines - (setq seen-trampolines t) - (format output "lisp_trampolines:~%")) - (let* ((sap (int-sap (translate-ptr code-addr spaces))) - (tramp-fun (sap-ref-word sap (ash 2 word-shift)))) - (aver (not (in-bounds-p tramp-fun code-bounds))) - (format output " .quad ~{0x~x~^,~}~%" - (loop for i from 0 by n-word-bytes repeat 6 - collect (sap-ref-word sap i))))) (t (error "Strange code component: ~S" code))) (incf code-addr objsize))) - (#.fdefn-widetag - (unless seen-fdefns - (format output "~%# FDEFNs~%") - (setq seen-fdefns t)) - (let* ((ptr (translate-ptr code-addr spaces)) - (fdefn (%make-lisp-obj (logior ptr other-pointer-lowtag))) - (name (fun-name-from-core (fdefn-name fdefn) core)) - (c-name (c-name name core pp-state "F"))) - (format output "~a: # ~x~% .size ~0@*~a, 32~%" - (c-symbol-quote c-name) - (logior code-addr other-pointer-lowtag)) - (flet ((relativize (slot &aux (x (sap-ref-word (int-sap ptr) (ash slot word-shift)))) - (if (in-bounds-p x code-bounds) - (format nil "CS+0x~x" (- x (bounds-low code-bounds))) - (format nil "0x~x" x)))) - (format output " .quad 0x~x, 0x~x, ~a, ~a~%" - (sap-ref-word (int-sap ptr) 0) - (sap-ref-word (int-sap ptr) 8) - (relativize fdefn-fun-slot) - (relativize fdefn-raw-addr-slot))) - (incf code-addr (* 4 n-word-bytes)))) - (#.funcallable-instance-widetag - (unless seen-gfs - (setq seen-gfs t) - (when seen-trampolines - (format output " .size lisp_trampolines, .-lisp_trampolines~%"))) - (let* ((sap (int-sap (translate-ptr code-addr spaces))) - (fin-fun (sap-ref-word sap (ash 2 word-shift))) - (code-space-p (in-bounds-p fin-fun code-bounds)) - (slots (translate (sap-ref-lispobj sap (ash 3 word-shift)) spaces)) - (name (and (> (length (the simple-vector slots)) +gf-name-slot+) - (svref slots +gf-name-slot+))) - (c-name - (c-name - (if (or (not name) - (eql (get-lisp-obj-address name) unbound-marker-widetag)) - "unnamed" - (fun-name-from-core name core)) - core pp-state "G"))) - (format output "~a:~% .size ~0@*~a, 48~%" (c-symbol-quote c-name)) - (format output " .quad 0x~x, .+24, ~:[~;CS+~]0x~x~{, 0x~x~}~%" - (sap-ref-word sap 0) - code-space-p - (if code-space-p (- fin-fun (bounds-low code-bounds)) fin-fun) - (loop for i from (ash 3 word-shift) by n-word-bytes repeat 3 - collect (sap-ref-word sap i)))) - (incf code-addr (* 6 n-word-bytes)))))) + ))) ;; coreparse uses the 'lisp_jit_code' symbol to set varyobj_free_pointer ;; The intent is that compilation to memory can use this reserved area From e476a4dfc93d8c08870d13a94005cbf62f228c39 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 27 Jul 2022 02:58:06 -0400 Subject: [PATCH 3747/4023] mips: change one kludge to another Non-use of pseudostatic pages in core.h was a truly inexplicable hack. I found a bug ever since rev 89fb96640ab0 reduced GENCGC-PAGE-BYTES to smaller than +BACKEND-PAGE-BYTES+. Apparently we never anticipated those parameters diverging on any OS where we load the core file to memory using mmap(). Perhaps coincidentally, win32 is the only parms file that defines the two unequally, and it does NOT use MapViewOfFile. I wouldn't be surprised if we only thought it didn't work because of this. (Which came first: avoidance of MapViewOfFile or divergence of parameters?) --- src/runtime/core.h | 9 --------- src/runtime/gencgc.c | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/runtime/core.h b/src/runtime/core.h index bcab13f028..9033723c35 100644 --- a/src/runtime/core.h +++ b/src/runtime/core.h @@ -52,14 +52,6 @@ extern unsigned char build_id[]; char* get_asm_routine_by_name(const char* name, int*); -// Oddly enough, MIPS stopped working with pseudo-static pages after the speedup to -// gc_and_save. I spent a day trying to figure out why, and gave up. -// I surmise that it exposed a bug in the soft card marking implementation -// on MIPS, which considering that we have no evidence that users of SBCL on MIPS exist, -// does not seem important enough to demand a fix. -#ifdef LISP_FEATURE_MIPS -#define CORE_PAGE_GENERATION 0 -#else // By setting this to 0, all objects begin life in the nursery, and nothing // is pseudo-static. As such, any bugs due to code movement are likely to // occur sooner. Or set it to 1 to make things sort of not move immediately. @@ -67,4 +59,3 @@ char* get_asm_routine_by_name(const char* name, int*); //#define CORE_PAGE_GENERATION 0 #define CORE_PAGE_GENERATION PSEUDO_STATIC_GENERATION #endif -#endif diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 73dede7ad4..fc601fcc63 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -785,6 +785,20 @@ void zeroize_pages_if_needed(page_index_t start, page_index_t end, int page_type zero_pages(start, end); for (i = start; i <= end; i++) set_page_need_to_zero(i, 0); } +#elif defined LISP_FEATURE_MIPS + /* Technically this case is for "if BACKEND_PAGE_BYTES > GENCGC_CARD_BYTES" + * but #+win32 has that, and works fine because we don't map the core to memory + * from the file directly. The issue is that load_core_bytes() has a larger + * granularity than saving thinks it used, so loading picks up junk from pages + * that are supposedly zeroed. Until I fix it better, just zeroize always. + * Basically we want to decouple the allocator's quantum of GENCGC_PAGE_BYTES + * from the OS's requirement on file mappings. I don't know why rev 2faf4b79a7 + * exposed the bug, but it seems that the older strategy for gc_and_save left + * zeroed pages in exactly the right places either by accident or by design */ + for (i = start; i <= end; i++) { + zero_pages(i, i); + set_page_need_to_zero(i, 0); + } #else boolean usable_by_lisp = gc_alloc_generation == 0 || (gc_alloc_generation == SCRATCH_GENERATION From 04fa4bfaa34ec89d1863899a592fba40d9e70b05 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 27 Jul 2022 18:38:07 +0300 Subject: [PATCH 3748/4023] Clarify a NEWS entry. --- NEWS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 9f5ecf8dab..a585db25a9 100644 --- a/NEWS +++ b/NEWS @@ -24,8 +24,8 @@ changes relative to sbcl-2.2.6: * bug fix: internal error when optimizing chains of conditionals in local functions. (lp#1981607, reported by Pasha K) * optimization: faster TRUNCATE with float arguments. - * optimization: SXHASH on large floating point values should generate less - garbage. + * optimization: EQUALP hashing of large floating point values should + generate less garbage. changes in sbcl-2.2.6 relative to sbcl-2.2.5: * minor incompatible change: support for 32-bit x86 on macOS has been From f5dd3813d908b2ff29d5f933540cd5a51e71952e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 28 Jul 2022 16:58:18 +0300 Subject: [PATCH 3749/4023] More with-pinned-objects. --- src/code/arm64-simd.lisp | 139 +++++++++++++++++++------------------- src/code/x86-64-simd.lisp | 28 ++++---- 2 files changed, 80 insertions(+), 87 deletions(-) diff --git a/src/code/arm64-simd.lisp b/src/code/arm64-simd.lisp index 6f6c37683b..b772d1ec81 100644 --- a/src/code/arm64-simd.lisp +++ b/src/code/arm64-simd.lisp @@ -99,69 +99,68 @@ (defun simd-nreverse8 (result vector start end) (declare (optimize speed (safety 0))) - (let ((sap (vector-sap vector))) - (with-pinned-objects-in-registers (vector) - (inline-vop (((left sap-reg t) sap) - ((start any-reg tagged-num) start) - ((end) end) - ((right signed-reg signed-num)) - ((gl)) - ((gr)) - ((vl complex-double-reg complex-double-float)) - ((vr))) - () - (inst add right left (lsr end 1)) - (inst add left left (lsr start 1)) - (inst sub gl right left) - (inst cmp gl 32) - (inst b :lt WORD) - (inst sub right right 16) - - LOOP - (inst ldr vl (@ left)) - (inst ldr vr (@ right)) - - (inst rev64 vl vl) - (inst ext vl vl vl 8) - (inst rev64 vr vr) - (inst ext vr vr vr 8) - - (inst str vr (@ left 16 :post-index)) - (inst str vl (@ right -16 :post-index)) - (inst cmp left right) - (inst b :lt loop) - - (inst add right right 16) - - (inst sub gl right left) - WORD - (inst cmp gl 16) - (inst b :lt BYTE) - - (inst ldr gl (@ left)) - (inst ldr gr (@ right -8 :pre-index)) - (inst rev gl gl) - (inst rev gr gr) - (inst str gr (@ left 8 :post-index)) - (inst str gl (@ right)) - - BYTE - (inst sub right right 1) - (inst cmp right left) - (inst b :lt DONE) - - ;; After the 16-element copy above there are at most 15 - ;; elements, have to swap 14 elements with one staying in the - ;; middle. - (loop repeat 7 - do - (inst ldrb gl (@ left)) - (inst ldrb gr (@ right)) - (inst strb gr (@ left 1 :post-index)) - (inst strb gl (@ right -1 :post-index)) - (inst cmp left right) - (inst b :ge DONE)) - DONE))) + (with-pinned-objects-in-registers (vector) + (inline-vop (((left sap-reg t) (vector-sap vector)) + ((start any-reg tagged-num) start) + ((end) end) + ((right signed-reg signed-num)) + ((gl)) + ((gr)) + ((vl complex-double-reg complex-double-float)) + ((vr))) + () + (inst add right left (lsr end 1)) + (inst add left left (lsr start 1)) + (inst sub gl right left) + (inst cmp gl 32) + (inst b :lt WORD) + (inst sub right right 16) + + LOOP + (inst ldr vl (@ left)) + (inst ldr vr (@ right)) + + (inst rev64 vl vl) + (inst ext vl vl vl 8) + (inst rev64 vr vr) + (inst ext vr vr vr 8) + + (inst str vr (@ left 16 :post-index)) + (inst str vl (@ right -16 :post-index)) + (inst cmp left right) + (inst b :lt loop) + + (inst add right right 16) + + (inst sub gl right left) + WORD + (inst cmp gl 16) + (inst b :lt BYTE) + + (inst ldr gl (@ left)) + (inst ldr gr (@ right -8 :pre-index)) + (inst rev gl gl) + (inst rev gr gr) + (inst str gr (@ left 8 :post-index)) + (inst str gl (@ right)) + + BYTE + (inst sub right right 1) + (inst cmp right left) + (inst b :lt DONE) + + ;; After the 16-element copy above there are at most 15 + ;; elements, have to swap 14 elements with one staying in the + ;; middle. + (loop repeat 7 + do + (inst ldrb gl (@ left)) + (inst ldrb gr (@ right)) + (inst strb gr (@ left 1 :post-index)) + (inst strb gl (@ right -1 :post-index)) + (inst cmp left right) + (inst b :ge DONE)) + DONE)) result) (defun simd-nreverse32 (result vector start end) @@ -219,10 +218,9 @@ (defun simd-reverse8 (target source start length) (declare (optimize speed (safety 0))) - (let ((source (vector-sap source)) - (target (vector-sap target))) - (inline-vop (((source sap-reg t) source) - ((target sap-reg t) target) + (with-pinned-objects-in-registers (target source) + (inline-vop (((source sap-reg t) (vector-sap source)) + ((target sap-reg t) (vector-sap target)) ((start any-reg tagged-num) start) ((length) length) ((s-i signed-reg signed-num)) @@ -274,10 +272,9 @@ (defun simd-reverse32 (target source start length) (declare (optimize speed (safety 0))) - (let ((source (vector-sap source)) - (target (vector-sap target))) - (inline-vop (((source sap-reg t) source) - ((target sap-reg t) target) + (with-pinned-objects-in-registers (target source) + (inline-vop (((source sap-reg t) (vector-sap source)) + ((target sap-reg t) (vector-sap target)) ((start any-reg tagged-num) start) ((length) length) ((s-i signed-reg signed-num)) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index 46633c1e8c..de8046b3c1 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -381,10 +381,9 @@ (defun simd-reverse8 (target source start length) (declare (optimize speed (safety 0))) - (let ((source (vector-sap source)) - (target (vector-sap target))) - (inline-vop (((source sap-reg t) source) - ((target sap-reg t) target) + (with-pinned-objects (target source) + (inline-vop (((source sap-reg t) (vector-sap source)) + ((target sap-reg t) (vector-sap target)) ((start any-reg tagged-num) start) ((length) length) ((s-i signed-reg signed-num)) @@ -426,10 +425,9 @@ (def-variant simd-reverse8 :avx2 (target source start length) (declare (optimize speed (safety 0))) - (let ((source (vector-sap source)) - (target (vector-sap target))) - (inline-vop (((source sap-reg t) source) - ((target sap-reg t) target) + (with-pinned-objects (target source) + (inline-vop (((source sap-reg t) (vector-sap source)) + ((target sap-reg t) (vector-sap target)) ((start any-reg tagged-num) start) ((length) length) ((s-i signed-reg signed-num)) @@ -500,10 +498,9 @@ (defun simd-reverse32 (target source start length) (declare (optimize speed (safety 0))) - (let ((source (vector-sap source)) - (target (vector-sap target))) - (inline-vop (((source sap-reg t) source) - ((target sap-reg t) target) + (with-pinned-objects (target source) + (inline-vop (((source sap-reg t) (vector-sap source)) + ((target sap-reg t) (vector-sap target)) ((start any-reg tagged-num) start) ((length) length) ((s-i signed-reg signed-num)) @@ -540,10 +537,9 @@ (def-variant simd-reverse32 :avx2 (target source start length) (declare (optimize speed (safety 0))) - (let ((source (vector-sap source)) - (target (vector-sap target))) - (inline-vop (((source sap-reg t) source) - ((target sap-reg t) target) + (with-pinned-objects (source target) + (inline-vop (((source sap-reg t) (vector-sap source)) + ((target sap-reg t) (vector-sap target)) ((start any-reg tagged-num) start) ((length) length) ((s-i signed-reg signed-num)) From 79c1bc6c68d600da2bf8bcba260fa647e85632a9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 26 Jul 2022 14:11:48 +0300 Subject: [PATCH 3750/4023] Add a test for psxhash on large floats. --- src/code/bignum.lisp | 1 + tests/hash-2.pure.lisp | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index 0abffd9f92..f7c8da2dd9 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -2024,6 +2024,7 @@ ;;;; hashing ;;; the bignum case of the SXHASH function +;;; Needs to be synchronized with sxhash-bignum-double-float (defun sxhash-bignum (x) (let ((result 316495330)) (declare (type fixnum result)) diff --git a/tests/hash-2.pure.lisp b/tests/hash-2.pure.lisp index 0526229d9f..45c5c1a3c7 100644 --- a/tests/hash-2.pure.lisp +++ b/tests/hash-2.pure.lisp @@ -548,4 +548,16 @@ (assert (eq (sb-impl::hash-table-hash-fun h) #'fixnum-hash-worse))) (assert-error (make-hash-table :test 'my= :hash-function nil))) ; no good -;;; success + +(with-test (:name :psxhash-large-floats) + (flet ((test (integer) + (assert (= (sb-int:psxhash (float integer 1d0)) + (sb-int:psxhash (truncate (float integer 1d0))))) + (assert (= (sb-int:psxhash (float integer)) + (sb-int:psxhash (truncate (float integer))))))) + (loop for i from 80 to 100 by 4 + do (test (expt 2 i)) + (test (1+ (expt 2 i))) + (test (1- (expt 2 i))) + (test (- (expt 2 i) (random (expt 2 i)))) + (test (+ (expt 2 i) (random (expt 2 i))))))) From 0d0205b4c5ca543e7bc05af12648900041058463 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 29 Jul 2022 02:48:30 +0300 Subject: [PATCH 3751/4023] Fix a warning in dead code from truncate transforms. Constraint propagation doesn't work on < floats, use TYPEP. --- src/compiler/float-tran.lisp | 14 ++++++++------ tests/float-2.pure.lisp | 12 ++++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 63e275579c..93497bc5e5 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1641,9 +1641,10 @@ (macrolet ((def (type) `(deftransform unary-truncate ((number) (,type)) - '(if (<= ,(symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type)) - number - ,(symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type))) + '(if (typep number + '(,type + ,(symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type)) + ,(symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type)))) (let ((truncated (truly-the fixnum (%unary-truncate number)))) (values truncated (- number @@ -1668,9 +1669,10 @@ (unary-to-bignum (symbolicate '%unary-truncate- type '-to-bignum)) (coerce (symbolicate "%" type)) (unary `(lambda (number) - (if (<= ,(symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type)) - number - ,(symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type))) + (if (typep number + '(,type + ,(symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type)) + ,(symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type)))) (truly-the fixnum (,unary number)) (,unary-to-bignum number))))) `(deftransform truncate ((x &optional y) diff --git a/tests/float-2.pure.lisp b/tests/float-2.pure.lisp index 5f5a5ff496..ba5cffa5c9 100644 --- a/tests/float-2.pure.lisp +++ b/tests/float-2.pure.lisp @@ -373,3 +373,15 @@ fractional bits." 4.2766818550391727d188 1.635888515419299d28)) (test op val)))))) + +(with-test (:name :truncate-bignum-type-derivation) + (checked-compile `(lambda (x) + (declare ((or (integer 1208925819614629174706175) + (integer * -1208925819614629174706175)) + x)) + (truncate (float x 4d0)))) + (checked-compile `(lambda (x) + (declare ((or (integer 1208925819614629174706175) + (integer * -1208925819614629174706175)) + x)) + (truncate (float x 1d0) 4d0)))) From 0140de0f11f3f1eb14bd138fde69230514339aea Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 29 Jul 2022 03:16:39 +0300 Subject: [PATCH 3752/4023] Fix comparison of negative floats with bignums. Broken since 2020. --- NEWS | 1 + float-math.lisp-expr | 2 ++ src/code/float.lisp | 14 +++++++------- tests/float-2.pure.lisp | 12 ++++++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index a585db25a9..69f5a7df45 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,7 @@ changes relative to sbcl-2.2.6: declared argument types. (lp#1980292, reported by James Kalenius) * bug fix: internal error when optimizing chains of conditionals in local functions. (lp#1981607, reported by Pasha K) + * bug fix: fix comparison of negative floats with bignums. * optimization: faster TRUNCATE with float arguments. * optimization: EQUALP hashing of large floating point values should generate less garbage. diff --git a/float-math.lisp-expr b/float-math.lisp-expr index 3847c5cf3e..ae8e9507aa 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -655,6 +655,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -1277,6 +1278,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5F000000) #x0) NIL) diff --git a/src/code/float.lisp b/src/code/float.lisp index cecd8ef6aa..2e76e8811c 100644 --- a/src/code/float.lisp +++ b/src/code/float.lisp @@ -771,7 +771,7 @@ nil (let ((int (if (minusp float) (- bits) bits))) (and (= (truly-the bignum-length (bignum-integer-length bignum)) - (+ (integer-length bits) exp)) + (+ (integer-length int) exp)) (sb-bignum::bignum-lower-bits-zero-p bignum exp) (= int (truly-the fixnum @@ -786,9 +786,9 @@ (if (or (eql bits 0) (minusp exp)) (bignum-plus-p bignum) - (let ((int (if (minusp float) (- bits) bits)) - (length-diff (- (truly-the bignum-length (bignum-integer-length bignum)) - (+ (integer-length bits) exp)))) + (let* ((int (if (minusp float) (- bits) bits)) + (length-diff (- (truly-the bignum-length (bignum-integer-length bignum)) + (+ (integer-length int) exp)))) (cond ((plusp length-diff) (bignum-plus-p bignum)) ((minusp length-diff) (minusp float)) @@ -810,9 +810,9 @@ (if (or (eql bits 0) (minusp exp)) (not (bignum-plus-p bignum)) - (let ((int (if (minusp float) (- bits) bits)) - (length-diff (- (truly-the bignum-length (bignum-integer-length bignum)) - (+ (integer-length bits) exp)))) + (let* ((int (if (minusp float) (- bits) bits)) + (length-diff (- (truly-the bignum-length (bignum-integer-length bignum)) + (+ (integer-length int) exp)))) (cond ((plusp length-diff) (not (bignum-plus-p bignum))) ((minusp length-diff) (not (minusp float))) diff --git a/tests/float-2.pure.lisp b/tests/float-2.pure.lisp index ba5cffa5c9..28a1417ee9 100644 --- a/tests/float-2.pure.lisp +++ b/tests/float-2.pure.lisp @@ -385,3 +385,15 @@ fractional bits." (integer * -1208925819614629174706175)) x)) (truncate (float x 1d0) 4d0)))) + +(with-test (:name :bignum-float-compare) + (flet ((test (integer) + (assert (= (float integer 1d0) + (truncate (float integer 1d0)))) + (assert (= (float integer) + (truncate (float integer)))))) + (loop for i from 80 to 100 by 4 + do (test (expt 2 i)) + (test (- (expt 2 i))) + (test (1+ (expt 2 i))) + (test (- (expt 2 i)))))) From 52418c9a04021a85e4dfd38a765dd34626be1606 Mon Sep 17 00:00:00 2001 From: Felix Lange <fjl@twurst.com> Date: Fri, 29 Jul 2022 10:07:40 +0200 Subject: [PATCH 3753/4023] Retain some internal symbols of SB-LOOP for CLSQL This fixes a regression from commit a0329ac59e, after which CLSQL couldn't be built anymore because it attempts to use certain internal symbols from SB-LOOP. --- make-target-2-load.lisp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index da11a29743..571249eb9b 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -425,7 +425,6 @@ Please check that all strings which were not recognizable to the compiler #.(find-package "SB-ASSEM") #.(find-package "SB-DISASSEM") #.(find-package "SB-IMPL") - #.(find-package "SB-LOOP") #.(find-package "SB-FORMAT") #.(find-package "SB-UNIX") #.(find-package "SB-PCL") @@ -438,6 +437,11 @@ Please check that all strings which were not recognizable to the compiler #.(find-package "SB-KERNEL")) ;; Assume all and only external symbols must be retained (eq accessibility :external)) + (#.(find-package "SB-LOOP") + (or (eq accessibility :external) + ;; Retain some internals to keep CLSQL working. + (member symbol '(sb-loop::*loop-epilogue* + sb-loop::add-loop-path)))) (#.(find-package "SB-THREAD") (or (eq accessibility :external) ;; for some reason a recent change caused the tree-shaker to drop MAKE-SPINLOCK From 521918536182df06eea4c2fd2f22a8cb6cd9cb1f Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Fri, 29 Jul 2022 15:39:11 +0100 Subject: [PATCH 3754/4023] 2.2.7: will be tagged as "sbcl-2.2.7" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 69f5a7df45..07c160d9b2 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.2.6: +changes in sbcl-2.2.7 relative to sbcl-2.2.6: * minor incompatible change: the compiler emits full WARNINGs for undefined references to variables in TYPE and DYNAMIC-EXTENT declarations, and for SETQ of an undefined variable. (This was the historic behaviour for From 0a0868883dcd40a16c92e966dfce3368a0fb1a13 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 29 Jul 2022 13:41:06 -0400 Subject: [PATCH 3755/4023] Fix regression from cb0f8a1234cd Forgot to assign the result of make-pathname-intern-table. Also re-make another hash-table that tends to have the same problem. --- src/code/save.lisp | 6 +++++- tests/pathnames.impure.lisp | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/code/save.lisp b/src/code/save.lisp index bbe8069887..8cb2eac3e4 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -340,7 +340,11 @@ sufficiently motivated to do lengthy fixes." ;; And CLRHASH doesn't do as much as it should, because if the table ;; is actually empty, but at some point held 20,000 pathnames, ;; then we'd write out an enormous vector full of nothing. - (make-pathname-intern-table) + (setq sb-impl::*pathnames* (make-pathname-intern-table)) + (when (zerop (hash-table-count sb-kernel::*forward-referenced-wrappers*)) + ;; I think this table should always be empty but I'm not sure. If it is, + ;; recreate it so that we don't preserve an empty vector taking up 16KB + (setq sb-kernel::*forward-referenced-wrappers* (make-hash-table :test 'equal))) ;; Clean up the simulated weak list of covered code components. (rplacd sb-c:*code-coverage-info* (delete-if-not #'weak-pointer-value (cdr sb-c:*code-coverage-info*))) diff --git a/tests/pathnames.impure.lisp b/tests/pathnames.impure.lisp index 6baa4387ed..0678ebebec 100644 --- a/tests/pathnames.impure.lisp +++ b/tests/pathnames.impure.lisp @@ -17,6 +17,15 @@ ;;;; Pathname accessors +(with-test (:name :pathname-table-clobbered-on-save) + (let ((kvv (sb-impl::hash-table-pairs sb-impl::*pathnames*))) + (sb-int:dovector (element kvv) + (when (and (eq (heap-allocated-p element) :dynamic) + (pathnamep element) + (not (equal element #P""))) + (assert (/= (sb-kernel:generation-of element) + sb-vm:+pseudo-static-generation+)))))) + (with-test (:name (pathname :accessors :stream-not-associated-to-file type-error)) (let ((*stream* (make-string-output-stream))) (declare (special *stream*)) From 80197490107c53b2485d6797fdad324b15ec7484 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 29 Jul 2022 15:04:03 -0400 Subject: [PATCH 3756/4023] Update math journal --- float-math.lisp-expr | 61 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index ae8e9507aa..e9bf71a917 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -618,6 +618,9 @@ (< (#.(MAKE-SINGLE-FLOAT #x40490FDB) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) @@ -627,7 +630,9 @@ (< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -645,7 +650,9 @@ (< (#.(MAKE-SINGLE-FLOAT #x5CEE6B28) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -654,6 +661,7 @@ (< (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) @@ -724,10 +732,12 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) @@ -751,6 +761,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) T) +(< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) @@ -793,6 +804,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) @@ -857,9 +869,12 @@ (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) T) +(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) @@ -873,7 +888,10 @@ (< (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) @@ -884,6 +902,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) @@ -895,6 +914,7 @@ (< (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) @@ -1083,12 +1103,16 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) @@ -1108,6 +1132,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) @@ -1121,6 +1146,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) @@ -1220,6 +1246,9 @@ (<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) @@ -1229,6 +1258,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) @@ -1260,6 +1290,7 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) +(<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5E000000) #x0) NIL) @@ -1321,6 +1352,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) @@ -1354,6 +1386,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD) #.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) @@ -1401,7 +1434,9 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) @@ -1412,6 +1447,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0) #x0) T) @@ -1426,6 +1462,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0) #x0) T) @@ -1575,6 +1612,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x0) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -1621,6 +1659,8 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) @@ -2682,7 +2722,11 @@ (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) @@ -2696,6 +2740,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x-231194D8)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) @@ -2705,6 +2750,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x-21B6F025) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-21B6F025) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) +(> (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) @@ -2877,6 +2923,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x401C0000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) T) @@ -2952,12 +2999,16 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xE0000000)) NIL) @@ -2971,6 +3022,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xE0000000)) NIL) @@ -3410,6 +3462,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) @@ -3425,6 +3478,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) @@ -3432,6 +3486,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) +(>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) @@ -3461,6 +3516,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) @@ -3509,6 +3565,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) @@ -3706,6 +3763,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) @@ -3729,9 +3787,11 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) @@ -3740,6 +3800,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) From 1327b03b5a5f5eba4864f722407b4989842ae821 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 29 Jul 2022 15:04:47 -0400 Subject: [PATCH 3757/4023] Simplify fullcgc Don't mark objects in their headers. It's faster to use a side table. This is partly because of special logic necessary to mark simple-funs (marking a function marks all others in the same codeblob), but it's also true even without that aspect. We don't have to revisit all objects to clear the header bits on completion of the sweep phase, and there's no longer anything different about cons cells. --- src/runtime/fullcgc.c | 260 +++++++++++++++--------------------------- 1 file changed, 91 insertions(+), 169 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 3cadbf462c..e93c978b26 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -54,18 +54,6 @@ extern lispobj lisp_init_function, gc_object_watcher; -static inline uword_t boxedobj_widetag_to_markbit(int widetag) { - return (widetag == FDEFN_WIDETAG || widetag == WEAK_POINTER_WIDETAG) - ? FDEFN_MARK_BIT : MARK_BIT; -} -static inline uword_t general_widetag_to_markbit(int widetag) { - return (widetag == FDEFN_WIDETAG || widetag == WEAK_POINTER_WIDETAG) - ? FDEFN_MARK_BIT : ((widetag == BIGNUM_WIDETAG) ? BIGNUM_MARK_BIT : MARK_BIT); -} - -#define interesting_pointer_p(x) \ - (find_page_index((void*)x) >= 0 || immobile_space_p(x)) - #ifdef DEBUG # define dprintf(arg) printf arg FILE * logfile; @@ -110,25 +98,10 @@ static void* get_free_page(boolean prezero) { * 128 blocks of 256 bytes fit on a 32K GC page. */ static char *suballocator_free_ptr, *suballocator_end_ptr; -#ifndef LISP_FEATURE_USE_CONS_REGION -static inline uword_t compute_page_key(lispobj cons) { - return ALIGN_DOWN(cons, GENCGC_PAGE_BYTES); -} -static void* allocate_cons_mark_bits() { - int nbytes = GENCGC_PAGE_BYTES / (2 * N_WORD_BYTES) / 8; - if (suballocator_free_ptr + nbytes > suballocator_end_ptr) { - suballocator_free_ptr = get_free_page(1); - suballocator_end_ptr = suballocator_free_ptr + GENCGC_PAGE_BYTES; - } - char* mem = suballocator_free_ptr; - suballocator_free_ptr += nbytes; - return mem; -} -#endif - static void gc_enqueue(lispobj object) { gc_dcheck(is_lisp_pointer(object)); + gc_dcheck(widetag_of(native_pointer(object)) != SIMPLE_FUN_WIDETAG); struct Qblock* block = scav_queue.tail_block; if (block->count == QBLOCK_CAPACITY) { struct Qblock* next; @@ -170,44 +143,33 @@ static lispobj gc_dequeue() return object; } -/* The 'mark_bits' hashtable maps a page address to a block of mark bits - * for headerless objects (conses) */ -struct hopscotch_table mark_bits; - -static inline int compute_dword_number(lispobj cons) { - return (cons & (GENCGC_PAGE_BYTES - 1)) >> (1+WORD_SHIFT); +static inline sword_t dword_index(uword_t ptr, uword_t base) { + return (ptr - base) >> (1+WORD_SHIFT); } -static inline int cons_markedp(lispobj pointer) { - unsigned int index = compute_dword_number(pointer); -#ifdef LISP_FEATURE_USE_CONS_REGION /* all conses must be on cons pages */ - unsigned char* bits = (unsigned char*)ALIGN_DOWN(pointer, GENCGC_PAGE_BYTES) - + CONS_PAGE_USABLE_BYTES; -#else - unsigned char* bits = (unsigned char*) - hopscotch_get(&mark_bits, compute_page_key(pointer), 0); - if (!bits) return 0; +sword_t fixedobj_index_bit_bias, varyobj_index_bit_bias; +uword_t *fullcgcmarks; +static size_t markbits_size; +static inline sword_t ptr_to_bit_index(lispobj pointer) { + if (pointer == NIL) return -1; + page_index_t p = find_page_index((void*)pointer); + if (p >= 0) return dword_index(pointer, DYNAMIC_SPACE_START); +#ifdef LISP_FEATURE_IMMOBILE_SPACE + p = find_fixedobj_page_index((void*)pointer); + if (p >= 0) return dword_index(pointer, FIXEDOBJ_SPACE_START) + fixedobj_index_bit_bias; + p = find_varyobj_page_index((void*)pointer); + if (p >= 0) return dword_index(pointer, VARYOBJ_SPACE_START) + varyobj_index_bit_bias; #endif - return (bits[index / 8] >> (index % 8)) & 1; + return -1; } +#define interesting_pointer_p(x) ptr_to_bit_index(x)>=0 /* Return true if OBJ has already survived the current GC. */ static inline int pointer_survived_gc_yet(lispobj pointer) { - if (!interesting_pointer_p(pointer)) - return 1; - if (listp(pointer)) - return cons_markedp(pointer); - lispobj header = *native_pointer(pointer); - int widetag = header_widetag(header); - switch (widetag) { - case BIGNUM_WIDETAG: return (header & BIGNUM_MARK_BIT) != 0; - case WEAK_POINTER_WIDETAG: - case FDEFN_WIDETAG: return (header & FDEFN_MARK_BIT) != 0; - } - if (embedded_obj_p(widetag)) - header = *fun_code_header(native_pointer(pointer)); - return (header & MARK_BIT) != 0; + sword_t mark_index = ptr_to_bit_index(pointer); + if (mark_index < 0) return 1; // "uninteresting" objects always survive GC + return (fullcgcmarks[mark_index / N_WORD_BITS] >> (mark_index % N_WORD_BITS)) & 1; } void dump_marked_objects() { @@ -231,61 +193,40 @@ void dump_marked_objects() { fprintf(stderr, "Total: %d\n", n); } -void __mark_obj(lispobj pointer) +static void __mark_obj(lispobj pointer) { - gc_dcheck(is_lisp_pointer(pointer)); - if (!interesting_pointer_p(pointer)) - return; - if (!listp(pointer)) { - lispobj* base = native_pointer(pointer); - lispobj header = *base; - int widetag = header_widetag(header); - if (widetag == BIGNUM_WIDETAG) { - *base |= BIGNUM_MARK_BIT; - return; // don't enqueue - no pointers - } else { - if (embedded_obj_p(widetag)) { - base = fun_code_header(base); - pointer = make_lispobj(base, OTHER_POINTER_LOWTAG); - header = *base; - } - uword_t markbit = boxedobj_widetag_to_markbit(widetag); - if (header & markbit) return; // already marked - *base |= markbit; - } -#ifdef LISP_FEATURE_UBSAN - if (specialized_vector_widetag_p(widetag) && is_lisp_pointer(base[1])) - gc_mark_obj(base[1]); - else if (widetag == SIMPLE_VECTOR_WIDETAG && fixnump(base[1])) { - char *origin_pc = (char*)(base[1]>>4); - lispobj* code = component_ptr_from_pc(origin_pc); - if (code) gc_mark_obj(make_lispobj(code, OTHER_POINTER_LOWTAG)); - /* else lose("can't find code containing %p (vector=%p)", origin_pc, base); */ - } -#endif - if (leaf_obj_widetag_p(widetag)) return; - } else { - unsigned int index = compute_dword_number(pointer); -#ifdef LISP_FEATURE_USE_CONS_REGION /* all conses must be on cons pages */ - unsigned char* bits = (unsigned char*)ALIGN_DOWN(pointer, GENCGC_PAGE_BYTES) - + CONS_PAGE_USABLE_BYTES; -#else - /* Only _some_ conses are on cons pages depending if they got moved there. - * We could use a hybrid of storing mark bits on the page if possible, - * or the hash-table if not. However, I'd rather not complicate things. - * All architectures should be made to allocate directly on cons pages! */ - uword_t key = compute_page_key(pointer); - unsigned char* bits = (unsigned char*)hopscotch_get(&mark_bits, key, 0); - if (!bits) { - bits = allocate_cons_mark_bits(); - hopscotch_insert(&mark_bits, key, (sword_t)bits); - } -#endif - if (bits[index / 8] & (1 << (index % 8))) return; - // Mark the cons - bits[index / 8] |= 1 << (index % 8); + lispobj* base; + + sword_t mark_index = ptr_to_bit_index(pointer); + if (mark_index < 0) return; // uninteresting pointer + uword_t wordindex = mark_index / N_WORD_BITS; + uword_t bit = (uword_t)1 << (mark_index % N_WORD_BITS); + if (fullcgcmarks[wordindex] & bit) return; // already marked + if (lowtag_of(pointer) == FUN_POINTER_LOWTAG + && embedded_obj_p(widetag_of(FUNCTION(pointer)))) { + lispobj* code = fun_code_header(FUNCTION(pointer)); + mark_index -= ((char*)FUNCTION(pointer) - (char*)code) >> (1+WORD_SHIFT); + pointer = make_lispobj(code, OTHER_POINTER_LOWTAG); + base = code; + wordindex = mark_index / N_WORD_BITS; + bit = (uword_t)1 << (mark_index % N_WORD_BITS); + if (fullcgcmarks[wordindex] & bit) return; // already marked + } else + base = native_pointer(pointer); + fullcgcmarks[wordindex] |= bit; + // FIXME: restore the code for #ifdef LISP_FEATURE_UBSAN + if (widetag_of(base) == CODE_HEADER_WIDETAG) { + struct code* code = (void*)base; + /* mark all simple-funs which speeds up pointer_survived_gc_yet. + * Just add the offset in dwords from base to each fun to compute + * the mark bit index (rather than calling ptr_to_bit_index) */ + for_each_simple_fun(i, fun, code, 0, { + unsigned int offset = ((char*)fun - (char*)base) >> (1+WORD_SHIFT); + uword_t funmark = mark_index + offset; + fullcgcmarks[funmark / N_WORD_BITS] |= (uword_t)1 << (funmark % N_WORD_BITS); + }) } - gc_enqueue(pointer); + if (listp(pointer) || !leaf_obj_widetag_p(widetag_of(base))) gc_enqueue(pointer); } inline void gc_mark_obj(lispobj thing) { @@ -438,13 +379,6 @@ static void trace_object(lispobj* where) void prepare_for_full_mark_phase() { -#ifndef LISP_FEATURE_USE_CONS_REGION - hopscotch_create(&mark_bits, HOPSCOTCH_HASH_FUN_DEFAULT, - N_WORD_BYTES, /* table values are machine words */ - 65536, /* initial size */ - 0); -#endif - free_page = page_table_pages; suballocator_free_ptr = suballocator_end_ptr = 0; struct Qblock* block = (struct Qblock*)get_free_page(0); @@ -454,6 +388,18 @@ void prepare_for_full_mark_phase() scav_queue.recycler = 0; block->next = 0; block->tail = block->count = 0; + sword_t nbits_dynamic = (next_free_page*GENCGC_PAGE_BYTES) / (2*N_WORD_BYTES); +#ifdef LISP_FEATURE_IMMOBILE_SPACE + sword_t nbits_fixedobj = FIXEDOBJ_SPACE_SIZE / (2*N_WORD_BYTES); + sword_t nbits_varyobj = VARYOBJ_SPACE_SIZE / (2*N_WORD_BYTES); + fixedobj_index_bit_bias = nbits_dynamic; + varyobj_index_bit_bias = fixedobj_index_bit_bias + nbits_fixedobj; + sword_t nbytes = (nbits_dynamic + nbits_fixedobj + nbits_varyobj) / 8; +#else + sword_t nbytes = nbits_dynamic / 8; +#endif + markbits_size = ALIGN_UP(nbytes, getpagesize()); + fullcgcmarks = (void*)os_allocate(markbits_size); } void execute_full_mark_phase() @@ -501,8 +447,8 @@ void execute_full_mark_phase() (a.field.tv_usec-b.field.tv_usec)) / 1000000.0 if (gencgc_verbose) fprintf(stderr, - "[Mark phase: %d pages used, HT-count=%d, ET=%f+%f sys+usr]\n", - (int)(page_table_pages - free_page), mark_bits.count, + "[Mark phase: %d pages used, ET=%f+%f sys+usr]\n", + (int)(page_table_pages - free_page), timediff(before, after, ru_stime), timediff(before, after, ru_utime)); #endif } @@ -551,22 +497,15 @@ __attribute__((unused)) static char *fillerp(lispobj* where) static FILE *sweeplog; static int sweep_mode = 1; -# define NOTE_GARBAGE(gen,addr,nwords,tally,erase) \ - { tally[gen] += nwords; \ - if (sweep_mode & 2) /* print before erasing */ \ - fprintf(sweeplog, "%5d %d #x%"OBJ_FMTX": %"OBJ_FMTX" %"OBJ_FMTX"\n", \ - (int)nwords, gen, compute_lispobj(addr), \ - addr[0], addr[1]); \ - if (sweep_mode & 1) { erase; } } - #ifndef LISP_FEATURE_IMMOBILE_SPACE #undef immobile_obj_gen_bits #define immobile_obj_gen_bits(x) (lose("No page index?"),0) #else -static void sweep_fixedobj_pages(long *zeroed) +static void sweep_fixedobj_pages() { low_page_index_t page; - + uword_t space_base = FIXEDOBJ_SPACE_START; + sword_t bitmap_index_bias = fixedobj_index_bit_bias; for (page = FIXEDOBJ_RESERVED_PAGES ; ; ++page) { lispobj *obj = fixedobj_page_address(page); if (obj >= fixedobj_free_pointer) @@ -578,25 +517,13 @@ static void sweep_fixedobj_pages(long *zeroed) lispobj *limit = (lispobj*)((char*)obj + IMMOBILE_CARD_BYTES - obj_spacing); for ( ; obj <= limit ; obj = (lispobj*)((char*)obj + obj_spacing) ) { lispobj header = *obj; - uword_t markbit = boxedobj_widetag_to_markbit(header_widetag(header)); - if (fixnump(header)) { // is a hole - } else if (header & markbit) { // live object - *obj = header ^ markbit; - } else { - NOTE_GARBAGE(immobile_obj_gen_bits(obj), obj, nwords, zeroed, - memset(obj, 0, nwords * N_WORD_BYTES)); - } + if (fixnump(header)) continue; // is a hole + uword_t index = bitmap_index_bias + (((uword_t)obj - space_base) >> (1+WORD_SHIFT)); + uword_t livep = + fullcgcmarks[index / N_WORD_BITS] & ((uword_t)1 << (index % N_WORD_BITS)); + if (!livep) memset(obj, 0, nwords * N_WORD_BYTES); } } - // The reserved fixedobj page has the vector of primitive object layouts. - lispobj* obj = fixedobj_page_address(0); - lispobj* limit = fixedobj_page_address(FIXEDOBJ_RESERVED_PAGES); - while (obj < limit) { - lispobj header = *obj; - uword_t markbit = boxedobj_widetag_to_markbit(header_widetag(header)); - if (header & markbit) *obj = header ^ markbit; - obj += headerobj_size(obj); - } } #endif @@ -630,21 +557,25 @@ static uword_t sweep(lispobj* where, lispobj* end, __attribute__((unused)) uword_t arg) { sword_t nwords; - + uword_t space_base = DYNAMIC_SPACE_START; + sword_t bitmap_index_bias = 0; +#ifdef LISP_FEATURE_IMMOBILE_SPACE + if (find_page_index(where) < 0) { + gc_assert(find_varyobj_page_index(where) >= 0); + space_base = VARYOBJ_SPACE_START; + bitmap_index_bias = varyobj_index_bit_bias; + } +#endif for ( ; where < end ; where += nwords ) { lispobj word = *where; - int livep = 0; + uword_t index = bitmap_index_bias + (((uword_t)where - space_base) >> (1+WORD_SHIFT)); + uword_t livep = + fullcgcmarks[index / N_WORD_BITS] & ((uword_t)1 << (index % N_WORD_BITS)); if (is_header(word)) { nwords = headerobj_size2(where, word); - lispobj markbit = general_widetag_to_markbit(header_widetag(word)); - if (word & markbit) livep = 1, *where = word ^ markbit; if (!livep) clobber_headered_object(where, nwords); } else { nwords = 2; - livep = cons_markedp((lispobj)where); - /* This bit pattern indicates unambiguously that a cons cell - * has gotten clobbered. Using (0 . 0) leaves open to question - * whether the cons is actually live */ if (!livep) where[0] = where[1] = (uword_t)-1; } } @@ -680,7 +611,7 @@ void execute_full_sweep_phase() memset(words_zeroed, 0, sizeof words_zeroed); #ifdef LISP_FEATURE_IMMOBILE_SPACE if (sweeplog) fprintf(sweeplog, "-- fixedobj space --\n"); - sweep_fixedobj_pages(words_zeroed); + sweep_fixedobj_pages(); if (sweeplog) fprintf(sweeplog, "-- varyobj space --\n"); sweep((lispobj*)VARYOBJ_SPACE_START, varyobj_free_pointer, (uword_t)words_zeroed); @@ -694,23 +625,14 @@ void execute_full_sweep_phase() fprintf(stderr, "%ld%s", words_zeroed[i], i?"+":""); fprintf(stderr, " words zeroed]\n"); } - page_index_t page; -#ifdef LISP_FEATURE_USE_CONS_REGION - // Clear all cons mark bits - for (page = 0; page < next_free_page; ++page) - if (page_table[page].type == PAGE_TYPE_CONS) { - char* base = page_address(page); - char* bits = base + CONS_PAGE_USABLE_BYTES; - char* end = base + GENCGC_PAGE_BYTES; - memset(bits, 0, end-bits); - } -#else - hopscotch_destroy(&mark_bits); -#endif + // deallocate the mark bits + os_deallocate((void*)fullcgcmarks, markbits_size); + fullcgcmarks = 0; markbits_size = 0; if (sweeplog) fflush(sweeplog); + page_index_t page; // Give back all private-use pages and indicate need-to-zero for (page = free_page; page < page_table_pages; ++page) { gc_assert((page_table[page].type & PAGE_TYPE_MASK) == PAGE_TYPE_UNBOXED); From 0e3d1d6b513afce98e2a2131ca5816c3ebfaed2c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 10:28:01 -0400 Subject: [PATCH 3758/4023] Fix fullcgc if return-pcs exist --- src/runtime/fullcgc.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index e93c978b26..7466dec228 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -147,6 +147,16 @@ static inline sword_t dword_index(uword_t ptr, uword_t base) { return (ptr - base) >> (1+WORD_SHIFT); } +static inline lispobj canonical_ptr(lispobj pointer) +{ +#ifdef RETURN_PC_WIDETAG + if (lowtag_of(pointer)==OTHER_POINTER_LOWTAG && widetag_of(native_pointer(pointer)) + == RETURN_PC_WIDETAG) + return fun_code_tagged(native_pointer(pointer)); +#endif + return pointer; +} + sword_t fixedobj_index_bit_bias, varyobj_index_bit_bias; uword_t *fullcgcmarks; static size_t markbits_size; @@ -167,7 +177,7 @@ static inline sword_t ptr_to_bit_index(lispobj pointer) { /* Return true if OBJ has already survived the current GC. */ static inline int pointer_survived_gc_yet(lispobj pointer) { - sword_t mark_index = ptr_to_bit_index(pointer); + sword_t mark_index = ptr_to_bit_index(canonical_ptr(pointer)); if (mark_index < 0) return 1; // "uninteresting" objects always survive GC return (fullcgcmarks[mark_index / N_WORD_BITS] >> (mark_index % N_WORD_BITS)) & 1; } @@ -197,6 +207,7 @@ static void __mark_obj(lispobj pointer) { lispobj* base; + pointer = canonical_ptr(pointer); sword_t mark_index = ptr_to_bit_index(pointer); if (mark_index < 0) return; // uninteresting pointer uword_t wordindex = mark_index / N_WORD_BITS; From 46877b84314c8afd445da257e0fa8755600cc677 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 16:05:53 -0400 Subject: [PATCH 3759/4023] Fix crashing test --- tests/hide-packages.test.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/hide-packages.test.sh b/tests/hide-packages.test.sh index 0abf81d19e..f367cba2ba 100644 --- a/tests/hide-packages.test.sh +++ b/tests/hide-packages.test.sh @@ -11,6 +11,27 @@ CLOBBER_INTERNAL_FEATURES="(handler-bind ((simple-error #'continue)) (alien-funcall (extern-alien \"move_rospace_to_dynamic\" (function void int)) 1) (sb-kernel:set-symbol-global-value (eval ''sb-impl:+internal-features+) nil))" +### Apparently the finalizer thread must be stopped before running these tests or else +### it can crash due to the highly unorthodox use of move_rospace_to_dynamic(). +### Somehow the finalizer thread dereferenced data from the R/O space +### after that space was reduced to 0 size. Amazingly the finalizer hadn't gotten out +### of its new_thread_trampoline nor assigned anything to 'current_thread'. +### parallel-exec was able to elicit about 3 failures in 20 prior to the fix. +### +### Backtrace from gdb: +### ... +### #8 0x000055d729cf8d0a in call_lossage_handler () at interr.c:116 +### #9 0x000055d729cf9127 in corruption_warning_and_maybe_lose ( +### fmt=fmt@entry=0x55d729d2a660 "Received signal %d @ %lx in non-lisp tid %d, resignaling to a lisp thread.") at interr.c:202 +### #10 0x000055d729cf97bc in resignal_to_lisp_thread (signal=signal@entry=11, +### context=context@entry=0x7f9a3e216880) at interrupt.c:218 +### #11 0x000055d729cf9843 in low_level_handle_now_handler (signal=11, info=0x7f9a3e2169b0, +### void_context=0x7f9a3e216880) at interrupt.c:1927 +### #12 <signal handler called> +### #13 new_thread_trampoline (arg=<optimized out>) at src/runtime/runtime.h:160 +### #14 0x00007f9a3ed20d80 in start_thread (arg=0x7f9a3e217640) at pthread_create.c:481 +### #15 0x00007f9a3eaf676f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95 + ### Test 1: assert that no package name string has a reference from any ### heap object aside from the package itself. ### Because SAVE-LISP-AND-DIE coalesces strings, this test provides confidence @@ -21,6 +42,7 @@ run_sbcl <<EOF #+cheneygc (exit) ; not much can be done for cheney to make this pass #+sb-devel (exit) ; doesn't pass either +#+sb-thread (sb-impl::finalizer-thread-stop) (defvar *weak-ptrs* nil) (progn ;; Remove features that are also names of packages. @@ -66,6 +88,7 @@ run_sbcl <<EOF ;;; Does not pass with interpreter (setq sb-ext:*evaluator-mode* :compile) +#+sb-thread (sb-impl::finalizer-thread-stop) ;;; Avoid accidental enlivenment of strings - the forms in this file must ;;; obscure the spellings of package name strings or else they can end up From 894b122af7832ee2148a1696dc0bccca939ebdc3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 16:12:23 -0400 Subject: [PATCH 3760/4023] Rename varyobj space to text space because it becomes the ".text" section of an ELF core. And rename free_pointer to highwatermark (like dynamic_space). --- src/assembly/x86-64/assem-rtns.lisp | 6 +- src/code/alloc.lisp | 88 ++++---- src/code/immobile-space.lisp | 4 +- src/code/room.lisp | 16 +- src/code/save.lisp | 2 +- src/cold/exports.lisp | 6 +- src/compiler/generic/core.lisp | 2 +- src/compiler/generic/genesis.lisp | 20 +- src/compiler/generic/objdef.lisp | 6 +- src/compiler/generic/parms.lisp | 14 +- src/compiler/x86-64/insts.lisp | 2 +- src/compiler/x86-64/parms.lisp | 2 +- src/runtime/coalesce.c | 4 +- src/runtime/coreparse.c | 48 ++--- src/runtime/fullcgc.c | 22 +- src/runtime/gencgc.c | 6 +- src/runtime/globals.c | 2 +- src/runtime/globals.h | 6 +- src/runtime/immobile-space.c | 316 ++++++++++++++-------------- src/runtime/immobile-space.h | 24 +-- src/runtime/monitor.c | 40 ++-- src/runtime/save.c | 6 +- src/runtime/stringspace.c | 2 +- src/runtime/thread.c | 10 +- src/runtime/traceroot.c | 14 +- src/runtime/verify.inc | 18 +- tests/gc.impure.lisp | 2 +- tests/save3.test.sh | 2 +- tools-for-build/corefile.lisp | 4 +- tools-for-build/editcore.lisp | 20 +- 30 files changed, 357 insertions(+), 357 deletions(-) diff --git a/src/assembly/x86-64/assem-rtns.lisp b/src/assembly/x86-64/assem-rtns.lisp index 5179e0181e..9b810e931b 100644 --- a/src/assembly/x86-64/assem-rtns.lisp +++ b/src/assembly/x86-64/assem-rtns.lisp @@ -413,11 +413,11 @@ #+immobile-space (progn (inst mov rax object) - (inst sub rax (thread-slot-ea thread-varyobj-space-addr-slot)) + (inst sub rax (thread-slot-ea thread-text-space-addr-slot)) (inst shr rax (1- (integer-length immobile-card-bytes))) - (inst cmp rax (thread-slot-ea thread-varyobj-card-count-slot)) + (inst cmp rax (thread-slot-ea thread-text-card-count-slot)) (inst jmp :ae try-dynamic-space) - (inst mov rdi (thread-slot-ea thread-varyobj-card-marks-slot)) + (inst mov rdi (thread-slot-ea thread-text-card-marks-slot)) (inst bts :dword :lock (ea rdi-tn) rax) (inst jmp store)) TRY-DYNAMIC-SPACE diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index f3e060edb4..d2b50392d2 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -75,10 +75,10 @@ #+immobile-space (progn -(define-alien-variable varyobj-space-size (unsigned 32)) +(define-alien-variable text-space-size (unsigned 32)) (define-alien-variable ("FIXEDOBJ_SPACE_START" fixedobj-space-start) unsigned-long) -(define-alien-variable ("VARYOBJ_SPACE_START" varyobj-space-start) unsigned-long) -(define-alien-variable ("varyobj_free_pointer" *varyobj-space-free-pointer*) +(define-alien-variable ("TEXT_SPACE_START" text-space-start) unsigned-long) +(define-alien-variable ("text_space_highwatermark" *text-space-free-pointer*) system-area-pointer) (define-alien-variable ("fixedobj_free_pointer" *fixedobj-space-free-pointer*) system-area-pointer) @@ -87,9 +87,9 @@ (assert (eql code-boxed-size-slot 1)) (assert (eql code-debug-info-slot 2))) -(define-alien-variable "varyobj_holes" long) -(define-alien-variable "varyobj_page_touched_bits" (* (unsigned 32))) -(define-alien-variable "varyobj_pages" (* (unsigned 32))) +(define-alien-variable "text_holes" long) +(define-alien-variable "text_page_touched_bits" (* (unsigned 32))) +(define-alien-variable "text_pages" (* (unsigned 32))) (define-alien-routine "find_preceding_object" long (where long)) ;;; Lazily created freelist, used only when unallocate is called: @@ -101,30 +101,30 @@ ;;; some bytes in the storage itself rather than through cons cells. (define-load-time-global *immobile-freelist* nil) -;;; Return the zero-based index within the varyobj subspace of immobile space. -(defun varyobj-page-index (address) +;;; Return the zero-based index within the text subspace of immobile space. +(defun text-page-index (address) (declare (type (and fixnum unsigned-byte) address)) - (values (floor (- address varyobj-space-start) immobile-card-bytes))) + (values (floor (- address text-space-start) immobile-card-bytes))) -(defun varyobj-page-address (index) - (+ varyobj-space-start (* index immobile-card-bytes))) +(defun text-page-address (index) + (+ text-space-start (* index immobile-card-bytes))) -(declaim (inline (setf varyobj-page-scan-start-offset))) -(defun (setf varyobj-page-scan-start-offset) (newval index) +(declaim (inline (setf text-page-scan-start-offset))) +(defun (setf text-page-scan-start-offset) (newval index) ;; NEWVAL is passed in as a byte count but we want to store it as doublewords ;; so it needs right-shifting by 1+ word-shift. However because it is a field ;; of a packed word, it needs left-shifting by 8. We can shift by the net amount ;; provided that no zero bits would be right-shifted out. (aver (zerop (logand newval lowtag-mask))) - (setf (deref varyobj-pages index) + (setf (deref text-pages index) (logior (ash newval (- 8 (1+ word-shift))) - (logand (deref varyobj-pages index) #xFF))) + (logand (deref text-pages index) #xFF))) newval) -;;; Convert a zero-based varyobj page index into a scan start address. -(defun varyobj-page-scan-start (index) - (- (+ varyobj-space-start (* (1+ index) immobile-card-bytes)) - (* 2 n-word-bytes (ash (deref varyobj-pages index) -8)))) +;;; Convert a zero-based text page index into a scan start address. +(defun text-page-scan-start (index) + (- (+ text-space-start (* (1+ index) immobile-card-bytes)) + (* 2 n-word-bytes (ash (deref text-pages index) -8)))) (declaim (inline hole-p)) (defun hole-p (raw-address) @@ -212,9 +212,9 @@ (remove-from-freelist found)) found)) -(defun set-varyobj-space-free-pointer (free-ptr) +(defun set-text-space-free-pointer (free-ptr) (declare (type (and fixnum unsigned-byte) free-ptr)) - (setq *varyobj-space-free-pointer* (int-sap free-ptr)) + (setq *text-space-free-pointer* (int-sap free-ptr)) ;; When the free pointer is not page-aligned - it usually won't be - ;; then we create an unboxed array from the pointer to the page end ;; so that it appears as one contiguous object when scavenging. @@ -232,7 +232,7 @@ #+immobile-space-debug (awhen *in-use-bits* (mark-range it hole (hole-size hole) nil)) (let* ((hole-end (hole-end-address hole)) - (end-is-free-ptr (eql hole-end (sap-int *varyobj-space-free-pointer*)))) + (end-is-free-ptr (eql hole-end (sap-int *text-space-free-pointer*)))) ;; First, ensure that no page's scan-start points to this hole. ;; For smaller-than-page objects, this will do nothing if the hole ;; was not the scan-start. For larger-than-page, we have to update @@ -245,26 +245,26 @@ ;; Pages (1+ first-page) through (1- last-page) inclusive ;; must become empty. last-page may or may not be depending ;; on whether another object can be found on it. - (let ((first-page (varyobj-page-index hole)) - (last-page (varyobj-page-index (1- hole-end)))) - (when (and (eql (varyobj-page-scan-start first-page) hole) + (let ((first-page (text-page-index hole)) + (last-page (text-page-index (1- hole-end)))) + (when (and (eql (text-page-scan-start first-page) hole) (< first-page last-page)) - (setf (varyobj-page-scan-start-offset first-page) 0)) + (setf (text-page-scan-start-offset first-page) 0)) (loop for page from (1+ first-page) below last-page - do (setf (varyobj-page-scan-start-offset page) 0)) + do (setf (text-page-scan-start-offset page) 0)) ;; Only touch the offset for the last page if it pointed to this hole. ;; If the following object is a hole that is in the pending free list, ;; it's ok, but if it's a hole that is already in the freelist, ;; it's not OK, so look beyond that object. We don't have to iterate, ;; since there can't be two consecutive holes - so it's either the ;; object after this hole, or the one after that. - (when (eql (varyobj-page-scan-start last-page) hole) - (let* ((page-end (varyobj-page-address (1+ last-page))) + (when (eql (text-page-scan-start last-page) hole) + (let* ((page-end (text-page-address (1+ last-page))) (new-scan-start (cond (end-is-free-ptr page-end) ((freed-hole-p hole-end) (hole-end-address hole-end)) (t hole-end)))) - (setf (varyobj-page-scan-start-offset last-page) + (setf (text-page-scan-start-offset last-page) (if (< new-scan-start page-end) ;; Compute new offset backwards relative to the page end. (- page-end new-scan-start) @@ -288,7 +288,7 @@ ;; the free pointer diminishes the opportunity to use the frontier ;; to later allocate a larger object that would not have fit ;; into any existing hole. - (set-varyobj-space-free-pointer hole) + (set-text-space-free-pointer hole) (return-from unallocate)) (let* ((successor hole-end) (succ-is-free (freed-hole-p successor))) @@ -306,13 +306,13 @@ ;; Can't allocate fewer than 4 words due to min hole size. (aver (>= n-bytes (* 4 n-word-bytes))) (with-system-mutex (*allocator-mutex* :without-gcing t) - (unless (zerop varyobj-holes) + (unless (zerop text-holes) ;; If deferred sweep needs to happen, do so now. ;; Concurrency could potentially be improved here: at most one thread ;; should do this step, but it doesn't need to be exclusive with GC ;; as long as we can atomically pop items off the list of holes. - (let ((hole-addr varyobj-holes)) - (setf varyobj-holes 0) + (let ((hole-addr text-holes)) + (setf text-holes 0) (loop (let ((next (sap-ref-word (int-sap hole-addr) (ash code-debug-info-slot word-shift)))) @@ -337,9 +337,9 @@ shrunk-size remaining) (+ found remaining)))))) ; Consume the upper piece ;; 3. Extend the frontier. - (let* ((addr (sap-int *varyobj-space-free-pointer*)) + (let* ((addr (sap-int *text-space-free-pointer*)) (free-ptr (+ addr n-bytes)) - (limit (+ varyobj-space-start varyobj-space-size))) + (limit (+ text-space-start text-space-size))) (when (> free-ptr limit) (cond (errorp (format t "~&Immobile space exhausted~%") @@ -347,23 +347,23 @@ (sb-impl::%halt)) (t (return-from alloc-immobile-code nil)))) - (set-varyobj-space-free-pointer free-ptr) + (set-text-space-free-pointer free-ptr) addr)))) (aver (not (logtest addr lowtag-mask))) ; Assert proper alignment ;; Compute the start and end of the first page consumed. (let* ((page-start (logandc2 addr (1- immobile-card-bytes))) (page-end (+ page-start immobile-card-bytes)) - (index (varyobj-page-index addr)) + (index (text-page-index addr)) (obj-end (+ addr n-bytes))) ;; Mark the page as being used by a nursery object. - (setf (deref varyobj-pages index) (logior (deref varyobj-pages index) 1)) + (setf (deref text-pages index) (logior (deref text-pages index) 1)) ;; On the object's first page, set the scan start only if addr ;; is lower than the current page-scan-start object. ;; Note that offsets are expressed in doublewords backwards from ;; page end, so that we can direct the scan start to any doubleword ;; on the page or in the preceding 256MiB (approximately). - (when (< addr (varyobj-page-scan-start index)) - (setf (varyobj-page-scan-start-offset index) (- page-end addr))) + (when (< addr (text-page-scan-start index)) + (setf (text-page-scan-start-offset index) (- page-end addr))) ;; On subsequent pages, always set the scan start, since there can not ;; be a lower-addressed object touching those pages. (loop @@ -371,7 +371,7 @@ (incf page-end immobile-card-bytes) (incf index) (when (>= page-start obj-end) (return)) - (setf (varyobj-page-scan-start-offset index) (- page-end addr)))) + (setf (text-page-scan-start-offset index) (- page-end addr)))) #+immobile-space-debug ; "address sanitizer" (awhen *in-use-bits* (mark-range it addr n-bytes t)) (setf (sap-ref-word (int-sap addr) 0) word0 @@ -444,8 +444,8 @@ #+immobile-space (or (let ((start fixedobj-space-start)) (<= start addr (truly-the word (+ start (1- fixedobj-space-size))))) - (let ((start varyobj-space-start)) - (<= start addr (truly-the word (+ start (1- varyobj-space-size))))))) + (let ((start text-space-start)) + (<= start addr (truly-the word (+ start (1- text-space-size))))))) (defun immobile-space-obj-p (obj) (immobile-space-addr-p (get-lisp-obj-address obj))) diff --git a/src/code/immobile-space.lisp b/src/code/immobile-space.lisp index 68414a344a..85175c2afb 100644 --- a/src/code/immobile-space.lisp +++ b/src/code/immobile-space.lisp @@ -39,8 +39,8 @@ (when (= obj-type code-header-widetag) ,@body)) ;; Slowness here is bothersome, especially for SB-VM::REMOVE-STATIC-LINKS, ;; so skip right over all fixedobj pages. - (ash varyobj-space-start (- n-fixnum-tag-bits)) - (%make-lisp-obj (sap-int *varyobj-space-free-pointer*))))))) + (ash text-space-start (- n-fixnum-tag-bits)) + (%make-lisp-obj (sap-int *text-space-free-pointer*))))))) (defun sb-vm::collect-immobile-code-relocs () (let ((code-components diff --git a/src/code/room.lisp b/src/code/room.lisp index 6458f1033a..036d6c9f82 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -125,8 +125,8 @@ (sap-int *fixedobj-space-free-pointer*))) #+immobile-space (:variable - (bounds varyobj-space-start - (sap-int *varyobj-space-free-pointer*))) + (bounds text-space-start + (sap-int *text-space-free-pointer*))) (:dynamic (bounds (current-dynamic-space-start) (sap-int (dynamic-space-free-pointer))))))) @@ -325,7 +325,7 @@ We could try a few things to mitigate this: (:immobile ;; Filter out filler objects. These either look like cons cells ;; in fixedobj subspace, or code without enough header words - ;; in varyobj subspace. (cf 'filler_obj_p' in gc-internal.h) + ;; in text subspace. (cf 'filler_obj_p' in gc-internal.h) (dx-flet ((filter (obj type size) (unless (= type list-pointer-lowtag) (funcall fun obj type size)))) @@ -1180,10 +1180,10 @@ We could try a few things to mitigate this: (%make-lisp-obj fixedobj-space-start) (%make-lisp-obj (sap-int *fixedobj-space-free-pointer*)))) (when (or (eq which :variable) (eq which :both)) - (format t "Varyobj space~%=============~%") + (format t "Text space~%=============~%") (map-objects-in-range #'show - (%make-lisp-obj varyobj-space-start) - (%make-lisp-obj (sap-int *varyobj-space-free-pointer*)))))) + (%make-lisp-obj text-space-start) + (%make-lisp-obj (sap-int *text-space-free-pointer*)))))) ;;; Show objects in a much simpler way than print-allocated-objects. ;;; Probably don't use this for generation 0 of dynamic space. Other spaces are ok. @@ -1307,8 +1307,8 @@ We could try a few things to mitigate this: (without-gcing #+immobile-code (map-objects-in-range #'nofilter - (ash varyobj-space-start (- n-fixnum-tag-bits)) - (%make-lisp-obj (sap-int *varyobj-space-free-pointer*))) + (ash text-space-start (- n-fixnum-tag-bits)) + (%make-lisp-obj (sap-int *text-space-free-pointer*))) (alien-funcall (extern-alien "close_code_region" (function void))) (walk-dynamic-space #'nofilter #b1111111 ; all generations diff --git a/src/code/save.lisp b/src/code/save.lisp index 8cb2eac3e4..8e682e6c79 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -639,7 +639,7 @@ sb-c:: (callees (cdr item))) (dolist (callee callees) (push caller (gethash callee reverse-graph))))) - ;; Compute popularity of each code component in varyobj space + ;; Compute popularity of each code component in text space (map-allocated-objects (lambda (obj type size) (declare (ignore size)) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 865fc27e34..880302cf58 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -629,10 +629,10 @@ structure representations") "IMMOBILE-CARD-BYTES" "FIXEDOBJ-SPACE-START" "FIXEDOBJ-SPACE-SIZE" - "VARYOBJ-SPACE-START" - "VARYOBJ-SPACE-SIZE" + "TEXT-SPACE-START" + "TEXT-SPACE-SIZE" "*FIXEDOBJ-SPACE-FREE-POINTER*" - "*VARYOBJ-SPACE-FREE-POINTER*") + "*TEXT-SPACE-FREE-POINTER*") #+sb-simd-pack (:export "SIMD-PACK-TAG-SLOT" diff --git a/src/compiler/generic/core.lisp b/src/compiler/generic/core.lisp index 7cdb00cb17..2870c8af92 100644 --- a/src/compiler/generic/core.lisp +++ b/src/compiler/generic/core.lisp @@ -12,7 +12,7 @@ (in-package "SB-C") ;;; Unique number assigned into high 4 bytes of 64-bit code size slot -;;; so that we can sort the contents of varyobj space in a more-or-less +;;; so that we can sort the contents of text space in a more-or-less ;;; predictable manner based on the order in which code was loaded. ;;; This wraps around at 32 bits, but it's still deterministic. (define-load-time-global *code-serialno* 0) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 12b6e7e877..6e90e0f0b7 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -211,7 +211,7 @@ #+immobile-space (progn (defvar *immobile-fixedobj*) - (defvar *immobile-varyobj*) + (defvar *immobile-text*) (defvar *immobile-space-map* nil)) (defconstant max-core-space-id (+ 3 #+immobile-space 2 @@ -599,7 +599,7 @@ (dolist (gspace (list *dynamic* *static* *read-only* #+immobile-space *immobile-fixedobj* - #+immobile-space *immobile-varyobj*) + #+immobile-space *immobile-text*) (error "couldn't find a GSPACE for ~S" des)) ;; Bounds-check the descriptor against the allocated area ;; within each gspace. @@ -703,7 +703,7 @@ (let ((gspace (descriptor-intuit-gspace des))) (aver gspace) (when (or (eq gspace *immobile-fixedobj*) - (eq gspace *immobile-varyobj*)) + (eq gspace *immobile-text*)) sb-vm:+pseudo-static-generation+)) 0)) (widetag (logand header-word sb-vm:widetag-mask)) @@ -2685,7 +2685,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (stack (%fasl-input-stack (fasl-input))) (stack-index (fop-stack-pop-n stack stack-elts-consumed)) (des (allocate-cold-descriptor - (or #+immobile-code (and immobile *immobile-varyobj*) + (or #+immobile-code (and immobile *immobile-text*) *dynamic*) (+ (ash aligned-n-boxed-words sb-vm:word-shift) n-code-bytes) sb-vm:other-pointer-lowtag :code))) @@ -2772,7 +2772,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (n-fixup-elts (read-word-arg (fasl-input-stream))) (rounded-length (round-up length (* 2 sb-vm:n-word-bytes))) (header-n-words (sb-c::asm-routines-boxed-header-nwords)) - (space (or #+(and immobile-code (not metaspace)) *immobile-varyobj* + (space (or #+(and immobile-code (not metaspace)) *immobile-text* ;; If there is a read-only space, use it, else use static space. (if (> sb-vm:read-only-space-end sb-vm:read-only-space-start) *read-only* @@ -3736,7 +3736,7 @@ III. initially undefined function references (alphabetically): (write-word directory-core-entry-type-code) (let ((spaces (nconc (list *read-only* *static*) #+immobile-space - (list *immobile-fixedobj* *immobile-varyobj*) + (list *immobile-fixedobj* *immobile-text*) (list *dynamic*)))) ;; length = (5 words/space) * N spaces + 2 for header. (write-word (+ (* (length spaces) 5) 2)) @@ -3839,9 +3839,9 @@ III. initially undefined function references (alphabetically): immobile-fixedobj-core-space-id sb-vm:fixedobj-space-start)) #+immobile-space - (*immobile-varyobj* (make-gspace :immobile-varyobj - immobile-varyobj-core-space-id - sb-vm:varyobj-space-start)) + (*immobile-text* (make-gspace :immobile-text + immobile-text-core-space-id + sb-vm:text-space-start)) (*dynamic* (make-gspace :dynamic dynamic-core-space-id #+gencgc sb-vm:dynamic-space-start @@ -3894,7 +3894,7 @@ III. initially undefined function references (alphabetically): (cold-cons z z (ecase (gspace-name (descriptor-gspace *cold-assembler-obj*)) ((:read-only :static) *static*) - (:immobile-varyobj *dynamic*))))) + (:immobile-text *dynamic*))))) (init-runtime-routines)) ;; Initialize the *COLD-SYMBOLS* system with the information diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index 1d514450e0..76799549ba 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -470,9 +470,9 @@ during backtrace. ;; The following slot's existence must NOT be conditional on #+msan msan-param-tls) ; = &__msan_param_tls #+immobile-space '(function-layout - varyobj-space-addr - varyobj-card-count - varyobj-card-marks))) + text-space-addr + text-card-count + text-card-marks))) (macrolet ((assign-header-slot-indices () (let ((i 0)) diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 03a0d5454c..6a10ea239c 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -63,8 +63,8 @@ ;; And of course, don't use them if unsupported. ((:fixedobj-space-start fixedobj-space-start*)) ((:fixedobj-space-size fixedobj-space-size*) (* 24 1024 1024)) - ((:varyobj-space-start varyobj-space-start*)) - ((:varyobj-space-size varyobj-space-size*) (* 104 1024 1024)) + ((:text-space-start text-space-start*)) + ((:text-space-size text-space-size*) (* 104 1024 1024)) (small-space-size #x100000) ((:read-only-space-size ro-space-size) #+darwin-jit small-space-size @@ -92,7 +92,7 @@ (static-code ,small-space-size)) #+immobile-space `((fixedobj ,fixedobj-space-size*) - (varyobj ,varyobj-space-size*)))) + (text ,text-space-size*)))) (ptr small-spaces-start) (small-space-forms (loop for (space size var-name) in spaces @@ -102,7 +102,7 @@ ;; TODO: linkage-table could move with code, if the CPU ;; prefers PC-relative jumps, and we emit better code ;; (which we don't- for x86 we jmp via RBX always) - (member space '(fixedobj varyobj + (member space '(fixedobj text #-darwin-jit read-only))) (start ptr) (end (+ ptr size))) @@ -113,14 +113,14 @@ ;; Allow expressly given addresses / sizes for immobile space. ;; The addresses are for testing only - you should not need them. (case space - (varyobj (setq start (or varyobj-space-start* start) - end (+ start varyobj-space-size*))) + (text (setq start (or text-space-start* start) + end (+ start text-space-size*))) (fixedobj (setq start (or fixedobj-space-start* start) end (+ start fixedobj-space-size*)))) `(,(defconstantish relocatable start-sym start) ,(cond ((not relocatable) `(defconstant ,(symbolicate space "-SPACE-END") ,end)) - #-sb-xc-host ((eq space 'varyobj)) ; don't emit anything + #-sb-xc-host ((eq space 'text)) ; don't emit anything (t `(defconstant ,(symbolicate space "-SPACE-SIZE") ,(- end start))))))))))) diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index ce77ec4f6c..e3f60b49b2 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -3377,7 +3377,7 @@ (cond ((eq flavor :gc-barrier) (push offset imm-fixups)) ((and (memq flavor '(:named-call :layout :immobile-symbol :symbol-value ; -> fixedobj subspace - :assembly-routine :assembly-routine* :static-call)) ; -> varyobj subspace + :assembly-routine :assembly-routine* :static-call)) ; -> text subspace (eq kind :abs32)) #+immobile-space (push offset abs32-fixups)) ((and (eq flavor :foreign) (eq kind :rel32)) diff --git a/src/compiler/x86-64/parms.lisp b/src/compiler/x86-64/parms.lisp index 2618a9e24b..5e5fca2bb4 100644 --- a/src/compiler/x86-64/parms.lisp +++ b/src/compiler/x86-64/parms.lisp @@ -96,7 +96,7 @@ :read-only-space-size #+metaspace #.(* 2 1024 1024) #-metaspace 0 :fixedobj-space-size #.(* 40 1024 1024) - :varyobj-space-size #.(* 130 1024 1024) + :text-space-size #.(* 130 1024 1024) :dynamic-space-start #x1000000000) ;;; The default dynamic space size is lower on OpenBSD to allow SBCL to diff --git a/src/runtime/coalesce.c b/src/runtime/coalesce.c index defc86f8d7..738cdc3333 100644 --- a/src/runtime/coalesce.c +++ b/src/runtime/coalesce.c @@ -135,7 +135,7 @@ static void coalesce_obj(lispobj* where, struct hopscotch_table* ht) * * (1) gc-common's table-based mechanism * (2) gencgc's verify_range() - * (3) immobile space {fixedobj,varyobj}_points_to_younger_p() + * (3) immobile space {fixedobj,text}_points_to_younger_p() * and fixup_space() for defrag. [and the table-based thing is used too] * (4) fullcgc's trace_object() * (5) coreparse's relocate_space() @@ -214,7 +214,7 @@ void coalesce_similar_objects() #ifdef LISP_FEATURE_IMMOBILE_SPACE coalesce_range((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, arg); - coalesce_range((lispobj*)VARYOBJ_SPACE_START, varyobj_free_pointer, arg); + coalesce_range((lispobj*)TEXT_SPACE_START, text_space_highwatermark, arg); #endif #ifdef LISP_FEATURE_GENCGC walk_generation(coalesce_range, -1, arg); diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 7a833db157..80869bbffb 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -607,7 +607,7 @@ static void relocate_heap(struct heap_adjust* adj) adj); #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE - relocate_space(VARYOBJ_SPACE_START, varyobj_free_pointer, adj); + relocate_space(TEXT_SPACE_START, text_space_highwatermark, adj); #endif } @@ -626,7 +626,7 @@ void calc_asm_routine_bounds() else asm_routines_start = READ_ONLY_SPACE_START + (256+2)*N_WORD_BYTES; #elif defined LISP_FEATURE_IMMOBILE_CODE - asm_routines_start = VARYOBJ_SPACE_START; + asm_routines_start = TEXT_SPACE_START; #else if ((uword_t)read_only_space_free_pointer > READ_ONLY_SPACE_START && widetag_of((lispobj*)READ_ONLY_SPACE_START) == CODE_HEADER_WIDETAG) { @@ -650,7 +650,7 @@ void calc_immobile_space_bounds() { /* Suppose we have: * A B C D - * | varyobj space | .... other random stuff ... | fixedobj space | ... + * | text space | .... other random stuff ... | fixedobj space | ... * then the lower bound is A, the upper bound is D, * the max_offset is the distance from A to D, * and the excluded middle is the range spanned by B to C. @@ -661,7 +661,7 @@ void calc_immobile_space_bounds() struct range range1 = {FIXEDOBJ_SPACE_START, FIXEDOBJ_SPACE_START + FIXEDOBJ_SPACE_SIZE}; struct range range2 = - {VARYOBJ_SPACE_START, VARYOBJ_SPACE_START + varyobj_space_size}; + {TEXT_SPACE_START, TEXT_SPACE_START + text_space_size}; if (range2.start < range1.start) { // swap struct range temp = range1; range1 = range2; @@ -732,23 +732,23 @@ process_directory(int count, struct ndir_entry *entry, #ifdef LISP_FEATURE_IMMOBILE_SPACE {FIXEDOBJ_SPACE_SIZE | 1, 0, FIXEDOBJ_SPACE_START, &fixedobj_free_pointer}, - {1, 0, VARYOBJ_SPACE_START, &varyobj_free_pointer} + {1, 0, TEXT_SPACE_START, &text_space_highwatermark} #endif }; #if ELFCORE if (&lisp_code_start) { - VARYOBJ_SPACE_START = (uword_t)&lisp_code_start; - varyobj_free_pointer = &lisp_jit_code; - varyobj_space_size = (uword_t)&lisp_code_end - VARYOBJ_SPACE_START; - spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].len = varyobj_space_size; - if (varyobj_free_pointer < (lispobj*)VARYOBJ_SPACE_START + TEXT_SPACE_START = (uword_t)&lisp_code_start; + text_space_highwatermark = &lisp_jit_code; + text_space_size = (uword_t)&lisp_code_end - TEXT_SPACE_START; + spaces[IMMOBILE_TEXT_CORE_SPACE_ID].len = text_space_size; + if (text_space_highwatermark < (lispobj*)TEXT_SPACE_START || !PTR_IS_ALIGNED(&lisp_code_end, 4096)) lose("ELF core alignment bug. Check for proper padding in 'editcore'"); #ifdef DEBUG_COREPARSE printf("Lisp code present in executable @ %lx:%lx (freeptr=%p)\n", (uword_t)&lisp_code_start, (uword_t)&lisp_code_end, - varyobj_free_pointer); + text_space_highwatermark); #endif // Prefill the Lisp linkage table so that shrinkwrapped executables which link in // all their C library dependencies can avoid linking with -ldl. @@ -775,12 +775,12 @@ process_directory(int count, struct ndir_entry *entry, } // unprotect the pages - os_protect((void*)VARYOBJ_SPACE_START, varyobj_space_size, OS_VM_PROT_ALL); + os_protect((void*)TEXT_SPACE_START, text_space_size, OS_VM_PROT_ALL); } else #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE { - spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].desired_size += VARYOBJ_SPACE_SIZE; + spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].desired_size += TEXT_SPACE_SIZE; } #endif @@ -839,7 +839,7 @@ process_directory(int count, struct ndir_entry *entry, int sub_2gb_flag = (request & 1); request &= ~(size_t)1; #ifdef LISP_FEATURE_IMMOBILE_SPACE - if (id == IMMOBILE_VARYOBJ_CORE_SPACE_ID) + if (id == IMMOBILE_TEXT_CORE_SPACE_ID) // Pretend an os_validate() happened based on the address that // would be obtained by a constant offset from fixedobj space addr = FIXEDOBJ_SPACE_START + FIXEDOBJ_SPACE_SIZE; @@ -873,13 +873,13 @@ process_directory(int count, struct ndir_entry *entry, #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE case IMMOBILE_FIXEDOBJ_CORE_SPACE_ID: - case IMMOBILE_VARYOBJ_CORE_SPACE_ID: + case IMMOBILE_TEXT_CORE_SPACE_ID: if (addr + request > 0x80000000) lose("Won't map immobile space above 2GB"); if (id == IMMOBILE_FIXEDOBJ_CORE_SPACE_ID) FIXEDOBJ_SPACE_START = addr; else - VARYOBJ_SPACE_START = addr; + TEXT_SPACE_START = addr; break; #endif case DYNAMIC_CORE_SPACE_ID: @@ -950,7 +950,7 @@ process_directory(int count, struct ndir_entry *entry, lispobj *free_pointer = (lispobj *) addr + entry->nwords; switch (id) { default: - // varyobj free ptr is already nonzero if Lisp code in executable + // text free ptr is already nonzero if Lisp code in executable if (!*spaces[id].pfree_pointer) *spaces[id].pfree_pointer = free_pointer; break; @@ -985,19 +985,19 @@ process_directory(int count, struct ndir_entry *entry, spaces[DYNAMIC_CORE_SPACE_ID].len); #endif // LISP_FEATURE_GENCGC #ifdef LISP_FEATURE_IMMOBILE_SPACE - if (lisp_code_in_elf() && VARYOBJ_SPACE_START != spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].base) { + if (lisp_code_in_elf() && TEXT_SPACE_START != spaces[IMMOBILE_TEXT_CORE_SPACE_ID].base) { lose("code-in-elf + PIE not supported"); } set_adjustment(adj, FIXEDOBJ_SPACE_START, // actual spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].base, // expected spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].len); - if (!apply_pie_relocs(VARYOBJ_SPACE_START - - spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].base, + if (!apply_pie_relocs(TEXT_SPACE_START + - spaces[IMMOBILE_TEXT_CORE_SPACE_ID].base, DYNAMIC_SPACE_START - spaces[DYNAMIC_CORE_SPACE_ID].base, fd)) - set_adjustment(adj, VARYOBJ_SPACE_START, // actual - spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].base, // expected - spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].len); + set_adjustment(adj, TEXT_SPACE_START, // actual + spaces[IMMOBILE_TEXT_CORE_SPACE_ID].base, // expected + spaces[IMMOBILE_TEXT_CORE_SPACE_ID].len); #endif if (adj->n_ranges) relocate_heap(adj); @@ -1007,7 +1007,7 @@ process_directory(int count, struct ndir_entry *entry, * This used to depend critically on space relocation already having been performed. * It doesn't any more, but this is an OK time to do it */ immobile_space_coreparse(spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].len, - spaces[IMMOBILE_VARYOBJ_CORE_SPACE_ID].len); + spaces[IMMOBILE_TEXT_CORE_SPACE_ID].len); calc_immobile_space_bounds(); #endif #ifdef LISP_FEATURE_X86_64 diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 7466dec228..6238600fbb 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -157,7 +157,7 @@ static inline lispobj canonical_ptr(lispobj pointer) return pointer; } -sword_t fixedobj_index_bit_bias, varyobj_index_bit_bias; +sword_t fixedobj_index_bit_bias, text_index_bit_bias; uword_t *fullcgcmarks; static size_t markbits_size; static inline sword_t ptr_to_bit_index(lispobj pointer) { @@ -167,8 +167,8 @@ static inline sword_t ptr_to_bit_index(lispobj pointer) { #ifdef LISP_FEATURE_IMMOBILE_SPACE p = find_fixedobj_page_index((void*)pointer); if (p >= 0) return dword_index(pointer, FIXEDOBJ_SPACE_START) + fixedobj_index_bit_bias; - p = find_varyobj_page_index((void*)pointer); - if (p >= 0) return dword_index(pointer, VARYOBJ_SPACE_START) + varyobj_index_bit_bias; + p = find_text_page_index((void*)pointer); + if (p >= 0) return dword_index(pointer, TEXT_SPACE_START) + text_index_bit_bias; #endif return -1; } @@ -402,10 +402,10 @@ void prepare_for_full_mark_phase() sword_t nbits_dynamic = (next_free_page*GENCGC_PAGE_BYTES) / (2*N_WORD_BYTES); #ifdef LISP_FEATURE_IMMOBILE_SPACE sword_t nbits_fixedobj = FIXEDOBJ_SPACE_SIZE / (2*N_WORD_BYTES); - sword_t nbits_varyobj = VARYOBJ_SPACE_SIZE / (2*N_WORD_BYTES); + sword_t nbits_text = TEXT_SPACE_SIZE / (2*N_WORD_BYTES); fixedobj_index_bit_bias = nbits_dynamic; - varyobj_index_bit_bias = fixedobj_index_bit_bias + nbits_fixedobj; - sword_t nbytes = (nbits_dynamic + nbits_fixedobj + nbits_varyobj) / 8; + text_index_bit_bias = fixedobj_index_bit_bias + nbits_fixedobj; + sword_t nbytes = (nbits_dynamic + nbits_fixedobj + nbits_text) / 8; #else sword_t nbytes = nbits_dynamic / 8; #endif @@ -572,9 +572,9 @@ static uword_t sweep(lispobj* where, lispobj* end, sword_t bitmap_index_bias = 0; #ifdef LISP_FEATURE_IMMOBILE_SPACE if (find_page_index(where) < 0) { - gc_assert(find_varyobj_page_index(where) >= 0); - space_base = VARYOBJ_SPACE_START; - bitmap_index_bias = varyobj_index_bit_bias; + gc_assert(find_text_page_index(where) >= 0); + space_base = TEXT_SPACE_START; + bitmap_index_bias = text_index_bit_bias; } #endif for ( ; where < end ; where += nwords ) { @@ -623,8 +623,8 @@ void execute_full_sweep_phase() #ifdef LISP_FEATURE_IMMOBILE_SPACE if (sweeplog) fprintf(sweeplog, "-- fixedobj space --\n"); sweep_fixedobj_pages(); - if (sweeplog) fprintf(sweeplog, "-- varyobj space --\n"); - sweep((lispobj*)VARYOBJ_SPACE_START, varyobj_free_pointer, + if (sweeplog) fprintf(sweeplog, "-- text space --\n"); + sweep((lispobj*)TEXT_SPACE_START, text_space_highwatermark, (uword_t)words_zeroed); #endif if (sweeplog) fprintf(sweeplog, "-- dynamic space --\n"); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index fc601fcc63..cbc4bf2dda 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -399,8 +399,8 @@ int count_immobile_objects(__attribute__((unused)) int gen, int res[5]) } where += object_size(where); } - where = (lispobj*)VARYOBJ_SPACE_START; - end = varyobj_free_pointer; + where = (lispobj*)TEXT_SPACE_START; + end = text_space_highwatermark; while (where < end) { if (immobile_obj_generation(where) == gen && widetag_of(where) == CODE_HEADER_WIDETAG @@ -4870,7 +4870,7 @@ void gc_allocate_ptes() gcbarrier_patch_code_range(STATIC_SPACE_START, static_space_free_pointer); gcbarrier_patch_code_range(DYNAMIC_SPACE_START, (lispobj*)dynamic_space_highwatermark()); #ifdef LISP_FEATURE_IMMOBILE_SPACE - gcbarrier_patch_code_range(VARYOBJ_SPACE_START, varyobj_free_pointer); + gcbarrier_patch_code_range(TEXT_SPACE_START, text_space_highwatermark); #endif #endif } diff --git a/src/runtime/globals.c b/src/runtime/globals.c index eb209ba809..e994fa9a01 100644 --- a/src/runtime/globals.c +++ b/src/runtime/globals.c @@ -58,7 +58,7 @@ lispobj *static_code_space_free_pointer; #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE -lispobj *varyobj_free_pointer; +lispobj *text_space_highwatermark; lispobj *fixedobj_free_pointer; #endif os_vm_address_t anon_dynamic_space_start; diff --git a/src/runtime/globals.h b/src/runtime/globals.h index 15b90d8983..4bb8ea9fe6 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -54,10 +54,10 @@ extern uword_t DYNAMIC_0_SPACE_START, DYNAMIC_1_SPACE_START; extern uword_t DYNAMIC_SPACE_START; #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE -extern uword_t FIXEDOBJ_SPACE_START, VARYOBJ_SPACE_START; +extern uword_t FIXEDOBJ_SPACE_START, TEXT_SPACE_START; extern uword_t immobile_space_lower_bound, immobile_space_max_offset; extern uword_t immobile_range_1_max_offset, immobile_range_2_min_offset; -extern unsigned int varyobj_space_size; +extern unsigned int text_space_size; #endif extern uword_t asm_routines_start, asm_routines_end; extern int gc_card_table_nbits; @@ -99,7 +99,7 @@ lispobj *static_code_space_free_pointer; #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE -extern lispobj *varyobj_free_pointer; +extern lispobj *text_space_highwatermark; extern lispobj *fixedobj_free_pointer; #endif extern os_vm_address_t anon_dynamic_space_start; diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index c8fb70b88a..691e366252 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -81,10 +81,10 @@ FILE * logfile; static void defrag_immobile_space(boolean verbose); -uword_t FIXEDOBJ_SPACE_START, VARYOBJ_SPACE_START; +uword_t FIXEDOBJ_SPACE_START, TEXT_SPACE_START; uword_t immobile_space_lower_bound, immobile_space_max_offset; uword_t immobile_range_1_max_offset, immobile_range_2_min_offset; -unsigned int varyobj_space_size = VARYOBJ_SPACE_SIZE; +unsigned int text_space_size = TEXT_SPACE_SIZE; // This table is for objects fixed in size, as opposed to variable-sized. // (Immobile objects are naturally fixed in placement) @@ -128,28 +128,28 @@ static inline lispobj* compute_fixedobj_limit(void* base, int spacing_bytes) { /// Variable-length pages: // Array of inverted write-protect flags, 1 bit per page. -unsigned int* varyobj_page_touched_bits; +unsigned int* text_page_touched_bits; static int n_bitmap_elts; // length of array measured in 'int's boolean immobile_card_protected_p(void* addr) { low_page_index_t page; - page = find_varyobj_page_index(addr); - if (page >= 0) return !((varyobj_page_touched_bits[page/32] >> (page&31)) & 1); + page = find_text_page_index(addr); + if (page >= 0) return !((text_page_touched_bits[page/32] >> (page&31)) & 1); page = find_fixedobj_page_index(addr); if (page >= 0) return fixedobj_page_wp(page); lose("immobile_card_protected_p(%p)", addr); } -struct varyobj_page *varyobj_pages; +struct text_page *text_pages; // Holes to be stuffed back into the managed free list. -lispobj varyobj_holes; +lispobj text_holes; -#define varyobj_page_touched(x) ((varyobj_page_touched_bits[x/32] >> (x&31)) & 1) +#define text_page_touched(x) ((text_page_touched_bits[x/32] >> (x&31)) & 1) #ifdef VERIFY_PAGE_GENS void check_fixedobj_page(low_page_index_t, generation_index_t, generation_index_t); -void check_varyobj_pages(); +void check_text_pages(); #endif //// Variable-length utilities @@ -163,11 +163,11 @@ void check_varyobj_pages(); as all headers on the page are accounted for in the page generation mask. Also an empty page (where scan start is zero) avoids looking at the next page's first object by accident via the same test. */ -unsigned char varyobj_page_gens_augmented(low_page_index_t page_index) +unsigned char text_page_gens_augmented(low_page_index_t page_index) { - return (varyobj_pages[page_index].scan_start_offset <= DOUBLEWORDS_PER_PAGE - ? 0 : (1<<immobile_obj_generation(varyobj_scan_start(page_index)))) - | varyobj_pages[page_index].generations; + return (text_pages[page_index].scan_start_offset <= DOUBLEWORDS_PER_PAGE + ? 0 : (1<<immobile_obj_generation(text_page_scan_start(page_index)))) + | text_pages[page_index].generations; } //// Fixed-length object allocator @@ -355,7 +355,7 @@ Threads A, and B, and C each want to claim index 6. // Find the high water marks for this GC scavenge phase // (avoid passing exactly IMMOBILE_SPACE_END, which has no page index) #define calc_max_used_fixedobj_page() find_fixedobj_page_index(fixedobj_free_pointer-1) -#define calc_max_used_varyobj_page() find_varyobj_page_index(varyobj_free_pointer-1) +#define calc_max_used_text_page() find_text_page_index(text_space_highwatermark-1) /* Turn a white object grey. Also enqueue the object for re-scan if required */ void @@ -372,13 +372,13 @@ enliven_immobile_obj(lispobj *ptr, int rescan) // a native pointer bits |= OBJ_WRITTEN_FLAG; assign_generation(ptr, bits | new_space); low_page_index_t page_index = find_fixedobj_page_index(ptr); - boolean varyobj = 0; + boolean is_text = 0; if (page_index < 0) { - page_index = find_varyobj_page_index(ptr); + page_index = find_text_page_index(ptr); gc_assert(page_index >= 0); - varyobj_pages[page_index].generations |= 1<<new_space; - varyobj = 1; + text_pages[page_index].generations |= 1<<new_space; + is_text = 1; } else { fixedobj_pages[page_index].gens |= 1<<new_space; } @@ -387,8 +387,8 @@ enliven_immobile_obj(lispobj *ptr, int rescan) // a native pointer // is cleared so that the page is not skipped during root scan. if (!rescan) { if (pointerish) { - if (varyobj) - varyobj_page_touched_bits[page_index/32] |= 1U << (page_index & 31); + if (is_text) + text_page_touched_bits[page_index/32] |= 1U << (page_index & 31); else SET_WP_FLAG(page_index, WRITE_PROTECT_CLEARED); } @@ -418,17 +418,17 @@ boolean immobile_space_preserve_pointer(void* addr) unsigned char genmask = compacting_p() ? 1<<from_space : 0xff; lispobj* object_start; int valid = 0; - low_page_index_t page_index = find_varyobj_page_index(addr); + low_page_index_t page_index = find_text_page_index(addr); if (page_index >= 0) { - // Restrict addr to lie below 'varyobj_free_pointer'. + // Restrict addr to lie below 'text_space_highwatermark'. // This way, if the gens byte is nonzero but there is // a final array acting as filler on the remainder of the // final page, we won't accidentally find that. lispobj* scan_start; - valid = addr < (void*)varyobj_free_pointer - && (varyobj_page_gens_augmented(page_index) & genmask) - && (scan_start = varyobj_scan_start(page_index)) <= (lispobj*)addr + valid = addr < (void*)text_space_highwatermark + && (text_page_gens_augmented(page_index) & genmask) + && (scan_start = text_page_scan_start(page_index)) <= (lispobj*)addr && (object_start = gc_search_space(scan_start, addr)) != 0 /* gc_search_space can return filler objects, unlike * search_immobile_space which can not */ @@ -490,16 +490,16 @@ static void full_scavenge_immobile_newspace() // Variable-size object pages - low_page_index_t max_used_varyobj_page = calc_max_used_varyobj_page(); + low_page_index_t max_used_text_page = calc_max_used_text_page(); page = -1; // -1 because of pre-increment while (1) { // Find the next page with anything in newspace. do { - if (++page > max_used_varyobj_page) return; - } while ((varyobj_pages[page].generations & bit) == 0); - lispobj* obj = varyobj_scan_start(page); + if (++page > max_used_text_page) return; + } while ((text_pages[page].generations & bit) == 0); + lispobj* obj = text_page_scan_start(page); do { - lispobj* limit = (lispobj*)varyobj_page_address(page) + WORDS_PER_PAGE; + lispobj* limit = (lispobj*)text_page_address(page) + WORDS_PER_PAGE; int n_words; for ( ; obj < limit ; obj += n_words ) { lispobj header = *obj; @@ -510,12 +510,12 @@ static void full_scavenge_immobile_newspace() n_words = headerobj_size2(obj, header); } } - page = find_varyobj_page_index(obj); + page = find_text_page_index(obj); // Bail out if exact absolute end of immobile space was reached. if (page < 0) return; // If 'page' should be scanned, then pick up where we left off, // without recomputing 'obj' but setting a higher 'limit'. - } while (varyobj_pages[page].generations & bit); + } while (text_pages[page].generations & bit); } } @@ -569,7 +569,7 @@ void scavenge_immobile_newspace() // Return a page >= page_index having potential old->young pointers, // or -1 if there isn't one. -static int next_varyobj_root_page(unsigned int page_index, +static int next_text_root_page(unsigned int page_index, unsigned int end_bitmap_index, unsigned char genmask) { @@ -577,12 +577,12 @@ static int next_varyobj_root_page(unsigned int page_index, if (map_index >= end_bitmap_index) return -1; int bit_index = page_index & 31; // Look only at bits of equal or greater weight than bit_index. - unsigned int word = (0xFFFFFFFFU << bit_index) & varyobj_page_touched_bits[map_index]; + unsigned int word = (0xFFFFFFFFU << bit_index) & text_page_touched_bits[map_index]; while (1) { if (word) { bit_index = ffs(word) - 1; page_index = map_index * 32 + bit_index; - if (varyobj_page_gens_augmented(page_index) & genmask) + if (text_page_gens_augmented(page_index) & genmask) return page_index; else { word ^= (1U<<bit_index); @@ -590,7 +590,7 @@ static int next_varyobj_root_page(unsigned int page_index, } } if (++map_index >= end_bitmap_index) return -1; - word = varyobj_page_touched_bits[map_index]; + word = text_page_touched_bits[map_index]; } } @@ -622,14 +622,14 @@ scavenge_immobile_roots(generation_index_t min_gen, generation_index_t max_gen) } // Variable-length object pages - low_page_index_t max_used_varyobj_page = calc_max_used_varyobj_page(); - unsigned n_varyobj_pages = 1+max_used_varyobj_page; - unsigned end_bitmap_index = (n_varyobj_pages+31)/32; - page = next_varyobj_root_page(0, end_bitmap_index, genmask); + low_page_index_t max_used_text_page = calc_max_used_text_page(); + unsigned n_text_pages = 1+max_used_text_page; + unsigned end_bitmap_index = (n_text_pages+31)/32; + page = next_text_root_page(0, end_bitmap_index, genmask); while (page >= 0) { - lispobj* obj = varyobj_scan_start(page); + lispobj* obj = text_page_scan_start(page); do { - lispobj* limit = (lispobj*)varyobj_page_address(page) + WORDS_PER_PAGE; + lispobj* limit = (lispobj*)text_page_address(page) + WORDS_PER_PAGE; int n_words, gen; for ( ; obj < limit ; obj += n_words ) { lispobj header = *obj; @@ -642,17 +642,17 @@ scavenge_immobile_roots(generation_index_t min_gen, generation_index_t max_gen) n_words = headerobj_size2(obj, header); } } - page = find_varyobj_page_index(obj); + page = find_text_page_index(obj); } while (page > 0 - && (varyobj_pages[page].generations & genmask) - && varyobj_page_touched(page)); + && (text_pages[page].generations & genmask) + && text_page_touched(page)); if (page < 0) break; - page = next_varyobj_root_page(1+page, end_bitmap_index, genmask); + page = next_text_root_page(1+page, end_bitmap_index, genmask); } if (sb_sprof_enabled) { // Make another pass over all code and enliven all of 'from_space' - lispobj* where = (lispobj*)VARYOBJ_SPACE_START; - lispobj* limit = varyobj_free_pointer; + lispobj* where = (lispobj*)TEXT_SPACE_START; + lispobj* limit = text_space_highwatermark; while (where < limit) { if (widetag_of(where) == CODE_HEADER_WIDETAG && immobile_obj_gen_bits(where) == from_space @@ -776,7 +776,7 @@ fixedobj_points_to_younger_p(lispobj* obj, int n_words, } static boolean -varyobj_points_to_younger_p(lispobj* obj, int gen, int keep_gen, int new_gen, +text_points_to_younger_p(lispobj* obj, int gen, int keep_gen, int new_gen, os_vm_address_t page_begin, os_vm_address_t page_end) // upper (exclusive) bound { @@ -788,7 +788,7 @@ varyobj_points_to_younger_p(lispobj* obj, int gen, int keep_gen, int new_gen, widetag == FUNCALLABLE_INSTANCE_WIDETAG) { // both of these have non-descriptor bits in at least one word, // thus precluding a simple range scan. - // Due to ignored address bounds, in the rare case of a FIN or fdefn in varyobj + // Due to ignored address bounds, in the rare case of a FIN or fdefn in text // subspace and spanning cards, we might say that neither card can be protected, // when one or the other could be. Not a big deal. return fixedobj_points_to_younger_p(obj, sizetab[widetag](obj), @@ -842,15 +842,15 @@ static inline boolean can_wp_fixedobj_page(page_index_t page, int keep_gen, int // or after it, and then restricting points_to_younger within the boundaries. // Doing it this way is probably much better than conservatively assuming // that any word satisfying is_lisp_pointer() is a pointer. -static inline boolean can_wp_varyobj_page(page_index_t page, int keep_gen, int new_gen) +static inline boolean can_wp_text_page(page_index_t page, int keep_gen, int new_gen) { - lispobj *begin = varyobj_page_address(page); + lispobj *begin = text_page_address(page); lispobj *end = begin + WORDS_PER_PAGE; - lispobj *obj = varyobj_scan_start(page); + lispobj *obj = text_page_scan_start(page); for ( ; obj < end ; obj += headerobj_size(obj) ) { gc_assert(other_immediate_lowtag_p(*obj)); if (!filler_obj_p(obj) && - varyobj_points_to_younger_p(obj, + text_points_to_younger_p(obj, immobile_obj_generation(obj), keep_gen, new_gen, (os_vm_address_t)begin, @@ -999,8 +999,8 @@ static void make_filler(void* where, int nbytes) code->header = ((uword_t)nbytes << (CODE_HEADER_SIZE_SHIFT-WORD_SHIFT)) | CODE_HEADER_WIDETAG; code->boxed_size = 0; - code->debug_info = varyobj_holes; - varyobj_holes = (lispobj)code; + code->debug_info = text_holes; + text_holes = (lispobj)code; } } @@ -1008,32 +1008,32 @@ static void make_filler(void* where, int nbytes) // Lisp is responsible for consuming the free space // when it next allocates a variable-size object. static void -sweep_varyobj_pages(int raise) +sweep_text_pages(int raise) { SETUP_GENS(); - low_page_index_t max_used_varyobj_page = calc_max_used_varyobj_page(); - lispobj* free_pointer = varyobj_free_pointer; + low_page_index_t max_used_text_page = calc_max_used_text_page(); + lispobj* free_pointer = text_space_highwatermark; low_page_index_t page; - for (page = 0; page <= max_used_varyobj_page; ++page) { - int genmask = varyobj_pages[page].generations; + for (page = 0; page <= max_used_text_page; ++page) { + int genmask = text_pages[page].generations; if (!(genmask & relevant_genmask)) { // Has nothing in oldspace or newspace. // Scan for old->young pointers, and WP if there are none. - if (ENABLE_PAGE_PROTECTION && varyobj_page_touched(page) - && varyobj_page_gens_augmented(page) > 1 - && can_wp_varyobj_page(page, keep_gen, new_gen)) { - varyobj_page_touched_bits[page/32] &= ~(1U<<(page & 31)); + if (ENABLE_PAGE_PROTECTION && text_page_touched(page) + && text_page_gens_augmented(page) > 1 + && can_wp_text_page(page, keep_gen, new_gen)) { + text_page_touched_bits[page/32] &= ~(1U<<(page & 31)); } continue; } - lispobj* page_base = varyobj_page_address(page); + lispobj* page_base = text_page_address(page); lispobj* limit = page_base + WORDS_PER_PAGE; if (limit > free_pointer) limit = free_pointer; int any_kept = 0; // was anything moved to the kept generation // wp_it is 1 if we should try to write-protect it now. // If already write-protected, skip the tests. - int wp_it = ENABLE_PAGE_PROTECTION && varyobj_page_touched(page); - lispobj* obj = varyobj_scan_start(page); + int wp_it = ENABLE_PAGE_PROTECTION && text_page_touched(page); + lispobj* obj = text_page_scan_start(page); int size, gen; if (obj < page_base) { @@ -1047,7 +1047,7 @@ sweep_varyobj_pages(int raise) // than the generation that we're moving retained objects into && (gen = immobile_obj_gen_bits(obj)) > new_gen // and it contains an old->young pointer - && varyobj_points_to_younger_p(obj, gen, keep_gen, new_gen, + && text_points_to_younger_p(obj, gen, keep_gen, new_gen, (os_vm_address_t)page_base, (os_vm_address_t)limit)) { wp_it = 0; @@ -1074,21 +1074,21 @@ sweep_varyobj_pages(int raise) } else if (gen == keep_gen) { assign_generation(obj, gen = new_gen); #ifdef DEBUG - gc_assert(!varyobj_points_to_younger_p(obj, gen, keep_gen, new_gen, + gc_assert(!text_points_to_younger_p(obj, gen, keep_gen, new_gen, (os_vm_address_t)page_base, (os_vm_address_t)limit)); #endif any_kept = -1; } else if (wp_it && - varyobj_points_to_younger_p(obj, gen, keep_gen, new_gen, + text_points_to_younger_p(obj, gen, keep_gen, new_gen, (os_vm_address_t)page_base, (os_vm_address_t)limit)) wp_it = 0; } - COMPUTE_NEW_MASK(mask, varyobj_pages[page].generations); - varyobj_pages[page].generations = mask; + COMPUTE_NEW_MASK(mask, text_pages[page].generations); + text_pages[page].generations = mask; if ( mask && wp_it ) - varyobj_page_touched_bits[page/32] &= ~(1U << (page & 31)); + text_page_touched_bits[page/32] &= ~(1U << (page & 31)); } } @@ -1102,7 +1102,7 @@ sweep_immobile_space(int raise) { gc_assert(immobile_scav_queue_count == 0); sweep_fixedobj_pages(raise); - sweep_varyobj_pages(raise); + sweep_text_pages(raise); } void gc_init_immobile() @@ -1111,17 +1111,17 @@ void gc_init_immobile() logfile = stderr; #endif int n_fixedobj_pages = FIXEDOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; - int n_varyobj_pages = VARYOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; + int n_text_pages = TEXT_SPACE_SIZE / IMMOBILE_CARD_BYTES; fixedobj_pages = calloc(n_fixedobj_pages, sizeof(struct fixedobj_page)); gc_assert(fixedobj_pages); - n_bitmap_elts = ALIGN_UP(n_varyobj_pages, 32) / 32; - int request = n_bitmap_elts * sizeof (int) + n_varyobj_pages * sizeof (int); - varyobj_page_touched_bits = (unsigned int*)calloc(1, request); - gc_assert(varyobj_page_touched_bits); + n_bitmap_elts = ALIGN_UP(n_text_pages, 32) / 32; + int request = n_bitmap_elts * sizeof (int) + n_text_pages * sizeof (int); + text_page_touched_bits = (unsigned int*)calloc(1, request); + gc_assert(text_page_touched_bits); // The conservative value for 'touched' is 1. - memset(varyobj_page_touched_bits, 0xff, n_bitmap_elts * sizeof (int)); - varyobj_pages = (struct varyobj_page*)(varyobj_page_touched_bits + n_bitmap_elts); + memset(text_page_touched_bits, 0xff, n_bitmap_elts * sizeof (int)); + text_pages = (struct text_page*)(text_page_touched_bits + n_bitmap_elts); // Scav queue is arbitrarily located. immobile_scav_queue = malloc(QCAPACITY * sizeof(lispobj)); } @@ -1130,7 +1130,7 @@ void gc_init_immobile() static int page_attributes_valid; // Set the characteristics of each used page at image startup time. -void immobile_space_coreparse(uword_t fixedobj_len, uword_t varyobj_len) +void immobile_space_coreparse(uword_t fixedobj_len, uword_t text_len) { int n_pages, word_idx, page; generation_index_t gen = CORE_PAGE_GENERATION; @@ -1146,8 +1146,8 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t varyobj_len) if (!fixnump(*where)) assign_generation(where, gen); where += object_size(where); } - where = (lispobj*)VARYOBJ_SPACE_START; - end = (lispobj*)((char*)where + varyobj_len); + where = (lispobj*)TEXT_SPACE_START; + end = (lispobj*)((char*)where + text_len); while (where < end) { if (!filler_obj_p(where)) assign_generation(where, gen); where += object_size(where); @@ -1183,44 +1183,44 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t varyobj_len) } } } - if (!VARYOBJ_SPACE_START) { + if (!TEXT_SPACE_START) { // Don't use the space. Free pointer was initialized to the nominal // base address. Set the start to that also so that map-objects-in-range - // sees no used space, and find_varyobj_page_index() returns -1; - VARYOBJ_SPACE_START = (uword_t)varyobj_free_pointer; - varyobj_space_size = 0; + // sees no used space, and find_text_page_index() returns -1; + TEXT_SPACE_START = (uword_t)text_space_highwatermark; + text_space_size = 0; page_attributes_valid = 1; // make search_immobile_space() work right return; } - uword_t address = VARYOBJ_SPACE_START; - n_pages = varyobj_len / IMMOBILE_CARD_BYTES; + uword_t address = TEXT_SPACE_START; + n_pages = text_len / IMMOBILE_CARD_BYTES; lispobj* obj = (lispobj*)address; int n_words; low_page_index_t last_page = 0; - // coreparse() already set varyobj_free_pointer - lispobj* limit = varyobj_free_pointer; + // coreparse() already set text_space_highwatermark + lispobj* limit = text_space_highwatermark; gc_assert(limit != 0 /* would be zero if not mmapped yet */ - && limit <= (lispobj*)(address + varyobj_len)); + && limit <= (lispobj*)(address + text_len)); for ( ; obj < limit ; obj += n_words ) { gc_assert(other_immediate_lowtag_p(obj[0])); n_words = headerobj_size(obj); if (filler_obj_p(obj)) { // Holes were chained through the debug_info slot at save. // Just update the head of the chain. - varyobj_holes = (lispobj)obj; + text_holes = (lispobj)obj; continue; } - low_page_index_t first_page = find_varyobj_page_index(obj); - last_page = find_varyobj_page_index(obj+n_words-1); + low_page_index_t first_page = find_text_page_index(obj); + last_page = find_text_page_index(obj+n_words-1); // Only the page with this object header gets a bit in its gen mask. - varyobj_pages[first_page].generations |= 1<<immobile_obj_gen_bits(obj); + text_pages[first_page].generations |= 1<<immobile_obj_gen_bits(obj); // For each page touched by this object, set the page's // scan_start_offset, unless it was already set. int page; for (page = first_page ; page <= last_page ; ++page) { - if (!varyobj_pages[page].scan_start_offset) { - long offset = (char*)varyobj_page_address(page+1) - (char*)obj; - varyobj_pages[page].scan_start_offset = offset >> (WORD_SHIFT + 1); + if (!text_pages[page].scan_start_offset) { + long offset = (char*)text_page_address(page+1) - (char*)obj; + text_pages[page].scan_start_offset = offset >> (WORD_SHIFT + 1); } } } @@ -1247,7 +1247,7 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t varyobj_len) if (gen != 0 && ENABLE_PAGE_PROTECTION) { low_page_index_t page; for (page = 0 ; page <= last_page ; ++page) - varyobj_page_touched_bits[page/32] &= ~(1U<<(page & 31)); + text_page_touched_bits[page/32] &= ~(1U<<(page & 31)); } page_attributes_valid = 1; } @@ -1278,12 +1278,12 @@ void prepare_immobile_space_for_final_gc() } } - lispobj* obj = (lispobj*)VARYOBJ_SPACE_START; - lispobj* limit = varyobj_free_pointer; + lispobj* obj = (lispobj*)TEXT_SPACE_START; + lispobj* limit = text_space_highwatermark; for ( ; obj < limit ; obj += headerobj_size(obj) ) { if (!filler_obj_p(obj) && immobile_obj_gen_bits(obj) != 0) { assign_generation(obj, 0); - varyobj_pages[find_varyobj_page_index(obj)].generations = 1; + text_pages[find_text_page_index(obj)].generations = 1; } } } @@ -1310,14 +1310,14 @@ void prepare_immobile_space_for_save(boolean verbose) obj += object_size(obj); } - obj = (lispobj*)VARYOBJ_SPACE_START; - limit = varyobj_free_pointer; - for ( varyobj_holes = 0 ; obj < limit ; obj += headerobj_size(obj) ) { + obj = (lispobj*)TEXT_SPACE_START; + limit = text_space_highwatermark; + for ( text_holes = 0 ; obj < limit ; obj += headerobj_size(obj) ) { if (filler_obj_p(obj)) { struct code* code = (struct code*)obj; - code->debug_info = varyobj_holes; + code->debug_info = text_holes; code->fixups = 0; - varyobj_holes = (lispobj)code; + text_holes = (lispobj)code; // 0-fill the unused space. int nwords = headerobj_size(obj); memset(code->constants, 0, @@ -1353,7 +1353,7 @@ int immobile_space_handle_wp_violation(void* fault_addr) static struct tempspace { char* start; int n_bytes; -} fixedobj_tempspace, varyobj_tempspace; +} fixedobj_tempspace, text_tempspace; // Find the object that encloses pointer. lispobj * @@ -1361,14 +1361,14 @@ search_immobile_space(void *pointer) { lispobj *start; - if ((void*)VARYOBJ_SPACE_START <= pointer - && pointer < (void*)varyobj_free_pointer) { - low_page_index_t page_index = find_varyobj_page_index(pointer); + if ((void*)TEXT_SPACE_START <= pointer + && pointer < (void*)text_space_highwatermark) { + low_page_index_t page_index = find_text_page_index(pointer); if (page_attributes_valid) { - start = varyobj_scan_start(page_index); + start = text_page_scan_start(page_index); if (start > (lispobj*)pointer) return NULL; } else { - start = (lispobj*)VARYOBJ_SPACE_START; + start = (lispobj*)TEXT_SPACE_START; } lispobj* found = gc_search_space(start, pointer); return (found && filler_obj_p(found)) ? 0 : found; @@ -1410,12 +1410,12 @@ search_immobile_space(void *pointer) // block of objects one of which must abut 'obj'. lispobj* find_preceding_object(lispobj* obj) { - int page = find_varyobj_page_index(obj); + int page = find_text_page_index(obj); gc_assert(page >= 0); while (1) { - int offset = varyobj_pages[page].scan_start_offset; + int offset = text_pages[page].scan_start_offset; if (offset) { // 0 means the page is empty. - lispobj* start = varyobj_scan_start(page); + lispobj* start = text_page_scan_start(page); if (start < obj) { // Scan from here forward while (1) { lispobj* end = start + headerobj_size(start); @@ -1426,7 +1426,7 @@ lispobj* find_preceding_object(lispobj* obj) } } if (page == 0) { - gc_assert(obj == varyobj_page_address(0)); + gc_assert(obj == text_page_address(0)); return 0; // Predecessor does not exist } --page; @@ -1449,10 +1449,10 @@ static lispobj* tempspace_addr(void* address) int byte_index = (char*)address - (char*)FIXEDOBJ_SPACE_START; gc_assert(byte_index < fixedobj_tempspace.n_bytes); return (void*)(fixedobj_tempspace.start + byte_index); - } else { // varyobj subspace - int byte_index = (char*)address - (char*)VARYOBJ_SPACE_START; - gc_assert(byte_index < varyobj_tempspace.n_bytes); - return (void*)(varyobj_tempspace.start + byte_index); + } else { // text subspace + int byte_index = (char*)address - (char*)TEXT_SPACE_START; + gc_assert(byte_index < text_tempspace.n_bytes); + return (void*)(text_tempspace.start + byte_index); } } @@ -1472,8 +1472,8 @@ static inline boolean tempspace_p(char* addr) { return (addr >= fixedobj_tempspace.start && addr < fixedobj_tempspace.start + fixedobj_tempspace.n_bytes) - || (addr >= varyobj_tempspace.start && - addr < varyobj_tempspace.start + varyobj_tempspace.n_bytes); + || (addr >= text_tempspace.start && + addr < text_tempspace.start + text_tempspace.n_bytes); } static inline boolean known_space_p(lispobj ptr) { @@ -1729,7 +1729,7 @@ static int calc_n_fixedobj_pages(int n_objects, int words_per_object) /// Copy a fixed-size object somewhere. "somewhere" could be either a fixed- /// or variable-sized object page. The new copy never crosses page boundaries. -/// The original object may reside in either varyobj or fixedobj space. +/// The original object may reside in either text or fixedobj space. static void place_fixedobj(lispobj* obj, int size_in_bytes, char *alloc_ptrs[64], char *symbol_alloc_ptr[]) { @@ -1836,12 +1836,12 @@ static void defrag_immobile_space(boolean verbose) struct size_class layout_size_class[MAX_LAYOUT_DEFRAG_SIZE_CLASSES]; bzero(layout_size_class, sizeof layout_size_class); - // Count the fdefns, trampolines, and GFs already in varyobj sapace. + // Count the fdefns, trampolines, and GFs already in text sapace. // There are 3 kinds of code objects we might see - // (1) ordinary code, (2) trampolines, (3) filler // Make sure only to count the trampolines on this pass. - lispobj* obj = (lispobj*)VARYOBJ_SPACE_START; - while (obj < varyobj_free_pointer) { + lispobj* obj = (lispobj*)TEXT_SPACE_START; + while (obj < text_space_highwatermark) { int widetag = widetag_of(obj); if (executable_object_p(obj)) ++obj_type_histo[widetag/4]; obj += sizetab[widetag](obj); @@ -1892,7 +1892,7 @@ static void defrag_immobile_space(boolean verbose) // Calculate space needed for fixedobj pages after defrag. // page order is: layouts, symbols, fdefns, trampolines, GFs // If the text segment is writable, then the last 3 of those are - // moved into varyobj space. + // moved into text space. int n_layout_pages = 0; int class_index; for (class_index = 0; class_index < MAX_LAYOUT_DEFRAG_SIZE_CLASSES; ++class_index) { @@ -1947,10 +1947,10 @@ static void defrag_immobile_space(boolean verbose) // which was in components[] because it was live before GC. if (!filler_obj_p(addr)) { // must not be a trampoline object - if ((lispobj)addr > VARYOBJ_SPACE_START) + if ((lispobj)addr > TEXT_SPACE_START) gc_assert(code_n_funs((struct code*)addr)); ++n_code_components; - new_vaddr = VARYOBJ_SPACE_START + n_code_bytes; + new_vaddr = TEXT_SPACE_START + n_code_bytes; n_code_bytes += sizetab[widetag](addr) << WORD_SHIFT; } components[i*2+1] = new_vaddr; @@ -1960,8 +1960,8 @@ static void defrag_immobile_space(boolean verbose) if (aligned_nbytes - n_code_bytes == 2 * N_WORD_BYTES) // waste another page because it can't be a 2-word filler aligned_nbytes += IMMOBILE_CARD_BYTES; - varyobj_tempspace.n_bytes = aligned_nbytes; - varyobj_tempspace.start = calloc(varyobj_tempspace.n_bytes, 1); + text_tempspace.n_bytes = aligned_nbytes; + text_tempspace.start = calloc(text_tempspace.n_bytes, 1); if (verbose) printf("(fin,inst,fdefn,code,sym)=%d+%d+%d+%d+%d... ", @@ -1972,7 +1972,7 @@ static void defrag_immobile_space(boolean verbose) obj_type_histo[SYMBOL_WIDETAG/4]); if (components) { - // Permute varyobj space into tempspace and deposit forwarding pointers. + // Permute text space into tempspace and deposit forwarding pointers. lispobj new_vaddr; for (i=0 ; components[i*2] ; ++i) { if ((new_vaddr = components[i*2+1]) != 0) { @@ -2011,7 +2011,7 @@ static void defrag_immobile_space(boolean verbose) } } if (aligned_nbytes > n_code_bytes) - make_filler(tempspace_addr((char*)VARYOBJ_SPACE_START + n_code_bytes), + make_filler(tempspace_addr((char*)TEXT_SPACE_START + n_code_bytes), aligned_nbytes - n_code_bytes); } @@ -2112,8 +2112,8 @@ static void defrag_immobile_space(boolean verbose) fixup_space((lispobj*)FIXEDOBJ_SPACE_START, FIXEDOBJ_SPACE_SIZE >> WORD_SHIFT); #endif - fixup_space((lispobj*)varyobj_tempspace.start, - varyobj_tempspace.n_bytes >> WORD_SHIFT); + fixup_space((lispobj*)text_tempspace.start, + text_tempspace.n_bytes >> WORD_SHIFT); // Dynamic space // We can safely ignore allocation region boundaries. @@ -2125,7 +2125,7 @@ static void defrag_immobile_space(boolean verbose) copy_back(FIXEDOBJ_SPACE_START, &fixedobj_tempspace, &fixedobj_free_pointer); #endif #ifdef LISP_FEATURE_IMMOBILE_CODE - copy_back(VARYOBJ_SPACE_START, &varyobj_tempspace, &varyobj_free_pointer); + copy_back(TEXT_SPACE_START, &text_tempspace, &text_space_highwatermark); free(components); #endif @@ -2136,7 +2136,7 @@ static void defrag_immobile_space(boolean verbose) verify_heap(1); #endif free(fixedobj_tempspace.start); - free(varyobj_tempspace.start); + free(text_tempspace.start); } #endif @@ -2313,13 +2313,13 @@ int comparator_ge(const void* a, const void* b) { return -1; } -void check_varyobj_pages() +void check_text_pages() { // 1. Check that a linear scan sees only valid object headers, // and that it terminates exactly at IMMOBILE_CODE_FREE_POINTER. - lispobj* obj = (lispobj*)VARYOBJ_SPACE_START; - lispobj* end = varyobj_free_pointer; - low_page_index_t end_page = find_varyobj_page_index((char*)end-1); + lispobj* obj = (lispobj*)TEXT_SPACE_START; + lispobj* end = text_space_highwatermark; + low_page_index_t end_page = find_text_page_index((char*)end-1); n_immobile_objects = 0; while (obj < end) { @@ -2335,7 +2335,7 @@ void check_varyobj_pages() // Begin by collecting all object header locations into an array; immobile_objects = calloc(n_immobile_objects, sizeof (lispobj)); immobile_objects_limit = immobile_objects + n_immobile_objects - 1; - obj = (lispobj*)VARYOBJ_SPACE_START; + obj = (lispobj*)TEXT_SPACE_START; int i = 0; while (obj < end) { immobile_objects[i++] = (lispobj)obj; @@ -2347,12 +2347,12 @@ void check_varyobj_pages() // and that it is the right object. low_page_index_t page; for (page = 0; page <= end_page; ++page) { - lispobj page_addr = (lispobj)varyobj_page_address(page); + lispobj page_addr = (lispobj)text_page_address(page); int* found_below = bsearch(&page_addr, immobile_objects, n_immobile_objects, sizeof (int), comparator_le); int* found_above = bsearch(&page_addr, immobile_objects, n_immobile_objects, sizeof (int), comparator_ge); - int stored_scan_start = (int)(long)varyobj_scan_start(page); + int stored_scan_start = (int)(long)text_page_scan_start(page); lispobj* scan_start_obj = (lispobj*)(long)*found_below; if (scan_start_obj != (lispobj*)(long)stored_scan_start) { //printf("page %d: found-below=%p stored=%p\n", page, scan_start_obj, stored_scan_start); @@ -2368,9 +2368,9 @@ void check_varyobj_pages() break; // If you hit the free pointer, or run off the page, // then the page is completely empty. - if (scan_start_obj == varyobj_free_pointer - || scan_start_obj >= (lispobj*)varyobj_page_address(page+1)) { - scan_start_obj = varyobj_page_address(page+1); + if (scan_start_obj == text_space_highwatermark + || scan_start_obj >= (lispobj*)text_page_address(page+1)) { + scan_start_obj = text_page_address(page+1); break; } } @@ -2392,15 +2392,15 @@ void check_varyobj_pages() // 3. The generation mask for each page is exactly the union // of generation numbers of object headers on the page. for (page = 0; page <= end_page; ++page) { - if (!varyobj_page_scan_start_offset[page]) + if (!text_page_scan_start_offset[page]) continue; // page is all holes or never used - obj = varyobj_scan_start(page); + obj = text_page_scan_start(page); lispobj word = *obj; int n_words = headerobj_size(obj); // Skip the first object if it doesn't start on this page. - if (obj < (lispobj*)varyobj_page_address(page)) obj += n_words; - lispobj* limit = (lispobj*)varyobj_page_address(page) + WORDS_PER_PAGE; - lispobj* freeptr = varyobj_free_pointer; + if (obj < (lispobj*)text_page_address(page)) obj += n_words; + lispobj* limit = (lispobj*)text_page_address(page) + WORDS_PER_PAGE; + lispobj* freeptr = text_space_highwatermark; if (limit > freeptr) limit = freeptr; int mask = 0; for ( ; obj < limit ; obj += headerobj_size(obj) ) { @@ -2414,9 +2414,9 @@ void check_varyobj_pages() } /* This assertion fails after a fullcgc which doesn't update * the genmasks, so that they remain as overestimates */ - // gc_assert(mask == varyobj_page_gens[page]); + // gc_assert(mask == text_page_gens[page]); - int actual = varyobj_page_gens[page]; + int actual = text_page_gens[page]; /* Fail if any bit in (LOGANDC1 ACTUAL EXPECTED) is true: * actual=0, expected=0 -> // ok * actual=1, expected=1 -> // ok diff --git a/src/runtime/immobile-space.h b/src/runtime/immobile-space.h index 80869432c7..5410538321 100644 --- a/src/runtime/immobile-space.h +++ b/src/runtime/immobile-space.h @@ -30,7 +30,7 @@ extern void write_protect_immobile_space(void); extern unsigned int immobile_scav_queue_count; typedef int low_page_index_t; -extern unsigned int* varyobj_page_touched_bits; +extern unsigned int* text_page_touched_bits; extern uword_t asm_routines_start, asm_routines_end; static inline void * @@ -39,12 +39,12 @@ fixedobj_page_address(low_page_index_t page_num) return (void*)(FIXEDOBJ_SPACE_START + (page_num * IMMOBILE_CARD_BYTES)); } static inline void * -varyobj_page_address(low_page_index_t page_num) +text_page_address(low_page_index_t page_num) { - return (void*)(VARYOBJ_SPACE_START + (page_num * IMMOBILE_CARD_BYTES)); + return (void*)(TEXT_SPACE_START + (page_num * IMMOBILE_CARD_BYTES)); } -struct varyobj_page { +struct text_page { // Generation mask for objects which start on this page. // An object which ends on but does not start on this page // does not set the respective bit. @@ -58,13 +58,13 @@ struct varyobj_page { scan_start_offset: 24; }; -extern struct varyobj_page *varyobj_pages; +extern struct text_page *text_pages; /* Calculate the address where the first object touching this page starts. */ static inline lispobj* -varyobj_scan_start(low_page_index_t page_index) +text_page_scan_start(low_page_index_t page_index) { - return (lispobj*)((char*)varyobj_page_address(page_index+1) - - varyobj_pages[page_index].scan_start_offset * (2 * N_WORD_BYTES)); + return (lispobj*)((char*)text_page_address(page_index+1) + - text_pages[page_index].scan_start_offset * (2 * N_WORD_BYTES)); } static inline low_page_index_t find_fixedobj_page_index(void *addr) @@ -79,13 +79,13 @@ static inline low_page_index_t find_fixedobj_page_index(void *addr) } return -1; } -static inline low_page_index_t find_varyobj_page_index(void *addr) +static inline low_page_index_t find_text_page_index(void *addr) { - if (addr >= (void*)VARYOBJ_SPACE_START) { + if (addr >= (void*)TEXT_SPACE_START) { // Must use full register size here to avoid truncation of quotient // and bogus result! - size_t offset = (uintptr_t)addr - (uintptr_t)VARYOBJ_SPACE_START; - if (offset >= varyobj_space_size) + size_t offset = (uintptr_t)addr - (uintptr_t)TEXT_SPACE_START; + if (offset >= text_space_size) return -1; return offset / IMMOBILE_CARD_BYTES; } diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 90588837eb..d6416040cf 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -65,8 +65,8 @@ struct crash_preamble { int card_table_nbits; // fixedobj data dumped: pages, page table uword_t fixedobj_start, fixedobj_size, fixedobj_free_pointer; - // varyobj data dumped: pages, touched_bits, page table - uword_t varyobj_start, varyobj_size, varyobj_free_pointer; + // text data dumped: pages, touched_bits, page table + uword_t text_start, text_size, text_space_highwatermark; int nthreads; int tls_size; lispobj lisp_package_vector; @@ -127,9 +127,9 @@ void save_gc_crashdump(char *pathname, preamble.fixedobj_start = FIXEDOBJ_SPACE_START; preamble.fixedobj_size = FIXEDOBJ_SPACE_SIZE; preamble.fixedobj_free_pointer = (uword_t)fixedobj_free_pointer; - preamble.varyobj_start = VARYOBJ_SPACE_START; - preamble.varyobj_size = VARYOBJ_SPACE_SIZE; - preamble.varyobj_free_pointer = (uword_t)varyobj_free_pointer; + preamble.text_start = TEXT_SPACE_START; + preamble.text_size = TEXT_SPACE_SIZE; + preamble.text_space_highwatermark = (uword_t)text_space_highwatermark; #endif // write the preamble and static space checked_write(fd, &preamble, sizeof preamble); @@ -145,12 +145,12 @@ void save_gc_crashdump(char *pathname, checked_write(fd, (char*)FIXEDOBJ_SPACE_START, usage); int total_npages = FIXEDOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; checked_write(fd, fixedobj_pages, total_npages * sizeof sizeof(struct fixedobj_page)); - usage = (uword_t)varyobj_free_pointer - VARYOBJ_SPACE_START; - checked_write(fd, (char*)VARYOBJ_SPACE_START, usage); - total_npages = VARYOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; + usage = (uword_t)text_space_highwatermark - TEXT_SPACE_START; + checked_write(fd, (char*)TEXT_SPACE_START, usage); + total_npages = TEXT_SPACE_SIZE / IMMOBILE_CARD_BYTES; int n_bitmap_elts = ALIGN_UP(total_npages, 32) / 32; - checked_write(fd, varyobj_page_touched_bits, n_bitmap_elts * sizeof (int)); - checked_write(fd, varyobj_pages, total_npages * sizeof (int)); + checked_write(fd, text_page_touched_bits, n_bitmap_elts * sizeof (int)); + checked_write(fd, text_pages, total_npages * sizeof (int)); #endif struct crash_thread_preamble thread_preamble; for_each_thread(th) { @@ -870,13 +870,13 @@ int load_gc_crashdump(char* pathname) calc_immobile_space_bounds(), write_protect_immobile_space(); gc_assert(preamble.fixedobj_size == FIXEDOBJ_SPACE_SIZE); - gc_assert(preamble.varyobj_size == VARYOBJ_SPACE_SIZE); + gc_assert(preamble.text_size == TEXT_SPACE_SIZE); FIXEDOBJ_SPACE_START = preamble.fixedobj_start; - VARYOBJ_SPACE_START = preamble.varyobj_start; + TEXT_SPACE_START = preamble.text_start; fixedobj_free_pointer = (lispobj*)preamble.fixedobj_free_pointer; - varyobj_free_pointer = (lispobj*)preamble.varyobj_free_pointer; + text_space_highwatermark = (lispobj*)preamble.text_space_highwatermark; os_validate(0, (char*)FIXEDOBJ_SPACE_START, FIXEDOBJ_SPACE_SIZE, 0, 0); - os_validate(0, (char*)VARYOBJ_SPACE_START, VARYOBJ_SPACE_SIZE, 0, 0); + os_validate(0, (char*)TEXT_SPACE_START, TEXT_SPACE_SIZE, 0, 0); gc_init_immobile(); // allocate the page tables calc_immobile_space_bounds(); // Read fixedobj space @@ -885,13 +885,13 @@ int load_gc_crashdump(char* pathname) // Always read the whole page table regardless of the current space usage int total_npages = FIXEDOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; checked_read(fd, fixedobj_pages, total_npages * sizeof sizeof(struct fixedobj_page)); - // Read varyobj space - usage = (uword_t)varyobj_free_pointer - VARYOBJ_SPACE_START; - checked_read(fd, (char*)VARYOBJ_SPACE_START, usage); - total_npages = VARYOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; + // Read text space + usage = (uword_t)text_space_highwatermark - TEXT_SPACE_START; + checked_read(fd, (char*)TEXT_SPACE_START, usage); + total_npages = TEXT_SPACE_SIZE / IMMOBILE_CARD_BYTES; int n_bitmap_elts = ALIGN_UP(total_npages, 32) / 32; - checked_read(fd, varyobj_page_touched_bits, n_bitmap_elts * sizeof (int)); - checked_read(fd, varyobj_pages, total_npages * sizeof (int)); + checked_read(fd, text_page_touched_bits, n_bitmap_elts * sizeof (int)); + checked_read(fd, text_pages, total_npages * sizeof (int)); write_protect_immobile_space(); #endif fprintf(stderr, "%d threads:\n", (int)preamble.nthreads); diff --git a/src/runtime/save.c b/src/runtime/save.c index f0fbea9477..92d19c001e 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -358,9 +358,9 @@ save_to_filehandle(FILE *file, char *filename, lispobj init_function, // i.e. if code resided between dynamic and fixedobj space, then dynamic // space would need to have it pages renumbered when code is pulled out. output_space(file, - IMMOBILE_VARYOBJ_CORE_SPACE_ID, - (lispobj *)VARYOBJ_SPACE_START, - varyobj_free_pointer, + IMMOBILE_TEXT_CORE_SPACE_ID, + (lispobj *)TEXT_SPACE_START, + text_space_highwatermark, core_start_pos, core_compression_level); #endif diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index 762df3cd9c..ac60556279 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -136,7 +136,7 @@ static void walk_all_spaces(void (*fun)(lispobj*,uword_t), uword_t arg) walk_range((lispobj*)STATIC_SPACE_OBJECTS_START, static_space_free_pointer, fun, arg); #ifdef LISP_FEATURE_IMMOBILE_SPACE walk_range((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, fun, arg); - walk_range((lispobj*)VARYOBJ_SPACE_START, varyobj_free_pointer, fun, arg); + walk_range((lispobj*)TEXT_SPACE_START, text_space_highwatermark, fun, arg); #endif page_index_t first, last; for ( first = 0 ; first < next_free_page ; first = 1+last ) { diff --git a/src/runtime/thread.c b/src/runtime/thread.c index fb82fda929..016aaab113 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -934,11 +934,11 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { #ifdef LAYOUT_OF_FUNCTION tls[THREAD_FUNCTION_LAYOUT_SLOT] = LAYOUT_OF_FUNCTION << 32; #endif -#ifdef THREAD_VARYOBJ_CARD_MARKS_SLOT - extern unsigned int* varyobj_page_touched_bits; - tls[THREAD_VARYOBJ_SPACE_ADDR_SLOT] = VARYOBJ_SPACE_START; - tls[THREAD_VARYOBJ_CARD_COUNT_SLOT] = varyobj_space_size / IMMOBILE_CARD_BYTES; - tls[THREAD_VARYOBJ_CARD_MARKS_SLOT] = (lispobj)varyobj_page_touched_bits; +#ifdef THREAD_TEXT_CARD_MARKS_SLOT + extern unsigned int* text_page_touched_bits; + tls[THREAD_TEXT_SPACE_ADDR_SLOT] = TEXT_SPACE_START; + tls[THREAD_TEXT_CARD_COUNT_SLOT] = text_space_size / IMMOBILE_CARD_BYTES; + tls[THREAD_TEXT_CARD_MARKS_SLOT] = (lispobj)text_page_touched_bits; #endif th->os_address = spaces; diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index b4a9ad44e5..5ce9812e92 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -400,12 +400,12 @@ static inline uint32_t encode_pointer(lispobj pointer) return (encoding<<1) | 1; } else #ifdef LISP_FEATURE_IMMOBILE_SPACE - if (find_varyobj_page_index((void*)pointer) >= 0) { - // A varyobj space pointer is stored as a count in doublewords + if (find_text_page_index((void*)pointer) >= 0) { + // A text space pointer is stored as a count in doublewords // from the base address. - encoding = (pointer - VARYOBJ_SPACE_START) / (2*N_WORD_BYTES); + encoding = (pointer - TEXT_SPACE_START) / (2*N_WORD_BYTES); gc_assert(encoding <= 0x3FFFFFFF); - // bit pattern #b10 signifies varyobj space compressed ptr. + // bit pattern #b10 signifies text space compressed ptr. return (encoding<<2) | 2; } else #endif @@ -421,8 +421,8 @@ static inline lispobj decode_pointer(uint32_t encoding) if (encoding & 1) // Compressed ptr to dynamic space return (encoding>>1)*(2*N_WORD_BYTES) + DYNAMIC_SPACE_START; #ifdef LISP_FEATURE_IMMOBILE_SPACE - else if ((encoding & 3) == 2) // Compressed ptr to varyobj space - return (encoding>>2)*(2*N_WORD_BYTES) + VARYOBJ_SPACE_START; + else if ((encoding & 3) == 2) // Compressed ptr to text space + return (encoding>>2)*(2*N_WORD_BYTES) + TEXT_SPACE_START; #endif else return encoding; // Literal pointer @@ -841,7 +841,7 @@ static void scan_spaces(struct scan_state* ss) #ifdef LISP_FEATURE_IMMOBILE_SPACE old = *ss; build_refs((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, ss); show_tally(old, ss); - old = *ss; build_refs((lispobj*)VARYOBJ_SPACE_START, varyobj_free_pointer, ss); + old = *ss; build_refs((lispobj*)TEXT_SPACE_START, text_space_highwatermark, ss); show_tally(old, ss); #endif old = *ss; diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index 022ae01982..833a60a9d0 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -410,16 +410,16 @@ int verify_heap(__attribute__((unused)) lispobj* cur_thread_approx_stackptr, # ifdef __linux__ // Try this verification if immobile-space was compiled with extra debugging. // But weak symbols don't work on macOS. - extern void __attribute__((weak)) check_varyobj_pages(); - if (&check_varyobj_pages) check_varyobj_pages(); + extern void __attribute__((weak)) check_text_pages(); + if (&check_text_pages) check_text_pages(); # endif if (verbose) fprintf(stderr, " [immobile]"); if (verify(FIXEDOBJ_SPACE_START, fixedobj_free_pointer, &state, flags | VERIFYING_GENERATIONAL)) goto out; - if (verify(VARYOBJ_SPACE_START, - varyobj_free_pointer, &state, + if (verify(TEXT_SPACE_START, + text_space_highwatermark, &state, flags | VERIFYING_GENERATIONAL)) goto out; #endif struct thread *th; @@ -477,11 +477,11 @@ void gc_show_pte(lispobj obj) return; } #ifdef LISP_FEATURE_IMMOBILE_SPACE - page = find_varyobj_page_index((void*)obj); + page = find_text_page_index((void*)obj); if (page>=0) { printf("page %ld (v) ss=%p gens %x%s\n", page, - varyobj_scan_start(page), - varyobj_pages[page].generations, + text_page_scan_start(page), + text_pages[page].generations, card_markedp((void*)obj)?"":" WP"); return; } @@ -574,8 +574,8 @@ void hexdump_spaces(struct verify_state* state, char *reason) #ifdef LISP_FEATURE_IMMOBILE_SPACE fprintf(f, "Fixedobj space:\n"); dump_immobile((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, f); - fprintf(f, "Varyobj space:\n"); - dump_immobile((lispobj*)VARYOBJ_SPACE_START, varyobj_free_pointer, f); + fprintf(f, "Text space:\n"); + dump_immobile((lispobj*)TEXT_SPACE_START, text_space_highwatermark, f); #endif fprintf(f, "Dynamic space:\n"); diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index d71bad4aeb..3e60a9f22c 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -271,7 +271,7 @@ (assert (not (sb-kernel:immobile-space-addr-p (+ sb-vm:fixedobj-space-start sb-vm:fixedobj-space-size - sb-vm:varyobj-space-size))))) + sb-vm:text-space-size))))) (with-test (:name :unique-code-serialno :skipped-on :interpreter) (let ((a (make-array 100000 :element-type 'bit :initial-element 0))) diff --git a/tests/save3.test.sh b/tests/save3.test.sh index 6fb551478d..95d05b9b25 100644 --- a/tests/save3.test.sh +++ b/tests/save3.test.sh @@ -15,7 +15,7 @@ run_sbcl_with_core "$tmpcore" --noinform --no-userinit --no-sysinit \ check_status_maybe_lose "SAVE-LISP-AND-DIE" $? 0 "(saved core ran)" # Verify that for funcallable instances which were moved into the -# immobile varyobj space by SAVE-LISP-AND-DIE, setting the layout +# immobile text space by SAVE-LISP-AND-DIE, setting the layout # updates the GC card touched bit. # Going through instance-obsolescence stuff makes things mostly work # by accident, because (SETF %FUNCALLABLE-INSTANCE-INFO) touches diff --git a/tools-for-build/corefile.lisp b/tools-for-build/corefile.lisp index 356a19a6d7..97e3d4f843 100644 --- a/tools-for-build/corefile.lisp +++ b/tools-for-build/corefile.lisp @@ -15,7 +15,7 @@ #:static-code-core-space-id #:dynamic-core-space-id #:immobile-fixedobj-core-space-id - #:immobile-varyobj-core-space-id + #:immobile-text-core-space-id #:deflated-core-space-id-flag)) (in-package "SB-COREFILE") @@ -49,6 +49,6 @@ (defconstant static-core-space-id 2) (defconstant read-only-core-space-id 3) (defconstant immobile-fixedobj-core-space-id 4) -(defconstant immobile-varyobj-core-space-id 5) +(defconstant immobile-text-core-space-id 5) (defconstant static-code-core-space-id 4) (defconstant deflated-core-space-id-flag 8) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index 8f8614f108..96ac360bf6 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -948,11 +948,11 @@ (member :darwin *features*) label-prefix label-prefix label-prefix label-prefix)) -;;; Convert immobile varyobj space to an assembly file in OUTPUT. +;;; Convert immobile text space to an assembly file in OUTPUT. (defun write-assembler-text (spaces output &optional enable-pie (emit-cfi t) - &aux (code-bounds (space-bounds immobile-varyobj-core-space-id spaces)) + &aux (code-bounds (space-bounds immobile-text-core-space-id spaces)) (fixedobj-bounds (space-bounds immobile-fixedobj-core-space-id spaces)) (core (make-core spaces code-bounds fixedobj-bounds enable-pie)) (code-addr (bounds-low code-bounds)) @@ -1124,7 +1124,7 @@ (incf code-addr objsize))) ))) - ;; coreparse uses the 'lisp_jit_code' symbol to set varyobj_free_pointer + ;; coreparse uses the 'lisp_jit_code' symbol to set text_space_highwatermark ;; The intent is that compilation to memory can use this reserved area ;; (if space remains) so that profilers can associate a C symbol with the ;; program counter range. It's better than nothing. @@ -1404,7 +1404,7 @@ ;;; that need to be applied on startup of a position-independent executable. ;;; (defun collect-relocations (spaces fixups pie &key (verbose nil) (print nil)) - (let* ((code-bounds (space-bounds immobile-varyobj-core-space-id spaces)) + (let* ((code-bounds (space-bounds immobile-text-core-space-id spaces)) (code-start (bounds-low code-bounds)) (n-abs 0) (n-rel 0) @@ -1452,7 +1452,7 @@ (id (space-id space)) (npages (ceiling nwords (/ +backend-page-bytes+ n-word-bytes)))) (when (and (<= page0 page (+ page0 (1- npages))) - (/= id immobile-varyobj-core-space-id)) + (/= id immobile-text-core-space-id)) (return (+ (space-addr space) (* (- page page0) +backend-page-bytes+) (logand core-offs (1- +backend-page-bytes+)))))))) @@ -1545,7 +1545,7 @@ (return-from scan-obj))) (scanptrs vaddr obj 1 (1- nwords)))) (dolist (space (cdr spaces)) - (unless (= (space-id space) immobile-varyobj-core-space-id) + (unless (= (space-id space) immobile-text-core-space-id) (let* ((logical-addr (space-addr space)) (size (space-size space)) (physical-addr (space-physaddr space spaces)) @@ -1685,8 +1685,8 @@ (when verbose (format t "id=~d page=~5x + ~5x addr=~10x words=~8x~:[~; (drop)~]~%" id data-page npages addr nwords - (= id immobile-varyobj-core-space-id))) - (cond ((= id immobile-varyobj-core-space-id) + (= id immobile-text-core-space-id))) + (cond ((= id immobile-text-core-space-id) (setq code-start-fixup-ofs (+ index 3)) ;; Keep this entry but delete the page count. We need to know ;; where the space was supposed to be mapped and at what size. @@ -1762,7 +1762,7 @@ ;; Map the original core file to memory (with-mapped-core (sap core-offset original-total-npages input) (let* ((data-spaces - (delete immobile-varyobj-core-space-id (reverse spaces) + (delete immobile-text-core-space-id (reverse spaces) :key #'space-id)) (map (cons sap (sort (copy-list spaces) #'> :key #'space-addr))) (pte-nbytes (cdar copy-actions))) @@ -1863,7 +1863,7 @@ (with-mapped-core (sap core-offset total-npages input) (let* ((spaces (cons sap (sort (copy-list spaces) #'> :key #'space-addr))) (core (make-core spaces - (space-bounds immobile-varyobj-core-space-id spaces) + (space-bounds immobile-text-core-space-id spaces) (space-bounds immobile-fixedobj-core-space-id spaces))) (c-symbols (map 'list (lambda (x) (if (consp x) (car x) x)) (core-linkage-symbols core))) From 4e2ee24e5b9b4572c194ba83eac337d9e68ece29 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 16:26:28 -0400 Subject: [PATCH 3761/4023] Show more in pte_cmd for immobile text pages --- src/runtime/verify.inc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index 833a60a9d0..f80c62bea4 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -479,9 +479,15 @@ void gc_show_pte(lispobj obj) #ifdef LISP_FEATURE_IMMOBILE_SPACE page = find_text_page_index((void*)obj); if (page>=0) { - printf("page %ld (v) ss=%p gens %x%s\n", page, + lispobj* text_page_scan_start(low_page_index_t page); + int gens = text_pages[page].generations; + char genstring[9]; + int i; + for (i=0;i<8;++i) genstring[i] = (gens & (1<<i)) ? '0'+i : '-'; + genstring[8] = 0; + printf("page %ld (v) base %p gens %s ss=%p%s\n", + page, text_page_address(page), genstring, text_page_scan_start(page), - text_pages[page].generations, card_markedp((void*)obj)?"":" WP"); return; } From 94c1ac5411bf21a9da718c73bad5e7650146ddec Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 16:29:46 -0400 Subject: [PATCH 3762/4023] Borrow someone else's allocator TLSF (https://github.com/jserv/tlsf-bsd) is a simple malloc/free which will be used in lieu of the current text space allocator. Its 2-clause BSD license is compatible with SBCL's. --- src/runtime/GNUmakefile | 4 +- tlsf-bsd/.clang-format | 12 + tlsf-bsd/.gitignore | 17 + tlsf-bsd/CHANGES | 63 ++ tlsf-bsd/LICENSE | 26 + tlsf-bsd/Makefile | 43 ++ tlsf-bsd/README.md | 63 ++ tlsf-bsd/tests/bench-alloc.c | 227 ++++++++ tlsf-bsd/tests/lran2.h | 44 ++ tlsf-bsd/tests/test-alloc.c | 106 ++++ tlsf-bsd/tests/test-bits.c | 31 + tlsf-bsd/tlsf/tlsf.c | 1045 ++++++++++++++++++++++++++++++++++ tlsf-bsd/tlsf/tlsf.h | 83 +++ tlsf-bsd/tlsf/tlsf_utils.h | 202 +++++++ 14 files changed, 1964 insertions(+), 2 deletions(-) create mode 100644 tlsf-bsd/.clang-format create mode 100644 tlsf-bsd/.gitignore create mode 100644 tlsf-bsd/CHANGES create mode 100644 tlsf-bsd/LICENSE create mode 100644 tlsf-bsd/Makefile create mode 100644 tlsf-bsd/README.md create mode 100644 tlsf-bsd/tests/bench-alloc.c create mode 100644 tlsf-bsd/tests/lran2.h create mode 100644 tlsf-bsd/tests/test-alloc.c create mode 100644 tlsf-bsd/tests/test-bits.c create mode 100644 tlsf-bsd/tlsf/tlsf.c create mode 100644 tlsf-bsd/tlsf/tlsf.h create mode 100644 tlsf-bsd/tlsf/tlsf_utils.h diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index f53a211717..a4bd90f4b3 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -35,7 +35,7 @@ include ../../output/prefix.def CFLAGS += -g -Wall -Wundef -Wsign-compare -Wpointer-arith -O3 ASFLAGS += $(CFLAGS) -CPPFLAGS += -I. +CPPFLAGS += -I. -I../../ # Give make access to the target Lisp features. include genesis/Makefile.features @@ -86,7 +86,7 @@ C_SRC = $(COMMON_SRC) ${ARCH_SRC} ${OS_SRC} ${GC_SRC} SRCS = $(C_SRC) ${ASSEM_SRC} -OBJS = $(C_SRC:.c=.o) $(ASSEM_SRC:.S=.o) +OBJS = $(C_SRC:.c=.o) $(ASSEM_SRC:.S=.o) ../../tlsf-bsd/tlsf/tlsf.o LIBS = ${OS_LIBS} $(LDLIBS) -lm diff --git a/tlsf-bsd/.clang-format b/tlsf-bsd/.clang-format new file mode 100644 index 0000000000..2d07d2042f --- /dev/null +++ b/tlsf-bsd/.clang-format @@ -0,0 +1,12 @@ +BasedOnStyle: Chromium +Language: Cpp +MaxEmptyLinesToKeep: 3 +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +DerivePointerAlignment: false +PointerAlignment: Right +TabWidth: 4 +UseTab: Never +IndentWidth: 4 +BreakBeforeBraces: Linux +AccessModifierOffset: -4 diff --git a/tlsf-bsd/.gitignore b/tlsf-bsd/.gitignore new file mode 100644 index 0000000000..81b995ff0b --- /dev/null +++ b/tlsf-bsd/.gitignore @@ -0,0 +1,17 @@ +*~ +*.o +*.i +*.s +*.P +*.elf +*.bin +*.hex +*.map +*.swp +*.fuse* +*.pyc +*.swo +*.out +build/ +tags +core diff --git a/tlsf-bsd/CHANGES b/tlsf-bsd/CHANGES new file mode 100644 index 0000000000..341b1be6d0 --- /dev/null +++ b/tlsf-bsd/CHANGES @@ -0,0 +1,63 @@ +History +------- +2014/02/08 - v3.0 + * This version is based on improvements from 3DInteractive GmbH + * Interface changed to allow more than one memory pool + * Separated pool handling from control structure (adding, removing, debugging) + * Control structure and pools can still be constructed in the same memory block + * Memory blocks for control structure and pools are checked for alignment + * Added functions to retrieve control structure size, alignment size, min and + max block size, overhead of pool structure, and overhead of a single allocation + * Minimal Pool size is tlsf_block_size_min() + tlsf_pool_overhead() + * Pool must be empty when it is removed, in order to allow O(1) removal + +2011/10/20 - v2.0 + * 64-bit support + * More compiler intrinsics for ffs/fls + * ffs/fls verification during TLSF creation in debug builds + +2008/04/04 - v1.9 + * Add tlsf_heap_check, a heap integrity check + * Support a predefined tlsf_assert macro + * Fix realloc case where block should shrink; if adjacent block is + in use, execution would go down the slow path + +2007/02/08 - v1.8 + * Fix for unnecessary reallocation in tlsf_realloc + +2007/02/03 - v1.7 + * tlsf_heap_walk takes a callback + * tlsf_realloc now returns NULL on failure + * tlsf_memalign optimization for 4-byte alignment + * Usage of size_t where appropriate + +2006/11/21 - v1.6 + * ffs/fls broken out into tlsfbits.h + * tlsf_overhead queries per-pool overhead + +2006/11/07 - v1.5 + * Smart realloc implementation + * Smart memalign implementation + +2006/10/11 - v1.4 + * Add some ffs/fls implementations + * Minor code footprint reduction + +2006/09/14 - v1.3 + * Profiling indicates heavy use of blocks of + size 1-128, so implement small block handling + * Reduce pool overhead by about 1kb + * Reduce minimum block size from 32 to 12 bytes + * Realloc bug fix + +2006/09/09 - v1.2 + * Add tlsf_block_size + * Static assertion mechanism for invariants + * Minor bugfixes + +2006/09/01 - v1.1 + * Add tlsf_realloc + * Add tlsf_walk_heap + +2006/08/25 - v1.0 + * First release diff --git a/tlsf-bsd/LICENSE b/tlsf-bsd/LICENSE new file mode 100644 index 0000000000..85fc74592e --- /dev/null +++ b/tlsf-bsd/LICENSE @@ -0,0 +1,26 @@ +TLSF-BSD is freely redistributable under the two-clause BSD License: + +Copyright (c) 2016 National Cheng Kung University, Taiwan. +Copyright (c) 2006-2008, 2011, 2014 Matthew Conte. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/tlsf-bsd/Makefile b/tlsf-bsd/Makefile new file mode 100644 index 0000000000..2807a1687f --- /dev/null +++ b/tlsf-bsd/Makefile @@ -0,0 +1,43 @@ +OUT = build + +TARGETS = \ + test-bits \ + test-alloc \ + bench-alloc +TARGETS := $(addprefix $(OUT)/,$(TARGETS)) + +all: $(TARGETS) + +CC = gcc +CFLAGS = \ + -std=c99 -Wall -g -I tlsf \ + -D TLSF_CONFIG_ASSERT +LDFLAGS = + +OBJS = tlsf.o +OBJS := $(addprefix $(OUT)/,$(OBJS)) +deps := $(OBJS:%.o=%.o.d) + +$(OUT)/test-%: $(OBJS) tests/test-%.c + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) +deps += build/test-bits.d + +$(OUT)/bench-%: $(OBJS) tests/bench-%.c + $(CC) $(CFLAGS) -o $@ -MMD -MF $@.d $^ $(LDFLAGS) +# FIXME: avoid hardcode +deps += build/bench-alloc.d + +$(OUT)/%.o: tlsf/%.c + @mkdir -p $(OUT) + $(CC) $(CFLAGS) -c -o $@ -MMD -MF $@.d $< + +CMDSEP = ; echo "Please wait..." ; +check: $(TARGETS) + MALLOC_CHECK_=3 $(foreach prog,$(TARGETS),./$(prog) $(CMDSEP)) + +clean: + $(RM) $(TARGETS) $(OBJS) $(deps) + +.PHONY: all check clean + +-include $(deps) diff --git a/tlsf-bsd/README.md b/tlsf-bsd/README.md new file mode 100644 index 0000000000..38c9a014d2 --- /dev/null +++ b/tlsf-bsd/README.md @@ -0,0 +1,63 @@ +# TLSF-BSD + +Two Level Segregated Fit memory allocator implementation with O(1) +time complexity, distributed under the BSD License. + +## Features + +* O(1) cost for malloc, free, realloc, memalign +* Extremely low overhead per allocation (4 bytes) +* Low overhead per TLSF management of pools (~3kB) +* Low fragmentation +* Compiles to only a few kB of code and data +* Support for adding and removing memory pool regions on the fly + +## API Usage + +You can essentially pass a memory pool for TLSF to manage. +```C +enum { STATIC_POOL_SIZE = 1 << 20 }; +static char s_pool[STATIC_POOL_SIZE]; + +tlsf_t instance = tlsf_create_with_pool(s_pool, STATIC_POOL_SIZE); + +void *data = tlsf_malloc(instance, 64); +tlsf_free(instance, data); +``` + +## Caveats + +* Currently, assumes architecture can make 4-byte aligned accesses +* Not designed to be thread safe; the user must provide this + +## Notes +This code was based on the TLSF 1.4 spec and documentation found at: + http://www.gii.upv.es/tlsf/main/docs + +## Reference + +M. Masmano, I. Ripoll, A. Crespo, and J. Real. +TLSF: a new dynamic memory allocator for real-time systems. +In Proc. ECRTS (2004), IEEE Computer Society, pp. 79-86. + +This implementation was written to the specification of the document, +therefore no GPL restrictions apply. + +It also leverages the TLSF 2.0 improvement to shrink the per-block overhead +from 8 to 4 bytes. + +## Known Issues + +* Due to the internal block structure size and the implementation +details of `tlsf_memalign`, there is worst-case behavior when requesting +small (<16 byte) blocks aligned to 8-byte boundaries. Overuse of memalign +will generally increase fragmentation, but this particular case will leave +lots of unusable "holes" in the pool. The solution would be to internally +align all blocks to 8 bytes, but this will require significantl changes +to the implementation. + +## Licensing + +TLSF-BSD is freely redistributable under the two-clause BSD License. +Use of this source code is governed by a BSD-style license that can be found +in the `LICENSE` file. diff --git a/tlsf-bsd/tests/bench-alloc.c b/tlsf-bsd/tests/bench-alloc.c new file mode 100644 index 0000000000..3d35ca5d42 --- /dev/null +++ b/tlsf-bsd/tests/bench-alloc.c @@ -0,0 +1,227 @@ +/* Copyright (c) 2016 National Cheng Kung University, Taiwan. + * All rights reserved. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif +#define _POSIX_C_SOURCE 199309L + +#include <unistd.h> +#include <assert.h> +#include <errno.h> +#include <sched.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/time.h> +#include <sys/resource.h> +#include <time.h> + +#include "lran2.h" +#include "tlsf.h" + +static tlsf_t *tlsf; + +static void usage(const char *name) +{ + printf("run a malloc benchmark.\n" + "usage: %s [-s blk-size|blk-min:blk-max] [-l loop-count] " + "[-n num-blocks] [-c]\n", + name); + exit(-1); +} + +/* Parse an integer argument. */ +static int parse_int_arg(const char *arg, const char *exe_name) +{ + long int ret; + + errno = 0; + ret = strtol(arg, NULL, 0); + if (errno) + usage(exe_name); + + return (int) ret; +} + +/* Parse a size argument, which is either an integer or two integers + separated by a colon, denoting a range. */ +static void +parse_size_arg(const char *arg, const char *exe_name, + size_t *blk_min, size_t *blk_max) +{ + long int ret; + char *endptr; + + errno = 0; + ret = strtol(arg, &endptr, 0); + + if (errno) + usage(exe_name); + + *blk_min = (int)ret; + + if (endptr && *endptr == ':') { + errno = 0; + ret = strtol(endptr + 1, NULL, 0); + + if (errno) + usage(exe_name); + } + + *blk_max = (int)ret; + + if (blk_min > blk_max) + usage(exe_name); +} + +/* Get a random block size between blk_min and blk_max. */ +static size_t +get_random_block_size(size_t blk_min, size_t blk_max, + struct lran2_st *lran2_state) +{ + size_t blk_size; + + if (blk_max > blk_min) { + blk_size = blk_min + (lran2(lran2_state) % (blk_max - blk_min)); + } else + blk_size = blk_min; + + return blk_size; +} + +static void +run_alloc_benchmark(int loops, size_t blk_min, size_t blk_max, + void **blk_array, size_t num_blks, bool clear, + struct lran2_st *lran2_state) +{ + while (loops--) { + int next_idx = lran2(lran2_state) % num_blks; + size_t blk_size = get_random_block_size(blk_min, blk_max, lran2_state); + + if (blk_array[next_idx]) + tlsf_free(tlsf, blk_array[next_idx]); + + /* Insert the newly alloced block into the array at a random point. */ + blk_array[next_idx] = tlsf_malloc(tlsf, blk_size); + if (clear) + memset(blk_array[next_idx], 0, blk_size); + } + + /* Free up all allocated blocks. */ + for (size_t i = 0; i < num_blks; i++) { + if (blk_array[i]) + tlsf_free(tlsf, blk_array[i]); + } +} + +struct alloc_desc { + /* Generic fields. */ + int loops; + size_t blk_min; + size_t blk_max; + void **blk_array; + size_t num_blks; + bool clear; +}; + +static void start_bench(void *arg) +{ + struct alloc_desc *desc = arg; + struct lran2_st lran2_state; + + lran2_init(&lran2_state, time(NULL) ^ getpid()); + + run_alloc_benchmark(desc->loops, desc->blk_min, desc->blk_max, + desc->blk_array, desc->num_blks, desc->clear, + &lran2_state); +} + +static void stop_bench(void *arg) +{ + struct alloc_desc *desc = arg; + if (!desc) return; + free(desc->blk_array); +} + +int main(int argc, char **argv) +{ + size_t blk_min = 512, blk_max = 512, num_blks = 10000; + int loops = 10000000; + bool clear = false; + int opt; + + while ((opt = getopt(argc, argv, "s:l:r:t:n:b:ch")) > 0) { + switch (opt) { + case 's': + parse_size_arg(optarg, argv[0], &blk_min, &blk_max); + break; + case 'l': + loops = parse_int_arg(optarg, argv[0]); + break; + case 'n': + num_blks = parse_int_arg(optarg, argv[0]); + break; + case 'c': + clear = true; + break; + case 'h': + usage(argv[0]); + break; + default: + usage(argv[0]); + break; + } + } + + const size_t overhead = tlsf_size() + tlsf_pool_overhead() + + tlsf_alloc_overhead(); + char *space = malloc(blk_max * num_blks + overhead); + assert(space); + tlsf = tlsf_create_with_pool(space, blk_max * num_blks + overhead); + + struct alloc_desc desc = { + .loops = loops, + .blk_min = blk_min, + .blk_max = blk_max, + .blk_array = malloc(num_blks * sizeof(unsigned char *)), + .num_blks = num_blks, + .clear = clear, + }; + assert(desc.blk_array != NULL); + memset(desc.blk_array, 0, num_blks * sizeof(unsigned char *)); + + struct timespec start, end; + + int err = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); + assert(err == 0); + start_bench(&desc); + + err = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); + assert(err == 0); + stop_bench(&desc); + + double elapsed = (end.tv_sec - start.tv_sec) + + (end.tv_nsec - start.tv_nsec) * 1e-9; + + struct rusage usage; + err = getrusage(RUSAGE_SELF, &usage); + assert(err == 0); + + tlsf_destroy(tlsf); + free(space); + + /* Dump both machine and human readable versions */ + printf("%u:%u:%u:%u:%u:%.6f: took %.6f s for %u malloc/free\n" + "benchmark loops of %u-%u bytes. ~%.3f us per loop\n", + blk_min, blk_max, loops, + (int)clear, usage.ru_maxrss, elapsed, elapsed, loops, blk_min, + blk_max, (double)(elapsed / loops) * 1e6); + + return 0; +} diff --git a/tlsf-bsd/tests/lran2.h b/tlsf-bsd/tests/lran2.h new file mode 100644 index 0000000000..34acdc8b81 --- /dev/null +++ b/tlsf-bsd/tests/lran2.h @@ -0,0 +1,44 @@ +/* Copyright (c) 1996 Wolfram Gloger. + * A small, portable pseudo-random number generator. + */ + +#ifndef _LRAN2_H +#define _LRAN2_H + +#define LRAN2_MAX 714025l /* constants for portable */ +#define IA 1366l /* random number generator */ +#define IC 150889l /* (see e.g. `Numerical Recipes') */ + +struct lran2_st { + long x, y, v[97]; +}; + +static inline +void lran2_init(struct lran2_st *d, long seed) +{ + long x = (IC - seed) % LRAN2_MAX; + if (x < 0) + x = -x; + for (int j = 0; j < 97; j++) { + x = (IA * x + IC) % LRAN2_MAX; + d->v[j] = x; + } + d->x = (IA * x + IC) % LRAN2_MAX; + d->y = d->x; +} + +static inline +long lran2(struct lran2_st *d) +{ + int j = (d->y % 97); + + d->y = d->v[j]; + d->x = (IA * d->x + IC) % LRAN2_MAX; + d->v[j] = d->x; + return d->y; +} + +#undef IA +#undef IC + +#endif diff --git a/tlsf-bsd/tests/test-alloc.c b/tlsf-bsd/tests/test-alloc.c new file mode 100644 index 0000000000..9d4421a344 --- /dev/null +++ b/tlsf-bsd/tests/test-alloc.c @@ -0,0 +1,106 @@ +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <time.h> +#include <assert.h> +#include <err.h> + +#include <tlsf.h> + +static void random_test(const size_t spacelen, const size_t cap) +{ + const size_t overhead = tlsf_size() + tlsf_pool_overhead() + + tlsf_alloc_overhead(); + const size_t maxitems = spacelen; + size_t len; + uint8_t *space, *data; + unsigned i = 0; + tlsf_t *tlsf; + void **p; + + space = malloc(spacelen + overhead); + if (space == NULL) { + err(EXIT_FAILURE, "malloc"); + } + + p = malloc(maxitems * sizeof(void *)); + if (p == NULL) { + err(EXIT_FAILURE, "malloc"); + } + + tlsf = tlsf_create_with_pool(space, + spacelen + overhead); + assert(tlsf != NULL); + + /* + * Allocate random sizes up to the cap threshold. + * Track them in an array. + */ + for (;;) { + len = (random() % cap) + 1; + p[i] = tlsf_malloc(tlsf, len); + if (!p[i]) + break; + + /* Fill with magic (only when testing up to 1MB). */ + data = p[i]; + if (spacelen <= 1024 * 1024) { + memset(data, 0, len); + } + data[0] = 0xa5; + + if (i++ == maxitems) + break; + } + + /* + * Randomly deallocate the memory blocks until all of them are freed. + * The free space should match the free space after initialisation. + */ + for (unsigned n = i; n;) { + unsigned target = random() % i; + if (p[target] == NULL) + continue; + data = p[target]; + assert(data[0] == 0xa5); + tlsf_free(tlsf, p[target]); + p[target] = NULL; + n--; + } + + tlsf_destroy(tlsf); + free(space); + free(p); +} + +#define __arraycount(__x) \ + (sizeof(__x) / sizeof(__x[0])) + +static void random_sizes_test(void) +{ + const uint32_t sizes[] = {128, 1024, 1024 * 1024, 128 * 1024 * 1024}; + + for (unsigned i = 0; i < __arraycount(sizes); i++) { + unsigned n = 1024; + + while (n--) { + uint32_t cap = random() % sizes[i] + 1; + printf("sizes = %d, cap = %d\n", sizes[i], cap); + random_test(sizes[i], cap); + } + } +} + +int main(void) +{ + srandom(time(NULL) ^ getpid()); + random_sizes_test(); + puts("OK!"); + return 0; +} diff --git a/tlsf-bsd/tests/test-bits.c b/tlsf-bsd/tests/test-bits.c new file mode 100644 index 0000000000..47dbbc03e8 --- /dev/null +++ b/tlsf-bsd/tests/test-bits.c @@ -0,0 +1,31 @@ +#include <stdio.h> +#include "tlsf_utils.h" + +int test_ffs_fls() +{ + /* Verify ffs/fls work properly. */ + int rv = 0; + rv += (tlsf_ffs(0) == -1) ? 0 : 0x1; + rv += (tlsf_fls(0) == -1) ? 0 : 0x2; + rv += (tlsf_ffs(1) == 0) ? 0 : 0x4; + rv += (tlsf_fls(1) == 0) ? 0 : 0x8; + rv += (tlsf_ffs(0x80000000) == 31) ? 0 : 0x10; + rv += (tlsf_ffs(0x80008000) == 15) ? 0 : 0x20; + rv += (tlsf_fls(0x80000008) == 31) ? 0 : 0x40; + rv += (tlsf_fls(0x7FFFFFFF) == 30) ? 0 : 0x80; + +#if defined(TLSF_64BIT) + rv += (tlsf_fls_sizet(0x80000000) == 31) ? 0 : 0x100; + rv += (tlsf_fls_sizet(0x100000000) == 32) ? 0 : 0x200; + rv += (tlsf_fls_sizet(0xffffffffffffffff) == 63) ? 0 : 0x400; +#endif + + if (rv) + printf("test_ffs_fls: %x ffs/fls tests failed.\n", rv); + return rv; +} + +int main() +{ + return test_ffs_fls(); +} diff --git a/tlsf-bsd/tlsf/tlsf.c b/tlsf-bsd/tlsf/tlsf.c new file mode 100644 index 0000000000..c30eabb3d9 --- /dev/null +++ b/tlsf-bsd/tlsf/tlsf.c @@ -0,0 +1,1045 @@ +/* Copyright (c) 2016 National Cheng Kung University, Taiwan. + * Copyright (c) 2006-2008, 2011, 2014 Matthew Conte. + * All rights reserved. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "tlsf.h" + +#include "tlsf_utils.h" + +#if __GNUC__ || __INTEL_COMPILER +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif + +#ifdef TLSF_CONFIG_ASSERT +#include <assert.h> +#define tlsf_assert(expr) assert(expr) +#else +#define tlsf_assert(expr) (void)(0) +#endif + +/* Public constants: may be modified. */ +enum tlsf_public { + /* log2 of number of linear subdivisions of block sizes. Larger + * values require more memory in the control structure. Values of + * 4 or 5 are typical. + */ + SL_INDEX_COUNT_LOG2 = 5, +}; + +/* Private constants: do not modify. */ +enum tlsf_private { +#if defined(TLSF_64BIT) + /* All allocation sizes and addresses are aligned to 8 bytes. */ + ALIGN_SIZE_LOG2 = 3, +#else + /* All allocation sizes and addresses are aligned to 4 bytes. */ + ALIGN_SIZE_LOG2 = 2, +#endif + ALIGN_SIZE = (1 << ALIGN_SIZE_LOG2), + +/* + * We support allocations of sizes up to (1 << FL_INDEX_MAX) bits. + * However, because we linearly subdivide the second-level lists, and + * our minimum size granularity is 4 bytes, it doesn't make sense to + * create first-level lists for sizes smaller than SL_INDEX_COUNT * 4, + * or (1 << (SL_INDEX_COUNT_LOG2 + 2)) bytes, as there we will be + * trying to split size ranges into more slots than we have available. + * Instead, we calculate the minimum threshold size, and place all + * blocks below that size into the 0th first-level list. + */ + +#if defined(TLSF_64BIT) + FL_INDEX_MAX = 40, /* 1 TB */ +#else + FL_INDEX_MAX = 30, +#endif + SL_INDEX_COUNT = (1 << SL_INDEX_COUNT_LOG2), + FL_INDEX_SHIFT = (SL_INDEX_COUNT_LOG2 + ALIGN_SIZE_LOG2), + FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1), + + SMALL_BLOCK_SIZE = (1 << FL_INDEX_SHIFT), +}; + +/* + * Cast and min/max macros. + */ +#define tlsf_cast(t, exp) ((t)(exp)) +#define tlsf_min(a, b) ((a) < (b) ? (a) : (b)) +#define tlsf_max(a, b) ((a) > (b) ? (a) : (b)) + +/* + * Static assertion mechanism. + */ +#define _tlsf_glue2(x, y) x##y +#define _tlsf_glue(x, y) _tlsf_glue2(x, y) +#define tlsf_static_assert(exp) \ + typedef char _tlsf_glue(static_assert, __LINE__)[(exp) ? 1 : -1] + +/* This code has been tested on 32- and 64-bit (LP/LLP) architectures. */ +tlsf_static_assert(sizeof(int) * CHAR_BIT == 32); +tlsf_static_assert(sizeof(size_t) * CHAR_BIT >= 32); +tlsf_static_assert(sizeof(size_t) * CHAR_BIT <= 64); + +/* SL_INDEX_COUNT must be <= number of bits in sl_bitmap's storage type. */ +tlsf_static_assert(sizeof(unsigned int) * CHAR_BIT >= SL_INDEX_COUNT); + +/* Ensure we've properly tuned our sizes. */ +tlsf_static_assert(ALIGN_SIZE == SMALL_BLOCK_SIZE / SL_INDEX_COUNT); + +/* + * Data structures and associated constants. + */ + +/* + * Block header structure. + * + * There are several implementation subtleties involved: + * - The prev_phys_block field is only valid if the previous block is free. + * - The prev_phys_block field is actually stored at the end of the + * previous block. It appears at the beginning of this structure only to + * simplify the implementation. + * - The next_free / prev_free fields are only valid if the block is free. + */ +typedef struct block_header_t { + /* Points to the previous physical block. */ + struct block_header_t *prev_phys_block; + + /* The size of this block, excluding the block header. */ + size_t size; + + /* Next and previous free blocks. */ + struct block_header_t *next_free; + struct block_header_t *prev_free; +} block_header_t; + +/* + * Since block sizes are always at least a multiple of 4, the two least + * significant bits of the size field are used to store the block status: + * - bit 0: whether block is busy or free + * - bit 1: whether previous block is busy or free + */ +static const size_t block_header_free_bit = 1 << 0; +static const size_t block_header_prev_free_bit = 1 << 1; + +/* + * The size of the block header exposed to used blocks is the size field. + * The prev_phys_block field is stored *inside* the previous free block. + */ +static const size_t block_header_overhead = sizeof(size_t); + +/* + * The size of the block header that overlaps the previous block, + * namely the size of prev_phys_block field. + */ +static const size_t block_header_overlap = sizeof(block_header_t *); + +/* User data starts directly after the size field in a used block. */ +static const size_t block_start_offset = + offsetof(block_header_t, size) + sizeof(size_t); + +/* + * A free block must be large enough to store its header minus the size of + * the metadata field, and no larger than the number of addressable + * bits for FL_INDEX. + */ +static const size_t block_size_min = + sizeof(block_header_t) - sizeof(size_t); // FIXME: metadata +static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX; + +/* The TLSF control structure. */ +typedef struct control_t { + /* Empty lists point at this block to indicate they are free. */ + block_header_t block_null; + + /* Bitmaps for free lists. */ + unsigned int fl_bitmap; + unsigned int sl_bitmap[FL_INDEX_COUNT]; + + /* Head of free lists. */ + block_header_t *blocks[FL_INDEX_COUNT][SL_INDEX_COUNT]; +} control_t; + +/* + * block_header_t member functions. + */ + +static size_t block_size(const block_header_t *block) +{ + return block->size & ~(block_header_free_bit | block_header_prev_free_bit); +} + +static void block_set_size(block_header_t *block, size_t size) +{ + const size_t oldsize = block->size; + block->size = + size | (oldsize & (block_header_free_bit | block_header_prev_free_bit)); +} + +__attribute__((unused)) static int block_is_last(const block_header_t *block) +{ + return block_size(block) == 0; +} + +static int block_is_free(const block_header_t *block) +{ + return tlsf_cast(int, block->size &block_header_free_bit); +} + +static void block_set_free(block_header_t *block) +{ + block->size |= block_header_free_bit; +} + +static void block_set_used(block_header_t *block) +{ + block->size &= ~block_header_free_bit; +} + +static int block_is_prev_free(const block_header_t *block) +{ + return tlsf_cast(int, block->size &block_header_prev_free_bit); +} + +static void block_set_prev_free(block_header_t *block) +{ + block->size |= block_header_prev_free_bit; +} + +static void block_set_prev_used(block_header_t *block) +{ + block->size &= ~block_header_prev_free_bit; +} + +static block_header_t *block_from_ptr(const void *ptr) +{ + return tlsf_cast(block_header_t *, + tlsf_cast(unsigned char *, ptr) - block_start_offset); +} + +static void *block_to_ptr(const block_header_t *block) +{ + return tlsf_cast(void *, + tlsf_cast(unsigned char *, block) + block_start_offset); +} + +/* Return location of next block after block of given size. */ +static block_header_t *offset_to_block(const void *ptr, ptrdiff_t size) +{ + return tlsf_cast(block_header_t *, + tlsf_cast(ptrdiff_t, ptr) + size - block_header_overlap); +} + +/* Return location of previous block. */ +static block_header_t *block_prev(const block_header_t *block) +{ + tlsf_assert(block_is_prev_free(block) && "previous block must be free"); + return block->prev_phys_block; +} + +/* Return location of next existing block. */ +static block_header_t *block_next(const block_header_t *block) +{ + block_header_t *next = + offset_to_block(block_to_ptr(block), block_size(block)); + tlsf_assert(!block_is_last(block)); + return next; +} + +/* Link a new block with its physical neighbor, return the neighbor. */ +static block_header_t *block_link_next(block_header_t *block) +{ + block_header_t *next = block_next(block); + next->prev_phys_block = block; + return next; +} + +static void block_mark_as_free(block_header_t *block) +{ + /* Link the block to the next block, first. */ + block_header_t *next = block_link_next(block); + block_set_prev_free(next); + block_set_free(block); +} + +static void block_mark_as_used(block_header_t *block) +{ + block_header_t *next = block_next(block); + block_set_prev_used(next); + block_set_used(block); +} + +static size_t align_up(size_t x, size_t align) +{ + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return (x + (align - 1)) & ~(align - 1); +} + +static size_t align_down(size_t x, size_t align) +{ + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return x - (x & (align - 1)); +} + +static void *align_ptr(const void *ptr, size_t align) +{ + const ptrdiff_t aligned = + (tlsf_cast(ptrdiff_t, ptr) + (align - 1)) & ~(align - 1); + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return tlsf_cast(void *, aligned); +} + +/* + * Adjust an allocation size to be aligned to word size, and no smaller + * than internal minimum. +*/ +static size_t adjust_request_size(size_t size, size_t align) +{ + size_t adjust = 0; + if (size) { + const size_t aligned = align_up(size, align); + + /* aligned sized must not exceed block_size_max */ + if (aligned < block_size_max) { + adjust = tlsf_max(aligned, block_size_min); + } + } + return adjust; +} + +/* + * TLSF utility functions. In most cases, these are direct translations of + * the documentation found in the white paper. +*/ + +static void mapping_insert(size_t size, int *fli, int *sli) +{ + int fl, sl; + if (size < SMALL_BLOCK_SIZE) { + /* Store small blocks in first list. */ + fl = 0; + sl = tlsf_cast(int, size) / (SMALL_BLOCK_SIZE / SL_INDEX_COUNT); + } else { + fl = tlsf_fls_sizet(size); + sl = tlsf_cast(int, size >> (fl - SL_INDEX_COUNT_LOG2)) ^ + (1 << SL_INDEX_COUNT_LOG2); + fl -= (FL_INDEX_SHIFT - 1); + } + *fli = fl; + *sli = sl; +} + +/* This version rounds up to the next block size (for allocations) */ +static void mapping_search(size_t size, int *fli, int *sli) +{ + if (size >= SMALL_BLOCK_SIZE) { + const size_t round = + (1 << (tlsf_fls_sizet(size) - SL_INDEX_COUNT_LOG2)) - 1; + size += round; + } + mapping_insert(size, fli, sli); +} + +static block_header_t *search_suitable_block(control_t *control, + int *fli, + int *sli) +{ + int fl = *fli; + int sl = *sli; + + /* + * First, search for a block in the list associated with the given + * fl/sl index. + */ + unsigned int sl_map = control->sl_bitmap[fl] & (((unsigned int)~0) << sl); + if (!sl_map) { + /* No block exists. Search in the next largest first-level list. */ + const unsigned int fl_map = + control->fl_bitmap & (((unsigned int)~0) << (fl + 1)); + if (!fl_map) { + /* No free blocks available, memory has been exhausted. */ + return NULL; + } + + fl = tlsf_ffs(fl_map); + *fli = fl; + sl_map = control->sl_bitmap[fl]; + } + tlsf_assert(sl_map && "internal error - second level bitmap is null"); + sl = tlsf_ffs(sl_map); + *sli = sl; + + /* Return the first block in the free list. */ + return control->blocks[fl][sl]; +} + +/* Remove a free block from the free list.*/ +static void remove_free_block(control_t *control, + block_header_t *block, + int fl, + int sl) +{ + block_header_t *prev = block->prev_free; + block_header_t *next = block->next_free; + tlsf_assert(prev && "prev_free field can not be null"); + tlsf_assert(next && "next_free field can not be null"); + next->prev_free = prev; + prev->next_free = next; + + /* If this block is the head of the free list, set new head. */ + if (control->blocks[fl][sl] == block) { + control->blocks[fl][sl] = next; + + /* If the new head is null, clear the bitmap. */ + if (next == &control->block_null) { + control->sl_bitmap[fl] &= ~(1U << sl); + + /* If the second bitmap is now empty, clear the fl bitmap. */ + if (!control->sl_bitmap[fl]) { + control->fl_bitmap &= ~(1U << fl); + } + } + } +} + +/* Insert a free block into the free block list. */ +static void insert_free_block(control_t *control, + block_header_t *block, + int fl, + int sl) +{ + block_header_t *current = control->blocks[fl][sl]; + tlsf_assert(current && "free list cannot have a null entry"); + tlsf_assert(block && "cannot insert a null entry into the free list"); + block->next_free = current; + block->prev_free = &control->block_null; + current->prev_free = block; + + tlsf_assert(block_to_ptr(block) == + align_ptr(block_to_ptr(block), ALIGN_SIZE) && + "block not aligned properly"); + /* + * Insert the new block at the head of the list, and mark the first- + * and second-level bitmaps appropriately. + */ + control->blocks[fl][sl] = block; + control->fl_bitmap |= (1U << fl); + control->sl_bitmap[fl] |= (1U << sl); +} + +/* Remove a given block from the free list. */ +static void block_remove(control_t *control, block_header_t *block) +{ + int fl, sl; + mapping_insert(block_size(block), &fl, &sl); + remove_free_block(control, block, fl, sl); +} + +/* Insert a given block into the free list. */ +static void block_insert(control_t *control, block_header_t *block) +{ + int fl, sl; + mapping_insert(block_size(block), &fl, &sl); + insert_free_block(control, block, fl, sl); +} + +static int block_can_split(block_header_t *block, size_t size) +{ + return block_size(block) >= sizeof(block_header_t) + size; +} + +/* Split a block into two, the second of which is free. */ +static block_header_t *block_split(block_header_t *block, size_t size) +{ + /* Calculate the amount of space left in the remaining block. */ + block_header_t *remaining = offset_to_block(block_to_ptr(block), size); + + const size_t remain_size = + block_size(block) - (size + block_header_overhead); + + tlsf_assert(block_to_ptr(remaining) == + align_ptr(block_to_ptr(remaining), ALIGN_SIZE) && + "remaining block not aligned properly"); + + tlsf_assert(block_size(block) == + remain_size + size + block_header_overhead); + block_set_size(remaining, remain_size); + tlsf_assert(block_size(remaining) >= block_size_min && + "block split with invalid size"); + + block_set_size(block, size); + block_mark_as_free(remaining); + + return remaining; +} + +/* Absorb a free block's storage into an adjacent previous free block. */ +static block_header_t *block_absorb(block_header_t *prev, block_header_t *block) +{ + tlsf_assert(!block_is_last(prev) && "previous block can't be last"); + /* Note: Leaves flags untouched. */ + prev->size += block_size(block) + block_header_overhead; + block_link_next(prev); + return prev; +} + +/* Merge a just-freed block with an adjacent previous free block. */ +static block_header_t *block_merge_prev(control_t *control, + block_header_t *block) +{ + if (block_is_prev_free(block)) { + block_header_t *prev = block_prev(block); + tlsf_assert(prev && "prev physical block can't be null"); + tlsf_assert(block_is_free(prev) && + "prev block is not free though marked as such"); + block_remove(control, prev); + block = block_absorb(prev, block); + } + + return block; +} + +/* Merge a just-freed block with an adjacent free block. */ +static block_header_t *block_merge_next(control_t *control, + block_header_t *block) +{ + block_header_t *next = block_next(block); + tlsf_assert(next && "next physical block can't be null"); + + if (block_is_free(next)) { + tlsf_assert(!block_is_last(block) && "previous block can't be last"); + block_remove(control, next); + block = block_absorb(block, next); + } + + return block; +} + +/* Trim any trailing block space off the end of a block, return to pool. */ +static void block_trim_free(control_t *control, + block_header_t *block, + size_t size) +{ + tlsf_assert(block_is_free(block) && "block must be free"); + if (block_can_split(block, size)) { + block_header_t *remaining_block = block_split(block, size); + block_link_next(block); + block_set_prev_free(remaining_block); + block_insert(control, remaining_block); + } +} + +/* Trim any trailing block space off the end of a used block, return to pool. */ +static void block_trim_used(control_t *control, + block_header_t *block, + size_t size) +{ + tlsf_assert(!block_is_free(block) && "block must be used"); + if (block_can_split(block, size)) { + /* If the next block is free, we must coalesce. */ + block_header_t *remaining_block = block_split(block, size); + block_set_prev_used(remaining_block); + + remaining_block = block_merge_next(control, remaining_block); + block_insert(control, remaining_block); + } +} + +/* If possible, create a trailing free block after trimming given block by size + */ +static block_header_t *block_trim_free_leading(control_t *control, + block_header_t *block, + size_t size) +{ + block_header_t *remaining_block = block; + if (block_can_split(block, size)) { + /* We want the 2nd block. */ + remaining_block = block_split(block, size - block_header_overhead); + block_set_prev_free(remaining_block); + + block_link_next(block); + block_insert(control, block); + } + + return remaining_block; +} + +static block_header_t *block_locate_free(control_t *control, size_t size) +{ + int fl = 0, sl = 0; + block_header_t *block = NULL; + + if (size) { + mapping_search(size, &fl, &sl); + /* + * mapping_search can futz with the size, so for excessively large + * sizes it can sometimes wind up with indices that are off the end + * of the block array. + * So, we protect against that here, since this is the only callsite of + * mapping_search. + * Note that we don't need to check sl, since it comes from a modulo + * operation that guarantees it's always in range. + */ + if (fl < FL_INDEX_COUNT) { + block = search_suitable_block(control, &fl, &sl); + } + } + + if (block) { + tlsf_assert(block_size(block) >= size); + remove_free_block(control, block, fl, sl); + } + + if (unlikely(block && !block->size)) + block = NULL; + + return block; +} + +static void *block_prepare_used(control_t *control, + block_header_t *block, + size_t size) +{ + void *p = NULL; + if (block) { + tlsf_assert(size && "size must be non-zero"); + block_trim_free(control, block, size); + block_mark_as_used(block); + p = block_to_ptr(block); + } + return p; +} + +/* Clear structure and point all empty lists at the null block. */ +static void control_construct(control_t *control) +{ + int i, j; + + control->block_null.next_free = &control->block_null; + control->block_null.prev_free = &control->block_null; + + control->fl_bitmap = 0; + for (i = 0; i < FL_INDEX_COUNT; ++i) { + control->sl_bitmap[i] = 0; + for (j = 0; j < SL_INDEX_COUNT; ++j) { + control->blocks[i][j] = &control->block_null; + } + } +} + +/* + * Debugging utilities. + */ +#ifdef TLSF_CONFIG_DEBUG + +typedef struct integrity_t { + int prev_status; + int status; +} integrity_t; + +#define tlsf_insist(x) \ + do { \ + tlsf_assert(x); \ + if (!(x)) \ + status--; \ + } while (0) + +static void integrity_walker(void *ptr, size_t size, int used, void *user) +{ + block_header_t *block = block_from_ptr(ptr); + integrity_t *integ = tlsf_cast(integrity_t *, user); + const int this_prev_status = block_is_prev_free(block) ? 1 : 0; + const int this_status = block_is_free(block) ? 1 : 0; + const size_t this_block_size = block_size(block); + + int status = 0; + (void)used; + tlsf_insist(integ->prev_status == this_prev_status && + "prev status incorrect"); + tlsf_insist(size == this_block_size && "block size incorrect"); + + integ->prev_status = this_status; + integ->status += status; +} + +int tlsf_check(tlsf_t tlsf) +{ + int i, j; + + control_t *control = tlsf_cast(control_t *, tlsf); + int status = 0; + + /* Check that the free lists and bitmaps are accurate. */ + for (i = 0; i < FL_INDEX_COUNT; ++i) { + for (j = 0; j < SL_INDEX_COUNT; ++j) { + const int fl_map = control->fl_bitmap & (1 << i); + const int sl_list = control->sl_bitmap[i]; + const int sl_map = sl_list & (1 << j); + const block_header_t *block = control->blocks[i][j]; + + /* Check that first- and second-level lists agree. */ + if (!fl_map) { + tlsf_insist(!sl_map && "second-level map must be null"); + } + + if (!sl_map) { + tlsf_insist(block == &control->block_null && + "block list must be null"); + continue; + } + + /* Check that there is at least one free block. */ + tlsf_insist(sl_list && "no free blocks in second-level map"); + tlsf_insist(block != &control->block_null && + "block should not be null"); + + while (block != &control->block_null) { + int fli, sli; + tlsf_insist(block_is_free(block) && "block should be free"); + tlsf_insist(!block_is_prev_free(block) && + "blocks should have coalesced"); + tlsf_insist(!block_is_free(block_next(block)) && + "blocks should have coalesced"); + tlsf_insist(block_is_prev_free(block_next(block)) && + "block should be free"); + tlsf_insist(block_size(block) >= block_size_min && + "block not minimum size"); + + mapping_insert(block_size(block), &fli, &sli); + tlsf_insist(fli == i && sli == j && + "block size indexed in wrong list"); + block = block->next_free; + } + } + } + + return status; +} + +#undef tlsf_insist + +static void default_walker(void *ptr, size_t size, int used, void *user) +{ + (void)user; + printf("\t%p %s size: %x (%p)\n", ptr, used ? "used" : "free", + (unsigned int)size, block_from_ptr(ptr)); +} + +void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void *user) +{ + tlsf_walker pool_walker = walker ? walker : default_walker; + block_header_t *block = offset_to_block(pool, 0); + + while (block && !block_is_last(block)) { + pool_walker(block_to_ptr(block), block_size(block), + !block_is_free(block), user); + block = block_next(block); + } +} + +size_t tlsf_block_size(void *ptr) +{ + size_t size = 0; + if (ptr) { + const block_header_t *block = block_from_ptr(ptr); + size = block_size(block); + } + return size; +} + +int tlsf_check_pool(pool_t pool) +{ + /* Check that the blocks are physically correct. */ + integrity_t integ = {0, 0}; + tlsf_walk_pool(pool, integrity_walker, &integ); + + return integ.status; +} + +#endif /* TLSF_CONFIG_DEBUG */ + +/* + * Size of the TLSF structures in a given memory block passed to + * tlsf_create, equal to the size of a control_t + */ +size_t tlsf_size(void) +{ + return sizeof(control_t); +} + +size_t tlsf_align_size(void) +{ + return ALIGN_SIZE; +} + +size_t tlsf_block_size_min(void) +{ + return block_size_min; +} + +size_t tlsf_block_size_max(void) +{ + return block_size_max; +} + +/* + * Overhead of the TLSF structures in a given memory block passed to + * tlsf_add_pool, equal to the overhead of a free block and the + * sentinel block. + */ +size_t tlsf_pool_overhead(void) +{ + return 2 * block_header_overhead; +} + +size_t tlsf_alloc_overhead(void) +{ + return block_header_overhead; +} + +pool_t tlsf_add_pool(tlsf_t tlsf, void *mem, size_t bytes) +{ + block_header_t *block; + block_header_t *next; + + const size_t pool_overhead = tlsf_pool_overhead(); + const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE); + + if (((ptrdiff_t)mem % ALIGN_SIZE) != 0) { + printf("tlsf_add_pool: Memory must be aligned by %u bytes.\n", + (unsigned int)ALIGN_SIZE); + return 0; + } + + if (pool_bytes < block_size_min || pool_bytes > block_size_max) { + printf( + "tlsf_add_pool: Memory size must be between %zu and %zu bytes.\n", + pool_overhead + block_size_min, pool_overhead + block_size_max); + return 0; + } + + /* + * Create the main free block. Offset the start of the block slightly + * so that the prev_phys_block field falls outside of the pool - + * it will never be used. + */ + block = offset_to_block(mem, 0); + block_set_size(block, pool_bytes); + block_set_free(block); + block_set_prev_used(block); + block_insert(tlsf_cast(control_t *, tlsf), block); + + /* Split the block to create a zero-size sentinel block. */ + next = block_link_next(block); + block_set_size(next, 0); + block_set_used(next); + block_set_prev_free(next); + + return mem; +} + +void tlsf_remove_pool(tlsf_t tlsf, pool_t pool) +{ + control_t *control = tlsf_cast(control_t *, tlsf); + block_header_t *block = offset_to_block(pool, 0); + + int fl = 0, sl = 0; + + tlsf_assert(block_is_free(block) && "block should be free"); + tlsf_assert(!block_is_free(block_next(block)) && + "next block should not be free"); + tlsf_assert(block_size(block_next(block)) == 0 && + "next block size should be zero"); + + mapping_insert(block_size(block), &fl, &sl); + remove_free_block(control, block, fl, sl); +} + +/* + * TLSF main interface. + */ + +tlsf_t tlsf_create(void *mem) +{ + if (((ptrdiff_t)mem % ALIGN_SIZE) != 0) { + printf("tlsf_create: Memory must be aligned to %u bytes.\n", + (unsigned int)ALIGN_SIZE); + return NULL; + } + + control_construct(tlsf_cast(control_t *, mem)); + + return tlsf_cast(tlsf_t, mem); +} + +tlsf_t tlsf_create_with_pool(void *mem, size_t bytes) +{ + tlsf_t tlsf = tlsf_create(mem); + tlsf_add_pool(tlsf, (char *)mem + tlsf_size(), bytes - tlsf_size()); + return tlsf; +} + +void tlsf_destroy(tlsf_t tlsf) +{ + /* Nothing to do. */ + (void)tlsf; +} + +pool_t tlsf_get_pool(tlsf_t tlsf) +{ + return tlsf_cast(pool_t, (char *)tlsf + tlsf_size()); +} + +void *tlsf_malloc(tlsf_t tlsf, size_t size) +{ + control_t *control = tlsf_cast(control_t *, tlsf); + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + block_header_t *block = block_locate_free(control, adjust); + return block_prepare_used(control, block, adjust); +} + +void *tlsf_memalign(tlsf_t tlsf, size_t align, size_t size) +{ + control_t *control = tlsf_cast(control_t *, tlsf); + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + + /* + * We must allocate an additional minimum block size bytes so that if + * our free block will leave an alignment gap which is smaller, we can + * trim a leading free block and release it back to the pool. We must + * do this because the previous physical block is in use, therefore + * the prev_phys_block field is not valid, and we can't simply adjust + * the size of that block. + */ + const size_t gap_minimum = sizeof(block_header_t); + const size_t size_with_gap = + adjust_request_size(adjust + align + gap_minimum, align); + + /* + * If alignment is less than or equals base alignment, we're done. + * If we requested 0 bytes, return null, as tlsf_malloc(0) does. + */ + const size_t aligned_size = + (adjust && align > ALIGN_SIZE) ? size_with_gap : adjust; + + block_header_t *block = block_locate_free(control, aligned_size); + + /* This can't be a static assert. */ + tlsf_assert(sizeof(block_header_t) == + block_size_min + block_header_overhead); + + if (block) { + void *ptr = block_to_ptr(block); + void *aligned = align_ptr(ptr, align); + size_t gap = tlsf_cast( + size_t, tlsf_cast(ptrdiff_t, aligned) - tlsf_cast(ptrdiff_t, ptr)); + + /* If gap size is too small, offset to next aligned boundary. */ + if (gap && gap < gap_minimum) { + const size_t gap_remain = gap_minimum - gap; + const size_t offset = tlsf_max(gap_remain, align); + const void *next_aligned = + tlsf_cast(void *, tlsf_cast(ptrdiff_t, aligned) + offset); + + aligned = align_ptr(next_aligned, align); + gap = tlsf_cast(size_t, tlsf_cast(ptrdiff_t, aligned) - + tlsf_cast(ptrdiff_t, ptr)); + } + + if (gap) { + tlsf_assert(gap >= gap_minimum && "gap size too small"); + block = block_trim_free_leading(control, block, gap); + } + } + + return block_prepare_used(control, block, adjust); +} + +void tlsf_free(tlsf_t tlsf, void *ptr) +{ + if (unlikely(!ptr)) + return; + + control_t *control = tlsf_cast(control_t *, tlsf); + block_header_t *block = block_from_ptr(ptr); + tlsf_assert(!block_is_free(block) && "block already marked as free"); + block_mark_as_free(block); + block = block_merge_prev(control, block); + block = block_merge_next(control, block); + block_insert(control, block); +} + +/* + * The TLSF block information provides us with enough information to + * provide a reasonably intelligent implementation of realloc, growing or + * shrinking the currently allocated block as required. + * + * This routine handles the somewhat esoteric edge cases of realloc: + * - a non-zero size with a null pointer will behave like malloc + * - a zero size with a non-null pointer will behave like free + * - a request that cannot be satisfied will leave the original buffer + * untouched + * - an extended buffer size will leave the newly-allocated area with + * contents undefined + */ +void *tlsf_realloc(tlsf_t tlsf, void *ptr, size_t size) +{ + control_t *control = tlsf_cast(control_t *, tlsf); + void *p = NULL; + + /* Zero-size requests are treated as free. */ + if (ptr && size == 0) { + tlsf_free(tlsf, ptr); + } + /* Requests with NULL pointers are treated as malloc. */ + else if (!ptr) { + p = tlsf_malloc(tlsf, size); + } else { + block_header_t *block = block_from_ptr(ptr); + block_header_t *next = block_next(block); + + const size_t cursize = block_size(block); + const size_t combined = + cursize + block_size(next) + block_header_overhead; + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + + tlsf_assert(!block_is_free(block) && "block already marked as free"); + + /* + * If the next block is used, or when combined with the current + * block, does not offer enough space, we must reallocate and copy. + */ + if (adjust > cursize && (!block_is_free(next) || adjust > combined)) { + p = tlsf_malloc(tlsf, size); + if (p) { + const size_t minsize = tlsf_min(cursize, size); + memcpy(p, ptr, minsize); + tlsf_free(tlsf, ptr); + } + } else { + /* Do we need to expand to the next block? */ + if (adjust > cursize) { + block_merge_next(control, block); + block_mark_as_used(block); + } + + /* Trim the resulting block and return the original pointer. */ + block_trim_used(control, block, adjust); + p = ptr; + } + } + + return p; +} diff --git a/tlsf-bsd/tlsf/tlsf.h b/tlsf-bsd/tlsf/tlsf.h new file mode 100644 index 0000000000..74a6b566eb --- /dev/null +++ b/tlsf-bsd/tlsf/tlsf.h @@ -0,0 +1,83 @@ +#ifndef INCLUDED_tlsf +#define INCLUDED_tlsf + +/* + * Two Level Segregated Fit memory allocator. + * + * Copyright (c) 2006-2008, 2011, 2014 Matthew Conte. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL MATTHEW CONTE BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stddef.h> + +#if defined(__cplusplus) +extern "C" { +#endif + +/* tlsf_t: a TLSF structure. Can contain 1 to N pools. */ +/* pool_t: a block of memory that TLSF can manage. */ +typedef void *tlsf_t; +typedef void *pool_t; + +/* Create/destroy a memory pool. */ +tlsf_t tlsf_create(void *mem); +tlsf_t tlsf_create_with_pool(void *mem, size_t bytes); +void tlsf_destroy(tlsf_t tlsf); +pool_t tlsf_get_pool(tlsf_t tlsf); + +/* Add/remove memory pools. */ +pool_t tlsf_add_pool(tlsf_t tlsf, void *mem, size_t bytes); +void tlsf_remove_pool(tlsf_t tlsf, pool_t pool); + +/* malloc/memalign/realloc/free replacements. */ +void *tlsf_malloc(tlsf_t tlsf, size_t bytes); +void *tlsf_memalign(tlsf_t tlsf, size_t align, size_t bytes); +void *tlsf_realloc(tlsf_t tlsf, void *ptr, size_t size); +void tlsf_free(tlsf_t tlsf, void *ptr); + +/* Returns internal block size, not original request size */ +size_t tlsf_block_size(void *ptr); + +/* Overheads/limits of internal structures. */ +size_t tlsf_size(void); +size_t tlsf_align_size(void); +size_t tlsf_block_size_min(void); +size_t tlsf_block_size_max(void); +size_t tlsf_pool_overhead(void); +size_t tlsf_alloc_overhead(void); + +/* Debugging. */ +#ifdef TLSF_CONFIG_DEBUG +typedef void (*tlsf_walker)(void *ptr, size_t size, int used, void *user); +void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void *user); +/* Returns nonzero if any internal consistency check fails. */ +int tlsf_check(tlsf_t tlsf); +int tlsf_check_pool(pool_t pool); +#endif /* TLSF_CONFIG_DEBUG */ + +#if defined(__cplusplus) +}; +#endif + +#endif diff --git a/tlsf-bsd/tlsf/tlsf_utils.h b/tlsf-bsd/tlsf/tlsf_utils.h new file mode 100644 index 0000000000..144e07fece --- /dev/null +++ b/tlsf-bsd/tlsf/tlsf_utils.h @@ -0,0 +1,202 @@ +#ifndef INCLUDED_tlsf_utils +#define INCLUDED_tlsf_utils + +#include <stdint.h> + +/* +** Architecture-specific bit manipulation routines. +** +** TLSF achieves O(1) cost for malloc and free operations by limiting +** the search for a free block to a free list of guaranteed size +** adequate to fulfill the request, combined with efficient free list +** queries using bitmasks and architecture-specific bit-manipulation +** routines. +** +** Most modern processors provide instructions to count leading zeroes +** in a word, find the lowest and highest set bit, etc. These +** specific implementations will be used when available, falling back +** to a reasonably efficient generic implementation. +** +** NOTE: TLSF spec relies on ffs/fls returning value 0..31. +** ffs/fls return 1-32 by default, returning 0 for error. +*/ + +/* +** Detect whether or not we are building for a 32- or 64-bit (LP/LLP) +** architecture. There is no reliable portable method at compile-time. +*/ +#if defined(__alpha__) || defined(__ia64__) || defined(__x86_64__) || \ + defined(_WIN64) || defined(__LP64__) || defined(__LLP64__) || \ + defined(__aarch64__) +#define TLSF_64BIT +#endif + +#if defined(__GNUC__) + +/* count leading zeroes: + * clz(0) == 32, clz(0xf) == 28, clz(1 << 31) == 0 + */ +static inline int clz(uint32_t x) +{ + return x ? __builtin_clz(x) : sizeof(x) * 8; +} + +/* integer binary logarithm (rounding down): + * log2(0) == -1, log2(5) == 2 + */ +static inline int __log2(uint32_t x) +{ + return sizeof(x) * 8 - clz(x) - 1; +} + +/* find first set: + * __ffs(1) == 0, __ffs(0) == -1, __ffs(1<<31) == 31 + */ +static inline int tlsf_ffs(unsigned int word) +{ + return __log2(word & (uint32_t)(-(uint32_t)word)); +} + +static inline int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __builtin_clz(word) : 0; + return bit - 1; +} + +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) && \ + (defined(_M_IX86) || defined(_M_X64)) +/* Microsoft Visual C++ support on x86/X64 architectures. */ + +#include <intrin.h> + +#pragma intrinsic(_BitScanReverse) +#pragma intrinsic(_BitScanForward) + +static inline int tlsf_fls(unsigned int word) +{ + unsigned long index; + return _BitScanReverse(&index, word) ? index : -1; +} + +static inline int tlsf_ffs(unsigned int word) +{ + unsigned long index; + return _BitScanForward(&index, word) ? index : -1; +} + +#elif defined(_MSC_VER) && defined(_M_PPC) +/* Microsoft Visual C++ support on PowerPC architectures. */ + +#include <ppcintrinsics.h> + +static inline int tlsf_fls(unsigned int word) +{ + const int bit = 32 - _CountLeadingZeros(word); + return bit - 1; +} + +static inline int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - _CountLeadingZeros(reverse); + return bit - 1; +} + +#elif defined(__ARMCC_VERSION) +/* RealView Compilation Tools for ARM */ + +static inline int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __clz(reverse); + return bit - 1; +} + +static inline int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __clz(word) : 0; + return bit - 1; +} + +#elif defined(__ghs__) +/* Green Hills support for PowerPC */ + +#include <ppc_ghs.h> + +static inline int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __CLZ32(reverse); + return bit - 1; +} + +static inline int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __CLZ32(word) : 0; + return bit - 1; +} + +#else +/* Fall back to generic implementation. */ + +static inline int tlsf_fls_generic(unsigned int word) +{ + int bit = 32; + + if (!word) + bit -= 1; + if (!(word & 0xffff0000)) { + word <<= 16; + bit -= 16; + } + if (!(word & 0xff000000)) { + word <<= 8; + bit -= 8; + } + if (!(word & 0xf0000000)) { + word <<= 4; + bit -= 4; + } + if (!(word & 0xc0000000)) { + word <<= 2; + bit -= 2; + } + if (!(word & 0x80000000)) { + word <<= 1; + bit -= 1; + } + + return bit; +} + +/* Implement ffs in terms of fls. */ +static inline int tlsf_ffs(unsigned int word) +{ + return tlsf_fls_generic(word & (~word + 1)) - 1; +} + +static inline int tlsf_fls(unsigned int word) +{ + return tlsf_fls_generic(word) - 1; +} + +#endif + +/* Possibly 64-bit version of tlsf_fls. */ +#if defined(TLSF_64BIT) +static inline int tlsf_fls_sizet(size_t size) +{ + int high = (int)(size >> 32); + int bits = 0; + if (high) { + bits = 32 + tlsf_fls(high); + } else { + bits = tlsf_fls((int)size & 0xffffffff); + } + return bits; +} +#else +#define tlsf_fls_sizet tlsf_fls +#endif + +#endif /* INCLUDED_tlsf_utils */ From 625ebdb9ba768169d5b477fcc10d2efd5b6de266 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 17:15:22 -0400 Subject: [PATCH 3763/4023] Workaround sparc linux problem --- src/runtime/gencgc.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index cbc4bf2dda..302268e754 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5458,6 +5458,16 @@ gc_and_save(char *filename, boolean prepend_runtime, boolean purify, boolean save_runtime_options, boolean compressed, int compression_level, int application_type) { +#if defined LISP_FEATURE_SPARC && defined LISP_FEATURE_LINUX + /* OS says it'll give you the memory where you want, then it says + * it won't map over it from the core file. That's news to me. + * Fragment of output from 'strace -e mmap2 src/runtime/sbcl --core output/sbcl.core': + * ... + * mmap2(0x2fb58000, 4882432, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2fb58000 + * mmap2(0x2fb58000, 4882432, PROT_READ, MAP_SHARED|MAP_FIXED, 3, 0x2000) = -1 EINVAL (Invalid argument) + */ + purify = 0; +#endif FILE *file; void *runtime_bytes = NULL; size_t runtime_size; From 64be667fefa672dcd673f86679223ce6ad0b8772 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 18:38:57 -0400 Subject: [PATCH 3764/4023] Allow filler objects in text section --- tools-for-build/editcore.lisp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index 96ac360bf6..3e4aa5e822 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1122,7 +1122,12 @@ (t (error "Strange code component: ~S" code))) (incf code-addr objsize))) - ))) + (#.filler-widetag + (let* ((word (sap-ref-word (int-sap (translate-ptr code-addr spaces)) 0)) + (nwords (ash word -32)) + (nbytes (* nwords sb-vm:n-word-bytes))) + (format output " .quad 0x~x~% .fill ~d~%" word (- nbytes n-word-bytes)) + (incf code-addr nbytes)))))) ;; coreparse uses the 'lisp_jit_code' symbol to set text_space_highwatermark ;; The intent is that compilation to memory can use this reserved area From 1fdda6dd4b8bd5b71dc04bd89c9886e8c4b64eaa Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 18:51:38 -0400 Subject: [PATCH 3765/4023] Make a loop less confusing Do an early termination test as the first thing. --- src/runtime/immobile-space.c | 61 +++++++++++++++--------------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 691e366252..67deb994ed 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1823,7 +1823,6 @@ static boolean executable_object_p(lispobj* obj) static void defrag_immobile_space(boolean verbose) { - lispobj* addr; int i; int *components = code_component_order; @@ -1936,7 +1935,7 @@ static void defrag_immobile_space(boolean verbose) #else for (i=0 ; components[i*2] ; ++i) { #endif - addr = (lispobj*)(long)components[i*2]; + lispobj* addr = (lispobj*)(long)components[i*2]; gc_assert(lowtag_of((lispobj)addr) == OTHER_POINTER_LOWTAG); addr = native_pointer((lispobj)addr); int widetag = widetag_of(addr); @@ -1975,40 +1974,30 @@ static void defrag_immobile_space(boolean verbose) // Permute text space into tempspace and deposit forwarding pointers. lispobj new_vaddr; for (i=0 ; components[i*2] ; ++i) { - if ((new_vaddr = components[i*2+1]) != 0) { - addr = native_pointer(components[i*2]); - memcpy(tempspace_addr((void*)new_vaddr), addr, - headerobj_size(addr) << WORD_SHIFT); - int displacement = new_vaddr - (lispobj)addr; - switch (widetag_of(addr)) { - default: - lose("What is object type %x doing here?", widetag_of(addr)); - case CODE_HEADER_WIDETAG: - for_each_simple_fun(index, fun, (struct code*)addr, 1, { - struct simple_fun *new_fun = - (struct simple_fun*)((char*)fun + displacement); - // Fix the 'self' slot for the new logical address, - // storing via the current (temporary) address. - ((struct simple_fun*)tempspace_addr(new_fun))->self = - fun_self_from_baseptr(new_fun); - set_forwarding_pointer((lispobj*)fun, - make_lispobj(new_fun, FUN_POINTER_LOWTAG)); - }); - { - // Fix any absolute jump tables - lispobj* jump_table = - code_jumptable_start((struct code*)tempspace_addr((void*)new_vaddr)); - int count = jumptable_count(jump_table); - int i; - for (i = 1; i < count; ++i) - if (jump_table[i]) jump_table[i] += displacement; - } - break; - } - set_forwarding_pointer(addr, - make_lispobj((void*)new_vaddr, - OTHER_POINTER_LOWTAG)); - } + if ((new_vaddr = components[i*2+1]) == 0) continue; + lispobj* addr = native_pointer(components[i*2]); + gc_assert(widetag_of(addr) == CODE_HEADER_WIDETAG); + memcpy(tempspace_addr((void*)new_vaddr), addr, + headerobj_size(addr) << WORD_SHIFT); + int displacement = new_vaddr - (lispobj)addr; + for_each_simple_fun(index, fun, (struct code*)addr, 1, { + struct simple_fun *new_fun = + (struct simple_fun*)((char*)fun + displacement); + // Fix the 'self' slot for the new logical address, + // storing via the current (temporary) address. + ((struct simple_fun*)tempspace_addr(new_fun))->self = + fun_self_from_baseptr(new_fun); + set_forwarding_pointer((lispobj*)fun, + make_lispobj(new_fun, FUN_POINTER_LOWTAG)); + }); + // Fix any absolute jump tables + lispobj* jump_table = + code_jumptable_start((struct code*)tempspace_addr((void*)new_vaddr)); + int count = jumptable_count(jump_table); + int i; + for (i = 1; i < count; ++i) if (jump_table[i]) jump_table[i] += displacement; + set_forwarding_pointer(addr, make_lispobj((void*)new_vaddr, + OTHER_POINTER_LOWTAG)); } if (aligned_nbytes > n_code_bytes) make_filler(tempspace_addr((char*)TEXT_SPACE_START + n_code_bytes), From 9cf0bbc715c4ed8f0adcc8f04c5577c3ac973362 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 19:04:28 -0400 Subject: [PATCH 3766/4023] Remove unused debugging code --- src/runtime/immobile-space.c | 215 ----------------------------------- 1 file changed, 215 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 67deb994ed..2b1882f70f 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -70,7 +70,6 @@ #define DEFRAGMENT_FIXEDOBJ_SUBSPACE 1 #undef DEBUG -#undef VERIFY_PAGE_GENS #ifdef DEBUG # define dprintf(arg) fprintf arg @@ -147,11 +146,6 @@ lispobj text_holes; #define text_page_touched(x) ((text_page_touched_bits[x/32] >> (x&31)) & 1) -#ifdef VERIFY_PAGE_GENS -void check_fixedobj_page(low_page_index_t, generation_index_t, generation_index_t); -void check_text_pages(); -#endif - //// Variable-length utilities /* Return the generation mask for objects headers on 'page_index' @@ -2208,212 +2202,3 @@ static void apply_absolute_fixups(lispobj fixups, struct code* code) } } #endif - -#ifdef VERIFY_PAGE_GENS -void check_fixedobj_page(int page, - generation_index_t keep_gen, - generation_index_t new_gen) -{ - // Every page should have a 'gens' mask which exactly reflects - // the aggregate over all objects on that page. Verify that invariant, - // checking all pages, not just the ones below the free pointer. - int genmask, obj_size, obj_spacing, i, all_ok = 1; - lispobj *obj, header; - int sees_younger = 0; - - obj_size = fixedobj_page_obj_size(page); - obj_spacing = fixedobj_page_obj_align(page); - obj = fixedobj_page_address(page); - lispobj *limit = compute_fixedobj_limit(obj, obj_spacing); - genmask = 0; - if (obj_size == 0) { - gc_assert(!fixedobj_pages[page].gens); - for (i=0; i<WORDS_PER_PAGE && obj[i]==0; ++i) - ; - if(i<WORDS_PER_PAGE) - lose("page %d @ %p nonempty", page, fixedobj_page_address(page)); - return; - } - do { - header = *obj; - if (!fixnump(header)) { - int gen = immobile_obj_gen_bits(obj); - gc_assert(0 <= gen && gen <= PSEUDO_STATIC_GENERATION); - genmask |= 1<<gen; - if (fixedobj_points_to_younger_p(obj, obj_size, gen, keep_gen, new_gen)) { - if (fixedobj_page_wp(page)) - lose("sees_younger @ %p + %d", obj, obj_size); - sees_younger = 1; - } - } - } while (NEXT_FIXEDOBJ(obj, obj_spacing) <= limit); - // It's not wrong if the gen0 bit is set spuriously, but it should only - // happen at most once, on the first GC after image startup. - // At all other times, the invariant should hold that if the freelist - // indicated that space was available, and the new pointer differs, - // then some gen0 object exists on the page. - // The converse is true because of pseudo-atomicity of the allocator: - // if some thread claimed a hole, then it also updated the freelist. - // If it died before doing the latter, then the object allegedly created - // was never really live, so won't contain any pointers. - if (fixedobj_pages[page].gens != genmask - && fixedobj_pages[page].gens != (genmask|1)) { - fprintf(stderr, "Page %d @ %p: stored mask=%x actual=%x\n", - page, fixedobj_page_address(page), - fixedobj_pages[page].gens, genmask); - all_ok = 0; - } - if (fixedobj_page_wp(page) && sees_younger) { - fprintf(stderr, "Page %d @ %p: WP is wrong\n", - page, fixedobj_page_address(page)); - all_ok = 0; - } - gc_assert(all_ok); -} - -int n_immobile_objects; -int *immobile_objects, *immobile_objects_limit; - -int comparator_eq(const void* a, const void* b) { - return *(int*)a - *(int*)b; -} - -// Find the largest item less than or equal. -// (useful for finding the object that contains a given pointer) -int comparator_le(const void* a, const void* b) { - int diff = *(int*)a - *(int*)b; - if (diff <= 0) return diff; - // If looking to the right would see an item strictly greater - // than the sought key, or there is nothing to the right, - // then deem this an exact match. - if (b == (void*)immobile_objects_limit || ((int*)b)[1] > *(int*)a) return 0; - return 1; -} - -// Find the smallest item greater than or equal. -// useful for finding the lowest item at or after a page base address. -int comparator_ge(const void* a, const void* b) { - int diff = *(int*)a - *(int*)b; - if (diff >= 0) return diff; - // If looking to the left would see an item strictly less - // than the sought key, or there is nothing to the left - // then deem this an exact match. - if (b == (void*)immobile_objects || ((int*)b)[-1] < *(int*)a) return 0; - return -1; -} - -void check_text_pages() -{ - // 1. Check that a linear scan sees only valid object headers, - // and that it terminates exactly at IMMOBILE_CODE_FREE_POINTER. - lispobj* obj = (lispobj*)TEXT_SPACE_START; - lispobj* end = text_space_highwatermark; - low_page_index_t end_page = find_text_page_index((char*)end-1); - - n_immobile_objects = 0; - while (obj < end) { - lispobj word = *obj; - gc_assert(other_immediate_lowtag_p(word)); - int n_words = headerobj_size(obj); - obj += n_words; - ++n_immobile_objects; - } - gc_assert(obj == end); - - // 2. Check that all scan_start_offsets are plausible. - // Begin by collecting all object header locations into an array; - immobile_objects = calloc(n_immobile_objects, sizeof (lispobj)); - immobile_objects_limit = immobile_objects + n_immobile_objects - 1; - obj = (lispobj*)TEXT_SPACE_START; - int i = 0; - while (obj < end) { - immobile_objects[i++] = (lispobj)obj; - lispobj word = *obj; - int n_words = headerobj_size(obj); - obj += n_words; - } - // Check that each page's scan start is a known immobile object - // and that it is the right object. - low_page_index_t page; - for (page = 0; page <= end_page; ++page) { - lispobj page_addr = (lispobj)text_page_address(page); - int* found_below = bsearch(&page_addr, immobile_objects, n_immobile_objects, - sizeof (int), comparator_le); - int* found_above = bsearch(&page_addr, immobile_objects, n_immobile_objects, - sizeof (int), comparator_ge); - int stored_scan_start = (int)(long)text_page_scan_start(page); - lispobj* scan_start_obj = (lispobj*)(long)*found_below; - if (scan_start_obj != (lispobj*)(long)stored_scan_start) { - //printf("page %d: found-below=%p stored=%p\n", page, scan_start_obj, stored_scan_start); - while (filler_obj_p(scan_start_obj)) { - int nwords = headerobj_size(scan_start_obj); - // printf("skipping %d words to %p\n", nwords, scan_start_obj + nwords); - scan_start_obj += nwords; - // the stored scan start does not guarantee that it points - // to a non-hole; we only assert that it *probably* does not. - // As such, when computing the "correct" value, we allow - // any value in between the legal bounding values for it. - if ((int)(long)scan_start_obj == stored_scan_start) - break; - // If you hit the free pointer, or run off the page, - // then the page is completely empty. - if (scan_start_obj == text_space_highwatermark - || scan_start_obj >= (lispobj*)text_page_address(page+1)) { - scan_start_obj = text_page_address(page+1); - break; - } - } - } - if (scan_start_obj != (lispobj*)(long)stored_scan_start) - lose("page %d: stored_scan_start=%p does not match found %p", - page, stored_scan_start, *found_below); - if (found_below != found_above) { - // the object below must touch this page. - // if it didn't, there should be a higher object below. - lispobj* below = (lispobj*)(long)*found_below; - int n_words = headerobj_size(below); - lispobj* end = below + n_words; - gc_assert(end > (lispobj*)page_addr); - } - } - free(immobile_objects); - - // 3. The generation mask for each page is exactly the union - // of generation numbers of object headers on the page. - for (page = 0; page <= end_page; ++page) { - if (!text_page_scan_start_offset[page]) - continue; // page is all holes or never used - obj = text_page_scan_start(page); - lispobj word = *obj; - int n_words = headerobj_size(obj); - // Skip the first object if it doesn't start on this page. - if (obj < (lispobj*)text_page_address(page)) obj += n_words; - lispobj* limit = (lispobj*)text_page_address(page) + WORDS_PER_PAGE; - lispobj* freeptr = text_space_highwatermark; - if (limit > freeptr) limit = freeptr; - int mask = 0; - for ( ; obj < limit ; obj += headerobj_size(obj) ) { - int gen = immobile_obj_gen_bits(obj); - if (filler_obj_p(obj)) { - gc_assert(gen == 0); - } else { - gc_assert(0 <= gen && gen <= PSEUDO_STATIC_GENERATION); - mask |= 1 << gen; - } - } - /* This assertion fails after a fullcgc which doesn't update - * the genmasks, so that they remain as overestimates */ - // gc_assert(mask == text_page_gens[page]); - - int actual = text_page_gens[page]; - /* Fail if any bit in (LOGANDC1 ACTUAL EXPECTED) is true: - * actual=0, expected=0 -> // ok - * actual=1, expected=1 -> // ok - * actual=1, expected=0 -> // ok - * actual=0, expected=1 -> // NOT ok - */ - if (~actual & mask) - lose("genmask wrong: actual=%x expect=%x", actual, mask); - } -} -#endif From c12cd5c47c5de5d23bba30aa47775ba992f3e913 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 19:29:38 -0400 Subject: [PATCH 3767/4023] Add R/O space to the binary crashdump file --- src/runtime/monitor.c | 96 +++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index d6416040cf..a025aa51e3 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -59,6 +59,8 @@ struct crash_preamble { uword_t signature; uword_t static_start; uword_t static_nbytes; + uword_t readonly_start; + uword_t readonly_nbytes; uword_t dynspace_start; long dynspace_npages; int card_size; @@ -66,7 +68,8 @@ struct crash_preamble { // fixedobj data dumped: pages, page table uword_t fixedobj_start, fixedobj_size, fixedobj_free_pointer; // text data dumped: pages, touched_bits, page table - uword_t text_start, text_size, text_space_highwatermark; + uword_t text_start, text_size; + lispobj *text_space_highwatermark; int nthreads; int tls_size; lispobj lisp_package_vector; @@ -87,10 +90,11 @@ const int CRASH_PREAMBLE_SIGNATURE = #if defined LISP_FEATURE_X86 || defined LISP_FEATURE_X86_64 // un-tested elsewhere #include <errno.h> -static void checked_write(int fd, void* buf, long nbytes) +static void checked_write(char *legend, int fd, void* buf, long nbytes) { ssize_t wrote = write(fd, buf, nbytes); if (wrote != nbytes) lose("short write, errno=%d", errno); + fprintf(stderr, "%s: %lx bytes\n", legend, nbytes); } #include "immobile-space.h" @@ -113,6 +117,8 @@ void save_gc_crashdump(char *pathname, preamble.signature = CRASH_PREAMBLE_SIGNATURE; preamble.static_start = STATIC_SPACE_START; preamble.static_nbytes = (uword_t)static_space_free_pointer - STATIC_SPACE_START; + preamble.readonly_start = READ_ONLY_SPACE_START; + preamble.readonly_nbytes = (uword_t)read_only_space_free_pointer - READ_ONLY_SPACE_START; preamble.dynspace_start = DYNAMIC_SPACE_START; preamble.dynspace_npages = next_free_page; preamble.card_size = GENCGC_CARD_BYTES; @@ -129,28 +135,28 @@ void save_gc_crashdump(char *pathname, preamble.fixedobj_free_pointer = (uword_t)fixedobj_free_pointer; preamble.text_start = TEXT_SPACE_START; preamble.text_size = TEXT_SPACE_SIZE; - preamble.text_space_highwatermark = (uword_t)text_space_highwatermark; + preamble.text_space_highwatermark = text_space_highwatermark; #endif - // write the preamble and static space - checked_write(fd, &preamble, sizeof preamble); - checked_write(fd, (char*)STATIC_SPACE_START, preamble.static_nbytes); - // write the dynamic-space, PTEs, card table + // write the preamble and static + readonly spaces + checked_write("preamble", fd, &preamble, sizeof preamble); + checked_write("static", fd, (char*)STATIC_SPACE_START, preamble.static_nbytes); + checked_write("R/O", fd, (char*)READ_ONLY_SPACE_START, preamble.readonly_nbytes); - fprintf(stderr, "Writing dynamic space\n"); - checked_write(fd, (char*)DYNAMIC_SPACE_START, nbytes_heap); - checked_write(fd, page_table, sizeof (struct page) * next_free_page); - checked_write(fd, gc_card_mark, 1+gc_card_table_mask); + // write the dynamic-space, PTEs, card table + checked_write("dynamic", fd, (char*)DYNAMIC_SPACE_START, nbytes_heap); + checked_write("PTE", fd, page_table, sizeof (struct page) * next_free_page); + checked_write("cardmark", fd, gc_card_mark, 1+gc_card_table_mask); #ifdef LISP_FEATURE_IMMOBILE_SPACE int usage = (uword_t)fixedobj_free_pointer - FIXEDOBJ_SPACE_START; - checked_write(fd, (char*)FIXEDOBJ_SPACE_START, usage); + checked_write("fixedobj", fd, (char*)FIXEDOBJ_SPACE_START, usage); int total_npages = FIXEDOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; - checked_write(fd, fixedobj_pages, total_npages * sizeof sizeof(struct fixedobj_page)); + checked_write("fixedobj_PTE", fd, fixedobj_pages, total_npages * sizeof sizeof(struct fixedobj_page)); usage = (uword_t)text_space_highwatermark - TEXT_SPACE_START; - checked_write(fd, (char*)TEXT_SPACE_START, usage); + checked_write("text", fd, (char*)TEXT_SPACE_START, usage); total_npages = TEXT_SPACE_SIZE / IMMOBILE_CARD_BYTES; int n_bitmap_elts = ALIGN_UP(total_npages, 32) / 32; - checked_write(fd, text_page_touched_bits, n_bitmap_elts * sizeof (int)); - checked_write(fd, text_pages, total_npages * sizeof (int)); + checked_write("text_WP", fd, text_page_touched_bits, n_bitmap_elts * sizeof (int)); + checked_write("text_PTE", fd, text_pages, total_npages * sizeof (int)); #endif struct crash_thread_preamble thread_preamble; for_each_thread(th) { @@ -197,18 +203,18 @@ void save_gc_crashdump(char *pathname, thread_preamble.control_stack_nbytes = nbytes_control_stack; thread_preamble.binding_stack_nbytes = nbytes_binding_stack; // write the preamble - checked_write(fd, &thread_preamble, sizeof thread_preamble); + checked_write("thread", fd, &thread_preamble, sizeof thread_preamble); // write 0 or 1 contexts, control-stack, binding-stack, TLS if (ici) write(fd, threadcontext, preamble.sizeof_context); #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK - checked_write(fd, (char*)sp, nbytes_control_stack); + checked_write(" stack", fd, (char*)sp, nbytes_control_stack); #else - checked_write(fd, th->control_stack_start, nbytes_control_stack); + checked_write(" stack", fd, th->control_stack_start, nbytes_control_stack); #endif - checked_write(fd, th->binding_stack_start, nbytes_binding_stack); - checked_write(fd, th, nbytes_tls); + checked_write(" bindings", fd, th->binding_stack_start, nbytes_binding_stack); + checked_write(" TLS", fd, th, nbytes_tls); } - checked_write(fd, "SB.Crash", 8); // trailing signature + checked_write("sig", fd, "SB.Crash", 8); // trailing signature close(fd); } #endif @@ -794,10 +800,11 @@ boolean save_to_filehandle(__attribute__((unused)) FILE *file, lose("Can't save_to_filehandle"); } -static size_t checked_read(int fd, void* buf, size_t n) +static size_t checked_read(char *legend, int fd, void* buf, size_t n) { size_t result = read(fd, buf, n); if (result != n) { lose("read failed, errno=%d", errno); } + if (legend) fprintf(stderr, "%s: %lx bytes\n", legend, n); return result; } @@ -831,7 +838,7 @@ int load_gc_crashdump(char* pathname) } struct crash_preamble preamble; struct crash_thread_preamble thread_preamble; - checked_read(fd, &preamble, sizeof preamble); + checked_read("preamble", fd, &preamble, sizeof preamble); printf("static=%"OBJ_FMTX" nbytes=%x\n", preamble.static_start, (int)preamble.static_nbytes); printf("heap_start=%"OBJ_FMTX" npages=%d\n", preamble.dynspace_start, (int)preamble.dynspace_npages); // pin_dynspace_code is for display only. It gets recomputed as the @@ -849,8 +856,17 @@ int load_gc_crashdump(char* pathname) gc_card_table_nbits = preamble.card_table_nbits; gc_allocate_ptes(); next_free_page = preamble.dynspace_npages; - checked_read(fd, (char*)STATIC_SPACE_START, preamble.static_nbytes); + // static + readonly + checked_read("static", fd, (char*)STATIC_SPACE_START, preamble.static_nbytes); static_space_free_pointer = (lispobj*)(STATIC_SPACE_START + preamble.static_nbytes); + if (preamble.readonly_nbytes) { + // READ_ONLY_SPACE_START = preamble.readonly_start; + os_validate(0, (char*)preamble.readonly_start, + ALIGN_UP(preamble.readonly_nbytes, 4096), 0, 0); + checked_read("R/O", fd, (char*)preamble.readonly_start, preamble.readonly_nbytes); + } + read_only_space_free_pointer = (lispobj*)(READ_ONLY_SPACE_START + preamble.readonly_nbytes); + // DYNAMIC_SPACE_START = preamble.dynspace_start; long dynspace_nbytes = preamble.dynspace_npages * GENCGC_PAGE_BYTES; char* dynspace = os_validate(0, (char*)preamble.dynspace_start, @@ -858,12 +874,12 @@ int load_gc_crashdump(char* pathname) if (dynspace != (char*)preamble.dynspace_start) lose("Didn't map dynamic space where expected: %p vs %p", dynspace, (char*)preamble.dynspace_start); - checked_read(fd, (char*)DYNAMIC_SPACE_START, dynspace_nbytes); + checked_read("dynamic", fd, (char*)DYNAMIC_SPACE_START, dynspace_nbytes); fprintf(stderr, "snapshot: %"PRIdPTR" pages in use (%ld bytes)\n", next_free_page, dynspace_nbytes); - checked_read(fd, page_table, sizeof (struct page) * next_free_page); + checked_read("PTE", fd, page_table, sizeof (struct page) * next_free_page); recompute_gen_bytes_allocated(); - checked_read(fd, gc_card_mark, 1+gc_card_table_mask); + checked_read("cardmark", fd, gc_card_mark, 1+gc_card_table_mask); print_generation_stats(); #ifdef LISP_FEATURE_IMMOBILE_SPACE extern void gc_init_immobile(), @@ -881,17 +897,17 @@ int load_gc_crashdump(char* pathname) calc_immobile_space_bounds(); // Read fixedobj space int usage = (uword_t)fixedobj_free_pointer - FIXEDOBJ_SPACE_START; - checked_read(fd, (char*)FIXEDOBJ_SPACE_START, usage); + checked_read("fixedobj", fd, (char*)FIXEDOBJ_SPACE_START, usage); // Always read the whole page table regardless of the current space usage int total_npages = FIXEDOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; - checked_read(fd, fixedobj_pages, total_npages * sizeof sizeof(struct fixedobj_page)); + checked_read("fixedobj_PTE", fd, fixedobj_pages, total_npages * sizeof sizeof(struct fixedobj_page)); // Read text space usage = (uword_t)text_space_highwatermark - TEXT_SPACE_START; - checked_read(fd, (char*)TEXT_SPACE_START, usage); + checked_read("text", fd, (char*)TEXT_SPACE_START, usage); total_npages = TEXT_SPACE_SIZE / IMMOBILE_CARD_BYTES; int n_bitmap_elts = ALIGN_UP(total_npages, 32) / 32; - checked_read(fd, text_page_touched_bits, n_bitmap_elts * sizeof (int)); - checked_read(fd, text_pages, total_npages * sizeof (int)); + checked_read("text_WP", fd, text_page_touched_bits, n_bitmap_elts * sizeof (int)); + checked_read("text_PTE", fd, text_pages, total_npages * sizeof (int)); write_protect_immobile_space(); #endif fprintf(stderr, "%d threads:\n", (int)preamble.nthreads); @@ -903,12 +919,12 @@ int load_gc_crashdump(char* pathname) th->next = threads; if (threads) threads->prev = th; threads = th; - checked_read(fd, &thread_preamble, sizeof thread_preamble); + checked_read("thread", fd, &thread_preamble, sizeof thread_preamble); uword_t* stackptr = (uword_t*)((char*)th->control_stack_end - thread_preamble.control_stack_nbytes); context = contexts[i] = malloc(preamble.sizeof_context); nth_interrupt_context(0, th) = context; if (thread_preamble.has_context) { - checked_read(fd, context, preamble.sizeof_context); + checked_read(" ctxt", fd, context, preamble.sizeof_context); } #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK *os_context_sp_addr(context) = (uword_t)stackptr; @@ -919,14 +935,14 @@ int load_gc_crashdump(char* pathname) #else *os_context_register_addr(context, reg_CSP) = (uword_t)stackptr; #endif - checked_read(fd, stackptr, thread_preamble.control_stack_nbytes); - checked_read(fd, th->binding_stack_start, thread_preamble.binding_stack_nbytes); + checked_read(" stack", fd, stackptr, thread_preamble.control_stack_nbytes); + checked_read(" bindings", fd, th->binding_stack_start, thread_preamble.binding_stack_nbytes); // Skip over the initial words of the thread structure that was saved // in the file, so that binding_stack_start remains as is in the // newly allocated structure. The last word is the only one we want to keep. int skip = sizeof dummy-N_WORD_BYTES; - checked_read(fd, &dummy, skip); - checked_read(fd, &th->lisp_thread, preamble.tls_size-skip); + checked_read(0, fd, &dummy, skip); + checked_read(" TLS", fd, &th->lisp_thread, preamble.tls_size-skip); write_TLS(FREE_INTERRUPT_CONTEXT_INDEX, make_fixnum(1), th); struct thread_instance* instance = (void*)(th->lisp_thread - INSTANCE_POINTER_LOWTAG); lispobj name = instance->name; @@ -970,7 +986,7 @@ int load_gc_crashdump(char* pathname) putc('\n', stderr); } char signature[8]; - checked_read(fd, signature, 8); + checked_read("sig", fd, signature, 8); gc_assert(!strncmp(signature, "SB.Crash", 8)); gc_assert(read(fd, signature, 1) == 0); close(fd); From 5cd3e88fb658ced759fd83fe2f7692ee650e94ef Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 30 Jul 2022 22:30:43 -0400 Subject: [PATCH 3768/4023] Use TLSF allocator for immobile text space And with a few related improvements: * a finalizer gives memory back to the allocator * code never acts as filler * easier way of tracking text page scan start offset --- src/code/alloc.lisp | 442 ++++++---------------- src/code/cold-init.lisp | 3 +- src/code/final.lisp | 43 ++- src/code/ntrace.lisp | 6 +- src/code/print.lisp | 5 +- src/code/room.lisp | 36 +- src/code/simple-fun.lisp | 17 +- src/compiler/generic/genesis.lisp | 42 ++- src/compiler/generic/parms.lisp | 5 +- src/runtime/coreparse.c | 7 - src/runtime/fullcgc.c | 32 +- src/runtime/gc-private.h | 10 +- src/runtime/gc.h | 1 + src/runtime/gencgc.c | 19 +- src/runtime/globals.c | 1 + src/runtime/globals.h | 1 + src/runtime/immobile-space.c | 584 ++++++++++++++---------------- src/runtime/immobile-space.h | 24 +- src/runtime/monitor.c | 50 ++- src/runtime/verify.inc | 12 +- tests/run-tests.lisp | 3 +- tlsf-bsd/tlsf/tlsf.c | 125 +++++-- 22 files changed, 654 insertions(+), 814 deletions(-) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index d2b50392d2..38fb1653c2 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -83,315 +83,10 @@ (define-alien-variable ("fixedobj_free_pointer" *fixedobj-space-free-pointer*) system-area-pointer) -(eval-when (:compile-toplevel) +(eval-when (:compile-toplevel) ; FIXME: these assertions look irrelevant now (assert (eql code-boxed-size-slot 1)) (assert (eql code-debug-info-slot 2))) -(define-alien-variable "text_holes" long) -(define-alien-variable "text_page_touched_bits" (* (unsigned 32))) -(define-alien-variable "text_pages" (* (unsigned 32))) -(define-alien-routine "find_preceding_object" long (where long)) - -;;; Lazily created freelist, used only when unallocate is called: -;;; A cons whose car is a sorted list of hole sizes available -;;; and whose cdr is a hashtable. -;;; The keys in the hashtable are hole sizes, values are lists of holes. -;;; A better structure would be just a sorted array of sizes -;;; with each entry pointing to the holes which are threaded through -;;; some bytes in the storage itself rather than through cons cells. -(define-load-time-global *immobile-freelist* nil) - -;;; Return the zero-based index within the text subspace of immobile space. -(defun text-page-index (address) - (declare (type (and fixnum unsigned-byte) address)) - (values (floor (- address text-space-start) immobile-card-bytes))) - -(defun text-page-address (index) - (+ text-space-start (* index immobile-card-bytes))) - -(declaim (inline (setf text-page-scan-start-offset))) -(defun (setf text-page-scan-start-offset) (newval index) - ;; NEWVAL is passed in as a byte count but we want to store it as doublewords - ;; so it needs right-shifting by 1+ word-shift. However because it is a field - ;; of a packed word, it needs left-shifting by 8. We can shift by the net amount - ;; provided that no zero bits would be right-shifted out. - (aver (zerop (logand newval lowtag-mask))) - (setf (deref text-pages index) - (logior (ash newval (- 8 (1+ word-shift))) - (logand (deref text-pages index) #xFF))) - newval) - -;;; Convert a zero-based text page index into a scan start address. -(defun text-page-scan-start (index) - (- (+ text-space-start (* (1+ index) immobile-card-bytes)) - (* 2 n-word-bytes (ash (deref text-pages index) -8)))) - -(declaim (inline hole-p)) -(defun hole-p (raw-address) - ;; A code header with 0 boxed words is a hole. - ;; See also CODE-OBJ-IS-FILLER-P - (eql (sap-ref-64 (int-sap raw-address) 0) code-header-widetag)) - -(defun freed-hole-p (address) - (and (hole-p address) - ;; A hole is not considered to have been freed until it is - ;; no longer in the chain of objects linked through - ;; the debug_info slot. - (eql (sap-ref-word (int-sap address) - (ash code-debug-info-slot word-shift)) - nil-value))) - -(declaim (inline hole-size)) -(defun hole-size (hole-address) ; in bytes - (ash (sap-ref-32 (int-sap hole-address) 4) word-shift)) - -(declaim (inline (setf hole-size))) -(defun (setf hole-size) (new-size hole) ; NEW-SIZE is in bytes - (setf (sap-ref-32 (int-sap hole) 4) (ash new-size (- word-shift))) - new-size) - -(declaim (inline hole-end-address)) -(defun hole-end-address (hole-address) - (+ hole-address (hole-size hole-address))) - -(defun sorted-list-insert (item list key-fn) - (declare (function key-fn)) - (let ((key (funcall key-fn item)) (tail list) prev) - (loop - (when (null tail) - (let ((new-tail (list item))) - (return (cond ((not prev) new-tail) - (t (setf (cdr prev) new-tail) list))))) - (let ((head (car tail))) - (when (< key (funcall key-fn head)) - (rplaca tail item) - (rplacd tail (cons head (cdr tail))) - (return list))) - (setq prev tail tail (cdr tail))))) - -;;; These routines are not terribly efficient, but very straightforward -;;; since we can assume the existence of hashtables. -(defun add-to-freelist (hole) - (let* ((size (hole-size hole)) - (freelist *immobile-freelist*) - (table (cdr freelist)) - (old (gethash (hole-size hole) table))) - ;; Check for double-free error - #+immobile-space-debug (aver (not (member hole (gethash size table)))) - (unless old - (setf (car freelist) - (sorted-list-insert size (car freelist) #'identity))) - (setf (gethash size table) (cons hole old)))) - -(defun remove-from-freelist (hole) - (let* ((key (hole-size hole)) - (freelist *immobile-freelist*) - (table (cdr freelist)) - (list (gethash key table)) - (old-length (length list)) - (new (delete hole list :count 1))) - (declare (ignorable old-length)) - #+immobile-space-debug (aver (= (length new) (1- old-length))) - (cond (new - (setf (gethash key table) new)) - (t - (setf (car freelist) (delete key (car freelist) :count 1)) - (remhash key table))))) - -(defun find-in-freelist (size test) - (let* ((freelist *immobile-freelist*) - (hole-size - (if (eq test '<=) - (let ((sizes (member size (car freelist) :test '<=))) - (unless sizes - (return-from find-in-freelist nil)) - (car sizes)) - size)) - (found (car (gethash hole-size (cdr freelist))))) - (when found - (remove-from-freelist found)) - found)) - -(defun set-text-space-free-pointer (free-ptr) - (declare (type (and fixnum unsigned-byte) free-ptr)) - (setq *text-space-free-pointer* (int-sap free-ptr)) - ;; When the free pointer is not page-aligned - it usually won't be - - ;; then we create an unboxed array from the pointer to the page end - ;; so that it appears as one contiguous object when scavenging. - ;; instead of a bunch of cons cells. - (when (logtest free-ptr (1- immobile-card-bytes)) - (let ((n-trailing-bytes - (- (nth-value 1 (ceiling free-ptr immobile-card-bytes))))) - (setf (sap-ref-word (int-sap free-ptr) 0) simple-array-fixnum-widetag - (%array-fill-pointer - (%make-lisp-obj (logior free-ptr other-pointer-lowtag))) - ;; Convert bytes to words, subtract the header and vector length. - (- (ash n-trailing-bytes (- word-shift)) 2))))) - -(defun unallocate (hole) - #+immobile-space-debug - (awhen *in-use-bits* (mark-range it hole (hole-size hole) nil)) - (let* ((hole-end (hole-end-address hole)) - (end-is-free-ptr (eql hole-end (sap-int *text-space-free-pointer*)))) - ;; First, ensure that no page's scan-start points to this hole. - ;; For smaller-than-page objects, this will do nothing if the hole - ;; was not the scan-start. For larger-than-page, we have to update - ;; a range of pages. Example: - ;; | page1 | page2 | page3 | page4 | - ;; |-- hole A ------ | -- hole B -- - ;; If page1 had an object preceding the hole, then it is not empty, - ;; but if it pointed to the hole, and the hole extended to the end - ;; of the first page, then that page is empty. - ;; Pages (1+ first-page) through (1- last-page) inclusive - ;; must become empty. last-page may or may not be depending - ;; on whether another object can be found on it. - (let ((first-page (text-page-index hole)) - (last-page (text-page-index (1- hole-end)))) - (when (and (eql (text-page-scan-start first-page) hole) - (< first-page last-page)) - (setf (text-page-scan-start-offset first-page) 0)) - (loop for page from (1+ first-page) below last-page - do (setf (text-page-scan-start-offset page) 0)) - ;; Only touch the offset for the last page if it pointed to this hole. - ;; If the following object is a hole that is in the pending free list, - ;; it's ok, but if it's a hole that is already in the freelist, - ;; it's not OK, so look beyond that object. We don't have to iterate, - ;; since there can't be two consecutive holes - so it's either the - ;; object after this hole, or the one after that. - (when (eql (text-page-scan-start last-page) hole) - (let* ((page-end (text-page-address (1+ last-page))) - (new-scan-start (cond (end-is-free-ptr page-end) - ((freed-hole-p hole-end) - (hole-end-address hole-end)) - (t hole-end)))) - (setf (text-page-scan-start-offset last-page) - (if (< new-scan-start page-end) - ;; Compute new offset backwards relative to the page end. - (- page-end new-scan-start) - 0))))) ; Page becomes empty - - (unless *immobile-freelist* - (setf *immobile-freelist* (cons nil (make-hash-table :test #'eq)))) - - ;; find-preceding is the most expensive operation in this sequence - ;; of steps. Not sure how to improve it, but I doubt it's a problem. - (let* ((predecessor (find-preceding-object hole)) - (pred-is-free (and (not (eql predecessor 0)) - (freed-hole-p predecessor)))) - (when pred-is-free - (remove-from-freelist predecessor) - (setf hole predecessor)) - (when end-is-free-ptr - ;; Give back space below the free pointer for better space conservation. - ;; Consider when the hole touching the free pointer is equal in size - ;; to another hole that could have been used instead. Taking space at - ;; the free pointer diminishes the opportunity to use the frontier - ;; to later allocate a larger object that would not have fit - ;; into any existing hole. - (set-text-space-free-pointer hole) - (return-from unallocate)) - (let* ((successor hole-end) - (succ-is-free (freed-hole-p successor))) - (when succ-is-free - (setf hole-end (hole-end-address successor)) - (remove-from-freelist successor))) - ;; The hole must be an integral number of doublewords. - (aver (not (logtest (- hole-end hole) lowtag-mask))) - (setf (hole-size hole) (- hole-end hole)))) - (add-to-freelist hole)) - -(defun alloc-immobile-code (n-bytes word0 word1 lowtag errorp) - (declare (type (and fixnum unsigned-byte) n-bytes)) - (setq n-bytes (align-up n-bytes (* 2 n-word-bytes))) - ;; Can't allocate fewer than 4 words due to min hole size. - (aver (>= n-bytes (* 4 n-word-bytes))) - (with-system-mutex (*allocator-mutex* :without-gcing t) - (unless (zerop text-holes) - ;; If deferred sweep needs to happen, do so now. - ;; Concurrency could potentially be improved here: at most one thread - ;; should do this step, but it doesn't need to be exclusive with GC - ;; as long as we can atomically pop items off the list of holes. - (let ((hole-addr text-holes)) - (setf text-holes 0) - (loop - (let ((next (sap-ref-word (int-sap hole-addr) - (ash code-debug-info-slot word-shift)))) - (setf (sap-ref-word (int-sap hole-addr) - (ash code-debug-info-slot word-shift)) - nil-value) - (unallocate hole-addr) - (if (eql (setq hole-addr next) 0) (return)))))) - (let* ((residual) - (shrunk-size) - (addr - (or (and *immobile-freelist* - (or (find-in-freelist n-bytes '=) ; 1. Exact match? - ;; 2. Try splitting a hole, adding some slack so that - ;; both pieces can potentially be used. - (let ((found (find-in-freelist (+ n-bytes 192) '<=))) - (when found - (let* ((actual-size (hole-size found)) - (remaining (- actual-size n-bytes))) - (aver (not (logtest actual-size lowtag-mask))) - (setq residual found ; Shorten the lower piece - shrunk-size remaining) - (+ found remaining)))))) ; Consume the upper piece - ;; 3. Extend the frontier. - (let* ((addr (sap-int *text-space-free-pointer*)) - (free-ptr (+ addr n-bytes)) - (limit (+ text-space-start text-space-size))) - (when (> free-ptr limit) - (cond (errorp - (format t "~&Immobile space exhausted~%") - (sb-debug:print-backtrace) - (sb-impl::%halt)) - (t - (return-from alloc-immobile-code nil)))) - (set-text-space-free-pointer free-ptr) - addr)))) - (aver (not (logtest addr lowtag-mask))) ; Assert proper alignment - ;; Compute the start and end of the first page consumed. - (let* ((page-start (logandc2 addr (1- immobile-card-bytes))) - (page-end (+ page-start immobile-card-bytes)) - (index (text-page-index addr)) - (obj-end (+ addr n-bytes))) - ;; Mark the page as being used by a nursery object. - (setf (deref text-pages index) (logior (deref text-pages index) 1)) - ;; On the object's first page, set the scan start only if addr - ;; is lower than the current page-scan-start object. - ;; Note that offsets are expressed in doublewords backwards from - ;; page end, so that we can direct the scan start to any doubleword - ;; on the page or in the preceding 256MiB (approximately). - (when (< addr (text-page-scan-start index)) - (setf (text-page-scan-start-offset index) (- page-end addr))) - ;; On subsequent pages, always set the scan start, since there can not - ;; be a lower-addressed object touching those pages. - (loop - (setq page-start page-end) - (incf page-end immobile-card-bytes) - (incf index) - (when (>= page-start obj-end) (return)) - (setf (text-page-scan-start-offset index) (- page-end addr)))) - #+immobile-space-debug ; "address sanitizer" - (awhen *in-use-bits* (mark-range it addr n-bytes t)) - (setf (sap-ref-word (int-sap addr) 0) word0 - (sap-ref-word (int-sap addr) n-word-bytes) word1) - ;; 0-fill the remainder of the object - (alien-funcall (extern-alien "memset" (function void system-area-pointer int unsigned)) - (sap+ (int-sap addr) (* 2 n-word-bytes)) 0 (- n-bytes (* 2 n-word-bytes))) - ;; Only after making the new object can we reduce the size of the hole - ;; that contained the new allocation (if it entailed chopping a hole - ;; into parts). In this way, heap scans do not read junk. - (when residual - (setf (hole-size residual) shrunk-size) - (add-to-freelist residual)) - ;; The object is live despite not having a tagged pointer yet nor - ;; this code being pseudoatomic, because the mutex acquire has - ;; :WITHOUT-GCING. Ideally we'd have some notion of hazard pointers - ;; that could prevent GC from evicting objects from pointed-to pages - ;; so that we needn't inhibit GC. - (%make-lisp-obj (logior addr lowtag))))) - ;;; Size-class segregation (implying which page we try to allocate to) ;;; is done from lisp now, not C. There are 4 objects types we'll see, ;;; each in its own size class (even if some are coincidentally the same size). @@ -450,7 +145,18 @@ (defun immobile-space-obj-p (obj) (immobile-space-addr-p (get-lisp-obj-address obj))) -(define-load-time-global *codeblob-tree* nil) +(define-load-time-global *immobile-codeblob-tree* nil) +(define-load-time-global *dynspace-codeblob-tree* nil) +(define-alien-variable codeblob-freelist unsigned) + +;;; For the immobile code allocator: +;;; * Insertion performs low-level allocate, then tree-insert +;;; * Deletion performs tree-delete, then low-level deallocate +;;; Invariants: +;;; - a linear space walk visits at least all the objects in the tree, possibly more +;;; - tree does not contain any key that is not the base address of an object +;;; - if a tree node points to an object, then that object is either code +;;; or a filler that has not been returned to the low-level allocator ;;; Enforce limit on boxed words based on maximum total number of words ;;; that can be indicated in the header for 32-bit words. @@ -471,40 +177,55 @@ (declare (ignorable space)) (let* ((total-words (the (unsigned-byte 22) ; Enforce limit on total words as well - (align-up (+ boxed (ceiling unboxed n-word-bytes)) 2))) - (code - #+gencgc - (or #+immobile-code - (when (member space '(:immobile :auto)) - ;; We don't need to inhibit GC here - ALLOC-IMMOBILE-CODE does it. - ;; Indicate that there are initially 2 boxed words, otherwise - ;; immobile space GC thinks this object is freeable. - (alloc-immobile-code (ash total-words word-shift) - (logior (ash total-words code-header-size-shift) - code-header-widetag) - (* boxed n-word-bytes) - other-pointer-lowtag - (eq space :immobile))) - ;; x86-64 has a vop which wraps pseudo-atomic around the foreign call, - ;; as is the custom for allocation trampolines. - #+x86-64 (%primitive alloc-code total-words boxed) - #-x86-64 - (without-gcing - (%make-lisp-obj - (alien-funcall (extern-alien "alloc_code_object" - (function unsigned (unsigned 32) (unsigned 32))) - total-words boxed)))))) - (with-pinned-objects (code) - (let ((sap (sap+ (int-sap (get-lisp-obj-address code)) - (- other-pointer-lowtag)))) - ;; Record it in the balanced tree. - (let ((tree *codeblob-tree*) (addr (sap-int sap))) + (align-up (+ boxed (ceiling unboxed n-word-bytes)) 2)))) + #+immobile-code + (when (member space '(:immobile :auto)) + (let (addr code holder) + ;; CODE needs to have a heap or TLS reference to it prior to adding it to the tree + ;; since implicit pinning uses the tree to find pinned ojects. + (declare (special holder)) + (with-alien ((tlsf-alloc-codeblob (function unsigned system-area-pointer unsigned) + :extern) + (tlsf-control system-area-pointer :extern)) + (with-system-mutex (*allocator-mutex* :without-gcing t) + (unless (zerop (setq addr (alien-funcall tlsf-alloc-codeblob + tlsf-control total-words))) + (setf code (%make-lisp-obj (logior addr other-pointer-lowtag)) + holder code)))) + ;; GC is allowed to run now because HOLDER references CODE + (when code + (alien-funcall (extern-alien "memset" (function void system-area-pointer int unsigned)) + (sap+ (int-sap addr) n-word-bytes) 0 (ash (1- boxed) word-shift)) + ;; BOXED-SIZE is a raw slot holding a byte count, but SET-SLOT takes its VALUE + ;; arg as a descriptor-reg, so just cleverly make it right by shifting. + (%primitive set-slot code (ash boxed (- word-shift n-fixnum-tag-bits)) + '(setf %code-boxed-size) code-boxed-size-slot other-pointer-lowtag) + (aver (= (sap-ref-8 (int-sap addr) 0) code-header-widetag)) ; wasn't trashed + (let ((tree *immobile-codeblob-tree*)) + (loop (when (eq tree (setq tree (cas *immobile-codeblob-tree* tree + (sb-brothertree:insert addr tree)))) + (return-from allocate-code-object (values code total-words))))))) + (when (eq space :immobile) + (error "Immobile code space exhausted"))) + (let ((code + ;; x86-64 has a vop which wraps pseudo-atomic around the foreign call, + ;; as is the custom for allocation trampolines. + #+x86-64 (%primitive alloc-code total-words boxed) + #-x86-64 + (without-gcing + (%make-lisp-obj + (alien-funcall (extern-alien "alloc_code_object" + (function unsigned (unsigned 32) (unsigned 32))) + total-words boxed))))) + (with-pinned-objects (code) + (let ((addr (logandc2 (get-lisp-obj-address code) other-pointer-lowtag)) + (tree *dynspace-codeblob-tree*)) (loop (let ((newtree (sb-brothertree:insert addr tree))) ;; check that it hasn't been promoted from gen0 -> gen1 already ;; (very unlikely, but certainly possible). (unless (eq (generation-of code) 0) (return)) - (let ((oldval (cas *codeblob-tree* tree newtree))) - (if (eq oldval tree) (return) (setq tree oldval)))))))) + (let ((oldval (cas *dynspace-codeblob-tree* tree newtree))) + (if (eq oldval tree) (return) (setq tree oldval))))))) ;; FIXME: there may be random values in the unboxed payload and it's not obvious ;; that all callers of ALLOCATE-CODE-OBJECT always write all raw bytes. @@ -513,5 +234,48 @@ ;; of the object so that we can find the function table. ;; But what about other things that create code objects? ;; It could be a subtle source of nondeterministic core images. - - (values code total-words))) + (values code total-words)))) + +;; The freelist can only be read while holding a mutex because the codeblobs +;; themselves are used to construct the freelist. It would be dangerous to +;; suppose that you could read the "link" field out of a blob (that currently +;; has FILLER_WIDETAG allegedly) if another thread got scheduled such that it +;; freed that filler and the reallocated into it instantly. +(defun immobile-code-dealloc-1 (scratchpad) + (declare (cons scratchpad) (ignorable scratchpad)) + #+immobile-code + (flet ((pop-1 () + ;; Remove an item from codeblob-freelist. Mutex must be held + ;; and GC inhibited. + (let ((head codeblob-freelist)) + (unless (eql head 0) + (setf codeblob-freelist (sap-ref-word (int-sap head) n-word-bytes))) + (%make-lisp-obj head)))) ; use funny fixnum representation + (when (eql (car scratchpad) 0) + ;; I'd prefer that this be done using WITH-SYSTEM-MUTEX + pseudo-atomic + ;; rather than WITHOUT-GCING in as much as WITHOUT-GCING needs to cease to exist. + (let ((word (if (eql codeblob-freelist 0) + 0 + (with-system-mutex (*allocator-mutex* :without-gcing t) (pop-1))))) + (when (eql word 0) + (return-from immobile-code-dealloc-1 nil)) + (setf (car scratchpad) word))) + (let ((addr (get-lisp-obj-address (car scratchpad)))) + ;; We have to remove from the tree before removing from the TLSF pool, + ;; because presence of a key in the tree is an assertion that there is + ;; memory block at that address. Consider if we removed from the pool + ;; without removing from the tree, the block could be coalesced on either side + ;; and there would not necessarily be a block where the tree says it is. + (let ((tree sb-vm::*immobile-codeblob-tree*)) + (loop (when (eq tree (setq tree (cas *immobile-codeblob-tree* tree + (sb-brothertree:delete addr tree)))) + (return)))) + (with-alien ((tlsf-unalloc-codeblob (function void system-area-pointer unsigned) + :extern) + (tlsf-control system-area-pointer :extern)) + ;; Prevent GC from walking the text space at the exact same instant + ;; the block coalescing algorithm alters block headers. + (with-system-mutex (*allocator-mutex* :without-gcing t) + (alien-funcall tlsf-unalloc-codeblob tlsf-control addr) + (setf (car scratchpad) (pop-1))))) + t)) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index bf3d86d5e6..cd2a58a81f 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -136,7 +136,8 @@ (/show0 "entering !COLD-INIT") #+sb-show (setq */show* t) - (setq sb-vm::*codeblob-tree* nil) + (setq sb-vm::*immobile-codeblob-tree* nil + sb-vm::*dynspace-codeblob-tree* nil) (setq sb-kernel::*defstruct-hooks* '(sb-kernel::!bootstrap-defstruct-hook) sb-kernel::*struct-accesss-fragments-delayed* nil) (let ((stream (!make-cold-stderr-stream))) diff --git a/src/code/final.lisp b/src/code/final.lisp index ba27570636..efc65132dd 100644 --- a/src/code/final.lisp +++ b/src/code/final.lisp @@ -239,21 +239,29 @@ Examples: ;;; See the trace at the bottom of this file. (defvar *in-a-finalizer* nil) #+sb-thread (define-alien-variable finalizer-thread-runflag int) -(defun run-pending-finalizers () + +(defun run-pending-finalizers (&aux (hashtable (finalizer-id-map **finalizer-store**)) + (ran-a-system-finalizer) + (system-finalizer-scratchpad (list 0)) + (ran-a-user-finalizer)) + (declare (truly-dynamic-extent system-finalizer-scratchpad)) ;; This never acquires the finalizer store lock. Code accordingly. - (let ((hashtable (finalizer-id-map **finalizer-store**))) - (loop - ;; Perform no further work if trying to stop the thread, even if there is work. - #+sb-thread (when (zerop finalizer-thread-runflag) (return)) - (let ((cell (hash-table-culled-values hashtable))) - ;; This is like atomic-pop, but its obtains the first cons cell - ;; in the list, not the car of the first cons. - ;; Possible TODO: when no other work remains, free the *JOINABLE-THREADS*, - ;; though MAKE-THREAD and JOIN-THREAD do that also, so there's no memory leak. - (loop (unless cell (return-from run-pending-finalizers)) - (let ((actual (cas (hash-table-culled-values hashtable) - cell (cdr cell)))) - (if (eq actual cell) (return) (setq cell actual)))) + (loop + ;; Perform no further work if trying to stop the thread, even if there is work. + #+sb-thread (when (zerop finalizer-thread-runflag) (return)) + ;; Try to run 1 system finalizer + (setq ran-a-system-finalizer (sb-vm::immobile-code-dealloc-1 system-finalizer-scratchpad)) + ;; Try to run 1 user finalizer + (let ((cell (hash-table-culled-values hashtable))) + ;; This is like atomic-pop, but its obtains the first cons cell + ;; in the list, not the car of the first cons. + ;; Possible TODO: when no other work remains, free the *JOINABLE-THREADS*, + ;; though MAKE-THREAD and JOIN-THREAD do that also, so there's no memory leak. + (loop (unless cell (return)) + (let ((actual (cas (hash-table-culled-values hashtable) + cell (cdr cell)))) + (if (eq actual cell) (return) (setq cell actual)))) + (when cell (let* ((id (the index (car cell))) ;; No other thread can modify **FINALIZER-STORE** at index ID ;; because the table no longer contains an object mapping to @@ -280,6 +288,7 @@ Examples: (if (simple-vector-p finalizers) (map nil #'call finalizers) (call finalizers))) + (setq ran-a-user-finalizer t) ;; While the assignment to (SVREF STORE ID) should have been adequate, ;; we don't know that the vector is current - a new vector could have ;; gotten assigned into **FINALIZER-STORE** in between [1] and [2], @@ -297,7 +306,11 @@ Examples: ;; removing dangling references, but if it's just a function, ;; there's nothing to smash. (cond ((simple-vector-p finalizers) (fill finalizers 0)) - ((consp finalizers) (rplaca finalizers 0)))))))) + ((consp finalizers) (rplaca finalizers 0)))))) + ;; Did this iteration do anything at all? + (unless (or ran-a-system-finalizer ran-a-user-finalizer) (return)) + (setq ran-a-system-finalizer nil + ran-a-user-finalizer nil))) (define-load-time-global *finalizer-thread* nil) (declaim (type (or sb-thread:thread (eql :start) null) *finalizer-thread*)) diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index bf58f89283..d21ffa4637 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -754,10 +754,10 @@ functions when called with no arguments." (let ((sap (int-sap (get-lisp-obj-address code)))) ;; NB: This is not threadsafe on machines that don't promise that ;; stores to single bytes are atomic. - (setf (sap-ref-8 sap #+little-endian (- 1 sb-vm:other-pointer-lowtag) - #+big-endian (- 6 sb-vm:other-pointer-lowtag)) + (setf (sap-ref-8 sap #+little-endian (- 2 sb-vm:other-pointer-lowtag) + #+big-endian (- 5 sb-vm:other-pointer-lowtag)) bit) - ;; touch the card mark + ;; touch the card mark - WHY??? (setf (code-header-ref code 1) (code-header-ref code 1))))) ;;; FIXME: Symbol is lost by accident diff --git a/src/code/print.lisp b/src/code/print.lisp index 0644227bc4..3a4214837f 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -1880,10 +1880,7 @@ variable: an unreadable object representing the error is printed instead.") (defmethod print-object ((component code-component) stream) (print-unreadable-object (component stream :identity t) (let (dinfo) - (cond ((code-obj-is-filler-p component) - (format stream "filler ~dw" - (ash (code-object-size component) (- sb-vm:word-shift)))) - ((eq (setq dinfo (%code-debug-info component)) :bpt-lra) + (cond ((eq (setq dinfo (%code-debug-info component)) :bpt-lra) (write-string "bpt-trap-return" stream)) ((functionp dinfo) (format stream "trampoline ~S" dinfo)) diff --git a/src/code/room.lisp b/src/code/room.lisp index 036d6c9f82..ca92a7f625 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -323,18 +323,13 @@ We could try a few things to mitigate this: (map-objects-in-range fun start end))) #+immobile-space (:immobile - ;; Filter out filler objects. These either look like cons cells - ;; in fixedobj subspace, or code without enough header words - ;; in text subspace. (cf 'filler_obj_p' in gc-internal.h) + (with-system-mutex (*allocator-mutex*) + (map-immobile-objects fun :variable)) + ;; Filter out padding words (dx-flet ((filter (obj type size) (unless (= type list-pointer-lowtag) (funcall fun obj type size)))) - (map-immobile-objects #'filter :fixed)) - (dx-flet ((filter (obj type size) - (unless (and (code-component-p obj) - (code-obj-is-filler-p obj)) - (funcall fun obj type size)))) - (map-immobile-objects #'filter :variable)))))) + (map-immobile-objects #'filter :fixed)))))) (do-rest-arg ((space) spaces) (if (eq space :dynamic) (without-gcing #+cheneygc (do-1-space space) @@ -445,15 +440,20 @@ We could try a few things to mitigate this: (used-bytes (ash (- free-pointer start) n-fixnum-tag-bits)) (holes '()) (hole-bytes 0)) - (map-immobile-objects - (lambda (obj type size) - (let ((address (logandc2 (get-lisp-obj-address obj) lowtag-mask))) - (when (case subspace - (:fixed (= type list-pointer-lowtag)) - (:variable (hole-p address))) - (push (cons address size) holes) - (incf hole-bytes size)))) - subspace) + (if (eq subspace :fixed) + (map-immobile-objects + (lambda (obj type size) + (let ((address (logandc2 (get-lisp-obj-address obj) lowtag-mask))) + (when (= type list-pointer-lowtag) + (incf hole-bytes size)))) + subspace) + (let ((sum-sizes 0)) + (map-immobile-objects + (lambda (obj type size) + (declare (ignore obj type)) + (incf sum-sizes size)) + subspace) + (setq hole-bytes (- used-bytes sum-sizes)))) (values holes hole-bytes used-bytes))) (defun show-fragmentation (&key (subspaces '(:fixed :variable)) diff --git a/src/code/simple-fun.lisp b/src/code/simple-fun.lisp index d69d0fc3e4..2828f7e16c 100644 --- a/src/code/simple-fun.lisp +++ b/src/code/simple-fun.lisp @@ -391,12 +391,6 @@ (code-header-set code sb-vm::code-fixups-slot newval) newval) -(declaim (inline code-obj-is-filler-p)) -(defun code-obj-is-filler-p (code-obj) - ;; See also HOLE-P in the allocator (same thing but using SAPs) - ;; and filler_obj_p() in the C code - (eql (sb-vm::%code-boxed-size code-obj) 0)) - #+(or sparc ppc64) (defun code-trailer-ref (code offset) (with-pinned-objects (code) @@ -404,15 +398,12 @@ (+ (code-object-size code) offset (- sb-vm:other-pointer-lowtag))))) ;;; The last 'uint16' in the object holds the trailer length (see 'src/runtime/code.h') -;;; but do not attempt to read it if the object is a filler. (declaim (inline code-trailer-len)) (defun code-trailer-len (code-obj) - (if (code-obj-is-filler-p code-obj) - 0 - (let ((word (code-trailer-ref code-obj -4))) - ;; TRAILER-REF returns 4-byte quantities. Extract a two-byte quantity. - #+little-endian (ldb (byte 16 16) word) - #+big-endian (ldb (byte 16 0) word)))) + (let ((word (code-trailer-ref code-obj -4))) + ;; TRAILER-REF returns 4-byte quantities. Extract a two-byte quantity. + #+little-endian (ldb (byte 16 16) word) + #+big-endian (ldb (byte 16 0) word))) ;;; The fun-table-count is a uint16_t immediately preceding the trailer length ;;; containing two subfields: diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 6e90e0f0b7..0e59f03f5d 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -259,7 +259,7 @@ (print-unreadable-object (gspace stream :type t) (format stream "@#x~X ~S" (gspace-byte-address gspace) (gspace-name gspace)))) -(defun make-gspace (name identifier byte-address) +(defun make-gspace (name identifier byte-address &rest rest) ;; Genesis should be agnostic of space alignment except in so far as it must ;; be a multiple of the backend page size. We used to care more, in that ;; descriptor-bits were composed of a high half and low half for the @@ -272,7 +272,7 @@ (unless (zerop (rem byte-address target-space-alignment)) (error "The byte address #X~X is not aligned on a #X~X-byte boundary." byte-address target-space-alignment))) - (%make-gspace :name name + (apply #'%make-gspace :name name :identifier identifier ;; Track page usage :page-table (if (= identifier dynamic-core-space-id) @@ -282,7 +282,8 @@ ((= identifier immobile-fixedobj-core-space-id) (/ sb-vm:immobile-card-bytes sb-vm:n-word-bytes)) (t - 0)))) + 0)) + rest)) (defstruct (model-sap (:constructor make-model-sap (address gspace))) (address 0 :type sb-vm:word) @@ -1904,9 +1905,35 @@ core and return a descriptor to it." ;; Put the C-callable fdefns into the static-fdefn vector if #+immobile-code. #+immobile-code - (loop for i from 0 for sym in sb-vm::+c-callable-fdefns+ - do (cold-svset *c-callable-fdefn-vector* i - (ensure-cold-fdefn sym))) + (let* ((space *immobile-text*) + (wordindex (gspace-free-word-index space)) + (words-per-page (/ sb-vm:immobile-card-bytes sb-vm:n-word-bytes))) + (loop for i from 0 for sym in sb-vm::+c-callable-fdefns+ + do (cold-svset *c-callable-fdefn-vector* i + (ensure-cold-fdefn sym))) + (let* ((objects (gspace-objects space)) + (count (length objects))) + (let ((remainder (rem wordindex words-per-page))) + (unless (zerop remainder) + (let* ((fill-nwords (- words-per-page remainder)) + (des + ;; technically FILLER_WIDETAG has no valid lowtag because it's not an object + ;; that lisp can address. But WRITE-WORDINDEXED requires a pointer descriptor + (allocate-cold-descriptor space (* fill-nwords sb-vm:n-word-bytes) + sb-vm:other-pointer-lowtag))) + (aver (zerop (rem (gspace-free-word-index space) words-per-page))) + (write-header-word des (logior (ash fill-nwords 32) sb-vm:filler-widetag))))) + ;; Construct a ub32 array of object offsets. + (let* ((n-data-words (ceiling count 2)) ; lispword = 2 ub32s + (vect (allocate-vector sb-vm:simple-array-unsigned-byte-32-widetag + count n-data-words)) + (data-ptr (+ (descriptor-byte-offset vect) + (ash sb-vm:vector-data-offset sb-vm:word-shift)))) + (dotimes (i count) + (setf (bvref-32 (descriptor-mem vect) data-ptr) + (descriptor-byte-offset (aref objects i))) + (incf data-ptr 4)) + (cold-set 'sb-vm::*immobile-codeblob-vector* vect)))) ;; Symbols for which no call to COLD-INTERN would occur - due to not being ;; referenced until warm init - must be artificially cold-interned. @@ -3841,7 +3868,8 @@ III. initially undefined function references (alphabetically): #+immobile-space (*immobile-text* (make-gspace :immobile-text immobile-text-core-space-id - sb-vm:text-space-start)) + sb-vm:text-space-start + :objects (make-array 20000 :fill-pointer 0 :adjustable t))) (*dynamic* (make-gspace :dynamic dynamic-core-space-id #+gencgc sb-vm:dynamic-space-start diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 6a10ea239c..2f9ee12a75 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -215,8 +215,10 @@ ,@'(*current-catch-block* *current-unwind-protect-block*) - #+immobile-space *immobile-freelist* ; not per-thread (yet...) #+metaspace *metaspace-tracts* + *immobile-codeblob-tree* ; for generations 0 through 5 inclusive + *immobile-codeblob-vector* ; for pseudo-static-generation + *dynspace-codeblob-tree* ;; stack pointers #-sb-thread *binding-stack-start* ; a thread slot if #+sb-thread @@ -227,7 +229,6 @@ ;; threading support #+sb-thread ,@'(sb-thread::*starting-threads* *free-tls-index*) - *codeblob-tree* ;; runtime linking of lisp->C calls (regardless of whether ;; the C function is in a dynamic shared object or not) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 80869bbffb..f02f7ac1da 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -439,13 +439,6 @@ static void relocate_space(uword_t start, lispobj* end, struct heap_adjust* adj) adjust_word_at(where+3, adj); continue; case CODE_HEADER_WIDETAG: - if (filler_obj_p(where)) { - // OMGWTF! Why does a filler code object merit adjustment? - // (Probably for when holes were chained through debug-info? - // But we don't save holes any more, because of defrag) - if (where[2]) adjust_word_at(where+2, adj); - continue; - } // Fixup the constant pool. The word at where+1 is a fixnum. code = (struct code*)where; adjust_pointers(where+2, code_header_words(code)-2, adj); diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 6238600fbb..6e832f4be1 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -547,13 +547,21 @@ static void clobber_headered_object(lispobj* addr, sword_t nwords) // FIXME: clobbering an object on single-object pages should free entire pages page_index_t page = find_page_index(addr); if (page < 0) { // code space - struct code* code = (struct code*)addr; - if (!filler_obj_p((lispobj*)code)) { - code->boxed_size = 0; - code->header = (nwords << CODE_HEADER_SIZE_SHIFT) - | CODE_HEADER_WIDETAG; - memset(addr+2, 0, (nwords - 2) * N_WORD_BYTES); +#ifdef LISP_FEATURE_IMMOBILE_SPACE + extern lispobj codeblob_freelist; + if (widetag_of(addr) == CODE_HEADER_WIDETAG) { + // OAOO violation - like sweep_immobile_text() + assign_widetag(addr, FILLER_WIDETAG); + ((char*)addr)[2] = 0; // clear the TRACED flag + ((char*)addr)[3] = 0; // clear the WRITTEN flag and the generation + // add to list only if it is above tlsf_mem_start + // (below it will never by utilized by the TLSF allocator) + if (addr >= tlsf_mem_start) { + addr[1] = codeblob_freelist; // push into to-be-freed list + codeblob_freelist = (lispobj)addr; + } } +#endif } else if ((SINGLE_OBJECT_FLAG|page_table[page].type) == (SINGLE_OBJECT_FLAG|PAGE_TYPE_CODE)) { // Code pages don't want (0 . 0) fillers, otherwise heap checking // gets an error: "object @ 0x..... is non-code on code page" @@ -584,7 +592,8 @@ static uword_t sweep(lispobj* where, lispobj* end, fullcgcmarks[index / N_WORD_BITS] & ((uword_t)1 << (index % N_WORD_BITS)); if (is_header(word)) { nwords = headerobj_size2(where, word); - if (!livep) clobber_headered_object(where, nwords); + if (!livep && header_widetag(word) != FILLER_WIDETAG) + clobber_headered_object(where, nwords); } else { nwords = 2; if (!livep) where[0] = where[1] = (uword_t)-1; @@ -626,6 +635,15 @@ void execute_full_sweep_phase() if (sweeplog) fprintf(sweeplog, "-- text space --\n"); sweep((lispobj*)TEXT_SPACE_START, text_space_highwatermark, (uword_t)words_zeroed); + // Recompute generation masks for text space + int npages = (ALIGN_UP((uword_t)text_space_highwatermark, IMMOBILE_CARD_BYTES) + - TEXT_SPACE_START) / IMMOBILE_CARD_BYTES; + memset(text_page_genmask, 0, npages); + lispobj* where = (lispobj*)TEXT_SPACE_START; + for ( ; where < text_space_highwatermark ; where += object_size(where) ) + if (widetag_of(where) == CODE_HEADER_WIDETAG) + text_page_genmask[find_text_page_index(where)] + |= (1 << immobile_obj_gen_bits(where)); #endif if (sweeplog) fprintf(sweeplog, "-- dynamic space --\n"); walk_generation(sweep, -1, (uword_t)words_zeroed); diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index 1ffd661fe1..f0a8d4b6f5 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -152,10 +152,6 @@ static inline int header_rememberedp(lispobj header) { return (header & (OBJ_WRITTEN_FLAG << 24)) != 0; } -static inline boolean filler_obj_p(lispobj* obj) { - return widetag_of(obj) == CODE_HEADER_WIDETAG && obj[1] == 0; -} - #ifdef LISP_FEATURE_IMMOBILE_SPACE extern void enliven_immobile_obj(lispobj*,int); @@ -575,4 +571,10 @@ static inline boolean plausible_tag_p(lispobj addr) # define filler_total_nwords(header) ((header)>>N_WIDETAG_BITS) #endif +#ifdef LISP_FEATURE_BIG_ENDIAN +# define assign_widetag(addr, byte) ((unsigned char*)addr)[N_WORD_BYTES-1] = byte +#else +# define assign_widetag(addr, byte) *(unsigned char*)addr = byte +#endif + #endif /* _GC_PRIVATE_H_ */ diff --git a/src/runtime/gc.h b/src/runtime/gc.h index adbdd0f819..6b7896da35 100644 --- a/src/runtime/gc.h +++ b/src/runtime/gc.h @@ -83,4 +83,5 @@ int hexdump_and_verify_heap(lispobj*, int flags); page_index_t gc_find_freeish_pages(page_index_t *restart_page_ptr, sword_t nbytes, int page_type, generation_index_t gen); +extern void tlsf_dump_pool(void*, void*, char *pathname); #endif /* _GC_H_ */ diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 302268e754..783e55141d 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -402,10 +402,7 @@ int count_immobile_objects(__attribute__((unused)) int gen, int res[5]) where = (lispobj*)TEXT_SPACE_START; end = text_space_highwatermark; while (where < end) { - if (immobile_obj_generation(where) == gen - && widetag_of(where) == CODE_HEADER_WIDETAG - // don't count filler code - && ((struct code*)where)->boxed_size) + if (widetag_of(where) != FILLER_WIDETAG && immobile_obj_generation(where) == gen) ++res[4]; where += object_size(where); } @@ -1884,7 +1881,7 @@ lispobj *search_dynamic_space(void *pointer) // in generation 0 following a non-promotion cycle. if (type == PAGE_TYPE_CODE && page_table[page_index].gen == 0) { lispobj node = brothertree_find_lesseql((uword_t)pointer, - SYMBOL(CODEBLOB_TREE)->value); + SYMBOL(DYNSPACE_CODEBLOB_TREE)->value); if (node != NIL) { lispobj *codeblob = (lispobj*)((struct binary_node*)INSTANCE(node))->key; if (widetag_of(codeblob) != CODE_HEADER_WIDETAG) @@ -2812,9 +2809,8 @@ static lispobj* range_dirty_p(lispobj* where, lispobj* limit, generation_index_t if (leaf_obj_widetag_p(widetag)) { // Do nothing } else if (widetag == CODE_HEADER_WIDETAG) { - // This function will never be called on a page of code, hence if we - // see genuine (non-filler) code, that's a bug. */ - if (!filler_obj_p(where)) lose("code @ %p on non-code page", where); + // This function will never be called on a page of code + lose("code @ %p on non-code page", where); } else { #ifdef LISP_FEATURE_COMPACT_INSTANCE_HEADER if (instanceoid_widetag_p(widetag)) { @@ -4382,7 +4378,7 @@ garbage_collect_generation(generation_index_t generation, int raise, * so just erase the tree now. * This is WRONG for immobile code, but not worse than status quo * in terms of inability to find objects in the SIGPROF handler etc */ - SYMBOL(CODEBLOB_TREE)->value = NIL; + SYMBOL(DYNSPACE_CODEBLOB_TREE)->value = NIL; if (generation >= verify_gens) hexdump_and_verify_heap(cur_thread_approx_stackptr, VERIFY_POST_GC | (generation<<16)); @@ -5791,7 +5787,8 @@ static inline boolean obj_gen_lessp(lispobj obj, generation_index_t b) sword_t scav_code_blob(lispobj *object, lispobj header) { struct code* code = (struct code*)object; - if (filler_obj_p(object)) goto done; /* it's not code at all */ + int nboxed = code_header_words(code); + if (!nboxed) goto done; ++n_scav_calls[CODE_HEADER_WIDETAG/4]; @@ -5850,7 +5847,7 @@ sword_t scav_code_blob(lispobj *object, lispobj header) * the object, then scavenge all entry points. Otherwise there is no need, * as trans_code() made necessary adjustments to internal entry points. * This test is just an optimization to avoid some work */ - if (((*object >> 8) & 0xff) == CODE_IS_TRACED) { + if (((*object >> 16) & 0xff) == CODE_IS_TRACED) { #else { /* Not enough spare bits in the header to hold random flags. * Just do the extra work always */ diff --git a/src/runtime/globals.c b/src/runtime/globals.c index e994fa9a01..4e76028a7d 100644 --- a/src/runtime/globals.c +++ b/src/runtime/globals.c @@ -62,6 +62,7 @@ lispobj *text_space_highwatermark; lispobj *fixedobj_free_pointer; #endif os_vm_address_t anon_dynamic_space_start; +lispobj* tlsf_mem_start; // meaningful only if immobile space #ifndef LISP_FEATURE_GENCGC /* GENCGC has its own way to record trigger */ lispobj *current_auto_gc_trigger; diff --git a/src/runtime/globals.h b/src/runtime/globals.h index 4bb8ea9fe6..3ea01ec78b 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -103,6 +103,7 @@ extern lispobj *text_space_highwatermark; extern lispobj *fixedobj_free_pointer; #endif extern os_vm_address_t anon_dynamic_space_start; +extern lispobj* tlsf_mem_start; // meaningful only if immobile space # ifndef LISP_FEATURE_GENCGC extern lispobj *current_auto_gc_trigger; diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 2b1882f70f..f2e035e1f5 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -59,7 +59,9 @@ #include "unaligned.h" #include "code.h" #include "lispstring.h" - +#include "tlsf-bsd/tlsf/tlsf.h" +#include "search.h" +#include "brothertree.h" #include <stdlib.h> #include <stdio.h> @@ -126,9 +128,18 @@ static inline lispobj* compute_fixedobj_limit(void* base, int spacing_bytes) { /// Variable-length pages: +unsigned char* text_page_genmask; +// scan-start-offset, measured in bytes from page base address. +// one per page *excluding* all pseudostatic pages. +// Unlike with dynamic-space, the scan start for a text page +// is an address not lower than the base page. +unsigned short int* tlsf_page_sso; // Array of inverted write-protect flags, 1 bit per page. unsigned int* text_page_touched_bits; static int n_bitmap_elts; // length of array measured in 'int's +// List of FILLER_WIDETAG objects to be stuffed back into the TLSF-managed pool +// chained through the word after their header. +lispobj codeblob_freelist; boolean immobile_card_protected_p(void* addr) { @@ -140,28 +151,90 @@ boolean immobile_card_protected_p(void* addr) lose("immobile_card_protected_p(%p)", addr); } -struct text_page *text_pages; -// Holes to be stuffed back into the managed free list. -lispobj text_holes; +void* tlsf_control; #define text_page_touched(x) ((text_page_touched_bits[x/32] >> (x&31)) & 1) +// These bits are in the same place in the code header as the ones +// in 'tlsf.c' but shifted by 8 more so that they refer to the header +// word as a whole. +static const unsigned block_header_free_bit = 1 << 8; +static const unsigned block_header_prev_free_bit = 1 << 9; +static const unsigned block_header_oversized = 1 << 10; + +#define IMMOBILE_CARD_SHIFT 12 +void *tlsf_alloc_codeblob(tlsf_t tlsf, int requested_nwords) +{ + // The size we request is 1 word less, because the allocator's block header + // counts as part of the resulting object as far as Lisp is concerned. + int size = (requested_nwords - 1) << WORD_SHIFT; + void* tlsf_result = tlsf_malloc(tlsf, size); + if (!tlsf_result) return 0; + struct code* c = (void*)((lispobj*)tlsf_result - 1); + gc_assert(!((uintptr_t)c & LOWTAG_MASK)); + assign_widetag(c, CODE_HEADER_WIDETAG); + c->boxed_size = c->debug_info = c->fixups = 0; + int nwords = code_total_nwords(c); + // Indicate oversized allocation in a header bit so that we can eliminate + // 2 words of padding when saving a core (not done yet) + if (nwords > requested_nwords) c->header |= block_header_oversized; + ((lispobj*)c)[nwords-1] = 0; // trailer word with the simple-fun table + lispobj* end = (lispobj*)c + nwords; + if (end > text_space_highwatermark) text_space_highwatermark = end; + // Adjust the scan start if this became the lowest addressable in-use block on its page + low_page_index_t tlsf_page = ((char*)c - (char*)tlsf_mem_start) >> IMMOBILE_CARD_SHIFT; + int offset = (uword_t)c & (IMMOBILE_CARD_BYTES-1); + if (offset < tlsf_page_sso[tlsf_page]) tlsf_page_sso[tlsf_page] = offset; + text_page_genmask[find_text_page_index(c)] |= 1; +#if 0 + if (code_total_nwords(c) > requested_nwords) + fprintf(stderr, "NOTE: asked for %d words but got %d\n", + requested_nwords, code_total_nwords(c)); +#endif + return c; +} -//// Variable-length utilities - -/* Return the generation mask for objects headers on 'page_index' - including at most one object that starts before the page but ends on - or after it. - If the scan start is within the page, i.e. less than DOUBLEWORDS_PER_PAGE - (note that the scan start is measured relative to the page end) then - we don't need to OR in the generation byte from an extra object, - as all headers on the page are accounted for in the page generation mask. - Also an empty page (where scan start is zero) avoids looking - at the next page's first object by accident via the same test. */ -unsigned char text_page_gens_augmented(low_page_index_t page_index) +void tlsf_unalloc_codeblob(tlsf_t tlsf, struct code* code) { - return (text_pages[page_index].scan_start_offset <= DOUBLEWORDS_PER_PAGE - ? 0 : (1<<immobile_obj_generation(text_page_scan_start(page_index)))) - | text_pages[page_index].generations; + int nwords = code_total_nwords(code); + lispobj* end = (lispobj*)code + nwords; + /* If the HWM is the end of the object being freed, adjust the HWM. There are 2 cases: + * 1. if the previous block is free, then the start of the previous physical block + * is the new high water mark. The rightmost blocks in this picture get conbined. + * The block to the left of the already-free one is definitely used. + * +-------+------+----------+ + * | used | free | freeing | <- current HWM + * +-------+------+----------+ + * ^ new HWM + * + * 2. previous block is in-use: this object's address is the new HWM + */ + if (end == text_space_highwatermark) { + if (code->header & block_header_prev_free_bit) + /* The word prior to 'code' is the pointer to the previous physical block_header_t. + * The high water mark is 1 word beyond the previous physical block due to the + * discrepancy between block_header_t and where a block logically begins. */ + text_space_highwatermark = 1 + (lispobj*)((lispobj*)code)[-1]; + else + text_space_highwatermark = (lispobj*)code; + gc_assert(!((uword_t)text_space_highwatermark & LOWTAG_MASK)); + } + // See if the page scan start needs to change + low_page_index_t tlsf_page = ((char*)code - (char*)tlsf_mem_start) >> IMMOBILE_CARD_SHIFT; + int offset = (uword_t)code & (IMMOBILE_CARD_BYTES-1); + if (offset == tlsf_page_sso[tlsf_page]) { + lispobj* next = (lispobj*)code + code_total_nwords((struct code*)code); + if (*next & block_header_free_bit) { + next += code_total_nwords((struct code*)next); + gc_assert(!(*next & block_header_free_bit)); // adjacent free blocks can't occur + } + // If the next used block is on the same page, then it becomes the page scan start + // even if it the ending sentinel block (which counts as "used"). + tlsf_page_sso[tlsf_page] = + (((uword_t)next ^ (uword_t)code) >> IMMOBILE_CARD_SHIFT) == 0 + ? (uword_t)next & (IMMOBILE_CARD_BYTES-1) : USHRT_MAX; + } + // point to the user data, not the header, when calling free + tlsf_free(tlsf, (lispobj*)code + 1); } //// Fixed-length object allocator @@ -371,7 +444,7 @@ enliven_immobile_obj(lispobj *ptr, int rescan) // a native pointer if (page_index < 0) { page_index = find_text_page_index(ptr); gc_assert(page_index >= 0); - text_pages[page_index].generations |= 1<<new_space; + text_page_genmask[page_index] |= 1<<new_space; is_text = 1; } else { fixedobj_pages[page_index].gens |= 1<<new_space; @@ -404,6 +477,50 @@ enliven_immobile_obj(lispobj *ptr, int rescan) // a native pointer ++immobile_scav_queue_count; } +// The end of immobile text mapped from disk, equivalently the starting address +// of new objects handed out by the code allocator. +static uint32_t* loaded_codeblob_offsets; +static int loaded_codeblob_offsets_len; + +// Find the lowest addressed object on specified page, or 0 if there isn't one +lispobj* text_page_scan_start(low_page_index_t page) { + char* pagebase = text_page_address(page); + if (pagebase < (char*)tlsf_mem_start) { + uint32_t* data = loaded_codeblob_offsets; + int index = bsearch_greatereql_uint32((int)(pagebase-(char*)TEXT_SPACE_START), + data, loaded_codeblob_offsets_len); + lispobj* start = 0; + // I don't think index could ever be -1 ("not found"), could it? + if (index >= 0) start = (lispobj*)(TEXT_SPACE_START+data[index]); + // But it is possible for a page to have no scan start (nothing starts on it) + return (start && (char*)start < pagebase+IMMOBILE_CARD_BYTES) ? start : 0; + } + if (pagebase > (char*)text_space_highwatermark) return 0; + int tlsf_page = (pagebase - (char*)tlsf_mem_start) / IMMOBILE_CARD_BYTES; + unsigned short sso = tlsf_page_sso[tlsf_page]; + return (sso < IMMOBILE_CARD_BYTES) ? (lispobj*)(pagebase + sso) : 0; +} + +lispobj* search_immobile_code(char* ptr) { + if (ptr < (char*)TEXT_SPACE_START) return 0; + lispobj* candidate = 0; + if (ptr < (char*)tlsf_mem_start) { + uint32_t* data = loaded_codeblob_offsets; + int index = bsearch_lesseql_uint32((int)(ptr-(char*)TEXT_SPACE_START), + data, loaded_codeblob_offsets_len); + if (index >= 0) candidate = (lispobj*)(TEXT_SPACE_START+data[index]); + } else if (ptr < (char*)text_space_highwatermark) { + lispobj node = brothertree_find_lesseql((uword_t)ptr, + SYMBOL(IMMOBILE_CODEBLOB_TREE)->value); + if (node != NIL) candidate = (lispobj*)((struct binary_node*)INSTANCE(node))->key; + } + if (candidate && widetag_of(candidate) == CODE_HEADER_WIDETAG) { + int nwords = code_total_nwords((struct code*)candidate); + if (ptr < (char*)(candidate+nwords)) return candidate; + } + return 0; +} + /* If 'addr' points to an immobile object, then make the object live by promotion. But if the object is not in the generation being collected, do nothing */ @@ -412,25 +529,10 @@ boolean immobile_space_preserve_pointer(void* addr) unsigned char genmask = compacting_p() ? 1<<from_space : 0xff; lispobj* object_start; int valid = 0; - low_page_index_t page_index = find_text_page_index(addr); - - if (page_index >= 0) { - // Restrict addr to lie below 'text_space_highwatermark'. - // This way, if the gens byte is nonzero but there is - // a final array acting as filler on the remainder of the - // final page, we won't accidentally find that. - lispobj* scan_start; - valid = addr < (void*)text_space_highwatermark - && (text_page_gens_augmented(page_index) & genmask) - && (scan_start = text_page_scan_start(page_index)) <= (lispobj*)addr - && (object_start = gc_search_space(scan_start, addr)) != 0 - /* gc_search_space can return filler objects, unlike - * search_immobile_space which can not */ - && !filler_obj_p(object_start) - && (instruction_ptr_p(addr, object_start) - || properly_tagged_descriptor_p(addr, object_start)); - } else if ((page_index = find_fixedobj_page_index(addr)) >= FIXEDOBJ_RESERVED_PAGES - && ((fixedobj_pages[page_index].gens & genmask) != 0)) { + low_page_index_t page_index; + + if ((page_index = find_fixedobj_page_index(addr)) >= FIXEDOBJ_RESERVED_PAGES + && ((fixedobj_pages[page_index].gens & genmask) != 0)) { int obj_spacing = fixedobj_page_obj_align(page_index); int obj_index = ((uword_t)addr & (IMMOBILE_CARD_BYTES-1)) / obj_spacing; dprintf((logfile,"Pointer %p is to immobile page %d, object %d\n", @@ -441,8 +543,12 @@ boolean immobile_space_preserve_pointer(void* addr) && (widetag_of(object_start) == FUNCALLABLE_INSTANCE_WIDETAG || widetag_of(object_start) == FDEFN_WIDETAG || properly_tagged_descriptor_p(addr, object_start)); - } else { - return 0; + } else if (compacting_p() && (lispobj*)addr < tlsf_mem_start) { + // Can ignore this pointer if it's point to pseudostatic text + return 0; + } else if ((object_start = search_immobile_code(addr)) != 0) { + valid = instruction_ptr_p(addr, object_start) + || properly_tagged_descriptor_p(addr, object_start); } if (valid && (!compacting_p() || immobile_obj_gen_bits(object_start) == from_space)) { @@ -490,10 +596,12 @@ static void full_scavenge_immobile_newspace() // Find the next page with anything in newspace. do { if (++page > max_used_text_page) return; - } while ((text_pages[page].generations & bit) == 0); + } while ((text_page_genmask[page] & bit) == 0); lispobj* obj = text_page_scan_start(page); + if (!obj) continue; // page contains nothing - can this happen? do { lispobj* limit = (lispobj*)text_page_address(page) + WORDS_PER_PAGE; + if (limit > text_space_highwatermark) limit = text_space_highwatermark; int n_words; for ( ; obj < limit ; obj += n_words ) { lispobj header = *obj; @@ -504,12 +612,13 @@ static void full_scavenge_immobile_newspace() n_words = headerobj_size2(obj, header); } } - page = find_text_page_index(obj); + gc_assert(obj <= text_space_highwatermark); // Bail out if exact absolute end of immobile space was reached. - if (page < 0) return; + if (obj == text_space_highwatermark) break; // If 'page' should be scanned, then pick up where we left off, // without recomputing 'obj' but setting a higher 'limit'. - } while (text_pages[page].generations & bit); + page = find_text_page_index(obj); + } while (text_page_genmask[page] & bit); } } @@ -561,33 +670,6 @@ void scavenge_immobile_newspace() } } -// Return a page >= page_index having potential old->young pointers, -// or -1 if there isn't one. -static int next_text_root_page(unsigned int page_index, - unsigned int end_bitmap_index, - unsigned char genmask) -{ - unsigned int map_index = page_index / 32; - if (map_index >= end_bitmap_index) return -1; - int bit_index = page_index & 31; - // Look only at bits of equal or greater weight than bit_index. - unsigned int word = (0xFFFFFFFFU << bit_index) & text_page_touched_bits[map_index]; - while (1) { - if (word) { - bit_index = ffs(word) - 1; - page_index = map_index * 32 + bit_index; - if (text_page_gens_augmented(page_index) & genmask) - return page_index; - else { - word ^= (1U<<bit_index); - continue; - } - } - if (++map_index >= end_bitmap_index) return -1; - word = text_page_touched_bits[map_index]; - } -} - void scavenge_immobile_roots(generation_index_t min_gen, generation_index_t max_gen) { @@ -615,16 +697,20 @@ scavenge_immobile_roots(generation_index_t min_gen, generation_index_t max_gen) } while (NEXT_FIXEDOBJ(obj, obj_spacing) <= limit); } - // Variable-length object pages + // Text pages low_page_index_t max_used_text_page = calc_max_used_text_page(); - unsigned n_text_pages = 1+max_used_text_page; - unsigned end_bitmap_index = (n_text_pages+31)/32; - page = next_text_root_page(0, end_bitmap_index, genmask); - while (page >= 0) { + page = 0; + while (page <= max_used_text_page) { + if (!text_page_touched(page) || !(text_page_genmask[page] & genmask)) { + ++page; + continue; + } lispobj* obj = text_page_scan_start(page); + if (!obj) { ++page; continue; } do { lispobj* limit = (lispobj*)text_page_address(page) + WORDS_PER_PAGE; int n_words, gen; + if (limit > text_space_highwatermark) limit = text_space_highwatermark; for ( ; obj < limit ; obj += n_words ) { lispobj header = *obj; // scav_code_blob will do nothing if the object isn't @@ -636,12 +722,12 @@ scavenge_immobile_roots(generation_index_t min_gen, generation_index_t max_gen) n_words = headerobj_size2(obj, header); } } + if (obj == text_space_highwatermark) { page = -1; break; } page = find_text_page_index(obj); } while (page > 0 - && (text_pages[page].generations & genmask) + && (text_page_genmask[page] & genmask) && text_page_touched(page)); if (page < 0) break; - page = next_text_root_page(1+page, end_bitmap_index, genmask); } if (sb_sprof_enabled) { // Make another pass over all code and enliven all of 'from_space' @@ -769,41 +855,6 @@ fixedobj_points_to_younger_p(lispobj* obj, int n_words, return range_points_to_younger_p(obj+1, obj+n_words, gen, keep_gen, new_gen); } -static boolean -text_points_to_younger_p(lispobj* obj, int gen, int keep_gen, int new_gen, - os_vm_address_t page_begin, - os_vm_address_t page_end) // upper (exclusive) bound -{ - lispobj *begin, *end, word = *obj; - unsigned char widetag = header_widetag(word); - if (widetag == CODE_HEADER_WIDETAG) { // usual case. Like scav_code_blob() - return header_rememberedp(word); - } else if (widetag == FDEFN_WIDETAG || - widetag == FUNCALLABLE_INSTANCE_WIDETAG) { - // both of these have non-descriptor bits in at least one word, - // thus precluding a simple range scan. - // Due to ignored address bounds, in the rare case of a FIN or fdefn in text - // subspace and spanning cards, we might say that neither card can be protected, - // when one or the other could be. Not a big deal. - return fixedobj_points_to_younger_p(obj, sizetab[widetag](obj), - gen, keep_gen, new_gen); - } else if (widetag == SIMPLE_VECTOR_WIDETAG) { - sword_t length = vector_len((struct vector *)obj); - begin = obj + 2; // skip the header and length - end = obj + ALIGN_UP(length + 2, 2); - } else if (leaf_obj_widetag_p(widetag)) { - return 0; - } else { - lose("Unexpected widetag %x @ %p", widetag, obj); - } - // Fallthrough: scan words from begin to end - if (page_begin > (os_vm_address_t)begin) begin = (lispobj*)page_begin; - if (page_end < (os_vm_address_t)end) end = (lispobj*)page_end; - if (end > begin && range_points_to_younger_p(begin, end, gen, keep_gen, new_gen)) - return 1; - return 0; -} - /// The next two functions are analogous to 'update_page_write_prot()' /// but they differ in that they are "precise" - random code bytes that look /// like pointers are not accidentally treated as pointers. @@ -831,24 +882,15 @@ static inline boolean can_wp_fixedobj_page(page_index_t page, int keep_gen, int return 1; } -// To scan _only_ 'page' is impossible in general, but we can act like only -// one page was scanned by backing up to the first object whose end is on -// or after it, and then restricting points_to_younger within the boundaries. -// Doing it this way is probably much better than conservatively assuming -// that any word satisfying is_lisp_pointer() is a pointer. -static inline boolean can_wp_text_page(page_index_t page, int keep_gen, int new_gen) +// Return 1 if any header on 'page' is in the remembered set. +static inline boolean can_wp_text_page(page_index_t page) { lispobj *begin = text_page_address(page); lispobj *end = begin + WORDS_PER_PAGE; lispobj *obj = text_page_scan_start(page); for ( ; obj < end ; obj += headerobj_size(obj) ) { gc_assert(other_immediate_lowtag_p(*obj)); - if (!filler_obj_p(obj) && - text_points_to_younger_p(obj, - immobile_obj_generation(obj), - keep_gen, new_gen, - (os_vm_address_t)begin, - (os_vm_address_t)end)) + if (widetag_of(obj) == CODE_HEADER_WIDETAG && header_rememberedp(*obj)) return 0; } return 1; @@ -984,42 +1026,31 @@ sweep_fixedobj_pages(int raise) memset(fixedobj_page_hint, 0, sizeof fixedobj_page_hint); } -static void make_filler(void* where, int nbytes) -{ - if (nbytes < 4*N_WORD_BYTES) - lose("can't place filler @ %p - too small", where); - else { // Create a filler object. - struct code* code = (struct code*)where; - code->header = ((uword_t)nbytes << (CODE_HEADER_SIZE_SHIFT-WORD_SHIFT)) - | CODE_HEADER_WIDETAG; - code->boxed_size = 0; - code->debug_info = text_holes; - text_holes = (lispobj)code; - } -} - // Scan for freshly trashed objects and turn them into filler. // Lisp is responsible for consuming the free space // when it next allocates a variable-size object. static void sweep_text_pages(int raise) { + lispobj *freelist = 0, *freelist_tail = 0; SETUP_GENS(); low_page_index_t max_used_text_page = calc_max_used_text_page(); lispobj* free_pointer = text_space_highwatermark; low_page_index_t page; for (page = 0; page <= max_used_text_page; ++page) { - int genmask = text_pages[page].generations; + int genmask = text_page_genmask[page]; if (!(genmask & relevant_genmask)) { // Has nothing in oldspace or newspace. // Scan for old->young pointers, and WP if there are none. if (ENABLE_PAGE_PROTECTION && text_page_touched(page) - && text_page_gens_augmented(page) > 1 - && can_wp_text_page(page, keep_gen, new_gen)) { + && text_page_genmask[page] > 1 + && can_wp_text_page(page)) { text_page_touched_bits[page/32] &= ~(1U<<(page & 31)); } continue; } + lispobj* obj = text_page_scan_start(page); + gc_assert(obj); lispobj* page_base = text_page_address(page); lispobj* limit = page_base + WORDS_PER_PAGE; if (limit > free_pointer) limit = free_pointer; @@ -1027,44 +1058,23 @@ sweep_text_pages(int raise) // wp_it is 1 if we should try to write-protect it now. // If already write-protected, skip the tests. int wp_it = ENABLE_PAGE_PROTECTION && text_page_touched(page); - lispobj* obj = text_page_scan_start(page); int size, gen; - if (obj < page_base) { - // An object whose tail is on this page, or which spans this page, - // would have been promoted/kept while dealing with the page with - // the object header. Therefore we don't need to consider that object, - // * except * that we do need to consider whether it is an old object - // pointing to a young object. - if (wp_it // If we wanted to try write-protecting this page, - // and the object starting before this page is strictly older - // than the generation that we're moving retained objects into - && (gen = immobile_obj_gen_bits(obj)) > new_gen - // and it contains an old->young pointer - && text_points_to_younger_p(obj, gen, keep_gen, new_gen, - (os_vm_address_t)page_base, - (os_vm_address_t)limit)) { - wp_it = 0; - } - // We MUST skip this object in the sweep, because in the case of - // non-promotion (raise=0), we could see an object in from_space - // and believe it to be dead. - obj += headerobj_size(obj); - // obj can't hop over this page. If it did, there would be no - // headers on the page, and genmask would have been zero. - gc_assert(obj < limit); - } for ( ; obj < limit ; obj += size ) { lispobj word = *obj; size = object_size2(obj, word); - if (filler_obj_p(obj)) { // do nothing + if (header_widetag(word) == FILLER_WIDETAG) { // ignore } else if ((gen = immobile_obj_gen_bits(obj)) == discard_gen) { - if (header_widetag(word) == CODE_HEADER_WIDETAG) { - /* fprintf(stderr, "%lX freed (id=%x)\n", - make_lispobj(obj, OTHER_POINTER_LOWTAG), - code_serialno((struct code*)obj)); */ - } - make_filler(obj, size * N_WORD_BYTES); + gc_assert(header_widetag(word) == CODE_HEADER_WIDETAG); + assign_widetag(obj, FILLER_WIDETAG); + // ASSUMPTION: little-endian + ((char*)obj)[2] = 0; // clear the TRACED flag + ((char*)obj)[3] = 0; // clear the WRITTEN flag and the generation + // Building the list in ascending order means less work later on + // because the HWM will get adjusted once only, at the end. + // Descending order would decrease the HWM for each deallocation. + if (freelist) freelist_tail[1] = (lispobj)obj; else freelist = obj; + freelist_tail = obj; } else if (gen == keep_gen) { assign_generation(obj, gen = new_gen); #ifdef DEBUG @@ -1073,17 +1083,19 @@ sweep_text_pages(int raise) (os_vm_address_t)limit)); #endif any_kept = -1; - } else if (wp_it && - text_points_to_younger_p(obj, gen, keep_gen, new_gen, - (os_vm_address_t)page_base, - (os_vm_address_t)limit)) + } else if (wp_it && header_rememberedp(*obj)) wp_it = 0; } - COMPUTE_NEW_MASK(mask, text_pages[page].generations); - text_pages[page].generations = mask; + COMPUTE_NEW_MASK(mask, text_page_genmask[page]); + text_page_genmask[page] = mask; if ( mask && wp_it ) text_page_touched_bits[page/32] &= ~(1U << (page & 31)); } + // Stuff the new freelist onto the front of codeblob_freelist + if (freelist_tail) { + freelist_tail[1] = codeblob_freelist; + codeblob_freelist = (lispobj)freelist; + } } // TODO: (Maybe this won't work. Not sure yet.) rather than use the @@ -1110,14 +1122,15 @@ void gc_init_immobile() gc_assert(fixedobj_pages); n_bitmap_elts = ALIGN_UP(n_text_pages, 32) / 32; - int request = n_bitmap_elts * sizeof (int) + n_text_pages * sizeof (int); - text_page_touched_bits = (unsigned int*)calloc(1, request); + text_page_touched_bits = (unsigned int*)calloc(n_bitmap_elts, sizeof (int)); gc_assert(text_page_touched_bits); // The conservative value for 'touched' is 1. memset(text_page_touched_bits, 0xff, n_bitmap_elts * sizeof (int)); - text_pages = (struct text_page*)(text_page_touched_bits + n_bitmap_elts); + text_page_genmask = calloc(n_text_pages, 1); // Scav queue is arbitrarily located. immobile_scav_queue = malloc(QCAPACITY * sizeof(lispobj)); + tlsf_control = os_validate(0, (char*)0x90000000, ALIGN_UP(tlsf_size(), 4096), 0, 0); + tlsf_create(tlsf_control); } // Signify that scan_start is initially not reliable @@ -1141,9 +1154,8 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t text_len) where += object_size(where); } where = (lispobj*)TEXT_SPACE_START; - end = (lispobj*)((char*)where + text_len); - while (where < end) { - if (!filler_obj_p(where)) assign_generation(where, gen); + while (where < text_space_highwatermark) { + if (widetag_of(where) != FILLER_WIDETAG) assign_generation(where, gen); where += object_size(where); } // If the regression suite is run with core pages in gen0 (to more aggressively @@ -1187,60 +1199,36 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t text_len) return; } uword_t address = TEXT_SPACE_START; - n_pages = text_len / IMMOBILE_CARD_BYTES; - lispobj* obj = (lispobj*)address; - int n_words; - low_page_index_t last_page = 0; + gc_assert(PTR_ALIGN_UP(text_space_highwatermark, IMMOBILE_CARD_BYTES) == text_space_highwatermark); + // Don't use text_len because that measures backend pages (32k), + // but we're willing to start in the middle of such a page + // with new code allocation. + n_pages = ((uword_t)text_space_highwatermark-TEXT_SPACE_START) / IMMOBILE_CARD_BYTES; + for (page = 0; page < n_pages ; ++page) text_page_genmask[page] |= 1<<gen; // coreparse() already set text_space_highwatermark - lispobj* limit = text_space_highwatermark; - gc_assert(limit != 0 /* would be zero if not mmapped yet */ - && limit <= (lispobj*)(address + text_len)); - for ( ; obj < limit ; obj += n_words ) { - gc_assert(other_immediate_lowtag_p(obj[0])); - n_words = headerobj_size(obj); - if (filler_obj_p(obj)) { - // Holes were chained through the debug_info slot at save. - // Just update the head of the chain. - text_holes = (lispobj)obj; - continue; - } - low_page_index_t first_page = find_text_page_index(obj); - last_page = find_text_page_index(obj+n_words-1); - // Only the page with this object header gets a bit in its gen mask. - text_pages[first_page].generations |= 1<<immobile_obj_gen_bits(obj); - // For each page touched by this object, set the page's - // scan_start_offset, unless it was already set. - int page; - for (page = first_page ; page <= last_page ; ++page) { - if (!text_pages[page].scan_start_offset) { - long offset = (char*)text_page_address(page+1) - (char*)obj; - text_pages[page].scan_start_offset = offset >> (WORD_SHIFT + 1); - } - } - } - // Write a padding object if necessary - if ((uword_t)limit & (IMMOBILE_CARD_BYTES-1)) { - int remainder = IMMOBILE_CARD_BYTES - ((uword_t)limit & (IMMOBILE_CARD_BYTES-1)); - int words = (remainder >> WORD_SHIFT) - 2; // discount the array header itself - if (limit[0] == SIMPLE_ARRAY_FIXNUM_WIDETAG) { - gc_assert(vector_len((struct vector*)limit) == words); - } else { -#ifdef LISP_FEATURE_UBSAN - limit[0] = ((uword_t)words << (32+N_FIXNUM_TAG_BITS)) | SIMPLE_ARRAY_FIXNUM_WIDETAG; -#else - limit[0] = SIMPLE_ARRAY_FIXNUM_WIDETAG; - limit[1] = make_fixnum(words); -#endif - } - int size = sizetab[SIMPLE_ARRAY_FIXNUM_WIDETAG](limit); - lispobj* __attribute__((unused)) padded_end = limit + size; - gc_assert(!((uword_t)padded_end & (IMMOBILE_CARD_BYTES-1))); - } + gc_assert(text_space_highwatermark != 0 /* would be zero if not mmapped yet */ + && text_space_highwatermark <= (lispobj*)(address + text_len)); + tlsf_mem_start = text_space_highwatermark; + struct vector* v = VECTOR(SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value); + gc_assert(widetag_of((lispobj*)v) == SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); + // The vector itself is pseudo-static in dynamic space + if(gencgc_verbose) fprintf(stderr, "pseudostatic codeblob vector is %p\n", v); + loaded_codeblob_offsets = (void*)v->data; + loaded_codeblob_offsets_len = vector_len(v); + + // Create a TLSF pool + char *tlsf_memory_end = (char*)TEXT_SPACE_START + text_space_size; + int tlsf_memory_size = tlsf_memory_end - (char*)tlsf_mem_start; + tlsf_add_pool(tlsf_control, tlsf_mem_start, tlsf_memory_size); + int n_tlsf_pages = tlsf_memory_size / IMMOBILE_CARD_BYTES; + tlsf_page_sso = malloc(n_tlsf_pages * sizeof (short int)); + memset(tlsf_page_sso, 0xff, n_tlsf_pages * sizeof (short int)); + // Set the WP bits for pages occupied by the core file. // (There can be no inter-generation pointers.) if (gen != 0 && ENABLE_PAGE_PROTECTION) { low_page_index_t page; - for (page = 0 ; page <= last_page ; ++page) + for (page = 0 ; page <= n_pages ; ++page) text_page_touched_bits[page/32] &= ~(1U<<(page & 31)); } page_attributes_valid = 1; @@ -1253,9 +1241,6 @@ void prepare_immobile_space_for_final_gc() char* page_base; char* page_end = (char*)fixedobj_free_pointer; - // The list of holes need not be saved. - SYMBOL(IMMOBILE_FREELIST)->value = NIL; - for (page = 0, page_base = fixedobj_page_address(page) ; page_base < page_end ; page_base += IMMOBILE_CARD_BYTES, ++page) { @@ -1274,12 +1259,23 @@ void prepare_immobile_space_for_final_gc() lispobj* obj = (lispobj*)TEXT_SPACE_START; lispobj* limit = text_space_highwatermark; + int npages = (ALIGN_UP((uword_t)limit, IMMOBILE_CARD_BYTES) - TEXT_SPACE_START) + / IMMOBILE_CARD_BYTES; + memset(text_page_genmask, 0, npages); for ( ; obj < limit ; obj += headerobj_size(obj) ) { - if (!filler_obj_p(obj) && immobile_obj_gen_bits(obj) != 0) { + if (widetag_of(obj) != FILLER_WIDETAG) { assign_generation(obj, 0); - text_pages[find_text_page_index(obj)].generations = 1; + text_page_genmask[find_text_page_index(obj)] = 1; } } + // The object offset vector needs to be copied out of the heap + // so that it can be freed by GC. + int nbytes = sizeof (uint32_t) * loaded_codeblob_offsets_len; + lispobj* vector_copy = malloc(nbytes); + loaded_codeblob_offsets = memcpy(vector_copy, loaded_codeblob_offsets, nbytes); + + SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value = NIL; + SYMBOL(IMMOBILE_CODEBLOB_TREE)->value = NIL; } int* code_component_order; @@ -1304,21 +1300,37 @@ void prepare_immobile_space_for_save(boolean verbose) obj += object_size(obj); } - obj = (lispobj*)TEXT_SPACE_START; - limit = text_space_highwatermark; - for ( text_holes = 0 ; obj < limit ; obj += headerobj_size(obj) ) { - if (filler_obj_p(obj)) { - struct code* code = (struct code*)obj; - code->debug_info = text_holes; - code->fixups = 0; - text_holes = (lispobj)code; - // 0-fill the unused space. - int nwords = headerobj_size(obj); - memset(code->constants, 0, - (nwords * N_WORD_BYTES) - offsetof(struct code, constants)); - } else - assign_generation(obj, PSEUDO_STATIC_GENERATION); + int codeblob_count = 0; + for ( obj = (lispobj*)TEXT_SPACE_START ; obj < text_space_highwatermark ; obj += headerobj_size(obj) ) { + // *obj &= ~(uword_t)block_header_prev_free_bit; + assign_generation(obj, PSEUDO_STATIC_GENERATION); + ++codeblob_count; + } + // Create a vector of code offsets + int n_data_words = ALIGN_UP(codeblob_count, 2) >> 1; + int vector_nwords = 2 + ALIGN_UP(n_data_words, 2); + // FIXME: need to reorder some things so that this gets moved to R/O space + struct vector* v = gc_general_alloc(unboxed_region, vector_nwords<<WORD_SHIFT, + PAGE_TYPE_UNBOXED); + v->header = SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG; + v->length_ = make_fixnum(codeblob_count); + gc_close_region(unboxed_region, PAGE_TYPE_UNBOXED); + // Zero-fill the end of dynamic space since we aready performed zero_all_free_ranges(). + uword_t vector_end = (uword_t)((lispobj*)v + vector_nwords), + aligned_end = ALIGN_UP(vector_end, BACKEND_PAGE_BYTES); + memset((char*)vector_end, 0, aligned_end-vector_end); + uint32_t* data = (uint32_t*)v->data; + int i = 0; + for ( obj = (lispobj*)TEXT_SPACE_START ; obj < text_space_highwatermark ; obj += headerobj_size(obj) ) { + data[i++] = (int)((uword_t)obj - TEXT_SPACE_START); } + // Write a filler if needed to align tlsf_mem_start + lispobj* aligned_hwm = PTR_ALIGN_UP(text_space_highwatermark, IMMOBILE_CARD_BYTES); + if (text_space_highwatermark < aligned_hwm) { + *text_space_highwatermark = make_filler_header(aligned_hwm - text_space_highwatermark); + text_space_highwatermark = aligned_hwm; + } + SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value = make_lispobj(v, OTHER_POINTER_LOWTAG); if (verbose) printf("done]\n"); } @@ -1353,19 +1365,9 @@ static struct tempspace { lispobj * search_immobile_space(void *pointer) { - lispobj *start; - - if ((void*)TEXT_SPACE_START <= pointer - && pointer < (void*)text_space_highwatermark) { - low_page_index_t page_index = find_text_page_index(pointer); - if (page_attributes_valid) { - start = text_page_scan_start(page_index); - if (start > (lispobj*)pointer) return NULL; - } else { - start = (lispobj*)TEXT_SPACE_START; - } - lispobj* found = gc_search_space(start, pointer); - return (found && filler_obj_p(found)) ? 0 : found; + if ((void*)TEXT_SPACE_START <= pointer && pointer < (void*)text_space_highwatermark) { + if (!page_attributes_valid)lose("Can't search"); + return search_immobile_code(pointer); } else if ((void*)FIXEDOBJ_SPACE_START <= pointer && pointer < (void*)fixedobj_free_pointer) { low_page_index_t page_index = find_fixedobj_page_index(pointer); @@ -1399,34 +1401,6 @@ search_immobile_space(void *pointer) return NULL; } -// For coalescing holes, we need to scan backwards, which is done by -// looking backwards for a page that contains the start of a -// block of objects one of which must abut 'obj'. -lispobj* find_preceding_object(lispobj* obj) -{ - int page = find_text_page_index(obj); - gc_assert(page >= 0); - while (1) { - int offset = text_pages[page].scan_start_offset; - if (offset) { // 0 means the page is empty. - lispobj* start = text_page_scan_start(page); - if (start < obj) { // Scan from here forward - while (1) { - lispobj* end = start + headerobj_size(start); - if (end == obj) return start; - gc_assert(end < obj); - start = end; - } - } - } - if (page == 0) { - gc_assert(obj == text_page_address(0)); - return 0; // Predecessor does not exist - } - --page; - } -} - // FIXME: Figure out not to hardcode #define FUN_TRAMP_SIZE 6 #define GF_SIZE 6 @@ -1679,7 +1653,7 @@ static lispobj* get_load_address(lispobj* old) { if (forwarding_pointer_p(old)) return native_pointer(forwarding_pointer_value(old)); - gc_assert(filler_obj_p(old)); + gc_assert(widetag_of(old) == FILLER_WIDETAG); return 0; } @@ -1933,15 +1907,12 @@ static void defrag_immobile_space(boolean verbose) gc_assert(lowtag_of((lispobj)addr) == OTHER_POINTER_LOWTAG); addr = native_pointer((lispobj)addr); int widetag = widetag_of(addr); - gc_assert(widetag == CODE_HEADER_WIDETAG); + gc_assert(widetag == CODE_HEADER_WIDETAG || widetag == FILLER_WIDETAG); lispobj new_vaddr = 0; // A code component can become garbage in the final GC // (defrag happens after the last GC) leaving a filler object // which was in components[] because it was live before GC. - if (!filler_obj_p(addr)) { - // must not be a trampoline object - if ((lispobj)addr > TEXT_SPACE_START) - gc_assert(code_n_funs((struct code*)addr)); + if (widetag == CODE_HEADER_WIDETAG) { ++n_code_components; new_vaddr = TEXT_SPACE_START + n_code_bytes; n_code_bytes += sizetab[widetag](addr) << WORD_SHIFT; @@ -1949,11 +1920,7 @@ static void defrag_immobile_space(boolean verbose) components[i*2+1] = new_vaddr; } } - int aligned_nbytes = ALIGN_UP(n_code_bytes, IMMOBILE_CARD_BYTES); - if (aligned_nbytes - n_code_bytes == 2 * N_WORD_BYTES) - // waste another page because it can't be a 2-word filler - aligned_nbytes += IMMOBILE_CARD_BYTES; - text_tempspace.n_bytes = aligned_nbytes; + text_tempspace.n_bytes = n_code_bytes; text_tempspace.start = calloc(text_tempspace.n_bytes, 1); if (verbose) @@ -1993,9 +1960,6 @@ static void defrag_immobile_space(boolean verbose) set_forwarding_pointer(addr, make_lispobj((void*)new_vaddr, OTHER_POINTER_LOWTAG)); } - if (aligned_nbytes > n_code_bytes) - make_filler(tempspace_addr((char*)TEXT_SPACE_START + n_code_bytes), - aligned_nbytes - n_code_bytes); } #if DEFRAGMENT_FIXEDOBJ_SUBSPACE diff --git a/src/runtime/immobile-space.h b/src/runtime/immobile-space.h index 5410538321..addb50c6b8 100644 --- a/src/runtime/immobile-space.h +++ b/src/runtime/immobile-space.h @@ -44,28 +44,8 @@ text_page_address(low_page_index_t page_num) return (void*)(TEXT_SPACE_START + (page_num * IMMOBILE_CARD_BYTES)); } -struct text_page { - // Generation mask for objects which start on this page. - // An object which ends on but does not start on this page - // does not set the respective bit. - unsigned int generations: 8, - // Offset backwards in double-lispwords from the page end to the - // lowest-addressed object touching the page. This offset can point to - // a hole, but we prefer that it not. If the offset is zero, the page - // has no object other than possibly a hole resulting from a freed object. - // The entire space size defaults to just over 100MiB, - // so 24 bits is more than adequate to point back to any word. - scan_start_offset: 24; -}; - -extern struct text_page *text_pages; -/* Calculate the address where the first object touching this page starts. */ -static inline lispobj* -text_page_scan_start(low_page_index_t page_index) -{ - return (lispobj*)((char*)text_page_address(page_index+1) - - text_pages[page_index].scan_start_offset * (2 * N_WORD_BYTES)); -} +extern unsigned char* text_page_genmask; +extern unsigned short int* tlsf_page_sso; static inline low_page_index_t find_fixedobj_page_index(void *addr) { diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index a025aa51e3..63d7b3bf7c 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -38,7 +38,8 @@ #include "genesis/primitive-objects.h" #include "genesis/gc-tables.h" #include "gc-internal.h" - +#include "tlsf-bsd/tlsf/tlsf.h" +extern void* tlsf_control; /* When we need to do command input, we use this stream, which is not * in general stdin, so that things will "work" (as well as being @@ -69,13 +70,16 @@ struct crash_preamble { uword_t fixedobj_start, fixedobj_size, fixedobj_free_pointer; // text data dumped: pages, touched_bits, page table uword_t text_start, text_size; - lispobj *text_space_highwatermark; + lispobj *tlsf_mem_start, *text_space_highwatermark; + lispobj sentinel_block[3]; + void* tlsf_control_address; int nthreads; int tls_size; lispobj lisp_package_vector; + int sizeof_context; + int tlsf_control_size; char sprof_enabled; char pin_dynspace_code; - int sizeof_context; }; struct crash_thread_preamble { uword_t address; @@ -130,12 +134,17 @@ void save_gc_crashdump(char *pathname, preamble.pin_dynspace_code = pin_all_dynamic_space_code; preamble.sizeof_context = sizeof (os_context_t); #ifdef LISP_FEATURE_IMMOBILE_SPACE + char *tlsf_memory_end = (char*)TEXT_SPACE_START + TEXT_SPACE_SIZE; preamble.fixedobj_start = FIXEDOBJ_SPACE_START; preamble.fixedobj_size = FIXEDOBJ_SPACE_SIZE; preamble.fixedobj_free_pointer = (uword_t)fixedobj_free_pointer; preamble.text_start = TEXT_SPACE_START; preamble.text_size = TEXT_SPACE_SIZE; preamble.text_space_highwatermark = text_space_highwatermark; + preamble.tlsf_mem_start = tlsf_mem_start; + preamble.tlsf_control_address = tlsf_control; + preamble.tlsf_control_size = tlsf_size(); + memcpy(preamble.sentinel_block, tlsf_memory_end-3*N_WORD_BYTES, 3*N_WORD_BYTES); #endif // write the preamble and static + readonly spaces checked_write("preamble", fd, &preamble, sizeof preamble); @@ -152,11 +161,16 @@ void save_gc_crashdump(char *pathname, int total_npages = FIXEDOBJ_SPACE_SIZE / IMMOBILE_CARD_BYTES; checked_write("fixedobj_PTE", fd, fixedobj_pages, total_npages * sizeof sizeof(struct fixedobj_page)); usage = (uword_t)text_space_highwatermark - TEXT_SPACE_START; - checked_write("text", fd, (char*)TEXT_SPACE_START, usage); + // write the block_header_t that is just beyond the high water mark + checked_write("text", fd, (char*)TEXT_SPACE_START, usage+3*N_WORD_BYTES); total_npages = TEXT_SPACE_SIZE / IMMOBILE_CARD_BYTES; int n_bitmap_elts = ALIGN_UP(total_npages, 32) / 32; + checked_write("text_gen", fd, text_page_genmask, total_npages); // 1 byte per page checked_write("text_WP", fd, text_page_touched_bits, n_bitmap_elts * sizeof (int)); - checked_write("text_PTE", fd, text_pages, total_npages * sizeof (int)); + checked_write("TLSF_control", fd, tlsf_control, preamble.tlsf_control_size); + int tlsf_memory_size = tlsf_memory_end - (char*)tlsf_mem_start; + int n_tlsf_pages = tlsf_memory_size / IMMOBILE_CARD_BYTES; + checked_write("TLSF_sso", fd, tlsf_page_sso, n_tlsf_pages * sizeof (short)); #endif struct crash_thread_preamble thread_preamble; for_each_thread(th) { @@ -205,7 +219,7 @@ void save_gc_crashdump(char *pathname, // write the preamble checked_write("thread", fd, &thread_preamble, sizeof thread_preamble); // write 0 or 1 contexts, control-stack, binding-stack, TLS - if (ici) write(fd, threadcontext, preamble.sizeof_context); + if (ici) checked_write(" ctxt", fd, threadcontext, preamble.sizeof_context); #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK checked_write(" stack", fd, (char*)sp, nbytes_control_stack); #else @@ -289,6 +303,13 @@ static int gc_cmd(char **ptr) { return 0; } +static int tlsf_cmd(__attribute__((unused)) char **ptr) { +#ifdef LISP_FEATURE_IMMOBILE_SPACE + tlsf_dump_pool(tlsf_control, tlsf_mem_start, "/dev/tty"); +#endif + return 0; +} + static struct cmd { char *cmd, *help; int (*fn)(char **ptr); @@ -311,6 +332,7 @@ static struct cmd { {"search", "Search heap for object.", search_cmd}, {"save", "Produce crashdump", save_cmd}, {"threads", "List threads", threads_cmd}, + {"tlsfdump", "Dump TLSF structures", tlsf_cmd}, {"verify", "Check heap invariants", verify_cmd}, {"gc", "Collect garbage", gc_cmd}, {NULL, NULL, NULL} @@ -903,11 +925,23 @@ int load_gc_crashdump(char* pathname) checked_read("fixedobj_PTE", fd, fixedobj_pages, total_npages * sizeof sizeof(struct fixedobj_page)); // Read text space usage = (uword_t)text_space_highwatermark - TEXT_SPACE_START; - checked_read("text", fd, (char*)TEXT_SPACE_START, usage); + char *tlsf_memory_end = (char*)TEXT_SPACE_START + TEXT_SPACE_SIZE; + tlsf_mem_start = preamble.tlsf_mem_start; + fprintf(stderr, "tlsf_mem_start=%p\n", tlsf_mem_start); + int tlsf_memory_size = tlsf_memory_end - (char*)tlsf_mem_start; + checked_read("text", fd, (char*)TEXT_SPACE_START, usage+3*N_WORD_BYTES); + memcpy(tlsf_memory_end-3*N_WORD_BYTES, preamble.sentinel_block, 3*N_WORD_BYTES); total_npages = TEXT_SPACE_SIZE / IMMOBILE_CARD_BYTES; int n_bitmap_elts = ALIGN_UP(total_npages, 32) / 32; + checked_read("text_gen", fd, text_page_genmask, total_npages); // 1 byte per page checked_read("text_WP", fd, text_page_touched_bits, n_bitmap_elts * sizeof (int)); - checked_read("text_PTE", fd, text_pages, total_npages * sizeof (int)); + tlsf_control = preamble.tlsf_control_address; // already mapped at a fixed address + // TLSF control was mapped in gc_init_immobile() + checked_read("TLSF_control", fd, tlsf_control, preamble.tlsf_control_size); + int n_tlsf_pages = tlsf_memory_size / IMMOBILE_CARD_BYTES; + fprintf(stderr, "%d TLSF pages\n", n_tlsf_pages); + tlsf_page_sso = malloc(n_tlsf_pages * sizeof (short)); + checked_read("TLSF_sso", fd, tlsf_page_sso, n_tlsf_pages * sizeof (short)); write_protect_immobile_space(); #endif fprintf(stderr, "%d threads:\n", (int)preamble.nthreads); diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index f80c62bea4..a35cc0c948 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -134,9 +134,7 @@ verify_pointer(lispobj thing, lispobj *where, struct verify_state *state) "unallocated space"); } else { // The object pointed to must not have been discarded as garbage. - FAIL_IF(!other_immediate_lowtag_p(*native_pointer(thing)) || - filler_obj_p(native_pointer(thing)), - "trashed object"); + FAIL_IF(!other_immediate_lowtag_p(*native_pointer(thing)), "trashed object"); } // Must not point to a forwarding pointer FAIL_IF(*native_pointer(thing) == FORWARDING_HEADER, "forwarding ptr"); @@ -321,10 +319,7 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state continue; } #endif - // FIXME: should not have code acting as filler - if (widetag != FILLER_WIDETAG && !filler_obj_p(where)) { - // Any page can have a filler on it - if (pg >= 0) { + if (widetag != FILLER_WIDETAG && pg >= 0) { // Assert proper page type if (state->object_header) // is not a cons gc_assert(page_table[pg].type != PAGE_TYPE_CONS); @@ -342,7 +337,6 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state if (is_code(page_table[pg].type)) lose("object @ %p is non-code on code page", where); } - } } } if (!state->object_header) { @@ -480,7 +474,7 @@ void gc_show_pte(lispobj obj) page = find_text_page_index((void*)obj); if (page>=0) { lispobj* text_page_scan_start(low_page_index_t page); - int gens = text_pages[page].generations; + int gens = text_page_genmask[page]; char genstring[9]; int i; for (i=0;i<8;++i) genstring[i] = (gens & (1<<i)) ? '0'+i : '-'; diff --git a/tests/run-tests.lisp b/tests/run-tests.lisp index a9290e6a05..4755151051 100644 --- a/tests/run-tests.lisp +++ b/tests/run-tests.lisp @@ -203,7 +203,8 @@ sb-impl::*token-buf-pool* sb-impl::*user-hash-table-tests* sb-impl::**finalizer-store** - sb-vm::*codeblob-tree* + sb-vm::*immobile-codeblob-tree* + sb-vm::*dynspace-codeblob-tree* ,(maybe "SB-KERNEL" "*EVAL-CALLS*") sb-kernel::*type-cache-nonce* sb-ext:*gc-run-time* diff --git a/tlsf-bsd/tlsf/tlsf.c b/tlsf-bsd/tlsf/tlsf.c index c30eabb3d9..8658e2133b 100644 --- a/tlsf-bsd/tlsf/tlsf.c +++ b/tlsf-bsd/tlsf/tlsf.c @@ -11,9 +11,9 @@ #include <stdlib.h> #include <string.h> -#include "tlsf.h" +#include "tlsf-bsd/tlsf/tlsf.h" -#include "tlsf_utils.h" +#include "tlsf-bsd/tlsf/tlsf_utils.h" #if __GNUC__ || __INTEL_COMPILER #define likely(x) __builtin_expect(!!(x), 1) @@ -30,6 +30,9 @@ #define tlsf_assert(expr) (void)(0) #endif +#include "genesis/config.h" +#include "genesis/constants.h" + /* Public constants: may be modified. */ enum tlsf_public { /* log2 of number of linear subdivisions of block sizes. Larger @@ -61,11 +64,7 @@ enum tlsf_private { * blocks below that size into the 0th first-level list. */ -#if defined(TLSF_64BIT) - FL_INDEX_MAX = 40, /* 1 TB */ -#else FL_INDEX_MAX = 30, -#endif SL_INDEX_COUNT = (1 << SL_INDEX_COUNT_LOG2), FL_INDEX_SHIFT = (SL_INDEX_COUNT_LOG2 + ALIGN_SIZE_LOG2), FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1), @@ -117,8 +116,17 @@ typedef struct block_header_t { /* Points to the previous physical block. */ struct block_header_t *prev_phys_block; - /* The size of this block, excluding the block header. */ - size_t size; +#ifdef LISP_FEATURE_BIG_ENDIAN + // For this word to read as an object header, the size and widetag + // are flipped relative to little-endian. +#error "not done" +#else + unsigned char widetag; + unsigned char _flags; // must have at most bits 0, 1, 2 on + unsigned char unused; // must be zero + unsigned char gen; // low 4 must be 0..5 and bit 0x4 can be on + uint32_t _nwords; // including the header +#endif /* Next and previous free blocks. */ struct block_header_t *next_free; @@ -126,13 +134,11 @@ typedef struct block_header_t { } block_header_t; /* - * Since block sizes are always at least a multiple of 4, the two least - * significant bits of the size field are used to store the block status: - * - bit 0: whether block is busy or free - * - bit 1: whether previous block is busy or free + * - byte 1 bit 0: whether block is busy (0) or free (1) + * - byte 1 bit 1: whether previous block is busy (0) or free (1) */ -static const size_t block_header_free_bit = 1 << 0; -static const size_t block_header_prev_free_bit = 1 << 1; +static const unsigned char block_header_free_bit = 1 << 0; +static const unsigned char block_header_prev_free_bit = 1 << 1; /* * The size of the block header exposed to used blocks is the size field. @@ -147,8 +153,7 @@ static const size_t block_header_overhead = sizeof(size_t); static const size_t block_header_overlap = sizeof(block_header_t *); /* User data starts directly after the size field in a used block. */ -static const size_t block_start_offset = - offsetof(block_header_t, size) + sizeof(size_t); +static const size_t block_start_offset = offsetof(block_header_t, next_free); /* * A free block must be large enough to store its header minus the size of @@ -178,49 +183,49 @@ typedef struct control_t { static size_t block_size(const block_header_t *block) { - return block->size & ~(block_header_free_bit | block_header_prev_free_bit); + return (block->_nwords - 1) << WORD_SHIFT; // nbytes excluding the lispobj header } static void block_set_size(block_header_t *block, size_t size) { - const size_t oldsize = block->size; - block->size = - size | (oldsize & (block_header_free_bit | block_header_prev_free_bit)); + // convert to words inclusive of the header, as codeblobs require + block->_nwords = (size >> WORD_SHIFT) + 1; } __attribute__((unused)) static int block_is_last(const block_header_t *block) { - return block_size(block) == 0; + return block->_nwords <= 2; } static int block_is_free(const block_header_t *block) { - return tlsf_cast(int, block->size &block_header_free_bit); + return tlsf_cast(int, block->_flags & block_header_free_bit); } static void block_set_free(block_header_t *block) { - block->size |= block_header_free_bit; + tlsf_assert(block->widetag == FILLER_WIDETAG); + block->_flags |= block_header_free_bit; } static void block_set_used(block_header_t *block) { - block->size &= ~block_header_free_bit; + block->_flags &= ~block_header_free_bit; } static int block_is_prev_free(const block_header_t *block) { - return tlsf_cast(int, block->size &block_header_prev_free_bit); + return tlsf_cast(int, block->_flags & block_header_prev_free_bit); } static void block_set_prev_free(block_header_t *block) { - block->size |= block_header_prev_free_bit; + block->_flags |= block_header_prev_free_bit; } static void block_set_prev_used(block_header_t *block) { - block->size &= ~block_header_prev_free_bit; + block->_flags &= ~block_header_prev_free_bit; } static block_header_t *block_from_ptr(const void *ptr) @@ -365,7 +370,7 @@ static block_header_t *search_suitable_block(control_t *control, */ unsigned int sl_map = control->sl_bitmap[fl] & (((unsigned int)~0) << sl); if (!sl_map) { - /* No block exists. Search in the next largest first-level list. */ + /* No block exists. Search in the next first-level list. */ const unsigned int fl_map = control->fl_bitmap & (((unsigned int)~0) << (fl + 1)); if (!fl_map) { @@ -475,6 +480,8 @@ static block_header_t *block_split(block_header_t *block, size_t size) tlsf_assert(block_size(block) == remain_size + size + block_header_overhead); + // Clear the block header word to 0 but stuff in a valid widetag. + *(1 + (uintptr_t*)remaining) = FILLER_WIDETAG; block_set_size(remaining, remain_size); tlsf_assert(block_size(remaining) >= block_size_min && "block split with invalid size"); @@ -490,7 +497,7 @@ static block_header_t *block_absorb(block_header_t *prev, block_header_t *block) { tlsf_assert(!block_is_last(prev) && "previous block can't be last"); /* Note: Leaves flags untouched. */ - prev->size += block_size(block) + block_header_overhead; + prev->_nwords += block->_nwords; block_link_next(prev); return prev; } @@ -602,8 +609,11 @@ static block_header_t *block_locate_free(control_t *control, size_t size) remove_free_block(control, block, fl, sl); } - if (unlikely(block && !block->size)) - block = NULL; + // Not sure what this is trying to guard against. If there is a block, + // it was just asserted that block->size equals or exceeds 'size', + // and block can be non-NULL only if size was nonzero. + // if (unlikely(block && !block->size) + // block = NULL; return block; } @@ -815,7 +825,10 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void *mem, size_t bytes) block_header_t *next; const size_t pool_overhead = tlsf_pool_overhead(); - const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE); + // subtract another word so that the end sentinel consumes 2 words + // (including its header) + const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE) + - N_WORD_BYTES; if (((ptrdiff_t)mem % ALIGN_SIZE) != 0) { printf("tlsf_add_pool: Memory must be aligned by %u bytes.\n", @@ -836,6 +849,7 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void *mem, size_t bytes) * it will never be used. */ block = offset_to_block(mem, 0); + block->widetag = FILLER_WIDETAG; block_set_size(block, pool_bytes); block_set_free(block); block_set_prev_used(block); @@ -843,7 +857,8 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void *mem, size_t bytes) /* Split the block to create a zero-size sentinel block. */ next = block_link_next(block); - block_set_size(next, 0); + next->widetag = FILLER_WIDETAG; + block_set_size(next, N_WORD_BYTES); block_set_used(next); block_set_prev_free(next); @@ -1043,3 +1058,47 @@ void *tlsf_realloc(tlsf_t tlsf, void *ptr, size_t size) return p; } + +void tlsf_dump_freelists(tlsf_t tlsf, FILE *f) +{ + control_t *control = tlsf_cast(control_t *, tlsf); + fprintf(f, "Freelists:\n"); + int i,j; + for (i=0; i<FL_INDEX_COUNT; ++i) + for (j=0; j<SL_INDEX_COUNT; ++j) { + block_header_t *l = control->blocks[i][j]; + if (l != &control->block_null) { + fprintf(f, "[%2d,%2d]=", i, j); + do { + fprintf(f, "%p (%x) ", l, l->_nwords); + l = l->next_free; + } while (l != &control->block_null); + putc('\n', f); + } + } +} + +void tlsf_dump_pool(tlsf_t tlsf, pool_t pool, char *pathname) +{ + FILE* f = fopen(pathname, "w"); + if (tlsf) tlsf_dump_freelists(tlsf, f); + fprintf(f, " Free &header header nbytes &prev_header\n"); + fprintf(f, " (incl hdr)\n"); + fprintf(f, " ----- ---------- --------------- ----------- -------------\n"); + block_header_t *block = offset_to_block(pool, 0); + while (block) { + unsigned long* header = (unsigned long*)block + 1, word = *header; + fprintf(f, " %s %12lx %7x:%08x %10lx", + block_is_free(block) ? "free":" ", + (long)header, + (int)(word>>32), (int)(word & 0xFFFFFFFF), + block_size(block)+N_WORD_BYTES); + if (block_is_prev_free(block)) + fprintf(f, " %12lx", (long)block->prev_phys_block+N_WORD_BYTES); + putc('\n', f); + if (block_is_last(block)) break; // include the sentinel in the display + block = block_next(block); + } + fprintf(f, "-- end --\n"); + fclose(f); +} From 48d686f9718f98122547a9006c871cfcd50439ab Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 31 Jul 2022 21:38:19 -0400 Subject: [PATCH 3769/4023] Accept that value-cell-value can move to R/O space Fixes lp#1983218 --- src/runtime/stringspace.c | 1 + tests/save1.test.sh | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index ac60556279..f9ad82192e 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -76,6 +76,7 @@ static void visit_pointer_words(lispobj* object, lispobj (*func)(lispobj, uword_ widetag == RATIO_WIDETAG || widetag == COMPLEX_WIDETAG || widetag == SIMPLE_ARRAY_WIDETAG || (widetag >= COMPLEX_BASE_STRING_WIDETAG && widetag <= COMPLEX_ARRAY_WIDETAG) || + widetag == VALUE_CELL_WIDETAG || widetag == WEAK_POINTER_WIDETAG) { int len = object_size(object), i; for (i=1; i<len; ++i) FIX(object[i]); diff --git a/tests/save1.test.sh b/tests/save1.test.sh index 59e6481919..bcf632a02f 100644 --- a/tests/save1.test.sh +++ b/tests/save1.test.sh @@ -23,6 +23,11 @@ run_sbcl <<EOF ;; but maybe someone changed it :immobile, so bind it to be certain. (let (#+immobile-code (sb-c::*compile-to-memory-space* :dynamic)) (defvar *afun* (compile nil '(lambda (x) (- (length x)))))) + ;; test for lp#1983218 - a VALUE-CELL holding a readonly string could crash + (defun mkcell (x) (sb-sys:%primitive sb-vm::make-value-cell x nil)) + (compile 'mkcell) + (defvar *cell* (mkcell (symbol-name '*print-base*))) + ;; (save-lisp-and-die "$tmpcore") EOF run_sbcl_with_core "$tmpcore" --noinform --no-userinit --no-sysinit --noprint \ From aaa1ff57fac6313cf9062665fb5c2d7551e489ee Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 1 Aug 2022 20:33:56 +0300 Subject: [PATCH 3770/4023] Load the WIDETAG once for a series of type tests. e.g. (typecase x (string ..) (array ..)) The VOPs are implemented for arm64. --- src/compiler/arm64/type-vops.lisp | 52 +++++++++++++------ src/compiler/generic/type-vops.lisp | 21 ++++++-- src/compiler/ir2opt.lisp | 77 ++++++++++++++++++++++++++--- 3 files changed, 123 insertions(+), 27 deletions(-) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index 28a2ccfbfa..b090b07fcf 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -65,10 +65,11 @@ (inst cmp temp lowtag) (inst b (if not-p :ne :eq) target))) -(defun %test-headers (value temp target not-p function-p headers +(defun %test-headers (value widetag target not-p function-p headers &key (drop-through (gen-label)) value-tn-ref) - (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag))) + (let ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag)) + (temp widetag)) (flet ((%logical-mask (x) (cond ((encode-logical-immediate x) x) @@ -85,11 +86,15 @@ (values drop-through target) (values target drop-through)) (assemble () - (unless (and value-tn-ref - (eq lowtag other-pointer-lowtag) - (other-pointer-tn-ref-p value-tn-ref)) - (%test-lowtag value temp when-false t lowtag)) - (load-type temp value (- lowtag)) + (cond (widetag + (unless (and value-tn-ref + (eq lowtag other-pointer-lowtag) + (other-pointer-tn-ref-p value-tn-ref)) + (%test-lowtag value widetag when-false t lowtag)) + (load-type widetag value (- lowtag))) + (t + (setf widetag value + temp tmp-tn))) (do ((remaining headers (cdr remaining))) ((null remaining)) (let ((header (car remaining)) @@ -100,13 +105,13 @@ ((and (not last) (null (cddr remaining)) (atom (cadr remaining)) (= (logcount (logxor header (cadr remaining))) 1)) - (inst and temp temp (%logical-mask + (inst and temp widetag (%logical-mask (ldb (byte 8 0) (logeqv header (cadr remaining))))) (inst cmp temp (ldb (byte 8 0) (logand header (cadr remaining)))) (inst b (if not-p :ne :eq) target) (return)) (t - (inst cmp temp header) + (inst cmp widetag header) (if last (inst b (if not-p :ne :eq) target) (inst b :eq when-true))))) @@ -117,7 +122,7 @@ ((and last (not (= start bignum-widetag)) (= (+ start 4) end) (= (logcount (logxor start end)) 1)) - (inst and temp temp (%logical-mask + (inst and temp widetag (%logical-mask (ldb (byte 8 0) (logeqv start end)))) (inst cmp temp (ldb (byte 8 0) (logand start end))) (inst b (if not-p :ne :eq) target)) @@ -127,26 +132,26 @@ (= (+ (caadr remaining) 4) (cdadr remaining)) (= (logcount (logxor (caadr remaining) (cdadr remaining))) 1) (= (logcount (logxor (caadr remaining) start)) 1)) - (inst and temp temp (ldb (byte 8 0) (logeqv start (cdadr remaining)))) + (inst and temp widetag (ldb (byte 8 0) (logeqv start (cdadr remaining)))) (inst cmp temp (ldb (byte 8 0) (logand start (cdadr remaining)))) (inst b (if not-p :ne :eq) target) (return)) ((and last (/= start bignum-widetag) (/= end complex-array-widetag)) - (inst sub temp temp start) + (inst sub temp widetag start) (inst cmp temp (- end start)) (inst b (if not-p :hi :ls) target)) (t (unless (= start bignum-widetag) - (inst cmp temp start) + (inst cmp widetag start) (if (= end complex-array-widetag) (progn (aver last) (inst b (if not-p :lt :ge) target)) (inst b :lt when-false))) (unless (= end complex-array-widetag) - (inst cmp temp end) + (inst cmp widetag end) (if last (inst b (if not-p :gt :le) target) (inst b :le when-true)))))))))) @@ -555,3 +560,22 @@ (:translate single-float-p) (:generator 7 (inst cmp (32-bit-reg value) single-float-widetag))) + +(define-vop (load-other-pointer-widetag) + (:args (value :scs (any-reg descriptor-reg))) + (:args-var args) + (:info not-other-pointer-label) + (:results (r :scs (unsigned-reg))) + (:result-types unsigned-num) + (:generator 1 + (unless (other-pointer-tn-ref-p args) + (inst and r value lowtag-mask) + (inst cmp r other-pointer-lowtag) + (inst b :ne not-other-pointer-label)) + (load-type r value (- other-pointer-lowtag)))) + +(define-vop (test-widetag) + (:args (value :scs (unsigned-reg))) + (:info target not-p type-codes) + (:generator 1 + (%test-headers value nil target not-p nil type-codes))) diff --git a/src/compiler/generic/type-vops.lisp b/src/compiler/generic/type-vops.lisp index 2715e41b18..de99527d94 100644 --- a/src/compiler/generic/type-vops.lisp +++ b/src/compiler/generic/type-vops.lisp @@ -10,6 +10,9 @@ ;;;; files for more information. (in-package "SB-VM") + +(defvar *other-pointer-type-vops* nil) + ;;; We use a default definition of the vop for PRED-NAME only if it was not ;;; already defined by the backend in {arch}/type-vops. DEFINE-VOP has a compile-time ;;; effect of storing the vop name in *BACKEND-PARSED-VOPS*, so it's correct to @@ -24,11 +27,19 @@ (let ((cost (if (> (reduce #'max type-codes :key #'eval) lowtag-limit) 7 4))) - `(define-vop (,pred-name type-predicate) - (:translate ,pred-name) - (:note "defaulted") - (:generator ,cost - (test-type value temp target not-p ,type-codes :value-tn-ref args))))) + `(progn + (define-vop (,pred-name type-predicate) + (:translate ,pred-name) + (:note "defaulted") + (:generator ,cost + (test-type value temp target not-p ,type-codes :value-tn-ref args))) + (let ((type-codes (list ,@type-codes))) + (when (loop for type in type-codes + never (or (< type lowtag-limit) + (memq type +immediate-types+) + (memq type +function-widetags+))) + (setf (getf *other-pointer-type-vops* ',pred-name) + (canonicalize-widetags type-codes))))))) (define-type-vop unbound-marker-p (unbound-marker-widetag)) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 8751dc678a..70c42c6114 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -580,16 +580,19 @@ (delete-vop next)))))))) (defun next-start-vop (block) - (loop for 2block = block then (ir2-block-next 2block) - while (and 2block - (= (length (ir2block-predecessors 2block)) 1)) - when (ir2-block-start-vop 2block) return it)) + (loop thereis (ir2-block-start-vop block) + while (and (= (length (ir2block-predecessors block)) 1) + (setf block (ir2-block-next block))))) (defun branch-destination (branch &optional (true t)) - (destructuring-bind (label not-p flags) (vop-codegen-info branch) - (declare (ignore flags)) + (destructuring-bind (label not-p &rest rest) (vop-codegen-info branch) + (declare (ignore rest)) (if (eq not-p true) - (next-start-vop (ir2-block-next (vop-block branch))) + (if (eq branch (ir2-block-last-vop (vop-block branch))) + (next-start-vop (ir2-block-next (vop-block branch))) + (let ((next (next-vop branch))) + (and (eq (vop-name next) 'branch) + (next-start-vop (gethash (car (vop-codegen-info next)) *2block-info*))))) (next-start-vop (gethash label *2block-info*))))) ;;; Replace (BOUNDP X) + (BRANCH-IF) + {(SYMBOL-VALUE X) | anything} @@ -672,7 +675,8 @@ (when (constant-p y) (let ((move (branch-destination branch-if))) (when (and move - (eq (vop-name move) 'move)) + (eq (vop-name move) 'move) + (singleton-p (ir2block-predecessors (vop-block move)))) (let* ((args (vop-args move)) (from (tn-ref-tn args))) (when (and (constant-p from) @@ -1124,6 +1128,63 @@ (when (not (tn-reads tn)) (delete-vop vop)))) +;;; Load the WIDETAG once for a series of type tests. +(when (vop-existsp :named sb-vm::load-other-pointer-widetag) + (defoptimizer (vop-optimize %other-pointer-subtype-p) (vop) + (when (boundp '*2block-info*) + (let (vops + stop + (value (tn-ref-tn (vop-args vop)))) + ;; CHECK for loops + (labels ((chain (vop) + (let ((next (branch-destination vop nil))) + (cond (next + (push vop vops) + (if (and (singleton-p (ir2block-predecessors (vop-block next))) + (or (getf sb-vm::*other-pointer-type-vops* (vop-name next)) + (eq (vop-name next) '%other-pointer-subtype-p)) + (eq (tn-ref-tn (vop-args next)) value)) + (chain next) + (setf stop (vop-block next)))) + (t + (setf stop (vop-block vop))))))) + (chain vop) + (when (> (length vops) 1) + (let ((widetag (make-normal-tn (primitive-type-or-lose 'sb-vm::unsigned-byte-64))) + (block (vop-block vop))) + (emit-and-insert-vop (vop-node vop) + block + (template-or-lose 'sb-vm::load-other-pointer-widetag) + (reference-tn value nil) + (reference-tn widetag t) + vop + (list (or (ir2-block-%label stop) + (setf (ir2-block-%label stop) (gen-label))))) + (update-block-succ block + (cons stop + (ir2block-successors block))) + (let ((test-vop (template-or-lose 'sb-vm::test-widetag))) + (loop for vop in vops + for info = (vop-codegen-info vop) + for tags = (if (eq (vop-name vop) '%other-pointer-subtype-p) + (third info) + (getf sb-vm::*other-pointer-type-vops* (vop-name vop))) + do + (emit-and-insert-vop (vop-node vop) + (vop-block vop) + test-vop + (reference-tn widetag nil) + nil + vop + (list (first info) (second info) tags)) + (delete-vop vop)))))))) + nil) + + (loop for (vop) on sb-vm::*other-pointer-type-vops* by #'cddr + do + (set-vop-optimizer (template-or-lose vop) + #'vop-optimize-%other-pointer-subtype-p-optimizer))) + (defun very-temporary-p (tn) (let ((writes (tn-writes tn)) (reads (tn-reads tn))) From 3a7ad74525be43de709bd70735c2e629329cf755 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 1 Aug 2022 21:27:57 +0300 Subject: [PATCH 3771/4023] Fix string/= type derivation. When :end is not a constant. Fixes lp#1983284 --- src/compiler/seqtran.lisp | 9 +++++---- tests/string.pure.lisp | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index e7cb2cb837..6a4110322f 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -1118,10 +1118,11 @@ 0) ((constant-lvar-p start) (lvar-value start)))) - (end (or (if (and end - (constant-lvar-p end)) - (lvar-value end)) - length))) + (end (cond ((not end) + length) + ((constant-lvar-p end) + (or (lvar-value end) + length))))) (values start end diff --git a/tests/string.pure.lisp b/tests/string.pure.lisp index f32a33cc0e..a0109a0ab7 100644 --- a/tests/string.pure.lisp +++ b/tests/string.pure.lisp @@ -304,3 +304,18 @@ claim that any particular result from these edge cases constitutes a bug. (the (simple-base-string 2) y)) null) (check (string= (the (simple-array character (1)) x) (the (simple-array character (2)) y)) null))) + +(with-test (:name :string/=-derive-type) + (macrolet + ((check (fun expected) + `(assert + (equal (second + (third + (sb-kernel:%simple-fun-type + (checked-compile '(lambda (x y) + (declare (ignorable x y)) + ,fun))))) + ',expected)))) + (check (string/= (the (simple-string 4) x) + (the (simple-string 1) y) + :start1 1 :end1 * :end2 0) (or (integer 1 1) null)))) From cd6e8273dfc7306b2ad8915eff77309dc1161033 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 1 Aug 2022 18:41:11 -0400 Subject: [PATCH 3772/4023] Fix bug in creating immobile-codeblob-vector Fixes lp#1983248 --- src/runtime/immobile-space.c | 13 ++++++++----- tests/save4.test.sh | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 tests/save4.test.sh diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index f2e035e1f5..af7701c3fe 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1314,11 +1314,14 @@ void prepare_immobile_space_for_save(boolean verbose) PAGE_TYPE_UNBOXED); v->header = SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG; v->length_ = make_fixnum(codeblob_count); - gc_close_region(unboxed_region, PAGE_TYPE_UNBOXED); - // Zero-fill the end of dynamic space since we aready performed zero_all_free_ranges(). - uword_t vector_end = (uword_t)((lispobj*)v + vector_nwords), - aligned_end = ALIGN_UP(vector_end, BACKEND_PAGE_BYTES); - memset((char*)vector_end, 0, aligned_end-vector_end); + // might have used large-object pages, no region + if (unboxed_region->start_addr) { + gc_close_region(unboxed_region, PAGE_TYPE_UNBOXED); + // Zero-fill the end of dynamic space since we aready performed zero_all_free_ranges(). + uword_t vector_end = (uword_t)((lispobj*)v + vector_nwords), + aligned_end = ALIGN_UP(vector_end, BACKEND_PAGE_BYTES); + memset((char*)vector_end, 0, aligned_end-vector_end); + } uint32_t* data = (uint32_t*)v->data; int i = 0; for ( obj = (lispobj*)TEXT_SPACE_START ; obj < text_space_highwatermark ; obj += headerobj_size(obj) ) { diff --git a/tests/save4.test.sh b/tests/save4.test.sh new file mode 100644 index 0000000000..fa885bd255 --- /dev/null +++ b/tests/save4.test.sh @@ -0,0 +1,21 @@ +export TEST_BASEDIR=${TMPDIR:-/tmp} +. ./subr.sh + +use_test_subdirectory + +tmpcore=$TEST_FILESTEM.core + +# test for lp#1983248 - gc_close_region on an unopen region +run_sbcl <<EOF +(defparameter *keepme* (make-array 15500 :fill-pointer 0)) +(let ((s (find-symbol "*COMPILE-TO-MEMORY-SPACE*" "SB-C"))) + (when s + (set s :immobile) + (dotimes (i (array-dimension *keepme* 0)) + (vector-push-extend (compile nil \`(lambda () ,i)) *keepme*)))) +(save-lisp-and-die "$tmpcore") +EOF + +check_status_maybe_lose "LOTS-OF-CODE" $? 0 "(saved OK)" + +exit $EXIT_TEST_WIN From 93fd5cc38a56a46ef9790ec82ed35a2027624d39 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 1 Aug 2022 20:49:34 -0400 Subject: [PATCH 3773/4023] Fixes regression in APROPOS-LIST from stringspace change Use walk_all_spaces so we don't miss static symbols' names. --- src/runtime/stringspace.c | 33 +++++++++++++-------------------- tests/interface.pure.lisp | 4 ++++ 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index f9ad82192e..c071c14d7d 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -119,6 +119,9 @@ static int readonly_unboxed_obj_p(lispobj* obj) return 0; } +// CAUTION: don't think you can use this generally. It can only compute sizes +// of objects that do not change when forwarded. Instances can grow when forwarded +// by gencgc due to adding a stable hash slot. static sword_t careful_object_size(lispobj* obj) { return object_size(forwarding_pointer_p(obj) ? native_pointer(forwarding_pointer_value(obj)) @@ -159,8 +162,14 @@ static void ensure_forwarded(lispobj* obj) set_forwarding_pointer(obj, make_lispobj(copy, OTHER_POINTER_LOWTAG)); } -static inline lispobj* symbol_name_native_ptr(struct symbol* symbol) { - return native_pointer(decode_symbol_name(symbol->name)); +// We have to take the unused arg for function signature compatibility. +// Lambdas in C are so crappy. +static void ensure_symbol_name_forwarded(lispobj* obj, + __attribute__((unused)) uword_t arg) { + if (widetag_of(obj) == SYMBOL_WIDETAG) { + struct symbol* s = (void*)obj; + ensure_forwarded(native_pointer(decode_symbol_name(s->name))); + } } static lispobj follow_ro_fp(lispobj ptr, __attribute__((unused)) uword_t arg) { @@ -220,24 +229,8 @@ void prepare_readonly_space(int purify, int print) // 2. Forward all symbol names so that they're placed contiguously // Could be even more clever and sort lexicographically for determistic core if (print) fprintf(stderr, "purify: forwarding symbol names\n"); - ensure_forwarded(symbol_name_native_ptr((void*)NIL_SYMBOL_SLOTS_START)); -#ifdef LISP_FEATURE_IMMOBILE_SPACE - { - lispobj* where = (lispobj*)FIXEDOBJ_SPACE_START; - lispobj* limit = fixedobj_free_pointer; - for ( ; where < limit ; where += object_size(where) ) - if (widetag_of(where) == SYMBOL_WIDETAG) - ensure_forwarded(symbol_name_native_ptr((struct symbol*)where)); - } -#endif - for ( first = 0; first < next_free_page; first = 1+last ) { - last = contiguous_block_final_page(first); - lispobj* where = (lispobj*)page_address(first); - lispobj* limit = (lispobj*)page_address(last) + page_words_used(last); - for ( ; where < limit ; where += careful_object_size(where) ) - if (widetag_of(where) == SYMBOL_WIDETAG) - ensure_forwarded(symbol_name_native_ptr((struct symbol*)where)); - } + walk_all_spaces(ensure_symbol_name_forwarded, 0); + // Add a random delimiter object between symbol-names and everything else. // APROPOS-LIST uses this to detect the end of the strings. *read_only_space_free_pointer = SIMPLE_VECTOR_WIDETAG; // length 0 diff --git a/tests/interface.pure.lisp b/tests/interface.pure.lisp index b04e36123d..2c61b9a69b 100644 --- a/tests/interface.pure.lisp +++ b/tests/interface.pure.lisp @@ -36,6 +36,10 @@ (search "is not" (write-to-string err :escape nil))))))) +;; Regression from R/O space change +(with-test (:name (apropos-list :smoke-test)) + (assert (plusp (length (apropos-list "required-foreign"))))) + ;;; APROPOS should accept a package designator, not just a package, and ;;; furthermore do the right thing when it gets a package designator. ;;; (bug reported and fixed by Alexey Dejneka sbcl-devel 2001-10-17) From 7f7be000c5973435ead3adec5166341d5ab0cd4f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 1 Aug 2022 20:54:01 -0400 Subject: [PATCH 3774/4023] Change order in which spaces are written to core file Possibly avoids dynamic space relocation on FreeBSD. It seems to add a random number to any addresss you give it, which means that R/O always collided with dynamic. --- src/compiler/generic/genesis.lisp | 7 +++---- src/runtime/bsd-os.c | 1 + src/runtime/save.c | 15 +++++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 0e59f03f5d..ddd5248bac 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3761,10 +3761,9 @@ III. initially undefined function references (alphabetically): ;; Write the Directory entry header. (write-word directory-core-entry-type-code) - (let ((spaces (nconc (list *read-only* *static*) - #+immobile-space - (list *immobile-fixedobj* *immobile-text*) - (list *dynamic*)))) + (let ((spaces `(,*static* + #+immobile-space ,@`(,*immobile-fixedobj* ,*immobile-text*) + ,*dynamic* ,*read-only*))) ;; length = (5 words/space) * N spaces + 2 for header. (write-word (+ (* (length spaces) 5) 2)) (dolist (space spaces) diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 7bdd07bc2a..4c41d3ca50 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -122,6 +122,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int executab int protection; int flags = 0; + // FIXME: This probaby needs to use MAP_TRYFIXED if (attributes & IS_GUARD_PAGE) protection = OS_VM_PROT_NONE; else diff --git a/src/runtime/save.c b/src/runtime/save.c index 92d19c001e..3f6300269b 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -320,12 +320,6 @@ save_to_filehandle(FILE *file, char *filename, lispobj init_function, write_lispobj(/* (word count = N spaces described by 5 words each, plus the * entry type code, plus this count itself) */ (5 * MAX_CORE_SPACE_ID) + 2, file); - output_space(file, - READ_ONLY_CORE_SPACE_ID, - (lispobj *)READ_ONLY_SPACE_START, - read_only_space_free_pointer, - core_start_pos, - core_compression_level); output_space(file, STATIC_CORE_SPACE_ID, (lispobj *)STATIC_SPACE_START, @@ -346,6 +340,15 @@ save_to_filehandle(FILE *file, char *filename, lispobj init_function, (void*)dynamic_space_highwatermark(), core_start_pos, core_compression_level); + /* FreeBSD really doesn't like to give you the address you asked for + * on dynamic space. We have a better chance at satisfying the request + * if we haven't already mapped R/O space below it. */ + output_space(file, + READ_ONLY_CORE_SPACE_ID, + (lispobj *)READ_ONLY_SPACE_START, + read_only_space_free_pointer, + core_start_pos, + core_compression_level); #ifdef LISP_FEATURE_IMMOBILE_SPACE output_space(file, IMMOBILE_FIXEDOBJ_CORE_SPACE_ID, From 20f87ee7a2325ae38261abcbdc8cbd8a12e2b002 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 1 Aug 2022 21:03:09 -0400 Subject: [PATCH 3775/4023] Improve FIND-ALL-SYMBOLS Don't scan inherited symbols. This was about 4x faster in a system having 1000 packages, each using on average 10 other packages, and where many distinct symbols are spelled the same. --- src/code/defpackage.lisp | 60 ++++++++++++++++++++++++------------ src/code/target-package.lisp | 9 ------ 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/code/defpackage.lisp b/src/code/defpackage.lisp index bed2d55acb..4fbd25a42a 100644 --- a/src/code/defpackage.lisp +++ b/src/code/defpackage.lisp @@ -368,24 +368,25 @@ implementation it is ~S." *!default-package-use-list*) but have common elements ~% ~S" (car x) (car y) z)))) -(flet ((designator-to-string (kind designator) - (cond ((and (eq kind 'package) (packagep designator)) - (package-name designator)) ; already simple and basic if possible - (t - (possibly-base-stringize - (cond ((stringp designator) designator) - ((symbolp designator) (symbol-name designator)) - ((characterp designator) (string designator)) - (t (error 'simple-type-error - :datum designator - :expected-type - (if (eq kind 'package) 'package-designator 'string-designator) - :format-control "~S does not designate a ~(~A~)" - :format-arguments (list designator kind))))))))) +(flet ((designator-to-string (designator type format-control) + (possibly-base-stringize + (typecase designator + (string designator) + (symbol (symbol-name designator)) + (character (string designator)) + (t (error 'simple-type-error + :datum designator + :expected-type type + :format-control format-control + :format-arguments (list designator))))))) (defun stringify-string-designator (string-designator) - (designator-to-string 'string string-designator)) + (designator-to-string string-designator 'string-designator + "~S does not designate a string")) (defun stringify-package-designator (package-designator) - (designator-to-string 'package package-designator))) + (if (packagep package-designator) + (package-name package-designator) ; already simple, and base-string when possible + (designator-to-string package-designator 'package-designator + "~S does not designate a package")))) (defun stringify-string-designators (string-designators) (mapcar #'stringify-string-designator string-designators)) @@ -634,6 +635,27 @@ specifies to signal a warning if SWANK package is in variance, and an error othe (when (fboundp symbol) (write-string " (fbound)"))) +(flet ((add-to-bag-if-found (table string length hash result) + (with-symbol ((symbol) table string length hash) + ;; HASH-TABLE degenerates to a list when used by FIND-ALL-SYMBOLS + ;; since homographs have the same SXHASH, so handle either + ;; a hash-table or a cons containing a list. + (if (hash-table-p result) + (setf (gethash symbol result) t) + (pushnew symbol (car result)))))) + +(defun find-all-symbols (string-designator) + "Return a list of all symbols in the system having the specified name." + (let* ((string (truly-the simple-string + (stringify-string-designator string-designator))) + (length (length string)) + (hash (compute-symbol-hash string length)) + (result (list nil))) + (do-packages (p) ; FIXME: should not acquire package-names lock + (add-to-bag-if-found (package-internal-symbols p) string length hash result) + (add-to-bag-if-found (package-external-symbols p) string length hash result)) + (car result))) + (defun apropos-list (string-designator &optional package-designator @@ -701,13 +723,13 @@ specifies to signal a warning if SWANK package is in variance, and an error othe (let* ((hash (the hash-code (car candidate))) (string (the simple-string (cdr candidate))) (length (length string))) - (with-symbol ((symbol) table string length hash) - (setf (gethash symbol result) t))))))) - (dolist (package (list-all-packages)) + (add-to-bag-if-found table string length hash result)))))) + (do-packages (package) ; FIXME: should not acquire package-names lock (find-all-in-table (package-external-symbols package)) (unless external-only (find-all-in-table (package-internal-symbols package))))) (sort (loop for k being each hash-key of result collect k) #'string-lessp)))) +) ; end FLET (defun apropos (string-designator &optional package external-only) "Briefly describe all symbols which contain the specified STRING. diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index ca0657bc20..a2a7c97273 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -1587,15 +1587,6 @@ PACKAGE." (setf (package-%used-by-list p) (remove package (the list (package-%used-by-list p)))))) t))) - -(defun find-all-symbols (string-or-symbol) - "Return a list of all symbols in the system having the specified name." - (let ((string (string string-or-symbol)) - (result ())) - (do-packages (package) - (multiple-value-bind (symbol found) (find-symbol string package) - (when found (pushnew symbol result)))) - result)) ;;;; final initialization From 5f45bdc6cdfeef2844ad330d2d8e99809e38cdc7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 1 Aug 2022 23:08:36 -0400 Subject: [PATCH 3776/4023] Add some flexibility to the build Do not assume that 'cc' is executed in src/runtime. In particular, allow the root of SBCL's source tree to be one or more levels down from where the compiler gets invoked. This places different demands on where autogenerated headers are written to by 1st genesis and where they are read from by make-target-1 (or equivalent). And non-system includes should not use <> syntax (in main.c) --- src/compiler/generic/genesis.lisp | 26 ++++++++++++++++++++++---- src/compiler/generic/late-objdef.lisp | 2 +- src/runtime/main.c | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index ddd5248bac..4ffd4fe87c 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -28,6 +28,24 @@ (in-package "SB-FASL") +;;; Some build systems frown upon excessive use (or any use) of "-I" options +;;; on the C compiler invocation. So depending on the current working directory +;;; when generating headers and when building, the pathname where we produce +;;; headers may differ from the string specified in #include lines. +;;; The :C-HEADER-DIR-NAME keyword to genesis specifies the output path, +;;; and this symbol (which is normally unbound) specifies the #include prefix. +;;; The normal build is done within src/runtime and does not need +;;; anything done to set this. +(defun genesis-header-prefix () + (if (boundp 'cl-user::*genesis-header-prefix*) + (symbol-value 'cl-user::*genesis-header-prefix*) + "genesis")) +;;; By the same reasoning as above, lispobj.h is either in "." or a relative path. +(defun lispobj-dot-h () + (if (boundp 'cl-user::*lispobj-h-namestring*) + (symbol-value 'cl-user::*lispobj-h-namestring*) + "lispobj.h")) + (eval-when (:compile-toplevel :load-toplevel :execute) (use-package "SB-COREFILE")) @@ -3263,9 +3281,9 @@ Legal values for OFFSET are -4, -8, -12, ..." (when (eq operator-name 'symbol) (format stream " lispobj symbol_function(struct symbol* symbol); -#include \"genesis/vector.h\" +#include \"~A/vector.h\" struct vector *symbol_name(struct symbol*);~% -lispobj symbol_package(struct symbol*);~%") +lispobj symbol_package(struct symbol*);~%" (genesis-header-prefix)) (format stream "static inline int symbol_package_id(struct symbol* s) { return ~A; }~%" #+compact-symbol (format nil "s->name >> ~D" sb-impl::symbol-name-bits) #-compact-symbol "fixnum_value(s->package_id)") @@ -3344,14 +3362,14 @@ lispobj symbol_package(struct symbol*);~%") (format t "#ifdef __ASSEMBLER__~2%") (output-asm) (format t "~%#else /* __ASSEMBLER__ */~2%") - (format t "#include \"lispobj.h\"~%") + (format t "#include ~S~%" (lispobj-dot-h)) (output-c) (format t "~%#endif /* __ASSEMBLER__ */~%")))) (defun write-structure-object (dd *standard-output* &optional structname) (flet ((cstring (designator) (c-name (string-downcase designator)))) (format t "#ifndef __ASSEMBLER__~2%") - (format t "#include \"lispobj.h\"~%") + (format t "#include ~S~%" (lispobj-dot-h)) (format t "struct ~A {~%" (or structname (cstring (dd-name dd)))) (format t " lispobj header; // = word_0_~%") ;; "self layout" slots are named '_layout' instead of 'layout' so that diff --git a/src/compiler/generic/late-objdef.lisp b/src/compiler/generic/late-objdef.lisp index 5e129ebbf7..b9d6b61ef1 100644 --- a/src/compiler/generic/late-objdef.lisp +++ b/src/compiler/generic/late-objdef.lisp @@ -128,7 +128,7 @@ #+sb-xc-host (defun write-gc-tables (stream) - (format stream "#include \"lispobj.h\"~%") + (format stream "#include ~S~%" (sb-fasl::lispobj-dot-h)) ;; Compute a bitmask of all specialized vector types, ;; not including array headers, for maybe_adjust_large_object(). (let ((min #xff) (bits 0)) diff --git a/src/runtime/main.c b/src/runtime/main.c index 18c34fe58d..e71c4c3182 100644 --- a/src/runtime/main.c +++ b/src/runtime/main.c @@ -1,4 +1,4 @@ -#include <interr.h> +#include "interr.h" int main(int argc, char *argv[], char *envp[]) { From c321afb15b7308e28117a025972c8a220e7922be Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 1 Aug 2022 23:48:51 -0400 Subject: [PATCH 3777/4023] Remove unused variable --- src/runtime/immobile-space.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index af7701c3fe..4ae949ecfa 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1198,16 +1198,14 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t text_len) page_attributes_valid = 1; // make search_immobile_space() work right return; } - uword_t address = TEXT_SPACE_START; + // coreparse() already set text_space_highwatermark + gc_assert(text_space_highwatermark != 0 /* would be zero if not mmapped yet */ + && text_space_highwatermark <= (lispobj*)(TEXT_SPACE_START + text_len)); gc_assert(PTR_ALIGN_UP(text_space_highwatermark, IMMOBILE_CARD_BYTES) == text_space_highwatermark); - // Don't use text_len because that measures backend pages (32k), - // but we're willing to start in the middle of such a page - // with new code allocation. + // Don't use text_len to compute n_pages because that measures backend pages (32k), + // but we're trying to compute _allocator_ pages. n_pages = ((uword_t)text_space_highwatermark-TEXT_SPACE_START) / IMMOBILE_CARD_BYTES; for (page = 0; page < n_pages ; ++page) text_page_genmask[page] |= 1<<gen; - // coreparse() already set text_space_highwatermark - gc_assert(text_space_highwatermark != 0 /* would be zero if not mmapped yet */ - && text_space_highwatermark <= (lispobj*)(address + text_len)); tlsf_mem_start = text_space_highwatermark; struct vector* v = VECTOR(SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value); gc_assert(widetag_of((lispobj*)v) == SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); From 9de74a0d4d0f1f38db5ae7e891480d8a4b4ad8d9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 2 Aug 2022 14:40:28 -0400 Subject: [PATCH 3778/4023] Add /usr/local/include for freebsd https://wiki.freebsd.org/WarnerLosh/UsrLocal says something about it. Should fix lp#1981112. --- src/runtime/Config.x86-64-freebsd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime/Config.x86-64-freebsd b/src/runtime/Config.x86-64-freebsd index c94591ae5b..0c059c1a65 100644 --- a/src/runtime/Config.x86-64-freebsd +++ b/src/runtime/Config.x86-64-freebsd @@ -15,7 +15,8 @@ include Config.x86-64-bsd # worked fine for most things, but LOAD-FOREIGN & friends require # dlopen() etc., which in turn depend on dynamic linking of the # runtime. -OS_LIBS += -lutil +OS_LIBS += -lutil -L/usr/local/lib +CPPFLAGS += -isystem/usr/local/include # use libthr (1:1 threading). libpthread (m:n threading) does not work. ifdef LISP_FEATURE_SB_THREAD From 76a3c72f7d20156b008c71f6669056e815afada2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 2 Aug 2022 15:52:26 -0400 Subject: [PATCH 3779/4023] Use leaf_obj_widetag_p more --- src/runtime/coalesce.c | 15 ++++++--------- src/runtime/stringspace.c | 9 +++------ src/runtime/traceroot.c | 4 ++-- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/runtime/coalesce.c b/src/runtime/coalesce.c index 738cdc3333..00e5782f32 100644 --- a/src/runtime/coalesce.c +++ b/src/runtime/coalesce.c @@ -153,15 +153,15 @@ static void coalesce_obj(lispobj* where, struct hopscotch_table* ht) static uword_t coalesce_range(lispobj* where, lispobj* limit, uword_t arg) { struct hopscotch_table* ht = (struct hopscotch_table*)arg; - lispobj *next; sword_t nwords, i; - for ( ; where < limit ; where = next ) { + for ( ; where < limit ; where += nwords ) { lispobj word = *where; if (is_header(word)) { int widetag = header_widetag(word); nwords = sizetab[widetag](where); - next = where + nwords; + if (leaf_obj_widetag_p(widetag)) continue; // Ignore this object. + sword_t coalesce_nwords = nwords; if (instanceoid_widetag_p(widetag)) { lispobj layout = layout_of(where); struct bitmap bitmap = get_layout_bitmap(LAYOUT(layout)); @@ -181,18 +181,15 @@ static uword_t coalesce_range(lispobj* where, lispobj* limit, uword_t arg) } #endif case CODE_HEADER_WIDETAG: - nwords = code_header_words((struct code*)where); + coalesce_nwords = code_header_words((struct code*)where); break; - default: - if (leaf_obj_widetag_p(widetag)) - continue; // Ignore this object. } - for(i=1; i<nwords; ++i) + for(i=1; i<coalesce_nwords; ++i) coalesce_obj(where+i, ht); } else { + nwords = 2; coalesce_obj(where+0, ht); coalesce_obj(where+1, ht); - next = where + 2; } } return 0; diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index c071c14d7d..9f4b48e129 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -17,6 +17,7 @@ #include "gc-private.h" #include "gencgc-private.h" #include "forwarding-ptr.h" +#include "genesis/gc-tables.h" #ifdef LISP_FEATURE_DARWIN_JIT @@ -41,6 +42,7 @@ static void visit_pointer_words(lispobj* object, lispobj (*func)(lispobj, uword_ return; } int widetag = widetag_of(object); + if (leaf_obj_widetag_p(widetag)) return; if (instanceoid_widetag_p(widetag)) { lispobj layout = layout_of(object); if (layout) { @@ -72,12 +74,7 @@ static void visit_pointer_words(lispobj* object, lispobj (*func)(lispobj, uword_ int boxedlen = code_header_words((struct code*)object), i; // first 4 slots are header, boxedlen, fixups, debuginfo for (i=2; i<boxedlen; ++i) FIX(object[i]); - } else if (widetag == CLOSURE_WIDETAG || - widetag == RATIO_WIDETAG || widetag == COMPLEX_WIDETAG || - widetag == SIMPLE_ARRAY_WIDETAG || - (widetag >= COMPLEX_BASE_STRING_WIDETAG && widetag <= COMPLEX_ARRAY_WIDETAG) || - widetag == VALUE_CELL_WIDETAG || - widetag == WEAK_POINTER_WIDETAG) { + } else { int len = object_size(object), i; for (i=1; i<len; ++i) FIX(object[i]); } diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index 5ce9812e92..f9abe6cfc5 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -733,6 +733,7 @@ static uword_t build_refs(lispobj* where, lispobj* end, } nwords = scan_limit = headerobj_size2(where, word); int widetag = header_widetag(word); + if (leaf_obj_widetag_p(widetag)) continue; switch (widetag) { case INSTANCE_WIDETAG: case FUNCALLABLE_INSTANCE_WIDETAG: @@ -790,8 +791,7 @@ static uword_t build_refs(lispobj* where, lispobj* end, if (!(other_immediate_lowtag_p(widetag) && LOWTAG_FOR_WIDETAG(widetag))) lose("Unknown widetag %x", widetag); // Skip irrelevant objects. - if (leaf_obj_widetag_p(widetag) || - (widetag == WEAK_POINTER_WIDETAG) || /* do not follow! */ + if ((widetag == WEAK_POINTER_WIDETAG) || /* do not follow! */ // These numeric types contain pointers, but are uninteresting. (widetag == COMPLEX_WIDETAG) || (widetag == RATIO_WIDETAG)) From 9500e00563b2d6dcf711494ee26f3f685b89ca41 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 2 Aug 2022 23:16:53 +0300 Subject: [PATCH 3780/4023] Don't use type-approx-intersection2 in constrain-ref-type. It doesn't work well on instance types, producing wider types. --- src/compiler/constraint.lisp | 19 +++++++++---------- tests/compiler-ir.pure.lisp | 9 +++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/compiler/constraint.lisp b/src/compiler/constraint.lisp index be365509c4..0d0c11ea83 100644 --- a/src/compiler/constraint.lisp +++ b/src/compiler/constraint.lisp @@ -1080,7 +1080,7 @@ (if (member-type-p other) (mapc-member-type-members #'note-not other) (setq not-res (type-union not-res other))) - (setq res (type-approx-intersection2 res other)))) + (setq res (type-intersection res other)))) (array-in-bounds-p (unless (eq (ref-constraints ref) (pushnew con (ref-constraints ref))) @@ -1109,8 +1109,7 @@ (change-ref-leaf ref other) (when (constant-p other) (return))) (t - (setq res (type-approx-intersection2 - res other-type)))))))) + (setq res (type-intersection res other-type)))))))) ((< >) (let* ((greater (eq kind '>)) (greater (if not-p (not greater) greater))) @@ -1125,17 +1124,17 @@ (let ((type (constrain-real-to-integer y greater not-p))) (when type (setf res - (type-approx-intersection2 res type)))))))) + (type-intersection res type)))))))) (= (when (and (numeric-type-p y) (not not-p)) (setf res - (type-approx-intersection2 res - (type-union (make-numeric-type :low (numeric-type-low y) - :high (numeric-type-high y)) - (make-numeric-type :complexp :complex - :low (numeric-type-low y) - :high (numeric-type-high y))))))))))) + (type-intersection res + (type-union (make-numeric-type :low (numeric-type-low y) + :high (numeric-type-high y)) + (make-numeric-type :complexp :complex + :low (numeric-type-low y) + :high (numeric-type-high y))))))))))) (cond ((and (if-p (node-dest ref)) (or (xset-member-p nil not-set) (csubtypep (specifier-type 'null) not-res))) diff --git a/tests/compiler-ir.pure.lisp b/tests/compiler-ir.pure.lisp index e42ce088dd..dd4c307fd6 100644 --- a/tests/compiler-ir.pure.lisp +++ b/tests/compiler-ir.pure.lisp @@ -344,3 +344,12 @@ (list 1)))) (f))))) :key (lambda (x) (combination-fun-source-name x nil)))))) + +(with-test (:name :instance-constraint-intersection) + (assert (not (find 'sb-c::%type-check-error/c + (ir-calls + `(lambda (x) + (typecase x + (stream 2) + (hash-table 1)))) + :key (lambda (x) (combination-fun-source-name x nil)))))) From e574a5bedfc38aac1a6675f4fe1ee7132ef60d75 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 2 Aug 2022 17:26:07 -0400 Subject: [PATCH 3781/4023] Prevent crash to ldb if run-program can't make pipe Fixes lp#1979841 --- src/code/run-program.lisp | 5 +++++ src/runtime/run-program.c | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/code/run-program.lisp b/src/code/run-program.lisp index 19562c1b80..56f3b93218 100644 --- a/src/code/run-program.lisp +++ b/src/code/run-program.lisp @@ -921,6 +921,11 @@ Users Manual for details about the PROCESS structure. (sort (coerce-or-copy preserve-fds '(simple-array (signed-byte #.(alien-size int)) (*))) #'<)))) + (multiple-value-bind (readfd writefd) (sb-unix:unix-pipe) + (if (null readfd) ; writefd = errno when it fails + (file-perror nil writefd "Error creating pipe") + (setf (deref channel 0) readfd + (deref channel 1) writefd))) (with-pinned-objects (preserve-fds) (with-args (args-vec args) (with-system-mutex (*spawn-lock*) diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index 01a9f8123b..ee74273b74 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -241,11 +241,6 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr, sigset_t sset; int failure_code = 2; - channel[0] = -1; - channel[1] = -1; - // Surely we can do better than to lose() - if (pipe(channel)) lose("can't run-program"); - pid = fork(); if (pid) { return pid; From 02bc916fd6e204aeb1d7c66b5b2273506005b453 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 2 Aug 2022 17:47:29 -0400 Subject: [PATCH 3782/4023] Placate clang-tidy --- tlsf-bsd/tlsf/tlsf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tlsf-bsd/tlsf/tlsf.h b/tlsf-bsd/tlsf/tlsf.h index 74a6b566eb..3f6d96c88b 100644 --- a/tlsf-bsd/tlsf/tlsf.h +++ b/tlsf-bsd/tlsf/tlsf.h @@ -51,8 +51,8 @@ pool_t tlsf_add_pool(tlsf_t tlsf, void *mem, size_t bytes); void tlsf_remove_pool(tlsf_t tlsf, pool_t pool); /* malloc/memalign/realloc/free replacements. */ -void *tlsf_malloc(tlsf_t tlsf, size_t bytes); -void *tlsf_memalign(tlsf_t tlsf, size_t align, size_t bytes); +void *tlsf_malloc(tlsf_t tlsf, size_t size); +void *tlsf_memalign(tlsf_t tlsf, size_t align, size_t size); void *tlsf_realloc(tlsf_t tlsf, void *ptr, size_t size); void tlsf_free(tlsf_t tlsf, void *ptr); From 96f0f2612ee69055ad956947cbea9932dd3bccc3 Mon Sep 17 00:00:00 2001 From: Kartik Singh <kssingh@hrl.com> Date: Tue, 2 Aug 2022 18:52:28 -0400 Subject: [PATCH 3783/4023] Remove non-pauseless-threadstart code This is a modified version of Douglas Katzman's commit 869f2acd6217 (Remove non-pauseless-threadstart code), which gets the pauseless-threadstart feature to work on Windows. Since Windows is the last outstanding platform that builds with pauseless-threadstart disabled by default, this commit also removes the pauseless-threadstart feature flag entirely. The original commit was modified so that it applies to 2.2.7 as well as to remove the setup semaphore and to set th->no_tls_value_marker to NO_TLS_VALUE_MARKER in alloc_thread_struct. Note: The original commit was reverted by 15f2ccc55127 (Revert "Remove non-pauseless-threadstart code") due to failing tests. --- contrib/sb-posix/interface.lisp | 2 +- src/code/alien-callback.lisp | 6 +- src/code/save.lisp | 2 +- src/code/target-thread.lisp | 122 ++++++++++---------------------- src/cold/shared.lisp | 4 -- src/runtime/monitor.c | 4 +- src/runtime/thread.c | 71 ++++--------------- tests/make-thread.pure.lisp | 12 ++-- 8 files changed, 60 insertions(+), 163 deletions(-) diff --git a/contrib/sb-posix/interface.lisp b/contrib/sb-posix/interface.lisp index 09be42873a..f938064987 100644 --- a/contrib/sb-posix/interface.lisp +++ b/contrib/sb-posix/interface.lisp @@ -360,7 +360,7 @@ not supported." ;; Dead threads aren't pruned from *ALL-THREADS* until the Pthread join. ;; Do that now so that the forked process has only the main thread ;; in *ALL-THREADS* and nothing in *JOINABLE-THREADS*. - (sb-thread::join-pthread-joinables #'identity) + (sb-thread::%dispose-thread-structs) ;; Threads are added to ALL-THREADS before they have an OS thread, ;; but newborn threads are not exposed in SB-THREAD:LIST-ALL-THREADS. ;; So we need to go lower-level to sense whether any exist. diff --git a/src/code/alien-callback.lisp b/src/code/alien-callback.lisp index cb97f9afc2..0f0ffe930a 100644 --- a/src/code/alien-callback.lisp +++ b/src/code/alien-callback.lisp @@ -326,7 +326,6 @@ function value." #+sb-thread (defun enter-foreign-callback (index return arguments) (let ((thread (init-thread-local-storage (make-foreign-thread)))) - #+pauseless-threadstart (dx-let ((startup-info (vector nil ; trampoline is n/a nil ; cell in *STARTING-THREADS* is n/a #'sb-alien::enter-alien-callback @@ -335,7 +334,4 @@ function value." (copy-primitive-thread-fields thread) (setf (thread-startup-info thread) startup-info) (update-all-threads (thread-primitive-thread thread) thread) - (run)) - #-pauseless-threadstart - (dx-let ((args (list index return arguments))) - (run thread nil #'sb-alien::enter-alien-callback args)))) + (run)))) diff --git a/src/code/save.lisp b/src/code/save.lisp index 8e682e6c79..cf70f5bb3c 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -313,7 +313,7 @@ sufficiently motivated to do lengthy fixes." (let (error) (with-system-mutex (sb-thread::*make-thread-lock*) (finalizer-thread-stop) - #+pauseless-threadstart (sb-thread::join-pthread-joinables #'identity) + (sb-thread::%dispose-thread-structs) (let ((threads (sb-thread:list-all-threads)) (starting (setq sb-thread::*starting-threads* ; ordinarily pruned in MAKE-THREAD diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index ef861bedff..d0035485a2 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -299,7 +299,7 @@ created and old ones may exit at any time." (sb-ext:define-load-time-global *initial-thread* nil) -;;; *JOINABLE-THREADS* is a list of THREAD instances used only if #+pauseless-threadstart +;;; *JOINABLE-THREADS* is a list of THREAD instances. ;;; I had attempted to construct the list using the thread's memory to create cons ;;; cells but that turned out to be flawed- the cells must be freshly heap-allocated, ;;; because ATOMIC-POP is vulnerable to the A/B/A problem if cells are reused. @@ -1486,7 +1486,7 @@ on this semaphore, then N of them is woken up." ;; This AVER failed when I messed up deletion from *STARTING-THREADS*. ;; That in turn caused a failure in GC because a fixnum is not a legal value ;; for the startup info when observed by GC. - #+pauseless-threadstart (aver (not (memq thread *starting-threads*))) + (aver (not (memq thread *starting-threads*))) ;; If collecting allocator metrics, transfer them to the global list ;; so that we can summarize over exited threads. #+allocator-metrics @@ -1529,7 +1529,9 @@ on this semaphore, then N of them is woken up." (when *session* (%delete-thread-from-session thread)) (cond - #+pauseless-threadstart ; If possible, logically remove from *ALL-THREADS* + ;; If possible, logically remove from *ALL-THREADS* by flipping a bit. + ;; Foreign threads remove themselves. They don't have an exit semaphore, + ;; so that's how we know which is which. (sem ;; Tree pruning is the responsibility of thread creators, not dying threads. ;; Creators have to manipulate the tree anyway, and they need access to the old @@ -1539,8 +1541,7 @@ on this semaphore, then N of them is woken up." (aver (eql old 1))) (sb-ext:atomic-push thread *joinable-threads*)) (t ; otherwise, physically remove from *ALL-THREADS* - ;; With #+pauseless-threadstart, this occurs for FOREIGN-THREAD because - ;; the memory allocation/deallocation is handled in C. + ;; The memory allocation/deallocation is handled in C. ;; I would like to combine the recycle bin for foreign and lisp threads though. (delete-from-all-threads (get-lisp-obj-address c-thread)))) (when sem @@ -1756,19 +1757,22 @@ session." ;;;; The beef -#+pauseless-threadstart ; new way -(progn ;;; Return T if the thread was created -(defun pthread-create (thread thread-sap) +(defun os-thread-create (thread thread-sap) (aver (memq thread *starting-threads*)) #+(or arm mips) (bug "This and many other things will crash on MIPS/ARM either until they do linkage tables like everyone else, or until all those things can deal with either way of doing linkage.") + #+win32 + (/= 0 (alien-funcall (extern-alien "create_thread" + (function unsigned system-area-pointer)) + thread-sap)) + #-win32 (let ((attr (foreign-symbol-sap "new_lisp_thread_attr" t)) (c-tramp - (foreign-symbol-sap #+os-thread-stack "new_thread_trampoline_switch_stack" - #-os-thread-stack "new_thread_trampoline"))) + (foreign-symbol-sap #+os-thread-stack "new_thread_trampoline_switch_stack" + #-os-thread-stack "new_thread_trampoline"))) (and (= 0 #+os-thread-stack (alien-funcall (extern-alien "pthread_attr_setstacksize" (function int system-area-pointer unsigned)) @@ -1811,10 +1815,18 @@ session." (setf (thread-startup-info thread) 0) ;; Clean up *ALL-THREADS* (delete-from-all-threads (sap-int c-thread)) - ;; Free the pthread resources - (alien-funcall (extern-alien "pthread_join" (function int unsigned unsigned)) - (thread-os-thread thread) 0) ; no result pointer - (setf (thread-os-thread thread) 0) + ;; Release the OS and/or pthread resources + #+win32 + (with-alien ((wait (function unsigned unsigned unsigned) :extern "WaitForSingleObject") + (close (function int unsigned) :extern "CloseHandle")) + (let ((os-thread (sap-ref-word c-thread + (ash sb-vm::thread-os-thread-slot sb-vm::word-shift)))) + (alien-funcall wait os-thread #xffffffff) + (alien-funcall close os-thread))) + #-win32 + (with-alien ((join (function int unsigned unsigned) :extern "pthread_join")) + (alien-funcall join (thread-os-thread thread) 0) ; no result pointer + (setf (thread-os-thread thread) 0)) (cond (dispose (free-thread-struct c-thread) nil) @@ -1828,9 +1840,9 @@ session." ;;; Heuristic decides when to stop trying to free. Passing in #'IDENTITY means that ;;; all joinables should be processed. Passing in #'CDR or #'CDDR returns early if there ;;; are not at least 1 or 2 threads respectively that could be joined. -(export 'join-pthread-joinables) -(defun join-pthread-joinables (heuristic) - (loop (unless (funcall heuristic *joinable-threads*) (return)) +(export '%dispose-thread-structs) +(defun %dispose-thread-structs (&key (retain 0)) + (loop (unless (nthcdr retain *joinable-threads*) (return)) (let ((item (sb-ext:atomic-pop *joinable-threads*))) (if item (primitive-join item t) (return))))) @@ -1854,12 +1866,11 @@ session." ;; If there is more than 1 more joinable, join all but 1. ;; Two threads could both find > 1 thread to join, and both do ;; a join, leaving 0 to join. That's ok. - (join-pthread-joinables #'cdr) + (%dispose-thread-structs :retain 1) (let ((thread-sap (alien-funcall (extern-alien "alloc_thread_struct" (function system-area-pointer - system-area-pointer unsigned)) - (or reuse (int-sap 0)) - sb-vm:no-tls-value-marker))) + system-area-pointer)) + (or reuse (int-sap 0))))) (when (and (not reuse) (/= (sap-int thread-sap) 0)) ;; these would have been done already if reusing the memory ;; of a completed thread. @@ -1876,8 +1887,8 @@ session." `(defun run () (macrolet ((apply-real-function () '(apply (svref (thread-startup-info *current-thread*) 2) - (prog1 (svref (thread-startup-info *current-thread*) 3) - (setf (thread-startup-info *current-thread*) 0))))) + (prog1 (svref (thread-startup-info *current-thread*) 3) + (setf (thread-startup-info *current-thread*) 0))))) (flet ((unmask-signals () (let ((mask (svref (thread-startup-info *current-thread*) 4))) (if mask @@ -1894,22 +1905,6 @@ session." ;; Signals other than stop-for-GC are masked. The WITH/WITHOUT noise is ;; pure cargo-cultism. (without-interrupts (with-local-interrupts ,@body)))))) -) ; end PROGN - -#-pauseless-threadstart -(defmacro thread-trampoline-defining-macro (&body body) ; OLD WAY - `(defun run (thread setup-sem function arguments) - (macrolet ((unmask-signals () '(sb-unix::unblock-deferrable-signals)) - (apply-real-function () '(apply function arguments))) - (copy-primitive-thread-fields thread) - (update-all-threads (thread-primitive-thread thread) thread) - (sb-ext:atomic-push thread (session-new-enrollees *session*)) - (when setup-sem - (signal-semaphore setup-sem) - ;; setup-sem was dx-allocated, set it to NIL so that the - ;; backtrace doesn't get confused - (setf setup-sem nil)) - ,@body))) ;;; All threads other than the initial thread start via this function. #+sb-thread @@ -2002,7 +1997,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;;; This is the faster variant of RUN-THREAD that does not wait for the new ;;; thread to start executing before returning. -#+pauseless-threadstart (defun start-thread (thread function arguments) (let* ((trampoline (lambda (arg) @@ -2096,7 +2090,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (setf (sap-ref-lispobj thread-sap (ash sb-vm::thread-lisp-thread-slot sb-vm:word-shift)) thread) - (setq created (pthread-create thread thread-sap)) + (setq created (os-thread-create thread thread-sap)) (cond (created ;; Still holding the MAKE-THREAD-LOCK, expose the thread in *all-threads*. ;; In this manner, anyone who acquires the MAKE-THREAD-LOCK can be sure that @@ -2119,49 +2113,6 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (sb-unix::pthread-sigmask sb-unix::SIG_SETMASK saved-sigmask nil)) (if created thread (error "Could not create new OS thread.")))) -#+(and sb-thread (not pauseless-threadstart)) -(defun start-thread (thread function arguments) - (let* ((setup-sem (make-semaphore :name "Thread setup semaphore")) - #+(or win32 darwin freebsd) - (fp-modes (dpb 0 sb-vm:float-sticky-bits ;; clear accrued bits - (sb-vm:floating-point-modes)))) - (declare (dynamic-extent setup-sem)) - (dx-flet ((start-routine () - ;; Inherit parent thread's FP modes - #+(or win32 darwin) - (setf (sb-vm:floating-point-modes) fp-modes) - ;; As it is, this lambda must not cons until we are - ;; ready to run GC. Be careful. - (init-thread-local-storage thread) - ;; I literally don't know what these WITH/WITHOUT wrappings are for, - ;; but tests fail when removed. - ;; It's the body of CALL-WITH-MUTEX omitting the grab and release. - (without-interrupts - (with-local-interrupts - (run thread setup-sem function arguments))))) - ;; Holding mutexes or waiting on sempahores inside WITHOUT-GCING will lock up - (aver (not *gc-inhibit*)) - ;; Keep INITIAL-FUNCTION in the dynamic extent until the child - ;; thread is initialized properly. Wrap the whole thing in - ;; WITHOUT-INTERRUPTS (via WITH-SYSTEM-MUTEX) because we pass - ;; INITIAL-FUNCTION to another thread. - ;; (Does WITHOUT-INTERRUPTS really matter now that it's DXed?) - (dx-flet ((thunk () - (with-alien ((create-thread (function unsigned unsigned unsigned) - :extern "create_thread")) - (with-pinned-objects (thread #'start-routine) - (if (eql (alien-funcall create-thread - (- (get-lisp-obj-address thread) - sb-vm:instance-pointer-lowtag) - (get-lisp-obj-address #'start-routine)) - 0) - (setq thread nil) - (wait-on-semaphore setup-sem)))))) - (if (thread-ephemeral-p thread) - (thunk) - (sb-thread::call-with-system-mutex #'thunk *make-thread-lock*))))) - (or thread (error "Could not create a new thread."))) - (defun join-thread (thread &key (default nil defaultp) timeout) "Suspend current thread until THREAD exits. Return the result values of the thread function. @@ -2195,9 +2146,8 @@ subject to change." ;; First, free up the pthread resources of any thread(s), not necessarily ;; one we're tryinng to join. - #+pauseless-threadstart (when (cddr *joinable-threads*) ; if strictly > 2 are joinable, - (without-interrupts (join-pthread-joinables #'cddr))) + (without-interrupts (%dispose-thread-structs :retain 2))) ;; No result semaphore indicates that there's nothing to wait for- ;; the thread is either a foreign-thread, or finished running. (let* ((semaphore (thread-semaphore thread)) diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index 0299e94214..f4cdde7d6f 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -291,8 +291,6 @@ (pushnew :immobile-code sb-xc:*features*)) (when (target-featurep :64-bit) (push :compact-symbol sb-xc:*features*)) - (when (target-featurep '(:and :sb-thread (:not :win32))) - (push :pauseless-threadstart sb-xc:*features*)) (when (target-featurep '(:and :sb-thread (:or :darwin :openbsd))) (push :os-thread-stack sb-xc:*features*)) (when (target-featurep '(:and :x86 :int4-breakpoints)) @@ -335,8 +333,6 @@ (let ((feature-compatibility-tests '(("(and sb-thread (not gencgc))" ":SB-THREAD requires :GENCGC") - ("(and pauseless-threadstart (not sb-thread))" - ":PAUSELESS-THREADSTART requires :SB-THREAD") ("(and sb-safepoint (not sb-thread))" ":SB-SAFEPOINT requires :SB-THREAD") ("(and sb-thread (not (or riscv ppc ppc64 x86 x86-64 arm64)))" ":SB-THREAD not supported on selected architecture") diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 63d7b3bf7c..3b38565485 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -845,7 +845,7 @@ char *pagetypedesc(int type) extern void gc_allocate_ptes(); extern void recompute_gen_bytes_allocated(); extern void print_generation_stats(); -extern struct thread *alloc_thread_struct(void*,lispobj); +extern struct thread *alloc_thread_struct(void*); int load_gc_crashdump(char* pathname) { @@ -947,7 +947,7 @@ int load_gc_crashdump(char* pathname) fprintf(stderr, "%d threads:\n", (int)preamble.nthreads); int i; for(i=0; i<(int)preamble.nthreads; ++i) { - struct thread* th = alloc_thread_struct(0, 0); + struct thread* th = alloc_thread_struct(0); // Push it on the front th->prev = 0; th->next = threads; diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 016aaab113..0cee88fd6b 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -234,15 +234,15 @@ static int get_nonzero_tid() return tid; } -// Only a single 'attributes' object is used if #+pauseless-threadstart. -// This is ok because creation is synchronized by *MAKE-THREAD-LOCK*. +// Because creation is synchronized by *MAKE-THREAD-LOCK* +// we only need a single 'attributes' object. #if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_WIN32 pthread_attr_t new_lisp_thread_attr; #define init_shared_attr_object() (pthread_attr_init(&new_lisp_thread_attr)==0) #else #define init_shared_attr_object() (1) #endif -struct thread *alloc_thread_struct(void*,lispobj); +struct thread *alloc_thread_struct(void*); #ifdef LISP_FEATURE_WIN32 #define ASSOCIATE_OS_THREAD(thread) \ @@ -330,7 +330,7 @@ void create_main_lisp_thread(lispobj function) { InitializeCriticalSection(&recyclebin_lock); InitializeCriticalSection(&in_gc_lock); #endif - struct thread *th = alloc_thread_struct(0, NO_TLS_VALUE_MARKER); + struct thread *th = alloc_thread_struct(0); if (!th || arch_os_thread_init(th)==0 || !init_shared_attr_object()) lose("can't create initial thread"); th->state_word.sprof_enable = 1; @@ -487,7 +487,6 @@ unregister_thread(struct thread *th, #endif #if defined(LISP_FEATURE_WIN32) - CloseHandle((HANDLE)th->os_thread); int i; for (i = 0; i<NUM_PRIVATE_EVENTS; ++i) CloseHandle(thread_private_events(th,i)); @@ -519,7 +518,6 @@ void* new_thread_trampoline(void* arg) struct thread* th = arg; ASSOCIATE_OS_THREAD(th); -#ifdef LISP_FEATURE_PAUSELESS_THREADSTART #ifdef LISP_FEATURE_SB_SAFEPOINT init_thread_data scribble; // This "scribble" thing is really quite pointless because the original sigset_t @@ -615,20 +613,6 @@ void* new_thread_trampoline(void* arg) // Close the GC region and unlink from all_threads unregister_thread(th, SCRIBBLE); -#else // !PAUSELESS_THREADSTART - - th->os_kernel_tid = get_nonzero_tid(); - init_thread_data scribble; - - lispobj function = th->no_tls_value_marker; - th->no_tls_value_marker = NO_TLS_VALUE_MARKER; - init_new_thread(th, &scribble, - GUARD_CONTROL_STACK|GUARD_BINDING_STACK|GUARD_ALIEN_STACK); - funcall0(function); - unregister_thread(th, &scribble); - free_thread_struct(th); // no recycling of 'struct thread' - -#endif return 0; } @@ -688,7 +672,7 @@ static void attach_os_thread(init_thread_data *scribble) block_deferrable_signals(&scribble->oldset); #endif void* recycled_memory = get_recyclebin_item(); - struct thread *th = alloc_thread_struct(recycled_memory, NO_TLS_VALUE_MARKER); + struct thread *th = alloc_thread_struct(recycled_memory); #ifndef LISP_FEATURE_SB_SAFEPOINT /* new-lisp-thread-trampoline doesn't like when the GC signal is blocked */ @@ -752,6 +736,11 @@ static void attach_os_thread(init_thread_data *scribble) static void detach_os_thread(init_thread_data *scribble) { struct thread *th = get_sb_vm_thread(); + +#if defined(LISP_FEATURE_WIN32) + CloseHandle((HANDLE)th->os_thread); +#endif + #ifdef LISP_FEATURE_DARWIN pthread_setspecific(foreign_thread_ever_lispified, (void*)1); #endif @@ -879,7 +868,7 @@ callback_wrapper_trampoline( */ struct thread * -alloc_thread_struct(void* spaces, lispobj start_routine) { +alloc_thread_struct(void* spaces) { /* May as well allocate all the spaces at once: it saves us from * having to decide what to do if only some of the allocations * succeed. SPACES must be appropriately aligned, since the GC @@ -1086,7 +1075,7 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { # define INITIALIZE_TLS(sym,val) SYMBOL(sym)->value = val #endif #include "genesis/thread-init.inc" - th->no_tls_value_marker = start_routine; + th->no_tls_value_marker = NO_TLS_VALUE_MARKER; #if defined(LISP_FEATURE_WIN32) int i; @@ -1099,54 +1088,20 @@ alloc_thread_struct(void* spaces, lispobj start_routine) { } #ifdef LISP_FEATURE_SB_THREAD #ifdef LISP_FEATURE_WIN32 -/* Allocate a thread structure, call CreateThread(), - * and return 1 for success, 0 for failure */ -uword_t create_thread(struct thread_instance* instance, lispobj start_routine) +uword_t create_thread(struct thread* th) { - struct thread *th; - - /* Must defend against async unwinds. */ - if (read_TLS(INTERRUPTS_ENABLED, get_sb_vm_thread()) != NIL) - lose("create_thread is not safe when interrupts are enabled."); - - /* Assuming that a fresh thread struct has no lisp objects in it, - * linking it to all_threads can be left to the thread itself - * without fear of gc lossage. 'start_routine' violates this - * assumption and must stay pinned until the child starts up. */ - th = alloc_thread_struct(0, start_routine); - if (!th) return 0; - - /* The new thread inherits the restrictive signal mask set here, - * and enables signals again when it is set up properly. */ - sigset_t oldset; - - /* Blocking deferrable signals is enough, no need to block - * SIG_STOP_FOR_GC because the child process is not linked onto - * all_threads until it's ready. */ - block_deferrable_signals(&oldset); unsigned int tid; - // Theoretically you should tell the new thread a signal mask to restore - // after it finishes any uninterruptable setup code, but the way this worked - // on windows is that we passed the mask of blocked signals in the parent - // *after* blocking deferrables. It's immaterial what mask is passed - // because the thread will unblock all deferrables, - // and we don't really have posix signals anyway. struct extra_thread_data *data = thread_extra_data(th); data->blocked_signal_set = deferrable_sigset; - data->pending_signal_set = 0; // It's somewhat customary in the win32 API to start threads as suspended. th->os_thread = _beginthreadex(NULL, thread_control_stack_size, new_thread_trampoline, th, CREATE_SUSPENDED, &tid); boolean success = th->os_thread != 0; if (success) { - instance->uw_primitive_thread = (lispobj)th; th->os_kernel_tid = tid; ResumeThread((HANDLE)th->os_thread); - } else { - free_thread_struct(th); } - thread_sigmask(SIG_SETMASK,&oldset,0); return success; } #endif diff --git a/tests/make-thread.pure.lisp b/tests/make-thread.pure.lisp index 733e5bf161..04017d384a 100644 --- a/tests/make-thread.pure.lisp +++ b/tests/make-thread.pure.lisp @@ -7,10 +7,10 @@ (import 'sb-int::(binding* descriptor-sap)) ;;; Test out-of-memory (or something) that goes wrong in pthread_create -#+pauseless-threadstart ; no SB-THREAD::PTHREAD-CREATE symbol if not +#+sb-thread ; no SB-THREAD::OS-THREAD-CREATE symbol if not (test-util:with-test (:name :failed-thread-creation) ;; This test needs to ensure that nothing is in *ALL-THREADS* to begin with. - (sb-thread::join-pthread-joinables #'identity) + (sb-thread::%dispose-thread-structs) (let ((encapsulation (compile nil '(lambda (realfun thread stack-base) @@ -18,12 +18,12 @@ (funcall realfun thread stack-base) nil)))) (success)) - (sb-int:encapsulate 'sb-thread::pthread-create 'test encapsulation) + (sb-int:encapsulate 'sb-thread::os-thread-create 'test encapsulation) (unwind-protect (handler-case (make-thread #'list :name "thisfails") (error (e) (setq success (search "Could not create new OS thread" (write-to-string e))))) - (sb-int:unencapsulate 'sb-thread::pthread-create 'test)) + (sb-int:unencapsulate 'sb-thread::os-thread-create 'test)) (assert success)) (let ((threads sb-thread::*starting-threads*)) (when (find-if-not #'thread-ephemeral-p threads) @@ -137,7 +137,7 @@ ;;; In fact, assert something stronger: there are no young objects ;;; between the current SP and end of stack. (test-util:with-test (:name :expected-gc-roots - :skipped-on (or :interpreter (not :pauseless-threadstart))) + :skipped-on :interpreter) (let ((list (delete-if (lambda (x) (or (eq x #'actually-get-stack-roots) @@ -155,7 +155,7 @@ ;; lp#1595699 (test-util:with-test (:name :start-thread-in-without-gcing - :skipped-on (not :pauseless-threadstart)) + :skipped-on (not :sb-thread)) (assert (eq (join-thread (without-gcing (make-thread (lambda () 'hi)))) From 7cd6a9a7f6e899c2eb3f0ec17866c026d33f7f47 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 3 Aug 2022 21:01:00 +0300 Subject: [PATCH 3784/4023] Restore -sb-thread. --- src/code/target-thread.lisp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/code/target-thread.lisp b/src/code/target-thread.lisp index d0035485a2..a27f503fa1 100644 --- a/src/code/target-thread.lisp +++ b/src/code/target-thread.lisp @@ -1756,7 +1756,8 @@ session." ;;;; The beef - +#+sb-thread +(progn ;;; Return T if the thread was created (defun os-thread-create (thread thread-sap) (aver (memq thread *starting-threads*)) @@ -1905,7 +1906,7 @@ session." ;; Signals other than stop-for-GC are masked. The WITH/WITHOUT noise is ;; pure cargo-cultism. (without-interrupts (with-local-interrupts ,@body)))))) - +) ; end PROGN ;;; All threads other than the initial thread start via this function. #+sb-thread (thread-trampoline-defining-macro @@ -1997,6 +1998,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." ;;; This is the faster variant of RUN-THREAD that does not wait for the new ;;; thread to start executing before returning. +#+sb-thread (defun start-thread (thread function arguments) (let* ((trampoline (lambda (arg) @@ -2113,6 +2115,7 @@ See also: RETURN-FROM-THREAD, ABORT-THREAD." (sb-unix::pthread-sigmask sb-unix::SIG_SETMASK saved-sigmask nil)) (if created thread (error "Could not create new OS thread.")))) + (defun join-thread (thread &key (default nil defaultp) timeout) "Suspend current thread until THREAD exits. Return the result values of the thread function. @@ -2146,7 +2149,8 @@ subject to change." ;; First, free up the pthread resources of any thread(s), not necessarily ;; one we're tryinng to join. - (when (cddr *joinable-threads*) ; if strictly > 2 are joinable, + #+sb-thread + (when (cddr *joinable-threads*) ; if strictly > 2 are joinable, (without-interrupts (%dispose-thread-structs :retain 2))) ;; No result semaphore indicates that there's nothing to wait for- ;; the thread is either a foreign-thread, or finished running. From 834dda59afdf97d6f5b0a40fd0ccb47d21f9f22a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 3 Aug 2022 21:28:59 +0300 Subject: [PATCH 3785/4023] Skip a test on -sb-thread --- tests/make-thread.pure.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/make-thread.pure.lisp b/tests/make-thread.pure.lisp index 04017d384a..2db2ed7923 100644 --- a/tests/make-thread.pure.lisp +++ b/tests/make-thread.pure.lisp @@ -137,7 +137,7 @@ ;;; In fact, assert something stronger: there are no young objects ;;; between the current SP and end of stack. (test-util:with-test (:name :expected-gc-roots - :skipped-on :interpreter) + :skipped-on (or :interpreter (not :sb-thread))) (let ((list (delete-if (lambda (x) (or (eq x #'actually-get-stack-roots) From 718ba2934475ec5f6fa419b4c7d98f4e4d980072 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 3 Aug 2022 14:54:05 -0400 Subject: [PATCH 3786/4023] Readonlyize more strings --- src/code/format.lisp | 7 ++++--- src/compiler/generic/genesis.lisp | 27 ++++++++++++++------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/code/format.lisp b/src/code/format.lisp index 09b7793987..ce10ee8c57 100644 --- a/src/code/format.lisp +++ b/src/code/format.lisp @@ -327,9 +327,10 @@ `#',(%formatter control-string)) (defun %formatter (control-string &optional (arg-count 0) (need-retval t) - &aux (lambda-name - (possibly-base-stringize - (concatenate 'string "fmt$" control-string)))) + &aux (lambda-name + (logically-readonlyize + (possibly-base-stringize + (concatenate 'string "fmt$" control-string))))) ;; ARG-COUNT is supplied only when the use of this formatter is in a literal ;; call to FORMAT, in which case we can possibly elide &optional parsing. ;; But we can't in general, because FORMATTER may be called by users diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 4ffd4fe87c..80dfd15405 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -858,7 +858,7 @@ (macrolet ((vector-data (vector-descriptor) `(+ (descriptor-byte-offset ,vector-descriptor) (* sb-vm:vector-data-offset sb-vm:n-word-bytes)))) -(defun base-string-to-core (string &optional (gspace *dynamic*)) +(defun base-string-to-core (string) "Copy STRING (which must only contain STANDARD-CHARs) into the cold core and return a descriptor to it." ;; (Remember that the system convention for storage of strings leaves an @@ -867,7 +867,7 @@ core and return a descriptor to it." (des (allocate-vector sb-vm:simple-base-string-widetag ;; add SAETP-N-PAD-ELEMENT length (ceiling (1+ length) sb-vm:n-word-bytes) - gspace)) + *dynamic*)) (mem (descriptor-mem des)) (byte-base (vector-data des))) (dotimes (i length des) ; was prezeroed, so automatically null-terminated @@ -897,6 +897,9 @@ core and return a descriptor to it." (setf (bvref mem (+ base (floor length 8))) byte)) des)))) +;;; I would think that all strings we dump are readonly. Maybe not? +(defun string-literal-to-core (s) (set-readonly (base-string-to-core s))) + ;;; Write the bits of INT to core as if a bignum, i.e. words are ordered from ;;; least to most significant regardless of machine endianness. (defun integer-bits-to-core (int descriptor start nwords) @@ -1122,7 +1125,7 @@ core and return a descriptor to it." (declare (simple-string name)) (let ((symbol (allocate-otherptr gspace size sb-vm:symbol-widetag))) (when core-file-name - (let* ((cold-name (set-readonly (base-string-to-core name *dynamic*))) + (let* ((cold-name (string-literal-to-core name)) (pkg-id (if cold-package (descriptor-fixnum (read-slot cold-package :id)) sb-impl::+package-id-none+)) @@ -1537,17 +1540,15 @@ core and return a descriptor to it." (package-use-list package)))))) (write-slots cold-package :id (make-fixnum-descriptor id) - :%name (set-readonly - (base-string-to-core name)) + :%name (string-literal-to-core name) :%nicknames (list-to-core - (mapcar #'base-string-to-core nicknames)) + (mapcar #'string-literal-to-core nicknames)) :%bits (make-fixnum-descriptor (if (system-package-p name) sb-impl::+initial-package-bits+ 0)) :doc-string (if (and docstring #-sb-doc nil) - (set-readonly - (base-string-to-core docstring)) + (string-literal-to-core docstring) *nil-descriptor*) :%use-list (list-to-core (mapcar (lambda (use) @@ -1759,7 +1760,7 @@ core and return a descriptor to it." ;; Those points aside, gencgc correctly calls scav_symbol() on NIL. (when core-file-name - (let ((name (set-readonly (base-string-to-core "NIL")))) + (let ((name (string-literal-to-core "NIL"))) (write-wordindexed des 0 (make-fixnum-descriptor 0)) ;; The header-word for NIL "as a symbol" contains a length + widetag. (write-wordindexed des 1 (make-other-immediate-descriptor (1- sb-vm:symbol-size) @@ -2339,8 +2340,8 @@ Legal values for OFFSET are -4, -8, -12, ..." ;; Sort by index into linkage table (to-core (sort (%hash-table-alist *cold-foreign-symbol-table*) #'< :key #'cdr) (lambda (pair &aux (key (car pair)) - (sym (set-readonly (base-string-to-core - (if (listp key) (car key) key))))) + (sym (string-literal-to-core + (if (listp key) (car key) key)))) (if (listp key) (cold-list sym) sym)) 'sb-vm::+required-foreign-symbols+) (cold-set (cold-intern '*assembler-routines*) *cold-assembler-obj*) @@ -2534,7 +2535,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (define-cold-fop (fop-base-string (len)) (let ((string (make-string len))) (read-string-as-bytes (fasl-input-stream) string) - (set-readonly (base-string-to-core string)))) + (string-literal-to-core string))) #+sb-unicode (define-cold-fop (fop-character-string (len)) @@ -3954,7 +3955,7 @@ III. initially undefined function references (alphabetically): ;; Cold load. (dolist (file-name object-file-names) - (push (cold-cons :begin-file (base-string-to-core file-name)) + (push (cold-cons :begin-file (string-literal-to-core file-name)) *!cold-toplevels*) (cold-load file-name verbose)) From a0b0594c8c383981746a8e50ddc9dbbbe8a4585c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 3 Aug 2022 17:20:46 -0400 Subject: [PATCH 3787/4023] Fix extremely deceptive indentation I caused it in rev 339539136c by outdenting the WHEN without the TYPECASE. They were both wrongly indented but I made it worse. --- src/pcl/methods.lisp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/pcl/methods.lisp b/src/pcl/methods.lisp index a116046dde..de7c4bd1f4 100644 --- a/src/pcl/methods.lisp +++ b/src/pcl/methods.lisp @@ -1595,13 +1595,12 @@ ;; COMPUTE-DISCRIMINATING-FUNCTION, then (at least for the ;; special cases implemented as of 2006-05-09) any information ;; in the cache is misplaced. - (aver (null dfun-state))) - (typecase dfun-state - (null - (when (eq gf (load-time-value #'compute-applicable-methods t)) - (update-all-c-a-m-gf-info gf)) - (cond - ((eq gf (load-time-value #'slot-value-using-class t)) + (aver (null dfun-state))) + (typecase dfun-state + (null + (when (eq gf (load-time-value #'compute-applicable-methods t)) + (update-all-c-a-m-gf-info gf)) + (cond ((eq gf (load-time-value #'slot-value-using-class t)) (update-slot-value-gf-info gf 'reader) #'slot-value-using-class-dfun) ((eq gf (load-time-value #'(setf slot-value-using-class) t)) @@ -1649,8 +1648,8 @@ (make-final-dfun gf)) (t (make-initial-dfun gf)))) - (function dfun-state) - (cons (car dfun-state)))))) + (function dfun-state) + (cons (car dfun-state)))))) ;;; in general we need to support SBCL's encapsulation for generic ;;; functions: the default implementation of encapsulation changes the From 9738f572fe557465d43ddbb311a290591798e3d9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 3 Aug 2022 23:13:38 -0400 Subject: [PATCH 3788/4023] Fix some new immobile space bugs * a page with no object headers should have 0 generation mask, both in coreparse and after sweeping * correctly zero-fill after the object offset array when saving * and brothertree.h was sensitive to inclusion order --- src/runtime/brothertree.h | 1 + src/runtime/immobile-space.c | 97 ++++++++++++++++++++++++++++++------ src/runtime/verify.inc | 28 ++--------- 3 files changed, 88 insertions(+), 38 deletions(-) diff --git a/src/runtime/brothertree.h b/src/runtime/brothertree.h index 413d27f085..f0cc366336 100644 --- a/src/runtime/brothertree.h +++ b/src/runtime/brothertree.h @@ -1,4 +1,5 @@ #include "lispobj.h" +#include "genesis/config.h" struct binary_node { lispobj header; diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 4ae949ecfa..de91d9b2ba 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -222,16 +222,21 @@ void tlsf_unalloc_codeblob(tlsf_t tlsf, struct code* code) low_page_index_t tlsf_page = ((char*)code - (char*)tlsf_mem_start) >> IMMOBILE_CARD_SHIFT; int offset = (uword_t)code & (IMMOBILE_CARD_BYTES-1); if (offset == tlsf_page_sso[tlsf_page]) { - lispobj* next = (lispobj*)code + code_total_nwords((struct code*)code); + lispobj* next = end; if (*next & block_header_free_bit) { next += code_total_nwords((struct code*)next); gc_assert(!(*next & block_header_free_bit)); // adjacent free blocks can't occur } // If the next used block is on the same page, then it becomes the page scan start // even if it the ending sentinel block (which counts as "used"). - tlsf_page_sso[tlsf_page] = - (((uword_t)next ^ (uword_t)code) >> IMMOBILE_CARD_SHIFT) == 0 - ? (uword_t)next & (IMMOBILE_CARD_BYTES-1) : USHRT_MAX; + if ((((uword_t)next ^ (uword_t)code) >> IMMOBILE_CARD_SHIFT) == 0) { + tlsf_page_sso[tlsf_page] = (uword_t)next & (IMMOBILE_CARD_BYTES-1); + } else { + tlsf_page_sso[tlsf_page] = USHRT_MAX; + // the tlsf_page index is based on tlsf_mem_start, but gemmask[] is based on TEXT_SPACE_START + int text_page = find_text_page_index(code); + text_page_genmask[text_page] = 0; + } } // point to the user data, not the header, when calling free tlsf_free(tlsf, (lispobj*)code + 1); @@ -429,6 +434,7 @@ void enliven_immobile_obj(lispobj *ptr, int rescan) // a native pointer { gc_assert(widetag_of(ptr) != SIMPLE_FUN_WIDETAG); // can't enliven interior pointer + gc_assert(widetag_of(ptr) != FILLER_WIDETAG); gc_assert(immobile_obj_gen_bits(ptr) == from_space); int pointerish = !leaf_obj_widetag_p(widetag_of(ptr)); int bits = (pointerish ? 0 : IMMOBILE_OBJ_VISITED_FLAG); @@ -1202,10 +1208,6 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t text_len) gc_assert(text_space_highwatermark != 0 /* would be zero if not mmapped yet */ && text_space_highwatermark <= (lispobj*)(TEXT_SPACE_START + text_len)); gc_assert(PTR_ALIGN_UP(text_space_highwatermark, IMMOBILE_CARD_BYTES) == text_space_highwatermark); - // Don't use text_len to compute n_pages because that measures backend pages (32k), - // but we're trying to compute _allocator_ pages. - n_pages = ((uword_t)text_space_highwatermark-TEXT_SPACE_START) / IMMOBILE_CARD_BYTES; - for (page = 0; page < n_pages ; ++page) text_page_genmask[page] |= 1<<gen; tlsf_mem_start = text_space_highwatermark; struct vector* v = VECTOR(SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value); gc_assert(widetag_of((lispobj*)v) == SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); @@ -1213,6 +1215,13 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t text_len) if(gencgc_verbose) fprintf(stderr, "pseudostatic codeblob vector is %p\n", v); loaded_codeblob_offsets = (void*)v->data; loaded_codeblob_offsets_len = vector_len(v); + // Don't use text_len to compute n_pages because that measures backend pages (32k), + // but we're trying to compute _allocator_ pages. + n_pages = ((uword_t)text_space_highwatermark-TEXT_SPACE_START) / IMMOBILE_CARD_BYTES; + // Set the generation mask only on pages that contain some object header + // (not merely the interior of an object) + for (page = 0; page < n_pages ; ++page) + if (text_page_scan_start(page)) text_page_genmask[page] |= 1<<gen; // Create a TLSF pool char *tlsf_memory_end = (char*)TEXT_SPACE_START + text_space_size; @@ -1313,13 +1322,12 @@ void prepare_immobile_space_for_save(boolean verbose) v->header = SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG; v->length_ = make_fixnum(codeblob_count); // might have used large-object pages, no region - if (unboxed_region->start_addr) { - gc_close_region(unboxed_region, PAGE_TYPE_UNBOXED); - // Zero-fill the end of dynamic space since we aready performed zero_all_free_ranges(). - uword_t vector_end = (uword_t)((lispobj*)v + vector_nwords), - aligned_end = ALIGN_UP(vector_end, BACKEND_PAGE_BYTES); - memset((char*)vector_end, 0, aligned_end-vector_end); - } + if (unboxed_region->start_addr) gc_close_region(unboxed_region, PAGE_TYPE_UNBOXED); + // Zero-fill the end of dynamic space since we aready performed zero_all_free_ranges(). + // This has to be done whether the vector is on large-object or ordinary pages. + uword_t vector_end = (uword_t)((lispobj*)v + vector_nwords), + aligned_end = ALIGN_UP(vector_end, BACKEND_PAGE_BYTES); + memset((char*)vector_end, 0, aligned_end-vector_end); uint32_t* data = (uint32_t*)v->data; int i = 0; for ( obj = (lispobj*)TEXT_SPACE_START ; obj < text_space_highwatermark ; obj += headerobj_size(obj) ) { @@ -2167,3 +2175,62 @@ static void apply_absolute_fixups(lispobj fixups, struct code* code) } } #endif + +void dump_immobile_fixedobjs(lispobj* where, lispobj* end, FILE*f) +{ + uword_t prev_page_base = 0; + for ( ; where < end ; where += object_size(where) ) { + if (ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES) != prev_page_base) { + low_page_index_t page = find_fixedobj_page_index(where); + fprintf(f, "page @ %p: gens=%x free=%x%s\n", + (void*)ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES), + fixedobj_pages[page].attr.parts.gens_, + fixedobj_pages[page].free_index, + (fixedobj_pages[page].attr.parts.flags & 0x80)?" WP":""); + prev_page_base = ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES); + } + fprintf(f, "%"OBJ_FMTX": %"OBJ_FMTX"\n", (uword_t)where, *where); + } +} + +void dump_immobile_text(lispobj* where, lispobj* end, FILE*f) +{ + int prevpage = -1; + for ( ; where < end ; where += object_size(where) ) { + int page = find_text_page_index(where); + if (page!=prevpage) { + fprintf(f, "page %d @ %p ss=%p%s\n", + page, text_page_address(page), + text_page_scan_start(page), + text_page_touched(page)?"":" WP"); + prevpage = page; + } + fprintf(f, "%p: %lx\n", where, *where); + } +} + +#if 0 + void verify_text_scan_starts() +{ + lispobj* where = (lispobj*)TEXT_SPACE_START; + lispobj* limit = text_space_highwatermark; + int prevpage = -1; + for ( ; where < limit ; where += object_size(where) ) { + if (*where & block_header_free_bit) continue; + int page = find_text_page_index(where); + if (page > prevpage) { // this object had better be the scan start + gc_assert(where == text_page_scan_start(page)); + prevpage = page; + } + } + int page, max; + max = find_text_page_index(text_space_highwatermark); + for (page=0;page<=max;++page) + if (text_page_scan_start(page)==0) { + if (text_page_genmask[page]) { + fprintf(stderr, "wrong genmask on page %d\n", page); + } + gc_assert(text_page_genmask[page]==0); + } +} +#endif diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index a35cc0c948..93b7c1fc87 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -501,26 +501,8 @@ void gc_show_pte(lispobj obj) static int hexdump_counter; -#ifdef LISP_FEATURE_IMMOBILE_SPACE -__attribute__((unused)) static void dump_immobile(lispobj* where, lispobj* end, FILE*f) -{ - uword_t prev_page = 0; - while (where < end) { - if (ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES) != prev_page) { - low_page_index_t page = find_fixedobj_page_index(where); - fprintf(f, " page @ %p: gens=%x free=%x%s\n", - (void*)ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES), - fixedobj_pages[page].attr.parts.gens_, - fixedobj_pages[page].free_index, - (fixedobj_pages[page].attr.parts.flags & 0x80)?" WP":""); - prev_page = ALIGN_DOWN((uword_t)where, IMMOBILE_CARD_BYTES); - } - fprintf(f, "%"OBJ_FMTX": %"OBJ_FMTX"\n", (uword_t)where, *where); - where += object_size(where); - } -} -#endif - +extern void dump_immobile_fixedobjs(lispobj* where, lispobj* end, FILE*f); +extern void dump_immobile_text(lispobj* where, lispobj* end, FILE*f); static int dump_completely_p(lispobj* obj, struct verify_state* state) { int i; @@ -573,9 +555,9 @@ void hexdump_spaces(struct verify_state* state, char *reason) #ifdef LISP_FEATURE_IMMOBILE_SPACE fprintf(f, "Fixedobj space:\n"); - dump_immobile((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, f); - fprintf(f, "Text space:\n"); - dump_immobile((lispobj*)TEXT_SPACE_START, text_space_highwatermark, f); + dump_immobile_fixedobjs((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, f); + fprintf(f, "Text space (tlsf mem @ %p):\n", tlsf_mem_start); + dump_immobile_text((lispobj*)TEXT_SPACE_START, text_space_highwatermark, f); #endif fprintf(f, "Dynamic space:\n"); From 7d810067c69a7bb39cfe3fec8148452ac64268ea Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 4 Aug 2022 11:35:59 -0400 Subject: [PATCH 3789/4023] Skip R/O space scan in apropos-list if saved with :PURIFY NIL While we're at it, remove purify.c as irrelevant. --- src/code/defpackage.lisp | 22 ++++++++++++++-------- src/runtime/GNUmakefile | 2 +- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/code/defpackage.lisp b/src/code/defpackage.lisp index 4fbd25a42a..83ddc865e9 100644 --- a/src/code/defpackage.lisp +++ b/src/code/defpackage.lisp @@ -707,9 +707,20 @@ specifies to signal a warning if SWANK package is in variance, and an error othe (t (return-from done)))) :read-only)) - (let ((result (make-hash-table :test 'eq))) + (let ((result (make-hash-table :test 'eq)) + ;; darwin-jit will never take the purified branch. Readonly space exists, + ;; but contains no symbol names. TUNE-HASHTABLE-SIZES-OF-ALL-PACKAGES knows that + ;; and will never reset a table's MODIFIED flag. However, for all other platforms, + ;; we need to detect if purification happened. + (core-purified-p (sap> sb-vm:*read-only-space-free-pointer* + (sb-sys:int-sap sb-vm:read-only-space-start)))) (flet ((find-all-in-table (table) - (if (package-hashtable-modified table) + (if (and core-purified-p (not (package-hashtable-modified table))) + (dolist (candidate candidates) + (let* ((hash (the hash-code (car candidate))) + (string (the simple-string (cdr candidate))) + (length (length string))) + (add-to-bag-if-found table string length hash result))) (dovector (entry (package-hashtable-cells table)) ;; I would have guessed that GETHASH is faster than SEARCH, but if ;; interposed between SYMBOLP and SEARCH, it slows down this loop. @@ -718,12 +729,7 @@ specifies to signal a warning if SWANK package is in variance, and an error othe ;; instructions executed, for no net reduction in time. (when (and (symbolp entry) (search string (symbol-name entry) :test #'char-equal)) - (setf (gethash entry result) t))) - (dolist (candidate candidates) - (let* ((hash (the hash-code (car candidate))) - (string (the simple-string (cdr candidate))) - (length (length string))) - (add-to-bag-if-found table string length hash result)))))) + (setf (gethash entry result) t)))))) (do-packages (package) ; FIXME: should not acquire package-names lock (find-all-in-table (package-external-symbols package)) (unless external-only diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index a4bd90f4b3..16896319bc 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -74,7 +74,7 @@ COMMON_SRC = alloc.c backtrace.c breakpoint.c coalesce.c coreparse.c \ dynbind.c funcall.c gc-common.c globals.c hopscotch.c \ interr.c interrupt.c largefile.c main.c \ monitor.c murmur_hash.c os-common.c parse.c print.c \ - purify.c regnames.c runtime.c safepoint.c save.c \ + regnames.c runtime.c safepoint.c save.c \ sc-offset.c search.c stringspace.c thread.c time.c \ validate.c var-io.c vars.c wrap.c From a14c6d11832b13b9d1a83bfe29ec4b8d7e9384c7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 4 Aug 2022 12:20:22 -0400 Subject: [PATCH 3790/4023] Put immobile-codeblob-offsets in R/O space Slightly related- alphabetize the #include lines. --- src/runtime/globals.c | 2 + src/runtime/immobile-space.c | 103 +++++++++++++++++++++-------------- src/runtime/stringspace.c | 17 ++++-- 3 files changed, 76 insertions(+), 46 deletions(-) diff --git a/src/runtime/globals.c b/src/runtime/globals.c index 4e76028a7d..ff4f06e380 100644 --- a/src/runtime/globals.c +++ b/src/runtime/globals.c @@ -62,6 +62,8 @@ lispobj *text_space_highwatermark; lispobj *fixedobj_free_pointer; #endif os_vm_address_t anon_dynamic_space_start; +// The end of immobile text mapped from disk, equivalently the starting address +// of new objects handed out by the code allocator. lispobj* tlsf_mem_start; // meaningful only if immobile space #ifndef LISP_FEATURE_GENCGC /* GENCGC has its own way to record trigger */ diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index de91d9b2ba..48032a0d30 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -45,25 +45,27 @@ #define _FORTIFY_SOURCE 0 #endif +#include "brothertree.h" +#include "code.h" +#include "forwarding-ptr.h" #include "gc.h" #include "gc-internal.h" #include "gc-private.h" -#include "genesis/gc-tables.h" #include "genesis/cons.h" -#include "genesis/vector.h" +#include "genesis/gc-tables.h" +#include "genesis/hash-table.h" #include "genesis/layout.h" -#include "forwarding-ptr.h" -#include "pseudo-atomic.h" -#include "var-io.h" +#include "genesis/package.h" +#include "genesis/vector.h" #include "immobile-space.h" -#include "unaligned.h" -#include "code.h" #include "lispstring.h" -#include "tlsf-bsd/tlsf/tlsf.h" +#include "pseudo-atomic.h" #include "search.h" -#include "brothertree.h" +#include "unaligned.h" +#include "var-io.h" #include <stdlib.h> #include <stdio.h> +#include "tlsf-bsd/tlsf/tlsf.h" #define WORDS_PER_PAGE ((int)IMMOBILE_CARD_BYTES/N_WORD_BYTES) #define DOUBLEWORDS_PER_PAGE (WORDS_PER_PAGE/2) @@ -159,7 +161,13 @@ void* tlsf_control; // word as a whole. static const unsigned block_header_free_bit = 1 << 8; static const unsigned block_header_prev_free_bit = 1 << 9; +/* Indicates oversized allocation in a header bit so that we can eliminate + * 2 words of padding when saving a core (not done yet) + * This seems to occur for fewer than .5% of all allocations, + * accounting for under .01% addditional total space used. + * So there's really no need to do anything about it. static const unsigned block_header_oversized = 1 << 10; +*/ #define IMMOBILE_CARD_SHIFT 12 void *tlsf_alloc_codeblob(tlsf_t tlsf, int requested_nwords) @@ -174,9 +182,6 @@ void *tlsf_alloc_codeblob(tlsf_t tlsf, int requested_nwords) assign_widetag(c, CODE_HEADER_WIDETAG); c->boxed_size = c->debug_info = c->fixups = 0; int nwords = code_total_nwords(c); - // Indicate oversized allocation in a header bit so that we can eliminate - // 2 words of padding when saving a core (not done yet) - if (nwords > requested_nwords) c->header |= block_header_oversized; ((lispobj*)c)[nwords-1] = 0; // trailer word with the simple-fun table lispobj* end = (lispobj*)c + nwords; if (end > text_space_highwatermark) text_space_highwatermark = end; @@ -483,8 +488,6 @@ enliven_immobile_obj(lispobj *ptr, int rescan) // a native pointer ++immobile_scav_queue_count; } -// The end of immobile text mapped from disk, equivalently the starting address -// of new objects handed out by the code allocator. static uint32_t* loaded_codeblob_offsets; static int loaded_codeblob_offsets_len; @@ -1211,7 +1214,8 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t text_len) tlsf_mem_start = text_space_highwatermark; struct vector* v = VECTOR(SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value); gc_assert(widetag_of((lispobj*)v) == SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG); - // The vector itself is pseudo-static in dynamic space + // The vector itself is either in R/O space, or pseudo-static in dynamic space + // depending on :PURIFY if(gencgc_verbose) fprintf(stderr, "pseudostatic codeblob vector is %p\n", v); loaded_codeblob_offsets = (void*)v->data; loaded_codeblob_offsets_len = vector_len(v); @@ -1241,6 +1245,18 @@ void immobile_space_coreparse(uword_t fixedobj_len, uword_t text_len) page_attributes_valid = 1; } +void deport_codeblob_offsets_from_heap() +{ + /* This vector is needed for the final GC to compute page scan starts + * but we don't want to preserve it in a lisp space (dynamic or R/O) + * during that GC. + * So replicate it off-heap; it'll get made anew after defrag. */ + int nbytes = sizeof (uint32_t) * loaded_codeblob_offsets_len; + lispobj* vector_copy = malloc(nbytes); + loaded_codeblob_offsets = memcpy(vector_copy, loaded_codeblob_offsets, nbytes); + SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value = NIL; +} + // Change all objects to generation 0 void prepare_immobile_space_for_final_gc() { @@ -1275,18 +1291,21 @@ void prepare_immobile_space_for_final_gc() text_page_genmask[find_text_page_index(obj)] = 1; } } - // The object offset vector needs to be copied out of the heap - // so that it can be freed by GC. - int nbytes = sizeof (uint32_t) * loaded_codeblob_offsets_len; - lispobj* vector_copy = malloc(nbytes); - loaded_codeblob_offsets = memcpy(vector_copy, loaded_codeblob_offsets, nbytes); - - SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value = NIL; SYMBOL(IMMOBILE_CODEBLOB_TREE)->value = NIL; } int* code_component_order; +int compute_codeblob_offsets_nwords(int* pcount) +{ + int count = 0; + lispobj* obj = (lispobj*)TEXT_SPACE_START; + for ( ; obj < text_space_highwatermark ; obj += headerobj_size(obj) ) ++count; + if (pcount) *pcount = count; + int n_data_words = ALIGN_UP(count, 2) >> 1; + return 2 + ALIGN_UP(n_data_words, 2); +} + /* Defragment the immobile space, and then promote all objects to gen6. * 'coreparse' causes all pages in dynamic space to be pseudo-static, but * each immobile object stores its own generation, so this must be done at @@ -1307,27 +1326,33 @@ void prepare_immobile_space_for_save(boolean verbose) obj += object_size(obj); } - int codeblob_count = 0; for ( obj = (lispobj*)TEXT_SPACE_START ; obj < text_space_highwatermark ; obj += headerobj_size(obj) ) { - // *obj &= ~(uword_t)block_header_prev_free_bit; + *obj &= ~(uword_t)block_header_prev_free_bit; assign_generation(obj, PSEUDO_STATIC_GENERATION); - ++codeblob_count; } // Create a vector of code offsets - int n_data_words = ALIGN_UP(codeblob_count, 2) >> 1; - int vector_nwords = 2 + ALIGN_UP(n_data_words, 2); - // FIXME: need to reorder some things so that this gets moved to R/O space - struct vector* v = gc_general_alloc(unboxed_region, vector_nwords<<WORD_SHIFT, - PAGE_TYPE_UNBOXED); + int codeblob_count; + int vector_nwords = compute_codeblob_offsets_nwords(&codeblob_count); + struct vector* v; + if (read_only_space_free_pointer > (lispobj*)READ_ONLY_SPACE_START) { + v = (void*)read_only_space_free_pointer; + read_only_space_free_pointer += vector_nwords; + if (read_only_space_free_pointer > (lispobj*)READ_ONLY_SPACE_END) + lose("Didn't reserve enough R/O space?"); + } else { + v = gc_general_alloc(unboxed_region, vector_nwords<<WORD_SHIFT, + PAGE_TYPE_UNBOXED); + // might have used large-object pages, no region + ensure_region_closed(unboxed_region, PAGE_TYPE_UNBOXED); + // gc_general_alloc generally avoids pre-zeroizing, so ensure zero-fill to the end + // of dynamic space as we've aready performed zero_all_free_ranges(). + uword_t vector_end = (uword_t)((lispobj*)v + vector_nwords), + aligned_end = ALIGN_UP(vector_end, BACKEND_PAGE_BYTES); + memset((char*)vector_end, 0, aligned_end-vector_end); + } v->header = SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG; v->length_ = make_fixnum(codeblob_count); - // might have used large-object pages, no region - if (unboxed_region->start_addr) gc_close_region(unboxed_region, PAGE_TYPE_UNBOXED); - // Zero-fill the end of dynamic space since we aready performed zero_all_free_ranges(). - // This has to be done whether the vector is on large-object or ordinary pages. - uword_t vector_end = (uword_t)((lispobj*)v + vector_nwords), - aligned_end = ALIGN_UP(vector_end, BACKEND_PAGE_BYTES); - memset((char*)vector_end, 0, aligned_end-vector_end); + SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value = make_lispobj(v, OTHER_POINTER_LOWTAG); uint32_t* data = (uint32_t*)v->data; int i = 0; for ( obj = (lispobj*)TEXT_SPACE_START ; obj < text_space_highwatermark ; obj += headerobj_size(obj) ) { @@ -1339,7 +1364,6 @@ void prepare_immobile_space_for_save(boolean verbose) *text_space_highwatermark = make_filler_header(aligned_hwm - text_space_highwatermark); text_space_highwatermark = aligned_hwm; } - SYMBOL(IMMOBILE_CODEBLOB_VECTOR)->value = make_lispobj(v, OTHER_POINTER_LOWTAG); if (verbose) printf("done]\n"); } @@ -1544,7 +1568,6 @@ static void apply_absolute_fixups(lispobj, struct code*); /// It's tricky to try to use the scavtab[] functions for fixing up moved /// objects, because scavenger functions might invoke transport functions. /// The best approach is to do an explicit switch over all object types. -#include "genesis/hash-table.h" static void fixup_space(lispobj* where, size_t n_words) { lispobj* end = where + n_words; @@ -1667,7 +1690,6 @@ static lispobj* get_load_address(lispobj* old) } #if DEFRAGMENT_FIXEDOBJ_SUBSPACE -#include "genesis/package.h" #define N_SYMBOL_KINDS 5 // Return an integer 0..4 telling which block of symbols to relocate 'sym' into. @@ -2098,7 +2120,6 @@ static void defrag_immobile_space(boolean verbose) // Fixup immediate values that encode Lisp object addresses // in immobile space. Process only the absolute fixups. -#include "forwarding-ptr.h" #ifdef LISP_FEATURE_X86_64 static void apply_absolute_fixups(lispobj fixups, struct code* code) { diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index 9f4b48e129..bcfbbd9778 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -9,15 +9,14 @@ * files for more information. */ -#include <stdio.h> -#include <stdlib.h> -#include "sbcl.h" -#include "globals.h" #include "gc-internal.h" #include "gc-private.h" #include "gencgc-private.h" -#include "forwarding-ptr.h" #include "genesis/gc-tables.h" +#include "globals.h" +#include "forwarding-ptr.h" +#include <stdio.h> +#include <stdlib.h> #ifdef LISP_FEATURE_DARWIN_JIT @@ -213,6 +212,10 @@ void prepare_readonly_space(int purify, int print) if ( readonly_unboxed_obj_p(where) ) sum_sizes += nwords; } } +#ifdef LISP_FEATURE_IMMOBILE_SPACE + extern int compute_codeblob_offsets_nwords(int*); + sum_sizes += compute_codeblob_offsets_nwords(NULL); +#endif sum_sizes <<= WORD_SHIFT; if (print) fprintf(stderr, "%d bytes\n", sum_sizes); int string_space_size = ALIGN_UP(sum_sizes, BACKEND_PAGE_BYTES); @@ -267,6 +270,10 @@ void move_rospace_to_dynamic(__attribute__((unused)) int print) { int space_usage = (uword_t)read_only_space_free_pointer - READ_ONLY_SPACE_START; if (!space_usage) return; +#ifdef LISP_FEATURE_IMMOBILE_SPACE + extern void deport_codeblob_offsets_from_heap(); + deport_codeblob_offsets_from_heap(); +#endif lispobj* shadow_base = calloc(space_usage, 1); gc_assert(shadow_base); lispobj* shadow_cursor = shadow_base; From 9d4a172648035acb7a5a5df4b58dad5ecad0cd11 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 4 Aug 2022 14:44:11 -0400 Subject: [PATCH 3791/4023] Malloc the tlsf structure The wired address was just for debugging. --- src/runtime/immobile-space.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 48032a0d30..98cf9e9111 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1138,7 +1138,7 @@ void gc_init_immobile() text_page_genmask = calloc(n_text_pages, 1); // Scav queue is arbitrarily located. immobile_scav_queue = malloc(QCAPACITY * sizeof(lispobj)); - tlsf_control = os_validate(0, (char*)0x90000000, ALIGN_UP(tlsf_size(), 4096), 0, 0); + tlsf_control = malloc(tlsf_size()); tlsf_create(tlsf_control); } From 8f4bf486a0c43ec31cdadca5716aefa13818cbd2 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 4 Aug 2022 21:31:20 +0300 Subject: [PATCH 3792/4023] x86-64: implement load-other-pointer-widetag, test-widetag VOPs. --- src/compiler/x86-64/type-vops.lisp | 36 ++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index b4f40d4997..0e2e4a7225 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -115,7 +115,8 @@ (defun %test-headers (value temp target not-p function-p headers &key except (drop-through (gen-label)) - (compute-temp t) + (load-widetag t) + (compute-temp load-widetag) value-tn-ref) (let* ((lowtag (if function-p fun-pointer-lowtag other-pointer-lowtag)) ;; It is preferable (smaller and faster code) to directly @@ -123,7 +124,8 @@ ;; a register first. Find out if this is possible and set ;; WIDETAG-TN accordingly. If impossible, generate the ;; register load. - (widetag-tn (if (and (null (cdr headers)) + (widetag-tn (if (and load-widetag + (null (cdr headers)) (not except) (or (atom (car headers)) (= (caar headers) bignum-widetag) @@ -144,7 +146,8 @@ (values :ne :a :b drop-through target) (values :e :na :nb target drop-through)) - (cond ((and value-tn-ref + (cond ((not load-widetag)) + ((and value-tn-ref (eq lowtag other-pointer-lowtag) (other-pointer-tn-ref-p value-tn-ref))) ; best case: lowtag is right ((and value-tn-ref @@ -171,7 +174,8 @@ (inst test :byte temp lowtag-mask) (inst jmp :nz when-false))) - (when (eq widetag-tn temp) + (when (and load-widetag + (eq widetag-tn temp)) (inst mov :dword temp (or untagged (ea (- lowtag) value)))) (dolist (widetag except) (inst cmp :byte temp widetag) @@ -885,3 +889,27 @@ (define-vop (>=-fixnum-integer <-fixnum-integer) (:translate) (:variant :le)) + +(define-vop (load-other-pointer-widetag) + (:args (value :scs (any-reg descriptor-reg))) + (:args-var args) + (:info not-other-pointer-label) + (:results (r :scs (unsigned-reg))) + (:result-types unsigned-num) + (:generator 1 + (cond ((other-pointer-tn-ref-p args) + (inst mov :byte r (ea (- other-pointer-lowtag) value))) + (t + (%lea-for-lowtag-test r value other-pointer-lowtag :qword) + (inst test :byte r lowtag-mask) + (inst jmp :nz not-other-pointer-label) + (inst mov :byte r (ea r)))))) + +(define-vop (test-widetag) + (:args (value :scs (unsigned-reg) :target temp)) + (:temporary (:sc unsigned-reg :from (:argument 1)) temp) + (:info target not-p type-codes) + (:generator 1 + (move temp value :dword) + (%test-headers nil temp target not-p nil type-codes + :load-widetag nil))) From 8ff92aab354e9b1f6e74301d9e0a5c86ba9c05c3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 4 Aug 2022 17:28:23 -0400 Subject: [PATCH 3793/4023] Get big-endian C build to not croak TLSF isn't used, but eventually I'd like all the 64-bit architectures to have immobile-space. That time is not now. --- tlsf-bsd/tlsf/tlsf.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tlsf-bsd/tlsf/tlsf.c b/tlsf-bsd/tlsf/tlsf.c index 8658e2133b..83634b2fb8 100644 --- a/tlsf-bsd/tlsf/tlsf.c +++ b/tlsf-bsd/tlsf/tlsf.c @@ -116,16 +116,21 @@ typedef struct block_header_t { /* Points to the previous physical block. */ struct block_header_t *prev_phys_block; -#ifdef LISP_FEATURE_BIG_ENDIAN - // For this word to read as an object header, the size and widetag - // are flipped relative to little-endian. -#error "not done" -#else +#ifdef LISP_FEATURE_LITTLE_ENDIAN unsigned char widetag; unsigned char _flags; // must have at most bits 0, 1, 2 on unsigned char unused; // must be zero unsigned char gen; // low 4 must be 0..5 and bit 0x4 can be on uint32_t _nwords; // including the header +#else + // For this word to read as an object header, the size and widetag + // are flipped relative to little-endian. + // I did not actually test this - I am merely guessing that it's right. + uint32_t _nwords; // including the header + unsigned char gen; // low 4 must be 0..5 and bit 0x4 can be on + unsigned char unused; // must be zero + unsigned char _flags; // must have at most bits 0, 1, 2 on + unsigned char widetag; #endif /* Next and previous free blocks. */ From f7aed25140006ec3d51827af121d3979f39dd363 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 4 Aug 2022 21:39:45 -0400 Subject: [PATCH 3794/4023] Fix fullcgc crash Rev 0e3d1d6b51 which fixed the build failure reported in https://groups.google.com/g/sbcl-devel/c/1oraPq21KnA/m/QT42XSLiCQAJ for ppc64 caused a crash for ppc32 (and other 32-bit configs with LRAs and threads - but there aren't any) I couldn't figure out why it kept working under cross-make for me, but banging my head against the desk sufficiently many times resulted in my recalling that my native-on-native ppc32 build had #+sb-thread. --- src/runtime/fullcgc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 6e832f4be1..09632ed37f 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -150,8 +150,12 @@ static inline sword_t dword_index(uword_t ptr, uword_t base) { static inline lispobj canonical_ptr(lispobj pointer) { #ifdef RETURN_PC_WIDETAG - if (lowtag_of(pointer)==OTHER_POINTER_LOWTAG && widetag_of(native_pointer(pointer)) - == RETURN_PC_WIDETAG) + /* NO_TLS_VALUE is all 1s, and so it might look like it has OTHER_POINTER_LOWTAG + * depending on the architecture (the word size, etc), but there is no memory + * at 0xff...ff so definitely don't call widetag_of - that won't fly! */ + if (lowtag_of(pointer)==OTHER_POINTER_LOWTAG + && pointer != NO_TLS_VALUE_MARKER + && widetag_of(native_pointer(pointer)) == RETURN_PC_WIDETAG) return fun_code_tagged(native_pointer(pointer)); #endif return pointer; From 1a0a291c06559bd727c45d69d73c20c7f09ca21f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 4 Aug 2022 22:04:59 -0400 Subject: [PATCH 3795/4023] Get sparc regression run to stop crashing in parallel-exec Lots of tests fail for not-too-scary reasons such as compiler notes, CLOCK-GETTIME not being a thing, too much consing in assert-no-consing, readlink not working the same as we expect (wtf?) etc, etc. Probably the most interesting one was "unknown SC to SC-CASE" from foreign.test.sh which revealed that SINGLE-FLOAT-BITS doesn't cover all the cases allegedly permitted for its args/results. But without this patch, half the suite failed with C runtime lossage in all sorts of colorful ways. So ... just I can't even. --- tests/parallel-exec.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 6aae708e98..360e6351f3 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -25,7 +25,8 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ --no-userinit --no-sysinit --noprint --disable-debugger $* << EOF (pop *posix-argv*) (require :sb-posix) -(require :sb-sprof) +#-sparc (push :test-sprof *features*) +#+test-sprof (require :sb-sprof) (let ((*evaluator-mode* :compile)) (with-compilation-unit () (load"run-tests"))) #+(and x86-64 linux sb-thread) @@ -182,7 +183,7 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ ;; if exec fails, just exit with a wrong (not 104) status (alien-funcall (extern-alien "_exit" (function (values) int)) 0)) (t - (sb-sprof:start-profiling :sample-interval .001) + #+test-sprof (sb-sprof:start-profiling :sample-interval .001) (setq sb-c::*static-vop-usage-counts* (make-hash-table :synchronized t)) (let ((*features* (cons :parallel-test-runner *features*))) (pure-runner (list (concatenate 'string file ".lisp")) @@ -196,12 +197,12 @@ TEST_DIRECTORY=$junkdir SBCL_HOME=../obj/sbcl-home exec ../src/runtime/sbcl \ (let ((*print-pretty* nil)) (sb-int:dohash ((name count) sb-c::*static-vop-usage-counts*) (format output "~7d \"~s\"~%" count name))))) - (sb-sprof:stop-profiling) + #+test-sprof (sb-sprof:stop-profiling) #+test-aprof (progn (sb-aprof::aprof-stop) (sb-aprof:aprof-show)) (when (member :allocator-metrics sb-impl:+internal-features+) (format t "~2&Allocator histogram:~%") (funcall (intern "PRINT-ALLOCATOR-HISTOGRAM" "SB-THREAD"))) - (sb-sprof:report :type :flat) + #+test-sprof (sb-sprof:report :type :flat) (gc :gen 7) (when (and (not (unexpected-failures)) *delete-logs*) (delete-file mylog)) (exit :code (if (unexpected-failures) 1 104)))))) From 3bfea7ffd3ade33446a10a2486a2d9611e69f6d2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 4 Aug 2022 22:18:36 -0400 Subject: [PATCH 3796/4023] Always define page_words_t as 'unsigned short' And rob 1 bit of that, so it's effectively 15 bits, not 16. Then free up 2 more bits of 'type' for other use as I tried to do in rev 938320b20997 which was reverted. Taking a different bit in the PTE should be fine, and the resulting code looks better for it. --- contrib/sb-introspect/introspect.lisp | 4 +-- src/code/gc.lisp | 11 ++----- src/code/room.lisp | 15 ++++------ src/runtime/gencgc-internal.h | 43 ++++++++++++++++----------- src/runtime/gencgc.c | 13 +------- tests/debug.pure.lisp | 5 ++-- tests/private-cons.impure.lisp | 9 +++--- 7 files changed, 44 insertions(+), 56 deletions(-) diff --git a/contrib/sb-introspect/introspect.lisp b/contrib/sb-introspect/introspect.lisp index 3bbffc3465..565acd1dd8 100644 --- a/contrib/sb-introspect/introspect.lisp +++ b/contrib/sb-introspect/introspect.lisp @@ -829,9 +829,7 @@ Experimental: interface subject to change." (let* ((wp (page-protected-p object)) (index (sb-vm:find-page-index (get-lisp-obj-address object))) - (flags (sb-alien:slot page 'sb-vm::flags)) - (type #+little-endian (ldb (byte 6 0) flags) - #+big-endian (ldb (byte 6 2) flags))) + (type (sb-alien:slot page 'sb-vm::flags))) (list :space space :generation (sb-alien:slot page 'sb-vm::gen) :write-protected wp diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 05e67115e7..9f01f98625 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -483,14 +483,9 @@ statistics are appended to it." ;; but if 64-bit then we have to scale the value. Additionally ;; there is a fallback for when even the scaled value is too big. (sb-vm::start #+64-bit (unsigned 32) #-64-bit signed) - ;; On platforms with small enough GC pages, this field - ;; will be a short. On platforms with larger ones, it'll - ;; be an int. It should probably never be an int. - (sb-vm::words-used (unsigned - #.(if (typep sb-vm::gencgc-page-words '(unsigned-byte 16)) - 16 - 32))) - (sb-vm::flags (unsigned 8)) ; in C this is {type, need_zerofill, pinned} + ;; Caution: The low bit of WORDS-USED* is a flag bit + (sb-vm::words-used* (unsigned 16)) ; (* in the name is a memory aid) + (sb-vm::flags (unsigned 8)) ; this named 'type' in C (sb-vm::gen (signed 8)))) (define-alien-variable ("page_table" sb-vm:page-table) (* (struct sb-vm::page))) (declaim (inline sb-vm:find-page-index)) diff --git a/src/code/room.lisp b/src/code/room.lisp index ca92a7f625..17ee09864a 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -386,7 +386,8 @@ We could try a few things to mitigate this: start-page end-page)) (setq end-page start-page) (loop (setq end-page-bytes-used - (ash (slot (deref page-table end-page) 'words-used) word-shift)) + (ash (ash (slot (deref page-table end-page) 'words-used*) -1) + word-shift)) ;; See 'page_ends_contiguous_block_p' in gencgc.c (when (or (< end-page-bytes-used gencgc-page-bytes) (= (slot (deref page-table (1+ end-page)) 'start) 0)) @@ -400,10 +401,7 @@ We could try a few things to mitigate this: end-page-bytes-used) most-positive-word))))) (when (sap> end start) - ;; The bits in the 6-bit 'type' field have fixed positions, - ;; but the position of the field itself depends on endianness. - (let ((flags (ldb (byte 6 (+ #+big-endian 2)) - (slot (deref page-table start-page) 'flags)))) + (let ((flags (slot (deref page-table start-page) 'flags))) ;; The GEN slot is declared as (SIGNED 8) which does not satisfy the ;; type restriction on the first argument to LOGBITP. ;; Masking it to 3 bits fixes that, and allows using the other 5 bits @@ -1157,8 +1155,8 @@ We could try a few things to mitigate this: (setq page-num next-page seen-filler nil)))))))) (let ((i 0)) (loop while (< i total-pages) - do (let ((type (ldb (byte 2 0) (slot (deref page-table i) 'flags)))) - (if (= type 3) + do (let ((type (slot (deref page-table i) 'flags))) + (if (= (logand type 7) 7) (setq i (dump-page i)) (incf i))))) (let* ((n-pages (count 1 pages)) @@ -1227,8 +1225,7 @@ We could try a few things to mitigate this: ;; gen0 conses on MIXED pages, but even that is not enough- pinned conses ;; will promote but keep their MIXED page type. So don't bother with this. #+use-cons-region - (let* ((flags (slot (deref page-table (find-page-index obj-addr)) 'flags)) - (type (ldb (byte 6 (+ #+big-endian 2)) flags)) + (let* ((type (slot (deref page-table (find-page-index obj-addr)) 'flags)) (ok (if (consp obj) (or (= type #b101) ; PAGE_TYPE_CONS (and (eq (car obj) 0) (eq (cdr obj) 0))) diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 53834408a5..07c520d3db 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -48,15 +48,16 @@ int gencgc_handle_wp_violation(void*, void*); # define CONDENSED_PAGE_TABLE 0 #endif -#if GENCGC_PAGE_WORDS > USHRT_MAX -# if GENCGC_PAGE_WORDS > UINT_MAX +/* One bit of page_words_t is the need_zerofill flag. + * That leaves 15 bits to store page_words_used. This can represent + * a page size of up to 64KiB on 32-bit and 128KiB on 64-bit. + * Note that since the allocation quantum is actually 2 words + * the words_used is always an even number, and so technically + * we could store as "dualwords used" to achieve double the range */ +#if GENCGC_PAGE_WORDS > 32767 # error "GENCGC_PAGE_WORDS unexpectedly large." -# else - typedef unsigned int page_words_t; -# endif -#else - typedef unsigned short page_words_t; #endif +typedef unsigned short page_words_t; /* New objects are allocated to PAGE_TYPE_MIXED or PAGE_TYPE_CONS */ /* If you change these constants, then possibly also change the following @@ -114,14 +115,22 @@ struct page { /* the number of lispwords of this page that are used. This may be less * than the usage at an instant in time for pages within the current - * allocation regions. MUST be 0 for unallocated pages. - */ - page_words_t words_used_; + * allocation regions. The 0th bit of the physical uint16 indicates + * that the page needs to be zero-filled for the next use. + * Let the C compiler figure it out, so we can't get it wrong in C. + * But we need to reverse the order of the packed fields depending on + * endianness so that the Lisp side is easier to understand */ +#ifdef LISP_FEATURE_BIG_ENDIAN + page_words_t words_used_ : 15; + page_words_t need_zerofill : 1; +#else + page_words_t need_zerofill : 1; + page_words_t words_used_ : 15; +#endif // !!! If bit positions are changed, be sure to reflect the changes into // page_extensible_p() as well as ALLOCATION-INFORMATION in sb-introspect // and WALK-DYNAMIC-SPACE. - unsigned char /* * The 4 low bits of 'type' are defined by PAGE_TYPE_x constants. * 0000 free @@ -129,12 +138,12 @@ struct page { * ?010 strictly unboxed data * ?011 mixed boxed/unboxed non-code objects * ?111 code - * The next two bits are SINGLE_OBJECT and OPEN_REGION */ - type :6, - /* Whether the page was used at all. This is the only bit that can - * be 1 on a free page */ - need_zerofill :1, - dontuse :1; + * The next two bits are SINGLE_OBJECT and OPEN_REGION. + * The top two can be used for segregating objects by widetag + * which will important once we have "destructors" to run for a + * for a category of object, such as SYMBOL, hypothetically for + * recycling TLS indices or something like that. */ + unsigned char type; /* the generation that this page belongs to. This should be valid * for all pages that may have objects allocated, even current diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 783e55141d..b4c7ddf4d3 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -220,7 +220,6 @@ static inline void reset_page_flags(page_index_t page) { if (page_table[page].type == PAGE_TYPE_CODE) set_page_need_to_zero(page, 1); #endif page_table[page].type = 0; - page_table[page].dontuse = 0; gc_page_pins[page] = 0; // Why can't the 'gen' get cleared? It caused failures. THIS MAKES NO SENSE!!! // page_table[page].gen = 0; @@ -955,18 +954,8 @@ page_extensible_p(page_index_t index, generation_index_t gen, int type) { && page_table[index].gen == gen && !gc_page_pins[index]; #else - /* Test the three conditions above as a single comparison. - * - * pin -\ - * v vvvvvv -- type - * #b11111111_10111111 - * ^ - * need_zerofill (ignored) - * - * The flags reside at 1 byte prior to 'gen' in the page structure. - */ int attributes_match = - (*(int16_t*)(&page_table[index].gen-1) & 0xFFBF) == ((gen<<8)|type); + *(int16_t*)&page_table[index].type == ((gen<<8)|type); #endif #ifdef LISP_FEATURE_SOFT_CARD_MARKS return attributes_match && page_cards_all_marked_nonsticky(index); diff --git a/tests/debug.pure.lisp b/tests/debug.pure.lisp index 1f8db58cb3..9d20bfdaeb 100644 --- a/tests/debug.pure.lisp +++ b/tests/debug.pure.lisp @@ -41,9 +41,8 @@ (declare (ignore widetag)) (let* ((index (sb-vm::find-page-index (sb-kernel:get-lisp-obj-address obj))) - (type (ldb (byte 6 (+ #+big-endian 2)) - (sb-alien:slot (sb-alien:deref sb-vm::page-table index) - 'sb-vm::flags)))) + (type (sb-alien:slot (sb-alien:deref sb-vm::page-table index) + 'sb-vm::flags))) ;; mask off the SINGLE_OBJECT and OPEN_REGION bits (when (and (eq (logand type 7) 2) ; PAGE_TYPE_BOXED ;; Cons cells on boxed pags are page filler diff --git a/tests/private-cons.impure.lisp b/tests/private-cons.impure.lisp index ea48445d31..2ed61db437 100644 --- a/tests/private-cons.impure.lisp +++ b/tests/private-cons.impure.lisp @@ -33,9 +33,10 @@ #+gencgc (progn +(defun page-words-used (index) + (ash (slot (deref sb-vm::page-table index) 'sb-vm::words-used*) -1)) (defun page-need-to-zero (index) - (logbitp #+little-endian 6 #+big-endian 1 - (slot (deref sb-vm::page-table index) 'sb-vm::flags))) + (oddp (slot (deref sb-vm::page-table index) 'sb-vm::words-used*))) (defun test-private-consing () (let ((conses-per-page ; subtract one for the page header cons (1- (/ sb-vm:gencgc-page-bytes (* 2 sb-vm:n-word-bytes)))) @@ -51,7 +52,7 @@ (push index pages) (assert (= cons (+ base-address (* 2 sb-vm:n-word-bytes)))) ;; words-used should be 4, for 2 conses, - (assert (= (slot (deref sb-vm::page-table index) 'sb-vm::words-used) 4)) + (assert (= (page-words-used index) 4)) (dotimes (i (1- conses-per-page)) (setq final (private-list (incf counter)))) (assert (= final (+ base-address sb-vm:gencgc-page-bytes @@ -70,7 +71,7 @@ ;; Each of the pages should have zero words used and need-to-zero = 1 (dolist (index pages) (assert (page-need-to-zero index)) - (assert (= (slot (deref sb-vm::page-table index) 'sb-vm::words-used) 0)))))) + (assert (= (page-words-used index) 0)))))) #-gencgc (defun test-private-consing () From 45fa5691bf8ec5e92be444a7894fd2361789caa5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 5 Aug 2022 16:27:01 +0300 Subject: [PATCH 3797/4023] Allow a TN to be used more than once in :more. When the number of more arguments overflow local-tn-limit they are assigned the same number. Avoid doing that twice for a duplicate TN. Reported by Qian Yun. --- src/compiler/life.lisp | 61 ++++++++++++++++---------------------- tests/compiler-2.pure.lisp | 14 +++++++++ 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/compiler/life.lisp b/src/compiler/life.lisp index 2d6d1dbb8f..6766a26ec4 100644 --- a/src/compiler/life.lisp +++ b/src/compiler/life.lisp @@ -305,20 +305,11 @@ ((null op)) (let ((tn (tn-ref-tn op))) (unless (member (tn-kind tn) '(:unused :constant)) - (assert - (flet ((frob (refs) - (do ((ref refs (tn-ref-next ref))) - ((null ref) t) - (when (and (eq (vop-block (tn-ref-vop ref)) block) - (not (eq ref op))) - (return nil))))) - (and (frob (tn-reads tn)) (frob (tn-writes tn)))) - () "More operand ~S used more than once in its VOP." op) - (aver (not (find-in #'global-conflicts-next-blockwise tn - (ir2-block-global-tns block) - :key #'global-conflicts-tn))) - - (add-global-conflict :read-only tn block num) + ;; A TN could be used more than once in :more. + (unless (find-in #'global-conflicts-next-blockwise tn + (ir2-block-global-tns block) + :key #'global-conflicts-tn) + (add-global-conflict :read-only tn block num)) (setf (tn-local tn) block) (setf (tn-local-number tn) num))))) (values)) @@ -363,27 +354,27 @@ (clear-lifetime-info 2block) (cond - ((vop-next lose) - (aver (not (eq last-lose lose))) - (let ((new (split-ir2-blocks 2block lose (incf counter)))) - (aver (not (find-local-references new))) - (init-global-conflict-kind new))) - (t - (aver (not (eq lose coalesced))) - (setq coalesced lose) - (event coalesce-more-ltn-numbers (vop-node lose)) - (let ((info (vop-info lose)) - (new (if (vop-prev lose) - (split-ir2-blocks 2block (vop-prev lose) - (incf counter)) - 2block))) - (coalesce-more-ltn-numbers new (vop-args lose) - (vop-info-arg-types info)) - (coalesce-more-ltn-numbers new (vop-results lose) - (vop-info-result-types info)) - (let ((lose (find-local-references new))) - (aver (not lose))) - (init-global-conflict-kind new)))))))) + ((vop-next lose) + (aver (not (eq last-lose lose))) + (let ((new (split-ir2-blocks 2block lose (incf counter)))) + (aver (not (find-local-references new))) + (init-global-conflict-kind new))) + (t + (aver (not (eq lose coalesced))) + (setq coalesced lose) + (event coalesce-more-ltn-numbers (vop-node lose)) + (let ((info (vop-info lose)) + (new (if (vop-prev lose) + (split-ir2-blocks 2block (vop-prev lose) + (incf counter)) + 2block))) + (coalesce-more-ltn-numbers new (vop-args lose) + (vop-info-arg-types info)) + (coalesce-more-ltn-numbers new (vop-results lose) + (vop-info-result-types info)) + (let ((lose (find-local-references new))) + (aver (not lose))) + (init-global-conflict-kind new)))))))) (values)) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index b0a9b2149e..4133cdd62a 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3709,3 +3709,17 @@ (f a))) ((() 1) 1) (('(2) 1) 2))) + +(with-test (:name :duplicate-more-local-tn-overflow) + (let ((vars (loop repeat 200 collect (gensym))) + (args (loop repeat 201 for i from (random 30000) + collect i))) + (assert + (equal + (apply + (compile + () + `(lambda (a ,@vars) + (list a a ,@vars))) + args) + (cons (car args) args))))) From f42dc7073ec7620482dfde0c2457fa6a8b3bacb6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 5 Aug 2022 22:58:54 -0400 Subject: [PATCH 3798/4023] Be less parsimonious with memory for fullcgc bitmap Fixes a "buffer overrun" error --- src/runtime/fullcgc.c | 12 +++++++++++- tests/finalize.test.sh | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/finalize.test.sh diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 09632ed37f..f077792b53 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -403,7 +403,17 @@ void prepare_for_full_mark_phase() scav_queue.recycler = 0; block->next = 0; block->tail = block->count = 0; - sword_t nbits_dynamic = (next_free_page*GENCGC_PAGE_BYTES) / (2*N_WORD_BYTES); + /* Consume as many bits as cover the entire dynamic space regardless + * of its current usage. Same for the other spaces. + * This previously tried to be clever about using only as many bits for + * dynamic space as correspond to the current high water mark, which was + * an ill-conceived idea, because cull_weak_hash_tables() can consume + * dynamic space when processing finalizers. So it marks an object live, + * but that object's mark bit could be past the reserved range of dynamic + * space mark bits, thus accidentally marking some _other_ thing live. + * And heaven forbid that other object isn't supposed to be live, + * you're in for a heap of trouble (pun intended) */ + sword_t nbits_dynamic = dynamic_space_size / (2*N_WORD_BYTES); #ifdef LISP_FEATURE_IMMOBILE_SPACE sword_t nbits_fixedobj = FIXEDOBJ_SPACE_SIZE / (2*N_WORD_BYTES); sword_t nbits_text = TEXT_SPACE_SIZE / (2*N_WORD_BYTES); diff --git a/tests/finalize.test.sh b/tests/finalize.test.sh new file mode 100644 index 0000000000..46afb7a0d8 --- /dev/null +++ b/tests/finalize.test.sh @@ -0,0 +1,25 @@ +. ./subr.sh + +# This was failing with: +# Verify after GC(6) [immobile] +# Ptr 0x1001100c9f @ 503c1028 (lispobj 503c1003,pg-1) sees junk +# Ptr 0x1001100ebf @ 503c10a8 (lispobj 503c1083,pg-1) sees junk +# Ptr 0x100110102f @ 503c1128 (lispobj 503c1103,pg-1) sees junk +# ... +run_sbcl <<EOF + (setf (extern-alien "verify_gens" char) 0) + ;; simple-streams causes invalidation of many layouts + ;; that are at low addresses, like for FUNDAMENTAL-STREAM + (require :sb-simple-streams) + (defun foo () + ;; we need a *lot* of finalizers for cull_weak_hash_tables + ;; to use up so much dynamic space that the mark bit + ;; calculation would go wrong + (dotimes (i 50000) + (finalize (cons i i) (lambda ())))) + (compile 'foo) + (foo) + (gc :gen 7) +EOF + +exit $EXIT_TEST_WIN From bf62e40823ac329acea1efd87073b78fcf51d683 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 6 Aug 2022 01:39:13 -0400 Subject: [PATCH 3799/4023] Simplify error test --- src/runtime/coreparse.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index f02f7ac1da..d6b73f8ecc 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -799,17 +799,11 @@ process_directory(int count, struct ndir_entry *entry, // We'd like to enforce proper alignment of 'addr' but there's // a problem: dynamic space has a stricter requirement (usually 32K) // than code space (4K). So don't assert the alignment. - if (enforce_address) { - int fail; - if ((fail = (addr != spaces[id].base)) != 0) - fprintf(stderr, "in core: %p; in runtime: %p\n", - (void*)addr, (void*)spaces[id].base); - char *names[] = { - "DYNAMIC", "STATIC", "READ_ONLY", "IMMOBILE", "IMMOBILE" - }; - if (fail) - lose("core/runtime address mismatch: %s_SPACE_START", names[id-1]); - } + if (enforce_address && addr != spaces[id].base) + lose("core address mismatch: %s_SPACE_START=%p but runtime expects %p\n", + id==READ_ONLY_CORE_SPACE_ID?"READ_ONLY":"STATIC", + (void*)addr, (void*)spaces[id].base); + spaces[id].base = addr; uword_t len = os_vm_page_size * entry->page_count; if (id == DYNAMIC_CORE_SPACE_ID && len > dynamic_space_size) { From e393bb57bf4f3a4f01b10a25a28d94d8d7faf28b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 6 Aug 2022 12:06:53 -0400 Subject: [PATCH 3800/4023] Fix type conflict --- src/code/x86-64-vm.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index fae363a521..b4a6cf359e 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -209,7 +209,9 @@ (progn (defconstant trampoline-entry-offset n-word-bytes) (defun make-simplifying-trampoline (fun) - (let ((code (truly-the (values code-component &optional) + ;; 'alloc' is compiled after this file so we don't see the derived type. + ;; But slam found a conflict on recompile. + (let ((code (truly-the (values code-component (integer 0) &optional) (allocate-code-object :dynamic 3 24)))) ; KLUDGE (setf (%code-debug-info code) fun) (let ((sap (sap+ (code-instructions code) trampoline-entry-offset)) From b3555da9d67be9ab6db12beed797d91b9264fbcf Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 6 Aug 2022 17:19:07 -0400 Subject: [PATCH 3801/4023] Mostly forbid duplicate DEFUNs in genesis I don't know why rev 3bdd4d28ed took out the lines (unless (cold-null (cold-fdefn-fun fdefn)) (error "Duplicate DEFUN for ~S" warm-name)) from COLD-FSET, but it did, and of course in the interim there was backsliding such that there is now a duplicate. And lexical vars named DEFN and FDEFN are too confusing to co-exist in the same function, so fix that. --- src/compiler/generic/genesis.lisp | 18 +++++++++++++----- src/compiler/x86-64/cell.lisp | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 80dfd15405..70d74be370 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2127,24 +2127,32 @@ core and return a descriptor to it." (- sb-vm:fun-pointer-lowtag) (ash sb-vm:simple-fun-insts-offset sb-vm:word-shift))) -(defun cold-fset (name defn) - (aver (= (logand (read-bits-wordindexed defn 0) sb-vm:widetag-mask) +(defun cold-fset (name function) + (aver (= (logand (read-bits-wordindexed function 0) sb-vm:widetag-mask) sb-vm:simple-fun-widetag)) (let ((fdefn (ensure-cold-fdefn ;; (SETF f) was descriptorized when dumped, symbols were not. (if (symbolp name) (cold-intern name) name)))) - (write-wordindexed fdefn sb-vm:fdefn-fun-slot defn) + (let ((existing (read-wordindexed fdefn sb-vm:fdefn-fun-slot))) + (unless (or (cold-null existing) (descriptor= existing function)) + (funcall (if (eq name 'sb-impl::equal-hash) ; KLUDGE + 'warn + 'error) + "Function multiply defined: ~S. Was ~x is ~x" name + (descriptor-bits existing) + (descriptor-bits function)))) + (write-wordindexed fdefn sb-vm:fdefn-fun-slot function) #+x86-64 (write-wordindexed/raw ; write a JMP instruction into the header fdefn 0 (dpb #x1025FF (byte 24 16) (read-bits-wordindexed fdefn 0))) (write-wordindexed/raw fdefn sb-vm:fdefn-raw-addr-slot (or #+(or sparc arm riscv) ; raw addr is the function descriptor - (descriptor-bits defn) + (descriptor-bits function) ;; For all others raw addr is the starting address - (+ (logandc2 (descriptor-bits defn) sb-vm:lowtag-mask) + (+ (logandc2 (descriptor-bits function) sb-vm:lowtag-mask) (ash sb-vm:simple-fun-insts-offset sb-vm:word-shift)))) fdefn)) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index dd13ecea58..85289f8d1c 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -512,6 +512,8 @@ ;;;; fdefinition (FDEFN) objects +;;; IR2-CONVERT-GLOBAL-VAR makes direct use of this vop by name, +;;; so even though it has a :ref-trans in objdef, we also need the vop. (define-vop (fdefn-fun cell-ref) ; /pfw - alpha (:variant fdefn-fun-slot other-pointer-lowtag)) From 4ca284479223dfd0e4da52d4a985ed1d1da3c30c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 7 Aug 2022 01:08:34 -0400 Subject: [PATCH 3802/4023] Always deport codeblob offsets from heap before final GC Can't depend on whether R/O space is used. I think it was surviving by an extreme degree of luck. --- src/runtime/immobile-space.c | 1 + src/runtime/stringspace.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 98cf9e9111..51a3f6a615 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1264,6 +1264,7 @@ void prepare_immobile_space_for_final_gc() char* page_base; char* page_end = (char*)fixedobj_free_pointer; + gc_assert(!gc_managed_heap_space_p((lispobj)loaded_codeblob_offsets)); for (page = 0, page_base = fixedobj_page_address(page) ; page_base < page_end ; page_base += IMMOBILE_CARD_BYTES, ++page) { diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index bcfbbd9778..b60ee246b3 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -268,12 +268,12 @@ static void undo_rospace_ptrs(lispobj* obj, uword_t arg) { void move_rospace_to_dynamic(__attribute__((unused)) int print) { - int space_usage = (uword_t)read_only_space_free_pointer - READ_ONLY_SPACE_START; - if (!space_usage) return; #ifdef LISP_FEATURE_IMMOBILE_SPACE extern void deport_codeblob_offsets_from_heap(); deport_codeblob_offsets_from_heap(); #endif + int space_usage = (uword_t)read_only_space_free_pointer - READ_ONLY_SPACE_START; + if (!space_usage) return; lispobj* shadow_base = calloc(space_usage, 1); gc_assert(shadow_base); lispobj* shadow_cursor = shadow_base; From 75a9f0dc55db87258a4cbafe6b8439709e306258 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 7 Aug 2022 02:35:43 -0400 Subject: [PATCH 3803/4023] Remove x86-darwin files As promised in rev 7bd2ec99c78875 --- src/runtime/Config.x86-darwin | 47 --- src/runtime/x86-darwin-os.c | 529 ---------------------------------- src/runtime/x86-darwin-os.h | 69 ----- 3 files changed, 645 deletions(-) delete mode 100644 src/runtime/Config.x86-darwin delete mode 100644 src/runtime/x86-darwin-os.c delete mode 100644 src/runtime/x86-darwin-os.h diff --git a/src/runtime/Config.x86-darwin b/src/runtime/Config.x86-darwin deleted file mode 100644 index 7978c53fc4..0000000000 --- a/src/runtime/Config.x86-darwin +++ /dev/null @@ -1,47 +0,0 @@ -# -*- makefile -*- for the C-level run-time support for SBCL - -# This software is part of the SBCL system. See the README file for -# more information. -# -# This software is derived from the CMU CL system, which was -# written at Carnegie Mellon University and released into the -# public domain. The software is in the public domain and is -# provided with absolutely no warranty. See the COPYING and CREDITS -# files for more information. - -CFLAGS += -arch i386 -g -Wall -fdollars-in-identifiers -fno-omit-frame-pointer - -LINKFLAGS += -arch i386 -ifdef SBCL_MACOSX_VERSION_MIN - CFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN) - LINKFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN) -else - ifdef LISP_FEATURE_DARWIN9_OR_BETTER - CFLAGS += -mmacosx-version-min=10.5 - LINKFLAGS += -mmacosx-version-min=10.5 - else - CFLAGS += -mmacosx-version-min=10.4 - LINKFLAGS += -mmacosx-version-min=10.4 - endif -endif - -OS_SRC = bsd-os.c x86-bsd-os.c darwin-os.c x86-darwin-os.c - -OS_LIBS = -lSystem -lc -ldl -ifdef LISP_FEATURE_SB_THREAD - OS_LIBS += -lpthread -endif -ifdef LISP_FEATURE_SB_CORE_COMPRESSION - OS_LIBS += -lzstd -endif -ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME - LIBSBCL = libsbcl.a - USE_LIBSBCL = -Wl,-force_load libsbcl.a -endif - -ASSEM_SRC = x86-assem.S -ARCH_SRC = x86-arch.c - -CPPFLAGS += -no-cpp-precomp - -GC_SRC = fullcgc.c gencgc.c traceroot.c diff --git a/src/runtime/x86-darwin-os.c b/src/runtime/x86-darwin-os.c deleted file mode 100644 index d7ab566ea3..0000000000 --- a/src/runtime/x86-darwin-os.c +++ /dev/null @@ -1,529 +0,0 @@ -#ifdef LISP_FEATURE_SB_THREAD -#include <architecture/i386/table.h> -#include <i386/user_ldt.h> -#include <mach/mach_init.h> -#endif - -#include "thread.h" -#include "validate.h" -#include "runtime.h" -#include "interrupt.h" -#include "x86-darwin-os.h" -#include "genesis/fdefn.h" -#include "gc-internal.h" // for gencgc_handle_wp_violation - -#include <mach/mach.h> -#include <mach/mach_error.h> -#include <mach/mach_types.h> -#include <mach/sync_policy.h> -#include <mach/vm_region.h> -#include <mach/machine/thread_state.h> -#include <mach/machine/thread_status.h> -#include <sys/_types.h> -#include <sys/ucontext.h> -#include <pthread.h> -#include <assert.h> -#include <stdlib.h> -#include <stdio.h> - -#ifdef LISP_FEATURE_SB_THREAD - -pthread_mutex_t modify_ldt_lock = PTHREAD_MUTEX_INITIALIZER; - -void set_data_desc_size(data_desc_t* desc, unsigned long size) -{ - desc->limit00 = (size - 1) & 0xffff; - desc->limit16 = ((size - 1) >> 16) &0xf; -} - -void set_data_desc_addr(data_desc_t* desc, void* addr) -{ - desc->base00 = (unsigned int)addr & 0xffff; - desc->base16 = ((unsigned int)addr & 0xff0000) >> 16; - desc->base24 = ((unsigned int)addr & 0xff000000) >> 24; -} - -#endif - -#ifdef LISP_FEATURE_SB_THREAD -void -arch_os_load_ldt(struct thread *thread) -{ - sel_t sel; - - sel.index = thread->tls_cookie; - sel.rpl = USER_PRIV; - sel.ti = SEL_LDT; - - __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel)); -} -#endif - -int arch_os_thread_init(struct thread *thread) { -#ifdef LISP_FEATURE_SB_THREAD - int n; - - data_desc_t ldt_entry = { 0, 0, 0, DESC_DATA_WRITE, - 3, 1, 0, DESC_DATA_32B, DESC_GRAN_BYTE, 0 }; - - set_data_desc_addr(&ldt_entry, thread); - set_data_desc_size(&ldt_entry, dynamic_values_bytes); - - ignore_value(mutex_acquire(&modify_ldt_lock)); - n = i386_set_ldt(LDT_AUTO_ALLOC, (union ldt_entry*) &ldt_entry, 1); - - if (n < 0) { - perror("i386_set_ldt"); - lose("unexpected i386_set_ldt(..) failure"); - } - ignore_value(mutex_release(&modify_ldt_lock)); - - thread->tls_cookie=n; - arch_os_load_ldt(thread); -#endif -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - mach_lisp_thread_init(thread); -#elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) - stack_t sigstack; - - /* Signal handlers are run on the control stack, so if it is exhausted - * we had better use an alternate stack for whatever signal tells us - * we've exhausted it */ - sigstack.ss_sp = calc_altstack_base(thread); - sigstack.ss_flags = 0; - sigstack.ss_size = calc_altstack_size(thread; - sigaltstack(&sigstack,0); -#endif - return 1; /* success */ -} - -int arch_os_thread_cleanup(struct thread *thread) { -#if defined(LISP_FEATURE_SB_THREAD) - int n = thread->tls_cookie; - - /* Set the %%fs register back to 0 and free the ldt by setting it - * to NULL. - */ - __asm__ __volatile__ ("mov %0, %%fs" : : "r"(0)); - ignore_value(mutex_acquire(&modify_ldt_lock)); - i386_set_ldt(n, NULL, 1); - ignore_value(mutex_release(&modify_ldt_lock)); -#endif - return 1; /* success */ -} - -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - -void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context); -void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context); -void memory_fault_handler(int signal, siginfo_t *siginfo, - os_context_t *context); - -/* This executes in the faulting thread as part of the signal - * emulation. It is passed a context with the uc_mcontext field - * pointing to a valid block of memory. */ -void build_fake_signal_context(os_context_t *context, - x86_thread_state32_t *thread_state, - x86_float_state32_t *float_state) { - thread_sigmask(0, NULL, &context->uc_sigmask); - context->uc_mcontext->SS = *thread_state; - context->uc_mcontext->FS = *float_state; -} - -/* This executes in the faulting thread as part of the signal - * emulation. It is effectively the inverse operation from above. */ -void update_thread_state_from_context(x86_thread_state32_t *thread_state, - x86_float_state32_t *float_state, - os_context_t *context) { - *thread_state = context->uc_mcontext->SS; - *float_state = context->uc_mcontext->FS; - thread_sigmask(SIG_SETMASK, &context->uc_sigmask, NULL); -} - -/* Modify a context to push new data on its stack. */ -void push_context(uint32_t data, x86_thread_state32_t *thread_state) -{ - uint32_t *stack_pointer; - - stack_pointer = (uint32_t*) thread_state->ESP; - *(--stack_pointer) = data; - thread_state->ESP = (unsigned int) stack_pointer; -} - -void align_context_stack(x86_thread_state32_t *thread_state) -{ - /* 16byte align the stack (provided that the stack is, as it - * should be, 4byte aligned. */ - while (thread_state->ESP & 15) push_context(0, thread_state); -} - -/* Stack allocation starts with a context that has a mod-4 ESP value - * and needs to leave a context with a mod-16 ESP that will restore - * the old ESP value and other register state when activated. The - * first part of this is the recovery trampoline, which loads ESP from - * EBP, pops EBP, and returns. */ -asm("_stack_allocation_recover: movl %ebp, %esp; popl %ebp; ret;"); - -void open_stack_allocation(x86_thread_state32_t *thread_state) -{ - void stack_allocation_recover(void); - - push_context(thread_state->EIP, thread_state); - push_context(thread_state->EBP, thread_state); - thread_state->EBP = thread_state->ESP; - thread_state->EIP = (unsigned int) stack_allocation_recover; - - align_context_stack(thread_state); -} - -/* Stack allocation of data starts with a context with a mod-16 ESP - * value and reserves some space on it by manipulating the ESP - * register. */ -void *stack_allocate(x86_thread_state32_t *thread_state, size_t size) -{ - /* round up size to 16byte multiple */ - size = (size + 15) & -16; - - thread_state->ESP = ((uint32_t)thread_state->ESP) - size; - - return (void *)thread_state->ESP; -} - -/* Arranging to invoke a C function is tricky, as we have to assume - * cdecl calling conventions (caller removes args) and x86/darwin - * alignment requirements. The simplest way to arrange this, - * actually, is to open a new stack allocation. - * WARNING!!! THIS DOES NOT PRESERVE REGISTERS! */ -void call_c_function_in_context(x86_thread_state32_t *thread_state, - void *function, - int nargs, - ...) -{ - va_list ap; - int i; - uint32_t *stack_pointer; - - /* Set up to restore stack on exit. */ - open_stack_allocation(thread_state); - - /* Have to keep stack 16byte aligned on x86/darwin. */ - for (i = (3 & -nargs); i; i--) { - push_context(0, thread_state); - } - - thread_state->ESP = ((uint32_t)thread_state->ESP) - nargs * 4; - stack_pointer = (uint32_t *)thread_state->ESP; - - va_start(ap, nargs); - for (i = 0; i < nargs; i++) { - //push_context(va_arg(ap, uint32_t), thread_state); - stack_pointer[i] = va_arg(ap, uint32_t); - } - va_end(ap); - - push_context(thread_state->EIP, thread_state); - thread_state->EIP = (unsigned int) function; -} - -void signal_emulation_wrapper(x86_thread_state32_t *thread_state, - x86_float_state32_t *float_state, - int signal, - siginfo_t *siginfo, - void (*handler)(int, siginfo_t *, void *)) -{ - - os_context_t context; - _STRUCT_MCONTEXT32 regs; - - context.uc_mcontext = ®s; - - /* when BSD signals are fired, they mask they signals in sa_mask - which always seem to be the blockable_sigset, for us, so we - need to: - 1) save the current sigmask - 2) block blockable signals - 3) call the signal handler - 4) restore the sigmask */ - build_fake_signal_context(&context, thread_state, float_state); - - block_blockable_signals(0); - - handler(signal, siginfo, &context); - - update_thread_state_from_context(thread_state, float_state, &context); - - /* Trap to restore the signal context. */ - asm volatile (".long 0xffff0b0f" - : : "a" (thread_state), "c" (float_state)); -} - -/* Convenience wrapper for the above */ -void call_handler_on_thread(mach_port_t thread, - x86_thread_state32_t *thread_state, - int signal, - siginfo_t *siginfo, - void (*handler)(int, siginfo_t *, os_context_t *)) -{ - x86_thread_state32_t new_state; - x86_thread_state32_t *save_thread_state; - x86_float_state32_t *save_float_state; - mach_msg_type_number_t state_count; - siginfo_t *save_siginfo; - kern_return_t ret; - /* Initialize the new state */ - new_state = *thread_state; - open_stack_allocation(&new_state); - stack_allocate(&new_state, 256); - /* Save old state */ - save_thread_state = (x86_thread_state32_t *)stack_allocate(&new_state, sizeof(*save_thread_state)); - *save_thread_state = *thread_state; - /* Save float state */ - save_float_state = (x86_float_state32_t *)stack_allocate(&new_state, sizeof(*save_float_state)); - state_count = x86_FLOAT_STATE32_COUNT; - if ((ret = thread_get_state(thread, - x86_FLOAT_STATE32, - (thread_state_t)save_float_state, - &state_count)) != KERN_SUCCESS) - lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret); - /* Set up siginfo */ - save_siginfo = stack_allocate(&new_state, sizeof(*siginfo)); - if (siginfo == NULL) - save_siginfo = siginfo; - else - *save_siginfo = *siginfo; - /* Prepare to call */ - call_c_function_in_context(&new_state, - signal_emulation_wrapper, - 5, - save_thread_state, - save_float_state, - signal, - save_siginfo, - handler); - /* Update the thread state */ - state_count = x86_THREAD_STATE32_COUNT; - if ((ret = thread_set_state(thread, - x86_THREAD_STATE32, - (thread_state_t)&new_state, - state_count)) != KERN_SUCCESS) - lose("thread_set_state (x86_FLOAT_STATE32) failed %d", ret); - -} - -#if defined DUMP_CONTEXT -void dump_context(x86_thread_state32_t *thread_state) -{ - int i; - uint32_t *stack_pointer; - - printf("eax: %08lx ecx: %08lx edx: %08lx ebx: %08lx\n", - thread_state->EAX, thread_state->ECX, thread_state->EDX, thread_state->EAX); - printf("esp: %08lx ebp: %08lx esi: %08lx edi: %08lx\n", - thread_state->ESP, thread_state->EBP, thread_state->ESI, thread_state->EDI); - printf("eip: %08lx eflags: %08lx\n", - thread_state->EIP, thread_state->EFLAGS); - printf("cs: %04hx ds: %04hx es: %04hx " - "ss: %04hx fs: %04hx gs: %04hx\n", - thread_state->CS, - thread_state->DS, - thread_state->ES, - thread_state->SS, - thread_state->FS, - thread_state->GS); - - stack_pointer = (uint32_t *)thread_state->ESP; - for (i = 0; i < 48; i+=4) { - printf("%08x: %08x %08x %08x %08x\n", - thread_state->ESP + (i * 4), - stack_pointer[i], - stack_pointer[i+1], - stack_pointer[i+2], - stack_pointer[i+3]); - } -} -#endif - -void -control_stack_exhausted_handler(int signal, siginfo_t *siginfo, - os_context_t *context) { - extern void unblock_signals_in_context_and_maybe_warn(os_context_t*); - unblock_signals_in_context_and_maybe_warn(context); - arrange_return_to_lisp_function - (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)); -} - -void -undefined_alien_handler(int signal, siginfo_t *siginfo, os_context_t *context) { - arrange_return_to_lisp_function - (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR)); -} - -kern_return_t -catch_exception_raise(mach_port_t exception_port, - mach_port_t thread, - mach_port_t task, - exception_type_t exception, - exception_data_t code_vector, - mach_msg_type_number_t code_count) -{ - x86_thread_state32_t thread_state; - mach_msg_type_number_t state_count; - void *addr = NULL; - int signal = 0; - void (*handler)(int, siginfo_t *, os_context_t *) = NULL; - siginfo_t siginfo; - kern_return_t ret = KERN_SUCCESS, dealloc_ret; - - struct thread *th; - - FSHOW((stderr,"/entering catch_exception_raise with exception: %d\n", exception)); - - if (mach_port_get_context(mach_task_self(), exception_port, (mach_vm_address_t *)&th) - != KERN_SUCCESS) { - lose("Can't find the thread for an exception %u", exception_port); - } - - /* Get state and info */ - state_count = x86_THREAD_STATE32_COUNT; - if ((ret = thread_get_state(thread, - x86_THREAD_STATE32, - (thread_state_t)&thread_state, - &state_count)) != KERN_SUCCESS) - lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret); - switch (exception) { - case EXC_BAD_ACCESS: - signal = SIGBUS; - /* Check if write protection fault */ - if ((code_vector[0] & OS_VM_PROT_ALL) == 0) { - ret = KERN_INVALID_RIGHT; - break; - } - addr = (void*)code_vector[1]; - /* Just need to unprotect the page and do some bookkeeping, no need - * to run it from the faulting thread. - * And because the GC uses signals to stop the world it might - * interfere with that bookkeeping, because there's a window - * before block_blockable_signals is performed. */ - if (gencgc_handle_wp_violation(0, addr)) - goto do_not_handle; - - /* Undefined alien */ - if (os_trunc_to_page(addr) == undefined_alien_address) { - handler = undefined_alien_handler; - break; - } - /* At stack guard */ - if (os_trunc_to_page(addr) == CONTROL_STACK_GUARD_PAGE(th)) { - lower_thread_control_stack_guard_page(th); - handler = control_stack_exhausted_handler; - break; - } - /* Return from stack guard */ - if (os_trunc_to_page(addr) == CONTROL_STACK_RETURN_GUARD_PAGE(th)) { - reset_thread_control_stack_guard_page(th); - break; - } - /* Regular memory fault */ - handler = memory_fault_handler; - break; - case EXC_BAD_INSTRUCTION: - signal = SIGTRAP; - /* Check if illegal instruction trap */ - if (code_vector[0] != EXC_I386_INVOP) { - ret = KERN_INVALID_RIGHT; - break; - } - /* Check if UD2 instruction */ - if (*(unsigned short *)thread_state.EIP != 0x0b0f) { - /* KLUDGE: There are two ways we could get here: - * 1) We're executing data and we've hit some truly - * illegal opcode, of which there are a few, see - * Intel 64 and IA-32 Architectures - * Sofware Developer's Manual - * Volume 3A page 5-34) - * 2) The kernel started an unrelated signal handler - * before we got a chance to run. The context that - * caused the exception is saved in a stack frame - * somewhere down below. - * In either case we rely on the exception to retrigger, - * eventually bailing out if we're spinning on case 2). - */ - static mach_port_t last_thread; - static unsigned int last_eip; - if (last_thread == thread && last_eip == thread_state.EIP) - ret = KERN_INVALID_RIGHT; - else - ret = KERN_SUCCESS; - last_thread = thread; - last_eip = thread_state.EIP; - break; - } - /* Skip the trap code */ - thread_state.EIP += 2; - /* Return from handler? */ - if (*(unsigned short *)thread_state.EIP == 0xffff) { - if ((ret = thread_set_state(thread, - x86_THREAD_STATE32, - (thread_state_t)thread_state.EAX, - x86_THREAD_STATE32_COUNT)) != KERN_SUCCESS) - lose("thread_set_state (x86_THREAD_STATE32) failed %d", ret); - if ((ret = thread_set_state(thread, - x86_FLOAT_STATE32, - (thread_state_t)thread_state.ECX, - x86_FLOAT_STATE32_COUNT)) != KERN_SUCCESS) - lose("thread_set_state (x86_FLOAT_STATE32) failed %d", ret); - break; - } - /* Trap call */ - handler = sigtrap_handler; - break; - case EXC_BREAKPOINT: - if (single_stepping) { - signal = SIGTRAP; - /* Clear TF or the signal emulation wrapper won't proceed - with single stepping enabled. */ - thread_state.EFLAGS &= ~0x100; - handler = sigtrap_handler; - break; - } else if (*(unsigned char*)(thread_state.EIP-1) == 0xCC) { - signal = SIGTRAP; - handler = sigtrap_handler; - break; - } - default: - ret = KERN_INVALID_RIGHT; - } - /* Call handler */ - if (handler != 0) { - siginfo.si_signo = signal; - siginfo.si_addr = addr; - call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler); - } - - do_not_handle: - dealloc_ret = mach_port_deallocate (mach_task_self(), thread); - if (dealloc_ret) { - lose("mach_port_deallocate (thread) failed with return_code %d", dealloc_ret); - } - - dealloc_ret = mach_port_deallocate (mach_task_self(), task); - if (dealloc_ret) { - lose("mach_port_deallocate (task) failed with return_code %d", dealloc_ret); - } - - return ret; -} - -void -os_restore_fp_control(os_context_t *context) -{ - /* KLUDGE: The x87 FPU control word is some nasty bitfield struct - * thing. Rather than deal with that, just grab it as a 16-bit - * integer. */ - unsigned short fpu_control_word = - *((unsigned short *)&context->uc_mcontext->FS.FPU_FCW); - /* reset exception flags and restore control flags on x87 FPU */ - asm ("fldcw %0" : : "m" (fpu_control_word)); -} - -#endif diff --git a/src/runtime/x86-darwin-os.h b/src/runtime/x86-darwin-os.h deleted file mode 100644 index 7ff303b967..0000000000 --- a/src/runtime/x86-darwin-os.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef _X86_DARWIN_OS_H -#define _X86_DARWIN_OS_H - -#include <architecture/i386/table.h> -#include <i386/user_ldt.h> - -#include "darwin-os.h" - -typedef int os_context_register_t; - -#include "arch-os-generic.inc" - -void set_data_desc_size(data_desc_t* desc, unsigned long size); -void set_data_desc_addr(data_desc_t* desc, void* addr); - -/* On OS X 10.5, the field names for the thread state have changed and - * now are prepended with __. Use some #define hackery to deal with - * this. - */ -#if __DARWIN_UNIX03 - -#define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext->__ss.__##stem -#define EIP __eip -#define ESP __esp -#define EBP __ebp -#define EAX __eax -#define EBX __ebx -#define ECX __ecx -#define EDX __edx -#define ESI __esi -#define EDI __edi -#define EFLAGS __eflags -#define CS __cs -#define DS __ds -#define ES __es -#define FS __fs -#define SS __ss -#define GS __gs - -#define FPU_FCW __fpu_fcw - -#else - -#define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext->ss.stem -#define EIP eip -#define ESP esp -#define EBP ebp -#define EAX eax -#define EBX ebx -#define ECX ecx -#define EDX edx -#define ESI esi -#define EDI edi -#define EFLAGS eflags -#define CS cs -#define DS ds -#define ES es -#define FS fs -#define SS ss -#define GS gs - -#define FPU_FCW fpu_fcw - -#endif /* __DARWIN_UNIX03 */ - -#define RESTORE_FP_CONTROL_FROM_CONTEXT -void os_restore_fp_control(os_context_t *context); - -#endif /* _X86_DARWIN_OS_H */ From db2b157b2a06a5c01c77d3ac4a0e1223c3d6ca78 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 7 Aug 2022 19:59:36 -0400 Subject: [PATCH 3804/4023] x86-64: Compile fewer custom trampolines Assume that a function with a non-symbol for its name that is not (SETF s) is a funcallable instance without an embedded trampoline. Just use the ordinary FDEFN call convention for those. --- src/assembly/x86-64/tramps.lisp | 3 +- src/code/x86-64-vm.lisp | 12 ++++- src/compiler/x86-64/call.lisp | 77 ++++++++++++++++++++++----------- src/compiler/x86-64/cell.lisp | 5 +-- 4 files changed, 66 insertions(+), 31 deletions(-) diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index 2ba323974e..b1a7293195 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -142,7 +142,8 @@ ;;; installed as a globally named function. The fdefn contains a jump opcode ;;; to a tiny code component specific to the particular closure. ;;; The trampoline is responsible for loading RAX, since named calls don't. -#-immobile-code +;;; However, #+immobile-code might still need CLOSURE-TRAMP for any fdefn +;;; for which the compiler chooses not to use "direct" call convention. (define-assembly-routine (closure-tramp (:return-style :none)) () diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index b4a6cf359e..032bbf4c9b 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -314,9 +314,17 @@ (%primitive set-fdefn-has-static-callers fdefn)) fdefn) -(defun %set-fdefn-fun (fdefn fun) +(defun %set-fdefn-fun (fdefn fun &aux (name (fdefn-name fdefn))) (declare (type fdefn fdefn) (type function fun) (values function)) + (unless (or (symbolp name) (eq 'setf (car name))) + ;; Ue the #-immobile-code call convention for this name. + ;; So we'll not compile a trampoline for things that can probably + ;; never be called directly anyway. i.e you _won't_ see things like: + ;; #<trampoline #<%METHOD-FUNCTION (LAMBDA (SB-PCL::METHOD-ARGS SB-PCL::NEXT-METHODS) ... + ;; in the core any more + (%primitive sb-vm::set-fdefn-fun fun fdefn) + (return-from %set-fdefn-fun fun)) (when (fdefn-has-static-callers fdefn) (remove-static-links fdefn)) (let ((trampoline (when (fun-requires-simplifying-trampoline-p fun) @@ -332,7 +340,7 @@ ;; But the result is shifted by N-FIXNUM-TAG-BITS because ;; CELL-REF yields a descriptor-reg, not an unsigned-reg. (get-lisp-obj-address (%closure-callee fun))))) - (%primitive set-fdefn-fun fdefn fun jmp-target)))) + (%primitive sb-vm::set-direct-callable-fdefn-fun fdefn fun jmp-target)))) fun) ) ; end PROGN diff --git a/src/compiler/x86-64/call.lisp b/src/compiler/x86-64/call.lisp index c963a480ef..bc0f8d2356 100644 --- a/src/compiler/x86-64/call.lisp +++ b/src/compiler/x86-64/call.lisp @@ -799,34 +799,14 @@ DONE (note-this-location vop :call-site) ,(cond ((eq named :direct) - #+immobile-code - `(let* ((fixup (make-fixup - fun - (if (static-fdefn-offset fun) - :static-call - :named-call))) - (target - (if (and (sb-c::code-immobile-p node) - (not step-instrumenting)) - fixup - (progn - ;; RAX-TN was not declared as a temp var, - ;; however it's sole purpose at this point is - ;; for function call, so even if it was used - ;; to compute a stack argument, it's free now. - ;; If the call hits the undefined fun trap, - ;; RAX will get loaded regardless. - (inst mov rax-tn fixup) - rax-tn)))) - (inst ,(if (eq return :tail) 'jmp 'call) target)) - #-immobile-code - `(inst ,(if (eq return :tail) 'jmp 'call) - (ea (+ nil-value (static-fun-offset fun))))) + #+immobile-code `(emit-direct-call fun ',(if (eq return :tail) 'jmp 'call) + node step-instrumenting) + #-immobile-code `(inst ,(if (eq return :tail) 'jmp 'call) + (ea (+ nil-value (static-fun-offset fun))))) #-immobile-code (named `(inst ,(if (eq return :tail) 'jmp 'call) - (ea (- (* fdefn-raw-addr-slot n-word-bytes) - other-pointer-lowtag) rax))) + (object-slot-ea rax fdefn-raw-addr-slot other-pointer-lowtag))) ((eq return :tail) `(tail-call-unnamed rax fun-type vop)) (t @@ -858,6 +838,53 @@ (define-full-call fixed-call-named t :fixed nil :fixed) (define-full-call fixed-tail-call-named t :tail nil :fixed)) +;;; Call NAME "directly" meaning in a single JMP or CALL instruction, +;;; if possible +(defun emit-direct-call (name instruction node step-instrumenting) + (if (and (listp name) (neq (car name) 'setf)) + ;; always call through the fdefn for (SB-PCL::SLOT-ACCESSOR :GLOBAL ...) + ;; and anything else with a nonstandard name, so we can avoid compiling + ;; a thousand little custom trampolines. + ;; The main reason for that is it avoids compiling custom trampolines + ;; for functions that are never in practice called, such as + ;; (SB-PCL::{FAST,SLOW}-METHOD mumble (thing t) ...) + ;; but which nonetheless have FDEFNs. + ;; We still make the custom trampoline for closures such as + ;; (SB-KERNEL::CONDITION-SLOT-READER SB-INTERPRETER::TYPE-ERROR-SYMBOL). + ;; Even though that has a nonstandard name, that lambda is installed + ;; as #'TYPE-ERROR-SYMBOL, which is an ordinary name. + (let* ((constants + (sb-c::ir2-component-constants + (sb-c::component-info sb-c::*component-being-compiled*))) + (constant + (find-if (lambda (x) + (and (listp x) (eq (car x) :named-call) (equal (cadr x) name))) + constants))) + (aver constant) + (inst mov rax-tn (third constant)) + ;;(loadw rax-tn rax-tn fdefn-fun-slot other-pointer-lowtag) + (inst* instruction (object-slot-ea rax-tn fdefn-raw-addr-slot other-pointer-lowtag))) + ;; call without loading RAX + ;; a :STATIC-CALL fixup is the address of the entry point of + ;; the function itself, and a :NAMED-CALL fixup is the address + ;; of the JMP instruction embedded in the header for the named FDEFN. + (let* ((fixup (make-fixup name + (if (static-fdefn-offset name) :static-call :named-call))) + (target + (if (and (sb-c::code-immobile-p node) + (not step-instrumenting)) + fixup + (progn + ;; RAX-TN was not declared as a temp var, + ;; however it's sole purpose at this point is + ;; for function call, so even if it was used + ;; to compute a stack argument, it's free now. + ;; If the call hits the undefined fun trap, + ;; RAX will get loaded regardless. + (inst mov rax-tn fixup) + rax-tn)))) + (inst* instruction target)))) + ;;; Invoke the function-designator FUN. (defun tail-call-unnamed (fun type vop) (let ((relative-call (sb-c::code-immobile-p vop)) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index 85289f8d1c..f9b0755170 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -533,10 +533,9 @@ (inst jmp :e err-lab)) RETRY)) -#-immobile-code (define-vop (set-fdefn-fun) (:policy :fast-safe) - (:translate (setf fdefn-fun)) + #-immobile-code (:translate (setf fdefn-fun)) (:args (function :scs (descriptor-reg) :target result) (fdefn :scs (descriptor-reg))) (:temporary (:sc unsigned-reg) raw) @@ -553,7 +552,7 @@ (move result function))) #+immobile-code (progn -(define-vop (set-fdefn-fun) +(define-vop (set-direct-callable-fdefn-fun) (:args (fdefn :scs (descriptor-reg)) (function :scs (descriptor-reg)) (raw-word :scs (unsigned-reg))) From e7edc14706e4b8e144d47521853e279114944d99 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 8 Aug 2022 09:13:32 -0400 Subject: [PATCH 3805/4023] Fix hide-packages test if heap assertions on --- src/runtime/stringspace.c | 30 ++++++++++++++++++++++++++++++ tests/hide-packages.test.sh | 1 + 2 files changed, 31 insertions(+) diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index b60ee246b3..8a9c91a101 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -294,4 +294,34 @@ void move_rospace_to_dynamic(__attribute__((unused)) int print) read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; } +/* This kludge is only for the hide-packages test after it invokes move_rospace_to_dynamic(). + * I wish there were a better way to write that test than to hack up the GC + * so badly that it can't run with its heap verifications enabled. */ +void test_dirty_all_gc_cards() +{ +#ifdef LISP_FEATURE_IMMOBILE_SPACE + int n_text_pages = TEXT_SPACE_SIZE / IMMOBILE_CARD_BYTES; + int n_bitmap_elts = ALIGN_UP(n_text_pages, 32) / 32; + memset(text_page_touched_bits, 0xFF, sizeof (int)*n_bitmap_elts); + lispobj* where = (lispobj*)TEXT_SPACE_START; + // OBJ_WRITTEN_FLAG is confusing. The '<<24' puts it in the generation byte. + for ( ; where < text_space_highwatermark ; where += object_size(where) ) + if (widetag_of(where) == CODE_HEADER_WIDETAG) *where |= (OBJ_WRITTEN_FLAG << 24); +#endif +#ifdef LISP_FEATURE_SOFT_CARD_MARKS + memset(gc_card_mark, 0, 1<<gc_card_table_nbits); + page_index_t first = 0; + while (first < next_free_page) { + page_index_t last = contiguous_block_final_page(first); + lispobj* where = (lispobj*)page_address(first); + lispobj* limit = (lispobj*)page_address(last) + page_words_used(last); + for ( ; where < limit ; where += object_size(where) ) + if (widetag_of(where) == CODE_HEADER_WIDETAG) *where |= (OBJ_WRITTEN_FLAG << 24); + first = 1+last; + } +#endif + extern boolean pre_verify_gen_0; + pre_verify_gen_0 = 1; +} + #endif diff --git a/tests/hide-packages.test.sh b/tests/hide-packages.test.sh index f367cba2ba..c6799af8bb 100644 --- a/tests/hide-packages.test.sh +++ b/tests/hide-packages.test.sh @@ -9,6 +9,7 @@ set -e CLOBBER_INTERNAL_FEATURES="(handler-bind ((simple-error #'continue)) (sb-vm::close-thread-alloc-region) (alien-funcall (extern-alien \"move_rospace_to_dynamic\" (function void int)) 1) + (alien-funcall (extern-alien \"test_dirty_all_gc_cards\" (function void))) (sb-kernel:set-symbol-global-value (eval ''sb-impl:+internal-features+) nil))" ### Apparently the finalizer thread must be stopped before running these tests or else From bb00acdb096f29ae3fd213d0d91b38cb227f90e9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 8 Aug 2022 10:28:50 -0400 Subject: [PATCH 3806/4023] Use $(CC) instead of cc. Fixes lp#1976148 --- src/runtime/GNUmakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index 16896319bc..f2483bfee2 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -111,7 +111,7 @@ heap-reloc-test: ../../tests/heap-reloc/fake-mman.c $(OBJS) # data collection, with COMPILING_TESTS. Not really used yet. gc-unit-tests.o: CFLAGS=-g -DCOMPILING_TESTS unit-tests: gc-unit-tests.o libsbcl.a - cc -g -no-pie -o $@ $^ -ldl -lpthread -lm + $(CC) -g -no-pie -o $@ $^ -ldl -lpthread -lm # ld -r -o sbcl.o works on Linux, but not on other platforms. # On macOS, it fails to keep debug sections. @@ -124,7 +124,7 @@ libsbcl.a: $(OBJS) PIC_OBJS = $(subst .o,.pic.o,$(OBJS)) libsbcl.so: $(PIC_OBJS) - cc -shared -o $@ $^ $(LIBS) + $(CC) -shared -o $@ $^ $(LIBS) # for this to work, you must have with-gcc-tls in your build features already. # can't define it here because then it conflicts if you have it in both places. %.pic.o: %.c From fb5f94c0bb739e2e787c3f3b80a001a40408e9ba Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 8 Aug 2022 11:06:46 -0400 Subject: [PATCH 3807/4023] Fix hide-packages.test.sh again --- src/runtime/stringspace.c | 11 ++++++++--- tests/hide-packages.test.sh | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index 8a9c91a101..0719ec15c8 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -308,18 +308,23 @@ void test_dirty_all_gc_cards() for ( ; where < text_space_highwatermark ; where += object_size(where) ) if (widetag_of(where) == CODE_HEADER_WIDETAG) *where |= (OBJ_WRITTEN_FLAG << 24); #endif -#ifdef LISP_FEATURE_SOFT_CARD_MARKS +#ifdef LISP_FEATURE_SOFT_CARD_MARKS // just touch all mark bits, no harm done memset(gc_card_mark, 0, 1<<gc_card_table_nbits); +#endif page_index_t first = 0; while (first < next_free_page) { page_index_t last = contiguous_block_final_page(first); lispobj* where = (lispobj*)page_address(first); lispobj* limit = (lispobj*)page_address(last) + page_words_used(last); for ( ; where < limit ; where += object_size(where) ) - if (widetag_of(where) == CODE_HEADER_WIDETAG) *where |= (OBJ_WRITTEN_FLAG << 24); + if (widetag_of(where) == CODE_HEADER_WIDETAG) { +#ifndef LISP_FEATURE_SOFT_CARD_MARKS // only touch code pages, others got WP faults + gc_card_mark[addr_to_card_index(where)] = 1; +#endif + *where |= (OBJ_WRITTEN_FLAG << 24); + } first = 1+last; } -#endif extern boolean pre_verify_gen_0; pre_verify_gen_0 = 1; } diff --git a/tests/hide-packages.test.sh b/tests/hide-packages.test.sh index c6799af8bb..b3c0e6dccd 100644 --- a/tests/hide-packages.test.sh +++ b/tests/hide-packages.test.sh @@ -9,7 +9,8 @@ set -e CLOBBER_INTERNAL_FEATURES="(handler-bind ((simple-error #'continue)) (sb-vm::close-thread-alloc-region) (alien-funcall (extern-alien \"move_rospace_to_dynamic\" (function void int)) 1) - (alien-funcall (extern-alien \"test_dirty_all_gc_cards\" (function void))) + (when (sb-sys:find-foreign-symbol-address \"test_dirty_all_gc_cards\") + (alien-funcall (extern-alien \"test_dirty_all_gc_cards\" (function void)))) (sb-kernel:set-symbol-global-value (eval ''sb-impl:+internal-features+) nil))" ### Apparently the finalizer thread must be stopped before running these tests or else From 1424306003c7445f2233a0960734028b0885019b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 8 Aug 2022 12:26:35 -0400 Subject: [PATCH 3808/4023] x86-64: give all funcallable-instances a builtin trampoline For a mere 2 words, they're all callable using the same convention as a simple-fun, i.e. the entry address can be assigned into the raw-addr slot of an fdefn with no fuss. It does not matter whether they're in immobile space - in fact they aren't. But the feature is predicated on having immobile fdefns because that's what allows a 1-instruction call. --- src/assembly/x86-64/tramps.lisp | 6 +++ src/code/alloc.lisp | 23 ++++---- src/code/aprof.lisp | 6 +++ src/code/defstruct.lisp | 24 ++++----- src/code/early-classoid.lisp | 15 +++++- src/code/room.lisp | 16 +++--- src/code/x86-64-vm.lisp | 91 +++++++------------------------- src/compiler/generic/objdef.lisp | 8 +-- src/compiler/x86-64/alloc.lisp | 18 +++++-- src/pcl/braid.lisp | 12 ++--- src/pcl/class-init.lisp | 28 +++------- src/pcl/pre-warm.lisp | 8 --- src/runtime/gc-common.c | 29 ++++++---- src/runtime/gencgc.c | 52 +++++++++++++----- src/runtime/immobile-space.c | 55 ++----------------- src/runtime/verify.inc | 6 +-- src/runtime/x86-64-arch.c | 12 ++--- tests/fin-call.impure.lisp | 2 +- tests/gc.impure.lisp | 4 +- tests/x86-64-codegen.impure.lisp | 5 -- 20 files changed, 174 insertions(+), 246 deletions(-) diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index b1a7293195..bc82476ce0 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -63,6 +63,12 @@ (inst call (make-fixup "alloc_list" :foreign)) (inst mov (ea 16 rbp-tn) rax-tn))) ; result onto stack +(define-assembly-routine (alloc-funinstance) () + (with-registers-preserved (c) + (inst mov rdi-tn (ea 16 rbp-tn)) + (inst call (make-fixup "alloc_funinstance" :foreign)) + (inst mov (ea 16 rbp-tn) rax-tn))) + (define-assembly-routine (listify-&rest (:return-style :none)) () (with-registers-preserved (c) (inst mov rdi-tn (ea 16 rbp-tn)) ; 1st C call arg diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index 38fb1653c2..6c550df8dd 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -169,6 +169,18 @@ (declaim (ftype (sfunction (t (unsigned-byte 22) (unsigned-byte 25)) (values code-component (integer 0))) allocate-code-object)) + +(defun update-dynamic-space-code-tree (obj) + (with-pinned-objects (obj) + (let ((addr (logandc2 (get-lisp-obj-address obj) other-pointer-lowtag)) + (tree *dynspace-codeblob-tree*)) + (loop (let ((newtree (sb-brothertree:insert addr tree))) + ;; check that it hasn't been promoted from gen0 -> gen1 already + ;; (very unlikely, but certainly possible). + (unless (eq (generation-of obj) 0) (return)) + (let ((oldval (cas *dynspace-codeblob-tree* tree newtree))) + (if (eq oldval tree) (return) (setq tree oldval)))))))) + ;;; Allocate a code component with BOXED words in the header ;;; followed by UNBOXED bytes of raw data. ;;; BOXED must be the exact count of boxed words desired. No adjustments @@ -217,16 +229,7 @@ (alien-funcall (extern-alien "alloc_code_object" (function unsigned (unsigned 32) (unsigned 32))) total-words boxed))))) - (with-pinned-objects (code) - (let ((addr (logandc2 (get-lisp-obj-address code) other-pointer-lowtag)) - (tree *dynspace-codeblob-tree*)) - (loop (let ((newtree (sb-brothertree:insert addr tree))) - ;; check that it hasn't been promoted from gen0 -> gen1 already - ;; (very unlikely, but certainly possible). - (unless (eq (generation-of code) 0) (return)) - (let ((oldval (cas *dynspace-codeblob-tree* tree newtree))) - (if (eq oldval tree) (return) (setq tree oldval))))))) - + (update-dynamic-space-code-tree code) ;; FIXME: there may be random values in the unboxed payload and it's not obvious ;; that all callers of ALLOCATE-CODE-OBJECT always write all raw bytes. ;; LOAD-CODE and MAKE-CORE-COMPONENT certainly do because the representation diff --git a/src/code/aprof.lisp b/src/code/aprof.lisp index be6624c6de..bbc6e60c65 100644 --- a/src/code/aprof.lisp +++ b/src/code/aprof.lisp @@ -232,6 +232,12 @@ (mov ?_ (ea 0 ?result) ?header) (mov ?_ (ea ?_ ?result) ?vector-len) (or ?result ?lowtag)) + ;; not really "large" but same as preceding + (funinstance (push ?nbytes) + (call . ignore) + (pop ?result) + (mov ?_ (ea 0 ?result) ?header) + (or ?result ?lowtag)) (list (push ?nbytes) (call . ignore) (pop ?result) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index c2bb93808d..12626ef0be 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -1608,26 +1608,17 @@ or they must be declared locally notinline at each call site.~@:>" ;;; word2: (u) layout ;;; word3: (t) implementation-fun ;;; word4: (t) tagged slots ... -;;; Compact header: -;;; External trampoline: #b...1111 -1 +;;; Compact header: #b...1000 -7 ;;; word0: header/layout ;;; word1: (*) entry address -;;; word2: (t) implementation-fun -;;; word3: (t) tagged slots ... -;;; Internal trampoline: #b..00110 6 -;;; word0: header/layout -;;; word1: (*) entry address [= word 4] -;;; word2: (t) implementation-fun -;;; word3: (t) tagged slot -;;; word4: (u) machine code -;;; word5: (u) machine code +;;; word2: (u) machine instructions +;;; word3: (u) machine instructions +;;; word4: (t) implementation-fun +;;; word5: (t) tagged slots ... ;;; (*) entry address can be treated as either tagged or raw. ;;; For some architectures it has a lowtag, but points to ;;; read-only space. For others it is a fixnum. ;;; In either case the GC need not observe the value. -;;; Compact-header with external trampoline can indicate -;;; all slots as tagged. The other two cases above have at -;;; least one slot which must be marked raw. ;;; ;;; Ordinary instance with only tagged slots: ;;; Non-compact header: #b...1110 -2 @@ -2236,6 +2227,11 @@ or they must be declared locally notinline at each call site.~@:>" (setf (%fun-wrapper object) (the-layout))))))) `((defun ,constructor (,@slot-names &aux (object ,allocate)) ,@set-layout + #+x86-64 + ,@(when (and (eq dd-type 'funcallable-structure) + ;; fmt-control is not an executable function + (neq class-name 'sb-format::fmt-control)) + '((sb-vm::write-funinstance-prologue object))) ,@(mapcar (lambda (dsd) `(setf (,(dsd-accessor-name dsd) object) ,(dsd-name dsd))) (dd-slots dd)) diff --git a/src/code/early-classoid.lisp b/src/code/early-classoid.lisp index 5a52e42408..c20fd3eb0d 100644 --- a/src/code/early-classoid.lisp +++ b/src/code/early-classoid.lisp @@ -373,7 +373,20 @@ ;;; See the pictures above DD-BITMAP in src/code/defstruct for the details. (defconstant standard-gf-primitive-obj-layout-bitmap - #+compact-instance-header 6 + ;; layout has no bitmap bit. The other slots all look tagged even though + ;; it's an accident that the raw instruction words resemble fixnums. + ;; I should probably find a more principled way to express this, + ;; but the old - technically correct - way based on a bitmap really made + ;; the logic look like crap. But now that the variable-length part of a + ;; funcallable-instance follows its embedded trampoline, it would be simple + ;; to alter the GC to skip a fixed number of slots. + ;; I think that is preferable to using a bitmap. + #+compact-instance-header -1 + ;; the layout is considered untagged so that we don't doubly process it + ;; if walking tagged slots. The assumption is that layout is always + ;; handled separately, so therefore we don't want to process it again + ;; in a bitmap-based scan. And the entry point is considered untagged + ;; because it points to an assembler routine, thus ignorable. #-compact-instance-header -4) #-sb-xc-host diff --git a/src/code/room.lisp b/src/code/room.lisp index 17ee09864a..517984e4a9 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -1208,7 +1208,8 @@ We could try a few things to mitigate this: (total-code-size 0)) (map-allocated-objects (lambda (obj type size) - (declare ((and fixnum (integer 1)) size)) + (declare ((and fixnum (integer 1)) size)) + (unless (= type funcallable-instance-widetag) ;; M-A-O disables GC, therefore GET-LISP-OBJ-ADDRESS is safe (let ((obj-addr (get-lisp-obj-address obj)) (array (cond ((= type code-header-widetag) @@ -1246,7 +1247,7 @@ We could try a few things to mitigate this: (+ dynamic-space-start (* index gencgc-page-bytes))) (alien-funcall (extern-alien "ldb_monitor" (function void)))) (t - (setf (sbit array index) 1)))))) + (setf (sbit array index) 1))))))) :dynamic))) ;;; Because pseudo-static objects can not move nor be freed, ;;; this is a valid test that genesis separated code and data. @@ -1295,19 +1296,14 @@ We could try a few things to mitigate this: (dx-flet ((filter (obj type size) (declare (ignore size)) (when (= type code-header-widetag) - (funcall fun obj))) - (nofilter (obj type size) - (declare (ignore type size)) - (funcall fun obj))) - #+cheneygc (map-allocated-objects #'filter :all) - #+gencgc + (funcall fun obj)))) (without-gcing #+immobile-code - (map-objects-in-range #'nofilter + (map-objects-in-range #'filter (ash text-space-start (- n-fixnum-tag-bits)) (%make-lisp-obj (sap-int *text-space-free-pointer*))) (alien-funcall (extern-alien "close_code_region" (function void))) - (walk-dynamic-space #'nofilter + (walk-dynamic-space #'filter #b1111111 ; all generations #b111 #b111)))) ; type mask and constraint diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index 032bbf4c9b..51f7f41bdc 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -199,6 +199,21 @@ (sb-kernel::decode-internal-error-args (sap+ pc 1) trap-number))))) +(defun write-funinstance-prologue (fin) + ;; Encode: MOV RAX,[RIP+9] / JMP [RAX-3] / 6-byte NOP + (declare (ignorable fin)) + #-immobile-space (return-from write-funinstance-prologue) + (with-pinned-objects (fin) + (let* ((sap (sap+ (int-sap (get-lisp-obj-address fin)) + (- (ash 2 word-shift) fun-pointer-lowtag)))) + ;; Scavenging these words when you shouldn't is actually harmless + ;; because by a stroke of luck, they all look fixnum-tagged. + (setf (sap-ref-sap sap -8) sap + (sap-ref-word sap 0) #xFF00000009058B48 + (sap-ref-word sap 8) #x0000441F0F66FD60))) + (update-dynamic-space-code-tree fin) + fin) + #+immobile-space (defun alloc-immobile-fdefn () (alloc-immobile-fixedobj fdefn-size @@ -208,6 +223,8 @@ #+immobile-code (progn (defconstant trampoline-entry-offset n-word-bytes) +;;; TODO: a simplifying trampoline should be a funcallable-instance, +;;; and not a simple-fun-less piece of code. (defun make-simplifying-trampoline (fun) ;; 'alloc' is compiled after this file so we don't see the derived type. ;; But slam found a conflict on recompile. @@ -217,25 +234,9 @@ (let ((sap (sap+ (code-instructions code) trampoline-entry-offset)) (ea (+ (logandc2 (get-lisp-obj-address code) lowtag-mask) (ash code-debug-info-slot word-shift)))) - ;; For a funcallable-instance, the instruction sequence is: - ;; MOV RAX, [RIP-n] ; load the function - ;; MOV RAX, [RAX+5] ; load the funcallable-instance-fun - ;; JMP [RAX-3] - ;; Otherwise just instructions 1 and 3 will do. - ;; We could use the #xA1 opcode to save a byte, but that would - ;; be another headache do deal with when relocating this code. - ;; There's precedent for this style of hand-assembly, - ;; in arch_write_linkage_table_entry() and arch_do_displaced_inst(). (setf (sap-ref-32 sap 0) #x058B48 ; REX MOV [RIP-n] - (signed-sap-ref-32 sap 3) (- ea (+ (sap-int sap) 7))) ; disp - (let ((i (if (/= (%fun-pointer-widetag fun) funcallable-instance-widetag) - 7 - (let ((disp8 (- (ash funcallable-instance-function-slot - word-shift) - fun-pointer-lowtag))) ; = 5 - (setf (sap-ref-32 sap 7) (logior (ash disp8 24) #x408B48)) - 11)))) - (setf (sap-ref-32 sap i) #xFD60FF))) ; JMP [RAX-3] + (signed-sap-ref-32 sap 3) (- ea (+ (sap-int sap) 7)); disp + (sap-ref-32 sap 7) #xFD60FF)) ; JMP [RAX-3] ;; Verify that the jump table size reads as 0. (aver (zerop (code-jump-table-words code))) ;; It is critical that there be a trailing 'uint16' of 0 in this object @@ -246,60 +247,8 @@ code)) ;;; Return T if FUN can't be called without loading RAX with its descriptor. -;;; This is true of any funcallable instance which is not a GF, and closures. (defun fun-requires-simplifying-trampoline-p (fun) - (case (%fun-pointer-widetag fun) - (#.sb-vm:closure-widetag t) - (#.sb-vm:funcallable-instance-widetag - ;; if the FIN has no raw words then it has no internal trampoline - (sb-kernel::bitmap-all-taggedp (%fun-layout fun))))) - -;; TODO: put a trampoline in all fins and allocate them anywhere. -;; Revision e7cd2bd40f5b9988 caused some FINs to go in dynamic space -;; which is fine, but those fins need to have a default bitmap of -1 instead -;; of a special bitmap because we examine the bitmap when deciding whether -;; the FIN can be installed into an FDEFN without needing an external trampoline. -;; The easiest way to achieve this intent is to default all bitmaps to -1, -;; then change it in the layout when writing raw words. A better fix would -;; try to allocate all FINs in immobile space until it is exhausted, then fallback -;; to dynamic space. The address of the fin is no longer an issue, since fdefns -;; can point to the entire address space, but the fixed-size immobile object -;; allocator doesn't returns 0 - it calls the monitor if it fails. - -;; So ideally, all funcallable instances would resemble simple-funs for a -;; small added cost of 2 words per object. It will be necessary to have the GC -;; treat ambiguous interior pointers to the unboxed words in the same way as -;; any code pointer. Placing FINs on pages marked as containing code will allow -;; the conservative root check to be skipped for obviously non-code objects. - -;; Also we will need to write the embedded trampoline either in a word index -;; that differs based on length of the FIN, or place the boxed slots after -;; the trampoline. As of now, this can only deal with standard GFs. -;; The primitive object has 2 descriptor slots (fin-fun and CLOS slot vector) -;; and 2 non-descriptor slots containing machine instructions, after the -;; self-pointer (trampoline) slot. Scavenging the self-pointer is unnecessary -;; though harmless. This intricate and/or obfuscated calculation of #b110 -;; is insensitive to the index of the trampoline slot, probably. -(defun make-immobile-funinstance (layout slot-vector) - (let ((gf (truly-the funcallable-instance - (alloc-immobile-fixedobj 6 ; KLUDGE - (logior (ash 5 n-widetag-bits) - funcallable-instance-widetag))))) - ;; Assert that raw bytes will not cause GC invariant lossage - (aver (not (sb-kernel::bitmap-all-taggedp layout))) - ;; Set layout prior to writing raw slots - (setf (%fun-wrapper gf) layout) - ;; just being pedantic - liveness is preserved by the stack reference. - (with-pinned-objects (gf) - (let* ((addr (logandc2 (get-lisp-obj-address gf) lowtag-mask)) - (sap (int-sap addr)) - (insts-offs (ash (1+ funcallable-instance-info-offset) word-shift))) - (setf (sap-ref-word sap (ash funcallable-instance-trampoline-slot word-shift)) - (truly-the word (+ addr insts-offs)) - (sap-ref-word sap insts-offs) #xFFFFFFE9058B48 ; MOV RAX,[RIP-23] - (sap-ref-32 sap (+ insts-offs 7)) #x00FD60FF))) ; JMP [RAX-3] - (setf (%funcallable-instance-info gf 0) slot-vector) - gf)) + (= (%fun-pointer-widetag fun) closure-widetag)) (defun fdefn-has-static-callers (fdefn) (declare (type fdefn fdefn)) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index 76799549ba..60d6a23801 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -277,12 +277,8 @@ during backtrace. :alloc-trans %make-funcallable-instance) (trampoline :init :funcallable-instance-tramp) #-compact-instance-header (layout :set-trans %set-fun-layout :ref-trans %fun-layout) - ;; TODO: if we can switch places of 'function' and 'fsc-instance-slots' - ;; (at least for the builds with compact-instance-header) - ;; then for both funcallable and non-funcallable instances, - ;; the CLOS slot vector will be in the word 5 bytes past the tagged pointer. - ;; This shouldn't be too hard to arrange, since nothing needs to know where - ;; the tagged function lives except the funcallable instance trampoline. + #+compact-instance-header (instword1) + #+compact-instance-header (instword2) (function :type function :ref-known (flushable) :ref-trans %funcallable-instance-fun :set-known () :set-trans (setf %funcallable-instance-fun)) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index 9078390a3f..b32939c935 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -873,8 +873,9 @@ (flet ((alloc (name words type lowtag stack-allocate-p result - &optional alloc-temp node + &optional alloc-temp node vop &aux (bytes (pad-data-block words))) + (declare (ignorable vop)) #+bignum-assertions (when (eq type bignum-widetag) (setq bytes (* bytes 2))) ; use 2x the space (progn name) ; possibly not used @@ -883,9 +884,15 @@ (pseudo-atomic (:elide-if stack-allocate-p :thread-tn thread-tn) ;; If storing a header word, defer ORing in the lowtag until after ;; the header is written so that displacement can be 0. - (if stack-allocate-p - (stack-allocation bytes (if type 0 lowtag) result) - (allocation nil bytes (if type 0 lowtag) result node alloc-temp thread-tn)) + (cond (stack-allocate-p + (stack-allocation bytes (if type 0 lowtag) result)) + #+immobile-space + ((eql type funcallable-instance-widetag) + (inst push bytes) + (invoke-asm-routine 'call 'alloc-funinstance vop) + (inst pop result)) + (t + (allocation nil bytes (if type 0 lowtag) result node alloc-temp thread-tn))) (let ((header (compute-object-header words type))) (cond #+compact-instance-header ((and (eq name '%make-structure-instance) stack-allocate-p) @@ -909,8 +916,9 @@ (:results (result :scs (descriptor-reg))) (:temporary (:sc unsigned-reg) alloc-temp) #+gs-seg (:temporary (:sc unsigned-reg :offset 15) thread-tn) + (:vop-var vop) (:node-var node) - (:generator 50 (alloc name words type lowtag dx result alloc-temp node))) + (:generator 50 (alloc name words type lowtag dx result alloc-temp node vop))) (define-vop (sb-c::fixed-alloc-to-stack) (:info name words type lowtag dx) (:results (result :scs (descriptor-reg))) diff --git a/src/pcl/braid.lisp b/src/pcl/braid.lisp index 739600bc7d..16bec02fdb 100644 --- a/src/pcl/braid.lisp +++ b/src/pcl/braid.lisp @@ -267,8 +267,6 @@ ;; We decide only at class finalization time whether it is funcallable. ;; Picking the right bitmap could probably be done sooner given the metaclass, ;; but this approach avoids changing how PCL uses MAKE-LAYOUT. - ;; The big comment above MAKE-IMMOBILE-FUNINSTANCE in src/code/x86-64-vm - ;; explains why we differentiate between SGF and everything else. ;; FIXME: we should assert that this is not a STRUCTURE-OBJECT, ;; because there must not be additional ID words preceding the bitmap. ;; STANDARD-OBJECT can't generally use a fixed number of ID slots @@ -277,13 +275,9 @@ ;; to superclasses, so maybe it's possible. (dovector (ancestor inherits) (when (eq ancestor #.(find-layout 'function)) - (%raw-instance-set/signed-word layout (sb-kernel::type-dd-length sb-vm:layout) - #+immobile-code ; there are two possible bitmaps - (if (or (find *sgf-wrapper* inherits) (eq wrapper *sgf-wrapper*)) - sb-kernel::standard-gf-primitive-obj-layout-bitmap - +layout-all-tagged+) - ;; there is only one possible bitmap otherwise - #-immobile-code sb-kernel::standard-gf-primitive-obj-layout-bitmap)) + (%raw-instance-set/signed-word + layout (sb-kernel::type-dd-length sb-vm:layout) + sb-kernel::standard-gf-primitive-obj-layout-bitmap)) (setq flags (logior (logand (logior +sequence-layout-flag+ +stream-layout-flag+ +simple-stream-layout-flag+ diff --git a/src/pcl/class-init.lisp b/src/pcl/class-init.lisp index 3265427d88..450c5dd488 100644 --- a/src/pcl/class-init.lisp +++ b/src/pcl/class-init.lisp @@ -70,19 +70,9 @@ (load-time-value (make-array 1 :element-type '(and fixnum unsigned-byte))) most-positive-fixnum))) (slots (make-array (wrapper-length wrapper) :initial-element +slot-unbound+)) - (fin (cond #+(and immobile-code) - ((not (sb-kernel::bitmap-all-taggedp (wrapper-friend wrapper))) - (let ((f (truly-the funcallable-instance - (sb-vm::make-immobile-funinstance wrapper slots)))) - ;; set the upper 4 bytes of wordindex 5 - (sb-sys:with-pinned-objects (f) - (setf (sb-impl::fsc-instance-trailer-hash f) (ldb (byte 32 0) hash))) - f)) - (t - (let ((f (truly-the funcallable-instance - (%make-standard-funcallable-instance slots hash)))) - (setf (%fun-wrapper f) wrapper) - f))))) + (fin (truly-the funcallable-instance + (%make-standard-funcallable-instance slots hash)))) + (setf (%fun-wrapper fin) wrapper) (setf (%funcallable-instance-fun fin) (lambda (&rest args) (declare (ignore args)) @@ -183,15 +173,11 @@ (multiple-value-bind (slots cpl default-initargs direct-subclasses) (!early-collect-inheritance name) (let* ((class (find-class name)) - ;; With #+compact-instance-header there are two possible bitmaps - ;; for funcallable instances - for self-contained trampoline - ;; instructions and external trampoline instructions. - ;; With #-compact-instance-header all funcallable layouts - ;; need the same bitmap, which is that of standard-GF. - ;; These requirements are checked in verify_range() of gencgc. + ;; All funcallable objects get the bitmap of standard-GF. + ;; This is checked in verify_range() of gencgc. (bitmap (if (memq name '(standard-generic-function - #-compact-instance-header funcallable-standard-object - #-compact-instance-header generic-function)) + funcallable-standard-object + generic-function)) sb-kernel::standard-gf-primitive-obj-layout-bitmap +layout-all-tagged+)) (wrapper (cond ((eq class slot-class) diff --git a/src/pcl/pre-warm.lisp b/src/pcl/pre-warm.lisp index ad2d5d05ca..d75fec221f 100644 --- a/src/pcl/pre-warm.lisp +++ b/src/pcl/pre-warm.lisp @@ -52,10 +52,6 @@ ;;; function creation there is no danger of having the system get ;;; confused. -;;; FIXME: these all go in dynamic space and then allocate a trampoline when -;;; assigned into an FDEFN. Figure out how to put them in immobile space, -;;; or can we allocate them _anywhere_ with embedded code now? I think so! -;;; And why do we assign these info FDEFNs? What calls them via their names? #-sb-xc-host ; host doesn't need (progn (!defstruct-with-alternate-metaclass %method-function @@ -65,10 +61,6 @@ :metaclass-name static-classoid :metaclass-constructor make-static-classoid :dd-type funcallable-structure) -;;; Note: for x8-64 with #+immobile-code there are 2 additional raw slots which -;;; hold machine instructions to load the funcallable-instance-fun and jump to -;;; it, so that funcallable-instances can act like simple-funs, in as much as -;;; there's an address you can jump to without loading a register. (sb-kernel:!defstruct-with-alternate-metaclass standard-funcallable-instance :slot-names (clos-slots hash-code) :constructor %make-standard-funcallable-instance diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index f596778d08..4647750874 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -446,9 +446,13 @@ scav_fun_pointer(lispobj *where, lispobj object) /* funcallable-instance might have all descriptor slots * except for the trampoline, which points to an asm routine. * This is not true for self-contained trampoline GFs though. */ +#ifdef LISP_FEATURE_IMMOBILE_SPACE + page_type = PAGE_TYPE_CODE, region = code_region; +#else struct layout* layout = (void*)native_pointer(funinstance_layout(FUNCTION(object))); if (layout && (layout_flags(layout) & STRICTLY_BOXED_FLAG)) page_type = PAGE_TYPE_BOXED, region = boxed_region; +#endif } else { /* Closures can always go on strictly boxed pages even though the * underlying function is (possibly) an untagged pointer. @@ -462,6 +466,14 @@ scav_fun_pointer(lispobj *where, lispobj object) } copy = gc_copy_object(object, 1+SHORT_BOXED_NWORDS(*fun), region, page_type); gc_assert(copy != object); +#ifdef LISP_FEATURE_IMMOBILE_SPACE + if (widetag == FUNCALLABLE_INSTANCE_WIDETAG) { + struct funcallable_instance* old = (void*)native_pointer(object); + struct funcallable_instance* new = (void*)native_pointer(copy); + if (old->trampoline == (lispobj)&old->instword1) + new->trampoline = (lispobj)&new->instword1; + } +#endif set_forwarding_pointer(fun, copy); } if (copy != object) *where = copy; @@ -959,15 +971,14 @@ scav_funinstance(lispobj *where, lispobj header) scav1(&layoutptr, layoutptr); if (layoutptr != old) funinstance_layout(where) = layoutptr; #endif - // Do a similar thing as scav_instance but without any special cases. - struct bitmap bitmap = get_layout_bitmap(LAYOUT(layoutptr)); - gc_assert(bitmap.nwords == 1); - sword_t mask = bitmap.bits[0]; - ++where; - lispobj* limit = where + nslots; - lispobj obj; - for ( ; where < limit ; mask >>= 1, ++where ) - if ((mask & 1) && is_lisp_pointer(obj = *where)) scav1(where, obj); + struct funcallable_instance* fin = (void*)where; +#ifdef LISP_FEATURE_IMMOBILE_SPACE + // payload: entry addr, 2 raw words, implementation function + scavenge(&fin->function, nslots-3); +#else + // payload: trampoline entry addr, layout, implementation function, ... + scavenge(&fin->function, nslots-2); +#endif return 1 + (nslots | 1); } diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index b4c7ddf4d3..30782480ed 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1872,12 +1872,13 @@ lispobj *search_dynamic_space(void *pointer) lispobj node = brothertree_find_lesseql((uword_t)pointer, SYMBOL(DYNSPACE_CODEBLOB_TREE)->value); if (node != NIL) { - lispobj *codeblob = (lispobj*)((struct binary_node*)INSTANCE(node))->key; - if (widetag_of(codeblob) != CODE_HEADER_WIDETAG) - lose("widetag @ %p is not code? %"OBJ_FMTX"\n", codeblob, *codeblob); - int nwords = code_total_nwords((struct code*)codeblob); - lispobj *upper_bound = codeblob + nwords; - if (pointer < (void*)upper_bound) return codeblob; + lispobj *found = (lispobj*)((struct binary_node*)INSTANCE(node))->key; + int widetag = widetag_of(found); + if (widetag != CODE_HEADER_WIDETAG && widetag != FUNCALLABLE_INSTANCE_WIDETAG) + lose("header not OK for code page: @ %p = %"OBJ_FMTX"\n", found, *found); + int nwords = object_size(found); + lispobj *upper_bound = found + nwords; + if (pointer < (void*)upper_bound) return found; } } lispobj *start; @@ -2019,11 +2020,22 @@ static lispobj conservative_root_p(lispobj addr, page_index_t addr_page_index) /* This search must not fail. We've already verified that the * pointer is within range for its page. */ gc_assert(object_start); - // If 'addr' points anywhere beyond the boxed words, it's valid - if (widetag_of(object_start) != FILLER_WIDETAG - && (instruction_ptr_p((void*)addr, object_start) - || addr == make_lispobj(object_start, OTHER_POINTER_LOWTAG))) - return make_lispobj(object_start, OTHER_POINTER_LOWTAG); + switch (widetag_of(object_start)) { + case CODE_HEADER_WIDETAG: + // If 'addr' points anywhere beyond the boxed words, it's valid + // (i.e. allow it even if an incorrectly tagged pointer to a simple-fun header) + if (instruction_ptr_p((void*)addr, object_start) + || addr == make_lispobj(object_start, OTHER_POINTER_LOWTAG)) + return make_lispobj(object_start, OTHER_POINTER_LOWTAG); + return 0; +#ifdef LISP_FEATURE_X86_64 + case FUNCALLABLE_INSTANCE_WIDETAG: + if ((addr >= (uword_t)(object_start+2) && addr < (uword_t)(object_start+4)) + || addr == make_lispobj(object_start, FUN_POINTER_LOWTAG)) + return make_lispobj(object_start, FUN_POINTER_LOWTAG); + return 0; +#endif + } return 0; } @@ -2903,7 +2915,7 @@ update_writeprotection(page_index_t first_page, page_index_t last_page, /* Now we attempt to find any 1 "witness" that the pages should NOT be protected. * If such witness is found, then return without doing anything, otherwise * apply protection to the range. */ - lispobj* witness = range_dirty_p(where, limit, page_table[first_page].gen); + lispobj* witness = range_dirty_p(where, limit, page_table[first_page].gen); if (witness) return witness; for (page = first_page; page <= last_page; ++page) { @@ -2958,6 +2970,10 @@ update_code_writeprotection(page_index_t first_page, page_index_t last_page, case CODE_HEADER_WIDETAG: if (header_rememberedp(*where)) return; break; + case FUNCALLABLE_INSTANCE_WIDETAG: + if (range_dirty_p(where, where+headerobj_size(where), page_table[first_page].gen)) + return; + break; } } for (i = first_page; i <= last_page; i++) assign_page_card_marks(i, CARD_UNMARKED); @@ -5106,6 +5122,18 @@ lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words, unsigned boxed) } #ifdef LISP_FEATURE_X86_64 +NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI alloc_funinstance(sword_t nbytes) +{ + struct thread *th = get_sb_vm_thread(); + int result = mutex_acquire(&code_allocator_lock); + gc_assert(result); + void* mem = lisp_alloc(0, code_region, nbytes, PAGE_TYPE_CODE, th); + result = mutex_release(&code_allocator_lock); + gc_assert(result); + memset(mem, 0, nbytes); + return (lispobj)mem; +} + /* Make a list that couldn't be inline-allocated. Break it up into contiguous * blocks of conses not to exceed one GC page each. */ NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI make_list(lispobj element, sword_t nbytes) { diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 51a3f6a615..4e9a6c62b8 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -549,8 +549,7 @@ boolean immobile_space_preserve_pointer(void* addr) char* page_start_addr = PTR_ALIGN_DOWN(addr, IMMOBILE_CARD_BYTES); object_start = (lispobj*)(page_start_addr + obj_index * obj_spacing); valid = !fixnump(*object_start) - && (widetag_of(object_start) == FUNCALLABLE_INSTANCE_WIDETAG || - widetag_of(object_start) == FDEFN_WIDETAG || + && (widetag_of(object_start) == FDEFN_WIDETAG || properly_tagged_descriptor_p(addr, object_start)); } else if (compacting_p() && (lispobj*)addr < tlsf_mem_start) { // Can ignore this pointer if it's point to pseudostatic text @@ -837,13 +836,7 @@ fixedobj_points_to_younger_p(lispobj* obj, int n_words, case FDEFN_WIDETAG: if (younger_p(decode_fdefn_rawfun((struct fdefn*)obj), gen, keep_gen, new_gen)) return 1; break; // proceed to other slots as usual (harmlessly revisiting 'raw_addr') - case CODE_HEADER_WIDETAG: - // This is a simplifying trampoline around a closure or FIN. - // The only pointerish slot is debug_info (the called function). - // The size slot is a descriptor, though a non-pointer. - return younger_p(((struct code*)obj)->debug_info, gen, keep_gen, new_gen); case INSTANCE_WIDETAG: - case FUNCALLABLE_INSTANCE_WIDETAG: layout = instance_layout(obj); if (!layout) return 0; // object can't have pointers in it yet if (younger_p(layout, gen, keep_gen, new_gen)) @@ -1435,10 +1428,6 @@ search_immobile_space(void *pointer) return NULL; } -// FIXME: Figure out not to hardcode -#define FUN_TRAMP_SIZE 6 -#define GF_SIZE 6 - //// Defragmentation // Given an address in the target core, return the equivalent @@ -1609,11 +1598,6 @@ static void fixup_space(lispobj* where, size_t n_words) break; case CLOSURE_WIDETAG: where[1] = adjust_fun_entrypoint(where[1]); - // FALLTHROUGH_INTENDED -#ifndef LISP_FEATURE_COMPACT_INSTANCE_HEADER - case FUNCALLABLE_INSTANCE_WIDETAG: -#endif - // skip the trampoline word at where[1] adjust_words(where+2, size-2); break; case FDEFN_WIDETAG: @@ -1750,8 +1734,6 @@ static void place_fixedobj(lispobj* obj, int size_in_bytes, gc_assert(!*tempspace_addr(new)); // better not clobber some other object memcpy(tempspace_addr(new), obj, size_in_bytes); set_forwarding_pointer(obj, make_lispobj(new, LOWTAG_FOR_WIDETAG(widetag))); - if (widetag == FUNCALLABLE_INSTANCE_WIDETAG) // fix the self-pointer - tempspace_addr(new)[1] = (lispobj)(new + 4*N_WORD_BYTES); *alloc_ptr = new + size_in_bytes; } @@ -1808,19 +1790,6 @@ static void place_layout(lispobj* obj, layout_size_class_nwords(size_class_index) << WORD_SHIFT; } -static boolean executable_object_p(lispobj* obj) -{ - int widetag = widetag_of(obj); - int answer = widetag == FDEFN_WIDETAG || - (widetag == CODE_HEADER_WIDETAG && code_header_words((struct code*)obj) >= 3 - /* The debug_info slot of a "simplifying trampoline" contains a pointer - * to the original closure or funcallable instance */ - && lowtag_of(((struct code*)obj)->debug_info) == FUN_POINTER_LOWTAG) - || widetag == FUNCALLABLE_INSTANCE_WIDETAG; - gc_assert(!answer); - return answer; -} - static void defrag_immobile_space(boolean verbose) { int i; @@ -1835,17 +1804,6 @@ static void defrag_immobile_space(boolean verbose) struct size_class layout_size_class[MAX_LAYOUT_DEFRAG_SIZE_CLASSES]; bzero(layout_size_class, sizeof layout_size_class); - // Count the fdefns, trampolines, and GFs already in text sapace. - // There are 3 kinds of code objects we might see - - // (1) ordinary code, (2) trampolines, (3) filler - // Make sure only to count the trampolines on this pass. - lispobj* obj = (lispobj*)TEXT_SPACE_START; - while (obj < text_space_highwatermark) { - int widetag = widetag_of(obj); - if (executable_object_p(obj)) ++obj_type_histo[widetag/4]; - obj += sizetab[widetag](obj); - } - #if DEFRAGMENT_FIXEDOBJ_SUBSPACE // Find the starting address of fixed-size objects that will undergo defrag. // Never move the first pages of LAYOUTs created by genesis. @@ -1908,13 +1866,9 @@ static void defrag_immobile_space(boolean verbose) symbol_alloc_ptrs[i] + calc_n_fixedobj_pages( sym_kind_histo[i].count, sym_kind_histo[i].size) * IMMOBILE_CARD_BYTES; int n_fdefn_pages = calc_n_fixedobj_pages(obj_type_histo[FDEFN_WIDETAG/4], FDEFN_SIZE); - int n_tramp_pages = calc_n_fixedobj_pages(obj_type_histo[CODE_HEADER_WIDETAG/4], FUN_TRAMP_SIZE); - int n_gf_pages = calc_n_fixedobj_pages(obj_type_histo[FUNCALLABLE_INSTANCE_WIDETAG/4], GF_SIZE); char* fdefn_alloc_ptr = symbol_alloc_ptrs[N_SYMBOL_KINDS]; - char* tramp_alloc_ptr = fdefn_alloc_ptr + n_fdefn_pages * IMMOBILE_CARD_BYTES; - char* gf_alloc_ptr = tramp_alloc_ptr + n_tramp_pages * IMMOBILE_CARD_BYTES; fixedobj_tempspace.n_bytes = - gf_alloc_ptr + n_gf_pages * IMMOBILE_CARD_BYTES - (char*)FIXEDOBJ_SPACE_START; + fdefn_alloc_ptr + n_fdefn_pages * IMMOBILE_CARD_BYTES - (char*)FIXEDOBJ_SPACE_START; fixedobj_tempspace.start = calloc(fixedobj_tempspace.n_bytes, 1); // Copy pages below the defrag base into the temporary copy. @@ -1956,8 +1910,7 @@ static void defrag_immobile_space(boolean verbose) text_tempspace.start = calloc(text_tempspace.n_bytes, 1); if (verbose) - printf("(fin,inst,fdefn,code,sym)=%d+%d+%d+%d+%d... ", - obj_type_histo[FUNCALLABLE_INSTANCE_WIDETAG/4], + printf("(inst,fdefn,code,sym)=%d+%d+%d+%d... ", obj_type_histo[INSTANCE_WIDETAG/4], obj_type_histo[FDEFN_WIDETAG/4], obj_type_histo[CODE_HEADER_WIDETAG/4] + n_code_components, @@ -1999,8 +1952,6 @@ static void defrag_immobile_space(boolean verbose) bzero(alloc_ptrs, sizeof alloc_ptrs); alloc_ptrs[INSTANCE_WIDETAG/4] = layout_alloc_ptr; alloc_ptrs[FDEFN_WIDETAG/4] = fdefn_alloc_ptr; - alloc_ptrs[CODE_HEADER_WIDETAG/4] = tramp_alloc_ptr; - alloc_ptrs[FUNCALLABLE_INSTANCE_WIDETAG/4] = gf_alloc_ptr; // Permute fixed-sized object pages and deposit forwarding pointers. for ( page_index = find_fixedobj_page_index(defrag_base) ; diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index 93b7c1fc87..5353ec58a9 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -198,9 +198,7 @@ static int verify_headered_object(lispobj* object, sword_t nwords, CHECK(layout, object); struct bitmap bitmap = get_layout_bitmap(LAYOUT(layout)); if (widetag_of(object) == FUNCALLABLE_INSTANCE_WIDETAG) { -#ifdef LISP_FEATURE_COMPACT_INSTANCE_HEADER - gc_assert(bitmap.bits[0] == (sword_t)-1 || bitmap.bits[0] == (sword_t)6); -#else +#ifndef LISP_FEATURE_COMPACT_INSTANCE_HEADER gc_assert(bitmap.bits[0] == (sword_t)-4); #endif } @@ -333,6 +331,8 @@ static int verify_range(lispobj* start, lispobj* end, struct verify_state* state if (widetag == CODE_HEADER_WIDETAG) { if (!is_code(page_table[pg].type)) lose("object @ %p is code on non-code page", where); + } else if (widetag == FUNCALLABLE_INSTANCE_WIDETAG) { + // where these reside depends on the architecture } else { if (is_code(page_table[pg].type)) lose("object @ %p is non-code on code page", where); diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 74185bc4d8..9374fba185 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -604,22 +604,18 @@ lispobj decode_fdefn_rawfun(struct fdefn* fdefn) { // decide to rewrite the raw_addr slot of the fdefn. // This logic is rather nasty, but I don't know what else to do. lispobj word; + int widetag; if (header_widetag(word = raw_addr[-2]) == SIMPLE_FUN_WIDETAG + || header_widetag(word) == FUNCALLABLE_INSTANCE_WIDETAG || (word == FORWARDING_HEADER && - widetag_of(native_pointer(forwarding_pointer_value(raw_addr-2))) - == SIMPLE_FUN_WIDETAG)) + ((widetag=widetag_of(native_pointer(forwarding_pointer_value(raw_addr-2)))) + == SIMPLE_FUN_WIDETAG || widetag == FUNCALLABLE_INSTANCE_WIDETAG))) return make_lispobj(raw_addr - 2, FUN_POINTER_LOWTAG); - int widetag; if ((widetag = header_widetag(word = raw_addr[-4])) == CODE_HEADER_WIDETAG || (word == FORWARDING_HEADER && widetag_of(native_pointer(forwarding_pointer_value(raw_addr-4))) == CODE_HEADER_WIDETAG)) return make_lispobj(raw_addr - 4, OTHER_POINTER_LOWTAG); - if (widetag == FUNCALLABLE_INSTANCE_WIDETAG - || (word == FORWARDING_HEADER && - widetag_of(native_pointer(forwarding_pointer_value(raw_addr-4))) - == FUNCALLABLE_INSTANCE_WIDETAG)) - return make_lispobj(raw_addr - 4, FUN_POINTER_LOWTAG); lose("Unknown object in fdefn raw addr: %p", raw_addr); } diff --git a/tests/fin-call.impure.lisp b/tests/fin-call.impure.lisp index 968ccfe954..64f34e9d92 100644 --- a/tests/fin-call.impure.lisp +++ b/tests/fin-call.impure.lisp @@ -18,7 +18,7 @@ (setf (fdefinition 'zonk) (make-instance 'foo :function (lambda (y) y))) (with-test (:name :call-nonstandard-funcallable-instance) - #+immobile-code + #+nil (let* ((fdefn (sb-int:find-fdefn 'zonk)) (raw-entry-point (sb-sys:sap-ref-sap (sb-sys:int-sap (sb-kernel:get-lisp-obj-address fdefn)) diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index 3e60a9f22c..0c65805dda 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -235,7 +235,9 @@ (declare ((and fixnum (integer 1)) size)) ;; M-A-O disables GC, therefore GET-LISP-OBJ-ADDRESS is safe (let ((obj-addr (sb-kernel:get-lisp-obj-address obj)) - (array (cond ((= type sb-vm:code-header-widetag) + (array (cond ((member type `(,sb-vm:code-header-widetag + #+compact-instance-header + ,sb-vm:funcallable-instance-widetag)) (incf total-code-size size) code-bits) (t diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index f7eab46bc4..e5aeb5f7c8 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -814,11 +814,6 @@ lines) 1)))) -#+compact-instance-header -(with-test (:name :gf-self-contained-trampoline) - (let ((l (sb-kernel:find-layout 'standard-generic-function))) - (assert (/= (sb-kernel:wrapper-bitmap l) sb-kernel:+layout-all-tagged+)))) - (with-test (:name :known-array-rank) (flet ((try (type) (let ((lines From 223b0eb11c03a0831bc87025ec094d8e5f8f35fd Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 8 Aug 2022 22:37:59 +0300 Subject: [PATCH 3809/4023] Combine more other-pointer type testing VOPs. Including the ones which are not defined using define-type-vop. --- src/compiler/generic/type-vops.lisp | 17 ++++++++--------- src/compiler/ir2opt.lisp | 25 ++++++++++++++++++------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/compiler/generic/type-vops.lisp b/src/compiler/generic/type-vops.lisp index de99527d94..83d9f2a176 100644 --- a/src/compiler/generic/type-vops.lisp +++ b/src/compiler/generic/type-vops.lisp @@ -21,25 +21,24 @@ ;;; from its default definition, so that's gotta be allowed, or else make-host-2 ;;; would produce a null expansion for every type-vop. (defmacro define-type-vop (pred-name type-codes) - (awhen (gethash pred-name sb-c::*backend-parsed-vops*) - (unless (string= (sb-c::vop-parse-note it) "defaulted") - (return-from define-type-vop))) (let ((cost (if (> (reduce #'max type-codes :key #'eval) lowtag-limit) 7 4))) `(progn - (define-vop (,pred-name type-predicate) - (:translate ,pred-name) - (:note "defaulted") - (:generator ,cost - (test-type value temp target not-p ,type-codes :value-tn-ref args))) (let ((type-codes (list ,@type-codes))) (when (loop for type in type-codes never (or (< type lowtag-limit) (memq type +immediate-types+) (memq type +function-widetags+))) (setf (getf *other-pointer-type-vops* ',pred-name) - (canonicalize-widetags type-codes))))))) + (canonicalize-widetags type-codes)))) + ,(unless (awhen (gethash pred-name sb-c::*backend-parsed-vops*) + (string/= (sb-c::vop-parse-note it) "defaulted")) + `(define-vop (,pred-name type-predicate) + (:translate ,pred-name) + (:note "defaulted") + (:generator ,cost + (test-type value temp target not-p ,type-codes :value-tn-ref args))))))) (define-type-vop unbound-marker-p (unbound-marker-widetag)) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 70c42c6114..bc7588717c 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -585,6 +585,12 @@ (setf block (ir2-block-next block))))) (defun branch-destination (branch &optional (true t)) + (unless (vop-codegen-info branch) + (let ((next (vop-next branch))) + (if (and next + (eq (vop-name next) 'branch-if)) + (setf branch next) + (return-from branch-destination)))) (destructuring-bind (label not-p &rest rest) (vop-codegen-info branch) (declare (ignore rest)) (if (eq not-p true) @@ -1170,13 +1176,18 @@ (third info) (getf sb-vm::*other-pointer-type-vops* (vop-name vop))) do - (emit-and-insert-vop (vop-node vop) - (vop-block vop) - test-vop - (reference-tn widetag nil) - nil - vop - (list (first info) (second info) tags)) + (let ((next (vop-next vop))) + (when (and next + (eq (vop-name next) 'branch-if)) + (setf info (vop-codegen-info next)) + (delete-vop next)) + (emit-and-insert-vop (vop-node vop) + (vop-block vop) + test-vop + (reference-tn widetag nil) + nil + vop + (list (first info) (second info) tags))) (delete-vop vop)))))))) nil) From 390809ae6f32b8dfbf4f5bd3a10425553f0fb7cd Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 8 Aug 2022 21:41:26 -0400 Subject: [PATCH 3810/4023] Remove obsolete junk Codeblobs never act as page fillers --- src/cold/exports.lisp | 1 - src/runtime/code.h | 5 +---- tools-for-build/editcore.lisp | 7 ------- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 880302cf58..f817f29f95 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2513,7 +2513,6 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "%CODE-FUN-OFFSET" "CODE-N-ENTRIES" "CODE-N-NAMED-CALLS" - "CODE-OBJ-IS-FILLER-P" "%DENOMINATOR" "%OTHER-POINTER-P" "%OTHER-POINTER-SUBTYPE-P" diff --git a/src/runtime/code.h b/src/runtime/code.h index fc90d8a221..df11843489 100644 --- a/src/runtime/code.h +++ b/src/runtime/code.h @@ -56,10 +56,7 @@ static inline unsigned int* code_fun_table(struct code* code) { return (unsigned int*)((char*)code + N_WORD_BYTES*code_total_nwords(code) - 4); } static inline unsigned short code_trailer_len(struct code* code) { - // Do not attempt to read the trailer len from a code page filler object. - // Fillers are recognizable by boxed_size == 0. - return code->boxed_size ? - *(unsigned short*)((char*)code + N_WORD_BYTES*code_total_nwords(code) - 2) : 0; + return *(unsigned short*)((char*)code + N_WORD_BYTES*code_total_nwords(code) - 2); } static inline unsigned short code_n_funs(struct code* code) { // Do not attempt to read the fun table size from a code object with no trailer. diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index 3e4aa5e822..6eb28bd1e1 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1065,13 +1065,6 @@ (objsize (code-object-size code))) (incf total-code-size objsize) (cond - ((< (code-header-words code) 3) ; filler object - (let ((sap (int-sap (- (get-lisp-obj-address code) other-pointer-lowtag)))) - (format output " .quad 0x~x, 0x~x~% .fill 0x~x~%# ~x:~%" - (sap-ref-word sap 0) - (sap-ref-word sap n-word-bytes) - (- objsize (* 2 n-word-bytes)) - (+ code-addr objsize)))) ((%instancep (%code-debug-info code)) ; assume it's a COMPILED-DEBUG-INFO (aver (plusp (code-n-entries code))) (let* ((source From b1f2aebbfc8e0c4bfa7ecce3ca2bbfa758bc2a49 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 9 Aug 2022 11:59:15 -0400 Subject: [PATCH 3811/4023] Update comment to reflect reality --- src/runtime/gencgc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 30782480ed..b675ad9590 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -4379,10 +4379,12 @@ garbage_collect_generation(generation_index_t generation, int raise, maybe_verify: /* After a GC, pages of code are safe to linearly scan because * there won't be random junk on them below page_bytes_used. - * And we don't want to see forwarding pointers on objects in the tree, - * so just erase the tree now. - * This is WRONG for immobile code, but not worse than status quo - * in terms of inability to find objects in the SIGPROF handler etc */ + * But generation 0 pages are _not_ safe to linearly scan because they aren't + * pre-zeroed. The SIGPROF handler could have a bad time if were to misread + * the header of an object mid-creation. Therefore, codeblobs newly made by Lisp + * are kept in a lock-free and threadsafe datastructure. + * Immobile space has its own tree, for other purposes (among them being to find + * page scan start offsets) which is pruned as needed by a finalizer */ SYMBOL(DYNSPACE_CODEBLOB_TREE)->value = NIL; if (generation >= verify_gens) hexdump_and_verify_heap(cur_thread_approx_stackptr, VERIFY_POST_GC | (generation<<16)); From 9d86d1e8f8b27ce5f8081164f33091171494d2c3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 9 Aug 2022 13:38:43 -0400 Subject: [PATCH 3812/4023] Rewrite decode_fdefn_rawfun() to be understandable It's not as frightening as it once was, so much so that I felt it ok to remove the comment about it being a nasty piece of logic. --- src/runtime/x86-64-arch.c | 94 ++++++++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 32 deletions(-) diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 9374fba185..83dad4ad5d 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -584,39 +584,69 @@ arch_set_fp_modes(unsigned int mxcsr) asm ("ldmxcsr %0" : : "m" (temp)); } -/// Return the Lisp object that fdefn's raw_addr slot jumps to. -/// This will either be: -/// (1) a simple-fun, -/// (2) a funcallable-instance with an embedded trampoline that makes -/// it resemble a simple-fun in terms of call convention, or -/// (3) a code-component with no simple-fun within it, that makes -/// closures and other funcallable-instances look like simple-funs. -/// If the fdefn jumps to the UNDEFINED-FDEFN routine, then return 0. +static __attribute__((unused)) boolean codeblob_p(lispobj ptr) { + return lowtag_of(ptr) == OTHER_POINTER_LOWTAG && + widetag_of((lispobj*)(ptr-OTHER_POINTER_LOWTAG)) == CODE_HEADER_WIDETAG; +} + +/* Return the tagged pointer for which 'entrypoint' is the starting address. + * This will be one of the following: + * 1. a fun-pointer which is either + * - a simple-fun header located 2 words before the entrypoint. + * N.B.: This returns the SIMPLE-FUN, and _not_ its containing codeblob. + * - a funcallable-instance with an embedded trampoline that make it + * equivalent to a simple-fun + * 2. a code-component with no simple-fun within it, that makes closures + * callable like simple-funs. The code header is at entrypoint minus 4 words. + * + * By first reading at (entrypoint - 2*N_WORD_BYTES) this does the right thing + * when 'entrypoint' is actually type 2, because the word accessed will not be + * an object header or forwarding marker (it will be whatever %CODE-DEBUG-INFO is). + * Whereis if this were type 1, but we read at (entrypoint - 4*N_WORD_BYTES) first, + * then we could perceive random uninitialized bytes of the preceding object. + */ +static lispobj entrypoint_to_taggedptr(lispobj* entrypoint) { + if (!entrypoint || points_to_asm_code_p((lispobj)entrypoint)) return 0; + // First try + lispobj* phdr = entrypoint - 2; + if (forwarding_pointer_p(phdr)) { + gc_assert(lowtag_of(forwarding_pointer_value(phdr)) == FUN_POINTER_LOWTAG); + return make_lispobj(phdr, FUN_POINTER_LOWTAG); + } + int widetag = widetag_of(phdr); + if (widetag == FUNCALLABLE_INSTANCE_WIDETAG || widetag == SIMPLE_FUN_WIDETAG) { + return make_lispobj(phdr, FUN_POINTER_LOWTAG); + } + // Second try + phdr = entrypoint - 4; + /* It is nearly impossible for forwarding to arise, by this reasoning: + * Case A: if some thread references the codeblob that wraps a closure, + * then the codeblob is pinned; hence not forwarded. + * Case B: if not executing (or otherwise referenced from stack/registers), + * there can exist no other tagged reference to the codeblob. + * Aside from the FDEFN that owns it, the only other untagged reference would + * be from the search tree, which isn't scavenged. (The entire tree dies after GC.) + * It's conceivable the debugger could store a tagged pointer to this entrypoint + * in something, but I tried to make it do so, and couldn't. I was, however, able + * to artificially cause forwarding by putting closure trampolines in symbols */ + if (forwarding_pointer_p(phdr)) + gc_assert(codeblob_p(forwarding_pointer_value(phdr))); + else + gc_assert(widetag_of(phdr) == CODE_HEADER_WIDETAG); + return make_lispobj(phdr, OTHER_POINTER_LOWTAG); +} +/* Return the lisp object that fdefn's raw_addr slot jumps to. + * In the event that the referenced object was forwarded, this returns the un-forwarded + * object (the forwarded value is used to assert some invariants though). + * If the fdefn jumps to the UNDEFINED-FDEFN routine, then return 0. + * + * Some legacy baggage is evident: in the first implementation of immobile fdefns, + * an fdefn used a 'jmp rel32' (relative to itself), and so you could decode the + * jump target only given the address of the fdefn. That is no longer true; fdefns use + * absolute jumps. Therefore it is possible to call entrypoint_to_taggedptr() with any + * raw_addr, whether or not you know the fdefn whence the raw_addr was obtained. */ lispobj decode_fdefn_rawfun(struct fdefn* fdefn) { - lispobj* raw_addr = (lispobj*)fdefn->raw_addr; - if (!raw_addr || points_to_asm_code_p((lispobj)raw_addr)) - // technically this should return the address of the code object - // containing asm routines, but it's fine to return 0. - return 0; - // If the object to which raw_addr points was already forwarded, - // this returns the "old" pointer, prior to forwarding, so that - // scavenging that pointer alters it. Otherwise scav_fdefn would not - // decide to rewrite the raw_addr slot of the fdefn. - // This logic is rather nasty, but I don't know what else to do. - lispobj word; - int widetag; - if (header_widetag(word = raw_addr[-2]) == SIMPLE_FUN_WIDETAG - || header_widetag(word) == FUNCALLABLE_INSTANCE_WIDETAG - || (word == FORWARDING_HEADER && - ((widetag=widetag_of(native_pointer(forwarding_pointer_value(raw_addr-2)))) - == SIMPLE_FUN_WIDETAG || widetag == FUNCALLABLE_INSTANCE_WIDETAG))) - return make_lispobj(raw_addr - 2, FUN_POINTER_LOWTAG); - if ((widetag = header_widetag(word = raw_addr[-4])) == CODE_HEADER_WIDETAG - || (word == FORWARDING_HEADER && - widetag_of(native_pointer(forwarding_pointer_value(raw_addr-4))) - == CODE_HEADER_WIDETAG)) - return make_lispobj(raw_addr - 4, OTHER_POINTER_LOWTAG); - lose("Unknown object in fdefn raw addr: %p", raw_addr); + return entrypoint_to_taggedptr((lispobj*)fdefn->raw_addr); } #include "genesis/vector.h" From 7c82ce5933ebf8d758efa9f846292203713f7f6f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 9 Aug 2022 22:16:55 +0300 Subject: [PATCH 3813/4023] Handle SYMBOLP when combining other pointer type tests. Test for NIL separately. --- src/compiler/arm64/type-vops.lisp | 5 ++++- src/compiler/generic/type-vops.lisp | 4 +++- src/compiler/ir2opt.lisp | 16 ++++++++++++---- src/compiler/x86-64/type-vops.lisp | 5 ++++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index b090b07fcf..ae856a0b11 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -564,11 +564,14 @@ (define-vop (load-other-pointer-widetag) (:args (value :scs (any-reg descriptor-reg))) (:args-var args) - (:info not-other-pointer-label) + (:info not-other-pointer-label null-label) (:results (r :scs (unsigned-reg))) (:result-types unsigned-num) (:generator 1 (unless (other-pointer-tn-ref-p args) + (when null-label + (inst cmp value null-tn) + (inst b :eq null-label)) (inst and r value lowtag-mask) (inst cmp r other-pointer-lowtag) (inst b :ne not-other-pointer-label)) diff --git a/src/compiler/generic/type-vops.lisp b/src/compiler/generic/type-vops.lisp index 83d9f2a176..8b5695193c 100644 --- a/src/compiler/generic/type-vops.lisp +++ b/src/compiler/generic/type-vops.lisp @@ -11,7 +11,9 @@ (in-package "SB-VM") -(defvar *other-pointer-type-vops* nil) +(defvar *other-pointer-type-vops* + ;; A special case due to NIL + `(symbolp (,symbol-widetag))) ;;; We use a default definition of the vop for PRED-NAME only if it was not ;;; already defined by the backend in {arch}/type-vops. DEFINE-VOP has a compile-time diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index bc7588717c..74bfa0d581 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -1140,11 +1140,15 @@ (when (boundp '*2block-info*) (let (vops stop + null (value (tn-ref-tn (vop-args vop)))) ;; CHECK for loops (labels ((chain (vop) (let ((next (branch-destination vop nil))) - (cond (next + (cond ((and next + (or (neq (vop-name vop) 'symbolp) + (and (not null) + (setf null (branch-destination vop))))) (push vop vops) (if (and (singleton-p (ir2block-predecessors (vop-block next))) (or (getf sb-vm::*other-pointer-type-vops* (vop-name next)) @@ -1153,7 +1157,10 @@ (chain next) (setf stop (vop-block next)))) (t - (setf stop (vop-block vop))))))) + (setf stop (vop-block vop)))))) + (ir2-block-label (block) + (or (ir2-block-%label block) + (setf (ir2-block-%label block) (gen-label))))) (chain vop) (when (> (length vops) 1) (let ((widetag (make-normal-tn (primitive-type-or-lose 'sb-vm::unsigned-byte-64))) @@ -1164,8 +1171,9 @@ (reference-tn value nil) (reference-tn widetag t) vop - (list (or (ir2-block-%label stop) - (setf (ir2-block-%label stop) (gen-label))))) + (list (ir2-block-label stop) + (and null + (ir2-block-label (vop-block null))))) (update-block-succ block (cons stop (ir2block-successors block))) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 0e2e4a7225..3d3b728219 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -893,13 +893,16 @@ (define-vop (load-other-pointer-widetag) (:args (value :scs (any-reg descriptor-reg))) (:args-var args) - (:info not-other-pointer-label) + (:info not-other-pointer-label null-label) (:results (r :scs (unsigned-reg))) (:result-types unsigned-num) (:generator 1 (cond ((other-pointer-tn-ref-p args) (inst mov :byte r (ea (- other-pointer-lowtag) value))) (t + (when null-label + (inst cmp value nil-value) + (inst jmp :e null-label)) (%lea-for-lowtag-test r value other-pointer-lowtag :qword) (inst test :byte r lowtag-mask) (inst jmp :nz not-other-pointer-label) From 280fb8e6bb66578ddf355b89327ab7d6e9043eac Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 9 Aug 2022 16:37:33 -0400 Subject: [PATCH 3814/4023] Stop enlivening so many brothertree nodes --- src/runtime/gencgc.c | 47 ++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index b675ad9590..c04b3b0367 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1848,9 +1848,13 @@ copy_unboxed_object(lispobj object, sword_t nwords) return gc_copy_object(object, nwords, unboxed_region, PAGE_TYPE_UNBOXED); } -/* This will NOT reliably work for objects in a currently open allocation region, - * because page_words_used() is not sync'ed to the free pointer until closing */ +/* This may not reliably work for objects in a currently open allocation region, + * because page_words_used() is not sync'ed to the free pointer until closing. + * However it will work reliably for codeblobs, because if you can hold + * a reference to the codeblob, then either you'll find it in the generation 0 + * tree, or else can linearly scan for it in an older generation */ #include "brothertree.h" +static lispobj dynspace_codeblob_tree_snapshot; // valid only during GC lispobj *search_dynamic_space(void *pointer) { page_index_t page_index = find_page_index(pointer); @@ -1869,8 +1873,9 @@ lispobj *search_dynamic_space(void *pointer) // Generation 0 code is in the tree usually - it isn't for objects // in generation 0 following a non-promotion cycle. if (type == PAGE_TYPE_CODE && page_table[page_index].gen == 0) { - lispobj node = brothertree_find_lesseql((uword_t)pointer, - SYMBOL(DYNSPACE_CODEBLOB_TREE)->value); + lispobj tree = dynspace_codeblob_tree_snapshot ? dynspace_codeblob_tree_snapshot : + SYMBOL(DYNSPACE_CODEBLOB_TREE)->value; + lispobj node = brothertree_find_lesseql((uword_t)pointer, tree); if (node != NIL) { lispobj *found = (lispobj*)((struct binary_node*)INSTANCE(node))->key; int widetag = widetag_of(found); @@ -2022,8 +2027,11 @@ static lispobj conservative_root_p(lispobj addr, page_index_t addr_page_index) gc_assert(object_start); switch (widetag_of(object_start)) { case CODE_HEADER_WIDETAG: - // If 'addr' points anywhere beyond the boxed words, it's valid - // (i.e. allow it even if an incorrectly tagged pointer to a simple-fun header) + /* If 'addr' points anywhere beyond the boxed words, it's valid + * (i.e. allow it even if an incorrectly tagged pointer to a simple-fun header) + * FIXME: Do we want to allow pointing at the untagged base address too? + * It'll find a key in the codeblob tree, but why would Lisp have the + * untagged pointer and expect it to be a strong reference? */ if (instruction_ptr_p((void*)addr, object_start) || addr == make_lispobj(object_start, OTHER_POINTER_LOWTAG)) return make_lispobj(object_start, OTHER_POINTER_LOWTAG); @@ -4377,15 +4385,9 @@ garbage_collect_generation(generation_index_t generation, int raise, g->num_gc = raise ? 0 : (1 + g->num_gc); maybe_verify: - /* After a GC, pages of code are safe to linearly scan because - * there won't be random junk on them below page_bytes_used. - * But generation 0 pages are _not_ safe to linearly scan because they aren't - * pre-zeroed. The SIGPROF handler could have a bad time if were to misread - * the header of an object mid-creation. Therefore, codeblobs newly made by Lisp - * are kept in a lock-free and threadsafe datastructure. - * Immobile space has its own tree, for other purposes (among them being to find - * page scan start offsets) which is pruned as needed by a finalizer */ - SYMBOL(DYNSPACE_CODEBLOB_TREE)->value = NIL; + // Have to kill this structure from its root, because any of the nodes would have + // been on pages that got freed by free_oldspace. + dynspace_codeblob_tree_snapshot = 0; if (generation >= verify_gens) hexdump_and_verify_heap(cur_thread_approx_stackptr, VERIFY_POST_GC | (generation<<16)); @@ -4571,6 +4573,21 @@ collect_garbage(generation_index_t last_gen) print_generation_stats(); } + /* After a GC, pages of code are safe to linearly scan because + * there won't be random junk on them below page_bytes_used. + * But generation 0 pages are _not_ safe to linearly scan because they aren't + * pre-zeroed. The SIGPROF handler could have a bad time if were to misread + * the header of an object mid-creation. Therefore, codeblobs newly made by Lisp + * are kept in a lock-free and threadsafe datastructure. But we don't want to + * enliven nodes of that structure for Lisp to see (absent any other references) + * because the whole thing becomes garbage after this GC. So capture the tree + * for GC's benefit, and delete the view of it from Lisp. + * Incidentally, immobile text pages have their own tree, for other purposes + * (among them being to find page scan start offsets) which is pruned as + * needed by a finalizer. */ + dynspace_codeblob_tree_snapshot = SYMBOL(DYNSPACE_CODEBLOB_TREE)->value; + SYMBOL(DYNSPACE_CODEBLOB_TREE)->value = NIL; + page_index_t initial_nfp = next_free_page; if (gc_mark_only) { garbage_collect_generation(PSEUDO_STATIC_GENERATION, 0, From 84f00d45bd1b5d449fb0a3b781b1117a0fc0e7fb Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 9 Aug 2022 23:49:03 -0400 Subject: [PATCH 3815/4023] Assume that sizeof (page_words_t) is 2 in genesis Failed to notice this with rev 3bfea7ffd3 --- src/compiler/generic/genesis.lisp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 70d74be370..e33d605044 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3698,9 +3698,7 @@ III. initially undefined function references (alphabetically): ;; A corefile PTE is { uword_t scan_start_offset; page_words_t words_used; } (let* ((data-bytes (* (gspace-free-word-index gspace) sb-vm:n-word-bytes)) (n-ptes (ceiling data-bytes sb-vm:gencgc-page-bytes)) - (sizeof-usage ; see similar expression in 'src/code/room' - (if (typep sb-vm::gencgc-page-words '(unsigned-byte 16)) 2 4)) - (sizeof-corefile-pte (+ sb-vm:n-word-bytes sizeof-usage)) + (sizeof-corefile-pte (+ sb-vm:n-word-bytes 2)) (pte-bytes (round-up (* sizeof-corefile-pte n-ptes) sb-vm:n-word-bytes)) (n-code 0) (n-cons 0) @@ -3722,14 +3720,7 @@ III. initially undefined function references (alphabetically): (:mixed (incf n-mixed) #b011)) 0))) (setf (bvref-word-unaligned ptes pte-offset) (logior sso type-bits)) - (macrolet ((setter () - ;; KLUDGE to avoid compiler note about one or the other - ;; branch of this IF being unreachable. - (declare (notinline typep)) - (if (typep sb-vm::gencgc-page-words '(unsigned-byte 16)) - '#'(setf bvref-16) - '#'(setf bvref-32)))) - (funcall (setter) usage ptes (+ pte-offset sb-vm:n-word-bytes))))) + (setf (bvref-32 ptes (+ pte-offset sb-vm:n-word-bytes)) usage))) (when verbose (format t "movable dynamic space: ~d + ~d + ~d cons/code/mixed pages~%" n-cons n-code n-mixed)) From 485400c371518d59093d96ad98385d0fe0e55630 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 10 Aug 2022 20:16:11 +0300 Subject: [PATCH 3816/4023] Optimize a sequence of instance type tests. Check for instance-pointer-lowtag and load the layout once. Make a single VOP that combines %instancep and %structure-is-a for easier detection and transformation. Implemented for ARM64. --- src/compiler/arm64/system.lisp | 31 ------------ src/compiler/arm64/type-vops.lisp | 78 +++++++++++++++++++++++++++++++ src/compiler/fndb.lisp | 1 + src/compiler/generic/utils.lisp | 3 ++ src/compiler/ir2opt.lisp | 53 +++++++++++++++++++-- src/compiler/typetran.lisp | 19 ++++---- 6 files changed, 142 insertions(+), 43 deletions(-) diff --git a/src/compiler/arm64/system.lisp b/src/compiler/arm64/system.lisp index 0ff5d92b62..840c84d413 100644 --- a/src/compiler/arm64/system.lisp +++ b/src/compiler/arm64/system.lisp @@ -74,37 +74,6 @@ word-shift)) instance-pointer-lowtag)))))) -;;; This could be split into two vops to avoid wasting an allocation for 'temp' -;;; when the immediate form is used. -(define-vop () - (:translate sb-c::%structure-is-a) - (:args (x :scs (descriptor-reg))) - (:arg-types * (:constant t)) - (:policy :fast-safe) - (:conditional :eq) - (:info test-layout) - (:temporary (:sc unsigned-reg) this-id temp) - (:generator 4 - (let ((test-id (layout-id test-layout)) - (offset (+ (id-bits-offset) - (ash (- (wrapper-depthoid test-layout) 2) 2) - (- instance-pointer-lowtag)))) - (declare (ignorable test-id)) - (inst ldr (32-bit-reg this-id) (@ x offset)) - ;; 8-bit IDs are permanently assigned, so no fixup ever needed for those. - (cond ((typep test-id '(and (signed-byte 8) (not (eql 0)))) - (if (minusp test-id) - (inst cmn (32-bit-reg this-id) (- test-id)) - (inst cmp (32-bit-reg this-id) test-id))) - (t - (destructuring-bind (size . label) - ;; This uses the bogus definition of :dword, the one which - ;; emits 4 bytes. _technically_ dword should be 8 bytes. - (register-inline-constant :dword `(:layout-id ,test-layout)) - (declare (ignore size)) - (inst load-from-label (32-bit-reg temp) label)) - (inst cmp (32-bit-reg this-id) (32-bit-reg temp))))))) - (define-vop (%other-pointer-widetag) (:translate %other-pointer-widetag) (:policy :fast-safe) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index ae856a0b11..daca485659 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -582,3 +582,81 @@ (:info target not-p type-codes) (:generator 1 (%test-headers value nil target not-p nil type-codes))) + +(define-vop (load-instance-layout) + (:args (object :scs (any-reg descriptor-reg))) + (:args-var args) + (:info not-instance) + (:results (r :scs (descriptor-reg))) + (:generator 1 + (unless (instance-tn-ref-p args) + (inst and tmp-tn object lowtag-mask) + (inst cmp tmp-tn instance-pointer-lowtag) + (inst b :ne not-instance)) + (loadw r object instance-slots-offset instance-pointer-lowtag))) + +(defun structure-is-a (layout temp this-id test-layout) + (let ((test-id (layout-id test-layout)) + (offset (+ (id-bits-offset) + (ash (- (wrapper-depthoid test-layout) 2) 2) + (- instance-pointer-lowtag)))) + + (inst ldr (32-bit-reg this-id) (@ layout offset)) + ;; 8-bit IDs are permanently assigned, so no fixup ever needed for those. + (cond ((typep test-id '(and (signed-byte 8) (not (eql 0)))) + (if (minusp test-id) + (inst cmn (32-bit-reg this-id) (- test-id)) + (inst cmp (32-bit-reg this-id) test-id))) + (t + (destructuring-bind (size . label) + ;; This uses the bogus definition of :dword, the one which + ;; emits 4 bytes. _technically_ dword should be 8 bytes. + (register-inline-constant :dword `(:layout-id ,test-layout)) + (declare (ignore size)) + (inst load-from-label (32-bit-reg temp) label)) + (inst cmp (32-bit-reg this-id) (32-bit-reg temp)))))) + +;;; This could be split into two vops to avoid wasting an allocation for 'temp' +;;; when the immediate form is used. +(define-vop () + (:translate sb-c::%structure-is-a) + (:args (x :scs (descriptor-reg))) + (:arg-types * (:constant t)) + (:policy :fast-safe) + (:conditional :eq) + (:info test-layout) + (:temporary (:sc unsigned-reg) this-id temp) + (:generator 4 + (structure-is-a x temp this-id test-layout))) + +(define-vop () + (:translate sb-c::structure-typep) + (:args (object :scs (descriptor-reg))) + (:arg-types * (:constant t)) + (:args-var args) + (:policy :fast-safe) + (:conditional) + (:info target not-p test-layout) + (:temporary (:sc descriptor-reg) layout) + (:temporary (:sc unsigned-reg) this-id temp) + (:generator 4 + (unless (instance-tn-ref-p args) + (inst and temp object lowtag-mask) + (inst cmp temp instance-pointer-lowtag) + (inst b :ne (if not-p target done))) + (loadw layout object instance-slots-offset instance-pointer-lowtag) + (structure-is-a layout temp this-id test-layout) + (inst b (if not-p :ne :eq) target) + done)) + +(define-vop (structure-typep*) + (:args (layout :scs (descriptor-reg))) + (:arg-types * (:constant t)) + (:policy :fast-safe) + (:conditional) + (:info target not-p test-layout) + (:temporary (:sc unsigned-reg) this-id temp) + (:generator 4 + (structure-is-a layout temp this-id test-layout) + (inst b (if not-p :ne :eq) target) + done)) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 7e5331ce16..a2eb28889d 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -103,6 +103,7 @@ #+64-bit (defknown layout-depthoid (sb-vm:layout) layout-depthoid (flushable always-translatable)) #+(or x86 x86-64) (defknown (layout-depthoid-ge) (sb-vm:layout integer) boolean (flushable)) (defknown %structure-is-a (instance t) boolean (foldable flushable)) +(defknown structure-typep (t t) boolean (foldable flushable)) (defknown copy-structure (structure-object) structure-object (flushable) :derive-type #'result-type-first-arg) diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 7284e58df8..1028b8546a 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -273,6 +273,9 @@ (not (types-equal-or-intersect (tn-ref-type tn-ref) (specifier-type '(eql nil))))) +(defun instance-tn-ref-p (tn-ref) + (and (sc-is (tn-ref-tn tn-ref) descriptor-reg) + (csubtypep (tn-ref-type tn-ref) (specifier-type 'instance)))) (defun stack-consed-p (object) (let ((write (sb-c::tn-writes object))) ; list of write refs (when (or (not write) ; grrrr, the only write is from a LOAD tn diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 74bfa0d581..fb1a2bc6b5 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -1030,7 +1030,7 @@ (delete-vop vop) (delete-vop next)))))))) -(when (vop-existsp :named sb-vm::<-integer-fixnum) +(when-vop-existsp (:named sb-vm::<-integer-fixnum) ;; The <-integer-fixnum VOPs already perform dispatch for fixnum/bignum, ;; and load the header byte. ;; Replace the preceding INTEGERP VOP with an appropriate @@ -1135,14 +1135,13 @@ (delete-vop vop)))) ;;; Load the WIDETAG once for a series of type tests. -(when (vop-existsp :named sb-vm::load-other-pointer-widetag) +(when-vop-existsp (:named sb-vm::load-other-pointer-widetag) (defoptimizer (vop-optimize %other-pointer-subtype-p) (vop) (when (boundp '*2block-info*) (let (vops stop null (value (tn-ref-tn (vop-args vop)))) - ;; CHECK for loops (labels ((chain (vop) (let ((next (branch-destination vop nil))) (cond ((and next @@ -1204,6 +1203,54 @@ (set-vop-optimizer (template-or-lose vop) #'vop-optimize-%other-pointer-subtype-p-optimizer))) +(when-vop-existsp (:translate structure-typep) + (defoptimizer (vop-optimize structure-typep) (vop) + (when (boundp '*2block-info*) + (let (vops + stop + (value (tn-ref-tn (vop-args vop)))) + (labels ((chain (vop) + (let ((next (branch-destination vop nil))) + (cond (next + (push vop vops) + (if (and (singleton-p (ir2block-predecessors (vop-block next))) + (eq (vop-name next) 'structure-typep) + (eq (tn-ref-tn (vop-args next)) value)) + (chain next) + (setf stop (vop-block next)))) + (t + (setf stop (vop-block vop)))))) + (ir2-block-label (block) + (or (ir2-block-%label block) + (setf (ir2-block-%label block) (gen-label))))) + (chain vop) + (when (> (length vops) 1) + (let ((layout (make-normal-tn *backend-t-primitive-type*)) + (block (vop-block vop))) + (emit-and-insert-vop (vop-node vop) + block + (template-or-lose 'sb-vm::load-instance-layout) + (reference-tn value nil) + (reference-tn layout t) + vop + (list (ir2-block-label stop))) + (update-block-succ block + (cons stop + (ir2block-successors block))) + (let ((test-vop (template-or-lose 'sb-vm::structure-typep*))) + (loop for vop in vops + for info = (vop-codegen-info vop) + do + (emit-and-insert-vop (vop-node vop) + (vop-block vop) + test-vop + (reference-tn layout nil) + nil + vop + info) + (delete-vop vop)))))))) + nil)) + (defun very-temporary-p (tn) (let ((writes (tn-writes tn)) (reads (tn-reads tn))) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 3966bf7977..49e3aeae45 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -942,15 +942,16 @@ ;; wrong; it's unnecessary because structure classes can't be redefined, and it's wrong ;; because it is quite legitimate to pass an object with an invalid layout ;; to a structure type test. - `(and (%instancep object) - ;; If we allowed structure classes to be mixed in to standard-object, - ;; this might have to change to consider object invalidation. Probably would - ;; want to track structure classoids that would render this code inadmissible. - ,(if (<= depthoid sb-kernel::layout-id-vector-fixed-capacity) - `(%structure-is-a (%instance-layout object) ,wrapper) - `(let ((,type (%instance-layout object))) - (and (layout-depthoid-ge ,type ,depthoid) - (%structure-is-a ,type ,wrapper)))))) + (if (<= depthoid sb-kernel::layout-id-vector-fixed-capacity) + (if (vop-existsp :translate structure-typep) + ;; A single VOP is easier to optimize later in ir2opt. + `(structure-typep object ,wrapper) + `(and (%instancep object) + (%structure-is-a (%instance-layout object) ,wrapper))) + `(and (%instancep object) + (let ((,type (%instance-layout object))) + (and (layout-depthoid-ge ,type ,depthoid) + (%structure-is-a ,type ,wrapper)))))) ((> depthoid 0) ;; fixed-depth ancestors of non-structure types: From 494afecc3545df259bd5664cc9bba2acceb79a89 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 10 Aug 2022 14:22:36 -0400 Subject: [PATCH 3817/4023] Speedup WRITE-BIGVEC-AS-SEQUENCE Now there is zero visible delay from "building initial core file" to exiting genesis, assuming a reasonably good machine. And rev 04139ea0e0 improved WRITE-WORD by removing legacy cruft (CMUCL's need to test SB-C:*BACKEND-BYTE-ORDER*) but I don't see that making it a lexical function was smart. Fix bug from 84f00d45bd which should have used #'(setf bvref-16). --- src/compiler/generic/genesis.lisp | 116 +++++++++++++++--------------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index e33d605044..7f02862d83 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -116,13 +116,35 @@ (* (length (bigvec-outer-vector bigvec)) +smallvec-length+)) +(defun write-words (stream &rest words) + (let ((bigvec (load-time-value (%make-bigvec))) + (offset 0)) + (dolist (word words) + (setf (bvref-word bigvec offset) (the sb-vm:word word)) + (incf offset sb-vm:n-word-bytes)) + (write-sequence (elt (bigvec-outer-vector bigvec) 0) stream :end offset))) + ;;; analogous to WRITE-SEQUENCE, but for a BIGVEC -(defun write-bigvec-as-sequence (bigvec stream &key (start 0) end pad-with-zeros) - (let* ((bvlength (bvlength bigvec)) - (data-length (min (or end bvlength) bvlength))) - (loop for i of-type index from start below data-length do - (write-byte (bvref bigvec i) - stream)) +(defun write-bigvec-as-sequence (bigvec stream &key end pad-with-zeros) + (binding* ((bvlength (bvlength bigvec)) + (data-length (min (or end bvlength) bvlength)) + ;; Compute the coordinates of the final byte to be written + ((outer-index inner-index) + (if (zerop data-length) + (values 0 -1) + (floor (1- data-length) +smallvec-length+)))) + ;; Each SMALLVEC prior to the one indexed by outer-index is written in its entirety + (dotimes (i outer-index) + (write-sequence (elt (bigvec-outer-vector bigvec) i) stream)) + ;; The SMALLVEC at OUTER-INDEX is written up to and including INNER-INDEX + (write-sequence (elt (bigvec-outer-vector bigvec) outer-index) stream + :end (1+ inner-index)) + ;; FIXME: This logic from rev 243d0f6f59 says it's needed if +SMALLVEC-LENGTH+ is + ;; less than backend page bytes, but if that were true (which it never is) + ;; we should just increase +SMALLVEC-LENGTH+. And how can could it be right even in + ;; that case? DATA-LENGTH is not larger than BVLENGTH, because it it were, + ;; you asked to write more than the vector holds. Istm this is garbage + ;; but I'm afraid to remove it. (when (and pad-with-zeros (< bvlength data-length)) (loop repeat (- data-length bvlength) do (write-byte 0 stream))))) @@ -3648,7 +3670,7 @@ III. initially undefined function references (alphabetically): ;;;; writing core file -(defun output-gspace (gspace data-page core-file write-word verbose) +(defun output-gspace (gspace data-page core-file verbose) (force-output core-file) (let* ((posn (file-position core-file)) (bytes (cond @@ -3657,13 +3679,13 @@ III. initially undefined function references (alphabetically): (- sb-vm:read-only-space-end sb-vm:read-only-space-start)) (t (* (gspace-free-word-index gspace) sb-vm:n-word-bytes)))) - (pages (ceiling bytes sb-c:+backend-page-bytes+)) - (total-bytes (* pages sb-c:+backend-page-bytes+))) + (page-count (ceiling bytes sb-c:+backend-page-bytes+)) + (total-bytes (* page-count sb-c:+backend-page-bytes+))) (file-position core-file (* sb-c:+backend-page-bytes+ (1+ data-page))) (when verbose (format t "writing ~S byte~:P [~S page~:P] from ~S~%" - total-bytes pages gspace)) + total-bytes page-count gspace)) ;; Note: It is assumed that the GSPACE allocation routines always ;; allocate whole pages (of size +backend-page-bytes+) and that any @@ -3678,22 +3700,14 @@ III. initially undefined function references (alphabetically): (force-output core-file) (file-position core-file posn) - ;; Write part of a (new) directory entry which looks like this: - ;; GSPACE IDENTIFIER - ;; WORD COUNT - ;; DATA PAGE - ;; ADDRESS - ;; PAGE COUNT - (funcall write-word (gspace-identifier gspace)) - (funcall write-word (gspace-free-word-index gspace)) - (funcall write-word data-page) - (funcall write-word (gspace-byte-address gspace)) - (funcall write-word pages) + ;; Write the directory entry. + (write-words core-file (gspace-identifier gspace) (gspace-free-word-index gspace) + data-page (gspace-byte-address gspace) page-count) - (+ data-page pages))) + (+ data-page page-count))) #+gencgc -(defun output-page-table (gspace data-page core-file write-word verbose) +(defun output-page-table (gspace data-page core-file verbose) ;; Write as many PTEs as there are pages used. ;; A corefile PTE is { uword_t scan_start_offset; page_words_t words_used; } (let* ((data-bytes (* (gspace-free-word-index gspace) sb-vm:n-word-bytes)) @@ -3720,7 +3734,7 @@ III. initially undefined function references (alphabetically): (:mixed (incf n-mixed) #b011)) 0))) (setf (bvref-word-unaligned ptes pte-offset) (logior sso type-bits)) - (setf (bvref-32 ptes (+ pte-offset sb-vm:n-word-bytes)) usage))) + (setf (bvref-16 ptes (+ pte-offset sb-vm:n-word-bytes)) usage))) (when verbose (format t "movable dynamic space: ~d + ~d + ~d cons/code/mixed pages~%" n-cons n-code n-mixed)) @@ -3730,35 +3744,29 @@ III. initially undefined function references (alphabetically): (write-bigvec-as-sequence ptes core-file :end pte-bytes) (force-output core-file) (file-position core-file posn)) - (mapc write-word - `(,page-table-core-entry-type-code - 6 ; = number of words in this core header entry - ,sb-vm::gencgc-card-table-index-nbits ,n-ptes ,pte-bytes ,data-page)))) + (write-words core-file + page-table-core-entry-type-code + 6 ; = number of words in this core header entry + sb-vm::gencgc-card-table-index-nbits + n-ptes pte-bytes data-page))) ;;; Create a core file created from the cold loaded image. (This is ;;; the "initial core file" because core files could be created later -;;; by executing SAVE-LISP in a running system, perhaps after we've +;;; by executing SAVE-LISP-AND-DIE in a running system, perhaps after we've ;;; added some functionality to the system.) (defun write-initial-core-file (filename build-id verbose) - (when verbose (let ((*print-length* nil) (*print-level* nil)) (format t "~&SB-XC:*FEATURES* =~&~S~%" sb-xc:*features*)) (format t "[building initial core file in ~S: ~%" filename)) - (with-open-file (core-file (namestring filename) ; why NAMESTRING? dunno - :direction :output - :element-type '(unsigned-byte 8) - :if-exists :rename-and-delete) - (let ((bv (%make-bigvec)) - (data-page 0)) - (flet ((write-word (word) - (setf (bvref-word bv 0) (the sb-vm:word word)) - (write-sequence (elt (bigvec-outer-vector bv) 0) core-file - :start 0 :end sb-vm:n-word-bytes))) + (with-open-file (core-file filename :direction :output + :element-type '(unsigned-byte 8) + :if-exists :rename-and-delete) + (let ((data-page 0)) ;; Write the magic number. - (write-word core-magic) + (write-words core-file core-magic) ;; Write the build ID, which contains a generated string ;; plus a suffix identifying a certain configuration of the C compiler. @@ -3771,36 +3779,30 @@ III. initially undefined function references (alphabetically): (declare (type simple-string build-id)) ;; Write BUILD-ID-CORE-ENTRY-TYPE-CODE, the length of the header, ;; length of the string, then base string chars + maybe padding. - (write-word build-id-core-entry-type-code) - (write-word (+ 3 nwords)) ; 3 = fixed overhead including this word - (write-word (length build-id)) + (write-words core-file build-id-core-entry-type-code + (+ 3 nwords) ; 3 = fixed overhead including this word + (length build-id)) (dovector (char build-id) (write-byte (char-code char) core-file)) (dotimes (j (- padding)) (write-byte #xff core-file))) ;; Write the Directory entry header. - (write-word directory-core-entry-type-code) + (write-words core-file directory-core-entry-type-code) (let ((spaces `(,*static* #+immobile-space ,@`(,*immobile-fixedobj* ,*immobile-text*) ,*dynamic* ,*read-only*))) ;; length = (5 words/space) * N spaces + 2 for header. - (write-word (+ (* (length spaces) 5) 2)) + (write-words core-file (+ (* (length spaces) 5) 2)) (dolist (space spaces) - (setq data-page (output-gspace space data-page - core-file #'write-word verbose)))) - #+gencgc (output-page-table *dynamic* data-page - core-file #'write-word verbose) + (setq data-page (output-gspace space data-page core-file verbose)))) + #+gencgc (output-page-table *dynamic* data-page core-file verbose) ;; Write the initial function. - (write-word initial-fun-core-entry-type-code) - (write-word 3) (let ((initial-fun (descriptor-bits (cold-symbol-function '!cold-init)))) - (when verbose - (format t "~&/INITIAL-FUN=#X~X~%" initial-fun)) - (write-word initial-fun)) + (when verbose (format t "~&/INITIAL-FUN=#X~X~%" initial-fun)) + (write-words core-file initial-fun-core-entry-type-code 3 initial-fun)) ;; Write the End entry. - (write-word end-core-entry-type-code) - (write-word 2)))) + (write-words core-file end-core-entry-type-code 2))) (when verbose (format t "done]~%") From 2658b1928327d529516724fb3aa9e7262ee73014 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 10 Aug 2022 17:20:28 -0400 Subject: [PATCH 3818/4023] win32: Remove #ifdef from load_corefile_ptes And silence a C compiler warning about getpagsize() which is not in unistd.h --- src/compiler/generic/genesis.lisp | 2 +- src/runtime/coreparse.c | 1 + src/runtime/fullcgc.c | 3 ++- src/runtime/gencgc.c | 9 +-------- src/runtime/os.h | 17 +++++++++++++++++ src/runtime/save.c | 10 ---------- src/runtime/win32-os.c | 3 ++- 7 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 7f02862d83..20f6e2cda7 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -123,7 +123,7 @@ (setf (bvref-word bigvec offset) (the sb-vm:word word)) (incf offset sb-vm:n-word-bytes)) (write-sequence (elt (bigvec-outer-vector bigvec) 0) stream :end offset))) - + ;;; analogous to WRITE-SEQUENCE, but for a BIGVEC (defun write-bigvec-as-sequence (bigvec stream &key end pad-with-zeros) (binding* ((bvlength (bvlength bigvec)) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index d6b73f8ecc..72834c0014 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -1073,6 +1073,7 @@ load_core_file(char *file, os_vm_offset_t file_offset, int merge_core_pages) merge_core_pages, &adj); break; case PAGE_TABLE_CORE_ENTRY_TYPE_CODE: + // elements = gencgc-card-table-index-nbits, n-ptes, nbytes, data-page gc_load_corefile_ptes(ptr[0], ptr[1], ptr[2], file_offset + (ptr[3] + 1) * os_vm_page_size, fd); break; diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index f077792b53..24f05c68b6 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -23,6 +23,7 @@ #include "code.h" #include "immobile-space.h" #include "queue.h" +#include "os.h" #include <stdio.h> #ifndef LISP_FEATURE_WIN32 @@ -423,7 +424,7 @@ void prepare_for_full_mark_phase() #else sword_t nbytes = nbits_dynamic / 8; #endif - markbits_size = ALIGN_UP(nbytes, getpagesize()); + markbits_size = ALIGN_UP(nbytes, GETPAGESIZE); fullcgcmarks = (void*)os_allocate(markbits_size); } diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index c04b3b0367..c0c5610f3e 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -5676,14 +5676,7 @@ void gc_load_corefile_ptes(int card_table_nbits, gc_card_table_nbits = card_table_nbits; gc_allocate_ptes(); - if ( -#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_64_BIT) - _lseeki64 -#else - lseek -#endif - (fd, offset, SEEK_SET) != offset) - lose("failed seek"); + if (LSEEK(fd, offset, SEEK_SET) != offset) lose("failed seek"); char data[8192]; // Process an integral number of ptes on each read. diff --git a/src/runtime/os.h b/src/runtime/os.h index 49f9d9519d..b417336949 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -241,4 +241,21 @@ extern int os_reported_page_size; // Opaque context accessor uword_t os_context_pc(os_context_t*); void set_os_context_pc(os_context_t*, uword_t); + +#ifdef LISP_FEATURE_WIN32 +#define GETPAGESIZE 4096 +#ifdef LISP_FEATURE_64_BIT +# define FTELL _ftelli64 +# define FSEEK _fseeki64 +# define LSEEK _lseeki64 +typedef __int64 ftell_type; +#endif +#else +#define GETPAGESIZE getpagesize() +#define FTELL ftell +#define FSEEK fseek +#define LSEEK lseek +typedef long ftell_type; +#endif + #endif diff --git a/src/runtime/save.c b/src/runtime/save.c index 3f6300269b..3369f90f50 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -154,16 +154,6 @@ write_bytes_to_file(FILE * file, char *addr, size_t bytes, int compression) } }; -#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_64_BIT) -#define FTELL _ftelli64 -#define FSEEK _fseeki64 -typedef __int64 ftell_type; -#else -#define FTELL ftell -#define FSEEK fseek -typedef long ftell_type; -#endif - static long write_bytes(FILE *file, char *addr, size_t bytes, os_vm_offset_t file_offset, int compression) { diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 7c14d4d2ff..6db0943dd2 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -792,7 +792,8 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, return actual; } -/* Used to allocate the dynamic space, as it may be very large. Dynamically comitted by os_commit_memory in handle_access_violation */ +/* Used to allocate the dynamic space, as it may be very large. + * Dynamically comitted by gc_alloc_new_region() or gc_alloc_large() */ os_vm_address_t os_validate_nocommit(int attributes, os_vm_address_t addr, os_vm_size_t len) { From 8a3e49f4716601613d87ab77c178aa98250c6b13 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 10 Aug 2022 18:53:13 -0400 Subject: [PATCH 3819/4023] More-or-less revert db2b157b2a06 now that all generic functions have builtin trampolines. --- src/code/x86-64-vm.lisp | 10 +--------- src/compiler/x86-64/alloc.lisp | 1 + src/compiler/x86-64/call.lisp | 34 +++++----------------------------- 3 files changed, 7 insertions(+), 38 deletions(-) diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index 51f7f41bdc..97df630de6 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -263,17 +263,9 @@ (%primitive set-fdefn-has-static-callers fdefn)) fdefn) -(defun %set-fdefn-fun (fdefn fun &aux (name (fdefn-name fdefn))) +(defun %set-fdefn-fun (fdefn fun) (declare (type fdefn fdefn) (type function fun) (values function)) - (unless (or (symbolp name) (eq 'setf (car name))) - ;; Ue the #-immobile-code call convention for this name. - ;; So we'll not compile a trampoline for things that can probably - ;; never be called directly anyway. i.e you _won't_ see things like: - ;; #<trampoline #<%METHOD-FUNCTION (LAMBDA (SB-PCL::METHOD-ARGS SB-PCL::NEXT-METHODS) ... - ;; in the core any more - (%primitive sb-vm::set-fdefn-fun fun fdefn) - (return-from %set-fdefn-fun fun)) (when (fdefn-has-static-callers fdefn) (remove-static-links fdefn)) (let ((trampoline (when (fun-requires-simplifying-trampoline-p fun) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index b32939c935..706c6b2959 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -861,6 +861,7 @@ ;;;; automatic allocators for primitive objects +;;; FIXME: figure out how not to need this? (define-vop (make-funcallable-instance-tramp) (:args) (:results (result :scs (any-reg))) diff --git a/src/compiler/x86-64/call.lisp b/src/compiler/x86-64/call.lisp index bc0f8d2356..fc03cfe41b 100644 --- a/src/compiler/x86-64/call.lisp +++ b/src/compiler/x86-64/call.lisp @@ -839,38 +839,14 @@ (define-full-call fixed-tail-call-named t :tail nil :fixed)) ;;; Call NAME "directly" meaning in a single JMP or CALL instruction, -;;; if possible +;;; if possible (without loading RAX) (defun emit-direct-call (name instruction node step-instrumenting) - (if (and (listp name) (neq (car name) 'setf)) - ;; always call through the fdefn for (SB-PCL::SLOT-ACCESSOR :GLOBAL ...) - ;; and anything else with a nonstandard name, so we can avoid compiling - ;; a thousand little custom trampolines. - ;; The main reason for that is it avoids compiling custom trampolines - ;; for functions that are never in practice called, such as - ;; (SB-PCL::{FAST,SLOW}-METHOD mumble (thing t) ...) - ;; but which nonetheless have FDEFNs. - ;; We still make the custom trampoline for closures such as - ;; (SB-KERNEL::CONDITION-SLOT-READER SB-INTERPRETER::TYPE-ERROR-SYMBOL). - ;; Even though that has a nonstandard name, that lambda is installed - ;; as #'TYPE-ERROR-SYMBOL, which is an ordinary name. - (let* ((constants - (sb-c::ir2-component-constants - (sb-c::component-info sb-c::*component-being-compiled*))) - (constant - (find-if (lambda (x) - (and (listp x) (eq (car x) :named-call) (equal (cadr x) name))) - constants))) - (aver constant) - (inst mov rax-tn (third constant)) - ;;(loadw rax-tn rax-tn fdefn-fun-slot other-pointer-lowtag) - (inst* instruction (object-slot-ea rax-tn fdefn-raw-addr-slot other-pointer-lowtag))) - ;; call without loading RAX ;; a :STATIC-CALL fixup is the address of the entry point of ;; the function itself, and a :NAMED-CALL fixup is the address ;; of the JMP instruction embedded in the header for the named FDEFN. - (let* ((fixup (make-fixup name - (if (static-fdefn-offset name) :static-call :named-call))) - (target + (let* ((fixup (make-fixup name + (if (static-fdefn-offset name) :static-call :named-call))) + (target (if (and (sb-c::code-immobile-p node) (not step-instrumenting)) fixup @@ -883,7 +859,7 @@ ;; RAX will get loaded regardless. (inst mov rax-tn fixup) rax-tn)))) - (inst* instruction target)))) + (inst* instruction target))) ;;; Invoke the function-designator FUN. (defun tail-call-unnamed (fun type vop) From 7666f2676c8a0a4a6c7c3632e4ce0b9e0a5f04ab Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 11 Aug 2022 03:47:01 +0300 Subject: [PATCH 3820/4023] Check for layout-depthoid-ge in structure-typep as well. --- src/code/stubs.lisp | 9 +++++++++ src/compiler/arm64/type-vops.lisp | 28 ++++++++++++++++++++-------- src/compiler/typetran.lisp | 17 ++++++++--------- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/code/stubs.lisp b/src/code/stubs.lisp index e6eb749115..4c6cbe11cc 100644 --- a/src/code/stubs.lisp +++ b/src/code/stubs.lisp @@ -207,6 +207,15 @@ (and (> (length inherits) depthoid) (eq (svref inherits depthoid) test-layout))))) +(defun sb-c::structure-typep (object test-layout) + (and (%instancep object) + (let ((object-layout (%instance-layout object))) + (or (eq object-layout test-layout) + (let ((depthoid (wrapper-depthoid test-layout)) + (inherits (wrapper-inherits object-layout))) + (and (> (length inherits) depthoid) + (eq (svref inherits depthoid) test-layout))))))) + (defun %other-pointer-subtype-p (x choices) (and (%other-pointer-p x) (member (%other-pointer-widetag x) choices) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index daca485659..f7fe02c866 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -595,12 +595,24 @@ (inst b :ne not-instance)) (loadw r object instance-slots-offset instance-pointer-lowtag))) -(defun structure-is-a (layout temp this-id test-layout) - (let ((test-id (layout-id test-layout)) - (offset (+ (id-bits-offset) - (ash (- (wrapper-depthoid test-layout) 2) 2) - (- instance-pointer-lowtag)))) - +(defun structure-is-a (layout temp this-id test-layout &optional target not-p done) + (let* ((test-id (layout-id test-layout)) + (depthoid (wrapper-depthoid test-layout)) + (offset (+ (id-bits-offset) + (ash (- depthoid 2) 2) + (- instance-pointer-lowtag)))) + (when (and target + (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) + (inst ldrsw temp + (@ layout + (load-store-offset + (- (+ #+little-endian 4 + (ash (+ instance-slots-offset + (get-dsd-index layout sb-kernel::flags)) + word-shift)) + instance-pointer-lowtag)))) + (inst cmp temp (add-sub-immediate depthoid)) + (inst b :lt (if not-p target done))) (inst ldr (32-bit-reg this-id) (@ layout offset)) ;; 8-bit IDs are permanently assigned, so no fixup ever needed for those. (cond ((typep test-id '(and (signed-byte 8) (not (eql 0)))) @@ -645,7 +657,7 @@ (inst cmp temp instance-pointer-lowtag) (inst b :ne (if not-p target done))) (loadw layout object instance-slots-offset instance-pointer-lowtag) - (structure-is-a layout temp this-id test-layout) + (structure-is-a layout temp this-id test-layout target not-p done) (inst b (if not-p :ne :eq) target) done)) @@ -657,6 +669,6 @@ (:info target not-p test-layout) (:temporary (:sc unsigned-reg) this-id temp) (:generator 4 - (structure-is-a layout temp this-id test-layout) + (structure-is-a layout temp this-id test-layout target not-p done) (inst b (if not-p :ne :eq) target) done)) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 49e3aeae45..2c0cc8ddd7 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -942,16 +942,15 @@ ;; wrong; it's unnecessary because structure classes can't be redefined, and it's wrong ;; because it is quite legitimate to pass an object with an invalid layout ;; to a structure type test. - (if (<= depthoid sb-kernel::layout-id-vector-fixed-capacity) - (if (vop-existsp :translate structure-typep) - ;; A single VOP is easier to optimize later in ir2opt. - `(structure-typep object ,wrapper) - `(and (%instancep object) - (%structure-is-a (%instance-layout object) ,wrapper))) + (if (vop-existsp :translate structure-typep) + ;; A single VOP is easier to optimize later in ir2opt. + `(structure-typep object ,wrapper) `(and (%instancep object) - (let ((,type (%instance-layout object))) - (and (layout-depthoid-ge ,type ,depthoid) - (%structure-is-a ,type ,wrapper)))))) + ,(if (<= depthoid sb-kernel::layout-id-vector-fixed-capacity) + `(%structure-is-a (%instance-layout object) ,wrapper) + `(let ((,type (%instance-layout object))) + (and (layout-depthoid-ge ,type ,depthoid) + (%structure-is-a ,type ,wrapper))))))) ((> depthoid 0) ;; fixed-depth ancestors of non-structure types: From c9d4cd3b2d87db2846ce403aacb7f79d5dd8b086 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 10 Aug 2022 22:18:17 -0400 Subject: [PATCH 3821/4023] Workaround cmucl limitation --- src/compiler/generic/genesis.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 20f6e2cda7..7135f5d73a 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -116,8 +116,9 @@ (* (length (bigvec-outer-vector bigvec)) +smallvec-length+)) +(defparameter *bigvec-for-write-words* (%make-bigvec)) (defun write-words (stream &rest words) - (let ((bigvec (load-time-value (%make-bigvec))) + (let ((bigvec *bigvec-for-write-words*) (offset 0)) (dolist (word words) (setf (bvref-word bigvec offset) (the sb-vm:word word)) From 59b7015562c26c4c42179b1dcb9abded9858f907 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 10 Aug 2022 23:25:07 -0400 Subject: [PATCH 3822/4023] x86-64: shorten generic functions by 2 words We don't need 64 bits of hash, and there was 1 word of padding, so stuff a 32-bit hash into available raw bytes. It looks like I tried doing this before, but I can not remember any time when FSC-INSTANCE-HASH would have been correct by testing for 5 payload words. It must have been taking the 'else' branch always. --- src/code/target-sxhash.lisp | 26 ++++++++++++-------------- src/code/x86-64-vm.lisp | 5 +++-- src/compiler/x86-64/vm.lisp | 8 ++++++++ src/pcl/class-init.lisp | 12 +++++++++++- src/pcl/pre-warm.lisp | 5 ++++- tests/print.impure.lisp | 4 +++- 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index b05beeb0a5..e400dab49f 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -122,11 +122,6 @@ (%instance-ref instance (%instance-length instance)) (%instance-sxhash instance))) -;;; Object must be pinned to use this. -(defmacro fsc-instance-trailer-hash (fin) - `(sap-ref-32 (int-sap (get-lisp-obj-address ,fin)) - (- (+ (* 5 sb-vm:n-word-bytes) 4) sb-vm:fun-pointer-lowtag))) - ;;; Return a pseudorandom number that was assigned on allocation. ;;; FIN is a STANDARD-FUNCALLABLE-INSTANCE but we don't care to type-check it. ;;; You might rightly wonder - for what reason do we require good hash codes for @@ -135,15 +130,18 @@ ;;; due to a change in the definition of a method-combination. (declaim (inline fsc-instance-hash)) (defun fsc-instance-hash (fin) - (cond #+x86-64 - ((= (logand (function-header-word (truly-the function fin)) #xFF00) - (ash 5 sb-vm:n-widetag-bits)) ; KLUDGE: 5 data words implies 2 raw words - ;; get the upper 4 bytes of wordindex 5 - (with-pinned-objects (fin) (fsc-instance-trailer-hash fin))) - (t - (truly-the hash-code - (sb-pcl::standard-funcallable-instance-hash-code - (truly-the sb-pcl::standard-funcallable-instance fin)))))) + (truly-the hash-code + #+compact-instance-header + (with-pinned-objects (fin) + (let ((hash (sb-vm::compact-fsc-instance-hash + (truly-the sb-pcl::standard-funcallable-instance fin)))) + ;; There is not more entropy imparted by doing a mix step on a value that had + ;; at most 32 bits of randomness, but this makes more of the bits vary. + ;; Some uses of the hash might expect the high bits to have randomness in them. + (logand (murmur-fmix-word hash) most-positive-fixnum))) + #-compact-instance-header + (sb-pcl::standard-funcallable-instance-hash-code + (truly-the sb-pcl::standard-funcallable-instance fin)))) (declaim (inline integer-sxhash)) (defun integer-sxhash (x) diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index 97df630de6..94f65ee106 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -200,7 +200,8 @@ (defun write-funinstance-prologue (fin) - ;; Encode: MOV RAX,[RIP+9] / JMP [RAX-3] / 6-byte NOP + ;; Encode: MOV RAX,[RIP+9] / JMP [RAX-3] / NOP / MOV EBX, #x0 + ;; and the #x0 is replaced with a hash code. (declare (ignorable fin)) #-immobile-space (return-from write-funinstance-prologue) (with-pinned-objects (fin) @@ -210,7 +211,7 @@ ;; because by a stroke of luck, they all look fixnum-tagged. (setf (sap-ref-sap sap -8) sap (sap-ref-word sap 0) #xFF00000009058B48 - (sap-ref-word sap 8) #x0000441F0F66FD60))) + (sap-ref-word sap 8) #x00000000BB90FD60))) (update-dynamic-space-code-tree fin) fin) diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index d624111921..b78eb9b1a1 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -622,3 +622,11 @@ (defmacro unbound-marker-bits () (logior (+ sb-vm:static-space-start #x100) unbound-marker-widetag)) + +;;; See WRITE-FUNINSTANCE-PROLOGUE in x86-64-vm. +;;; There are 4 bytes available in the imm32 operand of a dummy MOV instruction. +;;; (It's a valid instruction on the theory that illegal opcodes might cause +;;; the decode stage in the CPU to behave suboptimally) +(defmacro compact-fsc-instance-hash (fin) + `(sap-ref-32 (int-sap (get-lisp-obj-address ,fin)) + (+ (ash 3 word-shift) 4 (- fun-pointer-lowtag)))) diff --git a/src/pcl/class-init.lisp b/src/pcl/class-init.lisp index 450c5dd488..5fd0e376e4 100644 --- a/src/pcl/class-init.lisp +++ b/src/pcl/class-init.lisp @@ -65,14 +65,24 @@ (defun allocate-standard-funcallable-instance (wrapper name) (declare (wrapper wrapper)) (let* ((hash (if name + ;; Named functions have a predictable hash (mix (sxhash name) (sxhash :generic-function)) ; arb. constant (sb-impl::quasi-random-address-based-hash (load-time-value (make-array 1 :element-type '(and fixnum unsigned-byte))) most-positive-fixnum))) (slots (make-array (wrapper-length wrapper) :initial-element +slot-unbound+)) (fin (truly-the funcallable-instance - (%make-standard-funcallable-instance slots hash)))) + (%make-standard-funcallable-instance + slots #-compact-instance-header hash)))) (setf (%fun-wrapper fin) wrapper) + #+compact-instance-header + (let ((32-bit-hash + ;; don't know how good our hash is, so use all N-FIXNUM-BITS of it + ;; as input to murmur-hash, which should definitely affect all bits, + ;; and then take 32 bits of that result. + (ldb (byte 32 0) (sb-impl:murmur-fmix-word hash)))) + (sb-sys:with-pinned-objects (fin) + (setf (sb-vm::compact-fsc-instance-hash fin) 32-bit-hash))) (setf (%funcallable-instance-fun fin) (lambda (&rest args) (declare (ignore args)) diff --git a/src/pcl/pre-warm.lisp b/src/pcl/pre-warm.lisp index d75fec221f..d1e167bc90 100644 --- a/src/pcl/pre-warm.lisp +++ b/src/pcl/pre-warm.lisp @@ -61,8 +61,11 @@ :metaclass-name static-classoid :metaclass-constructor make-static-classoid :dd-type funcallable-structure) +;; for x86-64 with compact-instance-header, generic functions are 6 words: +;; header, entrypoint, raw (x2), implementation function, slot vector +;; and the hash goes in 4 unused bytes of the second raw slot. (sb-kernel:!defstruct-with-alternate-metaclass standard-funcallable-instance - :slot-names (clos-slots hash-code) + :slot-names (clos-slots #-compact-instance-header hash-code) :constructor %make-standard-funcallable-instance :superclass-name function :metaclass-name static-classoid diff --git a/tests/print.impure.lisp b/tests/print.impure.lisp index ae6e159dc8..87fa523414 100644 --- a/tests/print.impure.lisp +++ b/tests/print.impure.lisp @@ -873,7 +873,9 @@ there")))) (assert (search "#<SB-KERNEL:FUNCALLABLE-INSTANCE {" str))))) (with-test (:name :functionless-funcallable-instance) - (let ((x (sb-pcl::%make-standard-funcallable-instance #() #xdead))) + (let ((x (sb-pcl::%make-standard-funcallable-instance + #() + #-compact-instance-header #xdead))) (assert (search "#<SB-PCL::STANDARD-FUNCALLABLE-INSTANCE" (write-to-string x :pretty nil))))) ; should not crash From b8ff0a48666903e8c4692cc07d93a0b9faa951f1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 10 Aug 2022 23:53:02 -0400 Subject: [PATCH 3823/4023] Pass a GC space identifier to os_validate Let it figure out what to do for the particular arch/os and space. So coreparse is clearer, and win32 doesn't need to expose validate_nocommit. --- src/compiler/generic/genesis.lisp | 2 + src/runtime/bsd-os.c | 9 ++++- src/runtime/coreparse.c | 15 +------- src/runtime/gencgc.c | 2 +- src/runtime/haiku-os.c | 2 +- src/runtime/linux-mman.c | 2 +- src/runtime/os-common.c | 4 +- src/runtime/os.h | 6 +-- src/runtime/stringspace.c | 4 +- src/runtime/sunos-os.c | 2 +- src/runtime/thread.c | 2 +- src/runtime/validate.c | 61 +++++++++---------------------- src/runtime/win32-os.c | 11 ++++-- tools-for-build/corefile.lisp | 4 ++ 14 files changed, 53 insertions(+), 73 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 7135f5d73a..3432175855 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -255,6 +255,8 @@ (defvar *immobile-text*) (defvar *immobile-space-map* nil)) +;;; This ignores linkage-table-core-space-id +;;; which is never present in the core file. (defconstant max-core-space-id (+ 3 #+immobile-space 2 #+darwin-jit 1)) diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 4c41d3ca50..659ef0e172 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -117,8 +117,15 @@ os_context_sigmask_addr(os_context_t *context) } os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int executable, int jit) +os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id) { + int __attribute((unused)) + executable = (space_id == READ_ONLY_CORE_SPACE_ID) || + (space_id == LINKAGE_TABLE_CORE_SPACE_ID) || + (space_id == STATIC_CODE_CORE_SPACE_ID), + jit = (space_id == STATIC_CODE_CORE_SPACE_ID) || (space_id == DYNAMIC_CORE_SPACE_ID) + ? 1 : (space_id == LINKAGE_TABLE_CORE_SPACE_ID) ? 2 : 0; + int protection; int flags = 0; diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 72834c0014..762e7ccdc7 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -833,19 +833,8 @@ process_directory(int count, struct ndir_entry *entry, else #endif if (request) { -#ifdef LISP_FEATURE_WIN32 - if (id == DYNAMIC_CORE_SPACE_ID) { - addr = (uword_t)os_validate_nocommit(sub_2gb_flag ? MOVABLE_LOW : MOVABLE, - (os_vm_address_t)addr, request); - } - else -#endif - { - addr = (uword_t)os_validate(sub_2gb_flag ? MOVABLE_LOW : MOVABLE, - (os_vm_address_t)addr, request, - id == READ_ONLY_CORE_SPACE_ID, - id == DYNAMIC_CORE_SPACE_ID); - } + addr = (uword_t)os_validate(sub_2gb_flag ? MOVABLE_LOW : MOVABLE, + (os_vm_address_t)addr, request, id); if (!addr) { lose("Can't allocate %#"OBJ_FMTX" bytes for space %ld", (lispobj)request, id); diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index c0c5610f3e..ac2a63cef6 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -668,7 +668,7 @@ zero_range_with_mmap(os_vm_address_t addr, os_vm_size_t length) { #else void *new_addr; os_invalidate(addr, length); - new_addr = os_validate(NOT_MOVABLE, addr, length, 0, 1); + new_addr = os_validate(NOT_MOVABLE, addr, length, DYNAMIC_CORE_SPACE_ID); if (new_addr == NULL || new_addr != addr) { lose("remap_free_pages: page moved, %p ==> %p", addr, new_addr); diff --git a/src/runtime/haiku-os.c b/src/runtime/haiku-os.c index b4687ba64d..d2125a5920 100644 --- a/src/runtime/haiku-os.c +++ b/src/runtime/haiku-os.c @@ -8,7 +8,7 @@ os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) execute, int __attribute__((unused)) jit) + int __attribute__((unused)) space_id) { int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL; attributes &= ~IS_GUARD_PAGE; diff --git a/src/runtime/linux-mman.c b/src/runtime/linux-mman.c index 05481bdbad..4a2f6c168a 100644 --- a/src/runtime/linux-mman.c +++ b/src/runtime/linux-mman.c @@ -11,7 +11,7 @@ os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) execute, int __attribute__((unused)) jit) + int __attribute__((unused)) space_id) { int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL; attributes &= ~IS_GUARD_PAGE; diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 14aae90005..0a36b96c12 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -75,7 +75,7 @@ os_zero(os_vm_address_t addr, os_vm_size_t length) * zero-filled. */ os_invalidate(block_start, block_size); - addr = os_validate(NOT_MOVABLE, block_start, block_size, 0, 0); + addr = os_validate(NOT_MOVABLE, block_start, block_size, 0); if (addr == NULL || addr != block_start) lose("os_zero: block moved! %p ==> %p", block_start, addr); @@ -97,7 +97,7 @@ void os_deallocate(os_vm_address_t addr, os_vm_size_t len) { os_vm_address_t os_allocate(os_vm_size_t len) { - return os_validate(MOVABLE, (os_vm_address_t)NULL, len, 0, 0); + return os_validate(MOVABLE, (os_vm_address_t)NULL, len, 0); } void diff --git a/src/runtime/os.h b/src/runtime/os.h index b417336949..45ad9eb659 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -106,13 +106,11 @@ extern void os_zero(os_vm_address_t addr, os_vm_size_t length); #define IS_THREAD_STRUCT 4 #define MOVABLE_LOW (MOVABLE|ALLOCATE_LOW) #define IS_GUARD_PAGE 8 -extern os_vm_address_t os_validate(int movable, - os_vm_address_t addr, - os_vm_size_t len, int execute, int jit); +extern os_vm_address_t os_validate(int movable, os_vm_address_t addr, + os_vm_size_t len, int space_id); #ifdef LISP_FEATURE_WIN32 void os_commit_memory(os_vm_address_t addr, os_vm_size_t len); -os_vm_address_t os_validate_nocommit(int attributes, os_vm_address_t addr, os_vm_size_t len); #endif /* This function seems to undo the effect of os_validate(..). */ diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index 0719ec15c8..5cb462b456 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -193,7 +193,7 @@ void prepare_readonly_space(int purify, int print) int string_space_size = BACKEND_PAGE_BYTES; READ_ONLY_SPACE_START = (uword_t)os_validate(MOVABLE, (char*)DYNAMIC_SPACE_START - string_space_size, - string_space_size, 0, 0); + string_space_size, 0); READ_ONLY_SPACE_END = READ_ONLY_SPACE_START + string_space_size; read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; return; @@ -222,7 +222,7 @@ void prepare_readonly_space(int purify, int print) // Try to place readonly just below dynamic space, but it doesn't really matter where READ_ONLY_SPACE_START = (uword_t)os_validate(MOVABLE, (char*)DYNAMIC_SPACE_START - string_space_size, - string_space_size, 0, 0); + string_space_size, 0); READ_ONLY_SPACE_END = READ_ONLY_SPACE_START + string_space_size; read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c index 8e23a82f17..2ebdd52a11 100644 --- a/src/runtime/sunos-os.c +++ b/src/runtime/sunos-os.c @@ -29,7 +29,7 @@ void os_init() {} os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) execute, int __attribute__((unused)) jit) + int __attribute__((unused)) space_id) { int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL; attributes &= ~IS_GUARD_PAGE; diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 0cee88fd6b..fa0ac69cd1 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -886,7 +886,7 @@ alloc_thread_struct(void* spaces) { // if any newly started thread could refer a dead thread's heap objects. zeroize_stack = 1; } else { - spaces = os_validate(MOVABLE|IS_THREAD_STRUCT, NULL, THREAD_STRUCT_SIZE, 0, 0); + spaces = os_validate(MOVABLE|IS_THREAD_STRUCT, NULL, THREAD_STRUCT_SIZE, 0); if (!spaces) return NULL; } /* Aligning up is safe as THREAD_STRUCT_SIZE has diff --git a/src/runtime/validate.c b/src/runtime/validate.c index 68bd04142a..18284bb555 100644 --- a/src/runtime/validate.c +++ b/src/runtime/validate.c @@ -52,19 +52,6 @@ static const int should_allocate_low = 0; #endif -static void -ensure_space(int attributes, uword_t start, uword_t size, int execute, int jit) -{ - if (os_validate(attributes, (os_vm_address_t)start, (os_vm_size_t)size, execute, jit)==NULL) { - fprintf(stderr, - "ensure_space: failed to allocate %lu bytes at %p\n", - (long unsigned)size, (void*)start); - fprintf(stderr, - "(hint: Try \"ulimit -a\"; maybe you should increase memory limits.)\n"); - exit(1); - } -} - os_vm_address_t undefined_alien_address = 0; /* As contrasted with the useless os_vm_page_size which is identical to * the constant BACKEND_PAGE_BYTES that we define for various other purposes @@ -85,7 +72,7 @@ ensure_undefined_alien(void) { #else os_reported_page_size = getpagesize(); #endif - os_vm_address_t start = os_validate(MOVABLE|IS_GUARD_PAGE, NULL, os_reported_page_size, 0, 0); + os_vm_address_t start = os_validate(MOVABLE|IS_GUARD_PAGE, NULL, os_reported_page_size, 0); if (start) { undefined_alien_address = start; } else { @@ -95,47 +82,35 @@ ensure_undefined_alien(void) { boolean allocate_hardwired_spaces(boolean hard_failp) { -#ifdef PRINTNOISE - printf("allocating memory ..."); - fflush(stdout); -#endif struct { uword_t start; unsigned size; - int execute; - int jit; + int id; } preinit_spaces[] = { - { READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE, 1, 0}, - { LINKAGE_TABLE_SPACE_START, LINKAGE_TABLE_SPACE_SIZE, 1, 2}, - { STATIC_SPACE_START, STATIC_SPACE_SIZE, 0, 0}, + { READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE, READ_ONLY_CORE_SPACE_ID }, + { LINKAGE_TABLE_SPACE_START, LINKAGE_TABLE_SPACE_SIZE, LINKAGE_TABLE_CORE_SPACE_ID }, + { STATIC_SPACE_START, STATIC_SPACE_SIZE, STATIC_CORE_SPACE_ID }, #ifdef LISP_FEATURE_DARWIN_JIT - { STATIC_CODE_SPACE_START, STATIC_CODE_SPACE_SIZE, 1, 1}, + { STATIC_CODE_SPACE_START, STATIC_CODE_SPACE_SIZE, STATIC_CODE_CORE_SPACE_ID }, #endif }; int i; int n_spaces = sizeof preinit_spaces / sizeof preinit_spaces[0]; - boolean success = 1; for (i = 0; i< n_spaces; ++i) { if (!preinit_spaces[i].size) continue; - if (hard_failp) - ensure_space(NOT_MOVABLE | should_allocate_low, - preinit_spaces[i].start, - preinit_spaces[i].size, - preinit_spaces[i].execute, - preinit_spaces[i].jit); - else if (!os_validate(NOT_MOVABLE | should_allocate_low, - (os_vm_address_t)preinit_spaces[i].start, - preinit_spaces[i].size, - preinit_spaces[i].execute, - preinit_spaces[i].jit)) { - success = 0; - break; - } + if (os_validate(NOT_MOVABLE | should_allocate_low, + (os_vm_address_t)preinit_spaces[i].start, + preinit_spaces[i].size, + preinit_spaces[i].id)) continue; + if (!hard_failp) return 0; // soft fail. Try again after disabling ASLR + fprintf(stderr, + "failed to allocate %lu bytes at %p\n", + (long unsigned)preinit_spaces[i].size, (void*)preinit_spaces[i].start); + fprintf(stderr, + "(hint: Try \"ulimit -a\"; maybe you should increase memory limits.)\n"); + exit(1); } -#ifdef PRINTNOISE - printf(" done.\n"); -#endif - return success; + return 1; } void diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 6db0943dd2..1f33b8c1e5 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -763,10 +763,15 @@ uword_t get_monotonic_time() } #endif +static os_vm_address_t os_validate_nocommit(int,os_vm_address_t,os_vm_size_t); + os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) execute, int __attribute__((unused)) jit) +os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id) { + // Reserving the dynamic space doesn't commit it. + if (space_id == DYNAMIC_CORE_SPACE_ID && (attributes & MOVABLE)) + return os_validate_nocommit(attributes, addr, request); + if (!addr) { int protection = attributes & IS_GUARD_PAGE ? PAGE_NOACCESS : PAGE_EXECUTE_READWRITE; os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, protection); @@ -794,7 +799,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, /* Used to allocate the dynamic space, as it may be very large. * Dynamically comitted by gc_alloc_new_region() or gc_alloc_large() */ -os_vm_address_t +static os_vm_address_t os_validate_nocommit(int attributes, os_vm_address_t addr, os_vm_size_t len) { os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE, PAGE_EXECUTE_READWRITE); diff --git a/tools-for-build/corefile.lisp b/tools-for-build/corefile.lisp index 97e3d4f843..e48f462cbc 100644 --- a/tools-for-build/corefile.lisp +++ b/tools-for-build/corefile.lisp @@ -16,6 +16,7 @@ #:dynamic-core-space-id #:immobile-fixedobj-core-space-id #:immobile-text-core-space-id + #:linkage-table-core-space-id #:deflated-core-space-id-flag)) (in-package "SB-COREFILE") @@ -52,3 +53,6 @@ (defconstant immobile-text-core-space-id 5) (defconstant static-code-core-space-id 4) (defconstant deflated-core-space-id-flag 8) +;;; this space-id is not present in the core file +;;; but we need a unique ID to pass to os_validate +(defconstant linkage-table-core-space-id 101) From b1feb42d48f7a1a83bd14321fbffc92222a6233e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 11 Aug 2022 19:33:02 +0300 Subject: [PATCH 3824/4023] A typo in win32. --- src/runtime/win32-os.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 1f33b8c1e5..5cd40c1e17 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -770,7 +770,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id { // Reserving the dynamic space doesn't commit it. if (space_id == DYNAMIC_CORE_SPACE_ID && (attributes & MOVABLE)) - return os_validate_nocommit(attributes, addr, request); + return os_validate_nocommit(attributes, addr, len); if (!addr) { int protection = attributes & IS_GUARD_PAGE ? PAGE_NOACCESS : PAGE_EXECUTE_READWRITE; From 9d51ce552b8a7d31a4f31f5440def7df92d82a7a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 11 Aug 2022 19:59:11 +0300 Subject: [PATCH 3825/4023] Fix relocation.test.sh --- tests/heap-reloc/fake-mman.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/heap-reloc/fake-mman.c b/tests/heap-reloc/fake-mman.c index e00f0b7fb0..5c3ae82f85 100644 --- a/tests/heap-reloc/fake-mman.c +++ b/tests/heap-reloc/fake-mman.c @@ -62,7 +62,7 @@ void pick_fuzzed_addresses(unsigned long *addr1, os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) execute, int __attribute__((unused)) jit) + int __attribute__((unused)) space_id) { int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE; void *fuzzed = addr; From 0c6479345250f654ab364a1a9267497d5f7573e7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 11 Aug 2022 15:40:06 -0400 Subject: [PATCH 3826/4023] De-obfuscate fixnum-lowtags Symbols such as PAD0-LOWTAG don't really make sense in there --- src/code/class.lisp | 2 +- src/compiler/generic/early-objdef.lisp | 13 ++----------- src/compiler/generic/type-vops.lisp | 2 ++ src/compiler/type-vop-macros.lisp | 11 ++++------- 4 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/code/class.lisp b/src/code/class.lisp index 46dc954d75..6d39785da8 100644 --- a/src/code/class.lisp +++ b/src/code/class.lisp @@ -1119,7 +1119,7 @@ between the ~A definition and the ~A definition" (fixnum :translation (integer ,most-negative-fixnum ,most-positive-fixnum) :inherits (integer rational real number) - :codes ,(mapcar #'symbol-value sb-vm::fixnum-lowtags) + :codes ,sb-vm::fixnum-lowtags :prototype-form 42) (bignum :translation (and integer (not fixnum)) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 9031dc78ac..ffe1f31e17 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -97,17 +97,8 @@ other-pointer-lowtag)) (defconstant-eqx fixnum-lowtags - #.(let ((fixtags nil)) - (do-external-symbols (sym "SB-VM") - (let* ((name (symbol-name sym)) - (len (length name))) - (when (and (boundp sym) - (integerp (symbol-value sym)) - (> len 7) - (string= name "-LOWTAG" :start1 (- len 7)) - (zerop (logand (symbol-value sym) fixnum-tag-mask))) - (push sym fixtags)))) - `',(sort fixtags #'string< :key #'symbol-name)) + '#.(loop for i from 0 to lowtag-mask + when (zerop (logand i fixnum-tag-mask)) collect i) #'equal) ;;; the heap types, stored in 8 bits of the header of an object on the diff --git a/src/compiler/generic/type-vops.lisp b/src/compiler/generic/type-vops.lisp index 8b5695193c..1c6f7bbd2e 100644 --- a/src/compiler/generic/type-vops.lisp +++ b/src/compiler/generic/type-vops.lisp @@ -23,6 +23,8 @@ ;;; from its default definition, so that's gotta be allowed, or else make-host-2 ;;; would produce a null expansion for every type-vop. (defmacro define-type-vop (pred-name type-codes) + ;; This EVAL is a bit sloppy but it (somewhat surprisingly) serves a real purpose + ;; in that you can gives the set of types code as symbols and/or integers. (let ((cost (if (> (reduce #'max type-codes :key #'eval) lowtag-limit) 7 4))) diff --git a/src/compiler/type-vop-macros.lisp b/src/compiler/type-vop-macros.lisp index d17c5b670d..86ad410c10 100644 --- a/src/compiler/type-vop-macros.lisp +++ b/src/compiler/type-vop-macros.lisp @@ -120,10 +120,9 @@ &key &allow-other-keys) ;; Determine what interesting combinations we need to test for. (let* ((type-codes (mapcar #'eval type-codes)) - (fixnump (and (every (lambda (lowtag) - (member lowtag type-codes)) - '#.(mapcar #'symbol-value fixnum-lowtags)) - t)) + ;; FIXNUMP is true if every one of the fixnum lowtags is present + ;; in your specified list of type-codes (NOT the other way 'round) + (fixnump (subsetp fixnum-lowtags type-codes)) ;; On 64-bit, UNBOUND-MARKER-WIDETAG may be smaller than LOWTAG-LIMIT ;; but it is not a lowtag. (lowtags (remove unbound-marker-widetag @@ -161,9 +160,7 @@ (remf other-args :value-tn-ref)) (cond (fixnump - (when (remove-if (lambda (x) - (member x '#.(mapcar #'symbol-value fixnum-lowtags))) - lowtags) + (when (set-difference lowtags fixnum-lowtags) (error "can't mix fixnum testing with other lowtags")) (when function-p (error "can't mix fixnum testing with function subtype testing")) From d123521e16b5e1e664b489aef4124e4d652cbfd4 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 11 Aug 2022 23:48:04 +0300 Subject: [PATCH 3827/4023] Remove some old stray type declaration. --- src/code/debug-int.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index d7315c333a..41e731b5c4 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -512,7 +512,7 @@ ;; (unexported) To see SB-C::LOCATION-KIND, do ;; (SB-KERNEL:TYPEXPAND 'SB-C::LOCATION-KIND). (kind :unparsed :type (or (member :unparsed) sb-c::location-kind)) - (step-info :unparsed :type (or (member :unparsed :foo) simple-string)) + (step-info :unparsed :type (or (member :unparsed) simple-string)) (context :unparsed)) ;;;; frames From 095c936f8bd6414ddc8398e56c9a6f79366078ac Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 11 Aug 2022 17:25:16 -0400 Subject: [PATCH 3828/4023] Fix spurious test failure The test wasn't mocking out the sequence of events properly. Which is to say, I am all but certain that in real-world use the assertion that failed would not have failed. And the FIXME at component_ptr_from_pc() was fixed. --- src/runtime/gc-common.c | 8 ++++++-- tests/gc-testlib.c | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 4647750874..0291c50234 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1949,8 +1949,12 @@ sword_t scav_code_blob(lispobj *object, lispobj header); lispobj * component_ptr_from_pc(char *pc) { - /* FIXME: this is the wrong way to go about finding code, - * because it won't look in the codeblob tree for immobile space. */ + /* This will safely look in one or both codeblob trees and/or the + * sorted array of immobile text pages. Failing those, it'll perform + * the usual linear scan of generation 1 and up pages. In any case + * it should be perfectly threadsafe because the trees are made of immutable + * nodes, and linear scan only operates on pages that can't be + * concurrently manipulated */ lispobj *object = search_all_gc_spaces(pc); if (object != NULL && widetag_of(object) == CODE_HEADER_WIDETAG) diff --git a/tests/gc-testlib.c b/tests/gc-testlib.c index 976b46cf8b..181723218e 100644 --- a/tests/gc-testlib.c +++ b/tests/gc-testlib.c @@ -71,6 +71,16 @@ static void perform_gc(lispobj* stackptr) gc_active_p = 1; gc_close_collector_regions(0); // TODO: should be THREAD_PAGE_FLAG close_current_thread_tlab(); + + /* We have to clobber the dynamic space codeblob tree because ordinarily + * it gets smashed at the start of collect_garbage(), and since this test + * bypasses collect_garbage(), the GC might have problems later. + * (Not exactly sure how, but "header not OK for code page" was triggering) + * So, handily, since there are no concurrency issues in this test, + * it doesn't matter that the GC can't utilize the tree. It falls back + * to scanning code pages linearly in preserve_pointer which is fine. */ + SYMBOL(DYNSPACE_CODEBLOB_TREE)->value = NIL; + verify_heap(stackptr, VERIFY_PRE_GC); garbage_collect_generation(0, 0, stackptr); gc_active_p = 0; From 62bfe90d13bb5f53c22bc3aead6e26755eac084e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 11 Aug 2022 17:39:40 -0400 Subject: [PATCH 3829/4023] Fix genesis to reject duplicate defuns (again) Any performance lost by not inlining EQUAL-HASH is gained back by adding a few ftype declarations. --- src/code/target-hash-table.lisp | 12 +++++++++++- src/code/target-sxhash.lisp | 2 +- src/compiler/generic/genesis.lisp | 5 +---- src/compiler/generic/vm-fndb.lisp | 10 ++++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 636c92dfff..48b6aa5da4 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -52,6 +52,11 @@ (and (hash-table-weak-p ht) (decode-hash-table-weakness (ht-flags-weakness (hash-table-flags ht))))) +;;; Hash table hash functions can return any FIXNUM, because POINTER-HASH can. +;;; This is less restrictive than SXHASH which says it has to be positive. +(declaim (ftype (sfunction (t) (values fixnum boolean)) + eq-hash eql-hash equal-hash equalp-hash)) + (declaim (inline eq-hash)) (defun eq-hash (key) (declare (values fixnum (member t nil))) @@ -109,7 +114,12 @@ ;; is not n. (define-eql-hash eql-hash-no-memoize symbol-hash)) -(declaim (inline equal-hash)) +;;; As a consequence of change 3bdd4d28ed, the compiler started to emit multiple +;;; definitions of certain INLINE global functions. +;;; Genesis is so fraught with other pitfalls and traps that I want no chance +;;; of seeing duplicate definitions. So no INLINE here. Tail wagging the dog? +;;; Perhaps, but that was an dangerous thing to sneakily allow. +;; (declaim (inline equal-hash)) (defun equal-hash (key) (declare (values fixnum (member t nil))) (typecase key diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index e400dab49f..9bf51fff1c 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -119,7 +119,7 @@ (instance-header-word (truly-the instance instance))) ;; easy case: 1 word beyond the apparent length is a word added ;; by GC (which may have resized the object, but we don't need to know). - (%instance-ref instance (%instance-length instance)) + (truly-the hash-code (%instance-ref instance (%instance-length instance))) (%instance-sxhash instance))) ;;; Return a pseudorandom number that was assigned on allocation. diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 3432175855..2842b86169 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2162,10 +2162,7 @@ core and return a descriptor to it." name)))) (let ((existing (read-wordindexed fdefn sb-vm:fdefn-fun-slot))) (unless (or (cold-null existing) (descriptor= existing function)) - (funcall (if (eq name 'sb-impl::equal-hash) ; KLUDGE - 'warn - 'error) - "Function multiply defined: ~S. Was ~x is ~x" name + (error "Function multiply defined: ~S. Was ~x is ~x" name (descriptor-bits existing) (descriptor-bits function)))) (write-wordindexed fdefn sb-vm:fdefn-fun-slot function) diff --git a/src/compiler/generic/vm-fndb.lisp b/src/compiler/generic/vm-fndb.lisp index bc3d237439..e11da354e7 100644 --- a/src/compiler/generic/vm-fndb.lisp +++ b/src/compiler/generic/vm-fndb.lisp @@ -102,6 +102,16 @@ boolean (foldable flushable no-verify-arg-count)) +(defknown (sb-impl::instance-sxhash sb-impl::%instance-sxhash) + (instance) hash-code (flushable)) +;;; SXHASH values on numbers and strings are predictable, therefore the next batch +;;; of functions are flushable. Perhaps not entirely obviously, symbol hashes are +;;; predictable because we hash by name. And while ENSURE-SYMBOL-HASH is not +;;; - strictly speaking - a side-effectless operation, it has no effect as far as +;;; user-written code is concerned. i.e. nothing portably expressed can discern +;;; whether memoization of the hash occurred. (I feel like we would have a cleaner +;;; implementation if we just eagerly compute the hash anyway. Practically all +;;; symbols eventually get hashed) (defknown sb-impl::number-sxhash (number) hash-code (foldable flushable)) (defknown %sxhash-string (string) hash-code (foldable flushable)) (defknown %sxhash-simple-string (simple-string) hash-code (foldable flushable)) From 261d3e594a54aa635b16a8a5627370ba2ade7399 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 11 Aug 2022 18:58:13 -0400 Subject: [PATCH 3830/4023] Remove equal-hash/unstable Just use an address-based hash for INSTANCE types in equal-hash. And dispatch in a slightly improved way versus TYPECASE. --- src/code/print.lisp | 3 -- src/code/target-hash-table.lisp | 88 ++++++++++++++++++++++---------- src/compiler/generic/objdef.lisp | 5 ++ tests/hash-table.impure.lisp | 6 ++- 4 files changed, 70 insertions(+), 32 deletions(-) diff --git a/src/code/print.lisp b/src/code/print.lisp index 3a4214837f..ce3fed6d46 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -2031,9 +2031,6 @@ variable: an unreadable object representing the error is printed instead.") ;;;; catch-all for unknown things -(declaim (inline lowtag-of)) -(defun lowtag-of (x) (logand (get-lisp-obj-address x) sb-vm:lowtag-mask)) - (defmethod print-object ((object t) stream) (when (eq object sb-pcl:+slot-unbound+) ;; If specifically the unbound marker with 0 data, diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 48b6aa5da4..5051b93ce9 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -114,6 +114,45 @@ ;; is not n. (define-eql-hash eql-hash-no-memoize symbol-hash)) +;;; Decide if WIDETAG (an OTHER-POINTER) should use SXHASH in EQUAL-HASH +(defmacro equal-hash-sxhash-widetag-p (widetag) + (let ((list `(,sb-vm:simple-base-string-widetag + ,sb-vm:simple-character-string-widetag + ,sb-vm:complex-base-string-widetag + ,sb-vm:complex-character-string-widetag + ,sb-vm:bignum-widetag + ,sb-vm:ratio-widetag + ,sb-vm:double-float-widetag + ,sb-vm:complex-widetag + ,sb-vm:complex-single-float-widetag + ,sb-vm:complex-double-float-widetag + ,sb-vm:simple-bit-vector-widetag + ,sb-vm:complex-bit-vector-widetag))) + (let ((mask 0)) + (dolist (i list mask) + (setf mask (logior mask (ash 1 (ash i -2))))) + #+64-bit `(logbitp (ash ,widetag -2) ,mask) + #-64-bit `(let ((bit (ash ,widetag -2))) + (if (<= bit 31) + (logbitp bit ,(ldb (byte 32 0) mask)) + (logbitp (- bit 32) ,(ash mask -32))))))) + +;;; this macro has not been tested on 32-bit +;;; (quite obviously the OTHER-IMMEDIATE case is wrong) and +;;; probably doesn't work on ppc64 due the alternate lowtag assignments. +(defmacro lowtag-case (x &rest clauses) + `(case (lowtag-of ,x) + ,@(mapcar (lambda (clause) + `(,(case (car clause) + (instance sb-vm:instance-pointer-lowtag) + (list sb-vm:list-pointer-lowtag) + (function sb-vm:fun-pointer-lowtag) + (other-immediate '(1 5 9 13)) + (fixnum sb-vm::fixnum-lowtags) + (other-pointer sb-vm:other-pointer-lowtag)) + ,@(cdr clause))) + clauses))) + ;;; As a consequence of change 3bdd4d28ed, the compiler started to emit multiple ;;; definitions of certain INLINE global functions. ;;; Genesis is so fraught with other pitfalls and traps that I want no chance @@ -122,6 +161,27 @@ ;; (declaim (inline equal-hash)) (defun equal-hash (key) (declare (values fixnum (member t nil))) + ;; Ultimately we just need to choose between SXHASH or EQ-HASH. As to using + ;; INSTANCE-SXHASH, it doesn't matter, and in fact it's quicker to use EQ-HASH. + ;; If the outermost object passed as a key is LIST, then it descends using SXASH, + ;; you will in fact get stable hashes for nested objects. + ;; Same for symbols- hash-tables don't care whether we use SYMBOL-HASH. + ;; It's mainly for users who call SXHASH directly that stable hashes are important. + ;; I have not benchmarked this for other than x86-64. + #+x86-64 + (if (lowtag-case key + ;; pathnames require SXHASH, all other instances are indifferent. + (instance (pathnamep (truly-the instance key))) + (list t) + (other-pointer (equal-hash-sxhash-widetag-p (%other-pointer-widetag key))) + (function nil) + (fixnum nil) + ;; EQUAL on numbers is the same as EQL on numbers, so single-float + ;; does *not* need to be picked off here. + (other-immediate nil)) + (values (sxhash key) nil) + (eq-hash key)) + #-x86-64 (typecase key ;; For some types the definition of EQUAL implies a special hash ((or string cons number bit-vector pathname) @@ -131,7 +191,6 @@ ;; And wow, typecase isn't enough to get use to use the transform ;; for (sxhash symbol) without an explicit THE form. (symbol (values (sxhash (the symbol key)) nil)) ; transformed - (instance (values (instance-sxhash key) nil)) ;; Otherwise use an EQ hash, rather than SXHASH, since the values ;; of SXHASH will be extremely badly distributed due to the ;; requirements of the spec fitting badly with our implementation @@ -139,20 +198,6 @@ (t (eq-hash key)))) -;;; Basically the same as EQUAL hash, but do not use the stable hash on instances -;;; so that we do not cause all structures (in the worst case) to grow a new slot. -;;; This is not for user consumption. I thought it might be needed for internals, -;;; but EQUAL hashing of structures turned out to stem from a compiler bug in our dumping -;;; of structure constants: we should never look in the similar constants table, -;;; because either there is an EQ one or there isn't. -;;; But maybe there are other use-cases where it is beneficial to store structures -;;; in an EQUAL table without causing them to be extended by one slot. -(defun equal-hash/unstable (key) - (declare (values fixnum (member t nil))) - (if (typep key '(or string cons number bit-vector pathname symbol)) - (values (sxhash key) nil) - (eq-hash key))) - (defun equalp-hash (key) (declare (values fixnum (member t nil))) (typecase key @@ -440,18 +485,7 @@ Examples: ((or (eq test #'eql) (eq test 'eql)) (values 1 'eql #'eql #'eql-hash)) ((or (eq test #'equal) (eq test 'equal)) - ;; As an unadvertised feature, you can pick whether instances should receive - ;; stable or address-based hashes. A use-case for address-based would be for - ;; in system code so as not to incur memory growth by causing user structures - ;; to accrete a stable hash slot due to key movement by GC. - ;; USERFUNP must remain NIL in that case to permit address-based hashing. - (values 2 'equal #'equal - (let ((instance-addr-hashing - (or (eq hash-function #'equal-hash/unstable) - (eq hash-function 'equal-hash/unstable)))) - (when instance-addr-hashing - (setq user-hashfun-p nil)) - (if instance-addr-hashing #'equal-hash/unstable #'equal-hash)))) + (values 2 'equal #'equal #'equal-hash)) ((or (eq test #'equalp) (eq test 'equalp)) (values 3 'equalp #'equalp #'equalp-hash)) (t diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index 60d6a23801..e3ef346be6 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -718,3 +718,8 @@ during backtrace. ;;; size of NIL in bytes that we report for primitive-object-size. (defconstant static-space-objects-start (+ nil-symbol-slots-start (ash (1- sizeof-nil-in-words) word-shift))) + +#-sb-xc-host +(progn +(declaim (inline lowtag-of)) +(defun lowtag-of (x) (logand (get-lisp-obj-address x) sb-vm:lowtag-mask))) diff --git a/tests/hash-table.impure.lisp b/tests/hash-table.impure.lisp index 4d0475ab7b..3cf66e8a51 100644 --- a/tests/hash-table.impure.lisp +++ b/tests/hash-table.impure.lisp @@ -41,7 +41,8 @@ (let ((ht (make-hash-table :test 'eq))) (setf (gethash (make-symbol "GOO") ht) 1) (assert (is-address-sensitive ht))) - (dolist (test '(eql equal equalp)) + ;; EQUAL tables don't use SYMBOL-HASH + (dolist (test '(eql equalp)) (let ((ht (make-hash-table :test test))) (setf (gethash (make-symbol "GOO") ht) 1) (assert (not (is-address-sensitive ht)))))) @@ -53,7 +54,8 @@ (let ((ht (make-hash-table :test test))) (setf (gethash (make-instance 'ship) ht) 1) (assert (is-address-sensitive ht)))) - (dolist (test '(equal equalp)) + ;; EQUAL tables don't use INSTANCES-SXHASH + (dolist (test '(equalp)) (let ((ht (make-hash-table :test test))) (setf (gethash (make-instance 'ship) ht) 1) (assert (not (is-address-sensitive ht)))))) From 5b022745f4d9b4d52bb6c72bbd983e156d376bd3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 11 Aug 2022 20:33:58 -0400 Subject: [PATCH 3831/4023] Unbreak #-sb-unicode --- src/code/target-hash-table.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 5051b93ce9..37019c614b 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -117,9 +117,9 @@ ;;; Decide if WIDETAG (an OTHER-POINTER) should use SXHASH in EQUAL-HASH (defmacro equal-hash-sxhash-widetag-p (widetag) (let ((list `(,sb-vm:simple-base-string-widetag - ,sb-vm:simple-character-string-widetag + #+sb-unicode ,sb-vm:simple-character-string-widetag ,sb-vm:complex-base-string-widetag - ,sb-vm:complex-character-string-widetag + #+sb-unicode ,sb-vm:complex-character-string-widetag ,sb-vm:bignum-widetag ,sb-vm:ratio-widetag ,sb-vm:double-float-widetag From 4a8442cf9b2dee790617d2bf5c043c5e45d95ed7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 11 Aug 2022 22:24:27 -0400 Subject: [PATCH 3832/4023] Speed up fop-load-code for genesis --- src/compiler/generic/genesis.lisp | 46 +++++++++++++++++-------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 2842b86169..a37b8c3587 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -150,10 +150,19 @@ (loop repeat (- data-length bvlength) do (write-byte 0 stream))))) ;;; analogous to READ-SEQUENCE-OR-DIE, but for a BIGVEC -(defun read-bigvec-as-sequence-or-die (bigvec stream &key (start 0) end) - (loop for i of-type index from start below (or end (bvlength bigvec)) do - (setf (bvref bigvec i) - (read-byte stream)))) +;;; FIXME: should signal error on EOF +(defun read-into-bigvec (bigvec stream start nbytes) + ;; compute the coordinates of the start and end + (binding* (((start-outer start-inner) (floor start +smallvec-length+)) + ;; this the INCLUSIVE bound on the ending element + (end-outer (floor (+ start nbytes -1) +smallvec-length+))) + ;; if it's all into a single outer vector, take the quick route + (if (= start-outer end-outer) + (read-sequence (elt (bigvec-outer-vector bigvec) start-outer) stream + :start start-inner :end (+ start-inner nbytes)) + ;; KISS - use the slow algorithm rather than any "partial read" cleverness + (loop for i of-type index from start repeat nbytes + do (setf (bvref bigvec i) (read-byte stream)))))) ;;; Grow BIGVEC (exponentially, so that large increases in size have ;;; asymptotic logarithmic cost per byte). @@ -2770,11 +2779,9 @@ Legal values for OFFSET are -4, -8, -12, ..." (write-wordindexed des sb-vm:code-debug-info-slot (svref stack (+ stack-index n-constants))) - (let* ((start (+ (descriptor-byte-offset des) - (ash aligned-n-boxed-words sb-vm:word-shift))) - (end (+ start n-code-bytes))) - (read-bigvec-as-sequence-or-die (descriptor-mem des) (fasl-input-stream) - :start start :end end) + (let ((start (+ (descriptor-byte-offset des) + (ash aligned-n-boxed-words sb-vm:word-shift)))) + (read-into-bigvec (descriptor-mem des) (fasl-input-stream) start n-code-bytes) (aver (= (code-n-entries des) n-simple-funs)) (let ((jumptable-word (read-bits-wordindexed des aligned-n-boxed-words))) (aver (zerop (ash jumptable-word -14))) @@ -2787,8 +2794,9 @@ Legal values for OFFSET are -4, -8, -12, ..." (format *trace-output* "~&LOAD-CODE: ~d header words, ~d code bytes.~%" n-boxed-words n-code-bytes) - (do ((i start (+ i sb-vm:n-word-bytes))) - ((>= i end)) + (do ((i start (+ i sb-vm:n-word-bytes)) + (count (floor n-code-bytes sb-vm:n-word-bytes) (1- count))) + ((zerop count)) (format *trace-output* " ~X: ~V,'.X~%" (+ i (gspace-byte-address (descriptor-gspace des))) @@ -2862,10 +2870,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (write-code-header-words asm-code header-n-words rounded-length 0) (let ((start (+ (descriptor-byte-offset asm-code) (ash header-n-words sb-vm:word-shift)))) - (read-bigvec-as-sequence-or-die (descriptor-mem asm-code) - (fasl-input-stream) - :start start - :end (+ start length))) + (read-into-bigvec (descriptor-mem asm-code) (fasl-input-stream) start length)) ;; Write a bignum reference into the boxed constants. ;; All the backends should do this, as its avoids consing in GENERIC-NEGATE ;; when the argument is MOST-NEGATIVE-FIXNUM. @@ -4177,10 +4182,9 @@ III. initially undefined function references (alphabetically): (double-float-from-core x)) (#.sb-vm:bignum-widetag (bignum-from-core x)))))))) -(defun read-n-bytes (stream vector start end) +;;; This is for FOP-SPEC-VECTOR which always supplies 0 for the start +(defun read-n-bytes (stream vector start nbytes) (aver (zerop start)) - (let* ((start (+ (descriptor-byte-offset vector) - (ash sb-vm:vector-data-offset sb-vm:word-shift))) - (end (+ start end))) - (read-bigvec-as-sequence-or-die (descriptor-mem vector) - stream :start start :end end))) + (let ((start (+ (descriptor-byte-offset vector) + (ash sb-vm:vector-data-offset sb-vm:word-shift)))) + (read-into-bigvec (descriptor-mem vector) stream start nbytes))) From 876e4c41dce219b9aee260a804bd4b249a96a997 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 12 Aug 2022 07:39:55 -0400 Subject: [PATCH 3833/4023] Optimize QUOTE-STRING --- src/code/print.lisp | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/code/print.lisp b/src/code/print.lisp index ce3fed6d46..3c26eed53f 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -1061,22 +1061,35 @@ variable: an unreadable object representing the error is printed instead.") (t (output-unreadable-array-readably vector stream)))))) -;;; This function outputs a string quoting characters sufficiently -;;; so that someone can read it in again. Basically, put a slash in -;;; front of an character satisfying NEEDS-SLASH-P. +;;; Output a string, quoting characters to be readable by putting a slash in front +;;; of any character satisfying NEEDS-SLASH-P. (defun quote-string (string stream) (macrolet ((needs-slash-p (char) ;; KLUDGE: We probably should look at the readtable, but just do ;; this for now. [noted by anonymous long ago] -- WHN 19991130 - `(or (char= ,char #\\) - (char= ,char #\")))) + `(let ((c ,char)) (or (char= c #\\) (char= c #\")))) + (scan (type) + ;; Pre-test for any escaping, and if needed, do char-at-a-time output. + ;; For 1 or 0 characters, always take the WRITE-CHAR branch. + `(let ((data (truly-the ,type data))) + (declare (optimize (sb-c:insert-array-bounds-checks 0))) + (when (or (<= (- end start) 1) + (do ((index start (1+ index))) + ((>= index end)) + (when (needs-slash-p (schar data index)) (return t)))) + (do ((index start (1+ index))) + ((>= index end) (return-from quote-string)) + (let ((char (schar data index))) + (when (needs-slash-p char) (write-char #\\ stream)) + (write-char char stream))))))) (with-array-data ((data string) (start) (end) :check-fill-pointer t) - (do ((index start (1+ index))) - ((>= index end)) - (let ((char (schar data index))) - (when (needs-slash-p char) (write-char #\\ stream)) - (write-char char stream)))))) + (if (= (%other-pointer-widetag data) sb-vm:simple-base-string-widetag) + (scan simple-base-string) + #+sb-unicode (scan simple-character-string))) + ;; If no escaping needed, WRITE-STRING is way faster, up to 2x in my testing, + ;; than WRITE-CHAR because the stream layer will get so many fewer calls. + (write-string string stream))) (defun array-readably-printable-p (array) (and (eq (array-element-type array) t) From 45d9120557d0f7fd602a82b731189141bdf2c40c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 12 Aug 2022 09:33:04 -0400 Subject: [PATCH 3834/4023] Use a standard predicate --- src/code/print.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/print.lisp b/src/code/print.lisp index 3c26eed53f..452afedc72 100644 --- a/src/code/print.lisp +++ b/src/code/print.lisp @@ -1084,7 +1084,7 @@ variable: an unreadable object representing the error is printed instead.") (write-char char stream))))))) (with-array-data ((data string) (start) (end) :check-fill-pointer t) - (if (= (%other-pointer-widetag data) sb-vm:simple-base-string-widetag) + (if (simple-base-string-p data) (scan simple-base-string) #+sb-unicode (scan simple-character-string))) ;; If no escaping needed, WRITE-STRING is way faster, up to 2x in my testing, From bc07e60c47e4063af9187a529dbe9b789f06578c Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 12 Aug 2022 20:24:45 +0300 Subject: [PATCH 3835/4023] x86-64: implement structure-typep. --- NEWS | 3 + src/compiler/arm64/type-vops.lisp | 2 +- src/compiler/ir2opt.lisp | 2 +- src/compiler/x86-64/system.lisp | 46 --------------- src/compiler/x86-64/type-vops.lisp | 95 ++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 48 deletions(-) diff --git a/NEWS b/NEWS index 07c160d9b2..63f5fb61aa 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,7 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- +changes relative to sbcl-2.2.6: + * optimization: adjacent type tests on the same value are more compact + (arm64, x86-64). changes in sbcl-2.2.7 relative to sbcl-2.2.6: * minor incompatible change: the compiler emits full WARNINGs for undefined diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index f7fe02c866..7fe153d7e8 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -611,7 +611,7 @@ (get-dsd-index layout sb-kernel::flags)) word-shift)) instance-pointer-lowtag)))) - (inst cmp temp (add-sub-immediate depthoid)) + (inst cmp temp (add-sub-immediate (fixnumize depthoid))) (inst b :lt (if not-p target done))) (inst ldr (32-bit-reg this-id) (@ layout offset)) ;; 8-bit IDs are permanently assigned, so no fixup ever needed for those. diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index fb1a2bc6b5..ba70f95f28 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -1203,7 +1203,7 @@ (set-vop-optimizer (template-or-lose vop) #'vop-optimize-%other-pointer-subtype-p-optimizer))) -(when-vop-existsp (:translate structure-typep) +(when-vop-existsp (:named sb-vm::load-instance-layout) (defoptimizer (vop-optimize structure-typep) (vop) (when (boundp '*2block-info*) (let (vops diff --git a/src/compiler/x86-64/system.lisp b/src/compiler/x86-64/system.lisp index ce7499dcaa..a7e6047257 100644 --- a/src/compiler/x86-64/system.lisp +++ b/src/compiler/x86-64/system.lisp @@ -46,52 +46,6 @@ (inst movzx '(:byte :dword) result object) DONE)) -(macrolet ((read-depthoid () - `(ea (- (+ 4 (ash (+ instance-slots-offset - (get-dsd-index layout sb-kernel::flags)) - word-shift)) - instance-pointer-lowtag) - layout))) - (define-vop () - (:translate layout-depthoid) - (:policy :fast-safe) - (:args (layout :scs (descriptor-reg))) - (:results (res :scs (any-reg))) - (:result-types fixnum) - (:generator 1 (inst movsx '(:dword :qword) res (read-depthoid)))) - (define-vop () - (:translate sb-c::layout-depthoid-ge) - (:policy :fast-safe) - (:args (layout :scs (descriptor-reg))) - (:info k) - (:arg-types * (:constant (unsigned-byte 16))) - (:conditional :ge) - (:generator 1 (inst cmp :dword (read-depthoid) (fixnumize k))))) - -(define-vop () - (:translate sb-c::%structure-is-a) - (:args (x :scs (descriptor-reg))) - (:arg-types * (:constant t)) - (:info test) - (:policy :fast-safe) - (:conditional :e) - (:generator 1 - (inst cmp :dword - (ea (+ (id-bits-offset) - (ash (- (wrapper-depthoid test) 2) 2) - (- instance-pointer-lowtag)) - x) - ;; Small layout-ids can only occur for layouts made in genesis. - ;; Therefore if the compile-time value of the ID is small, - ;; it is permanently assigned to that type. - ;; Otherwise, we allow for the possibility that the compile-time ID - ;; is not the same as the load-time ID. - ;; I don't think layout-id 0 can get here, but be sure to exclude it. - (if (or (typep (layout-id test) '(and (signed-byte 8) (not (eql 0)))) - (not (sb-c::producing-fasl-file))) - (layout-id test) - (make-fixup test :layout-id))))) - #+compact-instance-header (progn ;; ~17 instructions vs. 35 diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 3d3b728219..2ab0464edb 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -916,3 +916,98 @@ (move temp value :dword) (%test-headers nil temp target not-p nil type-codes :load-widetag nil))) + +(macrolet ((read-depthoid () + `(ea (- (+ 4 (ash (+ instance-slots-offset + (get-dsd-index layout sb-kernel::flags)) + word-shift)) + instance-pointer-lowtag) + layout))) + (define-vop () + (:translate layout-depthoid) + (:policy :fast-safe) + (:args (layout :scs (descriptor-reg))) + (:results (res :scs (any-reg))) + (:result-types fixnum) + (:generator 1 + (inst movsx '(:dword :qword) res (read-depthoid)))) + (define-vop () + (:translate sb-c::layout-depthoid-ge) + (:policy :fast-safe) + (:args (layout :scs (descriptor-reg))) + (:info k) + (:arg-types * (:constant (unsigned-byte 16))) + (:conditional :ge) + (:generator 1 + (inst cmp :dword (read-depthoid) (fixnumize k)))) + + (defun structure-is-a (layout test-layout &optional target not-p done) + (let* ((depthoid (wrapper-depthoid test-layout)) + (offset (+ (id-bits-offset) + (ash (- depthoid 2) 2) + (- instance-pointer-lowtag)))) + (when (and target + (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) + (inst cmp :dword (read-depthoid) (fixnumize depthoid)) + (inst jmp :l (if not-p target done))) + (inst cmp :dword + (ea offset layout) + ;; Small layout-ids can only occur for layouts made in genesis. + ;; Therefore if the compile-time value of the ID is small, + ;; it is permanently assigned to that type. + ;; Otherwise, we allow for the possibility that the compile-time ID + ;; is not the same as the load-time ID. + ;; I don't think layout-id 0 can get here, but be sure to exclude it. + (if (or (typep (layout-id test-layout) '(and (signed-byte 8) (not (eql 0)))) + (not (sb-c::producing-fasl-file))) + (layout-id test-layout) + (make-fixup test-layout :layout-id)))))) + +(define-vop () + (:translate sb-c::%structure-is-a) + (:args (x :scs (descriptor-reg))) + (:arg-types * (:constant t)) + (:info test) + (:policy :fast-safe) + (:conditional :e) + (:generator 1 + (structure-is-a x test))) + +(define-vop () + (:translate sb-c::structure-typep) + (:args (object :scs (descriptor-reg))) + (:arg-types * (:constant t)) + (:args-var args) + (:policy :fast-safe) + (:conditional) + (:info target not-p test-layout) + (:temporary (:sc descriptor-reg) layout) + (:generator 4 + (unless (instance-tn-ref-p args) + (%test-lowtag object layout (if not-p target done) t instance-pointer-lowtag)) + (inst mov :dword layout (ea (- 4 instance-pointer-lowtag) object)) + (structure-is-a layout test-layout target not-p done) + (inst jmp (if not-p :ne :e) target) + done)) + +(define-vop (structure-typep*) + (:args (layout :scs (descriptor-reg))) + (:arg-types * (:constant t)) + (:policy :fast-safe) + (:conditional) + (:info target not-p test-layout) + (:generator 4 + (structure-is-a layout test-layout target not-p done) + (inst jmp (if not-p :ne :e) target) + done)) + +(define-vop (load-instance-layout) + (:args (object :scs (any-reg descriptor-reg))) + (:args-var args) + (:info not-instance) + (:temporary (:sc unsigned-reg) temp) + (:results (r :scs (descriptor-reg))) + (:generator 1 + (unless (instance-tn-ref-p args) + (%test-lowtag object temp not-instance t instance-pointer-lowtag)) + (inst mov :dword r (ea (- 4 instance-pointer-lowtag) object)))) From fe1010fb4d214742e08286406a1596691b5b1395 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 12 Aug 2022 21:00:47 +0300 Subject: [PATCH 3836/4023] Fix -compact-instance-header --- src/compiler/x86-64/type-vops.lisp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 2ab0464edb..600bf604db 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -985,7 +985,10 @@ (:generator 4 (unless (instance-tn-ref-p args) (%test-lowtag object layout (if not-p target done) t instance-pointer-lowtag)) + #+compact-instance-header (inst mov :dword layout (ea (- 4 instance-pointer-lowtag) object)) + #-compact-instance-header + (loadw layout object instance-slots-offset instance-pointer-lowtag) (structure-is-a layout test-layout target not-p done) (inst jmp (if not-p :ne :e) target) done)) @@ -1010,4 +1013,7 @@ (:generator 1 (unless (instance-tn-ref-p args) (%test-lowtag object temp not-instance t instance-pointer-lowtag)) - (inst mov :dword r (ea (- 4 instance-pointer-lowtag) object)))) + #+compact-instance-header + (inst mov :dword r (ea (- 4 instance-pointer-lowtag) object)) + #-compact-instance-header + (loadw r object instance-slots-offset instance-pointer-lowtag))) From 16c2c69e768814d4f88d68ea982a39e959419ea2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 12 Aug 2022 23:32:17 -0400 Subject: [PATCH 3837/4023] Change horrible logic to not-so-bad --- src/runtime/immobile-space.c | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 4e9a6c62b8..425ef9071e 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1503,27 +1503,6 @@ static lispobj adjust_fun_entrypoint(lispobj raw_addr) return fun_self_from_taggedptr(simple_fun); } -static void adjust_fdefn_raw_addr(struct fdefn* fdefn) -{ - if (!fdefn->raw_addr || points_to_asm_code_p((lispobj)fdefn->raw_addr)) - return; - lispobj* raw_addr = (lispobj*)fdefn->raw_addr; - lispobj* obj_base = 0; - lispobj header; - int i; - for (i=1; i<=4; ++i) - if ((header = raw_addr[-i]) == FORWARDING_HEADER || other_immediate_lowtag_p(header)) { - obj_base = raw_addr-i; - break; - } - gc_assert(obj_base); - int offset = (char*)raw_addr - (char*)obj_base; - if (header == FORWARDING_HEADER) { - char* new = (char*)native_pointer(forwarding_pointer_value(obj_base)); - fdefn->raw_addr = new + offset; - } -} - /* Fix the layout of OBJ, storing it back to the object, * and return the layout's address in tempspace. */ static struct layout* fix_object_layout(lispobj* obj) @@ -1602,7 +1581,14 @@ static void fixup_space(lispobj* where, size_t n_words) break; case FDEFN_WIDETAG: adjust_words(where+1, 2); - adjust_fdefn_raw_addr((struct fdefn*)where); + struct fdefn *fdefn = (void*)where; + lispobj entrypoint = (lispobj)fdefn->raw_addr; + lispobj taggedptr = decode_fdefn_rawfun(fdefn); + if (taggedptr) { + int disp = entrypoint - taggedptr; + adjust_words(&taggedptr, 1); + fdefn->raw_addr = (char*)taggedptr + disp; + } break; case SYMBOL_WIDETAG: // - info, name, package can not point to an immobile object From da2a46831852ba36084160230a56f37bbb0d2462 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 13 Aug 2022 13:33:12 -0400 Subject: [PATCH 3838/4023] Update ASSERT_REGIONS_CLOSED for more regions Also fix some problems under -DDEBUG --- src/runtime/forwarding-ptr.h | 2 +- src/runtime/gc-private.h | 2 +- src/runtime/gencgc-alloc-region.h | 7 +++++++ src/runtime/gencgc.c | 8 ++------ 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/runtime/forwarding-ptr.h b/src/runtime/forwarding-ptr.h index d6d75f12ef..47b90e52d1 100644 --- a/src/runtime/forwarding-ptr.h +++ b/src/runtime/forwarding-ptr.h @@ -51,7 +51,7 @@ static inline void set_forwarding_pointer(lispobj *addr, lispobj newspace_copy) // Unfortunately this also implies we can't assert // that we're operating on a not-yet-forwarded object here. #ifdef LISP_FEATURE_GENCGC - gc_dcheck(compacting_p()); + //gc_dcheck(from_space_p(addr)); // inclusion order problem, too bad addr[0] = FORWARDING_HEADER; addr[1] = newspace_copy; #else diff --git a/src/runtime/gc-private.h b/src/runtime/gc-private.h index f0a8d4b6f5..c8b589da09 100644 --- a/src/runtime/gc-private.h +++ b/src/runtime/gc-private.h @@ -246,7 +246,7 @@ static inline lispobj encode_weakptr_next(void* x) { static inline void add_to_weak_pointer_chain(struct weak_pointer *wp) { // Better already be fixed in position or we're in trouble - gc_assert(!from_space_p(make_lispobj(wp,OTHER_POINTER_LOWTAG))); + gc_dcheck(!compacting_p() || !from_space_p(make_lispobj(wp,OTHER_POINTER_LOWTAG))); /* Link 'wp' into weak_pointer_chain using its 'next' field. * We ensure that 'next' is always NULL when the weak pointer isn't * in the chain, and not NULL otherwise. The end of the chain diff --git a/src/runtime/gencgc-alloc-region.h b/src/runtime/gencgc-alloc-region.h index a181d77ffb..56f8dc41ed 100644 --- a/src/runtime/gencgc-alloc-region.h +++ b/src/runtime/gencgc-alloc-region.h @@ -32,6 +32,13 @@ extern struct alloc_region gc_alloc_region[6]; #define code_region (&gc_alloc_region[3]) #define boxed_region (&gc_alloc_region[4]) #define cons_region (&gc_alloc_region[5]) +#define ASSERT_REGIONS_CLOSED() \ + gc_assert(!((uintptr_t)gc_alloc_region[0].start_addr \ + |(uintptr_t)gc_alloc_region[1].start_addr \ + |(uintptr_t)gc_alloc_region[2].start_addr \ + |(uintptr_t)gc_alloc_region[3].start_addr \ + |(uintptr_t)gc_alloc_region[4].start_addr \ + |(uintptr_t)gc_alloc_region[5].start_addr)) extern generation_index_t from_space, new_space; extern int gencgc_alloc_profiler; diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index ac2a63cef6..931a9eb76d 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -903,11 +903,7 @@ set_alloc_start_page(unsigned int page_type, page_index_t page) static inline boolean __attribute__((unused)) region_closed_p(struct alloc_region* region) { return !region->start_addr; } -#define ASSERT_REGIONS_CLOSED() \ - gc_assert(!((uintptr_t)gc_alloc_region[0].start_addr \ - |(uintptr_t)gc_alloc_region[1].start_addr \ - |(uintptr_t)gc_alloc_region[2].start_addr \ - |(uintptr_t)gc_alloc_region[3].start_addr)) + /* Find a new region with room for at least the given number of bytes. * @@ -3455,7 +3451,7 @@ static void free_oldspace(void) for (page = 0; page < next_free_page; ++page) { if (page_table[page].gen == from_space) { /* Should already be unprotected by unprotect_oldspace(). */ - gc_dcheck(page_cards_all_marked_nonsticky(last_page)); + gc_dcheck(page_cards_all_marked_nonsticky(page)); /* Free the page. */ int used = page_words_used(page); if (used) set_page_need_to_zero(page, 1); From 88e67077dcf0ce0c78b5c8692c7f7b924ab7f905 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 14 Aug 2022 03:04:13 -0400 Subject: [PATCH 3839/4023] Generalize initializing and closing all TLABs for a thread Support independent TLABs for equal GC page types so that objects may be segregated by criteria other than page type. One case would be free_oldspace wanting to scan symbol pages to recycle TLS indices more efficiently than scanning everything. Another would be co-locating PCL metadata for locality, and/or discounting it in SB-APROF profiling. No harm if extra TLABs aren't used for anything. (They aren't yet) --- src/compiler/generic/genesis.lisp | 7 ++++ src/compiler/generic/objdef.lisp | 4 ++ src/runtime/gc-internal.h | 2 +- src/runtime/gencgc-internal.h | 3 ++ src/runtime/gencgc.c | 68 +++++++++++++++++++------------ src/runtime/monitor.c | 2 +- src/runtime/thread.c | 7 +--- 7 files changed, 59 insertions(+), 34 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a37b8c3587..6ca193dce5 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3355,6 +3355,13 @@ lispobj symbol_package(struct symbol*);~%" (genesis-header-prefix)) sb-vm:code-slots-per-simple-fun)) (when (and (eq name 'sb-vm::thread) (find 'sb-vm::pseudo-atomic-bits slots :key #'sb-vm:slot-name)) + (format t "#define INIT_THREAD_REGIONS(x) \\~%") + (let ((tlabs (map 'list + (lambda (x) (c-name (string-downcase (second x)))) + (remove-if-not (lambda (x) + (tailwise-equal (string (second x)) "-TLAB")) + slots)))) + (format t "~{ gc_init_region(&x->~A)~^,\\~%~}~2%" tlabs)) (format t "#define HAVE_THREAD_PSEUDO_ATOMIC_BITS_SLOT 1~2%") #+(or sparc ppc ppc64) (format t "typedef char pa_bits_t[~d];~2%" sb-vm:n-word-bytes) #-(or sparc ppc ppc64) (format t "typedef lispobj pa_bits_t;~2%")) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index e3ef346be6..b90f93400d 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -578,6 +578,10 @@ during backtrace. (mach-port-name :c-type "mach_port_name_t") #+ppc64 (card-table) + ;; A few extra thread-local allocation buffers for special purposes + (symbol-tlab :c-type "struct alloc_region" :length 3) + (sys-mixed-tlab :c-type "struct alloc_region" :length 3) + (sys-cons-tlab :c-type "struct alloc_region" :length 3) ;; allocation instrumenting (tot-bytes-alloc-boxed) (tot-bytes-alloc-unboxed) diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index 8e54b4db17..109b0a75c4 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -162,6 +162,6 @@ instance_scan(void (*proc)(lispobj*, sword_t, uword_t), extern int simple_fun_index(struct code*, struct simple_fun*); extern lispobj decode_fdefn_rawfun(struct fdefn *fdefn); -extern void gc_close_thread_regions(struct thread*); +extern void gc_close_thread_regions(struct thread*, int); extern void gc_close_collector_regions(int); #endif /* _GC_INTERNAL_H_ */ diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 07c520d3db..2a5627d443 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -59,6 +59,9 @@ int gencgc_handle_wp_violation(void*, void*); #endif typedef unsigned short page_words_t; +#define LOCK_PAGE_TABLE 1 +#define LOCK_CODE_ALLOCATOR 2 + /* New objects are allocated to PAGE_TYPE_MIXED or PAGE_TYPE_CONS */ /* If you change these constants, then possibly also change the following * functions in 'room.lisp': diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 931a9eb76d..cd3efc42fd 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -4542,10 +4542,7 @@ collect_garbage(generation_index_t last_gen) * So we need to close them for those two cases. */ struct thread *th; - for_each_thread(th) { - ensure_region_closed(THREAD_ALLOC_REGION(th,mixed), PAGE_TYPE_MIXED); - ensure_region_closed(THREAD_ALLOC_REGION(th,cons), PAGE_TYPE_CONS); - } + for_each_thread(th) gc_close_thread_regions(th, 0); ensure_region_closed(code_region, PAGE_TYPE_CODE); if (gencgc_verbose > 2) fprintf(stderr, "[%d] BEGIN gc(%d)\n", n_gcs, last_gen); @@ -5263,27 +5260,31 @@ NO_SANITIZE_MEMORY lispobj listify_rest_arg(lispobj* context, sword_t context_by } #endif -void sync_close_regions(int block_signals, - struct alloc_region *region_1, int page_type_1, - struct alloc_region *region_2, int page_type_2) +typedef struct { struct alloc_region* r; int type; } close_region_arg; + +static void sync_close_regions(int block_signals, int locking, + close_region_arg* a, int count) { sigset_t savedmask; - int result; - int need_code_lock = (page_type_1 == PAGE_TYPE_CODE || page_type_2 == PAGE_TYPE_CODE); + __attribute__((unused)) int result; if (block_signals) block_blockable_signals(&savedmask); - if (need_code_lock) { + if (locking & LOCK_CODE_ALLOCATOR) { result = mutex_acquire(&code_allocator_lock); - gc_assert(result); + gc_dcheck(result); } - result = mutex_acquire(&free_pages_lock); - gc_assert(result); - if (region_1) ensure_region_closed(region_1, page_type_1); - if (region_2) ensure_region_closed(region_2, page_type_2); - result = mutex_release(&free_pages_lock); - gc_assert(result); - if (need_code_lock) { + if (locking & LOCK_PAGE_TABLE) { + result = mutex_acquire(&free_pages_lock); + gc_dcheck(result); + } + int i; + for(i=0; i<count; ++i) ensure_region_closed(a[i].r, a[i].type); + if (locking & LOCK_PAGE_TABLE) { + result = mutex_release(&free_pages_lock); + gc_dcheck(result); + } + if (locking & LOCK_CODE_ALLOCATOR) { result = mutex_release(&code_allocator_lock); - gc_assert(result); + gc_dcheck(result); } if (block_signals) thread_sigmask(SIG_SETMASK, &savedmask, 0); } @@ -5294,16 +5295,29 @@ void sync_close_regions(int block_signals, * these are plain foreign calls without aid of a vop. */ void close_current_thread_tlab() { __attribute__((unused)) struct thread *self = get_sb_vm_thread(); - sync_close_regions(1, THREAD_ALLOC_REGION(self,mixed), PAGE_TYPE_MIXED, - THREAD_ALLOC_REGION(self,cons), PAGE_TYPE_CONS); + close_region_arg a[4] = { + { THREAD_ALLOC_REGION(self,mixed), PAGE_TYPE_MIXED }, + { THREAD_ALLOC_REGION(self,cons), PAGE_TYPE_CONS }, + { THREAD_ALLOC_REGION(self,sys_mixed), PAGE_TYPE_MIXED }, + { THREAD_ALLOC_REGION(self,sys_cons), PAGE_TYPE_CONS } + }; + sync_close_regions(1, LOCK_PAGE_TABLE, a, 4); } void close_code_region() { - sync_close_regions(1, code_region, PAGE_TYPE_CODE, 0, 0); + close_region_arg a = { code_region, PAGE_TYPE_CODE }; + sync_close_regions(1, LOCK_PAGE_TABLE|LOCK_CODE_ALLOCATOR, &a, 1); } -/* This is called by unregister_thread() with STOP_FOR_GC blocked */ -void gc_close_thread_regions(struct thread* th) { - sync_close_regions(0, &th->mixed_tlab, PAGE_TYPE_MIXED, - &th->cons_tlab, PAGE_TYPE_CONS); +/* This is called by unregister_thread() with STOP_FOR_GC blocked, + which needs to lock the page table. It is also called at the start of GC + to close all thread regions; no locks are needed in that case */ +void gc_close_thread_regions(struct thread* th, int locking) { + close_region_arg a[4] = { + { &th->mixed_tlab, PAGE_TYPE_MIXED }, + { &th->cons_tlab, PAGE_TYPE_CONS }, + { &th->sys_mixed_tlab, PAGE_TYPE_MIXED }, + { &th->sys_cons_tlab, PAGE_TYPE_CONS } + }; + sync_close_regions(0, locking, a, 4); } #ifdef LISP_FEATURE_SPARC @@ -5567,7 +5581,7 @@ gc_and_save(char *filename, boolean prepend_runtime, boolean purify, // From here on until exit, there is no chance of continuing // in Lisp if something goes wrong during GC. // Flush regions to ensure heap scan in copy_rospace doesn't miss anything - gc_close_thread_regions(thread); + gc_close_thread_regions(thread, 0); gc_close_collector_regions(0); move_rospace_to_dynamic(0); pre_verify_gen_0 = 1; diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 3b38565485..256f3d8639 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -247,7 +247,7 @@ static void suspend_other_threads() { // It might make sense for each thread's stop-for-gc handler to close its region // versus doing this loop struct thread *th; - for_each_thread(th) { gc_close_thread_regions(th); } + for_each_thread(th) { gc_close_thread_regions(th, 0); } gc_close_collector_regions(0); } static void unsuspend_other_threads() { diff --git a/src/runtime/thread.c b/src/runtime/thread.c index fa0ac69cd1..42c0a6a6f1 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -452,7 +452,7 @@ unregister_thread(struct thread *th, int lock_ret; block_blockable_signals(0); - gc_close_thread_regions(th); + gc_close_thread_regions(th, LOCK_PAGE_TABLE); #ifdef LISP_FEATURE_SB_SAFEPOINT pop_gcing_safety(&scribble->safety); #else @@ -1015,10 +1015,7 @@ alloc_thread_struct(void* spaces) { clear_pseudo_atomic_interrupted(th); #endif -#ifdef LISP_FEATURE_GENCGC - gc_init_region(&th->mixed_tlab); - gc_init_region(&th->cons_tlab); -#endif + INIT_THREAD_REGIONS(th); #ifdef LISP_FEATURE_SB_THREAD /* This parallels the same logic in globals.c for the * single-threaded foreign_function_call_active, KLUDGE and From 58d2278f805e73c09f501e942cf4f1a1f4b85184 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 14 Aug 2022 05:53:18 -0400 Subject: [PATCH 3840/4023] Revert "Generalize initializing and closing all TLABs for a thread" This reverts commit 88e67077dcf0ce0c78b5c8692c7f7b924ab7f905. Breaks #-sb-thread and I'm too bleary-eyed to fix it now. --- src/compiler/generic/genesis.lisp | 7 ---- src/compiler/generic/objdef.lisp | 4 -- src/runtime/gc-internal.h | 2 +- src/runtime/gencgc-internal.h | 3 -- src/runtime/gencgc.c | 68 ++++++++++++------------------- src/runtime/monitor.c | 2 +- src/runtime/thread.c | 7 +++- 7 files changed, 34 insertions(+), 59 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 6ca193dce5..a37b8c3587 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3355,13 +3355,6 @@ lispobj symbol_package(struct symbol*);~%" (genesis-header-prefix)) sb-vm:code-slots-per-simple-fun)) (when (and (eq name 'sb-vm::thread) (find 'sb-vm::pseudo-atomic-bits slots :key #'sb-vm:slot-name)) - (format t "#define INIT_THREAD_REGIONS(x) \\~%") - (let ((tlabs (map 'list - (lambda (x) (c-name (string-downcase (second x)))) - (remove-if-not (lambda (x) - (tailwise-equal (string (second x)) "-TLAB")) - slots)))) - (format t "~{ gc_init_region(&x->~A)~^,\\~%~}~2%" tlabs)) (format t "#define HAVE_THREAD_PSEUDO_ATOMIC_BITS_SLOT 1~2%") #+(or sparc ppc ppc64) (format t "typedef char pa_bits_t[~d];~2%" sb-vm:n-word-bytes) #-(or sparc ppc ppc64) (format t "typedef lispobj pa_bits_t;~2%")) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index b90f93400d..e3ef346be6 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -578,10 +578,6 @@ during backtrace. (mach-port-name :c-type "mach_port_name_t") #+ppc64 (card-table) - ;; A few extra thread-local allocation buffers for special purposes - (symbol-tlab :c-type "struct alloc_region" :length 3) - (sys-mixed-tlab :c-type "struct alloc_region" :length 3) - (sys-cons-tlab :c-type "struct alloc_region" :length 3) ;; allocation instrumenting (tot-bytes-alloc-boxed) (tot-bytes-alloc-unboxed) diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index 109b0a75c4..8e54b4db17 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -162,6 +162,6 @@ instance_scan(void (*proc)(lispobj*, sword_t, uword_t), extern int simple_fun_index(struct code*, struct simple_fun*); extern lispobj decode_fdefn_rawfun(struct fdefn *fdefn); -extern void gc_close_thread_regions(struct thread*, int); +extern void gc_close_thread_regions(struct thread*); extern void gc_close_collector_regions(int); #endif /* _GC_INTERNAL_H_ */ diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 2a5627d443..07c520d3db 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -59,9 +59,6 @@ int gencgc_handle_wp_violation(void*, void*); #endif typedef unsigned short page_words_t; -#define LOCK_PAGE_TABLE 1 -#define LOCK_CODE_ALLOCATOR 2 - /* New objects are allocated to PAGE_TYPE_MIXED or PAGE_TYPE_CONS */ /* If you change these constants, then possibly also change the following * functions in 'room.lisp': diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index cd3efc42fd..931a9eb76d 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -4542,7 +4542,10 @@ collect_garbage(generation_index_t last_gen) * So we need to close them for those two cases. */ struct thread *th; - for_each_thread(th) gc_close_thread_regions(th, 0); + for_each_thread(th) { + ensure_region_closed(THREAD_ALLOC_REGION(th,mixed), PAGE_TYPE_MIXED); + ensure_region_closed(THREAD_ALLOC_REGION(th,cons), PAGE_TYPE_CONS); + } ensure_region_closed(code_region, PAGE_TYPE_CODE); if (gencgc_verbose > 2) fprintf(stderr, "[%d] BEGIN gc(%d)\n", n_gcs, last_gen); @@ -5260,31 +5263,27 @@ NO_SANITIZE_MEMORY lispobj listify_rest_arg(lispobj* context, sword_t context_by } #endif -typedef struct { struct alloc_region* r; int type; } close_region_arg; - -static void sync_close_regions(int block_signals, int locking, - close_region_arg* a, int count) +void sync_close_regions(int block_signals, + struct alloc_region *region_1, int page_type_1, + struct alloc_region *region_2, int page_type_2) { sigset_t savedmask; - __attribute__((unused)) int result; + int result; + int need_code_lock = (page_type_1 == PAGE_TYPE_CODE || page_type_2 == PAGE_TYPE_CODE); if (block_signals) block_blockable_signals(&savedmask); - if (locking & LOCK_CODE_ALLOCATOR) { + if (need_code_lock) { result = mutex_acquire(&code_allocator_lock); - gc_dcheck(result); - } - if (locking & LOCK_PAGE_TABLE) { - result = mutex_acquire(&free_pages_lock); - gc_dcheck(result); + gc_assert(result); } - int i; - for(i=0; i<count; ++i) ensure_region_closed(a[i].r, a[i].type); - if (locking & LOCK_PAGE_TABLE) { - result = mutex_release(&free_pages_lock); - gc_dcheck(result); - } - if (locking & LOCK_CODE_ALLOCATOR) { + result = mutex_acquire(&free_pages_lock); + gc_assert(result); + if (region_1) ensure_region_closed(region_1, page_type_1); + if (region_2) ensure_region_closed(region_2, page_type_2); + result = mutex_release(&free_pages_lock); + gc_assert(result); + if (need_code_lock) { result = mutex_release(&code_allocator_lock); - gc_dcheck(result); + gc_assert(result); } if (block_signals) thread_sigmask(SIG_SETMASK, &savedmask, 0); } @@ -5295,29 +5294,16 @@ static void sync_close_regions(int block_signals, int locking, * these are plain foreign calls without aid of a vop. */ void close_current_thread_tlab() { __attribute__((unused)) struct thread *self = get_sb_vm_thread(); - close_region_arg a[4] = { - { THREAD_ALLOC_REGION(self,mixed), PAGE_TYPE_MIXED }, - { THREAD_ALLOC_REGION(self,cons), PAGE_TYPE_CONS }, - { THREAD_ALLOC_REGION(self,sys_mixed), PAGE_TYPE_MIXED }, - { THREAD_ALLOC_REGION(self,sys_cons), PAGE_TYPE_CONS } - }; - sync_close_regions(1, LOCK_PAGE_TABLE, a, 4); + sync_close_regions(1, THREAD_ALLOC_REGION(self,mixed), PAGE_TYPE_MIXED, + THREAD_ALLOC_REGION(self,cons), PAGE_TYPE_CONS); } void close_code_region() { - close_region_arg a = { code_region, PAGE_TYPE_CODE }; - sync_close_regions(1, LOCK_PAGE_TABLE|LOCK_CODE_ALLOCATOR, &a, 1); + sync_close_regions(1, code_region, PAGE_TYPE_CODE, 0, 0); } -/* This is called by unregister_thread() with STOP_FOR_GC blocked, - which needs to lock the page table. It is also called at the start of GC - to close all thread regions; no locks are needed in that case */ -void gc_close_thread_regions(struct thread* th, int locking) { - close_region_arg a[4] = { - { &th->mixed_tlab, PAGE_TYPE_MIXED }, - { &th->cons_tlab, PAGE_TYPE_CONS }, - { &th->sys_mixed_tlab, PAGE_TYPE_MIXED }, - { &th->sys_cons_tlab, PAGE_TYPE_CONS } - }; - sync_close_regions(0, locking, a, 4); +/* This is called by unregister_thread() with STOP_FOR_GC blocked */ +void gc_close_thread_regions(struct thread* th) { + sync_close_regions(0, &th->mixed_tlab, PAGE_TYPE_MIXED, + &th->cons_tlab, PAGE_TYPE_CONS); } #ifdef LISP_FEATURE_SPARC @@ -5581,7 +5567,7 @@ gc_and_save(char *filename, boolean prepend_runtime, boolean purify, // From here on until exit, there is no chance of continuing // in Lisp if something goes wrong during GC. // Flush regions to ensure heap scan in copy_rospace doesn't miss anything - gc_close_thread_regions(thread, 0); + gc_close_thread_regions(thread); gc_close_collector_regions(0); move_rospace_to_dynamic(0); pre_verify_gen_0 = 1; diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 256f3d8639..3b38565485 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -247,7 +247,7 @@ static void suspend_other_threads() { // It might make sense for each thread's stop-for-gc handler to close its region // versus doing this loop struct thread *th; - for_each_thread(th) { gc_close_thread_regions(th, 0); } + for_each_thread(th) { gc_close_thread_regions(th); } gc_close_collector_regions(0); } static void unsuspend_other_threads() { diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 42c0a6a6f1..fa0ac69cd1 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -452,7 +452,7 @@ unregister_thread(struct thread *th, int lock_ret; block_blockable_signals(0); - gc_close_thread_regions(th, LOCK_PAGE_TABLE); + gc_close_thread_regions(th); #ifdef LISP_FEATURE_SB_SAFEPOINT pop_gcing_safety(&scribble->safety); #else @@ -1015,7 +1015,10 @@ alloc_thread_struct(void* spaces) { clear_pseudo_atomic_interrupted(th); #endif - INIT_THREAD_REGIONS(th); +#ifdef LISP_FEATURE_GENCGC + gc_init_region(&th->mixed_tlab); + gc_init_region(&th->cons_tlab); +#endif #ifdef LISP_FEATURE_SB_THREAD /* This parallels the same logic in globals.c for the * single-threaded foreign_function_call_active, KLUDGE and From f2880b4b084cffaa09aa0fee1c91b599cacf80e5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 14 Aug 2022 10:58:49 -0400 Subject: [PATCH 3841/4023] Avoid full call to PATHNAMEP --- src/code/target-pathname.lisp | 18 +++++++++--------- src/code/target-sxhash.lisp | 3 +++ src/cold/build-order.lisp-expr | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/code/target-pathname.lisp b/src/code/target-pathname.lisp index 1d60823c77..5045fe09ee 100644 --- a/src/code/target-pathname.lisp +++ b/src/code/target-pathname.lisp @@ -236,10 +236,6 @@ ;;; pathname methods -(defun pathname-sxhash (x) - (declare (pathname x)) - (pathname-key-hash x)) - (defmethod print-object ((pathname pathname) stream) (let ((namestring (handler-case (namestring pathname) (error nil)))) @@ -304,7 +300,7 @@ hash-table-userfun-flag) 'pathname-key= #'pathname-key= - #'pathname-key-hash + #'pathname-sxhash 10 default-rehash-size $1.0))) @@ -333,7 +329,7 @@ (let* ((dir+hash (when directory (ensure-gethash directory table - (cons directory (pathname-key-hash directory))))) + (cons directory (pathname-sxhash directory))))) (key (!allocate-pathname host device dir+hash name type version))) (declare (truly-dynamic-extent key)) (or (gethash key table) @@ -537,9 +533,13 @@ (sb-kernel::assign-equalp-impl 'pathname #'pathname=) (sb-kernel::assign-equalp-impl 'logical-pathname #'pathname=) -;;; A pathname key is a key to an entry in *PATHNAMES*, either a pathname -;;; or a pathname-directory. -(defun pathname-key-hash (x) +;;; Hash either a PATHNAME or a PATHNAME-DIRECTORY. This is called byt both SXHASH +;;; and by the interning of pathnames, which uses a multi-step approaching to +;;; coalescing shared subparts. If an EQUAL directory was used before, we share that. +;;; Since a directory is stored with its hash precomputed, hashing a PATHNAME as a +;;; whole entails at most 4 more MIX operations. So using pathnames as keys in +;;; a hash-table pays a small up-front price for later speed improvement. +(defun pathname-sxhash (x) (flet ((hash-piece (piece) (etypecase piece (string (sxhash piece)) ; transformed diff --git a/src/code/target-sxhash.lisp b/src/code/target-sxhash.lisp index 9bf51fff1c..e26a3072e1 100644 --- a/src/code/target-sxhash.lisp +++ b/src/code/target-sxhash.lisp @@ -273,6 +273,9 @@ (%sxhash-simple-bit-vector (copy-seq bit-vector)))))))) ;;; To avoid "note: Return type not fixed values ..." +;;; PATHNAME-SXHASH can't easily be placed in pathname.lisp because that file +;;; depends on LOGICAL-HOST but the definition of LOGICAL-HOST is complicated +;;; and seems to belong where it is, in target-pathname.lisp, though maybe not. (declaim (ftype (sfunction (t) hash-code) pathname-sxhash)) (defun sap-hash (x) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 35d7327c3c..350ca3301f 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -254,6 +254,7 @@ ("src/pcl/pre-warm") ("src/code/number-dispatch" :not-host) ("src/code/float-inf-nan" :not-host) + ("src/code/pathname" :not-host) ("src/code/target-sxhash" :not-host) ; needs most-fooative-foo-float constants ("src/code/debug-info" :c-headers) @@ -306,7 +307,6 @@ ("src/code/random") ("src/code/hash-table" :c-headers) ("src/code/readtable") - ("src/code/pathname" :not-host) ("src/code/host-pprint") ("src/compiler/knownfun") From 95485d002a8ec7fe05f2c920760a1ab72dcacb53 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 14 Aug 2022 11:47:06 -0400 Subject: [PATCH 3842/4023] 32-bit: Fix some C warnings --- src/runtime/gencgc.c | 1 + src/runtime/linux-mman.c | 2 +- src/runtime/os-common.c | 2 +- tlsf-bsd/tlsf/tlsf.c | 2 ++ 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 931a9eb76d..8cf2012727 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -950,6 +950,7 @@ page_extensible_p(page_index_t index, generation_index_t gen, int type) { && page_table[index].gen == gen && !gc_page_pins[index]; #else + // FIXME: "warning: dereferencing type-punned pointer will break strict-aliasing rules" int attributes_match = *(int16_t*)&page_table[index].type == ((gen<<8)|type); #endif diff --git a/src/runtime/linux-mman.c b/src/runtime/linux-mman.c index 4a2f6c168a..3e15f2da6b 100644 --- a/src/runtime/linux-mman.c +++ b/src/runtime/linux-mman.c @@ -25,7 +25,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, actual = sbcl_mmap(addr, len, protection, flags, -1, 0); if (actual == MAP_FAILED) { if (errno == ENOMEM) - fprintf(stderr, "os_validate(%d,%p,%lx) failed with ENOMEM\n", + fprintf(stderr, "os_validate(%d,%p,%zu) failed with ENOMEM\n", attributes, addr, len); else perror("mmap"); diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 0a36b96c12..538549fc8b 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -297,7 +297,7 @@ void* load_core_bytes(int fd, os_vm_offset_t offset, os_vm_address_t addr, os_vm fd, (off_t) offset); if (actual == MAP_FAILED) { if (errno == ENOMEM) - fprintf(stderr, "load_core_bytes: mmap(%p,%lx,...) failed with ENOMEM\n", addr, len); + fprintf(stderr, "load_core_bytes: mmap(%p,%zu,...) failed with ENOMEM\n", addr, len); else perror("mmap"); fail = 1; diff --git a/tlsf-bsd/tlsf/tlsf.c b/tlsf-bsd/tlsf/tlsf.c index 83634b2fb8..6ea8309912 100644 --- a/tlsf-bsd/tlsf/tlsf.c +++ b/tlsf-bsd/tlsf/tlsf.c @@ -1083,6 +1083,7 @@ void tlsf_dump_freelists(tlsf_t tlsf, FILE *f) } } +#ifdef LISP_FEATURE_64_BIT void tlsf_dump_pool(tlsf_t tlsf, pool_t pool, char *pathname) { FILE* f = fopen(pathname, "w"); @@ -1107,3 +1108,4 @@ void tlsf_dump_pool(tlsf_t tlsf, pool_t pool, char *pathname) fprintf(f, "-- end --\n"); fclose(f); } +#endif From 8f9216e6b0d83d7e94e29d56c5aa337ca453fd22 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 14 Aug 2022 12:00:06 -0400 Subject: [PATCH 3843/4023] Reapply 88e67077dcf0 with corrections --- src/compiler/generic/genesis.lisp | 17 +++++-- src/compiler/generic/objdef.lisp | 5 ++ src/runtime/gc-internal.h | 2 +- src/runtime/gencgc-alloc-region.h | 3 ++ src/runtime/gencgc-internal.h | 3 ++ src/runtime/gencgc.c | 83 +++++++++++++++++++++---------- src/runtime/monitor.c | 2 +- src/runtime/thread.c | 7 +-- 8 files changed, 83 insertions(+), 39 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index a37b8c3587..dac43a88ec 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3353,11 +3353,18 @@ lispobj symbol_package(struct symbol*);~%" (genesis-header-prefix)) (when (eq name 'sb-vm::code) (format t "#define CODE_SLOTS_PER_SIMPLE_FUN ~d~2%" sb-vm:code-slots-per-simple-fun)) - (when (and (eq name 'sb-vm::thread) - (find 'sb-vm::pseudo-atomic-bits slots :key #'sb-vm:slot-name)) - (format t "#define HAVE_THREAD_PSEUDO_ATOMIC_BITS_SLOT 1~2%") - #+(or sparc ppc ppc64) (format t "typedef char pa_bits_t[~d];~2%" sb-vm:n-word-bytes) - #-(or sparc ppc ppc64) (format t "typedef lispobj pa_bits_t;~2%")) + (when (eq name 'sb-vm::thread) + (format t "#define INIT_THREAD_REGIONS(x) \\~%") + (let ((tlabs (map 'list + (lambda (x) (c-name (string-downcase (second x)))) + (remove-if-not (lambda (x) + (tailwise-equal (string (second x)) "-TLAB")) + slots)))) + (format t "~{ gc_init_region(&x->~A)~^,\\~%~}~2%" tlabs)) + (when (find 'sb-vm::pseudo-atomic-bits slots :key #'sb-vm:slot-name) + (format t "#define HAVE_THREAD_PSEUDO_ATOMIC_BITS_SLOT 1~2%") + #+(or sparc ppc ppc64) (format t "typedef char pa_bits_t[~d];~2%" sb-vm:n-word-bytes) + #-(or sparc ppc ppc64) (format t "typedef lispobj pa_bits_t;~2%"))) (format t "struct ~A {~%" c-name) (when (sb-vm:primitive-object-widetag obj) (format t " lispobj header;~%")) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index e3ef346be6..c27c5190b3 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -578,6 +578,11 @@ during backtrace. (mach-port-name :c-type "mach_port_name_t") #+ppc64 (card-table) + ;; A few extra thread-local allocation buffers for special purposes + ;; #-sb-thread probably won't use these, to be determined... + (symbol-tlab :c-type "struct alloc_region" :length 3) + (sys-mixed-tlab :c-type "struct alloc_region" :length 3) + (sys-cons-tlab :c-type "struct alloc_region" :length 3) ;; allocation instrumenting (tot-bytes-alloc-boxed) (tot-bytes-alloc-unboxed) diff --git a/src/runtime/gc-internal.h b/src/runtime/gc-internal.h index 8e54b4db17..109b0a75c4 100644 --- a/src/runtime/gc-internal.h +++ b/src/runtime/gc-internal.h @@ -162,6 +162,6 @@ instance_scan(void (*proc)(lispobj*, sword_t, uword_t), extern int simple_fun_index(struct code*, struct simple_fun*); extern lispobj decode_fdefn_rawfun(struct fdefn *fdefn); -extern void gc_close_thread_regions(struct thread*); +extern void gc_close_thread_regions(struct thread*, int); extern void gc_close_collector_regions(int); #endif /* _GC_INTERNAL_H_ */ diff --git a/src/runtime/gencgc-alloc-region.h b/src/runtime/gencgc-alloc-region.h index 56f8dc41ed..96bfed604c 100644 --- a/src/runtime/gencgc-alloc-region.h +++ b/src/runtime/gencgc-alloc-region.h @@ -21,6 +21,9 @@ struct alloc_region { void *start_addr; }; +// Macro to statically initialize instead of using set_region_empty() +#define ALLOC_REGION_INITIALIZER {(void*)0x1000, (void*)1000, 0} + // One region for each of page type. // These indices have no correlation to PAGE_TYPE constants. // MIXED has to always be at array index 0 because lisp accesses diff --git a/src/runtime/gencgc-internal.h b/src/runtime/gencgc-internal.h index 07c520d3db..2a5627d443 100644 --- a/src/runtime/gencgc-internal.h +++ b/src/runtime/gencgc-internal.h @@ -59,6 +59,9 @@ int gencgc_handle_wp_violation(void*, void*); #endif typedef unsigned short page_words_t; +#define LOCK_PAGE_TABLE 1 +#define LOCK_CODE_ALLOCATOR 2 + /* New objects are allocated to PAGE_TYPE_MIXED or PAGE_TYPE_CONS */ /* If you change these constants, then possibly also change the following * functions in 'room.lisp': diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 8cf2012727..30ab854a5c 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -4543,10 +4543,7 @@ collect_garbage(generation_index_t last_gen) * So we need to close them for those two cases. */ struct thread *th; - for_each_thread(th) { - ensure_region_closed(THREAD_ALLOC_REGION(th,mixed), PAGE_TYPE_MIXED); - ensure_region_closed(THREAD_ALLOC_REGION(th,cons), PAGE_TYPE_CONS); - } + for_each_thread(th) gc_close_thread_regions(th, 0); ensure_region_closed(code_region, PAGE_TYPE_CODE); if (gencgc_verbose > 2) fprintf(stderr, "[%d] BEGIN gc(%d)\n", n_gcs, last_gen); @@ -5264,30 +5261,37 @@ NO_SANITIZE_MEMORY lispobj listify_rest_arg(lispobj* context, sword_t context_by } #endif -void sync_close_regions(int block_signals, - struct alloc_region *region_1, int page_type_1, - struct alloc_region *region_2, int page_type_2) +typedef struct { struct alloc_region* r; int type; } close_region_arg; + +static void sync_close_regions(int block_signals, int locking, + close_region_arg* a, int count) { sigset_t savedmask; - int result; - int need_code_lock = (page_type_1 == PAGE_TYPE_CODE || page_type_2 == PAGE_TYPE_CODE); + __attribute__((unused)) int result; if (block_signals) block_blockable_signals(&savedmask); - if (need_code_lock) { + if (locking & LOCK_CODE_ALLOCATOR) { result = mutex_acquire(&code_allocator_lock); - gc_assert(result); + gc_dcheck(result); } - result = mutex_acquire(&free_pages_lock); - gc_assert(result); - if (region_1) ensure_region_closed(region_1, page_type_1); - if (region_2) ensure_region_closed(region_2, page_type_2); - result = mutex_release(&free_pages_lock); - gc_assert(result); - if (need_code_lock) { + if (locking & LOCK_PAGE_TABLE) { + result = mutex_acquire(&free_pages_lock); + gc_dcheck(result); + } + int i; + for(i=0; i<count; ++i) ensure_region_closed(a[i].r, a[i].type); + if (locking & LOCK_PAGE_TABLE) { + result = mutex_release(&free_pages_lock); + gc_dcheck(result); + } + if (locking & LOCK_CODE_ALLOCATOR) { result = mutex_release(&code_allocator_lock); - gc_assert(result); + gc_dcheck(result); } if (block_signals) thread_sigmask(SIG_SETMASK, &savedmask, 0); } + +#define N_THREAD_TLABS(array) sizeof array / sizeof (close_region_arg) + /* These two exported "close_x" functions are called from Lisp prior to * heap-walking. They must never get interrupted by STOP_FOR_GC while holding * either the free page lock or code allocation lock. @@ -5295,16 +5299,41 @@ void sync_close_regions(int block_signals, * these are plain foreign calls without aid of a vop. */ void close_current_thread_tlab() { __attribute__((unused)) struct thread *self = get_sb_vm_thread(); - sync_close_regions(1, THREAD_ALLOC_REGION(self,mixed), PAGE_TYPE_MIXED, - THREAD_ALLOC_REGION(self,cons), PAGE_TYPE_CONS); + /* If the compiler doesn't use the cons region, neither will alloc_list(). + * i.e. we'll never see the cons region used with PAGE_TYPE_MIXED. + * Thus the invariants about page type correctness hold when closing */ + close_region_arg argv[] = { + { THREAD_ALLOC_REGION(self,mixed), PAGE_TYPE_MIXED }, + { THREAD_ALLOC_REGION(self,cons), PAGE_TYPE_CONS }, +#ifdef LISP_FEATURE_SB_THREAD_ + { THREAD_ALLOC_REGION(self,sys_mixed), PAGE_TYPE_MIXED }, + { THREAD_ALLOC_REGION(self,sys_cons), PAGE_TYPE_CONS } +#endif + }; + sync_close_regions(1, LOCK_PAGE_TABLE, argv, N_THREAD_TLABS(argv)); } void close_code_region() { - sync_close_regions(1, code_region, PAGE_TYPE_CODE, 0, 0); + close_region_arg argv = { code_region, PAGE_TYPE_CODE }; + sync_close_regions(1, LOCK_PAGE_TABLE|LOCK_CODE_ALLOCATOR, &argv, 1); } -/* This is called by unregister_thread() with STOP_FOR_GC blocked */ -void gc_close_thread_regions(struct thread* th) { - sync_close_regions(0, &th->mixed_tlab, PAGE_TYPE_MIXED, - &th->cons_tlab, PAGE_TYPE_CONS); +/* When this is called by unregister_thread() with STOP_FOR_GC blocked, + * it needs to aquire the page table lock but not the code allocator lock. + * It is also called at the start of GC to close each non-dead thread's regions, + * in which case no locks are needed since all other lisp threads are stopped. */ +void gc_close_thread_regions(__attribute__((unused)) struct thread* th, + int locking) { + close_region_arg argv[] = { +#ifdef LISP_FEATURE_SB_THREAD + { &th->mixed_tlab, PAGE_TYPE_MIXED }, + { &th->cons_tlab, PAGE_TYPE_CONS }, + { &th->sys_mixed_tlab, PAGE_TYPE_MIXED }, + { &th->sys_cons_tlab, PAGE_TYPE_CONS } +#else + { main_thread_mixed_region, PAGE_TYPE_MIXED }, + { main_thread_cons_region, PAGE_TYPE_CONS }, +#endif + }; + sync_close_regions(0, locking, argv, N_THREAD_TLABS(argv)); } #ifdef LISP_FEATURE_SPARC @@ -5568,7 +5597,7 @@ gc_and_save(char *filename, boolean prepend_runtime, boolean purify, // From here on until exit, there is no chance of continuing // in Lisp if something goes wrong during GC. // Flush regions to ensure heap scan in copy_rospace doesn't miss anything - gc_close_thread_regions(thread); + gc_close_thread_regions(thread, 0); gc_close_collector_regions(0); move_rospace_to_dynamic(0); pre_verify_gen_0 = 1; diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 3b38565485..256f3d8639 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -247,7 +247,7 @@ static void suspend_other_threads() { // It might make sense for each thread's stop-for-gc handler to close its region // versus doing this loop struct thread *th; - for_each_thread(th) { gc_close_thread_regions(th); } + for_each_thread(th) { gc_close_thread_regions(th, 0); } gc_close_collector_regions(0); } static void unsuspend_other_threads() { diff --git a/src/runtime/thread.c b/src/runtime/thread.c index fa0ac69cd1..42c0a6a6f1 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -452,7 +452,7 @@ unregister_thread(struct thread *th, int lock_ret; block_blockable_signals(0); - gc_close_thread_regions(th); + gc_close_thread_regions(th, LOCK_PAGE_TABLE); #ifdef LISP_FEATURE_SB_SAFEPOINT pop_gcing_safety(&scribble->safety); #else @@ -1015,10 +1015,7 @@ alloc_thread_struct(void* spaces) { clear_pseudo_atomic_interrupted(th); #endif -#ifdef LISP_FEATURE_GENCGC - gc_init_region(&th->mixed_tlab); - gc_init_region(&th->cons_tlab); -#endif + INIT_THREAD_REGIONS(th); #ifdef LISP_FEATURE_SB_THREAD /* This parallels the same logic in globals.c for the * single-threaded foreign_function_call_active, KLUDGE and From 1523452ec3425f65339ec612c7e13bc01ec02c35 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 14 Aug 2022 15:13:13 -0400 Subject: [PATCH 3844/4023] Use the other TLABs for something (trivial for now) Refer to the design document for motivation. Not enabled if not selected via feature, so no impact. --- doc/internals-notes/memory-arenas.txt | 70 +++++++++++++++++++++++++++ src/assembly/x86-64/tramps.lisp | 38 +++++++++++---- src/compiler/globaldb.lisp | 6 +++ src/compiler/info-vector.lisp | 13 ++++- src/compiler/x86-64/alloc.lisp | 56 +++++++++++++++------ src/compiler/x86-64/call.lisp | 15 +++--- src/runtime/gencgc.c | 44 +++++++++++++++-- tests/x86-64-codegen.impure.lisp | 7 +++ 8 files changed, 212 insertions(+), 37 deletions(-) create mode 100644 doc/internals-notes/memory-arenas.txt diff --git a/doc/internals-notes/memory-arenas.txt b/doc/internals-notes/memory-arenas.txt new file mode 100644 index 0000000000..64f0c53d71 --- /dev/null +++ b/doc/internals-notes/memory-arenas.txt @@ -0,0 +1,70 @@ + +The use-case for arenas is to allow for an allocator that consumes +space using a stack-like discpline, often called "Mark/Release" +(see e.g. https://wiki.dlang.org/Memory_Management#Mark.2FRelease) +Multiple threads can each create their own arena of memory, mark their current usage, +do some work, and very quickly unwind the mark all before GC notices anything. + +Obviously there are complications involved when dynamic space points to the arenas +and vice-versa. Most of those are surmountable, but for for CLOS dispatch being a +particularly intense pain point. PCL has a tendency to pseudo-randomly create persistent +state when you least expect it, so that you end up with FUNCALLABLE-INSTANCE-FUNCTION +of a GENERIC-FUNCTION pointing to memory that was just released via mark/release. +Discovering enough about where the PCL implementation creates state changes was +counterproductive to the overall mission of changing a minimal amount of source code. + +The starting point for exploration was a pair of macros named WITH-ARENA and +WITHOUT-ARENA that do as their names imply. They are scoped dynamically, not lexically, +which means that they control behavior of allocator at runtime, and can be thought +of as akin to binding a special variable. +Bearing in mind that the desired goal is not to have all "user" code know that it should +do something special to allocate, it seems preferable to force all system code to know +when not to use an arena. So if we assume that the toplevel of all user code has a single +WITH-ARENA placed around it, the objective becomes to strategically place WITHOUT-ARENA +throughout the internals of the PCL implementation. +(A WITHOUT-ARENA at the entry point to COMPILE takes care of the general issue of making +new code, per se. But it doesn't help the situation with PCL in general) + +PCL relies on such a significant amount of mutable state and action-at-a-distance +that even after after weeks of study of the PCL source code, it was not apparent where +to inject appropriate allocator control macros. And users have extremly little choice +over when, if ever, PCL decides to allocate anything in the first place. + +This troubles stem from two patterns prevalent in PCL. +1. lambdas that return lambdas + to decorate them would imply writing + (without-arena () (lambda () ... (without-arena () (lambda ...)))) + +2. lambdas that end up tail-calling the user's "actual" code + (lambda (args) (reoptimize-myself-for-current-state (apply actual-user-code actual-args))) + which would have to be recast as something like + (lambda (args) + (without-arena (reoptimize-myself-for-current-state + (with-arena (apply actual-user-code actual-args))))) + +It became apparent that we need a variety of techniques that entail more cooperation +between the compiler and the VM than just these 2 macros, to minimize changes in source. + +* Dynamically scoped control, as the starting point. + +* Choose based on object type at runtime- so SB-PCL::CACHE would always go "somewhere else" + than dictated by the dynamic control. i.e. we decide _statically_ that certain objects + go to either the TLAB or the arena. + This unfortunately precludes using %MAKE-INSTANCE to make variable-length structures + such as SB-INT:PACKED-INFO because there is no allocation vop which takes the length + as a variable, but a particular instance type as a constant. + +* Based on the name of the file being compiled- any allocation code could be + emitted differently at compile-time. So for example while compiling src/pcl/*.lisp + the ALLOCATION function could do something different. + This can be achieved with a compile-time DEFVAR that says that the alternative + TLABs should be used. + +* Based on a lexical scope- any allocation occurring while that declaration + is visible would go "somewhere else". This changes the scoping from dynamic + to static, but it is not apprpriate for things like a HASH-TABLE constructor, because + a HASH-TABLE could be made by user code, or PCL. + However it seems well-suited to something like SB-INT:PACKED-INFO because those + objects always imply a (relatively) permanent state change. + And that if we do see an occurence of MAKE-HASH-TABLE in the PCL source code, + we can easily wrap that in WITHOUT-ARENA. diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index bc82476ce0..f36a9c67ce 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -51,39 +51,57 @@ fpr-restore ; KLUDGE: this is element 6 of the entry point vector (do-fprs pop :xmm))) -(define-assembly-routine (alloc-tramp) () +(macrolet ((def-routine-pair (name&options vars &body code) + (let ((base-name (car name&options))) + `(progn + (symbol-macrolet ((system-tlab-p 0)) + (define-assembly-routine ,name&options ,vars ,@code)) + ;; In absence of this feature, don't define extra routines. + ;; (Don't want to have a way to mess things up) + #+system-tlabs + (symbol-macrolet ((system-tlab-p 2)) + (define-assembly-routine + (,(symbolicate "SYS-" (car name&options)) . ,(cdr name&options)) + ,vars ,@code)))))) + +(def-routine-pair (alloc-tramp) () (with-registers-preserved (c) (inst mov rdi-tn (ea 16 rbp-tn)) + (inst mov rsi-tn system-tlab-p) (inst call (make-fixup "alloc" :foreign)) (inst mov (ea 16 rbp-tn) rax-tn))) ; result onto stack -(define-assembly-routine (list-alloc-tramp) () ; CONS, ACONS, LIST, LIST* +(def-routine-pair (list-alloc-tramp) () ; CONS, ACONS, LIST, LIST* (with-registers-preserved (c) (inst mov rdi-tn (ea 16 rbp-tn)) + (inst mov rsi-tn system-tlab-p) (inst call (make-fixup "alloc_list" :foreign)) (inst mov (ea 16 rbp-tn) rax-tn))) ; result onto stack -(define-assembly-routine (alloc-funinstance) () - (with-registers-preserved (c) - (inst mov rdi-tn (ea 16 rbp-tn)) - (inst call (make-fixup "alloc_funinstance" :foreign)) - (inst mov (ea 16 rbp-tn) rax-tn))) - -(define-assembly-routine (listify-&rest (:return-style :none)) () +(def-routine-pair (listify-&rest (:return-style :none)) () (with-registers-preserved (c) (inst mov rdi-tn (ea 16 rbp-tn)) ; 1st C call arg (inst mov rsi-tn (ea 24 rbp-tn)) ; 2nd C call arg + (inst mov rdx-tn system-tlab-p) (inst call (make-fixup "listify_rest_arg" :foreign)) (inst mov (ea 24 rbp-tn) rax-tn)) ; result (inst ret 8)) ; pop one argument; the unpopped word now holds the result -(define-assembly-routine (make-list (:return-style :none)) () +(def-routine-pair (make-list (:return-style :none)) () (with-registers-preserved (c) (inst mov rdi-tn (ea 16 rbp-tn)) ; 1st C call arg (inst mov rsi-tn (ea 24 rbp-tn)) ; 2nd C call arg + (inst mov rdx-tn system-tlab-p) (inst call (make-fixup "make_list" :foreign)) (inst mov (ea 24 rbp-tn) rax-tn)) ; result (inst ret 8)) ; pop one argument; the unpopped word now holds the result +) + +(define-assembly-routine (alloc-funinstance) () + (with-registers-preserved (c) + (inst mov rdi-tn (ea 16 rbp-tn)) + (inst call (make-fixup "alloc_funinstance" :foreign)) + (inst mov (ea 16 rbp-tn) rax-tn))) ;;; These routines are for the deterministic consing profiler. ;;; The C support routine's argument is the return PC. diff --git a/src/compiler/globaldb.lisp b/src/compiler/globaldb.lisp index 3d3b4516b1..8c43689220 100644 --- a/src/compiler/globaldb.lisp +++ b/src/compiler/globaldb.lisp @@ -533,6 +533,12 @@ (setq *recognized-declarations* (delete name *recognized-declarations*)))))) +(setf (sb-int:info :declaration :known 'sb-c::tlab) + (lambda (res spec vars fvars) + (declare (ignore vars fvars)) + (sb-c::make-lexenv :default res + :user-data `((:declare ,@spec))))) + ;;;; ":ALIEN-TYPE" subsection - Data pertaining to globally known alien-types. (define-info-type (:alien-type :kind) :type-spec (member :primitive :defined :unknown) diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index e6a49609a0..a50f09a2e0 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -90,7 +90,7 @@ ;;;;; Some stuff moved from 'globaldb.lisp': ;;; The structure constructor is never called -(sb-xc:defstruct (packed-info (:predicate nil) (:constructor nil)) +(sb-xc:defstruct (packed-info (:copier %copy-packed-info) (:predicate nil) (:constructor nil)) cells) (declaim (freeze-type packed-info)) #-sb-xc-host @@ -99,7 +99,11 @@ (setf (dd-flags dd) (logior (dd-flags dd) +dd-varylen+)))) (eval-when (#-sb-xc-host :compile-toplevel) (sb-xc:defmacro make-packed-info (n) - `(%new-instance ,(find-layout 'packed-info) (+ ,n ,sb-vm:instance-data-start)))) + `(locally (declare (sb-c::tlab :system)) ; will be ignored if #-system-tlabs + (%new-instance ,(find-layout 'packed-info) (+ ,n ,sb-vm:instance-data-start)))) + (sb-xc:defmacro copy-packed-info (x) + `(locally (declare (sb-c::tlab :system)) + (%copy-packed-info ,x)))) (defconstant info-num-mask (ldb (byte info-number-bits 0) -1)) ; #b111111 @@ -891,3 +895,8 @@ This is interpreted as old-info))) (info-puthash *info-environment* name #'hairy-name)))) result)) + +;;; Disassembling these proves that SYS-ALLOC-TRAMP gets called +(export '(test-make-packed-info test-copy-packed-info)) +(defun test-make-packed-info (x) (make-packed-info (the (mod 100) x))) +(defun test-copy-packed-info (x) (copy-packed-info x)) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index 706c6b2959..be13de40ac 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -182,7 +182,23 @@ ;;; 1. what to allocate: type, size, lowtag describe the object ;;; 2. where to put the result ;;; 3. node (for determining immobile-space-p) and a scratch register or two -(defun allocation (type size lowtag alloc-tn node temp thread-temp &key overflow) +(defvar *use-system-tlab* nil) +(defun system-tlab-p (node) + #-system-tlabs (declare (ignore node)) + #+system-tlabs + (or *use-system-tlab* + (and node + (named-let search-env ((env (sb-c::node-lexenv node))) + (dolist (data (sb-c::lexenv-user-data env) + (and (sb-c::lexenv-parent env) + (search-env (sb-c::lexenv-parent env)))) + (when (and (eq (first data) :declare) + (eq (second data) 'sb-c::tlab)) + (return (eq (third data) :system)))))))) + +(defun allocation (type size lowtag alloc-tn node temp thread-temp + &key overflow + &aux (systemp (system-tlab-p node))) (declare (ignorable thread-temp)) (flet ((fallback (size) ;; Call an allocator trampoline and get the result in the proper register. @@ -194,16 +210,24 @@ (inst push alloc-tn)) (t (inst push size))) - (invoke-asm-routine 'call - (if (eql type +cons-primtype+) 'list-alloc-tramp 'alloc-tramp) - node t) + (invoke-asm-routine + 'call + (if systemp + (if (eql type +cons-primtype+) 'sys-list-alloc-tramp 'sys-alloc-tramp) + (if (eql type +cons-primtype+) 'list-alloc-tramp 'alloc-tramp)) + node t) (inst pop alloc-tn))) (let* ((NOT-INLINE (gen-label)) (DONE (gen-label)) - (free-pointer #+sb-thread (thread-slot-ea (if (eql type +cons-primtype+) - thread-cons-tlab-slot - thread-mixed-tlab-slot) - #+gs-seg thread-temp) + (free-pointer #+sb-thread + (let ((slot (if systemp + (if (eql type +cons-primtype+) + thread-sys-cons-tlab-slot + thread-sys-mixed-tlab-slot) + (if (eql type +cons-primtype+) + thread-cons-tlab-slot + thread-mixed-tlab-slot)))) + (thread-slot-ea slot #+gs-seg thread-temp)) #-sb-thread (ea (if (eql type +cons-primtype+) cons-region mixed-region))) (end-addr (ea (sb-x86-64-asm::ea-segment free-pointer) @@ -766,13 +790,15 @@ (instrument-alloc +cons-primtype+ size node (list next limit) thread-tn) (pseudo-atomic (:thread-tn thread-tn) (allocation +cons-primtype+ size list-pointer-lowtag result node limit thread-tn - :overflow (lambda () - ;; Push C call args right-to-left - (inst push (if (integerp size) (constantize size) size)) - (inst push (if (sc-is element immediate) (tn-value element) element)) - (invoke-asm-routine 'call 'make-list node) - (inst pop result) - (inst jmp leave-pa))) + :overflow + (lambda () + ;; Push C call args right-to-left + (inst push (if (integerp size) (constantize size) size)) + (inst push (if (sc-is element immediate) (tn-value element) element)) + (invoke-asm-routine + 'call (if (system-tlab-p node) 'sys-make-list 'make-list) node) + (inst pop result) + (inst jmp leave-pa))) (compute-end) (inst mov next result) (inst jmp entry) diff --git a/src/compiler/x86-64/call.lisp b/src/compiler/x86-64/call.lisp index fc03cfe41b..b89a1847ae 100644 --- a/src/compiler/x86-64/call.lisp +++ b/src/compiler/x86-64/call.lisp @@ -1307,12 +1307,15 @@ (if stack-allocate-p (stack-allocation rcx 0 dst) (allocation +cons-primtype+ rcx 0 dst node value thread-tn - :overflow (lambda () - (inst push rcx) - (inst push context) - (invoke-asm-routine 'call 'listify-&rest node) - (inst pop result) - (inst jmp leave-pa)))) + :overflow + (lambda () + (inst push rcx) + (inst push context) + (invoke-asm-routine + 'call (if (system-tlab-p node) 'sys-listify-&rest 'listify-&rest) + node) + (inst pop result) + (inst jmp leave-pa)))) ;; Recalculate DST as a tagged pointer to the last cons (inst lea dst (ea (- list-pointer-lowtag (* cons-size n-word-bytes)) dst rcx)) (inst shr :dword rcx (1+ word-shift)) ; convert bytes to number of cells diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 30ab854a5c..28457b785f 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -1245,6 +1245,14 @@ gc_close_region(struct alloc_region *alloc_region, int page_type) char *page_base = page_address(first_page); char *free_pointer = alloc_region->free_pointer; +#if defined LISP_FEATURE_SYSTEM_TLABS && defined DEBUG + if (alloc_region == &get_sb_vm_thread()->sys_mixed_tlab || + alloc_region == &get_sb_vm_thread()->sys_cons_tlab) { + char msg[] = "NOTE: closing a system allocation region\n"; + write(2, msg, sizeof msg-1); // signal-safe + } +#endif + // page_bytes_used() can be done without holding a lock. Nothing else // affects the usage on the first page of a region owned by this thread. page_bytes_t orig_first_page_bytes_used = page_bytes_used(first_page); @@ -4945,7 +4953,7 @@ void gc_allocate_ptes() int gencgc_alloc_profiler; static NO_SANITIZE_MEMORY lispobj* -lisp_alloc(int largep, struct alloc_region *region, sword_t nbytes, +lisp_alloc(int flags, struct alloc_region *region, sword_t nbytes, int page_type, struct thread *thread) { os_vm_size_t trigger_bytes = 0; @@ -5043,7 +5051,7 @@ lisp_alloc(int largep, struct alloc_region *region, sword_t nbytes, allocator_record_backtrace(__builtin_frame_address(0), thread); #endif - if (largep) return gc_alloc_large(nbytes, page_type); + if (flags & 1) return gc_alloc_large(nbytes, page_type); int __attribute__((unused)) ret = mutex_acquire(&free_pages_lock); gc_assert(ret); @@ -5081,6 +5089,22 @@ CRITICAL_SECTION code_allocator_lock; // threads are mandatory for win32 static pthread_mutex_t code_allocator_lock = PTHREAD_MUTEX_INITIALIZER; #endif +#ifdef LISP_FEATURE_X86_64 + +// The asm routines have been modified so that alloc() and alloc_list() +// each receive the size an a single-bit flag affecting locality of the result. +#define DEFINE_LISP_ENTRYPOINT(name, largep, TLAB, page_type) \ +NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI *name(sword_t nbytes, int systemp) { \ + struct thread *self = get_sb_vm_thread(); \ + return lisp_alloc(largep | systemp, \ + systemp ? &self->sys_##TLAB##_tlab : THREAD_ALLOC_REGION(self,TLAB), \ + nbytes, page_type, self); } + +DEFINE_LISP_ENTRYPOINT(alloc, (nbytes >= LARGE_OBJECT_SIZE), mixed, PAGE_TYPE_MIXED) +DEFINE_LISP_ENTRYPOINT(alloc_list, 0, cons, PAGE_TYPE_CONS) + +#else + #define DEFINE_LISP_ENTRYPOINT(name, largep, tlab, page_type) \ NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI *name(sword_t nbytes) { \ struct thread *self = get_sb_vm_thread(); \ @@ -5097,6 +5121,8 @@ DEFINE_LISP_ENTRYPOINT(alloc_list, 0, cons, PAGE_TYPE_CONS) DEFINE_LISP_ENTRYPOINT(alloc_list, 0, mixed, PAGE_TYPE_MIXED) #endif +#endif + lispobj AMD64_SYSV_ABI alloc_code_object(unsigned total_words, unsigned boxed) { struct thread *th = get_sb_vm_thread(); @@ -5149,11 +5175,16 @@ NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI alloc_funinstance(sword_t nbytes) /* Make a list that couldn't be inline-allocated. Break it up into contiguous * blocks of conses not to exceed one GC page each. */ -NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI make_list(lispobj element, sword_t nbytes) { +NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI +make_list(lispobj element, sword_t nbytes, __attribute__((unused)) int sys) { // Technically this overflow handler could permit garbage collection // between separate allocation. For now the entire thing is pseudo-atomic. struct thread *self = get_sb_vm_thread(); +#ifdef LISP_FEATURE_SYSTEM_TLABS + struct alloc_region *region = sys ? &self->sys_cons_tlab : &self->cons_tlab; +#else struct alloc_region *region = THREAD_ALLOC_REGION(self, cons); +#endif int partial_request = (char*)region->end_addr - (char*)region->free_pointer; gc_assert(nbytes > (sword_t)partial_request); // We might be even cleverer by accepting however few bytes are actually available @@ -5181,10 +5212,15 @@ NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI make_list(lispobj element, sword_t nby /* Convert a &MORE context to a list. Split it up like make_list if we have to */ #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK -NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI listify_rest_arg(lispobj* context, sword_t nbytes) { +NO_SANITIZE_MEMORY lispobj AMD64_SYSV_ABI +listify_rest_arg(lispobj* context, sword_t nbytes, __attribute__((unused)) int sys) { // same comment as above in make_list() applies about the scope of pseudo-atomic struct thread *self = get_sb_vm_thread(); +#ifdef LISP_FEATURE_SYSTEM_TLABS + struct alloc_region *region = sys ? &self->sys_cons_tlab : &self->cons_tlab; +#else struct alloc_region *region = THREAD_ALLOC_REGION(self, cons); +#endif int partial_request = (char*)region->end_addr - (char*)region->free_pointer; gc_assert(nbytes > (sword_t)partial_request); if (partial_request == 0) partial_request = CONS_PAGE_USABLE_BYTES; diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index e5aeb5f7c8..5f421582c5 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1282,3 +1282,10 @@ (let ((neg (- val))) (make-point neg)))))) (assert-has-gc-barrier "SET-SLOT" lines #-compact-instance-header 1))) + +(with-test (:name :system-tlabs) + (when (find-symbol "SYS-ALLOC-TRAMP" "SB-VM") + (assert (loop for line in (disassembly-lines 'sb-impl:test-make-packed-info) + thereis (search "SYS-ALLOC-TRAMP" line))) + (assert (loop for line in (disassembly-lines 'sb-impl:test-copy-packed-info) + thereis (search "SYS-ALLOC-TRAMP" line))))) From e02ae6d4a4e97c1d50b5430e1c10cff2ef6bf6ff Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 15 Aug 2022 00:06:32 +0300 Subject: [PATCH 3845/4023] Check :start/end for FILL more thoroughly. Using lvar-annotations. --- src/compiler/callable-args.lisp | 2 - src/compiler/ir1util.lisp | 14 +++++- src/compiler/node.lisp | 4 ++ src/compiler/seqtran.lisp | 75 +++++++++++++++++++-------------- tests/seq.pure.lisp | 7 +++ 5 files changed, 66 insertions(+), 36 deletions(-) diff --git a/src/compiler/callable-args.lisp b/src/compiler/callable-args.lisp index 9816508e8c..395a97e107 100644 --- a/src/compiler/callable-args.lisp +++ b/src/compiler/callable-args.lisp @@ -31,8 +31,6 @@ :deps deps :type type))) (when (add-annotation lvar annotation) - (loop for lvar in deps - do (push annotation (lvar-dependent-annotations lvar))) (assert-lvar-type lvar (specifier-type 'function-designator) policy)))))) diff --git a/src/compiler/ir1util.lisp b/src/compiler/ir1util.lisp index ef309c217e..9836079cb9 100644 --- a/src/compiler/ir1util.lisp +++ b/src/compiler/ir1util.lisp @@ -3041,7 +3041,7 @@ is :ANY, the function name is not checked." (defun propagate-lvar-annotations (new old &optional (propagate-dependencies t)) (when propagate-dependencies (loop for dep in (lvar-dependent-annotations old) - do (nsubst new old (lvar-function-designator-annotation-deps dep)) + do (nsubst new old (lvar-dependent-annotation-deps dep)) when (lvar-p new) do (pushnew dep (lvar-dependent-annotations new) :test #'eq)) @@ -3231,6 +3231,10 @@ is :ANY, the function name is not checked." (list (node-source-form use)) :condition condition))))))) +(defun process-lvar-sequence-bounds-annotation (lvar annotation) + (destructuring-bind (start end) (lvar-dependent-annotation-deps annotation) + (check-sequence-ranges lvar start end annotation))) + (defun process-annotations (lvar) (unless (and (combination-p (lvar-dest lvar)) (lvar-fun-is @@ -3256,13 +3260,19 @@ is :ANY, the function name is not checked." (lvar-function-annotation (check-function-lvar lvar annot)) (lvar-type-annotation - (process-lvar-type-annotation lvar annot))) + (process-lvar-type-annotation lvar annot)) + (lvar-sequence-bounds-annotation + (process-lvar-sequence-bounds-annotation lvar annot))) (setf (lvar-annotation-fired annot) t)))))) (defun add-annotation (lvar annotation) (unless (eq (lvar-annotations lvar) (pushnew annotation (lvar-annotations lvar) :key #'type-of)) + (when (typep annotation 'lvar-dependent-annotation) + (loop for lvar in (lvar-dependent-annotation-deps annotation) + when (lvar-p lvar) + do (push annotation (lvar-dependent-annotations lvar)))) (unless (lvar-annotation-source-path annotation) (setf (lvar-annotation-source-path annotation) (if (boundp '*current-path*) diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index 6cff013ec6..258f4a28a0 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -246,6 +246,10 @@ (result-specs nil :type list) type) +(defstruct (lvar-sequence-bounds-annotation + (:include lvar-dependent-annotation) + (:copier nil))) + (defstruct (lvar-type-annotation (:include lvar-annotation) (:copier nil)) diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp index 6a4110322f..719704b961 100644 --- a/src/compiler/seqtran.lisp +++ b/src/compiler/seqtran.lisp @@ -779,7 +779,9 @@ :node node) (fill-transform 'fill node seq item start end)) (defun fill-transform (fun-name node seq item start end) - (declare (ignorable end)) + (add-annotation seq + (make-lvar-sequence-bounds-annotation :deps (list start end) + :source-path (node-source-path node))) (let* ((type (lvar-type seq)) (element-ctype (array-type-upgraded-element-type type)) (element-type (type-specifier element-ctype)) @@ -1026,37 +1028,46 @@ (defun check-sequence-ranges (string start end node &optional (suffix "") sequence-name) (let* ((type (lvar-type string)) - (length (vector-type-length type))) - (when length - (flet ((check (index name length-type) - (when index - (let ((index-type (lvar-type index))) - (unless (types-equal-or-intersect index-type - (specifier-type length-type)) - (let ((*compiler-error-context* node)) - (compiler-warn "Bad :~a~a ~a for~a ~a" - name suffix - (type-specifier index-type) - (if sequence-name - (format nil " for ~a of type" sequence-name) - suffix) - (type-specifier type)))))))) - (check start "start" `(integer 0 ,length)) - (check end "end" `(or null (integer 0 ,length))))) - (when (and start end) - (let* ((start-type (lvar-type start)) - (start-interval (type-approximate-interval start-type)) - (end-type (lvar-type end)) - (end-interval (type-approximate-interval end-type))) - (when (and (interval-p start-interval) - (interval-p end-interval) - (interval-< end-interval start-interval)) - (let ((*compiler-error-context* node)) - (compiler-warn ":start~a ~a is greater than :end~a ~a" - suffix - (type-specifier start-type) - suffix - (type-specifier end-type)))))))) + (length (vector-type-length type)) + (annotation (find-if #'lvar-sequence-bounds-annotation-p (lvar-annotations string)))) + (when annotation + (when (shiftf (lvar-annotation-fired annotation) t) + (return-from check-sequence-ranges))) + (flet ((arg-type (x) + (typecase x + (constant (ctype-of (constant-value x))) + (lvar (lvar-type x)) + (t (leaf-type x))))) + (when length + (flet ((check (index name length-type) + (when index + (let ((index-type (arg-type index))) + (unless (types-equal-or-intersect index-type + (specifier-type length-type)) + (let ((*compiler-error-context* node)) + (compiler-warn "Bad :~a~a ~a for~a ~a" + name suffix + (type-specifier index-type) + (if sequence-name + (format nil " for ~a of type" sequence-name) + suffix) + (type-specifier type)))))))) + (check start "start" `(integer 0 ,length)) + (check end "end" `(or null (integer 0 ,length))))) + (when (and start end) + (let* ((start-type (arg-type start)) + (start-interval (type-approximate-interval start-type)) + (end-type (arg-type end)) + (end-interval (type-approximate-interval end-type))) + (when (and (interval-p start-interval) + (interval-p end-interval) + (interval-< end-interval start-interval)) + (let ((*compiler-error-context* node)) + (compiler-warn ":start~a ~a is greater than :end~a ~a" + suffix + (type-specifier start-type) + suffix + (type-specifier end-type))))))))) (defoptimizers ir2-hook (string=* string<* string>* string<=* string>=* %sp-string-compare simple-base-string= diff --git a/tests/seq.pure.lisp b/tests/seq.pure.lisp index 76095da19e..3f65434e27 100644 --- a/tests/seq.pure.lisp +++ b/tests/seq.pure.lisp @@ -787,3 +787,10 @@ ',expected)))) (check (sort (the (cons (eql 0)) x) y) cons))) + +(with-test (:name :range-error-fill-transform) + (assert + (nth-value 2 (checked-compile `(lambda (x y) + (declare ((simple-base-string 10) x)) + (fill x y :start 12)) + :allow-warnings t)))) From c11117102b1ea506d5d0b12ec3149949eb87e60b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 15 Aug 2022 01:46:30 +0300 Subject: [PATCH 3846/4023] Unused variable. --- src/assembly/x86-64/tramps.lisp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index f36a9c67ce..9a95608a2e 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -52,17 +52,16 @@ (do-fprs pop :xmm))) (macrolet ((def-routine-pair (name&options vars &body code) - (let ((base-name (car name&options))) - `(progn - (symbol-macrolet ((system-tlab-p 0)) - (define-assembly-routine ,name&options ,vars ,@code)) - ;; In absence of this feature, don't define extra routines. - ;; (Don't want to have a way to mess things up) - #+system-tlabs - (symbol-macrolet ((system-tlab-p 2)) - (define-assembly-routine - (,(symbolicate "SYS-" (car name&options)) . ,(cdr name&options)) - ,vars ,@code)))))) + `(progn + (symbol-macrolet ((system-tlab-p 0)) + (define-assembly-routine ,name&options ,vars ,@code)) + ;; In absence of this feature, don't define extra routines. + ;; (Don't want to have a way to mess things up) + #+system-tlabs + (symbol-macrolet ((system-tlab-p 2)) + (define-assembly-routine + (,(symbolicate "SYS-" (car name&options)) . ,(cdr name&options)) + ,vars ,@code))))) (def-routine-pair (alloc-tramp) () (with-registers-preserved (c) From b95bd213c96ff0d87791f86d322b236fe08e2fd0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 15 Aug 2022 16:00:27 -0400 Subject: [PATCH 3847/4023] Remove convoluted genesis logic Don't attach fdefns to symbol-info just to delete it later --- src/compiler/generic/genesis.lisp | 66 +++++++++++++------------------ src/compiler/info-vector.lisp | 15 ++----- 2 files changed, 30 insertions(+), 51 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index dac43a88ec..348ee82a1f 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2145,6 +2145,8 @@ core and return a descriptor to it." (read-bits-wordindexed fdefn 0))) (write-wordindexed fdefn sb-vm:fdefn-name-slot cold-name) (when core-file-name + (when (symbolp warm-name) + (write-wordindexed (cold-intern warm-name) sb-vm:symbol-fdefn-slot fdefn)) (if *cold-assembler-obj* (fdefn-makunbound fdefn) (push (lambda () @@ -2217,18 +2219,19 @@ core and return a descriptor to it." ;; Create pointer from SYMBOL and/or (SETF SYMBOL) to respective fdefinition ;; (defun attach-fdefinitions-to-symbols (hashtable) - ;; Collect fdefinitions that go with one symbol, e.g. CAR and (SETF CAR), - ;; using the host's code for manipulating a packed-info. - (maphash (lambda (warm-name cold-fdefn) + ;; Collect fdefinitions that go with one symbol, e.g. (SETF CAR) and (CAS CAR) + ;; using the host's code for manipulating a packed-info. + ;; Do not add fdefns for symbols to the info. It goes in a slot. + (maphash (lambda (warm-name cold-fdefn) + (unless (symbolp warm-name) (with-globaldb-name (key1 key2) warm-name :hairy (error "Hairy fdefn name in genesis: ~S" warm-name) - :simple - (setf (gethash key1 hashtable) - (packed-info-insert - (gethash key1 hashtable +nil-packed-infos+) - key2 +fdefn-info-num+ cold-fdefn)))) - *cold-fdefn-objects*) - hashtable) + :simple (setf (gethash key1 hashtable) + (packed-info-insert + (gethash key1 hashtable +nil-packed-infos+) + key2 +fdefn-info-num+ cold-fdefn))))) + *cold-fdefn-objects*) + hashtable) (defun dump-packed-info (list) ;; Payload length is the element count + LAYOUT slot if necessary. @@ -2246,35 +2249,20 @@ core and return a descriptor to it." (loop for (warm-sym . info) in (sort (%hash-table-alist hashtable) #'< :key (lambda (x) (descriptor-bits (cold-intern (car x))))) - do - (aver warm-sym) ; enforce that NIL was specially dealt with already - (let* ((cold-sym (cold-intern warm-sym)) - (fdefn)) - (declare (ignorable fdefn)) - (let ((word (%info-ref info 0))) - (when (and (>= (ldb (byte info-number-bits 0) word) 1) - (= (ldb (byte info-number-bits info-number-bits) word) - +fdefn-info-num+)) - (setf fdefn (%info-ref info (1- (sb-impl::packed-info-len info)))) - (aver (= (logand (read-bits-wordindexed fdefn 0) sb-vm:widetag-mask) - sb-vm:fdefn-widetag)) - ;; Remove the cold fdefn from the packed-info - (setq info (sb-impl::packed-info-remove - info sb-impl::+no-auxiliary-key+ - `(,+fdefn-info-num+))))) - (let ((pack - (when (> (sb-impl::packed-info-len info) 1) - (dump-packed-info - ;; Each packed-info will have one fixnum, possibly the symbol SETF, - ;; and zero, one, or two #<fdefn>, and/or a classoid-cell. - (map 'list (lambda (elt) - (etypecase elt - (symbol (cold-intern elt)) - (sb-xc:fixnum (make-fixnum-descriptor elt)) - (descriptor elt))) - (sb-impl::packed-info-cells info)))))) - (when pack (write-wordindexed cold-sym sb-vm:symbol-info-slot pack)) - (when fdefn (write-wordindexed cold-sym sb-vm:symbol-fdefn-slot fdefn)))))) + do (aver warm-sym) ; enforce that NIL was specially dealt with already + (aver (> (sb-impl::packed-info-len info) 1)) + (write-wordindexed + (cold-intern warm-sym) + sb-vm:symbol-info-slot + (dump-packed-info + ;; Each packed-info will have one fixnum, possibly the symbol SETF, + ;; and zero, one, or two #<fdefn>, and/or a classoid-cell. + (map 'list (lambda (elt) + (etypecase elt + (symbol (cold-intern elt)) + (sb-xc:fixnum (make-fixnum-descriptor elt)) + (descriptor elt))) + (sb-impl::packed-info-cells info)))))) ;;;; fixups and related stuff diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index a50f09a2e0..7459a5141b 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -455,18 +455,9 @@ (output (make-packed-info (1+ new-n)))) ;; Two cases: we're either inserting info for the fdefn, or not. (cond ((eq info-number +fdefn-info-num+) - ;; fdefn, if present, must remain the first packed field. - ;; Replace the lowest field (the count) with +fdefn-info-num+, - ;; shift everything left 6 bits, then OR in the new count. - (setf (%info-ref output 0) - (logior (make-info-descriptor - (dpb +fdefn-info-num+ (byte info-number-bits 0) - descriptor) info-number-bits) new-n) - ;; Packed vectors are indexed "backwards". The first - ;; field's info is in the highest numbered cell. - (%info-ref output new-n) value) - (loop for i from 1 below new-n - do (setf (%info-ref output i) (%info-ref input i)))) + ;; FDEFNs are not stored in a packed-info except for non-symbol function names + ;; in which case we don't use quick-packed-info-insert. + (bug "incorrect call to quick-packed-info-insert")) (t ;; Add a field on the high end and increment the count. (setf (%info-ref output 0) From a3feb2d3f2c4b3a84b9c97b698f4fa0dbd47b84b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 15 Aug 2022 18:25:13 -0400 Subject: [PATCH 3848/4023] Fix test breakage due to b95bd213c9 And improve quick-packed-info-insert with a source-transform --- src/compiler/generic/vm-tran.lisp | 9 +++++++++ src/compiler/info-vector.lisp | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index e6b27a1d49..cbf72aec50 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -155,6 +155,15 @@ (dd-length (wrapper-dd (sb-kernel::compiler-layout-or-lose (classoid-name classoid)))) (give-up-ir1-transform)))) +;;; This doesn't help a whole lot, but it does fire during compilation of 'info-vector' +;;; which uses variable-length instances of PACKED-INFO, having no slot transforms. +(define-source-transform (setf %instance-ref) (newval instance index) + `(let ((.newval. ,newval) + (.instance. ,instance) + (.index. ,index)) + (%instance-set .instance. .index. .newval.) + .newval.)) + (define-source-transform %instance-wrapper (x) `(layout-friend (%instance-layout ,x))) (define-source-transform %fun-wrapper (x) `(layout-friend (%fun-layout ,x))) diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index 7459a5141b..c6a9ed391a 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -454,7 +454,8 @@ (new-n (truly-the info-number (packed-info-len input))) (output (make-packed-info (1+ new-n)))) ;; Two cases: we're either inserting info for the fdefn, or not. - (cond ((eq info-number +fdefn-info-num+) + (cond #+nil + ((eq info-number +fdefn-info-num+) ;; FDEFNs are not stored in a packed-info except for non-symbol function names ;; in which case we don't use quick-packed-info-insert. (bug "incorrect call to quick-packed-info-insert")) From 7793865ac0ef430185042daaa4b3aaad75eb0643 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 15 Aug 2022 19:35:55 -0400 Subject: [PATCH 3849/4023] Remove DYNAMIC-SPACE-END and CURRENT-DYNAMIC-SPACE-START And define space start and end accessor pairs together --- src/code/gc.lisp | 28 +++------------------------- src/code/misc-aliens.lisp | 15 +++++++++++++++ src/code/room.lisp | 6 +++--- src/cold/exports.lisp | 4 ++-- tests/lockfree-list.impure.lisp | 2 +- 5 files changed, 24 insertions(+), 31 deletions(-) diff --git a/src/code/gc.lisp b/src/code/gc.lisp index 9f01f98625..fc95cf31be 100644 --- a/src/code/gc.lisp +++ b/src/code/gc.lisp @@ -13,28 +13,10 @@ ;;;; DYNAMIC-USAGE and friends -#-darwin-jit -(define-alien-variable ("READ_ONLY_SPACE_START" sb-vm:read-only-space-start) os-vm-size-t) -#+gencgc -(define-alien-variable ("DYNAMIC_SPACE_START" sb-vm:dynamic-space-start) os-vm-size-t) -(declaim (inline current-dynamic-space-start)) -(defun current-dynamic-space-start () - #+gencgc sb-vm:dynamic-space-start - #-gencgc (extern-alien "current_dynamic_space" unsigned-long)) - -#+gencgc -(progn - (declaim (inline dynamic-space-free-pointer)) - (defun dynamic-space-free-pointer () - (sap+ (int-sap (current-dynamic-space-start)) - ;; not sure why next_free_page is 'sword_t' instead of 'uword_t' ! - (truly-the (signed-byte 64) - (* (extern-alien "next_free_page" signed) sb-vm:gencgc-page-bytes))))) - (defun dynamic-space-obj-p (x) ; X must not be an immediate object (with-pinned-objects (x) (let ((addr (get-lisp-obj-address x))) - (< (current-dynamic-space-start) addr (sap-int (dynamic-space-free-pointer)))))) + (< sb-vm:dynamic-space-start addr (sap-int (dynamic-space-free-pointer)))))) (declaim (inline dynamic-usage)) (defun dynamic-usage () @@ -43,7 +25,7 @@ #-gencgc (truly-the word (- (sap-int (sb-c::dynamic-space-free-pointer)) - (current-dynamic-space-start)))) + sb-vm:dynamic-space-start))) (defun static-space-usage () (- (sap-int sb-vm:*static-space-free-pointer*) sb-vm:static-space-start)) @@ -430,10 +412,6 @@ Note: currently changes to this value are lost when saving core." ;;;; GENCGC specifics ;;;; -(define-symbol-macro sb-vm:dynamic-space-end - ;; FIXME: what uses this? Nothing? If so, remove it. - (+ (dynamic-space-size) sb-vm:dynamic-space-start)) - (define-alien-variable ("gc_logfile" %gc-logfile) (* char)) (defun (setf gc-logfile) (pathname) @@ -590,7 +568,7 @@ Experimental: interface subject to change." generation))) (macrolet ((cases () - `(cond ((< (current-dynamic-space-start) addr + `(cond ((< sb-vm:dynamic-space-start addr (sap-int (dynamic-space-free-pointer))) :dynamic) ((immobile-space-addr-p addr) :immobile) diff --git a/src/code/misc-aliens.lisp b/src/code/misc-aliens.lisp index 8556321205..e1e2fa065f 100644 --- a/src/code/misc-aliens.lisp +++ b/src/code/misc-aliens.lisp @@ -12,12 +12,27 @@ (in-package "SB-IMPL") ;;; Declare each of the free space pointers (except dynamic) as an alien var +;;; with darwin-jit, READ-ONLY-SPACE-START is a constant from genesis +;;; Maybe this whole file should go in sb-kernel to avoid sb-kernel:: +#-darwin-jit +(define-alien-variable ("READ_ONLY_SPACE_START" sb-vm:read-only-space-start) sb-kernel::os-vm-size-t) (define-alien-variable ("read_only_space_free_pointer" sb-vm:*read-only-space-free-pointer*) system-area-pointer) + +;;; STATIC-SPACE-START is a constant from genesis (define-alien-variable ("static_space_free_pointer" sb-vm:*static-space-free-pointer*) system-area-pointer) +(define-alien-variable ("DYNAMIC_SPACE_START" sb-vm:dynamic-space-start) sb-kernel::os-vm-size-t) +;;; Dynamic doesn't really have a "free pointer" but it's the upper bound on space usage. +(declaim (inline dynamic-space-free-pointer)) +(defun dynamic-space-free-pointer () + (sap+ (int-sap sb-vm:dynamic-space-start) + ;; not sure why next_free_page is 'sword_t' instead of 'uword_t' ! + (truly-the (signed-byte 64) + (* (extern-alien "next_free_page" signed) sb-vm:gencgc-page-bytes)))) + #+darwin-jit (define-alien-variable ("static_code_space_free_pointer" sb-vm:*static-code-space-free-pointer*) system-area-pointer) diff --git a/src/code/room.lisp b/src/code/room.lisp index 517984e4a9..329ae8ec77 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -128,7 +128,7 @@ (bounds text-space-start (sap-int *text-space-free-pointer*))) (:dynamic - (bounds (current-dynamic-space-start) + (bounds dynamic-space-start (sap-int (dynamic-space-free-pointer))))))) ;;; Return the total number of bytes used in SPACE. @@ -375,7 +375,7 @@ We could try a few things to mitigate this: ;; in a single-threaded system. (close-thread-alloc-region) (do ((initial-next-free-page next-free-page) - (base (int-sap (current-dynamic-space-start))) + (base (int-sap dynamic-space-start)) (start-page 0) (end-page 0) (end-page-bytes-used 0)) @@ -1287,7 +1287,7 @@ We could try a few things to mitigate this: ;;; to fail. (defun print-page-contents (page) (let* ((start - (+ (current-dynamic-space-start) (* gencgc-page-bytes page))) + (+ dynamic-space-start (* gencgc-page-bytes page))) (end (+ start gencgc-page-bytes))) (map-objects-in-range #'print-it (%make-lisp-obj start) (%make-lisp-obj end))))) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index f817f29f95..178ed3a5c5 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -584,7 +584,7 @@ structure representations") "*BINDING-STACK-START*" "*CONTROL-STACK-START*" "*CONTROL-STACK-END*" "CONTROL-STACK-POINTER-VALID-P" - "DYNAMIC-SPACE-START" "DYNAMIC-SPACE-END" + "DYNAMIC-SPACE-START" #+gencgc "MAX-DYNAMIC-SPACE-END" #+gencgc "PAGE-TABLE" #+gencgc "FIND-PAGE-INDEX" @@ -2040,7 +2040,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "CSUBTYPEP" "CTYPE" "TYPE-HASH-VALUE" "CTYPE-OF" "CTYPE-P" "CTYPEP" "CTYPE-ARRAY-DIMENSIONS" "CTYPE-ARRAY-SPECIALIZED-ELEMENT-TYPES" - "CURRENT-FP" "CURRENT-SP" "CURRENT-DYNAMIC-SPACE-START" + "CURRENT-FP" "CURRENT-SP" "DATA-NIL-VECTOR-REF" "DATA-VECTOR-REF" "DATA-VECTOR-REF-WITH-OFFSET" "DATA-VECTOR-SET" "DATA-VECTOR-SET-WITH-OFFSET" diff --git a/tests/lockfree-list.impure.lisp b/tests/lockfree-list.impure.lisp index 89cc00c2c4..77c5474fc5 100644 --- a/tests/lockfree-list.impure.lisp +++ b/tests/lockfree-list.impure.lisp @@ -219,7 +219,7 @@ (unless (zerop (sb-alien:slot (sb-alien:deref sb-vm::page-table page) 'sb-vm::start)) (warn "Can't properly scan: page start is a lower address")) (sb-sys:without-gcing - (let* ((where (sb-sys:sap+ (sb-sys:int-sap (current-dynamic-space-start)) + (let* ((where (sb-sys:sap+ (sb-sys:int-sap sb-vm:dynamic-space-start) (* page sb-vm:gencgc-page-bytes))) (limit (sb-sys:sap+ where sb-vm:gencgc-page-bytes)) (gens 0)) From ceb434314f3046adebeb672e144e550de19f5a69 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 15 Aug 2022 19:38:58 -0400 Subject: [PATCH 3850/4023] Add some truly-the --- src/code/defstruct.lisp | 11 +++++++---- src/compiler/info-vector.lisp | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 12626ef0be..7b54ba0c8e 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -50,13 +50,16 @@ (sb-xc:defmacro %new-instance (layout size) `(let* ((l ,layout) - (i (%make-instance ,size))) + (i (truly-the ,(if (constantp layout) (wrapper-classoid layout) 'instance) + (%make-instance ,size)))) (%set-instance-layout i l) i)) (sb-xc:defmacro %new-instance* (layout len) - `(let ((i (if (logtest (layout-flags ,layout) sb-vm::+strictly-boxed-flag+) - (%make-instance ,len) - (%make-instance/mixed ,len)))) + `(let ((i (truly-the + ,(if (constantp layout) (wrapper-classoid layout) 'instance) + (if (logtest (layout-flags ,layout) sb-vm::+strictly-boxed-flag+) + (%make-instance ,len) + (%make-instance/mixed ,len))))) (%set-instance-layout i ,layout) i)) diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index c6a9ed391a..3b195d4168 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -448,6 +448,7 @@ ;; a unit test of this logic against the complete logic. ;; (defun quick-packed-info-insert (input info-number value) + (declare (type info-number info-number)) ;; Because INPUT contains 1 descriptor and its corresponding values, ;; the current length is exactly NEW-N, the new number of fields. (let* ((descriptor (%info-ref input 0)) From 48923f0950f3c9022990bef21b4a97fe7095daba Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 16 Aug 2022 19:47:26 +0300 Subject: [PATCH 3851/4023] Test for condition pathname structure-object using structure-typep. So that it can be optimized later. --- src/compiler/arm64/type-vops.lisp | 80 ++++++++++++++++++------------ src/compiler/typetran.lisp | 14 +++--- src/compiler/x86-64/type-vops.lisp | 61 +++++++++++++++-------- 3 files changed, 94 insertions(+), 61 deletions(-) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index 7fe153d7e8..2a266901c2 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -596,37 +596,45 @@ (loadw r object instance-slots-offset instance-pointer-lowtag))) (defun structure-is-a (layout temp this-id test-layout &optional target not-p done) - (let* ((test-id (layout-id test-layout)) - (depthoid (wrapper-depthoid test-layout)) - (offset (+ (id-bits-offset) - (ash (- depthoid 2) 2) - (- instance-pointer-lowtag)))) - (when (and target - (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) - (inst ldrsw temp - (@ layout - (load-store-offset - (- (+ #+little-endian 4 - (ash (+ instance-slots-offset - (get-dsd-index layout sb-kernel::flags)) - word-shift)) - instance-pointer-lowtag)))) - (inst cmp temp (add-sub-immediate (fixnumize depthoid))) - (inst b :lt (if not-p target done))) - (inst ldr (32-bit-reg this-id) (@ layout offset)) - ;; 8-bit IDs are permanently assigned, so no fixup ever needed for those. - (cond ((typep test-id '(and (signed-byte 8) (not (eql 0)))) - (if (minusp test-id) - (inst cmn (32-bit-reg this-id) (- test-id)) - (inst cmp (32-bit-reg this-id) test-id))) - (t - (destructuring-bind (size . label) - ;; This uses the bogus definition of :dword, the one which - ;; emits 4 bytes. _technically_ dword should be 8 bytes. - (register-inline-constant :dword `(:layout-id ,test-layout)) - (declare (ignore size)) - (inst load-from-label (32-bit-reg temp) label)) - (inst cmp (32-bit-reg this-id) (32-bit-reg temp)))))) + (cond ((integerp test-layout) + (inst ldrsw temp + (@ layout + (- (ash (+ instance-slots-offset + (get-dsd-index layout sb-kernel::flags)) + word-shift) + instance-pointer-lowtag))) + (inst tst temp test-layout)) + (t + (let* ((test-id (layout-id test-layout)) + (depthoid (wrapper-depthoid test-layout)) + (offset (+ (id-bits-offset) + (ash (- depthoid 2) 2) + (- instance-pointer-lowtag)))) + (when (and target + (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) + (inst ldrsw temp + (@ layout + (- (+ #+little-endian 4 + (ash (+ instance-slots-offset + (get-dsd-index layout sb-kernel::flags)) + word-shift)) + instance-pointer-lowtag))) + (inst cmp temp (add-sub-immediate (fixnumize depthoid))) + (inst b :lt (if not-p target done))) + (inst ldr (32-bit-reg this-id) (@ layout offset)) + ;; 8-bit IDs are permanently assigned, so no fixup ever needed for those. + (cond ((typep test-id '(and (signed-byte 8) (not (eql 0)))) + (if (minusp test-id) + (inst cmn (32-bit-reg this-id) (- test-id)) + (inst cmp (32-bit-reg this-id) test-id))) + (t + (destructuring-bind (size . label) + ;; This uses the bogus definition of :dword, the one which + ;; emits 4 bytes. _technically_ dword should be 8 bytes. + (register-inline-constant :dword `(:layout-id ,test-layout)) + (declare (ignore size)) + (inst load-from-label (32-bit-reg temp) label)) + (inst cmp (32-bit-reg this-id) (32-bit-reg temp)))))))) ;;; This could be split into two vops to avoid wasting an allocation for 'temp' ;;; when the immediate form is used. @@ -658,7 +666,10 @@ (inst b :ne (if not-p target done))) (loadw layout object instance-slots-offset instance-pointer-lowtag) (structure-is-a layout temp this-id test-layout target not-p done) - (inst b (if not-p :ne :eq) target) + (inst b (if (if (integerp test-layout) + (not not-p) + not-p) + :ne :eq) target) done)) (define-vop (structure-typep*) @@ -670,5 +681,8 @@ (:temporary (:sc unsigned-reg) this-id temp) (:generator 4 (structure-is-a layout temp this-id test-layout target not-p done) - (inst b (if not-p :ne :eq) target) + (inst b (if (if (integerp test-layout) + (not not-p) + not-p) + :ne :eq) target) done)) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 2c0cc8ddd7..7e3964e9ad 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -897,12 +897,14 @@ ;; Easiest case first: single bit test. (cond ((member name '(condition pathname structure-object)) - `(and (%instancep object) - (logtest (,get-flags (%instance-layout object)) - ,(case name - (condition +condition-layout-flag+) - (pathname +pathname-layout-flag+) - (t +structure-layout-flag+))))) + (let ((flag (case name + (condition +condition-layout-flag+) + (pathname +pathname-layout-flag+) + (t +structure-layout-flag+)))) + (if (vop-existsp :translate structure-typep) + `(structure-typep object ,flag) + `(and (%instancep object) + (logtest (,get-flags (%instance-layout object)) ,flag))))) ;; TODO: remove after April 2021 release. ((eq name 'sb-kernel::random-class) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 600bf604db..5c75fb7aa7 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -942,26 +942,37 @@ (inst cmp :dword (read-depthoid) (fixnumize k)))) (defun structure-is-a (layout test-layout &optional target not-p done) - (let* ((depthoid (wrapper-depthoid test-layout)) - (offset (+ (id-bits-offset) - (ash (- depthoid 2) 2) - (- instance-pointer-lowtag)))) - (when (and target - (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) - (inst cmp :dword (read-depthoid) (fixnumize depthoid)) - (inst jmp :l (if not-p target done))) - (inst cmp :dword - (ea offset layout) - ;; Small layout-ids can only occur for layouts made in genesis. - ;; Therefore if the compile-time value of the ID is small, - ;; it is permanently assigned to that type. - ;; Otherwise, we allow for the possibility that the compile-time ID - ;; is not the same as the load-time ID. - ;; I don't think layout-id 0 can get here, but be sure to exclude it. - (if (or (typep (layout-id test-layout) '(and (signed-byte 8) (not (eql 0)))) - (not (sb-c::producing-fasl-file))) - (layout-id test-layout) - (make-fixup test-layout :layout-id)))))) + (if (integerp test-layout) + (inst test + (if (typep test-layout '(unsigned-byte 8)) + :byte + :dword) + (ea (- (ash (+ instance-slots-offset + (get-dsd-index layout sb-kernel::flags)) + word-shift) + instance-pointer-lowtag) + layout) + test-layout) + (let* ((depthoid (wrapper-depthoid test-layout)) + (offset (+ (id-bits-offset) + (ash (- depthoid 2) 2) + (- instance-pointer-lowtag)))) + (when (and target + (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) + (inst cmp :dword (read-depthoid) (fixnumize depthoid)) + (inst jmp :l (if not-p target done))) + (inst cmp :dword + (ea offset layout) + ;; Small layout-ids can only occur for layouts made in genesis. + ;; Therefore if the compile-time value of the ID is small, + ;; it is permanently assigned to that type. + ;; Otherwise, we allow for the possibility that the compile-time ID + ;; is not the same as the load-time ID. + ;; I don't think layout-id 0 can get here, but be sure to exclude it. + (if (or (typep (layout-id test-layout) '(and (signed-byte 8) (not (eql 0)))) + (not (sb-c::producing-fasl-file))) + (layout-id test-layout) + (make-fixup test-layout :layout-id))))))) (define-vop () (:translate sb-c::%structure-is-a) @@ -990,7 +1001,10 @@ #-compact-instance-header (loadw layout object instance-slots-offset instance-pointer-lowtag) (structure-is-a layout test-layout target not-p done) - (inst jmp (if not-p :ne :e) target) + (inst jmp (if (if (integerp test-layout) + (not not-p) + not-p) + :ne :e) target) done)) (define-vop (structure-typep*) @@ -1001,7 +1015,10 @@ (:info target not-p test-layout) (:generator 4 (structure-is-a layout test-layout target not-p done) - (inst jmp (if not-p :ne :e) target) + (inst jmp (if (if (integerp test-layout) + (not not-p) + not-p) + :ne :e) target) done)) (define-vop (load-instance-layout) From 78322bd085dc956e5b495d010b80ffc517aea889 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 17 Aug 2022 19:06:49 +0300 Subject: [PATCH 3852/4023] define-vop: :unused-if for temporaries. --- src/compiler/generic/utils.lisp | 14 ++--- src/compiler/meta-vmdef.lisp | 98 +++++++++++++++++++-------------- src/compiler/tn.lisp | 7 ++- 3 files changed, 68 insertions(+), 51 deletions(-) diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 1028b8546a..52ee16100d 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -274,16 +274,16 @@ (specifier-type '(eql nil))))) (defun instance-tn-ref-p (tn-ref) - (and (sc-is (tn-ref-tn tn-ref) descriptor-reg) - (csubtypep (tn-ref-type tn-ref) (specifier-type 'instance)))) + (csubtypep (tn-ref-type tn-ref) (specifier-type 'instance))) + (defun stack-consed-p (object) (let ((write (sb-c::tn-writes object))) ; list of write refs - (when (or (not write) ; grrrr, the only write is from a LOAD tn - ; and we don't know the corresponding normal TN? - (tn-ref-next write)) ; can't determine if > 1 write + (when (or (not write) ; grrrr, the only write is from a LOAD tn + ; and we don't know the corresponding normal TN? + (tn-ref-next write)) ; can't determine if > 1 write (return-from stack-consed-p nil)) (let ((vop (tn-ref-vop write))) - (when (not vop) ; wat? + (when (not vop) ; wat? (return-from stack-consed-p nil)) (when (eq (vop-name vop) 'allocate-vector-on-stack) (return-from stack-consed-p t)) @@ -297,7 +297,7 @@ (return-from stack-consed-p nil)) (let* ((splat-input (vop-args vop)) (splat-input-source - (tn-ref-vop (sb-c::tn-writes (tn-ref-tn splat-input))))) + (tn-ref-vop (sb-c::tn-writes (tn-ref-tn splat-input))))) ;; How in the heck can there NOT be a vop??? Well, sometimes there isn't. (when (and splat-input-source (eq (vop-name splat-input-source) diff --git a/src/compiler/meta-vmdef.lisp b/src/compiler/meta-vmdef.lisp index 5b0233cfd4..56d3b87eab 100644 --- a/src/compiler/meta-vmdef.lisp +++ b/src/compiler/meta-vmdef.lisp @@ -276,7 +276,8 @@ ;; this operand is allowed into. If NIL, there is no restriction. (scs nil :type (or symbol list) :read-only t) ;; If non-null, we are a temp wired to this offset in SC. - (offset nil :type (or unsigned-byte null) :read-only t)) + (offset nil :type (or unsigned-byte null) :read-only t) + (unused-if nil)) (declaim (freeze-type operand-parse)) (defun operand-parse-sc (parse) ; Enforce a single symbol @@ -789,46 +790,60 @@ ,@(saves)))))) (defun make-after-sc-function (parse) - (when (typep (vop-parse-conditional-p parse) '(cons (eql :after-sc-selection))) - (let* ((n-vop (vop-parse-vop-var parse)) - (n-args (vop-parse-args-var parse)) - (n-results (vop-parse-results-var parse)) - (n-info (gensym)) - (n-variant (gensym)) - (bindings - `((,n-args (vop-args ,n-vop)) - (,n-results (vop-results ,n-vop)) - ,@(access-operands (vop-parse-args parse) - (vop-parse-more-args parse) - n-args) - ,@(access-operands (vop-parse-results parse) - (vop-parse-more-results parse) - n-results) - ,@(when (vop-parse-info-args parse) - `((,n-info (vop-codegen-info ,n-vop)) - ,@(mapcar (lambda (x) `(,x (pop ,n-info))) - (vop-parse-info-args parse)))) - ,@(when (vop-parse-variant-vars parse) - `((,n-variant (vop-info-variant (vop-info ,n-vop))) - ,@(mapcar (lambda (x) `(,x (pop ,n-variant))) - (vop-parse-variant-vars parse)))) - ,@(loop for op in (vop-parse-operands parse) - when - (ecase (operand-parse-kind op) - ((:argument :result) - `(,(operand-parse-name op) - (tn-ref-tn ,(operand-parse-temp op)))) - (:temporary) - ((:more-argument :more-result))) - collect it))) - (body (cdr (vop-parse-conditional-p parse)))) - `(lambda (,n-vop) - (let* ,bindings - (declare (ignorable ,@(mapcar #'car bindings))) - (setf (car (last (vop-codegen-info ,n-vop))) - (progn ,@body)) - (setf (vop-codegen-info ,n-vop) - (butlast (vop-codegen-info ,n-vop)))))))) + (let ((unused-temps + (remove-if-not #'operand-parse-unused-if + (vop-parse-temps parse))) + (conditional (typep (vop-parse-conditional-p parse) '(cons (eql :after-sc-selection))))) + (when (or unused-temps + conditional) + (let* ((n-vop (vop-parse-vop-var parse)) + (n-args (vop-parse-args-var parse)) + (n-results (vop-parse-results-var parse)) + (n-info (gensym)) + (n-variant (gensym)) + (bindings + `((,n-args (vop-args ,n-vop)) + (,n-results (vop-results ,n-vop)) + ,@(access-operands (vop-parse-args parse) + (vop-parse-more-args parse) + n-args) + ,@(access-operands (vop-parse-results parse) + (vop-parse-more-results parse) + n-results) + ,@(and unused-temps + (access-operands (vop-parse-temps parse) nil + `(vop-temps ,n-vop))) + ,@(when (vop-parse-info-args parse) + `((,n-info (vop-codegen-info ,n-vop)) + ,@(mapcar (lambda (x) `(,x (pop ,n-info))) + (vop-parse-info-args parse)))) + ,@(when (vop-parse-variant-vars parse) + `((,n-variant (vop-info-variant (vop-info ,n-vop))) + ,@(mapcar (lambda (x) `(,x (pop ,n-variant))) + (vop-parse-variant-vars parse)))) + ,@(loop for op in (vop-parse-operands parse) + when + (ecase (operand-parse-kind op) + ((:argument :result) + `(,(operand-parse-name op) + (tn-ref-tn ,(operand-parse-temp op)))) + (:temporary + (and (operand-parse-unused-if op) + `(,(operand-parse-name op) + (tn-ref-tn ,(operand-parse-temp op))))) + ((:more-argument :more-result))) + collect it)))) + `(lambda (,n-vop) + (let* ,bindings + (declare (ignorable ,@(mapcar #'car bindings))) + ,@(when conditional + `((setf (car (last (vop-codegen-info ,n-vop))) + (progn ,@(cdr (vop-parse-conditional-p parse)))) + (setf (vop-codegen-info ,n-vop) + (butlast (vop-codegen-info ,n-vop))))) + ,@(loop for op in unused-temps + collect `(when ,(operand-parse-unused-if op) + (setf (tn-kind ,(operand-parse-name op)) :unused))))))))) (defvar *parse-vop-operand-count*) (defun make-operand-parse-temp () @@ -975,6 +990,7 @@ (unless (= (length scs) 1) (error "must specify exactly one SC for a temporary")) (setf value (first scs)))) + (:unused-if) (t (error "unknown temporary option: ~S" opt))) (setf (getf res key) value))) diff --git a/src/compiler/tn.lisp b/src/compiler/tn.lisp index 7fc9689c7b..3dbd8dc540 100644 --- a/src/compiler/tn.lisp +++ b/src/compiler/tn.lisp @@ -70,9 +70,10 @@ (t (delete-1 tn prev setter)))))) (used-p (tn) - (or (tn-reads tn) (tn-writes tn) - (member (tn-kind tn) '(:component :environment)) - (not (zerop (sbit aliases (tn-number tn)))))) + (and (neq (tn-kind tn) :unused) + (or (tn-reads tn) (tn-writes tn) + (member (tn-kind tn) '(:component :environment)) + (not (zerop (sbit aliases (tn-number tn))))))) (delete-1 (tn prev setter) (if prev (setf (tn-next prev) (tn-next tn)) From 953d4b7757d83da2320458f7f60e35a8eb5ea56d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 17 Aug 2022 19:37:26 +0300 Subject: [PATCH 3853/4023] Test for sealed classes using structure-typep too. --- src/compiler/arm64/type-vops.lisp | 42 +++++++++++-- src/compiler/typetran.lisp | 30 +++++----- src/compiler/x86-64/type-vops.lisp | 94 ++++++++++++++++++------------ 3 files changed, 112 insertions(+), 54 deletions(-) diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index 2a266901c2..74ea9d9944 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -595,7 +595,7 @@ (inst b :ne not-instance)) (loadw r object instance-slots-offset instance-pointer-lowtag))) -(defun structure-is-a (layout temp this-id test-layout &optional target not-p done) +(defun structure-is-a (layout temp this-id test-layout &optional desc-temp target not-p done) (cond ((integerp test-layout) (inst ldrsw temp (@ layout @@ -604,6 +604,11 @@ word-shift) instance-pointer-lowtag))) (inst tst temp test-layout)) + ((and desc-temp + (neq (tn-kind desc-temp) :unused)) + (inst load-constant desc-temp + (tn-byte-offset (emit-constant test-layout))) + (inst cmp layout desc-temp)) (t (let* ((test-id (layout-id test-layout)) (depthoid (wrapper-depthoid test-layout)) @@ -658,14 +663,28 @@ (:conditional) (:info target not-p test-layout) (:temporary (:sc descriptor-reg) layout) - (:temporary (:sc unsigned-reg) this-id temp) + (:temporary (:sc unsigned-reg + :unused-if + (and (instance-tn-ref-p args) + #1=(and (not (integerp test-layout)) + (let ((classoid (wrapper-classoid test-layout))) + (and (eq (classoid-state classoid) :sealed) + (not (classoid-subclasses classoid))))))) + temp) + (:temporary (:sc unsigned-reg + :unused-if (or (integerp test-layout) + #1#)) + this-id) + (:temporary (:sc descriptor-reg + :unused-if (not #1#)) + desc-temp) (:generator 4 (unless (instance-tn-ref-p args) (inst and temp object lowtag-mask) (inst cmp temp instance-pointer-lowtag) (inst b :ne (if not-p target done))) (loadw layout object instance-slots-offset instance-pointer-lowtag) - (structure-is-a layout temp this-id test-layout target not-p done) + (structure-is-a layout temp this-id test-layout desc-temp target not-p done) (inst b (if (if (integerp test-layout) (not not-p) not-p) @@ -678,9 +697,22 @@ (:policy :fast-safe) (:conditional) (:info target not-p test-layout) - (:temporary (:sc unsigned-reg) this-id temp) + (:temporary (:sc unsigned-reg + :unused-if + #1=(and (not (integerp test-layout)) + (let ((classoid (wrapper-classoid test-layout))) + (and (eq (classoid-state classoid) :sealed) + (not (classoid-subclasses classoid)))))) + temp) + (:temporary (:sc unsigned-reg + :unused-if (or (integerp test-layout) + #1#)) + this-id) + (:temporary (:sc descriptor-reg + :unused-if (not #1#)) + desc-temp) (:generator 4 - (structure-is-a layout temp this-id test-layout target not-p done) + (structure-is-a layout temp this-id test-layout desc-temp target not-p done) (inst b (if (if (integerp test-layout) (not not-p) not-p) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 7e3964e9ad..273df6921e 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -922,19 +922,23 @@ ((and wrapper (eq (classoid-state classoid) :sealed) (not (classoid-subclasses classoid))) - (if lowtag-test - `(and ,lowtag-test - ,(if (vop-existsp :translate layout-eq) - `(layout-eq object ,wrapper ,lowtag) - `(eq ,slot-reader ,layout))) - ;; `(eq ,layout - ;; (if-vop-existsp (:translate %instanceoid-layout) - ;; (%instanceoid-layout object) - ;; ;; Slightly quicker than LAYOUT-OF. See also %PCL-INSTANCE-P - ;; (cond ((%instancep object) (%instance-layout object)) - ;; ((funcallable-instance-p object) (%fun-layout object)) - ;; (t ,(find-layout 't))))) - (bug "Unexpected metatype for ~S" wrapper))) + (cond ((and (eq lowtag sb-vm:instance-pointer-lowtag) + (vop-existsp :translate structure-typep)) + `(structure-typep object ,wrapper)) + (lowtag-test + `(and ,lowtag-test + ,(if (vop-existsp :translate layout-eq) + `(layout-eq object ,wrapper ,lowtag) + `(eq ,slot-reader ,layout)))) + (t + ;; `(eq ,layout + ;; (if-vop-existsp (:translate %instanceoid-layout) + ;; (%instanceoid-layout object) + ;; ;; Slightly quicker than LAYOUT-OF. See also %PCL-INSTANCE-P + ;; (cond ((%instancep object) (%instance-layout object)) + ;; ((funcallable-instance-p object) (%fun-layout object)) + ;; (t ,(find-layout 't))))) + (bug "Unexpected metatype for ~S" wrapper)))) ;; All other structure types ((and (typep classoid 'structure-classoid) wrapper) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 5c75fb7aa7..8cba092c1e 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -942,37 +942,46 @@ (inst cmp :dword (read-depthoid) (fixnumize k)))) (defun structure-is-a (layout test-layout &optional target not-p done) - (if (integerp test-layout) - (inst test - (if (typep test-layout '(unsigned-byte 8)) - :byte - :dword) - (ea (- (ash (+ instance-slots-offset - (get-dsd-index layout sb-kernel::flags)) - word-shift) - instance-pointer-lowtag) - layout) - test-layout) - (let* ((depthoid (wrapper-depthoid test-layout)) - (offset (+ (id-bits-offset) - (ash (- depthoid 2) 2) - (- instance-pointer-lowtag)))) - (when (and target - (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) - (inst cmp :dword (read-depthoid) (fixnumize depthoid)) - (inst jmp :l (if not-p target done))) - (inst cmp :dword - (ea offset layout) - ;; Small layout-ids can only occur for layouts made in genesis. - ;; Therefore if the compile-time value of the ID is small, - ;; it is permanently assigned to that type. - ;; Otherwise, we allow for the possibility that the compile-time ID - ;; is not the same as the load-time ID. - ;; I don't think layout-id 0 can get here, but be sure to exclude it. - (if (or (typep (layout-id test-layout) '(and (signed-byte 8) (not (eql 0)))) - (not (sb-c::producing-fasl-file))) - (layout-id test-layout) - (make-fixup test-layout :layout-id))))))) + (cond ((integerp test-layout) + (inst test + (if (typep test-layout '(unsigned-byte 8)) + :byte + :dword) + (ea (- (ash (+ instance-slots-offset + (get-dsd-index layout sb-kernel::flags)) + word-shift) + instance-pointer-lowtag) + layout) + test-layout)) + ((let ((classoid (wrapper-classoid test-layout))) + (and (eq (classoid-state classoid) :sealed) + (not (classoid-subclasses classoid)))) + (emit-constant test-layout) + (inst cmp #+compact-instance-header :dword + layout (make-fixup test-layout :layout))) + + (t + (let* ((depthoid (wrapper-depthoid test-layout)) + (offset (+ (id-bits-offset) + (ash (- depthoid 2) 2) + (- instance-pointer-lowtag)))) + (when (and target + (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) + (inst cmp :dword (read-depthoid) (fixnumize depthoid)) + (inst jmp :l (if not-p target done))) + (inst cmp #+compact-instance-header :dword + (ea offset layout) + ;; Small layout-ids can only occur for layouts made in genesis. + ;; Therefore if the compile-time value of the ID is small, + ;; it is permanently assigned to that type. + ;; Otherwise, we allow for the possibility that the compile-time ID + ;; is not the same as the load-time ID. + ;; I don't think layout-id 0 can get here, but be sure to exclude it. + (cond ((or (typep (layout-id test-layout) '(and (signed-byte 8) (not (eql 0)))) + (not (sb-c::producing-fasl-file))) + (layout-id test-layout)) + (t + (make-fixup test-layout :layout-id))))))))) (define-vop () (:translate sb-c::%structure-is-a) @@ -996,11 +1005,24 @@ (:generator 4 (unless (instance-tn-ref-p args) (%test-lowtag object layout (if not-p target done) t instance-pointer-lowtag)) - #+compact-instance-header - (inst mov :dword layout (ea (- 4 instance-pointer-lowtag) object)) - #-compact-instance-header - (loadw layout object instance-slots-offset instance-pointer-lowtag) - (structure-is-a layout test-layout target not-p done) + + (cond ((and (not (integerp test-layout)) + (let ((classoid (wrapper-classoid test-layout))) + (and (eq (classoid-state classoid) :sealed) + (not (classoid-subclasses classoid))))) + (emit-constant test-layout) + #+compact-instance-header + (inst cmp :dword (ea (- 4 instance-pointer-lowtag) object) + (make-fixup test-layout :layout)) + #-compact-instance-header + (inst cmp (object-slot-ea layout instance-slots-offset instance-pointer-lowtag) + (make-fixup test-layout :layout))) + (t + #+compact-instance-header + (inst mov :dword layout (ea (- 4 instance-pointer-lowtag) object)) + #-compact-instance-header + (loadw layout object instance-slots-offset instance-pointer-lowtag) + (structure-is-a layout test-layout target not-p done))) (inst jmp (if (if (integerp test-layout) (not not-p) not-p) From a63e908e6b31a879bf49f914daa5090e09e22353 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 17 Aug 2022 13:33:14 -0400 Subject: [PATCH 3854/4023] Cajole COPY-STRUCTURE to inline itself more --- src/compiler/generic/vm-tran.lisp | 15 +++++++++++++++ src/pcl/cache.lisp | 10 ++++++++++ tests/x86-64-codegen.impure.lisp | 7 ++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/compiler/generic/vm-tran.lisp b/src/compiler/generic/vm-tran.lisp index cbf72aec50..e51de20e83 100644 --- a/src/compiler/generic/vm-tran.lisp +++ b/src/compiler/generic/vm-tran.lisp @@ -87,6 +87,18 @@ sb-vm:bignum-digits-offset index offset)) +;;; When copying a structure, try to make the best decision possible +;;; as to placement. This matters in a few circumstances: +;;; - when the "system" mixed TLAB is different from the "user" mixed TLAB. +;;; - when we distinguish boxed from mixed allocation to generation 0. +;;; GIVE-UP-IR1-TRANSFORM might put the allocation in the wrong TLAB, +;;; as the general fallback doesn't make the same distinctions. +;;; Unfortunately the DEFSTRUCT-defined copiers were not inlining even when +;;; explicitly requested, because COPY-SOMESTRUCT always transforms into +;;; COPY-STRUCTURE, so we've lost any declared inline-ness of COPY-SOMESTRUCT. +;;; Therefore we just try to infer it based on whether this transform is +;;; "acting as" COPY-SOMESTRUCT for a particular struct whose copier +;;; was requested to be inline. (deftransform copy-structure ((instance) * * :result result :node node) (let* ((classoid (lvar-type instance)) (name (and (structure-classoid-p classoid) (classoid-name classoid))) @@ -99,6 +111,7 @@ (eq (classoid-state classoid) :sealed) (not (classoid-subclasses classoid)))) (dd (and class-eq (wrapper-info layout))) + (dd-copier (and dd (sb-kernel::dd-copier-name dd))) (max-inlined-words 5)) (unless (and result ; could be unused result (but entire call wasn't flushed?) layout @@ -111,6 +124,8 @@ ;; Definitely do this if copying to stack ;; (Allocation has to be inlined, otherwise there's no way to DX it) (or (lvar-dynamic-extent result) + (and dd-copier + (eq (sb-int:info :function :inlinep dd-copier) 'inline)) ;; Or if it's a small fixed number of words ;; and speed at least as important as size. (and class-eq diff --git a/src/pcl/cache.lisp b/src/pcl/cache.lisp index f269580168..b05826b86e 100644 --- a/src/pcl/cache.lisp +++ b/src/pcl/cache.lisp @@ -64,6 +64,7 @@ ;;;; Subsequences of the cache vector are called cache lines. ;;;; +(declaim (inline %copy-cache)) (defstruct (cache (:constructor %make-cache) (:copier %copy-cache)) ;; Number of keys the cache uses. @@ -90,6 +91,15 @@ (depth 0 :type index) ;; Maximum allowed probe-depth before the cache needs to expand. (limit 0 :type index)) +;;; There is no syntax to freeze a type before the copier function +;;; is defined. That's sad, because it means that the global defun +;;; for %COPY-CACHE does *not* inline its allocator, for two different reasons: +;;; 1. the DEFSTRUCT-DESCRIPTION doesn't exist yet +;;; 2. the classoid isn't in sealed state when the DEFUN occurs +;;; (i.e. those are generally true of any defstruct form) +;;; However, all other uses of %COPY-CACHE aside from the global one +;;; _are_ inlined. So we're ok- we get the desired result, unless +;;; somebody funcalls #'%copy-cache, which nobody does. (declaim (freeze-type cache)) (defun compute-cache-mask (vector-length line-size) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 5f421582c5..449000a5e7 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1288,4 +1288,9 @@ (assert (loop for line in (disassembly-lines 'sb-impl:test-make-packed-info) thereis (search "SYS-ALLOC-TRAMP" line))) (assert (loop for line in (disassembly-lines 'sb-impl:test-copy-packed-info) - thereis (search "SYS-ALLOC-TRAMP" line))))) + thereis (search "SYS-ALLOC-TRAMP" line))) + (let ((f (compile nil '(lambda (x) + (declare (sb-c::tlab :system)) + (sb-pcl::%copy-cache x))))) + (assert (loop for line in (disassembly-lines f) + thereis (search "SYS-ALLOC-TRAMP" line)))))) From 21051c7fc0a8163fcd1ddc59f39b821e4713c6eb Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 17 Aug 2022 14:00:21 -0400 Subject: [PATCH 3855/4023] Move pcl-compile out of cold build * Change optional policy-governing arg to mandatory. * Force lexical environment to contain a declaration which (if enabled) avoids co-mingling user and system data. --- src/compiler/node.lisp | 5 +++-- src/pcl/call-next-method.lisp | 2 +- src/pcl/ctor.lisp | 5 +++-- src/pcl/dlisp.lisp | 2 +- src/pcl/fngen.lisp | 19 ++++++++++++++++++- src/pcl/init.lisp | 3 ++- src/pcl/low.lisp | 16 ---------------- 7 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index 258f4a28a0..9ca7680297 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -27,8 +27,9 @@ (default-structure-print lexenv stream depth)))) (:copier nil) (:constructor make-null-lexenv ()) - (:constructor make-almost-null-lexenv (%policy handled-conditions - flushable lambda parent)) + (:constructor make-almost-null-lexenv + (%policy handled-conditions flushable lambda parent + &optional user-data)) (:constructor make-package-lock-lexenv (disabled-package-locks %policy &aux (handled-conditions nil))) diff --git a/src/pcl/call-next-method.lisp b/src/pcl/call-next-method.lisp index 596d5b1f0a..466422964d 100644 --- a/src/pcl/call-next-method.lisp +++ b/src/pcl/call-next-method.lisp @@ -188,7 +188,7 @@ (optimize (speed 3) (debug 0) (safety 0))) ',result) nil)) - (function (pcl-compile lambda)) + (function (pcl-compile lambda :safe)) (specializers (append (method-specializers (first orig-methods)) (method-specializers (first cnm-methods)))) (method (make-instance 'standard-method diff --git a/src/pcl/ctor.lisp b/src/pcl/ctor.lisp index ab1169eee9..5c30f27616 100644 --- a/src/pcl/ctor.lisp +++ b/src/pcl/ctor.lisp @@ -592,7 +592,7 @@ (constructor-function-form ctor) (setf (%funcallable-instance-fun ctor) (apply (let ((*compiling-optimized-constructor* t)) - (pcl-compile `(lambda ,names ,form) t)) + (pcl-compile `(lambda ,names ,form) :unsafe)) locations) (ctor-state ctor) (if optimizedp 'optimized 'fallback)))))) @@ -616,7 +616,8 @@ (multiple-value-bind (form optimizedp) (allocator-function-form ctor) (setf (%funcallable-instance-fun ctor) - (let ((*compiling-optimized-constructor* t)) (pcl-compile form t)) + (let ((*compiling-optimized-constructor* t)) + (pcl-compile form :unsafe)) (ctor-state ctor) (if optimizedp 'optimized 'fallback)))))) (defun allocator-function-form (ctor) diff --git a/src/pcl/dlisp.lisp b/src/pcl/dlisp.lisp index ed2682f375..55d3b47611 100644 --- a/src/pcl/dlisp.lisp +++ b/src/pcl/dlisp.lisp @@ -187,7 +187,7 @@ ,form))))) (values (if *precompiling-lap* `#',lambda - (pcl-compile lambda)) + (pcl-compile lambda :safe)) nil))) ;;; note on implementation for CMU 17 and later (including SBCL): diff --git a/src/pcl/fngen.lisp b/src/pcl/fngen.lisp index e931f83651..a0a31901aa 100644 --- a/src/pcl/fngen.lisp +++ b/src/pcl/fngen.lisp @@ -22,6 +22,23 @@ ;;;; specification. (in-package "SB-PCL") + +(defun pcl-compile (expr safety) + (let* ((base-policy sb-c::*policy*) + (lexenv + (sb-c::make-almost-null-lexenv + (ecase safety + (:safe base-policy) + (:unsafe (sb-c::process-optimize-decl + '((space 1) (compilation-speed 1) + (speed 3) (safety 0) (sb-ext:inhibit-warnings 3) (debug 0)) + base-policy))) + ;; I suspect that INHIBIT-WARNINGS precludes them from happening + (list (cons (sb-kernel:find-classoid 'style-warning) 'muffle-warning) + (cons (sb-kernel:find-classoid 'compiler-note) 'muffle-warning)) + nil nil nil + '((:declare sb-c::tlab :system))))) + (sb-c:compile-in-lexenv expr lexenv nil nil nil nil nil))) ;;; GET-FUN is the main user interface to this code. It is like ;;; COMPILE, only more efficient. It achieves this efficiency by @@ -113,7 +130,7 @@ (let ((generator-lambda `(lambda ,gensyms (declare (optimize (sb-c:store-source-form 0))) (function ,code)))) - (let ((generator (pcl-compile generator-lambda))) + (let ((generator (pcl-compile generator-lambda :safe))) (ensure-fgen test gensyms generator generator-lambda nil) generator)))) diff --git a/src/pcl/init.lisp b/src/pcl/init.lisp index 4e3df55773..9c3eeaddb5 100644 --- a/src/pcl/init.lisp +++ b/src/pcl/init.lisp @@ -96,7 +96,8 @@ (declare (optimize (sb-c:store-coverage-data 0) (sb-c::type-check 3) (sb-c:verify-arg-count 0))) - (the* (,type :restart t) value))))) + (the* (,type :restart t) value)) + :safe))) (setf (gethash type **typecheck-cache**) fun (slot-info-typecheck info) fun)))))))) diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 0dac128833..9f5edd55d7 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -220,22 +220,6 @@ ;; (once in the test of PCL-INSTANCE-P and once in GET-SLOTS). (cond ((std-instance-p instance) (std-instance-slots instance)) ((fsc-instance-p instance) (fsc-instance-slots instance)))) - -(defun pcl-compile (expr &optional unsafe-policy) - (let* ((base-policy sb-c::*policy*) - (lexenv - (sb-c::make-almost-null-lexenv - (if unsafe-policy - (sb-c::process-optimize-decl - '((space 1) (compilation-speed 1) - (speed 3) (safety 0) (sb-ext:inhibit-warnings 3) (debug 0)) - base-policy) - base-policy) - ;; I suspect that INHIBIT-WARNINGS precludes them from happening - (list (cons (sb-kernel:find-classoid 'style-warning) 'muffle-warning) - (cons (sb-kernel:find-classoid 'compiler-note) 'muffle-warning)) - nil nil nil))) - (sb-c:compile-in-lexenv expr lexenv nil nil nil nil nil))) ;;; This is here, moved from src/pcl/boot so that it gets a 1-byte layout ID (defstruct (fast-method-call (:copier nil)) From 0571cabe08cd2db88b61ed2d7c9259227860f483 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 17 Aug 2022 15:51:52 -0400 Subject: [PATCH 3856/4023] Improve ldb_monitor 'threads' command Also fix omission from b8ff0a48 - wrong number of args to os_validate() --- src/code/bignum.lisp | 4 ++-- src/code/misc-aliens.lisp | 13 +++++++++++++ src/code/room.lisp | 2 +- src/cold/exports.lisp | 1 + src/runtime/monitor.c | 30 +++++++++++++++++++++++------- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/code/bignum.lisp b/src/code/bignum.lisp index f7c8da2dd9..545b1ef6fc 100644 --- a/src/code/bignum.lisp +++ b/src/code/bignum.lisp @@ -170,7 +170,7 @@ (alien-funcall (extern-alien "printf" (function void system-area-pointer unsigned unsigned)) (vector-sap #.(format nil "Element %d of bignum %p was never written~%")) i (get-lisp-obj-address bignum)) - (alien-funcall (extern-alien "ldb_monitor" (function void))) + (sb-vm:ldb-monitor) 0) (declaim (inline %bignum-ref)) @@ -202,7 +202,7 @@ (function void system-area-pointer unsigned unsigned)) (vector-sap #.(format nil "set-length %p,%d not properly zeroed~%")) (get-lisp-obj-address bignum) index) - (alien-funcall (extern-alien "ldb_monitor" (function void)))) + (sb-vm:ldb-monitor)) (setq word-ptr (sap+ word-ptr 8)))))) ) diff --git a/src/code/misc-aliens.lisp b/src/code/misc-aliens.lisp index e1e2fa065f..6b5f2eecba 100644 --- a/src/code/misc-aliens.lisp +++ b/src/code/misc-aliens.lisp @@ -69,3 +69,16 @@ #+win32 (defun strerror (&optional (errno (sb-win32:get-last-error))) (sb-win32:format-system-message errno)) + +;;; This gives you a way to call the low-level debugger in situations +;;; where something is broken, though the REPL works. One example is that +;;; when the cold core first starts up, you can't compile alien accessors, +;;; so an alien-funcall at the REPL would fail thusly: +;;; 0: ("undefined function" ...) ; EVAL-IN-NATIVE-ENVIRONMENT +;;; 1: (EVAL (LAMBDA (SB-ALIEN::SAP SB-ALIEN::OFFSET IGNORE) ...)) +;;; 2: (SB-ALIEN::COERCE-TO-INTERPRETED-FUNCTION (LAMBDA (...))) +;;; 3: (SB-ALIEN-INTERNALS:%ALIEN-VALUE #.(SB-SYS:INT-SAP #X50000BB0) ...) +;;; +;;; or more generally, the compiler could be messed up for whatever reason. +(defun sb-vm:ldb-monitor () + (alien-funcall (extern-alien "ldb_monitor" (function void)))) diff --git a/src/code/room.lisp b/src/code/room.lisp index 329ae8ec77..4ac9d3b6e0 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -219,7 +219,7 @@ ;; don't make things go more wrong than they already are. (alien-funcall (extern-alien "printf" (function void system-area-pointer)) (vector-sap #.(format nil "map-objects-in-range failure~%"))) - (alien-funcall (extern-alien "ldb_monitor" (function void)))) + (ldb-monitor)) #-sb-devel (aver (sap= start end))))) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 178ed3a5c5..d2c2fee519 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -458,6 +458,7 @@ structure representations") "IS-LISP-POINTER" #+gencgc "LARGE-OBJECT-SIZE" "LAYOUT" + "LDB-MONITOR" "LIST-ALLOCATED-OBJECTS" "LIST-POINTER-LOWTAG" ;; FIXME: Possibly these other parameters (see ;; compiler/{x86,sparc}/parms.lisp) should be defined diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 256f3d8639..463c938b5f 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -272,13 +272,29 @@ static int save_cmd(char **ptr) { return 0; } -static int threads_cmd(char __attribute__((unused)) **ptr) { +static int threads_cmd(char **ptr) { + int regions = 0; struct thread* th; - fprintf(stderr, "(thread*,pthread,sb-vm:thread)\n"); + if (more_p(ptr) && !strncmp(*ptr, "-r", 2)) regions = 1; + fprintf(stderr, "(thread*,pthread,sb-vm:thread,name)\n"); void* pthread; for_each_thread(th) { memcpy(&pthread, &th->os_thread, N_WORD_BYTES); - fprintf(stderr, "%p %p %p\n", th, pthread, (void*)th->lisp_thread); + struct thread_instance* i = (void*)(th->lisp_thread - INSTANCE_POINTER_LOWTAG); + char* name = NULL; + if (i->name != NIL && + widetag_of(native_pointer(i->name)) == SIMPLE_BASE_STRING_WIDETAG) + name = (char*)VECTOR(i->name)->data; + fprintf(stderr, "%p %p %p \"%s\"\n", th, pthread, (void*)i, name); + if (regions) { +#define show_tlab(label, r) fprintf(stderr, " %s @ %p: %p %p %p\n", label, \ + &th->r, th->r.start_addr, th->r.end_addr, th->r.free_pointer) + show_tlab("usr cons ", cons_tlab); + show_tlab("usr mix ", mixed_tlab); + show_tlab("sys cons ", sys_cons_tlab); + show_tlab("sys mix ", sys_mixed_tlab); +#undef show_tlab + } } return 0; } @@ -884,7 +900,7 @@ int load_gc_crashdump(char* pathname) if (preamble.readonly_nbytes) { // READ_ONLY_SPACE_START = preamble.readonly_start; os_validate(0, (char*)preamble.readonly_start, - ALIGN_UP(preamble.readonly_nbytes, 4096), 0, 0); + ALIGN_UP(preamble.readonly_nbytes, 4096), 0); checked_read("R/O", fd, (char*)preamble.readonly_start, preamble.readonly_nbytes); } read_only_space_free_pointer = (lispobj*)(READ_ONLY_SPACE_START + preamble.readonly_nbytes); @@ -892,7 +908,7 @@ int load_gc_crashdump(char* pathname) DYNAMIC_SPACE_START = preamble.dynspace_start; long dynspace_nbytes = preamble.dynspace_npages * GENCGC_PAGE_BYTES; char* dynspace = os_validate(0, (char*)preamble.dynspace_start, - DEFAULT_DYNAMIC_SPACE_SIZE, 0, 0); + DEFAULT_DYNAMIC_SPACE_SIZE, 0); if (dynspace != (char*)preamble.dynspace_start) lose("Didn't map dynamic space where expected: %p vs %p", dynspace, (char*)preamble.dynspace_start); @@ -913,8 +929,8 @@ int load_gc_crashdump(char* pathname) TEXT_SPACE_START = preamble.text_start; fixedobj_free_pointer = (lispobj*)preamble.fixedobj_free_pointer; text_space_highwatermark = (lispobj*)preamble.text_space_highwatermark; - os_validate(0, (char*)FIXEDOBJ_SPACE_START, FIXEDOBJ_SPACE_SIZE, 0, 0); - os_validate(0, (char*)TEXT_SPACE_START, TEXT_SPACE_SIZE, 0, 0); + os_validate(0, (char*)FIXEDOBJ_SPACE_START, FIXEDOBJ_SPACE_SIZE, 0); + os_validate(0, (char*)TEXT_SPACE_START, TEXT_SPACE_SIZE, 0); gc_init_immobile(); // allocate the page tables calc_immobile_space_bounds(); // Read fixedobj space From 453d81af5e1a90a8ee639fac2fd7cb6864f5c642 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 17 Aug 2022 16:16:12 -0400 Subject: [PATCH 3857/4023] Disable sb-capstone tests --- contrib/sb-capstone/tests.lisp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/sb-capstone/tests.lisp b/contrib/sb-capstone/tests.lisp index aebab57d66..5ded75dcee 100644 --- a/contrib/sb-capstone/tests.lisp +++ b/contrib/sb-capstone/tests.lisp @@ -58,6 +58,10 @@ (every #'(lambda (instruction) (search instruction instructions)) instructions-to-check)))))) +#| +;;; Someone needs to fix these. +;;; See https://groups.google.com/g/sbcl-help-archive/c/FxDjTHaPnik/m/mIFJTe9-AQAJ + (deftest x86-64 (capstone-check '(#x8F #x45 #x08 #x48 #x8B #xF0) '(:x86-64 :little-endian) '("MOV RSI, RAX" @@ -75,3 +79,4 @@ '(:ppc64 :big-endian) '("MFLR R0")) t) +|# From ea343e2c4cb4bd40f5b3ff4a0979fdb7de1002cd Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 17 Aug 2022 21:50:27 +0300 Subject: [PATCH 3858/4023] Fix -compact-instance-header --- src/compiler/x86-64/type-vops.lisp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 8cba092c1e..5a83cba6b2 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -957,8 +957,11 @@ (and (eq (classoid-state classoid) :sealed) (not (classoid-subclasses classoid)))) (emit-constant test-layout) - (inst cmp #+compact-instance-header :dword - layout (make-fixup test-layout :layout))) + #+compact-instance-header + (inst cmp :dword + layout (make-fixup test-layout :layout)) + #-compact-instance-header + (inst cmp (emit-constant test-layout) layout)) (t (let* ((depthoid (wrapper-depthoid test-layout)) @@ -969,7 +972,7 @@ (> depthoid sb-kernel::layout-id-vector-fixed-capacity)) (inst cmp :dword (read-depthoid) (fixnumize depthoid)) (inst jmp :l (if not-p target done))) - (inst cmp #+compact-instance-header :dword + (inst cmp :dword (ea offset layout) ;; Small layout-ids can only occur for layouts made in genesis. ;; Therefore if the compile-time value of the ID is small, @@ -1015,8 +1018,10 @@ (inst cmp :dword (ea (- 4 instance-pointer-lowtag) object) (make-fixup test-layout :layout)) #-compact-instance-header - (inst cmp (object-slot-ea layout instance-slots-offset instance-pointer-lowtag) - (make-fixup test-layout :layout))) + (progn + (inst mov layout (emit-constant test-layout)) + (inst cmp (object-slot-ea object instance-slots-offset instance-pointer-lowtag) + layout))) (t #+compact-instance-header (inst mov :dword layout (ea (- 4 instance-pointer-lowtag) object)) From 5fcef04a9df8c7a538228588d8ff2fc19e593417 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 17 Aug 2022 17:11:10 -0400 Subject: [PATCH 3859/4023] Fix clang-tidy finding --- src/runtime/os.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/os.h b/src/runtime/os.h index 45ad9eb659..d17aa8fb97 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -106,7 +106,7 @@ extern void os_zero(os_vm_address_t addr, os_vm_size_t length); #define IS_THREAD_STRUCT 4 #define MOVABLE_LOW (MOVABLE|ALLOCATE_LOW) #define IS_GUARD_PAGE 8 -extern os_vm_address_t os_validate(int movable, os_vm_address_t addr, +extern os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id); #ifdef LISP_FEATURE_WIN32 From b0cfc5500d9606bdb57cd0959f5006d021758f6f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 18 Aug 2022 00:24:57 +0300 Subject: [PATCH 3860/4023] Fix ir2-optimize-jumps. Don't delete BRANCH if it has more than one predecessor. Fixes lp#1986810 --- src/compiler/ir2opt.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index ba70f95f28..b93286611f 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -342,7 +342,9 @@ (initialize-ir2-blocks-flow-info component) (flet ((start-vop (block) (do ((block block (ir2-block-next block))) - ((null block) nil) + ((or + (null block) + (not (singleton-p (ir2block-predecessors block)))) nil) (let ((vop (ir2-block-start-vop block))) (when vop (if (eq (vop-name vop) 'sb-c:note-environment-start) From 5d13f39926e7e7b57f7526a6f0a333443f4e9dfc Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 19 Aug 2022 00:07:06 -0400 Subject: [PATCH 3861/4023] Fix GNU-stack note It used to work, but the linker seems to have gotten fussier --- tools-for-build/editcore.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index 6eb28bd1e1..fad19f942e 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1306,7 +1306,7 @@ `("lisp.rel" ,+sht-progbits+ 0 0 0 8 8) `(".relalisp.core" ,+sht-rela+ 0 2 1 8 ,reloc-entry-size))) ; symbol table -- ^ ^ -- for which section - (:note ".note.GNU-stack" ,+sht-null+ 0 0 0 1 0))) + (:note ".note.GNU-stack" ,+sht-progbits+ 0 0 0 1 0))) (string-table (string-table (append '("lisp_code_start") (map 'list #'second sections)))) (strings (cdr string-table)) @@ -1869,7 +1869,7 @@ (:sym ".symtab" ,+sht-symtab+ 0 1 1 8 ,sym-entry-size) ;; section with the strings -- ^ ^ -- 1+ highest local symbol (:core "lisp.core" ,+sht-progbits+ 0 0 0 ,core-align 0) - (:note ".note.GNU-stack" ,+sht-null+ 0 0 0 1 0))) + (:note ".note.GNU-stack" ,+sht-progbits+ 0 0 0 1 0))) (string-table (string-table (append (map 'list #'second sections) c-symbols))) (packed-strings (cdr string-table)) From f6e605a606a5e6047c1c6de442359c557318fe5d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 19 Aug 2022 00:50:43 -0400 Subject: [PATCH 3862/4023] Remove "augmented" symbols Now that :function :definition is not used by globaldb for fdefns of symbols, we can repurpose that to store the special-form handler for fast-eval instead of extending special operators by one slot. And there were no benchmarks showing that augmented symbols were useful to begin with, so this just as good, and with less complexity. --- contrib/sb-cltl2/compiler-let.lisp | 2 +- src/code/room.lisp | 9 +------ src/code/stubs.lisp | 1 - src/cold/exports.lisp | 2 -- src/compiler/generic/genesis.lisp | 9 +++---- src/compiler/generic/late-objdef.lisp | 8 +----- src/compiler/generic/objdef.lisp | 18 ++++++------- src/compiler/globaldb.lisp | 19 +++++++------- src/compiler/info-vector.lisp | 38 +++++++++++---------------- src/interpreter/eval.lisp | 28 +++++++++++++++----- src/interpreter/macros.lisp | 6 ++--- src/interpreter/special-forms.lisp | 2 +- src/runtime/coreparse.c | 7 +---- src/runtime/fullcgc.c | 6 +---- src/runtime/gc-common.c | 10 +------ src/runtime/immobile-space.c | 16 ++++------- src/runtime/verify.inc | 5 +--- 17 files changed, 75 insertions(+), 111 deletions(-) diff --git a/contrib/sb-cltl2/compiler-let.lisp b/contrib/sb-cltl2/compiler-let.lisp index 4d7f76f444..9241a2f6ba 100644 --- a/contrib/sb-cltl2/compiler-let.lisp +++ b/contrib/sb-cltl2/compiler-let.lisp @@ -51,7 +51,7 @@ #+sb-fasteval (sb-interpreter::defspecial compiler-let (bindings &body body) :deferred (env) - (funcall (info :function :interpreter 'let) + (funcall (car (sb-interpreter::special-form-handler 'let)) `(,bindings (declare (special ,@(mapcar (lambda (binding) diff --git a/src/code/room.lisp b/src/code/room.lisp index 4ac9d3b6e0..d3d16982a1 100644 --- a/src/code/room.lisp +++ b/src/code/room.lisp @@ -864,11 +864,6 @@ We could try a few things to mitigate this: #+stack-grows-downward-not-upward (iter + *control-stack-end* sap>) #-stack-grows-downward-not-upward (iter - *control-stack-start* sap<))) -(declaim (inline symbol-extra-slot-p)) -(defun symbol-extra-slot-p (x) - (> (logand (get-header-data x) tiny-boxed-size-mask) - (1- symbol-size))) - ;;; Invoke FUNCTOID (a macro or function) on OBJ and any values in MORE. ;;; Note that neither OBJ nor items in MORE undergo ONCE-ONLY treatment. ;;; The fact that FUNCTOID can be a macro allows treatment of its first argument @@ -969,9 +964,7 @@ We could try a few things to mitigate this: `(,functoid (%primitive sb-c:fast-symbol-global-value ,obj) ,@more) `(,functoid (symbol-%info ,obj) ,@more) `(,functoid (symbol-name ,obj) ,@more) - `(,functoid (symbol-package ,obj) ,@more) - `(when (symbol-extra-slot-p ,obj) - (,functoid (symbol-extra ,obj) ,@more))) + `(,functoid (symbol-package ,obj) ,@more)) ,.(make-case 'fdefn `(fdefn-name ,obj) `(fdefn-fun ,obj) diff --git a/src/code/stubs.lisp b/src/code/stubs.lisp index 4c6cbe11cc..9ccfcde36d 100644 --- a/src/code/stubs.lisp +++ b/src/code/stubs.lisp @@ -160,7 +160,6 @@ (def stack-ref (s n)) (def fun-code-header) (def symbol-hash) - (def sb-vm::symbol-extra) #+sb-thread (def symbol-tls-index) (def symbol-%info) ; primitive reader always needs a stub ;; but the "wrapped" reader might not need a stub. diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index d2c2fee519..bf7b9479b1 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -307,7 +307,6 @@ be submitted as a CDR") "PARSE-EVAL-WHEN-SITUATIONS" "MAKE-GLOBAL-VAR" "MAKE-LAMBDA-VAR" "*LEXENV*") - (:import-from "SB-VM" "SYMBOL-EXTRA-SLOT-P" "SYMBOL-EXTRA") (:import-from "SB-ALIEN" "%HEAP-ALIEN" "ALIEN-VALUE") (:import-from "SB-KERNEL" "%%TYPEP") (:export "BASIC-ENV" @@ -581,7 +580,6 @@ structure representations") "SYMBOL-HASH-SLOT" "SYMBOL-WIDETAG" "SYMBOL-NAME-SLOT" "SYMBOL-PACKAGE-ID-SLOT" "SYMBOL-INFO-SLOT" "SYMBOL-FDEFN-SLOT" "SYMBOL-SIZE" "SYMBOL-VALUE-SLOT" "SYMBOL-TLS-INDEX-SLOT" - "AUGMENTED-SYMBOL-SIZE" "*BINDING-STACK-START*" "*CONTROL-STACK-START*" "*CONTROL-STACK-END*" "CONTROL-STACK-POINTER-VALID-P" diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 348ee82a1f..81fd6336f1 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1155,6 +1155,9 @@ core and return a descriptor to it." (logior (ash package-id sb-impl::symbol-name-bits) (descriptor-bits name))) ;;; Allocate (and initialize) a symbol. +;;; Even though all symbols are the same size now, I still envision the possibility +;;; of reducing gensyms to 4 words, though I'm not sure what to do if information +;;; is later attached (function, value, plist) (defun allocate-symbol (size cold-package name &key (gspace (symbol-value *cold-symbol-gspace*))) (declare (simple-string name)) (let ((symbol (allocate-otherptr gspace size sb-vm:symbol-widetag))) @@ -1710,11 +1713,7 @@ core and return a descriptor to it." ;; and not an immediate processor. (let* ((pkg-info (when core-file-name (cold-find-package-info (sb-xc:package-name package)))) - (handle (allocate-symbol - (if (or (eq (info :function :kind symbol) :special-form) - (member symbol '(sb-sys:with-pinned-objects))) - sb-vm:augmented-symbol-size - sb-vm:symbol-size) + (handle (allocate-symbol sb-vm:symbol-size (cdr pkg-info) name :gspace gspace))) (when pkg-info (aver (not (zerop (descriptor-fixnum (read-slot (cdr pkg-info) :id)))))) diff --git a/src/compiler/generic/late-objdef.lisp b/src/compiler/generic/late-objdef.lisp index b9d6b61ef1..c1eff84fd0 100644 --- a/src/compiler/generic/late-objdef.lisp +++ b/src/compiler/generic/late-objdef.lisp @@ -14,13 +14,7 @@ #-c-headers-only (macrolet ((frob () `(progn ,@*!late-primitive-object-forms*))) - (frob) - (defknown symbol-extra (t) t (flushable)) - (def-reffer 'symbol-extra symbol-size other-pointer-lowtag) - (defknown (setf symbol-extra) (t t) t ()) - (def-setter '(setf symbol-extra) symbol-size other-pointer-lowtag)) - -(defconstant augmented-symbol-size (1+ symbol-size)) + (frob)) #+sb-thread (dovector (slot (primitive-object-slots (primitive-object 'thread))) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index c27c5190b3..65764374ff 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -372,6 +372,15 @@ during backtrace. :set-trans %set-symbol-global-value :set-known ()) + ;; This slot holds an FDEFN. It's almost unnecessary to have FDEFNs at all + ;; for symbols. If we ensured that any function bound to a symbol had a + ;; call convention rendering it callable in the manner of a SIMPLE-FUN, + ;; then we would only need to store that function's raw entry address here, + ;; thereby removing the FDEFN for any global symbol. Any closure assigned + ;; to a symbol would need a tiny trampoline, which is already the case + ;; for #+immobile-code. + (fdefn :ref-trans %symbol-fdefn :ref-known () + :cas-trans cas-symbol-fdefn) ;; The private accessor for INFO reads the slot verbatim. ;; In contrast, the SYMBOL-INFO function always returns a PACKED-INFO ;; instance (see info-vector.lisp) or NIL. The slot itself may hold a cons @@ -386,15 +395,6 @@ during backtrace. :type (or instance list) :init :null) (name :init :arg #-compact-symbol :ref-trans #-compact-symbol symbol-name) - ;; This slot holds an FDEFN. It's almost unnecessary to have FDEFNs at all - ;; for symbols. If we ensured that any function bound to a symbol had a - ;; call convention rendering it callable in the manner of a SIMPLE-FUN, - ;; then we would only need to store that function's raw entry address here, - ;; thereby removing the FDEFN for any global symbol. Any closure assigned - ;; to a symbol would need a tiny trampoline, which is already the case - ;; for #+immobile-code. - (fdefn :ref-trans %symbol-fdefn :ref-known () - :cas-trans cas-symbol-fdefn) #-compact-symbol (package-id :type index ; actually 16 bits. (Could go in the header) :ref-trans sb-impl::symbol-package-id diff --git a/src/compiler/globaldb.lisp b/src/compiler/globaldb.lisp index 8c43689220..46ce9351a3 100644 --- a/src/compiler/globaldb.lisp +++ b/src/compiler/globaldb.lisp @@ -107,9 +107,9 @@ '#'identity `(named-lambda "check-type" (x) (the ,type-spec x))) ,validate-function ,default - ;; Rationale for hardcoding here is explained at PACKED-INFO-FDEFN. - ,(or (and (eq category :function) (eq kind :definition) - +fdefn-info-num+) + ,(or (and (eq category :function) + (case kind + (:definition +fdefn-info-num+))) #+sb-xc (meta-info-number (meta-info category kind)))))) ;; It's an external symbol of SB-INT so wouldn't be removed automatically (push '("SB-INT" define-info-type) *!removable-symbols*) @@ -228,7 +228,13 @@ (!begin-collecting-cold-init-forms) ;;;; ":FUNCTION" subsection - Data pertaining to globally known functions. -(define-info-type (:function :definition) :type-spec #-sb-xc-host (or fdefn null) #+sb-xc-host t) +;;; As a special case, this info stores the interpreter's handler for sb-fasteval. +;;; There is no ambiguity, because a symbol naming a function will never store +;;; its fdefn in packed-info. Therefore if :function :definition is present +;;; for a symbol, it must be the special-form handler. In that case it is a cons +;;; of the deferred and immediate handlers (in that order) +(define-info-type (:function :definition) :type-spec #-sb-xc-host (or fdefn list) + #+sb-xc-host t) ;;; the kind of functional object being described. If null, NAME isn't ;;; a known functional object. @@ -247,11 +253,6 @@ :function nil))) -;;; The deferred mode processor for fasteval special operators. -;;; Immediate processors are hung directly off symbols in a dedicated slot. -#+sb-fasteval -(define-info-type (:function :interpreter) :type-spec (or function null)) - ;;; Indicates whether the function is deprecated. (define-info-type (:function :deprecated) :type-spec (or null deprecation-info)) diff --git a/src/compiler/info-vector.lisp b/src/compiler/info-vector.lisp index 3b195d4168..647f288d24 100644 --- a/src/compiler/info-vector.lisp +++ b/src/compiler/info-vector.lisp @@ -141,9 +141,12 @@ (setf (get symbol :sb-xc-globaldb-info) newval)) (values)))) -;; FDEFINITIONs have an info-number that admits slightly clever logic -;; for PACKED-INFO-FDEFN. Do not change this constant without -;; careful examination of that function. +;;; :DEFINITION has an info-number that admits slightly clever logic. +;;; * SB-INTERPRETER:SPECIAL-FORM-HANDLER only needs to decode the first +;;; info-number in a packed-info to test if :DEFINITION is present. +;;; * FIND-FDEFN only needs to extract one info-number after finding +;;; the proper auxiliary key {SETF, CAS, etc} in the data portion. +;;; Do not change this without careful examination of those functions. (defconstant +fdefn-info-num+ info-num-mask) ;; Extract a field from a packed info descriptor. @@ -418,9 +421,7 @@ aux-key new old-size))) ;; it had better be found - it was in the packed vector (aver data-start) - ;; fdefn must be the first piece of info for any name. - ;; This facilitates implementing SYMBOL-FUNCTION without - ;; without completely decoding the vector. + ;; :DEFINITION must be the first piece of info for any name. (insert-at (+ data-start (if (eql info-number +fdefn-info-num+) 1 (svref new data-start))) info-number value) @@ -454,27 +455,20 @@ (let* ((descriptor (%info-ref input 0)) (new-n (truly-the info-number (packed-info-len input))) (output (make-packed-info (1+ new-n)))) - ;; Two cases: we're either inserting info for the fdefn, or not. - (cond #+nil - ((eq info-number +fdefn-info-num+) - ;; FDEFNs are not stored in a packed-info except for non-symbol function names - ;; in which case we don't use quick-packed-info-insert. - (bug "incorrect call to quick-packed-info-insert")) - (t - ;; Add a field on the high end and increment the count. - (setf (%info-ref output 0) - (logior (make-info-descriptor - info-number (* info-number-bits new-n)) - (1+ descriptor)) - (%info-ref output 1) value) - ;; Slide the old data up 1 cell. - (loop for i from 2 to new-n - do (setf (%info-ref output i) (%info-ref input (1- i)))))) + ;; Add a field on the high end and increment the count. + (setf (%info-ref output 0) + (logior (make-info-descriptor info-number (* info-number-bits new-n)) + (1+ descriptor)) + (%info-ref output 1) value) + ;; Slide the old data up 1 cell. + (loop for i from 2 to new-n + do (setf (%info-ref output i) (%info-ref input (1- i)))) output)) (declaim (maybe-inline packed-info-insert)) (defun packed-info-insert (packed-info aux-key info-number newval) (if (and (eql aux-key +no-auxiliary-key+) + (not (eql info-number +fdefn-info-num+)) (info-quickly-insertable-p packed-info)) (quick-packed-info-insert packed-info info-number newval) (%packed-info-insert packed-info aux-key info-number newval))) diff --git a/src/interpreter/eval.lisp b/src/interpreter/eval.lisp index 45927304a2..587897351c 100644 --- a/src/interpreter/eval.lisp +++ b/src/interpreter/eval.lisp @@ -66,6 +66,22 @@ (defparameter *eval-level* -1) (defparameter *eval-verbose* nil) +(defun special-form-handler (fname) + ;; Returns a cons of the deferred processor and immediate processor. + ;; The CDR can be NIL if there is no immediate handler. + (binding* ((info (symbol-dbinfo fname) :exit-if-null) + ;; This is safe: PACKED-INFO invariant requires that it have length >= 1. + (word (the fixnum (%info-ref info 0)))) + ;; Test that the first info-number is +fdefn-info-num+ and its n-infos + ;; field is nonzero. These conditions can be tested simultaneously + ;; using a SIMD-in-a-register idea. The low 6 bits must be nonzero + ;; and the next 6 must be exactly #b111111, so considered together + ;; as a 12-bit unsigned integer it must be >= #b111111000001 + (when (>= (ldb (byte (* info-number-bits 2) 0) word) + (1+ (ash +fdefn-info-num+ info-number-bits))) + (%info-ref info (1- (truly-the (integer 1 *) + (sb-impl::packed-info-len info))))))) + (defun %eval (exp env) (labels ((%%eval (&aux fname) @@ -100,12 +116,10 @@ ((logtest (get-header-data fname) +special-op-symbol+) (cond ((or (logtest (get-header-data fname) +simple-special-op+) (eq sb-ext:*evaluator-mode* :interpret)) - (cond ((and (symbol-extra-slot-p fname) - (functionp (symbol-extra fname))) - (funcall (truly-the function (symbol-extra fname)) - (cdr exp) env)) - (t - (dispatch (%sexpr exp) env)))) + (let ((handler (cdr (special-form-handler fname)))) ; immediate handler + (if (functionp handler) + (funcall handler (cdr exp) env) + (dispatch (%sexpr exp) env)))) (t (compile-it)))) (t ; Everything else: macros and functions. @@ -168,7 +182,7 @@ (%program-error "Invalid function name: ~S" fname))) ;; CLHS 3.1.2.1.2.1 Special Forms. (when (logtest (get-header-data fname) +special-op-symbol+) - (let ((processor (info :function :interpreter fname))) + (let ((processor (car (special-form-handler fname)))) ; deferred handler (when (functionp processor) (return-from digest-form (let ((digested-form (funcall processor (cdr form) env))) diff --git a/src/interpreter/macros.lisp b/src/interpreter/macros.lisp index a794177484..b54a0ad95c 100644 --- a/src/interpreter/macros.lisp +++ b/src/interpreter/macros.lisp @@ -79,10 +79,8 @@ (with-subforms ,macro-lambda-list ,form-var ,@body))))))) `((lambda (name simple immediate deferred) - (setf (info :function :interpreter name) deferred) - (when immediate - (aver (symbol-extra-slot-p name)) - (setf (symbol-extra name) immediate)) + (aver (not (info :function :definition name))) + (setf (info :function :definition name) (cons deferred immediate)) (logior-header-bits name (logior +special-op-symbol+ (if simple +simple-special-op+ 0)))) diff --git a/src/interpreter/special-forms.lisp b/src/interpreter/special-forms.lisp index b48b47a5a9..0aeecc2748 100644 --- a/src/interpreter/special-forms.lisp +++ b/src/interpreter/special-forms.lisp @@ -803,7 +803,7 @@ ,@(when (eq operator 'let*) `((when (singleton-p bindings) (return-from let* - (funcall (info :function :interpreter 'let) + (funcall (car (special-form-handler 'let)) `(,bindings ,@body) env))))) ;; FIXME: aren't MAKE-LET*-FRAME and MAKE-LET-FRAME essentially ;; the same now? diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 762e7ccdc7..17ec80feda 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -421,13 +421,11 @@ static void relocate_space(uword_t start, lispobj* end, struct heap_adjust* adj) case SYMBOL_WIDETAG: { // Copied from scav_symbol() in gc-common struct symbol* s = (void*)where; - adjust_pointers(&s->value, 2, adj); + adjust_pointers(&s->value, 3, adj); // value, function, info lispobj name = decode_symbol_name(s->name); lispobj adjusted_name = adjust_word(adj, name); // writeback the name if it changed if (adjusted_name != name) FIXUP(set_symbol_name(s, adjusted_name), &s->name); - int indicated_nwords = (*where>>N_WIDETAG_BITS) & 0xFF; - adjust_pointers(&s->fdefn, indicated_nwords - 4, adj); } continue; #endif @@ -1229,9 +1227,6 @@ static void trace_sym(lispobj ptr, struct symbol* sym, struct hopscotch_table* s RECURSE(sym->value); RECURSE(sym->info); RECURSE(sym->fdefn); - int indicated_nwords = HeaderValue(sym->header) & 0xFF; - if (indicated_nwords + 1 > SYMBOL_SIZE) // has one more slot with no name - RECURSE(1[&sym->fdefn]); // ASSUMPTION: slot order } static void tally(lispobj ptr, struct visitor* v) diff --git a/src/runtime/fullcgc.c b/src/runtime/fullcgc.c index 24f05c68b6..b3b28baf1f 100644 --- a/src/runtime/fullcgc.c +++ b/src/runtime/fullcgc.c @@ -369,11 +369,7 @@ static void trace_object(lispobj* where) { struct symbol* s = (void*)where; gc_mark_obj(decode_symbol_name(s->name)); - gc_mark_obj(s->value); - gc_mark_obj(s->info); - gc_mark_obj(s->fdefn); - // process the unnamed slot of augmented symbols - if ((s->header & 0xFF00) == (SYMBOL_SIZE<<8)) gc_mark_obj(*(1+&s->fdefn)); + gc_mark_range(&s->value, 3); } return; #endif diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 0291c50234..fc1191ab01 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -826,20 +826,12 @@ static lispobj trans_tiny_mixed(lispobj object) { static sword_t scav_symbol(lispobj *where, lispobj header) { #ifdef LISP_FEATURE_COMPACT_SYMBOL struct symbol* s = (void*)where; - scavenge(&s->value, 2); // picks up the value and info slots + scavenge(&s->value, 3); // value, function, info lispobj name = decode_symbol_name(s->name); lispobj new = name; scavenge(&new, 1); if (new != name) set_symbol_name(s, new); - // The normal length indicated in the header would be (SYMBOL_SIZE-1) since - // SYMBOL_SIZE counts the header as 1 word. If the indicated size is SYMBOL_SIZE, - // then there's an extra slot. (The extra slot provides quick access to - // the special-operator handler function in the fast evaluator.) int indicated_nwords = (header>>N_WIDETAG_BITS) & 0xFF; - // We've already processed the {hash, value, info, name}, so subtract 4 words. - // In truth, the hash was ignored, though it might be a good place to store - // some pointer data. 64 bits of hash is way more than enough. - scavenge(&s->fdefn, indicated_nwords - 4); return 1 + (indicated_nwords|1); // round to odd, then add 1 for the header #else return scav_tiny_boxed(where, header); diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 425ef9071e..94896561eb 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1592,11 +1592,8 @@ static void fixup_space(lispobj* where, size_t n_words) break; case SYMBOL_WIDETAG: // - info, name, package can not point to an immobile object - // - symbol value, fdefn, and augmented symbol's extra slot can adjust_words(&((struct symbol*)where)->value, 1); adjust_words(&((struct symbol*)where)->fdefn, 1); - if (size > ALIGN_UP(SYMBOL_SIZE,2)) // augmented symbol - adjust_words(1 + &((struct symbol*)where)->fdefn, 1); break; // Special case because we might need to mark hashtables // as needing rehash. @@ -1661,24 +1658,21 @@ static lispobj* get_load_address(lispobj* old) } #if DEFRAGMENT_FIXEDOBJ_SUBSPACE -#define N_SYMBOL_KINDS 5 +#define N_SYMBOL_KINDS 4 -// Return an integer 0..4 telling which block of symbols to relocate 'sym' into. -// 0=uninterned, 1=keyword, 2=special operator with extra slot, -// 3=special var, 4=other +// Return an integer 0..3 telling which block of symbols to relocate 'sym' into. +// 0=uninterned, 1=keyword, 2=special var, 3=other static int classify_symbol(lispobj* obj) { struct symbol* symbol = (struct symbol*)obj; if (symbol_package_id(symbol) == PACKAGE_ID_NONE) return 0; if (symbol_package_id(symbol) == PACKAGE_ID_KEYWORD) return 1; - // Same criterion as SYMBOL-EXTRA-SLOT-P in src/code/room. - if ((HeaderValue(*obj) & 0xFF) > (SYMBOL_SIZE-1)) return 2; struct vector* symbol_name = VECTOR(decode_symbol_name(symbol->name)); if (vector_len(symbol_name) >= 2 && schar(symbol_name, 0) == '*' && schar(symbol_name, vector_len(symbol_name)-1) == '*') - return 3; - return 4; + return 2; + return 3; } static inline char* compute_defrag_start_address() diff --git a/src/runtime/verify.inc b/src/runtime/verify.inc index 5353ec58a9..b05232a4d2 100644 --- a/src/runtime/verify.inc +++ b/src/runtime/verify.inc @@ -257,13 +257,10 @@ static int verify_headered_object(lispobj* object, sword_t nwords, #ifdef LISP_FEATURE_COMPACT_SYMBOL if (widetag == SYMBOL_WIDETAG) { struct symbol* s = (void*)object; - CHECK(s->hash, &s->hash); CHECK(s->value, &s->value); + CHECK(s->fdefn, &s->fdefn); CHECK(s->info, &s->info); CHECK(decode_symbol_name(s->name), &s->name); - CHECK(s->fdefn, &s->fdefn); - // augmented symbol? - if (nwords > ALIGN_UP(SYMBOL_SIZE,2)) CHECK(1[&s->fdefn], 1+&s->fdefn); return 0; } #endif From f88863439853bfd56f3e32a2ab376880b99f10b4 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 19 Aug 2022 20:03:48 +0300 Subject: [PATCH 3863/4023] other-pointer-subtype-p vop-optimize: follow the true branch too. --- src/compiler/ir2opt.lisp | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index b93286611f..5fc7255105 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -601,7 +601,9 @@ (let ((next (next-vop branch))) (and (eq (vop-name next) 'branch) (next-start-vop (gethash (car (vop-codegen-info next)) *2block-info*))))) - (next-start-vop (gethash label *2block-info*))))) + (let ((dest (gethash label *2block-info*))) + (when dest + (next-start-vop dest)))))) ;;; Replace (BOUNDP X) + (BRANCH-IF) + {(SYMBOL-VALUE X) | anything} ;;; by (FAST-SYMBOL-VALUE X) + (UNBOUND-MARKER-P) + BRANCH-IF @@ -1144,21 +1146,30 @@ stop null (value (tn-ref-tn (vop-args vop)))) - (labels ((chain (vop) + (labels ((good-vop-p (vop) + (and (singleton-p (ir2block-predecessors (vop-block vop))) + (or (getf sb-vm::*other-pointer-type-vops* (vop-name vop)) + (eq (vop-name vop) '%other-pointer-subtype-p)) + (eq (tn-ref-tn (vop-args vop)) value))) + (chain (vop &optional (collect t)) (let ((next (branch-destination vop nil))) (cond ((and next (or (neq (vop-name vop) 'symbolp) (and (not null) (setf null (branch-destination vop))))) - (push vop vops) - (if (and (singleton-p (ir2block-predecessors (vop-block next))) - (or (getf sb-vm::*other-pointer-type-vops* (vop-name next)) - (eq (vop-name next) '%other-pointer-subtype-p)) - (eq (tn-ref-tn (vop-args next)) value)) - (chain next) - (setf stop (vop-block next)))) - (t - (setf stop (vop-block vop)))))) + (when collect + (push vop vops)) + (cond ((good-vop-p next) + (chain next)) + ((not stop) + (setf stop (vop-block next))))) + ((not stop) + (setf stop (vop-block vop))))) + (let ((true (branch-destination vop))) + (when (and true + (good-vop-p true)) + (push true vops) + (chain true nil)))) (ir2-block-label (block) (or (ir2-block-%label block) (setf (ir2-block-%label block) (gen-label))))) @@ -1166,6 +1177,8 @@ (when (> (length vops) 1) (let ((widetag (make-normal-tn (primitive-type-or-lose 'sb-vm::unsigned-byte-64))) (block (vop-block vop))) + (setf (tn-type value) + (tn-ref-type (vop-args vop))) (emit-and-insert-vop (vop-node vop) block (template-or-lose 'sb-vm::load-other-pointer-widetag) @@ -1178,6 +1191,7 @@ (update-block-succ block (cons stop (ir2block-successors block))) + (let ((test-vop (template-or-lose 'sb-vm::test-widetag))) (loop for vop in vops for info = (vop-codegen-info vop) @@ -1229,6 +1243,8 @@ (when (> (length vops) 1) (let ((layout (make-normal-tn *backend-t-primitive-type*)) (block (vop-block vop))) + (setf (tn-type value) + (tn-ref-type (vop-args vop))) (emit-and-insert-vop (vop-node vop) block (template-or-lose 'sb-vm::load-instance-layout) From c909791cd96901c6fad8e87be6ccad06efb3d52f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 19 Aug 2022 20:26:28 +0300 Subject: [PATCH 3864/4023] structure-typep vop-optimize: follow the true branch too. --- src/compiler/ir2opt.lisp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/compiler/ir2opt.lisp b/src/compiler/ir2opt.lisp index 5fc7255105..d508ceb0c0 100644 --- a/src/compiler/ir2opt.lisp +++ b/src/compiler/ir2opt.lisp @@ -1225,17 +1225,26 @@ (let (vops stop (value (tn-ref-tn (vop-args vop)))) - (labels ((chain (vop) + (labels ((good-vop-p (vop) + (and (singleton-p (ir2block-predecessors (vop-block vop))) + (eq (vop-name vop) 'structure-typep) + (eq (tn-ref-tn (vop-args vop)) value))) + (chain (vop &optional (collect t)) (let ((next (branch-destination vop nil))) (cond (next - (push vop vops) - (if (and (singleton-p (ir2block-predecessors (vop-block next))) - (eq (vop-name next) 'structure-typep) - (eq (tn-ref-tn (vop-args next)) value)) - (chain next) - (setf stop (vop-block next)))) - (t - (setf stop (vop-block vop)))))) + (when collect + (push vop vops)) + (cond ((good-vop-p next) + (chain next)) + ((not stop) + (setf stop (vop-block next))))) + ((not stop) + (setf stop (vop-block vop))))) + (let ((true (branch-destination vop))) + (when (and true + (good-vop-p true)) + (push true vops) + (chain true nil)))) (ir2-block-label (block) (or (ir2-block-%label block) (setf (ir2-block-%label block) (gen-label))))) From 91714ad4dd3e319ccf526c72cde69a7fa1305560 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 19 Aug 2022 15:11:37 -0400 Subject: [PATCH 3865/4023] Flip a let binding order Doesn't do anything different, but as the comment says, it should. --- src/pcl/ctor.lisp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/pcl/ctor.lisp b/src/pcl/ctor.lisp index 5c30f27616..84e99aca27 100644 --- a/src/pcl/ctor.lisp +++ b/src/pcl/ctor.lisp @@ -815,13 +815,18 @@ (defun wrap-in-allocate-forms (ctor body early-unbound-markers-p) (let* ((class (ctor-class ctor)) (wrapper (class-wrapper class))) + ;; Prefer to allocate slots first so that potentially we can make this construct + ;; the primitive instance and assign its layout and slots while pseudo-atomic. + ;; Even if we can't do that, this order of operations can avoid a GC store barrier + ;; - it doesn't currently, but it should - because the pointer store is young->old. + ;; Best-case we'd allocate two things in one allocation request, + ;; but there aren't allocation vops that do that. (etypecase class (standard-class - `(let ((.instance. (%new-instance ,wrapper (1+ sb-vm:instance-data-start))) - (.slots. (make-array - ,(wrapper-length wrapper) - ,@(when early-unbound-markers-p - '(:initial-element +slot-unbound+))))) + `(let ((.slots. (make-array ,(wrapper-length wrapper) + ,@(when early-unbound-markers-p + '(:initial-element +slot-unbound+)))) + (.instance. (%new-instance ,wrapper (1+ sb-vm:instance-data-start)))) (%instance-set .instance. sb-vm:instance-data-start .slots.) ,body .instance.)) From 85eb1103a6bae4f88f60bb5b839790d50d63ac68 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 20 Aug 2022 10:56:43 -0400 Subject: [PATCH 3866/4023] Fix ppc64 cold-init crash Reported by Bruce O'Neel --- src/compiler/generic/genesis.lisp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 81fd6336f1..e5a9e56609 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1804,6 +1804,13 @@ core and return a descriptor to it." (write-wordindexed des (+ 1 sb-vm:symbol-name-slot) name) #+ppc64 (progn + ;; We don't usually create an FDEFN for NIL, however on PP64 there is one + ;; made now. Due to unique lowtagging on that architectures, it doesn't magically + ;; work to access slots of NIL as a symbol the way the vops expect. + ;; There are hacks in the symbol slot reading vops, but not the writing vops, + ;; because nothing should write to slots of NIL. The sole exception would be that + ;; if someone tries to funcall NIL there can be an undefined tramp, + ;; so we make one here without adding complications to the lisp side. (write-wordindexed des (+ 1 sb-vm:symbol-fdefn-slot) (ensure-cold-fdefn nil)) (remhash nil *cold-fdefn-objects*)) #+compact-symbol @@ -2144,7 +2151,7 @@ core and return a descriptor to it." (read-bits-wordindexed fdefn 0))) (write-wordindexed fdefn sb-vm:fdefn-name-slot cold-name) (when core-file-name - (when (symbolp warm-name) + (when (typep warm-name '(and symbol (not null))) (write-wordindexed (cold-intern warm-name) sb-vm:symbol-fdefn-slot fdefn)) (if *cold-assembler-obj* (fdefn-makunbound fdefn) From 97575247d063fe476c309e46551c511525d9bc7a Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 22 Aug 2022 01:47:45 +0300 Subject: [PATCH 3867/4023] Slightly faster slow-hairy-data-vector-ref. Avoid a type check, it's already known that the argument is an array. Inline the second getter, with-array-data will do the required work. --- src/code/array.lisp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index 00d555d98d..3315dff227 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -756,7 +756,8 @@ of specialized arrays is supported." (safety 0))) (%ref ,accessor-getter ,extra-params)) (defun ,slow-accessor-name (array index ,@extra-params) - (declare (optimize speed (safety 0))) + (declare (optimize speed (safety 0)) + (array array)) (if (not (%array-displaced-p array)) ;; The reasonably quick path of non-displaced complex ;; arrays. @@ -764,14 +765,14 @@ of specialized arrays is supported." (%ref ,accessor-getter ,extra-params)) ;; The real slow path. (with-array-data - ((vector array) + ((array array) (index (locally (declare (optimize (speed 1) (safety 1))) (,@check-bounds index))) (end) :force-inline t) (declare (ignore end)) - (,accessor-name vector index ,@extra-params))))))) + (%ref ,accessor-getter ,extra-params))))))) (define hairy-data-vector-ref slow-hairy-data-vector-ref %find-data-vector-reffer nil (progn)) From 479b08cfa2c2e900c908c61b8127418011287fdc Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 22 Aug 2022 01:50:11 +0300 Subject: [PATCH 3868/4023] Don't pass arg-count in hairy-data-vector-ref. --- src/code/array.lisp | 5 +++-- src/compiler/fndb.lisp | 8 ++++---- src/compiler/ir1-translators.lisp | 6 ++++++ src/compiler/ir1tran.lisp | 5 ++++- src/compiler/ir2tran.lisp | 16 +++++++++------- src/compiler/node.lisp | 3 ++- 6 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index 3315dff227..d34bc7f55b 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -740,7 +740,7 @@ of specialized arrays is supported." (tagbody ,@forms)))))))) (macrolet ((%ref (accessor-getter extra-params) - `(funcall (,accessor-getter array) array index ,@extra-params)) + `(sb-c::%funcall-no-nargs (,accessor-getter array) array index ,@extra-params)) (define (accessor-name slow-accessor-name accessor-getter extra-params check-bounds) `(progn @@ -789,7 +789,8 @@ of specialized arrays is supported." (new-value) (check-bound array (%array-dimension array 0)))) (defun hairy-ref-error (array index &optional new-value) - (declare (ignore index new-value)) + (declare (ignore index new-value) + (optimize (sb-c:verify-arg-count 0))) (error 'type-error :datum array :expected-type 'vector)) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index a2eb28889d..e340a7262a 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -1921,10 +1921,10 @@ (defknown data-vector-set (array index t) (values) (dx-safe always-translatable)) (defknown data-vector-set-with-offset (array fixnum fixnum t) (values) (dx-safe always-translatable)) -(defknown hairy-data-vector-ref (array index) t (foldable)) -(defknown hairy-data-vector-set (array index t) t ()) -(defknown hairy-data-vector-ref/check-bounds (array index) t (foldable)) -(defknown hairy-data-vector-set/check-bounds (array index t) t ()) +(defknown hairy-data-vector-ref (array index) t (foldable no-verify-arg-count)) +(defknown hairy-data-vector-set (array index t) t (no-verify-arg-count)) +(defknown hairy-data-vector-ref/check-bounds (array index) t (foldable no-verify-arg-count)) +(defknown hairy-data-vector-set/check-bounds (array index t) t (no-verify-arg-count)) (defknown %caller-frame () t (flushable)) (defknown %caller-pc () system-area-pointer (flushable)) (defknown %with-array-data (array index (or index null)) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 426e6e47dc..2f20c382bd 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -742,6 +742,12 @@ be a lambda expression." (def-ir1-translator %funcall-lvar ((function &rest args) start next result) (ir1-convert-combination-args function start next result args)) +(def-ir1-translator %funcall-no-nargs ((function &rest args) start next result) + (let ((ctran (make-ctran)) + (fun-lvar (make-lvar))) + (ir1-convert start ctran fun-lvar `(the function ,function)) + (ir1-convert-combination-args fun-lvar ctran next result args nil))) + ;;; This source transform exists to reduce the amount of work for the ;;; compiler. If the called function is a FUNCTION form, then convert ;;; directly to %FUNCALL, instead of waiting around for type diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index 92548079ec..d015631e20 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -969,12 +969,15 @@ ;;; node. FUN-LVAR yields the function to call. ARGS is the list of ;;; arguments for the call, which defaults to the cdr of source. We ;;; return the COMBINATION node. -(defun ir1-convert-combination-args (fun-lvar start next result args) +(defun ir1-convert-combination-args (fun-lvar start next result args + &optional (pass-nargs t)) (declare (type ctran start next) (type lvar fun-lvar) (type (or lvar null) result) (type list args)) (let ((node (make-combination fun-lvar))) + (unless pass-nargs + (setf (combination-pass-nargs node) nil)) (setf (lvar-dest fun-lvar) node) (collect ((arg-lvars)) (let ((this-start start) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index ccba7b23a8..7145ed0f3c 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -1100,13 +1100,15 @@ (defun pass-nargs-p (combination) (let ((fun-info (combination-fun-info combination))) - (not (and (eq (combination-kind combination) :known) - fun-info - (ir1-attributep (fun-info-attributes fun-info) no-verify-arg-count) - (let ((type (info :function :type (combination-fun-source-name combination)))) - (and (not (fun-type-keyp type)) - (not (fun-type-rest type)) - (not (fun-type-optional type)))))))) + (and #+(or arm64 x86-64) + (combination-pass-nargs combination) + (not (and (eq (combination-kind combination) :known) + fun-info + (ir1-attributep (fun-info-attributes fun-info) no-verify-arg-count) + (let ((type (info :function :type (combination-fun-source-name combination)))) + (and (not (fun-type-keyp type)) + (not (fun-type-rest type)) + (not (fun-type-optional type))))))))) ;;; Move the arguments into the passing locations and do a (possibly ;;; named) tail call. diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index 9ca7680297..60c28e7089 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -1563,7 +1563,8 @@ ;;; an MV-COMBINATION isn't COMBINATION-P. (defstruct (combination (:include basic-combination) (:constructor make-combination (fun)) - (:copier nil))) + (:copier nil)) + (pass-nargs t :type boolean)) (defprinter (combination :identity t) (fun :prin1 (lvar-uses fun)) (args :prin1 (mapcar (lambda (x) From ba8c029d917d53a3a77743659740dc5a579a84a3 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 22 Aug 2022 01:54:07 +0300 Subject: [PATCH 3869/4023] Don't check for VECTOR before calling hairy-data-vector-ref. Because it dispatches on the widetag. Since hairy-data-vector-ref can actually work on any array it has to be hard-coded in cast-externally-checkable-p. The error message already says "not of type vector", which is not exactly right for arrays, but in safe code a multidimensional array will be checked when calculating the row major index. --- src/compiler/checkgen.lisp | 15 +++++++++++++-- tests/ccase.pure.lisp | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/compiler/checkgen.lisp b/src/compiler/checkgen.lisp index dab02e49c0..35cccd2aa3 100644 --- a/src/compiler/checkgen.lisp +++ b/src/compiler/checkgen.lisp @@ -337,8 +337,19 @@ ;; deemed unreachable? (and (almost-immediately-used-p lvar cast) - (values (values-subtypep (lvar-externally-checkable-type lvar) - (cast-type-to-check cast))))))) + (if (and (lvar-fun-is (combination-fun dest) + '(hairy-data-vector-set/check-bounds + hairy-data-vector-ref/check-bounds + hairy-data-vector-ref + hairy-data-vector-set)) + (eql (car (combination-args dest)) + lvar)) + ;; These functions work on all arrays, but the error + ;; message is about vectors, which is used more frequently. + (csubtypep (specifier-type 'vector) + (cast-type-to-check cast)) + (values-subtypep (lvar-externally-checkable-type lvar) + (cast-type-to-check cast))))))) ;; Type specifiers handled by the general-purpose MAKE-TYPE-CHECK-FORM are often ;; trivial enough to have an internal error number assigned to them that can be diff --git a/tests/ccase.pure.lisp b/tests/ccase.pure.lisp index 8bd96d5cf0..e8c5e8d573 100644 --- a/tests/ccase.pure.lisp +++ b/tests/ccase.pure.lisp @@ -11,7 +11,7 @@ ;; This is *not* a spec requirement because ;; "The subforms of keyplace might be evaluated again if none of the cases holds." ;; but it is an aspect of this particular implementation. - (ccase (aref foofafoof (let ((r (random x))) + (ccase (svref foofafoof (let ((r (random x))) (assert (not random-index)) (setq random-index r) r)) @@ -21,7 +21,7 @@ (with-output-to-string (stream) (sb-disassem:disassemble-code-component try-ccase :stream stream)) #\newline)) - (cond ((search "OBJECT-NOT-VECTOR" line) (incf ct-err-not-vector)) + (cond ((search "OBJECT-NOT-SIMPLE-VECTOR" line) (incf ct-err-not-vector)) ((search "UNBOUND-SYMBOL-ERROR" line) (incf ct-err-not-boundp)))) (assert (and (= ct-err-not-vector 1) (= ct-err-not-boundp 1))) From 94b517cc4c63448dbdc4202675ea4ace49e39c6f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 22 Aug 2022 01:57:47 +0300 Subject: [PATCH 3870/4023] arm64: encode more immediates for < >. When it's possible to encode (>= x (1+ immediate)) --- src/compiler/arm64/arith.lisp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index b40b1c25ea..302e0a105e 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -934,7 +934,7 @@ (:arg-types unsigned-num unsigned-num) (:note "inline (unsigned-byte 64) comparison")) -(defmacro define-conditional-vop (tran signed unsigned) +(defmacro define-conditional-vop (tran signed unsigned &optional addend addend-signed addend-unsigned) `(progn ,@(loop for (suffix cost signed-p) in '((/fixnum 4 t) @@ -954,14 +954,31 @@ (:arg-types (:or tagged-num signed-num unsigned-num) (:constant (or signed-word word))) (:info y) + (:vop-var vop) (:policy :fast-safe) ,(if (eq signed unsigned) `(:conditional ,signed) `(:conditional :after-sc-selection - (if (sc-is x unsigned-reg) - ,unsigned - ,signed))) + (flet ((try (y) + (let ((y (if (sc-is x any-reg) + (fixnumize y) + y))) + (flet ((try (constant) + (add-sub-immediate-p constant))) + (or (try y) + (try (ldb (byte 64 0) (- y)))))))) + (cond ((and (not (try y)) + (try (+ y ,addend))) + (setf (car (vop-codegen-info vop)) + (+ y ,addend)) + (if (sc-is x unsigned-reg) + ,addend-unsigned + ,addend-signed)) + (t + (if (sc-is x unsigned-reg) + ,unsigned + ,signed)))))) (:generator 2 (let ((y (if (sc-is x any-reg) (fixnumize y) @@ -976,8 +993,8 @@ (try (ldb (byte 64 0) (- y)) t) (inst cmp x (load-immediate-word tmp-tn y))))))))) -(define-conditional-vop < :lt :lo) -(define-conditional-vop > :gt :hi) +(define-conditional-vop < :lt :lo -1 :le :ls) +(define-conditional-vop > :gt :hi 1 :ge :hs) (define-conditional-vop eql :eq :eq) (define-vop (<-unsigned-signed) From 1cd807b106f06abb72d6e7db602291e940ee18ca Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 22 Aug 2022 02:42:42 +0300 Subject: [PATCH 3871/4023] Better type checks for (and array/vector (not simple-array)). Check for the complex widetags straight away instead of doing (and (arrayp x) (not (simple-array-p x))) --- src/compiler/typetran.lisp | 43 +++++++++++++++++++++----------- tests/x86-64-codegen.impure.lisp | 8 ++---- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 273df6921e..4f1bf08df4 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -787,7 +787,9 @@ (simple-array-header-p (and (null (array-type-complexp stype)) (listp dims) - (cdr dims)))) + (cdr dims))) + (complexp (and (eql (array-type-complexp stype) :maybe) + (eql (array-type-complexp type) t)))) (if complex-tag `(and (%other-pointer-p ,object) (eq (%other-pointer-widetag ,object) ,complex-tag) @@ -796,20 +798,31 @@ (multiple-value-bind (tests headerp) (test-array-dimensions object type stype simple-array-header-p) - `(and ,@(unless (or (and headerp (eql pred 'arrayp)) - simple-array-header-p) - ;; ARRAY-HEADER-P from TESTS will test for that - `((,pred ,object))) - ,@(when (and (eql (array-type-complexp stype) :maybe) - (eql (array-type-complexp type) t)) - ;; KLUDGE: this is a bit lame; if we get here, - ;; we already know that OBJECT is an array, but - ;; (NOT SIMPLE-ARRAY) doesn't know that. On the - ;; other hand, this should get compiled down to - ;; two widetag tests, so it's only a bit lame. - `((typep ,object '(not simple-array)))) - ,@tests - ,@(test-array-element-type object type stype headerp))))) + `(and + ,@(cond ((and (eql pred 'vectorp) + complexp) + `((%other-pointer-subtype-p ,object + ',(list sb-vm:complex-base-string-widetag + #+sb-unicode sb-vm:complex-character-string-widetag + sb-vm:complex-bit-vector-widetag + sb-vm:complex-vector-widetag)))) + ((and (eql pred 'arrayp) + complexp) + `((%other-pointer-subtype-p ,object + ',(list sb-vm:complex-base-string-widetag + #+sb-unicode sb-vm:complex-character-string-widetag + sb-vm:complex-bit-vector-widetag + sb-vm:complex-vector-widetag + sb-vm:complex-array-widetag)))) + (t + `(,@(unless (or (and headerp (eql pred 'arrayp)) + simple-array-header-p) + ;; ARRAY-HEADER-P from TESTS will test for that + `((,pred ,object))) + ,@(when complexp + `((typep ,object '(not simple-array))))))) + ,@tests + ,@(test-array-element-type object type stype headerp))))) `(%typep ,object ',(type-specifier type))))))) ;;; Transform a type test against some instance type. The type test is diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 449000a5e7..b5b80f4ba0 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -866,12 +866,8 @@ (check-arrayp-cmp-opcodes 1 'simple-base-string) #+sb-unicode (check-arrayp-cmp-opcodes 1 'sb-kernel::simple-character-string) - ;; FIXME: (AND STRING (NOT SIMPLE-STRING)) executs 4 tests - ;; but it denotes the same set of objects as (AND STRING (NOT SIMPLE-ARRAY)). - ;; The problem is with type algebra, not in the backend. - - ;; FIXME: this should be 1 comparison: widetag >= start-of-complex-widetags - (check-arrayp-cmp-opcodes 2 '(and array (not simple-array))) + (check-arrayp-cmp-opcodes 1 '(and string (not simple-array))) + (check-arrayp-cmp-opcodes 1 '(and array (not simple-array))) ;; some other interesting pairs ;; This was passing just by random coincidence. From f204c4566322ccbba9c2b61d775f0751c9401512 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 22 Aug 2022 03:08:00 +0300 Subject: [PATCH 3872/4023] Adjust a test for #-sb-unicode --- tests/x86-64-codegen.impure.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index b5b80f4ba0..f0b27c7fc6 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -867,7 +867,9 @@ #+sb-unicode (check-arrayp-cmp-opcodes 1 'sb-kernel::simple-character-string) (check-arrayp-cmp-opcodes 1 '(and string (not simple-array))) - (check-arrayp-cmp-opcodes 1 '(and array (not simple-array))) + (check-arrayp-cmp-opcodes #+sb-unicode 1 + #-sb-unicode 2 + '(and array (not simple-array))) ;; some other interesting pairs ;; This was passing just by random coincidence. From 61fb1c2fbaf1b2d8c65c6f418393de75fa76b7aa Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 22 Aug 2022 01:46:26 -0400 Subject: [PATCH 3873/4023] Use stronger type declaration So REPLACE gets inlined --- src/code/target-hash-table.lisp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/target-hash-table.lisp b/src/code/target-hash-table.lisp index 37019c614b..6c21f1742c 100644 --- a/src/code/target-hash-table.lisp +++ b/src/code/target-hash-table.lisp @@ -974,8 +974,7 @@ multiple threads accessing the same hash-table without locking." (hwm (kv-vector-high-water-mark old-kv-vector))) (declare (type simple-vector new-kv-vector) - (type (simple-array hash-table-index (*)) new-next-vector new-index-vector) - (type (or null (simple-array hash-table-index (*))) new-hash-vector)) + (type (simple-array hash-table-index (*)) new-next-vector new-index-vector)) ;; Rehash + resize only occurs when: ;; (1) every usable pair was at some point filled (so HWM = SIZE) @@ -990,7 +989,8 @@ multiple threads accessing the same hash-table without locking." ;; This is done early because when GC scans the new vector, it needs to see ;; each hash to know which keys were hashed address-sensitively. (awhen (hash-table-hash-vector table) - (replace new-hash-vector it :start1 1 :start2 1)) ; 1st element not used + (replace (the (simple-array hash-table-index (*)) new-hash-vector) + it :start1 1 :start2 1)) ; 1st element not used ;; Preserve only the 'hashing' bit on the OLD-KV-VECTOR so that ;; its high-water-mark can meaningfully be reduced to 0 when done. From 315b122803c211295b2da45940a2db6910cb06df Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 22 Aug 2022 02:05:18 -0400 Subject: [PATCH 3874/4023] Favor base-string as the prefix in GENSYM Otherwise take the 'else' path. --- src/code/symbol.lisp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index e9668b6ef9..87d800db5e 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -494,20 +494,17 @@ distinct from the global value. Can also be SETF." (flet ((%symbol-nameify (prefix counter) (declare (string prefix)) - (if (typep counter '(and fixnum unsigned-byte)) + (if (and (typep prefix 'simple-base-string) + (typep counter '(and fixnum unsigned-byte))) (let ((s "")) - (declare (simple-string s)) + (declare (simple-base-string s)) (labels ((recurse (depth n) (multiple-value-bind (q r) (truncate n 10) (if (plusp q) (recurse (1+ depth) q) - (let ((et (if (or (base-string-p prefix) - #+sb-unicode ; no #'base-char-p - (every #'base-char-p prefix)) - 'base-char 'character))) - (setq s (make-string (+ (length prefix) depth) - :element-type et)) - (replace s prefix))) + (replace (setq s (make-string (+ (length prefix) depth) + :element-type 'base-char)) + (truly-the simple-base-string prefix))) (setf (char s (- (length s) depth)) (code-char (+ (char-code #\0) r))) s))) From 0adc822b53e33991d42a97ca1bae6f2497af0ca7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 22 Aug 2022 03:26:54 -0400 Subject: [PATCH 3875/4023] Split sb-pcl::format-symbol into two variants The one which interns into SB-PCL for making argument names should probably not intern at all. Why does it think they warrant interning, especially if the name is literally SOMETHING-GENSYM-n? --- src/pcl/boot.lisp | 7 ++++--- src/pcl/combin.lisp | 5 ++--- src/pcl/ctor.lisp | 8 +++----- src/pcl/defs.lisp | 3 +-- src/pcl/dlisp.lisp | 8 +++----- src/pcl/low.lisp | 17 ++++++++++++----- src/pcl/methods.lisp | 4 ++-- src/pcl/precom2.lisp | 2 +- src/pcl/std-class.lisp | 6 +++--- tests/dynamic-extent.pure.lisp | 2 +- 10 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index a4fa60e4da..15cdc53f56 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -2250,9 +2250,10 @@ bootstrapping. *internal-pcl-generalized-fun-name-symbols*)) nil) (t (let* ((symbol (fun-name-block-name name)) - (package (symbol-package symbol))) - (and (or (eq package *pcl-package*) - (memq package (package-use-list *pcl-package*))) + (package (symbol-package symbol)) + (pcl-package #.(find-package "SB-PCL"))) + (and (or (eq package pcl-package) + (memq package (package-use-list pcl-package))) (not (eq package *cl-package*)) ;; FIXME: this test will eventually be ;; superseded by the *internal-pcl...* test, diff --git a/src/pcl/combin.lisp b/src/pcl/combin.lisp index 75080b9386..08f1940b88 100644 --- a/src/pcl/combin.lisp +++ b/src/pcl/combin.lisp @@ -256,9 +256,8 @@ (defun get-effective-method-gensym () (or (pop *rebound-effective-method-gensyms*) - (let ((new (format-symbol *pcl-package* - "EFFECTIVE-METHOD-GENSYM-~D" - (length *global-effective-method-gensyms*)))) + (let ((new (pcl-format-symbol "EFFECTIVE-METHOD-GENSYM-~D" + (length *global-effective-method-gensyms*)))) (setq *global-effective-method-gensyms* (append *global-effective-method-gensyms* (list new))) new))) diff --git a/src/pcl/ctor.lisp b/src/pcl/ctor.lisp index 84e99aca27..d7de5a4d1b 100644 --- a/src/pcl/ctor.lisp +++ b/src/pcl/ctor.lisp @@ -506,7 +506,7 @@ (flet (;; Return the name of parameter number I of a constructor ;; function. (parameter-name (i) - (format-symbol *pcl-package* ".P~D." i)) + (pcl-format-symbol ".P~D." i)) ;; Check if CLASS-ARG is a constant symbol. Give up if ;; not. (constant-class-p () @@ -979,10 +979,8 @@ (unless (initializedp location) (setf (aref slot-vector location) (list kind val type slotd)))) - (default-init-var-name (i) - (format-symbol *pcl-package* ".D~D." i)) - (location-var-name (i) - (format-symbol *pcl-package* ".L~D." i))) + (default-init-var-name (i) (pcl-format-symbol ".D~D." i)) + (location-var-name (i) (pcl-format-symbol ".L~D." i))) ;; Loop over supplied initargs and values and record which ;; instance and class slots they initialize. (loop for (key value) on initargs by #'cddr diff --git a/src/pcl/defs.lisp b/src/pcl/defs.lisp index e10d036ba0..e6f5680044 100644 --- a/src/pcl/defs.lisp +++ b/src/pcl/defs.lisp @@ -159,8 +159,7 @@ (convert-to-system-type type2)))))))) (defun make-class-symbol (class-name) - (format-symbol #.(find-package "SB-PCL") - "*THE-CLASS-~A*" (symbol-name class-name))) + (pcl-format-symbol "*THE-CLASS-~A*" (symbol-name class-name))) (defvar *standard-method-combination*) (defvar *or-method-combination*) diff --git a/src/pcl/dlisp.lisp b/src/pcl/dlisp.lisp index 55d3b47611..936b79cd71 100644 --- a/src/pcl/dlisp.lisp +++ b/src/pcl/dlisp.lisp @@ -34,14 +34,14 @@ (defun dfun-arg-symbol (arg-number) (or (nth arg-number *dfun-arg-symbols*) - (format-symbol *pcl-package* ".ARG~A." arg-number))) + (pcl-format-symbol ".ARG~A." arg-number))) (declaim (list *slot-vector-symbols*)) (define-load-time-global *slot-vector-symbols* '(.SLOTS0. .SLOTS1. .SLOTS2. .SLOTS3.)) (defun slot-vector-symbol (arg-number) (or (nth arg-number *slot-vector-symbols*) - (format-symbol *pcl-package* ".SLOTS~A." arg-number))) + (pcl-format-symbol ".SLOTS~A." arg-number))) (declaim (inline make-dfun-required-args)) (defun make-dfun-required-args (count) @@ -350,9 +350,7 @@ (wrapper-bindings (mapcan (lambda (arg mt) (unless (eq mt t) (incf index) - `((,(format-symbol *pcl-package* - "WRAPPER-~D" - index) + `((,(pcl-format-symbol "WRAPPER-~D" index) ,(emit-fetch-wrapper mt arg miss-tag (pop slot-vars)))))) args metatypes)) diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 9f5edd55d7..32322a1bc7 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -37,10 +37,6 @@ (in-package "SB-PCL") -;;; The PCL package is internal and is used by code in potential -;;; bottlenecks. And since it's internal, no one should be -;;; doing things like deleting and recreating it in a running target Lisp. -(define-symbol-macro *pcl-package* #.(find-package "SB-PCL")) (declaim (inline defstruct-classoid-p)) (defun defstruct-classoid-p (classoid) @@ -64,11 +60,22 @@ (defstruct-classoid-p classoid))))) ;;; Symbol contruction utilities -(defun format-symbol (package format-string &rest format-arguments) +(defun pkg-format-symbol (package format-string &rest format-arguments) (without-package-locks (intern (possibly-base-stringize (apply #'format nil format-string format-arguments)) package))) +;; Like the preceding, but always use PCL package, and override the package lock +;; in a more elegant way than using WITHOUT-PACKAGE-LOCKS. +(defun pcl-format-symbol (format-string &rest format-arguments) + (let ((string (possibly-base-stringize + (let ((*package* *keyword-package*)) + (apply #'format nil format-string format-arguments))))) + ;; Is there any way this can actually NOT be of type base-char? + (sb-impl::%intern string (length string) #.(find-package "SB-PCL") + (if (simple-base-string-p string) 'base-char 'character) + t ; ignore lock + nil))) ; no inheritance. Does it matter? (defun condition-type-p (type) (and (symbolp type) diff --git a/src/pcl/methods.lisp b/src/pcl/methods.lisp index de7c4bd1f4..cfcf6e8e64 100644 --- a/src/pcl/methods.lisp +++ b/src/pcl/methods.lisp @@ -375,13 +375,13 @@ (defun make-discriminating-function-arglist (number-required-arguments restp) (nconc (let ((args nil)) (dotimes (i number-required-arguments) - (push (format-symbol *package* ;; ! is this right? + (push (pkg-format-symbol *package* ;; ! is this right? "Discriminating Function Arg ~D" i) args)) (nreverse args)) (when restp - `(&rest ,(format-symbol *package* + `(&rest ,(pkg-format-symbol *package* "Discriminating Function &rest Arg"))))) (defmethod generic-function-argument-precedence-order diff --git a/src/pcl/precom2.lisp b/src/pcl/precom2.lisp index 69a6aa15c6..ab6a805b2f 100644 --- a/src/pcl/precom2.lisp +++ b/src/pcl/precom2.lisp @@ -32,7 +32,7 @@ (precompile-ctors)))) (precompile-random-code-segments pcl)) -(push '("SB-PCL" *pcl-package* *built-in-classes*) *!removable-symbols*) +(push '("SB-PCL" *built-in-classes*) *!removable-symbols*) (defun !system-class-p (x) (typep x 'sb-pcl::system-class)) diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index e0b0693fd9..2e252e39df 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -688,8 +688,8 @@ (error "Structure slots must have :INSTANCE allocation."))) (defun make-structure-class-defstruct-form (name direct-slots include) - (let* ((conc-name (format-symbol *package* "~S structure class " name)) - (constructor (format-symbol *package* "~Aconstructor" conc-name)) + (let* ((conc-name (pkg-format-symbol *package* "~S structure class " name)) + (constructor (pkg-format-symbol *package* "~Aconstructor" conc-name)) (included-name (class-name include)) (included-slots (when include @@ -804,7 +804,7 @@ (when defstruct-p (let* ((slot-name (getf pl :name)) (accessor - (format-symbol *package* + (pkg-format-symbol *package* "~S structure class ~A" name slot-name))) (setq pl (list* :defstruct-accessor-symbol diff --git a/tests/dynamic-extent.pure.lisp b/tests/dynamic-extent.pure.lisp index 09db5d822f..718a52b9d0 100644 --- a/tests/dynamic-extent.pure.lisp +++ b/tests/dynamic-extent.pure.lisp @@ -932,7 +932,7 @@ (assert (eql n (funcall fun nil)))) (macrolet ((def (n f1 f2 f3) - (let ((name (sb-pcl::format-symbol :cl-user "DX-FLET-TEST.~A" n))) + (let ((name (sb-int:package-symbolicate "DX-FLET-TEST." (write-to-string n)))) `(progn (defun-with-dx ,name (s) (flet ((f (x) From 5e4213f7e12ec25856b7c399e89833f49ca97d2e Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Mon, 22 Aug 2022 09:39:00 +0100 Subject: [PATCH 3876/4023] Initial draft of NEWS for sbcl-2.2.8 --- NEWS | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 63f5fb61aa..725bc5f455 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,25 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.2.6: +changes relative to sbcl-2.2.7: + * minor incompatible change: support for 32-bit x86/Darwin has been removed. + * bug fix: fix miscompilation related to loops preceded by conditional + expressions. (lp#1986810, reported by Artyom Bologov) + * bug fix: fix gc invariant violations. (lp#1983218, reported by Marius + Gerbershagen; lp#1983248, reported by Vasily Postnicov) + * bug fix: use CC to compile SBCL as a shared library. (lp#1976148, + reported by Pierre Neidhardt) + * bug fix: don't crash the system completely if RUN-PROGRAM fails to create + a pipe. (lp#1979841, reported by Thor Kristofferson) + * bug fix: be more disciplined about use of C system includes. (lp#1981799, + reported by Mark Evenson) + * bug fix: STRING/= returning wrong results for some cases when :END1/:END2 + were not compile-time constants. (lp#1983284) + * bug fix: compile-time checking of :START and :END keyword arguments to + FILL is more complete. * optimization: adjacent type tests on the same value are more compact (arm64, x86-64). + * optimization: the compiler can inline COPY-STRUCTURE in more cases. + * optimization: type checks for non-simple arrays are shorter. + * optimization: printing strings (as Lisp data) is faster. changes in sbcl-2.2.7 relative to sbcl-2.2.6: * minor incompatible change: the compiler emits full WARNINGs for undefined From 72b0ef98c5f1d5187e4ed2b7ad60c56ce3573b95 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 22 Aug 2022 15:20:13 +0300 Subject: [PATCH 3877/4023] Clarify a NEWS entry. --- NEWS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 725bc5f455..f856aad298 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,8 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- changes relative to sbcl-2.2.7: * minor incompatible change: support for 32-bit x86/Darwin has been removed. - * bug fix: fix miscompilation related to loops preceded by conditional - expressions. (lp#1986810, reported by Artyom Bologov) + * bug fix: fix miscompilation related to empty infinite loops preceded by + conditional expressions. (lp#1986810, reported by Artyom Bologov) * bug fix: fix gc invariant violations. (lp#1983218, reported by Marius Gerbershagen; lp#1983248, reported by Vasily Postnicov) * bug fix: use CC to compile SBCL as a shared library. (lp#1976148, From e3d98e3acdcd6e352cc0cacd4d1bbf0c12440650 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 23 Aug 2022 00:12:34 +0300 Subject: [PATCH 3878/4023] Use a single value type in cast-externally-checkable-p. Reported by _death. --- src/compiler/checkgen.lisp | 2 +- tests/compiler-2.pure.lisp | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/compiler/checkgen.lisp b/src/compiler/checkgen.lisp index 35cccd2aa3..efd9b1e1fb 100644 --- a/src/compiler/checkgen.lisp +++ b/src/compiler/checkgen.lisp @@ -347,7 +347,7 @@ ;; These functions work on all arrays, but the error ;; message is about vectors, which is used more frequently. (csubtypep (specifier-type 'vector) - (cast-type-to-check cast)) + (single-value-type (cast-type-to-check cast))) (values-subtypep (lvar-externally-checkable-type lvar) (cast-type-to-check cast))))))) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 4133cdd62a..2d40083383 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3723,3 +3723,10 @@ (list a a ,@vars))) args) (cons (car args) args))))) + +(with-test (:name :aref-single-value-type) + (checked-compile-and-assert + () + `(lambda (x) + (aref (the (values (and (not simple-array) vector)) x) 0)) + (((make-array 10 :adjustable t :initial-element 3)) 3))) From 00a4f4f4879e8c7a4789464d18b3b447d073d8c7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 23 Aug 2022 10:13:27 -0400 Subject: [PATCH 3879/4023] Remove unused definitions Tree shaker removes them, but no point in seeing them. --- src/pcl/methods.lisp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/pcl/methods.lisp b/src/pcl/methods.lisp index cfcf6e8e64..4705080f23 100644 --- a/src/pcl/methods.lisp +++ b/src/pcl/methods.lisp @@ -371,18 +371,6 @@ (or restp (and number-of-requireds (/= number-of-requireds requireds))) specialized-argument-positions))) - -(defun make-discriminating-function-arglist (number-required-arguments restp) - (nconc (let ((args nil)) - (dotimes (i number-required-arguments) - (push (pkg-format-symbol *package* ;; ! is this right? - "Discriminating Function Arg ~D" - i) - args)) - (nreverse args)) - (when restp - `(&rest ,(pkg-format-symbol *package* - "Discriminating Function &rest Arg"))))) (defmethod generic-function-argument-precedence-order ((gf standard-generic-function)) @@ -1119,9 +1107,6 @@ (defmacro class-eq-test (arg class) `(eq (class-of ,arg) ',class)) -(defmacro eql-test (arg object) - `(eql ,arg ',object)) - (defun dnet-methods-p (form) (and (consp form) (or (eq (car form) 'methods) From 9c97be7f48d843da0a465ae12d700e72d0bd184e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 24 Aug 2022 13:36:49 -0400 Subject: [PATCH 3880/4023] Speedup float-math verification Because it was consing ~400MiB and taking nearly a second, I was inclined to perform it only if #+sb-devel. Then I realized the problem: EVAL is not operational yet, therefore "#." was effectively equivalent to COMPILE. So reading compiled nearly 8000 forms before even starting to work on any files. Instead intercept "#." to do something ad hoc and fast. It conses almost nothing now, except the floating-point values. --- src/cold/warm.lisp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 01941a4b07..79b59cb934 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -84,7 +84,17 @@ sb-kernel::(rplaca (last *handler-clusters*) (car **initial-handler-clusters**)) ;; in case there is more than one set of floating-point formats. (assert (eq (read stream) :default)) (sb-kernel::with-float-traps-masked (:overflow :divide-by-zero) - (let ((*package* (find-package "SB-KERNEL"))) + (let ((*readtable* (copy-readtable)) + (*package* (find-package "SB-KERNEL"))) + (set-dispatch-macro-character + #\# #\. (lambda (stream subchar arg) + (declare (igore subchar arg)) + (let ((expr (read stream t nil t))) + (ecase (car expr) + (sb-kernel:make-single-float + (sb-kernel:make-single-float (second expr))) + (sb-kernel:make-double-float + (sb-kernel:make-double-float (second expr) (third expr))))))) (dolist (expr (read stream)) (destructuring-bind (fun args . result) expr (let ((result (if (eq (first result) 'sb-kernel::&values) From cbba9953e40d6296b24e52bc79d9bf919c4da6dd Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 24 Aug 2022 13:39:18 -0400 Subject: [PATCH 3881/4023] Remove mention of SB-RBTREE from warm build The code still exists in redblack.lisp in case it's ever wanted again. --- src/cold/warm.lisp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 79b59cb934..839b446ed2 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -61,11 +61,7 @@ sb-kernel::(rplaca (last *handler-clusters*) (car **initial-handler-clusters**)) (do-all-symbols (s) (let ((dd (sb-kernel:find-defstruct-description s nil))) (when (and dd (not (sb-kernel::dd-null-lexenv-p dd))) - (let ((pkg (symbol-package (sb-kernel:dd-name dd)))) - (unless (member (package-name pkg) - '("SB-RBTREE.WORD" "SB-RBTREE.MAP") - :test 'string=) - (push (sb-kernel:dd-name dd) result)))))) + (push (sb-kernel:dd-name dd) result)))) (assert (equal result '(sb-c::conset)))) ;;; Assert that genesis preserved shadowing symbols. From 2c1a4fd3e90363ee77002d7ebebe6de6bc651e0e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 24 Aug 2022 20:49:37 +0300 Subject: [PATCH 3882/4023] Add a test for a full call to AREF not doing type checks. --- tests/compiler-ir.pure.lisp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/compiler-ir.pure.lisp b/tests/compiler-ir.pure.lisp index dd4c307fd6..ccfdad9c05 100644 --- a/tests/compiler-ir.pure.lisp +++ b/tests/compiler-ir.pure.lisp @@ -353,3 +353,10 @@ (stream 2) (hash-table 1)))) :key (lambda (x) (combination-fun-source-name x nil)))))) + +(with-test (:name :aref-full-call-no-type-check) + (assert (not (find 'sb-c::%type-check-error/c + (ir-calls + `(lambda (x) + (aref x 0))) + :key (lambda (x) (combination-fun-source-name x nil)))))) From bc2ec2b4c5df0a31b29318b9b3715d722435d510 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 25 Aug 2022 21:14:00 +0300 Subject: [PATCH 3883/4023] github actions: increase dynamic space size. --- .github/workflows/cl-host.yml | 2 +- .github/workflows/linux.yml | 2 +- .github/workflows/mac.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cl-host.yml b/.github/workflows/cl-host.yml index 327feb4445..95ff3ec94c 100644 --- a/.github/workflows/cl-host.yml +++ b/.github/workflows/cl-host.yml @@ -137,7 +137,7 @@ jobs: SBCL_MAKE_TARGET_2_OPTIONS: --disable-ldb --disable-debugger run: | git restore-mtime - ./make.sh --xc-host='sbcl --dynamic-space-size 500MB --lose-on-corruption --disable-ldb --disable-debugger' + ./make.sh --xc-host='sbcl --dynamic-space-size 600MB --lose-on-corruption --disable-ldb --disable-debugger' - name: archive sbcl-xc fasls run: tar --transform 's,^,sbcl-host/,' -cf sbcl-host-fasls.tgz obj/from-xc/ - name: upload sbcl-xc archive diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index e63aa43d58..ad3f9d3cb8 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -35,7 +35,7 @@ jobs: - name: build env: SBCL_MAKE_TARGET_2_OPTIONS: --disable-ldb --disable-debugger - run: ./make.sh ${{ matrix.options }} --xc-host='sbcl --dynamic-space-size 500MB --lose-on-corruption --disable-ldb --disable-debugger' --arch=${{ matrix.arch }} + run: ./make.sh ${{ matrix.options }} --xc-host='sbcl --dynamic-space-size 600MB --lose-on-corruption --disable-ldb --disable-debugger' --arch=${{ matrix.arch }} - name: test run: cd tests; ./run-tests.sh - name: test diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index 05983cf340..3c0cb56a45 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -18,7 +18,7 @@ jobs: - name: build env: SBCL_MAKE_TARGET_2_OPTIONS: --disable-ldb --disable-debugger - run: ./make.sh ${{ matrix.options }} --xc-host='sbcl --dynamic-space-size 500MB --lose-on-corruption --disable-ldb --disable-debugger' + run: ./make.sh ${{ matrix.options }} --xc-host='sbcl --dynamic-space-size 600MB --lose-on-corruption --disable-ldb --disable-debugger' - name: make binary run: | name=sbcl-`cat version.lisp-expr | ./run-sbcl.sh --noinform --noprint --eval '(write-line (read))'`-darwin-x86-64 From 345f14501b980902a6c39d0c7628fb47700cc0b9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 27 Aug 2022 09:00:33 -0400 Subject: [PATCH 3884/4023] Improve some wording --- src/runtime/immobile-space.c | 4 +--- src/runtime/save.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index 94896561eb..a0c63960b0 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -1827,9 +1827,7 @@ static void defrag_immobile_space(boolean verbose) #endif // Calculate space needed for fixedobj pages after defrag. - // page order is: layouts, symbols, fdefns, trampolines, GFs - // If the text segment is writable, then the last 3 of those are - // moved into text space. + // page order is: layouts, symbols, fdefns. int n_layout_pages = 0; int class_index; for (class_index = 0; class_index < MAX_LAYOUT_DEFRAG_SIZE_CLASSES; ++class_index) { diff --git a/src/runtime/save.c b/src/runtime/save.c index 3369f90f50..8f716ea571 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -182,7 +182,7 @@ output_space(FILE *file, int id, lispobj *addr, lispobj *end, { size_t words, bytes, data, compressed_flag; static char *names[] = {NULL, "dynamic", "static", "read-only", - "immobile", "immobile"}; + "fixedobj", "text"}; compressed_flag = ((core_compression_level != COMPRESSION_LEVEL_NONE) From e0d0a4579ca2d5d2afc33a1b35e13ff501c66117 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 27 Aug 2022 10:38:51 -0400 Subject: [PATCH 3885/4023] Remove inapplicable documentation It was explicitly added in 60f84eda5c, which caused me some skepticism as I saw no merit to keeping deceptive information in-tree. i.e. some of the internals are not right for SBCL (and possibly not CMUCL any more) such as: - SBCL executables don't produce three ELF files, there is no linker.sh etc. - object.tex is more wrong than right. The widetags are completely wrong; as are nearly all the descriptions of various headered object types. (functions don't contain a pointer to "next function", and they don't embed their FTYPE in the raw data portion, etc etc) - fasl.tex is sufficiently wrong as to be of little utility - the entire point of our LEB128-encoding is to remove bifurcation of all fops as it alludes to. Not to mention there's no fop-uniform-vector, fop-code-format, fop-pop-for-effect, and others. - foreign-linkage-symbols and linkage-table-data aren't the same at all. - our INFO database uses <category,kind> for the taxonomy, but CMUCL named them <class,type> and said that they are compared via STRING=. Neither is more obviously right, so this is just ridiculously confusing. - The interpreter documentation is flat-out 100% wrong as pertains to SBCL. All files files removed in this change are obsolete relative to SBCL, but to revise them in-place would be worse - anyone would wonder whether they document the current state of SBCL or CMUCL. The right fix would have been to take out dangling links from our docs - someone can still do that! - and not to add explictly incorrect text that increases the amount of stuff you have to mentally weed out when doing "git grep". Some "internals" docs are more prosasic and theoretical than detail-oriented, so it's hard to say whether they're right or wrong. (Is it wrong to postulate counterfactuals like "it would be nice if x,y,z held ..."?) I didn't know what to do with Makefile, so I removed it, as well as skeletal table-of-contents files. --- doc/internals/cmu/.gitignore | 10 - doc/internals/cmu/Makefile | 83 ---- doc/internals/cmu/architecture.tex | 205 -------- doc/internals/cmu/environment.tex | 23 - doc/internals/cmu/executable.tex | 100 ---- doc/internals/cmu/fasl.tex | 640 ------------------------ doc/internals/cmu/interface.tex | 6 - doc/internals/cmu/interpreter.tex | 196 -------- doc/internals/cmu/lowlev.tex | 85 ---- doc/internals/cmu/object.tex | 770 ----------------------------- doc/internals/cmu/run-time.tex | 8 - 11 files changed, 2126 deletions(-) delete mode 100644 doc/internals/cmu/.gitignore delete mode 100644 doc/internals/cmu/Makefile delete mode 100644 doc/internals/cmu/architecture.tex delete mode 100644 doc/internals/cmu/environment.tex delete mode 100644 doc/internals/cmu/executable.tex delete mode 100644 doc/internals/cmu/fasl.tex delete mode 100644 doc/internals/cmu/interface.tex delete mode 100644 doc/internals/cmu/interpreter.tex delete mode 100644 doc/internals/cmu/lowlev.tex delete mode 100644 doc/internals/cmu/object.tex delete mode 100644 doc/internals/cmu/run-time.tex diff --git a/doc/internals/cmu/.gitignore b/doc/internals/cmu/.gitignore deleted file mode 100644 index 3dc4f08af1..0000000000 --- a/doc/internals/cmu/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -/architecture.aux -/compiler.aux -/design.aux -/design.log -/design.out -/design.pdf -/design.toc -/glossary.aux -/retargeting.aux -/run-time.aux diff --git a/doc/internals/cmu/Makefile b/doc/internals/cmu/Makefile deleted file mode 100644 index 0e9d8e6c53..0000000000 --- a/doc/internals/cmu/Makefile +++ /dev/null @@ -1,83 +0,0 @@ -LATEX=latex -PDFLATEX=pdflatex -DVIPS=dvips -DVIPSRES=1200 -DVIPSOPTS=-t a4 -D $(DVIPSRES) -RM=rm -CP=cp -MV=mv - -HTML_SPLIT_LEVEL=2 - -MASTERFILE=design - -FILES=architecture.tex back.tex compiler-overview.tex compiler.tex debugger.tex \ - design.tex environment.tex fasl.tex front.tex glossary.tex interface.tex \ - interpreter.tex lowlev.tex middle.tex object.tex retargeting.tex \ - run-time.tex vm.tex - -FIGURES= - -all : $(MASTERFILE).pdf - -$(MASTERFILE).dvi : $(FILES) $(FIGURES) - $(LATEX) $(MASTERFILE).tex - -# $(MASTERFILE).aux $(MASTERFILE).toc : $(FILES) $(FIGURES) -# $(LATEX) $(MASTERFILE).tex -# $(RM) $(MASTERFILE).dvi - -# $(MASTERFILE).dvi : $(FILES) $(MASTERFILE).aux $(MASTERFILE).toc $(FIGURES) -# $(LATEX) $(MASTERFILE).tex - -# Three times should be enough for everyone(tm). -.PHONY: firsttime -firsttime: $(MASTERFILE).dvi - $(LATEX) $(MASTERFILE).tex - $(LATEX) $(MASTERFILE).tex - - -.PRECIOUS: %.aux %.toc %.tex - - -%.dvi : %.tex - $(LATEX) $< - @while ( grep Rerun $*.log > /dev/null ); do \ - $(LATEX) $<; \ - done - $(LATEX) $< - -%.eps : %.fig - fig2dev -L ps $^ $@ - -%.pdf : %.tex - $(PDFLATEX) $^ - @while ( grep 'Rerun to get cross' $*.log > /dev/null ); do \ - $(PDFLATEX) $<; \ - done - $(PDFLATEX) $< - -%.ps : %.dvi - $(DVIPS) $(DVIPSOPTS) -o $@ $* - -.PHONY: html -html : $(MASTERFILE).dvi $(FILES) $(FIGURES) - latex2html -local_icons -antialias_text -antialias -scalable_fonts \ - -split $(HTML_SPLIT_LEVEL) -transparent -white $(MASTERFILE).tex - -clean distclean cvsclean : - -$(RM) -f *.log *.toc *.aux *.dvi *~ *.bak *.ps *.pdf core *.eps - -$(RM) -rf design - -.PHONY : allformats -allformats: $(FILES) $(FIGURES) - $(MAKE) firsttime LATEX=pslatex - $(MAKE) design.ps ; $(MV) design.ps design-psfonts.ps - $(MAKE) firsttime - $(MAKE) design.ps DVIPSRES=1200 ; $(MV) design.ps design-1200.ps - $(MAKE) design.ps DVIPSRES=600 ; $(MV) design.ps design-600.ps - $(MAKE) design.ps DVIPSRES=300 ; $(MV) design.ps design-300.ps - $(MAKE) design.pdf - $(MAKE) html HTML_SPLIT_LEVEL=3 ; $(MV) design design-split3 - $(MAKE) html HTML_SPLIT_LEVEL=2 ; $(MV) design design-split2 - $(MAKE) html HTML_SPLIT_LEVEL=1 ; $(MV) design design-split1 diff --git a/doc/internals/cmu/architecture.tex b/doc/internals/cmu/architecture.tex deleted file mode 100644 index bb52888d59..0000000000 --- a/doc/internals/cmu/architecture.tex +++ /dev/null @@ -1,205 +0,0 @@ -\part{System Architecture}% -*- Dictionary: int:design -*- - -\chapter{Package and File Structure} - -\section{Source Tree Structure} - -The \cmucl{} source tree has subdirectories for each major subsystem: - -\begin{description} -\item[{\tt assembly/}] Holds the CMU CL source-file assembler, and has machine -specific subdirectories holding assembly code for that architecture. - -\item[{\tt clx/}] The CLX interface to the X11 window system. - -\item[{\tt code/}] The Lisp code for the runtime system and standard CL -utilities. - -\item[{\tt compiler/}] The Python compiler. Has architecture-specific -subdirectories which hold backends for different machines. The {\tt generic} -subdirectory holds code that is shared across most backends. - -\item[{\tt hemlock/}] The Hemlock editor. - -\item[{\tt lisp/}] The C runtime system code and low-level Lisp debugger. - -\item[{\tt pcl/}] \cmucl{} version of the PCL implementation of CLOS. - -\item[{\tt tools/}] System building command files and source management tools. -\end{description} - - -\section{Package structure} - -Goals: with the single exception of LISP, we want to be able to export from the -package that the code lives in. - -\begin{description} -\item[Mach, CLX...] --- These Implementation-dependent system-interface -packages provide direct access to specific features available in the operating -system environment, but hide details of how OS communication is done. - -\item[system] contains code that must know about the operating system -environment: I/O, etc. Hides the operating system environment. Provides OS -interface extensions such as {\tt print-directory}, etc. - -\item[kernel] hides state and types used for system integration: package -system, error system, streams (?), reader, printer. Also, hides the VM, in -that we don't export anything that reveals the VM interface. Contains code -that needs to use the VM and SYSTEM interface, but is independent of OS and VM -details. This code shouldn't need to be changed in any port of CMU CL, but -won't work when plopped into an arbitrary CL. Uses SYSTEM, VM, EXTENSIONS. We -export "hidden" symbols related to implementation of CL: setf-inverses, -possibly some global variables. - -The boundary between KERNEL and VM is fuzzy, but this fuzziness reflects the -fuzziness in the definition of the VM. We can make the VM large, and bring -everything inside, or we can make it small. Obviously, we want the VM to be -as small as possible, subject to efficiency constraints. Pretty much all of -the code in KERNEL could be put in VM. The issue is more what VM hides from -KERNEL: VM knows about everything. - -\item[lisp] Originally, this package had all the system code in it. The -current ideal is that this package should have {\it no} code in it, and only -exist to export the standard interface. Note that the name has been changed by -x3j13 to common-lisp. - -\item[extensions] contains code that any random user could have written: list -operations, syntactic sugar macros. Uses only LISP, so code in EXTENSIONS is -pure CL. Exports everything defined within that is useful elsewhere. This -package doesn't hide much, so it is relatively safe for users to use -EXTENSIONS, since they aren't getting anything they couldn't have written -themselves. Contrast this to KERNEL, which exports additional operations on -CL's primitive data structures: PACKAGE-INTERNAL-SYMBOL-COUNT, etc. Although -some of the functionality exported from KERNEL could have been defined in CL, -the kernel implementation is much more efficient because it knows about -implementation internals. Currently this package contains only extensions to -CL, but in the ideal scheme of things, it should contain the implementations of -all CL functions that are in KERNEL (the library.) - -\item[VM] hides information about the hardware and data structure -representations. Contains all code that knows about this sort of thing: parts -of the compiler, GC, etc. The bulk of the code is the compiler back-end. -Exports useful things that are meaningful across all implementations, such as -operations for examining compiled functions, system constants. Uses COMPILER -and whatever else it wants. Actually, there are different {\it machine}{\tt --VM} packages for each target implementation. VM is a nickname for whatever -implementation we are currently targeting for. - - -\item[compiler] hides the algorithms used to map Lisp semantics onto the -operations supplied by the VM. Exports the mechanisms used for defining the -VM. All the VM-independent code in the compiler, partially hiding the compiler -intermediate representations. Uses KERNEL. - -\item[eval] holds code that does direct execution of the compiler's ICR. Uses -KERNEL, COMPILER. Exports debugger interface to interpreted code. - -\item[debug-internals] presents a reasonable, unified interface to -manipulation of the state of both compiled and interpreted code. (could be in -KERNEL) Uses VM, INTERPRETER, EVAL, KERNEL. - -\item[debug] holds the standard debugger, and exports the debugger -\end{description} - -\chapter{System Building} - -It's actually rather easy to build a CMU CL core with exactly what you want in -it. But to do this you need two things: the source and a working CMU CL. - -Basically, you use the working copy of CMU CL to compile the sources, -then run a process call ``genesis'' which builds a ``kernel'' core. -You then load whatever you want into this kernel core, and save it. - -In the \verb|tools/| directory in the sources there are several files that -compile everything, and build cores, etc. The first step is to compile the C -startup code. - -{\bf Note:} {\it the various scripts mentioned below have hard-wired paths in -them set up for our directory layout here at CMU. Anyone anywhere else will -have to edit them before they will work.} - -\section{Compiling the C Startup Code} - -There is a circular dependancy between lisp/internals.h and lisp/lisp.map that -causes bootstrapping problems. The easiest way to get around this problem -is to make a fake lisp.nm file that has nothing in it but a version number: - -\begin{verbatim} - % echo "Map file for lisp version 0" > lisp.nm -\end{verbatim} -and then run genesis with NIL for the list of files: -\begin{verbatim} - * (load ".../compiler/generic/new-genesis") ; compile before loading - * (lisp::genesis nil ".../lisp/lisp.nm" "/dev/null" - ".../lisp/lisp.map" ".../lisp/lisp.h") -\end{verbatim} -It will generate -a whole bunch of warnings about things being undefined, but ignore -that, because it will also generate a correct lisp.h. You can then -compile lisp producing a correct lisp.map: -\begin{verbatim} - % make -\end{verbatim} -and then use \verb|tools/do-worldbuild| and \verb|tools/mk-lisp| to build -\verb|kernel.core| and \verb|lisp.core| (see section \ref{building-cores}.) - -\section{Compiling the Lisp Code} - -The \verb|tools| directory contains various lisp and C-shell utilities for -building CMU CL: -\begin{description} -\item[compile-all*] Will compile lisp files and build a kernel core. It has -numerous command-line options to control what to compile and how. Try -help to -see a description. It runs a separate Lisp process to compile each -subsystem. Error output is generated in files with ``{\tt .log}'' extension in -the root of the build area. - -\item[setup.lisp] Some lisp utilities used for compiling changed files in batch -mode and collecting the error output. Sort of a crude defsystem. Loads into the -``user'' package. See {\tt with-compiler-log-file} and {\tt comf}. - -\item[{\it foo}com.lisp] Each system has a ``\verb|.lisp|'' file in -\verb|tools/| which compiles that system. -\end{description} - -\section{Building Core Images} -\label{building-cores} -Both the kernel and final core build are normally done using shell script -drivers: -\begin{description} -\item[do-worldbuild*] Builds a kernel core for the current machine. The -version to build is indicated by an optional argument, which defaults to -``alpha''. The \verb|kernel.core| file is written either in the \verb|lisp/| -directory in the build area, or in \verb|/usr/tmp/|. The directory which -already contains \verb|kernel.core| is chosen. You can create a dummy version -with e.g. ``touch'' to select the initial build location. - -\item[mk-lisp*] Builds a full core, with conditional loading of subsystems. -The version is the first argument, which defaults to ``alpha''. Any additional -arguments are added to the \verb|*features*| list, which controls system -loading (among other things.) The \verb|lisp.core| file is written in the -current working directory. -\end{description} - -These scripts load Lisp command files. When \verb|tools/worldbuild.lisp| is -loaded, it calls genesis with the correct arguments to build a kernel core. -Similarly, \verb|worldload.lisp| -builds a full core. Adding certain symbols to \verb|*features*| before -loading worldload.lisp suppresses loading of different parts of the -system. These symbols are: -\begin{description} -\item[:no-compiler] don't load the compiler. -\item[:no-clx] don't load CLX. -\item[:no-clm] don't load CLM. -\item[:no-hemlock] don't load Hemlock. -\item[:no-pcl] don't load PCL. -\item[:runtime] build a runtime code, implies all of the above, and then some. -\end{description} - -Note: if you don't load the compiler, you can't (successfully) load the -pretty-printer or pcl. And if you compiled hemlock with CLX loaded, you can't -load it without CLX also being loaded. - -These features are only used during the worldload process; they are -not propagated to the generated \verb|lisp.core| file. diff --git a/doc/internals/cmu/environment.tex b/doc/internals/cmu/environment.tex deleted file mode 100644 index 390f7dfde4..0000000000 --- a/doc/internals/cmu/environment.tex +++ /dev/null @@ -1,23 +0,0 @@ -\chapter{The Type System} - - - -\chapter{The Info Database} - -The info database provides a functional interface to global -information about named things in \cmucl{}. Information is considered to -be global if it must persist between invocations of the compiler. The -use of a functional interface eliminates the need for the compiler to -worry about the details of the representation. The info database also -handles the need to multiple ``global'' environments, which makes it -possible to change something in the compiler without trashing the -running Lisp environment. - -The info database contains arbitrary lisp values, addressed by a -combination of name, class and type. The Name is an EQUAL-thing which -is the name of the thing that we are recording information about. -Class is the kind of object involved: typical classes are Function, -Variable, Type. A type names a particular piece of information within -a given class. Class and Type are symbols, but are compared with -STRING=. - diff --git a/doc/internals/cmu/executable.tex b/doc/internals/cmu/executable.tex deleted file mode 100644 index 8843b0a708..0000000000 --- a/doc/internals/cmu/executable.tex +++ /dev/null @@ -1,100 +0,0 @@ -\chapter{Saving Executable Lisp Images} - -The :executable flag to SAVE-LISP allows saving the Lisp core sections into an ELF binary that -is executable. To do this, the ELF format is adapted to emulate the old core format. - -\section{Saving} -The first part of the save process is almost the same as saving a core-file image except that -instead of a single core image, three ELF object files are created. These are temporary files -called CORRO.o, CORSTA.o and CORDYN.o containing the read-only, static and dynamic spaces. - -After that, a script called linker.sh is invoked to use the system linker to create the -executable file. The linker links a file called lisp.a with the three object files. When -SAVE-LISP calls linker.sh, it passes the address of the initial function to be run when lisp is -restarted. - -The linker.sh script does several things. - -\begin{enumerate} -\item It locates the directory where the C runtime object files are kept. -\item It passes the name of the linker directive script to the linker. -\item It uses the linker to define two symbols: builtin_image_flag and initial_function_addr. - The first symbol has to be the address of some location in memory with non-zero contents - because it is used to tell the system that it is an executable rather than the traditional - runtime loader with core file. This is definitely a kludge but something like this is needed - because it gets around a bootstrapping issue. The second symbol is the startup function; - ordinarily this would be saved in the core file header. It would be possible to save this - information in the ELF file but since we have to use the linker to define builtin_image_flag - anyway, it is simpler to just define initial_function_addr the same way. -\item Finally, the linker script links the executable with the correct set of libraries and - object files. One of these files is lisp.a, containing the object code of the runtime - loader program, which is no longer a separate file. -\end{enumerate} - -\section{Running} -The startup procedure for an executable image attempts to emulate the startup procedure for a -core image file by using information saved in the ELF section headers. - -When an executable image starts up, it sees the builtin_image_flag that tells it that it is an -executable image. It reads the ELF header of the executable file. It finds the string section -of the file. It then reads ELF section headers, looking for sections with the names CORRO, -CORSTA or CORDYN (it uses the string section to look up the names). Once it finds them, it -mmaps them into the memory space indicated by the parameters in the ELF section header. -Finally it sets variables indicating the starts of the three spaces. It also sets a variable -to indicate how big the dynamic space is. - -\section{Porting the Linker Directive Script} -The following describes how to create a linker directive script. It assumes that the system is -based on GCC and the GCC compiler toolchain (in particular, GNU ld). - -The linker directive script is used to set up the memory layout for the system. It is a -modified version of the normal linker directive script used by the system. - -To obtain a copy of this script (for porting to another operating system), the command ``ld ---verbose'' must be run. This will dump the linker script to standard output. Save this to a -file and edit it as follows. - -First, add a ``PHDRS'' part after the SEARCH_DIR part and before the SECTIONS part. The PHDRS -part should look like this: - -PHDRS -{ - headers PT_PHDR PHDRS ; - interp PT_INTERP ; - text PT_LOAD FILEHDR PHDRS ; - - data PT_LOAD ; - dynamic PT_DYNAMIC ; - note PT_NOTE ; - - /* Add core sections for Lisp. */ - CORRO PT_NOTE ; - CORSTA PT_NOTE ; - CORDYN PT_NOTE ; -} - - -Note the three CORXXX sections. They are given type PT_NOTE so the system will not try to -process them. An attempt was made to use the PT_LOAD type (and thereby taking advantage of the -ELF loader automatically mmapping the sections into place) but this caused systems to get -confused about the memory layout so that any use of malloc would fail. - -Right after the place where the file has something like this: - - _end = .; - PROVIDE (end = .); - . = DATA_SEGMENT_END (.); - - add the following lines (modified for your system): - - /* Lisp core sections. */ - CORRO 0x10000000 : { CORRO.o (CORRO) } :CORRO - CORSTA 0x28f00000 : { CORSTA.o (CORSTA) } :CORSTA - CORDYN 0x48000000 : { CORDYN.o (CORDYN) } :CORDYN - -Note that the addresses (the second field) must correspond to the addresses of the read-only, -static and dynamic sections given in src/lisp/xxx-validate.h. - -This linker directive script will reside in the library: directory along with the linker.sh -script and the lisp.a file created by rebuild-lisp.sh. It should be given a descriptive name -that indicates the system it is used for. diff --git a/doc/internals/cmu/fasl.tex b/doc/internals/cmu/fasl.tex deleted file mode 100644 index 0c0c577afc..0000000000 --- a/doc/internals/cmu/fasl.tex +++ /dev/null @@ -1,640 +0,0 @@ -\chapter{Fasload File Format}% -*- Dictionary: design -*- -\section{General} - -The purpose of Fasload files is to allow concise storage and rapid -loading of Lisp data, particularly function definitions. The intent -is that loading a Fasload file has the same effect as loading the -source file from which the Fasload file was compiled, but accomplishes -the tasks more efficiently. One noticeable difference, of course, is -that function definitions may be in compiled form rather than -S-expression form. Another is that Fasload files may specify in what -parts of memory the Lisp data should be allocated. For example, -constant lists used by compiled code may be regarded as read-only. - -In some Lisp implementations, Fasload file formats are designed to -allow sharing of code parts of the file, possibly by direct mapping -of pages of the file into the address space of a process. This -technique produces great performance improvements in a paged -time-sharing system. Since the Mach project is to produce a -distributed personal-computer network system rather than a -time-sharing system, efficiencies of this type are explicitly {\it not} -a goal for the CMU Common Lisp Fasload file format. - -On the other hand, CMU Common Lisp is intended to be portable, as it will -eventually run on a variety of machines. Therefore an explicit goal -is that Fasload files shall be transportable among various -implementations, to permit efficient distribution of programs in -compiled form. The representations of data objects in Fasload files -shall be relatively independent of such considerations as word -length, number of type bits, and so on. If two implementations -interpret the same macrocode (compiled code format), then Fasload -files should be completely compatible. If they do not, then files -not containing compiled code (so-called ``Fasdump'' data files) should -still be compatible. While this may lead to a format which is not -maximally efficient for a particular implementation, the sacrifice of -a small amount of performance is deemed a worthwhile price to pay to -achieve portability. - -The primary assumption about data format compatibility is that all -implementations can support I/O on finite streams of eight-bit bytes. -By ``finite'' we mean that a definite end-of-file point can be detected -irrespective of the content of the data stream. A Fasload file will -be regarded as such a byte stream. - -\section{Strategy} - -A Fasload file may be regarded as a human-readable prefix followed by -code in a funny little language. When interpreted, this code will -cause the construction of the encoded data structures. The virtual -machine which interprets this code has a {\it stack} and a {\it table}, -both initially empty. The table may be thought of as an expandable -register file; it is used to remember quantities which are needed -more than once. The elements of both the stack and the table are -Lisp data objects. Operators of the funny language may take as -operands following bytes of the data stream, or items popped from the -stack. Results may be pushed back onto the stack or pushed onto the -table. The table is an indexable stack that is never popped; it is -indexed relative to the base, not the top, so that an item once -pushed always has the same index. - -More precisely, a Fasload file has the following macroscopic -organization. It is a sequence of zero or more groups concatenated -together. End-of-file must occur at the end of the last group. Each -group begins with a series of seven-bit ASCII characters terminated -by one or more bytes of all ones \verb|#xFF|; this is called the -{\it header}. Following the bytes which terminate the header is the -{\it body}, a stream of bytes in the funny binary language. The body -of necessity begins with a byte other than \verb|#xFF|. The body is -terminated by the operation {\tt FOP-END-GROUP}. - -The first nine characters of the header must be \verb|FASL FILE| in -upper-case letters. The rest may be any ASCII text, but by -convention it is formatted in a certain way. The header is divided -into lines, which are grouped into paragraphs. A paragraph begins -with a line which does {\it not} begin with a space or tab character, -and contains all lines up to, but not including, the next such line. -The first word of a paragraph, defined to be all characters up to but -not including the first space, tab, or end-of-line character, is the -{\it name} of the paragraph. A Fasload file header might look something like -this: -\begin{verbatim} -FASL FILE >SteelesPerq>User>Guy>IoHacks>Pretty-Print.Slisp -Package Pretty-Print -Compiled 31-Mar-1988 09:01:32 by some random luser -Compiler Version 1.6, Lisp Version 3.0. -Functions: INITIALIZE DRIVER HACK HACK1 MUNGE MUNGE1 GAZORCH - MINGLE MUDDLE PERTURB OVERDRIVE GOBBLE-KEYBOARD - FRY-USER DROP-DEAD HELP CLEAR-MICROCODE - %AOS-TRIANGLE %HARASS-READTABLE-MAYBE -Macros: PUSH POP FROB TWIDDLE -\end{verbatim} -{\it one or more bytes of \verb|#xFF|} - -The particular paragraph names and contents shown here are only intended as -suggestions. - -\section{Fasload Language} - -Each operation in the binary Fasload language is an eight-bit -(one-byte) opcode. Each has a name beginning with ``{\tt FOP-}''. In -the following descriptions, the name is followed by operand -descriptors. Each descriptor denotes operands that follow the opcode -in the input stream. A quantity in parentheses indicates the number -of bytes of data from the stream making up the operand. Operands -which implicitly come from the stack are noted in the text. The -notation ``$\Rightarrow$ stack'' means that the result is pushed onto the -stack; ``$\Rightarrow$ table'' similarly means that the result is added to the -table. A construction like ``{\it n}(1) {\it value}({\it n})'' means that -first a single byte {\it n} is read from the input stream, and this -byte specifies how many bytes to read as the operand named {\it value}. -All numeric values are unsigned binary integers unless otherwise -specified. Values described as ``signed'' are in two's-complement form -unless otherwise specified. When an integer read from the stream -occupies more than one byte, the first byte read is the least -significant byte, and the last byte read is the most significant (and -contains the sign bit as its high-order bit if the entire integer is -signed). - -Some of the operations are not necessary, but are rather special -cases of or combinations of others. These are included to reduce the -size of the file or to speed up important cases. As an example, -nearly all strings are less than 256 bytes long, and so a special -form of string operation might take a one-byte length rather than a -four-byte length. As another example, some implementations may -choose to store bits in an array in a left-to-right format within -each word, rather than right-to-left. The Fasload file format may -support both formats, with one being significantly more efficient -than the other for a given implementation. The compiler for any -implementation may generate the more efficient form for that -implementation, and yet compatibility can be maintained by requiring -all implementations to support both formats in Fasload files. - -Measurements are to be made to determine which operation codes are -worthwhile; little-used operations may be discarded and new ones -added. After a point the definition will be ``frozen'', meaning that -existing operations may not be deleted (though new ones may be added; -some operations codes will be reserved for that purpose). - -\begin{description} -\item[0:] \hspace{2em} {\tt FOP-NOP} \\ -No operation. (This is included because it is recognized -that some implementations may benefit from alignment of operands to some -operations, for example to 32-bit boundaries. This operation can be used -to pad the instruction stream to a desired boundary.) - -\item[1:] \hspace{2em} {\tt FOP-POP} \hspace{2em} $\Rightarrow$ \hspace{2em} table \\ -One item is popped from the stack and added to the table. - -\item[2:] \hspace{2em} {\tt FOP-PUSH} \hspace{2em} {\it index}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -Item number {\it index} of the table is pushed onto the stack. -The first element of the table is item number zero. - -\item[3:] \hspace{2em} {\tt FOP-BYTE-PUSH} \hspace{2em} {\it index}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -Item number {\it index} of the table is pushed onto the stack. -The first element of the table is item number zero. - -\item[4:] \hspace{2em} {\tt FOP-EMPTY-LIST} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The empty list ({\tt ()}) is pushed onto the stack. - -\item[5:] \hspace{2em} {\tt FOP-TRUTH} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The standard truth value ({\tt T}) is pushed onto the stack. - -\item[6:] \hspace{2em} {\tt FOP-SYMBOL-SAVE} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ -The four-byte operand {\it n} specifies the length of the print name -of a symbol. The name follows, one character per byte, -with the first byte of the print name being the first read. -The name is interned in the default package, -and the resulting symbol is both pushed onto the stack and added to the table. - -\item[7:] \hspace{2em} {\tt FOP-SMALL-SYMBOL-SAVE} \hspace{2em} {\it n}(1) \hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ -The one-byte operand {\it n} specifies the length of the print name -of a symbol. The name follows, one character per byte, -with the first byte of the print name being the first read. -The name is interned in the default package, -and the resulting symbol is both pushed onto the stack and added to the table. - -\item[8:] \hspace{2em} {\tt FOP-SYMBOL-IN-PACKAGE-SAVE} \hspace{2em} {\it index}(4) -\hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ -The four-byte {\it index} specifies a package stored in the table. -The four-byte operand {\it n} specifies the length of the print name -of a symbol. The name follows, one character per byte, -with the first byte of the print name being the first read. -The name is interned in the specified package, -and the resulting symbol is both pushed onto the stack and added to the table. - -\item[9:] \hspace{2em} {\tt FOP-SMALL-SYMBOL-IN-PACKAGE-SAVE} \hspace{2em} {\it index}(4) -\hspace{2em} {\it n}(1) \hspace{2em} {\it name}({\it n}) \hspace{2em} -$\Rightarrow$ \hspace{2em} stack \& table\\ -The four-byte {\it index} specifies a package stored in the table. -The one-byte operand {\it n} specifies the length of the print name -of a symbol. The name follows, one character per byte, -with the first byte of the print name being the first read. -The name is interned in the specified package, -and the resulting symbol is both pushed onto the stack and added to the table. - -\item[10:] \hspace{2em} {\tt FOP-SYMBOL-IN-BYTE-PACKAGE-SAVE} \hspace{2em} {\it index}(1) -\hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ -The one-byte {\it index} specifies a package stored in the table. -The four-byte operand {\it n} specifies the length of the print name -of a symbol. The name follows, one character per byte, -with the first byte of the print name being the first read. -The name is interned in the specified package, -and the resulting symbol is both pushed onto the stack and added to the table. - -\item[11:]\hspace{2em} {\tt FOP-SMALL-SYMBOL-IN-BYTE-PACKAGE-SAVE} \hspace{2em} {\it index}(1) -\hspace{2em} {\it n}(1) \hspace{2em} {\it name}({\it n}) \hspace{2em} -$\Rightarrow$ \hspace{2em} stack \& table\\ -The one-byte {\it index} specifies a package stored in the table. -The one-byte operand {\it n} specifies the length of the print name -of a symbol. The name follows, one character per byte, -with the first byte of the print name being the first read. -The name is interned in the specified package, -and the resulting symbol is both pushed onto the stack and added to the table. - -\item[12:] \hspace{2em} {\tt FOP-UNINTERNED-SYMBOL-SAVE} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ -Like {\tt FOP-SYMBOL-SAVE}, except that it creates an uninterned symbol. - -\item[13:] \hspace{2em} {\tt FOP-UNINTERNED-SMALL-SYMBOL-SAVE} \hspace{2em} {\it n}(1) -\hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack -\& table\\ -Like {\tt FOP-SMALL-SYMBOL-SAVE}, except that it creates an uninterned symbol. - -\item[14:] \hspace{2em} {\tt FOP-PACKAGE} \hspace{2em} $\Rightarrow$ \hspace{2em} table \\ -An item is popped from the stack; it must be a symbol. The package of -that name is located and pushed onto the table. - -\item[15:] \hspace{2em} {\tt FOP-LIST} \hspace{2em} {\it length}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The unsigned operand {\it length} specifies a number of -operands to be popped from the stack. These are made into a list -of that length, and the list is pushed onto the stack. -The first item popped from the stack becomes the last element of -the list, and so on. Hence an iterative loop can start with -the empty list and perform ``pop an item and cons it onto the list'' -{\it length} times. -(Lists of length greater than 255 can be made by using {\tt FOP-LIST*} -repeatedly.) - -\item[16:] \hspace{2em} {\tt FOP-LIST*} \hspace{2em} {\it length}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -This is like {\tt FOP-LIST} except that the constructed list is terminated -not by {\tt ()} (the empty list), but by an item popped from the stack -before any others are. Therefore {\it length}+1 items are popped in all. -Hence an iterative loop can start with -a popped item and perform ``pop an item and cons it onto the list'' -{\it length}+1 times. - -\item[17-24:] \hspace{2em} {\tt FOP-LIST-1}, {\tt FOP-LIST-2}, ..., {\tt FOP-LIST-8} \\ -{\tt FOP-LIST-{\it k}} is like {\tt FOP-LIST} with a byte containing {\it k} -following it. These exist purely to reduce the size of Fasload files. -Measurements need to be made to determine the useful values of {\it k}. - -\item[25-32:] \hspace{2em} {\tt FOP-LIST*-1}, {\tt FOP-LIST*-2}, ..., {\tt FOP-LIST*-8} \\ -{\tt FOP-LIST*-{\it k}} is like {\tt FOP-LIST*} with a byte containing {\it k} -following it. These exist purely to reduce the size of Fasload files. -Measurements need to be made to determine the useful values of {\it k}. - -\item[33:] \hspace{2em} {\tt FOP-INTEGER} \hspace{2em} {\it n}(4) \hspace{2em} {\it value}({\it n}) \hspace{2em} -$\Rightarrow$ \hspace{2em} stack \\ -A four-byte unsigned operand specifies the number of following -bytes. These bytes define the value of a signed integer in two's-complement -form. The first byte of the value is the least significant byte. - -\item[34:] \hspace{2em} {\tt FOP-SMALL-INTEGER} \hspace{2em} {\it n}(1) \hspace{2em} {\it value}({\it n}) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -A one-byte unsigned operand specifies the number of following -bytes. These bytes define the value of a signed integer in two's-complement -form. The first byte of the value is the least significant byte. - -\item[35:] \hspace{2em} {\tt FOP-WORD-INTEGER} \hspace{2em} {\it value}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -A four-byte signed integer (in the range $-2^{31}$ to $2^{31}-1$) follows the -operation code. A LISP integer (fixnum or bignum) with that value -is constructed and pushed onto the stack. - -\item[36:] \hspace{2em} {\tt FOP-BYTE-INTEGER} \hspace{2em} {\it value}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -A one-byte signed integer (in the range -128 to 127) follows the -operation code. A LISP integer (fixnum or bignum) with that value -is constructed and pushed onto the stack. - -\item[37:] \hspace{2em} {\tt FOP-STRING} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The four-byte operand {\it n} specifies the length of a string to -construct. The characters of the string follow, one per byte. -The constructed string is pushed onto the stack. - -\item[38:] \hspace{2em} {\tt FOP-SMALL-STRING} \hspace{2em} {\it n}(1) \hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The one-byte operand {\it n} specifies the length of a string to -construct. The characters of the string follow, one per byte. -The constructed string is pushed onto the stack. - -\item[39:] \hspace{2em} {\tt FOP-VECTOR} \hspace{2em} {\it n}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The four-byte operand {\it n} specifies the length of a vector of LISP objects -to construct. The elements of the vector are popped off the stack; -the first one popped becomes the last element of the vector. -The constructed vector is pushed onto the stack. - -\item[40:] \hspace{2em} {\tt FOP-SMALL-VECTOR} \hspace{2em} {\it n}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The one-byte operand {\it n} specifies the length of a vector of LISP objects -to construct. The elements of the vector are popped off the stack; -the first one popped becomes the last element of the vector. -The constructed vector is pushed onto the stack. - -\item[41:] \hspace{2em} {\tt FOP-UNIFORM-VECTOR} \hspace{2em} {\it n}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The four-byte operand {\it n} specifies the length of a vector of LISP objects -to construct. A single item is popped from the stack and used to initialize -all elements of the vector. The constructed vector is pushed onto the stack. - -\item[42:] \hspace{2em} {\tt FOP-SMALL-UNIFORM-VECTOR} \hspace{2em} {\it n}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The one-byte operand {\it n} specifies the length of a vector of LISP objects -to construct. A single item is popped from the stack and used to initialize -all elements of the vector. The constructed vector is pushed onto the stack. - -\item[43:] \hspace{2em} {\tt FOP-INT-VECTOR} \hspace{2em} {\it len}(4) \hspace{2em} -{\it size}(1) \hspace{2em} {\it data}($\left\lceil len*count/8\right\rceil$) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The four-byte operand {\it n} specifies the length of a vector of -unsigned integers to be constructed. Each integer is {\it size} -bits long, and is packed according to the machine's native byte ordering. -{\it size} must be a directly supported i-vector element size. Currently -supported values are 1,2,4,8,16 and 32. - -\item[44:] \hspace{2em} {\tt FOP-UNIFORM-INT-VECTOR} \hspace{2em} {\it n}(4) \hspace{2em} {\it size}(1) \hspace{2em} -{\it value}(@ceiling$<${\it size}/8$>$) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The four-byte operand {\it n} specifies the length of a vector of unsigned -integers to construct. -Each integer is {\it size} bits big, and is initialized to the value -of the operand {\it value}. -The constructed vector is pushed onto the stack. - -\item[45:] \hspace{2em} {\tt FOP-LAYOUT} \hspace{2em} \\ -Pops the stack four times to get the name, length, inheritance and depth for a layout object. - -\item[46:] \hspace{2em} {\tt FOP-SINGLE-FLOAT} \hspace{2em} {\it data}(4) \hspace{2em} -$\Rightarrow$ \hspace{2em} stack \\ -The {\it data} bytes are read as an integer, then turned into an IEEE single -float (as though by {\tt make-single-float}). - -\item[47:] \hspace{2em} {\tt FOP-DOUBLE-FLOAT} \hspace{2em} {\it data}(8) \hspace{2em} -$\Rightarrow$ \hspace{2em} stack \\ -The {\it data} bytes are read as an integer, then turned into an IEEE double -float (as though by {\tt make-double-float}). - -\item[48:] \hspace{2em} {\tt FOP-STRUCT} \hspace{2em} {\it n}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The four-byte operand {\it n} specifies the length structure to construct. The -elements of the vector are popped off the stack; the first one popped becomes -the last element of the structure. The constructed vector is pushed onto the -stack. - -\item[49:] \hspace{2em} {\tt FOP-SMALL-STRUCT} \hspace{2em} {\it n}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The one-byte operand {\it n} specifies the length structure to construct. The -elements of the vector are popped off the stack; the first one popped becomes -the last element of the structure. The constructed vector is pushed onto the -stack. - -\item[50-52:] Unused - -\item[53:] \hspace{2em} {\tt FOP-EVAL} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -Pop an item from the stack and evaluate it (give it to {\tt EVAL}). -Push the result back onto the stack. - -\item[54:] \hspace{2em} {\tt FOP-EVAL-FOR-EFFECT} \\ -Pop an item from the stack and evaluate it (give it to {\tt EVAL}). -The result is ignored. - -\item[55:] \hspace{2em} {\tt FOP-FUNCALL} \hspace{2em} {\it nargs}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -Pop {\it nargs}+1 items from the stack and apply the last one popped -as a function to -all the rest as arguments (the first one popped being the last argument). -Push the result back onto the stack. - -\item[56:] \hspace{2em} {\tt FOP-FUNCALL-FOR-EFFECT} \hspace{2em} {\it nargs}(1) \\ -Pop {\it nargs}+1 items from the stack and apply the last one popped -as a function to -all the rest as arguments (the first one popped being the last argument). -The result is ignored. - -\item[57:] \hspace{2em} {\tt FOP-CODE-FORMAT} \hspace{2em} {\it implementation}(1) -\hspace{2em} {\it version}(1) \\ -This FOP specifiers the code format for following code objects. The operations -{\tt FOP-CODE} and its relatives may not occur in a group until after {\tt -FOP-CODE-FORMAT} has appeared; there is no default format. The {\it -implementation} is an integer indicating the target hardware and environment. -See {\tt compiler/generic/vm-macs.lisp} for the currently defined -implementations. {\it version} for an implementation is increased whenever -there is a change that renders old fasl files unusable. - -\item[58:] \hspace{2em} {\tt FOP-CODE} \hspace{2em} {\it nitems}(4) \hspace{2em} {\it size}(4) \hspace{2em} -{\it code}({\it size}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -A compiled function is constructed and pushed onto the stack. -This object is in the format specified by the most recent -occurrence of {\tt FOP-CODE-FORMAT}. -The operand {\it nitems} specifies a number of items to pop off -the stack to use in the ``boxed storage'' section. The operand {\it code} -is a string of bytes constituting the compiled executable code. - -\item[59:] \hspace{2em} {\tt FOP-SMALL-CODE} \hspace{2em} {\it nitems}(1) \hspace{2em} {\it size}(2) \hspace{2em} -{\it code}({\it size}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -A compiled function is constructed and pushed onto the stack. -This object is in the format specified by the most recent -occurrence of {\tt FOP-CODE-FORMAT}. -The operand {\it nitems} specifies a number of items to pop off -the stack to use in the ``boxed storage'' section. The operand {\it code} -is a string of bytes constituting the compiled executable code. - -\item[60] \hspace{2em} {\tt FOP-FDEFINITION} \hspace{2em} \\ -Pops the stack to get an fdefinition. - -\item[61] \hspace{2em} {\tt FOP-SANCTIFY-FOR-EXECUTION} \hspace{2em} \\ -A code component is popped from the stack, and the necessary magic is applied -to the code so that it can be executed. - -\item[62:] \hspace{2em} {\tt FOP-VERIFY-TABLE-SIZE} \hspace{2em} {\it size}(4) \\ -If the current size of the table is not equal to {\it size}, -then an inconsistency has been detected. This operation -is inserted into a Fasload file purely for error-checking purposes. -It is good practice for a compiler to output this at least at the -end of every group, if not more often. - -\item[63:] \hspace{2em} {\tt FOP-VERIFY-EMPTY-STACK} \\ -If the stack is not currently empty, -then an inconsistency has been detected. This operation -is inserted into a Fasload file purely for error-checking purposes. -It is good practice for a compiler to output this at least at the -end of every group, if not more often. - -\item[64:] \hspace{2em} {\tt FOP-END-GROUP} \\ -This is the last operation of a group. If this is not the -last byte of the file, then a new group follows; the next -nine bytes must be ``{\tt FASL FILE}''. - -\item[65:] \hspace{2em} {\tt FOP-POP-FOR-EFFECT} \hspace{2em} stack \hspace{2em} $\Rightarrow$ \hspace{2em} \\ -One item is popped from the stack. - -\item[66:] \hspace{2em} {\tt FOP-MISC-TRAP} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -A trap object is pushed onto the stack. - -\item[67:] \hspace{2em} {\tt FOP-DOUBLE-DOUBLE-FLOAT} \hspace{2em} {\it double-double-float}(8) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The next 8 bytes are read, and a double-double-float number is constructed. - -\item[68:] \hspace{2em} {\tt FOP-CHARACTER} \hspace{2em} {\it character}(3) \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -The three bytes are read as an integer then converted to a character. This FOP -is currently rather useless, as extended characters are not supported. - -\item[69:] \hspace{2em} {\tt FOP-SHORT-CHARACTER} \hspace{2em} {\it character}(1) \hspace{2em} -$\Rightarrow$ \hspace{2em} stack \\ -The one byte specifies the code of a Common Lisp character object. A character -is constructed and pushed onto the stack. - -\item[70:] \hspace{2em} {\tt FOP-RATIO} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -Creates a ratio from two integers popped from the stack. -The denominator is popped first, the numerator second. - -\item[71:] \hspace{2em} {\tt FOP-COMPLEX} \hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -Creates a complex number from two numbers popped from the stack. -The imaginary part is popped first, the real part second. - -\item[72] \hspace{2em} {\tt FOP-COMPLEX-SINGLE-FLOAT} {\it real(4)} {\it imag(4)}\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -Creates a complex single-float number from the following 8 bytes. - -\item[73] \hspace{2em} {\tt FOP-COMPLEX-DOUBLE-FLOAT} {\it real(8)} {\it imag(8)}\hspace{2em} $\Rightarrow$ \hspace{2em} stack \\ -Creates a complex double-float number from the following 16 bytes. - - -\item[74:] \hspace{2em} {\tt FOP-FSET} \hspace{2em} \\ -Except in the cold loader (Genesis), this is a no-op with two stack arguments. -In the initial core this is used to make DEFUN functions defined at cold-load -time so that global functions can be called before top-level forms are run -(which normally installs definitions.) Genesis pops the top two things off of -the stack and effectively does (SETF SYMBOL-FUNCTION). - -\item[75:] \hspace{2em} {\tt FOP-LISP-SYMBOL-SAVE} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ -Like {\tt FOP-SYMBOL-SAVE}, except that it creates a symbol in the LISP -package. - -\item[76:] \hspace{2em} {\tt FOP-LISP-SMALL-SYMBOL-SAVE} \hspace{2em} {\it n}(1) -\hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack -\& table\\ -Like {\tt FOP-SMALL-SYMBOL-SAVE}, except that it creates a symbol in the LISP -package. - -\item[77:] \hspace{2em} {\tt FOP-KEYWORD-SYMBOL-SAVE} \hspace{2em} {\it n}(4) \hspace{2em} {\it name}({\it n}) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack \& table\\ -Like {\tt FOP-SYMBOL-SAVE}, except that it creates a symbol in the -KEYWORD package. - -\item[78:] \hspace{2em} {\tt FOP-KEYWORD-SMALL-SYMBOL-SAVE} \hspace{2em} {\it n}(1) -\hspace{2em} {\it name}({\it n}) \hspace{2em} $\Rightarrow$ \hspace{2em} stack -\& table\\ -Like {\tt FOP-SMALL-SYMBOL-SAVE}, except that it creates a symbol in the -KEYWORD package. - -\item[79-80:] Unused - -\item[81:] \hspace{2em} {\tt FOP-NORMAL-LOAD}\\ -This FOP is used in conjunction with the cold loader (Genesis) to read -top-level package manipulation forms. These forms are to be read as though by -the normal loaded, so that they can be evaluated at cold load time, instead of -being dumped into the initial core image. A no-op in normal loading. - -\item[82:] \hspace{2em} {\tt FOP-MAYBE-COLD-LOAD}\\ -Undoes the effect of {\tt FOP-NORMAL-LOAD}. - -\item[83:] \hspace{2em} {\tt FOP-ARRAY} \hspace{2em} {\it rank}(4) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -This operation creates a simple array header (used for simple-arrays with rank -/= 1). The data vector is popped off of the stack, and then {\it rank} -dimensions are popped off of the stack (the highest dimensions is on top.) - -\item[84:] \hspace{2em} {\tt FOP-SINGLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) - \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Creates a {\it (simple-array single-float (*))} object. The number of single-floats is {\it length}. - -\item[85:] \hspace{2em} {\tt FOP-DOUBLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) - \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Creates a {\it (simple-array double-float (*))} object. The number of double-floats is {\it length}. - -\item[86:] \hspace{2em} {\tt FOP-COMPLEX-SINGLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) - \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Creates a {\it (simple-array (complex single-float) (*))} object. The number of complex single-floats is {\it length}. - -\item[87:] \hspace{2em} {\tt FOP-COMPLEX-DOUBLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) - \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Creates a {\it (simple-array (complex double-float) (*))} object. The number of complex double-floats is {\it length}. - -\item[88:] \hspace{2em} {\tt FOP-DOUBLE-DOUBLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) - \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Creates a {\it (simple-array double-double-float (*))} object. The number of double-double-floats is {\it length}. - -\item[89:] \hspace{2em} {\tt FOP-COMPLEX-DOUBLE-DOUBLE-FLOAT} \hspace{2em} {\it data}(32) - \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Creates a {\it (complex double-double-float)} object from the following 32 bytes of data. - -\item[90:] \hspace{2em} {\tt FOP-COMPLEX-DOUBLE-DOUBLE-FLOAT-VECTOR} \hspace{2em} {\it length}(4) {\it data}(n) - \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Creates a {\it (simple-arra (complex double-double-float) (*))} object. The number of complex double-double-floats is {\it length}. - -\item[91-139:] Unused - -\item[140:] \hspace{2em} {\tt FOP-ALTER-CODE} \hspace{2em} {\it index}(4)\\ -This operation modifies the constants part of a code object (necessary for -creating certain circular function references.) It pops the new value and code -object are off of the stack, storing the new value at the specified index. - -\item[141:] \hspace{2em} {\tt FOP-BYTE-ALTER-CODE} \hspace{2em} {\it index}(1)\\ -Like {\tt FOP-ALTER-CODE}, but has only a one byte offset. - -\item[142:] \hspace{2em} {\tt FOP-FUNCTION-ENTRY} \hspace{2em} {\it index}(4) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Initializes a function-entry header inside of a pre-existing code object, and -returns the corresponding function descriptor. {\it index} is the byte offset -inside of the code object where the header should be plunked down. The stack -arguments to this operation are the code object, function name, function debug -arglist and function type. - -\item[143:] \hspace{2em} {\tt FOP-MAKE-BYTE-COMPILED-FUNCTION} \hspace{2em} {\it size}(1) \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Create a byte-compiled function. {\it FIXME:} describe what's on the stack. - -\item[144:] \hspace{2em} {\tt FOP-ASSEMBLER-CODE} \hspace{2em} {\it length}(4) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -This operation creates a code object holding assembly routines. {\it length} -bytes of code are read and placed in the code object, and the code object -descriptor is pushed on the stack. This FOP is only recognized by the cold -loader (Genesis.) - -\item[145:] \hspace{2em} {\tt FOP-ASSEMBLER-ROUTINE} \hspace{2em} {\it offset}(4) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -This operation records an entry point into an assembler code object (for use -with {\tt FOP-ASSEMBLER-FIXUP}). The routine name (a symbol) is on stack top. -The code object is underneath. The entry point is defined at {\it offset} -bytes inside the code area of the code object, and the code object is left on -stack top (allowing multiple uses of this FOP to be chained.) This FOP is only -recognized by the cold loader (Genesis.) - -\item[146:] Unused - -\item[147:] \hspace{2em} {\tt FOP-FOREIGN-FIXUP} \hspace{2em} {\it len}(1) -\hspace{2em} {\it name}({\it len}) -\hspace{2em} {\it offset}(4) \hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -This operation resolves a reference to a foreign (C) symbol. {\it len} bytes -are read and interpreted as the symbol {\it name}. First the {\it kind} and the -code-object to patch are popped from the stack. The kind is a target-dependent -symbol indicating the instruction format of the patch target (at {\it offset} -bytes from the start of the code area.) The code object is left on -stack top (allowing multiple uses of this FOP to be chained.) - -\item[148:] \hspace{2em} {\tt FOP-ASSEMBLER-FIXUP} \hspace{2em} {\it offset}(4) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -This operation resolves a reference to an assembler routine. The stack args -are ({\it routine-name}, {\it kind} and {\it code-object}). The kind is a -target-dependent symbol indicating the instruction format of the patch target -(at {\it offset} bytes from the start of the code area.) The code object is -left on stack top (allowing multiple uses of this FOP to be chained.) - -\item[149:] \hspace{2em} {\tt FOP-CODE-OBJECT-FIXUP} -\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -{\it FIXME:} Describe what this does! - -\item[150:] \hspace{2em} {\tt FOP-FOREIGN-DATA-FIXUP} -\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -{\it FIXME:} Describe what this does! - -\item[151-156:] Unused - -\item[157:] \hspace{2em} {\tt FOP-LONG-CODE-FORMAT} \hspace{2em} {\it implementation}(1) -\hspace{2em} {\it version}(4) \\ -Like FOP-CODE-FORMAT, except that the version is 32 bits long. - -\item[158-199:] Unused - -\item[200:] \hspace{2em} {\tt FOP-RPLACA} \hspace{2em} {\it table-idx}(4) -\hspace{2em} {\it cdr-offset}(4)\\ - -\item[201:] \hspace{2em} {\tt FOP-RPLACD} \hspace{2em} {\it table-idx}(4) -\hspace{2em} {\it cdr-offset}(4)\\ -These operations destructively modify a list entered in the table. {\it -table-idx} is the table entry holding the list, and {\it cdr-offset} designates -the cons in the list to modify (like the argument to {\tt nthcdr}.) The new -value is popped off of the stack, and stored in the {\tt car} or {\tt cdr}, -respectively. - -\item[202:] \hspace{2em} {\tt FOP-SVSET} \hspace{2em} {\it table-idx}(4) -\hspace{2em} {\it vector-idx}(4)\\ -Destructively modifies a {\tt simple-vector} entered in the table. Pops the -new value off of the stack, and stores it in the {\it vector-idx} element of -the contents of the table entry {\it table-idx.} - -\item[203:] \hspace{2em} {\tt FOP-NTHCDR} \hspace{2em} {\it cdr-offset}(4) -\hspace{2em} $\Rightarrow$ \hspace{2em} stack\\ -Does {\tt nthcdr} on the top-of stack, leaving the result there. - -\item[204:] \hspace{2em} {\tt FOP-STRUCTSET} \hspace{2em} {\it table-idx}(4) -\hspace{2em} {\it vector-idx}(4)\\ -Like {\tt FOP-SVSET}, except it alters structure slots. - -\item[205-254:] Unused -\item[255:] \hspace{2em} {\tt FOP-END-HEADER} \\ Indicates the end of a group header, -as described above. -\end{description} diff --git a/doc/internals/cmu/interface.tex b/doc/internals/cmu/interface.tex deleted file mode 100644 index b08631e81a..0000000000 --- a/doc/internals/cmu/interface.tex +++ /dev/null @@ -1,6 +0,0 @@ -\chapter{User Interface of the Compiler} - -\section{Error Message Utilities} - -\section{Source Paths} -\label{source-paths} diff --git a/doc/internals/cmu/interpreter.tex b/doc/internals/cmu/interpreter.tex deleted file mode 100644 index d83d817e57..0000000000 --- a/doc/internals/cmu/interpreter.tex +++ /dev/null @@ -1,196 +0,0 @@ -% -*- Dictionary: design; Package: C -*- - -\chapter{The IR1 Interpreter} - -May be worth having a byte-code representation for interpreted code. This way, -an entire system could be compiled into byte-code for debugging (the -``check-out'' compiler?). - -Given our current inclination for using a stack machine to interpret IR1, it -would be straightforward to layer a byte-code interpreter on top of this. - - -Instead of having no interpreter, or a more-or-less conventional interpreter, -or byte-code interpreter, how about directly executing IR1? - -We run through the IR1 passes, possibly skipping optional ones, until we get -through environment analysis. Then we run a post-pass that annotates IR1 with -information about where values are kept, i.e. the stack slot. - -We can lazily convert functions by having FUNCTION make an interpreted function -object that holds the code (really a closure over the interpreter). The first -time that we try to call the function, we do the conversion and processing. -Also, we can easily keep track of which interpreted functions we have expanded -macros in, so that macro redefinition automatically invalidates the old -expansion, causing lazy reconversion. - -Probably the interpreter will want to represent MVs by a recognizable structure -that is always heap-allocated. This way, we can punt the stack issues involved -in trying to spread MVs. So a continuation value can always be kept in a -single cell. - -The compiler can have some special frobs for making the interpreter efficient, -such as a call operation that extracts arguments from the stack -slots designated by a continuation list. Perhaps - -\begin{verbatim} - (values-mapcar fun . lists) -<==> - (values-list (mapcar fun . lists)) -\end{verbatim} - -This would be used with MV-CALL. - - -This scheme seems to provide nearly all of the advantages of both the compiler -and conventional interpretation. The only significant disadvantage with -respect to a conventional interpreter is that there is the one-time overhead of -conversion, but doing this lazily should make this quite acceptable. - -With respect to a conventional interpreter, we have major advantages: - + Full syntax checking: safety comparable to compiled code. - + Semantics similar to compiled code due to code sharing. Similar diagnostic - messages, etc. Reduction of error-prone code duplication. - + Potential for full type checking according to declarations (would require - running IR1 optimize?) - + Simplifies debugger interface, since interpreted code can look more like - compiled code: source paths, edit definition, etc. - -For all non-run-time symbol annotations (anything other than SYMBOL-FUNCTION -and SYMBOL-VALUE), we use the compiler's global database. MACRO-FUNCTION will -use INFO, rather than vice-versa. - -When doing the IR1 phases for the interpreter, we probably want to suppress -optimizations that change user-visible function calls: - -- Don't do local call conversion of any named functions (even lexical ones). - This is so that a call will appear on the stack that looks like the call in - the original source. The keyword and optional argument transformations - done by local call mangle things quite a bit. Also, note local-call - converting prevents unreferenced arguments from being deleted, which is - another non-obvious transformation. - -- Don't run source-transforms, IR1 transforms and IR1 optimizers. This way, - TRACE and BACKTRACE will show calls with the original arguments, rather - than the ``optimized'' form, etc. Also, for the interpreter it will - actually be faster to call the original function (which is compiled) than - to ``inline expand'' it. Also, this allows implementation-dependent - transforms to expand into %PRIMITIVE uses. - -There are some problems with stepping, due to our non-syntactic IR1 -representation. The source path information is the key that makes this -conceivable. We can skip over the stepping of a subform by quietly evaluating -nodes whose source path lies within the form being skipped. - -One problem with determining what value has been returned by a form. With a -function call, it is theoretically possible to precisely determine this, since -if we complete evaluation of the arguments, then we arrive at the Combination -node whose value is synonymous with the value of the form. We can even detect -this case, since the Node-Source will be EQ to the form. And we can also -detect when we unwind out of the evaluation, since we will leave the form -without having ever reached this node. - -But with macros and special-forms, there is no node whose value is the value of -the form, and no node whose source is the macro call or special form. We can -still detect when we leave the form, but we can't be sure whether this was a -normal evaluation result or an explicit RETURN-FROM. - -But does this really matter? It seems that we can print the value returned (if -any), then just print the next form to step. In the rare case where we did -unwind, the user should be able to figure it out. - -[We can look at this as a side-effect of CPS: there isn't any difference -between a ``normal'' return and a non-local one.] - -[Note that in any control transfer (normal or otherwise), the stepper may need -to unwind out of an arbitrary number of levels of stepping. This is because a -form in a TR position may yield its to a node arbitrarily far out.] - -Another problem is with deciding what form is being stepped. When we start -evaluating a node, we dive into code that is nested somewhere down inside that -form. So we actually have to do a loop of asking questions before we do any -evaluation. But what do we ask about? - -If we ask about the outermost enclosing form that is a subform of the last -form that the user said to execute, then we might offer a form that isn't -really evaluated, such as a LET binding list. - -But once again, is this really a problem? It is certainly different from a -conventional stepper, but a pretty good argument could be made that it is -superior. Haven't you ever wanted to skip the evaluation of all the -LET bindings, but not the body? Wouldn't it be useful to be able to skip the -DO step forms? - -All of this assumes that nobody ever wants to step through the guts of a -macroexpansion. This seems reasonable, since steppers are for weenies, and -weenies don't define macros (hence don't debug them). But there are probably -some weenies who don't know that they shouldn't be writing macros. - -We could handle this by finding the ``source paths'' in the expansion of each -macro by sticking some special frob in the source path marking the place where -the expansion happened. When we hit code again that is in the source, then we -revert to the normal source path. Something along these lines might be a good -idea anyway (for compiler error messages, for example). - -The source path hack isn't guaranteed to work quite so well in generated code, -though, since macros return stuff that isn't freshly consed. But we could -probably arrange to win as long as any given expansion doesn't return two EQ -forms. - -It might be nice to have a command that skipped stepping of the form, but -printed the results of each outermost enclosed evaluated subform, i.e. if you -used this on the DO step-list, it would print the result of each new-value -form. I think this is implementable. I guess what you would do is print each -value delivered to a DEST whose source form is the current or an enclosing -form. Along with the value, you would print the source form for the node that -is computing the value. - -The stepper can also have a ``back'' command that ``unskips'' or ``unsteps''. This -would allow the evaluation of forms that are pure (modulo lexical variable -setting) to be undone. This is useful, since in stepping it is common that you -skip a form that you shouldn't have, or get confused and want to restart at -some earlier point. - -What we would do is remember the current node and the values of all local -variables. heap before doing each step or skip action. We can then back up -the state of all lexical variables and the ``program counter''. To make this -work right with set closure variables, we would copy the cell's value, rather -than the value cell itself. - -[To be fair, note that this could easily be done with our current interpreter: -the stepper could copy the environment alists.] - -We can't back up the ``program counter'' when a control transfer leaves the -current function, since this state is implicitly represented in the -interpreter's state, and is discarded when we exit. We probably want to ask -for confirmation before leaving the function to give users a chance to ``unskip'' -the forms in a TR position. - -Another question is whether the conventional stepper is really a good thing to -imitate... How about an editor-based mouse-driven interface? Instead of -``skipping'' and ``stepping'', you would just designate the next form that you -wanted to stop at. Instead of displaying return values, you replace the source -text with the printed representation of the value. - -It would show the ``program counter'' by highlighting the *innermost* form that -we are about to evaluate, i.e. the source form for the node that we are stopped -at. It would probably also be useful to display the start of the form that was -used to designate the next stopping point, although I guess this could be -implied by the mouse position. - - -Such an interface would be a little harder to implement than a dumb stepper, -but it would be much easier to use. [It would be impossible for an evalhook -stepper to do this.] - - -\section{Use of \%PRIMITIVE} - -Note: \verb|%PRIMITIVE| can only be used in compiled code. It is a -trapdoor into the compiler, not a general syntax for accessing -``sub-primitives''. It's main use is in implementation-dependent -compiler transforms. It saves us the effort of defining a ``phony -function'' (that is not really defined), and also allows direct -communication with the code generator through codegen-info arguments. - -Some primitives may be exported from the VM so that \verb|%PRIMITIVE| -can be used to make it explicit that an escape routine or interpreter -stub is assuming an operation is implemented by the compiler. diff --git a/doc/internals/cmu/lowlev.tex b/doc/internals/cmu/lowlev.tex deleted file mode 100644 index e603d84152..0000000000 --- a/doc/internals/cmu/lowlev.tex +++ /dev/null @@ -1,85 +0,0 @@ -\chapter{Memory Management} - -\section{Stacks and Globals} - -\section{Heap Layout} - -\section{Garbage Collection} - -\chapter{Interface to C and Assembler} - - -\section{Linkage Table} - -The linkage table feature is based on how dynamic libraries dispatch. -A table of functions is used which is filled in with the appropriate -code to jump to the correct address. - -For \cmucl{}, this table is stored at -\code{target-foreign-linkage-space-start}. Each entry is -\code{target-foreign-linkage-entry-size} bytes long. - -At startup, the table is initialized with default values in -\code{os\_foreign\_linkage\_init}. On x86 platforms, the first entry is -code to call the routine \code{resolve\_linkage\_tramp}. All other -entries jump to the first entry. The function -\code{resolve\_linkage\_tramp} looks at where it was called from to -figure out which entry in the table was used. It calls -\code{lazy\_resolve\_linkage} with the address of the linkage entry. -This routine then fills in the appropriate linkage entry with code to -jump to where the real routine is located, and returns the address of -the entry. On return, \code{resolve\_linkage\_tramp} then just jumps to -the returned address to call the desired function. On all subsequent -calls, the entry no longer points to \code{resolve\_linkage\_tramp} but -to the real function. - -This describes how function calls are made. For foreign data, -\code{lazy\_resolve\_linkage} stuffs the address of the actual foreign -data into the linkage table. The lisp code then just loads the address -from there to get the actual address of the foreign data. - -For sparc, the linkage table is slightly different. The first entry is -the entry for \code{call\_into\_c} so we never have to look this up. All -other entries are for \code{resolve\_linkage\_tramp}. This has the -advantage that \code{resolve\_linkage\_tramp} can be much simpler since -all calls to foreign code go through \code{call\_into\_c} anyway, and -that means all live Lisp registers have already been saved. Also, to -make life simpler, we lie about \code{closure\_tramp} and -\code{undefined\_tramp} in the Lisp code. These are really functions, -but we treat them as foreign data since these two routines are only -used as addresses in the Lisp code to stuff into a lisp function -header. - -On the Lisp side, there are two supporting data structures for the -linkage table: \code{*linkage-table-data*} and -\code{*foreign-linkage-symbols*}. The latter is a hash table whose key -is the foreign symbol (a string) and whose value is an index into -\code{*linkage-table-data*}. - -\code{*linkage-table-data*} is a vector with an unlispy layout. Each -entry has 3 parts: - -\begin{itemize} -\item symbol name -\item type, a fixnum, 1 = code, 2 = data -\item library list - the library list at the time the symbol is registered. -\end{itemize} - -Whenever a new foreign symbol is defined, a new -\code{*linkage-table-data*} entry is created. -\code{*foreign-linkage-symbols*} is updated with the symbol and the -entry number into \code{*linkage-table-data*}. - -The \code{*linkage-table-data*} is accessed from C (hence the unlispy -layout), to figure out the symbol name and the type so that the -address of the symbol can be determined. The type tells the C code -how to fill in the entry in the linkage-table itself. - -% (Should say something about genesis too, but I don't know how that -% works other than the initial table is setup with the appropriate first -% entry.) - - -\chapter{Low-level debugging} - -\chapter{Core File Format} diff --git a/doc/internals/cmu/object.tex b/doc/internals/cmu/object.tex deleted file mode 100644 index a6a3deafa9..0000000000 --- a/doc/internals/cmu/object.tex +++ /dev/null @@ -1,770 +0,0 @@ -\chapter{Object Format} - - - -\label{sec:tagging} - -\section{Tagging} - -The following is a key of the three bit low-tagging scheme: -\begin{description} - \item[000] even fixnum - \item[001] function pointer - \item[010] even other-immediate (header-words, characters, symbol-value trap value, etc.) - \item[011] list pointer - \item[100] odd fixnum - \item[101] structure pointer - \item[110] odd other immediate - \item[111] other-pointer to data-blocks (other than conses, structures, - and functions) -\end{description} - -This tagging scheme forces a dual-word alignment of data-blocks on the heap, -but this can be pretty negligible: -\begin{itemize} -\item RATIOS and COMPLEX must have a header-word anyway since they are not a - major type. This wastes one word for these infrequent data-blocks since - they require two words for the data. - -\item BIGNUMS must have a header-word and probably contain only one other word - anyway, so we probably don't waste any words here. Most bignums just - barely overflow fixnums, that is by a bit or two. - -\item Single and double FLOATS? - no waste, or - one word wasted - -\item SYMBOLS have a pad slot (current called the setf function, but unused.) -\end{itemize} -Everything else is vector-like including code, so these probably take up -so many words that one extra one doesn't matter. - - - -\section{GC Comments} - -Data-Blocks comprise only descriptors, or they contain immediate data and raw -bits interpreted by the system. GC must skip the latter when scanning the -heap, so it does not look at a word of raw bits and interpret it as a pointer -descriptor. These data-blocks require headers for GC as well as for operations -that need to know how to interpret the raw bits. When GC is scanning, and it -sees a header-word, then it can determine how to skip that data-block if -necessary. Header-Words are tagged as other-immediates. See -``Other-Immediates'', section~\ref{sec:other-immediates} and -``Data-Blocks and Header-Words'', section~\ref{sec:data-blocks-and-header} for comments on -distinguishing header-words from other-immediate data. This distinction is -necessary since we scan through data-blocks containing only descriptors just as -we scan through the heap looking for header-words introducing data-blocks. - -Data-Blocks containing only descriptors do not require header-words for GC -since the entire data-block can be scanned by GC a word at a time, taking -whatever action is necessary or appropriate for the data in that slot. For -example, a cons is referenced by a descriptor with a specific tag, and the -system always knows the size of this data-block. When GC encounters a pointer -to a cons, it can transport it into the new space, and when scanning, it can -simply scan the two words manifesting the cons interpreting each word as a -descriptor. Actually there is no cons tag, but a list tag, so we make sure the -cons is not nil when appropriate. A header may still be desired if the pointer -to the data-block does not contain enough information to adequately maintain -the data-block. An example of this is a simple-vector containing only -descriptor slots, and we attach a header-word because the descriptor pointing -to the vector lacks necessary information -- the type of the vector's elements, -its length, etc. - -There is no need for a major tag for GC forwarding pointers. Since the tag -bits are in the low end of the word, a range check on the start and end of old -space tells you if you need to move the thing. This is all GC overhead. - - - -\section{Structures} - -A structure descriptor has the structure lowtag type code, making -{\tt structurep} a fast operation. A structure -data-block has the following format: -\begin{verbatim} - ------------------------------------------------------- - | length (24 bits) | Structure header type (8 bits) | - ------------------------------------------------------- - | structure type name (a symbol) | - ------------------------------------------------------- - | structure slot 0 | - ------------------------------------------------------- - | ... structure slot length - 2 | - ------------------------------------------------------- -\end{verbatim} - -The header word contains the structure length, which is the number of words -(other than the header word.) The length is always at least one, since the -first word of the structure data is the structure type name. - - -\section{Fixnums} - -A fixnum has one of the following formats in 32 bits: -\begin{verbatim} - ------------------------------------------------------- - | 30 bit 2's complement even integer | 0 0 0 | - ------------------------------------------------------- -\end{verbatim} -or -\begin{verbatim} - ------------------------------------------------------- - | 30 bit 2's complement odd integer | 1 0 0 | - ------------------------------------------------------- -\end{verbatim} - -Effectively, there is one tag for immediate integers, two zeros. This buys one -more bit for fixnums, and now when these numbers index into simple-vectors or -offset into memory, they point to word boundaries on 32-bit, byte-addressable -machines. That is, no shifting need occur to use the number directly as an -offset. - -This format has another advantage on byte-addressable machines when fixnums are -offsets into vector-like data-blocks, including structures. Even though we -previously mentioned data-blocks are dual-word aligned, most indexing and slot -accessing is word aligned, and so are fixnums with effectively two tag bits. - -Two tags also allow better usage of special instructions on some machines that -can deal with two low-tag bits but not three. - -Since the two bits are zeros, we avoid having to mask them off before using the -words for arithmetic, but division and multiplication require special shifting. - - - -\section{Other-immediates} -\label{sec:other-immediates} - - - -As for fixnums, there are two different three-bit lowtag codes for -other-immediate, allowing 64 other-immediate types: -\begin{verbatim} ----------------------------------------------------------------- -| Data (24 bits) | Type (8 bits with low-tag) | 1 0 | ----------------------------------------------------------------- -\end{verbatim} - -The type-code for an other-immediate type is considered to include the two -lowtag bits. This supports the concept of a single ``type code'' namespace for -all descriptors, since the normal lowtag codes are disjoint from the -other-immediate codes. - -For other-pointer objects, the full eight bits of the header type code are used -as the type code for that kind of object. This is why we use two lowtag codes -for other-immediate types: each other-pointer object needs a distinct -other-immediate type to mark its header. - -The system uses the other-immediate format for characters, -the {\tt symbol-value} unbound trap value, and header-words for data-blocks on -the heap. The type codes are laid out to facilitate range checks for common -subtypes; for example, all numbers will have contiguous type codes which are -distinct from the contiguous array type codes. See -section~\ref{sec:data-blocks-and-o-i} -for details. - - -\section{Data-Blocks and Header-Word Format} -\label{sec:data-blocks-and-header} - -Pointers to data-blocks have the following format: -\begin{verbatim} ----------------------------------------------------------------- -| Dual-word address of data-block (29 bits) | 1 1 1 | ----------------------------------------------------------------- -\end{verbatim} - -The word pointed to by the above descriptor is a header-word, and it has the -same format as an other-immediate: -\begin{verbatim} ----------------------------------------------------------------- -| Data (24 bits) | Type (8 bits with low-tag) | 0 1 0 | ----------------------------------------------------------------- -\end{verbatim} -This is convenient for scanning the heap when GC'ing, but it does mean that -whenever GC encounters an other-immediate word, it has to do a range check on -the low byte to see if it is a header-word or just a character (for example). -This is easily acceptable performance hit for scanning. - -The system interprets the data portion of the header-word for non-vector -data-blocks as the word length excluding the header-word. For example, the -data field of the header for ratio and complex numbers is two, one word each -for the numerator and denominator or for the real and imaginary parts. - -For vectors and data-blocks representing Lisp objects stored like vectors, the -system (usually) ignores the data portion of the header-word: -\begin{verbatim} ----------------------------------------------------------------- -| Unused Data (24 bits) | Type (8 bits with low-tag) | 0 1 0 | ----------------------------------------------------------------- -| Element Length of Vector (30 bits) | 0 0 | ----------------------------------------------------------------- -\end{verbatim} - -Using a separate word allows for much larger vectors, and it allows {\tt -length} to simply access a single word without masking or shifting. Similarly, -the header for complex arrays and vectors has a second word, following the -header-word, the system uses for the fill pointer, so computing the length of -any array is the same code sequence. - -For normal Lisp vectors, the data portion MUST be zero. For hash -tables, a vector is used to store information about the hash key and -value, and the data portion is non-zero to indicate to GC that this is -the key/value vector for the hash table. GENCGC uses this to -determine scavenge the key/value pairs correctly. Cheney GC also uses -this to determine if rehashing (for EQ hash tables) is needed. - - -\section{Data-Blocks and Other-immediates Typing} - -\label{sec:data-blocks-and-o-i} -These are the other-immediate types. We specify them including all low eight -bits, including the other-immediate tag, so we can think of the type bits as -one type -- not an other-immediate major type and a subtype. Also, fetching a -byte and comparing it against a constant is more efficient than wasting even a -small amount of time shifting out the other-immediate tag to compare against a -five bit constant. (The current values can be obtained from the -generated \code{internals.h} file.) -\begin{verbatim} - HEX -Number (< 36) - bignum 10 0A - ratio 14 0E - single-float 18 12 - double-float 22 16 - double-double-float 26 1A - complex 30 1E - (complex single-float) 34 22 - (complex double-float) 38 26 - (complex double-double-float) 42 2A - -Array (<= 46 code 118) - Simple-Array (<= 46 code 118) - simple-array 46 2E - Vector (<= 50 code 118) - simple-string 50 32 - simple-bit-vector 54 36 - simple-vector 58 3A - (simple-array (unsigned-byte 2) (*)) 62 3E - (simple-array (unsigned-byte 4) (*)) 66 42 - (simple-array (unsigned-byte 8) (*)) 70 46 - (simple-array (unsigned-byte 16) (*)) 74 4A - (simple-array (unsigned-byte 32) (*)) 78 4E - (simple-array (signed-byte 8) (*)) 82 52 - (simple-array (signed-byte 16) (*)) 86 56 - (simple-array (signed-byte 30) (*)) 90 5A - (simple-array (signed-byte 32) (*)) 94 5E - (simple-array single-float (*)) 98 62 - (simple-array double-float (*)) 102 66 - (simple-array double-double-float (*)) 106 6A - (simple-array (complex single-float) (*) 110 6E - (simple-array (complex double-float) (*) 114 72 - (simple-array (complex double-double) (*) 118 76 - complex-string 122 7A - complex-bit-vector 126 7E - (array * (*)) -- general complex vector. 130 82 - complex-array 134 86 - -code-header-type 138 8A -function-header-type 142 8E -closure-header-type 146 92 -funcallable-instance-header-type 150 96 -byte-code-function-header-type 154 9A -byte-code-closure-header-type 158 9E -closure-function-header-type 162 A2 -return-pc-header-type (a.k.a LRA) 166 A6 -value-cell-header-type 170 AA -symbol-header-type 174 AE -base-character-type 178 B2 -system-area-pointer-type (header type) 182 B6 -unbound-marker 186 BA -weak-pointer-type 190 BE -instance-header-type 194 C2 -fdefn-type 198 C6 -scavenger-hook-type 202 CA -\end{verbatim} - -\section{Strings} - -All strings in the system are C-null terminated. This saves copying the bytes -when calling out to C. The only time this wastes memory is when the string -contains a multiple of eight characters, and then the system allocates two more -words (since Lisp objects are dual-word aligned) to hold the C-null byte. -Since the system will make heavy use of C routines for systems calls and -libraries that save reimplementation of higher level operating system -functionality (such as pathname resolution or current directory computation), -saving on copying strings for C should make C call out more efficient. - -The length word in a string header, see ``Data-Blocks and Header-Word -Format'', section~\ref{sec:data-blocks-and-header}, counts only the characters truly in the Common Lisp string. -Allocation and GC will have to know to handle the extra C-null byte, and GC -already has to deal with rounding up various objects to dual-word alignment. - - - -\section{Symbols and NIL} - -Symbol data-block has the following format: -\begin{verbatim} -------------------------------------------------------- -| 5 (data-block words) | Symbol Type (8 bits) | -------------------------------------------------------- -| Value Descriptor | -------------------------------------------------------- -| Hash Value (x86/amd64/sparc) Unused (other arch.) | -------------------------------------------------------- -| Property List | -------------------------------------------------------- -| Print Name | -------------------------------------------------------- -| Package | -------------------------------------------------------- -\end{verbatim} - -All of these slots are self-explanatory given what symbols must do in Common -Lisp. - -The issues with nil are that we want it to act like a symbol, and we need list -operations such as CAR and CDR to be fast on it. CMU Common Lisp solves this -by putting nil as the first object in static space, where other global values -reside, so it has a known address in the system: -\begin{verbatim} -------------------------------------------------------- <-- space -| 6 (data-block words) | 0 | start -------------------------------------------------------- -| 0 (data-block words) | Symbol Type (8 bits) | -------------------------------------------------------- <-- nil -| Value/CAR | -------------------------------------------------------- -| Hash Value/CDR | -------------------------------------------------------- -| Property List | -------------------------------------------------------- -| Print Name | -------------------------------------------------------- -| Package | -------------------------------------------------------- -| ... | -------------------------------------------------------- -\end{verbatim} -In addition, we make the list typed pointer to nil actually point past the -header word of the nil symbol data-block. This has usefulness explained below. -The value and hash-value of nil are nil. Therefore, any reference to nil used -as a list has quick list type checking, and CAR and CDR can go right through -the first and second words as if nil were a cons object. - -When there is a reference to nil used as a symbol, the system adds offsets to -the address the same as it does for any symbol. This works due to a -combination of nil pointing past the symbol header-word and the chosen list and -other-pointer type tags. The list type tag is four less than the other-pointer -type tag, but nil points four additional bytes into its symbol data-block. - - - -\section{Array Headers} - -The array-header data-block has the following format: -\begin{verbatim} ----------------------------------------------------------------- -| Header Len (24 bits) = Array Rank +6 | Array Type (8 bits) | ----------------------------------------------------------------- -| Fill Pointer (30 bits) | 0 0 | ----------------------------------------------------------------- -| Fill Pointer p (29 bits) -- t or nil | 1 1 1 | ----------------------------------------------------------------- -| Available Elements (30 bits) | 0 0 | ----------------------------------------------------------------- -| Data Vector (29 bits) | 1 1 1 | ----------------------------------------------------------------- -| Displacement (30 bits) | 0 0 | ----------------------------------------------------------------- -| Displacedp (29 bits) -- t or nil | 1 1 1 | ----------------------------------------------------------------- -| Range of First Index (30 bits) | 0 0 | ----------------------------------------------------------------- - . - . - . - -\end{verbatim} -The array type in the header-word is one of the eight-bit patterns from -``Data-Blocks and Other-immediates Typing'', section~\ref{sec:data-blocks-and-header}, indicating that this is a complex -string, complex vector, complex bit-vector, or a multi-dimensional array. The -data portion of the other-immediate word is the length of the array header -data-block. Due to its format, its length is always six greater than the -array's number of dimensions. The following words have the following -interpretations and types: -\begin{description} - \item[Fill Pointer:] - This is a fixnum indicating the number of elements in the data vector - actually in use. This is the logical length of the array, and it is - typically the same value as the next slot. This is the second word, so - LENGTH of any array, with or without an array header, is just four bytes - off the pointer to it. - \item[Fill Pointer P:] - This is either T or NIL and indicates whether the array uses the - fill-pointer or not. - \item[Available Elements:] - This is a fixnum indicating the number of elements for which there is - space in the data vector. This is greater than or equal to the logical - length of the array when it is a vector having a fill pointer. - \item[Data Vector:] - This is a pointer descriptor referencing the actual data of the array. - This a data-block whose first word is a header-word with an array type as - described in ``Data-Blocks and Header-Word Format'', section~\ref{sec:data-blocks-and-header} and - ``Data-Blocks and Other-immediates Typing'', section~\ref{sec:data-blocks-and-o-i} - \item[Displacement:] - This is a fixnum added to the computed row-major index for any array. - This is typically zero. - \item[Displacedp:] - This is either t or nil. This is separate from the displacement slot, so - most array accesses can simply add in the displacement slot. The rare - need to know if an array is displaced costs one extra word in array - headers which probably aren't very frequent anyway. - \item[Range of First Index:] - This is a fixnum indicating the number of elements in the first dimension - of the array. Legal index values are zero to one less than this number - inclusively. IF the array is zero-dimensional, this slot is - non-existent. - \item[... (remaining slots):] - There is an additional slot in the header for each dimension of the - array. These are the same as the Range of First Index slot. -\end{description} - - -\section{Bignums} - -Bignum data-blocks have the following format: -\begin{verbatim} -------------------------------------------------------- -| Length (24 bits) | Bignum Type (8 bits) | -------------------------------------------------------- -| least significant bits | -------------------------------------------------------- - . - . - . -\end{verbatim} -The elements contain the two's complement representation of the integer with -the least significant bits in the first element or closer to the header. The -sign information is in the high end of the last element. - - - - -\section{Code Data-Blocks} - -A code data-block is the run-time representation of a ``component''. A component -is a connected portion of a program's flow graph that is compiled as a single -unit, and it contains code for many functions. Some of these functions are -callable from outside of the component, and these are termed ``entry points''. - -Each entry point has an associated user-visible function data-block (of type -{\tt function}). The full call convention provides for calling an entry point -specified by a function object. - -Although all of the function data-blocks for a component's entry points appear -to the user as distinct objects, the system keeps all of the code in a single -code data-block. The user-visible function object is actually a pointer into -the middle of a code data-block. This allows any control transfer within a -component to be done using a relative branch. - -Besides a function object, there are other kinds of references into the middle -of a code data-block. Control transfer into a function also occurs at the -return-PC for a call. The system represents a return-PC somewhat similarly to -a function, so GC can also recognize a return-PC as a reference to a code -data-block. This representation is known as a Lisp Return Address (LRA). - -It is incorrect to think of a code data-block as a concatenation of ``function -data-blocks''. Code for a function is not emitted in any particular order with -respect to that function's function-header (if any). The code following a -function-header may only be a branch to some other location where the -function's ``real'' definition is. - - -The following are the three kinds of pointers to code data-blocks: -\begin{description} - \item[Code pointer (labeled A below):] - A code pointer is a descriptor, with other-pointer low-tag bits, pointing - to the beginning of the code data-block. The code pointer for the - currently running function is always kept in a register (CODE). In - addition to allowing loading of non-immediate constants, this also serves - to represent the currently running function to the debugger. - \item[LRA (labeled B below):] - The LRA is a descriptor, with other-pointer low-tag bits, pointing - to a location for a function call. Note that this location contains no - descriptors other than the one word of immediate data, so GC can treat - LRA locations the same as instructions. - \item[Function (labeled C below):] - A function is a descriptor, with function low-tag bits, that is user - callable. When a function header is referenced from a closure or from - the function header's self-pointer, the pointer has other-pointer low-tag - bits, instead of function low-tag bits. This ensures that the internal - function data-block associated with a closure appears to be uncallable - (although users should never see such an object anyway). - - Information about functions that is only useful for entry points is kept - in some descriptors following the function's self-pointer descriptor. - All of these together with the function's header-word are known as the - ``function header''. GC must be able to locate the function header. We - provide for this by chaining together the function headers in a NIL - terminated list kept in a known slot in the code data-block. -\end{description} - -A code data-block has the following format: -\begin{verbatim} -A --> -**************************************************************** -| Header-Word count (24 bits) | Code-Type (8 bits) | ----------------------------------------------------------------- -| Number of code words (fixnum tag) | ----------------------------------------------------------------- -| Pointer to first function header (other-pointer tag) | ----------------------------------------------------------------- -| Debug information (structure tag) | ----------------------------------------------------------------- -| First constant (a descriptor) | ----------------------------------------------------------------- -| ... | ----------------------------------------------------------------- -| Last constant (and last word of code header) | ----------------------------------------------------------------- -| Some instructions (non-descriptor) | ----------------------------------------------------------------- -| (pad to dual-word boundary if necessary) | - -B --> -**************************************************************** -| Word offset from code header (24) | Return-PC-Type (8) | ----------------------------------------------------------------- -| First instruction after return | ----------------------------------------------------------------- -| ... more code and LRA header-words | ----------------------------------------------------------------- -| (pad to dual-word boundary if necessary) | - -C --> -**************************************************************** -| Offset from code header (24) | Function-Header-Type (8) | ----------------------------------------------------------------- -| x86/amd64/sparc: Address of start of instructions for | -| function (non-descriptor) | -| other architectures: | -| Self-pointer back to previous word (with other-pointer tag) | ----------------------------------------------------------------- -| Pointer to next function (other-pointer low-tag) or NIL | ----------------------------------------------------------------- -| Function name (a string or a symbol) | ----------------------------------------------------------------- -| Function debug arglist (a string) | ----------------------------------------------------------------- -| Function type (a list-style function type specifier) | ----------------------------------------------------------------- -| Start of instructions for function (non-descriptor) | ----------------------------------------------------------------- -| More function headers and instructions and return PCs, | -| until we reach the total size of header-words + code | -| words. | ----------------------------------------------------------------- -\end{verbatim} - -The following are detailed slot descriptions: -\begin{description} - \item[Code data-block header-word:] - The immediate data in the code data-block's header-word is the number of - leading descriptors in the code data-block, the fixed overhead words plus - the number of constants. The first non-descriptor word, some code, - appears at this word offset from the header. - \item[Number of code words:] - The total number of non-header-words in the code data-block. The total - word size of the code data-block is the sum of this slot and the - immediate header-word data of the previous slot. - header-word. - \item[Pointer to first function header:] - A NIL-terminated list of the function headers for all entry points to - this component. - \item[Debug information:] - The DEBUG-INFO structure describing this component. All information that - the debugger wants to get from a running function is kept in this - structure. Since there are many functions, the current PC is used to - locate the appropriate debug information. The system keeps the debug - information separate from the function data-block, since the currently - running function may not be an entry point. There is no way to recover - the function object for the currently running function, since this - data-block may not exist. - \item[First constant ... last constant:] - These are the constants referenced by the component, if there are any. -\vspace{1ex} - \item[LRA header word:] - The immediate header-word data is the word offset from the enclosing code - data-block's header-word to this word. This allows GC and the debugger - to easily recover the code data-block from an LRA. The code at the - return point restores the current code pointer using a subtract immediate - of the offset, which is known at compile time. -\vspace{1ex} - \item[Function entry point header-word:] - The immediate header-word data is the word offset from the enclosing code - data-block's header-word to this word. This is the same as for the - return-PC header-word. - \item[Address of start of instructions for function:] This is - implemented on x86, amd64, and sparc only. In a non-closure - function, this address allows the call sequence to always - indirect through the second word in a user callable function. - See section ``Closure Format''. With a closure, indirecting - through the second word also gets you the start of instructions - of a function. This pointer is a raw address, not a descriptor. - \item[Self-pointer back to header-word:] - In a non-closure function, this self-pointer to the previous header-word - allows the call sequence to always indirect through the second word in a - user callable function. See section ``Closure Format''. With a closure, - indirecting through the second word gets you a function header-word. The - system ignores this slot in the function header for a closure, since it - has already indirected once, and this slot could be some random thing - that causes an error if you jump to it. This pointer has an - other-pointer tag instead of a function pointer tag, indicating it is not - a user callable Lisp object. - \item[Pointer to next function:] - This is the next link in the thread of entry point functions found in - this component. This value is NIL when the current header is the last - entry point in the component. - \item[Function name:] - This function's name (for printing). If the user defined this function - with DEFUN, then this is the defined symbol, otherwise it is a - descriptive string. - \item[Function debug arglist:] - A printed string representing the function's argument list, for human - readability. If it is a macroexpansion function, then this is the - original DEFMACRO arglist, not the actual expander function arglist. - \item[Function type:] - A list-style function type specifier representing the argument signature - and return types for this function. For example, - \begin{verbatim} -(function (fixnum fixnum fixnum) fixnum) - \end{verbatim} - or - \begin{verbatim} -(function (string &key (:start unsigned-byte)) string) - \end{verbatim} - This information is intended for machine readablilty, such as by the - compiler. -\end{description} - - -\section{Closure Format} - -A closure data-block has the following format: -\begin{verbatim} ----------------------------------------------------------------- -| Word size (24 bits) | Closure-Type (8 bits) | ----------------------------------------------------------------- -| Pointer to function header (other-pointer low-tag) | ----------------------------------------------------------------- -| . | -| Environment information | -| . | ----------------------------------------------------------------- -\end{verbatim} - -A closure descriptor has function low-tag bits. This means that a descriptor -with function low-tag bits may point to either a function header or to a -closure. The idea is that any callable Lisp object has function low-tag bits. -Insofar as call is concerned, we make the format of closures and non-closure -functions compatible. This is the reason for the self-pointer in a function -header. Whenever you have a callable object, you just jump through the second -word, offset some bytes, and go. - - - -\section{Function call} - -Due to alignment requirements and low-tag codes, it is not possible to use a -hardware call instruction to compute the LRA. Instead the LRA -for a call is computed by doing an add-immediate to the start of the code -data-block. - -An advantage of using a single data-block to represent both the descriptor and -non-descriptor parts of a function is that both can be represented by a -single pointer. This reduces the number of memory accesses that have to be -done in a full call. For example, since the constant pool is implicit in an -LRA, a call need only save the LRA, rather than saving both the -return PC and the constant pool. - - - -\section{Memory Layout} - -\cmucl{} has four spaces, read-only, static, dynamic-0, and dynamic-1. -Read-only contains objects that the system never modifies, moves, or reclaims. -Static space contains some global objects necessary for the system's runtime or -performance (since they are located at a known offset at a known address), and -the system never moves or reclaims these. However, GC does need to scan static -space for references to moved objects. Dynamic-0 and dynamic-1 are the two -heap areas for stop-and-copy GC algorithms. - -What global objects are at the head of static space??? -\begin{verbatim} - NIL - eval::*top-of-stack* - lisp::*current-catch-block* - lisp::*current-unwind-protect* - FLAGS (RT only) - BSP (RT only) - HEAP (RT only) -\end{verbatim} - -In addition to the above spaces, the system has a control stack, binding stack, -and a number stack. The binding stack contains pairs of descriptors, a symbol -and its previous value. The number stack is the same as the C stack, and the -system uses it for non-Lisp objects such as raw system pointers, saving -non-Lisp registers, parts of bignum computations, etc. - - - -\section{System Pointers} - -The system pointers reference raw allocated memory, data returned by foreign -function calls, etc. The system uses these when you need a pointer to a -non-Lisp block of memory, using an other-pointer. This provides the greatest -flexibility by relieving contraints placed by having more direct references -that require descriptor type tags. - -A system area pointer data-block has the following format: -\begin{verbatim} -------------------------------------------------------- -| 1 (data-block words) | SAP Type (8 bits) | -------------------------------------------------------- -| system area pointer | -------------------------------------------------------- -\end{verbatim} - -``SAP'' means ``system area pointer'', and much of our code contains this naming -scheme. We don't currently restrict system pointers to one area of memory, but -if they do point onto the heap, it is up to the user to prevent being screwed -by GC or whatever. - -\section{Weak Pointers} -\label{sec:weak-pointers} - -A weak-pointer data-block has the following format: -\begin{verbatim} -------------------------------------------------------- -| 4 (data-block words) | Weak pointer Type (8 bits) | -------------------------------------------------------- -| weak-pointer-value | -------------------------------------------------------- -| weak-pointer-broken | -------------------------------------------------------- -| mark-bit (T or NIL) | -------------------------------------------------------- -| next | -------------------------------------------------------- -\end{verbatim} - -The mark-bit is used when gencgc is available. It's used to note if -this weak pointer has been visited before so that scavenging -weak-pointers isn't an $O(n^2)$ process. - -The last slot is an internal slot used by the C runtime to chain all -the weak pointers together for GC. - diff --git a/doc/internals/cmu/run-time.tex b/doc/internals/cmu/run-time.tex deleted file mode 100644 index 4499cbf26f..0000000000 --- a/doc/internals/cmu/run-time.tex +++ /dev/null @@ -1,8 +0,0 @@ -\part{Run-Time System} - -\input{environment} -\input{interpreter} -\input{debugger} -\input{object} -\input{lowlev} -\input{fasl} From 4499925f70dc701e4f89d644baba2640632f86c4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 27 Aug 2022 16:08:34 -0400 Subject: [PATCH 3886/4023] Remove unused variable Rev a42922aef9 redefined it from literal 104 to $EXIT_TEST_WIN which is the same, but left no use of it, yet kept it anyway. --- tests/foreign.test.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/foreign.test.sh b/tests/foreign.test.sh index 35fb3cd792..b0d292b6e9 100755 --- a/tests/foreign.test.sh +++ b/tests/foreign.test.sh @@ -23,11 +23,6 @@ use_test_subdirectory echo //entering foreign.test.sh -# simple way to make sure we're not punting by accident: -# setting PUNT to anything other than 104 will make non-dlopen -# and non-linkage-table platforms fail this -PUNT=$EXIT_TEST_WIN - ## Make some shared object files to test with. build_so() ( From 3b554332ae4312acdfba787a3e4a086b0eccb573 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 27 Aug 2022 19:51:03 -0400 Subject: [PATCH 3887/4023] Workaround a pseudo-static-generation annoyance I can't tell you how many times I've been thwarted by the fact that tests which expect a symbol formerly in some package to become heap-graph-wise unreachable ater UNINTERNing can't reliably work, because of our GC. So this takes care of a particular case that was bugging me. --- src/code/target-package.lisp | 24 +++++++++++++++------ tests/unintern.impure.lisp | 42 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 tests/unintern.impure.lisp diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index a2a7c97273..4e19fb982b 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -897,13 +897,23 @@ Experimental: interface subject to change." (flet ((tune-table-size (table) ;; The APROPOS-LIST R/O scan optimization is inadmissible if no R/O space #-darwin-jit (setf (package-hashtable-modified table) nil) - (resize-package-hashtable - table - (round (* (/ +package-rehash-threshold+ - +package-hashtable-image-load-factor+) - (- (package-hashtable-size table) - (package-hashtable-free table) - (package-hashtable-deleted table))))))) + ;; This is some cringeworthy logic but it solves a problem that has baffled + ;; me so many times that I can't even. See the test 'unintern.impure.lisp' + (let ((ct (- (package-hashtable-size table) + (package-hashtable-free table) + (package-hashtable-deleted table)))) + (cond ((zerop ct) + (aver (notany #'symbolp (package-hashtable-cells table))) + (setf (package-hashtable-cells table) #(0 0 0) ; literal is OK ! + ;; the secret to reconstructing on next use: it has 0 free cells + (package-hashtable-free table) 0 + (package-hashtable-size table) 2 + (package-hashtable-deleted table) 0)) + (t + (resize-package-hashtable + table + (round (* (/ +package-rehash-threshold+ + +package-hashtable-image-load-factor+) ct)))))))) (dolist (package (list-all-packages)) (tune-table-size (package-internal-symbols package)) (tune-table-size (package-external-symbols package))))) diff --git a/tests/unintern.impure.lisp b/tests/unintern.impure.lisp new file mode 100644 index 0000000000..fe032cc897 --- /dev/null +++ b/tests/unintern.impure.lisp @@ -0,0 +1,42 @@ +;;; Consider that the CL-USER package (among others) starts out as empty. +;;; So the table-cells are #(0 0 0). Then perform the following operations: +;;; * (intern "X") ; cells => #(0 X 0) +;;; * (intern "Y") ; cells => #(Y X 0) +;;; * (intern "Z") ; cells => #(Z 0 X 0 Y 0 0) +;;; unintern writes a tombstone as required by open-addressing tables +;;; * (unintern 'z) ; cells => #(-1 0 X 0 Y 0 0) +;;; and now you can try to unintern X and Y until you're blue in the face, +;;; but you CAN NOT convince a finalizer attached to either one to execute, +;;; because the initial table holding 2 symbols is in +PSEUDO-STATIC-GENERATION+. +;;; We can't 0-fill symbol vectors because FIND-SYMBOL is lock-free +;;; sans hazard pointers, and we don't want symbols to seem to transiently turn +;;; nonexistent when up-sizing a table. + +;;; But it is so incredibly confusing and unintuitive that playing around +;;; with intern/unintern does not have the effect of letting go of strong references +;;; to symbols in initially empty packages. Granted this is a particular edge case. +;;; The GC limitation is actually far more pervasive, extending to hash-tables +;;; and everything else. But empty packages are excruciatingly and visibly +;;; badly behaved. + +;;; CL-USER's internals aren't empty, merely because of READINg this file. +;;; So use the externals, of which there should be none. +(defun extern (name) + (let ((s (make-symbol name)) + (p *package*)) + (sb-impl::add-symbol (sb-impl::package-external-symbols *package*) s) + (sb-impl::%set-symbol-package s p) + s)) + +(with-test (:name :empty-package-starts-with-readonly-tables) + (extern "X") + (extern "Y") + (extern "Z") + (let ((wps (mapcar (lambda (name) (make-weak-pointer (find-symbol name))) + '("X" "Y" "Z")))) + (unintern (find-symbol "Z")) + (unintern (find-symbol "X")) + (unintern (find-symbol "Y")) + (sb-sys:scrub-control-stack) + (gc) + (assert (< (count-if #'weak-pointer-value wps) 3)))) From 199f85256909eb95d342925d2d0298495efdbe62 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes <csr21@cantab.net> Date: Tue, 30 Aug 2022 10:20:00 +0100 Subject: [PATCH 3888/4023] 2.2.8: will be tagged as "sbcl-2.2.8" --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index f856aad298..18ed320b36 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,5 @@ ;;;; -*- coding: utf-8; fill-column: 78 -*- -changes relative to sbcl-2.2.7: +changes in sbcl-2.2.8 relative to sbcl-2.2.7: * minor incompatible change: support for 32-bit x86/Darwin has been removed. * bug fix: fix miscompilation related to empty infinite loops preceded by conditional expressions. (lp#1986810, reported by Artyom Bologov) From 38a6cbcfc834b2453a339c704a5044433b41195e Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 26 Aug 2022 18:04:57 +0300 Subject: [PATCH 3889/4023] Don't restore spilled registers after calling a NIL function. It doesn't return. --- src/compiler/pack.lisp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/compiler/pack.lisp b/src/compiler/pack.lisp index d40ebcec63..fece7c8fb0 100644 --- a/src/compiler/pack.lisp +++ b/src/compiler/pack.lisp @@ -551,14 +551,26 @@ ;;; appropriate. This is also called by SPILL-AND-PACK-LOAD-TN. (defun basic-save-tn (tn vop) (declare (type tn tn) (type vop vop)) - (let ((save (tn-save-tn tn))) - (cond ((and save (eq (tn-kind save) :save-once)) - (restore-single-writer-tn tn vop)) - ((save-single-writer-tn tn) - (restore-single-writer-tn tn vop)) - (t - (save-complex-writer-tn tn vop)))) - (values)) + (let* ((save (tn-save-tn tn)) + (node (vop-node vop))) + (flet ((restore () + (not + (and (sb-c::combination-p node) + ;; Don't restore if the function doesn't return. + (let ((type (sb-c::lvar-fun-type (sb-c::combination-fun node)))) + (and (fun-type-p type) + (eq (sb-kernel:fun-type-returns type) *empty-type*))) + (or + (sb-c::combination-fun-info node) + (policy node (zerop safety))))))) + (cond ((and save (eq (tn-kind save) :save-once)) + (when (restore) + (restore-single-writer-tn tn vop))) + ((save-single-writer-tn tn) + (when (restore) + (restore-single-writer-tn tn vop))) + (t + (save-complex-writer-tn tn vop)))))) ;;; Scan over the VOPs in BLOCK, emiting saving code for TNs noted in ;;; the codegen info that are packed into saved SCs. From 201fee175c337b0891e9d99916559547720c2f20 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 26 Aug 2022 18:06:46 +0300 Subject: [PATCH 3890/4023] Don't type-check for vector in FILL-POINTER. Calling FILL-POINTER-ERROR can report both when the argument is not a vector and when it has no fill-pointer. --- src/code/array.lisp | 6 ++---- src/compiler/array-tran.lisp | 8 ++++++++ tests/package-locks.impure.lisp | 8 ++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index d34bc7f55b..9d7c165534 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -1124,13 +1124,11 @@ of specialized arrays is supported." :format-control "~S is not an array with a fill pointer." :format-arguments (list vector))) -(declaim (inline fill-pointer)) + (defun fill-pointer (vector) "Return the FILL-POINTER of the given VECTOR." (declare (explicit-check)) - (if (array-has-fill-pointer-p vector) - (%array-fill-pointer vector) - (fill-pointer-error vector))) + (fill-pointer vector)) (defun %set-fill-pointer (vector new) (declare (explicit-check)) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index 32ab5e06f5..38a6a5d229 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -1559,6 +1559,14 @@ `(logtest (get-header-data array) (ash sb-vm:+array-fill-pointer-p+ sb-vm:array-flags-data-position))))))) +(define-source-transform fill-pointer (vector) + (let ((vector-sym (gensym "VECTOR"))) + `(let ((,vector-sym ,vector)) + (if (and (array-header-p ,vector-sym) + (array-has-fill-pointer-p ,vector-sym)) + (%array-fill-pointer ,vector-sym) + (sb-vm::fill-pointer-error ,vector-sym))))) + (deftransform %check-bound ((array dimension index) ((simple-array * (*)) t t)) (let ((array-ref (lvar-uses array)) (index-ref (lvar-uses index))) diff --git a/tests/package-locks.impure.lisp b/tests/package-locks.impure.lisp index 75b011cb7b..641c0a56e7 100644 --- a/tests/package-locks.impure.lisp +++ b/tests/package-locks.impure.lisp @@ -567,18 +567,18 @@ (with-test (:name :compile-time-defun-package-locked) ;; Make sure compile-time side-effects of DEFUN are protected against. - (let ((inline-lambda (function-lambda-expression #'fill-pointer))) + (let ((inline-lambda (function-lambda-expression #'adjustable-array-p))) ;; Make sure it's actually inlined... (assert inline-lambda) (assert (eq :ok (handler-case - (ctu:file-compile `((defun fill-pointer (x) x))) + (ctu:file-compile `((defun adjustable-array-p (x) x))) (sb-ext:symbol-package-locked-error (e) - (when (eq 'fill-pointer + (when (eq 'adjustable-array-p (sb-ext:package-locked-error-symbol e)) :ok))))) (assert (equal inline-lambda - (function-lambda-expression #'fill-pointer))))) + (function-lambda-expression #'adjustable-array-p))))) (with-test (:name :compile-time-defclass-package-locked) ;; Compiling (DEFCLASS FTYPE ...) used to break SBCL, but the package From 75d5aaf7b82f3169edb1a76ff7568d8685725560 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 29 Aug 2022 18:01:50 +0300 Subject: [PATCH 3891/4023] arm64: implement test-header-data-bit. No shifting needed compared to get-header-data+logtest. --- src/compiler/arm64/system.lisp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/compiler/arm64/system.lisp b/src/compiler/arm64/system.lisp index 840c84d413..b061d39a7f 100644 --- a/src/compiler/arm64/system.lisp +++ b/src/compiler/arm64/system.lisp @@ -118,6 +118,21 @@ (inst orr t1 t1 (logical-mask (ash (tn-value data) n-widetag-bits))))) (storew t1 x 0 other-pointer-lowtag))) +(define-vop () + (:translate test-header-data-bit) + (:policy :fast-safe) + (:args (array :scs (descriptor-reg))) + (:info mask) + (:arg-types t (:constant t)) + (:conditional :ne) + (:generator 1 + (let ((byte 1)) + (when (> mask #xff) + (setf mask (ash mask -8)) + (setf byte 2)) + (inst ldrb tmp-tn (@ array (- byte other-pointer-lowtag))) + (inst tst tmp-tn mask)))) + (define-vop (pointer-hash) (:translate pointer-hash) (:args (ptr :scs (any-reg descriptor-reg))) From aef21dffbf87d32658d88146f68816fe74347e1f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 30 Aug 2022 18:04:56 +0300 Subject: [PATCH 3892/4023] Always use test-header-data-bit. And transform it to logtest when there's no VOP. --- src/code/array.lisp | 3 +-- src/code/format.lisp | 10 +++++----- src/code/icf.lisp | 5 +++-- src/code/save.lisp | 5 +++-- src/cold/build-order.lisp-expr | 2 +- src/compiler/arm64/system.lisp | 5 +++-- src/compiler/array-tran.lisp | 11 ++++++----- src/interpreter/eval.lisp | 4 ++-- 8 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index 9d7c165534..c75c2bb982 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -1912,5 +1912,4 @@ function to be removed without further warning." (defun weak-vector-p (x) (and (simple-vector-p x) - #+(or x86 x86-64) (test-header-data-bit x (ash vector-weak-flag array-flags-data-position)) - #-(or x86 x86-64) (logtest (get-header-data x) (ash vector-weak-flag array-flags-data-position)))) + (test-header-data-bit x (ash vector-weak-flag array-flags-data-position)))) diff --git a/src/code/format.lisp b/src/code/format.lisp index ce10ee8c57..2e01c6df38 100644 --- a/src/code/format.lisp +++ b/src/code/format.lisp @@ -31,11 +31,11 @@ `(combine-directives (%tokenize-control-string string 0 (length string) nil) t))) - (if (logtest (get-header-data string) - ;; shareable = readonly - (ash (logior sb-vm:+vector-shareable+ - sb-vm:+vector-shareable-nonstd+) - sb-vm:array-flags-data-position)) + (if (test-header-data-bit string + ;; shareable = readonly + (ash (logior sb-vm:+vector-shareable+ + sb-vm:+vector-shareable-nonstd+) + sb-vm:array-flags-data-position)) (memoize (compute-it)) (compute-it)))) diff --git a/src/code/icf.lisp b/src/code/icf.lisp index 3fbdf1e9b5..705d242a45 100644 --- a/src/code/icf.lisp +++ b/src/code/icf.lisp @@ -85,8 +85,9 @@ (do-referenced-object (object rewrite) (simple-vector :extend - (when (and (logtest (get-header-data object) vector-addr-hashing-flag) - touchedp) + (when (and touchedp + (test-header-data-bit object (ash vector-addr-hashing-flag + array-flags-data-position))) (setf (svref object 1) 1))) (code-component :override diff --git a/src/code/save.lisp b/src/code/save.lisp index cf70f5bb3c..726bd93f03 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -482,8 +482,9 @@ sufficiently motivated to do lengthy fixes." (sb-vm:do-referenced-object (obj examine) (simple-vector :extend - (when (and written (logtest sb-vm:vector-addr-hashing-flag - (get-header-data obj))) + (when (and written (test-header-data-bit obj + (ash sb-vm:vector-addr-hashing-flag + sb-vm:array-flags-data-position))) (setf (svref obj 1) 1)))))))))) ; set need-to-rehash sb-c:: diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index 350ca3301f..f09b645ba5 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -370,7 +370,6 @@ ("src/compiler/constraint") ("src/compiler/equality-constraints") - ("src/compiler/array-tran") ("src/compiler/saptran") ("src/compiler/modarith") ("src/compiler/sxhash") @@ -409,6 +408,7 @@ ;; this file defines the INTERVAL struct which is also used in 'srctran' ("src/compiler/float-tran") + ("src/compiler/array-tran") ("src/compiler/ir1final") ("src/compiler/generic/vm-tran") ("src/compiler/type-vop-macros") diff --git a/src/compiler/arm64/system.lisp b/src/compiler/arm64/system.lisp index b061d39a7f..18165b0cc8 100644 --- a/src/compiler/arm64/system.lisp +++ b/src/compiler/arm64/system.lisp @@ -128,8 +128,9 @@ (:generator 1 (let ((byte 1)) (when (> mask #xff) - (setf mask (ash mask -8)) - (setf byte 2)) + (aver (zerop (ldb (byte 8 0) mask))) + (setf mask (ash mask -8) + byte 2)) (inst ldrb tmp-tn (@ array (- byte other-pointer-lowtag))) (inst tst tmp-tn mask)))) diff --git a/src/compiler/array-tran.lisp b/src/compiler/array-tran.lisp index 38a6a5d229..b0177f6880 100644 --- a/src/compiler/array-tran.lisp +++ b/src/compiler/array-tran.lisp @@ -1532,6 +1532,10 @@ (t `(%array-available-elements array))))) +(unless-vop-existsp (:translate test-header-data-bit) + (define-source-transform test-header-data-bit (array mask) + `(logtest (get-header-data ,array) ,mask))) + ;;; Any array can be tested for a fill-pointer now, using the header bit. ;;; Only a non-simple vector could possibly return true. ;;; If the input is known simple, we have to avoid doing the logtest because there's @@ -1553,11 +1557,8 @@ ;; the CONSTRAINT-PROPAGATE-IF optimizer have the most ;; chances to run. (delay-ir1-transform node :ir1-phases)) - (if (vop-existsp :named test-header-data-bit) - `(test-header-data-bit array - (ash sb-vm:+array-fill-pointer-p+ sb-vm:array-flags-data-position)) - `(logtest (get-header-data array) - (ash sb-vm:+array-fill-pointer-p+ sb-vm:array-flags-data-position))))))) + `(test-header-data-bit array + (ash sb-vm:+array-fill-pointer-p+ sb-vm:array-flags-data-position)))))) (define-source-transform fill-pointer (vector) (let ((vector-sym (gensym "VECTOR"))) diff --git a/src/interpreter/eval.lisp b/src/interpreter/eval.lisp index 587897351c..abb3bb8fab 100644 --- a/src/interpreter/eval.lisp +++ b/src/interpreter/eval.lisp @@ -113,8 +113,8 @@ ;; CLHS 3.1.2.1.2.1 Special Forms ;; Pick off special forms first for speed. Special operators ;; can't be shadowed by local defs. - ((logtest (get-header-data fname) +special-op-symbol+) - (cond ((or (logtest (get-header-data fname) +simple-special-op+) + ((test-header-data-bit fname +special-op-symbol+) + (cond ((or (test-header-data-bit fname +simple-special-op+) (eq sb-ext:*evaluator-mode* :interpret)) (let ((handler (cdr (special-form-handler fname)))) ; immediate handler (if (functionp handler) From 443396f313d321ea9cb8abb1bb5e51d8b7ad67ef Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 30 Aug 2022 20:54:48 -0400 Subject: [PATCH 3893/4023] x86-64: Use inc/dec for add/sub of 1 unless carry flag is tested in the next instruction. --- src/code/x86-64-simd.lisp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/code/x86-64-simd.lisp b/src/code/x86-64-simd.lisp index de8046b3c1..451490035c 100644 --- a/src/code/x86-64-simd.lisp +++ b/src/code/x86-64-simd.lisp @@ -119,7 +119,7 @@ (inst add right 8) BYTE - (inst sub right 1) + (inst dec right) (inst cmp right left) (inst jmp :b DONE) @@ -132,8 +132,8 @@ (inst mov :byte r (ea right)) (inst mov :byte (ea left) r) (inst mov :byte (ea right) l) - (inst add left 1) - (inst sub right 1) + (inst inc left) + (inst dec right) (inst cmp left right) (inst jmp :ge DONE)) DONE)) @@ -231,7 +231,7 @@ (inst add left 8) BYTE - (inst sub right 1) + (inst dec right) (inst cmp right left) (inst jmp :b DONE) @@ -241,8 +241,8 @@ (inst mov :byte r (ea right)) (inst mov :byte (ea left) r) (inst mov :byte (ea right) l) - (inst add left 1) - (inst sub right 1) + (inst inc left) + (inst dec right) (inst cmp left right) (inst jmp :ge DONE)) @@ -417,7 +417,7 @@ do (inst mov :byte g (ea source s-i)) (inst mov :byte (ea target t-i) g) - (inst add t-i 1) + (inst inc t-i) (inst sub s-i 1) (inst jmp :b DONE)) DONE)) @@ -490,7 +490,7 @@ do (inst mov :byte g (ea source s-i)) (inst mov :byte (ea target t-i) g) - (inst add t-i 1) + (inst inc t-i) (inst sub s-i 1) (inst jmp :b DONE)) DONE)))) From b99d0dbf50b4134fcd3e22758164b901a8a214ae Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 30 Aug 2022 21:53:19 -0400 Subject: [PATCH 3894/4023] x86-64: improve SAP+ and VECTOR-SAP SAP+ is the same as FAST+ mod64 on an unsigned reg. VECTOR-SAP reduces to INC if src/dest are location=. --- src/compiler/x86-64/sap.lisp | 45 ++++++++++-------------------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/src/compiler/x86-64/sap.lisp b/src/compiler/x86-64/sap.lisp index ee6aaca4af..c762b080de 100644 --- a/src/compiler/x86-64/sap.lisp +++ b/src/compiler/x86-64/sap.lisp @@ -104,40 +104,16 @@ (define-vop () (:translate sap+) - (:args (ptr :scs (sap-reg) :target res - :load-if (not (location= ptr res))) - (offset :scs (signed-reg immediate))) + (:args (ptr :scs (sap-reg sap-stack) :target res :load-if nil) + (offset :scs (signed-reg signed-stack immediate))) (:arg-types system-area-pointer signed-num) - (:results (res :scs (sap-reg) :from (:argument 0) - :load-if (not (location= ptr res)))) + (:results (res :scs (sap-reg sap-stack) :load-if nil)) + (:vop-var vop) (:result-types system-area-pointer) - (:temporary (:sc signed-reg) temp) + (:temporary (:sc signed-reg) temp) ; TODO: add an :unused-if on this (:policy :fast-safe) (:generator 1 - (cond ((and (sc-is ptr sap-reg) (sc-is res sap-reg) - (not (location= ptr res))) - (sc-case offset - (signed-reg - (inst lea res (ea ptr offset))) - (immediate - (let ((value (tn-value offset))) - (cond ((typep value '(signed-byte 32)) - (inst lea res (ea value ptr))) - (t - (inst mov temp value) - (inst lea res (ea ptr temp)))))))) - (t - (move res ptr) - (sc-case offset - (signed-reg - (inst add res offset)) - (immediate - (let ((value (tn-value offset))) - (cond ((typep value '(signed-byte 32)) - (inst add res (tn-value offset))) - (t - (inst mov temp value) - (inst add res temp)))))))))) + (emit-inline-add-sub 'add ptr offset res temp vop 'identity))) (define-vop () (:translate sap-) @@ -398,6 +374,9 @@ https://llvm.org/doxygen/MemorySanitizer_8cpp.html (:result-types system-area-pointer) (:generator 2 (let ((disp (- (* vector-data-offset n-word-bytes) other-pointer-lowtag))) - (if (location= sap vector) - (inst add sap disp) - (inst lea sap (ea disp vector)))))) + (flet ((2-operand-add (dst src) + (cond ((eql src 1) (inst inc dst)) + (t (inst add dst src))))) + (if (location= sap vector) + (2-operand-add sap disp) + (inst lea sap (ea disp vector))))))) From 5e4fbdb4b7713b2505900da65f40beb50c89b365 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 30 Aug 2022 21:58:07 -0400 Subject: [PATCH 3895/4023] x86-64: simplify some junk --- src/compiler/x86-64/arith.lisp | 103 ++++++++++++++++----------------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/src/compiler/x86-64/arith.lisp b/src/compiler/x86-64/arith.lisp index 49d606eaf9..20079319c5 100644 --- a/src/compiler/x86-64/arith.lisp +++ b/src/compiler/x86-64/arith.lisp @@ -283,8 +283,7 @@ (move r x) (inst or r y))) -(defun prepare-alu-operands (op x y vop const-tn-xform commutative) - (declare (ignore op)) +(defun prepare-alu-operands (x y vop const-tn-xform commutative) (let ((arg (vop-args vop))) (when (tn-ref-load-tn arg) (bug "Shouldn't have a load TN for arg0")) @@ -307,7 +306,7 @@ (defun emit-inline-smul (op x y result temp vop dummy taggedp) ; signed multiply (declare (ignore op dummy)) - (multiple-value-setq (x y) (prepare-alu-operands 'mul x y vop 'identity t)) + (multiple-value-setq (x y) (prepare-alu-operands x y vop 'identity t)) (aver (not (integerp x))) (let ((constant-y (integerp y))) ; don't need to unscale Y if true (when (and constant-y (not (typep y '(signed-byte 32)))) @@ -340,9 +339,9 @@ ;;; MUL is also a bit different due to asymmetry of the instruction. (defun emit-inline-add-sub (op x y result temp vop const-tn-xform) (declare (type (member add sub) op)) - (multiple-value-setq (x y) - (prepare-alu-operands op x y vop const-tn-xform (eq op 'add))) + (multiple-value-setq (x y) (prepare-alu-operands x y vop const-tn-xform (eq op 'add))) + ;; FIXME: What is (ash -1 63) for ? this comment within doesn't match the test. (when (and (eq op 'sub) (and (integerp y) (not (eql y (ash -1 63))))) ;; If Y is -2147483648 then the negation is not (signed-byte 32). ;; How likely is someone to subtract that? @@ -355,6 +354,8 @@ (let* ((y-is-reg-or-imm32 (or (gpr-tn-p y) (typep y '(signed-byte 32)))) (commutative (eq op 'add))) (when (alias-p result x) + ;; the first two clauses are correct because if the instruction was SUB with + ;; an immediate then it got turned into ADD with the negation of the immediate. (cond ((eql y -1) (inst dec x)) ((eql y +1) (inst inc x)) ((or (gpr-tn-p x) y-is-reg-or-imm32) @@ -387,7 +388,9 @@ ;; If non-commutative, then RESULT could be Y, in which case REG is ;; TEMP so that we don't trash Y by moving X into it. (inst mov reg x) - (inst* op reg y))) + (cond ((and (eq op 'add) (eql y 1)) (inst inc reg)) + ((and (eq op 'add) (eql y -1)) (inst dec reg)) + (t (inst* op reg y))))) (move result reg)))) ;;; FIXME: we shouldn't need 12 variants, plus the modular variants, for what should @@ -2108,8 +2111,28 @@ ;;;; Modular functions (defmacro define-mod-binop ((name prototype) function) - (unless (search "FAST-*" (string prototype)) ; fast-* doesn't accept stack locations yet - (return-from define-mod-binop + (if (search "FAST-*" (string prototype)) ; fast-* doesn't accept stack locations yet + `(define-vop (,name ,prototype) + (:args (x :target r :scs (unsigned-reg signed-reg) + :load-if (not (and (or (sc-is x unsigned-stack) + (sc-is x signed-stack)) + (or (sc-is y unsigned-reg) + (sc-is y signed-reg)) + (or (sc-is r unsigned-stack) + (sc-is r signed-stack)) + (location= x r)))) + (y :scs (unsigned-reg signed-reg unsigned-stack signed-stack))) + (:arg-types untagged-num untagged-num) + (:results (r :scs (unsigned-reg signed-reg) :from (:argument 0) + :load-if (not (and (or (sc-is x unsigned-stack) + (sc-is x signed-stack)) + (or (sc-is y unsigned-reg) + (sc-is y unsigned-reg)) + (or (sc-is r unsigned-stack) + (sc-is r unsigned-stack)) + (location= x r))))) + (:result-types unsigned-num) + (:translate ,function)) `(define-vop (,name ,prototype) (:args (x :scs (unsigned-reg signed-reg unsigned-stack signed-stack immediate) :load-if nil :target r) @@ -2120,30 +2143,16 @@ :load-if nil)) (:result-types unsigned-num) (:translate ,function)))) - `(define-vop (,name ,prototype) - (:args (x :target r :scs (unsigned-reg signed-reg) - :load-if (not (and (or (sc-is x unsigned-stack) - (sc-is x signed-stack)) - (or (sc-is y unsigned-reg) - (sc-is y signed-reg)) - (or (sc-is r unsigned-stack) - (sc-is r signed-stack)) - (location= x r)))) - (y :scs (unsigned-reg signed-reg unsigned-stack signed-stack))) - (:arg-types untagged-num untagged-num) - (:results (r :scs (unsigned-reg signed-reg) :from (:argument 0) - :load-if (not (and (or (sc-is x unsigned-stack) - (sc-is x signed-stack)) - (or (sc-is y unsigned-reg) - (sc-is y unsigned-reg)) - (or (sc-is r unsigned-stack) - (sc-is r unsigned-stack)) - (location= x r))))) - (:result-types unsigned-num) - (:translate ,function))) + (defmacro define-mod-binop-c ((name prototype) function) - (unless (search "FAST-*" (string prototype)) ; fast-* doesn't accept stack locations yet - (return-from define-mod-binop-c + (if (search "FAST-*" (string prototype)) ; fast-* doesn't accept stack locations yet + `(define-vop (,name ,prototype) + (:args (x :target r :scs (unsigned-reg signed-reg) :load-if t)) + (:info y) + (:arg-types untagged-num (:constant (or (unsigned-byte 64) (signed-byte 64)))) + (:results (r :scs (unsigned-reg signed-reg) :from (:argument 0) :load-if t)) + (:result-types unsigned-num) + (:translate ,function)) `(define-vop (,name ,prototype) (:args (x :target r :scs (unsigned-reg signed-reg unsigned-stack signed-stack) :load-if nil)) (:info y) @@ -2151,23 +2160,14 @@ (:results (r :scs (unsigned-reg signed-reg unsigned-stack signed-stack) :load-if nil)) (:result-types unsigned-num) (:translate ,function)))) - `(define-vop (,name ,prototype) - (:args (x :target r :scs (unsigned-reg signed-reg) - :load-if t)) - (:info y) - (:arg-types untagged-num (:constant (or (unsigned-byte 64) (signed-byte 64)))) - (:results (r :scs (unsigned-reg signed-reg) :from (:argument 0) - :load-if t)) - (:result-types unsigned-num) - (:translate ,function))) - -(macrolet ((def (name -c-p &aux (inherit name)) + +(macrolet ((def (name) (let ((fun64 (symbolicate name "-MOD64")) (funfx (symbolicate name "-MODFX")) - (vopu (symbolicate "FAST-" inherit "/UNSIGNED=>UNSIGNED")) - (vopcu (symbolicate "FAST-" inherit "-C/UNSIGNED=>UNSIGNED")) - (vopf (symbolicate "FAST-" inherit "/FIXNUM=>FIXNUM")) - (vopcf (symbolicate "FAST-" inherit "-C/FIXNUM=>FIXNUM")) + (vopu (symbolicate "FAST-" name "/UNSIGNED=>UNSIGNED")) + (vopcu (symbolicate "FAST-" name "-C/UNSIGNED=>UNSIGNED")) + (vopf (symbolicate "FAST-" name "/FIXNUM=>FIXNUM")) + (vopcf (symbolicate "FAST-" name "-C/FIXNUM=>FIXNUM")) (vop64u (symbolicate "FAST-" name "-MOD64/WORD=>UNSIGNED")) (vop64f (symbolicate "FAST-" name "-MOD64/FIXNUM=>FIXNUM")) (vop64cu (symbolicate "FAST-" name "-MOD64-C/WORD=>UNSIGNED")) @@ -2184,12 +2184,11 @@ ;; and which translates the normal function and the modular function? (define-vop (,vop64f ,vopf) (:translate ,fun64)) (define-vop (,vopfxf ,vopf) (:translate ,funfx)) - ,@(when -c-p - `((define-mod-binop-c (,vop64cu ,vopcu) ,fun64) - (define-vop (,vopfxcf ,vopcf) (:translate ,funfx)))))))) - (def + t) - (def - t) - (def * t)) + (define-mod-binop-c (,vop64cu ,vopcu) ,fun64) + (define-vop (,vopfxcf ,vopcf) (:translate ,funfx)))))) + (def +) + (def -) + (def *)) (define-modular-fun %negate-mod64 (x) %negate :untagged nil 64) (define-vop (%negate-mod64) From 53ab2ac1ebe88121f515caf2549b700bb2a0aad0 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 31 Aug 2022 17:24:48 +0300 Subject: [PATCH 3896/4023] Fix ash-mod64 constant folding. Reported by Eric Marsden. --- src/code/numbers.lisp | 6 +----- tests/arith.pure.lisp | 10 ++++++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index 1bbefacaf0..8ff6282771 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -1395,11 +1395,7 @@ and the number of 0 bits if INTEGER is negative." (sb-c::when-vop-existsp (:translate sb-vm::ash-modfx) (defun sb-vm::ash-mod64 (integer amount) - (etypecase integer - ((unsigned-byte 64) (ldb (byte 64 0) (ash integer amount))) - (fixnum (ldb (byte 64 0) (ash (logand integer #xffffffffffffffff) amount))) - (bignum (ldb (byte 64 0) - (ash (logand integer #xffffffffffffffff) amount))))) + (ldb (byte 64 0) (ash integer amount))) (defun sb-vm::ash-modfx (integer amount) (if (minusp integer) diff --git a/tests/arith.pure.lisp b/tests/arith.pure.lisp index 67943f9573..a7c0b1a7b5 100644 --- a/tests/arith.pure.lisp +++ b/tests/arith.pure.lisp @@ -1107,3 +1107,13 @@ (declare ((not unsigned-byte) a b)) (logand a b)))))) '(integer * -1)))) + +(with-test (:name :ash-mod64-constant-folding) + (checked-compile-and-assert + () + `(lambda (a d) + (declare (fixnum a) + ((unsigned-byte 64) d)) + (setq a -64) + (logand d (ash -1 a))) + ((0 3) 3))) From 9babf80cda0a0029d913f74ca7eeb0939803e871 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 31 Aug 2022 18:47:47 -0400 Subject: [PATCH 3897/4023] Delete mention of nonexistent things No FOP-FOREIGN-DATAREF-FIXUP and no #+linkage-table feature. --- src/code/foreign.lisp | 3 +-- src/runtime/win32-os.c | 9 --------- tests/foreign.test.sh | 4 ---- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 6aa32fd199..7aefa99fdb 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -19,8 +19,7 @@ symbol in the linkage table, and never returns an address in the linkage-table." ;;; Note that much conditionalization is for nothing at this point, because all ;;; platforms that we care about implement dlopen(). But if one did not, only ;;; supporting static linking, we could still implement the entirety of the feature -;;; known as :linkage-table and the feature formerly known as "dynamic core" -;;; (folded into :linkage-table now) by mocking out dlsym() within the SBCL runtime +;;; formerly known as "dynamic core" by mocking out dlsym() within the SBCL runtime ;;; as a lookup table translating strings to functions needed in our runtime. ;;; It's not our problem that shared objects aren't loadable, but we get the ;;; flexibility of recompiling C without recompiling Lisp. diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 5cd40c1e17..f3f074f187 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -238,15 +238,6 @@ void unmap_gc_page() * ``global quiesce point'' that is generally required for this kind * of worldwide revolution -- around collect_garbage. * - * What's almost unnoticeable from the C side (where you are now, dear - * reader): using the same style for all linking is beautiful. I tried - * to leave old-style linking code in place for the sake of - * _non-linkage-table_ platforms (they probably don't have -ldl or its - * equivalent, like LL/GPA, at all) -- but i did it usually by moving - * the entire `old style' code under #-linkage-table and - * refactoring the `new style' branch, instead of cutting the tail - * piecemeal and increasing #+-ifdeffery amount & the world enthropy. - * * If we look at the majority of the ``new style'' code units, it's a * common thing to observe how #+-ifdeffery _vanishes_ instead of * multiplying: #-sb-xc, #+sb-xc-host and #-sb-xc-host end up diff --git a/tests/foreign.test.sh b/tests/foreign.test.sh index b0d292b6e9..57045bbab7 100755 --- a/tests/foreign.test.sh +++ b/tests/foreign.test.sh @@ -206,10 +206,6 @@ cat > $TEST_FILESTEM.base.lisp <<EOF (define-alien-routine return-int-test int (p int :copy)) (define-alien-routine return-uint-test unsigned-int (p unsigned-int :copy)) - ;; compiling this gets us the FOP-FOREIGN-DATAREF-FIXUP on - ;; linkage-table ports - (defvar *extern* (extern-alien "negative_short" short)) - ;; Test that loading an object file didn't screw up our records ;; of variables visible in runtime. (This was a bug until ;; Nikodemus Siivola's patch in sbcl-0.8.5.50.) From bc3630d6f814e98a45ab7d660b5de0e4c1af7d32 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 31 Aug 2022 19:53:09 -0400 Subject: [PATCH 3898/4023] Remove unused functions --- src/runtime/interrupt.c | 2 ++ src/runtime/win32-os.c | 23 ----------------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 805e85b797..9bd6b2aebb 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -548,7 +548,9 @@ check_deferrables_blocked_or_lose(sigset_t *sigset) lose("deferrables unblocked"); } +#ifdef LISP_FEATURE_RISCV int sigaction_does_not_mask; +#endif static void assert_blockables_blocked() { #ifdef LISP_FEATURE_RISCV diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index f3f074f187..aeecc9485d 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -2045,30 +2045,7 @@ int sb_pthr_kill(struct thread* thread, int signum) return 0; } -int sigpending(sigset_t *set) -{ - struct extra_thread_data* data = thread_extra_data(get_sb_vm_thread()); - *set = InterlockedCompareExchange((volatile LONG*)&data->pending_signal_set, - 0, 0); - return 0; -} - /* Signals */ -struct sigaction signal_handlers[NSIG]; - -/* Never called for now */ -int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact) -{ - struct sigaction newact = *act; - if (oldact) - *oldact = signal_handlers[signum]; - if (!(newact.sa_flags & SA_SIGINFO)) { - newact.sa_sigaction = (typeof(newact.sa_sigaction))newact.sa_handler; - } - signal_handlers[signum] = newact; - return 0; -} - int sched_yield() { /* http://stackoverflow.com/questions/1383943/switchtothread-vs-sleep1 From eac5fc02f3e4c1c0790f09a2acb8f7964b0c77a1 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 1 Sep 2022 17:18:33 +0300 Subject: [PATCH 3899/4023] Highlight atom values in LET forms. E.g. (let (_(x undefined)_)) instead of the whole LET. --- src/compiler/ir1-translators.lisp | 8 +++++--- src/compiler/ir1tran-lambda.lisp | 23 +++++++++++++++-------- src/compiler/ir1tran.lisp | 7 +++++-- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index 2f20c382bd..7c614d5004 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -746,7 +746,7 @@ be a lambda expression." (let ((ctran (make-ctran)) (fun-lvar (make-lvar))) (ir1-convert start ctran fun-lvar `(the function ,function)) - (ir1-convert-combination-args fun-lvar ctran next result args nil))) + (ir1-convert-combination-args fun-lvar ctran next result args :pass-nargs nil))) ;;; This source transform exists to reduce the amount of work for the ;;; compiler. If the called function is a FUNCTION form, then convert @@ -850,7 +850,8 @@ have been evaluated." :debug-name (debug-name 'let bindings)))) (reference-leaf start ctran fun-lvar fun)) (values next result)))) - (ir1-convert-combination-args fun-lvar ctran next result values))))) + (ir1-convert-combination-args fun-lvar ctran next result values + :arg-source-forms bindings))))) (def-ir1-translator let* ((bindings &body body) start next result) @@ -861,7 +862,8 @@ form to reference any of the previous VARS." (multiple-value-bind (vars values forms decls) (parse-letish bindings body 'let*) (processing-decls (decls vars nil next result post-binding-lexenv) (ir1-convert-aux-bindings - start next result forms vars values post-binding-lexenv)))) + start next result forms vars values post-binding-lexenv + :value-source-forms bindings)))) ;;; logic shared between IR1 translators for LOCALLY, MACROLET, ;;; and SYMBOL-MACROLET diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 18dd679c34..f434118580 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -116,7 +116,7 @@ ;;; SOURCE-NAME and DEBUG-NAME. But I (WHN) don't use &AUX bindings, ;;; so I'm not motivated. Patches will be accepted... (defun ir1-convert-aux-bindings (start next result body aux-vars aux-vals - post-binding-lexenv) + post-binding-lexenv &key value-source-forms) (declare (type ctran start next) (type (or lvar null) result) (list body aux-vars aux-vals)) (if (null aux-vars) @@ -131,10 +131,12 @@ :post-binding-lexenv post-binding-lexenv :debug-name (debug-name '&aux-bindings - aux-vars)))) + aux-vars) + :value-source-forms (rest value-source-forms)))) (reference-leaf start ctran fun-lvar fun) (ir1-convert-combination-args fun-lvar ctran next result - (list (first aux-vals))))) + (list (first aux-vals)) + :arg-source-forms (list (first value-source-forms))))) (values)) ;;; This is similar to IR1-CONVERT-PROGN-BODY except that code to bind @@ -149,13 +151,15 @@ ;;; to start a block outside of this cleanup, causing cleanup code to ;;; be emitted when the scope is exited. (defun ir1-convert-special-bindings - (start next result body aux-vars aux-vals svars post-binding-lexenv) + (start next result body aux-vars aux-vals svars post-binding-lexenv + &key value-source-forms) (declare (type ctran start next) (type (or lvar null) result) (list body aux-vars aux-vals svars)) (cond ((null svars) (ir1-convert-aux-bindings start next result body aux-vars aux-vals - post-binding-lexenv)) + post-binding-lexenv + :value-source-forms value-source-forms)) (t (ctran-starts-block next) (let ((cleanup (make-cleanup :kind :special-bind)) @@ -170,7 +174,8 @@ (ir1-convert-special-bindings cleanup-ctran next result body aux-vars aux-vals (rest svars) - post-binding-lexenv))))) + post-binding-lexenv + :value-source-forms value-source-forms))))) (values)) ;;; Create a lambda node out of some code, returning the result. The @@ -200,7 +205,8 @@ (note-lexical-bindings t) post-binding-lexenv system-lambda - local-policy) + local-policy + value-source-forms) (declare (list body vars aux-vars aux-vals)) ;; We're about to try to put new blocks into *CURRENT-COMPONENT*. @@ -269,7 +275,8 @@ (ir1-convert-special-bindings postbind-ctran result-ctran result-lvar body aux-vars aux-vals (svars) - post-binding-lexenv))))) + post-binding-lexenv + :value-source-forms value-source-forms))))) (link-blocks (component-head *current-component*) (node-block bind)) (push lambda (component-new-functionals *current-component*)) diff --git a/src/compiler/ir1tran.lisp b/src/compiler/ir1tran.lisp index d015631e20..c3b76af939 100644 --- a/src/compiler/ir1tran.lisp +++ b/src/compiler/ir1tran.lisp @@ -970,7 +970,8 @@ ;;; arguments for the call, which defaults to the cdr of source. We ;;; return the COMBINATION node. (defun ir1-convert-combination-args (fun-lvar start next result args - &optional (pass-nargs t)) + &key (pass-nargs t) + arg-source-forms) (declare (type ctran start next) (type lvar fun-lvar) (type (or lvar null) result) @@ -991,7 +992,9 @@ (setf this-start (maybe-instrument-progn-like this-start forms arg)) (let ((this-ctran (make-ctran)) - (this-lvar (make-lvar node))) + (this-lvar (make-lvar node)) + (*current-path* (or (get-source-path (pop arg-source-forms)) + *current-path*))) (ir1-convert this-start this-ctran this-lvar arg) (setq this-start this-ctran) (arg-lvars this-lvar)))) From ba618bcbc1a2d50a75818eddc02a52f093399052 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 2 Sep 2022 00:47:39 +0300 Subject: [PATCH 3900/4023] Don't check for INDEX in HAIRY-DATA-VECTOR-REF. Which already does not check bounds. Not checking the type is just as unsafe as not checking the length. --- src/code/array.lisp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index c75c2bb982..241e9834b4 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -806,9 +806,9 @@ of specialized arrays is supported." (ignorable index)) ,(if type `(data-vector-ref (the ,atype vector) - (locally - (declare (optimize (safety 1))) - (the index + (the index + (locally + (declare (optimize (safety 1))) (,@check-form index)))) `(data-nil-vector-ref (the ,atype vector) index))))) (define-setter (saetp check-form) From fbd46c52ea5ea4b3ba98a14ebdd4991d35989c6d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 1 Sep 2022 20:24:32 -0400 Subject: [PATCH 3901/4023] Run contrib tests with all other tests and not in make-target-contrib Most build systems distinguish a failed build from a failed test run, but make.sh has a hard time doing that because of the conflation of the two. The whole regression suite should be run if you want to ensure a good build, so that would be a good time to test contribs. Not only that, with ASDF we obscured a ton of style-warnings, we lost sandboxing of input files, the ability to use --evaluator-mode, automatic generation and cleanup of scratch pathnames, and automatic sb-sprof profiling. So convert contrib tests to use WITH-TEST except some that gave me trouble. This makes the output a ton more readable, and makes bisection on seldom-used configurations quicker, not to mention that SB-RT is very lame anyway. And there is quite literally less code to maintain now. Go figure. --- binary-distribution.sh | 4 +- contrib/asdf-module.mk | 3 ++ contrib/asdf/Makefile | 2 + contrib/build-contrib | 2 +- contrib/sb-aclrepl/sb-aclrepl.asd | 11 +----- contrib/sb-aclrepl/tests.lisp | 7 +--- contrib/sb-bsd-sockets/sb-bsd-sockets.asd | 28 +------------ contrib/sb-bsd-sockets/tests.lisp | 19 ++++----- contrib/sb-capstone/sb-capstone.asd | 14 +------ contrib/sb-concurrency/sb-concurrency.asd | 36 +---------------- contrib/sb-concurrency/tests/package.lisp | 3 +- contrib/sb-concurrency/tests/test-frlock.lisp | 8 +--- contrib/sb-concurrency/tests/test-gate.lisp | 2 +- .../sb-concurrency/tests/test-mailbox.lisp | 1 + contrib/sb-cover/sb-cover.asd | 9 +---- contrib/sb-cover/tests.lisp | 27 +++++-------- contrib/sb-gmp/sb-gmp.asd | 18 +-------- contrib/sb-gmp/tests.lisp | 3 +- contrib/sb-introspect/test-driver.lisp | 10 +++-- contrib/sb-md5/md5-tests.lisp | 3 +- contrib/sb-md5/sb-md5.asd | 12 +----- contrib/sb-mpfr/sb-mpfr.asd | 18 +-------- contrib/sb-mpfr/tests.lisp | 19 ++++----- contrib/sb-posix/libc-tests.lisp | 3 +- contrib/sb-posix/posix-tests.lisp | 10 +++-- contrib/sb-posix/sb-posix.asd | 30 +------------- contrib/sb-rotate-byte/sb-rotate-byte.asd | 9 +---- contrib/sb-simd/code/sb-simd.asd | 2 - .../sb-simd/test-suite/sb-simd-test-suite.asd | 21 ---------- .../sb-simple-streams/sb-simple-streams.asd | 13 +------ .../simple-stream-tests.lisp | 3 +- contrib/sb-sprof/sb-sprof.asd | 11 +----- contrib/sb-sprof/test.lisp | 2 +- make-target-contrib.sh | 9 ++--- make.sh | 2 +- tests/input-manifest.lisp-expr | 39 ++++++++++++++++++- tests/sb-aclrepl.impure.lisp | 2 + tests/sb-bsd-sockets.impure.lisp | 3 ++ tests/sb-cltl2.test.sh | 10 +++++ tests/sb-concurrency.impure.lisp | 7 ++++ tests/sb-cover.impure.lisp | 6 +++ tests/sb-gmp.impure.lisp | 7 ++++ tests/sb-introspect.test.sh | 10 +++++ tests/sb-md5.impure.lisp | 3 ++ tests/sb-mpfr.impure.lisp | 5 +++ tests/sb-posix.impure.lisp | 3 ++ tests/sb-rotate-byte.impure.lisp | 2 + tests/sb-simd.impure.lisp | 29 ++++++++++++++ tests/sb-simple-streams.impure.lisp | 3 ++ ...sprof.impure.lisp => sb-sprof.impure.lisp} | 4 +- tests/test-util.lisp | 7 +++- 51 files changed, 211 insertions(+), 303 deletions(-) delete mode 100644 contrib/sb-simd/test-suite/sb-simd-test-suite.asd create mode 100644 tests/sb-aclrepl.impure.lisp create mode 100644 tests/sb-bsd-sockets.impure.lisp create mode 100644 tests/sb-cltl2.test.sh create mode 100644 tests/sb-concurrency.impure.lisp create mode 100644 tests/sb-cover.impure.lisp create mode 100644 tests/sb-gmp.impure.lisp create mode 100644 tests/sb-introspect.test.sh create mode 100644 tests/sb-md5.impure.lisp create mode 100644 tests/sb-mpfr.impure.lisp create mode 100644 tests/sb-posix.impure.lisp create mode 100644 tests/sb-rotate-byte.impure.lisp create mode 100644 tests/sb-simd.impure.lisp create mode 100644 tests/sb-simple-streams.impure.lisp rename tests/{sprof.impure.lisp => sb-sprof.impure.lisp} (89%) diff --git a/binary-distribution.sh b/binary-distribution.sh index a2e998e218..49988dfe63 100755 --- a/binary-distribution.sh +++ b/binary-distribution.sh @@ -23,9 +23,9 @@ tar -cf $b-binary.tar \ `for contrib in $(cd $b/contrib && echo *); do src_dir=$b/contrib/$contrib cache_dir=$b/obj/asdf-cache/$contrib - if test -d $src_dir && test -f $cache_dir/test-passed.test-report; then + if test -d $src_dir && test -f $cache_dir/build-passed.test-report; then echo $src_dir/Makefile - echo $cache_dir/test-passed.test-report + echo $cache_dir/build-passed.test-report fi done` \ $b/obj/sbcl-home diff --git a/contrib/asdf-module.mk b/contrib/asdf-module.mk index b0fb7749ed..97f443fc7e 100644 --- a/contrib/asdf-module.mk +++ b/contrib/asdf-module.mk @@ -37,6 +37,9 @@ $(FASL):: $(ASD):: echo "(defsystem :$(SYSTEM) :class require-system)" > $@ +build: $(FASL) $(ASD) + true + test: $(FASL) $(ASD) $(SBCL) --load ../asdf-stub.lisp \ --eval '(asdf::test-asdf-contrib "$(SYSTEM)")' diff --git a/contrib/asdf/Makefile b/contrib/asdf/Makefile index a641122cd2..c1abd15772 100644 --- a/contrib/asdf/Makefile +++ b/contrib/asdf/Makefile @@ -17,6 +17,8 @@ $(ASDF_FASL):: asdf.lisp ../../output/sbcl.core $(UIOP_FASL) install:: cp $(FASL) "$(BUILD_ROOT)$(INSTALL_DIR)" +build:: $(FASL) + true test:: $(FASL) true diff --git a/contrib/build-contrib b/contrib/build-contrib index 6d3a91ad9a..ead313b4a1 100755 --- a/contrib/build-contrib +++ b/contrib/build-contrib @@ -2,7 +2,7 @@ mkdir -p ../obj/asdf-cache/$@/ -if $GNUMAKE -j1 -C $@ test < /dev/null 2>&1 && touch ../obj/asdf-cache/$@/test-passed.test-report ; then +if $GNUMAKE -j1 -C $@ build < /dev/null 2>&1 && touch ../obj/asdf-cache/$@/build-passed.test-report ; then : else exit $? diff --git a/contrib/sb-aclrepl/sb-aclrepl.asd b/contrib/sb-aclrepl/sb-aclrepl.asd index d22af906be..cb32435b20 100644 --- a/contrib/sb-aclrepl/sb-aclrepl.asd +++ b/contrib/sb-aclrepl/sb-aclrepl.asd @@ -12,13 +12,4 @@ (:file "repl" :depends-on ("toplevel")) (:file "inspect" :depends-on ("repl")) (:file "debug" :depends-on ("repl"))) - :perform (load-op :after (o c) (provide 'sb-aclrepl)) - :in-order-to ((test-op (test-op "sb-aclrepl/tests")))) - -(defsystem "sb-aclrepl/tests" - :depends-on ("sb-rt") - :components ((:file "tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system "sb-aclrepl/tests")))) - (or (funcall (intern "DO-TESTS" (find-package "SB-RT"))) - (error "test-op failed"))) + :perform (load-op :after (o c) (provide 'sb-aclrepl))) diff --git a/contrib/sb-aclrepl/tests.lisp b/contrib/sb-aclrepl/tests.lisp index fb759629d5..1a7c17914d 100644 --- a/contrib/sb-aclrepl/tests.lisp +++ b/contrib/sb-aclrepl/tests.lisp @@ -1,16 +1,13 @@ ;; Tests for sb-aclrepl (defpackage #:aclrepl-tests - (:use #:sb-aclrepl #:cl #:sb-rt)) + (:import-from #:test-util #:deftest) + (:use #:sb-aclrepl #:cl)) (in-package #:aclrepl-tests) (declaim (special sb-aclrepl::*skip-address-display* sb-aclrepl::*inspect-unbound-object-marker*)) -(setf sb-rt::*catch-errors* nil) - -(rem-all-tests) - (deftest hook.1 (boundp 'sb-impl::*inspect-fun*) t) (deftest hook.2 (boundp 'sb-int:*repl-prompt-fun*) t) (deftest hook.3 (boundp 'sb-int:*repl-read-form-fun*) t) diff --git a/contrib/sb-bsd-sockets/sb-bsd-sockets.asd b/contrib/sb-bsd-sockets/sb-bsd-sockets.asd index 2bdaf22d50..9bc3ec3e7c 100644 --- a/contrib/sb-bsd-sockets/sb-bsd-sockets.asd +++ b/contrib/sb-bsd-sockets/sb-bsd-sockets.asd @@ -45,30 +45,4 @@ (:file "name-service") (:file "misc")) - :perform (load-op :after (o c) (provide 'sb-bsd-sockets)) - :in-order-to ((test-op (test-op "sb-bsd-sockets/tests")))) - -(defsystem "sb-bsd-sockets/tests" - :depends-on ("sb-rt" - "sb-bsd-sockets" - (:feature (:not :win32) "sb-posix")) - :components ((:file "tests")) - :perform (test-op (o c) - (multiple-value-bind (soft strict pending) - (funcall (intern "DO-TESTS" (find-package "SB-RT"))) - (declare (ignorable pending)) - (fresh-line) - (unless strict - #+sb-testing-contrib - ;; We create TEST-PASSED from a shell script if tests passed. But - ;; since the shell script only `touch'es it, we can actually create - ;; it ahead of time -- as long as we're certain that tests truly - ;; passed, hence the check for SOFT. - (when soft - (with-open-file (s #p"SYS:CONTRIB;SB-BSD-SOCKETS;TEST-PASSED.TEST-REPORT" - :direction :output) - (dolist (pend pending) - (format s "Expected failure: ~A~%" pend)))) - (warn "ignoring expected failures in test-op")) - (unless soft - (error "test-op failed with unexpected failures"))))) + :perform (load-op :after (o c) (provide 'sb-bsd-sockets))) diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index dddf3169ac..e9222927d0 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -1,14 +1,9 @@ (defpackage "SB-BSD-SOCKETS-TEST" - (:use "CL" "SB-BSD-SOCKETS" "SB-RT")) + (:import-from #:test-util #:deftest) + (:use "CL" "SB-BSD-SOCKETS")) (in-package :sb-bsd-sockets-test) -(defmacro deftest* ((name &key fails-on) form &rest results) - `(progn - (when (sb-impl::featurep ',fails-on) - (pushnew ',name sb-rt::*expected-failures*)) - (deftest ,name ,form ,@results))) - ;;; a real address (deftest make-inet-address (equalp (make-inet-address "127.0.0.1") #(127 0 0 1)) @@ -56,6 +51,7 @@ :protocol (get-protocol-by-name "tcp")) (error nil) (:no-error (x) x)) + (format t "~&Will test IPv4~%") (push :ipv4-support *features*))) #+ipv4-support @@ -73,7 +69,7 @@ t) #+ipv4-support -(deftest* (make-inet-socket-wrong) +(deftest make-inet-socket-wrong ;; fail to make a socket: check correct error return. There's no nice ;; way to check the condition stuff on its own, which is a shame (handler-case @@ -91,7 +87,7 @@ t) #+ipv4-support -(deftest* (make-inet-socket-keyword-wrong) +(deftest make-inet-socket-keyword-wrong ;; same again with keywords (handler-case (make-instance 'inet-socket :type :stream :protocol :udp) @@ -123,7 +119,7 @@ t) #+ipv4-support -(deftest* (non-block-socket) +(deftest non-block-socket (let ((s (make-instance 'inet-socket :type :stream :protocol :tcp))) (setf (non-blocking-mode s) t) (non-blocking-mode s)) @@ -179,7 +175,7 @@ t) #+ipv4-support -(deftest* (simple-sockopt-test) +(deftest simple-sockopt-test ;; test we can set SO_REUSEADDR on a socket and retrieve it, and in ;; the process that all the weird macros in sockopt happened right. (let ((s (make-instance 'inet-socket :type :stream :protocol (get-protocol-by-name "tcp")))) @@ -367,6 +363,7 @@ (lambda () (socket-connect client-sock #(127 0 0 1) port) (socket-close client-sock))))) + (declare (ignorable client-connect-thread)) ; wtf ??? (setf server-sock (socket-accept listen-sock))) ;; Wait for input. This should return when we get EOF diff --git a/contrib/sb-capstone/sb-capstone.asd b/contrib/sb-capstone/sb-capstone.asd index adf9479035..c10c0c3e06 100644 --- a/contrib/sb-capstone/sb-capstone.asd +++ b/contrib/sb-capstone/sb-capstone.asd @@ -7,16 +7,4 @@ :description "Multi-target disassembly for SBCL using Capstone library" :serial t :components ((:file "capstone")) - :perform (load-op :after (o c) (provide 'sb-capstone)) - :in-order-to ((test-op (test-op "sb-capstone/tests")))) - -(defsystem "sb-capstone/tests" - :depends-on ("sb-capstone" "sb-rt") - :version "0.1" - :components ((:file "tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system "sb-capstone/tests")))) - (if (member :sb-capstone *features*) - (or (funcall (intern "DO-TESTS" (find-package "SB-RT"))) - (error "test-op failed")) - (warn "Could not test sb-capstone"))) + :perform (load-op :after (o c) (provide 'sb-capstone))) diff --git a/contrib/sb-concurrency/sb-concurrency.asd b/contrib/sb-concurrency/sb-concurrency.asd index 185ff6d4e7..b88ccaf9b7 100644 --- a/contrib/sb-concurrency/sb-concurrency.asd +++ b/contrib/sb-concurrency/sb-concurrency.asd @@ -18,38 +18,4 @@ (:file "queue" :depends-on ("package")) (:file "mailbox" :depends-on ("package" "queue")) (:file "gate" :depends-on ("package"))) - :perform (load-op :after (o c) (provide 'sb-concurrency)) - :in-order-to ((test-op (test-op "sb-concurrency/tests")))) - -(defsystem "sb-concurrency/tests" - :depends-on ("sb-concurrency" "sb-rt") - :components - ((:module tests - :components - ((:file "package") - (:file "test-utils" :depends-on ("package")) - (:file "test-frlock" :depends-on ("package" "test-utils")) - (:file "test-queue" :depends-on ("package" "test-utils")) - (:file "test-mailbox" :depends-on ("package" "test-utils")) - (:file "test-gate" :depends-on ("package" "test-utils")))))) - -(defmethod perform ((o test-op) - (c (eql (find-system "sb-concurrency/tests")))) - (multiple-value-bind (soft strict pending) - (funcall (intern "DO-TESTS" (find-package "SB-RT"))) - (declare (ignorable pending)) - (fresh-line) - (unless strict - #+sb-testing-contrib - ;; We create TEST-PASSED from a shell script if tests passed. But - ;; since the shell script only `touch'es it, we can actually create - ;; it ahead of time -- as long as we're certain that tests truly - ;; passed, hence the check for SOFT. - (when soft - (with-open-file (s #p"SYS:CONTRIB;SB-CONCURRENCY;TEST-PASSED" - :direction :output) - (dolist (pend pending) - (format s "Expected failure: ~A~%" pend)))) - (warn "ignoring expected failures in test-op")) - (unless soft - (error "test-op failed with unexpected failures")))) + :perform (load-op :after (o c) (provide 'sb-concurrency))) diff --git a/contrib/sb-concurrency/tests/package.lisp b/contrib/sb-concurrency/tests/package.lisp index 7328fc257e..24f876c9b6 100644 --- a/contrib/sb-concurrency/tests/package.lisp +++ b/contrib/sb-concurrency/tests/package.lisp @@ -2,4 +2,5 @@ (in-package :cl-user) (defpackage :sb-concurrency-test - (:use :cl :sb-thread :sb-concurrency :sb-rt)) + (:import-from #:test-util #:deftest) + (:use :cl :sb-thread :sb-concurrency)) diff --git a/contrib/sb-concurrency/tests/test-frlock.lisp b/contrib/sb-concurrency/tests/test-frlock.lisp index 2cb8b2cb3b..479edc9c83 100644 --- a/contrib/sb-concurrency/tests/test-frlock.lisp +++ b/contrib/sb-concurrency/tests/test-frlock.lisp @@ -11,12 +11,6 @@ (in-package :sb-concurrency-test) -(defmacro deftest* ((name &key fails-on) form &rest results) - `(progn - (when (sb-impl::featurep ',fails-on) - (pushnew ',name sb-rt::*expected-failures*)) - (deftest ,name ,form ,@results))) - ;; XXX something like clock_getres(CLOCK_REALTIME, ...) would be better (defvar *minimum-sleep* #+(or openbsd netbsd sunos) 0.01 @@ -87,7 +81,7 @@ (values (cdr w-e!) (cdr r-e!)))) #+sb-thread -(deftest* (frlock.1) +(deftest frlock.1 (handler-case (sb-ext:with-timeout 40 (test-frlocks #+win32 :outer-write-pause #+win32 t )) diff --git a/contrib/sb-concurrency/tests/test-gate.lisp b/contrib/sb-concurrency/tests/test-gate.lisp index 80b3aa7a20..2bbb0d3f0e 100644 --- a/contrib/sb-concurrency/tests/test-gate.lisp +++ b/contrib/sb-concurrency/tests/test-gate.lisp @@ -72,7 +72,6 @@ ;; once the gate is closed. (deftest gate.2 (let* ((gate (make-gate)) - (cont (make-gate)) (marks (make-array (if (> *cpus* 1) 100 50) :initial-element nil)) (threads (loop for i from 0 below (length marks) collect (make-thread (lambda (n) @@ -109,6 +108,7 @@ (block nil (handler-bind ((sb-sys:deadline-timeout #'(lambda (c) + (declare (ignore c)) (return :deadline)))) (sb-sys:with-deadline (:seconds 0.1) (wait-on-gate gate)))))))) diff --git a/contrib/sb-concurrency/tests/test-mailbox.lisp b/contrib/sb-concurrency/tests/test-mailbox.lisp index 7bebd48675..83b324eb26 100644 --- a/contrib/sb-concurrency/tests/test-mailbox.lisp +++ b/contrib/sb-concurrency/tests/test-mailbox.lisp @@ -219,6 +219,7 @@ repeat 99 do (kill-thread victim) (sleep (random 0.0001))))) + (declare (ignore errors)) (values ;; We may have killed a receiver before it got to incrementing ;; the counter. diff --git a/contrib/sb-cover/sb-cover.asd b/contrib/sb-cover/sb-cover.asd index 58efcd0304..14890be38c 100644 --- a/contrib/sb-cover/sb-cover.asd +++ b/contrib/sb-cover/sb-cover.asd @@ -8,11 +8,4 @@ #+sb-building-contrib #p"SYS:CONTRIB;SB-COVER;" :depends-on ("sb-md5") :components ((:file "cover")) - :perform (load-op :after (o c) (provide 'sb-cover)) - :in-order-to ((test-op (test-op "sb-cover/tests")))) - -(defsystem "sb-cover/tests" - #+sb-building-contrib :pathname - #+sb-building-contrib #p"SYS:CONTRIB;SB-COVER;" - :depends-on ("sb-cover" "asdf") - :components ((:file "tests"))) + :perform (load-op :after (o c) (provide 'sb-cover))) diff --git a/contrib/sb-cover/tests.lisp b/contrib/sb-cover/tests.lisp index bbcbd8151a..4a813d9d21 100644 --- a/contrib/sb-cover/tests.lisp +++ b/contrib/sb-cover/tests.lisp @@ -1,19 +1,13 @@ -(defpackage sb-cover-test (:use :cl :asdf :uiop)) +(defpackage sb-cover-test (:use :cl)) (in-package sb-cover-test) -(defparameter *source-directory* - (system-source-directory :sb-cover)) -(defparameter *output-directory* - (apply-output-translations *source-directory*)) - -(setf *default-pathname-defaults* (translate-logical-pathname *default-pathname-defaults*)) +(defparameter *source-directory* cl-user::*source-directory*) +(defparameter *output-directory* cl-user::*coverage-report-directory*) (defun compile-load (x) - (flet ((in-dir (dir type) - (translate-logical-pathname (subpathname dir x :type type)))) - (load (compile-file (in-dir *source-directory* "lisp") - :output-file (in-dir *output-directory* "fasl"))))) + (load (compile-file (merge-pathnames (merge-pathnames x ".*lisp") *source-directory*) + :output-file *output-directory*))) (defun report () (handler-case @@ -41,13 +35,14 @@ (catch 'ok (handler-case (sb-cover:report #p"/tmp/foo") - (error () - (throw 'ok nil))) + (error (c) + (when (search "does not designate a directory" (princ-to-string c)) + (throw 'ok nil)))) (error "REPORT with a non-pathname directory did not signal an error.")) (report) -(assert (probe-file (subpathname *output-directory* "cover-index.html"))) +(assert (probe-file (merge-pathnames "cover-index.html" *output-directory*))) ;;; Only the top level forms have been executed (assert (zerop (sb-cover::ok-of (getf sb-cover::*counts* :branch)))) @@ -155,7 +150,3 @@ (assert (zerop (sb-cover::all-of (getf sb-cover::*counts* :branch)))) (assert (= 7 (sb-cover::ok-of (getf sb-cover::*counts* :expression)))) (assert (= 11 (sb-cover::all-of (getf sb-cover::*counts* :expression)))) - -;; Clean up after the tests -(map nil #'delete-file - (directory (merge-pathnames #p"*.html" *output-directory*))) diff --git a/contrib/sb-gmp/sb-gmp.asd b/contrib/sb-gmp/sb-gmp.asd index 912f5602a2..ab3ab4c451 100644 --- a/contrib/sb-gmp/sb-gmp.asd +++ b/contrib/sb-gmp/sb-gmp.asd @@ -7,21 +7,5 @@ :description "bignum calculations for SBCL using the GMP library" :serial t :components ((:file "gmp")) - :perform (load-op :after (o c) (provide 'sb-gmp)) - :in-order-to ((test-op (test-op "sb-gmp/tests")))) + :perform (load-op :after (o c) (provide 'sb-gmp))) -(defsystem "sb-gmp/tests" - :depends-on ("sb-rt" "sb-gmp") - :components ((:file "tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system "sb-gmp/tests")))) - (if (not (member :sb-gmp *features*)) - (warn "unable to test sb-gmp: libgmp unavailable") - (multiple-value-bind (soft strict pending) - (funcall (intern "DO-TESTS" (find-package "SB-RT"))) - (declare (ignorable pending)) - (fresh-line) - (unless strict - (warn "ignoring expected failures in sb-gmp-tests")) - (unless soft - (error "sb-gmp-tests failed with unexpected failures"))))) diff --git a/contrib/sb-gmp/tests.lisp b/contrib/sb-gmp/tests.lisp index e9a4eb4525..11b28c4c87 100644 --- a/contrib/sb-gmp/tests.lisp +++ b/contrib/sb-gmp/tests.lisp @@ -1,5 +1,6 @@ (defpackage "SB-GMP-TESTS" - (:use "COMMON-LISP" "SB-GMP" "SB-RT")) + (:import-from #:test-util #:deftest) + (:use "COMMON-LISP" "SB-GMP")) (in-package "SB-GMP-TESTS") diff --git a/contrib/sb-introspect/test-driver.lisp b/contrib/sb-introspect/test-driver.lisp index e0fb8670ad..4a5973e14d 100644 --- a/contrib/sb-introspect/test-driver.lisp +++ b/contrib/sb-introspect/test-driver.lisp @@ -80,7 +80,9 @@ (let* ((source (find-definition-source #'cl-user::one)) (plist (definition-source-plist source)) (pathname (definition-source-pathname source))) - (values (equalp pathname #p"SYS:CONTRIB;SB-INTROSPECT;TEST.LISP.NEWEST") + (declare (ignore source)) + ;; the full pathname isn't important + (values (equalp (pathname-name pathname) "TEST") (= (definition-source-file-write-date source) (file-write-date pathname)) (or (equal (getf plist :test-outer) @@ -250,7 +252,7 @@ (matchp-name :function 'cl-user::compile-time-too-fun 28) t) -(load "load-test.lisp") +(load "../contrib/sb-introspect/load-test.lisp") (deftest find-source-stuff.32 (matchp-name :function 'cl-user::loaded-as-source-fun 3) t) @@ -744,7 +746,7 @@ (predicate (find-definition-source #'cl-user::three-p))) (values (and (equalp copier accessor) (equalp copier predicate)) - (equal "TEST.LISP.NEWEST" + (equal "test.lisp" (file-namestring (definition-source-pathname copier))) (equal '(5) (definition-source-form-path copier)))) @@ -758,7 +760,7 @@ (predicate (car (find-definition-sources-by-name 'cl-user::three-p :function)))) (values (and (equalp copier accessor) (equalp copier predicate)) - (equal "TEST.LISP.NEWEST" + (equal "test.lisp" (file-namestring (definition-source-pathname copier))) (equal '(5) (definition-source-form-path copier)))) diff --git a/contrib/sb-md5/md5-tests.lisp b/contrib/sb-md5/md5-tests.lisp index ea9e4c82bc..b58be7f670 100644 --- a/contrib/sb-md5/md5-tests.lisp +++ b/contrib/sb-md5/md5-tests.lisp @@ -1,5 +1,6 @@ (defpackage #:sb-md5-tests - (:use #:sb-md5 #:cl #:sb-rt)) + (:import-from #:test-util #:deftest) + (:use #:sb-md5 #:cl)) (in-package #:sb-md5-tests) (defun byte-array-to-hex-string (bytevec) diff --git a/contrib/sb-md5/sb-md5.asd b/contrib/sb-md5/sb-md5.asd index 6439f83a19..3bebc1b699 100644 --- a/contrib/sb-md5/sb-md5.asd +++ b/contrib/sb-md5/sb-md5.asd @@ -24,14 +24,4 @@ #+sb-building-contrib :pathname #+sb-building-contrib #p"SYS:CONTRIB;SB-MD5;" :components ((:file "md5")) - :perform (load-op :after (o c) (provide 'sb-md5)) - :in-order-to ((test-op (test-op "sb-md5/tests")))) - -(defsystem "sb-md5/tests" - :depends-on ("sb-md5" "sb-rt") - :version "2.0.4" - :components ((:file "md5-tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system "sb-md5/tests")))) - (or (funcall (intern "DO-TESTS" (find-package "SB-RT"))) - (error "test-op failed"))) + :perform (load-op :after (o c) (provide 'sb-md5))) diff --git a/contrib/sb-mpfr/sb-mpfr.asd b/contrib/sb-mpfr/sb-mpfr.asd index b4e98f23ba..2689178c07 100644 --- a/contrib/sb-mpfr/sb-mpfr.asd +++ b/contrib/sb-mpfr/sb-mpfr.asd @@ -8,21 +8,5 @@ :serial t :depends-on ("sb-gmp") :components ((:file "mpfr")) - :perform (load-op :after (o c) (provide 'sb-mpfr)) - :in-order-to ((test-op (test-op "sb-mpfr/tests")))) + :perform (load-op :after (o c) (provide 'sb-mpfr))) -(defsystem "sb-mpfr/tests" - :depends-on ("sb-rt" "sb-mpfr") - :components ((:file "tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system "sb-mpfr/tests")))) - (if (not (member :sb-mpfr *features*)) - (warn "unable to test sb-mpfr: libmpfr unavailable") - (multiple-value-bind (soft strict pending) - (funcall (find-symbol "DO-TESTS" "SB-RT")) - (declare (ignorable pending)) - (fresh-line) - (unless strict - (warn "ignoring expected failures in sb-mpfr-tests")) - (unless soft - (error "sb-mpfr-tests failed with unexpected failures"))))) diff --git a/contrib/sb-mpfr/tests.lisp b/contrib/sb-mpfr/tests.lisp index 171c435bf1..48566475db 100644 --- a/contrib/sb-mpfr/tests.lisp +++ b/contrib/sb-mpfr/tests.lisp @@ -1,7 +1,4 @@ -(defpackage "SB-MPFR-TESTS" - (:use "COMMON-LISP" "SB-RT")) - -(in-package "SB-MPFR-TESTS") +;;; FIXME: how are these testing anything??? (defun sample () (let ((sb-mpfr:*mpfr-rnd* :MPFR_RNDD)) @@ -41,14 +38,12 @@ (macrolet ((%write-out-idempotence-tests (&rest rationals) `(progn ,@(loop :for rat :in rationals - :collect `(deftest - ;; name - ,(intern (format nil "TEST-RATIONALIZE-~A" rat)) - ;; form to test - (<= (abs (- ,rat (rational-roundtrip ,rat))) - (expt 2 (- *roundtrip-precision*))) - ;; result - t))))) + :collect + `(test-util:with-test + (:name ,(sb-int:keywordicate (format nil "TEST-RATIONALIZE-~A" rat))) + (assert (<= (abs (- ,rat (rational-roundtrip ,rat))) + (expt 2 (- *roundtrip-precision*))))))))) + (%write-out-idempotence-tests 1/2 1/4 diff --git a/contrib/sb-posix/libc-tests.lisp b/contrib/sb-posix/libc-tests.lisp index b4fa3334a1..19ab8822b5 100644 --- a/contrib/sb-posix/libc-tests.lisp +++ b/contrib/sb-posix/libc-tests.lisp @@ -1,5 +1,4 @@ -(defpackage #:sb-libc-tests (:use #:cl #:sb-rt)) -(in-package "SB-LIBC-TESTS") +(in-package "SB-POSIX-TESTS") (defparameter *tests* ; unicode strings (by default unless #-sb-unicode) #("1.20203" "3.4400" "3240.2205" "10088.92" "12.3" "1000000000e-2" diff --git a/contrib/sb-posix/posix-tests.lisp b/contrib/sb-posix/posix-tests.lisp index 0a642bd5c6..22c0d99a54 100644 --- a/contrib/sb-posix/posix-tests.lisp +++ b/contrib/sb-posix/posix-tests.lisp @@ -1,5 +1,6 @@ (defpackage "SB-POSIX-TESTS" - (:use "COMMON-LISP" "SB-RT")) + (:import-from #:test-util #:deftest) + (:use "COMMON-LISP")) (in-package "SB-POSIX-TESTS") @@ -13,7 +14,7 @@ (defvar *this-file* *load-truename*) -(eval-when (:compile-toplevel :load-toplevel) +(eval-when (:compile-toplevel :load-toplevel :execute) (defconstant +mode-rwx-all+ (logior sb-posix::s-irusr sb-posix::s-iwusr sb-posix::s-ixusr #-win32 @@ -390,6 +391,7 @@ (let ((file (format nil "~A/[foo].txt" (namestring *test-directory*)))) ;; creat() with a string as argument (let ((fd (sb-posix:creat file sb-posix:s-iwrite))) + (declare (ignorable fd)) #+win32 (sb-posix:close fd)) ;; if this test fails, it will probably be with @@ -590,7 +592,7 @@ ;; make sure that we get something sensible, not an error (handler-case (progn (sb-posix:getpwnam "almost-certainly-does-not-exist") nil) - (t (cond) t)) + (t (cond) (declare (ignore cond)) t)) nil) #-(or android win32) @@ -613,7 +615,7 @@ ;; make sure that we get something sensible, not an error (handler-case (progn (sb-posix:getgrnam "almost-certainly-does-not-exist") nil) - (t (cond) t)) + (t (cond) (declare (ignore cond)) t)) nil) #+nil diff --git a/contrib/sb-posix/sb-posix.asd b/contrib/sb-posix/sb-posix.asd index 6965f7cff2..5910b61690 100644 --- a/contrib/sb-posix/sb-posix.asd +++ b/contrib/sb-posix/sb-posix.asd @@ -14,32 +14,4 @@ (:sb-grovel-constants-file "constants" :package :sb-posix :depends-on ("defpackage")) (:file "interface" :depends-on ("constants" "macros" "designator"))) - :perform (load-op :after (o c) (provide 'sb-posix)) - :in-order-to ((test-op (test-op "sb-posix/tests")))) - -(defsystem "sb-posix/tests" - :depends-on ("sb-rt") - #+sb-building-contrib :pathname - #+sb-building-contrib #p"SYS:CONTRIB;SB-POSIX;" - :components ((:file "libc-tests") - (:file "posix-tests")) - :perform - (test-op (o c) - (funcall (intern "DO-TESTS" (find-package "SB-RT"))) - (let ((failures (funcall (intern "PENDING-TESTS" "SB-RT"))) - (ignored-failures (loop for sym being the symbols of :sb-posix-tests - if (search ".ERROR" (symbol-name sym)) - collect sym))) - (cond - ((null failures) - t) - ((null (set-difference failures ignored-failures)) - (warn "~@<some POSIX implementations return incorrect error values for ~ - failing calls, but there is legitimate variation between ~ - implementations too. If you think the errno ~ - from your platform is valid, please contact the sbcl ~ - developers; otherwise, please submit a bug report to your ~ - kernel distributor~@:>") - t) - (t - (error "non-errno tests failed!")))))) + :perform (load-op :after (o c) (provide 'sb-posix))) diff --git a/contrib/sb-rotate-byte/sb-rotate-byte.asd b/contrib/sb-rotate-byte/sb-rotate-byte.asd index 60ecfd0c91..fa3080fd9c 100644 --- a/contrib/sb-rotate-byte/sb-rotate-byte.asd +++ b/contrib/sb-rotate-byte/sb-rotate-byte.asd @@ -22,11 +22,4 @@ (:file "ppc-vm" :if-feature :ppc) (:file "ppc64-vm" :if-feature :ppc64))) (:file "rotate-byte" :depends-on ("vm"))) - :perform (load-op :after (o c) (provide 'sb-rotate-byte)) - :in-order-to ((test-op (test-op "sb-rotate-byte/tests")))) - -(defsystem "sb-rotate-byte/tests" - #+sb-building-contrib :pathname - #+sb-building-contrib #p"SYS:CONTRIB;SB-ROTATE-BYTE;" - :depends-on ("sb-rotate-byte") - :components ((:file "rotate-byte-tests"))) + :perform (load-op :after (o c) (provide 'sb-rotate-byte))) diff --git a/contrib/sb-simd/code/sb-simd.asd b/contrib/sb-simd/code/sb-simd.asd index b419e38197..e0c1a085ee 100644 --- a/contrib/sb-simd/code/sb-simd.asd +++ b/contrib/sb-simd/code/sb-simd.asd @@ -3,8 +3,6 @@ :author "Marco Heisig <marco.heisig@fau.de>" :license "MIT" - :in-order-to ((test-op (test-op "sb-simd-test-suite"))) - :serial t :components ((:file "packages") diff --git a/contrib/sb-simd/test-suite/sb-simd-test-suite.asd b/contrib/sb-simd/test-suite/sb-simd-test-suite.asd deleted file mode 100644 index 53133f6b18..0000000000 --- a/contrib/sb-simd/test-suite/sb-simd-test-suite.asd +++ /dev/null @@ -1,21 +0,0 @@ -(defsystem "sb-simd-test-suite" - :description "The sb-simd test suite." - :author "Marco Heisig <marco.heisig@fau.de>" - :license "MIT" - - :depends-on ("sb-simd") - - :perform - (test-op (o c) (symbol-call '#:sb-simd-test-suite '#:run-test-suite)) - - :serial t - :components - ((:file "packages") - (:file "numbers") - (:file "utilities") - (:file "test-suite") - (:file "test-arefs") - (:file "test-simple-simd-functions") - (:file "test-horizontal-functions") - (:file "test-hairy-simd-functions") - (:file "test-packages"))) diff --git a/contrib/sb-simple-streams/sb-simple-streams.asd b/contrib/sb-simple-streams/sb-simple-streams.asd index 74df14c9cc..9dbbf5fad6 100644 --- a/contrib/sb-simple-streams/sb-simple-streams.asd +++ b/contrib/sb-simple-streams/sb-simple-streams.asd @@ -24,15 +24,4 @@ (:file "terminal" :depends-on ("strategy")) ;;(:file "gray-compat" :depends-on ("package")) ) - :perform (load-op :after (o c) (provide 'sb-simple-streams)) - :in-order-to ((test-op (test-op "sb-simple-streams/tests")))) - -(defsystem "sb-simple-streams/tests" - :depends-on ("sb-rt" "sb-simple-streams") - #+sb-building-contrib :pathname - #+sb-building-contrib #p"SYS:CONTRIB;SB-SIMPLE-STREAMS;" - :components ((:file "simple-stream-tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system "sb-simple-streams/tests")))) - (or (funcall (intern "DO-TESTS" (find-package "SB-RT"))) - (error "test-op failed"))) + :perform (load-op :after (o c) (provide 'sb-simple-streams))) diff --git a/contrib/sb-simple-streams/simple-stream-tests.lisp b/contrib/sb-simple-streams/simple-stream-tests.lisp index 21047c829f..2fb5100439 100644 --- a/contrib/sb-simple-streams/simple-stream-tests.lisp +++ b/contrib/sb-simple-streams/simple-stream-tests.lisp @@ -1,7 +1,8 @@ ;;;; -*- lisp -*- (defpackage sb-simple-streams-test - (:use #:common-lisp #:sb-simple-streams #:sb-rt)) + (:import-from #:test-util #:deftest) + (:use #:common-lisp #:sb-simple-streams)) (in-package #:sb-simple-streams-test) diff --git a/contrib/sb-sprof/sb-sprof.asd b/contrib/sb-sprof/sb-sprof.asd index 3c27ebed36..b04b677963 100644 --- a/contrib/sb-sprof/sb-sprof.asd +++ b/contrib/sb-sprof/sb-sprof.asd @@ -13,13 +13,4 @@ (:file "report") (:file "interface") (:file "disassemble")) - :perform (load-op :after (o c) (provide 'sb-sprof)) - :in-order-to ((test-op (test-op "sb-sprof/tests")))) - -(defsystem "sb-sprof/tests" - :depends-on ("sb-sprof") - :components ((:file "test")) - :perform (test-op (o c) - #-(or win32) ;not yet - (or (funcall (find-symbol "RUN-TESTS" "SB-SPROF-TEST")) - (error "test-op failed")))) + :perform (load-op :after (o c) (provide 'sb-sprof))) diff --git a/contrib/sb-sprof/test.lisp b/contrib/sb-sprof/test.lisp index 881672867c..cb3fbef484 100644 --- a/contrib/sb-sprof/test.lisp +++ b/contrib/sb-sprof/test.lisp @@ -49,7 +49,7 @@ ;; but the less fuss about Sparc, the better. #+sparc (defun run-tests () t) -(defvar *compiler-input* "graph") +(defvar *compiler-input* "../contrib/sb-sprof/graph.lisp") (defvar *compiler-output* "./foo.fasl") (defvar *sprof-loop-test-max-samples* 50) diff --git a/make-target-contrib.sh b/make-target-contrib.sh index 941ecc0116..46e02b8a1c 100755 --- a/make-target-contrib.sh +++ b/make-target-contrib.sh @@ -74,12 +74,12 @@ fi # Otherwise report expected failures: HEADER_HAS_BEEN_PRINTED=false for dir in `cd ./obj/asdf-cache/ ; echo *`; do - f="obj/asdf-cache/$dir/test-passed.test-report" + f="obj/asdf-cache/$dir/build-passed.test-report" if test -f "$f" && grep -i fail "$f" >/dev/null; then if ! $HEADER_HAS_BEEN_PRINTED; then cat <<EOF -Note: Test suite failures which are expected for this combination of +Note: Build failures which are expected for this combination of platform and features have been ignored: EOF HEADER_HAS_BEEN_PRINTED=true @@ -114,14 +114,13 @@ done HEADER_HAS_BEEN_PRINTED=false for dir in $contrib_dirs do - if [ ! -f "obj/asdf-cache/$dir/test-passed.test-report" ]; then + if [ ! -f "obj/asdf-cache/$dir/build-passed.test-report" ]; then if $HEADER_HAS_BEEN_PRINTED; then echo > /dev/null else cat <<EOF -WARNING! Some of the contrib modules did not build successfully or pass -their self-tests. Failed contribs:" +WARNING! Some of the contrib modules did not build successfully. Failed contribs:" EOF HEADER_HAS_BEEN_PRINTED=true fi diff --git a/make.sh b/make.sh index 9a8522631a..1c4c959f46 100755 --- a/make.sh +++ b/make.sh @@ -87,7 +87,7 @@ maybetime sh make-target-contrib.sh # "find contrib/{sb-*,asdf}/Makefile" could work, # but as long as we only have 1 directory level, 'ls' should be adequate. NCONTRIBS=`ls -1 contrib/*/Makefile | wc -l` -NPASSED=`find obj/asdf-cache -name test-passed.test-report -print | wc -l` +NPASSED=`find obj/asdf-cache -name build-passed.test-report -print | wc -l` echo echo "The build seems to have finished successfully, including $NPASSED (out of $NCONTRIBS)" echo "contributed modules. If you would like to run more extensive tests on" diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index d28dbd2d35..a1f4af3bd4 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -80,11 +80,46 @@ "tests/package-test-4.lisp") ("redblack.pure.lisp" "tests/bbtree-test-util.lisp") ("run-program.impure.lisp" "contrib/sb-posix.fasl") + ("sb-aclrepl.impure.lisp" "contrib/sb-aclrepl.fasl" + "../contrib/sb-aclrepl/tests.lisp") + ("sb-bsd-sockets.impure.lisp" "contrib/sb-bsd-sockets.fasl" + "../contrib/sb-bsd-sockets/tests.lisp") + ; not working as a .impure test yet + ; ("sb-cltl2.impure.lisp" "contrib/sb-cltl2.fasl" "../contrib/sb-cltl2/tests.lisp") + ("sb-concurrency.impure.lisp" "contrib/sb-concurrency.fasl" + "../contrib/sb-concurrency/tests/package.lisp" + "../contrib/sb-concurrency/tests/test-utils.lisp" + "../contrib/sb-concurrency/tests/test-frlock.lisp" + "../contrib/sb-concurrency/tests/test-queue.lisp" + "../contrib/sb-concurrency/tests/test-mailbox.lisp" + "../contrib/sb-concurrency/tests/test-gate.lisp") + ("sb-cover.impure.lisp" "contrib/sb-cover.fasl") + ("sb-gmp.impure.lisp" "contrib/sb-gmp.fasl" "../contrib/sb-gmp/tests.lisp") ("sb-graph.impure.lisp" "contrib/sb-graph.fasl" "contrib/uiop.fasl") + ("sb-md5.impure.lisp" "contrib/sb-md5.fasl" "contrib/sb-rotate-byte.fasl" + "../contrib/sb-md5/md5-tests.lisp") + ("sb-mpfr.impure.lisp" "contrib/sb-gmp.fasl" "contrib/sb-mpfr.fasl" + "../contrib/sb-mpfr/tests.lisp") + ("sb-posix.impure.lisp" "contrib/sb-posix.fasl" + "../contrib/sb-posix/posix-tests.lisp" "../contrib/sb-posix/libc-tests.lisp" + "test-output/write-test.txt") + ("sb-simd.impure.lisp" "contrib/sb-simd.fasl" + "../contrib/sb-simd/test-suite/packages.lisp" + "../contrib/sb-simd/test-suite/numbers.lisp" + "../contrib/sb-simd/test-suite/utilities.lisp" + "../contrib/sb-simd/test-suite/test-suite.lisp" + "../contrib/sb-simd/test-suite/test-arefs.lisp" + "../contrib/sb-simd/test-suite/test-simple-simd-functions.lisp" + "../contrib/sb-simd/test-suite/test-horizontal-functions.lisp" + "../contrib/sb-simd/test-suite/test-hairy-simd-functions.lisp" + "../contrib/sb-simd/test-suite/test-packages.lisp") + ("sb-simple-streams.impure.lisp" "contrib/sb-simple-streams.fasl" "contrib/sb-bsd-sockets.fasl") + ("sb-rotate-byte.impure.lisp" "contrib/sb-rotate-byte.fasl" + "../contrib/sb-rotate-byte/rotate-byte-tests.lisp") + ("sb-sprof.impure.lisp" "contrib/sb-sprof.fasl" + "../contrib/sb-sprof/test.lisp" "../contrib/sb-sprof/graph.lisp") ("signals.impure.lisp" "contrib/sb-posix.fasl") ("stream.impure.lisp" "contrib/sb-posix.fasl") - ("sprof.impure.lisp" "contrib/sb-sprof.fasl" - "../contrib/sb-sprof/test.lisp" "../contrib/sb-sprof/graph.lisp") ("threads.impure.lisp" "tests/alloca.so" "tests/threads-foreign.so") diff --git a/tests/sb-aclrepl.impure.lisp b/tests/sb-aclrepl.impure.lisp new file mode 100644 index 0000000000..4a890e6592 --- /dev/null +++ b/tests/sb-aclrepl.impure.lisp @@ -0,0 +1,2 @@ +(require :sb-aclrepl) +(load "../contrib/sb-aclrepl/tests.lisp") diff --git a/tests/sb-bsd-sockets.impure.lisp b/tests/sb-bsd-sockets.impure.lisp new file mode 100644 index 0000000000..b653060749 --- /dev/null +++ b/tests/sb-bsd-sockets.impure.lisp @@ -0,0 +1,3 @@ +(require :sb-bsd-sockets) +#-win32 (require :sb-posix) +(load "../contrib/sb-bsd-sockets/tests.lisp") diff --git a/tests/sb-cltl2.test.sh b/tests/sb-cltl2.test.sh new file mode 100644 index 0000000000..59d89e9eac --- /dev/null +++ b/tests/sb-cltl2.test.sh @@ -0,0 +1,10 @@ +#!/bin/sh +. ./subr.sh +run_sbcl <<EOF + (require :sb-cltl2) + (push :sb-testing-contrib *features*) + (require :asdf) + (let ((*package* (find-package "ASDF"))) (load "../contrib/sb-cltl2/sb-cltl2.asd")) + (asdf:test-system "sb-cltl2/tests") + (exit :code $EXIT_TEST_WIN) +EOF diff --git a/tests/sb-concurrency.impure.lisp b/tests/sb-concurrency.impure.lisp new file mode 100644 index 0000000000..71c2d0a7df --- /dev/null +++ b/tests/sb-concurrency.impure.lisp @@ -0,0 +1,7 @@ +(require :sb-concurrency) +(load "../contrib/sb-concurrency/tests/package.lisp") +(load "../contrib/sb-concurrency/tests/test-utils.lisp") +(load "../contrib/sb-concurrency/tests/test-frlock.lisp") +(load "../contrib/sb-concurrency/tests/test-queue.lisp") +(load "../contrib/sb-concurrency/tests/test-mailbox.lisp") +(load "../contrib/sb-concurrency/tests/test-gate.lisp") diff --git a/tests/sb-cover.impure.lisp b/tests/sb-cover.impure.lisp new file mode 100644 index 0000000000..66187e4f2c --- /dev/null +++ b/tests/sb-cover.impure.lisp @@ -0,0 +1,6 @@ +(setq run-tests::*allowed-inputs* :any) +(require :sb-cover) +(defparameter *source-directory* (truename #P"../contrib/sb-cover/")) +(test-util:with-test-directory (coveragedir) + (defvar cl-user::*coverage-report-directory* coveragedir) + (load (merge-pathnames "tests.lisp" *source-directory*))) diff --git a/tests/sb-gmp.impure.lisp b/tests/sb-gmp.impure.lisp new file mode 100644 index 0000000000..884c69d52e --- /dev/null +++ b/tests/sb-gmp.impure.lisp @@ -0,0 +1,7 @@ +(handler-case (require :sb-gmp) + (warning (c) + (when (search "GMP not loaded" (princ-to-string c)) + (invoke-restart 'run-tests::skip-file)))) +;; FIXME: do we also want to load sb-gmp/tests-stress.lisp? +;; Those tests are wicked slow, taking about 47 seconds on my computer +(load "../contrib/sb-gmp/tests.lisp") diff --git a/tests/sb-introspect.test.sh b/tests/sb-introspect.test.sh new file mode 100644 index 0000000000..23911531ec --- /dev/null +++ b/tests/sb-introspect.test.sh @@ -0,0 +1,10 @@ +#!/bin/sh +. ./subr.sh +run_sbcl <<EOF + (setq *features* (append sb-impl:+internal-features+ *features*)) + (push :sb-testing-contrib *features*) + (require :asdf) + (let ((*package* (find-package "ASDF"))) (load "../contrib/sb-introspect/sb-introspect.asd")) + (asdf:test-system "sb-introspect/tests") + (exit :code $EXIT_TEST_WIN) +EOF diff --git a/tests/sb-md5.impure.lisp b/tests/sb-md5.impure.lisp new file mode 100644 index 0000000000..506e55bf94 --- /dev/null +++ b/tests/sb-md5.impure.lisp @@ -0,0 +1,3 @@ +(require :sb-md5) +(setq run-tests::*allowed-inputs* :any) ; makes random pathnames without aid of WITH-SCRATCH-FILE +(load "../contrib/sb-md5/md5-tests.lisp") diff --git a/tests/sb-mpfr.impure.lisp b/tests/sb-mpfr.impure.lisp new file mode 100644 index 0000000000..9e41a7e329 --- /dev/null +++ b/tests/sb-mpfr.impure.lisp @@ -0,0 +1,5 @@ +(handler-case (require :sb-mpfr) + (warning (c) + (when (search "not loaded" (princ-to-string c)) + (invoke-restart 'run-tests::skip-file)))) +(load "../contrib/sb-mpfr/tests.lisp") diff --git a/tests/sb-posix.impure.lisp b/tests/sb-posix.impure.lisp new file mode 100644 index 0000000000..ad43e58712 --- /dev/null +++ b/tests/sb-posix.impure.lisp @@ -0,0 +1,3 @@ +(require :sb-posix) +(load "../contrib/sb-posix/posix-tests.lisp") +(load "../contrib/sb-posix/libc-tests.lisp") diff --git a/tests/sb-rotate-byte.impure.lisp b/tests/sb-rotate-byte.impure.lisp new file mode 100644 index 0000000000..109e49a009 --- /dev/null +++ b/tests/sb-rotate-byte.impure.lisp @@ -0,0 +1,2 @@ +(require :sb-rotate-byte) +(load "../contrib/sb-rotate-byte/rotate-byte-tests.lisp") diff --git a/tests/sb-simd.impure.lisp b/tests/sb-simd.impure.lisp new file mode 100644 index 0000000000..07fc2e64f6 --- /dev/null +++ b/tests/sb-simd.impure.lisp @@ -0,0 +1,29 @@ +;;; Under the evaluator +;;; (SB-SIMD-TEST-SUITE::|SB-SIMD-SSE4.1:U32.4-IF|) +;;; failed for me with +;;; RESULT-0 = #<SIMD-PACK 33554433 127 8191 2097153>, +;;; OUTPUT-0 = #<SIMD-PACK 3 8193 2303 1073741823>. +;;; maybe there are other problems but I didn't investigate further. + +#+interpreter (invoke-restart 'run-tests::skip-file) + +(handler-case (require :sb-simd) + (condition (c) + (cond ((search "Don't know how" (princ-to-string c)) + (format t "~&Skipping test of sb-simd~%") + (invoke-restart 'run-tests::skip-file)) + (t + (error "Unexpected error: ~A" c))))) + +(with-compilation-unit () + (dolist (file '("packages.lisp" + "numbers.lisp" + "utilities.lisp" + "test-suite.lisp" + "test-arefs.lisp" + "test-simple-simd-functions.lisp" + "test-horizontal-functions.lisp" + "test-hairy-simd-functions.lisp" + "test-packages.lisp")) + (load (merge-pathnames file #P"../contrib/sb-simd/test-suite/")))) +(sb-simd-test-suite::run-test-suite) diff --git a/tests/sb-simple-streams.impure.lisp b/tests/sb-simple-streams.impure.lisp new file mode 100644 index 0000000000..7ee68fab0d --- /dev/null +++ b/tests/sb-simple-streams.impure.lisp @@ -0,0 +1,3 @@ +(require :sb-simple-streams) +(setq run-tests::*allowed-inputs* :any) +(load "../contrib/sb-simple-streams/simple-stream-tests.lisp") diff --git a/tests/sprof.impure.lisp b/tests/sb-sprof.impure.lisp similarity index 89% rename from tests/sprof.impure.lisp rename to tests/sb-sprof.impure.lisp index bc7835d0a8..38c99a561f 100644 --- a/tests/sprof.impure.lisp +++ b/tests/sb-sprof.impure.lisp @@ -5,7 +5,7 @@ ;;; but I need to try to see it behaving badly (if it does), ;;; and there's really no other way than to watch for bad output. -#+win32 (invoke-restart 'run-tests::skip-file) +#+(or win32 sparc) (invoke-restart 'run-tests::skip-file) (require :sb-sprof) (load "../contrib/sb-sprof/test.lisp") @@ -17,4 +17,4 @@ ;; It was supposed to be 100 before I decreased it. ;; surely more samples is better, right? sb-sprof-test::*sprof-loop-test-max-samples* 100) - (sb-sprof-test::run-tests))) + (sb-sprof-test:run-tests))) diff --git a/tests/test-util.lisp b/tests/test-util.lisp index ee4f9f1e47..894ecd8265 100644 --- a/tests/test-util.lisp +++ b/tests/test-util.lisp @@ -247,7 +247,7 @@ (eql package (find-package "KEYWORD"))))) (integer t)))) (unless (tree-equal name name :test #'name-ok) - (error "test name must be all-keywords: ~S" name))) + (error "test name must be all-keywords: ~S" name))) ; WHY???? (cond ((broken-p broken-on) `(progn @@ -964,3 +964,8 @@ (when (find-package "SB-SPROF") (format t "INFO: disabling SB-SPROF~%") (funcall (intern "STOP-PROFILING" "SB-SPROF")))) + +;;; This unexported symbol emulates SB-RT. Please don't use it in new tests +(defmacro deftest (name form &rest results) ; use SB-RT syntax + `(test-util:with-test (:name ,(sb-int:keywordicate name)) + (assert (equalp (multiple-value-list ,form) ',results)))) From 55655ceca0b912bad26e992e4776f03d831c7ff0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 1 Sep 2022 22:13:36 -0400 Subject: [PATCH 3902/4023] Add another bail-out condition for mpfr tests --- tests/sb-mpfr.impure.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/sb-mpfr.impure.lisp b/tests/sb-mpfr.impure.lisp index 9e41a7e329..eb44b7261d 100644 --- a/tests/sb-mpfr.impure.lisp +++ b/tests/sb-mpfr.impure.lisp @@ -1,5 +1,6 @@ (handler-case (require :sb-mpfr) (warning (c) - (when (search "not loaded" (princ-to-string c)) + (when (or (search "requires at least MPFR vers" (princ-to-string c)) + (search "not loaded" (princ-to-string c))) (invoke-restart 'run-tests::skip-file)))) (load "../contrib/sb-mpfr/tests.lisp") From 22c7312dc23a87cadcd0799bc0b5e646f27fc6fd Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sat, 3 Sep 2022 18:33:32 +0200 Subject: [PATCH 3903/4023] Mark some TODO items as done. --- TODO | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/TODO b/TODO index ecf397395f..bba5d42359 100644 --- a/TODO +++ b/TODO @@ -47,11 +47,6 @@ PEEPHOLE OPTIMIZER Have you ever read SBCL disassembly? -DEFGLOBAL - - Global lexical variables. Esp. since with threads special variable - accesses is no speed daemon. - FINISHING EXTERNAL FORMATS Byte order marks. Newline conventions. A way to specify an external @@ -88,11 +83,6 @@ POLICY MADNESS FAST-SAFE, FAST-UNSAFE) "dominant" policies, and expose the rest as separately declarable optimization toggles. - MAYBE-INLINE is also nice, but it would be good if someone could - figure out how to get rid of it while retaining the semantics it - provides. Inlining recursive functions is also something to think - about. - INHIBIT-WARNINGS really needs to go away. WINDOWS @@ -101,7 +91,7 @@ WINDOWS DARWIN - Needs love, particularly threads and exceptions/signals. slam.sh is + Needs love, particularly threads and exceptions/signals. also broken there. DRAGONFLY @@ -120,13 +110,6 @@ MISC CLEANUPS ** use %COMPILE where COMPILE-TOP-LEVEL used to be used ** remove redundant COMPILE-TOP-LEVEL and FUNCTIONAL-KIND=:TOP-LEVEL stuff from the compiler - * outstanding embarrassments - ** :IGNORE-ERRORS-P cruft in stems-and-flags.lisp-expr. (It's - reasonable to support this as a crutch when initially - bootstrapping from balky xc hosts with their own - idiosyncratic ideas of what merits FAILURE-P, but it's - embarrassing to have to use it when bootstrapping - under SBCL!), * miscellaneous simple refactoring * belated renaming: ** rename %PRIMITIVE to %VOP From 0aeeeeeb3a3f7400a7585fd522f435d01ec3c669 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 3 Sep 2022 13:53:14 -0400 Subject: [PATCH 3904/4023] Update RMDIR.ERROR.3 test --- contrib/sb-posix/posix-tests.lisp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/contrib/sb-posix/posix-tests.lisp b/contrib/sb-posix/posix-tests.lisp index 22c0d99a54..be395e4e15 100644 --- a/contrib/sb-posix/posix-tests.lisp +++ b/contrib/sb-posix/posix-tests.lisp @@ -175,17 +175,11 @@ (sb-posix:syscall-error (c) (typep (sb-posix:syscall-errno c) - '(member - #+(or darwin openbsd) - #.sb-posix:eisdir - #+win32 - #.sb-posix::eacces - #+win32 - #.sb-posix::enotempty - #+sunos - #.sb-posix::einval - #-(or darwin openbsd win32 sunos) - #.sb-posix::ebusy)))) t) + `(member #+(or darwin openbsd freebsd) ,sb-posix:eisdir + #+win32 ,sb-posix::eacces #+win32 ,sb-posix::enotempty + #+sunos ,sb-posix::einval + #-(or darwin openbsd freebsd win32 sunos) ,sb-posix::ebusy)))) + t) (deftest rmdir.error.4 (let* ((dir (ensure-directories-exist From bd2e95d66ab684a055b00b9504ec7e8b9d154e19 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 3 Sep 2022 15:47:08 -0400 Subject: [PATCH 3905/4023] Make cltl2 tests pass with fasteval Honestly I'm confused how they worked under SB-RT but I don't much care. It must have been that PROGN within DEFTEST was handled as a sequence of distinct toplevel forms. Don't rely on it. --- contrib/sb-cltl2/sb-cltl2.asd | 11 +----- contrib/sb-cltl2/tests.lisp | 72 ++++++++++------------------------ tests/input-manifest.lisp-expr | 3 +- tests/sb-cltl2.impure.lisp | 2 + tests/sb-cltl2.test.sh | 10 ----- 5 files changed, 25 insertions(+), 73 deletions(-) create mode 100644 tests/sb-cltl2.impure.lisp delete mode 100644 tests/sb-cltl2.test.sh diff --git a/contrib/sb-cltl2/sb-cltl2.asd b/contrib/sb-cltl2/sb-cltl2.asd index ffec6494dd..3d3fd4f8c3 100644 --- a/contrib/sb-cltl2/sb-cltl2.asd +++ b/contrib/sb-cltl2/sb-cltl2.asd @@ -9,13 +9,4 @@ :components ((:file "defpackage") (:file "compiler-let" :depends-on ("defpackage")) (:file "env" :depends-on ("defpackage"))) - :perform (load-op :after (o c) (provide 'sb-cltl2)) - :in-order-to ((test-op (test-op "sb-cltl2/tests")))) - -(defsystem "sb-cltl2/tests" - :depends-on ("sb-rt") - :components ((:file "tests"))) - -(defmethod perform ((o test-op) (c (eql (find-system "sb-cltl2/tests")))) - (or (funcall (find-symbol "DO-TESTS" "SB-RT")) - (error "test-op failed"))) + :perform (load-op :after (o c) (provide 'sb-cltl2))) diff --git a/contrib/sb-cltl2/tests.lisp b/contrib/sb-cltl2/tests.lisp index 4033edc42f..8943aef2e4 100644 --- a/contrib/sb-cltl2/tests.lisp +++ b/contrib/sb-cltl2/tests.lisp @@ -5,16 +5,15 @@ ;;;; absolutely no warranty. See the COPYING and CREDITS files for ;;;; more information. -;; Undo default contribs mufflage so that DECLARATION-INFORMATION tests pass. -sb-ext::(declaim (unmuffle-conditions compiler-note)) +;; These tests pass under sb-interpreter but not sb-eval +#+interpreter (unless (find-package "SB-INTERPRETER") (invoke-restart 'run-tests::skip-file)) (defpackage :sb-cltl2-tests - (:use :sb-cltl2 :cl :sb-rt :sb-ext :sb-kernel :sb-int)) + (:import-from #:test-util #:deftest) + (:use :sb-cltl2 :cl :sb-ext :sb-kernel :sb-int)) (in-package :sb-cltl2-tests) -(rem-all-tests) - (defmacro *x*-value () (declare (special *x*)) *x*) @@ -543,7 +542,7 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (macroexpand '(mac feh) (augment-environment nil - :macro (list (list 'mac #'(lambda (form benv) + :macro (list (list 'mac #'(lambda (form env) (declare (ignore env)) `(quote ,form ,form ,form)))))) (quote (mac feh) (mac feh) (mac feh)) @@ -601,11 +600,11 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (declare (ignore ,a ,b)) ,c))) +(define-declaration zaphod (spec env) + (declare (ignore env)) + (values :declare (cons 'zaphod spec))) (deftest define-declaration.declare (progn - (define-declaration zaphod (spec env) - (declare (ignore env)) - (values :declare (cons 'zaphod spec))) (locally (declare (zaphod beblebrox)) (locally (declare (zaphod and ford)) (ct (declaration-information 'zaphod lexenv))))) @@ -614,20 +613,17 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.declare2 (progn - (define-declaration zaphod (spec env) - (declare (ignore env)) - (values :declare (cons 'zaphod spec))) (locally (declare (zaphod beblebrox) (special x)) (ct (declaration-information 'zaphod lexenv)))) (zaphod beblebrox)) +(define-declaration vogon (spec env) + (declare (ignore env)) + (values :variable `((,(cadr spec) vogon-key vogon-value)))) (deftest define-declaration.variable (progn - (define-declaration vogon (spec env) - (declare (ignore env)) - (values :variable `((,(cadr spec) vogon-key vogon-value)))) (locally (declare (vogon poetry)) (ct (assoc 'vogon-key @@ -640,9 +636,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.variable.special (progn - (define-declaration vogon (spec env) - (declare (ignore env)) - (values :variable `((,(cadr spec) vogon-key vogon-value)))) (let (x) (declare (vogon x)) (declare (special x)) @@ -654,9 +647,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.variable.special2 (progn - (define-declaration vogon (spec env) - (declare (ignore env)) - (values :variable `((,(cadr spec) vogon-key vogon-value)))) (let (x) (declare (special x)) (declare (vogon x)) @@ -668,9 +658,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.variable.mask (progn - (define-declaration vogon (spec env) - (declare (ignore env)) - (values :variable `((,(cadr spec) vogon-key vogon-value)))) (let (x) (declare (vogon x)) (let (x) @@ -682,9 +669,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.variable.macromask (progn - (define-declaration vogon (spec env) - (declare (ignore env)) - (values :variable `((,(cadr spec) vogon-key vogon-value)))) (let (x) (declare (vogon x)) (symbol-macrolet ((x 42)) @@ -696,9 +680,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.variable.macromask2 (progn - (define-declaration vogon (spec env) - (declare (ignore env)) - (values :variable `((,(cadr spec) vogon-key vogon-value)))) (symbol-macrolet ((x 42)) (declare (vogon x)) (list @@ -713,14 +694,15 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (third (multiple-value-list (variable-information 'x lexenv)))))))) (nil (vogon-key . vogon-value))) -(deftest define-declaration.variable.mask2 - (progn +(progn (define-declaration vogon-a (spec env) (declare (ignore env)) (values :variable `((,(cadr spec) vogon-key a)))) (define-declaration vogon-b (spec env) (declare (ignore env)) - (values :variable `((,(cadr spec) vogon-key b)))) + (values :variable `((,(cadr spec) vogon-key b))))) +(deftest define-declaration.variable.mask2 + (progn (let (x) (declare (vogon-a x)) (let (x) @@ -747,11 +729,11 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) +(define-declaration sad (spec env) + (declare (ignore env)) + (values :function `((,(cadr spec) emotional-state sad)))) (deftest define-declaration.function (progn - (define-declaration sad (spec env) - (declare (ignore env)) - (values :function `((,(cadr spec) emotional-state sad)))) (locally (declare (zaphod beblebrox)) (locally (declare (sad robot)) (ct @@ -763,9 +745,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.function.lexical (progn - (define-declaration sad (spec env) - (declare (ignore env)) - (values :function `((,(cadr spec) emotional-state sad)))) (flet ((robot nil)) (locally (declare (sad robot)) (ct @@ -778,9 +757,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.function.lexical2 (progn - (define-declaration sad (spec env) - (declare (ignore env)) - (values :function `((,(cadr spec) emotional-state sad)))) (labels ((robot nil)) (declare (sad robot)) (ct @@ -792,9 +768,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.function.mask (progn - (define-declaration sad (spec env) - (declare (ignore env)) - (values :function `((,(cadr spec) emotional-state sad)))) (labels ((robot nil)) (declare (sad robot)) (labels ((robot nil)) @@ -808,9 +781,6 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) (deftest define-declaration.function.mask2 (progn - (define-declaration sad (spec env) - (declare (ignore env)) - (values :function `((,(cadr spec) emotional-state sad)))) (locally (declare (sad robot)) (labels ((robot nil)) @@ -821,11 +791,11 @@ sb-ext::(declaim (unmuffle-conditions compiler-note)) lexenv))))))) nil) +(define-declaration happy (spec env) + (declare (ignore env)) + (values :function `((,(cadr spec) emotional-state happy)))) (deftest define-declaration.function2 (progn - (define-declaration happy (spec env) - (declare (ignore env)) - (values :function `((,(cadr spec) emotional-state happy)))) (locally (declare (zaphod beblebrox)) (locally (declare (sad robot)) (locally (declare (happy robot)) diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index a1f4af3bd4..c07fea7948 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -84,8 +84,7 @@ "../contrib/sb-aclrepl/tests.lisp") ("sb-bsd-sockets.impure.lisp" "contrib/sb-bsd-sockets.fasl" "../contrib/sb-bsd-sockets/tests.lisp") - ; not working as a .impure test yet - ; ("sb-cltl2.impure.lisp" "contrib/sb-cltl2.fasl" "../contrib/sb-cltl2/tests.lisp") + ("sb-cltl2.impure.lisp" "contrib/sb-cltl2.fasl" "../contrib/sb-cltl2/tests.lisp") ("sb-concurrency.impure.lisp" "contrib/sb-concurrency.fasl" "../contrib/sb-concurrency/tests/package.lisp" "../contrib/sb-concurrency/tests/test-utils.lisp" diff --git a/tests/sb-cltl2.impure.lisp b/tests/sb-cltl2.impure.lisp new file mode 100644 index 0000000000..4ef1b9eb03 --- /dev/null +++ b/tests/sb-cltl2.impure.lisp @@ -0,0 +1,2 @@ +(require :sb-cltl2) +(load "../contrib/sb-cltl2/tests.lisp") diff --git a/tests/sb-cltl2.test.sh b/tests/sb-cltl2.test.sh deleted file mode 100644 index 59d89e9eac..0000000000 --- a/tests/sb-cltl2.test.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -. ./subr.sh -run_sbcl <<EOF - (require :sb-cltl2) - (push :sb-testing-contrib *features*) - (require :asdf) - (let ((*package* (find-package "ASDF"))) (load "../contrib/sb-cltl2/sb-cltl2.asd")) - (asdf:test-system "sb-cltl2/tests") - (exit :code $EXIT_TEST_WIN) -EOF From ce7e0e333cfb6a0cba92b70feb93c2ad8176e364 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 3 Sep 2022 16:59:11 -0400 Subject: [PATCH 3906/4023] Test sb-introspect just like all the other contribs --- contrib/sb-introspect/sb-introspect.asd | 50 +---------------------- contrib/sb-introspect/test-driver.lisp | 36 ++++++---------- contrib/sb-introspect/xref-test-data.lisp | 3 +- tests/input-manifest.lisp-expr | 4 ++ tests/sb-introspect.impure.lisp | 15 +++++++ tests/sb-introspect.test.sh | 10 ----- 6 files changed, 35 insertions(+), 83 deletions(-) create mode 100644 tests/sb-introspect.impure.lisp delete mode 100644 tests/sb-introspect.test.sh diff --git a/contrib/sb-introspect/sb-introspect.asd b/contrib/sb-introspect/sb-introspect.asd index fdee4e024f..aedf883e98 100644 --- a/contrib/sb-introspect/sb-introspect.asd +++ b/contrib/sb-introspect/sb-introspect.asd @@ -16,52 +16,4 @@ :components ((:file "introspect")) #+sb-building-contrib :pathname #+sb-building-contrib #p"SYS:CONTRIB;SB-INTROSPECT;" - :perform (load-op :after (o c) (provide 'sb-introspect)) - :in-order-to ((test-op (test-op "sb-introspect/tests")))) - -(defclass plist-file (cl-source-file) - ((source-plist - :initform nil - :initarg :source-plist - :reader plist-file-source-plist))) - -(defmethod perform ((op compile-op) (com plist-file)) - (with-compilation-unit (:source-plist (plist-file-source-plist com)) - (call-next-method))) - -(defmethod perform ((op load-op) (com plist-file)) - (with-compilation-unit (:source-plist (plist-file-source-plist com)) - (call-next-method))) - -(defsystem "sb-introspect/tests" - :depends-on ("sb-introspect" "sb-rt") - #+sb-building-contrib :pathname - #+sb-building-contrib #p"SYS:CONTRIB;SB-INTROSPECT;" - :components ((:file "xref-test-data") - (:file "xref-test" :depends-on ("xref-test-data")) - (:plist-file "test" :source-plist (:test-outer "OUT") :operation-done-p (compile-op (o c) nil)) - (:file "test-driver" :depends-on ("test"))) - :perform - (test-op (o c) - ;; N.b. At least DEFINITION-SOURCE-PLIST.1 assumes that CWD is the - ;; contrib/sb-introspect directory which is true for when this is - ;; implicitly run via make-target-contribs.sh -- but not when this - ;; is executed manually. - (let ((*default-pathname-defaults* (translate-logical-pathname (system-source-directory c)))) - (multiple-value-bind (soft strict pending) (symbol-call :sb-rt :do-tests) - (declare (ignorable pending)) - (fresh-line) - (unless strict - #+sb-testing-contrib - ;; We create TEST-PASSED from a shell script if tests passed. But - ;; since the shell script only `touch'es it, we can actually create - ;; it ahead of time -- as long as we're certain that tests truly - ;; passed, hence the check for SOFT. - (when soft - (with-open-file (s #p"SYS:CONTRIB;SB-INTROSPECT;TEST-PASSED" - :direction :output) - (dolist (pend pending) - (format s "Expected failure: ~A~%" pend)))) - (warn "ignoring expected failures in test-op")) - (unless soft - (error "test-op failed with unexpected failures")))))) + :perform (load-op :after (o c) (provide 'sb-introspect))) diff --git a/contrib/sb-introspect/test-driver.lisp b/contrib/sb-introspect/test-driver.lisp index 4a5973e14d..d62b5bc730 100644 --- a/contrib/sb-introspect/test-driver.lisp +++ b/contrib/sb-introspect/test-driver.lisp @@ -8,16 +8,11 @@ ;;;; files for more information. (defpackage :sb-introspect-test - (:use "SB-INTROSPECT" "CL" "SB-RT")) + (:import-from #:test-util #:deftest) + (:use "SB-INTROSPECT" "CL")) (in-package :sb-introspect-test) -(defmacro deftest* ((name &key fails-on) form &rest results) - `(progn - (when (sb-impl::featurep ',fails-on) - (pushnew ',name sb-rt::*expected-failures*)) - (deftest ,name ,form ,@results))) - ;; When running the tests which query for a function type, sb-interpreter ;; can return an answer if there were type declarations for the arguments, ;; except that return type is always unknown. The compiler returns a @@ -52,6 +47,10 @@ '(x b)) t) +(defmacro interpret (form) + `(let ((sb-ext:*evaluator-mode* :interpret)) + (eval ',form))) + #+sb-eval (deftest macro-lambda-list.2 (equal (function-lambda-list (interpret (defmacro macro-lambda-list.2-m (x) @@ -90,18 +89,13 @@ plist))) t t t) -;; Not sure why this fails when interpreted, and don't really care too much. -;; The behavior seems right to me anyway. -#.(if (eq sb-ext:*evaluator-mode* :compile) -'(deftest definition-source-plist.2 +;;; The behavior of :SOURCE-PLIST on nested WITH-COMPILATION-UNIT +;;; is to append. This is documented in source/compiler/main +(test-util:with-test (:name :definition-source-plist.2) (let ((plist (definition-source-plist (find-definition-source #'cl-user::four)))) - (values (or (equal (getf plist :test-outer) "OUT") - plist) - (or (equal (getf plist :test-inner) "IN") - plist))) - t t) -(values)) + (assert (equal (getf plist :test-outer) "OUT")) + (assert (equal (getf plist :test-inner) "IN")))) (defun matchp (object form-number) (let ((ds (sb-introspect:find-definition-source object))) @@ -393,7 +387,7 @@ ;;; affected builds, even if the underlying issue is (possibly?) not even ;;; strictly related to windows. C.f. lp1057631. --DFL ;;; -(deftest* (allocation-information.4 +(test-util:with-test (:name :allocation-information.4 ;; Ignored as per the comment above, even though it seems ;; unlikely that this is the right condition. :fails-on (or :win32 :ppc64 (and :sparc :gencgc))) @@ -466,7 +460,7 @@ (compile 'alloc-large-code) #+gencgc -(deftest* (allocation-information.6) +(deftest allocation-information.6 ;; Remember, all tests run after all toplevel forms have executed, ;; so if this were (DEFGLOBAL *LARGE-CODE* ... ) or something, ;; the garbage collection explicitly requested for ALLOCATION-INFORMATION.5 @@ -563,10 +557,6 @@ (sb-kernel:type= (sb-kernel:values-specifier-type typespec1) (sb-kernel:values-specifier-type typespec2)))) -(defmacro interpret (form) - `(let ((sb-ext:*evaluator-mode* :interpret)) - (eval ',form))) - ;; Functions (declaim (ftype (function (integer &optional string) string) moon)) diff --git a/contrib/sb-introspect/xref-test-data.lisp b/contrib/sb-introspect/xref-test-data.lisp index 25e692aa36..701944bb64 100644 --- a/contrib/sb-introspect/xref-test-data.lisp +++ b/contrib/sb-introspect/xref-test-data.lisp @@ -8,7 +8,8 @@ ;;;; files for more information. (defpackage :sb-introspect-test/xref - (:use "SB-INTROSPECT" "CL" "SB-RT")) + (:import-from #:test-util #:deftest) + (:use "SB-INTROSPECT" "CL")) (in-package :sb-introspect-test/xref) diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index c07fea7948..401ade25d6 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -95,6 +95,10 @@ ("sb-cover.impure.lisp" "contrib/sb-cover.fasl") ("sb-gmp.impure.lisp" "contrib/sb-gmp.fasl" "../contrib/sb-gmp/tests.lisp") ("sb-graph.impure.lisp" "contrib/sb-graph.fasl" "contrib/uiop.fasl") + ("sb-introspect.impure.lisp" "contrib/sb-introspect.fasl" + "../contrib/sb-introspect/xref-test-data.lisp" "../contrib/sb-introspect/xref-test.lisp" + "../contrib/sb-introspect/test.lisp" "../contrib/sb-introspect/test-driver.lisp" + "../contrib/sb-introspect/load-test.lisp") ("sb-md5.impure.lisp" "contrib/sb-md5.fasl" "contrib/sb-rotate-byte.fasl" "../contrib/sb-md5/md5-tests.lisp") ("sb-mpfr.impure.lisp" "contrib/sb-gmp.fasl" "contrib/sb-mpfr.fasl" diff --git a/tests/sb-introspect.impure.lisp b/tests/sb-introspect.impure.lisp new file mode 100644 index 0000000000..2acc02bc01 --- /dev/null +++ b/tests/sb-introspect.impure.lisp @@ -0,0 +1,15 @@ +(require :sb-introspect) +(test-util:with-scratch-file (f "fasl") + (load (compile-file "../contrib/sb-introspect/xref-test-data.lisp" :output-file f)) + (load "../contrib/sb-introspect/xref-test.lisp") + ;; This test is quite bogus. because it depended on WITH-COMPILATION-UNIT + ;; being wrapped around both the COMPILE-FILE and LOAD which is very weird. + ;; If we take the W-C-U out from the LOAD, then the assertions on CL-USER::FOUR + ;; fails because we don't append property lists. And if we don't COMPILE-FILE, + ;; then we lose information about COMPILE-TIME-TOO-FUN. As written, it's hard to + ;; assert about behaviors that actually occur in each step. + ;; If someone thinks this is an important distinction, that someone can + ;; write better tests. + (with-compilation-unit (:source-plist '(:test-outer "OUT")) + (load (compile-file "../contrib/sb-introspect/test.lisp" :output-file f))) + (load "../contrib/sb-introspect/test-driver.lisp")) diff --git a/tests/sb-introspect.test.sh b/tests/sb-introspect.test.sh deleted file mode 100644 index 23911531ec..0000000000 --- a/tests/sb-introspect.test.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -. ./subr.sh -run_sbcl <<EOF - (setq *features* (append sb-impl:+internal-features+ *features*)) - (push :sb-testing-contrib *features*) - (require :asdf) - (let ((*package* (find-package "ASDF"))) (load "../contrib/sb-introspect/sb-introspect.asd")) - (asdf:test-system "sb-introspect/tests") - (exit :code $EXIT_TEST_WIN) -EOF From d553587657c35c3a6b96c4952223618b8996120e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 3 Sep 2022 17:19:29 -0400 Subject: [PATCH 3907/4023] Skip some sb-concurrency tests unless compiling --- tests/sb-concurrency.impure.lisp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/sb-concurrency.impure.lisp b/tests/sb-concurrency.impure.lisp index 71c2d0a7df..f92abceae7 100644 --- a/tests/sb-concurrency.impure.lisp +++ b/tests/sb-concurrency.impure.lisp @@ -1,7 +1,8 @@ (require :sb-concurrency) (load "../contrib/sb-concurrency/tests/package.lisp") (load "../contrib/sb-concurrency/tests/test-utils.lisp") -(load "../contrib/sb-concurrency/tests/test-frlock.lisp") -(load "../contrib/sb-concurrency/tests/test-queue.lisp") +#-interpreter (load "../contrib/sb-concurrency/tests/test-frlock.lisp") +;; This passes with sb-fasteval but not sb-eval +#-interpreter (load "../contrib/sb-concurrency/tests/test-queue.lisp") (load "../contrib/sb-concurrency/tests/test-mailbox.lisp") -(load "../contrib/sb-concurrency/tests/test-gate.lisp") +#-interpreter (load "../contrib/sb-concurrency/tests/test-gate.lisp") From 851cbd2b776c158b62c482b6b2ec890c23ae4274 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 3 Sep 2022 17:27:36 -0400 Subject: [PATCH 3908/4023] Rename LINKAGE-TABLE to ALIEN-LINKAGE-TABLE Anticipating that FDEFNs can be subsumed by something other than 1st-class objects, we'll need a unified space of lisp function pointers. I tried to pick a non-conflicting name for such space, but "linkage table" really fits. Therefore this change renames the existing table. It was FOREIGN-LINKAGE-TABLE in CMUCL, but "ALIEN" requires fewer keystrokes and matches DEFINE-ALIEN. --- doc/internals/foreign-linkage.texinfo | 10 +++++----- src/assembly/arm64/tramps.lisp | 2 +- src/code/foreign-load.lisp | 4 ++-- src/code/foreign.lisp | 8 ++++---- src/code/linkage-table.lisp | 12 ++++++------ src/cold/exports.lisp | 8 ++++---- src/compiler/arm/macros.lisp | 2 +- src/compiler/arm/parms.lisp | 8 ++++---- src/compiler/arm64/parms.lisp | 8 ++++---- src/compiler/generic/early-vm.lisp | 2 +- src/compiler/generic/genesis.lisp | 16 ++++++++-------- src/compiler/generic/parms.lisp | 4 ++-- src/compiler/generic/utils.lisp | 16 ++++++++-------- src/compiler/mips/c-call.lisp | 4 ++-- src/compiler/mips/parms.lisp | 4 ++-- src/compiler/mips/show.lisp | 4 ++-- src/compiler/ppc/parms.lisp | 8 ++++---- src/compiler/ppc64/parms.lisp | 8 ++++---- src/compiler/riscv/macros.lisp | 2 +- src/compiler/riscv/parms.lisp | 8 ++++---- src/compiler/sparc/parms.lisp | 6 +++--- src/compiler/x86-64/parms.lisp | 4 ++-- src/compiler/x86/parms.lisp | 6 +++--- src/runtime/arm-arch.c | 2 +- src/runtime/arm64-arch.c | 2 +- src/runtime/bsd-os.c | 6 +++--- src/runtime/coreparse.c | 10 +++++----- src/runtime/mips-arch.c | 2 +- src/runtime/os-common.c | 8 ++++---- src/runtime/ppc-arch.c | 2 +- src/runtime/riscv-arch.c | 2 +- src/runtime/sparc-arch.c | 2 +- src/runtime/validate.c | 2 +- src/runtime/validate.h | 4 ++-- src/runtime/win32-os.c | 2 +- src/runtime/x86-64-arch.c | 2 +- src/runtime/x86-arch.c | 2 +- tests/compiler-2.pure.lisp | 2 +- tools-for-build/corefile.lisp | 8 ++++---- tools-for-build/editcore.lisp | 8 ++++---- 40 files changed, 110 insertions(+), 110 deletions(-) diff --git a/doc/internals/foreign-linkage.texinfo b/doc/internals/foreign-linkage.texinfo index de1394fbb5..2fe72cfec7 100644 --- a/doc/internals/foreign-linkage.texinfo +++ b/doc/internals/foreign-linkage.texinfo @@ -19,7 +19,7 @@ also utilized to allow references to as-of-yet unknown aliens. The SBCL implementation is somewhat simplified from the CMUCL one by Timothy Moore, but the basic idea and mechanism remain identical: instead of having addresses from @code{dlsym(3)} in the core, we have -addresses to an mmapped memory area (@code{LINKAGE_TABLE_SPACE}) that +addresses to an mmapped memory area (@code{ALIEN_LINKAGE_TABLE_SPACE}) that is initialized at startup to contain jumps & references to the correct addresses, based on information stored on the lisp side in @code{*LINKAGE-INFO*}. @@ -72,8 +72,8 @@ is used by SB-POSIX.) Find a memory area for the linkage-table, and add it for the OS in @file{src/compiler/target/parms.lisp} by defining -@code{SB-VM:LINKAGE-TABLE-SPACE-START} and -@code{SB-VM:LINKAGE-TABLE-SPACE-END}. See existing ports and CMUCL for +@code{SB-VM:ALIEN-LINKAGE-TABLE-SPACE-START} and +@code{SB-VM:ALIEN-LINKAGE-TABLE-SPACE-END}. See existing ports and CMUCL for examples. @subsubsection Porting to new architectures @@ -82,7 +82,7 @@ Write @code{arch_write_linkage_table_entry}. Write @code{FOREIGN-SYMBOL-DATAREF} VOP. -Define correct @code{SB-VM:LINKAGE-TABLE-ENTRY-SIZE} in +Define correct @code{SB-VM:ALIEN-LINKAGE-TABLE-ENTRY-SIZE} in @file{src/compiler/target/parms.lisp}. @page @@ -105,7 +105,7 @@ signalling the appropriate error. These placeholder addresses get recorded in the linkage-table. -When new shared objects are loaded @code{UPDATE-LINKAGE-TABLE} is +When new shared objects are loaded @code{UPDATE-ALIEN-LINKAGE-TABLE} is called, which in turn attempts to resolve all currently undefined aliens, and registers the correct addresses for them in the linkage-table. diff --git a/src/assembly/arm64/tramps.lisp b/src/assembly/arm64/tramps.lisp index d7493145f8..ec7b442a78 100644 --- a/src/assembly/arm64/tramps.lisp +++ b/src/assembly/arm64/tramps.lisp @@ -59,7 +59,7 @@ #-sb-thread (progn ;; Each of these loads of a fixup loads the address of a linkage table entry, - ;; that is, if LINKAGE-TABLE-SPACE-START is #xF0200000, then the first load puts + ;; that is, if ALIEN-LINKAGE-TABLE-SPACE-START is #xF0200000, then the first load puts ;; #xF0200000+something, not the address of current_control_frame_pointer, ;; into register nl2. ;; This is kinda dumb because first of all we could have calculated the address diff --git a/src/code/foreign-load.lisp b/src/code/foreign-load.lisp index 5d0fbde987..2fcbdad078 100644 --- a/src/code/foreign-load.lisp +++ b/src/code/foreign-load.lisp @@ -92,7 +92,7 @@ will be signalled when the core is saved -- this is orthogonal from DONT-SAVE." ;; If OLD is non-NIL, then we're passing "true" which causes all foreign ;; symbols to get looked up again. Otherwise we're passing "false" ;; which only tries to find symbols that aren't already found. - (update-linkage-table old)))) + (update-alien-linkage-table old)))) pathname)) (defun unload-shared-object (pathname) @@ -108,7 +108,7 @@ Experimental." (when old (dlclose-or-lose old) (setf *shared-objects* (remove old *shared-objects*)) - (update-linkage-table t) + (update-alien-linkage-table t) ;; Return T for unloaded, vs whatever update-linkage-info returns t))))) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 7aefa99fdb..f8ea646c80 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -50,7 +50,7 @@ if the symbol isn't found." (defun foreign-reinit () #+os-provides-dlopen (reopen-shared-objects) - (update-linkage-table t)) + (update-alien-linkage-table t)) ;;; Cleanups before saving a core (defun foreign-deinit () @@ -64,10 +64,10 @@ if the symbol isn't found." (declare (ignorable sap)) (let ((addr (sap-int sap))) (declare (ignorable addr)) - (when (<= sb-vm:linkage-table-space-start + (when (<= sb-vm:alien-linkage-table-space-start addr - sb-vm:linkage-table-space-end) - (let ((table-index (sb-vm::linkage-table-index-from-address addr))) + sb-vm:alien-linkage-table-space-end) + (let ((table-index (sb-vm::alien-linkage-table-index-from-address addr))) (dohash ((key value) (car *linkage-info*) :locked t) (when (= value table-index) (return-from sap-foreign-symbol (if (listp key) (car key) key)))))) diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index 6ae3f2326f..55a65ce7a4 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -61,9 +61,9 @@ (or (awhen (with-system-mutex ((hash-table-lock ht)) (or (gethash key ht) (let* ((index (hash-table-count ht)) - (capacity (floor (- sb-vm:linkage-table-space-end - sb-vm:linkage-table-space-start) - sb-vm:linkage-table-entry-size))) + (capacity (floor (- sb-vm:alien-linkage-table-space-end + sb-vm:alien-linkage-table-space-start) + sb-vm:alien-linkage-table-entry-size))) (when (< index capacity) (multiple-value-bind (defined real-address) (dlsym-wrapper t) (unless defined (push key (cdr info))) @@ -71,7 +71,7 @@ (if datap 1 0)) (logically-readonlyize name) (setf (gethash key ht) index)))))) - (sb-vm::linkage-table-entry-address it)) + (sb-vm::alien-alien-linkage-table-entry-address it)) (error "Linkage-table full (~D entries): cannot link ~S." (hash-table-count ht) name)))) @@ -86,9 +86,9 @@ ;;; If the shared-object-handle in which each symbol was originally found were ;;; stored in linkage-info, we could know which will become undefined on unload. ;;; The only "problem" is my lack of motivation to change this further. -(defun update-linkage-table (full-scan) +(defun update-alien-linkage-table (full-scan) ;; This symbol is of course itself a prelinked symbol. - (let* ((n-prelinked (extern-alien "lisp_linkage_table_n_prelinked" int)) + (let* ((n-prelinked (extern-alien "alien_linkage_table_n_prelinked" int)) (info *linkage-info*) (ht (car info)) ;; for computing anew the list of undefined symbols diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index bf7b9479b1..a020eeeec0 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -593,9 +593,9 @@ structure representations") "READ-ONLY-SPACE-START" "READ-ONLY-SPACE-END" "STATIC-SPACE-START" "STATIC-SPACE-END" "*STATIC-SPACE-FREE-POINTER*" "STATIC-CODE-SPACE-START" "STATIC-CODE-SPACE-END" "*STATIC-CODE-SPACE-FREE-POINTER*" - "LINKAGE-TABLE-SPACE-START" - "LINKAGE-TABLE-SPACE-END" - "LINKAGE-TABLE-ENTRY-SIZE" + "ALIEN-LINKAGE-TABLE-SPACE-START" + "ALIEN-LINKAGE-TABLE-SPACE-END" + "ALIEN-LINKAGE-TABLE-ENTRY-SIZE" #+sb-safepoint "GC-SAFEPOINT-PAGE-ADDR" #+sb-safepoint "GC-SAFEPOINT-TRAP-OFFSET" "THREAD-STATE-WORD-SLOT" @@ -1641,7 +1641,7 @@ SB-KERNEL) have been undone, but probably more remain.") "SYSTEM-CONDITION-CONTEXT" "REINIT-INTERNAL-REAL-TIME" "SYSTEM-INTERNAL-RUN-TIME" - "UPDATE-LINKAGE-TABLE" "VECTOR-SAP" + "UPDATE-ALIEN-LINKAGE-TABLE" "VECTOR-SAP" "WAIT-UNTIL-FD-USABLE" "WITH-CODE-PAGES-PINNED" "WITH-DEADLINE" diff --git a/src/compiler/arm/macros.lisp b/src/compiler/arm/macros.lisp index cd758e0985..1ca6ddfd6b 100644 --- a/src/compiler/arm/macros.lisp +++ b/src/compiler/arm/macros.lisp @@ -209,7 +209,7 @@ (ash 1 (tn-offset lr-tn)))) ;; select the C function index as per *LINKAGE-SPACE-PREDEFINED-ENTRIES* (let ((index (if (eq type 'list) 1 0))) - (inst ldr alloc-tn (@ null-tn (- (linkage-table-entry-address index) + (inst ldr alloc-tn (@ null-tn (- (alien-alien-linkage-table-entry-address index) nil-value)))) (inst blx alloc-tn) (inst word (logior #xe8bd0000 ; POP {rN, lr} diff --git a/src/compiler/arm/parms.lisp b/src/compiler/arm/parms.lisp index 2f18bc3f9a..c2fc4af755 100644 --- a/src/compiler/arm/parms.lisp +++ b/src/compiler/arm/parms.lisp @@ -78,8 +78,8 @@ (defconstant static-space-start #x08000000) (defconstant static-space-end #x097fff00) - (defconstant linkage-table-space-start #x0a000000) - (defconstant linkage-table-space-end #x0b000000)) + (defconstant alien-linkage-table-space-start #x0a000000) + (defconstant alien-linkage-table-space-end #x0b000000)) #+gencgc (progn @@ -88,8 +88,8 @@ #+openbsd (!gencgc-space-setup #x04000000 :dynamic-space-start #x10000000)) -(defconstant linkage-table-growth-direction :down) -(defconstant linkage-table-entry-size 16) +(defconstant alien-linkage-table-growth-direction :down) +(defconstant alien-linkage-table-entry-size 16) ;;; Link these as data entries so that we store only the address of the ;;; handwritten assembly code in the linkage able, and not a trampoline ;;; to the trampoline. The ALLOCATION macro just wants an address. diff --git a/src/compiler/arm64/parms.lisp b/src/compiler/arm64/parms.lisp index 1c2f9b27ad..23c02b0c2f 100644 --- a/src/compiler/arm64/parms.lisp +++ b/src/compiler/arm64/parms.lisp @@ -72,8 +72,8 @@ (defconstant static-space-start #x08000000) (defconstant static-space-end #x097fff00) - (defconstant linkage-table-space-start #x0a000000) - (defconstant linkage-table-space-end #x0b000000) + (defconstant alien-linkage-table-space-start #x0a000000) + (defconstant alien-linkage-table-space-end #x0b000000) #+(or linux openbsd) (progn (defparameter dynamic-0-space-start #x4f000000) @@ -87,8 +87,8 @@ #-darwin #x1000000000 #+darwin #x7003000000) -(defconstant linkage-table-growth-direction :up) -(defconstant linkage-table-entry-size 16) +(defconstant alien-linkage-table-growth-direction :up) +(defconstant alien-linkage-table-entry-size 16) ;;;; other miscellaneous constants diff --git a/src/compiler/generic/early-vm.lisp b/src/compiler/generic/early-vm.lisp index bc65bb196c..3fcb3fc47c 100644 --- a/src/compiler/generic/early-vm.lisp +++ b/src/compiler/generic/early-vm.lisp @@ -140,7 +140,7 @@ (let ((stop (1- (ash 1 n-word-bits))) (start dynamic-space-start)) (dolist (other-start (list read-only-space-start static-space-start - linkage-table-space-start)) + alien-linkage-table-space-start)) (declare (notinline <)) ; avoid dead code note (when (< start other-start) (setf stop (min stop other-start)))) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index e5a9e56609..49fd063460 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -264,7 +264,7 @@ (defvar *immobile-text*) (defvar *immobile-space-map* nil)) -;;; This ignores linkage-table-core-space-id +;;; This ignores alien-linkage-table-core-space-id ;;; which is never present in the core file. (defconstant max-core-space-id (+ 3 #+immobile-space 2 #+darwin-jit 1)) @@ -2360,9 +2360,9 @@ Legal values for OFFSET are -4, -8, -12, ..." (cold-fun-entry-addr (cold-symbol-function name)) kind :static-call)))) -(defun linkage-table-note-symbol (symbol-name datap) +(defun alien-linkage-table-note-symbol (symbol-name datap) "Register a symbol and return its address in proto-linkage-table." - (sb-vm::linkage-table-entry-address + (sb-vm::alien-alien-linkage-table-entry-address (ensure-gethash (if datap (list symbol-name) symbol-name) *cold-foreign-symbol-table* (hash-table-count *cold-foreign-symbol-table*)))) @@ -2928,8 +2928,8 @@ Legal values for OFFSET are -4, -8, -12, ..." (:assembly-routine* (lookup-assembler-reference name :indirect)) (:asm-routine-nil-offset (- (lookup-assembler-reference name) sb-vm:nil-value)) - (:foreign (linkage-table-note-symbol string nil)) - (:foreign-dataref (linkage-table-note-symbol string t)) + (:foreign (alien-linkage-table-note-symbol string nil)) + (:foreign-dataref (alien-linkage-table-note-symbol string t)) (:code-object (descriptor-bits code-obj)) #+sb-thread ; ENSURE-SYMBOL-TLS-INDEX isn't defined otherwise (:symbol-tls-index (ensure-symbol-tls-index name)) @@ -2977,7 +2977,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (aver (zerop (rem sb-vm:fixedobj-space-size (* 32 sb-vm:immobile-card-bytes)))) #-gencgc (check sb-vm:dynamic-0-space-start sb-vm:dynamic-0-space-end :dynamic-0) - (check sb-vm:linkage-table-space-start sb-vm:linkage-table-space-end :linkage-table)))) + (check sb-vm:alien-linkage-table-space-start sb-vm:alien-linkage-table-space-end :linkage-table)))) ;;;; emitting C header file @@ -3665,7 +3665,7 @@ III. initially undefined function references (alphabetically): (let ((name (car entry))) (format t " ~:[ ~;(D)~] ~8x = ~a~%" (listp name) - (sb-vm::linkage-table-entry-address (cdr entry)) + (sb-vm::alien-alien-linkage-table-entry-address (cdr entry)) (car (ensure-list name))))) #+sb-thread @@ -3855,7 +3855,7 @@ III. initially undefined function references (alphabetically): ;; Prefill some linkage table entries perhaps (loop for (name datap) in sb-vm::*linkage-space-predefined-entries* - do (linkage-table-note-symbol name datap)) + do (alien-linkage-table-note-symbol name datap)) ;; Now that we've successfully read our only input file (by ;; loading the symbol table, if any), it's a good time to ensure diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 2f9ee12a75..d2d064f6e0 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -83,7 +83,7 @@ ((spaces (append `((read-only ,ro-space-size) #+(and win32 x86-64) (seh-data ,(symbol-value '+backend-page-bytes+) win64-seh-data-addr) - (linkage-table ,small-space-size) + (alien-linkage-table ,small-space-size) #+sb-safepoint ;; Must be just before NIL. (safepoint ,(symbol-value '+backend-page-bytes+) gc-safepoint-page-addr) @@ -99,7 +99,7 @@ appending (let* ((relocatable ;; READONLY is usually movable now. - ;; TODO: linkage-table could move with code, if the CPU + ;; TODO: alien-linkage-table could move with code, if the CPU ;; prefers PC-relative jumps, and we emit better code ;; (which we don't- for x86 we jmp via RBX always) (member space '(fixedobj text diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 52ee16100d..805b4e47a7 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -50,17 +50,17 @@ 0)) ;;; the address of the linkage table entry for table index I. -(defun linkage-table-entry-address (i) - (ecase linkage-table-growth-direction - (:up (+ (* i linkage-table-entry-size) linkage-table-space-start)) - (:down (- linkage-table-space-end (* (1+ i) linkage-table-entry-size))))) +(defun alien-alien-linkage-table-entry-address (i) + (ecase alien-linkage-table-growth-direction + (:up (+ (* i alien-linkage-table-entry-size) alien-linkage-table-space-start)) + (:down (- alien-linkage-table-space-end (* (1+ i) alien-linkage-table-entry-size))))) -(defun linkage-table-index-from-address (addr) - (ecase linkage-table-growth-direction +(defun alien-linkage-table-index-from-address (addr) + (ecase alien-linkage-table-growth-direction (:up - (floor (- addr linkage-table-space-start) linkage-table-entry-size)) + (floor (- addr alien-linkage-table-space-start) alien-linkage-table-entry-size)) (:down - (1- (floor (- linkage-table-space-end addr) linkage-table-space-end))))) + (1- (floor (- alien-linkage-table-space-end addr) alien-linkage-table-space-end))))) (defconstant-eqx +all-static-fdefns+ #.(concatenate 'vector +c-callable-fdefns+ +static-fdefns+) #'equalp) diff --git a/src/compiler/mips/c-call.lisp b/src/compiler/mips/c-call.lisp index 28815bfe5f..013c7a25cd 100644 --- a/src/compiler/mips/c-call.lisp +++ b/src/compiler/mips/c-call.lisp @@ -250,8 +250,8 @@ (let ((cur-nfp (current-nfp-tn vop))) (when cur-nfp (store-stack-tn nfp-save cur-nfp)) - ;; (linkage-table-entry-address 0) is "call-into-c" in mips-assem.S - (inst lw tramp null-tn (- (linkage-table-entry-address 0) nil-value)) + ;; (alien-alien-linkage-table-entry-address 0) is "call-into-c" in mips-assem.S + (inst lw tramp null-tn (- (alien-alien-linkage-table-entry-address 0) nil-value)) (inst nop) (inst jal tramp) (inst move cfunc function) diff --git a/src/compiler/mips/parms.lisp b/src/compiler/mips/parms.lisp index 7883b7f1d5..4818f16438 100644 --- a/src/compiler/mips/parms.lisp +++ b/src/compiler/mips/parms.lisp @@ -58,8 +58,8 @@ (progn (!gencgc-space-setup #x04000000 :dynamic-space-start #x4f000000) - (defconstant linkage-table-entry-size 4) - (defconstant linkage-table-growth-direction :down) + (defconstant alien-linkage-table-entry-size 4) + (defconstant alien-linkage-table-growth-direction :down) (setq *linkage-space-predefined-entries* '(("call_into_c" nil))) ;; C stack grows downward from 0x80000000 diff --git a/src/compiler/mips/show.lisp b/src/compiler/mips/show.lisp index 292ccf83a6..cb9b0d6a65 100644 --- a/src/compiler/mips/show.lisp +++ b/src/compiler/mips/show.lisp @@ -26,8 +26,8 @@ (when cur-nfp (store-stack-tn nfp-save cur-nfp)) (move nl0 object) - ;; (linkage-table-entry-address 0) is "call-into-c" in mips-assem.S - (inst lw tramp null-tn (- (linkage-table-entry-address 0) nil-value)) + ;; (alien-alien-linkage-table-entry-address 0) is "call-into-c" in mips-assem.S + (inst lw tramp null-tn (- (alien-alien-linkage-table-entry-address 0) nil-value)) (inst li cfunc (make-fixup "debug_print" :foreign)) (inst jal tramp) (inst subu nsp-tn 16) diff --git a/src/compiler/ppc/parms.lisp b/src/compiler/ppc/parms.lisp index 4a99d5054b..824e9d21a1 100644 --- a/src/compiler/ppc/parms.lisp +++ b/src/compiler/ppc/parms.lisp @@ -93,8 +93,8 @@ (defconstant static-space-start #x08000000) (defconstant static-space-end #x097fff00) - (defconstant linkage-table-space-start #x0a000000) - (defconstant linkage-table-space-end #x0b000000)) + (defconstant alien-linkage-table-space-start #x0a000000) + (defconstant alien-linkage-table-space-end #x0b000000)) ;;; While on gencgc we don't. #+gencgc @@ -105,8 +105,8 @@ #+netbsd #x4f000000 #+openbsd #x4f000000) -(defconstant linkage-table-growth-direction :up) -(defconstant linkage-table-entry-size 16) +(defconstant alien-linkage-table-growth-direction :up) +(defconstant alien-linkage-table-entry-size 16) #+linux (progn diff --git a/src/compiler/ppc64/parms.lisp b/src/compiler/ppc64/parms.lisp index 2004cd4db7..ca6a07faa5 100644 --- a/src/compiler/ppc64/parms.lisp +++ b/src/compiler/ppc64/parms.lisp @@ -86,16 +86,16 @@ (defconstant static-space-start #x08000000) (defconstant static-space-end #x097fff00) - (defconstant linkage-table-space-start #x0a000000) - (defconstant linkage-table-space-end #x0b000000)) + (defconstant alien-linkage-table-space-start #x0a000000) + (defconstant alien-linkage-table-space-end #x0b000000)) ;;; While on gencgc we don't. #+gencgc (!gencgc-space-setup #x04000000 :read-only-space-size 0 :dynamic-space-start #x1000000000) -(defconstant linkage-table-growth-direction :up) -(defconstant linkage-table-entry-size #+little-endian 28 #+big-endian 24) +(defconstant alien-linkage-table-growth-direction :up) +(defconstant alien-linkage-table-entry-size #+little-endian 28 #+big-endian 24) #+linux (progn diff --git a/src/compiler/riscv/macros.lisp b/src/compiler/riscv/macros.lisp index b0e96f86cf..b411453494 100644 --- a/src/compiler/riscv/macros.lisp +++ b/src/compiler/riscv/macros.lisp @@ -93,7 +93,7 @@ (define-tls-accessors load-stepping store-stepping thread-stepping-slot sb-impl::*stepping*)) -;;; TODO: these two macros would benefit from linkage-table space being +;;; TODO: these two macros would benefit from alien-linkage-table space being ;;; located below static space with linkage entries allocated downward ;;; from the end. Then the sequence would reduce to 2 instructions: ;;; lw temp (k)$NULL diff --git a/src/compiler/riscv/parms.lisp b/src/compiler/riscv/parms.lisp index 912abb9e53..1e1099d0f3 100644 --- a/src/compiler/riscv/parms.lisp +++ b/src/compiler/riscv/parms.lisp @@ -69,15 +69,15 @@ (defconstant static-space-start #x08000000) (defconstant static-space-end #x097fff00) - (defconstant linkage-table-space-start #x0a000000) - (defconstant linkage-table-space-end #x0b000000)) + (defconstant alien-linkage-table-space-start #x0a000000) + (defconstant alien-linkage-table-space-end #x0b000000)) ;;; While on gencgc we don't. #+gencgc (!gencgc-space-setup #x04000000 :dynamic-space-start #x4f000000) -(defconstant linkage-table-entry-size #-64-bit 8 #+64-bit 24) -(defconstant linkage-table-growth-direction :down) +(defconstant alien-linkage-table-entry-size #-64-bit 8 #+64-bit 24) +(defconstant alien-linkage-table-growth-direction :down) (setq *linkage-space-predefined-entries* '(#+gencgc("alloc" nil) #+gencgc("alloc_list" nil))) diff --git a/src/compiler/sparc/parms.lisp b/src/compiler/sparc/parms.lisp index 7978dfb311..dae8e6a3e1 100644 --- a/src/compiler/sparc/parms.lisp +++ b/src/compiler/sparc/parms.lisp @@ -83,10 +83,10 @@ (!gencgc-space-setup #x0f800000 :dynamic-space-start #x30000000) -;; Size of one linkage-table entry in bytes. See comment in +;; Size of one alien-linkage-table entry in bytes. See comment in ;; src/runtime/sparc-arch.c -(defconstant linkage-table-entry-size 16) -(defconstant linkage-table-growth-direction :up) +(defconstant alien-linkage-table-entry-size 16) +(defconstant alien-linkage-table-growth-direction :up) (defenum (:start 8) diff --git a/src/compiler/x86-64/parms.lisp b/src/compiler/x86-64/parms.lisp index 5e5fca2bb4..c4a2569ce5 100644 --- a/src/compiler/x86-64/parms.lisp +++ b/src/compiler/x86-64/parms.lisp @@ -108,8 +108,8 @@ :dynamic-space-start #x1000000000 #+openbsd :dynamic-space-size #+openbsd #x1bcf0000) -(defconstant linkage-table-growth-direction :up) -(defconstant linkage-table-entry-size 16) +(defconstant alien-linkage-table-growth-direction :up) +(defconstant alien-linkage-table-entry-size 16) (defenum (:start 8) diff --git a/src/compiler/x86/parms.lisp b/src/compiler/x86/parms.lisp index d5cfb28462..b0a248bc9d 100644 --- a/src/compiler/x86/parms.lisp +++ b/src/compiler/x86/parms.lisp @@ -174,9 +174,9 @@ #+netbsd (space-setup #x20000000 :dynamic-space-start #x60000000) #+darwin (space-setup #x04000000 :dynamic-space-start #x10000000) -;;; Size of one linkage-table entry in bytes. -(defconstant linkage-table-entry-size 8) -(defconstant linkage-table-growth-direction :up) +;;; Size of one alien-linkage-table entry in bytes. +(defconstant alien-linkage-table-entry-size 8) +(defconstant alien-linkage-table-growth-direction :up) (defenum (:start 8) diff --git a/src/runtime/arm-arch.c b/src/runtime/arm-arch.c index c067e989ab..f8c7b5a7f5 100644 --- a/src/runtime/arm-arch.c +++ b/src/runtime/arm-arch.c @@ -126,7 +126,7 @@ void arch_write_linkage_table_entry(int index, void *target_addr, int datap) { // allocate successive entries downward char *reloc_addr = - (char*)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + (char*)ALIEN_LINKAGE_TABLE_SPACE_END - (index + 1) * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { *(unsigned long *)reloc_addr = (unsigned long)target_addr; return; diff --git a/src/runtime/arm64-arch.c b/src/runtime/arm64-arch.c index 6ebb5c4713..f84fb633bd 100644 --- a/src/runtime/arm64-arch.c +++ b/src/runtime/arm64-arch.c @@ -151,7 +151,7 @@ void arch_install_interrupt_handlers() void arch_write_linkage_table_entry(int index, void *target_addr, int datap) { THREAD_JIT(0); - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { *(unsigned long *)reloc_addr = (unsigned long)target_addr; diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index 659ef0e172..ce72fc6194 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -121,10 +121,10 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id { int __attribute((unused)) executable = (space_id == READ_ONLY_CORE_SPACE_ID) || - (space_id == LINKAGE_TABLE_CORE_SPACE_ID) || + (space_id == ALIEN_LINKAGE_TABLE_CORE_SPACE_ID) || (space_id == STATIC_CODE_CORE_SPACE_ID), jit = (space_id == STATIC_CODE_CORE_SPACE_ID) || (space_id == DYNAMIC_CORE_SPACE_ID) - ? 1 : (space_id == LINKAGE_TABLE_CORE_SPACE_ID) ? 2 : 0; + ? 1 : (space_id == ALIEN_LINKAGE_TABLE_CORE_SPACE_ID) ? 2 : 0; int protection; int flags = 0; @@ -602,7 +602,7 @@ The system may fail to start.\n", */ getrlimit (RLIMIT_DATA, &rl); if (dynamic_space_size + READ_ONLY_SPACE_SIZE + STATIC_SPACE_SIZE + - LINKAGE_TABLE_SPACE_SIZE + wantfree > rl.rlim_cur) + ALIEN_LINKAGE_TABLE_SPACE_SIZE + wantfree > rl.rlim_cur) fprintf (stderr, "RUNTIME WARNING: data size resource limit may be too low,\n" " try decreasing the dynamic space size with --dynamic-space-size\n" diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 17ec80feda..cafd59b87a 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -92,7 +92,7 @@ open_binary(char *filename, int mode) int lisp_code_in_elf() { return 0; } #else extern __attribute__((weak)) lispobj - lisp_code_start, lisp_jit_code, lisp_code_end, lisp_linkage_values; + lisp_code_start, lisp_jit_code, lisp_code_end, alien_linkage_values; int lisp_code_in_elf() { return &lisp_code_start != 0; } #endif @@ -741,7 +741,7 @@ process_directory(int count, struct ndir_entry *entry, (uword_t)&lisp_code_start, (uword_t)&lisp_code_end, text_space_highwatermark); #endif - // Prefill the Lisp linkage table so that shrinkwrapped executables which link in + // Prefill the alien linkage table so that shrinkwrapped executables which link in // all their C library dependencies can avoid linking with -ldl. // All data references are potentially needed because aliencomp doesn't emit // SAP-REF-n in a way that admits elision of the linkage entry. e.g. @@ -752,12 +752,12 @@ process_directory(int count, struct ndir_entry *entry, // but that's more of a change to the asm instructions than I'm comfortable making; // whereas "CALL linkage_entry_for_f" -> "CALL f" is quite straightforward. // (Rarely would a jmp indirection be used; maybe for newly compiled code?) - lispobj* ptr = &lisp_linkage_values; + lispobj* ptr = &alien_linkage_values; gc_assert(ptr); int entry_index = 0; int count; - extern int lisp_linkage_table_n_prelinked; - count = lisp_linkage_table_n_prelinked = *ptr++; + extern int alien_linkage_table_n_prelinked; + count = alien_linkage_table_n_prelinked = *ptr++; for ( ; count-- ; entry_index++ ) { boolean datap = *ptr == (lispobj)-1; // -1 can't be a function address if (datap) diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index 8098d120b5..34fbb1c9e2 100644 --- a/src/runtime/mips-arch.c +++ b/src/runtime/mips-arch.c @@ -497,7 +497,7 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) { // allocate successive entries downward char *reloc_addr = - (char*)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + (char*)ALIEN_LINKAGE_TABLE_SPACE_END - (index + 1) * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; *(unsigned int *)reloc_addr = (unsigned int)target_addr; } diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 538549fc8b..09f097b53b 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -168,7 +168,7 @@ os_dlsym_default(char *name) } #endif -int lisp_linkage_table_n_prelinked; +int alien_linkage_table_n_prelinked; void os_link_runtime() { int entry_index = 0; @@ -178,12 +178,12 @@ void os_link_runtime() void* result; int j; - if (lisp_linkage_table_n_prelinked) + if (alien_linkage_table_n_prelinked) return; // Linkage was already performed by coreparse struct vector* symbols = VECTOR(SymbolValue(REQUIRED_FOREIGN_SYMBOLS,0)); - lisp_linkage_table_n_prelinked = vector_len(symbols); - for (j = 0 ; j < lisp_linkage_table_n_prelinked ; ++j) + alien_linkage_table_n_prelinked = vector_len(symbols); + for (j = 0 ; j < alien_linkage_table_n_prelinked ; ++j) { lispobj item = symbols->data[j]; datap = listp(item); diff --git a/src/runtime/ppc-arch.c b/src/runtime/ppc-arch.c index 1822d8a766..757997f09a 100644 --- a/src/runtime/ppc-arch.c +++ b/src/runtime/ppc-arch.c @@ -608,7 +608,7 @@ ppc_flush_icache(os_vm_address_t address, os_vm_size_t length) void arch_write_linkage_table_entry(int index, void *target_addr, int datap) { - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { *(unsigned long *)reloc_addr = (unsigned long)target_addr; return; diff --git a/src/runtime/riscv-arch.c b/src/runtime/riscv-arch.c index 32747c0564..6c1994829b 100644 --- a/src/runtime/riscv-arch.c +++ b/src/runtime/riscv-arch.c @@ -165,7 +165,7 @@ void arch_write_linkage_table_entry(int index, void *target_addr, int datap) { // allocate successive entries downward char *reloc_addr = - (char*)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + (char*)ALIEN_LINKAGE_TABLE_SPACE_END - (index + 1) * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { *(unsigned long *)reloc_addr = (unsigned long)target_addr; return; diff --git a/src/runtime/sparc-arch.c b/src/runtime/sparc-arch.c index d77066ae24..f5fad5dedb 100644 --- a/src/runtime/sparc-arch.c +++ b/src/runtime/sparc-arch.c @@ -304,7 +304,7 @@ void arch_install_interrupt_handlers() void arch_write_linkage_table_entry(int index, void *target_addr, int datap) { - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { *(unsigned long *)reloc_addr = (unsigned long)target_addr; return; diff --git a/src/runtime/validate.c b/src/runtime/validate.c index 18284bb555..8bc7db7f27 100644 --- a/src/runtime/validate.c +++ b/src/runtime/validate.c @@ -88,7 +88,7 @@ boolean allocate_hardwired_spaces(boolean hard_failp) int id; } preinit_spaces[] = { { READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE, READ_ONLY_CORE_SPACE_ID }, - { LINKAGE_TABLE_SPACE_START, LINKAGE_TABLE_SPACE_SIZE, LINKAGE_TABLE_CORE_SPACE_ID }, + { ALIEN_LINKAGE_TABLE_SPACE_START, ALIEN_LINKAGE_TABLE_SPACE_SIZE, ALIEN_LINKAGE_TABLE_CORE_SPACE_ID }, { STATIC_SPACE_START, STATIC_SPACE_SIZE, STATIC_CORE_SPACE_ID }, #ifdef LISP_FEATURE_DARWIN_JIT { STATIC_CODE_SPACE_START, STATIC_CODE_SPACE_SIZE, STATIC_CODE_CORE_SPACE_ID }, diff --git a/src/runtime/validate.h b/src/runtime/validate.h index b181d29db4..fb1f78024b 100644 --- a/src/runtime/validate.h +++ b/src/runtime/validate.h @@ -33,8 +33,8 @@ #define STATIC_CODE_SPACE_SIZE (STATIC_CODE_SPACE_END - STATIC_CODE_SPACE_START) #endif -#define LINKAGE_TABLE_SPACE_SIZE \ - (LINKAGE_TABLE_SPACE_END - LINKAGE_TABLE_SPACE_START) +#define ALIEN_LINKAGE_TABLE_SPACE_SIZE \ + (ALIEN_LINKAGE_TABLE_SPACE_END - ALIEN_LINKAGE_TABLE_SPACE_START) #if !defined(__ASSEMBLER__) #include "thread.h" diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index aeecc9485d..68900b7f64 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -208,7 +208,7 @@ void unmap_gc_page() * bundle'' that rolls up your patch, redumps and -- presto -- 100MiB * program is fixed by sending and loading a 50KiB thingie. * - * However, until LISP_FEATURE_LINKAGE_TABLE, if your bug were fixed + * However, until LISP_FEATURE_ALIEN_LINKAGE_TABLE, if your bug were fixed * by modifying two lines of _C_ sources, a customer described above * had to be ready to receive and reinstall a new 100MiB * executable. With the aid of code below, deploying such a fix diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 83dad4ad5d..013b368141 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -518,7 +518,7 @@ arch_install_interrupt_handlers() void arch_write_linkage_table_entry(int index, void *target_addr, int datap) { - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { *(uword_t *)reloc_addr = (uword_t)target_addr; return; diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index f1940f73f6..90459cb955 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -366,7 +366,7 @@ void arch_write_linkage_table_entry(int index, void *target_addr, int datap) { // 'volatile' works around a spurious GCC warning - volatile char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + volatile char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { *(unsigned long *)reloc_addr = (unsigned long)target_addr; return; diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 2d40083383..e3e1b2085f 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -216,7 +216,7 @@ ;; Should not have a call to SET-SYMBOL-GLOBAL-VALUE> (assert (not (ctu:find-code-constants f :type 'sb-kernel:fdefn)))))) -(with-test (:name :linkage-table-bogosity) +(with-test (:name :alien-linkage-table-bogosity) (let ((strings (map 'list (lambda (x) (if (consp x) (car x) x)) sb-vm::+required-foreign-symbols+))) (assert (= (length (remove-duplicates strings :test 'string=)) diff --git a/tools-for-build/corefile.lisp b/tools-for-build/corefile.lisp index e48f462cbc..ab5c1af392 100644 --- a/tools-for-build/corefile.lisp +++ b/tools-for-build/corefile.lisp @@ -6,7 +6,7 @@ #:directory-core-entry-type-code #:initial-fun-core-entry-type-code #:page-table-core-entry-type-code - #:linkage-table-core-entry-type-code + #:alien-linkage-table-core-entry-type-code #:end-core-entry-type-code #:max-core-space-id ;; @@ -16,7 +16,7 @@ #:dynamic-core-space-id #:immobile-fixedobj-core-space-id #:immobile-text-core-space-id - #:linkage-table-core-space-id + #:alien-linkage-table-core-space-id #:deflated-core-space-id-flag)) (in-package "SB-COREFILE") @@ -43,7 +43,7 @@ (defconstant directory-core-entry-type-code 3861) (defconstant initial-fun-core-entry-type-code 3863) (defconstant page-table-core-entry-type-code 3880) -(defconstant linkage-table-core-entry-type-code 3881) +(defconstant alien-linkage-table-core-entry-type-code 3881) (defconstant end-core-entry-type-code 3840) (defconstant dynamic-core-space-id 1) @@ -55,4 +55,4 @@ (defconstant deflated-core-space-id-flag 8) ;;; this space-id is not present in the core file ;;; but we need a unique ID to pass to os_validate -(defconstant linkage-table-core-space-id 101) +(defconstant alien-linkage-table-core-space-id 101) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index fad19f942e..65879b7798 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -454,12 +454,12 @@ (let* ((linkage-bounds (make-bounds (symbol-global-value - (find-target-symbol (package-id "SB-VM") "LINKAGE-TABLE-SPACE-START" spaces :physical)) + (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-SPACE-START" spaces :physical)) (symbol-global-value - (find-target-symbol (package-id "SB-VM") "LINKAGE-TABLE-SPACE-END" spaces :physical)))) + (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-SPACE-END" spaces :physical)))) (linkage-entry-size (symbol-global-value - (find-target-symbol (package-id "SB-VM") "LINKAGE-TABLE-ENTRY-SIZE" + (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-ENTRY-SIZE" spaces :physical))) (linkage-symbols (compute-linkage-symbols spaces)) (nil-object (compute-nil-object spaces)) @@ -1815,7 +1815,7 @@ "~% .section .rodata~%")) (format asm-file " .globl ~A~%~:*~A: .quad ~d # ct~%" - (labelize "lisp_linkage_values") + (labelize "alien_linkage_values") (length (core-linkage-symbols core))) ;; -1 (not a plausible function address) signifies that word ;; following it is a data, not text, reference. From 9dae5576972a578ec1c9b9ac628d29e3d9587eb6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 3 Sep 2022 20:16:03 -0400 Subject: [PATCH 3909/4023] Simplify logic around untagged fdefns Untagged fdefns only pertained to named call when first implemented, but then later to IR2-CONVERT-GLOBAL-VAR as well. Distinct kinds of fdefn references from the code header are no longer needed. Also change :NAMED-CALL fixups to :FDEFN-CALL because they were confusable for :NAMED-CALL code constants, though not so much any more. --- src/code/immobile-space.lisp | 6 ++--- src/code/simple-fun.lisp | 19 ++++++--------- src/code/stubs.lisp | 1 - src/code/symbol.lisp | 2 ++ src/code/x86-64-vm.lisp | 12 ++++------ src/compiler/dump.lisp | 16 ++++++++----- src/compiler/generic/genesis.lisp | 6 +++-- src/compiler/generic/target-core.lisp | 25 ++++++++++---------- src/compiler/ir2tran.lisp | 34 +++++++++++++++------------ src/compiler/ppc64/cell.lisp | 12 ++++------ src/compiler/represent.lisp | 4 ++-- src/compiler/x86-64/call.lisp | 4 ++-- src/compiler/x86-64/insts.lisp | 2 +- tests/compiler-2.pure.lisp | 9 +++---- 14 files changed, 74 insertions(+), 78 deletions(-) diff --git a/src/code/immobile-space.lisp b/src/code/immobile-space.lisp index 85175c2afb..46dc64e4c0 100644 --- a/src/code/immobile-space.lisp +++ b/src/code/immobile-space.lisp @@ -158,10 +158,8 @@ (let ((fun-entry (sb-vm::fdefn-raw-addr fdefn)) (fdefn-entry (sb-vm::fdefn-entry-address fdefn))) (flet ((code-statically-links-fdefn-p (code) - (let ((fdefns-start (+ code-constants-offset - (* code-slots-per-simple-fun - (code-n-entries code))))) - (dotimes (i (code-n-named-calls code)) + (multiple-value-bind (fdefns-start count) (sb-vm::code-header-fdefn-range code) + (dotimes (i count) (let ((constant (code-header-ref code (+ fdefns-start i)))) (when (or (eq constant fdefn) (and (consp constant) (eq (car constant) fdefn))) diff --git a/src/code/simple-fun.lisp b/src/code/simple-fun.lisp index 2828f7e16c..b277b88376 100644 --- a/src/code/simple-fun.lisp +++ b/src/code/simple-fun.lisp @@ -425,18 +425,13 @@ (declare (type code-component code-obj)) (ash (code-fun-table-count code-obj) -5)) -;;; Index to start of named-call fdefns -;;; FIXME: Naming symmetry between this and code-n-named-calls might be nice. -(defun code-fdefns-start-index (code-obj) - (+ sb-vm:code-constants-offset - (* (code-n-entries code-obj) sb-vm:code-slots-per-simple-fun))) - -;;; Number of "called" fdefns, which does not count fdefns in the boxed -;;; constants that are used in #'FUN syntax without a funcall necessarily -;;; occuring, though it may. -(defun code-n-named-calls (code-obj) - (ash (sb-vm::%code-boxed-size code-obj) - (+ -32 sb-vm:n-fixnum-tag-bits))) +;;; Start and count of fdefns used in #'F synax or normal named call +;;; (i.e. at the head of an expression) +(defun sb-vm::code-header-fdefn-range (code-obj) + (values (+ sb-vm:code-constants-offset + (* (code-n-entries code-obj) sb-vm:code-slots-per-simple-fun)) + (ash (sb-vm::%code-boxed-size code-obj) + (+ -32 sb-vm:n-fixnum-tag-bits)))) ;;; Return the offset in bytes from (CODE-INSTRUCTIONS CODE-OBJ) ;;; to its FUN-INDEXth function. diff --git a/src/code/stubs.lisp b/src/code/stubs.lisp index 9ccfcde36d..91e59edea5 100644 --- a/src/code/stubs.lisp +++ b/src/code/stubs.lisp @@ -160,7 +160,6 @@ (def stack-ref (s n)) (def fun-code-header) (def symbol-hash) - #+sb-thread (def symbol-tls-index) (def symbol-%info) ; primitive reader always needs a stub ;; but the "wrapped" reader might not need a stub. ;; If it's already a proper function, then it doesn't. diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index 87d800db5e..e0c48587e0 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -597,3 +597,5 @@ distinct from the global value. Can also be SETF." :datum new-value :expected-type spec))))))) nil)) + +#+sb-thread (defun symbol-tls-index (x) (symbol-tls-index x)) ; necessary stub diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index 94f65ee106..4d2c6d9bda 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -355,13 +355,11 @@ (unless (immobile-space-obj-p code) (return-from statically-link-code-obj code)) #+immobile-code - (let* ((fdefns-start (+ code-constants-offset - (* code-slots-per-simple-fun (code-n-entries code)))) - (fdefns-count (the index (code-n-named-calls code))) - (replacements (make-array fdefns-count :initial-element nil)) - (ambiguous (make-array fdefns-count :initial-element 0 :element-type 'bit)) - (any-replacements) - (any-ambiguous)) + (binding* (((fdefns-start fdefns-count) (code-header-fdefn-range code)) + (replacements (make-array fdefns-count :initial-element nil)) + (ambiguous (make-array fdefns-count :initial-element 0 :element-type 'bit)) + (any-replacements nil) + (any-ambiguous nil)) ;; For each fdefn, decide two things: ;; * whether the fdefn can be replaced by its function - possible only when ;; that function is in immobile space and needs no trampoline. diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index e09fc6f2fc..57cd86fc46 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1036,7 +1036,7 @@ #(:assembly-routine :assembly-routine* :asm-routine-nil-offset :gc-barrier :symbol-tls-index :foreign :foreign-dataref :code-object - :layout :immobile-symbol :named-call :static-call + :layout :immobile-symbol :fdefn-call :static-call :symbol-value :layout-id) #'equalp) @@ -1119,7 +1119,7 @@ :immobile-symbol :symbol-value) (the symbol name)) ((:foreign :foreign-dataref) (the string name)) - ((:named-call :static-call) name)))) + ((:fdefn-call :static-call) name)))) (dump-object info fasl-output) (incf nelements (cond (named (dump-object operand fasl-output) 2) (t 1)))))) @@ -1143,7 +1143,7 @@ (let* ((2comp (component-info component)) (constants (sb-c:ir2-component-constants 2comp)) (header-length (length constants)) - (n-named-calls 0)) + (n-fdefns 0)) (collect ((patches) (named-constants)) ;; Dump the constants, noting any :ENTRY constants that have to @@ -1175,8 +1175,12 @@ (dump-fop 'fop-misc-trap fasl-output))))) (:load-time-value (dump-push (cadr entry) fasl-output)) - ((:named-call :fdefinition) - (when (eq (car entry) :named-call) (incf n-named-calls)) + (:fdefinition + ;; It's possible for other fdefns to be found in the header, but they can't + ;; have resulted from IR2 conversion. They would have had to come from + ;; something like (load-time-value (find-or-create-fdefn ...)) + ;; which is fine, but they don't count for this purpose. + (incf n-fdefns) (dump-object (cadr entry) fasl-output) (dump-fop 'fop-fdefn fasl-output)) (:known-fun @@ -1209,7 +1213,7 @@ (dump-integer-as-n-bytes (length (sb-c::ir2-component-entries 2comp)) 4 ; output 4 bytes fasl-output) - (dump-integer-as-n-bytes (the (unsigned-byte 22) n-named-calls) + (dump-integer-as-n-bytes (the (unsigned-byte 22) n-fdefns) 4 ; output 4 bytes fasl-output) (dump-segment code-segment code-length fasl-output) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 49fd063460..e6d79a237b 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2944,9 +2944,11 @@ Legal values for OFFSET are -4, -8, -12, ..." ;; but an uninterned symbol is a descriptor. (descriptor-bits (if (symbolp name) (cold-intern name) name))) (:symbol-value (descriptor-bits (cold-symbol-value name))) - (:named-call + (:fdefn-call ; x86-64 only (+ (descriptor-bits (ensure-cold-fdefn name)) - (- 2 sb-vm:other-pointer-lowtag)))) ; wtf? + ;; this jumps to the jump instruction embedded within an fdefn. + ;; (It's a terrible technique which I plan to remove.) + (- 2 sb-vm:other-pointer-lowtag)))) kind flavor)))) code-obj) diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index 714bd1b626..94c2f85231 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -100,7 +100,7 @@ ;; (whose address we don't want to wire in). (:symbol-value (get-lisp-obj-address (symbol-global-value name))) #+immobile-code - (:named-call + (:fdefn-call (prog1 (sb-vm::fdefn-entry-address name) ; creates if didn't exist (when statically-link-p (push (cons offset (find-fdefn name)) (elt preserved-lists 0))))) @@ -180,7 +180,7 @@ #+x86-64 (aver (not (nth-value 1 (sb-c:unpack-code-fixup-locs (sb-vm::%code-fixups code))))) - (aver (zerop (code-n-named-calls code))) + (aver (zerop (nth-value 1 (sb-vm::code-header-fdefn-range code)))) (let* ((nbytes (code-object-size code)) (boxed (code-header-words code)) ; word count (unboxed (- nbytes (ash boxed sb-vm:word-shift))) ; byte count @@ -296,18 +296,17 @@ (const-patch-start-index (+ sb-vm:code-constants-offset (* (length (ir2-component-entries 2comp)) sb-vm:code-slots-per-simple-fun))) - (n-named-calls - ;; Pre-scan for fdefinitions to ensure their existence. - ;; Doing so guarantees that storing them into the boxed header now - ;; can't create any old->young pointer, which is important since gencgc - ;; does not deal with untagged pointers when looking for old->young. + ;; Pre-scan for all fdefinitions to ensure their existence, which guarantees that + ;; storing them into the boxed words can't can't create an old->young pointer. + ;; This is essential since gencgc will miss them when scanning the code header + ;; for such tagged pointers. + (n-fdefns (do ((count 0) (index const-patch-start-index (1+ index))) ((>= index n-boxed-words) count) (let ((const (aref constants index))) - (when (and (listp const) (case (car const) - (:named-call (incf count)) - (:fdefinition t))) + (when (typep const '(cons (eql :fdefinition))) + (incf count) (setf (second const) (find-or-create-fdefn (second const))))))) (retained-fixups (pack-retained-fixups fixup-notes)) ((code-obj total-nwords) @@ -321,7 +320,7 @@ (real-code-obj code-obj)) (declare (ignorable boxed-data)) (sb-fasl::with-writable-code-instructions - (code-obj total-nwords debug-info n-named-calls n-simple-funs) + (code-obj total-nwords debug-info n-fdefns n-simple-funs) :copy (%byte-blt bytes 0 (code-instructions code-obj) 0 (length bytes)) :fixup (setq named-call-fixups (apply-core-fixups code-obj fixup-notes retained-fixups real-code-obj))) @@ -371,10 +370,10 @@ ((eql :entry) (the function (gethash (leaf-info (cadr const)) (core-object-entry-table object)))) - ((member :named-call :fdefinition) (cadr const)) + ((eql :fdefinition) (cadr const)) ((eql :known-fun) (%coerce-name-to-fun (cadr const))) (constant (constant-value const))) - (eq kind :named-call)))) + (eq kind :fdefinition)))) #+darwin-jit (assign-code-constants code-obj boxed-data)) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index 7145ed0f3c..c4687ad45f 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -125,6 +125,8 @@ (vop fast-symbol-global-value node block name-tn res) (vop symbol-global-value node block name-tn res)))) (:global-function + ;; A :GLOBAL-FUNCTION refers to #'NAME for some purpose _other_ _than_ + ;; NAME being a symbol at the CAR of a form (and referenced in FUN-LVAR-TN). ;; In cross-compilation, testing (INFO :function :definition) is not ;; sensible (or possible) but we can assume that things with fun-info ;; will eventually be defined. If that's untrue, e.g. if we referred @@ -145,25 +147,27 @@ (eq pkg *cl-package*)))) (t t)))) (internal-name-p name)) - #-sb-xc-host (find-fdefn name) (info :function :info name) + ;; Known functions can be dumped without going through fdefns. + ;; But if NOTINLINEd, don't early-bind to the functional value + ;; because that disallows redefinition, including but not limited + ;; to encapsulations, which in turn makes TRACE not work, which + ;; leads to extreme frustration when debugging. (let ((*lexenv* (node-lexenv node))) - (not (fun-lexically-notinline-p name)))) - ;; Known functions can be dumped without going through fdefns. - ;; But if NOTINLINEd, don't early-bind to the functional value - ;; because that disallows redefinition, including but not limited - ;; to encapsulations, which in turn makes TRACE not work, which - ;; leads to extreme frustration when debugging. + (not (fun-lexically-notinline-p name))) + ;; If NOT compiling to a file, then the function had better exist now. + ;; If to a file, then it better exist at some point, but its existence + ;; in the compilation lisp doesn't really imply that it will. + #-sb-xc-host (if (producing-fasl-file) t (find-fdefn name))) (emit-move node block (make-load-time-constant-tn :known-fun name) res)) (t - #+untagged-fdefns - (let ((fdefn-tn (make-load-time-constant-tn :named-call name))) + (let ((fdefn-tn (make-load-time-constant-tn :fdefinition name))) + #+untagged-fdefns (if unsafe (vop sb-vm::untagged-fdefn-fun node block fdefn-tn res) - (vop sb-vm::safe-untagged-fdefn-fun node block fdefn-tn res))) - #-untagged-fdefns - (let ((fdefn-tn (make-load-time-constant-tn :fdefinition name))) + (vop sb-vm::safe-untagged-fdefn-fun node block fdefn-tn res)) + #-untagged-fdefns (if unsafe (vop fdefn-fun node block fdefn-tn res) (vop safe-fdefn-fun node block fdefn-tn res))))))))) @@ -1057,11 +1061,11 @@ ;; and CL:GENSYM, in case a piece of code mentions both. (let ((name (uncross (lvar-fun-name lvar t)))) ;; Static fdefns never need a code header constant. + ;; Calls to immobile space fdefns won't use the constant, + ;; but it needs to exist for GC's pointer tracing. (values (if (sb-vm::static-fdefn-offset name) name - ;; Calls to immobile space fdefns won't use this constant, - ;; but it needs to exist for GC's pointer tracing. - (make-load-time-constant-tn :named-call name)) + (make-load-time-constant-tn :fdefinition name)) name))) (t (values (lvar-tn node block lvar) nil))))) diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index 1ad7a4d72d..05c75d506f 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -540,13 +540,11 @@ #-sb-xc-host (defun code-header-ref (code index) (declare (index index)) - (let ((fdefns-start (sb-impl::code-fdefns-start-index code)) - (count (code-n-named-calls code))) - (declare ((unsigned-byte 16) fdefns-start count)) - (values - (if (and (>= index fdefns-start) (< index (+ fdefns-start count))) - (%primitive code-header-ref+tag code index other-pointer-lowtag) - (%primitive code-header-ref+tag code index 0))))) + (binding* (((start count) (sb-vm::code-header-fdefn-range code)) + (end (+ start count))) + (values (if (and (>= index start) (< index end)) + (%primitive code-header-ref+tag code index other-pointer-lowtag) + (%primitive code-header-ref+tag code index 0))))) (define-vop (code-header-set) (:translate code-header-set) diff --git a/src/compiler/represent.lisp b/src/compiler/represent.lisp index 0591bd1550..a6fcca31da 100644 --- a/src/compiler/represent.lisp +++ b/src/compiler/represent.lisp @@ -810,11 +810,11 @@ (dovector (constant unsorted) (incf old-offset) (when (eql pass (cond ((constant-p constant) 2) - ((eq (car constant) :named-call) 1) + ((eq (car constant) :fdefinition) 1) (t 3))) (let ((new-offset (vector-push-extend constant sorted))) (push (cons old-offset new-offset) renumbering)))))) - (scan 1) ; first all the called fdefinitions + (scan 1) ; first all the fdefinitions use for call or global function ref (as in #'FUN) (scan 2) ; then IR1 constants (scan 3)) ; then various flavors of load-time magic ;; Update the TN-OFFSET slot. diff --git a/src/compiler/x86-64/call.lisp b/src/compiler/x86-64/call.lisp index b89a1847ae..74732999c1 100644 --- a/src/compiler/x86-64/call.lisp +++ b/src/compiler/x86-64/call.lisp @@ -842,10 +842,10 @@ ;;; if possible (without loading RAX) (defun emit-direct-call (name instruction node step-instrumenting) ;; a :STATIC-CALL fixup is the address of the entry point of - ;; the function itself, and a :NAMED-CALL fixup is the address + ;; the function itself, and a :FDEFN-CALL fixup is the address ;; of the JMP instruction embedded in the header for the named FDEFN. (let* ((fixup (make-fixup name - (if (static-fdefn-offset name) :static-call :named-call))) + (if (static-fdefn-offset name) :static-call :fdefn-call))) (target (if (and (sb-c::code-immobile-p node) (not step-instrumenting)) diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index e3f60b49b2..6999ce830a 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -3376,7 +3376,7 @@ (flavor (fixup-flavor fixup))) (cond ((eq flavor :gc-barrier) (push offset imm-fixups)) ((and (memq flavor - '(:named-call :layout :immobile-symbol :symbol-value ; -> fixedobj subspace + '(:fdefn-call :layout :immobile-symbol :symbol-value ; -> fixedobj subspace :assembly-routine :assembly-routine* :static-call)) ; -> text subspace (eq kind :abs32)) #+immobile-space (push offset abs32-fixups)) diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index e3e1b2085f..6e94196679 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -2634,13 +2634,10 @@ (push name names))))) (assert (not dup-fdefns))))) (dolist (c (sb-vm::list-allocated-objects :all :type sb-vm:code-header-widetag)) - (let* ((start (+ sb-vm:code-constants-offset - (* (sb-kernel:code-n-entries c) - sb-vm:code-slots-per-simple-fun))) - (end (+ start (sb-kernel:code-n-named-calls c)))) + (sb-int:binding* (((start count) (sb-vm::code-header-fdefn-range c)) + (end (+ start count))) ;; Within each subset of FDEFNs there should be no duplicates - ;; by name. But there could be an fdefn that is in the union of - ;; the ranges twice, if used for named call and a global ref. + ;; by name. But there could be an fdefn that is in the union of the two sets. (scan-range c start end) (scan-range c end (sb-kernel:code-header-words c)))))) From 03acca3955d4cdfc64f668dbf712bca3ac0d78c0 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 3 Sep 2022 21:06:42 -0400 Subject: [PATCH 3910/4023] Fix search-and-replace error from rename of linkage-table --- src/code/linkage-table.lisp | 2 +- src/compiler/arm/macros.lisp | 2 +- src/compiler/generic/genesis.lisp | 4 ++-- src/compiler/generic/utils.lisp | 2 +- src/compiler/mips/c-call.lisp | 4 ++-- src/compiler/mips/show.lisp | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index 55a65ce7a4..3669b8c1c5 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -71,7 +71,7 @@ (if datap 1 0)) (logically-readonlyize name) (setf (gethash key ht) index)))))) - (sb-vm::alien-alien-linkage-table-entry-address it)) + (sb-vm::alien-linkage-table-entry-address it)) (error "Linkage-table full (~D entries): cannot link ~S." (hash-table-count ht) name)))) diff --git a/src/compiler/arm/macros.lisp b/src/compiler/arm/macros.lisp index 1ca6ddfd6b..1e143e688e 100644 --- a/src/compiler/arm/macros.lisp +++ b/src/compiler/arm/macros.lisp @@ -209,7 +209,7 @@ (ash 1 (tn-offset lr-tn)))) ;; select the C function index as per *LINKAGE-SPACE-PREDEFINED-ENTRIES* (let ((index (if (eq type 'list) 1 0))) - (inst ldr alloc-tn (@ null-tn (- (alien-alien-linkage-table-entry-address index) + (inst ldr alloc-tn (@ null-tn (- (alien-linkage-table-entry-address index) nil-value)))) (inst blx alloc-tn) (inst word (logior #xe8bd0000 ; POP {rN, lr} diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index e6d79a237b..cfb86ddf42 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2362,7 +2362,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (defun alien-linkage-table-note-symbol (symbol-name datap) "Register a symbol and return its address in proto-linkage-table." - (sb-vm::alien-alien-linkage-table-entry-address + (sb-vm::alien-linkage-table-entry-address (ensure-gethash (if datap (list symbol-name) symbol-name) *cold-foreign-symbol-table* (hash-table-count *cold-foreign-symbol-table*)))) @@ -3667,7 +3667,7 @@ III. initially undefined function references (alphabetically): (let ((name (car entry))) (format t " ~:[ ~;(D)~] ~8x = ~a~%" (listp name) - (sb-vm::alien-alien-linkage-table-entry-address (cdr entry)) + (sb-vm::alien-linkage-table-entry-address (cdr entry)) (car (ensure-list name))))) #+sb-thread diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index 805b4e47a7..a122d81d45 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -50,7 +50,7 @@ 0)) ;;; the address of the linkage table entry for table index I. -(defun alien-alien-linkage-table-entry-address (i) +(defun alien-linkage-table-entry-address (i) (ecase alien-linkage-table-growth-direction (:up (+ (* i alien-linkage-table-entry-size) alien-linkage-table-space-start)) (:down (- alien-linkage-table-space-end (* (1+ i) alien-linkage-table-entry-size))))) diff --git a/src/compiler/mips/c-call.lisp b/src/compiler/mips/c-call.lisp index 013c7a25cd..011d939667 100644 --- a/src/compiler/mips/c-call.lisp +++ b/src/compiler/mips/c-call.lisp @@ -250,8 +250,8 @@ (let ((cur-nfp (current-nfp-tn vop))) (when cur-nfp (store-stack-tn nfp-save cur-nfp)) - ;; (alien-alien-linkage-table-entry-address 0) is "call-into-c" in mips-assem.S - (inst lw tramp null-tn (- (alien-alien-linkage-table-entry-address 0) nil-value)) + ;; (alien-linkage-table-entry-address 0) is "call-into-c" in mips-assem.S + (inst lw tramp null-tn (- (alien-linkage-table-entry-address 0) nil-value)) (inst nop) (inst jal tramp) (inst move cfunc function) diff --git a/src/compiler/mips/show.lisp b/src/compiler/mips/show.lisp index cb9b0d6a65..da103c0687 100644 --- a/src/compiler/mips/show.lisp +++ b/src/compiler/mips/show.lisp @@ -26,8 +26,8 @@ (when cur-nfp (store-stack-tn nfp-save cur-nfp)) (move nl0 object) - ;; (alien-alien-linkage-table-entry-address 0) is "call-into-c" in mips-assem.S - (inst lw tramp null-tn (- (alien-alien-linkage-table-entry-address 0) nil-value)) + ;; (alien-linkage-table-entry-address 0) is "call-into-c" in mips-assem.S + (inst lw tramp null-tn (- (alien-linkage-table-entry-address 0) nil-value)) (inst li cfunc (make-fixup "debug_print" :foreign)) (inst jal tramp) (inst subu nsp-tn 16) From bb8379bbc304d8a08f32a64d7d662fd4eabec903 Mon Sep 17 00:00:00 2001 From: Charles Zhang <charleszhang99@yahoo.com> Date: Sun, 4 Sep 2022 09:58:07 +0200 Subject: [PATCH 3911/4023] More TODO fixups. * Remove line that was part of a deleted sentence. * Methods can now be traced. --- TODO | 6 ------ 1 file changed, 6 deletions(-) diff --git a/TODO b/TODO index bba5d42359..5d41820ca6 100644 --- a/TODO +++ b/TODO @@ -70,11 +70,6 @@ ADVICE/FWRAP latter returns the underlying definition, whereas the first returns the encapsulation. -GENERIC FUNCTION TRACING - - This sucks currently. It would also be good to be able to trace - individual methods. - POLICY MADNESS The interactions between various optimization policies are far from @@ -92,7 +87,6 @@ WINDOWS DARWIN Needs love, particularly threads and exceptions/signals. - also broken there. DRAGONFLY Multithreading does not work. Possibly because of bug in mmap/munmap. From 5206ce54830a992a864f963334d5e653d7d8c198 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 4 Sep 2022 13:26:58 -0400 Subject: [PATCH 3912/4023] Workaround extremely suboptimal alien-funcall --- contrib/sb-md5/md5.lisp | 1 + tests/sb-md5.impure.lisp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/contrib/sb-md5/md5.lisp b/contrib/sb-md5/md5.lisp index 43e9260dba..28da373720 100644 --- a/contrib/sb-md5/md5.lisp +++ b/contrib/sb-md5/md5.lisp @@ -69,6 +69,7 @@ (in-package sb-md5) (eval-when (:compile-toplevel :load-toplevel :execute) + (sb-ext:restrict-compiler-policy 'space 1) ; lp#1988683 (setf (sb-int:system-package-p *package*) t)) #+cmu diff --git a/tests/sb-md5.impure.lisp b/tests/sb-md5.impure.lisp index 506e55bf94..d1d18eacb8 100644 --- a/tests/sb-md5.impure.lisp +++ b/tests/sb-md5.impure.lisp @@ -1,3 +1,16 @@ (require :sb-md5) + +(let ((stream (make-string-output-stream))) + (with-package-iterator (iter "SB-MD5" :internal :external) + (loop + (multiple-value-bind (flag symbol) (iter) + (unless flag (return)) + (when (and (fboundp symbol) (not (macro-function symbol))) + (let ((code (sb-kernel:fun-code-header (fdefinition symbol)))) + (disassemble code :stream stream) + (let ((text (get-output-stream-string stream))) + (when (search "ALIEN-FUNCALL" text) + (error "Compiler bug on ~S" code))))))))) + (setq run-tests::*allowed-inputs* :any) ; makes random pathnames without aid of WITH-SCRATCH-FILE (load "../contrib/sb-md5/md5-tests.lisp") From aaced472fc2852f425dd39817913f3d312147d1f Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 5 Sep 2022 00:41:28 +0300 Subject: [PATCH 3913/4023] Fix lvar-fun-type on :cleanup functions. Which do not get their type computed by IR1-FINALIZE, and TAIL-SET-TYPE gets erased by DELETE-RETURN after tail calls are recognized. Reported by Eric Marsden. --- src/compiler/callable-args.lisp | 1 + tests/compiler-2.pure.lisp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/compiler/callable-args.lisp b/src/compiler/callable-args.lisp index 395a97e107..34367a8f38 100644 --- a/src/compiler/callable-args.lisp +++ b/src/compiler/callable-args.lisp @@ -191,6 +191,7 @@ (functional-type entry-fun)) ((and (not (fun-type-p lvar-type)) (lambda-p entry-fun) + (null (lambda-kind entry-fun)) (lambda-tail-set entry-fun)) (make-fun-type :wild-args t :returns diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index 6e94196679..f7227f4ac6 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -3727,3 +3727,16 @@ `(lambda (x) (aref (the (values (and (not simple-array) vector)) x) 0)) (((make-array 10 :adjustable t :initial-element 3)) 3))) + +(with-test (:name :restoring-tns-after-cleanups) + (checked-compile-and-assert + () + `(lambda () + (declare (notinline values)) + (unwind-protect 1 + (let ((a (list 'list))) + (declare (dynamic-extent a)) + (unwind-protect 1 (eval a))) + (eval 1) + (eval 2))) + (() 1))) From b4bf930eb5cfe9c846b8c124e59a8aeaabd3643b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 4 Sep 2022 20:56:55 -0400 Subject: [PATCH 3914/4023] Capture exactly one closure variable in start-lisp --- src/code/save.lisp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/code/save.lisp b/src/code/save.lisp index 726bd93f03..1029886e8c 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -82,15 +82,15 @@ sb-kernel::*gc-epoch*)) (defun start-lisp (toplevel callable-exports) - (named-lambda %start-lisp () - (cond (callable-exports + (if callable-exports + (named-lambda %start-lisp () (reinit t) (dolist (export callable-exports) (sb-alien::initialize-alien-callable-symbol export))) - (t + (named-lambda %start-lisp () (handling-end-of-the-world (reinit t) - (funcall toplevel)))))) + (funcall toplevel))))) (defun save-lisp-and-die (core-file-name &key (toplevel #'toplevel-init toplevel-supplied) From 861a55d85bf2385dc6eeabfa0bec75415832bdf6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 5 Sep 2022 17:10:30 -0400 Subject: [PATCH 3915/4023] Express os_link_runtime() more succinctly --- src/runtime/os-common.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 09f097b53b..2a2390e82b 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -171,33 +171,25 @@ os_dlsym_default(char *name) int alien_linkage_table_n_prelinked; void os_link_runtime() { - int entry_index = 0; - lispobj symbol_name; - char *namechars; - boolean datap; - void* result; - int j; - if (alien_linkage_table_n_prelinked) return; // Linkage was already performed by coreparse struct vector* symbols = VECTOR(SymbolValue(REQUIRED_FOREIGN_SYMBOLS,0)); alien_linkage_table_n_prelinked = vector_len(symbols); + int j; for (j = 0 ; j < alien_linkage_table_n_prelinked ; ++j) { lispobj item = symbols->data[j]; - datap = listp(item); - symbol_name = datap ? CONS(item)->car : item; - namechars = (void*)(intptr_t)(VECTOR(symbol_name)->data); - result = os_dlsym_default(namechars); + boolean datap = listp(item); + lispobj symbol_name = datap ? CONS(item)->car : item; + char *namechars = (void*)(intptr_t)(VECTOR(symbol_name)->data); + void* result = os_dlsym_default(namechars); if (result) { - arch_write_linkage_table_entry(entry_index, result, datap); + arch_write_linkage_table_entry(j, result, datap); } else { // startup might or might not work. ymmv fprintf(stderr, "Missing required foreign symbol '%s'\n", namechars); } - - ++entry_index; } } From 14696f8fc302219a97d1be83c6e5e96aa899881d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 5 Sep 2022 18:16:42 -0400 Subject: [PATCH 3916/4023] x86-64: Shake out some unused vops post-build Use the #\! name convention which I'm not sure I like for this. Might do something different after thinking about it more. --- make-target-2-load.lisp | 6 ++++++ src/code/alloc.lisp | 14 +++++--------- src/cold/warm.lisp | 4 ++-- src/compiler/x86-64/alloc.lisp | 4 ++-- tests/immobile-space.impure.lisp | 12 +++--------- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index 571249eb9b..3757b216c8 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -136,6 +136,12 @@ (memq symbol '(sb-c::sb-pcl sb-c::sb-impl sb-c::sb-kernel sb-c::sb-c sb-c::sb-int)))))) + ;; Delete bootstrap-only vops + (flet ((drop-keys (table) + (loop for symbol being each hash-key of table + when (uninternable-p symbol) do (remhash symbol table)))) + (drop-keys sb-c::*backend-parsed-vops*) + (drop-keys sb-c::*backend-template-names*)) ;; A structure constructor name, in particular !MAKE-SAETP, ;; can't be uninterned if referenced by a defstruct-description. ;; So loop over all structure classoids and clobber any diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index 6c550df8dd..85829c1d0b 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -88,14 +88,12 @@ (assert (eql code-debug-info-slot 2))) ;;; Size-class segregation (implying which page we try to allocate to) -;;; is done from lisp now, not C. There are 4 objects types we'll see, +;;; is done from lisp now, not C. There are 3 objects types we'll see, ;;; each in its own size class (even if some are coincidentally the same size). ;;; - Symbols ;;; - FDEFNs ;;; - Layouts -;;; - Funcallable instances -;;; The first two are truly fixed in size. The latter two could occur in several -;;; sizes, each occupying a different size-class. This isn't implemented yet. +;;; The first two are truly fixed in size. Layouts occur in varying sizes. (defun alloc-immobile-fixedobj (nwords header) (let* ((widetag (logand (truly-the fixnum header) widetag-mask)) (aligned-nwords (truly-the fixnum (align-up nwords 2))) @@ -111,17 +109,15 @@ ((<= aligned-nwords 24) (setq aligned-nwords 24) 5) ((<= aligned-nwords 32) (setq aligned-nwords 32) 6) ((<= aligned-nwords 48) (setq aligned-nwords 48) 7) - (t (error "Oversized layout")))) - ;; TODO: allow different sizes of funcallable-instance - (#.funcallable-instance-widetag 8)))) - (values (%primitive alloc-immobile-fixedobj + (t (error "Oversized layout"))))))) + (values (%primitive !alloc-immobile-fixedobj size-class aligned-nwords header)))) (defun make-immobile-symbol (name) (let ((symbol (truly-the symbol - (or (%primitive fast-alloc-immobile-symbol) + (or (%primitive !fast-alloc-immobile-symbol) (alloc-immobile-fixedobj symbol-size (logior (ash (1- symbol-size) n-widetag-bits) symbol-widetag)))))) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index 839b446ed2..a7f6350499 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -242,8 +242,8 @@ sb-kernel::(rplaca (last *handler-clusters*) (car **initial-handler-clusters**)) :direction :output :if-exists :supersede) (let (list) (sb-int:dohash ((name vop) sb-c::*backend-parsed-vops*) - (declare (ignore vop)) - (push (cons (gethash name sb-c::*static-vop-usage-counts* 0) name) list)) + (unless (char= (char (string name) 0) #\!) + (push (cons (gethash name sb-c::*static-vop-usage-counts* 0) name) list))) (dolist (cell (sort list #'> :key #'car)) (format output "~7d ~s~%" (car cell) (cdr cell)))))) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index be13de40ac..ef48edc7f8 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -1002,7 +1002,7 @@ `(let ((c-fun (make-fixup ,name :foreign))) (inst call (cond ((sb-c::code-immobile-p node) c-fun) (t (progn (inst mov rax c-fun) rax))))))) -(define-vop (alloc-immobile-fixedobj) +(define-vop (!alloc-immobile-fixedobj) (:args (size-class :scs (any-reg) :target c-arg1) (nwords :scs (any-reg) :target c-arg2) (header :scs (any-reg) :target c-arg3)) @@ -1036,7 +1036,7 @@ (eval-when (:compile-toplevel) (aver (evenp symbol-size))) ; assumptions in the code below -(define-vop (fast-alloc-immobile-symbol) +(define-vop (!fast-alloc-immobile-symbol) (:results (result :scs (descriptor-reg))) (:temporary (:sc unsigned-reg :offset rax-offset) rax) (:temporary (:sc unsigned-reg :offset rbx-offset) rbx) diff --git a/tests/immobile-space.impure.lisp b/tests/immobile-space.impure.lisp index 604b353eca..ad9f674db5 100644 --- a/tests/immobile-space.impure.lisp +++ b/tests/immobile-space.impure.lisp @@ -5,9 +5,7 @@ ;;; it could crash (defun alloc-layoutless-instances () (list (sb-vm::alloc-immobile-fixedobj - 6 (logior (ash 5 sb-vm:instance-length-shift) sb-vm:instance-widetag)) - (sb-vm::alloc-immobile-fixedobj - 6 (logior (ash 5 sb-vm:n-widetag-bits) sb-vm:funcallable-instance-widetag)))) + 6 (logior (ash 5 sb-vm:instance-length-shift) sb-vm:instance-widetag)))) (compile 'alloc-layoutless-instances) ;;; the first GC should WP some pages but might not crash (dotimes (i 1000 (gc)) (alloc-layoutless-instances)) @@ -27,12 +25,8 @@ (defun ll-alloc () ;; This must be in its own function because the vop preserves no registers ;; when calling to C. - (values(sb-sys:%primitive - sb-vm::alloc-immobile-fixedobj - 8 ; an unused sized class - 2 ; physical words - (logior (ash 1 sb-vm:instance-length-shift) - sb-vm:instance-widetag)))) + (sb-vm::alloc-immobile-fixedobj 8 (logior (ash 7 sb-vm:instance-length-shift) + sb-vm:instance-widetag))) (compile 'll-alloc) ; low level allocator (defun make () (let ((inst (ll-alloc))) From ba3a204a7f5184266917033d57d4621b1f9c31f7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 5 Sep 2022 18:23:05 -0400 Subject: [PATCH 3917/4023] Use SAP-REF-SAP And improve comments and remove mention of non-linkage-table platforms. --- src/code/foreign.lisp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index f8ea646c80..5e08108dab 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -23,6 +23,15 @@ symbol in the linkage table, and never returns an address in the linkage-table." ;;; as a lookup table translating strings to functions needed in our runtime. ;;; It's not our problem that shared objects aren't loadable, but we get the ;;; flexibility of recompiling C without recompiling Lisp. +;;; +;;; This function is somewhat badly named, because when DATAP is true, +;;; the answer is not really the address of NAME, but rather the address +;;; of the word in the alien-linkage-table holding the address of NAME. +;;; (This would be better off named ALIEN-LINKAGE-ADDRESS) +;;; Unfortunately we can not rename it, because CFFI uses it, which is weird +;;; because the use is from a function named %FOREIGN-SYMBOL-POINTER which is +;;; documented to return "a pointer to a foreign symbol NAME." +;;; which it certainly does not do in all cases. (defun foreign-symbol-address (name &optional datap) "Returns the address of the foreign symbol NAME. DATAP must be true if the symbol designates a variable. @@ -35,17 +44,10 @@ Symbols are entered into the linkage-table if they aren't there already." (defun foreign-symbol-sap (symbol &optional datap) "Returns a SAP corresponding to the foreign symbol. DATAP must be true if the -symbol designates a variable (used only on linkage-table platforms). May enter -the symbol into the linkage-table. On non-linkage-table ports signals an error -if the symbol isn't found." - (declare (ignorable datap)) - (multiple-value-bind (addr sharedp) - (foreign-symbol-address symbol datap) - ;; If the address is from linkage-table and refers to data - ;; we need to do a bit of juggling. It is not the address of the - ;; variable, but the address where the real address is stored. - (if (and sharedp datap) - (int-sap (sap-ref-word (int-sap addr) 0)) +symbol designates a variable. May enter the symbol into the linkage-table." + (let ((addr (foreign-symbol-address symbol datap))) + (if datap ; return the real answer, not an address in the linkage table + (sap-ref-sap (int-sap addr) 0) (int-sap addr)))) (defun foreign-reinit () From 267ad02917b5428619ddd2fe26e04f50308f392f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 5 Sep 2022 20:33:53 -0400 Subject: [PATCH 3918/4023] Improve heap-relocation test --- tests/heap-reloc/fake-mman.c | 76 ++++++++++++------------------------ tests/heap-reloc/fakemap | 14 +++---- tests/heap-reloc/fakemap_64 | 7 ++++ tests/relocation.test.sh | 15 ++++--- 4 files changed, 49 insertions(+), 63 deletions(-) create mode 100644 tests/heap-reloc/fakemap_64 diff --git a/tests/heap-reloc/fake-mman.c b/tests/heap-reloc/fake-mman.c index 5c3ae82f85..d8ecbbedae 100644 --- a/tests/heap-reloc/fake-mman.c +++ b/tests/heap-reloc/fake-mman.c @@ -9,81 +9,57 @@ static int verbose=1; /// - partially overlapping ranges for the desired and actual space /// - aligned to OS page but misaligned for GC card -/* Each line of the instruction file contains two addresses, - * a sub-2GB address and a high address. - * - * 64-bit builds use the first address for immobile space - * and the second address for dynamic space. - * If the current build does not support immobile space, - * the first address in the pair is simply ignored. - * - * 32-bit builds use only the first address - */ -void pick_fuzzed_addresses(unsigned long *addr1, - unsigned long *addr2) +void pick_fuzzed_addresses(void** addr1, void** addr2, void** addr3) { char * pathname; FILE * f; char line[100]; - int line_number, i; + int line_number = 1, i; if ((pathname = getenv("SBCL_FAKE_MMAP_INSTRUCTION_FILE")) == NULL) { fprintf(stderr, "WARNING: image built with MOCK_MMAP_FAILURE\n"); fprintf(stderr, " but no mock configuration data found.\n"); exit(1); } - if ((f = fopen(pathname, "r+")) == NULL) { + char *opt = getenv("SBCL_FAKE_MMAP_INSTRUCTION_LINE"); + if (opt) line_number = atoi(opt); + if ((f = fopen(pathname, "r")) == NULL) { // If the file can't be found, don't silently ignore it, // because if the relocator "worked" you don't want to get all happy // that it worked only to find that it didn't actually perform relocation. fprintf(stderr, "Could not read '%s'\n", pathname); exit(1); } - char __attribute__((unused)) *buf = fgets(line, sizeof line, f); - line_number = atoi(line); - for (i = 0 ; i <= line_number ; ++i) { - int ok; - ok = fgets(line, sizeof line, f) != NULL && line[0] != '\n'; - if (i == line_number - 1) { - char *end; - *addr1 = strtoul(line, &end, 16); - *addr2 = strtoul(end, 0, 16); - } - if (!ok) { - // fprintf(stderr, "*** Rewinding fake mmap instructions\n"); - line_number = 0; - break; - } - } - rewind(f); - fprintf(f, "%02d", 1+line_number); + // skip the comment line and read 'line_number' more lines + for (i = 0 ; i <= line_number ; ++i) fgets(line, sizeof line, f); + char *end; + *addr1 = (void*)strtoul(line, &end, 16); + *addr2 = (void*)strtoul(end, &end, 16); + *addr3 = (void*)strtoul(end, &end, 16); + fprintf(stderr, "Trial %d:\n", line_number); fclose(f); } os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) space_id) +os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id) { int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE; void *fuzzed = addr; os_vm_address_t actual; int movable = attributes & MOVABLE; -#ifdef MAP_32BIT - if (attributes & ALLOCATE_LOW) - flags |= MAP_32BIT; -#endif if (addr && movable) { - static unsigned long addr1, addr2; - if (!addr1) - pick_fuzzed_addresses(&addr1, &addr2); -#ifdef LISP_FEATURE_64_BIT - if (!(attributes & ALLOCATE_LOW)) - fuzzed = (void*)addr2; - else -#endif - fuzzed = (void*)addr1; + static void *val1, *val2, *val3; + if (!val1) pick_fuzzed_addresses(&val1, &val2, &val3); + switch (space_id) { + case READ_ONLY_CORE_SPACE_ID: fuzzed = val1; break; + case IMMOBILE_FIXEDOBJ_CORE_SPACE_ID: fuzzed = val2; break; + case DYNAMIC_CORE_SPACE_ID: fuzzed = val3; break; + } } +#ifdef MAP_32BIT + if (attributes & ALLOCATE_LOW) flags |= MAP_32BIT; +#endif actual = mmap(fuzzed, len, OS_VM_PROT_ALL, flags, -1, 0); if (actual == MAP_FAILED) { perror("mmap"); @@ -96,9 +72,9 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, } if (verbose && addr != fuzzed) fprintf(stderr, actual == fuzzed ? - "//Fuzzed %12p into %12p successfully\n": - "//Tried fuzzing %p into %p but actually got %p\n", - addr, fuzzed, actual); + "// space %d: Fuzzed %12p into %12p successfully\n": + "// space %d: Tried fuzzing %p into %p but actually got %p\n", + space_id, addr, fuzzed, actual); return actual; } diff --git a/tests/heap-reloc/fakemap b/tests/heap-reloc/fakemap index babcec4f2d..278977945c 100644 --- a/tests/heap-reloc/fakemap +++ b/tests/heap-reloc/fakemap @@ -1,7 +1,7 @@ -01 -0x40008000 0x3000010000 -0x70000000 0x30000000 # opposite of usual -0x50300000 0x1000010000 -0x50080000 0x1000080000 -0x50040000 0x200000a000 -0x50001000 0x3800008000 +# READONLY n/a DYNAMIC +0xe0000000 0 0x40008000 +0xe0000000 0 0x70000000 +0xe0000000 0 0x50300000 +0xe0000000 0 0x50080000 +0xe0000000 0 0x50040000 +0xe0000000 0 0x50001000 diff --git a/tests/heap-reloc/fakemap_64 b/tests/heap-reloc/fakemap_64 new file mode 100644 index 0000000000..8bbe369e8f --- /dev/null +++ b/tests/heap-reloc/fakemap_64 @@ -0,0 +1,7 @@ +# READONLY FIXEDOBJ DYNAMIC +0x4000010000 0x40008000 0x3000010000 +0x1100000000 0x70000000 0x30000000 +0x1100000000 0x50300000 0x1000010000 +0x1100000000 0x50080000 0x1000080000 +0x1100000000 0x50040000 0x200000a000 +0x1100000000 0x50001000 0x3800008000 diff --git a/tests/relocation.test.sh b/tests/relocation.test.sh index d3fd61458b..48b0d55d6a 100755 --- a/tests/relocation.test.sh +++ b/tests/relocation.test.sh @@ -5,8 +5,9 @@ # The relocation test binary can only be built on linux. # FIXME: This test _should_ work on any architecture, but it doesn't, # so there must have been a regression in the heap relocator. -run_sbcl --eval '(exit :code (or #+linux 0 1))' -if [ $? -eq 1 ] +data=`run_sbcl --eval '(progn #+linux(progn(princ "fakemap") #+64-bit(princ "_64")))' \ + --quit` +if [ -z "$data" ] then # shell tests don't have a way of exiting as "not applicable" exit $EXIT_TEST_WIN @@ -23,15 +24,17 @@ set -e # KLUDGE: assume N = 6 # FIXME: don't assume that N = 6 -export SBCL_FAKE_MMAP_INSTRUCTION_FILE=`pwd`/heap-reloc/fakemap +export SBCL_FAKE_MMAP_INSTRUCTION_FILE=`pwd`/heap-reloc/$data i=1 while [ $i -le 6 ] do - echo Trial $i - i=`expr $i + 1` + export SBCL_FAKE_MMAP_INSTRUCTION_LINE=$i $test_sbcl --lose-on-corruption --disable-ldb --noinform --core ../output/sbcl.core \ --no-sysinit --no-userinit --noprint --disable-debugger \ - --eval '(gc :full t)' --quit + --eval '(gc :full t)' \ + --eval '(defun fib (n) (if (<= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))' \ + --eval "(compile 'fib)" -quit + i=`expr $i + 1` done rm -f $test_sbcl From 30f837e4e08ce365a01e54fcd0a212fa72b78cbe Mon Sep 17 00:00:00 2001 From: Tomas Hlavaty <tomas.hlavaty@knowledgetools.de> Date: Tue, 6 Sep 2022 07:41:03 -0400 Subject: [PATCH 3919/4023] sb-simd: use interpreter only when available --- contrib/sb-simd/code/instruction-set.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/sb-simd/code/instruction-set.lisp b/contrib/sb-simd/code/instruction-set.lisp index ae73d92369..755238eff8 100644 --- a/contrib/sb-simd/code/instruction-set.lisp +++ b/contrib/sb-simd/code/instruction-set.lisp @@ -127,7 +127,7 @@ ;; The macro expansion of an instruction set is a very large expression ;; that is evaluated exactly once, so compiling it would be a waste of ;; resources. Instead, we use SBCL's built-in interpreter. - `(let ((sb-ext:*evaluator-mode* :interpret)) + `(let (#+(or sb-eval sb-fasteval)(sb-ext:*evaluator-mode* :interpret)) (eval '(let ((*instruction-set* (make-instance 'instruction-set From d29da3421cc8dc6800da7abe069f34be7169bd5c Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich <slyich@gmail.com> Date: Tue, 6 Sep 2022 08:02:04 -0400 Subject: [PATCH 3920/4023] src/runtime: fix -fno-common build on darwin Without the change build fails on aarch64-darwin against upstream llvm-11 with multiple symbol declaraions: duplicate symbol '_static_code_space_free_pointer' in: alloc.o traceroot.o duplicate symbol '_static_code_space_free_pointer' in: alloc.o gencgc.o Full build log: https://hydra.nixos.org/log/hdbirh7vf6kd2zj9j6a5sbdjpyvsw2j2-sbcl-2.2.4.drv The change declares variable as extern in globals.h (similar to the rest of variables). globals.c already defines the variable. --- src/runtime/globals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/globals.h b/src/runtime/globals.h index 3ea01ec78b..051cff3b28 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -95,7 +95,7 @@ static inline boolean readonly_space_p(lispobj ptr) { } #ifdef LISP_FEATURE_DARWIN_JIT -lispobj *static_code_space_free_pointer; +extern lispobj *static_code_space_free_pointer; #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE From 1faf81dbd68e6106952633d2f4e4321bdb2ab244 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 6 Sep 2022 18:54:25 +0300 Subject: [PATCH 3921/4023] Disable a posix test on freebsd. --- contrib/sb-posix/posix-tests.lisp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contrib/sb-posix/posix-tests.lisp b/contrib/sb-posix/posix-tests.lisp index be395e4e15..5971ca13a0 100644 --- a/contrib/sb-posix/posix-tests.lisp +++ b/contrib/sb-posix/posix-tests.lisp @@ -696,6 +696,7 @@ #.(concatenate 'string "/" (make-string 255 :initial-element #\a))) ;; The error tests are in the order of exposition from SUSv3. + #-freebsd (deftest readlink.error.1 (let* ((subdir-pathname (merge-pathnames (make-pathname @@ -711,9 +712,9 @@ (sb-posix:syscall-error (c) (sb-posix:syscall-errno c))) (ignore-errors - (sb-posix:chmod subdir-pathname #o777) - (sb-posix:unlink link-pathname) - (sb-posix:rmdir subdir-pathname)))) + (sb-posix:chmod subdir-pathname #o777) + (sb-posix:unlink link-pathname) + (sb-posix:rmdir subdir-pathname)))) #.sb-posix:eacces) (deftest readlink.error.2 (let* ((non-link-pathname (make-pathname :name "readlink.error.2" From 1a78075076c264540f58e889a62e5e964287378b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 6 Sep 2022 13:56:22 -0400 Subject: [PATCH 3922/4023] Fix omission from test manifest --- tests/input-manifest.lisp-expr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/input-manifest.lisp-expr b/tests/input-manifest.lisp-expr index 401ade25d6..f4b50e4ba0 100644 --- a/tests/input-manifest.lisp-expr +++ b/tests/input-manifest.lisp-expr @@ -82,7 +82,7 @@ ("run-program.impure.lisp" "contrib/sb-posix.fasl") ("sb-aclrepl.impure.lisp" "contrib/sb-aclrepl.fasl" "../contrib/sb-aclrepl/tests.lisp") - ("sb-bsd-sockets.impure.lisp" "contrib/sb-bsd-sockets.fasl" + ("sb-bsd-sockets.impure.lisp" "contrib/sb-bsd-sockets.fasl" "contrib/sb-posix.fasl" "../contrib/sb-bsd-sockets/tests.lisp") ("sb-cltl2.impure.lisp" "contrib/sb-cltl2.fasl" "../contrib/sb-cltl2/tests.lisp") ("sb-concurrency.impure.lisp" "contrib/sb-concurrency.fasl" From 253ca8421436bdd61b95fde29fb479503f8ad89d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 7 Sep 2022 01:44:37 +0300 Subject: [PATCH 3923/4023] sb-walker: leave malformed let* untouched. Fixes lp#1988880 --- src/pcl/walk.lisp | 8 +++++--- tests/bad-code.pure.lisp | 8 ++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/pcl/walk.lisp b/src/pcl/walk.lisp index f33fb651bd..330a5c1869 100644 --- a/src/pcl/walk.lisp +++ b/src/pcl/walk.lisp @@ -876,7 +876,7 @@ instead of (multiple-value-bind (name init) (cond ((atom binding) (values binding 'no-init)) ((not (cdr binding)) (values (car binding) 'no-init)) - (t (values (car binding) (cadr binding)))) + (t (values (car binding) (cdr binding)))) (push (cons name (xset-member-p name seen)) names) (add-to-xset name seen) (push init inits)))) @@ -917,9 +917,11 @@ instead of (prog1 (car bindings) (note-var-binding (car name) new-env)) (prog1 - (relist (car bindings) + (recons (car bindings) (caar bindings) - (walk-form-internal init context new-env)) + (recons init + (walk-form-internal (car init) context new-env) + (cdr init))) (note-var-binding (car name) new-env))) (unless (cdr name) (setf decls (mapcar (lambda (d) diff --git a/tests/bad-code.pure.lisp b/tests/bad-code.pure.lisp index a003f5a515..3051c7fcc6 100644 --- a/tests/bad-code.pure.lisp +++ b/tests/bad-code.pure.lisp @@ -693,3 +693,11 @@ (vector-push-extend 1 x)) :allow-warnings 'warning)))) +(with-test (:name :defmethod-malformed-let*) + (assert (nth-value 5 + (checked-compile + `(lambda () + (cl:defmethod ,(gensym) () + (let* ((a 1 2)) + a))) + :allow-failure t)))) From c262bc7d00a41122408b31323ad53c2e2fee3813 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 7 Sep 2022 04:57:40 +0300 Subject: [PATCH 3924/4023] sb-bsd-sockets tests: add JOIN-THREAD. --- contrib/sb-bsd-sockets/tests.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index e9222927d0..22a658acee 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -363,7 +363,7 @@ (lambda () (socket-connect client-sock #(127 0 0 1) port) (socket-close client-sock))))) - (declare (ignorable client-connect-thread)) ; wtf ??? + (sb-thread:join-thread client-connect-thread :timeout 20) (setf server-sock (socket-accept listen-sock))) ;; Wait for input. This should return when we get EOF From dac8bd608c93113b958194b0be807902ea18387c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 7 Sep 2022 11:08:53 -0400 Subject: [PATCH 3925/4023] Combine macro and function pprint dispatch entry The macro printer already has a fallback to pprint-fun-call so just let it do that on anything not satisfying MACRO-FUNCTION. --- src/code/pprint.lisp | 24 ++++++++++++------------ tests/pprint.impure.lisp | 17 ++++++++++------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/code/pprint.lisp b/src/code/pprint.lisp index 91ffe10d6e..1eb5a977c3 100644 --- a/src/code/pprint.lisp +++ b/src/code/pprint.lisp @@ -1352,21 +1352,24 @@ line break." ;;; by looking for &BODY. A dotted list is indented as it it had &BODY. ;;; ANSI says that a dotted tail is like &REST, but the pretty-printer ;;; can do whatever it likes anyway. I happen to think this makes sense. -(defun macro-indentation (name) +(defun macro-indentation (macro-function) (do ((n 0) - (list (%fun-lambda-list (macro-function name)) (cdr list))) + (list (%fun-lambda-list macro-function) (cdr list))) ((or (atom list) (eq (car list) '&body)) (if (null list) nil n)) (unless (eq (car list) '&optional) (incf n)))) ;;; Pretty-Print macros by looking where &BODY appears in a macro's -;;; lambda-list. -(defun pprint-macro-call (stream list &rest noise) +;;; lambda-list. If LIST is not macro invocation, or a macro without a &BODY arg +;;; then print it as a function. +(defun pprint-call-form (stream list &rest noise) (declare (ignore noise)) - (let ((indentation (and (car list) (macro-indentation (car list))))) + (let ((indentation (binding* ((car (car list) :exit-if-null) + (mf (macro-function car) :exit-if-null)) + (macro-indentation mf)))) (unless indentation - (return-from pprint-macro-call + (return-from pprint-call-form (pprint-fun-call stream list))) (pprint-logical-block (stream list :prefix "(" :suffix ")") (output-object (pprint-pop) stream) @@ -1528,13 +1531,10 @@ line break." ;; fewer type tests when dispatching. (initial-entry (and array (not (or string bit-vector))) pprint-array -1) - ;; MACRO-FUNCTION must have effectively higher priority than FBOUNDP. ;; The implementation happens to check identical priorities in the order added, - ;; but that's unspecified behavior. Both must be _strictly_ lower than the - ;; default cons entries though. - (initial-entry (cons (and symbol (satisfies macro-function))) - pprint-macro-call -1) - (initial-entry (cons (and symbol (satisfies fboundp))) pprint-fun-call -1) + ;; but that's unspecified behavior. (SATISFIES FBOUNDP) must be _strictly_ + ;; lower than the default cons entries though. + (initial-entry (cons (and symbol (satisfies fboundp))) pprint-call-form -1) (initial-entry (cons symbol) pprint-data-list -2) (initial-entry cons pprint-fill -2 #'consp) (initial-entry sb-impl::comma pprint-unquoting-comma -3 #'comma-p))) diff --git a/tests/pprint.impure.lisp b/tests/pprint.impure.lisp index bb8aac806c..a7ed0c82bc 100644 --- a/tests/pprint.impure.lisp +++ b/tests/pprint.impure.lisp @@ -424,6 +424,9 @@ ;; force MACDADDY to be a closure over X. (let ((x 3)) (defmacro macdaddy (a b &body z) a b z `(who-cares ,x)) (incf x)) +(defun indentation-of (name) + (sb-pretty::macro-indentation (macro-function name))) + (with-test (:name :closure-macro-arglist) ;; assert correct test setup - MACDADDY is a closure if compiling, ;; or a funcallable-instance if not @@ -433,7 +436,7 @@ ;; MACRO-INDENTATION used %simple-fun-arglist instead of %fun-arglist. ;; Depending on your luck it would either not return the right answer, ;; or crash, depending on what lay at 4 words past the function address. - (assert (= (sb-pretty::macro-indentation 'macdaddy) 2))) + (assert (= (indentation-of 'macdaddy) 2))) (defmacro try1 (a b &body fool) `(baz ,a ,b ,fool)) (defmacro try2 (a b &optional &body fool) `(baz ,a ,b ,fool)) @@ -442,12 +445,12 @@ (defmacro try5 (a b &optional . fool) `(baz ,a ,b ,fool)) (defmacro try6 (a b &optional c . fool) `(baz ,a ,b ,c ,fool)) (with-test (:name :macro-indentation) - (assert (= (sb-pretty::macro-indentation 'try1) 2)) - (assert (= (sb-pretty::macro-indentation 'try2) 2)) - (assert (= (sb-pretty::macro-indentation 'try3) 3)) - (assert (= (sb-pretty::macro-indentation 'try4) 2)) - (assert (= (sb-pretty::macro-indentation 'try5) 2)) - (assert (= (sb-pretty::macro-indentation 'try6) 3))) + (assert (= (indentation-of 'try1) 2)) + (assert (= (indentation-of 'try2) 2)) + (assert (= (indentation-of 'try3) 3)) + (assert (= (indentation-of 'try4) 2)) + (assert (= (indentation-of 'try5) 2)) + (assert (= (indentation-of 'try6) 3))) (defclass ship () ()) (let ((ppd (copy-pprint-dispatch))) From f4ecb43c7e1b67c15f4ff0ffd8bb3b1e0939eba9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 7 Sep 2022 14:51:35 -0400 Subject: [PATCH 3926/4023] Fix regression from 9dae557697 That change failed to recognize a critical distinction between FDEFNs used for global #'FUN reference versus named-call. If an FDEFN was used for both in one caller, crashes might result if static linking caused the FDEFN in a code header to be replaced by a CONS listing the PC locations, because the #'FUN use would see a CONS instead of an FDEFN (due to rev 99c2a8e853). So stop replacing ambiguous cases. I prefer this over having to create metadata to remembers why and where a particular FDEFN was replaced. --- src/code/immobile-space.lisp | 74 +++++++++++++++++++++------ src/code/x86-64-vm.lisp | 9 ++-- src/compiler/generic/target-core.lisp | 2 +- tests/static-linker.impure.lisp | 45 ++++++++++++++++ tests/x86-64-codegen.impure.lisp | 33 ------------ 5 files changed, 108 insertions(+), 55 deletions(-) create mode 100644 tests/static-linker.impure.lisp diff --git a/src/code/immobile-space.lisp b/src/code/immobile-space.lisp index 46dc64e4c0..5b559f1f0b 100644 --- a/src/code/immobile-space.lisp +++ b/src/code/immobile-space.lisp @@ -16,6 +16,8 @@ ;; Loop over all code objects `(let* ((call (find-inst #xE8 (get-inst-space))) (jmp (find-inst #xE9 (get-inst-space))) + (mov-ea (find-inst #x8B (get-inst-space))) + (mov-imm-acc (find-inst #xB8 (get-inst-space))) (dstate (make-dstate nil)) (sap (int-sap 0)) (seg (sb-disassem::%make-segment :sap-maker (lambda () sap)))) @@ -114,35 +116,75 @@ (vector-push-extend (fill-pointer relocs) code-components) (values code-components relocs))) +(export 'sb-vm::statically-link-core "SB-VM") +(declaim (inline rip-relative-p)) +(defun rip-relative-p (modrm-byte) (= (logand modrm-byte #b11000111) #b00000101)) + (defun sb-vm::statically-link-core (&key callers) (do-immobile-code (code) (when (or (not callers) (and (plusp (code-n-entries code)) (member (%simple-fun-name (%code-entry-point code 0)) callers))) (let* ((fixups) + (all-fdefns + (do ((i sb-vm:code-constants-offset (1+ i)) + (end (code-header-words code)) + (list)) + ((= i end) list) + (let ((const (code-header-ref code i))) + (typecase const + (fdefn (push const list)) + ;; CONS may occur due to previous invocation of statically-link. + ((cons fdefn) (push (car const) list)))))) + (observable-fdefns) ; ones that an instruction explicitly dereferences (code-begin (- (get-lisp-obj-address code) sb-vm:other-pointer-lowtag)) (code-end (+ code-begin (sb-vm::code-object-size code))) + (boxed-begin (+ code-begin (* sb-vm:code-constants-offset sb-vm:n-word-bytes))) + (boxed-end (+ code-begin (* (code-header-words code) sb-vm:n-word-bytes))) (code-insts (code-instructions code))) (do-functions (fun addr) ;; Loop over function's assembly code (dx-flet ((process-inst (chunk inst) - (when (or (eq inst jmp) (eq inst call)) - (let ((target (+ (near-jump-displacement chunk dstate) - (dstate-next-addr dstate)))) - ;; Do not call FIND-CALLED-OBJECT if the target is - ;; within the same code object - (unless (and (<= code-begin target) (< target code-end)) - (let ((fdefn (sb-vm::find-called-object target))) - (when (and (fdefn-p fdefn) - (neq (info :function :inlinep (fdefn-name fdefn)) - 'notinline)) - (push (cons (+ (sap- sap code-insts) - (sb-disassem:dstate-cur-offs dstate) - 1) - fdefn) - fixups)))))))) + (cond + ;; find FDEFNs as the source of move-immediate-to-register. + ;; There can be false positives, but that's OK. + ((and (eq inst mov-imm-acc) + ;; ensure not a 64-bit move + (eql (sb-disassem::dstate-inst-properties dstate) 0)) + (let ((value (sap-ref-32 sap (1+ (dstate-cur-offs dstate))))) + (dolist (fdefn all-fdefns) + (when (eql (get-lisp-obj-address fdefn) value) + (pushnew fdefn observable-fdefns))))) + ;; find FDEFNs in code header as the source of MOV EA to register + ((and (eq inst mov-ea) + (eql (sap-ref-8 sap (dstate-cur-offs dstate)) #x8B) + (rip-relative-p (sap-ref-8 sap (1+ (dstate-cur-offs dstate))))) + (let ((addr (+ (signed-sap-ref-32 sap (+ (dstate-cur-offs dstate) 2)) + (dstate-next-addr dstate)))) + (when (and (not (logtest addr (ash sb-vm:lowtag-mask -1))) ; aligned + (<= boxed-begin addr) (< addr boxed-end)) + (let ((const (sap-ref-lispobj (int-sap addr) 0))) + (when (fdefn-p const) + (pushnew const observable-fdefns)))))) + ;; find FDEFN as the target of JMP/CALL + ((or (eq inst jmp) (eq inst call)) + (let ((target (+ (near-jump-displacement chunk dstate) + (dstate-next-addr dstate)))) + ;; Can't be an FDEFN if within the same code object + (unless (and (<= code-begin target) (< target code-end)) + (let ((fdefn (dolist (fdefn all-fdefns) + (when (= target (+ (get-lisp-obj-address fdefn) + ;; KLUDGE: 2 = address of 'jmp' inst + (- 2 other-pointer-lowtag))) + (return fdefn))))) + (when (and fdefn (neq (info :function :inlinep (fdefn-name fdefn)) + 'notinline)) + (push (cons (+ (sap- sap code-insts) + (1+ (sb-disassem:dstate-cur-offs dstate))) + fdefn) + fixups))))))))) (map-segment-instructions #'process-inst seg dstate))) - (sb-vm::statically-link-code-obj code fixups))))) + (sb-vm::statically-link-code-obj code fixups observable-fdefns))))) ;;; While concurrent use of un-statically-link is unlikely, misuse could easily ;;; cause heap corruption. It's preventable by ensuring that this is atomic diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index 4d2c6d9bda..296138bf7a 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -350,10 +350,8 @@ ;;; MAP-OBJECTS-IN-RANGE, which is unreliable in the presence of ;;; multiple threads. Unfortunately, some users dangerously redefine ;;; builtin functions, and moreover, while there are multiple threads. -(defun statically-link-code-obj (code fixups) - (declare (ignorable code fixups)) - (unless (immobile-space-obj-p code) - (return-from statically-link-code-obj code)) +(defun statically-link-code-obj (code fixups &optional observable-fdefns) + (declare (ignorable code fixups observable-fdefns)) #+immobile-code (binding* (((fdefns-start fdefns-count) (code-header-fdefn-range code)) (replacements (make-array fdefns-count :initial-element nil)) @@ -411,7 +409,7 @@ (offset (cdr fixup)) (fdefn (code-header-ref code (+ fdefns-start fdefn-index))) (fun (aref replacements fdefn-index))) - (when fun + (when (and fun (/= (bit ambiguous fdefn-index) 1)) ;; Set the statically-linked flag (sb-vm::set-fdefn-has-static-callers fdefn 1) (when (= (bit ambiguous fdefn-index) 1) @@ -423,6 +421,7 @@ (setf (signed-sap-ref-32 insts offset) (sap- entry (sap+ insts (+ offset 4)))))))) ;; Replace ambiguous elements of the code header while still holding the lock + #+statically-link-if-ambiguous ; never enabled (dotimes (i fdefns-count) (when (= (bit ambiguous i) 1) (let ((wordindex (+ fdefns-start i)) diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index 94c2f85231..888f04671e 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -377,7 +377,7 @@ #+darwin-jit (assign-code-constants code-obj boxed-data)) - (when named-call-fixups + (when (and named-call-fixups (immobile-space-obj-p code-obj)) (sb-vm::statically-link-code-obj code-obj named-call-fixups)) (when sb-fasl::*show-new-code* (let ((*print-pretty* nil)) diff --git a/tests/static-linker.impure.lisp b/tests/static-linker.impure.lisp new file mode 100644 index 0000000000..3ef5f3a866 --- /dev/null +++ b/tests/static-linker.impure.lisp @@ -0,0 +1,45 @@ +(defun f1 (x) `(invoked-on ,x)) +(compile 'f1) +(setf (symbol-function 'f2) (symbol-function 'f1)) +(defun g (arg) + (case arg + (1 (f1 arg)) + (2 (f2 arg)) + (3 (f1 #'f1)))) +#+immobile-code (sb-vm::statically-link-core) + +(with-test (:name :static-linker-glitch) + (assert (equal (g 3) `(invoked-on ,#'f1)))) + +#+nil ; This fails because ambigous references are not patched any more +(with-test (:name :static-unlinker) + (let ((sb-c::*compile-to-memory-space* :immobile)) + (declare (muffle-conditions style-warning)) + (flet ((disassembly-lines (name) + (split-string + (with-output-to-string (s) + (let ((sb-disassem:*disassem-location-column-width* 0)) + (disassemble name :stream s))) + #\newline)) + (expect (match lines) + (assert (loop for line in lines + thereis (search match line))))) + (compile 'h '(lambda (x) (1+ x))) + (setf (symbol-function 'g) #'h (symbol-function 'f) #'h) + (compile 'c '(lambda (x) (g x))) + (compile 'd '(lambda (x) (f (g x)))) + ;; The FDEFN-FUN of F is same as that of G. + ;; Statically linking D should not patch the fdefn calls into static calls + ;; because it can't unambiguously be undone without storing additional data + ;; about where patches were performed to begin with. + (sb-vm::statically-link-core :callers '(c d)) + (let ((lines (disassembly-lines 'c))) + (expect "#<FUNCTION H>" lines)) + (let ((lines (disassembly-lines 'd))) + (expect "#<FUNCTION H>" lines)) + (setf (symbol-function 'g) #'+) + (let ((lines (disassembly-lines 'c))) + (expect "#<FDEFN G>" lines)) + (let ((lines (disassembly-lines 'd))) + (expect "#<FDEFN G>" lines) + (expect "#<FUNCTION H>" lines))))) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index f0b27c7fc6..782031f66e 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -215,39 +215,6 @@ (assert (find-line "CALL" "FUNCTION GENSYM")) (assert (find-line "JMP" "FUNCTION PRINT"))))) -#+immobile-code -(with-test (:name :static-unlinker) - (let ((sb-c::*compile-to-memory-space* :immobile)) - (declare (muffle-conditions style-warning)) - (flet ((disassembly-lines (name) - (split-string - (with-output-to-string (s) - (let ((sb-disassem:*disassem-location-column-width* 0)) - (disassemble name :stream s))) - #\newline)) - (expect (match lines) - (assert (loop for line in lines - thereis (search match line))))) - (compile 'h '(lambda (x) (1+ x))) - (setf (symbol-function 'g) #'h (symbol-function 'f) #'h) - (compile 'c '(lambda (x) (g x))) - (compile 'd '(lambda (x) (f (g x)))) - ;; The FDEFN-FUN of F is same as that of G. - ;; Statically linking D should not patch the fdefn calls into static calls - ;; because it can't unambiguously be undone without storing additional data - ;; about where patches were performed to begin with. - (sb-vm::statically-link-core :callers '(c d)) - (let ((lines (disassembly-lines 'c))) - (expect "#<FUNCTION H>" lines)) - (let ((lines (disassembly-lines 'd))) - (expect "#<FUNCTION H>" lines)) - (setf (symbol-function 'g) #'+) - (let ((lines (disassembly-lines 'c))) - (expect "#<FDEFN G>" lines)) - (let ((lines (disassembly-lines 'd))) - (expect "#<FDEFN G>" lines) - (expect "#<FUNCTION H>" lines))))) - (with-test (:name :c-call :skipped-on (and :win32 :x86-64)) (let* ((lines (split-string (with-output-to-string (s) From 9c37d990c4610dbefd1d7b01b8a700c4e7c244e4 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 7 Sep 2022 14:52:50 -0400 Subject: [PATCH 3927/4023] x86-64: shorten KEYWORDP on known symbol --- src/cold/warm.lisp | 1 + src/compiler/x86-64/type-vops.lisp | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/cold/warm.lisp b/src/cold/warm.lisp index a7f6350499..d54b7ebd1a 100644 --- a/src/cold/warm.lisp +++ b/src/cold/warm.lisp @@ -242,6 +242,7 @@ sb-kernel::(rplaca (last *handler-clusters*) (car **initial-handler-clusters**)) :direction :output :if-exists :supersede) (let (list) (sb-int:dohash ((name vop) sb-c::*backend-parsed-vops*) + (declare (ignore vop)) (unless (char= (char (string name) 0) #\!) (push (cons (gethash name sb-c::*static-vop-usage-counts* 0) name) list))) (dolist (cell (sort list #'> :key #'car)) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 5a83cba6b2..b19eb1a786 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -640,13 +640,21 @@ (eval-when (:compile-toplevel) (aver (= sb-impl::package-id-bits 16))) (define-vop (keywordp symbolp) (:translate keywordp) + (:args-var args-ref) (:generator 3 - (inst lea temp (ea (- other-pointer-lowtag) value)) - (inst test :byte temp lowtag-mask) - (inst jmp :ne out) - (inst cmp :byte (ea temp) symbol-widetag) - (inst jmp :ne out) - (inst cmp :word (ea (+ (ash symbol-name-slot word-shift) 6) temp) sb-impl::+package-id-keyword+) + (cond ((csubtypep (tn-ref-type args-ref) (specifier-type 'symbol)) + (inst cmp :word (ea (+ (ash symbol-name-slot word-shift) 6 + (- other-pointer-lowtag)) + value) + sb-impl::+package-id-keyword+)) + (t + (inst lea temp (ea (- other-pointer-lowtag) value)) + (inst test :byte temp lowtag-mask) + (inst jmp :ne out) + (inst cmp :byte (ea temp) symbol-widetag) + (inst jmp :ne out) + (inst cmp :word (ea (+ (ash symbol-name-slot word-shift) 6) temp) + sb-impl::+package-id-keyword+))) out)) (define-vop (consp type-predicate) From 1b4880ead672b42b37eae41f4bad200852aa9161 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 7 Sep 2022 15:46:21 -0400 Subject: [PATCH 3928/4023] Whitespace --- contrib/sb-bsd-sockets/tests.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index 22a658acee..c2b2eb5084 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -363,7 +363,7 @@ (lambda () (socket-connect client-sock #(127 0 0 1) port) (socket-close client-sock))))) - (sb-thread:join-thread client-connect-thread :timeout 20) + (sb-thread:join-thread client-connect-thread :timeout 20) (setf server-sock (socket-accept listen-sock))) ;; Wait for input. This should return when we get EOF From 5b7928d8177f4d30728b4ec99ef5fc15b053aad3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 7 Sep 2022 16:32:44 -0400 Subject: [PATCH 3929/4023] Speedup and simplify reader charmacro lookup 1) Since the dispatch char lookup has an IF for base-char vs non-base, exploit that to use the CHAR-UPCASE optimizer on base-char. And don't pass the upcased char to the user's function either. So we're consistent with CLISP, ECL, and ABCL. 2) Now that CALL-SYMBOL exists on the good platforms, there's no need to expose FDEFNs to the reader. Just store a function-designator. --- src/code/ansi-stream.lisp | 2 +- src/code/reader.lisp | 98 ++++++++++++++++----------------------- 2 files changed, 41 insertions(+), 59 deletions(-) diff --git a/src/code/ansi-stream.lisp b/src/code/ansi-stream.lisp index d76359a0fd..9915371e95 100644 --- a/src/code/ansi-stream.lisp +++ b/src/code/ansi-stream.lisp @@ -152,7 +152,7 @@ ;; Absolute character position, acting also as a generalized boolean ;; in lieu of testing FORM-TRACKING-STREAM-P to see if we must ;; maintain correctness of the slot in ANSI-STREAM-UNREAD-CHAR. - (input-char-pos nil)) + (input-char-pos nil :type (or null index))) ;;; SYNONYM-STREAM type is needed by ANSI-STREAM-{INPUT,OUTPUT}-STREAM-P ;;; and also needed by OPEN (though not obviously), which is compiled diff --git a/src/code/reader.lisp b/src/code/reader.lisp index f240283015..f816756edc 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -81,7 +81,7 @@ (declare (readtable readtable) (character char) (type (unsigned-byte 8) attributes) - (type (or null function fdefn) function)) + (type (or function symbol) function)) (if (typep char 'base-char) (setf (aref (base-char-syntax-array readtable) (char-code char)) attributes (aref (base-char-macro-array readtable) (char-code char)) function) @@ -95,10 +95,9 @@ (remhash char table))))) nil) -;;; the value actually stored in the character macro table. As per -;;; ANSI #'GET-MACRO-CHARACTER and #'SET-MACRO-CHARACTER, this can -;;; be either a function-designator or NIL, except that we store -;;; symbols not as themselves but as their #<fdefn>. +;;; Get the value stored in the character macro table for CHAR. As per +;;; ANSI #'GET-MACRO-CHARACTER and #'SET-MACRO-CHARACTER, this return as +;;; function-designator (possibly NIL). (defun get-raw-cmt-entry (char readtable) (declare (character char) (readtable readtable)) (if (typep char 'base-char) @@ -106,8 +105,7 @@ ;; extended-char entry if present is a cons of the attributes and function (cdr (truly-the list (gethash char (extended-char-table readtable)))))) -;; As above but get the entry for SUB-CHAR in a dispatching macro table. - +;;; As above but get the entry for SUB-CHAR in a dispatching macro table. (defmacro charmacro-dtable-base-chars (dtable) `(truly-the (simple-vector ,base-char-code-limit) (car ,dtable))) (defmacro charmacro-dtable-extended-chars (dtable) @@ -115,32 +113,22 @@ (defun get-raw-cmt-dispatch-entry (sub-char sub-table) (declare (character sub-char)) (if (typep sub-char 'base-char) - (svref (charmacro-dtable-base-chars (truly-the cons sub-table)) (char-code sub-char)) + (svref (charmacro-dtable-base-chars (truly-the cons sub-table)) + (char-code (char-upcase (truly-the base-char sub-char)))) (awhen (charmacro-dtable-extended-chars sub-table) - (gethash sub-char it)))) - -;; Coerce THING to a character-macro-table entry -(defmacro coerce-to-cmt-entry (thing) - `(let ((x ,thing)) - (if (typep x '(or null function)) x (find-or-create-fdefn x)))) - -;; Return a callable function given a character-macro-table entry. -(defmacro cmt-entry-to-function (val fallback) - `(let ((x ,val)) - (truly-the - function - (cond ((functionp x) x) - ((null x) ,fallback) - (t (sb-c:safe-fdefn-fun x)))))) - -;; Return a function-designator given a character-macro-table entry. -(defmacro cmt-entry-to-fun-designator (val) - `(let ((x ,val)) - (if (fdefn-p x) (fdefn-name x) x))) + (gethash (char-upcase sub-char) it)))) + +(eval-when (:compile-toplevel) ; wire in the fallbacks via :KNOWN-FUN constants + (sb-c:defknown read-token (stream character) *) + (sb-c:defknown dispatch-char-error (stream character t) *)) +;;; Invoke the character macro table entry for FUN-DESIGNATOR passing it +;;; ARGS, but if DESIGNATOR is NIL then call FALLBACK instead. +(defmacro invoke-cmt-entry ((fun-designator fallback) &rest args) + `(funcall (truly-the (or function symbol) (or ,fun-designator ,fallback)) + ,@args)) ;;; The character attribute table is a BASE-CHAR-CODE-LIMIT vector ;;; of (unsigned-byte 8) plus a hashtable to handle higher character codes. - (defmacro test-attribute (char whichclass readtable &optional cast) (let ((temp '#:readtable)) `(let ((,temp ,readtable)) @@ -302,8 +290,7 @@ be interned (returned, respectively) as required. The default is :SYMBOLS." (find-if-in-closure #'consp fun))) ;;; Copy a char-macro-table entry. -;;; If ENTRY is a dispatching macro, copy its dispatch table. -;;; Otherwise return it unchanged, be it NIL or a function or fdefn. +;;; If ENTRY is a dispatching macro, copy its dispatch table; otherwise return it unchanged. (defun copy-cmt-entry (entry) (let ((dtable (%dispatch-macro-char-table entry))) (if dtable @@ -376,7 +363,7 @@ standard Lisp readtable when NIL." designated-readtable char (if non-terminatingp +char-attr-constituent+ +char-attr-terminating-macro+) - (coerce-to-cmt-entry function)) + function) t)) ; (ANSI-specified return value) (defun get-macro-character (char &optional (rt-designator *readtable*)) @@ -387,8 +374,7 @@ standard Lisp readtable when NIL." (let* ((designated-readtable (or rt-designator *standard-readtable*)) ;; the first return value: (OR FUNCTION SYMBOL) if CHAR is a macro ;; character, or NIL otherwise - (fun-value (cmt-entry-to-fun-designator - (get-raw-cmt-entry char designated-readtable)))) + (fun-value (get-raw-cmt-entry char designated-readtable))) (values fun-value ;; NON-TERMINATING-P return value: (if fun-value @@ -436,8 +422,7 @@ standard Lisp readtable when NIL." (assert-not-standard-readtable readtable 'set-dispatch-macro-character) (when (digit-char-p sub-char) (error "SUB-CHAR must not be a decimal digit: ~S" sub-char)) - (let ((dtable (get-dispatch-macro-char-table disp-char readtable)) - (function (coerce-to-cmt-entry function))) + (let ((dtable (get-dispatch-macro-char-table disp-char readtable))) ;; (SET-MACRO-CHARACTER #\$ (GET-MACRO-CHARACTER #\#)) will share ;; the dispatch table. Perhaps it should be copy-on-write? (if (typep sub-char 'base-char) @@ -458,8 +443,7 @@ standard Lisp readtable when NIL." or NIL if there is no associated function." (let ((dtable (get-dispatch-macro-char-table disp-char (or rt-designator *standard-readtable*)))) - (cmt-entry-to-fun-designator - (get-raw-cmt-dispatch-entry (char-upcase sub-char) dtable)))) + (get-raw-cmt-dispatch-entry sub-char dtable))) ;;;; definitions to support internal programming conventions @@ -766,9 +750,8 @@ standard Lisp readtable when NIL." (and (form-tracking-stream-p stream) ;; Subtract 1 because the position points _after_ CHAR. (1- (form-tracking-stream-input-char-pos stream))) - (funcall (cmt-entry-to-function - (get-raw-cmt-entry char *readtable*) #'read-token) - stream char))) + (invoke-cmt-entry ((get-raw-cmt-entry char *readtable*) #'read-token) + stream char))) (defun read (&optional (stream *standard-input*) (eof-error-p t) @@ -1821,22 +1804,23 @@ extended <package-name>::<form-in-package> syntax." (defun read-dispatch-char (stream dispatch-table) ;; Read some digits. - (let ((numargp nil) - (numarg 0) - (sub-char ())) - (loop - (let ((ch (read-char stream nil +EOF+))) - (if (eq ch +EOF+) - (reader-eof-error stream "inside dispatch character") - ;; Take care of the extra char. - (let ((dig (digit-char-p ch))) - (if dig - (setq numargp t numarg (+ (* numarg 10) dig)) - (return (setq sub-char (char-upcase ch)))))))) + (let* ((numarg nil) + (sub-char + (loop + (let ((ch (read-char stream nil +EOF+))) + (if (eq ch +EOF+) + (reader-eof-error stream "inside dispatch character") + ;; Take care of the extra char. + (let ((dig (digit-char-p ch))) + (cond ((not dig) (return ch)) + ((not numarg) (setq numarg dig)) + (t (setq numarg (+ (* numarg 10) dig)))))))))) ;; Look up the function and call it. - (let ((fn (get-raw-cmt-dispatch-entry sub-char dispatch-table))) - (funcall (cmt-entry-to-function fn #'dispatch-char-error) - stream sub-char (if numargp numarg nil))))) + ;; We used to give the user the upcased sub-char, but not only is that + ;; not stipulated, the "lossiness" could be construed as a bug. + (invoke-cmt-entry ((get-raw-cmt-dispatch-entry sub-char dispatch-table) + #'dispatch-char-error) + stream sub-char numarg))) ;;;; READ-FROM-STRING @@ -1952,8 +1936,6 @@ extended <package-name>::<form-in-package> syntax." (loop for fn across (the simple-vector (charmacro-dtable-base-chars dtable)) and ch from 0 when fn do (push (cons (code-char ch) fn) output)) - (dolist (cell output) ; coerce values to function-designator - (rplacd cell (cmt-entry-to-fun-designator (cdr cell)))) (when hash-table-p ; caller wants hash-tables (setq output (%stuff-hash-table (make-hash-table) output))) (push (cons char output) alist))))) From db71d5837b24679c85609a957f8a2dc3a1b80d13 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 7 Sep 2022 21:19:36 -0400 Subject: [PATCH 3930/4023] Combine linkage-table.lisp into foreign.lisp To avoid some confusion with the not-yet-done lisp linkage-table --- src/code/foreign.lisp | 95 ++++++++++++++++++++++++++- src/code/linkage-table.lisp | 116 --------------------------------- src/cold/build-order.lisp-expr | 1 - 3 files changed, 94 insertions(+), 118 deletions(-) delete mode 100644 src/code/linkage-table.lisp diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 5e08108dab..f6314c38df 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -11,6 +11,98 @@ (in-package "SB-IMPL") +(define-alien-routine arch-write-linkage-table-entry void + (index int) (real-address unsigned) (datap int)) +(define-alien-variable undefined-alien-address unsigned) + +(define-load-time-global *linkage-info* + ;; CDR of the cons is the list of undefineds + (list (make-hash-table :test 'equal :synchronized t))) +(declaim (type (cons hash-table) *linkage-info*)) + +(macrolet ((dlsym-wrapper (&optional warn) + ;; Produce two values: an indicator of whether the foreign symbol was + ;; found; and the address as an integer if found, or a guard address + ;; which when accessed will result in an UNDEFINED-ALIEN-ERROR. + `(let ((addr (find-dynamic-foreign-symbol-address name))) + (cond (addr + (values t addr)) + (t + (when ,warn + ;; If we can report the actual name when an undefined + ;; alien is called don't warn. + #-(or arm arm64 x86-64) + (style-warn 'sb-kernel:undefined-alien-style-warning + :symbol name)) + (values + nil + (if datap + undefined-alien-address + (or + (sb-fasl:get-asm-routine 'sb-vm::undefined-alien-tramp) + (find-foreign-symbol-address "undefined_alien_function") + (bug "unreachable"))))))))) + +;;; Return the index of NAME+DATAP in the table, adding it if it doesn't exist. +(defun ensure-alien-linkage-index (name datap) + (let* ((key (if datap (list name) name)) + (info *linkage-info*) + (ht (car info))) + (or (with-system-mutex ((hash-table-lock ht)) + (or (gethash key ht) + (let* ((index (hash-table-count ht)) + (capacity (floor (- sb-vm:alien-linkage-table-space-end + sb-vm:alien-linkage-table-space-start) + sb-vm:alien-linkage-table-entry-size))) + (when (< index capacity) + (multiple-value-bind (defined real-address) (dlsym-wrapper t) + (unless defined (push key (cdr info))) + (arch-write-linkage-table-entry index real-address (if datap 1 0)) + (logically-readonlyize name) + (setf (gethash key ht) index)))))) + (error "Linkage-table full (~D entries): cannot link ~S." + (hash-table-count ht) name)))) + +;;; Update the linkage-table. Called during initialization after all +;;; shared libraries have been reopened, and after a previously loaded +;;; shared object is reloaded. +;;; +;;; FIXME: Should figure out how to write only those entries that need +;;; updating. +;;; The problem is that when unloading a library, lacking any way to know which +;;; symbols came from it, we have to try to find every symbol again. +;;; If the shared-object-handle in which each symbol was originally found were +;;; stored in linkage-info, we could know which will become undefined on unload. +;;; The only "problem" is my lack of motivation to change this further. +(defun update-alien-linkage-table (full-scan) + ;; This symbol is of course itself a prelinked symbol. + (let* ((n-prelinked (extern-alien "alien_linkage_table_n_prelinked" int)) + (info *linkage-info*) + (ht (car info)) + ;; for computing anew the list of undefined symbols + (notdef)) + (flet ((recheck (key index) + (let* ((datap (listp key)) + (name (if datap (car key) key))) + ;; Symbols required for Lisp startup + ;; will not be re-pointed to a different address ever. + ;; Nor will those referenced by ELF core. + (when (>= index n-prelinked) + (multiple-value-bind (defined real-address) (dlsym-wrapper) + (unless defined (push key notdef)) + (arch-write-linkage-table-entry index real-address + (if datap 1 0))))))) + (with-system-mutex ((hash-table-lock ht)) + (if full-scan + ;; Look up everything; this is for image restart or library unload. + (dohash ((key index) ht) + (recheck key index)) + ;; Look up only the currently undefined foreign symbols + (dolist (key (cdr info)) + (recheck key (the (not null) (gethash key ht))))) + (setf (cdr info) notdef))))) +) + (defun find-foreign-symbol-address (name) "Returns the address of the foreign symbol NAME, or NIL. Does not enter the symbol in the linkage table, and never returns an address in the linkage-table." @@ -40,7 +132,8 @@ Returns a secondary value T for historical reasons. The returned address is always a linkage-table address. Symbols are entered into the linkage-table if they aren't there already." (declare (ignorable datap)) - (values (ensure-foreign-symbol-linkage name datap) t)) + (let ((index (ensure-alien-linkage-index name datap))) + (values (sb-vm::alien-linkage-table-entry-address index) t))) (defun foreign-symbol-sap (symbol &optional datap) "Returns a SAP corresponding to the foreign symbol. DATAP must be true if the diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp deleted file mode 100644 index 3669b8c1c5..0000000000 --- a/src/code/linkage-table.lisp +++ /dev/null @@ -1,116 +0,0 @@ -;;;; Linkage table specifics - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -;;;; Linkage table itself is a mmapped memory area in C-land, which is -;;;; initialized by INIT-LINKAGE-TABLE once all shared objects have -;;;; been reopened, based on the information stored in *LINKAGE-INFO*. -;;;; -;;;; For data entries the linkage table holds the real address -;;;; of the foreign symbol, and for code the entries are jumps -;;;; to the real addresses. - -(in-package "SB-IMPL") - -(define-alien-routine arch-write-linkage-table-entry void - (index int) (real-address unsigned) (datap int)) - -(define-load-time-global *linkage-info* - ;; CDR of the cons is the list of undefineds - (list (make-hash-table :test 'equal :synchronized t))) -(declaim (type (cons hash-table) *linkage-info*)) - -(define-alien-variable undefined-alien-address unsigned) - -(macrolet ((dlsym-wrapper (&optional warn) - ;; Produce two values: an indicator of whether the foreign symbol was - ;; found; and the address as an integer if found, or a guard address - ;; which when accessed will result in an UNDEFINED-ALIEN-ERROR. - `(let ((addr (find-dynamic-foreign-symbol-address name))) - (cond (addr - (values t addr)) - (t - (when ,warn - ;; If we can report the actual name when an undefined - ;; alien is called don't warn. - #-(or arm arm64 x86-64) - (style-warn 'sb-kernel:undefined-alien-style-warning - :symbol name)) - (values - nil - (if datap - undefined-alien-address - (or - (sb-fasl:get-asm-routine 'sb-vm::undefined-alien-tramp) - (find-foreign-symbol-address "undefined_alien_function") - (bug "unreachable"))))))))) - -;;; Add a foreign linkage entry if none exists, return the address -;;; in the linkage table. -(defun ensure-foreign-symbol-linkage (name datap) - (let* ((key (if datap (list name) name)) - (info *linkage-info*) - (ht (car info))) - (or (awhen (with-system-mutex ((hash-table-lock ht)) - (or (gethash key ht) - (let* ((index (hash-table-count ht)) - (capacity (floor (- sb-vm:alien-linkage-table-space-end - sb-vm:alien-linkage-table-space-start) - sb-vm:alien-linkage-table-entry-size))) - (when (< index capacity) - (multiple-value-bind (defined real-address) (dlsym-wrapper t) - (unless defined (push key (cdr info))) - (arch-write-linkage-table-entry index real-address - (if datap 1 0)) - (logically-readonlyize name) - (setf (gethash key ht) index)))))) - (sb-vm::alien-linkage-table-entry-address it)) - (error "Linkage-table full (~D entries): cannot link ~S." - (hash-table-count ht) name)))) - -;;; Update the linkage-table. Called during initialization after all -;;; shared libraries have been reopened, and after a previously loaded -;;; shared object is reloaded. -;;; -;;; FIXME: Should figure out how to write only those entries that need -;;; updating. -;;; The problem is that when unloading a library, lacking any way to know which -;;; symbols came from it, we have to try to find every symbol again. -;;; If the shared-object-handle in which each symbol was originally found were -;;; stored in linkage-info, we could know which will become undefined on unload. -;;; The only "problem" is my lack of motivation to change this further. -(defun update-alien-linkage-table (full-scan) - ;; This symbol is of course itself a prelinked symbol. - (let* ((n-prelinked (extern-alien "alien_linkage_table_n_prelinked" int)) - (info *linkage-info*) - (ht (car info)) - ;; for computing anew the list of undefined symbols - (notdef)) - (flet ((recheck (key index) - (let* ((datap (listp key)) - (name (if datap (car key) key))) - ;; Symbols required for Lisp startup - ;; will not be re-pointed to a different address ever. - ;; Nor will those referenced by ELF core. - (when (>= index n-prelinked) - (multiple-value-bind (defined real-address) (dlsym-wrapper) - (unless defined (push key notdef)) - (arch-write-linkage-table-entry index real-address - (if datap 1 0))))))) - (with-system-mutex ((hash-table-lock ht)) - (if full-scan - ;; Look up everything; this is for image restart or library unload. - (dohash ((key index) ht) - (recheck key index)) - ;; Look up only the currently undefined foreign symbols - (dolist (key (cdr info)) - (recheck key (the (not null) (gethash key ht))))) - (setf (cdr info) notdef))))) -) diff --git a/src/cold/build-order.lisp-expr b/src/cold/build-order.lisp-expr index f09b645ba5..b84ef11747 100644 --- a/src/cold/build-order.lisp-expr +++ b/src/cold/build-order.lisp-expr @@ -320,7 +320,6 @@ ("src/compiler/bit-util") - ("src/code/linkage-table" :not-host) ("src/code/foreign" :not-host) ("src/code/unix" :not-host) ("src/code/symbol" :not-host) From e30d4154e24205a0908ff371cbd0e0e98d88f1ee Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 8 Sep 2022 05:35:55 +0300 Subject: [PATCH 3931/4023] with-pinned-objects: make sure constants are preserved. Fixes lp#1989037 --- src/compiler/fndb.lisp | 2 ++ src/compiler/generic/pinned-objects.lisp | 3 ++- src/compiler/generic/vm-ir2tran.lisp | 11 +++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index e340a7262a..44e3e8fbd6 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -2055,6 +2055,8 @@ (defknown sb-vm::touch-object (t) (values) (always-translatable)) +(defknown sb-vm::touch-object-identity (t) t + (always-translatable)) (defknown foreign-symbol-dataref-sap (simple-string) system-area-pointer (movable flushable)) diff --git a/src/compiler/generic/pinned-objects.lisp b/src/compiler/generic/pinned-objects.lisp index 0587c07fa8..86c773bf8b 100644 --- a/src/compiler/generic/pinned-objects.lisp +++ b/src/compiler/generic/pinned-objects.lisp @@ -39,7 +39,8 @@ garbage collection." ;; unfathomable reason decides to allocate value-cells ;; for them -- since we have DX value-cells on x86oid ;; platforms this still forces them on the stack. - (dx-let ,(mapcar #'list pins objects) + (dx-let ,(mapcar (lambda (n v) + (list n `(touch-object-identity ,v))) pins objects) (multiple-value-prog1 (,wpo) ;; TOUCH-OBJECT has a VOP with an empty body: compiler ;; thinks we're using the argument and doesn't flush diff --git a/src/compiler/generic/vm-ir2tran.lisp b/src/compiler/generic/vm-ir2tran.lisp index dc654a50d4..89566fd68d 100644 --- a/src/compiler/generic/vm-ir2tran.lisp +++ b/src/compiler/generic/vm-ir2tran.lisp @@ -486,3 +486,14 @@ (:policy :fast-safe) (:arg-types t) (:generator 0)) + +#+(or x86 x86-64) +(define-vop () + (:translate touch-object-identity) + (:args (object :scs (descriptor-reg any-reg sap-reg + signed-reg unsigned-reg) + :target res)) + (:policy :fast-safe) + (:results (res :scs (descriptor-reg))) + (:generator 0 + (move res object))) From 7c2ca9daa2488654502c0b9ad9e481ea6dcc96e1 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 8 Sep 2022 16:59:21 -0400 Subject: [PATCH 3932/4023] Allow a few random GC page allocations in no-consing tests It's conceivable that the finalizer thread closes a region mid-test, or something else happens that we can't account for. This got the failure rate to 0 on a many-way run of compiler.pure whereas before I was seeing as many as 6 failures in 100 trials. --- tests/compiler-test-util.lisp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/compiler-test-util.lisp b/tests/compiler-test-util.lisp index 8d5dd53c88..a9afa07645 100644 --- a/tests/compiler-test-util.lisp +++ b/tests/compiler-test-util.lisp @@ -80,13 +80,14 @@ (defun check-consing (yes/no form thunk times) (multiple-value-bind (before after) (collect-consing-stats thunk times) - (let ((consed-bytes (- after before))) + (let* ((consed-bytes (- after before)) + (bytes-per-iteration (float (/ consed-bytes times)))) (assert (funcall (if yes/no #'not #'identity) - ;; I do not know why we do this comparasion, - ;; the original code did, so I let it - ;; in. Perhaps to prevent losage on GC - ;; fluctuations, or something. --TCR. - (< consed-bytes times)) + ;; If allocation really happened, it can't have been less than one cons cell + ;; per iteration (unless the test is nondeterministic - but in that case + ;; we can't really use this strategy anyway). So consider it to have consed + ;; nothing if the fraction is too small. + (< bytes-per-iteration (* 2 sb-vm:n-word-bytes))) () "~@<Expected the form ~ ~4I~@:_~A ~0I~@:_~ @@ -94,7 +95,7 @@ ~D times resulted in the allocation of ~ ~D bytes~:[ (~,3F per run)~;~].~@:>" form yes/no times consed-bytes - (zerop consed-bytes) (float (/ consed-bytes times)))) + (zerop consed-bytes) bytes-per-iteration)) (values before after))) (defparameter +times+ 10000) From e74e5158ab7b66ae0e166299408ec2bd1288138d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 8 Sep 2022 21:42:18 -0400 Subject: [PATCH 3933/4023] x86-64: Test undefined aliens + *compile-to-memory-space* Ensure that the asm routine recognizes two possible call instruction formats. --- tests/alien.impure.lisp | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/tests/alien.impure.lisp b/tests/alien.impure.lisp index 28d482f457..252b8067bf 100644 --- a/tests/alien.impure.lisp +++ b/tests/alien.impure.lisp @@ -527,23 +527,31 @@ (with-test (:name :undefined-alien-name :skipped-on (not (or :x86-64 :arm :arm64))) - (handler-case (funcall (checked-compile `(lambda () - (alien-funcall (extern-alien "bar" (function (values))))) - :allow-style-warnings t)) - (t (c) - (assert (typep c 'sb-kernel::undefined-alien-function-error)) - (assert (equal (cell-error-name c) "bar"))))) + (dolist (memspace '(:dynamic #+immobile-space :immobile)) + (let ((lispfun + (let ((sb-c::*compile-to-memory-space* memspace)) + (checked-compile `(lambda () + (alien-funcall (extern-alien "bar" (function (values))))) + :allow-style-warnings t)))) + (handler-case (funcall lispfun) + (t (c) + (assert (typep c 'sb-kernel::undefined-alien-function-error)) + (assert (equal (cell-error-name c) "bar"))))))) (with-test (:name :undefined-alien-name-via-linkage-table-trampoline :skipped-on (not (or :x86-64 :arm :arm64))) - (handler-case (funcall (checked-compile - `(lambda () - (with-alien ((fn (* (function (values))) - (sb-sys:int-sap (sb-sys:foreign-symbol-address "baz")))) - (alien-funcall fn))))) - (t (c) - (assert (typep c 'sb-kernel::undefined-alien-function-error)) - (assert (equal (cell-error-name c) "baz"))))) + (dolist (memspace '(:dynamic #+immobile-space :immobile)) + (let ((lispfun + (let ((sb-c::*compile-to-memory-space* memspace)) + (checked-compile + `(lambda () + (with-alien ((fn (* (function (values))) + (sb-sys:int-sap (sb-sys:foreign-symbol-address "baz")))) + (alien-funcall fn))))))) + (handler-case (funcall lispfun) + (t (c) + (assert (typep c 'sb-kernel::undefined-alien-function-error)) + (assert (equal (cell-error-name c) "baz"))))))) (defconstant fleem 3) ;; We used to expand into From 77bee92554028e189581b6f6397e36771c45e4fe Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 8 Sep 2022 22:01:19 -0400 Subject: [PATCH 3934/4023] Fix elfcore test An extra space character caused $filter-out not to remove --export-dynamic from $LINKFLAGS so we weren't properly showing that -ldl isn't needed. --- src/code/alloc.lisp | 1 - src/code/misc-aliens.lisp | 3 +++ src/runtime/GNUmakefile | 5 ++++- tests/elfcore.test.sh | 8 ++++++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/code/alloc.lisp b/src/code/alloc.lisp index 85829c1d0b..16b021304e 100644 --- a/src/code/alloc.lisp +++ b/src/code/alloc.lisp @@ -77,7 +77,6 @@ (define-alien-variable text-space-size (unsigned 32)) (define-alien-variable ("FIXEDOBJ_SPACE_START" fixedobj-space-start) unsigned-long) -(define-alien-variable ("TEXT_SPACE_START" text-space-start) unsigned-long) (define-alien-variable ("text_space_highwatermark" *text-space-free-pointer*) system-area-pointer) (define-alien-variable ("fixedobj_free_pointer" *fixedobj-space-free-pointer*) diff --git a/src/code/misc-aliens.lisp b/src/code/misc-aliens.lisp index 6b5f2eecba..b43f2edbd2 100644 --- a/src/code/misc-aliens.lisp +++ b/src/code/misc-aliens.lisp @@ -33,6 +33,9 @@ (truly-the (signed-byte 64) (* (extern-alien "next_free_page" signed) sb-vm:gencgc-page-bytes)))) +#+immobile-space +(define-alien-variable ("TEXT_SPACE_START" sb-vm:text-space-start) unsigned-long) + #+darwin-jit (define-alien-variable ("static_code_space_free_pointer" sb-vm:*static-code-space-free-pointer*) system-area-pointer) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index f2483bfee2..b70fbd6c7e 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -139,7 +139,10 @@ shrinkwrap-sbcl.s shrinkwrap-sbcl-core.o: $(SHRINKWRAP_DEPS) pie-shrinkwrap-sbcl.s pie-shrinkwrap-sbcl-core.o: $(SHRINKWRAP_DEPS) ../../run-sbcl.sh --script ../../tools-for-build/editcore.lisp split --pie \ ../../output/sbcl.core pie-shrinkwrap-sbcl.s -comma := , # "Commas ... cannot appear in the text of an argument as written" +# "Commas ... cannot appear in the text of an argument as written" +# There can not be any space after the comma on the next line, +# or else it becomes part of the expansion of $(comma) +comma := , shrinkwrap-sbcl: shrinkwrap-sbcl.s shrinkwrap-sbcl-core.o $(LIBSBCL) $(CC) -no-pie $(filter-out -Wl$(comma)--export-dynamic, $(LINKFLAGS)) \ $(CFLAGS) -o $@ $^ $(LIBS) diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index 6237c44603..e5f6a423fe 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -48,6 +48,14 @@ EOF $SBCL_PWD/../src/runtime/shrinkwrap-sbcl --disable-debugger --no-sysinit --no-userinit --noprint <<EOF ;; I think this tests immobile space exhaustion (dotimes (i 100000) (sb-vm::alloc-immobile-fdefn)) + +;; Test that the link step did not use --export-dynamic +(assert (gethash '("TEXT_SPACE_START") (car sb-sys:*linkage-info*))) ; C symbol exists +; but dlsym() can't see it +(assert (not (sb-sys:find-dynamic-foreign-symbol-address "TEXT_SPACE_START"))) +; but we can read the value +(assert (funcall (compile nil '(lambda () sb-vm:text-space-start)))) + ;; Test that CODE-SERIAL# is never 0 except for simple-fun-less objects (sb-vm:map-allocated-objects (lambda (obj type size) From a0feebbe7443d24f3a6f608d728ac6eae15ff69b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 8 Sep 2022 23:12:57 -0400 Subject: [PATCH 3935/4023] Tidy up parms files by removing #-gencgc --- src/compiler/arm/parms.lisp | 19 ---------------- src/compiler/arm64/parms.lisp | 16 -------------- src/compiler/ppc/parms.lisp | 40 ---------------------------------- src/compiler/ppc64/parms.lisp | 41 +---------------------------------- src/compiler/riscv/parms.lisp | 25 +++------------------ 5 files changed, 4 insertions(+), 137 deletions(-) diff --git a/src/compiler/arm/parms.lisp b/src/compiler/arm/parms.lisp index c2fc4af755..3f1df27c10 100644 --- a/src/compiler/arm/parms.lisp +++ b/src/compiler/arm/parms.lisp @@ -70,18 +70,6 @@ ;;;; Where to put the different spaces. -;;; On non-gencgc we need large dynamic and static spaces for PURIFY -#-gencgc -(progn - (defconstant read-only-space-start #x04000000) - (defconstant read-only-space-end #x07ff8000) - (defconstant static-space-start #x08000000) - (defconstant static-space-end #x097fff00) - - (defconstant alien-linkage-table-space-start #x0a000000) - (defconstant alien-linkage-table-space-end #x0b000000)) - -#+gencgc (progn #+(or linux netbsd) (!gencgc-space-setup #x04000000 :dynamic-space-start #x4f000000) @@ -93,16 +81,9 @@ ;;; Link these as data entries so that we store only the address of the ;;; handwritten assembly code in the linkage able, and not a trampoline ;;; to the trampoline. The ALLOCATION macro just wants an address. -#+gencgc (setq *linkage-space-predefined-entries* '(("alloc_tramp" t) ("list_alloc_tramp" t))) -#+(or linux netbsd openbsd) -(progn - #-gencgc - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x66fff000))) ;;;; other miscellaneous constants diff --git a/src/compiler/arm64/parms.lisp b/src/compiler/arm64/parms.lisp index 23c02b0c2f..b3c43ceb94 100644 --- a/src/compiler/arm64/parms.lisp +++ b/src/compiler/arm64/parms.lisp @@ -64,22 +64,6 @@ ;;;; Where to put the different spaces. -;;; On non-gencgc we need large dynamic and static spaces for PURIFY -#-gencgc -(progn - (defconstant read-only-space-start #x04000000) - (defconstant read-only-space-end #x07ff8000) - (defconstant static-space-start #x08000000) - (defconstant static-space-end #x097fff00) - - (defconstant alien-linkage-table-space-start #x0a000000) - (defconstant alien-linkage-table-space-end #x0b000000) - #+(or linux openbsd) - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x66fff000))) - -#+gencgc (!gencgc-space-setup #+(or linux openbsd freebsd) #xF0000000 #+darwin #x300000000 #+netbsd #x2F0000000 diff --git a/src/compiler/ppc/parms.lisp b/src/compiler/ppc/parms.lisp index 824e9d21a1..9e288af7e4 100644 --- a/src/compiler/ppc/parms.lisp +++ b/src/compiler/ppc/parms.lisp @@ -85,19 +85,6 @@ ;;;; Where to put the different spaces. -;;; On non-gencgc we need large dynamic and static spaces for PURIFY -#-gencgc -(progn - (defconstant read-only-space-start #x04000000) - (defconstant read-only-space-end #x07ff8000) - (defconstant static-space-start #x08000000) - (defconstant static-space-end #x097fff00) - - (defconstant alien-linkage-table-space-start #x0a000000) - (defconstant alien-linkage-table-space-end #x0b000000)) - -;;; While on gencgc we don't. -#+gencgc (!gencgc-space-setup #x04000000 :read-only-space-size 0 :dynamic-space-start @@ -108,33 +95,6 @@ (defconstant alien-linkage-table-growth-direction :up) (defconstant alien-linkage-table-entry-size 16) -#+linux -(progn - #-gencgc - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x66fff000))) - -#+netbsd -(progn - #-gencgc - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x66fff000))) - -;;; Text and data segments start at #x01800000. Range for randomized -;;; malloc() starts #x20000000 (MAXDSIZ) after end of data seg and -;;; extends 256 MB. Use 512 - 64 MB for dynamic space so we can run -;;; under default resource limits. -;;; FIXME: MAXDSIZ is a kernel parameter, and can vary as high as 1GB. -;;; These parameters should probably be tested under such a configuration, -;;; as rare as it might or might not be. -#+openbsd -(progn - #-gencgc - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x5cfff000))) (defenum (:start 8) halt-trap diff --git a/src/compiler/ppc64/parms.lisp b/src/compiler/ppc64/parms.lisp index ca6a07faa5..2a80fbfe07 100644 --- a/src/compiler/ppc64/parms.lisp +++ b/src/compiler/ppc64/parms.lisp @@ -78,52 +78,13 @@ ;;;; Where to put the different spaces. -;;; On non-gencgc we need large dynamic and static spaces for PURIFY -#-gencgc -(progn - (defconstant read-only-space-start #x04000000) - (defconstant read-only-space-end #x07ff8000) - (defconstant static-space-start #x08000000) - (defconstant static-space-end #x097fff00) - - (defconstant alien-linkage-table-space-start #x0a000000) - (defconstant alien-linkage-table-space-end #x0b000000)) - -;;; While on gencgc we don't. -#+gencgc (!gencgc-space-setup #x04000000 +(!gencgc-space-setup #x04000000 :read-only-space-size 0 :dynamic-space-start #x1000000000) (defconstant alien-linkage-table-growth-direction :up) (defconstant alien-linkage-table-entry-size #+little-endian 28 #+big-endian 24) -#+linux -(progn - #-gencgc - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x66fff000))) - -#+netbsd -(progn - #-gencgc - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x66fff000))) - -;;; Text and data segments start at #x01800000. Range for randomized -;;; malloc() starts #x20000000 (MAXDSIZ) after end of data seg and -;;; extends 256 MB. Use 512 - 64 MB for dynamic space so we can run -;;; under default resource limits. -;;; FIXME: MAXDSIZ is a kernel parameter, and can vary as high as 1GB. -;;; These parameters should probably be tested under such a configuration, -;;; as rare as it might or might not be. -#+openbsd -(progn - #-gencgc - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x5cfff000))) (defenum (:start 8) halt-trap diff --git a/src/compiler/riscv/parms.lisp b/src/compiler/riscv/parms.lisp index 1e1099d0f3..1f20b28c7a 100644 --- a/src/compiler/riscv/parms.lisp +++ b/src/compiler/riscv/parms.lisp @@ -61,32 +61,13 @@ ;;;; Where to put the different spaces. -;;; On non-gencgc we need large dynamic and static spaces for PURIFY -#-gencgc -(progn - (defconstant read-only-space-start #x04000000) - (defconstant read-only-space-end #x07ff8000) - (defconstant static-space-start #x08000000) - (defconstant static-space-end #x097fff00) - - (defconstant alien-linkage-table-space-start #x0a000000) - (defconstant alien-linkage-table-space-end #x0b000000)) - -;;; While on gencgc we don't. -#+gencgc (!gencgc-space-setup #x04000000 :dynamic-space-start #x4f000000) (defconstant alien-linkage-table-entry-size #-64-bit 8 #+64-bit 24) (defconstant alien-linkage-table-growth-direction :down) -(setq *linkage-space-predefined-entries* '(#+gencgc("alloc" nil) - #+gencgc("alloc_list" nil))) - -#+(or linux netbsd) -(progn - #-gencgc - (progn - (defparameter dynamic-0-space-start #x4f000000) - (defparameter dynamic-0-space-end #x66fff000))) +(setq *linkage-space-predefined-entries* '(("alloc" nil) + ("alloc_list" nil))) + ;;;; other miscellaneous constants From 2c5664e67763fc8ca7ee27f55d3a13cbedc3861e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 8 Sep 2022 23:43:23 -0400 Subject: [PATCH 3936/4023] Define alien-linkage-table-space-size as a constant but not the -END. This works better for relocatable alien linkage space (pending commit). --- doc/internals/foreign-linkage.texinfo | 3 +-- src/code/foreign.lisp | 5 ++--- src/cold/exports.lisp | 2 +- src/compiler/generic/genesis.lisp | 3 ++- src/compiler/generic/parms.lisp | 8 ++++++-- src/compiler/generic/utils.lisp | 4 ++++ src/runtime/validate.h | 4 ++-- tools-for-build/editcore.lisp | 9 ++++----- 8 files changed, 22 insertions(+), 16 deletions(-) diff --git a/doc/internals/foreign-linkage.texinfo b/doc/internals/foreign-linkage.texinfo index 2fe72cfec7..e955054726 100644 --- a/doc/internals/foreign-linkage.texinfo +++ b/doc/internals/foreign-linkage.texinfo @@ -72,8 +72,7 @@ is used by SB-POSIX.) Find a memory area for the linkage-table, and add it for the OS in @file{src/compiler/target/parms.lisp} by defining -@code{SB-VM:ALIEN-LINKAGE-TABLE-SPACE-START} and -@code{SB-VM:ALIEN-LINKAGE-TABLE-SPACE-END}. See existing ports and CMUCL for +@code{SB-VM:ALIEN-LINKAGE-TABLE-SPACE-START}. See existing ports and CMUCL for examples. @subsubsection Porting to new architectures diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index f6314c38df..f9d6620016 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -51,8 +51,7 @@ (or (with-system-mutex ((hash-table-lock ht)) (or (gethash key ht) (let* ((index (hash-table-count ht)) - (capacity (floor (- sb-vm:alien-linkage-table-space-end - sb-vm:alien-linkage-table-space-start) + (capacity (floor sb-vm:alien-linkage-table-space-size sb-vm:alien-linkage-table-entry-size))) (when (< index capacity) (multiple-value-bind (defined real-address) (dlsym-wrapper t) @@ -161,7 +160,7 @@ symbol designates a variable. May enter the symbol into the linkage-table." (declare (ignorable addr)) (when (<= sb-vm:alien-linkage-table-space-start addr - sb-vm:alien-linkage-table-space-end) + (+ sb-vm:alien-linkage-table-space-start sb-vm:alien-linkage-table-space-size)) (let ((table-index (sb-vm::alien-linkage-table-index-from-address addr))) (dohash ((key value) (car *linkage-info*) :locked t) (when (= value table-index) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index a020eeeec0..ae2ed5ff31 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -594,7 +594,7 @@ structure representations") "STATIC-SPACE-START" "STATIC-SPACE-END" "*STATIC-SPACE-FREE-POINTER*" "STATIC-CODE-SPACE-START" "STATIC-CODE-SPACE-END" "*STATIC-CODE-SPACE-FREE-POINTER*" "ALIEN-LINKAGE-TABLE-SPACE-START" - "ALIEN-LINKAGE-TABLE-SPACE-END" + "ALIEN-LINKAGE-TABLE-SPACE-SIZE" "ALIEN-LINKAGE-TABLE-ENTRY-SIZE" #+sb-safepoint "GC-SAFEPOINT-PAGE-ADDR" #+sb-safepoint "GC-SAFEPOINT-TRAP-OFFSET" diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index cfb86ddf42..5b0db2d4bc 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2979,7 +2979,8 @@ Legal values for OFFSET are -4, -8, -12, ..." (aver (zerop (rem sb-vm:fixedobj-space-size (* 32 sb-vm:immobile-card-bytes)))) #-gencgc (check sb-vm:dynamic-0-space-start sb-vm:dynamic-0-space-end :dynamic-0) - (check sb-vm:alien-linkage-table-space-start sb-vm:alien-linkage-table-space-end :linkage-table)))) + (let ((end (+ sb-vm:alien-linkage-table-space-start sb-vm:alien-linkage-table-space-size))) + (check sb-vm:alien-linkage-table-space-start end :linkage-table))))) ;;;; emitting C header file diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index d2d064f6e0..1a055bf136 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -37,6 +37,9 @@ (* number mult)))))) #-sb-xc-host (symbol-value 'default-dynamic-space-size)) +;; By happenstance this is the same as small-space-size. +(defconstant alien-linkage-table-space-size #x100000) + #+gencgc ;; Define START/END constants for GENCGC spaces. ;; Assumptions: @@ -83,7 +86,7 @@ ((spaces (append `((read-only ,ro-space-size) #+(and win32 x86-64) (seh-data ,(symbol-value '+backend-page-bytes+) win64-seh-data-addr) - (alien-linkage-table ,small-space-size) + (alien-linkage-table ,alien-linkage-table-space-size) #+sb-safepoint ;; Must be just before NIL. (safepoint ,(symbol-value '+backend-page-bytes+) gc-safepoint-page-addr) @@ -118,7 +121,8 @@ (fixedobj (setq start (or fixedobj-space-start* start) end (+ start fixedobj-space-size*)))) `(,(defconstantish relocatable start-sym start) - ,(cond ((not relocatable) + ,(cond ((eq space 'alien-linkage-table)) ; nothing for the -END + ((not relocatable) `(defconstant ,(symbolicate space "-SPACE-END") ,end)) #-sb-xc-host ((eq space 'text)) ; don't emit anything (t diff --git a/src/compiler/generic/utils.lisp b/src/compiler/generic/utils.lisp index a122d81d45..ae1ec34d77 100644 --- a/src/compiler/generic/utils.lisp +++ b/src/compiler/generic/utils.lisp @@ -49,18 +49,22 @@ (- list-pointer-lowtag))) 0)) +(symbol-macrolet ((alien-linkage-table-space-end + (+ alien-linkage-table-space-start alien-linkage-table-space-size))) ;;; the address of the linkage table entry for table index I. (defun alien-linkage-table-entry-address (i) (ecase alien-linkage-table-growth-direction (:up (+ (* i alien-linkage-table-entry-size) alien-linkage-table-space-start)) (:down (- alien-linkage-table-space-end (* (1+ i) alien-linkage-table-entry-size))))) +#-sb-xc-host (defun alien-linkage-table-index-from-address (addr) (ecase alien-linkage-table-growth-direction (:up (floor (- addr alien-linkage-table-space-start) alien-linkage-table-entry-size)) (:down (1- (floor (- alien-linkage-table-space-end addr) alien-linkage-table-space-end))))) +) (defconstant-eqx +all-static-fdefns+ #.(concatenate 'vector +c-callable-fdefns+ +static-fdefns+) #'equalp) diff --git a/src/runtime/validate.h b/src/runtime/validate.h index fb1f78024b..28a2813db2 100644 --- a/src/runtime/validate.h +++ b/src/runtime/validate.h @@ -33,8 +33,8 @@ #define STATIC_CODE_SPACE_SIZE (STATIC_CODE_SPACE_END - STATIC_CODE_SPACE_START) #endif -#define ALIEN_LINKAGE_TABLE_SPACE_SIZE \ - (ALIEN_LINKAGE_TABLE_SPACE_END - ALIEN_LINKAGE_TABLE_SPACE_START) +#define ALIEN_LINKAGE_TABLE_SPACE_END \ + (ALIEN_LINKAGE_TABLE_SPACE_START + ALIEN_LINKAGE_TABLE_SPACE_SIZE) #if !defined(__ASSEMBLER__) #include "thread.h" diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index 65879b7798..962570847c 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -452,11 +452,10 @@ (defun make-core (spaces code-bounds fixedobj-bounds &optional enable-pie) (let* ((linkage-bounds - (make-bounds - (symbol-global-value - (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-SPACE-START" spaces :physical)) - (symbol-global-value - (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-SPACE-END" spaces :physical)))) + (let ((base (symbol-global-value + (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-SPACE-START" + spaces :physical)))) + (make-bounds base (+ base sb-vm:alien-linkage-table-space-size)))) (linkage-entry-size (symbol-global-value (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-ENTRY-SIZE" From 7d46cf757c7321ceb1911e6baf126598871866f5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 9 Sep 2022 00:31:50 -0400 Subject: [PATCH 3937/4023] Shave off a move --- src/compiler/x86-64/c-call.lisp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/compiler/x86-64/c-call.lisp b/src/compiler/x86-64/c-call.lisp index eddf9f0d4d..6e0cd9d75b 100644 --- a/src/compiler/x86-64/c-call.lisp +++ b/src/compiler/x86-64/c-call.lisp @@ -540,8 +540,9 @@ #+win32 (inst sub rsp #x20) #+win32 (inst and rsp #x-20) ;; Call - (inst mov rax (foreign-symbol-address "callback_wrapper_trampoline")) - (inst call rax) + ;; do this without MAKE-FIXUP because fixup'ing does not happen when + ;; assembling callbacks (probably could, but ...) + (inst call (ea (+ (foreign-symbol-address "callback_wrapper_trampoline") 8))) ;; Back! Restore frame (inst mov rsp rbp) (inst pop rbp)) From 09d88bdde8988df5ab6d72b08b435d01a087200b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 9 Sep 2022 01:19:26 -0400 Subject: [PATCH 3938/4023] Unmark test as failing on win32 It worked for me. And contrary to the comment, success of the build no longer depends on success of tests. --- contrib/sb-introspect/test-driver.lisp | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/contrib/sb-introspect/test-driver.lisp b/contrib/sb-introspect/test-driver.lisp index d62b5bc730..5c3fd1312d 100644 --- a/contrib/sb-introspect/test-driver.lisp +++ b/contrib/sb-introspect/test-driver.lisp @@ -380,28 +380,13 @@ (tai 42s0 :immediate nil) t) -;;; -- It appears that this test can also fail due to systematic issues -;;; (possibly with the C compiler used) which we cannot detect based on -;;; *features*. Until this issue has been fixed, I am marking this test -;;; as failing on Windows to allow installation of the contrib on -;;; affected builds, even if the underlying issue is (possibly?) not even -;;; strictly related to windows. C.f. lp1057631. --DFL -;;; (test-util:with-test (:name :allocation-information.4 ;; Ignored as per the comment above, even though it seems ;; unlikely that this is the right condition. - :fails-on (or :win32 :ppc64 (and :sparc :gencgc))) - #+gencgc + :fails-on (or :ppc64 (and :sparc :gencgc))) (tai (make-list 1) :heap `(:space :dynamic :boxed t :large nil) - :ignore (list :page :pinned :generation :write-protected)) - #-gencgc - (tai :cons :heap - ;; FIXME: Figure out what's the right cheney-result. SPARC at least - ;; has exhibited both :READ-ONLY and :DYNAMIC, which seems wrong. - '() - :ignore '(:space)) - t) + :ignore (list :page :pinned :generation :write-protected))) (setq sb-ext:*evaluator-mode* :compile) (sb-ext:defglobal *large-obj* nil) From 8968446c6f90dbea48afeecb35b69c6e03b57b5d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 9 Sep 2022 01:24:21 -0400 Subject: [PATCH 3939/4023] x86-64: relocatable alien linkage table if #+immobile-space Linkage table calls can be emitted as call rel32 without remembering fixups for reapplication if text space moves on core startup. Calls from dynamic space require one extra load to allow for alien linkage table placement at an arbitrary address. --- src/assembly/x86-64/assem-rtns.lisp | 5 +- src/assembly/x86-64/tramps.lisp | 22 ++++-- src/code/misc-aliens.lisp | 5 +- src/compiler/dump.lisp | 7 +- src/compiler/generic/genesis.lisp | 3 +- src/compiler/generic/objdef.lisp | 1 + src/compiler/generic/parms.lisp | 7 +- src/compiler/generic/target-core.lisp | 2 + src/compiler/x86-64/alloc.lisp | 6 +- src/compiler/x86-64/c-call.lisp | 45 ++++++++++-- src/compiler/x86-64/insts.lisp | 102 ++++++++++++-------------- src/compiler/x86-64/parms.lisp | 7 ++ src/compiler/x86-64/target-insts.lisp | 8 +- src/runtime/coreparse.c | 25 +++---- src/runtime/globals.c | 1 + src/runtime/globals.h | 1 + src/runtime/immobile-space.c | 8 +- src/runtime/runtime.c | 6 ++ src/runtime/thread.c | 3 + src/runtime/validate.c | 2 + tests/elfcore.test.sh | 1 + tests/gc.impure.lisp | 1 + tools-for-build/editcore.lisp | 50 +++++++++++-- 23 files changed, 212 insertions(+), 106 deletions(-) diff --git a/src/assembly/x86-64/assem-rtns.lisp b/src/assembly/x86-64/assem-rtns.lisp index 9b810e931b..76e1787ec8 100644 --- a/src/assembly/x86-64/assem-rtns.lisp +++ b/src/assembly/x86-64/assem-rtns.lisp @@ -377,12 +377,13 @@ #+sb-assembling (defun ensure-thread-base-tn-loaded () #-sb-thread - (progn + (let ((fixup (make-fixup "all_threads" :foreign-dataref))) ;; Load THREAD-BASE-TN from the all_threads. Does not need to be spilled ;; to stack, because we do do not give the register allocator access to it. ;; And call_into_lisp saves it as per convention, not that it matters, ;; because there's no way to get back into C code anyhow. - (inst mov thread-tn (ea (make-fixup "all_threads" :foreign-dataref))) + #-immobile-space (inst mov thread-tn (ea fixup)) + #+immobile-space (inst mov thread-tn (rip-relative-ea fixup)) (inst mov thread-tn (ea thread-tn)))) ;;; Perform a store to code, updating the GC card mark bit. diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index 9a95608a2e..681df79d18 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -131,27 +131,39 @@ (define-assembly-routine (undefined-alien-tramp (:return-style :none)) () + ;; This routine computes into RBX the address of the linkage table entry that was called, + ;; corresponding to the undefined alien function. (inst push rax-tn) ; save registers in case we want to see the old values (inst push rbx-tn) ;; load RAX with the PC after the call site (inst mov rax-tn (ea 16 rsp-tn)) ;; load RBX with the signed 32-bit immediate from the call instruction (inst movsx '(:dword :qword) rbx-tn (ea -4 rax-tn)) + ;; The decoding seems scary, but it's actually not. Any C call-out instruction has + ;; a 4-byte trailing operand, with the preceding byte being unique. ;; if at [PC-5] we see #x25 then it was a call with 32-bit mem addr ;; if ... #xE8 then ... 32-bit offset - (inst cmp :byte (ea -5 rax-tn) #x25) - (inst jmp :e ABSOLUTE) - (inst cmp :byte (ea -5 rax-tn) #xE8) - (inst jmp :e RELATIVE) + ;; if ... #x92 then it was "call *DISP(%r10)" where r10 is the table base + #-immobile-space ; only non-relocatable alien linkage table can use "CALL [ABS]" form + (progn (inst cmp :byte (ea -5 rax-tn) #x25) + (inst jmp :e ABSOLUTE)) + #+immobile-space ; only relocatable alien linkage table can use "CALL rel32" form + (progn (inst cmp :byte (ea -5 rax-tn) #xE8) + (inst jmp :e RELATIVE) + (inst cmp :byte (ea -5 rax-tn) #x92) + (inst jmp :e ABSOLUTE)) ;; failing those, assume RBX was valid. ("can't happen") (inst mov rbx-tn (ea rsp-tn)) ; restore pushed value of RBX (inst jmp trap) ABSOLUTE - (inst lea rbx-tn (ea -8 rbx-tn)) + #-immobile-space (inst sub rbx-tn 8) + #+immobile-space (inst lea rbx-tn (ea -8 r10-tn rbx-tn)) (inst jmp TRAP) RELATIVE (inst add rbx-tn rax-tn) TRAP + ;; XXX: why aren't we adding something to the stack pointer to balance the two pushes? + ;; (I guess we can only THROW at this point, so it doesn't matter) (error-call nil 'undefined-alien-fun-error rbx-tn)) ;;; the closure trampoline - entered when a global function is a closure diff --git a/src/code/misc-aliens.lisp b/src/code/misc-aliens.lisp index b43f2edbd2..140a7f2696 100644 --- a/src/code/misc-aliens.lisp +++ b/src/code/misc-aliens.lisp @@ -34,7 +34,10 @@ (* (extern-alien "next_free_page" signed) sb-vm:gencgc-page-bytes)))) #+immobile-space -(define-alien-variable ("TEXT_SPACE_START" sb-vm:text-space-start) unsigned-long) +(progn +(define-symbol-macro sb-vm:alien-linkage-table-space-start + (extern-alien "ALIEN_LINKAGE_TABLE_SPACE_START" unsigned)) +(define-alien-variable ("TEXT_SPACE_START" sb-vm:text-space-start) unsigned-long)) #+darwin-jit (define-alien-variable ("static_code_space_free_pointer" sb-vm:*static-code-space-free-pointer*) diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 57cd86fc46..a51029f6ef 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1035,7 +1035,9 @@ (defconstant-eqx +fixup-flavors+ #(:assembly-routine :assembly-routine* :asm-routine-nil-offset :gc-barrier :symbol-tls-index - :foreign :foreign-dataref :code-object + :alien-code-linkage-index :alien-data-linkage-index + :foreign :foreign-dataref + :code-object :layout :immobile-symbol :fdefn-call :static-call :symbol-value :layout-id) @@ -1118,7 +1120,8 @@ ;; but its global value must be an immobile object. :immobile-symbol :symbol-value) (the symbol name)) - ((:foreign :foreign-dataref) (the string name)) + ((:alien-code-linkage-index :alien-data-linkage-index + :foreign :foreign-dataref) (the string name)) ((:fdefn-call :static-call) name)))) (dump-object info fasl-output) (incf nelements (cond (named (dump-object operand fasl-output) 2) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 5b0db2d4bc..0392408d16 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2961,7 +2961,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (when (= start end) ; 0 size is allowed (return-from check)) (unless (< start end) - (error "Bogus space: ~A" space)) + (error "Space bounds look bad: ~A = ~X..~X" space start end)) (let ((type (specifier-type `(integer ,start (,end))))) (dolist (other types) (unless (eq *empty-type* (type-intersection (cdr other) type)) @@ -2979,6 +2979,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (aver (zerop (rem sb-vm:fixedobj-space-size (* 32 sb-vm:immobile-card-bytes)))) #-gencgc (check sb-vm:dynamic-0-space-start sb-vm:dynamic-0-space-end :dynamic-0) + #-immobile-space (let ((end (+ sb-vm:alien-linkage-table-space-start sb-vm:alien-linkage-table-space-size))) (check sb-vm:alien-linkage-table-space-start end :linkage-table))))) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index 65764374ff..e8c37f5f84 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -462,6 +462,7 @@ during backtrace. (defglobal *thread-header-slot-names* (append #+x86-64 '(t-nil-constants + alien-linkage-table-base msan-xor-constant ;; The following slot's existence must NOT be conditional on #+msan msan-param-tls) ; = &__msan_param_tls diff --git a/src/compiler/generic/parms.lisp b/src/compiler/generic/parms.lisp index 1a055bf136..4f62af8285 100644 --- a/src/compiler/generic/parms.lisp +++ b/src/compiler/generic/parms.lisp @@ -86,7 +86,7 @@ ((spaces (append `((read-only ,ro-space-size) #+(and win32 x86-64) (seh-data ,(symbol-value '+backend-page-bytes+) win64-seh-data-addr) - (alien-linkage-table ,alien-linkage-table-space-size) + #-immobile-space (alien-linkage-table ,alien-linkage-table-space-size) #+sb-safepoint ;; Must be just before NIL. (safepoint ,(symbol-value '+backend-page-bytes+) gc-safepoint-page-addr) @@ -95,6 +95,7 @@ (static-code ,small-space-size)) #+immobile-space `((fixedobj ,fixedobj-space-size*) + (alien-linkage-table ,alien-linkage-table-space-size) (text ,text-space-size*)))) (ptr small-spaces-start) (small-space-forms @@ -102,10 +103,8 @@ appending (let* ((relocatable ;; READONLY is usually movable now. - ;; TODO: alien-linkage-table could move with code, if the CPU - ;; prefers PC-relative jumps, and we emit better code - ;; (which we don't- for x86 we jmp via RBX always) (member space '(fixedobj text + #+immobile-space alien-linkage-table #-darwin-jit read-only))) (start ptr) (end (+ ptr size))) diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index 888f04671e..d2c2e1655a 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -86,6 +86,8 @@ (- (or (get-asm-routine name (eq flavor :assembly-routine*)) (error "undefined assembler routine: ~S" name)) (if (eq flavor :asm-routine-nil-offset) sb-vm:nil-value 0))) + (:alien-code-linkage-index (sb-impl::ensure-alien-linkage-index name nil)) + (:alien-data-linkage-index (sb-impl::ensure-alien-linkage-index name t)) (:foreign (foreign-symbol-address name)) (:foreign-dataref (foreign-symbol-address name t)) (:code-object (get-lisp-obj-address real-code-obj)) diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index ef48edc7f8..d6ced18ac1 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -1044,9 +1044,9 @@ (:temporary (:sc unsigned-reg) header) (:generator 1 ;; fixedobj_pages linkage entry: 1 PTE per page, 12-byte struct - (inst mov rbx (ea (make-fixup "fixedobj_pages" :foreign-dataref))) + (inst mov rbx (rip-relative-ea (make-fixup "fixedobj_pages" :foreign-dataref))) ;; fixedobj_page_hint: 1 hint per sizeclass. C type = uint32_t - (inst mov rax (ea (make-fixup "fixedobj_page_hint" :foreign-dataref))) + (inst mov rax (rip-relative-ea (make-fixup "fixedobj_page_hint" :foreign-dataref))) (inst mov rbx (ea rbx)) ; get the base of the fixedobj_pages array ;; This has to be pseudoatomic as soon as the page hint is loaded. ;; Consider the situation where there is exactly one symbol on a page that @@ -1063,7 +1063,7 @@ (inst jmp :z FAIL) ; fail if hint page is 0 (inst lea rbx (ea rbx rax 8)) ; rbx := &fixedobj_pages[hint].free_index ;; compute fixedobj_page_address(hint) into RAX - (inst mov rcx (ea (make-fixup "FIXEDOBJ_SPACE_START" :foreign-dataref))) + (inst mov rcx (rip-relative-ea (make-fixup "FIXEDOBJ_SPACE_START" :foreign-dataref))) (inst shl rax (integer-length (1- immobile-card-bytes))) (inst add rax (ea rcx)) ;; load the page's free pointer diff --git a/src/compiler/x86-64/c-call.lisp b/src/compiler/x86-64/c-call.lisp index 6e0cd9d75b..18f17dd69f 100644 --- a/src/compiler/x86-64/c-call.lisp +++ b/src/compiler/x86-64/c-call.lisp @@ -223,6 +223,9 @@ (16 (sign-extend x size)) (32 (sign-extend x size)))) +;;; Note that if jumping _to_ the linkage entry, the jump is to the JMP instruction +;;; at entry + 0, but if jumping _via_ the linkage index, we can jump to [entry+8] +;;; which holds the ultimate address to jump to. (define-vop (foreign-symbol-sap) (:translate foreign-symbol-sap) (:policy :fast-safe) @@ -231,8 +234,16 @@ (:info foreign-symbol) (:results (res :scs (sap-reg))) (:result-types system-area-pointer) + (:vop-var vop) (:generator 2 - (inst mov res (make-fixup foreign-symbol :foreign)))) + #-immobile-space ; non-relocatable alien linkage table + (inst mov res (make-fixup foreign-symbol :foreign)) + #+immobile-space ; relocatable alien linkage table + (cond ((sb-c::code-immobile-p vop) + (inst lea res (rip-relative-ea (make-fixup foreign-symbol :foreign)))) + (t + (inst mov res (thread-slot-ea thread-alien-linkage-table-base-slot)) + (inst lea res (ea (make-fixup foreign-symbol :alien-code-linkage-index) res)))))) (define-vop (foreign-symbol-dataref-sap) (:translate foreign-symbol-dataref-sap) @@ -242,8 +253,16 @@ (:info foreign-symbol) (:results (res :scs (sap-reg))) (:result-types system-area-pointer) + (:vop-var vop) (:generator 2 - (inst mov res (ea (make-fixup foreign-symbol :foreign-dataref))))) + #-immobile-space ; non-relocatable alien linkage table + (inst mov res (ea (make-fixup foreign-symbol :foreign-dataref))) + #+immobile-space ; relocatable alien linkage table + (cond ((sb-c::code-immobile-p vop) + (inst mov res (rip-relative-ea (make-fixup foreign-symbol :foreign-dataref)))) + (t + (inst mov res (thread-slot-ea thread-alien-linkage-table-base-slot)) + (inst mov res (ea (make-fixup foreign-symbol :alien-data-linkage-index) res)))))) #+sb-safepoint (defconstant thread-saved-csp-offset (- (1+ sb-vm::thread-header-slots))) @@ -364,11 +383,23 @@ ;; table jump, and from dynamic space we use "CALL [ea]" format ;; where ea is the address of the linkage table entry's operand. ;; So while the former is a jump to a jump, we can optimize out - ;; one jump in a statically linked executable. + ;; one jump in an ELF executable. + ;; N.B.: if you change how the call is emitted, you will also have to adjust + ;; the UNDEFINED-ALIEN-TRAMP lisp asm routine to recognize the various shapes + ;; this instruction sequence can take. #-win32 - (inst call (cond ((tn-p fun) fun) - ((sb-c::code-immobile-p vop) (make-fixup fun :foreign)) - (t (ea (make-fixup fun :foreign 8))))) + (inst call (if (tn-p fun) + fun + #-immobile-space (ea (make-fixup fun :foreign 8)) + #+immobile-space + (cond ((sb-c::code-immobile-p vop) (make-fixup fun :foreign)) + (t + ;; Pick r10 as the lowest unused clobberable register. + ;; RAX has a designated purpose, and RBX is nonvolatile (not always + ;; spilled by Lisp because a C function has to save it if used) + (inst mov r10-tn (thread-slot-ea thread-alien-linkage-table-base-slot)) + (ea (make-fixup fun :alien-code-linkage-index 8) r10-tn))))) + ;; On win64, we don't support immobile space (yet) and calls go through one of ;; the thunks defined in set_up_win64_seh_data(). If the linkage table is ;; involved, RBX either points to a linkage table trampoline or to the linkage @@ -540,8 +571,10 @@ #+win32 (inst sub rsp #x20) #+win32 (inst and rsp #x-20) ;; Call + #+immobile-space (inst call (static-symbol-value-ea 'callback-wrapper-trampoline)) ;; do this without MAKE-FIXUP because fixup'ing does not happen when ;; assembling callbacks (probably could, but ...) + #-immobile-space (inst call (ea (+ (foreign-symbol-address "callback_wrapper_trampoline") 8))) ;; Back! Restore frame (inst mov rsp rbp) diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index 6999ce830a..3b1185da3f 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -3327,65 +3327,59 @@ (defun fixup-code-object (code offset value kind flavor) (declare (type index offset)) (let ((sap (code-instructions code))) - (when (eq flavor :gc-barrier) - ;; the VALUE is nbits, so convert it to an AND mask - (setf (sap-ref-32 sap offset) (1- (ash 1 value))) - (return-from fixup-code-object)) - ;; All x86-64 fixup locations contain an implicit addend at the location - ;; to be fixed up. The addend is always zero for certain <KIND,FLAVOR> pairs, - ;; but we don't need to assert that. - (incf value (if (eq kind :absolute) - (signed-sap-ref-64 sap offset) - (signed-sap-ref-32 sap offset))) - (ecase kind - (:abs32 ; 32 bits. most are unsigned, except :layout-id which is signed - (if (eq flavor :layout-id) - (setf (signed-sap-ref-32 sap offset) value) - (setf (sap-ref-32 sap offset) value))) - (:rel32 - ;; Replace word with the difference between VALUE and current pc. - ;; JMP/CALL are relative to the next instruction, - ;; so add 4 bytes for the size of the displacement itself. - ;; Relative fixups don't exist with movable code, - ;; so in the #-immobile-code case, there's nothing to assert. - #+(and immobile-code (not sb-xc-host)) - (unless (immobile-space-obj-p code) - (error "Can't compute fixup relative to movable object ~S" code)) - (setf (signed-sap-ref-32 sap offset) (- value (+ (sap-int sap) offset 4)))) - (:absolute - ;; These are used for jump tables and are not recorded in %code-fixups. - ;; GC knows to adjust the values if code is moved. - (setf (sap-ref-64 sap offset) value)))) + (case flavor + (:gc-barrier ; the VALUE is nbits, so convert it to an AND mask + (setf (sap-ref-32 sap offset) (1- (ash 1 value)))) + (:layout-id ; layout IDs are signed quantities on x86-64 + (setf (signed-sap-ref-32 sap offset) value)) + (:alien-data-linkage-index + (setf (sap-ref-32 sap offset) (* value alien-linkage-table-entry-size))) + (:alien-code-linkage-index + (let ((addend (sap-ref-32 sap offset))) + (setf (sap-ref-32 sap offset) (+ (* value alien-linkage-table-entry-size) addend)))) + (t + ;; All x86-64 fixup locations contain an implicit addend at the location + ;; to be fixed up. The addend is always zero for certain <KIND,FLAVOR> pairs, + ;; but we don't need to assert that. + (incf value (if (eq kind :absolute) + (signed-sap-ref-64 sap offset) + (signed-sap-ref-32 sap offset))) + (ecase kind + (:abs32 ; 32 unsigned bits + (setf (sap-ref-32 sap offset) value)) + (:rel32 + ;; Replace word with the difference between VALUE and current pc. + ;; JMP/CALL are relative to the next instruction, + ;; so add 4 bytes for the size of the displacement itself. + ;; Relative fixups don't exist with movable code, + ;; so in the #-immobile-code case, there's nothing to assert. + #+(and immobile-code (not sb-xc-host)) + (unless (immobile-space-obj-p code) + (error "Can't compute fixup relative to movable object ~S" code)) + (setf (signed-sap-ref-32 sap offset) (- value (+ (sap-int sap) offset 4)))) + (:absolute + ;; These are used for jump tables and are not recorded in %code-fixups. + ;; GC knows to adjust the values if code is moved. + (setf (sap-ref-64 sap offset) value)))))) nil) -(defun sb-c::pack-retained-fixups (fixup-notes) - (let (abs32-fixups rel32-fixups imm-fixups) +(defun sb-c::pack-retained-fixups (fixup-notes &aux abs32-fixups imm-fixups) ;; An absolute fixup is stored in the code header's %FIXUPS slot if it ;; references an immobile-space (but not static-space) object. ;; Note that: - ;; (1) Call fixups occur in both :REL32 and :ABS32 kinds. - ;; We can ignore the :REL32 kind, except for foreign call, - ;; as those point to the linkage table which has an absolute address - ;; and therefore might change in displacement from the call site - ;; if the immobile code space is relocated on startup. - ;; (2) :STATIC-CALL fixups point to immobile space, not static space. - (dolist (note fixup-notes (sb-c:pack-code-fixup-locs abs32-fixups rel32-fixups imm-fixups)) - (let* ((fixup (fixup-note-fixup note)) - (offset (fixup-note-position note)) - (kind (fixup-note-kind note)) - (flavor (fixup-flavor fixup))) - (cond ((eq flavor :gc-barrier) (push offset imm-fixups)) - ((and (memq flavor - '(:fdefn-call :layout :immobile-symbol :symbol-value ; -> fixedobj subspace - :assembly-routine :assembly-routine* :static-call)) ; -> text subspace - (eq kind :abs32)) - #+immobile-space (push offset abs32-fixups)) - ((and (eq flavor :foreign) (eq kind :rel32)) - ;; linkage-table calls using the "CALL rel32" format need to be saved, - ;; because the linkage table resides at a fixed address. - ;; Space defragmentation can handle the fixup automatically, - ;; but core relocation can't - it can't find all the call sites. - #+immobile-space (push offset rel32-fixups))))))) + ;; (1) Call fixups occur in both :REL32 and :ABS32 kinds. We can ignore the :REL32 kind. + ;; (2) :STATIC-CALL fixups point to immobile text space, not static space. + (dolist (note fixup-notes (sb-c:pack-code-fixup-locs abs32-fixups nil imm-fixups)) + (let* ((fixup (fixup-note-fixup note)) + (offset (fixup-note-position note)) + (flavor (fixup-flavor fixup))) + (cond ((eq flavor :gc-barrier) (push offset imm-fixups)) + #+immobile-space + ((and (eq (fixup-note-kind note) :abs32) + (memq flavor + '(:fdefn-call :layout :immobile-symbol :symbol-value ; -> fixedobj space + :assembly-routine :assembly-routine* :static-call))) ; -> text space + (push offset abs32-fixups)))))) ;;; Coverage support diff --git a/src/compiler/x86-64/parms.lisp b/src/compiler/x86-64/parms.lisp index c4a2569ce5..3641be229e 100644 --- a/src/compiler/x86-64/parms.lisp +++ b/src/compiler/x86-64/parms.lisp @@ -156,6 +156,13 @@ ;; interrupt handling #-sb-thread *pseudo-atomic-bits* ; ditto #-sb-thread *binding-stack-pointer* ; ditto + ;; Since the text space and alien linkage table might both get relocated on startup + ;; under #+immobile-space, an alien callback wrapper can't wire in the address + ;; of a word that holds the C function pointer to callback_wrapper_trampoline. + ;; (There is no register that points to a known address when entering the callback) + ;; A static symbol works well for this, and is sensible considering that + ;; the assembled wrappers also reside in static space. + #+(and sb-thread immobile-space) callback-wrapper-trampoline *cpu-feature-bits*) #'equalp) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index 8a139c0e6f..f5bb2f31a5 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -602,6 +602,7 @@ (jmp-inst (find-inst #xE9 inst-space)) (cond-jmp-inst (find-inst #x800f inst-space)) (lea-inst (find-inst #x8D inst-space)) + (mov-inst (find-inst #x8B inst-space)) (address (get-lisp-obj-address code)) (text-start (sap-int (code-instructions code))) (text-end (+ text-start (%code-text-size code))) @@ -610,7 +611,7 @@ (seg-length segment) length (seg-sap-maker segment) (lambda () sap)) (map-segment-instructions - (lambda (dchunk inst) + (lambda (dchunk inst &aux (opcode (sap-ref-8 sap (dstate-cur-offs dstate)))) (flet ((includep (target) ;; Self-relative (to the code object) operands are ignored. (and (or (< target address) (>= target text-end)) @@ -629,10 +630,11 @@ (when (includep operand) (funcall function (+ (dstate-cur-offs dstate) 2) operand inst)))) - ((eq inst lea-inst) + ((or (eq inst lea-inst) + (and (eq inst mov-inst) (eql opcode #x8B))) ;; Computing the address of UNDEFINED-FDEFN and ;; FUNCALLABLE-INSTANCE-TRAMP is done with LEA. - (aver (eql (sap-ref-8 sap (dstate-cur-offs dstate)) #x8D)) + ;; Load from the alien linkage table can be done with MOV Rnn,[RIP-k]. (let ((modrm (sap-ref-8 sap (1+ (dstate-cur-offs dstate))))) (when (= (logand modrm #b11000111) #b00000101) ; RIP-relative mode (let ((operand (+ (signed-sap-ref-32 diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index cafd59b87a..98762487af 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -741,17 +741,11 @@ process_directory(int count, struct ndir_entry *entry, (uword_t)&lisp_code_start, (uword_t)&lisp_code_end, text_space_highwatermark); #endif + ALIEN_LINKAGE_TABLE_SPACE_START = (uword_t) + os_validate(0, 0, ALIEN_LINKAGE_TABLE_SPACE_SIZE, ALIEN_LINKAGE_TABLE_CORE_SPACE_ID); // Prefill the alien linkage table so that shrinkwrapped executables which link in - // all their C library dependencies can avoid linking with -ldl. - // All data references are potentially needed because aliencomp doesn't emit - // SAP-REF-n in a way that admits elision of the linkage entry. e.g. - // MOV RAX, [#x20200AA0] ; some_c_symbol - // MOV RAX, [RAX] - // might be rendered as - // MOV RAX, some_c_symbol(%rip) - // but that's more of a change to the asm instructions than I'm comfortable making; - // whereas "CALL linkage_entry_for_f" -> "CALL f" is quite straightforward. - // (Rarely would a jmp indirection be used; maybe for newly compiled code?) + // all their C library dependencies can avoid linking with -ldl + // but extern-alien stil works for newly compiled code. lispobj* ptr = &alien_linkage_values; gc_assert(ptr); int entry_index = 0; @@ -771,7 +765,8 @@ process_directory(int count, struct ndir_entry *entry, #endif #ifdef LISP_FEATURE_IMMOBILE_SPACE { - spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].desired_size += TEXT_SPACE_SIZE; + spaces[IMMOBILE_FIXEDOBJ_CORE_SPACE_ID].desired_size += + TEXT_SPACE_SIZE + ALIEN_LINKAGE_TABLE_SPACE_SIZE; } #endif @@ -824,10 +819,12 @@ process_directory(int count, struct ndir_entry *entry, int sub_2gb_flag = (request & 1); request &= ~(size_t)1; #ifdef LISP_FEATURE_IMMOBILE_SPACE - if (id == IMMOBILE_TEXT_CORE_SPACE_ID) + if (id == IMMOBILE_TEXT_CORE_SPACE_ID) { // Pretend an os_validate() happened based on the address that - // would be obtained by a constant offset from fixedobj space - addr = FIXEDOBJ_SPACE_START + FIXEDOBJ_SPACE_SIZE; + // would be obtained by a constant offset from fixedobj space. + ALIEN_LINKAGE_TABLE_SPACE_START = FIXEDOBJ_SPACE_START + FIXEDOBJ_SPACE_SIZE; + addr = ALIEN_LINKAGE_TABLE_SPACE_START + ALIEN_LINKAGE_TABLE_SPACE_SIZE; + } else #endif if (request) { diff --git a/src/runtime/globals.c b/src/runtime/globals.c index ff4f06e380..a76ec58870 100644 --- a/src/runtime/globals.c +++ b/src/runtime/globals.c @@ -60,6 +60,7 @@ lispobj *static_code_space_free_pointer; #ifdef LISP_FEATURE_IMMOBILE_SPACE lispobj *text_space_highwatermark; lispobj *fixedobj_free_pointer; +lispobj ALIEN_LINKAGE_TABLE_SPACE_START; #endif os_vm_address_t anon_dynamic_space_start; // The end of immobile text mapped from disk, equivalently the starting address diff --git a/src/runtime/globals.h b/src/runtime/globals.h index 051cff3b28..88d9410d69 100644 --- a/src/runtime/globals.h +++ b/src/runtime/globals.h @@ -101,6 +101,7 @@ extern lispobj *static_code_space_free_pointer; #ifdef LISP_FEATURE_IMMOBILE_SPACE extern lispobj *text_space_highwatermark; extern lispobj *fixedobj_free_pointer; +extern lispobj ALIEN_LINKAGE_TABLE_SPACE_START; #endif extern os_vm_address_t anon_dynamic_space_start; extern lispobj* tlsf_mem_start; // meaningful only if immobile space diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index a0c63960b0..c2b486be96 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -2075,9 +2075,11 @@ static void apply_absolute_fixups(lispobj fixups, struct code* code) UNALIGNED_STORE32(fixup_where, fixed); continue; } - if (asm_routines_start <= ptr && ptr < asm_routines_end) { - // Call to asm routine using "CALL [#xNNNN]" form. - // This fixup is only for whole-heap relocation on startup. + // Call to asm routine or linkage table entry using "CALL [#xNNNN]" form. + // This fixup is only for whole-heap relocation on startup. + if (((lispobj)ALIEN_LINKAGE_TABLE_SPACE_START <= ptr && + ptr < TEXT_SPACE_START) + || (asm_routines_start <= ptr && ptr < asm_routines_end)) { continue; } #ifdef LISP_FEATURE_METASPACE diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index c69c856635..687bf23cfb 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -741,6 +741,12 @@ initialize_lisp(int argc, char *argv[], char *envp[]) os_link_runtime(); #ifdef LISP_FEATURE_IMMOBILE_SPACE +#ifdef CALLBACK_WRAPPER_TRAMPOLINE // not defined if #-sb-thread + // Assign the static lisp symbol's value the address of the C function + // of the same name. Needed when alien linkage table is relocatable. + extern void callback_wrapper_trampoline(); + SYMBOL(CALLBACK_WRAPPER_TRAMPOLINE)->value = (lispobj)callback_wrapper_trampoline; +#endif /* Delayed until after dynamic space has been mapped, fixups made, * and/or immobile-space linkage entries written, * since it was too soon earlier to handle write faults. */ diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 42c0a6a6f1..40a969c1c4 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -917,6 +917,9 @@ alloc_thread_struct(void* spaces) { #ifdef THREAD_T_NIL_CONSTANTS_SLOT tls[THREAD_T_NIL_CONSTANTS_SLOT] = (NIL << 32) | T; #endif +#ifdef THREAD_ALIEN_LINKAGE_TABLE_BASE_SLOT + tls[THREAD_ALIEN_LINKAGE_TABLE_BASE_SLOT] = (lispobj)ALIEN_LINKAGE_TABLE_SPACE_START; +#endif #if defined LISP_FEATURE_X86_64 && defined LISP_FEATURE_LINUX tls[THREAD_MSAN_XOR_CONSTANT_SLOT] = 0x500000000000; #endif diff --git a/src/runtime/validate.c b/src/runtime/validate.c index 8bc7db7f27..ebd9a3f595 100644 --- a/src/runtime/validate.c +++ b/src/runtime/validate.c @@ -88,7 +88,9 @@ boolean allocate_hardwired_spaces(boolean hard_failp) int id; } preinit_spaces[] = { { READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE, READ_ONLY_CORE_SPACE_ID }, +#ifndef LISP_FEATURE_IMMOBILE_SPACE { ALIEN_LINKAGE_TABLE_SPACE_START, ALIEN_LINKAGE_TABLE_SPACE_SIZE, ALIEN_LINKAGE_TABLE_CORE_SPACE_ID }, +#endif { STATIC_SPACE_START, STATIC_SPACE_SIZE, STATIC_CORE_SPACE_ID }, #ifdef LISP_FEATURE_DARWIN_JIT { STATIC_CODE_SPACE_START, STATIC_CODE_SPACE_SIZE, STATIC_CODE_CORE_SPACE_ID }, diff --git a/tests/elfcore.test.sh b/tests/elfcore.test.sh index e5f6a423fe..b194d8c364 100755 --- a/tests/elfcore.test.sh +++ b/tests/elfcore.test.sh @@ -46,6 +46,7 @@ run_sbcl <<EOF EOF $SBCL_PWD/../src/runtime/shrinkwrap-sbcl --disable-debugger --no-sysinit --no-userinit --noprint <<EOF +(sb-vm::make-immobile-symbol "junk") ; crashed 'cause I forgot to use rip-relative-EA ;; I think this tests immobile space exhaustion (dotimes (i 100000) (sb-vm::alloc-immobile-fdefn)) diff --git a/tests/gc.impure.lisp b/tests/gc.impure.lisp index 0c65805dda..007990427d 100644 --- a/tests/gc.impure.lisp +++ b/tests/gc.impure.lisp @@ -273,6 +273,7 @@ (assert (not (sb-kernel:immobile-space-addr-p (+ sb-vm:fixedobj-space-start sb-vm:fixedobj-space-size + sb-vm:alien-linkage-table-space-size sb-vm:text-space-size))))) (with-test (:name :unique-code-serialno :skipped-on :interpreter) diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index 962570847c..c085e4a0a9 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -449,13 +449,13 @@ (defconstant inst-jmp (find-inst #b11101001 (get-inst-space))) (defconstant inst-jmpz (find-inst #x840f (get-inst-space))) (defconstant inst-pop (find-inst #x5d (get-inst-space))) +(defconstant inst-mov (find-inst #x8B (get-inst-space))) +(defconstant inst-lea (find-inst #x8D (get-inst-space))) (defun make-core (spaces code-bounds fixedobj-bounds &optional enable-pie) (let* ((linkage-bounds - (let ((base (symbol-global-value - (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-SPACE-START" - spaces :physical)))) - (make-bounds base (+ base sb-vm:alien-linkage-table-space-size)))) + (let ((text (space-addr (get-space immobile-text-core-space-id spaces)))) + (make-bounds (- text sb-vm:alien-linkage-table-space-size) text))) (linkage-entry-size (symbol-global-value (find-target-symbol (package-id "SB-VM") "ALIEN-LINKAGE-TABLE-ENTRY-SIZE" @@ -629,6 +629,23 @@ (when (in-bounds-p target-addr (core-linkage-bounds core)) (push (list* (dstate-cur-offs dstate) 6 "je" target-addr) list)))) + ((and (or (and (eq inst inst-mov) + (eql (sap-ref-8 sap (dstate-cur-offs dstate)) #x8B)) + (eq inst inst-lea)) + (let ((modrm (sap-ref-8 sap (1+ (dstate-cur-offs dstate))))) + (= (logand modrm #b11000111) #b00000101)) ; RIP-relative mode + (in-bounds-p (+ (signed-sap-ref-32 sap (+ (dstate-cur-offs dstate) 2)) + (dstate-next-addr dstate)) + (core-linkage-bounds core))) + (let* ((abs-addr (+ (signed-sap-ref-32 sap (+ (dstate-cur-offs dstate) 2)) + (dstate-next-addr dstate))) + (reg (logior (ldb (byte 3 3) (sap-ref-8 sap (1+ (dstate-cur-offs dstate)))) + (if (logtest (sb-disassem::dstate-inst-properties dstate) + #b0100) ; REX.r + 8 0))) + (op (if (eq inst inst-lea) "lea" "mov-gotpcrel")) + (args (list abs-addr (reg-name (get-gpr :qword reg))))) + (push (list* (1- (dstate-cur-offs dstate)) 7 op args) list))) ((and (eq inst inst-pop) (eq (logand dchunk #xFF) #x5D)) (push (list* (dstate-cur-offs dstate) 1 "pop" "%rbp") list)))) seg @@ -738,6 +755,20 @@ (format stream " ~A ~:[0x~X~;~a~:[~;@PLT~]~]~%" opcode (stringp operand) operand (core-enable-pie core))) + ((string= opcode "mov-gotpcrel") + (let* ((entry-index + (/ (- (car operand) (bounds-low (core-linkage-bounds core))) + (core-linkage-entry-size core))) + (c-symbol (car (aref (core-linkage-symbols core) entry-index)))) + (setf (bit (core-linkage-symbol-usedp core) entry-index) 1) + (format stream " mov ~A@GOTPCREL(%rip), %~(~A~)~%" c-symbol (cadr operand)))) + ((string= opcode "lea") ; lea becomes "mov" with gotpcrel as src, which becomes lea + (let* ((entry-index + (/ (- (car operand) (bounds-low (core-linkage-bounds core))) + (core-linkage-entry-size core))) + (c-symbol (aref (core-linkage-symbols core) entry-index))) + (setf (bit (core-linkage-symbol-usedp core) entry-index) 1) + (format stream " mov ~A@GOTPCREL(%rip), %~(~A~)~%" c-symbol (cadr operand)))) ((string= opcode "pop") (format stream " ~A ~A~%" opcode operand) (cond ((string= operand "8(%rbp)") @@ -1782,6 +1813,12 @@ (if enable-pie +code-space-nominal-address+ 0)) (write-sequence core-header output) ; Copy prepared header (force-output output) + ;; os_link_runtime() doesn't need to process the "required" symbols now + (let* ((sym (find-target-symbol (package-id "SB-VM") + "+REQUIRED-FOREIGN-SYMBOLS+" map :physical)) + (vector (translate (symbol-global-value sym) map))) + (fill vector 0) + (setf (%array-fill-pointer vector) 0)) ;; Change SB-C::*COMPILE-FILE-TO-MEMORY-SPACE* to :DYNAMIC ;; and SB-C::*COMPILE-TO-MEMORY-SPACE* to :AUTO ;; in case the resulting executable needs to compile anything. @@ -1803,8 +1840,7 @@ (format t "Copying ~d bytes (#x~x) from ptes = ~d PTEs~%" pte-nbytes pte-nbytes (floor pte-nbytes 10))) (copy-bytes input output pte-nbytes)) ; Copy PTEs from input - (let ((core (write-assembler-text map asm-file enable-pie)) - (emit-all-c-symbols t)) + (let ((core (write-assembler-text map asm-file enable-pie))) (format asm-file " .section .rodata~% .p2align 4~%lisp_fixups:~%") ;; Sort the hash-table in emit order. (dolist (x (sort (%hash-table-alist (core-new-fixups core)) #'< :key #'cdr)) @@ -1819,8 +1855,6 @@ ;; -1 (not a plausible function address) signifies that word ;; following it is a data, not text, reference. (loop for s across (core-linkage-symbols core) - for bit across (core-linkage-symbol-usedp core) - when (or emit-all-c-symbols (eql bit 0)) do (format asm-file " .quad ~:[~;-1, ~]~a~%" (consp s) (if (consp s) (car s) s)))))) From 46027ac669f3ebe46931095d51e3634475447cad Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 9 Sep 2022 23:36:00 +0300 Subject: [PATCH 3940/4023] arm64: implement keywordp using a VOP. When the value is known to be a symbol NON-NULL-SYMBOL-P will still be testing for NIL. --- src/compiler/arm64/cell.lisp | 5 +++-- src/compiler/arm64/type-vops.lisp | 25 +++++++++++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/compiler/arm64/cell.lisp b/src/compiler/arm64/cell.lisp index 6f9ca8a505..feb0e0c520 100644 --- a/src/compiler/arm64/cell.lisp +++ b/src/compiler/arm64/cell.lisp @@ -228,8 +228,9 @@ (:result-types positive-fixnum) (:translate sb-impl::symbol-package-id) (:policy :fast-safe) - (:generator 1 ; ASSUMPTION: symbol-package-bits = 16 - (inst ldrh result (@ symbol (+ (ash symbol-name-slot word-shift) + (:generator 1 + #.(assert (= sb-impl::package-id-bits 16)) + (inst ldrh result (@ symbol (+ (ash symbol-name-slot word-shift) (- other-pointer-lowtag) 6))))) ; little-endian (define-vop () diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp index 74ea9d9944..fdbbe2f833 100644 --- a/src/compiler/arm64/type-vops.lisp +++ b/src/compiler/arm64/type-vops.lisp @@ -537,12 +537,10 @@ (define-vop (symbolp type-predicate) (:translate symbolp) (:generator 12 - (let* ((drop-thru (gen-label)) - (is-symbol-label (if not-p drop-thru target))) - (inst cmp value null-tn) - (inst b :eq is-symbol-label) - (test-type value temp target not-p (symbol-widetag)) - (emit-label drop-thru)))) + (inst cmp value null-tn) + (inst b :eq (if not-p drop-thru target)) + (test-type value temp target not-p (symbol-widetag)) + drop-thru)) (define-vop (consp type-predicate) (:translate consp) @@ -718,3 +716,18 @@ not-p) :ne :eq) target) done)) + +(define-vop (keywordp type-predicate) + (:translate keywordp) + (:args-var args-ref) + (:generator 3 + #.(assert (= sb-impl::package-id-bits 16)) + (unless (csubtypep (tn-ref-type args-ref) (specifier-type 'symbol)) + (test-type value temp (if not-p target not-target) t (symbol-widetag) + :value-tn-ref args-ref)) + (inst ldrh temp (@ value (+ (ash symbol-name-slot word-shift) + (- other-pointer-lowtag) + 6))) + (inst cmp temp sb-impl::+package-id-keyword+) + (inst b (if not-p :ne :eq) target) + not-target)) From 322e7470229ae8752381e58fd4074f09a486279e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 19:12:55 -0400 Subject: [PATCH 3941/4023] x86-64: Improve disassembly notes * Negatively indexed thread slots * Alien linkage table refs using a base register --- src/code/foreign.lisp | 12 ++++--- src/compiler/generic/genesis.lisp | 2 +- src/compiler/generic/objdef.lisp | 30 ++++++++-------- src/compiler/target-disassem.lisp | 1 + src/compiler/target-dstate.lisp | 1 + src/compiler/x86-64/insts.lisp | 2 +- src/compiler/x86-64/target-insts.lisp | 49 ++++++++++++++++++++++----- tests/x86-64-codegen.impure.lisp | 21 ++++++++++++ 8 files changed, 89 insertions(+), 29 deletions(-) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index f9d6620016..67bdd612dd 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -153,6 +153,11 @@ symbol designates a variable. May enter the symbol into the linkage-table." #+os-provides-dlopen (close-shared-objects)) +(defun alien-linkage-index-to-name (index) + (dohash ((key value) (car *linkage-info*) :locked t) + (when (= value index) + (return (if (listp key) (car key) key))))) + (declaim (maybe-inline sap-foreign-symbol)) (defun sap-foreign-symbol (sap) (declare (ignorable sap)) @@ -161,10 +166,9 @@ symbol designates a variable. May enter the symbol into the linkage-table." (when (<= sb-vm:alien-linkage-table-space-start addr (+ sb-vm:alien-linkage-table-space-start sb-vm:alien-linkage-table-space-size)) - (let ((table-index (sb-vm::alien-linkage-table-index-from-address addr))) - (dohash ((key value) (car *linkage-info*) :locked t) - (when (= value table-index) - (return-from sap-foreign-symbol (if (listp key) (car key) key)))))) + (return-from sap-foreign-symbol + (alien-linkage-index-to-name + (sb-vm::alien-linkage-table-index-from-address addr)))) #+os-provides-dladdr (with-alien ((info (struct dl-info (filename c-string) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 0392408d16..85b6408dcb 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3396,7 +3396,7 @@ lispobj symbol_package(struct symbol*);~%" (genesis-header-prefix)) (string-upcase c-name) (sb-vm:primitive-object-length obj)))) (when (eq name 'sb-vm::thread) (format t "#define THREAD_HEADER_SLOTS ~d~%" sb-vm::thread-header-slots) - (dolist (x sb-vm::*thread-header-slot-names*) + (dovector (x sb-vm::+thread-header-slot-names+) (let ((s (package-symbolicate "SB-VM" "THREAD-" x "-SLOT"))) (format t "#define ~a ~d~%" (c-name (string s)) (symbol-value s)))) (terpri)) diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index e8c37f5f84..ee30978d92 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -459,24 +459,26 @@ during backtrace. ;;; These slots hold frequently-referenced constants. ;;; If we can't do that for some reason - like, say, the safepoint page ;;; is located prior to 'struct thread', then these just become ordinary slots. -(defglobal *thread-header-slot-names* - (append #+x86-64 - '(t-nil-constants - alien-linkage-table-base - msan-xor-constant - ;; The following slot's existence must NOT be conditional on #+msan - msan-param-tls) ; = &__msan_param_tls - #+immobile-space '(function-layout - text-space-addr - text-card-count - text-card-marks))) +(defconstant-eqx +thread-header-slot-names+ + `#(#+x86-64 + ,@'(t-nil-constants + alien-linkage-table-base + msan-xor-constant + ;; The following slot's existence must NOT be conditional on #+msan + msan-param-tls) ; = &__msan_param_tls + #+immobile-space + ,@'(function-layout + text-space-addr + text-card-count + text-card-marks)) + #'equalp) (macrolet ((assign-header-slot-indices () (let ((i 0)) `(progn - ,@(mapcar (lambda (x) - `(defconstant ,(symbolicate "THREAD-" x "-SLOT") ,(decf i))) - *thread-header-slot-names*))))) + ,@(map 'list (lambda (x) + `(defconstant ,(symbolicate "THREAD-" x "-SLOT") ,(decf i))) + +thread-header-slot-names+))))) (assign-header-slot-indices)) (eval-when (:compile-toplevel :load-toplevel :execute) diff --git a/src/compiler/target-disassem.lisp b/src/compiler/target-disassem.lisp index 32fe6fa33b..d0e9d7fe2a 100644 --- a/src/compiler/target-disassem.lisp +++ b/src/compiler/target-disassem.lisp @@ -424,6 +424,7 @@ (type segment segment)) (setf (dstate-segment dstate) segment) (setf (dstate-inst-properties dstate) 0) + (setf (dstate-known-register-contents dstate) nil) (setf (dstate-cur-offs-hooks dstate) (stable-sort (nreverse (copy-list (seg-hooks segment))) (lambda (oh1 oh2) diff --git a/src/compiler/target-dstate.lisp b/src/compiler/target-dstate.lisp index e4236c6c5d..0ea11eb3fd 100644 --- a/src/compiler/target-dstate.lisp +++ b/src/compiler/target-dstate.lisp @@ -98,6 +98,7 @@ :type (member :beginning :block-boundary nil)) + (known-register-contents) ;; alist of (address . label-number) (labels nil :type list) diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index 3b1185da3f..1018b59b45 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -482,7 +482,7 @@ (width :field (byte 1 0) :type 'width) (reg/mem :fields (list (byte 2 14) (byte 3 8)) :type 'reg/mem :reader regrm-inst-r/m) - (reg :field (byte 3 11) :type 'reg) + (reg :field (byte 3 11) :type 'reg :reader regrm-inst-reg) ;; optional fields (imm)) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index f5bb2f31a5..162ae279e5 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -174,7 +174,10 @@ value (inst-operand-size-default-qword dstate) t stream dstate)) (defun print-jmp-ea (value stream dstate) - (print-sized-reg/mem-default-qword value stream dstate)) + (cond ((typep value 'machine-ea) + (print-mem-ref :compute value :qword stream dstate)) + ((null stream) (operand value dstate)) + (t (write value :stream stream)))) (defun print-sized-byte-reg/mem (value stream dstate) (print-reg/mem-with-width value :byte t stream dstate)) @@ -440,7 +443,13 @@ ;; compilation to memory says it is all associated with ;; the symbol "lisp_jit_code" which is not useful. (when (plusp addr) - (or (unless (sb-kernel:immobile-space-addr-p addr) + (or (when (<= sb-vm:alien-linkage-table-space-start addr + (+ sb-vm:alien-linkage-table-space-start + (1- sb-vm:alien-linkage-table-space-size))) + (let* ((index (sb-vm::alien-linkage-table-index-from-address addr)) + (name (sb-impl::alien-linkage-index-to-name index))) + (note (lambda (s) (format s "&~A" name)) dstate))) + (unless (sb-kernel:immobile-space-addr-p addr) (maybe-note-assembler-routine addr nil dstate)) ;; Show the absolute address and maybe the contents. (note (format nil "[#x~x]~@[ = #x~x~]" @@ -449,6 +458,20 @@ (:qword (unboxed-constant-ref dstate addr disp)))) dstate)))))) + ;; Recognize "[Rbase+disp]" as an alien linkage table reference if Rbase was + ;; just loaded with the base address in the prior instruction. + (when (and (eql (machine-ea-base value) + (car (sb-disassem::dstate-known-register-contents dstate))) + (eq (cdr (sb-disassem::dstate-known-register-contents dstate)) + 'alien-linkage) + (not (machine-ea-index value)) + (integerp (machine-ea-disp value))) + (let* ((index (sb-vm::alien-linkage-table-index-from-address + (+ sb-vm:alien-linkage-table-space-start (machine-ea-disp value)))) + (name (sb-impl::alien-linkage-index-to-name index))) + (note (lambda (s) (format s "&~A" name)) dstate))) + (setf (sb-disassem::dstate-known-register-contents dstate) nil) + (flet ((guess-symbol (predicate) (binding* ((code-header (seg-code (dstate-segment dstate)) :exit-if-null) (header-n-words (code-header-words code-header))) @@ -481,14 +504,22 @@ #+gs-seg (dstate-getprop dstate +gs-segment+) #-gs-seg (not (dstate-getprop dstate +fs-segment+)) ; not system TLS (not index-reg) ; no index - (typep disp '(integer 0 *)) ; positive displacement + (typep disp '(integer -128 *)) ; valid displacement (zerop (logand disp 7))) ; lispword-aligned - (let ((index (ash disp -3))) - (when (< index (length thread-slot-names)) - (awhen (aref thread-slot-names index) - (return-from print-mem-ref - (note (lambda (stream) (format stream "thread.~(~A~)" it)) - dstate))))) + (let* ((index (ash disp -3)) + (symbol (cond ((minusp index) + (aref sb-vm::+thread-header-slot-names+ (1- (- index)))) + ((< index (length thread-slot-names)) + (aref thread-slot-names index))))) + (when symbol + (when (and (eq symbol 'sb-vm::alien-linkage-table-base) + (eql (logandc2 (sb-disassem::dstate-inst-properties dstate) +rex-r+) + (logior +rex+ +rex-w+ +rex-b+))) + (setf (sb-disassem::dstate-known-register-contents dstate) + `(,(reg-num (regrm-inst-reg dchunk-zero dstate)) . alien-linkage))) + (return-from print-mem-ref + (note (lambda (stream) (format stream "thread.~(~A~)" symbol)) + dstate)))) (let ((symbol (or (guess-symbol (lambda (s) (= (symbol-tls-index s) disp))) ;; static symbols aren't in the code header diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 782031f66e..cfc8290324 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1259,3 +1259,24 @@ (sb-pcl::%copy-cache x))))) (assert (loop for line in (disassembly-lines f) thereis (search "SYS-ALLOC-TRAMP" line)))))) + +(defun find-in-disassembly (string lambda-expression) + (let ((disassembly + (with-output-to-string (s) + (disassemble (compile nil lambda-expression) :stream s)))) + (loop for line in (split-string disassembly #\Newline) + thereis (search string line)))) + +#+immobile-space +(with-test (:name :disassemble-alien-linkage-table-ref) + (dolist (memspace '(:dynamic :immobile)) + (let ((sb-c::*compile-to-memory-space* memspace)) + (assert (find-in-disassembly + (if (eq sb-c::*compile-to-memory-space* :immobile) "lose" "&lose") + '(lambda () + (declare (optimize (sb-c::alien-funcall-saves-fp-and-pc 0))) + (alien-funcall (extern-alien "lose" (function void)))))) + (assert (find-in-disassembly + "&verify_gens" + '(lambda () + (extern-alien "verify_gens" char))))))) From 27cbf18698f587c26f013d400ef00960c184fb62 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 19:13:40 -0400 Subject: [PATCH 3942/4023] Remove obsolete function --- src/code/alieneval.lisp | 5 ----- src/cold/exports.lisp | 1 - 2 files changed, 6 deletions(-) diff --git a/src/code/alieneval.lisp b/src/code/alieneval.lisp index ac61933661..72db076f81 100644 --- a/src/code/alieneval.lisp +++ b/src/code/alieneval.lisp @@ -1319,11 +1319,6 @@ (error () (error "invalid external alien name: ~S" name)))) -(declaim (ftype (sfunction (string hash-table) (or integer null)) - find-foreign-symbol-in-table)) -(defun find-foreign-symbol-in-table (name table) - (values (gethash (extern-alien-name name) table))) - (in-package "SB-ALIEN") #+sb-xc diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index ae2ed5ff31..54c63df3e0 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1600,7 +1600,6 @@ SB-KERNEL) have been undone, but probably more remain.") "FD-STREAM" "FD-STREAM-FD" "FD-STREAM-P" "FIND-DYNAMIC-FOREIGN-SYMBOL-ADDRESS" "FIND-FOREIGN-SYMBOL-ADDRESS" - "FIND-FOREIGN-SYMBOL-IN-TABLE" #+(and win32 x86-64) "FOREIGN-HEAP-CORRUPTION" "FOREIGN-SYMBOL-SAP" "FOREIGN-SYMBOL-ADDRESS" From 27e216a36db7a3c78aaf75b5d443ae673c20e492 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 19:15:10 -0400 Subject: [PATCH 3943/4023] Fix spelling --- src/assembly/x86-64/arith.lisp | 2 +- src/runtime/coreparse.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assembly/x86-64/arith.lisp b/src/assembly/x86-64/arith.lisp index 38c7e56956..70e45cb3c3 100644 --- a/src/assembly/x86-64/arith.lisp +++ b/src/assembly/x86-64/arith.lisp @@ -156,7 +156,7 @@ (move res x) (inst neg res) ; (- most-negative-fixnum) is BIGNUM ;; This constant isn't really a fixup, but it's easiest for me to think about it - ;; that way for now. It should reall do whatever EMIT-EA does for a CONSTANT. + ;; that way for now. It should really do whatever EMIT-EA does for a CONSTANT. (inst cmov :o res (ea (make-fixup nil :code-object (+ (ash code-constants-offset word-shift) (- other-pointer-lowtag))) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 98762487af..7d3d542863 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -745,7 +745,7 @@ process_directory(int count, struct ndir_entry *entry, os_validate(0, 0, ALIEN_LINKAGE_TABLE_SPACE_SIZE, ALIEN_LINKAGE_TABLE_CORE_SPACE_ID); // Prefill the alien linkage table so that shrinkwrapped executables which link in // all their C library dependencies can avoid linking with -ldl - // but extern-alien stil works for newly compiled code. + // but extern-alien still works for newly compiled code. lispobj* ptr = &alien_linkage_values; gc_assert(ptr); int entry_index = 0; From fb37d925fd8c6f5a843c9cdf55173dec7529fe04 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 19:24:16 -0400 Subject: [PATCH 3944/4023] Remove incorrect test --- src/runtime/immobile-space.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index c2b486be96..c30485b022 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -2077,9 +2077,7 @@ static void apply_absolute_fixups(lispobj fixups, struct code* code) } // Call to asm routine or linkage table entry using "CALL [#xNNNN]" form. // This fixup is only for whole-heap relocation on startup. - if (((lispobj)ALIEN_LINKAGE_TABLE_SPACE_START <= ptr && - ptr < TEXT_SPACE_START) - || (asm_routines_start <= ptr && ptr < asm_routines_end)) { + if (asm_routines_start <= ptr && ptr < asm_routines_end) { continue; } #ifdef LISP_FEATURE_METASPACE From f07385ac855a1c2b44e0a0ca19d6df2d3dc1dbe3 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 21:26:29 -0400 Subject: [PATCH 3945/4023] Simplify expansion of handler-bind Don't resolve #' into fdefn; CALL-SYMBOL is plenty fast. --- src/code/cold-error.lisp | 22 +++++----------------- src/code/error.lisp | 8 +++----- tests/condition-2.pure.lisp | 4 ++-- 3 files changed, 10 insertions(+), 24 deletions(-) diff --git a/src/code/cold-error.lisp b/src/code/cold-error.lisp index d66c51308c..ef4145fdc9 100644 --- a/src/code/cold-error.lisp +++ b/src/code/cold-error.lisp @@ -93,23 +93,11 @@ ;; would lead to infinite recursive SIGNAL calls. (let ((*handler-clusters* handler-clusters)) (dolist (handler cluster) - (macrolet ((cast-to-fun (f possibly-symbolp) - ;; For efficiency the cases are tested in this order: - ;; - FUNCTIONP is just a lowtag test - ;; - FDEFN-P is a lowtag + widetag. - ;; Avoiding a SYMBOLP test is fine because - ;; SYMBOL-FUNCTION rejects bogosity anyway. - `(let ((f ,f)) - (cond ((functionp f) f) - (,(if possibly-symbolp `(fdefn-p f) 't) - (sb-c:safe-fdefn-fun f)) - ,@(if possibly-symbolp - `((t (symbol-function f)))))))) - (let ((test (car (truly-the cons handler)))) - (when (if (%instancep test) ; a condition classoid cell - (classoid-cell-typep test condition) - (funcall (cast-to-fun test nil) condition)) - (funcall (cast-to-fun (cdr handler) t) condition))))))))) + (let ((test (car (truly-the cons handler)))) + (when (if (%instancep test) ; a condition classoid cell + (classoid-cell-typep test condition) + (funcall test condition)) + (funcall (cdr handler) condition)))))))) ;;;; working with *CURRENT-ERROR-DEPTH* and *MAXIMUM-ERROR-DEPTH* diff --git a/src/code/error.lisp b/src/code/error.lisp index 41c6bed029..c0d8931cbc 100644 --- a/src/code/error.lisp +++ b/src/code/error.lisp @@ -100,10 +100,8 @@ (dummy-forms `(sb-c:safe-fdefn-fun (load-time-value (find-or-create-fdefn ',name) t)))) - ;; Resolve to an fdefn at load-time. `(load-time-value - (cons ,test (find-or-create-fdefn - (the (function-designator (condition)) ',name))) + (cons ,test (the (function-designator (condition)) ',name)) t))))) (const-list (items) @@ -132,7 +130,7 @@ ;; whether you wrote T or CONDITION, this is ;; always an eligible handler. '#'constantly-t) - ((typep type '(cons (eql satisfies) (cons t null))) + ((typep type '(cons (eql satisfies) (cons symbol null))) ;; (SATISFIES F) => #'F but never a local ;; definition of F. The predicate is used only ;; if needed - it's not an error if not fboundp @@ -149,7 +147,7 @@ (let ((name (second type))) (when (typep env 'lexenv) (dummy-forms `#',name)) - `(find-or-create-fdefn ',name))) + `',name)) ((and (symbolp type) (condition-classoid-p (find-classoid type nil))) ;; It's debatable whether we need to go through diff --git a/tests/condition-2.pure.lisp b/tests/condition-2.pure.lisp index 12c28f5b00..706623561d 100644 --- a/tests/condition-2.pure.lisp +++ b/tests/condition-2.pure.lisp @@ -467,7 +467,7 @@ (locally (declare (muffle-conditions style-warning)) (handler-bind (((satisfies some-silly-fun) #'print)) (let ((test (caaar sb-kernel:*handler-clusters*))) - (assert (eq test (sb-int:find-fdefn 'some-silly-fun)))))) + (assert (eq test 'some-silly-fun))))) (handler-bind (((or warning error) #'print)) (let ((test (caaar sb-kernel:*handler-clusters*))) (assert (functionp test)))) @@ -484,7 +484,7 @@ (handler-bind ((warning 'some-silly-handler)) (let ((fn (cdaar sb-kernel:*handler-clusters*))) ;; the function is stored as an fdefn - (assert (typep fn 'sb-kernel::fdefn)))) + (assert (eq fn 'some-silly-handler)))) (handler-bind ((warning 'muffle-warning)) (let ((fn (cdaar sb-kernel:*handler-clusters*))) From 9677d618b5f89a457cafdb5244f621c67aa7c9da Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 22:53:21 -0400 Subject: [PATCH 3946/4023] Preserve a required symbol for a test --- src/code/simple-fun.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/code/simple-fun.lisp b/src/code/simple-fun.lisp index b277b88376..793a055b0c 100644 --- a/src/code/simple-fun.lisp +++ b/src/code/simple-fun.lisp @@ -427,6 +427,7 @@ ;;; Start and count of fdefns used in #'F synax or normal named call ;;; (i.e. at the head of an expression) +(export 'sb-vm::code-header-fdefn-range 'sb-vm) ; protect from tree-shaker (defun sb-vm::code-header-fdefn-range (code-obj) (values (+ sb-vm:code-constants-offset (* (code-n-entries code-obj) sb-vm:code-slots-per-simple-fun)) From d008cb1244f9a6805b667450704defbb5b9f5646 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 22:54:14 -0400 Subject: [PATCH 3947/4023] Store original size in forwarding pointer of resized instances enabling safe walk of oldspace pages. --- src/runtime/forwarding-ptr.h | 33 ++++++++++++++++----------------- src/runtime/gc-common.c | 7 ++++--- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/runtime/forwarding-ptr.h b/src/runtime/forwarding-ptr.h index 47b90e52d1..8b0dcf84c7 100644 --- a/src/runtime/forwarding-ptr.h +++ b/src/runtime/forwarding-ptr.h @@ -12,24 +12,13 @@ in_gc_p(void) { inline static boolean forwarding_pointer_p(lispobj *pointer) { - lispobj first_word=*pointer; -#ifdef LISP_FEATURE_GENCGC - return (first_word == FORWARDING_HEADER); +#if defined LISP_FEATURE_64_BIT && defined LISP_FEATURE_LITTLE_ENDIAN + /* Read exactly 1 byte. The upper bytes can store the original object size. + * With other architectures we will need to pick a byte distinct from any widetag + * and any pointer in the low N-LOWTAG-BITS */ + return *(char*)pointer == 1; #else - // FIXME: change 5c0d71f92c371769f911e6a2ac60b2dd9fbde349 added - // an extra test here, which theoretically slowed things down. - // This was in response to 044e22192c25578efceedba042554dc9a96124c6 - // which caused cheneygc to break. But now the latter revision has been - // reverted due to performance degradation in gencgc. - // The right fix is probably for gc_search_all_spaces() to use a - // special version of gc_search_space for ldb. That is unfortunately - // made difficult by the call chain: - // search_all_gc_spaces() -> search_{foo}_space() -> gc_search_space(). - // which requires informing gc_search_space() to be more careful, - // and similarly forwarding_pointer_p(). - return (is_lisp_pointer(first_word) - && in_gc_p() /* cheneygc new_space_p() is broken when not in gc */ - && new_space_p(first_word)); + return (*pointer == FORWARDING_HEADER); #endif } @@ -58,6 +47,16 @@ static inline void set_forwarding_pointer(lispobj *addr, lispobj newspace_copy) addr[0] = newspace_copy; #endif } +static inline void set_forwarding_pointer_resized(lispobj *addr, lispobj newspace_copy, + __attribute__((unused)) int old_nwords) +{ +#if defined LISP_FEATURE_64_BIT && defined LISP_FEATURE_LITTLE_ENDIAN + addr[0] = FORWARDING_HEADER | (old_nwords<<N_WIDETAG_BITS); + addr[1] = newspace_copy; +#else + set_forwarding_pointer(addr, newspace_copy); +#endif +} /// Chase the pointer in 'word' if it points to a forwarded object. static inline lispobj follow_maybe_fp(lispobj word) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index fc1191ab01..4e5f44a058 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -594,10 +594,10 @@ static inline lispobj copy_instance(lispobj object) /* If odd, add 1 (making even). Rounding that to odd and then * adding 1 for the header will effectively add 2 words. * Otherwise, don't add anything because a padding slot exists */ + int old_nwords = 1 + (original_length|1); int new_length = original_length + (original_length & 1); copy = gc_copy_object_resizing(object, 1 + (new_length|1), - region, page_type, - 1 + (original_length|1)); + region, page_type, old_nwords); lispobj *base = native_pointer(copy); /* store the old address as the hash value */ #ifdef LISP_FEATURE_64_BIT @@ -617,11 +617,12 @@ static inline lispobj copy_instance(lispobj object) (void*)object, original_length, (void*)copy, new_length, instance_length(*base)); #endif + set_forwarding_pointer_resized(native_pointer(object), copy, old_nwords); } else { int nwords = 1 + (original_length|1); copy = gc_copy_object(object, nwords, region, page_type); + set_forwarding_pointer(native_pointer(object), copy); } - set_forwarding_pointer(native_pointer(object), copy); return copy; } From e2294492349098e65a1d112eb1d7adf9bd970daa Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 23:12:50 -0400 Subject: [PATCH 3948/4023] Fix allocator.pure for big-endian --- tests/allocator.pure.lisp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/allocator.pure.lisp b/tests/allocator.pure.lisp index a891719d27..5afa5fb954 100644 --- a/tests/allocator.pure.lisp +++ b/tests/allocator.pure.lisp @@ -8,8 +8,7 @@ (sb-vm:find-page-index (sb-kernel:get-lisp-obj-address x))) 'sb-vm::flags)))) - (logbitp 4 ; SINGLE_OBJECT_FLAG - (ldb (byte 6 (+ #+big-endian 2)) flags))))) + (logbitp 4 flags)))) ; SINGLE_OBJECT_FLAG (compile 'on-large-page-p) ;;; Pseudo-static large objects should retain the single-object flag From 97f03d4d4d5a2ea29158a190e73b47addca26e05 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 23:14:02 -0400 Subject: [PATCH 3949/4023] Add optional logging to file of compilation to memory --- src/code/load.lisp | 23 +++++++++++++++++++---- src/compiler/generic/target-core.lisp | 5 +---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 822cbea7df..6a6337fdb8 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1139,6 +1139,24 @@ `(with-pinned-objects (,code-var) ,@body))) (define-load-time-global *show-new-code* nil) +#+sb-xc-host +(defun possibly-log-new-code (object reason) + (declare (ignore reason)) + object) +#-sb-xc-host +(defun possibly-log-new-code (object reason &aux (show *show-new-code*)) + (when show + (let ((*print-pretty* nil)) + ;; DISASSEMBLE is for limited debugging only. + ;; It may write garbled output if multiple threads + (when (eq show 'disassemble) + (with-open-file (f "jit-code.txt" :direction :output + :if-exists :append :if-does-not-exist :create) + (disassemble object :stream f) + (terpri f))) + (format t "~&New code(~Db,~A): ~A~%" (code-object-size object) reason object))) + object) + (define-fop 17 :not-host (fop-load-code ((:operands header n-code-bytes n-fixup-elts))) ;; The stack looks like: ;; ... | constant0 constant1 ... constantN | DEBUG-INFO | FIXUPS-ITEMS .... || @@ -1191,14 +1209,11 @@ (setf (code-header-ref code header-index) (svref stack stack-index)) (incf header-index) (incf stack-index)))) - (when *show-new-code* - (let ((*print-pretty* nil)) - (format t "~&New code(~Db,load): ~A~%" (code-object-size code) code))) (when (typep (code-header-ref code (1- n-boxed-words)) '(cons (eql sb-c::coverage-map))) ;; Record this in the global list of coverage-instrumented code. (atomic-push (make-weak-pointer code) (cdr *code-coverage-info*))) - code)))) + (possibly-log-new-code code "load"))))) ;; this gets you an #<fdefn> object, not the result of (FDEFINITION x) ;; cold-loader uses COLD-FDEFINITION-OBJECT instead. diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index d2c2e1655a..5b5070c8b2 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -381,10 +381,7 @@ (when (and named-call-fixups (immobile-space-obj-p code-obj)) (sb-vm::statically-link-code-obj code-obj named-call-fixups)) - (when sb-fasl::*show-new-code* - (let ((*print-pretty* nil)) - (format t "~&New code(~Db,core): ~A~%" (code-object-size code-obj) code-obj))) - code-obj)) + (sb-fasl::possibly-log-new-code code-obj "core"))) (defun set-code-fdefn (code index fdefn) #+untagged-fdefns From 2294fa292434727b24211e393f4b7d2f8d041968 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sat, 10 Sep 2022 23:42:49 -0400 Subject: [PATCH 3950/4023] Pick a better name for ftype-from-fdefn --- src/code/simple-fun.lisp | 18 ++++++++++++------ src/code/warm-error.lisp | 9 +++++---- src/compiler/globaldb.lisp | 2 +- src/pcl/methods.lisp | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/code/simple-fun.lisp b/src/code/simple-fun.lisp index 793a055b0c..113aaf1b85 100644 --- a/src/code/simple-fun.lisp +++ b/src/code/simple-fun.lisp @@ -311,11 +311,17 @@ (interpreted-function (sb-interpreter:%fun-ftype function)) (t (%simple-fun-type (%fun-fun function))))) -(defun ftype-from-fdefn (name) - (declare (ignorable name)) - (let ((function (awhen (find-fdefn name) (fdefn-fun it)))) - (if (not function) - (specifier-type 'function) +(defun sb-c::ftype-from-definition (name) + (let ((function (fboundp name))) + (cond + ((not function) + (specifier-type 'function)) + ((and (symbolp name) (macro-function name)) + ;; this seems to be called often on macros + ;; what's the right answer ??? + ;; (warn "ftype-from-fdefn called on macro ~s" name) + (specifier-type '(function (t t) t))) + (t ;; Never signal the PARSE-UNKNOWN-TYPE condition. ;; This affects 2 regression tests, both very contrived: ;; - in defstruct.impure ASSERT-ERROR (BUG127--FOO (MAKE-BUG127-E :FOO 3)) @@ -325,7 +331,7 @@ (sb-kernel::make-type-context ftype nil sb-kernel::+type-parse-signal-inhibit+))) (declare (truly-dynamic-extent context)) - (values (sb-kernel::basic-parse-typespec ftype context)))))) + (values (sb-kernel::basic-parse-typespec ftype context))))))) ;;; Return the lambda expression for SIMPLE-FUN if compiled to memory ;;; and rentention of forms was enabled via the EVAL-STORE-SOURCE-FORM policy diff --git a/src/code/warm-error.lisp b/src/code/warm-error.lisp index 8af273c247..9422f076e3 100644 --- a/src/code/warm-error.lisp +++ b/src/code/warm-error.lisp @@ -19,10 +19,11 @@ ;; that needs to know what the unknown type is, and tries to re-parse. ;; Also, there are some unknowns in there already. How on earth did that happen??? (do-all-symbols (s) - (let ((info (sb-int:info :function :type s))) - (when (consp info) - (let ((parsed (specifier-type info))) - (setf (sb-int:info :function :type s) parsed))))) + (unless (macro-function s) + (let ((info (sb-int:info :function :type s))) + (when (consp info) + (let ((parsed (specifier-type info))) + (setf (sb-int:info :function :type s) parsed)))))) ;; One good kludge deserves another. ;; This is OK only because it's the very first file compiled in warm build. (let ((disallowed-undefineds diff --git a/src/compiler/globaldb.lisp b/src/compiler/globaldb.lisp index 46ce9351a3..41bbd71ad7 100644 --- a/src/compiler/globaldb.lisp +++ b/src/compiler/globaldb.lisp @@ -272,7 +272,7 @@ :default (lambda (name) (declare (ignorable name)) #+sb-xc-host (specifier-type 'function) - #-sb-xc-host (sb-impl::ftype-from-fdefn name))) + #-sb-xc-host (sb-c::ftype-from-definition name))) ;;; the ASSUMED-TYPE for this function, if we have to infer the type ;;; due to not having a declaration or definition diff --git a/src/pcl/methods.lisp b/src/pcl/methods.lisp index 4705080f23..3bc8730db9 100644 --- a/src/pcl/methods.lisp +++ b/src/pcl/methods.lisp @@ -520,7 +520,7 @@ ;; don't, however this branch should never be reached because the ;; info only stores :GENERIC-FUNCTION when methods are loaded. ;; Maybe AVER that it does not happen? - (sb-impl::ftype-from-fdefn name))))) + (sb-c::ftype-from-definition name))))) (defun real-add-method (generic-function method &optional skip-dfun-update-p) (flet ((similar-lambda-lists-p (old-method new-lambda-list) From 48c583e5e159fa8bbc0223c231f6b3bb5ebb4aca Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 11 Sep 2022 12:33:00 -0400 Subject: [PATCH 3951/4023] Revise blt-copier-for-widetag yet again Change 88d18542ad wanted to avoid having to know when global constants are dumped, but if we're going to define a function to solve such problem, it's not much better to require that you call a new cold-init thunk prior to calling the new function. And it retained 1kb of junk because of the closure. --- src/code/array.lisp | 30 ++++++++++------------ src/cold/undefined-fun-allowlist.lisp-expr | 3 +-- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index 241e9834b4..1bef0dcb29 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -852,7 +852,6 @@ of specialized arrays is supported." collect `(setf (svref ,symbol ,widetag) (,deffer ,saetp ,check-form)))))) (defun !hairy-data-vector-reffer-init () - (!blt-copiers-cold-init) (define-reffers %%data-vector-reffers%% define-reffer (progn) #'slow-hairy-data-vector-ref) @@ -1163,21 +1162,20 @@ of specialized arrays is supported." (setf (%array-fill-pointer array) (1+ fill-pointer)) fill-pointer)))) -(defun !blt-copiers-cold-init () - (let ((array (make-array 32 :initial-element nil))) - (macrolet ((init () - `(progn - ,@(loop for saetp across *specialized-array-element-type-properties* - when (and (not (member (saetp-specifier saetp) '(t nil))) - (<= (saetp-n-bits saetp) n-word-bits)) - collect `(setf (svref array ,(ash (- (saetp-typecode saetp) 128) -2)) - #',(intern (format nil "UB~D-BASH-COPY" - (saetp-n-bits saetp)) - "SB-KERNEL")))))) - (init)) - (setf (fdefinition 'blt-copier-for-widetag) - (lambda (x) - (aref array (ash (- x 128) -2)))))) +(defun blt-copier-for-widetag (x) + (declare ((mod 256) x)) + (aref (load-time-value + (map-into (make-array 32) + (lambda (x) (if x (symbol-function x) 0)) + '#.(let ((a (make-array 32 :initial-element nil))) + (dovector (saetp *specialized-array-element-type-properties* a) + (when (and (not (member (saetp-specifier saetp) '(t nil))) + (<= (saetp-n-bits saetp) n-word-bits)) + (setf (svref a (ash (- (saetp-typecode saetp) 128) -2)) + (intern (format nil "UB~D-BASH-COPY" (saetp-n-bits saetp)) + "SB-KERNEL")))))) + t) + (ash (logand x #x7f) -2))) (defun extend-vector (vector min-extension) (declare (optimize speed) diff --git a/src/cold/undefined-fun-allowlist.lisp-expr b/src/cold/undefined-fun-allowlist.lisp-expr index c5de1a2cca..77eb827430 100644 --- a/src/cold/undefined-fun-allowlist.lisp-expr +++ b/src/cold/undefined-fun-allowlist.lisp-expr @@ -19,8 +19,7 @@ make-load-form-saving-slots sb-vm:map-allocated-objects sb-ext:primitive-object-size - sb-vm::remove-static-links - sb-vm::blt-copier-for-widetag) + sb-vm::remove-static-links) ;; CLOS implementation (sb-mop:class-finalized-p sb-mop:class-prototype From 383ff664003cce45b5b27778c92b4037ef19bcad Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 11 Sep 2022 13:43:28 -0400 Subject: [PATCH 3952/4023] Share definitions The rationale in change 3bdd4d28 for writing it out twice doesn't hold up to scrutiny. globaldb info ends up equivalent this way. --- src/code/fdefinition.lisp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/code/fdefinition.lisp b/src/code/fdefinition.lisp index 477def069f..89b0e9c440 100644 --- a/src/code/fdefinition.lisp +++ b/src/code/fdefinition.lisp @@ -220,11 +220,7 @@ (symbol (%coerce-name-to-fun callable (symbol-fdefn callable) t)))) ;;; Behaves just like %COERCE-CALLABLE-TO-FUN but has an ir2-convert optimizer. -(defun %coerce-callable-for-call (callable) - (declare (explicit-check)) - (etypecase callable - (function callable) - (symbol (%coerce-name-to-fun callable (symbol-fdefn callable) t)))) +(setf (symbol-function '%coerce-callable-for-call) (symbol-function '%coerce-callable-to-fun)) ;;;; definition encapsulation From 1775976e2f8422b2fa4b5b839cf5bf9703a9f95b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Sun, 11 Sep 2022 21:56:48 -0400 Subject: [PATCH 3953/4023] Simplify %COERCE-NAME-TO-FUN * Remove the optional args. Always enforce that the thing returned is not a macro or special-operator guard trampoline. * And now that symbols directly store a FDEFN there's nothing complicated about SYMBOL-FUNCTION, so generally pick that off as a special case. --- src/code/cold-init.lisp | 3 ++ src/code/fdefinition.lisp | 100 ++++++++++++++++++-------------------- src/code/symbol.lisp | 13 ++++- 3 files changed, 61 insertions(+), 55 deletions(-) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index cd2a58a81f..e8798df3fb 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -173,6 +173,9 @@ ;; And now *CURRENT-THREAD* (sb-thread::init-main-thread) + ;; not sure why this is needed on some architectures. Dark magic. + (setf (fdefn-fun (find-or-create-fdefn '%coerce-callable-for-call)) + #'%coerce-callable-to-fun) ;; Assert that FBOUNDP doesn't choke when its answer is NIL. ;; It was fine if T because in that case the legality of the arg is certain. ;; And be extra paranoid - ensure that it really gets called. diff --git a/src/code/fdefinition.lisp b/src/code/fdefinition.lisp index 89b0e9c440..dbcbfb2a3f 100644 --- a/src/code/fdefinition.lisp +++ b/src/code/fdefinition.lisp @@ -95,18 +95,17 @@ (eq (load-time-value (%closure-fun (symbol-function 'dx-let)) t) (%closure-fun function)))) +;;; This is the implementation of (COERCE s 'function) when S is of type symbol +;;; used by either the full call or the compile-time transform for that pattern. (defun coerce-symbol-to-fun (symbol) - ;; FIXME? I would think to use SYMBOL-FUNCTION here which does not strip off - ;; encapsulations. But Stas wrote FDEFINITION so ... - ;; [Also note, we won't encapsulate a macro or special-form, so this - ;; introspective technique to decide what kind something is works either way] - (let ((def (fdefinition symbol))) - (if (macro/special-guard-fun-p def) - (error (ecase (car (%fun-name def)) - (:macro "~S names a macro.") - (:special "~S names a special operator.")) - symbol) - def))) + (let ((def (%symbol-function symbol))) + (cond ((not def) (error 'undefined-function :name symbol)) + ((macro/special-guard-fun-p def) + (error (ecase (car (%fun-name def)) + (:macro "~S names a macro.") + (:special "~S names a special operator.")) + symbol)) + (t def)))) (declaim (ftype (sfunction (t) fdefn) find-or-create-fdefn)) (defun find-or-create-fdefn (name) @@ -151,39 +150,26 @@ (clear-info :function :type name)))) ;;; Return the fdefn-fun of NAME's fdefinition including any -;;; encapsulations. FDEFN can be provided explicitly. As a special -;;; case it can be computed with SYMBOL-FDEFN which is slightly -;;; quicker. This is the core of the implementation of the standard +;;; encapsulations. This is the core of the implementation of the standard ;;; FDEFINITION function, but as we've defined FDEFINITION, that ;;; strips encapsulations. -(defun %coerce-name-to-fun (name &optional (fdefn (find-fdefn name)) - strictly-functionp) - (declare (type boolean strictly-functionp)) - (let (f) - (if (and fdefn - (setq f (fdefn-fun fdefn)) - ;; If STRICTLY-FUNCTIONP is true, we make sure not to return an error - ;; trampoline. This extra check ensures that full calls such as - ;; (MAPCAR 'OR '()) signal an error that OR isn't a function. - ;; This accords with the non-requirement that macros store strictly - ;; a function in the symbol that names them. In many implementations, - ;; (FUNCTIONP (SYMBOL-FUNCTION 'OR)) => NIL. We want to pretend that. - (not (and strictly-functionp (macro/special-guard-fun-p f)))) - f - (retry-%coerce-name-to-fun name strictly-functionp)))) - -;;; If %COERCE-NAME-TO-FUN fails, continue here. -;;; LOOKUP-FN, being more about speed than semantics, is irrelevant. -;;; Once we're forced down the slow path, it doesn't matter whether the fdefn -;;; lookup considers generalized function names (which require a hash-table) -;;; versus optimizing for just symbols (by using SYMBOL-INFO). -;;; -;;; Furthermore we explicitly allow any function name when retrying, -;;; even if the erring caller was SYMBOL-FUNCTION. It is consistent -;;; that both #'(SETF MYNEWFUN) and '(SETF MYNEWFUN) are permitted -;;; as the object to use in the USE-VALUE restart. -(defun retry-%coerce-name-to-fun (name strictly-functionp) - (setq name (restart-case (error 'undefined-function :name name) +(defun %coerce-name-to-fun (name) + (typecase name + ((and symbol (not null)) + (let ((fun (%symbol-function name))) + (when (and fun (not (macro/special-guard-fun-p fun))) + (return-from %coerce-name-to-fun fun)))) + (cons + (binding* ((fdefn (find-fdefn name) :exit-if-null) + (fun (fdefn-fun fdefn) :exit-if-null)) + (return-from %coerce-name-to-fun fun)))) + ;; We explicitly allow any function name when retrying, + ;; even if the erring caller was SYMBOL-FUNCTION. It is consistent + ;; that both #'(SETF MYNEWFUN) and '(SETF MYNEWFUN) are permitted + ;; as the object to use in the USE-VALUE restart. + (setq name (restart-case (if (legal-fun-name-p name) + (error 'undefined-function :name name) + (legal-fun-name-or-type-error name)) (continue () :report (lambda (stream) (format stream "Retry using ~s." name)) @@ -193,15 +179,9 @@ (format stream "Use specified function")) :interactive read-evaluated-form (if (functionp value) - (return-from retry-%coerce-name-to-fun value) + (return-from %coerce-name-to-fun value) value)))) - (let ((fdefn (find-fdefn name))) - (when fdefn - (let ((f (fdefn-fun (truly-the fdefn fdefn)))) - (when (and f (or (not strictly-functionp) - (not (macro/special-guard-fun-p f)))) - (return-from retry-%coerce-name-to-fun f))))) - (retry-%coerce-name-to-fun name strictly-functionp)) + (%coerce-name-to-fun name)) ;; Coerce CALLABLE (a function-designator) to a FUNCTION. ;; The compiler emits this when someone tries to FUNCALL something. @@ -215,9 +195,18 @@ ;; if a symbol does not satisfy FBOUNDP. (defun %coerce-callable-to-fun (callable) (declare (explicit-check)) - (etypecase callable - (function callable) - (symbol (%coerce-name-to-fun callable (symbol-fdefn callable) t)))) + (typecase callable + (function + (return-from %coerce-callable-to-fun callable)) + ((and symbol (not null)) ; NIL can't be fboundp. Quicker test this way. + (let ((fun (%symbol-function callable))) + (when (and fun (not (macro/special-guard-fun-p fun))) + (return-from %coerce-callable-to-fun fun)))) + ;; If NIL, it's not technically a type-error, so instead hit the error + ;; in %coerce-name-to-fun which has a restart. + (null) + (t (error 'type-error :expected-type '(or symbol function) :datum callable))) + (%coerce-name-to-fun callable)) ;;; Behaves just like %COERCE-CALLABLE-TO-FUN but has an ir2-convert optimizer. (setf (symbol-function '%coerce-callable-for-call) (symbol-function '%coerce-callable-to-fun)) @@ -361,7 +350,10 @@ encapsulations and to return the innermost encapsulated definition. This is SETF'able." (declare (explicit-check)) - (let ((fun (%coerce-name-to-fun name))) + ;; %COERCE-NAME-TO-FUN signals an error for macros and special operators, + ;; but FDEFINITION should not, so pick off symbols using %SYMBOL-FUNCTION. + (let ((fun (or (and (symbolp name) (%symbol-function name)) + (%coerce-name-to-fun name)))) (loop (let ((encap-info (encapsulation-info fun))) (if encap-info diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index e0c48587e0..c12d587247 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -105,9 +105,16 @@ distinct from the global value. Can also be SETF." (%set-symbol-hash symbol (compute-symbol-hash name (length name)))) hash))) +;;; Return the function binding of SYMBOL or NIL if not fboundp. +;;; Don't strip encapsulations. +(defmacro %symbol-function (symbol) + `(let ((fdefn (sb-vm::%symbol-fdefn ,symbol))) + (if (eql fdefn 0) nil (fdefn-fun (truly-the fdefn fdefn))))) + (defun symbol-function (symbol) "Return SYMBOL's current function definition. Settable with SETF." - (%coerce-name-to-fun symbol (symbol-fdefn symbol))) + (or (%symbol-function symbol) ; fast way + (%coerce-name-to-fun symbol))) ; fallback with restart ;; I think there are two bugs here. ;; Per CLHS "SETF may be used with symbol-function to replace a global @@ -118,6 +125,10 @@ distinct from the global value. Can also be SETF." ;; * (setf (symbol-function 'if) #'cons) => #<FUNCTION CONS> ;; 2. (SETF (SYMBOL-FUNCTION 'I-ONCE-WAS-A-MACRO) #'CONS) ;; should _probably_ make I-ONCE-WAS-A-MACRO not a macro +;; Possible FIXME: if SYM1's fun -> encapsulation1 -> realfun1 and then you do: +;; * (setf (symbol-function 'sym2) (symbol-function 'sym1)) ; assigns the encapsulation +;; * (setf (fdefinition 'sym1) #'baz) ; assigns into the encapsulation +;; it redefines both symbols. Maybe encapsulations should be copy-on-write. (defun (setf symbol-function) (new-value symbol) (declare (type symbol symbol) (type function new-value)) ;; (SYMBOL-FUNCTION symbol) == (FDEFINITION symbol) according to the writeup From db90deb0f9cea07755ea9057ed9c1eb8802c2cdf Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 12 Sep 2022 11:05:43 -0400 Subject: [PATCH 3954/4023] Simplify things * symbol-fdefn used to access packed-info, but it became a slot * %set-fdefinition pre-dates setf functions --- make-target-2-load.lisp | 4 ++-- src/code/defsetfs.lisp | 3 --- src/code/fdefinition.lisp | 15 +++------------ src/code/interr.lisp | 16 ++++++---------- src/code/symbol.lisp | 4 ++-- src/code/target-package.lisp | 2 +- src/cold/exports.lisp | 1 - src/compiler/fndb.lisp | 4 ++-- 8 files changed, 16 insertions(+), 33 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index 3757b216c8..b12066d24e 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -405,7 +405,7 @@ Please check that all strings which were not recognizable to the compiler (lambda (symbol accessibility) (declare (ignore accessibility)) (or (sb-kernel:symbol-%info symbol) - (sb-int:symbol-fdefn symbol) ; might be redundant with existence of %info, but ok + (sb-kernel:find-fdefn symbol) ; might be redundant with existence of %info, but ok (and (boundp symbol) (not (keywordp symbol))))) ;; Release mode: retain all symbols satisfying this intricate test #-sb-devel @@ -471,7 +471,7 @@ Please check that all strings which were not recognizable to the compiler (or (eq accessibility :external) (asm-inst-p symbol)) ;; By default, retain any symbol with any attachments (or (sb-kernel:symbol-%info symbol) - (sb-int:symbol-fdefn symbol) + (sb-int:find-fdefn symbol) (and (boundp symbol) (not (keywordp symbol)))))))) :verbose nil :print nil) (unintern 'sb-impl::shake-packages 'sb-impl) diff --git a/src/code/defsetfs.lisp b/src/code/defsetfs.lisp index 8536513502..d50f6f1b80 100644 --- a/src/code/defsetfs.lisp +++ b/src/code/defsetfs.lisp @@ -171,9 +171,6 @@ (defsetf subseq (sequence start &optional end) (v) `(progn (replace ,sequence ,v :start1 ,start :end1 ,end) ,v)) -;;; from fdefinition.lisp -(defsetf fdefinition %set-fdefinition) - ;;; from kernel.lisp #-darwin-jit (progn diff --git a/src/code/fdefinition.lisp b/src/code/fdefinition.lisp index dbcbfb2a3f..6dab4c9f13 100644 --- a/src/code/fdefinition.lisp +++ b/src/code/fdefinition.lisp @@ -33,16 +33,6 @@ #+immobile-code (sb-vm::%set-fdefn-fun fdefn fun) #-immobile-code (setf (fdefn-fun fdefn) fun)) -;; Return SYMBOL's fdefinition, if any, or NIL. SYMBOL must already -;; have been verified to be a symbol by the caller. -(defun symbol-fdefn (symbol) - (declare (optimize (safety 0))) - (let ((fdefn (sb-vm::%symbol-fdefn symbol))) - ;; The slot default is 0, not NIL, because I'm thinking that it might also - ;; be used to store the property list if there is no FDEFN, - ;; or a cons of an FDEFN and list, so 0 is unambiguously "no value" - (if (eql fdefn 0) nil fdefn))) - ;;; Return the FDEFN object for NAME, or NIL if there is no fdefn. ;;; Signal an error if name isn't valid. ;;; Assume that exists-p implies LEGAL-FUN-NAME-P. @@ -50,7 +40,8 @@ (defun find-fdefn (name) (declare (explicit-check)) (when (symbolp name) ; Don't need LEGAL-FUN-NAME-P check - (return-from find-fdefn (symbol-fdefn name))) + (let ((fdefn (sb-vm::%symbol-fdefn name))) ; slot default is 0, not NIL + (return-from find-fdefn (if (eql fdefn 0) nil fdefn)))) ;; Technically the ALLOW-ATOM argument of NIL isn't needed, but ;; the compiler isn't figuring out not to test SYMBOLP twice in a row. (with-globaldb-name (key1 key2 nil) name @@ -374,7 +365,7 @@ :format-control "~S is not acceptable to ~S." :format-arguments (list object setter)))) -(defun %set-fdefinition (name new-value) +(defun (setf fdefinition) (new-value name) "Set NAME's global function definition." (declare (type function new-value) (optimize (safety 1))) (declare (explicit-check)) diff --git a/src/code/interr.lisp b/src/code/interr.lisp index 5694aaa4b8..835f62bf01 100644 --- a/src/code/interr.lisp +++ b/src/code/interr.lisp @@ -53,18 +53,14 @@ (labels ((retry-value (value) (or (typecase value (fdefn (fdefn-fun value)) - (symbol - (let ((fdefn (symbol-fdefn value))) - (and fdefn - (fdefn-fun fdefn)))) + (symbol (sb-impl::%symbol-function value)) (function value) - (t - (if (valid-function-name-p value) - (let ((fdefn (find-fdefn value))) - (and fdefn - (fdefn-fun fdefn))) + ((satisfies legal-fun-name-p) + (let ((fdefn (find-fdefn value))) + (and fdefn (fdefn-fun fdefn)))) + (t (still-bad "Bad value when restarting ~s: ~s" - name value)))) + name value))) (still-bad (if (fdefn-p value) "~S is still undefined" "Can't replace ~s with ~s because it is undefined") diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index c12d587247..93e35689c2 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -113,8 +113,8 @@ distinct from the global value. Can also be SETF." (defun symbol-function (symbol) "Return SYMBOL's current function definition. Settable with SETF." - (or (%symbol-function symbol) ; fast way - (%coerce-name-to-fun symbol))) ; fallback with restart + (truly-the function (or (%symbol-function symbol) ; fast way + (%coerce-name-to-fun symbol)))) ; fallback w/restart ;; I think there are two bugs here. ;; Per CLHS "SETF may be used with symbol-function to replace a global diff --git a/src/code/target-package.lisp b/src/code/target-package.lisp index 4e19fb982b..945eb40eba 100644 --- a/src/code/target-package.lisp +++ b/src/code/target-package.lisp @@ -495,7 +495,7 @@ error if any of PACKAGES is not a valid package designator." ;;; WITH-SINGLE-PACKAGE-LOCKED-ERROR. ;;; ;;; FIXME: Maybe we should establish such contours for he toplevel -;;; and others, so that %set-fdefinition and others could just use +;;; and others, so that (setf fdefinition) and others could just use ;;; this. (defun assert-symbol-home-package-unlocked (name &optional format-control &rest format-arguments) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 54c63df3e0..41acd94a13 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2976,7 +2976,6 @@ possibly temporarily, because it might be used internally.") "CLEAR-INFO-VALUES" "DEFINE-INFO-TYPE" "FIND-FDEFN" - "SYMBOL-FDEFN" "GET-INFO-VALUE-INITIALIZING" "GLOBALDB-SXHASHOID" "GLOBAL-FTYPE" diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 44e3e8fbd6..9cca99594b 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -132,8 +132,8 @@ (defknown set (symbol t) t () :derive-type #'result-type-last-arg) (defknown fdefinition ((or symbol cons)) function ()) -(defknown %set-fdefinition ((or symbol cons) function) function () - :derive-type #'result-type-last-arg) +(defknown ((setf fdefinition)) (function (or symbol cons)) function () + :derive-type #'result-type-first-arg) (defknown makunbound (symbol) symbol () :derive-type #'result-type-first-arg) (defknown fmakunbound ((or symbol cons)) (or symbol cons) From 24ac3021155a9dd8d72b4628a0a6852472b76989 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 12 Sep 2022 18:23:44 +0300 Subject: [PATCH 3955/4023] Adjust VOP names. --- src/compiler/arm64/float.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/arm64/float.lisp b/src/compiler/arm64/float.lisp index 9b093b2dde..b9e669a144 100644 --- a/src/compiler/arm64/float.lisp +++ b/src/compiler/arm64/float.lisp @@ -481,7 +481,9 @@ single-reg single-float double-reg double-float)) (macrolet ((frob (trans from-sc from-type inst) - `(define-vop (,(symbolicate trans "/" from-type)) + `(define-vop (,(if (find #\/ (string trans)) + trans + (symbolicate trans "/" from-type))) (:args (x :scs (,from-sc))) (:results (y :scs (signed-reg))) (:arg-types ,from-type) From c4a2a28bfec76c668279a2d584f9e38a07791410 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 12 Sep 2022 18:41:24 +0300 Subject: [PATCH 3956/4023] unary-truncate float transforms: mark %single/double-float flushable. --- src/compiler/float-tran.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 93497bc5e5..93b07a4470 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1646,6 +1646,7 @@ ,(symbol-value (package-symbolicate :sb-kernel 'most-negative-fixnum- type)) ,(symbol-value (package-symbolicate :sb-kernel 'most-positive-fixnum- type)))) (let ((truncated (truly-the fixnum (%unary-truncate number)))) + (declare (flushable ,(symbolicate "%" type))) (values truncated (- number (coerce truncated ',type)))) From 71c39187c7c8b730a38bf8098043b018ba478e3b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 12 Sep 2022 18:43:06 +0300 Subject: [PATCH 3957/4023] Fix +sb-devel --- make-target-2-load.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index b12066d24e..c3d65dcfed 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -405,7 +405,7 @@ Please check that all strings which were not recognizable to the compiler (lambda (symbol accessibility) (declare (ignore accessibility)) (or (sb-kernel:symbol-%info symbol) - (sb-kernel:find-fdefn symbol) ; might be redundant with existence of %info, but ok + (sb-int:find-fdefn symbol) ; might be redundant with existence of %info, but ok (and (boundp symbol) (not (keywordp symbol))))) ;; Release mode: retain all symbols satisfying this intricate test #-sb-devel From 291cda80443e00cf8cc0f23a18a0ad399fd5309d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Mon, 12 Sep 2022 18:58:26 +0300 Subject: [PATCH 3958/4023] Disable a test. --- tests/x86-64-codegen.impure.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index cfc8290324..bcab333a43 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -1268,7 +1268,8 @@ thereis (search string line)))) #+immobile-space -(with-test (:name :disassemble-alien-linkage-table-ref) +(with-test (:name :disassemble-alien-linkage-table-ref + :fails-on (not :sb-thread)) (dolist (memspace '(:dynamic :immobile)) (let ((sb-c::*compile-to-memory-space* memspace)) (assert (find-in-disassembly From 43d0941f9d943ecd5c99c74d89664322cdac2589 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 12 Sep 2022 12:09:40 -0400 Subject: [PATCH 3959/4023] sb-posix: play nice in test sandbox parallel-exec would fail in :READDIR/DIRENT-NAME a lot because many tests (in any test file) would create and delete files in the current directory, while this test randomly happened to be running. Naturally the other tests are to blame, but in trying to fix it, I saw that every posix test was badly behaved and that "-j 2 --runs_per_test 2" on sb-posix.impure would reliably fail because *test-directory* was derived solely from *load-truename*. --- contrib/sb-posix/posix-tests.lisp | 47 +++++++++++++------------------ tests/parallel-exec.sh | 1 + tests/sb-posix.impure.lisp | 7 ++++- tests/test-util.lisp | 15 ++++++++-- 4 files changed, 39 insertions(+), 31 deletions(-) diff --git a/contrib/sb-posix/posix-tests.lisp b/contrib/sb-posix/posix-tests.lisp index 5971ca13a0..475f54ea5a 100644 --- a/contrib/sb-posix/posix-tests.lisp +++ b/contrib/sb-posix/posix-tests.lisp @@ -4,11 +4,7 @@ (in-package "SB-POSIX-TESTS") -(defvar *test-directory* - (ensure-directories-exist - (merge-pathnames (make-pathname :directory '(:relative "test-output")) - (make-pathname :directory - (pathname-directory *load-truename*))))) +(defvar *test-directory* test-util:*test-directory*) (defvar *current-directory* *default-pathname-defaults*) @@ -431,7 +427,7 @@ :type sb-posix:f-wrlck :whence sb-posix:seek-set :start 0 :len 10)) - (pathname "fcntl.flock.1") + (pathname (merge-pathnames #P"fcntl.flock.1" *test-directory*)) kid-status) (catch 'test (with-open-file (f pathname :direction :output) @@ -466,7 +462,7 @@ :type sb-posix:f-wrlck :whence sb-posix:seek-set :start 0 :len 10)) - (pathname "fcntl.flock.2") + (pathname (merge-pathnames #P"fcntl.flock.2" *test-directory*)) kid-status) (catch 'test (with-open-file (f pathname :direction :output) @@ -530,28 +526,25 @@ t) #-darwin -(deftest readdir/dirent-name - (let ((dir (sb-posix:opendir *current-directory*))) - (unwind-protect - (equal (sort (loop for entry = (sb-posix:readdir dir) - until (sb-alien:null-alien entry) - collect (sb-posix:dirent-name entry)) - #'string<) - (sort (append '("." "..") - (mapcar (lambda (p) - (let ((string (enough-namestring p *current-directory*))) - (if (pathname-name p) - string - (subseq string 0 (1- (length string)))))) - (directory (make-pathname - :name :wild +(test-util:with-test (:name :readdir/dirent-name) + (let* ((dir (sb-posix:opendir *current-directory*)) + (posix-readdir (loop for entry = (sb-posix:readdir dir) + until (sb-alien:null-alien entry) + collect (sb-posix:dirent-name entry))) + (cl-directory + (append '("." "..") + (mapcar (lambda (p) + (let ((string (enough-namestring p *current-directory*))) + (if (pathname-name p) + string + (subseq string 0 (1- (length string)))))) + (directory (make-pathname :name :wild :type :wild :defaults *current-directory*) - :resolve-symlinks nil))) - #'string<)) - (sb-posix:closedir dir))) - t) - + :resolve-symlinks nil))))) + (sb-posix:closedir dir) + (assert (equal (sort posix-readdir #'string<) + (sort cl-directory #'string<))))) (deftest write.1 (progn diff --git a/tests/parallel-exec.sh b/tests/parallel-exec.sh index 360e6351f3..252bf0da68 100755 --- a/tests/parallel-exec.sh +++ b/tests/parallel-exec.sh @@ -2,6 +2,7 @@ logdir=${SBCL_PAREXEC_TMP:-$HOME}/sbcl-test-logs-$$ echo ==== Writing logs to $logdir ==== +# FIXME: junkdir isn't getting removed junkdir=${SBCL_PAREXEC_TMP:-/tmp}/junk mkdir -p $junkdir $logdir diff --git a/tests/sb-posix.impure.lisp b/tests/sb-posix.impure.lisp index ad43e58712..93b1c21d0d 100644 --- a/tests/sb-posix.impure.lisp +++ b/tests/sb-posix.impure.lisp @@ -1,3 +1,8 @@ (require :sb-posix) -(load "../contrib/sb-posix/posix-tests.lisp") +(let* ((pathname (test-util:generate-test-directory-name)) + (test-util:*test-directory* pathname)) + (ensure-directories-exist pathname) + (format t "~&::: NOTE: using test-directory ~S~%" pathname) + (unwind-protect (load "../contrib/sb-posix/posix-tests.lisp") + (delete-directory pathname :recursive t))) (load "../contrib/sb-posix/libc-tests.lisp") diff --git a/tests/test-util.lisp b/tests/test-util.lisp index 894ecd8265..822f3d67aa 100644 --- a/tests/test-util.lisp +++ b/tests/test-util.lisp @@ -35,6 +35,7 @@ #:*scratch-file-prefix* #:with-scratch-file #:with-test-directory + #:generate-test-directory-name #:*test-directory* #:opaque-identity #:runtime #:split-string #:integer-sequence #:shuffle)) @@ -887,14 +888,22 @@ (defvar *test-directory*) +(defun generate-test-directory-name () + ;; Why aren't we using TMPDIR??? + (merge-pathnames + (make-pathname :directory `(:relative ,(write-to-string (sb-unix:unix-getpid)))) + (parse-native-namestring (posix-getenv "TEST_DIRECTORY") + nil *default-pathname-defaults* + :as-directory t))) + (defun call-with-test-directory (fn) ;; FIXME: this writes into the source directory depending on whether ;; TEST_DIRECTORY has been made to point elsewhere or not. - (let ((test-directory (parse-native-namestring (posix-getenv "TEST_DIRECTORY") - nil *default-pathname-defaults* - :as-directory t))) + (let ((test-directory (generate-test-directory-name))) (ensure-directories-exist test-directory) (unwind-protect + ;; WHY REBIND *DEFAULT-PATHNAME-DEFAULTS* ? THIS SUCKS! + ;; (It means we can't use the WITH-TEST-DIRECTORY macro for most things) (let ((*default-pathname-defaults* test-directory) (*test-directory* test-directory)) (funcall fn test-directory)) From a60fb4fb2df29c29b8b5dd87715b55ac73cba39a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 12 Sep 2022 12:20:58 -0400 Subject: [PATCH 3960/4023] Fix TRACE/UNTRACE weirdness due to (setf fdefinition) Never copy encapsulations when assigning a global function. --- src/code/fdefinition.lisp | 8 +++++--- src/code/symbol.lisp | 5 +---- tests/trace.impure.lisp | 42 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 tests/trace.impure.lisp diff --git a/src/code/fdefinition.lisp b/src/code/fdefinition.lisp index 6dab4c9f13..c2ff4de9af 100644 --- a/src/code/fdefinition.lisp +++ b/src/code/fdefinition.lisp @@ -343,13 +343,14 @@ (declare (explicit-check)) ;; %COERCE-NAME-TO-FUN signals an error for macros and special operators, ;; but FDEFINITION should not, so pick off symbols using %SYMBOL-FUNCTION. - (let ((fun (or (and (symbolp name) (%symbol-function name)) - (%coerce-name-to-fun name)))) + (strip-encapsulation (or (and (symbolp name) (%symbol-function name)) + (%coerce-name-to-fun name)))) +(defun strip-encapsulation (fun) (loop (let ((encap-info (encapsulation-info fun))) (if encap-info (setf fun (encapsulation-info-definition encap-info)) - (return fun)))))) + (return fun))))) (defvar *setf-fdefinition-hook* nil "A list of functions that (SETF FDEFINITION) invokes before storing the @@ -370,6 +371,7 @@ (declare (type function new-value) (optimize (safety 1))) (declare (explicit-check)) (err-if-unacceptable-function new-value '(setf fdefinition)) + (setq new-value (strip-encapsulation new-value)) (with-single-package-locked-error (:symbol name "setting fdefinition of ~A") (maybe-clobber-ftype name new-value) diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index 93e35689c2..06f2d57bcb 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -125,16 +125,13 @@ distinct from the global value. Can also be SETF." ;; * (setf (symbol-function 'if) #'cons) => #<FUNCTION CONS> ;; 2. (SETF (SYMBOL-FUNCTION 'I-ONCE-WAS-A-MACRO) #'CONS) ;; should _probably_ make I-ONCE-WAS-A-MACRO not a macro -;; Possible FIXME: if SYM1's fun -> encapsulation1 -> realfun1 and then you do: -;; * (setf (symbol-function 'sym2) (symbol-function 'sym1)) ; assigns the encapsulation -;; * (setf (fdefinition 'sym1) #'baz) ; assigns into the encapsulation -;; it redefines both symbols. Maybe encapsulations should be copy-on-write. (defun (setf symbol-function) (new-value symbol) (declare (type symbol symbol) (type function new-value)) ;; (SYMBOL-FUNCTION symbol) == (FDEFINITION symbol) according to the writeup ;; on SYMBOL-FUNCTION. It doesn't say that SETF behaves the same, but let's ;; assume it does, and that we can't assign our macro/special guard funs. (err-if-unacceptable-function new-value '(setf symbol-function)) + (setq new-value (strip-encapsulation new-value)) (with-single-package-locked-error (:symbol symbol "setting the symbol-function of ~A") ;; This code is a little "surprising" in that it is not just a limited diff --git a/tests/trace.impure.lisp b/tests/trace.impure.lisp new file mode 100644 index 0000000000..072017d62f --- /dev/null +++ b/tests/trace.impure.lisp @@ -0,0 +1,42 @@ + +;;; Consider the following definitions in which we assign F2 and F3 +;;; the function binding of F1. +;;; Even if we were to agree that tracing of F2 and F3 should happen +;;; (which I think is wrong in itself), then what about SB-DEBUG::*TRACED-FUNS* ? +;;; It doesn't know that F2 and F3 are traced, which seems like a metadata bug. +;;; So then when we UNTRACE F1, we don't know that we're supposed to UNTRACE +;;; F2 and F3, so they continue to print the tracing output. +;;; And aside from that, when F2 or F3 would get invoked, the tracing output +;;; would suggest that F1 was called by name, which doesn't make a ton of sense, +;;; because first of all tracing is supposed to print the name of what was +;;; actually called - which coincidentally is bound to the same function object +;;; as some other global name - and secondly we just explicitly UNTRACEd the very +;;; name that it said was called. +;;; A reasonable solution to these bugs is to remove the tracing encapsulation +;;; when assigning SYMBOL-FUNCTION or FDEFINITION. Granted there are other +;;; encapsulations (profiling, e.g.) but this entire area is unspecified. + +(defparameter *count* 0) +(defun f1 () (incf *count*)) +(trace f1) +(setf (symbol-function 'f2) #'f1) +(setf (fdefinition 'f3) #'f1) + +(test-util:with-test (:name :strip-encap) + (let ((s (with-output-to-string (*trace-output*) + (f1)))) + (assert (search "F1 returned 1" s))) + (let ((s (with-output-to-string (*trace-output*) + (f2)))) + (assert (= (length s) 0))) + (let ((s (with-output-to-string (*trace-output*) + (f3)))) + (assert (= (length s) 0)))) + +(defvar *foo*) +;; this should keep the tracing encapsulation +(defun f1 () (setq *foo* 'invoked)) +(test-util:with-test (:name :no-strip-encap) + (let ((s (with-output-to-string (*trace-output*) + (f1)))) + (assert (search "F1 returned INVOKED" s)))) From 776cfd1b21b985e0b38f1859933b19358264f07b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 12 Sep 2022 14:49:24 -0400 Subject: [PATCH 3961/4023] x86-64: Remove signed-imm-data/asm-routine to fix bad disassembly The address of an asm routine is never moved to a register any more. "MOV ea, imm32" would print the name of an assembly routine if imm32 randomly matched. MAKE-FUNCALLABLE-INSTANCE-TRAMP can use this form, but it's not worth false positives to try to detect it. --- src/compiler/x86-64/insts.lisp | 15 ++------------- src/compiler/x86-64/target-insts.lisp | 12 ------------ 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index 1018b59b45..66b00bc223 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -255,10 +255,6 @@ (princ16 value stream) (princ value stream)))))) -(define-arg-type signed-imm-data/asm-routine - :type 'signed-imm-data - :printer #'print-imm/asm-routine) - ;;; Used by those instructions that have a default operand size of ;;; :qword. Nevertheless the immediate is at most of size :dword. ;;; The only instruction of this kind having a variant with an immediate @@ -521,13 +517,6 @@ (reg/mem :type 'sized-reg/mem) (imm :type 'signed-imm-data)) -(define-instruction-format (reg/mem-imm/asm-routine 16 - :include reg/mem-imm - :default-printer - '(:name :tab reg/mem ", " imm)) - (reg/mem :type 'sized-reg/mem) - (imm :type 'signed-imm-data/asm-routine)) - ;;; Same as reg/mem, but with using the accumulator in the default printer (define-instruction-format (accum-reg/mem 16 @@ -1403,12 +1392,12 @@ (:printer reg ((op #b1011 :prefilter (lambda (dstate value) (dstate-setprop dstate +allow-qword-imm+) value)) - (imm nil :type 'signed-imm-data/asm-routine)) + (imm nil :type 'signed-imm-data)) '(:name :tab reg ", " imm)) ;; register to/from register/memory (:printer reg-reg/mem-dir ((op #b100010))) ;; immediate to register/memory - (:printer reg/mem-imm/asm-routine ((op '(#b1100011 #b000)))) + (:printer reg/mem-imm ((op '(#b1100011 #b000)))) (:emitter (let ((size (pick-operand-size prefix dst src))) (emit-mov segment size (sized-thing dst size) (sized-thing src size))))) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index 162ae279e5..e742ac1f74 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -277,18 +277,6 @@ (sb-disassem::find-code-constant-from-interior-pointer value dstate)) (note (lambda (stream) (princ it stream)) dstate))) -;;; Immobile symbols are heuristically detected with MAYBE-NOTE-STATIC-LISPOBJ -;;; so that moving the tagged pointer to a symbol is shown thusly: -;;; "; BACF003C50 MOV EDX, #x503C00CF ; '*MYVAR*" -;;; -(defun print-imm/asm-routine (value stream dstate) - (cond ((not stream) (operand value dstate)) - ((or (maybe-note-assembler-routine value nil dstate) - (maybe-note-static-lispobj value dstate t)) - (princ16 value stream)) - (t - (princ value stream)))) - ;;; Return an instance of REG or MACHINE-EA. ;;; MOD and R/M are the extracted bits from the instruction's ModRM byte. ;;; Depending on MOD and R/M, a SIB byte and/or displacement may be read. From da61e1ecddbf4e03afc4903a5e2b1732b96cc740 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 12 Sep 2022 14:55:49 -0400 Subject: [PATCH 3962/4023] Speed up alien-linkage-index-to-name --- src/code/foreign.lisp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 67bdd612dd..8bbe88cecd 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -154,9 +154,22 @@ symbol designates a variable. May enter the symbol into the linkage-table." (close-shared-objects)) (defun alien-linkage-index-to-name (index) - (dohash ((key value) (car *linkage-info*) :locked t) - (when (= value index) - (return (if (listp key) (car key) key))))) + ;; Entries are never removed from the linkage-table, so we can take advantage + ;; of the fact that indices are inserted in order, and hash-table growth + ;; preserves order. So we know where the entry is. + ;; INDEX should be of type HASH-TABLE-INDEX but this might be called + ;; on an arbitrary (bogus) value which exceeds that. + (declare (fixnum index)) + (let* ((table (car *linkage-info*)) + (pairs (sb-impl::hash-table-pairs table)) + (pair-index (+ (* index 2) 2)) + (key + (cond ((>= index (hash-table-count table)) nil) + ((eql (aref pairs (1+ pair-index)) index) (aref pairs pair-index)) + (t (block found ; "shouldn't happen" + (dohash ((key value) table) ; no lock necessary + (when (= value index) (return-from found key)))))))) + (if (listp key) (car key) key))) (declaim (maybe-inline sap-foreign-symbol)) (defun sap-foreign-symbol (sap) From 66bcc4c6d27a31c3302512b894526cc74dc7029c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 12 Sep 2022 16:07:13 -0400 Subject: [PATCH 3963/4023] Remove a distinction without a difference pprint-data-list from rev 230707c189 is currently identical to pprint-fill. Absent any tests, I don't know whether it was trying to print differently. --- src/code/pprint.lisp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/code/pprint.lisp b/src/code/pprint.lisp index 1eb5a977c3..9c340a870d 100644 --- a/src/code/pprint.lisp +++ b/src/code/pprint.lisp @@ -1344,10 +1344,6 @@ line break." stream list)) -(defun pprint-data-list (stream list &rest noise) - (declare (ignore noise)) - (pprint-fill stream list)) - ;;; Return the number of positional arguments that macro NAME accepts ;;; by looking for &BODY. A dotted list is indented as it it had &BODY. ;;; ANSI says that a dotted tail is like &REST, but the pretty-printer @@ -1535,7 +1531,6 @@ line break." ;; but that's unspecified behavior. (SATISFIES FBOUNDP) must be _strictly_ ;; lower than the default cons entries though. (initial-entry (cons (and symbol (satisfies fboundp))) pprint-call-form -1) - (initial-entry (cons symbol) pprint-data-list -2) (initial-entry cons pprint-fill -2 #'consp) (initial-entry sb-impl::comma pprint-unquoting-comma -3 #'comma-p))) (*print-pprint-dispatch* From 72c1002c1a4eb8c9d487270b91f43d68647a6b12 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 12 Sep 2022 18:54:21 -0400 Subject: [PATCH 3964/4023] Add fboundp transform --- src/compiler/srctran.lisp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 53a293405c..cfb935a8e0 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -5175,6 +5175,12 @@ (t (give-up-ir1-transform))))) +;;; Add transforms in reverse of the order you want them tried +;;; (because of stupid semantics) +(deftransform fboundp ((symbol) (symbol)) + `(let ((fdefn (sb-vm::%symbol-fdefn symbol))) + (and (not (eq fdefn 0)) + (fdefn-fun (truly-the fdefn fdefn))))) ;;; Normally we don't create fdefns by side-effect of calling FBOUNDP, ;;; but this transform is neutral in terms of the sum of code and data size. ;;; So for the cost of an FDEFN that might never store a function, the code From 5adcb3f9ff2a824f97c2ccce520364ed934c25f2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Mon, 12 Sep 2022 19:06:43 -0400 Subject: [PATCH 3965/4023] Remove initial-p slot of pprint dispatch entry Using a boolean slot to indicate lowest priority in ENTRY< was overkill. People seem to prefer small rationals for these, and priority only matters if multiple entries match. So just use most-negative-single-float or minus infinity for builtin entries, which are either non-intersecting, or else scanned in the proper order. --- src/code/pprint.lisp | 57 ++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/src/code/pprint.lisp b/src/code/pprint.lisp index 9c340a870d..c4d66e3d9f 100644 --- a/src/code/pprint.lisp +++ b/src/code/pprint.lisp @@ -738,11 +738,9 @@ line break." ;; either (LAMBDA (OBJ) (TYPEP OBJECT TYPE)) or a builtin predicate. ;; We don't bother computing this for entries in the CONS ;; hash table, because we don't need it. - (test-fn nil :type (or function null)) + (test-fn #'bug :type function) ;; the priority for this guy (priority 0 :type real :read-only t) - ;; T iff one of the original entries. - (initial-p (null *initial-pprint-dispatch-table*) :type boolean :read-only t) ;; and the associated function (fun nil :type function-designator :read-only t)) @@ -750,26 +748,19 @@ line break." (defmethod print-object ((entry pprint-dispatch-entry) stream) (print-unreadable-object (entry stream :type t) - (format stream "type=~S, priority=~S~@[ [initial]~]" + (format stream "type=~S, priority=~S]" (pprint-dispatch-entry-type entry) - (pprint-dispatch-entry-priority entry) - (pprint-dispatch-entry-initial-p entry)))) + (pprint-dispatch-entry-priority entry)))) (defmethod print-object ((table pprint-dispatch-table) stream) (print-unreadable-object (table stream :type t :identity t))) ;; Return T iff E1 is strictly less preferable than E2. +(declaim (inline entry<)) (defun entry< (e1 e2) (declare (type pprint-dispatch-entry e1 e2)) - (if (pprint-dispatch-entry-initial-p e1) - (if (pprint-dispatch-entry-initial-p e2) - (< (pprint-dispatch-entry-priority e1) - (pprint-dispatch-entry-priority e2)) - t) - (if (pprint-dispatch-entry-initial-p e2) - nil - (< (pprint-dispatch-entry-priority e1) - (pprint-dispatch-entry-priority e2))))) + (< (pprint-dispatch-entry-priority (truly-the pprint-dispatch-entry e1)) + (pprint-dispatch-entry-priority (truly-the pprint-dispatch-entry e2)))) ;; Return the predicate for CTYPE, equivalently TYPE-SPEC. ;; This used to involve rewriting into a sexpr if CONS was involved, @@ -840,13 +831,17 @@ line break." (let ((cons-entry (and (consp object) (sb-impl::gethash/eql (car object) (pp-dispatch-cons-entries table) nil)))) - (cond ((not cons-entry) + (cond ((not cons-entry) ; impossible, unless you've removed all initial cons entries (dovector (entry (pp-dispatch-entries table) nil) - (when (funcall (pprint-dispatch-entry-test-fn entry) object) + (when (funcall (pprint-dispatch-entry-test-fn + (truly-the pprint-dispatch-entry entry)) + object) (return entry)))) ((pp-dispatch-only-initial-entries table) cons-entry) (t + ;; This gives cons entries precedence over non-cons entries that have + ;; the same numerical priority. (dovector (entry (pp-dispatch-entries table) cons-entry) (when (entry< entry cons-entry) (return cons-entry)) @@ -906,8 +901,9 @@ line break." (entry (if function (make-pprint-dispatch-entry type priority function - (unless (or consp disabled-p) - (compute-test-fn ctype type function)))))) + (if (or consp disabled-p) + #'bug + (compute-test-fn ctype type function)))))) (when (and function disabled-p) ;; a DISABLED-P test function has to close over the ENTRY (setf (pprint-dispatch-entry-test-fn entry) (defer-type-checker entry))) @@ -932,6 +928,7 @@ line break." (merge 'vector old (list entry) (lambda (a b) (entry< b a))) old))))) nil) +(clear-info :function :inlining-data 'entry<) ; can be removed ;;;; standard pretty-printing routines @@ -1494,9 +1491,10 @@ line break." ;;; -> (sb-kernel::parse-args-types ...) ;;; -> (sb-kernel::%parse-type CLASS) ;;; where the type specifier for CLASS is as yet unknown -(defmacro initial-entry (specifier handler priority &optional predicate) +(defmacro initial-entry (specifier handler &optional predicate) + ;; Assign the lowest possible priority `(make-pprint-dispatch-entry - ',specifier ,priority #',handler + ',specifier single-float-negative-infinity #',handler ,(or predicate `(named-lambda ,(format nil "~A-P" handler) (x) ,(sb-c::source-transform-typep 'x specifier))))) @@ -1523,16 +1521,12 @@ line break." ;; * PLEASE NOTE : If you change these definitions, then you may need to adjust ;; the computation of POSSIBLY-MATCHABLE in PPRINT-DISPATCH. ;; - ;; Assign a lower priority than for the cons entries below, making - ;; fewer type tests when dispatching. - (initial-entry (and array (not (or string bit-vector))) - pprint-array -1) ;; The implementation happens to check identical priorities in the order added, - ;; but that's unspecified behavior. (SATISFIES FBOUNDP) must be _strictly_ - ;; lower than the default cons entries though. - (initial-entry (cons (and symbol (satisfies fboundp))) pprint-call-form -1) - (initial-entry cons pprint-fill -2 #'consp) - (initial-entry sb-impl::comma pprint-unquoting-comma -3 #'comma-p))) + ;; but that's unspecified behavior. + (initial-entry (and array (not (or string bit-vector))) pprint-array) + (initial-entry (cons (and symbol (satisfies fboundp))) pprint-call-form) + (initial-entry cons pprint-fill #'consp) + (initial-entry sb-impl::comma pprint-unquoting-comma #'comma-p))) (*print-pprint-dispatch* (make-pprint-dispatch-table initial-entries nil nil))) ;; cons cells with interesting things for the car @@ -1587,7 +1581,8 @@ line break." ;; Grouping some symbols together in the above list looks pretty. ;; The sharing of dispatch entries is inconsequential. (set-pprint-dispatch `(cons (member ,@(ensure-list (first magic-form)))) - (second magic-form))) + (second magic-form) + most-negative-single-float)) (setf (pp-dispatch-only-initial-entries *print-pprint-dispatch*) t *initial-pprint-dispatch-table* *print-pprint-dispatch*)) From 489ef75f098173c4be243011a87a7d883754e7ac Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 13 Sep 2022 17:12:53 +0300 Subject: [PATCH 3966/4023] Fix vector-push-extend. blt-copier-for-widetag is expected to return NIL but was returning 0. --- src/code/array.lisp | 3 ++- tests/array.pure.lisp | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index 1bef0dcb29..b54a0cd82d 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -1166,7 +1166,8 @@ of specialized arrays is supported." (declare ((mod 256) x)) (aref (load-time-value (map-into (make-array 32) - (lambda (x) (if x (symbol-function x) 0)) + (lambda (x) (and x + (symbol-function x))) '#.(let ((a (make-array 32 :initial-element nil))) (dovector (saetp *specialized-array-element-type-properties* a) (when (and (not (member (saetp-specifier saetp) '(t nil))) diff --git a/tests/array.pure.lisp b/tests/array.pure.lisp index 6083d991a6..e5d290be1f 100644 --- a/tests/array.pure.lisp +++ b/tests/array.pure.lisp @@ -685,3 +685,22 @@ `(lambda () (typep "abcd" '(simple-array t 2))) (() nil))) + +(with-test (:name :vector-push-extend-specialized) + (let ((extend (checked-compile `(lambda (e a) + (vector-push-extend e a) + a)))) + (loop for saetp across sb-vm:*specialized-array-element-type-properties* + for type = (sb-vm:saetp-specifier saetp) + when type + do + (let* ((value (sb-vm:saetp-initial-element-default saetp)) + (value (if (characterp value) + (code-char (1+ (char-code value))) + (1+ value)))) + (assert (eql (aref (funcall extend value (make-array 1 :element-type type + :adjustable t + :fill-pointer t)) + 1) + value)) + )))) From 1c4870f394e62acc0da7f291d20643a9e01dbbcc Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 13 Sep 2022 12:34:01 -0400 Subject: [PATCH 3967/4023] Skip a safety check in handler-bind (handler-bind ((c #'handler)) ...) won't check if #'handler is defined except in safe code. It's not even clear that the spec mandates eager checking. --- src/code/error.lisp | 44 +++++++++++++++---------------------- tests/condition-2.pure.lisp | 1 + 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/code/error.lisp b/src/code/error.lisp index c0d8931cbc..940e719022 100644 --- a/src/code/error.lisp +++ b/src/code/error.lisp @@ -85,18 +85,15 @@ ((info :function :info name) ; known ;; This takes care of CONTINUE,ABORT,MUFFLE-WARNING. ;; #' will be evaluated in the null environment. - `(load-time-value - (cons ,test (the (function-designator (condition)) #',name)) - t)) + `(load-time-value (cons ,test (the (function (condition)) #',name)) + t)) (t - ;; For each handler specified as #'F we must verify - ;; that F is fboundp upon entering the binding scope. - ;; Referencing #'F is enough to ensure a warning if the - ;; function isn't defined at compile-time, but the - ;; compiler considers it elidable unless something forces - ;; an apparent use of the form at runtime, - ;; so instead use SAFE-FDEFN-FUN on the fdefn. - (when (eq (car handler) 'function) + ;; The CLHS writeup of HANDLER-BIND says "Exceptional Situations: None." + ;; which might suggest that it's not an error if #'HANDLER is un-fboundp + ;; on entering the body, but we should check in safe code. + (when (and (eq (car handler) 'function) (sb-c:policy env (= safety 3))) + ;; Referencing #'F is enough to get a compile-time warning about unknown + ;; functions, but the use itself is flushable, so employ SAFE-FDEFN-FUN. (dummy-forms `(sb-c:safe-fdefn-fun (load-time-value (find-or-create-fdefn ',name) t)))) @@ -131,22 +128,17 @@ ;; always an eligible handler. '#'constantly-t) ((typep type '(cons (eql satisfies) (cons symbol null))) - ;; (SATISFIES F) => #'F but never a local - ;; definition of F. The predicate is used only - ;; if needed - it's not an error if not fboundp - ;; (though dangerously stupid) - so just - ;; reference #'F for the compiler to see the - ;; use of the name. But (KLUDGE): since the - ;; ref is to force a compile-time effect, the - ;; interpreter should not see that form, - ;; because there is no way for it to perform an - ;; unsafe ref, (and it wouldn't signal a - ;; style-warning anyway), and so it would - ;; actually fail immediately if predicate were - ;; not defined. + ;; (SATISFIES F) => #'F but never a local definition of F. + ;; The predicate is used only if needed - it's not an error if not + ;; fboundp (though dangerously stupid) - so reference #'F for the + ;; compiler to see the use of the name. But (KLUDGE): since the + ;; ref is to force a compile-time effect, the interpreter should not + ;; see that form, because there is no way for it to perform an + ;; unsafe ref, and it wouldn't signal a style-warning anyway. (let ((name (second type))) - (when (typep env 'lexenv) - (dummy-forms `#',name)) + ;; FIXME: if you've locally flet NAME (why would you do that?) + ;; then this does not notice the use of the global function. + (when (typep env 'lexenv) (dummy-forms `#',name)) `',name)) ((and (symbolp type) (condition-classoid-p (find-classoid type nil))) diff --git a/tests/condition-2.pure.lisp b/tests/condition-2.pure.lisp index 706623561d..74d3f01484 100644 --- a/tests/condition-2.pure.lisp +++ b/tests/condition-2.pure.lisp @@ -497,6 +497,7 @@ ;; the real handler function. (defun this-should-fail () (declare (muffle-conditions style-warning)) + (declare (optimize safety)) (handler-bind ((condition #'some-nonexistent-handler)) (random 100))) From 99eda33b7e1568c5258e4f4234e3479ae1f1a2a9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 13 Sep 2022 19:47:51 +0300 Subject: [PATCH 3968/4023] x86-64: fix disassemble annotation. Perform a bounds check. --- src/compiler/x86-64/target-insts.lisp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index e742ac1f74..c4bbb87054 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -496,7 +496,9 @@ (zerop (logand disp 7))) ; lispword-aligned (let* ((index (ash disp -3)) (symbol (cond ((minusp index) - (aref sb-vm::+thread-header-slot-names+ (1- (- index)))) + (let ((index (1- (- index)))) + (when (array-in-bounds-p sb-vm::+thread-header-slot-names+ index) + (aref sb-vm::+thread-header-slot-names+ index)))) ((< index (length thread-slot-names)) (aref thread-slot-names index))))) (when symbol From e6fa7754521c6baf72508568f7d0e999653e3171 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 13 Sep 2022 19:50:41 +0300 Subject: [PATCH 3969/4023] Fix cold-init for -sb-unicode. Define blt-copier-for-widetag early enough. --- src/code/array.lisp | 16 ---------------- src/code/defsetfs.lisp | 18 ++++++++++++++++++ tests/array.pure.lisp | 5 ++--- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/code/array.lisp b/src/code/array.lisp index b54a0cd82d..f4b56ea573 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -1162,22 +1162,6 @@ of specialized arrays is supported." (setf (%array-fill-pointer array) (1+ fill-pointer)) fill-pointer)))) -(defun blt-copier-for-widetag (x) - (declare ((mod 256) x)) - (aref (load-time-value - (map-into (make-array 32) - (lambda (x) (and x - (symbol-function x))) - '#.(let ((a (make-array 32 :initial-element nil))) - (dovector (saetp *specialized-array-element-type-properties* a) - (when (and (not (member (saetp-specifier saetp) '(t nil))) - (<= (saetp-n-bits saetp) n-word-bits)) - (setf (svref a (ash (- (saetp-typecode saetp) 128) -2)) - (intern (format nil "UB~D-BASH-COPY" (saetp-n-bits saetp)) - "SB-KERNEL")))))) - t) - (ash (logand x #x7f) -2))) - (defun extend-vector (vector min-extension) (declare (optimize speed) (vector vector)) diff --git a/src/code/defsetfs.lisp b/src/code/defsetfs.lisp index d50f6f1b80..ec1b444d00 100644 --- a/src/code/defsetfs.lisp +++ b/src/code/defsetfs.lisp @@ -358,3 +358,21 @@ with bits from the corresponding position in the new value." (defun 1-arg-t (a) (declare (ignore a)) t) (defun 2-arg-nil (a b) (declare (ignore a b)) nil) (defun 3-arg-nil (a b c) (declare (ignore a b c)) nil) + +(in-package "SB-VM") + +(defun blt-copier-for-widetag (x) + (declare ((mod 256) x)) + (aref (load-time-value + (map-into (make-array 32) + (lambda (x) (and x + (symbol-function x))) + '#.(let ((a (make-array 32 :initial-element nil))) + (dovector (saetp *specialized-array-element-type-properties* a) + (when (and (not (member (saetp-specifier saetp) '(t nil))) + (<= (saetp-n-bits saetp) n-word-bits)) + (setf (svref a (ash (- (saetp-typecode saetp) 128) -2)) + (intern (format nil "UB~D-BASH-COPY" (saetp-n-bits saetp)) + "SB-KERNEL")))))) + t) + (ash (logand x #x7f) -2))) diff --git a/tests/array.pure.lisp b/tests/array.pure.lisp index e5d290be1f..bf913ce2a6 100644 --- a/tests/array.pure.lisp +++ b/tests/array.pure.lisp @@ -693,7 +693,7 @@ (loop for saetp across sb-vm:*specialized-array-element-type-properties* for type = (sb-vm:saetp-specifier saetp) when type - do + do (let* ((value (sb-vm:saetp-initial-element-default saetp)) (value (if (characterp value) (code-char (1+ (char-code value))) @@ -702,5 +702,4 @@ :adjustable t :fill-pointer t)) 1) - value)) - )))) + value)))))) From 0e5a6ee3418c6b7e562906047f8f43b057935773 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 13 Sep 2022 12:59:47 -0400 Subject: [PATCH 3970/4023] Make symbol-function unsafely-flushable --- src/compiler/fndb.lisp | 4 ++-- tests/compiler-2.pure.lisp | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 9cca99594b..3a9456c161 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -122,7 +122,7 @@ ;;; either a macro or a special operator, and if the symbol is fbound, ;;; a function object is returned". Our objects of ;;; implementation-dependent nature happen to be functions. -(defknown (symbol-function) (symbol) function ()) +(defknown (symbol-function) (symbol) function (unsafely-flushable)) (defknown boundp (symbol) boolean (flushable)) (defknown fboundp ((or symbol cons)) (or null function) (unsafely-flushable)) @@ -911,7 +911,7 @@ ;; Correct argument type restrictions for these functions are ;; complicated, so we just declare them to accept LISTs and suppress -;; flushing is safe code. +;; flushing in safe code. (defknown (caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr diff --git a/tests/compiler-2.pure.lisp b/tests/compiler-2.pure.lisp index f7227f4ac6..bf305d9ad8 100644 --- a/tests/compiler-2.pure.lisp +++ b/tests/compiler-2.pure.lisp @@ -171,7 +171,8 @@ (sb-vm:map-allocated-objects #'f :dynamic) 5)))) -(with-test (:name :pack-varints-as-bignum) +(with-test (:name :pack-varints-as-bignum + :skipped-on :interpreter) ; too slow (dotimes (i 500) ; do some random testing this many times (let* ((random-numbers (loop repeat (+ (random 20) 3) collect (1+ (random 4000)))) @@ -3740,3 +3741,12 @@ (eval 1) (eval 2))) (() 1))) + +(defun noflush-symbol-function () + (declare (optimize safety)) + (if (functionp (symbol-function '#:notathing)) 1)) +(defun flush-symbol-function () + (if (functionp (symbol-function '#:notathing)) 1)) +(with-test (:name :flush-symbol-function :skipped-on :interpreter) + (assert (ctu:find-code-constants #'noflush-symbol-function)) + (assert (not (ctu:find-code-constants #'flush-symbol-function)))) From 3100f0aecb8759ea3eab1ac9a11fe2830ee4db6d Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 13 Sep 2022 20:48:28 +0300 Subject: [PATCH 3971/4023] Mark an ansi test as failing. --- tests/ansi-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ansi-tests.sh b/tests/ansi-tests.sh index 958c2b5e1a..5395631f1c 100755 --- a/tests/ansi-tests.sh +++ b/tests/ansi-tests.sh @@ -41,7 +41,7 @@ rm -fr sandbox/scratch "SHIFTF.7" "SUBTYPEP-COMPLEX.8" "SUBTYPEP.EQL.1" "SUBTYPEP.EQL.2" "SUBTYPEP.MEMBER.17" "SUBTYPEP.MEMBER.18" - "SXHASH.17" "SXHASH.18" "SXHASH.19" "PRINT-STRUCTURE.1" + "SXHASH.17" "SXHASH.18" "SXHASH.19" "PRINT-STRUCTURE.1" "SYMBOL-FUNCTION.ERROR.5" (append #+win32 (list "EXP.ERROR.7" "EXPT.ERROR.4" "EXPT.ERROR.5" "EXPT.ERROR.6" "EXPT.ERROR.7" "PROBE-FILE.4") From a1e8ff8e72145a9dca8c37a54472eb85d3015901 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 13 Sep 2022 21:48:45 +0300 Subject: [PATCH 3972/4023] Mark an ansi test as sometimes not failing. --- tests/ansi-tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ansi-tests.sh b/tests/ansi-tests.sh index 5395631f1c..6c345df75a 100755 --- a/tests/ansi-tests.sh +++ b/tests/ansi-tests.sh @@ -41,7 +41,7 @@ rm -fr sandbox/scratch "SHIFTF.7" "SUBTYPEP-COMPLEX.8" "SUBTYPEP.EQL.1" "SUBTYPEP.EQL.2" "SUBTYPEP.MEMBER.17" "SUBTYPEP.MEMBER.18" - "SXHASH.17" "SXHASH.18" "SXHASH.19" "PRINT-STRUCTURE.1" "SYMBOL-FUNCTION.ERROR.5" + "SXHASH.17" "SXHASH.18" "SXHASH.19" "PRINT-STRUCTURE.1" #-sb-fasteval "SYMBOL-FUNCTION.ERROR.5" (append #+win32 (list "EXP.ERROR.7" "EXPT.ERROR.4" "EXPT.ERROR.5" "EXPT.ERROR.6" "EXPT.ERROR.7" "PROBE-FILE.4") From e3870baa3863f9ed0932e83ede18a35cca539e2b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Tue, 13 Sep 2022 22:51:17 +0300 Subject: [PATCH 3973/4023] ansi-tests.sh: correctly detect sb-fasteval --- tests/ansi-tests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ansi-tests.sh b/tests/ansi-tests.sh index 6c345df75a..088181b396 100755 --- a/tests/ansi-tests.sh +++ b/tests/ansi-tests.sh @@ -41,7 +41,7 @@ rm -fr sandbox/scratch "SHIFTF.7" "SUBTYPEP-COMPLEX.8" "SUBTYPEP.EQL.1" "SUBTYPEP.EQL.2" "SUBTYPEP.MEMBER.17" "SUBTYPEP.MEMBER.18" - "SXHASH.17" "SXHASH.18" "SXHASH.19" "PRINT-STRUCTURE.1" #-sb-fasteval "SYMBOL-FUNCTION.ERROR.5" + "SXHASH.17" "SXHASH.18" "SXHASH.19" "PRINT-STRUCTURE.1" (append #+win32 (list "EXP.ERROR.7" "EXPT.ERROR.4" "EXPT.ERROR.5" "EXPT.ERROR.6" "EXPT.ERROR.7" "PROBE-FILE.4") @@ -52,7 +52,7 @@ rm -fr sandbox/scratch (list "INTERSECTION.FOLD.1" "UNION.FOLD.1" "SET-DIFFERENCE.FOLD.1" "SET-EXCLUSIVE-OR.FOLD.1" "ASH.ERROR.5" "ALL-STRUCTURE-CLASSES-ARE-SUBTYPES-OF-STRUCTURE-OBJECT.2" "TRACE.8") - (list "MAP.48")) + (list "MAP.48" "SYMBOL-FUNCTION.ERROR.5")) #+sb-unicode (list "BOTH-CASE-P.2" "CHAR-DOWNCASE.2" "CHAR-UPCASE.2")))) (failing (remove "FORMAT.E.26" From f853bd3989555ce37d7eea2666f85e7ee0add74b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 13 Sep 2022 17:04:20 -0400 Subject: [PATCH 3974/4023] win32: fix %primitive print --- src/compiler/x86-64/show.lisp | 20 ++++++++++---------- src/runtime/backtrace.c | 1 + 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/compiler/x86-64/show.lisp b/src/compiler/x86-64/show.lisp index df25fc2bcd..df8dd7761c 100644 --- a/src/compiler/x86-64/show.lisp +++ b/src/compiler/x86-64/show.lisp @@ -14,27 +14,27 @@ (define-vop (print) (:args (object :scs (descriptor-reg any-reg) - :target rdi)) + :target c-arg)) (:temporary (:sc unsigned-reg - :offset rdi-offset + :offset #+win32 rcx-offset #-win32 rdi-offset :from :eval) - rdi) + c-arg) (:temporary (:sc unsigned-reg :offset rax-offset :target result :from :eval :to (:result 0)) rax) - (:temporary (:sc unsigned-reg) call-target) + (:temporary (:sc unsigned-reg) rsp-save) (:results (result :scs (descriptor-reg))) (:save-p t) (:generator 100 - (move rdi object) - (inst mov call-target rsp-tn) ; save RSP temporarily elsewhere + (move c-arg object) + (inst mov rsp-save rsp-tn) ; save RSP temporarily elsewhere (inst and rsp-tn -16) ; align as required for ABI - (inst push call-target) ; push twice to preserve alignment - (inst push call-target) - (inst mov call-target (make-fixup "debug_print" :foreign)) - (inst call call-target) + (inst push rsp-save) ; push twice to preserve alignment + (inst push rsp-save) + #+immobile-space (inst call (make-fixup "debug_print" :foreign)) + #-immobile-space (inst call (ea (make-fixup "debug_print" :foreign 8))) (inst pop rsp-tn) ; restore the original RSP (move result rax))) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 9a64e3c204..881a76766c 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -119,6 +119,7 @@ lispobj debug_print(lispobj string) { print_string(VECTOR(string), stderr); putc('\n', stderr); + fflush(stderr); return 0; } From 4cbab87959d34fa816d708e85c6e8773c3a1a40b Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 13 Sep 2022 22:07:58 -0400 Subject: [PATCH 3975/4023] Define a private SETF function for symbol-function which avoids storing FDEFNs in other data structures for the purpose of circumventing a package-lock check or supposed efficiency gain. --- src/code/share-vm.lisp | 21 ++++++++++----------- src/code/symbol.lisp | 10 +++++++--- src/cold/exports.lisp | 1 + src/interpreter/sexpr.lisp | 2 +- src/interpreter/special-forms.lisp | 27 ++++++++++++++------------- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/code/share-vm.lisp b/src/code/share-vm.lisp index 4b1e225d22..5a219583cf 100644 --- a/src/code/share-vm.lisp +++ b/src/code/share-vm.lisp @@ -160,12 +160,11 @@ ,@body) ;; Avoid STATICALLY-LINK-CORE from making it harder to redefine. (proclaim '(notinline ,name)) - (let ((fdefn (find-fdefn ',name)) - (fun (fdefinition ',variant))) - (setf (getf ,(symbolicate '+ cpu-feature '-routines+) fdefn) fun) - ;; Redifinition at run-time. - (when (eq (%fun-name (fdefn-fun fdefn)) ',variant) - (setf (fdefn-fun fdefn) fun)))))) + (let ((fun #',variant)) + (setf (getf ,(symbolicate '+ cpu-feature '-routines+) ',name) fun) + ;; Redefinition at run-time. + (when (eq (%fun-name #',name) ',variant) + (setf (%symbol-function ',name) fun)))))) (defvar *previous-cpu-routines* nil) @@ -174,14 +173,14 @@ ,@(loop for (feature detect) on *cpu-features* by #'cddr collect `(when ,detect - (loop for (fdefn definition) on ,(package-symbolicate "SB-VM" '+ feature '-routines+) + (loop for (symbol definition) on ,(package-symbolicate "SB-VM" '+ feature '-routines+) by #'cddr do - (push (cons fdefn (fdefn-fun fdefn)) + (push (cons symbol (%symbol-function symbol)) *previous-cpu-routines*) - (setf (fdefn-fun fdefn) definition)))))) + (setf (%symbol-function symbol) definition)))))) (defun restore-cpu-specific-routines () - (loop for (fdefn . fun) in *previous-cpu-routines* - do (setf (fdefn-fun fdefn) fun)) + (loop for (symbol . fun) in *previous-cpu-routines* + do (setf (%symbol-function symbol) fun)) (setf *previous-cpu-routines* nil)) diff --git a/src/code/symbol.lisp b/src/code/symbol.lisp index 06f2d57bcb..292720275c 100644 --- a/src/code/symbol.lisp +++ b/src/code/symbol.lisp @@ -107,9 +107,13 @@ distinct from the global value. Can also be SETF." ;;; Return the function binding of SYMBOL or NIL if not fboundp. ;;; Don't strip encapsulations. -(defmacro %symbol-function (symbol) - `(let ((fdefn (sb-vm::%symbol-fdefn ,symbol))) - (if (eql fdefn 0) nil (fdefn-fun (truly-the fdefn fdefn))))) +(declaim (inline %symbol-function)) +(defun %symbol-function (symbol) + (let ((fdefn (sb-vm::%symbol-fdefn symbol))) + (if (eql fdefn 0) nil (fdefn-fun (truly-the fdefn fdefn))))) +(defun (setf %symbol-function) (newval symbol) ; OK to use only if fdefn exists + (let ((fdefn (sb-vm::%symbol-fdefn symbol))) + (setf (fdefn-fun (truly-the fdefn fdefn)) newval))) (defun symbol-function (symbol) "Return SYMBOL's current function definition. Settable with SETF." diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 41acd94a13..2f8d249711 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -2541,6 +2541,7 @@ is a good idea, but see SB-SYS re. blurring of boundaries.") "%MAKE-SYMBOL" "%FUNCALLABLE-INSTANCE-FUN" "SYMBOL-HASH" "SYMBOL-HASH*" "SYMBOL-%INFO" "SYMBOL-DBINFO" "%INFO-REF" + "%SYMBOL-FUNCTION" "EXTENDED-SEQUENCE" "*EXTENDED-SEQUENCE-TYPE*" "EXTENDED-SEQUENCE-P" diff --git a/src/interpreter/sexpr.lisp b/src/interpreter/sexpr.lisp index 0748a830fc..b0327096b0 100644 --- a/src/interpreter/sexpr.lisp +++ b/src/interpreter/sexpr.lisp @@ -1176,7 +1176,7 @@ Test case. ;; to get to the point where fdefns do not store "both" representations ;; of one function pointer, because we can't assume that multi-word CAS ;; is a thing. Or use a mutex (horrible). - (setf (fdefn-fun (find-fdefn fname)) compiled-fun))))) + (setf (%symbol-function fname) compiled-fun))))) (when (fluid-def-p fname) ;; Return a handler that calls FNAME very carefully diff --git a/src/interpreter/special-forms.lisp b/src/interpreter/special-forms.lisp index 0aeecc2748..02be6f013f 100644 --- a/src/interpreter/special-forms.lisp +++ b/src/interpreter/special-forms.lisp @@ -1148,22 +1148,23 @@ (make-proto-fn name)) (multiple-value-bind (kind definition frame-ptr) (find-lexical-fun env name) - (if definition - (if (eq kind :macro) - (not-a-function name) - (hlambda FUNCTION (frame-ptr) (env) - (local-fdefinition frame-ptr env))) + (cond (definition ; lexical function + (if (eq kind :macro) + (not-a-function name) + (hlambda FUNCTION (frame-ptr) (env) + (local-fdefinition frame-ptr env)))) ;; Consider (DEFUN GET-THING () #'THING) - it shouldn't return ;; THING's error trampoline if THING is redefined after ;; GET-THING was called once. - (let ((fdefn (find-or-create-fdefn name))) - (if (symbolp name) ; could be a macro - (hlambda FUNCTION (fdefn) (env) - (declare (ignore env)) - (let ((fun (sb-c:safe-fdefn-fun fdefn))) - (if (sb-impl::macro/special-guard-fun-p fun) - (not-a-function (fdefn-name fdefn)) - fun))) + ((symbolp name) ; could be a macro + (hlambda FUNCTION (name) (env) + (declare (ignore env)) + (let ((fun (%symbol-function name))) + (if (or (not fun) (sb-impl::macro/special-guard-fun-p fun)) + (not-a-function name) + fun)))) + (t + (let ((fdefn (find-or-create-fdefn name))) (hlambda FUNCTION (fdefn) (env) ; could not be a macro (declare (ignore env)) (sb-c:safe-fdefn-fun fdefn))))))))) From e181eaaf27701ee90ee6dc5f42876879458fc777 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 13 Sep 2022 22:50:16 -0400 Subject: [PATCH 3976/4023] Rename n-named-calls to n-fdefns To accord with git rev 9dae557697 which folded two use-cases into one --- src/code/load.lisp | 35 ++++++++++++++----------------- src/compiler/generic/genesis.lisp | 16 +++++++------- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 6a6337fdb8..b73c00de8a 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1162,17 +1162,16 @@ ;; ... | constant0 constant1 ... constantN | DEBUG-INFO | FIXUPS-ITEMS .... || ;; | <--------- n-constants ---------> | | <-- n-fixup-elts -> || (let* ((n-simple-funs (read-unsigned-byte-32-arg (fasl-input-stream))) - (n-named-calls (read-unsigned-byte-32-arg (fasl-input-stream))) + (n-fdefns (read-unsigned-byte-32-arg (fasl-input-stream))) (n-boxed-words (ash header -1)) (n-constants (- n-boxed-words sb-vm:code-constants-offset)) (stack-elts-consumed (+ n-constants 1 n-fixup-elts))) (with-fop-stack ((stack (operand-stack)) ptr stack-elts-consumed) ;; We've already ensured that all FDEFNs the code uses exist. ;; This happened by virtue of calling fop-fdefn for each. - (let ((stack-index (+ ptr (* n-simple-funs sb-vm:code-slots-per-simple-fun)))) - (dotimes (i n-named-calls) - (aver (typep (svref stack stack-index) 'fdefn)) - (incf stack-index))) + (loop for stack-index from (+ ptr (* n-simple-funs sb-vm:code-slots-per-simple-fun)) + repeat n-fdefns + do (aver (typep (svref stack stack-index) 'fdefn))) (binding* (((code total-nwords) (sb-c:allocate-code-object (if (oddp header) :immobile :dynamic) @@ -1181,34 +1180,32 @@ (real-code code) (debug-info (svref stack (+ ptr n-constants)))) (with-writable-code-instructions - (code total-nwords debug-info n-named-calls n-simple-funs) + (code total-nwords debug-info n-fdefns n-simple-funs) :copy (read-n-bytes (fasl-input-stream) (code-instructions code) 0 n-code-bytes) :fixup (sb-c::apply-fasl-fixups code stack (+ ptr (1+ n-constants)) n-fixup-elts real-code)) ;; Don't need the code pinned from here on - (progn - (setf (sb-c::debug-info-source (%code-debug-info code)) - (%fasl-input-partial-source-info (fasl-input))) - ;; Boxed constants can be assigned only after figuring out where the range - ;; of implicitly tagged words is, which requires knowing how many functions - ;; are in the code component, which requires reading the code trailer. - #+darwin-jit (sb-c::assign-code-constants - code (subseq stack ptr (+ ptr n-constants))) - #-darwin-jit - (let* ((header-index sb-vm:code-constants-offset) - (stack-index ptr)) + (setf (sb-c::debug-info-source (%code-debug-info code)) + (%fasl-input-partial-source-info (fasl-input))) + ;; Boxed constants can be assigned only after figuring out where the range + ;; of implicitly tagged words is, which requires knowing how many functions + ;; are in the code component, which requires reading the code trailer. + #+darwin-jit (sb-c::assign-code-constants code (subseq stack ptr (+ ptr n-constants))) + #-darwin-jit + (let* ((header-index sb-vm:code-constants-offset) + (stack-index ptr)) (declare (type index header-index stack-index)) (dotimes (n (* n-simple-funs sb-vm:code-slots-per-simple-fun)) (setf (code-header-ref code header-index) (svref stack stack-index)) (incf header-index) (incf stack-index)) - (dotimes (i n-named-calls) + (dotimes (i n-fdefns) (sb-c::set-code-fdefn code header-index (svref stack stack-index)) (incf header-index) (incf stack-index)) (do () ((>= header-index n-boxed-words)) (setf (code-header-ref code header-index) (svref stack stack-index)) (incf header-index) - (incf stack-index)))) + (incf stack-index))) (when (typep (code-header-ref code (1- n-boxed-words)) '(cons (eql sb-c::coverage-map))) ;; Record this in the global list of coverage-instrumented code. diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 85b6408dcb..ea43a6455e 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -764,17 +764,15 @@ (gen-shift (if (= widetag sb-vm:fdefn-widetag) 8 24))) (write-wordindexed/raw des 0 (logior (ash gen gen-shift) header-word)))) -(defun write-code-header-words (descriptor boxed unboxed n-named-calls) - (declare (ignorable n-named-calls)) +(defun write-code-header-words (descriptor boxed unboxed n-fdefns) + (declare (ignorable n-fdefns)) (let ((total-words (align-up (+ boxed (ceiling unboxed sb-vm:n-word-bytes)) 2))) (write-header-word descriptor (logior (ash total-words sb-vm:code-header-size-shift) sb-vm:code-header-widetag))) (write-wordindexed/raw - descriptor - 1 - (logior #+64-bit (ash n-named-calls 32) - (* boxed sb-vm:n-word-bytes)))) + descriptor 1 + (logior #+64-bit (ash n-fdefns 32) (* boxed sb-vm:n-word-bytes)))) (defun write-header-data+tag (des header-data widetag) (write-header-word des (logior (ash header-data sb-vm:n-widetag-bits) @@ -2753,7 +2751,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (define-cold-fop (fop-load-code (header n-code-bytes n-fixup-elts)) (let* ((n-simple-funs (read-unsigned-byte-32-arg (fasl-input-stream))) - (n-named-calls (read-unsigned-byte-32-arg (fasl-input-stream))) + (n-fdefns (read-unsigned-byte-32-arg (fasl-input-stream))) (n-boxed-words (ash header -1)) (n-constants (- n-boxed-words sb-vm:code-constants-offset)) (stack-elts-consumed (+ n-constants 1 n-fixup-elts)) @@ -2769,7 +2767,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (+ (ash aligned-n-boxed-words sb-vm:word-shift) n-code-bytes) sb-vm:other-pointer-lowtag :code))) (declare (ignorable immobile)) - (write-code-header-words des aligned-n-boxed-words n-code-bytes n-named-calls) + (write-code-header-words des aligned-n-boxed-words n-code-bytes n-fdefns) (write-wordindexed des sb-vm:code-debug-info-slot (svref stack (+ stack-index n-constants))) @@ -2816,7 +2814,7 @@ Legal values for OFFSET are -4, -8, -12, ..." (write-wordindexed des header-index (svref stack stack-index)) (incf header-index) (incf stack-index))) - (dotimes (i n-named-calls) + (dotimes (i n-fdefns) (store-named-call-fdefn des header-index (svref stack stack-index)) (incf header-index) (incf stack-index)) From d52ab278e613fa19955602cfb32dbde5dbec5f85 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Tue, 13 Sep 2022 23:33:52 -0400 Subject: [PATCH 3977/4023] Remove an irrelevant TODO Not done, but would not provide any benefit. --- src/code/x86-64-vm.lisp | 23 +++++++++-------------- src/runtime/x86-64-arch.c | 18 +++++++++--------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/code/x86-64-vm.lisp b/src/code/x86-64-vm.lisp index 296138bf7a..722ef60c08 100644 --- a/src/code/x86-64-vm.lisp +++ b/src/code/x86-64-vm.lisp @@ -224,20 +224,19 @@ #+immobile-code (progn (defconstant trampoline-entry-offset n-word-bytes) -;;; TODO: a simplifying trampoline should be a funcallable-instance, -;;; and not a simple-fun-less piece of code. (defun make-simplifying-trampoline (fun) ;; 'alloc' is compiled after this file so we don't see the derived type. ;; But slam found a conflict on recompile. (let ((code (truly-the (values code-component (integer 0) &optional) (allocate-code-object :dynamic 3 24)))) ; KLUDGE (setf (%code-debug-info code) fun) - (let ((sap (sap+ (code-instructions code) trampoline-entry-offset)) - (ea (+ (logandc2 (get-lisp-obj-address code) lowtag-mask) - (ash code-debug-info-slot word-shift)))) - (setf (sap-ref-32 sap 0) #x058B48 ; REX MOV [RIP-n] - (signed-sap-ref-32 sap 3) (- ea (+ (sap-int sap) 7)); disp - (sap-ref-32 sap 7) #xFD60FF)) ; JMP [RAX-3] + (with-pinned-objects (code) + (let ((sap (sap+ (code-instructions code) trampoline-entry-offset)) + (ea (+ (logandc2 (get-lisp-obj-address code) lowtag-mask) + (ash code-debug-info-slot word-shift)))) + (setf (sap-ref-32 sap 0) #x058B48 ; REX MOV [RIP-n] + (signed-sap-ref-32 sap 3) (- ea (+ (sap-int sap) 7)); disp + (sap-ref-32 sap 7) #xFD60FF))) ; JMP [RAX-3] ;; Verify that the jump table size reads as 0. (aver (zerop (code-jump-table-words code))) ;; It is critical that there be a trailing 'uint16' of 0 in this object @@ -247,10 +246,6 @@ (aver (zerop (code-n-entries code))) code)) -;;; Return T if FUN can't be called without loading RAX with its descriptor. -(defun fun-requires-simplifying-trampoline-p (fun) - (= (%fun-pointer-widetag fun) closure-widetag)) - (defun fdefn-has-static-callers (fdefn) (declare (type fdefn fdefn)) (with-pinned-objects (fdefn) @@ -269,7 +264,7 @@ (values function)) (when (fdefn-has-static-callers fdefn) (remove-static-links fdefn)) - (let ((trampoline (when (fun-requires-simplifying-trampoline-p fun) + (let ((trampoline (when (closurep fun) (make-simplifying-trampoline fun)))) ; a newly made CODE object (with-pinned-objects (fdefn trampoline fun) (let* ((jmp-target @@ -368,7 +363,7 @@ (let* ((fdefn (code-header-ref code (+ fdefns-start i))) (fun (when (fdefn-p fdefn) (fdefn-fun fdefn)))) (when (and (immobile-space-obj-p fun) - (not (fun-requires-simplifying-trampoline-p fun)) + (not (closurep fun)) (not (member (fdefn-name fdefn) *never-statically-link* :test 'equal)) (neq (info :function :inlinep (fdefn-name fdefn)) 'notinline)) (setf any-replacements t (aref replacements i) fun)))) diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 013b368141..bb7b2b514b 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -605,12 +605,12 @@ static __attribute__((unused)) boolean codeblob_p(lispobj ptr) { * Whereis if this were type 1, but we read at (entrypoint - 4*N_WORD_BYTES) first, * then we could perceive random uninitialized bytes of the preceding object. */ -static lispobj entrypoint_to_taggedptr(lispobj* entrypoint) { - if (!entrypoint || points_to_asm_code_p((lispobj)entrypoint)) return 0; +lispobj entrypoint_taggedptr(uword_t entrypoint) { + if (!entrypoint || points_to_asm_code_p(entrypoint)) return 0; // First try - lispobj* phdr = entrypoint - 2; + lispobj* phdr = (lispobj*)(entrypoint - 2*N_WORD_BYTES); if (forwarding_pointer_p(phdr)) { - gc_assert(lowtag_of(forwarding_pointer_value(phdr)) == FUN_POINTER_LOWTAG); + gc_dcheck(lowtag_of(forwarding_pointer_value(phdr)) == FUN_POINTER_LOWTAG); return make_lispobj(phdr, FUN_POINTER_LOWTAG); } int widetag = widetag_of(phdr); @@ -618,7 +618,7 @@ static lispobj entrypoint_to_taggedptr(lispobj* entrypoint) { return make_lispobj(phdr, FUN_POINTER_LOWTAG); } // Second try - phdr = entrypoint - 4; + phdr = (lispobj*)(entrypoint - 4*N_WORD_BYTES); /* It is nearly impossible for forwarding to arise, by this reasoning: * Case A: if some thread references the codeblob that wraps a closure, * then the codeblob is pinned; hence not forwarded. @@ -630,9 +630,9 @@ static lispobj entrypoint_to_taggedptr(lispobj* entrypoint) { * in something, but I tried to make it do so, and couldn't. I was, however, able * to artificially cause forwarding by putting closure trampolines in symbols */ if (forwarding_pointer_p(phdr)) - gc_assert(codeblob_p(forwarding_pointer_value(phdr))); + gc_dcheck(codeblob_p(forwarding_pointer_value(phdr))); else - gc_assert(widetag_of(phdr) == CODE_HEADER_WIDETAG); + gc_dcheck(widetag_of(phdr) == CODE_HEADER_WIDETAG); return make_lispobj(phdr, OTHER_POINTER_LOWTAG); } /* Return the lisp object that fdefn's raw_addr slot jumps to. @@ -643,10 +643,10 @@ static lispobj entrypoint_to_taggedptr(lispobj* entrypoint) { * Some legacy baggage is evident: in the first implementation of immobile fdefns, * an fdefn used a 'jmp rel32' (relative to itself), and so you could decode the * jump target only given the address of the fdefn. That is no longer true; fdefns use - * absolute jumps. Therefore it is possible to call entrypoint_to_taggedptr() with any + * absolute jumps. Therefore it is possible to call entrypoint_taggedptr() with any * raw_addr, whether or not you know the fdefn whence the raw_addr was obtained. */ lispobj decode_fdefn_rawfun(struct fdefn* fdefn) { - return entrypoint_to_taggedptr((lispobj*)fdefn->raw_addr); + return entrypoint_taggedptr((uword_t)fdefn->raw_addr); } #include "genesis/vector.h" From e5a6c90b986e1aea29388d848e091e40b41c219b Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 14 Sep 2022 16:22:01 +0300 Subject: [PATCH 3978/4023] arm64, verify-arg-count: use sub + cmp instead of two cmps. --- src/compiler/arm64/call.lisp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/compiler/arm64/call.lisp b/src/compiler/arm64/call.lisp index 9802f6cc34..d3e44c742f 100644 --- a/src/compiler/arm64/call.lisp +++ b/src/compiler/arm64/call.lisp @@ -658,29 +658,30 @@ (:arg-types positive-fixnum (:constant t) (:constant t)) (:info min max) (:vop-var vop) + (:temporary (:sc unsigned-reg :offset nl0-offset) temp) (:save-p :compute-only) (:generator 3 (let ((err-lab (generate-error-code vop 'invalid-arg-count-error))) (labels ((load-immediate (x) - (add-sub-immediate (fixnumize x))) - (check-min () - (cond ((= min 1) - (inst cbz nargs err-lab)) - ((plusp min) - (inst cmp nargs (load-immediate min)) - (inst b :lo err-lab))))) + (add-sub-immediate (fixnumize x)))) (cond ((eql max 0) (inst cbnz nargs err-lab)) ((not min) (inst cmp nargs (load-immediate max)) (inst b :ne err-lab)) (max - (check-min) - (inst cmp nargs (load-immediate max)) + (if (zerop min) + (setf temp nargs) + (inst sub temp nargs (load-immediate min))) + (inst cmp temp (load-immediate (- max min))) (inst b :hi err-lab)) (t - (check-min))))))) + (cond ((= min 1) + (inst cbz nargs err-lab)) + ((plusp min) + (inst cmp nargs (load-immediate min)) + (inst b :lo err-lab))))))))) ;;;; Local call with unknown values convention return: From 3df0a8aa99876cb5df43853b9a5b2ce38b67e4c5 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Wed, 14 Sep 2022 16:32:43 +0300 Subject: [PATCH 3979/4023] x86-64, verify-arg-count: use lea + cmp instead of two cmps. --- src/compiler/x86-64/call.lisp | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/compiler/x86-64/call.lisp b/src/compiler/x86-64/call.lisp index 74732999c1..48498d4078 100644 --- a/src/compiler/x86-64/call.lisp +++ b/src/compiler/x86-64/call.lisp @@ -1374,6 +1374,7 @@ (:policy :fast-safe) (:args (nargs :scs (any-reg))) (:arg-types positive-fixnum (:constant t) (:constant t)) + (:temporary (:sc unsigned-reg :offset rbx-offset) temp) (:info min max) (:vop-var vop) (:save-p :compute-only) @@ -1381,24 +1382,24 @@ ;; NOTE: copy-more-arg expects this to issue a CMP for min > 1 (let ((err-lab (generate-error-code vop 'invalid-arg-count-error nargs))) - (flet ((check-min () - (cond ((= min 1) - (inst test nargs nargs) - (inst jmp :e err-lab)) - ((plusp min) - (inst cmp nargs (fixnumize min)) - (inst jmp :b err-lab))))) - (cond ((not min) - (if (zerop max) - (inst test nargs nargs) - (inst cmp nargs (fixnumize max))) - (inst jmp :ne err-lab)) - (max - (check-min) - (inst cmp nargs (fixnumize max)) - (inst jmp :a err-lab)) - (t - (check-min))))))) + (cond ((not min) + (if (zerop max) + (inst test nargs nargs) + (inst cmp nargs (fixnumize max))) + (inst jmp :ne err-lab)) + (max + (if (zerop min) + (setf temp nargs) + (inst lea temp (ea (fixnumize (- min)) nargs))) + (inst cmp temp (fixnumize (- max min))) + (inst jmp :a err-lab)) + (t + (cond ((= min 1) + (inst test nargs nargs) + (inst jmp :e err-lab)) + ((plusp min) + (inst cmp nargs (fixnumize min)) + (inst jmp :b err-lab)))))))) ;; Signal an error about an untagged number. ;; These are pretty much boilerplate and could be generic except: From 4cdb5eb89e3b533135cace48dd924c7e41bba7f7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 14 Sep 2022 13:35:16 -0400 Subject: [PATCH 3980/4023] Get *SHOW-NEW-CODE* to work in cold-init So you can put (setq sb-fasl::*show-new-code* 'disassemble) in warm.lisp which added only about 10 seconds to make-target-2 on my setup. --- src/code/initial-method.lisp | 28 ++++++++++++++++++---------- src/code/load.lisp | 30 +++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/code/initial-method.lisp b/src/code/initial-method.lisp index 3c3a1697ba..a0326adacb 100644 --- a/src/code/initial-method.lisp +++ b/src/code/initial-method.lisp @@ -32,7 +32,7 @@ ;;; combination, allowing exactly one primary method. Initial methods ;;; are sorted most-specific-first, so we can stop looking as soon as ;;; a match is found. -(defun initial-call-a-method (gf-name specialized-arg &rest rest) +(defun initial-call-a-method (gf-name emergency-fallback specialized-arg &rest rest) (let* ((methods (the simple-vector (cdr (or (assoc gf-name *!initial-methods*) (error "No methods on ~S" gf-name))))) @@ -60,24 +60,32 @@ (or (find test-wrapper (wrapper-inherits arg-wrapper)) (eq arg-wrapper test-wrapper))))))) methods))) - (if applicable-method - ;; Call using no permutation-vector / no precomputed next method. - (apply (svref applicable-method 2) nil nil specialized-arg rest) - (error "No applicable method for ~S on ~S~%" gf-name - (type-of specialized-arg))))) + (cond (applicable-method + ;; Call using no permutation-vector / no precomputed next method. + (apply (svref applicable-method 2) nil nil specialized-arg rest)) + (emergency-fallback + (apply emergency-fallback specialized-arg rest)) + (t + (error "No applicable method for ~S on ~S~%" gf-name + (type-of specialized-arg)))))) (defun make-load-form (object &optional environment) - (initial-call-a-method 'make-load-form object environment)) + (initial-call-a-method 'make-load-form nil object environment)) (defun print-object (object stream) - (initial-call-a-method 'print-object object stream)) + (flet ((last-ditch-effort (object stream) + ;; Depending on what you're poking at in cold-init it was possible to see + ;; "No applicable method for PRINT-OBJECT on SB-KERNEL::RANDOM-CLASS" + ;; so just print the address and carry on. + (format stream "#<UNPRINTABLE @ #x~X>" (get-lisp-obj-address object)))) + (initial-call-a-method 'print-object #'last-ditch-effort object stream))) (macrolet ((ensure-gfs (names) `(progn ,@(mapcar (lambda (name) - `(defun ,name (x) (initial-call-a-method ',name x))) + `(defun ,name (x) (initial-call-a-method ',name nil x))) names)))) (ensure-gfs (open-stream-p interactive-stream-p input-stream-p output-stream-p stream-element-type))) -(defun close (x &key abort) (initial-call-a-method 'close x :abort abort)) +(defun close (x &key abort) (initial-call-a-method 'close nil x :abort abort)) ;;; FIXME: this no longer holds methods, but it seems to have an effect ;;; on the caching of a discriminating function for PRINT-OBJECT diff --git a/src/code/load.lisp b/src/code/load.lisp index b73c00de8a..b13bd807f2 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -1146,15 +1146,31 @@ #-sb-xc-host (defun possibly-log-new-code (object reason &aux (show *show-new-code*)) (when show - (let ((*print-pretty* nil)) + (let ((size (code-object-size object)) + (fmt "~&New code(~Db,~A): ~A~%") + (file "jit-code.txt") + (*print-pretty* nil)) ;; DISASSEMBLE is for limited debugging only. ;; It may write garbled output if multiple threads - (when (eq show 'disassemble) - (with-open-file (f "jit-code.txt" :direction :output - :if-exists :append :if-does-not-exist :create) - (disassemble object :stream f) - (terpri f))) - (format t "~&New code(~Db,~A): ~A~%" (code-object-size object) reason object))) + ;; I tried WITH-OPEN-STREAM during cold-init and got: + ;; "vicious metacircle: The computation of an effective method of + ;; #<STREAM-FUNCTION COMMON-LISP:CLOSE (2)> for arguments of types + ;; (#<STRUCTURE-CLASS SB-SYS:FD-STREAM>) uses the effective method + ;; being computed." + ;; so just leave the stream open. Or we could call the fd-stream misc routine. + (if (or (eq show 'disassemble) (streamp show)) + (let ((f (if (streamp show) + show + (prog1 + (setq *show-new-code* + (open file :direction :output + :if-exists :append :if-does-not-exist :create)) + (format t "~&; Logging code allocation to ~S~%" file))))) + (format f fmt size reason object) + (disassemble object :stream f) + (terpri f) + (force-output f)) + (format *trace-output* fmt (code-object-size object) reason object)))) object) (define-fop 17 :not-host (fop-load-code ((:operands header n-code-bytes n-fixup-elts))) From d9a12b5de0dbea33726642ea994003a9a6a39609 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 14 Sep 2022 19:11:26 -0400 Subject: [PATCH 3981/4023] x86-64: Rework assembly routine fixups Make a vector of entrypoints in static space so that dynamic-space code can use "CALL [ea]". We don't need to retain the fixup for reapplication if the text space moves on core start. Removes some complexity from rev 7d84b420e0 ("create fewer absolute fixups") but keeps the level of indirection for allocation profiler fixups, because that logic is finicky and needs the CALL to encode in 5 bytes. This gets a little nearer to being able to relocate text space to any address, not just sub-2GB. --- src/assembly/x86-64/support.lisp | 20 ++++--------- src/code/aprof.lisp | 4 +-- src/code/cold-init.lisp | 4 ++- src/code/load.lisp | 1 + src/code/target-load.lisp | 40 +++++++++++++++++++++---- src/compiler/assem.lisp | 9 ++---- src/compiler/generic/genesis.lisp | 42 ++++++++++++++++++--------- src/compiler/x86-64/alloc.lisp | 7 ++--- src/compiler/x86-64/cell.lisp | 6 ++-- src/compiler/x86-64/insts.lisp | 2 +- src/compiler/x86-64/target-insts.lisp | 9 +++++- src/runtime/x86-64-arch.c | 11 +++++-- 12 files changed, 100 insertions(+), 55 deletions(-) diff --git a/src/assembly/x86-64/support.lisp b/src/assembly/x86-64/support.lisp index e54e2a76db..18ec222ab9 100644 --- a/src/assembly/x86-64/support.lisp +++ b/src/assembly/x86-64/support.lisp @@ -17,26 +17,18 @@ (defun uniquify-fixup (name &aux (asmstream *asmstream*)) (or (cdr (assoc name (sb-assem::asmstream-indirection-table asmstream))) (let ((label (gen-label))) - ;; This has to be separate from the :ELSEWHERE section because we could be - ;; emitting code into :ELSEWHERE when requesting a unique label. - (assemble (:indirections) + (assemble (:elsewhere) (emit-label label) (inst jmp (ea (make-fixup name :assembly-routine*)))) (push (cons name label) (sb-assem::asmstream-indirection-table asmstream)) label))) -(defun invoke-asm-routine (inst routine vop &optional uniquify) +(defun invoke-asm-routine (inst routine vop) (declare (ignorable vop)) - (let ((fixup - (cond ((sb-c::code-immobile-p vop) - (make-fixup routine :assembly-routine)) - (uniquify - (uniquify-fixup routine)) - (t - (ea (make-fixup routine :assembly-routine*)))))) - (ecase inst - (jmp (inst jmp fixup)) - (call (inst call fixup))))) + (inst* (the (member jmp call) inst) + (if (sb-c::code-immobile-p vop) + (make-fixup routine :assembly-routine) + (ea (make-fixup routine :assembly-routine*))))) (defun generate-call-sequence (name style vop options) (declare (ignore options)) diff --git a/src/code/aprof.lisp b/src/code/aprof.lisp index bbc6e60c65..8814cc94ca 100644 --- a/src/code/aprof.lisp +++ b/src/code/aprof.lisp @@ -431,9 +431,7 @@ ;; Expect an increment of the allocation point hit counter (let* ((inst (get-instruction iterator)) (ea (third inst))) ; (INC :qword EA) - (when (and (eq (car inst) 'inc) - (machine-ea-base ea) - (null (machine-ea-index ea))) + (when (and (eq (car inst) 'inc) (machine-ea-base ea) (null (machine-ea-index ea))) (incf (car iterator)) (let ((profiler-base (machine-ea-base ea)) (profiler-index (machine-ea-disp ea))) diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index e8798df3fb..b1ebef38dc 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -210,6 +210,8 @@ (show-and-call !type-cold-init) (show-and-call !policy-cold-init-or-resanify) (/show0 "back from !POLICY-COLD-INIT-OR-RESANIFY") + (show-and-call !loader-cold-init) + #+x86-64 (sb-fasl::validate-asm-routine-vector) ;; Must be done before toplevel forms are invoked ;; because a toplevel defstruct will need to add itself @@ -271,7 +273,6 @@ (mapcar #'proclaim sb-c::*queued-proclaims*) (makunbound 'sb-c::*queued-proclaims*) - (show-and-call !loader-cold-init) (show-and-call os-cold-init-or-reinit) (show-and-call !pathname-cold-init) @@ -394,6 +395,7 @@ process to continue normally." ;; can be called, as pretty much anything can assume that it is set. (when total ; newly started process, and not a failed save attempt (sb-thread::init-main-thread) + #+x86-64 (sb-fasl::validate-asm-routine-vector) (rebuild-package-vector)) ;; Initializing the standard streams calls ALLOC-BUFFER which calls FINALIZE (finalizers-reinit) diff --git a/src/code/load.lisp b/src/code/load.lisp index b13bd807f2..846bf54c2f 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -139,6 +139,7 @@ ;;; Lisp assembler routines are named by Lisp symbols, not strings, ;;; and so can be compared by EQ. (define-load-time-global *assembler-routines* nil) +(define-load-time-global *asm-routine-vector* nil) #-sb-xc-host (declaim (code-component *assembler-routines*)) ;;; Output the current number of semicolons after a fresh-line. diff --git a/src/code/target-load.lisp b/src/code/target-load.lisp index fddd86e51d..6bc60cde8e 100644 --- a/src/code/target-load.lisp +++ b/src/code/target-load.lisp @@ -363,13 +363,26 @@ (defvar *!initial-assembler-routines*) (defun get-asm-routine (name &optional indirect &aux (code *assembler-routines*)) + ;; INDIRECT means we want the address of a word containing the address + ;; of the routine. Only 2 of our architectures use that form. + #-(or x86 x86-64) (aver (not indirect)) (awhen (the list (gethash (the symbol name) (%code-debug-info code))) - (sap-int (sap+ (code-instructions code) - (if indirect - ;; Return the address containing the routine address - (ash (cddr it) sb-vm:word-shift) - ;; Return the routine address itself - (car it)))))) + (destructuring-bind (start end . index) it + (declare (ignore end)) + (let ((insts (code-instructions code))) + (if indirect + (let ((offset (ash index sb-vm:word-shift))) + (declare (ignorable offset)) + ;; the address is in the "external" static-space jump table + #+x86-64 (+ (get-lisp-obj-address *asm-routine-vector*) + (ash sb-vm:vector-data-offset sb-vm:word-shift) + ;; offset is biased by 1 word, accounting for the jump-table-count + ;; at the first word in code-instructions. So unbias it. + (- offset sb-vm:n-word-bytes sb-vm:other-pointer-lowtag)) + #+x86 ; the address is in the "internal" jump table + (sap-int (sap+ insts offset))) + ;; Return the direct address + (sap-int (sap+ insts start))))))) (defun !loader-cold-init () (let* ((code *assembler-routines*) @@ -388,6 +401,21 @@ ;; store inclusive bounds on PC offset range and the function index (setf (gethash name ht) (list* offset (1- next-offset) (1+ i)))))))) +#+x86-64 +(defun validate-asm-routine-vector () + ;; If the jump table in static space does not match the jump table + ;; in *assembler-routines*, fix the one one in static space. + ;; It's OK that this is delayed until startup, because code pertinent to + ;; core restart always uses relative jumps to asm code. + (let* ((code *assembler-routines*) + (external-table *asm-routine-vector*) + (insts (code-instructions code)) + (n (hash-table-count (%code-debug-info code)))) + (dotimes (i n) + (unless (= (aref external-table i) 0) + (setf (aref external-table i) + (sap-ref-word insts (ash (1+ i) sb-vm:word-shift))))))) + (defun !warm-load (file) (restart-case (let ((sb-c::*source-namestring* (format nil "SYS:~A" (substitute #\; #\/ file)))) diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index 95b733a43b..cc8e12394b 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -319,7 +319,6 @@ (defstruct asmstream (data-section (make-section) :read-only t) - (indirections-section (make-section) :read-only t) (code-section (make-section) :read-only t) (elsewhere-section (make-section) :read-only t) (data-origin-label (gen-label "data start") :read-only t) @@ -454,8 +453,6 @@ ,(case dest (:code '(asmstream-code-section *asmstream*)) (:elsewhere '(asmstream-elsewhere-section *asmstream*)) - (:indirections - '(asmstream-indirections-section *asmstream*)) (t dest))))) ,@(when vop `((*current-vop* ,vop))) ,@(mapcar (lambda (name) @@ -1502,10 +1499,8 @@ (end-text (gen-label)) (combined (append-sections - (append-sections (asmstream-data-section asmstream) - (append-sections - (asmstream-code-section asmstream) - (asmstream-indirections-section asmstream))) + (append-sections (asmstream-data-section asmstream) + (asmstream-code-section asmstream)) (let ((section (asmstream-elsewhere-section asmstream))) (emit section end-text diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index ea43a6455e..5f11bba42b 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -693,6 +693,7 @@ ;;; a handle on the NIL object (defvar *nil-descriptor*) (defvar *c-callable-fdefn-vector*) +(defvar *asm-routine-vector*) ;;; the head of a list of TOPLEVEL-THINGs describing stuff to be done ;;; when the target Lisp starts up @@ -1892,10 +1893,13 @@ core and return a descriptor to it." ;; and code resides above 4GB. But as the Fundamental Theorem says: ;; any problem can be solved by adding another indirection. #+immobile-code + (progn (setf *c-callable-fdefn-vector* (vector-in-core (make-list (length sb-vm::+c-callable-fdefns+) :initial-element *nil-descriptor*) *static*)) + (setf *asm-routine-vector* (word-vector (make-list 70 :initial-element 0) + *static*))) #-immobile-code (dolist (sym sb-vm::+c-callable-fdefns+) @@ -1965,6 +1969,7 @@ core and return a descriptor to it." (let* ((space *immobile-text*) (wordindex (gspace-free-word-index space)) (words-per-page (/ sb-vm:immobile-card-bytes sb-vm:n-word-bytes))) + (cold-set 'sb-fasl::*asm-routine-vector* *asm-routine-vector*) (loop for i from 0 for sym in sb-vm::+c-callable-fdefns+ do (cold-svset *c-callable-fdefn-vector* i (ensure-cold-fdefn sym))) @@ -2324,17 +2329,18 @@ Legal values for OFFSET are -4, -8, -12, ..." (defun lookup-assembler-reference (symbol &optional (mode :direct)) (let* ((code-component *cold-assembler-obj*) (list *cold-assembler-routines*) + (insts (+ (logandc2 (descriptor-bits code-component) sb-vm:lowtag-mask) + (code-header-bytes code-component))) (offset (or (cdr (assq symbol list)) (error "Assembler routine ~S not defined." symbol)))) - (+ (logandc2 (descriptor-bits code-component) sb-vm:lowtag-mask) - (code-header-bytes code-component) - (ecase mode - (:direct - offset) - (:indirect - ;; add 1 for the prefix word that counts the absolute fixups - (ash (1+ (count-if (lambda (x) (< (cdr x) offset)) list)) - sb-vm:word-shift)))))) + (ecase mode + (:direct (+ insts offset)) + #+(or x86 x86-64) + (:indirect + (let ((index (count-if (lambda (x) (< (cdr x) offset)) list))) + #+x86 (+ insts (ash (1+ index) sb-vm:word-shift)) ; add 1 for the jump table count + #+x86-64 (+ (logandc2 (descriptor-bits *asm-routine-vector*) sb-vm:lowtag-mask) + (ash (+ sb-vm:vector-data-offset index) sb-vm:word-shift))))))) ;;; Unlike in the target, FOP-KNOWN-FUN sometimes has to backpatch. (defvar *deferred-known-fun-refs*) @@ -2882,12 +2888,20 @@ Legal values for OFFSET are -4, -8, -12, ..." (let ((stack (%fasl-input-stack (fasl-input)))) (apply-fixups asm-code stack (fop-stack-pop-n stack n-fixup-elts) n-fixup-elts)) #+(or x86 x86-64) ; fill in the indirect call table - (let ((index (code-header-words asm-code))) + (let ((base (code-header-words asm-code)) + (index 0)) (dolist (item *cold-assembler-routines*) - ;; Preincrement because we skip 1 word for the word containing - ;; the number of absolute fixups that follow. - (write-wordindexed/raw asm-code (incf index) - (lookup-assembler-reference (car item))))))) + ;; Word 0 of code-instructions is the jump table count (the asm routine entrypoints + ;; look to GC exactly like a jump table in any other codeblob) + (let ((entrypoint (lookup-assembler-reference (car item)))) + (write-wordindexed/raw asm-code (+ base index 1) entrypoint) + #+x86-64 + (unless (member (car item) ; these can't be called from compiled Lisp + '(sb-vm::fpr-save sb-vm::save-xmm sb-vm::save-ymm + sb-vm::fpr-restore sb-vm::restore-xmm sb-vm::restore-ymm)) + (write-wordindexed/raw *asm-routine-vector* + (+ sb-vm:vector-data-offset index) entrypoint))) + (incf index))))) ;; The partial source info is not needed during the cold load, since ;; it can't be interrupted. diff --git a/src/compiler/x86-64/alloc.lisp b/src/compiler/x86-64/alloc.lisp index d6ced18ac1..152252c74a 100644 --- a/src/compiler/x86-64/alloc.lisp +++ b/src/compiler/x86-64/alloc.lisp @@ -146,9 +146,8 @@ (push patch-loc (sb-assem::asmstream-alloc-points sb-assem:*asmstream*)) (inst jmp skip-instrumentation) (emit-alignment 3 :long-nop) - (let ((helper (if (integerp size) - 'enable-alloc-counter - 'enable-sized-alloc-counter))) + (let ((helper + (if (integerp size) 'enable-alloc-counter 'enable-sized-alloc-counter))) ;; This jump is always encoded as 5 bytes (inst call (if (or (not node) ; assembly routine (sb-c::code-immobile-p node)) @@ -215,7 +214,7 @@ (if systemp (if (eql type +cons-primtype+) 'sys-list-alloc-tramp 'sys-alloc-tramp) (if (eql type +cons-primtype+) 'list-alloc-tramp 'alloc-tramp)) - node t) + node) (inst pop alloc-tn))) (let* ((NOT-INLINE (gen-label)) (DONE (gen-label)) diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp index f9b0755170..ddb143eee6 100644 --- a/src/compiler/x86-64/cell.lisp +++ b/src/compiler/x86-64/cell.lisp @@ -580,6 +580,7 @@ (:policy :fast-safe) (:translate fdefn-makunbound) (:args (fdefn :scs (descriptor-reg))) + (:temporary (:sc unsigned-reg) temp) (:vop-var vop) (:generator 38 ;; Change the JMP instruction to INT3 so that a trap occurs in the fdefn @@ -595,8 +596,9 @@ ;; and resume at undefined-tramp. However, CALL-SYMBOL jumps via raw-addr if ;; its callable object was not a function. In that case RAX holds a symbol, ;; so we're OK because we can identify the undefined function. - (storew (make-fixup 'undefined-tramp :assembly-routine) - fdefn fdefn-raw-addr-slot other-pointer-lowtag))) + ;; Technically this could be computed using "LEA temp, [RIP-disp]" + (inst mov temp (ea (make-fixup 'undefined-tramp :assembly-routine*))) + (storew temp fdefn fdefn-raw-addr-slot other-pointer-lowtag))) ;;;; binding and unbinding diff --git a/src/compiler/x86-64/insts.lisp b/src/compiler/x86-64/insts.lisp index 66b00bc223..bfb8aaa086 100644 --- a/src/compiler/x86-64/insts.lisp +++ b/src/compiler/x86-64/insts.lisp @@ -3367,7 +3367,7 @@ ((and (eq (fixup-note-kind note) :abs32) (memq flavor '(:fdefn-call :layout :immobile-symbol :symbol-value ; -> fixedobj space - :assembly-routine :assembly-routine* :static-call))) ; -> text space + :static-call))) ; -> text space (push offset abs32-fixups)))))) ;;; Coverage support diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index c4bbb87054..7688dc1277 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -175,7 +175,14 @@ (defun print-jmp-ea (value stream dstate) (cond ((typep value 'machine-ea) - (print-mem-ref :compute value :qword stream dstate)) + (print-mem-ref :ref value :qword stream dstate) + (when (and (null (machine-ea-base value)) + (null (machine-ea-index value)) + (let* ((v sb-fasl::*asm-routine-vector*) + (a (logandc2 (get-lisp-obj-address v) sb-vm:lowtag-mask))) + (<= a (machine-ea-disp value) (1- (+ a (primitive-object-size v)))))) + (let ((target (sap-ref-word (int-sap (machine-ea-disp value)) 0))) + (maybe-note-assembler-routine target t dstate)))) ((null stream) (operand value dstate)) (t (write value :stream stream)))) diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index bb7b2b514b..54206cb44f 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -608,7 +608,7 @@ static __attribute__((unused)) boolean codeblob_p(lispobj ptr) { lispobj entrypoint_taggedptr(uword_t entrypoint) { if (!entrypoint || points_to_asm_code_p(entrypoint)) return 0; // First try - lispobj* phdr = (lispobj*)(entrypoint - 2*N_WORD_BYTES); + lispobj* phdr = (lispobj*)(entrypoint - 2*N_WORD_BYTES); if (forwarding_pointer_p(phdr)) { gc_dcheck(lowtag_of(forwarding_pointer_value(phdr)) == FUN_POINTER_LOWTAG); return make_lispobj(phdr, FUN_POINTER_LOWTAG); @@ -759,7 +759,14 @@ allocation_tracker_counted(uword_t* sp) if (index == 0) index = 2; // reserved overflow counter for fixed-size alloc uword_t disp = index * 8; - int base_reg = word_at_pc >> 56; + int base_reg = -1; + if ((word_at_pc & 0xff) == 0xE8) { + // following is a 1-byte NOP and a dummy "TEST imm8" where the imm8 + // encodes a register number. + base_reg = word_at_pc >> 56; + } else { + lose("Unexpected instruction format @ %p", pc); + } // rewrite call into: LOCK INC QWORD PTR, [Rbase+n] ; opcode = 0xFF / 0 uword_t new_inst = 0xF0 | ((0x48|(base_reg>>3)) << 8) // w + possibly 'b' | (0xFF << 16) | ((0x80L+(base_reg&7)) << 24) | (disp << 32); From 70c2775894e62fa847caf7f296aded5429dad1fb Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Wed, 14 Sep 2022 21:23:50 -0400 Subject: [PATCH 3982/4023] Fix #-immobile-space --- src/code/load.lisp | 2 +- src/code/target-load.lisp | 9 +++++---- src/compiler/generic/genesis.lisp | 12 +++++++----- src/compiler/x86-64/target-insts.lisp | 1 + 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/code/load.lisp b/src/code/load.lisp index 846bf54c2f..2f5eb687da 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -139,7 +139,7 @@ ;;; Lisp assembler routines are named by Lisp symbols, not strings, ;;; and so can be compared by EQ. (define-load-time-global *assembler-routines* nil) -(define-load-time-global *asm-routine-vector* nil) +#+immobile-space (define-load-time-global *asm-routine-vector* nil) #-sb-xc-host (declaim (code-component *assembler-routines*)) ;;; Output the current number of semicolons after a fresh-line. diff --git a/src/code/target-load.lisp b/src/code/target-load.lisp index 6bc60cde8e..a637c002fd 100644 --- a/src/code/target-load.lisp +++ b/src/code/target-load.lisp @@ -374,12 +374,12 @@ (let ((offset (ash index sb-vm:word-shift))) (declare (ignorable offset)) ;; the address is in the "external" static-space jump table - #+x86-64 (+ (get-lisp-obj-address *asm-routine-vector*) - (ash sb-vm:vector-data-offset sb-vm:word-shift) + #+immobile-space (+ (get-lisp-obj-address *asm-routine-vector*) + (ash sb-vm:vector-data-offset sb-vm:word-shift) ;; offset is biased by 1 word, accounting for the jump-table-count ;; at the first word in code-instructions. So unbias it. - (- offset sb-vm:n-word-bytes sb-vm:other-pointer-lowtag)) - #+x86 ; the address is in the "internal" jump table + (- offset sb-vm:n-word-bytes sb-vm:other-pointer-lowtag)) + #-immobile-space ; the address is in the "internal" jump table (sap-int (sap+ insts offset))) ;; Return the direct address (sap-int (sap+ insts start))))))) @@ -407,6 +407,7 @@ ;; in *assembler-routines*, fix the one one in static space. ;; It's OK that this is delayed until startup, because code pertinent to ;; core restart always uses relative jumps to asm code. + #+immobile-space (let* ((code *assembler-routines*) (external-table *asm-routine-vector*) (insts (code-instructions code)) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 5f11bba42b..cb07a51471 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -260,6 +260,7 @@ #+immobile-space (progn + (defvar *asm-routine-vector*) (defvar *immobile-fixedobj*) (defvar *immobile-text*) (defvar *immobile-space-map* nil)) @@ -693,7 +694,6 @@ ;;; a handle on the NIL object (defvar *nil-descriptor*) (defvar *c-callable-fdefn-vector*) -(defvar *asm-routine-vector*) ;;; the head of a list of TOPLEVEL-THINGs describing stuff to be done ;;; when the target Lisp starts up @@ -2338,9 +2338,11 @@ Legal values for OFFSET are -4, -8, -12, ..." #+(or x86 x86-64) (:indirect (let ((index (count-if (lambda (x) (< (cdr x) offset)) list))) - #+x86 (+ insts (ash (1+ index) sb-vm:word-shift)) ; add 1 for the jump table count - #+x86-64 (+ (logandc2 (descriptor-bits *asm-routine-vector*) sb-vm:lowtag-mask) - (ash (+ sb-vm:vector-data-offset index) sb-vm:word-shift))))))) + #-immobile-space + (+ insts (ash (1+ index) sb-vm:word-shift)) ; add 1 for the jump table count + #+immobile-space + (+ (logandc2 (descriptor-bits *asm-routine-vector*) sb-vm:lowtag-mask) + (ash (+ sb-vm:vector-data-offset index) sb-vm:word-shift))))))) ;;; Unlike in the target, FOP-KNOWN-FUN sometimes has to backpatch. (defvar *deferred-known-fun-refs*) @@ -2895,7 +2897,7 @@ Legal values for OFFSET are -4, -8, -12, ..." ;; look to GC exactly like a jump table in any other codeblob) (let ((entrypoint (lookup-assembler-reference (car item)))) (write-wordindexed/raw asm-code (+ base index 1) entrypoint) - #+x86-64 + #+immobile-space (unless (member (car item) ; these can't be called from compiled Lisp '(sb-vm::fpr-save sb-vm::save-xmm sb-vm::save-ymm sb-vm::fpr-restore sb-vm::restore-xmm sb-vm::restore-ymm)) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index 7688dc1277..d4df7bbb14 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -176,6 +176,7 @@ (defun print-jmp-ea (value stream dstate) (cond ((typep value 'machine-ea) (print-mem-ref :ref value :qword stream dstate) + #+immobile-space (when (and (null (machine-ea-base value)) (null (machine-ea-index value)) (let* ((v sb-fasl::*asm-routine-vector*) From 84ee8f84dd5830218cd3a4a2d3bad1044f76410e Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 10:22:52 -0400 Subject: [PATCH 3983/4023] Mark some slots as read-only I was pondering a way to move all code-debug-info to read-only space based on storing nested data as relative pointers. But we actually treat many ":PURE T" structures as read/write, which is a little interesting. --- src/code/defstruct.lisp | 8 +++++++- src/code/huffman.lisp | 6 ++++-- src/code/loop.lisp | 14 +++++++------- src/code/pprint.lisp | 7 ++++--- src/code/stream.lisp | 4 ++-- src/compiler/assem.lisp | 8 ++++---- src/compiler/x86-64/target-insts.lisp | 3 +++ 7 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 7b54ba0c8e..b0f5fa6cee 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -894,7 +894,7 @@ unless :NAMED is also specified."))) (typecase spec (symbol (typecase spec - ((or null (member :conc-name :constructor :copier :predicate :named)) + ((member nil :conc-name :constructor :copier :predicate :named) (warn "slot name of ~S indicates probable syntax error in DEFSTRUCT" spec)) (keyword (style-warn "slot name of ~S indicates possible syntax error in DEFSTRUCT" spec))) @@ -1042,6 +1042,12 @@ unless :NAMED is also specified."))) (when (or rsd-index (neq (dd-type defstruct) 'structure)) (setf always-boundp t safe-p nil))) ; "demote" to unsafe. + ;; Check for writable slots in pure structures + #+nil + (when (dd-pure defstruct) + (unless read-only + (format t "~&structure ~s slot ~s is writable" defstruct name))) + (let* ((gc-ignorable (csubtypep ctype (specifier-type '(or fixnum boolean character diff --git a/src/code/huffman.lisp b/src/code/huffman.lisp index ff9774e656..faa42661c0 100644 --- a/src/code/huffman.lisp +++ b/src/code/huffman.lisp @@ -14,7 +14,8 @@ (defstruct (huffman-node (:constructor make-huffman-node (key weight)) (:copier nil)) - key weight) + (key nil :read-only t) + (weight nil :read-only t)) (defstruct (huffman-pair (:include huffman-node) @@ -26,7 +27,8 @@ (huffman-node-key right))) (weight (+ (huffman-node-weight left) (huffman-node-weight right)))))) - left right) + (left nil :read-only t) + (right nil :read-only t)) (declaim (freeze-type huffman-node)) (defun huffman-weights (corpus) diff --git a/src/code/loop.lisp b/src/code/loop.lisp index 380100767e..e1452da398 100644 --- a/src/code/loop.lisp +++ b/src/code/loop.lisp @@ -290,10 +290,10 @@ code to be loaded. (:constructor !make-loop-universe) (:copier nil) (:predicate nil)) - keywords ; hash table, value = (fn-name . extra-data) - iteration-keywords ; hash table, value = (fn-name . extra-data) - for-keywords ; hash table, value = (fn-name . extra-data) - path-keywords) ; hash table, value = (fn-name . extra-data) + (keywords nil :read-only t) ; hash table, value = (fn-name . extra-data) + (iteration-keywords nil :read-only t) ; hash table, value = (fn-name . extra-data) + (for-keywords nil :read-only t) ; hash table, value = (fn-name . extra-data) + (path-keywords nil :read-only t)) ; hash table, value = (fn-name . extra-data) (declaim (sb-ext:freeze-type loop-universe)) (defmethod print-object ((u loop-universe) stream) (print-unreadable-object (u stream :type t :identity t))) @@ -1073,11 +1073,11 @@ code to be loaded. (defstruct (loop-collector (:copier nil) (:predicate nil)) - name - class + (name nil :read-only t) + (class nil :read-only t) (history nil) (tempvars nil) - specified-type + (specified-type nil :read-only t) dtype (data nil)) ;collector-specific data (declaim (sb-ext:freeze-type loop-collector)) diff --git a/src/code/pprint.lisp b/src/code/pprint.lisp index c4d66e3d9f..7a60ed9635 100644 --- a/src/code/pprint.lisp +++ b/src/code/pprint.lisp @@ -13,20 +13,21 @@ ;;; Ancestral types (defstruct (queued-op (:constructor nil) (:copier nil)) - (posn 0 :type posn)) + (posn 0 :type posn :read-only t)) (defstruct (block-end (:include queued-op) (:copier nil)) - (suffix nil :type (or null simple-string))) + (suffix nil :type (or null simple-string) :read-only t)) (declaim (start-block)) (defstruct (section-start (:include queued-op) (:constructor nil) (:copier nil)) - (depth 0 :type index) + (depth 0 :type index :read-only t) (section-end nil :type (or null newline block-end))) (defstruct (newline (:include section-start) (:copier nil)) (kind (missing-arg) + :read-only t :type (member :linear :fill :miser :literal :mandatory))) (declaim (freeze-type newline) (end-block)) diff --git a/src/code/stream.lisp b/src/code/stream.lisp index 5cb522220f..91bfae5e85 100644 --- a/src/code/stream.lisp +++ b/src/code/stream.lisp @@ -2573,8 +2573,8 @@ benefit of the function GET-OUTPUT-STREAM-STRING." (defstruct (stub-stream (:include ansi-stream) (:constructor %make-stub-stream (direction string))) - direction - string) ; string or nil + (direction nil :read-only t) + (string nil :read-only t)) ; string or nil (defun make-stub-stream (underlying-stream) (multiple-value-bind (direction string) diff --git a/src/compiler/assem.lisp b/src/compiler/assem.lisp index cc8e12394b..d9700192f1 100644 --- a/src/compiler/assem.lisp +++ b/src/compiler/assem.lisp @@ -257,13 +257,13 @@ ;; (second) instruction. ;; ;; instructions whose writes this instruction tries to read - (read-dependencies (make-sset) :type sset) + (read-dependencies (make-sset) :type sset :read-only t) ;; instructions whose writes or reads are overwritten by this instruction - (write-dependencies (make-sset) :type sset) + (write-dependencies (make-sset) :type sset :read-only t) ;; instructions which write what we read or write - (write-dependents (make-sset) :type sset) + (write-dependents (make-sset) :type sset :read-only t) ;; instructions which read what we write - (read-dependents (make-sset) :type sset)) + (read-dependents (make-sset) :type sset :read-only t)) (declaim (freeze-type instruction)) #+sb-show-assem (defvar *inst-ids* (make-hash-table :test 'eq)) #+sb-show-assem (defvar *next-inst-id* 0) diff --git a/src/compiler/x86-64/target-insts.lisp b/src/compiler/x86-64/target-insts.lisp index d4df7bbb14..662c850473 100644 --- a/src/compiler/x86-64/target-insts.lisp +++ b/src/compiler/x86-64/target-insts.lisp @@ -83,6 +83,9 @@ (defun reg-imm-data (dchunk dstate) dchunk (aref (sb-disassem::dstate-filtered-values dstate) 4)) +;;; This structure is logically immutable, except for one problem: +;;; the disassembler recycles instances of it (re-uses the same +;;; one for each successive instruction). See DECODE-MOD-R/M. (defstruct (machine-ea (:copier nil) (:constructor %make-machine-ea)) ;; possible TODO: base,index,scale could be packed thusly in 13 bits: From 1c5f82b95efb7111758ea7f8767ac7cbcae842a7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 11:04:36 -0400 Subject: [PATCH 3984/4023] Shake out a few more symbols Firstly, find-fdefn on a symbol is *not* redundant with having globladb info since the fdefn goes in its own slot. But also the test was wrong because it's trying to check whether the symbol is currently FBOUNDP. Since FDEFNs can't go away, this change finds a little more to remove. In practice, some un-fboundp symbols aren't removed because they have code references, like STREAM-EXTERNAL-FORMAT calling S-%STREAM-EXTERNAL-FORMAT which is defined only if sb-simple-streams gets loaded, etc, etc. --- make-target-2-load.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index c3d65dcfed..cadadfe00b 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -405,7 +405,7 @@ Please check that all strings which were not recognizable to the compiler (lambda (symbol accessibility) (declare (ignore accessibility)) (or (sb-kernel:symbol-%info symbol) - (sb-int:find-fdefn symbol) ; might be redundant with existence of %info, but ok + (sb-kernel:%symbol-function symbol) (and (boundp symbol) (not (keywordp symbol))))) ;; Release mode: retain all symbols satisfying this intricate test #-sb-devel @@ -471,7 +471,7 @@ Please check that all strings which were not recognizable to the compiler (or (eq accessibility :external) (asm-inst-p symbol)) ;; By default, retain any symbol with any attachments (or (sb-kernel:symbol-%info symbol) - (sb-int:find-fdefn symbol) + (sb-kernel:%symbol-function symbol) (and (boundp symbol) (not (keywordp symbol)))))))) :verbose nil :print nil) (unintern 'sb-impl::shake-packages 'sb-impl) From d7ae667370c6d5c8cc66604408e56706752c4bc9 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Thu, 15 Sep 2022 20:22:35 +0300 Subject: [PATCH 3985/4023] Don't derive the type of (truncate float 1) conservatively. --- src/compiler/srctran.lisp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index cfb935a8e0..232ea6b7ee 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -1617,6 +1617,8 @@ ;; are REAL so the result is a REAL. 'real))) +(defvar *conservative-quotient-bound* t) + (defun truncate-derive-type-quot (number-type divisor-type) (let* ((rem-type (rem-result-type number-type divisor-type)) (number-interval (numeric-type->interval number-type)) @@ -1633,11 +1635,16 @@ (interval-high divisor-interval)))) (specifier-type (if (listp res) res 'integer)))) (t - (let ((quot (truncate-quotient-bound - (interval-div number-interval - divisor-interval)))) - (specifier-type `(integer ,(or (interval-low quot) '*) - ,(or (interval-high quot) '*)))))))) + (multiple-value-bind (quot conservative) + (if (and (eql (interval-high divisor-interval) 1) + (eql (interval-low divisor-interval) 1)) + (values number-interval nil) + (values (interval-div number-interval + divisor-interval))) + (let* ((*conservative-quotient-bound* conservative) + (quot (truncate-quotient-bound quot))) + (specifier-type `(integer ,(or (interval-low quot) '*) + ,(or (interval-high quot) '*))))))))) (defun truncate-derive-type-rem (number-type divisor-type) (let* ((rem-type (rem-result-type number-type divisor-type)) @@ -1901,7 +1908,8 @@ (let ((result-sym (gensym))) `(let ((,result-sym ,result)) (,direction ,result-sym - (if (and (floatp ,bound) + (if (and *conservative-quotient-bound* + (floatp ,bound) (/= ,result-sym 0)) 1 0))))) From 29d7019a759bde719711a75f91bd7d9c0b00cde9 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 15:09:34 -0400 Subject: [PATCH 3986/4023] Simplify global function application in fasteval Don't try so hard to be 100% compatible with the compiler in an implementation-defined edge case. See the comment above APPLY-PROBABLY-FUN for more detail. --- src/interpreter/sexpr.lisp | 78 ++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/src/interpreter/sexpr.lisp b/src/interpreter/sexpr.lisp index b0327096b0..27764c75d8 100644 --- a/src/interpreter/sexpr.lisp +++ b/src/interpreter/sexpr.lisp @@ -906,7 +906,7 @@ Test case. (defun tracing-macroexpand-1 (form env &optional (predicate #'fluid-def-p) &aux (original-hook (valid-macroexpand-hook)) expanders) - (unless (allow-macro-redefinition env) + (unless (allow-macro-redef-p env) (return-from tracing-macroexpand-1 (values (macroexpand-1 form env) nil))) (flet ((macroexpand-hook (function form env) @@ -936,7 +936,7 @@ Test case. ;;; Return T if the evaluator should always consider that macros ;;; might be redefined. If NIL then cached expansions are permanent. -(defun allow-macro-redefinition (env) +(defun allow-macro-redef-p (env) (if (policy env (and (= speed 3) (= debug 0) (= safety 0))) nil t)) @@ -1040,56 +1040,60 @@ Test case. (pop tail))))))))) ;;; Apply what is probably a function - it was when the form was digested. -;;; This carefully mimics the compiler's behavior of referencing the -;;; function only after evaluation of its args. In particular, supposing that -;;; BAZ is not defined, this works in compiled code: -;;; (DEFUN FOO () (BAZ (SETF (SYMBOL-FUNCTION 'BAZ) (LAMBDA (X) `(HI ,X))))) +;;; This _might_ or might not mimic the compiler's behavior of referencing the +;;; function only after evaluation of its args. Consider an example: +;;; * (fmakunbound 'g) +;;; * (defun define-g () (setf (symbol-function 'g) #'print) *terminal-io*) +;;; * (defun f (x) (g (- x) (define-g))) +;;; * (f 3) ;;; -;;; Interpreted code needs an explicit check for NIL in an fdefn-fun. -;;; Compiled code doesn't because the 'raw-addr' slot is always -;;; something valid to jump to. -(defun apply-probably-fun (fdefinition args env &aux (n-args 0)) +;;; sb-eval couldn't eval F because #'G is undefined when attempting to eval the +;;; head of the body form in F. But compiled code works fine, as the CAR of a +;;; combination node is accessed last. (Portable code shouldn't rely on that) +;;; +;;; sb-fasteval similarly accepts it the backend has CALL-SYMBOL, but it works +;;; accidentally rather than on purpose now. #'G is looked up to see whether +;;; it is macro and then called normally if not. But if #'G is undefined, then G +;;; is invoked by name so that backtrace shows it. However, if CALL-SYMBOL isn't +;;; a thing, then F will fail at (%COERCE-CALLABLE-FOR-CALL 'G) +;;; It was surprising to me that %COERCE-CALLABLE-FOR-CALL is performed eagerly +;;; where CALL-SYMBOL doesn't exist. I would have figured it would be performed +;;; as late as possible, as if by CALL-SYMBOL. +(defun apply-probably-fun (name args env &aux (n-args 0)) + (declare (symbol name)) (multiple-value-setq (args n-args) (arglist-to-sexprs args)) (macrolet - ((funcall-n (n) - (let* ((arg-names (subseq '(a b c d e) 0 n)) - (bindings - (loop for arg in arg-names for i from 1 repeat n - collect `(,arg - (dispatch - ,(if (= n 1) '(cdr data) `(svref data ,i)) - env))))) - `(hlambda (GLOBAL-CALL ,n) (data) (env sexpr) - (symbol-macrolet ((fdefn ,(case n - (0 'data) - (1 '(car data)) - (t '(svref data 0))))) - (if (re-expand-p) - (digest-form (sexpr-form sexpr) env sexpr) - (let ,bindings - (funcall (sb-c:safe-fdefn-fun fdefn) ,@arg-names))))))) + ((funcall-n (n &aux (s (case n (0 'data) (1 '(car data)) (t '(svref data 0))))) + `(hlambda (GLOBAL-CALL ,n) (data) (env sexpr) + (let* ((symbol (truly-the symbol ,s)) + (function (or (%symbol-function symbol) symbol))) + (if (re-expand-p) + (digest-form (sexpr-form sexpr) env sexpr) + (funcall function + ,@(loop for i from 1 repeat n + collect `(dispatch ,(if (= n 1) '(cdr data) `(svref data ,i)) + env))))))) (generate-switch () `(case n-args - (0 (let ((data fdefinition)) (funcall-n 0))) - (1 (let ((data (cons fdefinition (first args)))) (funcall-n 1))) + (0 (let ((data name)) (funcall-n 0))) + (1 (let ((data (cons name (first args)))) (funcall-n 1))) (t - (let ((data (coerce (cons fdefinition args) 'vector))) + (let ((data (coerce (cons name args) 'vector))) (cases n-args (2 5 funcall-n) (t (hlambda GLOBAL-CALL (data) (env sexpr) (declare (simple-vector data)) - (symbol-macrolet ((fdefn (svref data 0))) + (let* ((symbol (truly-the symbol (svref data 0))) + (function (or (%symbol-function symbol) symbol))) (if (re-expand-p) (digest-form (sexpr-form sexpr) env sexpr) (let* ((arglist (make-list (1- (length data)))) (tail arglist)) - (dotimes (i (1- (length data)) - (apply (sb-c:safe-fdefn-fun fdefn) arglist)) + (dotimes (i (1- (length data)) (apply function arglist)) (rplaca tail (dispatch (svref data (1+ i)) env)) (pop tail))))))))))))) - (if (allow-macro-redefinition env) + (if (allow-macro-redef-p env) (macrolet ((re-expand-p () - '(let ((f (fdefn-fun fdefn))) - (and f (sb-impl::macro/special-guard-fun-p f))))) + '(and (functionp function) (sb-impl::macro/special-guard-fun-p function)))) (generate-switch)) (macrolet ((re-expand-p () nil)) (generate-switch))))) @@ -1181,7 +1185,7 @@ Test case. (when (fluid-def-p fname) ;; Return a handler that calls FNAME very carefully (return-from digest-global-call - (apply-probably-fun (find-or-create-fdefn fname) args env)))) + (apply-probably-fun fname args env)))) ;; Try to recognize (FUNCALL constant-fun ...) ;; This syntax is required when using SETF functions, and it should From 0ea31c088bd0d5cf984ba6b0bf5711d613d4c808 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 15:52:01 -0400 Subject: [PATCH 3987/4023] Remove one fixup flavor "assembly routine, but different" is spelled :ASSEMBLY-ROUTINE* --- src/assembly/ppc64/assem-rtns.lisp | 2 +- src/assembly/ppc64/support.lisp | 4 ++-- src/assembly/ppc64/tramps.lisp | 2 +- src/code/target-load.lisp | 33 ++++++++++++++------------- src/compiler/dump.lisp | 4 ++-- src/compiler/generic/genesis.lisp | 8 +++---- src/compiler/generic/target-core.lisp | 7 +++--- src/compiler/ppc/macros.lisp | 2 +- src/compiler/ppc64/alloc.lisp | 4 ++-- src/compiler/ppc64/call.lisp | 4 ++-- src/compiler/ppc64/cell.lisp | 4 ++-- src/compiler/x86-64/system.lisp | 3 +-- 12 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/assembly/ppc64/assem-rtns.lisp b/src/assembly/ppc64/assem-rtns.lisp index a7316d4c59..dfaf901f4e 100644 --- a/src/assembly/ppc64/assem-rtns.lisp +++ b/src/assembly/ppc64/assem-rtns.lisp @@ -207,6 +207,6 @@ (move target catch) ;; reuse catch - (inst addi catch null-tn (make-fixup 'unwind :asm-routine-nil-offset)) + (inst addi catch null-tn (make-fixup 'unwind :assembly-routine*)) (inst mtlr catch) (inst blr)) diff --git a/src/assembly/ppc64/support.lisp b/src/assembly/ppc64/support.lisp index 2a4e2c372c..75d099a13c 100644 --- a/src/assembly/ppc64/support.lisp +++ b/src/assembly/ppc64/support.lisp @@ -17,7 +17,7 @@ ((:raw :none) (let ((jump (make-symbol "JUMP"))) (values - `((inst addi ,jump null-tn (make-fixup ',name :asm-routine-nil-offset)) + `((inst addi ,jump null-tn (make-fixup ',name :assembly-routine*)) (inst mtlr ,jump) (inst blrl)) `((:temporary (:sc any-reg) ,jump))))) @@ -33,7 +33,7 @@ (store-stack-tn ,nfp-save cur-nfp)) (inst compute-lra-from-code ,lra code-tn lra-label ,temp) (note-next-instruction ,vop :call-site) - (inst addi ,jump null-tn (make-fixup ',name :asm-routine-nil-offset)) + (inst addi ,jump null-tn (make-fixup ',name :assembly-routine*)) (inst mtlr ,jump) (inst blr) (emit-return-pc lra-label) diff --git a/src/assembly/ppc64/tramps.lisp b/src/assembly/ppc64/tramps.lisp index 7c4498920a..514ebbfc04 100644 --- a/src/assembly/ppc64/tramps.lisp +++ b/src/assembly/ppc64/tramps.lisp @@ -129,7 +129,7 @@ ;; We're back. (inst mtctr r3) ; stash the result in a reg that won't be clobbered ;; Reload a pointer to this asm routine - (inst addi lip null-tn (make-fixup 'alloc-tramp :asm-routine-nil-offset)) + (inst addi lip null-tn (make-fixup 'alloc-tramp :assembly-routine*)) ;; Restore the return address from the caller's frame. ;; 'sp' hasn't been restored yet, so add our frame size. (inst ld r0 machine-sp (+ 32 16)) diff --git a/src/code/target-load.lisp b/src/code/target-load.lisp index a637c002fd..35a2a2f739 100644 --- a/src/code/target-load.lisp +++ b/src/code/target-load.lisp @@ -363,26 +363,27 @@ (defvar *!initial-assembler-routines*) (defun get-asm-routine (name &optional indirect &aux (code *assembler-routines*)) - ;; INDIRECT means we want the address of a word containing the address - ;; of the routine. Only 2 of our architectures use that form. - #-(or x86 x86-64) (aver (not indirect)) + ;; Each architecture can define an "indirect" value in its own peculiar way. + ;; Only some of our architectures use that option. (awhen (the list (gethash (the symbol name) (%code-debug-info code))) (destructuring-bind (start end . index) it - (declare (ignore end)) - (let ((insts (code-instructions code))) - (if indirect - (let ((offset (ash index sb-vm:word-shift))) - (declare (ignorable offset)) - ;; the address is in the "external" static-space jump table - #+immobile-space (+ (get-lisp-obj-address *asm-routine-vector*) - (ash sb-vm:vector-data-offset sb-vm:word-shift) + (declare (ignore end) (ignorable index)) + (let* ((insts (code-instructions code)) + (addr (sap-int (sap+ insts start)))) + (unless indirect + (return-from get-asm-routine addr)) + #-(or ppc ppc64 x86 x86-64) (bug "Indirect asm-routine lookup") + #+(or ppc ppc64) (- addr sb-vm:nil-value) + #+(or x86 x86-64) ; return the address of a word containing 'addr' + (let ((offset (ash index sb-vm:word-shift))) + ;; the address is in the "external" static-space jump table + #+immobile-space (+ (get-lisp-obj-address *asm-routine-vector*) + (ash sb-vm:vector-data-offset sb-vm:word-shift) ;; offset is biased by 1 word, accounting for the jump-table-count ;; at the first word in code-instructions. So unbias it. - (- offset sb-vm:n-word-bytes sb-vm:other-pointer-lowtag)) - #-immobile-space ; the address is in the "internal" jump table - (sap-int (sap+ insts offset))) - ;; Return the direct address - (sap-int (sap+ insts start))))))) + (- offset sb-vm:n-word-bytes sb-vm:other-pointer-lowtag)) + #-immobile-space ; the address is in the "internal" jump table + (sap-int (sap+ insts offset))))))) (defun !loader-cold-init () (let* ((code *assembler-routines*) diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index a51029f6ef..5179a4c539 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -1033,7 +1033,7 @@ (assert (<= (length +fixup-kinds+) 8))) ; fixup-kind fits in 3 bits (defconstant-eqx +fixup-flavors+ - #(:assembly-routine :assembly-routine* :asm-routine-nil-offset + #(:assembly-routine :assembly-routine* :gc-barrier :symbol-tls-index :alien-code-linkage-index :alien-data-linkage-index :foreign :foreign-dataref @@ -1111,7 +1111,7 @@ (t name))))) (:layout-id (the wrapper name)) - ((:assembly-routine :assembly-routine* :asm-routine-nil-offset + ((:assembly-routine :assembly-routine* :symbol-tls-index ;; Only #+immobile-space can use the following two flavors. ;; An :IMMOBILE-SYMBOL fixup references the symbol itself, diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index cb07a51471..8e1aef2c71 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2332,9 +2332,11 @@ Legal values for OFFSET are -4, -8, -12, ..." (insts (+ (logandc2 (descriptor-bits code-component) sb-vm:lowtag-mask) (code-header-bytes code-component))) (offset (or (cdr (assq symbol list)) - (error "Assembler routine ~S not defined." symbol)))) + (error "Assembler routine ~S not defined." symbol))) + (addr (+ insts offset))) (ecase mode - (:direct (+ insts offset)) + (:direct addr) + #+(or ppc ppc64) (:indirect (- addr sb-vm:nil-value)) #+(or x86 x86-64) (:indirect (let ((index (count-if (lambda (x) (< (cdr x) offset)) list))) @@ -2940,8 +2942,6 @@ Legal values for OFFSET are -4, -8, -12, ..." (ecase flavor (:assembly-routine (lookup-assembler-reference name)) (:assembly-routine* (lookup-assembler-reference name :indirect)) - (:asm-routine-nil-offset - (- (lookup-assembler-reference name) sb-vm:nil-value)) (:foreign (alien-linkage-table-note-symbol string nil)) (:foreign-dataref (alien-linkage-table-note-symbol string t)) (:code-object (descriptor-bits code-obj)) diff --git a/src/compiler/generic/target-core.lisp b/src/compiler/generic/target-core.lisp index 5b5070c8b2..1199499e81 100644 --- a/src/compiler/generic/target-core.lisp +++ b/src/compiler/generic/target-core.lisp @@ -82,10 +82,9 @@ (sb-vm:fixup-code-object code-obj offset (ecase flavor - ((:assembly-routine :assembly-routine* :asm-routine-nil-offset) - (- (or (get-asm-routine name (eq flavor :assembly-routine*)) - (error "undefined assembler routine: ~S" name)) - (if (eq flavor :asm-routine-nil-offset) sb-vm:nil-value 0))) + ((:assembly-routine :assembly-routine*) + (or (get-asm-routine name (eq flavor :assembly-routine*)) + (error "undefined assembler routine: ~S" name))) (:alien-code-linkage-index (sb-impl::ensure-alien-linkage-index name nil)) (:alien-data-linkage-index (sb-impl::ensure-alien-linkage-index name t)) (:foreign (foreign-symbol-address name)) diff --git a/src/compiler/ppc/macros.lisp b/src/compiler/ppc/macros.lisp index febe409ebf..51fbd534a1 100644 --- a/src/compiler/ppc/macros.lisp +++ b/src/compiler/ppc/macros.lisp @@ -22,7 +22,7 @@ (defmacro load-asm-rtn-addr (reg name) ;; Gencgc has asm code in static space and we can reference it relative to NIL. - #+gencgc `(inst addi ,reg null-tn (make-fixup ,name :asm-routine-nil-offset)) + #+gencgc `(inst addi ,reg null-tn (make-fixup ,name :assembly-routine*)) ;; Cheneygc has asm code in read-only space which is not within ;; a sufficiently small displacement. #+cheneygc `(inst lr ,reg (make-fixup ,name :assembly-routine))) diff --git a/src/compiler/ppc64/alloc.lisp b/src/compiler/ppc64/alloc.lisp index c57fe39bfa..6c49b49ada 100644 --- a/src/compiler/ppc64/alloc.lisp +++ b/src/compiler/ppc64/alloc.lisp @@ -161,7 +161,7 @@ (:translate make-fdefn) (:generator 37 (with-fixed-allocation (result pa-flag temp fdefn-widetag fdefn-size) - (inst addi temp null-tn (make-fixup 'undefined-tramp :asm-routine-nil-offset)) + (inst addi temp null-tn (make-fixup 'undefined-tramp :assembly-routine*)) (storew name result fdefn-name-slot other-pointer-lowtag) (storew null-tn result fdefn-fun-slot other-pointer-lowtag) (storew temp result fdefn-raw-addr-slot other-pointer-lowtag)))) @@ -217,7 +217,7 @@ (:args) (:results (result :scs (any-reg))) (:generator 1 - (inst addi result null-tn (make-fixup 'funcallable-instance-tramp :asm-routine-nil-offset)))) + (inst addi result null-tn (make-fixup 'funcallable-instance-tramp :assembly-routine*)))) (define-vop (fixed-alloc) (:args) diff --git a/src/compiler/ppc64/call.lisp b/src/compiler/ppc64/call.lisp index fc56ff8580..c8d400dcbb 100644 --- a/src/compiler/ppc64/call.lisp +++ b/src/compiler/ppc64/call.lisp @@ -873,7 +873,7 @@ default-value-8 (inst addi nsp-tn cur-nfp (- (bytes-needed-for-non-descriptor-stack-frame) number-stack-displacement)))) - (inst addi temp null-tn (make-fixup 'tail-call-variable :asm-routine-nil-offset)) + (inst addi temp null-tn (make-fixup 'tail-call-variable :assembly-routine*)) (inst mtlr temp) (inst blr))) @@ -1001,7 +1001,7 @@ default-value-8 (move old-fp old-fp-arg) (move vals vals-arg) (move nvals nvals-arg) - (inst addi temp null-tn (make-fixup 'return-multiple :asm-routine-nil-offset)) + (inst addi temp null-tn (make-fixup 'return-multiple :assembly-routine*)) (inst mtlr temp) (inst blr)))) diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index 05c75d506f..6f84c24d63 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -356,7 +356,7 @@ (inst addi lip function (- (ash simple-fun-insts-offset word-shift) fun-pointer-lowtag)) (inst beq normal-fn) - (inst addi lip null-tn (make-fixup 'closure-tramp :asm-routine-nil-offset)) + (inst addi lip null-tn (make-fixup 'closure-tramp :assembly-routine*)) (emit-label normal-fn) (storew lip fdefn fdefn-raw-addr-slot other-pointer-lowtag) (storew function fdefn fdefn-fun-slot other-pointer-lowtag) @@ -369,7 +369,7 @@ (:temporary (:scs (non-descriptor-reg)) temp) (:generator 38 (storew null-tn fdefn fdefn-fun-slot other-pointer-lowtag) - (inst addi temp null-tn (make-fixup 'undefined-tramp :asm-routine-nil-offset)) + (inst addi temp null-tn (make-fixup 'undefined-tramp :assembly-routine*)) (storew temp fdefn fdefn-raw-addr-slot other-pointer-lowtag))) ;;;; Binding and Unbinding. diff --git a/src/compiler/x86-64/system.lisp b/src/compiler/x86-64/system.lisp index a7e6047257..da7aea8249 100644 --- a/src/compiler/x86-64/system.lisp +++ b/src/compiler/x86-64/system.lisp @@ -81,8 +81,7 @@ (inst movzx '(:byte :dword) rax object) LOAD-FROM-VECTOR (inst mov :dword result - (ea (make-fixup '**primitive-object-layouts** - :symbol-value + (ea (make-fixup '**primitive-object-layouts** :symbol-value (- (ash vector-data-offset word-shift) other-pointer-lowtag)) nil rax 8)) ; no base register From 1d80524ede926d491674c789b47c0031620c79f2 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 17:51:48 -0400 Subject: [PATCH 3988/4023] Cut down the float-math journal by about 20% Regenerate by wiping it out and running crossbuild-runner/build-all.sh which hasn't been done in ... literally ever ? (Can't use make-all-targets.sh because those jobs run in parallel and don't cooperate in updating the math journal. I believe they ignore it) --- float-math.lisp-expr | 998 +++---------------------------------------- 1 file changed, 62 insertions(+), 936 deletions(-) diff --git a/float-math.lisp-expr b/float-math.lisp-expr index e9bf71a917..a6c02aa723 100644 --- a/float-math.lisp-expr +++ b/float-math.lisp-expr @@ -134,15 +134,12 @@ (* (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0)) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) (* (#.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40100000 #x0)) #.(MAKE-DOUBLE-FLOAT #x5FEFFFFF #xFFFFFFFF)) (* (#.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x7FAFFFFF #xFFFFFFFE)) -(+ (#x0 #.(MAKE-SINGLE-FLOAT #x-40804189)) #.(MAKE-SINGLE-FLOAT #x-40804189)) -(+ (#x0 #.(MAKE-SINGLE-FLOAT #x-40800011)) #.(MAKE-SINGLE-FLOAT #x-40800011)) (+ (#x0 #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x0)) (+ (#x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (+ (#x1 #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x3F800000)) (+ (#x1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (+ (#x218DEF416BD #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) #.(MAKE-SINGLE-FLOAT #x540637BD)) (+ (#x83126E978D4FD #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) #.(MAKE-SINGLE-FLOAT #x5903126F)) -(+ (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-31800000)) #.(MAKE-SINGLE-FLOAT #x-31400000)) (+ (#.(MAKE-SINGLE-FLOAT #x-31800000) #x1) #.(MAKE-SINGLE-FLOAT #x-31800000)) (+ (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x-31800000)) (+ (#.(MAKE-SINGLE-FLOAT #x-22000000) #x1) #.(MAKE-SINGLE-FLOAT #x-22000000)) @@ -151,27 +148,19 @@ (+ (#.(MAKE-SINGLE-FLOAT #x-21000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x-21000000)) (+ (#.(MAKE-SINGLE-FLOAT #x0) #x0) #.(MAKE-SINGLE-FLOAT #x0)) (+ (#.(MAKE-SINGLE-FLOAT #x0) #x1) #.(MAKE-SINGLE-FLOAT #x3F800000)) -(+ (#.(MAKE-SINGLE-FLOAT #x0) #x3) #.(MAKE-SINGLE-FLOAT #x40400000)) -(+ (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40804189)) #.(MAKE-SINGLE-FLOAT #x-40804189)) -(+ (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40800011)) #.(MAKE-SINGLE-FLOAT #x-40800011)) (+ (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x0)) (+ (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (+ (#.(MAKE-SINGLE-FLOAT #x3F800000) #x-1) #.(MAKE-SINGLE-FLOAT #x0)) -(+ (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) #.(MAKE-SINGLE-FLOAT #x4EC00000)) (+ (#.(MAKE-SINGLE-FLOAT #x4E800000) #x1) #.(MAKE-SINGLE-FLOAT #x4E800000)) (+ (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x4E800000)) (+ (#.(MAKE-SINGLE-FLOAT #x540637BD) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) #.(MAKE-SINGLE-FLOAT #x540637BD)) -(+ (#.(MAKE-SINGLE-FLOAT #x5903126F) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) #.(MAKE-SINGLE-FLOAT #x5903126F)) (+ (#.(MAKE-SINGLE-FLOAT #x5E000000) #x1) #.(MAKE-SINGLE-FLOAT #x5E000000)) (+ (#.(MAKE-SINGLE-FLOAT #x5E000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x5E000000)) (+ (#.(MAKE-SINGLE-FLOAT #x5F000000) #x1) #.(MAKE-SINGLE-FLOAT #x5F000000)) (+ (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x5F000000)) (+ (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(+ (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA)) #.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374)) -(+ (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) #.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000)) +(+ (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA)) #.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) -(+ (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) -(+ (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) (+ (#.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) @@ -188,10 +177,7 @@ (+ (#.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (+ (#.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) (+ (#.(MAKE-DOUBLE-FLOAT #x40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x40100000 #x0)) -(+ (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) -(+ (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) -(+ (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) -(+ (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) +(+ (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) #.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00)) (+ (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) (+ (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) (+ (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) @@ -201,30 +187,17 @@ (- (#.(MAKE-SINGLE-FLOAT #x-80000000)) #.(MAKE-SINGLE-FLOAT #x0)) (- (#.(MAKE-SINGLE-FLOAT #x-40800000)) #.(MAKE-SINGLE-FLOAT #x3F800000)) (- (#.(MAKE-SINGLE-FLOAT #x-3FB6F025)) #.(MAKE-SINGLE-FLOAT #x40490FDB)) -(- (#.(MAKE-SINGLE-FLOAT #x-368C1A80)) #.(MAKE-SINGLE-FLOAT #x4973E580)) -(- (#.(MAKE-SINGLE-FLOAT #x-368BDC10)) #.(MAKE-SINGLE-FLOAT #x497423F0)) -(- (#.(MAKE-SINGLE-FLOAT #x-34800000)) #.(MAKE-SINGLE-FLOAT #x4B800000)) (- (#.(MAKE-SINGLE-FLOAT #x-32000000)) #.(MAKE-SINGLE-FLOAT #x4E000000)) -(- (#.(MAKE-SINGLE-FLOAT #x-31800000)) #.(MAKE-SINGLE-FLOAT #x4E800000)) -(- (#.(MAKE-SINGLE-FLOAT #x-31400000)) #.(MAKE-SINGLE-FLOAT #x4EC00000)) (- (#.(MAKE-SINGLE-FLOAT #x-3136F025)) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) -(- (#.(MAKE-SINGLE-FLOAT #x-231194D8)) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) (- (#.(MAKE-SINGLE-FLOAT #x-22800000)) #.(MAKE-SINGLE-FLOAT #x5D800000)) (- (#.(MAKE-SINGLE-FLOAT #x-21B6F025)) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) (- (#.(MAKE-SINGLE-FLOAT #x-21800000)) #.(MAKE-SINGLE-FLOAT #x5E800000)) (- (#.(MAKE-SINGLE-FLOAT #x-20B6F025)) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) -(- (#.(MAKE-SINGLE-FLOAT #x-139194D8)) #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) -(- (#.(MAKE-SINGLE-FLOAT #x-129194D8)) #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) -(- (#.(MAKE-SINGLE-FLOAT #x-800001)) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) (- (#.(MAKE-SINGLE-FLOAT #x-800000)) #.(MAKE-SINGLE-FLOAT #x7F800000)) (- (#.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x-80000000)) -(- (#.(MAKE-SINGLE-FLOAT #x3F7FBE77)) #.(MAKE-SINGLE-FLOAT #x-40804189)) -(- (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) #.(MAKE-SINGLE-FLOAT #x-40800011)) (- (#.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x-40800000)) -(- (#.(MAKE-SINGLE-FLOAT #x4B800000)) #.(MAKE-SINGLE-FLOAT #x-34800000)) (- (#.(MAKE-SINGLE-FLOAT #x4E000000)) #.(MAKE-SINGLE-FLOAT #x-32000000)) (- (#.(MAKE-SINGLE-FLOAT #x4E6E6B28)) #.(MAKE-SINGLE-FLOAT #x-319194D8)) -(- (#.(MAKE-SINGLE-FLOAT #x4EC00000)) #.(MAKE-SINGLE-FLOAT #x-31400000)) (- (#.(MAKE-SINGLE-FLOAT #x4EC90FDB)) #.(MAKE-SINGLE-FLOAT #x-3136F025)) (- (#.(MAKE-SINGLE-FLOAT #x5CEE6B28)) #.(MAKE-SINGLE-FLOAT #x-231194D8)) (- (#.(MAKE-SINGLE-FLOAT #x5D800000)) #.(MAKE-SINGLE-FLOAT #x-22800000)) @@ -240,27 +213,18 @@ (- (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) (- (#.(MAKE-DOUBLE-FLOAT #x-3FF6DE05 #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374)) #.(MAKE-DOUBLE-FLOAT #x407434E6 #x420F4374)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA)) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374)) #.(MAKE-DOUBLE-FLOAT #x408DDCE6 #x420F4374)) +(- (#.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA)) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) (- (#.(MAKE-DOUBLE-FLOAT #x-3F6F3800 #x0)) #.(MAKE-DOUBLE-FLOAT #x4090C800 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3F6F3400 #x0)) #.(MAKE-DOUBLE-FLOAT #x4090CC00 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3E400001 #xFF000000)) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) (- (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000)) #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFFC00000)) (- (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0)) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0)) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-20300001 #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF)) -(- (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) (- (#.(MAKE-DOUBLE-FLOAT #x-100000 #x0)) #.(MAKE-DOUBLE-FLOAT #x7FF00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) @@ -268,12 +232,9 @@ (- (#.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x-3FF6DE05 #x54442D18)) (- (#.(MAKE-DOUBLE-FLOAT #x407434E6 #x420F4374)) #.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374)) (- (#.(MAKE-DOUBLE-FLOAT #x40874910 #xD52D3052)) #.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052)) -(- (#.(MAKE-DOUBLE-FLOAT #x408DDCE6 #x420F4374)) #.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374)) (- (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) -(- (#.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFFC00000)) #.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000)) (- (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) (- (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) -(- (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) (- (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) @@ -284,39 +245,24 @@ (- (#.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x7FAFFFFF #xFFFFFFFE)) #.(MAKE-DOUBLE-FLOAT #x-500001 #xFFFFFFFE)) (- (#.(MAKE-DOUBLE-FLOAT #x7FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-100000 #x0)) -(- (#.(MAKE-SINGLE-FLOAT #x-32000000) #x20000000) #.(MAKE-SINGLE-FLOAT #x-31800000)) (- (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) #.(MAKE-SINGLE-FLOAT #x-31800000)) -(- (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) #.(MAKE-SINGLE-FLOAT #x-31800000)) (- (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) #.(MAKE-SINGLE-FLOAT #x-22000000)) -(- (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) #.(MAKE-SINGLE-FLOAT #x-22000000)) (- (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) #.(MAKE-SINGLE-FLOAT #x-21000000)) -(- (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) #.(MAKE-SINGLE-FLOAT #x-21000000)) (- (#.(MAKE-SINGLE-FLOAT #x0) #x64) #.(MAKE-SINGLE-FLOAT #x-3D380000)) (- (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) #.(MAKE-SINGLE-FLOAT #x-32000000)) (- (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) #.(MAKE-SINGLE-FLOAT #x-22800000)) (- (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) #.(MAKE-SINGLE-FLOAT #x-21800000)) (- (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) #.(MAKE-SINGLE-FLOAT #x4E800000)) -(- (#.(MAKE-SINGLE-FLOAT #x4E000000) #x-20000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) -(- (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) #.(MAKE-SINGLE-FLOAT #x4E800000)) (- (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x4E000000)) (- (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) #.(MAKE-SINGLE-FLOAT #x5E000000)) -(- (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) #.(MAKE-SINGLE-FLOAT #x5E000000)) (- (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x5D800000)) (- (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) #.(MAKE-SINGLE-FLOAT #x5F000000)) -(- (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) #.(MAKE-SINGLE-FLOAT #x5F000000)) (- (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x5E800000)) (- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x134) #.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x135) #.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x3AD) #.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD)) (- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x40734000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x40735000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x408D6800 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD)) (- (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) -(- (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x64) #.(MAKE-DOUBLE-FLOAT #x-3FA70000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) #.(MAKE-DOUBLE-FLOAT #x-3E400001 #xFF000000)) @@ -324,21 +270,13 @@ (- (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-402D413D #x33018866)) (- (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x-20300001 #xFFFFFFFF)) -(- (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #x-3BC) #.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80)) -(- (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #x-144) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) (- (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #x-143) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) (- (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x-3F8BD000 #x0)) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) -(- (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) -(- (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x-3F722000 #x0)) #.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80)) -(- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) -(- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) (- (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) -(- (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) -(- (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) (- (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) (/ (#x0 #.(MAKE-SINGLE-FLOAT #x3089705F)) #.(MAKE-SINGLE-FLOAT #x0)) (/ (#x0 #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x0)) @@ -349,177 +287,106 @@ (/ (#x0 #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (/ (#x0 #.(MAKE-DOUBLE-FLOAT #x40240000 #x0)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (/ (#x1 #.(MAKE-SINGLE-FLOAT #x3089705F)) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) -(/ (#xF3E58 #.(MAKE-SINGLE-FLOAT #x49742400)) #.(MAKE-SINGLE-FLOAT #x3F7FBE77)) (/ (#xF423F #.(MAKE-SINGLE-FLOAT #x49742400)) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) (/ (#xFFFFFFFF #.(MAKE-SINGLE-FLOAT #x3F000000)) #.(MAKE-SINGLE-FLOAT #x50000000)) (/ (#xFFFFFFFFFFFFFFFF #.(MAKE-SINGLE-FLOAT #x3F000000)) #.(MAKE-SINGLE-FLOAT #x60000000)) -(/ (#.(MAKE-SINGLE-FLOAT #x-80000000) #x1) #.(MAKE-SINGLE-FLOAT #x-80000000)) (/ (#.(MAKE-SINGLE-FLOAT #x0) #x1) #.(MAKE-SINGLE-FLOAT #x0)) (/ (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x0)) -(/ (#.(MAKE-SINGLE-FLOAT #x3F800000) #x1) #.(MAKE-SINGLE-FLOAT #x3F800000)) (/ (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3E8) #.(MAKE-SINGLE-FLOAT #x3A83126F)) (/ (#.(MAKE-SINGLE-FLOAT #x3F800000) #xF4240) #.(MAKE-SINGLE-FLOAT #x358637BD)) -(/ (#.(MAKE-SINGLE-FLOAT #x41600000) #x1) #.(MAKE-SINGLE-FLOAT #x41600000)) -(/ (#.(MAKE-SINGLE-FLOAT #x41600000) #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x41600000)) -(/ (#.(MAKE-SINGLE-FLOAT #x4973E580) #.(MAKE-SINGLE-FLOAT #x49742400)) #.(MAKE-SINGLE-FLOAT #x3F7FBE77)) (/ (#.(MAKE-SINGLE-FLOAT #x497423F0) #.(MAKE-SINGLE-FLOAT #x49742400)) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) -(/ (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #x1) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) -(/ (#.(MAKE-SINGLE-FLOAT #x4B800000) #x1) #.(MAKE-SINGLE-FLOAT #x4B800000)) -(/ (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) #.(MAKE-SINGLE-FLOAT #x4D800000)) -(/ (#.(MAKE-SINGLE-FLOAT #x4D800000) #x1) #.(MAKE-SINGLE-FLOAT #x4D800000)) (/ (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x1) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) (/ (#.(MAKE-SINGLE-FLOAT #x4E000000) #x1) #.(MAKE-SINGLE-FLOAT #x4E000000)) -(/ (#.(MAKE-SINGLE-FLOAT #x4EC00000) #x1) #.(MAKE-SINGLE-FLOAT #x4EC00000)) -(/ (#.(MAKE-SINGLE-FLOAT #x5CEE6B28) #x1) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) (/ (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #x1) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) (/ (#.(MAKE-SINGLE-FLOAT #x5D800000) #x1) #.(MAKE-SINGLE-FLOAT #x5D800000)) (/ (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #x1) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) (/ (#.(MAKE-SINGLE-FLOAT #x5E800000) #x1) #.(MAKE-SINGLE-FLOAT #x5E800000)) -(/ (#.(MAKE-SINGLE-FLOAT #x6C6E6B28) #x1) #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) -(/ (#.(MAKE-SINGLE-FLOAT #x6D6E6B28) #x1) #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) -(/ (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) (/ (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(/ (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (/ (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x3E200000 #x0)) (/ (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x3C300000 #x0)) (/ (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x3C100000 #x0)) (/ (#.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18) #x2) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) (/ (#.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) (/ (#.(MAKE-DOUBLE-FLOAT #x40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x5FEFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x20100000 #x1)) -(/ (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #x1) #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) -(/ (#.(MAKE-DOUBLE-FLOAT #x407434E6 #x420F4374) #x1) #.(MAKE-DOUBLE-FLOAT #x407434E6 #x420F4374)) -(/ (#.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00) #x1) #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) -(/ (#.(MAKE-DOUBLE-FLOAT #x408DDCE6 #x420F4374) #x1) #.(MAKE-DOUBLE-FLOAT #x408DDCE6 #x420F4374)) -(/ (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x1) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) (/ (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x1) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) (/ (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) -(/ (#.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000) #x1) #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) -(/ (#.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFFC00000) #x1) #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFFC00000)) -(/ (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #x1) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) -(/ (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) -(/ (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #x1) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) (/ (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #x1) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) (/ (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (/ (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #x1) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) (/ (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) -(/ (#.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) -(/ (#.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0) #x1) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) (/ (#.(MAKE-DOUBLE-FLOAT #x5FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40100000 #x0)) #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF)) (< (#x-8000000000000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x-8000000000000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x-4000000000000001 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x-4000000000000001 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-4000000000000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x-4000000000000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x-1000000000000001 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x-1000000000000001 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-1000000000000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x-1000000000000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x-20000000000001 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) +(< (#x-20000000000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-80000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x-80000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x-20000001 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x-20000001 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-20000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x-20000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x-1000001 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x-F423F #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x-F3E58 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) +(< (#x-1000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x-433 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-432 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x-3BD #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x-3BC #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x-3AE #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-144 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-143 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-135 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-F #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x-1 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x-1 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (< (#x0 #.(MAKE-SINGLE-FLOAT #x-3136F025)) NIL) (< (#x0 #.(MAKE-SINGLE-FLOAT #x-21B6F025)) NIL) (< (#x0 #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) (< (#x0 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x0 #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (< (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x4EC00000)) T) (< (#x0 #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) T) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) T) (< (#x0 #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#x0 #.(MAKE-SINGLE-FLOAT #x5E490FDB)) T) (< (#x0 #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#x0 #.(MAKE-SINGLE-FLOAT #x5F490FDB)) T) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) T) -(< (#x0 #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) T) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) NIL) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) NIL) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) NIL) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x-500001 #xFFFFFFFE)) NIL) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) T) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) T) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) T) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#x0 #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) T) -(< (#x0 #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) T) (< (#x1/2 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x1/2 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x1 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x1 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#x1 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x2 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x2 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#xE #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x35 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x3E8 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#xF4240 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x1FFFFFFF #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x1FFFFFFF #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x20000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x20000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x80000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x80000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#xFFFFFFFFFFFFFFF #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#xFFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x1000000000000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x1000000000000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#x3FFFFFFFFFFFFFFF #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#x3FFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x4000000000000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#x8000000000000000 #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#x8000000000000000 #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x-80000000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) T) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) T) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) T) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) T) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) T) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) T) (< (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x0)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) @@ -529,31 +396,22 @@ (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-319194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-31400000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-3136F025) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x-3136F025)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x-231194D8) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-21B6F025) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-21B6F025) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) NIL) @@ -562,21 +420,17 @@ (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x-139194D8) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-139194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) -(< (#.(MAKE-SINGLE-FLOAT #x-129194D8) #x0) T) (< (#.(MAKE-SINGLE-FLOAT #x-129194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #x-1) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3D800000)) T) @@ -584,22 +438,18 @@ (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x538637BD)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5F000000)) T) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F000000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F800000) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) @@ -622,23 +472,13 @@ (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x538637BD) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -652,9 +492,6 @@ (< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E000000) #.(MAKE-SINGLE-FLOAT #x5E000000)) NIL) @@ -663,9 +500,6 @@ (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) -(< (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x5F000000)) NIL) @@ -673,11 +507,8 @@ (< (#.(MAKE-SINGLE-FLOAT #x6C6E6B28) #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x6D6E6B28) #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x-4000000000000001) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x-4000000000000000) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x-1000000000000001) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x-1000000000000000) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x-20000001) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x-20000000) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x-1) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x1/2) NIL) @@ -686,28 +517,22 @@ (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x3E8) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xF423F) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xF4240) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x1000000) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x1FFFFFE1) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xFFFFFF) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x1FFFFFE0) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x1FFFFFFB) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x1FFFFFFC) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x1FFFFFFF) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x20000001) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x3FFFFFFE) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x3FFFFFFF) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x7FFFFFFF) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xFFFFFFFF) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x218DEF416BD) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x83126E978D4FD) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xFFFFFF000000001) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xFFFFFF000000000) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xFFFFFFFFFFFFFFB) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xFFFFFFFFFFFFFFC) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xFFFFFFFFFFFFFFF) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x1000000000000001) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x3FFFFFC000000001) NIL) +(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x3FFFFFC000000000) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x3FFFFFFFFFFFFFFB) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x3FFFFFFFFFFFFFFC) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x3FFFFFFFFFFFFFFF) NIL) -(< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x4000000000000001) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #x7FFFFFFFFFFFFFFF) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #xFFFFFFFFFFFFFFFF) NIL) (< (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) @@ -738,59 +563,38 @@ (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3FF6DE05 #x54442D18) #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #x0) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #x0) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #x0) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #x0) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x-4000000000000001) NIL) @@ -806,26 +610,17 @@ (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x1FFFFF #xFFFFFFFE)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x3FB99999 #x9999999A) #.(MAKE-DOUBLE-FLOAT #x3FB99999 #x9999999A)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) T) (< (#.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD) #.(MAKE-DOUBLE-FLOAT #x3FF33333 #x33333333)) T) (< (#.(MAKE-DOUBLE-FLOAT #x3FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x3FEFFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) @@ -853,22 +648,13 @@ (< (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x40742000 #x0) #.(MAKE-DOUBLE-FLOAT #x40742000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61) #.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x408D6000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00) #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x408DD800 #x0) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80) #.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80)) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00) #.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x0) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) T) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) @@ -876,8 +662,6 @@ (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (< (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) NIL) @@ -893,20 +677,11 @@ (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) -(< (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (< (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) NIL) @@ -916,9 +691,6 @@ (< (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) NIL) @@ -929,11 +701,8 @@ (< (#.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x5FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x-4000000000000001) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x-4000000000000000) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x-1000000000000001) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x-1000000000000000) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x-20000001) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x-20000000) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x-1) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x0) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x1/2) NIL) @@ -941,115 +710,71 @@ (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x2) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x133) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x134) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x135) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x142) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x3AC) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x3AD) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x3BB) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x3FF) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x400) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x1FFFFFE0) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x1FFFFFFF) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x20000000) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x7FFFFFFF) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #xFFFFFFFF) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x1FFFFFFFFFFFFF) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x20000000000000) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #xFFFFFFFFFFFFF81) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #xFFFFFFFFFFFFF80) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #xFFFFFFFFFFFFFFF) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x1000000000000001) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x3FFFFFFFFFFFFE01) NIL) +(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x3FFFFFFFFFFFFE00) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x3FFFFFFFFFFFFFC0) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x3FFFFFFFFFFFFFFF) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x4000000000000001) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #x7FFFFFFFFFFFFFFF) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #xFFFFFFFFFFFFFFFF) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) NIL) (< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) -(< (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (<= (#x-4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#x-1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#x-20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#x-1 #.(MAKE-SINGLE-FLOAT #x0)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-31800000)) NIL) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x-31400000)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-3136F025)) NIL) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x-231194D8)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-22000000)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-21B6F025)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-21000000)) NIL) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x-139194D8)) NIL) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x-129194D8)) NIL) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x3F800000)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x4E800000)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x4EC00000)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x5E000000)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x5E490FDB)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x5F000000)) T) (<= (#x0 #.(MAKE-SINGLE-FLOAT #x5F490FDB)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) T) -(<= (#x0 #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374)) NIL) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) NIL) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) NIL) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0)) NIL) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0)) NIL) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) T) +(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) T) +(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) T) @@ -1058,18 +783,14 @@ (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) T) -(<= (#x0 #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) T) (<= (#x0 #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF)) T) (<= (#x1 #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(<= (#x1 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (<= (#x1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x4B800000)) T) +(<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) T) @@ -1077,12 +798,6 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x0)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x5903126F)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x0)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x540637BD)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x0)) T) @@ -1099,34 +814,26 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-4036F025) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-4036F025) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-3FB6F025) #.(MAKE-SINGLE-FLOAT #x40490FDB)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-319194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-319194D8) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-31800000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-31400000) #x0) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-31400000) #.(MAKE-SINGLE-FLOAT #x4EC00000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-3136F025) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x-3136F025)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-231194D8) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #x0) T) @@ -1135,7 +842,6 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22000000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22000000) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-22000000) #.(MAKE-SINGLE-FLOAT #x5E000000)) T) @@ -1144,35 +850,26 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-21B6F025) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21000000) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21000000) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-21000000) #.(MAKE-SINGLE-FLOAT #x5F000000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-139194D8) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-139194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-139194D8) #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-129194D8) #x0) T) (<= (#.(MAKE-SINGLE-FLOAT #x-129194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-129194D8) #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x-800000) #.(MAKE-SINGLE-FLOAT #x-800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x0) #x1) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #x3FFFFFF7) T) -(<= (#.(MAKE-SINGLE-FLOAT #x0) #x7FFFFFFD) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #x1FFFFFFFFFFFFFF7) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #x7FFFFFFFFFFFFFF7) T) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40804189)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40800011)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-319194D8)) NIL) @@ -1218,11 +915,8 @@ (<= (#.(MAKE-SINGLE-FLOAT #x3DCCCCCD) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x1FFFFFFC) T) -(<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3FFFFFFF) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #xFFFFFFFFFFFFFFC) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3FFFFFFFFFFFFFFC) T) (<= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) @@ -1242,7 +936,6 @@ (<= (#.(MAKE-SINGLE-FLOAT #x40490FDB) #.(MAKE-SINGLE-FLOAT #x40490FDB)) T) (<= (#.(MAKE-SINGLE-FLOAT #x447A0000) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x49742400) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) @@ -1254,20 +947,14 @@ (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E800000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x4EC00000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x3FC90FDB)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x40490FDB)) NIL) @@ -1278,7 +965,6 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5903126F) #.(MAKE-SINGLE-FLOAT #x5903126F)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x5CEE6B28) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5CEE6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5CEE6B28) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #x0) NIL) @@ -1286,13 +972,9 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5E000000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E000000) #.(MAKE-SINGLE-FLOAT #x5E000000)) T) @@ -1305,13 +987,9 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-SINGLE-FLOAT #x5F000000) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x5F000000)) T) @@ -1319,17 +997,13 @@ (<= (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x3FC90FDB)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x40490FDB)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x6C6E6B28) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x6C6E6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x6C6E6B28) #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x6D6E6B28) #x0) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x6D6E6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x6D6E6B28) #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) T) (<= (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x7F800000) #.(MAKE-SINGLE-FLOAT #x7F800000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #x3FFFFFFFFFFFFFFC) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -1338,7 +1012,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) T) @@ -1350,10 +1024,8 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) @@ -1369,53 +1041,29 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3FF6DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3FF6DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0) #.(MAKE-DOUBLE-FLOAT #x40742000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052) #.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #x0) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD) #.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #x0) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #x0) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #x0) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) T) @@ -1425,25 +1073,18 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x60000000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #x0) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) @@ -1458,7 +1099,6 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #x0) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) @@ -1472,11 +1112,9 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x60000000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #x0) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) T) @@ -1495,7 +1133,6 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) @@ -1514,12 +1151,10 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x40742000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) T) @@ -1539,8 +1174,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x3FB99999 #x9999999A) #.(MAKE-DOUBLE-FLOAT #x3FB99999 #x9999999A)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x3FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x3FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) @@ -1552,6 +1186,7 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) @@ -1582,35 +1217,24 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x404A8000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x404A8000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87D) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87E) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x40733000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x40742000 #x0) #.(MAKE-DOUBLE-FLOAT #x40742000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) NIL) +(<= (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61) #.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x408D6000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00) #x0) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00) #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x408DD800 #x0) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80) #.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00) #.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x0) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) @@ -1618,28 +1242,18 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #x0) NIL) @@ -1648,12 +1262,10 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x60000000) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x60000000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -1662,7 +1274,6 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) T) @@ -1670,11 +1281,8 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -1689,11 +1297,8 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -1703,11 +1308,9 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x60000000) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x60000000)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0) #x0) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) T) @@ -1718,14 +1321,11 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (<= (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x-20000000 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x-1 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x0 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x1 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x3 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x64 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x3E8 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #xF3E58 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #xF423F #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #xF4240 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x1FFFFFFF #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) @@ -1739,18 +1339,13 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #x4000000000000000 #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #xFFFFFFFFFFFFFFFF #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-4036F025) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-3FB6F025) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-3D380000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-368C1A80) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-368BDC10) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-31400000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-31000000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) @@ -1763,38 +1358,27 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-139194D8) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-129194D8) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) NIL) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3089705F) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x358637BD) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3A83126F) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F0CCCCD) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F19999A) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F266666) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F59999A) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F666666) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3F8CCCCD) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3FC00000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x3FC90FDB) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x40000000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x40400000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x40490FDB) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x41600000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x447A0000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x497423F0) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x49742400) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4D800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4EC00000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4F000000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x4F800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) @@ -1815,17 +1399,12 @@ (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x6C6E6B28) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x6D6E6B28) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) (<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) T) -(<= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x7F800000) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) NIL) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x-3BC #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x-144 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x-143 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x0 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x1 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x2 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x64 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x134 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x135 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x3AD #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x3E8 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x3FF #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x400 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) @@ -1853,22 +1432,15 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F722000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F6F3800 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F6F3400 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) @@ -1907,40 +1479,30 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x3FFB504F #x333F9DE6) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4005BF0A #x8B145769) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40080000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x404A8000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87D) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87E) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40734000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40735000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40742000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x408D6800 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) +(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x408FF800 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x40900000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x60000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) @@ -1949,7 +1511,6 @@ (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) -(<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xE0000000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) T) @@ -1979,107 +1540,73 @@ (= (#x-20000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x-20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x-1 #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x-80000000)) T) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-31800000)) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x-31400000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-3136F025)) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x-231194D8)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-22000000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-21B6F025)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-21000000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x-139194D8)) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x-129194D8)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x0)) T) (= (#x0 #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x5E000000)) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x5F000000)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x-500001 #xFFFFFFFE)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43C00000 #x0)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) NIL) (= (#x1 #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#x1 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (= (#x1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x1FFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x1FFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x20000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x3FFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#x3FFFFFFF #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) -(= (#x7FFFFFFD #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#xFFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#xFFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x1000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x1FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x3FFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) -(= (#x3FFFFFFFFFFFFFFC #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (= (#x3FFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (= (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x4000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x7FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-80000000) #x0) T) (= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) T) -(= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) -(= (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) -(= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x-3136F025)) T) (= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x-21B6F025) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) T) (= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) T) (= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #x-1) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #x0) T) -(= (#.(MAKE-SINGLE-FLOAT #x0) #x1) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #x3FFFFFF7) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x0) #x7FFFFFFD) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #x1FFFFFFFFFFFFFF7) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #x7FFFFFFFFFFFFFF7) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40804189)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40800011)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-319194D8)) NIL) @@ -2094,13 +1621,10 @@ (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5F000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) @@ -2112,31 +1636,19 @@ (= (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x1FFFFFFC) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3FFFFFFF) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #xFFFFFFFFFFFFFFC) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x3FFFFFFFFFFFFFFC) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) -(= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) -(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x4E800000) #x0) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x4E800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x-3136F025)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) T) (= (#.(MAKE-SINGLE-FLOAT #x538637BD) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -2146,30 +1658,17 @@ (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) -(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) -(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) T) (= (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #x0) T) -(= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -2177,36 +1676,25 @@ (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x40100000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-500001 #xFFFFFFFE) #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x-800001)) NIL) @@ -2234,7 +1722,6 @@ (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) NIL) @@ -2245,7 +1732,6 @@ (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) @@ -2259,8 +1745,7 @@ (= (#.(MAKE-DOUBLE-FLOAT #x3FB99999 #x9999999A) #.(MAKE-DOUBLE-FLOAT #x3FB99999 #x9999999A)) T) (= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD) #.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD)) T) (= (#.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD) #.(MAKE-DOUBLE-FLOAT #x3FF33333 #x33333333)) NIL) @@ -2277,52 +1762,35 @@ (= (#.(MAKE-DOUBLE-FLOAT #x4005BF0A #x8B145769) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) T) (= (#.(MAKE-DOUBLE-FLOAT #x40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00) #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00) #x0) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) T) @@ -2335,48 +1803,27 @@ (= (#x-1000000000000000 #xFFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x-20000000 #x1FFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#x-1 #x3FFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#x-1 #x7FFFFFFD #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x-1 #x1FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x-1 #x7FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x0 #x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(= (#x0 #x1 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#x0 #x1FFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) -(= (#x0 #x3FFFFFFF #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x0 #xFFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#x0 #x3FFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) -(= (#x0 #x3FFFFFFFFFFFFFFC #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x0) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000) #x0) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x4E800000) #x0) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x4EC00000) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x4EC90FDB) #x0) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x5CEE6B28) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #x0) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x5D800000) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x5E490FDB) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #x0) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x5E800000) #x0) NIL) (= (#x0 #.(MAKE-SINGLE-FLOAT #x5F490FDB) #x0) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x6C6E6B28) #x0) NIL) -(= (#x0 #.(MAKE-SINGLE-FLOAT #x6D6E6B28) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00) #x0) NIL) +(= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00) #x0) NIL) +(= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #x0) NIL) +(= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) @@ -2385,34 +1832,24 @@ (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0) #x0) NIL) -(= (#x0 #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0) #x0) NIL) (= (#x0 #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF) #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) -(= (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) -(= (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0 #x0) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x-32000000) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-319194D8) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x4E800000) #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-31400000) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-3136F025) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x-3136F025)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-231194D8) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-22800000) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-22000000) #.(MAKE-SINGLE-FLOAT #x5E000000) #x0) NIL) @@ -2422,7 +1859,6 @@ (= (#.(MAKE-SINGLE-FLOAT #x-21B6F025) #.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-21800000) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-21800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-21000000) #.(MAKE-SINGLE-FLOAT #x5F000000) #x0) NIL) @@ -2430,20 +1866,16 @@ (= (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-20B6F025) #.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-139194D8) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-139194D8) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x-129194D8) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x-129194D8) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5CEE6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x6C6E6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x6D6E6B28) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) @@ -2455,58 +1887,39 @@ (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) -(= (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) T) (= (#.(MAKE-SINGLE-FLOAT #x538637BD) #.(MAKE-SINGLE-FLOAT #x538637BD) #.(MAKE-SINGLE-FLOAT #x538637BD)) T) (= (#.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F) #.(MAKE-SINGLE-FLOAT #x5883126F)) T) (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) T) (= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) -(= (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #x0 #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x537B1D3D)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0 #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #x0 #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) @@ -2517,7 +1930,6 @@ (= (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #x0 #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) @@ -2527,10 +1939,8 @@ (= (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3A72329B #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #x0 #x0) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-3A52329B #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x-500001 #xFFFFFFFE) #x0 #x0) NIL) @@ -2541,9 +1951,8 @@ (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) @@ -2556,12 +1965,9 @@ (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) T) -(= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) T) (= (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) T) (= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) @@ -2569,7 +1975,6 @@ (= (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x-31800000) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(= (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E000000) #.(MAKE-SINGLE-FLOAT #x-22000000) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5E000000) #.(MAKE-SINGLE-FLOAT #x-22000000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) NIL) @@ -2577,18 +1982,11 @@ (= (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x-21000000) #x0 #x0) NIL) (= (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x-21000000) #.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) +(= (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #x0 #x0) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (= (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) @@ -2611,20 +2009,12 @@ (> (#x0 #.(MAKE-SINGLE-FLOAT #x-20B6F025)) T) (> (#x0 #.(MAKE-SINGLE-FLOAT #x0)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) -(> (#x0 #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) -(> (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) -(> (#x0 #.(MAKE-SINGLE-FLOAT #x4EC00000)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) NIL) -(> (#x0 #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) -(> (#x0 #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) -(> (#x0 #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (> (#x0 #.(MAKE-SINGLE-FLOAT #x5F490FDB)) NIL) -(> (#x0 #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) NIL) -(> (#x0 #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) T) @@ -2632,25 +2022,14 @@ (> (#x0 #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) T) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x-500001 #xFFFFFFFE)) T) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) NIL) -(> (#x0 #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) NIL) (> (#x0 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) (> (#x1 #.(MAKE-SINGLE-FLOAT #x0)) T) -(> (#x1 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (> (#x1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x1 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) (> (#x7 #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) @@ -2659,8 +2038,6 @@ (> (#x20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x20000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x3FFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) T) -(> (#x3FFFFFFF #.(MAKE-SINGLE-FLOAT #x3F800000)) T) -(> (#x7FFFFFFD #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#x10C6F7A0B5E #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) (> (#x4189374BC6A7E #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) (> (#xFFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) T) @@ -2669,41 +2046,28 @@ (> (#x1000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x1FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#x3FFFFFFFFFFFFFFC #.(MAKE-SINGLE-FLOAT #x3F800000)) T) -(> (#x3FFFFFFFFFFFFFFC #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (> (#x3FFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(> (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (> (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x4000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#x7FFFFFFFFFFFFFF7 #.(MAKE-SINGLE-FLOAT #x0)) T) -(> (#.(MAKE-SINGLE-FLOAT #x-80000000) #x0) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x6C6E6B28)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x6D6E6B28)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x458DCD65 #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-7F800000) #.(MAKE-SINGLE-FLOAT #x-7F800000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x-40804189)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x5903126F)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x-40800011)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x3F7FFFEF)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x540637BD)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x40E00000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-4036F025) #.(MAKE-SINGLE-FLOAT #x-4036F025)) NIL) @@ -2713,15 +2077,9 @@ (> (#.(MAKE-SINGLE-FLOAT #x-4036F025) #.(MAKE-SINGLE-FLOAT #x3FC90FDB)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-3FB6F025) #.(MAKE-SINGLE-FLOAT #x-3FB6F025)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-3FB6F025) #.(MAKE-SINGLE-FLOAT #x40490FDB)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-368C1A80) #.(MAKE-SINGLE-FLOAT #x497423F0)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-368BDC10) #.(MAKE-SINGLE-FLOAT #x497423F0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) -(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) -(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) @@ -2733,7 +2091,6 @@ (> (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x-31800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x-31400000) #.(MAKE-SINGLE-FLOAT #x4EC00000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x-3136F025)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x-31000000) #.(MAKE-SINGLE-FLOAT #x4F000000)) NIL) @@ -2769,7 +2126,6 @@ (> (#.(MAKE-SINGLE-FLOAT #x-800000) #.(MAKE-SINGLE-FLOAT #x-800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #x-1) T) (> (#.(MAKE-SINGLE-FLOAT #x0) #x0) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x0) #x1) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) @@ -2790,7 +2146,6 @@ (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x538637BD)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x540637BD)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x5883126F)) NIL) @@ -2812,12 +2167,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x3F0CCCCD) #.(MAKE-SINGLE-FLOAT #x3F0CCCCD)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x3F19999A) #.(MAKE-SINGLE-FLOAT #x3F19999A)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x3F266666) #.(MAKE-SINGLE-FLOAT #x3F266666)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F333333) #.(MAKE-SINGLE-FLOAT #x3F333333)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x3F59999A) #.(MAKE-SINGLE-FLOAT #x3F59999A)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x3F666666) #.(MAKE-SINGLE-FLOAT #x3F666666)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) @@ -2830,38 +2180,22 @@ (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) -(> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3F8CCCCD) #.(MAKE-SINGLE-FLOAT #x3F8CCCCD)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x3FC00000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x3FC00000) #.(MAKE-SINGLE-FLOAT #x3FC00000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x40000000) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x40490FDB) #.(MAKE-SINGLE-FLOAT #x40490FDB)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x41600000) #.(MAKE-SINGLE-FLOAT #x0)) T) -(> (#.(MAKE-SINGLE-FLOAT #x41600000) #.(MAKE-SINGLE-FLOAT #x41600000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x41600000) #.(MAKE-SINGLE-FLOAT #x4B800000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x41600000) #.(MAKE-SINGLE-FLOAT #x4D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x42C80000) #.(MAKE-SINGLE-FLOAT #x42C80000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x447A0000) #.(MAKE-SINGLE-FLOAT #x447A0000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x49742400) #.(MAKE-SINGLE-FLOAT #x49742400)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x4B800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x4E000000) #x0) T) -(> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) -(> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x0)) T) -(> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) -(> (#.(MAKE-SINGLE-FLOAT #x4E800000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) #.(MAKE-SINGLE-FLOAT #x4EC90FDB)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x4F000000) #.(MAKE-SINGLE-FLOAT #x4F800000)) NIL) @@ -2873,10 +2207,6 @@ (> (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x5D800000) #x0) T) -(> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) -(> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x0)) T) -(> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x5D800000) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5E490FDB) #.(MAKE-SINGLE-FLOAT #x5E490FDB)) NIL) @@ -2884,12 +2214,7 @@ (> (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) (> (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) (> (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x5E800000) #x0) T) -(> (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) -(> (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x0)) T) -(> (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) T) (> (#.(MAKE-SINGLE-FLOAT #x5E800000) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) -(> (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x5F000000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5F000000) #.(MAKE-SINGLE-FLOAT #x5F800000)) NIL) (> (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #x0) T) (> (#.(MAKE-SINGLE-FLOAT #x5F490FDB) #.(MAKE-SINGLE-FLOAT #x5F490FDB)) NIL) @@ -2914,15 +2239,12 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-7FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-7FF00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-402D413D #x33018866) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-SINGLE-FLOAT #x-40800000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x401C0000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18)) NIL) @@ -2935,9 +2257,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3FF6DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0) #.(MAKE-DOUBLE-FLOAT #x40742000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F8BD000 #x0) #.(MAKE-DOUBLE-FLOAT #x40734000 #x0)) NIL) @@ -2945,50 +2265,27 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0) #.(MAKE-DOUBLE-FLOAT #x40735000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052) #.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052) #.(MAKE-DOUBLE-FLOAT #x408628B7 #x6E3A7B61)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F722000 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6800 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F6F3800 #x0) #.(MAKE-DOUBLE-FLOAT #x40900000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3F6F3400 #x0) #.(MAKE-DOUBLE-FLOAT #x408FF800 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD) #.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD) #.(MAKE-DOUBLE-FLOAT #x4093C104 #xD427DE80)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18)) NIL) @@ -2997,16 +2294,12 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) NIL) @@ -3020,7 +2313,6 @@ (> (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x60000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) NIL) @@ -3055,7 +2347,6 @@ (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18)) T) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) T) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) @@ -3069,17 +2360,13 @@ (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FEFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF33333 #x33333333)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4005BF0A #x8B145769)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x40742000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) @@ -3089,7 +2376,6 @@ (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x100000 #x0) #.(MAKE-DOUBLE-FLOAT #x100000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x1FFFFF #xFFFFFFFE) #.(MAKE-DOUBLE-FLOAT #x1FFFFF #xFFFFFFFE)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x300000 #x2) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -3118,7 +2404,7 @@ (> (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -3153,30 +2439,19 @@ (> (#.(MAKE-DOUBLE-FLOAT #x404A8000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87D) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87D) #.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87D)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87E) #.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87E)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x0) T) -(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) +(> (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) +(> (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x41D921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x537B1D3D)) T) (> (#.(MAKE-DOUBLE-FLOAT #x41E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41EFFFFF #xFFE00000)) NIL) @@ -3188,22 +2463,14 @@ (> (#.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x43400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000) #.(MAKE-DOUBLE-FLOAT #x4341C379 #x37E08000)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x0) T) -(> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x54442D18)) NIL) @@ -3211,13 +2478,8 @@ (> (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x0) T) -(> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-SINGLE-FLOAT #x5E800000)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) T) (> (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) NIL) -(> (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43E00000 #x0) #.(MAKE-DOUBLE-FLOAT #x43F00000 #x0)) NIL) (> (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #x0) T) (> (#.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x54442D18)) NIL) @@ -3232,10 +2494,6 @@ (>= (#x-1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#x-20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#x-467 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(>= (#x-3CA #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(>= (#x-3C9 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(>= (#x-3BD #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(>= (#x-3AE #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#x-144 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#x-135 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x-40800000)) T) @@ -3245,15 +2503,10 @@ (>= (#x0 #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x40490FDB)) NIL) -(>= (#x0 #.(MAKE-SINGLE-FLOAT #x497423F0)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x4E6E6B28)) NIL) -(>= (#x0 #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) -(>= (#x0 #.(MAKE-SINGLE-FLOAT #x4EC00000)) NIL) -(>= (#x0 #.(MAKE-SINGLE-FLOAT #x540637BD)) NIL) -(>= (#x0 #.(MAKE-SINGLE-FLOAT #x5903126F)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x5CEE6B28)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) NIL) (>= (#x0 #.(MAKE-SINGLE-FLOAT #x5D800000)) NIL) @@ -3271,14 +2524,12 @@ (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF)) NIL) -(>= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083C209 #xA84FBD00)) NIL) -(>= (#x0 #.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00)) NIL) +(>= (#x0 #.(MAKE-DOUBLE-FLOAT #x4083BA09 #xA84FBD00)) NIL) +(>= (#x0 #.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x408FF800 #x0)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x40900000 #x0)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(>= (#x0 #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) -(>= (#x0 #.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) NIL) @@ -3289,7 +2540,6 @@ (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x45ADCD65 #x0)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x5FCFFFFF #xFFFFFFFF)) NIL) (>= (#x0 #.(MAKE-DOUBLE-FLOAT #x5FEFFFFF #xFFFFFFFF)) NIL) -(>= (#x1 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#x1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#x2 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#x7 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -3316,15 +2566,10 @@ (>= (#x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#x4000000000000001 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #x0) T) -(>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-80000000) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x-40804189) #x0) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x-40804189) #.(MAKE-SINGLE-FLOAT #x-40804189)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x-40800011) #x0) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x-40800011) #.(MAKE-SINGLE-FLOAT #x-40800011)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-40800000) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-40800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) @@ -3339,8 +2584,6 @@ (>= (#.(MAKE-SINGLE-FLOAT #x-3FB6F025) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-3FB6F025) #.(MAKE-SINGLE-FLOAT #x-3FB6F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-3FB6F025) #.(MAKE-SINGLE-FLOAT #x0)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x-368C1A80) #x0) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x-368BDC10) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-34800000) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) @@ -3356,9 +2599,7 @@ (>= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-32000000) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-319194D8) #x0) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x-31800000) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-31800000) #.(MAKE-SINGLE-FLOAT #x-31800000)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x-31400000) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-3136F025) #.(MAKE-SINGLE-FLOAT #x-3136F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x-231194D8) #x0) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-231194D8) #.(MAKE-SINGLE-FLOAT #x-231194D8)) T) @@ -3387,7 +2628,6 @@ (>= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x-80000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x0)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x-800000) #.(MAKE-SINGLE-FLOAT #x-800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #x1) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) @@ -3395,20 +2635,16 @@ (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-3FB6F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-34800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-32000000)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-31800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-3136F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-22800000)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-22000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21B6F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21800000)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-21000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x-20B6F025)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3D800000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x3F800000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x41600000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x4E000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x0) #.(MAKE-SINGLE-FLOAT #x538637BD)) NIL) @@ -3424,7 +2660,6 @@ (>= (#.(MAKE-SINGLE-FLOAT #x358637BD) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x3A83126F) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x3A83126F) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x3D800000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x3D800000) #.(MAKE-SINGLE-FLOAT #x3D800000)) T) @@ -3433,10 +2668,6 @@ (>= (#.(MAKE-SINGLE-FLOAT #x3F000000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x3F000000)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x3F000000) #.(MAKE-SINGLE-FLOAT #x4E800000)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x3F266666) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x3F59999A) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x3F666666) #.(MAKE-SINGLE-FLOAT #x40000000)) NIL) (>= (#.(MAKE-SINGLE-FLOAT #x3F800000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x-40800000)) T) @@ -3447,12 +2678,8 @@ (>= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3DCCCCCD)) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3F800000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-SINGLE-FLOAT #x3FC00000)) NIL) -(>= (#.(MAKE-SINGLE-FLOAT #x3F800000) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) T) (>= (#.(MAKE-SINGLE-FLOAT #x40000000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x40490FDB) #.(MAKE-SINGLE-FLOAT #x-3FB6F025)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x41600000) #x0) T) -(>= (#.(MAKE-SINGLE-FLOAT #x41600000) #.(MAKE-SINGLE-FLOAT #x0)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x41600000) #.(MAKE-SINGLE-FLOAT #x41600000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x447A0000) #x0) T) (>= (#.(MAKE-SINGLE-FLOAT #x447A0000) #.(MAKE-SINGLE-FLOAT #x40000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x49742400) #x0) T) @@ -3499,7 +2726,6 @@ (>= (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-SINGLE-FLOAT #x-80000000)) T) (>= (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-SINGLE-FLOAT #x-800001)) T) (>= (#.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-SINGLE-FLOAT #x0)) T) -(>= (#.(MAKE-SINGLE-FLOAT #x7F800000) #.(MAKE-SINGLE-FLOAT #x7F800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) @@ -3515,7 +2741,6 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-402D413D #x33018866)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) @@ -3537,7 +2762,6 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3FF6DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x0) NIL) @@ -3545,47 +2769,29 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x-3F7C458D #x2107A1BA)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA) #x0) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x-3F7C3D8D #x2107A1BA)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052) #.(MAKE-DOUBLE-FLOAT #x-3F78B6F0 #xD52D3052)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #x0) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0) #.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374) #x0) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374) #.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F6F3800 #x0) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3F6F3400 #x0) #x0) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD) #.(MAKE-DOUBLE-FLOAT #x-3F6C3EC7 #x9083D0DD)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400001 #xFF000000) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF800000)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x60000000) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x60000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x0) NIL) @@ -3595,7 +2801,6 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x0) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8)) T) @@ -3635,11 +2840,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x1) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x133) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x142) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x3AC) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x3BB) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x3CB) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x468) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x469) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x1FFFFFFF) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #xFFFFFFFFFFFFFFF) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x3FFFFFFFFFFFFFFF) NIL) @@ -3648,15 +2849,12 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3FF6DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E26DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C400000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C36DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C200000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C16DE05 #x54442D18)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x1FFFFF #xFFFFFFFE)) NIL) @@ -3699,8 +2897,7 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) NIL) +(>= (#.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x3FE62E42 #xFEFA39EF) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x3FE62E42 #xFEFA39EF) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x3FE6A09E #x667F3BCD) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) @@ -3711,7 +2908,6 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) @@ -3748,18 +2944,14 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x1) T) (>= (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #.(MAKE-DOUBLE-FLOAT #x40240000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x404A8000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87D) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87D) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87E) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x406633CE #x8FB9F87E) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x4083C273 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) +(>= (#.(MAKE-DOUBLE-FLOAT #x4083BA73 #x2107A1BA) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) @@ -3769,15 +2961,11 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) NIL) (>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3E200000 #x0)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000) #x0) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #x0) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x-3E300001 #xFF000000)) T) -(>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41CFFFFF #xFF800000)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x0) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000)) NIL) -(>= (#.(MAKE-DOUBLE-FLOAT #x41D00000 #x400000) #.(MAKE-DOUBLE-FLOAT #x41D00000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) T) @@ -3818,19 +3006,14 @@ (>= (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) (>= (#.(MAKE-DOUBLE-FLOAT #x7FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) T) -(ABS #.(MAKE-SINGLE-FLOAT #x-800001) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) -(ABS #.(MAKE-SINGLE-FLOAT #x7F7FFFFF) #.(MAKE-SINGLE-FLOAT #x7F7FFFFF)) -(ABS #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) (ABS #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (ABS #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x3FF921FB #x54442D18)) (ABS #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18) #.(MAKE-DOUBLE-FLOAT #x400921FB #x54442D18)) -(ABS #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF)) (ATAN (#.(MAKE-DOUBLE-FLOAT #x20000000 #x1)) #.(MAKE-DOUBLE-FLOAT #x20000000 #x1)) (CEILING (#.(MAKE-SINGLE-FLOAT #x-40800000) #x1) &VALUES #x-1 #.(MAKE-SINGLE-FLOAT #x0)) (CEILING (#.(MAKE-SINGLE-FLOAT #x-34800000) #x1) &VALUES #x-1000000 #.(MAKE-SINGLE-FLOAT #x0)) (CEILING (#.(MAKE-SINGLE-FLOAT #x-32000000) #x1) &VALUES #x-20000000 #.(MAKE-SINGLE-FLOAT #x0)) (CEILING (#.(MAKE-SINGLE-FLOAT #x-319194D8) #x1) &VALUES #x-3B9ACA00 #.(MAKE-SINGLE-FLOAT #x0)) -(CEILING (#.(MAKE-SINGLE-FLOAT #x-31400000) #x1) &VALUES #x-60000000 #.(MAKE-SINGLE-FLOAT #x0)) (CEILING (#.(MAKE-SINGLE-FLOAT #x-231194D8) #x1) &VALUES #x-773594000000000 #.(MAKE-SINGLE-FLOAT #x0)) (CEILING (#.(MAKE-SINGLE-FLOAT #x-22800000) #x1) &VALUES #x-1000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) (CEILING (#.(MAKE-SINGLE-FLOAT #x-21800000) #x1) &VALUES #x-4000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) @@ -3841,9 +3024,8 @@ (CEILING (#.(MAKE-SINGLE-FLOAT #x60000000) #x1) &VALUES #x20000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) (CEILING (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) #x1) &VALUES #x-1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (CEILING (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x1) &VALUES #x-143 #.(MAKE-DOUBLE-FLOAT #x-402C66F8 #x3D0DD000)) -(CEILING (#.(MAKE-DOUBLE-FLOAT #x-3F72231A #x420F4374) #x1) &VALUES #x-3BB #.(MAKE-DOUBLE-FLOAT #x-401C66F8 #x3D0DD000)) +(CEILING (#.(MAKE-DOUBLE-FLOAT #x-3F722B1A #x420F4374) #x1) &VALUES #x-3BA #.(MAKE-DOUBLE-FLOAT #x-401C66F8 #x3D0DD000)) (CEILING (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #x1) &VALUES #x-20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(CEILING (#.(MAKE-DOUBLE-FLOAT #x-3E280001 #xFFC00000) #x1) &VALUES #x-5FFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (CEILING (#.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0) #x1) &VALUES #x-20000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (CEILING (#.(MAKE-DOUBLE-FLOAT #x-3C62329C #xFF1194D8) #x1) &VALUES #x-773593FC4653600 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (CEILING (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #x1) &VALUES #x-1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) @@ -3861,68 +3043,52 @@ (COERCE (#x-1000000000000001 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-22800000)) (COERCE (#x-1000000000000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0)) (COERCE (#x-1000000000000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-22800000)) -(COERCE (#x-20000000000001 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) +(COERCE (#x-20000000000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) (COERCE (#x-80000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3E200000 #x0)) (COERCE (#x-80000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-31000000)) (COERCE (#x-20000001 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x800000)) (COERCE (#x-20000001 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-32000000)) (COERCE (#x-20000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0)) (COERCE (#x-20000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-32000000)) -(COERCE (#x-1000001 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-34800000)) -(COERCE (#x-F423F SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-368BDC10)) -(COERCE (#x-F3E58 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-368C1A80)) +(COERCE (#x-1000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-34800000)) (COERCE (#x-433 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3F6F3400 #x0)) (COERCE (#x-432 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3F6F3800 #x0)) -(COERCE (#x-3BD DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3F721800 #x0)) -(COERCE (#x-3BC DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3F722000 #x0)) -(COERCE (#x-3AE DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3F729000 #x0)) (COERCE (#x-144 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3F8BC000 #x0)) (COERCE (#x-143 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3F8BD000 #x0)) (COERCE (#x-135 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3F8CB000 #x0)) (COERCE (#x-F DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-3FD20000 #x0)) (COERCE (#x-1 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) -(COERCE (#x-1 FLOAT) #.(MAKE-SINGLE-FLOAT #x-40800000)) (COERCE (#x-1 LONG-FLOAT) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) (COERCE (#x-1 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-40800000)) (COERCE (#x0 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(COERCE (#x0 FLOAT) #.(MAKE-SINGLE-FLOAT #x0)) (COERCE (#x0 LONG-FLOAT) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (COERCE (#x0 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x0)) (COERCE (#x1/2 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x3FE00000 #x0)) (COERCE (#x1/2 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x3F000000)) (COERCE (#x1 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) -(COERCE (#x1 FLOAT) #.(MAKE-SINGLE-FLOAT #x3F800000)) (COERCE (#x1 LONG-FLOAT) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (COERCE (#x1 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x3F800000)) (COERCE (#x2 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) (COERCE (#x2 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x40000000)) (COERCE (#x7 LONG-FLOAT) #.(MAKE-DOUBLE-FLOAT #x401C0000 #x0)) -(COERCE (#xE SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x41600000)) (COERCE (#x35 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x404A8000 #x0)) (COERCE (#x133 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x40733000 #x0)) (COERCE (#x134 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x40734000 #x0)) -(COERCE (#x135 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x40735000 #x0)) (COERCE (#x142 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x40742000 #x0)) -(COERCE (#x3AC DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x408D6000 #x0)) -(COERCE (#x3AD DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x408D6800 #x0)) -(COERCE (#x3BB DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x408DD800 #x0)) (COERCE (#x3E8 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x447A0000)) (COERCE (#x3FF DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x408FF800 #x0)) (COERCE (#x400 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x40900000 #x0)) (COERCE (#xF423F SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x497423F0)) (COERCE (#xF4240 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x49742400)) -(COERCE (#x1000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4B800000)) +(COERCE (#xFFFFFF SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) (COERCE (#x1FFFFFE0 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) -(COERCE (#x1FFFFFE1 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) +(COERCE (#x1FFFFFE0 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4DFFFFFF)) (COERCE (#x1FFFFFFB SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4E000000)) (COERCE (#x1FFFFFFC SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4E000000)) (COERCE (#x1FFFFFFF DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000)) (COERCE (#x1FFFFFFF SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4E000000)) (COERCE (#x20000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) (COERCE (#x20000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4E000000)) -(COERCE (#x20000001 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4E000000)) -(COERCE (#x3FFFFFFE SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4E800000)) -(COERCE (#x3FFFFFFF SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4E800000)) (COERCE (#x7FFFFFFF DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41DFFFFF #xFFC00000)) (COERCE (#x7FFFFFFF SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x4F000000)) (COERCE (#x80000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41E00000 #x0)) @@ -3932,21 +3098,17 @@ (COERCE (#x10C6F7A0B5E LONG-FLOAT) #.(MAKE-DOUBLE-FLOAT #x4270C6F7 #xA0B5E000)) (COERCE (#x218DEF416BD SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x540637BD)) (COERCE (#x4189374BC6A7E LONG-FLOAT) #.(MAKE-DOUBLE-FLOAT #x4310624D #xD2F1A9F8)) -(COERCE (#x83126E978D4FD SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5903126F)) (COERCE (#x1FFFFFFFFFFFFF DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) -(COERCE (#x20000000000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43400000 #x0)) -(COERCE (#xFFFFFF000000001 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) -(COERCE (#xFFFFFFFFFFFFF81 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) +(COERCE (#xFFFFFF000000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5D7FFFFF)) +(COERCE (#xFFFFFFFFFFFFF80 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF)) (COERCE (#xFFFFFFFFFFFFFFB SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5D800000)) (COERCE (#xFFFFFFFFFFFFFFC SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5D800000)) (COERCE (#xFFFFFFFFFFFFFFF DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (COERCE (#xFFFFFFFFFFFFFFF SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5D800000)) (COERCE (#x1000000000000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (COERCE (#x1000000000000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5D800000)) -(COERCE (#x1000000000000001 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) -(COERCE (#x1000000000000001 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5D800000)) -(COERCE (#x3FFFFFC000000001 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) -(COERCE (#x3FFFFFFFFFFFFE01 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) +(COERCE (#x3FFFFFC000000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5E7FFFFF)) +(COERCE (#x3FFFFFFFFFFFFE00 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) (COERCE (#x3FFFFFFFFFFFFFC0 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) (COERCE (#x3FFFFFFFFFFFFFFB SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5E800000)) (COERCE (#x3FFFFFFFFFFFFFFC SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5E800000)) @@ -3954,8 +3116,6 @@ (COERCE (#x3FFFFFFFFFFFFFFF SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5E800000)) (COERCE (#x4000000000000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) (COERCE (#x4000000000000000 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5E800000)) -(COERCE (#x4000000000000001 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) -(COERCE (#x4000000000000001 SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5E800000)) (COERCE (#x7FFFFFFFFFFFFFFF DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) (COERCE (#x7FFFFFFFFFFFFFFF SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x5F000000)) (COERCE (#x8000000000000000 DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) @@ -3972,14 +3132,11 @@ (COERCE (#.(MAKE-SINGLE-FLOAT #x0) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x3F800000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xE0000000)) -(COERCE (#.(MAKE-SINGLE-FLOAT #x4E000000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41C00000 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41CDCD65 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x4EC90FDB) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x41D921FB #x60000000)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xE0000000)) -(COERCE (#.(MAKE-SINGLE-FLOAT #x5D800000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5E490FDB) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43C921FB #x60000000)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5E7FFFFF) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xE0000000)) -(COERCE (#.(MAKE-SINGLE-FLOAT #x5E800000) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) (COERCE (#.(MAKE-SINGLE-FLOAT #x5F490FDB) DOUBLE-FLOAT) #.(MAKE-DOUBLE-FLOAT #x43E921FB #x60000000)) (COERCE (#.(MAKE-DOUBLE-FLOAT #x-40100000 #x0) SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-40800000)) (COERCE (#.(MAKE-DOUBLE-FLOAT #x-4006DE05 #x54442D18) SINGLE-FLOAT) #.(MAKE-SINGLE-FLOAT #x-4036F025)) @@ -3996,22 +3153,15 @@ (EXP #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0) #.(MAKE-DOUBLE-FLOAT #x4005BF0A #x8B145769)) (EXPT (#.(MAKE-SINGLE-FLOAT #x40000000) #x3F) #.(MAKE-SINGLE-FLOAT #x5F000000)) (EXPT (#.(MAKE-DOUBLE-FLOAT #x40000000 #x0) #x3F) #.(MAKE-DOUBLE-FLOAT #x43E00000 #x0)) -(EXPT (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x-3BD) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(EXPT (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x-3AE) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (EXPT (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x-144) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (EXPT (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x-135) #.(MAKE-DOUBLE-FLOAT #xB815 #x7268FDAF)) (EXPT (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x133) #.(MAKE-DOUBLE-FLOAT #x7FAC7B1F #x3CAC7433)) (EXPT (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x142) #.(MAKE-DOUBLE-FLOAT #x7FF00000 #x0)) -(EXPT (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x3AC) #.(MAKE-DOUBLE-FLOAT #x7FF00000 #x0)) -(EXPT (#.(MAKE-DOUBLE-FLOAT #x40240000 #x0) #x3BB) #.(MAKE-DOUBLE-FLOAT #x7FF00000 #x0)) (FLOAT (#x0) #.(MAKE-SINGLE-FLOAT #x0)) (FLOAT (#x1) #.(MAKE-SINGLE-FLOAT #x3F800000)) (FLOAT (#x-20000000000000 #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-3CC00000 #x0)) (FLOAT (#x-1000000 #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x-34800000)) (FLOAT (#x1/10 #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x3D800000)) -(FLOAT (#x1 #.(MAKE-SINGLE-FLOAT #x-80000000)) #.(MAKE-SINGLE-FLOAT #x3F800000)) -(FLOAT (#x1 #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x3F800000)) -(FLOAT (#x1 #.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (FLOAT (#x1 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (FLOAT (#x1 #.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (FLOAT (#xFFFFFF #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x4B7FFFFF)) @@ -4024,9 +3174,6 @@ (FLOAT (#xFFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43B00000 #x0)) (FLOAT (#x3FFFFFFFFFFFFFFF #.(MAKE-SINGLE-FLOAT #x3F800000)) #.(MAKE-SINGLE-FLOAT #x5E800000)) (FLOAT (#x3FFFFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x43D00000 #x0)) -(FLOAT-SIGN (#.(MAKE-SINGLE-FLOAT #x-80000000)) #.(MAKE-SINGLE-FLOAT #x-40800000)) -(FLOAT-SIGN (#.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x3F800000)) -(FLOAT-SIGN (#.(MAKE-DOUBLE-FLOAT #x-80000000 #x0)) #.(MAKE-DOUBLE-FLOAT #x-40100000 #x0)) (FLOAT-SIGN (#.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (FLOAT-SIGN (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (FLOAT-SIGN (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) @@ -4035,13 +3182,10 @@ (FLOOR (#.(MAKE-SINGLE-FLOAT #x-22800000) #x1) &VALUES #x-1000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x-21800000) #x1) &VALUES #x-4000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x0) #x1) &VALUES #x0 #.(MAKE-SINGLE-FLOAT #x0)) -(FLOOR (#.(MAKE-SINGLE-FLOAT #x41600000) #x1) &VALUES #xE #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x4B7FFFFF) #x1) &VALUES #xFFFFFF #.(MAKE-SINGLE-FLOAT #x0)) -(FLOOR (#.(MAKE-SINGLE-FLOAT #x4D800000) #x1) &VALUES #x10000000 #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x4DFFFFFF) #x1) &VALUES #x1FFFFFE0 #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x4E000000) #x1) &VALUES #x20000000 #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x4E6E6B28) #x1) &VALUES #x3B9ACA00 #.(MAKE-SINGLE-FLOAT #x0)) -(FLOOR (#.(MAKE-SINGLE-FLOAT #x4EC00000) #x1) &VALUES #x60000000 #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x50000000) #x1) &VALUES #x200000000 #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x5CEE6B28) #x1) &VALUES #x773594000000000 #.(MAKE-SINGLE-FLOAT #x0)) (FLOOR (#.(MAKE-SINGLE-FLOAT #x5D7FFFFF) #x1) &VALUES #xFFFFFF000000000 #.(MAKE-SINGLE-FLOAT #x0)) @@ -4056,10 +3200,9 @@ (FLOOR (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #x1) &VALUES #x-4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (FLOOR (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x1) &VALUES #x0 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (FLOOR (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #x1) &VALUES #x134 #.(MAKE-DOUBLE-FLOAT #x3FD04D42 #x7DE7FC00)) -(FLOOR (#.(MAKE-DOUBLE-FLOAT #x408D6413 #x509F7A00) #x1) &VALUES #x3AC #.(MAKE-DOUBLE-FLOAT #x3FE04D42 #x7DE80000)) +(FLOOR (#.(MAKE-DOUBLE-FLOAT #x408D5C13 #x509F7A00) #x1) &VALUES #x3AB #.(MAKE-DOUBLE-FLOAT #x3FE04D42 #x7DE80000)) (FLOOR (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x1) &VALUES #x1FFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (FLOOR (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFFFFFFFF) #x1) &VALUES #x1FFFFFFF #.(MAKE-DOUBLE-FLOAT #x3FEFFFFF #xE0000000)) -(FLOOR (#.(MAKE-DOUBLE-FLOAT #x41D7FFFF #xFF800000) #x1) &VALUES #x5FFFFFFE #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (FLOOR (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #x1) &VALUES #x1FFFFFFFFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (FLOOR (#.(MAKE-DOUBLE-FLOAT #x439DCD64 #xFF1194D8) #x1) &VALUES #x773593FC4653600 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (FLOOR (#.(MAKE-DOUBLE-FLOAT #x43AFFFFF #xFFFFFFFF) #x1) &VALUES #xFFFFFFFFFFFFF80 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) @@ -4078,7 +3221,6 @@ (LOG (#x3FFFFFFFFFFFFFFF) #.(MAKE-SINGLE-FLOAT #x422BE687)) (LOG (#x4000000000000000) #.(MAKE-SINGLE-FLOAT #x422BE687)) (LOG (#x4000000000000001) #.(MAKE-SINGLE-FLOAT #x422BE687)) -(LOG (#.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x-100000 #x0)) (LOG (#.(MAKE-DOUBLE-FLOAT #x3FEFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x-43600000 #x0)) (LOG (#.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) #.(MAKE-DOUBLE-FLOAT #x3FE62E42 #xFEFA39EF)) (LOG (#.(MAKE-DOUBLE-FLOAT #x4005BF0A #x8B145769)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) @@ -4100,30 +3242,14 @@ (MIN (#.(MAKE-SINGLE-FLOAT #x4E000000) #.(MAKE-SINGLE-FLOAT #x-21800000)) #.(MAKE-SINGLE-FLOAT #x-21800000)) (MIN (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (MIN (#.(MAKE-DOUBLE-FLOAT #x3FE62E42 #xFEFA39EF) #.(MAKE-DOUBLE-FLOAT #x43CFFFFF #xFFFFFFFF)) #.(MAKE-DOUBLE-FLOAT #x3FE62E42 #xFEFA39EF)) -(RATIONAL #.(MAKE-SINGLE-FLOAT #x-40800000) #x-1) (RATIONAL #.(MAKE-SINGLE-FLOAT #x0) #x0) -(RATIONAL #.(MAKE-SINGLE-FLOAT #x3F800000) #x1) (RATIONAL #.(MAKE-DOUBLE-FLOAT #x-100001 #xFFFFFFFF) #x-FFFFFFFFFFFFF800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) (RATIONAL #.(MAKE-DOUBLE-FLOAT #x0 #x0) #x0) (RATIONAL #.(MAKE-DOUBLE-FLOAT #x7FEFFFFF #xFFFFFFFF) #xFFFFFFFFFFFFF800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) -(ROUND (#.(MAKE-SINGLE-FLOAT #x-32000000) #x1) &VALUES #x-20000000 #.(MAKE-SINGLE-FLOAT #x0)) -(ROUND (#.(MAKE-SINGLE-FLOAT #x-22800000) #x1) &VALUES #x-1000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) -(ROUND (#.(MAKE-SINGLE-FLOAT #x-21800000) #x1) &VALUES #x-4000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) -(ROUND (#.(MAKE-SINGLE-FLOAT #x4E000000) #x1) &VALUES #x20000000 #.(MAKE-SINGLE-FLOAT #x0)) -(ROUND (#.(MAKE-SINGLE-FLOAT #x5D800000) #x1) &VALUES #x1000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) -(ROUND (#.(MAKE-SINGLE-FLOAT #x5E800000) #x1) &VALUES #x4000000000000000 #.(MAKE-SINGLE-FLOAT #x0)) (ROUND (#.(MAKE-DOUBLE-FLOAT #x-3F8BCB1A #x420F4374) #x1) &VALUES #x-143 #.(MAKE-DOUBLE-FLOAT #x-402C66F8 #x3D0DD000)) -(ROUND (#.(MAKE-DOUBLE-FLOAT #x-3E400000 #x0) #x1) &VALUES #x-20000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(ROUND (#.(MAKE-DOUBLE-FLOAT #x-3C500000 #x0) #x1) &VALUES #x-1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(ROUND (#.(MAKE-DOUBLE-FLOAT #x-3C300000 #x0) #x1) &VALUES #x-4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (ROUND (#.(MAKE-DOUBLE-FLOAT #x40734413 #x509F79FF) #x1) &VALUES #x134 #.(MAKE-DOUBLE-FLOAT #x3FD04D42 #x7DE7FC00)) -(ROUND (#.(MAKE-DOUBLE-FLOAT #x41BFFFFF #xFF000000) #x1) &VALUES #x1FFFFFFF #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(ROUND (#.(MAKE-DOUBLE-FLOAT #x43B00000 #x0) #x1) &VALUES #x1000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) -(ROUND (#.(MAKE-DOUBLE-FLOAT #x43D00000 #x0) #x1) &VALUES #x4000000000000000 #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (SCALE-FLOAT (#.(MAKE-DOUBLE-FLOAT #x0 #x0) #x-35) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (SCALE-FLOAT (#.(MAKE-DOUBLE-FLOAT #x433FFFFF #xFFFFFFFF) #x-35) #.(MAKE-DOUBLE-FLOAT #x3FEFFFFF #xFFFFFFFF)) -(SQRT (#.(MAKE-SINGLE-FLOAT #x0)) #.(MAKE-SINGLE-FLOAT #x0)) -(SQRT (#.(MAKE-DOUBLE-FLOAT #x0 #x0)) #.(MAKE-DOUBLE-FLOAT #x0 #x0)) (SQRT (#.(MAKE-DOUBLE-FLOAT #x20100000 #x1)) #.(MAKE-DOUBLE-FLOAT #x30000000 #x0)) (SQRT (#.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) #.(MAKE-DOUBLE-FLOAT #x3FF00000 #x0)) (SQRT (#.(MAKE-DOUBLE-FLOAT #x40100000 #x0)) #.(MAKE-DOUBLE-FLOAT #x40000000 #x0)) From 82c7b005f06c71664caa72010049e5bf5c36e2c6 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 18:37:04 -0400 Subject: [PATCH 3989/4023] Use the correct test for "is FNAME defined?" --- src/compiler/ir2tran.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index c4687ad45f..fb827cae8c 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -158,7 +158,7 @@ ;; If NOT compiling to a file, then the function had better exist now. ;; If to a file, then it better exist at some point, but its existence ;; in the compilation lisp doesn't really imply that it will. - #-sb-xc-host (if (producing-fasl-file) t (find-fdefn name))) + #-sb-xc-host (if (producing-fasl-file) t (fboundp name))) (emit-move node block (make-load-time-constant-tn :known-fun name) res)) (t From 46b017845040516bd1deb6f52c657786f18feaee Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 19:25:02 -0400 Subject: [PATCH 3990/4023] Do an old FIXME from initial commit I have to say, it makes grepping for T feasible. --- src/compiler/generic/genesis.lisp | 7 ++--- src/runtime/backtrace.c | 10 ++++--- src/runtime/coalesce.c | 2 +- src/runtime/gc-common.c | 10 ++----- src/runtime/gencgc.c | 4 +-- src/runtime/interrupt.c | 12 ++++---- src/runtime/runtime.c | 2 +- src/runtime/safepoint.c | 48 +++++++++++++++---------------- src/runtime/thread.c | 4 +-- 9 files changed, 48 insertions(+), 51 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 8e1aef2c71..baccc3e0bb 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3458,16 +3458,15 @@ lispobj symbol_package(struct symbol*);~%" (genesis-header-prefix)) (dolist (binding sb-vm::per-thread-c-interface-symbols) (format stream "INITIALIZE_TLS(~A, ~A);~%" (c-symbol-name (if (listp binding) (car binding) binding) "*") - (if (listp binding) (second binding))))) + (let ((val (if (listp binding) (second binding)))) + (if (eq val 't) "LISP_T" val))))) (defun write-static-symbols (stream) (dolist (symbol (cons nil (coerce sb-vm:+static-symbols+ 'list))) - ;; FIXME: It would be nice to use longer names than NIL and - ;; (particularly) T in #define statements. (format stream "#define ~A LISPOBJ(0x~X)~%" ;; FIXME: It would be nice not to need to strip anything ;; that doesn't get stripped always by C-SYMBOL-NAME. - (c-symbol-name symbol "%*.!") + (if (eq symbol 't) "LISP_T" (c-symbol-name symbol "%*.!")) (if *static* ; if we ran GENESIS ;; We actually ran GENESIS, use the real value. (descriptor-bits (cold-intern symbol)) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index 881a76766c..d9b226e2d5 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -517,11 +517,13 @@ describe_thread_state(void) if (string[0]) printf("Signal mask: %s\n", string); #endif printf("Specials:\n"); - printf(" *GC-INHIBIT* = %s\n", (read_TLS(GC_INHIBIT, thread) == T) ? "T" : "NIL"); - printf(" *GC-PENDING* = %s\n", (read_TLS(GC_PENDING, thread) == T) ? "T" : "NIL"); - printf(" *INTERRUPTS-ENABLED* = %s\n", (read_TLS(INTERRUPTS_ENABLED, thread) == T) ? "T" : "NIL"); + printf(" *GC-INHIBIT* = %s\n", read_TLS(GC_INHIBIT, thread) == LISP_T ? "T" : "NIL"); + printf(" *GC-PENDING* = %s\n", read_TLS(GC_PENDING, thread) == LISP_T ? "T" : "NIL"); + printf(" *INTERRUPTS-ENABLED* = %s\n", + read_TLS(INTERRUPTS_ENABLED, thread) == LISP_T ? "T" : "NIL"); #ifdef STOP_FOR_GC_PENDING - printf(" *STOP-FOR-GC-PENDING* = %s\n", (read_TLS(STOP_FOR_GC_PENDING, thread) == T) ? "T" : "NIL"); + printf(" *STOP-FOR-GC-PENDING* = %s\n", + read_TLS(STOP_FOR_GC_PENDING, thread) == LISP_T ? "T" : "NIL"); #endif printf("Pending handler = %p\n", data->pending_handler); } diff --git a/src/runtime/coalesce.c b/src/runtime/coalesce.c index 00e5782f32..d9a2f99b5e 100644 --- a/src/runtime/coalesce.c +++ b/src/runtime/coalesce.c @@ -207,7 +207,7 @@ void coalesce_similar_objects() coalesce_range((lispobj*)READ_ONLY_SPACE_START, read_only_space_free_pointer, arg); lispobj* the_symbol_nil = (lispobj*)(NIL - LIST_POINTER_LOWTAG - N_WORD_BYTES); coalesce_range(the_symbol_nil, ALIGN_UP(SYMBOL_SIZE,2) + the_symbol_nil, arg); - coalesce_range((lispobj*)(T - OTHER_POINTER_LOWTAG), static_space_free_pointer, arg); + coalesce_range(STATIC_SPACE_OBJECTS_START, static_space_free_pointer, arg); #ifdef LISP_FEATURE_IMMOBILE_SPACE coalesce_range((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, arg); diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 4e5f44a058..7306dbeb7b 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1569,7 +1569,7 @@ static void scan_nonweak_kv_vector(struct vector *kv_vector, void (*scav_entry)( struct hash_table* ht = (struct hash_table*)native_pointer(kv_supplement); eql_hashing = hashtable_kind(ht) == 1; kv_supplement = ht->hash_vector; - } else if (kv_supplement == T) { // EQL hashing on a non-weak table + } else if (kv_supplement == LISP_T) { // EQL hashing on a non-weak table eql_hashing = 1; kv_supplement = NIL; } @@ -2226,11 +2226,7 @@ maybe_gc(os_context_t *context) * we may even be in a WITHOUT-INTERRUPTS. */ gc_happened = funcall1(StaticSymbolFunction(SUB_GC), 0); FSHOW((stderr, "/maybe_gc: gc_happened=%s\n", - (gc_happened == NIL) - ? "NIL" - : ((gc_happened == T) - ? "T" - : "0"))); + gc_happened == NIL ? "NIL" : gc_happened == LISP_T ? "T" : "0")); /* gc_happened can take three values: T, NIL, 0. * * T means that the thread managed to trigger a GC, and post-gc @@ -2243,7 +2239,7 @@ maybe_gc(os_context_t *context) * triggered by this thread; success, but post-gc doesn't have * to be called. */ - if ((gc_happened == T) && + if ((gc_happened == LISP_T) && /* See if interrupts are enabled or it's possible to enable * them. POST-GC has a similar check, but we don't want to * unlock deferrables in that case and get a pending interrupt diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 28457b785f..5061b8704a 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -586,7 +586,7 @@ write_heap_exhaustion_report(FILE *file, long available, long requested, fprintf(file, "GC control variables:\n"); fprintf(file, " *GC-INHIBIT* = %s\n *GC-PENDING* = %s\n", read_TLS(GC_INHIBIT,thread)==NIL ? "false" : "true", - (read_TLS(GC_PENDING, thread) == T) ? + (read_TLS(GC_PENDING, thread) == LISP_T) ? "true" : ((read_TLS(GC_PENDING, thread) == NIL) ? "false" : "in progress")); #ifdef LISP_FEATURE_SB_THREAD @@ -5015,7 +5015,7 @@ lisp_alloc(int flags, struct alloc_region *region, sword_t nbytes, if (read_TLS(GC_PENDING,thread) == NIL) { /* set things up so that GC happens when we finish the PA * section */ - write_TLS(GC_PENDING,T,thread); + write_TLS(GC_PENDING, LISP_T, thread); if (read_TLS(GC_INHIBIT,thread) == NIL) { #ifdef LISP_FEATURE_SB_SAFEPOINT thread_register_gc_trigger(); diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 9bd6b2aebb..d684561b7f 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -767,7 +767,7 @@ check_interrupt_context_or_lose(os_context_t *context) #if defined(LISP_FEATURE_GENCGC) && !GENCGC_IS_PRECISE int interrupts_enabled = (read_TLS(INTERRUPTS_ENABLED,thread) != NIL); int gc_inhibit = (read_TLS(GC_INHIBIT,thread) != NIL); - int gc_pending = (read_TLS(GC_PENDING,thread) == T); + int gc_pending = (read_TLS(GC_PENDING,thread) == LISP_T); int pseudo_atomic_interrupted = get_pseudo_atomic_interrupted(thread); int in_race_p = in_leaving_without_gcing_race_p(thread); int safepoint_active = 0; @@ -1037,7 +1037,7 @@ interrupt_internal_error(os_context_t *context, boolean continuable) // describe_internal_error(context); // uncomment me for debugging funcall2(StaticSymbolFunction(INTERNAL_ERROR), context_sap, - continuable ? T : NIL); + continuable ? LISP_T : NIL); undo_fake_foreign_function_call(context); /* blocks signals again */ if (continuable) @@ -1135,7 +1135,7 @@ interrupt_handle_pending(os_context_t *context) /* Test for T and not for != NIL since the value :IN-PROGRESS * used to be used in SUB-GC as part of the mechanism to * supress recursive gcs.*/ - if (read_TLS(GC_PENDING,thread) == T) { + if (read_TLS(GC_PENDING,thread) == LISP_T) { /* Two reasons for doing this. First, if there is a * pending handler we don't want to run. Second, we are @@ -1379,7 +1379,7 @@ can_handle_now(void *handler, struct interrupt_data *data, event3("can_handle_now(%p,%d): deferred (RACE=%d)", handler, signal, in_leaving_without_gcing_race_p(thread)); store_signal_data_for_later(data,handler,signal,info,context); - write_TLS(INTERRUPT_PENDING, T,thread); + write_TLS(INTERRUPT_PENDING, LISP_T, thread); answer = 0; } /* a slightly confusing test. arch_pseudo_atomic_atomic() doesn't @@ -1429,11 +1429,11 @@ sig_stop_for_gc_handler(int __attribute__((unused)) signal, * pseudo atomic until gc is finally allowed. */ if (read_TLS(GC_INHIBIT,thread) != NIL) { event0("stop_for_gc deferred for *GC-INHIBIT*"); - write_TLS(STOP_FOR_GC_PENDING,T,thread); + write_TLS(STOP_FOR_GC_PENDING, LISP_T, thread); return; } else if (arch_pseudo_atomic_atomic(context)) { event0("stop_for_gc deferred for PA"); - write_TLS(STOP_FOR_GC_PENDING,T,thread); + write_TLS(STOP_FOR_GC_PENDING, LISP_T, thread); arch_set_pseudo_atomic_interrupted(context); maybe_save_gc_mask_and_block_deferrables (os_context_sigmask_addr(context)); diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 687bf23cfb..88b3a4227b 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -734,7 +734,7 @@ initialize_lisp(int argc, char *argv[], char *envp[]) #endif define_var("nil", NIL, 1); - define_var("t", T, 1); + define_var("t", LISP_T, 1); if (!options.disable_lossage_handler_p) enable_lossage_handler(); diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 1a556b9c8d..e5a17d6423 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -286,7 +286,7 @@ static inline gc_phase_t gc_phase_next(gc_phase_t old) { static inline boolean thread_blocks_gc(struct thread *thread) { - return read_TLS(GC_INHIBIT,thread)==T; + return read_TLS(GC_INHIBIT,thread)==LISP_T; } /* set_thread_csp_access -- alter page permissions for not-in-Lisp flag (Lisp Stack Top) of the thread `th'. The flag may be modified @@ -342,14 +342,14 @@ static inline void gc_notify_early() * need them to hit their CSP or the GSP, and we unmap * the GSP when transitioning to GC_INVOKED. */ gc_state.phase_wait[GC_MESSAGE]++; - SET_THREAD_STOP_PENDING(p,T); + SET_THREAD_STOP_PENDING(p, LISP_T); } else if (thread_blocks_gc(p)) { /* Threads "in-alien" don't block leaving GC_MESSAGE, * as the CSP trap is sufficient to catch them, but * any thread that is WITHOUT-GCING prevents exit from * GC_INVOKED. */ gc_state.phase_wait[GC_INVOKED]++; - SET_THREAD_STOP_PENDING(p,T); + SET_THREAD_STOP_PENDING(p, LISP_T); } } } @@ -373,7 +373,7 @@ static inline void gc_notify_final() boolean was_in_lisp = !set_thread_csp_access(p,0); if (was_in_lisp) { gc_state.phase_wait[GC_SETTLED]++; - SET_THREAD_STOP_PENDING(p,T); + SET_THREAD_STOP_PENDING(p, LISP_T); } } } @@ -383,12 +383,12 @@ static inline void gc_done() { CURRENT_THREAD_VAR(self); struct thread *p; - boolean inhibit = (read_TLS(GC_INHIBIT,self)==T); + boolean inhibit = (read_TLS(GC_INHIBIT,self)==LISP_T); odxprint(safepoints,"%s","global denotification"); WITH_ALL_THREADS_LOCK { for_each_thread(p) { - if (inhibit && (read_TLS(GC_PENDING,p)==T)) + if (inhibit && (read_TLS(GC_PENDING,p)==LISP_T)) write_TLS(GC_PENDING,NIL,p); set_thread_csp_access(p,1); } @@ -470,7 +470,7 @@ thread_register_gc_trigger() struct thread *self = get_sb_vm_thread(); WITH_GC_STATE_LOCK { if (gc_state.phase == GC_NONE && - read_TLS(IN_SAFEPOINT,self)!=T && + read_TLS(IN_SAFEPOINT,self)!=LISP_T && !thread_blocks_gc(self)) { /* A thread (this thread), while doing allocation, has * determined that we need to run the garbage collector. @@ -544,7 +544,7 @@ check_pending_thruptions(os_context_t *ctx) * "signal". */ if (thread_extra_data(p)->pending_signal_set) if (__sync_fetch_and_and(&thread_extra_data(p)->pending_signal_set,0)) - write_TLS(THRUPTION_PENDING, T, p); + write_TLS(THRUPTION_PENDING, LISP_T, p); #endif if (!thread_may_thrupt(ctx)) @@ -639,25 +639,25 @@ int check_pending_gc(__attribute((unused)) os_context_t *ctx) int done = 0; sigset_t sigset; - if ((read_TLS(IN_SAFEPOINT,self) == T) && + if ((read_TLS(IN_SAFEPOINT,self) == LISP_T) && ((read_TLS(GC_INHIBIT,self) == NIL) && (read_TLS(GC_PENDING,self) == NIL))) { write_TLS(IN_SAFEPOINT,NIL,self); } if (!thread_blocks_gc(self) && (read_TLS(IN_SAFEPOINT, self) == NIL)) { - if (read_TLS(GC_PENDING, self) == T) { + if (read_TLS(GC_PENDING, self) == LISP_T) { lispobj gc_happened = NIL; - bind_variable(IN_SAFEPOINT,T,self); + bind_variable(IN_SAFEPOINT,LISP_T,self); block_deferrable_signals(&sigset); - if(read_TLS(GC_PENDING,self)==T) + if(read_TLS(GC_PENDING,self)==LISP_T) gc_happened = funcall1(StaticSymbolFunction(SUB_GC), 0); unbind(self); thread_sigmask(SIG_SETMASK,&sigset,NULL); - if (gc_happened == T) { + if (gc_happened == LISP_T) { /* POST_GC wants to enable interrupts */ - if ((read_TLS(INTERRUPTS_ENABLED,self) == T || - read_TLS(ALLOW_WITH_INTERRUPTS,self) == T) + if ((read_TLS(INTERRUPTS_ENABLED,self) == LISP_T || + read_TLS(ALLOW_WITH_INTERRUPTS,self) == LISP_T) && can_invoke_post_gc(self)) funcall0(StaticSymbolFunction(POST_GC)); done = 1; @@ -678,8 +678,8 @@ void thread_in_lisp_raised(os_context_t *ctxptr) * there is a stop-for-GC or thruption pending. */ WITH_GC_STATE_LOCK { if (gc_state.phase == GC_FLIGHT && - read_TLS(GC_PENDING,self)==T && - !thread_blocks_gc(self) && read_TLS(IN_SAFEPOINT,self)!=T) { + read_TLS(GC_PENDING,self)==LISP_T && + !thread_blocks_gc(self) && read_TLS(IN_SAFEPOINT,self)!=LISP_T) { /* Some thread (possibly even this one) that does not have * GC_INHIBIT set has noticed that a GC is warranted and * advanced the phase to GC_FLIGHT, arming the GSP trap, @@ -699,7 +699,7 @@ void thread_in_lisp_raised(os_context_t *ctxptr) gc_advance(GC_NONE,GC_QUIET); } else { /* ??? Isn't this already T? */ - write_TLS(GC_PENDING,T,self); + write_TLS(GC_PENDING,LISP_T,self); } csp_around_foreign_call(self) = 0; check_gc_and_thruptions = 1; @@ -732,7 +732,7 @@ void thread_in_lisp_raised(os_context_t *ctxptr) * we'll take a PIT stop and wind up in the case * above... Or we'll call gc_stop_the_world(). */ gc_advance(GC_INVOKED,gc_state.phase); - SET_THREAD_STOP_PENDING(self,T); + SET_THREAD_STOP_PENDING(self,LISP_T); /* Why do we not want to run thruptions here? */ } } @@ -795,7 +795,7 @@ void thread_in_safety_transition(os_context_t *ctxptr) * logic is identical to the similar case in * thread_in_lisp_raised(). */ gc_advance(GC_INVOKED,gc_state.phase); - SET_THREAD_STOP_PENDING(self,T); + SET_THREAD_STOP_PENDING(self,LISP_T); } } } @@ -915,13 +915,13 @@ void wake_thread_impl(struct thread_instance *lispthread) struct thread* thread = (void*)lispthread->uw_primitive_thread; wake_thread_io(thread); - if (read_TLS(THRUPTION_PENDING,thread)==T) + if (read_TLS(THRUPTION_PENDING,thread)==LISP_T) return; - write_TLS(THRUPTION_PENDING,T,thread); + write_TLS(THRUPTION_PENDING,LISP_T,thread); - if ((read_TLS(GC_PENDING,thread)==T) - ||(THREAD_STOP_PENDING(thread)==T) + if ((read_TLS(GC_PENDING,thread)==LISP_T) + ||(THREAD_STOP_PENDING(thread)==LISP_T) ) return; diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 40a969c1c4..8f97f00711 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -532,7 +532,7 @@ void* new_thread_trampoline(void* arg) // 'th->lisp_thread' remains valid despite not being in all_threads // due to the pinning via *STARTING-THREADS*. struct thread_instance *lispthread = (void*)native_pointer(th->lisp_thread); - if (lispthread->_ephemeral_p == T) th->state_word.user_thread_p = 0; + if (lispthread->_ephemeral_p == LISP_T) th->state_word.user_thread_p = 0; /* Potentially set the externally-visible name of this thread, * and for a whole pile of crazy, look at get_max_thread_name_length_impl() in @@ -915,7 +915,7 @@ alloc_thread_struct(void* spaces) { __attribute((unused)) lispobj* tls = (lispobj*)th; #ifdef THREAD_T_NIL_CONSTANTS_SLOT - tls[THREAD_T_NIL_CONSTANTS_SLOT] = (NIL << 32) | T; + tls[THREAD_T_NIL_CONSTANTS_SLOT] = (NIL << 32) | LISP_T; #endif #ifdef THREAD_ALIEN_LINKAGE_TABLE_BASE_SLOT tls[THREAD_ALIEN_LINKAGE_TABLE_BASE_SLOT] = (lispobj)ALIEN_LINKAGE_TABLE_SPACE_START; From ede9b6ffb04096cc72172fdcbb1e797eea3143da Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 20:32:07 -0400 Subject: [PATCH 3991/4023] Weed out more chaff from win32 headers macros that conflict with the real pthread headers? Just why. Tested on 64-bit only. --- src/runtime/coalesce.c | 2 +- src/runtime/pthreads_win32.h | 29 ----------------------------- src/runtime/win32-os.h | 19 ------------------- 3 files changed, 1 insertion(+), 49 deletions(-) diff --git a/src/runtime/coalesce.c b/src/runtime/coalesce.c index d9a2f99b5e..e4ca8f9bac 100644 --- a/src/runtime/coalesce.c +++ b/src/runtime/coalesce.c @@ -207,7 +207,7 @@ void coalesce_similar_objects() coalesce_range((lispobj*)READ_ONLY_SPACE_START, read_only_space_free_pointer, arg); lispobj* the_symbol_nil = (lispobj*)(NIL - LIST_POINTER_LOWTAG - N_WORD_BYTES); coalesce_range(the_symbol_nil, ALIGN_UP(SYMBOL_SIZE,2) + the_symbol_nil, arg); - coalesce_range(STATIC_SPACE_OBJECTS_START, static_space_free_pointer, arg); + coalesce_range((lispobj*)STATIC_SPACE_OBJECTS_START, static_space_free_pointer, arg); #ifdef LISP_FEATURE_IMMOBILE_SPACE coalesce_range((lispobj*)FIXEDOBJ_SPACE_START, fixedobj_free_pointer, arg); diff --git a/src/runtime/pthreads_win32.h b/src/runtime/pthreads_win32.h index 8e58c8f525..28b20860d8 100644 --- a/src/runtime/pthreads_win32.h +++ b/src/runtime/pthreads_win32.h @@ -13,13 +13,6 @@ typedef int sigset_t; /* 0 - Misc */ -#ifndef SIG_IGN -#define SIG_IGN ((void (*)(int, siginfo_t, void*))-1) -#endif -#ifndef SIG_DFL -#define SIG_DFL ((void (*)(int, siginfo_t, void*))-2) -#endif - #define SIGHUP 1 #define SIGINT 2 /* Interactive attention */ #define SIGQUIT 3 @@ -41,8 +34,6 @@ typedef int sigset_t; #define SIGBREAK 21 /* Control-break */ #define SIGABRT 22 /* Abnormal termination (abort) */ -#define SIGRTMIN 23 - #ifndef NSIG #define NSIG 32 /* maximum signal number + 1 */ #endif @@ -60,32 +51,12 @@ typedef struct timespec { } timespec; #endif -/* some MinGWs seem to include it, others not: */ -#ifndef ETIMEDOUT -# define ETIMEDOUT 123 //Something -#endif - int sched_yield(); typedef struct { int bogus; } siginfo_t; -#define SA_SIGINFO (1u<<1) -#define SA_NODEFER (1u<<2) -#define SA_RESTART (1u<<3) -#define SA_ONSTACK (1u<<4) - -struct sigaction { - void (*sa_handler)(int); - void (*sa_sigaction)(int, siginfo_t*, void*); - sigset_t sa_mask; - int sa_flags; -}; -int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact); - -int sigpending(sigset_t *set); - int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signum); diff --git a/src/runtime/win32-os.h b/src/runtime/win32-os.h index 4e2bb1d81e..8c755f8ea2 100644 --- a/src/runtime/win32-os.h +++ b/src/runtime/win32-os.h @@ -29,12 +29,7 @@ #include "target-arch-os.h" #include "target-arch.h" -#ifdef LISP_FEATURE_SB_THREAD #include "pthreads_win32.h" -#else -typedef void *siginfo_t; -typedef int sigset_t; -#endif typedef LPVOID os_vm_address_t; typedef uword_t os_vm_size_t; @@ -46,18 +41,9 @@ typedef int os_vm_prot_t; #define OS_VM_PROT_WRITE 2 #define OS_VM_PROT_EXECUTE 4 -#define os_open_core(file,mode) win32_open_for_mmap(file) -#define HAVE_os_open_core - -#define os_fopen_runtime(file,mode) win32_fopen_runtime() -#define HAVE_os_fopen_runtime - extern int os_number_of_processors; #define HAVE_os_number_of_processors -extern int win32_open_for_mmap(const char* file); -extern FILE* win32_fopen_runtime(); - // 64-bit uses whatever TLS index the kernels gives us which we store in // 'sbcl_thread_tls_index' to hold our thread-local value of the pointer // to struct thread. @@ -69,11 +55,6 @@ extern DWORD sbcl_thread_tls_index; #else #define OUR_TLS_INDEX 63 #endif -#define SIG_MEMORY_FAULT SIGSEGV - -#define SIG_STOP_FOR_GC (SIGRTMIN+1) -#define SIG_DEQUEUE (SIGRTMIN+2) -#define SIG_THREAD_EXIT (SIGRTMIN+3) struct lisp_exception_frame { struct lisp_exception_frame *next_frame; From 415faaa792344e4bade5789fcb0c4c5a11ea8c1d Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 21:00:38 -0400 Subject: [PATCH 3992/4023] Do two more FIXMEs * name current_thread consistently for +/- gcc-tls * put StaticSymbolFunction() in a less random place --- src/compiler/generic/genesis.lisp | 33 ++++++++++++++++++------------- src/runtime/arm64-assem.S | 2 +- src/runtime/ppc-assem.S | 2 +- src/runtime/thread.c | 6 +++--- src/runtime/thread.h | 15 +++----------- 5 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index baccc3e0bb..2891ec24ce 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -3326,27 +3326,32 @@ Legal values for OFFSET are -4, -8, -12, ..." ~{~% ~a, ~a, ~a, ~a~^,~}~%};~%" flavor (coerce a 'list))))) (defun write-cast-operator (operator-name c-name lowtag stream) - (when (eq operator-name 'symbol) - (format stream " + (format stream "static inline struct ~A* ~A(lispobj obj) { + return (struct ~A*)(obj - ~D);~%}~%" c-name operator-name c-name lowtag) + (case operator-name + (fdefn + (format stream "#define StaticSymbolFunction(x) FdefnFun(x##_FDEFN) +/* Return 'fun' given a tagged pointer to an fdefn. */ +static inline lispobj FdefnFun(lispobj fdefn) { return FDEFN(fdefn)->fun; }~%")) + (symbol + (format stream " lispobj symbol_function(struct symbol* symbol); #include \"~A/vector.h\" struct vector *symbol_name(struct symbol*);~% lispobj symbol_package(struct symbol*);~%" (genesis-header-prefix)) - (format stream "static inline int symbol_package_id(struct symbol* s) { return ~A; }~%" + (format stream "static inline int symbol_package_id(struct symbol* s) { return ~A; }~%" #+compact-symbol (format nil "s->name >> ~D" sb-impl::symbol-name-bits) #-compact-symbol "fixnum_value(s->package_id)") - #+compact-symbol - (progn (format stream "#define decode_symbol_name(ptr) (ptr & (uword_t)0x~X)~%" - (mask-field (byte sb-impl::symbol-name-bits 0) -1)) - (format stream "static inline void set_symbol_name(struct symbol*s, lispobj name) { + #+compact-symbol + (progn (format stream "#define decode_symbol_name(ptr) (ptr & (uword_t)0x~X)~%" + (mask-field (byte sb-impl::symbol-name-bits 0) -1)) + (format stream "static inline void set_symbol_name(struct symbol*s, lispobj name) { s->name = (s->name & (uword_t)0x~X) | name;~%}~%" - (mask-field (byte sb-impl::package-id-bits sb-impl::symbol-name-bits) -1))) - #-compact-symbol - (progn (format stream "#define decode_symbol_name(ptr) ptr~%") - (format stream "static inline void set_symbol_name(struct symbol*s, lispobj name) { - s->name = name;~%}~%"))) - (format stream "static inline struct ~A* ~A(lispobj obj) { - return (struct ~A*)(obj - ~D);~%}~%" c-name operator-name c-name lowtag)) + (mask-field (byte sb-impl::package-id-bits sb-impl::symbol-name-bits) -1))) + #-compact-symbol + (progn (format stream "#define decode_symbol_name(ptr) ptr~%") + (format stream "static inline void set_symbol_name(struct symbol*s, lispobj name) { + s->name = name;~%}~%"))))) (defun mangle-c-slot-name (obj-name slot-name) ;; For data hiding purposes, change the name of vector->length to vector->length_. diff --git a/src/runtime/arm64-assem.S b/src/runtime/arm64-assem.S index 8be7897528..863e341a5d 100644 --- a/src/runtime/arm64-assem.S +++ b/src/runtime/arm64-assem.S @@ -150,7 +150,7 @@ GNAME(call_into_lisp): ldr reg_THREAD, [reg_THREAD,x0] #endif #else - ldr x0, specials + ldr x0, current_thread bl pthread_getspecific mov reg_THREAD, x0 #endif diff --git a/src/runtime/ppc-assem.S b/src/runtime/ppc-assem.S index eacb9704d2..342952dc0d 100644 --- a/src/runtime/ppc-assem.S +++ b/src/runtime/ppc-assem.S @@ -197,7 +197,7 @@ x: mr reg_A2, reg_NL2 /* Call out to obtain our TLS block. */ - load(reg_NL0,CSYMBOL(specials)) + load(reg_NL0,CSYMBOL(current_thread)) lis reg_CFUNC,CSYMBOL(pthread_getspecific)@h ori reg_CFUNC,reg_CFUNC,CSYMBOL(pthread_getspecific)@l mtctr reg_CFUNC diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 8f97f00711..be4672b4de 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -73,7 +73,7 @@ struct thread *all_threads; #ifdef LISP_FEATURE_GCC_TLS __thread struct thread *current_thread; #elif !defined LISP_FEATURE_WIN32 -pthread_key_t specials = 0; +pthread_key_t current_thread = 0; #endif #ifdef LISP_FEATURE_WIN32 @@ -264,7 +264,7 @@ extern int arch_prctl(int code, unsigned long *addr); #elif defined LISP_FEATURE_GCC_TLS # define ASSIGN_CURRENT_THREAD(x) current_thread = x #elif !defined LISP_FEATURE_WIN32 -# define ASSIGN_CURRENT_THREAD(x) pthread_setspecific(specials, x) +# define ASSIGN_CURRENT_THREAD(x) pthread_setspecific(current_thread, x) #else # define ASSIGN_CURRENT_THREAD(x) TlsSetValue(OUR_TLS_INDEX, x) #endif @@ -335,7 +335,7 @@ void create_main_lisp_thread(lispobj function) { lose("can't create initial thread"); th->state_word.sprof_enable = 1; #if defined LISP_FEATURE_SB_THREAD && !defined LISP_FEATURE_GCC_TLS && !defined LISP_FEATURE_WIN32 - pthread_key_create(&specials, 0); + pthread_key_create(¤t_thread, 0); #endif #if defined LISP_FEATURE_DARWIN && defined LISP_FEATURE_SB_THREAD pthread_key_create(&foreign_thread_ever_lispified, 0); diff --git a/src/runtime/thread.h b/src/runtime/thread.h index 8d7e0e15a3..d9dd469bad 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -196,14 +196,6 @@ SetSymbolValue(lispobj tagged_symbol_pointer,lispobj val, void *thread) # define read_TLS(sym, thread) SYMBOL(sym)->value #endif -// FIXME: very random that this is defined in 'thread.h' -#define StaticSymbolFunction(x) FdefnFun(x##_FDEFN) -/* Return 'fun' given a tagged pointer to an fdefn. */ -static inline lispobj FdefnFun(lispobj fdefn) -{ - return FDEFN(fdefn)->fun; -} - /* These are for use during GC, on the current thread, or on prenatal * threads only. */ #if defined(LISP_FEATURE_SB_THREAD) @@ -238,11 +230,10 @@ static inline lispobj FdefnFun(lispobj fdefn) #endif #ifdef LISP_FEATURE_SB_THREAD -// FIXME: these names should be consistent with one another # ifdef LISP_FEATURE_GCC_TLS extern __thread struct thread *current_thread; # elif !defined LISP_FEATURE_WIN32 -extern pthread_key_t specials; +extern pthread_key_t current_thread; #endif #endif @@ -325,7 +316,7 @@ static inline struct thread *get_sb_vm_thread(void) # ifdef LISP_FEATURE_GCC_TLS th = current_thread; # else - th = pthread_getspecific(specials); + th = pthread_getspecific(current_thread); # endif # if defined LISP_FEATURE_X86 && (defined LISP_FEATURE_DARWIN || defined LISP_FEATURE_FREEBSD) @@ -348,7 +339,7 @@ inline static int lisp_thread_p(os_context_t __attribute__((unused)) *context) { # elif defined LISP_FEATURE_WIN32 return TlsGetValue(OUR_TLS_INDEX) != 0; # else - return pthread_getspecific(specials) != NULL; + return pthread_getspecific(current_thread) != NULL; # endif #elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK) char *csp = (char *)*os_context_sp_addr(context); From 8c91954ad5c372e16c151023b55f578ca3e4bf0c Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 22:13:59 -0400 Subject: [PATCH 3993/4023] Add missing arg --- src/runtime/immobile-space.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/immobile-space.c b/src/runtime/immobile-space.c index c30485b022..7a6a27eb38 100644 --- a/src/runtime/immobile-space.c +++ b/src/runtime/immobile-space.c @@ -2041,7 +2041,7 @@ static void defrag_immobile_space(boolean verbose) #if 0 // It's easy to mess things up, so assert correctness before saving a core. printf("verifying defrag\n"); - verify_heap(1); + verify_heap(&verbose, VERIFY_POST_GC|VERIFY_AGGRESSIVE); #endif free(fixedobj_tempspace.start); free(text_tempspace.start); From 2599bf317e218901b4f446bddad9e3b1d87bfc53 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 23:10:20 -0400 Subject: [PATCH 3994/4023] Change setf-fdefinition-hook to a defglobal There's no way it was intended to allow thread-local bindings. And technically since it's not in SB-EXT nobody should set it. Therefore it can't ever acquire a value other than its default. --- src/code/fdefinition.lisp | 28 ++++++++++------------------ src/compiler/generic/genesis.lisp | 3 +++ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/code/fdefinition.lisp b/src/code/fdefinition.lisp index c2ff4de9af..c33e0f21be 100644 --- a/src/code/fdefinition.lisp +++ b/src/code/fdefinition.lisp @@ -352,7 +352,7 @@ (setf fun (encapsulation-info-definition encap-info)) (return fun))))) -(defvar *setf-fdefinition-hook* nil +(define-load-time-global *setf-fdefinition-hook* nil "A list of functions that (SETF FDEFINITION) invokes before storing the new value. The functions take the function name and the new value.") @@ -377,27 +377,20 @@ ;; Check for hash-table stuff. Woe onto him that mixes encapsulation ;; with this. - (when (and (symbolp name) (fboundp name)) - (let ((old (symbol-function name))) - (when (boundp '*setf-fdefinition-hook*) - (dolist (spec *user-hash-table-tests*) + (when (symbolp name) + (let ((old (%symbol-function name))) + (dolist (spec *user-hash-table-tests*) (cond ((eq old (second spec)) ;; test-function (setf (second spec) new-value)) ((eq old (third spec)) ;; hash-function - (setf (third spec) new-value))))))) + (setf (third spec) new-value)))))) - ;; FIXME: This is a good hook to have, but we should probably - ;; reserve it for users. (let ((fdefn (find-or-create-fdefn name))) - ;; *SETF-FDEFINITION-HOOK* won't be bound when initially running - ;; top level forms in the kernel core startup. - (when (boundp '*setf-fdefinition-hook*) - (dolist (f *setf-fdefinition-hook*) - (declare (type function f)) - (funcall f name new-value))) - + (dolist (f *setf-fdefinition-hook*) + (declare (type function f)) + (funcall f name new-value)) (let ((encap-info (encapsulation-info (fdefn-fun fdefn)))) (cond (encap-info (loop @@ -406,9 +399,8 @@ (encapsulation-info-definition encap-info)))) (if more-info (setf encap-info more-info) - (return - (setf (encapsulation-info-definition encap-info) - new-value)))))) + (return (setf (encapsulation-info-definition encap-info) + new-value)))))) (t (setf (fdefn-fun fdefn) new-value))))))) diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 2891ec24ce..2a0c82d8d5 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -1964,6 +1964,9 @@ core and return a descriptor to it." (cold-set 'sb-c::*code-serialno* (make-fixnum-descriptor (1+ sb-c::*code-serialno*))) + (cold-set 'sb-impl::*setf-fdefinition-hook* *nil-descriptor*) + (cold-set 'sb-impl::*user-hash-table-tests* *nil-descriptor*) + ;; Put the C-callable fdefns into the static-fdefn vector if #+immobile-code. #+immobile-code (let* ((space *immobile-text*) From 8344f98eafcd14bae121da86b6ecfffecd984748 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Thu, 15 Sep 2022 23:38:43 -0400 Subject: [PATCH 3995/4023] Express range_dirty_p() with less nesting --- src/runtime/gencgc.c | 74 ++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 5061b8704a..6c25126266 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -2801,6 +2801,8 @@ static inline void protect_page(void* page_addr) } #endif +#define LOCKFREE_LIST_NEXT(x) ((struct instance*)x)->slots[INSTANCE_DATA_START] + /* Helper function for update_writeprotection. * If the [where,limit) contain an old->young pointer, then return * the address - or approximate address - containing such pointer. @@ -2808,58 +2810,50 @@ static inline void protect_page(void* page_addr) * want to see the address */ static lispobj* range_dirty_p(lispobj* where, lispobj* limit, generation_index_t gen) { - while ( where < limit ) { + sword_t nwords; + for ( ; where < limit ; where += nwords ) { lispobj word = *where; if (is_cons_half(word)) { if (is_lisp_pointer(word) && !ptr_ok_to_writeprotect(word, gen)) return where; word = where[1]; if (is_lisp_pointer(word) && !ptr_ok_to_writeprotect(word, gen)) return where; - where += 2; + nwords = 2; continue; } int widetag = widetag_of(where); - sword_t nwords = sizetab[widetag](where); - sword_t index; - if (leaf_obj_widetag_p(widetag)) { - // Do nothing - } else if (widetag == CODE_HEADER_WIDETAG) { - // This function will never be called on a page of code - lose("code @ %p on non-code page", where); - } else { + gc_dcheck(widetag !== CODE_HEADER_WIDETAG); // This can't be called on a code page + nwords = sizetab[widetag](where); + if (leaf_obj_widetag_p(widetag)) continue; // Do nothing #ifdef LISP_FEATURE_COMPACT_INSTANCE_HEADER - if (instanceoid_widetag_p(widetag)) { - // instance_layout works on funcallable or regular instances - // and we have to specially check it because it's in the upper - // bytes of the 0th word. - lispobj layout = instance_layout(where); - if (layout) { - if (!ptr_ok_to_writeprotect(layout, gen)) return where; - if (lockfree_list_node_layout_p(LAYOUT(layout)) && - !ptr_ok_to_writeprotect(((struct instance*)where) - ->slots[INSTANCE_DATA_START], gen)) - return where; - } - } -#else - if (widetag == INSTANCE_WIDETAG) { - // instance_layout works only on regular instances, - // we don't have to treat it specially but we do have to - // check for lockfree list nodes. - lispobj layout = instance_layout(where); - if (layout && lockfree_list_node_layout_p(LAYOUT(layout)) && - !ptr_ok_to_writeprotect(((struct instance*)where) - ->slots[INSTANCE_DATA_START], gen)) - return where; - } -#endif - // Scan all the rest of the words even if some of them are raw bits. - // At worst this overestimates the set of pointer words. - for (index=1; index<nwords; ++index) { - if (is_lisp_pointer(where[index]) && !ptr_ok_to_writeprotect(where[index], gen)) + if (instanceoid_widetag_p(widetag)) { + // instance_layout works on funcallable or regular instances + // and we have to specially check it because it's in the upper + // bytes of the 0th word. + lispobj layout = instance_layout(where); + if (layout) { + if (!ptr_ok_to_writeprotect(layout, gen)) return where; + if (lockfree_list_node_layout_p(LAYOUT(layout)) && + !ptr_ok_to_writeprotect(LOCKFREE_LIST_NEXT(where), gen)) return where; } } - where += nwords; +#else + if (widetag == INSTANCE_WIDETAG) { + // instance_layout works only on regular instances, + // we don't have to treat it specially but we do have to + // check for lockfree list nodes. + lispobj layout = instance_layout(where); + if (layout && lockfree_list_node_layout_p(LAYOUT(layout)) && + !ptr_ok_to_writeprotect(LOCKFREE_LIST_NEXT(where), gen)) + return where; + } +#endif + // Scan all the rest of the words even if some of them are raw bits. + // At worst this overestimates the set of pointer words. + sword_t index; + for (index=1; index<nwords; ++index) + if (is_lisp_pointer(where[index]) && !ptr_ok_to_writeprotect(where[index], gen)) + return where; } return 0; } From f5386462b3ad5548763bc7de21d71cb723352af7 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 10:00:55 -0400 Subject: [PATCH 3996/4023] Perform darwin-related housekeeping 32-bit x86 was dropped as of rev 75a9f0dc55db. I don't have any *BSD variant but hopefully someone can test. --- src/runtime/interrupt.c | 6 ----- src/runtime/x86-arch.c | 2 -- src/runtime/x86-assem.S | 56 +--------------------------------------- src/runtime/x86-bsd-os.c | 23 ++--------------- 4 files changed, 3 insertions(+), 84 deletions(-) diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index d684561b7f..5ddb03eebf 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1751,13 +1751,7 @@ arrange_return_to_c_function(os_context_t *context, void arrange_return_to_lisp_function(os_context_t *context, lispobj function) { -#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86) - arrange_return_to_c_function(context, - (call_into_lisp_lookalike)call_into_lisp_tramp, - function); -#else arrange_return_to_c_function(context, call_into_lisp, function); -#endif } // These have undefined_alien_function tramp in x-assem.S diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 90459cb955..3043b461ca 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -69,8 +69,6 @@ os_context_flags_addr(os_context_t *context) return &context->uc_mcontext.mc_eflags; #elif defined __OpenBSD__ return &context->sc_eflags; -#elif defined LISP_FEATURE_DARWIN - return (int *)(&context->uc_mcontext->SS.EFLAGS); #elif defined __NetBSD__ return &(context->uc_mcontext.__gregs[_REG_EFL]); #elif defined LISP_FEATURE_WIN32 diff --git a/src/runtime/x86-assem.S b/src/runtime/x86-assem.S index df19ace806..974c1b10ae 100644 --- a/src/runtime/x86-assem.S +++ b/src/runtime/x86-assem.S @@ -62,7 +62,7 @@ * that are defined to be no-ops on win32. Hopefully this still works on * other platforms. */ -#if !defined(LISP_FEATURE_WIN32) && !defined(LISP_FEATURE_DARWIN) +#if !defined(LISP_FEATURE_WIN32) #define TYPE(name) .type name,@function #define SIZE(name) .size name,.-name #else @@ -614,56 +614,6 @@ GNAME(exception_handler_wrapper): SIZE(GNAME(exception_handler_wrapper)) #endif -#ifdef LISP_FEATURE_DARWIN - .align align_16byte - .globl GNAME(call_into_lisp_tramp) - TYPE(GNAME(call_into_lisp_tramp)) -GNAME(call_into_lisp_tramp): - /* 1. build the stack frame from the block that's pointed to by ECX - 2. free the block - 3. set ECX to 0 - 4. call the function via call_into_lisp - */ - pushl 0(%ecx) /* return address */ - - pushl %ebp - movl %esp, %ebp - - pushl 32(%ecx) /* eflags */ - pushl 28(%ecx) /* EAX */ - pushl 20(%ecx) /* ECX */ - pushl 16(%ecx) /* EDX */ - pushl 24(%ecx) /* EBX */ - pushl $0 /* popal is going to ignore esp */ - pushl %ebp /* is this right?? */ - pushl 12(%ecx) /* ESI */ - pushl 8(%ecx) /* EDI */ - pushl $0 /* args for call_into_lisp */ - pushl $0 - pushl 4(%ecx) /* function to call */ - - /* free our save block */ - pushl %ecx /* reserve sufficient space on stack for args */ - pushl %ecx - andl $0xfffffff0, %esp /* align stack */ - movl $0x40, 4(%esp) - movl %ecx, (%esp) - call GNAME(os_invalidate) - - /* call call_into_lisp */ - leal -48(%ebp), %esp - call GNAME(call_into_lisp) - - /* Clean up our mess */ - leal -36(%ebp), %esp - popal - popfl - leave - ret - - SIZE(call_into_lisp_tramp) -#endif - .align align_16byte,0x90 .globl GNAME(post_signal_tramp) TYPE(GNAME(post_signal_tramp)) @@ -674,10 +624,6 @@ GNAME(post_signal_tramp): addl $12,%esp /* clear call_into_lisp args from stack */ popal /* restore registers */ popfl -#ifdef LISP_FEATURE_DARWIN - /* skip two padding words */ - addl $8,%esp -#endif leave ret SIZE(GNAME(post_signal_tramp)) diff --git a/src/runtime/x86-bsd-os.c b/src/runtime/x86-bsd-os.c index 2d1bac9a2e..0597ee7eb9 100644 --- a/src/runtime/x86-bsd-os.c +++ b/src/runtime/x86-bsd-os.c @@ -6,14 +6,8 @@ #ifdef LISP_FEATURE_SB_THREAD -#ifdef LISP_FEATURE_DARWIN -#include <architecture/i386/table.h> -#include <i386/user_ldt.h> -#include <mach/mach_init.h> -#else #include <machine/segments.h> #include <machine/sysarch.h> -#endif /* LISP_FEATURE_DARWIN */ #endif #if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DRAGONFLY) @@ -34,13 +28,9 @@ * almost every line of code. It would be nice to find some way to * factor out the commonality better; failing that, it might be best * just to split this generic-BSD code into one variant for each BSD. - * - * KLUDGE II: this split has begun with the addition of the Darwin BSD - * flavour, with the cross-architecture complications that this - * entails; unfortunately, currently the situation is worse, not - * better, than in the above paragraph. */ + */ -#if defined(LISP_FEATURE_FREEBSD) || defined(__OpenBSD__) || defined(LISP_FEATURE_DARWIN) || defined(__DragonFly__) +#if defined(LISP_FEATURE_FREEBSD) || defined(__OpenBSD__) || defined(__DragonFly__) int * os_context_register_addr(os_context_t *context, int offset) { @@ -125,11 +115,6 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length) { } -/* Note: the Darwin versions of arch_os_thread_init found in - * x86-darwin-os.c -*/ -#if !defined(LISP_FEATURE_DARWIN) - #ifdef LISP_FEATURE_SB_THREAD void set_data_desc_size(struct segment_descriptor* desc, unsigned long size) @@ -144,9 +129,6 @@ void set_data_desc_addr(struct segment_descriptor* desc, void* addr) desc->sd_hibase = ((unsigned int)addr & 0xff000000) >> 24; } -#endif - -#ifdef LISP_FEATURE_SB_THREAD void arch_os_load_ldt(struct thread *thread) { @@ -210,7 +192,6 @@ int arch_os_thread_cleanup(struct thread *thread) { return 1; /* success */ } -#endif /* !LISP_FEATURE_DARWIN */ #if defined(LISP_FEATURE_FREEBSD) #if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT) From cad8039b3c6326ab5c3763a378163f71121f09c6 Mon Sep 17 00:00:00 2001 From: Stas Boukarev <stassats@gmail.com> Date: Fri, 16 Sep 2022 18:04:56 +0300 Subject: [PATCH 3997/4023] Transform FROUND on floats when #+round-float is available. --- src/compiler/float-tran.lisp | 20 ++++++++++++++++++++ src/compiler/srctran.lisp | 3 --- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/compiler/float-tran.lisp b/src/compiler/float-tran.lisp index 93b07a4470..2813ea7d23 100644 --- a/src/compiler/float-tran.lisp +++ b/src/compiler/float-tran.lisp @@ -1816,3 +1816,23 @@ (complex single-float-negative-infinity single-float-positive-infinity) (complex single-float-negative-infinity single-float-negative-infinity) (complex single-float-positive-infinity single-float-negative-infinity))) + +#+round-float +(deftransform fround ((number &optional divisor) (double-float t)) + (if (or (not divisor) + (and (constant-lvar-p divisor) + (= (lvar-value divisor) 1))) + `(let ((res (round-double number :round))) + (values res (- number res))) + `(let ((res (round-double (/ number (%double-float divisor)) :round))) + (values res (- number (* res divisor)))))) + +#+round-float +(deftransform fround ((number &optional divisor) (single-float (or null single-float rational))) + (if (or (not divisor) + (and (constant-lvar-p divisor) + (= (lvar-value divisor) 1))) + `(let ((res (round-single number :round))) + (values res (- number res))) + `(let ((res (round-single (/ number (%single-float divisor)) :round))) + (values res (- number (* res divisor)))))) diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 232ea6b7ee..a3f7796ac2 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -309,9 +309,6 @@ (define-source-transform oddp (x) `(logtest ,x 1)) (define-source-transform evenp (x) `(not (logtest ,x 1))) -;;; Note that all the integer division functions are available for -;;; inline expansion. - (macrolet ((deffrob (fun) `(define-source-transform ,fun (x &optional (y nil y-p)) (declare (ignore y)) From b4b87cca6580ce02112bb11dfa1f3488800b735f Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 11:39:23 -0400 Subject: [PATCH 3998/4023] Remove a bunch of "#ifdef GENCGC" etc Just some very obtrusive ones for starters. If there were another collector to be added, I'd like to think that we can confine the ifdeffage to header files, though maybe not. --- src/runtime/coreparse.c | 63 +---------------------------------------- src/runtime/gc-common.c | 16 ----------- 2 files changed, 1 insertion(+), 78 deletions(-) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 7d3d542863..d13a6b8720 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -591,12 +591,8 @@ static void relocate_heap(struct heap_adjust* adj) #ifdef LISP_FEATURE_IMMOBILE_SPACE relocate_space(FIXEDOBJ_SPACE_START, fixedobj_free_pointer, adj); #endif -#ifdef LISP_FEATURE_CHENEYGC - relocate_space(DYNAMIC_0_SPACE_START, (lispobj*)get_alloc_pointer(), adj); -#else relocate_space(DYNAMIC_SPACE_START, (lispobj*)dynamic_space_highwatermark(), adj); -#endif #ifdef LISP_FEATURE_IMMOBILE_SPACE relocate_space(TEXT_SPACE_START, text_space_highwatermark, adj); #endif @@ -703,14 +699,7 @@ process_directory(int count, struct ndir_entry *entry, lispobj** pfree_pointer; // pointer to x_free_pointer } spaces[MAX_CORE_SPACE_ID+1] = { {0, 0, 0, 0}, // blank for space ID 0 -#ifdef LISP_FEATURE_GENCGC {dynamic_space_size, 0, DYNAMIC_SPACE_START, 0}, -#else - // Whatever address the core's dynamic space has - // becomes subspace 0. The other is subspace 1. - // It makes no difference which has the lower address. - {dynamic_space_size, 0, DYNAMIC_0_SPACE_START, 0}, -#endif // This order is determined by constants in compiler/generic/genesis {0, 0, STATIC_SPACE_START, &static_space_free_pointer}, @@ -854,25 +843,6 @@ process_directory(int count, struct ndir_entry *entry, break; #endif case DYNAMIC_CORE_SPACE_ID: -#ifdef LISP_FEATURE_CHENEYGC - { - uword_t semispace_0_start = ALIGN_UP(addr, BACKEND_PAGE_BYTES); - uword_t semispace_0_end = ALIGN_DOWN(addr + request, BACKEND_PAGE_BYTES); - // assign to 'addr' too, because that's where we load the core file - DYNAMIC_0_SPACE_START = addr = semispace_0_start; - current_dynamic_space = (lispobj*)addr; - // Request that much again now - uword_t addr1 = (uword_t)os_validate(MOVABLE, 0, request, 1, 0); - uword_t semispace_1_start = ALIGN_UP(addr1, BACKEND_PAGE_BYTES); - uword_t semispace_1_end = ALIGN_DOWN(addr1 + request, BACKEND_PAGE_BYTES); - - DYNAMIC_1_SPACE_START = semispace_1_start; - uword_t semispace_0_size = semispace_0_end - semispace_0_start; - uword_t semispace_1_size = semispace_1_end - semispace_1_start; - dynamic_space_size = - semispace_0_size < semispace_1_size ? semispace_0_size : semispace_1_size; - } -#else /* gencgc */ { uword_t aligned_start = ALIGN_UP(addr, GENCGC_PAGE_BYTES); /* Misalignment can happen only if card size exceeds OS page. @@ -882,7 +852,6 @@ process_directory(int count, struct ndir_entry *entry, DYNAMIC_SPACE_START = addr = aligned_start; check_dynamic_space_addr_ok(addr, dynamic_space_size); } -#endif break; } @@ -926,16 +895,8 @@ process_directory(int count, struct ndir_entry *entry, *spaces[id].pfree_pointer = free_pointer; break; case DYNAMIC_CORE_SPACE_ID: -#ifdef LISP_FEATURE_CHENEYGC - /* 'addr' is the actual address if relocatable. - * For cheneygc, this will be whatever the GC was using - * at the time the core was saved. - * For gencgc this is #defined as DYNAMIC_SPACE_START */ - current_dynamic_space = (lispobj *)addr; -#else next_free_page = ALIGN_UP(entry->nwords<<WORD_SHIFT, GENCGC_PAGE_BYTES) / GENCGC_PAGE_BYTES; -#endif anon_dynamic_space_start = (os_vm_address_t)(addr + len); } } @@ -946,15 +907,9 @@ process_directory(int count, struct ndir_entry *entry, spaces[READ_ONLY_CORE_SPACE_ID].base, // expected spaces[READ_ONLY_CORE_SPACE_ID].len); #endif -#ifdef LISP_FEATURE_GENCGC set_adjustment(adj, DYNAMIC_SPACE_START, // actual spaces[DYNAMIC_CORE_SPACE_ID].base, // expected spaces[DYNAMIC_CORE_SPACE_ID].len); -#else - set_adjustment(adj, DYNAMIC_0_SPACE_START, // actual - spaces[DYNAMIC_CORE_SPACE_ID].base, // expected - spaces[DYNAMIC_CORE_SPACE_ID].len); -#endif // LISP_FEATURE_GENCGC #ifdef LISP_FEATURE_IMMOBILE_SPACE if (lisp_code_in_elf() && TEXT_SPACE_START != spaces[IMMOBILE_TEXT_CORE_SPACE_ID].base) { lose("code-in-elf + PIE not supported"); @@ -990,12 +945,8 @@ process_directory(int count, struct ndir_entry *entry, #endif } -#ifdef LISP_FEATURE_GENCGC extern void gc_load_corefile_ptes(int, core_entry_elt_t, core_entry_elt_t, os_vm_offset_t offset, int fd); -#else -#define gc_load_corefile_ptes(dummy1,dummy2,dummy3,dummy4,dummy5) -#endif static void sanity_check_loaded_core(lispobj); @@ -1073,14 +1024,13 @@ load_core_file(char *file, os_vm_offset_t file_offset, int merge_core_pages) // fprintf(stderr, "NOTE: TLS size increased to %x\n", dynamic_values_bytes); } #endif -#ifdef LISP_FEATURE_GENCGC + // simple-fun implies cold-init, not a warm core (it would be a closure then) if (widetag_of(native_pointer(initial_function)) == SIMPLE_FUN_WIDETAG && !lisp_startup_options.noinform) { fprintf(stderr, "Initial page table:\n"); extern void print_generation_stats(void); print_generation_stats(); } -#endif sanity_check_loaded_core(initial_function); return initial_function; case RUNTIME_OPTIONS_MAGIC: break; // already processed @@ -1278,12 +1228,7 @@ static uword_t visit(lispobj* where, lispobj* limit, uword_t arg) return 0; } -#ifdef LISP_FEATURE_GENCGC #define count_this_pointer_p(ptr) (find_page_index((void*)ptr) >= 0) -#endif -#ifdef LISP_FEATURE_CHENEYGC -#define count_this_pointer_p(ptr) (1) -#endif static void sanity_check_loaded_core(lispobj initial_function) { @@ -1312,13 +1257,7 @@ static void sanity_check_loaded_core(lispobj initial_function) if (count_this_pointer_p(ptr)) tally(ptr, &v[0]); // Pass 2: Count all heap objects v[1].reached = &reached; -#ifdef LISP_FEATURE_GENCGC walk_generation(visit, -1, (uword_t)&v[1]); -#endif -#ifdef LISP_FEATURE_CHENEYGC - visit((lispobj*)READ_ONLY_SPACE_START, read_only_space_free_pointer, (uword_t)&v[1]); - visit((lispobj*)STATIC_SPACE_START, static_space_free_pointer, (uword_t)&v[1]); -#endif // Pass 3: Compare // Start with the conses diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 7306dbeb7b..071cb3d72a 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -240,7 +240,6 @@ sword_t scavenge(lispobj *start, sword_t n_words) * * In case of card-spanning objects, the 'start' and 'end' parameters might not * exactly delimit objects boundaries. */ -#ifdef LISP_FEATURE_GENCGC int descriptors_scavenge(lispobj *start, lispobj* end, generation_index_t gen, int dirty) { @@ -295,7 +294,6 @@ int descriptors_scavenge(lispobj *start, lispobj* end, } return dirty; } -#endif /* If 'fun' is provided, then call it on each livened object, * otherwise use scav1() */ @@ -354,9 +352,7 @@ extern int pin_all_dynamic_space_code; static struct code * trans_code(struct code *code) { -#ifdef LISP_FEATURE_GENCGC gc_dcheck(!pin_all_dynamic_space_code); -#endif /* if object has already been transported, just return pointer */ if (forwarding_pointer_p((lispobj *)code)) { return (struct code *)native_pointer(forwarding_pointer_value((lispobj*)code)); @@ -411,11 +407,7 @@ trans_code(struct code *code) } }) gencgc_apply_code_fixups(code, new_code); -#ifdef LISP_FEATURE_GENCGC - /* Cheneygc doesn't need this os_flush_icache, it flushes the whole - spaces once when all copying is done. */ os_flush_icache(code_text_start(new_code), code_text_size(new_code)); -#endif return new_code; } @@ -560,7 +552,6 @@ static inline lispobj copy_instance(lispobj object) void* region = small_mixed_region; int page_type = PAGE_TYPE_SMALL_MIXED; -#ifdef LISP_FEATURE_GENCGC struct layout* layout = (void*)native_pointer(instance_layout(INSTANCE(object))); struct bitmap bitmap; const int words_per_card = GENCGC_CARD_BYTES>>WORD_SHIFT; @@ -581,7 +572,6 @@ static inline lispobj copy_instance(lispobj object) (layout_flags(layout) & STRICTLY_BOXED_FLAG)) page_type = PAGE_TYPE_BOXED, region = boxed_region; } -#endif lispobj copy; // KLUDGE: reading both flags at once doesn't really work @@ -1244,11 +1234,9 @@ void smash_weak_pointers(void) * it has been, the weak pointer is still good and needs to be * updated. Otherwise, the weak pointer needs to be broken. */ TEST_WEAK_CELL(wp->value, val, UNBOUND_MARKER_WIDETAG) -#ifdef LISP_FEATURE_GENCGC // Large objects are "moved" by touching the page table gen field. // Do nothing if the target of this weak pointer had that happen. else if (new_space_p(val)) { } -#endif else lose("unbreakable pointer %p", wp); } @@ -1903,10 +1891,8 @@ void cull_weak_hash_tables(int (*alivep[4])(lispobj,lispobj)) * which is what an extra reset would do if it saw no inserts. */ if (weak_objects.count) hopscotch_reset(&weak_objects); -#ifdef LISP_FEATURE_GENCGC // Close the region used when pushing items to the finalizer queue ensure_region_closed(cons_region, PAGE_TYPE_CONS); -#endif } @@ -2134,7 +2120,6 @@ valid_lisp_pointer_p(lispobj pointer) * cases when we could answer the question more simply. * So unfortunately this generic interface has to know something about * which GC is in use. */ -#ifdef LISP_FEATURE_GENCGC page_index_t page = find_page_index((void*)pointer); if (page >= 0 && (page_table[page].type & PAGE_TYPE_MASK) == PAGE_TYPE_BOXED) { @@ -2146,7 +2131,6 @@ valid_lisp_pointer_p(lispobj pointer) LOWTAG_FOR_WIDETAG(*native_pointer(pointer) & WIDETAG_MASK)) == pointer; } -#endif lispobj *start = search_all_gc_spaces((void*)pointer); if (start != NULL) return properly_tagged_descriptor_p((void*)pointer, start); From 0975516d59694ba38be01bc5ed5df64899da0fca Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 11:41:47 -0400 Subject: [PATCH 3999/4023] Get parallel-exec to exit cleanly on x86-64 macOS --- tests/exhaust.impure.lisp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/exhaust.impure.lisp b/tests/exhaust.impure.lisp index 9ae2646c49..6a9b1d1c98 100644 --- a/tests/exhaust.impure.lisp +++ b/tests/exhaust.impure.lisp @@ -31,6 +31,11 @@ (defvar *count* 100) +;; Don't want to keep seeing failures that happen under parallel-exec +;; (It's not even "random" now - it's pretty reliable) +;; Gotta do with fork() or something that I don't care to diagnose. +#+(and darwin x86-64 parallel-test-runner) (invoke-restart 'run-tests::skip-file) + ;;; Base-case: detecting exhaustion (with-test (:name (:exhaust :basic)) (assert (eq :exhausted From 7026bb841aa63c4d43339afb49d837a4497c468a Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 11:56:50 -0400 Subject: [PATCH 4000/4023] Remove mach-exception-handler --- .../mach-exception-handler-notes | 254 ------------------ src/compiler/generic/objdef.lisp | 2 - src/runtime/bsd-os.c | 12 - src/runtime/darwin-os.c | 139 ---------- src/runtime/interrupt.c | 1 - src/runtime/thread.c | 10 - src/runtime/thread.h | 7 +- src/runtime/x86-arch.c | 4 +- 8 files changed, 2 insertions(+), 427 deletions(-) delete mode 100644 doc/internals-notes/mach-exception-handler-notes diff --git a/doc/internals-notes/mach-exception-handler-notes b/doc/internals-notes/mach-exception-handler-notes deleted file mode 100644 index c2d69f533c..0000000000 --- a/doc/internals-notes/mach-exception-handler-notes +++ /dev/null @@ -1,254 +0,0 @@ - -MACH EXCEPTION HANDLER NOTES -Cyrus Harmon, December 2007 - -The goal of this work is to use make SBCL use mach exception handlers -instead of so-called BSD-style signal handlers on Mac OS X. Cyrus -Harmon and Alastair Bridgewater have been working on this. - -Mac OS X has a mach-based kernel that has its own API for things like -threads and exception handling. Both mach exception handlers and -BSD-style signal handlers are available for use by application -programmers, but the signal handlers, which are implemented as a -compatibility layer on top of mach exceptions, have some problems. The -main problem for SBCL is that when using BSD-style signal handlers to -respond to SIGSEGV for access to protected memory areas, we cannot use -gdb to debug the process. This is problematic for SBCL which sets up, -and reads and writes to, protected memory areas early and -often. Additionally, threaded builds are seeing a number of problems -with SIGILLs being thrown at odd times. It appears that these are -coming from with the OS signal handling libraries directly, so -debugging these is rather tricky, especially in the absence of a -debugger. Thirdly, the protected memory accesses can, under certain -settings, trigger the Mac OS X CrashReporter, either logging -voluminous messages to a log file or, worse yet, triggering a -user-intervention dialog. - -To address these three problems, we propose replacing the BSD-style -signal handling facility with a mach exception handling -facility. Preliminary tests with mach exceptions show that GDB is much -happier when using mach exceptions to respond to access to protected -memory. While mach exceptions probably won't directly fix the -threading problems, they remove a potentially problematic section of -code, the portion of the Mac OS X system library that deals with -BSD-style signal handling emulation and delivery of those signals to -multiple threads. Even if using mach exceptions in and of itself -doesn't immediately fix the problem, it should me much easier to -diagnose using a debugger. Finally, the CrashReporter problem appears -to go away as well, as this arises from an unfortunate placement of -the CrashReporting facility in the OS between the mach exception -handling and the BSD-style signal emulation. By catching the mach -exceptions ourselves, we avoid this problem. - -* Mach exception handling details and example - -Mach exceptions work by creating a thread that listens for mach -exceptions. The (slightly under-documented) OS function mach_msg_server -is passed the exc_server function and exc_server in turn calls our -catch_exception_raise function when an appropriate exception is -triggered. (Note that catch_exception_raise is called by exc_server -directly by that name. I have no idea how to provide multiple such -functions or to call this function by another name, but we should be -OK with a a single exception handling function.) - -To set this up we perform the following steps: - -1. allocate a mach port for our exceptions. - -2. give the process the right to send and receive exceptions on this - port. - -3. create a new thread which calls mach_msg_server, providing - exc_server as an argument. exc_server in turn calls our - catch_exception_raise when an exception is raised. - -4. finally, each thread for which we would like exceptions to be - handled must register itself with the exception port by calling - thread_set_exception_ports with the appropriate port and exception - mask. Actually, it's a bit more involved than this in order to - support multiple threads. Please document this fully. - -* USE_MACH_EXCEPTION_HANDLER - -The conditional compilation directive USE_MACH_EXCEPTION_HANDLER is a -flag to use mach exception handling. We should continue to support the -BSD-style signal handling until long after we are convinced that the -mach exception handling version works better. - -* Establishing the mach exception handler - -** x86-darwin-os.c - -A new function, darwin_init, is added which creates the mach exception -handling thread and establishes the exception port. Currently the -"main" thread sets its exception port here, but when we go to a -multithreaded SBCL, we will need to do similarly for new threads in -arch_os_thread_init. Note that even "non-threaded" SBCL builds will -have two threads, one lisp thread and a mach exception handling -thread. - -catch_exception_raise listens for EXC_BAD_ACCESS and -EXC_BAD_INSTRUCTION (and EXC_BREAKPOINT if we were to use INT3 traps -again instead of the SIGILL traps we've set up as a workaround to the -broken INT3 traps). Analogous to the signal handling context, mach -exceptions allow use to get the thread and exception state of the -triggering thread. We build a "fake" signal context, similar to what -would be seen if a SIGSEGV/SIGILL were triggered and pass this on to -SBCL's memory_fault_handler (for SIGSEGV) or sigill_handler (for -SIGILL). when the handlers return, we set the values of the -thread_state using the values from the fake context, allowing the -"signal handler" to modify the state of the calling thread. - -** x86-arch.c - -sigill_handler and sigtrap_handler are no longer installed as signal -handlers using undoably_install_low_level_interrupt_handler. Instead -sigill_handler is called directly by the mach exception handling -catch_exception_raise. This means that sigill_handler can no longer be -static void and it is changed to just void. - -** bsd-os.c - -memory_fault_error no longer installed using -undoably_install_low_level_interrupt_handler and changed to not be -static. darwin_init called. - -* Handling exceptions - -** interrupt.c - -The code for general purpose error handling, which is generally done -by a trap instruction followed by an error opcode (although on Mac OS, -we use UD2A instead of INT3 as INT3 trapping is unreliable and the -sigill_handler in turn calls the sigtrap_handler). sigtrap_handler in -turn calls functions like interrupt_internal_error that are found in -interrupt.c. - -Using BSD-style signal handling, interrupt_internal_error calls into -lisp via the lisp function INTERNAL-ERROR via funcall2 (the two -argument form of funcall). Since we are executing the exception -handler on the exception handling thread and we don't really want to -be executing lisp code on the exception handlers thread, we want to -return to the lisp thread as quickly as possible. With BSD-style -signal handling, the signal handlers themselves call into lisp using -funcallN. We can't do this as then we would be attempting to execute -lisp code on the exception handling thread. This would be a bad thing -in a multi-threaded lisp. Therefore, we borrow a trick from the -interrupt handling code and hack the stack of the offending thread -such that when the mach exception handling code returns, and returns -control back to the offending thread, it first calls a lisp function, -then (unless otherwise directed) returns control to the lisp -thread. This allows us to run our lisp (or other) code on the -offending thread's stack, but before the offending thread resumes -where it left off. See the arrange_return_to_lisp_function for details -on how this is done. - -arrange_return_to_lisp_function was modified to take an additional -parameter specifying the number of additional arguments, and -additional varargs, which are then placed on the stack in the -call_into_lisp_tramp in x86-assem.S. - -The problem with this is that both the signal handling/mach exception -handling code, on the one hand, and the lisp code expect access to the -"context" for accessing the state of the thread at the time that the -signal/exception was raised. This means that the old strategy was: - -offending thread - (operating system establishes signal context) - signal handler - lisp code - signal handler - (operating system restores state from signal context) -offending thread - -and both the signal handler and the lisp code have the chance to -examine and modify the signal context. Now the situation looks like -this: - -offending thread - (operating system establishes thread_state) - mach_exception_handler - signal handler (which may arrange return to a lisp function) - mach_exception_handler - (operating system restores from thread_state) - (optionally, a lisp function is called here) -offending thread - -So we need to figure out how to provide the lisp function with -information about the context of the offending thread and allow the -lisp code to alter this state and to restore that state prior to -resuming control to the offending thread. - -There are, presumably, additional problems with exception masking and -when threads are allowed to interrupt other threads or otherwise catch -signals/exceptions, but we can defer those for the moment. - -* Providing a "context" for lisp functions called on returning from a -mach exception handler - -Given the flow describe above, we need to expand the following step: - - (optionally, a lisp function is called here) - -now it needs to look something like: - -0. offending thread triggers a mach exception - -1. (operating system establishes thread_state) - -2. enter mach_exception_handler - - 2a. signal handler (which may arrange return to a lisp function - - 2b. frob the offending threads stack, allocating a context on the - stack (if appropriate, or always?) - -3. exit mach_exception_handler - -4. (operating system restores from thread_state) - -6. with the context on the stack, transfer control to the lisp - function - -7. restore the thread state from the context which either returns - control to original location in the offending thread or to wherever - the error-handling code has modified the context to point to - - -* x86-darwin-os.c (again) - -** call_c_function_in_context and signal_emulation_wrapper - -We arrange for a function to be a called by the offending the thread -when the mach exception handler returns. Essentially we have our own -BSD-style signal emulation library that calls memory_fault_handler, -sigtrap_handler and sigill_handler, as appropriate. It does this by -calling a function call_c_function_in_context which sets up the EIP of -the thread context to call the specified C function, which the -specified arguments. In this case, signal_emulation_wrapper which -takes as arguments a thread_state, which is a copy of the thread state -as it existed upon entry into catch_exception_raise, and an emulated -signal and siginfo and the signal handling function that -signal_emulation_wrapper is to call. - -signal_emulation_wrapper creates a BSD-style signal context and -populates it from the values in the passed in thread_state. It calls -the specified signal_handler, and then sets the values in the -thread_state from the context and loads the address of the thread -state to restore into eax and then traps with a special trap that the -catch_exception_raise looks for, which then extracts the thread state -from the trap exception's thread_state.eax. - -[MORE DETAILS TO FOLLOW] - - -===== BUGS ===== - -MEH1: on threaded macos builds, init.test.sh fails with a - memory-fault-error (NOTE: this is a threaded macos issue, not a - mach exception handler bug). - -MEH2: timer.impure lisp fails on mach-exception-handler builds - -MEH3: threads.impure lisp fails on mach-exception-handler builds - diff --git a/src/compiler/generic/objdef.lisp b/src/compiler/generic/objdef.lisp index ee30978d92..253f62e6d2 100644 --- a/src/compiler/generic/objdef.lisp +++ b/src/compiler/generic/objdef.lisp @@ -577,8 +577,6 @@ during backtrace. ;; print an approximation of the CSP as needed. #+sb-thread (control-stack-pointer :c-type "lispobj *") - #+mach-exception-handler - (mach-port-name :c-type "mach_port_name_t") #+ppc64 (card-table) ;; A few extra thread-local allocation buffers for special purposes diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index ce72fc6194..c03f239e99 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -287,27 +287,15 @@ memory_fault_handler(int signal, siginfo_t *siginfo, os_context_t *context) lisp_memory_fault_error(context, fault_addr); } -#if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) -void -mach_error_memory_fault_handler(int signal, siginfo_t *siginfo, - os_context_t *context) { - lose("Unhandled memory fault. Exiting."); -} -#endif - void os_install_interrupt_handlers(void) { if (INSTALL_SIG_MEMORY_FAULT_HANDLER) { -#if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) - ll_install_handler(SIG_MEMORY_FAULT, mach_error_memory_fault_handler); -#else ll_install_handler(SIG_MEMORY_FAULT, #if defined(LISP_FEATURE_FREEBSD) && !defined(__GLIBC__) (__siginfohandler_t *) #endif memory_fault_handler); -#endif #ifdef LISP_FEATURE_DARWIN /* Unmapped pages get this and not SIGBUS. */ diff --git a/src/runtime/darwin-os.c b/src/runtime/darwin-os.c index 5a1d8dcd20..2fe1d07c3f 100644 --- a/src/runtime/darwin-os.c +++ b/src/runtime/darwin-os.c @@ -32,10 +32,6 @@ #include <time.h> #include <sys/syscall.h> -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER -#include <libkern/OSAtomic.h> -#endif - char *os_get_runtime_executable_path() { char path[PATH_MAX + 1]; @@ -63,141 +59,9 @@ void init_mach_clock() { } } -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - -/* exc_server handles mach exception messages from the kernel and - * calls catch exception raise. We use the system-provided - * mach_msg_server, which, I assume, calls exc_server in a loop. - * - */ -extern boolean_t exc_server(); - -void * -mach_exception_handler(void *port) -{ - mach_msg_server(exc_server, 2048, (mach_port_t) port, 0); - /* mach_msg_server should never return, but it should dispatch mach - * exceptions to our catch_exception_raise function - */ - lose("mach_msg_server returned"); -} - -/* Sets up the thread that will listen for mach exceptions. note that - the exception handlers will be run on this thread. This is - different from the BSD-style signal handling situation in which the - signal handlers run in the relevant thread directly. */ - -mach_port_t mach_exception_handler_port_set = MACH_PORT_NULL; - -pthread_t -setup_mach_exception_handling_thread() -{ - kern_return_t ret; - pthread_t mach_exception_handling_thread = NULL; - pthread_attr_t attr; - - /* allocate a mach_port for this process */ - ret = mach_port_allocate(mach_task_self(), - MACH_PORT_RIGHT_PORT_SET, - &mach_exception_handler_port_set); - - /* create the thread that will receive the mach exceptions */ - - FSHOW((stderr, "Creating mach_exception_handler thread!\n")); - - pthread_attr_init(&attr); - pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); - pthread_create(&mach_exception_handling_thread, - &attr, - mach_exception_handler, - (void*)(long)mach_exception_handler_port_set); - pthread_attr_destroy(&attr); - - return mach_exception_handling_thread; -} - -/* tell the kernel that we want EXC_BAD_ACCESS exceptions sent to the - exception port (which is being listened to do by the mach - exception handling thread). */ -kern_return_t -mach_lisp_thread_init(struct thread * thread) -{ - kern_return_t ret; - mach_port_t current_mach_thread, thread_exception_port; - - if (mach_port_allocate(mach_task_self(), - MACH_PORT_RIGHT_RECEIVE, - &thread_exception_port) != KERN_SUCCESS) { - lose("Cannot allocate thread_exception_port"); - } - - if (mach_port_set_context(mach_task_self(), thread_exception_port, - (mach_vm_address_t)thread) - != KERN_SUCCESS) { - lose("Cannot set thread_exception_port context"); - } - thread->mach_port_name = thread_exception_port; - - /* establish the right for the thread_exception_port to send messages */ - ret = mach_port_insert_right(mach_task_self(), - thread_exception_port, - thread_exception_port, - MACH_MSG_TYPE_MAKE_SEND); - if (ret) { - lose("mach_port_insert_right failed with return_code %d", ret); - } - - current_mach_thread = mach_thread_self(); - ret = thread_set_exception_ports(current_mach_thread, - EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION | EXC_MASK_BREAKPOINT, - thread_exception_port, - EXCEPTION_DEFAULT, - THREAD_STATE_NONE); - if (ret) { - lose("thread_set_exception_ports failed with return_code %d", ret); - } - - ret = mach_port_deallocate (mach_task_self(), current_mach_thread); - if (ret) { - lose("mach_port_deallocate failed with return_code %d", ret); - } - - ret = mach_port_move_member(mach_task_self(), - thread_exception_port, - mach_exception_handler_port_set); - if (ret) { - lose("mach_port_move_member failed with return_code %d", ret); - } - - return ret; -} - -void -mach_lisp_thread_destroy(struct thread *thread) { - mach_port_t port = thread->mach_port_name; - FSHOW((stderr, "Deallocating mach port %x\n", port)); - if (mach_port_move_member(mach_task_self(), port, MACH_PORT_NULL) - != KERN_SUCCESS) { - lose("Error destroying an exception port"); - } - if (mach_port_deallocate(mach_task_self(), port) != KERN_SUCCESS) { - lose("Error destroying an exception port"); - } - - if (mach_port_destroy(mach_task_self(), port) != KERN_SUCCESS) { - lose("Error destroying an exception port"); - } -} -#endif - void darwin_reinit() { init_mach_clock(); -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - setup_mach_exception_handling_thread(); - mach_lisp_thread_init(all_threads); -#endif - #ifdef LISP_FEATURE_SB_THREAD struct extra_thread_data *extra_data = thread_extra_data(get_sb_vm_thread()); os_sem_init(&extra_data->state_sem, 1); @@ -210,9 +74,6 @@ darwin_reinit() { void darwin_init(void) { init_mach_clock(); -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - setup_mach_exception_handling_thread(); -#endif } diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 5ddb03eebf..3ddfc9c602 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1562,7 +1562,6 @@ extern int *os_context_flags_addr(os_context_t *context); extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs); extern void post_signal_tramp(void); -extern void call_into_lisp_tramp(void); void arrange_return_to_c_function(os_context_t *context, diff --git a/src/runtime/thread.c b/src/runtime/thread.c index be4672b4de..9d9167f5fb 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -27,12 +27,6 @@ #include <sys/wait.h> #endif -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER -#include <mach/mach.h> -#include <mach/mach_error.h> -#include <mach/mach_types.h> -#endif - #include "runtime.h" #include "validate.h" /* for BINDING_STACK_SIZE etc */ #include "thread.h" @@ -482,10 +476,6 @@ unregister_thread(struct thread *th, os_sem_destroy(&semaphores->state_not_stopped_sem); #endif -#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER - mach_lisp_thread_destroy(th); -#endif - #if defined(LISP_FEATURE_WIN32) int i; for (i = 0; i<NUM_PRIVATE_EVENTS; ++i) diff --git a/src/runtime/thread.h b/src/runtime/thread.h index d9dd469bad..db640dae68 100644 --- a/src/runtime/thread.h +++ b/src/runtime/thread.h @@ -243,7 +243,7 @@ extern pthread_key_t current_thread; # define THREAD_CSP_PAGE_SIZE os_reported_page_size #endif -#if defined(LISP_FEATURE_WIN32) || defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) +#ifdef LISP_FEATURE_WIN32 #define ALT_STACK_SIZE 0 #else #define ALT_STACK_SIZE 32 * SIGSTKSZ @@ -354,11 +354,6 @@ inline static int lisp_thread_p(os_context_t __attribute__((unused)) *context) { extern void record_backtrace_from_context(void*,struct thread*); -#if defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) -extern kern_return_t mach_lisp_thread_init(struct thread *thread); -extern void mach_lisp_thread_destroy(struct thread *thread); -#endif - typedef struct init_thread_data { sigset_t oldset; #ifdef LISP_FEATURE_SB_SAFEPOINT diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 3043b461ca..9b4214ef79 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -287,12 +287,10 @@ sigtrap_handler(int signal, siginfo_t *info, os_context_t *context) void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context) { -#ifndef LISP_FEATURE_MACH_EXCEPTION_HANDLER if (*(unsigned short *)OS_CONTEXT_PC(context) == UD2_INST) { OS_CONTEXT_PC(context) += 2; return sigtrap_handler(signal, siginfo, context); } -#endif fake_foreign_function_call(context); lose("Unhandled SIGILL at %p.", (void*)OS_CONTEXT_PC(context)); } @@ -311,7 +309,7 @@ arch_install_interrupt_handlers() * OS I haven't tested on?) and we have to go back to the old CMU * CL way, I hope there will at least be a comment to explain * why.. -- WHN 2001-06-07 */ -#if !defined(LISP_FEATURE_WIN32) && !defined(LISP_FEATURE_MACH_EXCEPTION_HANDLER) +#ifndef LISP_FEATURE_WIN32 ll_install_handler(SIGILL , sigill_handler); ll_install_handler(SIGTRAP, sigtrap_handler); #endif From 00b0dcb6246896a0221e848cfdc018ea62134574 Mon Sep 17 00:00:00 2001 From: alexis rivera <ahrivera@yahoo.com> Date: Fri, 16 Sep 2022 12:23:07 -0400 Subject: [PATCH 4001/4023] fixes to compile on windows 32-bit --- src/runtime/os.h | 4 ++-- src/runtime/runtime.c | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/runtime/os.h b/src/runtime/os.h index d17aa8fb97..b833a8340b 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -241,13 +241,13 @@ uword_t os_context_pc(os_context_t*); void set_os_context_pc(os_context_t*, uword_t); #ifdef LISP_FEATURE_WIN32 + #define GETPAGESIZE 4096 -#ifdef LISP_FEATURE_64_BIT # define FTELL _ftelli64 # define FSEEK _fseeki64 # define LSEEK _lseeki64 typedef __int64 ftell_type; -#endif + #else #define GETPAGESIZE getpagesize() #define FTELL ftell diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 88b3a4227b..8c6619d9fb 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -371,7 +371,12 @@ struct lisp_startup_options lisp_startup_options; struct cmdline_options { char *core; - char **argv; +#ifdef LISP_FEATURE_WIN32 + wchar_t +#else + char +#endif + **argv; boolean disable_lossage_handler_p; int merge_core_pages; }; From 088c52de9b87d33fa5a581691f3407f221a47b35 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 15:40:32 -0400 Subject: [PATCH 4002/4023] Remove all os_invalidate() "variations" On #+unix it's always and nothing but munmap(). os_deallocate() is a better name, so just make the obvious alterations. --- TODO | 2 -- doc/internals-notes/zero-with-mmap-bug.txt | 2 +- src/runtime/bsd-os.c | 7 ------- src/runtime/cheneygc.c | 2 +- src/runtime/gencgc.c | 4 ++-- src/runtime/haiku-os.c | 8 -------- src/runtime/linux-mman.c | 8 -------- src/runtime/os-common.c | 8 ++++++-- src/runtime/os.h | 5 +---- src/runtime/sprof.c | 2 +- src/runtime/stringspace.c | 2 +- src/runtime/sunos-os.c | 6 ------ src/runtime/thread.c | 2 +- src/runtime/traceroot.c | 2 +- src/runtime/win32-os.c | 6 ------ tests/heap-reloc/fake-mman.c | 7 ------- tools-for-build/editcore.lisp | 2 +- 17 files changed, 16 insertions(+), 59 deletions(-) diff --git a/TODO b/TODO index 5d41820ca6..1c88ea5e70 100644 --- a/TODO +++ b/TODO @@ -90,8 +90,6 @@ DARWIN DRAGONFLY Multithreading does not work. Possibly because of bug in mmap/munmap. - Hint: Comment out call to os_invalidate in perform_thread_post_mortem - and threads will work, but space will not be freed, of course. MISC CLEANUPS diff --git a/doc/internals-notes/zero-with-mmap-bug.txt b/doc/internals-notes/zero-with-mmap-bug.txt index 8caa3365af..5975b842cd 100644 --- a/doc/internals-notes/zero-with-mmap-bug.txt +++ b/doc/internals-notes/zero-with-mmap-bug.txt @@ -35,7 +35,7 @@ In light of the postmortem dump of /proc/self/maps not being an atomic snapshot, one of two things must have happened: - the kernel randomly decided to be adversarial and not give back an address that was just a moment ago unmapped by this thread -- some other thread intruded between os_invalidate() and os_validate(). +- some other thread intruded between os_deallocate() and os_validate(). As a matter of fact there were about 20 non-lisp threads in the lisp process which did not participate in the stop-for-GC protocol. diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index c03f239e99..e47df98a25 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -247,13 +247,6 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id return addr; } - -void -os_invalidate(os_vm_address_t addr, os_vm_size_t len) -{ - if (munmap(addr, len) == -1) - perror("munmap"); -} /* * any OS-dependent special low-level handling for signals diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index 9f8153bc5d..af55e05795 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -394,7 +394,7 @@ void set_auto_gc_trigger(os_vm_size_t dynamic_usage) if (((uword_t)addr >= DYNAMIC_0_SPACE_START && end < semispace_0_end) || ((uword_t)addr >= DYNAMIC_1_SPACE_START && end < semispace_1_end)) { #if defined(SUNOS) || defined(SOLARIS) - os_invalidate(addr, length); + os_deallocate(addr, length); #else os_protect(addr, length, 0); #endif diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 6c25126266..cf22e904b7 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -667,7 +667,7 @@ zero_range_with_mmap(os_vm_address_t addr, os_vm_size_t length) { } #else void *new_addr; - os_invalidate(addr, length); + os_deallocate(addr, length); new_addr = os_validate(NOT_MOVABLE, addr, length, DYNAMIC_CORE_SPACE_ID); if (new_addr == NULL || new_addr != addr) { lose("remap_free_pages: page moved, %p ==> %p", @@ -1117,7 +1117,7 @@ gc_alloc_new_region(sword_t nbytes, int page_type, struct alloc_region *alloc_re int remap_from = first_page + (page_words_used(first_page)?1:0); if (last_page >= remap_from) { long len = npage_bytes(1+last_page-remap_from); - os_invalidate(page_address(remap_from), len); + os_deallocate(page_address(remap_from), len); mmap(page_address(remap_from), len, OS_VM_PROT_ALL, MAP_ANON|MAP_PRIVATE|MAP_JIT, -1, 0); page_index_t p; diff --git a/src/runtime/haiku-os.c b/src/runtime/haiku-os.c index d2125a5920..e7b6a88d07 100644 --- a/src/runtime/haiku-os.c +++ b/src/runtime/haiku-os.c @@ -37,14 +37,6 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, return actual; } -void -os_invalidate(os_vm_address_t addr, os_vm_size_t len) -{ - if (munmap(addr,len) == -1) { - perror("munmap"); - } -} - char *os_get_runtime_executable_path() { int cookie = 0; diff --git a/src/runtime/linux-mman.c b/src/runtime/linux-mman.c index 3e15f2da6b..69847e5534 100644 --- a/src/runtime/linux-mman.c +++ b/src/runtime/linux-mman.c @@ -49,11 +49,3 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, return actual; } - -void -os_invalidate(os_vm_address_t addr, os_vm_size_t len) -{ - if (sbcl_munmap(addr,len) == -1) { - perror("munmap"); - } -} diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 2a2390e82b..4516db61a7 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -74,7 +74,7 @@ os_zero(os_vm_address_t addr, os_vm_size_t length) /* Now deallocate and allocate the block so that it faults in * zero-filled. */ - os_invalidate(block_start, block_size); + os_deallocate(block_start, block_size); addr = os_validate(NOT_MOVABLE, block_start, block_size, 0); if (addr == NULL || addr != block_start) @@ -103,7 +103,11 @@ os_allocate(os_vm_size_t len) void os_deallocate(os_vm_address_t addr, os_vm_size_t len) { - os_invalidate(addr,len); +#ifdef LISP_FEATURE_WIN32 + gc_assert(VirtualFree(addr, 0, MEM_RELEASE)); +#else + if (munmap(addr, len) == -1) perror("munmap"); +#endif } #endif diff --git a/src/runtime/os.h b/src/runtime/os.h index b833a8340b..fd4f1998a8 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -113,9 +113,6 @@ extern os_vm_address_t os_validate(int attributes, os_vm_address_t addr, void os_commit_memory(os_vm_address_t addr, os_vm_size_t len); #endif -/* This function seems to undo the effect of os_validate(..). */ -extern void os_invalidate(os_vm_address_t addr, os_vm_size_t len); - /* This maps a file into memory, or calls lose(..) for various * failures. */ extern void* load_core_bytes(int fd, @@ -189,7 +186,7 @@ sigset_t *os_context_sigmask_addr(os_context_t *context); /* These are not architecture-specific functions, but are instead * general utilities defined in terms of the architecture-specific - * function os_validate(..) and os_invalidate(..). + * function os_validate(..) and os_deallocate(..). */ extern os_vm_address_t os_allocate(os_vm_size_t len); extern void os_deallocate(os_vm_address_t addr, os_vm_size_t len); diff --git a/src/runtime/sprof.c b/src/runtime/sprof.c index df2b377278..d00fbb945b 100644 --- a/src/runtime/sprof.c +++ b/src/runtime/sprof.c @@ -376,7 +376,7 @@ static struct sprof_data* enlarge_buffer(struct sprof_data* current, { char * new_buffer = os_allocate(new_capacity * ELEMENT_SIZE); memcpy(new_buffer, current, current->free_pointer * ELEMENT_SIZE); - os_invalidate((void*)current, current->capacity * ELEMENT_SIZE); + os_deallocate((void*)current, current->capacity * ELEMENT_SIZE); current = (struct sprof_data*)new_buffer; current->capacity = new_capacity; return current; diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index 5cb462b456..5d08b259c6 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -288,7 +288,7 @@ void move_rospace_to_dynamic(__attribute__((unused)) int print) *shadow_cursor = make_lispobj(new, OTHER_POINTER_LOWTAG); } ensure_region_closed(unboxed_region, PAGE_TYPE_BOXED); - os_invalidate((void*)READ_ONLY_SPACE_START, READ_ONLY_SPACE_END - READ_ONLY_SPACE_START); + os_deallocate((void*)READ_ONLY_SPACE_START, READ_ONLY_SPACE_END - READ_ONLY_SPACE_START); walk_all_spaces(undo_rospace_ptrs, (uword_t)shadow_base); // Set it empty read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c index 2ebdd52a11..4a7df0883d 100644 --- a/src/runtime/sunos-os.c +++ b/src/runtime/sunos-os.c @@ -53,12 +53,6 @@ os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t l return addr; } -void os_invalidate(os_vm_address_t addr, os_vm_size_t len) -{ - if(munmap((void*) addr, len) == -1) - perror("munmap"); -} - #if defined LISP_FEATURE_GENCGC void diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 9d9167f5fb..224a9aa0e7 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -388,7 +388,7 @@ void create_main_lisp_thread(lispobj function) { void free_thread_struct(struct thread *th) { - os_invalidate((os_vm_address_t) th->os_address, THREAD_STRUCT_SIZE); + os_deallocate((os_vm_address_t) th->os_address, THREAD_STRUCT_SIZE); } /* Note: scribble must be stack-allocated */ diff --git a/src/runtime/traceroot.c b/src/runtime/traceroot.c index f9abe6cfc5..a6bd25e66c 100644 --- a/src/runtime/traceroot.c +++ b/src/runtime/traceroot.c @@ -995,7 +995,7 @@ static int trace_paths(void (*context_scanner)(), // correct for the allocations made for traceroot's answers. ensure_region_closed(unboxed_region, PAGE_TYPE_UNBOXED); ensure_region_closed(cons_region, PAGE_TYPE_CONS); - os_invalidate(scratchpad.base, scratchpad.end-scratchpad.base); + os_deallocate(scratchpad.base, scratchpad.end-scratchpad.base); #if TRACEROOT_USE_ABSL_HASHMAP absl_hashmap_destroy(inverted_heap); #else diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 68900b7f64..28d8160767 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -820,12 +820,6 @@ void os_decommit_mem(os_vm_address_t addr, os_vm_size_t len) { gc_assert(VirtualFree(addr, len, MEM_DECOMMIT)); } -void -os_invalidate(os_vm_address_t addr, os_vm_size_t len) -{ - gc_assert(VirtualFree(addr, 0, MEM_RELEASE)); -} - /* * load_core_bytes() is called to load a chunk of the core file into memory. * diff --git a/tests/heap-reloc/fake-mman.c b/tests/heap-reloc/fake-mman.c index d8ecbbedae..7cbc3a0fc3 100644 --- a/tests/heap-reloc/fake-mman.c +++ b/tests/heap-reloc/fake-mman.c @@ -77,10 +77,3 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id space_id, addr, fuzzed, actual); return actual; } - -void os_invalidate(os_vm_address_t addr, os_vm_size_t len) -{ - if (munmap(addr,len) == -1) { - perror("munmap"); - } -} diff --git a/tools-for-build/editcore.lisp b/tools-for-build/editcore.lisp index c085e4a0a9..d46e9828a8 100644 --- a/tools-for-build/editcore.lisp +++ b/tools-for-build/editcore.lisp @@ -1658,7 +1658,7 @@ ,@body) (when ,sap-var (alien-funcall - (extern-alien "os_invalidate" + (extern-alien "os_deallocate" (function void system-area-pointer unsigned)) ,sap-var (* ,npages +backend-page-bytes+))))))) From d5594f084617aa95efdc42cf7a9494565a3b9224 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 16:03:04 -0400 Subject: [PATCH 4003/4023] Unbreak #+(and unix sb-safepoint) which failed to compile ever since rev b8ff0a4866 ("pass a GC space id") but became more bitrotted with the recent rename of T to LISP_T. Too many C warnings in that janky logic to know what's going on anyway. --- src/runtime/gencgc.c | 3 ++- src/runtime/interrupt.c | 2 +- src/runtime/safepoint.c | 12 ++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index cf22e904b7..5ec71ecb40 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -3775,7 +3775,8 @@ static void pin_call_chain_and_boxed_registers(struct thread* th) { static void NO_SANITIZE_ADDRESS NO_SANITIZE_MEMORY conservative_stack_scan(struct thread* th, __attribute__((unused)) generation_index_t gen, - lispobj* cur_thread_approx_stackptr) + // #+sb-safepoint uses os_get_csp() and not this arg + __attribute__((unused)) lispobj* cur_thread_approx_stackptr) { /* there are potentially two stacks for each thread: the main * stack, which may contain Lisp pointers, and the alternate stack. diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 3ddfc9c602..3e04872a33 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1211,7 +1211,7 @@ interrupt_handle_pending(os_context_t *context) run_deferred_handler(data, context); } #ifdef LISP_FEATURE_SB_SAFEPOINT - if (read_TLS(THRUPTION_PENDING,thread)==T) + if (read_TLS(THRUPTION_PENDING,thread)==LISP_T) /* Special case for the following situation: There is a * thruption pending, but a signal had been deferred. The * pitstop at the top of this function could only take care diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index e5a17d6423..0f41deb494 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -178,7 +178,7 @@ void safepoint_init() InitializeConditionVariable(&gc_state.phase_cond[i]); InitializeCriticalSection(&gc_state.lock); #else - os_validate(NOT_MOVABLE, GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, 0, 0); + os_validate(NOT_MOVABLE, GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, 0); #endif gc_state.phase = GC_NONE; } @@ -947,7 +947,7 @@ void wake_thread_impl(struct thread_instance *lispthread) /* Must not and need not attempt to signal ourselves while we're the * STW initiator. */ if (thread == self) { - write_TLS(THRUPTION_PENDING,T,self); + write_TLS(THRUPTION_PENDING,LISP_T,self); while (check_pending_thruptions(0 /* ignore the sigmask */)) ; return; @@ -972,9 +972,9 @@ void wake_thread_impl(struct thread_instance *lispthread) WITH_ALL_THREADS_LOCK { do { odxprint(safepoints, "wake_thread_posix: found"); - write_TLS(THRUPTION_PENDING,T,thread); - if (read_TLS(GC_PENDING,thread) == T - || THREAD_STOP_PENDING(thread) == T) + write_TLS(THRUPTION_PENDING,LISP_T,thread); + if (read_TLS(GC_PENDING,thread) == LISP_T + || THREAD_STOP_PENDING(thread) == LISP_T) break; if (os_get_csp(thread)) { @@ -992,7 +992,7 @@ void wake_thread_impl(struct thread_instance *lispthread) gc_advance(GC_NONE,GC_INVOKED); } else { odxprint(safepoints, "wake_thread_posix: passive"); - write_TLS(THRUPTION_PENDING, T, thread); + write_TLS(THRUPTION_PENDING, LISP_T, thread); } } thread_sigmask(SIG_SETMASK, &oldset, 0); From 3ec33b93f4df4fe337985379285afbbea02e8c83 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 20:37:47 -0400 Subject: [PATCH 4004/4023] Cargo-cult some linkable-runtime stuff Without a shred of documentation in sight, I'm guessing that this is what's needed to fix the problem reported in https://sourceforge.net/p/sbcl/mailman/message/37703368/ Not gonna try this patch on the other architecture/OS combinations that seem to lack the proper incantation, so we'll at least know if we're fixing bugs in a vacuum (based on complaints or lack of). --- src/runtime/Config.arm-linux | 5 +++++ src/runtime/Config.arm64-linux | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/runtime/Config.arm-linux b/src/runtime/Config.arm-linux index df4e18bf67..16c7d76c2a 100644 --- a/src/runtime/Config.arm-linux +++ b/src/runtime/Config.arm-linux @@ -31,3 +31,8 @@ ifdef LISP_FEATURE_LARGEFILE CFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 endif LINKFLAGS += -Wl,--export-dynamic + +ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME + LIBSBCL = sbcl.o + USE_LIBSBCL = sbcl.o +endif diff --git a/src/runtime/Config.arm64-linux b/src/runtime/Config.arm64-linux index 601626e0d3..1281c78933 100644 --- a/src/runtime/Config.arm64-linux +++ b/src/runtime/Config.arm64-linux @@ -30,3 +30,8 @@ ifdef LISP_FEATURE_LARGEFILE CFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 endif LINKFLAGS += -Wl,--export-dynamic + +ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME + LIBSBCL = sbcl.o + USE_LIBSBCL = sbcl.o +endif From 6b5f65fddc03ea4ec9b9faa3fa31f38a7bd5a7f5 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 21:05:24 -0400 Subject: [PATCH 4005/4023] Invent a GC space identifier for stack regions and I don't know what "alignment passed from os_validate" means, so rewrite that comment block. --- src/runtime/bsd-os.c | 18 +++++++----------- src/runtime/thread.c | 15 ++++++--------- tools-for-build/corefile.lisp | 6 ++++-- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index e47df98a25..c0018d6d0c 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -129,6 +129,12 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id int protection; int flags = 0; +#if defined(LISP_FEATURE_OPENBSD) && defined(MAP_STACK) + /* OpenBSD requires MAP_STACK for pages used as stack. + * Note that FreeBSD has a MAP_STACK with different behavior. */ + if (space_id == THREAD_STRUCT_CORE_SPACE_ID) flags = MAP_STACK; +#endif + // FIXME: This probaby needs to use MAP_TRYFIXED if (attributes & IS_GUARD_PAGE) protection = OS_VM_PROT_NONE; @@ -154,7 +160,6 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id attributes &= ~IS_GUARD_PAGE; #ifndef LISP_FEATURE_DARWIN // Do not use MAP_FIXED, because the OS is sane. - /* The *BSD family of OSes seem to ignore 'addr' when it is outside * of some range which I could not figure out. Sometimes it seems like the * condition is that any address below 4GB can't be requested without MAP_FIXED, @@ -182,16 +187,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id Except for MAP_FIXED mappings, the system will never replace existing mappings. */ // ALLOCATE_LOW seems never to get what we want - if (!(attributes & MOVABLE) || (attributes & ALLOCATE_LOW)) { - flags = MAP_FIXED; - } - if (attributes & IS_THREAD_STRUCT) { -#if defined(LISP_FEATURE_OPENBSD) && defined(MAP_STACK) - /* OpenBSD requires MAP_STACK for pages used as stack. - * Note that FreeBSD has a MAP_STACK with different behavior. */ - flags = MAP_STACK; -#endif - } + if (!(attributes & MOVABLE) || (attributes & ALLOCATE_LOW)) flags = MAP_FIXED; #endif #ifdef MAP_EXCL // not defined in OpenBSD, NetBSD, DragonFlyBSD diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 224a9aa0e7..1cede8f0b8 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -859,14 +859,10 @@ callback_wrapper_trampoline( struct thread * alloc_thread_struct(void* spaces) { - /* May as well allocate all the spaces at once: it saves us from - * having to decide what to do if only some of the allocations - * succeed. SPACES must be appropriately aligned, since the GC - * expects the control stack to start at a page boundary -- and - * the OS may have even more rigorous requirements. We can't rely - * on the alignment passed from os_validate, since that might - * assume the current (e.g. 4k) pagesize, while we calculate with - * the biggest (e.g. 64k) pagesize allowed by the ABI. */ + /* Allocate the thread structure in one fell swoop as there is no way to recover + * from failing to obtain contiguous memory. Note that the OS may have a smaller + * alignment granularity than BACKEND_PAGE_BYTES so we may have to adjust the + * result to make it conform to our guard page alignment requirement. */ boolean zeroize_stack = 0; if (spaces) { // If reusing memory from a previously exited thread, start by removing @@ -876,7 +872,8 @@ alloc_thread_struct(void* spaces) { // if any newly started thread could refer a dead thread's heap objects. zeroize_stack = 1; } else { - spaces = os_validate(MOVABLE|IS_THREAD_STRUCT, NULL, THREAD_STRUCT_SIZE, 0); + spaces = os_validate(MOVABLE, NULL, THREAD_STRUCT_SIZE, + THREAD_STRUCT_CORE_SPACE_ID); if (!spaces) return NULL; } /* Aligning up is safe as THREAD_STRUCT_SIZE has diff --git a/tools-for-build/corefile.lisp b/tools-for-build/corefile.lisp index ab5c1af392..89f50df8d9 100644 --- a/tools-for-build/corefile.lisp +++ b/tools-for-build/corefile.lisp @@ -17,6 +17,7 @@ #:immobile-fixedobj-core-space-id #:immobile-text-core-space-id #:alien-linkage-table-core-space-id + #:thread-struct-core-space-id #:deflated-core-space-id-flag)) (in-package "SB-COREFILE") @@ -53,6 +54,7 @@ (defconstant immobile-text-core-space-id 5) (defconstant static-code-core-space-id 4) (defconstant deflated-core-space-id-flag 8) -;;; this space-id is not present in the core file -;;; but we need a unique ID to pass to os_validate +;;; These space-IDs are not present in a core file, but +;;; we need unique values for supplying to os_validate (defconstant alien-linkage-table-core-space-id 101) +(defconstant thread-struct-core-space-id 102) From 5a2e639a0d6de2be44b3de293bf1e54adaab4106 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <dougk@google.com> Date: Fri, 16 Sep 2022 22:53:37 -0400 Subject: [PATCH 4006/4023] Rename os_validate to os_alloc_gc_space Nobody I surveyed guessed correctly that "validate" meant "give me memory" --- doc/internals-notes/zero-with-mmap-bug.txt | 4 +- src/runtime/bsd-os.c | 2 +- src/runtime/coreparse.c | 45 ++++++++++++---------- src/runtime/gc-common.c | 9 ----- src/runtime/gencgc.c | 2 +- src/runtime/haiku-os.c | 4 +- src/runtime/interrupt.c | 2 +- src/runtime/linux-mman.c | 6 +-- src/runtime/monitor.c | 14 ++++--- src/runtime/os-common.c | 4 +- src/runtime/os.h | 6 +-- src/runtime/safepoint.c | 2 +- src/runtime/stringspace.c | 10 +++-- src/runtime/sunos-os.c | 4 +- src/runtime/thread.c | 4 +- src/runtime/validate.c | 11 +++--- src/runtime/win32-os.c | 37 +++--------------- tests/heap-reloc/fake-mman.c | 2 +- tools-for-build/corefile.lisp | 2 +- 19 files changed, 72 insertions(+), 98 deletions(-) diff --git a/doc/internals-notes/zero-with-mmap-bug.txt b/doc/internals-notes/zero-with-mmap-bug.txt index 5975b842cd..321665dc43 100644 --- a/doc/internals-notes/zero-with-mmap-bug.txt +++ b/doc/internals-notes/zero-with-mmap-bug.txt @@ -7,7 +7,7 @@ Instead it gets something way up high where there are all sorts of other memory mappings (from malloc and shared libraries, etc). At the time of failure, the lisp heap was "almost" covered by 6 lines -from /proc/self/maps which we output to stderr in os_validate on failure. +from /proc/self/maps which we output to stderr in os_alloc_gc_space on failure. (Excerpt below) In this lisp process, unmap/remap had already happened several times as evident from the multiple lines. The kernel hadn't re-combined those @@ -35,7 +35,7 @@ In light of the postmortem dump of /proc/self/maps not being an atomic snapshot, one of two things must have happened: - the kernel randomly decided to be adversarial and not give back an address that was just a moment ago unmapped by this thread -- some other thread intruded between os_deallocate() and os_validate(). +- some other thread intruded between os_deallocate() and os_alloc_gc_space(). As a matter of fact there were about 20 non-lisp threads in the lisp process which did not participate in the stop-for-GC protocol. diff --git a/src/runtime/bsd-os.c b/src/runtime/bsd-os.c index c0018d6d0c..8cc7f6212a 100644 --- a/src/runtime/bsd-os.c +++ b/src/runtime/bsd-os.c @@ -117,7 +117,7 @@ os_context_sigmask_addr(os_context_t *context) } os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id) +os_alloc_gc_space(int space_id, int attributes, os_vm_address_t addr, os_vm_size_t len) { int __attribute((unused)) executable = (space_id == READ_ONLY_CORE_SPACE_ID) || diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index d13a6b8720..ee45433a8c 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -676,6 +676,23 @@ __attribute__((unused)) static void check_dynamic_space_addr_ok(uword_t start, u #endif } +static os_vm_address_t reserve_space(int space_id, int attr, + os_vm_address_t addr, os_vm_size_t size) +{ +#ifdef LISP_FEATURE_IMMOBILE_SPACE + if (space_id == IMMOBILE_TEXT_CORE_SPACE_ID) { + // Carve out the text space from the earlier request that was made + // for the fixedobj space. + ALIEN_LINKAGE_TABLE_SPACE_START = FIXEDOBJ_SPACE_START + FIXEDOBJ_SPACE_SIZE; + return (os_vm_address_t)(ALIEN_LINKAGE_TABLE_SPACE_START + ALIEN_LINKAGE_TABLE_SPACE_SIZE); + } +#endif + if (size == 0) return addr; + addr = os_alloc_gc_space(space_id, attr, addr, size); + if (!addr) lose("Can't allocate %#"OBJ_FMTX" bytes for space %d", size, space_id); + return addr; +} + /* TODO: If static + readonly were mapped as desired without disabling ASLR * but one of the large spaces couldn't be mapped as desired, start over from * the top, disabling ASLR. This should help to avoid relocating the heap @@ -730,8 +747,9 @@ process_directory(int count, struct ndir_entry *entry, (uword_t)&lisp_code_start, (uword_t)&lisp_code_end, text_space_highwatermark); #endif - ALIEN_LINKAGE_TABLE_SPACE_START = (uword_t) - os_validate(0, 0, ALIEN_LINKAGE_TABLE_SPACE_SIZE, ALIEN_LINKAGE_TABLE_CORE_SPACE_ID); + ALIEN_LINKAGE_TABLE_SPACE_START = + (uword_t)os_alloc_gc_space(ALIEN_LINKAGE_TABLE_CORE_SPACE_ID, 0, 0, + ALIEN_LINKAGE_TABLE_SPACE_SIZE); // Prefill the alien linkage table so that shrinkwrapped executables which link in // all their C library dependencies can avoid linking with -ldl // but extern-alien still works for newly compiled code. @@ -807,23 +825,8 @@ process_directory(int count, struct ndir_entry *entry, size_t request = spaces[id].desired_size; int sub_2gb_flag = (request & 1); request &= ~(size_t)1; -#ifdef LISP_FEATURE_IMMOBILE_SPACE - if (id == IMMOBILE_TEXT_CORE_SPACE_ID) { - // Pretend an os_validate() happened based on the address that - // would be obtained by a constant offset from fixedobj space. - ALIEN_LINKAGE_TABLE_SPACE_START = FIXEDOBJ_SPACE_START + FIXEDOBJ_SPACE_SIZE; - addr = ALIEN_LINKAGE_TABLE_SPACE_START + ALIEN_LINKAGE_TABLE_SPACE_SIZE; - } - else -#endif - if (request) { - addr = (uword_t)os_validate(sub_2gb_flag ? MOVABLE_LOW : MOVABLE, - (os_vm_address_t)addr, request, id); - if (!addr) { - lose("Can't allocate %#"OBJ_FMTX" bytes for space %ld", - (lispobj)request, id); - } - } + addr = (uword_t)reserve_space(id, sub_2gb_flag ? MOVABLE_LOW : MOVABLE, + (os_vm_address_t)addr, request); switch (id) { #ifndef LISP_FEATURE_DARWIN_JIT case READ_ONLY_CORE_SPACE_ID: @@ -845,8 +848,8 @@ process_directory(int count, struct ndir_entry *entry, case DYNAMIC_CORE_SPACE_ID: { uword_t aligned_start = ALIGN_UP(addr, GENCGC_PAGE_BYTES); - /* Misalignment can happen only if card size exceeds OS page. - * Drop one card to avoid overrunning the allocated space */ + /* Misalignment can happen only if GC page size exceeds OS page. + * Drop one GC page to avoid overrunning the allocated space */ if (aligned_start > addr) // not card-aligned dynamic_space_size -= GENCGC_PAGE_BYTES; DYNAMIC_SPACE_START = addr = aligned_start; diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 071cb3d72a..566393688c 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -2088,15 +2088,6 @@ properly_tagged_p_internal(lispobj pointer, lispobj *start_addr) return 0; // no good } -/* META: Note the ambiguous word "validate" in the comment below. - * This means "Decide whether <x> is valid". - * But when you see os_validate() elsewhere, that doesn't mean to ask - * whether something is valid, it says to *make* it valid. - * I think it would be nice if we could avoid using the word in the - * sense in which os_validate() uses it, which would entail renaming - * a bunch of stuff, which is harder than just explaining why - * the comments can be deceptive */ - /* Used by the debugger to validate possibly bogus pointers before * calling MAKE-LISP-OBJ on them. * diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index 5ec71ecb40..d7753cf074 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -668,7 +668,7 @@ zero_range_with_mmap(os_vm_address_t addr, os_vm_size_t length) { #else void *new_addr; os_deallocate(addr, length); - new_addr = os_validate(NOT_MOVABLE, addr, length, DYNAMIC_CORE_SPACE_ID); + new_addr = os_alloc_gc_space(DYNAMIC_CORE_SPACE_ID, NOT_MOVABLE, addr, length); if (new_addr == NULL || new_addr != addr) { lose("remap_free_pages: page moved, %p ==> %p", addr, new_addr); diff --git a/src/runtime/haiku-os.c b/src/runtime/haiku-os.c index e7b6a88d07..7bdfc7bb0f 100644 --- a/src/runtime/haiku-os.c +++ b/src/runtime/haiku-os.c @@ -7,8 +7,8 @@ #include <stdio.h> os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) space_id) +os_alloc_gc_space(int __attribute__((unused)) space_id, + int attributes, os_vm_address_t addr, os_vm_size_t len) { int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL; attributes &= ~IS_GUARD_PAGE; diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 3e04872a33..4f4012cb8d 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -1624,7 +1624,7 @@ arrange_return_to_c_function(os_context_t *context, #if defined(LISP_FEATURE_DARWIN) uint32_t *register_save_area = (uint32_t *)os_allocate(0x40); - /* 1. os_validate (malloc/mmap) register_save_block + /* 1. allocate (malloc/mmap) register_save_block * 2. copy register state into register_save_block * 3. put a pointer to register_save_block in a register in the context * 4. set the context's EIP to point to a trampoline which: diff --git a/src/runtime/linux-mman.c b/src/runtime/linux-mman.c index 69847e5534..3248d469c2 100644 --- a/src/runtime/linux-mman.c +++ b/src/runtime/linux-mman.c @@ -10,8 +10,8 @@ #include "sys_mmap.inc" os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) space_id) +os_alloc_gc_space(int __attribute__((unused)) space_id, + int attributes, os_vm_address_t addr, os_vm_size_t len) { int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL; attributes &= ~IS_GUARD_PAGE; @@ -25,7 +25,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, actual = sbcl_mmap(addr, len, protection, flags, -1, 0); if (actual == MAP_FAILED) { if (errno == ENOMEM) - fprintf(stderr, "os_validate(%d,%p,%zu) failed with ENOMEM\n", + fprintf(stderr, "os_alloc_gc_space(%d,%p,%zu) failed with ENOMEM\n", attributes, addr, len); else perror("mmap"); diff --git a/src/runtime/monitor.c b/src/runtime/monitor.c index 463c938b5f..1777bcf8bf 100644 --- a/src/runtime/monitor.c +++ b/src/runtime/monitor.c @@ -899,16 +899,16 @@ int load_gc_crashdump(char* pathname) static_space_free_pointer = (lispobj*)(STATIC_SPACE_START + preamble.static_nbytes); if (preamble.readonly_nbytes) { // READ_ONLY_SPACE_START = preamble.readonly_start; - os_validate(0, (char*)preamble.readonly_start, - ALIGN_UP(preamble.readonly_nbytes, 4096), 0); + os_alloc_gc_space(READ_ONLY_CORE_SPACE_ID, 0, (char*)preamble.readonly_start, + ALIGN_UP(preamble.readonly_nbytes, 4096)); checked_read("R/O", fd, (char*)preamble.readonly_start, preamble.readonly_nbytes); } read_only_space_free_pointer = (lispobj*)(READ_ONLY_SPACE_START + preamble.readonly_nbytes); // DYNAMIC_SPACE_START = preamble.dynspace_start; long dynspace_nbytes = preamble.dynspace_npages * GENCGC_PAGE_BYTES; - char* dynspace = os_validate(0, (char*)preamble.dynspace_start, - DEFAULT_DYNAMIC_SPACE_SIZE, 0); + char* dynspace = os_alloc_gc_space(DYNAMIC_CORE_SPACE_ID, 0, (char*)preamble.dynspace_start, + DEFAULT_DYNAMIC_SPACE_SIZE); if (dynspace != (char*)preamble.dynspace_start) lose("Didn't map dynamic space where expected: %p vs %p", dynspace, (char*)preamble.dynspace_start); @@ -929,8 +929,10 @@ int load_gc_crashdump(char* pathname) TEXT_SPACE_START = preamble.text_start; fixedobj_free_pointer = (lispobj*)preamble.fixedobj_free_pointer; text_space_highwatermark = (lispobj*)preamble.text_space_highwatermark; - os_validate(0, (char*)FIXEDOBJ_SPACE_START, FIXEDOBJ_SPACE_SIZE, 0); - os_validate(0, (char*)TEXT_SPACE_START, TEXT_SPACE_SIZE, 0); + os_alloc_gc_space(IMMOBILE_FIXEDOBJ_CORE_SPACE_ID, 0, (char*)FIXEDOBJ_SPACE_START, + FIXEDOBJ_SPACE_SIZE); + os_alloc_gc_space(IMMOBILE_TEXT_CORE_SPACE_ID, 0, (char*)TEXT_SPACE_START, + TEXT_SPACE_SIZE); gc_init_immobile(); // allocate the page tables calc_immobile_space_bounds(); // Read fixedobj space diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 4516db61a7..afc3ede694 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -75,7 +75,7 @@ os_zero(os_vm_address_t addr, os_vm_size_t length) * zero-filled. */ os_deallocate(block_start, block_size); - addr = os_validate(NOT_MOVABLE, block_start, block_size, 0); + addr = os_alloc_gc_space(0, NOT_MOVABLE, block_start, block_size); if (addr == NULL || addr != block_start) lose("os_zero: block moved! %p ==> %p", block_start, addr); @@ -97,7 +97,7 @@ void os_deallocate(os_vm_address_t addr, os_vm_size_t len) { os_vm_address_t os_allocate(os_vm_size_t len) { - return os_validate(MOVABLE, (os_vm_address_t)NULL, len, 0); + return os_alloc_gc_space(0, MOVABLE, (os_vm_address_t)NULL, len); } void diff --git a/src/runtime/os.h b/src/runtime/os.h index fd4f1998a8..e29222d117 100644 --- a/src/runtime/os.h +++ b/src/runtime/os.h @@ -106,8 +106,8 @@ extern void os_zero(os_vm_address_t addr, os_vm_size_t length); #define IS_THREAD_STRUCT 4 #define MOVABLE_LOW (MOVABLE|ALLOCATE_LOW) #define IS_GUARD_PAGE 8 -extern os_vm_address_t os_validate(int attributes, os_vm_address_t addr, - os_vm_size_t len, int space_id); +extern os_vm_address_t os_alloc_gc_space(int space_id, int attributes, + os_vm_address_t addr, os_vm_size_t len); #ifdef LISP_FEATURE_WIN32 void os_commit_memory(os_vm_address_t addr, os_vm_size_t len); @@ -186,7 +186,7 @@ sigset_t *os_context_sigmask_addr(os_context_t *context); /* These are not architecture-specific functions, but are instead * general utilities defined in terms of the architecture-specific - * function os_validate(..) and os_deallocate(..). + * function os_alloc_gc_space(..) and os_deallocate(..). */ extern os_vm_address_t os_allocate(os_vm_size_t len); extern void os_deallocate(os_vm_address_t addr, os_vm_size_t len); diff --git a/src/runtime/safepoint.c b/src/runtime/safepoint.c index 0f41deb494..25ff44117d 100644 --- a/src/runtime/safepoint.c +++ b/src/runtime/safepoint.c @@ -178,7 +178,7 @@ void safepoint_init() InitializeConditionVariable(&gc_state.phase_cond[i]); InitializeCriticalSection(&gc_state.lock); #else - os_validate(NOT_MOVABLE, GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES, 0); + os_alloc_gc_space(0, NOT_MOVABLE, GC_SAFEPOINT_PAGE_ADDR, BACKEND_PAGE_BYTES); #endif gc_state.phase = GC_NONE; } diff --git a/src/runtime/stringspace.c b/src/runtime/stringspace.c index 5d08b259c6..9ec1416a0c 100644 --- a/src/runtime/stringspace.c +++ b/src/runtime/stringspace.c @@ -192,8 +192,9 @@ void prepare_readonly_space(int purify, int print) // at READ_ONLY_SPACE_START if the free_pointer isn't higher than the start. int string_space_size = BACKEND_PAGE_BYTES; READ_ONLY_SPACE_START = - (uword_t)os_validate(MOVABLE, (char*)DYNAMIC_SPACE_START - string_space_size, - string_space_size, 0); + (uword_t)os_alloc_gc_space(READ_ONLY_CORE_SPACE_ID, + MOVABLE, (char*)DYNAMIC_SPACE_START - string_space_size, + string_space_size); READ_ONLY_SPACE_END = READ_ONLY_SPACE_START + string_space_size; read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; return; @@ -221,8 +222,9 @@ void prepare_readonly_space(int purify, int print) int string_space_size = ALIGN_UP(sum_sizes, BACKEND_PAGE_BYTES); // Try to place readonly just below dynamic space, but it doesn't really matter where READ_ONLY_SPACE_START = - (uword_t)os_validate(MOVABLE, (char*)DYNAMIC_SPACE_START - string_space_size, - string_space_size, 0); + (uword_t)os_alloc_gc_space(READ_ONLY_CORE_SPACE_ID, + MOVABLE, (char*)DYNAMIC_SPACE_START - string_space_size, + string_space_size); READ_ONLY_SPACE_END = READ_ONLY_SPACE_START + string_space_size; read_only_space_free_pointer = (lispobj*)READ_ONLY_SPACE_START; diff --git a/src/runtime/sunos-os.c b/src/runtime/sunos-os.c index 4a7df0883d..e4a876b7e6 100644 --- a/src/runtime/sunos-os.c +++ b/src/runtime/sunos-os.c @@ -28,8 +28,8 @@ void os_init() {} -os_vm_address_t os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, - int __attribute__((unused)) space_id) +os_vm_address_t os_alloc_gc_space(int __attribute__((unused)) space_id, + int attributes, os_vm_address_t addr, os_vm_size_t len) { int protection = attributes & IS_GUARD_PAGE ? OS_VM_PROT_NONE : OS_VM_PROT_ALL; attributes &= ~IS_GUARD_PAGE; diff --git a/src/runtime/thread.c b/src/runtime/thread.c index 1cede8f0b8..7ce50a4984 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -872,8 +872,8 @@ alloc_thread_struct(void* spaces) { // if any newly started thread could refer a dead thread's heap objects. zeroize_stack = 1; } else { - spaces = os_validate(MOVABLE, NULL, THREAD_STRUCT_SIZE, - THREAD_STRUCT_CORE_SPACE_ID); + spaces = os_alloc_gc_space(THREAD_STRUCT_CORE_SPACE_ID, MOVABLE, + NULL, THREAD_STRUCT_SIZE); if (!spaces) return NULL; } /* Aligning up is safe as THREAD_STRUCT_SIZE has diff --git a/src/runtime/validate.c b/src/runtime/validate.c index ebd9a3f595..2f2f1de71a 100644 --- a/src/runtime/validate.c +++ b/src/runtime/validate.c @@ -72,7 +72,8 @@ ensure_undefined_alien(void) { #else os_reported_page_size = getpagesize(); #endif - os_vm_address_t start = os_validate(MOVABLE|IS_GUARD_PAGE, NULL, os_reported_page_size, 0); + os_vm_address_t start = + os_alloc_gc_space(0, MOVABLE|IS_GUARD_PAGE, NULL, os_reported_page_size); if (start) { undefined_alien_address = start; } else { @@ -100,10 +101,10 @@ boolean allocate_hardwired_spaces(boolean hard_failp) int n_spaces = sizeof preinit_spaces / sizeof preinit_spaces[0]; for (i = 0; i< n_spaces; ++i) { if (!preinit_spaces[i].size) continue; - if (os_validate(NOT_MOVABLE | should_allocate_low, - (os_vm_address_t)preinit_spaces[i].start, - preinit_spaces[i].size, - preinit_spaces[i].id)) continue; + if (os_alloc_gc_space(preinit_spaces[i].id, + NOT_MOVABLE | should_allocate_low, + (os_vm_address_t)preinit_spaces[i].start, + preinit_spaces[i].size)) continue; if (!hard_failp) return 0; // soft fail. Try again after disabling ASLR fprintf(stderr, "failed to allocate %lu bytes at %p\n", diff --git a/src/runtime/win32-os.c b/src/runtime/win32-os.c index 28d8160767..a48c29f457 100644 --- a/src/runtime/win32-os.c +++ b/src/runtime/win32-os.c @@ -754,15 +754,9 @@ uword_t get_monotonic_time() } #endif -static os_vm_address_t os_validate_nocommit(int,os_vm_address_t,os_vm_size_t); - os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id) +os_alloc_gc_space(int space_id, int attributes, os_vm_address_t addr, os_vm_size_t len) { - // Reserving the dynamic space doesn't commit it. - if (space_id == DYNAMIC_CORE_SPACE_ID && (attributes & MOVABLE)) - return os_validate_nocommit(attributes, addr, len); - if (!addr) { int protection = attributes & IS_GUARD_PAGE ? PAGE_NOACCESS : PAGE_EXECUTE_READWRITE; os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, protection); @@ -770,7 +764,10 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id return actual; } - os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); + // Reserving the dynamic space doesn't commit it. + DWORD commit = + (space_id == DYNAMIC_CORE_SPACE_ID && (attributes & MOVABLE)) ? 0 : MEM_COMMIT; + os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE|commit, PAGE_EXECUTE_READWRITE); if (!actual) { if (!(attributes & MOVABLE)) { @@ -781,29 +778,7 @@ os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id return 0; } - actual = VirtualAlloc(NULL, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); - gc_assert(actual); - } - - return actual; -} - -/* Used to allocate the dynamic space, as it may be very large. - * Dynamically comitted by gc_alloc_new_region() or gc_alloc_large() */ -static os_vm_address_t -os_validate_nocommit(int attributes, os_vm_address_t addr, os_vm_size_t len) -{ - os_vm_address_t actual = VirtualAlloc(addr, len, MEM_RESERVE, PAGE_EXECUTE_READWRITE); - - if (!actual) { - if (!(attributes & MOVABLE)) { - fprintf(stderr, - "VirtualAlloc: wanted %lu bytes at %p, actually mapped at %p\n", - (unsigned long) len, addr, actual); - fflush(stderr); - return 0; - } - actual = VirtualAlloc(NULL, len, MEM_RESERVE, PAGE_EXECUTE_READWRITE); + actual = VirtualAlloc(NULL, len, MEM_RESERVE|commit, PAGE_EXECUTE_READWRITE); gc_assert(actual); } diff --git a/tests/heap-reloc/fake-mman.c b/tests/heap-reloc/fake-mman.c index 7cbc3a0fc3..96003c48ed 100644 --- a/tests/heap-reloc/fake-mman.c +++ b/tests/heap-reloc/fake-mman.c @@ -41,7 +41,7 @@ void pick_fuzzed_addresses(void** addr1, void** addr2, void** addr3) } os_vm_address_t -os_validate(int attributes, os_vm_address_t addr, os_vm_size_t len, int space_id) +os_alloc_gc_space(int space_id, int attributes, os_vm_address_t addr, os_vm_size_t len) { int flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE; void *fuzzed = addr; diff --git a/tools-for-build/corefile.lisp b/tools-for-build/corefile.lisp index 89f50df8d9..a55e163647 100644 --- a/tools-for-build/corefile.lisp +++ b/tools-for-build/corefile.lisp @@ -55,6 +55,6 @@ (defconstant static-code-core-space-id 4) (defconstant deflated-core-space-id-flag 8) ;;; These space-IDs are not present in a core file, but -;;; we need unique values for supplying to os_validate +;;; we need unique values for supplying to os_alloc_gc_space (defconstant alien-linkage-table-core-space-id 101) (defconstant thread-struct-core-space-id 102) From f624159b4ea0909b93f5e1173f11bb7ec6ac4bb1 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 2 Mar 2021 18:29:11 -0500 Subject: [PATCH 4007/4023] Add support for looking up foreign addresses from the linkage table. Add a new C function - arch_read_linkage_entry - that backs out the true foreign address of the corresponding symbol from the data in the linkage table. Add a Lisp function - FIND-LINKAGE-TABLE-FOREIGN-SYMBOL-ADDRESS - that uses this new C function to return the address, while accounting for undefined symbols (so as to not accidentally return a reference to a guard page). --- src/code/linkage-table.lisp | 144 ++++++++++++++++++++++++++++++++++++ src/runtime/arch.h | 1 + src/runtime/arm-arch.c | 12 +++ src/runtime/arm64-arch.c | 11 +++ src/runtime/mips-arch.c | 7 ++ src/runtime/ppc-arch.c | 42 +++++++++++ src/runtime/riscv-arch.c | 8 ++ src/runtime/sparc-arch.c | 19 +++++ src/runtime/x86-64-arch.c | 11 +++ src/runtime/x86-arch.c | 14 ++++ tests/foreign.test.sh | 22 ++++++ 11 files changed, 291 insertions(+) create mode 100644 src/code/linkage-table.lisp diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp new file mode 100644 index 0000000000..016a9f2072 --- /dev/null +++ b/src/code/linkage-table.lisp @@ -0,0 +1,144 @@ +;;;; Linkage table specifics + +;;;; This software is part of the SBCL system. See the README file for +;;;; more information. +;;;; +;;;; This software is derived from the CMU CL system, which was +;;;; written at Carnegie Mellon University and released into the +;;;; public domain. The software is in the public domain and is +;;;; provided with absolutely no warranty. See the COPYING and CREDITS +;;;; files for more information. + +;;;; Linkage table itself is a mmapped memory area in C-land, which is +;;;; initialized by INIT-LINKAGE-TABLE once all shared objects have +;;;; been reopened, based on the information stored in *LINKAGE-INFO*. +;;;; +;;;; For data entries the linkage table holds the real address +;;;; of the foreign symbol, and for code the entries are jumps +;;;; to the real addresses. + +(in-package "SB-IMPL") + +(define-alien-routine arch-write-linkage-table-entry void + (index int) (real-address unsigned) (datap int)) + +(define-alien-routine arch-read-linkage-table-entry (* t) + (index int) (datap int)) + +(define-load-time-global *linkage-info* + ;; CDR of the cons is the list of undefineds + (list (make-hash-table :test 'equal :synchronized t))) +(declaim (type (cons hash-table) *linkage-info*)) + +(define-alien-variable undefined-alien-address unsigned) + +(macrolet ((dlsym-wrapper (&optional warn) + ;; Produce two values: an indicator of whether the foreign symbol was + ;; found; and the address as an integer if found, or a guard address + ;; which when accessed will result in an UNDEFINED-ALIEN-ERROR. + `(let ((addr (find-dynamic-foreign-symbol-address name))) + (cond (addr + (values t addr)) + (t + (when ,warn + ;; If we can report the actual name when an undefined + ;; alien is called don't warn. + #-(or arm arm64 x86-64) + (style-warn 'sb-kernel:undefined-alien-style-warning + :symbol name)) + (values + nil + (if datap + undefined-alien-address + (or + (sb-fasl:get-asm-routine 'sb-vm::undefined-alien-tramp) + (find-foreign-symbol-address "undefined_alien_function") + (bug "unreachable"))))))))) + +;;; Add a foreign linkage entry if none exists, return the address +;;; in the linkage table. +(defun ensure-foreign-symbol-linkage (name datap) + (let* ((key (if datap (list name) name)) + (info *linkage-info*) + (ht (car info))) + (or (awhen (with-system-mutex ((hash-table-lock ht)) + (or (gethash key ht) + (let* ((index (hash-table-count ht)) + (capacity (floor (- sb-vm:alien-linkage-table-space-end + sb-vm:alien-linkage-table-space-start) + sb-vm:alien-linkage-table-entry-size))) + (when (< index capacity) + (multiple-value-bind (defined real-address) (dlsym-wrapper t) + (unless defined (push key (cdr info))) + (arch-write-linkage-table-entry index real-address + (if datap 1 0)) + (logically-readonlyize name) + (setf (gethash key ht) index)))))) + (sb-vm::alien-linkage-table-entry-address it)) + (error "Linkage-table full (~D entries): cannot link ~S." + (hash-table-count ht) name)))) + +;;; Update the linkage-table. Called during initialization after all +;;; shared libraries have been reopened, and after a previously loaded +;;; shared object is reloaded. +;;; +;;; FIXME: Should figure out how to write only those entries that need +;;; updating. +;;; The problem is that when unloading a library, lacking any way to know which +;;; symbols came from it, we have to try to find every symbol again. +;;; If the shared-object-handle in which each symbol was originally found were +;;; stored in linkage-info, we could know which will become undefined on unload. +;;; The only "problem" is my lack of motivation to change this further. +(defun update-alien-linkage-table (full-scan) + ;; This symbol is of course itself a prelinked symbol. + (let* ((n-prelinked (extern-alien "alien_linkage_table_n_prelinked" int)) + (info *linkage-info*) + (ht (car info)) + ;; for computing anew the list of undefined symbols + (notdef)) + (flet ((recheck (key index) + (let* ((datap (listp key)) + (name (if datap (car key) key))) + ;; Symbols required for Lisp startup + ;; will not be re-pointed to a different address ever. + ;; Nor will those referenced by ELF core. + (when (>= index n-prelinked) + (multiple-value-bind (defined real-address) (dlsym-wrapper) + (unless defined (push key notdef)) + (arch-write-linkage-table-entry index real-address + (if datap 1 0))))))) + (with-system-mutex ((hash-table-lock ht)) + (if full-scan + ;; Look up everything; this is for image restart or library unload. + (dohash ((key index) ht) + (recheck key index)) + ;; Look up only the currently undefined foreign symbols + (dolist (key (cdr info)) + (recheck key (the (not null) (gethash key ht))))) + (setf (cdr info) notdef))))) +) + +(defun linkage-table-index (name datap) + "Returns the index of the foreign symbol in the linkage table or NIL if it is +not present." + (let* ((key (if datap (list name) name)) + (info *linkage-info*) + (ht (car info))) + (with-system-mutex ((hash-table-lock ht)) + (gethash key ht)))) + +(defun linkage-table-address (name datap) + "Returns the address of the foreign symbol's entry in the linkage table or NIL +if it is not present." + (awhen (linkage-table-index name datap) + (sb-vm::linkage-table-entry-address it))) + +(defun find-linkage-table-foreign-symbol-address (name) + "Returns the address of the foreign symbol NAME, or NIL. Consults only the +linkage table to find the address." + (multiple-value-bind (index datap) + (or (linkage-table-index name nil) + (values (linkage-table-index name t) t)) + (when (and index + (not (member (if datap (list name) name) (cdr *linkage-info*) :test #'equal))) + (sap-int (alien-sap (arch-read-linkage-table-entry index (if datap 1 0))))))) diff --git a/src/runtime/arch.h b/src/runtime/arch.h index e6965902d8..847cbdf6bf 100644 --- a/src/runtime/arch.h +++ b/src/runtime/arch.h @@ -66,5 +66,6 @@ extern void arch_handle_single_step_trap(os_context_t *context, int trap); #endif extern void arch_write_linkage_table_entry(int index, void *target_addr, int datap); +extern void *arch_read_linkage_table_entry(int index, int datap); #endif /* __ARCH_H__ */ diff --git a/src/runtime/arm-arch.c b/src/runtime/arm-arch.c index f8c7b5a7f5..d1b6dc891c 100644 --- a/src/runtime/arm-arch.c +++ b/src/runtime/arm-arch.c @@ -163,3 +163,15 @@ void arch_write_linkage_table_entry(int index, void *target_addr, int datap) os_flush_icache((os_vm_address_t) reloc_addr, (char*) inst_ptr - reloc_addr); } + +void +*arch_read_linkage_table_entry(int index, int datap) +{ + char *reloc_addr = + (char *)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + if (datap) { + return (unsigned long*) *(unsigned long *)reloc_addr; + } + + return *(void**)((int*)reloc_addr+3); +} diff --git a/src/runtime/arm64-arch.c b/src/runtime/arm64-arch.c index f84fb633bd..94de72920b 100644 --- a/src/runtime/arm64-arch.c +++ b/src/runtime/arm64-arch.c @@ -183,3 +183,14 @@ void arch_write_linkage_table_entry(int index, void *target_addr, int datap) DONE: THREAD_JIT(1); } + +void +*arch_read_linkage_table_entry(int index, int datap) +{ + char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + if (datap) { + return (unsigned long*) *(unsigned long *)reloc_addr; + } + + return *(void**)((int*)reloc_addr+2); +} diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index 34fbb1c9e2..517f5f2ded 100644 --- a/src/runtime/mips-arch.c +++ b/src/runtime/mips-arch.c @@ -512,4 +512,11 @@ void gcbarrier_patch_code(void* where, int nbits) unsigned preserve_bits = ~(0x1f << 6); pc[0] = (inst & preserve_bits) | (left_shift << 6); pc[1] = (next & preserve_bits) | (right_shift << 6); +void + +*arch_read_linkage_table_entry(int index, int datap) +{ + char *reloc_addr = + (char*)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + return *(unsigned int *)reloc_addr; } diff --git a/src/runtime/ppc-arch.c b/src/runtime/ppc-arch.c index 757997f09a..8f14f50bc5 100644 --- a/src/runtime/ppc-arch.c +++ b/src/runtime/ppc-arch.c @@ -749,6 +749,48 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) os_flush_icache((os_vm_address_t) reloc_addr, (char*) inst_ptr - reloc_addr); } + +void +*arch_read_linkage_table_entry(int index, int datap) +{ + char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + if (datap) { + return *(unsigned long *)reloc_addr; + } + +#if defined LISP_FEATURE_64_BIT +#ifdef LISP_FEATURE_LITTLE_ENDIAN + int* inst_ptr; + unsigned long a0, a16, a32, a48; + + inst_ptr = (int*) reloc_addr; + + a48 = *inst_ptr++ & 0xffff; + a32 = *inst_ptr++ & 0xffff; + inst_ptr++; + a16 = *inst_ptr++ & 0xffff; + a0 = *inst_ptr++ & 0xffff; + + return (void*) (a0 + (a16 << 16) + (a32 << 32) + (a48 << 48)); +#else + void *target_addr; + memcpy(target_addr, reloc_addr, 24); + return target_addr; +#endif +#endif + int* inst_ptr; + unsigned long hi; + unsigned long lo; + + inst_ptr = (int*) reloc_addr; + + hi = *inst_ptr++ & 0xffff; + lo = *inst_ptr++ & 0xffff; + + return (void*) (lo + (hi << 16)); +} + + void gcbarrier_patch_code(void* where, int nbits) { #ifdef LISP_FEATURE_64_BIT diff --git a/src/runtime/riscv-arch.c b/src/runtime/riscv-arch.c index 6c1994829b..5ac0fd3c92 100644 --- a/src/runtime/riscv-arch.c +++ b/src/runtime/riscv-arch.c @@ -212,6 +212,14 @@ void arch_write_linkage_table_entry(int index, void *target_addr, int datap) os_flush_icache((os_vm_address_t) reloc_addr, (char*) inst_ptr - reloc_addr); } +void +*arch_read_linkage_table_entry(int index, int datap) +{ + char *reloc_addr = + (char*)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + return *(uword_t *)reloc_addr; +} + lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs) { return ((lispobj(*)(lispobj, lispobj *, int, struct thread*))SYMBOL(CALL_INTO_LISP)->value) (fun, args, nargs, get_sb_vm_thread()); diff --git a/src/runtime/sparc-arch.c b/src/runtime/sparc-arch.c index f5fad5dedb..8d8143c9bd 100644 --- a/src/runtime/sparc-arch.c +++ b/src/runtime/sparc-arch.c @@ -362,3 +362,22 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) os_flush_icache((os_vm_address_t) reloc_addr, (char*) inst_ptr - reloc_addr); } + +void +*arch_read_linkage_table_entry(int index, int datap) +{ + char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + if (datap) { + return (unsigned long*) *(unsigned long *)reloc_addr; + } + + int* inst_ptr; + unsigned long hi; + unsigned long lo; + + inst_ptr = (int*) reloc_addr; + hi = *inst_ptr++ & 0x3fffff; + lo = *inst_ptr & 0x3ff; + + return (void*)(lo + (hi << 10)); +} diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 54206cb44f..5a981cf930 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -530,6 +530,17 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) *(void**)(reloc_addr+8) = target_addr; } +void +*arch_read_linkage_table_entry(int index, int datap) +{ + char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + if (datap) { + return (void*) *(uword_t *)reloc_addr; + } + + return *(void**)(reloc_addr+8); +} + /* These setup and check *both* the sse2 and x87 FPUs. While lisp code only uses the sse2 FPU, other code (such as libc) may use the x87 FPU. */ diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index 9b4214ef79..c69f868170 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -383,4 +383,18 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) *reloc_addr = 0x90; } +void +*arch_read_linkage_table_entry(int index, int datap) +{ + char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + if (datap) { + return (unsigned long*) *(unsigned long *)reloc_addr; + } + + long offset = 0; + + offset = reloc_addr[1] + (reloc_addr[2] << 8) + (reloc_addr[3] << 16) + (reloc_addr[4] << 24); + return (void*) (offset + reloc_addr + 5); +} + #include "x86-arch-shared.inc" diff --git a/tests/foreign.test.sh b/tests/foreign.test.sh index 57045bbab7..55e3f38dba 100755 --- a/tests/foreign.test.sh +++ b/tests/foreign.test.sh @@ -477,5 +477,27 @@ cat > $TEST_FILESTEM.alien.enum.lisp <<EOF EOF expect_clean_compile $TEST_FILESTEM.alien.enum.lisp +# If dlopen is available, check that the address we get for a symbol +# from dlsym and from backing it out of the linkage table match. +run_sbcl <<EOF + (eval-when (:compile-toplevel :load-toplevel :execute) + (setq *features* (union *features* sb-impl:+internal-features+))) + #+os-provides-dlopen + (progn + (extern-alien "posix_argv" (* (* char))) + (extern-alien "sin" (function double double)) + + ;; Test that data pointers are the same. + (assert (= (sb-sys:find-dynamic-foreign-symbol-address "posix_argv") + (sb-sys:find-linkage-table-foreign-symbol-address "posix_argv"))) + + ;; Test that function pointers are the same. + (assert (= (sb-sys:find-dynamic-foreign-symbol-address "sin") + (sb-sys:find-linkage-table-foreign-symbol-address "sin")))) + + (exit :code $EXIT_LISP_WIN) +EOF +check_status_maybe_lose "arch-read-linkage-table-entry" $? + # success convention for script exit $EXIT_TEST_WIN From c9304470212774983feffea5bf69b944c18c51e8 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Mon, 15 Mar 2021 22:06:51 -0400 Subject: [PATCH 4008/4023] Be more robust to dlopen(NULL) failing If we can't get a runtime handle, we can't be sure that FIND-DYNAMIC-FOREIGN-SYMBOL-ADDRESS will work, so teach FIND-FOREIGN-SYMBOL-ADDRESS to look up symbols via dlsym or by backing out the address from the linkage table. Replace most calls to FIND-DYNAMIC-FOREIGN-SYMBOL-ADDRESS with FIND-FOREIGN-SYMBOL-ADDRESS. This gets us a step closer to having #-os-provides-dlopen work. Additionally, this lets us create a static executable with musl libc. Musl's libdl functions all return an error when called within a static executable. At the moment, the only way to take advantage of this is shrinkwrapping, as a working libdl is required to build a working Lisp core from scratch. --- contrib/sb-bsd-sockets/sb-bsd-sockets.asd | 2 +- src/code/debug-int.lisp | 2 +- src/code/foreign-load.lisp | 5 +++-- src/code/foreign.lisp | 15 ++++++++++---- src/code/unix-foreign-load.lisp | 24 +++++++++-------------- src/compiler/target-main.lisp | 2 +- 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/contrib/sb-bsd-sockets/sb-bsd-sockets.asd b/contrib/sb-bsd-sockets/sb-bsd-sockets.asd index 9bc3ec3e7c..7313d17a13 100644 --- a/contrib/sb-bsd-sockets/sb-bsd-sockets.asd +++ b/contrib/sb-bsd-sockets/sb-bsd-sockets.asd @@ -6,7 +6,7 @@ ;;; 1003.1-2003 defines an alternative API, which is specified in the ;;; RFC to be thread-safe. If it seems to be available, use it. -(when (sb-alien::find-dynamic-foreign-symbol-address "getaddrinfo") +(when (sb-alien::find-foreign-symbol-address "getaddrinfo") (pushnew :sb-bsd-sockets-addrinfo *features*)) (defsystem "sb-bsd-sockets" diff --git a/src/code/debug-int.lisp b/src/code/debug-int.lisp index 41e731b5c4..c9c42228b4 100644 --- a/src/code/debug-int.lisp +++ b/src/code/debug-int.lisp @@ -3706,7 +3706,7 @@ register." #+riscv (error "Breakpoints don't work on RISC-V") #-(or arm64 riscv) (macrolet ((symbol-addr (name) - `(find-dynamic-foreign-symbol-address ,name)) + `(find-foreign-symbol-address ,name)) (trap-offset () `(- (symbol-addr "fun_end_breakpoint_trap") src-start))) ;; These are really code labels, not variables: but this way we get diff --git a/src/code/foreign-load.lisp b/src/code/foreign-load.lisp index 2fcbdad078..b07f695491 100644 --- a/src/code/foreign-load.lisp +++ b/src/code/foreign-load.lisp @@ -144,8 +144,9 @@ Experimental." ;;; Open libraries in *SHARED-OBJECTS* and the runtime. Called during ;;; initialization. (defun reopen-shared-objects () - ;; Ensure that the runtime is open - (setf *runtime-dlhandle* (dlopen-or-lose)) + ;; Try to open the runtime. If we can't, errors will be produced later on + ;; when it's actually used. + (setf *runtime-dlhandle* (ignore-errors (dlopen-or-lose))) ;; Without this many symbols aren't accessible. #+android (load-shared-object "libc.so" :dont-save t) ;; Reopen stuff. diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 8bbe88cecd..0eb7a7331c 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -105,7 +105,10 @@ (defun find-foreign-symbol-address (name) "Returns the address of the foreign symbol NAME, or NIL. Does not enter the symbol in the linkage table, and never returns an address in the linkage-table." - (find-dynamic-foreign-symbol-address name)) + (or + #+os-provides-dlopen + (find-dynamic-foreign-symbol-address name) + (find-linkage-table-foreign-symbol-address name))) ;;; Note that much conditionalization is for nothing at this point, because all ;;; platforms that we care about implement dlopen(). But if one did not, only @@ -131,8 +134,12 @@ Returns a secondary value T for historical reasons. The returned address is always a linkage-table address. Symbols are entered into the linkage-table if they aren't there already." (declare (ignorable datap)) - (let ((index (ensure-alien-linkage-index name datap))) - (values (sb-vm::alien-linkage-table-entry-address index) t))) + (values + (or (linkage-table-address name datap) + #+os-provides-dlopen + (ensure-alien-linkage-index name datap) + (error 'undefined-alien-error :name name)) + t)) (defun foreign-symbol-sap (symbol &optional datap) "Returns a SAP corresponding to the foreign symbol. DATAP must be true if the @@ -210,7 +217,7 @@ symbol designates a variable. May enter the symbol into the linkage-table." and reference across (symbol-value 'sb-vm::+required-foreign-symbols+) do (setf (gethash reference (car *linkage-info*)) table-offset)) #+os-provides-dlopen - (setf *runtime-dlhandle* (dlopen-or-lose)) + (setf *runtime-dlhandle* (ignore-errors (dlopen-or-lose))) #+os-provides-dlopen (setf *shared-objects* nil)) diff --git a/src/code/unix-foreign-load.lisp b/src/code/unix-foreign-load.lisp index 862c8bd232..73d9953a47 100644 --- a/src/code/unix-foreign-load.lisp +++ b/src/code/unix-foreign-load.lisp @@ -65,21 +65,15 @@ (defun find-dynamic-foreign-symbol-address (symbol) (dlerror) ; clear old errors - (unless *runtime-dlhandle* - (bug "Cannot resolve foreign symbol: lost *runtime-dlhandle*")) ;; On real ELF & dlsym platforms the EXTERN-ALIEN-NAME is a no-op, ;; but on platforms where dlsym is simulated we use the mangled name. - (let* ((extern (extern-alien-name symbol)) - (result (sap-int (dlsym *runtime-dlhandle* extern))) - (err (dlerror))) - (if (or (not (zerop result)) (not err)) + (let ((extern (extern-alien-name symbol)) result - (dolist (obj *shared-objects*) - (let ((sap (shared-object-handle obj))) - (when sap - (setf result (sap-int (dlsym sap extern)) - err (dlerror)) - (when (or (not (zerop result)) (not err)) - (return result)))))))) - - + err) + (dolist (handle (cons *runtime-dlhandle* + (mapcar #'shared-object-handle *shared-objects*))) + (when handle + (setf result (sap-int (dlsym handle extern)) + err (dlerror)) + (when (or (not (zerop result)) (not err)) + (return result)))))) diff --git a/src/compiler/target-main.lisp b/src/compiler/target-main.lisp index 15c881333c..def81ed46f 100644 --- a/src/compiler/target-main.lisp +++ b/src/compiler/target-main.lisp @@ -47,7 +47,7 @@ (make-compilation :msan-unpoison (and (member :msan *features*) - (find-dynamic-foreign-symbol-address "__msan_unpoison")) + (find-foreign-symbol-address "__msan_unpoison")) :block-compile nil)) (*current-path* nil) (*last-message-count* (list* 0 nil nil)) From f6d10852df625a456eb38aed316b713c5143277d Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Mon, 15 Mar 2021 22:14:55 -0400 Subject: [PATCH 4009/4023] Add make recipe for static-shrinkwrap-sbcl Additionally, remove the comment fro the comma variable definition. On at least GNU make 4.3, the value is set to ", ", not ",". --- src/runtime/GNUmakefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index b70fbd6c7e..008986916a 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -146,6 +146,9 @@ comma := , shrinkwrap-sbcl: shrinkwrap-sbcl.s shrinkwrap-sbcl-core.o $(LIBSBCL) $(CC) -no-pie $(filter-out -Wl$(comma)--export-dynamic, $(LINKFLAGS)) \ $(CFLAGS) -o $@ $^ $(LIBS) +static-shrinkwrap-sbcl: shrinkwrap-sbcl.s shrinkwrap-sbcl-core.o $(LIBSBCL) + $(CC) -no-pie -static $(filter-out -Wl$(comma)--export-dynamic, $(LINKFLAGS)) \ + $(CFLAGS) -o $@ $^ $(LIBS) pie-shrinkwrap-sbcl: pie-shrinkwrap-sbcl.s pie-shrinkwrap-sbcl-core.o $(PIC_OBJS) $(CC) -pie -o $@ $^ $(LIBS) semiwrap-sbcl: shrinkwrap-sbcl.s $(LIBSBCL) From 3960ec8d5d1e06cdecf19bde8e910d841bcb7d35 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:38:51 -0400 Subject: [PATCH 4010/4023] Add os_link_from_pointer_table Move the linkage table filling for shrinkwrapped executables into its own function. With changes to account for 851cbd2b7, 8968446c6, 27e216a36, 5a2e639a0 --- src/runtime/coreparse.c | 20 +------------------- src/runtime/os-common.c | 22 ++++++++++++++++++++++ src/runtime/runtime.h | 2 ++ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index ee45433a8c..709ab8d205 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -747,25 +747,7 @@ process_directory(int count, struct ndir_entry *entry, (uword_t)&lisp_code_start, (uword_t)&lisp_code_end, text_space_highwatermark); #endif - ALIEN_LINKAGE_TABLE_SPACE_START = - (uword_t)os_alloc_gc_space(ALIEN_LINKAGE_TABLE_CORE_SPACE_ID, 0, 0, - ALIEN_LINKAGE_TABLE_SPACE_SIZE); - // Prefill the alien linkage table so that shrinkwrapped executables which link in - // all their C library dependencies can avoid linking with -ldl - // but extern-alien still works for newly compiled code. - lispobj* ptr = &alien_linkage_values; - gc_assert(ptr); - int entry_index = 0; - int count; - extern int alien_linkage_table_n_prelinked; - count = alien_linkage_table_n_prelinked = *ptr++; - for ( ; count-- ; entry_index++ ) { - boolean datap = *ptr == (lispobj)-1; // -1 can't be a function address - if (datap) - ++ptr; - arch_write_linkage_table_entry(entry_index, (void*)*ptr++, datap); - } - + os_link_from_pointer_table(&lisp_linkage_values); // unprotect the pages os_protect((void*)TEXT_SPACE_START, text_space_size, OS_VM_PROT_ALL); } else diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index afc3ede694..6beb502ffc 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -17,6 +17,7 @@ #include "sbcl.h" #include "globals.h" #include "runtime.h" +#include "gc-assert.h" #include "genesis/config.h" #include "genesis/constants.h" #include "genesis/cons.h" @@ -163,6 +164,27 @@ os_sem_destroy(os_sem_t *sem) * table entry for each element of REQUIRED_FOREIGN_SYMBOLS. */ +void os_link_from_pointer_table(lispobj* table_ptr) +{ + ALIEN_LINKAGE_TABLE_SPACE_START = + (uword_t)os_alloc_gc_space(ALIEN_LINKAGE_TABLE_CORE_SPACE_ID, 0, 0, + ALIEN_LINKAGE_TABLE_SPACE_SIZE); + // Prefill the alien linkage table so that shrinkwrapped executables which link in + // all their C library dependencies can avoid linking with -ldl + // but extern-alien still works for newly compiled code. + gc_assert(table_ptr); + int entry_index = 0; + int count; + extern int alien_linkage_table_n_prelinked; + count = alien_linkage_table_n_prelinked = *table_ptr++; + for ( ; count-- ; entry_index++ ) { + boolean datap = *table_ptr == (lispobj)-1; // -1 can't be a function address + if (datap) + ++table_ptr; + arch_write_linkage_table_entry(entry_index, (void*)*table_ptr++, datap); + } +} + #ifndef LISP_FEATURE_WIN32 void * os_dlsym_default(char *name) diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index d34acc4a17..98646341eb 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -336,6 +336,8 @@ extern char *copied_string (char *string); # define GENCGC_IS_PRECISE 0 #endif +void os_link_from_pointer_table(lispobj *table_ptr); + void *os_dlsym_default(char *name); struct lisp_startup_options { From 6743cc224ddcebc3e1508182350ab13a202070cd Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:39:42 -0400 Subject: [PATCH 4011/4023] Make all host steps before any target steps Patch originally by Manuel Giraud <manuel@ledu-giraud.fr>, I just cleaned up some comments. Also preemtively remove after-grovel-headers since upstream removed it and it will make the rebase easier. --- make-host-1.sh | 11 +++++++++++ make-target-1.sh | 6 ------ make.sh | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/make-host-1.sh b/make-host-1.sh index 66f75120f0..a841d0ee45 100755 --- a/make-host-1.sh +++ b/make-host-1.sh @@ -32,3 +32,14 @@ export LANG LC_ALL # environment. echo //building cross-compiler, and doing first genesis echo '(load "loader.lisp") (load-sbcl-file "make-host-1.lisp")' | $SBCL_XC_HOST + +# Use a little C program to grab stuff from the C header files and +# smash it into Lisp source code. +$GNUMAKE -C src/runtime clean +$GNUMAKE -C src/runtime sbcl.h +$GNUMAKE -C tools-for-build -I../src/runtime grovel-headers +tools-for-build/grovel-headers > output/stuff-groveled-from-headers.lisp + +if [ -n "$SBCL_HOST_LOCATION" ]; then + rsync -a output/stuff-groveled-from-headers.lisp "$SBCL_HOST_LOCATION/output" +fi diff --git a/make-target-1.sh b/make-target-1.sh index 4beec303b1..7eee8a3086 100755 --- a/make-target-1.sh +++ b/make-target-1.sh @@ -39,12 +39,6 @@ echo //building runtime system and symbol table file $GNUMAKE -C src/runtime clean $GNUMAKE $SBCL_MAKE_JOBS -C src/runtime all -# Use a little C program to grab stuff from the C header files and -# smash it into Lisp source code. -$GNUMAKE -C tools-for-build -I../src/runtime grovel-headers -tools-for-build/grovel-headers > output/stuff-groveled-from-headers.lisp -touch -r tools-for-build/grovel-headers.c output/stuff-groveled-from-headers.lisp - if [ -n "$SBCL_HOST_LOCATION" ]; then echo //copying target-1 output files to host rsync -a output/stuff-groveled-from-headers.lisp "$SBCL_HOST_LOCATION/output" diff --git a/make.sh b/make.sh index 1c4c959f46..0d73cc3793 100755 --- a/make.sh +++ b/make.sh @@ -77,8 +77,8 @@ maybetime() { fi } maybetime sh make-host-1.sh -maybetime sh make-target-1.sh maybetime sh make-host-2.sh +maybetime sh make-target-1.sh maybetime sh make-target-2.sh maybetime sh make-target-contrib.sh From b89f19b2cd157a4830661a231c9c0502b6d0b307 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:40:03 -0400 Subject: [PATCH 4012/4023] Add the :SB-PRELINK-LINKAGE-TABLE feature This is an internal feature. When present, genesis writes a C helper file (linkage-table-prelink-info.c) that populates the C var lisp_linkage_values. This variable (originally introduced as part of the shrinkwrapping support) contains the true addresses of each variable and function in the linkage table. Then, when the runtime boots instead of using os_dlsym_default and required-foreign-symbols to fill the linkage table, the data in lisp_linkage_values is used instead. This has the affect of using the system linker to prelink the entire linkage table instead of doing it ourselves. Last, when the core boots, it has to fixup the prelinked entries. This is required to make sure the linkage table points to the appropriate guards for undefined foreign variables or functions. This cannot be done in the runtime because some on some archs the undefined alien function guard is an assembly routine generated in lisp. Instead, a NULL entry in lisp_linkage_values indicates an undefined entry. A useful feature for some use cases is to add extra symbols to the linkage table at build time that we know we'll need at run time. This is accomplished by passing the extra entries to the make process using the --extra-linkage-table-entries argument. The file must contain a single list. Each element is a linkage table entry consisting of three elements. The first is a string naming the C symbol. The second is T if the symbol is a variable, NIL if it is a function. The third is T if the entry is undefined (this is currently pointless, but will become useful in a future commit). Enabling this feature on Windows causes a test failure. The root cause is that mingw-w64 implements its trig functions as thin wrappers around fsin and friends. This can be wildly inaccurate. When this feature is enabled, the trig functions come from wingw-w64's libm. When this feature is disabled, the more accurate trig functions from the Windows C runtime are used. See https://sourceforge.net/p/mingw-w64/mailman/mingw-w64-public/thread/6141957e.8c6be.157053d0e19.Coremail.lh_mouse%40126.com/#msg35353216 and https://mingwpy.github.io/issues.html#math-precision-issues for more details. With changes to compensate for 851cbd2b7, 861a55d85 --- .gitignore | 1 + make-config.sh | 19 +++++++++++ make-genesis-2.lisp | 5 ++- make-target-2-load.lisp | 4 +++ src/code/foreign.lisp | 1 + src/code/linkage-table.lisp | 27 ++++++++++++++++ src/compiler/generic/genesis.lisp | 52 +++++++++++++++++++++++++++++-- src/runtime/GNUmakefile | 7 +++++ src/runtime/os-common.c | 8 +++++ 9 files changed, 121 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index e654f02068..c5b80e7d93 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ src/compiler/target src/runtime/Config src/runtime/TAGS src/runtime/genesis +src/runtime/linkage-table-prelink-info.c src/runtime/openbsd-sigcontext.h src/runtime/sbcl src/runtime/sbcl.exe diff --git a/make-config.sh b/make-config.sh index 3915c16e62..36e13fcf7f 100755 --- a/make-config.sh +++ b/make-config.sh @@ -100,6 +100,9 @@ do SBCL_CONTRIB_BLOCKLIST="$SBCL_CONTRIB_BLOCKLIST $optarg" ;; esac ;; + --extra-linkage-table-entries=) + $optarg_ok && SBCL_EXTRA_LINKAGE_TABLE_ENTRIES=$optarg + ;; --fancy) WITH_FEATURES="$WITH_FEATURES $FANCY_FEATURES" # Lower down we add :sb-thread for platforms where it can be built. @@ -224,6 +227,17 @@ Options: Transfer the files to/from directory /home/user/sbcl on host-machine. + --extra-linkage-table-entries=<path> Specify extra C symbols to include in + the linkage table + + Path to a file specifying symbols that must be included in the + SBCL linkage table. Useful for statically linking libraries + into the runtime and ensuring the linker does not remove them. + The file must contain a single list of two element lists. Each + sublist must have a string naming a C symbol as its first + element and NIL or T (if the symbol names a variable) as its + second element. + EOF exit 1 fi @@ -265,6 +279,11 @@ find_gnumake ./generate-version.sh +# Copy the extra linkage entries to output folder for Genesis to find. +if [ -n "$SBCL_EXTRA_LINKAGE_TABLE_ENTRIES" ] && [ -f "$SBCL_EXTRA_LINKAGE_TABLE_ENTRIES" ]; then + cp "$SBCL_EXTRA_LINKAGE_TABLE_ENTRIES" output/extra-linkage-table-entries.lisp-expr +fi + # Now that we've done our option parsing and found various # dependencies, write them out to a file to be sourced by other # scripts. diff --git a/make-genesis-2.lisp b/make-genesis-2.lisp index 2b68e997ae..1bc9a27139 100644 --- a/make-genesis-2.lisp +++ b/make-genesis-2.lisp @@ -21,7 +21,10 @@ :core-file-name "output/cold-sbcl.core" ;; The map file is not needed by the system, but can be ;; very handy when debugging cold init problems. - :map-file-name "output/cold-sbcl.map") + :map-file-name "output/cold-sbcl.map" + :linkage-table-prefill-info-c-name "src/runtime/linkage-table-prelink-info.c" + :extra-linkage-table-entries (when (probe-file "output/extra-linkage-table-entries.lisp-expr") + (read-from-file "output/extra-linkage-table-entries.lisp-expr"))) #+cmu (ext:quit) #+clisp (ext:quit) #+abcl (ext:quit) diff --git a/make-target-2-load.lisp b/make-target-2-load.lisp index cadadfe00b..41c4441435 100644 --- a/make-target-2-load.lisp +++ b/make-target-2-load.lisp @@ -39,6 +39,10 @@ ;; than subtractive ones. So you opt out, not in, to having *LOAD-TRUENAME* ;; eagerly bound. :ANSI-COMPLIANT-LOAD-TRUENAME + ;; Used by genesis and C. Genesis uses presence of this feature to + ;; determine if a C file should be written to contain the linkage + ;; info. + :SB-PRELINK-LINKAGE-TABLE ;; The final batch of symbols is strictly for C. The LISP_FEATURE_ ;; prefix on the corresponding #define is unfortunate. :GCC-TLS :USE-SYS-MMAP diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 0eb7a7331c..2f9285440b 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -150,6 +150,7 @@ symbol designates a variable. May enter the symbol into the linkage-table." (int-sap addr)))) (defun foreign-reinit () + (fixup-prelinked-linkage-table-entries) #+os-provides-dlopen (reopen-shared-objects) (update-alien-linkage-table t)) diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index 016a9f2072..d3db6f9c6b 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -118,6 +118,33 @@ (setf (cdr info) notdef))))) ) +;; TODO: Is there a way to avoid this? This is needed because on some +;; platforms, the undefined alien function handler is not available at compile +;; time (it's an assembly routine created in Lisp). +(defun fixup-prelinked-linkage-table-entries () + "Called during reinit. Used to rewrite NULL function references to the +correct undefined alien function handler." + (let* ((n-prelinked (extern-alien "lisp_linkage_table_n_prelinked" int)) + (info *linkage-info*) + (ht (car info)) + (notdef)) + (with-system-mutex ((hash-table-lock ht)) + (dohash ((key index) ht) + (when (< index n-prelinked) + (let* ((datap (listp key)) + (sap (alien-sap (arch-read-linkage-table-entry index (if datap 1 0))))) + (when (zerop (sap-int sap)) + (push key notdef) + (arch-write-linkage-table-entry index + (if datap + undefined-alien-address + (or + (sb-fasl:get-asm-routine 'sb-vm::undefined-alien-tramp) + (find-foreign-symbol-address "undefined_alien_function") + (bug "unreachable"))) + (if datap 1 0))))))) + (setf (cdr info) notdef))) + (defun linkage-table-index (name datap) "Returns the index of the foreign symbol in the linkage table or NIL if it is not present." diff --git a/src/compiler/generic/genesis.lisp b/src/compiler/generic/genesis.lisp index 2a0c82d8d5..a9a233fb82 100644 --- a/src/compiler/generic/genesis.lisp +++ b/src/compiler/generic/genesis.lisp @@ -2394,6 +2394,44 @@ Legal values for OFFSET are -4, -8, -12, ..." (cold-cons (cold-intern (first rtn)) (make-fixnum-descriptor (cdr rtn)))) '*!initial-assembler-routines*))) +#+sb-prelink-linkage-table +(defun foreign-symbols-to-c (output-pathname) + (with-open-file (output output-pathname + :direction :output + :if-exists :supersede) + (let ((sorted-pairs (sort (%hash-table-alist *cold-foreign-symbol-table*) #'< :key #'cdr))) + ;; Needed for uintptr_t. We use the raw uintptr_t as we don't want to have + ;; to include any SBCL headers just to get at lispobj. + (format output "#include <stdint.h>~%~%") + + ;; Write out the extern definitions. Everything is a void function (even + ;; variables) because compilers don't like void variables. Remove + ;; lisp_linkage_values as we need to write to it, so we should use the + ;; actual type. + (format output "extern void ~{~A()~^, ~};~%~%" + (remove "lisp_linkage_values" + (mapcar (lambda (x) + (if (listp (car x)) + (caar x) + (car x))) + sorted-pairs) + :test #'equal)) + + #-win32 + (format output "uintptr_t __attribute__((weak)) lisp_linkage_values[] = {~%") + #+win32 + (format output "uintptr_t lisp_linkage_values[] = {~%") + + (format output " ~D,~%" (length sorted-pairs)) + (dolist (pair sorted-pairs) + (when (listp (car pair)) + ;; This is data, put -1 in to indicate that. + (format output " (uintptr_t)-1,~%")) + (format output " (uintptr_t)&~A,~%" (if (listp (car pair)) + (caar pair) + (car pair)))) + (format output "};~%")))) + ;;;; general machinery for cold-loading FASL files @@ -3858,12 +3896,16 @@ III. initially undefined function references (alphabetically): ;;; CORE-FILE-NAME gets a Lisp core. ;;; C-HEADER-DIR-NAME gets the path in which to place generated headers ;;; MAP-FILE-NAME gets the name of the textual 'cold-sbcl.map' file +;;; LINKAGE-TABLE-PREFILL-INFO-C-NAME gets a .c file used to store the +;;; data used to link the runtime before entering Lisp. (defun sb-cold:genesis (&key object-file-names tls-init defstruct-descriptions build-id core-file-name c-header-dir-name map-file-name - symbol-table-file-name (verbose t)) - (declare (ignorable symbol-table-file-name)) + symbol-table-file-name (verbose t) + linkage-table-prefill-info-c-name + extra-linkage-table-entries) + (declare (ignorable symbol-table-file-name linkage-table-prefill-info-c-name)) (when verbose (format t @@ -3881,6 +3923,9 @@ III. initially undefined function references (alphabetically): ;; Prefill some linkage table entries perhaps (loop for (name datap) in sb-vm::*linkage-space-predefined-entries* do (alien-linkage-table-note-symbol name datap)) + (loop for (name datap undefinedp) in extra-linkage-table-entries + unless undefinedp + do (alien-linkage-table-note-symbol name datap)) ;; Now that we've successfully read our only input file (by ;; loading the symbol table, if any), it's a good time to ensure @@ -4006,6 +4051,9 @@ III. initially undefined function references (alphabetically): (resolve-deferred-known-funs) (resolve-static-call-fixups) (foreign-symbols-to-core) + #+sb-prelink-linkage-table + (when linkage-table-prefill-info-c-name + (foreign-symbols-to-c linkage-table-prefill-info-c-name)) (when core-file-name (finish-symbols)) (finalize-load-time-value-noise) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index 008986916a..669c8a62ed 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -82,6 +82,10 @@ ifndef LISP_FEATURE_WIN32 COMMON_SRC += run-program.c sprof.c endif +ifdef LISP_FEATURE_SB_PRELINK_LINKAGE_TABLE +COMMON_SRC += linkage-table-prelink-info.c +endif + C_SRC = $(COMMON_SRC) ${ARCH_SRC} ${OS_SRC} ${GC_SRC} SRCS = $(C_SRC) ${ASSEM_SRC} @@ -119,6 +123,9 @@ unit-tests: gc-unit-tests.o libsbcl.a sbcl.o: $(OBJS) $(LD) $(__LDFLAGS__) -r -o $@ $^ +linkage-table-prelink-info.o: linkage-table-prelink-info.c + $(CC) $(CFLAGS) $(CPPFLAGS) -Wno-builtin-declaration-mismatch -c -o $@ $< + libsbcl.a: $(OBJS) rm -f $@ ; ar rcs $@ $^ diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index 6beb502ffc..cc4518218e 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -194,12 +194,17 @@ os_dlsym_default(char *name) } #endif +#ifdef LISP_FEATURE_SB_PRELINK_LINKAGE_TABLE +extern lispobj lisp_linkage_values; +#endif + int alien_linkage_table_n_prelinked; void os_link_runtime() { if (alien_linkage_table_n_prelinked) return; // Linkage was already performed by coreparse +#ifndef LISP_FEATURE_SB_PRELINK_LINKAGE_TABLE struct vector* symbols = VECTOR(SymbolValue(REQUIRED_FOREIGN_SYMBOLS,0)); alien_linkage_table_n_prelinked = vector_len(symbols); int j; @@ -217,6 +222,9 @@ void os_link_runtime() fprintf(stderr, "Missing required foreign symbol '%s'\n", namechars); } } +#else + os_link_from_pointer_table(&lisp_linkage_values); +#endif } void os_unlink_runtime() From 83a7007c65f7e8fec76f78bbd3f3e231864c9fe9 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:44:35 -0400 Subject: [PATCH 4013/4023] Support -os-provides-dlopen -os-provides-dlopen and -sb-prelink-linkage-table is incompatible. In order to build a working core with -os-provides-dlopen you must provide the list of all C symbols introduced in make-target-2. With changes to compensate for 851cbd2b7 --- src/code/foreign.lisp | 2 +- src/code/linkage-table.lisp | 1 + src/cold/shared.lisp | 5 ++++- src/runtime/GNUmakefile | 7 +++++++ src/runtime/os-common.c | 2 +- src/runtime/validate.c | 2 -- 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 2f9285440b..09c7f61c78 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -152,7 +152,7 @@ symbol designates a variable. May enter the symbol into the linkage-table." (defun foreign-reinit () (fixup-prelinked-linkage-table-entries) #+os-provides-dlopen (reopen-shared-objects) - (update-alien-linkage-table t)) + #+os-provides-dlopen (update-alien-linkage-table t)) ;;; Cleanups before saving a core (defun foreign-deinit () diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index d3db6f9c6b..a071af4c25 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -32,6 +32,7 @@ (define-alien-variable undefined-alien-address unsigned) +#+os-provides-dlopen (macrolet ((dlsym-wrapper (&optional warn) ;; Produce two values: an indicator of whether the foreign symbol was ;; found; and the address as an integer if found, or a guard address diff --git a/src/cold/shared.lisp b/src/cold/shared.lisp index f4cdde7d6f..5f9827c3f9 100644 --- a/src/cold/shared.lisp +++ b/src/cold/shared.lisp @@ -367,7 +367,10 @@ "Can't enable SB-FUTEX on platforms lacking thread support") ;; There is still hope to make multithreading on DragonFly x86-64 ("(and sb-thread x86 dragonfly)" - ":SB-THREAD not supported on selected architecture"))) + ":SB-THREAD not supported on selected architecture") + ;; We need SOME way to fill the linkage table... + ("(and (not os-provides-dlopen) (not sb-prelink-linkage-table))" + "Can't disable both os-provides-dlopen and sb-prelink-linkage-table"))) (failed-test-descriptions nil)) (dolist (test feature-compatibility-tests) (let ((*readtable* *xc-readtable*)) diff --git a/src/runtime/GNUmakefile b/src/runtime/GNUmakefile index 669c8a62ed..dd9d5a304e 100644 --- a/src/runtime/GNUmakefile +++ b/src/runtime/GNUmakefile @@ -92,7 +92,14 @@ SRCS = $(C_SRC) ${ASSEM_SRC} OBJS = $(C_SRC:.c=.o) $(ASSEM_SRC:.S=.o) ../../tlsf-bsd/tlsf/tlsf.o +# "Commas ... cannot appear in the text of an argument as written" +comma := , + +ifeq ($(or $(LISP_FEATURE_OS_PROVIDES_DLOPEN),$(LISP_FEATURE_OS_PROVIDES_DLADDR)),1) LIBS = ${OS_LIBS} $(LDLIBS) -lm +else +LIBS = $(filter-out -ldl,$(filter-out -Wl$(comma)-no-as-needed,$(OS_LIBS))) $(LDLIBS) -lm +endif targets: $(TARGET) $(OBJTARGET) sbcl.mk diff --git a/src/runtime/os-common.c b/src/runtime/os-common.c index cc4518218e..0f1e455143 100644 --- a/src/runtime/os-common.c +++ b/src/runtime/os-common.c @@ -185,7 +185,7 @@ void os_link_from_pointer_table(lispobj* table_ptr) } } -#ifndef LISP_FEATURE_WIN32 +#if !defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_OS_PROVIDES_DLOPEN) void * os_dlsym_default(char *name) { diff --git a/src/runtime/validate.c b/src/runtime/validate.c index 2f2f1de71a..04e496f63a 100644 --- a/src/runtime/validate.c +++ b/src/runtime/validate.c @@ -125,9 +125,7 @@ allocate_lisp_dynamic_space(boolean did_preinit) if (!did_preinit) allocate_hardwired_spaces(1); -#ifdef LISP_FEATURE_OS_PROVIDES_DLOPEN ensure_undefined_alien(); -#endif } static inline void From 0f5cb4795e6100a3d7055e9164c5c07dc2309300 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:46:03 -0400 Subject: [PATCH 4014/4023] sb-gmp: Add support for static linking of libgmp --- contrib/sb-gmp/gmp.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/sb-gmp/gmp.lisp b/contrib/sb-gmp/gmp.lisp index 681d299ba3..ab20da84a8 100644 --- a/contrib/sb-gmp/gmp.lisp +++ b/contrib/sb-gmp/gmp.lisp @@ -84,6 +84,7 @@ #-(or win32 darwin) '("libgmp.so" "libgmp.so.10" "libgmp.so.3") #+darwin '("libgmp.dylib" "libgmp.10.dylib" "libgmp.3.dylib") #+win32 '("libgmp.dll" "libgmp-10.dll" "libgmp-3.dll")) + (sb-alien::find-foreign-symbol-address "__gmp_version") (warn "GMP not loaded."))) (defvar *gmp-features* nil) From 6ecb3538e32cedb12aa63f54c14142fb6cb0cfeb Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:46:22 -0400 Subject: [PATCH 4015/4023] Add helper script to dump linkage info --- tools-for-build/dump-linkage-info.lisp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tools-for-build/dump-linkage-info.lisp diff --git a/tools-for-build/dump-linkage-info.lisp b/tools-for-build/dump-linkage-info.lisp new file mode 100644 index 0000000000..c71fef609f --- /dev/null +++ b/tools-for-build/dump-linkage-info.lisp @@ -0,0 +1,26 @@ +(defpackage #:sb-dump-linkage-info + (:use #:cl) + (:export #:*libdl-symbols* + #:dump-to-file)) + +(in-package #:sb-dump-linkage-info) + +(defparameter *libdl-symbols* '("dladdr" "dlclose" "dlerror" "dlopen" "dlsym")) + +(defun dump-to-file (pn &key (make-undefined nil)) + (let ((ht (car sb-sys:*linkage-info*)) + (undefined-entries (cdr sb-sys:*linkage-info*)) + out) + (loop + :for key :being :the :hash-keys :in ht :using (hash-value idx) + :for datap := (listp key) + :for name := (if datap (first key) key) + :for undefinedp := (not (null (or (member key undefined-entries :test #'equal) + (member name make-undefined :test #'equal)))) + :do (push (cons idx (list name datap undefinedp)) out)) + (ensure-directories-exist pn) + (with-open-file (s pn :direction :output :if-exists :supersede) + (let ((*print-pretty* nil)) + (prin1 (mapcar #'cdr (sort out #'< :key #'car)) s)) + (terpri s))) + pn) From 9c65c97d368cfcfcf2add5d43725434454c175ba Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:46:31 -0400 Subject: [PATCH 4016/4023] Add environment variable to ignore contrib failures while building --- make-target-contrib.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make-target-contrib.sh b/make-target-contrib.sh index 46e02b8a1c..4057e34a8b 100755 --- a/make-target-contrib.sh +++ b/make-target-contrib.sh @@ -128,6 +128,6 @@ EOF fi done -if [ $HEADER_HAS_BEEN_PRINTED = true ]; then +if [ $HEADER_HAS_BEEN_PRINTED = true ] && [ "$IGNORE_CONTRIB_FAILURES" != "yes" ]; then exit 1 fi From 43b61d8cd49391e9d991e7685bde5ebdc9a79ab8 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:46:42 -0400 Subject: [PATCH 4017/4023] Add helper script to generate a linkage table override --- ...e-linkage-table-prelink-info-override.lisp | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 tools-for-build/create-linkage-table-prelink-info-override.lisp diff --git a/tools-for-build/create-linkage-table-prelink-info-override.lisp b/tools-for-build/create-linkage-table-prelink-info-override.lisp new file mode 100644 index 0000000000..2e563af27f --- /dev/null +++ b/tools-for-build/create-linkage-table-prelink-info-override.lisp @@ -0,0 +1,43 @@ +(in-package :cl-user) + +(defun foreign-symbols-to-c (output-pathname sorted-symbols) + (with-open-file (output output-pathname + :direction :output + :if-exists :supersede) + ;; Needed for uintptr_t. We use the raw uintptr_t as we don't want to have + ;; to include any SBCL headers just to get at lispobj. + (format output "#include <stdint.h>~%~%") + + ;; Write out the extern definitions. Everything is a void function (even + ;; variables) because compilers don't like void variables. Remove + ;; lisp_linkage_values as we need to write to it, so we should use the + ;; actual type. + (format output "extern void ~{~A()~^, ~};~%~%" + (remove "lisp_linkage_values" + (mapcar #'first + (remove t sorted-symbols :key #'third)) + :test #'equal)) + + (format output "uintptr_t lisp_linkage_values[] = {~%") + + (format output " ~D,~%" (length sorted-symbols)) + (dolist (symbol sorted-symbols) + (destructuring-bind (name datap undefinedp) symbol + (when datap + ;; This is data, put -1 in to indicate that. + (format output " (uintptr_t)-1,~%")) + (if undefinedp + (format output " (uintptr_t)0,~%") + (format output " (uintptr_t)&~A,~%" name)))) + (format output "};~%"))) + +(defun main (&optional (args (cdr sb-ext:*posix-argv*))) + (foreign-symbols-to-c (second args) + (with-open-file (s (first args)) + (read s)))) + +(eval-when (:execute) + (let ((args (cdr sb-ext:*posix-argv*))) + (when args + (let ((*print-pretty* nil)) + (main args))))) From 6f74ae2985e6030426e4bb397de15d84d2d393b1 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:46:55 -0400 Subject: [PATCH 4018/4023] Add Dockerfile giving an example on how to build static executable --- .../Dockerfile.static-executable-example | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tools-for-build/Dockerfile.static-executable-example diff --git a/tools-for-build/Dockerfile.static-executable-example b/tools-for-build/Dockerfile.static-executable-example new file mode 100644 index 0000000000..0ec5e3f9e8 --- /dev/null +++ b/tools-for-build/Dockerfile.static-executable-example @@ -0,0 +1,63 @@ +# Example Dockerfile to build a static executable with SBCL. The example +# executable simply runs the sb-gmp contrib tests. The exeutable has libc, +# libgmp, and libz staticially linked in. It is simple, however it demonstrates +# that a static executable can run on ~any Linux system. + +FROM clfoundation/sbcl:alpine3.13 + +COPY . /usr/local/src/sbcl/ + +WORKDIR /usr/local/src/sbcl + +# Install build prereq and build SBCL with sb-linkable-runtime and +# sb-prelink-linkage-table +RUN set -x \ + # I frequently build arm executables on an arm64 computer. Need to add this + # otherwise SBCL can get confused + && case "$(cat /etc/apk/arch)" in \ + armv7) SBCL_ARCH=arm;; \ + aarch64) SBCL_ARCH=arm64;; \ + x86_64) SBCL_ARCH=x86-64;; \ + *) echo "Unknown arch" >&2; exit 1;; \ + esac \ + && export SBCL_ARCH \ + && apk add --no-cache ca-certificates curl openssl make gcc musl-dev linux-headers gnupg patch zlib-dev zlib-static \ + # Remove the hardcoding of armv5 as target arch. Use the default provided + # by the base image. Required when building for ARM on Alpine 3.12. + && sed -i -e "s/CFLAGS += -marm -march=armv5/CFLAGS += -marm/" src/runtime/Config.arm-linux \ + && sh make.sh --fancy --with-sb-linkable-runtime --with-sb-prelink-linkage-table \ + && sh install.sh + +# Load sb-gmp into an image, save the foreign symbols it requires, and dump the +# core. +RUN set -x \ + && apk add --no-cache gmp-dev \ + && sbcl --non-interactive \ + --eval '(require :uiop)' \ + --eval '(require :sb-gmp)' \ + --eval '(require :sb-rt)' \ + --eval '(defvar *sb-gmp-tests* (uiop:read-file-string "contrib/sb-gmp/tests.lisp"))' \ + --load tools-for-build/dump-linkage-info.lisp \ + --eval '(sb-dump-linkage-info:dump-to-file "/tmp/linkage-info.sexp")' \ + --eval '(sb-ext:save-lisp-and-die "/tmp/sb-gmp-tester.core")' + +# Build a static runtime, with libgmp linked and the required symbols in the +# linkage table. +RUN set -x \ + && sbcl --script tools-for-build/create-linkage-table-prelink-info-override.lisp \ + /tmp/linkage-info.sexp \ + /tmp/linkage-table-prelink-info-override.c \ + && while read l; do \ + eval "${l%%=*}=\"${l#*=}\""; \ + done < /usr/local/lib/sbcl/sbcl.mk \ + && $CC $CFLAGS -Wno-builtin-declaration-mismatch -o /tmp/linkage-table-prelink-info-override.o -c /tmp/linkage-table-prelink-info-override.c \ + && $CC -no-pie -static $LINKFLAGS -o /tmp/static-sbcl /usr/local/lib/sbcl/$LIBSBCL /tmp/linkage-table-prelink-info-override.o -lgmp $LIBS + +# Use the new static runtime to load the previous core and then dump a +# compressed executable with the toplevel function set to run the sb-gmp test +# suite. +RUN set -x \ + && /tmp/static-sbcl \ + --core /tmp/sb-gmp-tester.core \ + --non-interactive \ + --eval '(sb-ext:save-lisp-and-die "/tmp/sb-gmp-tester" :executable t :toplevel (lambda () (uiop:load-from-string *sb-gmp-tests*) (sb-rt:do-tests) (exit)) :compression t)' From ea218ef65306a7c50c27583a550028a7d4159eff Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Tue, 16 Mar 2021 09:47:06 -0400 Subject: [PATCH 4019/4023] Add README.static-executable --- README.static-executable | 250 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 README.static-executable diff --git a/README.static-executable b/README.static-executable new file mode 100644 index 0000000000..ffd12f35fe --- /dev/null +++ b/README.static-executable @@ -0,0 +1,250 @@ +This branch of SBCL is maintained by Eric Timmons (@daewok) and contains a set +of patches necessary to build a completely static executable with SBCL. Such an +executable has all necessary foreign libraries statically linked into the +runtime and has no support for dynamic loading and unloading of +libraries. While the lack of dynamic loading support is certainly constraining, +the benefit of building an executable this way is it requires no libraries to +be installed by the user of the executable. This makes it ideal for archival +purposes, distributing executables to a non-technical audience, distributing an +executable where you must know the exact versions of foreign libraries used at +runtime, or distributing executables that Just Work^TM (like many executables +written in golang). + +While other solutions exist to statically link foreign libraries into the SBCL +runtime, to the best of my knowledge there has been no publicly advertised +method of building SBCL with libc statically linked. The lack of static linking +for libc means that the user of the executable must have a compatible libc +installed. Unfortunately, the most commonly used libc in the Linux world +(glibc) is frequently not backward compatible with itself. For evidence of +this, see the fact that SBCLs built on Debian Buster (like the official +releases since 1.5.6) do not run on Debian Stretch. + +Unfortunately, glibc doesn't even really support static linking at +all. Therefore, I recommend that static SBCL executables be built with musl +libc. Musl is designed with static linking in mind and is broadly compatible +with most libraries that don't do tricksy things with libc. And if you find a +library not compatible with musl libc, it seems most maintainers are welcoming +to patches that add support. + +Alpine Linux is a great OS for building statically linked executables as it +uses musl libc by default. I further recommend using Docker for building static +executables so that you don't need to maintain a separate Alpine install. Plus, +you can use the clfoundation/sbcl:alpine3.13 image as a starting point. + +THEORY + +The biggest issue with creating a static executable is ensuring that foreign +symbols are accessible from the Lisp core. In normal, dynamic use, SBCL uses +dlsym to look up the address of symbols and stores them in a vector in foreign +memory called the "linkage table". The lisp core then maintains a hash table +mapping foreign symbol names to their index in the linkage table. This is +called the linkage info. + +In a static executable, we cannot count on having a working dlsym, even if +libdl is linked into the runtime. When performing static linkage, musl libc +replaces all libdl functions with stubs that simply return errors. Therefore, +we have to use the system linker to resolve the references for us. But in order +to have the linker do that for us, we need to know at link time which foreign +symbols our lisp code will want to use! + +EXTRACTING LINKAGE INFO + +There are two approaches described below to generate a static executable. Both +of them require a file describing the desired linkage info. While you could +generate this by hand, it is easiest to extract it from a core. + +In order to extract the linkage info from a running core, use +tools-for-build/dump-linkage-info.lisp. After loading that into the core, +evaluate (sb-dump-linkage-info:dump-to-file #p"/path/to/output.sexp"). It also +takes an keyword argument :make-undefined, a list of symbol names to make +undefined in the output. This is useful for approach two below. + +The sexp written to the output file is a single list of lists. Each sublist has +three elements. The first is a string naming the symbol. The second is T if the +symbol is entered into the linkage info as data (it is a foreign variable) and +NIL otherwise (it is a foreign function). The third is T if the symbol is +undefined and NIL otherwise. It is critical that undefined symbols be +maintained for approach one below. + +The following two sections describe two approaches on how to generate a static +executable, step-by-step. The demo static executable contains the sb-gmp +contrib and runs its test quite when executed. It requires that the static +libraries for libgmp and libz are installed on your system. There is some +weirdness with how the tests are loaded. This is because the tests do not seem +to work after being dumped: I have not yet figured out why this is. + +BUILDING A STATIC EXECUTABLE - APPROACH ONE + +This approach to building a static executable is preferred if you're you want +to minimize the amount of time compiling C and Lisp code. It takes advantage of +the fact that musl inserts stub functionality for libdl such that it can still +be linked against. + +The general process for this approach is: + +0. Build SBCL with the :sb-prelink-linkage-table feature (:sb-linkable-runtime +is also strongly recommended). + +1. Build a core containing the lisp code you want to package in the static +executable. + +2. Dump the linkage info to a file. + +3. Dump the core to a file (with save-lisp-and-die). + +4. Generate a C file that contains the info needed to build the linkage table. + +5. Relink the runtime. This time statically *and* with the object file +generated from the C file in step 4. + +6. Load the saved core into the new static runtime, dumping again with +:executable t if desired. + +Some notes about this approach: + ++ The build IDs of the dynamic runtime (used to generate the core in step 1) +and the static runtime *must* match. The easiest way to achieve this is to +install SBCL with the feature :sb-linkable-runtime. This installs sbcl.o (the +SBCL runtime in a ingle object file) along with everything else. + ++ No modifications must be made to the linkage info file generated in step 2 +and no symbols can be filtered out of it. + +Here is a step-by-step procedure to build the demo static executable using this +approach. + +Step 0: + + sh make.sh --fancy --with-sb-linkable-runtime --with-sb-prelink-linkage-table + sh install.sh + +Steps 1-3: + + sbcl --non-interactive \ + --no-sysinit --no-userinit \ + --eval '(require :uiop)' \ + --eval '(require :sb-gmp)' \ + --eval '(require :sb-rt)' \ + --eval '(defvar *sb-gmp-tests* (uiop:read-file-string "contrib/sb-gmp/tests.lisp"))' \ + --load tools-for-build/dump-linkage-info.lisp \ + --eval '(sb-dump-linkage-info:dump-to-file "/tmp/linkage-info.sexp")' \ + --eval '(sb-ext:save-lisp-and-die "/tmp/sb-gmp-tester.core")' + +Step 4: + + sbcl --no-sysinit --no-userinit \ + --script tools-for-build/create-linkage-table-prelink-info-override.lisp \ + /tmp/linkage-info.sexp \ + /tmp/linkage-table-prelink-info-override.c + +Step 5: + + # Get all the variables SBCL used to build defined in the current environment. + while read l; do + eval "${l%%=*}=\"${l#*=}\""; + done < /usr/local/lib/sbcl/sbcl.mk + + $CC $CFLAGS -Wno-builtin-declaration-mismatch -o /tmp/linkage-table-prelink-info-override.o -c /tmp/linkage-table-prelink-info-override.c + $CC -no-pie -static $LINKFLAGS -o /tmp/static-sbcl /usr/local/lib/sbcl/$LIBSBCL /tmp/linkage-table-prelink-info-override.o -lgmp $LIBS + +Step 6: + + /tmp/static-sbcl --core /tmp/sb-gmp-tester.core \ + --non-interactive \ + --no-sysinit --no-userinit \ + --eval '(sb-ext:save-lisp-and-die "/tmp/sb-gmp-tester" :executable t :toplevel (lambda () (uiop:load-from-string *sb-gmp-tests*) (sb-rt:do-tests) (exit)) :compression t)' + + +Look at the dumped executable. You should see that it is a static executable. + + ldd /tmp/sb-gmp-tester + +Test that it works! + + /tmp/sb-gmp-tester + +BUILDING A STATIC EXECUTABLE - APPROACH TWO + +This approach results in an executable that is not linked with libdl at +all. This makes it a little bit more "pure" than than the previous approach, +but that comes at the cost of needing to fully recompile both the runtime and +core after the necessary foreign symbols are determined. + +The general process for this approach is: + +1. Build a core containing the lisp code you want to package in the static +executable. + +2. Dump the linkage info to a file. + +3. Recompile SBCL, passing in the linkage info during build. + +4. Rebuild your core with the new runtime and corresponding core. + +5. Dump with :executable t. + +Some notes about this approach: + ++ The libdl symbols must be stripped out of the linkage info file generated in +step 2. The easiest way to do this is pass sb-dump-linkage-info:*libdl-symbols* +as the :make-undefined argument to dump-to-file. + ++ Further modifications can be made to the linkage info file generated in step +2. You can reorder the symbols at will. You can add new symbols. You probably +don't want to remove any (besides libdl functions). + +Steps 1-2: + + sh run-sbcl.sh --non-interactive \ + --no-sysinit --no-userinit \ + --eval '(require :uiop)' \ + --eval '(require :sb-gmp)' \ + --eval '(require :sb-rt)' \ + --eval '(defvar *sb-gmp-tests* (uiop:read-file-string "contrib/sb-gmp/tests.lisp"))' \ + --load tools-for-build/dump-linkage-info.lisp \ + --eval '(sb-dump-linkage-info:dump-to-file "/tmp/linkage-info.sexp" :remove-symbols sb-dump-linkage-info:*libdl-symbols*)' + +Step 3: + + LDLIBS="-lgmp" LINKFLAGS="-no-pie -static" IGNORE_CONTRIB_FAILURES="yes" sh make.sh --extra-linkage-table-entries=/tmp/linkage-info.sexp --without-os-provides-dlopen --without-os-provides-dladdr --fancy + +Steps 4-5: + + sh run-sbcl.sh --non-interactive \ + --no-sysinit --no-userinit \ + --eval '(require :uiop)' \ + --eval '(require :sb-gmp)' \ + --eval '(require :sb-rt)' \ + --eval '(defvar *sb-gmp-tests* (uiop:read-file-string "contrib/sb-gmp/tests.lisp"))' \ + --eval '(sb-ext:save-lisp-and-die "/tmp/sb-gmp-tester" :executable t :toplevel (lambda () (uiop:load-from-string *sb-gmp-tests*) (sb-rt:do-tests) (exit)) :compression t)' + +Look at the dumped executable. You should see that it is a static executable. + + ldd /tmp/sb-gmp-tester + +Test that it works! + + /tmp/sb-gmp-tester + +BUILDING A STATIC EXECUTABLE WITH DOCKER + +See the Dockerfile at tools-for-build/Dockerfile.static-executable-example for +an example of how to build the demo executable using Docker and approach +one. The benefit of Docker is that it is a cheap way to build with musl libc +even if you use glibc locally. + +The following commands will build the demo executable inside docker and extract +it from the image, placing it at /tmp/sb-gmp-tester on your local file +system. The following commands also try to avoid polluting your Docker +namespace by not tagging the image or naming the container used to extract the +executable. + + IMAGE_ID_FILE="$(mktemp)" + CONTAINER_ID_FILE="$(mktemp)" + rm "$CONTAINER_ID_FILE" + docker build --iidfile "$IMAGE_ID_FILE" -f tools-for-build/Dockerfile.static-executable-example . + docker create --cidfile "$CONTAINER_ID_FILE" "$(cat "$IMAGE_ID_FILE")" + docker cp "$(cat "$CONTAINER_ID_FILE"):/tmp/sb-gmp-tester" /tmp/sb-gmp-tester + docker rm "$(cat "$CONTAINER_ID_FILE")" + rm "$IMAGE_ID_FILE" + rm "$CONTAINER_ID_FILE" From 9498444d99be44e058d9c0e8899713bcc4b84d87 Mon Sep 17 00:00:00 2001 From: Eric Timmons <etimmons@mit.edu> Date: Sat, 2 Oct 2021 17:29:26 -0400 Subject: [PATCH 4020/4023] Bump to latest alpine version for Docker image and install git git is needed to generate the version file. --- tools-for-build/Dockerfile.static-executable-example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools-for-build/Dockerfile.static-executable-example b/tools-for-build/Dockerfile.static-executable-example index 0ec5e3f9e8..c33ad829b0 100644 --- a/tools-for-build/Dockerfile.static-executable-example +++ b/tools-for-build/Dockerfile.static-executable-example @@ -3,7 +3,7 @@ # libgmp, and libz staticially linked in. It is simple, however it demonstrates # that a static executable can run on ~any Linux system. -FROM clfoundation/sbcl:alpine3.13 +FROM clfoundation/sbcl:alpine3.14 COPY . /usr/local/src/sbcl/ @@ -21,7 +21,7 @@ RUN set -x \ *) echo "Unknown arch" >&2; exit 1;; \ esac \ && export SBCL_ARCH \ - && apk add --no-cache ca-certificates curl openssl make gcc musl-dev linux-headers gnupg patch zlib-dev zlib-static \ + && apk add --no-cache ca-certificates curl openssl make gcc musl-dev linux-headers gnupg patch zlib-dev zlib-static git \ # Remove the hardcoding of armv5 as target arch. Use the default provided # by the base image. Required when building for ARM on Alpine 3.12. && sed -i -e "s/CFLAGS += -marm -march=armv5/CFLAGS += -marm/" src/runtime/Config.arm-linux \ From 2a5af6f5d476f1c34a77222615c83df95690faa7 Mon Sep 17 00:00:00 2001 From: Tom Gillespie <tgbugs@gmail.com> Date: Wed, 20 Jul 2022 16:47:39 -0700 Subject: [PATCH 4021/4023] add changes from package-data-list.lisp-expr to exports.lisp the file was renamed at some point and the easiest way to handle the rebase was to put those changes at the end --- src/cold/exports.lisp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cold/exports.lisp b/src/cold/exports.lisp index 2f8d249711..613dac269b 100644 --- a/src/cold/exports.lisp +++ b/src/cold/exports.lisp @@ -1600,6 +1600,9 @@ SB-KERNEL) have been undone, but probably more remain.") "FD-STREAM" "FD-STREAM-FD" "FD-STREAM-P" "FIND-DYNAMIC-FOREIGN-SYMBOL-ADDRESS" "FIND-FOREIGN-SYMBOL-ADDRESS" + "FIND-FOREIGN-SYMBOL-IN-TABLE" + "FIND-LINKAGE-TABLE-FOREIGN-SYMBOL-ADDRESS" + "FIXUP-PRELINKED-LINKAGE-TABLE-ENTRIES" #+(and win32 x86-64) "FOREIGN-HEAP-CORRUPTION" "FOREIGN-SYMBOL-SAP" "FOREIGN-SYMBOL-ADDRESS" @@ -1611,6 +1614,8 @@ SB-KERNEL) have been undone, but probably more remain.") "INVALIDATE-DESCRIPTOR" "INVOKE-INTERRUPTION" "IO-TIMEOUT" + "LINKAGE-TABLE-ADDRESS" + "LINKAGE-TABLE-INDEX" "MACRO" "MAKE-FD-STREAM" "MEMORY-FAULT-ERROR" "MEMMOVE" From 4d2d54c100439330e93974c496e5ef4834c84b57 Mon Sep 17 00:00:00 2001 From: Tom Gillespie <tgbugs@gmail.com> Date: Sat, 17 Sep 2022 13:00:25 -0400 Subject: [PATCH 4022/4023] port linkage-table changes to foreign needed to compensate for db71d5837 --- src/code/foreign.lisp | 56 ++++++++++++ src/code/linkage-table.lisp | 172 ------------------------------------ 2 files changed, 56 insertions(+), 172 deletions(-) delete mode 100644 src/code/linkage-table.lisp diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 09c7f61c78..285943c229 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -15,11 +15,15 @@ (index int) (real-address unsigned) (datap int)) (define-alien-variable undefined-alien-address unsigned) +(define-alien-routine arch-read-linkage-table-entry (* t) + (index int) (datap int)) + (define-load-time-global *linkage-info* ;; CDR of the cons is the list of undefineds (list (make-hash-table :test 'equal :synchronized t))) (declaim (type (cons hash-table) *linkage-info*)) +#+os-provides-dlopen (macrolet ((dlsym-wrapper (&optional warn) ;; Produce two values: an indicator of whether the foreign symbol was ;; found; and the address as an integer if found, or a guard address @@ -240,3 +244,55 @@ symbol designates a variable. May enter the symbol into the linkage-table." #-os-provides-dlopen (define-unsupported-fun load-shared-object) + +;; TODO: Is there a way to avoid this? This is needed because on some +;; platforms, the undefined alien function handler is not available at compile +;; time (it's an assembly routine created in Lisp). +(defun fixup-prelinked-linkage-table-entries () + "Called during reinit. Used to rewrite NULL function references to the +correct undefined alien function handler." + (let* ((n-prelinked (extern-alien "lisp_linkage_table_n_prelinked" int)) + (info *linkage-info*) + (ht (car info)) + (notdef)) + (with-system-mutex ((hash-table-lock ht)) + (dohash ((key index) ht) + (when (< index n-prelinked) + (let* ((datap (listp key)) + (sap (alien-sap (arch-read-linkage-table-entry index (if datap 1 0))))) + (when (zerop (sap-int sap)) + (push key notdef) + (arch-write-linkage-table-entry index + (if datap + undefined-alien-address + (or + (sb-fasl:get-asm-routine 'sb-vm::undefined-alien-tramp) + (find-foreign-symbol-address "undefined_alien_function") + (bug "unreachable"))) + (if datap 1 0))))))) + (setf (cdr info) notdef))) + +(defun linkage-table-index (name datap) + "Returns the index of the foreign symbol in the linkage table or NIL if it is +not present." + (let* ((key (if datap (list name) name)) + (info *linkage-info*) + (ht (car info))) + (with-system-mutex ((hash-table-lock ht)) + (gethash key ht)))) + +(defun linkage-table-address (name datap) + "Returns the address of the foreign symbol's entry in the linkage table or NIL +if it is not present." + (awhen (linkage-table-index name datap) + (sb-vm::linkage-table-entry-address it))) + +(defun find-linkage-table-foreign-symbol-address (name) + "Returns the address of the foreign symbol NAME, or NIL. Consults only the +linkage table to find the address." + (multiple-value-bind (index datap) + (or (linkage-table-index name nil) + (values (linkage-table-index name t) t)) + (when (and index + (not (member (if datap (list name) name) (cdr *linkage-info*) :test #'equal))) + (sap-int (alien-sap (arch-read-linkage-table-entry index (if datap 1 0))))))) diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp deleted file mode 100644 index a071af4c25..0000000000 --- a/src/code/linkage-table.lisp +++ /dev/null @@ -1,172 +0,0 @@ -;;;; Linkage table specifics - -;;;; This software is part of the SBCL system. See the README file for -;;;; more information. -;;;; -;;;; This software is derived from the CMU CL system, which was -;;;; written at Carnegie Mellon University and released into the -;;;; public domain. The software is in the public domain and is -;;;; provided with absolutely no warranty. See the COPYING and CREDITS -;;;; files for more information. - -;;;; Linkage table itself is a mmapped memory area in C-land, which is -;;;; initialized by INIT-LINKAGE-TABLE once all shared objects have -;;;; been reopened, based on the information stored in *LINKAGE-INFO*. -;;;; -;;;; For data entries the linkage table holds the real address -;;;; of the foreign symbol, and for code the entries are jumps -;;;; to the real addresses. - -(in-package "SB-IMPL") - -(define-alien-routine arch-write-linkage-table-entry void - (index int) (real-address unsigned) (datap int)) - -(define-alien-routine arch-read-linkage-table-entry (* t) - (index int) (datap int)) - -(define-load-time-global *linkage-info* - ;; CDR of the cons is the list of undefineds - (list (make-hash-table :test 'equal :synchronized t))) -(declaim (type (cons hash-table) *linkage-info*)) - -(define-alien-variable undefined-alien-address unsigned) - -#+os-provides-dlopen -(macrolet ((dlsym-wrapper (&optional warn) - ;; Produce two values: an indicator of whether the foreign symbol was - ;; found; and the address as an integer if found, or a guard address - ;; which when accessed will result in an UNDEFINED-ALIEN-ERROR. - `(let ((addr (find-dynamic-foreign-symbol-address name))) - (cond (addr - (values t addr)) - (t - (when ,warn - ;; If we can report the actual name when an undefined - ;; alien is called don't warn. - #-(or arm arm64 x86-64) - (style-warn 'sb-kernel:undefined-alien-style-warning - :symbol name)) - (values - nil - (if datap - undefined-alien-address - (or - (sb-fasl:get-asm-routine 'sb-vm::undefined-alien-tramp) - (find-foreign-symbol-address "undefined_alien_function") - (bug "unreachable"))))))))) - -;;; Add a foreign linkage entry if none exists, return the address -;;; in the linkage table. -(defun ensure-foreign-symbol-linkage (name datap) - (let* ((key (if datap (list name) name)) - (info *linkage-info*) - (ht (car info))) - (or (awhen (with-system-mutex ((hash-table-lock ht)) - (or (gethash key ht) - (let* ((index (hash-table-count ht)) - (capacity (floor (- sb-vm:alien-linkage-table-space-end - sb-vm:alien-linkage-table-space-start) - sb-vm:alien-linkage-table-entry-size))) - (when (< index capacity) - (multiple-value-bind (defined real-address) (dlsym-wrapper t) - (unless defined (push key (cdr info))) - (arch-write-linkage-table-entry index real-address - (if datap 1 0)) - (logically-readonlyize name) - (setf (gethash key ht) index)))))) - (sb-vm::alien-linkage-table-entry-address it)) - (error "Linkage-table full (~D entries): cannot link ~S." - (hash-table-count ht) name)))) - -;;; Update the linkage-table. Called during initialization after all -;;; shared libraries have been reopened, and after a previously loaded -;;; shared object is reloaded. -;;; -;;; FIXME: Should figure out how to write only those entries that need -;;; updating. -;;; The problem is that when unloading a library, lacking any way to know which -;;; symbols came from it, we have to try to find every symbol again. -;;; If the shared-object-handle in which each symbol was originally found were -;;; stored in linkage-info, we could know which will become undefined on unload. -;;; The only "problem" is my lack of motivation to change this further. -(defun update-alien-linkage-table (full-scan) - ;; This symbol is of course itself a prelinked symbol. - (let* ((n-prelinked (extern-alien "alien_linkage_table_n_prelinked" int)) - (info *linkage-info*) - (ht (car info)) - ;; for computing anew the list of undefined symbols - (notdef)) - (flet ((recheck (key index) - (let* ((datap (listp key)) - (name (if datap (car key) key))) - ;; Symbols required for Lisp startup - ;; will not be re-pointed to a different address ever. - ;; Nor will those referenced by ELF core. - (when (>= index n-prelinked) - (multiple-value-bind (defined real-address) (dlsym-wrapper) - (unless defined (push key notdef)) - (arch-write-linkage-table-entry index real-address - (if datap 1 0))))))) - (with-system-mutex ((hash-table-lock ht)) - (if full-scan - ;; Look up everything; this is for image restart or library unload. - (dohash ((key index) ht) - (recheck key index)) - ;; Look up only the currently undefined foreign symbols - (dolist (key (cdr info)) - (recheck key (the (not null) (gethash key ht))))) - (setf (cdr info) notdef))))) -) - -;; TODO: Is there a way to avoid this? This is needed because on some -;; platforms, the undefined alien function handler is not available at compile -;; time (it's an assembly routine created in Lisp). -(defun fixup-prelinked-linkage-table-entries () - "Called during reinit. Used to rewrite NULL function references to the -correct undefined alien function handler." - (let* ((n-prelinked (extern-alien "lisp_linkage_table_n_prelinked" int)) - (info *linkage-info*) - (ht (car info)) - (notdef)) - (with-system-mutex ((hash-table-lock ht)) - (dohash ((key index) ht) - (when (< index n-prelinked) - (let* ((datap (listp key)) - (sap (alien-sap (arch-read-linkage-table-entry index (if datap 1 0))))) - (when (zerop (sap-int sap)) - (push key notdef) - (arch-write-linkage-table-entry index - (if datap - undefined-alien-address - (or - (sb-fasl:get-asm-routine 'sb-vm::undefined-alien-tramp) - (find-foreign-symbol-address "undefined_alien_function") - (bug "unreachable"))) - (if datap 1 0))))))) - (setf (cdr info) notdef))) - -(defun linkage-table-index (name datap) - "Returns the index of the foreign symbol in the linkage table or NIL if it is -not present." - (let* ((key (if datap (list name) name)) - (info *linkage-info*) - (ht (car info))) - (with-system-mutex ((hash-table-lock ht)) - (gethash key ht)))) - -(defun linkage-table-address (name datap) - "Returns the address of the foreign symbol's entry in the linkage table or NIL -if it is not present." - (awhen (linkage-table-index name datap) - (sb-vm::linkage-table-entry-address it))) - -(defun find-linkage-table-foreign-symbol-address (name) - "Returns the address of the foreign symbol NAME, or NIL. Consults only the -linkage table to find the address." - (multiple-value-bind (index datap) - (or (linkage-table-index name nil) - (values (linkage-table-index name t) t)) - (when (and index - (not (member (if datap (list name) name) (cdr *linkage-info*) :test #'equal))) - (sap-int (alien-sap (arch-read-linkage-table-entry index (if datap 1 0))))))) From 75c824bb6615fcc923b1ba8608303af4fb1ac6c7 Mon Sep 17 00:00:00 2001 From: Tom Gillespie <tgbugs@gmail.com> Date: Sat, 17 Sep 2022 14:06:24 -0400 Subject: [PATCH 4023/4023] complete renames for linkage table lisp -> alien these changes prevent obvious compilation errors, however there are a number of changes since 2.2.8 that cause a failure dropping into ldb during compile, this like almost certainly because I missed something when doing the rebase and because there are other compensatory changes that have to be made to the original static linking code --- src/code/foreign.lisp | 4 ++-- src/runtime/arm-arch.c | 2 +- src/runtime/arm64-arch.c | 2 +- src/runtime/coreparse.c | 2 +- src/runtime/mips-arch.c | 2 +- src/runtime/ppc-arch.c | 2 +- src/runtime/riscv-arch.c | 2 +- src/runtime/sparc-arch.c | 2 +- src/runtime/x86-64-arch.c | 2 +- src/runtime/x86-arch.c | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/code/foreign.lisp b/src/code/foreign.lisp index 285943c229..dd6d13e240 100644 --- a/src/code/foreign.lisp +++ b/src/code/foreign.lisp @@ -251,7 +251,7 @@ symbol designates a variable. May enter the symbol into the linkage-table." (defun fixup-prelinked-linkage-table-entries () "Called during reinit. Used to rewrite NULL function references to the correct undefined alien function handler." - (let* ((n-prelinked (extern-alien "lisp_linkage_table_n_prelinked" int)) + (let* ((n-prelinked (extern-alien "alien_linkage_table_n_prelinked" int)) (info *linkage-info*) (ht (car info)) (notdef)) @@ -285,7 +285,7 @@ not present." "Returns the address of the foreign symbol's entry in the linkage table or NIL if it is not present." (awhen (linkage-table-index name datap) - (sb-vm::linkage-table-entry-address it))) + (sb-vm::alien-linkage-table-index-from-address it))) (defun find-linkage-table-foreign-symbol-address (name) "Returns the address of the foreign symbol NAME, or NIL. Consults only the diff --git a/src/runtime/arm-arch.c b/src/runtime/arm-arch.c index d1b6dc891c..4438eb7bac 100644 --- a/src/runtime/arm-arch.c +++ b/src/runtime/arm-arch.c @@ -168,7 +168,7 @@ void *arch_read_linkage_table_entry(int index, int datap) { char *reloc_addr = - (char *)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + (char *)ALIEN_LINKAGE_TABLE_SPACE_END - (index + 1) * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { return (unsigned long*) *(unsigned long *)reloc_addr; } diff --git a/src/runtime/arm64-arch.c b/src/runtime/arm64-arch.c index 94de72920b..89f64e729e 100644 --- a/src/runtime/arm64-arch.c +++ b/src/runtime/arm64-arch.c @@ -187,7 +187,7 @@ void arch_write_linkage_table_entry(int index, void *target_addr, int datap) void *arch_read_linkage_table_entry(int index, int datap) { - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { return (unsigned long*) *(unsigned long *)reloc_addr; } diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 709ab8d205..d711ce9faa 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -747,7 +747,7 @@ process_directory(int count, struct ndir_entry *entry, (uword_t)&lisp_code_start, (uword_t)&lisp_code_end, text_space_highwatermark); #endif - os_link_from_pointer_table(&lisp_linkage_values); + os_link_from_pointer_table(&alien_linkage_values); // unprotect the pages os_protect((void*)TEXT_SPACE_START, text_space_size, OS_VM_PROT_ALL); } else diff --git a/src/runtime/mips-arch.c b/src/runtime/mips-arch.c index 517f5f2ded..1b6db9ac93 100644 --- a/src/runtime/mips-arch.c +++ b/src/runtime/mips-arch.c @@ -517,6 +517,6 @@ void *arch_read_linkage_table_entry(int index, int datap) { char *reloc_addr = - (char*)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + (char*)ALIEN_LINKAGE_TABLE_SPACE_END - (index + 1) * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; return *(unsigned int *)reloc_addr; } diff --git a/src/runtime/ppc-arch.c b/src/runtime/ppc-arch.c index 8f14f50bc5..17c69b6332 100644 --- a/src/runtime/ppc-arch.c +++ b/src/runtime/ppc-arch.c @@ -753,7 +753,7 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) void *arch_read_linkage_table_entry(int index, int datap) { - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { return *(unsigned long *)reloc_addr; } diff --git a/src/runtime/riscv-arch.c b/src/runtime/riscv-arch.c index 5ac0fd3c92..b649f027ef 100644 --- a/src/runtime/riscv-arch.c +++ b/src/runtime/riscv-arch.c @@ -216,7 +216,7 @@ void *arch_read_linkage_table_entry(int index, int datap) { char *reloc_addr = - (char*)LINKAGE_TABLE_SPACE_END - (index + 1) * LINKAGE_TABLE_ENTRY_SIZE; + (char*)ALIEN_LINKAGE_TABLE_SPACE_END - (index + 1) * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; return *(uword_t *)reloc_addr; } diff --git a/src/runtime/sparc-arch.c b/src/runtime/sparc-arch.c index 8d8143c9bd..78f8aa6fa9 100644 --- a/src/runtime/sparc-arch.c +++ b/src/runtime/sparc-arch.c @@ -366,7 +366,7 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) void *arch_read_linkage_table_entry(int index, int datap) { - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { return (unsigned long*) *(unsigned long *)reloc_addr; } diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index 5a981cf930..8f50b60248 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -533,7 +533,7 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) void *arch_read_linkage_table_entry(int index, int datap) { - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { return (void*) *(uword_t *)reloc_addr; } diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index c69f868170..6cde01b690 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -386,7 +386,7 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap) void *arch_read_linkage_table_entry(int index, int datap) { - char *reloc_addr = (char*)LINKAGE_TABLE_SPACE_START + index * LINKAGE_TABLE_ENTRY_SIZE; + char *reloc_addr = (char*)ALIEN_LINKAGE_TABLE_SPACE_START + index * ALIEN_LINKAGE_TABLE_ENTRY_SIZE; if (datap) { return (unsigned long*) *(unsigned long *)reloc_addr; }